aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.editorconfig2
-rw-r--r--.git-blame-ignore-revs16
-rw-r--r--.github/pr-branch-labeler.yml2
-rw-r--r--.github/test-scala-presence.toml2
-rw-r--r--.github/workflows/build-and-test.yml2
-rw-r--r--.github/workflows/label-mute-prs.yml17
-rw-r--r--.github/workflows/test-scala-presence.yml18
-rw-r--r--.gitignore1
-rw-r--r--LICENSE.txt (renamed from LICENSE)0
-rw-r--r--README.md50
-rw-r--r--addon.gradle81
-rw-r--r--bartworks/.editorconfig19
-rw-r--r--bartworks/.git-blame-ignore-revs4
-rw-r--r--bartworks/.gitattributes44
-rw-r--r--bartworks/.github/workflows/build-and-test.yml13
-rw-r--r--bartworks/.github/workflows/release-tags.yml14
-rw-r--r--bartworks/.gitignore38
-rw-r--r--bartworks/BWLogo.png (renamed from BWLogo.png)bin642 -> 642 bytes
-rw-r--r--bartworks/BlockAdderGenerator/biovatgen.py (renamed from BlockAdderGenerator/biovatgen.py)0
-rw-r--r--bartworks/BlockAdderGenerator/csv.csv (renamed from BlockAdderGenerator/csv.csv)0
-rw-r--r--bartworks/CHANGELOG-2.1.1.0.md (renamed from CHANGELOG-2.1.1.0.md)0
-rw-r--r--bartworks/CODEOWNERS3
-rw-r--r--bartworks/ID Range.txt (renamed from ID Range.txt)0
-rw-r--r--bartworks/LICENSE165
-rw-r--r--bartworks/README.md16
-rw-r--r--bartworks/build.gradle5
-rw-r--r--bartworks/dependencies.gradle19
-rw-r--r--bartworks/gradle.properties192
-rw-r--r--bartworks/gradle/wrapper/gradle-wrapper.jarbin0 -> 43453 bytes
-rw-r--r--bartworks/gradle/wrapper/gradle-wrapper.properties7
-rwxr-xr-xbartworks/gradlew249
-rw-r--r--bartworks/gradlew.bat92
-rw-r--r--bartworks/jitpack.yml2
-rw-r--r--bartworks/repositories.gradle16
-rw-r--r--bartworks/settings.gradle23
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/API_ConfigValues.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/API_ConfigValues.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectAdder.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectAdder.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectGetter.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectGetter.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BioRecipeAdder.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/BioRecipeAdder.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BioVatLogicAdder.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/BioVatLogicAdder.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BorosilicateGlass.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/BorosilicateGlass.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/INoiseGen.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/INoiseGen.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/IRadMaterial.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/IRadMaterial.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileAddsInformation.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/ITileAddsInformation.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileDropsContent.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/ITileDropsContent.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileHasDifferentTextureSides.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/ITileHasDifferentTextureSides.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/SideReference.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/SideReference.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/VoidMinerDropAdder.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/VoidMinerDropAdder.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAPI.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAPI.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAdderRegistry.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAdderRegistry.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/modularUI/BW_UITextures.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/modularUI/BW_UITextures.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/package-info.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/package-info.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BWNBTDependantCraftingRecipe.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BWNBTDependantCraftingRecipe.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BacterialVatFrontend.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BacterialVatFrontend.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BartWorksRecipeMaps.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BartWorksRecipeMaps.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/DynamicGTRecipe.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/DynamicGTRecipe.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/RadioHatchFrontend.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/RadioHatchFrontend.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/ASMUtils.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/ASM/ASMUtils.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCore.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCore.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCorePlugin.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCorePlugin.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreStaticReplacementMethodes.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreStaticReplacementMethodes.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreTransformer.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreTransformer.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/GuiHandler.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/GuiHandler.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipCache.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipCache.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipEventHandler.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipEventHandler.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/BioTab.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/BioTab.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/GT2Tab.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/GT2Tab.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/bartworksTab.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/bartworksTab.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/gui/BW_GUIContainer_RotorBlock.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/client/gui/BW_GUIContainer_RotorBlock.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_EICPistonVisualizer.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_EICPistonVisualizer.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_ItemRenderer.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_ItemRenderer.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_Vanilla_Texture.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_Vanilla_Texture.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_Renderer_Block_Ores.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_Renderer_Block_Ores.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererGlasBlock.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererGlasBlock.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererSwitchingColorFluid.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererSwitchingColorFluid.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/textures/PrefixTextureLinker.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/client/textures/PrefixTextureLinker.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_Blocks.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_Blocks.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks2.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks2.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_MachineBlock.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_MachineBlock.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_Multiple.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_Multiple.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BioFluidBlock.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BioFluidBlock.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ChangeConfig.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ChangeConfig.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ClearCraftingCache.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ClearCraftingCache.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/GetWorkingDirectory.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/commands/GetWorkingDirectory.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/PrintRecipeListToFile.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/commands/PrintRecipeListToFile.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/RunGC.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/commands/RunGC.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/SummonRuin.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/commands/SummonRuin.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/configs/ConfigHandler.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/configs/ConfigHandler.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_ItemBlocks.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_ItemBlocks.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_SimpleWindMeter.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_SimpleWindMeter.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_Stonage_Rotors.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_Stonage_Rotors.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/Circuit_Programmer.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/items/Circuit_Programmer.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Destructopack_Item.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Destructopack_Item.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Rockcutter_Item.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Rockcutter_Item.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Teslastaff_Item.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Teslastaff_Item.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabModule.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabModule.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabParts.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabParts.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleIconItem.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleIconItem.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleSubItemClass.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleSubItemClass.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ArtificialMicaLine.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ArtificialMicaLine.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BeforeGTPreload.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BeforeGTPreload.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioCultureLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioCultureLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioItemList.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioItemList.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioLabLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioLabLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioRecipeLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioRecipeLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ElectricImplosionCompressorRecipes.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ElectricImplosionCompressorRecipes.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/FluidLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/FluidLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/GTNHBlocks.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/GTNHBlocks.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ItemRegistry.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ItemRegistry.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/LocalisationLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/LocalisationLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RadioHatchMaterialLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RadioHatchMaterialLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RecipeLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RecipeLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RegisterServerCommands.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RegisterServerCommands.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/StaticRecipeChangeLoaders.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/StaticRecipeChangeLoaders.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Assembler.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Assembler.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/AssemblyLine.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/AssemblyLine.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Autoclave.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Autoclave.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Centrifuge.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Centrifuge.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalBath.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalBath.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalReactor.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalReactor.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/CraftingRecipes.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/CraftingRecipes.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Electrolyzer.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Electrolyzer.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Extractor.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Extractor.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FakeRecipes.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FakeRecipes.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidHeater.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidHeater.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidSolidifier.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidSolidifier.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FormingPress.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FormingPress.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/LaserEngraver.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/LaserEngraver.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Mixer.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Mixer.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Pulverizer.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Pulverizer.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/PyrolyseOven.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/PyrolyseOven.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/BW_Network.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/net/BW_Network.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/CircuitProgrammerPacket.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/net/CircuitProgrammerPacket.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/EICPacket.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/net/EICPacket.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/MetaBlockPacket.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/net/MetaBlockPacket.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/OreDictCachePacket.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/net/OreDictCachePacket.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/RendererPacket.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/net/RendererPacket.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/ServerJoinedPackage.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/net/ServerJoinedPackage.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BWTileEntityDimIDBridge.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BWTileEntityDimIDBridge.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_RotorBlock.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_RotorBlock.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_ExperimentalFloodGate.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_ExperimentalFloodGate.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_HeatedWaterPump.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_HeatedWaterPump.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_InfinityTank.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_InfinityTank.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/debug/CreativeScanner.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/debug/CreativeScanner.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_BioVat.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_BioVat.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_CircuitAssemblyLine.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_CircuitAssemblyLine.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_DEHP.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_DEHP.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ElectricImplosionCompressor.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ElectricImplosionCompressor.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_HTGR.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_HTGR.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_LESU.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_LESU.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ManualTrafo.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ManualTrafo.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_THTR.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_THTR.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_Windmill.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_Windmill.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaChemicalReactor.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaChemicalReactor.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaMultiBlockBase.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaMultiBlockBase.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaOilCracker.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaOilCracker.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_AcidGenerator.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_AcidGenerator.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_BioLab.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_BioLab.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_CompressedFluidHatch.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_CompressedFluidHatch.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Diode.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Diode.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_EnergyDistributor.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_EnergyDistributor.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_GiantOutputHatch.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_GiantOutputHatch.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_HumongousInputHatch.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_HumongousInputHatch.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_RadioHatch.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_RadioHatch.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Transistor.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Transistor.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioLabHandler.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioLabHandler.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioVatHandler.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioVatHandler.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_OreHandler.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_OreHandler.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/NEI_BW_Config.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/NEI_BW_Config.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/server/EventHandler/ServerEventHandler.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/server/EventHandler/ServerEventHandler.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_GT_MaterialReference.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_GT_MaterialReference.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlock_Item.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlock_Item.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_CasingAdvanced_TE.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_CasingAdvanced_TE.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing_TE.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing_TE.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedFrames.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedFrames.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedOreTE.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedOreTE.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedSmallOreTE.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedSmallOreTE.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Block_TE.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Block_TE.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Blocks.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Blocks.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Items.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Items.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Ores.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Ores.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_SmallOres.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_SmallOres.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlock_TE.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlock_TE.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlocks.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlocks.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_NonMeta_MaterialItems.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_NonMeta_MaterialItems.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_CircuitsLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_CircuitsLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_Meta_Items.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_Meta_Items.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitData.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitData.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitPartLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitPartLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/BWGTMetaItems.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/BWGTMetaItems.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/GTMetaItemEnhancer.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/GTMetaItemEnhancer.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/PlatinumSludgeOverHaul.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/PlatinumSludgeOverHaul.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/Werkstoff.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/Werkstoff.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/WerkstoffLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/WerkstoffLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AddSomeRecipes.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AddSomeRecipes.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AdditionalRecipes.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AdditionalRecipes.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/DownTierLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/DownTierLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/LoadItemContainers.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/LoadItemContainers.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/IWerkstoffRunnable.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/IWerkstoffRunnable.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/AspectLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/AspectLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/BlockLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/BlockLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CasingLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CasingLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CellLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CellLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CraftingMaterialLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CraftingMaterialLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CrushedLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CrushedLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/DustLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/DustLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/GemLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/GemLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MetalLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MetalLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MoltenCellLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MoltenCellLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MultipleMetalLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MultipleMetalLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/OreLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/OreLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/RawOreLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/RawOreLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/SimpleMetalLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/SimpleMetalLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/ToolLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/ToolLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/AssociationLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/AssociationLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/BridgeMaterialsLoader.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/BridgeMaterialsLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/CasingRegistrator.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/CasingRegistrator.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictAdder.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictAdder.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictHandler.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictHandler.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_OreLayer.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_OreLayer.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WordGenerator.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WordGenerator.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128b.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128b.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128ba.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128ba.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/GT_WorldgenUtil.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/GT_WorldgenUtil.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/MapGenRuins.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/MapGenRuins.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BWRecipes.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/BWRecipes.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_ColorUtil.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/BW_ColorUtil.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Tooltip_Reference.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Tooltip_Reference.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Util.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Util.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BioCulture.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/BioCulture.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BioDNA.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/BioDNA.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BioData.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/BioData.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BioPlasmid.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/BioPlasmid.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/CachedReflectionUtils.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/CachedReflectionUtils.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/ChatColorHelper.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/ChatColorHelper.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksChecker.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksChecker.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksCheckerIteration.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksCheckerIteration.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/Coords.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/Coords.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/EnumUtils.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/EnumUtils.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/MathUtils.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/MathUtils.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/MurmurHash3.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/MurmurHash3.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/BartsNoise.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/BartsNoise.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/SimplexNoise.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/SimplexNoise.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashMap.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashMap.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashSet.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashSet.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/Pair.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/Pair.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/ResultWrongSievert.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/ResultWrongSievert.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/StreamUtils.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/StreamUtils.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityList.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityList.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListIterators.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListIterators.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListNode.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListNode.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/flowerset/FlowerSet.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/flowerset/FlowerSet.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/log/DebugLog.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/log/DebugLog.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/package-info.java (renamed from src/main/java/com/github/bartimaeusnek/bartworks/util/package-info.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/BartWorksCrossmod.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/BartWorksCrossmod.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/GTpp/loader/RadioHatchCompat.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/GTpp/loader/RadioHatchCompat.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/cls/CLSCompat.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/cls/CLSCompat.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiner_Base.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiner_Base.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiners.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiners.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/VoidMinerUtility.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/VoidMinerUtility.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/GalacticraftProxy.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/GalacticraftProxy.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/PlanetsHelperClass.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/PlanetsHelperClass.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/UniversalTeleportType.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/UniversalTeleportType.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/atmosphere/BWAtmosphereManager.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/atmosphere/BWAtmosphereManager.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/blocks/UniversalSpaceBlocks.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/blocks/UniversalSpaceBlocks.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/creativetabs/SpaceTab.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/creativetabs/SpaceTab.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/AbstractWorldProviderSpace.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/AbstractWorldProviderSpace.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/ChunkProviderRoss128b.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/ChunkProviderRoss128b.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/SkyProviderRoss128b.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/SkyProviderRoss128b.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/WorldProviderRoss128b.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/WorldProviderRoss128b.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/ChunkProviderRoss128ba.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/ChunkProviderRoss128ba.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/WorldProviderRoss128ba.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/WorldProviderRoss128ba.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/solarsystems/Ross128SolarSystem.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/solarsystems/Ross128SolarSystem.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/GT_NBT_DataBase.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/openComputers/GT_NBT_DataBase.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/TileEntity_GTDataServer.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/openComputers/TileEntity_GTDataServer.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/TecTechResearchLoader.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/tectech/TecTechResearchLoader.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/LowPowerLaser.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/LowPowerLaser.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_Abstract_LowPowerLaserThingy.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_Abstract_LowPowerLaserThingy.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserBox.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserBox.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserDynamo.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserDynamo.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserHatch.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserHatch.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_Pipe_Energy_LowPower.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_Pipe_Energy_LowPower.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tgregworks/MaterialsInjector.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/tgregworks/MaterialsInjector.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_Multi_IndustrialCrucible.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_Multi_IndustrialCrucible.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_WandBuffer.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_WandBuffer.java)0
-rw-r--r--bartworks/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/util/ThaumcraftHandler.java (renamed from src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/util/ThaumcraftHandler.java)0
-rw-r--r--bartworks/src/main/resources/assets/bartworks/lang/de_DE.lang (renamed from src/main/resources/assets/bartworks/lang/de_DE.lang)0
-rw-r--r--bartworks/src/main/resources/assets/bartworks/lang/en_US.lang (renamed from src/main/resources/assets/bartworks/lang/en_US.lang)0
-rw-r--r--bartworks/src/main/resources/assets/bartworks/lang/fr_FR.lang (renamed from src/main/resources/assets/bartworks/lang/fr_FR.lang)0
-rw-r--r--bartworks/src/main/resources/assets/bartworks/lang/zh_CN.lang (renamed from src/main/resources/assets/bartworks/lang/zh_CN.lang)0
-rw-r--r--bartworks/src/main/resources/assets/bartworks/sounds.json (renamed from src/main/resources/assets/bartworks/sounds.json)0
-rw-r--r--bartworks/src/main/resources/assets/bartworks/sounds/radhatch.ogg (renamed from src/main/resources/assets/bartworks/sounds/radhatch.ogg)bin236744 -> 236744 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/GUIPrimitiveKUBox.png (renamed from src/main/resources/assets/bartworks/textures/GUI/GUIPrimitiveKUBox.png)bin812 -> 812 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/background/brown.png (renamed from src/main/resources/assets/bartworks/textures/GUI/background/brown.png)bin438 -> 438 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.png (renamed from src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.png)bin994 -> 994 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.png (renamed from src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.png)bin684 -> 684 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.png (renamed from src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.png)bin714 -> 714 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.png (renamed from src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.png)bin169 -> 169 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.png (renamed from src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.png)bin202 -> 202 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.png (renamed from src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.png)bin170 -> 170 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.png (renamed from src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.png)bin196 -> 196 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.png (renamed from src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.png)bin261 -> 261 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.png (renamed from src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.png)bin215 -> 215 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.png (renamed from src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.png)bin240 -> 240 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.png (renamed from src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.png)bin146 -> 146 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/radiation.png (renamed from src/main/resources/assets/bartworks/textures/GUI/picture/radiation.png)bin243 -> 243 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.png (renamed from src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.png)bin156 -> 156 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.png (renamed from src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.png)bin133 -> 133 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.png (renamed from src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.png)bin230 -> 230 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.png (renamed from src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.png)bin132 -> 132 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.png (renamed from src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.png)bin435 -> 435 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.png (renamed from src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.png)bin1002 -> 1002 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.png (renamed from src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.png)bin236 -> 236 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.png (renamed from src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.png)bin249 -> 249 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.png (renamed from src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.png)bin145 -> 145 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/slot/brown.png (renamed from src/main/resources/assets/bartworks/textures/GUI/slot/brown.png)bin109 -> 109 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.png (renamed from src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.png)bin130 -> 130 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.png (renamed from src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.png)bin154 -> 154 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.png (renamed from src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.png)bin150 -> 150 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.png (renamed from src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.png)bin559 -> 559 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.png (renamed from src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.png)bin184 -> 184 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.png (renamed from src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.png)bin177 -> 177 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.png (renamed from src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.png)bin187 -> 187 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.png (renamed from src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.png)bin185 -> 185 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.png (renamed from src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.png)bin187 -> 187 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.png (renamed from src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.png)bin188 -> 188 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.png (renamed from src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.png)bin187 -> 187 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.png (renamed from src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.png)bin187 -> 187 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.png (renamed from src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.png)bin129 -> 129 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.png (renamed from src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.png)bin471 -> 471 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.png (renamed from src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.png)bin835 -> 835 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.png (renamed from src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.png)bin336 -> 336 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.png (renamed from src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.png)bin196 -> 196 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.png (renamed from src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.png)bin666 -> 666 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.png (renamed from src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.png)bin680 -> 680 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.png (renamed from src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.png)bin680 -> 680 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.png (renamed from src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.png)bin682 -> 682 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.png (renamed from src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.png)bin795 -> 795 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.png (renamed from src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.png)bin199 -> 199 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.png (renamed from src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.png)bin126 -> 126 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.png (renamed from src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.png)bin382 -> 382 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.png (renamed from src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.png (renamed from src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.png)bin623 -> 623 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.png (renamed from src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.png)bin184 -> 184 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.png (renamed from src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.png)bin130 -> 130 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.png (renamed from src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.png)bin227 -> 227 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.png (renamed from src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.png)bin665 -> 665 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.png (renamed from src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.png)bin125 -> 125 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.png)bin207 -> 207 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.png)bin228 -> 228 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.png)bin227 -> 227 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.png)bin207 -> 207 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.png)bin205 -> 205 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.png)bin207 -> 207 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.png)bin203 -> 203 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.png)bin208 -> 208 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.png)bin209 -> 209 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.png)bin207 -> 207 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.png)bin206 -> 206 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.png)bin202 -> 202 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.png)bin227 -> 227 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.png)bin226 -> 226 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.png)bin186 -> 186 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.png)bin184 -> 184 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.png)bin184 -> 184 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.png)bin182 -> 182 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.png)bin188 -> 188 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.png)bin183 -> 183 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.png)bin184 -> 184 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.png)bin177 -> 177 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.png)bin184 -> 184 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.png)bin182 -> 182 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.png)bin187 -> 187 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.png)bin184 -> 184 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.png)bin184 -> 184 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.png)bin180 -> 180 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.png)bin186 -> 186 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.png (renamed from src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.png)bin184 -> 184 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.png (renamed from src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.png)bin473 -> 473 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.png (renamed from src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.png)bin549 -> 549 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.png (renamed from src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.png)bin473 -> 473 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/blocks/windmill_top.png (renamed from src/main/resources/assets/bartworks/textures/blocks/windmill_top.png)bin591 -> 591 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/Agarose.png (renamed from src/main/resources/assets/bartworks/textures/items/Agarose.png)bin259 -> 259 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/BISOPelletBall.png (renamed from src/main/resources/assets/bartworks/textures/items/BISOPelletBall.png)bin305 -> 305 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.png (renamed from src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.png)bin269 -> 269 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.png (renamed from src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.png)bin448 -> 448 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/BWmotor.png (renamed from src/main/resources/assets/bartworks/textures/items/BWmotor.png)bin506 -> 506 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/BWrawtube.png (renamed from src/main/resources/assets/bartworks/textures/items/BWrawtube.png)bin450 -> 450 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.png (renamed from src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.png)bin258 -> 258 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.png (renamed from src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.png)bin291 -> 291 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.png (renamed from src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.png)bin253 -> 253 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.png (renamed from src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.png)bin481 -> 481 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.png (renamed from src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.png)bin525 -> 525 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/DNASampleFlask.png (renamed from src/main/resources/assets/bartworks/textures/items/DNASampleFlask.png)bin775 -> 775 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/DetergentPowder.png (renamed from src/main/resources/assets/bartworks/textures/items/DetergentPowder.png)bin261 -> 261 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/GT2Coin.png (renamed from src/main/resources/assets/bartworks/textures/items/GT2Coin.png)bin259 -> 259 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.png (renamed from src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.png)bin353 -> 353 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.png (renamed from src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.png)bin362 -> 362 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.png)bin5702 -> 5702 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.png)bin5691 -> 5691 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.png)bin5716 -> 5716 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.png)bin6022 -> 6022 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.png)bin5971 -> 5971 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.png)bin6020 -> 6020 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.png)bin5726 -> 5726 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.png)bin5709 -> 5709 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.png)bin5725 -> 5725 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.png)bin6031 -> 6031 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.png)bin5964 -> 5964 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.png)bin6030 -> 6030 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.png)bin5973 -> 5973 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.png)bin5937 -> 5937 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.png)bin5988 -> 5988 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.png)bin5932 -> 5932 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.png)bin5885 -> 5885 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.png)bin5971 -> 5971 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.png)bin5658 -> 5658 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.png)bin5673 -> 5673 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.png (renamed from src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.png)bin5703 -> 5703 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/IncubationModule.png (renamed from src/main/resources/assets/bartworks/textures/items/IncubationModule.png)bin623 -> 623 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.png (renamed from src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.png)bin566 -> 566 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.png (renamed from src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.png)bin2522 -> 2522 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/PlasmidCell.png (renamed from src/main/resources/assets/bartworks/textures/items/PlasmidCell.png)bin777 -> 777 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.png (renamed from src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.png)bin499 -> 499 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/TRISOPellet.png (renamed from src/main/resources/assets/bartworks/textures/items/TRISOPellet.png)bin257 -> 257 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.png (renamed from src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.png)bin305 -> 305 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.png (renamed from src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.png)bin244 -> 244 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/TransformationModule.png (renamed from src/main/resources/assets/bartworks/textures/items/TransformationModule.png)bin529 -> 529 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/WrapOverlay.png (renamed from src/main/resources/assets/bartworks/textures/items/WrapOverlay.png)bin496 -> 496 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/completed_grindstone.png (renamed from src/main/resources/assets/bartworks/textures/items/completed_grindstone.png)bin932 -> 932 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/grindstone_bottom.png (renamed from src/main/resources/assets/bartworks/textures/items/grindstone_bottom.png)bin823 -> 823 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/grindstone_top.png (renamed from src/main/resources/assets/bartworks/textures/items/grindstone_top.png)bin822 -> 822 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.png (renamed from src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.png)bin284 -> 284 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/petriDish.png (renamed from src/main/resources/assets/bartworks/textures/items/petriDish.png)bin441 -> 441 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.png (renamed from src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.png)bin699 -> 699 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.png (renamed from src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.png)bin407 -> 407 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.png (renamed from src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.png)bin441 -> 441 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.png (renamed from src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.png)bin472 -> 472 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.png (renamed from src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.png)bin382 -> 382 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.png (renamed from src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.png)bin600 -> 600 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/rotors/paperParts.png (renamed from src/main/resources/assets/bartworks/textures/items/rotors/paperParts.png)bin510 -> 510 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.png (renamed from src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.png)bin2294 -> 2294 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.png (renamed from src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.png)bin1295 -> 1295 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.png (renamed from src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.png)bin583 -> 583 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.png (renamed from src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.png)bin1123 -> 1123 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworks/textures/items/rotors/woolParts.png (renamed from src/main/resources/assets/bartworks/textures/items/rotors/woolParts.png)bin601 -> 601 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.png (renamed from src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.png)bin934 -> 934 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.png (renamed from src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.png)bin1048 -> 1048 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.png (renamed from src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.png)bin990 -> 990 bytes
-rw-r--r--bartworks/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.png (renamed from src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.png)bin1260 -> 1260 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasing.png)bin703 -> 703 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/copy.bat (renamed from src/main/resources/assets/gregtech/textures/blocks/materialicons/copy.bat)0
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_Cell.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_Cell.png)bin443 -> 443 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.png)bin437 -> 437 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.Double_Tiberiumcell.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.Double_Tiberiumcell.png)bin362 -> 362 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.png)bin364 -> 364 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.Quad_Tiberiumcell.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.Quad_Tiberiumcell.png)bin535 -> 535 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.png)bin528 -> 528 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.Tiberiumcell.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.Tiberiumcell.png)bin318 -> 318 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.png)bin318 -> 318 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/0.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/0.png)bin566 -> 566 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.png)bin298 -> 298 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.png)bin337 -> 337 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.png)bin367 -> 367 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.png)bin433 -> 433 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.png)bin401 -> 401 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.png)bin859 -> 859 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.png)bin443 -> 443 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.png)bin232 -> 232 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.png)bin222 -> 222 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.png)bin344 -> 344 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.png)bin347 -> 347 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.png)bin331 -> 331 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.png)bin331 -> 331 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.png (renamed from src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.png)bin378 -> 378 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing.png)bin626 -> 626 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.png)bin639 -> 639 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.png)bin139 -> 139 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.png)bin211 -> 211 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.png)bin135 -> 135 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.png)bin168 -> 168 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.png)bin308 -> 308 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/bottle.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/bottle.png)bin214 -> 214 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.png (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.png)bin267 -> 267 bytes
-rw-r--r--bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/copy.bat (renamed from src/main/resources/assets/gregtech/textures/items/materialicons/copy.bat)0
-rw-r--r--bartworks/src/main/resources/mcmod.info55
-rw-r--r--changelog.py172
-rw-r--r--dependencies.gradle93
-rw-r--r--docs/RecipeBuilder.md66
-rw-r--r--docs/ResourcePacks_Guide.md68
-rw-r--r--docs/img/recipemap-unlocalized-name.pngbin0 -> 25590 bytes
-rw-r--r--gradle.properties12
-rw-r--r--gtpp/.git-blame-ignore-revs4
-rw-r--r--gtpp/.gitattributes44
-rw-r--r--gtpp/.github/workflows/build-and-test.yml15
-rw-r--r--gtpp/.github/workflows/release-tags.yml14
-rw-r--r--gtpp/.gitignore38
-rw-r--r--gtpp/CODEOWNERS3
-rw-r--r--gtpp/ISSUE_TEMPLATE.md48
-rw-r--r--gtpp/LICENSE676
-rw-r--r--gtpp/README.md7
-rw-r--r--gtpp/addon.gradle3
-rw-r--r--gtpp/build.gradle5
-rw-r--r--gtpp/dependencies.gradle18
-rw-r--r--gtpp/gradle.properties192
-rw-r--r--gtpp/gradle/wrapper/gradle-wrapper.jarbin0 -> 43453 bytes
-rw-r--r--gtpp/gradle/wrapper/gradle-wrapper.properties7
-rwxr-xr-xgtpp/gradlew249
-rw-r--r--gtpp/gradlew.bat92
-rw-r--r--gtpp/jitpack.yml2
-rw-r--r--gtpp/repositories.gradle4
-rw-r--r--gtpp/settings.gradle23
-rw-r--r--gtpp/src/main/java/gregtech/api/enums/TAE.java145
-rw-r--r--gtpp/src/main/java/gregtech/api/util/AdvancedFusionOverclockDescriber.java23
-rw-r--r--gtpp/src/main/java/gregtech/api/util/FishPondFakeRecipe.java80
-rw-r--r--gtpp/src/main/java/gregtech/api/util/GasSpargingRecipe.java103
-rw-r--r--gtpp/src/main/java/gregtech/api/util/GasSpargingRecipeMap.java45
-rw-r--r--gtpp/src/main/java/gregtech/api/util/HotFuel.java40
-rw-r--r--gtpp/src/main/java/gregtech/api/util/SemiFluidFuelHandler.java136
-rw-r--r--gtpp/src/main/java/gtPlusPlus/GTplusplus.java395
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/interfaces/ILazyCoverable.java139
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/interfaces/IPlugin.java41
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/interfaces/ITexturedBlock.java15
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/interfaces/ITileTooltip.java6
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/interfaces/RunnableWithInfo.java7
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/Logger.java162
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/data/AutoMap.java364
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/data/Pair.java35
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/data/Quad.java44
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/data/Triplet.java26
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/data/TypeCounter.java177
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/data/WeightedCollection.java102
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/data/weakref/WeakAutoMap.java14
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/AABB.java67
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_FluidTank.java185
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_Inventory.java231
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/BlockPos.java245
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/CubicObject.java56
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/FluidGT6.java33
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/ItemPackage.java57
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/ItemStackData.java34
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/SafeTexture.java65
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/ShapedRecipe.java251
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/recipe/ChemicalPlantFrontend.java68
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeCategories.java17
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeMaps.java232
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/recipe/MillingFrontend.java46
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/recipe/TGSFrontend.java147
-rw-r--r--gtpp/src/main/java/gtPlusPlus/api/recipe/ThermalBoilerFrontend.java57
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/ModBlocks.java104
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/base/BasicBlock.java70
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/base/BasicTileBlockWithTooltip.java322
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/base/BlockBaseFluid.java102
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/base/BlockBaseModular.java245
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/base/BlockBaseOre.java217
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/general/BlockCompressedObsidian.java100
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/general/BlockSuperLight.java197
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/general/FluidTankInfinite.java141
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/general/HellFire.java535
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/general/LightGlass.java137
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/general/MiningExplosives.java193
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/general/antigrief/BlockWitherProof.java161
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/general/fluids/BlockFluidSludge.java68
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/machine/CircuitProgrammer.java153
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/machine/DecayablesChest.java186
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/machine/FishTrap.java136
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_PestKiller.java137
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_PooCollector.java177
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_ProjectTable.java160
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_SuperJukebox.java558
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/block/machine/VolumetricFlaskSetter.java157
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/client/CustomTextureSet.java30
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/client/model/ModelDecayChest.java45
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/client/model/ModelSickBlaze.java87
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/client/model/ModelStaballoyConstruct.java117
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/client/renderer/CustomItemBlockRenderer.java84
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/client/renderer/CustomOreBlockRenderer.java2469
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderDecayChest.java92
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderMiningExplosivesPrimed.java111
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderSickBlaze.java96
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderStaballoyConstruct.java163
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderToxinball.java89
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/client/renderer/particle/EntityDropParticleFX.java105
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/commands/CommandEnableDebugWhileRunning.java279
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/commands/CommandMath.java92
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/commands/CommandUtils.java18
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/common/CommonProxy.java210
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Baubles.java58
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_ExtraUtils.java18
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_HarvestCraft.java14
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_IC2.java58
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Thaumcraft.java47
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Witchery.java28
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/config/ConfigHandler.java670
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/container/Container_CircuitProgrammer.java176
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/container/Container_DecayablesChest.java133
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/container/Container_FishTrap.java134
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/container/Container_PestKiller.java147
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/container/Container_ProjectTable.java196
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/container/Container_SuperJukebox.java232
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/container/Container_VolumetricFlaskSetter.java170
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/creative/AddToCreativeTab.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/entity/EntityPrimedMiningExplosive.java405
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/entity/InternalEntityRegistry.java64
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/entity/monster/EntitySickBlaze.java224
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/entity/monster/EntityStaballoyConstruct.java652
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/entity/projectile/EntityLightningAttack.java79
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinball.java334
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinballSmall.java65
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/fluids/FluidRegistryHandler.java52
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/gui/GUI_Base_Tile_Entity.java14
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/gui/beta/Gui_ID_Registry.java47
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/gui/beta/Gui_Types.java10
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/gui/beta/MU_GuiId.java28
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_CircuitProgrammer.java46
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_DecayablesChest.java54
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_FishTrap.java52
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_PestKiller.java175
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_ProjectTable.java58
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_SuperJukebox.java88
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_VolumetricFlaskSetter.java228
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/gui/widget/GuiValueField.java104
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/AchievementHandler.java491
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/BookHandler.java486
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/BurnableFuelHandler.java35
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/COMPAT_HANDLER.java299
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/COMPAT_IntermodStaging.java50
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/GuiHandler.java159
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/PacketHandler.java94
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/Recipes/DecayableRecipe.java38
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/Recipes/LateRegistrationHandler.java27
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/Recipes/RegistrationHandler.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/events/CustomMovementHandler.java144
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/events/EnderDragonDeathHandler.java61
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/events/EntityDeathHandler.java126
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/events/GeneralTooltipEventHandler.java20
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/events/PlayerSleepEventHandler.java109
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/events/SneakManager.java131
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/handler/workbench/Workbench_CraftingHandler.java161
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/interfaces/IGuiManager.java16
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/interfaces/IGuiManagerMiscUtils.java4
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/interfaces/IItemBlueprint.java52
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/inventories/InventoryCircuitProgrammer.java156
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/inventories/InventoryFishTrap.java157
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/inventories/InventoryPestKiller.java157
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_DecayablesChest.java157
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_EggBox.java157
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_SuperJukebox.java154
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_VolumetricFlaskSetter.java156
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectMain.java173
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectOutput.java160
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeMain.java173
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeOutput.java160
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/ModItems.java988
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemBurnable.java42
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemColourable.java100
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemComponent.java459
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemDamageable.java194
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemTCShard.java69
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemTickable.java332
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemWithDamageValue.java30
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/BasicSpawnEgg.java238
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/CoreItem.java286
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/bolts/BaseItemBolt.java11
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemCell.java73
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemPlasmaCell.java76
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDust.java135
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDustUnique.java164
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/foil/BaseItemFoil.java11
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemGear.java11
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemSmallGear.java11
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot.java20
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngotHot.java111
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot_OLD.java106
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockBasicTile.java51
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockGtBlock.java184
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockMeta.java106
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockOre.java148
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemMisc.java154
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemParticle.java66
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/nugget/BaseItemNugget.java11
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCentrifugedCrushedOre.java10
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCrushedOre.java10
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemImpureDust.java10
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemMilledOre.java24
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedCrushedOre.java10
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedDust.java10
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemRawOre.java10
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseOreComponent.java272
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate.java23
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDense.java11
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDouble.java12
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate_OLD.java91
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/rings/BaseItemRing.java11
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRod.java11
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRodLong.java11
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/rotors/BaseItemRotor.java11
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/screws/BaseItemScrew.java11
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/base/wire/BaseItemFineWire.java11
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/bauble/BaseBauble.java133
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/bauble/BatteryPackBaseBauble.java261
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/bauble/ElectricBaseBauble.java220
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/bauble/FireProtectionBauble.java120
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/chemistry/AgriculturalChem.java667
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/chemistry/CoalTar.java319
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/chemistry/GenericChem.java961
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/chemistry/IonParticles.java171
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/chemistry/MilledOreProcessing.java752
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/chemistry/NuclearChem.java105
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/chemistry/RocketFuels.java562
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/chemistry/StandardBaseParticles.java156
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/chemistry/general/ItemGenericChemBase.java321
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/circuit/GTPP_IntegratedCircuit_Item.java213
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/crafting/ItemDummyResearch.java92
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/food/BaseItemMetaFood.java509
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/BufferCore.java68
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/ItemAirFilter.java143
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/ItemBasicScrubberTurbine.java152
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/ItemBlueprint.java297
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/ItemCloakingDevice.java232
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/ItemEmpty.java18
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/ItemGenericToken.java197
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/ItemHalfCompleteCasings.java56
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/ItemHealingDevice.java419
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/ItemLavaFilter.java84
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/ItemMagicFeather.java260
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/books/ItemBaseBook.java122
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/chassis/ItemBoilerChassis.java72
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoil.java70
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoilWire.java70
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/general/spawn/ItemCustomSpawnEgg.java278
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/init/ItemsFoods.java50
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/materials/DustDecayable.java97
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/tool/misc/GregtechPump.java1320
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/wearable/WearableLoader.java14
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/ArmourLoader.java38
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmour.java10
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmourHelm.java9
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/tinfoil/ArmourTinFoilHat.java179
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/wearable/base/BaseItemWearable.java61
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/item/wearable/hazmat/ItemArmorHazmatEx.java35
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/lib/CORE.java242
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/lib/VanillaColours.java43
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/material/ALLOY.java828
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/material/ELEMENT.java651
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/material/MISC_MATERIALS.java592
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/material/Material.java1725
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/material/MaterialGenerator.java428
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/material/MaterialStack.java116
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/material/NONMATERIAL.java42
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/material/ORES.java701
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/material/Particle.java154
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/material/nuclear/FLUORIDES.java244
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/material/nuclear/NUCLIDE.java311
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/material/state/MaterialState.java22
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/network/handler/AbstractClientMessageHandler.java14
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/network/handler/AbstractMessageHandler.java38
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/network/handler/AbstractServerMessageHandler.java14
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/network/packet/AbstractPacket.java8
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui.java127
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui2.java126
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/potion/GtPotionEffect.java10
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/proxy/ClientProxy.java190
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/proxy/ServerProxy.java28
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/recipe/LOADER_Machine_Components.java114
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_GREGTECH.java1806
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_General.java475
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_LaserEngraver.java135
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_MachineComponents.java10
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_Machines.java2960
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_RareEarthProcessing.java168
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_SeleniumProcessing.java142
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_Tools.java118
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPE_Batteries.java62
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/recipe/ShapedRecipeObject.java50
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/recipe/common/CI.java1008
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/slots/SlotCrafting.java154
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/slots/SlotCraftingNoCollect.java139
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/slots/SlotDataStick.java42
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/slots/SlotGeneric.java22
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/slots/SlotIntegratedCircuit.java110
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/slots/SlotJukebox.java35
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/slots/SlotNoInput.java22
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/slots/SlotVolumetricFlask.java28
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/tileentities/ModTileEntities.java35
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/tileentities/base/TileEntityBase.java1419
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityCircuitProgrammer.java313
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityDecayablesChest.java378
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityFishTrap.java294
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityInfiniteFluid.java148
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityVolumetricFlaskSetter.java418
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityAdvPooCollector.java140
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityBaseFluidCollector.java241
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPestKiller.java532
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPooCollector.java128
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityProjectTable.java165
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/MovingAverageLong.java59
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/Utils.java436
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/data/AES.java135
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/data/ArrayUtils.java44
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/data/FileUtils.java112
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/data/LocaleUtils.java86
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/data/StringUtils.java177
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/math/MathUtils.java528
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/minecraft/EntityUtils.java146
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/minecraft/FluidUtils.java667
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/minecraft/InventoryUtils.java68
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/minecraft/ItemUtils.java1012
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/minecraft/LangUtils.java41
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/minecraft/MaterialUtils.java372
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/minecraft/MiningUtils.java133
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/minecraft/NBTUtils.java164
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/minecraft/OreDictUtils.java20
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/minecraft/PlayerUtils.java206
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/minecraft/RecipeUtils.java465
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/minecraft/gregtech/PollutionUtils.java147
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/recipe/GT_RecipeUtils.java95
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/recipe/RecipeHashStrat.java116
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/reflect/AddGregtechRecipe.java77
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/reflect/ReflectionUtils.java727
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/util/sys/KeyboardUtils.java37
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/world/explosions/ExplosionHandler.java31
-rw-r--r--gtpp/src/main/java/gtPlusPlus/core/world/explosions/MiningExplosion.java442
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/GTplusplus_Everglades.java194
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/biome/BiomeGenerator_Custom.java361
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/biome/Biome_Everglades.java83
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/biome/GenLayerBiomes.java26
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/biome/GenLayerEverglades.java32
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldGround.java23
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPollutedDirt.java68
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPortalFrame.java26
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldSludgeFluid.java70
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/block/BlockEvergladesPortal.java393
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/block/DarkWorldContentLoader.java73
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/chunk/ChunkProviderModded.java560
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/dimension/Dimension_Everglades.java29
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/gen/WorldGenDeadLilly.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/gen/WorldGenMinable_Custom.java90
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT.java49
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Base.java580
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Ore_Layer.java590
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_Ores.java263
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/item/ItemBlockToxicEverglades.java37
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/item/ItemEvergladesPortalTrigger.java113
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/world/TeleporterDimensionMod.java472
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/world/WorldChunkManagerCustom.java250
-rw-r--r--gtpp/src/main/java/gtPlusPlus/everglades/world/WorldProviderMod.java59
-rw-r--r--gtpp/src/main/java/gtPlusPlus/nei/DecayableRecipeHandler.java273
-rw-r--r--gtpp/src/main/java/gtPlusPlus/nei/GT_NEI_LFTR_Sparging.java502
-rw-r--r--gtpp/src/main/java/gtPlusPlus/nei/NEI_GTPP_Config.java102
-rw-r--r--gtpp/src/main/java/gtPlusPlus/nei/handlers/NeiTextureHandler.java126
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeDefinition.java49
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeUtils.java10
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/agrichem/BioRecipes.java1257
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/agrichem/Core_Agrichem.java56
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/agrichem/IAlgalItem.java12
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/agrichem/block/AgrichemFluids.java77
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAgrichemBase.java268
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAlgaeBase.java225
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGeneticData.java129
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGrowthRequirement.java4
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/fixes/interfaces/IBugFix.java6
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/Core_VanillaFixes.java101
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBackgroundMusicFix.java64
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBedHeightFix.java85
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/music/MusicTocker.java131
-rw-r--r--gtpp/src/main/java/gtPlusPlus/plugin/manager/Core_Manager.java94
-rw-r--r--gtpp/src/main/java/gtPlusPlus/preloader/CORE_Preloader.java33
-rw-r--r--gtpp/src/main/java/gtPlusPlus/preloader/Preloader_GT_OreDict.java103
-rw-r--r--gtpp/src/main/java/gtPlusPlus/preloader/Preloader_Logger.java50
-rw-r--r--gtpp/src/main/java/gtPlusPlus/preloader/asm/AsmConfig.java144
-rw-r--r--gtpp/src/main/java/gtPlusPlus/preloader/asm/Preloader_DummyContainer.java70
-rw-r--r--gtpp/src/main/java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java47
-rw-r--r--gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter.java187
-rw-r--r--gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool.java233
-rw-r--r--gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_LWJGL_Keyboard.java297
-rw-r--r--gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_TC_ItemWispEssence.java317
-rw-r--r--gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java79
-rw-r--r--gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java92
-rw-r--r--gtpp/src/main/java/gtPlusPlus/preloader/keyboard/BetterKeyboard.java134
-rw-r--r--gtpp/src/main/java/gtPlusPlus/recipes/CokeAndPyrolyseOven.java73
-rw-r--r--gtpp/src/main/java/gtPlusPlus/recipes/RecipeRemovals.java107
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/HANDLER_CropsPlusPlus.java16
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/LoaderOfTheCrops.java109
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseAestheticCrop.java34
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseCrop.java67
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseHarvestableCrop.java73
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/crops/Crop_Hemp.java41
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bartworks/BW_Utils.java17
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bop/HANDLER_BiomesOPlenty.java178
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/BOP_Block_Registrator.java173
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LeavesBase.java106
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LogBase.java85
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/base/SaplingBase.java166
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LeavesPineTree.java41
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LogPineTree.java21
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/SaplingPineTree.java52
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LeavesRainforestTree.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LogRainforestTree.java12
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/SaplingRainforestTree.java65
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenPineTree.java172
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenRainForestTree_Ex.java310
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/HANDLER_FR.java23
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/CustomCombs.java94
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bee_Definition.java604
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bees.java172
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Branch_Definition.java76
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/ItemCustomComb.java142
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_CombType.java62
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_DropType.java61
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PollenType.java60
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PropolisType.java61
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_ItemRegistry.java120
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_StringUtil.java14
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_FrameType.java126
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_ItemFrame.java142
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Comb.java131
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Drop.java131
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Pollen.java92
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Propolis.java110
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/recipe/FR_Gregtech_Recipes.java134
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_AlleleBeeSpecies.java50
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BeeDefinition.java301
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bee_Mutation.java86
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bees.java69
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BranchDefinition.java89
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/HANDLER_GT.java98
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechItemList.java980
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOreDictNames.java39
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOrePrefixes.java1324
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechToolDictNames.java9
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/GTPP_UITextures.java139
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/widget/ElectricSlotWidget.java40
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/GregtechItemContainer.java40
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/IGregtech_RecipeAdder.java380
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ItemBehaviour.java46
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_OreRecipeRegistrator.java24
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ToolStats.java202
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_Generic_Item.java204
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem.java357
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_Base.java745
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_X32.java266
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaTool.java692
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ChiselBus.java78
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake.java128
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake_Extreme.java37
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DynamoBuffer.java67
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_ElementalDataOrbHolder.java229
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_FluidGenerator.java255
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBattery.java235
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler_Adv.java370
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Naquadah.java203
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBattery.java222
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Reservoir.java75
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Solidifier.java72
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusInput.java279
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusOutput.java215
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Turbine.java435
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_TurbineProvider.java221
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Input.java65
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Output.java105
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntityFluid.java117
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntity_Cable.java156
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaTreeFarmerStructural.java49
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GT_MetaTileEntity_Hatch_CustomFluidBase.java214
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTileEntity.java74
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTransformerHiAmp.java117
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_MultiBlockBase.java1799
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_SteamMultiBase.java428
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaBoilerBase.java361
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaSolarGenerator.java241
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechRocketFuelGeneratorBase.java338
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/machines/GregtechMetaTreeFarmerBase.java180
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_Catalysts.java71
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_MillingBalls.java71
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_NbtConsumable.java353
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_CopiedBlockTexture.java28
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_RenderedTexture.java27
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechItemData.java147
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechMaterialStack.java55
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/util/GTPP_Config.java123
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/util/SpecialBehaviourTooltipHandler.java35
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy.java96
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks.java79
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks2.java111
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks3.java379
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks4.java126
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks5.java159
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks6.java341
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksAbstract.java151
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksPipeGearbox.java91
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingItems.java10
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaItemCasingsAbstract.java67
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMachineCasings.java76
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings.java120
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings2.java99
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaTieredCasingBlocks1.java84
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/fluid/GregtechFluidHandler.java146
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler.java57
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler2.java71
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler3.java61
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler6.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesCentrifugeMultiblock.java151
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGrinderMultiblock.java134
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtBlock.java486
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtTools.java51
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/turbine/LargeTurbineTextureHandler.java410
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/CoverManager.java16
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_Overflow.java203
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_ToggleVisual.java184
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/ChargingHelper.java346
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/FlotationRecipeHandler.java62
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/GT_MethodHelper.java19
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/VolumetricFlaskHelper.java125
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/tesseract/TesseractHelper.java256
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaCustomCoverItem.java222
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechItems.java292
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechTools.java54
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Choocher.java91
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Electric_Lighter.java225
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Prospecting_Ex.java140
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/covers/MetaItemCoverCasings.java50
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_CapeRenderer.java500
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_FlaskRenderer.java107
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_Render_MachineBlock.java1250
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_ElectricAutoWorkbench.java873
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractGenerator.java834
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractTerminal.java644
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_Base.java333
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_HV.java52
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_LV.java52
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_MV.java52
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_SemiFluidGenerator.java173
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityGeothermalGenerator.java176
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityRocketFuelGenerator.java156
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntity_RTG.java379
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_CombustionGenerator.java59
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_SteamTurbine.java42
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_CropHarvestor.java716
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaAtmosphericReconditioner.java893
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionCreator.java458
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionDetector.java502
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaTileEntity_AutoChisel.java190
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaWirelessCharger.java672
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/misc/GMTE_AmazonPackager.java168
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialAlloySmelter.java223
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialArcFurnace.java337
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCentrifuge.java228
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialChisel.java342
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCokeOven.java209
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCuttingMachine.java230
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialDehydrator.java250
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialElectrolyzer.java169
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialExtruder.java194
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialFluidHeater.java204
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialForgeHammer.java244
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMacerator.java458
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMixer.java213
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMolecularTransformer.java241
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMultiMachine.java514
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialPlatePress.java218
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialSifter.java209
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialThermalCentrifuge.java184
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialVacuumFreezer.java261
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWashPlant.java372
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWireMill.java215
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IsaMill.java529
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_NuclearSaltProcessingPlant.java224
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_SpargeTower.java507
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_DistillationTower.java491
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_EBF.java333
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK4.java200
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK5.java200
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_HeatExchanger.java414
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Implosion.java177
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamCompressor.java156
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamMacerator.java165
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_AutoCrafter.java196
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_ThermalBoiler.java353
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_ElementalDuplicator.java352
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_FrothFlotationCell.java287
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_NuclearReactor.java524
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntityTreeFarm.java809
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_AlloyBlastSmelter.java235
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Cyclotron.java331
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialFishingPond.java489
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialRockBreaker.java367
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeRocketEngine.java524
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java332
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_MassFabricator.java337
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_QuantumForceTransformer.java939
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Refinery.java220
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_SolarTower.java675
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/algae/GregtechMTE_AlgaePondBase.java376
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/chemplant/GregtechMTE_ChemicalPlant.java676
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/mega/GregTechMetaTileEntity_MegaAlloyBlastSmelter.java468
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Gas.java208
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Plasma.java314
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SCSteam.java126
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SHSteam.java204
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Steam.java215
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GregtechMetaTileEntity_LargerTurbineBase.java893
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java939
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/misc/TileEntitySolarHeater.java343
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredChest.java250
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredTank.java194
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GregtechMetaEnergyBuffer.java439
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/creative/GT_MetaTileEntity_InfiniteItemHolder.java92
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_AngleGrinder.java175
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_ElectricSnips.java96
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/Gregtech_Blocks.java34
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingAngleGrinder.java133
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingElectricSnips.java137
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_AlloySmelter.java63
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Assembler.java69
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Base.java15
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelter.java321
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelterGT_GTNH.java252
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_DustGeneration.java448
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Extruder.java159
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_FluidCanning.java222
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluids.java212
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluorite.java267
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MaterialProcessing.java318
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MetalRecipe.java112
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MultisUsingFluidInsteadOfCells.java187
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Ore.java750
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plasma.java62
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plates.java225
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Recycling.java400
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_ShapedCrafting.java222
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/misc/AddCustomMachineToPA.java13
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_AlgaeFarm.java192
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_ChemicalSkips.java661
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GTNH.java45
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GlueLine.java395
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_LFTR.java135
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_MolecularTransformer.java78
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_Nuclear.java680
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_NuclearFuelProcessing.java258
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_TreeFarm.java719
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/recipes/GregtechRecipeAdder.java1220
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/Gregtech4Content.java95
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAdvancedBoilers.java109
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAlgaeContent.java50
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAmazonWarehouse.java20
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechBufferDynamos.java133
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechConduits.java1269
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCustomHatches.java278
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCyclotron.java19
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechDehydrator.java199
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechEnergyBuffer.java149
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechFactoryGradeReplacementMultis.java44
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechGeothermalThermalGenerator.java78
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechHiAmpTransformer.java163
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialAlloySmelter.java21
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialArcFurnace.java22
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialBlastSmelter.java31
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCentrifuge.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialChisel.java24
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCokeOven.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCuttingFactory.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElectrolyzer.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElementDuplicator.java24
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialExtruder.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFishPond.java21
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFluidHeater.java21
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialForgeHammer.java21
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFuelRefinery.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMacerator.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMassFabricator.java137
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMixer.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMultiMachine.java24
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialPlatePress.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialRockBreaker.java15
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialSifter.java24
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialThermalCentrifuge.java24
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialTreeFarm.java22
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWashPlant.java24
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWiremill.java25
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIsaMill.java26
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLFTR.java93
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLargeTurbinesAndHeatExchanger.java48
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechMolecularTransformer.java21
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechNuclearSaltProcessingPlant.java21
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPollutionDevices.java93
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPowerSubStation.java61
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechQuantumForceTransformer.java20
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRTG.java22
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRocketFuelGenerator.java98
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSemiFluidgenerators.java46
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSimpleWasher.java166
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSolarTower.java46
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSteamMultis.java30
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSuperChests.java30
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThaumcraftDevices.java29
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThreadedBuffers.java13
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTieredFluidTanks.java31
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTreeFarmerTE.java21
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechWirelessChargers.java96
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/ic2/CustomInternalName.java23
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/ic2/HANDLER_IC2.java15
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/ic2/item/CustomKineticRotor.java244
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/ic2/item/IC2_Items.java77
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/ic2/recipe/RECIPE_IC2.java365
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/pamsharvest/fishtrap/FishTrapHandler.java73
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/railcraft/HANDLER_Railcraft.java217
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/railcraft/utils/RailcraftUtils.java22
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/thaumcraft/commands/CommandDumpAspects.java92
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/thaumcraft/objects/ThreadAspectScanner.java165
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/HANDLER_TF.java36
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Cryotheum.java178
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Ender.java61
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Pyrotheum.java192
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Blocks.java23
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/fluid/TF_Fluids.java69
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/item/TF_Items.java75
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/recipe/TF_Gregtech_Recipes.java93
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/tinkers/HANDLER_Tinkers.java30
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/tinkers/material/BaseTinkersMaterial.java200
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersDryingRecipe.java129
-rw-r--r--gtpp/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersUtils.java377
-rw-r--r--gtpp/src/main/resources/assets/forestry/AlvearyFrame.pngbin0 -> 931 bytes
-rw-r--r--gtpp/src/main/resources/assets/forestry/AlvearyMutator.pngbin0 -> 731 bytes
-rw-r--r--gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.off.pngbin0 -> 670 bytes
-rw-r--r--gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.on.pngbin0 -> 670 bytes
-rw-r--r--gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.off.pngbin0 -> 558 bytes
-rw-r--r--gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.on.pngbin0 -> 558 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/lang/en_US.lang283
-rw-r--r--gtpp/src/main/resources/assets/gregtech/lang/zh_CN.lang223
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM.pngbin0 -> 228 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 224 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT.pngbin0 -> 344 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE.pngbin0 -> 387 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE.pngbin0 -> 345 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.pngbin0 -> 668 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP.pngbin0 -> 228 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE.pngbin0 -> 224 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT.pngbin0 -> 200 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE.pngbin0 -> 194 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 137 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE.pngbin0 -> 212 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE.pngbin0 -> 317 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 269 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP.pngbin0 -> 314 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE.pngbin0 -> 302 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM.pngbin0 -> 367 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 366 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT.pngbin0 -> 439 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.pngbin0 -> 704 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE.pngbin0 -> 439 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.pngbin0 -> 1049 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP.pngbin0 -> 367 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE.pngbin0 -> 366 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT.pngbin0 -> 214 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE.pngbin0 -> 329 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE.pngbin0 -> 214 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE.pngbin0 -> 329 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.pngbin0 -> 178 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.pngbin0 -> 5538 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block1.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block2.pngbin0 -> 459 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block3.pngbin0 -> 490 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block4.pngbin0 -> 480 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block5.pngbin0 -> 414 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block6.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/foil.pngbin0 -> 368 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/frameGt.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore.pngbin0 -> 271 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/oreSmall.pngbin0 -> 339 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.pngbin0 -> 591 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeHuge.pngbin0 -> 348 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeLarge.pngbin0 -> 429 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeMedium.pngbin0 -> 429 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSide.pngbin0 -> 401 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSmall.pngbin0 -> 427 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeTiny.pngbin0 -> 418 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/void.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/wire.pngbin0 -> 513 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block1.pngbin0 -> 490 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block2.pngbin0 -> 459 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block3.pngbin0 -> 490 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block4.pngbin0 -> 480 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block5.pngbin0 -> 414 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block6.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/foil.pngbin0 -> 368 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/frameGt.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/ore.pngbin0 -> 280 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/oreSmall.pngbin0 -> 339 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeHuge.pngbin0 -> 348 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeLarge.pngbin0 -> 429 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeMedium.pngbin0 -> 429 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSide.pngbin0 -> 401 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSmall.pngbin0 -> 427 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeTiny.pngbin0 -> 418 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/void.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/wire.pngbin0 -> 513 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block1.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block2.pngbin0 -> 459 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block3.pngbin0 -> 490 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block4.pngbin0 -> 480 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block5.pngbin0 -> 414 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block6.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/foil.pngbin0 -> 368 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/frameGt.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.pngbin0 -> 589 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/oreSmall.pngbin0 -> 339 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeHuge.pngbin0 -> 348 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeLarge.pngbin0 -> 429 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeMedium.pngbin0 -> 429 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSide.pngbin0 -> 401 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSmall.pngbin0 -> 427 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeTiny.pngbin0 -> 418 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/void.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/wire.pngbin0 -> 513 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block1.pngbin0 -> 487 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block2.pngbin0 -> 459 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block3.pngbin0 -> 490 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block4.pngbin0 -> 480 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block5.pngbin0 -> 414 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block6.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/foil.pngbin0 -> 368 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/frameGt.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/ore.pngbin0 -> 632 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/oreSmall.pngbin0 -> 339 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeHuge.pngbin0 -> 500 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeLarge.pngbin0 -> 555 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeMedium.pngbin0 -> 569 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSide.pngbin0 -> 540 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSmall.pngbin0 -> 545 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeTiny.pngbin0 -> 560 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/void.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/wire.pngbin0 -> 513 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/gui/basicmachines/FissionFuel.pngbin0 -> 2393 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.pngbin0 -> 1013 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.window.pngbin0 -> 399 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.pngbin0 -> 1010 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.window.pngbin0 -> 398 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE.pngbin0 -> 395 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic.pngbin0 -> 291 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic_OVERLAY.pngbin0 -> 289 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood.pngbin0 -> 291 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood_OVERLAY.pngbin0 -> 302 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt.pngbin0 -> 161 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt_OVERLAY.pngbin0 -> 206 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust.pngbin0 -> 370 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust_OVERLAY.pngbin0 -> 506 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem.pngbin0 -> 401 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot.pngbin0 -> 380 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot_OVERLAY.pngbin0 -> 517 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate.pngbin0 -> 455 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate_OVERLAY.pngbin0 -> 449 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed.pngbin0 -> 441 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged.pngbin0 -> 561 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged_OVERLAY.pngbin0 -> 430 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified.pngbin0 -> 460 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified_OVERLAY.pngbin0 -> 583 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed_OVERLAY.pngbin0 -> 426 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure_OVERLAY.pngbin0 -> 415 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure_OVERLAY.pngbin0 -> 383 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall.pngbin0 -> 286 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall_OVERLAY.pngbin0 -> 252 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny.pngbin0 -> 221 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny_OVERLAY.pngbin0 -> 221 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust_OVERLAY.pngbin0 -> 222 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil.pngbin0 -> 475 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil_OVERLAY.pngbin0 -> 539 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt.pngbin0 -> 434 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall.pngbin0 -> 563 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt_OVERLAY.pngbin0 -> 503 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem.pngbin0 -> 419 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped.pngbin0 -> 575 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped_OVERLAY.pngbin0 -> 465 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite.pngbin0 -> 619 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite_OVERLAY.pngbin0 -> 613 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed.pngbin0 -> 504 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed_OVERLAY.pngbin0 -> 487 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless.pngbin0 -> 691 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem_OVERLAY.pngbin0 -> 465 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet.pngbin0 -> 356 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot.pngbin0 -> 344 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble.pngbin0 -> 403 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble_OVERLAY.pngbin0 -> 419 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot.pngbin0 -> 335 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple.pngbin0 -> 375 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple_OVERLAY.pngbin0 -> 379 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple.pngbin0 -> 358 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple_OVERLAY.pngbin0 -> 362 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple.pngbin0 -> 388 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple_OVERLAY.pngbin0 -> 395 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens.pngbin0 -> 296 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens_OVERLAY.pngbin0 -> 594 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget.pngbin0 -> 250 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget_OVERLAY.pngbin0 -> 261 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw_OVERLAY.pngbin0 -> 1646 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate.pngbin0 -> 275 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense.pngbin0 -> 298 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense_OVERLAY.pngbin0 -> 322 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble.pngbin0 -> 297 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble_OVERLAY.pngbin0 -> 338 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple.pngbin0 -> 310 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple_OVERLAY.pngbin0 -> 372 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple_OVERLAY.pngbin0 -> 380 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple.pngbin0 -> 304 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple_OVERLAY.pngbin0 -> 360 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate_OVERLAY.pngbin0 -> 300 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring.pngbin0 -> 311 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring_OVERLAY.pngbin0 -> 413 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor.pngbin0 -> 443 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor_OVERLAY.pngbin0 -> 470 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round.pngbin0 -> 200 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round_OVERLAY.pngbin0 -> 205 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw.pngbin0 -> 199 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw_OVERLAY.pngbin0 -> 226 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring.pngbin0 -> 276 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall.pngbin0 -> 317 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall_OVERLAY.pngbin0 -> 283 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring_OVERLAY.pngbin0 -> 304 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick.pngbin0 -> 230 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong.pngbin0 -> 246 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong_OVERLAY.pngbin0 -> 217 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick_OVERLAY.pngbin0 -> 248 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow.pngbin0 -> 424 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe.pngbin0 -> 255 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe_OVERLAY.pngbin0 -> 250 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw.pngbin0 -> 533 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 557 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw.pngbin0 -> 531 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw_OVERLAY.pngbin0 -> 347 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill.pngbin0 -> 525 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill_OVERLAY.pngbin0 -> 348 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile.pngbin0 -> 257 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile_OVERLAY.pngbin0 -> 295 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer.pngbin0 -> 235 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer_OVERLAY.pngbin0 -> 253 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe.pngbin0 -> 230 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe_OVERLAY.pngbin0 -> 240 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet.pngbin0 -> 340 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe.pngbin0 -> 241 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe_OVERLAY.pngbin0 -> 280 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow.pngbin0 -> 268 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow_OVERLAY.pngbin0 -> 271 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw.pngbin0 -> 258 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw_OVERLAY.pngbin0 -> 280 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver.pngbin0 -> 178 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver_OVERLAY.pngbin0 -> 231 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense_OVERLAY.pngbin0 -> 285 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel.pngbin0 -> 251 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering.pngbin0 -> 314 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword.pngbin0 -> 269 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword_OVERLAY.pngbin0 -> 280 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade.pngbin0 -> 254 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 262 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench.pngbin0 -> 517 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench_OVERLAY.pngbin0 -> 310 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade.pngbin0 -> 395 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine.pngbin0 -> 481 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine_OVERLAY.pngbin0 -> 458 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE.pngbin0 -> 395 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic.pngbin0 -> 297 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic_OVERLAY.pngbin0 -> 283 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood.pngbin0 -> 297 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood_OVERLAY.pngbin0 -> 294 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt.pngbin0 -> 161 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust.pngbin0 -> 370 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust_OVERLAY.pngbin0 -> 506 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem.pngbin0 -> 401 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot.pngbin0 -> 380 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot_OVERLAY.pngbin0 -> 517 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate.pngbin0 -> 455 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate_OVERLAY.pngbin0 -> 449 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed.pngbin0 -> 441 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged.pngbin0 -> 561 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified.pngbin0 -> 460 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed_OVERLAY.pngbin0 -> 448 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure_OVERLAY.pngbin0 -> 430 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure_OVERLAY.pngbin0 -> 424 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall.pngbin0 -> 286 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny.pngbin0 -> 221 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust_OVERLAY.pngbin0 -> 172 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil.pngbin0 -> 475 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt.pngbin0 -> 434 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall.pngbin0 -> 563 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall_OVERLAY.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt_OVERLAY.pngbin0 -> 172 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem.pngbin0 -> 341 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped.pngbin0 -> 575 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite.pngbin0 -> 619 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed.pngbin0 -> 504 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless.pngbin0 -> 691 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet.pngbin0 -> 356 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot.pngbin0 -> 344 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble.pngbin0 -> 403 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot.pngbin0 -> 335 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple.pngbin0 -> 375 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple.pngbin0 -> 358 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple.pngbin0 -> 388 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot_OVERLAY.pngbin0 -> 180 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens.pngbin0 -> 296 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens_OVERLAY.pngbin0 -> 556 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget.pngbin0 -> 250 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw.pngbin0 -> 417 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw_OVERLAY.pngbin0 -> 376 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate.pngbin0 -> 275 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense.pngbin0 -> 298 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble.pngbin0 -> 297 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple.pngbin0 -> 310 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple.pngbin0 -> 304 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate_OVERLAY.pngbin0 -> 173 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring.pngbin0 -> 311 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring_OVERLAY.pngbin0 -> 174 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor.pngbin0 -> 443 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round.pngbin0 -> 200 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw.pngbin0 -> 199 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring.pngbin0 -> 276 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall.pngbin0 -> 317 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick.pngbin0 -> 230 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong.pngbin0 -> 246 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick_OVERLAY.pngbin0 -> 230 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow.pngbin0 -> 399 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow_OVERLAY.pngbin0 -> 183 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe.pngbin0 -> 255 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw.pngbin0 -> 533 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw.pngbin0 -> 531 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill.pngbin0 -> 525 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile.pngbin0 -> 257 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer.pngbin0 -> 235 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe.pngbin0 -> 230 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet.pngbin0 -> 340 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe.pngbin0 -> 241 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow.pngbin0 -> 268 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw.pngbin0 -> 258 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver.pngbin0 -> 178 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel.pngbin0 -> 251 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering.pngbin0 -> 314 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword.pngbin0 -> 269 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade.pngbin0 -> 254 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench.pngbin0 -> 517 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade.pngbin0 -> 395 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine.pngbin0 -> 481 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine_OVERLAY.pngbin0 -> 271 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust.pngbin0 -> 370 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust_OVERLAY.pngbin0 -> 506 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem.pngbin0 -> 401 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot.pngbin0 -> 380 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot_OVERLAY.pngbin0 -> 517 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate.pngbin0 -> 455 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate_OVERLAY.pngbin0 -> 449 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedCentrifuged_OVERLAY.pngbin0 -> 430 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedPurified_OVERLAY.pngbin0 -> 583 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushed_OVERLAY.pngbin0 -> 426 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dustTiny_OVERLAY.pngbin0 -> 221 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dust_OVERLAY.pngbin0 -> 222 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/foil_OVERLAY.pngbin0 -> 539 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGtSmall_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGt_OVERLAY.pngbin0 -> 503 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemChipped_OVERLAY.pngbin0 -> 465 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemExquisite_OVERLAY.pngbin0 -> 613 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawed_OVERLAY.pngbin0 -> 487 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawless_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gem_OVERLAY.pngbin0 -> 465 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotDouble_OVERLAY.pngbin0 -> 419 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotHot_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuadruple_OVERLAY.pngbin0 -> 379 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuintuple_OVERLAY.pngbin0 -> 362 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotTriple_OVERLAY.pngbin0 -> 395 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingot_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens.pngbin0 -> 296 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens_OVERLAY.pngbin0 -> 594 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/nugget_OVERLAY.pngbin0 -> 261 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDense_OVERLAY.pngbin0 -> 322 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDouble_OVERLAY.pngbin0 -> 338 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuadruple_OVERLAY.pngbin0 -> 372 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuintuple_OVERLAY.pngbin0 -> 380 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateTriple_OVERLAY.pngbin0 -> 360 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plate_OVERLAY.pngbin0 -> 300 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ring_OVERLAY.pngbin0 -> 413 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/rotor_OVERLAY.pngbin0 -> 470 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/round_OVERLAY.pngbin0 -> 205 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/screw_OVERLAY.pngbin0 -> 226 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/springSmall_OVERLAY.pngbin0 -> 283 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/spring_OVERLAY.pngbin0 -> 304 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stickLong_OVERLAY.pngbin0 -> 217 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stick_OVERLAY.pngbin0 -> 248 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine.pngbin0 -> 481 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine_OVERLAY.pngbin0 -> 458 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE.pngbin0 -> 395 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic.pngbin0 -> 297 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic_OVERLAY.pngbin0 -> 283 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood.pngbin0 -> 297 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood_OVERLAY.pngbin0 -> 294 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt.pngbin0 -> 161 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust.pngbin0 -> 370 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust_OVERLAY.pngbin0 -> 506 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem.pngbin0 -> 401 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot.pngbin0 -> 380 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot_OVERLAY.pngbin0 -> 517 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate.pngbin0 -> 455 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate_OVERLAY.pngbin0 -> 449 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed.pngbin0 -> 462 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged.pngbin0 -> 561 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged_OVERLAY.pngbin0 -> 393 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified.pngbin0 -> 460 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified_OVERLAY.pngbin0 -> 538 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed_OVERLAY.pngbin0 -> 539 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure_OVERLAY.pngbin0 -> 430 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure_OVERLAY.pngbin0 -> 424 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall.pngbin0 -> 286 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall_OVERLAY.pngbin0 -> 256 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny.pngbin0 -> 221 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust_OVERLAY.pngbin0 -> 281 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil.pngbin0 -> 475 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil_OVERLAY.pngbin0 -> 568 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt.pngbin0 -> 434 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall.pngbin0 -> 563 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall_OVERLAY.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt_OVERLAY.pngbin0 -> 172 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem.pngbin0 -> 419 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped.pngbin0 -> 575 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped_OVERLAY.pngbin0 -> 511 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite.pngbin0 -> 619 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite_OVERLAY.pngbin0 -> 552 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed.pngbin0 -> 504 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed_OVERLAY.pngbin0 -> 543 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless.pngbin0 -> 691 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem_OVERLAY.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet.pngbin0 -> 356 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot.pngbin0 -> 344 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble.pngbin0 -> 403 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot.pngbin0 -> 335 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple.pngbin0 -> 375 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple.pngbin0 -> 358 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple.pngbin0 -> 388 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot_OVERLAY.pngbin0 -> 333 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens.pngbin0 -> 296 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens_OVERLAY.pngbin0 -> 556 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget.pngbin0 -> 250 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget_OVERLAY.pngbin0 -> 286 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw_OVERLAY.pngbin0 -> 1464 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate.pngbin0 -> 275 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense.pngbin0 -> 298 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense_OVERLAY.pngbin0 -> 310 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble.pngbin0 -> 297 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble_OVERLAY.pngbin0 -> 319 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple.pngbin0 -> 310 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple.pngbin0 -> 304 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring.pngbin0 -> 311 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring_OVERLAY.pngbin0 -> 174 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor.pngbin0 -> 443 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round.pngbin0 -> 200 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw.pngbin0 -> 199 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring.pngbin0 -> 276 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall.pngbin0 -> 317 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick.pngbin0 -> 230 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong.pngbin0 -> 246 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong_OVERLAY.pngbin0 -> 305 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick_OVERLAY.pngbin0 -> 314 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow.pngbin0 -> 399 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow_OVERLAY.pngbin0 -> 183 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe.pngbin0 -> 255 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw.pngbin0 -> 533 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw.pngbin0 -> 531 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill.pngbin0 -> 525 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile.pngbin0 -> 257 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer.pngbin0 -> 235 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe.pngbin0 -> 230 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet.pngbin0 -> 340 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe.pngbin0 -> 241 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow.pngbin0 -> 268 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw.pngbin0 -> 258 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver.pngbin0 -> 178 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel.pngbin0 -> 251 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering.pngbin0 -> 314 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword.pngbin0 -> 269 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade.pngbin0 -> 254 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench.pngbin0 -> 517 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade.pngbin0 -> 395 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine.pngbin0 -> 481 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine_OVERLAY.pngbin0 -> 271 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE.pngbin0 -> 395 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic.pngbin0 -> 297 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic_OVERLAY.pngbin0 -> 283 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood.pngbin0 -> 297 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood_OVERLAY.pngbin0 -> 294 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt.pngbin0 -> 161 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust.pngbin0 -> 370 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust_OVERLAY.pngbin0 -> 506 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem.pngbin0 -> 401 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot.pngbin0 -> 380 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot_OVERLAY.pngbin0 -> 517 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate.pngbin0 -> 455 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate_OVERLAY.pngbin0 -> 449 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed.pngbin0 -> 441 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged.pngbin0 -> 561 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified.pngbin0 -> 460 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed_OVERLAY.pngbin0 -> 448 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure_OVERLAY.pngbin0 -> 430 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure_OVERLAY.pngbin0 -> 424 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall.pngbin0 -> 286 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny.pngbin0 -> 221 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust_OVERLAY.pngbin0 -> 172 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil.pngbin0 -> 475 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt.pngbin0 -> 434 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall.pngbin0 -> 563 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall_OVERLAY.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt_OVERLAY.pngbin0 -> 172 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem.pngbin0 -> 419 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped.pngbin0 -> 575 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite.pngbin0 -> 619 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed.pngbin0 -> 504 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless.pngbin0 -> 691 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet.pngbin0 -> 356 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot.pngbin0 -> 344 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble.pngbin0 -> 403 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot.pngbin0 -> 335 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple.pngbin0 -> 375 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple.pngbin0 -> 358 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple.pngbin0 -> 388 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot_OVERLAY.pngbin0 -> 180 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens.pngbin0 -> 296 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens_OVERLAY.pngbin0 -> 556 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget.pngbin0 -> 250 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate.pngbin0 -> 275 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense.pngbin0 -> 298 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble.pngbin0 -> 297 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple.pngbin0 -> 310 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple.pngbin0 -> 304 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate_OVERLAY.pngbin0 -> 173 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring.pngbin0 -> 311 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring_OVERLAY.pngbin0 -> 174 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor.pngbin0 -> 443 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round.pngbin0 -> 200 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw.pngbin0 -> 199 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring.pngbin0 -> 276 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall.pngbin0 -> 317 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick.pngbin0 -> 230 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong.pngbin0 -> 246 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick_OVERLAY.pngbin0 -> 230 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow.pngbin0 -> 399 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow_OVERLAY.pngbin0 -> 183 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe.pngbin0 -> 255 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw.pngbin0 -> 533 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw.pngbin0 -> 531 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill.pngbin0 -> 525 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile.pngbin0 -> 257 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer.pngbin0 -> 235 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe.pngbin0 -> 230 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet.pngbin0 -> 340 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe.pngbin0 -> 241 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow.pngbin0 -> 268 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw.pngbin0 -> 258 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver.pngbin0 -> 178 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel.pngbin0 -> 251 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering.pngbin0 -> 314 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword.pngbin0 -> 269 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade.pngbin0 -> 254 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench.pngbin0 -> 517 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade.pngbin0 -> 395 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine.pngbin0 -> 481 bytes
-rw-r--r--gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine_OVERLAY.pngbin0 -> 271 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/lang/de_DE.lang29
-rw-r--r--gtpp/src/main/resources/assets/ic2/lang/en_US.lang35
-rw-r--r--gtpp/src/main/resources/assets/ic2/lang/zh_CN.lang35
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/armor/hazmatEx_1.pngbin0 -> 2669 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/armor/hazmatEx_2.pngbin0 -> 967 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/cell/HydrofluoricAcid.pngbin0 -> 383 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/cell/HydrogenChloride.pngbin0 -> 402 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/cell/LithiumHydroxide.pngbin0 -> 289 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfurDioxide.pngbin0 -> 402 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfuricApatite.pngbin0 -> 408 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfuricLithium.pngbin0 -> 431 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfurousAcid.pngbin0 -> 409 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/cell/ThoriumTetraFluoride.pngbin0 -> 460 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/cell/UraniumHexaFluoride.pngbin0 -> 398 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/cell/UraniumTetraFluoride.pngbin0 -> 445 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/itemArmorHazmatChestplateEx.pngbin0 -> 525 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/itemArmorHazmatHelmetEx.pngbin0 -> 464 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/itemArmorHazmatLeggingsEx.pngbin0 -> 418 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/itemArmorRubBootsEx.pngbin0 -> 459 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemEnergeticRotor.pngbin0 -> 608 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemIridiumRotor.pngbin0 -> 555 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemMagnaliumRotor.pngbin0 -> 566 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemTungstenSteelRotor.pngbin0 -> 523 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemUltimetRotor.pngbin0 -> 542 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemVibrantRotor.pngbin0 -> 575 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorEnergeticModel.pngbin0 -> 3650 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorIridiumModel.pngbin0 -> 3748 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorMagnaliumModel.pngbin0 -> 3748 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorTungstenSteelModel.pngbin0 -> 3748 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorUltimetModel.pngbin0 -> 3748 bytes
-rw-r--r--gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorVibrantModel.pngbin0 -> 3502 bytes
-rw-r--r--gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/death.oggbin0 -> 8428 bytes
-rw-r--r--gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit1.oggbin0 -> 5843 bytes
-rw-r--r--gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit2.oggbin0 -> 5455 bytes
-rw-r--r--gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit3.oggbin0 -> 5424 bytes
-rw-r--r--gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit4.oggbin0 -> 5160 bytes
-rw-r--r--gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/idle1.oggbin0 -> 8605 bytes
-rw-r--r--gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/idle2.oggbin0 -> 10948 bytes
-rw-r--r--gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/idle3.oggbin0 -> 7106 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/lang/de_DE.lang1899
-rw-r--r--gtpp/src/main/resources/assets/miscutils/lang/en_US.lang3572
-rw-r--r--gtpp/src/main/resources/assets/miscutils/lang/ru_RU.lang3351
-rw-r--r--gtpp/src/main/resources/assets/miscutils/lang/zh_CN.lang3351
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/DevCapeHD.pngbin0 -> 4788 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/FancyCapeHD.pngbin0 -> 9643 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/Orange.pngbin0 -> 364 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/OrangeHD.pngbin0 -> 5904 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/PatreonCapeHD.pngbin0 -> 10267 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/TesterCapeHD.pngbin0 -> 7976 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/Blank.pngbin0 -> 75 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.pngbin0 -> 1131 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulatorStatic.pngbin0 -> 492 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.pngbin0 -> 1222 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCoreStatic.pngbin0 -> 645 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/FirePit/Firepit.tcnbin0 -> 1583 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/ForceFieldGlass.pngbin0 -> 249 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.pngbin0 -> 1627 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulatorStatic.pngbin0 -> 557 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.pngbin0 -> 1869 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCoreStatic.pngbin0 -> 613 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/Manipulator_Top.pngbin0 -> 511 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.pngbin0 -> 1309 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulatorStatic.pngbin0 -> 492 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.pngbin0 -> 1617 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCoreStatic.pngbin0 -> 607 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.pngbin0 -> 2084 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCoreStatic.pngbin0 -> 624 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.pngbin0 -> 1593 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipperStatic.pngbin0 -> 562 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/SwirlBigBlue.pngbin0 -> 259 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/CASING_AMAZON.pngbin0 -> 677 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_bottom.pngbin0 -> 738 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_full.pngbin0 -> 2249 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_side.pngbin0 -> 666 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_top.pngbin0 -> 670 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/Generic_Creative_Texture.pngbin0 -> 383 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_CRYOGENIC.pngbin0 -> 586 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_VOLCANUS.pngbin0 -> 601 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_CENTRIFUGE.pngbin0 -> 632 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FARM_MANAGER_STRUCTURAL.pngbin0 -> 522 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FIREBOX_STABALLOY.pngbin0 -> 825 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLOTATION.pngbin0 -> 647 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLUID_INCOLOY_DS.pngbin0 -> 1232 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GEARBOX_T1.pngbin0 -> 633 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GRINDING_FACTORY.pngbin0 -> 677 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_LAURENIUM.pngbin0 -> 416 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_PIPE_T1.pngbin0 -> 656 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.pngbin0 -> 11243 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png.mcmeta39
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ROCKETDYNE.pngbin0 -> 643 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_GRISIUM.pngbin0 -> 662 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_N.pngbin0 -> 642 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_X.pngbin0 -> 649 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_MARAGINGSTEEL.pngbin0 -> 394 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_POTIN.pngbin0 -> 635 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_RED_STEEL.pngbin0 -> 529 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_STELLITE.pngbin0 -> 659 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TALONITE.pngbin0 -> 665 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TANTALLOY61.pngbin0 -> 654 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_NAQUADAH_VENT.pngbin0 -> 623 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_TITANIUM.pngbin0 -> 504 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TUMBAGA.pngbin0 -> 662 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZERON100.pngbin0 -> 649 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZIRCONIUM_CARBIDE.pngbin0 -> 665 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_PESTKILLER_TOP.pngbin0 -> 624 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/STEAM_TURBINE_SIDE_ACTIVE.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/_PlaceHolder.pngbin0 -> 696 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.pngbin0 -> 1660 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_blue.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.pngbin0 -> 1383 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_lesu.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab.pngbin0 -> 296 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active.pngbin0 -> 277 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.pngbin0 -> 694 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.pngbin0 -> 762 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_frequency.pngbin0 -> 427 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.pngbin0 -> 526 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.pngbin0 -> 12342 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.pngbin0 -> 12342 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.pngbin0 -> 12342 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_uum.pngbin0 -> 334 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.pngbin0 -> 3126 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_water.pngbin0 -> 218 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/audio_out_active.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_charger.pngbin0 -> 284 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_crafting.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_discharge.pngbin0 -> 272 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_conductor.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_emitter.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/dirt_podzol_top.pngbin0 -> 823 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/fishtrap.pngbin0 -> 326 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_BOXES.pngbin0 -> 203 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_CROP.pngbin0 -> 318 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_bottom.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top_crafting.pngbin0 -> 263 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/0.pngbin0 -> 254 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/1.pngbin0 -> 250 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/10.pngbin0 -> 253 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/11.pngbin0 -> 248 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/12.pngbin0 -> 249 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/13.pngbin0 -> 249 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/14.pngbin0 -> 249 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/15.pngbin0 -> 244 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/16.pngbin0 -> 174 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/17.pngbin0 -> 211 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/18.pngbin0 -> 202 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/19.pngbin0 -> 206 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/2.pngbin0 -> 255 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/20.pngbin0 -> 206 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/21.pngbin0 -> 192 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/22.pngbin0 -> 199 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/23.pngbin0 -> 205 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/24.pngbin0 -> 202 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/25.pngbin0 -> 209 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/26.pngbin0 -> 183 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/27.pngbin0 -> 204 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/28.pngbin0 -> 202 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/29.pngbin0 -> 207 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/3.pngbin0 -> 248 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/30.pngbin0 -> 201 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/31.pngbin0 -> 181 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/32.pngbin0 -> 190 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/33.pngbin0 -> 224 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/34.pngbin0 -> 225 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/35.pngbin0 -> 223 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/36.pngbin0 -> 225 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/37.pngbin0 -> 233 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/38.pngbin0 -> 235 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/39.pngbin0 -> 225 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/4.pngbin0 -> 252 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/40.pngbin0 -> 225 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/41.pngbin0 -> 232 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/42.pngbin0 -> 225 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/43.pngbin0 -> 233 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/44.pngbin0 -> 235 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/45.pngbin0 -> 234 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/46.pngbin0 -> 234 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/47.pngbin0 -> 190 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/48.pngbin0 -> 513 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/49.pngbin0 -> 510 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/5.pngbin0 -> 253 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/50.pngbin0 -> 505 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/51.pngbin0 -> 503 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/52.pngbin0 -> 508 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/53.pngbin0 -> 507 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/54.pngbin0 -> 506 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/55.pngbin0 -> 506 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/56.pngbin0 -> 505 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/57.pngbin0 -> 504 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/58.pngbin0 -> 504 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/59.pngbin0 -> 503 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/6.pngbin0 -> 252 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/60.pngbin0 -> 504 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/61.pngbin0 -> 505 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/62.pngbin0 -> 525 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/63.pngbin0 -> 499 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/7.pngbin0 -> 248 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/8.pngbin0 -> 250 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/9.pngbin0 -> 252 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/0.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/1.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/10.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/100.pngbin0 -> 192 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/101.pngbin0 -> 195 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/102.pngbin0 -> 190 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/103.pngbin0 -> 197 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/104.pngbin0 -> 186 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/105.pngbin0 -> 189 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/106.pngbin0 -> 188 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/107.pngbin0 -> 191 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/108.pngbin0 -> 189 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/109.pngbin0 -> 184 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/11.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/110.pngbin0 -> 185 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/111.pngbin0 -> 182 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/112.pngbin0 -> 202 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/113.pngbin0 -> 222 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/114.pngbin0 -> 227 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/115.pngbin0 -> 240 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/116.pngbin0 -> 244 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/117.pngbin0 -> 238 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/118.pngbin0 -> 244 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/119.pngbin0 -> 242 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/12.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/120.pngbin0 -> 242 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/121.pngbin0 -> 245 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/122.pngbin0 -> 241 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/123.pngbin0 -> 244 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/124.pngbin0 -> 239 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/125.pngbin0 -> 230 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/126.pngbin0 -> 234 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/127.pngbin0 -> 199 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/128.pngbin0 -> 183 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/129.pngbin0 -> 215 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/13.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/130.pngbin0 -> 218 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/131.pngbin0 -> 233 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/132.pngbin0 -> 228 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/133.pngbin0 -> 232 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/134.pngbin0 -> 229 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/135.pngbin0 -> 227 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/136.pngbin0 -> 226 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/137.pngbin0 -> 230 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/138.pngbin0 -> 234 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/139.pngbin0 -> 220 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/14.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/140.pngbin0 -> 236 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/141.pngbin0 -> 224 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/142.pngbin0 -> 222 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/143.pngbin0 -> 183 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/15.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/16.pngbin0 -> 174 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/17.pngbin0 -> 171 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/18.pngbin0 -> 175 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/19.pngbin0 -> 166 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/2.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/20.pngbin0 -> 185 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/21.pngbin0 -> 179 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/22.pngbin0 -> 171 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/23.pngbin0 -> 185 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/24.pngbin0 -> 162 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/25.pngbin0 -> 175 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/26.pngbin0 -> 175 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/27.pngbin0 -> 176 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/28.pngbin0 -> 177 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/29.pngbin0 -> 181 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/3.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/30.pngbin0 -> 169 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/31.pngbin0 -> 177 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/32.pngbin0 -> 175 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/33.pngbin0 -> 171 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/34.pngbin0 -> 187 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/35.pngbin0 -> 174 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/36.pngbin0 -> 197 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/37.pngbin0 -> 185 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/38.pngbin0 -> 169 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/39.pngbin0 -> 194 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/4.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/40.pngbin0 -> 167 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/41.pngbin0 -> 185 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/42.pngbin0 -> 172 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/43.pngbin0 -> 169 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/44.pngbin0 -> 180 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/45.pngbin0 -> 167 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/46.pngbin0 -> 189 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/47.pngbin0 -> 182 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/48.pngbin0 -> 188 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/49.pngbin0 -> 210 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/5.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/50.pngbin0 -> 212 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/51.pngbin0 -> 212 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/52.pngbin0 -> 210 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/53.pngbin0 -> 193 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/54.pngbin0 -> 210 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/55.pngbin0 -> 205 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/56.pngbin0 -> 209 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/57.pngbin0 -> 206 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/58.pngbin0 -> 207 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/59.pngbin0 -> 212 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/6.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/60.pngbin0 -> 211 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/61.pngbin0 -> 206 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/62.pngbin0 -> 213 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/63.pngbin0 -> 181 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/64.pngbin0 -> 182 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/65.pngbin0 -> 184 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/66.pngbin0 -> 194 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/67.pngbin0 -> 197 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/68.pngbin0 -> 198 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/69.pngbin0 -> 206 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/7.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/70.pngbin0 -> 211 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/71.pngbin0 -> 210 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/72.pngbin0 -> 208 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/73.pngbin0 -> 221 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/74.pngbin0 -> 208 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/75.pngbin0 -> 199 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/76.pngbin0 -> 197 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/77.pngbin0 -> 199 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/78.pngbin0 -> 186 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/79.pngbin0 -> 183 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/8.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/80.pngbin0 -> 192 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/81.pngbin0 -> 196 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/82.pngbin0 -> 196 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/83.pngbin0 -> 198 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/84.pngbin0 -> 199 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/85.pngbin0 -> 201 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/86.pngbin0 -> 203 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/87.pngbin0 -> 203 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/88.pngbin0 -> 208 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/89.pngbin0 -> 202 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/9.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/90.pngbin0 -> 207 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/91.pngbin0 -> 203 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/92.pngbin0 -> 203 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/93.pngbin0 -> 201 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/94.pngbin0 -> 202 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/95.pngbin0 -> 190 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/96.pngbin0 -> 183 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/97.pngbin0 -> 190 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/98.pngbin0 -> 188 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/99.pngbin0 -> 193 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/off.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/on.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/0.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/1.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/10.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/11.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/12.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/13.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/14.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/15.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/16.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/17.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/18.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/19.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/2.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/20.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/21.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/22.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/23.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/24.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/25.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/26.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/27.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/28.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/29.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/3.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/30.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/31.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/4.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/5.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/6.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/7.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/8.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/9.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine_dimensional.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/log_acacia_top.pngbin0 -> 603 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_bottom.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top.pngbin0 -> 531 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor.pngbin0 -> 258 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2.pngbin0 -> 233 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.pngbin0 -> 395 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.pngbin0 -> 427 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.pngbin0 -> 517 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.pngbin0 -> 517 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.pngbin0 -> 1178 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_sides.pngbin0 -> 379 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_top.pngbin0 -> 373 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_sides.pngbin0 -> 375 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_top.pngbin0 -> 375 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/blockBlock.pngbin0 -> 424 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/blockFrameGt.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/blockMFEffect.pngbin0 -> 205 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/blockStaballoy.pngbin0 -> 942 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/blockStone.pngbin0 -> 223 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/CyberPanel.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalFunnel.pngbin0 -> 378 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalGrate.pngbin0 -> 333 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalPanel.pngbin0 -> 318 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet.pngbin0 -> 298 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet2.pngbin0 -> 318 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet8.pngbin0 -> 834 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet9.pngbin0 -> 941 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone1.pngbin0 -> 900 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone2.pngbin0 -> 997 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone3.pngbin0 -> 1138 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone4.pngbin0 -> 1175 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone5.pngbin0 -> 1276 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian1.pngbin0 -> 656 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian2.pngbin0 -> 757 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian3.pngbin0 -> 801 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian4.pngbin0 -> 814 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian5.pngbin0 -> 787 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian_invert.pngbin0 -> 770 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.1.pngbin0 -> 220 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.2.pngbin0 -> 399 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.3.pngbin0 -> 572 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.4.pngbin0 -> 534 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.5.pngbin0 -> 661 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.pngbin0 -> 2943 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.pngbin0 -> 1911 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png.mcmeta45
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.pngbin0 -> 3595 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.pngbin0 -> 2001 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png.mcmeta45
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.pngbin0 -> 3210 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.pngbin0 -> 3691 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png.mcmeta45
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.pngbin0 -> 3601 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.pngbin0 -> 2038 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png.mcmeta45
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.pngbin0 -> 1911 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png.mcmeta45
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.pngbin0 -> 2001 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png.mcmeta45
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.pngbin0 -> 9232 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.pngbin0 -> 7019 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.still.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrofluoricacid.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrogenchloride.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.pngbin0 -> 3454 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.lithiumhydroxide.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.pngbin0 -> 1558 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png.mcmeta45
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.pngbin0 -> 1461 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.pyrotheum.png.mcmeta45
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurdioxide.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuricapatite.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuriclithium.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurousacid.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.thoriumtetrafluoride.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumhexafluoride.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumtetrafluoride.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.pngbin0 -> 13281 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png.mcmeta38
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.pngbin0 -> 13886 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_1.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_2.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_3.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_4.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_5.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_6.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_7.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_8.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_9.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_1.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_2.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_3.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_4.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_5.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_6.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_7.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_8.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_9.PNG.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_1.pngbin0 -> 486 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_10.pngbin0 -> 491 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_11.pngbin0 -> 508 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_12.pngbin0 -> 494 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_2.pngbin0 -> 504 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_3.pngbin0 -> 463 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_4.pngbin0 -> 460 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_5.pngbin0 -> 478 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_6.pngbin0 -> 473 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_7.pngbin0 -> 429 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_8.pngbin0 -> 531 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_9.pngbin0 -> 486 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.pngbin0 -> 1784 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.pngbin0 -> 1921 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.pngbin0 -> 2065 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.pngbin0 -> 2074 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.pngbin0 -> 2144 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.pngbin0 -> 2219 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.pngbin0 -> 1911 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.pngbin0 -> 2183 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.pngbin0 -> 1999 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.pngbin0 -> 2094 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.pngbin0 -> 1601 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.pngbin0 -> 2024 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER1.pngbin0 -> 647 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER2.pngbin0 -> 541 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER3.pngbin0 -> 663 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER4.pngbin0 -> 533 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER5.pngbin0 -> 271 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER6.pngbin0 -> 526 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER7.pngbin0 -> 665 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER8.pngbin0 -> 528 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER9.pngbin0 -> 625 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.pngbin0 -> 748 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.pngbin0 -> 766 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.pngbin0 -> 849 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.pdnbin0 -> 5038 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.pngbin0 -> 897 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.pngbin0 -> 464 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.pngbin0 -> 971 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.pngbin0 -> 768 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.pngbin0 -> 757 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.pngbin0 -> 747 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE1.pngbin0 -> 515 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE2.pngbin0 -> 507 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE3.pngbin0 -> 539 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE4.pngbin0 -> 546 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE5.pngbin0 -> 332 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE6.pngbin0 -> 530 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE7.pngbin0 -> 546 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE8.pngbin0 -> 511 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE9.pngbin0 -> 509 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.pngbin0 -> 670 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.pngbin0 -> 863 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.pngbin0 -> 687 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.pngbin0 -> 944 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.pngbin0 -> 880 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.pngbin0 -> 955 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.pngbin0 -> 696 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.pngbin0 -> 866 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.pngbin0 -> 657 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_3.pngbin0 -> 525 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.pngbin0 -> 1601 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_II.pngbin0 -> 517 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.pngbin0 -> 5273 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_HYPER.pngbin0 -> 456 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_ULTRA.pngbin0 -> 505 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_GENERIC.pngbin0 -> 651 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_PIPE_GENERIC.pngbin0 -> 539 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.pngbin0 -> 1371 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_DATA_ORB.pngbin0 -> 501 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_MULTI_BUFFER.pngbin0 -> 455 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.pngbin0 -> 724 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.pngbin0 -> 733 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.pngbin0 -> 533 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.pngbin0 -> 557 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.pngbin0 -> 1652 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MUFFLER_ADV.pngbin0 -> 754 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.pngbin0 -> 878 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE.pngbin0 -> 278 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.pngbin0 -> 565 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.pngbin0 -> 969 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.pngbin0 -> 650 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.pngbin0 -> 1079 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.pngbin0 -> 890 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.pngbin0 -> 1151 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.pngbin0 -> 628 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.pngbin0 -> 1009 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.pngbin0 -> 616 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png.mcmeta3
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL1.pngbin0 -> 342 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL2.pngbin0 -> 461 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL3.pngbin0 -> 383 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL4.pngbin0 -> 485 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL5.pngbin0 -> 413 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL6.pngbin0 -> 486 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL7.pngbin0 -> 392 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL8.pngbin0 -> 456 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL9.pngbin0 -> 364 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_EV.pngbin0 -> 2035 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_HV.pngbin0 -> 2048 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_IV.pngbin0 -> 2039 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LV.pngbin0 -> 1887 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LuV.pngbin0 -> 1929 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MAX.pngbin0 -> 2055 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MV.pngbin0 -> 2060 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ULV.pngbin0 -> 1952 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_UV.pngbin0 -> 2049 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ZPM.pngbin0 -> 2112 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.pngbin0 -> 1156 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.pngbin0 -> 2174 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_A.pngbin0 -> 533 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_B.pngbin0 -> 569 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_C.pngbin0 -> 447 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_D.pngbin0 -> 448 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_F.pngbin0 -> 453 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_G.pngbin0 -> 1220 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_H.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_I.pngbin0 -> 493 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.pngbin0 -> 2503 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png.mcmeta6
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_A.pngbin0 -> 532 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_B.pngbin0 -> 367 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_A.pngbin0 -> 266 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_B.pngbin0 -> 285 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_C.pngbin0 -> 312 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_A.pngbin0 -> 513 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_B.pngbin0 -> 474 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_C.pngbin0 -> 469 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_D.pngbin0 -> 360 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_H.pngbin0 -> 668 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox1.pngbin0 -> 562 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox2.pngbin0 -> 721 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox3.pngbin0 -> 776 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox4.pngbin0 -> 781 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox5.pngbin0 -> 794 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox6.pngbin0 -> 779 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/redstone/redstone_meter/top.pngbin0 -> 822 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/rendering/ForceField.pngbin0 -> 3676 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_1.pngbin0 -> 532 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_2.pngbin0 -> 552 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_3.pngbin0 -> 535 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_4.pngbin0 -> 545 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_5.pngbin0 -> 722 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_6.pngbin0 -> 725 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_7.pngbin0 -> 716 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_8.pngbin0 -> 730 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine.pngbin0 -> 688 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine_opaque.pngbin0 -> 687 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest.pngbin0 -> 455 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest_opaque.pngbin0 -> 457 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine.pngbin0 -> 300 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine_top.pngbin0 -> 572 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest.pngbin0 -> 579 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest_top.pngbin0 -> 580 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_pine.pngbin0 -> 432 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_rainforest.pngbin0 -> 372 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/blocks/workbench.pngbin0 -> 410 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/entity/golemStaballoy.pngbin0 -> 5433 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/entity/sickBlaze.pngbin0 -> 1221 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/enviroment/snow.pngbin0 -> 849 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/CircuitProgrammer.pngbin0 -> 2857 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/FishTrap.pngbin0 -> 882 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/PestKiller.pngbin0 -> 1833 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/ProjectTable.pngbin0 -> 1124 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/SuperJukebox.pngbin0 -> 5198 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/VolumetricFlaskSetter.pngbin0 -> 2482 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/background/yellow.pngbin0 -> 182 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/button/standard_bronze.pngbin0 -> 120 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/nei/decayables.pngbin0 -> 2623 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/nei/widgets.pngbin0 -> 1876 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/active_state.pngbin0 -> 183 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/automation.pngbin0 -> 176 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom.pngbin0 -> 163 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom_gray.pngbin0 -> 164 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/change_mode.pngbin0 -> 168 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/east.pngbin0 -> 149 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/east_gray.pngbin0 -> 150 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush.pngbin0 -> 198 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush_bronze.pngbin0 -> 200 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_mode.pngbin0 -> 610 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_toggle.pngbin0 -> 732 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/lock.pngbin0 -> 382 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/north.pngbin0 -> 179 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/north_gray.pngbin0 -> 179 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/plus_minus.pngbin0 -> 196 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/south.pngbin0 -> 180 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/south_gray.pngbin0 -> 179 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_green.pngbin0 -> 188 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_red.pngbin0 -> 192 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/top.pngbin0 -> 141 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/top_gray.pngbin0 -> 142 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/west.pngbin0 -> 171 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/west_gray.pngbin0 -> 170 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow.pngbin0 -> 150 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_4.pngbin0 -> 188 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_blue.pngbin0 -> 169 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_bronze.pngbin0 -> 148 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_cyan.pngbin0 -> 185 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_green.pngbin0 -> 193 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_magenta.pngbin0 -> 160 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_red.pngbin0 -> 189 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_yellow.pngbin0 -> 139 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/blue.pngbin0 -> 136 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/canister_dark.pngbin0 -> 167 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/chest.pngbin0 -> 158 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/coal.pngbin0 -> 159 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output.pngbin0 -> 176 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output_bronze.pngbin0 -> 178 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/cyan.pngbin0 -> 135 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/electric_tool.pngbin0 -> 198 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/fertilizer.pngbin0 -> 336 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/green.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/ingot.pngbin0 -> 189 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/magenta.pngbin0 -> 146 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/page_printed_bronze.pngbin0 -> 161 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park.pngbin0 -> 152 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park_bronze.pngbin0 -> 149 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/red.pngbin0 -> 142 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/turbine.pngbin0 -> 373 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/weed_ex.pngbin0 -> 315 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/yellow.pngbin0 -> 137 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/picture/abs_non_alloy_recipes.pngbin0 -> 452 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/picture/arrow_white_down.pngbin0 -> 126 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/picture/electricity_error.pngbin0 -> 83 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/picture/electricity_fine.pngbin0 -> 84 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/picture/energy_frame.pngbin0 -> 123 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/picture/redstone_circuit_screen.pngbin0 -> 262 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/picture/workbench_circle.pngbin0 -> 206 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/arrow_2.pngbin0 -> 305 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/boiler_empty.pngbin0 -> 162 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/fluid_reactor.pngbin0 -> 551 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/fuel.pngbin0 -> 386 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/pss_energy.pngbin0 -> 132 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/slot/blue.pngbin0 -> 112 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/slot/cyan.pngbin0 -> 112 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/slot/green.pngbin0 -> 112 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/slot/item_yellow.pngbin0 -> 111 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/slot/magenta.pngbin0 -> 112 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/slot/red.pngbin0 -> 112 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/slot/yellow.pngbin0 -> 112 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/tab/title_angular_yellow.pngbin0 -> 129 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/tab/title_dark_yellow.pngbin0 -> 148 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/gui/tab/title_yellow.pngbin0 -> 144 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/0.pngbin0 -> 501 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/1.pngbin0 -> 501 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/10.pngbin0 -> 358 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/100.pngbin0 -> 2112 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.pngbin0 -> 9891 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png.mcmeta1
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/106.pngbin0 -> 300 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/107.pngbin0 -> 304 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/108.pngbin0 -> 299 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/109.pngbin0 -> 297 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/11.pngbin0 -> 358 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/110.pngbin0 -> 393 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/111.pngbin0 -> 345 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/112.pngbin0 -> 341 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/113.pngbin0 -> 337 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/114.pngbin0 -> 396 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/115.pngbin0 -> 428 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/12.pngbin0 -> 411 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/13.pngbin0 -> 411 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/14.pngbin0 -> 411 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/140.pngbin0 -> 660 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/141.pngbin0 -> 655 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/142.pngbin0 -> 627 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/143.pngbin0 -> 675 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/144.pngbin0 -> 645 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/145.pngbin0 -> 651 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/146.pngbin0 -> 630 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/147.pngbin0 -> 648 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/148.pngbin0 -> 645 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/149.pngbin0 -> 659 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/15.pngbin0 -> 411 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/150.pngbin0 -> 667 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/151.pngbin0 -> 335 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/152.pngbin0 -> 296 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/16.pngbin0 -> 461 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/160.pngbin0 -> 459 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/161.pngbin0 -> 455 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/17.pngbin0 -> 461 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/18.pngbin0 -> 461 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/19.pngbin0 -> 461 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/2.pngbin0 -> 501 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/20.pngbin0 -> 617 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/200.pngbin0 -> 231 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/201.pngbin0 -> 292 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/202.pngbin0 -> 321 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/203.pngbin0 -> 319 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/204.pngbin0 -> 315 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/205.pngbin0 -> 348 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/206.pngbin0 -> 364 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/207.pngbin0 -> 375 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/208.pngbin0 -> 338 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/21.pngbin0 -> 617 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/210.pngbin0 -> 223 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/211.pngbin0 -> 223 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/213.pngbin0 -> 435 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/214.pngbin0 -> 461 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/215.pngbin0 -> 273 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/216.pngbin0 -> 441 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/217.pngbin0 -> 450 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/218.pngbin0 -> 508 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/219.pngbin0 -> 277 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/22.pngbin0 -> 617 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/220.pngbin0 -> 331 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/221.pngbin0 -> 513 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/23.pngbin0 -> 617 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/24.pngbin0 -> 545 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/25.pngbin0 -> 545 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/26.pngbin0 -> 545 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/27.pngbin0 -> 545 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/28.pngbin0 -> 482 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/29.pngbin0 -> 482 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/3.pngbin0 -> 501 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/30.pngbin0 -> 482 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/31.pngbin0 -> 482 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/32.pngbin0 -> 501 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/33.pngbin0 -> 415 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/34.pngbin0 -> 358 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/35.pngbin0 -> 411 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/36.pngbin0 -> 461 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/37.pngbin0 -> 617 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/38.pngbin0 -> 545 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/39.pngbin0 -> 482 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/4.pngbin0 -> 415 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/40.pngbin0 -> 788 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/41.pngbin0 -> 750 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/42.pngbin0 -> 834 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/43.pngbin0 -> 936 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/44.pngbin0 -> 764 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/5.pngbin0 -> 415 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50.pngbin0 -> 499 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/1.pngbin0 -> 480 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/2.pngbin0 -> 490 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/3.pngbin0 -> 485 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/4.pngbin0 -> 490 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/5.pngbin0 -> 488 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/6.pngbin0 -> 498 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/7.pngbin0 -> 491 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/8.pngbin0 -> 485 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52.pngbin0 -> 499 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/1.pngbin0 -> 480 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/2.pngbin0 -> 490 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/3.pngbin0 -> 485 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/4.pngbin0 -> 490 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/5.pngbin0 -> 488 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/6.pngbin0 -> 498 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/7.pngbin0 -> 491 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/8.pngbin0 -> 485 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54.pngbin0 -> 499 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/1.pngbin0 -> 480 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/2.pngbin0 -> 490 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/3.pngbin0 -> 485 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/4.pngbin0 -> 490 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/5.pngbin0 -> 488 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/6.pngbin0 -> 498 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/7.pngbin0 -> 491 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/8.pngbin0 -> 485 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/55.pngbin0 -> 24039 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/6.pngbin0 -> 415 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/61.pngbin0 -> 352 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/62.pngbin0 -> 352 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/63.pngbin0 -> 352 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/64.pngbin0 -> 358 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/66.pngbin0 -> 392 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/68.pngbin0 -> 390 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/7.pngbin0 -> 415 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/70.pngbin0 -> 398 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/700.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/71.pngbin0 -> 304 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/72.pngbin0 -> 314 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/720.pngbin0 -> 455 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/73.pngbin0 -> 318 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/74.pngbin0 -> 319 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/75.pngbin0 -> 323 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/751.pngbin0 -> 317 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/752.pngbin0 -> 447 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/753.pngbin0 -> 462 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/754.pngbin0 -> 459 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/755.pngbin0 -> 463 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/756.pngbin0 -> 466 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/758.pngbin0 -> 477 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/759.pngbin0 -> 444 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/76.pngbin0 -> 321 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/77.pngbin0 -> 324 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/78.pngbin0 -> 324 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/79.pngbin0 -> 314 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/8.pngbin0 -> 358 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/9.pngbin0 -> 358 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/0.pngbin0 -> 1153 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/1.pngbin0 -> 1142 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/2.pngbin0 -> 1139 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/3.pngbin0 -> 1143 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/baubles/itemFireProtectGlovesBetter.pngbin0 -> 1326 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae.pngbin0 -> 1122 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae_Overlay.pngbin0 -> 1045 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/0.pngbin0 -> 287 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/1.pngbin0 -> 286 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/10.pngbin0 -> 288 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/11.pngbin0 -> 288 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/12.pngbin0 -> 287 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/13.pngbin0 -> 288 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/14.pngbin0 -> 288 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/15.pngbin0 -> 287 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/16.pngbin0 -> 287 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/17.pngbin0 -> 288 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/18.pngbin0 -> 287 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/19.pngbin0 -> 288 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/2.pngbin0 -> 286 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/20.pngbin0 -> 287 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/21.pngbin0 -> 287 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/22.pngbin0 -> 286 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/23.pngbin0 -> 287 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/24.pngbin0 -> 290 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/3.pngbin0 -> 287 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/4.pngbin0 -> 287 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/5.pngbin0 -> 286 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/6.pngbin0 -> 286 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/7.pngbin0 -> 287 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/8.pngbin0 -> 286 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/9.pngbin0 -> 286 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/0.pngbin0 -> 605 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/1.pngbin0 -> 627 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/10.pngbin0 -> 516 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/11.pngbin0 -> 392 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/12.pngbin0 -> 704 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/13.pngbin0 -> 373 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/14.pngbin0 -> 427 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/15.pngbin0 -> 376 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/16.pngbin0 -> 397 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/17.pngbin0 -> 306 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/18.pngbin0 -> 442 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/19.pngbin0 -> 347 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/2.pngbin0 -> 633 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/20.pngbin0 -> 364 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/21.pngbin0 -> 280 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/22.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/23.pngbin0 -> 701 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/24.pngbin0 -> 357 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/25.pngbin0 -> 648 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/3.pngbin0 -> 646 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/4.pngbin0 -> 622 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/5.pngbin0 -> 490 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/6.pngbin0 -> 455 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/7.pngbin0 -> 452 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/8.pngbin0 -> 654 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/9.pngbin0 -> 277 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.pngbin0 -> 602 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.pngbin0 -> 715 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.pngbin0 -> 2141 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png.mcmeta23
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCharcoal.pngbin0 -> 354 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCoke.pngbin0 -> 379 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemCoalCoke.pngbin0 -> 282 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCharcoal.pngbin0 -> 387 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCoke.pngbin0 -> 397 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/1.pngbin0 -> 1327 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/2.pngbin0 -> 1335 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/3.pngbin0 -> 1340 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/4.pngbin0 -> 1306 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/5.pngbin0 -> 1302 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/6.pngbin0 -> 1338 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/7.pngbin0 -> 1317 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/8.pngbin0 -> 1402 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/9.pngbin0 -> 1183 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/0.pngbin0 -> 489 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/1.pngbin0 -> 451 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/10.pngbin0 -> 426 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/11.pngbin0 -> 408 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/12.pngbin0 -> 439 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/13.pngbin0 -> 439 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/14.pngbin0 -> 422 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/15.pngbin0 -> 443 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/2.pngbin0 -> 449 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/3.pngbin0 -> 463 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/4.pngbin0 -> 465 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/5.pngbin0 -> 462 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/6.pngbin0 -> 477 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/7.pngbin0 -> 461 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/8.pngbin0 -> 474 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/covers/9.pngbin0 -> 482 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_0.pngbin0 -> 309 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_1.pngbin0 -> 302 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_2.pngbin0 -> 288 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_3.pngbin0 -> 286 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_0.pngbin0 -> 461 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_1.pngbin0 -> 459 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_2.pngbin0 -> 386 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_3.pngbin0 -> 388 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/dust.pngbin0 -> 302 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/dustSmall.pngbin0 -> 264 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/dustTiny.pngbin0 -> 219 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/0.pngbin0 -> 565 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/1.pngbin0 -> 548 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/2.pngbin0 -> 455 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/3.pngbin0 -> 556 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/4.pngbin0 -> 453 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/5.pngbin0 -> 447 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/6.pngbin0 -> 402 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/7.pngbin0 -> 562 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/8.pngbin0 -> 447 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/frameAccelerated.pngbin0 -> 412 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/frameArborists.pngbin0 -> 297 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/frameBusy.pngbin0 -> 412 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/frameDecaying.pngbin0 -> 449 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/frameMutagenic.pngbin0 -> 412 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/frameSlowing.pngbin0 -> 307 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/frameStabilizing.pngbin0 -> 449 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/frameUseless.pngbin0 -> 427 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER.pngbin0 -> 387 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_BUTCHER_KNIFE.pngbin0 -> 336 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_LIGHTER.pngbin0 -> 313 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS.pngbin0 -> 501 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/RENDERING_ERROR.pngbin0 -> 161 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/VOID.pngbin0 -> 357 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/ion/0.pngbin0 -> 112 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/ion/1.pngbin0 -> 146 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/ion/IonBase.pngbin0 -> 1789 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/item.empty.pngbin0 -> 179 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemAirFilter.pngbin0 -> 1469 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemAlkalusDisk.pngbin0 -> 424 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemBasicTurbine.pngbin0 -> 475 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemBlueprint.pngbin0 -> 782 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemBoilerChassis.pngbin0 -> 1821 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemBook.pngbin0 -> 303 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemBufferCore.pngbin0 -> 1329 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemCell.pngbin0 -> 362 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemCellPlasma.pngbin0 -> 290 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemCellPlasma_Overlay.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemCell_Overlay.pngbin0 -> 297 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemCircuitLFTR.pngbin0 -> 181 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoil.pngbin0 -> 653 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoilWire.pngbin0 -> 735 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemEnergeticRotorBlade.pngbin0 -> 541 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemEnergeticShaft.pngbin0 -> 444 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemGear.pngbin0 -> 455 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemHatTinFoil.pngbin0 -> 261 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemIngot.pngbin0 -> 390 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemIngotBatteryAlloy.pngbin0 -> 420 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemIngotHot.pngbin0 -> 423 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemIridiumRotorBlade.pngbin0 -> 560 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemIridiumShaft.pngbin0 -> 447 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemLavaFilter.pngbin0 -> 531 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemMagnaliumRotorBlade.pngbin0 -> 560 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemMagnaliumShaft.pngbin0 -> 447 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemPlate.pngbin0 -> 278 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemShard.pngbin0 -> 620 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemShovel.pngbin0 -> 154 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelRotorBlade.pngbin0 -> 544 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelShaft.pngbin0 -> 326 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemUltimetRotorBlade.pngbin0 -> 557 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemUltimetShaft.pngbin0 -> 447 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemVibrantRotorBlade.pngbin0 -> 530 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/itemVibrantShaft.pngbin0 -> 447 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/magicfeather.pngbin0 -> 324 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.pngbin0 -> 914 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.pngbin0 -> 1303 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.pngbin0 -> 1202 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png.mcmeta5
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/material/RodBlizz.pngbin0 -> 439 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/0.pngbin0 -> 1672 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/1.pngbin0 -> 1669 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/10.pngbin0 -> 1644 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/11.pngbin0 -> 1678 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/12.pngbin0 -> 1658 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/13.pngbin0 -> 1668 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/14.pngbin0 -> 1676 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/15.pngbin0 -> 1675 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/16.pngbin0 -> 1679 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/17.pngbin0 -> 1674 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/18.pngbin0 -> 1674 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/19.pngbin0 -> 1685 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/2.pngbin0 -> 1683 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/20.pngbin0 -> 1663 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/21.pngbin0 -> 1653 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/22.pngbin0 -> 1665 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/23.pngbin0 -> 1680 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/24.pngbin0 -> 1673 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/3.pngbin0 -> 1681 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/4.pngbin0 -> 1682 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/5.pngbin0 -> 1675 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/6.pngbin0 -> 1674 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/7.pngbin0 -> 1667 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/8.pngbin0 -> 1656 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/9.pngbin0 -> 1663 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/0.pngbin0 -> 1217 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/1.pngbin0 -> 1493 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/10.pngbin0 -> 1616 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/11.pngbin0 -> 1450 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/12.pngbin0 -> 1635 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/13.pngbin0 -> 1601 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/14.pngbin0 -> 1522 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/15.pngbin0 -> 1710 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/16.pngbin0 -> 1647 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/17.pngbin0 -> 1569 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/18.pngbin0 -> 1451 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/19.pngbin0 -> 1404 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/2.pngbin0 -> 1561 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/20.pngbin0 -> 1517 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/21.pngbin0 -> 1498 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/22.pngbin0 -> 1554 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/23.pngbin0 -> 1196 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/24.pngbin0 -> 1323 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/3.pngbin0 -> 1465 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/4.pngbin0 -> 1501 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/5.pngbin0 -> 1487 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/6.pngbin0 -> 1512 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/7.pngbin0 -> 1485 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/8.pngbin0 -> 1595 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/9.pngbin0 -> 1567 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/personalCloakingDevice.pngbin0 -> 245 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled.pngbin0 -> 595 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled_OVERLAY.pngbin0 -> 437 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/research/note.pngbin0 -> 348 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/0.pngbin0 -> 510 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/1.pngbin0 -> 496 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/10.pngbin0 -> 512 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/11.pngbin0 -> 504 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/12.pngbin0 -> 516 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/13.pngbin0 -> 517 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/14.pngbin0 -> 512 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/15.pngbin0 -> 515 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/16.pngbin0 -> 514 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/17.pngbin0 -> 510 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/18.pngbin0 -> 515 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/19.pngbin0 -> 515 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/2.pngbin0 -> 515 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/20.pngbin0 -> 521 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/21.pngbin0 -> 521 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/22.pngbin0 -> 528 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/23.pngbin0 -> 527 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/24.pngbin0 -> 527 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/3.pngbin0 -> 511 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/4.pngbin0 -> 512 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/5.pngbin0 -> 511 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/6.pngbin0 -> 516 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/7.pngbin0 -> 503 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/8.pngbin0 -> 515 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/9.pngbin0 -> 512 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/0.pngbin0 -> 441 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/1.pngbin0 -> 440 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/10.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/11.pngbin0 -> 339 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/12.pngbin0 -> 320 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/13.pngbin0 -> 432 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/14.pngbin0 -> 451 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/15.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/16.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/17.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/18.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/19.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/2.pngbin0 -> 447 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/20.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/21.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/22.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/23.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/24.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/25.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/26.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/27.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/28.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/29.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/3.pngbin0 -> 448 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/30.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/31.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/32.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/33.pngbin0 -> 524 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/4.pngbin0 -> 434 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/5.pngbin0 -> 440 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/6.pngbin0 -> 429 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/7.pngbin0 -> 376 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/8.pngbin0 -> 492 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/9.pngbin0 -> 340 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/0.pngbin0 -> 243 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/1.pngbin0 -> 243 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/2.pngbin0 -> 243 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/3.pngbin0 -> 243 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/4.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/5.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/6.pngbin0 -> 328 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/spawn_egg.pngbin0 -> 270 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/spawn_egg_overlay.pngbin0 -> 402 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/token/0.pngbin0 -> 3345 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/token/1.pngbin0 -> 3688 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/token/2.pngbin0 -> 3698 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/token/3.pngbin0 -> 3758 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/items/token/4.pngbin0 -> 3719 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/models/TinFoil.pngbin0 -> 536 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/A.pngbin0 -> 220 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/B.pngbin0 -> 810 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/C.pngbin0 -> 810 bytes
-rw-r--r--gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/D.pngbin0 -> 817 bytes
-rw-r--r--gtpp/src/main/resources/assets/spiceoflife/lang/de_DE.lang2
-rw-r--r--gtpp/src/main/resources/assets/spiceoflife/lang/en_US.lang2
-rw-r--r--gtpp/src/main/resources/assets/spiceoflife/lang/es_ES.lang2
-rw-r--r--gtpp/src/main/resources/assets/spiceoflife/lang/fr_FR.lang2
-rw-r--r--gtpp/src/main/resources/assets/spiceoflife/lang/it_IT.lang2
-rw-r--r--gtpp/src/main/resources/assets/spiceoflife/lang/ko_KR.lang2
-rw-r--r--gtpp/src/main/resources/assets/spiceoflife/lang/ru_RU.lang2
-rw-r--r--gtpp/src/main/resources/assets/spiceoflife/lang/zh_CN.lang2
-rw-r--r--gtpp/src/main/resources/assets/spiceoflife/textures/items/foodcrate.pngbin0 -> 365 bytes
-rw-r--r--gtpp/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_empty.pngbin0 -> 355 bytes
-rw-r--r--gtpp/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_full.pngbin0 -> 509 bytes
-rw-r--r--gtpp/src/main/resources/assets/stevescarts/lang/en_US.lang1
-rw-r--r--gtpp/src/main/resources/assets/stevescarts/lang/zh_CN.lang1
-rw-r--r--gtpp/src/main/resources/assets/stevescarts/textures/items/crop_exotic_seeds_icon.pngbin0 -> 540 bytes
-rw-r--r--gtpp/src/main/resources/mcmod.info37
-rw-r--r--gtpp/wip/1.pngbin0 -> 214 bytes
-rw-r--r--gtpp/wip/10.pngbin0 -> 346 bytes
-rw-r--r--gtpp/wip/11.pngbin0 -> 316 bytes
-rw-r--r--gtpp/wip/12.pngbin0 -> 219 bytes
-rw-r--r--gtpp/wip/13.pngbin0 -> 261 bytes
-rw-r--r--gtpp/wip/14.pngbin0 -> 339 bytes
-rw-r--r--gtpp/wip/15.pngbin0 -> 387 bytes
-rw-r--r--gtpp/wip/16.pngbin0 -> 191 bytes
-rw-r--r--gtpp/wip/17.pngbin0 -> 382 bytes
-rw-r--r--gtpp/wip/18.pngbin0 -> 283 bytes
-rw-r--r--gtpp/wip/19.pngbin0 -> 341 bytes
-rw-r--r--gtpp/wip/2.pngbin0 -> 197 bytes
-rw-r--r--gtpp/wip/20.pngbin0 -> 277 bytes
-rw-r--r--gtpp/wip/21.pngbin0 -> 331 bytes
-rw-r--r--gtpp/wip/22.pngbin0 -> 464 bytes
-rw-r--r--gtpp/wip/23.pngbin0 -> 213 bytes
-rw-r--r--gtpp/wip/24.pngbin0 -> 228 bytes
-rw-r--r--gtpp/wip/25.pngbin0 -> 774 bytes
-rw-r--r--gtpp/wip/26_off.pngbin0 -> 222 bytes
-rw-r--r--gtpp/wip/26_on.pngbin0 -> 325 bytes
-rw-r--r--gtpp/wip/27_off.pngbin0 -> 300 bytes
-rw-r--r--gtpp/wip/27_on.pngbin0 -> 234 bytes
-rw-r--r--gtpp/wip/28_off.pngbin0 -> 332 bytes
-rw-r--r--gtpp/wip/28_on.pngbin0 -> 325 bytes
-rw-r--r--gtpp/wip/29_off.pngbin0 -> 363 bytes
-rw-r--r--gtpp/wip/29_on.pngbin0 -> 386 bytes
-rw-r--r--gtpp/wip/3.pngbin0 -> 252 bytes
-rw-r--r--gtpp/wip/4.pngbin0 -> 351 bytes
-rw-r--r--gtpp/wip/5.pngbin0 -> 344 bytes
-rw-r--r--gtpp/wip/6.pngbin0 -> 912 bytes
-rw-r--r--gtpp/wip/7.pngbin0 -> 376 bytes
-rw-r--r--gtpp/wip/8.pngbin0 -> 355 bytes
-rw-r--r--gtpp/wip/9.pngbin0 -> 222 bytes
-rw-r--r--gtpp/wip/switch_1.pngbin0 -> 356 bytes
-rw-r--r--gtpp/wip/switch_2.pngbin0 -> 365 bytes
-rw-r--r--gtpp/wip/switch_3.pngbin0 -> 459 bytes
-rw-r--r--gtpp/wip/switch_4.pngbin0 -> 523 bytes
-rwxr-xr-xmisc/find_trans.sh3
-rw-r--r--misc/vector/MACHINE_CASING_PIPE_POLYTETRAFLUOROETHYLENE.pngbin0 -> 476 bytes
-rw-r--r--misc/vector/bricked_blast_furnace_active.svg1290
-rw-r--r--misc/vector/bricked_blast_furnace_gui.svg175
-rw-r--r--misc/vector/bricked_blast_furnace_inactive.svg953
-rw-r--r--misc/vector/casing.chemically_inert.svg145
-rw-r--r--misc/vector/casing.pipe_polytetrafluoroethylene.svg538
-rw-r--r--misc/vector/chemistry.acids.svg3459
-rw-r--r--misc/vector/chemistry.misc.svg2838
-rw-r--r--misc/vector/chemistry.plastics.svg2070
-rw-r--r--misc/vector/crop_drop.rape.svg933
-rw-r--r--misc/vector/dense_bricks.svg1001
-rw-r--r--misc/vector/firebrick.svg156
-rw-r--r--misc/vector/item_distributor.svg231
-rw-r--r--misc/vector/recipe.distillation_tower.svg1259
-rw-r--r--misc/vector/recipe.nine_x_nine.svg189
-rw-r--r--misc/vector/recipe.twelve_x_twelve.svg186
-rw-r--r--repositories.gradle12
-rw-r--r--src/functionalTest/java/gregtech/test/GT5TestMod.java86
-rw-r--r--src/functionalTest/java/gregtech/test/GTParallelHelperTest.java122
-rw-r--r--src/functionalTest/java/gregtech/test/GTRecipeTest.java264
-rw-r--r--src/functionalTest/java/gregtech/test/mock/MockIVoidableMachine.java55
-rw-r--r--src/functionalTest/resources/mcmod.info15
-rw-r--r--src/main/java/gregtech/GT_Mod.java846
-rw-r--r--src/main/java/gregtech/api/GregTech_API.java1082
-rw-r--r--src/main/java/gregtech/api/damagesources/GT_DamageSources.java119
-rw-r--r--src/main/java/gregtech/api/enchants/Enchantment_EnderDamage.java72
-rw-r--r--src/main/java/gregtech/api/enchants/Enchantment_Hazmat.java56
-rw-r--r--src/main/java/gregtech/api/enchants/Enchantment_Radioactivity.java68
-rw-r--r--src/main/java/gregtech/api/enums/ConfigCategories.java65
-rw-r--r--src/main/java/gregtech/api/enums/Dyes.java126
-rw-r--r--src/main/java/gregtech/api/enums/Element.java341
-rw-r--r--src/main/java/gregtech/api/enums/FluidState.java17
-rw-r--r--src/main/java/gregtech/api/enums/GTNH_ExtraMaterials.java626
-rw-r--r--src/main/java/gregtech/api/enums/GTVoltageIndex.java22
-rw-r--r--src/main/java/gregtech/api/enums/GT_HatchElement.java112
-rw-r--r--src/main/java/gregtech/api/enums/GT_Values.java658
-rw-r--r--src/main/java/gregtech/api/enums/HeatingCoilLevel.java101
-rw-r--r--src/main/java/gregtech/api/enums/InventoryType.java7
-rw-r--r--src/main/java/gregtech/api/enums/ItemList.java2238
-rw-r--r--src/main/java/gregtech/api/enums/MachineType.java136
-rw-r--r--src/main/java/gregtech/api/enums/MaterialBuilder.java276
-rw-r--r--src/main/java/gregtech/api/enums/Materials.java3307
-rw-r--r--src/main/java/gregtech/api/enums/MaterialsBotania.java238
-rw-r--r--src/main/java/gregtech/api/enums/MaterialsKevlar.java604
-rw-r--r--src/main/java/gregtech/api/enums/MaterialsOreAlum.java80
-rw-r--r--src/main/java/gregtech/api/enums/MaterialsUEVplus.java600
-rw-r--r--src/main/java/gregtech/api/enums/MetaTileEntityIDs.java688
-rw-r--r--src/main/java/gregtech/api/enums/Mods.java387
-rw-r--r--src/main/java/gregtech/api/enums/OreDictNames.java77
-rw-r--r--src/main/java/gregtech/api/enums/OrePrefixes.java1417
-rw-r--r--src/main/java/gregtech/api/enums/ParticleFX.java53
-rw-r--r--src/main/java/gregtech/api/enums/SoundResource.java373
-rw-r--r--src/main/java/gregtech/api/enums/SteamVariant.java16
-rw-r--r--src/main/java/gregtech/api/enums/SubTag.java274
-rw-r--r--src/main/java/gregtech/api/enums/TC_Aspects.java112
-rw-r--r--src/main/java/gregtech/api/enums/TextureSet.java132
-rw-r--r--src/main/java/gregtech/api/enums/Textures.java1895
-rw-r--r--src/main/java/gregtech/api/enums/TickTime.java10
-rw-r--r--src/main/java/gregtech/api/enums/Tier.java500
-rw-r--r--src/main/java/gregtech/api/enums/TierEU.java40
-rw-r--r--src/main/java/gregtech/api/enums/ToolDictNames.java44
-rw-r--r--src/main/java/gregtech/api/enums/ToolModes.java18
-rw-r--r--src/main/java/gregtech/api/enums/VoidingMode.java112
-rw-r--r--src/main/java/gregtech/api/events/BlockScanningEvent.java47
-rw-r--r--src/main/java/gregtech/api/fluid/FluidTankGT.java485
-rw-r--r--src/main/java/gregtech/api/fluid/GT_FluidFactory.java90
-rw-r--r--src/main/java/gregtech/api/graphs/GenerateNodeMap.java202
-rw-r--r--src/main/java/gregtech/api/graphs/GenerateNodeMapPower.java104
-rw-r--r--src/main/java/gregtech/api/graphs/Lock.java38
-rw-r--r--src/main/java/gregtech/api/graphs/Node.java40
-rw-r--r--src/main/java/gregtech/api/graphs/NodeList.java22
-rw-r--r--src/main/java/gregtech/api/graphs/PowerNode.java17
-rw-r--r--src/main/java/gregtech/api/graphs/PowerNodes.java182
-rw-r--r--src/main/java/gregtech/api/graphs/consumers/ConsumerNode.java30
-rw-r--r--src/main/java/gregtech/api/graphs/consumers/EmptyPowerConsumer.java31
-rw-r--r--src/main/java/gregtech/api/graphs/consumers/NodeEnergyConnected.java21
-rw-r--r--src/main/java/gregtech/api/graphs/consumers/NodeEnergyReceiver.java68
-rw-r--r--src/main/java/gregtech/api/graphs/consumers/NodeEnergySink.java30
-rw-r--r--src/main/java/gregtech/api/graphs/consumers/NodeGTBaseMetaTile.java28
-rw-r--r--src/main/java/gregtech/api/graphs/paths/NodePath.java42
-rw-r--r--src/main/java/gregtech/api/graphs/paths/PowerNodePath.java153
-rw-r--r--src/main/java/gregtech/api/gui/GT_Container.java740
-rw-r--r--src/main/java/gregtech/api/gui/GT_ContainerMetaTile_Machine.java244
-rw-r--r--src/main/java/gregtech/api/gui/GT_Container_1by1.java30
-rw-r--r--src/main/java/gregtech/api/gui/GT_Container_2by2.java33
-rw-r--r--src/main/java/gregtech/api/gui/GT_Container_3by3.java38
-rw-r--r--src/main/java/gregtech/api/gui/GT_Container_4by4.java45
-rw-r--r--src/main/java/gregtech/api/gui/GT_Container_BasicTank.java138
-rw-r--r--src/main/java/gregtech/api/gui/GT_Container_MultiMachine.java39
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIColorOverride.java92
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIContainer.java99
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIContainerMetaTile_Machine.java271
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIContainer_1by1.java42
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIContainer_2by2.java42
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIContainer_3by3.java42
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIContainer_4by4.java42
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIContainer_BasicTank.java47
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIContainer_MultiMachine.java173
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUICover.java55
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIDialogSelectItem.java229
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIScreen.java327
-rw-r--r--src/main/java/gregtech/api/gui/GT_Slot_Armor.java30
-rw-r--r--src/main/java/gregtech/api/gui/GT_Slot_DataOrb.java19
-rw-r--r--src/main/java/gregtech/api/gui/GT_Slot_Holo.java77
-rw-r--r--src/main/java/gregtech/api/gui/GT_Slot_Output.java17
-rw-r--r--src/main/java/gregtech/api/gui/GT_Slot_Render.java24
-rw-r--r--src/main/java/gregtech/api/gui/GUIHost.java56
-rw-r--r--src/main/java/gregtech/api/gui/GUIProvider.java38
-rw-r--r--src/main/java/gregtech/api/gui/modularui/FallbackableSteamTexture.java89
-rw-r--r--src/main/java/gregtech/api/gui/modularui/GT_CoverUIBuildContext.java74
-rw-r--r--src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java188
-rw-r--r--src/main/java/gregtech/api/gui/modularui/GT_UITextures.java488
-rw-r--r--src/main/java/gregtech/api/gui/modularui/GUITextureSet.java156
-rw-r--r--src/main/java/gregtech/api/gui/modularui/IDataFollowerWidget.java50
-rw-r--r--src/main/java/gregtech/api/gui/modularui/SteamTexture.java62
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java82
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiCoverTabLine.java179
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java162
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiIcon.java157
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiIconButton.java114
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiIconCheckButton.java43
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiIntegerTextBox.java73
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiSlotTooltip.java24
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiSmartTooltip.java27
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiTab.java174
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiTabLine.java274
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiTooltip.java121
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiTooltipManager.java80
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_LockedWhileActiveButton.java90
-rw-r--r--src/main/java/gregtech/api/interfaces/IBlockContainer.java10
-rw-r--r--src/main/java/gregtech/api/interfaces/IBlockOnWalkOver.java9
-rw-r--r--src/main/java/gregtech/api/interfaces/IChunkLoader.java10
-rw-r--r--src/main/java/gregtech/api/interfaces/ICleanroom.java22
-rw-r--r--src/main/java/gregtech/api/interfaces/ICleanroomReceiver.java18
-rw-r--r--src/main/java/gregtech/api/interfaces/IColorModulationContainer.java6
-rw-r--r--src/main/java/gregtech/api/interfaces/ICondition.java116
-rw-r--r--src/main/java/gregtech/api/interfaces/IConfigurationCircuitSupport.java47
-rw-r--r--src/main/java/gregtech/api/interfaces/IDamagableItem.java8
-rw-r--r--src/main/java/gregtech/api/interfaces/IDebugableBlock.java24
-rw-r--r--src/main/java/gregtech/api/interfaces/IDescribable.java12
-rw-r--r--src/main/java/gregtech/api/interfaces/IDragAndDropSupport.java58
-rw-r--r--src/main/java/gregtech/api/interfaces/IFluidAccess.java26
-rw-r--r--src/main/java/gregtech/api/interfaces/IFoodStat.java37
-rw-r--r--src/main/java/gregtech/api/interfaces/IGT_ItemWithMaterialRenderer.java68
-rw-r--r--src/main/java/gregtech/api/interfaces/IGlobalWirelessEnergy.java98
-rw-r--r--src/main/java/gregtech/api/interfaces/IGuiIcon.java19
-rw-r--r--src/main/java/gregtech/api/interfaces/IGuiScreen.java45
-rw-r--r--src/main/java/gregtech/api/interfaces/IHasIndexedTexture.java17
-rw-r--r--src/main/java/gregtech/api/interfaces/IHatchElement.java198
-rw-r--r--src/main/java/gregtech/api/interfaces/IHeatingCoil.java20
-rw-r--r--src/main/java/gregtech/api/interfaces/IIconContainer.java48
-rw-r--r--src/main/java/gregtech/api/interfaces/IItemBehaviour.java47
-rw-r--r--src/main/java/gregtech/api/interfaces/IItemContainer.java40
-rw-r--r--src/main/java/gregtech/api/interfaces/IMaterialHandler.java6
-rw-r--r--src/main/java/gregtech/api/interfaces/INetworkUpdatableItem.java25
-rw-r--r--src/main/java/gregtech/api/interfaces/IOreRecipeRegistrator.java19
-rw-r--r--src/main/java/gregtech/api/interfaces/IProjectileItem.java29
-rw-r--r--src/main/java/gregtech/api/interfaces/IRecipeMap.java74
-rw-r--r--src/main/java/gregtech/api/interfaces/IRedstoneCircuitBlock.java69
-rw-r--r--src/main/java/gregtech/api/interfaces/ISecondaryDescribable.java30
-rw-r--r--src/main/java/gregtech/api/interfaces/ISubTagContainer.java21
-rw-r--r--src/main/java/gregtech/api/interfaces/ITexture.java55
-rw-r--r--src/main/java/gregtech/api/interfaces/ITextureBuilder.java109
-rw-r--r--src/main/java/gregtech/api/interfaces/IToolStats.java206
-rw-r--r--src/main/java/gregtech/api/interfaces/covers/IControlsWorkCover.java30
-rw-r--r--src/main/java/gregtech/api/interfaces/fluid/IFluidStore.java22
-rw-r--r--src/main/java/gregtech/api/interfaces/fluid/IGT_Fluid.java14
-rw-r--r--src/main/java/gregtech/api/interfaces/fluid/IGT_FluidBuilder.java96
-rw-r--r--src/main/java/gregtech/api/interfaces/fluid/IGT_RegisteredFluid.java60
-rw-r--r--src/main/java/gregtech/api/interfaces/internal/IBCTileEntity.java8
-rw-r--r--src/main/java/gregtech/api/interfaces/internal/IGT_CraftingRecipe.java8
-rw-r--r--src/main/java/gregtech/api/interfaces/internal/IGT_Mod.java50
-rw-r--r--src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java1069
-rw-r--r--src/main/java/gregtech/api/interfaces/internal/IIC2TileEntity.java14
-rw-r--r--src/main/java/gregtech/api/interfaces/internal/IThaumcraftCompat.java46
-rw-r--r--src/main/java/gregtech/api/interfaces/internal/IUETileEntity.java5
-rw-r--r--src/main/java/gregtech/api/interfaces/metatileentity/IConnectable.java34
-rw-r--r--src/main/java/gregtech/api/interfaces/metatileentity/IFluidLockable.java27
-rw-r--r--src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java539
-rw-r--r--src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityCable.java19
-rw-r--r--src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityItemPipe.java123
-rw-r--r--src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityPipe.java24
-rw-r--r--src/main/java/gregtech/api/interfaces/metatileentity/IMetricsExporter.java28
-rw-r--r--src/main/java/gregtech/api/interfaces/modularui/ControllerWithOptionalFeatures.java282
-rw-r--r--src/main/java/gregtech/api/interfaces/modularui/IAddGregtechLogo.java8
-rw-r--r--src/main/java/gregtech/api/interfaces/modularui/IAddInventorySlots.java15
-rw-r--r--src/main/java/gregtech/api/interfaces/modularui/IAddUIWidgets.java9
-rw-r--r--src/main/java/gregtech/api/interfaces/modularui/IBindPlayerInventoryUI.java9
-rw-r--r--src/main/java/gregtech/api/interfaces/modularui/IGetGUITextureSet.java10
-rw-r--r--src/main/java/gregtech/api/interfaces/modularui/IGetTitleColor.java11
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IAllSidedTexturedTileEntity.java24
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IBasicEnergyContainer.java110
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IColoredTileEntity.java27
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/ICoverable.java91
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IDebugableTileEntity.java18
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IDigitalChest.java33
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IEnergyConductor.java41
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java178
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IFibreConnected.java34
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IGTEnet.java19
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IGearEnergyTileEntity.java21
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IGregTechDeviceInformation.java22
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java206
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IGregtechWailaProvider.java21
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IHasInventory.java37
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IHasWorldObjectAndCoords.java190
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IIC2Enet.java17
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IMachineBlockUpdateable.java24
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IMachineProgress.java96
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IOverclockDescriptionProvider.java15
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IPipeRenderedTileEntity.java18
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IRecipeLockable.java31
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IRedstoneEmitter.java52
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IRedstoneReceiver.java33
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IRedstoneTileEntity.java17
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/ITexturedTileEntity.java14
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/ITurnable.java46
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IUpgradableMachine.java42
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IVoidable.java89
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/IWirelessEnergyHatchInformation.java17
-rw-r--r--src/main/java/gregtech/api/interfaces/tileentity/RecipeMapWorkable.java49
-rw-r--r--src/main/java/gregtech/api/items/GT_Block_LongDistancePipe.java125
-rw-r--r--src/main/java/gregtech/api/items/GT_BreederCell_Item.java147
-rw-r--r--src/main/java/gregtech/api/items/GT_CoolantCellIC_Item.java67
-rw-r--r--src/main/java/gregtech/api/items/GT_CoolantCell_Item.java82
-rw-r--r--src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java340
-rw-r--r--src/main/java/gregtech/api/items/GT_Generic_Block.java22
-rw-r--r--src/main/java/gregtech/api/items/GT_Generic_Item.java167
-rw-r--r--src/main/java/gregtech/api/items/GT_MetaBase_Item.java622
-rw-r--r--src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java415
-rw-r--r--src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X01.java213
-rw-r--r--src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X32.java224
-rw-r--r--src/main/java/gregtech/api/items/GT_MetaGenerated_Tool.java1013
-rw-r--r--src/main/java/gregtech/api/items/GT_RadioactiveCellIC_Item.java196
-rw-r--r--src/main/java/gregtech/api/items/GT_RadioactiveCell_Item.java159
-rw-r--r--src/main/java/gregtech/api/items/GT_Tool_Item.java41
-rw-r--r--src/main/java/gregtech/api/logic/AbstractProcessingLogic.java346
-rw-r--r--src/main/java/gregtech/api/logic/ComplexParallelProcessingLogic.java121
-rw-r--r--src/main/java/gregtech/api/logic/ControllerFluidLogic.java152
-rw-r--r--src/main/java/gregtech/api/logic/ControllerItemLogic.java148
-rw-r--r--src/main/java/gregtech/api/logic/FluidInventoryLogic.java269
-rw-r--r--src/main/java/gregtech/api/logic/ItemInventoryLogic.java314
-rw-r--r--src/main/java/gregtech/api/logic/ModelRenderLogic.java5
-rw-r--r--src/main/java/gregtech/api/logic/MuTEProcessingLogic.java256
-rw-r--r--src/main/java/gregtech/api/logic/NullPowerLogic.java5
-rw-r--r--src/main/java/gregtech/api/logic/PowerLogic.java254
-rw-r--r--src/main/java/gregtech/api/logic/ProcessingLogic.java228
-rw-r--r--src/main/java/gregtech/api/logic/interfaces/FluidInventoryLogicHost.java95
-rw-r--r--src/main/java/gregtech/api/logic/interfaces/ItemInventoryLogicHost.java172
-rw-r--r--src/main/java/gregtech/api/logic/interfaces/ModelRenderLogicHost.java10
-rw-r--r--src/main/java/gregtech/api/logic/interfaces/PowerLogicHost.java60
-rw-r--r--src/main/java/gregtech/api/logic/interfaces/ProcessingLogicHost.java82
-rw-r--r--src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java1416
-rw-r--r--src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java2538
-rw-r--r--src/main/java/gregtech/api/metatileentity/BaseTileEntity.java979
-rw-r--r--src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java340
-rw-r--r--src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java803
-rw-r--r--src/main/java/gregtech/api/metatileentity/GregTechTileClientEvents.java13
-rw-r--r--src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java1029
-rw-r--r--src/main/java/gregtech/api/metatileentity/MetaTileEntity.java1326
-rw-r--r--src/main/java/gregtech/api/metatileentity/TileIC2EnergySink.java119
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java679
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Fluid.java991
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java150
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Item.java530
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicBatteryBuffer.java441
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicGenerator.java344
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull.java175
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull_NonElectric.java78
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java1568
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java387
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_GT_Recipe.java820
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Steel.java150
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicTank.java348
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java568
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_CubicMultiBlockBase.java141
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_EnhancedMultiBlockBase.java318
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ExtendedPowerMultiBlockBase.java242
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_FilterBase.java106
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch.java252
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java157
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Dynamo.java110
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Energy.java125
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Input.java201
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java323
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Maintenance.java464
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler.java208
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_MultiInput.java305
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java502
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java202
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_QuadrupleHumongous.java27
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java2540
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java134
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TieredMachineBlock.java126
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TooltipMultiBlockBase.java57
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Transformer.java325
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Dynamo.java146
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Hatch.java168
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java654
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityBlockInternal.java118
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java205
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityContainer.java30
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityItemInternal.java354
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java290
-rw-r--r--src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java1381
-rw-r--r--src/main/java/gregtech/api/multitileentity/base/NonTickableMultiTileEntity.java62
-rw-r--r--src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java173
-rw-r--r--src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java43
-rw-r--r--src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileComponentCasing.java130
-rw-r--r--src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileMachine.java19
-rw-r--r--src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileUpgradeCasing.java71
-rw-r--r--src/main/java/gregtech/api/multitileentity/enums/MultiTileCasingPurpose.java13
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IItemUpdatable.java19
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java51
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockEnergy.java42
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockFluidHandler.java32
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java60
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java26
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java293
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileMachine.java10
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java63
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/UpgradableModularMuTE.java10
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/UpgradableMuTE.java12
-rw-r--r--src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java800
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java111
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java1083
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java711
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/StackableController.java128
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/StackableModularController.java77
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java96
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/casing/BasicCasing.java7
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/casing/CasingBehaviorBase.java10
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/casing/FunctionalCasing.java29
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/casing/Glasses.java32
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java35
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet.java59
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_Block_Event.java63
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_ClientPreference.java62
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_GtTileEntityGuiRequest.java122
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java254
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_New.java30
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_Pollution.java47
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_RequestCoverData.java113
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_SendCoverData.java107
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_SendOregenPattern.java56
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_SetConfigurationCircuit.java110
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_Sound.java70
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_TileEntity.java157
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_TileEntityCover.java98
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverGUI.java219
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverNew.java119
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_UpdateItem.java64
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_WirelessRedstoneCover.java99
-rw-r--r--src/main/java/gregtech/api/net/IGT_NetworkHandler.java18
-rw-r--r--src/main/java/gregtech/api/net/data/CasingData.java53
-rw-r--r--src/main/java/gregtech/api/net/data/CommonData.java50
-rw-r--r--src/main/java/gregtech/api/net/data/CoordinateData.java50
-rw-r--r--src/main/java/gregtech/api/net/data/MultiTileEntityData.java45
-rw-r--r--src/main/java/gregtech/api/net/data/MultiTileEntityProcess.java54
-rw-r--r--src/main/java/gregtech/api/net/data/PacketData.java48
-rw-r--r--src/main/java/gregtech/api/net/data/Process.java6
-rw-r--r--src/main/java/gregtech/api/objects/AE2DigitalChestHandler.java26
-rw-r--r--src/main/java/gregtech/api/objects/CollectorUtils.java30
-rw-r--r--src/main/java/gregtech/api/objects/ElementStack.java47
-rw-r--r--src/main/java/gregtech/api/objects/GT_ArrayList.java73
-rw-r--r--src/main/java/gregtech/api/objects/GT_ChunkManager.java204
-rw-r--r--src/main/java/gregtech/api/objects/GT_CopiedBlockTexture.java35
-rw-r--r--src/main/java/gregtech/api/objects/GT_Cover_Default.java81
-rw-r--r--src/main/java/gregtech/api/objects/GT_Cover_None.java237
-rw-r--r--src/main/java/gregtech/api/objects/GT_Fluid.java36
-rw-r--r--src/main/java/gregtech/api/objects/GT_HashSet.java91
-rw-r--r--src/main/java/gregtech/api/objects/GT_ItemStack.java107
-rw-r--r--src/main/java/gregtech/api/objects/GT_ItemStack2.java41
-rw-r--r--src/main/java/gregtech/api/objects/GT_MultiTexture.java26
-rw-r--r--src/main/java/gregtech/api/objects/GT_RenderedTexture.java33
-rw-r--r--src/main/java/gregtech/api/objects/GT_SidedTexture.java48
-rw-r--r--src/main/java/gregtech/api/objects/GT_StdRenderedTexture.java46
-rw-r--r--src/main/java/gregtech/api/objects/GT_UO_Dimension.java54
-rw-r--r--src/main/java/gregtech/api/objects/GT_UO_DimensionList.java98
-rw-r--r--src/main/java/gregtech/api/objects/GT_UO_Fluid.java69
-rw-r--r--src/main/java/gregtech/api/objects/ItemData.java122
-rw-r--r--src/main/java/gregtech/api/objects/MaterialStack.java70
-rw-r--r--src/main/java/gregtech/api/objects/ObjMap.java239
-rw-r--r--src/main/java/gregtech/api/objects/XSTR.java246
-rw-r--r--src/main/java/gregtech/api/objects/blockupdate/BlockUpdateHandler.java117
-rw-r--r--src/main/java/gregtech/api/objects/blockupdate/Cooldown.java27
-rw-r--r--src/main/java/gregtech/api/objects/blockupdate/RandomCooldown.java31
-rw-r--r--src/main/java/gregtech/api/objects/iterators/MergedIterator.java31
-rw-r--r--src/main/java/gregtech/api/objects/overclockdescriber/EUNoOverclockDescriber.java110
-rw-r--r--src/main/java/gregtech/api/objects/overclockdescriber/EUOverclockDescriber.java80
-rw-r--r--src/main/java/gregtech/api/objects/overclockdescriber/FusionOverclockDescriber.java63
-rw-r--r--src/main/java/gregtech/api/objects/overclockdescriber/OverclockDescriber.java106
-rw-r--r--src/main/java/gregtech/api/objects/overclockdescriber/SteamOverclockDescriber.java64
-rw-r--r--src/main/java/gregtech/api/recipe/BasicUIProperties.java251
-rw-r--r--src/main/java/gregtech/api/recipe/BasicUIPropertiesBuilder.java264
-rw-r--r--src/main/java/gregtech/api/recipe/FindRecipeQuery.java178
-rw-r--r--src/main/java/gregtech/api/recipe/NEIRecipeProperties.java89
-rw-r--r--src/main/java/gregtech/api/recipe/NEIRecipePropertiesBuilder.java100
-rw-r--r--src/main/java/gregtech/api/recipe/RecipeCategories.java71
-rw-r--r--src/main/java/gregtech/api/recipe/RecipeCategory.java81
-rw-r--r--src/main/java/gregtech/api/recipe/RecipeCategoryHolder.java13
-rw-r--r--src/main/java/gregtech/api/recipe/RecipeCategorySetting.java52
-rw-r--r--src/main/java/gregtech/api/recipe/RecipeMap.java395
-rw-r--r--src/main/java/gregtech/api/recipe/RecipeMapBackend.java469
-rw-r--r--src/main/java/gregtech/api/recipe/RecipeMapBackendProperties.java77
-rw-r--r--src/main/java/gregtech/api/recipe/RecipeMapBackendPropertiesBuilder.java119
-rw-r--r--src/main/java/gregtech/api/recipe/RecipeMapBuilder.java522
-rw-r--r--src/main/java/gregtech/api/recipe/RecipeMapFrontend.java395
-rw-r--r--src/main/java/gregtech/api/recipe/RecipeMaps.java1194
-rw-r--r--src/main/java/gregtech/api/recipe/RecipeMetadataKey.java84
-rw-r--r--src/main/java/gregtech/api/recipe/check/CheckRecipeResult.java54
-rw-r--r--src/main/java/gregtech/api/recipe/check/CheckRecipeResultRegistry.java150
-rw-r--r--src/main/java/gregtech/api/recipe/check/ResultInsufficientHeat.java65
-rw-r--r--src/main/java/gregtech/api/recipe/check/ResultInsufficientMachineTier.java63
-rw-r--r--src/main/java/gregtech/api/recipe/check/ResultInsufficientPower.java64
-rw-r--r--src/main/java/gregtech/api/recipe/check/ResultInsufficientStartupPower.java63
-rw-r--r--src/main/java/gregtech/api/recipe/check/SimpleCheckRecipeResult.java102
-rw-r--r--src/main/java/gregtech/api/recipe/check/SingleRecipeCheck.java405
-rw-r--r--src/main/java/gregtech/api/recipe/maps/AssemblerBackend.java35
-rw-r--r--src/main/java/gregtech/api/recipe/maps/AssemblyLineFrontend.java76
-rw-r--r--src/main/java/gregtech/api/recipe/maps/DistillationTowerFrontend.java38
-rw-r--r--src/main/java/gregtech/api/recipe/maps/FluidCannerBackend.java73
-rw-r--r--src/main/java/gregtech/api/recipe/maps/FluidOnlyFrontend.java33
-rw-r--r--src/main/java/gregtech/api/recipe/maps/FormingPressBackend.java92
-rw-r--r--src/main/java/gregtech/api/recipe/maps/FuelBackend.java75
-rw-r--r--src/main/java/gregtech/api/recipe/maps/FurnaceBackend.java52
-rw-r--r--src/main/java/gregtech/api/recipe/maps/LargeBoilerFuelBackend.java132
-rw-r--r--src/main/java/gregtech/api/recipe/maps/LargeBoilerFuelFrontend.java25
-rw-r--r--src/main/java/gregtech/api/recipe/maps/LargeNEIFrontend.java65
-rw-r--r--src/main/java/gregtech/api/recipe/maps/MicrowaveBackend.java145
-rw-r--r--src/main/java/gregtech/api/recipe/maps/NonGTBackend.java52
-rw-r--r--src/main/java/gregtech/api/recipe/maps/OilCrackerBackend.java41
-rw-r--r--src/main/java/gregtech/api/recipe/maps/PrinterBackend.java142
-rw-r--r--src/main/java/gregtech/api/recipe/maps/RecyclerBackend.java55
-rw-r--r--src/main/java/gregtech/api/recipe/maps/ReplicatorBackend.java100
-rw-r--r--src/main/java/gregtech/api/recipe/maps/SpaceProjectFrontend.java131
-rw-r--r--src/main/java/gregtech/api/recipe/maps/TranscendentPlasmaMixerFrontend.java56
-rw-r--r--src/main/java/gregtech/api/recipe/maps/UnpackagerBackend.java53
-rw-r--r--src/main/java/gregtech/api/recipe/metadata/EmptyRecipeMetadataStorage.java50
-rw-r--r--src/main/java/gregtech/api/recipe/metadata/IRecipeMetadataStorage.java34
-rw-r--r--src/main/java/gregtech/api/recipe/metadata/PCBFactoryTierKey.java30
-rw-r--r--src/main/java/gregtech/api/recipe/metadata/PCBFactoryUpgrade.java7
-rw-r--r--src/main/java/gregtech/api/recipe/metadata/PCBFactoryUpgradeKey.java32
-rw-r--r--src/main/java/gregtech/api/recipe/metadata/RecipeMetadataStorage.java56
-rw-r--r--src/main/java/gregtech/api/recipe/metadata/SimpleRecipeMetadataKey.java27
-rw-r--r--src/main/java/gregtech/api/render/TextureFactory.java157
-rw-r--r--src/main/java/gregtech/api/task/TaskHost.java18
-rw-r--r--src/main/java/gregtech/api/task/TickableTask.java48
-rw-r--r--src/main/java/gregtech/api/task/tasks/PollutionTask.java45
-rw-r--r--src/main/java/gregtech/api/task/tasks/PowerOutputTask.java32
-rw-r--r--src/main/java/gregtech/api/task/tasks/ProcessingTask.java51
-rw-r--r--src/main/java/gregtech/api/threads/GT_Runnable_Cable_Update.java84
-rw-r--r--src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java211
-rw-r--r--src/main/java/gregtech/api/threads/GT_Runnable_Sound.java41
-rw-r--r--src/main/java/gregtech/api/util/AveragePerTickCounter.java139
-rw-r--r--src/main/java/gregtech/api/util/ColorsMetadataSection.java63
-rw-r--r--src/main/java/gregtech/api/util/ColorsMetadataSectionSerializer.java81
-rw-r--r--src/main/java/gregtech/api/util/ExternalMaterials.java14
-rw-r--r--src/main/java/gregtech/api/util/FieldsAreNonnullByDefault.java18
-rw-r--r--src/main/java/gregtech/api/util/GT_ApiaryModifier.java24
-rw-r--r--src/main/java/gregtech/api/util/GT_ApiaryUpgrade.java225
-rw-r--r--src/main/java/gregtech/api/util/GT_AssemblyLineUtils.java557
-rw-r--r--src/main/java/gregtech/api/util/GT_Assemblyline_Server.java297
-rw-r--r--src/main/java/gregtech/api/util/GT_BaseCrop.java311
-rw-r--r--src/main/java/gregtech/api/util/GT_BlockMap.java134
-rw-r--r--src/main/java/gregtech/api/util/GT_BlockSet.java39
-rw-r--r--src/main/java/gregtech/api/util/GT_CLS_Compat.java157
-rw-r--r--src/main/java/gregtech/api/util/GT_ChunkAssociatedData.java494
-rw-r--r--src/main/java/gregtech/api/util/GT_CircuitryBehavior.java212
-rw-r--r--src/main/java/gregtech/api/util/GT_ClientPreference.java41
-rw-r--r--src/main/java/gregtech/api/util/GT_Config.java160
-rw-r--r--src/main/java/gregtech/api/util/GT_CoverBehavior.java411
-rw-r--r--src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java856
-rw-r--r--src/main/java/gregtech/api/util/GT_CreativeTab.java26
-rw-r--r--src/main/java/gregtech/api/util/GT_ExoticEnergyInputHelper.java114
-rw-r--r--src/main/java/gregtech/api/util/GT_FoodStat.java122
-rw-r--r--src/main/java/gregtech/api/util/GT_Forestry_Compat.java195
-rw-r--r--src/main/java/gregtech/api/util/GT_GC_Compat.java52
-rw-r--r--src/main/java/gregtech/api/util/GT_HatchElementBuilder.java524
-rw-r--r--src/main/java/gregtech/api/util/GT_IBoxableWrapper.java13
-rw-r--r--src/main/java/gregtech/api/util/GT_ItsNotMyFaultException.java18
-rw-r--r--src/main/java/gregtech/api/util/GT_JubilanceMegaApiary.java23
-rw-r--r--src/main/java/gregtech/api/util/GT_LanguageManager.java600
-rw-r--r--src/main/java/gregtech/api/util/GT_Log.java45
-rw-r--r--src/main/java/gregtech/api/util/GT_ModHandler.java2551
-rw-r--r--src/main/java/gregtech/api/util/GT_Multiblock_Tooltip_Builder.java720
-rw-r--r--src/main/java/gregtech/api/util/GT_OreDictUnificator.java570
-rw-r--r--src/main/java/gregtech/api/util/GT_OverclockCalculator.java631
-rw-r--r--src/main/java/gregtech/api/util/GT_PCBFactoryManager.java25
-rw-r--r--src/main/java/gregtech/api/util/GT_ParallelHelper.java717
-rw-r--r--src/main/java/gregtech/api/util/GT_PlayedSound.java42
-rw-r--r--src/main/java/gregtech/api/util/GT_ProcessingArray_Manager.java51
-rw-r--r--src/main/java/gregtech/api/util/GT_Recipe.java1271
-rw-r--r--src/main/java/gregtech/api/util/GT_RecipeBuilder.java933
-rw-r--r--src/main/java/gregtech/api/util/GT_RecipeConstants.java332
-rw-r--r--src/main/java/gregtech/api/util/GT_RecipeMapUtil.java226
-rw-r--r--src/main/java/gregtech/api/util/GT_RecipeRegistrator.java868
-rw-r--r--src/main/java/gregtech/api/util/GT_RenderingWorld.java195
-rw-r--r--src/main/java/gregtech/api/util/GT_Shaped_Recipe.java100
-rw-r--r--src/main/java/gregtech/api/util/GT_Shapeless_Recipe.java100
-rw-r--r--src/main/java/gregtech/api/util/GT_SpawnEventHandler.java81
-rw-r--r--src/main/java/gregtech/api/util/GT_StreamUtil.java44
-rw-r--r--src/main/java/gregtech/api/util/GT_StructureUtility.java512
-rw-r--r--src/main/java/gregtech/api/util/GT_StructureUtilityMuTE.java271
-rw-r--r--src/main/java/gregtech/api/util/GT_ToolHarvestHelper.java71
-rw-r--r--src/main/java/gregtech/api/util/GT_TooltipDataCache.java105
-rw-r--r--src/main/java/gregtech/api/util/GT_Util.java202
-rw-r--r--src/main/java/gregtech/api/util/GT_Utility.java4982
-rw-r--r--src/main/java/gregtech/api/util/GT_UtilityClient.java52
-rw-r--r--src/main/java/gregtech/api/util/GT_Waila.java23
-rw-r--r--src/main/java/gregtech/api/util/IGT_HatchAdder.java28
-rw-r--r--src/main/java/gregtech/api/util/ISerializableObject.java159
-rw-r--r--src/main/java/gregtech/api/util/LightingHelper.java1434
-rw-r--r--src/main/java/gregtech/api/util/MethodsReturnNonnullByDefault.java22
-rw-r--r--src/main/java/gregtech/api/util/OutputHatchWrapper.java65
-rw-r--r--src/main/java/gregtech/api/util/ValidationResult.java24
-rw-r--r--src/main/java/gregtech/api/util/ValidationType.java6
-rw-r--r--src/main/java/gregtech/api/util/VoidProtectionHelper.java485
-rw-r--r--src/main/java/gregtech/api/util/WorldSpawnedEventBuilder.java678
-rw-r--r--src/main/java/gregtech/api/util/extensions/ArrayExt.java81
-rw-r--r--src/main/java/gregtech/api/util/extensions/IteratorExt.java13
-rw-r--r--src/main/java/gregtech/api/util/item/ItemHolder.java79
-rw-r--r--src/main/java/gregtech/api/util/recipe/RecipeInputRequirements.java77
-rw-r--r--src/main/java/gregtech/api/util/shutdown/ReasonOutOfFluid.java63
-rw-r--r--src/main/java/gregtech/api/util/shutdown/ReasonOutOfItem.java62
-rw-r--r--src/main/java/gregtech/api/util/shutdown/ReasonOutOfStuff.java61
-rw-r--r--src/main/java/gregtech/api/util/shutdown/ShutDownReason.java41
-rw-r--r--src/main/java/gregtech/api/util/shutdown/ShutDownReasonRegistry.java118
-rw-r--r--src/main/java/gregtech/api/util/shutdown/SimpleShutDownReason.java79
-rw-r--r--src/main/java/gregtech/api/world/GT_Worldgen.java94
-rw-r--r--src/main/java/gregtech/api/world/GT_Worldgen_Ore.java34
-rw-r--r--src/main/java/gregtech/api/world/GT_Worldgen_Ore_SingleBlock.java53
-rw-r--r--src/main/java/gregtech/api/world/GT_Worldgen_Ore_SingleBlock_UnderLava.java55
-rw-r--r--src/main/java/gregtech/client/GT_GUI_ClientConfig.java63
-rw-r--r--src/main/java/gregtech/client/GT_GuiFactory.java29
-rw-r--r--src/main/java/gregtech/client/GT_SoundLoop.java80
-rw-r--r--src/main/java/gregtech/client/GT_TooltipHandler.java195
-rw-r--r--src/main/java/gregtech/common/GT_Client.java1096
-rw-r--r--src/main/java/gregtech/common/GT_DummyWorld.java138
-rw-r--r--src/main/java/gregtech/common/GT_IteratorRandom.java17
-rw-r--r--src/main/java/gregtech/common/GT_Network.java183
-rw-r--r--src/main/java/gregtech/common/GT_PlayerActivityLogger.java34
-rw-r--r--src/main/java/gregtech/common/GT_Pollution.java507
-rw-r--r--src/main/java/gregtech/common/GT_Proxy.java3163
-rw-r--r--src/main/java/gregtech/common/GT_RecipeAdder.java3245
-rw-r--r--src/main/java/gregtech/common/GT_Server.java36
-rw-r--r--src/main/java/gregtech/common/GT_ThaumcraftCompat.java285
-rw-r--r--src/main/java/gregtech/common/GT_UndergroundOil.java339
-rw-r--r--src/main/java/gregtech/common/GT_Worldgen_GT_Ore_Layer.java456
-rw-r--r--src/main/java/gregtech/common/GT_Worldgen_GT_Ore_SmallPieces.java115
-rw-r--r--src/main/java/gregtech/common/GT_Worldgen_Stone.java295
-rw-r--r--src/main/java/gregtech/common/GT_Worldgenerator.java688
-rw-r--r--src/main/java/gregtech/common/bees/GT_AlleleBeeSpecies.java53
-rw-r--r--src/main/java/gregtech/common/bees/GT_AlleleHelper.java268
-rw-r--r--src/main/java/gregtech/common/bees/GT_Bee_Mutation.java85
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Casings1.java108
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Casings2.java102
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Casings3.java82
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Casings4.java250
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Casings5.java159
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Casings6.java94
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Casings8.java199
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Casings9.java43
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Casings_Abstract.java144
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Concretes.java83
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Drone.java65
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Granites.java77
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Machines.java703
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Metal.java68
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Ores.java154
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java324
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Reinforced.java409
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Stones.java62
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Stones_Abstract.java250
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Block_Storage.java103
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Cyclotron_Coils.java127
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Cyclotron_Item_Casings.java10
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Casings1.java14
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Casings2.java26
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Casings3.java14
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Casings4.java14
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Casings5.java36
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Casings6.java14
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Casings8.java14
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Casings9.java14
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Casings_Abstract.java63
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Concretes.java25
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Granites.java10
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_LongDistancePipe.java43
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Machines.java430
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Ores.java81
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Stones_Abstract.java42
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Item_Storage.java47
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Material_Casings.java19
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Material_Machines.java19
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Material_Reinforced.java18
-rw-r--r--src/main/java/gregtech/common/blocks/GT_Packet_Ores.java61
-rw-r--r--src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java485
-rw-r--r--src/main/java/gregtech/common/covers/CoverInfo.java335
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_Arm.java436
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java275
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java333
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_Crafting.java56
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_DoesWork.java257
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_Drain.java140
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_EUMeter.java415
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_FacadeAE.java31
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java401
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_FluidLimiter.java207
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java536
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_FluidStorageMonitor.java507
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_Fluidfilter.java422
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java303
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java389
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_Lens.java28
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_LiquidMeter.java297
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_Metrics_Transmitter.java212
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_NeedMaintainance.java303
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_PlayerDetector.java207
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_Pump.java339
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_RedstoneConductor.java101
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverExternal.java41
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverInternal.java46
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_RedstoneSignalizer.java99
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java53
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterInternal.java43
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_RedstoneWirelessBase.java233
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_Screen.java100
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_Shutter.java201
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_SolarPanel.java139
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_SteamRegulator.java18
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_SteamValve.java26
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_Vent.java111
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java202
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverExternal.java35
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverInternal.java42
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java188
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java51
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java50
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedWirelessRedstoneBase.java303
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessDoesWorkDetector.java245
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessFluidDetector.java186
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessItemDetector.java262
-rw-r--r--src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessMaintenanceDetector.java242
-rw-r--r--src/main/java/gregtech/common/entities/GT_EntityFXPollution.java59
-rw-r--r--src/main/java/gregtech/common/entities/GT_Entity_Arrow.java438
-rw-r--r--src/main/java/gregtech/common/entities/GT_Entity_Arrow_Potion.java78
-rw-r--r--src/main/java/gregtech/common/events/BaseMetricsCoverEvent.java21
-rw-r--r--src/main/java/gregtech/common/events/MetricsCoverDataEvent.java37
-rw-r--r--src/main/java/gregtech/common/events/MetricsCoverHostDeconstructedEvent.java16
-rw-r--r--src/main/java/gregtech/common/events/MetricsCoverSelfDestructEvent.java15
-rw-r--r--src/main/java/gregtech/common/fluid/GT_Fluid.java209
-rw-r--r--src/main/java/gregtech/common/fluid/GT_FluidBuilder.java146
-rw-r--r--src/main/java/gregtech/common/gui/ComplexParallelMachineGUIProvider.java32
-rw-r--r--src/main/java/gregtech/common/gui/MachineGUIProvider.java510
-rw-r--r--src/main/java/gregtech/common/gui/PartGUIProvider.java33
-rw-r--r--src/main/java/gregtech/common/gui/modularui/UIHelper.java200
-rw-r--r--src/main/java/gregtech/common/gui/modularui/uifactory/SelectItemUIFactory.java229
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/AESlotWidget.java64
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/CheckRecipeResultSyncer.java26
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/CoverCycleButtonWidget.java91
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/CoverDataControllerWidget.java133
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_CycleButtonWidget.java39
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_NumericWidget.java60
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_SlotWidget.java101
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_TextFieldWidget.java134
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_ToggleButtonWidget.java86
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/DataControllerWidget.java166
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/FluidLockWidget.java17
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/ItemWatcherSlotWidget.java50
-rw-r--r--src/main/java/gregtech/common/gui/modularui/widget/ShutDownReasonSyncer.java26
-rw-r--r--src/main/java/gregtech/common/items/CombType.java284
-rw-r--r--src/main/java/gregtech/common/items/DropType.java46
-rw-r--r--src/main/java/gregtech/common/items/GT_AdvancedSensorCard_Item.java327
-rw-r--r--src/main/java/gregtech/common/items/GT_DepletetCell_Item.java49
-rw-r--r--src/main/java/gregtech/common/items/GT_FluidDisplayItem.java181
-rw-r--r--src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java328
-rw-r--r--src/main/java/gregtech/common/items/GT_MetaGenerated_Item_01.java4627
-rw-r--r--src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java2831
-rw-r--r--src/main/java/gregtech/common/items/GT_MetaGenerated_Item_03.java1087
-rw-r--r--src/main/java/gregtech/common/items/GT_MetaGenerated_Item_98.java352
-rw-r--r--src/main/java/gregtech/common/items/GT_MetaGenerated_Item_99.java214
-rw-r--r--src/main/java/gregtech/common/items/GT_MetaGenerated_Tool_01.java824
-rw-r--r--src/main/java/gregtech/common/items/GT_NeutronReflector_Item.java54
-rw-r--r--src/main/java/gregtech/common/items/GT_SensorCard_Item.java111
-rw-r--r--src/main/java/gregtech/common/items/GT_TierDrone.java18
-rw-r--r--src/main/java/gregtech/common/items/GT_VolumetricFlask.java361
-rw-r--r--src/main/java/gregtech/common/items/ItemComb.java1908
-rw-r--r--src/main/java/gregtech/common/items/ItemDrop.java241
-rw-r--r--src/main/java/gregtech/common/items/ItemPollen.java89
-rw-r--r--src/main/java/gregtech/common/items/ItemPropolis.java141
-rw-r--r--src/main/java/gregtech/common/items/PollenType.java35
-rw-r--r--src/main/java/gregtech/common/items/PropolisType.java46
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Arrow.java141
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Arrow_Potion.java71
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Cover_Tool.java193
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Crowbar.java61
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_DataOrb.java105
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_DataStick.java52
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Hoe.java72
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Lighter.java140
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_None.java96
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Essentia.java54
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Fluid.java75
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Item.java88
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_PrintedPages.java39
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Prospecting.java159
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Scanner.java65
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Scoop.java63
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Screwdriver.java52
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Sense.java56
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_SensorKit.java56
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_SoftHammer.java131
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Sonictron.java135
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color.java222
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color_Remover.java48
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Metadata.java67
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Mode.java53
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_Wrench.java278
-rw-r--r--src/main/java/gregtech/common/items/behaviors/Behaviour_WrittenBook.java40
-rw-r--r--src/main/java/gregtech/common/misc/GT_ClientPollutionMap.java140
-rw-r--r--src/main/java/gregtech/common/misc/GT_Command.java340
-rw-r--r--src/main/java/gregtech/common/misc/GT_DrillingLogicDelegate.java266
-rw-r--r--src/main/java/gregtech/common/misc/GT_IDrillingLogicDelegateOwner.java22
-rw-r--r--src/main/java/gregtech/common/misc/GlobalEnergyWorldSavedData.java125
-rw-r--r--src/main/java/gregtech/common/misc/GlobalMetricsCoverDatabase.java492
-rw-r--r--src/main/java/gregtech/common/misc/GlobalVariableStorage.java15
-rw-r--r--src/main/java/gregtech/common/misc/WirelessNetworkManager.java93
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/SpaceProjectManager.java309
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/SpaceProjectWorldSavedData.java343
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/base/SP_Requirements.java74
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/base/SP_Upgrade.java362
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/base/SpaceProject.java451
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/commands/SPM_Command.java288
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/commands/SP_Command.java166
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/enums/JsonVariables.java22
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/enums/SolarSystem.java104
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/enums/SpaceBodyType.java17
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/enums/StarType.java32
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/enums/UpgradeStatus.java11
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/interfaces/ISpaceBody.java37
-rw-r--r--src/main/java/gregtech/common/misc/spaceprojects/interfaces/ISpaceProject.java430
-rw-r--r--src/main/java/gregtech/common/net/MessageSetFlaskCapacity.java67
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BasicLogic.java137
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BitAnd.java81
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_CombinationLock.java109
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Equals.java73
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Pulser.java92
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Randomizer.java86
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_RedstoneMeter.java94
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Repeater.java86
-rw-r--r--src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Timer.java108
-rw-r--r--src/main/java/gregtech/common/render/GT_CapeRenderer.java148
-rw-r--r--src/main/java/gregtech/common/render/GT_CopiedBlockTexture.java112
-rw-r--r--src/main/java/gregtech/common/render/GT_CopiedCTMBlockTexture.java118
-rw-r--r--src/main/java/gregtech/common/render/GT_FlaskRenderer.java71
-rw-r--r--src/main/java/gregtech/common/render/GT_FluidDisplayStackRenderer.java98
-rw-r--r--src/main/java/gregtech/common/render/GT_IconFlipped.java91
-rw-r--r--src/main/java/gregtech/common/render/GT_MetaGenerated_Tool_Renderer.java130
-rw-r--r--src/main/java/gregtech/common/render/GT_MultiTexture.java69
-rw-r--r--src/main/java/gregtech/common/render/GT_MultiTile_Renderer.java181
-rw-r--r--src/main/java/gregtech/common/render/GT_PollutionRenderer.java251
-rw-r--r--src/main/java/gregtech/common/render/GT_RenderDrone.java93
-rw-r--r--src/main/java/gregtech/common/render/GT_RenderUtil.java141
-rw-r--r--src/main/java/gregtech/common/render/GT_RenderedTexture.java395
-rw-r--r--src/main/java/gregtech/common/render/GT_Renderer_Block.java747
-rw-r--r--src/main/java/gregtech/common/render/GT_Renderer_Entity_Arrow.java23
-rw-r--r--src/main/java/gregtech/common/render/GT_SidedTexture.java78
-rw-r--r--src/main/java/gregtech/common/render/GT_TextureBase.java31
-rw-r--r--src/main/java/gregtech/common/render/GT_TextureBuilder.java151
-rw-r--r--src/main/java/gregtech/common/render/IRenderedBlock.java114
-rw-r--r--src/main/java/gregtech/common/render/IRenderedBlockSideCheck.java15
-rw-r--r--src/main/java/gregtech/common/render/MultiTileBasicRender.java10
-rw-r--r--src/main/java/gregtech/common/render/items/CosmicNeutroniumRenderer.java109
-rw-r--r--src/main/java/gregtech/common/render/items/GT_DataStick_Renderer.java42
-rw-r--r--src/main/java/gregtech/common/render/items/GT_GeneratedItem_Renderer.java166
-rw-r--r--src/main/java/gregtech/common/render/items/GT_GeneratedMaterial_Renderer.java130
-rw-r--r--src/main/java/gregtech/common/render/items/GT_MetaGenerated_Item_Renderer.java85
-rw-r--r--src/main/java/gregtech/common/render/items/GaiaSpiritRenderer.java27
-rw-r--r--src/main/java/gregtech/common/render/items/InfinityRenderer.java139
-rw-r--r--src/main/java/gregtech/common/render/items/TranscendentMetalRenderer.java145
-rw-r--r--src/main/java/gregtech/common/render/items/UniversiumRenderer.java197
-rw-r--r--src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ChestBuffer.java137
-rw-r--r--src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Filter.java144
-rw-r--r--src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ItemDistributor.java204
-rw-r--r--src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_RecipeFilter.java328
-rw-r--r--src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Regulator.java228
-rw-r--r--src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_SuperBuffer.java105
-rw-r--r--src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_TypeFilter.java213
-rw-r--r--src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler.java516
-rw-r--r--src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Bronze.java311
-rw-r--r--src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Lava.java524
-rw-r--r--src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar.java381
-rw-r--r--src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar_Steel.java77
-rw-r--r--src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Steel.java108
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/functional/Conveyor.java16
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/functional/Emitter.java16
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/functional/FieldGenerator.java16
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/functional/Motor.java16
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/functional/Piston.java16
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/functional/Pump.java16
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/functional/RobotArm.java16
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/functional/Sensor.java16
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Ampere.java47
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Cleanroom.java26
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Heater.java21
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Insulator.java22
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java123
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Laser.java26
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Tank.java61
-rw-r--r--src/main/java/gregtech/common/tileentities/casings/upgrade/Wireless.java26
-rw-r--r--src/main/java/gregtech/common/tileentities/debug/GT_MetaTileEntity_AdvDebugStructureWriter.java439
-rw-r--r--src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_DieselGenerator.java283
-rw-r--r--src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_GasTurbine.java216
-rw-r--r--src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_LightningRod.java169
-rw-r--r--src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicEnergyConverter.java178
-rw-r--r--src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicalEnergyAbsorber.java817
-rw-r--r--src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_NaquadahReactor.java208
-rw-r--r--src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_PlasmaGenerator.java147
-rw-r--r--src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_SteamTurbine.java245
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Bronze.java45
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_BronzeBricks.java53
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Steel.java47
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_SteelBricks.java53
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_ME.java1039
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_Slave.java262
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_InputBus_ME.java804
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Input_ME.java884
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_OutputBus_ME.java327
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Output_ME.java383
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/IDualInputHatch.java21
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/IDualInputInventory.java11
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/IRecipeProcessingAwareHatch.java26
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_AdvSeismicProspector.java309
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Boxinator.java231
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Charger.java110
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_IndustrialApiary.java1560
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Massfabricator.java243
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MicrowaveEnergyTransmitter.java501
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java412
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MonsterRepellent.java182
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_PotionBrewer.java235
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Pump.java851
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Replicator.java127
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_RockBreaker.java169
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Scanner.java425
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Teleporter.java609
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineBase.java415
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineFluid.java125
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineItem.java214
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AbstractMultiFurnace.java48
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java505
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_BrickedBlastFurnace.java155
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Charcoal_Pit.java313
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java514
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller1.java53
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller2.java54
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java180
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DieselEngine.java416
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java367
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java985
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java401
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ExtremeDieselEngine.java237
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer.java656
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer1.java103
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer2.java103
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer3.java103
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_HeatExchanger.java416
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ImplosionCompressor.java163
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IntegratedOreFactory.java831
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler.java504
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Bronze.java96
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Steel.java96
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Titanium.java96
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_TungstenSteel.java96
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeChemicalReactor.java298
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine.java492
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Gas.java222
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_GasAdvanced.java219
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_HPSteam.java232
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Plasma.java391
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Steam.java273
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiFurnace.java377
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java467
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilCracker.java423
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill1.java53
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill2.java55
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill3.java55
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill4.java55
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillBase.java489
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillInfinite.java87
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant1.java60
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant2.java60
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant3.java60
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant4.java60
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java745
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java1276
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java986
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PrimitiveBlastFurnace.java526
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java545
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PyrolyseOven.java263
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java288
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_VacuumFreezer.java163
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/drone/DroneConnection.java143
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_DroneCentre.java912
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_Hatch_DroneDownLink.java340
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalProcessor.java508
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/CokeOven.java153
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java174
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/LaserEngraver.java305
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/LayeredCokeBattery.java295
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/Macerator.java132
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/logic/AdvChemicalProcessorProcessingLogic.java12
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java79
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/logic/DistillationTowerProcessingLogic.java7
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LaserEngraverProcessingLogic.java7
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LayeredCokeBatteryProcessingLogic.java7
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multiblock/logic/MaceratorProcessingLogic.java7
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_AlloySmelter_Bronze.java139
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_AlloySmelter_Steel.java139
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Bronze.java134
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Steel.java134
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Bronze.java134
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Steel.java134
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Bronze.java202
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Steel.java202
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Bronze.java161
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Steel.java159
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Bronze.java189
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Steel.java188
-rw-r--r--src/main/java/gregtech/common/tileentities/render/TileDrone.java24
-rw-r--r--src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalChestBase.java564
-rw-r--r--src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java699
-rw-r--r--src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_Locker.java283
-rw-r--r--src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumChest.java102
-rw-r--r--src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumTank.java55
-rw-r--r--src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperChest.java30
-rw-r--r--src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperTank.java54
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool.java196
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Axe.java175
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_BranchCutter.java101
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_ButcheryKnife.java104
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_BuzzSaw.java81
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_HV.java57
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_LV.java185
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_MV.java57
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Crowbar.java140
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Drill_HV.java68
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Drill_LV.java152
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Drill_MV.java58
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_File.java124
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_HardHammer.java203
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Hoe.java132
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_JackHammer.java128
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Knife.java76
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Mortar.java120
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Pickaxe.java139
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Plow.java110
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Plunger.java92
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_RollingPin.java70
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Saw.java149
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Scoop.java130
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Screwdriver.java160
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Screwdriver_LV.java34
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Sense.java114
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Shovel.java127
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_SoftHammer.java139
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Soldering_Iron.java153
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Sword.java128
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Turbine.java58
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Turbine_Huge.java27
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Turbine_Large.java27
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Turbine_Normal.java27
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Turbine_Small.java27
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_UniversalSpade.java160
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_WireCutter.java117
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Wrench.java272
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Wrench_HV.java69
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Wrench_LV.java77
-rw-r--r--src/main/java/gregtech/common/tools/GT_Tool_Wrench_MV.java69
-rw-r--r--src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_BranchCutter.java39
-rw-r--r--src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_File.java39
-rw-r--r--src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Knife.java39
-rw-r--r--src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Multitool.java50
-rw-r--r--src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Saw.java39
-rw-r--r--src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Screwdriver.java39
-rw-r--r--src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_WireCutter.java39
-rw-r--r--src/main/java/gregtech/crossmod/holoinventory/GT_InventoryDecoder.java38
-rw-r--r--src/main/java/gregtech/crossmod/holoinventory/HoloInventory.java10
-rw-r--r--src/main/java/gregtech/crossmod/waila/GregtechWailaDataProvider.java55
-rw-r--r--src/main/java/gregtech/crossmod/waila/Waila.java32
-rw-r--r--src/main/java/gregtech/loaders/ExtraIcons.java46
-rw-r--r--src/main/java/gregtech/loaders/load/GT_CoverBehaviorLoader.java11
-rw-r--r--src/main/java/gregtech/loaders/load/GT_FuelLoader.java180
-rw-r--r--src/main/java/gregtech/loaders/load/GT_ItemIterator.java309
-rw-r--r--src/main/java/gregtech/loaders/load/GT_Loader_MetaTileEntities_Recipes.java7148
-rw-r--r--src/main/java/gregtech/loaders/load/GT_SonictronLoader.java159
-rw-r--r--src/main/java/gregtech/loaders/materialprocessing/ProcessingConfig.java55
-rw-r--r--src/main/java/gregtech/loaders/materialprocessing/ProcessingModSupport.java56
-rw-r--r--src/main/java/gregtech/loaders/misc/GT_Achievements.java806
-rw-r--r--src/main/java/gregtech/loaders/misc/GT_BeeDefinition.java2766
-rw-r--r--src/main/java/gregtech/loaders/misc/GT_Bees.java201
-rw-r--r--src/main/java/gregtech/loaders/misc/GT_BranchDefinition.java207
-rw-r--r--src/main/java/gregtech/loaders/misc/GT_CoverLoader.java42
-rw-r--r--src/main/java/gregtech/loaders/misc/bees/GT_AlleleEffect.java44
-rw-r--r--src/main/java/gregtech/loaders/misc/bees/GT_EffectTreeTwister.java86
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingAll.java24
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingArrows.java135
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingBeans.java35
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingBlock.java187
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingBolt.java44
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingCell.java441
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingCircuit.java44
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingCompressed.java25
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingCrafting.java464
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingCrate.java132
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingCrop.java154
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingCrushedOre.java107
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingCrystallized.java49
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingDirty.java136
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingDust.java630
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingDye.java91
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingFineWire.java33
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingFoil.java45
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingFood.java107
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingGear.java109
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingGem.java612
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingIngot.java296
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingItem.java45
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingLens.java96
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingLog.java384
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingNugget.java89
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingOre.java245
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingOrePoor.java72
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingOreSmelting.java194
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingPipe.java141
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingPlank.java137
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java604
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingPure.java50
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingRawOre.java219
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingRecycling.java45
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java97
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingRound.java52
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingSand.java36
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingSaplings.java50
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingScrew.java46
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingShaping.java620
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingSlab.java36
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingStick.java141
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingStickLong.java120
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingStone.java348
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingStoneCobble.java30
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingStoneVarious.java25
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingToolHead.java1273
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingToolOther.java137
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingTransforming.java176
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingWax.java31
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingWire.java506
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_BlockResistanceLoader.java52
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_BookAndLootLoader.java433
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java2053
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_CropLoader.java1055
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_FakeRecipeLoader.java18
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_ItemMaxStacksizeLoader.java138
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java124
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_MachineTooltipsLoader.java36
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_MinableRegistrator.java16
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_PCBFactoryMaterialLoader.java19
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_PostLoad.java526
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_ProcessingArrayRecipeLoader.java168
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_RecyclerBlacklistLoader.java106
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_ScrapboxDropLoader.java105
-rw-r--r--src/main/java/gregtech/loaders/postload/GT_Worldgenloader.java2384
-rw-r--r--src/main/java/gregtech/loaders/postload/PartP2PGTPower.java104
-rw-r--r--src/main/java/gregtech/loaders/postload/chains/GT_BauxiteRefineChain.java297
-rw-r--r--src/main/java/gregtech/loaders/postload/chains/GT_NaniteChain.java240
-rw-r--r--src/main/java/gregtech/loaders/postload/chains/GT_PCBFactoryRecipes.java702
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/AlloySmelterRecipes.java116
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/ArcFurnaceRecipes.java477
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/AssemblerRecipes.java6786
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/AssemblyLineRecipes.java894
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/AutoclaveRecipes.java234
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/BenderRecipes.java330
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/BlastFurnaceRecipes.java690
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/BreweryRecipes.java562
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/CannerRecipes.java74
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/CentrifugeRecipes.java823
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/ChemicalBathRecipes.java404
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/ChemicalRecipes.java5973
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/CircuitAssemblerRecipes.java326
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/CompressorRecipes.java154
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/CropProcessingRecipes.java176
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/CuttingRecipes.java283
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/DistilleryRecipes.java1280
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/ElectrolyzerRecipes.java301
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/ElectromagneticSeparatorRecipes.java34
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/ExtractorRecipes.java48
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/ExtruderRecipes.java29
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/FermenterRecipes.java294
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/FluidCannerRecipes.java93
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/FluidExtractorRecipes.java569
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/FluidHeaterRecipes.java95
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/FluidSolidifierRecipes.java577
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/ForgeHammerRecipes.java158
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/FormingPressRecipes.java196
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/FuelRecipes.java127
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/FusionReactorRecipes.java296
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/ImplosionCompressorRecipes.java74
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/LaserEngraverRecipes.java62
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/LatheRecipes.java40
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/MatterAmplifierRecipes.java29
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/MixerRecipes.java1689
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/NEIHiding.java40
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/OreDictUnification.java23
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/PackagerRecipes.java51
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/PlasmaForgeRecipes.java50
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/PrinterRecipes.java64
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/Pulverizer.java581
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/PyrolyseRecipes.java137
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/RecipeRemover.java166
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/SifterRecipes.java47
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/SlicerRecipes.java42
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/SmelterRecipes.java70
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/ThaumcraftRecipes.java961
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/ThermalCentrifugeRecipes.java30
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/TranscendentPlasmaMixerRecipes.java142
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/VacuumFreezerRecipes.java416
-rw-r--r--src/main/java/gregtech/loaders/postload/recipes/WiremillRecipes.java87
-rw-r--r--src/main/java/gregtech/loaders/preload/GT_Loader_CircuitBehaviors.java31
-rw-r--r--src/main/java/gregtech/loaders/preload/GT_Loader_ItemData.java383
-rw-r--r--src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java2232
-rw-r--r--src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java4307
-rw-r--r--src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java1447
-rw-r--r--src/main/java/gregtech/loaders/preload/GT_Loader_OreDictionary.java449
-rw-r--r--src/main/java/gregtech/loaders/preload/GT_Loader_OreProcessing.java115
-rw-r--r--src/main/java/gregtech/loaders/preload/GT_PreLoad.java967
-rw-r--r--src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java789
-rw-r--r--src/main/java/gregtech/nei/NEIHandlerAbsoluteTooltip.java54
-rw-r--r--src/main/java/gregtech/nei/NEI_GT_Config.java187
-rw-r--r--src/main/java/gregtech/nei/RecipeDisplayInfo.java99
-rw-r--r--src/main/java/gregtech/nei/dumper/BatchModeSupportDumper.java10
-rw-r--r--src/main/java/gregtech/nei/dumper/GregTechIDDumper.java61
-rw-r--r--src/main/java/gregtech/nei/dumper/InputSeparationSupportDumper.java10
-rw-r--r--src/main/java/gregtech/nei/dumper/MaterialDumper.java39
-rw-r--r--src/main/java/gregtech/nei/dumper/MetaItemDumper.java60
-rw-r--r--src/main/java/gregtech/nei/dumper/MetaTileEntityDumper.java37
-rw-r--r--src/main/java/gregtech/nei/dumper/MultiBlockFeatureSupportDumper.java46
-rw-r--r--src/main/java/gregtech/nei/dumper/RecipeLockingSupportDumper.java10
-rw-r--r--src/main/java/gregtech/nei/dumper/VoidProtectionSupportDumper.java10
-rw-r--r--src/main/java/gregtech/nei/formatter/DefaultSpecialValueFormatter.java36
-rw-r--r--src/main/java/gregtech/nei/formatter/FuelSpecialValueFormatter.java27
-rw-r--r--src/main/java/gregtech/nei/formatter/FusionSpecialValueFormatter.java59
-rw-r--r--src/main/java/gregtech/nei/formatter/HeatingCoilSpecialValueFormatter.java30
-rw-r--r--src/main/java/gregtech/nei/formatter/INEISpecialInfoFormatter.java24
-rw-r--r--src/main/java/gregtech/nei/formatter/SimpleSpecialValueFormatter.java49
-rw-r--r--src/main/java/net/glease/ggfab/BlockIcons.java45
-rw-r--r--src/main/java/net/glease/ggfab/ComponentRecipeLoader.java45
-rw-r--r--src/main/java/net/glease/ggfab/ConfigurationHandler.java52
-rw-r--r--src/main/java/net/glease/ggfab/GGConstants.java16
-rw-r--r--src/main/java/net/glease/ggfab/GGItemList.java197
-rw-r--r--src/main/java/net/glease/ggfab/GigaGramFab.java178
-rw-r--r--src/main/java/net/glease/ggfab/SingleUseToolRecipeLoader.java103
-rw-r--r--src/main/java/net/glease/ggfab/api/GGFabRecipeMaps.java64
-rw-r--r--src/main/java/net/glease/ggfab/api/GigaGramFabAPI.java30
-rw-r--r--src/main/java/net/glease/ggfab/items/GGMetaItem_DumbItems.java153
-rw-r--r--src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java1144
-rw-r--r--src/main/java/net/glease/ggfab/mte/MTE_LinkedInputBus.java642
-rw-r--r--src/main/java/net/glease/ggfab/mui/ClickableTextWidget.java58
-rw-r--r--src/main/java/net/glease/ggfab/util/GGUtils.java78
-rw-r--r--src/main/java/net/glease/ggfab/util/OverclockHelper.java75
-rw-r--r--src/main/java/speiger/src/crops/api/ICropCardInfo.java19
-rw-r--r--src/main/pack.mcmeta6
-rw-r--r--src/main/resources/META-INF/ggfab_at.cfg2
-rw-r--r--src/main/resources/assets/ggfab/lang/en_US.lang41
-rw-r--r--src/main/resources/assets/ggfab/lang/zh_CN.lang28
-rw-r--r--src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE.pngbin0 -> 382 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_ACTIVE.pngbin0 -> 389 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_ACTIVE_GLOW.pngbin0 -> 379 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_GLOW.pngbin0 -> 378 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_STUCK.pngbin0 -> 330 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_STUCK_GLOW.pngbin0 -> 219 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/0.pngbin0 -> 349 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/1.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/2.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/3.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/30.pngbin0 -> 413 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/31.pngbin0 -> 377 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/32.pngbin0 -> 372 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/33.pngbin0 -> 412 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/34.pngbin0 -> 393 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/35.pngbin0 -> 432 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/36.pngbin0 -> 418 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/4.pngbin0 -> 229 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/5.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/6.pngbin0 -> 318 bytes
-rw-r--r--src/main/resources/assets/gregtech/lang/en_US.lang1503
-rw-r--r--src/main/resources/assets/gregtech/lang/zh_CN.lang1048
-rw-r--r--src/main/resources/assets/gregtech/sounds.json47
-rw-r--r--src/main/resources/assets/gregtech/sounds/DistilleryLoop.oggbin0 -> 93484 bytes
-rw-r--r--src/main/resources/assets/gregtech/sounds/FusionLoop.oggbin0 -> 95417 bytes
-rw-r--r--src/main/resources/assets/gregtech/sounds/PlasmaForgeLoop.oggbin0 -> 91370 bytes
-rw-r--r--src/main/resources/assets/gregtech/sounds/buttonDown.oggbin0 -> 7353 bytes
-rw-r--r--src/main/resources/assets/gregtech/sounds/buttonUp.oggbin0 -> 9732 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/BrainTechCape.pngbin0 -> 3245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/DevCape.pngbin0 -> 37288 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/DonorCape.pngbin0 -> 32959 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/GregTechCape.pngbin0 -> 313 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/GregoriusCape.pngbin0 -> 841 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/LogoGTI_Long.pngbin0 -> 3964 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/MrBrainCape.pngbin0 -> 3247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/Neutronium.pngbin0 -> 7872 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/Stargate.pngbin0 -> 179442 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/Steam.pngbin0 -> 11994 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/Titanium.pngbin0 -> 9999 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/aspects/ELECTRUM.pngbin0 -> 2078 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/aspects/MAGNETO.pngbin0 -> 1381 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/aspects/NEBRISUM.pngbin0 -> 1851 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/aspects/RADIO.pngbin0 -> 1549 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/aspects/STRONTIO.pngbin0 -> 1878 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT_ACTIVE.pngbin0 -> 388 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 324 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT.pngbin0 -> 235 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT_ACTIVE.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM.pngbin0 -> 399 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 399 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT.pngbin0 -> 425 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT_ACTIVE.pngbin0 -> 482 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 422 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE.pngbin0 -> 406 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE_ACTIVE.pngbin0 -> 463 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 422 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP_ACTIVE.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 181 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT_ACTIVE.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE_ACTIVE.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP_ACTIVE.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP_GLOW.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT_ACTIVE.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT_ACTIVE.pngbin0 -> 206 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT.pngbin0 -> 352 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_ACTIVE.pngbin0 -> 564 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE.pngbin0 -> 352 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_ACTIVE.pngbin0 -> 564 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP.pngbin0 -> 188 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_ACTIVE.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT_ACTIVE.pngbin0 -> 317 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 269 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE_ACTIVE.pngbin0 -> 303 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT_ACTIVE.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 137 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP_ACTIVE.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 181 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT.pngbin0 -> 355 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT_ACTIVE.pngbin0 -> 346 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE_ACTIVE.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP_ACTIVE.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT.pngbin0 -> 266 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT_ACTIVE.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT_ACTIVE.pngbin0 -> 370 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 124 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT_GLOW.pngbin0 -> 125 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE_ACTIVE.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT.pngbin0 -> 300 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT_ACTIVE.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT.pngbin0 -> 412 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT_ACTIVE.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 422 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP.pngbin0 -> 466 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP_ACTIVE.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 460 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT_ACTIVE.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE_ACTIVE.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT.pngbin0 -> 375 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE.pngbin0 -> 566 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 497 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP_ACTIVE.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT.pngbin0 -> 438 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT_ACTIVE.pngbin0 -> 426 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE_ACTIVE.pngbin0 -> 281 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP_ACTIVE.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT_ACTIVE.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT_ACTIVE.pngbin0 -> 368 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 124 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT_GLOW.pngbin0 -> 125 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE_ACTIVE.pngbin0 -> 335 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT.pngbin0 -> 340 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT_ACTIVE.pngbin0 -> 362 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE_ACTIVE.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT.pngbin0 -> 452 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT_ACTIVE.pngbin0 -> 432 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE.pngbin0 -> 314 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE_ACTIVE.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP_ACTIVE.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT.pngbin0 -> 452 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT_ACTIVE.pngbin0 -> 434 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE.pngbin0 -> 314 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE_ACTIVE.pngbin0 -> 302 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP_ACTIVE.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT.pngbin0 -> 330 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT_ACTIVE.pngbin0 -> 420 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 363 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT.pngbin0 -> 278 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT_ACTIVE.pngbin0 -> 330 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE.pngbin0 -> 542 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 488 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT.pngbin0 -> 282 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT_ACTIVE.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT_ACTIVE.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE.pngbin0 -> 978 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 978 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT_ACTIVE.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 137 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE.pngbin0 -> 978 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 978 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_ACTIVE.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_ACTIVE.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_ACTIVE.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT.pngbin0 -> 247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT_ACTIVE.pngbin0 -> 377 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE_ACTIVE.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM.pngbin0 -> 399 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 399 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT.pngbin0 -> 425 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT_ACTIVE.pngbin0 -> 474 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE.pngbin0 -> 406 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE_ACTIVE.pngbin0 -> 457 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP_ACTIVE.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 162 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT.pngbin0 -> 303 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT_ACTIVE.pngbin0 -> 316 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE_ACTIVE.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP_ACTIVE.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT_ACTIVE.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT.pngbin0 -> 181 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT_ACTIVE.pngbin0 -> 175 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE.pngbin0 -> 978 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 978 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT_ACTIVE.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP_ACTIVE.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT.pngbin0 -> 355 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT_ACTIVE.pngbin0 -> 346 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE_ACTIVE.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP.pngbin0 -> 235 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP_ACTIVE.pngbin0 -> 338 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT.pngbin0 -> 319 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_ACTIVE.pngbin0 -> 555 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP.pngbin0 -> 206 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP_ACTIVE.pngbin0 -> 287 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 233 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT_ACTIVE.pngbin0 -> 300 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT.pngbin0 -> 426 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT_ACTIVE.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 472 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT_GLOW.pngbin0 -> 423 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT.pngbin0 -> 368 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT_ACTIVE.pngbin0 -> 426 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 363 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT.pngbin0 -> 176 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT_ACTIVE.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP_ACTIVE.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.air.pngbin0 -> 6021 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.air.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.pngbin0 -> 5227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.autogenerated.pngbin0 -> 7087 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.autogenerated.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.berylium.pngbin0 -> 6352 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.berylium.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.bioethanol.pngbin0 -> 5490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.bioethanol.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.biomass.pngbin0 -> 5227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.biomass.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calcium.pngbin0 -> 7831 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calcium.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calciumcarbonate.pngbin0 -> 6732 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calciumcarbonate.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.chlorine.pngbin0 -> 8292 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.chlorine.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.creosote.pngbin0 -> 5490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.creosote.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.deuterium.pngbin0 -> 995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.deuterium.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dimensionallytranscendentresidue.pngbin0 -> 27408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dimensionallytranscendentresidue.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dyes.pngbin0 -> 4549 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dyes.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtcc.pngbin0 -> 26023 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtcc.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtec.pngbin0 -> 26023 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtec.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtpc.pngbin0 -> 26023 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtpc.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtrc.pngbin0 -> 26023 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtrc.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtsc.pngbin0 -> 80354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtsc.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fieryblood.pngbin0 -> 2897 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fieryblood.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fishoil.pngbin0 -> 5501 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fishoil.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fluorine.pngbin0 -> 7217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fluorine.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.for.honey.pngbin0 -> 4672 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.for.honey.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fuel.pngbin0 -> 5507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fuel.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_gas.pngbin0 -> 995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_gas.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_natural_gas.pngbin0 -> 995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_natural_gas.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_sulfuricgas.pngbin0 -> 995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_sulfuricgas.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.glyceryl.pngbin0 -> 7099 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.glyceryl.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium-3.pngbin0 -> 995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium-3.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium.pngbin0 -> 995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.heliumplasma.pngbin0 -> 4260 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.heliumplasma.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.holywater.pngbin0 -> 4654 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.holywater.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hotfryingoil.pngbin0 -> 1499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hotfryingoil.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrochloricacid.pngbin0 -> 8245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrochloricacid.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrogen.pngbin0 -> 995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrogen.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.ice.pngbin0 -> 5602 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.ice.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indigo.pngbin0 -> 7285 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indigo.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indiumconcentrate.pngbin0 -> 6954 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indiumconcentrate.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.iron3chloride.pngbin0 -> 8538 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.iron3chloride.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.leadzincsolution.pngbin0 -> 6751 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.leadzincsolution.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lifeessence.pngbin0 -> 7951 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lifeessence.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_heavy_fuel.pngbin0 -> 4172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_heavy_fuel.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_light_fuel.pngbin0 -> 5507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_light_fuel.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_drillingfluid.pngbin0 -> 4172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_drillingfluid.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_epichlorhydrin.pngbin0 -> 6732 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_epichlorhydrin.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_extra_heavy_oil.pngbin0 -> 3609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_extra_heavy_oil.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_fuel.pngbin0 -> 4172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_fuel.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_oil.pngbin0 -> 3609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_oil.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_hydricsulfur.pngbin0 -> 8888 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_hydricsulfur.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_fuel.pngbin0 -> 5507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_fuel.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_oil.pngbin0 -> 3609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_oil.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_lpg.pngbin0 -> 4260 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_lpg.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_medium_oil.pngbin0 -> 3609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_medium_oil.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_naphtha.pngbin0 -> 5507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_naphtha.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_nitrationmixture.pngbin0 -> 4470 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_nitrationmixture.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sodium.pngbin0 -> 8836 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sodium.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sufluriclight_fuel.pngbin0 -> 5507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sufluriclight_fuel.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricheavy_fuel.pngbin0 -> 4172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricheavy_fuel.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricnaphtha.pngbin0 -> 5507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricnaphtha.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_toluene.pngbin0 -> 6732 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_toluene.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidair.pngbin0 -> 1645 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidair.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidnitrogen.pngbin0 -> 3096 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidnitrogen.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidoxygen.pngbin0 -> 2678 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidoxygen.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lithium.pngbin0 -> 7217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lithium.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lubricant.pngbin0 -> 4172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lubricant.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mcguffium.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mcguffium.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mercury.pngbin0 -> 3412 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mercury.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.methane.pngbin0 -> 995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.methane.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.milk.pngbin0 -> 6340 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.milk.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.autogenerated.pngbin0 -> 1426 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.autogenerated.png.mcmeta45
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.blaze.pngbin0 -> 4749 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.blaze.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.concrete.pngbin0 -> 4749 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.concrete.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.eternity.pngbin0 -> 12582 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.eternity.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.gaiaspirit.pngbin0 -> 28265 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.gaiaspirit.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.glass.pngbin0 -> 7194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.glass.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.infinity.pngbin0 -> 4433 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.infinity.png.mcmeta37
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magmatter.pngbin0 -> 6884 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magmatter.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magnetohydrodynamicallyconstrainedstarmatter.pngbin0 -> 6999 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magnetohydrodynamicallyconstrainedstarmatter.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.redstone.pngbin0 -> 5813 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.redstone.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.spacetime.pngbin0 -> 8709 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.spacetime.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.transcendentmetal.pngbin0 -> 3609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.transcendentmetal.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.universium.pngbin0 -> 2213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.universium.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.whitedwarfmatter.pngbin0 -> 1799 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.whitedwarfmatter.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitricacid.pngbin0 -> 4470 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitricacid.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrocoalfuel.pngbin0 -> 6195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrocoalfuel.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel.pngbin0 -> 7507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogen.pngbin0 -> 995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogen.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogendioxide.pngbin0 -> 995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogendioxide.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogenplasma.pngbin0 -> 1799 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogenplasma.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oil.pngbin0 -> 3609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oil.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oxygen.pngbin0 -> 995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oxygen.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.plasma.autogenerated.pngbin0 -> 1799 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.plasma.autogenerated.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potassium.pngbin0 -> 7093 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potassium.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.alcopops.pngbin0 -> 5789 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.alcopops.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.applejuice.pngbin0 -> 5489 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.applejuice.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.awkward.pngbin0 -> 8213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.awkward.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.beer.pngbin0 -> 5789 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.beer.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cafeaulait.pngbin0 -> 5490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cafeaulait.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cavejohnsonsgrenadejuice.pngbin0 -> 5789 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cavejohnsonsgrenadejuice.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chillysauce.pngbin0 -> 6638 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chillysauce.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chocolatemilk.pngbin0 -> 5493 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chocolatemilk.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cider.pngbin0 -> 5500 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cider.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.coffee.pngbin0 -> 5490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.coffee.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.pngbin0 -> 5486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.splash.pngbin0 -> 5486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.pngbin0 -> 5486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.splash.pngbin0 -> 5486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkbeer.pngbin0 -> 5490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkbeer.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcafeaulait.pngbin0 -> 5493 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcafeaulait.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkchocolatemilk.pngbin0 -> 5493 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkchocolatemilk.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcoffee.pngbin0 -> 5493 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcoffee.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.pngbin0 -> 6638 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.strong.pngbin0 -> 6638 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.strong.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diabolosauce.pngbin0 -> 6638 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diabolosauce.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.dragonblood.pngbin0 -> 5493 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.dragonblood.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.splash.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.splash.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.glenmckenner.pngbin0 -> 5488 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.glenmckenner.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldenapplejuice.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldenapplejuice.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldencider.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldencider.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.grapejuice.pngbin0 -> 5508 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.grapejuice.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.splash.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.splash.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hopsjuice.pngbin0 -> 5508 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hopsjuice.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hotsauce.pngbin0 -> 6638 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hotsauce.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.icetea.pngbin0 -> 5490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.icetea.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.idunsapplejuice.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.idunsapplejuice.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.pngbin0 -> 5483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.splash.pngbin0 -> 5483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.pngbin0 -> 5483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.splash.pngbin0 -> 5483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.laitaucafe.pngbin0 -> 5490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.laitaucafe.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonade.pngbin0 -> 5789 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonade.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonjuice.pngbin0 -> 5789 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonjuice.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.leninade.pngbin0 -> 5789 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.leninade.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.limoncello.pngbin0 -> 5789 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.limoncello.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mineralwater.pngbin0 -> 7929 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mineralwater.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mundane.pngbin0 -> 8213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mundane.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.pngbin0 -> 5457 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.splash.pngbin0 -> 5457 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.pngbin0 -> 5457 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.splash.pngbin0 -> 5457 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.notchesbrew.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.notchesbrew.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.piratebrew.pngbin0 -> 6538 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.piratebrew.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.splash.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.splash.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.splash.pngbin0 -> 5487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.potatojuice.pngbin0 -> 5789 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.potatojuice.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.purpledrink.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.purpledrink.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.reedwater.pngbin0 -> 8213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.reedwater.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.splash.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.splash.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.splash.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.rum.pngbin0 -> 6511 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.rum.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.saltywater.pngbin0 -> 8213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.saltywater.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.scotch.pngbin0 -> 5489 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.scotch.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.pngbin0 -> 5483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.splash.pngbin0 -> 5483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.pngbin0 -> 5483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.splash.pngbin0 -> 5483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.pngbin0 -> 5479 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.splash.pngbin0 -> 5479 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.pngbin0 -> 5479 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.splash.pngbin0 -> 5479 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.pngbin0 -> 5479 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.splash.pngbin0 -> 5479 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.pngbin0 -> 5486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.splash.pngbin0 -> 5486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.pngbin0 -> 5486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.splash.pngbin0 -> 5486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.pngbin0 -> 5486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.splash.pngbin0 -> 5486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.sweettea.pngbin0 -> 5490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.sweettea.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.tea.pngbin0 -> 5490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.tea.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.thick.pngbin0 -> 8213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.thick.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vinegar.pngbin0 -> 6862 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vinegar.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vodka.pngbin0 -> 7041 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vodka.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.splash.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.splash.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.pngbin0 -> 5483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.splash.pngbin0 -> 5483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.pngbin0 -> 5483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.splash.pngbin0 -> 5483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.splash.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyhopsjuice.pngbin0 -> 5500 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyhopsjuice.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyjuice.pngbin0 -> 5789 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyjuice.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wine.pngbin0 -> 6638 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wine.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.primordialmatter.pngbin0 -> 35069 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.primordialmatter.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.quarkgluonplasma.pngbin0 -> 4169 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.quarkgluonplasma.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.radon.pngbin0 -> 995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.radon.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rawstarmatter.pngbin0 -> 8286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rawstarmatter.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.refinedglue.pngbin0 -> 4170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.refinedglue.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rocket_fuel.pngbin0 -> 4470 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rocket_fuel.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.seedoil.pngbin0 -> 5977 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.seedoil.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.silicon.pngbin0 -> 6171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.silicon.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodium.pngbin0 -> 8213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodium.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodiumpersulfate.pngbin0 -> 6932 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodiumpersulfate.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.bluevitriol.pngbin0 -> 5470 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.bluevitriol.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.greenvitriol.pngbin0 -> 5605 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.greenvitriol.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.nickelsulfate.pngbin0 -> 5846 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.nickelsulfate.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.spatialfluid.pngbin0 -> 12923 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.spatialfluid.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.squidink.pngbin0 -> 3609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.squidink.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.steam.pngbin0 -> 1484 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.steam.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sulfuricacid.pngbin0 -> 8888 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sulfuricacid.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.temporalfluid.pngbin0 -> 6262 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.temporalfluid.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.titaniumtetrachloride.pngbin0 -> 7093 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.titaniumtetrachloride.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.tritium.pngbin0 -> 995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.tritium.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.uuamplifier.pngbin0 -> 5492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.uuamplifier.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.autogeneratedbin0 -> 10203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.autogenerated.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.concrete.pngbin0 -> 7407 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.concrete.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wolframium.pngbin0 -> 5783 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wolframium.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_DOWN.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_DOWN_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_LEFT.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_LEFT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_RIGHT.pngbin0 -> 292 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_RIGHT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_UP.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_UP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_CHESTBUFFER.pngbin0 -> 472 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_CHESTBUFFER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_FILTER.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_FILTER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_ITEMDISTRIBUTOR.pngbin0 -> 398 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_ITEMDISTRIBUTOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_RECIPEFILTER.pngbin0 -> 1614 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_RECIPEFILTER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_REGULATOR.pngbin0 -> 466 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_REGULATOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_SUPERBUFFER.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_SUPERBUFFER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_TYPEFILTER.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_TYPEFILTER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS_CHISELED.pngbin0 -> 363 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS_CRACKED.pngbin0 -> 389 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS_MOSSY.pngbin0 -> 546 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_COBBLE.pngbin0 -> 439 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_COBBLE_MOSSY.pngbin0 -> 593 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_SMOOTH.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_STONE.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ADAMANTIUM.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AERCRYSTAL.pngbin0 -> 688 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ALUMINIUM.pngbin0 -> 426 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AMBER.pngbin0 -> 726 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AMERICIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AMETHYST.pngbin0 -> 725 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ANNEALEDCOPPER.pngbin0 -> 402 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ANTIMONY.pngbin0 -> 393 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AQUACRYSTAL.pngbin0 -> 739 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ARSENIC.pngbin0 -> 319 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ASTRALSILVER.pngbin0 -> 389 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BATTERYALLOY.pngbin0 -> 531 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BERYLLIUM.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BISMUTH.pngbin0 -> 423 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BISMUTHBRONZE.pngbin0 -> 564 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLACKBRONZE.pngbin0 -> 580 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLACKDWARFMATTER.pngbin0 -> 5105 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLACKSTEEL.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLAZE.pngbin0 -> 15519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLUEALLOY.pngbin0 -> 541 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLUESTEEL.pngbin0 -> 432 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLUETOPAZ.pngbin0 -> 730 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BRASS.pngbin0 -> 428 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BRONZE.pngbin0 -> 428 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BRONZEPREIN.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CAESIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CERIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CERTUSQUARTZ.pngbin0 -> 603 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CHARCOAL.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CHROME.pngbin0 -> 407 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CHROMIUMDIOXIDE.pngbin0 -> 489 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_COBALT.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_COBALTBRASS.pngbin0 -> 430 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_COPPER.pngbin0 -> 401 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CRYOLITE.pngbin0 -> 3026 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CUPRONICKEL.pngbin0 -> 439 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DAMASCUSSTEEL.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DARKIRON.pngbin0 -> 489 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DEEPIRON.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DEEP_DARK_RAW.pngbin0 -> 3300 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DESH.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DILITHIUM.pngbin0 -> 508 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DURANIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DYSPROSIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ELECTRUM.pngbin0 -> 435 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ELECTRUMFLUX.pngbin0 -> 435 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ENDEREYE.pngbin0 -> 679 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ENDERIUM.pngbin0 -> 544 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ENDERPEARL.pngbin0 -> 700 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ERBIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ETERNITY.pngbin0 -> 14200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ETERNITY.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_EUROPIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FIERYSTEEL.pngbin0 -> 293 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FIRESTONE.pngbin0 -> 3304 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FOOLSRUBY.pngbin0 -> 691 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FORCE.pngbin0 -> 707 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FORCICIUM.pngbin0 -> 539 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FORCILLIUM.pngbin0 -> 539 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_GADOLINIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_GALLIUM.pngbin0 -> 386 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_GREENSAPPHIRE.pngbin0 -> 719 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HOLMIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSLA.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSSE.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSSG.pngbin0 -> 432 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSSS.pngbin0 -> 535 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ICHORIUM.pngbin0 -> 3034 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IGNISCRYSTAL.pngbin0 -> 722 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_INDIUM.pngbin0 -> 392 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_INFUSEDGOLD.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_INVAR.pngbin0 -> 435 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRIDIUM.pngbin0 -> 355 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRONMAGNETIC.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRONWOOD.pngbin0 -> 421 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRREIN.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_JASPER.pngbin0 -> 708 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_KANTHAL.pngbin0 -> 423 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_KNIGHTMETAL.pngbin0 -> 422 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LANTHANUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LAZURITE.pngbin0 -> 655 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LEAD.pngbin0 -> 382 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LIGNITE.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LUTETIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGMATTER.pngbin0 -> 6345 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGMATTER.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGNALIUM.pngbin0 -> 522 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGNESIUM.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MANGANESE.pngbin0 -> 337 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_METEORICIRON.pngbin0 -> 423 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_METEORICSTEEL.pngbin0 -> 398 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MIDASIUM.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MITHRIL.pngbin0 -> 416 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MOLYBDENUM.pngbin0 -> 423 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MONAZITE.pngbin0 -> 520 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAH.pngbin0 -> 343 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAHALLOY.pngbin0 -> 343 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAHENRICHED.pngbin0 -> 329 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAHPREIN.pngbin0 -> 2934 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADRIA.pngbin0 -> 302 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEODYMIUM.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEODYMIUMMAGNETIC.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NETHERSTAR.pngbin0 -> 508 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEUTRONIUM.pngbin0 -> 355 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEUTRONIUMPREIN.pngbin0 -> 2949 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NICHROME.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NICKEL.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NICKELALUMINIUM.pngbin0 -> 2989 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NIOBIUM.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NIOBIUMNITRIDE.pngbin0 -> 406 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NIOBIUMTITANIUM.pngbin0 -> 421 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NITER.pngbin0 -> 435 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OLIVINE.pngbin0 -> 707 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OPAL.pngbin0 -> 730 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ORDOCRYSTAL.pngbin0 -> 508 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ORIHARUKON.pngbin0 -> 289 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OSMIRIDIUM.pngbin0 -> 432 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OSMIUM.pngbin0 -> 412 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PALLADIUM.pngbin0 -> 386 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PERDITIOCRYSTAL.pngbin0 -> 544 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PHOSPHORUS.pngbin0 -> 525 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PIGIRON.pngbin0 -> 425 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLASCRETE.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLATINUM.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLUTONIUM.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLUTONIUM241.pngbin0 -> 406 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PRASEODYMIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PROMETHIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_QUARTZITE.pngbin0 -> 592 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_REDALLOY.pngbin0 -> 535 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_REDGARNET.pngbin0 -> 708 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_REDSTEEL.pngbin0 -> 433 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ROSEGOLD.pngbin0 -> 432 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_RUBIDIUM.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_RUBY.pngbin0 -> 691 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SAMARIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SAPPHIRE.pngbin0 -> 695 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SCANDIUM.pngbin0 -> 382 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SHADOW.pngbin0 -> 329 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SHADOWIRON.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SHADOWSTEEL.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SILICON.pngbin0 -> 413 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SILICONSG.pngbin0 -> 3047 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SILVER.pngbin0 -> 410 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SODALITE.pngbin0 -> 718 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SOLDERINGALLOY.pngbin0 -> 355 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SPACETIME.pngbin0 -> 20524 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SPACETIME.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STAINLESSSTEEL.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEEL.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEELEAF.pngbin0 -> 3028 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEELMAGNETIC.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEELPREIN.pngbin0 -> 2985 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STERLINGSILVER.pngbin0 -> 404 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SUNNARIUM.pngbin0 -> 436 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TANTALUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TANZANITE.pngbin0 -> 728 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TELLURIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TERBIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TERRACRYSTAL.pngbin0 -> 740 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_THAUMIUM.pngbin0 -> 434 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_THORIUM.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_THULIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TIN.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TINALLOY.pngbin0 -> 379 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TITANIUM.pngbin0 -> 433 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TITANIUMPREIN.pngbin0 -> 2987 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TOPAZ.pngbin0 -> 742 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRANSCENDENTMETAL.pngbin0 -> 302 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRINIUM.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRITANIUM.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TSREIN.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TUNGSTEN.pngbin0 -> 343 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TUNGSTENCARBIDE.pngbin0 -> 392 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TUNGSTENSTEEL.pngbin0 -> 368 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ULTIMET.pngbin0 -> 423 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_UNIVERSIUM.pngbin0 -> 5455 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_URANIUM.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_URANIUM235.pngbin0 -> 423 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VANADIUM.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VANADIUMGALLIUM.pngbin0 -> 426 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VANADIUMSTEEL.pngbin0 -> 386 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VINTEUM.pngbin0 -> 708 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_WHITEDWARFMATTER.pngbin0 -> 5160 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_WROUGHTIRON.pngbin0 -> 425 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YELLOWGARNET.pngbin0 -> 698 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YTTRBIUM.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YTTRIUM.pngbin0 -> 423 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YTTRIUMBARIUMCUPRATE.pngbin0 -> 398 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ZINC.pngbin0 -> 415 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE.pngbin0 -> 536 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE_GLOW.pngbin0 -> 393 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE.pngbin0 -> 609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE_GLOW.pngbin0 -> 317 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_SOLAR.pngbin0 -> 491 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CFOAM_FRESH.pngbin0 -> 814 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CFOAM_HARDENED.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS_CHISELED.pngbin0 -> 337 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS_CRACKED.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS_MOSSY.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_COBBLE.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_COBBLE_MOSSY.pngbin0 -> 565 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_SMOOTH.pngbin0 -> 319 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_STONE.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS_CHISELED.pngbin0 -> 370 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS_CRACKED.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS_MOSSY.pngbin0 -> 552 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_COBBLE.pngbin0 -> 450 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_COBBLE_MOSSY.pngbin0 -> 605 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_SMOOTH.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_STONE.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/COVER_WOOD_PLATE.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP.pngbin0 -> 263 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_ACTIVE.pngbin0 -> 529 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DRONE_CENTRE_ACTIVE.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DRONE_CENTRE_FACE.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/DRONE_CENTRE_INACTIVE.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EV_SIDE_CYCLOTRON_SOLENOID.pngbin0 -> 613 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/EV_TOP_CYCLOTRON_SOLENOID.pngbin0 -> 683 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FLUID_IN_SIGN.pngbin0 -> 1692 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FLUID_OUT_SIGN.pngbin0 -> 1699 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_1.pngbin0 -> 572 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_10.pngbin0 -> 574 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_11.pngbin0 -> 598 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_12.pngbin0 -> 574 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_2.pngbin0 -> 599 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_3.pngbin0 -> 535 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_4.pngbin0 -> 529 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_5.pngbin0 -> 555 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_6.pngbin0 -> 538 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_7.pngbin0 -> 484 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_8.pngbin0 -> 627 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_9.pngbin0 -> 571 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_1.pngbin0 -> 574 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_10.pngbin0 -> 577 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_11.pngbin0 -> 604 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_12.pngbin0 -> 583 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_2.pngbin0 -> 606 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_3.pngbin0 -> 542 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_4.pngbin0 -> 536 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_5.pngbin0 -> 561 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_6.pngbin0 -> 543 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_7.pngbin0 -> 491 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_8.pngbin0 -> 630 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_9.pngbin0 -> 577 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE.pngbin0 -> 685 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_ACTIVE.pngbin0 -> 1251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS.pngbin0 -> 352 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS_CHISELED.pngbin0 -> 352 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS_CRACKED.pngbin0 -> 377 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS_MOSSY.pngbin0 -> 547 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_COBBLE.pngbin0 -> 425 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_COBBLE_MOSSY.pngbin0 -> 598 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_SMOOTH.pngbin0 -> 300 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_STONE.pngbin0 -> 263 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS_CHISELED.pngbin0 -> 452 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS_CRACKED.pngbin0 -> 488 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS_MOSSY.pngbin0 -> 587 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_COBBLE.pngbin0 -> 578 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_COBBLE_MOSSY.pngbin0 -> 681 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_SMOOTH.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_STONE.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/HIDDEN_FACE.pngbin0 -> 113 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/HV_SIDE_CYCLOTRON_SOLENOID.pngbin0 -> 398 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/HV_TOP_CYCLOTRON_SOLENOID.pngbin0 -> 604 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/INFINITY_COOLED_CASING.pngbin0 -> 416 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_FULL.pngbin0 -> 793 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_HUGE.pngbin0 -> 719 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_LARGE.pngbin0 -> 726 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_MEDIUM.pngbin0 -> 850 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_MEDIUM_PLUS.pngbin0 -> 721 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_SMALL.pngbin0 -> 833 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_TINY.pngbin0 -> 818 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ITEM_IN_SIGN.pngbin0 -> 1700 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ITEM_OUT_SIGN.pngbin0 -> 1696 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/IV_SIDE_CYCLOTRON_SOLENOID.pngbin0 -> 382 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/IV_TOP_CYCLOTRON_SOLENOID.pngbin0 -> 589 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS1.pngbin0 -> 470 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS2.pngbin0 -> 498 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS3.pngbin0 -> 484 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS4.pngbin0 -> 529 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS5.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS6.pngbin0 -> 512 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS7.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS8.pngbin0 -> 489 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS9.pngbin0 -> 463 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE1.pngbin0 -> 606 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE1.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE2.pngbin0 -> 858 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE2.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE3.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE3.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE4.pngbin0 -> 935 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE4.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE5.pngbin0 -> 813 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE5.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE6.pngbin0 -> 910 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE6.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE7.pngbin0 -> 618 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE7.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE8.pngbin0 -> 855 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE8.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE9.pngbin0 -> 603 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE9.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY1.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY2.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY3.pngbin0 -> 453 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY4.pngbin0 -> 390 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY5.pngbin0 -> 82 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY6.pngbin0 -> 363 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY7.pngbin0 -> 453 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY8.pngbin0 -> 362 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY9.pngbin0 -> 435 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW1.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW2.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW3.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW4.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW5.pngbin0 -> 485 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW6.pngbin0 -> 339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW7.pngbin0 -> 233 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW8.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW9.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE1.pngbin0 -> 378 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE1.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE2.pngbin0 -> 623 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE2.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE3.pngbin0 -> 386 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE3.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE4.pngbin0 -> 702 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE4.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE5.pngbin0 -> 1416 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE5.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE6.pngbin0 -> 773 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE6.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE7.pngbin0 -> 409 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE7.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE8.pngbin0 -> 624 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE8.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE9.pngbin0 -> 461 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE9.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY1.pngbin0 -> 169 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY2.pngbin0 -> 146 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY3.pngbin0 -> 183 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY4.pngbin0 -> 140 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY5.pngbin0 -> 126 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY6.pngbin0 -> 145 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY7.pngbin0 -> 180 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY8.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY9.pngbin0 -> 192 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS1.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS2.pngbin0 -> 489 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS3.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS4.pngbin0 -> 522 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS5.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS6.pngbin0 -> 518 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS7.pngbin0 -> 496 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS8.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS9.pngbin0 -> 479 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE1.pngbin0 -> 601 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE1.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE2.pngbin0 -> 820 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE2.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE3.pngbin0 -> 629 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE3.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE4.pngbin0 -> 909 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE4.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE5.pngbin0 -> 813 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE5.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE6.pngbin0 -> 897 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE6.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE7.pngbin0 -> 624 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE7.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE8.pngbin0 -> 837 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE8.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE9.pngbin0 -> 609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE9.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY1.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY2.pngbin0 -> 320 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY3.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY4.pngbin0 -> 337 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY5.pngbin0 -> 82 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY6.pngbin0 -> 329 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY7.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY8.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY9.pngbin0 -> 393 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST1.pngbin0 -> 515 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST2.pngbin0 -> 574 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST3.pngbin0 -> 569 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST4.pngbin0 -> 612 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST5.pngbin0 -> 302 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST6.pngbin0 -> 605 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST7.pngbin0 -> 585 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST8.pngbin0 -> 586 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST9.pngbin0 -> 560 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE1.pngbin0 -> 750 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE1.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE2.pngbin0 -> 947 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE2.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE3.pngbin0 -> 777 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE3.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE4.pngbin0 -> 1028 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE4.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE5.pngbin0 -> 810 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE5.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE6.pngbin0 -> 1023 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE6.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE7.pngbin0 -> 800 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE7.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE8.pngbin0 -> 954 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE8.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE9.pngbin0 -> 808 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE9.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY1.pngbin0 -> 400 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY2.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY3.pngbin0 -> 477 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY4.pngbin0 -> 332 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY5.pngbin0 -> 82 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY6.pngbin0 -> 327 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY7.pngbin0 -> 467 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY8.pngbin0 -> 338 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY9.pngbin0 -> 425 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI1.pngbin0 -> 530 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI2.pngbin0 -> 525 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI3.pngbin0 -> 577 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI4.pngbin0 -> 564 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI5.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI6.pngbin0 -> 551 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI7.pngbin0 -> 570 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI8.pngbin0 -> 545 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI9.pngbin0 -> 546 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE1.pngbin0 -> 678 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE1.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE2.pngbin0 -> 865 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE2.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE3.pngbin0 -> 717 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE3.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE4.pngbin0 -> 955 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE4.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE5.pngbin0 -> 813 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE5.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE6.pngbin0 -> 929 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE6.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE7.pngbin0 -> 723 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE7.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE8.pngbin0 -> 881 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE8.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE9.pngbin0 -> 688 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE9.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY1.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY2.pngbin0 -> 349 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY3.pngbin0 -> 485 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY4.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY5.pngbin0 -> 82 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY6.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY7.pngbin0 -> 472 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY8.pngbin0 -> 348 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY9.pngbin0 -> 432 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU1.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU2.pngbin0 -> 515 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU3.pngbin0 -> 534 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU4.pngbin0 -> 550 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU5.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU6.pngbin0 -> 540 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU7.pngbin0 -> 553 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU8.pngbin0 -> 527 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU9.pngbin0 -> 518 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE1.pngbin0 -> 649 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE1.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE2.pngbin0 -> 848 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE2.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE3.pngbin0 -> 689 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE3.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE4.pngbin0 -> 934 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE4.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE5.pngbin0 -> 813 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE5.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE6.pngbin0 -> 913 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE6.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE7.pngbin0 -> 688 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE7.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE8.pngbin0 -> 855 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE8.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE9.pngbin0 -> 652 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE9.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY1.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY2.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY3.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY4.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY5.pngbin0 -> 82 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY6.pngbin0 -> 332 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY7.pngbin0 -> 450 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY8.pngbin0 -> 313 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY9.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LONG_DISTANCE_PIPE_FLUID.pngbin0 -> 3110 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LONG_DISTANCE_PIPE_ITEM.pngbin0 -> 3231 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LuV_SIDE_CYCLOTRON_SOLENOID.pngbin0 -> 402 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/LuV_TOP_CYCLOTRON_SOLENOID.pngbin0 -> 601 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_8V_BOTTOM.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_8V_SIDE.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_8V_TOP.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBLASTFURNACE.pngbin0 -> 501 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBLASTFURNACE_ACTIVE.pngbin0 -> 571 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBLASTFURNACE_ACTIVE_GLOW.pngbin0 -> 140 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBRICKS_BOTTOM.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBRICKS_SIDE.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBRICKS_TOP.pngbin0 -> 508 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEPLATEDBRICKS.pngbin0 -> 488 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZE_BOTTOM.pngbin0 -> 508 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZE_SIDE.pngbin0 -> 508 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZE_TOP.pngbin0 -> 508 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ACIDHAZARD.pngbin0 -> 680 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ADVANCEDGAS.pngbin0 -> 462 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ADVANCEDRADIATIONPROOF.pngbin0 -> 5933 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ASSEMBLER.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BIOHAZARD.pngbin0 -> 954 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE.pngbin0 -> 652 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE_GLOW.pngbin0 -> 165 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BRICKEDBLASTFURNACE_INACTIVE.pngbin0 -> 568 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_CHEMICALLY_INERT.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_CLEAN_STAINLESSSTEEL.pngbin0 -> 459 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_CONTAINMENT_FIELD.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DATA_DRIVE.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DENSEBRICKS.pngbin0 -> 409 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DRAGONEGG.pngbin0 -> 457 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DRAGONEGG_GLOW.pngbin0 -> 105 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ENGINE_INTAKE.pngbin0 -> 663 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_EXPLOSIONHAZARD.pngbin0 -> 736 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_EXTREME_ENGINE_INTAKE.pngbin0 -> 706 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_BRONZE.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_STEEL.pngbin0 -> 487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_TITANIUM.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_TUNGSTENSTEEL.pngbin0 -> 539 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREHAZARD.pngbin0 -> 682 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FROSTHAZARD.pngbin0 -> 694 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FROST_PROOF.pngbin0 -> 500 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION.pngbin0 -> 630 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_2.pngbin0 -> 627 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL.pngbin0 -> 541 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS.pngbin0 -> 614 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_YELLOW.pngbin0 -> 591 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW.pngbin0 -> 118 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_BRONZE.pngbin0 -> 623 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_STEEL.pngbin0 -> 651 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_TITANIUM.pngbin0 -> 3312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_TUNGSTENSTEEL.pngbin0 -> 682 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GRATE.pngbin0 -> 481 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_IRIDIUM.pngbin0 -> 3005 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC.pngbin0 -> 488 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGICAL.pngbin0 -> 406 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGICHAZARD.pngbin0 -> 652 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_ACTIVE.pngbin0 -> 488 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_ACTIVE_GLOW.pngbin0 -> 92 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT.pngbin0 -> 330 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT_ACTIVE.pngbin0 -> 330 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW.pngbin0 -> 106 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT_GLOW.pngbin0 -> 105 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_GLOW.pngbin0 -> 92 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MINING_BLACKPLUTONIUM.pngbin0 -> 3002 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MINING_NEUTRONIUM.pngbin0 -> 3052 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MINING_OSMIRIDIUM.pngbin0 -> 452 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MOTOR.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_NOISEHAZARD.pngbin0 -> 651 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_1.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_2.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_3.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_BRONZE.pngbin0 -> 569 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_POLYBENZIMIDAZOLE.pngbin0 -> 392 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_POLYTETRAFLUOROETHYLENE.pngbin0 -> 453 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_STEEL.pngbin0 -> 539 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_TITANIUM.pngbin0 -> 590 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_TUNGSTENSTEEL.pngbin0 -> 556 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PROCESSOR.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PUMP.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIANT_NAQUADAH_ALLOY.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIATIONPROOF.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIOACTIVEHAZARD.pngbin0 -> 682 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RHODIUM_PALLADIUM.pngbin0 -> 3144 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ROBUST_TUNGSTENSTEEL.pngbin0 -> 484 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_SOLID_STEEL.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_STABLE_TITANIUM.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_STRIPES_A.pngbin0 -> 205 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_STRIPES_B.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK.pngbin0 -> 3011 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_0.pngbin0 -> 3335 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_1.pngbin0 -> 3192 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_10.pngbin0 -> 3195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_11.pngbin0 -> 3191 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_12.pngbin0 -> 3191 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_13.pngbin0 -> 3195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_14.pngbin0 -> 3198 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_15.pngbin0 -> 3200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_2.pngbin0 -> 3262 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_3.pngbin0 -> 3318 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_4.pngbin0 -> 3318 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_5.pngbin0 -> 3172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_6.pngbin0 -> 3221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_7.pngbin0 -> 3302 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_8.pngbin0 -> 3302 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_9.pngbin0 -> 3268 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TURBINE.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_VENT.pngbin0 -> 463 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_VENT_T2.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_AWAKENEDDRACONIUM.pngbin0 -> 3164 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_CUPRONICKEL.pngbin0 -> 565 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_ELECTRUMFLUX.pngbin0 -> 3163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_ETERNAL.pngbin0 -> 1031 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_ETERNAL.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HSSG.pngbin0 -> 508 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HSSS.pngbin0 -> 466 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HYPOGEN.pngbin0 -> 3539 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HYPOGEN.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_INFINITY.pngbin0 -> 4388 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_INFINITY.png.mcmeta37
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_KANTHAL.pngbin0 -> 588 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_NAQUADAH.pngbin0 -> 486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_NAQUADAHALLOY.pngbin0 -> 488 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_NICHROME.pngbin0 -> 587 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_SUPERCONDUCTOR.pngbin0 -> 566 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_TRINIUM.pngbin0 -> 491 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_TUNGSTENSTEEL.pngbin0 -> 522 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_BRIDGE.pngbin0 -> 645 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_BRIDGE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_INJECTOR.pngbin0 -> 732 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_TRANS_CASING.pngbin0 -> 550 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_EV_BOTTOM.pngbin0 -> 593 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_EV_SIDE.pngbin0 -> 593 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_EV_TOP.pngbin0 -> 593 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HEATPROOFCASING.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HV_BOTTOM.pngbin0 -> 541 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HV_SIDE.pngbin0 -> 541 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HV_TOP.pngbin0 -> 541 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_IV_BOTTOM.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_IV_SIDE.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_IV_TOP.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LV_BOTTOM.pngbin0 -> 299 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LV_SIDE.pngbin0 -> 299 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LV_TOP.pngbin0 -> 299 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LuV_BOTTOM.pngbin0 -> 425 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LuV_SIDE.pngbin0 -> 425 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LuV_TOP.pngbin0 -> 425 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_BOTTOM.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_SIDE.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_TOP.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAX_BOTTOM.pngbin0 -> 502 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAX_SIDE.pngbin0 -> 502 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAX_TOP.pngbin0 -> 502 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MV_BOTTOM.pngbin0 -> 474 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MV_SIDE.pngbin0 -> 474 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MV_TOP.pngbin0 -> 474 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEELBRICKS_BOTTOM.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEELBRICKS_SIDE.pngbin0 -> 599 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEELBRICKS_TOP.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEEL_BOTTOM.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEEL_SIDE.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEEL_TOP.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_BOTTOM.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_SIDE.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_TOP.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_BOTTOM.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_SIDE.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_TOP.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_BOTTOM.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_SIDE.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_TOP.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UV_BOTTOM.pngbin0 -> 550 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UV_SIDE.pngbin0 -> 550 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UV_TOP.pngbin0 -> 550 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_BOTTOM.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_SIDE.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_TOP.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_ZPM_BOTTOM.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_ZPM_SIDE.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_ZPM_TOP.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS.pngbin0 -> 361 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS_CHISELED.pngbin0 -> 359 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS_CRACKED.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS_MOSSY.pngbin0 -> 555 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_COBBLE.pngbin0 -> 435 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_COBBLE_MOSSY.pngbin0 -> 610 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_SMOOTH.pngbin0 -> 303 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_STONE.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MV_SIDE_CYCLOTRON_SOLENOID.pngbin0 -> 498 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/MV_TOP_CYCLOTRON_SOLENOID.pngbin0 -> 584 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK.pngbin0 -> 625 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK_ACTIVE.pngbin0 -> 638 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK_ACTIVE_GLOW.pngbin0 -> 131 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT.pngbin0 -> 644 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT_ACTIVE.pngbin0 -> 655 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT_ACTIVE_GLOW.pngbin0 -> 131 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP.pngbin0 -> 530 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP_ACTIVE.pngbin0 -> 561 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP_ACTIVE_GLOW.pngbin0 -> 106 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK.pngbin0 -> 625 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK_ACTIVE.pngbin0 -> 638 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK_ACTIVE_GLOW.pngbin0 -> 131 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT.pngbin0 -> 644 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE.pngbin0 -> 655 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE_GLOW.pngbin0 -> 131 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP.pngbin0 -> 530 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP_ACTIVE.pngbin0 -> 561 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP_ACTIVE_GLOW.pngbin0 -> 106 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ACTIVITYDETECTOR.pngbin0 -> 317 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ACTIVITYDETECTOR_GLOW.pngbin0 -> 181 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ADVANCED_REDSTONE_RECEIVER.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ADVANCED_REDSTONE_TRANSMITTER.pngbin0 -> 401 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ADV_PUMP.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ARM.pngbin0 -> 696 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ARM.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE.pngbin0 -> 706 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_GLOW.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE.pngbin0 -> 412 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE_GLOW.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CLOSET.pngbin0 -> 317 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CONTROLLER.pngbin0 -> 288 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CONVEYOR.pngbin0 -> 696 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CONVEYOR.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CRAFTING.pngbin0 -> 325 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DATA_ACCESS.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DRAIN.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DRONE_MODULE_ACTIVE.pngbin0 -> 326 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DTPF_OFF.pngbin0 -> 1081 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DTPF_ON.pngbin0 -> 985 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DTPF_ON.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DUCTTAPE.pngbin0 -> 190 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGYDETECTOR.pngbin0 -> 281 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_MULTI.pngbin0 -> 372 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_POWER.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OFF_WIRELESS.pngbin0 -> 1041 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS.pngbin0 -> 8805 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_MULTI.pngbin0 -> 363 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_POWER.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUIDDETECTOR.pngbin0 -> 293 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR0.pngbin0 -> 506 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR1.pngbin0 -> 583 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR10.pngbin0 -> 533 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR11.pngbin0 -> 527 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR12.pngbin0 -> 521 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR13.pngbin0 -> 505 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR14.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR2.pngbin0 -> 580 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR3.pngbin0 -> 585 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR4.pngbin0 -> 578 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR5.pngbin0 -> 570 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR6.pngbin0 -> 563 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR7.pngbin0 -> 556 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR8.pngbin0 -> 559 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR9.pngbin0 -> 540 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR.pngbin0 -> 175 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR_ACTIVE.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY.pngbin0 -> 5694 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB.pngbin0 -> 235 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB_ACTIVE.pngbin0 -> 327 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB_ACTIVE_GLOW.pngbin0 -> 269 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER_ACTIVE.pngbin0 -> 329 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_ACTIVE.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_ACTIVE_GLOW.pngbin0 -> 400 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_ACTIVE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE.pngbin0 -> 1044 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW.pngbin0 -> 1044 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE.pngbin0 -> 390 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.pngbin0 -> 327 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR.pngbin0 -> 355 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE.pngbin0 -> 346 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR.pngbin0 -> 438 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE.pngbin0 -> 426 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE.pngbin0 -> 300 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE_ACTIVE.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER.pngbin0 -> 278 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER_ACTIVE.pngbin0 -> 330 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE_GLOW.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER_GLOW.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1.pngbin0 -> 535 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1_GLOW.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2.pngbin0 -> 535 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2_GLOW.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3.pngbin0 -> 535 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3_GLOW.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_INPUT_HATCH_2x2.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ITEMDETECTOR.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LENS.pngbin0 -> 268 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_000.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_001.pngbin0 -> 337 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_002.pngbin0 -> 336 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_003.pngbin0 -> 335 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_004.pngbin0 -> 335 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_005.pngbin0 -> 337 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_006.pngbin0 -> 336 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_007.pngbin0 -> 336 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_008.pngbin0 -> 332 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_009.pngbin0 -> 336 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_010.pngbin0 -> 336 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_011.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_012.pngbin0 -> 350 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_013.pngbin0 -> 340 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MAINTENANCE.pngbin0 -> 340 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MAINTENANCE_DETECTOR.pngbin0 -> 329 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_METRICS_TRANSMITTER.pngbin0 -> 1810 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_HATCH.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_HATCH_ACTIVE.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_INPUT_BUFFER.pngbin0 -> 229 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_INPUT_BUS.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_INPUT_SLAVE.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_FLUID_HATCH.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_FLUID_HATCH_ACTIVE.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_HATCH.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_HATCH_ACTIVE.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_FLUID_HATCH.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_HATCH.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_HATCH_ACTIVE.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MUFFLER.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPE.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_BACK.pngbin0 -> 771 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_FRONT.pngbin0 -> 775 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT.pngbin0 -> 362 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT_GLOW.pngbin0 -> 307 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN.pngbin0 -> 792 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN_GLOW.pngbin0 -> 578 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_BACK.pngbin0 -> 728 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_FRONT.pngbin0 -> 735 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT.pngbin0 -> 3067 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT_GLOW.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN.pngbin0 -> 819 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN_GLOW.pngbin0 -> 669 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPE_IN.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPE_OUT.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PUMP.pngbin0 -> 904 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PUMP.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST_GLOW.pngbin0 -> 303 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK.pngbin0 -> 535 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK_GLOW.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_REDSTONE_RECEIVER.pngbin0 -> 378 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_REDSTONE_TRANSMITTER.pngbin0 -> 362 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST_GLOW.pngbin0 -> 303 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN.pngbin0 -> 554 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN_GLOW.pngbin0 -> 306 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SHUTTER.pngbin0 -> 272 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY.pngbin0 -> 5617 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE.pngbin0 -> 8774 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER_ACTIVE.pngbin0 -> 337 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR.pngbin0 -> 291 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE.pngbin0 -> 281 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK.pngbin0 -> 3235 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK_GLOW.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER.pngbin0 -> 422 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE_GLOW.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_GLOW.pngbin0 -> 422 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES.pngbin0 -> 575 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES_GLOW.pngbin0 -> 575 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM.pngbin0 -> 188 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_ACTIVE.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER_ACTIVE.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER_ACTIVE_GLOW.pngbin0 -> 181 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY.pngbin0 -> 289 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE.pngbin0 -> 381 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE.png.mcmeta11
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW.pngbin0 -> 128 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW.png.mcmeta11
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_GLOW.pngbin0 -> 5592 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE.pngbin0 -> 978 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW.pngbin0 -> 978 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_VALVE.pngbin0 -> 3256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_VALVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_ACTIVITYDETECTOR.pngbin0 -> 396 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_FLUID_DETECTOR.pngbin0 -> 377 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_ITEM_DETECTOR.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_MAINTENANCE_DETECTOR.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_DL.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_DOWN.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_DR.pngbin0 -> 268 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_LEFT.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_LR.pngbin0 -> 281 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_ND.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_NL.pngbin0 -> 319 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_NR.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_NU.pngbin0 -> 334 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_RD.pngbin0 -> 268 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_RIGHT.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UD.pngbin0 -> 278 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UL.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UP.pngbin0 -> 222 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UR.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/RENDERING_ERROR.pngbin0 -> 150 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_8V.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_EV.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_HV.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_IV.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_LV.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_LuV.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_MV.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UEV.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UHV.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UIV.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UV.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_ZPM.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE.pngbin0 -> 685 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_ACTIVE.pngbin0 -> 1251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_ACTIVE.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP_ACTIVE.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP_ACTIVE_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP_GLOW.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STONES_MARBLE.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/STRUCTURE_MARK.pngbin0 -> 799 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/TRANSPARENT.pngbin0 -> 1020 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UEV_SIDE_CYCLOTRON_SOLENOID.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UEV_TOP_CYCLOTRON_SOLENOID.pngbin0 -> 620 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UHV_SIDE_CYCLOTRON_SOLENOID.pngbin0 -> 463 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UHV_TOP_CYCLOTRON_SOLENOID.pngbin0 -> 616 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UIV_SIDE_CYCLOTRON_SOLENOID.pngbin0 -> 457 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UIV_TOP_CYCLOTRON_SOLENOID.pngbin0 -> 637 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UMV_SIDE_CYCLOTRON_SOLENOID.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UMV_TOP_CYCLOTRON_SOLENOID.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UV_SIDE_CYCLOTRON_SOLENOID.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/UV_TOP_CYCLOTRON_SOLENOID.pngbin0 -> 621 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_ADVANCED.pngbin0 -> 720 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_ADVANCED.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_NORMAL.pngbin0 -> 606 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_NORMAL.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/VOID.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ZPM_SIDE_CYCLOTRON_SOLENOID.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/ZPM_TOP_CYCLOTRON_SOLENOID.pngbin0 -> 591 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block1.pngbin0 -> 1676 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block1.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block2.pngbin0 -> 1635 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block2.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block3.pngbin0 -> 1708 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block3.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block4.pngbin0 -> 1683 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block4.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block5.pngbin0 -> 1595 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block5.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block6.pngbin0 -> 1676 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block6.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/foil.pngbin0 -> 1665 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/frameGt.pngbin0 -> 1477 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/frameGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/ore.pngbin0 -> 1215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/ore.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/oreSmall.pngbin0 -> 1286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/oreSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeHuge.pngbin0 -> 1693 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeHuge.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeLarge.pngbin0 -> 1705 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeLarge.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeMedium.pngbin0 -> 1696 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeMedium.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeNonuple.pngbin0 -> 1638 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeNonuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeQuadruple.pngbin0 -> 1728 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSide.pngbin0 -> 1645 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSide.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSmall.pngbin0 -> 1678 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeTiny.pngbin0 -> 1658 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeTiny.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/void.pngbin0 -> 1094 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/wire.pngbin0 -> 1729 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/wire.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block1.pngbin0 -> 23585 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block1.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block2.pngbin0 -> 23322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block2.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block3.pngbin0 -> 25049 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block3.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block4.pngbin0 -> 26354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block4.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block5.pngbin0 -> 15857 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block5.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block6.pngbin0 -> 23585 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block6.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/foil.pngbin0 -> 18334 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/frameGt.pngbin0 -> 16153 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/frameGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/ore.pngbin0 -> 6053 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/ore.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/oreSmall.pngbin0 -> 10858 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/oreSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeHuge.pngbin0 -> 22374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeHuge.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeLarge.pngbin0 -> 27008 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeLarge.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeMedium.pngbin0 -> 26668 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeMedium.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeNonuple.pngbin0 -> 20943 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeNonuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeQuadruple.pngbin0 -> 24492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSide.pngbin0 -> 24079 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSide.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSmall.pngbin0 -> 25612 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeTiny.pngbin0 -> 24980 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeTiny.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/void.pngbin0 -> 263 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/wire.pngbin0 -> 31828 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/wire.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block1.pngbin0 -> 764 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block1.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block2.pngbin0 -> 764 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block2.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block3.pngbin0 -> 769 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block3.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block4.pngbin0 -> 767 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block4.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block5.pngbin0 -> 764 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block5.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block6.pngbin0 -> 764 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block6.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/foil.pngbin0 -> 763 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/frameGt.pngbin0 -> 660 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/frameGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/ore.pngbin0 -> 231 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/ore.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/oreSmall.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/oreSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeHuge.pngbin0 -> 767 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeHuge.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeLarge.pngbin0 -> 779 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeLarge.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeMedium.pngbin0 -> 775 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeMedium.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeNonuple.pngbin0 -> 783 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeNonuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeQuadruple.pngbin0 -> 774 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSide.pngbin0 -> 766 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSide.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSmall.pngbin0 -> 772 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeTiny.pngbin0 -> 771 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeTiny.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/void.pngbin0 -> 74 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/wire.pngbin0 -> 765 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/wire.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block1.pngbin0 -> 1624 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block1.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block2.pngbin0 -> 1607 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block2.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block3.pngbin0 -> 1683 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block3.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block4.pngbin0 -> 1670 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block4.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block5.pngbin0 -> 1562 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block5.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block6.pngbin0 -> 1624 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block6.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/foil.pngbin0 -> 1557 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/frameGt.pngbin0 -> 1467 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/frameGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/ore.pngbin0 -> 1214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/ore.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/oreSmall.pngbin0 -> 1272 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/oreSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeHuge.pngbin0 -> 1637 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeHuge.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeLarge.pngbin0 -> 1643 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeLarge.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeMedium.pngbin0 -> 1653 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeMedium.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeNonuple.pngbin0 -> 1583 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeNonuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeQuadruple.pngbin0 -> 1644 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSide.pngbin0 -> 1612 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSide.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSmall.pngbin0 -> 1635 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeTiny.pngbin0 -> 1620 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeTiny.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/void.pngbin0 -> 1094 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/wire.pngbin0 -> 1629 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/wire.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/frameGt.pngbin0 -> 3798 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/frameGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block1.pngbin0 -> 5133 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block2.pngbin0 -> 5485 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block3.pngbin0 -> 5355 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block4.pngbin0 -> 5497 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block5.pngbin0 -> 5080 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block6.pngbin0 -> 5133 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/foil.pngbin0 -> 5274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/frameGt.pngbin0 -> 5235 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/ore.pngbin0 -> 4976 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/oreSmall.pngbin0 -> 5091 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeHuge.pngbin0 -> 5141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeLarge.pngbin0 -> 5045 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeMedium.pngbin0 -> 4990 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeNonuple.pngbin0 -> 4953 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeQuadruple.pngbin0 -> 5112 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeSide.pngbin0 -> 4813 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeSmall.pngbin0 -> 4878 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeTiny.pngbin0 -> 4866 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/void.pngbin0 -> 4761 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/wire.pngbin0 -> 5427 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/foil.pngbin0 -> 14200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/frameGt.pngbin0 -> 12155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/frameGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/void.pngbin0 -> 100 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block1.pngbin0 -> 18411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block1.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block2.pngbin0 -> 19520 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block2.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block3.pngbin0 -> 21324 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block3.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block4.pngbin0 -> 20067 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block4.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block5.pngbin0 -> 18582 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block5.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block6.pngbin0 -> 18411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block6.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/foil.pngbin0 -> 17587 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/frameGt.pngbin0 -> 17841 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/frameGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/ore.pngbin0 -> 4179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/ore.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/oreSmall.pngbin0 -> 4831 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/oreSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeHuge.pngbin0 -> 9461 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeHuge.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeLarge.pngbin0 -> 15161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeLarge.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeMedium.pngbin0 -> 16819 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeMedium.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeNonuple.pngbin0 -> 11235 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeNonuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeQuadruple.pngbin0 -> 10399 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSide.pngbin0 -> 18072 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSide.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSmall.pngbin0 -> 17964 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeTiny.pngbin0 -> 18406 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeTiny.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/void.pngbin0 -> 110 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/wire.pngbin0 -> 19039 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/wire.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/foil.pngbin0 -> 7231 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/frameGt.pngbin0 -> 4983 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/frameGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/frameGt_OVERLAY.pngbin0 -> 2840 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/void.pngbin0 -> 2731 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/BLOCK_SPACETIME.pngbin0 -> 20524 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block1.pngbin0 -> 20800 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block1.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block2.pngbin0 -> 20858 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block2.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block3.pngbin0 -> 22534 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block3.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block4.pngbin0 -> 22588 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block4.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block5.pngbin0 -> 17845 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block5.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block6.pngbin0 -> 20800 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block6.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/foil.pngbin0 -> 14205 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/frameGt.pngbin0 -> 14539 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/frameGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/ore.pngbin0 -> 4568 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/ore.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/oreSmall.pngbin0 -> 5180 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/oreSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeHuge.pngbin0 -> 11257 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeHuge.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeLarge.pngbin0 -> 15966 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeLarge.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeMedium.pngbin0 -> 16849 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeMedium.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeNonuple.pngbin0 -> 11962 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeNonuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeQuadruple.pngbin0 -> 11270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSide.pngbin0 -> 16843 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSide.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSmall.pngbin0 -> 17261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeTiny.pngbin0 -> 17256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeTiny.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/void.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/wire.pngbin0 -> 20183 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/wire.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block1.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block2.pngbin0 -> 620 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block3.pngbin0 -> 642 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block4.pngbin0 -> 655 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block5.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block6.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/foil.pngbin0 -> 368 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/frameGt.pngbin0 -> 441 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/ore.pngbin0 -> 249 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/oreSmall.pngbin0 -> 339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeHuge.pngbin0 -> 348 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeLarge.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeMedium.pngbin0 -> 442 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeNonuple.pngbin0 -> 497 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeQuadruple.pngbin0 -> 521 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeSide.pngbin0 -> 401 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeSmall.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeTiny.pngbin0 -> 418 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/void.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/wire.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block1.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/ore.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block1.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/ore.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block1.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/ore.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block1.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/ore.pngbin0 -> 209 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block1.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/ore.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block1.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/ore.pngbin0 -> 303 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block1.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/ore.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block1.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/ore.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block1.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/ore.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block1.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/ore.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block1.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/ore.pngbin0 -> 303 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block1.pngbin0 -> 569 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/ore.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeHuge.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeLarge.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeMedium.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeNonuple.pngbin0 -> 430 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeQuadruple.pngbin0 -> 440 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeSide.pngbin0 -> 525 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeSmall.pngbin0 -> 515 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeTiny.pngbin0 -> 533 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block1.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/ore.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block1.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/ore.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block1.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/ore.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block1.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/ore.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block1.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/ore.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block1.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/ore.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block1.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/ore.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block1.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/ore.pngbin0 -> 303 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block1.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/ore.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block1.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/ore.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block1.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/ore.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block1.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/ore.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block1.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/ore.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block1.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/ore.pngbin0 -> 209 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeHuge.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeLarge.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeMedium.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeNonuple.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeQuadruple.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeSide.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeSmall.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeTiny.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block1.pngbin0 -> 569 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block2.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block3.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block4.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block6.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/foil.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/frameGt.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/ore.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/oreSmall.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeHuge.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeLarge.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeMedium.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeNonuple.pngbin0 -> 430 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeQuadruple.pngbin0 -> 440 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeSide.pngbin0 -> 525 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeSmall.pngbin0 -> 515 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeTiny.pngbin0 -> 533 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/wire.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/active.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/active_glow.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/base.pngbin0 -> 289 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/inactive.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/inactive_glow.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/BlackLaserEngraver/base.pngbin0 -> 705 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/Laserblock/base.pngbin0 -> 307 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/active.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/active_glow.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/base.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/inactive.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/inactive_glow.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/amperage/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/cleanroom/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/active.pngbin0 -> 379 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/active_glow.pngbin0 -> 306 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/base.pngbin0 -> 453 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/inactive.pngbin0 -> 209 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/conveyor/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/active.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/active_glow.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/base.pngbin0 -> 459 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/inactive.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/inactive_glow.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/emitter/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/fieldGenerator/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/heater/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/insulator/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/inventory/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/laser/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade1/base.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade2/base.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade3/base.pngbin0 -> 486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade4/base.pngbin0 -> 543 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/active.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/active_glow.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/inactive.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/inactive_glow.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/motor/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/piston/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/pump/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/robotArm/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/sensor/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/tank/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/multitileentity/wireless/base.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/entity/arrow.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/entity/arrow_potions.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/1by1.pngbin0 -> 1502 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/2by2.pngbin0 -> 1535 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/3by3.pngbin0 -> 1543 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/4by4.pngbin0 -> 1566 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/AdvancedCraftingTable.pngbin0 -> 1991 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/BasicTank.pngbin0 -> 1710 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/BronzeCraftingTable.pngbin0 -> 1928 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/ComputerCubeRedstone.pngbin0 -> 2290 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/CropHarvestor.pngbin0 -> 1858 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/ElectricAutoWorkbench.pngbin0 -> 2797 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/ElectricBufferSmall.pngbin0 -> 1859 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/ElectricItemCleaner.pngbin0 -> 1854 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/GuiButtons.pngbin0 -> 19542 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/GuiCover.pngbin0 -> 6998 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/GuiTabs.pngbin0 -> 924 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/Implosion.pngbin0 -> 2003 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/InventoryManager.pngbin0 -> 3462 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/MagicAbsorber.pngbin0 -> 3530 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/RedstoneCircuitBlock.pngbin0 -> 2208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/Retriever.pngbin0 -> 1831 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/Safe.pngbin0 -> 1499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/Sonictron.pngbin0 -> 1570 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/Tradeomat_Inventory.pngbin0 -> 1452 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/Tradeomat_Main.pngbin0 -> 1661 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/Tradeomat_Settings.pngbin0 -> 1658 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/armorgui3x3.pngbin0 -> 2847 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/armorgui3x4.pngbin0 -> 3812 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/background/bronze.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/background/fusion_computer.pngbin0 -> 1395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/background/nei_single_recipe.pngbin0 -> 150 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/background/primitive.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/background/singleblock_default.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/background/steel.pngbin0 -> 428 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/background/text_field.pngbin0 -> 132 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/background/text_field_light_gray.pngbin0 -> 108 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/basicmachines/Default.pngbin0 -> 2034 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/basicmachines/LCRNEI.pngbin0 -> 2841 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/button/cover_normal.pngbin0 -> 637 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/button/cover_normal_disabled.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/button/cover_normal_hovered.pngbin0 -> 710 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/button/standard.pngbin0 -> 495 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/button/standard_disabled.pngbin0 -> 5675 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/button/standard_pressed.pngbin0 -> 505 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/button/standard_toggle.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/button/standard_toggle_disabled.pngbin0 -> 5846 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/button/void_all.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/multimachines/MultiblockDisplay.pngbin0 -> 1594 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/allow_input.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/allow_output.pngbin0 -> 2962 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/analog.pngbin0 -> 181 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/arrow_green_down.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/arrow_green_up.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/auto_pull_me.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/auto_pull_me_disabled.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/autooutput_fluid.pngbin0 -> 137 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/autooutput_item.pngbin0 -> 130 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_off.pngbin0 -> 614 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_off_disabled.pngbin0 -> 6163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_on.pngbin0 -> 664 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_on_disabled.pngbin0 -> 659 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/blacklist.pngbin0 -> 167 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/block_input.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/block_output.pngbin0 -> 2945 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/bounding_box.pngbin0 -> 560 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/checkmark.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/chunkloading.pngbin0 -> 1573 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/chunkloading_off.pngbin0 -> 1599 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/cross.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/cyclic.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/disable.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/down_tiering_off.pngbin0 -> 629 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/down_tiering_on.pngbin0 -> 611 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/emit_energy.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/emit_redstone.pngbin0 -> 151 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/export.pngbin0 -> 219 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/forbidden.pngbin0 -> 842 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_and.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_nand.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_nor.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_or.pngbin0 -> 243 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/hourglass.pngbin0 -> 7562 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/import.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/input_from_output_side.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_off.pngbin0 -> 620 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_off_disabled.pngbin0 -> 619 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_on.pngbin0 -> 669 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_on_disabled.pngbin0 -> 682 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/invert_filter.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/invert_redstone.pngbin0 -> 136 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/lock.pngbin0 -> 156 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/lock_small.pngbin0 -> 2211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/minus_large.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/minus_small.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/nbt.pngbin0 -> 136 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/nei.pngbin0 -> 151 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/one_stack_limit.pngbin0 -> 10548 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/plus_large.pngbin0 -> 512 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/plus_small.pngbin0 -> 512 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/power_switch_off.pngbin0 -> 6002 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/power_switch_on.pngbin0 -> 6219 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/print.pngbin0 -> 542 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/progress.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_locked.pngbin0 -> 699 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_locked_disabled.pngbin0 -> 696 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_unlocked.pngbin0 -> 677 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_unlocked_disabled.pngbin0 -> 671 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/redstone_off.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/redstone_on.pngbin0 -> 225 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/replace_cobble_off.pngbin0 -> 768 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/replace_cobble_on.pngbin0 -> 705 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/retract_pipes.pngbin0 -> 1042 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/sorting_mode.pngbin0 -> 10100 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/stocking_mode.pngbin0 -> 180 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/tank_void_all.pngbin0 -> 171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/tank_void_excess.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/transpose.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/use_inverted_processing_state.pngbin0 -> 2937 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/use_processing_state.pngbin0 -> 2935 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_all.pngbin0 -> 802 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_fluid.pngbin0 -> 784 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_item.pngbin0 -> 769 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_none.pngbin0 -> 772 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/whitelist.pngbin0 -> 167 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_button/work_area.pngbin0 -> 770 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/arrow_me.pngbin0 -> 130 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/beaker_1.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/beaker_2.pngbin0 -> 173 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/bee_drone.pngbin0 -> 225 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/bee_queen.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/bender.pngbin0 -> 115 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/block.pngbin0 -> 352 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/block_bronze.pngbin0 -> 323 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/block_primitive.pngbin0 -> 347 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/block_steel.pngbin0 -> 369 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/box.pngbin0 -> 116 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/boxed.pngbin0 -> 118 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/canister.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/canister_bronze.pngbin0 -> 146 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/canister_steel.pngbin0 -> 145 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/canner.pngbin0 -> 128 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/cauldron.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge.pngbin0 -> 132 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge_bronze.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge_fluid.pngbin0 -> 151 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge_steel.pngbin0 -> 156 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/charger.pngbin0 -> 113 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/charger_fluid.pngbin0 -> 150 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/circuit.pngbin0 -> 120 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/coal_bronze.pngbin0 -> 147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/coal_steel.pngbin0 -> 147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/compressor.pngbin0 -> 111 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/compressor_bronze.pngbin0 -> 115 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/compressor_steel.pngbin0 -> 116 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/crushed_ore.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/crushed_ore_bronze.pngbin0 -> 171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/crushed_ore_steel.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/cutter_sliced.pngbin0 -> 115 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/data_orb.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/data_stick.pngbin0 -> 117 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust.pngbin0 -> 137 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust_bronze.pngbin0 -> 162 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust_primitive.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust_steel.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/explosive.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/extruder_shape.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace_bronze.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace_primitive.pngbin0 -> 175 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace_steel.pngbin0 -> 175 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/gem.pngbin0 -> 135 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/hammer.pngbin0 -> 120 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/hammer_bronze.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/hammer_steel.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/heater_1.pngbin0 -> 176 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/heater_2.pngbin0 -> 173 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/implosion.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/in.pngbin0 -> 122 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/in_bronze.pngbin0 -> 121 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/in_steel.pngbin0 -> 121 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/ingot_bronze.pngbin0 -> 181 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/ingot_primitive.pngbin0 -> 182 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/int_circuit.pngbin0 -> 343 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/lens.pngbin0 -> 355 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/microscope.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/mining_pipe.pngbin0 -> 5666 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/mold.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/molecular_1.pngbin0 -> 171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/molecular_2.pngbin0 -> 169 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/molecular_3.pngbin0 -> 169 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_0.pngbin0 -> 117 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_1.pngbin0 -> 107 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_10.pngbin0 -> 130 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_11.pngbin0 -> 112 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_2.pngbin0 -> 111 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_3.pngbin0 -> 111 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_4.pngbin0 -> 114 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_5.pngbin0 -> 111 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_6.pngbin0 -> 115 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_7.pngbin0 -> 106 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_8.pngbin0 -> 103 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_9.pngbin0 -> 113 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/out.pngbin0 -> 124 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/out_bronze.pngbin0 -> 123 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/out_steel.pngbin0 -> 124 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/page_blank.pngbin0 -> 100 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/page_printed.pngbin0 -> 127 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/pattern_me.pngbin0 -> 421 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/press_1.pngbin0 -> 124 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/press_2.pngbin0 -> 127 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/press_3.pngbin0 -> 130 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/recycle.pngbin0 -> 156 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/rod_1.pngbin0 -> 124 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/rod_2.pngbin0 -> 126 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/slice_shape.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/slicer_sliced.pngbin0 -> 107 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/square.pngbin0 -> 100 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/uua.pngbin0 -> 110 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/uum.pngbin0 -> 114 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/vial_1.pngbin0 -> 146 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/vial_2.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/wiremill.pngbin0 -> 136 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/overlay_slot/wrench.pngbin0 -> 132 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/alloy_smelter_molding.pngbin0 -> 448 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/alloy_smelter_recycling.pngbin0 -> 350 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/arc_furnace_recycling.pngbin0 -> 325 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/arrow_22_blue.pngbin0 -> 175 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/arrow_22_red.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/arrow_22_white.pngbin0 -> 175 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/arrow_24_blue.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/arrow_24_red.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/arrow_24_white.pngbin0 -> 192 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/arrow_double.pngbin0 -> 118 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/fluid_extractor_recycling.pngbin0 -> 336 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/fluid_in.pngbin0 -> 1692 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/fluid_out.pngbin0 -> 1699 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/fluid_tank.pngbin0 -> 115 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/fluid_window.pngbin0 -> 150 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/forge_hammer_recycling.pngbin0 -> 344 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/gauge.pngbin0 -> 115 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_bronze.pngbin0 -> 145 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_gray.pngbin0 -> 140 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_primitive.pngbin0 -> 145 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_steel.pngbin0 -> 145 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_18x18.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_19x19.pngbin0 -> 199 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/information.pngbin0 -> 96 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/item_in.pngbin0 -> 1700 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/item_out.pngbin0 -> 1696 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/macerator_recycling.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/plasma_arc_furnace_recycling.pngbin0 -> 325 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/radiation_warning.pngbin0 -> 1006 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/screen_black.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/slots_holo_3by3.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/square_light_gray.pngbin0 -> 85 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/stalled_electricity.pngbin0 -> 122 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/stalled_steam.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/super_buffer.pngbin0 -> 2183 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/tic_bolt_molding.pngbin0 -> 320 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/tic_part_extruding.pngbin0 -> 345 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/transparent.pngbin0 -> 92 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/arrow.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_2_bronze.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_2_primitive.pngbin0 -> 206 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_bronze.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_multiple.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_steel.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/assemble.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/assemblyline_1.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/assemblyline_2.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/assemblyline_3.pngbin0 -> 167 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/bath.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/bending.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_empty_bronze.pngbin0 -> 106 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_empty_steel.pngbin0 -> 106 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_heat.pngbin0 -> 103 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_steam.pngbin0 -> 105 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_water.pngbin0 -> 100 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/canner.pngbin0 -> 252 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/circuit_assembler.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/compress.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/compress_bronze.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/compress_steel.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/cut.pngbin0 -> 153 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/extract.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/extract_bronze.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/extract_steel.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/extrude.pngbin0 -> 190 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/fuel_bronze.pngbin0 -> 301 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/fuel_steel.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/hammer.pngbin0 -> 137 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_base.pngbin0 -> 111 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_base_bronze.pngbin0 -> 105 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_base_steel.pngbin0 -> 104 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_bronze.pngbin0 -> 136 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_steel.pngbin0 -> 136 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/lathe.pngbin0 -> 150 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/lathe_base.pngbin0 -> 90 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/macerate.pngbin0 -> 260 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/macerate_bronze.pngbin0 -> 262 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/macerate_steel.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/magnet.pngbin0 -> 218 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/mixer.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/recycle.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/sift.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/slice.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/stored_eu.pngbin0 -> 123 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/progressbar/wiremill.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/slot/dark_gray.pngbin0 -> 95 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/slot/fluid_bronze.pngbin0 -> 102 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/slot/fluid_primitive.pngbin0 -> 102 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/slot/fluid_steel.pngbin0 -> 102 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/slot/item_bronze.pngbin0 -> 112 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/slot/item_primitive.pngbin0 -> 99 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/slot/item_steel.pngbin0 -> 112 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/slot/item_uplifted.pngbin0 -> 96 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/slot/maintenance.pngbin0 -> 172 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/cover_bronze_disabled.pngbin0 -> 103 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/cover_bronze_highlight.pngbin0 -> 103 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/cover_bronze_normal.pngbin0 -> 103 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/cover_disabled.pngbin0 -> 104 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/cover_highlight.pngbin0 -> 101 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/cover_normal.pngbin0 -> 101 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/cover_primitive_disabled.pngbin0 -> 108 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/cover_primitive_highlight.pngbin0 -> 109 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/cover_primitive_normal.pngbin0 -> 109 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/cover_steel_disabled.pngbin0 -> 104 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/cover_steel_highlight.pngbin0 -> 104 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/cover_steel_normal.pngbin0 -> 104 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/title.pngbin0 -> 122 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/title_angular.pngbin0 -> 113 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/title_angular_bronze.pngbin0 -> 120 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/title_angular_primitive.pngbin0 -> 121 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/title_angular_steel.pngbin0 -> 121 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/title_bronze.pngbin0 -> 129 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/title_dark.pngbin0 -> 127 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/title_dark_bronze.pngbin0 -> 129 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/title_dark_primitive.pngbin0 -> 129 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/title_dark_steel.pngbin0 -> 129 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/title_primitive.pngbin0 -> 130 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/tab/title_steel.pngbin0 -> 129 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/void.pngbin0 -> 132 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/guiColors.json69
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.1080k_Space_Coolantcell.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.180k_Helium_Coolantcell.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.180k_NaK_Coolantcell.pngbin0 -> 313 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.180k_Space_Coolantcell.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.360k_Helium_Coolantcell.pngbin0 -> 289 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.360k_NaK_Coolantcell.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.360k_Space_Coolantcell.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.540k_Space_Coolantcell.pngbin0 -> 244 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.60k_Helium_Coolantcell.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.60k_NaK_Coolantcell.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Double_MNqCell.pngbin0 -> 260 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Double_MNqCellDep.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Double_Naquadahcell.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Double_NaquadahcellDep.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Double_Thoriumcell.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Double_ThoriumcellDep.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.MNqCell.pngbin0 -> 223 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.MNqCellDep.pngbin0 -> 225 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Naquadahcell.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.NaquadahcellDep.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Quad_MNqCell.pngbin0 -> 347 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Quad_MNqCellDep.pngbin0 -> 348 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Quad_Naquadahcell.pngbin0 -> 337 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Quad_NaquadahcellDep.pngbin0 -> 337 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Quad_Thoriumcell.pngbin0 -> 346 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Quad_ThoriumcellDep.pngbin0 -> 346 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Thoriumcell.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.ThoriumcellDep.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.window.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.advancedsensorcard.pngbin0 -> 7624 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.advancedsensorcardburned.pngbin0 -> 6106 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.glowstoneCell.pngbin0 -> 1779 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit.pngbin0 -> 231 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/0.pngbin0 -> 601 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/1.pngbin0 -> 593 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/10.pngbin0 -> 603 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/11.pngbin0 -> 603 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/12.pngbin0 -> 598 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/13.pngbin0 -> 603 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/14.pngbin0 -> 604 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/15.pngbin0 -> 601 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/16.pngbin0 -> 598 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/17.pngbin0 -> 603 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/18.pngbin0 -> 598 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/19.pngbin0 -> 601 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/2.pngbin0 -> 592 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/20.pngbin0 -> 606 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/21.pngbin0 -> 601 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/22.pngbin0 -> 593 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/23.pngbin0 -> 601 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/24.pngbin0 -> 609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/3.pngbin0 -> 597 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/4.pngbin0 -> 602 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/5.pngbin0 -> 600 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/6.pngbin0 -> 599 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/7.pngbin0 -> 594 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/8.pngbin0 -> 599 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/9.pngbin0 -> 600 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/0.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/1.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/10.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/100.pngbin0 -> 565 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/101.pngbin0 -> 592 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/11.pngbin0 -> 409 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/110.pngbin0 -> 262 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/111.pngbin0 -> 262 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/13.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/14.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/1.pngbin0 -> 3628 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/2.pngbin0 -> 3818 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/3.pngbin0 -> 3603 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/4.pngbin0 -> 2028 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/5.pngbin0 -> 2011 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/6.pngbin0 -> 2025 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/7.pngbin0 -> 2017 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/8.pngbin0 -> 2011 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/1.pngbin0 -> 3626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/2.pngbin0 -> 3351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/3.pngbin0 -> 3425 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/4.pngbin0 -> 3423 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/5.pngbin0 -> 3430 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/6.pngbin0 -> 3434 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/7.pngbin0 -> 2017 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/8.pngbin0 -> 2011 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/15.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/16.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/17.pngbin0 -> 5274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/18.pngbin0 -> 5784 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/18.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/19.pngbin0 -> 2381 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/19.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/2.pngbin0 -> 382 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/20.pngbin0 -> 6410 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/20.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/200.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/201.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/202.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/203.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/204.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/205.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/206.pngbin0 -> 349 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/207.pngbin0 -> 349 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/208.pngbin0 -> 334 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/21.pngbin0 -> 1274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/22.pngbin0 -> 5797 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/22.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/225.pngbin0 -> 241 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/226.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/227.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/228.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/229.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/23.pngbin0 -> 1748 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/23.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/230.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/231.pngbin0 -> 247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/232.pngbin0 -> 247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/233.pngbin0 -> 249 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/24.pngbin0 -> 5766 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/24.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/25.pngbin0 -> 5489 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/250.pngbin0 -> 219 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/251.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/252.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/253.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/254.pngbin0 -> 219 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/255.pngbin0 -> 219 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/256.pngbin0 -> 218 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/257.pngbin0 -> 218 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/258.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/26.pngbin0 -> 4818 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/26.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/27.pngbin0 -> 2439 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/27.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/270.pngbin0 -> 1729 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/271.pngbin0 -> 1729 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/272.pngbin0 -> 191 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/28.pngbin0 -> 4682 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/28.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/29.pngbin0 -> 5209 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/3.pngbin0 -> 372 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/30.pngbin0 -> 3538 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/30.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/300.pngbin0 -> 3019 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/301.pngbin0 -> 439 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/302.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/303.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/304.pngbin0 -> 438 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/305.pngbin0 -> 452 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/306.pngbin0 -> 428 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/307.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/308.pngbin0 -> 407 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/309.pngbin0 -> 512 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/31.pngbin0 -> 763 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/31.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/310.pngbin0 -> 464 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/311.pngbin0 -> 440 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/312.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/313.pngbin0 -> 433 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/314.pngbin0 -> 437 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/315.pngbin0 -> 456 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/316.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/317.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/318.pngbin0 -> 3060 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/319.pngbin0 -> 3056 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/32.pngbin0 -> 3543 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/32.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/320.pngbin0 -> 3097 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/321.pngbin0 -> 3103 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/322.pngbin0 -> 3127 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/323.pngbin0 -> 3033 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/324.pngbin0 -> 3217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/325.pngbin0 -> 3140 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/326.pngbin0 -> 3058 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/327.pngbin0 -> 3063 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/328.pngbin0 -> 3072 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/329.pngbin0 -> 3073 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/33.pngbin0 -> 1299 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/330.pngbin0 -> 3089 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/331.pngbin0 -> 5548 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/332.pngbin0 -> 11089 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/333.pngbin0 -> 11103 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/334.pngbin0 -> 11099 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/335.pngbin0 -> 11048 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/336.pngbin0 -> 11039 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/34.pngbin0 -> 3629 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/34.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/35.pngbin0 -> 1146 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/35.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/350.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/351.pngbin0 -> 399 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/352.pngbin0 -> 386 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/353.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/354.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/355.pngbin0 -> 392 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/356.pngbin0 -> 377 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/357.pngbin0 -> 441 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/358.pngbin0 -> 400 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/359.pngbin0 -> 421 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/36.pngbin0 -> 3554 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/36.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/360.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/361.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/362.pngbin0 -> 467 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/363.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/364.pngbin0 -> 339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/365.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/366.pngbin0 -> 400 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/367.pngbin0 -> 359 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/368.pngbin0 -> 403 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/369.pngbin0 -> 389 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/37.pngbin0 -> 1277 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/370.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/371.pngbin0 -> 377 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/372.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/373.pngbin0 -> 362 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/374.pngbin0 -> 3119 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/375.pngbin0 -> 3088 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/376.pngbin0 -> 3054 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/377.pngbin0 -> 5447 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/38.pngbin0 -> 4564 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/38.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/39.pngbin0 -> 1682 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/39.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/398.pngbin0 -> 445 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/399.pngbin0 -> 515 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/4.pngbin0 -> 370 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/40.pngbin0 -> 4706 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/40.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/400.pngbin0 -> 225 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/401.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/402.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/403.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/404.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/405.pngbin0 -> 247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/406.pngbin0 -> 223 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/407.pngbin0 -> 2897 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/408.pngbin0 -> 2886 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/409.pngbin0 -> 2855 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/41.pngbin0 -> 1281 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/410.pngbin0 -> 2846 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/411.pngbin0 -> 2897 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/412.pngbin0 -> 2897 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/413.pngbin0 -> 2890 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/415.pngbin0 -> 334541 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/415.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/416.pngbin0 -> 51387 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/416.png.mcmeta6
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/417.pngbin0 -> 342712 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/417.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/42.pngbin0 -> 5857 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/42.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/427.pngbin0 -> 1821 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/427.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/428.pngbin0 -> 3504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/428.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/429.pngbin0 -> 1375 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/429.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/43.pngbin0 -> 1256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/43.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/430.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/431.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/432.pngbin0 -> 352 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/433.pngbin0 -> 352 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/434.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/435.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/436.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/437.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/438.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/439.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/44.pngbin0 -> 6227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/44.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/440.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/441.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/442.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/443.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/444.pngbin0 -> 350 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/445.pngbin0 -> 350 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/446.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/447.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/448.pngbin0 -> 249 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/449.pngbin0 -> 249 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/45.pngbin0 -> 1478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/450.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/451.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/452.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/453.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/454.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/455.pngbin0 -> 357 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/456.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/457.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/458.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/459.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/46.pngbin0 -> 4620 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/46.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/460.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/461.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/462.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/463.pngbin0 -> 334 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/464.pngbin0 -> 338 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/465.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/466.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/467.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/47.pngbin0 -> 2499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/47.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/471.pngbin0 -> 450 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/472.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/473.pngbin0 -> 595 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/474.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/475.pngbin0 -> 393 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/476.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/477.pngbin0 -> 647 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/478.pngbin0 -> 697 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/479.pngbin0 -> 647 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/48.pngbin0 -> 4588 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/48.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/480.pngbin0 -> 336 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/481.pngbin0 -> 329 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/482.pngbin0 -> 319 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/483.pngbin0 -> 377 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/484.pngbin0 -> 339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/485.pngbin0 -> 585 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/486.pngbin0 -> 614 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/487.pngbin0 -> 329 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/488.pngbin0 -> 370 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/489.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/490.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/491.pngbin0 -> 314 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/495.pngbin0 -> 300 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/496.pngbin0 -> 307 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/497.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/498.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/499.pngbin0 -> 482 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/5.pngbin0 -> 378 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/500.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/501.pngbin0 -> 260 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/502.pngbin0 -> 276 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510.pngbin0 -> 262 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/1.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/2.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/3.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/4.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/5.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/6.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/7.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/8.pngbin0 -> 262 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/1.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/2.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/3.pngbin0 -> 262 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/4.pngbin0 -> 262 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/5.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/6.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/7.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/8.pngbin0 -> 261 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/1.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/2.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/3.pngbin0 -> 247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/4.pngbin0 -> 247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/5.pngbin0 -> 247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/6.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/7.pngbin0 -> 247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/8.pngbin0 -> 247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/1.pngbin0 -> 257 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/2.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/3.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/4.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/5.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/6.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/7.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/8.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/1.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/2.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/3.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/4.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/5.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/6.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/7.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/8.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/1.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/2.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/3.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/4.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/5.pngbin0 -> 272 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/6.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/7.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/8.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/1.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/2.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/3.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/4.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/5.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/6.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/7.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/8.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/1.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/2.pngbin0 -> 282 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/3.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/4.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/5.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/6.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/7.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/8.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/1.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/2.pngbin0 -> 282 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/3.pngbin0 -> 282 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/4.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/5.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/6.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/7.pngbin0 -> 282 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/8.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/1.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/2.pngbin0 -> 282 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/3.pngbin0 -> 282 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/4.pngbin0 -> 282 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/5.pngbin0 -> 282 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/6.pngbin0 -> 281 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/7.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/8.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/1.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/2.pngbin0 -> 277 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/3.pngbin0 -> 277 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/4.pngbin0 -> 277 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/5.pngbin0 -> 276 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/6.pngbin0 -> 276 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/7.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/8.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/1.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/2.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/3.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/4.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/5.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/6.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/7.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/8.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/1.pngbin0 -> 277 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/2.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/3.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/4.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/5.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/6.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/7.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/8.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/1.pngbin0 -> 277 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/2.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/3.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/4.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/5.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/6.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/7.pngbin0 -> 278 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/8.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539.pngbin0 -> 276 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/1.pngbin0 -> 277 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/2.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/3.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/4.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/5.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/6.pngbin0 -> 278 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/7.pngbin0 -> 264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/8.pngbin0 -> 276 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/577.pngbin0 -> 304 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/1.pngbin0 -> 2121 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/2.pngbin0 -> 2066 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/3.pngbin0 -> 2078 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/4.pngbin0 -> 2028 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/5.pngbin0 -> 2011 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/6.pngbin0 -> 2025 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/7.pngbin0 -> 2017 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/8.pngbin0 -> 2011 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/595.pngbin0 -> 1938 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/596.pngbin0 -> 400 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/1.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/2.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/3.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/4.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/5.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/6.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/7.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/8.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598.pngbin0 -> 1665 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/1.pngbin0 -> 1623 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/2.pngbin0 -> 1628 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/3.pngbin0 -> 1644 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/4.pngbin0 -> 1652 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/5.pngbin0 -> 1664 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/6.pngbin0 -> 1665 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/7.pngbin0 -> 1673 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/8.pngbin0 -> 1665 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/1.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/2.pngbin0 -> 260 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/3.pngbin0 -> 260 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/4.pngbin0 -> 260 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/5.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/6.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/7.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/8.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/6.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/600.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/601.pngbin0 -> 348 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/602.pngbin0 -> 358 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/603.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/604.pngbin0 -> 379 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605.pngbin0 -> 1738 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/1.pngbin0 -> 1742 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/2.pngbin0 -> 1750 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/3.pngbin0 -> 1747 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/4.pngbin0 -> 1745 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/5.pngbin0 -> 1731 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/6.pngbin0 -> 1743 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/7.pngbin0 -> 1754 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/8.pngbin0 -> 1738 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/606.pngbin0 -> 399 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/607.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/608.pngbin0 -> 393 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609.pngbin0 -> 1591 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/1.pngbin0 -> 1632 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/2.pngbin0 -> 1633 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/3.pngbin0 -> 1635 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/4.pngbin0 -> 1627 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/5.pngbin0 -> 1617 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/6.pngbin0 -> 1634 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/7.pngbin0 -> 1640 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/8.pngbin0 -> 1591 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/610.pngbin0 -> 467 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/611.pngbin0 -> 460 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/612.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/613.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/614.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/615.pngbin0 -> 519 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/616.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/617.pngbin0 -> 512 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/618.pngbin0 -> 512 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/619.pngbin0 -> 2140 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/620.pngbin0 -> 3182 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/621.pngbin0 -> 3187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/622.pngbin0 -> 3183 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/623.pngbin0 -> 3179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/624.pngbin0 -> 3173 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/630.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/631.pngbin0 -> 338 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/632.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/633.pngbin0 -> 330 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/634.pngbin0 -> 332 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/635.pngbin0 -> 338 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/636.pngbin0 -> 338 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/637.pngbin0 -> 338 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/638.pngbin0 -> 339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/639.pngbin0 -> 1857 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/640.pngbin0 -> 870 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/641.pngbin0 -> 875 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/642.pngbin0 -> 867 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/643.pngbin0 -> 847 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/644.pngbin0 -> 858 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/645.pngbin0 -> 897 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/646.pngbin0 -> 885 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/647.pngbin0 -> 903 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/648.pngbin0 -> 914 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/649.pngbin0 -> 1772 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/650.pngbin0 -> 461 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/651.pngbin0 -> 928 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/652.pngbin0 -> 1345 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/653.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/654.pngbin0 -> 453 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/655.pngbin0 -> 864 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/656.pngbin0 -> 864 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/657.pngbin0 -> 866 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/658.pngbin0 -> 860 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/659.pngbin0 -> 2118 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/660.pngbin0 -> 3147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/661.pngbin0 -> 3116 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/662.pngbin0 -> 3127 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/663.pngbin0 -> 3126 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/664.pngbin0 -> 3139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/665.pngbin0 -> 3173 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/666.pngbin0 -> 3166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/667.pngbin0 -> 3169 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/668.pngbin0 -> 1538 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/668.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/669.pngbin0 -> 2847 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/670.pngbin0 -> 596 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/671.pngbin0 -> 606 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/672.pngbin0 -> 597 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/673.pngbin0 -> 607 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/674.pngbin0 -> 606 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/675.pngbin0 -> 628 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/676.pngbin0 -> 617 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/677.pngbin0 -> 624 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/678.pngbin0 -> 3286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/679.pngbin0 -> 3274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/680.pngbin0 -> 1368 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/681.pngbin0 -> 1332 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/682.pngbin0 -> 1351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/683.pngbin0 -> 940 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/684.pngbin0 -> 1322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/685.pngbin0 -> 906 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/686.pngbin0 -> 908 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/687.pngbin0 -> 1327 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/688.pngbin0 -> 1315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/689.pngbin0 -> 1270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/690.pngbin0 -> 1291 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/691.pngbin0 -> 1339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/692.pngbin0 -> 1266 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/693.pngbin0 -> 1258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/694.pngbin0 -> 1306 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/695.pngbin0 -> 1166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/696.pngbin0 -> 1169 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/697.pngbin0 -> 1171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/698.pngbin0 -> 1161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/699.pngbin0 -> 1859 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/7.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/700.pngbin0 -> 1378 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/701.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/702.pngbin0 -> 2896 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/703.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/704.pngbin0 -> 239 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/705.pngbin0 -> 4279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/706.pngbin0 -> 4251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/707.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/708.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/709.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/710.pngbin0 -> 771 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/711.pngbin0 -> 736 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/712.pngbin0 -> 748 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/713.pngbin0 -> 294 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/714.pngbin0 -> 316 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/715.pngbin0 -> 555 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/716.pngbin0 -> 663 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/717.pngbin0 -> 997 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/718.pngbin0 -> 1064 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/719.pngbin0 -> 738 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/720.pngbin0 -> 708 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/721.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/722.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/723.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/724.pngbin0 -> 878 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/725.pngbin0 -> 718 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/726.pngbin0 -> 490 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/727.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/728.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/729.pngbin0 -> 441 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/730.pngbin0 -> 247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/731.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/732.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/733.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/734.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/735.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/1.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/2.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/3.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/4.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/5.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/6.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/7.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/8.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/1.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/2.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/3.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/4.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/5.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/6.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/7.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/8.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/740.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/741.pngbin0 -> 17905 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/742.pngbin0 -> 17905 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/744.pngbin0 -> 201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/745.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/746.pngbin0 -> 17906 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/747.pngbin0 -> 17906 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/748.pngbin0 -> 17812 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/749.pngbin0 -> 191 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/750.pngbin0 -> 3006 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/751.pngbin0 -> 3018 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/752.pngbin0 -> 3007 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/753.pngbin0 -> 3007 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/754.pngbin0 -> 3009 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/755.pngbin0 -> 3009 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/756.pngbin0 -> 3012 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/757.pngbin0 -> 3015 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/758.pngbin0 -> 3008 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/759.pngbin0 -> 3012 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/760.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/761.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/762.pngbin0 -> 249 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/763.pngbin0 -> 1303 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/764.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/765.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/8.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/9.pngbin0 -> 1089 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/0.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/1.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/10.pngbin0 -> 389 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/100.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/101.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/102.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/103.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/104.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/105.pngbin0 -> 317 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/106.pngbin0 -> 347 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/107.pngbin0 -> 326 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/108.pngbin0 -> 306 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/109.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/110.pngbin0 -> 316 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/111.pngbin0 -> 316 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/112.pngbin0 -> 317 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/113.pngbin0 -> 361 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/114.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/115.pngbin0 -> 334 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/116.pngbin0 -> 396 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/117.pngbin0 -> 404 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/118.pngbin0 -> 304 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/119.pngbin0 -> 372 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/120.pngbin0 -> 320 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/121.pngbin0 -> 320 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/122.pngbin0 -> 320 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/123.pngbin0 -> 320 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/124.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/125.pngbin0 -> 312 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/126.pngbin0 -> 392 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/127.pngbin0 -> 299 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/128.pngbin0 -> 324 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/129.pngbin0 -> 299 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/130.pngbin0 -> 324 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/131.pngbin0 -> 229 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/132.pngbin0 -> 350 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/133.pngbin0 -> 314 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/134.pngbin0 -> 347 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/135.pngbin0 -> 299 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/136.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/137.pngbin0 -> 386 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/2.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/200.pngbin0 -> 297 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/201.pngbin0 -> 326 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/202.pngbin0 -> 542 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/203.pngbin0 -> 591 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/204.pngbin0 -> 571 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/205.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/206.pngbin0 -> 596 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/207.pngbin0 -> 541 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/208.pngbin0 -> 704 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/209.pngbin0 -> 633 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/210.pngbin0 -> 470 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/211.pngbin0 -> 447 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/212.pngbin0 -> 496 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/213.pngbin0 -> 486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/214.pngbin0 -> 334 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/220.pngbin0 -> 403 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/221.pngbin0 -> 436 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/222.pngbin0 -> 486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/223.pngbin0 -> 475 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/224.pngbin0 -> 474 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/230.pngbin0 -> 372 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/231.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/232.pngbin0 -> 464 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/233.pngbin0 -> 468 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/234.pngbin0 -> 416 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/240.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/241.pngbin0 -> 425 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/242.pngbin0 -> 479 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/243.pngbin0 -> 486 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/244.pngbin0 -> 425 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/250.pngbin0 -> 597 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/251.pngbin0 -> 476 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/252.pngbin0 -> 703 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/260.pngbin0 -> 596 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/261.pngbin0 -> 474 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/262.pngbin0 -> 689 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/270.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/271.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/3.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/4.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/410.pngbin0 -> 237 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/414.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/415.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/416.pngbin0 -> 390 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/417.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/418.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/419.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/420.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/421.pngbin0 -> 387 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/422.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/423.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/424.pngbin0 -> 393 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/425.pngbin0 -> 383 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/426.pngbin0 -> 398 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/427.pngbin0 -> 402 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/428.pngbin0 -> 397 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/429.pngbin0 -> 389 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/470.pngbin0 -> 329 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/471.pngbin0 -> 332 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/472.pngbin0 -> 346 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/473.pngbin0 -> 339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/474.pngbin0 -> 338 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/475.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/476.pngbin0 -> 327 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/477.pngbin0 -> 323 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/478.pngbin0 -> 324 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/479.pngbin0 -> 330 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/480.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/481.pngbin0 -> 307 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/482.pngbin0 -> 327 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/483.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/484.pngbin0 -> 326 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/485.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/486.pngbin0 -> 318 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/487.pngbin0 -> 306 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/488.pngbin0 -> 327 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/489.pngbin0 -> 324 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/490.pngbin0 -> 326 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/491.pngbin0 -> 330 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/492.pngbin0 -> 329 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/493.pngbin0 -> 324 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/494.pngbin0 -> 330 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/495.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/496.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/497.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/498.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/499.pngbin0 -> 329 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/5.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/500.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/501.pngbin0 -> 463 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/502.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/503.pngbin0 -> 452 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/504.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/505.pngbin0 -> 468 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/510.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/511.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/512.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/513.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/520.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/521.pngbin0 -> 468 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/522.pngbin0 -> 468 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/523.pngbin0 -> 450 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/524.pngbin0 -> 503 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/526.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/527.pngbin0 -> 468 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/528.pngbin0 -> 468 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/529.pngbin0 -> 468 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/530.pngbin0 -> 247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/531.pngbin0 -> 468 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/532.pngbin0 -> 468 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/533.pngbin0 -> 434 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/534.pngbin0 -> 569 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/535.pngbin0 -> 2901 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/536.pngbin0 -> 2904 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/537.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/538.pngbin0 -> 438 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/540.pngbin0 -> 500 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/550.pngbin0 -> 423 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/551.pngbin0 -> 450 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/552.pngbin0 -> 470 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/553.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/554.pngbin0 -> 426 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/555.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/556.pngbin0 -> 613 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/557.pngbin0 -> 555 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/558.pngbin0 -> 428 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/559.pngbin0 -> 495 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/560.pngbin0 -> 455 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/561.pngbin0 -> 388 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/562.pngbin0 -> 426 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/563.pngbin0 -> 370 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/564.pngbin0 -> 402 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/565.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/566.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/567.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/568.pngbin0 -> 370 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/569.pngbin0 -> 564 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/570.pngbin0 -> 540 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/571.pngbin0 -> 359 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/572.pngbin0 -> 375 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/573.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/574.pngbin0 -> 461 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/576.pngbin0 -> 440 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/577.pngbin0 -> 17938 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/578.pngbin0 -> 17938 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/579.pngbin0 -> 17954 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/580.pngbin0 -> 17954 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/581.pngbin0 -> 17903 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/582.pngbin0 -> 17837 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/583.pngbin0 -> 17856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/584.pngbin0 -> 352 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/6.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/7.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/765.pngbin0 -> 2896 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/8.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/9.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/1.pngbin0 -> 771 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/10.pngbin0 -> 663 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/100.pngbin0 -> 3346 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/101.pngbin0 -> 3306 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/102.pngbin0 -> 3287 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/103.pngbin0 -> 3289 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/104.pngbin0 -> 3299 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/105.pngbin0 -> 3334 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/106.pngbin0 -> 3106 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/107.pngbin0 -> 3207 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/11.pngbin0 -> 1155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/110.pngbin0 -> 3053 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/111.pngbin0 -> 420 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/112.pngbin0 -> 368 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/113.pngbin0 -> 399 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/12.pngbin0 -> 2136 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/120.pngbin0 -> 5070 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/13.pngbin0 -> 3047 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/130.pngbin0 -> 3007 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/131.pngbin0 -> 3016 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/132.pngbin0 -> 3013 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/14.pngbin0 -> 1067 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/140.pngbin0 -> 2868 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/141.pngbin0 -> 2868 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/142.pngbin0 -> 2868 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/143.pngbin0 -> 2900 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/144.pngbin0 -> 2868 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/145.pngbin0 -> 2869 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/146.pngbin0 -> 2847 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/147.pngbin0 -> 2847 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/148.pngbin0 -> 2847 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/149.pngbin0 -> 566 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/15.pngbin0 -> 555 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/150.pngbin0 -> 3722 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/151.pngbin0 -> 3962 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/152.pngbin0 -> 3720 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/153.pngbin0 -> 3944 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/154.pngbin0 -> 604 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/155.pngbin0 -> 635 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/156.pngbin0 -> 1850 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/157.pngbin0 -> 4247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/16.pngbin0 -> 1127 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/160.pngbin0 -> 3868 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/161.pngbin0 -> 3727 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/162.pngbin0 -> 3869 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/163.pngbin0 -> 3739 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/164.pngbin0 -> 3867 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/165.pngbin0 -> 3737 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/166.pngbin0 -> 1668 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/167.pngbin0 -> 1888 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/168.pngbin0 -> 1836 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/169.pngbin0 -> 10406 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/17.pngbin0 -> 997 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/170.pngbin0 -> 1596 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/171.pngbin0 -> 1825 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/172.pngbin0 -> 1826 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/173.pngbin0 -> 10047 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/174.pngbin0 -> 1685 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/174.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/175.pngbin0 -> 4264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/175.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/176.pngbin0 -> 16727 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/176.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/177.pngbin0 -> 18831 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/177.png.mcmeta3
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/178.pngbin0 -> 4118 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/179.pngbin0 -> 3980 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/18.pngbin0 -> 1150 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/180.pngbin0 -> 4183 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/181.pngbin0 -> 4170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/182.pngbin0 -> 817 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/183.pngbin0 -> 761 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/184.pngbin0 -> 849 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/188.pngbin0 -> 4980 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/188.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/189.pngbin0 -> 1952 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/189.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/19.pngbin0 -> 1064 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/190.pngbin0 -> 3128 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/191.pngbin0 -> 3043 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/192.pngbin0 -> 472 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/193.pngbin0 -> 363 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/194.pngbin0 -> 436 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/199.pngbin0 -> 318 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/2.pngbin0 -> 736 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/20.pngbin0 -> 1175 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/200.pngbin0 -> 6713 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/201.pngbin0 -> 6863 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/202.pngbin0 -> 6762 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/203.pngbin0 -> 6967 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/204.pngbin0 -> 6974 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/205.pngbin0 -> 7028 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/206.pngbin0 -> 6974 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/207.pngbin0 -> 6983 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/208.pngbin0 -> 7217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/209.pngbin0 -> 1219 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/21.pngbin0 -> 3125 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/210.pngbin0 -> 801 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/211.pngbin0 -> 730 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/212.pngbin0 -> 716 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/213.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/214.pngbin0 -> 966 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/215.pngbin0 -> 993 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/216.pngbin0 -> 972 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/217.pngbin0 -> 781 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/218.pngbin0 -> 819 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/219.pngbin0 -> 807 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/22.pngbin0 -> 3008 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/220.pngbin0 -> 987 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/221.pngbin0 -> 1372 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/222.pngbin0 -> 1048 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/223.pngbin0 -> 1150 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/224.pngbin0 -> 1270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/225.pngbin0 -> 643 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/226.pngbin0 -> 791 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/227.pngbin0 -> 1174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/228.pngbin0 -> 1007 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/229.pngbin0 -> 958 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/23.pngbin0 -> 2025 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/230.pngbin0 -> 8472 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/230.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/231.pngbin0 -> 887 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/232.pngbin0 -> 2008 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/24.pngbin0 -> 3996 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/25.pngbin0 -> 3881 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/26.pngbin0 -> 4043 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/27.pngbin0 -> 4084 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/3.pngbin0 -> 748 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/30.pngbin0 -> 983 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/31.pngbin0 -> 1074 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/32.pngbin0 -> 1060 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/33.pngbin0 -> 1182 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/34.pngbin0 -> 1275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/35.pngbin0 -> 1269 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/36.pngbin0 -> 3745 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/37.pngbin0 -> 3459 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/38.pngbin0 -> 3818 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/39.pngbin0 -> 3671 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/4.pngbin0 -> 738 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/40.pngbin0 -> 3615 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/41.pngbin0 -> 3546 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/42.pngbin0 -> 3663 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/43.pngbin0 -> 3567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/44.pngbin0 -> 3794 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/45.pngbin0 -> 3707 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/46.pngbin0 -> 3862 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/47.pngbin0 -> 3785 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/48.pngbin0 -> 3670 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/49.pngbin0 -> 3602 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/5.pngbin0 -> 708 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/50.pngbin0 -> 3848 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/51.pngbin0 -> 3709 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/52.pngbin0 -> 3868 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/53.pngbin0 -> 3739 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/54.pngbin0 -> 3820 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/55.pngbin0 -> 3781 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/56.pngbin0 -> 3891 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/57.pngbin0 -> 3779 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/58.pngbin0 -> 3867 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/59.pngbin0 -> 3738 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/6.pngbin0 -> 764 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/60.pngbin0 -> 3960 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/61.pngbin0 -> 3873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/62.pngbin0 -> 3932 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/63.pngbin0 -> 3840 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/64.pngbin0 -> 3886 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/65.pngbin0 -> 3777 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/68.pngbin0 -> 2894 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/69.pngbin0 -> 2865 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/7.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/70.pngbin0 -> 2890 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/700.pngbin0 -> 190 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/701.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/703.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/704.pngbin0 -> 239 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/705.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/707.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/708.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/71.pngbin0 -> 2874 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/710.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/711.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/712.pngbin0 -> 198 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/713.pngbin0 -> 294 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/714.pngbin0 -> 316 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/715.pngbin0 -> 209 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/719.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/72.pngbin0 -> 198 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/720.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/721.pngbin0 -> 1346 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/721.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/722.pngbin0 -> 1596 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/722.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/723.pngbin0 -> 4289 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/723.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/724.pngbin0 -> 774 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/724.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/725.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/726.pngbin0 -> 610 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/726.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/727.pngbin0 -> 257 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/728.pngbin0 -> 266 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/729.pngbin0 -> 5177 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/73.pngbin0 -> 9463 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/730.pngbin0 -> 5193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/731.pngbin0 -> 5189 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/732.pngbin0 -> 5183 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/733.pngbin0 -> 5186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/734.pngbin0 -> 5177 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/735.pngbin0 -> 5189 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/736.pngbin0 -> 5174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/737.pngbin0 -> 5194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/738.pngbin0 -> 5188 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/739.pngbin0 -> 5185 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/74.pngbin0 -> 2869 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/740.pngbin0 -> 5193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/741.pngbin0 -> 5192 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/742.pngbin0 -> 5120 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/743.pngbin0 -> 4980 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/744.pngbin0 -> 5183 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/745.pngbin0 -> 5194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/746.pngbin0 -> 4983 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/747.pngbin0 -> 5175 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/748.pngbin0 -> 5173 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/749.pngbin0 -> 5189 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/75.pngbin0 -> 190 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/750.pngbin0 -> 5179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/751.pngbin0 -> 5147 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/752.pngbin0 -> 5195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/753.pngbin0 -> 9971 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/754.pngbin0 -> 9985 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/755.pngbin0 -> 9999 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/756.pngbin0 -> 5464 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/757.pngbin0 -> 735 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/757.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/76.pngbin0 -> 8308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/77.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/78.pngbin0 -> 2867 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/79.pngbin0 -> 2903 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/8.pngbin0 -> 3189 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/80.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/82.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/83.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/84.pngbin0 -> 781 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/85.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/86.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/87.pngbin0 -> 817 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/88.pngbin0 -> 4294 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/89.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/90.pngbin0 -> 3034 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/91.pngbin0 -> 4253 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/92.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/93.pngbin0 -> 247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/94.pngbin0 -> 779 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/95.pngbin0 -> 4275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/96.pngbin0 -> 2906 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/97.pngbin0 -> 2887 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/98.pngbin0 -> 1709 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/99.pngbin0 -> 1995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.neutroniumHeatCapacitor.pngbin0 -> 176 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.neutronreflector.pngbin0 -> 205 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.reactorMOXDual.pngbin0 -> 369 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.reactorMOXQuad.pngbin0 -> 512 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.reactorMOXSimple.pngbin0 -> 323 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.reactorUraniumDual.pngbin0 -> 489 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.reactorUraniumQuad.pngbin0 -> 594 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.reactorUraniumSimple.pngbin0 -> 448 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.sensorcard.pngbin0 -> 1067 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.sunnariumCell.pngbin0 -> 1783 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.tierdDrone0.pngbin0 -> 622 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.tierdDrone1.pngbin0 -> 678 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.tierdDrone2.pngbin0 -> 679 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/BUTCHERYKNIFE.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/BUTCHERYKNIFE_OVERLAY.pngbin0 -> 223 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/CROWBAR.pngbin0 -> 223 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/CROWBAR_OVERLAY.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_0.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_0_OVERLAY.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_1.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_1_OVERLAY.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_2.pngbin0 -> 171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_2_OVERLAY.pngbin0 -> 171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_3.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_3_OVERLAY.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_4.pngbin0 -> 171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_4_OVERLAY.pngbin0 -> 171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_5.pngbin0 -> 173 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_5_OVERLAY.pngbin0 -> 173 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_6.pngbin0 -> 180 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_6_OVERLAY.pngbin0 -> 180 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_7.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_7_OVERLAY.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_8.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_8_OVERLAY.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_0.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_0_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_1.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_1_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_2.pngbin0 -> 160 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_2_OVERLAY.pngbin0 -> 160 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_3.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_3_OVERLAY.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_4.pngbin0 -> 176 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_4_OVERLAY.pngbin0 -> 176 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_5.pngbin0 -> 182 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_5_OVERLAY.pngbin0 -> 182 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_6.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_6_OVERLAY.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_7.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_7_OVERLAY.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_8.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_8_OVERLAY.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/GRAFTER.pngbin0 -> 300 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/GRAFTER_OVERLAY.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HALO.pngbin0 -> 3450 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HALO_FUZZY.pngbin0 -> 31598 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HALO_FUZZY.png.mcmeta5
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HALO_FUZZY_OVERLAY.pngbin0 -> 802 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HALO_OVERLAY.pngbin0 -> 676 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_BUZZSAW.pngbin0 -> 552 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_BUZZSAW_OVERLAY.pngbin0 -> 235 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_ELECTRIC_SCREWDRIVER.pngbin0 -> 317 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_ELECTRIC_SCREWDRIVER_OVERLAY.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_FILE.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_FILE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SAW.pngbin0 -> 229 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SAW_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SCREWDRIVER.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SCREWDRIVER_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SOLDERING.pngbin0 -> 1171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SOLDERING_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SWORD.pngbin0 -> 216 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SWORD_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/JACKHAMMER.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/JACKHAMMER_OVERLAY.pngbin0 -> 406 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/KNIFE.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/KNIFE_OVERLAY.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/MORTAR.pngbin0 -> 352 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/MORTAR_OVERLAY.pngbin0 -> 337 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/PLUNGER.pngbin0 -> 225 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/PLUNGER_OVERLAY.pngbin0 -> 313 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_BRANCHCUTTER.pngbin0 -> 552 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_BRANCHCUTTER_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_CLOSED.pngbin0 -> 389 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_CLOSED_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_FILE.pngbin0 -> 597 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_FILE_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_KNIFE.pngbin0 -> 438 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_KNIFE_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SAW.pngbin0 -> 570 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SAW_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SCREWDRIVER.pngbin0 -> 457 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SCREWDRIVER_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_WIRECUTTER.pngbin0 -> 514 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_WIRECUTTER_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_HV.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_HV_OVERLAY.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_LV.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_LV_OVERLAY.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_MV.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_MV_OVERLAY.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/RENDERING_ERROR.pngbin0 -> 150 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/RENDERING_ERROR_OVERLAY.pngbin0 -> 150 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ROLLING_PIN.pngbin0 -> 448 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/ROLLING_PIN_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/SCOOP.pngbin0 -> 222 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/SCOOP_OVERLAY.pngbin0 -> 218 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/SICKLE.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/SICKLE_OVERLAY.pngbin0 -> 223 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE.pngbin0 -> 1224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_HUGE.pngbin0 -> 1224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_HUGE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_LARGE.pngbin0 -> 1224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_LARGE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_SMALL.pngbin0 -> 1224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_SMALL_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/VOID.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/VOID_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/WIRE_CUTTER.pngbin0 -> 191 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/WIRE_CUTTER_OVERLAY.pngbin0 -> 256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/WRENCH.pngbin0 -> 192 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/iconsets/WRENCH_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/aluminium_inner.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/chromium_inner.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/iridium_inner.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/neutronium_inner.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/osmium_inner.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/stainlesssteel_inner.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/steel_inner.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/titanium_inner.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/tungstensteel_inner.pngbin0 -> 139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/TURBINE_BLADE.pngbin0 -> 2951 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtPlastic.pngbin0 -> 2756 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtWood.pngbin0 -> 2756 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/bolt.pngbin0 -> 2769 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/casingSmall.pngbin0 -> 2996 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cell.pngbin0 -> 2779 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cellPlasma.pngbin0 -> 2779 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtDust.pngbin0 -> 2809 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtGem.pngbin0 -> 2789 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtIngot.pngbin0 -> 2811 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtPlate.pngbin0 -> 2837 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushed.pngbin0 -> 3032 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedCentrifuged.pngbin0 -> 3004 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedPurified.pngbin0 -> 3074 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dust.pngbin0 -> 2935 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustImpure.pngbin0 -> 2935 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustPure.pngbin0 -> 2935 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustSmall.pngbin0 -> 2823 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustTiny.pngbin0 -> 2769 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/foil.pngbin0 -> 3055 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGt.pngbin0 -> 3162 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGtSmall.pngbin0 -> 2950 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gem.pngbin0 -> 3008 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemChipped.pngbin0 -> 2978 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemExquisite.pngbin0 -> 3167 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawed.pngbin0 -> 3016 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawless.pngbin0 -> 2992 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/handleMallet.pngbin0 -> 2825 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingot.pngbin0 -> 3037 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotDouble.pngbin0 -> 3114 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotHot.pngbin0 -> 3012 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuadruple.pngbin0 -> 3218 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuintuple.pngbin0 -> 3225 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotTriple.pngbin0 -> 3160 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/lens.pngbin0 -> 2910 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/nugget.pngbin0 -> 2825 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plate.pngbin0 -> 2967 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDense.pngbin0 -> 2995 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDouble.pngbin0 -> 3005 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuadruple.pngbin0 -> 3075 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuintuple.pngbin0 -> 3098 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateTriple.pngbin0 -> 3045 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ring.pngbin0 -> 2920 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/rotor.pngbin0 -> 2957 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/round.pngbin0 -> 2756 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/screw.pngbin0 -> 2784 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/spring.pngbin0 -> 3040 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/springSmall.pngbin0 -> 2863 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stick.pngbin0 -> 2831 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stickLong.pngbin0 -> 2797 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadArrow.pngbin0 -> 2841 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadAxe.pngbin0 -> 2821 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadBuzzSaw.pngbin0 -> 3174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadChainsaw.pngbin0 -> 2884 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadDrill.pngbin0 -> 2861 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadFile.pngbin0 -> 2836 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHammer.pngbin0 -> 2809 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHoe.pngbin0 -> 2772 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadMallet.pngbin0 -> 2825 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPickaxe.pngbin0 -> 2823 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPlow.pngbin0 -> 2848 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSaw.pngbin0 -> 2820 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadScrewdriver.pngbin0 -> 2778 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSense.pngbin0 -> 2823 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadShovel.pngbin0 -> 2804 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSoldering.pngbin0 -> 2780 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSword.pngbin0 -> 2896 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadUniversalSpade.pngbin0 -> 2808 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadWrench.pngbin0 -> 2833 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/turbineBlade.pngbin0 -> 2951 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/void.pngbin0 -> 2694 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/wireFine.pngbin0 -> 2967 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/TURBINE_BLADE.pngbin0 -> 1352 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtPlastic.pngbin0 -> 1154 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtWood.pngbin0 -> 1154 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/bolt.pngbin0 -> 1161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/casingSmall.pngbin0 -> 1428 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cell.pngbin0 -> 1183 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cellPlasma.pngbin0 -> 1183 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtDust.pngbin0 -> 1213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtGem.pngbin0 -> 1205 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtIngot.pngbin0 -> 1216 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtPlate.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushed.pngbin0 -> 1396 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedCentrifuged.pngbin0 -> 1361 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedPurified.pngbin0 -> 1445 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dust.pngbin0 -> 1302 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustImpure.pngbin0 -> 1302 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustPure.pngbin0 -> 1302 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustSmall.pngbin0 -> 1216 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustTiny.pngbin0 -> 1176 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/foil.pngbin0 -> 1470 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGt.pngbin0 -> 1529 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGtSmall.pngbin0 -> 1349 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gem.pngbin0 -> 1463 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemChipped.pngbin0 -> 1404 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemExquisite.pngbin0 -> 1581 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawed.pngbin0 -> 1450 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawless.pngbin0 -> 1455 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/handleMallet.pngbin0 -> 1204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingot.pngbin0 -> 1430 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotDouble.pngbin0 -> 1514 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotHot.pngbin0 -> 1405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuadruple.pngbin0 -> 1573 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuintuple.pngbin0 -> 1577 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotTriple.pngbin0 -> 1537 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/lens.pngbin0 -> 1321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/nugget.pngbin0 -> 1204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plate.pngbin0 -> 1355 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDense.pngbin0 -> 1369 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDouble.pngbin0 -> 1372 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuadruple.pngbin0 -> 1397 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuintuple.pngbin0 -> 1410 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateTriple.pngbin0 -> 1396 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ring.pngbin0 -> 1334 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/rotor.pngbin0 -> 1362 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/round.pngbin0 -> 1170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/screw.pngbin0 -> 1175 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/spring.pngbin0 -> 1488 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/springSmall.pngbin0 -> 1260 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stick.pngbin0 -> 1212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stickLong.pngbin0 -> 1193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadArrow.pngbin0 -> 1245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadAxe.pngbin0 -> 1203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadBuzzSaw.pngbin0 -> 1546 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadChainsaw.pngbin0 -> 1256 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadDrill.pngbin0 -> 1257 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadFile.pngbin0 -> 1224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHammer.pngbin0 -> 1210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHoe.pngbin0 -> 1179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadMallet.pngbin0 -> 1213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPickaxe.pngbin0 -> 1222 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPlow.pngbin0 -> 1228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSaw.pngbin0 -> 1232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadScrewdriver.pngbin0 -> 1189 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSense.pngbin0 -> 1222 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadShovel.pngbin0 -> 1193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSoldering.pngbin0 -> 1178 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSword.pngbin0 -> 1267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadUniversalSpade.pngbin0 -> 1202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadWrench.pngbin0 -> 1231 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/turbineBlade.pngbin0 -> 1352 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/void.pngbin0 -> 1094 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/wireFine.pngbin0 -> 1394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/TURBINE_BLADE.pngbin0 -> 319 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtPlastic.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtWood.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/bolt.pngbin0 -> 153 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/casingSmall.pngbin0 -> 554 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cell.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cellPlasma.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtDust.pngbin0 -> 190 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtGem.pngbin0 -> 177 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtIngot.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtPlate.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushed.pngbin0 -> 427 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedCentrifuged.pngbin0 -> 368 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedPurified.pngbin0 -> 433 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dust.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustImpure.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustPure.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustSmall.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustTiny.pngbin0 -> 168 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/foil.pngbin0 -> 450 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGt.pngbin0 -> 571 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGtSmall.pngbin0 -> 318 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gem.pngbin0 -> 543 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemChipped.pngbin0 -> 372 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemExquisite.pngbin0 -> 598 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawed.pngbin0 -> 414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawless.pngbin0 -> 450 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/handleMallet.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingot.pngbin0 -> 550 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotDouble.pngbin0 -> 696 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotHot.pngbin0 -> 507 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuadruple.pngbin0 -> 799 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuintuple.pngbin0 -> 812 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotTriple.pngbin0 -> 741 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/lens.pngbin0 -> 405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/nugget.pngbin0 -> 222 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plate.pngbin0 -> 470 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDense.pngbin0 -> 528 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDouble.pngbin0 -> 533 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuadruple.pngbin0 -> 664 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuintuple.pngbin0 -> 701 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateTriple.pngbin0 -> 598 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ring.pngbin0 -> 304 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/rotor.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/round.pngbin0 -> 162 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/screw.pngbin0 -> 175 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/spring.pngbin0 -> 495 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/springSmall.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stick.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stickLong.pngbin0 -> 205 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadArrow.pngbin0 -> 225 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadBuzzSaw.pngbin0 -> 553 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadChainsaw.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadDrill.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadFile.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHammer.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHoe.pngbin0 -> 162 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadMallet.pngbin0 -> 216 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPickaxe.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPlow.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSaw.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadScrewdriver.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSense.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadShovel.pngbin0 -> 193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSoldering.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSword.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadWrench.pngbin0 -> 209 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/turbineBlade.pngbin0 -> 319 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/void.pngbin0 -> 74 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/wireFine.pngbin0 -> 361 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/TURBINE_BLADE.pngbin0 -> 1336 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtPlastic.pngbin0 -> 1152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtWood.pngbin0 -> 1152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/bolt.pngbin0 -> 1156 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/casingSmall.pngbin0 -> 1411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cell.pngbin0 -> 1184 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cellPlasma.pngbin0 -> 1184 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtDust.pngbin0 -> 1209 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtGem.pngbin0 -> 1198 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtIngot.pngbin0 -> 1207 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtPlate.pngbin0 -> 1233 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushed.pngbin0 -> 1390 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedCentrifuged.pngbin0 -> 1355 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedPurified.pngbin0 -> 1431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dust.pngbin0 -> 1305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustImpure.pngbin0 -> 1305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustPure.pngbin0 -> 1305 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustSmall.pngbin0 -> 1217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustTiny.pngbin0 -> 1171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/foil.pngbin0 -> 1443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGt.pngbin0 -> 1503 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGtSmall.pngbin0 -> 1330 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gem.pngbin0 -> 1444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemChipped.pngbin0 -> 1379 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemExquisite.pngbin0 -> 1537 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawed.pngbin0 -> 1414 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawless.pngbin0 -> 1444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/handleMallet.pngbin0 -> 1199 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingot.pngbin0 -> 1407 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotDouble.pngbin0 -> 1487 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotHot.pngbin0 -> 1405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuadruple.pngbin0 -> 1541 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuintuple.pngbin0 -> 1541 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotTriple.pngbin0 -> 1512 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/lens.pngbin0 -> 1323 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/nugget.pngbin0 -> 1200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plate.pngbin0 -> 1356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDense.pngbin0 -> 1369 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDouble.pngbin0 -> 1373 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuadruple.pngbin0 -> 1394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuintuple.pngbin0 -> 1405 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateTriple.pngbin0 -> 1397 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ring.pngbin0 -> 1316 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/rotor.pngbin0 -> 1347 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/round.pngbin0 -> 1165 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/screw.pngbin0 -> 1171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/spring.pngbin0 -> 1471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/springSmall.pngbin0 -> 1253 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stick.pngbin0 -> 1208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stickLong.pngbin0 -> 1187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadArrow.pngbin0 -> 1235 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadAxe.pngbin0 -> 1199 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadBuzzSaw.pngbin0 -> 1506 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadChainsaw.pngbin0 -> 1248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadDrill.pngbin0 -> 1243 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadFile.pngbin0 -> 1216 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHammer.pngbin0 -> 1208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHoe.pngbin0 -> 1175 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadMallet.pngbin0 -> 1210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPickaxe.pngbin0 -> 1218 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPlow.pngbin0 -> 1223 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSaw.pngbin0 -> 1211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadScrewdriver.pngbin0 -> 1182 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSense.pngbin0 -> 1210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadShovel.pngbin0 -> 1191 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSoldering.pngbin0 -> 1175 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSword.pngbin0 -> 1264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadUniversalSpade.pngbin0 -> 1197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadWrench.pngbin0 -> 1225 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/turbineBlade.pngbin0 -> 1336 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/void.pngbin0 -> 1094 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/wireFine.pngbin0 -> 1369 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/TURBINE_BLADE.pngbin0 -> 2807 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/TURBINE_BLADE.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/TURBINE_BLADE_OVERLAY.pngbin0 -> 5407 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtPlastic.pngbin0 -> 783 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtPlastic.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtPlastic_OVERLAY.pngbin0 -> 667 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtWood.pngbin0 -> 783 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtWood.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtWood_OVERLAY.pngbin0 -> 667 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/bolt.pngbin0 -> 1014 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/bolt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/bolt_OVERLAY.pngbin0 -> 4896 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/casingSmall.pngbin0 -> 6026 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/casingSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/casingSmall_OVERLAY.pngbin0 -> 1043 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cell.pngbin0 -> 1020 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cell.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cellPlasma.pngbin0 -> 1020 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cellPlasma.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtDust.pngbin0 -> 1174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtDust.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtGem.pngbin0 -> 1074 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtGem.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtIngot.pngbin0 -> 1272 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtIngot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtPlate.pngbin0 -> 1456 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtPlate.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushed.pngbin0 -> 3725 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushed.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedCentrifuged.pngbin0 -> 3429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedCentrifuged.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedCentrifuged_OVERLAY.pngbin0 -> 5178 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedPurified.pngbin0 -> 3791 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedPurified.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedPurified_OVERLAY.pngbin0 -> 5629 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushed_OVERLAY.pngbin0 -> 5379 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dust.pngbin0 -> 3292 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dust.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustImpure.pngbin0 -> 3292 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustImpure.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustImpure_OVERLAY.pngbin0 -> 5299 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustPure.pngbin0 -> 3292 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustPure.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustPure_OVERLAY.pngbin0 -> 5163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustSmall.pngbin0 -> 1813 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustSmall_OVERLAY.pngbin0 -> 5006 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustTiny.pngbin0 -> 1171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustTiny.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustTiny_OVERLAY.pngbin0 -> 4926 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dust_OVERLAY.pngbin0 -> 2907 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/foil.pngbin0 -> 3894 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/foil_OVERLAY.pngbin0 -> 5592 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGt.pngbin0 -> 5012 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGtSmall.pngbin0 -> 2541 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGtSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGtSmall_OVERLAY.pngbin0 -> 5286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGt_OVERLAY.pngbin0 -> 5599 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gem.pngbin0 -> 5199 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gem.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemChipped.pngbin0 -> 2900 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemChipped.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemChipped_OVERLAY.pngbin0 -> 5463 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemExquisite.pngbin0 -> 5839 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemExquisite.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemExquisite_OVERLAY.pngbin0 -> 5770 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawed.pngbin0 -> 3553 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawed.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawed_OVERLAY.pngbin0 -> 5404 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawless.pngbin0 -> 4000 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawless.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawless_OVERLAY.pngbin0 -> 5589 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gem_OVERLAY.pngbin0 -> 5177 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/handleMallet.pngbin0 -> 1645 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/handleMallet.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingot.pngbin0 -> 4843 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotDouble.pngbin0 -> 6412 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotDouble.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotDouble_OVERLAY.pngbin0 -> 5432 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotHot.pngbin0 -> 4692 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotHot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuadruple.pngbin0 -> 7887 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuadruple_OVERLAY.pngbin0 -> 5467 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuintuple.pngbin0 -> 8523 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuintuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuintuple_OVERLAY.pngbin0 -> 5495 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotTriple.pngbin0 -> 6961 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotTriple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotTriple_OVERLAY.pngbin0 -> 5737 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingot_OVERLAY.pngbin0 -> 5303 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/lens.pngbin0 -> 4002 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/lens.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/lens_OVERLAY.pngbin0 -> 3083 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/nugget.pngbin0 -> 1539 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/nugget.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/nugget_OVERLAY.pngbin0 -> 4983 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plate.pngbin0 -> 4497 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plate.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDense.pngbin0 -> 5146 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDense.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDense_OVERLAY.pngbin0 -> 5159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDouble.pngbin0 -> 5225 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDouble.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDouble_OVERLAY.pngbin0 -> 5177 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuadruple.pngbin0 -> 6721 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuadruple_OVERLAY.pngbin0 -> 5264 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuintuple.pngbin0 -> 7271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuintuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuintuple_OVERLAY.pngbin0 -> 5230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateTriple.pngbin0 -> 5977 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateTriple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateTriple_OVERLAY.pngbin0 -> 5216 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plate_OVERLAY.pngbin0 -> 5139 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ring.pngbin0 -> 2179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ring.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ring_OVERLAY.pngbin0 -> 5403 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/rotor.pngbin0 -> 2829 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/rotor.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/rotor_OVERLAY.pngbin0 -> 5449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/round.pngbin0 -> 1140 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/round.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/round_OVERLAY.pngbin0 -> 4909 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/screw.pngbin0 -> 1193 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/screw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/screw_OVERLAY.pngbin0 -> 4940 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/spring.pngbin0 -> 4900 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/spring.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/springSmall.pngbin0 -> 1914 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/springSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/springSmall_OVERLAY.pngbin0 -> 5031 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/spring_OVERLAY.pngbin0 -> 5398 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stick.pngbin0 -> 1739 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stick.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stickLong.pngbin0 -> 1383 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stickLong.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stickLong_OVERLAY.pngbin0 -> 4949 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stick_OVERLAY.pngbin0 -> 5073 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadArrow.pngbin0 -> 1607 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadArrow.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadArrow_OVERLAY.pngbin0 -> 5142 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadAxe.pngbin0 -> 1421 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadAxe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadAxe_OVERLAY.pngbin0 -> 4979 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadBuzzSaw.pngbin0 -> 4903 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadBuzzSaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 5527 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadChainsaw.pngbin0 -> 1949 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadChainsaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadChainsaw_OVERLAY.pngbin0 -> 5252 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadDrill.pngbin0 -> 1782 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadDrill.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadDrill_OVERLAY.pngbin0 -> 5167 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadFile.pngbin0 -> 1859 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadFile.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadFile_OVERLAY.pngbin0 -> 5134 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHammer.pngbin0 -> 1630 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHammer.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHammer_OVERLAY.pngbin0 -> 4914 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHoe.pngbin0 -> 928 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHoe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHoe_OVERLAY.pngbin0 -> 5096 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadMallet.pngbin0 -> 1673 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadMallet.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadMallet_OVERLAY.pngbin0 -> 5339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPickaxe.pngbin0 -> 1533 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPickaxe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPickaxe_OVERLAY.pngbin0 -> 5145 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPlow.pngbin0 -> 1756 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPlow.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPlow_OVERLAY.pngbin0 -> 5132 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSaw.pngbin0 -> 1717 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSaw_OVERLAY.pngbin0 -> 5022 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadScrewdriver.pngbin0 -> 1356 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadScrewdriver.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadScrewdriver_OVERLAY.pngbin0 -> 5035 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSense.pngbin0 -> 1240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSense.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSense_OVERLAY.pngbin0 -> 5068 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadShovel.pngbin0 -> 1303 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadShovel.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadShovel_OVERLAY.pngbin0 -> 5028 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSoldering.pngbin0 -> 1267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSoldering.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSoldering_OVERLAY.pngbin0 -> 5332 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSword.pngbin0 -> 2488 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSword.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSword_OVERLAY.pngbin0 -> 5104 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadUniversalSpade.pngbin0 -> 1334 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadUniversalSpade.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 5004 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadWrench.pngbin0 -> 1574 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadWrench.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadWrench_OVERLAY.pngbin0 -> 5089 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/turbineBlade.pngbin0 -> 2807 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/turbineBlade.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/turbineBlade_OVERLAY.pngbin0 -> 4975 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/void.pngbin0 -> 99 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/wireFine.pngbin0 -> 2607 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/wireFine.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/wireFine_OVERLAY.pngbin0 -> 3086 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/TURBINE_BLADE.pngbin0 -> 5863 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtPlastic.pngbin0 -> 4981 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtWood.pngbin0 -> 4980 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/bolt.pngbin0 -> 4831 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/casingSmall.pngbin0 -> 4933 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cell.pngbin0 -> 5166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cellPlasma.pngbin0 -> 5166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtDust.pngbin0 -> 5101 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtGem.pngbin0 -> 5085 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtIngot.pngbin0 -> 5122 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtPlate.pngbin0 -> 5368 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushed.pngbin0 -> 5107 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedCentrifuged.pngbin0 -> 5379 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedPurified.pngbin0 -> 5395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dust.pngbin0 -> 4961 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustImpure.pngbin0 -> 4962 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustPure.pngbin0 -> 4962 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustSmall.pngbin0 -> 4921 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustTiny.pngbin0 -> 4868 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/foil.pngbin0 -> 5238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGt.pngbin0 -> 5288 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGtSmall.pngbin0 -> 5292 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gem.pngbin0 -> 5012 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemChipped.pngbin0 -> 5289 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemExquisite.pngbin0 -> 5385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawed.pngbin0 -> 5212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawless.pngbin0 -> 5247 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/handleMallet.pngbin0 -> 9785 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingot.pngbin0 -> 5110 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotDouble.pngbin0 -> 5215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotHot.pngbin0 -> 5066 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuadruple.pngbin0 -> 5240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuintuple.pngbin0 -> 5265 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotTriple.pngbin0 -> 5229 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/lens.pngbin0 -> 4875 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nanites.pngbin0 -> 247508 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nanites.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nanites_OVERLAY.pngbin0 -> 609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nugget.pngbin0 -> 4923 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plate.pngbin0 -> 4959 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDense.pngbin0 -> 4976 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDouble.pngbin0 -> 4974 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuadruple.pngbin0 -> 5020 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuintuple.pngbin0 -> 5025 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateTriple.pngbin0 -> 5001 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ring.pngbin0 -> 5025 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/rotor.pngbin0 -> 5132 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/round.pngbin0 -> 4845 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/screw.pngbin0 -> 4900 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/spring.pngbin0 -> 5062 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/springSmall.pngbin0 -> 5026 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stick.pngbin0 -> 4941 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stickLong.pngbin0 -> 4910 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadArrow.pngbin0 -> 5109 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadAxe.pngbin0 -> 4960 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadBuzzSaw.pngbin0 -> 5334 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadChainsaw.pngbin0 -> 5226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadDrill.pngbin0 -> 5217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadFile.pngbin0 -> 4930 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHammer.pngbin0 -> 4782 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHoe.pngbin0 -> 4893 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadMallet.pngbin0 -> 9642 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPickaxe.pngbin0 -> 4935 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPlow.pngbin0 -> 4978 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSaw.pngbin0 -> 4870 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadScrewdriver.pngbin0 -> 4855 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSense.pngbin0 -> 4953 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadShovel.pngbin0 -> 4933 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSoldering.pngbin0 -> 5701 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSword.pngbin0 -> 4952 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadUniversalSpade.pngbin0 -> 4928 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadWrench.pngbin0 -> 5194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/turbineBlade.pngbin0 -> 5862 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/void.pngbin0 -> 4760 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/wireFine.pngbin0 -> 5181 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/TURBINE_BLADE.pngbin0 -> 5201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/TURBINE_BLADE.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/TURBINE_BLADE_OVERLAY.pngbin0 -> 1871 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtPlastic.pngbin0 -> 1435 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtPlastic.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtWood.pngbin0 -> 1435 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtWood.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/bolt.pngbin0 -> 1493 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/bolt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/casingSmall.pngbin0 -> 10673 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/casingSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cell.pngbin0 -> 1909 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cell.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cellPlasma.pngbin0 -> 1909 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cellPlasma.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtDust.pngbin0 -> 2387 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtDust.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtGem.pngbin0 -> 2064 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtGem.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtIngot.pngbin0 -> 2210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtIngot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtPlate.pngbin0 -> 2470 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtPlate.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushed.pngbin0 -> 7448 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushed.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedCentrifuged.pngbin0 -> 6112 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedCentrifuged.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedPurified.pngbin0 -> 8466 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedPurified.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dust.pngbin0 -> 6148 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dust.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustImpure.pngbin0 -> 6148 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustImpure.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustPure.pngbin0 -> 6148 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustPure.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustSmall.pngbin0 -> 3021 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustSmall_OVERLAY.pngbin0 -> 1911 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustTiny.pngbin0 -> 1753 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustTiny.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustTiny_OVERLAY.pngbin0 -> 1899 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dust_OVERLAY.pngbin0 -> 1932 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/foil.pngbin0 -> 7681 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/foil_OVERLAY.pngbin0 -> 1970 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGt.pngbin0 -> 10000 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGtSmall.pngbin0 -> 4915 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGtSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGtSmall_OVERLAY.pngbin0 -> 1917 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGt_OVERLAY.pngbin0 -> 1976 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gem.pngbin0 -> 9531 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gem.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemChipped.pngbin0 -> 5728 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemChipped.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemChipped_OVERLAY.pngbin0 -> 1939 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemExquisite.pngbin0 -> 10556 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemExquisite.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemExquisite_OVERLAY.pngbin0 -> 1971 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawed.pngbin0 -> 6473 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawed.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawed_OVERLAY.pngbin0 -> 1929 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawless.pngbin0 -> 7521 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawless.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawless_OVERLAY.pngbin0 -> 1945 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gem_OVERLAY.pngbin0 -> 1931 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/handleMallet.pngbin0 -> 3301 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/handleMallet.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/handleMallet_OVERLAY.pngbin0 -> 1880 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingot.pngbin0 -> 8520 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotDouble.pngbin0 -> 11240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotDouble.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotDouble_OVERLAY.pngbin0 -> 1986 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotHot.pngbin0 -> 8520 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotHot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuadruple.pngbin0 -> 13342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuadruple_OVERLAY.pngbin0 -> 1997 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuintuple.pngbin0 -> 13971 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuintuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuintuple_OVERLAY.pngbin0 -> 1986 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotTriple.pngbin0 -> 12177 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotTriple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotTriple_OVERLAY.pngbin0 -> 1990 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingot_OVERLAY.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/lens.pngbin0 -> 7521 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/lens.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nanites.pngbin0 -> 378701 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nanites.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nanites_OVERLAY.pngbin0 -> 609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nugget.pngbin0 -> 2708 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nugget.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nugget_OVERLAY.pngbin0 -> 1909 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plate.pngbin0 -> 8272 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plate.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDense.pngbin0 -> 9514 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDense.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDense_OVERLAY.pngbin0 -> 1963 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDouble.pngbin0 -> 9604 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDouble.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDouble_OVERLAY.pngbin0 -> 1951 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuadruple.pngbin0 -> 12034 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuadruple_OVERLAY.pngbin0 -> 1982 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuintuple.pngbin0 -> 12590 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuintuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuintuple_OVERLAY.pngbin0 -> 1975 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateTriple.pngbin0 -> 10767 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateTriple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateTriple_OVERLAY.pngbin0 -> 1967 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plate_OVERLAY.pngbin0 -> 1949 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ring.pngbin0 -> 4415 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ring.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/rotor.pngbin0 -> 5548 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/rotor.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/rotor_OVERLAY.pngbin0 -> 1952 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/round.pngbin0 -> 1868 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/round.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/round_OVERLAY.pngbin0 -> 1895 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/screw.pngbin0 -> 1882 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/screw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/screw_OVERLAY.pngbin0 -> 1900 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/spring.pngbin0 -> 8512 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/spring.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/springSmall.pngbin0 -> 3160 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/springSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/springSmall_OVERLAY.pngbin0 -> 1885 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/spring_OVERLAY.pngbin0 -> 1891 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stick.pngbin0 -> 3554 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stick.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stickLong.pngbin0 -> 2708 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stickLong.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stickLong_OVERLAY.pngbin0 -> 1879 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stick_OVERLAY.pngbin0 -> 1882 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadArrow.pngbin0 -> 2821 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadArrow.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadArrow_OVERLAY.pngbin0 -> 1906 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadAxe.pngbin0 -> 2904 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadAxe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadAxe_OVERLAY.pngbin0 -> 1897 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadBuzzSaw.pngbin0 -> 9651 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadBuzzSaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 1964 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadChainsaw.pngbin0 -> 3400 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadChainsaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadChainsaw_OVERLAY.pngbin0 -> 1911 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadDrill.pngbin0 -> 3087 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadDrill.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadDrill_OVERLAY.pngbin0 -> 1902 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadFile.pngbin0 -> 3390 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadFile.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadFile_OVERLAY.pngbin0 -> 1885 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHammer.pngbin0 -> 3287 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHammer.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHammer_OVERLAY.pngbin0 -> 1891 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHoe.pngbin0 -> 1963 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHoe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHoe_OVERLAY.pngbin0 -> 1899 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadMallet.pngbin0 -> 3190 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadMallet.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadMallet_OVERLAY.pngbin0 -> 1897 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPickaxe.pngbin0 -> 3091 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPickaxe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPickaxe_OVERLAY.pngbin0 -> 1914 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPlow.pngbin0 -> 3374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPlow.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPlow_OVERLAY.pngbin0 -> 1895 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSaw.pngbin0 -> 2998 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadScrewdriver.pngbin0 -> 2482 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadScrewdriver.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSense.pngbin0 -> 2334 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSense.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSense_OVERLAY.pngbin0 -> 1885 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadShovel.pngbin0 -> 2286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadShovel.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadShovel_OVERLAY.pngbin0 -> 1898 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSoldering.pngbin0 -> 2138 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSoldering.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSoldering_OVERLAY.pngbin0 -> 1882 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSword.pngbin0 -> 4746 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSword.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSword_OVERLAY.pngbin0 -> 1900 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadUniversalSpade.pngbin0 -> 2350 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadUniversalSpade.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 1901 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadWrench.pngbin0 -> 2697 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadWrench.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/turbineBlade.pngbin0 -> 5201 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/turbineBlade.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/turbineBlade_OVERLAY.pngbin0 -> 1871 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/void.pngbin0 -> 100 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/wireFine.pngbin0 -> 5473 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/wireFine.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/TURBINE_BLADE.pngbin0 -> 2279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/TURBINE_BLADE.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtPlastic.pngbin0 -> 759 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtPlastic.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtWood.pngbin0 -> 759 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtWood.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/bolt.pngbin0 -> 643 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/bolt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/casingSmall.pngbin0 -> 3874 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/casingSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cell.pngbin0 -> 737 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cell.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cellPlasma.pngbin0 -> 737 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cellPlasma.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtDust.pngbin0 -> 1026 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtDust.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtGem.pngbin0 -> 855 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtGem.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtIngot.pngbin0 -> 977 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtIngot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtPlate.pngbin0 -> 1170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtPlate.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushed.pngbin0 -> 3243 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushed.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedCentrifuged.pngbin0 -> 2844 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedCentrifuged.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedPurified.pngbin0 -> 3397 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedPurified.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dust.pngbin0 -> 2616 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dust.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustImpure.pngbin0 -> 2616 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustImpure.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustPure.pngbin0 -> 2616 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustPure.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustSmall.pngbin0 -> 1215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustTiny.pngbin0 -> 723 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustTiny.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/foil.pngbin0 -> 3285 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGt.pngbin0 -> 4278 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGtSmall.pngbin0 -> 2057 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGtSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gem.pngbin0 -> 3945 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gem.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemChipped.pngbin0 -> 2504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemChipped.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemExquisite.pngbin0 -> 4779 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemExquisite.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawed.pngbin0 -> 2910 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawed.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawless.pngbin0 -> 3184 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawless.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/handleMallet.pngbin0 -> 1366 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/handleMallet.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingot.pngbin0 -> 4070 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotDouble.pngbin0 -> 5389 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotDouble.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotHot.pngbin0 -> 3814 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotHot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuadruple.pngbin0 -> 6263 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuintuple.pngbin0 -> 6404 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuintuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotTriple.pngbin0 -> 5727 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotTriple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/lens.pngbin0 -> 3120 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/lens.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites_OVERLAY.pngbin0 -> 609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nugget.pngbin0 -> 1105 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nugget.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plate.pngbin0 -> 3462 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plate.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDense.pngbin0 -> 3961 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDense.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDouble.pngbin0 -> 4077 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDouble.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuadruple.pngbin0 -> 5171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuintuple.pngbin0 -> 5383 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuintuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateTriple.pngbin0 -> 4650 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateTriple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ring.pngbin0 -> 2023 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ring.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/rotor.pngbin0 -> 2410 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/rotor.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/round.pngbin0 -> 674 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/round.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/screw.pngbin0 -> 803 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/screw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/spring.pngbin0 -> 3328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/spring.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/springSmall.pngbin0 -> 1272 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/springSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stick.pngbin0 -> 1353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stick.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stickLong.pngbin0 -> 1237 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stickLong.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadArrow.pngbin0 -> 1171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadArrow.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadAxe.pngbin0 -> 1367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadAxe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadBuzzSaw.pngbin0 -> 4289 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadBuzzSaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadChainsaw.pngbin0 -> 1732 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadChainsaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadDrill.pngbin0 -> 1484 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadDrill.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadFile.pngbin0 -> 1374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadFile.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHammer.pngbin0 -> 1383 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHammer.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHoe.pngbin0 -> 1000 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHoe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadMallet.pngbin0 -> 1407 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadMallet.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPickaxe.pngbin0 -> 1564 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPickaxe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPlow.pngbin0 -> 1755 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPlow.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSaw.pngbin0 -> 1213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadScrewdriver.pngbin0 -> 965 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadScrewdriver.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSense.pngbin0 -> 1215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSense.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadShovel.pngbin0 -> 1228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadShovel.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSoldering.pngbin0 -> 974 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSoldering.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSword.pngbin0 -> 2028 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSword.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadUniversalSpade.pngbin0 -> 1248 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadUniversalSpade.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadWrench.pngbin0 -> 1310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadWrench.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/turbineBlade.pngbin0 -> 2279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/turbineBlade.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/void.pngbin0 -> 98 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/wireFine.pngbin0 -> 2545 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/wireFine.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/TURBINE_BLADE.pngbin0 -> 4956 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/TURBINE_BLADE.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/TURBINE_BLADE_OVERLAY.pngbin0 -> 1871 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtPlastic.pngbin0 -> 3287 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtPlastic.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtWood.pngbin0 -> 3287 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtWood.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/bolt.pngbin0 -> 3466 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/bolt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/casingSmall.pngbin0 -> 6542 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/casingSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cell.pngbin0 -> 3454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cell.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cellPlasma.pngbin0 -> 3454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cellPlasma.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtDust.pngbin0 -> 3724 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtDust.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtGem.pngbin0 -> 3639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtGem.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtIngot.pngbin0 -> 3714 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtIngot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtPlate.pngbin0 -> 3906 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtPlate.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushed.pngbin0 -> 5911 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushed.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedCentrifuged.pngbin0 -> 5227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedCentrifuged.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedPurified.pngbin0 -> 6049 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedPurified.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dust.pngbin0 -> 5461 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dust.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustImpure.pngbin0 -> 5461 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustImpure.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustPure.pngbin0 -> 5461 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustPure.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustSmall.pngbin0 -> 4091 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustSmall_OVERLAY.pngbin0 -> 1911 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustTiny.pngbin0 -> 3531 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustTiny.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustTiny_OVERLAY.pngbin0 -> 1899 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dust_OVERLAY.pngbin0 -> 1932 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/foil.pngbin0 -> 5928 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/foil_OVERLAY.pngbin0 -> 1970 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGt.pngbin0 -> 6702 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGtSmall.pngbin0 -> 4886 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGtSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGtSmall_OVERLAY.pngbin0 -> 1917 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGt_OVERLAY.pngbin0 -> 1976 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gem.pngbin0 -> 6514 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gem.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemChipped.pngbin0 -> 5174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemChipped.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemChipped_OVERLAY.pngbin0 -> 1939 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemExquisite.pngbin0 -> 6850 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemExquisite.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemExquisite_OVERLAY.pngbin0 -> 1971 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawed.pngbin0 -> 5572 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawed.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawed_OVERLAY.pngbin0 -> 1929 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawless.pngbin0 -> 5978 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawless.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawless_OVERLAY.pngbin0 -> 1945 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gem_OVERLAY.pngbin0 -> 1931 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/handleMallet.pngbin0 -> 4141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/handleMallet.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/handleMallet_OVERLAY.pngbin0 -> 1880 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingot.pngbin0 -> 6210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotDouble.pngbin0 -> 6881 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotDouble.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotDouble_OVERLAY.pngbin0 -> 1986 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotHot.pngbin0 -> 6210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotHot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuadruple.pngbin0 -> 7166 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuadruple_OVERLAY.pngbin0 -> 1997 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuintuple.pngbin0 -> 7221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuintuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuintuple_OVERLAY.pngbin0 -> 1986 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotTriple.pngbin0 -> 7011 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotTriple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotTriple_OVERLAY.pngbin0 -> 1990 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingot_OVERLAY.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/lens.pngbin0 -> 5978 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/lens.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/nugget.pngbin0 -> 3958 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/nugget.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/nugget_OVERLAY.pngbin0 -> 1909 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plate.pngbin0 -> 6131 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plate.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDense.pngbin0 -> 6556 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDense.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDense_OVERLAY.pngbin0 -> 1963 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDouble.pngbin0 -> 6614 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDouble.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDouble_OVERLAY.pngbin0 -> 1951 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuadruple.pngbin0 -> 7107 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuadruple_OVERLAY.pngbin0 -> 1982 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuintuple.pngbin0 -> 7058 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuintuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuintuple_OVERLAY.pngbin0 -> 1975 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateTriple.pngbin0 -> 6797 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateTriple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateTriple_OVERLAY.pngbin0 -> 1967 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plate_OVERLAY.pngbin0 -> 1949 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ring.pngbin0 -> 4739 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ring.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/rotor.pngbin0 -> 5092 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/rotor.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/rotor_OVERLAY.pngbin0 -> 1952 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/round.pngbin0 -> 3540 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/round.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/round_OVERLAY.pngbin0 -> 1895 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/screw.pngbin0 -> 3647 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/screw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/screw_OVERLAY.pngbin0 -> 1900 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/spring.pngbin0 -> 6113 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/spring.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/springSmall.pngbin0 -> 4171 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/springSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/springSmall_OVERLAY.pngbin0 -> 1885 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/spring_OVERLAY.pngbin0 -> 1891 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stick.pngbin0 -> 4210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stick.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stickLong.pngbin0 -> 3603 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stickLong.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stickLong_OVERLAY.pngbin0 -> 1879 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stick_OVERLAY.pngbin0 -> 1882 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadArrow.pngbin0 -> 4060 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadArrow.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadArrow_OVERLAY.pngbin0 -> 1906 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadAxe.pngbin0 -> 3918 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadAxe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadAxe_OVERLAY.pngbin0 -> 1897 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadBuzzSaw.pngbin0 -> 6636 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadBuzzSaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 1964 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadChainsaw.pngbin0 -> 3956 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadChainsaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadChainsaw_OVERLAY.pngbin0 -> 1911 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadDrill.pngbin0 -> 3822 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadDrill.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadDrill_OVERLAY.pngbin0 -> 1902 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadFile.pngbin0 -> 4333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadFile.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadFile_OVERLAY.pngbin0 -> 1885 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHammer.pngbin0 -> 4070 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHammer.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHammer_OVERLAY.pngbin0 -> 1891 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHoe.pngbin0 -> 3531 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHoe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHoe_OVERLAY.pngbin0 -> 1899 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadMallet.pngbin0 -> 4090 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadMallet.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadMallet_OVERLAY.pngbin0 -> 1897 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPickaxe.pngbin0 -> 3956 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPickaxe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPickaxe_OVERLAY.pngbin0 -> 1914 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPlow.pngbin0 -> 3987 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPlow.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPlow_OVERLAY.pngbin0 -> 1895 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSaw.pngbin0 -> 4123 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadScrewdriver.pngbin0 -> 3987 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadScrewdriver.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSense.pngbin0 -> 3638 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSense.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSense_OVERLAY.pngbin0 -> 1885 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadShovel.pngbin0 -> 3627 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadShovel.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadShovel_OVERLAY.pngbin0 -> 1898 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSoldering.pngbin0 -> 3721 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSoldering.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSoldering_OVERLAY.pngbin0 -> 1882 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSword.pngbin0 -> 4566 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSword.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSword_OVERLAY.pngbin0 -> 1900 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadUniversalSpade.pngbin0 -> 3634 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadUniversalSpade.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 1901 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadWrench.pngbin0 -> 3864 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadWrench.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/turbineBlade.pngbin0 -> 4956 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/turbineBlade.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/turbineBlade_OVERLAY.pngbin0 -> 1871 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/void.pngbin0 -> 2708 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/wireFine.pngbin0 -> 5182 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/wireFine.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/TURBINE_BLADE.pngbin0 -> 8004 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/TURBINE_BLADE.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtPlastic.pngbin0 -> 2192 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtPlastic.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtWood.pngbin0 -> 2192 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtWood.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/bolt.pngbin0 -> 1776 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/bolt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/casingSmall.pngbin0 -> 12936 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/casingSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cell.pngbin0 -> 3050 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cell.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cellPlasma.pngbin0 -> 3050 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cellPlasma.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtDust.pngbin0 -> 3783 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtDust.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtGem.pngbin0 -> 3514 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtGem.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtIngot.pngbin0 -> 3271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtIngot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtPlate.pngbin0 -> 4428 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtPlate.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushed.pngbin0 -> 10562 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushed.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedCentrifuged.pngbin0 -> 9424 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedCentrifuged.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedPurified.pngbin0 -> 11003 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedPurified.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dust.pngbin0 -> 7910 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dust.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustImpure.pngbin0 -> 7910 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustImpure.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustPure.pngbin0 -> 7910 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustPure.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustSmall.pngbin0 -> 4383 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustTiny.pngbin0 -> 2780 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustTiny.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/foil.pngbin0 -> 11404 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGt.pngbin0 -> 10763 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGtSmall.pngbin0 -> 6174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGtSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gem.pngbin0 -> 12514 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gem.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemChipped.pngbin0 -> 9157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemChipped.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemExquisite.pngbin0 -> 15313 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemExquisite.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawed.pngbin0 -> 10894 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawed.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawless.pngbin0 -> 11213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawless.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/handleMallet.pngbin0 -> 3378 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/handleMallet.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingot.pngbin0 -> 11249 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotDouble.pngbin0 -> 14517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotDouble.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotHot.pngbin0 -> 11188 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotHot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuadruple.pngbin0 -> 16435 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuintuple.pngbin0 -> 16846 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuintuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotTriple.pngbin0 -> 15301 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotTriple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/lens.pngbin0 -> 8348 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/lens.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/nugget.pngbin0 -> 4029 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/nugget.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plate.pngbin0 -> 8649 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plate.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDense.pngbin0 -> 9692 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDense.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDouble.pngbin0 -> 9941 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDouble.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuadruple.pngbin0 -> 12131 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuintuple.pngbin0 -> 12736 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuintuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateTriple.pngbin0 -> 11184 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateTriple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ring.pngbin0 -> 6129 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ring.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/rotor.pngbin0 -> 7918 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/rotor.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/round.pngbin0 -> 2621 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/round.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/screw.pngbin0 -> 2497 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/screw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/spring.pngbin0 -> 10294 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/spring.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/springSmall.pngbin0 -> 4260 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/springSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stick.pngbin0 -> 2286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stick.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stickLong.pngbin0 -> 2092 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stickLong.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadArrow.pngbin0 -> 4623 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadArrow.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadAxe.pngbin0 -> 3850 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadAxe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadBuzzSaw.pngbin0 -> 11277 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadBuzzSaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadChainsaw.pngbin0 -> 5222 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadChainsaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadDrill.pngbin0 -> 5126 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadDrill.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadFile.pngbin0 -> 3756 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadFile.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHammer.pngbin0 -> 3794 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHammer.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHoe.pngbin0 -> 2620 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHoe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadMallet.pngbin0 -> 2926 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadMallet.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPickaxe.pngbin0 -> 4293 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPickaxe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPlow.pngbin0 -> 4351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPlow.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSaw.pngbin0 -> 3631 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadScrewdriver.pngbin0 -> 2772 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadScrewdriver.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSense.pngbin0 -> 3491 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSense.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadShovel.pngbin0 -> 3230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadShovel.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSoldering.pngbin0 -> 2823 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSoldering.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSword.pngbin0 -> 3233 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSword.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadUniversalSpade.pngbin0 -> 3501 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadUniversalSpade.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadWrench.pngbin0 -> 4182 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadWrench.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/turbineBlade.pngbin0 -> 8004 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/turbineBlade.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/void.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/wireFine.pngbin0 -> 7629 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/wireFine.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/TURBINE_BLADE.pngbin0 -> 658 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/TURBINE_BLADE.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/TURBINE_BLADE_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtPlastic.pngbin0 -> 547 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtPlastic.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtPlastic_OVERLAY.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtWood.pngbin0 -> 547 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtWood.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtWood_OVERLAY.pngbin0 -> 294 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/bolt.pngbin0 -> 531 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/bolt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/bolt_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/casingSmall.pngbin0 -> 613 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/casingSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/casingSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cell.pngbin0 -> 521 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cell.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cellPlasma.pngbin0 -> 521 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cellPlasma.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cellPlasma_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cell_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtDust.pngbin0 -> 557 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtDust.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtDust_OVERLAY.pngbin0 -> 506 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtGem.pngbin0 -> 566 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtGem.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtIngot.pngbin0 -> 564 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtIngot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtIngot_OVERLAY.pngbin0 -> 517 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtPlate.pngbin0 -> 570 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtPlate.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtPlate_OVERLAY.pngbin0 -> 449 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushed.pngbin0 -> 820 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushed.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedCentrifuged.pngbin0 -> 660 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedCentrifuged.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedCentrifuged_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedPurified.pngbin0 -> 834 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedPurified.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedPurified_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushed_OVERLAY.pngbin0 -> 480 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dust.pngbin0 -> 621 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dust.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustImpure.pngbin0 -> 621 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustImpure.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustImpure_OVERLAY.pngbin0 -> 430 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustPure.pngbin0 -> 621 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustPure.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustPure_OVERLAY.pngbin0 -> 424 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustSmall.pngbin0 -> 562 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustTiny.pngbin0 -> 538 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustTiny.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustTiny_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dust_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/foil.pngbin0 -> 722 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/foil.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/foil_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGt.pngbin0 -> 729 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGt.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGtSmall.pngbin0 -> 643 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGtSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGtSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGt_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gem.pngbin0 -> 643 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gem.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemChipped.pngbin0 -> 707 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemChipped.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemChipped_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemExquisite.pngbin0 -> 796 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemExquisite.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemExquisite_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawed.pngbin0 -> 700 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawed.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawed_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawless.pngbin0 -> 728 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawless.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawless_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gem_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/handleMallet.pngbin0 -> 583 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/handleMallet.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/handleMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingot.pngbin0 -> 641 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotDouble.pngbin0 -> 699 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotDouble.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotDouble_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotHot.pngbin0 -> 629 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotHot.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotHot_OVERLAY.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuadruple.pngbin0 -> 673 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuintuple.pngbin0 -> 662 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuintuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotTriple.pngbin0 -> 687 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotTriple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingot_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/lens.pngbin0 -> 622 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/lens.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/lens_OVERLAY.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nanites.pngbin0 -> 381529 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nanites.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nanites_OVERLAY.pngbin0 -> 613 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nugget.pngbin0 -> 586 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nugget.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nugget_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plate.pngbin0 -> 618 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plate.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDense.pngbin0 -> 626 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDense.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDense_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDouble.pngbin0 -> 635 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDouble.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDouble_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuadruple.pngbin0 -> 648 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuadruple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuadruple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuintuple.pngbin0 -> 647 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuintuple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuintuple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateTriple.pngbin0 -> 645 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateTriple.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateTriple_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plate_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ring.pngbin0 -> 620 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ring.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ring_OVERLAY.pngbin0 -> 174 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/rotor.pngbin0 -> 745 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/rotor.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/rotor_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/round.pngbin0 -> 534 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/round.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/round_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/screw.pngbin0 -> 553 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/screw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/screw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/spring.pngbin0 -> 557 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/spring.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/springSmall.pngbin0 -> 552 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/springSmall.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/springSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/spring_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stick.pngbin0 -> 578 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stick.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stickLong.pngbin0 -> 532 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stickLong.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stickLong_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stick_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadArrow.pngbin0 -> 625 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadArrow.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadArrow_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadAxe.pngbin0 -> 583 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadAxe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadAxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadBuzzSaw.pngbin0 -> 765 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadBuzzSaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadChainsaw.pngbin0 -> 598 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadChainsaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadChainsaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadDrill.pngbin0 -> 625 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadDrill.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadDrill_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadFile.pngbin0 -> 583 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadFile.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadFile_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHammer.pngbin0 -> 559 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHammer.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHammer_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHoe.pngbin0 -> 562 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHoe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHoe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadMallet.pngbin0 -> 560 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadMallet.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadMallet_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPickaxe.pngbin0 -> 611 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPickaxe.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPickaxe_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPlow.pngbin0 -> 595 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPlow.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPlow_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSaw.pngbin0 -> 581 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSaw.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSaw_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadScrewdriver.pngbin0 -> 566 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadScrewdriver.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadScrewdriver_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSense.pngbin0 -> 572 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSense.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSense_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadShovel.pngbin0 -> 581 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadShovel.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadShovel_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSoldering.pngbin0 -> 566 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSoldering.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSoldering_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSword.pngbin0 -> 581 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSword.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSword_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadUniversalSpade.pngbin0 -> 581 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadUniversalSpade.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadWrench.pngbin0 -> 604 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadWrench.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadWrench_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/turbineBlade.pngbin0 -> 658 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/turbineBlade.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/turbineBlade_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/void.pngbin0 -> 475 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/void.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/void_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/wireFine.pngbin0 -> 716 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/wireFine.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/wireFine_OVERLAY.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustSmall.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustTiny_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dust_OVERLAY.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGt.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGtSmall.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGtSmall_OVERLAY.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGt_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gem.pngbin0 -> 257 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingot.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingot_OVERLAY.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/nugget.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/nugget_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/oreRaw.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/oreRaw_OVERLAY.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plate.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plate_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stick.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stick_OVERLAY.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadArrow.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadArrow_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSword.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dust.pngbin0 -> 301 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustImpure.pngbin0 -> 307 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustPure.pngbin0 -> 307 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustSmall.pngbin0 -> 262 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustTiny.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGt.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingot.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotDouble.pngbin0 -> 734 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuadruple.pngbin0 -> 728 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuintuple.pngbin0 -> 1136 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotTriple.pngbin0 -> 734 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/nugget.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/oreRaw.pngbin0 -> 335 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plate.pngbin0 -> 216 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stick.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/DULL/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustSmall.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustTiny_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dust_OVERLAY.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGt.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGtSmall.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGtSmall_OVERLAY.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGt_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gem.pngbin0 -> 325 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingot.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingot_OVERLAY.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/nugget.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/nugget_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/oreRaw.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/oreRaw_OVERLAY.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plate.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plate_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stick.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stick_OVERLAY.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadArrow.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadArrow_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSword.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtPlastic.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtPlastic_OVERLAY.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtWood.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtWood_OVERLAY.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bolt_OVERLAY.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedCentrifuged_OVERLAY.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedPurified_OVERLAY.pngbin0 -> 466 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushed_OVERLAY.pngbin0 -> 299 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustImpure_OVERLAY.pngbin0 -> 339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustPure_OVERLAY.pngbin0 -> 327 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustSmall.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustSmall_OVERLAY.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustTiny_OVERLAY.pngbin0 -> 187 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dust_OVERLAY.pngbin0 -> 198 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/foil_OVERLAY.pngbin0 -> 501 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGt.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGtSmall.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGtSmall_OVERLAY.pngbin0 -> 322 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGt_OVERLAY.pngbin0 -> 424 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemChipped_OVERLAY.pngbin0 -> 439 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemExquisite_OVERLAY.pngbin0 -> 492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawed_OVERLAY.pngbin0 -> 479 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawless_OVERLAY.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gem_OVERLAY.pngbin0 -> 364 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingot.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotDouble_OVERLAY.pngbin0 -> 419 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuadruple_OVERLAY.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuintuple_OVERLAY.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotTriple_OVERLAY.pngbin0 -> 290 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingot_OVERLAY.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/lens_OVERLAY.pngbin0 -> 482 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/nugget.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/nugget_OVERLAY.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plate.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDense_OVERLAY.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDouble_OVERLAY.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuadruple_OVERLAY.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuintuple_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateTriple_OVERLAY.pngbin0 -> 265 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plate_OVERLAY.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ring_OVERLAY.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/rotor_OVERLAY.pngbin0 -> 388 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/round_OVERLAY.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/screw_OVERLAY.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/springSmall_OVERLAY.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/spring_OVERLAY.pngbin0 -> 272 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stick.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stickLong_OVERLAY.pngbin0 -> 209 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stick_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadArrow_OVERLAY.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadAxe_OVERLAY.pngbin0 -> 209 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 463 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadChainsaw_OVERLAY.pngbin0 -> 294 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadDrill_OVERLAY.pngbin0 -> 308 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadFile_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHammer_OVERLAY.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHoe_OVERLAY.pngbin0 -> 196 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPickaxe_OVERLAY.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPlow_OVERLAY.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSaw_OVERLAY.pngbin0 -> 235 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadScrewdriver_OVERLAY.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSense_OVERLAY.pngbin0 -> 269 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadShovel_OVERLAY.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSword.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSword_OVERLAY.pngbin0 -> 219 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 209 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadWrench_OVERLAY.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/wireFine_OVERLAY.pngbin0 -> 411 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dust.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustImpure.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustPure.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustSmall.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustTiny.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGt.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingot.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/nugget.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plate.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stick.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FINE/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustSmall.pngbin0 -> 222 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGt.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gem.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingot.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/nugget.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plate.pngbin0 -> 216 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stick.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dust.pngbin0 -> 301 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustImpure.pngbin0 -> 307 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustPure.pngbin0 -> 307 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustSmall.pngbin0 -> 262 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustTiny.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGt.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingot.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/nugget.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plate.pngbin0 -> 216 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stick.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustSmall.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustTiny_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dust_OVERLAY.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGt.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGtSmall.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGtSmall_OVERLAY.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGt_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gem.pngbin0 -> 278 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingot.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingot_OVERLAY.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/nugget.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/nugget_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/oreRaw.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/oreRaw_OVERLAY.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plate.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plate_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stick.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stick_OVERLAY.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadArrow.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadArrow_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSword.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustSmall.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustTiny_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dust_OVERLAY.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGt.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGtSmall.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGtSmall_OVERLAY.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGt_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gem.pngbin0 -> 304 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingot.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingot_OVERLAY.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/nugget.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/nugget_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/oreRaw.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/oreRaw_OVERLAY.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plate.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plate_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stick.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stick_OVERLAY.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadArrow.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadArrow_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSword.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustSmall.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustTiny_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dust_OVERLAY.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGt.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGtSmall.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGtSmall_OVERLAY.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGt_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingot.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingot_OVERLAY.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/nugget.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/nugget_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/oreRaw.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plate.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plate_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stick.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stick_OVERLAY.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadArrow.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadArrow_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSword.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dust.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustImpure.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustPure.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustSmall.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustTiny.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGt.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gem.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingot.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/nugget.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/oreRaw.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/oreRaw_OVERLAY.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plate.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stick.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dust.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustImpure.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustPure.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustSmall.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustTiny.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGt.pngbin0 -> 497 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingot.pngbin0 -> 243 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/nugget.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plate.pngbin0 -> 536 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stick.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadArrow.pngbin0 -> 277 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadAxe.pngbin0 -> 221 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHoe.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadUniversalSpade.pngbin0 -> 216 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustSmall.pngbin0 -> 222 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGt.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gem.pngbin0 -> 334 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingot.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/nugget.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plate.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stick.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtPlastic_OVERLAY.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtWood_OVERLAY.pngbin0 -> 339 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bolt_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cellPlasma_OVERLAY.pngbin0 -> 325 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cell_OVERLAY.pngbin0 -> 347 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtDust_OVERLAY.pngbin0 -> 501 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtGem_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtIngot_OVERLAY.pngbin0 -> 500 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtPlate_OVERLAY.pngbin0 -> 497 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedCentrifuged_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedPurified_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushed_OVERLAY.pngbin0 -> 406 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dust.pngbin0 -> 244 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustImpure.pngbin0 -> 244 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustImpure_OVERLAY.pngbin0 -> 468 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustPure.pngbin0 -> 244 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustPure_OVERLAY.pngbin0 -> 469 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustSmall.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustSmall_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustTiny.pngbin0 -> 198 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustTiny_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dust_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/foil_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGt.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGtSmall_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGt_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gem.pngbin0 -> 306 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemChipped_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemExquisite_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawed_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawless_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gem_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotDouble_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotHot_OVERLAY.pngbin0 -> 351 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuadruple_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuintuple_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotTriple_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingot_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/lens_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/nugget.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/nugget_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plate.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDense_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDouble_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuadruple_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuintuple_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateTriple_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plate_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ring_OVERLAY.pngbin0 -> 265 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/rotor_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/round_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/screw_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/springSmall_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/spring_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stick.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stickLong_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stick_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadArrow_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadAxe_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadChainsaw_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadDrill_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadFile_OVERLAY.pngbin0 -> 318 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHammer_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHoe_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPickaxe_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPlow_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSaw_OVERLAY.pngbin0 -> 327 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadScrewdriver_OVERLAY.pngbin0 -> 327 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSense_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadShovel_OVERLAY.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSword_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadWrench_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/wireFine_OVERLAY.pngbin0 -> 382 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/TURBINE_BLADE.pngbin0 -> 289 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bolt.pngbin0 -> 107 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtGem_OVERLAY.pngbin0 -> 380 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dust.pngbin0 -> 244 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustImpure.pngbin0 -> 244 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustPure.pngbin0 -> 244 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustSmall.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustTiny.pngbin0 -> 198 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGt.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gem.pngbin0 -> 306 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingot.pngbin0 -> 726 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuadruple.pngbin0 -> 750 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuintuple.pngbin0 -> 742 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotTriple.pngbin0 -> 755 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/nugget.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/oreRaw.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plate.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ring.pngbin0 -> 245 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stick.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSense.pngbin0 -> 184 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/turbineBlade.pngbin0 -> 289 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.pngbin0 -> 253140 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites_OVERLAY.pngbin0 -> 609 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustSmall.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustTiny_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dust_OVERLAY.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGt.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGtSmall.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGtSmall_OVERLAY.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGt_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gem.pngbin0 -> 266 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingot.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingot_OVERLAY.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/nugget.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/nugget_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plate.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plate_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stick.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stick_OVERLAY.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadArrow.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadArrow_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSword.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cell.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cell_OVERLAY.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dust.pngbin0 -> 301 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustImpure.pngbin0 -> 307 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustPure.pngbin0 -> 307 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustSmall.pngbin0 -> 262 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustTiny.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGt.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingot.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/nugget.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plate.pngbin0 -> 216 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stick.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/NONE/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustSmall.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustTiny_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dust_OVERLAY.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGt.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGtSmall.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGtSmall_OVERLAY.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGt_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gem_OVERLAY.pngbin0 -> 635 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingot.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingot_OVERLAY.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/nugget.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/nugget_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/oreRaw.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/oreRaw_OVERLAY.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plate.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plate_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stick.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stick_OVERLAY.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadArrow.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadArrow_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSword.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dust.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustImpure.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustPure.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustSmall.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustTiny.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGt.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingot.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/nugget.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plate.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDouble.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuadruple.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuadruple_OVERLAY.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuintuple.pngbin0 -> 365 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuintuple_OVERLAY.pngbin0 -> 363 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateTriple.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateTriple_OVERLAY.pngbin0 -> 364 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plate_OVERLAY.pngbin0 -> 342 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stick.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dust.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustImpure.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustImpure_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustPure.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustPure_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustSmall.pngbin0 -> 175 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustTiny.pngbin0 -> 222 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGt.pngbin0 -> 395 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingot.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/nugget.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plate.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stick.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dust.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustImpure.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustPure.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustSmall.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustTiny.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGt.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gem.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingot.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/nugget.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/oreRaw.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plate.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stick.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustSmall.pngbin0 -> 222 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGt.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingot.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/nugget.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plate.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stick.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustSmall.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustTiny_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dust_OVERLAY.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGt.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGtSmall.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGtSmall_OVERLAY.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGt_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingot.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingot_OVERLAY.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/nugget.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/nugget_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/oreRaw.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/oreRaw_OVERLAY.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plate.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plate_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stick.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stick_OVERLAY.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadArrow.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadArrow_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSword.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushed_OVERLAY.pngbin0 -> 304 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dust.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustImpure.pngbin0 -> 319 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustImpure_OVERLAY.pngbin0 -> 358 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustPure.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustSmall.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustTiny.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGt.pngbin0 -> 511 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingot.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/nugget.pngbin0 -> 197 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plate.pngbin0 -> 373 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stick.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadArrow.pngbin0 -> 354 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SAND/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustSmall.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustTiny_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dust_OVERLAY.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGt.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGtSmall.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGtSmall_OVERLAY.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGt_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gem.pngbin0 -> 443 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingot.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingot_OVERLAY.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/nugget.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/nugget_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/oreRaw.pngbin0 -> 417 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/oreRaw_OVERLAY.pngbin0 -> 376 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plate.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plate_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stick.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stick_OVERLAY.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadArrow.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadArrow_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSword.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dust.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustImpure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustPure.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustSmall.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustSmall_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustTiny.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustTiny_OVERLAY.pngbin0 -> 143 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dust_OVERLAY.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGt.pngbin0 -> 384 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGtSmall.pngbin0 -> 478 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGtSmall_OVERLAY.pngbin0 -> 296 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGt_OVERLAY.pngbin0 -> 163 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingot.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingot_OVERLAY.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/nugget.pngbin0 -> 207 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/nugget_OVERLAY.pngbin0 -> 149 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/oreRaw.pngbin0 -> 328 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plate.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plate_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stick.pngbin0 -> 204 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stick_OVERLAY.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadArrow.pngbin0 -> 331 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadArrow_OVERLAY.pngbin0 -> 158 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSword.pngbin0 -> 215 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/TURBINE_BLADE.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/TURBINE_BLADE_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtPlastic.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtPlastic_OVERLAY.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtWood.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtWood_OVERLAY.pngbin0 -> 238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bolt.pngbin0 -> 161 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bolt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/casingSmall.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/casingSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cell.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cellPlasma.pngbin0 -> 310 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cellPlasma_OVERLAY.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cell_OVERLAY.pngbin0 -> 251 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtDust.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtDust_OVERLAY.pngbin0 -> 504 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtGem.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtGem_OVERLAY.pngbin0 -> 526 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtIngot.pngbin0 -> 333 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtIngot_OVERLAY.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtPlate.pngbin0 -> 446 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtPlate_OVERLAY.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushed.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedCentrifuged.pngbin0 -> 429 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedCentrifuged_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedPurified.pngbin0 -> 431 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedPurified_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushed_OVERLAY.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dust.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustImpure.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustImpure_OVERLAY.pngbin0 -> 374 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustPure.pngbin0 -> 321 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustPure_OVERLAY.pngbin0 -> 371 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustSmall.pngbin0 -> 271 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustTiny.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustTiny_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dust_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/foil.pngbin0 -> 471 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/foil_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGt.pngbin0 -> 497 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGtSmall.pngbin0 -> 516 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGtSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGt_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gem.pngbin0 -> 353 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemChipped.pngbin0 -> 567 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemChipped_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemExquisite.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemExquisite_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawed.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawed_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawless.pngbin0 -> 657 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawless_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gem_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/handleMallet.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/handleMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingot.pngbin0 -> 412 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotDouble.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotHot.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotHot_OVERLAY.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuadruple.pngbin0 -> 273 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuintuple.pngbin0 -> 267 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotTriple.pngbin0 -> 284 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingot_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/lens.pngbin0 -> 230 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/lens_OVERLAY.pngbin0 -> 513 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/nugget.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/nugget_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/oreRaw.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/oreRaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plate.pngbin0 -> 220 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDense.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDouble.pngbin0 -> 236 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDouble_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuadruple.pngbin0 -> 258 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuadruple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuintuple.pngbin0 -> 254 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuintuple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateTriple.pngbin0 -> 250 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateTriple_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plate_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ring.pngbin0 -> 311 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ring_OVERLAY.pngbin0 -> 152 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/rotor.pngbin0 -> 385 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/rotor_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/round.pngbin0 -> 179 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/round_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/screw.pngbin0 -> 170 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/screw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/spring.pngbin0 -> 274 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/springSmall.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/springSmall_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/spring_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stick.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stickLong.pngbin0 -> 214 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stickLong_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stick_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadArrow.pngbin0 -> 355 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadArrow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadAxe.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadAxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadBuzzSaw.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadBuzzSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadChainsaw.pngbin0 -> 509 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadChainsaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadDrill.pngbin0 -> 499 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadDrill_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadFile.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadFile_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHammer.pngbin0 -> 203 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHammer_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHoe.pngbin0 -> 194 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHoe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadMallet.pngbin0 -> 2856 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadMallet_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPickaxe.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPickaxe_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPlow.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPlow_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSaw.pngbin0 -> 232 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSaw_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadScrewdriver.pngbin0 -> 155 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadScrewdriver_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSense.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSense_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadShovel.pngbin0 -> 200 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadShovel_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSoldering.pngbin0 -> 1157 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSoldering_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSword.pngbin0 -> 213 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSword_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadUniversalSpade.pngbin0 -> 202 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadUniversalSpade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadWrench.pngbin0 -> 494 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadWrench_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/turbineBlade.pngbin0 -> 1238 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/turbineBlade_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/void.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/void_OVERLAY.pngbin0 -> 141 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/wireFine.pngbin0 -> 408 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/wireFine_OVERLAY.pngbin0 -> 270 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/model/drone.obj3836
-rw-r--r--src/main/resources/assets/gregtech/textures/model/drone.pngbin0 -> 69596 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Ariel.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Arrokoth.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Callisto.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Ceres.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Deimos.pngbin0 -> 381 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Enceladus.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Europa.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Ganymede.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Hyperion.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Iapetus.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Io.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Jupiter.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/KuiperBelt.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/MakeMake.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Mars.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Mercury.pngbin0 -> 570 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Mimas.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Miranda.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Moon.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Neptune.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Nereid.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Oberon.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Overworld.pngbin0 -> 612 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Phobos.pngbin0 -> 492 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Phoebe.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Pluto.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Proteus.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Rhea.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Saturn.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Sol.pngbin0 -> 639 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Tethys.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Titan.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Titania.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Triton.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Umbriel.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Uranus.pngbin0 -> 483 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/solarsystem/Venus.pngbin0 -> 648 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds.json389
-rw-r--r--src/main/resources/assets/ic2/sounds/BatteryUse.oggbin0 -> 24753 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/ChainsawIdle.oggbin0 -> 34162 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/ChainsawStop.oggbin0 -> 10048 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/ChainsawUseOne.oggbin0 -> 10900 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/ChainsawUseTwo.oggbin0 -> 8411 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/CompressorOp.oggbin0 -> 140079 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/DrillHard.oggbin0 -> 7513 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/DrillSoft.oggbin0 -> 7110 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/DrillUseLoop.oggbin0 -> 54179 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/Dynamiteomote.oggbin0 -> 6901 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/ElectroFurnaceLoop.oggbin0 -> 60020 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/ExtractorOp.oggbin0 -> 164062 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/HelmetLoop.oggbin0 -> 39145 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/InductionLoop.oggbin0 -> 67146 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/InsulationCutters.oggbin0 -> 5997 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/InterruptOne.oggbin0 -> 11034 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/IronFurnaceOp.oggbin0 -> 103380 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/JetpackFire.oggbin0 -> 5948 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/JetpackLoop.oggbin0 -> 43367 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/KaChing.oggbin0 -> 21085 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/MaceratorOp.oggbin0 -> 153620 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/MachineOverload.oggbin0 -> 17256 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/MagnetizerLoop.oggbin0 -> 27477 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/MinerOp.oggbin0 -> 101728 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/MiningLaser.oggbin0 -> 8133 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/MiningLaserExplosive.oggbin0 -> 13806 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/MiningLaserLongRange.oggbin0 -> 9955 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/MiningLaserLowFocus.oggbin0 -> 8172 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/MiningLaserScatter.oggbin0 -> 14390 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/NanosabreIdle.oggbin0 -> 184329 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/NanosabrePowerup.oggbin0 -> 8004 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/NanosabreSwing1.oggbin0 -> 4975 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/NanosabreSwing2.oggbin0 -> 5598 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/NanosabreSwing3.oggbin0 -> 7215 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/NukeExplosion.oggbin0 -> 74917 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/ODScanner.oggbin0 -> 5271 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/Painter.oggbin0 -> 13451 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/PumpOp.oggbin0 -> 83785 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/QuantumsuitBoots.oggbin0 -> 6026 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/RecyclerOp.oggbin0 -> 19563 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/RubberTrampoline.oggbin0 -> 7951 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/Treetap.oggbin0 -> 6172 bytes
-rw-r--r--src/main/resources/assets/ic2/sounds/Wrench.oggbin0 -> 12629 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.1.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.2.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.3.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.4.pngbin0 -> 369 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bauxia.1.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bauxia.2.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bauxia.3.pngbin0 -> 562 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.1.pngbin0 -> 177 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.2.pngbin0 -> 205 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.3.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.4.pngbin0 -> 225 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.1.pngbin0 -> 2834 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.2.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.3.pngbin0 -> 2896 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.4.pngbin0 -> 2966 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Brown Mushrooms.1.pngbin0 -> 154 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Brown Mushrooms.2.pngbin0 -> 186 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Brown Mushrooms.3.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.1.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.2.pngbin0 -> 280 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.3.pngbin0 -> 369 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.4.pngbin0 -> 462 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Coppon.1.pngbin0 -> 211 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Coppon.2.pngbin0 -> 387 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Coppon.3.pngbin0 -> 368 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.1.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.2.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.3.pngbin0 -> 400 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.4.pngbin0 -> 454 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.1.pngbin0 -> 191 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.2.pngbin0 -> 231 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.3.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.4.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.1.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.2.pngbin0 -> 234 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.3.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.4.pngbin0 -> 292 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.1.pngbin0 -> 246 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.2.pngbin0 -> 393 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.3.pngbin0 -> 564 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.4.pngbin0 -> 627 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.1.pngbin0 -> 177 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.2.pngbin0 -> 205 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.3.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.4.pngbin0 -> 2870 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Eggplant.1.pngbin0 -> 154 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Eggplant.2.pngbin0 -> 183 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Eggplant.3.pngbin0 -> 248 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.1.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.2.pngbin0 -> 175 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.3.pngbin0 -> 210 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.4.pngbin0 -> 316 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.1.pngbin0 -> 166 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.2.pngbin0 -> 288 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.3.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.4.pngbin0 -> 309 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.1.pngbin0 -> 347 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.2.pngbin0 -> 364 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.3.pngbin0 -> 398 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.4.pngbin0 -> 237 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.1.pngbin0 -> 3082 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.2.pngbin0 -> 3066 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.3.pngbin0 -> 3176 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.4.pngbin0 -> 3474 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Galvania.1.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Galvania.2.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Galvania.3.pngbin0 -> 369 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.1.pngbin0 -> 362 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.2.pngbin0 -> 421 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.3.pngbin0 -> 520 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.4.pngbin0 -> 642 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.5.pngbin0 -> 713 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.6.pngbin0 -> 814 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.7.pngbin0 -> 666 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.1.pngbin0 -> 347 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.2.pngbin0 -> 364 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.3.pngbin0 -> 398 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.4.pngbin0 -> 430 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.1.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.2.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.3.pngbin0 -> 465 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.4.pngbin0 -> 619 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.1.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.2.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.3.pngbin0 -> 2955 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.4.pngbin0 -> 3026 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.1.pngbin0 -> 3082 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.2.pngbin0 -> 3066 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.3.pngbin0 -> 3176 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.4.pngbin0 -> 3407 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.1.pngbin0 -> 341 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.2.pngbin0 -> 474 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.3.pngbin0 -> 548 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.4.pngbin0 -> 687 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.1.pngbin0 -> 2834 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.2.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.3.pngbin0 -> 2896 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.4.pngbin0 -> 3032 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.1.pngbin0 -> 157 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.2.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.3.pngbin0 -> 239 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.4.pngbin0 -> 295 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Micadia.1.pngbin0 -> 160 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Micadia.2.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Micadia.3.pngbin0 -> 288 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Milkwart.1.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Milkwart.2.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Milkwart.3.pngbin0 -> 418 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Nickelback.1.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Nickelback.2.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Nickelback.3.pngbin0 -> 369 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.1.pngbin0 -> 2847 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.2.pngbin0 -> 2899 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.3.pngbin0 -> 2923 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.4.pngbin0 -> 2949 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.1.pngbin0 -> 2834 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.2.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.3.pngbin0 -> 2896 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.4.pngbin0 -> 2966 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.1.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.2.pngbin0 -> 240 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.3.pngbin0 -> 468 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.4.pngbin0 -> 514 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.1.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.2.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.3.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.4.pngbin0 -> 369 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.1.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.2.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.3.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.4.pngbin0 -> 368 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Pyrolusium.1.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Pyrolusium.2.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Pyrolusium.3.pngbin0 -> 369 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.1.pngbin0 -> 227 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.2.pngbin0 -> 283 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.3.pngbin0 -> 307 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.4.pngbin0 -> 350 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.1.pngbin0 -> 3082 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.2.pngbin0 -> 3066 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.3.pngbin0 -> 3176 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.4.pngbin0 -> 682 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.1.pngbin0 -> 219 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.2.pngbin0 -> 305 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.3.pngbin0 -> 337 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.4.pngbin0 -> 356 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Red Mushrooms.1.pngbin0 -> 154 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Red Mushrooms.2.pngbin0 -> 208 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Red Mushrooms.3.pngbin0 -> 235 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.1.pngbin0 -> 2834 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.2.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.3.pngbin0 -> 2896 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.4.pngbin0 -> 3018 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Scheelinium.1.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Scheelinium.2.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Scheelinium.3.pngbin0 -> 369 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.1.pngbin0 -> 159 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.2.pngbin0 -> 242 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.3.pngbin0 -> 343 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.4.pngbin0 -> 360 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.1.pngbin0 -> 191 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.2.pngbin0 -> 223 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.3.pngbin0 -> 263 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.4.pngbin0 -> 257 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.1.pngbin0 -> 2838 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.2.pngbin0 -> 2875 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.3.pngbin0 -> 2908 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.4.pngbin0 -> 2945 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.1.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.2.pngbin0 -> 279 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.3.pngbin0 -> 418 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.4.pngbin0 -> 671 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.1.pngbin0 -> 2834 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.2.pngbin0 -> 2873 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.3.pngbin0 -> 2896 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.4.pngbin0 -> 3054 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.1.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.2.pngbin0 -> 275 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.3.pngbin0 -> 452 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.4.pngbin0 -> 557 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.1.pngbin0 -> 180 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.2.pngbin0 -> 224 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.3.pngbin0 -> 255 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.4.pngbin0 -> 289 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tine.1.pngbin0 -> 166 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tine.2.pngbin0 -> 288 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tine.3.pngbin0 -> 286 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Titania.1.pngbin0 -> 185 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Titania.2.pngbin0 -> 367 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Titania.3.pngbin0 -> 532 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.1.pngbin0 -> 189 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.2.pngbin0 -> 253 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.3.pngbin0 -> 346 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.4.pngbin0 -> 436 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.1.pngbin0 -> 2847 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.2.pngbin0 -> 2899 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.3.pngbin0 -> 2923 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.4.pngbin0 -> 3131 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.1.pngbin0 -> 569 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.2.pngbin0 -> 2870 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.3.pngbin0 -> 289 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.4.pngbin0 -> 316 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.5.pngbin0 -> 359 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.1.pngbin0 -> 177 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.2.pngbin0 -> 205 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.3.pngbin0 -> 226 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.4.pngbin0 -> 2880 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.1.pngbin0 -> 191 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.2.pngbin0 -> 231 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.3.pngbin0 -> 259 bytes
-rw-r--r--src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.4.pngbin0 -> 473 bytes
-rw-r--r--src/main/resources/assets/minecraft/textures/models/armor/cloakingdevice_layer_1.pngbin0 -> 1001 bytes
-rw-r--r--src/main/resources/assets/minecraft/textures/models/armor/lapotronpack_layer_1.pngbin0 -> 1000 bytes
-rw-r--r--src/main/resources/assets/minecraft/textures/models/armor/lithiumbatpack_layer_1.pngbin0 -> 401 bytes
-rw-r--r--src/main/resources/mcmod.info94
-rw-r--r--src/test/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBaseTest.java46
-rw-r--r--src/test/java/gregtech/common/items/CombTypeTest.java42
-rw-r--r--src/test/java/gregtech/globalenergymap/IGlobalWirelessEnergy_UnitTest.java127
-rw-r--r--src/test/java/gregtech/overclock/GT_OverclockCalculator_UnitTest.java598
-rw-r--r--src/test/java/net/glease/ggfab/util/OverclockHelperTest.java47
16246 files changed, 464507 insertions, 99 deletions
diff --git a/.editorconfig b/.editorconfig
index 6effbc91a8..ebbc2b6320 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -15,5 +15,5 @@ trim_trailing_whitespace = true
[*.{bat,ini}]
end_of_line = crlf
-[*.{dtd,json,info,mcmeta,md,sh,svg,xml,xsd,xsl,yaml,yml}]
+[*.{dtd,json,mcmeta,md,sh,svg,xml,xsd,xsl,yaml,yml}]
indent_size = 2
diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
index b4d44c6096..1bf7b726ae 100644
--- a/.git-blame-ignore-revs
+++ b/.git-blame-ignore-revs
@@ -1,4 +1,14 @@
+# Ancient reformat
+9353aa711b1d750ff945acdfed2d3b956291b615
# Ignore spotlessApply reformat
-f0f62d38a0c7834336afb73446ed67f7a850ae44
-dff9a4e6c3e688dd66dd44ce546d1d1e01f5c77a
-9c07ac0bffe24963f4fd6f44d148e3dcea5b2fd7
+6f31720697bcc351421a4d86ba3bf749375dd12c
+273a5b3458dde88c2d3a5dcf1eec02de0c5054b5
+0d9aab72aa570f13dc3e32e0d32b3f3a95f95e0a
+5f50e4a36ec000657b0a1664784acf00275293c6
+8ac58626bd4caa9e49f58acc6b97ac031f6c2107
+# Ignore large automated refactor to make use of Java 17 features
+b088958c9f6935d356b6c087c8e8106b400aa24f
+# GigaGramFab spotless
+d755802d116daddc62b47679d7f65490c4bdd7d6
+dc9f68ad0ab8ce378a1680da0d59510de1f7236c
+
diff --git a/.github/pr-branch-labeler.yml b/.github/pr-branch-labeler.yml
new file mode 100644
index 0000000000..b3a4edc8ea
--- /dev/null
+++ b/.github/pr-branch-labeler.yml
@@ -0,0 +1,2 @@
+MuTE:
+ base: 'feature/MuTEMaster'
diff --git a/.github/test-scala-presence.toml b/.github/test-scala-presence.toml
new file mode 100644
index 0000000000..ae0e9acd49
--- /dev/null
+++ b/.github/test-scala-presence.toml
@@ -0,0 +1,2 @@
+[exclude]
+"src/main/java/**/*.java" = "import scala." \ No newline at end of file
diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml
index 3ee2f686fd..4911b0f678 100644
--- a/.github/workflows/build-and-test.yml
+++ b/.github/workflows/build-and-test.yml
@@ -11,3 +11,5 @@ jobs:
build-and-test:
uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/build-and-test.yml@master
secrets: inherit
+ with:
+ timeout: 150
diff --git a/.github/workflows/label-mute-prs.yml b/.github/workflows/label-mute-prs.yml
new file mode 100644
index 0000000000..80ae613b38
--- /dev/null
+++ b/.github/workflows/label-mute-prs.yml
@@ -0,0 +1,17 @@
+name: Pull request labeling
+
+on:
+ pull_request_target:
+ types:
+ - opened
+ branches:
+ - 'feature/MuTEMaster'
+
+jobs:
+ label_prs:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Label MuTE PRs
+ uses: ffittschen/pr-branch-labeler@v1
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/test-scala-presence.yml b/.github/workflows/test-scala-presence.yml
new file mode 100644
index 0000000000..6b1091e1fd
--- /dev/null
+++ b/.github/workflows/test-scala-presence.yml
@@ -0,0 +1,18 @@
+name: Test Scala Presence
+
+on:
+ pull_request:
+ branches: [ master, main ]
+ push:
+ branches: [ master, main ]
+
+jobs:
+ test-scala-presence:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Check file content
+ uses: mattsb42-meta/not-grep@1.0.0
+ with:
+ config-file: ./.github/test-scala-presence.toml
diff --git a/.gitignore b/.gitignore
index 5e80e0ae57..53a3289fa2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,4 +35,5 @@ addon.local.gradle
addon.local.gradle.kts
addon.late.local.gradle
addon.late.local.gradle.kts
+/.vs
layout.json
diff --git a/LICENSE b/LICENSE.txt
index 0a041280bd..0a041280bd 100644
--- a/LICENSE
+++ b/LICENSE.txt
diff --git a/README.md b/README.md
index a18852bc19..968c8f1738 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,48 @@
-# bartworks
-A Gregtech addon, that adds GT2,3,4 stuff, a BioLabor, and much more custom content. Integration for Galaxy Space, and new Ores as well.
-Visit us on Twitch:
-https://minecraft.curseforge.com/projects/bartworks/
+GT5-Unofficial
+===
-Please add -Dfml.coreMods.load=com.github.bartimaeusnek.bartworks.ASM.BWCorePlugin to your args when you run this in a dev environment!
+## About
-Any issues with this code should be reported to the [GTNH GitHub](https://github.com/GTNewHorizons/GT-New-Horizons-Modpack/issues).
+GT5-Unofficial is a decompiled and modified version of GT5.07.07. The goal of the mod is to maintain and extend the end
+game of GT5. This version has been heavily modified for use with the GTNH modpack.
+
+## Downloads
+
+Builds can be found on the [GTNH Jenkins Server](http://jenkins.usrv.eu:8080/job/Gregtech-5-Unofficial/).
+
+## Installation
+
+GT5U requires IndustrialCraft2-experimental. Version 2:2.2.828-experimental is recommended.
+Forge versions 1428-1480 are known to break multiplayer. 1614 is recommended.
+Place the downloaded jar file into your mods/ folder. A number of other mods may be required, see dependencies.gradle
+
+## Issues
+
+Please report any issues you to find to the main GTNH issue tracker. Include as much information as possible including
+as version and steps to reproduce.
+
+## Contribution
+
+Please do! However, please take a note of
+[current issues](https://github.com/GTNewHorizons/GT-New-Horizons-Modpack/issues) and what is currently being worked on.
+
+It is suggested to run `./gradlew build` inside your cloned repository before importing it to your IDE. This will reduce
+the chance of strange errors.
+
+## Attribution
+
+Some textures/ideas have been taken from future versions of GT and texture pack authors for GTNH. Credit goes to Jimbno
+for the UU-Tex texture pack and its contributions to the base pack here: https://github.com/Jimbno/UU-Tex.
## License
-GTNH modifications Copyright (c) 2021-2024 The GTNH Team
+GT5-Unofficial is free software: you can redistribute it and/or modify it under the terms of the
+GNU Lesser General Public License as published by the Free Software Foundation, either version 3
+of the License, or (at your option) any later version.
-This code is licensed LGPL v3.0 or later. Feel free to use our changes, just give back any changes you make to the community as well!
+GT5-Unofficial is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU Lesser General Public License for more details.
-Original code Copyright (c) bartimaeusnek 2018-2020 and was released under the MIT license.
+You should have received a copy of the GNU Lesser General Public License along with GT5-Unofficial.
+If not, see <http://www.gnu.org/licenses/>.
diff --git a/addon.gradle b/addon.gradle
new file mode 100644
index 0000000000..f760bb1537
--- /dev/null
+++ b/addon.gradle
@@ -0,0 +1,81 @@
+compileJava {
+ options.encoding = "UTF-8"
+}
+test {
+ useJUnitPlatform()
+ testLogging {
+ events "passed", "skipped", "failed"
+ }
+}
+
+minecraft {
+ def vMajor, vMinor, vPatch, logLevel = LogLevel.INFO
+ try {
+ String version = project.version
+ def (five,major,minor,patch)= version.split("[.-]", 5)
+
+ vMajor = 500 + major.toInteger()
+ vMinor = minor.toInteger()
+ vPatch = patch.toInteger()
+ } catch (Exception ex) {
+ try {
+ String version = "git describe".execute().text
+ def (five,major,minor,patch)= version.split("[.-]", 5)
+ vMajor = 500 + major.toInteger()
+ vMinor = minor.toInteger()
+ vPatch = patch.toInteger()
+ logLevel = LogLevel.LIFECYCLE
+ } catch (Exception ex2) {
+ def err = "Cannot automatically determine NBT version. Using defaults hardcoded in buildscript. This could break your world!"
+ project.logger.error(err)
+ vMajor = 509
+ vMinor = 44
+ vPatch = 0
+ logLevel = LogLevel.WARN
+ }
+ }
+ injectedTags.put 'VERSION_MAJOR', vMajor
+ injectedTags.put 'VERSION_MINOR', vMinor
+ injectedTags.put 'VERSION_PATCH', vPatch
+ project.logger.log(logLevel, 'Using ({}, {}, {}) as NBT version', vMajor, vMinor, vPatch)
+}
+
+SourceSet functionalTestSet = null
+
+sourceSets {
+ functionalTestSet = create("functionalTest") {
+ java {
+ srcDir("src/functionalTest/java")
+ compileClasspath += sourceSets.patchedMc.output + sourceSets.main.output
+ }
+ }
+}
+
+configurations { configs ->
+ // Keep all dependencies from the main mod in the functional test mod
+ named(functionalTestSet.compileClasspathConfigurationName).configure {it.extendsFrom(named("compileClasspath").get())}
+ named(functionalTestSet.runtimeClasspathConfigurationName).configure {it.extendsFrom(named("runtimeClasspath").get())}
+ named(functionalTestSet.annotationProcessorConfigurationName).configure {it.extendsFrom(named("annotationProcessor").get())}
+}
+
+tasks.register(functionalTestSet.jarTaskName, Jar) {
+ from(functionalTestSet.output)
+ archiveClassifier.set("functionalTests")
+ // we don't care about the version number here, keep it stable to avoid polluting the tmp directory
+ archiveVersion.set("1.0")
+ destinationDirectory.set(new File(buildDir, "tmp"))
+}
+tasks.named("assemble").configure {
+ dependsOn(functionalTestSet.jarTaskName)
+}
+
+// Run tests in the default runServer/runClient configurations
+tasks.named("runServer", JavaExec).configure {
+ dependsOn(functionalTestSet.jarTaskName)
+ classpath(configurations.named(functionalTestSet.runtimeClasspathConfigurationName), tasks.named(functionalTestSet.jarTaskName))
+}
+
+tasks.named("runClient", JavaExec).configure {
+ dependsOn(functionalTestSet.jarTaskName)
+ classpath(configurations.named(functionalTestSet.runtimeClasspathConfigurationName), tasks.named(functionalTestSet.jarTaskName))
+}
diff --git a/bartworks/.editorconfig b/bartworks/.editorconfig
new file mode 100644
index 0000000000..6effbc91a8
--- /dev/null
+++ b/bartworks/.editorconfig
@@ -0,0 +1,19 @@
+# This is the universal Text Editor Configuration
+# for all GTNewHorizons projects
+# See: https://editorconfig.org/
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.{bat,ini}]
+end_of_line = crlf
+
+[*.{dtd,json,info,mcmeta,md,sh,svg,xml,xsd,xsl,yaml,yml}]
+indent_size = 2
diff --git a/bartworks/.git-blame-ignore-revs b/bartworks/.git-blame-ignore-revs
new file mode 100644
index 0000000000..b4d44c6096
--- /dev/null
+++ b/bartworks/.git-blame-ignore-revs
@@ -0,0 +1,4 @@
+# Ignore spotlessApply reformat
+f0f62d38a0c7834336afb73446ed67f7a850ae44
+dff9a4e6c3e688dd66dd44ce546d1d1e01f5c77a
+9c07ac0bffe24963f4fd6f44d148e3dcea5b2fd7
diff --git a/bartworks/.gitattributes b/bartworks/.gitattributes
new file mode 100644
index 0000000000..fd2792b6cb
--- /dev/null
+++ b/bartworks/.gitattributes
@@ -0,0 +1,44 @@
+* text eol=lf
+
+*.[jJ][aA][rR] binary
+
+*.[pP][nN][gG] binary
+*.[jJ][pP][gG] binary
+*.[jJ][pP][eE][gG] binary
+*.[gG][iI][fF] binary
+*.[tT][iI][fF] binary
+*.[tT][iI][fF][fF] binary
+*.[iI][cC][oO] binary
+*.[sS][vV][gG] text
+*.[eE][pP][sS] binary
+*.[xX][cC][fF] binary
+
+*.[kK][aA][rR] binary
+*.[mM]4[aA] binary
+*.[mM][iI][dD] binary
+*.[mM][iI][dD][iI] binary
+*.[mM][pP]3 binary
+*.[oO][gG][gG] binary
+*.[rR][aA] binary
+
+*.7[zZ] binary
+*.[gG][zZ] binary
+*.[tT][aA][rR] binary
+*.[tT][gG][zZ] binary
+*.[zZ][iI][pP] binary
+
+*.[tT][cC][nN] binary
+*.[sS][oO] binary
+*.[dD][lL][lL] binary
+*.[dD][yY][lL][iI][bB] binary
+*.[pP][sS][dD] binary
+*.[tT][tT][fF] binary
+*.[oO][tT][fF] binary
+
+*.[pP][aA][tT][cC][hH] -text
+
+*.[bB][aA][tT] text eol=crlf
+*.[cC][mM][dD] text eol=crlf
+*.[pP][sS]1 text eol=crlf
+
+*[aA][uU][tT][oO][gG][eE][nN][eE][rR][aA][tT][eE][dD]* binary
diff --git a/bartworks/.github/workflows/build-and-test.yml b/bartworks/.github/workflows/build-and-test.yml
new file mode 100644
index 0000000000..3ee2f686fd
--- /dev/null
+++ b/bartworks/.github/workflows/build-and-test.yml
@@ -0,0 +1,13 @@
+
+name: Build and test
+
+on:
+ pull_request:
+ branches: [ master, main ]
+ push:
+ branches: [ master, main ]
+
+jobs:
+ build-and-test:
+ uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/build-and-test.yml@master
+ secrets: inherit
diff --git a/bartworks/.github/workflows/release-tags.yml b/bartworks/.github/workflows/release-tags.yml
new file mode 100644
index 0000000000..e4c0be6b0d
--- /dev/null
+++ b/bartworks/.github/workflows/release-tags.yml
@@ -0,0 +1,14 @@
+
+name: Release tagged build
+
+on:
+ push:
+ tags: [ '*' ]
+
+permissions:
+ contents: write
+
+jobs:
+ release-tags:
+ uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/release-tags.yml@master
+ secrets: inherit
diff --git a/bartworks/.gitignore b/bartworks/.gitignore
new file mode 100644
index 0000000000..5e80e0ae57
--- /dev/null
+++ b/bartworks/.gitignore
@@ -0,0 +1,38 @@
+.gradle
+.settings
+/.idea/
+/.vscode/
+/run/
+/build/
+/eclipse/
+.classpath
+.project
+/bin/
+/config/
+/crash-reports/
+/logs/
+options.txt
+/saves/
+usernamecache.json
+banned-ips.json
+banned-players.json
+eula.txt
+ops.json
+server.properties
+servers.dat
+usercache.json
+whitelist.json
+/out/
+*.iml
+*.ipr
+*.iws
+src/main/resources/mixins.*([!.]).json
+*.bat
+*.DS_Store
+!gradlew.bat
+.factorypath
+addon.local.gradle
+addon.local.gradle.kts
+addon.late.local.gradle
+addon.late.local.gradle.kts
+layout.json
diff --git a/BWLogo.png b/bartworks/BWLogo.png
index 61e1a41a95..61e1a41a95 100644
--- a/BWLogo.png
+++ b/bartworks/BWLogo.png
Binary files differ
diff --git a/BlockAdderGenerator/biovatgen.py b/bartworks/BlockAdderGenerator/biovatgen.py
index 650cc52de7..650cc52de7 100644
--- a/BlockAdderGenerator/biovatgen.py
+++ b/bartworks/BlockAdderGenerator/biovatgen.py
diff --git a/BlockAdderGenerator/csv.csv b/bartworks/BlockAdderGenerator/csv.csv
index 2f1ee7ef53..2f1ee7ef53 100644
--- a/BlockAdderGenerator/csv.csv
+++ b/bartworks/BlockAdderGenerator/csv.csv
diff --git a/CHANGELOG-2.1.1.0.md b/bartworks/CHANGELOG-2.1.1.0.md
index 4018003d1e..4018003d1e 100644
--- a/CHANGELOG-2.1.1.0.md
+++ b/bartworks/CHANGELOG-2.1.1.0.md
diff --git a/bartworks/CODEOWNERS b/bartworks/CODEOWNERS
new file mode 100644
index 0000000000..a6b5f68cd0
--- /dev/null
+++ b/bartworks/CODEOWNERS
@@ -0,0 +1,3 @@
+# Any Github changes require admin approval
+/.github/** @GTNewHorizons/admin
+
diff --git a/ID Range.txt b/bartworks/ID Range.txt
index 264b4c9661..264b4c9661 100644
--- a/ID Range.txt
+++ b/bartworks/ID Range.txt
diff --git a/bartworks/LICENSE b/bartworks/LICENSE
new file mode 100644
index 0000000000..0a041280bd
--- /dev/null
+++ b/bartworks/LICENSE
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/bartworks/README.md b/bartworks/README.md
new file mode 100644
index 0000000000..a18852bc19
--- /dev/null
+++ b/bartworks/README.md
@@ -0,0 +1,16 @@
+# bartworks
+A Gregtech addon, that adds GT2,3,4 stuff, a BioLabor, and much more custom content. Integration for Galaxy Space, and new Ores as well.
+Visit us on Twitch:
+https://minecraft.curseforge.com/projects/bartworks/
+
+Please add -Dfml.coreMods.load=com.github.bartimaeusnek.bartworks.ASM.BWCorePlugin to your args when you run this in a dev environment!
+
+Any issues with this code should be reported to the [GTNH GitHub](https://github.com/GTNewHorizons/GT-New-Horizons-Modpack/issues).
+
+## License
+
+GTNH modifications Copyright (c) 2021-2024 The GTNH Team
+
+This code is licensed LGPL v3.0 or later. Feel free to use our changes, just give back any changes you make to the community as well!
+
+Original code Copyright (c) bartimaeusnek 2018-2020 and was released under the MIT license.
diff --git a/bartworks/build.gradle b/bartworks/build.gradle
new file mode 100644
index 0000000000..e57a16f9f1
--- /dev/null
+++ b/bartworks/build.gradle
@@ -0,0 +1,5 @@
+//version: 1707058017
+
+plugins {
+ id 'com.gtnewhorizons.gtnhconvention'
+}
diff --git a/bartworks/dependencies.gradle b/bartworks/dependencies.gradle
new file mode 100644
index 0000000000..1c63563399
--- /dev/null
+++ b/bartworks/dependencies.gradle
@@ -0,0 +1,19 @@
+// Add your dependencies here
+
+dependencies {
+ runtimeOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.6.0-GTNH:dev')
+ runtimeOnlyNonPublishable('com.github.GTNewHorizons:waila:1.8.0:dev')
+
+ compileOnlyApi('com.github.GTNewHorizons:Angelica:1.0.0-alpha50:api') { transitive = false }
+
+ api('com.github.GTNewHorizons:GT5-Unofficial:5.09.46.23:dev')
+ api("com.github.GTNewHorizons:TecTech:5.4.2:dev")
+ api("com.github.GTNewHorizons:GalacticGregGT5:1.1.0:dev") {
+ exclude group:"com.github.GTNewHorizons", module:"bartworks"
+ }
+ api("com.github.GTNewHorizons:Avaritia:1.49:dev")
+ implementation("com.github.GTNewHorizons:TinkersConstruct:1.12.1-GTNH:dev")
+
+ compileOnly("TGregworks:TGregworks:1.7.10-GTNH-1.0.26:deobf") {transitive = false}
+ compileOnly("com.github.GTNewHorizons:OpenComputers:1.10.11-GTNH:api") {transitive = false}
+}
diff --git a/bartworks/gradle.properties b/bartworks/gradle.properties
new file mode 100644
index 0000000000..0c29462f28
--- /dev/null
+++ b/bartworks/gradle.properties
@@ -0,0 +1,192 @@
+# ExampleMod tag to use as Blowdryer (Spotless, etc.) settings version, leave empty to disable.
+# LOCAL to test local config updates.
+gtnh.settings.blowdryerTag = 0.2.2
+
+# Human-readable mod name, available for mcmod.info population.
+modName = BartWorks
+
+# Case-sensitive identifier string, available for mcmod.info population and used for automatic mixin JSON generation.
+# Conventionally lowercase.
+modId = bartworks
+
+# Root package of the mod, used to find various classes in other properties,
+# mcmod.info substitution, enabling assertions in run tasks, etc.
+modGroup = com.github.bartimaeusnek.bartworks
+
+# Whether to use modGroup as the maven publishing group.
+# Due to a history of using JitPack, the default is com.github.GTNewHorizons for all mods.
+useModGroupForPublishing = false
+
+# Updates your build.gradle and settings.gradle automatically whenever an update is available.
+autoUpdateBuildScript = false
+
+# Version of Minecraft to target
+minecraftVersion = 1.7.10
+
+# Version of Minecraft Forge to target
+forgeVersion = 10.13.4.1614
+
+# Specify an MCP channel for dependency deobfuscation and the deobfParams task.
+channel = stable
+
+# Specify an MCP mappings version for dependency deobfuscation and the deobfParams task.
+mappingsVersion = 12
+
+# Defines other MCP mappings for dependency deobfuscation.
+remoteMappings = https\://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/
+
+# Select a default username for testing your mod. You can always override this per-run by running
+# `./gradlew runClient --username=AnotherPlayer`, or configuring this command in your IDE.
+developmentEnvironmentUserName = Developer
+
+# Enables using modern Java syntax (up to version 17) via Jabel, while still targeting JVM 8.
+# See https://github.com/bsideup/jabel for details on how this works.
+enableModernJavaSyntax = true
+
+# Enables injecting missing generics into the decompiled source code for a better coding experience.
+# Turns most publicly visible List, Map, etc. into proper List<E>, Map<K, V> types.
+enableGenericInjection = true
+
+# Generate a class with a String field for the mod version named as defined below.
+# If generateGradleTokenClass is empty or not missing, no such class will be generated.
+# If gradleTokenVersion is empty or missing, the field will not be present in the class.
+generateGradleTokenClass = com.github.bartimaeusnek.bartworks.API.API_REFERENCE
+
+# Name of the token containing the project's current version to generate/replace.
+gradleTokenVersion = VERSION
+
+# [DEPRECATED] Mod ID replacement token.
+gradleTokenModId =
+
+# [DEPRECATED] Mod name replacement token.
+gradleTokenModName =
+
+# [DEPRECATED] Mod Group replacement token.
+gradleTokenGroupName =
+
+# [DEPRECATED]
+# Multiple source files can be defined here by providing a comma-separated list: Class1.java,Class2.java,Class3.java
+# public static final String VERSION = "GRADLETOKEN_VERSION";
+# The string's content will be replaced with your mod's version when compiled. You should use this to specify your mod's
+# version in @Mod([...], version = VERSION, [...]).
+# Leave these properties empty to skip individual token replacements.
+replaceGradleTokenInFile =
+
+# In case your mod provides an API for other mods to implement you may declare its package here. Otherwise, you can
+# leave this property empty.
+# Example value: (apiPackage = api) + (modGroup = com.myname.mymodid) -> com.myname.mymodid.api
+apiPackage =
+
+# Specify the configuration file for Forge's access transformers here. It must be placed into /src/main/resources/META-INF/
+# There can be multiple files in a space-separated list.
+# Example value: mymodid_at.cfg nei_at.cfg
+accessTransformersFile =
+
+# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
+usesMixins = false
+
+# Adds some debug arguments like verbose output and class export.
+usesMixinDebug = false
+
+# Specify the location of your implementation of IMixinConfigPlugin. Leave it empty otherwise.
+mixinPlugin =
+
+# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail!
+mixinsPackage =
+
+# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin!
+# This parameter is for legacy compatibility only
+# Example value: (coreModClass = asm.FMLPlugin) + (modGroup = com.myname.mymodid) -> com.myname.mymodid.asm.FMLPlugin
+coreModClass = ASM.BWCorePlugin
+
+# If your project is only a consolidation of mixins or a core mod and does NOT contain a 'normal' mod ( = some class
+# that is annotated with @Mod) you want this to be true. When in doubt: leave it on false!
+containsMixinsAndOrCoreModOnly = false
+
+# Enables Mixins even if this mod doesn't use them, useful if one of the dependencies uses mixins.
+forceEnableMixins = true
+
+# If enabled, you may use 'shadowCompile' for dependencies. They will be integrated into your jar. It is your
+# responsibility to check the license and request permission for distribution if required.
+usesShadowedDependencies = false
+
+# If disabled, won't remove unused classes from shadowed dependencies. Some libraries use reflection to access
+# their own classes, making the minimization unreliable.
+minimizeShadowedDependencies = true
+
+# If disabled, won't rename the shadowed classes.
+relocateShadowedDependencies = true
+
+# Adds the GTNH maven, CurseMaven, Modrinth, and some more well-known 1.7.10 repositories.
+includeWellKnownRepositories = true
+
+# Change these to your Maven coordinates if you want to publish to a custom Maven repository instead of the default GTNH Maven.
+# Authenticate with the MAVEN_USER and MAVEN_PASSWORD environment variables.
+# If you need a more complex setup disable maven publishing here and add a publishing repository to addon.gradle.
+usesMavenPublishing = true
+
+# Maven repository to publish the mod to.
+# mavenPublishUrl = https\://nexus.gtnewhorizons.com/repository/releases/
+
+# Publishing to Modrinth requires you to set the MODRINTH_TOKEN environment variable to your current Modrinth API token.
+#
+# The project's ID on Modrinth. Can be either the slug or the ID.
+# Leave this empty if you don't want to publish to Modrinth.
+modrinthProjectId =
+
+# The project's relations on Modrinth. You can use this to refer to other projects on Modrinth.
+# Syntax: scope1-type1:name1;scope2-type2:name2;...
+# Where scope can be one of [required, optional, incompatible, embedded],
+# type can be one of [project, version],
+# and the name is the Modrinth project or version slug/id of the other mod.
+# Example: required-project:fplib;optional-project:gasstation;incompatible-project:gregtech
+# Note: GTNH Mixins is automatically set as a required dependency if usesMixins = true
+modrinthRelations =
+
+# Publishing to CurseForge requires you to set the CURSEFORGE_TOKEN environment variable to one of your CurseForge API tokens.
+#
+# The project's numeric ID on CurseForge. You can find this in the About Project box.
+# Leave this empty if you don't want to publish on CurseForge.
+curseForgeProjectId =
+
+# The project's relations on CurseForge. You can use this to refer to other projects on CurseForge.
+# Syntax: type1:name1;type2:name2;...
+# Where type can be one of [requiredDependency, embeddedLibrary, optionalDependency, tool, incompatible],
+# and the name is the CurseForge project slug of the other mod.
+# Example: requiredDependency:railcraft;embeddedLibrary:cofhlib;incompatible:buildcraft
+# Note: UniMixins is automatically set as a required dependency if usesMixins = true.
+curseForgeRelations =
+
+# Optional parameter to customize the produced artifacts. Use this to preserve artifact naming when migrating older
+# projects. New projects should not use this parameter.
+# customArchiveBaseName =
+
+# Optional parameter to have the build automatically fail if an illegal version is used.
+# This can be useful if you e.g. only want to allow versions in the form of '1.1.xxx'.
+# The check is ONLY performed if the version is a git tag.
+# Note: the specified string must be escaped, so e.g. 1\\.1\\.\\d+ instead of 1\.1\.\d+
+# versionPattern =
+
+# Uncomment to prevent the source code from being published.
+# noPublishedSources = true
+
+# Uncomment this to disable Spotless checks.
+# This should only be uncommented to keep it easier to sync with upstream/other forks.
+# That is, if there is no other active fork/upstream, NEVER change this.
+# disableSpotless = true
+
+# Uncomment this to disable Checkstyle checks (currently wildcard import check).
+# disableCheckstyle = true
+
+# Override the IDEA build type. Valid values are: "" (leave blank, do not override), "idea" (force use native IDEA build), "gradle"
+# (force use delegated build).
+# This is meant to be set in $HOME/.gradle/gradle.properties.
+# e.g. add "systemProp.org.gradle.project.ideaOverrideBuildType=idea" will override the build type to be native build.
+# WARNING: If you do use this option, it will overwrite whatever you have in your existing projects. This might not be what you want!
+# Usually there is no need to uncomment this here as other developers do not necessarily use the same build type as you.
+# ideaOverrideBuildType = idea
+
+# Whether IDEA should run spotless checks when pressing the Build button.
+# This is meant to be set in $HOME/.gradle/gradle.properties.
+# ideaCheckSpotlessOnBuild = true
+
diff --git a/bartworks/gradle/wrapper/gradle-wrapper.jar b/bartworks/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..e6441136f3
--- /dev/null
+++ b/bartworks/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/bartworks/gradle/wrapper/gradle-wrapper.properties b/bartworks/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..b82aa23a4f
--- /dev/null
+++ b/bartworks/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/bartworks/gradlew b/bartworks/gradlew
new file mode 100755
index 0000000000..1aa94a4269
--- /dev/null
+++ b/bartworks/gradlew
@@ -0,0 +1,249 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/bartworks/gradlew.bat b/bartworks/gradlew.bat
new file mode 100644
index 0000000000..25da30dbde
--- /dev/null
+++ b/bartworks/gradlew.bat
@@ -0,0 +1,92 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/bartworks/jitpack.yml b/bartworks/jitpack.yml
new file mode 100644
index 0000000000..09bbb514fc
--- /dev/null
+++ b/bartworks/jitpack.yml
@@ -0,0 +1,2 @@
+before_install:
+ - ./gradlew setupCIWorkspace \ No newline at end of file
diff --git a/bartworks/repositories.gradle b/bartworks/repositories.gradle
new file mode 100644
index 0000000000..40118b1677
--- /dev/null
+++ b/bartworks/repositories.gradle
@@ -0,0 +1,16 @@
+// Add any additional repositories for your dependencies here
+
+repositories {
+ ivy {
+ url 'https://files.vexatos.com/'
+ patternLayout {
+ artifact "[module]/[artifact]-[revision](-[classifier])(.[ext])"
+ }
+ content {
+ includeGroup("TGregworks")
+ }
+ metadataSources {
+ artifact()
+ }
+ }
+}
diff --git a/bartworks/settings.gradle b/bartworks/settings.gradle
new file mode 100644
index 0000000000..94c2daf35c
--- /dev/null
+++ b/bartworks/settings.gradle
@@ -0,0 +1,23 @@
+
+pluginManagement {
+ repositories {
+ maven {
+ // RetroFuturaGradle
+ name "GTNH Maven"
+ url "https://nexus.gtnewhorizons.com/repository/public/"
+ mavenContent {
+ includeGroup("com.gtnewhorizons")
+ includeGroupByRegex("com\\.gtnewhorizons\\..+")
+ }
+ }
+ gradlePluginPortal()
+ mavenCentral()
+ mavenLocal()
+ }
+}
+
+plugins {
+ id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.22'
+}
+
+
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/API_ConfigValues.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/API_ConfigValues.java
index 68a88b39ce..68a88b39ce 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/API_ConfigValues.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/API_ConfigValues.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectAdder.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectAdder.java
index 2eee530a70..2eee530a70 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectAdder.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectAdder.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectGetter.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectGetter.java
index ba1308c427..ba1308c427 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectGetter.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BioObjectGetter.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioRecipeAdder.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BioRecipeAdder.java
index 6ab854c308..6ab854c308 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioRecipeAdder.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BioRecipeAdder.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioVatLogicAdder.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BioVatLogicAdder.java
index b53638a77a..b53638a77a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/BioVatLogicAdder.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BioVatLogicAdder.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/BorosilicateGlass.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BorosilicateGlass.java
index eb4c2a0405..eb4c2a0405 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/BorosilicateGlass.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/BorosilicateGlass.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/INoiseGen.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/INoiseGen.java
index 4a85029994..4a85029994 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/INoiseGen.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/INoiseGen.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/IRadMaterial.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/IRadMaterial.java
index 9d2e2d7829..9d2e2d7829 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/IRadMaterial.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/IRadMaterial.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileAddsInformation.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileAddsInformation.java
index d74263115b..d74263115b 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileAddsInformation.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileAddsInformation.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileDropsContent.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileDropsContent.java
index 1f75115752..1f75115752 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileDropsContent.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileDropsContent.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileHasDifferentTextureSides.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileHasDifferentTextureSides.java
index 698c28fbf7..698c28fbf7 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileHasDifferentTextureSides.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/ITileHasDifferentTextureSides.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/SideReference.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/SideReference.java
index 88ae5bf5c0..88ae5bf5c0 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/SideReference.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/SideReference.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/VoidMinerDropAdder.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/VoidMinerDropAdder.java
index b83ce7d128..b83ce7d128 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/VoidMinerDropAdder.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/VoidMinerDropAdder.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAPI.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAPI.java
index 01c172382f..01c172382f 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAPI.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAPI.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAdderRegistry.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAdderRegistry.java
index 2cd29281f4..2cd29281f4 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAdderRegistry.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/WerkstoffAdderRegistry.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/modularUI/BW_UITextures.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/modularUI/BW_UITextures.java
index 620e9d65af..620e9d65af 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/modularUI/BW_UITextures.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/modularUI/BW_UITextures.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/package-info.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/package-info.java
index 4bef7a0cad..4bef7a0cad 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/package-info.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/package-info.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BWNBTDependantCraftingRecipe.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BWNBTDependantCraftingRecipe.java
index dfcf94115a..dfcf94115a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BWNBTDependantCraftingRecipe.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BWNBTDependantCraftingRecipe.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BacterialVatFrontend.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BacterialVatFrontend.java
index 01cf2ecd32..01cf2ecd32 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BacterialVatFrontend.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BacterialVatFrontend.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BartWorksRecipeMaps.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BartWorksRecipeMaps.java
index 281184893c..281184893c 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BartWorksRecipeMaps.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/BartWorksRecipeMaps.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/DynamicGTRecipe.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/DynamicGTRecipe.java
index d409d3ab26..d409d3ab26 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/DynamicGTRecipe.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/DynamicGTRecipe.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/RadioHatchFrontend.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/RadioHatchFrontend.java
index a6cf4b180e..a6cf4b180e 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/RadioHatchFrontend.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/API/recipe/RadioHatchFrontend.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/ASMUtils.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/ASMUtils.java
index 725a0135a4..725a0135a4 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/ASMUtils.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/ASMUtils.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCore.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCore.java
index 54598f9478..54598f9478 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCore.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCore.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCorePlugin.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCorePlugin.java
index f7fde1167d..f7fde1167d 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCorePlugin.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCorePlugin.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreStaticReplacementMethodes.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreStaticReplacementMethodes.java
index 38a5a70d27..38a5a70d27 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreStaticReplacementMethodes.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreStaticReplacementMethodes.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreTransformer.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreTransformer.java
index 02835e39c2..02835e39c2 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreTransformer.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/ASM/BWCoreTransformer.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/GuiHandler.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/GuiHandler.java
index c104d09f3a..c104d09f3a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/GuiHandler.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/GuiHandler.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java
index 818b67d6fc..818b67d6fc 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipCache.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipCache.java
index 969398df47..969398df47 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipCache.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipCache.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipEventHandler.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipEventHandler.java
index 9f7fb64e4b..9f7fb64e4b 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipEventHandler.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/ClientEventHandler/TooltipEventHandler.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/BioTab.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/BioTab.java
index 8d3d457e06..8d3d457e06 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/BioTab.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/BioTab.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/GT2Tab.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/GT2Tab.java
index 5a42164597..5a42164597 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/GT2Tab.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/GT2Tab.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/bartworksTab.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/bartworksTab.java
index 53be7436ce..53be7436ce 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/bartworksTab.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/creativetabs/bartworksTab.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/gui/BW_GUIContainer_RotorBlock.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/gui/BW_GUIContainer_RotorBlock.java
index e2bb68b290..e2bb68b290 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/gui/BW_GUIContainer_RotorBlock.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/gui/BW_GUIContainer_RotorBlock.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_EICPistonVisualizer.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_EICPistonVisualizer.java
index 6bf5fd3fe1..6bf5fd3fe1 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_EICPistonVisualizer.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_EICPistonVisualizer.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_ItemRenderer.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_ItemRenderer.java
index 4c27a2a3f9..4c27a2a3f9 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_ItemRenderer.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_ItemRenderer.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_Vanilla_Texture.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_Vanilla_Texture.java
index a082a44d31..a082a44d31 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_Vanilla_Texture.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_GT_Vanilla_Texture.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_Renderer_Block_Ores.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_Renderer_Block_Ores.java
index 7bb04e0c39..7bb04e0c39 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_Renderer_Block_Ores.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/BW_Renderer_Block_Ores.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererGlasBlock.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererGlasBlock.java
index ce87e4a68a..ce87e4a68a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererGlasBlock.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererGlasBlock.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererSwitchingColorFluid.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererSwitchingColorFluid.java
index 7a12074e02..7a12074e02 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererSwitchingColorFluid.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/renderer/RendererSwitchingColorFluid.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/client/textures/PrefixTextureLinker.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/textures/PrefixTextureLinker.java
index 09df8f98f8..09df8f98f8 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/client/textures/PrefixTextureLinker.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/client/textures/PrefixTextureLinker.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_Blocks.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_Blocks.java
index 1a00d16d85..1a00d16d85 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_Blocks.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_Blocks.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks.java
index c60f63129a..c60f63129a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks2.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks2.java
index 4ef12dc30b..4ef12dc30b 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks2.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_GlasBlocks2.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer.java
index fb8e163ad1..fb8e163ad1 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_MachineBlock.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_MachineBlock.java
index 0d1d9fd20b..0d1d9fd20b 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_MachineBlock.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_MachineBlock.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_Multiple.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_Multiple.java
index 852d8370ad..852d8370ad 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_Multiple.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BW_TileEntityContainer_Multiple.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BioFluidBlock.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BioFluidBlock.java
index a5ad7625f9..a5ad7625f9 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BioFluidBlock.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/blocks/BioFluidBlock.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ChangeConfig.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ChangeConfig.java
index 0434a5d974..0434a5d974 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ChangeConfig.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ChangeConfig.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ClearCraftingCache.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ClearCraftingCache.java
index 7afe07beb0..7afe07beb0 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ClearCraftingCache.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/ClearCraftingCache.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/GetWorkingDirectory.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/GetWorkingDirectory.java
index 341044c498..341044c498 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/GetWorkingDirectory.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/GetWorkingDirectory.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/PrintRecipeListToFile.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/PrintRecipeListToFile.java
index dcd7caee97..dcd7caee97 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/PrintRecipeListToFile.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/PrintRecipeListToFile.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/RunGC.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/RunGC.java
index 5b76d6a163..5b76d6a163 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/RunGC.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/RunGC.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/SummonRuin.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/SummonRuin.java
index 5b37a98e7e..5b37a98e7e 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/SummonRuin.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/commands/SummonRuin.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/configs/ConfigHandler.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/configs/ConfigHandler.java
index 7c5a515b86..7c5a515b86 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/configs/ConfigHandler.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/configs/ConfigHandler.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_ItemBlocks.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_ItemBlocks.java
index f512e778bc..f512e778bc 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_ItemBlocks.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_ItemBlocks.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_SimpleWindMeter.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_SimpleWindMeter.java
index 0b589bf53a..0b589bf53a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_SimpleWindMeter.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_SimpleWindMeter.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_Stonage_Rotors.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_Stonage_Rotors.java
index f58ae8d6e7..f58ae8d6e7 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_Stonage_Rotors.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/BW_Stonage_Rotors.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/Circuit_Programmer.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/Circuit_Programmer.java
index f0c746dd64..f0c746dd64 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/Circuit_Programmer.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/Circuit_Programmer.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Destructopack_Item.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Destructopack_Item.java
index 37ecfc61d2..37ecfc61d2 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Destructopack_Item.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Destructopack_Item.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Rockcutter_Item.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Rockcutter_Item.java
index 3a132dde22..3a132dde22 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Rockcutter_Item.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Rockcutter_Item.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Teslastaff_Item.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Teslastaff_Item.java
index 6728a791e4..6728a791e4 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Teslastaff_Item.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/GT_Teslastaff_Item.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabModule.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabModule.java
index a4712dc36a..a4712dc36a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabModule.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabModule.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabParts.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabParts.java
index cb5a65c13b..cb5a65c13b 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabParts.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/LabParts.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleIconItem.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleIconItem.java
index e31e23d47c..e31e23d47c 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleIconItem.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleIconItem.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleSubItemClass.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleSubItemClass.java
index 8d5b239a75..8d5b239a75 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleSubItemClass.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/items/SimpleSubItemClass.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ArtificialMicaLine.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ArtificialMicaLine.java
index 6268342cce..6268342cce 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ArtificialMicaLine.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ArtificialMicaLine.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BeforeGTPreload.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BeforeGTPreload.java
index 88fab90aea..88fab90aea 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BeforeGTPreload.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BeforeGTPreload.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioCultureLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioCultureLoader.java
index 5bf9ff8185..5bf9ff8185 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioCultureLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioCultureLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioItemList.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioItemList.java
index 8b86d4cd93..8b86d4cd93 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioItemList.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioItemList.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioLabLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioLabLoader.java
index 28ad279e28..28ad279e28 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioLabLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioLabLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioRecipeLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioRecipeLoader.java
index abed08eb5e..abed08eb5e 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioRecipeLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/BioRecipeLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ElectricImplosionCompressorRecipes.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ElectricImplosionCompressorRecipes.java
index 1a7e49aaa3..1a7e49aaa3 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ElectricImplosionCompressorRecipes.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ElectricImplosionCompressorRecipes.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/FluidLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/FluidLoader.java
index 809e52e6d1..809e52e6d1 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/FluidLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/FluidLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/GTNHBlocks.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/GTNHBlocks.java
index 329d73023f..329d73023f 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/GTNHBlocks.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/GTNHBlocks.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ItemRegistry.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ItemRegistry.java
index 499686e6e0..499686e6e0 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ItemRegistry.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/ItemRegistry.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/LocalisationLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/LocalisationLoader.java
index 020f89e703..020f89e703 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/LocalisationLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/LocalisationLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RadioHatchMaterialLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RadioHatchMaterialLoader.java
index d141fe8b65..d141fe8b65 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RadioHatchMaterialLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RadioHatchMaterialLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RecipeLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RecipeLoader.java
index c55561687b..c55561687b 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RecipeLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RecipeLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RegisterServerCommands.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RegisterServerCommands.java
index 615eed0c43..615eed0c43 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RegisterServerCommands.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/RegisterServerCommands.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/StaticRecipeChangeLoaders.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/StaticRecipeChangeLoaders.java
index 6f50650484..6f50650484 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/StaticRecipeChangeLoaders.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/StaticRecipeChangeLoaders.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Assembler.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Assembler.java
index 8f152c00c7..8f152c00c7 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Assembler.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Assembler.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/AssemblyLine.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/AssemblyLine.java
index 538195362a..538195362a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/AssemblyLine.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/AssemblyLine.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Autoclave.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Autoclave.java
index 1793877df3..1793877df3 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Autoclave.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Autoclave.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Centrifuge.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Centrifuge.java
index e148376b01..e148376b01 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Centrifuge.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Centrifuge.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalBath.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalBath.java
index f1d9ddd236..f1d9ddd236 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalBath.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalBath.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalReactor.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalReactor.java
index 87aaf91f71..87aaf91f71 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalReactor.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/ChemicalReactor.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/CraftingRecipes.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/CraftingRecipes.java
index 17a5d5b025..17a5d5b025 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/CraftingRecipes.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/CraftingRecipes.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Electrolyzer.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Electrolyzer.java
index 9502d4eff3..9502d4eff3 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Electrolyzer.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Electrolyzer.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Extractor.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Extractor.java
index 9b304de837..9b304de837 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Extractor.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Extractor.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FakeRecipes.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FakeRecipes.java
index 1df03d10f2..1df03d10f2 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FakeRecipes.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FakeRecipes.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidHeater.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidHeater.java
index 3d27c55038..3d27c55038 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidHeater.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidHeater.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidSolidifier.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidSolidifier.java
index 4991370f44..4991370f44 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidSolidifier.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FluidSolidifier.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FormingPress.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FormingPress.java
index bdeb24af9e..bdeb24af9e 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FormingPress.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/FormingPress.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/LaserEngraver.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/LaserEngraver.java
index 59c84d0f7c..59c84d0f7c 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/LaserEngraver.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/LaserEngraver.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Mixer.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Mixer.java
index d69b4278ef..d69b4278ef 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Mixer.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Mixer.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Pulverizer.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Pulverizer.java
index 4dbcc45708..4dbcc45708 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Pulverizer.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/Pulverizer.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/PyrolyseOven.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/PyrolyseOven.java
index c810c323d9..c810c323d9 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/PyrolyseOven.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/loaders/recipes/PyrolyseOven.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/BW_Network.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/BW_Network.java
index b5e002ef29..b5e002ef29 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/BW_Network.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/BW_Network.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/CircuitProgrammerPacket.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/CircuitProgrammerPacket.java
index c47b834157..c47b834157 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/CircuitProgrammerPacket.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/CircuitProgrammerPacket.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/EICPacket.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/EICPacket.java
index 621cc3fe4f..621cc3fe4f 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/EICPacket.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/EICPacket.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/MetaBlockPacket.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/MetaBlockPacket.java
index 6b555014ed..6b555014ed 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/MetaBlockPacket.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/MetaBlockPacket.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/OreDictCachePacket.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/OreDictCachePacket.java
index c488273d73..c488273d73 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/OreDictCachePacket.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/OreDictCachePacket.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/RendererPacket.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/RendererPacket.java
index 436413fa14..436413fa14 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/RendererPacket.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/RendererPacket.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/ServerJoinedPackage.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/ServerJoinedPackage.java
index 091802683d..091802683d 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/net/ServerJoinedPackage.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/net/ServerJoinedPackage.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BWTileEntityDimIDBridge.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BWTileEntityDimIDBridge.java
index bb0c0cf319..bb0c0cf319 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BWTileEntityDimIDBridge.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BWTileEntityDimIDBridge.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_RotorBlock.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_RotorBlock.java
index 5db8989d0c..5db8989d0c 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_RotorBlock.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_RotorBlock.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_ExperimentalFloodGate.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_ExperimentalFloodGate.java
index 79bedfa1b8..79bedfa1b8 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_ExperimentalFloodGate.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_ExperimentalFloodGate.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_HeatedWaterPump.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_HeatedWaterPump.java
index faccfc4738..faccfc4738 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_HeatedWaterPump.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_HeatedWaterPump.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_InfinityTank.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_InfinityTank.java
index 0dc888c663..0dc888c663 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_InfinityTank.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/classic/BW_TileEntity_InfinityTank.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/debug/CreativeScanner.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/debug/CreativeScanner.java
index 2dcc69377e..2dcc69377e 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/debug/CreativeScanner.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/debug/CreativeScanner.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_BioVat.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_BioVat.java
index a7d8ea9db8..a7d8ea9db8 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_BioVat.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_BioVat.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_CircuitAssemblyLine.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_CircuitAssemblyLine.java
index 1f85ea0167..1f85ea0167 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_CircuitAssemblyLine.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_CircuitAssemblyLine.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_DEHP.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_DEHP.java
index f394089fb0..f394089fb0 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_DEHP.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_DEHP.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ElectricImplosionCompressor.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ElectricImplosionCompressor.java
index cb2140d62b..cb2140d62b 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ElectricImplosionCompressor.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ElectricImplosionCompressor.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_HTGR.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_HTGR.java
index a5ed5a69b7..a5ed5a69b7 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_HTGR.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_HTGR.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_LESU.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_LESU.java
index 5a2c3ba382..5a2c3ba382 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_LESU.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_LESU.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ManualTrafo.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ManualTrafo.java
index b481429411..b481429411 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ManualTrafo.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_ManualTrafo.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_THTR.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_THTR.java
index e7a2b090c9..e7a2b090c9 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_THTR.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_THTR.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_Windmill.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_Windmill.java
index a1e1f1fd46..a1e1f1fd46 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_Windmill.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/GT_TileEntity_Windmill.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java
index c8ea85d182..c8ea85d182 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaBlastFurnace.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaChemicalReactor.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaChemicalReactor.java
index 4b11f8d500..4b11f8d500 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaChemicalReactor.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaChemicalReactor.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java
index 80bc644e9e..80bc644e9e 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaDistillTower.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaMultiBlockBase.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaMultiBlockBase.java
index 223ef65f77..223ef65f77 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaMultiBlockBase.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaMultiBlockBase.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaOilCracker.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaOilCracker.java
index 40ec9f814b..40ec9f814b 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaOilCracker.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaOilCracker.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java
index 0a2464de5e..0a2464de5e 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/multis/mega/GT_TileEntity_MegaVacuumFreezer.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_AcidGenerator.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_AcidGenerator.java
index c50e6cbd12..c50e6cbd12 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_AcidGenerator.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_AcidGenerator.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_BioLab.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_BioLab.java
index d2ef329066..d2ef329066 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_BioLab.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_BioLab.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_CompressedFluidHatch.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_CompressedFluidHatch.java
index e0903ce93c..e0903ce93c 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_CompressedFluidHatch.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_CompressedFluidHatch.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Diode.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Diode.java
index 76a9c1646e..76a9c1646e 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Diode.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Diode.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_EnergyDistributor.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_EnergyDistributor.java
index 4431015ca8..4431015ca8 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_EnergyDistributor.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_EnergyDistributor.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_GiantOutputHatch.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_GiantOutputHatch.java
index 8d5a756cb5..8d5a756cb5 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_GiantOutputHatch.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_GiantOutputHatch.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_HumongousInputHatch.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_HumongousInputHatch.java
index e9db8ac2d5..e9db8ac2d5 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_HumongousInputHatch.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_HumongousInputHatch.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_RadioHatch.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_RadioHatch.java
index 6a66b5209f..6a66b5209f 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_RadioHatch.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_RadioHatch.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Transistor.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Transistor.java
index 46f20e441d..46f20e441d 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Transistor.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/common/tileentities/tiered/GT_MetaTileEntity_Transistor.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioLabHandler.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioLabHandler.java
index 40233912e6..40233912e6 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioLabHandler.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioLabHandler.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioVatHandler.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioVatHandler.java
index cddb16c6c8..cddb16c6c8 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioVatHandler.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_BioVatHandler.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_OreHandler.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_OreHandler.java
index 2b34250512..2b34250512 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_OreHandler.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/BW_NEI_OreHandler.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/NEI_BW_Config.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/NEI_BW_Config.java
index a6efebeb83..a6efebeb83 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/NEI_BW_Config.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/neiHandler/NEI_BW_Config.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/server/EventHandler/ServerEventHandler.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/server/EventHandler/ServerEventHandler.java
index 3ea2f28cb9..3ea2f28cb9 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/server/EventHandler/ServerEventHandler.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/server/EventHandler/ServerEventHandler.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_GT_MaterialReference.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_GT_MaterialReference.java
index 87ee19833d..87ee19833d 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_GT_MaterialReference.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_GT_MaterialReference.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlock_Item.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlock_Item.java
index 41f28d033a..41f28d033a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlock_Item.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlock_Item.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing.java
index 6fb1650c1f..6fb1650c1f 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_CasingAdvanced_TE.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_CasingAdvanced_TE.java
index 02dd3c8f58..02dd3c8f58 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_CasingAdvanced_TE.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_CasingAdvanced_TE.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing_TE.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing_TE.java
index af61e1a68a..af61e1a68a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing_TE.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedBlocks_Casing_TE.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedFrames.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedFrames.java
index ee5a0a1511..ee5a0a1511 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedFrames.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedFrames.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedOreTE.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedOreTE.java
index 9b393dff0f..9b393dff0f 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedOreTE.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedOreTE.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedSmallOreTE.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedSmallOreTE.java
index 110b17321f..110b17321f 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedSmallOreTE.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGeneratedSmallOreTE.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Block_TE.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Block_TE.java
index 77d3c23fbc..77d3c23fbc 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Block_TE.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Block_TE.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Blocks.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Blocks.java
index 84a498070a..84a498070a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Blocks.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Blocks.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Items.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Items.java
index 4c355284ae..4c355284ae 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Items.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Items.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Ores.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Ores.java
index 2adb0d3d35..2adb0d3d35 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Ores.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_Ores.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_SmallOres.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_SmallOres.java
index 0778645cb5..0778645cb5 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_SmallOres.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_SmallOres.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlock_TE.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlock_TE.java
index 4456a66535..4456a66535 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlock_TE.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlock_TE.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlocks.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlocks.java
index 648f9a0027..648f9a0027 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlocks.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_MetaGenerated_WerkstoffBlocks.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_NonMeta_MaterialItems.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_NonMeta_MaterialItems.java
index db53437858..db53437858 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_NonMeta_MaterialItems.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/BW_NonMeta_MaterialItems.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_CircuitsLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_CircuitsLoader.java
index 6bd186a050..6bd186a050 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_CircuitsLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_CircuitsLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_Meta_Items.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_Meta_Items.java
index 99eb6e7d7e..99eb6e7d7e 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_Meta_Items.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/BW_Meta_Items.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitData.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitData.java
index 874ae202f1..874ae202f1 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitData.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitData.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java
index 5d3886b9e9..5d3886b9e9 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitPartLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitPartLoader.java
index 6db9c63134..6db9c63134 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitPartLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitPartLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/BWGTMetaItems.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/BWGTMetaItems.java
index 91dc709609..91dc709609 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/BWGTMetaItems.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/BWGTMetaItems.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/GTMetaItemEnhancer.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/GTMetaItemEnhancer.java
index 5b475dc069..5b475dc069 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/GTMetaItemEnhancer.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/GTMetaItemEnhancer.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/PlatinumSludgeOverHaul.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/PlatinumSludgeOverHaul.java
index ba08d083c2..ba08d083c2 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/PlatinumSludgeOverHaul.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/GT_Enhancement/PlatinumSludgeOverHaul.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/Werkstoff.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/Werkstoff.java
index af8651dc6b..af8651dc6b 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/Werkstoff.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/Werkstoff.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/WerkstoffLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/WerkstoffLoader.java
index 197ada7f22..197ada7f22 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/WerkstoffLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/WerkstoffLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AddSomeRecipes.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AddSomeRecipes.java
index c31013eb78..c31013eb78 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AddSomeRecipes.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AddSomeRecipes.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AdditionalRecipes.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AdditionalRecipes.java
index 3638536ca6..3638536ca6 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AdditionalRecipes.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/AdditionalRecipes.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/DownTierLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/DownTierLoader.java
index f07faa79a8..f07faa79a8 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/DownTierLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/DownTierLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/LoadItemContainers.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/LoadItemContainers.java
index 67de5d5f5b..67de5d5f5b 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/LoadItemContainers.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/processingLoaders/LoadItemContainers.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/IWerkstoffRunnable.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/IWerkstoffRunnable.java
index d409084406..d409084406 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/IWerkstoffRunnable.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/IWerkstoffRunnable.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/AspectLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/AspectLoader.java
index a61bc55d59..a61bc55d59 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/AspectLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/AspectLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/BlockLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/BlockLoader.java
index 1262ab2499..1262ab2499 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/BlockLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/BlockLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CasingLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CasingLoader.java
index 9ec4030943..9ec4030943 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CasingLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CasingLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CellLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CellLoader.java
index 2b86f46149..2b86f46149 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CellLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CellLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CraftingMaterialLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CraftingMaterialLoader.java
index 91fe34e89f..91fe34e89f 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CraftingMaterialLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CraftingMaterialLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CrushedLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CrushedLoader.java
index b33d0ddd20..b33d0ddd20 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CrushedLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/CrushedLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/DustLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/DustLoader.java
index 088c4bb55b..088c4bb55b 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/DustLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/DustLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/GemLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/GemLoader.java
index 187456a3b4..187456a3b4 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/GemLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/GemLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MetalLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MetalLoader.java
index d969ff056f..d969ff056f 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MetalLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MetalLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MoltenCellLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MoltenCellLoader.java
index 86cc6aa732..86cc6aa732 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MoltenCellLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MoltenCellLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MultipleMetalLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MultipleMetalLoader.java
index 5975b7b898..5975b7b898 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MultipleMetalLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/MultipleMetalLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/OreLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/OreLoader.java
index 8c9d3837c9..8c9d3837c9 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/OreLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/OreLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/RawOreLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/RawOreLoader.java
index 2fbb086022..2fbb086022 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/RawOreLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/RawOreLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/SimpleMetalLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/SimpleMetalLoader.java
index 88bfac24ee..88bfac24ee 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/SimpleMetalLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/SimpleMetalLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/ToolLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/ToolLoader.java
index 499477a846..499477a846 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/ToolLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/recipe/ToolLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/AssociationLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/AssociationLoader.java
index c6eacb8ad2..c6eacb8ad2 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/AssociationLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/AssociationLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/BridgeMaterialsLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/BridgeMaterialsLoader.java
index 5dafebb48e..5dafebb48e 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/BridgeMaterialsLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/BridgeMaterialsLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/CasingRegistrator.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/CasingRegistrator.java
index b2287b48b5..b2287b48b5 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/CasingRegistrator.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/material/werkstoff_loaders/registration/CasingRegistrator.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictAdder.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictAdder.java
index 85f56cb7a9..85f56cb7a9 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictAdder.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictAdder.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictHandler.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictHandler.java
index 683b55b333..683b55b333 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictHandler.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oredict/OreDictHandler.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_OreLayer.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_OreLayer.java
index 3305741f27..3305741f27 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_OreLayer.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_OreLayer.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WordGenerator.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WordGenerator.java
index 40c2302fb0..40c2302fb0 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WordGenerator.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WordGenerator.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128b.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128b.java
index 6e0f0543e4..6e0f0543e4 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128b.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128b.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128ba.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128ba.java
index 7454b0dd93..7454b0dd93 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128ba.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/oregen/BW_WorldGenRoss128ba.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/GT_WorldgenUtil.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/GT_WorldgenUtil.java
index 7d599b441a..7d599b441a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/GT_WorldgenUtil.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/GT_WorldgenUtil.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/MapGenRuins.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/MapGenRuins.java
index ef6b88cc5a..ef6b88cc5a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/MapGenRuins.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/system/worldgen/MapGenRuins.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BWRecipes.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BWRecipes.java
index aec0972a67..aec0972a67 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BWRecipes.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BWRecipes.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_ColorUtil.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_ColorUtil.java
index 2e384c8e0c..2e384c8e0c 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_ColorUtil.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_ColorUtil.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Tooltip_Reference.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Tooltip_Reference.java
index b68f3fb437..b68f3fb437 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Tooltip_Reference.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Tooltip_Reference.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Util.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Util.java
index 38982f35b3..38982f35b3 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Util.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BW_Util.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioCulture.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BioCulture.java
index c4ff2f721c..c4ff2f721c 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioCulture.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BioCulture.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioDNA.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BioDNA.java
index 22edd60170..22edd60170 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioDNA.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BioDNA.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioData.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BioData.java
index 7a4c87f7d2..7a4c87f7d2 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioData.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BioData.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioPlasmid.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BioPlasmid.java
index 0d40d9deca..0d40d9deca 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/BioPlasmid.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/BioPlasmid.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/CachedReflectionUtils.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/CachedReflectionUtils.java
index 063a310db8..063a310db8 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/CachedReflectionUtils.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/CachedReflectionUtils.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/ChatColorHelper.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/ChatColorHelper.java
index f1d6eeedb3..f1d6eeedb3 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/ChatColorHelper.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/ChatColorHelper.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksChecker.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksChecker.java
index 9feb344fa0..9feb344fa0 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksChecker.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksChecker.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksCheckerIteration.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksCheckerIteration.java
index cfd2c70d1d..cfd2c70d1d 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksCheckerIteration.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/ConnectedBlocksCheckerIteration.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/Coords.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/Coords.java
index f8c33dd8e9..f8c33dd8e9 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/Coords.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/Coords.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/EnumUtils.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/EnumUtils.java
index 678f8facba..678f8facba 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/EnumUtils.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/EnumUtils.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/MathUtils.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/MathUtils.java
index e8f4330ed3..e8f4330ed3 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/MathUtils.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/MathUtils.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/MurmurHash3.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/MurmurHash3.java
index 501b473d98..501b473d98 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/MurmurHash3.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/MurmurHash3.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/BartsNoise.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/BartsNoise.java
index 753940f655..753940f655 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/BartsNoise.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/BartsNoise.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/SimplexNoise.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/SimplexNoise.java
index ca318e17b9..ca318e17b9 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/SimplexNoise.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/NoiseUtil/SimplexNoise.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashMap.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashMap.java
index 33173d19f2..33173d19f2 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashMap.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashMap.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashSet.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashSet.java
index 5490c4bdaf..5490c4bdaf 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashSet.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/NonNullWrappedHashSet.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/Pair.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/Pair.java
index cd9bc1746e..cd9bc1746e 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/Pair.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/Pair.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java
index d0850b20c5..d0850b20c5 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/RecipeFinderForParallel.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/ResultWrongSievert.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/ResultWrongSievert.java
index b6216f3c42..b6216f3c42 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/ResultWrongSievert.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/ResultWrongSievert.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/StreamUtils.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/StreamUtils.java
index 4c1c82b9bf..4c1c82b9bf 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/StreamUtils.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/StreamUtils.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityList.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityList.java
index 241f20c1f9..241f20c1f9 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityList.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityList.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListIterators.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListIterators.java
index f24105db17..f24105db17 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListIterators.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListIterators.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListNode.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListNode.java
index 72b266917f..72b266917f 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListNode.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/accessprioritylist/AccessPriorityListNode.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/flowerset/FlowerSet.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/flowerset/FlowerSet.java
index d797e68d8a..d797e68d8a 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/flowerset/FlowerSet.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/flowerset/FlowerSet.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/log/DebugLog.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/log/DebugLog.java
index 6ead05ce96..6ead05ce96 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/log/DebugLog.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/log/DebugLog.java
diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/util/package-info.java b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/package-info.java
index 8d9d539524..8d9d539524 100644
--- a/src/main/java/com/github/bartimaeusnek/bartworks/util/package-info.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/bartworks/util/package-info.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/BartWorksCrossmod.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/BartWorksCrossmod.java
index b1264fb9af..b1264fb9af 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/BartWorksCrossmod.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/BartWorksCrossmod.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/GTpp/loader/RadioHatchCompat.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/GTpp/loader/RadioHatchCompat.java
index b8fcdb9135..b8fcdb9135 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/GTpp/loader/RadioHatchCompat.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/GTpp/loader/RadioHatchCompat.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/cls/CLSCompat.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/cls/CLSCompat.java
index adb3d42754..adb3d42754 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/cls/CLSCompat.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/cls/CLSCompat.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiner_Base.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiner_Base.java
index da9bd49397..da9bd49397 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiner_Base.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiner_Base.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiners.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiners.java
index 5f15bd6c09..5f15bd6c09 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiners.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/GT_TileEntity_VoidMiners.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/VoidMinerUtility.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/VoidMinerUtility.java
index 5254da24f1..5254da24f1 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/VoidMinerUtility.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticgreg/VoidMinerUtility.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/GalacticraftProxy.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/GalacticraftProxy.java
index 972254e2d9..972254e2d9 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/GalacticraftProxy.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/GalacticraftProxy.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/PlanetsHelperClass.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/PlanetsHelperClass.java
index c9cff6cd9e..c9cff6cd9e 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/PlanetsHelperClass.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/PlanetsHelperClass.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/UniversalTeleportType.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/UniversalTeleportType.java
index b6fa575b5c..b6fa575b5c 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/UniversalTeleportType.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/UniversalTeleportType.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/atmosphere/BWAtmosphereManager.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/atmosphere/BWAtmosphereManager.java
index fa6d2db382..fa6d2db382 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/atmosphere/BWAtmosphereManager.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/atmosphere/BWAtmosphereManager.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/blocks/UniversalSpaceBlocks.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/blocks/UniversalSpaceBlocks.java
index af9d9647af..af9d9647af 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/blocks/UniversalSpaceBlocks.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/blocks/UniversalSpaceBlocks.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/creativetabs/SpaceTab.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/creativetabs/SpaceTab.java
index 5d9b9c3cc1..5d9b9c3cc1 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/creativetabs/SpaceTab.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/creativetabs/SpaceTab.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/AbstractWorldProviderSpace.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/AbstractWorldProviderSpace.java
index 61c52865cf..61c52865cf 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/AbstractWorldProviderSpace.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/AbstractWorldProviderSpace.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/ChunkProviderRoss128b.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/ChunkProviderRoss128b.java
index b477154d39..b477154d39 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/ChunkProviderRoss128b.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/ChunkProviderRoss128b.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/SkyProviderRoss128b.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/SkyProviderRoss128b.java
index d5368b3f0d..d5368b3f0d 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/SkyProviderRoss128b.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/SkyProviderRoss128b.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/WorldProviderRoss128b.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/WorldProviderRoss128b.java
index 7a0c9a743c..7a0c9a743c 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/WorldProviderRoss128b.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128b/WorldProviderRoss128b.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/ChunkProviderRoss128ba.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/ChunkProviderRoss128ba.java
index 18a8eadd2c..18a8eadd2c 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/ChunkProviderRoss128ba.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/ChunkProviderRoss128ba.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/WorldProviderRoss128ba.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/WorldProviderRoss128ba.java
index 38c014a467..38c014a467 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/WorldProviderRoss128ba.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/planets/ross128ba/WorldProviderRoss128ba.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/solarsystems/Ross128SolarSystem.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/solarsystems/Ross128SolarSystem.java
index f7bdec79eb..f7bdec79eb 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/solarsystems/Ross128SolarSystem.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/galacticraft/solarsystems/Ross128SolarSystem.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/GT_NBT_DataBase.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/GT_NBT_DataBase.java
index cc9b1dcc2d..cc9b1dcc2d 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/GT_NBT_DataBase.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/GT_NBT_DataBase.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/TileEntity_GTDataServer.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/TileEntity_GTDataServer.java
index fdfe3d7ee9..fdfe3d7ee9 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/TileEntity_GTDataServer.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/openComputers/TileEntity_GTDataServer.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/TecTechResearchLoader.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/TecTechResearchLoader.java
index a760c5e256..a760c5e256 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/TecTechResearchLoader.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/TecTechResearchLoader.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/LowPowerLaser.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/LowPowerLaser.java
index e3a2065ed5..e3a2065ed5 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/LowPowerLaser.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/LowPowerLaser.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_Abstract_LowPowerLaserThingy.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_Abstract_LowPowerLaserThingy.java
index c1d751739f..c1d751739f 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_Abstract_LowPowerLaserThingy.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_Abstract_LowPowerLaserThingy.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserBox.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserBox.java
index b79ddb4a44..b79ddb4a44 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserBox.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserBox.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserDynamo.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserDynamo.java
index 5a9cd8048b..5a9cd8048b 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserDynamo.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserDynamo.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserHatch.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserHatch.java
index 6b6b6c3558..6b6b6c3558 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserHatch.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_LowPowerLaserHatch.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_Pipe_Energy_LowPower.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_Pipe_Energy_LowPower.java
index 38ad31688d..38ad31688d 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_Pipe_Energy_LowPower.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tectech/tileentites/tiered/TT_MetaTileEntity_Pipe_Energy_LowPower.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/tgregworks/MaterialsInjector.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tgregworks/MaterialsInjector.java
index 2959bc2fb2..2959bc2fb2 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/tgregworks/MaterialsInjector.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/tgregworks/MaterialsInjector.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_Multi_IndustrialCrucible.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_Multi_IndustrialCrucible.java
index c52e440383..c52e440383 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_Multi_IndustrialCrucible.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_Multi_IndustrialCrucible.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_WandBuffer.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_WandBuffer.java
index 79e606d536..79e606d536 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_WandBuffer.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/tile/GT_WandBuffer.java
diff --git a/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/util/ThaumcraftHandler.java b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/util/ThaumcraftHandler.java
index 9492a6c077..9492a6c077 100644
--- a/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/util/ThaumcraftHandler.java
+++ b/bartworks/src/main/java/com/github/bartimaeusnek/crossmod/thaumcraft/util/ThaumcraftHandler.java
diff --git a/src/main/resources/assets/bartworks/lang/de_DE.lang b/bartworks/src/main/resources/assets/bartworks/lang/de_DE.lang
index 23edaf6124..23edaf6124 100644
--- a/src/main/resources/assets/bartworks/lang/de_DE.lang
+++ b/bartworks/src/main/resources/assets/bartworks/lang/de_DE.lang
diff --git a/src/main/resources/assets/bartworks/lang/en_US.lang b/bartworks/src/main/resources/assets/bartworks/lang/en_US.lang
index 7ec5d318d0..7ec5d318d0 100644
--- a/src/main/resources/assets/bartworks/lang/en_US.lang
+++ b/bartworks/src/main/resources/assets/bartworks/lang/en_US.lang
diff --git a/src/main/resources/assets/bartworks/lang/fr_FR.lang b/bartworks/src/main/resources/assets/bartworks/lang/fr_FR.lang
index a9f4964759..a9f4964759 100644
--- a/src/main/resources/assets/bartworks/lang/fr_FR.lang
+++ b/bartworks/src/main/resources/assets/bartworks/lang/fr_FR.lang
diff --git a/src/main/resources/assets/bartworks/lang/zh_CN.lang b/bartworks/src/main/resources/assets/bartworks/lang/zh_CN.lang
index f3a9ca534d..f3a9ca534d 100644
--- a/src/main/resources/assets/bartworks/lang/zh_CN.lang
+++ b/bartworks/src/main/resources/assets/bartworks/lang/zh_CN.lang
diff --git a/src/main/resources/assets/bartworks/sounds.json b/bartworks/src/main/resources/assets/bartworks/sounds.json
index 0c1dea7fcc..0c1dea7fcc 100644
--- a/src/main/resources/assets/bartworks/sounds.json
+++ b/bartworks/src/main/resources/assets/bartworks/sounds.json
diff --git a/src/main/resources/assets/bartworks/sounds/radhatch.ogg b/bartworks/src/main/resources/assets/bartworks/sounds/radhatch.ogg
index 754711c999..754711c999 100644
--- a/src/main/resources/assets/bartworks/sounds/radhatch.ogg
+++ b/bartworks/src/main/resources/assets/bartworks/sounds/radhatch.ogg
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/GUIPrimitiveKUBox.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/GUIPrimitiveKUBox.png
index aef2e1687b..aef2e1687b 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/GUIPrimitiveKUBox.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/GUIPrimitiveKUBox.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/background/brown.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/background/brown.png
index 2db03dff22..2db03dff22 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/background/brown.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/background/brown.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.png
index c14cfb78ae..c14cfb78ae 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/background/circuit_programmer.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.png
index a8d30a022e..a8d30a022e 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_button/assembler_mode.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.png
index d7132dcfba..d7132dcfba 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_button/line_mode.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.png
index 4244b6256b..4244b6256b 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/cross.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.png
index d051681c1e..d051681c1e 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dish.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.png
index fb7483a9a7..fb7483a9a7 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/dna_flask.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.png
index 5dc78c8271..5dc78c8271 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/module.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.png
index ca3b11d69d..ca3b11d69d 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/overlay_slot/rod.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.png
index 34b2b59e0e..34b2b59e0e 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/bw_logo_47x21.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.png
index de259fc32a..de259fc32a 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_container.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.png
index 8b6425b8cf..8b6425b8cf 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/decay_time_inside.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/radiation.png
index c2f1271f62..c2f1271f62 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/radiation.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.png
index e5cf55abd4..e5cf55abd4 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_frame.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.png
index eb908f863a..eb908f863a 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/radiation_shutter_inside.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.png
index fc6478c29f..fc6478c29f 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/sievert_container.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.png
index 4a54ac5781..4a54ac5781 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/stored_eu_frame.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.png
index f9e55beeb9..f9e55beeb9 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_empty.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.png
index 3840d7fd45..3840d7fd45 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/picture/windmill_rotating.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.png
index 0dfe303cf0..0dfe303cf0 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/progressbar/fuel.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.png
index 7a324ebf38..7a324ebf38 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/progressbar/sievert.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.png
index b302f4e89e..b302f4e89e 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/progressbar/stored_eu_116.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/slot/brown.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/slot/brown.png
index 4d8405e02c..4d8405e02c 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/slot/brown.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/slot/brown.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.png
index 73893b9036..73893b9036 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/tab/title_angular_brown.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.png
index d5c9ae0825..d5c9ae0825 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/tab/title_brown.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.png b/bartworks/src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.png
index 5b3c3edec0..5b3c3edec0 100644
--- a/src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/GUI/tab/title_dark_brown.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.png
index fc0872b45f..fc0872b45f 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/BWRotorBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.png
index 0e27ddbb62..0e27ddbb62 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.png
index f711908135..f711908135 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/BoronSilicateGlassBlockRandlos.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.png
index 92ce6cb9a2..92ce6cb9a2 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock1.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.png
index 0cc6e08ae3..0cc6e08ae3 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock2.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.png
index f230acbe3f..f230acbe3f 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock3.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.png
index 2febb0540d..2febb0540d 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock4.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.png
index 89e0b0d84e..89e0b0d84e 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock5.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.png
index 54c29e5ae9..54c29e5ae9 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ColoredBoronSilicateGlassBlock6.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.png
index 2f58642a18..2f58642a18 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/CosmicNeutroniumReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.png
index 8922a3d4e2..8922a3d4e2 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/EtchedLapisCell.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.png
index 6e2e7dfe4e..6e2e7dfe4e 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/GrindstoneL.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.png
index 4710c28436..4710c28436 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/InfinityReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.png
index 9a87942ef9..9a87942ef9 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/IridiumReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.png
index 0fd516231e..0fd516231e 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_0.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.png
index acdb3b4e6a..acdb3b4e6a 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_1.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.png
index 1feeb1fd92..1feeb1fd92 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_2.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.png
index c6de6719e9..c6de6719e9 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CASING_3.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.png
index f41b59f820..f41b59f820 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/LESU_CELL.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.png
index 213f8feafd..213f8feafd 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/LuVTierMaterialReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.png
index c75fafb933..c75fafb933 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/NeutroniumReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.png
index f5976c093b..f5976c093b 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/NickelFerriteBlocks.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.png
index e5be40d5ff..e5be40d5ff 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/OsmiumReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.png
index 336a7a5b4e..336a7a5b4e 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/PlatedLapisCell.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.png
index 5d97902f87..5d97902f87 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/ThoriumYttriumGlass.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.png
index 9908141e11..9908141e11 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/TitaniumReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.png
index 220e85e57c..220e85e57c 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/TranscendentallyReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.png
index 79801b0471..79801b0471 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/TransformerCoil.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.png
index 07618e28aa..07618e28aa 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/TungstenSteelReinforcedBoronSilicateGlassBlock.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.png
index f66994bcd2..f66994bcd2 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_0.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.png
index 1249814be6..1249814be6 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_1.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.png
index 0bb400b3dc..0bb400b3dc 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_10.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.png
index e40c597ceb..e40c597ceb 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_11.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.png
index 2ddabd3331..2ddabd3331 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_12.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.png
index 617758a4b6..617758a4b6 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_13.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.png
index a8ab0806e2..a8ab0806e2 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_14.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.png
index d3f697ab1f..d3f697ab1f 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_15.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.png
index 543b011c03..543b011c03 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_2.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.png
index d69e640fb3..d69e640fb3 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_3.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.png
index 48509772ce..48509772ce 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_4.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.png
index 93dc271b8e..93dc271b8e 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_5.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.png
index da2f1deb4a..da2f1deb4a 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_6.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.png
index 4a7a5b4a3f..4a7a5b4a3f 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_7.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.png
index fdf64c2958..fdf64c2958 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_8.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.png
index d4110a3b06..d4110a3b06 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlock/BoronSilicateGlassBlock_9.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.png
index 5622806282..5622806282 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_0.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.png
index c0b5b0da4d..c0b5b0da4d 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_1.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.png
index 3c8b4c66d7..3c8b4c66d7 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_10.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.png
index 036adac6f3..036adac6f3 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_11.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.png
index ea67c34b23..ea67c34b23 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_12.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.png
index 1727d6228a..1727d6228a 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_13.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.png
index 8795c1dacc..8795c1dacc 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_14.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.png
index f711908135..f711908135 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_15.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.png
index c69982d8e7..c69982d8e7 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_2.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.png
index 18eadf45ed..18eadf45ed 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_3.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.png
index 269de3edb1..269de3edb1 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_4.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.png
index 198701e1bb..198701e1bb 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_5.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.png
index 9f050cc629..9f050cc629 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_6.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.png
index 4969508f31..4969508f31 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_7.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.png
index c73f1f5320..c73f1f5320 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_8.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.png
index f9a450ae2d..f9a450ae2d 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/connectedTex/BoronSilicateGlassBlockRandlos/BoronSilicateGlassBlockRandlos_9.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.png
index 91bcf79e1f..91bcf79e1f 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpDown.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.png
index 4b8c71a8ae..4b8c71a8ae 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpSide.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.png
index 91bcf79e1f..91bcf79e1f 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/heatedWaterPumpTop.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/blocks/windmill_top.png b/bartworks/src/main/resources/assets/bartworks/textures/blocks/windmill_top.png
index 8f49c6b2f3..8f49c6b2f3 100644
--- a/src/main/resources/assets/bartworks/textures/blocks/windmill_top.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/blocks/windmill_top.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/Agarose.png b/bartworks/src/main/resources/assets/bartworks/textures/items/Agarose.png
index fe6add0bb0..fe6add0bb0 100644
--- a/src/main/resources/assets/bartworks/textures/items/Agarose.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/Agarose.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BISOPelletBall.png b/bartworks/src/main/resources/assets/bartworks/textures/items/BISOPelletBall.png
index ea113e3f22..ea113e3f22 100644
--- a/src/main/resources/assets/bartworks/textures/items/BISOPelletBall.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/BISOPelletBall.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.png b/bartworks/src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.png
index 029d895f31..029d895f31 100644
--- a/src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/BISOPelletCompound.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.png b/bartworks/src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.png
index 6b7f9a54d8..6b7f9a54d8 100644
--- a/src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/BW_SimpleWindMeter.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BWmotor.png b/bartworks/src/main/resources/assets/bartworks/textures/items/BWmotor.png
index c701227af2..c701227af2 100644
--- a/src/main/resources/assets/bartworks/textures/items/BWmotor.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/BWmotor.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BWrawtube.png b/bartworks/src/main/resources/assets/bartworks/textures/items/BWrawtube.png
index ab3dd4a2bd..ab3dd4a2bd 100644
--- a/src/main/resources/assets/bartworks/textures/items/BWrawtube.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/BWrawtube.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.png b/bartworks/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.png
index 73abda00dd..73abda00dd 100644
--- a/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPellet.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.png b/bartworks/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.png
index eb5e37eaa1..eb5e37eaa1 100644
--- a/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/BurnedOutTRISOPelletBall.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.png b/bartworks/src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.png
index 5021c2834e..5021c2834e 100644
--- a/src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/CircuitProgrammer.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.png b/bartworks/src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.png
index a420873554..a420873554 100644
--- a/src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/ClonalCellularSynthesisModule.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.png b/bartworks/src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.png
index 99dc1c9b95..99dc1c9b95 100644
--- a/src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/DNAExtractionModule.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/DNASampleFlask.png b/bartworks/src/main/resources/assets/bartworks/textures/items/DNASampleFlask.png
index 7c10790535..7c10790535 100644
--- a/src/main/resources/assets/bartworks/textures/items/DNASampleFlask.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/DNASampleFlask.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/DetergentPowder.png b/bartworks/src/main/resources/assets/bartworks/textures/items/DetergentPowder.png
index 92fe5e9d81..92fe5e9d81 100644
--- a/src/main/resources/assets/bartworks/textures/items/DetergentPowder.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/DetergentPowder.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/GT2Coin.png b/bartworks/src/main/resources/assets/bartworks/textures/items/GT2Coin.png
index c590469aed..c590469aed 100644
--- a/src/main/resources/assets/bartworks/textures/items/GT2Coin.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/GT2Coin.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.png b/bartworks/src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.png
index b04bb30f5c..b04bb30f5c 100644
--- a/src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/GT_Rockcutter.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.png b/bartworks/src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.png
index fd8185056b..fd8185056b 100644
--- a/src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/GT_Teslastaff.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.png
index 18ab91de32..18ab91de32 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundPlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.png
index 26f20f97f1..26f20f97f1 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.png
index 53c59ec79c..53c59ec79c 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBISOPebbleCompoundUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.png
index 714b4806dd..714b4806dd 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallPlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.png
index 2be7586764..2be7586764 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.png
index 6f95ff5256..6f95ff5256 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOBallUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.png
index e29d9dc953..e29d9dc953 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebblePlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.png
index 1e0c684eb1..1e0c684eb1 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.png
index 1cbc98794d..1cbc98794d 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRBurnedOutTRISOPebbleUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.png
index 7858c997d4..7858c997d4 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixturePlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.png
index 19b94a07cb..19b94a07cb 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.png
index 324df7101b..324df7101b 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRHTGRFuelMixtureUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.png
index 28432d2d9b..28432d2d9b 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallPlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.png
index ada36141c6..ada36141c6 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.png
index 7054c76741..7054c76741 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOBallUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.png
index b3b36e3bdc..b3b36e3bdc 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundPlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.png
index ab142635c9..ab142635c9 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.png
index e7ac40c10f..e7ac40c10f 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleCompoundUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.png
index ea22c17f5c..ea22c17f5c 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebblePlutonium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.png
index b2c8003b5c..b2c8003b5c 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleThorium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.png b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.png
index 0d026c2492..0d026c2492 100644
--- a/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/HTGRTRISOPebbleUranium.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/IncubationModule.png b/bartworks/src/main/resources/assets/bartworks/textures/items/IncubationModule.png
index e0ea17749d..e0ea17749d 100644
--- a/src/main/resources/assets/bartworks/textures/items/IncubationModule.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/IncubationModule.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.png b/bartworks/src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.png
index c0e5b9a822..c0e5b9a822 100644
--- a/src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/PCRThermoclyclingModule.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.png b/bartworks/src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.png
index f51730a7af..f51730a7af 100644
--- a/src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/PlasmaMembrane.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/PlasmidCell.png b/bartworks/src/main/resources/assets/bartworks/textures/items/PlasmidCell.png
index 0e62fa2621..0e62fa2621 100644
--- a/src/main/resources/assets/bartworks/textures/items/PlasmidCell.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/PlasmidCell.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.png b/bartworks/src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.png
index 9c20f554e7..9c20f554e7 100644
--- a/src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/PlasmidSynthesisModule.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/TRISOPellet.png b/bartworks/src/main/resources/assets/bartworks/textures/items/TRISOPellet.png
index 26109fc979..26109fc979 100644
--- a/src/main/resources/assets/bartworks/textures/items/TRISOPellet.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/TRISOPellet.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.png b/bartworks/src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.png
index 0aea0500cf..0aea0500cf 100644
--- a/src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/TRISOPelletBall.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.png b/bartworks/src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.png
index 6b2835d100..6b2835d100 100644
--- a/src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/TRISOPelletCompound.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/TransformationModule.png b/bartworks/src/main/resources/assets/bartworks/textures/items/TransformationModule.png
index 36b8a44f4d..36b8a44f4d 100644
--- a/src/main/resources/assets/bartworks/textures/items/TransformationModule.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/TransformationModule.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/WrapOverlay.png b/bartworks/src/main/resources/assets/bartworks/textures/items/WrapOverlay.png
index f6d80e292e..f6d80e292e 100644
--- a/src/main/resources/assets/bartworks/textures/items/WrapOverlay.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/WrapOverlay.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/completed_grindstone.png b/bartworks/src/main/resources/assets/bartworks/textures/items/completed_grindstone.png
index a02ee7ad6a..a02ee7ad6a 100644
--- a/src/main/resources/assets/bartworks/textures/items/completed_grindstone.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/completed_grindstone.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/grindstone_bottom.png b/bartworks/src/main/resources/assets/bartworks/textures/items/grindstone_bottom.png
index 33b1e96bda..33b1e96bda 100644
--- a/src/main/resources/assets/bartworks/textures/items/grindstone_bottom.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/grindstone_bottom.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/grindstone_top.png b/bartworks/src/main/resources/assets/bartworks/textures/items/grindstone_top.png
index 0be37504b5..0be37504b5 100644
--- a/src/main/resources/assets/bartworks/textures/items/grindstone_top.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/grindstone_top.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.png b/bartworks/src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.png
index 6de5748e32..6de5748e32 100644
--- a/src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/gt.GT2Destructopack.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/petriDish.png b/bartworks/src/main/resources/assets/bartworks/textures/items/petriDish.png
index 467a79f19c..467a79f19c 100644
--- a/src/main/resources/assets/bartworks/textures/items/petriDish.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/petriDish.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.png b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.png
index bdb4aafc04..bdb4aafc04 100644
--- a/src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/combinedParts.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.png b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.png
index 13ae5461e8..13ae5461e8 100644
--- a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorCombined.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.png b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.png
index a11f72b76d..a11f72b76d 100644
--- a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorLeather.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.png b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.png
index 56863186ac..56863186ac 100644
--- a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorPaper.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.png b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.png
index a5bb68bb43..a5bb68bb43 100644
--- a/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/itemRotorWool.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.png b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.png
index 824697ab3d..824697ab3d 100644
--- a/src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/leatherParts.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/paperParts.png b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/paperParts.png
index c00616ed74..c00616ed74 100644
--- a/src/main/resources/assets/bartworks/textures/items/rotors/paperParts.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/paperParts.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.png b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.png
index 3171928a82..3171928a82 100644
--- a/src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/rotorCombined.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.png b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.png
index 4d0b74c047..4d0b74c047 100644
--- a/src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/rotorLeather.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.png b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.png
index e60e68040f..e60e68040f 100644
--- a/src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/rotorPaper.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.png b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.png
index 5cea540797..5cea540797 100644
--- a/src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/rotorWool.png
Binary files differ
diff --git a/src/main/resources/assets/bartworks/textures/items/rotors/woolParts.png b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/woolParts.png
index 24c6cb0573..24c6cb0573 100644
--- a/src/main/resources/assets/bartworks/textures/items/rotors/woolParts.png
+++ b/bartworks/src/main/resources/assets/bartworks/textures/items/rotors/woolParts.png
Binary files differ
diff --git a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.png b/bartworks/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.png
index 18e7cd3b3c..18e7cd3b3c 100644
--- a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.png
+++ b/bartworks/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128.png
Binary files differ
diff --git a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.png b/bartworks/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.png
index 85b66ad2a5..85b66ad2a5 100644
--- a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.png
+++ b/bartworks/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128b.png
Binary files differ
diff --git a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.png b/bartworks/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.png
index 745d1131c3..745d1131c3 100644
--- a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.png
+++ b/bartworks/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/MapObjs/Ross128ba.png
Binary files differ
diff --git a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.png b/bartworks/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.png
index d966674e54..d966674e54 100644
--- a/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.png
+++ b/bartworks/src/main/resources/assets/bartworkscrossmod/galacticraft/Ross128b/World/SunRoss128.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasing.png
index 47a39e7526..47a39e7526 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/copy.bat b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/copy.bat
index 9713953aac..9713953aac 100644
--- a/src/main/resources/assets/gregtech/textures/blocks/materialicons/copy.bat
+++ b/bartworks/src/main/resources/assets/gregtech/textures/blocks/materialicons/copy.bat
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_Cell.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_Cell.png
index e372f01092..e372f01092 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_Cell.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_Cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.png
index b0836b8d41..b0836b8d41 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Core_Reactor_CellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Double_Tiberiumcell.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Double_Tiberiumcell.png
index bfe6e2288b..bfe6e2288b 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.Double_Tiberiumcell.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Double_Tiberiumcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.png
index a7d2c341a2..a7d2c341a2 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Double_TiberiumcellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Quad_Tiberiumcell.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Quad_Tiberiumcell.png
index 85aa8c19a1..85aa8c19a1 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.Quad_Tiberiumcell.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Quad_Tiberiumcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.png
index 0a71854e05..0a71854e05 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Quad_TiberiumcellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Tiberiumcell.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Tiberiumcell.png
index 4071c6062d..4071c6062d 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.Tiberiumcell.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.Tiberiumcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.png
index bafc8a4c8c..bafc8a4c8c 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.TiberiumcellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/0.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/0.png
index e16102588a..e16102588a 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/0.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.png
index 491164695b..491164695b 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.png
index 38429ed78d..38429ed78d 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/10.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.png
index 3901815927..3901815927 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/11.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.png
index c97ec3384c..c97ec3384c 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/12.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.png
index 40e5c92817..40e5c92817 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/13.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.png
index 10c6f20de0..10c6f20de0 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/14.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.png
index 968e0745c9..968e0745c9 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.png
index 9e22dd6726..9e22dd6726 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.png
index 86411e18bd..86411e18bd 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.png
index 57a7c7a932..57a7c7a932 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.png
index 9f68371247..9f68371247 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.png
index 7a322b76c0..7a322b76c0 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.png
index 9fe039db81..9fe039db81 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.png b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.png
index 457a51b7a1..457a51b7a1 100644
--- a/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/gt.bwMetaGeneratedItem0/9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing.png
index cd6a50eca3..cd6a50eca3 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.png
index 5fea5be598..5fea5be598 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasingAdvanced_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.png
index 2b0422489e..2b0422489e 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/blockCasing_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.png
index 9e388650d9..9e388650d9 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.png
index 3e9106f277..3e9106f277 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.png
index b2bd85bf44..b2bd85bf44 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsuleMolten_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.png
index 7c6797718d..7c6797718d 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/capsule_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/bottle.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/bottle.png
index dbf735f4fb..dbf735f4fb 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/bottle.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/bottle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.png b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.png
index 66bd26dc46..66bd26dc46 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.png
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/bottle_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/copy.bat b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/copy.bat
index 9713953aac..9713953aac 100644
--- a/src/main/resources/assets/gregtech/textures/items/materialicons/copy.bat
+++ b/bartworks/src/main/resources/assets/gregtech/textures/items/materialicons/copy.bat
diff --git a/bartworks/src/main/resources/mcmod.info b/bartworks/src/main/resources/mcmod.info
new file mode 100644
index 0000000000..a7205e0523
--- /dev/null
+++ b/bartworks/src/main/resources/mcmod.info
@@ -0,0 +1,55 @@
+{
+ "modListVersion": 2,
+ "modList": [{
+ "modid": "${modId}",
+ "name": "${modName}",
+ "description": "A Gregtech Addon.",
+ "version": "${modVersion}",
+ "mcversion": "${minecraftVersion}",
+ "url": "https://github.com/bartimaeusnek/bartworks",
+ "updateUrl": "",
+ "authorList": ["bartimaeusnek"],
+ "credits": "Gregorius Techneticies for making gregtech and allowing me to port his old stuff.\n Austin Appleby and Yonik Seeley for creating and putting the MurmurHash3 into the public domain.\n Spluff and EmeraldsEmerald for the Awesome Textures aswell.",
+ "logoFile": "",
+ "screenshots": [],
+ "parent": "",
+ "requiredMods": [],
+ "dependencies": [],
+ "dependants": [],
+ "useDependencyInformation": false
+ },{
+ "modid": "bartworkscrossmod",
+ "name": "BartWorks Mod Additions",
+ "description": "",
+ "version": "${modVersion}",
+ "mcversion": "${minecraftVersion}",
+ "url": "https://github.com/bartimaeusnek/bartworks",
+ "updateUrl": "",
+ "authorList": ["bartimaeusnek"],
+ "credits": "",
+ "logoFile": "",
+ "screenshots": [],
+ "parent": "bartworks",
+ "requiredMods": [],
+ "dependencies": [],
+ "dependants": [],
+ "useDependencyInformation": false
+ },{
+ "modid": "bartworkscrossmodtgregworkscontainer",
+ "name": "BartWorks Mod Additions - TGregworks Container",
+ "description": "",
+ "version": "${modVersion}",
+ "mcversion": "${minecraftVersion}",
+ "url": "https://github.com/bartimaeusnek/bartworks",
+ "updateUrl": "",
+ "authorList": ["bartimaeusnek"],
+ "credits": "",
+ "logoFile": "",
+ "screenshots": [],
+ "parent": "bartworks",
+ "requiredMods": [],
+ "dependencies": [],
+ "dependants": [],
+ "useDependencyInformation": false
+ }]
+}
diff --git a/changelog.py b/changelog.py
new file mode 100644
index 0000000000..a540126fcd
--- /dev/null
+++ b/changelog.py
@@ -0,0 +1,172 @@
+# INSTALLATION:
+# Install Python https://www.python.org/downloads/windows/
+# Install git https://git-scm.com/download/win
+# Open a terminal and verify that you can run python and git
+# Go to the directory where you want to install this to and type
+# python -m venv venv
+# venv\Scripts\activate.bat
+# To install the required libraries, type:
+# python -m pip install --upgrade pip
+# pip install requests
+# pip install lxml
+
+# Running the script
+# open a terminal and run activate.bat again (like above)
+# python changelog.py <from_version> <to_version>
+# For example: python changelog.py 2.0.8.8 2.0.9.0
+# If you leave <to_version> out, it defaults to the latest git commit
+
+
+import os
+import re
+import sys
+import time
+
+from collections import defaultdict
+from subprocess import check_output
+
+import requests
+
+from lxml import html
+
+
+# REPO_NAME = "GT-New-Horizons-Modpack"
+REPO_NAME = "GT5-Unofficial"
+GITHUB_REPO_URL = "https://github.com/GTNewHorizons/" + REPO_NAME + ".git"
+GITHUB_ISSUE_URL = "https://github.com/GTNewHorizons/" + REPO_NAME + "/issues/"
+GITHUB_ISSUE_REGEX = re.compile("#\d+")
+
+
+def update_git_repo():
+ """Updates the GT:NH repo from GITHUB_REPO_URL"""
+ if os.path.exists(REPO_NAME):
+ os.chdir(REPO_NAME)
+ check_output("git fetch")
+ os.chdir("..")
+ else:
+ check_output("git clone " + GITHUB_REPO_URL)
+
+
+def get_git_log(from_tag, to_tag="HEAD"):
+ """Gets the git log between two tags. If to_tag=None, defaults to HEAD"""
+ os.chdir(REPO_NAME)
+ git_command = "git log --oneline " + from_tag + ".." + to_tag
+ return check_output(git_command).decode("utf-8").strip("\n")
+
+
+def format_raw_changelog(raw_log):
+ """Takes the raw changelog and formats it as follows:
+ Find all github issues (by #<digits>)
+ Fetch titles for github issues
+ Output:
+ - <Github issue title> <github issue #>
+ -- commit 1
+ -- commit 2
+ - Commits without titles
+ """
+ changelog_dict = make_changelog_dict(raw_log)
+ changelog_with_github_titles = add_github_titles(changelog_dict)
+ output_changelog = ""
+ for issue_title, commits in changelog_with_github_titles.items():
+ if not issue_title:
+ # No known GitHub title, just list these with one dash
+ for commit_message in commits:
+ output_changelog += "- " + commit_message + "\n"
+ else:
+ output_changelog += "- " + issue_title + "\n"
+ for commit_message in commits:
+ if commit_message == issue_title:
+ continue
+ if commit_message.startswith("Merge pull request "):
+ continue
+ if commit_message.startswith(" Merge pull request "):
+ continue
+ output_changelog += "-- " + commit_message + "\n"
+
+ return output_changelog
+
+
+def make_changelog_dict(raw_log):
+ """Takes a raw git changelog and returns a dict from github issue # -> list of commits.
+ If there is no github # mentioned, the key is the empty string
+ This also strips out the commit hashes coming from git log --oneline
+ """
+ changelog_dict = defaultdict(list)
+ for line in raw_log.split('\n'):
+ issue = get_github_issue_number(line)
+ changelog_dict[issue].append(clean_commit_line(line))
+ return changelog_dict
+
+
+def get_github_issue_number(line):
+ """Returns the github issue number if it exists, otherwise returns the empty string"""
+ matches = re.search(GITHUB_ISSUE_REGEX, line)
+ if matches:
+ return matches.group()[1:]
+ else:
+ return ""
+
+
+def clean_commit_line(line):
+ """Removes the commit hash from the front of the line (from the git log --oneline output)"""
+ return line[9:]
+
+
+def add_github_titles(changelog_dict):
+ """Turns a defaultdict of <github issue #> -> list of commit messages into
+ github issue title -> list of commit messages
+ """
+ extended_dict = defaultdict(list)
+ for issue, list_of_commits in changelog_dict.items():
+ if issue:
+ github_title = get_github_issue_title(issue)
+ if github_title:
+ title = get_github_issue_title(issue) + " #" + issue
+ else:
+ # issue not found on Github
+ title = ""
+ else:
+ title = ""
+ existing_commits = extended_dict[title]
+ if existing_commits:
+ existing_commits.extend(list_of_commits)
+ else:
+ extended_dict[title] = list_of_commits
+ return extended_dict
+
+
+def get_github_issue_title(issue):
+ """Fetches the issue title from GitHub"""
+ response = requests.get(GITHUB_ISSUE_URL + issue)
+ if response.status_code == 429:
+ # We got rate-limited. Wait as long as they are asking for
+ wait_time = int(response.headers["Retry-After"]) + 5
+ print("GitHub rate limiting. Sleeping for " + str(wait_time) + " seconds.")
+ time.sleep(wait_time)
+ response = requests.get(GITHUB_ISSUE_URL + issue)
+ html_tree = html.fromstring(response.content)
+ title_attribute = html_tree.find(".//title")
+ if title_attribute is None:
+ # Apparently someone referenced a non-existing Github issue
+ return ""
+ title = title_attribute.text
+ separator = " · "
+ separator_location = title.find(separator)
+ return title[0:separator_location]
+
+
+if __name__ == "__main__":
+ if len(sys.argv) < 2:
+ print("Please provide at least a starting version or commit hash.")
+ from_commit = sys.argv[1]
+ to_commit = "HEAD"
+ if len(sys.argv) == 3:
+ to_commit = sys.argv[2]
+
+ print("Changelog generator started. Fetching latest git repository...")
+ update_git_repo()
+ print("Generating raw changelog from git...")
+ raw_log = get_git_log(from_commit, to_commit)
+ print("Getting issue titles from Github (this takes a while for large change logs)...")
+ formatted_log = format_raw_changelog(raw_log)
+ print(formatted_log)
diff --git a/dependencies.gradle b/dependencies.gradle
index 1c63563399..955bd5b4e8 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -1,19 +1,86 @@
-// Add your dependencies here
-
+/*
+ * Add your dependencies here. Supported configurations:
+ * - api("group:name:version:classifier"): if you use the types from this dependency in the public API of this mod
+ * Available at runtime and compiletime for mods depending on this mod
+ * - implementation("g:n:v:c"): if you need this for internal implementation details of the mod, but none of it is visible via the public API
+ * Available at runtime but not compiletime for mods depending on this mod
+ * - compileOnly("g:n:v:c"): if the mod you're building doesn't need this dependency during runtime at all, e.g. for optional mods
+ * Not available at all for mods depending on this mod, only visible at compiletime for this mod
+ * - compileOnlyApi("g:n:v:c"): like compileOnly, but also visible at compiletime for mods depending on this mod
+ * Available at compiletime but not runtime for mods depending on this mod
+ * - runtimeOnlyNonPublishable("g:n:v:c"): if you want to include a mod in this mod's runClient/runServer runs, but not publish it as a dependency
+ * Not available at all for mods depending on this mod, only visible at runtime for this mod
+ * - devOnlyNonPublishable("g:n:v:c"): a combination of runtimeOnlyNonPublishable and compileOnly for dependencies present at both compiletime and runtime,
+ * but not published as Maven dependencies - useful for RFG-deobfuscated dependencies or local testing
+ * - runtimeOnly("g:n:v:c"): if you don't need this at compile time, but want it to be present at runtime
+ * Available at runtime for mods depending on this mod
+ * - annotationProcessor("g:n:v:c"): mostly for java compiler plugins, if you know you need this, use it, otherwise don't worry
+ * - testCONFIG("g:n:v:c") - replace CONFIG by one of the above (except api), same as above but for the test sources instead of main
+ *
+ * - shadowImplementation("g:n:v:c"): effectively the same as API, but the dependency is included in your jar under a renamed package name
+ * Requires you to enable usesShadowedDependencies in gradle.properties
+ *
+ * - compile("g:n:v:c"): deprecated, replace with "api" (works like the old "compile") or "implementation" (can be more efficient)
+ *
+ * You can exclude transitive dependencies (dependencies of the chosen dependency) by appending { transitive = false } if needed,
+ * but use this sparingly as it can break using your mod as another mod's dependency if you're not careful.
+ *
+ * To depend on obfuscated jars you can use `devOnlyNonPublishable(rfg.deobf("dep:spec:1.2.3"))` to fetch an obfuscated jar from maven,
+ * or `devOnlyNonPublishable(rfg.deobf(project.files("libs/my-mod-jar.jar")))` to use a file.
+ *
+ * Gradle names for some of the configuration can be misleading, compileOnlyApi and runtimeOnly both get published as dependencies in Maven, but compileOnly does not.
+ * The buildscript adds runtimeOnlyNonPublishable to also have a runtime dependency that's not published.
+ *
+ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph
+ */
dependencies {
- runtimeOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.6.0-GTNH:dev')
- runtimeOnlyNonPublishable('com.github.GTNewHorizons:waila:1.8.0:dev')
+ api("com.github.GTNewHorizons:StructureLib:1.3.1:dev")
+ api("net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev")
+ api("com.github.GTNewHorizons:NotEnoughItems:2.6.0-GTNH:dev")
+ api("com.github.GTNewHorizons:GTNHLib:0.2.11:dev")
+ api("com.github.GTNewHorizons:ModularUI:1.2.0:dev")
+ api("com.github.GTNewHorizons:waila:1.8.0:dev")
+ api("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-402-GTNH:dev")
+ api("com.github.GTNewHorizons:AE2FluidCraft-Rework:1.3.0-gtnh:dev")
+
+ implementation("com.github.GTNewHorizons:Avaritia:1.49:dev")
compileOnlyApi('com.github.GTNewHorizons:Angelica:1.0.0-alpha50:api') { transitive = false }
+ compileOnlyApi("com.github.GTNewHorizons:AppleCore:3.3.0:dev") { transitive = false }
+ compileOnlyApi("com.github.GTNewHorizons:BuildCraft:7.1.39:dev") { transitive = false }
+ compileOnlyApi("com.github.GTNewHorizons:EnderIO:2.8.0:dev") { transitive = false }
+ compileOnlyApi("com.github.GTNewHorizons:ProjectRed:4.9.5-GTNH:dev") { transitive = false }
+ compileOnlyApi("com.github.GTNewHorizons:ForestryMC:4.9.0:dev") { transitive = false }
+ compileOnlyApi("com.github.GTNewHorizons:Railcraft:9.15.8:dev") { transitive = false }
+
+ compileOnly("com.github.GTNewHorizons:EnderCore:0.4.6:dev") { transitive = false }
+ compileOnly("com.github.GTNewHorizons:Galacticraft:3.1.5-GTNH:dev") { transitive = false }
+ compileOnly("com.github.GTNewHorizons:TinkersConstruct:1.12.1-GTNH:dev") { transitive = false }
+ compileOnly("com.github.GTNewHorizons:Chisel:2.15.0-GTNH:dev") { transitive = false }
+ compileOnly("com.github.GTNewHorizons:Translocators:1.2.1:dev") { transitive = false }
+ compileOnly("curse.maven:cofh-core-69162:2388751") { transitive = false }
+ compileOnly("com.github.GTNewHorizons:Nuclear-Control:2.6.2:dev") { transitive = false }
+ compileOnly("thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev") { transitive = false }
+ compileOnly("com.github.GTNewHorizons:Hodgepodge:2.5.8:dev") { transitive = false }
+ compileOnly('com.github.GTNewHorizons:Botania:1.11.1-GTNH:dev') { transitive = false }
+ compileOnly('com.github.GTNewHorizons:HoloInventory:2.4.10-GTNH:dev') { transitive = false }
+ compileOnly('curse.maven:minefactory-reloaded-66672:2366150') { transitive = false }
+
+ compileOnly("com.google.auto.value:auto-value-annotations:1.10.1") { transitive = false }
+ annotationProcessor("com.google.auto.value:auto-value:1.10.1")
+
+ // For testing iApiary
+ //runtimeOnlyNonPublishable("com.github.GTNewHorizons:ForestryMC:4.9.0:dev")
+
+ testImplementation(platform('org.junit:junit-bom:5.9.2'))
+ testImplementation('org.junit.jupiter:junit-jupiter')
+ testImplementation("org.mockito:mockito-core:3.+")
- api('com.github.GTNewHorizons:GT5-Unofficial:5.09.46.23:dev')
- api("com.github.GTNewHorizons:TecTech:5.4.2:dev")
- api("com.github.GTNewHorizons:GalacticGregGT5:1.1.0:dev") {
- exclude group:"com.github.GTNewHorizons", module:"bartworks"
- }
- api("com.github.GTNewHorizons:Avaritia:1.49:dev")
- implementation("com.github.GTNewHorizons:TinkersConstruct:1.12.1-GTNH:dev")
+ functionalTestImplementation(platform('org.junit:junit-bom:5.9.2'))
+ functionalTestImplementation('org.junit.jupiter:junit-jupiter')
+ functionalTestImplementation('org.junit.platform:junit-platform-engine')
+ functionalTestImplementation('org.junit.platform:junit-platform-launcher')
+ functionalTestImplementation('org.junit.platform:junit-platform-reporting')
- compileOnly("TGregworks:TGregworks:1.7.10-GTNH-1.0.26:deobf") {transitive = false}
- compileOnly("com.github.GTNewHorizons:OpenComputers:1.10.11-GTNH:api") {transitive = false}
+ runtimeOnlyNonPublishable("com.github.GTNewHorizons:DuraDisplay:1.2.3:dev")
}
diff --git a/docs/RecipeBuilder.md b/docs/RecipeBuilder.md
new file mode 100644
index 0000000000..1607f8fd23
--- /dev/null
+++ b/docs/RecipeBuilder.md
@@ -0,0 +1,66 @@
+# introduction
+
+GT_RecipeBuilder is the replacement of GT_Values.RA.addXXXX for constructing and adding recipes.
+Compared to the old style, this one utilizes the builder pattern to
+
+1. allow greater flexibility in API.
+2. allow us to unify the AssLine recipes and everything else
+3. a much nicer syntax than an awfully long line, i.e. more readability
+
+## metadata
+
+this corresponds to the various int/long parameter on the old recipe adder interface.
+See implosion compressor recipe map for a example on its usage.
+the extension also made it possible to use more complicated value, however there is no such use case yet.
+
+`LOW_GRAVITY` and `CLEANROOM` are common metadata that are supported in most recipe maps. They default to false, and is
+required to be set to true if you want your recipe to have such restriction.
+
+Other metadata used by the specific recipe maps MUST to be documented in some way, with javadoc on the recipe map field
+being the preferred choice.
+
+# Coding Conventions
+
+## Metadata identifiers
+
+1. naming uses snake case, e.g. `my_metadata_identifier`
+2.
+
+## complicated recipe adder
+
+1. If one invocation of recipe adder would add multiple recipe to same recipe map, give that recipe map a recipeEmitter
+2. If one invocation of recipe adder would conditionally add recipe, define a new IRecipeMap in GT_RecipeConstants
+3. If one invocation of recipe adder would add recipe to multiple recipe map,
+ 1. If all recipe maps involved receive recipe only via this type of adding, use the chaining mechanism offered by GT_RecipeMap, i.e. addDownstream().
+
+ e.g.sMultiblockElectrolyzerRecipes and sElectrolyzerRecipes
+ 2. Otherwise, define a new IRecipeMap in GT_RecipeConstants.
+4. If the target isn't a real recipe map (e.g. AssLine stuff), define a new IRecipeMap in GT_RecipeConstants.
+
+## Downstream in an addon
+
+This assumes you need to generate recipe into your own recipe map from a parent recipe map.
+
+## deep copy or not
+
+There is no need to do deep copy EXCEPT you are downstream.
+If you do modify the values in a downstream recipe map, call IRecipeMap.deepCopyInput() before adding yourself as a downstream.
+
+## recipeTransformer or recipeEmitterSingle
+
+Prefer recipeTransformer, unless it would throw exception on builder.build().
+
+## Special Value and Special Item
+
+These are considered legacy. IRecipeMap should avoid using these and use the more readable metadata system.
+
+## Use recipe builder or add() directly inside IRecipeMap.doAdd()?
+
+You SHOULD use the recipe builder and delegate further processing to the doAdd() on that recipe map. e.g. UniversalDistillation
+However, there are situations that you need to bypass those logic. Then add() is a valid choice.
+
+## Reassign builder variable
+
+No. Just like StringBuilder, you should not do this. Builder is guaranteed to return itself, not a copy.
+
+Reassigning wouldn't break anything though. This is a coding convention to help the code to stay organized.
diff --git a/docs/ResourcePacks_Guide.md b/docs/ResourcePacks_Guide.md
new file mode 100644
index 0000000000..30fc219651
--- /dev/null
+++ b/docs/ResourcePacks_Guide.md
@@ -0,0 +1,68 @@
+This is a guide for resource packs to set up advanced configurations for GUI.
+
+## Override text color with mcmeta files
+
+You might want to change color of text displayed on GUI. You can place mcmeta files at the following locations:
+- `gregtech/textures/gui/background/singleblock_default.png.mcmeta` (most of the machines)
+- `gregtech/textures/gui/background/bronze.png.mcmeta` (steam bronze machines)
+- `gregtech/textures/gui/background/steel.png.mcmeta` (steam steel machines)
+- `gregtech/textures/gui/background/primitive.png.mcmeta` (steam primitive machines)
+- `gregtech/textures/gui/background/fusion_computer.png.mcmeta` (fusion reactor controller)
+- `gregtech/textures/gui/background/nei_single_recipe.png.mcmeta` (NEI recipe border)
+
+(and there might be more in the future, but currently these are exhaustive.)
+You also need to place png file corresponding to mcmeta file, even if it's unchanged from the mod's default one.
+
+Here is an example of the file:
+```json
+{
+ "colors": {
+ "guiTint": {
+ "enableGUITint": true,
+ "Black": "202020",
+ "Red": "800000",
+ "Green": "005B00",
+ "Brown": "553C00",
+ "Blue": "002456",
+ "Purple": "551839",
+ "Cyan": "007780",
+ "Light Gray": "AAAAAA",
+ "Gray": "808080",
+ "Pink": "800056",
+ "Lime": "559155",
+ "Yellow": "AAA455",
+ "Light Blue": "55A4AA",
+ "Magenta": "BF4095",
+ "Orange": "AA4F00",
+ "White": "FAFAFF",
+ "Machine Metal": "0047AB"
+ },
+ "textColor": {
+ "title": "FF7700",
+ "title_white": "66FAFA",
+ "text_white": "807BAA",
+ "text_gray": "AAE055",
+ "text_red": "FF2222",
+ "nei": "556D8E",
+ "nei_overlay_yellow": "0xFDD835"
+ }
+ }
+}
+```
+
+## Override progress bar texture
+
+With the transition to ModularUI, many of the textures can be reused in many places now. However, some resource packs still want to add progress bar textures for singleblock machines, unique to each type of them.
+You can simply add textures named by the following rules:
+
+- Basically place at `gregtech/textures/gui/progressbar/${unlocalized name of recipemap}`. Unlocalized name can be found on either of:
+ - Hold shift while hovering over NEI tab. "HandlerID" indicates unlocalized name.
+![](/docs/img/recipemap-unlocalized-name.png)
+ - Read code. Usually they're passed as 2nd argument for `GT_Recipe_Map` constructor. Recipemaps are defined at `gregtech.api.util.GT_Recipe`.
+- For steam machines, append `_bronze`, `_steel`, or `_primitive`.
+- Exceptions: Miner: `miner`, Electric Furnace: `E_Furnace`, Electric Oven: `E_Oven`
+
+Examples:
+- `gregtech/textures/gui/progressbar/gt.recipe.laserengraver.png`
+- `gregtech/textures/gui/progressbar/gt.recipe.alloysmelter_bronze.png`
+- `gregtech/textures/gui/progressbar/E_Furnace.png`
diff --git a/docs/img/recipemap-unlocalized-name.png b/docs/img/recipemap-unlocalized-name.png
new file mode 100644
index 0000000000..31c2b8bec9
--- /dev/null
+++ b/docs/img/recipemap-unlocalized-name.png
Binary files differ
diff --git a/gradle.properties b/gradle.properties
index 0c29462f28..dcbd4c3a8e 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -3,15 +3,15 @@
gtnh.settings.blowdryerTag = 0.2.2
# Human-readable mod name, available for mcmod.info population.
-modName = BartWorks
+modName = GregTech
# Case-sensitive identifier string, available for mcmod.info population and used for automatic mixin JSON generation.
# Conventionally lowercase.
-modId = bartworks
+modId = gregtech
# Root package of the mod, used to find various classes in other properties,
# mcmod.info substitution, enabling assertions in run tasks, etc.
-modGroup = com.github.bartimaeusnek.bartworks
+modGroup = gregtech
# Whether to use modGroup as the maven publishing group.
# Due to a history of using JitPack, the default is com.github.GTNewHorizons for all mods.
@@ -50,7 +50,7 @@ enableGenericInjection = true
# Generate a class with a String field for the mod version named as defined below.
# If generateGradleTokenClass is empty or not missing, no such class will be generated.
# If gradleTokenVersion is empty or missing, the field will not be present in the class.
-generateGradleTokenClass = com.github.bartimaeusnek.bartworks.API.API_REFERENCE
+generateGradleTokenClass = gregtech.GT_Version
# Name of the token containing the project's current version to generate/replace.
gradleTokenVersion = VERSION
@@ -80,7 +80,7 @@ apiPackage =
# Specify the configuration file for Forge's access transformers here. It must be placed into /src/main/resources/META-INF/
# There can be multiple files in a space-separated list.
# Example value: mymodid_at.cfg nei_at.cfg
-accessTransformersFile =
+accessTransformersFile = ggfab_at.cfg
# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
usesMixins = false
@@ -97,7 +97,7 @@ mixinsPackage =
# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin!
# This parameter is for legacy compatibility only
# Example value: (coreModClass = asm.FMLPlugin) + (modGroup = com.myname.mymodid) -> com.myname.mymodid.asm.FMLPlugin
-coreModClass = ASM.BWCorePlugin
+coreModClass =
# If your project is only a consolidation of mixins or a core mod and does NOT contain a 'normal' mod ( = some class
# that is annotated with @Mod) you want this to be true. When in doubt: leave it on false!
diff --git a/gtpp/.git-blame-ignore-revs b/gtpp/.git-blame-ignore-revs
new file mode 100644
index 0000000000..561b159a0b
--- /dev/null
+++ b/gtpp/.git-blame-ignore-revs
@@ -0,0 +1,4 @@
+# Ignore spotlessApply reformat
+55f64675b42ac8d3c557cc850f78664bee006f6f
+7d1f51a8937e0a86486267437d444696e81e8aa0
+69ce418e29e22391f60cdd55815727762a78c33a
diff --git a/gtpp/.gitattributes b/gtpp/.gitattributes
new file mode 100644
index 0000000000..fd2792b6cb
--- /dev/null
+++ b/gtpp/.gitattributes
@@ -0,0 +1,44 @@
+* text eol=lf
+
+*.[jJ][aA][rR] binary
+
+*.[pP][nN][gG] binary
+*.[jJ][pP][gG] binary
+*.[jJ][pP][eE][gG] binary
+*.[gG][iI][fF] binary
+*.[tT][iI][fF] binary
+*.[tT][iI][fF][fF] binary
+*.[iI][cC][oO] binary
+*.[sS][vV][gG] text
+*.[eE][pP][sS] binary
+*.[xX][cC][fF] binary
+
+*.[kK][aA][rR] binary
+*.[mM]4[aA] binary
+*.[mM][iI][dD] binary
+*.[mM][iI][dD][iI] binary
+*.[mM][pP]3 binary
+*.[oO][gG][gG] binary
+*.[rR][aA] binary
+
+*.7[zZ] binary
+*.[gG][zZ] binary
+*.[tT][aA][rR] binary
+*.[tT][gG][zZ] binary
+*.[zZ][iI][pP] binary
+
+*.[tT][cC][nN] binary
+*.[sS][oO] binary
+*.[dD][lL][lL] binary
+*.[dD][yY][lL][iI][bB] binary
+*.[pP][sS][dD] binary
+*.[tT][tT][fF] binary
+*.[oO][tT][fF] binary
+
+*.[pP][aA][tT][cC][hH] -text
+
+*.[bB][aA][tT] text eol=crlf
+*.[cC][mM][dD] text eol=crlf
+*.[pP][sS]1 text eol=crlf
+
+*[aA][uU][tT][oO][gG][eE][nN][eE][rR][aA][tT][eE][dD]* binary
diff --git a/gtpp/.github/workflows/build-and-test.yml b/gtpp/.github/workflows/build-and-test.yml
new file mode 100644
index 0000000000..d33f352e71
--- /dev/null
+++ b/gtpp/.github/workflows/build-and-test.yml
@@ -0,0 +1,15 @@
+
+name: Build and test
+
+on:
+ pull_request:
+ branches: [ master, main ]
+ push:
+ branches: [ master, main ]
+
+jobs:
+ build-and-test:
+ uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/build-and-test.yml@master
+ secrets: inherit
+ with:
+ timeout: 150
diff --git a/gtpp/.github/workflows/release-tags.yml b/gtpp/.github/workflows/release-tags.yml
new file mode 100644
index 0000000000..e4c0be6b0d
--- /dev/null
+++ b/gtpp/.github/workflows/release-tags.yml
@@ -0,0 +1,14 @@
+
+name: Release tagged build
+
+on:
+ push:
+ tags: [ '*' ]
+
+permissions:
+ contents: write
+
+jobs:
+ release-tags:
+ uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/release-tags.yml@master
+ secrets: inherit
diff --git a/gtpp/.gitignore b/gtpp/.gitignore
new file mode 100644
index 0000000000..27a8ae0f17
--- /dev/null
+++ b/gtpp/.gitignore
@@ -0,0 +1,38 @@
+.gradle
+.settings
+/.idea/
+/.vscode/
+/run/
+/build/
+/eclipse/
+.classpath
+.project
+/bin/
+/config/
+/crash-reports/
+/logs/
+options.txt
+/saves/
+usernamecache.json
+banned-ips.json
+banned-players.json
+eula.txt
+ops.json
+server.properties
+servers.dat
+usercache.json
+whitelist.json
+/out/
+*.iml
+*.ipr
+*.iws
+src/main/resources/mixins.*([!.]).json
+*.bat
+*.DS_Store
+!gradlew.bat
+.factorypath
+addon.local.gradle
+addon.local.gradle.kts
+addon.late.local.gradle
+addon.late.local.gradle.kts
+layout.json \ No newline at end of file
diff --git a/gtpp/CODEOWNERS b/gtpp/CODEOWNERS
new file mode 100644
index 0000000000..a6b5f68cd0
--- /dev/null
+++ b/gtpp/CODEOWNERS
@@ -0,0 +1,3 @@
+# Any Github changes require admin approval
+/.github/** @GTNewHorizons/admin
+
diff --git a/gtpp/ISSUE_TEMPLATE.md b/gtpp/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000000..8b1c8eb5fc
--- /dev/null
+++ b/gtpp/ISSUE_TEMPLATE.md
@@ -0,0 +1,48 @@
+# Issue Title
+ Provide a general summary of the issue in the Title above,
+ Something descriptive and related to the issue + Mod Version in [].
+ Example `Custom GT++ Alveary Frame Blocks do not work [v1.5.0-alpha]`
+
+## Expected Behavior
+ If you're describing a bug, tell us what you expect should happen.
+ If you're suggesting a change/improvement, tell us how it should/could work.
+
+## Current Behavior
+ If describing a bug, tell us what happens instead of the expected behavior.
+ If suggesting a change/improvement, explain the difference from current behavior.
+
+## Possible Solution
+ Not obligatory, but suggest a fix/reason for the bug,
+ or ideas how to implement the addition or change.
+
+## Steps to Reproduce (for bugs)
+ Provide a link to a live example, or an unambiguous set of steps to
+ reproduce this bug. Include code to reproduce, if relevant.
+ 1.
+ 2.
+
+## Context
+ How has this issue affected you? What are you trying to accomplish?
+ Providing context helps us come up with a solution that is most useful.
+
+## Game Environment
+ Include as many relevant details about the game environment or modpack you experienced the bug in/on.
+ If you are using a Modpack:
+ * Modpack Name:
+ * Version used:
+ * Download Link if possible:
+
+If not using a modpack:
+ * Mod List - Upload to Pastie/Pastebin/etc:
+
+Also include:
+ * Gregtech version:
+ * IC2 version:
+ * Java version:
+ * Operating System:
+
+### Misc Info
+ Check all that apply ([ ] -> [x] - use a lowercase x)
+ - [ ]    Using GT:NH/GT:New Horizons?
+ - [ ]    Single Player?
+ - [ ]    Multi Player? \ No newline at end of file
diff --git a/gtpp/LICENSE b/gtpp/LICENSE
new file mode 100644
index 0000000000..d4a9c0cc8a
--- /dev/null
+++ b/gtpp/LICENSE
@@ -0,0 +1,676 @@
+ Copyright (c) 2016-2021 - Alkalus
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/gtpp/README.md b/gtpp/README.md
new file mode 100644
index 0000000000..a54870e6a4
--- /dev/null
+++ b/gtpp/README.md
@@ -0,0 +1,7 @@
+# Welcome to the Github for GTNH fork of GT++!
+
+## This is a fork of GT++ by Alkalus (draknyte1)
+The original Github page can be found [here](https://github.com/alkcorp/GTplusplus), where you can also find links to the original GT++ Discord and the Patreon of Alkalus. The original work was relicensed under GNU General Public License v3.0 for this GTNH fork by Alkalus (see license page). Make sure to respect the license when using, modifying, or distributing any part of this mod. If not for open source mods, this mod itself simply would not exist. Thanks & happy modding!
+
+## Issues & Suggestions
+Please bring all issues and suggestions to the [GTNH issue page](https://github.com/GTNewHorizons/GT-New-Horizons-Modpack/issues) or the [GTNH discord](https://discord.gg/gtnh), not to the original github or here. \ No newline at end of file
diff --git a/gtpp/addon.gradle b/gtpp/addon.gradle
new file mode 100644
index 0000000000..e6ce5c7157
--- /dev/null
+++ b/gtpp/addon.gradle
@@ -0,0 +1,3 @@
+ compileJava {
+ options.encoding = "UTF-8"
+}
diff --git a/gtpp/build.gradle b/gtpp/build.gradle
new file mode 100644
index 0000000000..e57a16f9f1
--- /dev/null
+++ b/gtpp/build.gradle
@@ -0,0 +1,5 @@
+//version: 1707058017
+
+plugins {
+ id 'com.gtnewhorizons.gtnhconvention'
+}
diff --git a/gtpp/dependencies.gradle b/gtpp/dependencies.gradle
new file mode 100644
index 0000000000..5fc96521dc
--- /dev/null
+++ b/gtpp/dependencies.gradle
@@ -0,0 +1,18 @@
+dependencies {
+ api('com.github.GTNewHorizons:GT5-Unofficial:5.09.46.23:dev')
+ api("com.github.GTNewHorizons:bartworks:0.10.11:dev")
+
+ implementation('curse.maven:cofh-core-69162:2388751')
+ // https://www.curseforge.com/minecraft/mc-mods/advancedsolarpanels
+ implementation('curse.maven:advsolar-362768:2885953')
+
+ compileOnly('com.github.GTNewHorizons:Baubles:1.0.4:dev') {transitive=false}
+ compileOnly('com.github.GTNewHorizons:EnderCore:0.4.6:dev') {transitive=false}
+ compileOnly('com.github.GTNewHorizons:SC2:2.1.1:dev') {transitive=false}
+ compileOnly('com.github.GTNewHorizons:Binnie:2.3.4:dev') {transitive = false}
+ compileOnly('curse.maven:PlayerAPI-228969:2248928') {transitive=false}
+ compileOnly('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev') {transitive=false}
+ compileOnly('com.github.GTNewHorizons:Chisel:2.15.0-GTNH:dev') {transitive=false}
+
+ runtimeOnly('com.github.GTNewHorizons:ForestryMC:4.9.0:dev') {transitive=false}
+}
diff --git a/gtpp/gradle.properties b/gtpp/gradle.properties
new file mode 100644
index 0000000000..2ada87a5be
--- /dev/null
+++ b/gtpp/gradle.properties
@@ -0,0 +1,192 @@
+# ExampleMod tag to use as Blowdryer (Spotless, etc.) settings version, leave empty to disable.
+# LOCAL to test local config updates.
+gtnh.settings.blowdryerTag = 0.2.2
+
+# Human-readable mod name, available for mcmod.info population.
+modName = GT++
+
+# Case-sensitive identifier string, available for mcmod.info population and used for automatic mixin JSON generation.
+# Conventionally lowercase.
+modId = miscutils
+
+# Root package of the mod, used to find various classes in other properties,
+# mcmod.info substitution, enabling assertions in run tasks, etc.
+modGroup = gtPlusPlus
+
+# Whether to use modGroup as the maven publishing group.
+# Due to a history of using JitPack, the default is com.github.GTNewHorizons for all mods.
+useModGroupForPublishing = false
+
+# Updates your build.gradle and settings.gradle automatically whenever an update is available.
+autoUpdateBuildScript = false
+
+# Version of Minecraft to target
+minecraftVersion = 1.7.10
+
+# Version of Minecraft Forge to target
+forgeVersion = 10.13.4.1614
+
+# Specify an MCP channel for dependency deobfuscation and the deobfParams task.
+channel = stable
+
+# Specify an MCP mappings version for dependency deobfuscation and the deobfParams task.
+mappingsVersion = 12
+
+# Defines other MCP mappings for dependency deobfuscation.
+remoteMappings = https\://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/
+
+# Select a default username for testing your mod. You can always override this per-run by running
+# `./gradlew runClient --username=AnotherPlayer`, or configuring this command in your IDE.
+developmentEnvironmentUserName = Developer
+
+# Enables using modern Java syntax (up to version 17) via Jabel, while still targeting JVM 8.
+# See https://github.com/bsideup/jabel for details on how this works.
+enableModernJavaSyntax = true
+
+# Enables injecting missing generics into the decompiled source code for a better coding experience.
+# Turns most publicly visible List, Map, etc. into proper List<E>, Map<K, V> types.
+enableGenericInjection = false
+
+# Generate a class with a String field for the mod version named as defined below.
+# If generateGradleTokenClass is empty or not missing, no such class will be generated.
+# If gradleTokenVersion is empty or missing, the field will not be present in the class.
+generateGradleTokenClass =
+
+# Name of the token containing the project's current version to generate/replace.
+gradleTokenVersion = GRADLETOKEN_VERSION
+
+# [DEPRECATED] Mod ID replacement token.
+gradleTokenModId =
+
+# [DEPRECATED] Mod name replacement token.
+gradleTokenModName =
+
+# [DEPRECATED] Mod Group replacement token.
+gradleTokenGroupName =
+
+# [DEPRECATED]
+# Multiple source files can be defined here by providing a comma-separated list: Class1.java,Class2.java,Class3.java
+# public static final String VERSION = "GRADLETOKEN_VERSION";
+# The string's content will be replaced with your mod's version when compiled. You should use this to specify your mod's
+# version in @Mod([...], version = VERSION, [...]).
+# Leave these properties empty to skip individual token replacements.
+replaceGradleTokenInFile = CORE.java
+
+# In case your mod provides an API for other mods to implement you may declare its package here. Otherwise, you can
+# leave this property empty.
+# Example value: (apiPackage = api) + (modGroup = com.myname.mymodid) -> com.myname.mymodid.api
+apiPackage =
+
+# Specify the configuration file for Forge's access transformers here. It must be placed into /src/main/resources/META-INF/
+# There can be multiple files in a space-separated list.
+# Example value: mymodid_at.cfg nei_at.cfg
+accessTransformersFile =
+
+# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
+usesMixins = false
+
+# Adds some debug arguments like verbose output and class export.
+usesMixinDebug = false
+
+# Specify the location of your implementation of IMixinConfigPlugin. Leave it empty otherwise.
+mixinPlugin =
+
+# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail!
+mixinsPackage =
+
+# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin!
+# This parameter is for legacy compatibility only
+# Example value: (coreModClass = asm.FMLPlugin) + (modGroup = com.myname.mymodid) -> com.myname.mymodid.asm.FMLPlugin
+coreModClass = preloader.asm.Preloader_FMLLoadingPlugin
+
+# If your project is only a consolidation of mixins or a core mod and does NOT contain a 'normal' mod ( = some class
+# that is annotated with @Mod) you want this to be true. When in doubt: leave it on false!
+containsMixinsAndOrCoreModOnly = false
+
+# Enables Mixins even if this mod doesn't use them, useful if one of the dependencies uses mixins.
+forceEnableMixins = true
+
+# If enabled, you may use 'shadowCompile' for dependencies. They will be integrated into your jar. It is your
+# responsibility to check the license and request permission for distribution if required.
+usesShadowedDependencies = false
+
+# If disabled, won't remove unused classes from shadowed dependencies. Some libraries use reflection to access
+# their own classes, making the minimization unreliable.
+minimizeShadowedDependencies = true
+
+# If disabled, won't rename the shadowed classes.
+relocateShadowedDependencies = true
+
+# Adds the GTNH maven, CurseMaven, Modrinth, and some more well-known 1.7.10 repositories.
+includeWellKnownRepositories = true
+
+# Change these to your Maven coordinates if you want to publish to a custom Maven repository instead of the default GTNH Maven.
+# Authenticate with the MAVEN_USER and MAVEN_PASSWORD environment variables.
+# If you need a more complex setup disable maven publishing here and add a publishing repository to addon.gradle.
+usesMavenPublishing = true
+
+# Maven repository to publish the mod to.
+# mavenPublishUrl = https\://nexus.gtnewhorizons.com/repository/releases/
+
+# Publishing to Modrinth requires you to set the MODRINTH_TOKEN environment variable to your current Modrinth API token.
+#
+# The project's ID on Modrinth. Can be either the slug or the ID.
+# Leave this empty if you don't want to publish to Modrinth.
+modrinthProjectId =
+
+# The project's relations on Modrinth. You can use this to refer to other projects on Modrinth.
+# Syntax: scope1-type1:name1;scope2-type2:name2;...
+# Where scope can be one of [required, optional, incompatible, embedded],
+# type can be one of [project, version],
+# and the name is the Modrinth project or version slug/id of the other mod.
+# Example: required-project:fplib;optional-project:gasstation;incompatible-project:gregtech
+# Note: GTNH Mixins is automatically set as a required dependency if usesMixins = true
+modrinthRelations =
+
+# Publishing to CurseForge requires you to set the CURSEFORGE_TOKEN environment variable to one of your CurseForge API tokens.
+#
+# The project's numeric ID on CurseForge. You can find this in the About Project box.
+# Leave this empty if you don't want to publish on CurseForge.
+curseForgeProjectId =
+
+# The project's relations on CurseForge. You can use this to refer to other projects on CurseForge.
+# Syntax: type1:name1;type2:name2;...
+# Where type can be one of [requiredDependency, embeddedLibrary, optionalDependency, tool, incompatible],
+# and the name is the CurseForge project slug of the other mod.
+# Example: requiredDependency:railcraft;embeddedLibrary:cofhlib;incompatible:buildcraft
+# Note: UniMixins is automatically set as a required dependency if usesMixins = true.
+curseForgeRelations =
+
+# Optional parameter to customize the produced artifacts. Use this to preserve artifact naming when migrating older
+# projects. New projects should not use this parameter.
+customArchiveBaseName = GT-PlusPlus
+
+# Optional parameter to have the build automatically fail if an illegal version is used.
+# This can be useful if you e.g. only want to allow versions in the form of '1.1.xxx'.
+# The check is ONLY performed if the version is a git tag.
+# Note: the specified string must be escaped, so e.g. 1\\.1\\.\\d+ instead of 1\.1\.\d+
+# versionPattern =
+
+# Uncomment to prevent the source code from being published.
+# noPublishedSources = true
+
+# Uncomment this to disable Spotless checks.
+# This should only be uncommented to keep it easier to sync with upstream/other forks.
+# That is, if there is no other active fork/upstream, NEVER change this.
+# disableSpotless = true
+
+# Uncomment this to disable Checkstyle checks (currently wildcard import check).
+# disableCheckstyle = true
+
+# Override the IDEA build type. Valid values are: "" (leave blank, do not override), "idea" (force use native IDEA build), "gradle"
+# (force use delegated build).
+# This is meant to be set in $HOME/.gradle/gradle.properties.
+# e.g. add "systemProp.org.gradle.project.ideaOverrideBuildType=idea" will override the build type to be native build.
+# WARNING: If you do use this option, it will overwrite whatever you have in your existing projects. This might not be what you want!
+# Usually there is no need to uncomment this here as other developers do not necessarily use the same build type as you.
+# ideaOverrideBuildType = idea
+
+# Whether IDEA should run spotless checks when pressing the Build button.
+# This is meant to be set in $HOME/.gradle/gradle.properties.
+# ideaCheckSpotlessOnBuild = true
+
diff --git a/gtpp/gradle/wrapper/gradle-wrapper.jar b/gtpp/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..e6441136f3
--- /dev/null
+++ b/gtpp/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gtpp/gradle/wrapper/gradle-wrapper.properties b/gtpp/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..b82aa23a4f
--- /dev/null
+++ b/gtpp/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gtpp/gradlew b/gtpp/gradlew
new file mode 100755
index 0000000000..1aa94a4269
--- /dev/null
+++ b/gtpp/gradlew
@@ -0,0 +1,249 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gtpp/gradlew.bat b/gtpp/gradlew.bat
new file mode 100644
index 0000000000..25da30dbde
--- /dev/null
+++ b/gtpp/gradlew.bat
@@ -0,0 +1,92 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/gtpp/jitpack.yml b/gtpp/jitpack.yml
new file mode 100644
index 0000000000..09bbb514fc
--- /dev/null
+++ b/gtpp/jitpack.yml
@@ -0,0 +1,2 @@
+before_install:
+ - ./gradlew setupCIWorkspace \ No newline at end of file
diff --git a/gtpp/repositories.gradle b/gtpp/repositories.gradle
new file mode 100644
index 0000000000..c227b16ec2
--- /dev/null
+++ b/gtpp/repositories.gradle
@@ -0,0 +1,4 @@
+// Add any additional repositories for your dependencies here
+
+repositories {
+}
diff --git a/gtpp/settings.gradle b/gtpp/settings.gradle
new file mode 100644
index 0000000000..94c2daf35c
--- /dev/null
+++ b/gtpp/settings.gradle
@@ -0,0 +1,23 @@
+
+pluginManagement {
+ repositories {
+ maven {
+ // RetroFuturaGradle
+ name "GTNH Maven"
+ url "https://nexus.gtnewhorizons.com/repository/public/"
+ mavenContent {
+ includeGroup("com.gtnewhorizons")
+ includeGroupByRegex("com\\.gtnewhorizons\\..+")
+ }
+ }
+ gradlePluginPortal()
+ mavenCentral()
+ mavenLocal()
+ }
+}
+
+plugins {
+ id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.22'
+}
+
+
diff --git a/gtpp/src/main/java/gregtech/api/enums/TAE.java b/gtpp/src/main/java/gregtech/api/enums/TAE.java
new file mode 100644
index 0000000000..246b2006ea
--- /dev/null
+++ b/gtpp/src/main/java/gregtech/api/enums/TAE.java
@@ -0,0 +1,145 @@
+package gregtech.api.enums;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import gregtech.api.interfaces.ITexture;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+
+public class TAE {
+
+ // TAE stands for Texture Array Expansion.
+
+ public static int gtPPLastUsedIndex = 64;
+ public static int secondaryIndex = 0;
+
+ public static HashMap<Integer, GTPP_CopiedBlockTexture> mTAE = new HashMap<>();
+ private static final HashSet<Integer> mFreeSlots = new HashSet<>(64);
+
+ static {
+ for (int i = 64; i < 128; i++) {
+ mFreeSlots.add(i);
+ }
+ Logger.INFO("Initialising TAE.");
+ }
+
+ /**
+ *
+ * @param aPage - The Texture page (0-3)
+ * @param aID - The ID on the specified page (0-15)
+ * @param GTPP_CopiedBlockTexture - The Texture to register
+ * @return - Did it register correctly?
+ */
+ public static boolean registerTexture(int aPage, int aID, GTPP_CopiedBlockTexture GTPP_CopiedBlockTexture) {
+ int aRealID = aID + (aPage * 16);
+ return registerTexture(64 + aRealID, GTPP_CopiedBlockTexture);
+ }
+
+ public static boolean registerTexture(int aID, GTPP_CopiedBlockTexture GTPP_CopiedBlockTexture) {
+ if (mFreeSlots.contains(aID)) {
+ mFreeSlots.remove(aID);
+ mTAE.put(aID, GTPP_CopiedBlockTexture);
+ return true;
+ } else {
+ CORE.crash("Tried to register texture with ID " + aID + " to TAE, but it is already in use.");
+ return false; // Dead Code
+ }
+ }
+
+ public static void finalizeTAE() {
+ String aFreeSpaces = "";
+ String aPageAndSlotFree = "";
+ AutoMap<Integer> aTemp = new AutoMap<>(mFreeSlots);
+ for (int i = 0; i < mFreeSlots.size(); i++) {
+ int j = aTemp.get(i);
+ aFreeSpaces += j;
+ aPageAndSlotFree += getPageFromIndex(j);
+ if (i != (mFreeSlots.size() - 1)) {
+ aFreeSpaces += ", ";
+ aPageAndSlotFree += ", ";
+ }
+ }
+ Logger.INFO("Free Indexes within TAE: " + aFreeSpaces);
+ Logger.INFO("Free Page slots within TAE: " + aPageAndSlotFree);
+ Logger.INFO("Filling them with ERROR textures.");
+ for (int aFreeSlot : aTemp.values()) {
+ registerTexture(aFreeSlot, new GTPP_CopiedBlockTexture(ModBlocks.blockCasingsTieredGTPP, 1, 15));
+ }
+ Logger.INFO("Finalising TAE.");
+ for (int aKeyTae : mTAE.keySet()) {
+ Textures.BlockIcons.setCasingTextureForId(aKeyTae, mTAE.get(aKeyTae));
+ }
+ Logger.INFO("Finalised TAE.");
+ }
+
+ private static boolean registerTextures(GTPP_CopiedBlockTexture GTPP_CopiedBlockTexture) {
+ try {
+ // Handle page 2.
+ Logger.INFO("[TAE} Registering Texture, Last used casing ID is " + gtPPLastUsedIndex + ".");
+ if (gtPPLastUsedIndex >= 128) {
+ Field x = ReflectionUtils.getField(Textures.BlockIcons.class, "casingTexturePages");
+ if (x != null) {
+ ITexture[][] h = (ITexture[][]) x.get(null);
+ if (h != null) {
+ h[64][secondaryIndex++] = GTPP_CopiedBlockTexture;
+ x.set(null, h);
+ Logger
+ .INFO("[TAE} Registered Texture with ID " + (secondaryIndex - 1) + " in secondary index.");
+ return true;
+ }
+ }
+ }
+
+ // set to page 1.
+ else {
+ Textures.BlockIcons.setCasingTextureForId(gtPPLastUsedIndex, GTPP_CopiedBlockTexture);
+ Logger.INFO("[TAE} Registered Texture with ID " + (gtPPLastUsedIndex) + " in main index.");
+ gtPPLastUsedIndex++;
+ return true;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ Logger.INFO("[TAE} Failed to register texture, Last used casing ID is " + gtPPLastUsedIndex + ".");
+ return false;
+ }
+
+ public static ITexture getTexture(int index) {
+ if (gtPPLastUsedIndex >= 128) {
+ return Textures.BlockIcons.getCasingTextureForId(((64 * 128) + index));
+ }
+ return Textures.BlockIcons.getCasingTextureForId((64 + index));
+ }
+
+ public static int GTPP_INDEX(int ID) {
+
+ if (ID >= 64) {
+ if (gtPPLastUsedIndex >= 128) {
+ return (128 + ID);
+ }
+ }
+ return (64 + ID);
+ }
+
+ public static int getIndexFromPage(int page, int blockMeta) {
+ int id = 64;
+ id += (page == 0 ? 0 : page == 1 ? 16 : page == 2 ? 32 : page == 3 ? 48 : page == 4 ? 64 : 0);
+ id += blockMeta;
+ return id;
+ }
+
+ public static String getPageFromIndex(int aIndex) {
+ int aPage = 0;
+ int aSlot = 0;
+ int aAdjustedIndex = aIndex > 64 ? (aIndex - 64) : aIndex;
+ aPage = aAdjustedIndex / 16;
+ aSlot = aAdjustedIndex - (16 * aPage);
+ return "[" + aIndex + " | " + aPage + ", " + aSlot + "]";
+ }
+}
diff --git a/gtpp/src/main/java/gregtech/api/util/AdvancedFusionOverclockDescriber.java b/gtpp/src/main/java/gregtech/api/util/AdvancedFusionOverclockDescriber.java
new file mode 100644
index 0000000000..7a6e609f93
--- /dev/null
+++ b/gtpp/src/main/java/gregtech/api/util/AdvancedFusionOverclockDescriber.java
@@ -0,0 +1,23 @@
+package gregtech.api.util;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.api.objects.overclockdescriber.FusionOverclockDescriber;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class AdvancedFusionOverclockDescriber extends FusionOverclockDescriber {
+
+ public AdvancedFusionOverclockDescriber(byte energyTier, long capableStartup) {
+ super(energyTier, capableStartup);
+ }
+
+ @Override
+ protected int getEUtIncreasePerOC() {
+ return 2;
+ }
+
+ protected int getDurationDecreasePerOC() {
+ return 2;
+ }
+}
diff --git a/gtpp/src/main/java/gregtech/api/util/FishPondFakeRecipe.java b/gtpp/src/main/java/gregtech/api/util/FishPondFakeRecipe.java
new file mode 100644
index 0000000000..dc579ebd9b
--- /dev/null
+++ b/gtpp/src/main/java/gregtech/api/util/FishPondFakeRecipe.java
@@ -0,0 +1,80 @@
+package gregtech.api.util;
+
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.WeightedRandomFishable;
+import net.minecraftforge.common.FishingHooks;
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class FishPondFakeRecipe {
+
+ public static ArrayList<WeightedRandomFishable> fish = new ArrayList<>();
+ public static ArrayList<WeightedRandomFishable> junk = new ArrayList<>();
+ public static ArrayList<WeightedRandomFishable> treasure = new ArrayList<>();
+
+ @SuppressWarnings("unchecked")
+ public static boolean generateFishPondRecipes() {
+
+ try {
+ fish = (ArrayList<WeightedRandomFishable>) ReflectionUtils.getField(FishingHooks.class, "fish")
+ .get(null);
+ junk = (ArrayList<WeightedRandomFishable>) ReflectionUtils.getField(FishingHooks.class, "junk")
+ .get(null);
+ treasure = (ArrayList<WeightedRandomFishable>) ReflectionUtils.getField(FishingHooks.class, "treasure")
+ .get(null);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ Logger.INFO("Error generating Fish Pond Recipes. [1]");
+ e.printStackTrace();
+ }
+
+ AutoMap<ArrayList<WeightedRandomFishable>> mega = new AutoMap<>();
+ mega.put(fish);
+ mega.put(junk);
+ mega.put(treasure);
+
+ int mType = 14;
+ for (ArrayList<WeightedRandomFishable> f : mega.values()) {
+ for (WeightedRandomFishable weightedRandomFishable : f) {
+ if (weightedRandomFishable != null) {
+ WeightedRandomFishable u = weightedRandomFishable;
+ try {
+ ItemStack t = (ItemStack) ReflectionUtils
+ .getField(WeightedRandomFishable.class, "field_150711_b")
+ .get(u);
+ addNewFishPondLoot(mType, new ItemStack[] { t }, new int[] { 10000 });
+ } catch (IllegalArgumentException | IllegalAccessException e1) {
+ Logger.INFO("Error generating Fish Pond Recipes. [2]");
+ e1.printStackTrace();
+ }
+ }
+ }
+ mType++;
+ }
+
+ return true;
+ }
+
+ public static void addNewFishPondLoot(int circuit, ItemStack[] outputItems, int[] chances) {
+ GT_Recipe x = new GT_Recipe(
+ true,
+ new ItemStack[] { CI.getNumberedCircuit(circuit) },
+ outputItems,
+ null,
+ chances,
+ new FluidStack[] { null },
+ new FluidStack[] { null },
+ 100, // 1 Tick
+ 0, // No Eu produced
+ 0);
+ Logger.INFO("Fishing [" + circuit + "]: " + ItemUtils.getArrayStackNames(outputItems));
+ GTPPRecipeMaps.fishPondRecipes.addRecipe(x, false, false, false);
+ }
+}
diff --git a/gtpp/src/main/java/gregtech/api/util/GasSpargingRecipe.java b/gtpp/src/main/java/gregtech/api/util/GasSpargingRecipe.java
new file mode 100644
index 0000000000..667cc78d85
--- /dev/null
+++ b/gtpp/src/main/java/gregtech/api/util/GasSpargingRecipe.java
@@ -0,0 +1,103 @@
+package gregtech.api.util;
+
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.data.ArrayUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class GasSpargingRecipe implements Comparable<GasSpargingRecipe> {
+
+ public final FluidStack mInputGas;
+ public final FluidStack mInputSpentFuel;
+ public final FluidStack mOutputSpargedFuel;
+ public final int[] mMaxOutputQuantity;
+ public final FluidStack[] mFluidInputs;
+ public final FluidStack[] mFluidOutputs;
+ public final int mDuration;
+ public final int mEUt;
+
+ public GasSpargingRecipe(FluidStack aSpargeGas, FluidStack aSpentFuel, FluidStack aSpargedFuel,
+ FluidStack[] aOutputs, int[] aMaxOutputQuantity) {
+ mInputGas = aSpargeGas;
+ mInputSpentFuel = aSpentFuel;
+ mOutputSpargedFuel = aSpargedFuel;
+ mFluidInputs = new FluidStack[] { mInputGas, mInputSpentFuel };
+ aOutputs = ArrayUtils.insertElementAtIndex(aOutputs, 0, aSpargeGas);
+ aOutputs = ArrayUtils.insertElementAtIndex(aOutputs, 1, aSpargedFuel);
+ mFluidOutputs = aOutputs;
+ mMaxOutputQuantity = aMaxOutputQuantity;
+ mDuration = 500;
+ mEUt = MaterialUtils.getVoltageForTier(5);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof GasSpargingRecipe i) {
+ if (this.mInputGas.equals(i.mInputGas) && this.mInputSpentFuel.equals(i.mInputSpentFuel)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public int getMaxOutput(int aIndex) {
+ if (aIndex == 0) {
+ return mInputGas.amount * 100;
+ } else if (aIndex == 1) {
+ return mOutputSpargedFuel.amount * 100;
+ }
+ aIndex -= 2;
+ if ((aIndex < 0) || (aIndex >= this.mMaxOutputQuantity.length)) {
+ return 10000;
+ }
+ return this.mMaxOutputQuantity[aIndex];
+ }
+
+ public boolean isValid() {
+ if (mInputGas == null || mInputGas.amount <= 0
+ || mInputSpentFuel == null
+ || mInputSpentFuel.amount <= 0
+ || mFluidOutputs == null
+ || mFluidOutputs.length < 1
+ || mMaxOutputQuantity == null
+ || mMaxOutputQuantity.length < 1
+ || mFluidOutputs.length != mMaxOutputQuantity.length) {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean containsInputs(FluidStack aSpargeGas, FluidStack aSpentFuel) {
+ if (aSpargeGas != null && aSpargeGas.getFluid()
+ .equals(this.mInputGas.getFluid())) {
+ if (aSpentFuel != null && aSpentFuel.getFluid()
+ .equals(this.mInputSpentFuel.getFluid())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int compareTo(GasSpargingRecipe o) {
+ if (o.mFluidOutputs.length > this.mFluidOutputs.length) {
+ return 1;
+ } else if (o.mFluidOutputs.length == this.mFluidOutputs.length) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+
+ public String[] getRecipeInfo() {
+ AutoMap<String> result = new AutoMap<>();
+ result.put("Input " + ItemUtils.getArrayStackNames(mFluidInputs));
+ result.put("Output " + ItemUtils.getArrayStackNames(mFluidOutputs));
+ result.put("Duration: " + mDuration);
+ result.put("EU/t: " + mEUt);
+ String s[] = result.toArray();
+ return s;
+ }
+}
diff --git a/gtpp/src/main/java/gregtech/api/util/GasSpargingRecipeMap.java b/gtpp/src/main/java/gregtech/api/util/GasSpargingRecipeMap.java
new file mode 100644
index 0000000000..6dcc7721e0
--- /dev/null
+++ b/gtpp/src/main/java/gregtech/api/util/GasSpargingRecipeMap.java
@@ -0,0 +1,45 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+
+public class GasSpargingRecipeMap extends AutoMap<GasSpargingRecipe> {
+
+ public static final AutoMap<GasSpargingRecipe> mRecipes = new AutoMap<>();
+ public static final String mUnlocalizedName = "gtpp.recipe.lftr.sparging";
+ public static final String mNEIName = mUnlocalizedName;
+ public static final String mNEIDisplayName = "LFTR Gas Sparging";
+ public static final String mNEIGUIPath = GregTech.getResourcePath("textures", "gui/basicmachines/FissionFuel.png");
+
+ public static boolean addRecipe(FluidStack aSpargeGas, FluidStack aSpentFuel, FluidStack aSpargedFuel,
+ FluidStack[] aOutputs, int[] aMaxOutputs) {
+ if (aSpargeGas == null || aSpargeGas.amount <= 0
+ || aSpentFuel == null
+ || aSpentFuel.amount <= 0
+ || aSpargedFuel == null
+ || aSpargedFuel.amount <= 0
+ || aOutputs == null
+ || aOutputs.length < 1
+ || aMaxOutputs == null
+ || aMaxOutputs.length < 1
+ || aOutputs.length != aMaxOutputs.length) {
+ return false;
+ }
+ int aMapSize = mRecipes.size();
+ GasSpargingRecipe aRecipe = new GasSpargingRecipe(aSpargeGas, aSpentFuel, aSpargedFuel, aOutputs, aMaxOutputs);
+ mRecipes.put(aRecipe);
+ return mRecipes.size() > aMapSize;
+ }
+
+ public static GasSpargingRecipe findRecipe(FluidStack aSpargeGas, FluidStack aSpentFuel) {
+ for (GasSpargingRecipe aRecipe : mRecipes) {
+ if (aRecipe.containsInputs(aSpargeGas, aSpentFuel)) {
+ return aRecipe;
+ }
+ }
+ return null;
+ }
+}
diff --git a/gtpp/src/main/java/gregtech/api/util/HotFuel.java b/gtpp/src/main/java/gregtech/api/util/HotFuel.java
new file mode 100644
index 0000000000..6054a57b84
--- /dev/null
+++ b/gtpp/src/main/java/gregtech/api/util/HotFuel.java
@@ -0,0 +1,40 @@
+package gregtech.api.util;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+
+public class HotFuel {
+
+ public static void addNewHotFuel(FluidStack aInput1, FluidStack aOutput1, ItemStack[] outputItems, int[] chances,
+ int aSpecialValue) {
+ GTPPRecipeMaps.thermalBoilerRecipes.addRecipe(
+ true,
+ null,
+ outputItems,
+ null,
+ chances,
+ new FluidStack[] { aInput1 },
+ new FluidStack[] { aOutput1 },
+ 1, // 1 Tick
+ 0, // No Eu produced
+ aSpecialValue // Magic Number
+ );
+ }
+
+ public static void addNewHotFuel(FluidStack aInput1, FluidStack aOutput1, FluidStack aOutput2, int aSpecialValue) {
+ GTPPRecipeMaps.thermalBoilerRecipes.addRecipe(
+ false,
+ null,
+ null,
+ null,
+ null,
+ new FluidStack[] { aInput1 },
+ new FluidStack[] { aOutput1, aOutput2 },
+ 20, // 1 Second
+ 0, // No Eu produced
+ aSpecialValue // Magic Number
+ );
+ }
+}
diff --git a/gtpp/src/main/java/gregtech/api/util/SemiFluidFuelHandler.java b/gtpp/src/main/java/gregtech/api/util/SemiFluidFuelHandler.java
new file mode 100644
index 0000000000..e3baa9ac90
--- /dev/null
+++ b/gtpp/src/main/java/gregtech/api/util/SemiFluidFuelHandler.java
@@ -0,0 +1,136 @@
+package gregtech.api.util;
+
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.semiFluidFuels;
+
+import java.util.HashMap;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.recipe.RecipeMaps;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public class SemiFluidFuelHandler {
+
+ public static boolean addSemiFluidFuel(ItemStack aFuelItem, int aFuelValue) {
+ FluidStack p = FluidContainerRegistry.getFluidForFilledItem(aFuelItem);
+ if (p != null && aFuelValue > 0) {
+ return addSemiFluidFuel(p, aFuelValue);
+ } else {
+ Logger.INFO("Fuel value for " + aFuelItem.getDisplayName() + " is <= 0, ignoring.");
+ }
+ return false;
+ }
+
+ public static boolean addSemiFluidFuel(FluidStack aFuel, int aFuelValue) {
+ FluidStack p = aFuel;
+ if (p != null && aFuelValue > 0) {
+ GT_Recipe aRecipe = new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ new FluidStack[] { p },
+ null,
+ 0,
+ 0,
+ aFuelValue);
+ if (aRecipe.mSpecialValue > 0) {
+ Logger.INFO(
+ "Added " + aRecipe.mFluidInputs[0].getLocalizedName()
+ + " to the Semi-Fluid Generator fuel map. Fuel Produces "
+ + (aRecipe.mSpecialValue * 1000)
+ + "EU per 1000L.");
+ semiFluidFuels.add(aRecipe);
+ return true;
+ }
+ } else {
+ Logger.INFO("Fuel value for " + p != null ? p.getLocalizedName() : "NULL Fluid" + " is <= 0, ignoring.");
+ }
+ return false;
+ }
+
+ public static boolean generateFuels() {
+ final FluidStack aCreosote = FluidUtils.getFluidStack("creosote", 1000);
+ final FluidStack aHeavyFuel = FluidUtils.getFluidStack("liquid_heavy_fuel", 1000);
+ final FluidStack aHeavyOil = FluidUtils.getFluidStack("liquid_heavy_oil", 1000);
+ final HashMap<Integer, Pair<FluidStack, Integer>> aFoundFluidsFromItems = new HashMap<>();
+ // Find Fluids From items
+ for (final GT_Recipe r : RecipeMaps.denseLiquidFuels.getAllRecipes()) {
+
+ GT_Recipe g = r.copy();
+
+ if (g != null && g.mEnabled && g.mInputs.length > 0 && g.mInputs[0] != null) {
+ for (ItemStack i : g.mInputs) {
+ FluidStack f = FluidContainerRegistry.getFluidForFilledItem(i);
+ if (f != null) {
+ Pair<FluidStack, Integer> aData = new Pair<>(f, g.mSpecialValue);
+ aFoundFluidsFromItems.put(aData.hashCode(), aData);
+ }
+ }
+ } else if (g != null && g.mEnabled && g.mFluidInputs.length > 0 && g.mFluidInputs[0] != null) {
+ boolean aContainsCreosote = false;
+ for (FluidStack f : g.mFluidInputs) {
+ if (f.isFluidEqual(aCreosote)) {
+ aContainsCreosote = true;
+ }
+ }
+ g.mSpecialValue *= aContainsCreosote ? 6 : 3;
+ Logger.INFO(
+ "Added " + g.mFluidInputs[0].getLocalizedName()
+ + " to the Semi-Fluid Generator fuel map. Fuel Produces "
+ + g.mSpecialValue
+ + "EU per 1000L.");
+ semiFluidFuels.add(g);
+ }
+ }
+ for (Pair<FluidStack, Integer> p : aFoundFluidsFromItems.values()) {
+ if (p != null) {
+ int aFuelValue = p.getValue();
+ if (p.getKey()
+ .isFluidEqual(aCreosote)) {
+ aFuelValue *= 6;
+ } else if (p.getKey()
+ .isFluidEqual(aHeavyFuel)
+ || p.getKey()
+ .isFluidEqual(aHeavyOil)) {
+ aFuelValue *= 1.5;
+ } else {
+ aFuelValue *= 2;
+ }
+
+ if (aFuelValue <= (128 * 3)) {
+ GT_Recipe aRecipe = new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ new FluidStack[] { p.getKey() },
+ null,
+ 0,
+ 0,
+ aFuelValue);
+ if (aRecipe.mSpecialValue > 0) {
+ Logger.INFO(
+ "Added " + aRecipe.mFluidInputs[0].getLocalizedName()
+ + " to the Semi-Fluid Generator fuel map. Fuel Produces "
+ + (aRecipe.mSpecialValue * 1000)
+ + "EU per 1000L.");
+ semiFluidFuels.add(aRecipe);
+ }
+ } else {
+ Logger.INFO(
+ "Boosted Fuel value for " + p.getKey()
+ .getLocalizedName() + " exceeds 512k, ignoring.");
+ }
+ }
+ }
+ return !semiFluidFuels.getAllRecipes()
+ .isEmpty();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/GTplusplus.java b/gtpp/src/main/java/gtPlusPlus/GTplusplus.java
new file mode 100644
index 0000000000..b024e0e88a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/GTplusplus.java
@@ -0,0 +1,395 @@
+package gtPlusPlus;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.Names;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableCustomCapes;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.HashMap;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.launchwrapper.Launch;
+
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.Mod.EventHandler;
+import cpw.mods.fml.common.SidedProxy;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import cpw.mods.fml.common.event.FMLMissingMappingsEvent;
+import cpw.mods.fml.common.event.FMLMissingMappingsEvent.MissingMapping;
+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.event.FMLServerStoppingEvent;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Materials;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.FishPondFakeRecipe;
+import gregtech.api.util.SemiFluidFuelHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.commands.CommandEnableDebugWhileRunning;
+import gtPlusPlus.core.commands.CommandMath;
+import gtPlusPlus.core.common.CommonProxy;
+import gtPlusPlus.core.config.ConfigHandler;
+import gtPlusPlus.core.handler.BookHandler;
+import gtPlusPlus.core.handler.PacketHandler;
+import gtPlusPlus.core.handler.Recipes.RegistrationHandler;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.data.LocaleUtils;
+import gtPlusPlus.plugin.manager.Core_Manager;
+import gtPlusPlus.xmod.gregtech.common.Meta_GT_Proxy;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtTools;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_BlastSmelterGT_GTNH;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_MultisUsingFluidInsteadOfCells;
+import gtPlusPlus.xmod.thaumcraft.commands.CommandDumpAspects;
+
+@Mod(
+ modid = Names.G_T_PLUS_PLUS,
+ name = CORE.name,
+ version = CORE.VERSION,
+ dependencies = "required-after:Forge;" + " after:TConstruct;"
+ + " after:dreamcraft;"
+ + " after:IC2;"
+ + " required-after:gregtech;"
+ + " after:Forestry;"
+ + " after:MagicBees;"
+ + " after:CoFHCore;"
+ + " after:Railcraft;"
+ + " after:CompactWindmills;"
+ + " after:ForbiddenMagic;"
+ + " after:ExtraUtilities;"
+ + " after:Thaumcraft;"
+ + " after:EnderIO;"
+ + " after:tectech;"
+ + " after:OpenBlocks;"
+ + " after:IC2NuclearControl;"
+ + " after:TGregworks;"
+ + " after:StevesCarts;"
+ + " required-after:gtnhlib@[0.0.10,);")
+public class GTplusplus implements ActionListener {
+
+ public enum INIT_PHASE {
+
+ SUPER(null),
+ PRE_INIT(SUPER),
+ INIT(PRE_INIT),
+ POST_INIT(INIT),
+ SERVER_START(POST_INIT),
+ STARTED(SERVER_START);
+
+ private boolean mIsPhaseActive = false;
+ private final INIT_PHASE mPrev;
+
+ INIT_PHASE(INIT_PHASE aPreviousPhase) {
+ mPrev = aPreviousPhase;
+ }
+
+ public final synchronized boolean isPhaseActive() {
+ return mIsPhaseActive;
+ }
+
+ public final synchronized void setPhaseActive(boolean aIsPhaseActive) {
+ if (mPrev != null && mPrev.isPhaseActive()) {
+ mPrev.setPhaseActive(false);
+ }
+ mIsPhaseActive = aIsPhaseActive;
+ if (CURRENT_LOAD_PHASE != this) {
+ CURRENT_LOAD_PHASE = this;
+ }
+ }
+ }
+
+ public static INIT_PHASE CURRENT_LOAD_PHASE = INIT_PHASE.SUPER;
+
+ // Mod Instance
+ @Mod.Instance(Names.G_T_PLUS_PLUS)
+ public static GTplusplus instance;
+
+ // GT++ Proxy Instances
+ @SidedProxy(clientSide = "gtPlusPlus.core.proxy.ClientProxy", serverSide = "gtPlusPlus.core.proxy.ServerProxy")
+ public static CommonProxy proxy;
+
+ // Loads Textures
+ @SideOnly(value = Side.CLIENT)
+ public static void loadTextures() {
+ Logger.INFO("Loading some textures on the client.");
+ // Tools
+ Logger.WARNING(
+ "Processing texture: " + TexturesGtTools.ANGLE_GRINDER.getTextureFile()
+ .getResourcePath());
+ Logger.WARNING(
+ "Processing texture: " + TexturesGtTools.ELECTRIC_SNIPS.getTextureFile()
+ .getResourcePath());
+
+ // Blocks
+ Logger.WARNING(
+ "Processing texture: " + TexturesGtBlock.Casing_Machine_Dimensional.getTextureFile()
+ .getResourcePath());
+ }
+
+ public GTplusplus() {
+ super();
+ INIT_PHASE.SUPER.setPhaseActive(true);
+ }
+
+ // Pre-Init
+ @Mod.EventHandler
+ public void preInit(final FMLPreInitializationEvent event) {
+ INIT_PHASE.PRE_INIT.setPhaseActive(true);
+ // Load all class objects within the plugin package.
+ Core_Manager.veryEarlyInit();
+ PacketHandler.init();
+
+ if (!Utils.isServer()) {
+ enableCustomCapes = true;
+ }
+
+ // Give this a go mate.
+ setupMaterialBlacklist();
+
+ // Handle GT++ Config
+ ConfigHandler.handleConfigFile(event);
+
+ // Check for Dev
+ CORE.DEVENV = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment");
+
+ proxy.preInit(event);
+ Logger.INFO("Setting up our own GT_Proxy.");
+ Meta_GT_Proxy.preInit();
+ Core_Manager.preInit();
+ }
+
+ // Init
+ @Mod.EventHandler
+ public void init(final FMLInitializationEvent event) {
+ INIT_PHASE.INIT.setPhaseActive(true);
+ proxy.init(event);
+ proxy.registerNetworkStuff();
+ Meta_GT_Proxy.init();
+ Core_Manager.init();
+ // Used by foreign players to generate .lang files for translation.
+ if (CORE.ConfigSwitches.dumpItemAndBlockData) {
+ LocaleUtils.generateFakeLocaleFile();
+ }
+ }
+
+ // Post-Init
+ @Mod.EventHandler
+ public void postInit(final FMLPostInitializationEvent event) {
+ INIT_PHASE.POST_INIT.setPhaseActive(true);
+ proxy.postInit(event);
+ BookHandler.runLater();
+ Meta_GT_Proxy.postInit();
+ Core_Manager.postInit();
+
+ Logger.INFO("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
+ Logger.INFO(
+ "| Recipes succesfully Loaded: " + RegistrationHandler.recipesSuccess
+ + " | Failed: "
+ + RegistrationHandler.recipesFailed
+ + " |");
+ Logger.INFO("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
+ Logger.INFO("Finally, we are finished. Have some cripsy bacon as a reward.");
+
+ // Log free GT++ Meta IDs
+ if (CORE.DEVENV) {
+ // 750 - 999 are reserved for Alkalus.
+ for (int i = 750; i < 1000; i++) {
+ if (gregtech.api.GregTech_API.METATILEENTITIES[i] == null) {
+ Logger.INFO("MetaID " + i + " is free.");
+ }
+ }
+ // 30000 - 31999 are reserved for Alkalus.
+ for (int i = 30000; i < 32000; i++) {
+ if (gregtech.api.GregTech_API.METATILEENTITIES[i] == null) {
+ Logger.INFO("MetaID " + i + " is free.");
+ }
+ }
+ }
+ }
+
+ @EventHandler
+ public synchronized void serverStarting(final FMLServerStartingEvent event) {
+ INIT_PHASE.SERVER_START.setPhaseActive(true);
+ event.registerServerCommand(new CommandMath());
+ event.registerServerCommand(new CommandEnableDebugWhileRunning());
+ if (Thaumcraft.isModLoaded()) {
+ event.registerServerCommand(new CommandDumpAspects());
+ }
+ Core_Manager.serverStart();
+ INIT_PHASE.STARTED.setPhaseActive(true);
+ }
+
+ @Mod.EventHandler
+ public synchronized void serverStopping(final FMLServerStoppingEvent event) {
+ Core_Manager.serverStop();
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent arg0) {}
+
+ /**
+ * This {@link EventHandler} is called after the {@link FMLPostInitializationEvent} stages of all loaded mods
+ * executes successfully. {@link #onLoadComplete(FMLLoadCompleteEvent)} exists to inject recipe generation after
+ * Gregtech and all other mods are entirely loaded and initialized.
+ *
+ * @param event - The {@link EventHandler} object passed through from FML to {@link #GTplusplus()}'s
+ * {@link #instance}.
+ */
+ @Mod.EventHandler
+ public void onLoadComplete(FMLLoadCompleteEvent event) {
+ proxy.onLoadComplete(event);
+ generateGregtechRecipeMaps();
+ }
+
+ protected void generateGregtechRecipeMaps() {
+
+ int[] mInvalidCount = new int[] { 0, 0, 0, 0, 0, 0, 0 };
+
+ RecipeGen_BlastSmelterGT_GTNH.generateGTNHBlastSmelterRecipesFromEBFList();
+ FishPondFakeRecipe.generateFishPondRecipes();
+ SemiFluidFuelHandler.generateFuels();
+
+ mInvalidCount[0] = RecipeGen_MultisUsingFluidInsteadOfCells
+ .generateRecipesNotUsingCells(RecipeMaps.centrifugeRecipes, GTPPRecipeMaps.centrifugeNonCellRecipes);
+ mInvalidCount[1] = RecipeGen_MultisUsingFluidInsteadOfCells
+ .generateRecipesNotUsingCells(RecipeMaps.electrolyzerRecipes, GTPPRecipeMaps.electrolyzerNonCellRecipes);
+ mInvalidCount[2] = RecipeGen_MultisUsingFluidInsteadOfCells
+ .generateRecipesNotUsingCells(RecipeMaps.vacuumFreezerRecipes, GTPPRecipeMaps.advancedFreezerRecipes);
+ mInvalidCount[3] = RecipeGen_MultisUsingFluidInsteadOfCells
+ .generateRecipesNotUsingCells(RecipeMaps.mixerRecipes, GTPPRecipeMaps.mixerNonCellRecipes);
+ mInvalidCount[4] = RecipeGen_MultisUsingFluidInsteadOfCells.generateRecipesNotUsingCells(
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ GTPPRecipeMaps.chemicalDehydratorNonCellRecipes);
+ mInvalidCount[5] = RecipeGen_MultisUsingFluidInsteadOfCells.generateRecipesNotUsingCells(
+ GTPPRecipeMaps.coldTrapRecipes,
+ GTPPRecipeMaps.nuclearSaltProcessingPlantRecipes);
+ mInvalidCount[6] = RecipeGen_MultisUsingFluidInsteadOfCells.generateRecipesNotUsingCells(
+ GTPPRecipeMaps.reactorProcessingUnitRecipes,
+ GTPPRecipeMaps.nuclearSaltProcessingPlantRecipes);
+ }
+
+ private static void setupMaterialBlacklist() {
+ Material.invalidMaterials.put(Materials._NULL);
+ Material.invalidMaterials.put(Materials.Clay);
+ Material.invalidMaterials.put(Materials.Phosphorus);
+ Material.invalidMaterials.put(Materials.Steel);
+ Material.invalidMaterials.put(Materials.Bronze);
+ Material.invalidMaterials.put(Materials.Hydrogen);
+ // Infused TC stuff
+ Material.invalidMaterials.put(Materials.InfusedAir);
+ Material.invalidMaterials.put(Materials.InfusedEarth);
+ Material.invalidMaterials.put(Materials.InfusedFire);
+ Material.invalidMaterials.put(Materials.InfusedWater);
+ // EIO Materials
+ Material.invalidMaterials.put(Materials.SoulSand);
+ Material.invalidMaterials.put(Materials.EnderPearl);
+ Material.invalidMaterials.put(Materials.EnderEye);
+ Material.invalidMaterials.put(Materials.Redstone);
+ Material.invalidMaterials.put(Materials.Glowstone);
+ Material.invalidMaterials.put(Materials.Soularium);
+ Material.invalidMaterials.put(Materials.PhasedIron);
+
+ }
+
+ private static final HashMap<String, Item> sMissingItemMappings = new HashMap<>();
+ private static final HashMap<String, Block> sMissingBlockMappings = new HashMap<>();
+
+ private static void processMissingMappings() {
+ sMissingItemMappings.put("miscutils:Ammonium", GameRegistry.findItem(GTPlusPlus.ID, "itemCellAmmonium"));
+ sMissingItemMappings.put("miscutils:Hydroxide", GameRegistry.findItem(GTPlusPlus.ID, "itemCellHydroxide"));
+ sMissingItemMappings.put(
+ "miscutils:BerylliumHydroxide",
+ GameRegistry.findItem(GTPlusPlus.ID, "itemCellmiscutils:BerylliumHydroxide"));
+ sMissingItemMappings.put("miscutils:Bromine", GameRegistry.findItem(GTPlusPlus.ID, "itemCellBromine"));
+ sMissingItemMappings.put("miscutils:Krypton", GameRegistry.findItem(GTPlusPlus.ID, "itemCellKrypton"));
+ sMissingItemMappings.put(
+ "miscutils:itemCellZirconiumTetrafluoride",
+ GameRegistry.findItem(GTPlusPlus.ID, "ZirconiumTetrafluoride"));
+ sMissingItemMappings
+ .put("miscutils:Li2BeF4", GameRegistry.findItem(GTPlusPlus.ID, "itemCellLithiumTetrafluoroberyllate"));
+
+ // Cryolite
+ sMissingBlockMappings.put("miscutils:oreCryolite", GameRegistry.findBlock(GTPlusPlus.ID, "oreCryoliteF"));
+ sMissingItemMappings
+ .put("miscutils:itemDustTinyCryolite", GameRegistry.findItem(GTPlusPlus.ID, "itemDustTinyCryoliteF"));
+ sMissingItemMappings
+ .put("miscutils:itemDustSmallCryolite", GameRegistry.findItem(GTPlusPlus.ID, "itemDustSmallCryoliteF"));
+ sMissingItemMappings
+ .put("miscutils:itemDustCryolite", GameRegistry.findItem(GTPlusPlus.ID, "itemDustCryoliteF"));
+ sMissingItemMappings
+ .put("miscutils:dustPureCryolite", GameRegistry.findItem(GTPlusPlus.ID, "dustPureCryoliteF"));
+ sMissingItemMappings
+ .put("miscutils:dustImpureCryolite", GameRegistry.findItem(GTPlusPlus.ID, "dustImpureCryoliteF"));
+ sMissingItemMappings.put("miscutils:crushedCryolite", GameRegistry.findItem(GTPlusPlus.ID, "crushedCryoliteF"));
+ sMissingItemMappings
+ .put("miscutils:crushedPurifiedCryolite", GameRegistry.findItem(GTPlusPlus.ID, "crushedPurifiedCryoliteF"));
+ sMissingItemMappings.put(
+ "miscutils:crushedCentrifugedCryolite",
+ GameRegistry.findItem(GTPlusPlus.ID, "crushedCentrifugedCryoliteF"));
+ sMissingItemMappings.put("miscutils:oreCryolite", GameRegistry.findItem(GTPlusPlus.ID, "oreCryoliteF"));
+
+ // Fluorite
+ sMissingBlockMappings.put("miscutils:oreFluorite", GameRegistry.findBlock(GTPlusPlus.ID, "oreFluoriteF"));
+ sMissingItemMappings
+ .put("miscutils:itemDustTinyFluorite", GameRegistry.findItem(GTPlusPlus.ID, "itemDustTinyFluoriteF"));
+ sMissingItemMappings
+ .put("miscutils:itemDustSmallFluorite", GameRegistry.findItem(GTPlusPlus.ID, "itemDustSmallFluoriteF"));
+ sMissingItemMappings
+ .put("miscutils:itemDustFluorite", GameRegistry.findItem(GTPlusPlus.ID, "itemDustFluoriteF"));
+ sMissingItemMappings
+ .put("miscutils:dustPureFluorite", GameRegistry.findItem(GTPlusPlus.ID, "dustPureFluoriteF"));
+ sMissingItemMappings
+ .put("miscutils:dustImpureFluorite", GameRegistry.findItem(GTPlusPlus.ID, "dustImpureFluoriteF"));
+ sMissingItemMappings.put("miscutils:crushedFluorite", GameRegistry.findItem(GTPlusPlus.ID, "crushedFluoriteF"));
+ sMissingItemMappings
+ .put("miscutils:crushedPurifiedFluorite", GameRegistry.findItem(GTPlusPlus.ID, "crushedPurifiedFluoriteF"));
+ sMissingItemMappings.put(
+ "miscutils:crushedCentrifugedFluorite",
+ GameRegistry.findItem(GTPlusPlus.ID, "crushedCentrifugedFluoriteF"));
+ sMissingItemMappings.put("miscutils:oreFluorite", GameRegistry.findItem(GTPlusPlus.ID, "oreFluoriteF"));
+ }
+
+ @Mod.EventHandler
+ public void missingMapping(FMLMissingMappingsEvent event) {
+ processMissingMappings();
+ for (MissingMapping mapping : event.getAll()) {
+ if (mapping.name.startsWith("Australia:")) {
+ mapping.ignore();
+ continue;
+ }
+ if (mapping.type == GameRegistry.Type.ITEM) {
+ Item aReplacement = sMissingItemMappings.get(mapping.name);
+ if (aReplacement != null) {
+ remap(aReplacement, mapping);
+ }
+
+ } else if (mapping.type == GameRegistry.Type.BLOCK) {
+ Block aReplacement = sMissingBlockMappings.get(mapping.name);
+ if (aReplacement != null) {
+ remap(aReplacement, mapping);
+ }
+
+ }
+ }
+ }
+
+ private static void remap(Item item, FMLMissingMappingsEvent.MissingMapping mapping) {
+ mapping.remap(item);
+ Logger.INFO("Remapping item " + mapping.name + " to " + GTPlusPlus.ID + ":" + item.getUnlocalizedName());
+ }
+
+ private static void remap(Block block, FMLMissingMappingsEvent.MissingMapping mapping) {
+ mapping.remap(block);
+ Logger.INFO("Remapping block " + mapping.name + " to " + GTPlusPlus.ID + ":" + block.getUnlocalizedName());
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/interfaces/ILazyCoverable.java b/gtpp/src/main/java/gtPlusPlus/api/interfaces/ILazyCoverable.java
new file mode 100644
index 0000000000..d2a1e34f99
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/interfaces/ILazyCoverable.java
@@ -0,0 +1,139 @@
+package gtPlusPlus.api.interfaces;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public interface ILazyCoverable extends ICoverable {
+
+ @Override
+ default byte getColorization() {
+ return 0;
+ }
+
+ @Override
+ default byte setColorization(byte arg0) {
+ return 0;
+ }
+
+ @Override
+ default byte getInputRedstoneSignal(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ default byte getStrongestRedstone() {
+ return 0;
+ }
+
+ @Override
+ default boolean getRedstone() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ default boolean getRedstone(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ default boolean isUniversalEnergyStored(long arg0) {
+ return false;
+ }
+
+ @Override
+ default long getUniversalEnergyStored() {
+ return 0;
+ }
+
+ @Override
+ default long getUniversalEnergyCapacity() {
+ return 0;
+ }
+
+ @Override
+ default long getStoredSteam() {
+ return 0;
+ }
+
+ @Override
+ default long getSteamCapacity() {
+ return 0;
+ }
+
+ @Override
+ default boolean increaseStoredSteam(long arg0, boolean arg2) {
+ return false;
+ }
+
+ @Override
+ default byte getOutputRedstoneSignal(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ default void setOutputRedstoneSignal(ForgeDirection side, byte strength) {}
+
+ @Override
+ default byte getStrongOutputRedstoneSignal(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ default void setStrongOutputRedstoneSignal(ForgeDirection side, byte arg1) {}
+
+ @Override
+ default byte getComparatorValue(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ default IGregTechTileEntity getIGregTechTileEntity(int arg0, int arg1, int arg2) {
+ return null;
+ }
+
+ @Override
+ default IGregTechTileEntity getIGregTechTileEntityOffset(int arg0, int arg1, int arg2) {
+ return null;
+ }
+
+ @Override
+ default IGregTechTileEntity getIGregTechTileEntityAtSide(ForgeDirection side) {
+ return null;
+ }
+
+ @Override
+ default IGregTechTileEntity getIGregTechTileEntityAtSideAndDistance(ForgeDirection side, int arg1) {
+ return null;
+ }
+
+ @Override
+ default byte getMetaID(int arg0, int arg1, int arg2) {
+ return 0;
+ }
+
+ @Override
+ default byte getMetaIDOffset(int arg0, int arg1, int arg2) {
+ return 0;
+ }
+
+ @Override
+ default byte getMetaIDAtSide(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ default byte getMetaIDAtSideAndDistance(ForgeDirection side, int arg1) {
+ return 0;
+ }
+
+ @Override
+ default boolean isDead() {
+ return false;
+ }
+
+ @Override
+ default void setLightValue(byte arg0) {}
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/interfaces/IPlugin.java b/gtpp/src/main/java/gtPlusPlus/api/interfaces/IPlugin.java
new file mode 100644
index 0000000000..d70a19925e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/interfaces/IPlugin.java
@@ -0,0 +1,41 @@
+package gtPlusPlus.api.interfaces;
+
+import gtPlusPlus.api.objects.Logger;
+
+public interface IPlugin {
+
+ /**
+ * @return A {@link String} object which returns the {@link IPlugin}'s name.
+ */
+ public String getPluginName();
+
+ /**
+ * @return A {@link String} object which returns the {@link IPlugin}'s short name. This String should only contain 4
+ * Characters.
+ */
+ public String getPluginAbbreviation();
+
+ /**
+ * @param message - A {@link String} object which holds a message to be logged to console.
+ */
+ default void log(String message) {
+ Logger.INFO("[" + getPluginAbbreviation() + "] " + message);
+ }
+
+ /**
+ * @param message - A {@link String} object which holds a warning/error message to be logged to console.
+ */
+ default void logDebug(String message) {
+ Logger.WARNING("[" + getPluginAbbreviation() + "] " + message);
+ }
+
+ public boolean preInit();
+
+ public boolean init();
+
+ public boolean postInit();
+
+ public boolean serverStart();
+
+ public boolean serverStop();
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/interfaces/ITexturedBlock.java b/gtpp/src/main/java/gtPlusPlus/api/interfaces/ITexturedBlock.java
new file mode 100644
index 0000000000..a6179ce2bf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/interfaces/ITexturedBlock.java
@@ -0,0 +1,15 @@
+package gtPlusPlus.api.interfaces;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ITexturedTileEntity;
+
+public interface ITexturedBlock extends ITexturedTileEntity {
+
+ ITexture[] getTexture(ForgeDirection side);
+
+ @Override
+ ITexture[] getTexture(Block block, ForgeDirection side);
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/interfaces/ITileTooltip.java b/gtpp/src/main/java/gtPlusPlus/api/interfaces/ITileTooltip.java
new file mode 100644
index 0000000000..f059ef8a5f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/interfaces/ITileTooltip.java
@@ -0,0 +1,6 @@
+package gtPlusPlus.api.interfaces;
+
+public interface ITileTooltip {
+
+ int getTooltipID();
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/interfaces/RunnableWithInfo.java b/gtpp/src/main/java/gtPlusPlus/api/interfaces/RunnableWithInfo.java
new file mode 100644
index 0000000000..f00287404b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/interfaces/RunnableWithInfo.java
@@ -0,0 +1,7 @@
+package gtPlusPlus.api.interfaces;
+
+public interface RunnableWithInfo<V> extends Runnable {
+
+ V getInfoData();
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/Logger.java b/gtpp/src/main/java/gtPlusPlus/api/objects/Logger.java
new file mode 100644
index 0000000000..0178bb141a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/Logger.java
@@ -0,0 +1,162 @@
+package gtPlusPlus.api.objects;
+
+import org.apache.logging.log4j.LogManager;
+
+import cpw.mods.fml.common.FMLLog;
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.preloader.asm.AsmConfig;
+
+public class Logger {
+
+ public Logger() {}
+
+ // Logging Functions
+ public static final org.apache.logging.log4j.Logger modLogger = Logger.makeLogger();
+
+ // Generate GT++ Logger
+ public static org.apache.logging.log4j.Logger makeLogger() {
+ final org.apache.logging.log4j.Logger gtPlusPlusLogger = LogManager.getLogger("GT++");
+ return gtPlusPlusLogger;
+ }
+
+ private static final boolean enabled = !AsmConfig.disableAllLogging;
+
+ public static final org.apache.logging.log4j.Logger getLogger() {
+ return modLogger;
+ }
+
+ // Non-Dev Comments
+ public static void INFO(final String s) {
+ if (enabled) {
+ modLogger.info(s);
+ }
+ }
+
+ // Non-Dev Comments
+ public static void MACHINE_INFO(String s, Object... args) {
+ if (enabled) {
+ boolean localPlayer = CORE_Preloader.DEV_ENVIRONMENT;
+ if (CORE.ConfigSwitches.MACHINE_INFO || localPlayer) {
+ final String name1 = gtPlusPlus.core.util.reflect.ReflectionUtils.getMethodName(2);
+ modLogger.info("Machine Info: " + s + " | " + name1, args);
+ }
+ }
+ }
+
+ // Developer Comments
+ public static void WARNING(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEBUG_MODE) {
+ modLogger.warn(s);
+ }
+ }
+ }
+
+ // Errors
+ public static void ERROR(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEBUG_MODE) {
+ modLogger.fatal(s);
+ }
+ }
+ }
+
+ // Developer Logger
+ public static void SPECIFIC_WARNING(final String whatToLog, final String msg, final int line) {
+ if (enabled) {
+ // if (!CORE_Preloader.DEBUG_MODE){
+ FMLLog.warning("GT++ |" + line + "| " + whatToLog + " | " + msg);
+ // }
+ }
+ }
+
+ // ASM Comments
+ public static void LOG_ASM(final String s) {
+ if (enabled) {
+ FMLRelaunchLog.info("[Special ASM Logging] ", s);
+ }
+ }
+
+ /**
+ * Special Loggers
+ */
+
+ /**
+ * Special Logger for Bee related content
+ */
+ public static void BEES(final String s) {
+ modLogger.info("[Bees] " + s);
+ }
+
+ /**
+ * Special Logger for Debugging Bee related content
+ */
+ public static void DEBUG_BEES(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEV_ENVIRONMENT || CORE_Preloader.DEBUG_MODE) {
+ modLogger.info("[Debug][Bees] " + s);
+ }
+ }
+ }
+
+ /**
+ * Special Logger for Materials related content
+ */
+ public static void MATERIALS(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEV_ENVIRONMENT || CORE_Preloader.DEBUG_MODE) {
+ modLogger.info("[Materials] " + s);
+ }
+ }
+ }
+
+ /**
+ * Special Logger for Debugging Materials related content
+ */
+ public static void DEBUG_MATERIALS(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEV_ENVIRONMENT || CORE_Preloader.DEBUG_MODE) {
+ modLogger.info("[Debug][Materials] " + s);
+ }
+ }
+ }
+
+ /**
+ * Special Logger for Reflection related content
+ */
+ public static void REFLECTION(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEV_ENVIRONMENT || CORE_Preloader.DEBUG_MODE) {
+ modLogger.info("[Reflection] " + s);
+ }
+ }
+ }
+
+ /**
+ * Special Logger for Darkworld related content
+ */
+ public static void WORLD(final String s) {
+ if (enabled) {
+ if (CORE_Preloader.DEV_ENVIRONMENT || CORE_Preloader.DEBUG_MODE) {
+ modLogger.info("[WorldGen] " + s);
+ }
+ }
+ }
+
+ public static void RECIPE(String string) {
+ if (enabled) {
+ if (
+ /* CORE_Preloader.DEV_ENVIRONMENT || */ CORE_Preloader.DEBUG_MODE) {
+ modLogger.info("[Recipe] " + string);
+ }
+ }
+ }
+
+ public static void SPACE(final String s) {
+ if (enabled) {
+ modLogger.info("[Space] " + s);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/data/AutoMap.java b/gtpp/src/main/java/gtPlusPlus/api/objects/data/AutoMap.java
new file mode 100644
index 0000000000..a3551326c2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/data/AutoMap.java
@@ -0,0 +1,364 @@
+package gtPlusPlus.api.objects.data;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
+
+public class AutoMap<V> implements Iterable<V>, Cloneable, Serializable, Collection<V>, Queue<V>, List<V> {
+
+ /**
+ * The Internal Map
+ */
+ protected final Map<Integer, V> mInternalMap;
+
+ protected final Map<String, Integer> mInternalNameMap;
+
+ /**
+ * The Internal ID
+ */
+ private int mInternalID = 0;
+
+ private static final long serialVersionUID = 3771412318075131790L;
+
+ public AutoMap() {
+ this(new LinkedHashMap<>());
+ }
+
+ public Map<Integer, V> getMap() {
+ return mInternalMap;
+ }
+
+ public AutoMap(Map<Integer, V> defaultMapType) {
+ mInternalMap = defaultMapType;
+ mInternalNameMap = new LinkedHashMap<>();
+ }
+
+ /**
+ * Generates an AutoMap from the List.
+ *
+ * @param aList - Data to be inserted into the AutoMap.
+ */
+ public AutoMap(List<V> aList) {
+ mInternalMap = new LinkedHashMap<>();
+ mInternalNameMap = new LinkedHashMap<>();
+ if (aList != null && aList.size() > 0) {
+ for (V obj : aList) {
+ add(obj);
+ }
+ }
+ }
+
+ /**
+ * Generates an AutoMap from a Set.
+ *
+ * @param aList - Data to be inserted into the AutoMap.
+ */
+ public AutoMap(Set<V> aList) {
+ mInternalMap = new LinkedHashMap<>();
+ mInternalNameMap = new LinkedHashMap<>();
+ if (aList != null && aList.size() > 0) {
+ for (V obj : aList) {
+ add(obj);
+ }
+ }
+ }
+
+ /**
+ * Generates an AutoMap from a Collection.
+ *
+ * @param aList - Data to be inserted into the AutoMap.
+ */
+ public AutoMap(Collection<V> aList) {
+ mInternalMap = new LinkedHashMap<>();
+ mInternalNameMap = new LinkedHashMap<>();
+ if (aList != null && aList.size() > 0) {
+ for (V obj : aList) {
+ add(obj);
+ }
+ }
+ }
+
+ /**
+ * Generates an AutoMap from a Array.
+ *
+ * @param aArray - Data to be inserted into the AutoMap.
+ */
+ public AutoMap(V[] aArray) {
+ mInternalMap = new LinkedHashMap<>();
+ mInternalNameMap = new LinkedHashMap<>();
+ if (aArray != null && aArray.length > 0) {
+ for (V obj : aArray) {
+ add(obj);
+ }
+ }
+ }
+
+ @Override
+ public Iterator<V> iterator() {
+ return values().iterator();
+ }
+
+ public synchronized boolean setValue(V object) {
+ int mOriginalID = this.mInternalID;
+ put(object);
+ if (this.mInternalMap.get(mOriginalID)
+ .equals(object) || mOriginalID > this.mInternalID) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public synchronized V put(V object) {
+ return set(object);
+ }
+
+ @Override
+ public synchronized boolean add(V object) {
+ return set(object) != null;
+ }
+
+ public synchronized V set(V object) {
+ if (object == null) {
+ return null;
+ }
+ mInternalNameMap.put("" + object.hashCode(), (mInternalID + 1));
+ return mInternalMap.put(mInternalID++, object);
+ }
+
+ @Override
+ public synchronized V get(int id) {
+ return mInternalMap.get(id);
+ }
+
+ public synchronized Collection<V> values() {
+ return mInternalMap.values();
+ }
+
+ @Override
+ public synchronized int size() {
+ return mInternalMap.size();
+ }
+
+ public synchronized int hashCode() {
+ return mInternalMap.hashCode();
+ }
+
+ public synchronized boolean containsKey(int key) {
+ return mInternalMap.containsKey(key);
+ }
+
+ public synchronized boolean containsValue(V value) {
+ return mInternalMap.containsValue(value);
+ }
+
+ @Override
+ public synchronized boolean isEmpty() {
+ return mInternalMap.isEmpty();
+ }
+
+ @Override
+ public synchronized void clear() {
+ this.mInternalID = 0;
+ this.mInternalMap.clear();
+ this.mInternalNameMap.clear();
+ return;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public V[] toArray() {
+ V[] toR = (V[]) java.lang.reflect.Array.newInstance(
+ mInternalMap.get(0)
+ .getClass(),
+ mInternalMap.size());
+ for (int i = 0; i < mInternalMap.size(); i++) {
+ toR[i] = mInternalMap.get(i);
+ }
+ return toR;
+ }
+
+ public final synchronized int getInternalID() {
+ return mInternalID;
+ }
+
+ @Override
+ public final synchronized boolean remove(Object value) {
+ value.getClass();
+ if (this.mInternalMap.containsValue(value)) {
+ return this.mInternalMap.remove(mInternalNameMap.get("" + value.hashCode()), value);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean contains(Object o) {
+ for (V g : this.mInternalMap.values()) {
+ if (g.equals(o)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <V> V[] toArray(V[] a) {
+ return (V[]) toArray();
+ }
+
+ @Override
+ public boolean containsAll(Collection<?> c) {
+ boolean aTrue = true;
+ for (Object g : c) {
+ if (!this.contains(g)) {
+ aTrue = false;
+ }
+ }
+ return aTrue;
+ }
+
+ @Override
+ public boolean addAll(Collection<? extends V> c) {
+ boolean aTrue = true;
+ for (V g : c) {
+ if (!this.add(g)) {
+ aTrue = false;
+ }
+ }
+ return aTrue;
+ }
+
+ @Override
+ public boolean removeAll(Collection<?> c) {
+ boolean aTrue = true;
+ for (Object g : c) {
+ if (!this.remove(g)) {
+ aTrue = false;
+ }
+ }
+ return aTrue;
+ }
+
+ @Override
+ public boolean retainAll(Collection<?> c) {
+ AutoMap<?> aTempAllocation = new AutoMap<>();
+ boolean aTrue = false;
+ aTempAllocation = this;
+ aTempAllocation.removeAll(c);
+ aTempAllocation.clear();
+ aTrue = aTempAllocation.isEmpty();
+ aTempAllocation.clear();
+ return aTrue;
+ }
+
+ @Override
+ public boolean offer(V e) {
+ return add(e);
+ }
+
+ @Override
+ public V remove() {
+ V y = this.get(0);
+ if (remove(y)) return y;
+ else return null;
+ }
+
+ @Override
+ public V poll() {
+ if (this.mInternalMap.isEmpty()) {
+ return null;
+ }
+ return remove();
+ }
+
+ @Override
+ public V element() {
+ if (this.mInternalMap.isEmpty()) {
+ return null;
+ }
+ return this.get(0);
+ }
+
+ @Override
+ public V peek() {
+ return element();
+ }
+
+ @Override
+ public boolean addAll(int index, Collection<? extends V> c) {
+ for (V y : c) {
+ add(y);
+ }
+ return true;
+ }
+
+ @Override
+ public V set(int index, V element) {
+ return mInternalMap.put(index, element);
+ }
+
+ @Override
+ public void add(int index, V element) {
+ add(element);
+ }
+
+ @Override
+ public V remove(int index) {
+ V h = mInternalMap.get(index);
+ set(index, null);
+ return h;
+ }
+
+ @Override
+ public int indexOf(Object o) {
+ int aCount = 0;
+ for (V of : mInternalMap.values()) {
+ if (of != o) {
+ aCount++;
+ continue;
+ } else {
+ return aCount;
+ }
+ }
+ return -1;
+ }
+
+ @Override
+ public int lastIndexOf(Object o) {
+ // TODO
+ return indexOf(o);
+ }
+
+ @Override
+ public ListIterator<V> listIterator() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public ListIterator<V> listIterator(int index) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public List<V> subList(int fromIndex, int toIndex) {
+ AutoMap<V> aNewSubList = new AutoMap<>();
+ for (int slot = fromIndex; slot <= toIndex; slot++) {
+ V obj = mInternalMap.get(slot);
+ if (obj == null) {
+ continue;
+ } else {
+ aNewSubList.put(obj);
+ }
+ }
+ return aNewSubList;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/data/Pair.java b/gtpp/src/main/java/gtPlusPlus/api/objects/data/Pair.java
new file mode 100644
index 0000000000..93bf075c8f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/data/Pair.java
@@ -0,0 +1,35 @@
+package gtPlusPlus.api.objects.data;
+
+import java.io.Serializable;
+
+import com.google.common.base.Objects;
+
+public class Pair<K, V> implements Serializable {
+
+ /**
+ * SVUID
+ */
+ private static final long serialVersionUID = 1250550491092812443L;
+
+ private final K key;
+ private final V value;
+
+ public Pair(final K key, final V value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public final K getKey() {
+ return this.key;
+ }
+
+ public final V getValue() {
+ return this.value;
+ }
+
+ @Override
+ public int hashCode() {
+ Integer aCode = Objects.hashCode(getKey(), getValue());
+ return aCode != null ? aCode : super.hashCode();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/data/Quad.java b/gtpp/src/main/java/gtPlusPlus/api/objects/data/Quad.java
new file mode 100644
index 0000000000..a2597061e0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/data/Quad.java
@@ -0,0 +1,44 @@
+package gtPlusPlus.api.objects.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Quad<K, V, C, R> {
+
+ private final K key;
+ private final V value;
+ private final C value2;
+ private final R value3;
+
+ public Quad(final K key, final V value, final C value2, final R value3) {
+ this.key = key;
+ this.value = value;
+ this.value2 = value2;
+ this.value3 = value3;
+ }
+
+ public final K getKey() {
+ return this.key;
+ }
+
+ public final V getValue_1() {
+ return this.value;
+ }
+
+ public final C getValue_2() {
+ return this.value2;
+ }
+
+ public final R getValue_3() {
+ return this.value3;
+ }
+
+ public final List values() {
+ List<Object> aVals = new ArrayList<>();
+ aVals.add(key);
+ aVals.add(value);
+ aVals.add(value2);
+ aVals.add(value3);
+ return aVals;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/data/Triplet.java b/gtpp/src/main/java/gtPlusPlus/api/objects/data/Triplet.java
new file mode 100644
index 0000000000..625ec630aa
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/data/Triplet.java
@@ -0,0 +1,26 @@
+package gtPlusPlus.api.objects.data;
+
+public class Triplet<K, V, C> {
+
+ private final K key;
+ private final V value;
+ private final C count;
+
+ public Triplet(final K key, final V value, final C value2) {
+ this.key = key;
+ this.value = value;
+ this.count = value2;
+ }
+
+ public final K getValue_1() {
+ return this.key;
+ }
+
+ public final V getValue_2() {
+ return this.value;
+ }
+
+ public final C getValue_3() {
+ return this.count;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/data/TypeCounter.java b/gtpp/src/main/java/gtPlusPlus/api/objects/data/TypeCounter.java
new file mode 100644
index 0000000000..ea12972af4
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/data/TypeCounter.java
@@ -0,0 +1,177 @@
+package gtPlusPlus.api.objects.data;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import gtPlusPlus.api.objects.Logger;
+
+public class TypeCounter<V> implements Set<V> {
+
+ private Map<String, InternalTypeCounterObject<V>> mInternalMap = new LinkedHashMap<>();
+ private String mHighestValueKey;
+ private int mHighestValue = 0;
+ private final Class mClass;
+
+ public TypeCounter(Class o) {
+ Logger.WARNING("Created new TypeCounter for " + o.getName());
+ mClass = o;
+ }
+
+ public static class InternalTypeCounterObject<Z> {
+
+ private final Z mObject;
+ private int mCounter = 0;
+
+ public InternalTypeCounterObject(Z o) {
+ mObject = o;
+ }
+
+ public String hash() {
+ return String.valueOf(mObject.hashCode());
+ }
+
+ public Z get() {
+ return mObject;
+ }
+
+ public void add() {
+ mCounter++;
+ }
+
+ public int count() {
+ return mCounter;
+ }
+ }
+
+ @Override
+ public boolean add(V arg0) {
+ return add(arg0, null);
+ }
+
+ public boolean add(V arg0, String aKeyName) {
+ String aKey = aKeyName != null ? aKeyName : arg0.toString();
+ InternalTypeCounterObject<V> aValue = mInternalMap.get(aKey);
+ if (aValue == null) {
+ aValue = new InternalTypeCounterObject<>((V) arg0);
+ Logger.WARNING("Adding new key to map: " + aKey);
+ }
+ aValue.add();
+ int a = aValue.count();
+ if (a > mHighestValue) {
+ mHighestValue = a;
+ mHighestValueKey = aKey;
+ Logger.WARNING("New Highest Count - " + aKey + ":" + a);
+ }
+ mInternalMap.put(aKey, aValue);
+ Logger.WARNING(aKey + ":" + a);
+ return true;
+ }
+
+ @Override
+ public boolean addAll(Collection arg0) {
+ boolean aReturn = true;
+ for (Object o : arg0) {
+ if (mClass.isInstance(o)) {
+ V j = (V) o;
+ boolean b = add(j);
+ if (!b) {
+ aReturn = false;
+ }
+ }
+ }
+ return aReturn;
+ }
+
+ @Override
+ public void clear() {
+ mInternalMap.clear();
+ }
+
+ @Override
+ public boolean contains(Object arg0) {
+ return mInternalMap.containsKey(arg0.toString());
+ }
+
+ @Override
+ public boolean containsAll(Collection arg0) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return mInternalMap.isEmpty();
+ }
+
+ @Override
+ public Iterator iterator() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean remove(Object arg0) {
+ InternalTypeCounterObject<V> aValue = mInternalMap.remove(arg0.toString());
+ if (aValue != null) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean removeAll(Collection arg0) {
+ boolean aReturn = true;
+ for (Object o : arg0) {
+ boolean a = remove(o);
+ if (!a) {
+ aReturn = false;
+ }
+ }
+ return aReturn;
+ }
+
+ @Override
+ public boolean retainAll(Collection arg0) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public int size() {
+ return this.mInternalMap.size();
+ }
+
+ @Override
+ public Object[] toArray() {
+ Object[] aArray = new Object[this.mInternalMap.size()];
+ int aPos = 0;
+ for (String k : this.mInternalMap.keySet()) {
+ if (k != null) {
+ InternalTypeCounterObject<V> aVal = this.mInternalMap.get(k);
+ aArray[aPos++] = new Pair<>(k, aVal);
+ }
+ }
+ return aArray;
+ }
+
+ @Override
+ public V[] toArray(Object[] a) {
+ Object[] aArray = new Object[a.length];
+ int aPos = 0;
+ for (Object k : a) {
+ if (k != null) {
+ aArray[aPos++] = k;
+ }
+ }
+ return (V[]) aArray;
+ }
+
+ public V getResults() {
+ InternalTypeCounterObject<V> x = mInternalMap.get(mHighestValueKey);
+ return x.get();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/data/WeightedCollection.java b/gtpp/src/main/java/gtPlusPlus/api/objects/data/WeightedCollection.java
new file mode 100644
index 0000000000..5d99097169
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/data/WeightedCollection.java
@@ -0,0 +1,102 @@
+package gtPlusPlus.api.objects.data;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.NavigableMap;
+import java.util.Random;
+import java.util.Set;
+import java.util.TreeMap;
+
+import gregtech.api.objects.XSTR;
+
+public class WeightedCollection<E> implements Map<Integer, E> {
+
+ private NavigableMap<Integer, E> map = new TreeMap<>();
+ private Random random;
+ private int total = 0;
+
+ public WeightedCollection() {
+ this(new XSTR());
+ }
+
+ public WeightedCollection(Random random) {
+ this.random = random;
+ }
+
+ public E add(int weight, E object) {
+ if (weight <= 0) return null;
+ total += weight;
+ return map.put(total, object);
+ }
+
+ private E next() {
+ int value = random.nextInt(total) + 1; // Can also use floating-point weights
+ return map.ceilingEntry(value)
+ .getValue();
+ }
+
+ @Override
+ public int size() {
+ return map.size();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return map.isEmpty();
+ }
+
+ @Override
+ public boolean containsKey(Object key) {
+ return map.containsKey(key);
+ }
+
+ @Override
+ public boolean containsValue(Object value) {
+ return map.containsValue(value);
+ }
+
+ public E get() {
+ return next();
+ }
+
+ @Override
+ public E get(Object key) {
+ return next();
+ }
+
+ @Override
+ public void putAll(Map m) {
+ map.putAll(m);
+ }
+
+ @Override
+ public void clear() {
+ map.clear();
+ this.total = 0;
+ }
+
+ @Override
+ public Set keySet() {
+ return map.keySet();
+ }
+
+ @Override
+ public Collection values() {
+ return map.values();
+ }
+
+ @Override
+ public Set entrySet() {
+ return map.entrySet();
+ }
+
+ @Override
+ public E put(Integer key, E value) {
+ return add(key, value);
+ }
+
+ @Override
+ public E remove(Object key) {
+ return map.remove(key);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/data/weakref/WeakAutoMap.java b/gtpp/src/main/java/gtPlusPlus/api/objects/data/weakref/WeakAutoMap.java
new file mode 100644
index 0000000000..199d20e06a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/data/weakref/WeakAutoMap.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.api.objects.data.weakref;
+
+import java.util.WeakHashMap;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+
+public class WeakAutoMap<T> extends AutoMap<T> {
+
+ private static final long serialVersionUID = 8328345351801363386L;
+
+ public WeakAutoMap() {
+ super(new WeakHashMap<>());
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/AABB.java b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/AABB.java
new file mode 100644
index 0000000000..e516f12ddd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/AABB.java
@@ -0,0 +1,67 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+
+/**
+ * Generates an AABB around an entity.
+ *
+ * @author Alkalus
+ *
+ */
+public class AABB {
+
+ private final AxisAlignedBB mAabb;
+ private final World mWorld;
+
+ /**
+ * Creates a AxisAlignedBB based around an Entity.
+ *
+ * @param aEntity - The Entity to work with.
+ * @param x - Maximum X from origin.
+ * @param y - Maximum Y from origin.
+ * @param z - Maximum Z from origin.
+ */
+ public AABB(Entity aEntity, int x, int y, int z) {
+ if (aEntity == null) {
+ mAabb = null;
+ mWorld = null;
+ } else {
+ mWorld = aEntity.worldObj;
+ BlockPos aEntityLocation = EntityUtils.findBlockPosUnderEntity(aEntity);
+ int xMin, xMax, yMin, yMax, zMin, zMax;
+ xMin = aEntityLocation.xPos;
+ yMin = aEntityLocation.yPos;
+ zMin = aEntityLocation.zPos;
+ xMax = aEntityLocation.xPos + x;
+ yMax = aEntityLocation.yPos + y;
+ zMax = aEntityLocation.zPos + z;
+ mAabb = AxisAlignedBB.getBoundingBox(xMin, yMin, zMin, xMax, yMax, zMax);
+ }
+ }
+
+ /**
+ * Used to get the AxisAlignedBB from this class.
+ *
+ * @return
+ */
+ public AxisAlignedBB get() {
+ return mAabb;
+ }
+
+ /**
+ * Used to determine if this object is valid or not.
+ *
+ * @return
+ */
+ public boolean valid() {
+ return mAabb != null && mWorld != null;
+ }
+
+ public World world() {
+ return mWorld;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_FluidTank.java b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_FluidTank.java
new file mode 100644
index 0000000000..13f12503f0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_FluidTank.java
@@ -0,0 +1,185 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTank;
+import net.minecraftforge.fluids.FluidTankInfo;
+
+public class BTF_FluidTank extends FluidTank {
+
+ public FluidStack mFluid;
+
+ public BTF_FluidTank(int capacity) {
+ super(capacity);
+ }
+
+ /**
+ * Let's replace the Default handling with GT's own handling code, because it's probably better, right?
+ *
+ * @author Alkalus/GregoriusT
+ */
+ @Override
+ public FluidStack getFluid() {
+ return this.getDrainableStack();
+ }
+
+ @Override
+ public int getFluidAmount() {
+ return this.getDrainableStack() != null ? this.getDrainableStack().amount : 0;
+ }
+
+ @Override
+ public NBTTagCompound writeToNBT(NBTTagCompound aNBT) {
+ super.writeToNBT(aNBT);
+ if (this.mFluid != null) {
+ aNBT.setTag("mFluid", this.mFluid.writeToNBT(new NBTTagCompound()));
+ }
+ return aNBT;
+ }
+
+ @Override
+ public FluidTank readFromNBT(NBTTagCompound aNBT) {
+ this.mFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid"));
+ return this;
+ }
+
+ /*
+ * public abstract boolean isLiquidInput(byte arg0); public abstract boolean isLiquidOutput(byte arg0); public
+ * abstract boolean doesFillContainers(); public abstract boolean doesEmptyContainers();
+ */
+
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return true;
+ }
+
+ public FluidStack getFillableStack() {
+ return this.mFluid;
+ }
+
+ public FluidStack setFillableStack(FluidStack aFluid) {
+ this.mFluid = aFluid;
+ return this.mFluid;
+ }
+
+ public FluidStack getDrainableStack() {
+ return this.mFluid;
+ }
+
+ public FluidStack setDrainableStack(FluidStack aFluid) {
+ this.mFluid = aFluid;
+ return this.mFluid;
+ }
+
+ public boolean isFluidChangingAllowed() {
+ return true;
+ }
+
+ @Override
+ public int fill(FluidStack aFluid, boolean doFill) {
+ if (aFluid != null && aFluid.getFluid()
+ .getID() > 0 && aFluid.amount > 0 && this.canTankBeFilled() && this.isFluidInputAllowed(aFluid)) {
+ if (this.getFillableStack() != null && this.getFillableStack()
+ .getFluid()
+ .getID() > 0) {
+ if (!this.getFillableStack()
+ .isFluidEqual(aFluid)) {
+ return 0;
+ } else {
+ int space = this.getCapacity() - this.getFillableStack().amount;
+ if (aFluid.amount <= space) {
+ if (doFill) {
+ FluidStack arg9999 = this.getFillableStack();
+ arg9999.amount += aFluid.amount;
+ }
+
+ return aFluid.amount;
+ } else {
+ if (doFill) {
+ this.getFillableStack().amount = this.getCapacity();
+ }
+
+ return space;
+ }
+ }
+ } else if (aFluid.amount <= this.getCapacity()) {
+ if (doFill) {
+ this.setFillableStack(aFluid.copy());
+ }
+
+ return aFluid.amount;
+ } else {
+ if (doFill) {
+ this.setFillableStack(aFluid.copy());
+ this.getFillableStack().amount = this.getCapacity();
+ }
+
+ return this.getCapacity();
+ }
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public FluidStack drain(int maxDrain, boolean doDrain) {
+ if (this.getDrainableStack() != null && this.canTankBeEmptied()) {
+ if (this.getDrainableStack().amount <= 0 && this.isFluidChangingAllowed()) {
+ this.setDrainableStack((FluidStack) null);
+ return null;
+ } else {
+ int used = maxDrain;
+ if (this.getDrainableStack().amount < maxDrain) {
+ used = this.getDrainableStack().amount;
+ }
+
+ if (doDrain) {
+ FluidStack arg9999 = this.getDrainableStack();
+ arg9999.amount -= used;
+ }
+
+ FluidStack drained = this.getDrainableStack()
+ .copy();
+ drained.amount = used;
+ if (this.getDrainableStack().amount <= 0 && this.isFluidChangingAllowed()) {
+ this.setDrainableStack((FluidStack) null);
+ }
+
+ return drained;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public int getCapacity() {
+ return super.getCapacity();
+ }
+
+ @Override
+ public FluidTankInfo getInfo() {
+ return new FluidTankInfo(this);
+ }
+
+ @Override
+ public void setFluid(FluidStack fluid) {
+ setFillableStack(fluid);
+ }
+
+ @Override
+ public void setCapacity(int capacity) {
+ super.setCapacity(capacity);
+ }
+
+ public FluidStack drain(FluidStack aFluid, boolean doDrain) {
+ return drain(aFluid.amount, doDrain);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_Inventory.java b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_Inventory.java
new file mode 100644
index 0000000000..fc71869d9e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/BTF_Inventory.java
@@ -0,0 +1,231 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import java.util.ArrayList;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.util.GT_Utility;
+import gregtech.common.covers.CoverInfo;
+import gtPlusPlus.core.tileentities.base.TileEntityBase;
+import gtPlusPlus.core.util.data.ArrayUtils;
+
+public class BTF_Inventory implements ISidedInventory {
+
+ public final ItemStack[] mInventory;
+ public final TileEntityBase mTile;
+
+ public BTF_Inventory(int aSlots, TileEntityBase tile) {
+ this.mInventory = new ItemStack[aSlots];
+ this.mTile = tile;
+ }
+
+ public ItemStack[] getRealInventory() {
+ purgeNulls();
+ return this.mInventory;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.mInventory.length;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(int aIndex) {
+ return aIndex >= 0 && aIndex < this.mInventory.length ? this.mInventory[aIndex] : null;
+ }
+
+ @Override
+ public void setInventorySlotContents(int aIndex, ItemStack aStack) {
+ if (aIndex >= 0 && aIndex < this.mInventory.length) {
+ this.mInventory[aIndex] = aStack;
+ }
+ }
+
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public boolean setStackToZeroInsteadOfNull(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public boolean isItemValidForSlot(int aIndex, ItemStack aStack) {
+ return isValidSlot(aIndex);
+ }
+
+ @Override
+ public ItemStack decrStackSize(int aIndex, int aAmount) {
+ ItemStack tStack = this.getStackInSlot(aIndex);
+ ItemStack rStack = GT_Utility.copy(new Object[] { tStack });
+ if (tStack != null) {
+ if (tStack.stackSize <= aAmount) {
+ if (this.setStackToZeroInsteadOfNull(aIndex)) {
+ tStack.stackSize = 0;
+ } else {
+ this.setInventorySlotContents(aIndex, (ItemStack) null);
+ }
+ } else {
+ rStack = tStack.splitStack(aAmount);
+ if (tStack.stackSize == 0 && !this.setStackToZeroInsteadOfNull(aIndex)) {
+ this.setInventorySlotContents(aIndex, (ItemStack) null);
+ }
+ }
+ }
+
+ return rStack;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(int ordinalSide) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ ArrayList<Integer> tList = new ArrayList<>();
+ CoverInfo coverInfo = this.mTile.getCoverInfoAtSide(side);
+ boolean tSkip = coverInfo.letsItemsIn(-2) || coverInfo.letsItemsIn(-2);
+
+ for (int rArray = 0; rArray < this.getSizeInventory(); ++rArray) {
+ if (this.isValidSlot(rArray)
+ && (tSkip || coverInfo.letsItemsOut(rArray) || coverInfo.letsItemsIn(rArray))) {
+ tList.add(rArray);
+ }
+ }
+
+ int[] arg6 = new int[tList.size()];
+
+ for (int i = 0; i < arg6.length; ++i) {
+ arg6[i] = tList.get(i);
+ }
+
+ return arg6;
+ }
+
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ return this.isValidSlot(aIndex) && aStack != null
+ && aIndex < this.mInventory.length
+ && (this.mInventory[aIndex] == null || GT_Utility.areStacksEqual(aStack, this.mInventory[aIndex]))
+ && this.allowPutStack(this.mTile, aIndex, ForgeDirection.getOrientation(ordinalSide), aStack);
+ }
+
+ @Override
+ public boolean canExtractItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ return this.isValidSlot(aIndex) && aStack != null
+ && aIndex < this.mInventory.length
+ && this.allowPullStack(this.mTile, aIndex, ForgeDirection.getOrientation(ordinalSide), aStack);
+ }
+
+ public boolean allowPullStack(TileEntityBase mTile2, int aIndex, ForgeDirection side, ItemStack aStack) {
+ return aIndex >= 0 && aIndex < this.getSizeInventory();
+ }
+
+ public boolean allowPutStack(TileEntityBase aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return (aIndex >= 0 && aIndex < this.getSizeInventory())
+ && (this.mInventory[aIndex] == null || GT_Utility.areStacksEqual(this.mInventory[aIndex], aStack));
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(int i) {
+ return null;
+ }
+
+ @Override
+ public final boolean hasCustomInventoryName() {
+ return mTile != null ? mTile.hasCustomInventoryName() : false;
+ }
+
+ @Override
+ public void markDirty() {
+ if (mTile != null) {
+ purgeNulls();
+ mTile.markDirty();
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(EntityPlayer entityplayer) {
+ return true;
+ }
+
+ @Override
+ public void openInventory() {}
+
+ @Override
+ public void closeInventory() {}
+
+ @Override
+ public final String getInventoryName() {
+ return this.mTile != null ? mTile.getInventoryName() : "";
+ }
+
+ public boolean isFull() {
+ for (int s = 0; s < this.getSizeInventory(); s++) {
+ ItemStack slot = mInventory[s];
+ if (slot == null || slot.stackSize != slot.getMaxStackSize()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public boolean isEmpty() {
+ for (int s = 0; s < this.getSizeInventory(); s++) {
+ ItemStack slot = mInventory[s];
+ if (slot == null) {
+ continue;
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public boolean addItemStack(ItemStack aInput) {
+ if (aInput != null & (isEmpty() || !isFull())) {
+ for (int s = 0; s < this.getSizeInventory(); s++) {
+ if (mInventory != null && mInventory[s] != null) {
+ ItemStack slot = mInventory[s];
+ if (slot == null || (slot != null && GT_Utility.areStacksEqual(aInput, slot)
+ && slot.stackSize != slot.getItem()
+ .getItemStackLimit(slot))) {
+ if (slot == null) {
+ slot = aInput.copy();
+ } else {
+ slot.stackSize++;
+ }
+ this.setInventorySlotContents(s, slot);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ public final void purgeNulls() {
+ ItemStack[] aTemp = ArrayUtils.removeNulls(this.mInventory);
+ for (int g = 0; g < this.getSizeInventory(); g++) {
+ if (aTemp.length < this.getSizeInventory()) {
+ if (g <= aTemp.length - 1) {
+ this.mInventory[g] = aTemp[g];
+ } else {
+ this.mInventory[g] = null;
+ }
+ } else {
+ this.mInventory[g] = aTemp[g];
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/BlockPos.java b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/BlockPos.java
new file mode 100644
index 0000000000..3853f61793
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/BlockPos.java
@@ -0,0 +1,245 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gtPlusPlus.api.objects.data.AutoMap;
+
+public class BlockPos implements Serializable {
+
+ private static final long serialVersionUID = -7271947491316682006L;
+ public final int xPos;
+ public final int yPos;
+ public final int zPos;
+ public final int dim;
+ public final transient World world;
+
+ public static BlockPos generateBlockPos(String sUUID) {
+ String[] s2 = sUUID.split("@");
+ return new BlockPos(s2);
+ }
+
+ public BlockPos(String[] s) {
+ this(Integer.parseInt(s[1]), Integer.parseInt(s[2]), Integer.parseInt(s[3]), Integer.parseInt(s[0]));
+ }
+
+ public BlockPos(int x, int y, int z) {
+ this(x, y, z, 0);
+ }
+
+ public BlockPos(int x, int y, int z, int dim) {
+ this(x, y, z, DimensionManager.getWorld(dim));
+ }
+
+ public BlockPos(int x, int y, int z, World dim) {
+ this.xPos = x;
+ this.yPos = y;
+ this.zPos = z;
+
+ if (dim != null) {
+ this.dim = dim.provider.dimensionId;
+ this.world = dim;
+ } else {
+ this.dim = 0;
+ this.world = null;
+ }
+ }
+
+ public BlockPos(IGregTechTileEntity b) {
+ this(b.getXCoord(), b.getYCoord(), b.getZCoord(), b.getWorld());
+ }
+
+ public BlockPos(TileEntity b) {
+ this(b.xCoord, b.yCoord, b.zCoord, b.getWorldObj());
+ }
+
+ public String getLocationString() {
+ return "[X: " + this.xPos + "][Y: " + this.yPos + "][Z: " + this.zPos + "][Dim: " + this.dim + "]";
+ }
+
+ public String getUniqueIdentifier() {
+ String S = "" + this.dim + "@" + this.xPos + "@" + this.yPos + "@" + this.zPos;
+ return S;
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 5;
+ hash += (13 * this.xPos);
+ hash += (19 * this.yPos);
+ hash += (31 * this.zPos);
+ hash += (17 * this.dim);
+ return hash;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == null) {
+ return false;
+ }
+ if (other == this) {
+ return true;
+ }
+ if (!(other instanceof BlockPos otherPoint)) {
+ return false;
+ }
+ return this.xPos == otherPoint.xPos && this.yPos == otherPoint.yPos
+ && this.zPos == otherPoint.zPos
+ && this.dim == otherPoint.dim;
+ }
+
+ public int distanceFrom(BlockPos target) {
+ if (target.dim != this.dim) {
+ return Short.MIN_VALUE;
+ }
+ return distanceFrom(target.xPos, target.yPos, target.zPos);
+ }
+
+ /**
+ *
+ * @param x X coordinate of target.
+ * @param y Y coordinate of target.
+ * @param z Z coordinate of target.
+ * @return square of distance
+ */
+ public int distanceFrom(int x, int y, int z) {
+ int distanceX = this.xPos - x;
+ int distanceY = this.yPos - y;
+ int distanceZ = this.zPos - z;
+ return distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ;
+ }
+
+ public boolean isWithinRange(BlockPos target, int range) {
+ if (target.dim != this.dim) {
+ return false;
+ }
+ return isWithinRange(target.xPos, target.yPos, target.zPos, range);
+ }
+
+ public boolean isWithinRange(int x, int y, int z, int range) {
+ return distanceFrom(x, y, z) <= (range * range);
+ }
+
+ public BlockPos getUp() {
+ return new BlockPos(this.xPos, this.yPos + 1, this.zPos, this.dim);
+ }
+
+ public BlockPos getDown() {
+ return new BlockPos(this.xPos, this.yPos - 1, this.zPos, this.dim);
+ }
+
+ public BlockPos getXPos() {
+ return new BlockPos(this.xPos + 1, this.yPos, this.zPos, this.dim);
+ }
+
+ public BlockPos getXNeg() {
+ return new BlockPos(this.xPos - 1, this.yPos, this.zPos, this.dim);
+ }
+
+ public BlockPos getZPos() {
+ return new BlockPos(this.xPos, this.yPos, this.zPos + 1, this.dim);
+ }
+
+ public BlockPos getZNeg() {
+ return new BlockPos(this.xPos, this.yPos, this.zPos - 1, this.dim);
+ }
+
+ public AutoMap<BlockPos> getSurroundingBlocks() {
+ AutoMap<BlockPos> sides = new AutoMap<>();
+ sides.put(getUp());
+ sides.put(getDown());
+ sides.put(getXPos());
+ sides.put(getXNeg());
+ sides.put(getZPos());
+ sides.put(getZNeg());
+ return sides;
+ }
+
+ public Block getBlockAtPos() {
+ return getBlockAtPos(this);
+ }
+
+ public Block getBlockAtPos(BlockPos pos) {
+ return getBlockAtPos(world, pos);
+ }
+
+ public Block getBlockAtPos(World world, BlockPos pos) {
+ return world.getBlock(pos.xPos, pos.yPos, pos.zPos);
+ }
+
+ public int getMetaAtPos() {
+ return getMetaAtPos(this);
+ }
+
+ public int getMetaAtPos(BlockPos pos) {
+ return getMetaAtPos(world, pos);
+ }
+
+ public int getMetaAtPos(World world, BlockPos pos) {
+ return world.getBlockMetadata(pos.xPos, pos.yPos, pos.zPos);
+ }
+
+ public boolean hasSimilarNeighbour() {
+ return hasSimilarNeighbour(false);
+ }
+
+ /**
+ * @param strict - Does this check Meta Data?
+ * @return - Does this block have a neighbour that is the same?
+ */
+ public boolean hasSimilarNeighbour(boolean strict) {
+ for (BlockPos g : getSurroundingBlocks().values()) {
+ if (getBlockAtPos(g) == getBlockAtPos()) {
+ if (!strict) {
+ return true;
+ } else {
+ if (getMetaAtPos() == getMetaAtPos(g)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ public AutoMap<BlockPos> getSimilarNeighbour() {
+ return getSimilarNeighbour(false);
+ }
+
+ /**
+ * @param strict - Does this check Meta Data?
+ * @return - Does this block have a neighbour that is the same?
+ */
+ public AutoMap<BlockPos> getSimilarNeighbour(boolean strict) {
+ AutoMap<BlockPos> sides = new AutoMap<>();
+ for (BlockPos g : getSurroundingBlocks().values()) {
+ if (getBlockAtPos(g) == getBlockAtPos()) {
+ if (!strict) {
+ sides.put(g);
+ } else {
+ if (getMetaAtPos() == getMetaAtPos(g)) {
+ sides.put(g);
+ }
+ }
+ }
+ }
+ return sides;
+ }
+
+ public Set<BlockPos> getValidNeighboursAndSelf() {
+ AutoMap<BlockPos> h = getSimilarNeighbour(true);
+ h.put(this);
+ Set<BlockPos> result = new HashSet<>();
+ for (BlockPos f : h.values()) {
+ result.add(f);
+ }
+ return result;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/CubicObject.java b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/CubicObject.java
new file mode 100644
index 0000000000..5620b76895
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/CubicObject.java
@@ -0,0 +1,56 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+
+public class CubicObject<T> {
+
+ public final T NORTH;
+ public final T SOUTH;
+
+ public final T WEST;
+ public final T EAST;
+
+ public final T UP;
+ public final T DOWN;
+
+ public CubicObject(AutoMap<T> aDataSet) {
+ this(aDataSet.get(0), aDataSet.get(1), aDataSet.get(2), aDataSet.get(3), aDataSet.get(4), aDataSet.get(5));
+ }
+
+ public CubicObject(T[] aDataSet) {
+ this(aDataSet[0], aDataSet[1], aDataSet[2], aDataSet[3], aDataSet[4], aDataSet[5]);
+ }
+
+ public CubicObject(T aDOWN, T aUP, T aNORTH, T aSOUTH, T aWEST, T aEAST) {
+ DOWN = aDOWN;
+ UP = aUP;
+ NORTH = aNORTH;
+ SOUTH = aSOUTH;
+ WEST = aWEST;
+ EAST = aEAST;
+ }
+
+ public T get(int ordinalSide) {
+ return get(ForgeDirection.getOrientation(ordinalSide));
+ }
+
+ public T get(ForgeDirection side) {
+ if (side == ForgeDirection.DOWN) {
+ return DOWN;
+ } else if (side == ForgeDirection.UP) {
+ return UP;
+ } else if (side == ForgeDirection.NORTH) {
+ return NORTH;
+ } else if (side == ForgeDirection.SOUTH) {
+ return SOUTH;
+ } else if (side == ForgeDirection.WEST) {
+ return WEST;
+ } else if (side == ForgeDirection.EAST) {
+ return EAST;
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/FluidGT6.java b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/FluidGT6.java
new file mode 100644
index 0000000000..c5c903cd1f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/FluidGT6.java
@@ -0,0 +1,33 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.GregTech_API;
+
+public class FluidGT6 extends Fluid implements Runnable {
+
+ private final short[] mRGBa;
+ public final String mTextureName;
+
+ public FluidGT6(final String aName, final String aTextureName, final short[] aRGBa) {
+ super(aName);
+ this.mRGBa = aRGBa;
+ this.mTextureName = aTextureName;
+ if (GregTech_API.sGTBlockIconload != null) {
+ GregTech_API.sGTBlockIconload.add(this);
+ }
+ }
+
+ @Override
+ public int getColor() {
+ return (Math.max(0, Math.min(255, this.mRGBa[0])) << 16) | (Math.max(0, Math.min(255, this.mRGBa[1])) << 8)
+ | Math.max(0, Math.min(255, this.mRGBa[2]));
+ }
+
+ @Override
+ public void run() {
+ this.setIcons(GregTech_API.sBlockIcons.registerIcon(GTPlusPlus.ID + ":" + "fluids/fluid." + this.mTextureName));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/ItemPackage.java b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/ItemPackage.java
new file mode 100644
index 0000000000..d68ef1a93f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/ItemPackage.java
@@ -0,0 +1,57 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.core.handler.COMPAT_HANDLER;
+
+public abstract class ItemPackage implements RunnableWithInfo<String> {
+
+ public ItemPackage() {
+ this(false);
+ }
+
+ public ItemPackage(boolean hasExtraLateRun) {
+ // Register for late run
+ COMPAT_HANDLER.mObjectsToRunInPostInit.put(this);
+ if (hasExtraLateRun) {
+ COMPAT_HANDLER.mObjectsToRunInOnLoadComplete.put(this);
+ }
+ init();
+ }
+
+ @Override
+ public final void run() {
+ generateRecipes();
+ }
+
+ @Override
+ public final String getInfoData() {
+ return errorMessage();
+ }
+
+ public abstract String errorMessage();
+
+ public abstract boolean generateRecipes();
+
+ private void init() {
+ items();
+ blocks();
+ fluids();
+ }
+
+ public abstract void items();
+
+ public abstract void blocks();
+
+ public abstract void fluids();
+
+ /**
+ * Override this to handle GT Recipe map manipulation after they're Baked.
+ *
+ * @param event - the {@link FMLLoadCompleteEvent}.
+ * @return - Did we do anything?
+ */
+ public boolean onLoadComplete(FMLLoadCompleteEvent event) {
+ return false;
+ };
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/ItemStackData.java b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/ItemStackData.java
new file mode 100644
index 0000000000..f5e483b91c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/ItemStackData.java
@@ -0,0 +1,34 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class ItemStackData {
+
+ protected final Item mItem;
+ protected final int mDamage;
+ protected final int mStackSize;
+ protected final NBTTagCompound mNBT;
+ protected final String mUniqueDataTag;
+
+ public ItemStackData(ItemStack aStack) {
+ mItem = aStack.getItem();
+ mDamage = aStack.getItemDamage();
+ mStackSize = aStack.stackSize;
+ mNBT = (aStack.getTagCompound() != null ? aStack.getTagCompound() : new NBTTagCompound());
+ mUniqueDataTag = "" + Item.getIdFromItem(mItem) + "" + mDamage + "" + mStackSize + "" + mNBT.getId();
+ }
+
+ public String getUniqueDataIdentifier() {
+ return this.mUniqueDataTag;
+ }
+
+ public ItemStack getStack() {
+ ItemStack aTemp = ItemUtils.simpleMetaStack(mItem, mDamage, mStackSize);
+ aTemp.setTagCompound(mNBT);
+ return aTemp;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/SafeTexture.java b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/SafeTexture.java
new file mode 100644
index 0000000000..58a7affa90
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/SafeTexture.java
@@ -0,0 +1,65 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import java.util.HashMap;
+
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gtPlusPlus.core.util.Utils;
+
+/**
+ * A Server Side safe object that can hold {@link IIcon}s.
+ *
+ * @author Alkalus
+ *
+ */
+public class SafeTexture implements Runnable {
+
+ @SideOnly(Side.CLIENT)
+ private static final HashMap<Integer, IIcon> mHashToIconCache = new HashMap<>();
+
+ @SideOnly(Side.CLIENT)
+ private static final HashMap<String, Integer> mPathToHashCash = new HashMap<>();
+
+ private static final HashMap<String, SafeTexture> mTextureObjectCache = new HashMap<>();
+
+ private final int mHash;
+
+ private final String mTextureName;
+
+ private static String getKey(String aTexPath) {
+ String aNameKey = Utils.sanitizeString(aTexPath);
+ aNameKey = aNameKey.replace('/', ' ');
+ aNameKey = aNameKey.toLowerCase();
+ return aNameKey;
+ }
+
+ public static SafeTexture register(String aTexturePath) {
+ String aNameKey = getKey(aTexturePath);
+ SafeTexture g = mTextureObjectCache.get(aNameKey);
+ if (g == null) {
+ g = new SafeTexture(aTexturePath);
+ mTextureObjectCache.put(aNameKey, g);
+ mPathToHashCash.put(aTexturePath, aTexturePath.hashCode());
+ }
+ return g;
+ }
+
+ private SafeTexture(String aTexturePath) {
+ mTextureName = aTexturePath;
+ mHash = getKey(aTexturePath).hashCode();
+ GregTech_API.sGTBlockIconload.add(this);
+ }
+
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon() {
+ return mHashToIconCache.get(mHash);
+ }
+
+ @Override
+ public void run() {
+ mHashToIconCache.put(getKey(mTextureName).hashCode(), GregTech_API.sBlockIcons.registerIcon(mTextureName));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/ShapedRecipe.java b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/ShapedRecipe.java
new file mode 100644
index 0000000000..f799623dd6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/objects/minecraft/ShapedRecipe.java
@@ -0,0 +1,251 @@
+package gtPlusPlus.api.objects.minecraft;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.ShapedOreRecipe;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class ShapedRecipe {
+
+ private static final String CHARS = "abcdefghijklmnop";
+ public ShapedOreRecipe mRecipe;
+
+ ItemStack[] mBlackList = null;
+
+ public ShapedRecipe(Object aInput1, Object aInput2, Object aInput3, Object aInput4, Object aInput5, Object aInput6,
+ Object aInput7, Object aInput8, Object aInput9, ItemStack aOutput) {
+
+ this(new Object[] { aInput1, aInput2, aInput3, aInput4, aInput5, aInput6, aInput7, aInput8, aInput9 }, aOutput);
+ }
+
+ public ShapedRecipe(Object[] aInputs, ItemStack aOutput) {
+ String aGridWhole = "";
+ String aGrid[] = new String[3];
+ char[] aChar = new char[9];
+ String[] aLoggingInfo = new String[9];
+
+ if (mBlackList == null) {
+ mBlackList = new ItemStack[] {};
+ }
+
+ // Just to be safe
+ try {
+ int xSlot = 0;
+ int xNull = 0;
+ for (Object u : aInputs) {
+ String mInfo = "";
+ if (u instanceof String) {
+ mInfo = (String) u;
+ Logger.RECIPE("Input slot " + xSlot++ + " contains " + mInfo);
+ } else if (u instanceof ItemStack || u instanceof Item) {
+ if (u instanceof Item) {
+ u = ItemUtils.getSimpleStack((Item) u);
+ }
+ mInfo = ((ItemStack) u).getDisplayName();
+ Logger.RECIPE("Input slot " + xSlot++ + " contains " + mInfo);
+ } else if (u == null) {
+ xNull++;
+ }
+ }
+ Logger.RECIPE("Found " + xNull + " null inputs.");
+ // Check if the output is invalid
+ if (aOutput != null && xNull < 9) {
+
+ for (ItemStack q : mBlackList) {
+ if (q != null) {
+ if (q.isItemEqual(aOutput)) {
+ Logger.RECIPE("Found recipe Alkalus is Debugging.");
+ }
+ }
+ }
+
+ Object[] mVarags2 = null;
+ Logger.RECIPE("Generating Shaped Crafting Recipe for " + aOutput.getDisplayName());
+
+ if (aInputs.length < 9 || aInputs.length > 9) {
+ Logger.RECIPE(
+ "[Fix] Recipe for " + aOutput.getDisplayName()
+ + " has incorrect number of inputs. Size: "
+ + aInputs.length
+ + ".");
+ }
+
+ // Build a Pair for each slot
+ AutoMap<Pair<Character, Object>> aRecipePairs = new AutoMap<>();
+ int aCharSlot = 0;
+ int aMemSlot = 0;
+ int aInfoSlot = 0;
+ for (Object stack : aInputs) {
+ if (stack != null) {
+ String mInfo = "";
+ if (stack instanceof String) {
+ mInfo = (String) stack;
+ } else if (stack instanceof ItemStack || stack instanceof Item) {
+ if (stack instanceof Item) {
+ stack = ItemUtils.getSimpleStack((Item) stack);
+ }
+ mInfo = ((ItemStack) stack).getDisplayName();
+ }
+ aRecipePairs.put(new Pair<>(CHARS.charAt(aCharSlot), stack));
+ Logger.RECIPE(
+ "Storing '" + CHARS.charAt(aCharSlot)
+ + "' with an object of type "
+ + stack.getClass()
+ .getSimpleName()
+ + " and a value of "
+ + mInfo);
+ aChar[aMemSlot++] = CHARS.charAt(aCharSlot);
+ aCharSlot++;
+ aLoggingInfo[aInfoSlot++] = mInfo;
+ } else {
+ aRecipePairs.put(new Pair<>(' ', (ItemStack) null));
+ Logger.RECIPE("Storing ' ' with an object of type null");
+ aChar[aMemSlot++] = ' ';
+ aLoggingInfo[aInfoSlot++] = "Empty";
+ }
+ }
+
+ Logger.RECIPE(aRecipePairs.size() + " Char|Object pairs registered for recipe.");
+ // If we have enough valid slots, iterate them and build a String which represents the entire grid.
+ // If this String is the correct length, we will split it into thirds and build the grid String array.
+ if (aRecipePairs.size() == 9) {
+
+ for (Pair<Character, Object> h : aRecipePairs) {
+ if (h.getKey() != null) {
+ aGridWhole += String.valueOf(h.getKey());
+ Logger.RECIPE("Adding '" + String.valueOf(h.getKey()) + "' to aGridWhole.");
+ }
+ }
+
+ Logger.RECIPE("aGridWhole: " + aGridWhole + " | size: " + aGridWhole.length());
+
+ // Build crafting grid
+ if (aGridWhole.length() == 9) {
+ Logger.RECIPE("aGridWhole size == 9");
+ aGrid[0] = "" + aGridWhole.charAt(0) + aGridWhole.charAt(1) + aGridWhole.charAt(2);
+ aGrid[1] = "" + aGridWhole.charAt(3) + aGridWhole.charAt(4) + aGridWhole.charAt(5);
+ aGrid[2] = "" + aGridWhole.charAt(6) + aGridWhole.charAt(7) + aGridWhole.charAt(8);
+ } else {
+ Logger.RECIPE(
+ "[Fix] Grid length for recipe outputting " + aOutput.getDisplayName() + " is not 9.");
+ }
+
+ // Rebuild the Map without spaces
+ aRecipePairs.clear();
+ aCharSlot = 0;
+
+ // The amount of spaces in the Varags that the Shape strings takes.
+ // Currently they are inserted as a single array into index 0.
+ final int KEY_COUNTER = 1;
+
+ int counter = KEY_COUNTER;
+ for (Object stack : aInputs) {
+ if (stack != null) {
+ String mInfo = "";
+ if (stack instanceof String) {
+ mInfo = (String) stack;
+ } else if (stack instanceof ItemStack || stack instanceof Item) {
+ if (stack instanceof Item) {
+ stack = ItemUtils.getSimpleStack((Item) stack);
+ }
+ mInfo = ((ItemStack) stack).getDisplayName();
+ }
+ aRecipePairs.put(new Pair<>(CHARS.charAt(aCharSlot), stack));
+ Logger.RECIPE(
+ "Registering Pair of '" + CHARS.charAt(aCharSlot)
+ + "' and a "
+ + stack.getClass()
+ .getSimpleName()
+ + " object. Object has a value of "
+ + mInfo);
+ aCharSlot++;
+ counter++;
+ }
+ }
+
+ Logger.RECIPE(
+ "Counter started at " + KEY_COUNTER
+ + ", counter is now at "
+ + counter
+ + ". Trying to create Varag array with a size of "
+ + (KEY_COUNTER + (counter - KEY_COUNTER) * 2));
+ // Counter started at 3, counter is now at 4. Trying to create Varag array with a size of 2
+
+ // Register the shaped grid straight to the varags
+ mVarags2 = new Object[(KEY_COUNTER + (counter - KEY_COUNTER) * 2)];
+ /*
+ * mVarags2[0] = aGrid[0]; mVarags2[1] = aGrid[1]; mVarags2[2] = aGrid[2];
+ */
+ mVarags2[0] = aGrid;
+
+ // Add Each Char, then Item to the varags, sequentially.
+ int counter2 = KEY_COUNTER;
+ for (Pair<Character, Object> r : aRecipePairs) {
+ char c = r.getKey();
+ Object o = r.getValue();
+
+ if (o instanceof ItemStack || o instanceof Item) {
+ if (o instanceof Item) {
+ o = ItemUtils.getSimpleStack((Item) o);
+ }
+ o = ((ItemStack) o).copy();
+ }
+
+ mVarags2[counter2] = (char) c;
+ mVarags2[counter2 + 1] = o;
+ counter2 += 2;
+ }
+
+ Logger.RECIPE("Recipe Summary");
+ Logger.RECIPE("+ = + = + = +");
+ Logger.RECIPE("= " + aChar[0] + " = " + aChar[1] + " = " + aChar[2] + " =");
+ Logger.RECIPE("+ = + = + = +");
+ Logger.RECIPE("= " + aChar[3] + " = " + aChar[4] + " = " + aChar[5] + " =");
+ Logger.RECIPE("+ = + = + = +");
+ Logger.RECIPE("= " + aChar[6] + " = " + aChar[7] + " = " + aChar[8] + " =");
+ Logger.RECIPE("+ = + = + = +");
+ for (int r = 0; r < 9; r++) {
+ if (aChar[r] != ' ') {
+ Logger.RECIPE("" + aChar[r] + " : " + aLoggingInfo[r]);
+ }
+ }
+
+ } else {
+ Logger.RECIPE(
+ "[Fix] Recipe for " + aOutput.getDisplayName() + " contains a strange number of inputs.");
+ }
+
+ // Try set the recipe for this object.
+ ShapedOreRecipe testRecipe = null;
+ try {
+ testRecipe = new ShapedOreRecipe(aOutput, mVarags2);
+ } catch (Throwable t) {
+ Logger.RECIPE("[Fix][0] Error thrown when making a ShapedOreRecipe object.");
+ t.printStackTrace();
+ }
+ if (testRecipe == null) {
+ this.mRecipe = null;
+ Logger.RECIPE("[Fix] Failed to generate a shaped recipe.");
+ } else {
+ this.mRecipe = testRecipe;
+ Logger.RECIPE("Generated a shaped recipe successfully.");
+ }
+ }
+
+ // Output was not valid
+ else {
+ this.mRecipe = null;
+ Logger.RECIPE("[Fix] Failed to generate a shaped recipe. Output was not valid.");
+ }
+
+ } catch (Throwable t) {
+ this.mRecipe = null;
+ Logger.RECIPE("[Fix][1] Error thrown when making a ShapedOreRecipe object.");
+ t.printStackTrace();
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/recipe/ChemicalPlantFrontend.java b/gtpp/src/main/java/gtPlusPlus/api/recipe/ChemicalPlantFrontend.java
new file mode 100644
index 0000000000..beede78173
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/recipe/ChemicalPlantFrontend.java
@@ -0,0 +1,68 @@
+package gtPlusPlus.api.recipe;
+
+import static net.minecraft.util.EnumChatFormatting.GRAY;
+
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+import gregtech.nei.GT_NEI_DefaultHandler;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class ChemicalPlantFrontend extends RecipeMapFrontend {
+
+ public ChemicalPlantFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return UIHelper.getGridPositions(itemInputCount, 7, 6, itemInputCount, 1);
+ }
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return UIHelper.getGridPositions(itemOutputCount, 106, 6, 2);
+ }
+
+ @Override
+ public List<Pos2d> getFluidInputPositions(int fluidInputCount) {
+ return UIHelper.getGridPositions(fluidInputCount, 7, 41, fluidInputCount, 1);
+ }
+
+ @Override
+ public List<Pos2d> getFluidOutputPositions(int fluidOutputCount) {
+ return UIHelper.getGridPositions(fluidOutputCount, 142, 6, 1, fluidOutputCount);
+ }
+
+ @Override
+ protected List<String> handleNEIItemInputTooltip(List<String> currentTip,
+ GT_NEI_DefaultHandler.FixedPositionedStack pStack) {
+ if (ItemUtils.isCatalyst(pStack.item)) {
+ currentTip.add(GRAY + "Does not always get consumed in the process");
+ currentTip.add(GRAY + "Higher tier pipe casings allow this item to last longer");
+ } else {
+ super.handleNEIItemInputTooltip(currentTip, pStack);
+ }
+ return currentTip;
+ }
+
+ @Override
+ protected void drawNEIOverlayForInput(GT_NEI_DefaultHandler.FixedPositionedStack stack) {
+ if (ItemUtils.isCatalyst(stack.item)) {
+ drawNEIOverlayText("NC*", stack);
+ } else {
+ super.drawNEIOverlayForInput(stack);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeCategories.java b/gtpp/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeCategories.java
new file mode 100644
index 0000000000..310f6f540d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeCategories.java
@@ -0,0 +1,17 @@
+package gtPlusPlus.api.recipe;
+
+import static gregtech.api.recipe.RecipeCategory.createIcon;
+
+import gregtech.api.enums.Mods;
+import gregtech.api.recipe.RecipeCategory;
+import gregtech.api.recipe.RecipeCategoryHolder;
+
+public class GTPPRecipeCategories {
+
+ @RecipeCategoryHolder
+ public static final RecipeCategory absNonAlloyRecipes = new RecipeCategory(
+ "gtpp.recipe.category.abs_non_alloy_recipes",
+ GTPPRecipeMaps.alloyBlastSmelterRecipes,
+ builder -> builder.setDisplayImage(
+ createIcon(Mods.GTPlusPlus.getResourcePath("textures", "gui", "picture", "abs_non_alloy_recipes.png"))));
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeMaps.java b/gtpp/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeMaps.java
new file mode 100644
index 0000000000..d2171d1bdd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/recipe/GTPPRecipeMaps.java
@@ -0,0 +1,232 @@
+package gtPlusPlus.api.recipe;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import net.minecraft.util.StatCollector;
+
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBuilder;
+import gregtech.api.recipe.maps.FluidOnlyFrontend;
+import gregtech.api.recipe.maps.FuelBackend;
+import gregtech.api.recipe.maps.LargeNEIFrontend;
+import gregtech.api.util.GT_Utility;
+import gregtech.nei.formatter.FuelSpecialValueFormatter;
+import gregtech.nei.formatter.HeatingCoilSpecialValueFormatter;
+import gregtech.nei.formatter.SimpleSpecialValueFormatter;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntityTreeFarm;
+
+public class GTPPRecipeMaps {
+
+ public static final RecipeMap<RecipeMapBackend> cokeOvenRecipes = RecipeMapBuilder.of("gtpp.recipe.cokeoven")
+ .maxIO(2, 9, 1, 1)
+ .minInputs(1, 0)
+ .progressBar(GT_UITextures.PROGRESSBAR_SIFT, ProgressBar.Direction.DOWN)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> multiblockMassFabricatorRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.matterfab2")
+ .maxIO(2, 0, 1, 1)
+ .build();
+ public static final RecipeMap<FuelBackend> rocketFuels = RecipeMapBuilder
+ .of("gtpp.recipe.rocketenginefuel", FuelBackend::new)
+ .maxIO(0, 0, 1, 0)
+ .neiSpecialInfoFormatter(
+ recipeInfo -> Collections.singletonList(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.nei.fuel",
+ GT_Utility.formatNumbers(recipeInfo.recipe.mSpecialValue * 3000L))))
+ .build();
+ public static final RecipeMap<RecipeMapBackend> quantumForceTransformerRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.quantumforcesmelter")
+ .maxIO(6, 6, 6, 6)
+ .minInputs(1, 0)
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .neiSpecialInfoFormatter(new SimpleSpecialValueFormatter("GT5U.nei.tier"))
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> chemicalDehydratorRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.chemicaldehydrator")
+ .maxIO(2, 9, 1, 1)
+ .progressBar(GT_UITextures.PROGRESSBAR_SIFT, ProgressBar.Direction.DOWN)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> vacuumFurnaceRecipes = RecipeMapBuilder.of("gtpp.recipe.vacfurnace")
+ .maxIO(9, 9, 3, 3)
+ .minInputs(1, 0)
+ .neiSpecialInfoFormatter(HeatingCoilSpecialValueFormatter.INSTANCE)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> alloyBlastSmelterRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.alloyblastsmelter")
+ .maxIO(9, 9, 3, 3)
+ .minInputs(1, 0)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> liquidFluorineThoriumReactorRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.lftr")
+ .maxIO(0, 0, 6, 6)
+ .minInputs(0, 2)
+ .frontend(FluidOnlyFrontend::new)
+ .neiSpecialInfoFormatter(recipeInfo -> {
+ final long eut = recipeInfo.recipe.mSpecialValue;
+ final int duration = recipeInfo.recipe.mDuration;
+ return Arrays.asList(
+ StatCollector.translateToLocalFormatted("gtpp.nei.lftr.power", GT_Utility.formatNumbers(eut)),
+ StatCollector
+ .translateToLocalFormatted("gtpp.nei.lftr.dynamo", MathUtils.formatNumbers(duration * eut)),
+ StatCollector
+ .translateToLocalFormatted("gtpp.nei.lftr.total", MathUtils.formatNumbers(duration * eut * 4)));
+ })
+ .build();
+ public static final RecipeMap<RecipeMapBackend> nuclearSaltProcessingPlantRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.nuclearsaltprocessingplant")
+ .maxIO(1, 6, 2, 3)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> millingRecipes = RecipeMapBuilder.of("gtpp.recipe.oremill")
+ .maxIO(3, 1, 0, 0)
+ .minInputs(1, 0)
+ .frontend(MillingFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> fissionFuelProcessingRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.fissionfuel")
+ .maxIO(0, 0, 6, 1)
+ .frontend(FluidOnlyFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> coldTrapRecipes = RecipeMapBuilder.of("gtpp.recipe.coldtrap")
+ .maxIO(2, 9, 1, 1)
+ .progressBar(GT_UITextures.PROGRESSBAR_SIFT, ProgressBar.Direction.DOWN)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> reactorProcessingUnitRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.reactorprocessingunit")
+ .maxIO(2, 9, 1, 1)
+ .progressBar(GT_UITextures.PROGRESSBAR_SIFT, ProgressBar.Direction.DOWN)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> simpleWasherRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.simplewasher")
+ .maxIO(1, 1, 1, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CAULDRON : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> molecularTransformerRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.moleculartransformer")
+ .maxIO(1, 1, 0, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_MICROSCOPE
+ : null)
+ .neiHandlerInfo(
+ builder -> builder
+ .setDisplayStack(ItemUtils.getItemStackFromFQRN("AdvancedSolarPanel:BlockMolecularTransformer", 1)))
+ .build();
+ public static final RecipeMap<RecipeMapBackend> chemicalPlantRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.fluidchemicaleactor")
+ .maxIO(4, 6, 4, 3)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isFluid) {
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_VIAL_2;
+ }
+ return GT_UITextures.OVERLAY_SLOT_MOLECULAR_3;
+ }
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_VIAL_1;
+ }
+ return GT_UITextures.OVERLAY_SLOT_MOLECULAR_1;
+ })
+ .progressBar(GTPP_UITextures.PROGRESSBAR_FLUID_REACTOR, ProgressBar.Direction.CIRCULAR_CW)
+ .progressBarPos(82, 24)
+ .neiSpecialInfoFormatter(recipeInfo -> {
+ int tier = recipeInfo.recipe.mSpecialValue + 1;
+ String materialName = StatCollector.translateToLocal("gtpp.nei.chemplant.tier." + tier);
+ return Collections
+ .singletonList(StatCollector.translateToLocalFormatted("GT5U.nei.tier", tier + " - " + materialName));
+ })
+ .frontend(ChemicalPlantFrontend::new)
+ .build();
+ public static final RecipeMap<FuelBackend> rtgFuels = RecipeMapBuilder
+ .of("gtpp.recipe.RTGgenerators", FuelBackend::new)
+ .maxIO(1, 0, 0, 0)
+ .neiSpecialInfoFormatter(new SimpleSpecialValueFormatter("gtpp.nei.rtg.days", 365))
+ .build();
+ public static final RecipeMap<RecipeMapBackend> thermalBoilerRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.thermalgeneratorfuel")
+ .maxIO(0, 9, 2, 3)
+ .frontend(ThermalBoilerFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> solarTowerRecipes = RecipeMapBuilder.of("gtpp.recipe.solartower")
+ .maxIO(0, 0, 1, 1)
+ .neiSpecialInfoFormatter(
+ recipeInfo -> Arrays.asList(
+ StatCollector.translateToLocal("gtpp.nei.solar_tower.1"),
+ StatCollector.translateToLocal("gtpp.nei.solar_tower.2"),
+ StatCollector.translateToLocal("gtpp.nei.solar_tower.3")))
+ .frontend(FluidOnlyFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> cyclotronRecipes = RecipeMapBuilder.of("gtpp.recipe.cyclotron")
+ .maxIO(9, 9, 1, 1)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> fishPondRecipes = RecipeMapBuilder.of("gtpp.recipe.fishpond")
+ .maxIO(1, 1, 0, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CAULDRON : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> spargeTowerFakeRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.spargetower")
+ .maxIO(0, 0, 9, 9)
+ .disableRegisterNEI()
+ .build();
+ public static final RecipeMap<RecipeMapBackend> advancedFreezerRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.cryogenicfreezer")
+ .maxIO(1, 1, 2, 1)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> centrifugeNonCellRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.multicentrifuge")
+ .maxIO(6, 6, 6, 6)
+ .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> electrolyzerNonCellRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.multielectro")
+ .maxIO(6, 6, 6, 6)
+ .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> mixerNonCellRecipes = RecipeMapBuilder.of("gtpp.recipe.multimixer")
+ .maxIO(9, 9, 6, 6)
+ .progressBar(GT_UITextures.PROGRESSBAR_MIXER, ProgressBar.Direction.CIRCULAR_CW)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> chemicalDehydratorNonCellRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.multidehydrator")
+ .maxIO(6, 9, 3, 3)
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<FuelBackend> semiFluidFuels = RecipeMapBuilder
+ .of("gtpp.recipe.semifluidgeneratorfuels", FuelBackend::new)
+ .maxIO(0, 0, 1, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> flotationCellRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.flotationcell")
+ .maxIO(6, 0, 1, 1)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> treeGrowthSimulatorFakeRecipes = RecipeMapBuilder
+ .of("gtpp.recipe.treefarm")
+ .maxIO(
+ GregtechMetaTileEntityTreeFarm.Mode.values().length,
+ GregtechMetaTileEntityTreeFarm.Mode.values().length,
+ 0,
+ 0)
+ .minInputs(1, 0)
+ .useSpecialSlot()
+ .frontend(TGSFrontend::new)
+ .build();
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/recipe/MillingFrontend.java b/gtpp/src/main/java/gtPlusPlus/api/recipe/MillingFrontend.java
new file mode 100644
index 0000000000..26e2ab2ec9
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/recipe/MillingFrontend.java
@@ -0,0 +1,46 @@
+package gtPlusPlus.api.recipe;
+
+import static net.minecraft.util.EnumChatFormatting.GRAY;
+
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.GT_NEI_DefaultHandler;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class MillingFrontend extends RecipeMapFrontend {
+
+ public MillingFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ protected List<String> handleNEIItemInputTooltip(List<String> currentTip,
+ GT_NEI_DefaultHandler.FixedPositionedStack pStack) {
+ if (ItemUtils.isMillingBall(pStack.item)) {
+ currentTip.add(GRAY + StatCollector.translateToLocal("gtpp.nei.milling.not_consumed"));
+ } else {
+ super.handleNEIItemInputTooltip(currentTip, pStack);
+ }
+ return currentTip;
+ }
+
+ @Override
+ protected void drawNEIOverlayForInput(GT_NEI_DefaultHandler.FixedPositionedStack stack) {
+ if (ItemUtils.isMillingBall(stack.item)) {
+ drawNEIOverlayText("NC*", stack);
+ } else {
+ super.drawNEIOverlayForInput(stack);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/recipe/TGSFrontend.java b/gtpp/src/main/java/gtPlusPlus/api/recipe/TGSFrontend.java
new file mode 100644
index 0000000000..e57ebaf5f9
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/recipe/TGSFrontend.java
@@ -0,0 +1,147 @@
+package gtPlusPlus.api.recipe;
+
+import java.awt.Rectangle;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+import gregtech.nei.GT_NEI_DefaultHandler;
+import gregtech.nei.RecipeDisplayInfo;
+import gregtech.nei.formatter.INEISpecialInfoFormatter;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntityTreeFarm;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntityTreeFarm.Mode;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class TGSFrontend extends RecipeMapFrontend {
+
+ private static final int SLOT_SIZE = 18;
+ private static final int CENTER_X = 90;
+ private static final int SPECIAL_X = CENTER_X - SLOT_SIZE / 2;
+ private static final int SPECIAL_Y = 9;
+ private static final int INPUTS_X = CENTER_X - SLOT_SIZE * 3;
+ private static final int INPUTS_Y = SPECIAL_Y + SLOT_SIZE + SLOT_SIZE / 2;
+ private static final int OUTPUTS_X = CENTER_X + SLOT_SIZE;
+ private static final int OUTPUTS_Y = INPUTS_Y;
+
+ public TGSFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder, NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(
+ uiPropertiesBuilder
+ .addNEITransferRect(
+ new Rectangle(INPUTS_X + SLOT_SIZE * 2, INPUTS_Y + SLOT_SIZE / 2, SLOT_SIZE * 2, SLOT_SIZE))
+ .progressBarPos(new Pos2d(CENTER_X - 10, INPUTS_Y + SLOT_SIZE / 2)),
+ neiPropertiesBuilder.neiSpecialInfoFormatter(new TGSSpecialValueFormatter()));
+ }
+
+ @Override
+ protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {
+ // Do not.
+ }
+
+ @Override
+ public Pos2d getSpecialItemPosition() {
+ return new Pos2d(SPECIAL_X, SPECIAL_Y);
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return UIHelper.getGridPositions(Mode.values().length, INPUTS_X, INPUTS_Y, 2);
+ }
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return UIHelper.getGridPositions(Mode.values().length, OUTPUTS_X, OUTPUTS_Y, 2);
+ }
+
+ private static final String[] tooltipInputs = { StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.saw"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.cutter"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.shears"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.knife") };
+
+ private static final String[] tooltipOutputs = { StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.needsSaw"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.needsCutter"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.needsShears"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.needsKnife") };
+ private static final String tooltipSapling = StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.sapling");
+ private static final String tooltipMultiplier = StatCollector.translateToLocal("gtpp.nei.tgs.tooltip.multiplier");
+
+ @Override
+ public List<String> handleNEIItemTooltip(ItemStack stack, List<String> currentTip,
+ GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) {
+
+ /*
+ * This gets a little complicated, because we want to assign tooltips to inputs/outputs based on which mode
+ * (saw, shears, etc.) they correspond to. But CachedDefaultRecipe does not retain this information for us. This
+ * is because some recipes don't output any items for some modes. For example, if a recipe only yields logs and
+ * leaves, then the outputs of GT_Recipe will be {log, null, leaves}. However, in CachedDefaultRecipe this gets
+ * condensed to just {log, leaves}, with null values omitted. So to figure out which item came from which mode,
+ * we need to step through both of these arrays simultaneously and match non-null inputs/outputs in GT_Recipe to
+ * inputs/outputs in CachedDefaultRecipe.
+ */
+
+ // The last input in neiCachedRecipe is always the special slot, this is the input sapling.
+ if (stack == neiCachedRecipe.mInputs.get(neiCachedRecipe.mInputs.size() - 1).item) {
+ currentTip.add(EnumChatFormatting.YELLOW + tooltipSapling);
+ super.handleNEIItemTooltip(stack, currentTip, neiCachedRecipe);
+ return currentTip;
+ }
+
+ GT_Recipe.GT_Recipe_WithAlt recipe = (GT_Recipe.GT_Recipe_WithAlt) neiCachedRecipe.mRecipe;
+
+ // Inputs
+ int slot = 0;
+ for (int mode = 0; mode < Mode.values().length; ++mode) {
+ if (mode < recipe.mOreDictAlt.length && recipe.mOreDictAlt[mode] != null) {
+ // There is a valid input in this mode.
+ if (slot < neiCachedRecipe.mInputs.size() && stack == neiCachedRecipe.mInputs.get(slot).item) {
+ int toolMultiplier = GregtechMetaTileEntityTreeFarm.getToolMultiplier(stack, Mode.values()[mode]);
+ currentTip.add(EnumChatFormatting.YELLOW + tooltipInputs[mode]);
+ if (toolMultiplier > 0) {
+ currentTip.add(EnumChatFormatting.YELLOW + tooltipMultiplier + " " + toolMultiplier + "x");
+ }
+ return currentTip;
+ }
+ ++slot;
+ }
+ }
+
+ // Outputs
+ slot = 0;
+ for (int mode = 0; mode < Mode.values().length; ++mode) {
+ if (mode < recipe.mOutputs.length && recipe.mOutputs[mode] != null) {
+ // There is a valid output in this mode.
+ if (slot < neiCachedRecipe.mOutputs.size() && stack == neiCachedRecipe.mOutputs.get(slot).item) {
+ currentTip.add(EnumChatFormatting.YELLOW + tooltipOutputs[mode]);
+ return currentTip;
+ }
+ ++slot;
+ }
+ }
+
+ return currentTip;
+ }
+
+ private static class TGSSpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ return Arrays.asList(
+ StatCollector.translateToLocal("gtpp.nei.tgs.info-1"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.info-2"),
+ StatCollector.translateToLocal("gtpp.nei.tgs.info-3"));
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/api/recipe/ThermalBoilerFrontend.java b/gtpp/src/main/java/gtPlusPlus/api/recipe/ThermalBoilerFrontend.java
new file mode 100644
index 0000000000..93974b9f9a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/api/recipe/ThermalBoilerFrontend.java
@@ -0,0 +1,57 @@
+package gtPlusPlus.api.recipe;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.maps.LargeNEIFrontend;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+import gregtech.nei.RecipeDisplayInfo;
+import gregtech.nei.formatter.INEISpecialInfoFormatter;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class ThermalBoilerFrontend extends LargeNEIFrontend {
+
+ private static final int tileSize = 18;
+ private static final int xOrigin = 16;
+ private static final int yOrigin = 8 + tileSize; // Aligned with second row of output items.
+ private static final int maxInputs = 3;
+
+ public ThermalBoilerFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(
+ uiPropertiesBuilder,
+ neiPropertiesBuilder.neiSpecialInfoFormatter(new ThermalBoilerSpecialValueFormatter()));
+ }
+
+ @Override
+ public List<Pos2d> getFluidInputPositions(int fluidInputCount) {
+ return UIHelper
+ .getGridPositions(fluidInputCount, xOrigin + tileSize * (maxInputs - fluidInputCount), yOrigin, maxInputs);
+ }
+
+ private static class ThermalBoilerSpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ // TODO: Translation.
+ List<String> result = new ArrayList<>();
+ result.add("Steam output shown");
+ result.add("at maximum efficiency.");
+
+ if (recipeInfo.recipe.mSpecialValue == -1) {
+ result.add("Without a Lava Filter,");
+ result.add("only Obsidian is produced.");
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/ModBlocks.java b/gtpp/src/main/java/gtPlusPlus/core/block/ModBlocks.java
new file mode 100644
index 0000000000..634a073b02
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/ModBlocks.java
@@ -0,0 +1,104 @@
+package gtPlusPlus.core.block;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.fluids.Fluid;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.general.BlockCompressedObsidian;
+import gtPlusPlus.core.block.general.FluidTankInfinite;
+import gtPlusPlus.core.block.general.HellFire;
+import gtPlusPlus.core.block.general.LightGlass;
+import gtPlusPlus.core.block.general.MiningExplosives;
+import gtPlusPlus.core.block.general.antigrief.BlockWitherProof;
+import gtPlusPlus.core.block.machine.CircuitProgrammer;
+import gtPlusPlus.core.block.machine.DecayablesChest;
+import gtPlusPlus.core.block.machine.FishTrap;
+import gtPlusPlus.core.block.machine.Machine_PestKiller;
+import gtPlusPlus.core.block.machine.Machine_PooCollector;
+import gtPlusPlus.core.block.machine.Machine_ProjectTable;
+import gtPlusPlus.core.block.machine.Machine_SuperJukebox;
+import gtPlusPlus.core.block.machine.VolumetricFlaskSetter;
+import gtPlusPlus.core.fluids.FluidRegistryHandler;
+
+public final class ModBlocks {
+
+ public static Block blockCircuitProgrammer;
+ public static Block blockVolumetricFlaskSetter;
+
+ public static Block blockFishTrap;
+ public static Block blockDecayablesChest;
+
+ public static Block blockCasingsMisc;
+ public static Block blockCasings2Misc;
+ public static Block blockCasings3Misc;
+ public static Block blockCasings4Misc;
+ public static Block blockCasings5Misc;
+ public static Block blockCasings6Misc;
+ public static Block blockCasingsTieredGTPP;
+ public static Block blockSpecialMultiCasings;
+ public static Block blockSpecialMultiCasings2;
+ public static Block blockCustomMachineCasings;
+ public static Block blockCustomPipeGearCasings;
+
+ public static Block MatterFabricatorEffectBlock;
+
+ public static Fluid fluidSludge = new Fluid("fluid.sludge");
+ public static Block blockFluidSludge;
+
+ public static Block blockMiningExplosive;
+
+ public static Block blockHellfire;
+ public static Block blockInfiniteFLuidTank;
+ public static Block blockProjectTable;
+ public static Block blockWitherGuard;
+ public static Block blockCompressedObsidian;
+
+ public static Block blockPlayerDoorWooden;
+ public static Block blockPlayerDoorIron;
+ public static Block blockPlayerDoorCustom_Glass;
+ public static Block blockPlayerDoorCustom_Ice;
+ public static Block blockPlayerDoorCustom_Cactus;
+
+ public static Block blockCustomJukebox;
+
+ public static Block blockPooCollector;
+
+ public static Block blockPestKiller;
+
+ public static void init() {
+ Logger.INFO("Initializing Blocks.");
+
+ registerBlocks();
+ }
+
+ public static void registerBlocks() {
+
+ Logger.INFO("Registering Blocks.");
+ MatterFabricatorEffectBlock = new LightGlass(false);
+
+ // Fluids
+ FluidRegistryHandler.registerFluids();
+
+ // Workbench
+ blockFishTrap = new FishTrap();
+ blockInfiniteFLuidTank = new FluidTankInfinite();
+ blockMiningExplosive = new MiningExplosives();
+ blockHellfire = new HellFire();
+ blockProjectTable = new Machine_ProjectTable();
+ blockWitherGuard = new BlockWitherProof();
+ blockCompressedObsidian = new BlockCompressedObsidian();
+
+ blockCircuitProgrammer = new CircuitProgrammer();
+
+ blockDecayablesChest = new DecayablesChest();
+
+ blockCustomJukebox = new Machine_SuperJukebox();
+
+ blockPooCollector = new Machine_PooCollector();
+
+ blockPestKiller = new Machine_PestKiller();
+
+ blockVolumetricFlaskSetter = new VolumetricFlaskSetter();
+
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/base/BasicBlock.java b/gtpp/src/main/java/gtPlusPlus/core/block/base/BasicBlock.java
new file mode 100644
index 0000000000..d39c194dfd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/base/BasicBlock.java
@@ -0,0 +1,70 @@
+package gtPlusPlus.core.block.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+public class BasicBlock extends BlockContainer {
+
+ public BasicBlock(BlockTypes type, final String unlocalizedName, final Material material, final int harvestLevel) {
+ super(material);
+ this.setBlockName(Utils.sanitizeString(unlocalizedName));
+
+ if (type != BlockTypes.ORE && !unlocalizedName.toLowerCase()
+ .contains("ore")) {
+ this.setBlockTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ }
+
+ this.setCreativeTab(AddToCreativeTab.tabBlock);
+ this.setResistance(6.0F);
+ this.setLightLevel(0.0F);
+ this.setHardness(1.0f * harvestLevel);
+ this.setHarvestLevel("pickaxe", harvestLevel);
+ this.setStepSound(soundTypeMetal);
+ }
+
+ public static enum BlockTypes {
+
+ STANDARD("blockBlock", "pickaxe", soundTypeMetal),
+ FRAME("blockFrameGt", "wrench", soundTypeMetal),
+ ORE("blockStone", "pickaxe", soundTypeStone);
+
+ private final String TEXTURE_NAME;
+ private final String HARVEST_TOOL;
+ private final SoundType soundOfBlock;
+
+ BlockTypes(final String textureName, final String harvestTool, final SoundType blockSound) {
+ this.TEXTURE_NAME = textureName;
+ this.HARVEST_TOOL = harvestTool;
+ this.soundOfBlock = blockSound;
+ }
+
+ public String getTexture() {
+ return this.TEXTURE_NAME;
+ }
+
+ public String getHarvestTool() {
+ return this.HARVEST_TOOL;
+ }
+
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World p_149915_1_, final int p_149915_2_) {
+ return null;
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/base/BasicTileBlockWithTooltip.java b/gtpp/src/main/java/gtPlusPlus/core/block/base/BasicTileBlockWithTooltip.java
new file mode 100644
index 0000000000..c39565ea41
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/base/BasicTileBlockWithTooltip.java
@@ -0,0 +1,322 @@
+package gtPlusPlus.core.block.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+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.creativetab.CreativeTabs;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+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;
+
+import appeng.core.CreativeTab;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.CubicObject;
+import gtPlusPlus.api.objects.minecraft.SafeTexture;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.InventoryUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public abstract class BasicTileBlockWithTooltip extends BlockContainer implements ITileTooltip {
+
+ /**
+ * Each mapped object holds the data for the six sides.
+ */
+ @SideOnly(Side.CLIENT)
+ private AutoMap<CubicObject<SafeTexture>> mSidedTextureArray;
+
+ /**
+ * Holds the data for the six sides, each side holds an array of data for each respective meta.
+ */
+ @SideOnly(Side.CLIENT)
+ private AutoMap<CubicObject<String>> mSidedTexturePathArray;
+
+ /**
+ * Does this block have any meta at all?
+ */
+ public final boolean hasMeta() {
+ return getMetaCount() > 0;
+ }
+
+ /**
+ * The amount of meta this block has.
+ */
+ public abstract int getMetaCount();
+
+ /**
+ * Does this {@link Block} require special {@link ItemBlock} handling?
+ *
+ * @return The {@link Class} that will be used for this {@link Block}.
+ */
+ public Class<? extends ItemBlock> getItemBlockClass() {
+ return ItemBlock.class;
+ }
+
+ /**
+ * A lazy way to declare the unlocal name for the block, makes boilerplating easy.
+ *
+ * @return The internal name for this block.
+ */
+ public abstract String getUnlocalBlockName();
+
+ /**
+ * Lazy Boilerplating.
+ *
+ * @return Block Hardness.
+ */
+ protected abstract float initBlockHardness();
+
+ /**
+ * Lazy Boilerplating.
+ *
+ * @return Block Resistance.
+ */
+ protected abstract float initBlockResistance();
+
+ /**
+ * Lazy Boilerplating.
+ *
+ * @return The {@link CreativeTab} this Block is shown on.
+ */
+ protected abstract CreativeTabs initCreativeTab();
+
+ /**
+ * The ID used by the {@link ITileTooltip} handler. Return -1 if you are not providing a custom {@link ItemBlock} in
+ * {@link #getItemBlockClass}().
+ */
+ @Override
+ public abstract int getTooltipID();
+
+ public BasicTileBlockWithTooltip(Material aBlockMat) {
+ super(aBlockMat);
+ // Use Abstract method values
+ this.setHardness(initBlockHardness());
+ this.setResistance(initBlockResistance());
+ this.setBlockName(getUnlocalBlockName());
+ this.setCreativeTab(initCreativeTab());
+ // Register the block last.
+ GameRegistry.registerBlock(this, getItemBlockClass(), getUnlocalBlockName());
+ Logger.INFO("Registered " + getTileEntityName() + ".");
+ if (Utils.isClient()) {
+ // Handle Textures
+ handleTextures();
+ }
+ }
+
+ /**
+ * The name of the Tile Entity.
+ */
+ protected abstract String getTileEntityName();
+
+ /**
+ * The String used for texture pathing.
+ *
+ * @return Sanitized {@link String}, containing no spaces or illegal characters.
+ */
+ private String getTileEntityNameForTexturePathing() {
+ return Utils.sanitizeString(getTileEntityName().replace(" ", ""));
+ }
+
+ /**
+ * An array of CubicObjects, one for each meta, else just a single cell array. Expected to be null regularly, as the
+ * default texture handling should suffice. Handy if re-using textures or using a non-standard structure for them.
+ * FULL texture path must be used, inclusive of the MODID and a colon.
+ */
+ public CubicObject<String>[] getCustomTextureDirectoryObject() {
+ return null;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return mSidedTextureArray.get(aMeta)
+ .get(ForgeDirection.getOrientation(ordinalSide))
+ .getIcon();
+ }
+
+ @Override
+ public IIcon getIcon(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ return super.getIcon(aWorld, aX, aY, aZ, ordinalSide);
+ }
+
+ @SideOnly(Side.CLIENT)
+ private void handleTextures() {
+
+ Logger.INFO("[TeTexture] Building Texture Maps for " + getTileEntityName() + ".");
+
+ // Init on the Client side only, to prevent Field initialisers existing in the Server side bytecode.
+ mSidedTextureArray = new AutoMap<>();
+ mSidedTexturePathArray = new AutoMap<>();
+
+ // Store them in forge order
+ // DOWN, UP, NORTH, SOUTH, WEST, EAST
+
+ // Default Path Name, this will make us look inside 'miscutils\textures\blocks'
+ final String aPrefixTexPath = GTPlusPlus.ID + ":";
+ // Default Path Name, this will make us look in the subdirectory for this Tile Entity.
+ final String aTexPathMid = "TileEntities" + CORE.SEPERATOR
+ + getTileEntityNameForTexturePathing()
+ + CORE.SEPERATOR;
+ // Construct a full path
+ String aTexPathBuilt = aPrefixTexPath + aTexPathMid;
+ // File Name Suffixes, without meta tags
+ String aStringBot;
+ String aStringTop;
+ String aStringBack;
+ String aStringFront;
+ String aStringLeft;
+ String aStringRight;
+ // Do we provide a matrix of custom data to be used for texture processing instead?
+ if (getCustomTextureDirectoryObject() != null) {
+ // Get custom provided texture data.
+ CubicObject<String>[] aDataMap = getCustomTextureDirectoryObject();
+ Logger.INFO("[TeTexture] Found custom texture data, using this instead. Size: " + aDataMap.length);
+ // Map each meta string data to the main map.
+ for (int i = 0; i < aDataMap.length; i++) {
+ mSidedTexturePathArray.put(aDataMap[i]);
+ Logger.INFO("Mapped value for meta " + i + ".");
+ }
+ } else {
+ Logger.INFO("[TeTexture] Processing " + (1 + getMetaCount()) + " sets.");
+ // Iterate once for each meta
+ for (int i = 0; i < (1 + getMetaCount()); i++) {
+
+ // File Name Suffixes, without meta tags
+ aStringBot = "Bottom";
+ aStringTop = "Top";
+ aStringBack = "Back";
+ aStringFront = "Front";
+ aStringLeft = "Left";
+ aStringRight = "Right";
+
+ // Add tails if we have meta
+ if (hasMeta()) {
+ aStringBot = aStringBot + "_" + i;
+ aStringTop = aStringTop + "_" + i;
+ aStringBack = aStringBack + "_" + i;
+ aStringFront = aStringFront + "_" + i;
+ aStringLeft = aStringLeft + "_" + i;
+ aStringRight = aStringRight + "_" + i;
+ }
+ // Append the full path
+ aStringBot = aTexPathBuilt + aStringBot;
+ aStringTop = aTexPathBuilt + aStringTop;
+ aStringBack = aTexPathBuilt + aStringBack;
+ aStringFront = aTexPathBuilt + aStringFront;
+ aStringLeft = aTexPathBuilt + aStringLeft;
+ aStringRight = aTexPathBuilt + aStringRight;
+ // Convenience Blob
+ CubicObject<String> aMetaBlob = new CubicObject<>(
+ aStringBot,
+ aStringTop,
+ aStringBack,
+ aStringFront,
+ aStringLeft,
+ aStringRight);
+ mSidedTexturePathArray.put(aMetaBlob);
+ Logger.INFO("[TeTexture] Added Texture Path data to map for meta " + i);
+ }
+ }
+ Logger.INFO("[TeTexture] Map size for pathing: " + mSidedTexturePathArray.size());
+
+ // Iteration Index
+ int aIndex = 0;
+
+ // Iterate each CubicObject, holding the six texture paths for each meta.
+ for (CubicObject<String> aMetaBlob : mSidedTexturePathArray) {
+ // Make a Safe Texture for each side
+ SafeTexture aBottom = SafeTexture.register(aMetaBlob.DOWN);
+ SafeTexture aTop = SafeTexture.register(aMetaBlob.UP);
+ SafeTexture aBack = SafeTexture.register(aMetaBlob.NORTH);
+ SafeTexture aFont = SafeTexture.register(aMetaBlob.SOUTH);
+ SafeTexture aWest = SafeTexture.register(aMetaBlob.WEST);
+ SafeTexture aEast = SafeTexture.register(aMetaBlob.EAST);
+ // Store them in an Array
+ SafeTexture[] aInjectBlob = new SafeTexture[] { aBottom, aTop, aBack, aFont, aWest, aEast };
+ // Convenience Blob
+ CubicObject<SafeTexture> aMetaBlob2 = new CubicObject<>(aInjectBlob);
+ // Store this Blob into
+ mSidedTextureArray.put(aMetaBlob2);
+ Logger.INFO("[TeTexture] Added SafeTexture data to map for meta " + (aIndex++));
+ }
+ Logger.INFO("[TeTexture] Map size for registration: " + mSidedTextureArray.size());
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void registerBlockIcons(final IIconRegister aRegisterer) {}
+
+ @Override
+ public abstract TileEntity createNewTileEntity(final World world, final int p_149915_2_);
+
+ /**
+ * Called when {@link #breakBlock}() is called, but before {@link InventoryUtils#dropInventoryItems} and the super
+ * call.
+ */
+ public void onBlockBreak() {}
+
+ @Override
+ public final void breakBlock(final World world, final int x, final int y, final int z, final Block block,
+ final int number) {
+ onBlockBreak();
+ InventoryUtils.dropInventoryItems(world, x, y, z, block);
+ super.breakBlock(world, x, y, z, block, number);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public final void getSubBlocks(Item aItem, CreativeTabs p_149666_2_, List aList) {
+ if (hasMeta()) {
+ for (int i = 0; i < getMetaCount(); i++) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, i, 1));
+ }
+ } else {
+ aList.add(ItemUtils.getSimpleStack(aItem));
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ /**
+ * Get the block's damage value (for use with pick block).
+ */
+ @Override
+ public int getDamageValue(World aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlockMetadata(aX, aY, aZ);
+ }
+
+ @Override
+ public Item getItemDropped(int meta, Random rand, int p_149650_3_) {
+ return ItemUtils.getSimpleStack(this, 1)
+ .getItem();
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
+ ArrayList<ItemStack> drops = new ArrayList<>();
+ drops.add(ItemUtils.simpleMetaStack(this, metadata, 1));
+ return drops;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/base/BlockBaseFluid.java b/gtpp/src/main/java/gtPlusPlus/core/block/base/BlockBaseFluid.java
new file mode 100644
index 0000000000..6772b71262
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/base/BlockBaseFluid.java
@@ -0,0 +1,102 @@
+package gtPlusPlus.core.block.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.Random;
+
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.BlockFluidClassic;
+import net.minecraftforge.fluids.Fluid;
+
+import cpw.mods.fml.client.FMLClientHandler;
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Mods;
+import gtPlusPlus.core.client.renderer.particle.EntityDropParticleFX;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockMeta;
+import gtPlusPlus.core.util.Utils;
+
+public class BlockBaseFluid extends BlockFluidClassic {
+
+ private final String name;
+ private final IIcon[] textureArray = new IIcon[6];
+
+ protected float particleRed = 1.0F;
+ protected float particleGreen = 1.0F;
+ protected float particleBlue = 1.0F;
+
+ public BlockBaseFluid(String materialName, Fluid fluid, Material material) {
+ super(fluid, material);
+ this.setLightOpacity(2);
+ this.name = Utils.sanitizeString(materialName);
+ this.setBlockName("fluid" + this.name);
+ this.setCreativeTab(AddToCreativeTab.tabBlock);
+ GameRegistry.registerBlock(this, ItemBlockMeta.class, "fluid" + this.name);
+ }
+
+ @Override
+ public boolean canCreatureSpawn(EnumCreatureType arg0, IBlockAccess arg1, int arg2, int arg3, int arg4) {
+ return false;
+ }
+
+ public boolean preInit() {
+ return true;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int ordinalSide, int meta) {
+ return ordinalSide <= 1 ? this.textureArray[0] : this.textureArray[1];
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister icon) {
+ this.textureArray[0] = icon.registerIcon(GTPlusPlus.ID + ":" + "fluid/" + "Fluid_" + this.name + "_Still");
+ this.textureArray[1] = icon.registerIcon(GTPlusPlus.ID + ":" + "fluid/" + "Fluid_" + this.name + "_Flow");
+ }
+
+ @Override
+ @Optional.Method(modid = Mods.Names.C_O_F_H_CORE)
+ @SideOnly(Side.CLIENT)
+ public void randomDisplayTick(World arg0, int arg1, int arg2, int arg3, Random arg4) {
+ super.randomDisplayTick(arg0, arg1, arg2, arg3, arg4);
+ double arg5 = arg1 + arg4.nextFloat();
+ double arg7 = arg2 - 1.05D;
+ double arg9 = arg3 + arg4.nextFloat();
+ if (super.density < 0) {
+ arg7 = arg2 + 2.1D;
+ }
+
+ if (arg4.nextInt(20) == 0
+ && arg0.isSideSolid(
+ arg1,
+ arg2 + super.densityDir,
+ arg3,
+ super.densityDir == -1 ? ForgeDirection.UP : ForgeDirection.DOWN)
+ && !arg0.getBlock(arg1, arg2 + 2 * super.densityDir, arg3)
+ .getMaterial()
+ .blocksMovement()) {
+ EntityDropParticleFX arg11 = new EntityDropParticleFX(
+ arg0,
+ arg5,
+ arg7,
+ arg9,
+ this.particleRed,
+ this.particleGreen,
+ this.particleBlue,
+ super.densityDir);
+ FMLClientHandler.instance()
+ .getClient().effectRenderer.addEffect(arg11);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/base/BlockBaseModular.java b/gtpp/src/main/java/gtPlusPlus/core/block/base/BlockBaseModular.java
new file mode 100644
index 0000000000..b07c6d1529
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/base/BlockBaseModular.java
@@ -0,0 +1,245 @@
+package gtPlusPlus.core.block.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockGtBlock;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BlockBaseModular extends BasicBlock {
+
+ protected Material blockMaterial;
+
+ protected int blockColour;
+ public BlockTypes thisBlock;
+ protected String thisBlockMaterial;
+ protected String thisBlockMaterialTranslatedName;
+ protected final String thisBlockType;
+
+ private static final HashMap<String, Block> sBlockCache = new HashMap<>();
+
+ public static Block getMaterialBlock(Material aMaterial, BlockTypes aType) {
+ return sBlockCache.get(aMaterial.getUnlocalizedName() + "." + aType.name());
+ }
+
+ public BlockBaseModular(final Material material, final BlockTypes blockType) {
+ this(material, blockType, material.getRgbAsHex());
+ }
+
+ public BlockBaseModular(final Material material, final BlockTypes blockType, final int colour) {
+ this(
+ material.getUnlocalizedName(),
+ material.getLocalizedName(),
+ net.minecraft.block.material.Material.iron,
+ blockType,
+ colour,
+ Math.min(Math.max(material.vTier, 1), 6));
+ blockMaterial = material;
+ registerComponent();
+ sBlockCache.put(material.getUnlocalizedName() + "." + blockType.name(), this);
+ thisBlockMaterialTranslatedName = material.getTranslatedName();
+ GT_LanguageManager.addStringLocalization("gtplusplus." + getUnlocalizedName() + ".name", getProperName());
+ }
+
+ protected BlockBaseModular(final String unlocalizedName, final String blockMaterialString,
+ final net.minecraft.block.material.Material vanillaMaterial, final BlockTypes blockType, final int colour,
+ final int miningLevel) {
+ super(blockType, unlocalizedName, vanillaMaterial, miningLevel);
+ this.setHarvestLevel(blockType.getHarvestTool(), miningLevel);
+ this.setBlockTextureName(GTPlusPlus.ID + ":" + blockType.getTexture());
+ this.blockColour = colour;
+ this.thisBlock = blockType;
+ this.thisBlockMaterial = blockMaterialString;
+ this.thisBlockType = blockType.name()
+ .toUpperCase();
+ this.setBlockName(this.getUnlocalizedProperName());
+ int fx = getBlockTypeMeta();
+ GameRegistry.registerBlock(
+ this,
+ ItemBlockGtBlock.class,
+ Utils.sanitizeString(blockType.getTexture() + unlocalizedName));
+ if (fx == 0) {
+ GT_OreDictUnificator
+ .registerOre("block" + unifyMaterialName(thisBlockMaterial), ItemUtils.getSimpleStack(this));
+ } else if (fx == 1) {
+ GT_OreDictUnificator
+ .registerOre("frameGt" + unifyMaterialName(thisBlockMaterial), ItemUtils.getSimpleStack(this));
+ } else if (fx == 2) {
+ GT_OreDictUnificator
+ .registerOre("frameGt" + unifyMaterialName(thisBlockMaterial), ItemUtils.getSimpleStack(this));
+ }
+ }
+
+ public static String unifyMaterialName(String rawMaterName) {
+ return rawMaterName.replace(" ", "")
+ .replace("-", "")
+ .replace("_", "");
+ }
+
+ public void registerComponent() {
+ Logger.MATERIALS("Attempting to register " + this.getUnlocalizedName() + ".");
+ if (this.blockMaterial == null) {
+ Logger.MATERIALS("Tried to register " + this.getUnlocalizedName() + " but the material was null.");
+ return;
+ }
+ String aName = blockMaterial.getUnlocalizedName();
+ // Register Component
+ Map<String, ItemStack> aMap = Material.mComponentMap.get(aName);
+ if (aMap == null) {
+ aMap = new HashMap<>();
+ }
+ int fx = getBlockTypeMeta();
+ String aKey = (fx == 0 ? OrePrefixes.block.name()
+ : (fx == 1 ? OrePrefixes.frameGt.name() : OrePrefixes.ore.name()));
+ ItemStack x = aMap.get(aKey);
+ if (x == null) {
+ aMap.put(aKey, ItemUtils.getSimpleStack(this));
+ Logger.MATERIALS("Registering a material component. Item: [" + aName + "] Map: [" + aKey + "]");
+ Material.mComponentMap.put(aName, aMap);
+ } else {
+ // Bad
+ Logger.MATERIALS("Tried to double register a material component.");
+ }
+ }
+
+ public int getBlockTypeMeta() {
+ if (this.thisBlockType.equals(
+ BlockTypes.STANDARD.name()
+ .toUpperCase())) {
+ return 0;
+ } else if (this.thisBlockType.equals(
+ BlockTypes.FRAME.name()
+ .toUpperCase())) {
+ return 1;
+ } else
+ if (this.thisBlockType.equals(
+ BlockTypes.ORE.name()
+ .toUpperCase())) {
+ return 2;
+ }
+ return 0;
+ }
+
+ /**
+ * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderBlockPass() {
+ if (this.thisBlock == BlockTypes.FRAME) {
+ return 1;
+ }
+ return 0;
+ }
+
+ public String getProperName() {
+ String tempIngot = null;
+ if (this.thisBlock == BlockTypes.STANDARD) {
+ tempIngot = "Block of %material";
+ } else if (this.thisBlock == BlockTypes.FRAME) {
+ tempIngot = "%material Frame Box";
+ } else if (this.thisBlock == BlockTypes.ORE) {
+ tempIngot = "%material Ore [Old]";
+ }
+ return tempIngot;
+ }
+
+ public String getUnlocalizedProperName() {
+ return getProperName().replace("%s", "%temp")
+ .replace("%material", this.thisBlockMaterial)
+ .replace("%temp", "%s");
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return GT_LanguageManager.getTranslation("gtplusplus." + getUnlocalizedName() + ".name")
+ .replace("%s", "%temp")
+ .replace("%material", this.thisBlockMaterialTranslatedName)
+ .replace("%temp", "%s");
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return "block." + blockMaterial.getUnlocalizedName()
+ + "."
+ + this.thisBlock.name()
+ .toLowerCase();
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public Material getMaterialEx() {
+ return this.blockMaterial;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister iIcon) {
+ if (!CORE.ConfigSwitches.useGregtechTextures || this.blockMaterial == null
+ || this.thisBlock == BlockTypes.ORE) {
+ this.blockIcon = iIcon.registerIcon(GTPlusPlus.ID + ":" + this.thisBlock.getTexture());
+ }
+ String metType = "9j4852jyo3rjmh3owlhw9oe";
+ if (this.blockMaterial != null) {
+ TextureSet u = this.blockMaterial.getTextureSet();
+ if (u != null) {
+ metType = u.mSetName;
+ }
+ }
+ metType = (metType.equals("9j4852jyo3rjmh3owlhw9oe") ? "METALLIC" : metType);
+ int tier = blockMaterial != null ? this.blockMaterial.vTier : 0;
+ String aType = (this.thisBlock == BlockTypes.FRAME) ? "frameGt" : (tier <= 4 ? "block1" : "block5");
+ this.blockIcon = iIcon.registerIcon(GregTech.ID + ":" + "materialicons/" + metType + "/" + aType);
+ }
+
+ @Override
+ public int colorMultiplier(final IBlockAccess par1IBlockAccess, final int par2, final int par3, final int par4) {
+
+ if (this.blockColour == 0) {
+ return MathUtils.generateSingularRandomHexValue();
+ }
+
+ return this.blockColour;
+ }
+
+ @Override
+ public int getRenderColor(final int aMeta) {
+ if (this.blockColour == 0) {
+ return MathUtils.generateSingularRandomHexValue();
+ }
+
+ return this.blockColour;
+ }
+
+ @Override
+ public int getBlockColor() {
+ if (this.blockColour == 0) {
+ return MathUtils.generateSingularRandomHexValue();
+ }
+
+ return this.blockColour;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/base/BlockBaseOre.java b/gtpp/src/main/java/gtPlusPlus/core/block/base/BlockBaseOre.java
new file mode 100644
index 0000000000..1813090810
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/base/BlockBaseOre.java
@@ -0,0 +1,217 @@
+package gtPlusPlus.core.block.base;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.FakePlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.GT_Mod;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.interfaces.ITexturedBlock;
+import gtPlusPlus.core.client.renderer.CustomOreBlockRenderer;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockOre;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_RenderedTexture;
+
+public class BlockBaseOre extends BasicBlock implements ITexturedBlock {
+
+ private final Material blockMaterial;
+ protected static boolean shouldFortune = false;
+ protected static boolean shouldSilkTouch = false;
+
+ public BlockBaseOre(final Material material, final BlockTypes blockType) {
+ super(
+ blockType,
+ Utils.sanitizeString(material.getUnlocalizedName()),
+ net.minecraft.block.material.Material.rock,
+ Math.min(Math.max(material.vTier, 1), 6));
+ int aMaterialTierForMining = Math.min(Math.max(material.vTier, 1), 6);
+ this.blockMaterial = material;
+ this.setHardness(1.0f * aMaterialTierForMining);
+ this.setResistance(6.0F);
+ this.setLightLevel(0.0F);
+ this.setHarvestLevel("pickaxe", aMaterialTierForMining);
+ this.setStepSound(soundTypeStone);
+ this.setBlockName("Ore" + Utils.sanitizeString(Utils.sanitizeString(material.getUnlocalizedName())));
+ this.setBlockTextureName("stone");
+ try {
+ GameRegistry.registerBlock(
+ this,
+ ItemBlockOre.class,
+ Utils.sanitizeString("ore" + Utils.sanitizeString(this.blockMaterial.getLocalizedName())));
+ GT_OreDictUnificator.registerOre(
+ "ore" + Utils.sanitizeString(this.blockMaterial.getLocalizedName()),
+ ItemUtils.getSimpleStack(this));
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ public Material getMaterialEx() {
+ return this.blockMaterial;
+ }
+
+ @Override
+ public int getRenderType() {
+ try {
+ if (CustomOreBlockRenderer.INSTANCE != null) {
+ return CustomOreBlockRenderer.INSTANCE.mRenderID;
+ }
+ return super.getRenderType();
+ } catch (NullPointerException n) {
+ return 0;
+ }
+ }
+
+ @Override
+ public IIcon getIcon(IBlockAccess aIBlockAccess, int aX, int aY, int aZ, int ordinalSide) {
+ return Blocks.stone.getIcon(0, 0);
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return Blocks.stone.getIcon(0, 0);
+ }
+
+ /**
+ * GT Texture Handler
+ */
+
+ // .08 compat
+ public static IIconContainer[] hiddenTextureArray;
+
+ @Override
+ public ITexture[] getTexture(ForgeDirection side) {
+ return getTexture(null, side);
+ }
+
+ @Override
+ public ITexture[] getTexture(Block block, ForgeDirection side) {
+ if (this.blockMaterial != null) {
+ GTPP_RenderedTexture aIconSet = new GTPP_RenderedTexture(
+ blockMaterial.getTextureSet().mTextures[OrePrefixes.ore.mTextureIndex],
+ this.blockMaterial.getRGBA());
+ return new ITexture[] { new GTPP_CopiedBlockTexture(Blocks.stone, 0, 0), aIconSet };
+ }
+
+ if (hiddenTextureArray == null) {
+ try {
+ Field o = ReflectionUtils.getField(Textures.BlockIcons.class, "STONES");
+ if (o != null) {
+ hiddenTextureArray = (IIconContainer[]) o.get(Textures.BlockIcons.class);
+ }
+ if (hiddenTextureArray == null) {
+ hiddenTextureArray = new IIconContainer[6];
+ }
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ hiddenTextureArray = new IIconContainer[6];
+ }
+ }
+ return new ITexture[] { new GTPP_RenderedTexture(hiddenTextureArray[0], new short[] { 240, 240, 240, 0 }) };
+ }
+
+ @Override
+ public void registerBlockIcons(IIconRegister p_149651_1_) {}
+
+ @Override
+ public void harvestBlock(World worldIn, EntityPlayer player, int x, int y, int z, int meta) {
+ if (EnchantmentHelper.getSilkTouchModifier(player)) {
+ shouldSilkTouch = true;
+ super.harvestBlock(worldIn, player, x, y, z, meta);
+
+ if (shouldSilkTouch) {
+ shouldSilkTouch = false;
+ }
+ return;
+ }
+
+ if (!(player instanceof FakePlayer)) {
+ shouldFortune = true;
+ }
+ super.harvestBlock(worldIn, player, x, y, z, meta);
+ if (shouldFortune) {
+ shouldFortune = false;
+ }
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
+ ArrayList<ItemStack> drops = new ArrayList<>();
+ if (shouldSilkTouch) {
+ drops.add(ItemUtils.simpleMetaStack(this, metadata, 1));
+ } else {
+ switch (GT_Mod.gregtechproxy.oreDropSystem) {
+ case Item -> {
+ drops.add(
+ ItemUtils.getItemStackOfAmountFromOreDictNoBroken(
+ "oreRaw" + this.blockMaterial.getLocalizedName(),
+ 1));
+ }
+ case FortuneItem -> {
+ // if shouldFortune and isNatural then get fortune drops
+ // if not shouldFortune or not isNatural then get normal drops
+ // if not shouldFortune and isNatural then get normal drops
+ // if shouldFortune and not isNatural then get normal drops
+ if (shouldFortune && fortune > 0) {
+ int aMinAmount = 1;
+ // Max applicable fortune
+ if (fortune > 3) fortune = 3;
+ long amount = (long) new Random().nextInt(fortune) + aMinAmount;
+ for (int i = 0; i < amount; i++) {
+ drops.add(
+ ItemUtils.getItemStackOfAmountFromOreDictNoBroken(
+ "oreRaw" + this.blockMaterial.getLocalizedName(),
+ 1));
+ }
+ } else {
+ drops.add(
+ ItemUtils.getItemStackOfAmountFromOreDictNoBroken(
+ "oreRaw" + this.blockMaterial.getLocalizedName(),
+ 1));
+ }
+ }
+ case UnifiedBlock -> {
+ // Unified ore
+ drops.add(ItemUtils.simpleMetaStack(this, metadata, 1));
+ }
+ case PerDimBlock -> {
+ // Per Dimension ore
+ drops.add(ItemUtils.simpleMetaStack(this, metadata, 1));
+ }
+ case Block -> {
+ // Regular ore
+ drops.add(ItemUtils.simpleMetaStack(this, metadata, 1));
+ }
+ }
+ }
+ return drops;
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/general/BlockCompressedObsidian.java b/gtpp/src/main/java/gtPlusPlus/core/block/general/BlockCompressedObsidian.java
new file mode 100644
index 0000000000..0c353cfbdd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/general/BlockCompressedObsidian.java
@@ -0,0 +1,100 @@
+package gtPlusPlus.core.block.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.BlockObsidian;
+import net.minecraft.block.material.MapColor;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockMeta;
+
+public class BlockCompressedObsidian extends BlockObsidian {
+
+ private final IIcon textureArray[] = new IIcon[11];
+
+ public BlockCompressedObsidian() {
+ this.setBlockName("blockCompressedObsidian");
+ this.setHardness(50.0F);
+ this.setResistance(2000.0F);
+ this.setStepSound(soundTypePiston);
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerBlock(this, ItemBlockMeta.class, "blockCompressedObsidian");
+ }
+
+ @Override
+ public MapColor getMapColor(final int meta) {
+ if (meta < 5) {
+ return MapColor.obsidianColor;
+ }
+ if (meta > 5) {
+ return MapColor.goldColor;
+ } else {
+ return MapColor.sandColor;
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister iicon) {
+ this.textureArray[0] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "obsidian1");
+ this.textureArray[1] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "obsidian2");
+ this.textureArray[2] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "obsidian3");
+ this.textureArray[3] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "obsidian4");
+ this.textureArray[4] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "obsidian5");
+ this.textureArray[5] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "obsidian_invert");
+ this.textureArray[6] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "glowstone1");
+ this.textureArray[7] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "glowstone2");
+ this.textureArray[8] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "glowstone3");
+ this.textureArray[9] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "glowstone4");
+ this.textureArray[10] = iicon.registerIcon(GTPlusPlus.ID + ":" + "compressed/" + "glowstone5");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return this.textureArray[meta];
+ }
+
+ @Override
+ public int damageDropped(final int damage) {
+ return damage;
+ }
+
+ @Override
+ public void getSubBlocks(final Item item, final CreativeTabs tab, final List list) {
+ for (int i = 0; i < 11; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public Item getItemDropped(final int meta, final Random rand, final int fortune) {
+ return Item.getItemFromBlock(this);
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(final World world, final int x, final int y, final int z, final int metadata,
+ final int fortune) {
+ int m = metadata;
+ if (m == 5) {
+ m = 1;
+ }
+ return super.getDrops(world, x, y, z, m, fortune);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/general/BlockSuperLight.java b/gtpp/src/main/java/gtPlusPlus/core/block/general/BlockSuperLight.java
new file mode 100644
index 0000000000..dc6c92f065
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/general/BlockSuperLight.java
@@ -0,0 +1,197 @@
+package gtPlusPlus.core.block.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockAir;
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.init.Blocks;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.block.ModBlocks;
+
+public class BlockSuperLight extends BlockContainer {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureFront;
+
+ public BlockSuperLight() {
+ super(Material.circuits);
+ this.setBlockName("blockSuperLight");
+ this.setCreativeTab(CreativeTabs.tabRedstone);
+ GameRegistry.registerBlock(this, "blockSuperLight");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return this.blockIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "SwirlBigBlue");
+ }
+
+ /**
+ * Returns a new instance of a block's tile entity class. Called on placing the block.
+ */
+ @Override
+ public TileEntity createNewTileEntity(World aWorld, int p_149915_2_) {
+ return new TileEntitySuperLight();
+ }
+
+ public static class TileEntitySuperLight extends TileEntity {
+
+ private long mCreated;
+
+ private long mLastUpdateTick = 0;
+
+ private int[][][][] aLitBlocks = new int[50][10][50][1];
+
+ private boolean mPowered = false;
+
+ public TileEntitySuperLight() {
+ mCreated = System.currentTimeMillis();
+ Logger.INFO("Created Super-Lamp");
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound aNBT) {
+ super.readFromNBT(aNBT);
+ mCreated = aNBT.getLong("mCreated");
+ mPowered = aNBT.getBoolean("mPowered");
+ NBTTagCompound aLightingData = aNBT.getCompoundTag("lighting");
+ for (int x = 0; x < 50; x++) {
+ for (int y = 0; y < 10; y++) {
+ for (int z = 0; z < 50; z++) {
+ int aData = aLightingData.getInteger("[" + x + "][" + y + "][" + z + "]");
+ aLitBlocks[x][y][z][0] = aData;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound aNBT) {
+ super.writeToNBT(aNBT);
+ aNBT.setLong("mCreated", mCreated);
+ aNBT.setBoolean("mPowered", mPowered);
+ NBTTagCompound aLightingData = new NBTTagCompound();
+ for (int x = 0; x < 50; x++) {
+ for (int y = 0; y < 10; y++) {
+ for (int z = 0; z < 50; z++) {
+ int aFlag = aLitBlocks[x][y][z][0];
+ aLightingData.setInteger("[" + x + "][" + y + "][" + z + "]", aFlag);
+ }
+ }
+ }
+ aNBT.setTag("lighting", aLightingData);
+ }
+
+ @Override
+ public void updateEntity() {
+ super.updateEntity();
+
+ if (this.worldObj.isRemote) {
+ return;
+ }
+
+ try {
+ if (mLastUpdateTick == 0 || (System.currentTimeMillis() - mLastUpdateTick) >= 30000) {
+ boolean powered = (this.worldObj
+ .isBlockIndirectlyGettingPowered(this.xCoord, this.yCoord, this.zCoord));
+ boolean aLastState = mPowered;
+ // Logger.INFO("Powered: "+powered);
+ mPowered = powered;
+ if (mPowered != aLastState) {
+ updateLighting(powered);
+ }
+ }
+ } catch (Throwable ignored) {}
+ }
+
+ @Override
+ public void markDirty() {
+ super.markDirty();
+ }
+
+ @Override
+ public boolean canUpdate() {
+ return super.canUpdate();
+ }
+
+ public void updateLighting(boolean enable) {
+
+ mLastUpdateTick = System.currentTimeMillis();
+
+ aLitBlocks = new int[50][10][50][1];
+ int aLitCounter = 0;
+ AutoMap<BlockPos> aBlocksToUpdate = new AutoMap<>();
+ Logger.INFO("Trying to relight area.");
+
+ BlockPos aStartIterationPoint = new BlockPos(
+ this.xCoord - 24,
+ this.yCoord - 4,
+ this.zCoord - 24,
+ this.worldObj);
+ for (int x = 0; x < 50; x++) {
+ for (int y = 0; y < 10; y++) {
+ for (int z = 0; z < 50; z++) {
+ int xOff = aStartIterationPoint.xPos + x;
+ int yOff = aStartIterationPoint.yPos + y;
+ int zOff = aStartIterationPoint.zPos + z;
+ Block aBlockGet = this.worldObj.getBlock(xOff, yOff, zOff);
+ if (aBlockGet != null) {
+ if (aBlockGet instanceof BlockAir) {
+
+ int aLight = aBlockGet.getLightValue();
+
+ // Don't Need to relight anything.
+ if ((enable && aLight > 0) || (!enable && aLight == 0)) {
+ continue;
+ }
+ // Turning Lights on
+ else if (enable && aLight == 0) {
+ aBlocksToUpdate.put(new BlockPos(xOff, yOff, zOff, this.worldObj));
+ this.worldObj
+ .setBlock(xOff, yOff, zOff, ModBlocks.MatterFabricatorEffectBlock, 0, 3);
+ aLitCounter++;
+ }
+ // Turning Lights off
+ else if (!enable && aLight > 0) {
+ aBlocksToUpdate.put(new BlockPos(xOff, yOff, zOff, this.worldObj));
+ if (aBlockGet instanceof LightGlass) {
+ Logger.INFO("Dimmed air.");
+ this.worldObj.setBlock(xOff, yOff, zOff, Blocks.air, 0, 3);
+ }
+ }
+ aLitBlocks[x][y][z][0] = enable ? 15 : 0;
+ } else {
+ aLitBlocks[x][y][z][0] = -1;
+ }
+ } else {
+ aLitBlocks[x][y][z][0] = -1;
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/general/FluidTankInfinite.java b/gtpp/src/main/java/gtPlusPlus/core/block/general/FluidTankInfinite.java
new file mode 100644
index 0000000000..41a581394b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/general/FluidTankInfinite.java
@@ -0,0 +1,141 @@
+package gtPlusPlus.core.block.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+import net.minecraftforge.fluids.ItemFluidContainer;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.tileentities.general.TileEntityInfiniteFluid;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class FluidTankInfinite extends BlockContainer {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureBottom;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureFront;
+
+ public FluidTankInfinite() {
+ super(Material.iron);
+ this.setBlockName("blockInfiniteFluidTank");
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerBlock(this, "blockInfiniteFluidTank");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ordinalSide == 1 ? this.textureTop
+ : (ordinalSide == 0 ? this.textureBottom
+ : ((ordinalSide != 2) && (ordinalSide != 4) ? this.blockIcon : this.textureFront));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "Generic_Creative_Texture");
+ this.textureTop = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "Generic_Creative_Texture");
+ this.textureBottom = p_149651_1_
+ .registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "Generic_Creative_Texture");
+ this.textureFront = p_149651_1_
+ .registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "Generic_Creative_Texture");
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ } else {
+ TileEntityInfiniteFluid tank = (TileEntityInfiniteFluid) world.getTileEntity(x, y, z);
+ if (tank != null) {
+ Item handItem;
+ try {
+ handItem = player.getHeldItem()
+ .getItem();
+ } catch (Throwable t) {
+ handItem = null;
+ }
+ if (handItem != null
+ && (handItem instanceof IFluidContainerItem || handItem instanceof ItemFluidContainer
+ || FluidContainerRegistry.isFilledContainer(player.getHeldItem()))) {
+ if (tank.tank.getFluid() == null) {
+ try {
+ if (!FluidContainerRegistry.isFilledContainer(player.getHeldItem())) {
+ ItemStack handItemStack = player.getHeldItem();
+ IFluidContainerItem container = (IFluidContainerItem) handItem;
+ FluidStack containerFluid = container.getFluid(handItemStack);
+ container.drain(handItemStack, container.getFluid(handItemStack).amount, true);
+ tank.tank.setFluid(containerFluid);
+ } else {
+ ItemStack handItemStack = player.getHeldItem();
+ FluidContainerRegistry.drainFluidContainer(handItemStack);
+ FluidStack containerFluid = FluidContainerRegistry.getFluidForFilledItem(handItemStack);
+ ItemStack emptyContainer = FluidContainerRegistry.drainFluidContainer(handItemStack);
+ player.setItemInUse(emptyContainer, 0);
+
+ tank.tank.setFluid(containerFluid);
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ }
+ if (tank.tank.getFluid() != null) {
+ PlayerUtils.messagePlayer(
+ player,
+ "This tank contains " + tank.tank.getFluidAmount()
+ + "L of "
+ + tank.tank.getFluid()
+ .getLocalizedName());
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityInfiniteFluid();
+ }
+
+ @Override
+ public void onBlockAdded(World world, int x, int y, int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/general/HellFire.java b/gtpp/src/main/java/gtPlusPlus/core/block/general/HellFire.java
new file mode 100644
index 0000000000..4e8d94328d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/general/HellFire.java
@@ -0,0 +1,535 @@
+package gtPlusPlus.core.block.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static net.minecraftforge.common.util.ForgeDirection.DOWN;
+import static net.minecraftforge.common.util.ForgeDirection.EAST;
+import static net.minecraftforge.common.util.ForgeDirection.NORTH;
+import static net.minecraftforge.common.util.ForgeDirection.SOUTH;
+import static net.minecraftforge.common.util.ForgeDirection.UP;
+import static net.minecraftforge.common.util.ForgeDirection.WEST;
+
+import java.util.IdentityHashMap;
+import java.util.Map.Entry;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockFire;
+import net.minecraft.block.material.MapColor;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.collect.Maps;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.objects.XSTR;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public class HellFire extends BlockFire {
+
+ private final int[] field_149849_a = new int[Short.MAX_VALUE];
+
+ private final int[] field_149848_b = new int[Short.MAX_VALUE];
+
+ @SideOnly(Side.CLIENT)
+ private IIcon[] IIconArray;
+
+ public HellFire() {
+ this.setTickRandomly(true);
+ this.setLightLevel(1F);
+ this.setLightOpacity(0);
+ // this.setBlockTextureName(GTPlusPlus.ID + "hellfire/blockHellFire");
+ this.setBlockName("blockHellFire");
+ this.setCreativeTab(AddToCreativeTab.tabBlock);
+ GameRegistry.registerBlock(this, "blockHellFire");
+ this.enableBrutalFire();
+ }
+
+ private void enableBrutalFire() {
+ for (final Object o : Block.blockRegistry.getKeys()) {
+
+ try {
+
+ final String name = (String) o;
+ final Block b = Block.getBlockFromName(name);
+ if (b != Blocks.air) {
+ final int spread = Blocks.fire.getEncouragement(b);
+ final int flamm = Blocks.fire.getFlammability(b);
+ if (flamm > 0 && spread > 0) {
+ this.setFireInfo(b, spread * 4, flamm * 4);
+ }
+ }
+
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ // Special Case madness
+ this.setFireInfo(Blocks.brown_mushroom_block, 20, 100);
+ this.setFireInfo(Blocks.red_mushroom_block, 20, 100);
+ this.setFireInfo(Blocks.grass, 20, 100);
+ this.setFireInfo(Blocks.mycelium, 20, 100);
+ }
+
+ /**
+ * How many world ticks before ticking
+ */
+ @Override
+ public int tickRate(final World world) {
+ return 5;
+ }
+
+ /**
+ * Ticks the block if it's been scheduled
+ */
+ @Override
+ public void updateTick(final World world, final int x, final int y, final int z, Random random) {
+
+ random = new XSTR();
+
+ if (world.getGameRules()
+ .getGameRuleBooleanValue("doFireTick")) {
+ final boolean flag = world.getBlock(x, y - 1, z)
+ .isFireSource(world, x, y - 1, z, UP);
+
+ if (!this.canPlaceBlockAt(world, x, y, z)) {
+ world.setBlockToAir(x, y, z);
+ }
+
+ if (!flag && world.isRaining()
+ && (world.canLightningStrikeAt(x, y, z) || world.canLightningStrikeAt(x - 1, y, z)
+ || world.canLightningStrikeAt(x + 1, y, z)
+ || world.canLightningStrikeAt(x, y, z - 1)
+ || world.canLightningStrikeAt(x, y, z + 1))) {
+
+ if (MathUtils.randInt(0, 100) >= 90) {
+ world.setBlockToAir(x, y, z);
+ }
+ } else {
+ final int blockMeta = world.getBlockMetadata(x, y, z);
+
+ if (blockMeta < 15) {
+ world.setBlockMetadataWithNotify(x, y, z, blockMeta + (random.nextInt(3) / 2), 4);
+ }
+
+ world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world) + random.nextInt(10));
+
+ if (!flag && !this.canNeighborBurn(world, x, y, z)) {
+ if (!World.doesBlockHaveSolidTopSurface(world, x, y - 1, z) || (blockMeta > 3)) {
+ world.setBlockToAir(x, y, z);
+ }
+ } else if (!flag && !this.canCatchFire(world, x, y - 1, z, UP)
+ && (blockMeta == 15)
+ && (random.nextInt(4) == 0)) {
+ world.setBlockToAir(x, y, z);
+ } else {
+ final boolean flag1 = world.isBlockHighHumidity(x, y, z);
+ byte b0 = 0;
+
+ if (flag1) {
+ b0 = -50;
+ }
+
+ this.tryCatchFire(world, x + 1, y, z, 300 + b0, random, blockMeta, WEST);
+ this.tryCatchFire(world, x - 1, y, z, 300 + b0, random, blockMeta, EAST);
+ this.tryCatchFire(world, x, y - 1, z, 250 + b0, random, blockMeta, UP);
+ this.tryCatchFire(world, x, y + 1, z, 250 + b0, random, blockMeta, DOWN);
+ this.tryCatchFire(world, x, y, z - 1, 300 + b0, random, blockMeta, SOUTH);
+ this.tryCatchFire(world, x, y, z + 1, 300 + b0, random, blockMeta, NORTH);
+
+ for (int i1 = x - 1; i1 <= (x + 1); ++i1) {
+ for (int j1 = z - 1; j1 <= (z + 1); ++j1) {
+ for (int k1 = y - 1; k1 <= (y + 4); ++k1) {
+ if ((i1 != x) || (k1 != y) || (j1 != z)) {
+ int l1 = 100;
+
+ if (k1 > (y + 1)) {
+ l1 += (k1 - (y + 1)) * 100;
+ }
+
+ final int neighbourFireChance = this
+ .getChanceOfNeighborsEncouragingFire(world, i1, k1, j1);
+
+ if (neighbourFireChance > 0) {
+ int j2 = (neighbourFireChance + 40
+ + (world.difficultySetting.getDifficultyId() * 14)) / (blockMeta + 30);
+
+ if (flag1) {
+ j2 /= 2;
+ }
+
+ if ((j2 > 0) && (random.nextInt(l1) <= j2)
+ && (!world.isRaining() || !world.canLightningStrikeAt(i1, k1, j1))
+ && !world.canLightningStrikeAt(i1 - 1, k1, z)
+ && !world.canLightningStrikeAt(i1 + 1, k1, j1)
+ && !world.canLightningStrikeAt(i1, k1, j1 - 1)
+ && !world.canLightningStrikeAt(i1, k1, j1 + 1)) {
+ int k2 = blockMeta + (random.nextInt(5) / 4);
+
+ if (k2 > 15) {
+ k2 = 15;
+ }
+
+ world.setBlock(i1, k1, j1, this, k2, 3);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void tryCatchFire(final World world, final int p_149841_2_, final int p_149841_3_, final int p_149841_4_,
+ final int p_149841_5_, final Random p_149841_6_, final int p_149841_7_, final ForgeDirection face) {
+ final int j1 = world.getBlock(p_149841_2_, p_149841_3_, p_149841_4_)
+ .getFlammability(world, p_149841_2_, p_149841_3_, p_149841_4_, face);
+
+ if (p_149841_6_.nextInt(p_149841_5_) < j1) {
+ final boolean flag = world.getBlock(p_149841_2_, p_149841_3_, p_149841_4_) == Blocks.tnt;
+
+ if ((p_149841_6_.nextInt(p_149841_7_ + 10) < 5)
+ && !world.canLightningStrikeAt(p_149841_2_, p_149841_3_, p_149841_4_)) {
+ int k1 = p_149841_7_ + (p_149841_6_.nextInt(5) / 4);
+
+ if (k1 > 15) {
+ k1 = 15;
+ }
+
+ world.setBlock(p_149841_2_, p_149841_3_, p_149841_4_, this, k1, 3);
+ } else {
+ world.setBlockToAir(p_149841_2_, p_149841_3_, p_149841_4_);
+ }
+
+ if (flag) {
+ Blocks.tnt.onBlockDestroyedByPlayer(world, p_149841_2_, p_149841_3_, p_149841_4_, 1);
+ }
+ }
+ }
+
+ /**
+ * Returns true if at least one block next to this one can burn.
+ */
+ private boolean canNeighborBurn(final World world, final int x, final int y, final int z) {
+ return this.canCatchFire(world, x + 1, y, z, WEST) || this.canCatchFire(world, x - 1, y, z, EAST)
+ || this.canCatchFire(world, x, y - 1, z, UP)
+ || this.canCatchFire(world, x, y + 1, z, DOWN)
+ || this.canCatchFire(world, x, y, z - 1, SOUTH)
+ || this.canCatchFire(world, x, y, z + 1, NORTH);
+ }
+
+ /**
+ * Gets the highest chance of a neighbor block encouraging this block to catch fire
+ */
+ private int getChanceOfNeighborsEncouragingFire(final World world, final int x, final int y, final int z) {
+ final byte b0 = 0;
+
+ if (!world.isAirBlock(x, y, z)) {
+ return 0;
+ } else {
+ int l = b0;
+ l = this.getChanceToEncourageFire(world, x + 1, y, z, l, WEST);
+ l = this.getChanceToEncourageFire(world, x - 1, y, z, l, EAST);
+ l = this.getChanceToEncourageFire(world, x, y - 1, z, l, UP);
+ l = this.getChanceToEncourageFire(world, x, y + 1, z, l, DOWN);
+ l = this.getChanceToEncourageFire(world, x, y, z - 1, l, SOUTH);
+ l = this.getChanceToEncourageFire(world, x, y, z + 1, l, NORTH);
+ return l;
+ }
+ }
+
+ /**
+ * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z
+ */
+ @Override
+ public boolean canPlaceBlockAt(final World worldObj, final int x, final int y, final int z) {
+ return World.doesBlockHaveSolidTopSurface(worldObj, x, y - 1, z) || this.canNeighborBurn(worldObj, x, y, z);
+ }
+
+ /**
+ * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
+ * their own) Args: x, y, z, neighbor Block
+ */
+ @Override
+ public void onNeighborBlockChange(final World worldObj, final int x, final int y, final int z,
+ final Block blockObj) {
+ if (!World.doesBlockHaveSolidTopSurface(worldObj, x, y - 1, z) && !this.canNeighborBurn(worldObj, x, y, z)) {
+ worldObj.setBlockToAir(x, y, z);
+ }
+ }
+
+ /**
+ * Called whenever the block is added into the world. Args: world, x, y, z
+ */
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ if ((world.provider.dimensionId > 0) || !Blocks.portal.func_150000_e(world, x, y, z)) {
+ if (!World.doesBlockHaveSolidTopSurface(world, x, y - 1, z) && !this.canNeighborBurn(world, x, y, z)) {
+ world.setBlockToAir(x, y, z);
+ } else {
+ world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world) + world.rand.nextInt(10));
+ }
+ }
+ }
+
+ // Burn
+ @Override
+ public void onEntityWalking(final World world, final int i, final int j, final int k, final Entity entity) {
+ entity.setFire(10);
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ // Burn
+ @Override
+ public void onEntityCollidedWithBlock(final World world, final int i, final int j, final int k,
+ final Entity entity) {
+ entity.setFire(10);
+ }
+
+ /**
+ * A randomly called display update to be able to add particles or other items for display
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void randomDisplayTick(final World world, final int x, final int y, final int z, Random randomObj) {
+
+ randomObj = new XSTR();
+
+ if (randomObj.nextInt(24) == 0) {
+ world.playSound(
+ x + 0.5F,
+ y + 0.5F,
+ z + 0.5F,
+ "fire.fire",
+ 1.0F + randomObj.nextFloat(),
+ (randomObj.nextFloat() * 0.7F) + 0.3F,
+ false);
+ }
+
+ int l;
+ float f;
+ float f1;
+ float f2;
+
+ if (!World.doesBlockHaveSolidTopSurface(world, x, y - 1, z)
+ && !Blocks.fire.canCatchFire(world, x, y - 1, z, UP)) {
+ if (Blocks.fire.canCatchFire(world, x - 1, y, z, EAST)) {
+ for (l = 0; l < 2; ++l) {
+ f = x + (randomObj.nextFloat() * 0.1F);
+ f1 = y + randomObj.nextFloat();
+ f2 = z + randomObj.nextFloat();
+ world.spawnParticle("witchMagic", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1 + 0.5F, f2, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ if (Blocks.fire.canCatchFire(world, x + 1, y, z, WEST)) {
+ for (l = 0; l < 2; ++l) {
+ f = (x + 1) - (randomObj.nextFloat() * 0.1F);
+ f1 = y + randomObj.nextFloat();
+ f2 = z + randomObj.nextFloat();
+ world.spawnParticle("witchMagic", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1 + 0.5F, f2, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ if (Blocks.fire.canCatchFire(world, x, y, z - 1, SOUTH)) {
+ for (l = 0; l < 2; ++l) {
+ f = x + randomObj.nextFloat();
+ f1 = y + randomObj.nextFloat();
+ f2 = z + (randomObj.nextFloat() * 0.1F);
+ world.spawnParticle("witchMagic", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1 + 0.5F, f2, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ if (Blocks.fire.canCatchFire(world, x, y, z + 1, NORTH)) {
+ for (l = 0; l < 2; ++l) {
+ f = x + randomObj.nextFloat();
+ f1 = y + randomObj.nextFloat();
+ f2 = (z + 1) - (randomObj.nextFloat() * 0.1F);
+ world.spawnParticle("witchMagic", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1 + 0.5F, f2, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ if (Blocks.fire.canCatchFire(world, x, y + 1, z, DOWN)) {
+ for (l = 0; l < 2; ++l) {
+ f = x + randomObj.nextFloat();
+ f1 = (y + 1) - (randomObj.nextFloat() * 0.1F);
+ f2 = z + randomObj.nextFloat();
+ world.spawnParticle("witchMagic", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1 + 0.5F, f2, 0.0D, 0.0D, 0.0D);
+ }
+ }
+ } else {
+ for (l = 0; l < 5; ++l) {
+ f = x + randomObj.nextFloat();
+ f1 = y + (randomObj.nextFloat() * 0.5F) + 0.5F;
+ f2 = z + randomObj.nextFloat();
+ world.spawnParticle("witchMagic", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1, f2, 0.0D, 0.0D, 0.0D);
+ world.spawnParticle("largesmoke", f, f1 + 0.5F, f2, 0.0D, 0.0D, 0.0D);
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister IIconRegister) {
+ this.IIconArray = new IIcon[] {
+ IIconRegister.registerIcon(GTPlusPlus.ID + ":" + "hellfire/" + "blockHellFire" + "_layer_0"),
+ IIconRegister.registerIcon(GTPlusPlus.ID + ":" + "hellfire/" + "blockHellFire" + "_layer_1") };
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getFireIcon(final int p_149840_1_) {
+ return this.IIconArray[p_149840_1_];
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return this.IIconArray[0];
+ }
+
+ @Override
+ public MapColor getMapColor(final int p_149728_1_) {
+ return MapColor.snowColor;
+ }
+
+ /*
+ * ================================= Forge Start ======================================
+ */
+ private static class FireInfo {
+
+ private int encouragement = 0;
+ private int flammibility = 0;
+ }
+
+ private final IdentityHashMap<Block, FireInfo> blockInfo = Maps.newIdentityHashMap();
+
+ @Override
+ public void setFireInfo(final Block block, final int encouragement, final int flammibility) {
+ try {
+ if (block == Blocks.air) {
+ throw new IllegalArgumentException("Tried to set air on fire... This is bad.");
+ }
+ final int id = Block.getIdFromBlock(block);
+ if (id >= 4096 || id >= field_149849_a.length || id >= field_149848_b.length) {
+ return;
+ }
+ this.field_149849_a[id] = encouragement;
+ this.field_149848_b[id] = flammibility;
+
+ final FireInfo info = this.getInfo(block, true);
+ info.encouragement = encouragement;
+ info.flammibility = flammibility;
+ } catch (Throwable t) {}
+ }
+
+ private FireInfo getInfo(final Block block, final boolean garentee) {
+ FireInfo ret = this.blockInfo.get(block);
+ if ((ret == null) && garentee) {
+ ret = new FireInfo();
+ this.blockInfo.put(block, ret);
+ }
+ return ret;
+ }
+
+ @Override
+ public void rebuildFireInfo() {
+ for (int x = 0; x < 4096; x++) {
+ // If we care.. we could detect changes in here and make sure we
+ // keep them, however
+ // it's my thinking that anyone who hacks into the private variables
+ // should DIAF and we don't care about them.
+ this.field_149849_a[x] = 0;
+ this.field_149848_b[x] = 0;
+ }
+
+ for (final Entry<Block, FireInfo> e : this.blockInfo.entrySet()) {
+ final int id = Block.getIdFromBlock(e.getKey());
+ if ((id >= 0) && (id < 4096)) {
+ this.field_149849_a[id] = e.getValue().encouragement;
+ this.field_149848_b[id] = e.getValue().flammibility;
+ }
+ }
+ }
+
+ @Override
+ public int getFlammability(final Block block) {
+ final int id = Block.getIdFromBlock(block);
+ return (id >= 0) && (id < 4096) ? this.field_149848_b[id] : 0;
+ }
+
+ @Override
+ public int getEncouragement(final Block block) {
+ final int id = Block.getIdFromBlock(block);
+ return (id >= 0) && (id < 4096) ? this.field_149849_a[id] : 0;
+ }
+
+ /**
+ * Side sensitive version that calls the block function.
+ *
+ * @param world The current world
+ * @param x X Position
+ * @param y Y Position
+ * @param z Z Position
+ * @param face The side the fire is coming from
+ * @return True if the face can catch fire.
+ */
+ @Override
+ public boolean canCatchFire(final IBlockAccess world, final int x, final int y, final int z,
+ final ForgeDirection face) {
+ return world.getBlock(x, y, z)
+ .isFlammable(world, x, y, z, face);
+ }
+
+ /**
+ * Side sensitive version that calls the block function.
+ *
+ * @param world The current world
+ * @param x X Position
+ * @param y Y Position
+ * @param z Z Position
+ * @param oldChance The previous maximum chance.
+ * @param face The side the fire is coming from
+ * @return The chance of the block catching fire, or oldChance if it is higher
+ */
+ @Override
+ public int getChanceToEncourageFire(final IBlockAccess world, final int x, final int y, final int z,
+ final int oldChance, final ForgeDirection face) {
+ final int newChance = world.getBlock(x, y, z)
+ .getFireSpreadSpeed(world, x, y, z, face);
+ return (newChance > oldChance ? newChance : oldChance);
+ }
+ /*
+ * ================================= Forge Start ======================================
+ */
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/general/LightGlass.java b/gtpp/src/main/java/gtPlusPlus/core/block/general/LightGlass.java
new file mode 100644
index 0000000000..b6facce45f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/general/LightGlass.java
@@ -0,0 +1,137 @@
+package gtPlusPlus.core.block.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockAir;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import codechicken.nei.api.API;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+/*
+ * public class LightGlass extends BlockBreakable {
+ */
+public class LightGlass extends BlockAir {
+
+ private int state = 0;
+ private final int a = 255;
+ private int r = 255;
+ private int g = 0;
+ private int b = 0;
+ private int hex;
+
+ public LightGlass(final boolean bool) {
+ super();
+ this.setCreativeTab(AddToCreativeTab.tabBlock);
+ this.setBlockName("blockMFEffect");
+ this.setLightLevel(12F);
+ setHardness(0.1F);
+ setBlockTextureName(GTPlusPlus.ID + ":" + "blockMFEffect");
+ setStepSound(Block.soundTypeGlass);
+ GameRegistry.registerBlock(this, "blockMFEffect");
+
+ API.hideItem(new ItemStack(this));
+ }
+
+ /**
+ * Returns the quantity of items to drop on block destruction.
+ */
+ @Override
+ public int quantityDropped(final Random rand) {
+ return 0;
+ }
+
+ /**
+ * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderBlockPass() {
+ return 0;
+ }
+
+ /**
+ * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
+ */
+ @Override
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ /**
+ * Return true if a player with Silk Touch can harvest this block directly, and not its normal drops.
+ */
+ @Override
+ protected boolean canSilkHarvest() {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister iIcon) {
+ this.blockIcon = iIcon.registerIcon(GTPlusPlus.ID + ":" + "blockMFEffect");
+ }
+
+ @Override
+ // http://stackoverflow.com/questions/31784658/how-can-i-loop-through-all-rgb-combinations-in-rainbow-order-in-java
+ public int colorMultiplier(final IBlockAccess par1IBlockAccess, final int par2, final int par3, final int par4) {
+ if (this.state == 0) {
+ this.g++;
+ if (this.g == 255) {
+ this.state = 1;
+ }
+ }
+ if (this.state == 1) {
+ this.r--;
+ if (this.r == 0) {
+ this.state = 2;
+ }
+ }
+ if (this.state == 2) {
+ this.b++;
+ if (this.b == 255) {
+ this.state = 3;
+ }
+ }
+ if (this.state == 3) {
+ this.g--;
+ if (this.g == 0) {
+ this.state = 4;
+ }
+ }
+ if (this.state == 4) {
+ this.r++;
+ if (this.r == 255) {
+ this.state = 5;
+ }
+ }
+ if (this.state == 5) {
+ this.b--;
+ if (this.b == 0) {
+ this.state = 0;
+ }
+ }
+ this.hex = (this.a << 24) + (this.r << 16) + (this.g << 8) + (this.b);
+ return this.hex;
+ }
+
+ /**
+ * A randomly called display update to be able to add particles or other items for display
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void randomDisplayTick(final World world, final int posX, final int posY, final int posZ,
+ final Random random) {
+ // Utils.spawnFX(world, posX, posY, posZ, "smoke", "cloud");
+
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/general/MiningExplosives.java b/gtpp/src/main/java/gtPlusPlus/core/block/general/MiningExplosives.java
new file mode 100644
index 0000000000..7579907e9d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/general/MiningExplosives.java
@@ -0,0 +1,193 @@
+package gtPlusPlus.core.block.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockTNT;
+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.entity.projectile.EntityArrow;
+import net.minecraft.init.Items;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.Explosion;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.entity.EntityPrimedMiningExplosive;
+
+public class MiningExplosives extends BlockTNT {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureBottom;
+
+ public MiningExplosives() {
+ this.setBlockName("blockMiningExplosives");
+ GameRegistry.registerBlock(this, "blockMiningExplosives");
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ordinalSide == 0 ? this.textureBottom : (ordinalSide == 1 ? this.textureTop : this.blockIcon);
+ }
+
+ /**
+ * Called whenever the block is added into the world. Args: world, x, y, z
+ */
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ super.onBlockAdded(world, x, y, z);
+
+ if (world.isBlockIndirectlyGettingPowered(x, y, z)) {
+ this.onBlockDestroyedByPlayer(world, x, y, z, 1);
+ world.setBlockToAir(x, y, z);
+ }
+ }
+
+ /**
+ * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
+ * their own) Args: x, y, z, neighbor Block
+ */
+ @Override
+ public void onNeighborBlockChange(final World world, final int x, final int y, final int z,
+ final Block neighbourblock) {
+ if (world.isBlockIndirectlyGettingPowered(x, y, z)) {
+ this.onBlockDestroyedByPlayer(world, x, y, z, 1);
+ world.setBlockToAir(x, y, z);
+ }
+ }
+
+ /**
+ * Returns the quantity of items to drop on block destruction.
+ */
+ @Override
+ public int quantityDropped(final Random random) {
+ return 1;
+ }
+
+ /**
+ * Called upon the block being destroyed by an explosion
+ */
+ @Override
+ public void onBlockDestroyedByExplosion(final World world, final int x, final int y, final int z,
+ final Explosion bang) {
+ if (!world.isRemote) {
+ final EntityPrimedMiningExplosive EntityPrimedMiningExplosive = new EntityPrimedMiningExplosive(
+ world,
+ x + 0.5F,
+ y + 0.5F,
+ z + 0.5F,
+ bang.getExplosivePlacedBy());
+ EntityPrimedMiningExplosive.fuse = world.rand.nextInt(EntityPrimedMiningExplosive.fuse / 4)
+ + (EntityPrimedMiningExplosive.fuse / 8);
+ world.spawnEntityInWorld(EntityPrimedMiningExplosive);
+ }
+ }
+
+ /**
+ * Called right before the block is destroyed by a player. Args: world, x, y, z, metaData
+ */
+ @Override
+ public void onBlockDestroyedByPlayer(final World world, final int x, final int y, final int z, final int meta) {
+ this.func_150114_a(world, x, y, z, meta, (EntityLivingBase) null);
+ }
+
+ // TODO Spawns Primed TNT?
+ @Override
+ public void func_150114_a(final World world, final int p_150114_2_, final int p_150114_3_, final int p_150114_4_,
+ final int p_150114_5_, final EntityLivingBase entityLiving) {
+ if (!world.isRemote) {
+ if ((p_150114_5_ & 1) == 1) {
+ final EntityPrimedMiningExplosive EntityPrimedMiningExplosive = new EntityPrimedMiningExplosive(
+ world,
+ p_150114_2_ + 0.5F,
+ p_150114_3_ + 0.5F,
+ p_150114_4_ + 0.5F,
+ entityLiving);
+ world.spawnEntityInWorld(EntityPrimedMiningExplosive);
+ world.playSoundAtEntity(EntityPrimedMiningExplosive, "game.tnt.primed", 1.0F, 1.0F);
+ }
+ }
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z,
+ final EntityPlayer clickingPlayer, final int p_149727_6_, final float p_149727_7_, final float p_149727_8_,
+ final float p_149727_9_) {
+ if ((clickingPlayer.getCurrentEquippedItem() != null) && (clickingPlayer.getCurrentEquippedItem()
+ .getItem() == Items.flint_and_steel)) {
+ this.func_150114_a(world, x, y, z, 1, clickingPlayer);
+ world.setBlockToAir(x, y, z);
+ clickingPlayer.getCurrentEquippedItem()
+ .damageItem(1, clickingPlayer);
+ return true;
+ } else {
+ return super.onBlockActivated(
+ world,
+ x,
+ y,
+ z,
+ clickingPlayer,
+ p_149727_6_,
+ p_149727_7_,
+ p_149727_8_,
+ p_149727_9_);
+ }
+ }
+
+ /**
+ * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity
+ */
+ @Override
+ public void onEntityCollidedWithBlock(final World world, final int x, final int y, final int z,
+ final Entity entityTriggering) {
+ if ((entityTriggering instanceof final EntityArrow entityarrow) && !world.isRemote) {
+
+ if (entityarrow.isBurning()) {
+ this.func_150114_a(
+ world,
+ x,
+ y,
+ z,
+ 1,
+ entityarrow.shootingEntity instanceof EntityLivingBase
+ ? (EntityLivingBase) entityarrow.shootingEntity
+ : null);
+ world.setBlockToAir(x, y, z);
+ }
+ }
+ }
+
+ /**
+ * Return whether this block can drop from an explosion.
+ */
+ @Override
+ public boolean canDropFromExplosion(final Explosion bang) {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister iconRegister) {
+ this.blockIcon = iconRegister.registerIcon(GTPlusPlus.ID + ":" + "chrono/" + "MetalSheet2");
+ this.textureTop = iconRegister.registerIcon(GTPlusPlus.ID + ":" + "chrono/" + "MetalFunnel");
+ this.textureBottom = iconRegister.registerIcon(GTPlusPlus.ID + ":" + "chrono/" + "MetalPanel");
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/general/antigrief/BlockWitherProof.java b/gtpp/src/main/java/gtPlusPlus/core/block/general/antigrief/BlockWitherProof.java
new file mode 100644
index 0000000000..7e64f19bf3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/general/antigrief/BlockWitherProof.java
@@ -0,0 +1,161 @@
+package gtPlusPlus.core.block.general.antigrief;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+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.EnumCreatureType;
+import net.minecraft.entity.boss.EntityDragon;
+import net.minecraft.entity.boss.EntityWither;
+import net.minecraft.entity.boss.IBossDisplayData;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.world.Explosion;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+public class BlockWitherProof extends Block {
+
+ public BlockWitherProof() {
+ super(Material.redstoneLight);
+ this.setBlockName(Utils.sanitizeString("blockBlackGate"));
+ this.setBlockTextureName(GTPlusPlus.ID + ":" + "blockFrameGt");
+ this.setCreativeTab(AddToCreativeTab.tabBlock);
+ this.setHardness(-1F);
+ this.setResistance(5000.0F);
+ this.setHarvestLevel("pickaxe", 3);
+ this.setStepSound(soundTypeMetal);
+ GameRegistry.registerBlock(this, Utils.sanitizeString("blockBlackGate"));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister iIcon) {
+ this.blockIcon = iIcon.registerIcon(GTPlusPlus.ID + ":" + "blockFrameGt");
+ }
+
+ @Override
+ public void onBlockExploded(final World world, final int x, final int y, final int z, final Explosion explosion) {
+ // prevent from being destroyed by wither and nukes.
+ }
+
+ @Override
+ public void onBlockDestroyedByExplosion(final World p_149723_1_, final int p_149723_2_, final int p_149723_3_,
+ final int p_149723_4_, final Explosion p_149723_5_) {}
+
+ @Override
+ public boolean canDropFromExplosion(final Explosion p_149659_1_) {
+ return false;
+ }
+
+ @Override
+ public boolean canEntityDestroy(final IBlockAccess world, final int x, final int y, final int z,
+ final Entity entity) {
+ if ((entity == null) || !entity.isEntityAlive()) {
+ return false;
+ }
+ if ((entity instanceof EntityWither) || (entity instanceof EntityDragon)
+ || (entity instanceof IBossDisplayData)) {
+ return false;
+ } else {
+ return super.canEntityDestroy(world, x, y, z, entity);
+ }
+ }
+
+ // Colour Handling
+ private static final int mWitherColour = Utils.rgbtoHexValue(32, 32, 32);
+
+ @Override
+ public int colorMultiplier(final IBlockAccess par1IBlockAccess, final int par2, final int par3, final int par4) {
+ return mWitherColour;
+ }
+
+ @Override
+ public int getRenderColor(final int aMeta) {
+ return mWitherColour;
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ @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_) {
+ super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_);
+ }
+
+ @Override
+ public float getPlayerRelativeBlockHardness(EntityPlayer aPlayer, World p_149737_2_, int p_149737_3_,
+ int p_149737_4_, int p_149737_5_) {
+ if (aPlayer != null && aPlayer instanceof EntityPlayerMP) {
+ return 1f;
+ }
+ return -1f;
+ }
+
+ @Override
+ public float getExplosionResistance(Entity p_149638_1_) {
+ return Float.MAX_VALUE;
+ }
+
+ @Override
+ public void onBlockClicked(World p_149699_1_, int p_149699_2_, int p_149699_3_, int p_149699_4_,
+ EntityPlayer p_149699_5_) {
+ super.onBlockClicked(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_, p_149699_5_);
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) {
+ if ((entity == null) || !entity.isEntityAlive()) {
+ return;
+ }
+ if ((entity instanceof EntityWither) || (entity instanceof EntityDragon)
+ || (entity instanceof IBossDisplayData)) {
+ return;
+ } else {
+ super.onEntityCollidedWithBlock(world, x, y, z, entity);
+ }
+ }
+
+ @Override
+ public void harvestBlock(World p_149636_1_, EntityPlayer p_149636_2_, int p_149636_3_, int p_149636_4_,
+ int p_149636_5_, int p_149636_6_) {
+ super.harvestBlock(p_149636_1_, p_149636_2_, p_149636_3_, p_149636_4_, p_149636_5_, p_149636_6_);
+ }
+
+ @Override
+ public boolean canHarvestBlock(EntityPlayer player, int meta) {
+ if (player != null && player instanceof EntityPlayerMP) {
+ return true;
+ }
+ return super.canHarvestBlock(player, meta);
+ }
+
+ @Override
+ public float getExplosionResistance(Entity par1Entity, World world, int x, int y, int z, double explosionX,
+ double explosionY, double explosionZ) {
+ return Float.MAX_VALUE;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/general/fluids/BlockFluidSludge.java b/gtpp/src/main/java/gtPlusPlus/core/block/general/fluids/BlockFluidSludge.java
new file mode 100644
index 0000000000..200f85d31d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/general/fluids/BlockFluidSludge.java
@@ -0,0 +1,68 @@
+package gtPlusPlus.core.block.general.fluids;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.fluids.BlockFluidClassic;
+import net.minecraftforge.fluids.Fluid;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class BlockFluidSludge extends BlockFluidClassic {
+
+ @SideOnly(Side.CLIENT)
+ protected IIcon stillIcon;
+
+ @SideOnly(Side.CLIENT)
+ protected IIcon flowingIcon;
+
+ public BlockFluidSludge(final Fluid fluid, final Material material) {
+ super(fluid, material);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ((ordinalSide == 0) || (ordinalSide == 1)) ? this.stillIcon : this.flowingIcon;
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void registerBlockIcons(final IIconRegister register) {
+ this.stillIcon = register.registerIcon(GTPlusPlus.ID + ":fluids/fluid.jackdaniels");
+ this.flowingIcon = register.registerIcon(GTPlusPlus.ID + ":fluids/fluid.jackdaniels");
+ }
+
+ @Override
+ public boolean canDisplace(final IBlockAccess world, final int x, final int y, final int z) {
+ if (world.getBlock(x, y, z)
+ .getMaterial()
+ .isLiquid()) {
+ return false;
+ }
+ return super.canDisplace(world, x, y, z);
+ }
+
+ @Override
+ public boolean displaceIfPossible(final World world, final int x, final int y, final int z) {
+ if (world.getBlock(x, y, z)
+ .getMaterial()
+ .isLiquid()) {
+ return false;
+ }
+ return super.displaceIfPossible(world, x, y, z);
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/machine/CircuitProgrammer.java b/gtpp/src/main/java/gtPlusPlus/core/block/machine/CircuitProgrammer.java
new file mode 100644
index 0000000000..f6cd34aec1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/machine/CircuitProgrammer.java
@@ -0,0 +1,153 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.material.Material;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.minecraft.CubicObject;
+import gtPlusPlus.core.block.base.BasicTileBlockWithTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.handler.GuiHandler;
+import gtPlusPlus.core.tileentities.general.TileEntityCircuitProgrammer;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class CircuitProgrammer extends BasicTileBlockWithTooltip {
+
+ /**
+ * Determines which tooltip is displayed within the itemblock.
+ */
+ private final int mTooltipID = 4;
+
+ @Override
+ public int getTooltipID() {
+ return this.mTooltipID;
+ }
+
+ public CircuitProgrammer() {
+ super(Material.iron);
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ } else {
+
+ boolean mDidScrewDriver = false;
+ // Check For Screwdriver
+ try {
+ final ItemStack mHandStack = PlayerUtils.getItemStackInPlayersHand(world, player.getDisplayName());
+ final Item mHandItem = mHandStack.getItem();
+ if (((mHandItem instanceof GT_MetaGenerated_Tool_01)
+ && ((mHandItem.getDamage(mHandStack) == 22) || (mHandItem.getDamage(mHandStack) == 150)))) {
+ final TileEntityCircuitProgrammer tile = (TileEntityCircuitProgrammer) world.getTileEntity(x, y, z);
+ if (tile != null) {
+ mDidScrewDriver = tile.onScrewdriverRightClick((byte) side, player, x, y, z);
+ }
+ }
+ } catch (final Throwable t) {}
+
+ if (!mDidScrewDriver) {
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if ((te != null) && (te instanceof TileEntityCircuitProgrammer)) {
+ player.openGui(GTplusplus.instance, GuiHandler.GUI8, world, x, y, z);
+ return true;
+ }
+ } else {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityCircuitProgrammer();
+ }
+
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+
+ @Override
+ public void onBlockPlacedBy(final World world, final int x, final int y, final int z, final EntityLivingBase entity,
+ final ItemStack stack) {
+ if (stack.hasDisplayName()) {
+ ((TileEntityCircuitProgrammer) world.getTileEntity(x, y, z)).setCustomName(stack.getDisplayName());
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ @Override
+ public int getMetaCount() {
+ return 0;
+ }
+
+ @Override
+ public String getUnlocalBlockName() {
+ return "blockCircuitProgrammer";
+ }
+
+ @Override
+ protected float initBlockHardness() {
+ return 5f;
+ }
+
+ @Override
+ protected float initBlockResistance() {
+ return 1f;
+ }
+
+ @Override
+ protected CreativeTabs initCreativeTab() {
+ return AddToCreativeTab.tabMachines;
+ }
+
+ @Override
+ protected String getTileEntityName() {
+ return "Circuit Programmer";
+ }
+
+ @Override
+ public CubicObject<String>[] getCustomTextureDirectoryObject() {
+ String[] aTexData = new String[] { GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_G",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_TECH_PANEL_B",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_I",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_I",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_I",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_I" };
+ CubicObject<String>[] aTextureData = new CubicObject[] { new CubicObject<>(aTexData) };
+ return aTextureData;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/machine/DecayablesChest.java b/gtpp/src/main/java/gtPlusPlus/core/block/machine/DecayablesChest.java
new file mode 100644
index 0000000000..c333e7a5ca
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/machine/DecayablesChest.java
@@ -0,0 +1,186 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+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.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.core.client.renderer.RenderDecayChest;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.handler.GuiHandler;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockBasicTile;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+import gtPlusPlus.core.util.minecraft.InventoryUtils;
+
+public class DecayablesChest extends BlockContainer implements ITileTooltip {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureBottom;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureFront;
+
+ /**
+ * Determines which tooltip is displayed within the itemblock.
+ */
+ private final int mTooltipID = 5;
+
+ public final int field_149956_a = 0;
+
+ @Override
+ public int getTooltipID() {
+ return this.mTooltipID;
+ }
+
+ public DecayablesChest() {
+ super(Material.iron);
+ this.setBlockName("blockDecayablesChest");
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ this.setHardness(5f);
+ this.setResistance(1f);
+ GameRegistry.registerBlock(this, ItemBlockBasicTile.class, "blockDecayablesChest");
+ this.setBlockBounds(0.0625F, 0.0F, 0.0625F, 0.9375F, 0.875F, 0.9375F);
+ }
+
+ /**
+ * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two
+ * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
+ */
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ /**
+ * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
+ */
+ @Override
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ /**
+ * The type of render function that is called for this block
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderType() {
+ try {
+ if (RenderDecayChest.INSTANCE != null) {
+ return RenderDecayChest.INSTANCE.mRenderID;
+ }
+ return super.getRenderType();
+ } catch (NullPointerException n) {
+ return 0;
+ }
+ }
+
+ /**
+ * Updates the blocks bounds based on its current state. Args: world, x, y, z
+ */
+ @Override
+ public void setBlockBoundsBasedOnState(IBlockAccess p_149719_1_, int p_149719_2_, int p_149719_3_,
+ int p_149719_4_) {
+ if (p_149719_1_.getBlock(p_149719_2_, p_149719_3_, p_149719_4_ - 1) == this) {
+ this.setBlockBounds(0.0625F, 0.0F, 0.0F, 0.9375F, 0.875F, 0.9375F);
+ } else if (p_149719_1_.getBlock(p_149719_2_, p_149719_3_, p_149719_4_ + 1) == this) {
+ this.setBlockBounds(0.0625F, 0.0F, 0.0625F, 0.9375F, 0.875F, 1.0F);
+ } else if (p_149719_1_.getBlock(p_149719_2_ - 1, p_149719_3_, p_149719_4_) == this) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0625F, 0.9375F, 0.875F, 0.9375F);
+ } else if (p_149719_1_.getBlock(p_149719_2_ + 1, p_149719_3_, p_149719_4_) == this) {
+ this.setBlockBounds(0.0625F, 0.0F, 0.0625F, 1.0F, 0.875F, 0.9375F);
+ } else {
+ this.setBlockBounds(0.0625F, 0.0F, 0.0625F, 0.9375F, 0.875F, 0.9375F);
+ }
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ordinalSide == 1 ? this.textureTop : (ordinalSide == 0 ? this.textureBottom : this.textureFront);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "DecayablesChest_top");
+ this.textureTop = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "DecayablesChest_top");
+ this.textureBottom = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "DecayablesChest_side");
+ this.textureFront = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "DecayablesChest_bottom");
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ }
+
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if ((te != null) && (te instanceof TileEntityDecayablesChest)) {
+ player.openGui(GTplusplus.instance, GuiHandler.GUI13, world, x, y, z);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityDecayablesChest();
+ }
+
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+
+ @Override
+ public void breakBlock(final World world, final int x, final int y, final int z, final Block block,
+ final int number) {
+ InventoryUtils.dropInventoryItems(world, x, y, z, block);
+ super.breakBlock(world, x, y, z, block, number);
+ }
+
+ @Override
+ public void onBlockPlacedBy(final World world, final int x, final int y, final int z, final EntityLivingBase entity,
+ final ItemStack stack) {
+ if (stack.hasDisplayName()) {
+ ((TileEntityDecayablesChest) world.getTileEntity(x, y, z)).setCustomName(stack.getDisplayName());
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/machine/FishTrap.java b/gtpp/src/main/java/gtPlusPlus/core/block/machine/FishTrap.java
new file mode 100644
index 0000000000..0ec1ac629a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/machine/FishTrap.java
@@ -0,0 +1,136 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+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.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockBasicTile;
+import gtPlusPlus.core.tileentities.general.TileEntityFishTrap;
+import gtPlusPlus.core.util.minecraft.InventoryUtils;
+
+public class FishTrap extends BlockContainer implements ITileTooltip {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureBottom;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureFront;
+
+ /**
+ * Determines which tooltip is displayed within the itemblock.
+ */
+ private final int mTooltipID = 0;
+
+ @Override
+ public int getTooltipID() {
+ return this.mTooltipID;
+ }
+
+ public FishTrap() {
+ super(Material.iron);
+ this.setBlockName("blockFishTrap");
+ this.setHardness(5f);
+ this.setResistance(1f);
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerBlock(this, ItemBlockBasicTile.class, "blockFishTrap");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ordinalSide == 1 ? this.textureTop
+ : (ordinalSide == 0 ? this.textureBottom
+ : ((ordinalSide != 2) && (ordinalSide != 4) ? this.blockIcon : this.textureFront));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "fishtrap");
+ this.textureTop = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "fishtrap");
+ this.textureBottom = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "fishtrap");
+ this.textureFront = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "fishtrap");
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ }
+
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if ((te != null) && (te instanceof TileEntityFishTrap)) {
+ player.openGui(GTplusplus.instance, 5, world, x, y, z);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityFishTrap();
+ }
+
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+
+ @Override
+ public void breakBlock(final World world, final int x, final int y, final int z, final Block block,
+ final int number) {
+ InventoryUtils.dropInventoryItems(world, x, y, z, block);
+ super.breakBlock(world, x, y, z, block, number);
+ }
+
+ @Override
+ public void onBlockPlacedBy(final World world, final int x, final int y, final int z, final EntityLivingBase entity,
+ final ItemStack stack) {
+ if (stack.hasDisplayName()) {
+ ((TileEntityFishTrap) world.getTileEntity(x, y, z)).setCustomName(stack.getDisplayName());
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_PestKiller.java b/gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_PestKiller.java
new file mode 100644
index 0000000000..bf98a22500
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_PestKiller.java
@@ -0,0 +1,137 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+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.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.handler.GuiHandler;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockBasicTile;
+import gtPlusPlus.core.tileentities.machines.TileEntityPestKiller;
+import gtPlusPlus.core.util.minecraft.InventoryUtils;
+
+public class Machine_PestKiller extends BlockContainer implements ITileTooltip {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureBottom;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureFront;
+
+ /**
+ * Determines which tooltip is displayed within the itemblock.
+ */
+ private final int mTooltipID = 6;
+
+ @Override
+ public int getTooltipID() {
+ return this.mTooltipID;
+ }
+
+ public Machine_PestKiller() {
+ super(Material.wood);
+ this.setBlockName("blockPestKiller");
+ this.setHardness(5f);
+ this.setResistance(1f);
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerBlock(this, ItemBlockBasicTile.class, "blockPestKiller");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ordinalSide == 1 ? this.textureTop : (ordinalSide == 0 ? this.textureBottom : this.textureFront);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_
+ .registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "MACHINE_CASING_FARM_MANAGER_STRUCTURAL");
+ this.textureTop = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "MACHINE_PESTKILLER_TOP");
+ this.textureBottom = p_149651_1_.registerIcon("planks_acacia");
+ this.textureFront = p_149651_1_
+ .registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "MACHINE_CASING_FARM_MANAGER_STRUCTURAL");
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ }
+
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if ((te != null) && (te instanceof TileEntityPestKiller)) {
+ player.openGui(GTplusplus.instance, GuiHandler.GUI15, world, x, y, z);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 0;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityPestKiller();
+ }
+
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+
+ @Override
+ public void breakBlock(final World world, final int x, final int y, final int z, final Block block,
+ final int number) {
+ InventoryUtils.dropInventoryItems(world, x, y, z, block);
+ super.breakBlock(world, x, y, z, block, number);
+ }
+
+ @Override
+ public void onBlockPlacedBy(final World world, final int x, final int y, final int z, final EntityLivingBase entity,
+ final ItemStack stack) {
+ if (stack.hasDisplayName()) {
+ ((TileEntityPestKiller) world.getTileEntity(x, y, z)).setCustomName(stack.getDisplayName());
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_PooCollector.java b/gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_PooCollector.java
new file mode 100644
index 0000000000..4f1b679fcf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_PooCollector.java
@@ -0,0 +1,177 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+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.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockMeta;
+import gtPlusPlus.core.tileentities.machines.TileEntityAdvPooCollector;
+import gtPlusPlus.core.tileentities.machines.TileEntityBaseFluidCollector;
+import gtPlusPlus.core.tileentities.machines.TileEntityPooCollector;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class Machine_PooCollector extends BlockContainer {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop2;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureSide;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureSide2;
+
+ public Machine_PooCollector() {
+ super(Material.iron);
+ this.setHardness(5f);
+ this.setResistance(1f);
+ this.setBlockName("blockPooCollector");
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerBlock(this, ItemBlockMeta.class, "blockPooCollector");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ if (aMeta <= 7) {
+ blockIcon = textureSide;
+ return ordinalSide <= 1 ? this.textureTop : this.textureSide;
+ } else {
+ blockIcon = textureSide2;
+ return ordinalSide <= 1 ? this.textureTop2 : this.textureSide2;
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.textureTop = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "sewer_top");
+ this.textureTop2 = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "sewer_adv_top");
+ this.textureSide = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "sewer_sides");
+ this.textureSide2 = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "sewer_adv_sides");
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ } else {
+ TileEntityBaseFluidCollector tank = (TileEntityBaseFluidCollector) world.getTileEntity(x, y, z);
+ if (tank != null) {
+ Item handItem;
+ try {
+ handItem = player.getHeldItem()
+ .getItem();
+ } catch (Throwable t) {
+ handItem = null;
+ }
+
+ // Fluid container code
+ /*
+ * if (handItem != null && (handItem instanceof IFluidContainerItem || handItem instanceof
+ * ItemFluidContainer || FluidContainerRegistry.isFilledContainer(player.getHeldItem()))) { if
+ * (tank.tank.getFluid() == null) { try { if
+ * (!FluidContainerRegistry.isFilledContainer(player.getHeldItem())) { ItemStack handItemStack =
+ * player.getHeldItem(); IFluidContainerItem container = (IFluidContainerItem) handItem; FluidStack
+ * containerFluid = container.getFluid(handItemStack); container.drain(handItemStack,
+ * container.getFluid(handItemStack).amount, true); tank.tank.setFluid(containerFluid); } else {
+ * ItemStack handItemStack = player.getHeldItem();
+ * FluidContainerRegistry.drainFluidContainer(handItemStack); FluidStack containerFluid =
+ * FluidContainerRegistry.getFluidForFilledItem(handItemStack); ItemStack emptyContainer =
+ * FluidContainerRegistry.drainFluidContainer(handItemStack); player.setItemInUse(emptyContainer, 0);
+ * tank.tank.setFluid(containerFluid); } } catch (Throwable t) { t.printStackTrace(); } } }
+ */
+
+ if (!tank.mInventory.isEmpty()) {
+ PlayerUtils.messagePlayer(player, "Inventory contains:");
+ PlayerUtils.messagePlayer(player, ItemUtils.getArrayStackNames(tank.mInventory.getRealInventory()));
+ } else {
+ PlayerUtils.messagePlayer(player, "No solids collected yet.");
+ }
+ if (tank.tank.getFluid() != null) {
+ PlayerUtils.messagePlayer(
+ player,
+ "Tank contains " + tank.tank.getFluidAmount()
+ + "L of "
+ + tank.tank.getFluid()
+ .getLocalizedName());
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 0;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return super.isOpaqueCube();
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int aMeta) {
+ return aMeta <= 7 ? new TileEntityPooCollector() : new TileEntityAdvPooCollector();
+ }
+
+ @Override
+ public void onBlockAdded(World world, int x, int y, int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+
+ @Override
+ public int getBlockColor() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public int damageDropped(final int damage) {
+ return damage;
+ }
+
+ @Override
+ public Item getItemDropped(final int meta, final Random rand, final int fortune) {
+ return Item.getItemFromBlock(this);
+ }
+
+ @Override
+ public int getRenderColor(int aMeta) {
+ return super.getRenderColor(aMeta);
+ }
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs aTab, List aList) {
+ aList.add(new ItemStack(aItem, 1, 0));
+ aList.add(new ItemStack(aItem, 1, 8));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_ProjectTable.java b/gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_ProjectTable.java
new file mode 100644
index 0000000000..4f0d0d7d60
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_ProjectTable.java
@@ -0,0 +1,160 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.BuildCraftCore;
+import static gregtech.api.enums.Mods.EnderIO;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Mods;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockBasicTile;
+import gtPlusPlus.core.tileentities.machines.TileEntityProjectTable;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import ic2.core.item.tool.ItemToolWrench;
+
+@Optional.Interface(iface = "crazypants.enderio.api.tool.ITool", modid = Mods.Names.ENDER_I_O)
+public class Machine_ProjectTable extends BlockContainer implements ITileTooltip {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureTop;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureBottom;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon textureFront;
+
+ /**
+ * Determines which tooltip is displayed within the itemblock.
+ */
+ private final int mTooltipID = 3;
+
+ @Override
+ public int getTooltipID() {
+ return this.mTooltipID;
+ }
+
+ public Machine_ProjectTable() {
+ super(Material.iron);
+ this.setBlockName("blockProjectBench");
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerBlock(this, ItemBlockBasicTile.class, "blockProjectBench");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ return ordinalSide == 1 ? this.textureTop
+ : (ordinalSide == 0 ? this.textureBottom
+ : ((ordinalSide != 2) && (ordinalSide != 4) ? this.blockIcon : this.textureFront));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "machine_top");
+ this.textureTop = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "cover_crafting");
+ this.textureBottom = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "machine_top");
+ this.textureFront = p_149651_1_.registerIcon(GTPlusPlus.ID + ":" + "TileEntities/" + "machine_top");
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+
+ ItemStack heldItem = null;
+ if (world.isRemote) {
+ heldItem = PlayerUtils.getItemStackInPlayersHand();
+ }
+
+ boolean holdingWrench = false;
+
+ if (heldItem != null) {
+ holdingWrench = isWrench(heldItem);
+ }
+
+ if (world.isRemote) {
+ return true;
+ }
+
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if (te instanceof TileEntityProjectTable) {
+ if (!holdingWrench) {
+ player.openGui(GTplusplus.instance, 0, world, x, y, z);
+ return true;
+ }
+ Logger.INFO("Holding a Wrench, doing wrench things instead.");
+ }
+ return false;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityProjectTable();
+ }
+
+ public static boolean isWrench(final ItemStack item) {
+ if (item.getItem() instanceof ItemToolWrench) {
+ return true;
+ }
+ if (BuildCraftCore.isModLoaded()) {
+ return checkBuildcraftWrench(item);
+ }
+ if (EnderIO.isModLoaded()) {
+ return checkEnderIOWrench(item);
+ }
+ return false;
+ }
+
+ private static boolean checkEnderIOWrench(final ItemStack item) {
+ if (ReflectionUtils.doesClassExist("crazypants.enderio.api.tool.ITool")) {
+ Class<?> wrenchClass;
+ wrenchClass = ReflectionUtils.getClass("crazypants.enderio.api.tool.ITool");
+ if (wrenchClass.isInstance(item.getItem())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static boolean checkBuildcraftWrench(final ItemStack item) {
+ if (ReflectionUtils.doesClassExist("buildcraft.api.tools.IToolWrench")) {
+ Class<?> wrenchClass;
+ wrenchClass = ReflectionUtils.getClass("buildcraft.api.tools.IToolWrench");
+ if (wrenchClass.isInstance(item.getItem())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_SuperJukebox.java b/gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_SuperJukebox.java
new file mode 100644
index 0000000000..470fa98a9b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/machine/Machine_SuperJukebox.java
@@ -0,0 +1,558 @@
+package gtPlusPlus.core.block.machine;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockJukebox;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemRecord;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.handler.GuiHandler;
+import gtPlusPlus.core.inventories.Inventory_SuperJukebox;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public class Machine_SuperJukebox extends BlockJukebox {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon mIcon;
+
+ public Machine_SuperJukebox() {
+ this.setBlockName("blockSuperJukebox");
+ this.setCreativeTab(CreativeTabs.tabRedstone);
+ setHardness(2.0F);
+ setResistance(10.0F);
+ setStepSound(soundTypePiston);
+ setBlockTextureName("jukebox");
+ GameRegistry.registerBlock(this, "blockSuperJukebox");
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return ordinalSide == 1 ? this.mIcon : this.blockIcon;
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ }
+
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if ((te != null) && (te instanceof TileEntitySuperJukebox)) {
+ player.openGui(GTplusplus.instance, GuiHandler.GUI14, world, x, y, z);
+ return true;
+ }
+ return false;
+
+ /*
+ * if (aWorld.getBlockMetadata(aX, aY, aZ) == 0) { return false; } else { this.func_149925_e(aWorld, aX, aY,
+ * aZ); return true; }
+ */
+ }
+
+ /**
+ * Set the record in the {@link SuperJukebox} {@link TileEntity}.
+ */
+ @Override
+ public final void func_149926_b(World aWorld, int aX, int aY, int aZ, ItemStack aStackToSet) {
+ setRecordInJukeBox(aWorld, aX, aY, aZ, aStackToSet);
+ }
+
+ public void setRecordInJukeBox(World aWorld, int aX, int aY, int aZ, ItemStack aStackToSet) {
+ if (!aWorld.isRemote) {
+ TileEntitySuperJukebox tileentityjukebox = (TileEntitySuperJukebox) aWorld.getTileEntity(aX, aY, aZ);
+ if (tileentityjukebox != null && aStackToSet.getItem() instanceof ItemRecord) {
+ tileentityjukebox.setCurrentRecord(aStackToSet.copy());
+ // aWorld.setBlockMetadataWithNotify(aX, aY, aZ, 1, 2);
+ }
+ }
+ }
+
+ /**
+ * Function to handle playing of records.
+ */
+ @Override
+ public final void func_149925_e(World aWorld, int aX, int aY, int aZ) {
+ playJukeboxRecord(aWorld, aX, aY, aZ);
+ }
+
+ public void playJukeboxRecord(World aWorld, int aX, int aY, int aZ) {
+ if (!aWorld.isRemote) {
+ TileEntitySuperJukebox tileentityjukebox = (TileEntitySuperJukebox) aWorld.getTileEntity(aX, aY, aZ);
+
+ if (tileentityjukebox != null) {
+ ItemStack itemstack = tileentityjukebox.func_145856_a();
+
+ if (itemstack != null) {
+
+ aWorld.playAuxSFX(1005, aX, aY, aZ, Item.getIdFromItem(itemstack.getItem()));
+ /*
+ * float f = 0.7F; double d0 = (double) (aWorld.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
+ * double d1 = (double) (aWorld.rand.nextFloat() * f) + (double) (1.0F - f) * 0.2D + 0.6D; double d2
+ * = (double) (aWorld.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; ItemStack itemstack1 =
+ * itemstack.copy(); EntityItem entityitem = new EntityItem(aWorld, (double) aX + d0, (double) aY +
+ * d1, (double) aZ + d2, itemstack1); entityitem.delayBeforeCanPickup = 10;
+ * aWorld.spawnEntityInWorld(entityitem);
+ */
+ }
+ }
+ }
+ }
+
+ @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_) {
+ this.func_149925_e(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_);
+ super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_);
+ }
+
+ /**
+ * Drops the block items with a specified chance of dropping the specified items
+ */
+ @Override
+ public void dropBlockAsItemWithChance(World p_149690_1_, int p_149690_2_, int p_149690_3_, int p_149690_4_,
+ int p_149690_5_, float p_149690_6_, int p_149690_7_) {
+ if (!p_149690_1_.isRemote) {
+ super.dropBlockAsItemWithChance(
+ p_149690_1_,
+ p_149690_2_,
+ p_149690_3_,
+ p_149690_4_,
+ p_149690_5_,
+ p_149690_6_,
+ 0);
+ }
+ }
+
+ /**
+ * Returns a new instance of a block's tile entity class. Called on placing the block.
+ */
+ @Override
+ public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
+ return new TileEntitySuperJukebox();
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void registerBlockIcons(IIconRegister p_149651_1_) {
+ this.blockIcon = p_149651_1_.registerIcon(this.getTextureName() + "_side");
+ this.mIcon = p_149651_1_.registerIcon(this.getTextureName() + "_top");
+ }
+
+ public static class TileEntitySuperJukebox extends TileEntityJukebox implements ISidedInventory {
+
+ /** The number of players currently using this chest */
+ public int numPlayersUsing;
+
+ private ItemStack mCurrentlyPlayingStack;
+ private final Inventory_SuperJukebox inventoryContents;
+ private String customName;
+
+ /*
+ * Important Data
+ */
+
+ public int a_TEST_INT_VAR_1;
+ public int a_TEST_INT_VAR_2;
+ public int a_TEST_INT_VAR_3;
+ public int a_TEST_INT_VAR_4;
+
+ public boolean mIsPlaying = false;
+ public boolean mIsLooping = false;
+ public boolean a_TEST_BOOL_VAR_3;
+ public boolean a_TEST_BOOL_VAR_4;
+
+ public TileEntitySuperJukebox() {
+ this.inventoryContents = new Inventory_SuperJukebox();
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound aNBT) {
+ super.readFromNBT(aNBT);
+
+ if (aNBT.hasKey("RecordItem", 10)) {
+ this.func_145857_a(ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag("RecordItem")));
+ } else if (aNBT.getInteger("Record") > 0) {
+ this.func_145857_a(new ItemStack(Item.getItemById(aNBT.getInteger("Record")), 1, 0));
+ }
+
+ this.inventoryContents.readFromNBT(aNBT.getCompoundTag("ContentsChest"));
+ if (aNBT.hasKey("CustomName", 8)) {
+ this.setCustomName(aNBT.getString("CustomName"));
+ }
+
+ mIsPlaying = aNBT.getBoolean("mIsPlaying");
+ mIsLooping = aNBT.getBoolean("mIsLooping");
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound aNBT) {
+ super.writeToNBT(aNBT);
+
+ if (this.getCurrentRecord() != null) {
+ aNBT.setTag(
+ "RecordItem",
+ this.func_145856_a()
+ .writeToNBT(new NBTTagCompound()));
+ aNBT.setInteger(
+ "Record",
+ Item.getIdFromItem(
+ this.func_145856_a()
+ .getItem()));
+ }
+
+ final NBTTagCompound chestData = new NBTTagCompound();
+ this.inventoryContents.writeToNBT(chestData);
+ aNBT.setTag("ContentsChest", chestData);
+ if (this.hasCustomInventoryName()) {
+ aNBT.setString("CustomName", this.getCustomName());
+ }
+
+ aNBT.setBoolean("mIsPlaying", mIsPlaying);
+ aNBT.setBoolean("mIsLooping", mIsLooping);
+ }
+
+ /**
+ * Called to get the internal stack
+ */
+ @Override
+ public ItemStack func_145856_a() {
+ return this.mCurrentlyPlayingStack;
+ }
+
+ /**
+ * Called to get the internal stack, wraps vanilla function {@link func_145856_a}.
+ */
+ public ItemStack getCurrentRecord() {
+ return func_145856_a();
+ }
+
+ /**
+ * Called to set the internal stack
+ */
+ @Override
+ public void func_145857_a(ItemStack p_145857_1_) {
+ this.mCurrentlyPlayingStack = p_145857_1_;
+ this.markDirty();
+ }
+
+ /**
+ * Called to set the internal stack, wraps vanilla function {@link func_145857_a}.
+ */
+ public void setCurrentRecord(ItemStack aStack) {
+ func_145857_a(aStack);
+ this.markDirty();
+ }
+
+ public Inventory_SuperJukebox getInventory() {
+ return this.inventoryContents;
+ }
+
+ public boolean playRecord(ItemStack aRecord) {
+
+ return false;
+ }
+
+ public boolean stopRecord() {
+ return openDiscDrive();
+ }
+
+ public void setLoopState(boolean isShufflingForever) {}
+
+ // Play button pressed
+ public boolean jukeboxLogicUpdate() {
+
+ if (this.worldObj.isRemote) {
+ return true;
+ }
+
+ Logger.INFO("a");
+ if (this.mIsPlaying || this.mIsLooping) {
+ return selectRecordToPlayFromInventoryAndSetViaVanillaHandler();
+ } else {
+ return stopRecord();
+ }
+ }
+
+ // Determine which record to play
+ public boolean selectRecordToPlayFromInventoryAndSetViaVanillaHandler() {
+ AutoMap<ItemStack> mValidRecords = new AutoMap<>();
+ for (ItemStack g : this.getInventory()
+ .getInventory()) {
+ if (g != null) {
+ if (g.getItem() instanceof ItemRecord) {
+ mValidRecords.put(g);
+ }
+ }
+ }
+
+ Logger.INFO("b1");
+ // Select First Record
+ ItemStack aRecordToPlay;
+ if (mValidRecords.size() == 0) {
+ Logger.INFO("bX");
+ return false;
+ } else {
+ aRecordToPlay = mValidRecords.get(!mIsLooping ? 0 : MathUtils.randInt(0, (mValidRecords.size() - 1)));
+ }
+ Logger.INFO("b2 - " + aRecordToPlay.getDisplayName());
+
+ int aSlotCounter = 0;
+ for (ItemStack g : this.getInventory()
+ .getInventory()) {
+ if (g != null && aSlotCounter <= 17) {
+ Logger.INFO("b3 - " + g.getDisplayName());
+ if (GT_Utility.areStacksEqual(g, aRecordToPlay, true)) {
+ IInventory aThisInv = this.getInventory();
+ if (aThisInv.getStackInSlot(20) != null) {
+ openDiscDrive();
+ }
+
+ GT_Utility.moveStackFromSlotAToSlotB(
+ aThisInv,
+ aThisInv,
+ aSlotCounter,
+ 20,
+ (byte) 1,
+ (byte) 1,
+ (byte) 1,
+ (byte) 1);
+ setCurrentRecord(aThisInv.getStackInSlot(20));
+
+ World aWorld = this.worldObj;
+ int aX = this.xCoord;
+ int aY = this.yCoord;
+ int aZ = this.zCoord;
+ if (!aWorld.isRemote) {
+ aRecordToPlay = this.func_145856_a();
+ if (aRecordToPlay != null) {
+ aWorld.playAuxSFX(1005, aX, aY, aZ, Item.getIdFromItem(aRecordToPlay.getItem()));
+ this.markDirty();
+ return true;
+ }
+ }
+
+ Logger.INFO("b++");
+ this.markDirty();
+ return false;
+ }
+ }
+ aSlotCounter++;
+ }
+
+ Logger.INFO("b4");
+ this.markDirty();
+ return false;
+ }
+
+ public boolean genericMethodThree(Object a1, Object a2, Object a3, Object a4) {
+ return false;
+ }
+
+ public void vanillaStopJukebox() {
+ World aWorld = this.worldObj;
+ int aX = this.xCoord;
+ int aY = this.yCoord;
+ int aZ = this.zCoord;
+ if (!aWorld.isRemote) {
+ TileEntitySuperJukebox tileentityjukebox = (TileEntitySuperJukebox) aWorld.getTileEntity(aX, aY, aZ);
+ if (tileentityjukebox != null) {
+ ItemStack aRecordToPlay = tileentityjukebox.func_145856_a();
+ if (aRecordToPlay != null) {
+ aWorld.playAuxSFX(1005, aX, aY, aZ, 0);
+ aWorld.playRecord((String) null, aX, aY, aZ);
+ tileentityjukebox.func_145857_a((ItemStack) null);
+ this.markDirty();
+ }
+ }
+ }
+ }
+
+ public boolean openDiscDrive() {
+ int aSlotCounter = 17;
+
+ ItemStack g;
+
+ for (int i = 17; i >= 0; i--) {
+ g = this.getInventory()
+ .getInventory()[i];
+ if (g == null && aSlotCounter >= 0) {
+ IInventory aThisInv = this.getInventory();
+ GT_Utility
+ .moveStackFromSlotAToSlotB(aThisInv, aThisInv, 20, i, (byte) 1, (byte) 1, (byte) 1, (byte) 1);
+ vanillaStopJukebox();
+ Logger.INFO("b++");
+ this.markDirty();
+ return true;
+ }
+ }
+
+ /*
+ * for (ItemStack g : this.getInventory().getInventory()) { if (g == null && aSlotCounter >= 0) { IInventory
+ * aThisInv = this.getInventory(); GT_Utility.moveStackFromSlotAToSlotB(aThisInv, aThisInv, 20,
+ * aSlotCounter, (byte) 1, (byte) 1, (byte) 1, (byte) 1); vanillaStopJukebox(); Logger.INFO("b++"); return
+ * true; } aSlotCounter--; }
+ */
+ this.markDirty();
+ return false;
+ }
+
+ public boolean anyPlayerInRange() {
+ return this.worldObj.getClosestPlayer(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, 32)
+ != null;
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.getInventory()
+ .getSizeInventory() - 3;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.getInventory()
+ .getStackInSlot(slot);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int count) {
+ return this.getInventory()
+ .decrStackSize(slot, count);
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ return this.getInventory()
+ .getStackInSlotOnClosing(slot);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.getInventory()
+ .setInventorySlotContents(slot, stack);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return this.getInventory()
+ .isUseableByPlayer(entityplayer);
+ }
+
+ @Override
+ public void openInventory() {
+ if (this.numPlayersUsing < 0) {
+ this.numPlayersUsing = 0;
+ }
+ if (!this.worldObj.isRemote) {
+ this.numPlayersUsing++;
+ }
+ this.worldObj
+ .addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, this.numPlayersUsing);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ if (!this.worldObj.isRemote) {
+ this.numPlayersUsing--;
+ }
+ this.worldObj
+ .addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, this.numPlayersUsing);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .closeInventory();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ if (slot >= 18) {
+ return false;
+ }
+ return this.getInventory()
+ .isItemValidForSlot(slot, itemstack);
+ }
+
+ private static final int[] SIDED_SLOTS = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17 };
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ return SIDED_SLOTS;
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ if (p_102007_1_ >= 18) {
+ return false;
+ }
+ return this.getInventory()
+ .isItemValidForSlot(p_102007_1_, p_102007_2_);
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ if (p_102008_1_ >= 18) {
+ return false;
+ }
+ return this.getInventory()
+ .isItemValidForSlot(p_102008_1_, p_102008_2_);
+ }
+
+ public String getCustomName() {
+ return this.customName;
+ }
+
+ public void setCustomName(final String customName) {
+ this.customName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.customName : "container.SuperJukebox";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return (this.customName != null) && !this.customName.equals("");
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/block/machine/VolumetricFlaskSetter.java b/gtpp/src/main/java/gtPlusPlus/core/block/machine/VolumetricFlaskSetter.java
new file mode 100644
index 0000000000..1bca4a5c5f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/block/machine/VolumetricFlaskSetter.java
@@ -0,0 +1,157 @@
+package gtPlusPlus.core.block.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.material.Material;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.minecraft.CubicObject;
+import gtPlusPlus.core.block.base.BasicTileBlockWithTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.handler.GuiHandler;
+import gtPlusPlus.core.item.base.itemblock.ItemBlockBasicTile;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class VolumetricFlaskSetter extends BasicTileBlockWithTooltip {
+
+ /**
+ * Determines which tooltip is displayed within the itemblock.
+ */
+ private final int mTooltipID = 8;
+
+ @Override
+ public int getTooltipID() {
+ return this.mTooltipID;
+ }
+
+ @Override
+ public Class<? extends ItemBlock> getItemBlockClass() {
+ return ItemBlockBasicTile.class;
+ }
+
+ public VolumetricFlaskSetter() {
+ super(Material.iron);
+ }
+
+ /**
+ * Called upon block activation (right click on the block.)
+ */
+ @Override
+ public boolean onBlockActivated(final World world, final int x, final int y, final int z, final EntityPlayer player,
+ final int side, final float lx, final float ly, final float lz) {
+ if (world.isRemote) {
+ return true;
+ } else {
+
+ boolean mDidScrewDriver = false;
+ // Check For Screwdriver
+ try {
+ final ItemStack mHandStack = PlayerUtils.getItemStackInPlayersHand(world, player.getDisplayName());
+ final Item mHandItem = mHandStack.getItem();
+ if (((mHandItem instanceof GT_MetaGenerated_Tool_01)
+ && ((mHandItem.getDamage(mHandStack) == 22) || (mHandItem.getDamage(mHandStack) == 150)))) {
+ final TileEntityVolumetricFlaskSetter tile = (TileEntityVolumetricFlaskSetter) world
+ .getTileEntity(x, y, z);
+ if (tile != null) {
+ mDidScrewDriver = tile.onScrewdriverRightClick((byte) side, player, x, y, z);
+ }
+ }
+ } catch (final Throwable t) {}
+
+ if (!mDidScrewDriver) {
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if ((te != null) && (te instanceof TileEntityVolumetricFlaskSetter aTile)) {
+ player.openGui(GTplusplus.instance, GuiHandler.GUI18, world, x, y, z);
+ // new Packet_VolumetricFlaskGui2(aTile, aTile.getCustomValue());
+ return true;
+ }
+ } else {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 0;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(final World world, final int p_149915_2_) {
+ return new TileEntityVolumetricFlaskSetter();
+ }
+
+ @Override
+ public void onBlockAdded(final World world, final int x, final int y, final int z) {
+ super.onBlockAdded(world, x, y, z);
+ }
+
+ @Override
+ public void onBlockPlacedBy(final World world, final int x, final int y, final int z, final EntityLivingBase entity,
+ final ItemStack stack) {
+ if (stack.hasDisplayName()) {
+ ((TileEntityVolumetricFlaskSetter) world.getTileEntity(x, y, z)).setCustomName(stack.getDisplayName());
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ @Override
+ public int getMetaCount() {
+ return 0;
+ }
+
+ @Override
+ public String getUnlocalBlockName() {
+ return "blockVolumetricFlaskSetter";
+ }
+
+ @Override
+ protected float initBlockHardness() {
+ return 5f;
+ }
+
+ @Override
+ protected float initBlockResistance() {
+ return 1f;
+ }
+
+ @Override
+ protected CreativeTabs initCreativeTab() {
+ return AddToCreativeTab.tabMachines;
+ }
+
+ @Override
+ protected String getTileEntityName() {
+ return "Volumetric Flask Configurator";
+ }
+
+ @Override
+ public CubicObject<String>[] getCustomTextureDirectoryObject() {
+ String[] aTexData = new String[] { GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_A",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_TECH_PANEL_C",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_H",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_H",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_H",
+ GTPlusPlus.ID + ":" + "metro/" + "TEXTURE_METAL_PANEL_H" };
+ CubicObject<String>[] aTextureData = new CubicObject[] { new CubicObject<>(aTexData) };
+ return aTextureData;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/client/CustomTextureSet.java b/gtpp/src/main/java/gtPlusPlus/core/client/CustomTextureSet.java
new file mode 100644
index 0000000000..ce4d9a0320
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/client/CustomTextureSet.java
@@ -0,0 +1,30 @@
+package gtPlusPlus.core.client;
+
+import gregtech.api.enums.TextureSet;
+
+public class CustomTextureSet extends TextureSet {
+
+ public static enum TextureSets {
+
+ REFINED(),
+ GEM_A(),
+ ENRICHED(),
+ NUCLEAR;
+
+ private final CustomTextureSet A;
+
+ private TextureSets() {
+ A = new CustomTextureSet(
+ this.name()
+ .toUpperCase());
+ }
+
+ public CustomTextureSet get() {
+ return A;
+ }
+ }
+
+ public CustomTextureSet(String aSetName) {
+ super(aSetName);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/client/model/ModelDecayChest.java b/gtpp/src/main/java/gtPlusPlus/core/client/model/ModelDecayChest.java
new file mode 100644
index 0000000000..ef0943684c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/client/model/ModelDecayChest.java
@@ -0,0 +1,45 @@
+package gtPlusPlus.core.client.model;
+
+import net.minecraft.client.model.ModelBase;
+import net.minecraft.client.model.ModelRenderer;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class ModelDecayChest extends ModelBase {
+
+ /** The chest lid in the chest's model. */
+ public ModelRenderer chestLid = (new ModelRenderer(this, 0, 0)).setTextureSize(64, 64);
+ /** The model of the bottom of the chest. */
+ public ModelRenderer chestBelow;
+ /** The chest's knob in the chest model. */
+ public ModelRenderer chestKnob;
+
+ public ModelDecayChest() {
+ this.chestLid.addBox(0.0F, -5.0F, -14.0F, 14, 5, 14, 0.0F);
+ this.chestLid.rotationPointX = 1.0F;
+ this.chestLid.rotationPointY = 7.0F;
+ this.chestLid.rotationPointZ = 15.0F;
+ this.chestKnob = (new ModelRenderer(this, 0, 0)).setTextureSize(64, 64);
+ this.chestKnob.addBox(-1.0F, -2.0F, -15.0F, 2, 4, 1, 0.0F);
+ this.chestKnob.rotationPointX = 8.0F;
+ this.chestKnob.rotationPointY = 7.0F;
+ this.chestKnob.rotationPointZ = 15.0F;
+ this.chestBelow = (new ModelRenderer(this, 0, 19)).setTextureSize(64, 64);
+ this.chestBelow.addBox(0.0F, 0.0F, 0.0F, 14, 10, 14, 0.0F);
+ this.chestBelow.rotationPointX = 1.0F;
+ this.chestBelow.rotationPointY = 6.0F;
+ this.chestBelow.rotationPointZ = 1.0F;
+ }
+
+ /**
+ * This method renders out all parts of the chest model.
+ */
+ public void renderAll() {
+ this.chestKnob.rotateAngleX = this.chestLid.rotateAngleX;
+ this.chestLid.render(0.0625F);
+ this.chestKnob.render(0.0625F);
+ this.chestBelow.render(0.0625F);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/client/model/ModelSickBlaze.java b/gtpp/src/main/java/gtPlusPlus/core/client/model/ModelSickBlaze.java
new file mode 100644
index 0000000000..3b5922444d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/client/model/ModelSickBlaze.java
@@ -0,0 +1,87 @@
+package gtPlusPlus.core.client.model;
+
+import net.minecraft.client.model.ModelBlaze;
+import net.minecraft.client.model.ModelRenderer;
+import net.minecraft.entity.Entity;
+import net.minecraft.util.MathHelper;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class ModelSickBlaze extends ModelBlaze {
+
+ /** The sticks that fly around the Blaze. */
+ private ModelRenderer[] blazeSticks = new ModelRenderer[24];
+
+ private ModelRenderer blazeHead;
+
+ public ModelSickBlaze() {
+ for (int i = 0; i < this.blazeSticks.length; ++i) {
+ this.blazeSticks[i] = new ModelRenderer(this, 0, 16);
+ this.blazeSticks[i].addBox(0.0F, 0.0F, 0.0F, 2, 8, 2);
+ }
+
+ this.blazeHead = new ModelRenderer(this, 0, 0);
+ this.blazeHead.addBox(-4.0F, -4.0F, -4.0F, 8, 8, 8);
+ }
+
+ @Override
+ public int func_78104_a() {
+ return 8;
+ }
+
+ /**
+ * Sets the models various rotation angles then renders the model.
+ */
+ @Override
+ public void render(Entity p_78088_1_, float p_78088_2_, float p_78088_3_, float p_78088_4_, float p_78088_5_,
+ float p_78088_6_, float p_78088_7_) {
+ this.setRotationAngles(p_78088_2_, p_78088_3_, p_78088_4_, p_78088_5_, p_78088_6_, p_78088_7_, p_78088_1_);
+ this.blazeHead.render(p_78088_7_);
+
+ for (ModelRenderer blazeStick : this.blazeSticks) {
+ blazeStick.render(p_78088_7_);
+ }
+ }
+
+ /**
+ * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms
+ * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how
+ * "far" arms and legs can swing at most.
+ */
+ @Override
+ public void setRotationAngles(float p_78087_1_, float p_78087_2_, float p_78087_3_, float p_78087_4_,
+ float p_78087_5_, float p_78087_6_, Entity p_78087_7_) {
+ float f6 = p_78087_3_ * (float) Math.PI * -0.1F;
+ int i;
+
+ for (i = 0; i < 4; ++i) {
+ this.blazeSticks[i].rotationPointY = -2.0F + MathHelper.cos((i * 2 + p_78087_3_) * 0.25F);
+ this.blazeSticks[i].rotationPointX = MathHelper.cos(f6) * 9.0F;
+ this.blazeSticks[i].rotationPointZ = MathHelper.sin(f6) * 9.0F;
+ ++f6;
+ }
+
+ f6 = ((float) Math.PI / 4F) + p_78087_3_ * (float) Math.PI * 0.03F;
+
+ for (i = 4; i < 8; ++i) {
+ this.blazeSticks[i].rotationPointY = 2.0F + MathHelper.cos((i * 2 + p_78087_3_) * 0.25F);
+ this.blazeSticks[i].rotationPointX = MathHelper.cos(f6) * 7.0F;
+ this.blazeSticks[i].rotationPointZ = MathHelper.sin(f6) * 7.0F;
+ ++f6;
+ }
+
+ f6 = 0.47123894F + p_78087_3_ * (float) Math.PI * -0.05F;
+
+ for (i = 8; i < 12; ++i) {
+ this.blazeSticks[i].rotationPointY = 11.0F + MathHelper.cos((i * 1.5F + p_78087_3_) * 0.5F);
+ this.blazeSticks[i].rotationPointX = MathHelper.cos(f6) * 5.0F;
+ this.blazeSticks[i].rotationPointZ = MathHelper.sin(f6) * 5.0F;
+ ++f6;
+ }
+
+ this.blazeHead.rotateAngleY = p_78087_4_ / (180F / (float) Math.PI);
+ this.blazeHead.rotateAngleX = p_78087_5_ / (180F / (float) Math.PI);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/client/model/ModelStaballoyConstruct.java b/gtpp/src/main/java/gtPlusPlus/core/client/model/ModelStaballoyConstruct.java
new file mode 100644
index 0000000000..457bc7a377
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/client/model/ModelStaballoyConstruct.java
@@ -0,0 +1,117 @@
+package gtPlusPlus.core.client.model;
+
+import net.minecraft.client.model.ModelIronGolem;
+import net.minecraft.client.model.ModelRenderer;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityIronGolem;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class ModelStaballoyConstruct extends ModelIronGolem {
+
+ public ModelStaballoyConstruct() {
+ this(0.0F);
+ }
+
+ public ModelStaballoyConstruct(float p_i1161_1_) {
+ this(p_i1161_1_, -7.0F);
+ }
+
+ public ModelStaballoyConstruct(float p_i1162_1_, float p_i1162_2_) {
+ short short1 = 128;
+ short short2 = 128;
+ this.ironGolemHead = (new ModelRenderer(this)).setTextureSize(short1, short2);
+ this.ironGolemHead.setRotationPoint(0.0F, 0.0F + p_i1162_2_, -2.0F);
+ this.ironGolemHead.setTextureOffset(0, 0)
+ .addBox(-4.0F, -12.0F, -5.5F, 8, 10, 8, p_i1162_1_);
+ this.ironGolemHead.setTextureOffset(24, 0)
+ .addBox(-1.0F, -5.0F, -7.5F, 2, 4, 2, p_i1162_1_);
+ this.ironGolemBody = (new ModelRenderer(this)).setTextureSize(short1, short2);
+ this.ironGolemBody.setRotationPoint(0.0F, 0.0F + p_i1162_2_, 0.0F);
+ this.ironGolemBody.setTextureOffset(0, 40)
+ .addBox(-9.0F, -2.0F, -6.0F, 18, 12, 11, p_i1162_1_);
+ this.ironGolemBody.setTextureOffset(0, 70)
+ .addBox(-4.5F, 10.0F, -3.0F, 9, 5, 6, p_i1162_1_ + 0.5F);
+ this.ironGolemRightArm = (new ModelRenderer(this)).setTextureSize(short1, short2);
+ this.ironGolemRightArm.setRotationPoint(0.0F, -7.0F, 0.0F);
+ this.ironGolemRightArm.setTextureOffset(60, 21)
+ .addBox(-13.0F, -2.5F, -3.0F, 4, 30, 6, p_i1162_1_);
+ this.ironGolemLeftArm = (new ModelRenderer(this)).setTextureSize(short1, short2);
+ this.ironGolemLeftArm.setRotationPoint(0.0F, -7.0F, 0.0F);
+ this.ironGolemLeftArm.setTextureOffset(60, 58)
+ .addBox(9.0F, -2.5F, -3.0F, 4, 30, 6, p_i1162_1_);
+ this.ironGolemLeftLeg = (new ModelRenderer(this, 0, 22)).setTextureSize(short1, short2);
+ this.ironGolemLeftLeg.setRotationPoint(-4.0F, 18.0F + p_i1162_2_, 0.0F);
+ this.ironGolemLeftLeg.setTextureOffset(37, 0)
+ .addBox(-3.5F, -3.0F, -3.0F, 6, 16, 5, p_i1162_1_);
+ this.ironGolemRightLeg = (new ModelRenderer(this, 0, 22)).setTextureSize(short1, short2);
+ this.ironGolemRightLeg.mirror = true;
+ this.ironGolemRightLeg.setTextureOffset(60, 0)
+ .setRotationPoint(5.0F, 18.0F + p_i1162_2_, 0.0F);
+ this.ironGolemRightLeg.addBox(-3.5F, -3.0F, -3.0F, 6, 16, 5, p_i1162_1_);
+ }
+
+ /**
+ * Sets the models various rotation angles then renders the model.
+ */
+ @Override
+ public void render(Entity p_78088_1_, float p_78088_2_, float p_78088_3_, float p_78088_4_, float p_78088_5_,
+ float p_78088_6_, float p_78088_7_) {
+ this.setRotationAngles(p_78088_2_, p_78088_3_, p_78088_4_, p_78088_5_, p_78088_6_, p_78088_7_, p_78088_1_);
+ this.ironGolemHead.render(p_78088_7_);
+ this.ironGolemBody.render(p_78088_7_);
+ this.ironGolemLeftLeg.render(p_78088_7_);
+ this.ironGolemRightLeg.render(p_78088_7_);
+ this.ironGolemRightArm.render(p_78088_7_);
+ this.ironGolemLeftArm.render(p_78088_7_);
+ }
+
+ /**
+ * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms
+ * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how
+ * "far" arms and legs can swing at most.
+ */
+ @Override
+ public void setRotationAngles(float p_78087_1_, float p_78087_2_, float p_78087_3_, float p_78087_4_,
+ float p_78087_5_, float p_78087_6_, Entity p_78087_7_) {
+ this.ironGolemHead.rotateAngleY = p_78087_4_ / (180F / (float) Math.PI);
+ this.ironGolemHead.rotateAngleX = p_78087_5_ / (180F / (float) Math.PI);
+ this.ironGolemLeftLeg.rotateAngleX = -1.5F * this.func_78172_a(p_78087_1_, 13.0F) * p_78087_2_;
+ this.ironGolemRightLeg.rotateAngleX = 1.5F * this.func_78172_a(p_78087_1_, 13.0F) * p_78087_2_;
+ this.ironGolemLeftLeg.rotateAngleY = 0.0F;
+ this.ironGolemRightLeg.rotateAngleY = 0.0F;
+ }
+
+ /**
+ * Used for easily adding entity-dependent animations. The second and third float params here are the same second
+ * and third as in the setRotationAngles method.
+ */
+ @Override
+ public void setLivingAnimations(EntityLivingBase p_78086_1_, float p_78086_2_, float p_78086_3_, float p_78086_4_) {
+ EntityIronGolem entityirongolem = (EntityIronGolem) p_78086_1_;
+ int i = entityirongolem.getAttackTimer();
+
+ if (i > 0) {
+ this.ironGolemRightArm.rotateAngleX = -2.0F + 1.5F * this.func_78172_a(i - p_78086_4_, 10.0F);
+ this.ironGolemLeftArm.rotateAngleX = -2.0F + 1.5F * this.func_78172_a(i - p_78086_4_, 10.0F);
+ } else {
+ int j = entityirongolem.getHoldRoseTick();
+
+ if (j > 0) {
+ this.ironGolemRightArm.rotateAngleX = -0.8F + 0.025F * this.func_78172_a(j, 70.0F);
+ this.ironGolemLeftArm.rotateAngleX = 0.0F;
+ } else {
+ this.ironGolemRightArm.rotateAngleX = (-0.2F + 1.5F * this.func_78172_a(p_78086_2_, 13.0F))
+ * p_78086_3_;
+ this.ironGolemLeftArm.rotateAngleX = (-0.2F - 1.5F * this.func_78172_a(p_78086_2_, 13.0F)) * p_78086_3_;
+ }
+ }
+ }
+
+ private float func_78172_a(float p_78172_1_, float p_78172_2_) {
+ return (Math.abs(p_78172_1_ % p_78172_2_ - p_78172_2_ * 0.5F) - p_78172_2_ * 0.25F) / (p_78172_2_ * 0.25F);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/client/renderer/CustomItemBlockRenderer.java b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/CustomItemBlockRenderer.java
new file mode 100644
index 0000000000..f83844f3e3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/CustomItemBlockRenderer.java
@@ -0,0 +1,84 @@
+package gtPlusPlus.core.client.renderer;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.IItemRenderer;
+
+import org.lwjgl.opengl.GL11;
+
+/**
+ * Easy way of rendering an item which should look like a block. Borrowed.
+ *
+ * @author King Lemming
+ *
+ */
+public class CustomItemBlockRenderer implements IItemRenderer {
+
+ public static CustomItemBlockRenderer instance = new CustomItemBlockRenderer();
+
+ @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) {
+
+ double offset = -0.5;
+ if (type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON) {
+ offset = 0;
+ } else if (type == ItemRenderType.ENTITY) {
+ GL11.glScalef(0.5F, 0.5F, 0.5F);
+ }
+ renderItemAsBlock((RenderBlocks) data[0], item, offset, offset, offset);
+ }
+
+ public static void renderItemAsBlock(RenderBlocks renderer, ItemStack item, double translateX, double translateY,
+ double translateZ) {
+
+ renderTextureAsBlock(renderer, item.getIconIndex(), translateX, translateY, translateZ);
+ }
+
+ public static void renderTextureAsBlock(RenderBlocks renderer, IIcon texture, double translateX, double translateY,
+ double translateZ) {
+
+ Tessellator tessellator = Tessellator.instance;
+ Block block = Blocks.stone;
+
+ if (texture == null) {
+ return;
+ }
+ renderer.setRenderBoundsFromBlock(block);
+ GL11.glTranslated(translateX, translateY, translateZ);
+ tessellator.startDrawingQuads();
+
+ tessellator.setNormal(0.0F, -1.0F, 0.0F);
+ renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, texture);
+
+ tessellator.setNormal(0.0F, 1.0F, 0.0F);
+ renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, texture);
+
+ tessellator.setNormal(0.0F, 0.0F, -1.0F);
+ renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, texture);
+
+ tessellator.setNormal(0.0F, 0.0F, 1.0F);
+ renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, texture);
+
+ tessellator.setNormal(-1.0F, 0.0F, 0.0F);
+ renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, texture);
+
+ tessellator.setNormal(1.0F, 0.0F, 0.0F);
+ renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, texture);
+
+ tessellator.draw();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/client/renderer/CustomOreBlockRenderer.java b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/CustomOreBlockRenderer.java
new file mode 100644
index 0000000000..689f075703
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/CustomOreBlockRenderer.java
@@ -0,0 +1,2469 @@
+package gtPlusPlus.core.client.renderer;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
+import cpw.mods.fml.client.registry.RenderingRegistry;
+import gregtech.api.interfaces.ITexture;
+import gtPlusPlus.api.interfaces.ITexturedBlock;
+import gtPlusPlus.api.objects.Logger;
+
+public class CustomOreBlockRenderer implements ISimpleBlockRenderingHandler {
+
+ public static CustomOreBlockRenderer INSTANCE;
+ public final int mRenderID;
+
+ public CustomOreBlockRenderer() {
+ INSTANCE = this;
+ this.mRenderID = RenderingRegistry.getNextAvailableRenderId();
+ RenderingRegistry.registerBlockHandler(this);
+ Logger.INFO("Registered Custom Ore Block Renderer.");
+ }
+
+ public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock,
+ RenderBlocks aRenderer) {
+ Block tTileEntity = aBlock;
+ if ((tTileEntity instanceof ITexturedBlock)) {
+ return renderStandardBlock(
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ aBlock,
+ aRenderer,
+ new ITexture[][] { ((ITexturedBlock) tTileEntity).getTexture(ForgeDirection.DOWN),
+ ((ITexturedBlock) tTileEntity).getTexture(ForgeDirection.UP),
+ ((ITexturedBlock) tTileEntity).getTexture(ForgeDirection.NORTH),
+ ((ITexturedBlock) tTileEntity).getTexture(ForgeDirection.SOUTH),
+ ((ITexturedBlock) tTileEntity).getTexture(ForgeDirection.WEST),
+ ((ITexturedBlock) tTileEntity).getTexture(ForgeDirection.EAST) });
+ }
+ return false;
+ }
+
+ public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock,
+ RenderBlocks aRenderer, ITexture[][] aTextures) {
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ int l = aBlock.colorMultiplier(aWorld, aX, aY, aZ);
+ float RED = (float) (l >> 16 & 255) / 255.0F;
+ float GREEN = (float) (l >> 8 & 255) / 255.0F;
+ float BLUE = (float) (l & 255) / 255.0F;
+
+ if (Minecraft.isAmbientOcclusionEnabled() && aBlock.getLightValue() == 0) {
+ if (RenderBlocks.getInstance().partialRenderBounds) {
+ return INSTANCE.renderStandardBlockWithAmbientOcclusionPartial(
+ aWorld,
+ aRenderer,
+ aTextures,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ RED,
+ GREEN,
+ BLUE);
+ } else {
+ return INSTANCE.renderStandardBlockWithAmbientOcclusion(
+ aWorld,
+ aRenderer,
+ aTextures,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ RED,
+ GREEN,
+ BLUE);
+ }
+ } else {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[0], true);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[1], true);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[2], true);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[3], true);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[4], true);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[5], true);
+ }
+ return true;
+ }
+
+ public static void renderFaceYNeg(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ,
+ ITexture[][] aIcon) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aIcon[0], true);
+ }
+
+ public static void renderFaceYPos(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ,
+ ITexture[][] aIcon) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aIcon[1], true);
+ }
+
+ public static void renderFaceZNeg(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ,
+ ITexture[][] aIcon) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aIcon[2], true);
+ }
+
+ public static void renderFaceZPos(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ,
+ ITexture[][] aIcon) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aIcon[3], true);
+ }
+
+ public static void renderFaceXNeg(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ,
+ ITexture[][] aIcon) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aIcon[4], true);
+ }
+
+ public static void renderFaceXPos(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ,
+ ITexture[][] aIcon) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aIcon[5], true);
+ }
+
+ public static void renderNegativeYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY - 1, aZ, 0))) {
+ return;
+ }
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY - 1 : aY, aZ));
+ }
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderYNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderPositiveYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY + 1, aZ, 1))) {
+ return;
+ }
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY + 1 : aY, aZ));
+ }
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderYPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderNegativeZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ - 1, 2))) {
+ return;
+ }
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ - 1 : aZ));
+ }
+ aRenderer.flipTexture = (!aFullBlock);
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderZNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderPositiveZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ + 1, 3))) {
+ return;
+ }
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ + 1 : aZ));
+ }
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderZPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderNegativeXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX - 1, aY, aZ, 4))) {
+ return;
+ }
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX - 1 : aX, aY, aZ));
+ }
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderXNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderPositiveXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX + 1, aY, aZ, 5))) {
+ return;
+ }
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX + 1 : aX, aY, aZ));
+ }
+ aRenderer.flipTexture = (!aFullBlock);
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderXPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+ aRenderer.flipTexture = false;
+ }
+
+ @Override
+ public void renderInventoryBlock(Block aBlock, int aMeta, int aModelID, RenderBlocks aRenderer) {
+ aBlock.setBlockBoundsForItemRender();
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, -1.0F, 0.0F);
+ renderNegativeYFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ ((ITexturedBlock) aBlock).getTexture(ForgeDirection.DOWN),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 1.0F, 0.0F);
+ renderPositiveYFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ ((ITexturedBlock) aBlock).getTexture(ForgeDirection.UP),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 0.0F, -1.0F);
+ renderNegativeZFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ ((ITexturedBlock) aBlock).getTexture(ForgeDirection.NORTH),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 0.0F, 1.0F);
+ renderPositiveZFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ ((ITexturedBlock) aBlock).getTexture(ForgeDirection.SOUTH),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(-1.0F, 0.0F, 0.0F);
+ renderNegativeXFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ ((ITexturedBlock) aBlock).getTexture(ForgeDirection.WEST),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(1.0F, 0.0F, 0.0F);
+ renderPositiveXFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ ((ITexturedBlock) aBlock).getTexture(ForgeDirection.EAST),
+ true);
+ Tessellator.instance.draw();
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ }
+
+ @Override
+ public boolean renderWorldBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, int aModelID,
+ RenderBlocks aRenderer) {
+ blockAccess = aWorld;
+ return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer);
+ }
+
+ @Override
+ public boolean shouldRender3DInInventory(int aModel) {
+ return true;
+ }
+
+ @Override
+ public int getRenderId() {
+ return this.mRenderID;
+ }
+
+ public void setRenderBounds(double p_147782_1_, double p_147782_3_, double p_147782_5_, double p_147782_7_,
+ double p_147782_9_, double p_147782_11_) {
+ if (!this.lockBlockBounds) {
+ this.renderMinX = p_147782_1_;
+ this.renderMaxX = p_147782_7_;
+ this.renderMinY = p_147782_3_;
+ this.renderMaxY = p_147782_9_;
+ this.renderMinZ = p_147782_5_;
+ this.renderMaxZ = p_147782_11_;
+ this.partialRenderBounds = this.minecraftRB.gameSettings.ambientOcclusion >= 2
+ && (this.renderMinX > 0.0D || this.renderMaxX < 1.0D
+ || this.renderMinY > 0.0D
+ || this.renderMaxY < 1.0D
+ || this.renderMinZ > 0.0D
+ || this.renderMaxZ < 1.0D);
+ }
+ }
+
+ /**
+ * Like setRenderBounds, but automatically pulling the bounds from the given Block.
+ */
+ public void setRenderBoundsFromBlock(Block block) {
+ if (!this.lockBlockBounds) {
+ this.renderMinX = block.getBlockBoundsMinX();
+ this.renderMaxX = block.getBlockBoundsMaxX();
+ this.renderMinY = block.getBlockBoundsMinY();
+ this.renderMaxY = block.getBlockBoundsMaxY();
+ this.renderMinZ = block.getBlockBoundsMinZ();
+ this.renderMaxZ = block.getBlockBoundsMaxZ();
+ this.partialRenderBounds = this.minecraftRB.gameSettings.ambientOcclusion >= 2
+ && (this.renderMinX > 0.0D || this.renderMaxX < 1.0D
+ || this.renderMinY > 0.0D
+ || this.renderMaxY < 1.0D
+ || this.renderMinZ > 0.0D
+ || this.renderMaxZ < 1.0D);
+ }
+ }
+
+ /**
+ * Vanilla Variables
+ */
+
+ /** The minimum X value for rendering (default 0.0). */
+ public double renderMinX;
+ /** The maximum X value for rendering (default 1.0). */
+ public double renderMaxX;
+ /** The minimum Y value for rendering (default 0.0). */
+ public double renderMinY;
+ /** The maximum Y value for rendering (default 1.0). */
+ public double renderMaxY;
+ /** The minimum Z value for rendering (default 0.0). */
+ public double renderMinZ;
+ /** The maximum Z value for rendering (default 1.0). */
+ public double renderMaxZ;
+
+ public boolean lockBlockBounds;
+ public boolean partialRenderBounds;
+ public final Minecraft minecraftRB = RenderBlocks.getInstance().minecraftRB;
+ public int uvRotateEast;
+ public int uvRotateWest;
+ public int uvRotateSouth;
+ public int uvRotateNorth;
+ public int uvRotateTop;
+ public int uvRotateBottom;
+ /** Whether ambient occlusion is enabled or not */
+ public boolean enableAO;
+ /** Used as a scratch variable for ambient occlusion on the north/bottom/east corner. */
+ public float aoLightValueScratchXYZNNN;
+ /** Used as a scratch variable for ambient occlusion between the bottom face and the north face. */
+ public float aoLightValueScratchXYNN;
+ /** Used as a scratch variable for ambient occlusion on the north/bottom/west corner. */
+ public float aoLightValueScratchXYZNNP;
+ /** Used as a scratch variable for ambient occlusion between the bottom face and the east face. */
+ public float aoLightValueScratchYZNN;
+ /** Used as a scratch variable for ambient occlusion between the bottom face and the west face. */
+ public float aoLightValueScratchYZNP;
+ /** Used as a scratch variable for ambient occlusion on the south/bottom/east corner. */
+ public float aoLightValueScratchXYZPNN;
+ /** Used as a scratch variable for ambient occlusion between the bottom face and the south face. */
+ public float aoLightValueScratchXYPN;
+ /** Used as a scratch variable for ambient occlusion on the south/bottom/west corner. */
+ public float aoLightValueScratchXYZPNP;
+ /** Used as a scratch variable for ambient occlusion on the north/top/east corner. */
+ public float aoLightValueScratchXYZNPN;
+ /** Used as a scratch variable for ambient occlusion between the top face and the north face. */
+ public float aoLightValueScratchXYNP;
+ /** Used as a scratch variable for ambient occlusion on the north/top/west corner. */
+ public float aoLightValueScratchXYZNPP;
+ /** Used as a scratch variable for ambient occlusion between the top face and the east face. */
+ public float aoLightValueScratchYZPN;
+ /** Used as a scratch variable for ambient occlusion on the south/top/east corner. */
+ public float aoLightValueScratchXYZPPN;
+ /** Used as a scratch variable for ambient occlusion between the top face and the south face. */
+ public float aoLightValueScratchXYPP;
+ /** Used as a scratch variable for ambient occlusion between the top face and the west face. */
+ public float aoLightValueScratchYZPP;
+ /** Used as a scratch variable for ambient occlusion on the south/top/west corner. */
+ public float aoLightValueScratchXYZPPP;
+ /** Used as a scratch variable for ambient occlusion between the north face and the east face. */
+ public float aoLightValueScratchXZNN;
+ /** Used as a scratch variable for ambient occlusion between the south face and the east face. */
+ public float aoLightValueScratchXZPN;
+ /** Used as a scratch variable for ambient occlusion between the north face and the west face. */
+ public float aoLightValueScratchXZNP;
+ /** Used as a scratch variable for ambient occlusion between the south face and the west face. */
+ public float aoLightValueScratchXZPP;
+ /** Ambient occlusion brightness XYZNNN */
+ public int aoBrightnessXYZNNN;
+ /** Ambient occlusion brightness XYNN */
+ public int aoBrightnessXYNN;
+ /** Ambient occlusion brightness XYZNNP */
+ public int aoBrightnessXYZNNP;
+ /** Ambient occlusion brightness YZNN */
+ public int aoBrightnessYZNN;
+ /** Ambient occlusion brightness YZNP */
+ public int aoBrightnessYZNP;
+ /** Ambient occlusion brightness XYZPNN */
+ public int aoBrightnessXYZPNN;
+ /** Ambient occlusion brightness XYPN */
+ public int aoBrightnessXYPN;
+ /** Ambient occlusion brightness XYZPNP */
+ public int aoBrightnessXYZPNP;
+ /** Ambient occlusion brightness XYZNPN */
+ public int aoBrightnessXYZNPN;
+ /** Ambient occlusion brightness XYNP */
+ public int aoBrightnessXYNP;
+ /** Ambient occlusion brightness XYZNPP */
+ public int aoBrightnessXYZNPP;
+ /** Ambient occlusion brightness YZPN */
+ public int aoBrightnessYZPN;
+ /** Ambient occlusion brightness XYZPPN */
+ public int aoBrightnessXYZPPN;
+ /** Ambient occlusion brightness XYPP */
+ public int aoBrightnessXYPP;
+ /** Ambient occlusion brightness YZPP */
+ public int aoBrightnessYZPP;
+ /** Ambient occlusion brightness XYZPPP */
+ public int aoBrightnessXYZPPP;
+ /** Ambient occlusion brightness XZNN */
+ public int aoBrightnessXZNN;
+ /** Ambient occlusion brightness XZPN */
+ public int aoBrightnessXZPN;
+ /** Ambient occlusion brightness XZNP */
+ public int aoBrightnessXZNP;
+ /** Ambient occlusion brightness XZPP */
+ public int aoBrightnessXZPP;
+ /** Brightness top left */
+ public int brightnessTopLeft;
+ /** Brightness bottom left */
+ public int brightnessBottomLeft;
+ /** Brightness bottom right */
+ public int brightnessBottomRight;
+ /** Brightness top right */
+ public int brightnessTopRight;
+ /** Red color value for the top left corner */
+ public float colorRedTopLeft;
+ /** Red color value for the bottom left corner */
+ public float colorRedBottomLeft;
+ /** Red color value for the bottom right corner */
+ public float colorRedBottomRight;
+ /** Red color value for the top right corner */
+ public float colorRedTopRight;
+ /** Green color value for the top left corner */
+ public float colorGreenTopLeft;
+ /** Green color value for the bottom left corner */
+ public float colorGreenBottomLeft;
+ /** Green color value for the bottom right corner */
+ public float colorGreenBottomRight;
+ /** Green color value for the top right corner */
+ public float colorGreenTopRight;
+ /** Blue color value for the top left corner */
+ public float colorBlueTopLeft;
+ /** Blue color value for the bottom left corner */
+ public float colorBlueBottomLeft;
+ /** Blue color value for the bottom right corner */
+ public float colorBlueBottomRight;
+ /** Blue color value for the top right corner */
+ public float colorBlueTopRight;
+ /** If set to >=0, all block faces will be rendered using this texture index */
+ public IIcon overrideBlockTexture;
+
+ /**
+ * Clear override block texture
+ */
+ public void clearOverrideBlockTexture() {
+ this.overrideBlockTexture = null;
+ }
+
+ public boolean hasOverrideBlockTexture() {
+ return this.overrideBlockTexture != null;
+ }
+
+ public IIcon getBlockIcon(Block block, IBlockAccess access, int x, int y, int z, int side) {
+ return this.getIconSafe(block.getIcon(access, x, y, z, side));
+ }
+
+ public IIcon getBlockIconFromSideAndMetadata(Block block, int side, int meta) {
+ return this.getIconSafe(block.getIcon(side, meta));
+ }
+
+ public IIcon getBlockIconFromSide(Block block, int side) {
+ return this.getIconSafe(block.getBlockTextureFromSide(side));
+ }
+
+ public IIcon getBlockIcon(Block block) {
+ return this.getIconSafe(block.getBlockTextureFromSide(1));
+ }
+
+ public IIcon getIconSafe(IIcon iicon) {
+ if (iicon == null) {
+ iicon = ((TextureMap) Minecraft.getMinecraft()
+ .getTextureManager()
+ .getTexture(TextureMap.locationBlocksTexture)).getAtlasSprite("missingno");
+ }
+
+ return (IIcon) iicon;
+ }
+
+ IBlockAccess blockAccess = RenderBlocks.getInstance().blockAccess;
+
+ public boolean renderStandardBlockWithAmbientOcclusion(IBlockAccess aWorld, RenderBlocks aRenderer,
+ ITexture[][] aTextures, Block block, int xPos, int yPos, int zPos, float R, float G, float B) {
+ this.enableAO = true;
+ boolean flag = false;
+ float f3 = 0.0F;
+ float f4 = 0.0F;
+ float f5 = 0.0F;
+ float f6 = 0.0F;
+ boolean flag1 = true;
+ int l = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos);
+ Tessellator tessellator = Tessellator.instance;
+ tessellator.setBrightness(983055);
+
+ if (this.getBlockIcon(block)
+ .getIconName()
+ .equals("grass_top")) {
+ flag1 = false;
+ } else if (this.hasOverrideBlockTexture()) {
+ flag1 = false;
+ }
+
+ boolean flag2;
+ boolean flag3;
+ boolean flag4;
+ boolean flag5;
+ int i1;
+ float f7;
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos - 1, zPos, 0)) {
+ if (this.renderMinY <= 0.0D) {
+ --yPos;
+ }
+
+ this.aoBrightnessXYNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessYZNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessYZNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoBrightnessXYPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ this.aoLightValueScratchXYNN = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYPN = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ flag2 = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag5 && !flag3) {
+ this.aoLightValueScratchXYZNNN = this.aoLightValueScratchXYNN;
+ this.aoBrightnessXYZNNN = this.aoBrightnessXYNN;
+ } else {
+ this.aoLightValueScratchXYZNNN = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos - 1);
+ }
+
+ if (!flag4 && !flag3) {
+ this.aoLightValueScratchXYZNNP = this.aoLightValueScratchXYNN;
+ this.aoBrightnessXYZNNP = this.aoBrightnessXYNN;
+ } else {
+ this.aoLightValueScratchXYZNNP = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos + 1);
+ }
+
+ if (!flag5 && !flag2) {
+ this.aoLightValueScratchXYZPNN = this.aoLightValueScratchXYPN;
+ this.aoBrightnessXYZPNN = this.aoBrightnessXYPN;
+ } else {
+ this.aoLightValueScratchXYZPNN = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos - 1);
+ }
+
+ if (!flag4 && !flag2) {
+ this.aoLightValueScratchXYZPNP = this.aoLightValueScratchXYPN;
+ this.aoBrightnessXYZPNP = this.aoBrightnessXYPN;
+ } else {
+ this.aoLightValueScratchXYZPNP = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos + 1);
+ }
+
+ if (this.renderMinY <= 0.0D) {
+ ++yPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMinY <= 0.0D || !blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ f3 = (this.aoLightValueScratchXYZNNP + this.aoLightValueScratchXYNN + this.aoLightValueScratchYZNP + f7)
+ / 4.0F;
+ f6 = (this.aoLightValueScratchYZNP + f7 + this.aoLightValueScratchXYZPNP + this.aoLightValueScratchXYPN)
+ / 4.0F;
+ f5 = (f7 + this.aoLightValueScratchYZNN + this.aoLightValueScratchXYPN + this.aoLightValueScratchXYZPNN)
+ / 4.0F;
+ f4 = (this.aoLightValueScratchXYNN + this.aoLightValueScratchXYZNNN + f7 + this.aoLightValueScratchYZNN)
+ / 4.0F;
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNP, this.aoBrightnessXYNN, this.aoBrightnessYZNP, i1);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNP, this.aoBrightnessXYZPNP, this.aoBrightnessXYPN, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNN, this.aoBrightnessXYPN, this.aoBrightnessXYZPNN, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYNN, this.aoBrightnessXYZNNN, this.aoBrightnessYZNN, i1);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.5F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.5F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.5F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.5F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.5F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.5F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ CustomOreBlockRenderer.renderFaceYNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos + 1, zPos, 1)) {
+ if (this.renderMaxY >= 1.0D) {
+ ++yPos;
+ }
+
+ this.aoBrightnessXYNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessXYPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ this.aoBrightnessYZPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessYZPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoLightValueScratchXYNP = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYPP = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ flag2 = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag5 && !flag3) {
+ this.aoLightValueScratchXYZNPN = this.aoLightValueScratchXYNP;
+ this.aoBrightnessXYZNPN = this.aoBrightnessXYNP;
+ } else {
+ this.aoLightValueScratchXYZNPN = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos - 1);
+ }
+
+ if (!flag5 && !flag2) {
+ this.aoLightValueScratchXYZPPN = this.aoLightValueScratchXYPP;
+ this.aoBrightnessXYZPPN = this.aoBrightnessXYPP;
+ } else {
+ this.aoLightValueScratchXYZPPN = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos - 1);
+ }
+
+ if (!flag4 && !flag3) {
+ this.aoLightValueScratchXYZNPP = this.aoLightValueScratchXYNP;
+ this.aoBrightnessXYZNPP = this.aoBrightnessXYNP;
+ } else {
+ this.aoLightValueScratchXYZNPP = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos + 1);
+ }
+
+ if (!flag4 && !flag2) {
+ this.aoLightValueScratchXYZPPP = this.aoLightValueScratchXYPP;
+ this.aoBrightnessXYZPPP = this.aoBrightnessXYPP;
+ } else {
+ this.aoLightValueScratchXYZPPP = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos + 1);
+ }
+
+ if (this.renderMaxY >= 1.0D) {
+ --yPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMaxY >= 1.0D || !blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ f6 = (this.aoLightValueScratchXYZNPP + this.aoLightValueScratchXYNP + this.aoLightValueScratchYZPP + f7)
+ / 4.0F;
+ f3 = (this.aoLightValueScratchYZPP + f7 + this.aoLightValueScratchXYZPPP + this.aoLightValueScratchXYPP)
+ / 4.0F;
+ f4 = (f7 + this.aoLightValueScratchYZPN + this.aoLightValueScratchXYPP + this.aoLightValueScratchXYZPPN)
+ / 4.0F;
+ f5 = (this.aoLightValueScratchXYNP + this.aoLightValueScratchXYZNPN + f7 + this.aoLightValueScratchYZPN)
+ / 4.0F;
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNPP, this.aoBrightnessXYNP, this.aoBrightnessYZPP, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPP, this.aoBrightnessXYZPPP, this.aoBrightnessXYPP, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPN, this.aoBrightnessXYPP, this.aoBrightnessXYZPPN, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYNP, this.aoBrightnessXYZNPN, this.aoBrightnessYZPN, i1);
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B;
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ CustomOreBlockRenderer.renderFaceYPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ flag = true;
+ }
+
+ IIcon iicon;
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos, zPos - 1, 2)) {
+ if (this.renderMinZ <= 0.0D) {
+ --zPos;
+ }
+
+ this.aoLightValueScratchXZNN = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNN = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPN = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPN = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXZNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessYZNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessYZPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ this.aoBrightnessXZPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ flag2 = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag3 && !flag5) {
+ this.aoLightValueScratchXYZNNN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNNN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNNN = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos - 1, zPos);
+ }
+
+ if (!flag3 && !flag4) {
+ this.aoLightValueScratchXYZNPN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNPN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNPN = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos + 1, zPos);
+ }
+
+ if (!flag2 && !flag5) {
+ this.aoLightValueScratchXYZPNN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPNN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPNN = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos - 1, zPos);
+ }
+
+ if (!flag2 && !flag4) {
+ this.aoLightValueScratchXYZPPN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPPN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPPN = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos + 1, zPos);
+ }
+
+ if (this.renderMinZ <= 0.0D) {
+ ++zPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMinZ <= 0.0D || !blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ f3 = (this.aoLightValueScratchXZNN + this.aoLightValueScratchXYZNPN + f7 + this.aoLightValueScratchYZPN)
+ / 4.0F;
+ f4 = (f7 + this.aoLightValueScratchYZPN + this.aoLightValueScratchXZPN + this.aoLightValueScratchXYZPPN)
+ / 4.0F;
+ f5 = (this.aoLightValueScratchYZNN + f7 + this.aoLightValueScratchXYZPNN + this.aoLightValueScratchXZPN)
+ / 4.0F;
+ f6 = (this.aoLightValueScratchXYZNNN + this.aoLightValueScratchXZNN + this.aoLightValueScratchYZNN + f7)
+ / 4.0F;
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNN, this.aoBrightnessXYZNPN, this.aoBrightnessYZPN, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPN, this.aoBrightnessXZPN, this.aoBrightnessXYZPPN, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNN, this.aoBrightnessXYZPNN, this.aoBrightnessXZPN, i1);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNN, this.aoBrightnessXZNN, this.aoBrightnessYZNN, i1);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.8F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.8F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 2);
+ CustomOreBlockRenderer.renderFaceZNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceZNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos, zPos + 1, 3)) {
+ if (this.renderMaxZ >= 1.0D) {
+ ++zPos;
+ }
+
+ this.aoLightValueScratchXZNP = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPP = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNP = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPP = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXZNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessXZPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ this.aoBrightnessYZNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessYZPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ flag2 = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getCanBlockGrass();
+
+ if (!flag3 && !flag5) {
+ this.aoLightValueScratchXYZNNP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNNP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNNP = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos - 1, zPos);
+ }
+
+ if (!flag3 && !flag4) {
+ this.aoLightValueScratchXYZNPP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNPP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNPP = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos + 1, zPos);
+ }
+
+ if (!flag2 && !flag5) {
+ this.aoLightValueScratchXYZPNP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPNP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPNP = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos - 1, zPos);
+ }
+
+ if (!flag2 && !flag4) {
+ this.aoLightValueScratchXYZPPP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPPP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPPP = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos + 1, zPos);
+ }
+
+ if (this.renderMaxZ >= 1.0D) {
+ --zPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMaxZ >= 1.0D || !blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ f3 = (this.aoLightValueScratchXZNP + this.aoLightValueScratchXYZNPP + f7 + this.aoLightValueScratchYZPP)
+ / 4.0F;
+ f6 = (f7 + this.aoLightValueScratchYZPP + this.aoLightValueScratchXZPP + this.aoLightValueScratchXYZPPP)
+ / 4.0F;
+ f5 = (this.aoLightValueScratchYZNP + f7 + this.aoLightValueScratchXYZPNP + this.aoLightValueScratchXZPP)
+ / 4.0F;
+ f4 = (this.aoLightValueScratchXYZNNP + this.aoLightValueScratchXZNP + this.aoLightValueScratchYZNP + f7)
+ / 4.0F;
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNP, this.aoBrightnessXYZNPP, this.aoBrightnessYZPP, i1);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPP, this.aoBrightnessXZPP, this.aoBrightnessXYZPPP, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNP, this.aoBrightnessXYZPNP, this.aoBrightnessXZPP, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNP, this.aoBrightnessXZNP, this.aoBrightnessYZNP, i1);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.8F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.8F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 3);
+ CustomOreBlockRenderer.renderFaceZPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceZPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos - 1, yPos, zPos, 4)) {
+ if (this.renderMinX <= 0.0D) {
+ --xPos;
+ }
+
+ this.aoLightValueScratchXYNN = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZNN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZNP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYNP = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessXZNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessXZNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoBrightnessXYNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ flag2 = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+
+ if (!flag4 && !flag3) {
+ this.aoLightValueScratchXYZNNN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNNN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNNN = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos - 1);
+ }
+
+ if (!flag5 && !flag3) {
+ this.aoLightValueScratchXYZNNP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNNP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNNP = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos + 1);
+ }
+
+ if (!flag4 && !flag2) {
+ this.aoLightValueScratchXYZNPN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNPN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNPN = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos - 1);
+ }
+
+ if (!flag5 && !flag2) {
+ this.aoLightValueScratchXYZNPP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNPP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNPP = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos + 1);
+ }
+
+ if (this.renderMinX <= 0.0D) {
+ ++xPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMinX <= 0.0D || !blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ f6 = (this.aoLightValueScratchXYNN + this.aoLightValueScratchXYZNNP + f7 + this.aoLightValueScratchXZNP)
+ / 4.0F;
+ f3 = (f7 + this.aoLightValueScratchXZNP + this.aoLightValueScratchXYNP + this.aoLightValueScratchXYZNPP)
+ / 4.0F;
+ f4 = (this.aoLightValueScratchXZNN + f7 + this.aoLightValueScratchXYZNPN + this.aoLightValueScratchXYNP)
+ / 4.0F;
+ f5 = (this.aoLightValueScratchXYZNNN + this.aoLightValueScratchXYNN + this.aoLightValueScratchXZNN + f7)
+ / 4.0F;
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYNN, this.aoBrightnessXYZNNP, this.aoBrightnessXZNP, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNP, this.aoBrightnessXYNP, this.aoBrightnessXYZNPP, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNN, this.aoBrightnessXYZNPN, this.aoBrightnessXYNP, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNN, this.aoBrightnessXYNN, this.aoBrightnessXZNN, i1);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.6F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.6F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 4);
+ CustomOreBlockRenderer.renderFaceXNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceXNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos + 1, yPos, zPos, 5)) {
+ if (this.renderMaxX >= 1.0D) {
+ ++xPos;
+ }
+
+ this.aoLightValueScratchXYPN = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYPP = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessXZPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessXZPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoBrightnessXYPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ flag2 = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag3 && !flag5) {
+ this.aoLightValueScratchXYZPNN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPNN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPNN = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos - 1);
+ }
+
+ if (!flag3 && !flag4) {
+ this.aoLightValueScratchXYZPNP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPNP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPNP = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos + 1);
+ }
+
+ if (!flag2 && !flag5) {
+ this.aoLightValueScratchXYZPPN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPPN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPPN = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos - 1);
+ }
+
+ if (!flag2 && !flag4) {
+ this.aoLightValueScratchXYZPPP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPPP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPPP = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos + 1);
+ }
+
+ if (this.renderMaxX >= 1.0D) {
+ --xPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMaxX >= 1.0D || !blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ f3 = (this.aoLightValueScratchXYPN + this.aoLightValueScratchXYZPNP + f7 + this.aoLightValueScratchXZPP)
+ / 4.0F;
+ f4 = (this.aoLightValueScratchXYZPNN + this.aoLightValueScratchXYPN + this.aoLightValueScratchXZPN + f7)
+ / 4.0F;
+ f5 = (this.aoLightValueScratchXZPN + f7 + this.aoLightValueScratchXYZPPN + this.aoLightValueScratchXYPP)
+ / 4.0F;
+ f6 = (f7 + this.aoLightValueScratchXZPP + this.aoLightValueScratchXYPP + this.aoLightValueScratchXYZPPP)
+ / 4.0F;
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYPN, this.aoBrightnessXYZPNP, this.aoBrightnessXZPP, i1);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZPP, this.aoBrightnessXYPP, this.aoBrightnessXYZPPP, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZPN, this.aoBrightnessXYZPPN, this.aoBrightnessXYPP, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZPNN, this.aoBrightnessXYPN, this.aoBrightnessXZPN, i1);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.6F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.6F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 5);
+ CustomOreBlockRenderer.renderFaceXPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceXPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ this.enableAO = false;
+ return flag;
+ }
+
+ /**
+ * Renders non-full-cube block with ambient occusion. Args: block, x, y, z, red, green, blue (lighting)
+ */
+ public boolean renderStandardBlockWithAmbientOcclusionPartial(IBlockAccess aWorld, RenderBlocks aRenderer,
+ ITexture[][] aTextures, Block block, int xPos, int yPos, int zPos, float R, float G, float B) {
+ this.enableAO = true;
+ boolean flag = false;
+ float f3 = 0.0F;
+ float f4 = 0.0F;
+ float f5 = 0.0F;
+ float f6 = 0.0F;
+ boolean flag1 = true;
+ int l = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos);
+ Tessellator tessellator = Tessellator.instance;
+ tessellator.setBrightness(983055);
+
+ if (this.getBlockIcon(block)
+ .getIconName()
+ .equals("grass_top")) {
+ flag1 = false;
+ } else if (this.hasOverrideBlockTexture()) {
+ flag1 = false;
+ }
+
+ boolean flag2;
+ boolean flag3;
+ boolean flag4;
+ boolean flag5;
+ int i1;
+ float f7;
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos - 1, zPos, 0)) {
+ if (this.renderMinY <= 0.0D) {
+ --yPos;
+ }
+
+ this.aoBrightnessXYNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessYZNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessYZNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoBrightnessXYPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ this.aoLightValueScratchXYNN = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYPN = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ flag2 = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag5 && !flag3) {
+ this.aoLightValueScratchXYZNNN = this.aoLightValueScratchXYNN;
+ this.aoBrightnessXYZNNN = this.aoBrightnessXYNN;
+ } else {
+ this.aoLightValueScratchXYZNNN = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos - 1);
+ }
+
+ if (!flag4 && !flag3) {
+ this.aoLightValueScratchXYZNNP = this.aoLightValueScratchXYNN;
+ this.aoBrightnessXYZNNP = this.aoBrightnessXYNN;
+ } else {
+ this.aoLightValueScratchXYZNNP = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos + 1);
+ }
+
+ if (!flag5 && !flag2) {
+ this.aoLightValueScratchXYZPNN = this.aoLightValueScratchXYPN;
+ this.aoBrightnessXYZPNN = this.aoBrightnessXYPN;
+ } else {
+ this.aoLightValueScratchXYZPNN = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos - 1);
+ }
+
+ if (!flag4 && !flag2) {
+ this.aoLightValueScratchXYZPNP = this.aoLightValueScratchXYPN;
+ this.aoBrightnessXYZPNP = this.aoBrightnessXYPN;
+ } else {
+ this.aoLightValueScratchXYZPNP = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos + 1);
+ }
+
+ if (this.renderMinY <= 0.0D) {
+ ++yPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMinY <= 0.0D || !blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ f3 = (this.aoLightValueScratchXYZNNP + this.aoLightValueScratchXYNN + this.aoLightValueScratchYZNP + f7)
+ / 4.0F;
+ f6 = (this.aoLightValueScratchYZNP + f7 + this.aoLightValueScratchXYZPNP + this.aoLightValueScratchXYPN)
+ / 4.0F;
+ f5 = (f7 + this.aoLightValueScratchYZNN + this.aoLightValueScratchXYPN + this.aoLightValueScratchXYZPNN)
+ / 4.0F;
+ f4 = (this.aoLightValueScratchXYNN + this.aoLightValueScratchXYZNNN + f7 + this.aoLightValueScratchYZNN)
+ / 4.0F;
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNP, this.aoBrightnessXYNN, this.aoBrightnessYZNP, i1);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNP, this.aoBrightnessXYZPNP, this.aoBrightnessXYPN, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNN, this.aoBrightnessXYPN, this.aoBrightnessXYZPNN, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYNN, this.aoBrightnessXYZNNN, this.aoBrightnessYZNN, i1);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.5F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.5F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.5F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.5F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.5F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.5F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ CustomOreBlockRenderer.renderFaceYNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos + 1, zPos, 1)) {
+ if (this.renderMaxY >= 1.0D) {
+ ++yPos;
+ }
+
+ this.aoBrightnessXYNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessXYPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ this.aoBrightnessYZPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessYZPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoLightValueScratchXYNP = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYPP = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ flag2 = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag5 && !flag3) {
+ this.aoLightValueScratchXYZNPN = this.aoLightValueScratchXYNP;
+ this.aoBrightnessXYZNPN = this.aoBrightnessXYNP;
+ } else {
+ this.aoLightValueScratchXYZNPN = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos - 1);
+ }
+
+ if (!flag5 && !flag2) {
+ this.aoLightValueScratchXYZPPN = this.aoLightValueScratchXYPP;
+ this.aoBrightnessXYZPPN = this.aoBrightnessXYPP;
+ } else {
+ this.aoLightValueScratchXYZPPN = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos - 1);
+ }
+
+ if (!flag4 && !flag3) {
+ this.aoLightValueScratchXYZNPP = this.aoLightValueScratchXYNP;
+ this.aoBrightnessXYZNPP = this.aoBrightnessXYNP;
+ } else {
+ this.aoLightValueScratchXYZNPP = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos + 1);
+ }
+
+ if (!flag4 && !flag2) {
+ this.aoLightValueScratchXYZPPP = this.aoLightValueScratchXYPP;
+ this.aoBrightnessXYZPPP = this.aoBrightnessXYPP;
+ } else {
+ this.aoLightValueScratchXYZPPP = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos + 1);
+ }
+
+ if (this.renderMaxY >= 1.0D) {
+ --yPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMaxY >= 1.0D || !blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ f6 = (this.aoLightValueScratchXYZNPP + this.aoLightValueScratchXYNP + this.aoLightValueScratchYZPP + f7)
+ / 4.0F;
+ f3 = (this.aoLightValueScratchYZPP + f7 + this.aoLightValueScratchXYZPPP + this.aoLightValueScratchXYPP)
+ / 4.0F;
+ f4 = (f7 + this.aoLightValueScratchYZPN + this.aoLightValueScratchXYPP + this.aoLightValueScratchXYZPPN)
+ / 4.0F;
+ f5 = (this.aoLightValueScratchXYNP + this.aoLightValueScratchXYZNPN + f7 + this.aoLightValueScratchYZPN)
+ / 4.0F;
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNPP, this.aoBrightnessXYNP, this.aoBrightnessYZPP, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPP, this.aoBrightnessXYZPPP, this.aoBrightnessXYPP, i1);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPN, this.aoBrightnessXYPP, this.aoBrightnessXYZPPN, i1);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYNP, this.aoBrightnessXYZNPN, this.aoBrightnessYZPN, i1);
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B;
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ CustomOreBlockRenderer.renderFaceYPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ flag = true;
+ }
+
+ float f8;
+ float f9;
+ float f10;
+ float f11;
+ int j1;
+ int k1;
+ int l1;
+ int i2;
+ IIcon iicon;
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos, zPos - 1, 2)) {
+ if (this.renderMinZ <= 0.0D) {
+ --zPos;
+ }
+
+ this.aoLightValueScratchXZNN = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNN = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPN = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPN = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXZNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessYZNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessYZPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ this.aoBrightnessXZPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ flag2 = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag3 && !flag5) {
+ this.aoLightValueScratchXYZNNN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNNN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNNN = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos - 1, zPos);
+ }
+
+ if (!flag3 && !flag4) {
+ this.aoLightValueScratchXYZNPN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNPN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNPN = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPN = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos + 1, zPos);
+ }
+
+ if (!flag2 && !flag5) {
+ this.aoLightValueScratchXYZPNN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPNN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPNN = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos - 1, zPos);
+ }
+
+ if (!flag2 && !flag4) {
+ this.aoLightValueScratchXYZPPN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPPN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPPN = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPN = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos + 1, zPos);
+ }
+
+ if (this.renderMinZ <= 0.0D) {
+ ++zPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMinZ <= 0.0D || !blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ f8 = (this.aoLightValueScratchXZNN + this.aoLightValueScratchXYZNPN + f7 + this.aoLightValueScratchYZPN)
+ / 4.0F;
+ f9 = (f7 + this.aoLightValueScratchYZPN + this.aoLightValueScratchXZPN + this.aoLightValueScratchXYZPPN)
+ / 4.0F;
+ f10 = (this.aoLightValueScratchYZNN + f7 + this.aoLightValueScratchXYZPNN + this.aoLightValueScratchXZPN)
+ / 4.0F;
+ f11 = (this.aoLightValueScratchXYZNNN + this.aoLightValueScratchXZNN + this.aoLightValueScratchYZNN + f7)
+ / 4.0F;
+ f3 = (float) ((double) f8 * this.renderMaxY * (1.0D - this.renderMinX)
+ + (double) f9 * this.renderMaxY * this.renderMinX
+ + (double) f10 * (1.0D - this.renderMaxY) * this.renderMinX
+ + (double) f11 * (1.0D - this.renderMaxY) * (1.0D - this.renderMinX));
+ f4 = (float) ((double) f8 * this.renderMaxY * (1.0D - this.renderMaxX)
+ + (double) f9 * this.renderMaxY * this.renderMaxX
+ + (double) f10 * (1.0D - this.renderMaxY) * this.renderMaxX
+ + (double) f11 * (1.0D - this.renderMaxY) * (1.0D - this.renderMaxX));
+ f5 = (float) ((double) f8 * this.renderMinY * (1.0D - this.renderMaxX)
+ + (double) f9 * this.renderMinY * this.renderMaxX
+ + (double) f10 * (1.0D - this.renderMinY) * this.renderMaxX
+ + (double) f11 * (1.0D - this.renderMinY) * (1.0D - this.renderMaxX));
+ f6 = (float) ((double) f8 * this.renderMinY * (1.0D - this.renderMinX)
+ + (double) f9 * this.renderMinY * this.renderMinX
+ + (double) f10 * (1.0D - this.renderMinY) * this.renderMinX
+ + (double) f11 * (1.0D - this.renderMinY) * (1.0D - this.renderMinX));
+ j1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNN, this.aoBrightnessXYZNPN, this.aoBrightnessYZPN, i1);
+ k1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPN, this.aoBrightnessXZPN, this.aoBrightnessXYZPPN, i1);
+ l1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNN, this.aoBrightnessXYZPNN, this.aoBrightnessXZPN, i1);
+ i2 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNN, this.aoBrightnessXZNN, this.aoBrightnessYZNN, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ k1,
+ l1,
+ i2,
+ this.renderMaxY * (1.0D - this.renderMinX),
+ this.renderMaxY * this.renderMinX,
+ (1.0D - this.renderMaxY) * this.renderMinX,
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMinX));
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ k1,
+ l1,
+ i2,
+ this.renderMaxY * (1.0D - this.renderMaxX),
+ this.renderMaxY * this.renderMaxX,
+ (1.0D - this.renderMaxY) * this.renderMaxX,
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMaxX));
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ k1,
+ l1,
+ i2,
+ this.renderMinY * (1.0D - this.renderMaxX),
+ this.renderMinY * this.renderMaxX,
+ (1.0D - this.renderMinY) * this.renderMaxX,
+ (1.0D - this.renderMinY) * (1.0D - this.renderMaxX));
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ k1,
+ l1,
+ i2,
+ this.renderMinY * (1.0D - this.renderMinX),
+ this.renderMinY * this.renderMinX,
+ (1.0D - this.renderMinY) * this.renderMinX,
+ (1.0D - this.renderMinY) * (1.0D - this.renderMinX));
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.8F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.8F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 2);
+ CustomOreBlockRenderer.renderFaceZNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceZNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos, yPos, zPos + 1, 3)) {
+ if (this.renderMaxZ >= 1.0D) {
+ ++zPos;
+ }
+
+ this.aoLightValueScratchXZNP = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPP = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZNP = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchYZPP = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXZNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ this.aoBrightnessXZPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ this.aoBrightnessYZNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessYZPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ flag2 = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getCanBlockGrass();
+
+ if (!flag3 && !flag5) {
+ this.aoLightValueScratchXYZNNP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNNP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNNP = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos - 1, zPos);
+ }
+
+ if (!flag3 && !flag4) {
+ this.aoLightValueScratchXYZNPP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNPP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNPP = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPP = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos + 1, zPos);
+ }
+
+ if (!flag2 && !flag5) {
+ this.aoLightValueScratchXYZPNP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPNP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPNP = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos - 1, zPos);
+ }
+
+ if (!flag2 && !flag4) {
+ this.aoLightValueScratchXYZPPP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPPP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPPP = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPP = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos + 1, zPos);
+ }
+
+ if (this.renderMaxZ >= 1.0D) {
+ --zPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMaxZ >= 1.0D || !blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ }
+
+ f7 = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ f8 = (this.aoLightValueScratchXZNP + this.aoLightValueScratchXYZNPP + f7 + this.aoLightValueScratchYZPP)
+ / 4.0F;
+ f9 = (f7 + this.aoLightValueScratchYZPP + this.aoLightValueScratchXZPP + this.aoLightValueScratchXYZPPP)
+ / 4.0F;
+ f10 = (this.aoLightValueScratchYZNP + f7 + this.aoLightValueScratchXYZPNP + this.aoLightValueScratchXZPP)
+ / 4.0F;
+ f11 = (this.aoLightValueScratchXYZNNP + this.aoLightValueScratchXZNP + this.aoLightValueScratchYZNP + f7)
+ / 4.0F;
+ f3 = (float) ((double) f8 * this.renderMaxY * (1.0D - this.renderMinX)
+ + (double) f9 * this.renderMaxY * this.renderMinX
+ + (double) f10 * (1.0D - this.renderMaxY) * this.renderMinX
+ + (double) f11 * (1.0D - this.renderMaxY) * (1.0D - this.renderMinX));
+ f4 = (float) ((double) f8 * this.renderMinY * (1.0D - this.renderMinX)
+ + (double) f9 * this.renderMinY * this.renderMinX
+ + (double) f10 * (1.0D - this.renderMinY) * this.renderMinX
+ + (double) f11 * (1.0D - this.renderMinY) * (1.0D - this.renderMinX));
+ f5 = (float) ((double) f8 * this.renderMinY * (1.0D - this.renderMaxX)
+ + (double) f9 * this.renderMinY * this.renderMaxX
+ + (double) f10 * (1.0D - this.renderMinY) * this.renderMaxX
+ + (double) f11 * (1.0D - this.renderMinY) * (1.0D - this.renderMaxX));
+ f6 = (float) ((double) f8 * this.renderMaxY * (1.0D - this.renderMaxX)
+ + (double) f9 * this.renderMaxY * this.renderMaxX
+ + (double) f10 * (1.0D - this.renderMaxY) * this.renderMaxX
+ + (double) f11 * (1.0D - this.renderMaxY) * (1.0D - this.renderMaxX));
+ j1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNP, this.aoBrightnessXYZNPP, this.aoBrightnessYZPP, i1);
+ k1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZPP, this.aoBrightnessXZPP, this.aoBrightnessXYZPPP, i1);
+ l1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessYZNP, this.aoBrightnessXYZPNP, this.aoBrightnessXZPP, i1);
+ i2 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNP, this.aoBrightnessXZNP, this.aoBrightnessYZNP, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ this.renderMaxY * (1.0D - this.renderMinX),
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMinX),
+ (1.0D - this.renderMaxY) * this.renderMinX,
+ this.renderMaxY * this.renderMinX);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ this.renderMinY * (1.0D - this.renderMinX),
+ (1.0D - this.renderMinY) * (1.0D - this.renderMinX),
+ (1.0D - this.renderMinY) * this.renderMinX,
+ this.renderMinY * this.renderMinX);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ this.renderMinY * (1.0D - this.renderMaxX),
+ (1.0D - this.renderMinY) * (1.0D - this.renderMaxX),
+ (1.0D - this.renderMinY) * this.renderMaxX,
+ this.renderMinY * this.renderMaxX);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ this.renderMaxY * (1.0D - this.renderMaxX),
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMaxX),
+ (1.0D - this.renderMaxY) * this.renderMaxX,
+ this.renderMaxY * this.renderMaxX);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.8F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.8F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.8F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.8F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 3);
+ CustomOreBlockRenderer.renderFaceZPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceZPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos - 1, yPos, zPos, 4)) {
+ if (this.renderMinX <= 0.0D) {
+ --xPos;
+ }
+
+ this.aoLightValueScratchXYNN = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZNN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZNP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYNP = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessXZNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessXZNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoBrightnessXYNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ flag2 = blockAccess.getBlock(xPos - 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos - 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos - 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos - 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+
+ if (!flag4 && !flag3) {
+ this.aoLightValueScratchXYZNNN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNNN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNNN = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos - 1);
+ }
+
+ if (!flag5 && !flag3) {
+ this.aoLightValueScratchXYZNNP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNNP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNNP = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos + 1);
+ }
+
+ if (!flag4 && !flag2) {
+ this.aoLightValueScratchXYZNPN = this.aoLightValueScratchXZNN;
+ this.aoBrightnessXYZNPN = this.aoBrightnessXZNN;
+ } else {
+ this.aoLightValueScratchXYZNPN = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos - 1);
+ }
+
+ if (!flag5 && !flag2) {
+ this.aoLightValueScratchXYZNPP = this.aoLightValueScratchXZNP;
+ this.aoBrightnessXYZNPP = this.aoBrightnessXZNP;
+ } else {
+ this.aoLightValueScratchXYZNPP = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZNPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos + 1);
+ }
+
+ if (this.renderMinX <= 0.0D) {
+ ++xPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMinX <= 0.0D || !blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos - 1, yPos, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos - 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ f8 = (this.aoLightValueScratchXYNN + this.aoLightValueScratchXYZNNP + f7 + this.aoLightValueScratchXZNP)
+ / 4.0F;
+ f9 = (f7 + this.aoLightValueScratchXZNP + this.aoLightValueScratchXYNP + this.aoLightValueScratchXYZNPP)
+ / 4.0F;
+ f10 = (this.aoLightValueScratchXZNN + f7 + this.aoLightValueScratchXYZNPN + this.aoLightValueScratchXYNP)
+ / 4.0F;
+ f11 = (this.aoLightValueScratchXYZNNN + this.aoLightValueScratchXYNN + this.aoLightValueScratchXZNN + f7)
+ / 4.0F;
+ f3 = (float) ((double) f9 * this.renderMaxY * this.renderMaxZ
+ + (double) f10 * this.renderMaxY * (1.0D - this.renderMaxZ)
+ + (double) f11 * (1.0D - this.renderMaxY) * (1.0D - this.renderMaxZ)
+ + (double) f8 * (1.0D - this.renderMaxY) * this.renderMaxZ);
+ f4 = (float) ((double) f9 * this.renderMaxY * this.renderMinZ
+ + (double) f10 * this.renderMaxY * (1.0D - this.renderMinZ)
+ + (double) f11 * (1.0D - this.renderMaxY) * (1.0D - this.renderMinZ)
+ + (double) f8 * (1.0D - this.renderMaxY) * this.renderMinZ);
+ f5 = (float) ((double) f9 * this.renderMinY * this.renderMinZ
+ + (double) f10 * this.renderMinY * (1.0D - this.renderMinZ)
+ + (double) f11 * (1.0D - this.renderMinY) * (1.0D - this.renderMinZ)
+ + (double) f8 * (1.0D - this.renderMinY) * this.renderMinZ);
+ f6 = (float) ((double) f9 * this.renderMinY * this.renderMaxZ
+ + (double) f10 * this.renderMinY * (1.0D - this.renderMaxZ)
+ + (double) f11 * (1.0D - this.renderMinY) * (1.0D - this.renderMaxZ)
+ + (double) f8 * (1.0D - this.renderMinY) * this.renderMaxZ);
+ j1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYNN, this.aoBrightnessXYZNNP, this.aoBrightnessXZNP, i1);
+ k1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNP, this.aoBrightnessXYNP, this.aoBrightnessXYZNPP, i1);
+ l1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZNN, this.aoBrightnessXYZNPN, this.aoBrightnessXYNP, i1);
+ i2 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZNNN, this.aoBrightnessXYNN, this.aoBrightnessXZNN, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ k1,
+ l1,
+ i2,
+ j1,
+ this.renderMaxY * this.renderMaxZ,
+ this.renderMaxY * (1.0D - this.renderMaxZ),
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMaxZ),
+ (1.0D - this.renderMaxY) * this.renderMaxZ);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ k1,
+ l1,
+ i2,
+ j1,
+ this.renderMaxY * this.renderMinZ,
+ this.renderMaxY * (1.0D - this.renderMinZ),
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMinZ),
+ (1.0D - this.renderMaxY) * this.renderMinZ);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ k1,
+ l1,
+ i2,
+ j1,
+ this.renderMinY * this.renderMinZ,
+ this.renderMinY * (1.0D - this.renderMinZ),
+ (1.0D - this.renderMinY) * (1.0D - this.renderMinZ),
+ (1.0D - this.renderMinY) * this.renderMinZ);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ k1,
+ l1,
+ i2,
+ j1,
+ this.renderMinY * this.renderMaxZ,
+ this.renderMinY * (1.0D - this.renderMaxZ),
+ (1.0D - this.renderMinY) * (1.0D - this.renderMaxZ),
+ (1.0D - this.renderMinY) * this.renderMaxZ);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.6F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.6F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 4);
+ CustomOreBlockRenderer.renderFaceXNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceXNeg(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ if (RenderBlocks.getInstance().renderAllFaces
+ || block.shouldSideBeRendered(blockAccess, xPos + 1, yPos, zPos, 5)) {
+ if (this.renderMaxX >= 1.0D) {
+ ++xPos;
+ }
+
+ this.aoLightValueScratchXYPN = blockAccess.getBlock(xPos, yPos - 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPN = blockAccess.getBlock(xPos, yPos, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXZPP = blockAccess.getBlock(xPos, yPos, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoLightValueScratchXYPP = blockAccess.getBlock(xPos, yPos + 1, zPos)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos);
+ this.aoBrightnessXZPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos - 1);
+ this.aoBrightnessXZPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos, zPos + 1);
+ this.aoBrightnessXYPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos);
+ flag2 = blockAccess.getBlock(xPos + 1, yPos + 1, zPos)
+ .getCanBlockGrass();
+ flag3 = blockAccess.getBlock(xPos + 1, yPos - 1, zPos)
+ .getCanBlockGrass();
+ flag4 = blockAccess.getBlock(xPos + 1, yPos, zPos + 1)
+ .getCanBlockGrass();
+ flag5 = blockAccess.getBlock(xPos + 1, yPos, zPos - 1)
+ .getCanBlockGrass();
+
+ if (!flag3 && !flag5) {
+ this.aoLightValueScratchXYZPNN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPNN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPNN = blockAccess.getBlock(xPos, yPos - 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos - 1);
+ }
+
+ if (!flag3 && !flag4) {
+ this.aoLightValueScratchXYZPNP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPNP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPNP = blockAccess.getBlock(xPos, yPos - 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPNP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos - 1, zPos + 1);
+ }
+
+ if (!flag2 && !flag5) {
+ this.aoLightValueScratchXYZPPN = this.aoLightValueScratchXZPN;
+ this.aoBrightnessXYZPPN = this.aoBrightnessXZPN;
+ } else {
+ this.aoLightValueScratchXYZPPN = blockAccess.getBlock(xPos, yPos + 1, zPos - 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPN = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos - 1);
+ }
+
+ if (!flag2 && !flag4) {
+ this.aoLightValueScratchXYZPPP = this.aoLightValueScratchXZPP;
+ this.aoBrightnessXYZPPP = this.aoBrightnessXZPP;
+ } else {
+ this.aoLightValueScratchXYZPPP = blockAccess.getBlock(xPos, yPos + 1, zPos + 1)
+ .getAmbientOcclusionLightValue();
+ this.aoBrightnessXYZPPP = block.getMixedBrightnessForBlock(blockAccess, xPos, yPos + 1, zPos + 1);
+ }
+
+ if (this.renderMaxX >= 1.0D) {
+ --xPos;
+ }
+
+ i1 = l;
+
+ if (this.renderMaxX >= 1.0D || !blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .isOpaqueCube()) {
+ i1 = block.getMixedBrightnessForBlock(blockAccess, xPos + 1, yPos, zPos);
+ }
+
+ f7 = blockAccess.getBlock(xPos + 1, yPos, zPos)
+ .getAmbientOcclusionLightValue();
+ f8 = (this.aoLightValueScratchXYPN + this.aoLightValueScratchXYZPNP + f7 + this.aoLightValueScratchXZPP)
+ / 4.0F;
+ f9 = (this.aoLightValueScratchXYZPNN + this.aoLightValueScratchXYPN + this.aoLightValueScratchXZPN + f7)
+ / 4.0F;
+ f10 = (this.aoLightValueScratchXZPN + f7 + this.aoLightValueScratchXYZPPN + this.aoLightValueScratchXYPP)
+ / 4.0F;
+ f11 = (f7 + this.aoLightValueScratchXZPP + this.aoLightValueScratchXYPP + this.aoLightValueScratchXYZPPP)
+ / 4.0F;
+ f3 = (float) ((double) f8 * (1.0D - this.renderMinY) * this.renderMaxZ
+ + (double) f9 * (1.0D - this.renderMinY) * (1.0D - this.renderMaxZ)
+ + (double) f10 * this.renderMinY * (1.0D - this.renderMaxZ)
+ + (double) f11 * this.renderMinY * this.renderMaxZ);
+ f4 = (float) ((double) f8 * (1.0D - this.renderMinY) * this.renderMinZ
+ + (double) f9 * (1.0D - this.renderMinY) * (1.0D - this.renderMinZ)
+ + (double) f10 * this.renderMinY * (1.0D - this.renderMinZ)
+ + (double) f11 * this.renderMinY * this.renderMinZ);
+ f5 = (float) ((double) f8 * (1.0D - this.renderMaxY) * this.renderMinZ
+ + (double) f9 * (1.0D - this.renderMaxY) * (1.0D - this.renderMinZ)
+ + (double) f10 * this.renderMaxY * (1.0D - this.renderMinZ)
+ + (double) f11 * this.renderMaxY * this.renderMinZ);
+ f6 = (float) ((double) f8 * (1.0D - this.renderMaxY) * this.renderMaxZ
+ + (double) f9 * (1.0D - this.renderMaxY) * (1.0D - this.renderMaxZ)
+ + (double) f10 * this.renderMaxY * (1.0D - this.renderMaxZ)
+ + (double) f11 * this.renderMaxY * this.renderMaxZ);
+ j1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYPN, this.aoBrightnessXYZPNP, this.aoBrightnessXZPP, i1);
+ k1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZPP, this.aoBrightnessXYPP, this.aoBrightnessXYZPPP, i1);
+ l1 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXZPN, this.aoBrightnessXYZPPN, this.aoBrightnessXYPP, i1);
+ i2 = RenderBlocks.getInstance()
+ .getAoBrightness(this.aoBrightnessXYZPNN, this.aoBrightnessXYPN, this.aoBrightnessXZPN, i1);
+ this.brightnessTopLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ (1.0D - this.renderMinY) * this.renderMaxZ,
+ (1.0D - this.renderMinY) * (1.0D - this.renderMaxZ),
+ this.renderMinY * (1.0D - this.renderMaxZ),
+ this.renderMinY * this.renderMaxZ);
+ this.brightnessBottomLeft = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ (1.0D - this.renderMinY) * this.renderMinZ,
+ (1.0D - this.renderMinY) * (1.0D - this.renderMinZ),
+ this.renderMinY * (1.0D - this.renderMinZ),
+ this.renderMinY * this.renderMinZ);
+ this.brightnessBottomRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ (1.0D - this.renderMaxY) * this.renderMinZ,
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMinZ),
+ this.renderMaxY * (1.0D - this.renderMinZ),
+ this.renderMaxY * this.renderMinZ);
+ this.brightnessTopRight = RenderBlocks.getInstance()
+ .mixAoBrightness(
+ j1,
+ i2,
+ l1,
+ k1,
+ (1.0D - this.renderMaxY) * this.renderMaxZ,
+ (1.0D - this.renderMaxY) * (1.0D - this.renderMaxZ),
+ this.renderMaxY * (1.0D - this.renderMaxZ),
+ this.renderMaxY * this.renderMaxZ);
+
+ if (flag1) {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = R
+ * 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = G
+ * 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = B
+ * 0.6F;
+ } else {
+ this.colorRedTopLeft = this.colorRedBottomLeft = this.colorRedBottomRight = this.colorRedTopRight = 0.6F;
+ this.colorGreenTopLeft = this.colorGreenBottomLeft = this.colorGreenBottomRight = this.colorGreenTopRight = 0.6F;
+ this.colorBlueTopLeft = this.colorBlueBottomLeft = this.colorBlueBottomRight = this.colorBlueTopRight = 0.6F;
+ }
+
+ this.colorRedTopLeft *= f3;
+ this.colorGreenTopLeft *= f3;
+ this.colorBlueTopLeft *= f3;
+ this.colorRedBottomLeft *= f4;
+ this.colorGreenBottomLeft *= f4;
+ this.colorBlueBottomLeft *= f4;
+ this.colorRedBottomRight *= f5;
+ this.colorGreenBottomRight *= f5;
+ this.colorBlueBottomRight *= f5;
+ this.colorRedTopRight *= f6;
+ this.colorGreenTopRight *= f6;
+ this.colorBlueTopRight *= f6;
+ iicon = this.getBlockIcon(block, blockAccess, xPos, yPos, zPos, 5);
+ CustomOreBlockRenderer.renderFaceXPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+
+ RenderBlocks.getInstance();
+ if (RenderBlocks.fancyGrass && iicon.getIconName()
+ .equals("grass_side") && !this.hasOverrideBlockTexture()) {
+ this.colorRedTopLeft *= R;
+ this.colorRedBottomLeft *= R;
+ this.colorRedBottomRight *= R;
+ this.colorRedTopRight *= R;
+ this.colorGreenTopLeft *= G;
+ this.colorGreenBottomLeft *= G;
+ this.colorGreenBottomRight *= G;
+ this.colorGreenTopRight *= G;
+ this.colorBlueTopLeft *= B;
+ this.colorBlueBottomLeft *= B;
+ this.colorBlueBottomRight *= B;
+ this.colorBlueTopRight *= B;
+ CustomOreBlockRenderer.renderFaceXPos(aWorld, aRenderer, block, xPos, yPos, zPos, aTextures);
+ }
+
+ flag = true;
+ }
+
+ this.enableAO = false;
+ return flag;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderDecayChest.java b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderDecayChest.java
new file mode 100644
index 0000000000..c691bac144
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderDecayChest.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.core.client.renderer;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import cpw.mods.fml.client.registry.RenderingRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.client.model.ModelDecayChest;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+
+@SideOnly(Side.CLIENT)
+public class RenderDecayChest extends TileEntitySpecialRenderer {
+
+ private static final ResourceLocation mChestTexture = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/blocks/TileEntities/DecayablesChest_full.png");
+ private ModelDecayChest mChestModel = new ModelDecayChest();
+
+ public static RenderDecayChest INSTANCE;
+ public final int mRenderID;
+
+ public RenderDecayChest() {
+ INSTANCE = this;
+ this.mRenderID = RenderingRegistry.getNextAvailableRenderId();
+ Logger.INFO("Registered Lead Lined Chest Renderer.");
+ }
+
+ public void renderTileEntityAt(TileEntityDecayablesChest p_147500_1_, double p_147500_2_, double p_147500_4_,
+ double p_147500_6_, float p_147500_8_) {
+
+ int i = 0;
+
+ if (true) {
+ this.bindTexture(mChestTexture);
+ GL11.glPushMatrix();
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glTranslatef((float) p_147500_2_, (float) p_147500_4_ + 1.0F, (float) p_147500_6_ + 1.0F);
+ GL11.glScalef(1.0F, -1.0F, -1.0F);
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ short short1 = 0;
+
+ if (i == 2) {
+ short1 = 180;
+ }
+
+ if (i == 3) {
+ short1 = 0;
+ }
+
+ if (i == 4) {
+ short1 = 90;
+ }
+
+ if (i == 5) {
+ short1 = -90;
+ }
+
+ GL11.glRotatef((float) short1, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ float f1 = p_147500_1_.prevLidAngle + (p_147500_1_.lidAngle - p_147500_1_.prevLidAngle) * p_147500_8_;
+
+ f1 = 1.0F - f1;
+ f1 = 1.0F - f1 * f1 * f1;
+ mChestModel.chestLid.rotateAngleX = -(f1 * CORE.PI / 2.0F);
+ mChestModel.renderAll();
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ GL11.glPopMatrix();
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ }
+ }
+
+ @Override
+ public void renderTileEntityAt(TileEntity p_147500_1_, double p_147500_2_, double p_147500_4_, double p_147500_6_,
+ float p_147500_8_) {
+ this.renderTileEntityAt(
+ (TileEntityDecayablesChest) p_147500_1_,
+ p_147500_2_,
+ p_147500_4_,
+ p_147500_6_,
+ p_147500_8_);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderMiningExplosivesPrimed.java b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderMiningExplosivesPrimed.java
new file mode 100644
index 0000000000..259352367d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderMiningExplosivesPrimed.java
@@ -0,0 +1,111 @@
+package gtPlusPlus.core.client.renderer;
+
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.entity.RenderTNTPrimed;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.entity.Entity;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.entity.EntityPrimedMiningExplosive;
+
+@SideOnly(Side.CLIENT)
+public class RenderMiningExplosivesPrimed extends RenderTNTPrimed {
+
+ private final RenderBlocks blockRenderer = new RenderBlocks();
+
+ public RenderMiningExplosivesPrimed() {
+ this.shadowSize = 0.5F;
+ Logger.WARNING("Rendering Mining Explosion. 1");
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ public void doRender(final EntityPrimedMiningExplosive entity, final double p_76986_2_, final double p_76986_4_,
+ final double p_76986_6_, final float p_76986_8_, final float p_76986_9_) {
+ Logger.WARNING("Rendering Mining Explosion. 2");
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float) p_76986_2_, (float) p_76986_4_, (float) p_76986_6_);
+ float f2;
+
+ if (((entity.fuse - p_76986_9_) + 1.0F) < 10.0F) {
+ f2 = 1.0F - (((entity.fuse - p_76986_9_) + 1.0F) / 10.0F);
+
+ if (f2 < 0.0F) {
+ f2 = 0.0F;
+ }
+
+ if (f2 > 1.0F) {
+ f2 = 1.0F;
+ }
+
+ f2 *= f2;
+ f2 *= f2;
+ final float f3 = 1.0F + (f2 * 0.3F);
+ GL11.glScalef(f3, f3, f3);
+ }
+
+ f2 = (1.0F - (((entity.fuse - p_76986_9_) + 1.0F) / 100.0F)) * 0.8F;
+ this.bindEntityTexture(entity);
+ this.blockRenderer.renderBlockAsItem(ModBlocks.blockMiningExplosive, 0, entity.getBrightness(p_76986_9_));
+
+ if (((entity.fuse / 5) % 2) == 0) {
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_DST_ALPHA);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, f2);
+ this.blockRenderer.renderBlockAsItem(ModBlocks.blockMiningExplosive, 0, 1.0F);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ }
+
+ GL11.glPopMatrix();
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ protected ResourceLocation getEntityTexture(final EntityPrimedMiningExplosive p_110775_1_) {
+ return TextureMap.locationBlocksTexture;
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ @Override
+ protected ResourceLocation getEntityTexture(final Entity p_110775_1_) {
+ Logger.WARNING("Rendering Mining Explosion. 4");
+ return this.getEntityTexture((EntityPrimedMiningExplosive) p_110775_1_);
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(final Entity p_76986_1_, final double p_76986_2_, final double p_76986_4_,
+ final double p_76986_6_, final float p_76986_8_, final float p_76986_9_) {
+ Logger.WARNING("Rendering Mining Explosion. 3");
+ this.doRender(
+ (EntityPrimedMiningExplosive) p_76986_1_,
+ p_76986_2_,
+ p_76986_4_,
+ p_76986_6_,
+ p_76986_8_,
+ p_76986_9_);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderSickBlaze.java b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderSickBlaze.java
new file mode 100644
index 0000000000..c1d3927416
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderSickBlaze.java
@@ -0,0 +1,96 @@
+package gtPlusPlus.core.client.renderer;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.entity.RenderLiving;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.util.ResourceLocation;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.client.model.ModelSickBlaze;
+import gtPlusPlus.core.entity.monster.EntitySickBlaze;
+
+@SideOnly(Side.CLIENT)
+public class RenderSickBlaze extends RenderLiving {
+
+ private static final ResourceLocation blazeTextures = new ResourceLocation(
+ GTPlusPlus.ID + ":" + "textures/entity/sickBlaze.png");
+ private int field_77068_a;
+
+ public RenderSickBlaze() {
+ super(new ModelSickBlaze(), 0.5F);
+ this.field_77068_a = ((ModelSickBlaze) this.mainModel).func_78104_a();
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ public void doRender(EntitySickBlaze p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ int i = ((ModelSickBlaze) this.mainModel).func_78104_a();
+
+ if (i != this.field_77068_a) {
+ this.field_77068_a = i;
+ this.mainModel = new ModelSickBlaze();
+ }
+
+ super.doRender(p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_);
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ protected ResourceLocation getEntityTexture(EntitySickBlaze p_110775_1_) {
+ return blazeTextures;
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(EntityLiving p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ this.doRender((EntitySickBlaze) p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_);
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(EntityLivingBase p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ this.doRender((EntitySickBlaze) p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_);
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ @Override
+ protected ResourceLocation getEntityTexture(Entity p_110775_1_) {
+ return this.getEntityTexture((EntitySickBlaze) p_110775_1_);
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_,
+ float p_76986_9_) {
+ this.doRender((EntitySickBlaze) p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderStaballoyConstruct.java b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderStaballoyConstruct.java
new file mode 100644
index 0000000000..f2ebe84d4d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderStaballoyConstruct.java
@@ -0,0 +1,163 @@
+package gtPlusPlus.core.client.renderer;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.OpenGlHelper;
+import net.minecraft.client.renderer.entity.RenderLiving;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.client.model.ModelStaballoyConstruct;
+import gtPlusPlus.core.entity.monster.EntityStaballoyConstruct;
+
+@SideOnly(Side.CLIENT)
+public class RenderStaballoyConstruct extends RenderLiving {
+
+ private static final ResourceLocation staballoyGolemTextures = new ResourceLocation(
+ GTPlusPlus.ID + ":" + "textures/entity/golemStaballoy.png");
+ /** Staballoy Golem's Model. */
+ private final ModelStaballoyConstruct staballoyGolemModel;
+
+ public RenderStaballoyConstruct() {
+ super(new ModelStaballoyConstruct(), 0.8F);
+ this.staballoyGolemModel = (ModelStaballoyConstruct) this.mainModel;
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ public void doRender(EntityStaballoyConstruct p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ super.doRender(p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_);
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ protected ResourceLocation getEntityTexture(EntityStaballoyConstruct p_110775_1_) {
+ return staballoyGolemTextures;
+ }
+
+ protected void rotateCorpse(EntityStaballoyConstruct p_77043_1_, float p_77043_2_, float p_77043_3_,
+ float p_77043_4_) {
+ super.rotateCorpse(p_77043_1_, p_77043_2_, p_77043_3_, p_77043_4_);
+
+ if (p_77043_1_.limbSwingAmount >= 0.01D) {
+ float f3 = 13.0F;
+ float f4 = p_77043_1_.limbSwing - p_77043_1_.limbSwingAmount * (1.0F - p_77043_4_) + 6.0F;
+ float f5 = (Math.abs(f4 % f3 - f3 * 0.5F) - f3 * 0.25F) / (f3 * 0.25F);
+ GL11.glRotatef(6.5F * f5, 0.0F, 0.0F, 1.0F);
+ }
+ }
+
+ protected void renderEquippedItems(EntityStaballoyConstruct p_77029_1_, float p_77029_2_) {
+ super.renderEquippedItems(p_77029_1_, p_77029_2_);
+
+ if (p_77029_1_.getHoldRoseTick() != 0) {
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ GL11.glPushMatrix();
+ GL11.glRotatef(
+ 5.0F + 180.0F * this.staballoyGolemModel.ironGolemRightArm.rotateAngleX / (float) Math.PI,
+ 1.0F,
+ 0.0F,
+ 0.0F);
+ GL11.glTranslatef(-0.6875F, 1.25F, -0.9375F);
+ GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F);
+ float f1 = 0.8F;
+ GL11.glScalef(f1, -f1, f1);
+ int i = p_77029_1_.getBrightnessForRender(p_77029_2_);
+ int j = i % 65536;
+ int k = i / 65536;
+ OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, j / 1.0F, k / 1.0F);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ this.bindTexture(TextureMap.locationBlocksTexture);
+ this.field_147909_c.renderBlockAsItem(Blocks.red_flower, 0, 1.0F);
+ GL11.glPopMatrix();
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ }
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(EntityLiving p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ this.doRender(
+ (EntityStaballoyConstruct) p_76986_1_,
+ p_76986_2_,
+ p_76986_4_,
+ p_76986_6_,
+ p_76986_8_,
+ p_76986_9_);
+ }
+
+ @Override
+ protected void renderEquippedItems(EntityLivingBase p_77029_1_, float p_77029_2_) {
+ this.renderEquippedItems((EntityStaballoyConstruct) p_77029_1_, p_77029_2_);
+ }
+
+ @Override
+ protected void rotateCorpse(EntityLivingBase p_77043_1_, float p_77043_2_, float p_77043_3_, float p_77043_4_) {
+ this.rotateCorpse((EntityStaballoyConstruct) p_77043_1_, p_77043_2_, p_77043_3_, p_77043_4_);
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(EntityLivingBase p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ this.doRender(
+ (EntityStaballoyConstruct) p_76986_1_,
+ p_76986_2_,
+ p_76986_4_,
+ p_76986_6_,
+ p_76986_8_,
+ p_76986_9_);
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ @Override
+ protected ResourceLocation getEntityTexture(Entity p_110775_1_) {
+ return this.getEntityTexture((EntityStaballoyConstruct) p_110775_1_);
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_,
+ float p_76986_9_) {
+ this.doRender(
+ (EntityStaballoyConstruct) p_76986_1_,
+ p_76986_2_,
+ p_76986_4_,
+ p_76986_6_,
+ p_76986_8_,
+ p_76986_9_);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderToxinball.java b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderToxinball.java
new file mode 100644
index 0000000000..2c0ed7f562
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/RenderToxinball.java
@@ -0,0 +1,89 @@
+package gtPlusPlus.core.client.renderer;
+
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.entity.Render;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.entity.Entity;
+import net.minecraft.init.Items;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.entity.projectile.EntityToxinball;
+
+@SideOnly(Side.CLIENT)
+public class RenderToxinball extends Render {
+
+ private float mSize;
+
+ public RenderToxinball(float scale) {
+ this.mSize = scale;
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ public void doRender(EntityToxinball entity, double p_76986_2_, double p_76986_4_, double p_76986_6_,
+ float p_76986_8_, float p_76986_9_) {
+ GL11.glPushMatrix();
+ this.bindEntityTexture(entity);
+ GL11.glTranslatef((float) p_76986_2_, (float) p_76986_4_, (float) p_76986_6_);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ float f2 = this.mSize;
+ GL11.glScalef(f2 / 1.0F, f2 / 1.0F, f2 / 1.0F);
+ IIcon iicon = Items.slime_ball.getIconFromDamage(0);
+ Tessellator tessellator = Tessellator.instance;
+ float f3 = iicon.getMinU();
+ float f4 = iicon.getMaxU();
+ float f5 = iicon.getMinV();
+ float f6 = iicon.getMaxV();
+ float f7 = 1.0F;
+ float f8 = 0.5F;
+ float f9 = 0.25F;
+ GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, 1.0F, 0.0F);
+ tessellator.addVertexWithUV(0.0F - f8, 0.0F - f9, 0.0D, f3, f6);
+ tessellator.addVertexWithUV(f7 - f8, 0.0F - f9, 0.0D, f4, f6);
+ tessellator.addVertexWithUV(f7 - f8, 1.0F - f9, 0.0D, f4, f5);
+ tessellator.addVertexWithUV(0.0F - f8, 1.0F - f9, 0.0D, f3, f5);
+ tessellator.draw();
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ GL11.glPopMatrix();
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ protected ResourceLocation getEntityTexture(EntityToxinball entity) {
+ return TextureMap.locationItemsTexture;
+ }
+
+ /**
+ * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture.
+ */
+ @Override
+ protected ResourceLocation getEntityTexture(Entity entity) {
+ return this.getEntityTexture((EntityToxinball) entity);
+ }
+
+ /**
+ * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
+ * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
+ * (Render<T extends Entity) and this method has signature public void func_76986_a(T entity, double d, double d1,
+ * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
+ */
+ @Override
+ public void doRender(Entity entity, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_,
+ float p_76986_9_) {
+ this.doRender((EntityToxinball) entity, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/client/renderer/particle/EntityDropParticleFX.java b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/particle/EntityDropParticleFX.java
new file mode 100644
index 0000000000..58b135f3fb
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/client/renderer/particle/EntityDropParticleFX.java
@@ -0,0 +1,105 @@
+package gtPlusPlus.core.client.renderer.particle;
+
+import net.minecraft.block.BlockLiquid;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.particle.EntityFX;
+import net.minecraft.world.World;
+
+import cofh.lib.util.helpers.MathHelper;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class EntityDropParticleFX extends EntityFX {
+
+ private int bobTimer;
+
+ public EntityDropParticleFX(World world, double x, double y, double z, float particleRed, float particleGreen,
+ float particleBlue) {
+
+ this(world, x, y, z, particleRed, particleGreen, particleBlue, -1);
+ }
+
+ public EntityDropParticleFX(World world, double x, double y, double z, float particleRed, float particleGreen,
+ float particleBlue, int gravityMod) {
+
+ super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+ this.motionX = this.motionY = this.motionZ = 0.0D;
+
+ this.particleRed = particleRed;
+ this.particleGreen = particleGreen;
+ this.particleBlue = particleBlue;
+
+ this.setParticleTextureIndex(113);
+ this.setSize(0.01F, 0.01F);
+ this.particleGravity = -0.06F * gravityMod;
+ this.bobTimer = 40;
+ this.particleMaxAge = (int) (48.0D / (Math.random() * 0.8D + 0.2D));
+ this.motionX = this.motionY = this.motionZ = 0.0D;
+ }
+
+ @Override
+ public void onUpdate() {
+
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+
+ this.motionY -= this.particleGravity;
+
+ if (this.bobTimer-- > 0) {
+ this.motionX *= 0.02D;
+ this.motionY *= 0.02D;
+ this.motionZ *= 0.02D;
+ this.setParticleTextureIndex(113);
+ } else {
+ this.setParticleTextureIndex(112);
+ }
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= 0.9800000190734863D;
+ this.motionY *= 0.9800000190734863D;
+ this.motionZ *= 0.9800000190734863D;
+
+ if (this.particleMaxAge-- <= 0) {
+ this.setDead();
+ }
+ if (this.onGround) {
+ this.setParticleTextureIndex(114);
+ this.motionX *= 0.699999988079071D;
+ this.motionZ *= 0.699999988079071D;
+ }
+ if (this.particleGravity > 0) {
+ Material material = this.worldObj
+ .getBlock(MathHelper.floor(this.posX), MathHelper.floor(this.posY), MathHelper.floor(this.posZ))
+ .getMaterial();
+
+ if (material.isLiquid() || material.isSolid()) {
+ double d0 = MathHelper.floor(this.posY) + 1
+ - BlockLiquid.getLiquidHeightPercent(
+ this.worldObj.getBlockMetadata(
+ MathHelper.floor(this.posX),
+ MathHelper.floor(this.posY),
+ MathHelper.floor(this.posZ)));
+ if (this.posY < d0) {
+ this.setDead();
+ }
+ }
+ } else {
+ Material material = this.worldObj
+ .getBlock(MathHelper.ceil(this.posX), MathHelper.ceil(this.posY), MathHelper.ceil(this.posZ))
+ .getMaterial();
+
+ if (material.isLiquid() || material.isSolid()) {
+ double d0 = MathHelper.ceil(this.posY) + 1
+ - BlockLiquid.getLiquidHeightPercent(
+ this.worldObj.getBlockMetadata(
+ MathHelper.ceil(this.posX),
+ MathHelper.ceil(this.posY),
+ MathHelper.ceil(this.posZ)));
+ if (this.posY > d0) {
+ this.setDead();
+ }
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/commands/CommandEnableDebugWhileRunning.java b/gtpp/src/main/java/gtPlusPlus/core/commands/CommandEnableDebugWhileRunning.java
new file mode 100644
index 0000000000..1794951248
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/commands/CommandEnableDebugWhileRunning.java
@@ -0,0 +1,279 @@
+package gtPlusPlus.core.commands;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.command.ICommand;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.preloader.asm.AsmConfig;
+
+public class CommandEnableDebugWhileRunning implements ICommand {
+
+ private final List<String> aliases;
+
+ public CommandEnableDebugWhileRunning() {
+ this.aliases = new ArrayList<>();
+ this.aliases.add("gtplusplus");
+ }
+
+ @Override
+ public int compareTo(final Object o) {
+ if (o instanceof Comparable<?>) {
+ @SuppressWarnings("unchecked")
+ Comparable<ICommand> a = (Comparable<ICommand>) o;
+ if (a.equals(this)) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+ return -1;
+ }
+
+ @Override
+ public String getCommandName() {
+ return "gtpp";
+ }
+
+ // Use '/gtpp' along with 'logging' or 'debug' to toggle Debug mode and Logging.
+ // Using nothing after the command toggles both to their opposite states respectively.
+ @Override
+ public String getCommandUsage(final ICommandSender var1) {
+ return "/gtpp ?";
+ }
+
+ @Override
+ public List<String> getCommandAliases() {
+ return this.aliases;
+ }
+
+ @Override
+ public void processCommand(final ICommandSender S, final String[] argString) {
+ int aMaxArgumentsAllowed = 2;
+
+ if ((argString == null || argString.length == 0 || argString.length > aMaxArgumentsAllowed)
+ || argString[0].toLowerCase()
+ .equals("?")) {
+ Logger.INFO("Listing commands and their uses.");
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ AsmConfig.disableAllLogging = !AsmConfig.disableAllLogging;
+ PlayerUtils.messagePlayer(P, "The following are valid args for the '/gtpp' command:");
+ PlayerUtils.messagePlayer(P, "? - This help command.");
+ PlayerUtils.messagePlayer(P, "logging - Toggles ALL GT++ logging for current session.");
+ PlayerUtils.messagePlayer(P, "hand - Lists information about held item.");
+ PlayerUtils.messagePlayer(P, "fuid xxx - Tries to find the fluid in the FluidRegistry.");
+ PlayerUtils.messagePlayer(
+ P,
+ "debug - Toggles GT++ Debug Mode. Only use when advised, may break everything. (OP)");
+ } else if (argString[0].toLowerCase()
+ .equals("debug")) {
+ Logger.INFO("Toggling Debug Mode.");
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ if (PlayerUtils.isPlayerOP(P)) {
+ CORE_Preloader.DEBUG_MODE = !CORE_Preloader.DEBUG_MODE;
+ PlayerUtils.messagePlayer(P, "Toggled GT++ Debug Mode - Enabled: " + CORE_Preloader.DEBUG_MODE);
+ }
+ } else if (argString[0].toLowerCase()
+ .equals("logging")) {
+ Logger.INFO("Toggling Logging.");
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ AsmConfig.disableAllLogging = !AsmConfig.disableAllLogging;
+ PlayerUtils.messagePlayer(P, "Toggled GT++ Logging - Enabled: " + (!AsmConfig.disableAllLogging));
+ }
+ /*
+ * else if (argString[0].toLowerCase().equals("test")) { ItemStack mSemiFluidgen =
+ * ItemUtils.simpleMetaStack("IC2:blockGenerator", 7, 1); final EntityPlayer P = CommandUtils.getPlayer(S);
+ * if(mSemiFluidgen != null) { PlayerUtils.messagePlayer(P, ItemUtils.getItemName(mSemiFluidgen)); } }
+ */
+
+ else if (argString[0].toLowerCase()
+ .equals("inv")) {
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ if (P != null && !P.worldObj.isRemote) {
+ ItemStack[] aInv = P.inventory.mainInventory;
+ for (ItemStack aItem : aInv) {
+ if (aItem != null) {
+ String aModID = GameRegistry.findUniqueIdentifierFor(aItem.getItem()).modId;
+ String aRegistryName = GameRegistry.findUniqueIdentifierFor(aItem.getItem()).name;
+ Logger.INFO(
+ aModID + ":"
+ + aRegistryName
+ + ":"
+ + aItem.getItemDamage()
+ + " | "
+ + aItem.getDisplayName());
+ }
+ }
+ PlayerUtils.messagePlayer(P, "Dumped Inventory.");
+ }
+ } else if (argString[0].toLowerCase()
+ .equals("hand")) {
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ if (P != null) {
+ ItemStack aHeldItem = PlayerUtils.getItemStackInPlayersHand(P);
+ if (aHeldItem != null) {
+ String aItemDisplayName = ItemUtils.getItemName(aHeldItem);
+ String aItemUnlocalName = ItemUtils.getUnlocalizedItemName(aHeldItem);
+ String aNbtString = tryIterateNBTData(aHeldItem);
+ AutoMap<String> aOreDictNames = new AutoMap<>();
+
+ int[] aOreIDs = OreDictionary.getOreIDs(aHeldItem);
+ for (int id : aOreIDs) {
+ String aOreNameFromID = OreDictionary.getOreName(id);
+ if (aOreNameFromID != null && aOreNameFromID.length() > 0
+ && !aOreNameFromID.equals("Unknown")) {
+ aOreDictNames.add(aOreNameFromID);
+ }
+ }
+
+ String aOreDictData = "";
+ if (!aOreDictNames.isEmpty()) {
+ for (String tag : aOreDictNames) {
+ aOreDictData += (tag + ", ");
+ }
+ if (aOreDictData.endsWith(", ")) {
+ aOreDictData = aOreDictData.substring(0, aOreDictData.length() - 2);
+ }
+ }
+
+ AutoMap<String> aFluidContainerData = new AutoMap<>();
+ FluidStack aHeldItemFluid = FluidContainerRegistry.getFluidForFilledItem(aHeldItem);
+ if (aHeldItemFluid != null) {
+ aFluidContainerData
+ .put("FluidStack Unlocal Name: " + aHeldItemFluid.getUnlocalizedName());
+ aFluidContainerData.put("FluidStack Local Name: " + aHeldItemFluid.getLocalizedName());
+ aFluidContainerData.put(
+ "Fluid Unlocal Name: " + aHeldItemFluid.getFluid()
+ .getUnlocalizedName());
+ aFluidContainerData.put("Fluid Local Name: " + aHeldItemFluid.getLocalizedName());
+ aFluidContainerData.put(
+ "Fluid Name: " + aHeldItemFluid.getFluid()
+ .getName());
+ }
+
+ PlayerUtils.messagePlayer(P, "[" + aItemUnlocalName + "]" + "[" + aItemDisplayName + "] ");
+ if (aFluidContainerData.size() > 0) {
+ for (String s : aFluidContainerData) {
+ PlayerUtils.messagePlayer(P, "" + s);
+ }
+ }
+ if (!aOreDictNames.isEmpty()) {
+ PlayerUtils.messagePlayer(P, "" + aOreDictData);
+ }
+ if (aNbtString.length() > 0) {
+ PlayerUtils.messagePlayer(P, "" + aNbtString);
+ }
+ } else {
+ PlayerUtils.messagePlayer(P, "No item held.");
+ }
+ }
+ } else if (argString[0].toLowerCase()
+ .equals("fluid")) {
+ if (argString.length > 1 && argString[1] != null && argString[1].length() > 0) {
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ FluidStack aFluid = FluidUtils.getWildcardFluidStack(argString[1], 1);
+ if (P != null && aFluid != null) {
+ PlayerUtils
+ .messagePlayer(P, "Found fluid stack: " + FluidRegistry.getFluidName(aFluid));
+ } else if (P != null && aFluid == null) {
+ PlayerUtils.messagePlayer(P, "Could not find any fluids.");
+ }
+ }
+ } else if (argString[0].toLowerCase()
+ .equals("item")) {
+ if (argString.length > 1 && argString[1] != null && argString[1].length() > 0) {
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ ItemStack aTest = ItemUtils.getItemStackFromFQRN(argString[1], 1);
+ if (P != null && aTest != null) {
+ PlayerUtils.messagePlayer(P, "Found fluid stack: " + ItemUtils.getItemName(aTest));
+ } else if (P != null && aTest == null) {
+ PlayerUtils.messagePlayer(P, "Could not find valid item.");
+ }
+ }
+ } else {
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ PlayerUtils.messagePlayer(P, "Invalid command, use '?' as an argument for help.'");
+ }
+ }
+
+ @Override
+ public boolean canCommandSenderUseCommand(final ICommandSender var1) {
+ if (var1 == null || CommandUtils.getPlayer(var1) == null) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public List<?> addTabCompletionOptions(final ICommandSender var1, final String[] var2) {
+ ArrayList<String> aTabCompletes = new ArrayList<>();
+ aTabCompletes.add("?");
+ aTabCompletes.add("logging");
+ aTabCompletes.add("debug");
+ aTabCompletes.add("hand");
+ aTabCompletes.add("fluid");
+ return aTabCompletes;
+ }
+
+ @Override
+ public boolean isUsernameIndex(final String[] var1, final int var2) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public boolean playerUsesCommand(final World W, final EntityPlayer P, final int cost) {
+ return true;
+ }
+
+ public static String tryIterateNBTData(ItemStack aStack) {
+ try {
+ AutoMap<String> aItemDataTags = new AutoMap<>();
+ NBTTagCompound aNBT = NBTUtils.getNBT(aStack);
+ if (aNBT != null) {
+ if (!aNBT.hasNoTags()) {
+ Map<?, ?> mInternalMap = ReflectionUtils.getField(aNBT, "tagMap");
+ if (mInternalMap != null) {
+ for (Map.Entry<?, ?> e : mInternalMap.entrySet()) {
+ aItemDataTags.add(
+ e.getKey()
+ .toString() + ":"
+ + e.getValue());
+ }
+ int a = 0;
+ String data = "";
+ for (String tag : aItemDataTags) {
+ data += (tag + ", ");
+ }
+ if (data.endsWith(", ")) {
+ data = data.substring(0, data.length() - 2);
+ }
+ return data;
+ } else {
+ Logger.INFO("Data map reflected from NBTTagCompound was not valid.");
+ return "Bad NBT";
+ }
+ }
+ }
+ } catch (Throwable t) {}
+ return "";
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/commands/CommandMath.java b/gtpp/src/main/java/gtPlusPlus/core/commands/CommandMath.java
new file mode 100644
index 0000000000..6065044c29
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/commands/CommandMath.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.core.commands;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.command.ICommand;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.world.World;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.MiningUtils;
+
+public class CommandMath implements ICommand {
+
+ private final List<String> aliases;
+
+ protected String fullEntityName;
+ protected Entity conjuredEntity;
+
+ public CommandMath() {
+ this.aliases = new ArrayList<>();
+ }
+
+ @Override
+ public int compareTo(final Object o) {
+ return 0;
+ }
+
+ @Override
+ public String getCommandName() {
+ return "alkalus";
+ }
+
+ @Override
+ public String getCommandUsage(final ICommandSender var1) {
+ return "/alkalus [Dev Command]";
+ }
+
+ @Override
+ public List<String> getCommandAliases() {
+ return this.aliases;
+ }
+
+ @Override
+ public void processCommand(final ICommandSender S, final String[] argString) {
+ Logger.INFO("Debug Command");
+ final World W = S.getEntityWorld();
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ if (P.getDisplayName()
+ .equalsIgnoreCase("draknyte1")) {
+ Logger.INFO("[Bedrock Miner] OreType Scan");
+ MiningUtils.iterateAllOreTypes();
+ }
+ }
+
+ @Override
+ public boolean canCommandSenderUseCommand(final ICommandSender var1) {
+ final EntityPlayer P = CommandUtils.getPlayer(var1);
+ if (P == null) {
+ return false;
+ }
+ if (P.getDisplayName()
+ .toLowerCase()
+ .equals("draknyte1")
+ || P.getCommandSenderName()
+ .toLowerCase()
+ .equals("draknyte1")
+ || CORE.DEVENV) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public List<?> addTabCompletionOptions(final ICommandSender var1, final String[] var2) {
+ return null;
+ }
+
+ @Override
+ public boolean isUsernameIndex(final String[] var1, final int var2) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public boolean playerUsesCommand(final World W, final EntityPlayer P, final int cost) {
+
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/commands/CommandUtils.java b/gtpp/src/main/java/gtPlusPlus/core/commands/CommandUtils.java
new file mode 100644
index 0000000000..931ac5239f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/commands/CommandUtils.java
@@ -0,0 +1,18 @@
+package gtPlusPlus.core.commands;
+
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+
+public class CommandUtils {
+
+ public static EntityPlayer getPlayer(final ICommandSender icommandsender) {
+ EntityPlayer player;
+
+ if (icommandsender instanceof EntityPlayer) {
+ player = (EntityPlayer) icommandsender;
+ return player;
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/common/CommonProxy.java b/gtpp/src/main/java/gtPlusPlus/core/common/CommonProxy.java
new file mode 100644
index 0000000000..d52b3aa112
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/common/CommonProxy.java
@@ -0,0 +1,210 @@
+package gtPlusPlus.core.common;
+
+import net.minecraft.entity.monster.EntityBlaze;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.client.IItemRenderer;
+
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+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.simpleimpl.MessageContext;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.entity.InternalEntityRegistry;
+import gtPlusPlus.core.handler.BookHandler;
+import gtPlusPlus.core.handler.BurnableFuelHandler;
+import gtPlusPlus.core.handler.COMPAT_HANDLER;
+import gtPlusPlus.core.handler.COMPAT_IntermodStaging;
+import gtPlusPlus.core.handler.GuiHandler;
+import gtPlusPlus.core.handler.events.EnderDragonDeathHandler;
+import gtPlusPlus.core.handler.events.EntityDeathHandler;
+import gtPlusPlus.core.handler.events.GeneralTooltipEventHandler;
+import gtPlusPlus.core.handler.events.PlayerSleepEventHandler;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.tileentities.ModTileEntities;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.xmod.gregtech.api.util.SpecialBehaviourTooltipHandler;
+import gtPlusPlus.xmod.gregtech.recipes.GregtechRecipeAdder;
+import gtPlusPlus.xmod.ic2.CustomInternalName;
+
+public class CommonProxy {
+
+ public CommonProxy() {
+ // Should Register Gregtech Materials I've Made
+ Utils.registerEvent(this);
+ }
+
+ public void preInit(final FMLPreInitializationEvent e) {
+ Logger.INFO("Doing some house cleaning.");
+ CORE.RA = new GregtechRecipeAdder();
+ Logger.INFO("Created Gregtech recipe handler.");
+ if (!CORE_Preloader.DEBUG_MODE) {
+ Logger.WARNING("Development mode not enabled.");
+ } else if (CORE_Preloader.DEBUG_MODE) {
+ Logger.INFO("Development mode enabled.");
+ } else {
+ Logger.WARNING("Development mode not set.");
+ }
+
+ AddToCreativeTab.initialiseTabs();
+ CustomInternalName.init();
+
+ ModItems.init();
+ ModBlocks.init();
+ CI.preInit();
+ COMPAT_IntermodStaging.preInit(e);
+ BookHandler.run();
+ // Registration of entities and renderers
+ Logger.INFO("[Proxy] Calling Entity registration.");
+ registerEntities();
+ Logger.INFO("[Proxy] Calling Tile Entity registration.");
+ registerTileEntities();
+
+ Logger.INFO("[Proxy] Calling Render registration.");
+ registerRenderThings();
+ }
+
+ public void init(final FMLInitializationEvent e) {
+ CI.init();
+
+ Utils.registerEvent(new GeneralTooltipEventHandler());
+ // Handles Tooltips for items giving custom multiblock behaviour
+ Utils.registerEvent(new SpecialBehaviourTooltipHandler());
+ // Handles Sleep Benefits
+ PlayerSleepEventHandler.init();
+ // Handles Magic Feather
+ Utils.registerEvent(ModItems.itemMagicFeather);
+
+ Utils.registerEvent(new EnderDragonDeathHandler());
+ Utils.registerEvent(new EntityDeathHandler());
+
+ // Compat Handling
+ COMPAT_HANDLER.registerMyModsOreDictEntries();
+ COMPAT_HANDLER.intermodOreDictionarySupport();
+ COMPAT_IntermodStaging.init(e);
+ }
+
+ public void postInit(final FMLPostInitializationEvent e) {
+
+ // Make Burnables burnable
+ if (!CORE.burnables.isEmpty()) {
+ BurnableFuelHandler fuelHandler = new BurnableFuelHandler();
+ GameRegistry.registerFuelHandler(fuelHandler);
+ Logger.INFO(
+ "[Fuel Handler] Registering " + fuelHandler.getClass()
+ .getName());
+ }
+
+ // Compat Handling
+ Logger.INFO("Removing recipes from other mods.");
+ COMPAT_HANDLER.RemoveRecipesFromOtherMods();
+ Logger.INFO("Initialising Handler, Then Adding Recipes");
+ COMPAT_HANDLER.InitialiseHandlerThenAddRecipes();
+ Logger.INFO("Loading Intermod staging.");
+ COMPAT_IntermodStaging.postInit(e);
+ Logger.INFO("Loading queued recipes.");
+ COMPAT_HANDLER.runQueuedRecipes();
+ Logger.INFO("Registering custom mob drops.");
+ registerCustomMobDrops();
+
+ // Moved last, to prevent recipes being generated post initialisation.
+ Logger.INFO("Loading Gregtech API recipes.");
+ COMPAT_HANDLER.startLoadingGregAPIBasedRecipes();
+ }
+
+ public void serverStarting(final FMLServerStartingEvent e) {
+ COMPAT_HANDLER.InitialiseLateHandlerThenAddRecipes();
+ }
+
+ public void onLoadComplete(FMLLoadCompleteEvent event) {
+ COMPAT_IntermodStaging.onLoadComplete(event);
+ COMPAT_HANDLER.onLoadComplete(event);
+ }
+
+ public void registerNetworkStuff() {
+ GuiHandler.init();
+ }
+
+ public void registerEntities() {
+ InternalEntityRegistry.registerEntities();
+ }
+
+ public void registerTileEntities() {
+ ModTileEntities.init();
+ }
+
+ public void registerRenderThings() {}
+
+ public int addArmor(final String armor) {
+ return 0;
+ }
+
+ public void registerCustomMobDrops() {
+
+ // Blazes
+ if (ItemUtils.doesOreDictHaveEntryFor("dustPyrotheum")) {
+ EntityUtils.registerDropsForMob(
+ EntityBlaze.class,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustPyrotheum", 1),
+ 1,
+ 10);
+ EntityUtils.registerDropsForMob(
+ EntityBlaze.class,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustPyrotheum", 1),
+ 1,
+ 10);
+ }
+
+ // GalaxySpace Support
+ if (ReflectionUtils.doesClassExist("galaxyspace.core.entity.mob.EntityEvolvedColdBlaze")) {
+ Class<?> aColdBlaze = ReflectionUtils.getClass("galaxyspace.core.entity.mob.EntityEvolvedColdBlaze");
+ ItemStack aSmallBlizz, aTinyBlizz, aSmallCryo, aTinyCryo;
+ aSmallBlizz = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallBlizz", 1);
+ aTinyBlizz = ItemUtils.getItemStackOfAmountFromOreDict("dustTinyBlizz", 1);
+ aSmallCryo = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallCryotheum", 1);
+ aTinyCryo = ItemUtils.getItemStackOfAmountFromOreDict("dustTinyCryotheum", 1);
+ EntityUtils
+ .registerDropsForMob(aColdBlaze, ItemUtils.getItemStackOfAmountFromOreDict("stickBlizz", 1), 2, 500);
+ if (aSmallBlizz != null) {
+ EntityUtils.registerDropsForMob(aColdBlaze, aSmallBlizz, 2, 750);
+ }
+ if (aTinyBlizz != null) {
+ EntityUtils.registerDropsForMob(aColdBlaze, aTinyBlizz, 4, 1500);
+ }
+ if (aSmallCryo != null) {
+ EntityUtils.registerDropsForMob(aColdBlaze, aSmallCryo, 1, 50);
+ }
+ if (aTinyCryo != null) {
+ EntityUtils.registerDropsForMob(aColdBlaze, aTinyCryo, 2, 100);
+ }
+ }
+ }
+
+ protected final AutoMap<Pair<Item, IItemRenderer>> mItemRenderMappings = new AutoMap<>();
+
+ public World getClientWorld() {
+ return null;
+ }
+
+ /**
+ * Returns a side-appropriate EntityPlayer for use during message handling
+ */
+ public EntityPlayer getPlayerEntity(MessageContext ctx) {
+ return ctx.getServerHandler().playerEntity;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Baubles.java b/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Baubles.java
new file mode 100644
index 0000000000..e90596c876
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Baubles.java
@@ -0,0 +1,58 @@
+package gtPlusPlus.core.common.compat;
+
+import static gregtech.api.enums.Mods.Baubles;
+import static gregtech.client.GT_TooltipHandler.Tier.EV;
+import static gregtech.client.GT_TooltipHandler.Tier.HV;
+import static gregtech.client.GT_TooltipHandler.Tier.IV;
+import static gregtech.client.GT_TooltipHandler.Tier.LV;
+import static gregtech.client.GT_TooltipHandler.Tier.LuV;
+import static gregtech.client.GT_TooltipHandler.Tier.MV;
+import static gregtech.client.GT_TooltipHandler.Tier.UHV;
+import static gregtech.client.GT_TooltipHandler.Tier.UV;
+import static gregtech.client.GT_TooltipHandler.Tier.ZPM;
+import static gregtech.client.GT_TooltipHandler.registerTieredTooltip;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.bauble.BatteryPackBaseBauble;
+import gtPlusPlus.core.item.bauble.FireProtectionBauble;
+import gtPlusPlus.core.item.general.ItemCloakingDevice;
+import gtPlusPlus.core.item.general.ItemHealingDevice;
+
+public class COMPAT_Baubles {
+
+ public static void run() {
+ if (Baubles.isModLoaded()) {
+ baublesLoaded();
+ }
+ }
+
+ public static void baublesLoaded() {
+ Logger.INFO("Baubles Found - Loading Wearables.");
+ ModItems.itemPersonalCloakingDevice = new ItemCloakingDevice(0);
+ ModItems.itemPersonalHealingDevice = new ItemHealingDevice();
+ ModItems.itemSupremePizzaGloves = new FireProtectionBauble();
+
+ ModItems.itemChargePack_Low_1 = new BatteryPackBaseBauble(1);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_Low_1, 1, OreDictionary.WILDCARD_VALUE), LV);
+ ModItems.itemChargePack_Low_2 = new BatteryPackBaseBauble(2);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_Low_2, 1, OreDictionary.WILDCARD_VALUE), MV);
+ ModItems.itemChargePack_Low_3 = new BatteryPackBaseBauble(3);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_Low_3, 1, OreDictionary.WILDCARD_VALUE), HV);
+ ModItems.itemChargePack_Low_4 = new BatteryPackBaseBauble(4);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_Low_4, 1, OreDictionary.WILDCARD_VALUE), EV);
+ ModItems.itemChargePack_Low_5 = new BatteryPackBaseBauble(5);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_Low_5, 1, OreDictionary.WILDCARD_VALUE), IV);
+ ModItems.itemChargePack_High_1 = new BatteryPackBaseBauble(6);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_High_1, 1, OreDictionary.WILDCARD_VALUE), LuV);
+ ModItems.itemChargePack_High_2 = new BatteryPackBaseBauble(7);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_High_2, 1, OreDictionary.WILDCARD_VALUE), ZPM);
+ ModItems.itemChargePack_High_3 = new BatteryPackBaseBauble(8);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_High_3, 1, OreDictionary.WILDCARD_VALUE), UV);
+ ModItems.itemChargePack_High_4 = new BatteryPackBaseBauble(9);
+ registerTieredTooltip(new ItemStack(ModItems.itemChargePack_High_4, 1, OreDictionary.WILDCARD_VALUE), UHV);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_ExtraUtils.java b/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_ExtraUtils.java
new file mode 100644
index 0000000000..f61c70ab5b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_ExtraUtils.java
@@ -0,0 +1,18 @@
+package gtPlusPlus.core.common.compat;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.recipe.RECIPES_Tools;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class COMPAT_ExtraUtils {
+
+ public static void OreDict() {
+ RECIPES_Tools.RECIPE_DivisionSigil = new ItemStack(ItemUtils.getItemFromFQRN("ExtraUtilities:divisionSigil"));
+ run();
+ }
+
+ private static void run() {
+ ItemUtils.getItemForOreDict("ExtraUtilities:bedrockiumIngot", "ingotBedrockium", "Bedrockium Ingot", 0);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_HarvestCraft.java b/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_HarvestCraft.java
new file mode 100644
index 0000000000..9a9557e418
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_HarvestCraft.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.core.common.compat;
+
+import gtPlusPlus.xmod.pamsharvest.fishtrap.FishTrapHandler;
+
+public class COMPAT_HarvestCraft {
+
+ public static void OreDict() {
+ run();
+ }
+
+ private static void run() {
+ FishTrapHandler.pamsHarvestCraftCompat();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_IC2.java b/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_IC2.java
new file mode 100644
index 0000000000..c442251a0e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_IC2.java
@@ -0,0 +1,58 @@
+package gtPlusPlus.core.common.compat;
+
+import static gtPlusPlus.core.handler.COMPAT_HANDLER.RemoveRecipeQueue;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.lib.CORE.ConfigSwitches;
+import gtPlusPlus.core.recipe.ShapedRecipeObject;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class COMPAT_IC2 {
+
+ private static ItemStack itemCropnalyzer = ItemUtils.simpleMetaStack("IC2:itemCropnalyzer", 0, 1);
+ private static ItemStack itemSolarHelmet = ItemUtils.simpleMetaStack("IC2:itemSolarHelmet", 0, 1);
+
+ public static ShapedRecipeObject Cropnalyzer = new ShapedRecipeObject(
+ "ore:cableGt02Copper",
+ "ore:cableGt02Copper",
+ null,
+ "minecraft:redstone",
+ "ore:blockGlass",
+ "minecraft:redstone",
+ "minecraft:redstone",
+ "ore:circuitBasic",
+ "minecraft:redstone",
+ itemCropnalyzer);
+ public static ShapedRecipeObject SolarHelmet = new ShapedRecipeObject(
+ "ore:plateIron",
+ "ore:plateIron",
+ "ore:plateIron",
+ "ore:plateIron",
+ "gregtech:gt.metaitem.01:32750",
+ "ore:plateIron",
+ "ore:craftingWireCopper",
+ "ore:craftingWireCopper",
+ "ore:craftingWireCopper",
+ itemSolarHelmet);
+
+ public static void OreDict() {
+ run();
+ }
+
+ private static void run() {
+
+ if (ConfigSwitches.disableIC2Recipes) {
+
+ // Remove these.
+ RemoveRecipeQueue.add("IC2:itemCable");
+ RemoveRecipeQueue.add("IC2:itemCable:1");
+ RemoveRecipeQueue.add("IC2:itemCable:2");
+ RemoveRecipeQueue.add("IC2:itemCable:3");
+ RemoveRecipeQueue.add("IC2:itemCable:5");
+ RemoveRecipeQueue.add("IC2:itemCable:6");
+ RemoveRecipeQueue.add("IC2:itemCable:10");
+ RemoveRecipeQueue.add("IC2:itemCable:13");
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Thaumcraft.java b/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Thaumcraft.java
new file mode 100644
index 0000000000..d9c9fec08e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Thaumcraft.java
@@ -0,0 +1,47 @@
+package gtPlusPlus.core.common.compat;
+
+import static gregtech.api.enums.Mods.ForbiddenMagic;
+
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.lib.CORE.ConfigSwitches;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class COMPAT_Thaumcraft {
+
+ public static void OreDict() {
+
+ if (ConfigSwitches.enableThaumcraftShardUnification) {
+ run();
+ }
+ }
+
+ private static void run() {
+
+ for (int i = 0; i <= 6; i++) {
+ ItemUtils.getItemForOreDict("Thaumcraft:ItemShard", "shardAny", "TC Shard " + i, i);
+ GT_OreDictUnificator
+ .registerOre("shardAny", ItemUtils.getItemStackFromFQRN("Thaumcraft:ItemShard:" + i, 1));
+ ItemUtils.getItemForOreDict("Thaumcraft:ItemShard", "gemInfusedAnything", "TC Shard " + i, i);
+ GT_OreDictUnificator
+ .registerOre("gemInfusedAnything", ItemUtils.getItemStackFromFQRN("Thaumcraft:ItemShard:" + i, 1));
+ }
+
+ if (ForbiddenMagic.isModLoaded()) {
+ for (int i = 0; i <= 6; i++) {
+ ItemUtils.getItemForOreDict("ForbiddenMagic:NetherShard", "shardAny", "FM Shard " + i, i);
+ GT_OreDictUnificator
+ .registerOre("shardAny", ItemUtils.getItemStackFromFQRN("ForbiddenMagic:NetherShard:" + i, 1));
+ ItemUtils.getItemForOreDict("ForbiddenMagic:NetherShard", "gemInfusedAnything", "FM Shard " + i, i);
+ GT_OreDictUnificator.registerOre(
+ "gemInfusedAnything",
+ ItemUtils.getItemStackFromFQRN("ForbiddenMagic:NetherShard:" + i, 1));
+ }
+ ItemUtils.getItemForOreDict("ForbiddenMagic:GluttonyShard", "shardAny", "FM Gluttony Shard", 0);
+ GT_OreDictUnificator
+ .registerOre("shardAny", ItemUtils.getItemStackFromFQRN("ForbiddenMagic:GluttonyShard", 1));
+ ItemUtils.getItemForOreDict("ForbiddenMagic:GluttonyShard", "gemInfusedAnything", "FM Gluttony Shard", 0);
+ GT_OreDictUnificator
+ .registerOre("gemInfusedAnything", ItemUtils.getItemStackFromFQRN("ForbiddenMagic:GluttonyShard", 1));
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Witchery.java b/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Witchery.java
new file mode 100644
index 0000000000..f6fdd87eec
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/common/compat/COMPAT_Witchery.java
@@ -0,0 +1,28 @@
+package gtPlusPlus.core.common.compat;
+
+import static gregtech.api.enums.Mods.Witchery;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class COMPAT_Witchery {
+
+ public static void OreDict() {
+ run();
+ }
+
+ private static void run() {
+ // Koboldite
+ ItemStack aKobolditeDust = ItemUtils
+ .getItemStackWithMeta(Witchery.isModLoaded(), "witchery:ingredient", "Koboldite Dust", 148, 1);
+ ItemStack aKobolditeNugget = ItemUtils
+ .getItemStackWithMeta(Witchery.isModLoaded(), "witchery:ingredient", "Koboldite Nugget", 149, 1);
+ ItemStack aKobolditeIngot = ItemUtils
+ .getItemStackWithMeta(Witchery.isModLoaded(), "witchery:ingredient", "Koboldite Ingot", 150, 1);
+ if (aKobolditeDust != null) GT_OreDictUnificator.registerOre("dust" + "Koboldite", aKobolditeDust);
+ if (aKobolditeNugget != null) GT_OreDictUnificator.registerOre("nugget" + "Koboldite", aKobolditeNugget);
+ if (aKobolditeIngot != null) GT_OreDictUnificator.registerOre("ingot" + "Koboldite", aKobolditeIngot);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/config/ConfigHandler.java b/gtpp/src/main/java/gtPlusPlus/core/config/ConfigHandler.java
new file mode 100644
index 0000000000..162d5b0f12
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/config/ConfigHandler.java
@@ -0,0 +1,670 @@
+package gtPlusPlus.core.config;
+
+import static gregtech.api.enums.Mods.GregTech;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.MACHINE_INFO;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.baseMaxPollutionPerSecondRocketFuelGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.baseMinPollutionPerSecondRocketFuelGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.basePollutionPerSecondBoiler;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.basePollutionPerSecondGeothermalGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.basePollutionPerSecondSemiFluidGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.boilerSteamPerSecond;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.disableIC2Recipes;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.dumpItemAndBlockData;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableAnimatedTextures;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableCustomCapes;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableCustom_Cables;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableCustom_Pipes;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_Dehydrators;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_FluidTanks;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_GeothermalEngines;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_Pollution;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_RocketEngines;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_SimpleWasher;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_SteamConverter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMachine_Tesseracts;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_AlloyBlastSmelter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_Cyclotron;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialCentrifuge;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialCokeOven;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialCuttingMachine;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialElectrolyzer;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialExtrudingMachine;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialFishingPort;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialMacerationStack;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialMultiMachine;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialPlatePress;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialSifter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialThermalCentrifuge;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialWashPlant;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_IndustrialWireMill;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_LargeAutoCrafter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_LiquidFluorideThoriumReactor;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_MatterFabricator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_MultiTank;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_NuclearFuelRefinery;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_NuclearSaltProcessingPlant;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_PowerSubstation;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableMultiblock_ThermalBoiler;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableThaumcraftShardUnification;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.enableWatchdogBGM;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.hideUniversalCells;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiABS;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiAdvDistillationTower_ModeDT;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiAdvDistillationTower_ModeDistillery;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiAdvEBF;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiAdvImplosion;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiAlgaePond;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiAutoCrafter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiCyclotron;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiFrothFlotationCell;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialAlloySmelter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialArcFurnace;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialCentrifuge;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialChisel;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialCokeOven;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialCuttingMachine;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialDehydrator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialElectrolyzer;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialExtruder;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialFishingPond;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialForgeHammer;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMacerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMixer;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialPlatePress_ModeBending;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialPlatePress_ModeForming;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialRockBreaker;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialSifter;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialThermalCentrifuge;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialVacuumFreezer;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialWashPlant_ModeWasher;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialWireMill;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiIsaMill;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiLargeSemiFluidGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiMassFabricator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiMolecularTransformer;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiPackager;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiRefinery;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiThermalBoiler;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionPerSecondMultiTreeFarm;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionReleasedByTierBoiler;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionReleasedByTierGeothermalGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionReleasedByTierRocketFuelGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.pollutionReleasedByTierSemiFluidGenerator;
+import static gtPlusPlus.core.lib.CORE.ConfigSwitches.showHiddenNEIItems;
+import static gtPlusPlus.core.lib.CORE.EVERGLADESBIOME_ID;
+import static gtPlusPlus.core.lib.CORE.EVERGLADES_ID;
+import static gtPlusPlus.core.lib.CORE.turbineCutoffBase;
+
+import java.io.File;
+
+import net.minecraftforge.common.config.Configuration;
+
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+
+public class ConfigHandler {
+
+ public static void handleConfigFile(final FMLPreInitializationEvent event) {
+ final Configuration config = new Configuration(
+ new File(event.getModConfigurationDirectory(), "GTplusplus/GTplusplus.cfg"));
+ config.load();
+
+ // Debug
+ /*
+ * DEBUG = config.getBoolean("debugMode", "debug", false,
+ * "Enables all sorts of debug logging. (Don't use unless told to, breaks other things.)");
+ */
+ MACHINE_INFO = config.getBoolean(
+ "enableMachineInfoLogging",
+ "debug",
+ false,
+ "Makes many machines display lots of debug logging.");
+ showHiddenNEIItems = config
+ .getBoolean("showHiddenNEIItems", "debug", false, "Makes all items hidden from NEI display.");
+ dumpItemAndBlockData = config.getBoolean(
+ "dumpItemAndBlockData",
+ "debug",
+ false,
+ "Dumps all GT++ and Toxic Everglade Data to en_US.lang in the config folder. This config option can be used by foreign players to generate blank .lang files, which they can populate with their language of choice.");
+
+ // Machines
+ enableThaumcraftShardUnification = config.getBoolean(
+ "enableThaumcraftShardUnification",
+ "machines",
+ false,
+ "Allows the use of TC shards across many recipes by oreDicting them into a common group.");
+ disableIC2Recipes = config.getBoolean(
+ "disableIC2Recipes",
+ "machines",
+ false,
+ "Alkaluscraft Related - Removes IC2 Cables Except glass fibre. Few other Misc Tweaks.");
+ boilerSteamPerSecond = config.getInt(
+ "boilerSteamPerSecond",
+ "machines",
+ 750,
+ 0,
+ 10000,
+ "Sets the steam per second value in LV,MV,HV boilers (respectively 1x,2x,3x this number for the tiers)");
+
+ // GT-Fixes
+ turbineCutoffBase = config.getInt(
+ "turbineCutoffBase",
+ GregTech.ID,
+ 75000,
+ 0,
+ Integer.MAX_VALUE,
+ "Rotors below this durability will be removed, prevents NEI clutter. Minimum Durability is N * x, where N is the new value set and x is the turbine size, where 1 is Tiny and 4 is Huge. Set to 0 to disable.");
+
+ // Pipes & Cables
+ enableCustom_Pipes = config.getBoolean("enableCustom_Pipes", GregTech.ID, true, "Adds Custom GT Fluid Pipes.");
+ enableCustom_Cables = config.getBoolean("enableCustom_Cables", GregTech.ID, true, "Adds Custom GT Cables.");
+
+ enableMachine_Dehydrators = config
+ .getBoolean("enableMachineDehydrators", GregTech.ID, true, "These dehydrate stuff.");
+ enableMachine_SteamConverter = config
+ .getBoolean("enableMachineSteamConverter", GregTech.ID, true, "Converts IC2 steam -> Railcraft steam.");
+ enableMachine_FluidTanks = config
+ .getBoolean("enableMachineFluidTanks", GregTech.ID, true, "Portable fluid tanks.");
+ enableMachine_RocketEngines = config.getBoolean(
+ "enableMachineRocketEngines",
+ GregTech.ID,
+ true,
+ "Diesel egines with different internals, they consume less fuel overall.");
+ enableMachine_GeothermalEngines = config.getBoolean(
+ "enableMachineGeothermalEngines",
+ GregTech.ID,
+ true,
+ "These may be overpowered, Consult a local geologist.");
+ enableMachine_Tesseracts = config
+ .getBoolean("enableMachineTesseracts", GregTech.ID, true, "Tesseracts for wireless item/fluid movement.");
+ enableMachine_SimpleWasher = config.getBoolean(
+ "enableMachineSimpleWasher",
+ GregTech.ID,
+ true,
+ "Very basic automated cauldron for dust washing.");
+ enableMachine_Pollution = config
+ .getBoolean("enableMachinePollution", GregTech.ID, true, "Pollution Detector & Scrubbers.");
+
+ // Multi machines
+ enableMultiblock_AlloyBlastSmelter = config.getBoolean(
+ "enableMultiblockAlloyBlastSmelter",
+ GregTech.ID,
+ true,
+ "Required to smelt most high tier materials from GT++. Also smelts everything else to molten metal.");
+ enableMultiblock_IndustrialCentrifuge = config
+ .getBoolean("enableMultiblockIndustrialCentrifuge", GregTech.ID, true, "Spin, Spin, Spiiiin.");
+ enableMultiblock_IndustrialCokeOven = config.getBoolean(
+ "enableMultiblockIndustrialCokeOven",
+ GregTech.ID,
+ true,
+ "Pyro Oven Alternative, older, more realistic, better.");
+ enableMultiblock_IndustrialElectrolyzer = config.getBoolean(
+ "enableMultiblockIndustrialElectrolyzer",
+ GregTech.ID,
+ true,
+ "Electrolyzes things with extra bling factor.");
+ enableMultiblock_IndustrialMacerationStack = config.getBoolean(
+ "enableMultiblockIndustrialMacerationStack",
+ GregTech.ID,
+ true,
+ "A hyper efficient maceration tower, nets more bonus outputs.");
+ enableMultiblock_IndustrialPlatePress = config.getBoolean(
+ "enableMultiblockIndustrialPlatePress",
+ GregTech.ID,
+ true,
+ "Industrial bendering machine thingo.");
+ enableMultiblock_IndustrialWireMill = config.getBoolean(
+ "enableMultiblockIndustrialWireMill",
+ GregTech.ID,
+ true,
+ "Produces fine wire and exotic cables.");
+ enableMultiblock_MatterFabricator = config
+ .getBoolean("enableMultiblockMatterFabricator", GregTech.ID, true, "?FAB?RIC?ATE MA?TT?ER.");
+ enableMultiblock_MultiTank = config.getBoolean(
+ "enableMultiblockMultiTank",
+ GregTech.ID,
+ true,
+ "Tall tanks, each layer adds extra fluid storage.");
+ enableMultiblock_PowerSubstation = config
+ .getBoolean("enableMultiblockPowerSubstation", GregTech.ID, true, "For managing large power grids.");
+ enableMultiblock_LiquidFluorideThoriumReactor = config.getBoolean(
+ "enableMultiblockLiquidFluorideThoriumReactor",
+ GregTech.ID,
+ true,
+ "For supplying large power grids.");
+ enableMultiblock_NuclearFuelRefinery = config.getBoolean(
+ "enableMultiblock_NuclearFuelRefinery",
+ GregTech.ID,
+ true,
+ "Refines molten chemicals into nuclear fuels.");
+ enableMultiblock_NuclearSaltProcessingPlant = config.getBoolean(
+ "enableMultiblockNuclearSaltProcessingPlant",
+ GregTech.ID,
+ true,
+ "Reprocesses depleted nuclear salts into useful chemicals.");
+ enableMultiblock_IndustrialSifter = config
+ .getBoolean("enableMultiblock_IndustrialSifter", GregTech.ID, true, "Large scale sifting.");
+ enableMultiblock_LargeAutoCrafter = config.getBoolean(
+ "enableMultiblock_LargeAutoCrafter",
+ GregTech.ID,
+ true,
+ "Can Assemble, Disassemble and Craft Project data from Data Sticks.");
+ enableMultiblock_IndustrialThermalCentrifuge = config.getBoolean(
+ "enableMultiblock_IndustrialThermalCentrifuge",
+ GregTech.ID,
+ true,
+ "Your warm spin for the ore thing.");
+ enableMultiblock_IndustrialWashPlant = config.getBoolean(
+ "enableMultiblock_IndustrialWashPlant",
+ GregTech.ID,
+ true,
+ "Used to wash the dirt, riiiiight offff..");
+ enableMultiblock_ThermalBoiler = config.getBoolean(
+ "enableMachineThermalBoiler",
+ GregTech.ID,
+ true,
+ "Thermal Boiler from GT4. Can Filter Lava for resources.");
+ enableMultiblock_IndustrialCuttingMachine = config.getBoolean(
+ "enableMultiblock_IndustrialCuttingMachine",
+ GregTech.ID,
+ true,
+ "Very fast and efficient Cutting Machine.");
+ enableMultiblock_IndustrialFishingPort = config
+ .getBoolean("enableMultiblock_IndustrialFishingPort", GregTech.ID, true, "Fish the seas, except on land.");
+ enableMultiblock_IndustrialExtrudingMachine = config.getBoolean(
+ "enableMultiblock_IndustrialExtrudingMachine",
+ GregTech.ID,
+ true,
+ "Very fast and efficient Extruding Machine.");
+ enableMultiblock_IndustrialMultiMachine = config.getBoolean(
+ "enableMultiblock_IndustrialMultiMachine",
+ GregTech.ID,
+ true,
+ "Can run recipes for 9 different types of machines.");
+ enableMultiblock_Cyclotron = config
+ .getBoolean("enableMultiblock_Cyclotron", GregTech.ID, true, "COMET - Scientific Cyclotron.");
+
+ // Features
+ enableCustomCapes = config.getBoolean("enableSupporterCape", "features", true, "Enables Custom GT++ Cape.");
+
+ enableWatchdogBGM = config.getInt(
+ "enableWatchdogBGM",
+ "features",
+ 0,
+ 0,
+ Short.MAX_VALUE,
+ "Set to a value greater than 0 to reduce the ticks taken to delay between BGM tracks. Acceptable Values are 1-32767, where 0 is disabled. Vanilla Uses 12,000 & 24,000. 200 is 10s.");
+ hideUniversalCells = config
+ .getBoolean("hideUniversalCells", "features", true, "Hides every filled IC2 Universal Cell from NEI.");
+
+ // Biomes
+ EVERGLADES_ID = config.getInt("darkworld_ID", "worldgen", 227, 1, 254, "The ID of the Dark Dimension.");
+ EVERGLADESBIOME_ID = config
+ .getInt("darkbiome_ID", "worldgen", 238, 1, 254, "The biome within the Dark Dimension.");
+
+ // Pollution
+ pollutionPerSecondMultiPackager = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiPackager",
+ pollutionPerSecondMultiPackager,
+ "pollution rate in gibbl/s for the Amazon warehousing depot")
+ .getInt(pollutionPerSecondMultiPackager);
+ pollutionPerSecondMultiIndustrialAlloySmelter = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialAlloySmelter",
+ pollutionPerSecondMultiIndustrialAlloySmelter,
+ "pollution rate in gibbl/s for the Alloy blast smelter")
+ .getInt(pollutionPerSecondMultiIndustrialAlloySmelter);
+ pollutionPerSecondMultiIndustrialArcFurnace = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialArcFurnace",
+ pollutionPerSecondMultiIndustrialArcFurnace,
+ "pollution rate in gibbl/s for the High current arc furnace")
+ .getInt(pollutionPerSecondMultiIndustrialArcFurnace);
+ pollutionPerSecondMultiIndustrialCentrifuge = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialCentrifuge",
+ pollutionPerSecondMultiIndustrialCentrifuge,
+ "pollution rate in gibbl/s for the Industrial centrifuge")
+ .getInt(pollutionPerSecondMultiIndustrialCentrifuge);
+ pollutionPerSecondMultiIndustrialCokeOven = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialCokeOven",
+ pollutionPerSecondMultiIndustrialCokeOven,
+ "pollution rate in gibbl/s for the Industrial coke oven")
+ .getInt(pollutionPerSecondMultiIndustrialCokeOven);
+ pollutionPerSecondMultiIndustrialCuttingMachine = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialCuttingMachine",
+ pollutionPerSecondMultiIndustrialCuttingMachine,
+ "pollution rate in gibbl/s for the Cutting factory")
+ .getInt(pollutionPerSecondMultiIndustrialCuttingMachine);
+ pollutionPerSecondMultiIndustrialDehydrator = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialDehydrator",
+ pollutionPerSecondMultiIndustrialDehydrator,
+ "pollution rate in gibbl/s for the Utupu-Tanuri")
+ .getInt(pollutionPerSecondMultiIndustrialDehydrator);
+ pollutionPerSecondMultiIndustrialElectrolyzer = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialElectrolyzer",
+ pollutionPerSecondMultiIndustrialElectrolyzer,
+ "pollution rate in gibbl/s for the Industrial electrolyzer")
+ .getInt(pollutionPerSecondMultiIndustrialElectrolyzer);
+ pollutionPerSecondMultiIndustrialExtruder = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialExtruder",
+ pollutionPerSecondMultiIndustrialExtruder,
+ "pollution rate in gibbl/s for the Industrial extrusion machine")
+ .getInt(pollutionPerSecondMultiIndustrialExtruder);
+ pollutionPerSecondMultiIndustrialMacerator = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialMacerator",
+ pollutionPerSecondMultiIndustrialMacerator,
+ "pollution rate in gibbl/s for the Maceration stack")
+ .getInt(pollutionPerSecondMultiIndustrialMacerator);
+ pollutionPerSecondMultiIndustrialMixer = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialMixer",
+ pollutionPerSecondMultiIndustrialMixer,
+ "pollution rate in gibbl/s for the Industrial mixing machine")
+ .getInt(pollutionPerSecondMultiIndustrialMixer);
+ pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal",
+ pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal,
+ "pollution rate in gibbl/s for the Large processing factory in metal mode")
+ .getInt(pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal);
+ pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid",
+ pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid,
+ "pollution rate in gibbl/s for the Large processing factory in fluid mode")
+ .getInt(pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid);
+ pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc",
+ pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc,
+ "pollution rate in gibbl/s for the Large processing factory in misc mode")
+ .getInt(pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc);
+ pollutionPerSecondMultiIndustrialPlatePress_ModeForming = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialPlatePress_ModeForming",
+ pollutionPerSecondMultiIndustrialPlatePress_ModeForming,
+ "pollution rate in gibbl/s for the Industrial material press in forming mode")
+ .getInt(pollutionPerSecondMultiIndustrialPlatePress_ModeForming);
+ pollutionPerSecondMultiIndustrialPlatePress_ModeBending = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialPlatePress_ModeBending",
+ pollutionPerSecondMultiIndustrialPlatePress_ModeBending,
+ "pollution rate in gibbl/s for the Industrial material press in bending mode")
+ .getInt(pollutionPerSecondMultiIndustrialPlatePress_ModeBending);
+ pollutionPerSecondMultiIndustrialForgeHammer = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialForgeHammer",
+ pollutionPerSecondMultiIndustrialForgeHammer,
+ "pollution rate in gibbl/s for the Industrial Forge Hammer")
+ .getInt(pollutionPerSecondMultiIndustrialForgeHammer);
+ pollutionPerSecondMultiIndustrialSifter = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialSifter",
+ pollutionPerSecondMultiIndustrialSifter,
+ "pollution rate in gibbl/s for the Large Sifter")
+ .getInt(pollutionPerSecondMultiIndustrialSifter);
+ pollutionPerSecondMultiIndustrialThermalCentrifuge = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialThermalCentrifuge",
+ pollutionPerSecondMultiIndustrialThermalCentrifuge,
+ "pollution rate in gibbl/s for the Large thermal refinery")
+ .getInt(pollutionPerSecondMultiIndustrialThermalCentrifuge);
+ pollutionPerSecondMultiIndustrialVacuumFreezer = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialVacuumFreezer",
+ pollutionPerSecondMultiIndustrialVacuumFreezer,
+ "pollution rate in gibbl/s for the Cryogenic freezer")
+ .getInt(pollutionPerSecondMultiIndustrialVacuumFreezer);
+ pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath",
+ pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath,
+ "pollution rate in gibbl/s for the Ore washing plant in chemical bath mode")
+ .getInt(pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath);
+ pollutionPerSecondMultiIndustrialWashPlant_ModeWasher = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialWashPlant_ModeWasher",
+ pollutionPerSecondMultiIndustrialWashPlant_ModeWasher,
+ "pollution rate in gibbl/s for the Ore washing plant in ore washer mode")
+ .getInt(pollutionPerSecondMultiIndustrialWashPlant_ModeWasher);
+ pollutionPerSecondMultiIndustrialWireMill = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialWireMill",
+ pollutionPerSecondMultiIndustrialWireMill,
+ "pollution rate in gibbl/s for the Wire factory")
+ .getInt(pollutionPerSecondMultiIndustrialWireMill);
+ pollutionPerSecondMultiIsaMill = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIsaMill",
+ pollutionPerSecondMultiIsaMill,
+ "pollution rate in gibbl/s for the IsaMill grinding machine")
+ .getInt(pollutionPerSecondMultiIsaMill);
+ pollutionPerSecondMultiAdvDistillationTower_ModeDistillery = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiAdvDistillationTower_ModeDistillery",
+ pollutionPerSecondMultiAdvDistillationTower_ModeDistillery,
+ "pollution rate in gibbl/s for the Dangote distillus in distillery mode")
+ .getInt(pollutionPerSecondMultiAdvDistillationTower_ModeDistillery);
+ pollutionPerSecondMultiAdvDistillationTower_ModeDT = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiAdvDistillationTower_ModeDT",
+ pollutionPerSecondMultiAdvDistillationTower_ModeDT,
+ "pollution rate in gibbl/s for the Dangote distillus in distillation tower mode")
+ .getInt(pollutionPerSecondMultiAdvDistillationTower_ModeDT);
+ pollutionPerSecondMultiAdvEBF = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiAdvEBF",
+ pollutionPerSecondMultiAdvEBF,
+ "pollution rate in gibbl/s for the Volcanus")
+ .getInt(pollutionPerSecondMultiAdvEBF);
+ pollutionPerSecondMultiAdvImplosion = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiAdvImplosion",
+ pollutionPerSecondMultiAdvImplosion,
+ "pollution rate in gibbl/s for the Density^2")
+ .getInt(pollutionPerSecondMultiAdvImplosion);
+ pollutionPerSecondMultiABS = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiABS",
+ pollutionPerSecondMultiABS,
+ "pollution rate in gibbl/s for the Alloy blast furnace")
+ .getInt(pollutionPerSecondMultiABS);
+ pollutionPerSecondMultiCyclotron = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiCyclotron",
+ pollutionPerSecondMultiCyclotron,
+ "pollution rate in gibbl/s for the Cyclotron")
+ .getInt(pollutionPerSecondMultiCyclotron);
+ pollutionPerSecondMultiIndustrialFishingPond = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialFishingPond",
+ pollutionPerSecondMultiIndustrialFishingPond,
+ "pollution rate in gibbl/s for the Zuhai - fishing port")
+ .getInt(pollutionPerSecondMultiIndustrialFishingPond);
+ // pollutionPerSecondMultiLargeRocketEngine;
+ pollutionPerSecondMultiLargeSemiFluidGenerator = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiLargeSemiFluidGenerator",
+ pollutionPerSecondMultiLargeSemiFluidGenerator,
+ "pollution rate in gibbl/s for the Large semifluid burner")
+ .getInt(pollutionPerSecondMultiLargeSemiFluidGenerator);
+ pollutionPerSecondMultiMassFabricator = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiMassFabricator",
+ pollutionPerSecondMultiMassFabricator,
+ "pollution rate in gibbl/s for the Matter fabrication CPU")
+ .getInt(pollutionPerSecondMultiMassFabricator);
+ pollutionPerSecondMultiRefinery = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiRefinery",
+ pollutionPerSecondMultiRefinery,
+ "pollution rate in gibbl/s for the Reactor fuel processing plant")
+ .getInt(pollutionPerSecondMultiRefinery);
+ // pollutionPerSecondMultiGeneratorArray;
+ pollutionPerSecondMultiIndustrialRockBreaker = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialRockBreaker",
+ pollutionPerSecondMultiIndustrialRockBreaker,
+ "pollution rate in gibbl/s for the Industrial Rock Breaker")
+ .getInt(pollutionPerSecondMultiIndustrialRockBreaker);
+ pollutionPerSecondMultiIndustrialChisel = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiIndustrialChisel",
+ pollutionPerSecondMultiIndustrialChisel,
+ "pollution rate in gibbl/s for the Industrial Chisel")
+ .getInt(pollutionPerSecondMultiIndustrialChisel);
+ pollutionPerSecondMultiTreeFarm = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiTreeFarm",
+ pollutionPerSecondMultiTreeFarm,
+ "pollution rate in gibbl/s for the Tree growth simulator")
+ .getInt(pollutionPerSecondMultiTreeFarm);
+ pollutionPerSecondMultiFrothFlotationCell = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiFrothFlotationCell",
+ pollutionPerSecondMultiFrothFlotationCell,
+ "pollution rate in gibbl/s for the Flotation cell regulator")
+ .getInt(pollutionPerSecondMultiFrothFlotationCell);
+ pollutionPerSecondMultiAutoCrafter = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiAutoCrafter",
+ pollutionPerSecondMultiAutoCrafter,
+ "pollution rate in gibbl/s for the Large-Scale auto assembler v1.01")
+ .getInt(pollutionPerSecondMultiAutoCrafter);
+ pollutionPerSecondMultiMolecularTransformer = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiMolecularTransformer",
+ pollutionPerSecondMultiMolecularTransformer,
+ "pollution rate in gibbl/s for the Multiblock Molecular Transformer")
+ .getInt(pollutionPerSecondMultiMolecularTransformer);
+ pollutionPerSecondMultiThermalBoiler = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiThermalBoiler",
+ pollutionPerSecondMultiThermalBoiler,
+ "pollution rate in gibbl/s for the Thermal boiler")
+ .getInt(pollutionPerSecondMultiThermalBoiler);
+ pollutionPerSecondMultiAlgaePond = config
+ .get(
+ "pollution",
+ "pollutionPerSecondMultiAlgaePond",
+ pollutionPerSecondMultiAlgaePond,
+ "pollution rate in gibbl/s for the Algae farm")
+ .getInt(pollutionPerSecondMultiAlgaePond);
+ basePollutionPerSecondSemiFluidGenerator = config
+ .get(
+ "pollution",
+ "basePollutionPerSecondSemiFluidGenerator",
+ basePollutionPerSecondSemiFluidGenerator,
+ "base pollution rate in gibbl/s for the single block semi fluid generators")
+ .getInt(basePollutionPerSecondSemiFluidGenerator);
+ pollutionReleasedByTierSemiFluidGenerator = config.get(
+ "pollution",
+ "pollutionReleasedByTierSemiFluidGenerator",
+ pollutionReleasedByTierSemiFluidGenerator,
+ "coefficient applied to the base rate of the single block semi fluid generators based on its tier (first is tier 0 aka ULV)")
+ .getDoubleList();
+ basePollutionPerSecondBoiler = config
+ .get(
+ "pollution",
+ "basePollutionPerSecondBoiler",
+ basePollutionPerSecondBoiler,
+ "base pollution rate in gibbl/s for the single block boilers")
+ .getInt(basePollutionPerSecondBoiler);
+ pollutionReleasedByTierBoiler = config.get(
+ "pollution",
+ "pollutionReleasedByTierBoiler",
+ pollutionReleasedByTierBoiler,
+ "coefficient applied to the base rate of the single block semi fluid generators based on its tier (first is tier 0 aka ULV)")
+ .getDoubleList();
+ baseMinPollutionPerSecondRocketFuelGenerator = config
+ .get(
+ "pollution",
+ "baseMinPollutionPerSecondRocketFuelGenerator",
+ baseMinPollutionPerSecondRocketFuelGenerator,
+ "minimum base pollution rate in gibbl/s for the single block rocket engines")
+ .getInt(baseMinPollutionPerSecondRocketFuelGenerator);
+ baseMaxPollutionPerSecondRocketFuelGenerator = config
+ .get(
+ "pollution",
+ "baseMaxPollutionPerSecondRocketFuelGenerator",
+ baseMaxPollutionPerSecondRocketFuelGenerator,
+ "maximum base pollution rate in gibbl/s for the single block rocket engines")
+ .getInt(baseMaxPollutionPerSecondRocketFuelGenerator);
+ pollutionReleasedByTierRocketFuelGenerator = config.get(
+ "pollution",
+ "pollutionReleasedByTierRocketFuelGenerator",
+ pollutionReleasedByTierRocketFuelGenerator,
+ "coefficient applied to the base rate of the single block rocket engines based on its tier (first is tier 0 aka ULV)")
+ .getDoubleList();
+ basePollutionPerSecondGeothermalGenerator = config
+ .get(
+ "pollution",
+ "basePollutionPerSecondGeothermalGenerator",
+ basePollutionPerSecondGeothermalGenerator,
+ "base pollution rate in gibbl/s for the geothermal engines")
+ .getInt(basePollutionPerSecondGeothermalGenerator);
+ pollutionReleasedByTierGeothermalGenerator = config.get(
+ "pollution",
+ "pollutionReleasedByTierGeothermalGenerator",
+ pollutionReleasedByTierGeothermalGenerator,
+ "coefficient applied to the base rate of the single block geothermal engines based on its tier (first is tier 0 aka ULV)")
+ .getDoubleList();
+
+ // Visual
+ enableAnimatedTextures = config
+ .getBoolean("enableAnimatedTextures", "visual", true, "Enables Animated GT++ Textures, Requires Restart");
+ config.save();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/container/Container_CircuitProgrammer.java b/gtpp/src/main/java/gtPlusPlus/core/container/Container_CircuitProgrammer.java
new file mode 100644
index 0000000000..f1e84f439f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/container/Container_CircuitProgrammer.java
@@ -0,0 +1,176 @@
+package gtPlusPlus.core.container;
+
+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;
+import net.minecraft.world.World;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.InventoryCircuitProgrammer;
+import gtPlusPlus.core.slots.SlotIntegratedCircuit;
+import gtPlusPlus.core.slots.SlotNoInput;
+import gtPlusPlus.core.tileentities.general.TileEntityCircuitProgrammer;
+
+public class Container_CircuitProgrammer extends Container {
+
+ protected TileEntityCircuitProgrammer tile_entity;
+ public final InventoryCircuitProgrammer inventoryChest;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ public static final int SLOT_OUTPUT = 25;
+
+ public static int StorageSlotNumber = 26; // Number of slots in storage area
+ public static int InventorySlotNumber = 36; // Inventory Slots (Inventory
+ // and Hotbar)
+ public static int FullSlotNumber = InventorySlotNumber + StorageSlotNumber; // All
+ // slots
+
+ public Container_CircuitProgrammer(final InventoryPlayer inventory, final TileEntityCircuitProgrammer te) {
+ this.tile_entity = te;
+ this.inventoryChest = te.getInventory();
+
+ int var6;
+ int var7;
+ this.worldObj = te.getWorldObj();
+ this.posX = te.xCoord;
+ this.posY = te.yCoord;
+ this.posZ = te.zCoord;
+ Logger.INFO("1");
+
+ int o = 0;
+
+ // Storage Side
+ /*
+ * for (var6 = 0; var6 < 3; var6++) { for (var7 = 0; var7 < 5; var7++) { this.addSlotToContainer(new
+ * SlotIntegratedCircuit(o, this.inventoryChest, o, 44 + (var7 * 18), 15 + (var6 * 18))); o++; } }
+ */
+
+ int xStart = 8;
+ int yStart = 5;
+
+ try {
+ // 0
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart, yStart));
+ // 1-10
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 18, yStart));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 36, yStart));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 54, yStart));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 72, yStart));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 90, yStart));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 108, yStart));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 18, yStart + 18));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 36, yStart + 18));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 54, yStart + 18));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 72, yStart + 18));
+ // 11-20
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 90, yStart + 18));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 108, yStart + 18));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 18, yStart + 36));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 36, yStart + 36));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 54, yStart + 36));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 72, yStart + 36));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 90, yStart + 36));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 108, yStart + 36));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 18, yStart + 54));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 36, yStart + 54));
+ // 21-24
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 54, yStart + 54));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 72, yStart + 54));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 90, yStart + 54));
+ this.addSlotToContainer(new SlotIntegratedCircuit(this.inventoryChest, o++, xStart + 108, yStart + 54));
+ Logger.INFO("2");
+
+ // Add Output
+ this.addSlotToContainer(new SlotNoInput(this.inventoryChest, SLOT_OUTPUT, xStart + (8 * 18), yStart + 54));
+ o++;
+ Logger.INFO("3");
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(
+ new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+
+ Logger.INFO("4");
+ } catch (Throwable t) {}
+ }
+
+ @Override
+ public ItemStack slotClick(final int aSlotIndex, final int aMouseclick, final int aShifthold,
+ final EntityPlayer aPlayer) {
+
+ if (!aPlayer.worldObj.isRemote) {
+ if ((aSlotIndex == 999) || (aSlotIndex == -999)) {
+ // Utils.LOG_WARNING("??? - "+aSlotIndex);
+ }
+ }
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ }
+
+ @Override
+ public void onContainerClosed(final EntityPlayer par1EntityPlayer) {
+ super.onContainerClosed(par1EntityPlayer);
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockCircuitProgrammer) {
+ return false;
+ }
+
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+ ItemStack var3 = null;
+ final Slot var4 = (Slot) this.inventorySlots.get(par2);
+
+ if ((var4 != null) && var4.getHasStack()) {
+ final ItemStack var5 = var4.getStack();
+ var3 = var5.copy();
+
+ /*
+ * if (par2 == 0) { if (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null;
+ * } var4.onSlotChange(var5, var3); } else if (par2 >= InOutputSlotNumber && par2 < InventoryOutSlotNumber)
+ * { if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else
+ * if (par2 >= InventoryOutSlotNumber && par2 < FullSlotNumber) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, false)) { return null; }
+ */
+
+ if (var5.stackSize == 0) {
+ var4.putStack((ItemStack) null);
+ } else {
+ var4.onSlotChanged();
+ }
+
+ if (var5.stackSize == var3.stackSize) {
+ return null;
+ }
+
+ var4.onPickupFromSlot(par1EntityPlayer, var5);
+ }
+
+ return var3;
+ }
+
+ // Can merge Slot
+ @Override
+ public boolean func_94530_a(final ItemStack p_94530_1_, final Slot p_94530_2_) {
+ return super.func_94530_a(p_94530_1_, p_94530_2_);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/container/Container_DecayablesChest.java b/gtpp/src/main/java/gtPlusPlus/core/container/Container_DecayablesChest.java
new file mode 100644
index 0000000000..d8bab9395a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/container/Container_DecayablesChest.java
@@ -0,0 +1,133 @@
+package gtPlusPlus.core.container;
+
+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;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.Inventory_DecayablesChest;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+
+public class Container_DecayablesChest extends Container {
+
+ protected TileEntityDecayablesChest tile_entity;
+ public final Inventory_DecayablesChest inventoryChest;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ public static int StorageSlotNumber = 15; // Number of slots in storage area
+ public static int InventorySlotNumber = 36; // Inventory Slots (Inventory
+ // and Hotbar)
+ public static int FullSlotNumber = InventorySlotNumber + StorageSlotNumber; // All
+ // slots
+
+ private final int[] slotStorage = new int[15];
+
+ public Container_DecayablesChest(final InventoryPlayer inventory, final TileEntityDecayablesChest te) {
+ this.tile_entity = te;
+ this.inventoryChest = te.getInventory();
+ te.openInventory();
+
+ int var6;
+ int var7;
+ this.worldObj = te.getWorldObj();
+ this.posX = te.xCoord;
+ this.posY = te.yCoord;
+ this.posZ = te.zCoord;
+
+ int o = 0;
+
+ // Storage Side
+ for (var6 = 0; var6 < 3; var6++) {
+ for (var7 = 0; var7 < 5; var7++) {
+ this.slotStorage[o] = o;
+ this.addSlotToContainer(new Slot(this.inventoryChest, o++, 44 + (var7 * 18), 15 + (var6 * 18)));
+ }
+ }
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+ }
+
+ @Override
+ public ItemStack slotClick(final int aSlotIndex, final int aMouseclick, final int aShifthold,
+ final EntityPlayer aPlayer) {
+
+ if (!aPlayer.worldObj.isRemote) {
+ if ((aSlotIndex == 999) || (aSlotIndex == -999)) {
+ // Utils.LOG_WARNING("??? - "+aSlotIndex);
+ }
+ }
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ }
+
+ @Override
+ public void onContainerClosed(final EntityPlayer par1EntityPlayer) {
+ super.onContainerClosed(par1EntityPlayer);
+ tile_entity.closeInventory();
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockDecayablesChest) {
+ return false;
+ }
+
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+ ItemStack var3 = null;
+ final Slot var4 = (Slot) this.inventorySlots.get(par2);
+
+ if ((var4 != null) && var4.getHasStack()) {
+ final ItemStack var5 = var4.getStack();
+ var3 = var5.copy();
+
+ /*
+ * if (par2 == 0) { if (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null;
+ * } var4.onSlotChange(var5, var3); } else if (par2 >= InOutputSlotNumber && par2 < InventoryOutSlotNumber)
+ * { if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else
+ * if (par2 >= InventoryOutSlotNumber && par2 < FullSlotNumber) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, false)) { return null; }
+ */
+
+ if (var5.stackSize == 0) {
+ var4.putStack((ItemStack) null);
+ } else {
+ var4.onSlotChanged();
+ }
+
+ if (var5.stackSize == var3.stackSize) {
+ return null;
+ }
+
+ var4.onPickupFromSlot(par1EntityPlayer, var5);
+ }
+
+ return var3;
+ }
+
+ // Can merge Slot
+ @Override
+ public boolean func_94530_a(final ItemStack p_94530_1_, final Slot p_94530_2_) {
+ return super.func_94530_a(p_94530_1_, p_94530_2_);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/container/Container_FishTrap.java b/gtpp/src/main/java/gtPlusPlus/core/container/Container_FishTrap.java
new file mode 100644
index 0000000000..881311897f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/container/Container_FishTrap.java
@@ -0,0 +1,134 @@
+package gtPlusPlus.core.container;
+
+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;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.InventoryFishTrap;
+import gtPlusPlus.core.slots.SlotNoInput;
+import gtPlusPlus.core.tileentities.general.TileEntityFishTrap;
+
+public class Container_FishTrap extends Container {
+
+ protected TileEntityFishTrap tile_entity;
+ public final InventoryFishTrap inventoryChest;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ public static int StorageSlotNumber = 15; // Number of slots in storage area
+ public static int InventorySlotNumber = 36; // Inventory Slots (Inventory
+ // and Hotbar)
+ public static int FullSlotNumber = InventorySlotNumber + StorageSlotNumber; // All
+ // slots
+
+ private final int[] slotStorage = new int[15];
+
+ public Container_FishTrap(final InventoryPlayer inventory, final TileEntityFishTrap te) {
+ this.tile_entity = te;
+ this.inventoryChest = te.getInventory();
+
+ te.openInventory();
+ int var6;
+ int var7;
+ this.worldObj = te.getWorldObj();
+ this.posX = te.xCoord;
+ this.posY = te.yCoord;
+ this.posZ = te.zCoord;
+
+ int o = 0;
+
+ // Storage Side
+ for (var6 = 0; var6 < 3; var6++) {
+ for (var7 = 0; var7 < 5; var7++) {
+ this.slotStorage[o] = o;
+ this.addSlotToContainer(new SlotNoInput(this.inventoryChest, o++, 44 + (var7 * 18), 15 + (var6 * 18)));
+ }
+ }
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+ }
+
+ @Override
+ public ItemStack slotClick(final int aSlotIndex, final int aMouseclick, final int aShifthold,
+ final EntityPlayer aPlayer) {
+
+ if (!aPlayer.worldObj.isRemote) {
+ if ((aSlotIndex == 999) || (aSlotIndex == -999)) {
+ // Utils.LOG_WARNING("??? - "+aSlotIndex);
+ }
+ }
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ }
+
+ @Override
+ public void onContainerClosed(final EntityPlayer par1EntityPlayer) {
+ super.onContainerClosed(par1EntityPlayer);
+ tile_entity.closeInventory();
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockFishTrap) {
+ return false;
+ }
+
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+ ItemStack var3 = null;
+ final Slot var4 = (Slot) this.inventorySlots.get(par2);
+
+ if ((var4 != null) && var4.getHasStack()) {
+ final ItemStack var5 = var4.getStack();
+ var3 = var5.copy();
+
+ /*
+ * if (par2 == 0) { if (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null;
+ * } var4.onSlotChange(var5, var3); } else if (par2 >= InOutputSlotNumber && par2 < InventoryOutSlotNumber)
+ * { if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else
+ * if (par2 >= InventoryOutSlotNumber && par2 < FullSlotNumber) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, false)) { return null; }
+ */
+
+ if (var5.stackSize == 0) {
+ var4.putStack((ItemStack) null);
+ } else {
+ var4.onSlotChanged();
+ }
+
+ if (var5.stackSize == var3.stackSize) {
+ return null;
+ }
+
+ var4.onPickupFromSlot(par1EntityPlayer, var5);
+ }
+
+ return var3;
+ }
+
+ // Can merge Slot
+ @Override
+ public boolean func_94530_a(final ItemStack p_94530_1_, final Slot p_94530_2_) {
+ return super.func_94530_a(p_94530_1_, p_94530_2_);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/container/Container_PestKiller.java b/gtpp/src/main/java/gtPlusPlus/core/container/Container_PestKiller.java
new file mode 100644
index 0000000000..d6afa0d68f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/container/Container_PestKiller.java
@@ -0,0 +1,147 @@
+package gtPlusPlus.core.container;
+
+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;
+import net.minecraft.world.World;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.gui.GT_Slot_Render;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.InventoryPestKiller;
+import gtPlusPlus.core.slots.SlotGeneric;
+import gtPlusPlus.core.slots.SlotNoInput;
+import gtPlusPlus.core.tileentities.machines.TileEntityPestKiller;
+
+public class Container_PestKiller extends Container {
+
+ public TileEntityPestKiller tile_entity;
+ public final InventoryPestKiller inventoryChest;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ public static int StorageSlotNumber = 3; // Number of slots in storage area
+ public static int InventorySlotNumber = 36; // Inventory Slots (Inventory
+ // and Hotbar)
+ public static int FullSlotNumber = InventorySlotNumber + StorageSlotNumber; // All
+ // slots
+
+ public Container_PestKiller(final InventoryPlayer inventory, final TileEntityPestKiller te) {
+ this.tile_entity = te;
+ this.inventoryChest = te.getInventory();
+ te.openInventory();
+ int var6;
+ int var7;
+ this.worldObj = te.getWorldObj();
+ this.posX = te.xCoord;
+ this.posY = te.yCoord;
+ this.posZ = te.zCoord;
+ int o = 0;
+
+ int aSlotX = 134;
+
+ this.addSlotToContainer(new SlotGeneric(this.inventoryChest, o++, aSlotX, 10));
+ this.addSlotToContainer(new SlotNoInput(this.inventoryChest, o++, aSlotX, 60));
+ addSlotToContainer(new GT_Slot_Render(tile_entity, o++, aSlotX, 35));
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+ }
+
+ public FluidStack getFluidOfStoredTank() {
+ if (tile_entity != null) {
+ if (tile_entity.getTank() != null) {
+ return tile_entity.getTank()
+ .getFluid();
+ }
+ }
+ return null;
+ }
+
+ public int getFluidStoredAmount() {
+ FluidStack f = getFluidOfStoredTank();
+ return f == null ? 0 : f.amount;
+ }
+
+ @Override
+ public ItemStack slotClick(final int aSlotIndex, final int aMouseclick, final int aShifthold,
+ final EntityPlayer aPlayer) {
+ boolean fluid = false;
+ if (aSlotIndex == 2) {
+ fluid = true;
+ }
+ if (!fluid) {
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public void onContainerClosed(final EntityPlayer par1EntityPlayer) {
+ super.onContainerClosed(par1EntityPlayer);
+ tile_entity.closeInventory();
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockPestKiller) {
+ return false;
+ }
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+ ItemStack var3 = null;
+ final Slot var4 = (Slot) this.inventorySlots.get(par2);
+
+ if ((var4 != null) && var4.getHasStack()) {
+ final ItemStack var5 = var4.getStack();
+ var3 = var5.copy();
+
+ /*
+ * if (par2 == 0) { if (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null;
+ * } var4.onSlotChange(var5, var3); } else if (par2 >= InOutputSlotNumber && par2 < InventoryOutSlotNumber)
+ * { if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else
+ * if (par2 >= InventoryOutSlotNumber && par2 < FullSlotNumber) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, false)) { return null; }
+ */
+
+ if (var5.stackSize == 0) {
+ var4.putStack((ItemStack) null);
+ } else {
+ var4.onSlotChanged();
+ }
+
+ if (var5.stackSize == var3.stackSize) {
+ return null;
+ }
+
+ var4.onPickupFromSlot(par1EntityPlayer, var5);
+ }
+
+ return var3;
+ }
+
+ // Can merge Slot
+ @Override
+ public boolean func_94530_a(final ItemStack p_94530_1_, final Slot p_94530_2_) {
+ return super.func_94530_a(p_94530_1_, p_94530_2_);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/container/Container_ProjectTable.java b/gtpp/src/main/java/gtPlusPlus/core/container/Container_ProjectTable.java
new file mode 100644
index 0000000000..1702be19ab
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/container/Container_ProjectTable.java
@@ -0,0 +1,196 @@
+package gtPlusPlus.core.container;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.InventoryCraftResult;
+import net.minecraft.inventory.InventoryCrafting;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
+import net.minecraft.world.World;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.projecttable.InventoryProjectMain;
+import gtPlusPlus.core.inventories.projecttable.InventoryProjectOutput;
+import gtPlusPlus.core.slots.SlotCraftingNoCollect;
+import gtPlusPlus.core.slots.SlotDataStick;
+import gtPlusPlus.core.slots.SlotNoInput;
+import gtPlusPlus.core.tileentities.machines.TileEntityProjectTable;
+
+public class Container_ProjectTable extends Container {
+
+ /** The crafting matrix inventory (3x3). */
+ public InventoryCrafting craftMatrix = new InventoryCrafting(this, 3, 3);
+
+ public IInventory craftResult = new InventoryCraftResult();
+
+ protected TileEntityProjectTable tile_entity;
+ public final InventoryProjectMain inventoryGrid;
+ public final InventoryProjectOutput inventoryOutputs;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ private final int[] slotOutputs = new int[2];
+ private final int[] slotGrid = new int[9];
+
+ public Container_ProjectTable(final InventoryPlayer inventory, final TileEntityProjectTable tile) {
+ this.tile_entity = tile;
+ this.inventoryGrid = tile.inventoryGrid;
+ this.inventoryOutputs = tile.inventoryOutputs;
+ this.tile_entity.setContainer(this);
+
+ int var6;
+ int var7;
+ this.worldObj = tile.getWorldObj();
+ this.posX = tile.xCoord;
+ this.posY = tile.yCoord;
+ this.posZ = tile.zCoord;
+
+ int nextFreeSlot = 0;
+
+ // Output slots
+ this.addSlotToContainer(new SlotDataStick(this.inventoryOutputs, 0, 26 + (18 * 6), 8));
+ this.addSlotToContainer(new SlotNoInput(this.inventoryOutputs, 1, 26 + (18 * 6), 44));
+
+ this.addSlotToContainer(
+ new SlotCraftingNoCollect(inventory.player, this.craftMatrix, this.craftResult, 0, 26 + (18 * 4), 25));
+
+ int o = 0;
+ // Storage Side
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 3; ++var7) {
+ this.addSlotToContainer(
+ new Slot(this.craftMatrix, nextFreeSlot, 8 + 18 + (var7 * 18), 8 + (var6 * 18)));
+ this.slotGrid[o] = nextFreeSlot;
+ nextFreeSlot++;
+ o++;
+ }
+ }
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+
+ this.onCraftMatrixChanged(this.craftMatrix);
+ }
+
+ /**
+ * Callback for when the crafting matrix is changed.
+ */
+ @Override
+ public void onCraftMatrixChanged(IInventory p_75130_1_) {
+ this.craftResult.setInventorySlotContents(
+ 0,
+ CraftingManager.getInstance()
+ .findMatchingRecipe(this.craftMatrix, this.worldObj));
+ }
+
+ /**
+ * Called when the container is closed.
+ */
+ @Override
+ public void onContainerClosed(EntityPlayer p_75134_1_) {
+ super.onContainerClosed(p_75134_1_);
+ if (!this.worldObj.isRemote) {
+ for (int i = 0; i < 9; ++i) {
+ ItemStack itemstack = this.craftMatrix.getStackInSlotOnClosing(i);
+ if (itemstack != null) {
+ p_75134_1_.dropPlayerItemWithRandomChoice(itemstack, false);
+ }
+ }
+ }
+ }
+
+ @Override
+ public ItemStack slotClick(final int aSlotIndex, final int aMouseclick, final int aShifthold,
+ final EntityPlayer aPlayer) {
+
+ if (!aPlayer.worldObj.isRemote) {
+ if ((aSlotIndex == 999) || (aSlotIndex == -999)) {
+ // Utils.LOG_WARNING("??? - "+aSlotIndex);
+ }
+
+ if (aSlotIndex == 0) {
+ Logger.INFO("Player Clicked on the Data Stick slot");
+ // TODO
+ }
+ if (aSlotIndex == 1) {
+ Logger.INFO("Player Clicked on the output slot");
+ // TODO
+ }
+
+ for (final int x : this.slotGrid) {
+ if (aSlotIndex == x) {
+ Logger.INFO("Player Clicked slot " + aSlotIndex + " in the crafting Grid");
+ }
+ }
+ }
+ // Utils.LOG_WARNING("Player Clicked slot "+aSlotIndex+" in the Grid");
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockProjectTable) {
+ return false;
+ }
+
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+
+ return null;
+
+ /*
+ * ItemStack var3 = null; final Slot var4 = (Slot)this.inventorySlots.get(par2); if ((var4 != null) &&
+ * var4.getHasStack()) { final ItemStack var5 = var4.getStack(); var3 = var5.copy(); if (par2 == 0) { if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null; }
+ * var4.onSlotChange(var5, var3); } else if ((par2 >= InOutputSlotNumber) && (par2 < InventoryOutSlotNumber)) {
+ * if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else if
+ * ((par2 >= InventoryOutSlotNumber) && (par2 < FullSlotNumber)) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, FullSlotNumber, false)) { return null; } if (var5.stackSize == 0) {
+ * var4.putStack((ItemStack)null); } else { var4.onSlotChanged(); } if (var5.stackSize == var3.stackSize) {
+ * return null; } var4.onPickupFromSlot(par1EntityPlayer, var5); } return var3;
+ */
+ }
+
+ // Can merge Slot
+ @Override
+ public boolean func_94530_a(ItemStack p_94530_1_, Slot p_94530_2_) {
+ return p_94530_2_.inventory != this.craftResult && super.func_94530_a(p_94530_1_, p_94530_2_);
+ }
+
+ public ItemStack getOutputContent() {
+ ItemStack output = this.craftResult.getStackInSlot(0);
+ if (output != null) {
+ return output;
+ }
+ return null;
+ }
+
+ public ItemStack[] getInputComponents() {
+ ItemStack inputs[] = new ItemStack[9];
+ for (int r = 0; r < this.craftMatrix.getSizeInventory(); r++) {
+ ItemStack temp = this.craftMatrix.getStackInSlot(r);
+ inputs[r] = temp;
+ }
+ return inputs;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/container/Container_SuperJukebox.java b/gtpp/src/main/java/gtPlusPlus/core/container/Container_SuperJukebox.java
new file mode 100644
index 0000000000..ab7525c897
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/container/Container_SuperJukebox.java
@@ -0,0 +1,232 @@
+package gtPlusPlus.core.container;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.ICrafting;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.block.machine.Machine_SuperJukebox.TileEntitySuperJukebox;
+import gtPlusPlus.core.inventories.Inventory_SuperJukebox;
+import gtPlusPlus.core.slots.SlotJukebox;
+import gtPlusPlus.core.slots.SlotNoInput;
+
+public class Container_SuperJukebox extends Container {
+
+ protected TileEntitySuperJukebox tile_entity;
+ public final Inventory_SuperJukebox inventoryChest;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ public static final int SLOT_HOLO_PLAY = 18;
+ public static final int SLOT_HOLO_LOOP = 19;
+ public static final int SLOT_OUTPUT = 20;
+
+ public static int StorageSlotNumber = 26; // Number of slots in storage area
+ public static int InventorySlotNumber = 36; // Inventory Slots (Inventory
+ // and Hotbar)
+ public static int FullSlotNumber = InventorySlotNumber + StorageSlotNumber; // All
+ // slots
+
+ public Container_SuperJukebox(final InventoryPlayer inventory, final TileEntitySuperJukebox te) {
+ this.tile_entity = te;
+ this.inventoryChest = te.getInventory();
+
+ int var6;
+ int var7;
+ this.worldObj = te.getWorldObj();
+ this.posX = te.xCoord;
+ this.posY = te.yCoord;
+ this.posZ = te.zCoord;
+ Logger.INFO("1");
+
+ int o = 0;
+
+ // Storage Side
+ /*
+ * for (var6 = 0; var6 < 3; var6++) { for (var7 = 0; var7 < 5; var7++) { this.addSlotToContainer(new
+ * SlotIntegratedCircuit(o, this.inventoryChest, o, 44 + (var7 * 18), 15 + (var6 * 18))); o++; } }
+ */
+
+ int xStart = 9;
+ int yStart = 20;
+
+ try {
+
+ // Row One
+ for (int c = 0; c < 9; c++) {
+ if (c >= 3 && c < 6) {
+ continue;
+ }
+ this.addSlotToContainer(new SlotJukebox(this.inventoryChest, o++, xStart + (18 * c), yStart));
+ }
+
+ // Row Two
+ for (int c = 0; c < 9; c++) {
+ if (c >= 3 && c < 6) {
+ continue;
+ }
+ this.addSlotToContainer(new SlotJukebox(this.inventoryChest, o++, xStart + (18 * c), yStart + 18));
+ }
+
+ // Row Two
+ for (int c = 0; c < 9; c++) {
+ if (c >= 3 && c < 6) {
+ continue;
+ }
+ this.addSlotToContainer(new SlotJukebox(this.inventoryChest, o++, xStart + (18 * c), yStart + 36));
+ }
+
+ // Controls
+ int c = 4;
+
+ // Two Control Buttons
+ this.addSlotToContainer(new SlotNoInput(this.inventoryChest, SLOT_HOLO_PLAY, xStart + (18 * c), 12));
+ this.addSlotToContainer(
+ new SlotNoInput(this.inventoryChest, SLOT_HOLO_LOOP, xStart + (18 * c), 12 + (1 * 18)));
+
+ // Active playing slot for visual
+ this.addSlotToContainer(
+ new SlotJukebox(this.inventoryChest, SLOT_OUTPUT, xStart + (18 * c), 18 + (2 * 18), true));
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(
+ new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+
+ Logger.INFO("3");
+
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ @Override
+ public void onContainerClosed(final EntityPlayer par1EntityPlayer) {
+ super.onContainerClosed(par1EntityPlayer);
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockCustomJukebox) {
+ return false;
+ }
+
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+ ItemStack var3 = null;
+ final Slot var4 = (Slot) this.inventorySlots.get(par2);
+
+ if ((var4 != null) && var4.getHasStack()) {
+ final ItemStack var5 = var4.getStack();
+ var3 = var5.copy();
+
+ /*
+ * if (par2 == 0) { if (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null;
+ * } var4.onSlotChange(var5, var3); } else if (par2 >= InOutputSlotNumber && par2 < InventoryOutSlotNumber)
+ * { if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else
+ * if (par2 >= InventoryOutSlotNumber && par2 < FullSlotNumber) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, false)) { return null; }
+ */
+
+ if (var5.stackSize == 0) {
+ var4.putStack((ItemStack) null);
+ } else {
+ var4.onSlotChanged();
+ }
+
+ if (var5.stackSize == var3.stackSize) {
+ return null;
+ }
+
+ var4.onPickupFromSlot(par1EntityPlayer, var5);
+ }
+
+ return var3;
+ }
+
+ // Can merge Slot
+ @Override
+ public boolean func_94530_a(final ItemStack p_94530_1_, final Slot p_94530_2_) {
+ return super.func_94530_a(p_94530_1_, p_94530_2_);
+ }
+
+ @Override
+ public ItemStack slotClick(int aSlotIndex, int aMouseclick, int aShifthold, EntityPlayer aPlayer) {
+ if (tile_entity == null || tile_entity.getWorldObj().isRemote) return null;
+ switch (aSlotIndex) {
+ case SLOT_HOLO_PLAY -> {
+ if (tile_entity == null) return null;
+ tile_entity.mIsPlaying = !tile_entity.mIsPlaying;
+ Logger.INFO("Jukebox | Playing: " + tile_entity.mIsPlaying);
+ tile_entity.jukeboxLogicUpdate();
+ return null;
+ }
+ case SLOT_HOLO_LOOP -> {
+ if (tile_entity == null) return null;
+ tile_entity.mIsLooping = !tile_entity.mIsLooping;
+ Logger.INFO("Jukebox | Looping: " + tile_entity.mIsLooping);
+ return null;
+ }
+ case 20 -> {
+ return null;
+ }
+ default -> {
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ }
+ }
+ }
+
+ public boolean isPlaying;
+ public boolean isLooping;
+
+ @Override
+ public void detectAndSendChanges() {
+ super.detectAndSendChanges();
+ if (tile_entity == null || tile_entity.getWorldObj().isRemote) return;
+
+ isPlaying = tile_entity.mIsPlaying;
+ isLooping = tile_entity.mIsLooping;
+
+ for (Object crafter : this.crafters) {
+ ICrafting var1 = (ICrafting) crafter;
+ var1.sendProgressBarUpdate(this, 102, isPlaying ? 1 : 0);
+ var1.sendProgressBarUpdate(this, 103, isLooping ? 1 : 0);
+ }
+ }
+
+ @Override
+ public void addCraftingToCrafters(ICrafting par1ICrafting) {
+ super.addCraftingToCrafters(par1ICrafting);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void updateProgressBar(int par1, int par2) {
+ super.updateProgressBar(par1, par2);
+ switch (par1) {
+ case 102 -> isPlaying = (par2 != 0);
+ case 103 -> isLooping = (par2 != 0);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/container/Container_VolumetricFlaskSetter.java b/gtpp/src/main/java/gtPlusPlus/core/container/Container_VolumetricFlaskSetter.java
new file mode 100644
index 0000000000..0315967263
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/container/Container_VolumetricFlaskSetter.java
@@ -0,0 +1,170 @@
+package gtPlusPlus.core.container;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.ICrafting;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.Inventory_VolumetricFlaskSetter;
+import gtPlusPlus.core.slots.SlotNoInput;
+import gtPlusPlus.core.slots.SlotVolumetricFlask;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+import gtPlusPlus.core.util.Utils;
+
+public class Container_VolumetricFlaskSetter extends Container {
+
+ public TileEntityVolumetricFlaskSetter mTileEntity;
+ public final Inventory_VolumetricFlaskSetter inventoryChest;
+
+ public int mCustomValue;
+ private int oCustomValue;
+ private int mTimer;
+
+ private final World worldObj;
+ private final int posX;
+ private final int posY;
+ private final int posZ;
+
+ public static final int SLOT_OUTPUT = 8;
+
+ public static int StorageSlotNumber = 8; // Number of slots in storage area
+ public static int InventorySlotNumber = 36; // Inventory Slots (Inventory
+ // and Hotbar)
+ public static int FullSlotNumber = InventorySlotNumber + StorageSlotNumber; // All
+ // slots
+
+ public Container_VolumetricFlaskSetter(final InventoryPlayer inventory, final TileEntityVolumetricFlaskSetter te) {
+ this.mTileEntity = te;
+ this.inventoryChest = te.getInventory();
+
+ int var6;
+ int var7;
+ this.worldObj = te.getWorldObj();
+ this.posX = te.xCoord;
+ this.posY = te.yCoord;
+ this.posZ = te.zCoord;
+ // mCustomValue = te.getCustomValue();
+
+ int o = 0;
+
+ // Storage Side
+ /*
+ * for (var6 = 0; var6 < 3; var6++) { for (var7 = 0; var7 < 5; var7++) { this.addSlotToContainer(new
+ * SlotIntegratedCircuit(o, this.inventoryChest, o, 44 + (var7 * 18), 15 + (var6 * 18))); o++; } }
+ */
+
+ int xStart = 26;
+ int yStart = 12;
+
+ try {
+ // 0
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart += 18, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart += 18, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart += 18, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart += 18, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart += 18, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart += 18, yStart));
+ this.addSlotToContainer(new SlotVolumetricFlask(this.inventoryChest, o++, xStart, yStart + 18));
+
+ // Add Output
+ this.addSlotToContainer(new SlotNoInput(this.inventoryChest, o++, 8 + (8 * 18), 59));
+ o++;
+
+ // Player Inventory
+ for (var6 = 0; var6 < 3; ++var6) {
+ for (var7 = 0; var7 < 9; ++var7) {
+ this.addSlotToContainer(
+ new Slot(inventory, var7 + (var6 * 9) + 9, 8 + (var7 * 18), 84 + (var6 * 18)));
+ }
+ }
+ // Player Hotbar
+ for (var6 = 0; var6 < 9; ++var6) {
+ this.addSlotToContainer(new Slot(inventory, var6, 8 + (var6 * 18), 142));
+ }
+ detectAndSendChanges();
+ } catch (Throwable t) {}
+ }
+
+ @Override
+ public boolean canInteractWith(final EntityPlayer par1EntityPlayer) {
+ if (this.worldObj.getBlock(this.posX, this.posY, this.posZ) != ModBlocks.blockVolumetricFlaskSetter) {
+ return false;
+ }
+ return par1EntityPlayer.getDistanceSq(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D) <= 64D;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(final EntityPlayer par1EntityPlayer, final int par2) {
+ ItemStack var3 = null;
+ final Slot var4 = (Slot) this.inventorySlots.get(par2);
+
+ if ((var4 != null) && var4.getHasStack()) {
+ final ItemStack var5 = var4.getStack();
+ var3 = var5.copy();
+
+ /*
+ * if (par2 == 0) { if (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, true)) { return null;
+ * } var4.onSlotChange(var5, var3); } else if (par2 >= InOutputSlotNumber && par2 < InventoryOutSlotNumber)
+ * { if (!this.mergeItemStack(var5, InventoryOutSlotNumber, FullSlotNumber, false)) { return null; } } else
+ * if (par2 >= InventoryOutSlotNumber && par2 < FullSlotNumber) { if (!this.mergeItemStack(var5,
+ * InOutputSlotNumber, InventoryOutSlotNumber, false)) { return null; } } else if
+ * (!this.mergeItemStack(var5, InOutputSlotNumber, FullSlotNumber, false)) { return null; }
+ */
+
+ if (var5.stackSize == 0) {
+ var4.putStack((ItemStack) null);
+ } else {
+ var4.onSlotChanged();
+ }
+
+ if (var5.stackSize == var3.stackSize) {
+ return null;
+ }
+
+ var4.onPickupFromSlot(par1EntityPlayer, var5);
+ }
+
+ return var3;
+ }
+
+ @Override
+ public void detectAndSendChanges() {
+ super.detectAndSendChanges();
+ if ((Utils.isClient()) || (this.mTileEntity == null)) {
+ return;
+ }
+
+ mCustomValue = mTileEntity.getCustomValue();
+ mTimer++;
+
+ for (Object crafter : this.crafters) {
+ ICrafting var1 = (ICrafting) crafter;
+ if (mTimer % 20 == 10 || oCustomValue != mCustomValue) {
+ var1.sendProgressBarUpdate(this, 0, mCustomValue);
+ }
+ }
+
+ oCustomValue = mCustomValue;
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void updateProgressBar(int par1, int par2) {
+ super.updateProgressBar(par1, par2);
+ switch (par1) {
+ case 0 -> mCustomValue = (short) par2;
+ }
+ }
+
+ public void log(String aString) {
+ Logger.INFO("[Flask-Container] " + aString);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/creative/AddToCreativeTab.java b/gtpp/src/main/java/gtPlusPlus/core/creative/AddToCreativeTab.java
new file mode 100644
index 0000000000..fa0d3844b2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/creative/AddToCreativeTab.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.core.creative;
+
+import net.minecraft.creativetab.CreativeTabs;
+
+import gregtech.api.util.GT_CreativeTab;
+
+public class AddToCreativeTab {
+
+ public static CreativeTabs tabBlock;
+ public static CreativeTabs tabMisc;
+ public static CreativeTabs tabTools;
+ public static CreativeTabs tabMachines;
+ public static CreativeTabs tabOther;
+ public static CreativeTabs tabBOP;
+
+ public static void initialiseTabs() {
+ // GT_CreativeTab
+ tabBlock = new GT_CreativeTab("GTPP_BLOCKS", "GT++ Blocks");
+ tabMisc = new GT_CreativeTab("GTPP_MISC", "GT++ Misc");
+ tabTools = new GT_CreativeTab("GTPP_TOOLS", "GT++ Tools");
+ tabMachines = new GT_CreativeTab("GTPP_MACHINES", "GT++ Machines");
+ tabOther = new GT_CreativeTab("GTPP_OTHER", "GT++ Other");
+ tabBOP = new GT_CreativeTab("GTPP_OTHER_2", "GT++ Other II");
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/entity/EntityPrimedMiningExplosive.java b/gtpp/src/main/java/gtPlusPlus/core/entity/EntityPrimedMiningExplosive.java
new file mode 100644
index 0000000000..99a86c447a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/entity/EntityPrimedMiningExplosive.java
@@ -0,0 +1,405 @@
+package gtPlusPlus.core.entity;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.item.EntityTNTPrimed;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.world.explosions.ExplosionHandler;
+
+public class EntityPrimedMiningExplosive extends EntityTNTPrimed {
+
+ /** How long the fuse is */
+ private EntityLivingBase tntPlacedBy;
+
+ public EntityPrimedMiningExplosive(final World world) {
+ super(world);
+ this.fuse = 160;
+ this.preventEntitySpawning = true;
+ this.setSize(0.98F, 0.98F);
+ this.yOffset = this.height / 2.0F;
+ }
+
+ public EntityPrimedMiningExplosive(final World world, final double x, final double y, final double z,
+ final EntityLivingBase placingEntity) {
+ this(world);
+ this.setPosition(x, y, z);
+ final float f = (float) (Math.random() * Math.PI * 2.0D);
+ this.motionX = -((float) Math.sin(f)) * 0.02F;
+ this.motionY = 0.20000000298023224D;
+ this.motionZ = -((float) Math.cos(f)) * 0.02F;
+ this.fuse = 160;
+ this.prevPosX = x;
+ this.prevPosY = y;
+ this.prevPosZ = z;
+ this.tntPlacedBy = placingEntity;
+ }
+
+ @Override
+ protected void entityInit() {}
+
+ /**
+ * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to
+ * prevent them from trampling crops
+ */
+ @Override
+ protected boolean canTriggerWalking() {
+ return false;
+ }
+
+ /**
+ * Returns true if other Entities should be prevented from moving through this Entity.
+ */
+ @Override
+ public boolean canBeCollidedWith() {
+ return !this.isDead;
+ }
+
+ /**
+ * Called to update the entity's position/logic.
+ */
+ @Override
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ this.motionY -= 0.03999999910593033D;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= 0.9800000190734863D;
+ this.motionY *= 0.9800000190734863D;
+ this.motionZ *= 0.9800000190734863D;
+
+ if (this.onGround) {
+ this.motionX *= 0.699999988079071D;
+ this.motionZ *= 0.699999988079071D;
+ this.motionY *= -0.5D;
+ }
+
+ if (this.fuse-- <= 0) {
+ this.setDead();
+
+ if (!this.worldObj.isRemote) {
+ this.explode();
+ }
+ } else {
+
+ int t = MathUtils.randInt(0, 15);
+
+ if (t <= 2) {
+ int e = MathUtils.randInt(0, 3);
+ if (e <= 1) {
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ } else if (e == 2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ } else if (t <= 4) {
+ int e = MathUtils.randInt(0, 5);
+ if (e <= 1) {
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ } else if (e == 2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ } else if (t <= 6) {
+ int e = MathUtils.randInt(0, 4);
+ if (e <= 1) {
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ } else if (e == 2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ } else if (t <= 8) {
+ int e = MathUtils.randInt(0, 1);
+ if (e <= 1) {
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ } else if (e == 2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ } else if (t <= 10) {
+ int e = MathUtils.randInt(0, 6);
+ if (e <= 1) {
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ } else if (e >= 2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(0, 1),
+ this.posY + MathUtils.randDouble(0, 1),
+ this.posZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ }
+ }
+ }
+
+ private void explode() {
+ final float f = 100.0F;
+
+ ExplosionHandler explode = new ExplosionHandler();
+ explode.createExplosion(this.worldObj, this, this.posX, this.posY, this.posZ, f, false, true);
+
+ /*
+ * this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, f, true);
+ * this.worldObj.createExplosion(this, this.posX+MathUtils.randDouble(-10, 10), this.posY,
+ * this.posZ+MathUtils.randDouble(-10, 10), f+MathUtils.randFloat(-5F, 5F), true);
+ * this.worldObj.createExplosion(this, this.posX+MathUtils.randDouble(-10, 10), this.posY,
+ * this.posZ+MathUtils.randDouble(-10, 10), f+MathUtils.randFloat(-5F, 5F), true);
+ * this.worldObj.createExplosion(this, this.posX+MathUtils.randDouble(-10, 10), this.posY,
+ * this.posZ+MathUtils.randDouble(-10, 10), f+MathUtils.randFloat(-5F, 5F), true);
+ * this.worldObj.createExplosion(this, this.posX+MathUtils.randDouble(-10, 10), this.posY,
+ * this.posZ+MathUtils.randDouble(-10, 10), f+MathUtils.randFloat(-5F, 5F), true);
+ */
+ }
+
+ /**
+ * (abstract) Protected helper method to write subclass entity data to NBT.
+ */
+ @Override
+ protected void writeEntityToNBT(final NBTTagCompound tag) {
+ tag.setByte("Fuse", (byte) this.fuse);
+ }
+
+ /**
+ * (abstract) Protected helper method to read subclass entity data from NBT.
+ */
+ @Override
+ protected void readEntityFromNBT(final NBTTagCompound tag) {
+ this.fuse = tag.getByte("Fuse");
+ }
+
+ /**
+ * returns null or the entityliving it was placed or ignited by
+ */
+ @Override
+ public EntityLivingBase getTntPlacedBy() {
+ return this.tntPlacedBy;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/entity/InternalEntityRegistry.java b/gtpp/src/main/java/gtPlusPlus/core/entity/InternalEntityRegistry.java
new file mode 100644
index 0000000000..a971541bc2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/entity/InternalEntityRegistry.java
@@ -0,0 +1,64 @@
+package gtPlusPlus.core.entity;
+
+import cpw.mods.fml.common.registry.EntityRegistry;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.entity.monster.EntitySickBlaze;
+import gtPlusPlus.core.entity.monster.EntityStaballoyConstruct;
+import gtPlusPlus.core.entity.projectile.EntityLightningAttack;
+import gtPlusPlus.core.entity.projectile.EntityToxinballSmall;
+import gtPlusPlus.core.item.general.spawn.ItemCustomSpawnEgg;
+import gtPlusPlus.core.util.Utils;
+
+public class InternalEntityRegistry {
+
+ static int mEntityID = 0;
+
+ public static void registerEntities() {
+ Logger.INFO("Registering GT++ Entities.");
+
+ EntityRegistry.registerModEntity(
+ EntityPrimedMiningExplosive.class,
+ "MiningCharge",
+ mEntityID++,
+ GTplusplus.instance,
+ 64,
+ 20,
+ true);
+
+ EntityRegistry
+ .registerModEntity(EntityToxinballSmall.class, "toxinBall", mEntityID++, GTplusplus.instance, 64, 20, true);
+
+ EntityRegistry.registerModEntity(
+ EntityStaballoyConstruct.class,
+ "constructStaballoy",
+ mEntityID++,
+ GTplusplus.instance,
+ 64,
+ 20,
+ true);
+ ItemCustomSpawnEgg.registerEntityForSpawnEgg(
+ 0,
+ "constructStaballoy",
+ Utils.rgbtoHexValue(20, 200, 20),
+ Utils.rgbtoHexValue(20, 20, 20));
+
+ EntityRegistry
+ .registerModEntity(EntitySickBlaze.class, "sickBlaze", mEntityID++, GTplusplus.instance, 64, 20, true);
+ ItemCustomSpawnEgg.registerEntityForSpawnEgg(
+ 1,
+ "sickBlaze",
+ Utils.rgbtoHexValue(40, 180, 40),
+ Utils.rgbtoHexValue(75, 75, 75));
+
+ EntityRegistry.registerModEntity(
+ EntityLightningAttack.class,
+ "EntityLightningAttack",
+ mEntityID++,
+ GTplusplus.instance,
+ 64,
+ 20,
+ true);
+
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/entity/monster/EntitySickBlaze.java b/gtpp/src/main/java/gtPlusPlus/core/entity/monster/EntitySickBlaze.java
new file mode 100644
index 0000000000..38940d3ad6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/entity/monster/EntitySickBlaze.java
@@ -0,0 +1,224 @@
+package gtPlusPlus.core.entity.monster;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.SharedMonsterAttributes;
+import net.minecraft.entity.monster.EntityMob;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.entity.projectile.EntityToxinballSmall;
+
+public class EntitySickBlaze extends EntityMob {
+
+ /** Random offset used in floating behaviour */
+ private float heightOffset = 0.5F;
+ /** ticks until heightOffset is randomized */
+ private int heightOffsetUpdateTime;
+
+ private int field_70846_g;
+ private final int mDataWatcherID = 30;
+
+ public EntitySickBlaze(World p_i1731_1_) {
+ super(p_i1731_1_);
+ this.isImmuneToFire = true;
+ this.experienceValue = 10;
+ }
+
+ @Override
+ protected void applyEntityAttributes() {
+ super.applyEntityAttributes();
+ this.getEntityAttribute(SharedMonsterAttributes.maxHealth)
+ .setBaseValue(20.0D);
+ this.getEntityAttribute(SharedMonsterAttributes.movementSpeed)
+ .setBaseValue(1.5D);
+ this.getEntityAttribute(SharedMonsterAttributes.attackDamage)
+ .setBaseValue(6.0D);
+ }
+
+ @Override
+ protected void entityInit() {
+ super.entityInit();
+ this.dataWatcher.addObject(mDataWatcherID, 0);
+ }
+
+ /**
+ * Returns the sound this mob makes while it's alive.
+ */
+ @Override
+ protected String getLivingSound() {
+ return "mob.blaze.breathe";
+ }
+
+ /**
+ * Returns the sound this mob makes when it is hurt.
+ */
+ @Override
+ protected String getHurtSound() {
+ return "mob.blaze.hit";
+ }
+
+ /**
+ * Returns the sound this mob makes on death.
+ */
+ @Override
+ protected String getDeathSound() {
+ return "mob.blaze.death";
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getBrightnessForRender(float p_70070_1_) {
+ return 15728880;
+ }
+
+ /**
+ * Gets how bright this entity is.
+ */
+ @Override
+ public float getBrightness(float p_70013_1_) {
+ return p_70013_1_;
+ }
+
+ /**
+ * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
+ * use this to react to sunlight and start to burn.
+ */
+ @Override
+ public void onLivingUpdate() {
+ if (!this.worldObj.isRemote) {
+ if (this.isWet()) {
+ this.attackEntityFrom(DamageSource.drown, 1.0F);
+ }
+
+ --this.heightOffsetUpdateTime;
+
+ if (this.heightOffsetUpdateTime <= 0) {
+ this.heightOffsetUpdateTime = 100;
+ this.heightOffset = 0.5F + (float) this.rand.nextGaussian() * 3.0F;
+ }
+
+ if (this.getEntityToAttack() != null && this.getEntityToAttack().posY + this.getEntityToAttack()
+ .getEyeHeight() > this.posY + this.getEyeHeight() + this.heightOffset) {
+ this.motionY += (0.30000001192092896D - this.motionY) * 0.30000001192092896D;
+ }
+ }
+
+ if (!this.onGround && this.motionY < 0.0D) {
+ this.motionY *= 0.6D;
+ }
+
+ for (int i = 0; i < 2; ++i) {
+ this.worldObj.spawnParticle(
+ "crit",
+ this.posX + (this.rand.nextDouble() - 0.5D) * this.width,
+ this.posY + this.rand.nextDouble() * this.height,
+ this.posZ + (this.rand.nextDouble() - 0.5D) * this.width,
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+
+ super.onLivingUpdate();
+ }
+
+ /**
+ * Basic mob attack. Default to touch of death in EntityCreature. Overridden by each mob to define their attack.
+ */
+ @Override
+ protected void attackEntity(Entity entity, float p_70785_2_) {
+ if (this.attackTime <= 0 && p_70785_2_ < 2.0F
+ && entity.boundingBox.maxY > this.boundingBox.minY
+ && entity.boundingBox.minY < this.boundingBox.maxY) {
+ this.attackTime = 20;
+ this.attackEntityAsMob(entity);
+ } else if (p_70785_2_ < 30.0F) {
+ double d0 = entity.posX - this.posX;
+ double d1 = entity.boundingBox.minY + entity.height / 2.0F - (this.posY + this.height / 2.0F);
+ double d2 = entity.posZ - this.posZ;
+
+ if (this.attackTime == 0) {
+ ++this.field_70846_g;
+
+ if (this.field_70846_g == 1) {
+ this.attackTime = 60;
+ } else if (this.field_70846_g <= 4) {
+ this.attackTime = 6;
+ } else {
+ this.attackTime = 100;
+ this.field_70846_g = 0;
+ }
+
+ if (this.field_70846_g > 1) {
+ float f1 = MathHelper.sqrt_float(p_70785_2_) * 0.5F;
+ this.worldObj.playAuxSFXAtEntity(null, 1009, (int) this.posX, (int) this.posY, (int) this.posZ, 0);
+
+ for (int i = 0; i < 1; ++i) {
+ EntityToxinballSmall entitysmalltoxinball = new EntityToxinballSmall(
+ this.worldObj,
+ this,
+ d0 + this.rand.nextGaussian() * f1,
+ d1,
+ d2 + this.rand.nextGaussian() * f1);
+ entitysmalltoxinball.posY = this.posY + this.height / 2.0F + 0.5D;
+ this.worldObj.spawnEntityInWorld(entitysmalltoxinball);
+ }
+ }
+ }
+
+ this.rotationYaw = (float) (Math.atan2(d2, d0) * 180.0D / Math.PI) - 90.0F;
+ this.hasAttacked = true;
+ }
+ }
+
+ /**
+ * Called when the mob is falling. Calculates and applies fall damage.
+ */
+ @Override
+ protected void fall(float p_70069_1_) {}
+
+ @Override
+ protected Item getDropItem() {
+ return Items.slime_ball;
+ }
+
+ /**
+ * Returns true if the entity is on fire. Used by render to add the fire effect on rendering.
+ */
+ @Override
+ public boolean isBurning() {
+ return false;
+ }
+
+ /**
+ * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param
+ * par2 - Level of Looting used to kill this mob.
+ */
+ @Override
+ protected void dropFewItems(boolean p_70628_1_, int p_70628_2_) {
+ if (p_70628_1_) {
+ int j = this.rand.nextInt(2 + p_70628_2_);
+
+ for (int k = 0; k < j; ++k) {
+ this.dropItem(getDropItem(), 1);
+ }
+ }
+ }
+
+ /**
+ * Checks to make sure the light is not too bright where the mob is spawning
+ */
+ @Override
+ protected boolean isValidLightLevel() {
+ return true;
+ }
+
+ @Override
+ public int getMaxSpawnedInChunk() {
+ return 8;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/entity/monster/EntityStaballoyConstruct.java b/gtpp/src/main/java/gtPlusPlus/core/entity/monster/EntityStaballoyConstruct.java
new file mode 100644
index 0000000000..c58f5ba9df
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/entity/monster/EntityStaballoyConstruct.java
@@ -0,0 +1,652 @@
+package gtPlusPlus.core.entity.monster;
+
+import java.lang.reflect.Field;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.SharedMonsterAttributes;
+import net.minecraft.entity.ai.EntityAIAttackOnCollide;
+import net.minecraft.entity.ai.EntityAIHurtByTarget;
+import net.minecraft.entity.ai.EntityAILookIdle;
+import net.minecraft.entity.ai.EntityAIMoveTowardsRestriction;
+import net.minecraft.entity.ai.EntityAIMoveTowardsTarget;
+import net.minecraft.entity.ai.EntityAINearestAttackableTarget;
+import net.minecraft.entity.ai.EntityAIWander;
+import net.minecraft.entity.ai.EntityAIWatchClosest;
+import net.minecraft.entity.effect.EntityLightningBolt;
+import net.minecraft.entity.monster.EntityIronGolem;
+import net.minecraft.entity.monster.IMob;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MathHelper;
+import net.minecraft.village.Village;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.core.world.explosions.ExplosionHandler;
+
+public class EntityStaballoyConstruct extends EntityIronGolem {
+
+ /*
+ * Determines whether or not the entity is in a fluid at all.
+ */
+ private boolean inFluid = false;
+ private boolean mReflectFirstUpdate = true;
+ private boolean isReadyToExplode = false;
+ private int fuse = 60;
+ private int attackTimer;
+
+ public EntityStaballoyConstruct(World world) {
+ super(world);
+ this.experienceValue = 250;
+ this.setSize(1.4F, 2.9F);
+ this.getNavigator()
+ .setAvoidsWater(true);
+ this.getNavigator()
+ .setBreakDoors(true);
+ this.getNavigator()
+ .setCanSwim(false);
+ this.getNavigator()
+ .setAvoidSun(false);
+ this.tasks.addTask(1, new EntityAIAttackOnCollide(this, 1.0D, true));
+ this.tasks.addTask(2, new EntityAIMoveTowardsTarget(this, 0.9D, 32.0F));
+ // this.tasks.addTask(3, new EntityAIMoveThroughVillage(this, 0.6D, true));
+ this.tasks.addTask(3, new EntityAIMoveTowardsRestriction(this, 1.0D));
+ this.tasks.addTask(4, new EntityAIWander(this, 0.6D));
+ this.tasks.addTask(5, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F));
+ this.tasks.addTask(6, new EntityAILookIdle(this));
+ this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false));
+ this.targetTasks.addTask(
+ 2,
+ new EntityAINearestAttackableTarget(this, EntityLiving.class, 0, false, true, IMob.mobSelector));
+ }
+
+ /**
+ * (abstract) Protected helper method to write subclass entity data to NBT.
+ */
+ @Override
+ public void writeEntityToNBT(NBTTagCompound p_70014_1_) {
+ super.writeEntityToNBT(p_70014_1_);
+ p_70014_1_.setBoolean("inFluid", this.inFluid);
+ p_70014_1_.setBoolean("isReadyToExplode", this.isReadyToExplode);
+ p_70014_1_.setInteger("fuse", this.fuse);
+ }
+
+ /**
+ * (abstract) Protected helper method to read subclass entity data from NBT.
+ */
+ @Override
+ public void readEntityFromNBT(NBTTagCompound p_70037_1_) {
+ super.readEntityFromNBT(p_70037_1_);
+ this.inFluid = p_70037_1_.getBoolean("inFluid");
+ this.isReadyToExplode = p_70037_1_.getBoolean("isReadyToExplode");
+ this.fuse = p_70037_1_.getInteger("fuse");
+ }
+
+ @Override
+ protected void entityInit() {
+ super.entityInit();
+ this.dataWatcher.addObject(17, Byte.valueOf((byte) 0));
+ }
+
+ /**
+ * Returns true if the newer Entity AI code should be run
+ */
+ @Override
+ public boolean isAIEnabled() {
+ return true;
+ }
+
+ /**
+ * main AI tick function, replaces updateEntityActionState
+ */
+ @Override
+ protected void updateAITick() {
+ super.updateAITick();
+ }
+
+ @Override
+ protected void applyEntityAttributes() {
+ super.applyEntityAttributes();
+ this.getEntityAttribute(SharedMonsterAttributes.maxHealth)
+ .setBaseValue(500.0D);
+ this.getEntityAttribute(SharedMonsterAttributes.movementSpeed)
+ .setBaseValue(0.5D);
+ }
+
+ /**
+ * Decrements the entity's air supply when underwater
+ */
+ @Override
+ protected int decreaseAirSupply(int p_70682_1_) {
+ return 0;
+ }
+
+ @Override
+ protected void collideWithEntity(Entity p_82167_1_) {
+ if (p_82167_1_ instanceof IMob && this.getRNG()
+ .nextInt(20) == 0) {
+ this.setAttackTarget((EntityLivingBase) p_82167_1_);
+ }
+
+ super.collideWithEntity(p_82167_1_);
+ }
+
+ /**
+ * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
+ * use this to react to sunlight and start to burn.
+ */
+ @Override
+ public void onLivingUpdate() {
+ super.onLivingUpdate();
+
+ if (this.attackTimer > 0) {
+ --this.attackTimer;
+ }
+
+ if (this.motionX * this.motionX + this.motionZ * this.motionZ > 2.500000277905201E-7D
+ && this.rand.nextInt(5) == 0) {
+ int i = MathHelper.floor_double(this.posX);
+ int j = MathHelper.floor_double(this.posY - 0.20000000298023224D - this.yOffset);
+ int k = MathHelper.floor_double(this.posZ);
+ Block block = this.worldObj.getBlock(i, j, k);
+
+ if (block.getMaterial() != Material.air) {
+ this.worldObj.spawnParticle(
+ "blockcrack_" + Block.getIdFromBlock(block) + "_" + this.worldObj.getBlockMetadata(i, j, k),
+ this.posX + (this.rand.nextFloat() - 0.5D) * this.width,
+ this.boundingBox.minY + 0.1D,
+ this.posZ + (this.rand.nextFloat() - 0.5D) * this.width,
+ 4.0D * (this.rand.nextFloat() - 0.5D),
+ 0.5D,
+ (this.rand.nextFloat() - 0.5D) * 4.0D);
+ }
+ }
+ }
+
+ /**
+ * Returns true if this entity can attack entities of the specified class.
+ */
+ @Override
+ public boolean canAttackClass(Class clazz) {
+ return clazz.equals(this.getClass()) ? false : true;
+ }
+
+ @Override
+ public boolean attackEntityAsMob(Entity p_70652_1_) {
+ this.attackTimer = 10;
+ this.worldObj.setEntityState(this, (byte) 4);
+ boolean flag = p_70652_1_.attackEntityFrom(DamageSource.causeMobDamage(this), 7 + this.rand.nextInt(15));
+
+ if (flag) {
+ p_70652_1_.motionY += 0.4000000059604645D;
+ }
+
+ this.playSound("mob.irongolem.throw", 1.0F, 1.0F);
+ return flag;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void handleHealthUpdate(byte p_70103_1_) {
+ if (p_70103_1_ == 4) {
+ this.attackTimer = 10;
+ this.playSound("mob.irongolem.throw", 1.0F, 1.0F);
+ } else {
+ super.handleHealthUpdate(p_70103_1_);
+ }
+ }
+
+ @Override
+ public Village getVillage() {
+ return null;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getAttackTimer() {
+ return this.attackTimer;
+ }
+
+ /**
+ * Returns the sound this mob makes when it is hurt.
+ */
+ @Override
+ protected String getHurtSound() {
+ return "mob.irongolem.hit";
+ }
+
+ /**
+ * Returns the sound this mob makes on death.
+ */
+ @Override
+ protected String getDeathSound() {
+ return "mob.irongolem.death";
+ }
+
+ @Override
+ protected void func_145780_a(int p_145780_1_, int p_145780_2_, int p_145780_3_, Block p_145780_4_) {
+ this.playSound("mob.irongolem.walk", 1.0F, 1.0F);
+ }
+
+ /**
+ * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param
+ * par2 - Level of Looting used to kill this mob.
+ */
+ @Override
+ protected void dropFewItems(boolean p_70628_1_, int p_70628_2_) {
+ int lootingChance = p_70628_2_ + 1;
+ int j = this.rand.nextInt(3);
+ int k;
+
+ for (k = 0; k < j; ++k) {
+ this.entityDropItem(ItemUtils.getItemStackOfAmountFromOreDict("blockStaballoy", 1), 0f);
+ }
+
+ k = 3 + this.rand.nextInt(3);
+
+ for (int l = 0; l < k; ++l) {
+ this.entityDropItem(ItemUtils.getItemStackOfAmountFromOreDict("ingotStaballoy", lootingChance), 0f);
+ if (MathUtils.randInt(0, 2) == 0) {
+ this.entityDropItem(ItemUtils.getItemStackOfAmountFromOreDict("plateStaballoy", lootingChance), 0f);
+ }
+ }
+ }
+
+ @Override
+ public boolean isPlayerCreated() {
+ return false;
+ }
+
+ @Override
+ public void setPlayerCreated(boolean p_70849_1_) {}
+
+ /**
+ * Called when the mob's health reaches 0.
+ */
+ @Override
+ public void onDeath(DamageSource p_70645_1_) {
+ super.onDeath(p_70645_1_);
+ }
+
+ @Override
+ protected String getLivingSound() { // TODO
+ return super.getLivingSound();
+ }
+
+ @Override
+ public int getTalkInterval() {
+ return 0;
+ }
+
+ @Override
+ protected boolean canDespawn() {
+ return true;
+ }
+
+ @Override
+ public void onEntityUpdate() {
+ // Set Fire Immunity
+ if (!this.isImmuneToFire) {
+ this.isImmuneToFire = true;
+ }
+
+ if (!this.worldObj.isRemote) {
+ final float hp = getHealth();
+ final float modifier = MathUtils.randInt(5, 10) / 100F;
+ final float amountToExplode = (hp * modifier);
+
+ if (hp <= amountToExplode && !isReadyToExplode) {
+ if (this.ticksExisted >= 50) {
+ // Logger.INFO("Construct has low hp, trying to enable explosions. HP: "+this.getHealth()+", Max:
+ // "+this.getMaxHealth()+", Mod: "+modifier);
+ // Logger.INFO("Construct required HP to be <= "+amountToExplode);
+ float r = MathUtils.randFloat(0, 10);
+ if (r <= 0.1) {
+ this.isReadyToExplode = true;
+ // Logger.INFO("Construct can now explode.");
+ }
+ }
+ }
+ // Handle Exploding
+ else if (hp <= amountToExplode && isReadyToExplode) {
+ // Logger.INFO("Trying to explode. ["+this.fuse+"]");
+ if (this.fuse-- <= 0) {
+ // Logger.INFO("Fuse has run out.");
+ this.setDead();
+ if (!this.worldObj.isRemote) {
+ this.explode();
+ }
+ } else {
+ // Logger.INFO("Ticking fuse and spawning particles.");
+
+ int maxFuse = 60;
+ int fuseUsed = maxFuse - this.fuse;
+ float var2 = (float) (fuseUsed * 0.1);
+
+ this.setSize(1.4F + (var2 / 2), 2.9F + (var2 / 2));
+
+ float r = MathUtils.randFloat(0, 1);
+ int r2 = MathUtils.randInt(5, 15);
+ for (int o = 0; o < r2; o++) {
+ if (r <= 0.3) {
+ this.worldObj.spawnParticle(
+ "smoke",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.6) {
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ if (r <= 0.3) {
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.7) {
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ if (r <= 0.2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.5) {
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.7) {
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(-2, 2),
+ this.posY + MathUtils.randDouble(-2, 2),
+ this.posZ + MathUtils.randDouble(-2, 2),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ }
+ }
+ } else {
+
+ }
+
+ // Get a private field from a super class if it exists.
+ if (mFirstUpdateField == null) {
+ mFirstUpdateField = ReflectionUtils.getField(this.getClass(), "firstUpdate");
+ }
+ if (mFirstUpdateField != null && mReflectFirstUpdate == true) {
+ try {
+ this.mReflectFirstUpdate = (boolean) mFirstUpdateField.get(this);
+ } catch (IllegalArgumentException | IllegalAccessException e) {}
+ }
+ }
+ super.onEntityUpdate();
+ }
+
+ private static Field mFirstUpdateField;
+
+ @Override
+ public int getMaxSpawnedInChunk() {
+ return 1;
+ }
+
+ @Override
+ public boolean canBreatheUnderwater() {
+ return true;
+ }
+
+ @Override
+ public void knockBack(Entity p_70653_1_, float p_70653_2_, double p_70653_3_, double p_70653_5_) {}
+
+ @Override
+ protected void setOnFireFromLava() {
+ extinguish();
+ }
+
+ @Override
+ public void setFire(int p_70015_1_) {
+ extinguish();
+ }
+
+ @Override
+ protected void dealFireDamage(int p_70081_1_) {}
+
+ @Override
+ public boolean isInWater() {
+ if (super.isInWater()) {
+ return true;
+ } else {
+ this.moveForward *= 0.98F;
+ return false;
+ }
+ }
+
+ @Override
+ public boolean handleWaterMovement() {
+ this.moveForward *= 0.74F;
+ return handleFluidMovement(Material.water);
+ }
+
+ @Override
+ public boolean handleLavaMovement() {
+ this.moveForward *= 0.74F;
+ return handleFluidMovement(Material.lava);
+ }
+
+ /**
+ * Returns if this entity is in water and will end up adding the waters velocity to the entity
+ */
+ public boolean handleFluidMovement(Material fluid) {
+
+ if (this.worldObj.handleMaterialAcceleration(
+ this.boundingBox.expand(0.0D, -0.4000000059604645D, 0.0D)
+ .contract(0.001D, 0.001D, 0.001D),
+ fluid,
+ this)) {
+ if (!this.inFluid && !this.mReflectFirstUpdate) {
+ float f = MathHelper.sqrt_double(
+ this.motionX * this.motionX * 0.20000000298023224D + this.motionY * this.motionY
+ + this.motionZ * this.motionZ * 0.20000000298023224D)
+ * 0.2F;
+
+ if (f > 1.0F) {
+ f = 1.0F;
+ }
+
+ this.playSound(this.getSplashSound(), f, 1.0F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F);
+ float f1 = MathHelper.floor_double(this.boundingBox.minY);
+ int i;
+ float f2;
+ float f3;
+
+ for (i = 0; i < 1.0F + this.width * 20.0F; ++i) {
+ f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ f3 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ this.worldObj.spawnParticle(
+ "bubble",
+ this.posX + f2,
+ f1 + 1.0F,
+ this.posZ + f3,
+ this.motionX,
+ this.motionY - this.rand.nextFloat() * 0.2F,
+ this.motionZ);
+ }
+
+ for (i = 0; i < 1.0F + this.width * 20.0F; ++i) {
+ f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ f3 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ this.worldObj.spawnParticle(
+ "splash",
+ this.posX + f2,
+ f1 + 1.0F,
+ this.posZ + f3,
+ this.motionX,
+ this.motionY,
+ this.motionZ);
+ }
+ }
+ this.fallDistance = 0.0F;
+ this.inFluid = true;
+ } else {
+ this.inFluid = false;
+ }
+ return this.inFluid;
+ }
+
+ @Override
+ public void onChunkLoad() {
+ // TODO Auto-generated method stub
+ super.onChunkLoad();
+ }
+
+ @Override
+ public void onStruckByLightning(EntityLightningBolt p_70077_1_) {
+ this.isReadyToExplode = true;
+ this.fuse = 20;
+ }
+
+ private void explode() {
+ /*
+ * float f = 12.0F; this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, f, true);
+ */
+
+ if (!this.worldObj.isRemote) {
+ final float f = 6.5F;
+ ExplosionHandler explode = new ExplosionHandler();
+ explode.createExplosion(this.worldObj, this, this.posX, this.posY, this.posZ, f, true, true);
+
+ float r = MathUtils.randFloat(0, 1);
+ int r2 = MathUtils.randInt(20, 40);
+ for (int o = 0; o < r2; o++) {
+ if (r <= 0.3) {
+ this.worldObj.spawnParticle(
+ "smoke",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(0, 3),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.6) {
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(-4, 4),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ if (r <= 0.3) {
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(-4, 4),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.7) {
+ this.worldObj.spawnParticle(
+ "flame",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(-4, 4),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ if (r <= 0.2) {
+ this.worldObj.spawnParticle(
+ "explode",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(-4, 4),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.5) {
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(-4, 4),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+
+ } else if (r <= 0.7) {
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.posX + MathUtils.randDouble(-4, 4),
+ this.posY + MathUtils.randDouble(-4, 4),
+ this.posZ + MathUtils.randDouble(-4, 4),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean canAttackWithItem() {
+ return true;
+ }
+
+ @Override
+ public boolean canRenderOnFire() {
+ return false;
+ }
+
+ @Override
+ public boolean isPushedByWater() {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/entity/projectile/EntityLightningAttack.java b/gtpp/src/main/java/gtPlusPlus/core/entity/projectile/EntityLightningAttack.java
new file mode 100644
index 0000000000..e1a4063f49
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/entity/projectile/EntityLightningAttack.java
@@ -0,0 +1,79 @@
+package gtPlusPlus.core.entity.projectile;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.projectile.EntityWitherSkull;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.world.EnumDifficulty;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class EntityLightningAttack extends EntityWitherSkull {
+
+ public EntityLightningAttack(World p_i1794_1_, EntityLivingBase p_i1794_2_, double p_i1794_3_, double p_i1794_5_,
+ double p_i1794_7_) {
+ super(p_i1794_1_, p_i1794_2_, p_i1794_3_, p_i1794_5_, p_i1794_7_);
+ this.setSize(0.3125F, 0.3125F);
+ }
+
+ @SideOnly(Side.CLIENT)
+ public EntityLightningAttack(World p_i1795_1_, double p_i1795_2_, double p_i1795_4_, double p_i1795_6_,
+ double p_i1795_8_, double p_i1795_10_, double p_i1795_12_) {
+ super(p_i1795_1_, p_i1795_2_, p_i1795_4_, p_i1795_6_, p_i1795_8_, p_i1795_10_, p_i1795_12_);
+ this.setSize(0.3125F, 0.3125F);
+ }
+
+ /**
+ * Called when this EntityFireball hits a block or entity.
+ */
+ @Override
+ protected void onImpact(MovingObjectPosition p_70227_1_) {
+
+ if (!this.worldObj.isRemote) {
+ if (p_70227_1_.entityHit != null) {
+ if (this.shootingEntity != null) {
+ if (p_70227_1_.entityHit.attackEntityFrom(DamageSource.causeMobDamage(this.shootingEntity), 8.0F)
+ && !p_70227_1_.entityHit.isEntityAlive()) {
+ this.shootingEntity.heal(0.5F);
+ }
+ } else {
+ p_70227_1_.entityHit.attackEntityFrom(DamageSource.lava, 10.0F);
+ }
+
+ if (p_70227_1_.entityHit instanceof EntityLivingBase) {
+ byte b0 = 0;
+
+ if (this.worldObj.difficultySetting == EnumDifficulty.NORMAL) {
+ b0 = 10;
+ } else if (this.worldObj.difficultySetting == EnumDifficulty.HARD) {
+ b0 = 40;
+ }
+
+ if (b0 > 0) {
+ ((EntityLivingBase) p_70227_1_.entityHit)
+ .addPotionEffect(new PotionEffect(Potion.poison.id, 20 * b0, 1));
+ ((EntityLivingBase) p_70227_1_.entityHit)
+ .addPotionEffect(new PotionEffect(Potion.confusion.id, 20 * b0, 1));
+ ((EntityLivingBase) p_70227_1_.entityHit)
+ .addPotionEffect(new PotionEffect(Potion.weakness.id, 20 * b0, 1));
+ }
+ }
+ }
+
+ this.worldObj.newExplosion(
+ this,
+ this.posX,
+ this.posY,
+ this.posZ,
+ 1.0F,
+ false,
+ this.worldObj.getGameRules()
+ .getGameRuleBooleanValue("mobGriefing"));
+ this.setDead();
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinball.java b/gtpp/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinball.java
new file mode 100644
index 0000000000..a3b2f6f28b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinball.java
@@ -0,0 +1,334 @@
+package gtPlusPlus.core.entity.projectile;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.projectile.EntityFireball;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public abstract class EntityToxinball extends EntityFireball {
+
+ protected int entityX = -1;
+ protected int entityY = -1;
+ protected int entityZ = -1;
+ private Block block;
+ private boolean inGround;
+ private int ticksAlive;
+ private int ticksInAir;
+
+ public EntityToxinball(World world) {
+ super(world);
+ this.setSize(1.0F, 1.0F);
+ }
+
+ @Override
+ protected void entityInit() {}
+
+ /**
+ * Checks if the entity is in range to render by using the past in distance and comparing it to its average edge
+ * length * 64 * renderDistanceWeight Args: distance
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean isInRangeToRenderDist(double p_70112_1_) {
+ double d1 = this.boundingBox.getAverageEdgeLength() * 4.0D;
+ d1 *= 64.0D;
+ return p_70112_1_ < d1 * d1;
+ }
+
+ public EntityToxinball(World world, double x, double y, double z, double f1, double f2, double f3) {
+ super(world);
+ this.setSize(1.0F, 1.0F);
+ this.setLocationAndAngles(x, y, z, this.rotationYaw, this.rotationPitch);
+ this.setPosition(x, y, z);
+ double d6 = MathHelper.sqrt_double(f1 * f1 + f2 * f2 + f3 * f3);
+ this.accelerationX = f1 / d6 * 0.1D;
+ this.accelerationY = f2 / d6 * 0.1D;
+ this.accelerationZ = f3 / d6 * 0.1D;
+ }
+
+ public EntityToxinball(World world, EntityLivingBase entity, double x, double y, double z) {
+ super(world);
+ this.shootingEntity = entity;
+ this.setSize(1.0F, 1.0F);
+ this.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch);
+ this.setPosition(this.entityX, this.entityY, this.entityZ);
+ this.yOffset = 0.0F;
+ this.motionX = this.motionY = this.motionZ = 0.0D;
+ x += this.rand.nextGaussian() * 0.4D;
+ y += this.rand.nextGaussian() * 0.4D;
+ z += this.rand.nextGaussian() * 0.4D;
+ double d3 = MathHelper.sqrt_double(x * x + y * y + z * z);
+ this.accelerationX = x / d3 * 0.1D;
+ this.accelerationY = y / d3 * 0.1D;
+ this.accelerationZ = z / d3 * 0.1D;
+ }
+
+ /**
+ * Called to update the entity's position/logic.
+ */
+ @Override
+ public void onUpdate() {
+ if (!this.worldObj.isRemote && (this.shootingEntity != null && this.shootingEntity.isDead
+ || !this.worldObj.blockExists(this.entityX, this.entityY, this.entityZ))) {
+ this.setDead();
+ } else {
+ super.onUpdate();
+ this.setFire(1);
+
+ if (this.inGround) {
+ if (this.worldObj.getBlock(this.entityX, this.entityY, this.entityZ) == this.block) {
+ ++this.ticksAlive;
+
+ if (this.ticksAlive == 600) {
+ this.setDead();
+ }
+
+ return;
+ }
+
+ this.inGround = false;
+ this.motionX *= this.rand.nextFloat() * 0.2F;
+ this.motionY *= this.rand.nextFloat() * 0.2F;
+ this.motionZ *= this.rand.nextFloat() * 0.2F;
+ this.ticksAlive = 0;
+ this.ticksInAir = 0;
+ } else {
+ ++this.ticksInAir;
+ }
+
+ Vec3 vec3 = Vec3.createVectorHelper(this.entityX, this.entityY, this.entityZ);
+ Vec3 vec31 = Vec3.createVectorHelper(
+ this.entityX + this.motionX,
+ this.entityY + this.motionY,
+ this.entityZ + this.motionZ);
+ MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec3, vec31);
+ vec3 = Vec3.createVectorHelper(this.entityX, this.entityY, this.entityZ);
+ vec31 = Vec3.createVectorHelper(
+ this.entityX + this.motionX,
+ this.entityY + this.motionY,
+ this.entityZ + this.motionZ);
+
+ if (movingobjectposition != null) {
+ vec31 = Vec3.createVectorHelper(
+ movingobjectposition.hitVec.xCoord,
+ movingobjectposition.hitVec.yCoord,
+ movingobjectposition.hitVec.zCoord);
+ }
+
+ Entity entity = null;
+ List<?> list = this.worldObj.getEntitiesWithinAABBExcludingEntity(
+ this,
+ this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ)
+ .expand(1.0D, 1.0D, 1.0D));
+ double d0 = 0.0D;
+
+ for (Object o : list) {
+ Entity entity1 = (Entity) o;
+
+ if (entity1.canBeCollidedWith()
+ && (!entity1.isEntityEqual(this.shootingEntity) || this.ticksInAir >= 25)) {
+ float f = 0.3F;
+ AxisAlignedBB axisalignedbb = entity1.boundingBox.expand(f, f, f);
+ MovingObjectPosition movingobjectposition1 = axisalignedbb.calculateIntercept(vec3, vec31);
+
+ if (movingobjectposition1 != null) {
+ double d1 = vec3.distanceTo(movingobjectposition1.hitVec);
+
+ if (d1 < d0 || d0 == 0.0D) {
+ entity = entity1;
+ d0 = d1;
+ }
+ }
+ }
+ }
+
+ if (entity != null) {
+ movingobjectposition = new MovingObjectPosition(entity);
+ }
+
+ if (movingobjectposition != null) {
+ this.onImpact(movingobjectposition);
+ }
+
+ this.entityX += this.motionX;
+ this.entityY += this.motionY;
+ this.entityZ += this.motionZ;
+ float f1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.rotationYaw = (float) (Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) + 90.0F;
+
+ for (this.rotationPitch = (float) (Math.atan2(f1, this.motionY) * 180.0D / Math.PI)
+ - 90.0F; 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 f2 = this.getMotionFactor();
+
+ if (this.isInWater()) {
+ for (int j = 0; j < 4; ++j) {
+ float f3 = 0.25F;
+ this.worldObj.spawnParticle(
+ "bubble",
+ this.entityX - this.motionX * f3,
+ this.entityY - this.motionY * f3,
+ this.entityZ - this.motionZ * f3,
+ this.motionX,
+ this.motionY,
+ this.motionZ);
+ }
+
+ f2 = 0.8F;
+ }
+
+ this.motionX += this.accelerationX;
+ this.motionY += this.accelerationY;
+ this.motionZ += this.accelerationZ;
+ this.motionX *= f2;
+ this.motionY *= f2;
+ this.motionZ *= f2;
+ this.worldObj.spawnParticle("smoke", this.entityX, this.entityY + 0.5D, this.entityZ, 0.0D, 0.0D, 0.0D);
+ this.setPosition(this.entityX, this.entityY, this.entityZ);
+ }
+ }
+
+ /**
+ * Return the motion factor for this projectile. The factor is multiplied by the original motion.
+ */
+ @Override
+ protected float getMotionFactor() {
+ return 0.95F;
+ }
+
+ /**
+ * Called when this EntityFireball hits a block or entity.
+ */
+ @Override
+ protected abstract void onImpact(MovingObjectPosition p_70227_1_);
+
+ /**
+ * (abstract) Protected helper method to write subclass entity data to NBT.
+ */
+ @Override
+ public void writeEntityToNBT(NBTTagCompound aTag) {
+ aTag.setShort("xTile", (short) this.entityX);
+ aTag.setShort("yTile", (short) this.entityY);
+ aTag.setShort("zTile", (short) this.entityZ);
+ aTag.setByte("inTile", (byte) Block.getIdFromBlock(this.block));
+ aTag.setByte("inGround", (byte) (this.inGround ? 1 : 0));
+ aTag.setTag("direction", this.newDoubleNBTList(new double[] { this.motionX, this.motionY, this.motionZ }));
+ }
+
+ /**
+ * (abstract) Protected helper method to read subclass entity data from NBT.
+ */
+ @Override
+ public void readEntityFromNBT(NBTTagCompound aTag) {
+ this.entityX = aTag.getShort("xTile");
+ this.entityY = aTag.getShort("yTile");
+ this.entityZ = aTag.getShort("zTile");
+ this.block = Block.getBlockById(aTag.getByte("inTile") & 255);
+ this.inGround = aTag.getByte("inGround") == 1;
+
+ if (aTag.hasKey("direction", 9)) {
+ NBTTagList nbttaglist = aTag.getTagList("direction", 6);
+ this.motionX = nbttaglist.func_150309_d(0);
+ this.motionY = nbttaglist.func_150309_d(1);
+ this.motionZ = nbttaglist.func_150309_d(2);
+ } else {
+ this.setDead();
+ }
+ }
+
+ /**
+ * Returns true if other Entities should be prevented from moving through this Entity.
+ */
+ @Override
+ public boolean canBeCollidedWith() {
+ return true;
+ }
+
+ @Override
+ public float getCollisionBorderSize() {
+ return 1.0F;
+ }
+
+ /**
+ * Called when the entity is attacked.
+ */
+ @Override
+ public boolean attackEntityFrom(DamageSource damage, float p_70097_2_) {
+ if (this.isEntityInvulnerable()) {
+ return false;
+ } else {
+ this.setBeenAttacked();
+
+ if (damage.getEntity() != null) {
+ Vec3 vec3 = damage.getEntity()
+ .getLookVec();
+
+ if (vec3 != null) {
+ this.motionX = vec3.xCoord;
+ this.motionY = vec3.yCoord;
+ this.motionZ = vec3.zCoord;
+ this.accelerationX = this.motionX * 0.1D;
+ this.accelerationY = this.motionY * 0.1D;
+ this.accelerationZ = this.motionZ * 0.1D;
+ }
+
+ if (damage.getEntity() instanceof EntityLivingBase) {
+ this.shootingEntity = (EntityLivingBase) damage.getEntity();
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public float getShadowSize() {
+ return 0.0F;
+ }
+
+ /**
+ * Gets how bright this entity is.
+ */
+ @Override
+ public float getBrightness(float p_70013_1_) {
+ return 1.0F;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getBrightnessForRender(float p_70070_1_) {
+ return 15728880;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinballSmall.java b/gtpp/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinballSmall.java
new file mode 100644
index 0000000000..44b2e8f694
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/entity/projectile/EntityToxinballSmall.java
@@ -0,0 +1,65 @@
+package gtPlusPlus.core.entity.projectile;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.world.World;
+
+public class EntityToxinballSmall extends EntityToxinball {
+
+ public EntityToxinballSmall(World world, EntityLivingBase entity, double x, double y, double z) {
+ super(world, entity, x, y, z);
+ this.setSize(0.3125F, 0.3125F);
+ }
+
+ /**
+ * Called when this EntityFireball hits a block or entity.
+ */
+ @Override
+ protected void onImpact(MovingObjectPosition MoP) {
+ if (!this.worldObj.isRemote) {
+ if (MoP.entityHit != null) {
+ if (!MoP.entityHit.isImmuneToFire() && MoP.entityHit
+ .attackEntityFrom(DamageSource.causeFireballDamage(this, this.shootingEntity), 5.0F)) {
+ MoP.entityHit.setFire(5);
+ }
+ } else {
+ int i = MoP.blockX;
+ int j = MoP.blockY;
+ int k = MoP.blockZ;
+
+ switch (MoP.sideHit) {
+ case 0 -> --j;
+ case 1 -> ++j;
+ case 2 -> --k;
+ case 3 -> ++k;
+ case 4 -> --i;
+ case 5 -> ++i;
+ }
+
+ if (this.worldObj.isAirBlock(i, j, k)) {
+ this.worldObj.setBlock(i, j, k, Blocks.fire);
+ }
+ }
+
+ this.setDead();
+ }
+ }
+
+ /**
+ * Returns true if other Entities should be prevented from moving through this Entity.
+ */
+ @Override
+ public boolean canBeCollidedWith() {
+ return false;
+ }
+
+ /**
+ * Called when the entity is attacked.
+ */
+ @Override
+ public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/fluids/FluidRegistryHandler.java b/gtpp/src/main/java/gtPlusPlus/core/fluids/FluidRegistryHandler.java
new file mode 100644
index 0000000000..b08889b42b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/fluids/FluidRegistryHandler.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.core.fluids;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gtPlusPlus.core.block.ModBlocks.blockFluidSludge;
+import static gtPlusPlus.core.block.ModBlocks.fluidSludge;
+
+import net.minecraft.block.material.Material;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.block.general.fluids.BlockFluidSludge;
+
+public class FluidRegistryHandler {
+
+ // Fluids
+ /**
+ *
+ * Luminosity .setLuminosity(luminosity) How much light does the fluid emit. Default: 0, Lava uses 15 Density
+ * .setDensity(density) How dense is the fluid, the only effect is whether or not a fluid replaces another fluid
+ * when they flow into each other. Default: 1000, the density of water at 4 degrees Celsius in kg/m³ Temperature
+ * .setTemperature(temp) How hot, or cold is the fluid. Has currently no effect. Default: 295, the "normal" room
+ * temperature in degrees Kelvin, this is approximately 72°F or 22°C. Viscosity .setViscosity(viscosity) How thick
+ * the fluid is. Determines how fast it flows. Default: 1000 for water, lava uses 6000 Is Gaseous
+ * .setGaseous(boolean) Indicates if the fluid is gaseous. Used for rendering. Default: false
+ *
+ */
+ public static void registerFluids() {
+ run();
+ }
+
+ private static void run() {
+ fluidSludge();
+ }
+
+ private static void fluidSludge() {
+ // testFluid
+ fluidSludge.setLuminosity(8);
+ fluidSludge.setDensity(8196);
+ fluidSludge.setTemperature(295);
+ fluidSludge.setViscosity(3000);
+ fluidSludge.setGaseous(false);
+ fluidSludge.setUnlocalizedName("fluid.sludge");
+ FluidRegistry.registerFluid(fluidSludge);
+ blockFluidSludge = new BlockFluidSludge(fluidSludge, Material.cactus).setBlockName("fluidBlockSludge");
+ GameRegistry.registerBlock(
+ blockFluidSludge,
+ GTPlusPlus.ID + "_"
+ + blockFluidSludge.getUnlocalizedName()
+ .substring(5));
+ fluidSludge.setUnlocalizedName(blockFluidSludge.getUnlocalizedName());
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/gui/GUI_Base_Tile_Entity.java b/gtpp/src/main/java/gtPlusPlus/core/gui/GUI_Base_Tile_Entity.java
new file mode 100644
index 0000000000..379827a1db
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/gui/GUI_Base_Tile_Entity.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.core.gui;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.inventory.Container;
+
+public abstract class GUI_Base_Tile_Entity extends GuiContainer {
+
+ public final Container mContainer;
+
+ public GUI_Base_Tile_Entity(Container aContainer) {
+ super(aContainer);
+ mContainer = aContainer;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/gui/beta/Gui_ID_Registry.java b/gtpp/src/main/java/gtPlusPlus/core/gui/beta/Gui_ID_Registry.java
new file mode 100644
index 0000000000..7da3d1a35c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/gui/beta/Gui_ID_Registry.java
@@ -0,0 +1,47 @@
+package gtPlusPlus.core.gui.beta;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import gtPlusPlus.core.interfaces.IGuiManagerMiscUtils;
+
+public class Gui_ID_Registry {
+
+ private static final Map<Class<? extends IGuiManagerMiscUtils>, MU_GuiId> classMap = new HashMap<>();
+ private static final Map<Integer, MU_GuiId> idMap = new HashMap<>();
+ private static int nextId = 0;
+
+ static {}
+
+ private static void registerGuiHandlers(final Gui_Types MU_GuiType,
+ final List<Class<? extends IGuiManagerMiscUtils>> guiHandlerClasses) {
+ for (final Class<? extends IGuiManagerMiscUtils> tileGuiHandlerClass : guiHandlerClasses) {
+ final MU_GuiId guiId = new MU_GuiId(nextId++, MU_GuiType, tileGuiHandlerClass);
+ classMap.put(tileGuiHandlerClass, guiId);
+ idMap.put(Integer.valueOf(guiId.getId()), guiId);
+ }
+ }
+
+ public static MU_GuiId getGuiIdForGuiHandler(final IGuiManagerMiscUtils guiHandler) {
+ final Class<? extends IGuiManagerMiscUtils> guiHandlerClass = guiHandler.getClass();
+ MU_GuiId guiId = classMap.get(guiHandlerClass);
+ if (guiId == null) {
+ for (final Map.Entry<Class<? extends IGuiManagerMiscUtils>, MU_GuiId> classGuiIdEntry : classMap
+ .entrySet()) {
+ if (((Class<?>) classGuiIdEntry.getKey()).isAssignableFrom(guiHandlerClass)) {
+ guiId = classGuiIdEntry.getValue();
+ break;
+ }
+ }
+ }
+ if (guiId == null) {
+ throw new IllegalStateException("No gui ID for gui handler: " + guiHandler);
+ }
+ return guiId;
+ }
+
+ public static MU_GuiId getGuiId(final int id) {
+ return idMap.get(Integer.valueOf(id));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/gui/beta/Gui_Types.java b/gtpp/src/main/java/gtPlusPlus/core/gui/beta/Gui_Types.java
new file mode 100644
index 0000000000..f0bf946b23
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/gui/beta/Gui_Types.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.gui.beta;
+
+public enum Gui_Types {
+
+ Item,
+ Tile,
+ Entity;
+
+ private Gui_Types() {}
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/gui/beta/MU_GuiId.java b/gtpp/src/main/java/gtPlusPlus/core/gui/beta/MU_GuiId.java
new file mode 100644
index 0000000000..8b15f5b937
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/gui/beta/MU_GuiId.java
@@ -0,0 +1,28 @@
+package gtPlusPlus.core.gui.beta;
+
+import gtPlusPlus.core.interfaces.IGuiManagerMiscUtils;
+
+public class MU_GuiId {
+
+ private final int id;
+ private final Gui_Types MU_GuiType;
+ private final Class<? extends IGuiManagerMiscUtils> guiHandlerClass;
+
+ MU_GuiId(final int id, final Gui_Types MU_GuiType, final Class<? extends IGuiManagerMiscUtils> guiHandlerClass) {
+ this.id = id;
+ this.MU_GuiType = MU_GuiType;
+ this.guiHandlerClass = guiHandlerClass;
+ }
+
+ public Gui_Types getGuiType() {
+ return this.MU_GuiType;
+ }
+
+ public Class<? extends IGuiManagerMiscUtils> getGuiHandlerClass() {
+ return this.guiHandlerClass;
+ }
+
+ public int getId() {
+ return this.id;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_CircuitProgrammer.java b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_CircuitProgrammer.java
new file mode 100644
index 0000000000..71d3b36470
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_CircuitProgrammer.java
@@ -0,0 +1,46 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.container.Container_CircuitProgrammer;
+import gtPlusPlus.core.tileentities.general.TileEntityCircuitProgrammer;
+
+@SideOnly(Side.CLIENT)
+public class GUI_CircuitProgrammer extends GuiContainer {
+
+ private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/CircuitProgrammer.png");
+
+ public GUI_CircuitProgrammer(final InventoryPlayer player_inventory, final TileEntityCircuitProgrammer te) {
+ super(new Container_CircuitProgrammer(player_inventory, te));
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int i, final int j) {
+ super.drawGuiContainerForegroundLayer(i, j);
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float f, final int i, final int j) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(craftingTableGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+
+ // This method is called when the Gui is first called!
+ @Override
+ public void initGui() {
+ super.initGui();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_DecayablesChest.java b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_DecayablesChest.java
new file mode 100644
index 0000000000..60e0f0e67e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_DecayablesChest.java
@@ -0,0 +1,54 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.container.Container_DecayablesChest;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+
+@SideOnly(Side.CLIENT)
+public class GUI_DecayablesChest extends GuiContainer {
+
+ private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/FishTrap.png");
+
+ public GUI_DecayablesChest(final InventoryPlayer player_inventory, final TileEntityDecayablesChest te) {
+ super(new Container_DecayablesChest(player_inventory, te));
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int i, final int j) {
+
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float f, final int i, final int j) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(craftingTableGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+
+ // This method is called when the Gui is first called!
+ @Override
+ public void initGui() {
+ // You have to add this line for the Gui to function properly!
+ super.initGui();
+
+ // The parameters of GuiButton are(id, x, y, width, height, text);
+ // this.buttonList.add(new GuiButton( 1, 367, 132, 18, 18, "X"));
+ // this.buttonList.add(new GuiButton( 2, 385, 132, 18, 18, "Y"));
+ // NOTE: the id always has to be different or else it might get called twice or never!
+
+ // Add any other buttons here too!
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_FishTrap.java b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_FishTrap.java
new file mode 100644
index 0000000000..d57ef408d0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_FishTrap.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.container.Container_FishTrap;
+import gtPlusPlus.core.tileentities.general.TileEntityFishTrap;
+
+@SideOnly(Side.CLIENT)
+public class GUI_FishTrap extends GuiContainer {
+
+ private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/FishTrap.png");
+
+ public GUI_FishTrap(final InventoryPlayer player_inventory, final TileEntityFishTrap te) {
+ super(new Container_FishTrap(player_inventory, te));
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int i, final int j) {}
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float f, final int i, final int j) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(craftingTableGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+
+ // This method is called when the Gui is first called!
+ @Override
+ public void initGui() {
+ // You have to add this line for the Gui to function properly!
+ super.initGui();
+
+ // The parameters of GuiButton are(id, x, y, width, height, text);
+ // this.buttonList.add(new GuiButton( 1, 367, 132, 18, 18, "X"));
+ // this.buttonList.add(new GuiButton( 2, 385, 132, 18, 18, "Y"));
+ // NOTE: the id always has to be different or else it might get called twice or never!
+
+ // Add any other buttons here too!
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_PestKiller.java b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_PestKiller.java
new file mode 100644
index 0000000000..bed8707fc4
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_PestKiller.java
@@ -0,0 +1,175 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.awt.Color;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.client.resources.I18n;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fluids.FluidTank;
+import net.minecraftforge.fluids.IFluidTank;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.container.Container_PestKiller;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.tileentities.machines.TileEntityPestKiller;
+import gtPlusPlus.core.util.math.MathUtils;
+
+@SideOnly(Side.CLIENT)
+public class GUI_PestKiller extends GuiContainer {
+
+ private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/PestKiller.png");
+ private final TileEntityPestKiller mTileKiller;
+
+ public GUI_PestKiller(final InventoryPlayer player_inventory, final TileEntityPestKiller te) {
+ super(new Container_PestKiller(player_inventory, te));
+ mTileKiller = te;
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int i, final int j) {
+ if (mTileKiller != null) {
+ this.fontRendererObj.drawString(I18n.format(mTileKiller.getInventoryName(), new Object[0]), 4, 6, 4210752);
+ drawFluidTank(mTileKiller.getTank(), 134, 35);
+ }
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float f, final int i, final int j) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(craftingTableGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+
+ // This method is called when the Gui is first called!
+ @Override
+ public void initGui() {
+ super.initGui();
+ }
+
+ private void drawFluidTank(IFluidTank tank, int x, int y) {
+ Color startGrad = new Color(50, 50, 50);
+ Color endGrad = new Color(20, 20, 20);
+ Container_PestKiller aCont = (Container_PestKiller) this.inventorySlots;
+
+ double aPercentage = 0;
+ double aDivisor = (100 / 16);
+ int aFrameHeight = 16;
+
+ boolean didRender = false;
+ if (aCont != null) {
+ TileEntityPestKiller aTile = mTileKiller;
+ if (aTile != null) {
+ FluidTank aTank = aTile.getTank();
+ int aTier = aTile.getTier();
+ drawGradientRect(x, y, x + 16, y + 16, startGrad.getRGB(), endGrad.getRGB());
+ if (aTier <= 0 || aTier > 2) {
+ if (aTank != null && aTank.getFluidAmount() > 0) {
+ aPercentage = MathUtils.findPercentage(aTank.getFluidAmount(), aTank.getCapacity());
+ // Logger.INFO("Percent = "+aPercentage);
+ aFrameHeight = (int) (aPercentage / aDivisor);
+ // Logger.INFO("Frame Height = "+aFrameHeight);
+ }
+ this.fontRendererObj.drawString("Tier: 0", 4, 18, 4210752);
+ this.fontRendererObj.drawString("Range: 1x1", 4, 30, 4210752);
+ this.fontRendererObj.drawString("Poison: None", 4, 42, 4210752);
+ this.fontRendererObj.drawString("Amount: 0", 4, 64, 4210752);
+ didRender = true;
+ } else if (aTier == 1) {
+ if (aTank != null && aTank.getFluidAmount() > 0) {
+ aPercentage = MathUtils.findPercentage(aTank.getFluidAmount(), aTank.getCapacity());
+ // Logger.INFO("Percent = "+aPercentage);
+ aFrameHeight = (int) (aPercentage / aDivisor);
+ // Logger.INFO("Frame Height = "+aFrameHeight);
+ }
+ startGrad = new Color(240, 50, 240);
+ endGrad = new Color(130, 30, 130);
+ drawGradientRect(x, y + (16 - aFrameHeight), x + 16, y + 16, startGrad.getRGB(), endGrad.getRGB());
+ this.fontRendererObj.drawString("Tier: 1", 4, 18, 4210752);
+ this.fontRendererObj.drawString("Range: 5x5", 4, 30, 4210752);
+ this.fontRendererObj.drawString("Poison: ", 4, 42, 4210752);
+ this.fontRendererObj.drawString(
+ "" + aTile.getTank()
+ .getFluid()
+ .getLocalizedName(),
+ 4,
+ 54,
+ 4210752);
+ this.fontRendererObj.drawString(
+ "Amount: " + aTile.getTank()
+ .getFluidAmount(),
+ 4,
+ 64,
+ 4210752);
+ didRender = true;
+ } else if (aTier == 2) {
+ if (aTank != null && aTank.getFluidAmount() > 0) {
+ aPercentage = MathUtils.findPercentage(aTank.getFluidAmount(), aTank.getCapacity());
+ // Logger.INFO("Percent = "+aPercentage);
+ aFrameHeight = (int) (aPercentage / aDivisor);
+ // Logger.INFO("Frame Height = "+aFrameHeight);
+ }
+ short[] aRGB = MISC_MATERIALS.HYDROGEN_CYANIDE.getRGB();
+ startGrad = new Color(aRGB[0], aRGB[1], aRGB[2]);
+ endGrad = new Color(Math.max(aRGB[0], 0), Math.max(aRGB[1], 0), Math.max(aRGB[2], 0));
+ drawGradientRect(x, y + (16 - aFrameHeight), x + 16, y + 16, startGrad.getRGB(), endGrad.getRGB());
+ this.fontRendererObj.drawString("Tier: 2", 4, 18, 4210752);
+ this.fontRendererObj.drawString("Range: 9x9", 4, 30, 4210752);
+ this.fontRendererObj.drawString("Poison: ", 4, 42, 4210752);
+ this.fontRendererObj.drawString(
+ "" + aTile.getTank()
+ .getFluid()
+ .getLocalizedName(),
+ 4,
+ 54,
+ 4210752);
+ this.fontRendererObj.drawString(
+ "Amount: " + aTile.getTank()
+ .getFluidAmount(),
+ 4,
+ 64,
+ 4210752);
+ didRender = true;
+ }
+ }
+ }
+ if (!didRender) {
+ startGrad = new Color(255, 30, 120);
+ endGrad = new Color(255, 0, 50);
+ drawGradientRect(x, y, x + 16, y + 16, startGrad.getRGB(), endGrad.getRGB());
+ this.fontRendererObj.drawString("Tier: 0", 4, 18, 4210752);
+ }
+
+ /*
+ * FluidStack fluid = tank.getFluid(); TextureManager manager = mc.getTextureManager(); if (fluid != null) {
+ * manager.bindTexture(manager.getResourceLocation(0)); float amount = fluid.amount; float capacity =
+ * tank.getCapacity(); float scale = amount / capacity; int fluidTankHeight = 60; int fluidAmount = (int) (scale
+ * * fluidTankHeight); drawFluid(x, y + fluidTankHeight - fluidAmount, fluid.getFluid().getIcon(fluid), 16,
+ * fluidAmount); }
+ */
+ }
+
+ private void drawFluid(int x, int y, IIcon icon, int width, int height) {
+ int i = 0;
+ int j = 0;
+ int drawHeight = 0;
+ int drawWidth = 0;
+ for (i = 0; i < width; i += 16) {
+ for (j = 0; j < height; j += 16) {
+ drawWidth = Math.min(width - i, 16);
+ drawHeight = Math.min(height - j, 16);
+ drawTexturedModelRectFromIcon(x + i, y + j, icon, drawWidth, drawHeight);
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_ProjectTable.java b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_ProjectTable.java
new file mode 100644
index 0000000000..3707855641
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_ProjectTable.java
@@ -0,0 +1,58 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.container.Container_ProjectTable;
+import gtPlusPlus.core.tileentities.machines.TileEntityProjectTable;
+
+@SideOnly(Side.CLIENT)
+public class GUI_ProjectTable extends GuiContainer {
+
+ private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/ProjectTable.png");
+
+ public GUI_ProjectTable(final InventoryPlayer player_inventory, final TileEntityProjectTable tile) {
+ super(new Container_ProjectTable(player_inventory, tile));
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int i, final int j) {
+
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float f, final int i, final int j) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(craftingTableGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+
+ // This method is called when the Gui is first called!
+ @Override
+ public void initGui() {
+ // You have to add this line for the Gui to function properly!
+ super.initGui();
+
+ // The parameters of GuiButton are(id, x, y, width, height, text);
+ // this.buttonList.add(new GuiButton( 1, 367, 132, 18, 18, "X"));
+ // this.buttonList.add(new GuiButton( 2, 385, 132, 18, 18, "Y"));
+ // NOTE: the id always has to be different or else it might get called twice or never!
+
+ // Add any other buttons here too!
+ }
+
+ @Override
+ protected void actionPerformed(final GuiButton B) {}
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_SuperJukebox.java b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_SuperJukebox.java
new file mode 100644
index 0000000000..9afa2b4ce1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_SuperJukebox.java
@@ -0,0 +1,88 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.block.machine.Machine_SuperJukebox.TileEntitySuperJukebox;
+import gtPlusPlus.core.container.Container_SuperJukebox;
+import gtPlusPlus.core.gui.GUI_Base_Tile_Entity;
+
+@SideOnly(Side.CLIENT)
+public class GUI_SuperJukebox extends GUI_Base_Tile_Entity {
+
+ private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/SuperJukebox.png");
+ private final Container_SuperJukebox mThisContainer;
+
+ public GUI_SuperJukebox(final InventoryPlayer player_inventory, final TileEntitySuperJukebox te) {
+ super(new Container_SuperJukebox(player_inventory, te));
+ mThisContainer = (Container_SuperJukebox) this.mContainer;
+ }
+
+ // This method is called when the Gui is first called!
+ @Override
+ public void initGui() {
+ super.initGui();
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int par1, final int par2) {
+ super.drawGuiContainerForegroundLayer(par1, par2);
+
+ boolean a = mThisContainer.isPlaying;
+ boolean b = mThisContainer.isLooping;
+
+ if (a && b) {
+ this.fontRendererObj.drawString("[X] [X]", 72, 74, 4210752);
+ } else if (a && !b) {
+ this.fontRendererObj.drawString("[X] [ ]", 72, 74, 4210752);
+ } else if (!a && b) {
+ this.fontRendererObj.drawString("[ ] [X]", 72, 74, 4210752);
+ } else {
+ this.fontRendererObj.drawString("[ ] [ ]", 72, 74, 4210752);
+ }
+
+ this.drawTooltip(par1, par2);
+ }
+
+ private void drawTooltip(final int x2, final int y2) {
+ final int xStart = (this.width - this.xSize) / 2;
+ final int yStart = (this.height - this.ySize) / 2;
+ final int x3 = x2 - xStart;
+ final int y3 = y2 - yStart + 5;
+ final List<String> list = new ArrayList<>();
+
+ if (y3 >= 17 && y3 <= 33) {
+ if (x3 >= 80 && x3 <= 96) {
+ list.add("Play");
+ }
+ }
+ if (y3 >= 35 && y3 <= 53) {
+ if (x3 >= 80 && x3 <= 96) {
+ list.add("Loop");
+ }
+ }
+ if (!list.isEmpty()) {
+ this.drawHoveringText(list, x3, y3, this.fontRendererObj);
+ }
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float par1, final int par2, final int par3) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(craftingTableGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_VolumetricFlaskSetter.java b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_VolumetricFlaskSetter.java
new file mode 100644
index 0000000000..6595b510c0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/gui/machine/GUI_VolumetricFlaskSetter.java
@@ -0,0 +1,228 @@
+package gtPlusPlus.core.gui.machine;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.client.resources.I18n;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.container.Container_VolumetricFlaskSetter;
+import gtPlusPlus.core.gui.widget.GuiValueField;
+import gtPlusPlus.core.handler.PacketHandler;
+import gtPlusPlus.core.network.packet.Packet_VolumetricFlaskGui;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+
+@SideOnly(Side.CLIENT)
+public class GUI_VolumetricFlaskSetter extends GuiContainer {
+
+ private static final ResourceLocation mGuiTextures = new ResourceLocation(
+ GTPlusPlus.ID,
+ "textures/gui/VolumetricFlaskSetter.png");
+ private Container_VolumetricFlaskSetter mContainer;
+ private boolean mIsOpen = false;
+ private GuiValueField mText;
+ private TileEntityVolumetricFlaskSetter mTile;
+
+ public GUI_VolumetricFlaskSetter(Container_VolumetricFlaskSetter aContainer) {
+ super(aContainer);
+ mContainer = aContainer;
+ mTile = mContainer.mTileEntity;
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(final float f, final int i, final int j) {
+ GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ this.mc.renderEngine.bindTexture(mGuiTextures);
+ final int x = (this.width - this.xSize) / 2;
+ final int y = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(final int i, final int j) {
+ super.drawGuiContainerForegroundLayer(i, j);
+ this.mText.drawTextBox();
+ this.fontRendererObj.drawString(I18n.format("container.VolumetricFlaskSetter", new Object[0]), 4, 3, 4210752);
+ int aYVal = 49;
+ this.fontRendererObj.drawString(I18n.format("0 = 16l", new Object[0]), 8, aYVal, 4210752);
+ this.fontRendererObj.drawString(I18n.format("4 = 576l", new Object[0]), 64, aYVal, 4210752);
+ this.fontRendererObj.drawString(I18n.format("1 = 36l", new Object[0]), 8, aYVal += 8, 4210752);
+ this.fontRendererObj.drawString(I18n.format("5 = 720l", new Object[0]), 64, aYVal, 4210752);
+ this.fontRendererObj.drawString(I18n.format("2 = 144l", new Object[0]), 8, aYVal += 8, 4210752);
+ this.fontRendererObj.drawString(I18n.format("6 = 864l", new Object[0]), 64, aYVal, 4210752);
+ this.fontRendererObj.drawString(I18n.format("3 = 432l", new Object[0]), 8, aYVal += 8, 4210752);
+ this.fontRendererObj.drawString(I18n.format("-> = Custom", new Object[0]), 59, aYVal, 4210752);
+ }
+
+ @Override
+ public void drawScreen(int par1, int par2, float par3) {
+ this.drawDefaultBackground();
+ super.drawScreen(par1, par2, par3);
+ }
+
+ protected String getText() {
+ return this.mText.getText();
+ }
+
+ @Override
+ public void initGui() {
+ super.initGui();
+ // Keyboard.enableRepeatEvents(true);
+ mIsOpen = true;
+ this.mText = new GuiValueField(
+ this.fontRendererObj,
+ 26,
+ 31,
+ this.width / 2 - 62,
+ this.height / 2 - 52,
+ 106,
+ 14,
+ this);
+ mText.setMaxStringLength(5);
+ mText.setEnableBackgroundDrawing(true);
+ mText.setText("0");
+ mText.setFocused(true);
+ }
+
+ public boolean isNumber(char c) {
+ boolean isNum = ((c >= 48 && c <= 57) || c == 45);
+ if (isNum) {
+ log("Found Digit: " + c + " | char value");
+ } else {
+ switch (c) {
+ case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> {
+ log("Found Digit: " + c + " | char switch");
+ return true;
+ }
+ }
+ }
+ return isNum;
+ }
+
+ public boolean isNumber(int c) {
+ switch (c) {
+ case Keyboard.KEY_0, Keyboard.KEY_1, Keyboard.KEY_2, Keyboard.KEY_3, Keyboard.KEY_4, Keyboard.KEY_5, Keyboard.KEY_6, Keyboard.KEY_7, Keyboard.KEY_8, Keyboard.KEY_9, Keyboard.KEY_NUMPAD0, Keyboard.KEY_NUMPAD1, Keyboard.KEY_NUMPAD2, Keyboard.KEY_NUMPAD3, Keyboard.KEY_NUMPAD4, Keyboard.KEY_NUMPAD5, Keyboard.KEY_NUMPAD6, Keyboard.KEY_NUMPAD7, Keyboard.KEY_NUMPAD8, Keyboard.KEY_NUMPAD9 -> {
+ log("Found Digit: " + Keyboard.getKeyName(c) + " | LWJGL Keybinding");
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected void keyTyped(char par1, int par2) {
+ if (mIsOpen) {
+ log("Pressed " + par1 + " | " + par2);
+ if (mText.isFocused()) {
+ log("Text box has focus.");
+ if (par2 == Keyboard.KEY_RETURN) {
+ log("Pressed Enter, unfocusing.");
+ mText.setFocused(false);
+ } else if (par2 == Keyboard.KEY_BACK) {
+ log("Pressed Backspace.");
+ String aCurrentText = getText();
+ if (aCurrentText.length() > 0) {
+ this.mText.setText(aCurrentText.substring(0, aCurrentText.length() - 1));
+ if (getText().length() <= 0) {
+ setText(0);
+ }
+ sendUpdateToServer();
+ }
+ } else {
+ if (isNumber(par2) || isNumber(par1)) {
+ log("Pressed number.");
+ if (this.mText.getText()
+ .equals("0")) {
+ this.mText.textboxKeyTyped(par1, par2);
+ sendUpdateToServer();
+ } else {
+ this.mText.textboxKeyTyped(par1, par2);
+ sendUpdateToServer();
+ }
+ } else {
+ log("Pressed unused key.");
+ super.keyTyped(par1, par2);
+ }
+ }
+ } else {
+ log("Text box not focused.");
+ super.keyTyped(par1, par2);
+ }
+ } else {
+ log("Gui is not open?");
+ }
+ }
+
+ @Override
+ protected void mouseClicked(int x, int y, int btn) {
+ if (mIsOpen) {
+ log("Clicked.");
+ this.mText.mouseClicked(x, y, btn);
+ if (!mText.didClickInTextField(x, y)) {
+ log("Did not click in text box, passing to super.");
+ super.mouseClicked(x, y, btn);
+ }
+ } else {
+ log("Gui is not open?");
+ }
+ }
+
+ @Override
+ public void onGuiClosed() {
+ mIsOpen = false;
+ mText.setEnabled(false);
+ mText.setVisible(false);
+ super.onGuiClosed();
+ // Keyboard.enableRepeatEvents(false);
+ }
+
+ public int parse(String aValue) {
+ try {
+ return Integer.parseInt(getText());
+ } catch (NumberFormatException e) {
+ return 0;
+ }
+ }
+
+ public void sendUpdateToServer() {
+ if (getText().length() > 0) {
+ PacketHandler.sendToServer(new Packet_VolumetricFlaskGui(mTile, parse(getText())));
+ }
+ }
+
+ public void setText(int aValue) {
+ this.mText.setText("" + aValue);
+ }
+
+ @Override
+ public void updateScreen() {
+ super.updateScreen();
+ // Update Textbox to 0 if Empty
+ if (getText().length() <= 0) {
+ this.mText.setText("0");
+ sendUpdateToServer();
+ }
+ this.mText.updateCursorCounter();
+
+ // Check TextBox Value is correct
+ if (getText().length() > 0) {
+ int aCustomValue = parse(getText());
+ int aTileValue = ((Container_VolumetricFlaskSetter) mContainer).mCustomValue;
+ if (mContainer != null) {
+ if (aTileValue != aCustomValue) {
+ setText(aTileValue);
+ }
+ }
+ }
+ }
+
+ public void log(String aString) {
+ Logger.INFO("[Flask-GUI] " + aString);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/gui/widget/GuiValueField.java b/gtpp/src/main/java/gtPlusPlus/core/gui/widget/GuiValueField.java
new file mode 100644
index 0000000000..698aa1951a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/gui/widget/GuiValueField.java
@@ -0,0 +1,104 @@
+package gtPlusPlus.core.gui.widget;
+
+import java.lang.reflect.Field;
+
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.GuiTextField;
+
+import gtPlusPlus.core.gui.machine.GUI_VolumetricFlaskSetter;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+
+public class GuiValueField extends GuiTextField {
+
+ private final FontRenderer mFontRenderer;
+ private final int mScreenLocationX;
+ private final int mScreenLocationY;
+ private final GUI_VolumetricFlaskSetter mGUI;
+
+ public GuiValueField(FontRenderer aFontRenderer, int aX, int aY, int aScreenLocationX, int aScreenLocationY,
+ int aWidth, int aHeight, GUI_VolumetricFlaskSetter aGUI) {
+ super(aFontRenderer, aX, aY, aWidth, aHeight);
+ mFontRenderer = aFontRenderer;
+ mScreenLocationX = aScreenLocationX;
+ mScreenLocationY = aScreenLocationY;
+ mGUI = aGUI;
+ }
+
+ @Override
+ public boolean isFocused() {
+ return super.isFocused();
+ }
+
+ public boolean isBackgroundDrawingEnabled() {
+ Field enableBackgroundDrawing = ReflectionUtils.getField(
+ GuiTextField.class,
+ !CORE_Preloader.DEV_ENVIRONMENT ? "field_146215_m" : "enableBackgroundDrawing");
+ if (enableBackgroundDrawing != null) {
+ return ReflectionUtils.getFieldValue(enableBackgroundDrawing, this);
+ }
+ return true;
+ }
+
+ public int getLineScrollOffset() {
+ Field lineScrollOffset = ReflectionUtils
+ .getField(GuiTextField.class, !CORE_Preloader.DEV_ENVIRONMENT ? "field_146225_q" : "lineScrollOffset");
+ if (lineScrollOffset != null) {
+ return (int) ReflectionUtils.getFieldValue(lineScrollOffset, this);
+ }
+ return 0;
+ }
+
+ public boolean didClickInTextField(int aX, int aY) {
+ mGUI.log("Clicked at X:" + aX + ", Y:" + aY);
+ boolean aDidClick = aX >= this.mScreenLocationX && aX < this.mScreenLocationX + this.width
+ && aY >= this.mScreenLocationY
+ && aY < this.mScreenLocationY + this.height;
+ mGUI.log("Did click in textbox? " + aDidClick);
+ mGUI.log("Expected Region: X:" + mScreenLocationX + "-" + (this.mScreenLocationX + this.width));
+ mGUI.log("Expected Region: Y:" + mScreenLocationY + "-" + (this.mScreenLocationY + this.height));
+ return aDidClick;
+ }
+
+ /**
+ * Args: x, y, buttonClicked
+ */
+ @Override
+ public void mouseClicked(int aX, int aY, int aButton) {
+ boolean aDidClick = didClickInTextField(aX, aY);
+
+ mGUI.log("Did click inside text box? " + aDidClick);
+ mGUI.log("Focus 1: " + this.isFocused());
+ this.setFocused(aDidClick);
+ mGUI.log("Focus 2: " + this.isFocused());
+ if (isFocused()) {
+ int l = aX - this.mScreenLocationX;
+ if (isBackgroundDrawingEnabled()) {
+ l -= 4;
+ }
+ if (aButton == 0) {
+ mGUI.log("Left clicked in text box.");
+ String s = this.mFontRenderer.trimStringToWidth(
+ this.getText()
+ .substring(getLineScrollOffset()),
+ this.getWidth());
+ this.setCursorPosition(
+ this.mFontRenderer.trimStringToWidth(s, l)
+ .length() + getLineScrollOffset());
+ } else if (aButton == 1) {
+ mGUI.log("Right clicked in text box.");
+ mGUI.setText(0);
+ mGUI.sendUpdateToServer();
+ String s = this.mFontRenderer.trimStringToWidth(
+ this.getText()
+ .substring(getLineScrollOffset()),
+ this.getWidth());
+ this.setCursorPosition(
+ this.mFontRenderer.trimStringToWidth(s, l)
+ .length() + getLineScrollOffset());
+ }
+ } else {
+ mGUI.log("Clicked, but no focus.");
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/AchievementHandler.java b/gtpp/src/main/java/gtPlusPlus/core/handler/AchievementHandler.java
new file mode 100644
index 0000000000..41513163a0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/AchievementHandler.java
@@ -0,0 +1,491 @@
+package gtPlusPlus.core.handler;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.stats.Achievement;
+import net.minecraftforge.common.AchievementPage;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent;
+import cpw.mods.fml.common.gameevent.PlayerEvent.ItemSmeltedEvent;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Log;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+
+public class AchievementHandler {
+
+ public ConcurrentHashMap<String, Achievement> achievementList = new ConcurrentHashMap<>();
+
+ public int adjX = 5;
+ public int adjY = 9;
+
+ private static final String aBaseAchievementName = "gtpp.start";
+
+ public AchievementHandler() {
+
+ Logger.INFO("Initializing GT++ achievements");
+ GT_Log.out.println("Initializing GT++ achievements");
+
+ // register first
+ this.registerAchievement(
+ aBaseAchievementName,
+ 0,
+ 0,
+ MetaGeneratedGregtechTools.INSTANCE.getToolWithStats(
+ MetaGeneratedGregtechTools.ANGLE_GRINDER,
+ 1,
+ Materials.Osmium,
+ Materials.Osmium,
+ null),
+ "",
+ true);
+
+ this.registerAchievement(
+ "hatch.dynamo.buffered",
+ 2,
+ -2,
+ GregtechItemList.Hatch_Buffer_Dynamo_IV.get(1),
+ aBaseAchievementName,
+ false);
+ // First multi anyone really needs
+ this.registerAchievement(
+ "multi.abs",
+ -4,
+ -2,
+ GregtechItemList.Industrial_AlloyBlastSmelter.get(1),
+ aBaseAchievementName,
+ true);
+
+ // Material Advancement
+ this.registerAchievement("dust.potin", 0, 2, ALLOY.POTIN.getDust(1), aBaseAchievementName, false);
+ this.registerAchievement("dust.eglin", 0, 4, ALLOY.EGLIN_STEEL.getDust(1), "dust.potin", false);
+ this.registerAchievement("dust.staballoy", 0, 6, ALLOY.STABALLOY.getDust(1), "dust.eglin", false);
+ this.registerAchievement("dust.quantum", 0, 8, ALLOY.QUANTUM.getDust(1), "dust.staballoy", true);
+ this.registerAchievement("dust.hypogen", 0, 10, ELEMENT.STANDALONE.HYPOGEN.getDust(1), "dust.quantum", true);
+
+ // Blocks
+ this.registerAchievement(
+ "block.fishtrap",
+ -2,
+ 2,
+ ItemUtils.getSimpleStack(ModBlocks.blockFishTrap),
+ "dust.potin",
+ false);
+ this.registerAchievement(
+ "block.withercage",
+ -2,
+ 4,
+ ItemUtils.getSimpleStack(ModBlocks.blockWitherGuard),
+ "dust.eglin",
+ false);
+
+ // Machines (-10/-8/-6)
+ this.registerAchievement("rtg", -16, -10, GregtechItemList.RTG.get(1), aBaseAchievementName, false);
+ this.registerAchievement(
+ "dehydrate",
+ -15,
+ -10,
+ GregtechItemList.GT_Dehydrator_HV.get(1),
+ aBaseAchievementName,
+ false);
+ this.registerAchievement(
+ "semifluid",
+ -14,
+ -10,
+ GregtechItemList.Generator_SemiFluid_HV.get(1),
+ aBaseAchievementName,
+ false);
+ this.registerAchievement(
+ "earlywasher",
+ -13,
+ -10,
+ GregtechItemList.SimpleDustWasher_ULV.get(1),
+ aBaseAchievementName,
+ false);
+ this.registerAchievement(
+ "advancedsteam",
+ -12,
+ -10,
+ GregtechItemList.Boiler_Advanced_MV.get(1),
+ aBaseAchievementName,
+ false);
+ if (PollutionUtils.isPollutionEnabled()) {
+ this.registerAchievement(
+ "pollutionremoval",
+ -11,
+ -10,
+ GregtechItemList.Pollution_Cleaner_IV.get(1),
+ aBaseAchievementName,
+ false);
+ }
+ this.registerAchievement(
+ "hiampxform",
+ -10,
+ -10,
+ GregtechItemList.Transformer_HA_HV_MV.get(1),
+ aBaseAchievementName,
+ false);
+
+ // Multis (-4/-2/0)
+ this.registerAchievement("multi.pss", -16, -7, GregtechItemList.PowerSubStation.get(1), "multi.abs", false);
+ this.registerAchievement("multi.cyclo", -15, -7, GregtechItemList.COMET_Cyclotron.get(1), "multi.abs", false);
+ this.registerAchievement(
+ "multi.sifter",
+ -14,
+ -7,
+ GregtechItemList.Industrial_Sifter.get(1),
+ "dust.eglin",
+ false);
+ this.registerAchievement(
+ "multi.cokeoven",
+ -13,
+ -7,
+ GregtechItemList.Industrial_CokeOven.get(1),
+ "multi.abs",
+ false);
+ this.registerAchievement(
+ "multi.boiler.thermal",
+ -12,
+ -7,
+ GregtechItemList.GT4_Thermal_Boiler.get(1),
+ "multi.abs",
+ false);
+ this.registerAchievement(
+ "multi.zhuhai",
+ -11,
+ -7,
+ GregtechItemList.Industrial_FishingPond.get(1),
+ aBaseAchievementName,
+ false);
+
+ // Casings
+ this.registerAchievement(
+ "casing.abs",
+ 2,
+ -10,
+ GregtechItemList.Casing_Coil_BlastSmelter.get(1),
+ aBaseAchievementName,
+ false);
+ this.registerAchievement(
+ "casing.cyclotron.coil",
+ 3,
+ -10,
+ GregtechItemList.Casing_Cyclotron_Coil.get(1),
+ aBaseAchievementName,
+ false);
+ this.registerAchievement(
+ "casing.multiuse",
+ 4,
+ -10,
+ GregtechItemList.Casing_Multi_Use.get(1),
+ aBaseAchievementName,
+ false);
+ this.registerAchievement(
+ "casing.containment",
+ 5,
+ -10,
+ GregtechItemList.Casing_Containment.get(1),
+ aBaseAchievementName,
+ false);
+
+ // Radioactive
+ this.registerAchievement(
+ "decay.neptunium238",
+ 11,
+ 8,
+ ItemUtils.getSimpleStack(ModItems.dustNeptunium238),
+ "multi.cyclo",
+ false);
+ this.registerAchievement(
+ "decay.radium226",
+ 12,
+ 8,
+ ItemUtils.getSimpleStack(ModItems.dustRadium226),
+ "multi.cyclo",
+ false);
+ this.registerAchievement(
+ "decay.molybdenum99",
+ 13,
+ 8,
+ ItemUtils.getSimpleStack(ModItems.dustMolybdenum99),
+ "multi.cyclo",
+ false);
+
+ AchievementPage.registerAchievementPage(
+ new AchievementPage(
+ "GT++",
+ this.achievementList.values()
+ .toArray(new Achievement[0])));
+ MinecraftForge.EVENT_BUS.register(this);
+ FMLCommonHandler.instance()
+ .bus()
+ .register(this);
+ }
+
+ public Achievement registerAchievement(String textId, int x, int y, ItemStack icon, String requirement,
+ boolean special) {
+ Achievement achievement = new Achievement(
+ textId,
+ textId,
+ this.adjX + x,
+ this.adjY + y,
+ icon,
+ this.getAchievement(requirement));
+ if (special) {
+ achievement.setSpecial();
+ }
+
+ achievement.registerStat();
+ if (CORE.DEVENV) {
+ GT_Log.out.println("achievement." + textId + "=");
+ GT_Log.out.println("achievement." + textId + ".desc=");
+ }
+
+ this.achievementList.put(textId, achievement);
+ return achievement;
+ }
+
+ public void issueAchievement(EntityPlayer entityplayer, String textId) {
+ if (entityplayer != null) {
+ entityplayer.triggerAchievement(this.achievementList.get(textId));
+ }
+ }
+
+ public Achievement getAchievement(String textId) {
+ return this.achievementList.get(textId);
+ }
+
+ /**
+ * A generic handler that will give an achievement for an item. Useful to only write this once, then call it from
+ * all handlers.
+ *
+ * @param aStack - The Itemstack to check for achievements.
+ * @param aPlayer - The player to unlock for.
+ */
+ private void handleAchivement(ItemStack aStack, EntityPlayer aPlayer) {
+
+ if (aPlayer != null && aStack != null) {
+ /*
+ * Copy this to all events because I am lazy - Alk 2019
+ */
+
+ // Safe name
+ String aUnlocalName = ItemUtils.getUnlocalizedItemName(aStack);
+
+ boolean isValid = false;
+ // Check if valid name // mod
+ String aModID = ItemUtils.getModId(aStack);
+
+ if (aModID == null || aModID.isEmpty()) {
+ return;
+ }
+
+ if (ItemUtils.getModId(aStack)
+ .equals(GTPlusPlus.ID)
+ || ItemUtils.getModId(aStack)
+ .equalsIgnoreCase(GregTech.ID)) {
+ isValid = true;
+ }
+ if (!isValid) {
+ return;
+ }
+
+ // Should unlock base achievement from *ANY* GT++ item. (Too lazy to special case GT machineBlocks though)
+ if (ItemUtils.getModId(aStack)
+ .equals(GTPlusPlus.ID)) {
+ this.issueAchievement(aPlayer, aBaseAchievementName);
+ }
+
+ if (aUnlocalName.contains("item.")) {
+ aUnlocalName = aUnlocalName.substring(5);
+ } else if (aUnlocalName.contains("tile.")) {
+ aUnlocalName = aUnlocalName.substring(5);
+ }
+
+ /*
+ * Misc Blocks
+ */
+ if (aUnlocalName.equals("blockFishTrap")) {
+ this.issueAchievement(aPlayer, "block.fishtrap");
+ }
+ if (aUnlocalName.equals("blockBlackGate")) {
+ this.issueAchievement(aPlayer, "block.withercage");
+ }
+
+ /*
+ * Decayables
+ */
+ if (aUnlocalName.equals("dustNeptunium238")) {
+ this.issueAchievement(aPlayer, "decay.neptunium238");
+ } else if (aUnlocalName.equals("dustRadium226")) {
+ this.issueAchievement(aPlayer, "decay.radium226");
+ } else if (aUnlocalName.equals("dustMolybdenum99")) {
+ this.issueAchievement(aPlayer, "decay.molybdenum99");
+ } else if (aUnlocalName.equals("dustTechnetium99M")) {
+ this.issueAchievement(aPlayer, "decay.technetium99m");
+ } else if (aUnlocalName.equals("dustTechnetium99")) {
+ this.issueAchievement(aPlayer, "decay.technetium99");
+ }
+
+ /*
+ * Random Materials worthy of Achievements
+ */
+ else if (aUnlocalName.equals("itemDustPotin")) {
+ this.issueAchievement(aPlayer, "dust.potin");
+ } else if (aUnlocalName.equals("itemDustEglinSteel")) {
+ this.issueAchievement(aPlayer, "dust.eglin");
+ } else if (aUnlocalName.equals("itemDustStaballoy")) {
+ this.issueAchievement(aPlayer, "dust.staballoy");
+ } else if (aUnlocalName.equals("itemDustQuantum")) {
+ this.issueAchievement(aPlayer, "dust.quantum");
+ } else if (aUnlocalName.equals("itemDustHypogen")) {
+ this.issueAchievement(aPlayer, "dust.hypogen");
+ }
+
+ /*
+ * Machines
+ */
+ else if (aUnlocalName.startsWith("gt.blockmachines.")) {
+
+ // Readability
+ String aStartsWith = "gt.blockmachines.";
+
+ /*
+ * Single Blocks
+ */
+
+ // RTG
+ if (aUnlocalName.startsWith(aStartsWith + "basicgenerator.rtg")) {
+ this.issueAchievement(aPlayer, "rtg");
+ }
+ // Dehydrator
+ else if (aUnlocalName.startsWith(aStartsWith + "machine.dehydrator.tier.")) {
+ this.issueAchievement(aPlayer, "dehydrate");
+ }
+ // SemiFluids
+ else if (aUnlocalName.startsWith(aStartsWith + "basicgenerator.semifluid.tier.")) {
+ this.issueAchievement(aPlayer, "semifluid");
+ }
+ // Simple Washer
+ else if (aUnlocalName.startsWith(aStartsWith + "simplewasher.01.tier.")) {
+ this.issueAchievement(aPlayer, "earlywasher");
+ }
+ // Advanced Boilers
+ else if (aUnlocalName.startsWith(aStartsWith + "electricboiler.")) {
+ this.issueAchievement(aPlayer, "advancedsteam");
+ }
+ // Scrubers
+ else if (aUnlocalName.startsWith(aStartsWith + "pollutioncleaner.01.tier.")) {
+ this.issueAchievement(aPlayer, "pollutionremoval");
+ }
+ // High-amp xformers
+ else if (aUnlocalName.startsWith(aStartsWith + "transformer.ha.tier.")) {
+ this.issueAchievement(aPlayer, "hiampxform");
+ }
+ // Buffered Dynamos
+ else if (aUnlocalName.startsWith(aStartsWith + "hatch.dynamo.buffer.tier.")) {
+ this.issueAchievement(aPlayer, "hatch.dynamo.buffered");
+ }
+ // Control Core Hatch
+ else if (aUnlocalName.startsWith(aStartsWith + "hatch.control.adv")) {
+ this.issueAchievement(aPlayer, "hatch.control");
+ }
+
+ /*
+ * Multis
+ */
+
+ // ABS
+ else if (aUnlocalName.equals(aStartsWith + "industrialsalloyamelter.controller.tier.single")) {
+ this.issueAchievement(aPlayer, "multi.abs");
+ }
+ // PSS
+ else if (aUnlocalName.equals(aStartsWith + "substation.01.input.single")) {
+ this.issueAchievement(aPlayer, "multi.pss");
+ }
+ // Cyclotron
+ else if (aUnlocalName.startsWith(aStartsWith + "cyclotron.tier.single")) {
+ this.issueAchievement(aPlayer, "multi.cyclo");
+ }
+ // Sifter
+ else if (aUnlocalName.equals(aStartsWith + "industrialsifter.controller.tier.single")) {
+ this.issueAchievement(aPlayer, "multi.sifter");
+ }
+ // Coke Oven
+ else if (aUnlocalName.equals(aStartsWith + "industrialcokeoven.controller.tier.single")) {
+ this.issueAchievement(aPlayer, "multi.cokeoven");
+ }
+ // Thermal Boiler
+ else if (aUnlocalName.equals(aStartsWith + "gtplusplus.thermal.boiler")) {
+ this.issueAchievement(aPlayer, "multi.boiler.thermal");
+ }
+ // Zhuhai
+ else if (aUnlocalName.equals(aStartsWith + "industrial.fishpond.controller.tier.single")) {
+ this.issueAchievement(aPlayer, "multi.zhuhai");
+ }
+
+ }
+
+ /*
+ * Casings
+ */
+ else if (aUnlocalName.equals("gtplusplus.blockcasings.14")) {
+ this.issueAchievement(aPlayer, "casing.abs");
+ } else if (aUnlocalName.equals("gtplusplus.blockcasings.2.9")) {
+ this.issueAchievement(aPlayer, "casing.cyclotron.coil");
+ } else if (aUnlocalName.equals("gtplusplus.blockcasings.3.2")) {
+ this.issueAchievement(aPlayer, "casing.multiuse");
+ } else if (aUnlocalName.equals("gtplusplus.blockcasings.3.15")) {
+ this.issueAchievement(aPlayer, "casing.containment");
+ }
+ }
+ }
+
+ /*
+ * Handle achievements for all vanilla types of obtianment.
+ */
+
+ @SubscribeEvent
+ public void onCrafting(ItemCraftedEvent event) {
+ EntityPlayer player = event.player;
+ ItemStack stack = event.crafting;
+ if (player != null && stack != null) {
+ handleAchivement(stack, player);
+ }
+ }
+
+ @SubscribeEvent
+ public void onSmelting(ItemSmeltedEvent event) {
+ EntityPlayer player = event.player;
+ ItemStack stack = event.smelting;
+ if (player != null && stack != null) {
+ handleAchivement(stack, player);
+ }
+ }
+
+ @SubscribeEvent
+ public void onItemPickup(EntityItemPickupEvent event) {
+ EntityPlayer player = event.entityPlayer;
+ ItemStack stack = event.item.getEntityItem();
+ if (player != null && stack != null) {
+ handleAchivement(stack, player);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/BookHandler.java b/gtpp/src/main/java/gtPlusPlus/core/handler/BookHandler.java
new file mode 100644
index 0000000000..5725c1c710
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/BookHandler.java
@@ -0,0 +1,486 @@
+package gtPlusPlus.core.handler;
+
+import static gtPlusPlus.core.util.Utils.addBookPagesLocalization;
+import static gtPlusPlus.core.util.Utils.addBookTitleLocalization;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class BookHandler {
+
+ public static int mBookKeeperCount = 0;
+
+ public static Map<Integer, BookTemplate> mBookMap = new HashMap<>();
+
+ public static BookTemplate book_ThermalBoiler;
+ public static BookTemplate book_MultiPowerStation;
+ public static BookTemplate book_ModularBauble;
+ public static BookTemplate book_MultiMachineManual;
+ public static BookTemplate book_NuclearManual;
+ public static BookTemplate book_MultiChemicalPlant;
+
+ public static void run() {
+
+ Logger.INFO("Writing books.");
+
+ // Thermal Boiler
+ book_ThermalBoiler = writeBookTemplate(
+ "Manual_Thermal_Boiler",
+ "Thermal Boiler Manual",
+ "GregoriusT",
+ new String[] {
+ "This Book explains how to set up and run your Thermal Boiler. We are not responsible for any Damage done by this Book itself nor its content.",
+ "First you need to craft the following things for a Thermal Boiler to Function: The Main Boiler Block, 20 Thermal Containment Casings, two Input Hatches, two Output Hatches, a bunch of different Tools and a Maintenance Hatch.",
+ "To begin the building, lay out the first 3x3 layer of Machine Casings on the ground (with a Hatch in the Middle), then place the Boiler Block facing outward in the middle of one of the 3m wide Sides.",
+ "Now grab 3 other Hatches and place them on the remaining three 3m wide Sides also facing outwards. And now the four corners of the Machine need also a Machine Casing. There should only be a Hole left in the middle of the Cube.",
+ "So, now place a 3x3 of Machine Casings on top, at the 3rd Layer with the last Hatch in the middle facing outwards as well.",
+ "When accessing the Boiler Block, it should now stop telling you, that the structure is incomplete (bottom Line of that Screen). Now go with a bunch of different Tools (Metal Hammer, Rubber Hammer, Screwdriver, Wrench, Soldering Iron and Crowbar)",
+ "to the Maintenance Hatch and access it. After that you grab the 6 Tools and rightclick the Slot with each of them in your Hand in the Maintenance GUI. Note that you need Soldering Tin/Lead in your Inventory to use the Soldering Iron.",
+ "The Main Block should now tell you that you need to use the Rubber Hammer on it to (re)activate the Machine. The Rubber Hammer can enable and disable Machines. The Machine disables itself after something important broke.",
+ "If you want to use Lava with this Device, then you should add a Lava Filter to extract additional Resources from the Lava. If the Filter breaks, the Machine won't explode like a Turbine would. If you use molten Salt, then you won't need a Filter.",
+ "You will get Obsidian when processing Lava, however if a Filter is used, you will get sometimes an Ingot instead of a Block of Obsidian. When using molten Salt, you will get the Salt back.",
+ "So, now for the Maintenance. After a few Hours of running nonstop, your Boiler will get small Problems, which don't prevent it from running, these Problems just decrease Efficiency. Every Problem listed on the Screen does -10% Efficiency.",
+ "To fix these Problems, just go to the Maintenance Hatch and click with the problem corresponding Tool on the Slot to repair. If all six possible runtime Problems happen, the Machine will auto-shutdown no matter what. No Explosion, it's just stopping.",
+ "The Thermal Boiler will produce 800 Liters of Steam per tick for about 5 or 6 Liters of Water per tick at reaching 100% Efficiency. In case of Lava it consumes 1666 Liters every Second.",
+ "A Thermal Boiler is worth about 33 small Thermal Generators, and as the Boilers get much less Efficient, when not having enough Fuel, you should consider making a large Nether Pump for Lava, or a good Nuclear Reactor for molten Salt.",
+ "Input and Output Slots are fully optional, you can place multiple ones of them or even none on the Machine. A Machine without Input couldn't process any Recipes, while a Machine without Output just voids all outputted Items and Liquids.",
+ "It might be useful to use the Screwdriver on the Output Hatches to determine what is outputted where." });
+
+ // Test Novel
+ book_MultiPowerStation = writeBookTemplate(
+ "Manual_Multi_PowerStation",
+ "Power Storage & You [Version 0.64]",
+ "Alkalus",
+ new String[] {
+ // Page 1
+ """
+ So, when it comes to power storage you really have three separate options:
+ \s
+ Battery Buffers,
+ Energy Buffers,
+ The Power Sub-Station
+ """,
+ // Page 2
+ """
+ Battery Buffer
+ \s
+ Is rather portable. Allowing you to throw set one up and insert batteries where ever you may need.
+ They output 1A for each battery stored inside, up to a maximum of 16A.""",
+ // Page 3
+ """
+ Energy Buffer
+ \s
+ Is a more optimal choice for storage in your base. Once placed down, they cannot be moved without losing all stored power.
+ Energy Buffers can output 4A from the output side, however accept 16A as input.""",
+ // Page 4
+ """
+ The Power Sub-Station\s
+ Is used for storing Insane amounts of power later game.
+ Consumes 2% of the average voltage of all energy type hatches every tick.
+ """,
+ // Page 5
+ """
+ Allows Insertion/Removal of power from the rear face of the controller, swap with a screwdriver.
+ Variable Height Structure, between 4-16Y. Inserted Redox Cells dictate max energy tier of structure.
+ """,
+ // Page 6
+ """
+ Redox Cells cannot be placed into the Top or Bottom layer and only take up 3xhx3 internally.
+ Different Tier cells CANNOT be mixed together.
+ """,
+ // Page 7
+ """
+ All Hatches Must be HV at a Minimum, this minimum tier is in place to stop people abusing ULV/LV hatches to lower the avg/t.
+ Currently the GUI will NOT display anything at all until the structure forms, this is a known bug.
+ """,
+ // Page 8
+ """
+ Valid Hatches:
+ Energy Hatch,
+ Dynamo Hatch,
+ Charging Bus,
+ Discharging Bus,
+ Dynamo Buffer,
+ Multi-Amp Dynamo Hatch.
+
+
+ Structure MUST contain at least one energy input and one energy output hatch.""" });
+
+ // Test Novel
+ book_ModularBauble = writeBookTemplate(
+ "Manual_Modular_Bauble",
+ "How to: Modular Baubles",
+ "Alkalus",
+ new String[] {
+ """
+ Concept: This idea came from wanting flexibility.\s
+ First step, Build a Modularity table to begin customisation of your Bauble.\s
+ After this has been constructed, you can now combine the upgrades listed within this book to improve the baubles level/100.""",
+ """
+ Defence:
+ Can be upgraded by combining metal plates with the bauble.\s
+ | +1 | Aluminium\s
+ | +2 | Stainless Steel\s
+ | +3 | Tungsten\s
+ | +4 | Tungsten Steel\s
+ | +5 | Naquadah\s
+ """, "There was once a sad and lonely oak tree. \n", "There was once a sad and lonely oak tree. \n",
+ "There was once a sad and lonely oak tree. \n" });
+
+ // Test Novel
+ // 20/21/22
+ book_MultiMachineManual = writeBookTemplate(
+ "Manual_Multi_Machine",
+ "Multi-Machine Manual",
+ "Alkalus",
+ new String[] {
+ "This Multiblock, depending upon the mode used, can function as a variety of different machines. The idea behind this, was that most of these machines are rather niche compared to any others, as such, not used often.",
+ "To build, you need to construct a hollow 3x3x3 structure made from Multi-Use casings, With a minimum of 6. Any Casing position can be substituted out with an Input Hatch/Bus, an Output Hatch/Bus, Muffler, Maint. Hatch or Energy Injector Hatch.",
+ "The Mode can be set by using a Screwdriver on the controller block. Each mode allows the use of Numbered Circuits, to allow a different machine 'type' for each input bus.",
+ "[Metal Work] Mode Metal - Allows the multiblock to function as a Compressor, a Lathe or an Electro-Magnet. To allow a hatch to run in Compressor mode, insert a No. 20 circuit. For Lathe, use No. 21 and for Electro-Magnet use No. 22.",
+ "[Fluid Work] Mode Fluid - Allows the multiblock to function as a Fermenter, a Fluid Extractor or an Extractor. To allow a hatch to run in Fermenter mode, insert a No. 20 circuit. For Fluid Extractor, use No. 21 and for Extractor use No. 22.",
+ "[Misc. Work] Mode Misc - Allows the multiblock to function as a Laser Engraver, an Autoclave or a Fluid Solidifier. To allow a hatch to run in Laser Engraver mode, insert a No. 20 circuit. For Autoclave, use No. 21 and for Solidifier use No. 22.", });
+
+ book_NuclearManual = writeBookTemplate(
+ "Manual_NuclearStuff_1",
+ "Nuclear Chemistry [FFPP]",
+ "Alkalus",
+ new String[] {
+ // Page 1
+ """
+ Fission Fuel Processing Plant
+ Size: 3x9x3 [LxHxW]
+ Controller: Center, Bottom
+ 4x Input Hatch
+ 2x Output Hatch
+ 1x Output Bus
+ 1x ZPM+ Muffler
+ 1x Maintenance Hatch
+ 1x Energy Hatch
+ """,
+ // Page 2
+ """
+ [1] 7x Hastelloy-X or I/O
+ [2] 5x Incoloy-DS Fluid Containment
+ [3] 4x Zeron-100 Shielding
+ [4] 17x Hastelloy-N Sealant Case
+ Multiblock Construction
+ Convention is [LxHxW]
+
+ """,
+ // Page 3
+ """
+ Layer 1/2:
+ [1][1][1]
+ [1][1][1]
+ [1][1][1]
+
+ Layer 3/5/6
+ [ ][4][ ]
+ [4][2][4]
+ [ ][4][ ]
+
+ """,
+ // Page 4
+ """
+ Layer 4
+ [ ][3][ ]
+ [3][2][3]
+ [ ][3][ ]
+
+ Layer 7/8/9
+ [ ][ ][ ]
+ [ ][3][ ]
+ [ ][ ][ ]
+ """,
+ // Page 5
+ """
+ Fission Fuel
+ Processing Plant----------------------
+ This structure is used to produce the Molten Salts required to run a Liquid Fluorine Thorium Reactor [LFTR].""" });
+
+ book_MultiChemicalPlant = writeBookTemplate(
+ "book_Multi_ChemicalPlant",
+ "Chemical Plant Manual",
+ "Alkalus",
+ new String[] {
+
+ // Intro
+ "This book will explain how the Chemical Plant is constructed, which blocks are valid to upgrade it and also how the upgrades work.",
+
+ // Info
+ """
+ Solid Casings = Plant tier
+ Machine Casings = Hatch tier
+ Higher tier coils More Speed
+ T1 50% , T2 100% , T3 150%, etc
+ """, """
+ Higher tier pipe casings boost parallel
+ and reduce catalyst consumption.
+ +2 parallel per tier, 20% extra chance of
+ not damaging catalyst per tier.""", """
+ Awakened Draconium Coil (or above) with
+ Tungstensteel Pipe Casing
+ does not damage catalyst at all.""",
+
+ // Machine Casings
+ """
+ Valid Solid Machine Casings:
+ 1 - Strong Bronze
+ 2 - Solid Steel
+ 3 - Sturdy Aluminium
+ 4 - Clean Stainless Steel
+ 5 - Stable Titanium
+ 6 - Robust Tungstensteel
+ 7 - Vigorous Laurenium
+ 8 - Rugged Botmium""",
+
+ // Machine Casings
+ "Valid Tiered Machine Casings:" + "\n"
+ + "\n"
+ + "1 - "
+ + GT_Values.VN[0]
+ + "\n"
+ + "2 - "
+ + GT_Values.VN[1]
+ + "\n"
+ + "3 - "
+ + GT_Values.VN[2]
+ + "\n"
+ + "4 - "
+ + GT_Values.VN[3]
+ + "\n"
+ + "5 - "
+ + GT_Values.VN[4]
+ + "\n"
+ + "6 - "
+ + GT_Values.VN[5]
+ + "\n"
+ + "7 - "
+ + GT_Values.VN[6]
+ + "\n"
+ + "8 - "
+ + GT_Values.VN[7]
+ + "\n"
+ + "9 - "
+ + GT_Values.VN[8]
+ + "\n"
+ + "10 - "
+ + GT_Values.VN[9],
+
+ // Pipe Casings
+ """
+ Valid Pipe Casings:
+
+ 1 - Bronze
+ 2 - Steel
+ 3 - Titanium
+ 4 - Tungstensteel""",
+
+ // Coils
+ """
+ Valid Coils:
+
+ 1 - Cupronickel
+ 2 - Kanthal
+ 3 - Nichrome
+ 4 - TPV-Alloy
+ 5 - HSS-G
+ 6 - HSS-S
+ 7 - Naquadah
+ 8 - Naquadah Alloy
+ 9 - Trinium
+ 10 - Fluxed Electrum""", """
+ 11 - Awakened Draconium
+ 12 - Infinity
+ 13 - Hypogen
+ 14 - Eternal""",
+
+ // Requirements
+ """
+ Multiblock Requirements:
+
+ 27x Coils
+ 18x Pipe Casings
+ 57x Tiered Machine Casings
+ 70+ Solid Casings
+ 1x Catalyst Housing (Catalysts cannot go inside an Input Bus)""",
+
+ // Construction Guide
+ """
+ Construction Guide Pt1:
+
+ Controller is placed on a middle casing in the bottom layer
+ Hatches can only be placed on the bottom layer edges""", """
+ Construction Guide Pt2:
+
+ 7x7x7 Hollow frame of solid casings
+ 5x1x5 layer of solid casings (fills in top layer)
+ 5x1x5 layer of machine casings (fills in bottom layer)""", """
+ Construction Guide Pt3:
+ In the central 3x5x3:
+ 3x1x3 layer of Coils, surrounded by ring of Machine Casings
+ 3x1x3 layer of Pipe Casings
+ 3x1x3 layer of Coils
+ 3x1x3 layer of Pipe Casings
+ 3x1x3 layer of Coils, surrounded by ring of Machine Casings""",
+
+ // Construction Guide Info
+ """
+ Information:
+
+ A = Air
+ X = Solid Casing
+ M = Machine Casing
+ P = Pipe Casing
+ C = Coil Casing""", """
+ Layer 1:
+
+ XXXXXXX
+ XMMMMMX
+ XMMMMMX
+ XMMMMMX
+ XMMMMMX
+ XMMMMMX
+ XXXXXXX""", """
+ Layer 2:
+
+ XAAAAAX
+ AMMMMMA
+ AMCCCMA
+ AMCCCMA
+ AMCCCMA
+ AMMMMMA
+ XAAAAAX""", """
+ Layer 3:
+
+ XAAAAAX
+ AAAAAAA
+ AAPPPAA
+ AAPPPAA
+ AAPPPAA
+ AAAAAAA
+ XAAAAAX""", """
+ Layer 4:
+
+ XAAAAAX
+ AAAAAAA
+ AACCCAA
+ AACCCAA
+ AACCCAA
+ AAAAAAA
+ XAAAAAX""", """
+ Layer 5:
+
+ XAAAAAX
+ AAAAAAA
+ AAPPPAA
+ AAPPPAA
+ AAPPPAA
+ AAAAAAA
+ XAAAAAX""", """
+ Layer 6:
+
+ XAAAAAX
+ AMMMMMA
+ AMCCCMA
+ AMCCCMA
+ AMCCCMA
+ AMMMMMA
+ XAAAAAX""", """
+ Layer 7:
+
+ XXXXXXX
+ XXXXXXX
+ XXXXXXX
+ XXXXXXX
+ XXXXXXX
+ XXXXXXX
+ XXXXXXX""", });
+ }
+
+ public static ItemStack ItemBookWritten_ThermalBoiler;
+ public static ItemStack ItemBookWritten_NuclearManual;
+ public static ItemStack ItemBookWritten_ModularBaubles;
+ public static ItemStack ItemBookWritten_MultiPowerStorage;
+ public static ItemStack ItemBookWritten_MultiMachineManual;
+ public static ItemStack ItemBookWritten_MultiChemicalPlant;
+
+ public static void runLater() {
+ ItemBookWritten_ThermalBoiler = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, 0, 1);
+ ItemBookWritten_MultiPowerStorage = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, 1, 1);
+ ItemBookWritten_ModularBaubles = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, 2, 1);
+ ItemBookWritten_MultiMachineManual = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, 3, 1);
+ ItemBookWritten_NuclearManual = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, 4, 1);
+ ItemBookWritten_MultiChemicalPlant = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, 5, 1);
+
+ // Multiblock Manuals
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(Items.writable_book),
+ ItemUtils.getSimpleStack(Items.lava_bucket) },
+ ItemBookWritten_ThermalBoiler);
+ GT_ModHandler.addCraftingRecipe(
+ ItemBookWritten_MultiMachineManual,
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "Xw", 'X', ItemUtils.getSimpleStack(Items.writable_book) });
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(Items.writable_book),
+ ItemUtils.getItemStackOfAmountFromOreDict("wireGt01Tin", 1) },
+ ItemBookWritten_MultiPowerStorage);
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(Items.writable_book),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustUranium", 1) },
+ ItemBookWritten_NuclearManual);
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(Items.writable_book),
+ ItemUtils.getItemStackOfAmountFromOreDict("wireGt01Copper", 1) },
+ ItemBookWritten_MultiChemicalPlant);
+
+ for (int i = 0; i < mBookKeeperCount; i++) {
+ ItemStack bookstack = ItemUtils.simpleMetaStack(ModItems.itemCustomBook, i, 1);
+ GT_OreDictUnificator.registerOre("bookWritten", bookstack);
+ GT_OreDictUnificator.registerOre("craftingBook", bookstack);
+ }
+ }
+
+ private static BookTemplate writeBookTemplate(String aMapping, String aTitle, String aAuthor, String[] aPages) {
+ mBookKeeperCount++;
+ for (int i = 0; i < aPages.length; i++) {
+ aPages[i] = aPages[i].replaceAll("\n", "<BR>");
+ }
+ addBookTitleLocalization(aTitle);
+ addBookPagesLocalization(aTitle, aPages);
+ BookTemplate mTemp = new BookTemplate(mBookKeeperCount, aMapping, aTitle, aAuthor, aPages);
+ mBookMap.put(mBookKeeperCount - 1, mTemp);
+ return mTemp;
+ }
+
+ public static class BookTemplate {
+
+ public final int mMeta;
+ public final String mMapping;
+ public final String mTitle;
+ public final String mAuthor;
+ public final String[] mPages;
+
+ BookTemplate(int aMeta, String aMapping, String aTitle, String aAuthor, String[] aPages) {
+ this.mMeta = aMeta;
+ this.mMapping = aMapping;
+ this.mTitle = aTitle;
+ this.mAuthor = aAuthor;
+ this.mPages = aPages;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/BurnableFuelHandler.java b/gtpp/src/main/java/gtPlusPlus/core/handler/BurnableFuelHandler.java
new file mode 100644
index 0000000000..8e3377b5f9
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/BurnableFuelHandler.java
@@ -0,0 +1,35 @@
+package gtPlusPlus.core.handler;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.IFuelHandler;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BurnableFuelHandler implements IFuelHandler {
+
+ @Override
+ public int getBurnTime(ItemStack aStack) {
+ // Iterate over my burnables.
+ for (Pair<Integer, ItemStack> temp : CORE.burnables) {
+ int aStackID = Item.getIdFromItem(aStack.getItem());
+ int burnID = Item.getIdFromItem(
+ temp.getValue()
+ .getItem());
+ if (aStackID == burnID) {
+ int burn = temp.getKey();
+ ItemStack fuel = temp.getValue();
+ ItemStack testItem = ItemUtils.getSimpleStack(fuel, aStack.stackSize);
+
+ if (aStack.isItemEqual(testItem)) {
+ return burn;
+ }
+ }
+ }
+
+ // If it's not my fuel, return 0.
+ return 0;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/COMPAT_HANDLER.java b/gtpp/src/main/java/gtPlusPlus/core/handler/COMPAT_HANDLER.java
new file mode 100644
index 0000000000..cf276d90a1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/COMPAT_HANDLER.java
@@ -0,0 +1,299 @@
+package gtPlusPlus.core.handler;
+
+import static gregtech.api.enums.Mods.ExtraUtilities;
+import static gregtech.api.enums.Mods.PamsHarvestCraft;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.enums.Mods.Witchery;
+
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.core.common.compat.COMPAT_ExtraUtils;
+import gtPlusPlus.core.common.compat.COMPAT_HarvestCraft;
+import gtPlusPlus.core.common.compat.COMPAT_IC2;
+import gtPlusPlus.core.common.compat.COMPAT_Thaumcraft;
+import gtPlusPlus.core.common.compat.COMPAT_Witchery;
+import gtPlusPlus.core.handler.Recipes.LateRegistrationHandler;
+import gtPlusPlus.core.handler.Recipes.RegistrationHandler;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.recipe.RECIPES_GREGTECH;
+import gtPlusPlus.core.recipe.RECIPES_LaserEngraver;
+import gtPlusPlus.core.recipe.ShapedRecipeObject;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_FluidCanning;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Recycling;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_ChemicalSkips;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_GTNH;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_GlueLine;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_Nuclear;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.Gregtech4Content;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechAdvancedBoilers;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechAlgaeContent;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechAmazonWarehouse;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechBufferDynamos;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechCustomHatches;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechCyclotron;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechDehydrator;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechEnergyBuffer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechFactoryGradeReplacementMultis;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechGeothermalThermalGenerator;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechHiAmpTransformer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialAlloySmelter;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialArcFurnace;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialBlastSmelter;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialCentrifuge;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialChisel;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialCokeOven;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialCuttingFactory;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialElectrolyzer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialElementDuplicator;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialExtruder;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialFishPond;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialFluidHeater;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialForgeHammer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialFuelRefinery;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialMacerator;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialMassFabricator;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialMixer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialMultiMachine;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialPlatePress;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialRockBreaker;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialSifter;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialThermalCentrifuge;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialTreeFarm;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialWashPlant;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIndustrialWiremill;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechIsaMill;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechLFTR;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechLargeTurbinesAndHeatExchanger;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechMolecularTransformer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechNuclearSaltProcessingPlant;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechPollutionDevices;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechPowerSubStation;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechQuantumForceTransformer;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechRTG;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechRocketFuelGenerator;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechSemiFluidgenerators;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechSimpleWasher;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechSolarTower;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechSteamMultis;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechSuperChests;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechThaumcraftDevices;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechThreadedBuffers;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechTieredFluidTanks;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechTreeFarmerTE;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechWirelessChargers;
+
+public class COMPAT_HANDLER {
+
+ public static Queue<Object> RemoveRecipeQueue = new LinkedList<>();
+ public static Queue<ShapedRecipeObject> AddRecipeQueue = new LinkedList<>();
+ public static Boolean areInitItemsLoaded = false;
+
+ public static void registerMyModsOreDictEntries() {
+
+ Logger.INFO("Registering Materials with OreDict.");
+ // In-house
+
+ for (int i = 1; i <= 10; i++) {
+ GT_OreDictUnificator.registerOre(
+ "bufferCore_" + GT_Values.VN[i - 1],
+ new ItemStack(ItemUtils.getItemFromFQRN("miscutils:item.itemBufferCore" + i)));
+ }
+ }
+
+ public static void registerGregtechMachines() {
+ // Free IDs
+ /*
+ * --- 859 to 868 --- 911 to 940
+ */
+
+ new RECIPES_LaserEngraver();
+ GregtechEnergyBuffer.run();
+ GregtechLFTR.run();
+ GregtechNuclearSaltProcessingPlant.run();
+ GregtechIndustrialCentrifuge.run();
+ GregtechIndustrialCokeOven.run();
+ GregtechIndustrialPlatePress.run();
+ GregtechRocketFuelGenerator.run();
+ GregtechIndustrialElectrolyzer.run();
+ GregtechIndustrialMacerator.run();
+ GregtechIndustrialWiremill.run();
+ GregtechIndustrialMassFabricator.run();
+ GregtechIndustrialBlastSmelter.run();
+ GregtechQuantumForceTransformer.run();
+ GregtechPowerSubStation.run();
+ GregtechDehydrator.run();
+ GregtechAdvancedBoilers.run();
+ GregtechPollutionDevices.run();
+ GregtechTieredFluidTanks.run();
+ GregtechGeothermalThermalGenerator.run();
+ Gregtech4Content.run();
+ GregtechIndustrialFuelRefinery.run();
+ GregtechTreeFarmerTE.run();
+ GregtechIndustrialTreeFarm.run();
+ GregtechIndustrialSifter.run();
+ GregtechSimpleWasher.run();
+ GregtechRTG.run();
+ GregtechCyclotron.run();
+ GregtechHiAmpTransformer.run();
+ GregtechIndustrialThermalCentrifuge.run();
+ GregtechIndustrialWashPlant.run();
+ GregtechSemiFluidgenerators.run();
+ GregtechWirelessChargers.run();
+ GregtechIndustrialCuttingFactory.run();
+ GregtechSuperChests.run();
+ GregtechIndustrialFishPond.run();
+ GregtechIndustrialExtruder.run();
+ GregtechIndustrialMultiMachine.run();
+ GregtechBufferDynamos.run();
+ GregtechAmazonWarehouse.run();
+ GregtechFactoryGradeReplacementMultis.run();
+ GregtechThaumcraftDevices.run();
+ GregtechThreadedBuffers.run();
+ GregtechIndustrialMixer.run();
+ GregtechCustomHatches.run();
+ GregtechIndustrialArcFurnace.run();
+ GregtechSolarTower.run();
+ GregtechLargeTurbinesAndHeatExchanger.run();
+ GregtechAlgaeContent.run();
+ GregtechIndustrialAlloySmelter.run();
+ GregtechIsaMill.run();
+ GregtechSteamMultis.run();
+ GregtechIndustrialForgeHammer.run();
+ GregtechMolecularTransformer.run();
+ GregtechIndustrialElementDuplicator.run();
+ GregtechIndustrialRockBreaker.run();
+ GregtechIndustrialChisel.run();
+ GregtechIndustrialFluidHeater.run();
+ }
+
+ // InterMod
+ public static void intermodOreDictionarySupport() {
+ if (Thaumcraft.isModLoaded()) {
+ COMPAT_Thaumcraft.OreDict();
+ }
+ if (ExtraUtilities.isModLoaded()) {
+ COMPAT_ExtraUtils.OreDict();
+ }
+ if (PamsHarvestCraft.isModLoaded()) {
+ COMPAT_HarvestCraft.OreDict();
+ }
+ COMPAT_IC2.OreDict();
+ if (Witchery.isModLoaded()) {
+ COMPAT_Witchery.OreDict();
+ }
+ }
+
+ public static void RemoveRecipesFromOtherMods() {
+ // Removal of Recipes
+ for (final Object item : RemoveRecipeQueue) {
+ RecipeUtils.removeCraftingRecipe(item);
+ }
+ }
+
+ public static void InitialiseHandlerThenAddRecipes() {
+ RegistrationHandler.run();
+ }
+
+ public static void InitialiseLateHandlerThenAddRecipes() {
+ LateRegistrationHandler.run();
+ }
+
+ public static void startLoadingGregAPIBasedRecipes() {
+ // Add hand-made recipes
+ RECIPES_GREGTECH.run();
+ RecipeLoader_GTNH.generate();
+ RecipeLoader_Nuclear.generate();
+ RecipeLoader_GlueLine.generate();
+ RecipeLoader_ChemicalSkips.generate();
+ // Add autogenerated Recipes from Item Components
+ for (Set<RunnableWithInfo<Material>> m : MaterialGenerator.mRecipeMapsToGenerate) {
+ for (RunnableWithInfo<Material> r : m) {
+ try {
+ r.run();
+ Logger.INFO(
+ "[FIND] " + r.getInfoData()
+ .getLocalizedName() + " recipes generated.");
+ } catch (Throwable t) {
+ t.printStackTrace();
+ Logger.INFO(
+ "[ERROR] " + r.getInfoData()
+ .getLocalizedName() + " recipes failed to generated.");
+ }
+ }
+ }
+ RecipeGen_Recycling.executeGenerators();
+ runQueuedMisc();
+
+ // Do Fluid Canning Last, because they're not executed on demand, but rather queued.
+ RecipeGen_FluidCanning.init();
+ }
+
+ public static void onLoadComplete(FMLLoadCompleteEvent event) {
+ runQueuedOnLoadComplete(event);
+ }
+
+ public static final AutoMap<RunnableWithInfo<String>> mRecipesToGenerate = new AutoMap<>();
+ public static final AutoMap<RunnableWithInfo<String>> mGtRecipesToGenerate = new AutoMap<>();
+
+ public static final AutoMap<RunnableWithInfo<String>> mObjectsToRunInPostInit = new AutoMap<>();
+ public static final AutoMap<ItemPackage> mObjectsToRunInOnLoadComplete = new AutoMap<>();
+
+ public static void runQueuedRecipes() {
+ // Add autogenerated Recipes from Item Components
+ for (RunnableWithInfo<String> m : mRecipesToGenerate) {
+ try {
+ m.run();
+ } catch (Throwable t) {
+ t.printStackTrace();
+ Logger.INFO("[ERROR] " + m.getInfoData() + " recipe failed to generated.");
+ }
+ }
+ for (RunnableWithInfo<String> m : mGtRecipesToGenerate) {
+ try {
+ m.run();
+ } catch (Throwable t) {
+ t.printStackTrace();
+ Logger.INFO("[ERROR] " + m.getInfoData() + " recipe failed to generated.");
+ }
+ }
+ }
+
+ public static void runQueuedMisc() {
+ for (RunnableWithInfo<String> m : mObjectsToRunInPostInit) {
+ try {
+ m.run();
+ } catch (Throwable t) {
+ t.printStackTrace();
+ Logger.INFO("[ERROR] " + m.getInfoData());
+ }
+ }
+ }
+
+ /**
+ * Generally used to register GT recipe map changes after they've been populated.
+ */
+ public static void runQueuedOnLoadComplete(FMLLoadCompleteEvent event) {
+ for (ItemPackage m : mObjectsToRunInOnLoadComplete) {
+ try {
+ m.onLoadComplete(event);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ Logger.INFO("[ERROR] " + m.getInfoData());
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/COMPAT_IntermodStaging.java b/gtpp/src/main/java/gtPlusPlus/core/handler/COMPAT_IntermodStaging.java
new file mode 100644
index 0000000000..af09762c08
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/COMPAT_IntermodStaging.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.core.handler;
+
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import gtPlusPlus.recipes.RecipeRemovals;
+import gtPlusPlus.xmod.bartcrops.HANDLER_CropsPlusPlus;
+import gtPlusPlus.xmod.bop.HANDLER_BiomesOPlenty;
+import gtPlusPlus.xmod.forestry.HANDLER_FR;
+import gtPlusPlus.xmod.gregtech.HANDLER_GT;
+import gtPlusPlus.xmod.ic2.HANDLER_IC2;
+import gtPlusPlus.xmod.railcraft.HANDLER_Railcraft;
+import gtPlusPlus.xmod.thermalfoundation.HANDLER_TF;
+import gtPlusPlus.xmod.tinkers.HANDLER_Tinkers;
+
+public class COMPAT_IntermodStaging {
+
+ public static void preInit(FMLPreInitializationEvent preinit) {
+ HANDLER_GT.preInit();
+ HANDLER_TF.preInit();
+ HANDLER_FR.preInit();
+ HANDLER_IC2.preInit();
+ HANDLER_BiomesOPlenty.preInit();
+ HANDLER_CropsPlusPlus.preInit(preinit);
+ HANDLER_Railcraft.preInit();
+ }
+
+ public static void init(FMLInitializationEvent init) {
+ HANDLER_GT.init();
+ HANDLER_TF.init();
+ }
+
+ public static void postInit(FMLPostInitializationEvent postinit) {
+ HANDLER_GT.postInit();
+ HANDLER_TF.postInit();
+ HANDLER_FR.postInit();
+ HANDLER_IC2.postInit();
+ HANDLER_BiomesOPlenty.postInit();
+ HANDLER_Tinkers.postInit();
+ HANDLER_CropsPlusPlus.postInit(postinit);
+ HANDLER_Railcraft.postInit();
+ RecipeRemovals.postInit();
+ }
+
+ public static void onLoadComplete(FMLLoadCompleteEvent event) {
+ HANDLER_GT.onLoadComplete(event);
+ RecipeRemovals.onLoadComplete();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/GuiHandler.java b/gtpp/src/main/java/gtPlusPlus/core/handler/GuiHandler.java
new file mode 100644
index 0000000000..d5d0859472
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/GuiHandler.java
@@ -0,0 +1,159 @@
+package gtPlusPlus.core.handler;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.network.IGuiHandler;
+import cpw.mods.fml.common.network.NetworkRegistry;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.machine.Machine_SuperJukebox.TileEntitySuperJukebox;
+import gtPlusPlus.core.container.Container_CircuitProgrammer;
+import gtPlusPlus.core.container.Container_DecayablesChest;
+import gtPlusPlus.core.container.Container_FishTrap;
+import gtPlusPlus.core.container.Container_PestKiller;
+import gtPlusPlus.core.container.Container_ProjectTable;
+import gtPlusPlus.core.container.Container_SuperJukebox;
+import gtPlusPlus.core.container.Container_VolumetricFlaskSetter;
+import gtPlusPlus.core.gui.beta.Gui_ID_Registry;
+import gtPlusPlus.core.gui.beta.MU_GuiId;
+import gtPlusPlus.core.gui.machine.GUI_CircuitProgrammer;
+import gtPlusPlus.core.gui.machine.GUI_DecayablesChest;
+import gtPlusPlus.core.gui.machine.GUI_FishTrap;
+import gtPlusPlus.core.gui.machine.GUI_PestKiller;
+import gtPlusPlus.core.gui.machine.GUI_ProjectTable;
+import gtPlusPlus.core.gui.machine.GUI_SuperJukebox;
+import gtPlusPlus.core.gui.machine.GUI_VolumetricFlaskSetter;
+import gtPlusPlus.core.interfaces.IGuiManager;
+import gtPlusPlus.core.tileentities.general.TileEntityCircuitProgrammer;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+import gtPlusPlus.core.tileentities.general.TileEntityFishTrap;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+import gtPlusPlus.core.tileentities.machines.TileEntityPestKiller;
+import gtPlusPlus.core.tileentities.machines.TileEntityProjectTable;
+
+public class GuiHandler implements IGuiHandler {
+
+ public static final int GUI1 = 0; // Project Table
+ public static final int GUI2 = 1; // None
+ public static final int GUI3 = 2; // None
+ public static final int GUI4 = 3; // Workbench
+ public static final int GUI5 = 4; // Workbench Adv
+ public static final int GUI6 = 5; // Fish trap
+ public static final int GUI7 = 6; // None
+ public static final int GUI8 = 7; // Circuit Programmer
+ public static final int GUI9 = 8; // None
+ public static final int GUI10 = 9; // None
+ public static final int GUI11 = 10; // None
+ public static final int GUI12 = 11; // None
+ public static final int GUI13 = 12; // Decayables Chest
+ public static final int GUI14 = 13; // Super Jukebox
+ public static final int GUI15 = 14; // Pest Killer
+ public static final int GUI16 = 15; // None
+ public static final int GUI17 = 16; // None
+ public static final int GUI18 = 17; // Volumetric Flask Setter
+
+ public static void init() {
+ Logger.INFO("Registering GUIs.");
+ NetworkRegistry.INSTANCE.registerGuiHandler(GTplusplus.instance, new GuiHandler());
+ }
+
+ @Override // ContainerModTileEntity
+ public Object getServerGuiElement(final int ID, final EntityPlayer player, final World world, final int x,
+ final int y, final int z) {
+ final TileEntity te = world.getTileEntity(x, y, z);
+
+ if (te != null) {
+ if (ID == GUI1) {
+ return new Container_ProjectTable(player.inventory, (TileEntityProjectTable) te);
+ } else if (ID == GUI2) {}
+ }
+
+ if (te != null) {
+ if (ID == GUI5) {
+ Logger.INFO("sad");
+ // return new Container_WorkbenchAdvanced(player.inventory, (TileEntityWorkbenchAdvanced) te);
+ } else if (ID == GUI6) {
+ return new Container_FishTrap(player.inventory, (TileEntityFishTrap) te);
+ } else if (ID == GUI8) {
+ return new Container_CircuitProgrammer(player.inventory, (TileEntityCircuitProgrammer) te);
+ } else if (ID == GUI13) {
+ return new Container_DecayablesChest(player.inventory, (TileEntityDecayablesChest) te);
+ } else if (ID == GUI14) {
+ return new Container_SuperJukebox(player.inventory, (TileEntitySuperJukebox) te);
+ } else if (ID == GUI15) {
+ return new Container_PestKiller(player.inventory, (TileEntityPestKiller) te);
+ } else if (ID == GUI18) {
+ return new Container_VolumetricFlaskSetter(player.inventory, (TileEntityVolumetricFlaskSetter) te);
+ }
+ }
+
+ return null;
+ }
+
+ @Override // GuiModTileEntity
+ public Object getClientGuiElement(final int ID, final EntityPlayer player, final World world, final int x,
+ final int y, final int z) {
+ Logger.WARNING(
+ "getClientGuiElement Called by: " + player
+ + ", in world: "
+ + player.dimension
+ + " at x:"
+ + x
+ + ", y:"
+ + y
+ + ", z:"
+ + z
+ + ".");
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if (te != null) {
+ if (ID == GUI1) {
+ return new GUI_ProjectTable(player.inventory, (TileEntityProjectTable) te);
+ }
+ }
+
+ if (te != null) {
+ if (ID == GUI6) {
+ return new GUI_FishTrap(player.inventory, (TileEntityFishTrap) te);
+ } else if (ID == GUI8) {
+ return new GUI_CircuitProgrammer(player.inventory, (TileEntityCircuitProgrammer) te);
+ } else if (ID == GUI13) {
+ return new GUI_DecayablesChest(player.inventory, (TileEntityDecayablesChest) te);
+ } else if (ID == GUI14) {
+ return new GUI_SuperJukebox(player.inventory, (TileEntitySuperJukebox) te);
+ } else if (ID == GUI15) {
+ return new GUI_PestKiller(player.inventory, (TileEntityPestKiller) te);
+ } else if (ID == GUI18) {
+ return new GUI_VolumetricFlaskSetter(
+ new Container_VolumetricFlaskSetter(player.inventory, (TileEntityVolumetricFlaskSetter) te));
+ }
+ }
+
+ return null;
+ }
+
+ // New Methods
+ public static void openGui(final EntityPlayer entityplayer, final IGuiManager guiHandler) {
+ openGui(entityplayer, guiHandler, (short) 0);
+ }
+
+ public static void openGui(final EntityPlayer entityplayer, final IGuiManager guiHandler, final short data) {
+ final int guiData = encodeGuiData(guiHandler, data);
+ final ChunkCoordinates coordinates = guiHandler.getCoordinates();
+ entityplayer.openGui(
+ GTplusplus.instance,
+ guiData,
+ entityplayer.worldObj,
+ coordinates.posX,
+ coordinates.posY,
+ coordinates.posZ);
+ }
+
+ private static int encodeGuiData(final IGuiManager guiHandler, final short data) {
+ final MU_GuiId guiId = Gui_ID_Registry.getGuiIdForGuiHandler(guiHandler);
+ return (data << 16) | guiId.getId();
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/PacketHandler.java b/gtpp/src/main/java/gtPlusPlus/core/handler/PacketHandler.java
new file mode 100644
index 0000000000..af6a376f1a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/PacketHandler.java
@@ -0,0 +1,94 @@
+package gtPlusPlus.core.handler;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+
+import cpw.mods.fml.common.network.NetworkRegistry;
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper;
+import cpw.mods.fml.relauncher.Side;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.network.handler.AbstractClientMessageHandler;
+import gtPlusPlus.core.network.packet.AbstractPacket;
+import gtPlusPlus.core.network.packet.Packet_VolumetricFlaskGui;
+import gtPlusPlus.core.network.packet.Packet_VolumetricFlaskGui2;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class PacketHandler {
+
+ private static byte packetId = 0;
+
+ private static final SimpleNetworkWrapper INSTANCE = NetworkRegistry.INSTANCE.newSimpleChannel(GTPlusPlus.ID);
+
+ public static final void init() {
+ registerMessage(Packet_VolumetricFlaskGui.class, Packet_VolumetricFlaskGui.class);
+ registerMessage(Packet_VolumetricFlaskGui2.class, Packet_VolumetricFlaskGui2.class);
+ }
+
+ /**
+ * Registers a message and message handler
+ */
+ private static void registerMessage(Class handlerClass, Class messageClass) {
+ Side side = AbstractClientMessageHandler.class.isAssignableFrom(handlerClass) ? Side.CLIENT : Side.SERVER;
+ registerMessage(handlerClass, messageClass, side);
+ }
+
+ private static void registerMessage(Class handlerClass, Class messageClass, Side side) {
+ INSTANCE.registerMessage(handlerClass, messageClass, packetId++, side);
+ if (AbstractPacket.class.isInstance(messageClass.getClass())) {
+ AbstractPacket aPacket = ReflectionUtils.createNewInstanceFromConstructor(
+ ReflectionUtils.getConstructor(messageClass, new Class[] {}),
+ new Object[] {});
+ if (aPacket != null) {
+ Logger.INFO("Registered Packet: " + aPacket.getPacketName());
+ }
+ }
+ }
+
+ /**
+ * Send this message to the specified player. See {@link SimpleNetworkWrapper#sendTo(IMessage, EntityPlayerMP)}
+ */
+ public static final void sendTo(IMessage message, EntityPlayerMP player) {
+ INSTANCE.sendTo(message, player);
+ }
+
+ /**
+ * Send this message to everyone within a certain range of a point. See
+ * {@link SimpleNetworkWrapper#sendToDimension(IMessage, NetworkRegistry.TargetPoint)}
+ */
+ public static final void sendToAllAround(IMessage message, NetworkRegistry.TargetPoint point) {
+ INSTANCE.sendToAllAround(message, point);
+ }
+
+ /**
+ * Sends a message to everyone within a certain range of the coordinates in the same dimension.
+ */
+ public static final void sendToAllAround(IMessage message, int dimension, double x, double y, double z,
+ double range) {
+ sendToAllAround(message, new NetworkRegistry.TargetPoint(dimension, x, y, z, range));
+ }
+
+ /**
+ * Sends a message to everyone within a certain range of the player provided.
+ */
+ public static final void sendToAllAround(IMessage message, EntityPlayer player, double range) {
+ sendToAllAround(message, player.worldObj.provider.dimensionId, player.posX, player.posY, player.posZ, range);
+ }
+
+ /**
+ * Send this message to everyone within the supplied dimension. See
+ * {@link SimpleNetworkWrapper#sendToDimension(IMessage, int)}
+ */
+ public static final void sendToDimension(IMessage message, int dimensionId) {
+ INSTANCE.sendToDimension(message, dimensionId);
+ }
+
+ /**
+ * Send this message to the server. See {@link SimpleNetworkWrapper#sendToServer(IMessage)}
+ */
+ public static final void sendToServer(IMessage message) {
+ INSTANCE.sendToServer(message);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/Recipes/DecayableRecipe.java b/gtpp/src/main/java/gtPlusPlus/core/handler/Recipes/DecayableRecipe.java
new file mode 100644
index 0000000000..e50a76d5d5
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/Recipes/DecayableRecipe.java
@@ -0,0 +1,38 @@
+package gtPlusPlus.core.handler.Recipes;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class DecayableRecipe {
+
+ public static final AutoMap<DecayableRecipe> mRecipes = new AutoMap<>();
+
+ public final int mTime;
+ public final ItemStack mInput;
+ public final ItemStack mOutput;
+
+ public DecayableRecipe(int time, ItemStack input, ItemStack output) {
+ mTime = time;
+ mInput = input;
+ mOutput = output;
+ mRecipes.put(this);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof DecayableRecipe i) {
+ if (i.mTime == this.mTime && GT_Utility.areStacksEqual(mInput, i.mInput)
+ && GT_Utility.areStacksEqual(mOutput, i.mOutput)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isValid() {
+ return (mTime > 0 && ItemUtils.checkForInvalidItems(mInput) && ItemUtils.checkForInvalidItems(mOutput));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/Recipes/LateRegistrationHandler.java b/gtpp/src/main/java/gtPlusPlus/core/handler/Recipes/LateRegistrationHandler.java
new file mode 100644
index 0000000000..9eb3a1826e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/Recipes/LateRegistrationHandler.java
@@ -0,0 +1,27 @@
+package gtPlusPlus.core.handler.Recipes;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.handler.COMPAT_HANDLER;
+import gtPlusPlus.core.recipe.ShapedRecipeObject;
+
+public class LateRegistrationHandler {
+
+ public static int recipesSuccess = 0;
+ public static int recipesFailed = 0;
+
+ public static void run() {
+ init();
+ }
+
+ private static void init() {
+ for (final ShapedRecipeObject item : COMPAT_HANDLER.AddRecipeQueue) {
+ item.buildRecipe();
+ }
+ try {
+ Thread.sleep(10);
+ } catch (final InterruptedException e) {
+ Logger.INFO(e.toString());
+ }
+ Logger.INFO("Late Recipes Loaded: " + recipesSuccess + " Failed: " + recipesFailed);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/Recipes/RegistrationHandler.java b/gtpp/src/main/java/gtPlusPlus/core/handler/Recipes/RegistrationHandler.java
new file mode 100644
index 0000000000..abf7300f7a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/Recipes/RegistrationHandler.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.core.handler.Recipes;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.handler.COMPAT_HANDLER;
+import gtPlusPlus.core.recipe.RECIPES_General;
+import gtPlusPlus.core.recipe.RECIPES_Machines;
+import gtPlusPlus.core.recipe.RECIPE_Batteries;
+
+public class RegistrationHandler {
+
+ public static int recipesSuccess = 0;
+ public static int recipesFailed = 0;
+
+ public static void run() {
+ init();
+ }
+
+ private static void init() {
+ RECIPES_General.loadRecipes();
+ RECIPES_Machines.loadRecipes();
+ RECIPE_Batteries.loadRecipes();
+ Logger.INFO("Loaded: " + recipesSuccess + " Failed: " + recipesFailed);
+ COMPAT_HANDLER.areInitItemsLoaded = true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/events/CustomMovementHandler.java b/gtpp/src/main/java/gtPlusPlus/core/handler/events/CustomMovementHandler.java
new file mode 100644
index 0000000000..390efe0b35
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/events/CustomMovementHandler.java
@@ -0,0 +1,144 @@
+package gtPlusPlus.core.handler.events;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.client.settings.GameSettings;
+import net.minecraft.util.MovementInputFromOptions;
+
+/*
+ * Replacement for MovementInputFromOptions - Built from the source of ToggleSneak 3.0.3
+ */
+
+public class CustomMovementHandler {
+
+ public boolean isDisabled;
+ public boolean canDoubleTap;
+
+ public boolean sprint = false;
+ public boolean sprintHeldAndReleased = false;
+ public boolean sprintDoubleTapped = false;
+
+ private long lastPressed;
+ private long lastSprintPressed;
+ private boolean handledSneakPress;
+ private boolean handledSprintPress;
+ private boolean wasRiding;
+
+ /*
+ * MovementInputFromOptions.updatePlayerMoveState()
+ */
+ public void update(final Minecraft mc, final MovementInputFromOptions options, final EntityPlayerSP thisPlayer) {
+ options.moveStrafe = 0.0F;
+ options.moveForward = 0.0F;
+
+ final GameSettings settings = mc.gameSettings;
+
+ if (settings.keyBindForward.getIsKeyPressed()) {
+ ++options.moveForward;
+ }
+
+ if (settings.keyBindBack.getIsKeyPressed()) {
+ --options.moveForward;
+ }
+
+ if (settings.keyBindLeft.getIsKeyPressed()) {
+ ++options.moveStrafe;
+ }
+
+ if (settings.keyBindRight.getIsKeyPressed()) {
+ --options.moveStrafe;
+ }
+
+ options.jump = settings.keyBindJump.getIsKeyPressed();
+
+ //
+ // Sneak Toggle - Essentially the same as old ToggleSneak
+ //
+
+ // Check to see if Enabled - Added 6/17/14 to provide option to disable Sneak Toggle
+ final boolean isSneaking = SneakManager.get(thisPlayer)
+ .Sneaking();
+ if (isSneaking) {
+ // Key Pressed
+ if (settings.keyBindSneak.getIsKeyPressed() && !this.handledSneakPress) {
+ // Descend if we are flying, note if we were riding (so we can unsneak once dismounted)
+ if (thisPlayer.isRiding() || thisPlayer.capabilities.isFlying) {
+ options.sneak = true;
+ this.wasRiding = thisPlayer.isRiding();
+ } else {
+ options.sneak = !options.sneak;
+ }
+
+ this.lastPressed = System.currentTimeMillis();
+ this.handledSneakPress = true;
+ }
+
+ // Key Released
+ if (!settings.keyBindSneak.getIsKeyPressed() && this.handledSneakPress) {
+ // If we are flying or riding, stop sneaking after descent/dismount.
+ if (thisPlayer.capabilities.isFlying || this.wasRiding) {
+ options.sneak = false;
+ this.wasRiding = false;
+ }
+ // If the key was held down for more than 300ms, stop sneaking upon release.
+ else if ((System.currentTimeMillis() - this.lastPressed) > 300L) {
+ options.sneak = false;
+ }
+
+ this.handledSneakPress = false;
+ }
+ } else {
+ options.sneak = settings.keyBindSneak.getIsKeyPressed();
+ }
+
+ if (options.sneak || SneakManager.get(thisPlayer)
+ .Sneaking()) {
+ options.moveStrafe = (float) (options.moveStrafe * 0.3D);
+ options.moveForward = (float) (options.moveForward * 0.3D);
+ }
+
+ //
+ // Sprint Toggle - Updated 6/18/2014
+ //
+
+ // Establish conditions where we don't want to start a sprint - sneaking, riding, flying, hungry
+ final boolean enoughHunger = (thisPlayer.getFoodStats()
+ .getFoodLevel() > 6.0F) || thisPlayer.capabilities.isFlying;
+ final boolean canSprint = !options.sneak && !thisPlayer.isRiding()
+ && !thisPlayer.capabilities.isFlying
+ && enoughHunger;
+
+ this.isDisabled = !SneakManager.get(thisPlayer)
+ .Sprinting();
+ this.canDoubleTap = SneakManager.get(thisPlayer).optionDoubleTap;
+
+ // Key Pressed
+ if ((canSprint || this.isDisabled) && settings.keyBindSprint.getIsKeyPressed() && !this.handledSprintPress) {
+ if (!this.isDisabled) {
+ this.sprint = !this.sprint;
+ this.lastSprintPressed = System.currentTimeMillis();
+ this.handledSprintPress = true;
+ this.sprintHeldAndReleased = false;
+ }
+ }
+
+ // Key Released
+ if ((canSprint || this.isDisabled) && !settings.keyBindSprint.getIsKeyPressed() && this.handledSprintPress) {
+ // Was key held for longer than 300ms? If so, mark it so we can resume vanilla behavior
+ if ((System.currentTimeMillis() - this.lastSprintPressed) > 300L) {
+ this.sprintHeldAndReleased = true;
+ }
+ this.handledSprintPress = false;
+ }
+ }
+
+ public void UpdateSprint(final boolean newValue, final boolean doubleTapped, SneakManager aSneak) {
+ if (!aSneak.Sprinting()) {
+ this.sprint = false;
+ this.sprintDoubleTapped = doubleTapped;
+ } else {
+ this.sprint = newValue;
+ this.sprintDoubleTapped = doubleTapped;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/events/EnderDragonDeathHandler.java b/gtpp/src/main/java/gtPlusPlus/core/handler/events/EnderDragonDeathHandler.java
new file mode 100644
index 0000000000..07b027faa1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/events/EnderDragonDeathHandler.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.core.handler.events;
+
+import net.minecraft.entity.boss.EntityDragon;
+import net.minecraftforge.event.entity.living.LivingDropsEvent;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class EnderDragonDeathHandler {
+
+ private static final String mDragonClassName = "chylex.hee.entity.boss.EntityBossDragon";
+ private static final boolean mHEE;
+ private static final Class mHardcoreDragonClass;
+
+ private static final String mChaosDragonClassName = "com.brandon3055.draconicevolution.common.entity.EntityCustomDragon";
+ private static final boolean mDE;
+ private static final Class mChaoseDragonClass;
+
+ static {
+ mHEE = ReflectionUtils.doesClassExist(mDragonClassName);
+ mHardcoreDragonClass = (mHEE ? ReflectionUtils.getClass(mDragonClassName) : null);
+ mDE = ReflectionUtils.doesClassExist(mChaosDragonClassName);
+ mChaoseDragonClass = (mDE ? ReflectionUtils.getClass(mChaosDragonClassName) : null);
+ }
+
+ @SubscribeEvent
+ public void onEntityDrop(LivingDropsEvent event) {
+
+ int aCountTotal = 0;
+
+ if (mHEE && mHardcoreDragonClass != null && mHardcoreDragonClass.isInstance(event.entityLiving)) {
+ for (int y = 0; y < MathUtils.randInt(100, 250); y++) {
+ int aAmount = MathUtils.randInt(5, 25);
+ event.entityLiving
+ .entityDropItem(ELEMENT.STANDALONE.DRAGON_METAL.getNugget(aAmount), MathUtils.randFloat(0, 1));
+ aCountTotal = +aAmount;
+ }
+ } else if (mDE && mChaoseDragonClass != null && mChaoseDragonClass.isInstance(event.entityLiving)) {
+ for (int y = 0; y < MathUtils.randInt(100, 200); y++) {
+ int aAmount = MathUtils.randInt(1, 5);
+ event.entityLiving
+ .entityDropItem(ELEMENT.STANDALONE.DRAGON_METAL.getIngot(aAmount), MathUtils.randFloat(0, 1));
+ aCountTotal = +aAmount;
+ }
+ } else if (event.entityLiving instanceof EntityDragon) {
+ for (int y = 0; y < MathUtils.randInt(25, 50); y++) {
+ int aAmount = MathUtils.randInt(1, 10);
+ event.entityLiving
+ .entityDropItem(ELEMENT.STANDALONE.DRAGON_METAL.getNugget(aAmount), MathUtils.randFloat(0, 1));
+ aCountTotal = +aAmount;
+ }
+ }
+ if (aCountTotal > 0) {
+ PlayerUtils
+ .messageAllPlayers(aCountTotal + " Shards of Dragons Blood have crystalized into a metallic form.");
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/events/EntityDeathHandler.java b/gtpp/src/main/java/gtPlusPlus/core/handler/events/EntityDeathHandler.java
new file mode 100644
index 0000000000..20d64f2b36
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/events/EntityDeathHandler.java
@@ -0,0 +1,126 @@
+package gtPlusPlus.core.handler.events;
+
+import java.util.HashMap;
+import java.util.HashSet;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.event.entity.living.LivingDropsEvent;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Triplet;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class EntityDeathHandler {
+
+ private static final HashMap<Class, AutoMap<Triplet<ItemStack, Integer, Integer>>> mMobDropMap = new HashMap<>();
+ private static final HashSet<Class> mInternalClassKeyCache = new HashSet<>();
+
+ /**
+ * Provides the ability to provide custom drops upon the death of EntityLivingBase objects.
+ *
+ * @param aMobClass - The Base Class you want to drop this item.
+ * @param aStack - The ItemStack, stack size is not respected.
+ * @param aMaxAmount - The maximum size of the ItemStack which drops.
+ * @param aChance - Chance out of 10000, where 100 is 1%. (1 = 0.01% - this is ok)
+ */
+ public static void registerDropsForMob(Class aMobClass, ItemStack aStack, int aMaxAmount, int aChance) {
+ Triplet<ItemStack, Integer, Integer> aData = new Triplet<>(aStack, aMaxAmount, aChance);
+ AutoMap<Triplet<ItemStack, Integer, Integer>> aDataMap = mMobDropMap.get(aMobClass);
+ if (aDataMap == null) {
+ aDataMap = new AutoMap<>();
+ }
+ aDataMap.put(aData);
+ mMobDropMap.put(aMobClass, aDataMap);
+
+ Logger.INFO(
+ "[Loot] Registered " + aStack
+ .getDisplayName() + " (1-" + aMaxAmount + ") as a valid drop for " + aMobClass.getCanonicalName());
+
+ mInternalClassKeyCache.add(aMobClass);
+ }
+
+ private static ItemStack processItemDropTriplet(Triplet<ItemStack, Integer, Integer> aData) {
+ ItemStack aLoot = aData.getValue_1();
+ int aMaxDrop = aData.getValue_2();
+ int aChanceOutOf10000 = aData.getValue_3();
+ if (MathUtils.randInt(0, 10000) <= aChanceOutOf10000) {
+ aLoot = ItemUtils.getSimpleStack(aLoot, MathUtils.randInt(1, aMaxDrop));
+ if (ItemUtils.checkForInvalidItems(aLoot)) {
+ return aLoot;
+ }
+ }
+ return null;
+ }
+
+ private static boolean processDropsForMob(EntityLivingBase entityLiving) {
+ AutoMap<Triplet<ItemStack, Integer, Integer>> aMobData = mMobDropMap.get(entityLiving.getClass());
+ boolean aDidDrop = false;
+ if (aMobData != null) {
+ if (!aMobData.isEmpty()) {
+ ItemStack aPossibleDrop;
+ for (Triplet<ItemStack, Integer, Integer> g : aMobData) {
+ aPossibleDrop = processItemDropTriplet(g);
+ if (aPossibleDrop != null) {
+ if (entityLiving.entityDropItem(aPossibleDrop, MathUtils.randFloat(0, 1)) != null) {
+ aDidDrop = true;
+ }
+ }
+ }
+ }
+ }
+ return aDidDrop;
+ }
+
+ private static void dropMeatFromPlayer(EntityPlayer aPlayer) {
+
+ // always drop some meat.
+ int aBigMeatStackSize1 = MathUtils.randInt(4, 8);
+ aPlayer.entityDropItem(
+ ItemUtils.simpleMetaStack(ModItems.itemMetaFood, 0, aBigMeatStackSize1),
+ MathUtils.randInt(0, 1));
+
+ // additional chances for more meat.
+ if (MathUtils.randInt(0, 10) < 7) {
+ int aBigMeatStackSize2 = MathUtils.randInt(4, 8);
+ aPlayer.entityDropItem(
+ ItemUtils.simpleMetaStack(ModItems.itemMetaFood, 0, aBigMeatStackSize2),
+ MathUtils.randInt(0, 1));
+ }
+ if (MathUtils.randInt(0, 10) < 4) {
+ int aBigMeatStackSize3 = MathUtils.randInt(4, 8);
+ aPlayer.entityDropItem(
+ ItemUtils.simpleMetaStack(ModItems.itemMetaFood, 0, aBigMeatStackSize3),
+ MathUtils.randInt(0, 1));
+ }
+ if (MathUtils.randInt(0, 10) < 2) {
+ int aBigMeatStackSize4 = MathUtils.randInt(4, 8);
+ aPlayer.entityDropItem(
+ ItemUtils.simpleMetaStack(ModItems.itemMetaFood, 0, aBigMeatStackSize4),
+ MathUtils.randInt(0, 1));
+ }
+ }
+
+ @SubscribeEvent
+ public void onEntityDrop(LivingDropsEvent event) {
+ if (event == null || event.entityLiving == null) {
+ return;
+ }
+ if (PlayerUtils.isRealPlayer(event.entityLiving)) {
+ EntityPlayer aPlayer = (EntityPlayer) event.entityLiving;
+ dropMeatFromPlayer(aPlayer);
+ } else {
+ for (Class<?> c : mInternalClassKeyCache) {
+ if (c.isInstance(event.entityLiving)) {
+ processDropsForMob(event.entityLiving);
+ }
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/events/GeneralTooltipEventHandler.java b/gtpp/src/main/java/gtPlusPlus/core/handler/events/GeneralTooltipEventHandler.java
new file mode 100644
index 0000000000..650fd70efd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/events/GeneralTooltipEventHandler.java
@@ -0,0 +1,20 @@
+package gtPlusPlus.core.handler.events;
+
+import net.minecraft.item.Item;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.event.entity.player.ItemTooltipEvent;
+
+import advsolar.common.AdvancedSolarPanel;
+import cpw.mods.fml.common.Optional;
+import gregtech.api.enums.Mods;
+
+public class GeneralTooltipEventHandler {
+
+ @Optional.Method(modid = Mods.Names.ADVANCED_SOLAR_PANEL)
+ @SuppressWarnings("unused")
+ public static void molecularTransformer(ItemTooltipEvent event) {
+ if (event.itemStack.getItem() == Item.getItemFromBlock(AdvancedSolarPanel.blockMolecularTransformer)) {
+ event.toolTip.add("" + EnumChatFormatting.RED + "Disabled, Use the multiblock");
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/events/PlayerSleepEventHandler.java b/gtpp/src/main/java/gtPlusPlus/core/handler/events/PlayerSleepEventHandler.java
new file mode 100644
index 0000000000..0ca315cc72
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/events/PlayerSleepEventHandler.java
@@ -0,0 +1,109 @@
+package gtPlusPlus.core.handler.events;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
+import net.minecraftforge.event.entity.player.PlayerWakeUpEvent;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.potion.GtPotionEffect;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+
+public class PlayerSleepEventHandler {
+
+ private static Field sEffectDuration = ReflectionUtils
+ .getField(PotionEffect.class, !CORE_Preloader.DEV_ENVIRONMENT ? "field_76460_b" : "duration");
+ private static ArrayList<Potion> sPositiveEffects = new ArrayList<>();
+ private static ArrayList<Potion> sNegativeEffects = new ArrayList<>();
+
+ public static void init() {
+ Utils.registerEvent(new PlayerSleepEventHandler());
+ sPositiveEffects.add(Potion.moveSpeed);
+ sPositiveEffects.add(Potion.waterBreathing);
+ sPositiveEffects.add(Potion.resistance);
+ sPositiveEffects.add(Potion.regeneration);
+ sPositiveEffects.add(Potion.damageBoost);
+ sPositiveEffects.add(Potion.digSpeed);
+ sPositiveEffects.add(Potion.fireResistance);
+ sPositiveEffects.add(Potion.field_76434_w); // Health Boost
+ sPositiveEffects.add(Potion.field_76444_x); // Absorption
+ sNegativeEffects.add(Potion.blindness);
+ sNegativeEffects.add(Potion.confusion);
+ sNegativeEffects.add(Potion.digSlowdown);
+ sNegativeEffects.add(Potion.harm);
+ sNegativeEffects.add(Potion.hunger);
+ sNegativeEffects.add(Potion.moveSlowdown);
+ sNegativeEffects.add(Potion.poison);
+ sNegativeEffects.add(Potion.weakness);
+ sNegativeEffects.add(Potion.wither);
+ }
+
+ @SubscribeEvent
+ public void sleep(PlayerSleepInBedEvent event) {}
+
+ @SubscribeEvent
+ public void wake(PlayerWakeUpEvent event) {
+ EntityPlayer aPlayer = event.entityPlayer;
+ if (aPlayer != null && !aPlayer.worldObj.isRemote) {
+ if (event.entityPlayer.getEntityWorld()
+ .getWorldTime() % 24000 != 0) {
+ return;
+ }
+ boolean aRemovedBad = false;
+ try {
+ Collection<PotionEffect> aActive = aPlayer.getActivePotionEffects();
+ for (PotionEffect aEffect : aActive) {
+ for (Potion aBadPotion : sNegativeEffects) {
+ if (aEffect.getPotionID() == aBadPotion.getId()) {
+ ReflectionUtils.setField(aEffect, sEffectDuration, 1);
+ aRemovedBad = true;
+ Logger.INFO("Set duration of " + aEffect.getEffectName() + " to 1 tick");
+ }
+ }
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ if (aRemovedBad) {
+ messagePlayer(aPlayer, "sleep.event.downsides");
+ } else {
+ // Try Heal
+ float aCurrentHP = aPlayer.getHealth();
+ float aMaxHP = aPlayer.getMaxHealth();
+ if (aCurrentHP < aMaxHP) {
+ float aDamage = aMaxHP - aCurrentHP;
+ float aToHeal = MathUtils.randFloat(1, aDamage);
+ if (aToHeal > 0) {
+ aPlayer.heal(aToHeal);
+ messagePlayer(aPlayer, (aToHeal >= aDamage / 2 ? "sleep.event.good" : "sleep.event.okay"));
+ }
+ }
+ // Already healed, try give a buff
+ else {
+ int aRandomBuff = MathUtils.randInt(0, sPositiveEffects.size() - 1);
+ Potion aPotionToApply = sPositiveEffects.get(aRandomBuff);
+ if (aPotionToApply != null) {
+ aPlayer.addPotionEffect(
+ new GtPotionEffect(aPotionToApply.id, MathUtils.randInt(60, 180), MathUtils.randInt(0, 2)));
+ messagePlayer(aPlayer, "sleep.event.wellrested");
+ }
+ }
+ }
+ }
+ }
+
+ private static void messagePlayer(EntityPlayer aPlayer, String aChatKey) {
+ PlayerUtils.messagePlayer(aPlayer, new ChatComponentTranslation(aChatKey, new Object[0]));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/events/SneakManager.java b/gtpp/src/main/java/gtPlusPlus/core/handler/events/SneakManager.java
new file mode 100644
index 0000000000..7af831c675
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/events/SneakManager.java
@@ -0,0 +1,131 @@
+package gtPlusPlus.core.handler.events;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.entity.player.EntityPlayer;
+
+import gtPlusPlus.api.objects.Logger;
+
+public class SneakManager {
+
+ // We make this a singleton for clientside data storage.
+
+ public static ConcurrentHashMap<String, SneakManager> mPlayerCache = new ConcurrentHashMap<>();
+
+ private static void addPlayer(EntityPlayer aPlayer) {
+ String aKey = getKey(aPlayer);
+ if (!mPlayerCache.containsKey(aKey)) {
+ mPlayerCache.put(aKey, new SneakManager(aPlayer));
+ }
+ }
+
+ public static SneakManager get(EntityPlayer aPlayer) {
+
+ String aKey = getKey(aPlayer);
+ if (!mPlayerCache.containsKey(aKey)) {
+ addPlayer(aPlayer);
+ }
+ return mPlayerCache.get(aKey);
+ }
+
+ private static String getKey(EntityPlayer aPlayer) {
+ return "" + aPlayer.getGameProfile()
+ .getId()
+ .toString();
+ }
+
+ public SneakManager instance;
+ public EntityPlayer owner;
+ public boolean canSprint = true;
+ public boolean isSneaking = true;
+ public boolean optionDoubleTap = true;
+ public boolean wasSprintDisabled = false;
+ public boolean mIsWearingRing = false;
+
+ private State Sprinting = State.ON;
+ private State Crouching = State.OFF;
+
+ public SneakManager(EntityPlayer aPlayer) {
+ owner = aPlayer;
+ }
+
+ public boolean Sneaking() {
+ return Crouching.getState();
+ }
+
+ public boolean Sprinting() {
+ return Sprinting.getState();
+ }
+
+ public State getSneakingState() {
+ return Crouching;
+ }
+
+ public State getSprintingDisabledState() {
+ return Sprinting;
+ }
+
+ public void toggleSneaking() {
+ toggleState(Crouching);
+ }
+
+ public void toggleSprinting() {
+ toggleState(Sprinting);
+ }
+
+ private State toggleState(final State state) {
+ Logger.INFO("State Toggle");
+ if (state == State.ON) {
+ return State.OFF;
+ }
+ return State.ON;
+ }
+
+ private State setCrouchingStateON() {
+ return Crouching = State.ON;
+ }
+
+ private State setCrouchingStateOFF() {
+ return Crouching = State.OFF;
+ }
+
+ private State setSprintingStateON() {
+ return Sprinting = State.ON;
+ }
+
+ private State setSprintingStateOFF() {
+ return Sprinting = State.OFF;
+ }
+
+ public void putRingOn() {
+ mIsWearingRing = true;
+ setSprintingStateOFF();
+ setCrouchingStateON();
+ }
+
+ public void takeRingOff() {
+ mIsWearingRing = false;
+ setSprintingStateON();
+ setCrouchingStateOFF();
+ }
+
+ public boolean isWearingRing() {
+ return mIsWearingRing;
+ }
+
+ public static enum State {
+
+ ON(true),
+ OFF(false);
+
+ private final boolean STATE;
+
+ private State(final boolean State) {
+ this.STATE = State;
+ }
+
+ public boolean getState() {
+ return this.STATE;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/handler/workbench/Workbench_CraftingHandler.java b/gtpp/src/main/java/gtPlusPlus/core/handler/workbench/Workbench_CraftingHandler.java
new file mode 100644
index 0000000000..6933c0f82d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/handler/workbench/Workbench_CraftingHandler.java
@@ -0,0 +1,161 @@
+package gtPlusPlus.core.handler.workbench;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.inventory.InventoryCrafting;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.IRecipe;
+import net.minecraft.item.crafting.ShapedRecipes;
+import net.minecraft.item.crafting.ShapelessRecipes;
+import net.minecraft.world.World;
+
+public class Workbench_CraftingHandler {
+
+ private static final Workbench_CraftingHandler instance = new Workbench_CraftingHandler();
+ private final List<IRecipe> recipes = new ArrayList<>();
+
+ public static final Workbench_CraftingHandler getInstance() {
+ return instance;
+ }
+
+ public Workbench_CraftingHandler() {
+
+ // just a example recipe so you know how to add them
+ this.addRecipe(
+ new ItemStack(Blocks.iron_block),
+ new Object[] { "###", "###", "###", Character.valueOf('#'), Items.iron_ingot });
+
+ // another example Recipe, but shapeless
+ this.addShapelessRecipe(new ItemStack(Items.cake), new Object[] { Items.stick });
+ }
+
+ void addRecipe(final ItemStack par1ItemStack, final Object par2ArrayOfObj[]) {
+ String s = "";
+ int i = 0;
+ int j = 0;
+ int k = 0;
+
+ if (par2ArrayOfObj[i] instanceof String[]) {
+ final String as[] = (String[]) par2ArrayOfObj[i++];
+
+ for (final String s2 : as) {
+ k++;
+ j = s2.length();
+ s = (new StringBuilder()).append(s)
+ .append(s2)
+ .toString();
+ }
+ } else {
+ while (par2ArrayOfObj[i] instanceof String) {
+ final String s1 = (String) par2ArrayOfObj[i++];
+ k++;
+ j = s1.length();
+ s = (new StringBuilder()).append(s)
+ .append(s1)
+ .toString();
+ }
+ }
+
+ final HashMap<Character, ItemStack> hashmap = new HashMap<>();
+
+ for (; i < par2ArrayOfObj.length; i += 2) {
+ final Character character = (Character) par2ArrayOfObj[i];
+ ItemStack itemstack = null;
+
+ if (par2ArrayOfObj[i + 1] instanceof Item) {
+ itemstack = new ItemStack((Item) par2ArrayOfObj[i + 1]);
+ } else if (par2ArrayOfObj[i + 1] instanceof Block) {
+ itemstack = new ItemStack((Block) par2ArrayOfObj[i + 1], 1, -1);
+ } else if (par2ArrayOfObj[i + 1] instanceof ItemStack) {
+ itemstack = (ItemStack) par2ArrayOfObj[i + 1];
+ }
+
+ hashmap.put(character, itemstack);
+ }
+
+ final ItemStack aitemstack[] = new ItemStack[j * k];
+
+ for (int i1 = 0; i1 < (j * k); i1++) {
+ final char c = s.charAt(i1);
+
+ if (hashmap.containsKey(Character.valueOf(c))) {
+ aitemstack[i1] = hashmap.get(Character.valueOf(c))
+ .copy();
+ } else {
+ aitemstack[i1] = null;
+ }
+ }
+
+ this.recipes.add(new ShapedRecipes(j, k, aitemstack, par1ItemStack));
+ }
+
+ public void addShapelessRecipe(final ItemStack par1ItemStack, final Object par2ArrayOfObj[]) {
+ final ArrayList<ItemStack> arraylist = new ArrayList<>();
+ final Object aobj[] = par2ArrayOfObj;
+ final int i = aobj.length;
+
+ for (final Object obj : aobj) {
+ if (obj instanceof ItemStack) {
+ arraylist.add(((ItemStack) obj).copy());
+ continue;
+ }
+
+ if (obj instanceof Item) {
+ arraylist.add(new ItemStack((Item) obj));
+ continue;
+ }
+
+ if (obj instanceof Block) {
+ arraylist.add(new ItemStack((Block) obj));
+ } else {
+ throw new RuntimeException("Invalid shapeless recipe!");
+ }
+ }
+
+ this.recipes.add(new ShapelessRecipes(par1ItemStack, arraylist));
+ }
+
+ public ItemStack findMatchingRecipe(final InventoryCrafting par1InventoryCrafting, final World par2World) {
+ int i = 0;
+ for (int j = 0; j < par1InventoryCrafting.getSizeInventory(); j++) {
+ final ItemStack itemstack2 = par1InventoryCrafting.getStackInSlot(j);
+
+ if (itemstack2 == null) {
+ continue;
+ }
+
+ if (i == 0) {}
+
+ if (i == 1) {}
+
+ i++;
+ }
+
+ // TODO - Update from itemIDs
+ /*
+ * if (i == 2 && itemstack.itemID == itemstack1.itemID && itemstack.stackSize == 1 && itemstack1.stackSize == 1
+ * && Item.itemsList[itemstack.itemID].isDamageable()) { Item item = Item.itemsList[itemstack.itemID]; int l =
+ * item.getMaxDamage() - itemstack.getItemDamageForDisplay(); int i1 = item.getMaxDamage() -
+ * itemstack1.getItemDamageForDisplay(); int j1 = l + i1 + (item.getMaxDamage() * 10) / 100; int k1 =
+ * item.getMaxDamage() - j1; if (k1 < 0) { k1 = 0; } return new ItemStack(itemstack.itemID, 1, k1); }
+ */
+
+ for (final IRecipe irecipe : this.recipes) {
+ if (irecipe.matches(par1InventoryCrafting, par2World)) {
+ return irecipe.getCraftingResult(par1InventoryCrafting);
+ }
+ }
+
+ return null;
+ }
+
+ public List<IRecipe> getRecipeList() {
+ return this.recipes;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/interfaces/IGuiManager.java b/gtpp/src/main/java/gtPlusPlus/core/interfaces/IGuiManager.java
new file mode 100644
index 0000000000..599ed6b59b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/interfaces/IGuiManager.java
@@ -0,0 +1,16 @@
+package gtPlusPlus.core.interfaces;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+
+public abstract interface IGuiManager extends IGuiManagerMiscUtils {
+
+ public abstract ChunkCoordinates getCoordinates();
+
+ public abstract World getWorld();
+
+ public abstract Object getGui(EntityPlayer paramEntityPlayer, int paramInt);
+
+ public abstract Object getContainer(EntityPlayer paramEntityPlayer, int paramInt);
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/interfaces/IGuiManagerMiscUtils.java b/gtpp/src/main/java/gtPlusPlus/core/interfaces/IGuiManagerMiscUtils.java
new file mode 100644
index 0000000000..f7f1194b9a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/interfaces/IGuiManagerMiscUtils.java
@@ -0,0 +1,4 @@
+package gtPlusPlus.core.interfaces;
+
+public abstract interface IGuiManagerMiscUtils {
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/interfaces/IItemBlueprint.java b/gtpp/src/main/java/gtPlusPlus/core/interfaces/IItemBlueprint.java
new file mode 100644
index 0000000000..b0fa752f3f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/interfaces/IItemBlueprint.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.core.interfaces;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+public interface IItemBlueprint {
+
+ /**
+ * The inventory size for the blueprint~
+ */
+ public int INV_SIZE = 9;
+
+ /**
+ * Meta Compatible function to allow meta items to be blueprints
+ *
+ * @param stack yourMetaItem
+ * @return true if it is a Blueprint
+ */
+ public boolean isBlueprint(ItemStack stack);
+
+ /**
+ * Sets the blueprint for this itemstack.
+ *
+ * @param stack yourMetaItem
+ * @return true if blueprint is set successfully
+ */
+ public boolean setBlueprint(ItemStack stack, IInventory craftingTable, ItemStack output);
+
+ /**
+ * Sets the name of the recipe/blueprint
+ *
+ * @param String Blueprint Name
+ * @return N/A
+ */
+ public void setBlueprintName(ItemStack stack, String name);
+
+ /**
+ * Does this itemstack hold a blueprint?
+ *
+ * @param stack yourMetaItem
+ * @return true if is holding a Blueprint
+ */
+ public boolean hasBlueprint(ItemStack stack);
+
+ /**
+ * Gets the recipe held by the item
+ *
+ * @param stack yourMetaItem
+ * @return the blueprints contents
+ */
+ public ItemStack[] getBlueprint(ItemStack stack);
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/inventories/InventoryCircuitProgrammer.java b/gtpp/src/main/java/gtPlusPlus/core/inventories/InventoryCircuitProgrammer.java
new file mode 100644
index 0000000000..180df60e81
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/inventories/InventoryCircuitProgrammer.java
@@ -0,0 +1,156 @@
+package gtPlusPlus.core.inventories;
+
+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 gtPlusPlus.core.slots.SlotIntegratedCircuit;
+
+public class InventoryCircuitProgrammer implements IInventory {
+
+ private final String name = "Circuit Programmer";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 26;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return SlotIntegratedCircuit.isItemValidForSlot(itemstack);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/inventories/InventoryFishTrap.java b/gtpp/src/main/java/gtPlusPlus/core/inventories/InventoryFishTrap.java
new file mode 100644
index 0000000000..e4797d67bc
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/inventories/InventoryFishTrap.java
@@ -0,0 +1,157 @@
+package gtPlusPlus.core.inventories;
+
+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;
+
+public class InventoryFishTrap implements IInventory {
+
+ private final String name = "Fishtrap";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 15;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/inventories/InventoryPestKiller.java b/gtpp/src/main/java/gtPlusPlus/core/inventories/InventoryPestKiller.java
new file mode 100644
index 0000000000..b508de1d6d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/inventories/InventoryPestKiller.java
@@ -0,0 +1,157 @@
+package gtPlusPlus.core.inventories;
+
+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;
+
+public class InventoryPestKiller implements IInventory {
+
+ private final String name = "Pest Killer";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 3;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_DecayablesChest.java b/gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_DecayablesChest.java
new file mode 100644
index 0000000000..83b3631fe9
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_DecayablesChest.java
@@ -0,0 +1,157 @@
+package gtPlusPlus.core.inventories;
+
+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;
+
+public class Inventory_DecayablesChest implements IInventory {
+
+ private final String name = "DecayablesChest";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 15;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_EggBox.java b/gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_EggBox.java
new file mode 100644
index 0000000000..04a95a4f9a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_EggBox.java
@@ -0,0 +1,157 @@
+package gtPlusPlus.core.inventories;
+
+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;
+
+public class Inventory_EggBox implements IInventory {
+
+ private final String name = "EggBox";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 15;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_SuperJukebox.java b/gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_SuperJukebox.java
new file mode 100644
index 0000000000..bd44e89776
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_SuperJukebox.java
@@ -0,0 +1,154 @@
+package gtPlusPlus.core.inventories;
+
+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;
+
+public class Inventory_SuperJukebox implements IInventory {
+
+ private final String name = "Sir Mixalot";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 21;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_VolumetricFlaskSetter.java b/gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_VolumetricFlaskSetter.java
new file mode 100644
index 0000000000..25a03aa212
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/inventories/Inventory_VolumetricFlaskSetter.java
@@ -0,0 +1,156 @@
+package gtPlusPlus.core.inventories;
+
+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 gtPlusPlus.xmod.gregtech.common.helpers.VolumetricFlaskHelper;
+
+public class Inventory_VolumetricFlaskSetter implements IInventory {
+
+ private final String name = "Volumetric Flask Setter";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 9;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ // Utils.LOG_INFO("Trying to read NBT data from inventory.");
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ // Utils.LOG_INFO("Trying to write NBT data to inventory.");
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 16;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return VolumetricFlaskHelper.isVolumetricFlask(itemstack);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectMain.java b/gtpp/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectMain.java
new file mode 100644
index 0000000000..40e848dc3c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectMain.java
@@ -0,0 +1,173 @@
+package gtPlusPlus.core.inventories.projecttable;
+
+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;
+
+public class InventoryProjectMain implements IInventory {
+
+ private final String name = "Inventory Grid";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 9;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ /**
+ * @param itemstack - the ItemStack to which this inventory belongs
+ */
+ public InventoryProjectMain() {}
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ // Utils.LOG_INFO("getStackInSlot["+slot+"]");
+ try {
+ if (slot >= this.inventory.length) {
+ // Utils.LOG_INFO("Returning invalid slot item.");
+ return null;
+ }
+ return this.inventory[slot];
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return null;
+ }
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ if (slot >= this.inventory.length) {
+ return;
+ }
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectOutput.java b/gtpp/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectOutput.java
new file mode 100644
index 0000000000..77bcbd1e35
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/inventories/projecttable/InventoryProjectOutput.java
@@ -0,0 +1,160 @@
+package gtPlusPlus.core.inventories.projecttable;
+
+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;
+
+public class InventoryProjectOutput implements IInventory {
+
+ private final String name = "Inventory Output";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 2;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ /**
+ * @param itemstack - the ItemStack to which this inventory belongs
+ */
+ public InventoryProjectOutput() {}
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeMain.java b/gtpp/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeMain.java
new file mode 100644
index 0000000000..24dd053e31
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeMain.java
@@ -0,0 +1,173 @@
+package gtPlusPlus.core.inventories.tradetable;
+
+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;
+
+public class InventoryTradeMain implements IInventory {
+
+ private final String name = "Inventory Grid";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 9;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ /**
+ * @param itemstack - the ItemStack to which this inventory belongs
+ */
+ public InventoryTradeMain() {}
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ // Utils.LOG_INFO("getStackInSlot["+slot+"]");
+ try {
+ if (slot >= this.inventory.length) {
+ // Utils.LOG_INFO("Returning invalid slot item.");
+ return null;
+ }
+ return this.inventory[slot];
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return null;
+ }
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ if (slot >= this.inventory.length) {
+ return;
+ }
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeOutput.java b/gtpp/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeOutput.java
new file mode 100644
index 0000000000..edfbe7602e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/inventories/tradetable/InventoryTradeOutput.java
@@ -0,0 +1,160 @@
+package gtPlusPlus.core.inventories.tradetable;
+
+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;
+
+public class InventoryTradeOutput implements IInventory {
+
+ private final String name = "Inventory Output";
+
+ /** Defining your inventory size this way is handy */
+ public static final int INV_SIZE = 2;
+
+ /** Inventory's size must be same as number of slots you add to the Container class */
+ private ItemStack[] inventory = new ItemStack[INV_SIZE];
+
+ /**
+ * @param itemstack - the ItemStack to which this inventory belongs
+ */
+ public InventoryTradeOutput() {}
+
+ public void readFromNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = nbt.getTagList("Items", 10);
+ this.inventory = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ this.inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+
+ public void writeToNBT(final NBTTagCompound nbt) {
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = this.inventory[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Items", list);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.inventory.length;
+ }
+
+ public ItemStack[] getInventory() {
+ return this.inventory;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.inventory[slot];
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int amount) {
+ ItemStack stack = this.getStackInSlot(slot);
+ if (stack != null) {
+ if (stack.stackSize > amount) {
+ stack = stack.splitStack(amount);
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ } else {
+ // this method also calls markDirty, so we don't need to call it again
+ this.setInventorySlotContents(slot, null);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ final ItemStack stack = this.getStackInSlot(slot);
+ this.setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.inventory[slot] = stack;
+
+ if ((stack != null) && (stack.stackSize > this.getInventoryStackLimit())) {
+ stack.stackSize = this.getInventoryStackLimit();
+ }
+
+ // Don't forget this line or your inventory will not be saved!
+ this.markDirty();
+ }
+
+ // 1.7.2+ renamed to getInventoryName
+ @Override
+ public String getInventoryName() {
+ return this.name;
+ }
+
+ // 1.7.2+ renamed to hasCustomInventoryName
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.name.length() > 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ /**
+ * This is the method that will handle saving the inventory contents, as it is called (or should be called!) anytime
+ * the inventory changes. Perfect. Much better than using onUpdate in an Item, as this will also let you change
+ * things in your inventory without ever opening a Gui, if you want.
+ */
+ // 1.7.2+ renamed to markDirty
+ @Override
+ public void markDirty() {
+ for (int i = 0; i < this.getSizeInventory(); ++i) {
+ final ItemStack temp = this.getStackInSlot(i);
+ if (temp != null) {
+ // Utils.LOG_INFO("Slot "+i+" contains "+temp.getDisplayName()+" x"+temp.stackSize);
+ }
+
+ if ((temp != null) && (temp.stackSize == 0)) {
+ this.inventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return true;
+ }
+
+ // 1.7.2+ renamed to openInventory(EntityPlayer player)
+ @Override
+ public void openInventory() {}
+
+ // 1.7.2+ renamed to closeInventory(EntityPlayer player)
+ @Override
+ public void closeInventory() {}
+
+ /**
+ * This method doesn't seem to do what it claims to do, as items can still be left-clicked and placed in the
+ * inventory even when this returns false
+ */
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ // Don't want to be able to store the inventory item within itself
+ // Bad things will happen, like losing your inventory
+ // Actually, this needs a custom Slot to work
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/ModItems.java b/gtpp/src/main/java/gtPlusPlus/core/item/ModItems.java
new file mode 100644
index 0000000000..0fabf375a2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/ModItems.java
@@ -0,0 +1,988 @@
+package gtPlusPlus.core.item;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gtPlusPlus.core.creative.AddToCreativeTab.tabMisc;
+
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.base.BasicBlock.BlockTypes;
+import gtPlusPlus.core.block.base.BlockBaseModular;
+import gtPlusPlus.core.common.compat.COMPAT_Baubles;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.BaseItemComponent.ComponentTypes;
+import gtPlusPlus.core.item.base.BaseItemDamageable;
+import gtPlusPlus.core.item.base.BaseItemTCShard;
+import gtPlusPlus.core.item.base.CoreItem;
+import gtPlusPlus.core.item.base.dusts.BaseItemDust;
+import gtPlusPlus.core.item.base.foil.BaseItemFoil;
+import gtPlusPlus.core.item.base.gears.BaseItemSmallGear;
+import gtPlusPlus.core.item.base.ingots.BaseItemIngot;
+import gtPlusPlus.core.item.base.ingots.BaseItemIngot_OLD;
+import gtPlusPlus.core.item.base.plates.BaseItemPlate;
+import gtPlusPlus.core.item.base.plates.BaseItemPlateDouble;
+import gtPlusPlus.core.item.bauble.BatteryPackBaseBauble;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.item.chemistry.CoalTar;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.item.chemistry.IonParticles;
+import gtPlusPlus.core.item.chemistry.MilledOreProcessing;
+import gtPlusPlus.core.item.chemistry.NuclearChem;
+import gtPlusPlus.core.item.chemistry.RocketFuels;
+import gtPlusPlus.core.item.chemistry.StandardBaseParticles;
+import gtPlusPlus.core.item.crafting.ItemDummyResearch;
+import gtPlusPlus.core.item.food.BaseItemMetaFood;
+import gtPlusPlus.core.item.general.BufferCore;
+import gtPlusPlus.core.item.general.ItemAirFilter;
+import gtPlusPlus.core.item.general.ItemBasicScrubberTurbine;
+import gtPlusPlus.core.item.general.ItemBlueprint;
+import gtPlusPlus.core.item.general.ItemEmpty;
+import gtPlusPlus.core.item.general.ItemGenericToken;
+import gtPlusPlus.core.item.general.ItemHalfCompleteCasings;
+import gtPlusPlus.core.item.general.ItemLavaFilter;
+import gtPlusPlus.core.item.general.ItemMagicFeather;
+import gtPlusPlus.core.item.general.books.ItemBaseBook;
+import gtPlusPlus.core.item.general.chassis.ItemBoilerChassis;
+import gtPlusPlus.core.item.general.chassis.ItemDehydratorCoil;
+import gtPlusPlus.core.item.general.chassis.ItemDehydratorCoilWire;
+import gtPlusPlus.core.item.general.spawn.ItemCustomSpawnEgg;
+import gtPlusPlus.core.item.init.ItemsFoods;
+import gtPlusPlus.core.item.materials.DustDecayable;
+import gtPlusPlus.core.item.tool.misc.GregtechPump;
+import gtPlusPlus.core.item.wearable.WearableLoader;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.NONMATERIAL;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.material.nuclear.NUCLIDE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.everglades.GTplusplus_Everglades;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.helpers.VolumetricFlaskHelper;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechItems;
+
+public final class ModItems {
+
+ public static Item ZZZ_Empty;
+ public static Item AAA_Broken;
+
+ public static Item itemAlkalusDisk;
+ public static ItemCustomSpawnEgg itemCustomSpawnEgg;
+
+ public static Item itemIngotBatteryAlloy;
+
+ public static Item itemBedLocator_Base;
+ public static Item itemBaseItemWithCharge;
+
+ public static Item itemPersonalCloakingDevice;
+ public static Item itemPersonalHealingDevice;
+ public static Item itemSupremePizzaGloves;
+
+ public static ItemBlueprint itemBlueprintBase;
+
+ public static Item dustLithiumCarbonate;
+ public static Item dustLithiumHydroxide;
+ public static Item dustLithiumPeroxide;
+
+ public static Item dustQuicklime;
+ public static Item dustCalciumHydroxide;
+ public static Item dustCalciumCarbonate;
+ public static Item dustLi2CO3CaOH2;
+ public static Item dustLi2BeF4;
+
+ public static Item dustTumbagaMix;
+
+ public static Item dustAer;
+ public static Item dustIgnis;
+ public static Item dustTerra;
+ public static Item dustAqua;
+
+ public static Item cellHydrogenChlorideMix;
+
+ public static Item shardAer;
+ public static Item shardIgnis;
+ public static Item shardTerra;
+ public static Item shardAqua;
+
+ // Zirconium
+ public static Item itemZirconiumChlorideCinterPellet;
+ public static Item dustZrCl4;
+ public static Item dustCookedZrCl4;
+
+ public static Item dustCalciumSulfate;
+
+ public static Item dustFertUN18;
+ public static Item dustFertUN32;
+ public static Fluid fluidNuclearWaste;
+
+ // Possibly missing base items that GT may be missing.
+
+ public static Item itemSmallWroughtIronGear;
+ public static Item itemPlateRawMeat;
+ public static Item itemPlateClay;
+ public static Item itemPlateLithium;
+ public static Item itemPlateEuropium;
+ public static Item itemPlateVanadium;
+ public static Item itemDoublePlateClay;
+ public static Item itemDoublePlateEuropium;
+ public static Item itemFoilUranium235;
+ public static Item itemDustIndium;
+ public static BlockBaseModular blockRawMeat;
+
+ public static Item itemBoilerChassis;
+ public static Item itemDehydratorCoilWire;
+ public static Item itemDehydratorCoil;
+
+ public static Item itemLavaFilter;
+ public static Item itemAirFilter;
+
+ public static Item itemCoalCoke;
+ public static Item itemCactusCharcoal;
+ public static Item itemSugarCharcoal;
+ public static Item itemCactusCoke;
+ public static Item itemSugarCoke;
+
+ public static Item itemCircuitLFTR;
+ public static Item itemBasicTurbine;
+
+ public static Item itemHalfCompleteCasings;
+
+ public static Item itemCustomBook;
+
+ // Unstable Elements & Related Content
+ public static Item dustNeptunium238;
+ public static Item dustDecayedRadium226;
+ public static Item dustRadium226;
+ public static Item dustProtactinium233;
+
+ public static GregtechPump toolGregtechPump;
+
+ public static ItemGenericToken itemGenericToken;
+
+ public static ItemStack itemHotTitaniumIngot;
+
+ public static Fluid fluidZrF4;
+ public static Fluid fluidFertBasic;
+ public static Fluid fluidFertUN32;
+ public static Fluid fluidFertUN18;
+
+ public static DustDecayable dustMolybdenum99;
+ public static DustDecayable dustTechnetium99;
+ public static DustDecayable dustTechnetium99M;
+
+ public static IonParticles itemIonParticleBase;
+ public static StandardBaseParticles itemStandarParticleBase;
+
+ public static BatteryPackBaseBauble itemChargePack_Low_1;
+ public static BatteryPackBaseBauble itemChargePack_Low_2;
+ public static BatteryPackBaseBauble itemChargePack_Low_3;
+ public static BatteryPackBaseBauble itemChargePack_Low_4;
+ public static BatteryPackBaseBauble itemChargePack_Low_5;
+ public static BatteryPackBaseBauble itemChargePack_High_1;
+ public static BatteryPackBaseBauble itemChargePack_High_2;
+ public static BatteryPackBaseBauble itemChargePack_High_3;
+ public static BatteryPackBaseBauble itemChargePack_High_4;
+
+ public static ItemDummyResearch itemDummyResearch;
+
+ public static BaseItemMetaFood itemMetaFood;
+
+ public static ItemMagicFeather itemMagicFeather;
+
+ static {
+ Logger.INFO("Items!");
+ // Default item used when recipes fail, handy for debugging. Let's make sure they exist when this class is
+ // called upon.
+ AAA_Broken = new BaseItemIngot_OLD(
+ "AAA_Broken",
+ "Errors - Tell Alkalus",
+ Utils.rgbtoHexValue(128, 128, 128),
+ 0);
+ ZZZ_Empty = new ItemEmpty();
+ }
+
+ public static void init() {
+
+ itemMagicFeather = new ItemMagicFeather();
+
+ itemAlkalusDisk = new BaseItemDamageable(
+ "itemAlkalusDisk",
+ AddToCreativeTab.tabMisc,
+ 1,
+ 0,
+ "Unknown Use",
+ EnumRarity.rare,
+ EnumChatFormatting.AQUA,
+ false,
+ null);
+
+ itemGenericToken = new ItemGenericToken();
+ itemDummyResearch = new ItemDummyResearch();
+ itemCustomSpawnEgg = new ItemCustomSpawnEgg();
+
+ // Register meta item, because we need them for everything.
+ MetaGeneratedGregtechItems.INSTANCE.generateMetaItems();
+
+ // Register Hydrogen Blobs first, so we can replace old helium blobs.
+ // Register Old Helium Blob, this will be replaced when held by a player.
+
+ // Load Wearable Items
+ WearableLoader.run();
+
+ itemBlueprintBase = new ItemBlueprint("itemBlueprint");
+
+ itemHalfCompleteCasings = new ItemHalfCompleteCasings(
+ "itemHalfCompleteCasings",
+ AddToCreativeTab.tabMisc,
+ 32,
+ 0,
+ "This isn't quite finished yet.",
+ EnumRarity.common,
+ EnumChatFormatting.GRAY,
+ false,
+ Utils.rgbtoHexValue(255, 255, 255)).setTextureName(GregTech.ID + ":" + "gt.metaitem.01/" + "761");
+
+ // Start meta Item Generation
+ ItemsFoods.load();
+
+ try {
+
+ registerCustomMaterialComponents();
+
+ // Elements generate first so they can be used in compounds.
+ // Missing Elements
+ MaterialGenerator.generate(ELEMENT.getInstance().SELENIUM); // LFTR byproduct
+ MaterialGenerator.generate(ELEMENT.getInstance().BROMINE);
+ MaterialGenerator.generate(ELEMENT.getInstance().KRYPTON); // LFTR byproduct
+ MaterialGenerator.generate(ELEMENT.getInstance().STRONTIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().ZIRCONIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().RUTHENIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().IODINE); // LFTR byproduct
+ MaterialGenerator.generate(ELEMENT.getInstance().HAFNIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().DYSPROSIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().ERBIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().PRASEODYMIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().TELLURIUM); // LFTR byproduct
+ MaterialGenerator.generate(ELEMENT.getInstance().RHODIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().RHENIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().THALLIUM);
+ MaterialGenerator.generate(ELEMENT.getInstance().GERMANIUM);
+
+ // RADIOACTIVE ELEMENTS
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().POLONIUM, false);
+ // MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().RADON, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().RADIUM, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().PROMETHIUM, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().PROTACTINIUM, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().CURIUM, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().CALIFORNIUM, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().NEPTUNIUM, false);
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().FERMIUM, false);
+
+ // Nuclear Isotopes
+
+ // Lithium-7 is used as a part of the molten lithium fluoride in molten salt reactors: liquid-fluoride
+ // nuclear reactors.
+ // The large neutron-absorption cross-section of lithium-6 (about 940 barns[5]) as compared with the very
+ // small
+ // neutron cross-section of lithium-7 (about 45 millibarns) makes high separation of lithium-7 from natural
+ // lithium a
+ // strong requirement for the possible use in lithium fluoride reactors.
+ MaterialGenerator.generate(ELEMENT.getInstance().LITHIUM7, false);
+ // Thorium-232 is the most stable isotope of Thorium, purified for nuclear fuel use in this case.
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().THORIUM232);
+ // Production of 233U (through the neutron irradiation of 232Th) invariably produces small amounts of 232U
+ // as an impurity
+ // because of parasitic (n,2n) reactions on uranium-233 itself, or on protactinium-233, or on thorium-232:
+ MaterialGenerator.generate(ELEMENT.getInstance().URANIUM232);
+ // Uranium-233 is a fissile isotope of uranium that is bred from thorium-232 as part of the thorium fuel
+ // cycle.
+ MaterialGenerator.generate(ELEMENT.getInstance().URANIUM233);
+ // Plutonium-238 is a very powerful alpha emitter. This makes the plutonium-238 isotope suitable for usage
+ // in radioisotope thermoelectric generators (RTGs)
+ // and radioisotope heater units - one gram of plutonium-238 generates approximately 0.5 W of thermal power.
+ MaterialGenerator.generateNuclearMaterial(ELEMENT.getInstance().PLUTONIUM238, false);
+
+ // Custom Materials that will have standalone refinery processes
+ MaterialGenerator.generate(ELEMENT.STANDALONE.ADVANCED_NITINOL, false);
+ MaterialGenerator.generate(ELEMENT.STANDALONE.ASTRAL_TITANIUM);
+ MaterialGenerator.generate(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN);
+ MaterialGenerator.generate(ELEMENT.STANDALONE.HYPOGEN);
+ MaterialGenerator.generate(ELEMENT.STANDALONE.CHRONOMATIC_GLASS);
+
+ // Custom Materials that are from Runescape
+ MaterialGenerator.generate(ELEMENT.STANDALONE.BLACK_METAL);
+ MaterialGenerator.generate(ELEMENT.STANDALONE.WHITE_METAL);
+ MaterialGenerator.generateOreMaterialWithAllExcessComponents(ELEMENT.STANDALONE.GRANITE);
+ MaterialGenerator.generateOreMaterialWithAllExcessComponents(ELEMENT.STANDALONE.RUNITE);
+ MaterialGenerator.generate(ELEMENT.STANDALONE.DRAGON_METAL, false);
+
+ MISC_MATERIALS.run();
+
+ MaterialGenerator.generate(ALLOY.SILICON_CARBIDE);
+ MaterialGenerator.generate(ALLOY.ZIRCONIUM_CARBIDE);
+ MaterialGenerator.generate(ALLOY.TANTALUM_CARBIDE);
+ MaterialGenerator.generate(ALLOY.NIOBIUM_CARBIDE);
+ MaterialGenerator.generate(ALLOY.TUNGSTEN_TITANIUM_CARBIDE);
+
+ // LFTR Fuel components
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.AMMONIUM_BIFLUORIDE); // LFTR fuel component
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.BERYLLIUM_HYDROXIDE); // LFTR fuel component
+ // MaterialGenerator.generateNuclearDusts(FLUORIDES.AMMONIUM_TETRAFLUOROBERYLLATE); // LFTR fuel component
+
+ // Generate Fluorides
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.BERYLLIUM_FLUORIDE);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.LITHIUM_FLUORIDE);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.THORIUM_TETRAFLUORIDE);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.THORIUM_HEXAFLUORIDE);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.URANIUM_TETRAFLUORIDE, false);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.URANIUM_HEXAFLUORIDE, false);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.ZIRCONIUM_TETRAFLUORIDE);
+ // LFTR Fluoride outputs
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.NEPTUNIUM_HEXAFLUORIDE);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.TECHNETIUM_HEXAFLUORIDE);
+ MaterialGenerator.generateNuclearDusts(FLUORIDES.SELENIUM_HEXAFLUORIDE);
+
+ // Generate Reactor Fuel Salts
+ MaterialGenerator.generateNuclearDusts(NUCLIDE.LiFBeF2ZrF4U235);
+ MaterialGenerator.generateNuclearDusts(NUCLIDE.LiFBeF2ZrF4UF4);
+ MaterialGenerator.generateNuclearDusts(NUCLIDE.LiFBeF2ThF4UF4);
+ // MaterialGenerator.generateNuclearMaterial(NUCLIDE.Li2BeF4, false);
+
+ // Generate some Alloys
+
+ // Misc Alloys
+ MaterialGenerator.generate(ALLOY.ENERGYCRYSTAL);
+ MaterialGenerator.generate(ALLOY.BLOODSTEEL);
+
+ MaterialGenerator.generate(ALLOY.ZERON_100);
+ // Tumbaga was the name given by Spaniards to a non-specific alloy of gold and copper
+ MaterialGenerator.generate(ALLOY.TUMBAGA);
+ // Potin is traditionally an alloy of bronze, tin and lead, with varying quantities of each possible
+ MaterialGenerator.generate(ALLOY.POTIN);
+
+ // Staballoy & Tantalloy
+ MaterialGenerator.generate(ALLOY.STABALLOY);
+ MaterialGenerator.generate(ALLOY.TANTALLOY_60);
+ MaterialGenerator.generate(ALLOY.TANTALLOY_61);
+
+ // Inconel
+ MaterialGenerator.generate(ALLOY.INCONEL_625);
+ MaterialGenerator.generate(ALLOY.INCONEL_690);
+ MaterialGenerator.generate(ALLOY.INCONEL_792);
+
+ // Steels
+ MaterialGenerator.generateDusts(ALLOY.EGLIN_STEEL_BASE);
+ MaterialGenerator.generate(ALLOY.EGLIN_STEEL);
+ MaterialGenerator.generate(ALLOY.MARAGING250);
+ MaterialGenerator.generate(ALLOY.MARAGING300);
+ MaterialGenerator.generate(ALLOY.MARAGING350);
+ MaterialGenerator.generate(ALLOY.AQUATIC_STEEL);
+
+ MaterialGenerator.generate(ALLOY.NITINOL_60, true);
+
+ // Composite Alloys
+ MaterialGenerator.generate(ALLOY.STELLITE);
+ MaterialGenerator.generate(ALLOY.TALONITE);
+
+ // Hastelloy
+ MaterialGenerator.generate(ALLOY.HASTELLOY_W);
+ MaterialGenerator.generate(ALLOY.HASTELLOY_X);
+ MaterialGenerator.generate(ALLOY.HASTELLOY_C276);
+ MaterialGenerator.generate(ALLOY.HASTELLOY_N);
+
+ // Incoloy
+ MaterialGenerator.generate(ALLOY.INCOLOY_020);
+ MaterialGenerator.generate(ALLOY.INCOLOY_DS);
+ MaterialGenerator.generate(ALLOY.INCOLOY_MA956);
+
+ // Leagrisium
+ MaterialGenerator.generate(ALLOY.LEAGRISIUM);
+
+ // Super Conductor
+ MaterialGenerator.generate(ALLOY.HG1223, false, false);
+
+ // Generate Fictional Materials
+ MaterialGenerator.generate(ALLOY.TRINIUM_TITANIUM);
+ MaterialGenerator.generate(ALLOY.TRINIUM_NAQUADAH, false);
+ MaterialGenerator.generate(ALLOY.TRINIUM_NAQUADAH_CARBON);
+ MaterialGenerator.generate(ALLOY.TRINIUM_REINFORCED_STEEL);
+
+ // Top Tier Alloys
+ MaterialGenerator.generate(ALLOY.HELICOPTER);
+ MaterialGenerator.generate(ALLOY.LAFIUM);
+ MaterialGenerator.generate(ALLOY.CINOBITE);
+ MaterialGenerator.generate(ALLOY.PIKYONIUM);
+ MaterialGenerator.generate(ALLOY.ABYSSAL);
+ MaterialGenerator.generate(ALLOY.LAURENIUM);
+
+ // abs recipe in RECIPES_GREGTECH.java
+ MaterialGenerator.generate(ALLOY.BOTMIUM, true, false);
+
+ MaterialGenerator.generate(ALLOY.HS188A);
+
+ MaterialGenerator.generate(ALLOY.TITANSTEEL);
+ MaterialGenerator.generate(ALLOY.ARCANITE);
+ MaterialGenerator.generate(ALLOY.OCTIRON);
+
+ MaterialGenerator.generate(ALLOY.BABBIT_ALLOY, false);
+ MaterialGenerator.generate(ALLOY.BLACK_TITANIUM, false);
+ MaterialGenerator.generate(ALLOY.INDALLOY_140, false, false);
+
+ // High Level Bioplastic
+ MaterialGenerator.generate(ELEMENT.STANDALONE.RHUGNOR, false, false);
+
+ // Must be the final Alloy to Generate
+ MaterialGenerator.generate(ALLOY.QUANTUM);
+
+ // Ores
+ MaterialGenerator.generateOreMaterial(FLUORIDES.FLUORITE);
+ MaterialGenerator.generateOreMaterial(ALLOY.KOBOLDITE);
+ GTplusplus_Everglades.GenerateOreMaterials();
+
+ // formula override
+ ALLOY.TUNGSTEN_TITANIUM_CARBIDE.vChemicalFormula = StringUtils.subscript("(CW)7Ti3");
+ ALLOY.TITANSTEEL.vChemicalFormula = StringUtils.subscript("((CW)7Ti3)3???");
+
+ // Werkstoff bridge
+ ELEMENT.getInstance().ZIRCONIUM.setWerkstoffID((short) 3);
+ ELEMENT.getInstance().THORIUM232.setWerkstoffID((short) 30);
+ ELEMENT.getInstance().RUTHENIUM.setWerkstoffID((short) 64);
+ ELEMENT.getInstance().HAFNIUM.setWerkstoffID((short) 11000);
+ ELEMENT.getInstance().IODINE.setWerkstoffID((short) 11012);
+
+ } catch (final Throwable r) {
+ Logger.INFO("Failed to Generated a Material. " + r.getMessage());
+ r.printStackTrace();
+ }
+
+ // Generates four elemental shards when TC is not installed.
+ if (!Thaumcraft.isModLoaded()) {
+ shardAer = new BaseItemTCShard("Aer", Utils.rgbtoHexValue(225, 225, 5));
+ shardIgnis = new BaseItemTCShard("Ignis", Utils.rgbtoHexValue(255, 5, 5));
+ shardTerra = new BaseItemTCShard("Terra", Utils.rgbtoHexValue(5, 255, 5));
+ shardAqua = new BaseItemTCShard("Aqua", Utils.rgbtoHexValue(5, 5, 255));
+ } else {
+ shardAer = ItemUtils
+ .getItemStackWithMeta(Thaumcraft.isModLoaded(), "Thaumcraft:ItemShard", "Air Shard", 0, 1)
+ .getItem();
+ shardIgnis = ItemUtils
+ .getItemStackWithMeta(Thaumcraft.isModLoaded(), "Thaumcraft:ItemShard", "Fire Shard", 1, 1)
+ .getItem();
+ shardAqua = ItemUtils
+ .getItemStackWithMeta(Thaumcraft.isModLoaded(), "Thaumcraft:ItemShard", "Warer Shard", 2, 1)
+ .getItem();
+ shardTerra = ItemUtils
+ .getItemStackWithMeta(Thaumcraft.isModLoaded(), "Thaumcraft:ItemShard", "Earth Shard", 3, 1)
+ .getItem();
+ }
+ // Generates a set of four special dusts to be used in my recipes.
+ dustAer = ItemUtils.generateSpecialUseDusts(ELEMENT.getInstance().AER, true)[0];
+ dustIgnis = ItemUtils.generateSpecialUseDusts(ELEMENT.getInstance().IGNIS, true)[0];
+ dustTerra = ItemUtils.generateSpecialUseDusts(ELEMENT.getInstance().TERRA, true)[0];
+ dustAqua = ItemUtils.generateSpecialUseDusts(ELEMENT.getInstance().AQUA, true)[0];
+
+ ItemUtils.generateSpecialUseDusts(MISC_MATERIALS.WOODS_GLASS, false);
+ cellHydrogenChlorideMix = MISC_MATERIALS.HYDROGEN_CHLORIDE_MIX.getCell(1)
+ .getItem();
+
+ // Nuclear Fuel Dusts
+ dustLithiumCarbonate = ItemUtils.generateSpecialUseDusts(
+ "LithiumCarbonate",
+ "Lithium Carbonate",
+ "Li2CO3",
+ Utils.rgbtoHexValue(240, 240, 240))[0]; // https://en.wikipedia.org/wiki/Lithium_carbonate
+ dustLithiumPeroxide = ItemUtils.generateSpecialUseDusts(
+ "LithiumPeroxide",
+ "Lithium Peroxide",
+ "Li2O2",
+ Utils.rgbtoHexValue(250, 250, 250))[0]; // https://en.wikipedia.org/wiki/Lithium_peroxide
+ dustLithiumHydroxide = ItemUtils.generateSpecialUseDusts(
+ "LithiumHydroxide",
+ "Lithium Hydroxide",
+ "LiOH",
+ Utils.rgbtoHexValue(250, 250, 250))[0]; // https://en.wikipedia.org/wiki/Lithium_hydroxide
+
+ if (!ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDict("dustQuicklime", 1))) {
+ dustQuicklime = ItemUtils
+ .generateSpecialUseDusts("Quicklime", "Quicklime", "CaO", Utils.rgbtoHexValue(255, 255, 175))[0]; // https://en.wikipedia.org/wiki/Calcium_oxide
+ }
+ dustCalciumHydroxide = ItemUtils.generateSpecialUseDusts(
+ "CalciumHydroxide",
+ "Hydrated Lime",
+ "Ca(OH)2",
+ Utils.rgbtoHexValue(255, 255, 255))[0]; // https://en.wikipedia.org/wiki/Calcium_hydroxide
+ dustCalciumCarbonate = ItemUtils.generateSpecialUseDusts(
+ "CalciumCarbonate",
+ "Calcium Carbonate",
+ "CaCO3",
+ Utils.rgbtoHexValue(255, 255, 255))[0]; // https://en.wikipedia.org/wiki/Calcium_carbonate
+ if ((ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustGypsum", 1) == null)
+ || (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustCalciumSulfate", 1) == null)) {
+ dustCalciumSulfate = ItemUtils.generateSpecialUseDusts(
+ "Gypsum",
+ "Calcium Sulfate (Gypsum)",
+ "CaSO4",
+ Utils.rgbtoHexValue(255, 255, 255))[0]; // https://en.wikipedia.org/wiki/Calcium_sulfate
+ GT_OreDictUnificator.registerOre("dustCalciumSulfate", ItemUtils.getSimpleStack(dustCalciumSulfate));
+ } else {
+ GT_OreDictUnificator
+ .registerOre("dustCalciumSulfate", ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustGypsum", 1));
+ }
+ dustLi2CO3CaOH2 = ItemUtils.generateSpecialUseDusts(
+ "Li2CO3CaOH2",
+ "Li2CO3 + Ca(OH)2 Compound",
+ "Li2CO3CaOH2",
+ Utils.rgbtoHexValue(255, 255, 255))[0]; // https://en.wikipedia.org/wiki/Calcium_carbonate
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(FLUORIDES.SODIUM_FLUORIDE, false);
+ // FLiBe Fuel Compounds
+ dustLi2BeF4 = ItemUtils.generateSpecialUseDusts(
+ "Li2BeF4",
+ "Lithium Tetrafluoroberyllate Fuel Compound",
+ "Li2BeF4",
+ Utils.rgbtoHexValue(255, 255, 255))[0]; // https://en.wikipedia.org/wiki/FLiBe
+ Material.registerComponentForMaterial(NUCLIDE.Li2BeF4, OrePrefixes.dust, ItemUtils.getSimpleStack(dustLi2BeF4));
+ // fluidFLiBeSalt = ("Li2BeF4", "Li2BeF4", 7430, new short[]{255, 255, 255, 100}, 0);
+ // fluidFLiBeSalt = FluidUtils.addGTFluidNoPrefix("Li2BeF4", "Lithium Tetrafluoroberyllate", new short[]{255,
+ // 255, 255, 100}, 0, 743, null, CI.emptyCells(1), 1000, true);
+ // fluidFLiBeSaltBurnt = FluidUtils.addGTFluidNoPrefix("Li2BeF2UF4", "Li2BeF2UF4", new short[]{50, 255, 50,
+ // 100}, 0, 743, null, CI.emptyCells(1), 1000, true);
+
+ // LFTR Core Fluid Processing
+ // fluidLftrCore1 = FluidUtils.addGTFluidNoPrefix("LiBeF2UF4FP", "LiBeF2UF4FP", new short[]{110, 255, 110, 100},
+ // 0, 800, null, CI.emptyCells(1), 1000, true);
+ // fluidLftrCore2 = FluidUtils.addGTFluidNoPrefix("UF6F2FP", "UF6F2FP", new short[]{150, 255, 150, 100}, 0, 800,
+ // null, CI.emptyCells(1), 1000, true);
+ // fluidLftrCore3 = FluidUtils.addGTFluidNoPrefix("LiFBeF2", "LiFBeF2", new short[]{100, 255, 50, 100}, 0, 800,
+ // null, CI.emptyCells(1), 1000, true);
+ // fluidLftrCore4 = FluidUtils.addGTFluidNoPrefix("LiFBeF2UF4", "LiFBeF2UF4", new short[]{50, 255, 100, 100}, 0,
+ // 800, null, CI.emptyCells(1), 1000, true);
+ // LFTR Blanket Fluid Processing
+ fluidNuclearWaste = FluidUtils.addGTFluidNoPrefix(
+ "nuclear.waste",
+ "Nuclear Waste",
+ new short[] { 10, 250, 10, 100 },
+ 0,
+ 1000,
+ null,
+ CI.emptyCells(1),
+ 1000,
+ true);
+
+ // LFTR Control Circuit
+ itemCircuitLFTR = new CoreItem(
+ "itemCircuitLFTR",
+ "" + EnumChatFormatting.GREEN + "Control Circuit",
+ AddToCreativeTab.tabMisc,
+ 1,
+ 0,
+ new String[] { "Keeps Multiblocks Stable" },
+ EnumRarity.epic,
+ EnumChatFormatting.DARK_GREEN,
+ false,
+ null);
+
+ if (CORE.ConfigSwitches.enableMachine_Pollution) {
+ itemBasicTurbine = new ItemBasicScrubberTurbine();
+ }
+
+ // Zirconium
+ // Cinter Pellet.
+ itemZirconiumChlorideCinterPellet = new CoreItem(
+ "itemZirconiumPellet",
+ "Zirconium Pellet [" + StringUtils.subscript("ZrCl4") + "]",
+ tabMisc).setTextureName(GTPlusPlus.ID + ":itemShard");
+ GT_OreDictUnificator.registerOre("pelletZirconium", new ItemStack(itemZirconiumChlorideCinterPellet));
+ // Zirconium Chloride
+ dustZrCl4 = ItemUtils.generateSpecialUseDusts("ZrCl4", "ZrCl4", "ZrCl4", Utils.rgbtoHexValue(180, 180, 180))[0]; // http://www.iaea.org/inis/collection/NCLCollectionStore/_Public/39/036/39036750.pdf
+ dustCookedZrCl4 = ItemUtils
+ .generateSpecialUseDusts("CookedZrCl4", "Cooked ZrCl4", "ZrCl4", Utils.rgbtoHexValue(180, 180, 180))[0]; // http://www.iaea.org/inis/collection/NCLCollectionStore/_Public/39/036/39036750.pdf
+
+ // Zirconium Tetrafluoride
+ /*
+ * GT_OreDictUnificator.registerOre("cellZrF4",
+ * ItemUtils.getItemStackOfAmountFromOreDict("cellZirconiumTetrafluoride", 1));
+ * GT_OreDictUnificator.registerOre("dustZrF4",
+ * ItemUtils.getItemStackOfAmountFromOreDict("dustZirconiumTetrafluoride", 1));
+ */
+ fluidZrF4 = FluidUtils.generateFluidNoPrefix(
+ "ZirconiumTetrafluoride",
+ "Zirconium Tetrafluoride",
+ 500,
+ new short[] { 170, 170, 140, 100 }); // https://en.wikipedia.org/wiki/Zirconium_tetrafluoride
+ FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.setFluid(fluidZrF4);
+
+ // Coolant Salt
+ // NaBF4 - NaF - 621C
+ // dustNaBF4NaF = ItemUtils.generateSpecialUseDusts("NaBF4NaF", "NaBF4NaF", Utils.rgbtoHexValue(45, 45, 90))[0];
+ // //https://en.wikipedia.org/wiki/Zirconium_tetrafluoride
+
+ // Load Tree Farmer
+ if (CORE.ConfigSwitches.enableMultiblock_TreeFarmer) { // https://en.wikipedia.org/wiki/UAN
+ dustFertUN18 = ItemUtils
+ .generateSpecialUseDusts("UN18Fertiliser", "UN-18 Fertiliser", Utils.rgbtoHexValue(60, 155, 60))[0];
+ dustFertUN32 = ItemUtils
+ .generateSpecialUseDusts("UN32Fertiliser", "UN-32 Fertiliser", Utils.rgbtoHexValue(55, 190, 55))[0];
+
+ ItemStack temp1 = ItemUtils.getCorrectStacktype("IC2:itemFertilizer", 1);
+ ItemStack temp2 = null;
+
+ if (Forestry.isModLoaded()) {
+ temp2 = ItemUtils.getCorrectStacktype("Forestry:fertilizerCompound", 1);
+ }
+ if (temp1 != null) {
+ fluidFertBasic = FluidUtils.generateFluidNonMolten(
+ "Fertiliser",
+ "Fertiliser",
+ 32,
+ new short[] { 45, 170, 45, 100 },
+ temp1,
+ null,
+ true);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(temp2)
+ .fluidOutputs(new FluidStack(fluidFertBasic, 36))
+ .duration(5 * TICKS)
+ .eut(16)
+ .addTo(fluidExtractionRecipes);
+ }
+ fluidFertUN32 = FluidUtils.generateFluidNonMolten(
+ "UN32Fertiliser",
+ "UN-32 Fertiliser",
+ 24,
+ new short[] { 55, 190, 55, 100 },
+ null,
+ null,
+ true);
+ fluidFertUN18 = FluidUtils.generateFluidNonMolten(
+ "UN18Fertiliser",
+ "UN-18 Fertiliser",
+ 22,
+ new short[] { 60, 155, 60, 100 },
+ null,
+ null,
+ true);
+
+ /*
+ * GT_Values.RA.addMixerRecipe( arg0, //Item In arg1, arg2, arg3, arg4, //Fluid in arg5, //Fluid Out arg6,
+ * //Item out arg7, //Eu arg8); //Time
+ */
+
+ }
+
+ // Juice
+ FluidUtils.generateFluidNonMolten(
+ "RaisinJuice",
+ "Raisin Juice",
+ 2,
+ new short[] { 51, 0, 51, 100 },
+ ItemUtils.getItemStackOfAmountFromOreDictNoBroken("foodRaisins", 1),
+ ItemUtils.getItemStackOfAmountFromOreDictNoBroken("fruitRaisins", 1),
+ 50,
+ true);
+
+ // Test items
+ toolGregtechPump = new GregtechPump();
+ toolGregtechPump.registerPumpType(0, "Simple Hand Pump", 0, 0);
+ toolGregtechPump.registerPumpType(1, "Advanced Hand Pump", 32000, 1);
+ toolGregtechPump.registerPumpType(2, "Super Hand Pump", 128000, 2);
+ toolGregtechPump.registerPumpType(3, "Ultimate Hand Pump", 512000, 3);
+
+ // Xp Fluids - Dev
+ if (!FluidRegistry.isFluidRegistered("mobessence")) {
+ FluidUtils.generateFluidNoPrefix("mobessence", "Mob Essence", 0, new short[] { 125, 175, 125, 100 });
+ }
+
+ dustNeptunium238 = new DustDecayable(
+ "dustNeptunium238",
+ Utils.rgbtoHexValue(175, 240, 75),
+ 50640,
+ new String[] { StringUtils.superscript("238Np"),
+ "Result: Plutonium 238 (" + StringUtils.superscript("238Pu") + ")" },
+ ELEMENT.getInstance().PLUTONIUM238.getDust(1)
+ .getItem(),
+ 5);
+ dustDecayedRadium226 = ItemUtils.generateSpecialUseDusts(
+ "DecayedRadium226",
+ "Decayed Radium-226",
+ "Contains Radon (" + StringUtils.superscript("222Rn") + ")",
+ ELEMENT.getInstance().RADIUM.getRgbAsHex())[0];
+ dustRadium226 = new DustDecayable(
+ "dustRadium226",
+ ELEMENT.getInstance().RADIUM.getRgbAsHex(),
+ 90000,
+ new String[] { StringUtils.superscript("226Ra"),
+ "Result: Radon (" + StringUtils.superscript("222Rn") + ")" },
+ ItemUtils.getSimpleStack(dustDecayedRadium226)
+ .getItem(),
+ 5);
+ dustProtactinium233 = new DustDecayable(
+ "dustProtactinium233",
+ ELEMENT.getInstance().PROTACTINIUM.getRgbAsHex(),
+ 32000,
+ new String[] { StringUtils.superscript("233Pa"),
+ "Result: Uranium 233(" + StringUtils.superscript("233U") + ")" },
+ ELEMENT.getInstance().URANIUM233.getDust(1)
+ .getItem(),
+ 6);
+ dustMolybdenum99 = new DustDecayable(
+ "dustMolybdenum99",
+ ELEMENT.getInstance().MOLYBDENUM.getRgbAsHex(),
+ 16450,
+ new String[] { StringUtils.superscript("99Mo"),
+ "Result: Technicium 99ᵐ (" + StringUtils.superscript("99ᵐTc") + ")" },
+ dustTechnetium99M,
+ 4);
+
+ itemIonParticleBase = new IonParticles();
+ itemStandarParticleBase = new StandardBaseParticles();
+
+ Item a8kFlask = VolumetricFlaskHelper.generateNewFlask("Volumetric_Flask_8k", "Large Volumetric Flask", 8000);
+ Item a64kFlask = VolumetricFlaskHelper
+ .generateNewFlask("Volumetric_Flask_32k", "Gigantic Volumetric Flask", 32000);
+ GregtechItemList.VOLUMETRIC_FLASK_8k.set(a8kFlask);
+ GregtechItemList.VOLUMETRIC_FLASK_32k.set(a64kFlask);
+
+ itemBoilerChassis = new ItemBoilerChassis();
+ itemDehydratorCoilWire = new ItemDehydratorCoilWire();
+ itemDehydratorCoil = new ItemDehydratorCoil();
+
+ itemAirFilter = new ItemAirFilter();
+ itemLavaFilter = new ItemLavaFilter();
+
+ // Chemistry
+ new CoalTar();
+ new RocketFuels();
+
+ // Nuclear Processing
+ new NuclearChem();
+
+ // Farm Animal Fun
+ new AgriculturalChem();
+
+ // General Chemistry
+ new GenericChem();
+
+ // Milled Ore Processing
+ new MilledOreProcessing();
+
+ // IC2 Exp
+ Logger.INFO("IndustrialCraft2 Found - Loading Resources.");
+
+ // Baubles Mod Test
+ try {
+ final Class<?> baublesTest = ReflectionUtils.getClass("baubles.api.IBauble");
+ if (baublesTest != null) {
+ COMPAT_Baubles.run();
+ } else {
+ Logger.INFO("Baubles Not Found - Skipping Resources.");
+ }
+ } catch (final Throwable T) {
+ Logger.INFO("Baubles Not Found - Skipping Resources.");
+ }
+
+ // Buffer Cores!
+ Item itemBufferCore;
+ for (int i = 1; i <= 10; i++) {
+ itemBufferCore = new BufferCore("itemBufferCore", i).setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerItem(itemBufferCore, itemBufferCore.getUnlocalizedName());
+ }
+
+ itemCustomBook = new ItemBaseBook();
+ registerCustomTokens();
+ }
+
+ public static void registerCustomTokens() {
+ itemGenericToken.register(0, "BitCoin", 16, "Can be used on the dark web");
+ itemGenericToken.register(1, "Hand Pump Trade Token I", 1, "Craft into a Tier I Hand pump");
+ itemGenericToken.register(2, "Hand Pump Trade Token II", 1, "Craft into a Tier II Hand pump");
+ itemGenericToken.register(3, "Hand Pump Trade Token III", 1, "Craft into a Tier III Hand pump");
+ itemGenericToken.register(4, "Hand Pump Trade Token IV", 1, "Craft into a Tier IV Hand pump");
+ }
+
+ public static void registerCustomMaterialComponents() {
+ // Custom GT++ Crafting Components
+
+ /*
+ * Try to generate dusts for missing rare earth materials if they don't exist
+ */
+ if (!ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustGadolinium", 1))) {
+ ItemUtils.generateSpecialUseDusts(
+ "Gadolinium",
+ "Gadolinium",
+ Materials.Gadolinium.mElement.name(),
+ Utils.rgbtoHexValue(226, 172, 9));
+ }
+ if (!ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustYtterbium", 1))) {
+ ItemUtils.generateSpecialUseDusts(
+ "Ytterbium",
+ "Ytterbium",
+ Materials.Ytterbium.mElement.name(),
+ Utils.rgbtoHexValue(
+ Materials.Yttrium.mRGBa[0] - 60,
+ Materials.Yttrium.mRGBa[1] - 60,
+ Materials.Yttrium.mRGBa[2] - 60));
+ }
+ if (!ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustSamarium", 1))) {
+ ItemUtils.generateSpecialUseDusts(
+ "Samarium",
+ "Samarium",
+ Materials.Samarium.mElement.name(),
+ Utils.rgbtoHexValue(161, 168, 114));
+ }
+ if (!ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustLanthanum", 1))) {
+ ItemUtils.generateSpecialUseDusts(
+ "Lanthanum",
+ "Lanthanum",
+ Materials.Lanthanum.mElement.name(),
+ Utils.rgbtoHexValue(106, 127, 163));
+ }
+
+ // Just an unusual plate needed for some black magic.
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateClay", 1) == null) {
+ itemPlateClay = new BaseItemPlate(NONMATERIAL.CLAY);
+ }
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateDoubleClay", 1) == null) {
+ itemDoublePlateClay = new BaseItemPlateDouble(NONMATERIAL.CLAY);
+ }
+
+ // Need this for Mutagenic Frames
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("foilUranium235", 1) == null) {
+ itemFoilUranium235 = new BaseItemFoil(ELEMENT.getInstance().URANIUM235);
+ }
+
+ // A small gear needed for wizardry.
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("gearGtSmallWroughtIron", 1) == null) {
+ itemSmallWroughtIronGear = new BaseItemSmallGear(NONMATERIAL.WROUGHT_IRON);
+ }
+ // Krypton Processing
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("ingotHotTitanium", 1) == null) {
+ itemHotTitaniumIngot = ItemUtils
+ .getSimpleStack(new BaseItemIngot(ELEMENT.getInstance().TITANIUM, ComponentTypes.HOTINGOT));
+ } else {
+ itemHotTitaniumIngot = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("ingotHotTitanium", 1);
+ }
+
+ // Need this for Laurenium
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("dustIndium", 1) == null) {
+ itemDustIndium = new BaseItemDust(ELEMENT.getInstance().INDIUM);
+ }
+
+ // Springs
+ MaterialUtils
+ .generateComponentAndAssignToAMaterial(ComponentTypes.SPRING, ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SPRING, ELEMENT.STANDALONE.WHITE_METAL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SPRING, ALLOY.NITINOL_60);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SPRING, ALLOY.AQUATIC_STEEL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SPRING, ALLOY.EGLIN_STEEL);
+
+ // Small Springs
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SMALLSPRING, ALLOY.MARAGING250);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SMALLSPRING, ALLOY.NICHROME);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SMALLSPRING, ALLOY.STABALLOY);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SMALLSPRING, ALLOY.STEEL_BLACK);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.SMALLSPRING, ALLOY.BLACK_TITANIUM);
+
+ // Fine Wire
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ELEMENT.STANDALONE.WHITE_METAL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ELEMENT.getInstance().PALLADIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ELEMENT.getInstance().ZIRCONIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ALLOY.LEAGRISIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ALLOY.BABBIT_ALLOY);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ALLOY.KOBOLDITE);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ALLOY.HG1223);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ALLOY.QUANTUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ELEMENT.STANDALONE.HYPOGEN);
+ MaterialUtils
+ .generateComponentAndAssignToAMaterial(ComponentTypes.FINEWIRE, ELEMENT.STANDALONE.CHRONOMATIC_GLASS);
+
+ // Foil
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.BLACK_TITANIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.BOTMIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.TITANSTEEL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.NITINOL_60);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.QUANTUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.LAURENIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.HYPOGEN);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.ASTRAL_TITANIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.RHUGNOR);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.WHITE_METAL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.ADVANCED_NITINOL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.PIKYONIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.CINOBITE);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.LAFIUM);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ALLOY.TRINIUM_REINFORCED_STEEL);
+ MaterialUtils.generateComponentAndAssignToAMaterial(ComponentTypes.FOIL, ELEMENT.STANDALONE.CHRONOMATIC_GLASS);
+
+ // Special Sillyness
+ if (true) {
+
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateSodium", 1) == null) {
+ new BaseItemPlate(ELEMENT.getInstance().SODIUM);
+ }
+
+ Material meatRaw = NONMATERIAL.MEAT;
+ // A plate of Meat.
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateMeatRaw", 1) == null) {
+ itemPlateRawMeat = new BaseItemPlate(meatRaw);
+ ItemUtils.registerFuel(ItemUtils.getSimpleStack(itemPlateRawMeat), 100);
+ }
+ // A Block of Meat.
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("blockMeatRaw", 1) == null) {
+ blockRawMeat = new BlockBaseModular(meatRaw, BlockTypes.STANDARD);
+ ItemUtils.registerFuel(ItemUtils.getSimpleStack(blockRawMeat), 900);
+ }
+ }
+
+ // A plate of Vanadium.
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateVanadium", 1) == null) {
+ itemPlateVanadium = new BaseItemPlate(ELEMENT.getInstance().VANADIUM);
+ }
+
+ // A plate of Lithium.
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateLithium", 1) == null) {
+ itemPlateLithium = new BaseItemPlate(ELEMENT.getInstance().LITHIUM);
+ }
+
+ // A plate of Europium.
+ if ((ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateEuropium", 1) == null)
+ && CORE.ConfigSwitches.enableCustom_Pipes) {
+ itemPlateEuropium = new BaseItemPlate(ELEMENT.getInstance().EUROPIUM);
+ }
+ if ((ItemUtils.getItemStackOfAmountFromOreDictNoBroken("plateDoubleEuropium", 1) == null)
+ && CORE.ConfigSwitches.enableCustom_Pipes) {
+ itemDoublePlateEuropium = new BaseItemPlateDouble(ELEMENT.getInstance().EUROPIUM);
+ }
+
+ // Tumbaga Mix (For Simple Crafting)
+ dustTumbagaMix = ItemUtils
+ .generateSpecialUseDusts("MixTumbaga", "Tumbaga Mix", "Au2Cu", Utils.rgbtoHexValue(255, 150, 80))[0];
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemBurnable.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemBurnable.java
new file mode 100644
index 0000000000..8bbc5a3b08
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemBurnable.java
@@ -0,0 +1,42 @@
+package gtPlusPlus.core.item.base;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemBurnable extends CoreItem {
+
+ protected final int meta;
+
+ public BaseItemBurnable(String unlocalizedName, String displayName, CreativeTabs creativeTab, int stackSize,
+ int maxDmg, String description, String oredictName, int burnTime, int meta) {
+ super(unlocalizedName, creativeTab, stackSize, maxDmg, description);
+ this.itemName = displayName;
+ this.meta = meta;
+ if (oredictName != null && !oredictName.equals("")) {
+ registerOrdictionary(oredictName);
+ }
+ registerFuel(burnTime);
+ }
+
+ public void registerFuel(int burn) {
+ CORE.burnables.add(new Pair<>(burn, ItemUtils.getSimpleStack(this, 1)));
+ }
+
+ public final void registerOrdictionary(String name) {
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(this), name);
+ }
+
+ @Override
+ public int getDamage(ItemStack stack) {
+ return this.meta;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemColourable.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemColourable.java
new file mode 100644
index 0000000000..d391207a56
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemColourable.java
@@ -0,0 +1,100 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.GT_LanguageManager;
+
+public class BaseItemColourable extends Item {
+
+ private final EnumRarity rarity;
+ private final EnumChatFormatting descColour;
+ private final boolean hasEffect;
+ public final int componentColour;
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ return this.componentColour;
+ }
+
+ // 5
+ /*
+ * Name, Tab, Stack, Dmg, Description, Rarity, Text Colour, Effect
+ */
+ public BaseItemColourable(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize,
+ final int maxDmg, final String description, final EnumRarity regRarity, final EnumChatFormatting colour,
+ final boolean Effect, int rgb) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setCreativeTab(creativeTab);
+ this.setMaxStackSize(stackSize);
+ this.setMaxDamage(maxDmg);
+ this.setHasSubtypes(true);
+ this.rarity = regRarity;
+ GT_LanguageManager.addStringLocalization("gtplusplus." + this.getUnlocalizedName() + ".tooltip", description);
+ this.descColour = colour;
+ this.hasEffect = Effect;
+ this.componentColour = rgb;
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ // 6
+ /*
+ * Name, Tab, Stack, Dmg, Description, Rarity, Text Colour, Effect
+ */
+ public BaseItemColourable(final String unlocalizedName, final String displayName, final CreativeTabs creativeTab,
+ final int stackSize, final int maxDmg, final String description, final EnumRarity regRarity,
+ final EnumChatFormatting colour, final boolean Effect, int rgb) {
+ this.setUnlocalizedName(unlocalizedName);
+ GT_LanguageManager.addStringLocalization("gtplusplus." + this.getUnlocalizedName() + ".name", displayName);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setCreativeTab(creativeTab);
+ this.setMaxStackSize(stackSize);
+ this.setMaxDamage(maxDmg);
+ this.rarity = regRarity;
+ GT_LanguageManager.addStringLocalization("gtplusplus." + this.getUnlocalizedName() + ".tooltip", description);
+ this.descColour = colour;
+ this.hasEffect = Effect;
+ this.componentColour = rgb;
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add(
+ this.descColour
+ + GT_LanguageManager.getTranslation("gtplusplus." + this.getUnlocalizedName() + ".tooltip"));
+ // super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public EnumRarity getRarity(final ItemStack par1ItemStack) {
+ return this.rarity;
+ }
+
+ @Override
+ public boolean hasEffect(final ItemStack par1ItemStack, final int pass) {
+ return this.hasEffect;
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ if (!("gtplusplus." + this.getUnlocalizedName() + ".name")
+ .equals(GT_LanguageManager.getTranslation("gtplusplus." + this.getUnlocalizedName() + ".name"))) {
+ return GT_LanguageManager.getTranslation("gtplusplus." + this.getUnlocalizedName() + ".name");
+ } else return super.getItemStackDisplayName(tItem);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemComponent.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemComponent.java
new file mode 100644
index 0000000000..6846f8febb
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemComponent.java
@@ -0,0 +1,459 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.awt.Color;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+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;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+
+public class BaseItemComponent extends Item {
+
+ private static final Class<TextureSet> mTextureSetPreload;
+
+ static {
+ mTextureSetPreload = TextureSet.class;
+ }
+
+ public final Material componentMaterial;
+ public final String materialName;
+ public final String unlocalName;
+ public final String translatedMaterialName;
+ public final ComponentTypes componentType;
+ public final int componentColour;
+ public Object extraData;
+
+ protected IIcon base;
+ protected IIcon overlay;
+
+ public BaseItemComponent(final Material material, final ComponentTypes componentType) {
+ this.componentMaterial = material;
+ this.unlocalName = "item" + componentType.COMPONENT_NAME + material.getUnlocalizedName();
+ this.materialName = material.getLocalizedName();
+ this.translatedMaterialName = material.getTranslatedName();
+ this.componentType = componentType;
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setUnlocalizedName(this.unlocalName);
+ this.setMaxStackSize(64);
+ // this.setTextureName(this.getCorrectTextures());
+ this.componentColour = material.getRgbAsHex();
+ GameRegistry.registerItem(this, this.unlocalName);
+
+ // if (componentType != ComponentTypes.DUST)
+
+ GT_OreDictUnificator.registerOre(
+ componentType.getOreDictName() + material.getUnlocalizedName(),
+ ItemUtils.getSimpleStack(this));
+ if (componentType == ComponentTypes.GEAR) {
+ GT_OreDictUnificator.registerOre("gear" + material.getUnlocalizedName(), ItemUtils.getSimpleStack(this));
+ }
+ registerComponent();
+
+ GT_LanguageManager.addStringLocalization("gtplusplus.item." + unlocalName + ".name", getFormattedLangName());
+ }
+
+ // For Cell Generation
+ public BaseItemComponent(final String unlocalName, final String localName, final short[] RGBA) {
+
+ // Handles .'s from fluid internal names.
+ String aFormattedNameForFluids;
+ if (unlocalName.contains(".")) {
+ aFormattedNameForFluids = StringUtils.splitAndUppercase(unlocalName, ".");
+ } else {
+ aFormattedNameForFluids = unlocalName;
+ }
+ Material aTempMaterial = Material.mMaterialCache.get(localName.toLowerCase());
+ Logger.INFO("Attempted to get " + localName + " cell material from cache. Valid? " + (aTempMaterial != null));
+ this.componentMaterial = aTempMaterial;
+ this.unlocalName = "itemCell" + aFormattedNameForFluids;
+ this.materialName = localName;
+ this.translatedMaterialName = getFluidName(
+ "fluid." + this.materialName.toLowerCase()
+ .replace(" ", ""));
+ this.componentType = ComponentTypes.CELL;
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setUnlocalizedName(aFormattedNameForFluids);
+ this.setMaxStackSize(64);
+ this.componentColour = MathUtils.getRgbAsHex(RGBA);
+ this.extraData = RGBA;
+
+ this.setTextureName(GTPlusPlus.ID + ":" + "item" + ComponentTypes.CELL.COMPONENT_NAME);
+ GameRegistry.registerItem(this, aFormattedNameForFluids);
+ GT_OreDictUnificator.registerOre(
+ ComponentTypes.CELL.getOreDictName() + Utils.sanitizeStringKeepBrackets(localName),
+ ItemUtils.getSimpleStack(this));
+ registerComponent();
+
+ GT_LanguageManager
+ .addStringLocalization("gtplusplus.item." + this.unlocalName + ".name", getFormattedLangName());
+ }
+
+ private String getFormattedLangName() {
+ return componentType.getName()
+ .replace("@", "%material");
+ }
+
+ public boolean registerComponent() {
+ if (this.componentMaterial == null) {
+ return false;
+ }
+ // Register Component
+ Map<String, ItemStack> aMap = Material.mComponentMap.get(componentMaterial.getUnlocalizedName());
+ if (aMap == null) {
+ aMap = new HashMap<>();
+ }
+ String aKey = componentType.getGtOrePrefix()
+ .name();
+ ItemStack x = aMap.get(aKey);
+ if (x == null) {
+ aMap.put(aKey, ItemUtils.getSimpleStack(this));
+ Logger.MATERIALS(
+ "Registering a material component. Item: [" + componentMaterial.getUnlocalizedName()
+ + "] Map: ["
+ + aKey
+ + "]");
+ Material.mComponentMap.put(componentMaterial.getUnlocalizedName(), aMap);
+ if (componentType == ComponentTypes.PLATE) {
+ GregTech_API.registerCover(
+ componentMaterial.getPlate(1),
+ new GT_RenderedTexture(
+ componentMaterial.getTextureSet().mTextures[71],
+ componentMaterial.getRGBA(),
+ false),
+ null);
+ } else if (componentType == ComponentTypes.PLATEDOUBLE) {
+ GregTech_API.registerCover(
+ componentMaterial.getPlateDouble(1),
+ new GT_RenderedTexture(
+ componentMaterial.getTextureSet().mTextures[72],
+ componentMaterial.getRGBA(),
+ false),
+ null);
+ }
+ return true;
+ } else {
+ // Bad
+ Logger.MATERIALS("Tried to double register a material component. ");
+ return false;
+ }
+ }
+
+ public String getCorrectTextures() {
+ if (!CORE.ConfigSwitches.useGregtechTextures) {
+ return GTPlusPlus.ID + ":" + "item" + this.componentType.COMPONENT_NAME;
+ }
+ String metType = "9j4852jyo3rjmh3owlhw9oe";
+ if (this.componentMaterial != null) {
+ TextureSet u = this.componentMaterial.getTextureSet();
+ if (u != null) {
+ metType = u.mSetName;
+ }
+ }
+ metType = (metType.equals("9j4852jyo3rjmh3owlhw9oe") ? "METALLIC" : metType);
+ return GregTech.ID + ":" + "materialicons/" + metType + "/" + this.componentType.getOreDictName();
+
+ // return GregTech.ID + ":" + "materialicons/"+metType+"/" + this.componentType.COMPONENT_NAME.toLowerCase();
+ }
+
+ /*
+ * @Override public String getItemStackDisplayName(final ItemStack p_77653_1_) { if (this.componentType ==
+ * ComponentTypes.SMALLGEAR){ return "Small " + this.materialName+" Gear"; } if (this.componentMaterial != null) {
+ * return (this.componentMaterial.getLocalizedName()+this.componentType.DISPLAY_NAME); } return
+ * this.materialName+" Cell"; }
+ */
+
+ public final String getMaterialName() {
+ return this.materialName;
+ }
+
+ public String getFluidName(String aKey) {
+ String trans;
+ trans = GT_LanguageManager.getTranslation(aKey);
+ if (!trans.equals(aKey)) return trans;
+ aKey = "fluid." + aKey;
+ trans = GT_LanguageManager.getTranslation(aKey);
+ if (!trans.equals(aKey)) return trans;
+ return GT_LanguageManager.addStringLocalization(
+ "gtplusplus.fluid." + this.materialName.toLowerCase()
+ .replace(" ", ""),
+ this.materialName);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return GT_LanguageManager.getTranslation("gtplusplus.item." + unlocalName + ".name")
+ .replace("%s", "%temp")
+ .replace("%material", translatedMaterialName)
+ .replace("%temp", "%s");
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public final void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list,
+ final boolean bool) {
+
+ try {
+
+ if (this.componentMaterial == null) {
+ if (this.materialName != null) {
+ // list.add(Utils.sanitizeStringKeepBrackets(materialName));
+ }
+ }
+
+ if ((this.materialName != null) && (this.materialName != "")
+ && !this.materialName.equals("")
+ && (this.componentMaterial != null)) {
+
+ if (this.componentMaterial != null) {
+ if (!this.componentMaterial.vChemicalFormula.contains("?")) {
+ list.add(Utils.sanitizeStringKeepBrackets(this.componentMaterial.vChemicalFormula));
+ } else if (this.componentMaterial.vChemicalFormula.contains("?")) {
+ String temp = componentMaterial.vChemicalFormula;
+ temp = temp.replace(" ", "");
+ temp = temp.replace("-", "");
+ temp = temp.replace("_", "");
+ temp = temp.replace("!", "");
+ temp = temp.replace("@", "");
+ temp = temp.replace("#", "");
+ temp = temp.replace(" ", "");
+ list.add(temp);
+ }
+
+ if (this.componentMaterial.isRadioactive) {
+ list.add(CORE.GT_Tooltip_Radioactive.get());
+ }
+
+ if (this.componentType == ComponentTypes.INGOT || this.componentType == ComponentTypes.HOTINGOT) {
+ if ((this.materialName != null) && (this.materialName != "")
+ && !this.materialName.equals("")
+ && this.unlocalName.toLowerCase()
+ .contains("hot")) {
+ list.add(
+ EnumChatFormatting.GRAY + "Warning: "
+ + EnumChatFormatting.RED
+ + "Very hot! "
+ + EnumChatFormatting.GRAY
+ + " Avoid direct handling..");
+ }
+ }
+ } else {
+ String aChemicalFormula = Material.sChemicalFormula.get(materialName.toLowerCase());
+ if (aChemicalFormula != null && aChemicalFormula.length() > 0) {
+ list.add(Utils.sanitizeStringKeepBrackets(aChemicalFormula));
+ }
+ }
+
+ // Hidden Tooltip
+ if (KeyboardUtils.isCtrlKeyDown()) {
+ if (this.componentMaterial != null) {
+ String type = this.componentMaterial.getTextureSet().mSetName;
+ String output = type.substring(0, 1)
+ .toUpperCase() + type.substring(1);
+ list.add(EnumChatFormatting.GRAY + "Material Type: " + output + ".");
+ list.add(
+ EnumChatFormatting.GRAY + "Material State: "
+ + this.componentMaterial.getState()
+ .name()
+ + ".");
+ list.add(
+ EnumChatFormatting.GRAY + "Radioactivity Level: "
+ + this.componentMaterial.vRadiationLevel
+ + ".");
+ }
+ } else {
+ list.add(EnumChatFormatting.DARK_GRAY + "Hold Ctrl to show additional info.");
+ }
+ }
+ } catch (Throwable t) {}
+
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (this.componentMaterial != null) {
+ if (entityHolding instanceof EntityPlayer) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ EntityUtils.applyRadiationDamageToEntity(
+ iStack.stackSize,
+ this.componentMaterial.vRadiationLevel,
+ world,
+ entityHolding);
+ }
+ }
+ }
+ }
+
+ /**
+ *
+ * Handle Custom Rendering
+ *
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return (CORE.ConfigSwitches.useGregtechTextures ? true : false);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int renderPass) {
+
+ if (this.componentType == ComponentTypes.CELL || this.componentType == ComponentTypes.PLASMACELL) {
+ if (renderPass == 0 && !CORE.ConfigSwitches.useGregtechTextures) {
+ return Utils.rgbtoHexValue(255, 255, 255);
+ }
+ if (renderPass == 1 && CORE.ConfigSwitches.useGregtechTextures) {
+ return Utils.rgbtoHexValue(255, 255, 255);
+ }
+ }
+
+ try {
+ if (this.componentMaterial == null) {
+ if (extraData != null) {
+ if (short.class.isInstance(extraData)) {
+ short[] abc = (short[]) extraData;
+ return Utils.rgbtoHexValue(abc[0], abc[1], abc[2]);
+ }
+ }
+ return this.componentColour;
+ }
+
+ if (this.componentMaterial.getRGBA()[3] <= 1) {
+ return this.componentColour;
+ } else {
+ // Mild Glow Effect
+ if (this.componentMaterial.getRGBA()[3] == 2) {
+ // 4 sec cycle, 200 control point. 20ms interval.
+ int currentFrame = (int) ((System.nanoTime() % 4_000_000_000L) / 20_000_000L);
+ int value = currentFrame < 50 ? currentFrame + 1
+ : currentFrame < 100 ? 50 : currentFrame < 150 ? 149 - currentFrame : 0;
+ return Utils.rgbtoHexValue(
+ Math.min(255, Math.max(componentMaterial.getRGBA()[0] + value, 0)),
+ Math.min(255, Math.max(componentMaterial.getRGBA()[1] + value, 0)),
+ Math.min(255, Math.max(componentMaterial.getRGBA()[2] + value, 0)));
+ }
+
+ // Rainbow Hue Cycle
+ else if (this.componentMaterial.getRGBA()[3] == 3) {
+ return Color.HSBtoRGB((float) (System.nanoTime() % 8_000_000_000L) / 8_000_000_000f, 1, 1);
+ }
+ }
+
+ } catch (Throwable t) {
+
+ }
+ return this.componentColour;
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ if (CORE.ConfigSwitches.useGregtechTextures) {
+ if (pass == 0) {
+ return this.base;
+ }
+ return this.overlay;
+ }
+ return this.base;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister i) {
+
+ if (CORE.ConfigSwitches.useGregtechTextures) {
+ this.base = i.registerIcon(getCorrectTextures());
+ this.overlay = i.registerIcon(getCorrectTextures() + "_OVERLAY");
+ } else {
+ this.base = i.registerIcon(getCorrectTextures());
+ // this.overlay = i.registerIcon(getCorrectTextures() + "_OVERLAY");
+ }
+ }
+
+ public static enum ComponentTypes {
+
+ DUST("Dust", "@ Dust", "dust", OrePrefixes.dust),
+ DUSTSMALL("DustSmall", "Small Pile of @ Dust", "dustSmall", OrePrefixes.dustSmall),
+ DUSTTINY("DustTiny", "Tiny Pile of @ Dust", "dustTiny", OrePrefixes.dustTiny),
+ INGOT("Ingot", "@ Ingot", "ingot", OrePrefixes.ingot),
+ HOTINGOT("HotIngot", "Hot @ Ingot", "ingotHot", OrePrefixes.ingotHot),
+ PLATE("Plate", "@ Plate", "plate", OrePrefixes.plate),
+ PLATEDOUBLE("PlateDouble", "Double @ Plate", "plateDouble", OrePrefixes.plateDouble),
+ ROD("Rod", "@ Rod", "stick", OrePrefixes.stick),
+ RODLONG("RodLong", "Long @ Rod", "stickLong", OrePrefixes.stickLong),
+ GEAR("Gear", "@ Gear", "gearGt", OrePrefixes.gearGt),
+ SMALLGEAR("SmallGear", "Small @ Gear", "gearGtSmall", OrePrefixes.gearGtSmall), // TODO
+ SCREW("Screw", "@ Screw", "screw", OrePrefixes.screw),
+ BOLT("Bolt", "@ Bolt", "bolt", OrePrefixes.bolt),
+ ROTOR("Rotor", "@ Rotor", "rotor", OrePrefixes.rotor),
+ RING("Ring", "@ Ring", "ring", OrePrefixes.ring),
+ FOIL("Foil", "@ Foil", "foil", OrePrefixes.foil),
+ PLASMACELL("CellPlasma", "@ Plasma Cell", "cellPlasma", OrePrefixes.cellPlasma),
+ CELL("Cell", "@ Cell", "cell", OrePrefixes.cell),
+ NUGGET("Nugget", "@ Nugget", "nugget", OrePrefixes.nugget),
+ SPRING("Spring", "@ Spring", "spring", OrePrefixes.spring),
+ SMALLSPRING("SmallSpring", "Small @ Spring", "springSmall", OrePrefixes.springSmall),
+ FINEWIRE("FineWire", "Fine @ Wire", "wireFine", OrePrefixes.wireFine),
+ PLATEDENSE("PlateDense", "Dense @ Plate", "plateDense", OrePrefixes.plateDense),;
+
+ private final String COMPONENT_NAME;
+ private final String DISPLAY_NAME;
+ private final String OREDICT_NAME;
+ private final OrePrefixes a_GT_EQUAL;
+
+ private ComponentTypes(final String LocalName, final String DisplayName, final String OreDictName,
+ final OrePrefixes aPrefix) {
+ this.COMPONENT_NAME = LocalName;
+ this.DISPLAY_NAME = DisplayName;
+ this.OREDICT_NAME = OreDictName;
+ this.a_GT_EQUAL = aPrefix;
+ }
+
+ public String getComponent() {
+ return this.COMPONENT_NAME;
+ }
+
+ public String getName() {
+ return this.DISPLAY_NAME;
+ }
+
+ public String getOreDictName() {
+ return this.OREDICT_NAME;
+ }
+
+ public OrePrefixes getGtOrePrefix() {
+ return this.a_GT_EQUAL;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemDamageable.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemDamageable.java
new file mode 100644
index 0000000000..9a4109a1de
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemDamageable.java
@@ -0,0 +1,194 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+
+public class BaseItemDamageable extends Item {
+
+ private final EnumRarity rarity;
+ private final String itemDescription;
+ protected String itemName;
+ private final boolean hasEffect;
+
+ public BaseItemDamageable(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize,
+ final int maxDmg, final String description, final EnumRarity regRarity, final EnumChatFormatting colour,
+ final boolean Effect, final ItemStack OverrideItem) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setCreativeTab(creativeTab);
+ this.setMaxStackSize(1);
+ this.setMaxDamage(251);
+ this.setNoRepair();
+ this.rarity = regRarity;
+ this.itemDescription = description;
+ this.hasEffect = Effect;
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ public String getItemDescription() {
+ return this.itemDescription;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ int dmg = (int) getItemDamage(stack);
+ if (dmg <= 3) {
+ list.add(EnumChatFormatting.GRAY + this.itemDescription);
+ }
+ if (dmg > 3 && dmg <= 25) {
+ list.add(
+ EnumChatFormatting.GRAY
+ + "You have discovered that smashing this against valuable stones has some function..");
+ } else if (dmg > 0) {
+ int maxDamage = 250;
+ list.add(
+ EnumChatFormatting.GRAY + ""
+ + (maxDamage - getItemDamage(stack))
+ + "/"
+ + maxDamage
+ + " gems remaining.");
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public EnumRarity getRarity(final ItemStack par1ItemStack) {
+ int dmg = (int) getItemDamage(par1ItemStack);
+ if (dmg > 200) {
+ return EnumRarity.epic;
+ }
+ return this.rarity;
+ }
+
+ @Override
+ public boolean hasEffect(final ItemStack par1ItemStack, final int pass) {
+ int dmg = (int) getItemDamage(par1ItemStack);
+ if (dmg > 200) {
+ return true;
+ }
+ return this.hasEffect;
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ if ((this.itemName == null) || this.itemName.equals("")) {
+ return super.getItemStackDisplayName(tItem);
+ }
+ return this.itemName;
+ }
+
+ private static boolean createNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Value", 0);
+ tagMain.setTag("Damage", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static final long getItemDamage(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("Damage");
+ if (aNBT != null) {
+ return aNBT.getLong("Value");
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return 0L;
+ }
+
+ public static final boolean setItemDamage(final ItemStack aStack, final long aDamage) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("Damage");
+ if (aNBT != null) {
+ aNBT.setLong("Value", aDamage);
+ return true;
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return false;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ if (stack.getTagCompound() == null) {
+ createNBT(stack);
+ }
+ double currentDamage = getItemDamage(stack);
+ double durabilitypercent = currentDamage / 100;
+ double inverse = (100 - durabilitypercent);
+ return durabilitypercent;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ int dmg = (int) getItemDamage(stack);
+ if (dmg <= 20) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public static ItemStack damageItem(ItemStack item) {
+ if (item != null) {
+ long currentUse = BaseItemDamageable.getItemDamage(item);
+ if (currentUse >= 0 && currentUse <= 250) {
+ BaseItemDamageable.setItemDamage(item, currentUse + 1);
+ return item;
+ } else {
+ return item;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean doesContainerItemLeaveCraftingGrid(ItemStack stack) {
+ Logger.INFO("Does Leave Table? " + stack.getDisplayName());
+ return true;
+ }
+
+ @Override
+ public boolean getShareTag() {
+ return true;
+ }
+
+ @Override
+ public boolean hasContainerItem(ItemStack stack) {
+ return true;
+ }
+
+ @Override
+ public ItemStack getContainerItem(ItemStack itemStack) {
+ ItemStack stack = itemStack.copy();
+ // stack.setItemDamage(stack.getItemDamage() + 1);
+ damageItem(stack);
+ stack.stackSize = 1;
+ return stack;
+ }
+
+ @Override
+ public int getDamage(ItemStack stack) {
+ return (int) getItemDamage(stack);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemTCShard.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemTCShard.java
new file mode 100644
index 0000000000..3ecb6960d6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemTCShard.java
@@ -0,0 +1,69 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemTCShard extends Item {
+
+ public final String unlocalName;
+ public final String displayName;
+ public final int itemColour;
+
+ public BaseItemTCShard(final String DisplayName, final int colour) {
+ this(DisplayName, colour, null);
+ }
+
+ public BaseItemTCShard(final String DisplayName, final int colour, final String[] Description) {
+ this.unlocalName = "item" + Utils.sanitizeString(DisplayName);
+ this.displayName = DisplayName;
+ this.itemColour = colour;
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setUnlocalizedName(this.unlocalName);
+ if (Description != null) {
+ for (int i = 0; i < Description.length; i++) {
+ GT_LanguageManager
+ .addStringLocalization("gtplusplus." + getUnlocalizedName() + ".tooltip." + i, Description[i]);
+ }
+ }
+ this.setMaxStackSize(64);
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemShard");
+ GameRegistry.registerItem(this, this.unlocalName);
+ GT_OreDictUnificator.registerOre("shard" + DisplayName, ItemUtils.getSimpleStack(this));
+ GT_OreDictUnificator.registerOre("gemInfused" + DisplayName, ItemUtils.getSimpleStack(this));
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ for (int i = 0;; i++) {
+ String tooltip = GT_LanguageManager
+ .getTranslation("gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i);
+ if (!("gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i).equals(tooltip)) {
+ list.add(tooltip);
+ } else break;
+ }
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ return this.itemColour;
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {}
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemTickable.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemTickable.java
new file mode 100644
index 0000000000..8417eba3d1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemTickable.java
@@ -0,0 +1,332 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+public class BaseItemTickable extends CoreItem {
+
+ public final String[] descriptionString;
+ public final int itemColour;
+ public final int maxTicks;
+ public final boolean twoRenderPasses;
+ public final boolean ticksInContainers;
+
+ public IIcon[] mIcon = new IIcon[2];
+
+ public BaseItemTickable(boolean twoPass, final String unlocalName, final int colour, final int maxTicks) {
+ this(false, twoPass, unlocalName, colour, maxTicks, new String[] {});
+ }
+
+ public BaseItemTickable(boolean containerTick, boolean twoPass, final String unlocalName, final int colour,
+ final int maxTicks) {
+ this(containerTick, twoPass, unlocalName, colour, maxTicks, new String[] {});
+ }
+
+ public BaseItemTickable(boolean containerTick, boolean twoPass, final String unlocalName, final int colour,
+ final int maxTicks, final String[] Description) {
+ super(
+ unlocalName,
+ AddToCreativeTab.tabMisc,
+ 1,
+ 999999999,
+ Description,
+ EnumRarity.epic,
+ EnumChatFormatting.DARK_RED,
+ true,
+ null);
+ this.itemColour = colour;
+ this.descriptionString = Description;
+ this.maxTicks = maxTicks;
+ this.twoRenderPasses = twoPass;
+ this.ticksInContainers = containerTick;
+ this.maxStackSize = 1;
+ // setGregtechItemList();
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (world == null || iStack == null) {
+ return;
+ }
+ if (world.isRemote) {
+ return;
+ }
+
+ boolean active = isTicking(world, iStack);
+ if (active) {
+ tickItemTag(world, iStack);
+ }
+ }
+
+ /*
+ * private final boolean setGregtechItemList() { ItemList.Component_LavaFilter.set(this); return
+ * ItemList.Component_LavaFilter.get(1) != null ? true : false; }
+ */
+
+ /**
+ *
+ * Handle Custom Rendering
+ *
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return this.twoRenderPasses;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int renderPass) {
+ if (renderPass == 1 && this.twoRenderPasses) {
+ return Utils.rgbtoHexValue(255, 255, 255);
+ }
+ return this.itemColour;
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ if (this.twoRenderPasses) {
+ if (pass == 0) {
+ return this.mIcon[0];
+ }
+ return this.mIcon[1];
+ }
+ return this.mIcon[0];
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister i) {
+
+ if (this.twoRenderPasses) {
+ this.mIcon[0] = i.registerIcon(GTPlusPlus.ID + ":" + this.getUnlocalizedName());
+ this.mIcon[1] = i.registerIcon(GTPlusPlus.ID + ":" + this.getUnlocalizedName() + "_OVERLAY");
+ } else {
+ this.mIcon[0] = i.registerIcon(GTPlusPlus.ID + ":" + this.getUnlocalizedName());
+ // this.overlay = i.registerIcon(getCorrectTextures() + "_OVERLAY");
+ }
+ }
+
+ protected int getMaxTicks(ItemStack aStack) {
+ return maxTicks;
+ }
+
+ protected boolean createNBT(World world, ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Tick", 0);
+ tagNBT.setLong("maxTick", getMaxTicks(rStack));
+ tagNBT.setBoolean("isActive", true);
+
+ // Try set world time
+ if (world != null) {
+ // tagNBT.setLong("CreationDate", world.getTotalWorldTime());
+ }
+
+ tagMain.setTag("TickableItem", tagNBT);
+ rStack.setTagCompound(tagMain);
+ Logger.INFO("Created Tickable NBT data.");
+ return true;
+ }
+
+ public final long getTicks(World world, final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ return aNBT.getLong("Tick");
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return 0L;
+ }
+
+ public final boolean setTicks(World world, final ItemStack aStack, final long aDamage) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ aNBT.setLong("Tick", aDamage);
+ return true;
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return false;
+ }
+
+ public final boolean isTicking(World world, final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ return aNBT.getBoolean("isActive");
+ }
+ } else {
+ return createNBT(world, aStack);
+ }
+ return true;
+ }
+
+ public final boolean setTicking(World world, final ItemStack aStack, final boolean active) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ aNBT.setBoolean("isActive", active);
+ return true;
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return false;
+ }
+
+ public final boolean getTicksInContainer(World world, final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ return aNBT.getBoolean("ticksInContainer");
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return false;
+ }
+
+ public final boolean setTicksInContainer(World world, final ItemStack aStack, final boolean active) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ aNBT.setBoolean("ticksInContainer", active);
+ return true;
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return false;
+ }
+
+ public final long getDifferenceInWorldTimeToCreationTime(World world, final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ return (world.getTotalWorldTime() - aNBT.getLong("CreationDate"));
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return 0L;
+ }
+
+ public final boolean setItemStackCreationTime(final ItemStack aStack, World world) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ if (aNBT != null) {
+ aNBT.setLong("CreationDate", world.getTotalWorldTime());
+ return true;
+ }
+ } else {
+ createNBT(world, aStack);
+ }
+ return false;
+ }
+
+ public final boolean tickItemTag(World world, ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ if (aNBT.hasKey("TickableItem")) {
+ aNBT = aNBT.getCompoundTag("TickableItem");
+ // Done Ticking
+ if (getMaxTicks(aStack) - getTicks(world, aStack) <= 0) {
+ setTicking(world, aStack, false);
+ return false;
+ }
+ if (isTicking(world, aStack)) {
+ if (aNBT != null) {
+ aNBT.setLong("Tick", getTicks(world, aStack) + 1);
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ }
+ return createNBT(world, aStack);
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ if (stack.getTagCompound() == null) {
+ // createNBT(null, stack);
+ return 0;
+ }
+ double currentDamage = getTicks(null, stack);
+ double durabilitypercent = currentDamage / getMaxTicks(stack);
+ return durabilitypercent;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, @SuppressWarnings("rawtypes") List list,
+ boolean bool) {
+ World world = player.getEntityWorld();
+ if (this.descriptionString.length > 0) {
+ list.add(EnumChatFormatting.GRAY + this.descriptionString[0]);
+ }
+ long maxTicks = getMaxTicks(stack);
+ long ticks = 0;
+ if (stack.hasTagCompound()) {
+ ticks = getTicks(world, stack);
+ }
+ EnumChatFormatting durability = EnumChatFormatting.GRAY;
+ if (maxTicks - ticks > (maxTicks * 0.8)) {
+ durability = EnumChatFormatting.GRAY;
+ } else if (maxTicks - ticks > (maxTicks * 0.6)) {
+ durability = EnumChatFormatting.GREEN;
+ } else if (maxTicks - ticks > (maxTicks * 0.4)) {
+ durability = EnumChatFormatting.YELLOW;
+ } else if (maxTicks - ticks > (maxTicks * 0.2)) {
+ durability = EnumChatFormatting.GOLD;
+ } else if (maxTicks - ticks > 0) {
+ durability = EnumChatFormatting.RED;
+ }
+ list.add(durability + "" + ((maxTicks - ticks) / 20) + EnumChatFormatting.GRAY + " seconds until decay");
+
+ if (this.descriptionString.length > 1) {
+ for (int h = 1; h < this.descriptionString.length; h++) {
+ list.add(EnumChatFormatting.GRAY + this.descriptionString[h]);
+ }
+ }
+
+ // super.addInformation(stack, player, list, bool);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemWithDamageValue.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemWithDamageValue.java
new file mode 100644
index 0000000000..0e1b0ab0f2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/BaseItemWithDamageValue.java
@@ -0,0 +1,30 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+public class BaseItemWithDamageValue extends Item {
+
+ public BaseItemWithDamageValue(final String unlocalizedName) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setMaxStackSize(1);
+ this.setMaxDamage(100);
+ }
+
+ @Override
+ public void setDamage(final ItemStack stack, final int damage) {
+ super.setDamage(stack, damage);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/BasicSpawnEgg.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/BasicSpawnEgg.java
new file mode 100644
index 0000000000..b564d60424
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/BasicSpawnEgg.java
@@ -0,0 +1,238 @@
+package gtPlusPlus.core.item.base;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockLiquid;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityList;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.IEntityLivingData;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemMonsterPlacer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Facing;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class BasicSpawnEgg extends ItemMonsterPlacer {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon theIcon;
+
+ protected int colorBase = 0x000000;
+ protected int colorSpots = 0xFFFFFF;
+ protected String entityMODID = "";
+ protected String entityToSpawnName = "";
+ protected String entityToSpawnNameFull = "";
+ protected EntityLiving entityToSpawn = null;
+
+ public BasicSpawnEgg() {
+ super();
+ }
+
+ public BasicSpawnEgg(final String MODID, final String parEntityToSpawnName, final int parPrimaryColor,
+ final int parSecondaryColor) {
+ this.setHasSubtypes(false);
+ this.maxStackSize = 64;
+ this.setCreativeTab(AddToCreativeTab.tabOther);
+ this.setEntityToSpawnName(parEntityToSpawnName);
+ this.colorBase = parPrimaryColor;
+ this.colorSpots = parSecondaryColor;
+ this.entityMODID = MODID;
+
+ // DEBUG
+ Logger.WARNING("Spawn egg constructor for " + this.entityToSpawnName);
+ }
+
+ /**
+ * Callback for item usage. If the item does something special on right clicking,
+ *
+ * he will have one of those. Return True if something happen and false if it don't. This is for ITEMS, not BLOCKS
+ */
+ @Override
+ public boolean onItemUse(final ItemStack par1ItemStack, final EntityPlayer par2EntityPlayer, final World par3World,
+ int par4, int par5, int par6, final int par7, final float par8, final float par9, final float par10) {
+ if (par3World.isRemote) {
+ return true;
+ }
+ final Block block = par3World.getBlock(par4, par5, par6);
+ par4 += Facing.offsetsXForSide[par7];
+ par5 += Facing.offsetsYForSide[par7];
+ par6 += Facing.offsetsZForSide[par7];
+ double d0 = 0.0D;
+
+ if ((par7 == 1) && (block.getRenderType() == 11)) {
+ d0 = 0.5D;
+ }
+
+ final Entity entity = this.spawnEntity(par3World, par4 + 0.5D, par5 + d0, par6 + 0.5D);
+
+ if (entity != null) {
+ if ((entity instanceof EntityLivingBase) && par1ItemStack.hasDisplayName()) {
+ ((EntityLiving) entity).setCustomNameTag(par1ItemStack.getDisplayName());
+ }
+
+ if (!par2EntityPlayer.capabilities.isCreativeMode) {
+ --par1ItemStack.stackSize;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Called whenever this item is equipped and the right mouse button is pressed.
+ *
+ * Args: itemStack, world, entityPlayer
+ */
+ @Override
+ public ItemStack onItemRightClick(final ItemStack par1ItemStack, final World par2World,
+ final EntityPlayer par3EntityPlayer) {
+ if (par2World.isRemote) {
+ return par1ItemStack;
+ }
+ final MovingObjectPosition movingobjectposition = this
+ .getMovingObjectPositionFromPlayer(par2World, par3EntityPlayer, true);
+
+ if (movingobjectposition == null) {
+ return par1ItemStack;
+ }
+ if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
+
+ final int i = movingobjectposition.blockX;
+ final int j = movingobjectposition.blockY;
+ final int k = movingobjectposition.blockZ;
+
+ if (!par2World.canMineBlock(par3EntityPlayer, i, j, k)) {
+ return par1ItemStack;
+ }
+
+ if (!par3EntityPlayer.canPlayerEdit(i, j, k, movingobjectposition.sideHit, par1ItemStack)) {
+ return par1ItemStack;
+ }
+
+ if (par2World.getBlock(i, j, k) instanceof BlockLiquid) {
+ final Entity entity = this.spawnEntity(par2World, i, j, k);
+
+ if (entity != null) {
+ if ((entity instanceof EntityLivingBase) && par1ItemStack.hasDisplayName()) {
+ ((EntityLiving) entity).setCustomNameTag(par1ItemStack.getDisplayName());
+ }
+
+ if (!par3EntityPlayer.capabilities.isCreativeMode) {
+ --par1ItemStack.stackSize;
+ }
+ }
+ }
+ }
+
+ return par1ItemStack;
+ }
+
+ /**
+ * Spawns the creature specified by the egg's type in the location specified by
+ *
+ * the last three parameters. Parameters: world, entityID, x, y, z.
+ */
+ public Entity spawnEntity(final World parWorld, final double parX, final double parY, final double parZ) {
+
+ if (!parWorld.isRemote) // never spawn entity on client side
+ {
+ this.entityToSpawnNameFull = this.entityMODID + "." + this.entityToSpawnName;
+ if (EntityList.stringToClassMapping.containsKey(this.entityToSpawnNameFull)) {
+ this.entityToSpawn = (EntityLiving) EntityList.createEntityByName(this.entityToSpawnNameFull, parWorld);
+
+ this.entityToSpawn.setLocationAndAngles(
+ parX,
+ parY,
+ parZ,
+ MathHelper.wrapAngleTo180_float(parWorld.rand.nextFloat() * 360.0F),
+ 0.0F);
+
+ parWorld.spawnEntityInWorld(this.entityToSpawn);
+ this.entityToSpawn.onSpawnWithEgg((IEntityLivingData) null);
+ this.entityToSpawn.playLivingSound();
+ } else {
+ // DEBUG
+ Logger.WARNING("Entity not found " + this.entityToSpawnName);
+ }
+ }
+
+ return this.entityToSpawn;
+ }
+
+ /**
+ * returns a list of items with the same ID, but different meta (eg: dye returns 16 items)
+ */
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(final Item parItem, final CreativeTabs parTab, final List parList) {
+ parList.add(new ItemStack(parItem, 1, 0));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(final ItemStack par1ItemStack, final int parColorType) {
+ return (parColorType == 0) ? this.colorBase : this.colorSpots;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ // Doing this override means that there is no localization for language
+ // unless you specifically check for localization here and convert
+ public String getItemStackDisplayName(final ItemStack par1ItemStack) {
+ return "Spawn " + this.entityToSpawnName;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(final IIconRegister par1IconRegister) {
+ super.registerIcons(par1IconRegister);
+ this.theIcon = par1IconRegister.registerIcon(this.getIconString() + "_overlay");
+ }
+
+ /**
+ * Gets an icon index based on an item's damage value and the given render pass
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIconFromDamageForRenderPass(final int parDamageVal, final int parRenderPass) {
+ return parRenderPass > 0 ? this.theIcon : super.getIconFromDamageForRenderPass(parDamageVal, parRenderPass);
+ }
+
+ public void setColors(final int parColorBase, final int parColorSpots) {
+ this.colorBase = parColorBase;
+ this.colorSpots = parColorSpots;
+ }
+
+ public int getColorBase() {
+ return this.colorBase;
+ }
+
+ public int getColorSpots() {
+ return this.colorSpots;
+ }
+
+ public final void setEntityToSpawnName(final String parEntityToSpawnName) {
+ this.entityToSpawnName = parEntityToSpawnName;
+ this.entityToSpawnNameFull = this.entityMODID + "." + this.entityToSpawnName;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/CoreItem.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/CoreItem.java
new file mode 100644
index 0000000000..4745fda281
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/CoreItem.java
@@ -0,0 +1,286 @@
+package gtPlusPlus.core.item.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class CoreItem extends Item {
+
+ private final EnumRarity rarity;
+ private final EnumChatFormatting descColour;
+ protected String itemName;
+ private final boolean hasEffect;
+
+ // Replace Item - What does this item turn into when held.
+ private final ItemStack turnsInto;
+
+ // 0
+ /*
+ * Name, Tab - 64 Stack, 0 Dmg
+ */
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab) {
+ this(unlocalizedName, creativeTab, 64, 0); // Calls 3
+ }
+
+ // 0
+ /*
+ * Name, Tab - 64 Stack, 0 Dmg
+ */
+ public CoreItem(final String unlocalizedName, final String displayName, final CreativeTabs creativeTab) {
+ this(unlocalizedName, creativeTab, 64, 0); // Calls 3
+ this.itemName = displayName;
+ }
+
+ // 0.1
+ /*
+ * Name, Tab - 64 Stack, 0 Dmg
+ */
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final ItemStack OverrideItem) {
+ this(
+ unlocalizedName,
+ creativeTab,
+ 64,
+ 0,
+ new String[] {
+ "This item will be replaced by another when held by a player, it is old and should not be used in recipes." },
+ EnumRarity.uncommon,
+ EnumChatFormatting.UNDERLINE,
+ false,
+ OverrideItem); // Calls 5
+ }
+
+ // 0.1
+ /*
+ * Name, Tab - 64 Stack, 0 Dmg
+ */
+ public CoreItem(final String unlocalizedName, final String displayName, final CreativeTabs creativeTab,
+ final ItemStack OverrideItem) {
+ this(
+ unlocalizedName,
+ creativeTab,
+ 64,
+ 0,
+ new String[] {
+ "This item will be replaced by another when held by a player, it is old and should not be used in recipes." },
+ EnumRarity.uncommon,
+ EnumChatFormatting.UNDERLINE,
+ false,
+ OverrideItem); // Calls 5
+ this.itemName = displayName;
+ }
+
+ // 1
+ /*
+ * Name, Tab, Stack - 0 Dmg
+ */
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize) {
+ this(unlocalizedName, creativeTab, stackSize, 0); // Calls 3
+ }
+
+ // 2
+ /*
+ * Name, Tab, Stack, Description - 0 Dmg
+ */
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize,
+ final String[] description) {
+ this(unlocalizedName, creativeTab, stackSize, 0, description); // Calls 4
+ }
+
+ // 3
+ /*
+ * Name, Tab, Stack, Dmg - Description
+ */
+ public CoreItem(String unlocalizedName, CreativeTabs creativeTab, int stackSize, String string) {
+ this(unlocalizedName, creativeTab, stackSize, new String[] { string });
+ }
+
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize,
+ final int maxDmg) {
+ this(unlocalizedName, creativeTab, stackSize, maxDmg, new String[] {}); // Calls 4
+ }
+
+ // 4 //Not Rare + basic tooltip
+ /*
+ * Name, Tab, Stack, Dmg, Description
+ */
+ public CoreItem(String unlocalizedName, CreativeTabs creativeTab, int stackSize, int maxDmg, String string) {
+ this(unlocalizedName, creativeTab, stackSize, maxDmg, new String[] { string });
+ }
+
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize, final int maxDmg,
+ final String[] description) {
+ this(
+ unlocalizedName,
+ creativeTab,
+ stackSize,
+ maxDmg,
+ description,
+ EnumRarity.common,
+ EnumChatFormatting.GRAY,
+ false,
+ null); // Calls 4.5
+ }
+
+ // 4.5
+ /*
+ * Name, Tab, Stack, Dmg, Description, Text Colour - Common
+ */
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize, final int maxDmg,
+ final String[] description, final EnumChatFormatting colour) {
+ this(unlocalizedName, creativeTab, stackSize, maxDmg, description, EnumRarity.common, colour, false, null); // Calls
+ // 5
+ }
+
+ // 4.75
+ /*
+ * Name, Tab, Stack, Dmg, Description, Rarity - Gray text
+ */
+ public CoreItem(String unlocalizedName, CreativeTabs creativeTab, int stackSize, int maxDmg, String string,
+ EnumRarity uncommon) {
+ this(unlocalizedName, creativeTab, stackSize, maxDmg, new String[] { string }, uncommon);
+ }
+
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize, final int maxDmg,
+ final String[] description, final EnumRarity rarity) {
+ this(
+ unlocalizedName,
+ creativeTab,
+ stackSize,
+ maxDmg,
+ description,
+ rarity,
+ EnumChatFormatting.GRAY,
+ false,
+ null); // Calls 5
+ }
+
+ // 5
+ /*
+ * Name, Tab, Stack, Dmg, Description, Rarity, Text Colour, Effect
+ */
+ public CoreItem(final String unlocalizedName, final CreativeTabs creativeTab, final int stackSize, final int maxDmg,
+ final String[] description, final EnumRarity regRarity, final EnumChatFormatting colour, final boolean Effect,
+ final ItemStack OverrideItem) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setCreativeTab(creativeTab);
+ this.setMaxStackSize(stackSize);
+ this.setMaxDamage(maxDmg);
+ this.rarity = regRarity;
+ this.setItemDescription(description);
+ this.descColour = colour != null ? colour : EnumChatFormatting.RESET;
+ this.hasEffect = Effect;
+ this.turnsInto = OverrideItem;
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ // 6
+ /*
+ * Name, Tab, Stack, Dmg, Description, Rarity, Text Colour, Effect
+ */
+ public CoreItem(final String unlocalizedName, final String displayName, final CreativeTabs creativeTab,
+ final int stackSize, final int maxDmg, final String[] description, final EnumRarity regRarity,
+ final EnumChatFormatting colour, final boolean Effect, final ItemStack OverrideItem) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.itemName = displayName;
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setCreativeTab(creativeTab);
+ this.setMaxStackSize(stackSize);
+ this.setMaxDamage(maxDmg);
+ this.rarity = regRarity;
+ this.setItemDescription(description);
+ this.descColour = colour != null ? colour : EnumChatFormatting.RESET;
+ this.hasEffect = Effect;
+ this.turnsInto = OverrideItem;
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ for (int i = 0;; i++) {
+ String tooltip = GT_LanguageManager
+ .getTranslation("gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i);
+ if (!("gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i).equals(tooltip)) {
+ list.add(tooltip);
+ } else break;
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public EnumRarity getRarity(final ItemStack par1ItemStack) {
+ return this.rarity;
+ }
+
+ @Override
+ public boolean hasEffect(final ItemStack par1ItemStack, final int pass) {
+ return this.hasEffect;
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (this.turnsInto != null) {
+ if (entityHolding instanceof EntityPlayer) {
+
+ Logger.INFO("Replacing " + iStack.getDisplayName() + " with " + this.turnsInto.getDisplayName() + ".");
+ final ItemStack tempTransform = this.turnsInto;
+ if (iStack.stackSize == 64) {
+ tempTransform.stackSize = 64;
+ ((EntityPlayer) entityHolding).inventory.addItemStackToInventory((tempTransform));
+ for (int l = 0; l < 64; l++) {
+ ((EntityPlayer) entityHolding).inventory.consumeInventoryItem(this);
+ }
+
+ } else {
+ tempTransform.stackSize = 1;
+ ((EntityPlayer) entityHolding).inventory.addItemStackToInventory((tempTransform));
+ ((EntityPlayer) entityHolding).inventory.consumeInventoryItem(this);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ public ItemStack getStack() {
+ return ItemUtils.getSimpleStack(this);
+ }
+
+ public void setItemDescription(String[] description) {
+ for (int i = 0; i < description.length; i++) {
+ GT_LanguageManager.addStringLocalization(
+ "gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i,
+ description[i]);
+ }
+ }
+ /*
+ * @Override public String getItemStackDisplayName(final ItemStack tItem) { if ((this.itemName == null) ||
+ * this.itemName.equals("")) { return super.getItemStackDisplayName(tItem); } return this.itemName; }
+ */
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/bolts/BaseItemBolt.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/bolts/BaseItemBolt.java
new file mode 100644
index 0000000000..74ff99a7fe
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/bolts/BaseItemBolt.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.bolts;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemBolt extends BaseItemComponent {
+
+ public BaseItemBolt(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.BOLT);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemCell.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemCell.java
new file mode 100644
index 0000000000..1140390375
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemCell.java
@@ -0,0 +1,73 @@
+package gtPlusPlus.core.item.base.cell;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import ic2.core.Ic2Items;
+
+public class BaseItemCell extends BaseItemComponent {
+
+ ComponentTypes Cell = ComponentTypes.CELL;
+
+ public BaseItemCell(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.CELL);
+ this.fluidColour = (short[]) material.getRGBA();
+ }
+
+ public BaseItemCell(final String unlocalName, final String localName, final short[] RGBa) {
+ super(unlocalName, localName, RGBa);
+ this.fluidColour = RGBa;
+ FluidStack aFluid = FluidUtils.getFluidStack(unlocalName.toLowerCase(), 1000);
+ if (aFluid != null) {
+ FluidContainerRegistry.registerFluidContainer(aFluid, ItemUtils.getSimpleStack(this), Ic2Items.cell.copy());
+ }
+ }
+
+ public BaseItemCell(final String unlocalName, final String localName, final short[] RGBa, final Fluid cellFluid) {
+ super(unlocalName, localName, RGBa);
+ this.fluidColour = RGBa;
+ FluidContainerRegistry.registerFluidContainer(
+ FluidUtils.getFluidStack(cellFluid, 1000),
+ ItemUtils.getSimpleStack(this),
+ Ic2Items.cell.copy());
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister i) {
+
+ if (CORE.ConfigSwitches.useGregtechTextures) {
+ this.base = i.registerIcon(GregTech.ID + ":" + "materialicons/METALLIC/" + "cell");
+ this.overlay = i.registerIcon(GregTech.ID + ":" + "materialicons/METALLIC/" + "cell_OVERLAY");
+ } else {
+ this.base = i.registerIcon(GTPlusPlus.ID + ":" + "item" + this.Cell.getComponent());
+ this.overlay = i.registerIcon(GTPlusPlus.ID + ":" + "item" + this.Cell.getComponent() + "_Overlay");
+ }
+ // this.overlay = cellMaterial.getFluid(1000).getFluid().get
+ }
+
+ private final short[] fluidColour;
+ boolean upwards = true;
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int renderPass) {
+ if (renderPass == 0 && !CORE.ConfigSwitches.useGregtechTextures) {
+ return Utils.rgbtoHexValue(230, 230, 230);
+ }
+ if (renderPass == 1 && CORE.ConfigSwitches.useGregtechTextures) {
+ return Utils.rgbtoHexValue(230, 230, 230);
+ }
+ return this.componentColour;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemPlasmaCell.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemPlasmaCell.java
new file mode 100644
index 0000000000..151f3f3860
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/cell/BaseItemPlasmaCell.java
@@ -0,0 +1,76 @@
+package gtPlusPlus.core.item.base.cell;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+
+public class BaseItemPlasmaCell extends BaseItemComponent {
+
+ private IIcon base;
+ private IIcon overlay;
+ ComponentTypes PlasmaCell = ComponentTypes.PLASMACELL;
+ private int tickCounter = 0;
+ private final int tickCounterMax = 200;
+ private final short[] fluidColour;
+
+ public BaseItemPlasmaCell(final Material material) {
+ super(material, ComponentTypes.PLASMACELL);
+ this.fluidColour = (short[]) material.getRGBA();
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister i) {
+ this.base = i.registerIcon(GTPlusPlus.ID + ":" + "item" + this.PlasmaCell.getComponent());
+ this.overlay = i.registerIcon(GTPlusPlus.ID + ":" + "item" + this.PlasmaCell.getComponent() + "_Overlay");
+ // this.overlay = cellMaterial.getFluid(1000).getFluid().get
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int renderPass) {
+ if (renderPass == 0) {
+ return Utils.rgbtoHexValue(230, 230, 230);
+ }
+ return this.componentColour;
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ if (pass == 0) {
+ return this.base;
+ }
+ return this.overlay;
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (this.componentMaterial != null) {
+ if (!world.isRemote) {
+ if (this.tickCounter < this.tickCounterMax) {
+ this.tickCounter++;
+ } else if (this.tickCounter >= this.tickCounterMax) {
+ entityHolding.attackEntityFrom(DamageSource.onFire, 2);
+ this.tickCounter = 0;
+ }
+ }
+ }
+ super.onUpdate(iStack, world, entityHolding, p_77663_4_, p_77663_5_);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDust.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDust.java
new file mode 100644
index 0000000000..fd52fe78c4
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDust.java
@@ -0,0 +1,135 @@
+package gtPlusPlus.core.item.base.dusts;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemDust extends BaseItemComponent {
+
+ private BaseItemComponent[] mSizedDusts = new BaseItemComponent[2];
+
+ public BaseItemDust(Material aMat) {
+ this(aMat, true);
+ }
+
+ public BaseItemDust(Material aMat, boolean generateSmallDusts) {
+ super(aMat, ComponentTypes.DUST);
+ if (generateSmallDusts) {
+ mSizedDusts[0] = new BaseItemComponent(aMat, ComponentTypes.DUSTSMALL);
+ mSizedDusts[1] = new BaseItemComponent(aMat, ComponentTypes.DUSTTINY);
+ }
+ }
+
+ public BaseItemDust(DustState aState, Material aMat) {
+ super(aMat, ComponentTypes.DUST);
+ if (aState.generatesSmallDust()) {
+ mSizedDusts[0] = new BaseItemComponent(aMat, ComponentTypes.DUSTSMALL);
+ }
+ if (aState.generatesTinyDust()) {
+ mSizedDusts[1] = new BaseItemComponent(aMat, ComponentTypes.DUSTTINY);
+ }
+ }
+
+ private BaseItemDust(String unlocalizedName, String materialName, Material matInfo, int colour, String pileSize,
+ int tier, boolean addRecipes) {
+ super(matInfo, ComponentTypes.DUST);
+ }
+
+ public static class DustState {
+
+ static final int NORMAL = (1);
+ static final int SMALL = (10);
+ static final int TINY = (100);
+ final int MIXTURE;
+ final boolean[] doesThings = new boolean[3];
+
+ public DustState(boolean genDust, boolean genSmallDust, boolean genDustTiny) {
+ int aTotal = 0;
+ if (genDust) {
+ aTotal += NORMAL;
+ doesThings[0] = true;
+ } else {
+ doesThings[0] = false;
+ }
+ if (genSmallDust) {
+ aTotal += SMALL;
+ doesThings[1] = true;
+ } else {
+ doesThings[1] = false;
+ }
+ if (genDustTiny) {
+ aTotal += TINY;
+ doesThings[2] = true;
+ } else {
+ doesThings[2] = false;
+ }
+ MIXTURE = aTotal;
+ }
+
+ public boolean generatesDust() {
+ return doesThings[0];
+ }
+
+ public boolean generatesSmallDust() {
+ return doesThings[1];
+ }
+
+ public boolean generatesTinyDust() {
+ return doesThings[2];
+ }
+
+ private DustState(int amount) {
+
+ if (amount == 1) {
+ doesThings[0] = true;
+ doesThings[1] = false;
+ doesThings[2] = false;
+
+ } else if (amount == 10) {
+ doesThings[0] = false;
+ doesThings[1] = true;
+ doesThings[2] = false;
+ } else if (amount == 100) {
+ doesThings[0] = false;
+ doesThings[1] = false;
+ doesThings[2] = true;
+
+ } else if (amount == 11) {
+ doesThings[0] = true;
+ doesThings[1] = true;
+ doesThings[2] = false;
+
+ } else if (amount == 101) {
+ doesThings[0] = true;
+ doesThings[1] = false;
+ doesThings[2] = true;
+
+ } else if (amount == 110) {
+ doesThings[0] = false;
+ doesThings[1] = true;
+ doesThings[2] = true;
+
+ } else if (amount == 111) {
+ doesThings[0] = true;
+ doesThings[1] = true;
+ doesThings[2] = true;
+ } else {
+ doesThings[0] = false;
+ doesThings[1] = false;
+ doesThings[2] = false;
+ }
+ MIXTURE = amount;
+ }
+
+ public DustState get(int a) {
+ if (a == 1) {
+ return new DustState(NORMAL);
+ } else if (a == 10) {
+ return new DustState(SMALL);
+ } else if (a == 100) {
+ return new DustState(TINY);
+ } else {
+ return new DustState(MIXTURE);
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDustUnique.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDustUnique.java
new file mode 100644
index 0000000000..2592fe3cf7
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/dusts/BaseItemDustUnique.java
@@ -0,0 +1,164 @@
+package gtPlusPlus.core.item.base.dusts;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+import static gtPlusPlus.core.creative.AddToCreativeTab.tabMisc;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemDustUnique extends Item {
+
+ protected final int colour;
+ protected final int sRadiation;
+ protected final String materialName;
+ protected final String chemicalNotation;
+
+ public BaseItemDustUnique(final String unlocalizedName, final String materialName, final int colour,
+ final String pileSize) {
+ this(unlocalizedName, materialName, "NullFormula", colour, pileSize);
+ }
+
+ public BaseItemDustUnique(final String unlocalizedName, final String materialName, final String mChemicalFormula,
+ final int colour, final String pileSize) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setMaxStackSize(64);
+ this.setTextureName(this.getCorrectTexture(pileSize));
+ this.setCreativeTab(tabMisc);
+ this.colour = colour;
+ this.materialName = materialName;
+ if (mChemicalFormula == null || mChemicalFormula.equals("") || mChemicalFormula.equals("NullFormula")) {
+ this.chemicalNotation = StringUtils.subscript(materialName);
+ } else {
+ this.chemicalNotation = StringUtils.subscript(mChemicalFormula);
+ }
+ this.sRadiation = ItemUtils.getRadioactivityLevel(materialName);
+ GameRegistry.registerItem(this, unlocalizedName);
+
+ String type;
+ if (this.getUnlocalizedName()
+ .contains("DustTiny")) {
+ type = "Tiny Pile of %material Dust";
+ } else if (this.getUnlocalizedName()
+ .contains("DustSmall")) {
+ type = "Small Pile of %material Dust";
+ } else {
+ type = "%material Dust";
+ }
+ GT_LanguageManager.addStringLocalization("gtplusplus." + this.getUnlocalizedName() + ".name", type);
+
+ String temp = "";
+ Logger.WARNING("Unlocalized name for OreDict nameGen: " + this.getUnlocalizedName());
+ if (this.getUnlocalizedName()
+ .contains("item.")) {
+ temp = this.getUnlocalizedName()
+ .replace("item.", "");
+ Logger.WARNING("Generating OreDict Name: " + temp);
+ } else {
+ temp = this.getUnlocalizedName();
+ }
+ if (temp.contains("DustTiny")) {
+ temp = temp.replace("itemD", "d");
+ Logger.WARNING("Generating OreDict Name: " + temp);
+ } else if (temp.contains("DustSmall")) {
+ temp = temp.replace("itemD", "d");
+ Logger.WARNING("Generating OreDict Name: " + temp);
+ } else {
+ temp = temp.replace("itemD", "d");
+ Logger.WARNING("Generating OreDict Name: " + temp);
+ }
+ if ((temp != null) && !temp.equals("")) {
+ GT_OreDictUnificator.registerOre(temp, ItemUtils.getSimpleStack(this));
+ }
+ registerComponent();
+ }
+
+ public boolean registerComponent() {
+ if (this.materialName == null) {
+ return false;
+ }
+ String aName = materialName;
+ // Register Component
+ Map<String, ItemStack> aMap = Material.mComponentMap.get(aName);
+ if (aMap == null) {
+ aMap = new HashMap<>();
+ }
+ String aKey = OrePrefixes.dust.name();
+ ItemStack x = aMap.get(aKey);
+ if (x == null) {
+ aMap.put(aKey, ItemUtils.getSimpleStack(this));
+ Logger.MATERIALS("Registering a material component. Item: [" + aName + "] Map: [" + aKey + "]");
+ Material.mComponentMap.put(aName, aMap);
+ return true;
+ } else {
+ // Bad
+ Logger.MATERIALS("Tried to double register a material component. ");
+ return false;
+ }
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack iStack) {
+ return GT_LanguageManager.getTranslation("gtplusplus." + getUnlocalizedName() + ".name")
+ .replace("%material", GT_LanguageManager.getTranslation("gtplusplus.material." + materialName));
+ }
+
+ private String getCorrectTexture(final String pileSize) {
+ if (!CORE.ConfigSwitches.useGregtechTextures) {
+ if ((pileSize.equals("dust")) || (pileSize.equals("Dust"))) {
+ this.setTextureName(GTPlusPlus.ID + ":" + "dust");
+ } else {
+ this.setTextureName(GTPlusPlus.ID + ":" + "dust" + pileSize);
+ }
+ }
+ if (pileSize.toLowerCase()
+ .contains("small")) {
+ return GregTech.ID + ":" + "materialicons/SHINY/dustSmall";
+ } else if (pileSize.toLowerCase()
+ .contains("tiny")) {
+ return GregTech.ID + ":" + "materialicons/SHINY/dustTiny";
+ }
+ return GregTech.ID + ":" + "materialicons/SHINY/dust";
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ if (this.sRadiation > 0) {
+ list.add(CORE.GT_Tooltip_Radioactive.get());
+ }
+ if (this.chemicalNotation.length() > 0 && !chemicalNotation.equals("")
+ && !chemicalNotation.equals("NullFormula")) {
+ list.add(this.chemicalNotation);
+ }
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ public final String getMaterialName() {
+ return StringUtils.subscript(this.materialName);
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ if (this.colour == 0) {
+ return MathUtils.generateSingularRandomHexValue();
+ }
+ return this.colour;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/foil/BaseItemFoil.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/foil/BaseItemFoil.java
new file mode 100644
index 0000000000..9b55461cfd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/foil/BaseItemFoil.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.foil;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemFoil extends BaseItemComponent {
+
+ public BaseItemFoil(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.FOIL);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemGear.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemGear.java
new file mode 100644
index 0000000000..d759c7f116
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemGear.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.gears;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemGear extends BaseItemComponent {
+
+ public BaseItemGear(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.GEAR);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemSmallGear.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemSmallGear.java
new file mode 100644
index 0000000000..ddfdbd7534
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/gears/BaseItemSmallGear.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.gears;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemSmallGear extends BaseItemComponent {
+
+ public BaseItemSmallGear(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.SMALLGEAR);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot.java
new file mode 100644
index 0000000000..fc2748ec23
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot.java
@@ -0,0 +1,20 @@
+package gtPlusPlus.core.item.base.ingots;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemIngot extends BaseItemComponent {
+
+ protected final String materialName;
+ protected final String unlocalName;
+
+ public BaseItemIngot(final Material material) {
+ this(material, ComponentTypes.INGOT);
+ }
+
+ public BaseItemIngot(final Material material, final ComponentTypes type) {
+ super(material, type);
+ this.materialName = material.getLocalizedName();
+ this.unlocalName = material.getUnlocalizedName();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngotHot.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngotHot.java
new file mode 100644
index 0000000000..9d22c0faf8
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngotHot.java
@@ -0,0 +1,111 @@
+package gtPlusPlus.core.item.base.ingots;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.recipe.RecipeMaps.vacuumFreezerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemIngotHot extends BaseItemIngot {
+
+ private final ItemStack outputIngot;
+ private int tickCounter = 0;
+ private final int tickCounterMax = 200;
+ private final int mTier;
+
+ private IIcon base;
+ private IIcon overlay;
+
+ public BaseItemIngotHot(final Material material) {
+ super(material, ComponentTypes.HOTINGOT);
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemIngotHot");
+ this.outputIngot = material.getIngot(1);
+ this.mTier = material.vTier;
+ this.generateRecipe();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack p_77653_1_) {
+ return super.getItemStackDisplayName(p_77653_1_);
+ // return ("Hot "+this.materialName+ " Ingot");
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ return Utils.rgbtoHexValue(225, 225, 225);
+ }
+
+ private void generateRecipe() {
+ Logger.WARNING("Adding Vacuum Freezer recipe for a Hot Ingot of " + this.materialName + ".");
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(this))
+ .itemOutputs(this.outputIngot.copy())
+ .duration(Math.max(this.componentMaterial.getMass() * 3L, 1L) * TICKS)
+ .eut(this.componentMaterial.vVoltageMultiplier)
+ .addTo(vacuumFreezerRecipes);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (this.componentMaterial != null) {
+ if (entityHolding != null && entityHolding instanceof EntityPlayer) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ EntityUtils.applyHeatDamageToEntity(1, world, entityHolding);
+ }
+ }
+ }
+ super.onUpdate(iStack, world, entityHolding, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ if (CORE.ConfigSwitches.useGregtechTextures) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister i) {
+
+ if (CORE.ConfigSwitches.useGregtechTextures) {
+ this.base = i.registerIcon(GregTech.ID + ":" + "materialicons/METALLIC/" + "ingotHot");
+ this.overlay = i.registerIcon(GregTech.ID + ":" + "materialicons/METALLIC/" + "ingotHot_OVERLAY");
+ } else {
+ this.base = i
+ .registerIcon(GTPlusPlus.ID + ":" + "item" + BaseItemComponent.ComponentTypes.HOTINGOT.getComponent());
+ }
+ // this.overlay = cellMaterial.getFluid(1000).getFluid().get
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ if (pass == 0 && CORE.ConfigSwitches.useGregtechTextures) {
+ return this.base;
+ } else if (pass == 1 && CORE.ConfigSwitches.useGregtechTextures) {
+ return this.overlay;
+ } else {
+ return this.overlay;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot_OLD.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot_OLD.java
new file mode 100644
index 0000000000..6335820c9a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/ingots/BaseItemIngot_OLD.java
@@ -0,0 +1,106 @@
+package gtPlusPlus.core.item.base.ingots;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemIngot_OLD extends Item {
+
+ protected int colour;
+ protected String materialName;
+ protected String unlocalName;
+
+ public BaseItemIngot_OLD(final String unlocalizedName, final String materialName, final int colour,
+ final int sRadioactivity) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.unlocalName = unlocalizedName;
+ this.setMaxStackSize(64);
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemIngot");
+ this.colour = colour;
+ this.materialName = materialName;
+ this.sRadiation = sRadioactivity;
+ GameRegistry.registerItem(this, unlocalizedName);
+ String temp = "";
+ if (this.unlocalName.contains("itemIngot")) {
+ temp = this.unlocalName.replace("itemI", "i");
+ } else if (this.unlocalName.contains("itemHotIngot")) {
+ temp = this.unlocalName.replace("itemHotIngot", "ingotHot");
+ }
+ if ((temp != null) && !temp.equals("")) {
+ GT_OreDictUnificator.registerOre(temp, ItemUtils.getSimpleStack(this));
+ }
+ // this.generateCompressorRecipe();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack p_77653_1_) {
+
+ return (this.materialName + " Ingot");
+ }
+
+ public final String getMaterialName() {
+ return this.materialName;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ if (this.colour == 0) {
+ return MathUtils.generateSingularRandomHexValue();
+ }
+ return this.colour;
+ }
+
+ private void generateCompressorRecipe() {
+ if (this.unlocalName.contains("itemIngot")) {
+ final ItemStack tempStack = ItemUtils.getSimpleStack(this, 9);
+ ItemStack tempOutput = null;
+ String temp = this.getUnlocalizedName()
+ .replace("item.itemIngot", "block");
+ Logger.WARNING("Unlocalized name for OreDict nameGen: " + this.getUnlocalizedName());
+ if (this.getUnlocalizedName()
+ .contains("item.")) {
+ temp = this.getUnlocalizedName()
+ .replace("item.", "");
+ Logger.WARNING("Generating OreDict Name: " + temp);
+ }
+ temp = temp.replace("itemIngot", "block");
+ Logger.WARNING("Generating OreDict Name: " + temp);
+ if ((temp != null) && !temp.equals("")) {
+ tempOutput = ItemUtils.getItemStackOfAmountFromOreDict(temp, 1);
+ if (tempOutput != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tempStack)
+ .itemOutputs(tempOutput)
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+ }
+ }
+ } else if (this.unlocalName.contains("itemHotIngot")) {
+ return;
+ }
+ }
+
+ protected final int sRadiation;
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ EntityUtils.applyRadiationDamageToEntity(iStack.stackSize, this.sRadiation, world, entityHolding);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockBasicTile.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockBasicTile.java
new file mode 100644
index 0000000000..cf50da52a3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockBasicTile.java
@@ -0,0 +1,51 @@
+package gtPlusPlus.core.item.base.itemblock;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.interfaces.ITileTooltip;
+
+public class ItemBlockBasicTile extends ItemBlock {
+
+ private final int mID;
+
+ public ItemBlockBasicTile(final Block block) {
+ super(block);
+ this.mID = ((ITileTooltip) block).getTooltipID();
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ if (this.mID == 0) { // Fish trap
+ list.add("This trap catches fish faster if surrounded by more water blocks");
+ list.add("Can also be placed beside upto 4 other fish traps");
+ list.add("Requires at least two faces touching water");
+ list.add("1/1000 chance to produce triple loot.");
+ } else if (this.mID == 4) { // Circuit Table
+ list.add("Easy Circuit Configuration");
+ list.add("Change default setting with a Screwdriver");
+ list.add("Default is used to select slot for auto-insertion");
+ } else if (this.mID == 5) { // Decayables Chest
+ list.add("Chest which holds radioactive materials");
+ list.add("Items which decay will tick while inside");
+ list.add("Place with right click");
+ } else if (this.mID == 6) { // Butterfly Killer
+ list.add("Kills Forestry Butterflies, Bats and other pests");
+ list.add("Use either Formaldehyde or Hydrogen cyanide");
+ list.add("Be weary of your neighbours");
+ } else if (this.mID == 8) { // Volumetric Flask Setter
+ list.add("Easy Flask Configuration");
+ list.add("Configure default input slot with a screwdriver");
+ } else if (this.mID == 9) {
+
+ } else {
+ list.add("Bad Tooltip ID - " + mID);
+ }
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockGtBlock.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockGtBlock.java
new file mode 100644
index 0000000000..98c652a1ba
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockGtBlock.java
@@ -0,0 +1,184 @@
+package gtPlusPlus.core.item.base.itemblock;
+
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.block.base.BasicBlock.BlockTypes;
+import gtPlusPlus.core.block.base.BlockBaseModular;
+import gtPlusPlus.core.block.base.BlockBaseOre;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+
+public class ItemBlockGtBlock extends ItemBlock {
+
+ public static HashMap<String, String> sNameCache = new HashMap<>();
+
+ protected final int blockColour;
+ private int sRadiation;
+
+ private Material mMaterial;
+ protected BlockTypes thisBlockType;
+
+ private final Block thisBlock;
+ private boolean isOre = false;
+ private boolean isModular = false;
+
+ public ItemBlockGtBlock(final Block block) {
+ super(block);
+ this.thisBlock = block;
+ if (block instanceof BlockBaseOre) {
+ this.isOre = true;
+ } else if (block instanceof BlockBaseModular) {
+ this.isModular = true;
+ }
+ final BlockBaseModular baseBlock = (BlockBaseModular) block;
+ if (isModular) {
+ this.blockColour = baseBlock.getRenderColor(0);
+ } else if (isOre) {
+ this.blockColour = block.getBlockColor();
+ } else {
+ this.blockColour = block.getBlockColor();
+ }
+
+ if (block instanceof BlockBaseModular g) {
+ this.mMaterial = g.getMaterialEx();
+ this.thisBlockType = g.thisBlock;
+ } else {
+ this.mMaterial = null;
+ this.thisBlockType = BlockTypes.STANDARD;
+ }
+ }
+
+ public int getBlockTypeMeta() {
+ if (this.thisBlockType.equals(BlockTypes.STANDARD)) {
+ return 0;
+ } else if (this.thisBlockType.equals(BlockTypes.FRAME)) {
+ return 1;
+ } else if (this.thisBlockType.equals(BlockTypes.ORE)) {
+ return 2;
+ }
+ return 0;
+ }
+
+ public String getUnlocalizedBlockName() {
+ return "block." + mMaterial.getUnlocalizedName()
+ + "."
+ + this.thisBlockType.name()
+ .toLowerCase();
+ }
+
+ public String GetProperName() {
+ String tempIngot = sNameCache.get(getUnlocalizedBlockName());
+ if (tempIngot == null) {
+ tempIngot = "BAD.UNLOCAL.NAME";
+ }
+ return tempIngot;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return this.thisBlock.getLocalizedName();
+ }
+
+ public int getRenderColor(final int aMeta) {
+ return this.blockColour;
+ }
+
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+
+ if (this.mMaterial != null) {
+ list.add(this.mMaterial.vChemicalFormula);
+ } else {
+
+ try {
+ BlockBaseModular g = (BlockBaseModular) thisBlock;
+ this.mMaterial = g.getMaterialEx();
+ } catch (Throwable t) {
+
+ }
+
+ // list.add("Material is Null.");
+ }
+
+ if (this.isOre) {
+ if (KeyboardUtils.isCtrlKeyDown()) {
+ Block b = Block.getBlockFromItem(stack.getItem());
+ if (b != null) {
+
+ String aTool = b.getHarvestTool(stack.getItemDamage());
+ int aMiningLevel1 = b.getHarvestLevel(stack.getItemDamage());
+
+ if (this.mMaterial != null) {
+ list.add("Mining Level: " + Math.min(Math.max(aMiningLevel1, 0), 5));
+ list.add("Contains: ");
+ if (mMaterial.getComposites()
+ .isEmpty()) {
+ list.add("- " + mMaterial.getLocalizedName());
+ } else {
+ for (MaterialStack m : mMaterial.getComposites()) {
+ list.add(
+ "- " + m.getStackMaterial()
+ .getLocalizedName() + " x" + m.getPartsPerOneHundred());
+ }
+ }
+ }
+ }
+ } else {
+ list.add(EnumChatFormatting.DARK_GRAY + "Hold Ctrl to show additional info.");
+ }
+ } else {
+ Block b = Block.getBlockFromItem(stack.getItem());
+ if (b != null) {
+ String aTool = b.getHarvestTool(stack.getItemDamage());
+ int aMiningLevel1 = b.getHarvestLevel(stack.getItemDamage());
+ list.add("Mining Level: " + Math.min(Math.max(aMiningLevel1, 0), 5));
+ }
+ }
+
+ if (this.mMaterial != null) {
+ if (this.mMaterial.vRadiationLevel > 0) {
+ list.add(CORE.GT_Tooltip_Radioactive.get());
+ }
+ }
+
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+
+ if (!isModular && !isOre) {
+ mMaterial = null;
+ } else {
+ if (this.mMaterial == null) {
+ Block b = Block.getBlockFromItem(iStack.getItem());
+ if (isOre) {
+ mMaterial = ((BlockBaseOre) b).getMaterialEx();
+ } else {
+ mMaterial = ((BlockBaseModular) b).getMaterialEx();
+ }
+ if (mMaterial != null) {
+ this.sRadiation = mMaterial.vRadiationLevel;
+ } else {
+ this.sRadiation = 0;
+ }
+ }
+ if (this.sRadiation > 0) {
+ EntityUtils.applyRadiationDamageToEntity(iStack.stackSize, this.sRadiation, world, entityHolding);
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockMeta.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockMeta.java
new file mode 100644
index 0000000000..54cfefbac2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockMeta.java
@@ -0,0 +1,106 @@
+package gtPlusPlus.core.item.base.itemblock;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlockWithMetadata;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.api.objects.data.AutoMap;
+
+public class ItemBlockMeta extends ItemBlockWithMetadata {
+
+ private final Block mBlock;
+ private HashMap<Integer, AutoMap<String>> aTooltips = new LinkedHashMap<>();
+
+ public ItemBlockMeta(final Block aBlock) {
+ super(aBlock, aBlock);
+ this.mBlock = aBlock;
+ this.setMaxDamage(0);
+ this.setHasSubtypes(true);
+ if (aBlock instanceof ITileTooltip aTooltip) {
+ // aTooltips.put(aTooltip.getTooltipID(), aTooltip.getTooltipMap());
+ }
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ Block aThis = Block.getBlockFromItem(stack.getItem());
+ if (aThis != null) {
+ if (!aTooltips.isEmpty()) {
+ AutoMap<String> h = aTooltips.get(stack.getItemDamage());
+ if (h != null && !h.isEmpty()) {
+ for (String s : h) {
+ list.add(s);
+ }
+ }
+ }
+ }
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ /**
+ * Gets an icon index based on an item's damage value
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIconFromDamage(final int p_77617_1_) {
+ return this.mBlock.getIcon(2, p_77617_1_);
+ }
+
+ /**
+ * Returns the metadata of the block which this Item (ItemBlock) can place
+ */
+ @Override
+ public int getMetadata(final int p_77647_1_) {
+ return p_77647_1_;
+ }
+
+ @Override
+ public String getUnlocalizedName(final ItemStack stack) {
+ return this.getUnlocalizedName() + "." + stack.getItemDamage();
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack p_82789_1_, ItemStack p_82789_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
+ return false;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ return 0;
+ }
+
+ @Override
+ public int getItemEnchantability(ItemStack stack) {
+ return 0;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockOre.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockOre.java
new file mode 100644
index 0000000000..0cee16b3f6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/itemblock/ItemBlockOre.java
@@ -0,0 +1,148 @@
+package gtPlusPlus.core.item.base.itemblock;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.block.base.BlockBaseOre;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+import gtPlusPlus.everglades.gen.gt.WorldGen_GT_Ore_Layer;
+
+public class ItemBlockOre extends ItemBlock {
+
+ private final BlockBaseOre mThisOre;
+ private final Material mThisMaterial;
+ private final int mThisRadiation;
+
+ public ItemBlockOre(final Block block) {
+ super(block);
+ if (block instanceof BlockBaseOre) {
+ this.mThisOre = (BlockBaseOre) block;
+ this.mThisMaterial = this.mThisOre.getMaterialEx();
+ this.mThisRadiation = this.mThisMaterial.vRadiationLevel;
+ } else {
+ this.mThisOre = null;
+ this.mThisMaterial = null;
+ this.mThisRadiation = 0;
+ }
+ }
+
+ private static Map<String, AutoMap<String>> mMapOreBlockItemToDimName = new LinkedHashMap<>();
+ private static boolean mInitOres_Everglades = false;
+ private AutoMap<String> mDimsForThisOre = new AutoMap<>();
+
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+
+ if (!mInitOres_Everglades) {
+ for (WorldGen_GT_Ore_Layer f : gtPlusPlus.everglades.gen.gt.WorldGen_Ores.validOreveins.values()) {
+ Material[] m2 = new Material[] { f.mPrimary, f.mSecondary, f.mBetween, f.mSporadic };
+ for (Material m1 : m2) {
+ AutoMap<String> aMap = mMapOreBlockItemToDimName.get(
+ m1.getUnlocalizedName()
+ .toLowerCase());
+ if (aMap == null) {
+ aMap = new AutoMap<>();
+ }
+ String aDimName = "Everglades";
+ if (!aMap.containsValue(aDimName)) {
+ aMap.put(aDimName);
+ }
+ mMapOreBlockItemToDimName.put(
+ m1.getUnlocalizedName()
+ .toLowerCase(),
+ aMap);
+ }
+ }
+ mInitOres_Everglades = true;
+ }
+
+ if (this.mThisMaterial != null) {
+ list.add(this.mThisMaterial.vChemicalFormula);
+ }
+
+ // Radioactive?
+ if (this.mThisRadiation > 0) {
+ list.add(CORE.GT_Tooltip_Radioactive.get());
+ }
+
+ if (this.mThisMaterial != null) {
+ list.add("Ore contains: ");
+ if (mThisMaterial.getComposites()
+ .isEmpty()) {
+ list.add("- " + mThisMaterial.getLocalizedName());
+ } else {
+ for (MaterialStack m : mThisMaterial.getComposites()) {
+ list.add(
+ "- " + m.getStackMaterial()
+ .getLocalizedName() + " x" + m.getPartsPerOneHundred());
+ }
+ }
+ }
+
+ if (KeyboardUtils.isCtrlKeyDown()) {
+
+ Block b = Block.getBlockFromItem(stack.getItem());
+ if (b != null) {
+ int aMiningLevel1 = b.getHarvestLevel(stack.getItemDamage());
+ if (aMiningLevel1 != 0) {
+ list.add("Mining Level: " + Math.min(Math.max(aMiningLevel1, 0), 5));
+ }
+ }
+
+ if (mDimsForThisOre.isEmpty()) {
+ AutoMap<String> A = mMapOreBlockItemToDimName.get(
+ this.mThisMaterial.getUnlocalizedName()
+ .toLowerCase());
+ if (A != null) {
+ mDimsForThisOre = A;
+ }
+ }
+
+ list.add("Found: ");
+ if (!mDimsForThisOre.isEmpty()) {
+ for (String m : mDimsForThisOre) {
+ list.add("- " + m);
+ }
+ } else {
+ list.add("- Unknown");
+ }
+
+ } else {
+ list.add(EnumChatFormatting.DARK_GRAY + "Hold Ctrl to show additional info.");
+ }
+
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (this.mThisMaterial != null) {
+ if (this.mThisRadiation > 0) {
+ if (entityHolding instanceof EntityPlayer) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ EntityUtils.applyRadiationDamageToEntity(
+ iStack.stackSize,
+ this.mThisMaterial.vRadiationLevel,
+ world,
+ entityHolding);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemMisc.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemMisc.java
new file mode 100644
index 0000000000..020becc687
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemMisc.java
@@ -0,0 +1,154 @@
+package gtPlusPlus.core.item.base.misc;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemMisc extends Item {
+
+ public final String displayName;
+ public final String unlocalName;
+ public final MiscTypes miscType;
+ public final Object componentColour;
+
+ public BaseItemMisc(final String displayName, final short[] RGB, final int maxStackSize, final MiscTypes miscType,
+ String[] description) {
+
+ // Set-up the Misc Generic Item
+ this.displayName = displayName;
+ String unlocalName = Utils.sanitizeString(displayName);
+ this.unlocalName = "item" + miscType.TYPE + unlocalName;
+ this.miscType = miscType;
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setUnlocalizedName(this.unlocalName);
+ this.setMaxStackSize(maxStackSize);
+ // this.setTextureName(this.getCorrectTextures());
+ if (RGB != null) {
+ this.componentColour = Utils.rgbtoHexValue(RGB[0], RGB[1], RGB[2]);
+ } else {
+ this.componentColour = null;
+ }
+ if (description != null) {
+ for (int i = 0; i < description.length; i++) {
+ GT_LanguageManager
+ .addStringLocalization("gtplusplus." + this.getUnlocalizedName() + ".tooltip." + i, description[i]);
+ }
+ }
+ GameRegistry.registerItem(this, this.unlocalName);
+ GT_OreDictUnificator.registerOre(miscType.getOreDictPrefix() + unlocalName, ItemUtils.getSimpleStack(this));
+ }
+
+ private String getCorrectTextures() {
+ return GTPlusPlus.ID + ":" + "item" + this.miscType.TYPE;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return this.miscType == MiscTypes.DROP;
+ }
+
+ @Override
+ public int getRenderPasses(int meta) {
+ return (this.miscType == MiscTypes.DROP) ? 2 : 1;
+ }
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister) {
+ if (this.miscType == MiscTypes.DROP && Forestry.isModLoaded()) {
+ this.itemIcon = par1IconRegister.registerIcon("forestry:honeyDrop.0");
+ this.secondIcon = par1IconRegister.registerIcon("forestry:honeyDrop.1");
+ } else {
+ this.itemIcon = par1IconRegister.registerIcon(getCorrectTextures());
+ }
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public final void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list,
+ final boolean bool) {
+ for (int i = 0;; i++) {
+ String tooltip = GT_LanguageManager
+ .getTranslation("gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i);
+ if (!("gtplusplus." + this.getUnlocalizedName() + ".tooltip" + "." + i).equals(tooltip)) {
+ list.add(tooltip);
+ } else break;
+ }
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ // Returns default colour if a custom one is not set.
+ if (this.componentColour == null) {
+ return 16777215;
+ } else {
+ return (int) this.componentColour;
+ }
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ // Nothing Fancy here yet.
+ }
+
+ public static enum MiscTypes {
+
+ POTION("Potion", " Potion", "potion"),
+ KEY("Key", " Key", "key"),
+ BIGKEY("KeyBig", " Big Key", "bosskey"),
+ BOTTLE("Bottle", " Bottle", "bottle"),
+ GEM("Gem", " Gemstone", "gem"),
+ DROP("Droplet", " Droplet", "droplet"),
+ MUSHROOM("Mushroom", " Mushroom", "mushroom");
+
+ private final String TYPE;
+ private final String DISPLAY_NAME_SUFFIX;
+ private final String OREDICT_PREFIX;
+
+ private MiscTypes(final String LocalName, final String DisplayNameSuffix, final String OreDictPrefix) {
+ this.TYPE = LocalName;
+ this.DISPLAY_NAME_SUFFIX = DisplayNameSuffix;
+ this.OREDICT_PREFIX = OreDictPrefix;
+ }
+
+ public String getType() {
+ return this.TYPE;
+ }
+
+ public String getName() {
+ return this.DISPLAY_NAME_SUFFIX;
+ }
+
+ public String getOreDictPrefix() {
+ return this.OREDICT_PREFIX;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemParticle.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemParticle.java
new file mode 100644
index 0000000000..b6292c695e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/misc/BaseItemParticle.java
@@ -0,0 +1,66 @@
+package gtPlusPlus.core.item.base.misc;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.CoreItem;
+
+public abstract class BaseItemParticle extends CoreItem {
+
+ protected static final Map<Integer, Integer> aColourMap = new LinkedHashMap<>();
+ private final int aMaxCount;
+
+ public BaseItemParticle(String aType, int aCount, EnumRarity aRarity) {
+ super(
+ "particle" + aType,
+ aType,
+ AddToCreativeTab.tabOther,
+ 64,
+ 0,
+ new String[] {},
+ aRarity,
+ EnumChatFormatting.DARK_AQUA,
+ false,
+ null);
+ this.setTextureName(GTPlusPlus.ID + ":" + "science/Atom");
+ aMaxCount = aCount;
+ this.setHasSubtypes(true);
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ return aColourMap.get(stack.getItemDamage());
+ }
+
+ public int getColorFromParentClass(ItemStack stack, int aaa) {
+ return super.getColorFromItemStack(stack, aaa);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < aMaxCount; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public final String getItemStackDisplayName(final ItemStack tItem) {
+ String aReturnValue = super.getItemStackDisplayName(tItem);
+ String[] a2 = getAffixes();
+ aReturnValue = (a2[0] + aReturnValue + a2[1]);
+ return aReturnValue;
+ }
+
+ public abstract String[] getAffixes();
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/nugget/BaseItemNugget.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/nugget/BaseItemNugget.java
new file mode 100644
index 0000000000..b0537f022f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/nugget/BaseItemNugget.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.nugget;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemNugget extends BaseItemComponent {
+
+ public BaseItemNugget(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.NUGGET);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCentrifugedCrushedOre.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCentrifugedCrushedOre.java
new file mode 100644
index 0000000000..9a72f62040
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCentrifugedCrushedOre.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.base.ore;
+
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemCentrifugedCrushedOre extends BaseOreComponent {
+
+ public BaseItemCentrifugedCrushedOre(final Material material) {
+ super(material, BaseOreComponent.ComponentTypes.CRUSHEDCENTRIFUGED);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCrushedOre.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCrushedOre.java
new file mode 100644
index 0000000000..e9588f9f96
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemCrushedOre.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.base.ore;
+
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemCrushedOre extends BaseOreComponent {
+
+ public BaseItemCrushedOre(final Material material) {
+ super(material, BaseOreComponent.ComponentTypes.CRUSHED);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemImpureDust.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemImpureDust.java
new file mode 100644
index 0000000000..f80e392703
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemImpureDust.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.base.ore;
+
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemImpureDust extends BaseOreComponent {
+
+ public BaseItemImpureDust(final Material material) {
+ super(material, BaseOreComponent.ComponentTypes.DUSTIMPURE);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemMilledOre.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemMilledOre.java
new file mode 100644
index 0000000000..90235a18b3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemMilledOre.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.core.item.base.ore;
+
+import net.minecraft.item.Item;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class BaseItemMilledOre extends BaseOreComponent {
+
+ public BaseItemMilledOre(final Material material, int aMaterialEU) {
+ super(material, BaseOreComponent.ComponentTypes.MILLED);
+ CORE.RA.addMillingRecipe(material, aMaterialEU);
+ }
+
+ public static Item generate(Materials aMat, int aMaterialEU) {
+ return generate(MaterialUtils.generateMaterialFromGtENUM(aMat), aMaterialEU);
+ }
+
+ public static Item generate(Material aMat, int aMaterialEU) {
+ return new BaseItemMilledOre(aMat, aMaterialEU);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedCrushedOre.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedCrushedOre.java
new file mode 100644
index 0000000000..744b204d43
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedCrushedOre.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.base.ore;
+
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemPurifiedCrushedOre extends BaseOreComponent {
+
+ public BaseItemPurifiedCrushedOre(final Material material) {
+ super(material, BaseOreComponent.ComponentTypes.CRUSHEDPURIFIED);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedDust.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedDust.java
new file mode 100644
index 0000000000..4b94b98e64
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemPurifiedDust.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.base.ore;
+
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemPurifiedDust extends BaseOreComponent {
+
+ public BaseItemPurifiedDust(final Material material) {
+ super(material, BaseOreComponent.ComponentTypes.DUSTPURE);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemRawOre.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemRawOre.java
new file mode 100644
index 0000000000..bca44d0045
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseItemRawOre.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.base.ore;
+
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemRawOre extends BaseOreComponent {
+
+ public BaseItemRawOre(final Material material) {
+ super(material, BaseOreComponent.ComponentTypes.RAWORE);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseOreComponent.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseOreComponent.java
new file mode 100644
index 0000000000..2074bb2ede
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/ore/BaseOreComponent.java
@@ -0,0 +1,272 @@
+package gtPlusPlus.core.item.base.ore;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseOreComponent extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon base;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon overlay;
+
+ public final Material componentMaterial;
+ public final String materialName;
+ public final String unlocalName;
+ public final ComponentTypes componentType;
+ public final int componentColour;
+ public Object extraData;
+
+ public BaseOreComponent(final Material material, final ComponentTypes componentType) {
+ this.componentMaterial = material;
+ this.unlocalName = componentType.COMPONENT_NAME + material.getUnlocalizedName();
+ this.materialName = material.getLocalizedName();
+ this.componentType = componentType;
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setUnlocalizedName(this.unlocalName);
+ this.setMaxStackSize(64);
+ this.componentColour = material.getRgbAsHex();
+ GameRegistry.registerItem(this, this.unlocalName);
+ registerComponent();
+ GT_OreDictUnificator
+ .registerOre(componentType.getComponent() + material.getUnlocalizedName(), ItemUtils.getSimpleStack(this));
+ }
+
+ public boolean registerComponent() {
+ Logger.MATERIALS("Attempting to register " + this.getUnlocalizedName() + ".");
+ if (this.componentMaterial == null) {
+ Logger.MATERIALS("Tried to register " + this.getUnlocalizedName() + " but the material was null.");
+ return false;
+ }
+ // Register Component
+ Map<String, ItemStack> aMap = Material.mComponentMap.get(componentMaterial.getUnlocalizedName());
+ if (aMap == null) {
+ aMap = new HashMap<>();
+ }
+ String aKey = "Invalid";
+ switch (componentType) {
+ case CRUSHED -> aKey = OrePrefixes.crushed.name();
+ case CRUSHEDCENTRIFUGED -> aKey = OrePrefixes.crushedCentrifuged.name();
+ case CRUSHEDPURIFIED -> aKey = OrePrefixes.crushedPurified.name();
+ case DUST -> aKey = OrePrefixes.dust.name();
+ case DUSTIMPURE -> aKey = OrePrefixes.dustImpure.name();
+ case DUSTPURE -> aKey = OrePrefixes.dustPure.name();
+ case MILLED -> aKey = OrePrefixes.milled.name();
+ case RAWORE -> aKey = OrePrefixes.rawOre.name();
+ }
+
+ ItemStack x = aMap.get(aKey);
+ if (x == null) {
+ aMap.put(aKey, ItemUtils.getSimpleStack(this));
+ Logger.MATERIALS(
+ "Registering a material component. Item: [" + componentMaterial.getUnlocalizedName()
+ + "] Map: ["
+ + aKey
+ + "]");
+ Material.mComponentMap.put(componentMaterial.getUnlocalizedName(), aMap);
+ return true;
+ } else {
+ // Bad
+ Logger.MATERIALS("Tried to double register a material component. ");
+ return false;
+ }
+ }
+
+ /*
+ * @Override public String getItemStackDisplayName(final ItemStack p_77653_1_) { return
+ * (this.componentType.getPrefix()+this.componentMaterial.getLocalizedName()+this.componentType.DISPLAY_NAME); }
+ */
+
+ public final String getMaterialName() {
+ return this.materialName;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public final void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list,
+ final boolean bool) {
+ if (this.materialName != null && !this.materialName.equals("")) {
+ if (this.componentMaterial != null) {
+ if (!this.componentMaterial.vChemicalFormula.contains("?")) {
+ list.add(Utils.sanitizeStringKeepBrackets(this.componentMaterial.vChemicalFormula));
+ } else if (this.componentMaterial.vChemicalFormula.contains("?")) {
+ String temp = componentMaterial.vChemicalFormula;
+ temp = temp.replace(" ", "");
+ temp = temp.replace("-", "");
+ temp = temp.replace("_", "");
+ temp = temp.replace("!", "");
+ temp = temp.replace("@", "");
+ temp = temp.replace("#", "");
+ temp = temp.replace(" ", "");
+ list.add(temp);
+ }
+ if (this.componentMaterial.isRadioactive) {
+ list.add(CORE.GT_Tooltip_Radioactive.get() + " | Level: " + this.componentMaterial.vRadiationLevel);
+ }
+ } else {
+ String aChemicalFormula = Material.sChemicalFormula.get(materialName.toLowerCase());
+ if (aChemicalFormula != null && aChemicalFormula.length() > 0) {
+ list.add(Utils.sanitizeStringKeepBrackets(aChemicalFormula));
+ }
+ }
+ }
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (this.componentMaterial != null) {
+ if (entityHolding instanceof EntityPlayer) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ EntityUtils.applyRadiationDamageToEntity(
+ iStack.stackSize,
+ this.componentMaterial.vRadiationLevel,
+ world,
+ entityHolding);
+ }
+ }
+ }
+ }
+
+ /**
+ * Rendering Related
+ *
+ * @author Alkalus
+ *
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ if (this.componentType.hasOverlay()) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(final IIconRegister par1IconRegister) {
+ if (this.componentType == ComponentTypes.MILLED) {
+ this.base = par1IconRegister.registerIcon(GTPlusPlus.ID + ":" + "processing/MilledOre/milled");
+ if (this.componentType.hasOverlay()) {
+ this.overlay = par1IconRegister
+ .registerIcon(GTPlusPlus.ID + ":" + "processing/MilledOre/milled_OVERLAY");
+ }
+ } else if (CORE.ConfigSwitches.useGregtechTextures) {
+ // Logger.MATERIALS(this.componentType.getPrefix()+this.componentMaterial.getLocalizedName()+this.componentType.DISPLAY_NAME+"
+ // is using `"+GregTech.ID + ":" + "materialicons/METALLIC/" + this.componentType.COMPONENT_NAME+"' as the
+ // layer 0 texture path.");
+ this.base = par1IconRegister
+ .registerIcon(GregTech.ID + ":" + "materialicons/METALLIC/" + this.componentType.COMPONENT_NAME);
+ if (this.componentType.hasOverlay()) {
+ // Logger.MATERIALS(this.componentType.getPrefix()+this.componentMaterial.getLocalizedName()+this.componentType.DISPLAY_NAME+"
+ // is using `"+GregTech.ID + ":" + "materialicons/METALLIC/" +
+ // this.componentType.COMPONENT_NAME+"_OVERLAY"+"' as the layer 1 texture path.");
+ this.overlay = par1IconRegister.registerIcon(
+ GregTech.ID + ":" + "materialicons/METALLIC/" + this.componentType.COMPONENT_NAME + "_OVERLAY");
+ }
+ } else {
+ this.base = par1IconRegister.registerIcon(GTPlusPlus.ID + ":" + "item" + this.componentType.getComponent());
+ if (this.componentType.hasOverlay()) {
+ this.overlay = par1IconRegister
+ .registerIcon(GTPlusPlus.ID + ":" + "item" + this.componentType.getComponent() + "_Overlay");
+ }
+ }
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int renderPass) {
+ if (this.componentType == ComponentTypes.MILLED) {
+ if (renderPass == 1) {
+ return Utils.rgbtoHexValue(230, 230, 230);
+ }
+ return this.componentColour;
+ } else {
+ if (renderPass == 0 && !CORE.ConfigSwitches.useGregtechTextures) {
+ return this.componentColour;
+ }
+ if (renderPass == 1 && CORE.ConfigSwitches.useGregtechTextures) {
+ return Utils.rgbtoHexValue(230, 230, 230);
+ }
+ return this.componentColour;
+ }
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ if (pass == 0) {
+ return this.base;
+ }
+ return this.overlay;
+ }
+
+ public static enum ComponentTypes {
+
+ DUST("dust", "", " Dust", true),
+ DUSTIMPURE("dustImpure", "Impure ", " Dust", true),
+ DUSTPURE("dustPure", "Purified ", " Dust", true),
+ CRUSHED("crushed", "Crushed ", " Ore", true),
+ CRUSHEDCENTRIFUGED("crushedCentrifuged", "Centrifuged Crushed ", " Ore", true),
+ CRUSHEDPURIFIED("crushedPurified", "Purified Crushed ", " Ore", true),
+ RAWORE("oreRaw", "Raw ", " Ore", true),
+ MILLED("milled", "Milled ", " Ore", true);
+
+ private final String COMPONENT_NAME;
+ private final String PREFIX;
+ private final String DISPLAY_NAME;
+ private final boolean HAS_OVERLAY;
+
+ private ComponentTypes(final String LocalName, final String prefix, final String DisplayName,
+ final boolean overlay) {
+ this.COMPONENT_NAME = LocalName;
+ this.PREFIX = prefix;
+ this.DISPLAY_NAME = DisplayName;
+ this.HAS_OVERLAY = overlay;
+ // dust + Dirty, Impure, Pure, Refined
+ // crushed + centrifuged, purified
+ }
+
+ public String getComponent() {
+ return this.COMPONENT_NAME;
+ }
+
+ public String getName() {
+ return this.DISPLAY_NAME;
+ }
+
+ public boolean hasOverlay() {
+ return this.HAS_OVERLAY;
+ }
+
+ public String getPrefix() {
+ return this.PREFIX;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate.java
new file mode 100644
index 0000000000..0fad7a8258
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate.java
@@ -0,0 +1,23 @@
+package gtPlusPlus.core.item.base.plates;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class BaseItemPlate extends BaseItemComponent {
+
+ public BaseItemPlate(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.PLATE);
+ }
+
+ public BaseItemPlate(final String unlocalizedName, final String materialName, final MaterialState state,
+ final short[] colour, final int tier, final int sRadioactivity) {
+ this(
+ MaterialUtils.generateQuickMaterial(
+ materialName,
+ state,
+ new short[] { colour[0], colour[1], colour[2], 0 },
+ sRadioactivity));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDense.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDense.java
new file mode 100644
index 0000000000..580e028c00
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDense.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.plates;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemPlateDense extends BaseItemComponent {
+
+ public BaseItemPlateDense(Material material) {
+ super(material, ComponentTypes.PLATEDENSE);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDouble.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDouble.java
new file mode 100644
index 0000000000..4f5bc12829
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlateDouble.java
@@ -0,0 +1,12 @@
+package gtPlusPlus.core.item.base.plates;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemPlateDouble extends BaseItemComponent {
+
+ public BaseItemPlateDouble(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.PLATEDOUBLE);
+ this.setMaxStackSize(32);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate_OLD.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate_OLD.java
new file mode 100644
index 0000000000..168d5236c6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/plates/BaseItemPlate_OLD.java
@@ -0,0 +1,91 @@
+package gtPlusPlus.core.item.base.plates;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemPlate_OLD extends Item {
+
+ protected final int colour;
+ protected final int sRadiation;
+ protected final String materialName;
+ protected final String unlocalName;
+ protected final String chemicalNotation;
+
+ public BaseItemPlate_OLD(final String unlocalizedName, final String materialName, final int colour,
+ final int sRadioactivity) {
+ this(unlocalizedName, materialName, "NullFormula", colour, sRadioactivity);
+ }
+
+ public BaseItemPlate_OLD(final String unlocalizedName, final String materialName, final String mChemicalFormula,
+ final int colour, final int sRadioactivity) {
+ this.setUnlocalizedName("itemPlate" + unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.unlocalName = "itemPlate" + unlocalizedName;
+ this.setMaxStackSize(64);
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemPlate");
+ this.setMaxStackSize(64);
+ this.colour = colour;
+ this.materialName = materialName;
+ if (mChemicalFormula.equals("") || mChemicalFormula.equals("NullFormula")) {
+ this.chemicalNotation = StringUtils.subscript(materialName);
+ } else {
+ this.chemicalNotation = StringUtils.subscript(mChemicalFormula);
+ }
+ this.sRadiation = sRadioactivity;
+ GameRegistry.registerItem(this, "itemPlate" + unlocalizedName);
+ String temp;
+ if (this.unlocalName.toLowerCase()
+ .contains("itemplate")) {
+ temp = this.unlocalName.replace("itemP", "p");
+ if ((temp != null) && !temp.equals("")) {
+ GT_OreDictUnificator.registerOre(temp, ItemUtils.getSimpleStack(this));
+ }
+ }
+ }
+
+ public final String getMaterialName() {
+ return this.materialName;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ if (this.colour == 0) {
+ return MathUtils.generateSingularRandomHexValue();
+ }
+ return this.colour;
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ EntityUtils.applyRadiationDamageToEntity(iStack.stackSize, this.sRadiation, world, entityHolding);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ if (this.sRadiation > 0) {
+ list.add(CORE.GT_Tooltip_Radioactive.get());
+ }
+ if (StringUtils.containsSuperOrSubScript(this.chemicalNotation)) {
+ list.add(this.chemicalNotation);
+ }
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/rings/BaseItemRing.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/rings/BaseItemRing.java
new file mode 100644
index 0000000000..d25ea02d52
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/rings/BaseItemRing.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.rings;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemRing extends BaseItemComponent {
+
+ public BaseItemRing(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.RING);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRod.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRod.java
new file mode 100644
index 0000000000..9a9998d63a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRod.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.rods;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemRod extends BaseItemComponent {
+
+ public BaseItemRod(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.ROD);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRodLong.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRodLong.java
new file mode 100644
index 0000000000..bf7dd3bccc
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/rods/BaseItemRodLong.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.rods;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemRodLong extends BaseItemComponent {
+
+ public BaseItemRodLong(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.RODLONG);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/rotors/BaseItemRotor.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/rotors/BaseItemRotor.java
new file mode 100644
index 0000000000..c2fae0fc8b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/rotors/BaseItemRotor.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.rotors;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemRotor extends BaseItemComponent {
+
+ public BaseItemRotor(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.ROTOR);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/screws/BaseItemScrew.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/screws/BaseItemScrew.java
new file mode 100644
index 0000000000..7f0ba8c504
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/screws/BaseItemScrew.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.screws;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemScrew extends BaseItemComponent {
+
+ public BaseItemScrew(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.SCREW);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/base/wire/BaseItemFineWire.java b/gtpp/src/main/java/gtPlusPlus/core/item/base/wire/BaseItemFineWire.java
new file mode 100644
index 0000000000..3e2cee49a9
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/base/wire/BaseItemFineWire.java
@@ -0,0 +1,11 @@
+package gtPlusPlus.core.item.base.wire;
+
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.material.Material;
+
+public class BaseItemFineWire extends BaseItemComponent {
+
+ public BaseItemFineWire(final Material material) {
+ super(material, BaseItemComponent.ComponentTypes.FINEWIRE);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/bauble/BaseBauble.java b/gtpp/src/main/java/gtPlusPlus/core/item/bauble/BaseBauble.java
new file mode 100644
index 0000000000..92468aa6d8
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/bauble/BaseBauble.java
@@ -0,0 +1,133 @@
+package gtPlusPlus.core.item.bauble;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.ai.attributes.AttributeModifier;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.event.entity.living.LivingAttackEvent;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+
+import baubles.api.BaubleType;
+import baubles.api.IBauble;
+import baubles.common.container.InventoryBaubles;
+import baubles.common.lib.PlayerHandler;
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.api.enums.Mods;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+
+@Optional.InterfaceList(
+ value = { @Optional.Interface(iface = "baubles.api.IBauble", modid = Mods.Names.BAUBLES),
+ @Optional.Interface(iface = "baubles.api.BaubleType", modid = Mods.Names.BAUBLES) })
+public class BaseBauble extends Item implements IBauble {
+
+ /**
+ * Implementation suggestions taken from Botania.
+ */
+ private BaubleType mThisBauble;
+
+ private List<String> damageNegations = new ArrayList<>();
+ Multimap<String, AttributeModifier> attributes = HashMultimap.create();
+
+ public BaseBauble(BaubleType type) {
+ this.mThisBauble = type;
+ Utils.registerEvent(this);
+ this.setMaxStackSize(1);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ String key = "gtplusplus." + getUnlocalizedName() + ".name";
+ if (key.equals(GT_LanguageManager.getTranslation(key))) {
+ return super.getItemStackDisplayName(tItem).replaceAll(".name", "");
+ }
+ return GT_LanguageManager.getTranslation(key);
+ }
+
+ @SubscribeEvent
+ public void onPlayerAttacked(LivingAttackEvent event) {
+ if (event.entityLiving instanceof EntityPlayer player) {
+ if (getCorrectBauble(player) != null && damageNegations.contains(event.source.damageType))
+ event.setCanceled(true);
+ }
+ }
+
+ @Override
+ public boolean canEquip(ItemStack arg0, EntityLivingBase arg1) {
+ return arg1 instanceof EntityPlayer;
+ }
+
+ @Override
+ public boolean canUnequip(ItemStack arg0, EntityLivingBase arg1) {
+ return arg1 instanceof EntityPlayer;
+ }
+
+ @Override
+ public BaubleType getBaubleType(ItemStack arg0) {
+ return mThisBauble;
+ }
+
+ @Override
+ public void onEquipped(ItemStack stack, EntityLivingBase entity) {
+ if (entity instanceof EntityPlayer) {
+ onEquippedOrLoadedIntoWorld(entity);
+ setPlayerHashcode(stack, entity.hashCode());
+ }
+ }
+
+ @Override
+ public void onWornTick(ItemStack stack, EntityLivingBase player) {
+ if (getPlayerHashcode(stack) != player.hashCode()) {
+ onEquippedOrLoadedIntoWorld(player);
+ setPlayerHashcode(stack, player.hashCode());
+ }
+ }
+
+ public void onEquippedOrLoadedIntoWorld(EntityLivingBase player) {
+ attributes.clear();
+ player.getAttributeMap()
+ .applyAttributeModifiers(attributes);
+ }
+
+ @Override
+ public void onUnequipped(ItemStack stack, EntityLivingBase player) {
+ attributes.clear();
+ player.getAttributeMap()
+ .removeAttributeModifiers(attributes);
+ }
+
+ public ItemStack getCorrectBauble(EntityPlayer player) {
+ InventoryBaubles baubles = PlayerHandler.getPlayerBaubles(player);
+ ItemStack stack1 = baubles.getStackInSlot(1);
+ ItemStack stack2 = baubles.getStackInSlot(2);
+ return isCorrectBauble(stack1) ? stack1 : isCorrectBauble(stack2) ? stack2 : null;
+ }
+
+ private boolean isCorrectBauble(ItemStack stack) {
+ return stack != null && (stack.getItem() == this);
+ }
+
+ @Override
+ public int getEntityLifespan(ItemStack itemStack, World world) {
+ return Integer.MAX_VALUE;
+ }
+
+ public static int getPlayerHashcode(ItemStack stack) {
+ return NBTUtils.getInteger(stack, "mPlayerHashcode");
+ }
+
+ public static void setPlayerHashcode(ItemStack stack, int hash) {
+ NBTUtils.setInteger(stack, "mPlayerHashcode", hash);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/bauble/BatteryPackBaseBauble.java b/gtpp/src/main/java/gtPlusPlus/core/item/bauble/BatteryPackBaseBauble.java
new file mode 100644
index 0000000000..881146b15d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/bauble/BatteryPackBaseBauble.java
@@ -0,0 +1,261 @@
+package gtPlusPlus.core.item.bauble;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import baubles.api.BaubleType;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.common.helpers.ChargingHelper;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+
+public class BatteryPackBaseBauble extends ElectricBaseBauble {
+
+ public BatteryPackBaseBauble(int tier) {
+ super(BaubleType.BELT, tier, GT_Values.V[tier] * 20 * 300, "GTPP.BattPack.0" + tier + ".name");
+ String aUnlocalName = "GTPP.BattPack.0" + tier + ".name";
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ if (GameRegistry.findItem(GTPlusPlus.ID, aUnlocalName) == null) {
+ GameRegistry.registerItem(this, aUnlocalName);
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void getSubItems(Item item, CreativeTabs par2CreativeTabs, List itemList) {
+ ItemStack itemStack = new ItemStack(this, 1);
+ ItemStack charged;
+ if (this.getEmptyItem(itemStack) == this) {
+ charged = new ItemStack(this, 1);
+ ElectricItem.manager.charge(charged, 0.0D, Integer.MAX_VALUE, true, false);
+ itemList.add(charged);
+ }
+ if (this.getChargedItem(itemStack) == this) {
+ charged = new ItemStack(this, 1);
+ ElectricItem.manager.charge(charged, Double.POSITIVE_INFINITY, Integer.MAX_VALUE, true, false);
+ itemList.add(charged);
+ }
+ }
+
+ @Override
+ public void onUpdate(final ItemStack itemStack, final World worldObj, final Entity player, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ super.onUpdate(itemStack, worldObj, player, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public boolean canProvideEnergy(final ItemStack itemStack) {
+ double aItemCharge = ElectricItem.manager.getCharge(itemStack);
+ return aItemCharge > 0;
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack p_77653_1_) {
+ return (EnumChatFormatting.BLUE + super.getItemStackDisplayName(p_77653_1_) + EnumChatFormatting.GRAY);
+ }
+
+ @Override
+ public boolean showDurabilityBar(final ItemStack stack) {
+ return true;
+ }
+
+ public int secondsLeft(final ItemStack stack) {
+ double r = 0;
+ r = this.getCharge(stack) / (10000 * 20);
+ return (int) MathUtils.decimalRounding(r);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add("");
+ String aString1 = StatCollector.translateToLocal("GTPP.battpack.tooltip.1");
+ String aString2 = StatCollector.translateToLocal("GTPP.battpack.tooltip.2");
+ String aString3 = StatCollector.translateToLocal("GTPP.battpack.tooltip.3");
+ String aString4 = StatCollector.translateToLocal("GTPP.battpack.tooltip.4");
+
+ String aEU = StatCollector.translateToLocal("GTPP.info.eu");
+ String aEUT = aEU + "/t";
+
+ list.add(EnumChatFormatting.GREEN + aString1 + EnumChatFormatting.GRAY);
+ list.add(
+ EnumChatFormatting.GREEN + aString2
+ + " "
+ + (int) getTransferLimit(stack)
+ + aEUT
+ + " "
+ + aString3
+ + EnumChatFormatting.GRAY);
+ list.add(EnumChatFormatting.GREEN + aString4 + EnumChatFormatting.GRAY);
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public String getToolTip(final ItemStack stack) {
+ return ElectricItem.manager.getToolTip(stack);
+ }
+
+ @Override
+ public boolean canEquip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public boolean canUnequip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override // TODO
+ public void onEquipped(final ItemStack arg0, final EntityLivingBase arg1) {}
+
+ @Override // TODO
+ public void onUnequipped(final ItemStack arg0, final EntityLivingBase arg1) {}
+
+ @Override // TODO
+ public void onWornTick(final ItemStack aBaubleStack, final EntityLivingBase aPlayer) {
+ if (!aPlayer.worldObj.isRemote) {
+
+ try {
+
+ if (this.getCharge(aBaubleStack) >= getTransferLimit(aBaubleStack)) {
+ // Try Iterate Armour Slots of Player
+ if (aPlayer instanceof EntityPlayer) {
+
+ // amour
+ for (final ItemStack aInvStack : ((EntityPlayer) aPlayer).inventory.armorInventory) {
+ if (aInvStack != null) {
+ if (aInvStack == aBaubleStack) {
+ continue;
+ }
+ if (ChargingHelper.isItemValid(aInvStack)) {
+ double aTransferRate = 0;
+ final IElectricItem electricItem = (IElectricItem) aInvStack.getItem();
+ if (electricItem != null) {
+ aTransferRate = electricItem.getTransferLimit(aInvStack);
+ double aItemCharge = ElectricItem.manager.getCharge(aInvStack);
+ if (aItemCharge >= 0 && aItemCharge != electricItem.getMaxCharge(aInvStack)) {
+ if (aItemCharge <= (electricItem.getMaxCharge(aInvStack) - aTransferRate)) {
+ if (ElectricItem.manager.getCharge(aBaubleStack) >= aTransferRate) {
+ if (ElectricItem.manager.getCharge(aInvStack)
+ <= (electricItem.getMaxCharge(aInvStack) - aTransferRate)) {
+ double d = ElectricItem.manager
+ .charge(aInvStack, aTransferRate * 16, mTier, false, true);
+ if (d > 0) {
+ d = ElectricItem.manager.charge(
+ aInvStack,
+ aTransferRate * 16,
+ mTier,
+ false,
+ false);
+ ElectricItem.manager
+ .discharge(aBaubleStack, d, mTier, false, true, false);
+ // Logger.INFO("Charging " + aInvStack.getDisplayName() + "
+ // | " + d + " | "+electricItem.getMaxCharge(aInvStack));
+ }
+ } else {
+ // Logger.INFO("5");
+ }
+ } else {
+ // Logger.INFO("4");
+ }
+ } else {
+ // Logger.INFO("3");
+ }
+
+ } else {
+ // Logger.INFO("1");
+ }
+ }
+ }
+ }
+ if (this.getCharge(aBaubleStack) > 0) {
+ continue;
+ } else {
+ break;
+ }
+ }
+
+ // Hotbar Slots
+ int aSlotCounter = 0;
+ for (final ItemStack aInvStack : ((EntityPlayer) aPlayer).inventory.mainInventory) {
+ if (aSlotCounter > (InventoryPlayer.getHotbarSize() - 1)) {
+ break;
+ }
+ aSlotCounter++;
+ if (aInvStack != null) {
+ if (aInvStack == aBaubleStack) {
+ continue;
+ }
+ if (ChargingHelper.isItemValid(aInvStack)) {
+ double aTransferRate = 0;
+ final IElectricItem electricItem = (IElectricItem) aInvStack.getItem();
+ if (electricItem != null) {
+ aTransferRate = electricItem.getTransferLimit(aInvStack);
+ double aItemCharge = ElectricItem.manager.getCharge(aInvStack);
+ if (aItemCharge >= 0 && aItemCharge != electricItem.getMaxCharge(aInvStack)) {
+ if (aItemCharge <= (electricItem.getMaxCharge(aInvStack) - aTransferRate)) {
+ if (ElectricItem.manager.getCharge(aBaubleStack) >= aTransferRate) {
+ if (ElectricItem.manager.getCharge(aInvStack)
+ <= (electricItem.getMaxCharge(aInvStack) - aTransferRate)) {
+ double d = ElectricItem.manager
+ .charge(aInvStack, aTransferRate, mTier, false, true);
+ if (d > 0) {
+ d = ElectricItem.manager
+ .charge(aInvStack, aTransferRate, mTier, false, false);
+ ElectricItem.manager
+ .discharge(aBaubleStack, d, mTier, false, true, false);
+ // Logger.INFO("Charging " + aInvStack.getDisplayName() + "
+ // | " + d + " | "+electricItem.getMaxCharge(aInvStack));
+ }
+ } else {
+ // Logger.INFO("5");
+ }
+ } else {
+ // Logger.INFO("4");
+ }
+ } else {
+ // Logger.INFO("3");
+ }
+
+ } else {
+ // Logger.INFO("1");
+ }
+ }
+ }
+ }
+ if (this.getCharge(aBaubleStack) > 0) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ } catch (Throwable t) {
+
+ }
+ }
+ }
+
+ @Override
+ public String getTextureNameForBauble() {
+ return "chargepack/" + mTier;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/bauble/ElectricBaseBauble.java b/gtpp/src/main/java/gtPlusPlus/core/item/bauble/ElectricBaseBauble.java
new file mode 100644
index 0000000000..ab17e91232
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/bauble/ElectricBaseBauble.java
@@ -0,0 +1,220 @@
+package gtPlusPlus.core.item.bauble;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+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.StatCollector;
+import net.minecraft.world.World;
+
+import baubles.api.BaubleType;
+import baubles.api.IBauble;
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Mods;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.math.MathUtils;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+import ic2.api.item.IElectricItemManager;
+
+@Optional.InterfaceList(
+ value = { @Optional.Interface(iface = "baubles.api.IBauble", modid = Mods.Names.BAUBLES),
+ @Optional.Interface(iface = "baubles.api.BaubleType", modid = Mods.Names.BAUBLES) })
+public abstract class ElectricBaseBauble extends BaseBauble implements IElectricItem, IElectricItemManager, IBauble {
+
+ public final int mTier;
+ private final double maxValueEU;
+ private final BaubleType mType;
+
+ public ElectricBaseBauble(BaubleType aType, int aTier, double aMaxEU, String aUnlocalName) {
+ super(aType);
+ mType = aType;
+ mTier = aTier;
+ maxValueEU = aMaxEU;
+ this.setUnlocalizedName(aUnlocalName);
+ this.setTextureName(GTPlusPlus.ID + ":" + getTextureNameForBauble());
+ this.setMaxDamage(27);
+ this.setMaxStackSize(1);
+ this.setNoRepair();
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ if (GameRegistry.findItem(GTPlusPlus.ID, aUnlocalName) == null) {
+ GameRegistry.registerItem(this, aUnlocalName);
+ }
+ }
+
+ public abstract String getTextureNameForBauble();
+
+ @SuppressWarnings("unchecked")
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void getSubItems(Item item, CreativeTabs par2CreativeTabs, List itemList) {
+ ItemStack itemStack = new ItemStack(this, 1);
+ ItemStack charged;
+ if (this.getEmptyItem(itemStack) == this) {
+ charged = new ItemStack(this, 1);
+ ElectricItem.manager.charge(charged, 0.0D, Integer.MAX_VALUE, true, false);
+ itemList.add(charged);
+ }
+ if (this.getChargedItem(itemStack) == this) {
+ charged = new ItemStack(this, 1);
+ ElectricItem.manager.charge(charged, Double.POSITIVE_INFINITY, Integer.MAX_VALUE, true, false);
+ itemList.add(charged);
+ }
+ }
+
+ @Override
+ public void onUpdate(final ItemStack itemStack, final World worldObj, final Entity player, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ super.onUpdate(itemStack, worldObj, player, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public boolean canProvideEnergy(final ItemStack itemStack) {
+ double aItemCharge = ElectricItem.manager.getCharge(itemStack);
+ return aItemCharge > 0;
+ }
+
+ @Override
+ public final Item getChargedItem(final ItemStack itemStack) {
+ final ItemStack x = itemStack.copy();
+ x.setItemDamage(27);
+ return x.getItem();
+ }
+
+ @Override
+ public final Item getEmptyItem(final ItemStack itemStack) {
+ final ItemStack x = itemStack.copy();
+ x.setItemDamage(0);
+ return x.getItem();
+ }
+
+ @Override
+ public final double getMaxCharge(final ItemStack itemStack) {
+ return maxValueEU;
+ }
+
+ @Override
+ public final int getTier(final ItemStack itemStack) {
+ return mTier;
+ }
+
+ @Override
+ public final double getTransferLimit(final ItemStack itemStack) {
+ return GT_Values.V[mTier];
+ }
+
+ @Override
+ public final double getDurabilityForDisplay(final ItemStack stack) {
+ return 1.0D - (this.getCharge(stack) / this.getMaxCharge(stack));
+ }
+
+ @Override
+ public boolean showDurabilityBar(final ItemStack stack) {
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add("");
+ String aEuInfo = StatCollector.translateToLocal("GTPP.info.euInfo");
+ String aTier = StatCollector.translateToLocal("GTPP.machines.tier");
+ String aInputLimit = StatCollector.translateToLocal("GTPP.info.inputLimit");
+ String aCurrentPower = StatCollector.translateToLocal("GTPP.info.currentPower");
+ String aEU = StatCollector.translateToLocal("GTPP.info.eu");
+ String aEUT = aEU + "/t";
+
+ list.add(EnumChatFormatting.GOLD + aEuInfo + EnumChatFormatting.GRAY);
+ list.add(
+ EnumChatFormatting.GRAY + aTier
+ + ": ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.getTier(stack))
+ + EnumChatFormatting.GRAY
+ + "] "
+ + aInputLimit
+ + ": ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.getTransferLimit(stack))
+ + EnumChatFormatting.GRAY
+ + aEUT
+ + "]");
+ list.add(
+ EnumChatFormatting.GRAY + aCurrentPower
+ + ": ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.getCharge(stack))
+ + EnumChatFormatting.GRAY
+ + aEU
+ + "] ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(MathUtils.findPercentage(this.getCharge(stack), this.getMaxCharge(stack)))
+ + EnumChatFormatting.GRAY
+ + "%]");
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public final double charge(final ItemStack stack, final double amount, final int tier,
+ final boolean ignoreTransferLimit, final boolean simulate) {
+ /*
+ * if (!simulate) { ElectricItem.manager.charge(stack, amount, tier, true, simulate); }
+ */
+
+ return ElectricItem.manager.charge(stack, amount, tier, true, simulate);
+ }
+
+ @Override
+ public final double discharge(final ItemStack stack, final double amount, final int tier,
+ final boolean ignoreTransferLimit, final boolean externally, final boolean simulate) {
+ /*
+ * if (!simulate) { ElectricItem.manager.discharge(stack, amount, tier, ignoreTransferLimit, externally,
+ * simulate); }
+ */
+
+ return ElectricItem.manager.discharge(stack, amount, tier, ignoreTransferLimit, externally, simulate);
+ }
+
+ @Override
+ public final double getCharge(final ItemStack stack) {
+ return ElectricItem.manager.getCharge(stack);
+ }
+
+ @Override
+ public final boolean canUse(final ItemStack stack, final double amount) {
+ return ElectricItem.manager.canUse(stack, amount);
+ }
+
+ @Override
+ public final boolean use(final ItemStack stack, final double amount, final EntityLivingBase entity) {
+ return ElectricItem.manager.use(stack, amount, entity);
+ }
+
+ @Override
+ public final void chargeFromArmor(final ItemStack stack, final EntityLivingBase entity) {
+ ElectricItem.manager.chargeFromArmor(stack, entity);
+ }
+
+ @Override
+ public String getToolTip(final ItemStack stack) {
+ // return ElectricItem.manager.getToolTip(stack);
+ return null;
+ }
+
+ @Override
+ public final BaubleType getBaubleType(final ItemStack arg0) {
+ return mType;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/bauble/FireProtectionBauble.java b/gtpp/src/main/java/gtPlusPlus/core/item/bauble/FireProtectionBauble.java
new file mode 100644
index 0000000000..c3c371ae35
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/bauble/FireProtectionBauble.java
@@ -0,0 +1,120 @@
+package gtPlusPlus.core.item.bauble;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import baubles.api.BaubleType;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+
+public class FireProtectionBauble extends BaseBauble {
+
+ private static Field isImmuneToFire;
+
+ static {
+ isImmuneToFire = ReflectionUtils
+ .getField(Entity.class, !CORE_Preloader.DEV_ENVIRONMENT ? "func_70045_F" : "isImmuneToFire");
+ }
+
+ public static boolean fireImmune(Entity aEntity) {
+ return aEntity.isImmuneToFire();
+ }
+
+ public static boolean setEntityImmuneToFire(Entity aEntity, boolean aImmune) {
+ try {
+ return ReflectionUtils.setField(aEntity, isImmuneToFire, aImmune);
+ } catch (Throwable t) {}
+ return false;
+ }
+
+ public FireProtectionBauble() {
+ super(BaubleType.RING);
+ String aUnlocalName = "GTPP.bauble.fireprotection.0" + ".name";
+ this.setUnlocalizedName(aUnlocalName);
+ this.setTextureName(GTPlusPlus.ID + ":" + getTextureNameForBauble());
+ this.setMaxDamage(100);
+ this.setMaxStackSize(1);
+ this.setNoRepair();
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ if (GameRegistry.findItem(GTPlusPlus.ID, aUnlocalName) == null) {
+ GameRegistry.registerItem(this, aUnlocalName);
+ }
+ }
+
+ @Override
+ public void onUpdate(final ItemStack itemStack, final World worldObj, final Entity player, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ super.onUpdate(itemStack, worldObj, player, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack p_77653_1_) {
+ return (EnumChatFormatting.DARK_RED + super.getItemStackDisplayName(p_77653_1_) + EnumChatFormatting.GRAY);
+ }
+
+ @Override
+ public boolean showDurabilityBar(final ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public boolean canEquip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public boolean canUnequip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public void onEquipped(final ItemStack arg0, final EntityLivingBase aPlayer) {}
+
+ @Override
+ public void onUnequipped(final ItemStack arg0, final EntityLivingBase aPlayer) {
+ if (!aPlayer.worldObj.isRemote) {
+ if (aPlayer instanceof EntityPlayer bPlayer) {
+ if (bPlayer.isPotionActive(Potion.fireResistance)) {
+ bPlayer.removePotionEffect(Potion.fireResistance.id);
+ }
+ setEntityImmuneToFire(bPlayer, false);
+ }
+ }
+ }
+
+ @Override
+ public void onWornTick(final ItemStack aBaubleStack, final EntityLivingBase aPlayer) {
+ if (!aPlayer.worldObj.isRemote) {
+ if (aPlayer instanceof EntityPlayer bPlayer) {
+ if (!fireImmune(bPlayer)) {
+ setEntityImmuneToFire(bPlayer, true);
+ }
+ if (!bPlayer.isPotionActive(Potion.fireResistance)) {
+ bPlayer.addPotionEffect(new PotionEffect(Potion.fireResistance.id, 100, 4));
+ }
+ }
+ }
+ }
+
+ public String getTextureNameForBauble() {
+ return "baubles/itemFireProtectGlovesBetter";
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/AgriculturalChem.java b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/AgriculturalChem.java
new file mode 100644
index 0000000000..e14d9f7f08
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/AgriculturalChem.java
@@ -0,0 +1,667 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.enums.Mods.BiomesOPlenty;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.TinkerConstruct;
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.core.item.circuit.GTPP_IntegratedCircuit_Item;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.plugin.agrichem.BioRecipes;
+import gtPlusPlus.plugin.agrichem.item.algae.ItemAgrichemBase;
+import gtPlusPlus.plugin.agrichem.item.algae.ItemAlgaeBase;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class AgriculturalChem extends ItemPackage {
+
+ private static boolean aBOP;
+ private static boolean aTiCon;
+
+ private static AutoMap<FluidStack> mBloodFluids = new AutoMap<>();
+
+ /**
+ * Fluids
+ */
+
+ // Poop Juice
+ public static Fluid PoopJuice;
+ // Manure Slurry
+ public static Fluid ManureSlurry;
+ // Fertile Manure Slurry
+ public static Fluid FertileManureSlurry;
+ // Blood
+ public static Fluid CustomBlood;
+ // Red Mud
+ public static Fluid RedMud;
+ /**
+ * Items
+ */
+
+ // Manure Byproducts
+ public static Item dustManureByproducts;
+ // Organic Fertilizer
+ public static Item dustOrganicFertilizer;
+ // Dirt
+ public static Item dustDirt;
+
+ // Poop Juice
+ // vv - Centrifuge
+ // Manure Slurry && Manure Byproducts -> (Elements) Centrifuge to several tiny
+ // piles
+ // vv - Chem Reactor - Add Peat, Meat
+ // Organic Fertilizer
+ // vv - Dehydrate
+ // Fertilizer
+
+ // Poop Juice
+ // vv - Mixer - Add Blood, Bone, Meat (1000L Poo, 200L Blood, x2 Bone, x3 Meat)
+ // Fertile Manure Slurry
+ // vv - Chem Reactor - Add Peat x1.5
+ // Organic Fertilizer x3
+ // vv - Dehydrate
+ // Fertilizer
+
+ public static Item mAlgae;
+ public static Item mBioCircuit;
+ public static Item mAgrichemItem1;
+
+ /*
+ * 0 - Algae Biomass 1 - Green Algae Biomass 2 - Brown Algae Biomass 3 - Golden-Brown Algae Biomass 4 - Red Algae
+ * Biomass 5 - Cellulose Fiber 6 - Golden-Brown Cellulose Fiber 7 - Red Cellulose Fiber 8 - Compost 9 - Wood Pellet
+ * 10 - Wood Brick 11 - Cellulose Pulp 12 - Raw Bio Resin 13 - Catalyst Carrier 14 - Green Metal Catalyst 15 -
+ * Alginic Acid 16 - Alumina 17 - Aluminium Pellet 18 - Sodium Aluminate 19 - Sodium Hydroxide // Exists in Newer GT
+ * 20 - Sodium Carbonate 21 - Lithium Chloride 22 - Pellet Mold 23 - Clean Aluminium Mix 24 - Pinecone
+ */
+
+ public static ItemStack mAlgaeBiosmass;
+ public static ItemStack mGreenAlgaeBiosmass;
+ public static ItemStack mBrownAlgaeBiosmass;
+ public static ItemStack mGoldenBrownAlgaeBiosmass;
+ public static ItemStack mRedAlgaeBiosmass;
+ public static ItemStack mCelluloseFiber;
+ public static ItemStack mGoldenBrownCelluloseFiber;
+ public static ItemStack mRedCelluloseFiber;
+ public static ItemStack mCompost;
+ public static ItemStack mWoodPellet;
+ public static ItemStack mWoodBrick;
+ public static ItemStack mCellulosePulp;
+ public static ItemStack mRawBioResin;
+ public static ItemStack mCatalystCarrier;
+ public static ItemStack mGreenCatalyst;
+ public static ItemStack mAlginicAcid;
+ public static ItemStack mAlumina;
+ public static ItemStack mAluminiumPellet;
+ public static ItemStack mSodiumAluminate;
+ public static ItemStack mSodiumHydroxide;
+ public static ItemStack mSodiumCarbonate;
+ public static ItemStack mLithiumChloride;
+ public static ItemStack mPelletMold;
+ public static ItemStack mCleanAluminiumMix;
+ public static ItemStack mPinecone;
+ public static ItemStack mCrushedPine;
+
+ @Override
+ public void items() {
+ // Nitrogen, Ammonium Nitrate, Phosphates, Calcium, Copper, Carbon
+ dustManureByproducts = ItemUtils.generateSpecialUseDusts(
+ "ManureByproducts",
+ "Manure Byproduct",
+ "(N2H4O3)N2P2Ca3CuC8",
+ Utils.rgbtoHexValue(110, 75, 25))[0];
+
+ // Basically Guano
+ dustOrganicFertilizer = ItemUtils.generateSpecialUseDusts(
+ "OrganicFertilizer",
+ "Organic Fertilizer",
+ "Ca5(PO4)3(OH)",
+ Utils.rgbtoHexValue(240, 240, 240))[0];
+
+ // Dirt Dust :)
+ dustDirt = ItemUtils.generateSpecialUseDusts("Dirt", "Dried Earth", Utils.rgbtoHexValue(65, 50, 15))[0];
+
+ mAlgae = new ItemAlgaeBase();
+ mAgrichemItem1 = new ItemAgrichemBase();
+ mBioCircuit = new GTPP_IntegratedCircuit_Item("BioRecipeSelector", "bioscience/BioCircuit");
+ GregtechItemList.Circuit_BioRecipeSelector.set(mBioCircuit);
+
+ mAlgaeBiosmass = ItemUtils.simpleMetaStack(mAgrichemItem1, 0, 1);
+ mGreenAlgaeBiosmass = ItemUtils.simpleMetaStack(mAgrichemItem1, 1, 1);
+ mBrownAlgaeBiosmass = ItemUtils.simpleMetaStack(mAgrichemItem1, 2, 1);
+ mGoldenBrownAlgaeBiosmass = ItemUtils.simpleMetaStack(mAgrichemItem1, 3, 1);
+ mRedAlgaeBiosmass = ItemUtils.simpleMetaStack(mAgrichemItem1, 4, 1);
+ mCelluloseFiber = ItemUtils.simpleMetaStack(mAgrichemItem1, 5, 1);
+ mGoldenBrownCelluloseFiber = ItemUtils.simpleMetaStack(mAgrichemItem1, 6, 1);
+ mRedCelluloseFiber = ItemUtils.simpleMetaStack(mAgrichemItem1, 7, 1);
+ mCompost = ItemUtils.simpleMetaStack(mAgrichemItem1, 8, 1);
+ mWoodPellet = ItemUtils.simpleMetaStack(mAgrichemItem1, 9, 1);
+ mWoodBrick = ItemUtils.simpleMetaStack(mAgrichemItem1, 10, 1);
+ mCellulosePulp = ItemUtils.simpleMetaStack(mAgrichemItem1, 11, 1);
+ mRawBioResin = ItemUtils.simpleMetaStack(mAgrichemItem1, 12, 1);
+ mCatalystCarrier = ItemUtils.simpleMetaStack(mAgrichemItem1, 13, 1);
+ mGreenCatalyst = ItemUtils.simpleMetaStack(mAgrichemItem1, 14, 1);
+ mAlginicAcid = ItemUtils.simpleMetaStack(mAgrichemItem1, 15, 1);
+ mAlumina = ItemUtils.simpleMetaStack(mAgrichemItem1, 16, 1);
+ mAluminiumPellet = ItemUtils.simpleMetaStack(mAgrichemItem1, 17, 1);
+ mSodiumAluminate = ItemUtils.simpleMetaStack(mAgrichemItem1, 18, 1);
+
+ /*
+ * If It exists, don't add a new one.
+ */
+ if (OreDictionary.doesOreNameExist("dustSodiumHydroxide_GT5U")
+ || OreDictionary.doesOreNameExist("dustSodiumHydroxide")) {
+ List<ItemStack> aTest = OreDictionary.getOres("dustSodiumHydroxide", false);
+ ItemStack aTestStack;
+ if (aTest.isEmpty()) {
+ aTest = OreDictionary.getOres("dustSodiumHydroxide_GT5U", false);
+ if (aTest.isEmpty()) {
+ aTestStack = ItemUtils.simpleMetaStack(mAgrichemItem1, 19, 1);
+ } else {
+ aTestStack = aTest.get(0);
+ }
+ } else {
+ aTestStack = aTest.get(0);
+ }
+ mSodiumHydroxide = aTestStack;
+ } else {
+ mSodiumHydroxide = ItemUtils.simpleMetaStack(mAgrichemItem1, 19, 1);
+ }
+ mSodiumCarbonate = ItemUtils.simpleMetaStack(mAgrichemItem1, 20, 1);
+ mLithiumChloride = ItemUtils.simpleMetaStack(mAgrichemItem1, 21, 1);
+ mPelletMold = ItemUtils.simpleMetaStack(mAgrichemItem1, 22, 1);
+ mCleanAluminiumMix = ItemUtils.simpleMetaStack(mAgrichemItem1, 23, 1);
+ mPinecone = ItemUtils.simpleMetaStack(mAgrichemItem1, 24, 1);
+ mCrushedPine = ItemUtils.simpleMetaStack(mAgrichemItem1, 25, 1);
+
+ ItemUtils.addItemToOreDictionary(mGreenAlgaeBiosmass, "biomassGreenAlgae");
+ ItemUtils.addItemToOreDictionary(mBrownAlgaeBiosmass, "biomassBrownAlgae");
+ ItemUtils.addItemToOreDictionary(mGoldenBrownAlgaeBiosmass, "biomassGoldenBrownAlgae");
+ ItemUtils.addItemToOreDictionary(mRedAlgaeBiosmass, "biomassRedAlgae");
+
+ ItemUtils.addItemToOreDictionary(mCelluloseFiber, "fiberCellulose");
+ ItemUtils.addItemToOreDictionary(mGoldenBrownCelluloseFiber, "fiberCellulose");
+ ItemUtils.addItemToOreDictionary(mGoldenBrownCelluloseFiber, "fiberGoldenBrownCellulose");
+ ItemUtils.addItemToOreDictionary(mRedCelluloseFiber, "fiberCellulose");
+ ItemUtils.addItemToOreDictionary(mRedCelluloseFiber, "fiberRedCellulose");
+
+ ItemUtils.addItemToOreDictionary(mWoodPellet, "pelletWood");
+ ItemUtils.addItemToOreDictionary(mWoodBrick, "brickWood");
+ ItemUtils.addItemToOreDictionary(mCellulosePulp, "pulpCellulose");
+
+ ItemUtils.addItemToOreDictionary(mCatalystCarrier, "catalystEmpty");
+ ItemUtils.addItemToOreDictionary(mGreenCatalyst, "catalystAluminiumSilver");
+ ItemUtils.addItemToOreDictionary(mAlginicAcid, "dustAlginicAcid");
+ ItemUtils.addItemToOreDictionary(mAlumina, "dustAlumina");
+ ItemUtils.addItemToOreDictionary(mAluminiumPellet, "pelletAluminium");
+
+ ItemUtils.addItemToOreDictionary(mSodiumAluminate, "dustSodiumAluminate");
+ ItemUtils.addItemToOreDictionary(mSodiumHydroxide, "dustSodiumHydroxide");
+ ItemUtils.addItemToOreDictionary(mSodiumCarbonate, "dustSodiumCarbonate");
+ ItemUtils.addItemToOreDictionary(mLithiumChloride, "dustLithiumChloride");
+ ItemUtils.addItemToOreDictionary(mPinecone, "pinecone");
+ ItemUtils.addItemToOreDictionary(mCrushedPine, "crushedPineMaterial");
+
+ // Handle GT NaOH dusts
+ List<ItemStack> NaOHSmall = OreDictionary.getOres("dustSmallSodiumHydroxide_GT5U", false);
+ if (!NaOHSmall.isEmpty()) {
+ ItemUtils.addItemToOreDictionary(NaOHSmall.get(0), "dustSmallSodiumHydroxide");
+ }
+ List<ItemStack> NaOHTiny = OreDictionary.getOres("dustTinySodiumHydroxide_GT5U", false);
+ if (!NaOHTiny.isEmpty()) {
+ ItemUtils.addItemToOreDictionary(NaOHTiny.get(0), "dustTinySodiumHydroxide");
+ }
+ }
+
+ @Override
+ public void blocks() {
+ // None yet
+ }
+
+ @Override
+ public void fluids() {
+ // Sewage
+ PoopJuice = FluidUtils.generateFluidNonMolten(
+ "raw.waste",
+ "Raw Animal Waste",
+ 32 + 175,
+ new short[] { 100, 70, 30, 100 },
+ null,
+ null,
+ 0,
+ true);
+
+ // Sewage
+ ManureSlurry = FluidUtils.generateFluidNonMolten(
+ "manure.slurry",
+ "Manure Slurry",
+ 39 + 175,
+ new short[] { 75, 45, 15, 100 },
+ null,
+ null,
+ 0,
+ true);
+
+ // Sewage
+ FertileManureSlurry = FluidUtils.generateFluidNonMolten(
+ "fertile.manure.slurry",
+ "Fertile Manure Slurry",
+ 45 + 175,
+ new short[] { 65, 50, 15, 100 },
+ null,
+ null,
+ 0,
+ true);
+
+ RedMud = FluidUtils.generateFluidNoPrefix(
+ "mud.red.slurry",
+ "Red Mud Slurry",
+ 32 + 175,
+ new short[] { 180, 35, 25, 100 },
+ true);
+ }
+
+ public AgriculturalChem() {
+ super();
+
+ aBOP = BiomesOPlenty.isModLoaded();
+ aTiCon = TinkerConstruct.isModLoaded();
+
+ Logger.INFO("Adding Agrochemical content");
+
+ FluidStack aBlood;
+ if (aBOP) {
+ aBlood = FluidUtils.getFluidStack("hell_blood", 100);
+ if (aBlood != null) {
+ Logger.INFO("Found Biome's o Plenty, enabled Blood support.");
+ CustomBlood = aBlood.getFluid();
+ mBloodFluids.put(aBlood);
+ }
+ }
+
+ if (aTiCon) {
+ aBlood = FluidUtils.getFluidStack("blood", 100);
+ if (aBlood != null) {
+ Logger.INFO("Found Tinker's Construct, enabled Blood support.");
+ CustomBlood = aBlood.getFluid();
+ mBloodFluids.put(FluidUtils.getFluidStack("blood", 100));
+ }
+ }
+
+ // Handle Blood Internally, Create if required.
+ if (mBloodFluids.isEmpty() || CustomBlood == null) {
+ Logger.INFO(
+ "Did not find any existing Blood fluids. Trying to wildcard search the fluid registry, then generate our own if that fails.");
+ FluidStack aTempBlood = FluidUtils.getWildcardFluidStack("blood", 100);
+ if (aTempBlood != null) {
+ CustomBlood = aTempBlood.getFluid();
+ } else {
+ aTempBlood = FluidUtils.getWildcardFluidStack("hell_blood", 100);
+ if (aTempBlood == null) {
+ CustomBlood = FluidUtils
+ .generateFluidNoPrefix("blood", "Blood", 32 + 175, new short[] { 175, 25, 25, 100 }, true);
+ } else {
+ CustomBlood = aTempBlood.getFluid();
+ }
+ }
+ Logger.INFO("Using " + CustomBlood.getName());
+ mBloodFluids.put(FluidUtils.getFluidStack(CustomBlood, 100));
+ }
+ }
+
+ private static final AutoMap<ItemStack> mMeats = new AutoMap<>();
+ private static final AutoMap<ItemStack> mFish = new AutoMap<>();
+ private static final AutoMap<ItemStack> mFruits = new AutoMap<>();
+ private static final AutoMap<ItemStack> mVege = new AutoMap<>();
+ private static final AutoMap<ItemStack> mNuts = new AutoMap<>();
+ private static final AutoMap<ItemStack> mSeeds = new AutoMap<>();
+ private static final AutoMap<ItemStack> mPeat = new AutoMap<>();
+ private static final AutoMap<ItemStack> mBones = new AutoMap<>();
+ private static final AutoMap<ItemStack> mBoneMeal = new AutoMap<>();
+
+ private static final AutoMap<ItemStack> mList_Master_Meats = new AutoMap<>();
+ private static final AutoMap<ItemStack> mList_Master_FruitVege = new AutoMap<>();
+ private static final AutoMap<ItemStack> mList_Master_Seeds = new AutoMap<>();
+ private static final AutoMap<ItemStack> mList_Master_Bones = new AutoMap<>();
+
+ private static void processAllOreDict() {
+ processOreDict("listAllmeatraw", mMeats);
+ processOreDict("listAllfishraw", mFish);
+ processOreDict("listAllfruit", mFruits);
+ processOreDict("listAllVeggie", mVege);
+ processOreDict("listAllnut", mNuts);
+ processOreDict("listAllSeed", mSeeds);
+ processOreDict("brickPeat", mPeat);
+ processOreDict("bone", mBones);
+ processOreDict("dustBone", mBoneMeal);
+ // Just make a mega list, makes life easier.
+ if (!mMeats.isEmpty()) {
+ for (ItemStack g : mMeats) {
+ mList_Master_Meats.put(g);
+ }
+ }
+ if (!mFish.isEmpty()) {
+ for (ItemStack g : mFish) {
+ mList_Master_Meats.put(g);
+ }
+ }
+ if (!mFruits.isEmpty()) {
+ for (ItemStack g : mFruits) {
+ mList_Master_FruitVege.put(g);
+ }
+ }
+ if (!mVege.isEmpty()) {
+ for (ItemStack g : mVege) {
+ mList_Master_FruitVege.put(g);
+ }
+ }
+ if (!mNuts.isEmpty()) {
+ for (ItemStack g : mNuts) {
+ mList_Master_FruitVege.put(g);
+ }
+ }
+ if (!mSeeds.isEmpty()) {
+ for (ItemStack g : mSeeds) {
+ mList_Master_Seeds.put(g);
+ }
+ }
+ if (!mBoneMeal.isEmpty()) {
+ for (ItemStack g : mBoneMeal) {
+ mList_Master_Bones.put(g);
+ }
+ }
+ if (!mBones.isEmpty()) {
+ for (ItemStack g : mBones) {
+ mList_Master_Bones.put(g);
+ }
+ }
+ }
+
+ private static void processOreDict(String aOreName, AutoMap<ItemStack> aMap) {
+ ArrayList<ItemStack> aTemp = OreDictionary.getOres(aOreName);
+ if (!aTemp.isEmpty()) {
+ for (ItemStack stack : aTemp) {
+ aMap.put(stack);
+ }
+ }
+ }
+
+ private static void addBasicSlurryRecipes() {
+
+ ItemStack aManureByprod1 = ItemUtils.getItemStackOfAmountFromOreDict("dustTinyManureByproducts", 1);
+ ItemStack aManureByprod2 = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallManureByproducts", 1);
+ ItemStack aDirtDust = ItemUtils.getSimpleStack(dustDirt, 1);
+
+ // Poop Juice to Basic Slurry
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(aDirtDust, aDirtDust, aManureByprod1, aManureByprod1, aManureByprod1, aManureByprod1)
+ .outputChances(2000, 2000, 500, 500, 250, 250)
+ .fluidInputs(FluidUtils.getFluidStack(PoopJuice, 1000))
+ .fluidOutputs(FluidUtils.getFluidStack(ManureSlurry, 250))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(centrifugeRecipes);
+
+ // More Efficient way to get byproducts, less Slurry
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(aDirtDust, aDirtDust, aManureByprod1, aManureByprod1, aManureByprod2, aManureByprod2)
+ .outputChances(4000, 3000, 1250, 1250, 675, 675)
+ .fluidInputs(FluidUtils.getFluidStack(PoopJuice, 1000))
+ .fluidOutputs(FluidUtils.getFluidStack(ManureSlurry, 50))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(centrifugeRecipes);
+ }
+
+ private static void addAdvancedSlurryRecipes() {
+
+ ItemStack aCircuit = GT_Utility.getIntegratedCircuit(10);
+ ItemStack aBone;
+ ItemStack aMeat;
+ ItemStack aEmptyCells = Materials.Empty.getCells(2);
+ ItemStack aInputCells = ItemUtils.getItemStackOfAmountFromOreDict("cellRawAnimalWaste", 2);
+ FluidStack aOutput = FluidUtils.getFluidStack(FertileManureSlurry, 1000);
+
+ for (FluidStack aBloodStack : mBloodFluids) {
+ for (ItemStack aBoneStack : mList_Master_Bones) {
+ aBone = ItemUtils.getSimpleStack(aBoneStack, 2);
+ for (ItemStack aMeatStack : mList_Master_Meats) {
+ aMeat = ItemUtils.getSimpleStack(aMeatStack, 5);
+ // Poop Juice to Fertile Slurry
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aCircuit, aBone, aMeat, aInputCells)
+ .itemOutputs(aEmptyCells)
+ .fluidInputs(aBloodStack)
+ .fluidOutputs(aOutput)
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(mixerRecipes);
+ }
+ }
+ }
+ }
+
+ private static void addBasicOrganiseFertRecipes() {
+ FluidStack aInputFluid = FluidUtils.getFluidStack(ManureSlurry, 1000);
+ ItemStack aOutputDust = ItemUtils.getSimpleStack(dustOrganicFertilizer, 3);
+ ItemStack aPeat;
+ ItemStack aMeat;
+ for (ItemStack aPeatStack : mPeat) {
+ aPeat = ItemUtils.getSimpleStack(aPeatStack, 3);
+ for (ItemStack aMeatStack : mList_Master_Meats) {
+ aMeat = ItemUtils.getSimpleStack(aMeatStack, 5);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aPeat, aMeat)
+ .itemOutputs(aOutputDust)
+ .fluidInputs(aInputFluid)
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+ }
+ aPeat = ItemUtils.getSimpleStack(aPeatStack, 2);
+ for (ItemStack aMeatStack : mList_Master_FruitVege) {
+ aMeat = ItemUtils.getSimpleStack(aMeatStack, 9);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aPeat, aMeat)
+ .itemOutputs(aOutputDust)
+ .fluidInputs(aInputFluid)
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+ }
+ }
+ }
+
+ private static void addAdvancedOrganiseFertRecipes() {
+ FluidStack aInputFluid = FluidUtils.getFluidStack(FertileManureSlurry, 1000);
+ ItemStack aOutputDust = ItemUtils.getSimpleStack(dustOrganicFertilizer, 7);
+ ItemStack aPeat;
+ ItemStack aMeat;
+ for (ItemStack aPeatStack : mPeat) {
+ aPeat = ItemUtils.getSimpleStack(aPeatStack, 5);
+ for (ItemStack aMeatStack : mList_Master_Meats) {
+ aMeat = ItemUtils.getSimpleStack(aMeatStack, 7);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aPeat, aMeat)
+ .itemOutputs(aOutputDust)
+ .fluidInputs(aInputFluid)
+ .duration(10 * SECONDS)
+ .eut(140)
+ .addTo(UniversalChemical);
+ }
+ aPeat = ItemUtils.getSimpleStack(aPeatStack, 3);
+ for (ItemStack aMeatStack : mList_Master_FruitVege) {
+ aMeat = ItemUtils.getSimpleStack(aMeatStack, 12);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aPeat, aMeat)
+ .itemOutputs(aOutputDust)
+ .fluidInputs(aInputFluid)
+ .duration(5 * SECONDS)
+ .eut(140)
+ .addTo(UniversalChemical);
+ }
+ }
+ }
+
+ public static ItemStack aFertForestry;
+ public static ItemStack aFertIC2;
+
+ private static void addMiscRecipes() {
+
+ ItemStack aDustOrganicFert = ItemUtils.getSimpleStack(dustOrganicFertilizer, 1);
+ ItemStack aManureByprod = ItemUtils.getSimpleStack(dustManureByproducts, 1);
+
+ // Dehydrate Organise Fert to Normal Fert.
+
+ /*
+ * Forestry Support
+ */
+ if (Forestry.isModLoaded()) {
+ Field aItemField = ReflectionUtils
+ .getField(ReflectionUtils.getClass("forestry.plugins.PluginCore"), "items");
+ try {
+ Object aItemRegInstance = aItemField != null ? aItemField.get(aItemField) : null;
+ if (aItemRegInstance != null) {
+ Field aFertField = ReflectionUtils.getField(aItemRegInstance.getClass(), "fertilizerCompound");
+ Object aItemInstance = aFertField.get(aItemRegInstance);
+ if (aItemInstance instanceof Item aForestryFert) {
+ aFertForestry = ItemUtils.getSimpleStack((Item) aItemInstance);
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(11),
+ ItemUtils.getSimpleStack(aDustOrganicFert, 4) },
+ null,
+ null,
+ new ItemStack[] { ItemUtils.getSimpleStack(aForestryFert, 3), aManureByprod,
+ aManureByprod },
+ new int[] { 10000, 2000, 2000 },
+ 20 * 20,
+ 240);
+ }
+ }
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+
+ }
+ }
+
+ /*
+ * IC2 Support
+ */
+ aFertIC2 = ItemUtils.getItemStackFromFQRN("IC2:itemFertilizer", 1);
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(12), ItemUtils.getSimpleStack(aDustOrganicFert, 4) },
+ null,
+ null,
+ new ItemStack[] { ItemUtils.getItemStackFromFQRN("IC2:itemFertilizer", 3), aManureByprod, aManureByprod },
+ new int[] { 10000, 2000, 2000 },
+ 20 * 20,
+ 240);
+
+ // Dirt Production
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(dustDirt, 9))
+ .itemOutputs(ItemUtils.getSimpleStack(Blocks.dirt))
+ .duration(2 * SECONDS)
+ .eut(8)
+ .addTo(compressorRecipes);
+
+ // Centrifuge Byproducts
+
+ // Ammonium Nitrate, Phosphates, Calcium, Copper, Carbon
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(aManureByprod, 4), GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Phosphorus, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Calcium, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Copper, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1L),
+ ItemUtils.getSimpleStack(dustDirt, 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyAmmoniumNitrate", 1))
+ .outputChances(2500, 2500, 750, 1000, 5000, 250)
+ .fluidInputs(Materials.SulfuricAcid.getFluid(250))
+ .fluidOutputs(FluidUtils.getFluidStack("sulfuricapatite", 50))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(centrifugeRecipes);
+
+ // Add Fuel Usages
+ CORE.RA.addSemifluidFuel(FluidUtils.getFluidStack(PoopJuice, 1000), 12);
+ CORE.RA.addSemifluidFuel(FluidUtils.getFluidStack(ManureSlurry, 1000), 24);
+ CORE.RA.addSemifluidFuel(FluidUtils.getFluidStack(FertileManureSlurry, 1000), 32);
+
+ // Red Slurry / Tailings Processing
+ GT_Values.RA.stdBuilder()
+ .itemInputs(CI.getNumberedBioCircuit(10))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Iron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Copper, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Tin, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Sulfur, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Nickel, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lead, 1L))
+ .outputChances(3000, 3000, 2000, 2000, 1000, 1000)
+ .fluidInputs(FluidUtils.getFluidStack(AgriculturalChem.RedMud, 1000))
+ .fluidOutputs(Materials.Water.getFluid(500))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(centrifugeRecipes);
+ }
+
+ @Override
+ public String errorMessage() {
+ return "Failed to generate recipes for AgroChem.";
+ }
+
+ @Override
+ public boolean generateRecipes() {
+ if (mBloodFluids.isEmpty()) {
+ Logger.INFO("Could not find, nor create Blood fluid. Unable to add recipes.");
+ return false;
+ }
+
+ // Organise OreDict
+ processAllOreDict();
+
+ // Slurry Production
+ addBasicSlurryRecipes();
+ addAdvancedSlurryRecipes();
+
+ // Organic Fert. Production
+ addBasicOrganiseFertRecipes();
+ addAdvancedOrganiseFertRecipes();
+
+ addMiscRecipes();
+
+ BioRecipes.init();
+
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/CoalTar.java b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/CoalTar.java
new file mode 100644
index 0000000000..1fafbb5088
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/CoalTar.java
@@ -0,0 +1,319 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.recipe.RecipeMaps.distillationTowerRecipes;
+import static gregtech.api.recipe.RecipeMaps.distilleryRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.chemicalDehydratorRecipes;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.AddGregtechRecipe;
+
+public class CoalTar extends ItemPackage {
+
+ public static Fluid Coal_Gas;
+ public static Fluid Coal_Oil;
+ public static Fluid Ethylene;
+ public static Fluid Ethylbenzene;
+ public static Fluid Anthracene;
+ public static Fluid Toluene;
+ public static Fluid Coal_Tar;
+ public static Fluid Coal_Tar_Oil;
+ public static Fluid Sulfuric_Coal_Tar_Oil;
+ public static Fluid Naphthalene;
+
+ public static void recipeCreateEthylene() {
+
+ FluidStack bioEth1 = FluidUtils.getFluidStack("fluid.bioethanol", 1000);
+ FluidStack bioEth2 = FluidUtils.getFluidStack("bioethanol", 1000);
+
+ // C2H6O = C2H4 + H2O
+ if (bioEth1 != null) {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(17),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", 1) },
+ bioEth1,
+ FluidUtils.getWater(1000),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("cellEthylene", 1) },
+ new int[] { 10000 },
+ 120 * 20,
+ 80);
+ }
+
+ if (bioEth2 != null) {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(18),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", 1) },
+ bioEth2,
+ FluidUtils.getWater(1000),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("cellEthylene", 1) },
+ new int[] { 10000 },
+ 120 * 20,
+ 80);
+ }
+ }
+
+ public static void recipeCreateBenzene() {
+ // C7H8 + 2H = CH4 + C6H6
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Toluene.getCells(1))
+ .itemOutputs(Materials.Benzene.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(2000))
+ .fluidOutputs(Materials.Methane.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(90)
+ .noOptimize()
+ .addTo(chemicalDehydratorRecipes);
+ }
+
+ public static void recipeCreateEthylbenzene() {
+ // C2H4 + C6H6 = C8H10
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("cellEthylene", 2),
+ ItemUtils.getGregtechCircuit(1),
+ FluidUtils.getFluidStack("benzene", 2000),
+ FluidUtils.getFluidStack("fluid.ethylbenzene", 2000),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", 2),
+ 300);
+
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("cellBenzene", 2),
+ ItemUtils.getGregtechCircuit(1),
+ FluidUtils.getFluidStack("ethylene", 2000),
+ FluidUtils.getFluidStack("fluid.ethylbenzene", 2000),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", 2),
+ 300);
+ }
+
+ public static void recipeCoalToCoalTar() {
+ // Charcoal
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Charcoal, 32L),
+ 8,
+ GT_Values.NF,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallDirt", 2),
+ FluidUtils.getFluidStack("fluid.coaltar", 800),
+ 15,
+ 120);
+ // Lignite
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Lignite, 16L),
+ 8,
+ GT_Values.NF,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallDarkAsh", 2),
+ FluidUtils.getFluidStack("fluid.coaltar", 800),
+ 45,
+ 60);
+
+ // Coal
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 12L),
+ 8,
+ GT_Values.NF,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallDarkAsh", 2),
+ FluidUtils.getFluidStack("fluid.coaltar", 2200),
+ 30,
+ 120);
+
+ // Coke
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ ItemUtils.getItemStackOfAmountFromOreDict("fuelCoke", 8),
+ 8,
+ GT_Values.NF,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallAsh", 3),
+ FluidUtils.getFluidStack("fluid.coaltar", 3400),
+ 15,
+ 240);
+ }
+
+ private static void recipeCoalTarToCoalTarOil() {
+ // v - Distill (60% Tar oil/15% Naphtha/20% Ethylbenzene/5% Anthracene) +60% Kerosene
+ // Create Coal Tar Oil
+
+ FluidStack[] distOutputs = new FluidStack[] { FluidUtils.getFluidStack("fluid.coaltaroil", 600),
+ FluidUtils.getFluidStack("liquid_naphtha", 150), FluidUtils.getFluidStack("fluid.ethylbenzene", 200),
+ FluidUtils.getFluidStack("fluid.anthracene", 50), FluidUtils.getFluidStack("fluid.kerosene", 600) };
+ for (int i = 0; i < distOutputs.length; i++) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(i + 1))
+ .fluidInputs(FluidUtils.getFluidStack("fluid.coaltar", 1000))
+ .fluidOutputs(distOutputs[i])
+ .duration(30 * SECONDS)
+ .eut(64)
+ .addTo(distilleryRecipes);
+ }
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(FluidUtils.getFluidStack("fluid.coaltar", 1000))
+ .fluidOutputs(distOutputs)
+ .duration(15 * SECONDS)
+ .eut(256)
+ .addTo(distillationTowerRecipes);
+ }
+
+ private static void recipeCoalTarOilToSulfuricOilToNaphthalene() {
+ // SulfuricCoalTarOil
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("cellCoalTarOil", 8),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellSulfuricAcid", 8),
+ null,
+ null,
+ ItemUtils.getItemStackOfAmountFromOreDict("cellSulfuricCoalTarOil", 16),
+ 20 * 16);
+ GT_Values.RA.addDistilleryRecipe(
+ CI.getNumberedCircuit(6), // Circuit
+ FluidUtils.getFluidStack("fluid.sulfuriccoaltaroil", 1000), // aInput
+ FluidUtils.getFluidStack("fluid.naphthalene", 1000), // aOutput
+ 1200, // aDuration
+ 30, // aEUt
+ false // Hidden?
+ );
+ }
+
+ private static void recipeNaphthaleneToPhthalicAcid() {
+ // SulfuricCoalTarOil
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Lithium.getDust(5))
+ .fluidInputs(FluidUtils.getFluidStack(Naphthalene, 2000))
+ .fluidOutputs(Materials.PhthalicAcid.getFluid(2500))
+ .eut(30)
+ .duration(16 * SECONDS)
+ .noOptimize()
+ .addTo(UniversalChemical);
+ }
+
+ private static void recipePhthalicAcidToPhthalicAnhydride() {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(15) },
+ Materials.PhthalicAcid.getFluid(1000),
+ null,
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustPhthalicAnhydride", 15) },
+ new int[] { 10000 },
+ 60 * 20,
+ 120);
+ }
+
+ @Override
+ public String errorMessage() {
+ return "Bad Coal Science!";
+ }
+
+ @Override
+ public boolean generateRecipes() {
+ recipeCreateEthylene();
+ recipeCreateBenzene();
+ recipeCreateEthylbenzene();
+
+ recipeCoalToCoalTar();
+ recipeCoalTarToCoalTarOil();
+ recipeCoalTarOilToSulfuricOilToNaphthalene();
+ recipeNaphthaleneToPhthalicAcid();
+ recipePhthalicAcidToPhthalicAnhydride();
+
+ // Burn the coal gas!
+ GT_Values.RA.addFuel(ItemUtils.getItemStackOfAmountFromOreDict("cellCoalGas", 1), null, 96, 1);
+ CORE.RA.addSemifluidFuel(ItemUtils.getItemStackOfAmountFromOreDict("cellSulfuricCoalTarOil", 1), 64);
+ CORE.RA.addSemifluidFuel(ItemUtils.getItemStackOfAmountFromOreDict("cellCoalTarOil", 1), 32);
+ CORE.RA.addSemifluidFuel(ItemUtils.getItemStackOfAmountFromOreDict("cellCoalTar", 1), 16);
+
+ return true;
+ }
+
+ @Override
+ public void items() {
+ // v - Dehydrate at 180C+
+ // Create Phthalic Anhydride
+ ItemUtils.generateSpecialUseDusts(
+ "PhthalicAnhydride",
+ "Phthalic Anhydride",
+ "C6H4(CO)2O",
+ Utils.rgbtoHexValue(175, 175, 175));
+
+ // Lithium Hydroperoxide - LiOH + H2O2 → LiOOH + 2 H2O
+ ItemUtils.generateSpecialUseDusts(
+ "LithiumHydroperoxide",
+ "Lithium Hydroperoxide",
+ "HLiO2",
+ Utils.rgbtoHexValue(125, 125, 125));
+ // v - Dehydrate
+ // Lithium Peroxide - 2 LiOOH → Li2O2 + H2O2 + 2 H2O
+ }
+
+ @Override
+ public void blocks() {}
+
+ @Override
+ public void fluids() {
+
+ // Create Coal Gas
+ Coal_Gas = FluidUtils
+ .generateFluidNonMolten("CoalGas", "Coal Gas", 500, new short[] { 48, 48, 48, 100 }, null, null);
+ // Ethanol
+ // v - Dehydrate cells to remove water
+
+ // Create Ethylene
+ if (!FluidUtils.doesFluidExist("ethylene")) {
+ Ethylene = FluidUtils
+ .generateFluidNonMolten("ethylene", "Ethylene", -103, new short[] { 255, 255, 255, 100 }, null, null);
+ } else {
+ Ethylene = FluidUtils.getWildcardFluidStack("ethylene", 1)
+ .getFluid();
+ }
+
+ // Create Ethylbenzene - Ethylbenzene is produced in on a large scale by combining benzene and ethylene in an
+ // acid-catalyzed chemical reaction
+ // Use Chemical Reactor
+ Ethylbenzene = FluidUtils.generateFluidNonMolten(
+ "Ethylbenzene",
+ "Ethylbenzene",
+ 136,
+ new short[] { 255, 255, 255, 100 },
+ null,
+ null);
+ // Create Anthracene
+ Anthracene = FluidUtils
+ .generateFluidNonMolten("Anthracene", "Anthracene", 340, new short[] { 255, 255, 255, 100 }, null, null);
+ // Toluene
+ if (!FluidUtils.doesFluidExist("liquid_toluene")) {
+ Toluene = FluidUtils
+ .generateFluidNonMolten("liquid_toluene", "Toluene", -95, new short[] { 140, 70, 20, 100 }, null, null);
+ } else {
+ Toluene = FluidUtils.getWildcardFluidStack("liquid_toluene", 1)
+ .getFluid();
+ }
+
+ // Create Coal Tar
+ Coal_Tar = FluidUtils
+ .generateFluidNonMolten("CoalTar", "Coal Tar", 450, new short[] { 32, 32, 32, 100 }, null, null);
+ // v - Distill (60% Tar oil/15% Naphtha/20% Ethylbenzene/5% Anthracene)
+ // Create Coal Tar Oil
+ Coal_Tar_Oil = FluidUtils
+ .generateFluidNonMolten("CoalTarOil", "Coal Tar Oil", 240, new short[] { 240, 240, 150, 100 }, null, null);
+ // v - Wash With Sulfuric Acid
+ // Create Sulfuric Coal Tar Oil
+ Sulfuric_Coal_Tar_Oil = FluidUtils.generateFluidNonMolten(
+ "SulfuricCoalTarOil",
+ "Sulfuric Coal Tar Oil",
+ 240,
+ new short[] { 250, 170, 12, 100 },
+ null,
+ null);
+ // v - Distill (No loss, just time consuming)
+ // Create Naphthalene
+ Naphthalene = FluidUtils
+ .generateFluidNonMolten("Naphthalene", "Naphthalene", 115, new short[] { 210, 185, 135, 100 }, null, null);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/GenericChem.java b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/GenericChem.java
new file mode 100644
index 0000000000..31ea030c64
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/GenericChem.java
@@ -0,0 +1,961 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.chemicalDehydratorRecipes;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.core.item.chemistry.general.ItemGenericChemBase;
+import gtPlusPlus.core.item.circuit.GTPP_IntegratedCircuit_Item;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.NONMATERIAL;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.plugin.agrichem.BioRecipes;
+import gtPlusPlus.plugin.agrichem.block.AgrichemFluids;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class GenericChem extends ItemPackage {
+
+ /**
+ * Materials
+ */
+
+ // Refined PTFE
+ public static final Material TEFLON = new Material(
+ "Teflon",
+ MaterialState.SOLID,
+ TextureSet.SET_SHINY,
+ new short[] { 75, 45, 75 },
+ 330,
+ 640,
+ -1,
+ -1,
+ false,
+ null,
+ 0,
+ new MaterialStack(NONMATERIAL.PTFE, 75),
+ new MaterialStack(NONMATERIAL.PLASTIC, 15),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 5),
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 5));
+
+ /**
+ * Fluids
+ */
+ public static Fluid Benzene;
+
+ public static Fluid NitroBenzene;
+ public static Fluid Aniline;
+ public static Fluid Polyurethane;
+ public static Fluid Phenol; // https://en.wikipedia.org/wiki/Phenol#Uses
+ public static Fluid Cyclohexane; // https://en.wikipedia.org/wiki/Cyclohexane
+ public static Fluid Cyclohexanone; // https://en.wikipedia.org/wiki/Cyclohexanone
+ public static Fluid Cadaverine; // https://en.wikipedia.org/wiki/Cadaverine
+ public static Fluid Putrescine; // https://en.wikipedia.org/wiki/Putrescine
+ public static Fluid BoricAcid;
+ public static Fluid HydrochloricAcid;
+
+ public static Fluid Ethylanthraquinone2;
+ public static Fluid Ethylanthrahydroquinone2;
+ public static Fluid Hydrogen_Peroxide;
+ public static Fluid Lithium_Peroxide;
+ public static Fluid Carbon_Disulfide;
+
+ /**
+ * Items
+ */
+
+ // Phenol Byproducts
+
+ public static ItemGenericChemBase mGenericChemItem1;
+ public static Item mAdvancedCircuit;
+
+ private ItemStack mCatalystCarrier;
+
+ public static ItemStack mRedCatalyst;
+ public static ItemStack mYellowCatalyst;
+ public static ItemStack mBlueCatalyst;
+ public static ItemStack mOrangeCatalyst;
+ public static ItemStack mPurpleCatalyst;
+ public static ItemStack mBrownCatalyst;
+ public static ItemStack mPinkCatalyst;
+ public static ItemStack mFormaldehydeCatalyst;
+ public static ItemStack mSolidAcidCatalyst;
+ public static ItemStack mInfiniteMutationCatalyst;
+
+ // QFT Catalysts
+ public static ItemStack mPlatinumGroupCatalyst;
+ public static ItemStack mPlasticPolymerCatalyst;
+ public static ItemStack mRubberPolymerCatalyst;
+ public static ItemStack mAdhesionPromoterCatalyst;
+ public static ItemStack mTitaTungstenIndiumCatalyst;
+ public static ItemStack mRadioactivityCatalyst;
+ public static ItemStack mRareEarthGroupCatalyst;
+ public static ItemStack mLimpidWaterCatalyst;
+ public static ItemStack mSimpleNaquadahCatalyst;
+ public static ItemStack mAdvancedNaquadahCatalyst;
+ public static ItemStack mRawIntelligenceCatalyst;
+ public static ItemStack mParticleAccelerationCatalyst;
+ public static ItemStack mUltimatePlasticCatalyst;
+ public static ItemStack mBiologicalIntelligenceCatalyst;
+ public static ItemStack mFlawlessWaterCatalyst;
+ public static ItemStack TemporalHarmonyCatalyst;
+ public static ItemStack mSynchrotronCapableCatalyst;
+ public static ItemStack mAlgagenicGrowthPromoterCatalyst;
+
+ public static ItemStack mMillingBallAlumina;
+ public static ItemStack mMillingBallSoapstone;
+
+ public static ItemStack mSodiumEthoxide;
+ public static ItemStack mSodiumEthylXanthate;
+ public static ItemStack mPotassiumEthylXanthate;
+ public static ItemStack mPotassiumHydroxide;
+
+ @Override
+ public void items() {
+
+ MaterialGenerator.generate(TEFLON, false);
+
+ mGenericChemItem1 = new ItemGenericChemBase();
+ mAdvancedCircuit = new GTPP_IntegratedCircuit_Item("T3RecipeSelector", "science/general/AdvancedCircuit");
+ GregtechItemList.Circuit_T3RecipeSelector.set(mAdvancedCircuit);
+
+ registerItemStacks();
+ registerOreDict();
+
+ GregtechItemList.Milling_Ball_Alumina.set(mMillingBallAlumina);
+ GregtechItemList.Milling_Ball_Soapstone.set(mMillingBallSoapstone);
+ }
+
+ public void registerItemStacks() {
+
+ mCatalystCarrier = ItemUtils.simpleMetaStack(AgriculturalChem.mAgrichemItem1, 13, 1);
+
+ mRedCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 0, 1);
+ mYellowCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 1, 1);
+ mBlueCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 2, 1);
+ mOrangeCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 3, 1);
+ mPurpleCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 4, 1);
+ mBrownCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 5, 1);
+ mPinkCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 6, 1);
+ mMillingBallAlumina = ItemUtils.simpleMetaStack(mGenericChemItem1, 7, 1);
+ mMillingBallSoapstone = ItemUtils.simpleMetaStack(mGenericChemItem1, 8, 1);
+ mSodiumEthoxide = ItemUtils.simpleMetaStack(mGenericChemItem1, 9, 1);
+ mSodiumEthylXanthate = ItemUtils.simpleMetaStack(mGenericChemItem1, 10, 1);
+ mPotassiumEthylXanthate = ItemUtils.simpleMetaStack(mGenericChemItem1, 11, 1);
+ mPotassiumHydroxide = ItemUtils.simpleMetaStack(mGenericChemItem1, 12, 1);
+ mFormaldehydeCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 13, 1);
+ mSolidAcidCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 14, 1);
+ mInfiniteMutationCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 15, 1);
+
+ // QFT Catalysts
+ mPlatinumGroupCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 16, 1);
+ mPlasticPolymerCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 17, 1);
+ mRubberPolymerCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 18, 1);
+ mAdhesionPromoterCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 19, 1);
+ mTitaTungstenIndiumCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 20, 1);
+ mRadioactivityCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 21, 1);
+ mRareEarthGroupCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 22, 1);
+ mSimpleNaquadahCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 23, 1);
+ mAdvancedNaquadahCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 24, 1);
+ mRawIntelligenceCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 25, 1);
+ mUltimatePlasticCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 26, 1);
+ mBiologicalIntelligenceCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 27, 1);
+ TemporalHarmonyCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 28, 1);
+ mLimpidWaterCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 29, 1);
+ mFlawlessWaterCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 30, 1);
+ mParticleAccelerationCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 31, 1);
+ mSynchrotronCapableCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 32, 1);
+ mAlgagenicGrowthPromoterCatalyst = ItemUtils.simpleMetaStack(mGenericChemItem1, 33, 1);
+ }
+
+ public void registerOreDict() {
+
+ ItemUtils.addItemToOreDictionary(mRedCatalyst, "catalystIronCopper");
+ ItemUtils.addItemToOreDictionary(mYellowCatalyst, "catalystTungstenNickel");
+ ItemUtils.addItemToOreDictionary(mBlueCatalyst, "catalystCobaltTitanium");
+ ItemUtils.addItemToOreDictionary(mOrangeCatalyst, "catalystVanadiumPalladium");
+ ItemUtils.addItemToOreDictionary(mPurpleCatalyst, "catalystIridiumRuthenium");
+ ItemUtils.addItemToOreDictionary(mBrownCatalyst, "catalystNickelAluminium");
+ ItemUtils.addItemToOreDictionary(mPinkCatalyst, "catalystPlatinumRhodium");
+ ItemUtils.addItemToOreDictionary(mMillingBallAlumina, "millingballAlumina");
+ ItemUtils.addItemToOreDictionary(mMillingBallSoapstone, "millingballSoapstone");
+ ItemUtils.addItemToOreDictionary(mSodiumEthoxide, "dustSodiumEthoxide");
+ ItemUtils.addItemToOreDictionary(mSodiumEthylXanthate, "dustSodiumEthylXanthate");
+ ItemUtils.addItemToOreDictionary(mPotassiumEthylXanthate, "dustPotassiumEthylXanthate");
+ ItemUtils.addItemToOreDictionary(mPotassiumHydroxide, "dustPotassiumHydroxide");
+ ItemUtils.addItemToOreDictionary(mFormaldehydeCatalyst, "catalystFormaldehyde");
+ ItemUtils.addItemToOreDictionary(mSolidAcidCatalyst, "catalystSolidAcid");
+ ItemUtils.addItemToOreDictionary(mInfiniteMutationCatalyst, "catalystInfiniteMutation");
+ ItemUtils.addItemToOreDictionary(mPlatinumGroupCatalyst, "catalystPlatinumGroup");
+ ItemUtils.addItemToOreDictionary(mPlasticPolymerCatalyst, "catalystPlasticPolymer");
+ ItemUtils.addItemToOreDictionary(mRubberPolymerCatalyst, "catalystRubberPolymer");
+ ItemUtils.addItemToOreDictionary(mAdhesionPromoterCatalyst, "catalystAdhesionPromoter");
+ ItemUtils.addItemToOreDictionary(mTitaTungstenIndiumCatalyst, "catalystTitaTungstenIndium");
+ ItemUtils.addItemToOreDictionary(mRadioactivityCatalyst, "catalystRadioactivity");
+ ItemUtils.addItemToOreDictionary(mRareEarthGroupCatalyst, "catalystRareEarthGroup");
+ ItemUtils.addItemToOreDictionary(mSimpleNaquadahCatalyst, "catalystSimpleNaquadah");
+ ItemUtils.addItemToOreDictionary(mAdvancedNaquadahCatalyst, "catalystAdvancedNaquadah");
+ ItemUtils.addItemToOreDictionary(mRawIntelligenceCatalyst, "catalystRawIntelligence");
+ ItemUtils.addItemToOreDictionary(mUltimatePlasticCatalyst, "catalystUltimatePlastic");
+ ItemUtils.addItemToOreDictionary(mBiologicalIntelligenceCatalyst, "catalystBiologicalIntelligence");
+ ItemUtils.addItemToOreDictionary(TemporalHarmonyCatalyst, "catalystTemporalHarmony");
+ ItemUtils.addItemToOreDictionary(mLimpidWaterCatalyst, "catalystLimpidWater");
+ ItemUtils.addItemToOreDictionary(mFlawlessWaterCatalyst, "catalystFlawlessWater");
+ ItemUtils.addItemToOreDictionary(mParticleAccelerationCatalyst, "catalystParticleAcceleration");
+ ItemUtils.addItemToOreDictionary(mSynchrotronCapableCatalyst, "catalystSynchrotronCapable");
+ ItemUtils.addItemToOreDictionary(mAlgagenicGrowthPromoterCatalyst, "catalystAlgagenicGrowthPromoter");
+ }
+
+ @Override
+ public void blocks() {}
+
+ @Override
+ public void fluids() {
+
+ if (!FluidRegistry.isFluidRegistered("benzene")) {
+ Benzene = FluidUtils
+ .generateFluidNoPrefix("benzene", "Benzene", 278, new short[] { 100, 70, 30, 100 }, true);
+ } else {
+ Benzene = FluidRegistry.getFluid("benzene");
+ }
+
+ NitroBenzene = FluidUtils
+ .generateFluidNoPrefix("nitrobenzene", "Nitrobenzene", 278, new short[] { 70, 50, 40, 100 }, true);
+
+ Aniline = FluidUtils.generateFluidNoPrefix("aniline", "Aniline", 266, new short[] { 100, 100, 30, 100 }, true);
+
+ BoricAcid = FluidUtils
+ .generateFluidNoPrefix("boricacid", "Boric Acid", 278, new short[] { 90, 30, 120, 100 }, true);
+
+ Polyurethane = FluidUtils
+ .generateFluidNoPrefix("polyurethane", "Polyurethane", 350, new short[] { 100, 70, 100, 100 }, true);
+
+ if (!FluidRegistry.isFluidRegistered("phenol")) {
+ Phenol = FluidUtils.generateFluidNoPrefix("phenol", "Phenol", 313, new short[] { 100, 70, 30, 100 }, true);
+ } else {
+ Phenol = FluidRegistry.getFluid("phenol");
+ }
+
+ // Use GT's if it exists, else make our own.
+ if (FluidRegistry.isFluidRegistered("hydrochloricacid_gt5u")) {
+ HydrochloricAcid = FluidRegistry.getFluid("hydrochloricacid_gt5u");
+ } else {
+ HydrochloricAcid = FluidUtils.generateFluidNoPrefix(
+ "hydrochloricacid",
+ "Hydrochloric Acid",
+ 285,
+ new short[] { 183, 200, 196, 100 },
+ true);
+ }
+
+ Cyclohexane = FluidUtils
+ .generateFluidNoPrefix("cyclohexane", "Cyclohexane", 32 + 175, new short[] { 100, 70, 30, 100 }, true);
+ Cyclohexanone = FluidUtils
+ .generateFluidNoPrefix("cyclohexanone", "Cyclohexanone", 32 + 175, new short[] { 100, 70, 30, 100 }, true);
+
+ Cadaverine = FluidUtils
+ .generateFluidNoPrefix("cadaverine", "Cadaverine", 32 + 175, new short[] { 100, 70, 30, 100 }, true);
+ Putrescine = FluidUtils
+ .generateFluidNoPrefix("putrescine", "Putrescine", 32 + 175, new short[] { 100, 70, 30, 100 }, true);
+
+ // Create 2-Ethylanthraquinone
+ // 2-Ethylanthraquinone is prepared from the reaction of phthalic anhydride and ethylbenzene
+ Ethylanthraquinone2 = FluidUtils.generateFluidNonMolten(
+ "2Ethylanthraquinone",
+ "2-Ethylanthraquinone",
+ 415,
+ new short[] { 227, 255, 159, 100 },
+ null,
+ null);
+ // Create 2-Ethylanthrahydroquinone
+ // Palladium plate + Hydrogen(250) + 2-Ethylanthraquinone(500) = 600 Ethylanthrahydroquinone
+ Ethylanthrahydroquinone2 = FluidUtils.generateFluidNonMolten(
+ "2Ethylanthrahydroquinone",
+ "2-Ethylanthrahydroquinone",
+ 415,
+ new short[] { 207, 225, 129, 100 },
+ null,
+ null);
+ // Create Hydrogen Peroxide
+ // Compressed Air(1500) + Ethylanthrahydroquinone(500) + Anthracene(5) = 450 Ethylanthraquinone && 200 Peroxide
+ Hydrogen_Peroxide = FluidUtils.generateFluidNonMolten(
+ "HydrogenPeroxide",
+ "Hydrogen Peroxide",
+ 150,
+ new short[] { 210, 255, 255, 100 },
+ null,
+ null);
+
+ // Lithium Hydroperoxide - LiOH + H2O2 → LiOOH + 2 H2O
+ // ItemUtils.generateSpecialUseDusts("LithiumHydroperoxide", "Lithium Hydroperoxide", "HLiO2",
+ // Utils.rgbtoHexValue(125, 125, 125));
+ // v - Dehydrate
+ // Lithium Peroxide - 2 LiOOH → Li2O2 + H2O2 + 2 H2O
+ Lithium_Peroxide = FluidUtils.generateFluidNonMolten(
+ "LithiumPeroxide",
+ "Lithium Peroxide",
+ 446,
+ new short[] { 135, 135, 135, 100 },
+ null,
+ null);
+
+ Carbon_Disulfide = FluidUtils
+ .generateFluidNoPrefix("CarbonDisulfide", "Carbon Disulfide", 350, new short[] { 175, 175, 175, 100 });
+ }
+
+ @Override
+ public String errorMessage() {
+ return "Failed to generate recipes for GenericChem.";
+ }
+
+ @Override
+ public boolean generateRecipes() {
+
+ recipeAdvancedChip();
+ recipeCatalystRed();
+ recipeCatalystYellow();
+ recipeCatalystBlue();
+ recipeCatalystOrange();
+ recipeCatalystPurple();
+ recipeCatalystBrown();
+ recipeCatalystPink();
+ recipeCatalystFormaldehyde();
+ recipeCatalystSolidAcid();
+ recipeCatalystInfiniteMutation();
+
+ recipeGrindingBallAlumina();
+ recipeGrindingBallSoapstone();
+
+ recipeNitroBenzene();
+ recipeAniline();
+ recipeCadaverineAndPutrescine();
+ recipeCyclohexane();
+ recipeCyclohexanone();
+
+ recipe2Ethylanthraquinone();
+ recipe2Ethylanthrahydroquinone();
+ recipeHydrogenPeroxide();
+ recipeLithiumHydroperoxide();
+ recipeLithiumPeroxide();
+
+ recipeSodiumEthoxide();
+ recipeCarbonDisulfide();
+ recipeEthylXanthates();
+ recipePotassiumHydroxide();
+
+ recipeMutatedLivingSolder();
+
+ registerFuels();
+
+ return true;
+ }
+
+ private void recipeSodiumEthoxide() {
+ // C2H5OH + Na → C2H5ONa + H
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(16), ELEMENT.getInstance().SODIUM.getDust(1) },
+ new FluidStack[] { Materials.Ethanol.getFluid(1000) },
+ new ItemStack[] { ItemUtils.getSimpleStack(mSodiumEthoxide, 9) },
+ new FluidStack[] { ELEMENT.getInstance().HYDROGEN.getFluidStack(1000) },
+ 20 * 20,
+ 120,
+ 2);
+ }
+
+ private void recipePotassiumHydroxide() {
+ // Ca(OH)2 + K2O + CO2 → CaCO3 + 2 KOH
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(18), Materials.Potash.getDust(3),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCalciumHydroxide", 5), },
+ new FluidStack[] { Materials.CarbonDioxide.getGas(1000) },
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustCalciumCarbonate", 5),
+ ItemUtils.getSimpleStack(mPotassiumHydroxide, 6) },
+ new FluidStack[] {},
+ 20 * 30,
+ 120,
+ 2);
+ }
+
+ private void recipeEthylXanthates() {
+
+ // Potassium ethyl xanthate - CH3CH2OH + CS2 + KOH → C3H5KOS2 + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17), ItemUtils.getSimpleStack(mPotassiumHydroxide, 3), },
+ new FluidStack[] { Materials.Ethanol.getFluid(1000), FluidUtils.getFluidStack(Carbon_Disulfide, 1000), },
+ new ItemStack[] { ItemUtils.getSimpleStack(mPotassiumEthylXanthate, 12) },
+ new FluidStack[] { FluidUtils.getWater(1000) },
+ 20 * 60,
+ 120,
+ 4);
+
+ // Sodium ethyl xanthate - CH3CH2ONa + CS2 → CH3CH2OCS2Na
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17), ItemUtils.getSimpleStack(mSodiumEthoxide, 9) },
+ new FluidStack[] { FluidUtils.getFluidStack(Carbon_Disulfide, 1000), },
+ new ItemStack[] { ItemUtils.getSimpleStack(mSodiumEthylXanthate, 12) },
+ new FluidStack[] {},
+ 20 * 60,
+ 120,
+ 4);
+ }
+
+ private void recipeCarbonDisulfide() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getItemStackOfAmountFromOreDict("fuelCoke", 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 16L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1L))
+ .fluidOutputs(FluidUtils.getFluidStack(Carbon_Disulfide, 4000))
+ .duration(10 * MINUTES)
+ .eut(TierEU.RECIPE_LV)
+ .metadata(COIL_HEAT, 1500)
+ .addTo(blastFurnaceRecipes);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(20), ItemUtils.getSimpleStack(mBrownCatalyst, 0),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSulfur", 4) },
+ new FluidStack[] { FluidUtils.getFluidStack(CoalTar.Coal_Gas, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Carbon_Disulfide, 2000) },
+ 20 * 60 * 5,
+ 30,
+ 2);
+ }
+
+ private void recipeMutatedLivingSolder() {
+
+ // Endgame soldering alloy meant for the bioware circuit line and beyond.
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GenericChem.mInfiniteMutationCatalyst, 0),
+ ItemList.Circuit_Chip_Biocell.get(64), ItemList.Gravistar.get(8),
+ Materials.InfinityCatalyst.getDust(2) },
+ new FluidStack[] { FluidUtils.getFluidStack("plasma.tin", 18000),
+ FluidUtils.getFluidStack("plasma.bismuth", 18000), FluidUtils.getFluidStack("cryotheum", 4000) },
+ new ItemStack[] {},
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 280) },
+ 20 * 800,
+ 3842160,
+ 7);
+ }
+
+ private static void registerFuels() {
+
+ // Burnables
+
+ // Gas Fuels
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("cellNitrobenzene", 1))
+ .metadata(FUEL_VALUE, 1600)
+ .metadata(FUEL_TYPE, 1)
+ .duration(0)
+ .eut(0)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+
+ private void recipeGrindingBallAlumina() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mAlumina, 64), GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemUtils.getSimpleStack(mMillingBallAlumina, 8))
+ .fluidInputs(FluidUtils.getFluidStack(GenericChem.Aniline, 4000))
+ .duration(3 * MINUTES)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeGrindingBallSoapstone() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Soapstone, 32L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemUtils.getSimpleStack(mMillingBallSoapstone, 8))
+ .fluidInputs(FluidUtils.getFluidStack(AgrichemFluids.mLiquidResin, 2500))
+ .duration(2 * MINUTES)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCyclohexane() {
+
+ // C6H6 + 6H = C6H12
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierTwoChip(), ItemUtils.getSimpleStack(mBrownCatalyst, 0) },
+ new FluidStack[] { FluidUtils.getFluidStack(Benzene, 1000), FluidUtils.getFluidStack("hydrogen", 6000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Cyclohexane, 1000), },
+ 20 * 120,
+ 120,
+ 2);
+ }
+
+ private void recipeCyclohexanone() {
+
+ // C6H12 + 2O(Air) = C6H10O + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierTwoChip(), ItemUtils.getSimpleStack(mBlueCatalyst, 0) },
+ new FluidStack[] { FluidUtils.getFluidStack(Cyclohexane, 1000), FluidUtils.getFluidStack("air", 4000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Cyclohexanone, 1000), },
+ 20 * 120,
+ 120,
+ 2);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierTwoChip(), },
+ new FluidStack[] { FluidUtils.getFluidStack(Cyclohexane, 1000), FluidUtils.getFluidStack("oxygen", 2000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Cyclohexanone, 1000), },
+ 20 * 120,
+ 120,
+ 2);
+ }
+
+ private void recipeCatalystRed() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierOneChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 2L))
+ .itemOutputs(ItemUtils.getSimpleStack(mRedCatalyst, 10))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystYellow() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierThreeChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungsten, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 4L))
+ .itemOutputs(ItemUtils.getSimpleStack(mYellowCatalyst, 10))
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystBlue() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierTwoChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cobalt, 3L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 3L))
+ .itemOutputs(ItemUtils.getSimpleStack(mBlueCatalyst, 10))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystOrange() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierTwoChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 5L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 5L))
+ .itemOutputs(ItemUtils.getSimpleStack(mOrangeCatalyst, 10))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystPurple() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierFourChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 6L),
+ ELEMENT.getInstance().RUTHENIUM.getDust(6))
+ .itemOutputs(ItemUtils.getSimpleStack(mPurpleCatalyst, 10))
+ .duration(2 * MINUTES)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystBrown() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierOneChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4L))
+ .itemOutputs(ItemUtils.getSimpleStack(mBrownCatalyst, 10))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystPink() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierThreeChip(),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 4L),
+ ELEMENT.getInstance().RHODIUM.getDust(4))
+ .itemOutputs(ItemUtils.getSimpleStack(mPinkCatalyst, 10))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystFormaldehyde() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierThreeChip(),
+ CI.getEmptyCatalyst(4),
+ ItemUtils.getSimpleStack(RocketFuels.Formaldehyde_Catalyst_Dust, 8))
+ .itemOutputs(ItemUtils.getSimpleStack(mFormaldehydeCatalyst, 4))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystSolidAcid() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierThreeChip(),
+ CI.getEmptyCatalyst(5),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lapis, 2L))
+ .itemOutputs(ItemUtils.getSimpleStack(GenericChem.mSolidAcidCatalyst, 5))
+ .fluidInputs(MISC_MATERIALS.SOLID_ACID_MIXTURE.getFluidStack(1000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCatalystInfiniteMutation() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getTierThreeChip(),
+ CI.getEmptyCatalyst(5),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Infinity, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 10L))
+ .itemOutputs(ItemUtils.getSimpleStack(GenericChem.mInfiniteMutationCatalyst, 5))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(assemblerRecipes);
+ }
+
+ private void recipeCadaverineAndPutrescine() {
+
+ // Basic Recipe
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierOneChip(), ItemUtils.getSimpleStack(Items.rotten_flesh, 64) },
+ new FluidStack[] { FluidUtils.getHotWater(2000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Cadaverine, 250), FluidUtils.getFluidStack(Putrescine, 250), },
+ 20 * 120,
+ 120,
+ 1);
+
+ // Advanced Recipe
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierTwoChip(), ItemUtils.getSimpleStack(Items.rotten_flesh, 128),
+ ItemUtils.simpleMetaStack(AgriculturalChem.mAgrichemItem1, 8, 32) },
+ new FluidStack[] { FluidUtils.getHotWater(3000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Cadaverine, 750), FluidUtils.getFluidStack(Putrescine, 750), },
+ 20 * 120,
+ 240,
+ 2);
+ }
+
+ private void recipeAniline() {
+
+ // C6H5NO2 + 6H = C6H7N + 2H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierThreeChip(), ItemUtils.getSimpleStack(mBlueCatalyst, 0) },
+ new FluidStack[] { FluidUtils.getFluidStack(NitroBenzene, 1000),
+ FluidUtils.getFluidStack("hydrogen", 6000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Aniline, 1000), },
+ 20 * 30,
+ 500,
+ 3);
+ }
+
+ private void recipeNitroBenzene() {
+
+ // C6H6 + HNO3 =H2SO4= C6H5NO2 +H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getTierThreeChip(), },
+ new FluidStack[] { FluidUtils.getFluidStack(Benzene, 5000), FluidUtils.getFluidStack("sulfuricacid", 1000),
+ FluidUtils.getFluidStack("nitricacid", 5000), FluidUtils.getDistilledWater(10000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(NitroBenzene, 5000), },
+ 20 * 30,
+ 500,
+ 4);
+ }
+
+ private void recipe2Ethylanthraquinone() {
+
+ // C6H4(CO)2O + C6H5CH2CH3 = C6H4(CO)2C6H3CH2CH3 + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(4),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustPhthalicAnhydride", 15), },
+ new FluidStack[] { FluidUtils.getFluidStack(CoalTar.Ethylbenzene, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Ethylanthraquinone2, 1000), },
+ 20 * 15,
+ 120,
+ 2);
+ }
+
+ private void recipe2Ethylanthrahydroquinone() {
+
+ // C6H4(CO)2C6H3CH2CH3 + 2H = C6H4(COH)2C6H3CH2CH3
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(4), ItemUtils.getSimpleStack(mOrangeCatalyst, 0), },
+ new FluidStack[] { FluidUtils.getFluidStack(Ethylanthraquinone2, 1000),
+ FluidUtils.getFluidStack("hydrogen", 2000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Ethylanthrahydroquinone2, 1000), },
+ 20 * 40,
+ 120,
+ 2);
+ }
+
+ private void recipeLithiumPeroxide() {
+ // 2HLiO2 = Li2O2 + H2O2
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumHydroperoxide", 8))
+ .fluidOutputs(FluidUtils.getFluidStack("fluid.hydrogenperoxide", 1000))
+ .itemOutputs(ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumPeroxide", 4))
+ .duration(100 * SECONDS)
+ .eut(120)
+ .noOptimize()
+ .addTo(chemicalDehydratorRecipes);
+ }
+
+ private void recipeLithiumHydroperoxide() {
+
+ // LiOH + H2O2 = HLiO2 + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(4),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumHydroxide", 3), },
+ new FluidStack[] { FluidUtils.getFluidStack("fluid.hydrogenperoxide", 1000), },
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumHydroperoxide", 4), },
+ new FluidStack[] {},
+ 20 * 30,
+ 240,
+ 1);
+
+ }
+
+ private void recipeHydrogenPeroxide() {
+
+ // C6H4(COH)2C6H3CH2CH3 + 2O =(C6H4CH)2= H2O2 + C6H4(CO)2C6H3CH2CH3
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(4), },
+ new FluidStack[] { FluidUtils.getFluidStack("air", 20000),
+ FluidUtils.getFluidStack(Ethylanthrahydroquinone2, 5000),
+ FluidUtils.getFluidStack("fluid.anthracene", 50), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Ethylanthraquinone2, 5000),
+ FluidUtils.getFluidStack("fluid.hydrogenperoxide", 5000), },
+ 20 * 30,
+ 240,
+ 1);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(4), },
+ new FluidStack[] { Materials.Oxygen.getGas(10000), FluidUtils.getFluidStack(Ethylanthrahydroquinone2, 5000),
+ FluidUtils.getFluidStack("fluid.anthracene", 50), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Ethylanthraquinone2, 5000),
+ FluidUtils.getFluidStack("fluid.hydrogenperoxide", 5000), },
+ 20 * 5,
+ 240,
+ 1);
+
+ }
+
+ private static ItemStack getTierOneChip() {
+ return CI.getNumberedAdvancedCircuit(4);
+ }
+
+ private static ItemStack getTierTwoChip() {
+ return CI.getNumberedAdvancedCircuit(8);
+ }
+
+ private static ItemStack getTierThreeChip() {
+ return CI.getNumberedAdvancedCircuit(12);
+ }
+
+ private static ItemStack getTierFourChip() {
+ return CI.getNumberedAdvancedCircuit(16);
+ }
+
+ private static void recipeAdvancedChip() {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 0L),
+ 0,
+ new Object[] { OrePrefixes.circuit.get(Materials.Advanced) });
+
+ long bits = 0;
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 1L, new Object[0]),
+ bits,
+ new Object[] { "d ", " P ", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 2L, new Object[0]),
+ bits,
+ new Object[] { " d ", " P ", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 3L, new Object[0]),
+ bits,
+ new Object[] { " d", " P ", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 4L, new Object[0]),
+ bits,
+ new Object[] { " ", " Pd", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 5L, new Object[0]),
+ bits,
+ new Object[] { " ", " P ", " d", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 6L, new Object[0]),
+ bits,
+ new Object[] { " ", " P ", " d ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 7L, new Object[0]),
+ bits,
+ new Object[] { " ", " P ", "d ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 8L, new Object[0]),
+ bits,
+ new Object[] { " ", "dP ", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 9L, new Object[0]),
+ bits,
+ new Object[] { "P d", " ", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 10L, new Object[0]),
+ bits,
+ new Object[] { "P ", " d", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 11L, new Object[0]),
+ bits,
+ new Object[] { "P ", " ", " d", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 12L, new Object[0]),
+ bits,
+ new Object[] { "P ", " ", " d ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 13L, new Object[0]),
+ bits,
+ new Object[] { " P", " ", " d", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 14L, new Object[0]),
+ bits,
+ new Object[] { " P", " ", " d ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 15L, new Object[0]),
+ bits,
+ new Object[] { " P", " ", "d ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 16L, new Object[0]),
+ bits,
+ new Object[] { " P", "d ", " ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 17L, new Object[0]),
+ bits,
+ new Object[] { " ", " ", "d P", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 18L, new Object[0]),
+ bits,
+ new Object[] { " ", "d ", " P", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 19L, new Object[0]),
+ bits,
+ new Object[] { "d ", " ", " P", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 20L, new Object[0]),
+ bits,
+ new Object[] { " d ", " ", " P", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 21L, new Object[0]),
+ bits,
+ new Object[] { "d ", " ", "P ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 22L, new Object[0]),
+ bits,
+ new Object[] { " d ", " ", "P ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 23L, new Object[0]),
+ bits,
+ new Object[] { " d", " ", "P ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ BioRecipes.addCraftingRecipe(
+ GregtechItemList.Circuit_T3RecipeSelector.getWithDamage(1L, 24L, new Object[0]),
+ bits,
+ new Object[] { " ", " d", "P ", 'P',
+ GregtechItemList.Circuit_T3RecipeSelector.getWildcard(1L, new Object[0]) });
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/IonParticles.java b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/IonParticles.java
new file mode 100644
index 0000000000..d4f5e832f6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/IonParticles.java
@@ -0,0 +1,171 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.core.item.base.misc.BaseItemParticle;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.util.Utils;
+
+public class IonParticles extends BaseItemParticle {
+
+ public static HashMap<String, Integer> NameToMetaMap = new HashMap<>();
+ public static HashMap<Integer, String> MetaToNameMap = new HashMap<>();
+
+ public IonParticles() {
+ super("Ion", ELEMENT.NAMES.length, EnumRarity.rare);
+ }
+
+ public static IIcon[] overlays = new IIcon[ELEMENT.NAMES.length];
+ public static IIcon baseTexture;
+
+ static {
+ // Generate Ions
+ int key = 0;
+ for (String s : ELEMENT.NAMES) {
+ // Map names to Meta
+ NameToMetaMap.put(Utils.sanitizeString(s.toLowerCase()), key);
+ MetaToNameMap.put(key, Utils.sanitizeString(s.toLowerCase()));
+ Materials m = Materials.get(s);
+ int aColour = 0;
+ if (m == null) {
+ aColour = Utils.rgbtoHexValue(128, 128, 128);
+ } else {
+ aColour = Utils.rgbtoHexValue(m.mRGBa[0], m.mRGBa[1], m.mRGBa[2]);
+ }
+ aColourMap.put(key++, aColour);
+ }
+ }
+
+ @Override
+ public String[] getAffixes() {
+ return new String[] { "", "" };
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return "";
+ }
+
+ @Override
+ public String getUnlocalizedName(final ItemStack itemStack) {
+ return "item.particle.ion" + "." + ELEMENT.NAMES[itemStack.getItemDamage()];
+ }
+
+ private static boolean createNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Charge", 0);
+ tagMain.setTag("Ion", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static final long getChargeState(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("Ion");
+ if (aNBT != null) {
+ return aNBT.getLong("Charge");
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return 0L;
+ }
+
+ public static final boolean setChargeState(final ItemStack aStack, final long aCharge) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("Ion");
+ if (aNBT != null) {
+ aNBT.setLong("Charge", aCharge);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ if (stack.getTagCompound() == null) {
+ createNBT(stack);
+ }
+ double chargeState = getChargeState(stack);
+ return chargeState;
+ }
+
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ long aCharge = getChargeState(stack);
+ String aState = EnumChatFormatting.YELLOW + "Unknown" + EnumChatFormatting.GRAY;
+ // State not set
+ if (aCharge == 0) {
+ list.add(
+ EnumChatFormatting.GRAY + "A "
+ + MetaToNameMap.get(stack.getItemDamage())
+ + " Ion with an "
+ + aState
+ + " charge state");
+ } else {
+ if (aCharge > 0) {
+ aState = EnumChatFormatting.GREEN + "Positive" + EnumChatFormatting.GRAY;
+ } else {
+ aState = EnumChatFormatting.RED + "Negative" + EnumChatFormatting.GRAY;
+ }
+
+ list.add(
+ EnumChatFormatting.GRAY + "A "
+ + MetaToNameMap.get(stack.getItemDamage())
+ + " Ion with a "
+ + aState
+ + " charge state of "
+ + aCharge
+ + "");
+ }
+ super.addInformation(stack, player, list, bool);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ for (int i = 0; i < IonParticles.overlays.length; i++) {
+ IonParticles.overlays[i] = reg.registerIcon(GTPlusPlus.ID + ":" + "ion/" + i);
+ }
+ IonParticles.baseTexture = reg.registerIcon(GTPlusPlus.ID + ":" + "ion/IonBase");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return IonParticles.overlays[meta];
+ }
+
+ @Override
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(int aMeta, int aPass) {
+ if (aPass == 0) {
+ return IonParticles.baseTexture;
+ } else {
+ return IonParticles.overlays[aMeta];
+ }
+ }
+
+ @Override
+ public int getRenderPasses(int metadata) {
+ return 2;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/MilledOreProcessing.java b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/MilledOreProcessing.java
new file mode 100644
index 0000000000..5a848d2616
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/MilledOreProcessing.java
@@ -0,0 +1,752 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.enums.Mods.BiomesOPlenty;
+import static gregtech.api.enums.Mods.Forestry;
+
+import java.util.HashMap;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.api.objects.data.Quad;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.core.item.base.ore.BaseItemMilledOre;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.NONMATERIAL;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.xmod.bop.HANDLER_BiomesOPlenty;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+
+public class MilledOreProcessing extends ItemPackage {
+
+ /**
+ * Fluids
+ */
+ public static Fluid SphaleriteFlotationFroth;
+
+ public static Fluid ChalcopyriteFlotationFroth;
+ public static Fluid NickelFlotationFroth;
+ public static Fluid PlatinumFlotationFroth;
+ public static Fluid PentlanditeFlotationFroth;
+
+ public static Fluid RedstoneFlotationFroth;
+ public static Fluid SpessartineFlotationFroth;
+ public static Fluid GrossularFlotationFroth;
+ public static Fluid AlmandineFlotationFroth;
+ public static Fluid PyropeFlotationFroth;
+ public static Fluid MonaziteFlotationFroth;
+
+ public static Fluid PineOil;
+
+ /**
+ * Items
+ */
+
+ // Zinc, Iron, Indium, Germanium
+ public static Item milledSphalerite;
+
+ // Copper, Iron, Cadmium, Indium
+ public static Item milledChalcopyrite;
+
+ // Nickel, Cobalt, Rhodium, Ruthenium
+ public static Item milledNickel;
+
+ // Platinum, Rhodium, Selenium, Tellurium
+ public static Item milledPlatinum;
+
+ // Iron, Nickel, Promethium, Hafnium
+ public static Item milledPentlandite;
+
+ // Redstone, Chrome, Firestone, Dysprosium
+ public static Item milledRedstone;
+
+ // Manganese, Aluminium, Osmium, Strontium
+ public static Item milledSpessartine;
+
+ // Calcium, Aluminium, Tungsten, Thallium
+ public static Item milledGrossular;
+
+ // Aluminium, Magnesium, Yttrium, Ytterbium
+ public static Item milledAlmandine;
+
+ // Magnesium, Manganese, Borax, Rhenium
+ public static Item milledPyrope;
+
+ // Erbium, Lanthanum, Praseodymium, Europium
+ public static Item milledMonazite;
+
+ @Override
+ public void items() {
+
+ milledSphalerite = BaseItemMilledOre.generate(Materials.Sphalerite, MaterialUtils.getVoltageForTier(6));
+ milledChalcopyrite = BaseItemMilledOre.generate(Materials.Chalcopyrite, MaterialUtils.getVoltageForTier(5));
+ milledNickel = BaseItemMilledOre.generate(Materials.Nickel, MaterialUtils.getVoltageForTier(5));
+ milledPlatinum = BaseItemMilledOre.generate(Materials.Platinum, MaterialUtils.getVoltageForTier(6));
+ milledPentlandite = BaseItemMilledOre.generate(Materials.Pentlandite, MaterialUtils.getVoltageForTier(6));
+
+ milledRedstone = BaseItemMilledOre.generate(Materials.Redstone, MaterialUtils.getVoltageForTier(5));
+ milledSpessartine = BaseItemMilledOre.generate(Materials.Spessartine, MaterialUtils.getVoltageForTier(6));
+ milledGrossular = BaseItemMilledOre.generate(Materials.Grossular, MaterialUtils.getVoltageForTier(6));
+ milledAlmandine = BaseItemMilledOre.generate(Materials.Almandine, MaterialUtils.getVoltageForTier(6));
+ milledPyrope = BaseItemMilledOre.generate(Materials.Pyrope, MaterialUtils.getVoltageForTier(4));
+ milledMonazite = BaseItemMilledOre.generate(Materials.Monazite, MaterialUtils.getVoltageForTier(7));
+ }
+
+ @Override
+ public void blocks() {
+ // None yet
+ }
+
+ @Override
+ public void fluids() {
+
+ short[] aZincFrothRGB = Materials.Sphalerite.mRGBa;
+ SphaleriteFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.zincflotation",
+ "Sphalerite Froth",
+ 32 + 175,
+ new short[] { aZincFrothRGB[0], aZincFrothRGB[1], aZincFrothRGB[2], 100 },
+ true);
+ short[] aCopperFrothRGB = Materials.Chalcopyrite.mRGBa;
+ ChalcopyriteFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.copperflotation",
+ "Chalcopyrite Froth",
+ 32 + 175,
+ new short[] { aCopperFrothRGB[0], aCopperFrothRGB[1], aCopperFrothRGB[2], 100 },
+ true);
+ short[] aNickelFrothRGB = Materials.Nickel.mRGBa;
+ NickelFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.nickelflotation",
+ "Nickel Froth",
+ 32 + 175,
+ new short[] { aNickelFrothRGB[0], aNickelFrothRGB[1], aNickelFrothRGB[2], 100 },
+ true);
+ short[] aPlatinumFrothRGB = Materials.Platinum.mRGBa;
+ PlatinumFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.platinumflotation",
+ "Platinum Froth",
+ 32 + 175,
+ new short[] { aPlatinumFrothRGB[0], aPlatinumFrothRGB[1], aPlatinumFrothRGB[2], 100 },
+ true);
+ short[] aPentlanditeFrothRGB = Materials.Pentlandite.mRGBa;
+ PentlanditeFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.pentlanditeflotation",
+ "Pentlandite Froth",
+ 32 + 175,
+ new short[] { aPentlanditeFrothRGB[0], aPentlanditeFrothRGB[1], aPentlanditeFrothRGB[2], 100 },
+ true);
+
+ short[] aRedstoneFrothRGB = Materials.Redstone.mRGBa;
+ RedstoneFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.redstoneflotation",
+ "Redstone Froth",
+ 32 + 175,
+ new short[] { aRedstoneFrothRGB[0], aRedstoneFrothRGB[1], aRedstoneFrothRGB[2], 100 },
+ true);
+ short[] aSpessartineFrothRGB = Materials.Spessartine.mRGBa;
+ SpessartineFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.spessartineflotation",
+ "Spessartine Froth",
+ 32 + 175,
+ new short[] { aSpessartineFrothRGB[0], aSpessartineFrothRGB[1], aSpessartineFrothRGB[2], 100 },
+ true);
+ short[] aGrossularFrothRGB = Materials.Grossular.mRGBa;
+ GrossularFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.grossularflotation",
+ "Grossular Froth",
+ 32 + 175,
+ new short[] { aGrossularFrothRGB[0], aGrossularFrothRGB[1], aGrossularFrothRGB[2], 100 },
+ true);
+ short[] aAlmandineFrothRGB = Materials.Almandine.mRGBa;
+ AlmandineFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.almandineflotation",
+ "Almandine Froth",
+ 32 + 175,
+ new short[] { aAlmandineFrothRGB[0], aAlmandineFrothRGB[1], aAlmandineFrothRGB[2], 100 },
+ true);
+ short[] aPyropeFrothRGB = Materials.Pyrope.mRGBa;
+ PyropeFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.pyropeflotation",
+ "Pyrope Froth",
+ 32 + 175,
+ new short[] { aPyropeFrothRGB[0], aPyropeFrothRGB[1], aPyropeFrothRGB[2], 100 },
+ true);
+ short[] aMonaziteFrothRGB = Materials.Monazite.mRGBa;
+ MonaziteFlotationFroth = FluidUtils.generateFluidNoPrefix(
+ "froth.Monaziteflotation",
+ "Monazite Froth",
+ 32 + 175,
+ new short[] { aMonaziteFrothRGB[0], aMonaziteFrothRGB[1], aMonaziteFrothRGB[2], 100 },
+ true);
+
+ PineOil = FluidUtils
+ .generateFluidNoPrefix("pineoil", "Pine Oil", 32 + 175, new short[] { 250, 200, 60, 100 }, true);
+ }
+
+ public MilledOreProcessing() {
+ super();
+ Logger.INFO("Adding Ore Milling content");
+ }
+
+ private static void addMiscRecipes() {
+
+ /*
+ * First 5
+ */
+
+ // milledSphalerite
+ registerOreDataForMilledType(
+ SphaleriteFlotationFroth,
+ ELEMENT.getInstance().ZINC,
+ 180,
+ ELEMENT.getInstance().IRON,
+ 120,
+ ELEMENT.getInstance().INDIUM,
+ 64,
+ ELEMENT.getInstance().GERMANIUM,
+ 15);
+ // milledChalcopyrite
+ registerOreDataForMilledType(
+ ChalcopyriteFlotationFroth,
+ ELEMENT.getInstance().COPPER,
+ 180,
+ ELEMENT.getInstance().IRON,
+ 120,
+ ELEMENT.getInstance().CADMIUM,
+ 50,
+ ELEMENT.getInstance().INDIUM,
+ 10);
+ // milledNickel
+ registerOreDataForMilledType(
+ NickelFlotationFroth,
+ ELEMENT.getInstance().NICKEL,
+ 150,
+ ELEMENT.getInstance().COBALT,
+ 120,
+ ELEMENT.getInstance().RHODIUM,
+ 32,
+ ELEMENT.getInstance().RUTHENIUM,
+ 16);
+ // milledPlatinum
+ registerOreDataForMilledType(
+ PlatinumFlotationFroth,
+ ELEMENT.getInstance().PLATINUM,
+ 120,
+ ELEMENT.getInstance().RHODIUM,
+ 60,
+ ELEMENT.getInstance().SELENIUM,
+ 40,
+ ELEMENT.getInstance().TELLURIUM,
+ 10);
+ // milledPentlandite
+ registerOreDataForMilledType(
+ PentlanditeFlotationFroth,
+ ELEMENT.getInstance().IRON,
+ 150,
+ ELEMENT.getInstance().NICKEL,
+ 100,
+ ELEMENT.getInstance().PROMETHIUM,
+ 20,
+ ELEMENT.getInstance().HAFNIUM,
+ 10);
+
+ /*
+ * Second 5
+ */
+ // milledRedstone
+ registerOreDataForMilledType(
+ RedstoneFlotationFroth,
+ NONMATERIAL.REDSTONE,
+ 300,
+ ELEMENT.getInstance().CHROMIUM,
+ 60,
+ MaterialUtils.generateMaterialFromGtENUM(Materials.Firestone),
+ 45,
+ ELEMENT.getInstance().DYSPROSIUM,
+ 16);
+ // milledSpessartine
+ registerOreDataForMilledType(
+ SpessartineFlotationFroth,
+ ELEMENT.getInstance().MANGANESE,
+ 150,
+ ELEMENT.getInstance().ALUMINIUM,
+ 90,
+ ELEMENT.getInstance().OSMIUM,
+ 30,
+ ELEMENT.getInstance().STRONTIUM,
+ 20);
+ // milledGrossular
+ registerOreDataForMilledType(
+ GrossularFlotationFroth,
+ ELEMENT.getInstance().CALCIUM,
+ 180,
+ ELEMENT.getInstance().ALUMINIUM,
+ 110,
+ ELEMENT.getInstance().TUNGSTEN,
+ 60,
+ ELEMENT.getInstance().THALLIUM,
+ 15);
+ // milledAlmandine
+ registerOreDataForMilledType(
+ AlmandineFlotationFroth,
+ ELEMENT.getInstance().ALUMINIUM,
+ 150,
+ ELEMENT.getInstance().MAGNESIUM,
+ 75,
+ ELEMENT.getInstance().YTTRIUM,
+ 25,
+ ELEMENT.getInstance().YTTERBIUM,
+ 15);
+ // milledPyrope
+ registerOreDataForMilledType(
+ PyropeFlotationFroth,
+ ELEMENT.getInstance().MAGNESIUM,
+ 110,
+ ELEMENT.getInstance().MANGANESE,
+ 70,
+ MaterialUtils.generateMaterialFromGtENUM(Materials.Borax),
+ 60,
+ ELEMENT.getInstance().RHENIUM,
+ 20);
+ // milledMonazite TODO
+ registerOreDataForMilledType(
+ MonaziteFlotationFroth,
+ ELEMENT.getInstance().ERBIUM,
+ 64,
+ ELEMENT.getInstance().LANTHANUM,
+ 32,
+ ELEMENT.getInstance().LUTETIUM,
+ 16,
+ ELEMENT.getInstance().EUROPIUM,
+ 8);
+ }
+
+ @Override
+ public String errorMessage() {
+ return "Failed to generate recipes for OreMillingProc.";
+ }
+
+ @Override
+ public boolean generateRecipes() {
+ addMiscRecipes();
+ addPineOilExtraction();
+ addFlotationRecipes1();
+ addFlotationRecipes2();
+ addVacuumFurnaceRecipes();
+ return true;
+ }
+
+ private void addVacuumFurnaceRecipes() {
+ int aCircuitID = 1;
+
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(SphaleriteFlotationFroth, 4000) },
+ getOutputsFromMap(SphaleriteFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(6),
+ 5500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(ChalcopyriteFlotationFroth, 4000) },
+ getOutputsFromMap(ChalcopyriteFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(5),
+ 4500);
+
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(NickelFlotationFroth, 4000) },
+ getOutputsFromMap(NickelFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(5),
+ 4500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(PlatinumFlotationFroth, 4000) },
+ getOutputsFromMap(PlatinumFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(6),
+ 5500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(PentlanditeFlotationFroth, 4000) },
+ getOutputsFromMap(PentlanditeFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(6),
+ 5500);
+
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(RedstoneFlotationFroth, 4000) },
+ getOutputsFromMap(RedstoneFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(5),
+ 4500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(SpessartineFlotationFroth, 4000) },
+ getOutputsFromMap(SpessartineFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(6),
+ 5500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(GrossularFlotationFroth, 4000) },
+ getOutputsFromMap(GrossularFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(6),
+ 5500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(AlmandineFlotationFroth, 4000) },
+ getOutputsFromMap(AlmandineFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(6),
+ 5500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(PyropeFlotationFroth, 4000) },
+ getOutputsFromMap(PyropeFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(4),
+ 3500);
+ CORE.RA.addVacuumFurnaceRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(aCircuitID++) },
+ new FluidStack[] { FluidUtils.getFluidStack(MonaziteFlotationFroth, 4000) },
+ getOutputsFromMap(MonaziteFlotationFroth),
+ new FluidStack[] { FluidUtils.getFluidStack(AgriculturalChem.RedMud, 2000), FluidUtils.getWater(2000) },
+ 20 * 120,
+ MaterialUtils.getVoltageForTier(7),
+ 7500);
+ }
+
+ private void addFlotationRecipes1() {
+
+ // Sphalerite
+ CORE.RA.addFlotationRecipe(
+ Materials.Sphalerite,
+ ItemUtils.getSimpleStack(GenericChem.mSodiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 14000), },
+ new FluidStack[] { FluidUtils.getFluidStack(SphaleriteFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Chalcopyrite
+ CORE.RA.addFlotationRecipe(
+ Materials.Chalcopyrite,
+ ItemUtils.getSimpleStack(GenericChem.mSodiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 12000), },
+ new FluidStack[] { FluidUtils.getFluidStack(ChalcopyriteFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Nickel
+ CORE.RA.addFlotationRecipe(
+ Materials.Nickel,
+ ItemUtils.getSimpleStack(GenericChem.mPotassiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 25000), },
+ new FluidStack[] { FluidUtils.getFluidStack(NickelFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Platinum
+ CORE.RA.addFlotationRecipe(
+ Materials.Platinum,
+ ItemUtils.getSimpleStack(GenericChem.mPotassiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 35000), },
+ new FluidStack[] { FluidUtils.getFluidStack(PlatinumFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Pentlandite
+ CORE.RA.addFlotationRecipe(
+ Materials.Pentlandite,
+ ItemUtils.getSimpleStack(GenericChem.mSodiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 14000), },
+ new FluidStack[] { FluidUtils.getFluidStack(PentlanditeFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(6));
+ }
+
+ private void addFlotationRecipes2() {
+
+ // Redstone
+ CORE.RA.addFlotationRecipe(
+ Materials.Redstone,
+ ItemUtils.getSimpleStack(GenericChem.mSodiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 13000), },
+ new FluidStack[] { FluidUtils.getFluidStack(RedstoneFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Spessartine
+ CORE.RA.addFlotationRecipe(
+ Materials.Spessartine,
+ ItemUtils.getSimpleStack(GenericChem.mPotassiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 35000), },
+ new FluidStack[] { FluidUtils.getFluidStack(SpessartineFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Grossular
+ CORE.RA.addFlotationRecipe(
+ Materials.Grossular,
+ ItemUtils.getSimpleStack(GenericChem.mPotassiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 28000), },
+ new FluidStack[] { FluidUtils.getFluidStack(GrossularFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Almandine
+ CORE.RA.addFlotationRecipe(
+ Materials.Almandine,
+ ItemUtils.getSimpleStack(GenericChem.mSodiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 18000), },
+ new FluidStack[] { FluidUtils.getFluidStack(AlmandineFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Pyrope
+ CORE.RA.addFlotationRecipe(
+ Materials.Pyrope,
+ ItemUtils.getSimpleStack(GenericChem.mSodiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 8000), },
+ new FluidStack[] { FluidUtils.getFluidStack(PyropeFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(4));
+
+ // Monazite
+ CORE.RA.addFlotationRecipe(
+ Materials.Monazite,
+ ItemUtils.getSimpleStack(GenericChem.mPotassiumEthylXanthate, 1),
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 30000), },
+ new FluidStack[] { FluidUtils.getFluidStack(MonaziteFlotationFroth, 1000) },
+ 20 * 480,
+ MaterialUtils.getVoltageForTier(6));
+ }
+
+ private void addPineOilExtraction() {
+ AutoMap<ItemStack> aLogs = new AutoMap<>();
+ AutoMap<ItemStack> aLeaves = new AutoMap<>();
+ AutoMap<ItemStack> aSaplings = new AutoMap<>();
+ AutoMap<ItemStack> aPinecones = new AutoMap<>();
+
+ ItemStack aCrushedPine = ItemUtils.getSimpleStack(AgriculturalChem.mCrushedPine, 1);
+
+ aLogs.add(ItemUtils.getSimpleStack(BOP_Block_Registrator.log_Pine));
+ aLeaves.add(ItemUtils.getSimpleStack(BOP_Block_Registrator.leaves_Pine));
+ aSaplings.add(ItemUtils.getSimpleStack(BOP_Block_Registrator.sapling_Pine));
+ aPinecones.add(ItemUtils.getSimpleStack(AgriculturalChem.mPinecone, 1));
+
+ if (BiomesOPlenty.isModLoaded()) {
+ aLogs.add(HANDLER_BiomesOPlenty.getStack(HANDLER_BiomesOPlenty.logs4, 0, 1));
+ aLeaves.add(HANDLER_BiomesOPlenty.getStack(HANDLER_BiomesOPlenty.colorizedLeaves2, 1, 1));
+ aSaplings.add(HANDLER_BiomesOPlenty.getStack(HANDLER_BiomesOPlenty.colorizedSaplings, 5, 1));
+ aPinecones.add(ItemUtils.simpleMetaStack(HANDLER_BiomesOPlenty.mPineCone, 13, 1));
+ }
+ if (Forestry.isModLoaded()) {
+ ItemStack aForestryLog = ItemUtils.getItemStackFromFQRN("Forestry:logs", 1);
+ if (aForestryLog != null) {
+ aForestryLog.setItemDamage(20); // Set to Pine
+ aLogs.add(aForestryLog);
+ }
+ ItemStack aForestryLeaves = ItemUtils.getItemStackFromFQRN("Forestry:leaves", 1);
+ if (aForestryLeaves != null) {
+ NBTUtils.setString(aForestryLeaves, "species", "forestry.treePine"); // Set to Pine
+ aLeaves.add(aForestryLeaves);
+ }
+ }
+
+ for (ItemStack aLog : aLogs) {
+ addRecipe(aLog, ItemUtils.getSimpleStack(aCrushedPine, 16), new int[] { 10000, 7500, 5000, 2500 }, 10, 120);
+ }
+ for (ItemStack aLeaf : aLeaves) {
+ addRecipe(aLeaf, ItemUtils.getSimpleStack(aCrushedPine, 2), new int[] { 5000, 5000, 2500, 2500 }, 10, 30);
+ }
+ for (ItemStack aSapling : aSaplings) {
+ addRecipe(
+ aSapling,
+ ItemUtils.getSimpleStack(aCrushedPine, 4),
+ new int[] { 7500, 7500, 2500, 2500 },
+ 10,
+ 60);
+ }
+ for (ItemStack aCone : aPinecones) {
+ addRecipe(aCone, ItemUtils.getSimpleStack(aCrushedPine, 1), new int[] { 7500, 7500, 5000, 2500 }, 10, 60);
+ }
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(16), ItemUtils.getSimpleStack(aCrushedPine, 64) },
+ new FluidStack[] { FluidUtils.getSteam(5000), },
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustTinyAsh", 5),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyAsh", 5),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyDarkAsh", 5),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyDarkAsh", 5) },
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 500) },
+ new int[] { 2000, 2000, 2000, 2000 },
+ 20 * 60,
+ 120,
+ 3);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemUtils.getSimpleStack(aCrushedPine, 64) },
+ new FluidStack[] { FluidUtils.getSuperHeatedSteam(5000), },
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustTinyAsh", 5),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyAsh", 5),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyDarkAsh", 5),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyDarkAsh", 5) },
+ new FluidStack[] { FluidUtils.getFluidStack(PineOil, 1500) },
+ new int[] { 3000, 3000, 3000, 3000 },
+ 20 * 45,
+ 120,
+ 4);
+ }
+
+ public boolean addRecipe(ItemStack aInput, ItemStack aOutput1, int[] aChances, int aTime, int aEU) {
+ aOutput1 = GT_OreDictUnificator.get(true, aOutput1);
+ ItemStack aOutputs[] = new ItemStack[4];
+ for (int i = 0; i < aChances.length; i++) {
+ aOutputs[i] = aOutput1;
+ }
+ aOutputs = cleanArray(aOutputs);
+ if ((GT_Utility.isStackInvalid(aInput))
+ || (GT_Utility.isStackInvalid(aOutput1) || (GT_Utility.getContainerItem(aInput, false) != null))) {
+ return false;
+ }
+
+ return CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(14), aInput },
+ new FluidStack[] {},
+ aOutputs,
+ new FluidStack[] {},
+ aChances,
+ aTime * 20,
+ aEU,
+ 3);
+ }
+
+ public static ItemStack[] cleanArray(ItemStack[] input) {
+ int aArraySize = input.length;
+ AutoMap<ItemStack> aCleanedItems = new AutoMap<>();
+ for (ItemStack checkStack : input) {
+ if (ItemUtils.checkForInvalidItems(checkStack)) {
+ aCleanedItems.put(checkStack);
+ }
+ }
+ ItemStack[] aOutput = new ItemStack[aCleanedItems.size()];
+ for (int i = 0; i < aArraySize; i++) {
+ ItemStack aMappedStack = aCleanedItems.get(i);
+ if (aMappedStack != null) {
+ aOutput[i] = aMappedStack;
+ }
+ }
+ return aOutput;
+ }
+
+ private static final HashMap<String, Quad<Pair<Material, Integer>, Pair<Material, Integer>, Pair<Material, Integer>, Pair<Material, Integer>>> aMilledFluidMap = new HashMap<>();
+
+ public static void registerOreDataForMilledType(Fluid aMilledFluid, Materials aOutput1, int aPerc1,
+ Materials aOutput2, int aPerc2, Materials aOutput3, int aPerc3, Materials aOutput4, int aPerc4) {
+ registerOreDataForMilledType(
+ aMilledFluid,
+ MaterialUtils.generateMaterialFromGtENUM(aOutput1),
+ aPerc1,
+ MaterialUtils.generateMaterialFromGtENUM(aOutput2),
+ aPerc2,
+ MaterialUtils.generateMaterialFromGtENUM(aOutput3),
+ aPerc3,
+ MaterialUtils.generateMaterialFromGtENUM(aOutput4),
+ aPerc4);
+ }
+
+ public static void registerOreDataForMilledType(Fluid aMilledFluid, Material aOutput1, int aPerc1,
+ Material aOutput2, int aPerc2, Material aOutput3, int aPerc3, Material aOutput4, int aPerc4) {
+
+ Pair<Material, Integer> aFluidOutput1 = new Pair<>(aOutput1, aPerc1);
+ Pair<Material, Integer> aFluidOutput2 = new Pair<>(aOutput2, aPerc2);
+ Pair<Material, Integer> aFluidOutput3 = new Pair<>(aOutput3, aPerc3);
+ Pair<Material, Integer> aFluidOutput4 = new Pair<>(aOutput4, aPerc4);
+ Quad<Pair<Material, Integer>, Pair<Material, Integer>, Pair<Material, Integer>, Pair<Material, Integer>> aDataQuad = new Quad<>(
+ aFluidOutput1,
+ aFluidOutput2,
+ aFluidOutput3,
+ aFluidOutput4);
+ aMilledFluidMap.put(aMilledFluid.getUnlocalizedName(), aDataQuad);
+ }
+
+ private static ItemStack[] getOutputsFromMap(Fluid aFluid) {
+ String aKey = aFluid.getUnlocalizedName();
+ return getArrayFromQuad(aMilledFluidMap.get(aKey));
+ }
+
+ private static ItemStack[] getArrayFromQuad(
+ Quad<Pair<Material, Integer>, Pair<Material, Integer>, Pair<Material, Integer>, Pair<Material, Integer>> aData) {
+ AutoMap<ItemStack> aOutputs = new AutoMap<>();
+ for (Object aPair : aData.values()) {
+ if (aPair != null && Pair.class.isInstance(aPair)) {
+ Pair aObj = (Pair) aPair;
+ Material aMat = (Material) aObj.getKey();
+ int aCount = (int) aObj.getValue();
+ aOutputs.addAll(getItemStackFromPair(aMat, aCount));
+ }
+ }
+ ItemStack[] aRealOutputArray = new ItemStack[aOutputs.size()];
+ int aIndex = 0;
+ for (ItemStack aStack : aOutputs) {
+ aRealOutputArray[aIndex++] = aStack;
+ }
+ return aRealOutputArray;
+ }
+
+ private static AutoMap<ItemStack> getItemStackFromPair(Material aMat, Integer aCount) {
+ AutoMap<ItemStack> aOutputs = new AutoMap<>();
+ if (aCount > 64) {
+ AutoMap<Integer> sizes = getStackSizes(aCount);
+ for (int aSplitSize : sizes) {
+ ItemStack aDustStack = aMat.getDust(aSplitSize);
+ aOutputs.put(aDustStack);
+ }
+ } else {
+ ItemStack aDustStack = aMat.getDust(aCount);
+ aOutputs.put(aDustStack);
+ }
+ return aOutputs;
+ }
+
+ private static AutoMap<Integer> getStackSizes(int aBigSize) {
+ AutoMap<Integer> aSizes = new AutoMap<>();
+ if (aBigSize <= 64) {
+ aSizes.add(aBigSize);
+ } else {
+ for (int i = aBigSize; i > 0; i -= 64) {
+ aSizes.add(i);
+ }
+ }
+ return aSizes;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/NuclearChem.java b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/NuclearChem.java
new file mode 100644
index 0000000000..d83b5a7cea
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/NuclearChem.java
@@ -0,0 +1,105 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public class NuclearChem extends ItemPackage {
+
+ public static Fluid Burnt_LiFBeF2ThF4UF4;
+ public static Fluid Burnt_LiFBeF2ZrF4UF4;
+ public static Fluid Burnt_LiFBeF2ZrF4U235;
+
+ public static Fluid Impure_LiFBeF2;
+
+ public static Fluid GeneticMutagen;
+ private static boolean generateMutagenRecipe = false;
+
+ @Override
+ public void items() {}
+
+ @Override
+ public void blocks() {}
+
+ @Override
+ public void fluids() {
+ // Create Used Nuclear Fuels
+ Burnt_LiFBeF2ThF4UF4 = FluidUtils.generateFluidNonMolten(
+ "BurntLiFBeF2ThF4UF4",
+ "Burnt LiFBeF2ThF4UF4 Salt",
+ 545,
+ new short[] { 48, 175, 48, 100 },
+ null,
+ null);
+ Burnt_LiFBeF2ZrF4UF4 = FluidUtils.generateFluidNonMolten(
+ "BurntLiFBeF2ZrF4UF4",
+ "Burnt LiFBeF2ZrF4UF4 Salt",
+ 520,
+ new short[] { 48, 168, 68, 100 },
+ null,
+ null);
+ Burnt_LiFBeF2ZrF4U235 = FluidUtils.generateFluidNonMolten(
+ "BurntLiFBeF2ZrF4U235",
+ "Burnt LiFBeF2ZrF4U235 Salt",
+ 533,
+ new short[] { 68, 185, 48, 100 },
+ null,
+ null);
+ Impure_LiFBeF2 = FluidUtils.generateFluidNonMolten(
+ "ImpureLiFBeF2",
+ "Impure Molten Salt Base",
+ 533,
+ new short[] { 110, 75, 186, 100 },
+ null,
+ null);
+ if (FluidUtils.getFluidStack("fluid.Mutagen", 1) == null) {
+ GeneticMutagen = FluidUtils.generateFluidNonMolten(
+ "GeneticMutagen",
+ "Genetic Mutagen",
+ 12,
+ new short[] { 22, 148, 185, 100 },
+ null,
+ null);
+ generateMutagenRecipe = true;
+ } else {
+ GeneticMutagen = FluidUtils.getFluidStack("fluid.Mutagen", 1)
+ .getFluid();
+ }
+ }
+
+ @Override
+ public String errorMessage() {
+ return "Bad Nuclear Chemistry Recipes.";
+ }
+
+ @Override
+ public boolean generateRecipes() {
+ if (generateMutagenRecipe) {
+ chemReactor_CreateMutagen();
+ }
+ return true;
+ }
+
+ private static void chemReactor_CreateMutagen() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherStar, 2),
+ GT_Utility.getIntegratedCircuit(20))
+ .fluidInputs(FluidRegistry.getFluidStack("mobessence", 5000))
+ .fluidOutputs(FluidUtils.getFluidStack(GeneticMutagen, 8000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/RocketFuels.java b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/RocketFuels.java
new file mode 100644
index 0000000000..3fc682e7cc
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/RocketFuels.java
@@ -0,0 +1,562 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.recipe.RecipeMaps.distilleryRecipes;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.recipe.RecipeMaps.vacuumFreezerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.minecraft.ItemPackage;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class RocketFuels extends ItemPackage {
+
+ public static HashSet<String> mValidRocketFuelNames = new HashSet<>();
+ public static HashMap<Integer, Fluid> mValidRocketFuels = new HashMap<>();
+
+ public static Fluid Oil_Heavy;
+ public static Fluid Diesel;
+ public static Fluid Kerosene;
+ public static Fluid RP1;
+ public static Fluid Nitrogen_Tetroxide;
+ public static Fluid Hydrazine;
+ public static Fluid Monomethylhydrazine;
+ public static Fluid Unsymmetrical_Dimethylhydrazine;
+ public static Fluid Nitrous_Oxide;
+ public static Fluid Hydrated_Ammonium_Nitrate_Slurry;
+ public static Fluid Liquid_Oxygen;
+ public static Fluid Liquid_Hydrogen;
+ public static Fluid Formaldehyde;
+
+ // Rocket Fuel Mixes
+ public static Fluid Unsymmetrical_Dimethylhydrazine_Plus_Nitrogen_Tetroxide;
+ public static Fluid RP1_Plus_Liquid_Oxygen;
+ public static Fluid Dense_Hydrazine_Mix;
+ public static Fluid Monomethylhydrazine_Plus_Nitric_Acid;
+
+ public static Item Ammonium_Nitrate_Dust;
+ public static Item Formaldehyde_Catalyst_Dust;
+ public static ItemStack Formaldehyde_Catalyst_Stack;
+
+ public RocketFuels() {
+ super(true);
+ }
+
+ public static void createKerosene() {
+
+ FluidStack fuelA = FluidUtils.getFluidStack("diesel", 3000);
+ FluidStack fuelB = FluidUtils.getFluidStack("fuel", 3000);
+
+ if (fuelA != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(23))
+ .fluidInputs(fuelA)
+ .fluidOutputs(FluidUtils.getFluidStack(Kerosene, 1800))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(distilleryRecipes);
+ }
+ if (fuelA == null && fuelB != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(23))
+ .fluidInputs(fuelB)
+ .fluidOutputs(FluidUtils.getFluidStack(Kerosene, 1800))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(distilleryRecipes);
+ }
+ }
+
+ public static void createRP1() {
+ FluidStack fuelA = FluidUtils.getFluidStack(Kerosene, 1000);
+ if (fuelA != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(23))
+ .fluidInputs(fuelA)
+ .fluidOutputs(FluidUtils.getFluidStack(RP1, 750))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distilleryRecipes);
+ }
+ }
+
+ public static void createNitrogenTetroxide() {
+ // 2HNO3 + Cu = N2O4 + H2O + CuO
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustCopper", 1),
+ ItemUtils.getSimpleStack(GenericChem.mOrangeCatalyst, 0), },
+ new FluidStack[] { FluidUtils.getFluidStack("nitricacid", 2000) },
+ new ItemStack[] { Materials.CupricOxide.getDust(2), },
+ new FluidStack[] { FluidUtils.getFluidStack(Nitrogen_Tetroxide, 1000), },
+ new int[] { 100, 100, 50, 50 },
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(3),
+ 3);
+ }
+
+ public static void createHydrazine() {
+
+ // H2O2 + 2NH3 = N2H4 + 2H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(21) },
+ new FluidStack[] { FluidUtils.getFluidStack("fluid.hydrogenperoxide", 1000),
+ FluidUtils.getFluidStack("ammonia", 2000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Hydrazine, 1000), },
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(2),
+ 1);
+ }
+
+ public static void createMonomethylhydrazine() {
+
+ // C + 2H + N2H4 = CH6N2
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(21), ItemUtils.getItemStackOfAmountFromOreDict("dustCarbon", 1) },
+ new FluidStack[] { FluidUtils.getFluidStack("hydrogen", 2000), FluidUtils.getFluidStack(Hydrazine, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Monomethylhydrazine, 1000), },
+ 20 * 48,
+ 240,
+ 2);
+ }
+
+ private static void createLOH() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("cellHydrogen", 1))
+ .itemOutputs(ItemUtils.getItemStackOfAmountFromOreDict("cellLiquidHydrogen", 1))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+ }
+
+ private static void createHydratedAmmoniumNitrateSlurry() {
+
+ // NH3 + HNO3 = NH4NO3
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(21), },
+ new FluidStack[] { FluidUtils.getFluidStack("ammonia", 4000),
+ FluidUtils.getFluidStack("nitricacid", 4000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Hydrated_Ammonium_Nitrate_Slurry, 5184), },
+ 20 * 60,
+ 120,
+ 1);
+ }
+
+ private static void createAmmoniumNitrateDust() {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(8) },
+ FluidUtils.getFluidStack(Hydrated_Ammonium_Nitrate_Slurry, 8 * 144),
+ FluidUtils.getWater(2000),
+ new ItemStack[] { ItemUtils.getSimpleStack(Ammonium_Nitrate_Dust, 8) },
+ new int[] { 10000 },
+ 90 * 20,
+ 480);
+ }
+
+ private static void createFormaldehyde() {
+
+ // O + CH4O = CH2O + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(21),
+ ItemUtils.getSimpleStack(GenericChem.mFormaldehydeCatalyst, 0), },
+ new FluidStack[] { FluidUtils.getFluidStack("oxygen", 32000),
+ FluidUtils.getFluidStack("methanol", 32000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Formaldehyde, 32000), },
+ 20 * 90,
+ 120,
+ 1);
+ }
+
+ private static void createFormaldehydeCatalyst() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 1L),
+ GT_Utility.getIntegratedCircuit(18))
+ .itemOutputs(ItemUtils.getSimpleStack(Formaldehyde_Catalyst_Dust, 4))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(mixerRecipes);
+ }
+
+ private static void createUnsymmetricalDimethylhydrazine() {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(21),
+ ItemUtils.getSimpleStack(GenericChem.mFormaldehydeCatalyst, 0), },
+ new FluidStack[] { FluidUtils.getFluidStack("fluid.hydrazine", 2000),
+ FluidUtils.getFluidStack(Formaldehyde, 2000), FluidUtils.getFluidStack("hydrogen", 4000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Unsymmetrical_Dimethylhydrazine, 2000),
+ FluidUtils.getWater(2000) },
+ 20 * 60,
+ 120,
+ 3);
+ }
+
+ private static void addRocketFuelsToMap() {
+ HashMap<Integer, GT_Recipe> mRocketFuels = new LinkedHashMap<>();
+ mRocketFuels.put(
+ 0,
+ new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(RP1_Plus_Liquid_Oxygen, 1000) },
+ new FluidStack[] {},
+ 0,
+ 0,
+ 512)); // Fuel Value
+
+ mRocketFuels.put(
+ 1,
+ new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Dense_Hydrazine_Mix, 1000) },
+ new FluidStack[] {},
+ 0,
+ 0,
+ 1024)); // Fuel Value
+
+ mRocketFuels.put(
+ 2,
+ new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Monomethylhydrazine_Plus_Nitric_Acid, 1000) },
+ new FluidStack[] {},
+ 0,
+ 0,
+ 2048)); // Fuel Value
+
+ mRocketFuels.put(
+ 3,
+ new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ new FluidStack[] {
+ FluidUtils.getFluidStack(Unsymmetrical_Dimethylhydrazine_Plus_Nitrogen_Tetroxide, 1000) },
+ new FluidStack[] {},
+ 0,
+ 0,
+ 4196)); // Fuel Value
+
+ // Add in default Diesel for the Buggy
+ mValidRocketFuels.put(-1, Diesel);
+
+ mValidRocketFuelNames.add(FluidRegistry.getFluidName(Diesel));
+ for (int mID : mRocketFuels.keySet()) {
+ GT_Recipe aFuelRecipe = mRocketFuels.get(mID);
+ if (aFuelRecipe != null) {
+ mValidRocketFuelNames.add(FluidRegistry.getFluidName(aFuelRecipe.mFluidInputs[0].getFluid()));
+ mValidRocketFuels.put(mID, aFuelRecipe.mFluidInputs[0].getFluid());
+ GTPPRecipeMaps.rocketFuels.add(aFuelRecipe);
+ }
+ }
+ }
+
+ private static void createRocketFuels() {
+
+ // RP1_Plus_Liquid_Oxygen
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(1), },
+ new FluidStack[] { FluidUtils.getFluidStack(Liquid_Oxygen, 2000), FluidUtils.getFluidStack(RP1, 500), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(RP1_Plus_Liquid_Oxygen, 1500), },
+ 20 * 15,
+ 240,
+ 3);
+
+ // Dense_Hydrazine_Mix
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(2), },
+ new FluidStack[] { FluidUtils.getFluidStack(Hydrazine, 4000), FluidUtils.getFluidStack("methanol", 6000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Dense_Hydrazine_Mix, 10000), },
+ 20 * 30,
+ 240,
+ 4);
+
+ // Monomethylhydrazine_Plus_Nitric_Acid
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(3), },
+ new FluidStack[] { FluidUtils.getFluidStack(Monomethylhydrazine, 2000),
+ FluidUtils.getFluidStack("nitricacid", 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(Monomethylhydrazine_Plus_Nitric_Acid, 2000), },
+ 20 * 45,
+ 480,
+ 5);
+
+ // Unsymmetrical_Dimethylhydrazine_Plus_Nitrogen_Tetroxide
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(4), },
+ new FluidStack[] { FluidUtils.getFluidStack(Unsymmetrical_Dimethylhydrazine, 2000),
+ FluidUtils.getFluidStack(Nitrogen_Tetroxide, 2000), },
+ new ItemStack[] {},
+ new FluidStack[] {
+ FluidUtils.getFluidStack(Unsymmetrical_Dimethylhydrazine_Plus_Nitrogen_Tetroxide, 5000), },
+ 20 * 60,
+ 480,
+ 6);
+ }
+
+ @Override
+ public String errorMessage() {
+ return "Bad Rocket Fuel Science!";
+ }
+
+ @Override
+ public boolean generateRecipes() {
+ createKerosene();
+ createRP1();
+ createNitrogenTetroxide();
+ createHydrazine();
+ createMonomethylhydrazine();
+
+ createLOH();
+
+ createHydratedAmmoniumNitrateSlurry();
+ createAmmoniumNitrateDust();
+ createFormaldehyde();
+ createFormaldehydeCatalyst();
+ createUnsymmetricalDimethylhydrazine();
+
+ createRocketFuels();
+ addRocketFuelsToMap();
+
+ return true;
+ }
+
+ @Override
+ public void items() {
+ Formaldehyde_Catalyst_Dust = ItemUtils.generateSpecialUseDusts(
+ "FormaldehydeCatalyst",
+ "Formaldehyde Catalyst",
+ "Fe16V1",
+ Utils.rgbtoHexValue(25, 5, 25))[0];
+ Formaldehyde_Catalyst_Stack = ItemUtils.getSimpleStack(Formaldehyde_Catalyst_Dust);
+ }
+
+ @Override
+ public void blocks() {}
+
+ @Override
+ public void fluids() {
+
+ // Register default fluids
+ Diesel = MaterialUtils.getMaterial("Fuel", "Diesel")
+ .getFluid(1)
+ .getFluid();
+
+ // 5.08 Compat
+ if (!FluidUtils.doesFluidExist("liquid_heavy_oil")) {
+ Oil_Heavy = FluidUtils
+ .generateFluidNoPrefix("liquid_heavy_oil", "Heavy Oil", 200, new short[] { 10, 10, 10, 100 });
+ } else {
+ Oil_Heavy = MaterialUtils.getMaterial("OilHeavy", "Oil")
+ .getFluid(1)
+ .getFluid();
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellOilHeavy", 1) == null) {
+ new BaseItemComponent("OilHeavy", "Heavy Oil", new short[] { 10, 10, 10 });
+ }
+ }
+
+ // Create Kerosene
+ Kerosene = FluidUtils
+ .generateFluidNonMolten("Kerosene", "Kerosene", 233, new short[] { 150, 40, 150, 100 }, null, null);
+ CoalTar.Coal_Oil = Kerosene;
+
+ // RP! Focket Fuel
+ RP1 = FluidUtils.generateFluidNonMolten("RP1Fuel", "RP-1", 500, new short[] { 210, 50, 50, 100 }, null, null);
+
+ // Create Nitrogen Tetroxide
+ Nitrogen_Tetroxide = FluidUtils.generateFluidNonMolten(
+ "NitrogenTetroxide",
+ "Nitrogen Tetroxide",
+ 261,
+ new short[] { 170, 170, 0, 100 },
+ null,
+ null);
+
+ // Create Hydrazine
+ Hydrazine = FluidUtils
+ .generateFluidNonMolten("Hydrazine", "Hydrazine", 275, new short[] { 250, 250, 250, 100 }, null, null);
+
+ // Create Monomethylhydrazine
+ Monomethylhydrazine = FluidUtils.generateFluidNonMolten(
+ "Monomethylhydrazine",
+ "Monomethylhydrazine",
+ 221,
+ new short[] { 125, 125, 125, 100 },
+ null,
+ null);
+
+ // Create Anthracene
+ Nitrous_Oxide = FluidUtils.generateFluidNonMolten(
+ "NitrousOxide",
+ "Nitrous Oxide",
+ 182,
+ new short[] { 255, 255, 255, 100 },
+ null,
+ null);
+
+ // Nos
+ if (!FluidUtils.doesFluidExist("NitrousOxide")) {
+ Nitrous_Oxide = FluidUtils
+ .generateFluidNoPrefix("NitrousOxide", "Nitrous Oxide", 182, new short[] { 255, 255, 255, 100 });
+ } else {
+ Nitrous_Oxide = FluidUtils.getWildcardFluidStack("NitrousOxide", 1)
+ .getFluid();
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellNitrousOxide", 1) == null) {
+ new BaseItemComponent("NitrousOxide", "Nitrous Oxide", new short[] { 10, 10, 175 });
+ }
+ }
+
+ // Unsymmetrical_Dimethylhydrazine
+ if (FluidUtils.getFluidStack("1,1dimethylhydrazine", 1) == null) {
+ Unsymmetrical_Dimethylhydrazine = FluidUtils.generateFluidNonMolten(
+ "UnsymmetricalDimethylhydrazine",
+ "Unsymmetrical Dimethylhydrazine",
+ 216,
+ new short[] { 70, 210, 20, 100 },
+ null,
+ null);
+ } else {
+ Unsymmetrical_Dimethylhydrazine = FluidUtils.getFluidStack("1,1dimethylhydrazine", 1000)
+ .getFluid();
+ }
+
+ // Create Hydrated_Ammonium_Nitrate_Slurry
+ Hydrated_Ammonium_Nitrate_Slurry = FluidUtils.generateFluidNonMolten(
+ "AmmoniumNitrateSlurry",
+ "Hydrated Ammonium Nitrate Slurry",
+ 450,
+ new short[] { 150, 75, 150, 100 },
+ null,
+ null);
+
+ // Lithium Hydroperoxide - LiOH + H2O2 → LiOOH + 2 H2O
+ Ammonium_Nitrate_Dust = ItemUtils.generateSpecialUseDusts(
+ "AmmoniumNitrate",
+ "Ammonium Nitrate",
+ "N2H4O3",
+ Utils.rgbtoHexValue(150, 75, 150))[0];
+
+ // Create Liquid_Oxygen
+ if (FluidUtils.getFluidStack("LiquidOxygen", 1) == null
+ && FluidUtils.getFluidStack("liquidoxygen", 1) == null) {
+ Liquid_Oxygen = FluidUtils.generateFluidNonMolten(
+ "LiquidOxygen",
+ "Liquid Oxygen",
+ 54,
+ new short[] { 75, 75, 220, 100 },
+ null,
+ null);
+ } else {
+ if (FluidUtils.getFluidStack("LiquidOxygen", 1) != null) {
+ Liquid_Oxygen = FluidUtils.getFluidStack("LiquidOxygen", 1)
+ .getFluid();
+ } else {
+ Liquid_Oxygen = FluidUtils.getFluidStack("liquidoxygen", 1)
+ .getFluid();
+ }
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellLiquidOxygen", 1) == null) {
+ new BaseItemComponent("LiquidOxygen", "Liquid Oxygen", new short[] { 10, 10, 175 });
+ }
+ }
+
+ // Create Liquid_Hydrogen
+ if (FluidUtils.getFluidStack("LiquidHydrogen", 1) == null
+ && FluidUtils.getFluidStack("liquidhydrogen", 1) == null) {
+ Liquid_Hydrogen = FluidUtils.generateFluidNonMolten(
+ "LiquidHydrogen",
+ "Liquid Hydrogen",
+ 14,
+ new short[] { 75, 75, 220, 100 },
+ null,
+ null);
+ } else {
+ if (FluidUtils.getFluidStack("LiquidHydrogen", 1) != null) {
+ Liquid_Hydrogen = FluidUtils.getFluidStack("LiquidHydrogen", 1)
+ .getFluid();
+ } else {
+ Liquid_Hydrogen = FluidUtils.getFluidStack("liquidhydrogen", 1)
+ .getFluid();
+ }
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellLiquidHydrogen", 1) == null) {
+ new BaseItemComponent("LiquidHydrogen", "Liquid Hydrogen", new short[] { 10, 10, 175 });
+ }
+ }
+
+ Formaldehyde = FluidUtils
+ .generateFluidNonMolten("Formaldehyde", "Formaldehyde", 185, new short[] { 150, 75, 150, 100 }, null, null);
+
+ Unsymmetrical_Dimethylhydrazine_Plus_Nitrogen_Tetroxide = FluidUtils.generateFluidNonMolten(
+ "RocketFuelMixA",
+ "H8N4C2O4 Rocket Fuel",
+ 216,
+ new short[] { 50, 220, 50, 100 },
+ null,
+ null);
+ RP1_Plus_Liquid_Oxygen = FluidUtils.generateFluidNonMolten(
+ "RocketFuelMixB",
+ "Rp-1 Rocket Fuel",
+ 250,
+ new short[] { 250, 50, 50, 100 },
+ null,
+ null);
+ Monomethylhydrazine_Plus_Nitric_Acid = FluidUtils.generateFluidNonMolten(
+ "RocketFuelMixC",
+ "CN3H7O3 Rocket Fuel",
+ 221,
+ new short[] { 125, 75, 180, 100 },
+ null,
+ null);
+ Dense_Hydrazine_Mix = FluidUtils.generateFluidNonMolten(
+ "RocketFuelMixD",
+ "Dense Hydrazine Fuel Mixture",
+ 275,
+ new short[] { 175, 80, 120, 100 },
+ null,
+ null);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/StandardBaseParticles.java b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/StandardBaseParticles.java
new file mode 100644
index 0000000000..1604bcb571
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/StandardBaseParticles.java
@@ -0,0 +1,156 @@
+package gtPlusPlus.core.item.chemistry;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.base.misc.BaseItemParticle;
+import gtPlusPlus.core.material.Particle;
+import gtPlusPlus.core.material.Particle.ElementaryGroup;
+import gtPlusPlus.core.util.Utils;
+
+public class StandardBaseParticles extends BaseItemParticle {
+
+ public static HashMap<String, Integer> NameToMetaMap = new HashMap<>();
+ public static HashMap<Integer, String> MetaToNameMap = new HashMap<>();
+
+ public StandardBaseParticles() {
+ super("Base", aTypes.length, EnumRarity.rare);
+ }
+
+ private static final String[] aTypes = new String[] { "Graviton", "Up", "Down", "Charm", "Strange", "Top", "Bottom",
+ "Electron", "Electron Neutrino", "Muon", "Muon Neutrino", "Tau", "Tau Neutrino", "Gluon", "Photon", "Z Boson",
+ "W Boson", "Higgs Boson", "Proton", "Neutron", "Lambda", "Omega", "Pion", "ETA Meson", "Unknown" };
+
+ public IIcon[] icons = new IIcon[aTypes.length];
+
+ static {
+ // Generate Ions
+ int key = 0;
+
+ for (String s : aTypes) {
+ // Map names to Meta
+ NameToMetaMap.put(Utils.sanitizeString(s.toLowerCase()), key);
+ MetaToNameMap.put(key, Utils.sanitizeString(s.toLowerCase()));
+ for (Particle o : Particle.aMap) {
+ int aColour = 0;
+ if (o.mParticleName.toLowerCase()
+ .equals(s.toLowerCase())) {
+ if (o.mParticleType == ElementaryGroup.BARYON) {
+ aColour = Utils.rgbtoHexValue(174, 226, 156);
+ aColourMap.put(key++, aColour);
+ } else if (o.mParticleType == ElementaryGroup.BOSON) {
+ if (o == Particle.HIGGS_BOSON) {
+ aColour = Utils.rgbtoHexValue(226, 196, 104);
+ aColourMap.put(key++, aColour);
+ } else {
+ aColour = Utils.rgbtoHexValue(226, 52, 66);
+ aColourMap.put(key++, aColour);
+ }
+ } else if (o.mParticleType == ElementaryGroup.LEPTON) {
+ aColour = Utils.rgbtoHexValue(126, 226, 95);
+ aColourMap.put(key++, aColour);
+ } else if (o.mParticleType == ElementaryGroup.MESON) {
+ aColour = Utils.rgbtoHexValue(90, 154, 226);
+ aColourMap.put(key++, aColour);
+ } else {
+ aColour = Utils.rgbtoHexValue(188, 61, 226);
+ aColourMap.put(key++, aColour);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public String[] getAffixes() {
+ return new String[] { "", "" };
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return "";
+ }
+
+ @Override
+ public String getUnlocalizedName(final ItemStack itemStack) {
+ return "item.particle.base" + "." + aTypes[itemStack.getItemDamage()];
+ }
+
+ public static Particle getParticle(ItemStack aStack) {
+ AutoMap<Particle> g = Particle.aMap;
+ for (Particle p : g) {
+ String aPartName = Utils.sanitizeString(p.mParticleName.toLowerCase());
+ String expectedPart = Utils.sanitizeString(aTypes[aStack.getItemDamage()].toLowerCase());
+ if (aPartName.equals(expectedPart)) {
+ return p;
+ }
+ }
+ return Particle.UNKNOWN;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ // return Utils.rgbtoHexValue(200, 200, 200);
+ return super.getColorFromParentClass(stack, HEX_OxFFFFFF);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ Particle aCharge = getParticle(stack);
+ EnumChatFormatting aColour = EnumChatFormatting.GRAY;
+ String aState = aColour + "Unknown" + EnumChatFormatting.RESET;
+ if (aCharge != null) {
+ String aGroup = aCharge.mParticleType.name()
+ .toLowerCase();
+ if (aGroup.toLowerCase()
+ .contains("quark")) {
+ aColour = EnumChatFormatting.LIGHT_PURPLE;
+ } else if (aGroup.toLowerCase()
+ .contains("lepton")) {
+ aColour = EnumChatFormatting.GREEN;
+ } else if (aCharge == Particle.HIGGS_BOSON) {
+ aColour = EnumChatFormatting.YELLOW;
+ } else if (aGroup.toLowerCase()
+ .contains("boson")) {
+ aColour = EnumChatFormatting.RED;
+ } else if (aGroup.toLowerCase()
+ .contains("baryon")) {
+ aColour = EnumChatFormatting.BLUE;
+ } else if (aGroup.toLowerCase()
+ .contains("meson")) {
+ aColour = EnumChatFormatting.WHITE;
+ } else {
+ aColour = EnumChatFormatting.GRAY;
+ }
+ String aFirstLet = aGroup.substring(0, 1)
+ .toUpperCase();
+ aGroup = aGroup.replaceFirst(aGroup.substring(0, 1), aFirstLet);
+ aState = aColour + aGroup + EnumChatFormatting.RESET;
+ list.add(EnumChatFormatting.GRAY + "Type: " + aState);
+ }
+ super.addInformation(stack, player, list, bool);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ for (int i = 0; i < this.icons.length; i++) {
+ this.icons[i] = reg.registerIcon(GTPlusPlus.ID + ":" + "particle/new/" + i);
+ }
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[meta];
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/general/ItemGenericChemBase.java b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/general/ItemGenericChemBase.java
new file mode 100644
index 0000000000..8ef674ac19
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/chemistry/general/ItemGenericChemBase.java
@@ -0,0 +1,321 @@
+package gtPlusPlus.core.item.chemistry.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class ItemGenericChemBase extends Item {
+
+ protected final IIcon base[];
+
+ private final int aMetaSize = 34;
+
+ /*
+ * 0 - Red Metal Catalyst //FeCu 1 - Yellow Metal Catalyst //WNi 2 - Blue Metal Catalyst //CoTi 3 - Orange Metal
+ * Catalyst //Vanadium Pd 4 - Purple Metal Catalyst //IrIdium Ruthenium 5 - Brown Metal Catalyst //NiAl 6 - Pink
+ * Metal Catalyst //PtRh 7 - Alumina Grinding Ball 8 - Soapstone Grinding Ball 9 - Sodium Ethoxide // 2 Sodium + 1
+ * Ethanol | 2 C2H5OH + 2 Na → 2 C2H5ONa + H2 10 - Sodium Ethyl Xanthate //CH3CH2ONa + CS2 → CH3CH2OCS2Na 11 -
+ * Potassium Ethyl Xanthate //CH3CH2OH + CS2 + KOH → CH3CH2OCS2K + H2O 12 - Potassium Hydroxide // KOH 13 -
+ * Formaldehyde Catalyst //Fe16V1 14 - Solid Acid Catalyst //H2SO4 15 - Infinite Mutation Catalyst (for Mutated
+ * Living Solder) 16 - Platinum Group Catalyst (for platline skip) 17 - Plastic Polymer Catalyst (for early plastics
+ * skip) 18 - Rubber Polymer Catalyst (for early rubbers skip) 19 - Adhesion Promoter Catalyst (for glue/solder
+ * skip) 20 - Tita-Tungsten Indium Catalyst (for titanium/tungsten/indium skip) 21 - Radioactivity Catalyst (for
+ * thorium/uranium/plutonium skip) 22 - Rare-Earth Group Catalyst (for monaline skip) 23 - Simple Naquadah Catalyst
+ * (for early naqline skip) 24 - Advanced Naquadah Catalyst (for late naqline skip) 25 - Raw Intelligence Catalyst
+ * (for stem cells skip) 26 - Ultimate Plasticizer Catalyst (for late plastics skip) 27 - Biological Intelligence
+ * Catalyst (for bio cells skip) 28 - Temporal Harmonizer Catalyst (for Eternity processing) 29 - Limpid Water
+ * Catalyst (for early waterline skip) 30 - Flawless Water Catalyst (for advanced waterline skip) 33 - Algagenic
+ * Growth Promoter Catalyst (for seaweed skip)
+ */
+
+ public ItemGenericChemBase() {
+ this.setHasSubtypes(true);
+ this.setNoRepair();
+ this.setMaxStackSize(64);
+ this.setMaxDamage(0);
+ base = new IIcon[aMetaSize];
+ this.setUnlocalizedName("BasicGenericChemItem");
+ GameRegistry.registerItem(this, this.getUnlocalizedName());
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack stack) {
+ if (ItemUtils.isMillingBall(stack)) {
+ return 16;
+ }
+ return super.getItemStackLimit(stack);
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public boolean shouldRotateAroundWhenRendering() {
+ return super.shouldRotateAroundWhenRendering();
+ }
+
+ @Override
+ public void onUpdate(ItemStack p_77663_1_, World p_77663_2_, Entity p_77663_3_, int p_77663_4_,
+ boolean p_77663_5_) {
+ super.onUpdate(p_77663_1_, p_77663_2_, p_77663_3_, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ return super.getItemStackDisplayName(aStack);
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack p_77613_1_) {
+ return EnumRarity.common;
+ }
+
+ @Override
+ public boolean requiresMultipleRenderPasses() {
+ return false;
+ }
+
+ @Override
+ public void getSubItems(Item aItem, CreativeTabs p_150895_2_, List aList) {
+ for (int i = 0; i < aMetaSize; i++) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, i, 1));
+ }
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack p_82789_1_, ItemStack p_82789_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
+ return false;
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public int getItemEnchantability(ItemStack stack) {
+ return 0;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister u) {
+ for (int i = 0; i < this.aMetaSize; i++) {
+ String aPath = GTPlusPlus.ID + ":" + "science/general/MetaItem1/" + i;
+ this.base[i] = u.registerIcon(aPath);
+ }
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ return this.base[damage];
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int damage) {
+ return this.base[damage];
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
+ return this.base[stack.getItemDamage()];
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return this.base[stack.getItemDamage()];
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return super.getUnlocalizedName() + "." + stack.getItemDamage();
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack aStack) {
+ if (ItemUtils.isMillingBall(aStack)) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createMillingBallNBT(aStack);
+ }
+ double currentDamage = getMillingBallDamage(aStack);
+ return currentDamage / getMaxBallDurability(aStack);
+ } else if (ItemUtils.isCatalyst(aStack)) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createCatalystNBT(aStack);
+ }
+ double currentDamage = getCatalystDamage(aStack);
+ return currentDamage / getCatalystMaxDamage(aStack);
+ } else {
+ return 1D;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer player, List list, boolean bool) {
+ boolean aHasSpecialTooltips = false;
+ int aMaxDamage = 0;
+ int aDamageSegment = 0;
+ int aDam = 0;
+ EnumChatFormatting durability = EnumChatFormatting.GRAY;
+ if (ItemUtils.isMillingBall(aStack)) {
+ list.add(EnumChatFormatting.GRAY + "Tumble Tumble Tumble");
+ aMaxDamage = getMillingBallMaxDamage(aStack);
+ aDamageSegment = aMaxDamage / 5;
+ aDam = aMaxDamage - getMillingBallDamage(aStack);
+ aHasSpecialTooltips = true;
+ }
+ if (ItemUtils.isCatalyst(aStack)) {
+ list.add(EnumChatFormatting.GRAY + "Active Reaction Agent");
+ aMaxDamage = getCatalystMaxDamage(aStack);
+ aDamageSegment = aMaxDamage / 5;
+ aDam = aMaxDamage - getCatalystDamage(aStack);
+ aHasSpecialTooltips = true;
+ }
+ if (aHasSpecialTooltips) {
+ if (aDam > aDamageSegment * 3) {
+ durability = EnumChatFormatting.GREEN;
+ } else if (aDam > aDamageSegment * 2) {
+ durability = EnumChatFormatting.YELLOW;
+ } else if (aDam > aDamageSegment) {
+ durability = EnumChatFormatting.GOLD;
+ } else if (aDam >= 0) {
+ durability = EnumChatFormatting.RED;
+ }
+ list.add(durability + "" + (aDam) + EnumChatFormatting.GRAY + " / " + aMaxDamage);
+ }
+ super.addInformation(aStack, player, list, bool);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack aStack) {
+ if (ItemUtils.isMillingBall(aStack)) {
+ int aDam = getMillingBallDamage(aStack);
+ if (aDam > 0) {
+ return true;
+ }
+ } else if (ItemUtils.isCatalyst(aStack)) {
+ int aDam = getCatalystDamage(aStack);
+ if (aDam > 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static boolean createMillingBallNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Damage", 0);
+ tagNBT.setLong("MaxDamage", getMaxBallDurability(rStack));
+ tagMain.setTag("MillingBall", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static int getMillingBallDamage(ItemStack aStack) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createMillingBallNBT(aStack);
+ }
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ return aNBT.getCompoundTag("MillingBall")
+ .getInteger("Damage");
+ }
+
+ public static int getMillingBallMaxDamage(ItemStack aStack) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createMillingBallNBT(aStack);
+ }
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ return aNBT.getCompoundTag("MillingBall")
+ .getInteger("MaxDamage");
+ }
+
+ public static void setMillingBallDamage(ItemStack aStack, int aAmount) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ aNBT = aNBT.getCompoundTag("MillingBall");
+ aNBT.setInteger("Damage", aAmount);
+ }
+
+ public static int getMaxBallDurability(ItemStack aStack) {
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mMillingBallAlumina, true)) {
+ return 100;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mMillingBallSoapstone, true)) {
+ return 50;
+ }
+ return 0;
+ }
+
+ public static boolean createCatalystNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Damage", 0);
+ tagNBT.setLong("MaxDamage", getMaxCatalystDurability(rStack));
+ tagMain.setTag("catalyst", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static int getCatalystDamage(ItemStack aStack) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createCatalystNBT(aStack);
+ }
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ return aNBT.getCompoundTag("catalyst")
+ .getInteger("Damage");
+ }
+
+ public static int getCatalystMaxDamage(ItemStack aStack) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createCatalystNBT(aStack);
+ }
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ return aNBT.getCompoundTag("catalyst")
+ .getInteger("MaxDamage");
+ }
+
+ public static void setCatalystDamage(ItemStack aStack, int aAmount) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ aNBT = aNBT.getCompoundTag("catalyst");
+ aNBT.setInteger("Damage", aAmount);
+ }
+
+ public static int getMaxCatalystDurability(ItemStack aStack) {
+ return 50;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/circuit/GTPP_IntegratedCircuit_Item.java b/gtpp/src/main/java/gtPlusPlus/core/item/circuit/GTPP_IntegratedCircuit_Item.java
new file mode 100644
index 0000000000..11bbac53a3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/circuit/GTPP_IntegratedCircuit_Item.java
@@ -0,0 +1,213 @@
+package gtPlusPlus.core.item.circuit;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.function.Predicate;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.FakePlayer;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.gtnewhorizons.modularui.api.UIInfos;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.INetworkUpdatableItem;
+import gregtech.api.net.GT_Packet_UpdateItem;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.gui.modularui.uifactory.SelectItemUIFactory;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class GTPP_IntegratedCircuit_Item extends Item implements INetworkUpdatableItem {
+
+ private final List<ItemStack> ALL_VARIANTS = new ArrayList<>();
+
+ private final String iconLocation;
+ protected final IIcon[] iconDamage = new IIcon[25];
+
+ public GTPP_IntegratedCircuit_Item(String unlocalizedName, String iconLocation) {
+ this.setHasSubtypes(true);
+ this.setNoRepair();
+ this.setMaxStackSize(64);
+ this.setMaxDamage(0);
+ this.setUnlocalizedName(unlocalizedName);
+ this.iconLocation = iconLocation;
+ GameRegistry.registerItem(this, this.getUnlocalizedName());
+ ALL_VARIANTS.add(new ItemStack(this, 0, 0));
+ for (int i = 1; i <= 24; i++) {
+ ItemStack aStack = new ItemStack(this, 0, i);
+ ALL_VARIANTS.add(aStack);
+ }
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer p_77624_2_, List aList, boolean p_77624_4_) {
+ try {
+ aList.add("Configuration == " + aStack.getItemDamage());
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ new StringBuilder().append(getUnlocalizedName())
+ .append(".tooltip.0")
+ .toString(),
+ "Right click to reconfigure"));
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ new StringBuilder().append(getUnlocalizedName())
+ .append(".tooltip.1")
+ .toString(),
+ "Needs a screwdriver or circuit programming tool"));
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ super.addInformation(aStack, p_77624_2_, aList, p_77624_4_);
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack p_77613_1_) {
+ return EnumRarity.common;
+ }
+
+ @Override
+ public void getSubItems(Item aItem, CreativeTabs p_150895_2_, List aList) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, 0, 1));
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
+ return false;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister u) {
+ for (int i = 0; i < iconDamage.length; i++) {
+ this.iconDamage[i] = u.registerIcon(GTPlusPlus.ID + ":" + iconLocation + "/" + i);
+ }
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.iconDamage[MathUtils.balance(meta, 0, 24)];
+ }
+
+ @Override
+ public boolean receive(ItemStack stack, EntityPlayerMP player, NBTTagCompound tag) {
+ int meta = tag.hasKey("meta", Constants.NBT.TAG_BYTE) ? tag.getByte("meta") : -1;
+ if (meta < 0 || meta > 24) return true;
+
+ if (!player.capabilities.isCreativeMode) {
+ Pair<Integer, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> toolIndex = findConfiguratorInInv(player);
+ if (toolIndex == null) return true;
+
+ ItemStack[] mainInventory = player.inventory.mainInventory;
+ mainInventory[toolIndex.getKey()] = toolIndex.getValue()
+ .apply(mainInventory[toolIndex.getKey()], player);
+ }
+ stack.setItemDamage(meta);
+
+ return true;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
+ // nothing on server side or fake player
+ if (player instanceof FakePlayer || !world.isRemote) return stack;
+ // check if any screwdriver
+ ItemStack configuratorStack;
+ if (player.capabilities.isCreativeMode) {
+ configuratorStack = null;
+ } else {
+ Pair<Integer, ?> configurator = findConfiguratorInInv(player);
+ if (configurator == null) {
+ int count;
+ try {
+ count = Integer
+ .parseInt(StatCollector.translateToLocal("GT5U.item.programmed_circuit.no_screwdriver.count"));
+ } catch (NumberFormatException e) {
+ player.addChatComponentMessage(
+ new ChatComponentText(
+ "Error in translation GT5U.item.programmed_circuit.no_screwdriver.count: "
+ + e.getMessage()));
+ count = 1;
+ }
+ player.addChatComponentMessage(
+ new ChatComponentTranslation(
+ "GT5U.item.programmed_circuit.no_screwdriver." + XSTR.XSTR_INSTANCE.nextInt(count)));
+ return stack;
+ }
+ configuratorStack = player.inventory.mainInventory[configurator.getKey()];
+ }
+ openSelectorGui(configuratorStack, stack.getItemDamage(), player);
+ return stack;
+ }
+
+ private void openSelectorGui(ItemStack configurator, int meta, EntityPlayer player) {
+ UIInfos.openClientUI(
+ player,
+ buildContext -> new SelectItemUIFactory(
+ StatCollector.translateToLocal("GT5U.item.programmed_circuit.select.header"),
+ configurator,
+ GTPP_IntegratedCircuit_Item::onConfigured,
+ ALL_VARIANTS,
+ meta,
+ true).createWindow(buildContext));
+ }
+
+ private static void onConfigured(ItemStack stack) {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setByte("meta", (byte) stack.getItemDamage());
+ GT_Values.NW.sendToServer(new GT_Packet_UpdateItem(tag));
+ }
+
+ private static Pair<Integer, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> findConfiguratorInInv(
+ EntityPlayer player) {
+ ItemStack[] mainInventory = player.inventory.mainInventory;
+ for (int j = 0, mainInventoryLength = mainInventory.length; j < mainInventoryLength; j++) {
+ ItemStack toolStack = mainInventory[j];
+
+ if (!GT_Utility.isStackValid(toolStack)) continue;
+
+ for (Map.Entry<Predicate<ItemStack>, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> p : GregTech_API.sCircuitProgrammerList
+ .entrySet())
+ if (p.getKey()
+ .test(toolStack)) return Pair.of(j, p.getValue());
+ }
+ return null;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/crafting/ItemDummyResearch.java b/gtpp/src/main/java/gtPlusPlus/core/item/crafting/ItemDummyResearch.java
new file mode 100644
index 0000000000..51bff6f12b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/crafting/ItemDummyResearch.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.core.item.crafting;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.general.ItemGenericToken;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class ItemDummyResearch extends ItemGenericToken {
+
+ public static enum ASSEMBLY_LINE_RESEARCH {
+
+ RESEARCH_1_CONTAINMENT("Containment Fields", "Advanced scientific study"),
+ RESEARCH_2_BASIC_CHEM("Basic Chemistry", "Time to start at the beginning"),
+ RESEARCH_3_ADV_CHEM("Advanced Chemistry", "Best learn more than chemical equations"),
+ RESEARCH_4_BASIC_PHYSICS("Basic Physics", "Fundamental laws of motion"),
+ RESEARCH_5_ADV_PHYSICS("Advanced Physics", "Advanced knowledge!"),
+ RESEARCH_6_BASIC_METALLURGY("Basic Metallurgy", "Information about material smelting"),
+ RESEARCH_7_ADV_METALLURGY("Advanced Metallurgy", "Advanced Material Sciences!"),
+ RESEARCH_8_TURBINE_AUTOMATION("Turbine Automation", "You really don't want to share this with anyone!"),
+ RESEARCH_9_CLOAKING("Cloaking Technologies", "Sneaking around like a mouse"),
+ RESEARCH_10_SPARGING("Gas Sparging", "Blowing gas for results"),
+ RESEARCH_11_MOLECULAR_TRANSFORMER("Molecular Transformation", "Turning things into something better");
+
+ private final String mName;
+ private final String mDesc;
+
+ private ASSEMBLY_LINE_RESEARCH(String aName, String aDesc) {
+ mName = aName;
+ mDesc = aDesc;
+ ModItems.itemDummyResearch.register(mName, mDesc);
+ }
+ }
+
+ private static Map<String, Integer> mInternalNameToIdMap = new LinkedHashMap<>();
+
+ public static ItemStack getResearchStack(ASSEMBLY_LINE_RESEARCH aResearchName, int aStacksize) {
+ Integer aMeta = mInternalNameToIdMap.get(Utils.sanitizeString(aResearchName.mName));
+ if (aMeta == null) {
+ aMeta = 0;
+ }
+ return ItemUtils.simpleMetaStack(ModItems.itemDummyResearch, aMeta, aStacksize);
+ }
+
+ private int aID = 0;
+
+ public ItemDummyResearch() {
+ super("dummyResearch", "Research", new String[] { "This object requires some further study" }, "research");
+ }
+
+ /**
+ *
+ * @param aResearchType - What is the research for?
+ * @param aDescriptThe - tooltip for this research
+ * @return - Did we register a custom research item?
+ */
+ public boolean register(String aResearchType, String aDescript) {
+ int aNewID = aID++;
+ mInternalNameToIdMap.put(Utils.sanitizeString(aResearchType), aNewID);
+ return register(aNewID, "Research on " + aResearchType, 1, aDescript);
+ }
+
+ @Override
+ public boolean register(int id, String aLocalName, int aMaxStack, String aDescript) {
+ return register(
+ id,
+ aLocalName,
+ 1,
+ new String[] { aDescript, EnumChatFormatting.DARK_GRAY + "Used to further your knowledge" },
+ EnumRarity.common,
+ EnumChatFormatting.LIGHT_PURPLE);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void registerIcons(final IIconRegister aIconRegister) {
+ for (int i = 0, j = mLocalNames.size(); i < j; i++) {
+ mIcons.put(i, aIconRegister.registerIcon(GTPlusPlus.ID + ":" + "research" + "/" + "note"));
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/food/BaseItemMetaFood.java b/gtpp/src/main/java/gtPlusPlus/core/item/food/BaseItemMetaFood.java
new file mode 100644
index 0000000000..a307eb48ac
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/food/BaseItemMetaFood.java
@@ -0,0 +1,509 @@
+package gtPlusPlus.core.item.food;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemFood;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class BaseItemMetaFood extends ItemFood {
+
+ private static final HashMap<Integer, IIcon> mIconMap = new HashMap<>();
+ private static int mTotalMetaItems = 0;
+
+ /*
+ * 0 - Raw Human Meat 1 - Cooked Human Meat 2 - Raw Horse Meat 3 - Cooked Horse Meat 4 - Raw Wolf Meat 5 - Cooked
+ * Wolf Meat 6 - Raw Ocelot Meat 7 - Cooked Ocelot Meat 8 - Blaze Flesh
+ */
+
+ // listAllmeatraw
+ // listAllmeatcooked
+
+ public static void registerMetaFoods() {
+ registerNewMetaFood(
+ 0,
+ "I wouldn't eat this unless I was starving",
+ 2,
+ 0,
+ 64,
+ getPotionEffectPackage(new EffectWeaknessModerate(80), new EffectSlownessModerate(80)),
+ getOreDictNamesAsArrayList("listAllmeatraw"));
+ registerNewMetaFood(
+ 1,
+ "Doesn't look any better cooked",
+ 4,
+ 1,
+ 64,
+ getPotionEffectPackage(new EffectWeaknessBasic(50), new EffectSlownessBasic(50)),
+ getOreDictNamesAsArrayList("listAllmeatcooked"));
+ registerNewMetaFood(
+ 2,
+ "",
+ 2,
+ 0,
+ 64,
+ getPotionEffectPackage(new EffectWeaknessBasic(30), new EffectSlownessBasic(30)),
+ getOreDictNamesAsArrayList("listAllmeatraw"));
+ registerNewMetaFood(3, "", 4, 1, 64, getOreDictNamesAsArrayList("listAllmeatcooked"));
+ registerNewMetaFood(
+ 4,
+ "",
+ 2,
+ 0,
+ 64,
+ getPotionEffectPackage(new EffectWeaknessBasic(25), new EffectSlownessBasic(30)),
+ getOreDictNamesAsArrayList("listAllmeatraw"));
+ registerNewMetaFood(5, "", 4, 1, 64, getOreDictNamesAsArrayList("listAllmeatcooked"));
+ registerNewMetaFood(
+ 6,
+ "",
+ 2,
+ 0,
+ 64,
+ getPotionEffectPackage(new EffectWeaknessBasic(30), new EffectSlownessBasic(25)),
+ getOreDictNamesAsArrayList("listAllmeatraw"));
+ registerNewMetaFood(7, "", 4, 1, 64, getOreDictNamesAsArrayList("listAllmeatcooked"));
+ registerNewMetaFood(
+ 8,
+ "Warm to the touch",
+ EnumRarity.uncommon,
+ 4,
+ 1,
+ 64,
+ new AutoMap<>(),
+ new setOnFire(),
+ getOreDictNamesAsArrayList("listAllmeatcooked"));
+ }
+
+ private static final HashMap<Integer, Integer> mMaxStackSizeMap = new HashMap<>();
+ private static final HashMap<Integer, String> mTooltipMap = new HashMap<>();
+ private static final HashMap<Integer, EnumRarity> mRarityMap = new HashMap<>();
+ private static final HashMap<Integer, Integer> mHealAmountMap = new HashMap<>();
+ private static final HashMap<Integer, Float> mSaturationAmountMap = new HashMap<>();
+ private static final HashMap<Integer, AutoMap<PotionEffectPackage>> mPotionEffectsMap = new HashMap<>();
+ private static final HashMap<Integer, Boolean> mHasSpecialBehaviourMap = new HashMap<>();
+ private static final HashMap<Integer, SpecialFoodBehaviour> mSpecialBehaviourMap = new HashMap<>();
+ private static final HashMap<Integer, ArrayList<String>> mOreDictNames = new HashMap<>();
+
+ public static void registerNewMetaFood(final int aMetaID, String aTooltip, final int aHealAmount,
+ final float aSaturationModifier, final int aMaxStacksize) {
+ registerNewMetaFood(
+ aMetaID,
+ aTooltip,
+ EnumRarity.common,
+ aHealAmount,
+ aSaturationModifier,
+ aMaxStacksize,
+ new AutoMap<>(),
+ null,
+ new ArrayList<>());
+ }
+
+ public static void registerNewMetaFood(final int aMetaID, String aTooltip, final int aHealAmount,
+ final float aSaturationModifier, final int aMaxStacksize, final ArrayList<String> aOreDictNames) {
+ registerNewMetaFood(
+ aMetaID,
+ aTooltip,
+ EnumRarity.common,
+ aHealAmount,
+ aSaturationModifier,
+ aMaxStacksize,
+ new AutoMap<>(),
+ null,
+ aOreDictNames);
+ }
+
+ public static void registerNewMetaFood(final int aMetaID, String aTooltip, final int aHealAmount,
+ final float aSaturationModifier, final int aMaxStacksize, final AutoMap<PotionEffectPackage> aPotionEffects) {
+ registerNewMetaFood(
+ aMetaID,
+ aTooltip,
+ EnumRarity.common,
+ aHealAmount,
+ aSaturationModifier,
+ aMaxStacksize,
+ new AutoMap<>(),
+ null,
+ new ArrayList<>());
+ }
+
+ public static void registerNewMetaFood(final int aMetaID, String aTooltip, final int aHealAmount,
+ final float aSaturationModifier, final int aMaxStacksize, final AutoMap<PotionEffectPackage> aPotionEffects,
+ final ArrayList<String> aOreDictNames) {
+ registerNewMetaFood(
+ aMetaID,
+ aTooltip,
+ EnumRarity.common,
+ aHealAmount,
+ aSaturationModifier,
+ aMaxStacksize,
+ aPotionEffects,
+ null,
+ aOreDictNames);
+ }
+
+ public static void registerNewMetaFood(final int aMetaID, String aTooltip, EnumRarity aRarity,
+ final int aHealAmount, final float aSaturationModifier, final int aMaxStacksize,
+ final AutoMap<PotionEffectPackage> aPotionEffects, final SpecialFoodBehaviour aSpecialBehaviour) {
+ registerNewMetaFood(
+ aMetaID,
+ aTooltip,
+ EnumRarity.common,
+ aHealAmount,
+ aSaturationModifier,
+ aMaxStacksize,
+ aPotionEffects,
+ null,
+ new ArrayList<>());
+ }
+
+ public static void registerNewMetaFood(final int aMetaID, String aTooltip, EnumRarity aRarity,
+ final int aHealAmount, final float aSaturationModifier, final int aMaxStacksize,
+ final AutoMap<PotionEffectPackage> aPotionEffects, final SpecialFoodBehaviour aSpecialBehaviour,
+ final ArrayList<String> aOreDictNames) {
+ mTotalMetaItems++;
+ mMaxStackSizeMap.put(aMetaID, aMaxStacksize);
+ mTooltipMap.put(aMetaID, aTooltip);
+ mRarityMap.put(aMetaID, aRarity);
+ mHealAmountMap.put(aMetaID, aHealAmount);
+ mSaturationAmountMap.put(aMetaID, aSaturationModifier);
+ mPotionEffectsMap.put(aMetaID, aPotionEffects);
+ mHasSpecialBehaviourMap.put(aMetaID, (aSpecialBehaviour != null));
+ if (aSpecialBehaviour != null) {
+ mSpecialBehaviourMap.put(aMetaID, aSpecialBehaviour);
+ }
+ mOreDictNames.put(aMetaID, aOreDictNames);
+ }
+
+ public static void registerFoodsToOreDict() {
+ for (int aMetaID = 0; aMetaID < mTotalMetaItems; aMetaID++) {
+ ArrayList<String> aOreDictNames = mOreDictNames.get(aMetaID);
+ if (aOreDictNames != null && !aOreDictNames.isEmpty()) {
+ ItemStack aFoodStack = ItemUtils.simpleMetaStack(ModItems.itemMetaFood, aMetaID, 1);
+ for (String aOreName : aOreDictNames) {
+ ItemUtils.addItemToOreDictionary(aFoodStack, aOreName);
+ }
+ }
+ }
+ }
+
+ public BaseItemMetaFood() {
+ super(0, 0, false);
+ this.setHasSubtypes(true);
+ this.setNoRepair();
+ this.setMaxStackSize(64);
+ this.setMaxDamage(0);
+ this.setUnlocalizedName("BasicMetaFood");
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ GameRegistry.registerItem(this, this.getUnlocalizedName());
+ BaseItemMetaFood.registerMetaFoods();
+ }
+
+ private static int getMetaKey(ItemStack aStack) {
+ return aStack.getItemDamage();
+ }
+
+ // Heal Amount
+ @Override
+ public int func_150905_g(ItemStack aStack) {
+ return mHealAmountMap.get(getMetaKey(aStack));
+ }
+
+ // Saturation Amount
+ @Override
+ public float func_150906_h(ItemStack aStack) {
+ return mSaturationAmountMap.get(getMetaKey(aStack));
+ }
+
+ // Whether wolves like this food, sadly doesn't support meta items
+ @Override
+ public boolean isWolfsFavoriteMeat() {
+ return false;
+ }
+
+ @Override
+ protected void onFoodEaten(final ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ // super.onFoodEaten(stack, world, player);
+ AutoMap<PotionEffectPackage> aPotionEffects = mPotionEffectsMap.get(getMetaKey(aStack));
+ if (!aWorld.isRemote && aPotionEffects != null && aPotionEffects.size() > 0) {
+ for (PotionEffectPackage aFoodEffect : aPotionEffects) {
+ if (MathUtils.randInt(0, 100) <= aFoodEffect.getChance() || aFoodEffect.getChance() == 100) {
+ PotionEffect aEffect = aFoodEffect.getEffect();
+ if (aEffect != null && aEffect.getPotionID() > 0) {
+ aPlayer.addPotionEffect(
+ new PotionEffect(
+ aEffect.getPotionID(),
+ aEffect.getDuration() * 20,
+ aEffect.getAmplifier(),
+ aEffect.getIsAmbient()));
+ }
+ }
+ }
+ }
+
+ boolean aHasEpcialBehaviour = mHasSpecialBehaviourMap.get(getMetaKey(aStack));
+ if (!aWorld.isRemote && aHasEpcialBehaviour) {
+ SpecialFoodBehaviour aBehaviour = mSpecialBehaviourMap.get(getMetaKey(aStack));
+ if (aBehaviour != null) {
+ aBehaviour.doBehaviour(aPlayer);
+ }
+ }
+ }
+
+ @Override
+ public ItemStack onEaten(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ return super.onEaten(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack aStack) {
+ return mMaxStackSizeMap.get(getMetaKey(aStack));
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public boolean shouldRotateAroundWhenRendering() {
+ return super.shouldRotateAroundWhenRendering();
+ }
+
+ @Override
+ public void onUpdate(ItemStack p_77663_1_, World p_77663_2_, Entity p_77663_3_, int p_77663_4_,
+ boolean p_77663_5_) {
+ super.onUpdate(p_77663_1_, p_77663_2_, p_77663_3_, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ return super.getItemStackDisplayName(aStack);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer p_77624_2_, List aList, boolean p_77624_4_) {
+ try {
+ String aTooltip = mTooltipMap.get(getMetaKey(aStack));
+ if (aTooltip != null && aTooltip.length() > 0) {
+ aList.add(aTooltip);
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ super.addInformation(aStack, p_77624_2_, aList, p_77624_4_);
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack aStack) {
+ return mRarityMap.get(getMetaKey(aStack));
+ }
+
+ @Override
+ public boolean requiresMultipleRenderPasses() {
+ return false;
+ }
+
+ @Override
+ public void getSubItems(Item aItem, CreativeTabs p_150895_2_, List aList) {
+ for (int i = 0; i < mIconMap.size(); i++) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, i, 1));
+ }
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack p_82789_1_, ItemStack p_82789_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
+ return false;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public int getItemEnchantability(ItemStack stack) {
+ return 0;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister u) {
+ for (int i = 0; i < mTotalMetaItems; i++) {
+ String aPath = GTPlusPlus.ID + ":" + "food/MetaItem1/" + i;
+ mIconMap.put(i, u.registerIcon(aPath));
+ }
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ return mIconMap.get(damage);
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int damage) {
+ return mIconMap.get(damage);
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack aStack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
+ return mIconMap.get(getMetaKey(aStack));
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack aStack, int pass) {
+ return mIconMap.get(getMetaKey(aStack));
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return super.getUnlocalizedName() + "." + stack.getItemDamage();
+ }
+
+ private static class PotionEffectPackage {
+
+ private final PotionEffect mEffect;
+ private final int mChance;
+
+ private PotionEffectPackage(PotionEffect aEffect, int aChance) {
+ mEffect = aEffect;
+ mChance = aChance;
+ }
+
+ public PotionEffect getEffect() {
+ return this.mEffect;
+ }
+
+ public int getChance() {
+ return this.mChance;
+ }
+ }
+
+ private static AutoMap<PotionEffectPackage> getPotionEffectPackage(PotionEffectPackage... aEffects) {
+ AutoMap<PotionEffectPackage> aPackage = new AutoMap<>();
+ if (aEffects != null && aEffects.length > 0) {
+ for (PotionEffectPackage aEffect : aEffects) {
+ aPackage.put(aEffect);
+ }
+ }
+ return aPackage;
+ }
+
+ private static ArrayList<String> getOreDictNamesAsArrayList(String... aOreDictNames) {
+ ArrayList<String> aPackage = new ArrayList<>();
+ if (aOreDictNames != null && aOreDictNames.length > 0) {
+ for (String aEffect : aOreDictNames) {
+ aPackage.add(aEffect);
+ }
+ }
+ return aPackage;
+ }
+
+ private static class EffectWeaknessBasic extends PotionEffectPackage {
+
+ protected EffectWeaknessBasic(int aChance) {
+ super(new PotionEffect(Potion.weakness.getId(), 1, 20), aChance);
+ }
+ }
+
+ private static class EffectWeaknessModerate extends PotionEffectPackage {
+
+ protected EffectWeaknessModerate(int aChance) {
+ super(new PotionEffect(Potion.weakness.getId(), 2, 40), aChance);
+ }
+ }
+
+ private static class EffectWeaknessSevere extends PotionEffectPackage {
+
+ protected EffectWeaknessSevere(int aChance) {
+ super(new PotionEffect(Potion.weakness.getId(), 3, 60), aChance);
+ }
+ }
+
+ private static class EffectSlownessBasic extends PotionEffectPackage {
+
+ protected EffectSlownessBasic(int aChance) {
+ super(new PotionEffect(Potion.moveSlowdown.getId(), 1, 20), aChance);
+ }
+ }
+
+ private static class EffectSlownessModerate extends PotionEffectPackage {
+
+ protected EffectSlownessModerate(int aChance) {
+ super(new PotionEffect(Potion.moveSlowdown.getId(), 2, 40), aChance);
+ }
+ }
+
+ private static class EffectSlownessSevere extends PotionEffectPackage {
+
+ protected EffectSlownessSevere(int aChance) {
+ super(new PotionEffect(Potion.moveSlowdown.getId(), 3, 60), aChance);
+ }
+ }
+
+ private abstract static class SpecialFoodBehaviour {
+
+ protected final int mChance;
+
+ public SpecialFoodBehaviour(int aChance) {
+ mChance = aChance;
+ }
+
+ public final void doBehaviour(EntityPlayer aPlayer) {
+ if (aPlayer != null && !aPlayer.worldObj.isRemote) {
+ if (MathUtils.randInt(0, 100) < mChance || mChance == 100) {
+ behaviour(aPlayer);
+ }
+ }
+ }
+
+ protected abstract void behaviour(EntityPlayer aPlayer);
+ }
+
+ private static class setOnFire extends SpecialFoodBehaviour {
+
+ public setOnFire() {
+ super(100);
+ }
+
+ @Override
+ public void behaviour(EntityPlayer aPlayer) {
+ EntityUtils.setEntityOnFire(aPlayer, 5);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/BufferCore.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/BufferCore.java
new file mode 100644
index 0000000000..69257afb0e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/BufferCore.java
@@ -0,0 +1,68 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.core.item.base.BaseItemWithDamageValue;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public class BufferCore extends BaseItemWithDamageValue {
+
+ public int coreTier = 0;
+
+ public BufferCore(final String unlocalizedName, final int i) {
+ super(unlocalizedName + i);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setMaxStackSize(32);
+ this.coreTier = i;
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack stack) {
+ return super.getItemStackDisplayName(stack) /* +" ["+GT_Values.VN[this.coreTier-1]+"]." */;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add(
+ EnumChatFormatting.GRAY + "A key crafting component for "
+ + GT_Values.VN[this.coreTier - 1]
+ + " Applicances");
+ }
+
+ public final int getCoreTier() {
+ return this.coreTier;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+
+ int[] mTierTypes = new int[] { Utils.rgbtoHexValue(200, 180, 180), Utils.rgbtoHexValue(142, 153, 161),
+ Utils.rgbtoHexValue(230, 121, 75), Utils.rgbtoHexValue(215, 156, 70), Utils.rgbtoHexValue(97, 97, 96), // EV
+ Utils.rgbtoHexValue(202, 202, 201), Utils.rgbtoHexValue(247, 159, 157), Utils.rgbtoHexValue(181, 223, 223),
+ Utils.rgbtoHexValue(187, 219, 185), };
+
+ if (this.coreTier == 10) {
+ return Utils
+ .rgbtoHexValue(MathUtils.randInt(220, 250), MathUtils.randInt(221, 251), MathUtils.randInt(220, 250));
+ }
+
+ return mTierTypes[this.coreTier - 1];
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemAirFilter.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemAirFilter.java
new file mode 100644
index 0000000000..e82e6f1b44
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemAirFilter.java
@@ -0,0 +1,143 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+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.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+public class ItemAirFilter extends Item {
+
+ public IIcon[] icons = new IIcon[1];
+
+ public ItemAirFilter() {
+ super();
+ this.setHasSubtypes(true);
+ String unlocalizedName = "itemAirFilter";
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setMaxStackSize(1);
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ this.icons[0] = reg.registerIcon(GTPlusPlus.ID + ":" + "itemAirFilter");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[0];
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, 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();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+
+ if (tItem == null) {
+ return "Air Filter";
+ }
+
+ String itemName = tItem == null ? "Air Filter" : super.getItemStackDisplayName(tItem);
+ String suffixName = "";
+ if (tItem.getItemDamage() == 0) {
+ suffixName = " [Tier 1]";
+ } else if (tItem.getItemDamage() == 1) {
+ suffixName = " [Tier 2]";
+ }
+ return (itemName + suffixName);
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ int meta = stack.getItemDamage();
+ if (meta == 1) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(150, 180, 35);
+ }
+ return HEX_OxFFFFFF;
+ }
+
+ private static boolean createNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Damage", 0);
+ tagMain.setTag("AirFilter", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static final long getFilterMaxDamage(final ItemStack aStack) {
+ return aStack.getItemDamage() == 0 ? 50 : 2500;
+ }
+
+ public static final long getFilterDamage(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("AirFilter");
+ if (aNBT != null) {
+ return aNBT.getLong("Damage");
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return 0L;
+ }
+
+ public static final boolean setFilterDamage(final ItemStack aStack, final long aDamage) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("AirFilter");
+ if (aNBT != null) {
+ aNBT.setLong("Damage", aDamage);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ if (stack.getTagCompound() == null) {
+ createNBT(stack);
+ }
+ double currentDamage = getFilterDamage(stack);
+ double meta = getFilterMaxDamage(stack);
+ double durabilitypercent = currentDamage / meta;
+ return durabilitypercent;
+ }
+
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ list.add(EnumChatFormatting.GRAY + "An Air filter for Atmospheric Reconditioning.");
+ long maxDamage = getFilterMaxDamage(stack);
+ list.add(EnumChatFormatting.GRAY + "" + (maxDamage - getFilterDamage(stack)) + "/" + maxDamage + " uses left.");
+ super.addInformation(stack, player, list, bool);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemBasicScrubberTurbine.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemBasicScrubberTurbine.java
new file mode 100644
index 0000000000..ee1afdb6bf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemBasicScrubberTurbine.java
@@ -0,0 +1,152 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+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.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+public class ItemBasicScrubberTurbine extends Item {
+
+ public IIcon[] icons = new IIcon[1];
+
+ public ItemBasicScrubberTurbine() {
+ super();
+ this.setHasSubtypes(true);
+ String unlocalizedName = "itemBasicTurbine";
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setMaxStackSize(1);
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ this.icons[0] = reg.registerIcon(GTPlusPlus.ID + ":" + "itemBasicTurbine");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[0];
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < 3; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return this.getUnlocalizedName() + "_" + stack.getItemDamage();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ if (tItem == null) {
+ return "Basic Turbine";
+ }
+ return super.getItemStackDisplayName(tItem);
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ int meta = stack.getItemDamage();
+ if (meta == 0) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(200, 200, 200);
+ }
+ if (meta == 1) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(255, 128, 0);
+ }
+ if (meta == 2) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(128, 128, 128);
+ }
+ return HEX_OxFFFFFF;
+ }
+
+ private static boolean createNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Damage", 0);
+ tagMain.setTag("BasicTurbine", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static final long getFilterDamage(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("BasicTurbine");
+ if (aNBT != null) {
+ return aNBT.getLong("Damage");
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return 0L;
+ }
+
+ public static final boolean setFilterDamage(final ItemStack aStack, final long aDamage) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("BasicTurbine");
+ if (aNBT != null) {
+ aNBT.setLong("Damage", aDamage);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public int getMaxDurability(ItemStack aStack) {
+ if (aStack != null) {
+ int aMeta = aStack.getItemDamage();
+ if (aMeta == 0) {
+ return 2000;
+ }
+ if (aMeta == 1) {
+ return 4000;
+ }
+ if (aMeta == 2) {
+ return 6000;
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ if (stack.getTagCompound() == null) {
+ createNBT(stack);
+ }
+ double currentDamage = getFilterDamage(stack);
+ double meta = getMaxDurability(stack);
+ double durabilitypercent = currentDamage / meta;
+ return durabilitypercent;
+ }
+
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ list.add(EnumChatFormatting.GRAY + "An early tier Turbine for Atmospheric Reconditioning.");
+ int maxDamage = getMaxDurability(stack);
+ list.add(EnumChatFormatting.GRAY + "" + (maxDamage - getFilterDamage(stack)) + "/" + maxDamage + " uses left.");
+ super.addInformation(stack, player, list, bool);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemBlueprint.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemBlueprint.java
new file mode 100644
index 0000000000..c6e0743268
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemBlueprint.java
@@ -0,0 +1,297 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.interfaces.IItemBlueprint;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class ItemBlueprint extends Item implements IItemBlueprint {
+
+ public ItemBlueprint(final String unlocalizedName) {
+ this.setUnlocalizedName(unlocalizedName);
+ this.setTextureName(GTPlusPlus.ID + ":" + unlocalizedName);
+ this.setMaxStackSize(1);
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ // this.bpID = MathUtils.randInt(0, 1000);
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack itemStack, final EntityPlayer aPlayer, final List list,
+ final boolean bool) {
+ // Create some NBT if it's not there, otherwise this does nothing.
+ if (!itemStack.hasTagCompound()) {
+ this.createNBT(itemStack);
+ }
+ // Set up some default variables.
+ int id = -1;
+ String name = "";
+ boolean blueprint = false;
+ // Get proper display vars from NBT if it's there
+ if (itemStack.hasTagCompound()) {
+ // Utils.LOG_WARNING("Found TagCompound");
+ id = (int) this.getNBT(itemStack, "mID");
+ name = (String) this.getNBT(itemStack, "mName");
+ blueprint = (boolean) this.getNBT(itemStack, "mBlueprint");
+ }
+ // Write to tooltip list for each viable setting.
+ if (itemStack.hasTagCompound()) {
+ if (id != -1) {
+ list.add(
+ EnumChatFormatting.GRAY + StatCollector
+ .translateToLocalFormatted(StatCollector.translateToLocal("item.itemBlueprint.tooltip.0"), id));
+ }
+ if (blueprint) {
+ list.add(
+ EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted(
+ StatCollector.translateToLocal("item.itemBlueprint.tooltip.1"),
+ name));
+ } else {
+ list.add(EnumChatFormatting.RED + StatCollector.translateToLocal("item.itemBlueprint.tooltip.2"));
+ }
+ } else {
+ list.add(EnumChatFormatting.RED + StatCollector.translateToLocal("item.itemBlueprint.tooltip.2"));
+ }
+ super.addInformation(itemStack, aPlayer, list, bool);
+ }
+
+ @Override
+ public void onCreated(final ItemStack itemStack, final World world, final EntityPlayer player) {
+ this.createNBT(itemStack);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack itemStack, final World par2World, final Entity par3Entity, final int par4,
+ final boolean par5) {}
+
+ @Override
+ public ItemStack onItemRightClick(final ItemStack itemStack, final World world, final EntityPlayer par3Entity) {
+ // Let the player know what blueprint is held
+ if (itemStack.hasTagCompound()) {
+ PlayerUtils.messagePlayer(
+ par3Entity,
+ "This Blueprint holds NBT data. " + "|"
+ + this.getNBT(itemStack, "mID")
+ + "|"
+ + this.getNBT(itemStack, "mBlueprint")
+ + "|"
+ + this.getNBT(itemStack, "mName")
+ + "|"
+ + ItemUtils.getArrayStackNames(this.readItemsFromNBT(itemStack)));
+ } else {
+ this.createNBT(itemStack);
+ PlayerUtils.messagePlayer(par3Entity, "This is a placeholder. " + this.getNBT(itemStack, "mID"));
+ }
+
+ return super.onItemRightClick(itemStack, world, par3Entity);
+ }
+
+ public ItemStack[] readItemsFromNBT(final ItemStack itemStack) {
+ ItemStack[] blueprint = new ItemStack[9];
+ if (itemStack.hasTagCompound()) {
+ final NBTTagCompound nbt = itemStack.getTagCompound();
+ final NBTTagList list = nbt.getTagList("Inventory", 10);
+ blueprint = new ItemStack[INV_SIZE];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < INV_SIZE)) {
+ blueprint[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ return blueprint;
+ }
+ return null;
+ }
+
+ public ItemStack writeItemsToNBT(final ItemStack itemStack, final ItemStack[] craftingGrid) {
+ final ItemStack[] blueprint = craftingGrid;
+ if (itemStack.hasTagCompound()) {
+ final NBTTagCompound nbt = itemStack.getTagCompound();
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < INV_SIZE; i++) {
+ final ItemStack stack = blueprint[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ nbt.setTag("Inventory", list);
+ itemStack.setTagCompound(nbt);
+ return itemStack;
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isBlueprint(final ItemStack stack) {
+ return true;
+ }
+
+ @Override
+ public boolean setBlueprint(final ItemStack stack, final IInventory craftingTable, final ItemStack output) {
+ boolean hasBP = false;
+ ItemStack[] blueprint = new ItemStack[9];
+
+ if (stack.hasTagCompound()) {
+ hasBP = (boolean) this.getNBT(stack, "mBlueprint");
+ blueprint = this.readItemsFromNBT(stack);
+ }
+
+ if (!hasBP) {
+ try {
+ for (int o = 0; o < craftingTable.getSizeInventory(); o++) {
+ blueprint[o] = craftingTable.getStackInSlot(o);
+ if (blueprint[0] != null) {
+ blueprint[0].stackSize = 0;
+ }
+ }
+ this.writeItemsToNBT(stack, blueprint);
+ if (stack.hasTagCompound()) {
+ if (stack.getTagCompound()
+ .getCompoundTag("Items") != null) {
+ stack.stackTagCompound.setBoolean("mBlueprint", true);
+ } else {
+ // Invalid BP saved?
+ }
+ hasBP = (boolean) this.getNBT(stack, "mBlueprint");
+ }
+
+ if (output != null) {
+ this.setBlueprintName(stack, output.getDisplayName());
+ hasBP = true;
+ return true;
+ }
+ return false;
+ } catch (final Throwable t) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void setBlueprintName(final ItemStack stack, final String name) {
+ stack.stackTagCompound.setString("mName", name);
+ }
+
+ @Override
+ public boolean hasBlueprint(final ItemStack stack) {
+ if (stack.hasTagCompound()) {
+ return (boolean) this.getNBT(stack, "mBlueprint");
+ }
+ return false;
+ }
+
+ @Override
+ public ItemStack[] getBlueprint(final ItemStack stack) {
+ ItemStack[] blueprint = new ItemStack[9];
+ if (stack.hasTagCompound()) {
+ blueprint = this.readItemsFromNBT(stack);
+ }
+ try {
+ final ItemStack[] returnStack = new ItemStack[9];
+ for (int o = 0; o < blueprint.length; o++) {
+ returnStack[o] = blueprint[o];
+ if (returnStack[0] != null) {
+ returnStack[0].stackSize = 1;
+ }
+ }
+ return returnStack;
+ } catch (final Throwable t) {
+ return null;
+ }
+ }
+
+ public boolean createNBT(final ItemStack itemStack) {
+ if (itemStack.hasTagCompound()) {
+ if (!itemStack.stackTagCompound.getBoolean("mBlueprint") && !itemStack.stackTagCompound.getString("mName")
+ .equals("")) {
+ // No Blueprint and no name Set
+ Logger.WARNING("No Blueprint and no name Set");
+ return false;
+ } else if (itemStack.stackTagCompound.getBoolean("mBlueprint")
+ && !itemStack.stackTagCompound.getString("mName")
+ .equals("")) {
+ // Has Blueprint but invalid name set
+ Logger.WARNING("Has Blueprint but invalid name set");
+ return false;
+ } else
+ if (!itemStack.stackTagCompound.getBoolean("mBlueprint")
+ && itemStack.stackTagCompound.getString("mName")
+ .equals("")) {
+ // Has no Blueprint, but strangely has a name
+ Logger.WARNING("Has no Blueprint, but strangely has a name");
+ return false;
+ }
+ return false;
+ } else if (!itemStack.hasTagCompound()) {
+ final int bpID = MathUtils.randInt(0, 1000);
+ final boolean hasRecipe = false;
+ final String recipeName = "";
+ Logger.WARNING("Creating Blueprint, setting up it's NBT data. " + bpID);
+ itemStack.stackTagCompound = new NBTTagCompound();
+ itemStack.stackTagCompound.setInteger("mID", bpID);
+ itemStack.stackTagCompound.setBoolean("mBlueprint", hasRecipe);
+ itemStack.stackTagCompound.setString("mName", recipeName);
+ return true;
+ } else {
+ final int bpID = MathUtils.randInt(0, 1000);
+ final boolean hasRecipe = false;
+ final String recipeName = "";
+ Logger.WARNING("Creating a Blueprint, setting up it's NBT data. " + bpID);
+ itemStack.stackTagCompound = new NBTTagCompound();
+ itemStack.stackTagCompound.setInteger("mID", bpID);
+ itemStack.stackTagCompound.setBoolean("mBlueprint", hasRecipe);
+ itemStack.stackTagCompound.setString("mName", recipeName);
+ return true;
+ }
+ }
+
+ public Object getNBT(final ItemStack itemStack, final String tagNBT) {
+ if (!itemStack.hasTagCompound()) {
+ return null;
+ }
+ Object o = null;
+ switch (tagNBT) {
+ case "mID":
+ o = itemStack.stackTagCompound.getInteger(tagNBT);
+ break;
+ case "mBlueprint":
+ o = itemStack.stackTagCompound.getBoolean(tagNBT);
+ break;
+ case "mName":
+ o = itemStack.stackTagCompound.getString(tagNBT);
+ break;
+ case "":
+ // For More Tag Support
+ // o = itemStack.stackTagCompound.getInteger(tagNBT);
+ break;
+ }
+ if (o != null) {
+ return o;
+ }
+ return null;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemCloakingDevice.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemCloakingDevice.java
new file mode 100644
index 0000000000..9e5cf0a69d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemCloakingDevice.java
@@ -0,0 +1,232 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.Names;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import baubles.api.BaubleType;
+import baubles.api.IBauble;
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+import ic2.api.item.IElectricItemManager;
+
+@Optional.InterfaceList(
+ value = { @Optional.Interface(iface = "baubles.api.IBauble", modid = Names.BAUBLES),
+ @Optional.Interface(iface = "baubles.api.BaubleType", modid = Names.BAUBLES) })
+public class ItemCloakingDevice extends Item implements IElectricItem, IElectricItemManager, IBauble {
+
+ private final String unlocalizedName = "personalCloakingDevice";
+ private final ItemStack thisStack;
+ private static final int maxValueEU = 10000 * 20 * 500;
+ protected double chargeEU = 0;
+
+ public ItemCloakingDevice(final double charge) {
+ this.chargeEU = charge;
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ this.setUnlocalizedName(this.unlocalizedName);
+ this.setMaxStackSize(1);
+ this.setTextureName(GTPlusPlus.ID + ":" + "personalCloakingDevice");
+ this.thisStack = ItemUtils.getSimpleStack(this);
+ this.charge(this.thisStack, charge, 3, true, false);
+ if (charge == (10000 * 20 * 500)) {
+ this.setDamage(this.thisStack, 13);
+ }
+ GameRegistry.registerItem(this, this.unlocalizedName + "-" + charge);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack itemStack, final World worldObj, final Entity player, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (worldObj.isRemote) {
+ return;
+ }
+
+ if (player instanceof EntityPlayer) {
+ for (final ItemStack is : ((EntityPlayer) player).inventory.mainInventory) {
+ if (is == itemStack) {
+ continue;
+ }
+ if (is != null) {
+ if (is.getItem() instanceof final IElectricItem electricItem) {
+ this.chargeEU = ElectricItem.manager.getCharge(is);
+ }
+ }
+ }
+ }
+
+ super.onUpdate(itemStack, worldObj, player, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public boolean canProvideEnergy(final ItemStack itemStack) {
+ return true;
+ }
+
+ @Override
+ public Item getChargedItem(final ItemStack itemStack) {
+ final ItemStack x = itemStack.copy();
+ x.setItemDamage(maxValueEU);
+ return x.getItem();
+ }
+
+ @Override
+ public Item getEmptyItem(final ItemStack itemStack) {
+ final ItemStack x = itemStack.copy();
+ x.setItemDamage(0);
+ return x.getItem();
+ }
+
+ @Override
+ public double getMaxCharge(final ItemStack itemStack) {
+ return maxValueEU;
+ }
+
+ @Override
+ public int getTier(final ItemStack itemStack) {
+ return 5;
+ }
+
+ @Override
+ public double getTransferLimit(final ItemStack itemStack) {
+ return 8196;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(final ItemStack stack) {
+ // return 1.0D - getEnergyStored(stack) / this.capacity;
+ return 1.0D - (this.getCharge(stack) / this.getMaxCharge(stack));
+ }
+
+ @Override
+ public boolean showDurabilityBar(final ItemStack stack) {
+ return true;
+ }
+
+ public int secondsLeft(final ItemStack stack) {
+ double r;
+ r = this.getCharge(stack) / (10000 * 20);
+ return (int) MathUtils.decimalRounding(r);
+ }
+
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add("");
+ list.add(StatCollector.translateToLocal("item.personalCloakingDevice.tooltip.0"));
+ list.add(StatCollector.translateToLocal("item.personalCloakingDevice.tooltip.1"));
+ list.add("");
+ list.add(StatCollector.translateToLocal("item.personalCloakingDevice.tooltip.2"));
+ list.add(
+ StatCollector.translateToLocalFormatted(
+ "item.personalCloakingDevice.tooltip.3",
+ GT_Utility.formatNumbers(this.getTier(this.thisStack)),
+ GT_Utility.formatNumbers(this.getTransferLimit(this.thisStack))));
+ list.add(
+ StatCollector.translateToLocalFormatted(
+ "item.personalCloakingDevice.tooltip.4",
+ GT_Utility.formatNumbers(this.getCharge(stack)),
+ MathUtils.findPercentage(this.getCharge(stack), this.getMaxCharge(stack))));
+ list.add(
+ StatCollector.translateToLocalFormatted(
+ "item.personalCloakingDevice.tooltip.5",
+ GT_Utility.formatNumbers(this.secondsLeft(stack))));
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public double charge(final ItemStack stack, final double amount, final int tier, final boolean ignoreTransferLimit,
+ final boolean simulate) {
+
+ if (!simulate) {
+ ElectricItem.manager.charge(stack, amount, tier, true, simulate);
+ }
+ return ElectricItem.manager.charge(stack, amount, tier, true, simulate);
+ }
+
+ @Override
+ public double discharge(final ItemStack stack, final double amount, final int tier,
+ final boolean ignoreTransferLimit, final boolean externally, final boolean simulate) {
+ if (!simulate) {
+ ElectricItem.manager.discharge(stack, amount, tier, ignoreTransferLimit, externally, simulate);
+ }
+
+ return ElectricItem.manager.discharge(stack, amount, tier, ignoreTransferLimit, externally, simulate);
+ }
+
+ @Override
+ public double getCharge(final ItemStack stack) {
+ return ElectricItem.manager.getCharge(stack);
+ }
+
+ @Override
+ public boolean canUse(final ItemStack stack, final double amount) {
+ return ElectricItem.manager.canUse(stack, amount);
+ }
+
+ @Override
+ public boolean use(final ItemStack stack, final double amount, final EntityLivingBase entity) {
+ return ElectricItem.manager.use(stack, amount, entity);
+ }
+
+ @Override
+ public void chargeFromArmor(final ItemStack stack, final EntityLivingBase entity) {
+ ElectricItem.manager.chargeFromArmor(stack, entity);
+ }
+
+ @Override
+ public String getToolTip(final ItemStack stack) {
+ return ElectricItem.manager.getToolTip(stack);
+ }
+
+ @Override
+ public boolean canEquip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public boolean canUnequip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public BaubleType getBaubleType(final ItemStack arg0) {
+ return BaubleType.BELT;
+ }
+
+ @Override // TODO
+ public void onEquipped(final ItemStack arg0, final EntityLivingBase arg1) {}
+
+ @Override // TODO
+ public void onUnequipped(final ItemStack arg0, final EntityLivingBase arg1) {}
+
+ @Override // TODO
+ public void onWornTick(final ItemStack arg0, final EntityLivingBase arg1) {
+ // Utils.LOG_INFO("Trying to Tick Belt. 1");
+ if (!arg1.worldObj.isRemote) {
+ if (this.getCharge(arg0) >= 10000) {
+ arg1.addPotionEffect(new PotionEffect(Potion.invisibility.id, 10, 2));
+ this.discharge(arg0, 10000, 5, true, true, false);
+ } else {
+ if (arg1.isPotionActive((Potion.invisibility))) {
+ arg1.removePotionEffect(Potion.invisibility.id);
+ }
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemEmpty.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemEmpty.java
new file mode 100644
index 0000000000..773a45aa0a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemEmpty.java
@@ -0,0 +1,18 @@
+package gtPlusPlus.core.item.general;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.CoreItem;
+
+public class ItemEmpty extends CoreItem {
+
+ public ItemEmpty() {
+ super("item.empty", AddToCreativeTab.tabMisc);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack tItem) {
+ return "Empty";
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemGenericToken.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemGenericToken.java
new file mode 100644
index 0000000000..c1bea0b81d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemGenericToken.java
@@ -0,0 +1,197 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.CoreItem;
+
+public class ItemGenericToken extends CoreItem {
+
+ public final HashMap<Integer, String> mLocalNames;
+ public final HashMap<Integer, Integer> mMaxStackSizes;
+ public final HashMap<Integer, String[]> mDescriptionArrays;
+ public final HashMap<Integer, EnumRarity> mRarities;
+ public final HashMap<Integer, EnumChatFormatting> mCustomNameColours;
+ public final HashMap<Integer, IIcon> mIcons;
+ private final String mTextureDir;
+
+ public ItemGenericToken() {
+ this("itemGenericToken", "Token", new String[] { "Can be reclaimed in some way, shape or form" }, "token");
+ }
+
+ public ItemGenericToken(String aUnlocalName, String aInternalName, String[] aBaseTooltip, String aTextureDir) {
+ super(
+ aUnlocalName,
+ aInternalName,
+ AddToCreativeTab.tabMisc,
+ 64,
+ 1000,
+ aBaseTooltip,
+ EnumRarity.common,
+ EnumChatFormatting.RESET,
+ false,
+ null);
+ mLocalNames = new HashMap<>();
+ mMaxStackSizes = new HashMap<>();
+ mDescriptionArrays = new HashMap<>();
+ mRarities = new HashMap<>();
+ mCustomNameColours = new HashMap<>();
+ mIcons = new HashMap<>();
+ mTextureDir = aTextureDir;
+ setMaxStackSize(64);
+ }
+
+ public boolean register(int id, String aLocalName, int aMaxStack, String aDescript) {
+ return register(id, aLocalName, aMaxStack, new String[] { aDescript });
+ }
+
+ public boolean register(int id, String aLocalName, int aMaxStack, String[] aDescript) {
+ return register(id, aLocalName, aMaxStack, aDescript, EnumRarity.common, EnumChatFormatting.RESET);
+ }
+
+ public boolean register(int id, String aLocalName, int aMaxStack, String[] aDescript, EnumRarity aRarity,
+ EnumChatFormatting aCustomNameColour) {
+ int[][] sizes = new int[2][6];
+ sizes[0][0] = mLocalNames.size();
+ sizes[0][1] = mMaxStackSizes.size();
+ sizes[0][2] = mDescriptionArrays.size();
+ sizes[0][3] = mRarities.size();
+ sizes[0][4] = mCustomNameColours.size();
+ // sizes[0][5] = mIcons.size();
+ mLocalNames.put(id, aLocalName);
+ GT_LanguageManager
+ .addStringLocalization("gtplusplus." + this.getUnlocalizedName() + "." + id + ".name", aLocalName);
+ mMaxStackSizes.put(id, aMaxStack);
+ mDescriptionArrays.put(id, aDescript);
+ for (int i = 0; i < aDescript.length; i++) {
+ GT_LanguageManager.addStringLocalization(
+ "gtplusplus." + this.getUnlocalizedName() + "." + id + ".tooltip." + i,
+ aDescript[i]);
+ }
+ mRarities.put(id, aRarity);
+ mCustomNameColours.put(id, aCustomNameColour);
+ sizes[1][0] = mLocalNames.size();
+ sizes[1][1] = mMaxStackSizes.size();
+ sizes[1][2] = mDescriptionArrays.size();
+ sizes[1][3] = mRarities.size();
+ sizes[1][4] = mCustomNameColours.size();
+ // sizes[1][5] = mIcons.size();
+ boolean b = sizes[0][0] > sizes[1][0] && sizes[0][1] > sizes[1][1]
+ && sizes[0][2] > sizes[1][2]
+ && sizes[0][3] > sizes[1][3]
+ && sizes[0][4] > sizes[1][4];
+ return b;
+ }
+
+ // Handle Sub items
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(final Item var1, final CreativeTabs aCreativeTab, final List aList) {
+ for (int i = 0, j = mIcons.size(); i < j; i++) {
+ final ItemStack tStack = new ItemStack(this, 1, i);
+ aList.add(tStack);
+ }
+ }
+
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer aPlayer, List list, boolean bool) {
+ super.addInformation(stack, aPlayer, list, bool);
+ for (int i = 0;; i++) {
+ String tooltip = GT_LanguageManager.getTranslation(
+ "gtplusplus." + this
+ .getUnlocalizedNameInefficiently(stack) + "." + stack.getItemDamage() + ".tooltip." + i);
+ if (!("gtplusplus." + this
+ .getUnlocalizedNameInefficiently(stack) + "." + stack.getItemDamage() + ".tooltip." + i)
+ .equals(tooltip)) {
+ list.add(tooltip);
+ } else break;
+ }
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ String ret = GT_LanguageManager.getTranslation(
+ "gtplusplus." + this.getUnlocalizedNameInefficiently(tItem) + "." + tItem.getItemDamage() + ".name");
+ EnumChatFormatting format = mCustomNameColours.get(tItem.getItemDamage());
+ if (format != null) {
+ ret = format + ret;
+ }
+ return ret;
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack par1ItemStack) {
+ return mRarities.get(par1ItemStack.getItemDamage());
+ }
+
+ @Override
+ public boolean hasEffect(ItemStack par1ItemStack, final int pass) {
+ return false;
+ }
+
+ @Override
+ public int getMetadata(int p_77647_1_) {
+ return 0;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ return 0D;
+ }
+
+ @Override
+ public boolean isDamaged(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack aStack) {
+ if (aStack == null) {
+ return maxStackSize;
+ } else {
+ Integer aSize = mMaxStackSizes.get(aStack.getItemDamage());
+ if (aSize != null) {
+ return aSize;
+ } else {
+ return maxStackSize;
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(final IIconRegister aIconRegister) {
+ for (int i = 0, j = mLocalNames.size(); i < j; i++) {
+ mIcons.put(i, aIconRegister.registerIcon(GTPlusPlus.ID + ":" + mTextureDir + "/" + i));
+ }
+ }
+
+ @Override
+ public final IIcon getIconFromDamage(final int aMetaData) {
+ if (aMetaData < 0) {
+ return null;
+ }
+ return mIcons.get(aMetaData);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemHalfCompleteCasings.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemHalfCompleteCasings.java
new file mode 100644
index 0000000000..47cd73a62b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemHalfCompleteCasings.java
@@ -0,0 +1,56 @@
+package gtPlusPlus.core.item.general;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import gtPlusPlus.core.item.base.BaseItemColourable;
+import gtPlusPlus.core.util.Utils;
+
+public class ItemHalfCompleteCasings extends BaseItemColourable {
+
+ public ItemHalfCompleteCasings(String unlocalizedName, CreativeTabs creativeTab, int stackSize, int maxDmg,
+ String description, EnumRarity regRarity, EnumChatFormatting colour, boolean Effect, int rgb) {
+ super(unlocalizedName, creativeTab, stackSize, maxDmg, description, regRarity, colour, Effect, rgb);
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < 4; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ String prefix = super.getItemStackDisplayName(tItem);
+ String casingType = "";
+ if (tItem.getItemDamage() == 0) {
+ casingType = " I";
+ } else if (tItem.getItemDamage() == 1) {
+ casingType = " II";
+ } else if (tItem.getItemDamage() == 2) {
+ casingType = " III";
+ } else if (tItem.getItemDamage() == 3) {
+ casingType = " IV";
+ }
+ return (prefix + casingType);
+ }
+
+ @Override
+ public int getColorFromItemStack(ItemStack stack, int HEX_OxFFFFFF) {
+ if (this.getDamage(stack) == 0) {
+ return Utils.rgbtoHexValue(52, 52, 52);
+ } else if (this.getDamage(stack) == 1) {
+ return Utils.rgbtoHexValue(80, 90, 222);
+ } else if (this.getDamage(stack) == 2) {
+ return Utils.rgbtoHexValue(182, 77, 177);
+ } else {
+ return Utils.rgbtoHexValue(77, 175, 182);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemHealingDevice.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemHealingDevice.java
new file mode 100644
index 0000000000..d80238b99a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemHealingDevice.java
@@ -0,0 +1,419 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+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.util.FoodStats;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import baubles.api.BaubleType;
+import baubles.api.IBauble;
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Mods;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+import gtPlusPlus.xmod.gregtech.common.helpers.ChargingHelper;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+import ic2.api.item.IElectricItemManager;
+
+@Optional.InterfaceList(
+ value = { @Optional.Interface(iface = "baubles.api.IBauble", modid = Mods.Names.BAUBLES),
+ @Optional.Interface(iface = "baubles.api.BaubleType", modid = Mods.Names.BAUBLES) })
+public class ItemHealingDevice extends Item implements IElectricItem, IElectricItemManager, IBauble {
+
+ private final String unlocalizedName = "personalHealingDevice";
+ private static final int maxValueEU = 1000000000;
+ protected double chargeEU = 0;
+
+ public ItemHealingDevice() {
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ this.setUnlocalizedName(this.unlocalizedName);
+ this.setMaxStackSize(1);
+ this.setTextureName(GTPlusPlus.ID + ":" + "personalCloakingDevice");
+ GameRegistry.registerItem(this, this.unlocalizedName);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack itemStack, final World worldObj, final Entity player, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (worldObj.isRemote) {
+ return;
+ }
+ super.onUpdate(itemStack, worldObj, player, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public boolean canProvideEnergy(final ItemStack itemStack) {
+ return true;
+ }
+
+ @Override
+ public Item getChargedItem(final ItemStack itemStack) {
+ final ItemStack x = itemStack.copy();
+ x.setItemDamage(maxValueEU);
+ return x.getItem();
+ }
+
+ @Override
+ public Item getEmptyItem(final ItemStack itemStack) {
+ final ItemStack x = itemStack.copy();
+ x.setItemDamage(0);
+ return x.getItem();
+ }
+
+ @Override
+ public double getMaxCharge(final ItemStack itemStack) {
+ return maxValueEU;
+ }
+
+ @Override
+ public int getTier(final ItemStack itemStack) {
+ return 5;
+ }
+
+ @Override
+ public double getTransferLimit(final ItemStack itemStack) {
+ return GT_Values.V[7];
+ }
+
+ @Override
+ public double getDurabilityForDisplay(final ItemStack stack) {
+ // return 1.0D - getEnergyStored(stack) / this.capacity;
+ return 1.0D - (this.getCharge(stack) / this.getMaxCharge(stack));
+ }
+
+ @Override
+ public boolean showDurabilityBar(final ItemStack stack) {
+ return true;
+ }
+
+ public double secondsLeft(final ItemStack stack) {
+
+ double r = 0;
+ r = this.getCharge(stack) / (1638400 / 4);
+ return (int) r;
+ }
+
+ int EUPerOperation = 1_638_400;
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+
+ String aString1 = StatCollector.translateToLocal("GTPP.nanohealer.tooltip.1");
+ String aString2 = StatCollector.translateToLocal("GTPP.nanohealer.tooltip.2");
+ String aString3 = StatCollector.translateToLocal("GTPP.nanohealer.tooltip.3");
+ String aString4 = StatCollector.translateToLocal("GTPP.nanohealer.tooltip.4");
+ String aString5 = StatCollector.translateToLocal("GTPP.nanohealer.tooltip.5");
+
+ String aString6 = StatCollector.translateToLocal("GTPP.nanohealer.tooltip.6");
+
+ String aStringTooltip = StatCollector.translateToLocal("GTPP.nanohealer.hidden");
+ String aEuInfo = StatCollector.translateToLocal("GTPP.info.euInfo");
+ String aTier = StatCollector.translateToLocal("GTPP.machines.tier");
+ String aInputLimit = StatCollector.translateToLocal("GTPP.info.inputLimit");
+ String aCurrentPower = StatCollector.translateToLocal("GTPP.info.currentPower");
+ String aEU = StatCollector.translateToLocal("GTPP.info.eu");
+ String aEUT = aEU + "/t";
+ boolean isShowing = getShowMessages(stack);
+
+ list.add("");
+
+ list.add(EnumChatFormatting.GREEN + aString1 + EnumChatFormatting.GRAY);
+ list.add(
+ EnumChatFormatting.GREEN + aString2
+ + GT_Utility.formatNumbers(EUPerOperation)
+ + aString3
+ + EnumChatFormatting.GRAY);
+ list.add(EnumChatFormatting.GREEN + aString4 + EnumChatFormatting.GRAY);
+ list.add(EnumChatFormatting.RED + aString5 + EnumChatFormatting.GRAY);
+
+ list.add("");
+
+ list.add(EnumChatFormatting.GOLD + aEuInfo + EnumChatFormatting.GRAY);
+ list.add(
+ EnumChatFormatting.GRAY + aTier
+ + ": ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.getTier(stack))
+ + EnumChatFormatting.GRAY
+ + "] "
+ + aInputLimit
+ + ": ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.getTransferLimit(stack))
+ + EnumChatFormatting.GRAY
+ + aEUT
+ + "]");
+ list.add(
+ EnumChatFormatting.GRAY + aCurrentPower
+ + ": ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.getCharge(stack))
+ + EnumChatFormatting.GRAY
+ + aEU
+ + "] ["
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(MathUtils.findPercentage(this.getCharge(stack), this.getMaxCharge(stack)))
+ + EnumChatFormatting.GRAY
+ + "%]");
+ list.add(EnumChatFormatting.GOLD + aString6 + EnumChatFormatting.GRAY);
+ list.add(
+ EnumChatFormatting.GOLD + aStringTooltip
+ + " "
+ + (!isShowing ? EnumChatFormatting.DARK_GREEN : EnumChatFormatting.DARK_RED)
+ + !isShowing
+ + EnumChatFormatting.GRAY);
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public double charge(final ItemStack stack, final double amount, final int tier, final boolean ignoreTransferLimit,
+ final boolean simulate) {
+
+ if (!simulate) {
+ ElectricItem.manager.charge(stack, amount, tier, true, simulate);
+ }
+ return ElectricItem.manager.charge(stack, amount, tier, true, simulate);
+ }
+
+ @Override
+ public double discharge(final ItemStack stack, final double amount, final int tier,
+ final boolean ignoreTransferLimit, final boolean externally, final boolean simulate) {
+ return ElectricItem.manager.discharge(stack, amount, tier, ignoreTransferLimit, externally, simulate);
+ }
+
+ @Override
+ public double getCharge(final ItemStack stack) {
+ return ElectricItem.manager.getCharge(stack);
+ }
+
+ @Override
+ public boolean canUse(final ItemStack stack, final double amount) {
+ return ElectricItem.manager.canUse(stack, amount);
+ }
+
+ @Override
+ public boolean use(final ItemStack stack, final double amount, final EntityLivingBase entity) {
+ return ElectricItem.manager.use(stack, amount, entity);
+ }
+
+ @Override
+ public void chargeFromArmor(final ItemStack stack, final EntityLivingBase entity) {
+ ElectricItem.manager.chargeFromArmor(stack, entity);
+ }
+
+ @Override
+ public String getToolTip(final ItemStack stack) {
+ return ElectricItem.manager.getToolTip(stack);
+ }
+
+ @Override
+ public boolean canEquip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public boolean canUnequip(final ItemStack arg0, final EntityLivingBase arg1) {
+ return true;
+ }
+
+ @Override
+ public BaubleType getBaubleType(final ItemStack arg0) {
+ return BaubleType.AMULET;
+ }
+
+ @Override // TODO
+ public void onEquipped(final ItemStack arg0, final EntityLivingBase arg1) {}
+
+ @Override // TODO
+ public void onUnequipped(final ItemStack arg0, final EntityLivingBase arg1) {}
+
+ @Override // TODO
+ public void onWornTick(final ItemStack baubleStack, final EntityLivingBase arg1) {
+ if (arg1 != null && arg1.worldObj != null && !arg1.worldObj.isRemote) {
+
+ // Try Charge First
+
+ // Inv Slots
+ for (final ItemStack aInvStack : ((EntityPlayer) arg1).inventory.mainInventory) {
+ if (aInvStack == baubleStack) {
+ continue;
+ }
+
+ if (this.getCharge(baubleStack) == this.getMaxCharge(baubleStack)) {
+ break;
+ }
+
+ if (aInvStack != null) {
+ if (ChargingHelper.isItemValid(aInvStack)) {
+
+ double aTransferRate;
+ double aCurrentChargeForThisBauble;
+ int mTier;
+ final IElectricItem electricItem = (IElectricItem) aInvStack.getItem();
+
+ if (electricItem != null) {
+
+ aTransferRate = electricItem.getTransferLimit(aInvStack);
+ mTier = electricItem.getTier(aInvStack);
+ aCurrentChargeForThisBauble = ElectricItem.manager.getCharge(baubleStack);
+
+ if (aCurrentChargeForThisBauble < maxValueEU) {
+ if ((ElectricItem.manager.getCharge(aInvStack) >= aTransferRate)) {
+ if (electricItem.canProvideEnergy(aInvStack)) {
+ double d = ElectricItem.manager
+ .discharge(aInvStack, aTransferRate, mTier, false, true, false);
+ // Logger.INFO("Charging from "+aInvStack.getDisplayName() +" | "+d);
+ ElectricItem.manager.charge(baubleStack, d, mTier, true, false);
+ }
+ }
+ }
+ }
+ }
+ }
+ if (this.getCharge(baubleStack) <= (this.getMaxCharge(baubleStack) - getTransferLimit(baubleStack))) {
+ continue;
+ } else {
+ break;
+ }
+ }
+
+ // Try Heal
+ if (this.getCharge(baubleStack) > 0) {
+
+ if (!(arg1 instanceof EntityPlayer g)) {
+ return;
+ }
+ // health Check
+ float hp = 0;
+ if (arg1.getHealth() < arg1.getMaxHealth()) {
+ final float rx = arg1.getMaxHealth() - arg1.getHealth();
+ Logger.INFO("rx:" + rx);
+ arg1.heal(rx * 2);
+ hp = rx;
+ this.discharge(baubleStack, (1638400) * rx, 6, true, true, false);
+ }
+
+ int hunger = 0;
+ float saturation = 0;
+ FoodStats aFood = g.getFoodStats();
+ if (aFood != null) {
+ // Hunger Check
+ hunger = 20 - aFood.getFoodLevel();
+ // Saturation Check
+ if (hunger > 0) {
+ saturation = 20f - aFood.getSaturationLevel();
+ saturation /= hunger * 2f;
+ this.discharge(baubleStack, (1638400) * (hunger + saturation), 6, true, true, false);
+ aFood.addStats(hunger, saturation);
+ }
+ }
+
+ // Only show Messages if they're enabled.
+ if (getShowMessages(baubleStack)) {
+ if (hp > 0 || hunger > 0 || saturation > 0) PlayerUtils
+ .messagePlayer((EntityPlayer) arg1, "Your NanoBooster Whirs! Leaving you feeling stronger.");
+
+ if (hp > 0) PlayerUtils
+ .messagePlayer((EntityPlayer) arg1, "Healed " + GT_Utility.formatNumbers(hp) + " hp.");
+
+ if (hunger > 0) PlayerUtils
+ .messagePlayer((EntityPlayer) arg1, "Healed " + GT_Utility.formatNumbers(hunger) + " hunger.");
+
+ if (saturation > 0) PlayerUtils.messagePlayer(
+ (EntityPlayer) arg1,
+ "Satured Hunger by " + GT_Utility.formatNumbers(saturation) + ".");
+
+ if (hp > 0 || hunger > 0 || saturation > 0) PlayerUtils.messagePlayer(
+ (EntityPlayer) arg1,
+ "You check it's remaining uses, it has " + GT_Utility.formatNumbers(secondsLeft(baubleStack))
+ + " seconds left.");
+ }
+ }
+ }
+ }
+
+ private static boolean createNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ tagMain.setBoolean("ShowMSG", false);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static final boolean getShowMessages(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT == null) {
+ if (!createNBT(aStack)) {
+ return false;
+ } else {
+ aNBT = aStack.getTagCompound();
+ }
+ }
+ return aNBT.getBoolean("ShowMSG");
+ }
+
+ public static final boolean setShowMessages(final ItemStack aStack, final boolean aShow) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT == null) {
+ if (!createNBT(aStack)) {
+ return false;
+ } else {
+ aNBT = aStack.getTagCompound();
+ }
+ }
+ aNBT.setBoolean("ShowMSG", aShow);
+ return true;
+ }
+
+ @Override
+ public boolean onItemUse(ItemStack p_77648_1_, EntityPlayer p_77648_2_, World p_77648_3_, int p_77648_4_,
+ int p_77648_5_, int p_77648_6_, int p_77648_7_, float p_77648_8_, float p_77648_9_, float p_77648_10_) {
+ // TODO Auto-generated method stub
+ return super.onItemUse(
+ p_77648_1_,
+ p_77648_2_,
+ p_77648_3_,
+ p_77648_4_,
+ p_77648_5_,
+ p_77648_6_,
+ p_77648_7_,
+ p_77648_8_,
+ p_77648_9_,
+ p_77648_10_);
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ ItemStack superStack = super.onItemRightClick(aStack, aWorld, aPlayer);
+ boolean isShiftHeld = KeyboardUtils.isShiftKeyDown();
+ if (isShiftHeld) {
+ boolean oldState = getShowMessages(superStack);
+ boolean newState = !oldState;
+ ItemHealingDevice.setShowMessages(superStack, newState);
+ PlayerUtils.messagePlayer(aPlayer, (!oldState ? "Showing info messages" : "Hiding info messages"));
+ }
+ return superStack;
+ }
+
+ @Override
+ public boolean doesSneakBypassUse(World world, int x, int y, int z, EntityPlayer player) {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemLavaFilter.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemLavaFilter.java
new file mode 100644
index 0000000000..2b5dd8883f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemLavaFilter.java
@@ -0,0 +1,84 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.CoreItem;
+
+public class ItemLavaFilter extends CoreItem {
+
+ public IIcon[] mIcon = new IIcon[1];
+
+ public ItemLavaFilter() {
+ super(
+ "itemLavaFilter",
+ AddToCreativeTab.tabMachines,
+ 1,
+ 99,
+ new String[] { "Lava Filter" },
+ EnumRarity.common,
+ EnumChatFormatting.BLACK,
+ false,
+ null);
+ setGregtechItemList();
+ }
+
+ private boolean setGregtechItemList() {
+ ItemList.Component_LavaFilter.set(this);
+ return ItemList.Component_LavaFilter.get(1) != null ? true : false;
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ this.mIcon[0] = reg.registerIcon(GTPlusPlus.ID + ":" + "itemLavaFilter");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.mIcon[0];
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ list.add(EnumChatFormatting.GRAY + StatCollector.translateToLocal("item.itemLavaFilter.tooltip"));
+
+ int maxDurability = stack.getMaxDamage() + 1;
+ int durability = maxDurability - stack.getItemDamage();
+
+ EnumChatFormatting formatting = EnumChatFormatting.GRAY;
+ if (durability > maxDurability * 0.8) {
+ formatting = EnumChatFormatting.GRAY;
+ } else if (durability > maxDurability * 0.6) {
+ formatting = EnumChatFormatting.GREEN;
+ } else if (durability > maxDurability * 0.4) {
+ formatting = EnumChatFormatting.YELLOW;
+ } else if (durability > maxDurability * 0.2) {
+ formatting = EnumChatFormatting.GOLD;
+ } else if (durability > 0) {
+ formatting = EnumChatFormatting.RED;
+ }
+ list.add("Uses remaining: " + formatting + durability + EnumChatFormatting.GRAY + " / " + maxDurability);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return true;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemMagicFeather.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemMagicFeather.java
new file mode 100644
index 0000000000..9b4dd86525
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/ItemMagicFeather.java
@@ -0,0 +1,260 @@
+package gtPlusPlus.core.item.general;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.lang.ref.WeakReference;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.WeakHashMap;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.tileentity.TileEntityBeacon;
+import net.minecraft.world.World;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.living.LivingDeathEvent;
+
+import cpw.mods.fml.common.eventhandler.EventPriority;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.TickEvent;
+import cpw.mods.fml.common.gameevent.TickEvent.Phase;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.base.CoreItem;
+
+public class ItemMagicFeather extends CoreItem {
+
+ public static final String NAME = "magicfeather";
+ private static final WeakHashMap<EntityPlayer, MagicFeatherData> sPlayerData = new WeakHashMap<>();
+ private static final WeakHashMap<EntityPlayer, HashSet<TileEntityBeacon>> sBeaconData = new WeakHashMap<>();
+
+ public ItemMagicFeather() {
+ super(
+ "magicfeather",
+ AddToCreativeTab.tabMisc,
+ 1,
+ 100,
+ new String[] { "Lets you fly around Beacons" },
+ EnumRarity.uncommon,
+ null,
+ false,
+ null);
+ setMaxStackSize(1);
+ setUnlocalizedName(GTPlusPlus.ID + ":" + NAME);
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @Override
+ public int getEntityLifespan(ItemStack itemStack, World world) {
+ return Integer.MAX_VALUE;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add("Does not need to be the item held in your hand to work");
+ super.addInformation(stack, aPlayer, list, bool);
+ list.add("Needs to be within beacon range");
+ list.add("Range is beacon level * 10 + 10");
+ }
+
+ @Override
+ public boolean hasCustomEntity(ItemStack stack) {
+ return true;
+ }
+
+ private static boolean isInBeaconRange(EntityPlayer player) {
+ World world = player.getEntityWorld();
+ if (world.isRemote) {
+ return false;
+ }
+ HashSet<TileEntityBeacon> aBeaconData = sBeaconData.computeIfAbsent(player, k -> new HashSet<>());
+ int chunkXlo = (int) (player.posX - 50) >> 4, chunkXhi = (int) (player.posX + 50) >> 4,
+ chunkZlo = (int) (player.posZ - 50) >> 4, chunkZhi = (int) (player.posZ + 50) >> 4;
+ for (int chunkX = chunkXlo; chunkX < chunkXhi; chunkX++) {
+ for (int chunkZ = chunkZlo; chunkZ < chunkZhi; chunkZ++) {
+ if (!world.getChunkProvider()
+ .chunkExists(chunkX, chunkZ)) continue;
+ findSuitableBeacon(
+ player,
+ world.getChunkFromChunkCoords(chunkX, chunkZ).chunkTileEntityMap.values(),
+ aBeaconData);
+ }
+ }
+ return aBeaconData.size() > 0;
+ }
+
+ private static void findSuitableBeacon(EntityPlayer player, Collection<TileEntity> tileEntities,
+ HashSet<TileEntityBeacon> aBeaconData) {
+ for (TileEntity t : tileEntities) {
+ if (!(t instanceof TileEntityBeacon beacon)) {
+ continue;
+ }
+ int level = beacon.getLevels();
+ if (level == 0) {
+ continue;
+ }
+ int radius = (level * 10 + 10);
+ int x = beacon.xCoord;
+ int z = beacon.zCoord;
+ if (player.posX < (x - radius) || player.posX > (x + radius)) {
+ continue;
+ }
+ if (player.posZ < (z - radius) || player.posZ > (z + radius)) {
+ continue;
+ }
+ aBeaconData.add(beacon);
+ }
+ }
+
+ private static void setMayFly(EntityPlayer player, boolean mayFly) {
+ if (player.capabilities.allowFlying == mayFly) {
+ return;
+ }
+ if (!mayFly) {
+ // force the player on the ground then remove ability to fly
+ // this prevent crashing the the ground and dying
+ // when you accidentally get out of the beacon range
+ player.capabilities.isFlying = false;
+ if (player.onGround && player.fallDistance < 1F) {
+ player.capabilities.allowFlying = false;
+ }
+ } else {
+ player.capabilities.allowFlying = true;
+ }
+ player.sendPlayerAbilities();
+ }
+
+ @SubscribeEvent(priority = EventPriority.HIGHEST)
+ public void onPlayerTick(TickEvent.PlayerTickEvent event) {
+ if (event.side != Side.SERVER || event.phase != Phase.END) {
+ return;
+ }
+ EntityPlayer player = event.player;
+ HashSet<TileEntityBeacon> aBeaconData = sBeaconData.get(player);
+ if (aBeaconData != null && !aBeaconData.isEmpty()) {
+ for (Iterator<TileEntityBeacon> iterator = aBeaconData.iterator(); iterator.hasNext();) {
+ TileEntityBeacon aBeacon = iterator.next();
+ int level = aBeacon.getLevels();
+ if (level == 0) {
+ iterator.remove();
+ continue;
+ }
+ int radius = (level * 10 + 10);
+ int x = aBeacon.xCoord;
+ int z = aBeacon.zCoord;
+ if (player.posX < (x - radius) || player.posX > (x + radius)
+ || player.posZ < (z - radius)
+ || player.posZ > (z + radius)) {
+ iterator.remove();
+ }
+ }
+ }
+ boolean hasItem = hasItem(player, ModItems.itemMagicFeather);
+ if (!hasItem) {
+ ItemMagicFeather.sPlayerData.remove(player);
+ }
+ MagicFeatherData data = ItemMagicFeather.sPlayerData.get(player);
+ if (data == null) {
+ data = new MagicFeatherData(player);
+ ItemMagicFeather.sPlayerData.put(player, data);
+ }
+ data.onTick();
+ }
+
+ @SubscribeEvent(priority = EventPriority.LOWEST)
+ public void onPlayerDeath(LivingDeathEvent event) {
+ if (event.entityLiving == null) return;
+ EntityLivingBase aEntity = event.entityLiving;
+ if (!(aEntity instanceof EntityPlayer aPlayer) || aEntity.worldObj == null || aEntity.worldObj.isRemote) return;
+ ItemMagicFeather.sPlayerData.remove(aPlayer);
+ ItemMagicFeather.sBeaconData.remove(aPlayer);
+ }
+
+ private static boolean hasItem(EntityPlayer player, Item item) {
+ for (int i = 0; i < player.inventory.getSizeInventory(); i++) {
+ ItemStack stack = player.inventory.getStackInSlot(i);
+ if (stack != null && stack.getItem() != null && stack.getItem() instanceof ItemMagicFeather) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static class MagicFeatherData {
+
+ private final WeakReference<EntityPlayer> player;
+ private boolean hasItem = false;
+ private int checkTick = 0;
+ private boolean beaconInRangeCache;
+
+ public MagicFeatherData(EntityPlayer player) {
+ this.player = new WeakReference<>(player);
+ this.beaconInRangeCache = player.capabilities.allowFlying;
+ }
+
+ public void onTick() {
+ EntityPlayer player = this.player.get();
+ if (player == null) return;
+ try {
+ boolean hasItem = hasItem(player, ModItems.itemMagicFeather);
+ if (hasItem != this.hasItem) {
+ if (hasItem) {
+ this.onAdd();
+ }
+ if (!hasItem) {
+ this.onRemove();
+ }
+ this.hasItem = hasItem;
+ Logger.INFO("Ticking feather " + hasItem);
+ return;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+
+ if (hasItem) {
+ // only modify if hasItem. Override other flight methods since you are literally holding this item in
+ // your own inventory. You have sent your consent.
+ boolean mayFly = player.capabilities.isCreativeMode || checkBeaconInRange(player);
+ setMayFly(player, mayFly);
+ }
+ }
+
+ private void onAdd() {
+ if (!ItemMagicFeather.isInBeaconRange(getPlayer())) {
+ return;
+ }
+ setMayFly(getPlayer(), true);
+ }
+
+ private void onRemove() {
+ if (getPlayer().capabilities.isCreativeMode) {
+ return;
+ }
+ setMayFly(getPlayer(), false);
+ }
+
+ private boolean checkBeaconInRange(EntityPlayer player) {
+ if (checkTick++ % 40 != 0) {
+ return beaconInRangeCache;
+ }
+ beaconInRangeCache = ItemMagicFeather.isInBeaconRange(player);
+ return beaconInRangeCache;
+ }
+
+ private EntityPlayer getPlayer() {
+ return player.get();
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/books/ItemBaseBook.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/books/ItemBaseBook.java
new file mode 100644
index 0000000000..87c5ab3e74
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/books/ItemBaseBook.java
@@ -0,0 +1,122 @@
+package gtPlusPlus.core.item.general.books;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gtPlusPlus.core.handler.BookHandler.mBookMap;
+import static gtPlusPlus.core.util.Utils.addBookTitleLocalization;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemWritableBook;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.handler.BookHandler;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class ItemBaseBook extends ItemWritableBook {
+
+ public ItemBaseBook() {
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setMaxStackSize(1);
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemBook");
+ this.setUnlocalizedName("itembookgt");
+ GameRegistry.registerItem(this, "bookGT");
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < BookHandler.mBookMap.size(); i++) {
+ ItemStack bookstack = new ItemStack(item, 1, i);
+
+ /*
+ * bookstack = Utils.getWrittenBook( bookstack, i, mBookMap.get(i).mMapping, mBookMap.get(i).mTitle,
+ * mBookMap.get(i).mAuthor, mBookMap.get(i).mPages);
+ */
+
+ NBTUtils.createIntegerTagCompound(bookstack, "stats", "mMeta", i);
+ list.add(bookstack);
+ }
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ if (NBTUtils.hasKey(tItem, "title")) {
+ return NBTUtils.getString(tItem, "title");
+ } else if (tItem.getItemDamage() > -1 && tItem.getItemDamage() <= mBookMap.size()) {
+ return EnumChatFormatting.ITALIC + ""
+ + addBookTitleLocalization(mBookMap.get(tItem.getItemDamage()).mTitle);
+ }
+ // NBTUtils.tryIterateNBTData(tItem);
+ return "GT++ Storybook";
+ }
+
+ @Override
+ public void addInformation(ItemStack tItem, EntityPlayer player, List list, boolean bool) {
+ // TODO Auto-generated method stub
+ if (NBTUtils.hasKey(tItem, "author")) {
+ list.add(EnumChatFormatting.GRAY + "Author: " + NBTUtils.getString(tItem, "author"));
+ } else if (mBookMap.get(tItem.getItemDamage()).mAuthor != null) {
+ list.add(EnumChatFormatting.WHITE + "Author: " + mBookMap.get(tItem.getItemDamage()).mAuthor);
+ }
+ if (NBTUtils.hasKey(tItem, "title")) {
+ list.add(EnumChatFormatting.GRAY + "Pages: " + NBTUtils.getString(tItem, "pages"));
+ } else if (mBookMap.get(tItem.getItemDamage()).mPages != null) {
+ list.add(EnumChatFormatting.WHITE + "Pages: " + mBookMap.get(tItem.getItemDamage()).mPages.length);
+ }
+ // super.addInformation(p_77624_1_, p_77624_2_, p_77624_3_, p_77624_4_);
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) {
+ // player.displayGUIBook(item);
+ int i = item.getItemDamage();
+ ItemStack bookstack = Utils.getWrittenBook(
+ null,
+ mBookMap.get(i).mMeta,
+ mBookMap.get(i).mMapping,
+ mBookMap.get(i).mTitle,
+ mBookMap.get(i).mAuthor,
+ mBookMap.get(i).mPages);
+
+ if (player.worldObj.isRemote) {
+ try {
+ Class<?> clazz = ReflectionUtils.getClass("net.minecraft.client.gui.GuiScreenBook");
+ Constructor<?> ctor = clazz.getConstructor(EntityPlayer.class, ItemStack.class, boolean.class);
+ Object object = ctor.newInstance(new Object[] { player, bookstack, false });
+ Minecraft.getMinecraft()
+ .displayGuiScreen((GuiScreen) object);
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException | NoSuchMethodException | SecurityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ // Minecraft.getMinecraft().displayGuiScreen(new GuiScreenBook(player, bookstack, false));
+ }
+ return item;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/chassis/ItemBoilerChassis.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/chassis/ItemBoilerChassis.java
new file mode 100644
index 0000000000..8efcfe6912
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/chassis/ItemBoilerChassis.java
@@ -0,0 +1,72 @@
+package gtPlusPlus.core.item.general.chassis;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+public class ItemBoilerChassis extends Item {
+
+ public IIcon[] icons = new IIcon[1];
+
+ public ItemBoilerChassis() {
+ super();
+ this.setHasSubtypes(true);
+ String unlocalizedName = "itemBoilerChassis";
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ this.icons[0] = reg.registerIcon(GTPlusPlus.ID + ":" + "itemBoilerChassis");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[0];
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < 3; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return this.getUnlocalizedName() + "_" + stack.getItemDamage();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ return StatCollector.translateToLocalFormatted("item.itemBoilerChassis.name", tItem.getItemDamage());
+ }
+
+ @Override // TODO
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ int meta = stack.getItemDamage();
+ if (meta == 0) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(10, 110, 30);
+ } else if (meta == 1) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(150, 180, 35);
+ } else if (meta == 2) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(200, 85, 40);
+ } else if (meta == 3) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(255, 100, 50);
+ }
+ return HEX_OxFFFFFF;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoil.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoil.java
new file mode 100644
index 0000000000..24759808ab
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoil.java
@@ -0,0 +1,70 @@
+package gtPlusPlus.core.item.general.chassis;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class ItemDehydratorCoil extends Item {
+
+ public IIcon[] icons = new IIcon[4];
+
+ public ItemDehydratorCoil() {
+ super();
+ this.setHasSubtypes(true);
+ String unlocalizedName = "itemDehydratorCoil";
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ this.icons[0] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoil_0");
+ this.icons[1] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoil_1");
+ this.icons[2] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoil_2");
+ this.icons[3] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoil_3");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[meta];
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < 4; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return this.getUnlocalizedName() + "_" + stack.getItemDamage();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ return StatCollector
+ .translateToLocalFormatted("item.itemDehydratorCoil.name", GT_Values.VN[tItem.getItemDamage() + 4]);
+ }
+
+ /*
+ * @Override public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) { int meta =
+ * stack.getItemDamage(); if (meta == 0){ HEX_OxFFFFFF = Utils.rgbtoHexValue(10,110,30); } else if (meta == 1){
+ * HEX_OxFFFFFF = Utils.rgbtoHexValue(150,180,35); } else if (meta == 2){ HEX_OxFFFFFF =
+ * Utils.rgbtoHexValue(200,85,40); } else if (meta == 3){ HEX_OxFFFFFF = Utils.rgbtoHexValue(255,150,50); } return
+ * HEX_OxFFFFFF; }
+ */
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoilWire.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoilWire.java
new file mode 100644
index 0000000000..b050e4c65c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/chassis/ItemDehydratorCoilWire.java
@@ -0,0 +1,70 @@
+package gtPlusPlus.core.item.general.chassis;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class ItemDehydratorCoilWire extends Item {
+
+ public IIcon[] icons = new IIcon[4];
+
+ public ItemDehydratorCoilWire() {
+ super();
+ this.setHasSubtypes(true);
+ String unlocalizedName = "itemDehydratorCoilWire";
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ this.icons[0] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoilWire_0");
+ this.icons[1] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoilWire_1");
+ this.icons[2] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoilWire_2");
+ this.icons[3] = reg.registerIcon(GTPlusPlus.ID + ":" + "dehydrator/itemDehydratorCoilWire_3");
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[meta];
+ }
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < 4; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return this.getUnlocalizedName() + "_" + stack.getItemDamage();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ return StatCollector
+ .translateToLocalFormatted("item.itemDehydratorCoilWire.name", GT_Values.VN[tItem.getItemDamage() + 4]);
+ }
+
+ /*
+ * @Override public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) { int meta =
+ * stack.getItemDamage(); if (meta == 0){ HEX_OxFFFFFF = Utils.rgbtoHexValue(10,110,30); } else if (meta == 1){
+ * HEX_OxFFFFFF = Utils.rgbtoHexValue(150,180,35); } else if (meta == 2){ HEX_OxFFFFFF =
+ * Utils.rgbtoHexValue(200,85,40); } else if (meta == 3){ HEX_OxFFFFFF = Utils.rgbtoHexValue(255,150,50); } return
+ * HEX_OxFFFFFF; }
+ */
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/general/spawn/ItemCustomSpawnEgg.java b/gtpp/src/main/java/gtPlusPlus/core/item/general/spawn/ItemCustomSpawnEgg.java
new file mode 100644
index 0000000000..c186fccd4b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/general/spawn/ItemCustomSpawnEgg.java
@@ -0,0 +1,278 @@
+package gtPlusPlus.core.item.general.spawn;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockLiquid;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityList;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.IEntityLivingData;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemMonsterPlacer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Facing;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class ItemCustomSpawnEgg extends ItemMonsterPlacer {
+
+ private static final HashMap<Integer, IIcon> mIconMap = new HashMap<>();
+ private static int mTotalMetaItems = 0;
+
+ private static final HashMap<Integer, Integer> mMaxStackSizeMap = new HashMap<>();
+ private static final HashMap<Integer, EnumRarity> mRarityMap = new HashMap<>();
+ private static final HashMap<Integer, ArrayList<String>> mOreDictNames = new HashMap<>();
+
+ private static final HashMap<Integer, Integer> mColourBaseMap = new HashMap<>();
+ private static final HashMap<Integer, Integer> mColourSpotsMap = new HashMap<>();
+ private static final HashMap<Integer, String> mEntityNameMap = new HashMap<>();
+ private static final HashMap<Integer, String> mEntityFullNameMap = new HashMap<>();
+
+ private static final HashMap<String, Integer> mReverseEntityMap = new HashMap<>();
+
+ protected EntityLiving entityToSpawn = null;
+
+ public static void registerEntityForSpawnEgg(final int aMetaID, String parEntityToSpawnName, int aPrimaryColor,
+ int aSecondaryColor) {
+ registerEntityForSpawnEgg(
+ aMetaID,
+ parEntityToSpawnName,
+ aPrimaryColor,
+ aSecondaryColor,
+ EnumRarity.common,
+ new ArrayList<String>());
+ }
+
+ public static void registerEntityForSpawnEgg(final int aMetaID, String parEntityToSpawnName, int aPrimaryColor,
+ int aSecondaryColor, EnumRarity aRarity, final ArrayList<String> aOreDictNames) {
+ mTotalMetaItems++;
+ mMaxStackSizeMap.put(aMetaID, 64);
+ mRarityMap.put(aMetaID, aRarity);
+ mOreDictNames.put(aMetaID, aOreDictNames);
+ mColourBaseMap.put(aMetaID, aPrimaryColor);
+ mColourSpotsMap.put(aMetaID, aSecondaryColor);
+ mReverseEntityMap.put(parEntityToSpawnName, aMetaID);
+ setEntityToSpawnName(aMetaID, parEntityToSpawnName);
+ }
+
+ public ItemCustomSpawnEgg() {
+ super();
+ this.setNoRepair();
+ this.setMaxStackSize(64);
+ this.setMaxDamage(0);
+ this.setUnlocalizedName("BasicMetaSpawnEgg");
+ GameRegistry.registerItem(this, this.getUnlocalizedName());
+ }
+
+ /**
+ * Callback for item usage. If the item does something special on right clicking,
+ *
+ * he will have one of those. Return True if something happen and false if it don't. This is for ITEMS, not BLOCKS
+ */
+ @Override
+ public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4,
+ int par5, int par6, int par7, float par8, float par9, float par10) {
+ if (par3World.isRemote) {
+ return true;
+ } else {
+ Block block = par3World.getBlock(par4, par5, par6);
+ par4 += Facing.offsetsXForSide[par7];
+ par5 += Facing.offsetsYForSide[par7];
+ par6 += Facing.offsetsZForSide[par7];
+ double d0 = 0.0D;
+
+ if (par7 == 1 && block.getRenderType() == 11) {
+ d0 = 0.5D;
+ }
+
+ Entity entity = spawnEntity(par1ItemStack, par3World, par4 + 0.5D, par5 + d0, par6 + 0.5D);
+
+ if (entity != null) {
+ if (entity instanceof EntityLivingBase && par1ItemStack.hasDisplayName()) {
+ ((EntityLiving) entity).setCustomNameTag(par1ItemStack.getDisplayName());
+ }
+
+ if (!par2EntityPlayer.capabilities.isCreativeMode) {
+ --par1ItemStack.stackSize;
+ }
+ }
+
+ return true;
+ }
+ }
+
+ /**
+ * Called whenever this item is equipped and the right mouse button is pressed.
+ *
+ * Args: itemStack, world, entityPlayer
+ */
+ @Override
+ public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) {
+ if (par2World.isRemote) {
+ return par1ItemStack;
+ } else {
+ MovingObjectPosition movingobjectposition = getMovingObjectPositionFromPlayer(
+ par2World,
+ par3EntityPlayer,
+ true);
+
+ if (movingobjectposition == null) {
+ return par1ItemStack;
+ } else {
+ if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
+ int i = movingobjectposition.blockX;
+ int j = movingobjectposition.blockY;
+ int k = movingobjectposition.blockZ;
+
+ if (!par2World.canMineBlock(par3EntityPlayer, i, j, k)) {
+ return par1ItemStack;
+ }
+
+ if (!par3EntityPlayer.canPlayerEdit(i, j, k, movingobjectposition.sideHit, par1ItemStack)) {
+
+ return par1ItemStack;
+ }
+
+ if (par2World.getBlock(i, j, k) instanceof BlockLiquid) {
+ Entity entity = spawnEntity(par1ItemStack, par2World, i, j, k);
+
+ if (entity != null) {
+ if (entity instanceof EntityLivingBase && par1ItemStack.hasDisplayName()) {
+
+ ((EntityLiving) entity).setCustomNameTag(par1ItemStack.getDisplayName());
+ }
+
+ if (!par3EntityPlayer.capabilities.isCreativeMode) {
+ --par1ItemStack.stackSize;
+ }
+ }
+ }
+ }
+
+ return par1ItemStack;
+ }
+ }
+ }
+
+ /**
+ * Spawns the creature specified by the egg's type in the location specified by
+ *
+ * the last three parameters. Parameters: world, entityID, x, y, z.
+ *
+ * @param par1ItemStack
+ */
+ public Entity spawnEntity(ItemStack par1ItemStack, World parWorld, double parX, double parY, double parZ) {
+
+ if (!parWorld.isRemote) // never spawn entity on client side
+ {
+ int aDamage = par1ItemStack.getItemDamage();
+ String entityToSpawnNameFull = mEntityFullNameMap.get(aDamage);
+ String entityToSpawnName = mEntityNameMap.get(aDamage);
+ // entityToSpawnNameFull = WildAnimals.MODID + "." + entityToSpawnName;
+ if (EntityList.stringToClassMapping.containsKey(entityToSpawnNameFull)) {
+ entityToSpawn = (EntityLiving) EntityList.createEntityByName(entityToSpawnNameFull, parWorld);
+ entityToSpawn.setLocationAndAngles(
+ parX,
+ parY,
+ parZ,
+ MathHelper.wrapAngleTo180_float(parWorld.rand.nextFloat() * 360.0F),
+ 0.0F);
+ parWorld.spawnEntityInWorld(entityToSpawn);
+ entityToSpawn.onSpawnWithEgg((IEntityLivingData) null);
+ entityToSpawn.playLivingSound();
+ } else {
+ // DEBUG
+ System.out.println("Entity not found " + entityToSpawnName);
+ }
+ }
+
+ return entityToSpawn;
+ }
+
+ /**
+ * returns a list of items with the same ID, but different meta (eg: dye returns 16 items)
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item aItem, CreativeTabs p_150895_2_, List aList) {
+ for (int aMeta : mReverseEntityMap.values()) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, aMeta, 1));
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack par1ItemStack, int parColorType) {
+ int aID = par1ItemStack.getItemDamage();
+ return (parColorType == 0) ? mColourBaseMap.get(aID) : mColourSpotsMap.get(aID);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ // Doing this override means that there is no localization for language
+ // unless you specifically check for localization here and convert
+ public String getItemStackDisplayName(ItemStack par1ItemStack) {
+ return StatCollector.translateToLocalFormatted(
+ "item.ItemCustomSpawnEgg.name",
+ StatCollector.translateToLocal("entity." + mEntityNameMap.get(par1ItemStack.getItemDamage()) + ".name"));
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister u) {
+ mIconMap.put(0, u.registerIcon(GTPlusPlus.ID + ":" + "spawn_egg"));
+ mIconMap.put(1, u.registerIcon(GTPlusPlus.ID + ":" + "spawn_egg_overlay"));
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int renderPass) {
+ return mIconMap.get(renderPass);
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int damage) {
+ return getIconFromDamageForRenderPass(0, 0);
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack aStack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
+ return getIconFromDamageForRenderPass(0, renderPass);
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack aStack, int renderPass) {
+ return getIconFromDamageForRenderPass(0, renderPass);
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return super.getUnlocalizedName() + "." + stack.getItemDamage();
+ }
+
+ public static void setEntityToSpawnName(int aMetaID, String parEntityToSpawnName) {
+ mEntityNameMap.put(aMetaID, parEntityToSpawnName);
+ mEntityFullNameMap.put(aMetaID, GTPlusPlus.ID + "." + parEntityToSpawnName);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/init/ItemsFoods.java b/gtpp/src/main/java/gtPlusPlus/core/item/init/ItemsFoods.java
new file mode 100644
index 0000000000..acddd58a7b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/init/ItemsFoods.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.core.item.init;
+
+import net.minecraft.entity.monster.EntityBlaze;
+import net.minecraft.entity.passive.EntityHorse;
+import net.minecraft.entity.passive.EntityOcelot;
+import net.minecraft.entity.passive.EntityVillager;
+import net.minecraft.entity.passive.EntityWolf;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.food.BaseItemMetaFood;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class ItemsFoods {
+
+ public static void load() {
+ run();
+ }
+
+ private static void run() {
+
+ ModItems.itemMetaFood = new BaseItemMetaFood();
+ BaseItemMetaFood.registerFoodsToOreDict();
+ addCookingRecipes();
+ addFoodDropsToMobs();
+ }
+
+ private static ItemStack getMetaFoodStack(int aID) {
+ return ItemUtils.simpleMetaStack(ModItems.itemMetaFood, aID, 1);
+ }
+
+ private static void addCookingRecipes() {
+
+ RecipeUtils.addSmeltingRecipe(getMetaFoodStack(0), getMetaFoodStack(1), 0.4F);
+ RecipeUtils.addSmeltingRecipe(getMetaFoodStack(2), getMetaFoodStack(3), 0.35F);
+ RecipeUtils.addSmeltingRecipe(getMetaFoodStack(4), getMetaFoodStack(5), 0.35F);
+ RecipeUtils.addSmeltingRecipe(getMetaFoodStack(6), getMetaFoodStack(7), 0.35F);
+ }
+
+ private static void addFoodDropsToMobs() {
+
+ EntityUtils.registerDropsForMob(EntityVillager.class, getMetaFoodStack(0), 2, 1500);
+ EntityUtils.registerDropsForMob(EntityHorse.class, getMetaFoodStack(2), 4, 4000);
+ EntityUtils.registerDropsForMob(EntityWolf.class, getMetaFoodStack(4), 2, 4000);
+ EntityUtils.registerDropsForMob(EntityOcelot.class, getMetaFoodStack(6), 2, 4000);
+ EntityUtils.registerDropsForMob(EntityBlaze.class, getMetaFoodStack(8), 1, 500);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/materials/DustDecayable.java b/gtpp/src/main/java/gtPlusPlus/core/item/materials/DustDecayable.java
new file mode 100644
index 0000000000..eaf8c2c9da
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/materials/DustDecayable.java
@@ -0,0 +1,97 @@
+package gtPlusPlus.core.item.materials;
+
+import static gregtech.api.enums.Mods.GregTech;
+import static gtPlusPlus.core.util.minecraft.ItemUtils.getSimpleStack;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.handler.Recipes.DecayableRecipe;
+import gtPlusPlus.core.item.base.BaseItemTickable;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class DustDecayable extends BaseItemTickable {
+
+ private final Item turnsIntoItem;
+ private final int radLevel;
+
+ public DustDecayable(String unlocal, int colour, int maxTicks, String[] desc1, Item turnsInto, int radLevel) {
+ super(true, true, unlocal, colour, (maxTicks / 1), desc1);
+ this.turnsIntoItem = turnsInto;
+ this.radLevel = radLevel;
+ GT_OreDictUnificator.registerOre(unlocal, ItemUtils.getSimpleStack(this));
+ new DecayableRecipe(maxTicks, getSimpleStack(this), getSimpleStack(turnsInto));
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ String gt = GregTech.ID + ":" + "materialicons/" + "NUCLEAR" + "/" + "dust";
+ this.mIcon[0] = reg.registerIcon(gt);
+ String gt2 = GregTech.ID + ":" + "materialicons/" + "NUCLEAR" + "/" + "dust" + "_OVERLAY";
+ this.mIcon[1] = reg.registerIcon(gt2);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ super.addInformation(stack, player, list, bool);
+ if (this.radLevel > 0) {
+ list.add(CORE.GT_Tooltip_Radioactive.get());
+ }
+ }
+
+ @Override
+ public void onUpdate(final ItemStack iStack, final World world, final Entity entityHolding, final int p_77663_4_,
+ final boolean p_77663_5_) {
+ if (world == null || iStack == null) {
+ return;
+ }
+ if (world.isRemote) {
+ return;
+ }
+
+ if (entityHolding instanceof EntityPlayer) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ EntityUtils.applyRadiationDamageToEntity(iStack.stackSize, this.radLevel, world, entityHolding);
+ }
+ }
+ boolean a1, a2;
+
+ a1 = this.isTicking(world, iStack);
+ a2 = tickItemTag(world, iStack);
+
+ if (!a1 && !a2) {
+ if (entityHolding instanceof EntityPlayer) {
+ ItemStack replacement = ItemUtils.getSimpleStack(getDecayResult());
+ // Logger.INFO("Replacing "+iStack.getDisplayName()+" with "+replacement.getDisplayName()+".");
+ final ItemStack tempTransform = replacement;
+ if (iStack.stackSize > 1) {
+ int u = iStack.stackSize;
+ tempTransform.stackSize = u;
+ ((EntityPlayer) entityHolding).inventory.addItemStackToInventory((tempTransform));
+ for (int l = 0; l < u; l++) {
+ ((EntityPlayer) entityHolding).inventory.consumeInventoryItem(this);
+ }
+
+ } else {
+ tempTransform.stackSize = 1;
+ ((EntityPlayer) entityHolding).inventory.addItemStackToInventory((tempTransform));
+ ((EntityPlayer) entityHolding).inventory.consumeInventoryItem(this);
+ }
+ }
+ }
+ }
+
+ public Item getDecayResult() {
+ return turnsIntoItem;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/tool/misc/GregtechPump.java b/gtpp/src/main/java/gtPlusPlus/core/item/tool/misc/GregtechPump.java
new file mode 100644
index 0000000000..5ba3aa1531
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/tool/misc/GregtechPump.java
@@ -0,0 +1,1320 @@
+package gtPlusPlus.core.item.tool.misc;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidContainerItem;
+import net.minecraftforge.fluids.IFluidHandler;
+import net.minecraftforge.fluids.IFluidTank;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+import gregtech.api.interfaces.IItemBehaviour;
+import gregtech.api.interfaces.IItemContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+import ic2.api.item.IElectricItemManager;
+import ic2.api.item.ISpecialElectricItem;
+
+public class GregtechPump extends Item implements ISpecialElectricItem, IElectricItemManager, IFluidContainerItem {
+
+ /**
+ * Right Click Functions
+ */
+ @Override
+ public boolean onItemUse(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, int a4,
+ float p_77648_8_, float p_77648_9_, float p_77648_10_) {
+ if (aStack == null || aPlayer == null || aWorld == null || aWorld.isRemote) {
+ return false;
+ }
+ if (!aWorld.isRemote && tryDrainTile(aStack, aWorld, aPlayer, aX, aY, aZ)) {
+ return true;
+ } else {
+ // return super.onItemUse(aStack, aPlayer, aWorld, aX, aY, aZ, a4, p_77648_8_, p_77648_9_, p_77648_10_);
+ return false;
+ }
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_) {
+ return p_77659_1_;
+ }
+
+ /**
+ * GT Code
+ */
+
+ /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */
+ private final HashMap<Short, ArrayList<IItemBehaviour<GregtechPump>>> mItemBehaviors = new HashMap<>();
+
+ public final short mOffset, mItemAmount;
+ public final BitSet mEnabledItems;
+ public final BitSet mVisibleItems;
+ /** The unlocalized name of this item. */
+ private String unlocalizedName;
+
+ private final HashMap<Integer, IIcon> mIconMap = new LinkedHashMap<>();
+ private final HashMap<Integer, EnumRarity> rarity = new LinkedHashMap<>();
+ private final HashMap<Integer, String> itemName = new LinkedHashMap<>();
+ private final HashMap<Integer, Boolean> hasEffect = new LinkedHashMap<>();
+
+ public final HashMap<Short, Long[]> mElectricStats = new LinkedHashMap<>();
+ public final HashMap<Short, Short> mBurnValues = new LinkedHashMap<>();
+
+ public void registerPumpType(final int aID, final String aPumpName, final int aEuMax, final int aTier) {
+ ModItems.toolGregtechPump.registerItem(
+ aID, // ID
+ aPumpName, // Name
+ aEuMax, // Eu Storage
+ (short) aTier, // Tier/ Tooltip
+ aTier <= 0 ? EnumRarity.common
+ : aTier == 1 ? EnumRarity.uncommon
+ : aTier == 2 ? EnumRarity.rare : aTier == 3 ? EnumRarity.epic : EnumRarity.common, // Rarity
+ false // Effect?
+ );
+ }
+
+ public GregtechPump() {
+ this("MU-metatool.01", AddToCreativeTab.tabTools, (short) 1000, (short) 31766);
+ }
+
+ public GregtechPump(final String unlocalizedName, final CreativeTabs creativeTab, final short aOffset,
+ final short aItemAmount) {
+ this.mEnabledItems = new BitSet(aItemAmount);
+ this.mVisibleItems = new BitSet(aItemAmount);
+ this.mOffset = (short) Math.min(32766, aOffset);
+ this.mItemAmount = (short) Math.min(aItemAmount, 32766 - this.mOffset);
+ this.setHasSubtypes(true);
+ this.setMaxDamage(0);
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(creativeTab);
+ this.setMaxStackSize(1);
+ if (GameRegistry.findItem(GTPlusPlus.ID, unlocalizedName) == null) {
+ GameRegistry.registerItem(this, unlocalizedName);
+ }
+ }
+
+ public void registerItem(final int id, final String localizedName, final long euStorage, final int tier) {
+ this.registerItem(id, localizedName, euStorage, (short) tier, EnumRarity.common, false);
+ }
+
+ public void registerItem(final int id, final String localizedName, final long euStorage, final int tier,
+ final int burnTime) {
+ this.registerItem(id, localizedName, euStorage, (short) tier, EnumRarity.common, false);
+ this.setBurnValue(id, burnTime);
+ }
+
+ public void registerItem(final int id, final String localizedName, final long euStorage, final short tier,
+ final EnumRarity regRarity, final boolean Effect) {
+ this.addItem(
+ id,
+ localizedName,
+ EnumChatFormatting.GRAY + "Can be used to remove fluids from GT machine input & output slots");
+ if (euStorage > 0 && tier > 0)
+ this.setElectricStats(this.mOffset + id, euStorage, GT_Values.V[tier], tier, -3L, true);
+ this.rarity.put(id, regRarity);
+ this.itemName.put(id, localizedName);
+ this.hasEffect.put(id, Effect);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public EnumRarity getRarity(final ItemStack par1ItemStack) {
+ int h = getCorrectMetaForItemstack(par1ItemStack);
+ if (this.rarity.get(h) != null) {
+ return this.rarity.get(h);
+ }
+ return EnumRarity.common;
+ }
+
+ @Override
+ public boolean hasEffect(final ItemStack par1ItemStack, final int pass) {
+ int h = getCorrectMetaForItemstack(par1ItemStack);
+ if (this.hasEffect.get(h) != null) {
+ return this.hasEffect.get(h);
+ }
+ return false;
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Override
+ public void addInformation(final ItemStack aStack, final EntityPlayer aPlayer, List aList, final boolean aF3_H) {
+ // aList.add("Meta: "+(aStack.getItemDamage()-mOffset));
+ int aOffsetMeta = getCorrectMetaForItemstack(aStack);
+ aList.add(
+ GT_LanguageManager
+ .getTranslation("gtplusplus." + this.getUnlocalizedName(aStack) + "." + aOffsetMeta + ".tooltip"));
+
+ if (aOffsetMeta <= 3) {
+ FluidStack f = getFluid(aStack);
+ aList.add(StatCollector.translateToLocal("item.itemGregtechPump.tooltip.0"));
+ aList.add(StatCollector.translateToLocal("item.itemGregtechPump.tooltip.1"));
+ aList.add(EnumChatFormatting.DARK_GRAY + StatCollector.translateToLocal("item.itemGregtechPump.tooltip.2"));
+ aList.add(
+ EnumChatFormatting.BLUE + (f != null ? f.getLocalizedName()
+ : StatCollector.translateToLocal("item.itemGregtechPump.tooltip.3")));
+ aList.add(
+ EnumChatFormatting.BLUE + (f != null ? "" + f.amount : "" + 0)
+ + "L"
+ + " / "
+ + formatNumbers(getCapacity(aStack))
+ + "L");
+ }
+
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats != null) {
+ if (tStats[3] > 0) {
+ aList.add(
+ EnumChatFormatting.AQUA + StatCollector.translateToLocalFormatted(
+ "item.itemBaseEuItem.tooltip.1",
+ formatNumbers(tStats[3]),
+ (tStats[2] >= 0 ? tStats[2] : 0)) + EnumChatFormatting.GRAY);
+ } else {
+ final long tCharge = this.getRealCharge(aStack);
+ if ((tStats[3] == -2) && (tCharge <= 0)) {
+ aList.add(
+ EnumChatFormatting.AQUA + StatCollector.translateToLocal("item.itemBaseEuItem.tooltip.2")
+ + EnumChatFormatting.GRAY);
+ } else {
+ aList.add(
+ EnumChatFormatting.AQUA
+ + StatCollector.translateToLocalFormatted(
+ "item.itemBaseEuItem.tooltip.3",
+ formatNumbers(tCharge),
+ formatNumbers(Math.abs(tStats[0])) + " EU - Voltage: ",
+ V[(int) (tStats[2] >= 0 ? tStats[2] < V.length ? tStats[2] : V.length - 1 : 1)])
+ + EnumChatFormatting.GRAY);
+ }
+ }
+ }
+
+ final ArrayList<IItemBehaviour<GregtechPump>> tList = this.mItemBehaviors.get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final IItemBehaviour<GregtechPump> tBehavior : tList) {
+ aList = tBehavior.getAdditionalToolTips(this, aList, aStack);
+ }
+ }
+ }
+
+ @Override
+ public final Item getChargedItem(final ItemStack itemStack) {
+ return this;
+ }
+
+ @Override
+ public final Item getEmptyItem(final ItemStack itemStack) {
+ return this;
+ }
+
+ @Override
+ public final double getMaxCharge(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ return Math.abs(tStats[0]);
+ }
+
+ @Override
+ public final double getTransferLimit(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ return Math.max(tStats[1], tStats[3]);
+ }
+
+ @Override
+ public final int getTier(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ return (int) (tStats == null ? Integer.MAX_VALUE : tStats[2]);
+ }
+
+ @Override
+ public final double charge(final ItemStack aStack, final double aCharge, final int aTier,
+ final boolean aIgnoreTransferLimit, final boolean aSimulate) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats == null) || (tStats[2] > aTier)
+ || !((tStats[3] == -1) || (tStats[3] == -3) || ((tStats[3] < 0) && (aCharge == Integer.MAX_VALUE)))
+ || (aStack.stackSize != 1)) {
+ return 0;
+ }
+ final long tChargeBefore = this.getRealCharge(aStack),
+ tNewCharge = aCharge == Integer.MAX_VALUE ? Long.MAX_VALUE
+ : Math.min(
+ Math.abs(tStats[0]),
+ tChargeBefore + (aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge)));
+ if (!aSimulate) {
+ this.setCharge(aStack, tNewCharge);
+ }
+ return tNewCharge - tChargeBefore;
+ }
+
+ @Override
+ public final double discharge(final ItemStack aStack, final double aCharge, final int aTier,
+ final boolean aIgnoreTransferLimit, final boolean aBatteryAlike, final boolean aSimulate) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats == null) || (tStats[2] > aTier)) {
+ return 0;
+ }
+ if (aBatteryAlike && !this.canProvideEnergy(aStack)) {
+ return 0;
+ }
+ if (tStats[3] > 0) {
+ if ((aCharge < tStats[3]) || (aStack.stackSize < 1)) {
+ return 0;
+ }
+ if (!aSimulate) {
+ aStack.stackSize--;
+ }
+ return tStats[3];
+ }
+ final long tChargeBefore = this.getRealCharge(aStack), tNewCharge = Math
+ .max(0, tChargeBefore - (aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge)));
+ if (!aSimulate) {
+ this.setCharge(aStack, tNewCharge);
+ }
+ return tChargeBefore - tNewCharge;
+ }
+
+ @Override
+ public final double getCharge(final ItemStack aStack) {
+ return this.getRealCharge(aStack);
+ }
+
+ @Override
+ public final boolean canUse(final ItemStack aStack, final double aAmount) {
+ return this.getRealCharge(aStack) >= aAmount;
+ }
+
+ @Override
+ public final boolean use(final ItemStack aStack, final double aAmount, final EntityLivingBase aPlayer) {
+ this.chargeFromArmor(aStack, aPlayer);
+ if ((aPlayer instanceof EntityPlayer) && ((EntityPlayer) aPlayer).capabilities.isCreativeMode) {
+ return true;
+ }
+ final double tTransfer = this.discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, true);
+ if (tTransfer == aAmount) {
+ this.discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false);
+ this.chargeFromArmor(aStack, aPlayer);
+ return true;
+ }
+ this.discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false);
+ this.chargeFromArmor(aStack, aPlayer);
+ return false;
+ }
+
+ @Override
+ public final boolean canProvideEnergy(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return false;
+ }
+ return (tStats[3] > 0) || ((aStack.stackSize == 1) && ((tStats[3] == -2) || (tStats[3] == -3)));
+ }
+
+ @Override
+ public final void chargeFromArmor(final ItemStack aStack, final EntityLivingBase aPlayer) {
+ if ((aPlayer == null) || aPlayer.worldObj.isRemote) {
+ return;
+ }
+ for (int i = 1; i < 5; i++) {
+ final ItemStack tArmor = aPlayer.getEquipmentInSlot(i);
+ if (GT_ModHandler.isElectricItem(tArmor)) {
+ final IElectricItem tArmorItem = (IElectricItem) tArmor.getItem();
+ if (tArmorItem.canProvideEnergy(tArmor) && (tArmorItem.getTier(tArmor) >= this.getTier(aStack))) {
+ final double tCharge = ElectricItem.manager.discharge(
+ tArmor,
+ this.charge(aStack, Integer.MAX_VALUE - 1, Integer.MAX_VALUE, true, true),
+ Integer.MAX_VALUE,
+ true,
+ true,
+ false);
+ if (tCharge > 0) {
+ this.charge(aStack, tCharge, Integer.MAX_VALUE, true, false);
+ if (aPlayer instanceof EntityPlayer) {
+ final Container tContainer = ((EntityPlayer) aPlayer).openContainer;
+ if (tContainer != null) {
+ tContainer.detectAndSendChanges();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public final long getRealCharge(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ if (tStats[3] > 0) {
+ return (int) (long) tStats[3];
+ }
+ final NBTTagCompound tNBT = aStack.getTagCompound();
+ return tNBT == null ? 0 : tNBT.getLong("GT.ItemCharge");
+ }
+
+ public final boolean setCharge(final ItemStack aStack, long aCharge) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats == null) || (tStats[3] > 0)) {
+ return false;
+ }
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ }
+ tNBT.removeTag("GT.ItemCharge");
+ aCharge = Math.min(tStats[0] < 0 ? Math.abs(tStats[0] / 2) : aCharge, Math.abs(tStats[0]));
+ if (aCharge > 0) {
+ aStack.setItemDamage(this.getChargedMetaData(aStack));
+ tNBT.setLong("GT.ItemCharge", aCharge);
+ } else {
+ aStack.setItemDamage(this.getEmptyMetaData(aStack));
+ }
+ if (tNBT.hasNoTags()) {
+ aStack.setTagCompound(null);
+ } else {
+ aStack.setTagCompound(tNBT);
+ }
+ this.isItemStackUsable(aStack);
+ return true;
+ }
+
+ public short getChargedMetaData(final ItemStack aStack) {
+ return (short) aStack.getItemDamage();
+ }
+
+ public short getEmptyMetaData(final ItemStack aStack) {
+ return (short) aStack.getItemDamage();
+ }
+
+ public boolean isItemStackUsable(final ItemStack aStack) {
+ final ArrayList<IItemBehaviour<GregtechPump>> tList = this.mItemBehaviors.get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final IItemBehaviour<GregtechPump> tBehavior : tList) {
+ if (!tBehavior.isItemStackUsable(this, aStack)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public final String getToolTip(final ItemStack aStack) {
+ return null;
+ } // This has its own ToolTip Handler, no need to let the IC2 Handler screw us up
+ // at this Point
+
+ @Override
+ public final IElectricItemManager getManager(final ItemStack aStack) {
+ return this;
+ } // We are our own Manager
+
+ /**
+ * Sets the Furnace Burn Value for the Item.
+ *
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aValue 200 = 1 Burn Process = 500 EU, max = 32767 (that is 81917.5 EU)
+ * @return the Item itself for convenience in constructing.
+ */
+ public final GregtechPump setBurnValue(final int aMetaValue, final int aValue) {
+ if ((aMetaValue < 0) || (aValue < 0)) {
+ return this;
+ }
+ if (aValue == 0) {
+ this.mBurnValues.remove((short) aMetaValue);
+ } else {
+ this.mBurnValues.put((short) aMetaValue, aValue > Short.MAX_VALUE ? Short.MAX_VALUE : (short) aValue);
+ }
+ return this;
+ }
+
+ /**
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aMaxCharge Maximum Charge. (if this is == 0 it will remove the Electric Behavior)
+ * @param aTransferLimit Transfer Limit.
+ * @param aTier The electric Tier.
+ * @param aSpecialData If this Item has a Fixed Charge, like a SingleUse Battery (if > 0). Use -1 if you want to
+ * make this Battery chargeable (the use and canUse Functions will still discharge if you just
+ * use this) Use -2 if you want to make this Battery dischargeable. Use -3 if you want to make
+ * this Battery charge/discharge-able.
+ * @return the Item itself for convenience in constructing.
+ */
+ public final GregtechPump setElectricStats(final int aMetaValue, final long aMaxCharge, final long aTransferLimit,
+ final long aTier, final long aSpecialData, final boolean aUseAnimations) {
+ if (aMetaValue < 0) {
+ return this;
+ }
+ if (aMaxCharge == 0) {
+ this.mElectricStats.remove((short) aMetaValue);
+ } else {
+ this.mElectricStats.put(
+ (short) aMetaValue,
+ new Long[] { aMaxCharge, Math.max(0, aTransferLimit), Math.max(-1, aTier), aSpecialData });
+ }
+ return this;
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(final Item var1, final CreativeTabs aCreativeTab, final List aList) {
+ for (int i = 0, j = this.mEnabledItems.length(); i < j; i++) {
+ if (this.mVisibleItems.get(i) || (GT_Values.D1 && this.mEnabledItems.get(i))) {
+ final Long[] tStats = this.mElectricStats.get((short) (this.mOffset + i));
+ if ((tStats != null) && (tStats[3] < 0)) {
+ final ItemStack tStack = new ItemStack(this, 1, this.mOffset + i);
+ this.setCharge(tStack, Math.abs(tStats[0]));
+ this.isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ if ((tStats == null) || (tStats[3] != -2)) {
+ final ItemStack tStack = new ItemStack(this, 1, this.mOffset + i);
+ this.isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void registerIcons(final IIconRegister aIconRegister) {
+ for (short i = 0, j = (short) this.mEnabledItems.length(); i < j; i++) {
+ if (this.mEnabledItems.get(i)) {
+ mIconMap.put(
+ (int) i,
+ aIconRegister.registerIcon(GTPlusPlus.ID + ":" + (this.getUnlocalizedName() + "/" + i)));
+ }
+ }
+ }
+
+ @Override
+ public final IIcon getIconFromDamage(final int aMetaData) {
+ if (aMetaData < 0) {
+ return null;
+ }
+ if (aMetaData < this.mOffset) {
+ return mIconMap.get(0);
+ } else {
+ int newMeta = aMetaData - this.mOffset;
+ newMeta = (Math.max(0, Math.min(3, newMeta)));
+ return mIconMap.get(newMeta);
+ }
+ }
+
+ /**
+ * Sets the unlocalized name of this item to the string passed as the parameter"
+ */
+ @Override
+ public Item setUnlocalizedName(final String p_77655_1_) {
+ this.unlocalizedName = p_77655_1_;
+ super.setUnlocalizedName(p_77655_1_);
+ return this;
+ }
+
+ /**
+ * Returns the unlocalized name of this item.
+ */
+ @Override
+ public String getUnlocalizedName() {
+ return this.unlocalizedName;
+ }
+
+ public final Long[] getElectricStats(final ItemStack aStack) {
+ return this.mElectricStats.get((short) aStack.getItemDamage());
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(final ItemStack aStack, final ItemStack aBook) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(final ItemStack aStack, final ItemStack aMaterial) {
+ return false;
+ }
+
+ /**
+ * Adds a special Item Behaviour to the Item.
+ * <p/>
+ * Note: the boolean Behaviours sometimes won't be executed if another boolean Behaviour returned true before.
+ *
+ * @param aMetaValue the Meta Value of the Item you want to add it to. [0 - 32765]
+ * @param aBehavior the Click Behavior you want to add.
+ * @return the Item itself for convenience in constructing.
+ */
+ public final GregtechPump addItemBehavior(final int aMetaValue, final IItemBehaviour<GregtechPump> aBehavior) {
+ if ((aMetaValue < 0) || (aMetaValue >= 32766) || (aBehavior == null)) {
+ return this;
+ }
+ ArrayList<IItemBehaviour<GregtechPump>> tList = this.mItemBehaviors.get((short) aMetaValue);
+ if (tList == null) {
+ tList = new ArrayList<>(1);
+ this.mItemBehaviors.put((short) aMetaValue, tList);
+ }
+ tList.add(aBehavior);
+ return this;
+ }
+
+ /**
+ * This adds a Custom Item to the ending Range.
+ *
+ * @param aID The Id of the assigned Item [0 - mItemAmount] (The MetaData gets auto-shifted by +mOffset)
+ * @param aEnglish The Default Localized Name of the created Item
+ * @param aToolTip The Default ToolTip of the created Item, you can also insert null for having no ToolTip
+ * @param aFoodBehavior The Food Value of this Item. Can be null aswell. Just a convenience thing.
+ * @param aRandomData The OreDict Names you want to give the Item. Also used for TC Aspects and some other things.
+ * @return An ItemStack containing the newly created Item.
+ */
+ @SuppressWarnings("unchecked")
+ public final ItemStack addItem(final int aID, final String aEnglish, String aToolTip, final Object... aRandomData) {
+ if (aToolTip == null) {
+ aToolTip = "";
+ }
+ if ((aID >= 0) && (aID < this.mItemAmount)) {
+ final ItemStack rStack = new ItemStack(this, 1, this.mOffset + aID);
+ GT_ModHandler.registerBoxableItemToToolBox(rStack);
+ this.mEnabledItems.set(aID);
+ this.mVisibleItems.set(aID);
+ GT_LanguageManager
+ .addStringLocalization("gtplusplus." + this.getUnlocalizedName(rStack) + "." + aID + ".name", aEnglish);
+ GT_LanguageManager.addStringLocalization(
+ "gtplusplus." + this.getUnlocalizedName(rStack) + "." + aID + ".tooltip",
+ aToolTip);
+ final List<TC_AspectStack> tAspects = new ArrayList<>();
+ // Important Stuff to do first
+ for (final Object tRandomData : aRandomData) {
+ if (tRandomData instanceof SubTag) {
+ if (tRandomData == SubTag.INVISIBLE) {
+ this.mVisibleItems.set(aID, false);
+ continue;
+ }
+ if (tRandomData == SubTag.NO_UNIFICATION) {
+ GT_OreDictUnificator.addToBlacklist(rStack);
+ continue;
+ }
+ }
+ }
+ // now check for the rest
+ for (final Object tRandomData : aRandomData) {
+ if (tRandomData != null) {
+ boolean tUseOreDict = true;
+ if (tRandomData instanceof IItemBehaviour) {
+ this.addItemBehavior(this.mOffset + aID, (IItemBehaviour<GregtechPump>) tRandomData);
+ tUseOreDict = false;
+ }
+ if (tRandomData instanceof IItemContainer) {
+ ((IItemContainer) tRandomData).set(rStack);
+ tUseOreDict = false;
+ }
+ if (tRandomData instanceof SubTag) {
+ continue;
+ }
+ if (tRandomData instanceof TC_AspectStack) {
+ ((TC_AspectStack) tRandomData).addToAspectList(tAspects);
+ continue;
+ }
+ if (tRandomData instanceof ItemData) {
+ if (GT_Utility.isStringValid(tRandomData)) {
+ GT_OreDictUnificator.registerOre(tRandomData, rStack);
+ } else {
+ GT_OreDictUnificator.addItemData(rStack, (ItemData) tRandomData);
+ }
+ continue;
+ }
+ if (tUseOreDict) {
+ GT_OreDictUnificator.registerOre(tRandomData, rStack);
+ continue;
+ }
+ }
+ }
+ if (GregTech_API.sThaumcraftCompat != null) {
+ GregTech_API.sThaumcraftCompat.registerThaumcraftAspectsToItem(rStack, tAspects, false);
+ }
+ return rStack;
+ }
+ return null;
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack aStack) {
+ int keyValue = (getCorrectMetaForItemstack(aStack));
+ if (keyValue < 0 || keyValue > 3) {
+ keyValue = 0;
+ }
+ return GT_LanguageManager
+ .getTranslation("gtplusplus." + this.getUnlocalizedName(aStack) + "." + keyValue + ".name");
+ }
+
+ /**
+ * Fluid Handling
+ */
+
+ /*
+ * IFluidContainer Functions
+ */
+
+ public void emptyStoredFluid(ItemStack aStack) {
+ if (aStack.hasTagCompound()) {
+ NBTTagCompound t = aStack.getTagCompound();
+ if (t.hasKey("mInit")) {
+ t.removeTag("mInit");
+ }
+ if (t.hasKey("mFluid")) {
+ t.removeTag("mFluid");
+ }
+ if (t.hasKey("mFluidAmount")) {
+ t.removeTag("mFluidAmount");
+ }
+ }
+ }
+
+ public void storeFluid(ItemStack aStack, FluidStack aFluid) {
+ if (aFluid == null) {
+ return;
+ } else {
+ String fluidname = aFluid.getFluid()
+ .getName();
+ int amount = aFluid.amount;
+ if (fluidname != null && fluidname.length() > 0 && amount > 0) {
+ NBTUtils.setString(aStack, "mFluid", fluidname);
+ NBTUtils.setInteger(aStack, "mFluidAmount", amount);
+ }
+ }
+ }
+
+ @Override
+ public FluidStack getFluid(ItemStack container) {
+ if (!container.hasTagCompound() || !container.getTagCompound()
+ .hasKey("mInit")) {
+ initNBT(container);
+ }
+ if (container.getTagCompound()
+ .hasKey("mInit")
+ && container.getTagCompound()
+ .getBoolean("mInit")) {
+ String fluidname;
+ Integer amount = 0;
+ fluidname = NBTUtils.getString(container, "mFluid");
+ amount = NBTUtils.getInteger(container, "mFluidAmount");
+ if (fluidname != null && amount != null && amount > 0) {
+ return FluidUtils.getFluidStack(fluidname, amount);
+ } else {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public int getCapacity(ItemStack container) {
+ if (!container.hasTagCompound() || !container.getTagCompound()
+ .hasKey("mInit")) {
+ initNBT(container);
+ }
+ if (container.getTagCompound()
+ .hasKey("mInit")
+ && container.getTagCompound()
+ .getBoolean("mInit")) {
+ return container.getTagCompound()
+ .getInteger("mCapacity");
+ }
+ int aMeta = this.getCorrectMetaForItemstack(container);
+ int aCapacity = (aMeta == 0 ? 2000 : (aMeta == 1 ? 8000 : (aMeta == 2 ? 32000 : 128000)));
+ return aCapacity;
+ }
+
+ public int fill(ItemStack container, FluidStack resource) {
+ return fill(container, resource, true);
+ }
+
+ @Override
+ public int fill(ItemStack container, FluidStack resource, boolean doFill) {
+ if (!doFill || resource == null) {
+ return 0;
+ }
+
+ if (!container.hasTagCompound() || !container.getTagCompound()
+ .hasKey("mInit")) {
+ initNBT(container);
+ }
+ if (container.getTagCompound()
+ .hasKey("mInit")
+ && container.getTagCompound()
+ .getBoolean("mInit")) {
+ String aStored;
+ int aStoredAmount = 0;
+ int aCapacity = getCapacity(container);
+ FluidStack aStoredFluid = getFluid(container);
+ if (aStoredFluid != null) {
+ aStored = aStoredFluid.getFluid()
+ .getName();
+ aStoredAmount = aStoredFluid.amount;
+ if (aStoredAmount == aCapacity) {
+ return 0;
+ }
+ }
+ // Handle no stored fluid first
+ if (aStoredFluid == null) {
+ Logger.INFO("Pump is empty, filling with tank fluids.");
+ FluidStack toConsume;
+ int amountToConsume = 0;
+ if (resource.amount >= aCapacity) {
+ amountToConsume = aCapacity;
+ } else {
+ amountToConsume = resource.amount;
+ }
+ toConsume = FluidUtils.getFluidStack(resource, amountToConsume);
+ if (toConsume != null && amountToConsume > 0) {
+ storeFluid(container, toConsume);
+ return amountToConsume;
+ }
+ } else {
+ Logger.INFO("Pump is Partially full, filling with tank fluids.");
+ if (aStoredFluid.isFluidEqual(resource)) {
+ Logger.INFO("Found matching fluids.");
+ int aSpaceLeft = (aCapacity - aStoredAmount);
+ Logger.INFO(
+ "Capacity: " + aCapacity + " | Stored: " + aStoredAmount + " | Space left: " + aSpaceLeft);
+ FluidStack toConsume;
+ int amountToConsume = 0;
+ if (resource.amount >= aSpaceLeft) {
+ amountToConsume = aSpaceLeft;
+ Logger.INFO("More or equal fluid amount to pump container space.");
+ } else {
+ amountToConsume = resource.amount;
+ Logger.INFO("Less fluid than container space");
+ }
+ Logger.INFO("Amount to consume: " + amountToConsume);
+ toConsume = FluidUtils.getFluidStack(resource, (aStoredAmount + amountToConsume));
+ if (toConsume != null && amountToConsume > 0) {
+ Logger.INFO("Storing Fluid");
+ storeFluid(container, toConsume);
+ return amountToConsume;
+ } else {
+ Logger.INFO("Not storing fluid");
+ }
+ } else {
+ Logger.INFO("Fluids did not match.");
+ }
+ }
+ }
+ return 0;
+ }
+
+ public FluidStack drain(ItemStack container, int drainAmt) {
+ return drain(container, drainAmt, true);
+ }
+
+ @Override
+ public FluidStack drain(ItemStack container, int maxDrain, boolean doDrain) {
+ if (!doDrain || maxDrain == 0) {
+ return null;
+ }
+ if (!container.hasTagCompound() || !container.getTagCompound()
+ .hasKey("mInit")) {
+ initNBT(container);
+ }
+ if (container.getTagCompound()
+ .hasKey("mInit")
+ && container.getTagCompound()
+ .getBoolean("mInit")) {
+
+ String aStored;
+ int aStoredAmount = 0;
+ FluidStack aStoredFluid = getFluid(container);
+
+ if (aStoredFluid != null) {
+ aStored = aStoredFluid.getFluid()
+ .getName();
+ aStoredAmount = aStoredFluid.amount;
+ }
+ // We cannot drain this if it's empty.
+ else if (aStoredFluid == null) {
+ return null;
+ }
+
+ if (maxDrain >= aStoredAmount) {
+ emptyStoredFluid(container);
+ return aStoredFluid;
+ } else {
+ // Handle Partial removal
+ int amountRemaining = (aStoredAmount - maxDrain);
+ if (amountRemaining == 0) {
+ emptyStoredFluid(container);
+ } else {
+ FluidStack newAmount = FluidUtils.getFluidStack(aStoredFluid, amountRemaining);
+ FluidStack drained = FluidUtils.getFluidStack(aStoredFluid, maxDrain);
+ if (newAmount != null && drained != null) {
+ storeFluid(container, newAmount);
+ return drained;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ /*
+ * Handle ItemStack NBT
+ */
+
+ public void initNBT(ItemStack aStack) {
+ NBTTagCompound aNewNBT;
+ if (!aStack.hasTagCompound()) {
+ aNewNBT = new NBTTagCompound();
+ } else {
+ aNewNBT = aStack.getTagCompound();
+ }
+
+ if (!aNewNBT.hasKey("mInit")) {
+ int aMeta = this.getCorrectMetaForItemstack(aStack);
+ aNewNBT.setInteger("mMeta", aMeta);
+ aNewNBT.setBoolean("mInit", true);
+ aNewNBT.setString("mFluid", "@@@@@");
+ aNewNBT.setInteger("mFluidAmount", 0);
+ int aCapacity = (aMeta == 0 ? 2000 : (aMeta == 1 ? 8000 : (aMeta == 2 ? 32000 : 128000)));
+ aNewNBT.setInteger("mCapacity", aCapacity);
+ aStack.setTagCompound(aNewNBT);
+ }
+ }
+
+ /**
+ * Tile Handling
+ */
+
+ /*
+ * Custom Fluid Handling for Tiles and GT Tiles.
+ */
+
+ public boolean tryDrainTile(ItemStack aStack, World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ) {
+ try {
+ if (aWorld.isRemote || aStack == null) {
+ return false;
+ } else {
+ int aTier = (aStack.getItemDamage() - 1000);
+ int removal;
+ if (aTier == 0) {
+ removal = 0;
+ } else if (aTier == 1) {
+ removal = 32;
+ } else if (aTier == 2) {
+ removal = 128;
+ } else if (aTier == 3) {
+ removal = 512;
+ } else {
+ removal = 8;
+ }
+ if (!canUse(aStack, removal) && aTier > 0) {
+ PlayerUtils.messagePlayer(aPlayer, "Not enough power.");
+ Logger.INFO("No Power");
+ return false;
+ }
+
+ final Block aBlock = aWorld.getBlock(aX, aY, aZ);
+ if (aBlock == null) {
+ return false;
+ }
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity == null) {
+ return false;
+ } else {
+ double aCharge = this.getCharge(aStack);
+ boolean didDrain = false;
+ if (aTier > 0 && aCharge > 0) {
+ if (discharge(aStack, removal, aTier, true, true, false) > 0) {
+ didDrain = true;
+ }
+ } else if (aTier == 0) {
+ didDrain = true;
+ } else {
+ didDrain = false;
+ }
+
+ if (didDrain) {
+ if ((tTileEntity instanceof IGregTechTileEntity)) {
+ return this.drainTankGT(tTileEntity, aStack, aWorld, aPlayer, aX, aY, aZ);
+ }
+ // Try support Standard Fluid Tanks too (May disable if dupes appear again)
+ else if ((tTileEntity instanceof IFluidTank || tTileEntity instanceof IFluidHandler)) {
+ // return this.drainIFluidTank(tTileEntity, aStack, aWorld, aPlayer, aX, aY, aZ);
+ return false;
+ }
+ }
+ }
+ }
+ } catch (Throwable t) {}
+ return false;
+ }
+
+ /*
+ * Vanilla IFluidTank
+ */
+
+ public boolean drainIFluidTank(TileEntity tTileEntity, ItemStack aStack, World aWorld, EntityPlayer aPlayer, int aX,
+ int aY, int aZ) {
+ if (tTileEntity == null) {
+ Logger.INFO("Invalid Tile, somehow.");
+ return false;
+ }
+ if ((tTileEntity instanceof IFluidTank || tTileEntity instanceof IFluidHandler)) {
+ if (this.getFluid(aStack) == null
+ || (this.getFluid(aStack) != null && this.getFluid(aStack).amount < this.getCapacity(aStack))) {
+ Logger.INFO("Trying to find Stored Fluid - Behaviour Class.");
+ FluidStack aStored = getStoredFluidOfVanillaTank(tTileEntity);
+ if (aStored != null) {
+ int mAmountInserted = fill(aStack, aStored);
+ FluidStack newStackRemainingInTank;
+ if (mAmountInserted > 0) {
+ if (mAmountInserted == aStored.amount) {
+ newStackRemainingInTank = null;
+ } else {
+ newStackRemainingInTank = FluidUtils
+ .getFluidStack(aStored, (aStored.amount - mAmountInserted));
+ }
+ boolean b = setStoredFluidOfVanillaTank(tTileEntity, newStackRemainingInTank);
+ Logger.INFO("Cleared Tank? " + b + " | mAmountInserted: " + mAmountInserted);
+ Logger.INFO("Returning " + b + " - drainTankVanilla.");
+ if (b) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Drained " + mAmountInserted + "L of " + aStored.getLocalizedName() + ".");
+ }
+ return b;
+ }
+ } else {
+ Logger.INFO("Found no valid Fluidstack - drainTankVanilla.");
+ }
+ } else {
+ Logger.INFO("Pump is full.");
+ }
+ }
+ Logger.INFO("Could not drain vanilla tank.");
+ return false;
+ }
+
+ /*
+ * GT Tanks
+ */
+
+ public boolean drainTankGT(TileEntity tTileEntity, ItemStack aStack, World aWorld, EntityPlayer aPlayer, int aX,
+ int aY, int aZ) {
+ if (tTileEntity == null) {
+ return false;
+ }
+ if ((tTileEntity instanceof IGregTechTileEntity)) {
+ Logger.INFO("Right Clicking on GT Tile - drainTankGT.");
+ if (((IGregTechTileEntity) tTileEntity).getTimer() < 50L) {
+ Logger.INFO("Returning False - Behaviour Class. Timer < 50");
+ return false;
+ } else if ((!aWorld.isRemote) && (!((IGregTechTileEntity) tTileEntity).isUseableByPlayer(aPlayer))) {
+ Logger.INFO("Returning True - drainTankGT. NotUsable()");
+ return true;
+ } else {
+ if (this.getFluid(aStack) == null
+ || (this.getFluid(aStack) != null && this.getFluid(aStack).amount < this.getCapacity(aStack))) {
+ Logger.INFO("Trying to find Stored Fluid - drainTankGT.");
+ FluidStack aStored = getStoredFluidOfGTMachine((IGregTechTileEntity) tTileEntity);
+ if (aStored != null) {
+ int mAmountInserted = fill(aStack, aStored);
+ FluidStack newStackRemainingInTank;
+ if (mAmountInserted > 0) {
+ if (mAmountInserted == aStored.amount) {
+ newStackRemainingInTank = null;
+ } else {
+ newStackRemainingInTank = FluidUtils
+ .getFluidStack(aStored, (aStored.amount - mAmountInserted));
+ }
+ boolean b = setStoredFluidOfGTMachine(
+ (IGregTechTileEntity) tTileEntity,
+ newStackRemainingInTank);
+ Logger.INFO("Cleared Tank? " + b + " | mAmountInserted: " + mAmountInserted);
+ Logger.INFO("Returning " + b + " - drainTankGT.");
+ if (b) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Drained " + mAmountInserted + "L of " + aStored.getLocalizedName() + ".");
+ } else {
+ drain(aStack, mAmountInserted);
+ }
+ return b;
+ }
+ } else {
+ Logger.INFO("Found no valid Fluidstack - drainTankGT.");
+ }
+ } else {
+ Logger.INFO("Pump is full.");
+ }
+ }
+ }
+ Logger.INFO("Could not drain GT tank.");
+ return false;
+ }
+
+ /*
+ * Vanilla Tanks
+ */
+
+ public FluidStack getStoredFluidOfVanillaTank(TileEntity aTileEntity) {
+ if (aTileEntity == null) {
+ return null;
+ } else if ((aTileEntity instanceof IFluidTank || aTileEntity instanceof IFluidHandler)) {
+ if (aTileEntity instanceof IFluidTank) {
+ return getStoredFluidOfVanillaTank((IFluidTank) aTileEntity);
+ } else {
+ return getStoredFluidOfVanillaTank((IFluidHandler) aTileEntity);
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public FluidStack getStoredFluidOfVanillaTank(IFluidTank aTileEntity) {
+ FluidStack f = aTileEntity.getFluid();
+ Logger.INFO(
+ "Returning Fluid stack from tile. Found: "
+ + (f != null ? f.getLocalizedName() + " - " + f.amount + "L" : "Nothing"));
+ return f;
+ }
+
+ public FluidStack getStoredFluidOfVanillaTank(IFluidHandler aTileEntity) {
+ if (aTileEntity instanceof IFluidTank) {
+ return getStoredFluidOfVanillaTank((IFluidTank) aTileEntity);
+ }
+ FluidStack f;
+ AutoMap<FluidTankInfo[]> m = new AutoMap<>();
+ for (int i = 0; i < 6; i++) {
+ m.put(aTileEntity.getTankInfo(ForgeDirection.getOrientation(i)));
+ }
+ if (m.get(0) != null && m.get(0)[0] != null && m.get(0)[0].fluid != null) {
+ return m.get(0)[0].fluid;
+ } else {
+ return null;
+ }
+ }
+
+ public boolean setStoredFluidOfVanillaTank(TileEntity aTileEntity, FluidStack aSetFluid) {
+ Logger.INFO("Trying to clear Tile's tank. - Behaviour Class. [1]");
+
+ if (aTileEntity == null) {
+ return false;
+ } else if ((aTileEntity instanceof IFluidTank || aTileEntity instanceof IFluidHandler)) {
+ if (aTileEntity instanceof IFluidTank) {
+ Logger.INFO("Tile Was instanceof IFluidTank.");
+ FluidStack f = ((IFluidTank) aTileEntity).getFluid();
+ if (aSetFluid == null) {
+ aSetFluid = f;
+ aSetFluid.amount = f.amount;
+ }
+ int toDrain = (f.amount - aSetFluid.amount);
+ FluidStack newStack;
+ if (toDrain <= 0) {
+ newStack = f;
+ } else {
+ newStack = ((IFluidTank) aTileEntity).drain(toDrain, true);
+ }
+
+ if (newStack.isFluidEqual(aSetFluid) && newStack.amount == aSetFluid.amount) {
+ Logger.INFO("Removed fluid from vanilla IFluidTank successfully.");
+ return true;
+ } else {
+ Logger.INFO("Failed trying to remove fluid from vanilla IFluidTank.");
+ return false;
+ }
+ } else {
+
+ // Rewrite Fluid handling for Vanilla type tanks
+ if (!IFluidHandler.class.isInstance(aTileEntity)) {
+ Logger.INFO("Tile Was not an instance of IFluidHandler.");
+ return false;
+ }
+
+ IFluidHandler aTank = (IFluidHandler) aTileEntity;
+ FluidStack aTankContents = null;
+ FluidTankInfo[] a1 = aTank.getTankInfo(ForgeDirection.UNKNOWN);
+ if (a1 != null) {
+ if (a1[0] != null) {
+ aTankContents = a1[0].fluid;
+ Logger.INFO(
+ "Found Fluid in Tank. " + aTankContents.getLocalizedName() + " - " + aTankContents.amount);
+ }
+ }
+ if (aSetFluid == null) {
+ Logger.INFO("Setting fluid to tank contents, as we're going to empty it totally.");
+ aSetFluid = aTankContents.copy();
+ } else {
+ Logger.INFO("Setting fluid to tank contents, as we're going to empty it totally.");
+ }
+ Logger.INFO(
+ "Tile Was instance of IFluidHandler. Trying to Drain " + aSetFluid.getLocalizedName()
+ + " - "
+ + aSetFluid.amount);
+
+ if (a1 == null || aTankContents == null) {
+ Logger.INFO("Tank is empty.");
+ return false;
+ }
+ // Found some Fluid in the tank
+ else {
+ FluidStack aDrainedStack = aTank.drain(ForgeDirection.UNKNOWN, aSetFluid, true);
+ if (aDrainedStack.isFluidStackIdentical(aSetFluid)) {
+ Logger.INFO("Drained!");
+ return true;
+ } else {
+ Logger.INFO("Partially Drained! This is probably an error.");
+ return true;
+ }
+ }
+ }
+ } else {
+ Logger.INFO("Bad Tank Tile to drain.");
+ return false;
+ }
+ }
+
+ /*
+ * GT Tanks
+ */
+
+ public FluidStack getStoredFluidOfGTMachine(IGregTechTileEntity aTileEntity) {
+ if (aTileEntity == null) {
+ return null;
+ }
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();;
+ if (aMetaTileEntity == null || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_MultiInput) {
+ // blacklist multiinput hatch as it's too complex
+ return null;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_BasicTank) {
+ Logger.INFO("Tile Was Instanceof BasicTank.");
+ return getStoredFluidOfGTMachine((GT_MetaTileEntity_BasicTank) aMetaTileEntity);
+ } else {
+ return null;
+ }
+ }
+
+ public FluidStack getStoredFluidOfGTMachine(GT_MetaTileEntity_BasicTank aTileEntity) {
+ FluidStack f = aTileEntity.mFluid;
+
+ // Let's see if this machine has output fluid too
+ /*
+ * if (f == null) { Logger.INFO("Could not find any input fluid, checking output if possible."); if (aTileEntity
+ * instanceof GT_MetaTileEntity_BasicMachine) { GT_MetaTileEntity_BasicMachine g =
+ * (GT_MetaTileEntity_BasicMachine) aTileEntity;
+ * Logger.INFO("Tile is a Basic Machine of some sort - "+g.mNEIName); if (g != null) { f = g.mOutputFluid; if (f
+ * != null) { Logger.INFO("Found output fluid! "+f.getLocalizedName()); } else {
+ * Logger.INFO("Did not find anything!"); f = g.getFluid(); if (f != null) {
+ * Logger.INFO("Found fluid! "+f.getLocalizedName()); } else { Logger.INFO("Did not find anything!"); f =
+ * g.getFluid(); } } } } }
+ */
+
+ Logger.INFO(
+ "Returning Fluid stack from tile. Found: "
+ + (f != null ? f.getLocalizedName() + " - " + f.amount + "L" : "Nothing"));
+ return f;
+ }
+
+ public boolean setStoredFluidOfGTMachine(IGregTechTileEntity aTileEntity, FluidStack aSetFluid) {
+ Logger.INFO("Trying to clear Tile's tank. - Behaviour Class. [1]");
+ if (aTileEntity == null) {
+ return false;
+ }
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_BasicTank) {
+ Logger.INFO("Trying to clear Tile's tank. - Behaviour Class. [2]");
+ return setStoredFluidOfGTMachine((GT_MetaTileEntity_BasicTank) aMetaTileEntity, aSetFluid);
+ } else {
+ return false;
+ }
+ }
+
+ public boolean setStoredFluidOfGTMachine(GT_MetaTileEntity_BasicTank aTileEntity, FluidStack aSetFluid) {
+ try {
+
+ // Try Handle Outputs First
+ /*
+ * if (aTileEntity.setDrainableStack(aSetFluid) != null) { return true; }
+ */
+
+ aTileEntity.mFluid = aSetFluid;
+ boolean b = aTileEntity.mFluid == aSetFluid;
+ Logger.INFO("Trying to set Tile's tank. - Behaviour Class. [3] " + b);
+ return b;
+ } catch (Throwable t) {
+ Logger.INFO("Trying to clear Tile's tank. FAILED - Behaviour Class. [x]");
+ return false;
+ }
+ }
+
+ public int getCorrectMetaForItemstack(ItemStack aStack) {
+ if (aStack == null) {
+ return 0;
+ } else {
+ if (aStack.getItemDamage() < this.mOffset) {
+ return 0;
+ } else {
+ int newMeta = aStack.getItemDamage() - this.mOffset;
+ newMeta = (Math.max(0, Math.min(3, newMeta)));
+ return newMeta;
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/wearable/WearableLoader.java b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/WearableLoader.java
new file mode 100644
index 0000000000..8044b4364f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/WearableLoader.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.core.item.wearable;
+
+import gtPlusPlus.core.item.wearable.armour.ArmourLoader;
+
+public class WearableLoader {
+
+ public static void run() {
+ execute();
+ }
+
+ private static void execute() {
+ ArmourLoader.run();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/ArmourLoader.java b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/ArmourLoader.java
new file mode 100644
index 0000000000..e929d6cb7f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/ArmourLoader.java
@@ -0,0 +1,38 @@
+package gtPlusPlus.core.item.wearable.armour;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemArmor.ArmorMaterial;
+import net.minecraftforge.common.util.EnumHelper;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.item.wearable.armour.tinfoil.ArmourTinFoilHat;
+
+public class ArmourLoader {
+
+ // Glass
+ public static Item ClearGlassChestplate;
+ public static Item ClearGlassBoots;
+ public static Item ClearGlassLeggings;
+ public static Item ClearGlassHelmet;
+
+ // Tin Foil
+ public static Item TinFoilHat;
+
+ public static ArmorMaterial ClearGlassArmour = EnumHelper
+ .addArmorMaterial("ClearGlassArmor", 1, new int[] { 1, 1, 1, 1 }, 100);
+ public static ArmorMaterial TinFoilArmour = EnumHelper.addArmorMaterial("TINFOIL", 5, new int[] { 1, 1, 1, 1 }, 50);
+
+ public static void run() {
+ glassArmour();
+ tinfoilArmour();
+ }
+
+ private static void glassArmour() {}
+
+ private static void tinfoilArmour() {
+ TinFoilHat = new ArmourTinFoilHat().setUnlocalizedName("itemHatTinFoil");
+ GameRegistry.registerItem(TinFoilHat, "itemHatTinFoil", GTPlusPlus.ID);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmour.java b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmour.java
new file mode 100644
index 0000000000..e7ce975eca
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmour.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.item.wearable.armour.base;
+
+import gtPlusPlus.core.item.wearable.base.BaseItemWearable;
+
+public abstract class BaseArmour extends BaseItemWearable {
+
+ public BaseArmour(ArmorMaterial material, int renderIndex, int armourType) {
+ super(material, renderIndex, armourType);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmourHelm.java b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmourHelm.java
new file mode 100644
index 0000000000..d121a90ade
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/base/BaseArmourHelm.java
@@ -0,0 +1,9 @@
+package gtPlusPlus.core.item.wearable.armour.base;
+
+public abstract class BaseArmourHelm extends BaseArmour {
+
+ public BaseArmourHelm(ArmorMaterial material, int renderIndex) {
+ super(material, renderIndex, 0);
+ // TODO Auto-generated constructor stub
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/tinfoil/ArmourTinFoilHat.java b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/tinfoil/ArmourTinFoilHat.java
new file mode 100644
index 0000000000..0703ac3b93
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/armour/tinfoil/ArmourTinFoilHat.java
@@ -0,0 +1,179 @@
+package gtPlusPlus.core.item.wearable.armour.tinfoil;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.item.EntityBoat;
+import net.minecraft.entity.item.EntityEnderEye;
+import net.minecraft.entity.item.EntityEnderPearl;
+import net.minecraft.entity.item.EntityExpBottle;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.item.EntityXPOrb;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityEgg;
+import net.minecraft.entity.projectile.EntityFireball;
+import net.minecraft.entity.projectile.EntitySnowball;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.item.wearable.armour.ArmourLoader;
+import gtPlusPlus.core.item.wearable.armour.base.BaseArmourHelm;
+
+public class ArmourTinFoilHat extends BaseArmourHelm {
+
+ public IIcon iconHelm;
+
+ public ArmourTinFoilHat() {
+ super(ArmourLoader.TinFoilArmour, 0);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister ir) {
+ this.iconHelm = ir.registerIcon(GTPlusPlus.ID + ":itemHatTinFoil");
+ }
+
+ @Override
+ public int getRenderIndex() {
+ return 0;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIconFromDamage(int par1) {
+ return this.iconHelm;
+ }
+
+ @Override
+ public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) {
+ return GTPlusPlus.ID + ":textures/models/TinFoil.png";
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack itemstack) {
+ return EnumRarity.uncommon;
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) {
+ return false;
+ }
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
+ return super.getArmorDisplay(player, armor, slot);
+ }
+
+ @Override
+ public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) {}
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List aList, boolean p_77624_4_) {
+ aList.add("DoomSquirter's protection against cosmic radiation!");
+ aList.add("General paranoia makes the wearer unable to collect xp");
+ aList.add("Movement speed is also reduced, to keep you safe");
+ aList.add("This hat may also have other strange powers");
+ }
+
+ @Override
+ public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage,
+ int slot) {
+ return new ArmorProperties(0, 0, 0);
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public boolean itemInteractionForEntity(ItemStack p_111207_1_, EntityPlayer p_111207_2_,
+ EntityLivingBase p_111207_3_) {
+ return super.itemInteractionForEntity(p_111207_1_, p_111207_2_, p_111207_3_);
+ }
+
+ @Override
+ public void onUpdate(ItemStack aStack, World aWorld, Entity aEntity, int p_77663_4_, boolean p_77663_5_) {
+ super.onUpdate(aStack, aWorld, aEntity, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public boolean onEntityItemUpdate(EntityItem entityItem) {
+ return super.onEntityItemUpdate(entityItem);
+ }
+
+ @Override
+ public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
+ if (itemStack != null && player != null && world != null && !world.isRemote) {
+ if (player instanceof EntityPlayer) {
+
+ // Apply Slow
+ if (!GT_Utility.getPotion(player, Potion.moveSlowdown.id)) {
+ player.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 2, 1, true));
+ }
+
+ // Move Xp orbs away
+ try {
+ AxisAlignedBB box = player.boundingBox;
+ box.maxX = player.posX + 5;
+ box.maxY = player.posY + 5;
+ box.maxZ = player.posZ + 5;
+ box.minX = player.posX - 5;
+ box.minY = player.posY - 5;
+ box.minZ = player.posZ - 5;
+ @SuppressWarnings("unchecked")
+ List<Entity> g = world.getEntitiesWithinAABBExcludingEntity(player, box);
+ if (g.size() > 0) {
+ for (Entity e : g) {
+ if (e != null) {
+ if (!EntityXPOrb.class.isInstance(e) && !EntityBoat.class.isInstance(e)
+ && !EntitySnowball.class.isInstance(e)
+ && !EntityFireball.class.isInstance(e)
+ && !EntityEgg.class.isInstance(e)
+ && !EntityExpBottle.class.isInstance(e)
+ && !EntityEnderEye.class.isInstance(e)
+ && !EntityEnderPearl.class.isInstance(e)) {
+ continue;
+ } else {
+ // Logger.INFO("Found "+e.getClass().getName());
+ double distX = player.posX - e.posX;
+ double distZ = player.posZ - e.posZ;
+ double distY = e.posY + 1.5D - player.posY;
+ double dir = Math.atan2(distZ, distX);
+ double speed = 1F / e.getDistanceToEntity(player) * 0.5;
+ speed = -speed;
+ if (distY < 0) {
+ e.motionY += speed;
+ }
+ e.motionX = Math.cos(dir) * speed;
+ e.motionZ = Math.sin(dir) * speed;
+ }
+ }
+ }
+ }
+ } catch (Throwable t) {}
+ }
+ }
+
+ super.onArmorTick(world, player, itemStack);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/wearable/base/BaseItemWearable.java b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/base/BaseItemWearable.java
new file mode 100644
index 0000000000..84b1d2ff51
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/base/BaseItemWearable.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.core.item.wearable.base;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemArmor;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.DamageSource;
+import net.minecraftforge.common.ISpecialArmor;
+
+public abstract class BaseItemWearable extends ItemArmor implements ISpecialArmor {
+
+ public BaseItemWearable(ArmorMaterial material, int renderIndex, int armourType) {
+ super(material, renderIndex, armourType);
+ }
+
+ public abstract int getRenderIndex();
+
+ @Override
+ public abstract ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source,
+ double damage, int slot);
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public abstract void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage,
+ int slot);
+
+ public void dyeArmour(ItemStack aArmour, int aColour) {
+ func_82813_b(aArmour, aColour);
+ }
+
+ @Override
+ public void func_82813_b(ItemStack p_82813_1_, int p_82813_2_) {
+ NBTTagCompound nbttagcompound = p_82813_1_.getTagCompound();
+ if (nbttagcompound == null) {
+ nbttagcompound = new NBTTagCompound();
+ p_82813_1_.setTagCompound(nbttagcompound);
+ }
+ NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display");
+ if (!nbttagcompound.hasKey("display", 10)) {
+ nbttagcompound.setTag("display", nbttagcompound1);
+ }
+ nbttagcompound1.setInteger("color", p_82813_2_);
+ }
+
+ @Override
+ public void removeColor(ItemStack p_82815_1_) {
+ NBTTagCompound nbttagcompound = p_82815_1_.getTagCompound();
+ if (nbttagcompound != null) {
+ NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display");
+ if (nbttagcompound1.hasKey("color")) {
+ nbttagcompound1.removeTag("color");
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/item/wearable/hazmat/ItemArmorHazmatEx.java b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/hazmat/ItemArmorHazmatEx.java
new file mode 100644
index 0000000000..e01c89d827
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/item/wearable/hazmat/ItemArmorHazmatEx.java
@@ -0,0 +1,35 @@
+package gtPlusPlus.core.item.wearable.hazmat;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.ic2.CustomInternalName;
+import ic2.core.IC2;
+import ic2.core.init.InternalName;
+import ic2.core.item.armor.ItemArmorHazmat;
+
+public class ItemArmorHazmatEx extends ItemArmorHazmat {
+
+ public static void init() {
+ GregtechItemList.Armour_Hazmat_Advanced_Helmet
+ .set(new ItemStack(new ItemArmorHazmatEx(CustomInternalName.aHazmatHelmetEx, 0)));
+ GregtechItemList.Armour_Hazmat_Advanced_Chest
+ .set(new ItemStack(new ItemArmorHazmatEx(CustomInternalName.aHazmatChestEx, 1)));
+ GregtechItemList.Armour_Hazmat_Advanced_Legs
+ .set(new ItemStack(new ItemArmorHazmatEx(CustomInternalName.aHazmatLegsEx, 2)));
+ GregtechItemList.Armour_Hazmat_Advanced_Boots
+ .set(new ItemStack(new ItemArmorHazmatEx(CustomInternalName.aHazmatBootsEx, 3)));
+ }
+
+ private ItemArmorHazmatEx(InternalName internalName, int type) {
+ super(internalName, type);
+ this.setMaxDamage(256);
+ }
+
+ @Override
+ public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) {
+ int suffix = this.armorType == 2 ? 2 : 1;
+ return IC2.textureDomain + ":textures/armor/" + "hazmatEx_" + suffix + ".png";
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/lib/CORE.java b/gtpp/src/main/java/gtPlusPlus/core/lib/CORE.java
new file mode 100644
index 0000000000..9f39f1f369
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/lib/CORE.java
@@ -0,0 +1,242 @@
+package gtPlusPlus.core.lib;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.UUID;
+import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Supplier;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import com.mojang.authlib.GameProfile;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import gregtech.api.objects.XSTR;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.IGregtech_RecipeAdder;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_TesseractGenerator;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_TesseractTerminal;
+
+public class CORE {
+
+ public static Map PlayerCache;
+
+ // Math Related
+ public static final float PI = (float) Math.PI;
+ public static volatile Random RANDOM = new XSTR();
+
+ public static boolean DEVENV = false;;
+
+ // Mod Variables
+ public static final String name = "GT++";
+ public static final String VERSION = "GRADLETOKEN_VERSION";
+
+ // Tweakables
+ public static int EVERGLADES_ID = 227;
+ public static int EVERGLADESBIOME_ID = 238;
+
+ public static int turbineCutoffBase = 75000;
+
+ // GT++ Fake Player Profile
+ public static final GameProfile gameProfile = new GameProfile(
+ UUID.nameUUIDFromBytes("gtplusplus.core".getBytes()),
+ "[GT++]");
+ public static final WeakHashMap<World, EntityPlayerMP> fakePlayerCache = new WeakHashMap<>();
+ // Tooltips;
+ public static final Supplier<String> GT_Tooltip = () -> StatCollector.translateToLocal("GTPP.core.GT_Tooltip");
+ public static final Supplier<String> GT_Tooltip_Builder = () -> StatCollector
+ .translateToLocal("GTPP.core.GT_Tooltip_Builder");
+ public static final Supplier<String> GT_Tooltip_Radioactive = () -> StatCollector
+ .translateToLocal("GTPP.core.GT_Tooltip_Radioactive");
+
+ public static final String SEPERATOR = "/";
+
+ /**
+ * Lists/Maps
+ */
+
+ // Burnables List
+ public static List<Pair<Integer, ItemStack>> burnables = new ArrayList<>();
+
+ // TesseractMaps
+ public static final Map<UUID, Map<Integer, GT_MetaTileEntity_TesseractGenerator>> sTesseractGeneratorOwnershipMap = new HashMap<>();
+ public static final Map<UUID, Map<Integer, GT_MetaTileEntity_TesseractTerminal>> sTesseractTerminalOwnershipMap = new HashMap<>();
+
+ // BookMap
+ public static final Map<String, ItemStack> sBookList = new ConcurrentHashMap<>();
+
+ /**
+ * Some Gregtech Material and Recipe Variables
+ */
+ public static IGregtech_RecipeAdder RA;
+
+ public static final GT_Materials[] sMU_GeneratedMaterials = new GT_Materials[1000];
+
+ public static class ConfigSwitches {
+
+ // Debug
+ public static boolean MACHINE_INFO = true;
+ public static boolean showHiddenNEIItems = false;
+ public static boolean dumpItemAndBlockData = false;
+
+ // Machine Related
+ public static boolean enableThaumcraftShardUnification = false;
+ public static boolean disableIC2Recipes = false;
+ public static int boilerSteamPerSecond = 750;
+
+ // Feature Related
+ public static boolean enableCustomCapes = false;
+ public static int enableWatchdogBGM = CORE_Preloader.enableWatchdogBGM;
+ public static boolean hideUniversalCells = true;
+
+ // Single Block Machines
+ public static boolean enableMachine_Dehydrators = true;
+ public static boolean enableMachine_SteamConverter = true;
+ public static boolean enableMachine_FluidTanks = true;
+ public static boolean enableMachine_RocketEngines = true;
+ public static boolean enableMachine_GeothermalEngines = true;
+ public static boolean enableMachine_Tesseracts = true;
+ public static boolean enableMachine_SimpleWasher = true;
+ public static boolean enableMachine_Pollution = true;
+ public static boolean enableCustom_Pipes = true;
+ public static boolean enableCustom_Cables = true;
+
+ // Multiblocks
+ public static boolean enableMultiblock_AlloyBlastSmelter = true;
+ public static boolean enableMultiblock_QuantumForceTransformer = true;
+ public static boolean enableMultiblock_IndustrialCentrifuge = true;
+ public static boolean enableMultiblock_IndustrialCokeOven = true;
+ public static boolean enableMultiblock_IndustrialElectrolyzer = true;
+ public static boolean enableMultiblock_IndustrialMacerationStack = true;
+ public static boolean enableMultiblock_IndustrialPlatePress = true;
+ public static boolean enableMultiblock_IndustrialWireMill = true;
+ public static boolean enableMultiblock_MatterFabricator = true;
+ public static boolean enableMultiblock_MultiTank = true;
+ public static boolean enableMultiblock_PowerSubstation = true;
+ public static boolean enableMultiblock_LiquidFluorideThoriumReactor = true;
+ public static boolean enableMultiblock_NuclearSaltProcessingPlant = true;
+ public static boolean enableMultiblock_NuclearFuelRefinery = true;
+ public static boolean enableMultiblock_TreeFarmer = true;
+ public static boolean enableMultiblock_IndustrialSifter = true;
+ public static boolean enableMultiblock_IndustrialThermalCentrifuge = true;
+ public static boolean enableMultiblock_IndustrialWashPlant = true;
+ public static boolean enableMultiblock_LargeAutoCrafter = true;
+ public static boolean enableMultiblock_ThermalBoiler = true;
+ public static boolean enableMultiblock_IndustrialCuttingMachine = true;
+ public static boolean enableMultiblock_IndustrialFishingPort = true;
+ public static boolean enableMultiblock_IndustrialExtrudingMachine = true;
+ public static boolean enableMultiblock_IndustrialMultiMachine = true;
+ public static boolean enableMultiblock_Cyclotron = true;
+
+ // Visuals
+ public static boolean useGregtechTextures = true;
+ public static boolean enableAnimatedTextures = false;
+
+ // Pollution
+ public static int pollutionPerSecondMultiPackager = 40;
+ public static int pollutionPerSecondMultiIndustrialAlloySmelter = 300;
+ public static int pollutionPerSecondMultiIndustrialArcFurnace = 2400;
+ public static int pollutionPerSecondMultiIndustrialCentrifuge = 300;
+ public static int pollutionPerSecondMultiIndustrialCokeOven = 80;
+ public static int pollutionPerSecondMultiIndustrialCuttingMachine = 160;
+ public static int pollutionPerSecondMultiIndustrialDehydrator = 500;
+ public static int pollutionPerSecondMultiIndustrialElectrolyzer = 300;
+ public static int pollutionPerSecondMultiIndustrialExtruder = 1000;
+ public static int pollutionPerSecondMultiIndustrialMacerator = 400;
+ public static int pollutionPerSecondMultiIndustrialMixer = 800;
+ public static int pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal = 400;
+ public static int pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid = 400;
+ public static int pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc = 600;
+ public static int pollutionPerSecondMultiIndustrialPlatePress_ModeForming = 240;
+ public static int pollutionPerSecondMultiIndustrialPlatePress_ModeBending = 480;
+ public static int pollutionPerSecondMultiIndustrialForgeHammer = 250;
+ public static int pollutionPerSecondMultiIndustrialSifter = 40;
+ public static int pollutionPerSecondMultiIndustrialThermalCentrifuge = 1000;
+ public static int pollutionPerSecondMultiIndustrialVacuumFreezer = 500;
+ public static int pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath = 400;
+ public static int pollutionPerSecondMultiIndustrialWashPlant_ModeWasher = 100;
+ public static int pollutionPerSecondMultiIndustrialWireMill = 100;
+ public static int pollutionPerSecondMultiIsaMill = 1280;
+ public static int pollutionPerSecondMultiAdvDistillationTower_ModeDistillery = 240;
+ public static int pollutionPerSecondMultiAdvDistillationTower_ModeDT = 480;
+ public static int pollutionPerSecondMultiAdvEBF = 500;
+ public static int pollutionPerSecondMultiAdvImplosion = 5000;
+ public static int pollutionPerSecondMultiABS = 200;
+ public static int pollutionPerSecondMultiCyclotron = 200;
+ public static int pollutionPerSecondMultiIndustrialFishingPond = 20;
+ public static int pollutionPerSecondMultiLargeSemiFluidGenerator = 1280;
+ public static int pollutionPerSecondMultiMassFabricator = 40;
+ public static int pollutionPerSecondMultiRefinery = 4000;
+ public static int pollutionPerSecondMultiTreeFarm = 100;
+ public static int pollutionPerSecondMultiFrothFlotationCell = 0;
+ public static int pollutionPerSecondMultiAutoCrafter = 500;
+ public static int pollutionPerSecondMultiThermalBoiler = 700;
+ public static int pollutionPerSecondMultiMolecularTransformer = 1000;
+ public static int pollutionPerSecondMultiAlgaePond = 0;
+ public static int pollutionPerSecondMultiIndustrialRockBreaker = 100;
+ public static int pollutionPerSecondMultiIndustrialChisel = 50;
+ // pollution single blocks
+ public static int basePollutionPerSecondSemiFluidGenerator = 40;
+ public static double[] pollutionReleasedByTierSemiFluidGenerator = new double[] { 0, 2.0, 4.0, 8.0, 12.0, 16,
+ 0 };
+ public static int basePollutionPerSecondBoiler = 35;
+ public static double[] pollutionReleasedByTierBoiler = new double[] { 0, 1.0, 1.43, 1.86 };
+ public static int baseMinPollutionPerSecondRocketFuelGenerator = 250;
+ public static int baseMaxPollutionPerSecondRocketFuelGenerator = 2000;
+ public static double[] pollutionReleasedByTierRocketFuelGenerator = new double[] { 0, 0, 0, 0, 1, 2, 3 };
+ public static int basePollutionPerSecondGeothermalGenerator = 100;
+ public static double[] pollutionReleasedByTierGeothermalGenerator = new double[] { 0, 0, 0, 0, 1, 1, 1 };
+ }
+
+ public static class Everglades {
+
+ public static final String NAME = "GT++ Toxic Everglades";
+ public static final String VERSION = "GRADLETOKEN_VERSION";
+ }
+
+ public static final void crash() {
+ crash("Generic Crash");
+ }
+
+ public static final void crash(String aReason) {
+ try {
+ Logger.INFO("==========================================================");
+ Logger.INFO("[GT++ CRASH]");
+ Logger.INFO("==========================================================");
+ Logger.INFO("Oooops...");
+ Logger.INFO("This should only happy in a development environment or when something really bad happens.");
+ Logger.INFO("Reason: " + aReason);
+ Logger.INFO("==========================================================");
+ Logger.INFO("Called from: " + ReflectionUtils.getMethodName(1));
+ Logger.INFO(ReflectionUtils.getMethodName(2));
+ Logger.INFO(ReflectionUtils.getMethodName(3));
+ Logger.INFO(ReflectionUtils.getMethodName(4));
+ Logger.INFO(ReflectionUtils.getMethodName(5));
+ Logger.INFO(ReflectionUtils.getMethodName(6));
+ Logger.INFO(ReflectionUtils.getMethodName(7));
+ Logger.INFO(ReflectionUtils.getMethodName(8));
+ Logger.INFO(ReflectionUtils.getMethodName(9));
+ Logger.INFO(ReflectionUtils.getMethodName(10));
+ Logger.INFO(ReflectionUtils.getMethodName(11));
+ Logger.INFO(ReflectionUtils.getMethodName(12));
+ Logger.INFO(ReflectionUtils.getMethodName(13));
+ Logger.INFO(ReflectionUtils.getMethodName(14));
+ Logger.INFO(ReflectionUtils.getMethodName(15));
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ FMLCommonHandler.instance()
+ .exitJava(0, true);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/lib/VanillaColours.java b/gtpp/src/main/java/gtPlusPlus/core/lib/VanillaColours.java
new file mode 100644
index 0000000000..70e7902fbf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/lib/VanillaColours.java
@@ -0,0 +1,43 @@
+package gtPlusPlus.core.lib;
+
+import gtPlusPlus.core.util.Utils;
+
+public enum VanillaColours {
+
+ BONE_MEAL(249, 255, 254),
+ INK_BLACK(29, 29, 33),
+ COCOA_BEANS(131, 84, 50),
+ LAPIS_LAZULI(60, 68, 170),
+ DYE_WHITE(249, 255, 254),
+ DYE_BLACK(29, 29, 33),
+ DYE_RED(176, 46, 38),
+ DYE_GREEN(94, 124, 22),
+ DYE_CYAN(22, 156, 156),
+ DYE_PINK(243, 139, 170),
+ DYE_LIME(128, 199, 31),
+ DYE_YELLOW(254, 216, 61),
+ DYE_ORANGE(249, 128, 29),
+ DYE_BROWN(131, 84, 50),
+ DYE_LIGHT_BLUE(58, 179, 218),
+ DYE_LIGHT_PURPLE(199, 78, 189),
+ DYE_LIGHT_GRAY(157, 157, 151),
+ DYE_DARK_BLUE(60, 68, 170),
+ DYE_DARK_PURPLE(137, 50, 184),
+ DYE_DARK_GRAY(71, 79, 82);
+
+ private final int r, g, b;
+
+ private VanillaColours(int aR, int aG, int aB) {
+ r = aR;
+ g = aG;
+ b = aB;
+ }
+
+ public short[] getAsShort() {
+ return new short[] { (short) r, (short) g, (short) b };
+ }
+
+ public int getAsInt() {
+ return Utils.rgbtoHexValue(r, g, b);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/material/ALLOY.java b/gtpp/src/main/java/gtPlusPlus/core/material/ALLOY.java
new file mode 100644
index 0000000000..6618c61dd3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/material/ALLOY.java
@@ -0,0 +1,828 @@
+package gtPlusPlus.core.material;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public final class ALLOY {
+
+ // Just some GT Alloys that I need within mine.
+ public static final Material BRONZE = MaterialUtils.generateMaterialFromGtENUM(Materials.Bronze);
+ public static final Material STEEL = MaterialUtils.generateMaterialFromGtENUM(Materials.Steel);
+ public static final Material STEEL_BLACK = MaterialUtils.generateMaterialFromGtENUM(Materials.BlackSteel);
+ public static final Material INVAR = MaterialUtils.generateMaterialFromGtENUM(Materials.Invar);
+ public static final Material KANTHAL = MaterialUtils.generateMaterialFromGtENUM(Materials.Kanthal);
+ public static final Material NICHROME = MaterialUtils.generateMaterialFromGtENUM(Materials.Nichrome);
+ public static final Material TUNGSTENSTEEL = MaterialUtils.generateMaterialFromGtENUM(Materials.TungstenSteel);
+ public static final Material STAINLESS_STEEL = MaterialUtils.generateMaterialFromGtENUM(Materials.StainlessSteel);
+ public static final Material OSMIRIDIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Osmiridium);
+ public static final Material POLYETHYLENE = MaterialUtils.generateMaterialFromGtENUM(Materials.Plastic);
+ public static final Material POLYTETRAFLUOROETHYLENE = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.Polytetrafluoroethylene);
+ public static final Material ENERGYCRYSTAL = new Material(
+ "Energy Crystal", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 228, 255, 0, 0 }, // Material Colour
+ 4660, // Melting Point in C
+ 5735, // Boiling Point in C
+ 90, // Protons
+ 40, // Neutrons
+ true, // Uses Blast furnace?
+ "⬟ ⯂ ⬢ ⬣ ⯃ ⯄",
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().AER, 5),
+ new MaterialStack(ELEMENT.getInstance().IGNIS, 5), new MaterialStack(ELEMENT.getInstance().TERRA, 5),
+ new MaterialStack(ELEMENT.getInstance().AQUA, 5) });
+
+ public static final Material BLOODSTEEL = new Material(
+ "Blood Steel", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 142, 28, 0, 0 }, // Material Colour
+ 2500, // Melting Point in C
+ 0, // Boiling Point in C
+ 100, // Protons
+ 100, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STEEL, 5), new MaterialStack(ELEMENT.getInstance().IGNIS, 5) });
+
+ public static final Material STABALLOY = new Material(
+ "Staballoy", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 68, 75, 66, 0 }, // Material Colour
+ 3450, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().URANIUM238, 9),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 1) });
+
+ public static final Material TANTALLOY_60 = new Material(
+ "Tantalloy-60", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 213, 231, 237, 0 }, // Material Colour
+ 3025, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TUNGSTEN, 4),
+ new MaterialStack(ELEMENT.getInstance().TANTALUM, 46) });
+
+ public static final Material TANTALLOY_61 = new Material(
+ "Tantalloy-61", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 193, 211, 217, 0 }, // Material Colour
+ 3030, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.TANTALLOY_60, 2),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 12),
+ new MaterialStack(ELEMENT.getInstance().YTTRIUM, 8) });
+
+ public static final Material TUMBAGA = new Material(
+ "Tumbaga", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 255, 178, 15, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().GOLD, 70),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 30) });
+
+ public static final Material POTIN = new Material(
+ "Potin", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 201, 151, 129, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().LEAD, 40), new MaterialStack(ALLOY.BRONZE, 40),
+ new MaterialStack(ELEMENT.getInstance().TIN, 20) });
+
+ /*
+ * public static final Material BEDROCKIUM = new Material( "Bedrockium", //Material Name new short[]{32, 32, 32, 0},
+ * //Material Colour 7735, //Melting Point in C 0, //Boiling Point in C 100, //Protons 100, //Neutrons false, //Uses
+ * Blast furnace? //Material Stacks with Percentage of required elements. null);
+ */
+
+ public static final Material INCONEL_625 = new Material(
+ "Inconel-625", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 128, 200, 128, 0 }, // Material Colour
+ 2425, // Melting Point in C
+ 3758,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NICKEL, 3),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 7),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 10), new MaterialStack(INVAR, 10),
+ new MaterialStack(NICHROME, 13) });
+
+ public static final Material INCONEL_690 = new Material(
+ "Inconel-690", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 118, 220, 138, 0 }, // Material Colour
+ 3425, // Melting Point in C
+ 4895,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CHROMIUM, 5),
+ new MaterialStack(ELEMENT.getInstance().NIOBIUM, 10),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 10), new MaterialStack(NICHROME, 15) });
+
+ public static final Material INCONEL_792 = new Material(
+ "Inconel-792", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 108, 240, 118, 0 }, // Material Colour
+ 3425, // Melting Point in C
+ 6200,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NICKEL, 20),
+ new MaterialStack(ELEMENT.getInstance().NIOBIUM, 10),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 20), new MaterialStack(NICHROME, 10) });
+
+ public static final Material NITINOL_60 = new Material(
+ "Nitinol 60", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 5651, // Melting Point in C
+ 8975,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NICKEL, 40),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 60) });
+
+ public static final Material ZERON_100 = new Material(
+ "Zeron-100", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 180, 180, 20, 0 }, // Material Colour
+ 6100,
+ 9785,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CHROMIUM, 26),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 6), new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 4),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 20), new MaterialStack(ELEMENT.getInstance().TUNGSTEN, 4),
+ new MaterialStack(ALLOY.STEEL, 40) });
+
+ public static final Material MARAGING250 = new Material(
+ "Maraging Steel 250", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 2413, // Melting Point in C
+ 4555,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STEEL, 64),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 4),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 4), new MaterialStack(ELEMENT.getInstance().NICKEL, 16),
+ new MaterialStack(ELEMENT.getInstance().COBALT, 8), });
+
+ public static final Material MARAGING300 = new Material(
+ "Maraging Steel 300", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 2413, // Melting Point in C
+ 4555,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STEEL, 64), new MaterialStack(ELEMENT.getInstance().TITANIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 4), new MaterialStack(ELEMENT.getInstance().NICKEL, 16),
+ new MaterialStack(ELEMENT.getInstance().COBALT, 8), });
+
+ public static final Material MARAGING350 = new Material(
+ "Maraging Steel 350", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 2413, // Melting Point in C
+ 4555,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STEEL, 64), new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 4), new MaterialStack(ELEMENT.getInstance().NICKEL, 16),
+ new MaterialStack(ELEMENT.getInstance().COBALT, 8), });
+
+ public static final Material AQUATIC_STEEL = new Material(
+ "Watertight Steel", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 120, 120, 180 }, // Material Colour
+ 2673, // Melting Point in C
+ 4835,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STEEL, 60), new MaterialStack(ELEMENT.getInstance().CARBON, 10),
+ new MaterialStack(ELEMENT.getInstance().MANGANESE, 5), new MaterialStack(ELEMENT.getInstance().SILICON, 10),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 5), new MaterialStack(ELEMENT.getInstance().SULFUR, 5),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 5) });
+
+ public static final Material STELLITE = new Material(
+ "Stellite", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 4310, // Melting Point in C
+ 6250,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().COBALT, 35),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 35),
+ new MaterialStack(ELEMENT.getInstance().MANGANESE, 20),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 10) });
+
+ public static final Material TALONITE = new Material(
+ "Talonite", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 3454, // Melting Point in C
+ 5500,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().COBALT, 40),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 30),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 20),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 10) });
+
+ public static final Material HASTELLOY_W = new Material(
+ "Hastelloy-W", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 3350, // Melting Point in C
+ 5755,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().IRON, 06),
+ new MaterialStack(ELEMENT.getInstance().COBALT, 2), new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 24),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 6),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 62) });
+
+ public static final Material HASTELLOY_X = new Material(
+ "Hastelloy-X", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 3350, // Melting Point in C
+ 5755,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().IRON, 18),
+ new MaterialStack(ELEMENT.getInstance().MANGANESE, 2), new MaterialStack(ELEMENT.getInstance().SILICON, 2),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 8),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 22),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 48) });
+
+ public static final Material HASTELLOY_N = new Material(
+ "Hastelloy-N", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 4350, // Melting Point in C
+ 6875,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTRIUM, 8),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 16),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 8), new MaterialStack(ELEMENT.getInstance().TITANIUM, 8),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 60) });
+
+ public static final Material HASTELLOY_C276 = new Material(
+ "Hastelloy-C276", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 4350, // Melting Point in C
+ 6520,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().COBALT, 2),
+ new MaterialStack(ELEMENT.getInstance().MOLYBDENUM, 16),
+ new MaterialStack(ELEMENT.getInstance().TUNGSTEN, 2), new MaterialStack(ELEMENT.getInstance().COPPER, 2),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 14),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 64) });
+
+ public static final Material INCOLOY_020 = new Material(
+ "Incoloy-020", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 3425, // Melting Point in C
+ 5420,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().IRON, 40),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 4), new MaterialStack(ELEMENT.getInstance().CHROMIUM, 20),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 36) });
+
+ public static final Material INCOLOY_DS = new Material(
+ "Incoloy-DS", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 3425, // Melting Point in C
+ 5420,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().IRON, 46),
+ new MaterialStack(ELEMENT.getInstance().COBALT, 18), new MaterialStack(ELEMENT.getInstance().CHROMIUM, 18),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 18) });
+
+ public static final Material INCOLOY_MA956 = new Material(
+ "Incoloy-MA956", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 4425, // Melting Point in C
+ 6875,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().IRON, 64),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 12),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 20),
+ new MaterialStack(ELEMENT.getInstance().YTTRIUM, 4) });
+
+ public static final Material TUNGSTEN_CARBIDE = new Material(
+ "Tungsten Carbide", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 44, 44, 44, 0 }, // Material Colour
+ 3422, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ false, // Generate cells
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CARBON, 50),
+ new MaterialStack(ELEMENT.getInstance().TUNGSTEN, 50) });
+
+ public static final Material TUNGSTEN_TITANIUM_CARBIDE = new Material(
+ "Tungsten Titanium Carbide", // Material Name
+ MaterialState.SOLID, // State
+ null,
+ 4422, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(TUNGSTEN_CARBIDE, 70),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 30) });
+
+ public static final Material SILICON_CARBIDE = new Material(
+ "Silicon Carbide", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 40, 48, 36, 0 }, // Material Colour
+ 1414, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().SILICON, 50),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 50) });
+
+ public static final Material TANTALUM_CARBIDE = new Material(
+ "Tantalum Carbide", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 139, 136, 120, 0 }, // Material Colour
+ 2980, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TANTALUM, 50),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 50) });
+
+ public static final Material ZIRCONIUM_CARBIDE = new Material(
+ "Zirconium Carbide", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 222, 202, 180, 0 }, // Material Colour
+ 1555, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 50),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 50) });
+
+ public static final Material NIOBIUM_CARBIDE = new Material(
+ "Niobium Carbide", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 205, 197, 191, 0 }, // Material Colour
+ 2477, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NIOBIUM, 50),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 50) });
+
+ public static final Material ARCANITE = new Material(
+ "Arcanite", // Material Name
+ MaterialState.SOLID, // State
+ null,
+ 5666, // Melting Point in C
+ 9875,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().THORIUM232, 40),
+ new MaterialStack(ENERGYCRYSTAL, 40), new MaterialStack(ELEMENT.getInstance().ORDO, 10),
+ new MaterialStack(ELEMENT.getInstance().PERDITIO, 10) });
+
+ public static final Material LEAGRISIUM = new Material(
+ "Grisium", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 53, 93, 106, 0 }, // Material Colour
+ 3850, // Melting Point in C
+ 5550, // Boiling Point in C
+ 96, // Protons
+ 128, // Neutrons
+ true, // Uses Blast furnace?
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TITANIUM, 18),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 18), new MaterialStack(ELEMENT.getInstance().POTASSIUM, 18),
+ new MaterialStack(ELEMENT.getInstance().LITHIUM, 18), new MaterialStack(ELEMENT.getInstance().SULFUR, 18),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 10) }); // Material Stacks with Percentage of
+ // required elements.
+
+ public static final Material EGLIN_STEEL_BASE = new Material(
+ "Eglin Steel Base Compound", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().IRON, 12), new MaterialStack(KANTHAL, 3),
+ new MaterialStack(INVAR, 15) });
+
+ public static final Material EGLIN_STEEL = new Material(
+ "Eglin Steel", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 139, 69, 19, 0 }, // Material Colour
+ 1048, // Melting Point in C
+ 1973, // Boiling Point in C
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.EGLIN_STEEL_BASE, 10),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 1), new MaterialStack(ELEMENT.getInstance().SILICON, 4),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 1) });
+
+ public static final Material HG1223 = new Material(
+ "HG-1223", // Material Name
+ MaterialState.LIQUID, // State
+ new short[] { 39, 85, 159, 0 }, // Material Colour
+ 6357, // Melting Point in C
+ 8563, // Boiling Point in C
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().MERCURY, 1),
+ new MaterialStack(ELEMENT.getInstance().BARIUM, 2), new MaterialStack(ELEMENT.getInstance().CALCIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 3), new MaterialStack(ELEMENT.getInstance().OXYGEN, 8) });
+
+ public static final Material HS188A = new Material(
+ "HS188-A", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 4870, // Melting Point in C
+ 7550, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ true, // Uses Blast furnace?
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().COBALT, 20),
+ new MaterialStack(ELEMENT.getInstance().HAFNIUM, 20), new MaterialStack(TALONITE, 16),
+ new MaterialStack(ELEMENT.getInstance().RHENIUM, 10), new MaterialStack(NIOBIUM_CARBIDE, 10),
+ new MaterialStack(HASTELLOY_X, 8), new MaterialStack(TUNGSTENSTEEL, 8),
+ new MaterialStack(ZIRCONIUM_CARBIDE, 8), }); // Material Stacks with Percentage of required
+ // elements.
+
+ /**
+ * Stargate Materials - #D2FFA9 210, 255, 170
+ */
+ public static final Material TRINIUM_TITANIUM = new Material(
+ "Trinium Titanium Alloy", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 3750, // Melting Point in C
+ 7210, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TRINIUM_REFINED, 3),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 7) });
+
+ public static final Material TRINIUM_NAQUADAH = new Material(
+ "Trinium Naquadah Alloy", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 4200, // Melting Point in C
+ 7400, // Boiling Point in C
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TRINIUM_REFINED, 5),
+ new MaterialStack(ELEMENT.getInstance().NAQUADAH, 9) });
+ public static final Material TRINIUM_NAQUADAH_CARBON = new Material(
+ "Trinium Naquadah Carbonite", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 6500, // Melting Point in C
+ 9000, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ new MaterialStack[] { new MaterialStack(TRINIUM_NAQUADAH, 9),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 1) });
+
+ public static final Material TRINIUM_REINFORCED_STEEL = new Material(
+ "Arceus Alloy 2B", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 205, 197, 23, 0 }, // Material Colour
+ 7555, // Melting Point in C
+ 12350,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TRINIUM_REFINED, 30),
+ new MaterialStack(ALLOY.MARAGING350, 40), new MaterialStack(ALLOY.TUNGSTENSTEEL, 20),
+ new MaterialStack(ALLOY.OSMIRIDIUM, 10), new MaterialStack(ELEMENT.getInstance().STRONTIUM, 10) });
+
+ /*
+ * Witchery Material
+ */
+
+ public static final Material KOBOLDITE = new Material(
+ "Koboldite", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 80, 210, 255, 0 }, // Material Colour
+ -1, // Melting Point in C
+ -1,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NICKEL, 35),
+ new MaterialStack(ELEMENT.getInstance().THAUMIUM, 30), new MaterialStack(ELEMENT.getInstance().IRON, 35) });
+
+ /*
+ * Top Tier Alloys
+ */
+
+ public static final Material HELICOPTER = new Material(
+ "HeLiCoPtEr", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 5763,
+ 8192,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().HELIUM, 20),
+ new MaterialStack(ELEMENT.getInstance().LITHIUM, 20), new MaterialStack(ELEMENT.getInstance().COBALT, 20),
+ new MaterialStack(ELEMENT.getInstance().PLATINUM, 20),
+ new MaterialStack(ELEMENT.getInstance().ERBIUM, 20) });
+
+ // 0lafe Compound
+ public static final Material LAFIUM = new Material(
+ "Lafium Compound", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 6350, // Melting Point in C
+ 9865, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.HASTELLOY_N, 8),
+ new MaterialStack(ELEMENT.getInstance().NAQUADAH, 4), new MaterialStack(ELEMENT.getInstance().SAMARIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().TUNGSTEN, 4), new MaterialStack(ELEMENT.getInstance().ARGON, 2),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 6), new MaterialStack(ELEMENT.getInstance().NICKEL, 8),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2) });
+
+ // Cinobi Alloy
+ public static final Material CINOBITE = new Material(
+ "Cinobite A243", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 7350, // Melting Point in C
+ 12565, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.ZERON_100, 16),
+ new MaterialStack(ELEMENT.getInstance().NAQUADRIA, 7),
+ new MaterialStack(ELEMENT.getInstance().GADOLINIUM, 5),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 3), new MaterialStack(ELEMENT.getInstance().MERCURY, 2),
+ new MaterialStack(ELEMENT.getInstance().TIN, 2), new MaterialStack(ELEMENT.getInstance().TITANIUM, 12),
+ new MaterialStack(ALLOY.OSMIRIDIUM, 6) });
+
+ // Piky Alloy
+ public static final Material PIKYONIUM = new Material(
+ "Pikyonium 64B", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 52, 103, 186, 0 }, // Material Colour
+ 6850, // Melting Point in C
+ 11765, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.INCONEL_792, 16), new MaterialStack(ALLOY.EGLIN_STEEL, 10),
+ new MaterialStack(ELEMENT.getInstance().NAQUADAH_ENRICHED, 8),
+ new MaterialStack(ELEMENT.getInstance().CERIUM, 6), new MaterialStack(ELEMENT.getInstance().ANTIMONY, 4),
+ new MaterialStack(ELEMENT.getInstance().PLATINUM, 4), new MaterialStack(ELEMENT.getInstance().YTTERBIUM, 2),
+ new MaterialStack(ALLOY.TUNGSTENSTEEL, 8) });
+
+ // Piky Alloy
+ public static final Material ABYSSAL = new Material(
+ "Abyssal Alloy", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 9650, // Melting Point in C
+ 13765, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STAINLESS_STEEL, 10),
+ new MaterialStack(ALLOY.TUNGSTEN_CARBIDE, 10), new MaterialStack(ALLOY.NICHROME, 10),
+ new MaterialStack(ALLOY.BRONZE, 10), new MaterialStack(ALLOY.INCOLOY_MA956, 10),
+ new MaterialStack(ELEMENT.getInstance().IODINE, 2), new MaterialStack(ELEMENT.getInstance().RADON, 2),
+ new MaterialStack(ELEMENT.getInstance().GERMANIUM, 2), });
+
+ // Alkalus Alloy
+ public static final Material LAURENIUM = new Material(
+ "Laurenium", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 244, 168, 255, 0 }, // Material Colour
+ 6825, // Melting Point in C
+ 11355, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.EGLIN_STEEL, 40),
+ new MaterialStack(ELEMENT.getInstance().INDIUM, 10), new MaterialStack(ELEMENT.getInstance().CHROMIUM, 20),
+ new MaterialStack(ELEMENT.getInstance().DYSPROSIUM, 5),
+ new MaterialStack(ELEMENT.getInstance().RHENIUM, 5), });
+
+ // Bot Alloy
+ public static final Material BOTMIUM = new Material(
+ "Botmium", // Material Name
+ MaterialState.SOLID, // State
+ new short[] { 80, 160, 80, 0 }, // Material Colour
+ 8220, // Melting Point in C
+ 10540, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.NITINOL_60, 2),
+ new MaterialStack(ELEMENT.getInstance().OSMIUM, 12), new MaterialStack(ELEMENT.getInstance().RUTHENIUM, 12),
+ new MaterialStack(ELEMENT.getInstance().THALLIUM, 6), });
+
+ // Titansteel
+ public static final Material TITANSTEEL = new Material(
+ "Titansteel", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 8250, // Melting Point in C
+ 11765, // Boiling Point in C
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.TUNGSTEN_TITANIUM_CARBIDE, 3),
+ new MaterialStack(ELEMENT.getInstance().IGNIS, 1), new MaterialStack(ELEMENT.getInstance().TERRA, 1),
+ new MaterialStack(ELEMENT.getInstance().PERDITIO, 1), });
+
+ public static final Material OCTIRON = new Material(
+ "Octiron", // Material Name
+ MaterialState.SOLID, // State
+ null,
+ 9120, // Melting Point in C
+ 14200,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ARCANITE, 30), new MaterialStack(TITANSTEEL, 30),
+ new MaterialStack(ENERGYCRYSTAL, 5), new MaterialStack(STEEL_BLACK, 10),
+ new MaterialStack(ELEMENT.getInstance().THAUMIUM, 25) });
+
+ public static final Material BLACK_TITANIUM = new Material(
+ "Black Titanium", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ Materials.Titanium.mMeltingPoint * 4, // Melting Point in C
+ Materials.Titanium.mMeltingPoint * 16,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TITANIUM, 55),
+ new MaterialStack(ELEMENT.getInstance().LANTHANUM, 12),
+ new MaterialStack(ELEMENT.getInstance().TUNGSTEN, 8), new MaterialStack(ELEMENT.getInstance().COBALT, 6),
+ new MaterialStack(ELEMENT.getInstance().MANGANESE, 4),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 4),
+ new MaterialStack(ELEMENT.getInstance().PALLADIUM, 4), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().ARGON, 5) });
+
+ public static final Material BABBIT_ALLOY = new Material(
+ "Babbit Alloy", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 268, // Melting Point in C
+ 589,
+ -1,
+ -1,
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TIN, 10),
+ new MaterialStack(ELEMENT.getInstance().LEAD, 72), new MaterialStack(ELEMENT.getInstance().ANTIMONY, 16),
+ new MaterialStack(ELEMENT.getInstance().ARSENIC, 2) });
+
+ public static final Material INDALLOY_140 = new Material(
+ "Indalloy 140", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 5200, // Melting Point in C
+ 6500,
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().BISMUTH, 47),
+ new MaterialStack(ELEMENT.getInstance().LEAD, 25), new MaterialStack(ELEMENT.getInstance().TIN, 13),
+ new MaterialStack(ELEMENT.getInstance().CADMIUM, 10), new MaterialStack(ELEMENT.getInstance().INDIUM, 5) });
+
+ // Quantum
+ public static final Material QUANTUM = new Material(
+ "Quantum", // Material Name
+ MaterialState.SOLID, // State
+ null, // Material Colour
+ 10500, // Melting Point in C
+ 25000, // Boiling Point in C
+ 150, // Protons
+ 200, // Neutrons
+ true, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ALLOY.STELLITE, 15), new MaterialStack(ALLOY.ENERGYCRYSTAL, 5),
+ new MaterialStack(ALLOY.SILICON_CARBIDE, 5), new MaterialStack(ELEMENT.getInstance().GALLIUM, 5),
+ new MaterialStack(ELEMENT.getInstance().AMERICIUM, 5),
+ new MaterialStack(ELEMENT.getInstance().PALLADIUM, 5), new MaterialStack(ELEMENT.getInstance().BISMUTH, 5),
+ new MaterialStack(ELEMENT.getInstance().GERMANIUM, 5) });
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/material/ELEMENT.java b/gtpp/src/main/java/gtPlusPlus/core/material/ELEMENT.java
new file mode 100644
index 0000000000..9bcea2a47b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/material/ELEMENT.java
@@ -0,0 +1,651 @@
+package gtPlusPlus.core.material;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TextureSet;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.client.CustomTextureSet.TextureSets;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public final class ELEMENT {
+
+ public static final String[] NAMES = new String[] { "Hydrogen", "Helium" };
+
+ // First 50 Elements
+ public final Material HYDROGEN = MaterialUtils.generateMaterialFromGtENUM(Materials.Hydrogen);
+ public final Material HELIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Helium);
+ public final Material LITHIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Lithium);
+ public final Material BERYLLIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Beryllium);
+ public final Material BORON = MaterialUtils.generateMaterialFromGtENUM(Materials.Boron);
+ public final Material CARBON = MaterialUtils.generateMaterialFromGtENUM(Materials.Carbon);
+ public final Material NITROGEN = MaterialUtils.generateMaterialFromGtENUM(Materials.Nitrogen);
+ public final Material OXYGEN = MaterialUtils.generateMaterialFromGtENUM(Materials.Oxygen);
+ public final Material FLUORINE = MaterialUtils.generateMaterialFromGtENUM(Materials.Fluorine);
+ public final Material NEON = new Material(
+ "Neon",
+ MaterialState.PURE_GAS,
+ new short[] { 240, 180, 30 },
+ -248,
+ -246,
+ 10,
+ 10,
+ false,
+ "Ne",
+ 0); // Not a GT Inherited Material
+ public final Material SODIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Sodium);
+ public final Material MAGNESIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Magnesium);
+ public final Material ALUMINIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Aluminium);
+ public final Material ALUMINIUMOXIDE = MaterialUtils.generateMaterialFromGtENUM(Materials.Aluminiumoxide);
+ public final Material SILICON = MaterialUtils.generateMaterialFromGtENUM(Materials.Silicon);
+ public final Material SILICONDIOXIDE = MaterialUtils.generateMaterialFromGtENUM(Materials.SiliconDioxide);
+ public final Material PHOSPHORUS = MaterialUtils.generateMaterialFromGtENUM(Materials.Phosphorus);
+ public final Material SULFUR = MaterialUtils.generateMaterialFromGtENUM(Materials.Sulfur);
+ public final Material CHLORINE = MaterialUtils.generateMaterialFromGtENUM(Materials.Chlorine);
+ public final Material ARGON = MaterialUtils.generateMaterialFromGtENUM(Materials.Argon);
+ public final Material POTASSIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Potassium);
+ public final Material CALCIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Calcium);
+ public final Material SCANDIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Scandium);
+ public final Material TITANIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Titanium);
+ public final Material VANADIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Vanadium);
+ public final Material CHROMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Chrome);
+ public final Material MANGANESE = MaterialUtils.generateMaterialFromGtENUM(Materials.Manganese);
+ public final Material IRON = MaterialUtils.generateMaterialFromGtENUM(Materials.Iron);
+ public final Material COBALT = MaterialUtils.generateMaterialFromGtENUM(Materials.Cobalt);
+ public final Material NICKEL = MaterialUtils.generateMaterialFromGtENUM(Materials.Nickel);
+ public final Material COPPER = MaterialUtils.generateMaterialFromGtENUM(Materials.Copper);
+ public final Material ZINC = MaterialUtils.generateMaterialFromGtENUM(Materials.Zinc);
+ public final Material GALLIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Gallium);
+ public final Material GERMANIUM = new Material(
+ "Germanium",
+ MaterialState.SOLID,
+ new short[] { 200, 200, 200 },
+ 937,
+ 2830,
+ 32,
+ 41,
+ false,
+ "Ge",
+ 0); // Not a GT Inherited Material
+ public final Material ARSENIC = MaterialUtils.generateMaterialFromGtENUM(Materials.Arsenic);
+ public final Material SELENIUM = new Material(
+ "Selenium",
+ MaterialState.SOLID,
+ new short[] { 190, 190, 190 },
+ 217,
+ 685,
+ 34,
+ 45,
+ false,
+ "Se",
+ 0); // Not a GT Inherited Material
+ public final Material BROMINE = new Material(
+ "Bromine",
+ MaterialState.PURE_LIQUID,
+ new short[] { 200, 25, 25 },
+ -7,
+ 58,
+ 35,
+ 45,
+ false,
+ "Br",
+ 0); // Not a GT Inherited Material
+ public final Material KRYPTON = new Material(
+ "Krypton",
+ MaterialState.PURE_GAS,
+ new short[] { 5, 200, 220 },
+ -157,
+ -153,
+ 36,
+ 48,
+ false,
+ "Kr",
+ 0); // Not a GT Inherited Material
+ public final Material RUBIDIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Rubidium);
+ public final Material STRONTIUM = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.Strontium, new short[] { 230, 210, 110 }, TextureSet.SET_FLINT);
+ public final Material YTTRIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Yttrium);
+ public final Material ZIRCONIUM = new Material(
+ "Zirconium",
+ MaterialState.SOLID,
+ new short[] { 255, 250, 205 },
+ 1855,
+ 4377,
+ 40,
+ 51,
+ false,
+ "Zr",
+ 0); // Not a GT Inherited Material
+ public final Material NIOBIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Niobium);
+ public final Material MOLYBDENUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Molybdenum);
+
+ public final Material RUTHENIUM = new Material(
+ "Ruthenium",
+ MaterialState.SOLID,
+ new short[] { 220, 220, 220 },
+ 2250,
+ 3900,
+ 44,
+ 57,
+ false,
+ "Ru",
+ 0); // Not a GT Inherited Material
+ public final Material RHODIUM = new Material(
+ "Rhodium",
+ MaterialState.SOLID,
+ new short[] { 220, 220, 220 },
+ 1966,
+ 3727,
+ 45,
+ 58,
+ false,
+ "Rh",
+ 0); // Not a GT Inherited Material
+ public final Material AMERICIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Americium);
+ public final Material TECHNETIUM = new Material(
+ "Technetium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 220, 220, 220 },
+ 2200,
+ 4877,
+ 43,
+ 55,
+ false,
+ "Tc",
+ 2); // Not a GT Inherited Material
+ public final Material NEPTUNIUM = new Material(
+ "Neptunium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 200, 220, 205 },
+ 640,
+ 3902,
+ 93,
+ 144,
+ false,
+ "Np",
+ 2); // Not a GT Inherited Material
+
+ public final Material PALLADIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Palladium);
+ public final Material SILVER = MaterialUtils.generateMaterialFromGtENUM(Materials.Silver);
+ public final Material CADMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Cadmium);
+ public final Material INDIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Indium);
+ public final Material TIN = MaterialUtils.generateMaterialFromGtENUM(Materials.Tin);
+ public final Material ANTIMONY = MaterialUtils.generateMaterialFromGtENUM(Materials.Antimony);
+ public final Material TELLURIUM = new Material(
+ "Tellurium",
+ MaterialState.SOLID,
+ new short[] { 210, 210, 210 },
+ 449,
+ 989,
+ 52,
+ 76,
+ false,
+ "Te",
+ 0); // Not a GT Inherited Material
+ public final Material IODINE = new Material(
+ "Iodine",
+ MaterialState.SOLID,
+ TextureSet.SET_SHINY,
+ new short[] { 96, 96, 96 },
+ 114,
+ 184,
+ 53,
+ 74,
+ false,
+ "I",
+ 0); // Not a GT Inherited Material
+ public final Material XENON = new Material(
+ "Xenon",
+ MaterialState.PURE_GAS,
+ new short[] { 5, 105, 210 },
+ -111,
+ -108,
+ 54,
+ 77,
+ false,
+ "Xe",
+ 0); // Not a GT Inherited Material
+ public final Material CAESIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Caesium);
+ public final Material BARIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Barium);
+ public final Material LANTHANUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Lanthanum);
+ public final Material CERIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Cerium);
+ public final Material PRASEODYMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Praseodymium);
+ public final Material NEODYMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Neodymium);
+ public final Material PROMETHIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Promethium);
+ public final Material SAMARIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Samarium);
+ public final Material EUROPIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Europium);
+ public final Material GADOLINIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Gadolinium);
+ public final Material TERBIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Terbium);
+ public final Material DYSPROSIUM = new Material(
+ "Dysprosium",
+ MaterialState.SOLID,
+ new short[] { 180, 180, 180 },
+ 1412,
+ 2562,
+ 66,
+ 97,
+ false,
+ "Dy",
+ 0); // Not a GT Inherited Material
+ public final Material HOLMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Holmium);
+ public final Material ERBIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Erbium);
+ public final Material THULIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Thulium);
+ public final Material YTTERBIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Ytterbium);
+ public final Material LUTETIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Lutetium);
+ public final Material HAFNIUM = new Material(
+ "Hafnium",
+ MaterialState.SOLID,
+ new short[] { 128, 128, 128 },
+ 2150,
+ 5400,
+ 72,
+ 106,
+ false,
+ "Hf",
+ 0); // Not a GT Inherited Material
+
+ // Second 50 elements
+ public final Material TANTALUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Tantalum);
+ public final Material TUNGSTEN = MaterialUtils.generateMaterialFromGtENUM(Materials.Tungsten);
+ public final Material RHENIUM = new Material(
+ "Rhenium",
+ MaterialState.SOLID,
+ new short[] { 150, 150, 150 },
+ 3180,
+ 3627,
+ 75,
+ 111,
+ false,
+ "Re",
+ 0); // Not a GT Inherited Material
+ public final Material OSMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Osmium);
+ public final Material IRIDIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Iridium);
+ public final Material PLATINUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Platinum);
+ public final Material GOLD = MaterialUtils.generateMaterialFromGtENUM(Materials.Gold);
+ public final Material MERCURY = MaterialUtils.generateMaterialFromGtENUM(Materials.Mercury); // Mercury
+ public final Material THALLIUM = new Material(
+ "Thallium",
+ MaterialState.SOLID,
+ new short[] { 175, 175, 175 },
+ 304,
+ 1457,
+ 81,
+ 123,
+ false,
+ "Tl",
+ 0); // Not a GT Inherited Material
+ public final Material LEAD = MaterialUtils.generateMaterialFromGtENUM(Materials.Lead);
+ public final Material BISMUTH = MaterialUtils.generateMaterialFromGtENUM(Materials.Bismuth);
+ public final Material POLONIUM = new Material(
+ "Polonium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 180, 170, 180 },
+ 254,
+ 962,
+ 84,
+ 125,
+ false,
+ "Po",
+ 1); // Not a GT Inherited Material
+
+ public final Material RADON = MaterialUtils.generateMaterialFromGtENUM(Materials.Radon);
+
+ public final Material RADIUM = new Material(
+ "Radium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 165, 165, 165 },
+ 700,
+ 1737,
+ 88,
+ 138,
+ false,
+ "Ra",
+ 1); // Not a GT Inherited Material
+
+ public final Material THORIUM = new Material(
+ "Thorium",
+ MaterialState.SOLID,
+ Materials.Thorium.mRGBa,
+ Materials.Thorium.mMeltingPoint,
+ Materials.Thorium.mBlastFurnaceTemp,
+ 90,
+ 142,
+ false,
+ StringUtils.superscript("Th"),
+ 1);
+ public final Material PROTACTINIUM = new Material(
+ "Protactinium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 190, 150, 170 },
+ 1568,
+ 4027,
+ 91,
+ 140,
+ false,
+ "Pa",
+ 1); // Not a GT Inherited Material
+ public final Material URANIUM238 = MaterialUtils.generateMaterialFromGtENUM(Materials.Uranium);
+ public final Material URANIUM235 = MaterialUtils.generateMaterialFromGtENUM(Materials.Uranium235);
+ public final Material PLUTONIUM241 = MaterialUtils.generateMaterialFromGtENUM(Materials.Plutonium241);
+ public final Material CURIUM = new Material(
+ "Curium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 175, 85, 110 },
+ 1340,
+ 3110,
+ 96,
+ 151,
+ false,
+ "Cm",
+ 3); // Not a GT Inherited Material
+
+ public final Material CALIFORNIUM = new Material(
+ "Californium",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 85, 110, 205 },
+ 899,
+ 1472,
+ 98,
+ 153,
+ false,
+ "Cf",
+ 4); // Not a GT Inherited Material
+
+ public final Material FERMIUM = new Material(
+ "Fermium",
+ MaterialState.LIQUID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 75, 90, 25 },
+ 1527,
+ 3850,
+ 100,
+ 157,
+ false,
+ "Fm",
+ 5); // Not a GT Inherited Material //Boiling Point is made up
+
+ // Misc
+ public final Material AER = MaterialUtils.generateMaterialFromGtENUM(Materials.InfusedAir, TextureSets.GEM_A.get());
+ public final Material IGNIS = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.InfusedFire, TextureSets.GEM_A.get());
+ public final Material TERRA = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.InfusedEarth, TextureSets.GEM_A.get());
+ public final Material AQUA = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.InfusedWater, TextureSets.GEM_A.get());
+ public final Material PERDITIO = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.InfusedEntropy, TextureSets.GEM_A.get());
+ public final Material ORDO = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.InfusedOrder, TextureSets.GEM_A.get());
+
+ public final Material NAQUADAH = MaterialUtils.generateMaterialFromGtENUM(Materials.Naquadah);
+ public final Material NAQUADAH_ENRICHED = MaterialUtils.generateMaterialFromGtENUM(Materials.NaquadahEnriched);
+ public final Material NAQUADRIA = MaterialUtils.generateMaterialFromGtENUM(Materials.Naquadria);
+ public final Material TRINIUM;
+ public final Material TRINIUM_REFINED;
+ // https://github.com/Blood-Asp/GT5-Unofficial/issues/609
+
+ // Custom Isotopes
+ public final Material LITHIUM7 = new Material(
+ "Lithium 7",
+ MaterialState.SOLID,
+ TextureSet.SET_SHINY,
+ Materials.Lithium.mRGBa,
+ Materials.Lithium.mMeltingPoint,
+ Materials.Lithium.mBlastFurnaceTemp,
+ Materials.Lithium.getProtons(),
+ Materials.Lithium.getNeutrons(),
+ Materials.Lithium.mBlastFurnaceRequired,
+ StringUtils.superscript("7Li"),
+ 0,
+ false); // Not a GT Inherited Material
+ public final Material URANIUM232 = new Material(
+ "Uranium 232",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 88, 220, 103, 0 },
+ 1132,
+ 4131,
+ 92,
+ 140,
+ false,
+ StringUtils.superscript("232U"),
+ 4); // Not a GT Inherited Material
+ public final Material URANIUM233 = new Material(
+ "Uranium 233",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 73, 220, 83, 0 },
+ 1132,
+ 4131,
+ 92,
+ 141,
+ false,
+ StringUtils.superscript("233U"),
+ 2); // Not a GT Inherited Material
+ public final Material THORIUM232 = new Material(
+ "Thorium 232",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 15, 60, 15, 0 },
+ Materials.Thorium.mMeltingPoint,
+ Materials.Thorium.mBlastFurnaceTemp,
+ 90,
+ 142,
+ false,
+ StringUtils.superscript("232Th"),
+ 1,
+ true); // Not a GT Inherited Material
+
+ // RTG Fuels
+ public final Material PLUTONIUM238 = new Material(
+ "Plutonium-238",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ Materials.Plutonium241.mDurability,
+ Materials.Plutonium241.mRGBa,
+ Materials.Plutonium241.mMeltingPoint,
+ Materials.Plutonium241.mBlastFurnaceTemp,
+ 94,
+ 144,
+ false,
+ StringUtils.superscript("238Pu"),
+ 2,
+ false); // Not a GT Inherited Material
+
+ public final Material MAGIC = MaterialUtils
+ .generateMaterialFromGtENUM(Materials.Magic, new short[] { 10, 185, 140 });
+ public final Material THAUMIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Thaumium);
+
+ static {
+ Logger.MATERIALS("Initialising Base Elements.");
+ }
+
+ private static final ELEMENT INSTANCE = new ELEMENT();
+
+ public ELEMENT() {
+ // GTNH Trinium Handling
+ TRINIUM = MaterialUtils.generateMaterialFromGtENUM(Materials.Trinium);
+ TRINIUM_REFINED = TRINIUM;
+ }
+
+ public static ELEMENT getInstance() {
+ return INSTANCE;
+ }
+
+ public static class STANDALONE {
+
+ public static final Material CELESTIAL_TUNGSTEN = new Material(
+ "Celestial Tungsten",
+ MaterialState.SOLID,
+ TextureSets.REFINED.get(),
+ new short[] { 50, 50, 50, 2 },
+ INSTANCE.TUNGSTEN.getMeltingPointC() + 6500,
+ INSTANCE.TUNGSTEN.getBoilingPointC() + 7500,
+ 160,
+ 101,
+ true,
+ "✦◆✦",
+ 0); // Not a GT Inherited Material
+ public static final Material ASTRAL_TITANIUM = new Material(
+ "Astral Titanium",
+ MaterialState.SOLID,
+ TextureSets.REFINED.get(),
+ new short[] { 220, 160, 240, 2 },
+ INSTANCE.TITANIUM.getMeltingPointC() + 7500,
+ INSTANCE.TITANIUM.getBoilingPointC() + 7500,
+ 145,
+ 133,
+ true,
+ "✧◇✧",
+ 0); // Not a GT Inherited Material
+ public static final Material CHRONOMATIC_GLASS = new Material(
+ "Chromatic Glass",
+ MaterialState.SOLID,
+ new short[] { 255, 255, 255, 3 },
+ 9200,
+ 17550,
+ 40,
+ 51,
+ false,
+ "⌘☯𓍰 𓍱 𓍲 𓍳 𓍴 𓍵 𓍶 𓍷 𓍸 ☯⌘ ",
+ 0); // Not a GT Inherited Material
+ public static final Material ADVANCED_NITINOL = new Material(
+ "Advanced Nitinol",
+ MaterialState.SOLID,
+ TextureSets.ENRICHED.get(),
+ ALLOY.NITINOL_60.getRGB(),
+ 8400,
+ 14377,
+ 40,
+ 51,
+ true,
+ StringUtils.subscript("⚷⚙⚷ Ni4Ti6"),
+ 0); // Not a GT Inherited Material
+ public static final Material HYPOGEN = new Material(
+ "Hypogen",
+ MaterialState.SOLID,
+ TextureSets.NUCLEAR.get(),
+ new short[] { 220, 120, 75, 2 },
+ 11255,
+ 19377,
+ 240,
+ 251,
+ true,
+ "Hy⚶",
+ 0); // Not a GT Inherited Material
+ public static final Material RHUGNOR = new Material(
+ "Rhugnor",
+ MaterialState.SOLID,
+ TextureSets.ENRICHED.get(),
+ new short[] { 190, 0, 255, 0 },
+ 8750,
+ 14757,
+ 184,
+ 142,
+ true,
+ "Fs⚶",
+ 0); // Not a GT Inherited Material //funeris
+ public static final Material FORCE = new Material(
+ "Force",
+ MaterialState.SOLID,
+ TextureSets.ENRICHED.get(),
+ new short[] { 250, 250, 20, 0 },
+ 4550,
+ 6830,
+ 63,
+ 81,
+ true,
+ "Fc⚙",
+ 0); // Not a GT Inherited Material
+
+ // Runescape materials
+ public static final Material BLACK_METAL = new Material(
+ "Black Metal",
+ MaterialState.SOLID,
+ TextureSet.SET_METALLIC,
+ new short[] { 5, 5, 5 },
+ 2350,
+ 4650,
+ 24,
+ 17,
+ false,
+ "҈",
+ 0,
+ new MaterialStack[] { new MaterialStack(getInstance().LEAD, 15),
+ new MaterialStack(getInstance().MANGANESE, 25), new MaterialStack(getInstance().CARBON, 60) }); // Not
+ // a
+ // GT
+ // Inherited
+ // Material
+ public static final Material WHITE_METAL = new Material(
+ "White Metal",
+ MaterialState.SOLID,
+ TextureSet.SET_METALLIC,
+ new short[] { 255, 255, 255 },
+ 4560,
+ 7580,
+ 35,
+ 41,
+ false,
+ "҉",
+ 0,
+ new MaterialStack[] { new MaterialStack(getInstance().COPPER, 5),
+ new MaterialStack(getInstance().ANTIMONY, 10), new MaterialStack(getInstance().PLATINUM, 10),
+ new MaterialStack(getInstance().TIN, 75) }); // Not a GT Inherited Material
+
+ public static final Material GRANITE = new Material(
+ "Ancient Granite",
+ MaterialState.SOLID,
+ TextureSet.SET_SAND,
+ new short[] { 107, 107, 107 },
+ 500,
+ 2000,
+ 16,
+ 12,
+ false,
+ "«»",
+ 0,
+ false,
+ new MaterialStack[] { new MaterialStack(getInstance().OXYGEN, 16),
+ new MaterialStack(getInstance().IRON, 10), new MaterialStack(getInstance().SILICONDIOXIDE, 10),
+ new MaterialStack(getInstance().ALUMINIUMOXIDE, 6), new MaterialStack(getInstance().POTASSIUM, 6),
+ new MaterialStack(getInstance().CALCIUM, 4), new MaterialStack(getInstance().SODIUM, 4),
+ new MaterialStack(getInstance().YTTERBIUM, 2) }); // Not
+ // a
+ // GT
+ // Inherited
+ // Material
+
+ public static final Material RUNITE = new Material(
+ "Runite",
+ MaterialState.SOLID,
+ TextureSet.SET_FINE,
+ new short[] { 60, 200, 190 },
+ 6750,
+ 11550,
+ 73,
+ 87,
+ true,
+ "Rt*",
+ 0); // Not a GT Inherited Material
+ public static final Material DRAGON_METAL = new Material(
+ "Dragonblood",
+ MaterialState.SOLID,
+ TextureSet.SET_SHINY,
+ new short[] { 220, 40, 20, 2 },
+ 10160,
+ 17850,
+ 96,
+ 105,
+ true,
+ "۞",
+ 0); // Not a GT Inherited Material
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/material/MISC_MATERIALS.java b/gtpp/src/main/java/gtPlusPlus/core/material/MISC_MATERIALS.java
new file mode 100644
index 0000000000..c46b05fbb8
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/material/MISC_MATERIALS.java
@@ -0,0 +1,592 @@
+package gtPlusPlus.core.material;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TextureSet;
+import gtPlusPlus.core.client.CustomTextureSet.TextureSets;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public final class MISC_MATERIALS {
+
+ /*
+ * Some of these materials purely exist as data objects, items will most likely be assigned separately. Most are
+ * just compositions which will have dusts assigned to them.
+ */
+
+ public static void run() {
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(POTASSIUM_NITRATE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(SODIUM_NITRATE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(STRONTIUM_OXIDE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(STRONTIUM_HYDROXIDE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(CYANOACETIC_ACID, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(SODIUM_CYANIDE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(CALCIUM_CHLORIDE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(COPPER_SULFATE, false);
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(COPPER_SULFATE_HYDRATED, false);
+ WATER.registerComponentForMaterial(FluidUtils.getWater(1000));
+ }
+
+ public static final Material POTASSIUM_NITRATE = new Material(
+ "Potassium Nitrate",
+ MaterialState.SOLID, // State
+ null,
+ null,
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "KNO3",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().POTASSIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 3));
+ public static final Material SODIUM_NITRATE = new Material(
+ "Sodium Nitrate",
+ MaterialState.SOLID, // State
+ null,
+ null,
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "NaNO3",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 3));
+
+ public static final Material SOLAR_SALT_COLD = new Material(
+ "Solar Salt (Cold)",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(POTASSIUM_NITRATE, 4),
+ new MaterialStack(SODIUM_NITRATE, 6));
+
+ public static final Material SOLAR_SALT_HOT = new Material(
+ "Solar Salt (Hot)",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 200, 25, 25 }, // Material Colour
+ 1200, // Melting Point in C
+ 3300, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(POTASSIUM_NITRATE, 4),
+ new MaterialStack(SODIUM_NITRATE, 6));
+
+ public static final Material STRONTIUM_OXIDE = new Material(
+ "Strontium Oxide",
+ MaterialState.SOLID,
+ TextureSet.SET_METALLIC,
+ null,
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "SrO",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().STRONTIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1));
+
+ public static final Material SELENIUM_DIOXIDE = new Material(
+ "Selenium Dioxide",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().SELENIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2));
+
+ public static final Material SELENIOUS_ACID = new Material(
+ "Selenious Acid",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(SELENIUM_DIOXIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 8),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 4));
+
+ public static final Material HYDROGEN_CYANIDE = new Material(
+ "Hydrogen Cyanide",
+ MaterialState.PURE_GAS, // State
+ null, // Material Colour
+ 4, // Melting Point in C
+ 26, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 1),
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1));
+
+ public static final Material CARBON_MONOXIDE = new Material(
+ "Carbon Monoxide",
+ MaterialState.PURE_GAS, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().CARBON, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1));
+
+ public static final Material CARBON_DIOXIDE = new Material(
+ "Carbon Dioxide",
+ MaterialState.PURE_GAS, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().CARBON, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2));
+
+ public static final Material WOODS_GLASS = new Material(
+ "Wood's Glass", // Material Name
+ MaterialState.SOLID, // State
+ TextureSets.GEM_A.get(), // Texture Set
+ new short[] { 220, 60, 255 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "Si4Ba3Na2Ni",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().SILICON, 40),
+ new MaterialStack(ELEMENT.getInstance().BARIUM, 30),
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 20),
+ new MaterialStack(ELEMENT.getInstance().NICKEL, 10));
+
+ /*
+ * Rare Earth Materials
+ */
+
+ public static final Material RARE_EARTH_LOW = new Material(
+ "Rare Earth (I)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.GEM_A.get(), // Texture Set
+ null, // Material Colour
+ 1200,
+ 2500,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ORES.GREENOCKITE, 1), new MaterialStack(ORES.LANTHANITE_CE, 1),
+ new MaterialStack(ORES.AGARDITE_CD, 1), new MaterialStack(ORES.YTTRIALITE, 1),
+ new MaterialStack(MaterialUtils.generateMaterialFromGtENUM(Materials.NetherQuartz), 1),
+ new MaterialStack(MaterialUtils.generateMaterialFromGtENUM(Materials.Galena), 1),
+ new MaterialStack(MaterialUtils.generateMaterialFromGtENUM(Materials.Chalcopyrite), 1),
+ new MaterialStack(ORES.CRYOLITE, 1), new MaterialStack(ELEMENT.getInstance().YTTRIUM, 1) });
+
+ public static final Material RARE_EARTH_MID = new Material(
+ "Rare Earth (II)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.ENRICHED.get(), // Texture Set
+ null, // Material Colour
+ 3500,
+ 5000,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ORES.LANTHANITE_ND, 1), new MaterialStack(ORES.AGARDITE_ND, 1),
+ new MaterialStack(ORES.YTTRIAITE, 1), new MaterialStack(ORES.CROCROITE, 1),
+ new MaterialStack(ORES.NICHROMITE, 1), new MaterialStack(ORES.ZIRCON, 1),
+ new MaterialStack(ELEMENT.STANDALONE.GRANITE, 1), new MaterialStack(ELEMENT.STANDALONE.BLACK_METAL, 1),
+ new MaterialStack(ELEMENT.STANDALONE.RUNITE, 1) });
+
+ public static final Material RARE_EARTH_HIGH = new Material(
+ "Rare Earth (III)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ null, // Material Colour
+ 5200,
+ 7500,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ORES.GADOLINITE_Y, 1), new MaterialStack(ORES.LEPERSONNITE, 1),
+ new MaterialStack(ORES.FLORENCITE, 1), new MaterialStack(ORES.FLUORCAPHITE, 1),
+ new MaterialStack(ORES.LAUTARITE, 1), new MaterialStack(ORES.DEMICHELEITE_BR, 1),
+ new MaterialStack(ORES.ALBURNITE, 1), new MaterialStack(ORES.SAMARSKITE_Y, 1),
+ new MaterialStack(ORES.AGARDITE_LA, 1), });
+
+ public static final Material WATER = new Material(
+ "Water",
+ MaterialState.PURE_LIQUID,
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1));
+
+ // OH
+ public static final Material HYDROXIDE = new Material(
+ "Hydroxide", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1));
+
+ // NH3
+ public static final Material AMMONIA = new Material(
+ "Ammonia", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -77, // Melting Point in C
+ -33, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 3));
+
+ // NH4
+ public static final Material AMMONIUM = new Material(
+ "Ammonium", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 4));
+
+ public static final Material HYDROGEN_CHLORIDE = new Material(
+ "Hydrogen Chloride",
+ MaterialState.PURE_GAS,
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 1));
+
+ public static final Material HYDROGEN_CHLORIDE_MIX = new Material(
+ "Hydrogen Chloride Mix",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 1));
+
+ public static final Material SODIUM_CHLORIDE = new Material(
+ "Sodium Chloride",
+ MaterialState.PURE_GAS,
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 1));
+
+ public static final Material SALT_WATER = new Material(
+ "Salt Water",
+ MaterialState.PURE_LIQUID,
+ new MaterialStack(WATER, 3),
+ new MaterialStack(SODIUM_CHLORIDE, 1));
+
+ public static final Material BRINE = new Material(
+ "Brine",
+ MaterialState.PURE_LIQUID,
+ new MaterialStack(SALT_WATER, 1),
+ new MaterialStack(SODIUM_CHLORIDE, 2));
+
+ public static final Material STRONTIUM_HYDROXIDE = new Material(
+ "Strontium Hydroxide",
+ MaterialState.SOLID,
+ TextureSet.SET_METALLIC,
+ null,
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "Sr(OH)2",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().STRONTIUM, 1),
+ new MaterialStack(MISC_MATERIALS.HYDROXIDE, 2));
+
+ // Glue Chemicals
+
+ public static final Material ACETIC_ANHYDRIDE = new Material(
+ "Acetic Anhydride",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 250, 240, 110 }, // Material Colour
+ -73, // Melting Point in C
+ 139, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "(CH3CO)2O",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 4),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 6),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 3));
+
+ public static final Material CHLOROACETIC_ACID = new Material(
+ "Chloroacetic Acid",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 230, 200, 90 }, // Material Colour
+ 63, // Melting Point in C
+ 189, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "ClCH2-COOH",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 3),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 1));
+
+ public static final Material DICHLOROACETIC_ACID = new Material(
+ "Dichloroacetic Acid",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 190, 160, 60 }, // Material Colour
+ 13, // Melting Point in C
+ 194, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "Cl2CH-COOH",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 2));
+
+ public static final Material TRICHLOROACETIC_ACID = new Material(
+ "Trichloroacetic Acid",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 120, 100, 30 }, // Material Colour
+ 57, // Melting Point in C
+ 196, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "Cl3C-COOH",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 3));
+
+ public static final Material CHLOROACETIC_MIXTURE = new Material(
+ "Chloroacetic Mixture",
+ MaterialState.LIQUID, // State
+ null,
+ new short[] { 210, 160, 10 },
+ 40,
+ 192,
+ -1,
+ -1,
+ false,
+ "Cl?H?C-COOH",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 6),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 6),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 6),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 6));
+
+ public static final Material SODIUM_CYANIDE = new Material(
+ "Sodium Cyanide",
+ MaterialState.SOLID, // State
+ new short[] { 180, 190, 255 }, // Material Colour
+ 563, // Melting Point in C
+ 1496, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "NaCN",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 1),
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1));
+
+ public static final Material CALCIUM_CHLORIDE = new Material(
+ "Calcium Chloride",
+ MaterialState.SOLID, // State
+ new short[] { 180, 190, 255 }, // Material Colour
+ 563, // Melting Point in C
+ 1496, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "CaCl2",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 2));
+
+ public static final Material CYANOACETIC_ACID = new Material(
+ "Cyanoacetic Acid",
+ MaterialState.SOLID, // State
+ new short[] { 130, 130, 40 }, // Material Colour
+ 66, // Melting Point in C
+ 108, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "C3H3NO2",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 3),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 3),
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2));
+
+ public static final Material SOLID_ACID_MIXTURE = new Material(
+ "Solid Acid Catalyst Mixture",
+ MaterialState.LIQUID, // State
+ new short[] { 80, 40, 0 }, // Material Colour
+ -10, // Melting Point in C
+ 337, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "?H2SO4?",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 4));
+
+ public static final Material COPPER_SULFATE = new Material(
+ "Copper(II) Sulfate",
+ MaterialState.SOLID, // State
+ new short[] { 200, 200, 200 }, // Material Colour
+ 590, // Melting Point in C
+ 650, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "CuSO4",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().COPPER, 1),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 4));
+
+ public static final Material COPPER_SULFATE_HYDRATED = new Material(
+ "Copper(II) Sulfate Pentahydrate",
+ MaterialState.SOLID, // State
+ new short[] { 90, 170, 255 }, // Material Colour
+ 590, // Melting Point in C
+ 650, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "CuSO4∙(H2O)5",
+ 0,
+ false,
+ new MaterialStack(ELEMENT.getInstance().COPPER, 1),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 4));
+
+ public static final Material ETHYL_CYANOACETATE = new Material(
+ "Ethyl Cyanoacetate",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 0, 75, 160 }, // Material Colour
+ -22, // Melting Point in C
+ 210, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "C5H7NO2",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 3));
+
+ public static final Material CYANOACRYLATE_POLYMER = new Material(
+ "Cyanoacrylate Polymer",
+ MaterialState.LIQUID, // State
+ new short[] { 140, 150, 160 }, // Material Colour
+ -25, // Melting Point in C
+ 55, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "(-C6H7NO2-)n",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 3));
+
+ public static final Material ETHYL_CYANOACRYLATE = new Material(
+ "Ethyl Cyanoacrylate (Super Glue)",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 170, 190, 200 }, // Material Colour
+ -25, // Melting Point in C
+ 55, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "C6H7NO2",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 3));
+
+ public static final Material MUTATED_LIVING_SOLDER = new Material(
+ "Mutated Living Solder",
+ MaterialState.PURE_LIQUID, // State
+ new short[] { 147, 109, 155 }, // Material Colour
+ -200, // Melting Point in C
+ 500, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ "?Sn?Bi?",
+ 0,
+ true,
+ new MaterialStack(ELEMENT.getInstance().TIN, 1),
+ new MaterialStack(ELEMENT.getInstance().BISMUTH, 1));
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/material/Material.java b/gtpp/src/main/java/gtPlusPlus/core/material/Material.java
new file mode 100644
index 0000000000..fec80060ac
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/material/Material.java
@@ -0,0 +1,1725 @@
+package gtPlusPlus.core.material;
+
+import static gregtech.api.enums.GT_Values.M;
+import static gregtech.api.enums.Mods.TinkerConstruct;
+import static gtPlusPlus.core.util.math.MathUtils.safeCast_LongToInt;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.base.BaseItemComponent.ComponentTypes;
+import gtPlusPlus.core.item.base.cell.BaseItemCell;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.xmod.tinkers.material.BaseTinkersMaterial;
+
+public class Material {
+
+ public static final Set<Material> mMaterialMap = new HashSet<>();
+ public static HashMap<String, Material> mMaterialCache = new HashMap<>();
+
+ public static final Map<String, Map<String, ItemStack>> mComponentMap = new HashMap<>();
+
+ public static HashMap<String, String> sChemicalFormula = new HashMap<>();
+
+ private String unlocalizedName;
+ private String localizedName;
+ private String translatedName;
+
+ private MaterialState materialState;
+ private TextureSet textureSet;
+
+ private Fluid mFluid;
+ private Fluid mPlasma;
+
+ private boolean vGenerateCells;
+
+ protected Object dataVar = MathUtils.generateSingularRandomHexValue();
+
+ private ArrayList<MaterialStack> vMaterialInput = new ArrayList<>();
+ public long[] vSmallestRatio;
+ public short vComponentCount;
+
+ private short[] RGBA;
+
+ private boolean usesBlastFurnace;
+ public boolean isRadioactive;
+ public byte vRadiationLevel;
+
+ private int meltingPointK;
+ private int boilingPointK;
+ private int meltingPointC;
+ private int boilingPointC;
+ private long vProtons;
+ private long vNeutrons;
+ private long vMass;
+ public int smallestStackSizeWhenProcessing; // Add a check for <=0 || > 64
+ public int vTier;
+ public int vVoltageMultiplier;
+ public String vChemicalFormula;
+ public String vChemicalSymbol;
+
+ public long vDurability;
+ public int vToolQuality;
+ public int vHarvestLevel;
+
+ public BaseTinkersMaterial vTiConHandler;
+
+ public short werkstoffID;
+
+ public static AutoMap<Materials> invalidMaterials = new AutoMap<>();
+
+ public Material(final String materialName, final MaterialState defaultState, final MaterialStack... inputs) {
+ this(materialName, defaultState, null, inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final MaterialStack... inputs) {
+ this(materialName, defaultState, null, 0, rgba, -1, -1, -1, -1, false, "", 0, false, false, inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba, int radiationLevel,
+ MaterialStack... materialStacks) {
+ this(
+ materialName,
+ defaultState,
+ null,
+ 0,
+ rgba,
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "",
+ radiationLevel,
+ false,
+ materialStacks);
+ }
+
+ public Material(String materialName, MaterialState defaultState, short[] rgba, int j, int k, int l, int m,
+ int radiationLevel, MaterialStack[] materialStacks) {
+ this(materialName, defaultState, null, 0, rgba, j, k, l, m, false, "", radiationLevel, false, materialStacks);
+ }
+
+ public Material(String materialName, MaterialState defaultState, final TextureSet set, short[] rgba,
+ int meltingPoint, int boilingPoint, int protons, int neutrons, int radiationLevel,
+ MaterialStack[] materialStacks) {
+ this(
+ materialName,
+ defaultState,
+ set,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ false,
+ "",
+ radiationLevel,
+ false,
+ materialStacks);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ "",
+ 0,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final String chemSymbol, final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemSymbol,
+ 0,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, boolean generateCells, final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ null,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ "",
+ 0,
+ generateCells,
+ true,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final int radiationLevel, final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ "",
+ radiationLevel,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final long durability,
+ final short[] rgba, final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final int radiationLevel, final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ durability,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ "",
+ radiationLevel,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final String chemicalSymbol, final int radiationLevel,
+ final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalSymbol,
+ radiationLevel,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final short[] rgba,
+ final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final String chemicalSymbol, final int radiationLevel, boolean addCells,
+ final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ null,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalSymbol,
+ radiationLevel,
+ addCells,
+ true,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, TextureSet textureSet,
+ final short[] rgba, final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final String chemicalSymbol, final int radiationLevel,
+ final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ textureSet,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalSymbol,
+ radiationLevel,
+ true,
+ true,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, TextureSet textureSet,
+ final short[] rgba, final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final String chemicalSymbol, final int radiationLevel, boolean addCells,
+ final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ textureSet,
+ 0,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalSymbol,
+ radiationLevel,
+ addCells,
+ true,
+ inputs);
+ }
+
+ private Material(final String materialName, final MaterialState defaultState, final long durability,
+ final short[] rgba, final int meltingPoint, final int boilingPoint, final long protons, final long neutrons,
+ final boolean blastFurnace, final String chemicalSymbol, final int radiationLevel,
+ final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ null,
+ durability,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalSymbol,
+ radiationLevel,
+ true,
+ true,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final TextureSet set,
+ final long durability, final short[] rgba, final int meltingPoint, final int boilingPoint, final long protons,
+ final long neutrons, final boolean blastFurnace, final String chemicalSymbol, final int radiationLevel,
+ boolean generateCells, final MaterialStack... inputs) {
+ this(
+ materialName,
+ defaultState,
+ set,
+ durability,
+ rgba,
+ meltingPoint,
+ boilingPoint,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalSymbol,
+ radiationLevel,
+ true,
+ true,
+ inputs);
+ }
+
+ public Material(final String materialName, final MaterialState defaultState, final TextureSet set,
+ final long durability, short[] rgba, final int meltingPoint, final int boilingPoint, final long protons,
+ final long neutrons, final boolean blastFurnace, String chemicalSymbol, final int radiationLevel,
+ boolean generateCells, boolean generateFluid, final MaterialStack... inputs) {
+
+ if (mMaterialMap.add(this)) {}
+
+ if (defaultState == MaterialState.ORE) {
+ rgba = null;
+ }
+
+ mComponentMap.put(unlocalizedName, new HashMap<>());
+
+ try {
+ this.unlocalizedName = Utils.sanitizeString(materialName);
+ this.localizedName = materialName;
+ this.translatedName = GT_LanguageManager
+ .addStringLocalization("gtplusplus.material." + unlocalizedName, localizedName);
+ mMaterialCache.put(getLocalizedName().toLowerCase(), this);
+ Logger.INFO("Stored " + getLocalizedName() + " to cache with key: " + getLocalizedName().toLowerCase());
+
+ this.materialState = defaultState;
+
+ Logger.MATERIALS(this.getLocalizedName() + " is " + defaultState.name() + ".");
+
+ this.vGenerateCells = generateCells;
+
+ // Add Components to an array.
+ if (inputs == null) {
+ this.vMaterialInput = null;
+ } else {
+ if (inputs.length != 0) {
+ for (int i = 0; i < inputs.length; i++) {
+ if (inputs[i] != null) {
+ this.vMaterialInput.add(i, inputs[i]);
+ }
+ }
+ }
+ }
+
+ // set RGB
+
+ if (rgba == null) {
+ if (vMaterialInput.size() > 0) {
+
+ try {
+ Short[] mMixedRGB = new Short[3];
+ AutoMap<Material> mMaterialSet = MaterialUtils.getCompoundMaterialsRecursively(this);
+ for (int mnh = 0; mnh < 3; mnh++) {
+ AutoMap<Short> aDataSet = new AutoMap<>();
+ Set<Material> set4 = new HashSet<>();
+ for (Material u : mMaterialSet) {
+ // if (u.getState() == MaterialState.ORE || u.getState() == MaterialState.SOLID)
+ set4.add(u);
+ }
+ for (Material e : set4) {
+ aDataSet.put(e.getRGB()[mnh]);
+ }
+
+ Short aAverage = MathUtils.getShortAverage(aDataSet);
+ if (aAverage > Short.MAX_VALUE || aAverage < Short.MIN_VALUE
+ || aAverage < 0
+ || aAverage > 255) {
+ if (aAverage > 255) {
+ while (aAverage > 255) {
+ aAverage = (short) (aAverage / 2);
+ }
+ }
+ aAverage = (short) Math.max(Math.min(aAverage, 255), 0);
+ }
+ mMixedRGB[mnh] = aAverage;
+ }
+
+ if (mMixedRGB != null && mMixedRGB[0] != null && mMixedRGB[1] != null && mMixedRGB[2] != null) {
+ this.RGBA = new short[] { mMixedRGB[0], mMixedRGB[1], mMixedRGB[2], 0 };
+ } else {
+ this.RGBA = Materials.Steel.mRGBa;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ this.RGBA = Materials.Steel.mRGBa;
+ }
+ } else {
+ // Boring Grey Material
+
+ int aValueForGen = this.getUnlocalizedName()
+ .hashCode();
+ int hashSize = MathUtils.howManyPlaces(aValueForGen);
+
+ String a = String.valueOf(aValueForGen);
+ String b = "";
+
+ if (hashSize < 9) {
+ int aSecondHash = this.materialState.hashCode();
+ int hashSize2 = MathUtils.howManyPlaces(aSecondHash);
+ if (hashSize2 + hashSize >= 9) {
+ b = String.valueOf(aValueForGen);
+ } else {
+ String c = b;
+ while (MathUtils.howManyPlaces(hashSize + c.length()) < 9) {
+ c = c + c.hashCode();
+ }
+ b = c;
+ }
+ }
+
+ String valueR;
+ if (b != null) {
+ valueR = a + b;
+ } else {
+ valueR = a;
+ }
+ short fc[] = new short[3];
+ int aIndex = 0;
+ for (char gg : valueR.toCharArray()) {
+ short ui = Short.parseShort("" + gg);
+ if (ui > 255 || ui < 0) {
+ if (ui > 255) {
+ while (ui > 255) {
+ ui = (short) (ui / 2);
+ }
+ } else {
+ ui = 0;
+ }
+ }
+ fc[aIndex++] = ui;
+ }
+ this.RGBA = fc;
+ }
+ } else {
+ this.RGBA = rgba;
+ }
+
+ // Set Melting/Boiling point, if value is -1 calculate it from compound inputs.
+ if (meltingPoint != -1) {
+ this.meltingPointC = meltingPoint;
+ } else {
+ this.meltingPointC = this.calculateMeltingPoint();
+ }
+ if (boilingPoint != -1) {
+ if (boilingPoint != 0) {
+ this.boilingPointC = boilingPoint;
+ } else {
+ this.boilingPointC = meltingPoint * 4;
+ }
+ } else {
+ this.boilingPointC = this.calculateBoilingPoint();
+ }
+
+ this.meltingPointK = (int) MathUtils.celsiusToKelvin(this.meltingPointC);
+ this.boilingPointK = (int) MathUtils.celsiusToKelvin(this.boilingPointC);
+
+ // Set Proton/Neutron count, if value is -1 calculate it from compound inputs.
+ if (protons != -1) {
+ this.vProtons = protons;
+ } else {
+ this.vProtons = this.calculateProtons();
+ }
+ if (boilingPoint != -1) {
+ this.vNeutrons = neutrons;
+ } else {
+ this.vNeutrons = this.calculateNeutrons();
+ }
+
+ this.vMass = this.getMass();
+
+ // Sets tool Durability
+ if (durability != 0) {
+ this.vDurability = durability;
+ } else {
+ long aTempDura = 0;
+ for (MaterialStack g : this.getComposites()) {
+ if (g != null) {
+ aTempDura += safeCast_LongToInt(
+ g.getStackMaterial()
+ .getMass() * 2000);
+ }
+ }
+ this.vDurability = aTempDura > 0 ? aTempDura
+ : (this.getComposites()
+ .isEmpty() ? 51200
+ : 32000 * this.getComposites()
+ .size());
+ }
+
+ if ((this.vDurability >= 0) && (this.vDurability < 64000)) {
+ this.vToolQuality = 1;
+ this.vHarvestLevel = 2;
+ } else if ((this.vDurability >= 64000) && (this.vDurability < 128000)) {
+ this.vToolQuality = 2;
+ this.vHarvestLevel = 2;
+ } else if ((this.vDurability >= 128000) && (this.vDurability < 256000)) {
+ this.vToolQuality = 3;
+ this.vHarvestLevel = 2;
+ } else if ((this.vDurability >= 256000) && (this.vDurability < 512000)) {
+ this.vToolQuality = 3;
+ this.vHarvestLevel = 3;
+ } else if ((this.vDurability >= 512000) && (this.vDurability <= Integer.MAX_VALUE)) {
+ this.vToolQuality = 4;
+ this.vHarvestLevel = 4;
+ } else {
+ this.vToolQuality = 1;
+ this.vHarvestLevel = 1;
+ }
+
+ // Sets the Rad level
+ if (radiationLevel > 0) {
+ Logger.MATERIALS(this.getLocalizedName() + " is radioactive. Level: " + radiationLevel + ".");
+ this.isRadioactive = true;
+ this.vRadiationLevel = (byte) radiationLevel;
+ } else {
+ if (vMaterialInput.size() > 0) {
+ AutoMap<Byte> aDataSet = new AutoMap<>();
+ for (MaterialStack m : this.vMaterialInput) {
+ aDataSet.put(m.getStackMaterial().vRadiationLevel);
+ }
+ byte aAverage = MathUtils.getByteAverage(aDataSet);
+ if (aAverage > 0) {
+ Logger.MATERIALS(
+ this.getLocalizedName() + " is radioactive due to trace elements. Level: "
+ + aAverage
+ + ".");
+ this.isRadioactive = true;
+ this.vRadiationLevel = aAverage;
+ } else {
+ Logger.MATERIALS(this.getLocalizedName() + " is not radioactive.");
+ this.isRadioactive = false;
+ this.vRadiationLevel = 0;
+ }
+ } else {
+ Logger.MATERIALS(this.getLocalizedName() + " is not radioactive.");
+ this.isRadioactive = false;
+ this.vRadiationLevel = 0;
+ }
+ }
+
+ /*
+ * if (vMaterialInput.size() > 0) { AutoMap<Integer> aDataSet = new AutoMap<Integer>(); int bonus = 0; bonus
+ * += this.vMaterialInput.size(); bonus += MathUtils.roundToClosestInt(meltingPointC/1000);
+ * aDataSet.put(bonus); for (MaterialStack m : this.vMaterialInput) {
+ * aDataSet.put(m.getStackMaterial().vTier); } int aAverage = MathUtils.getIntAverage(aDataSet); if
+ * (aAverage > Integer.MAX_VALUE || aAverage < Integer.MIN_VALUE) { aAverage = 0; } if (aAverage > 0) {
+ * this.vTier = Math.min(aAverage, 10); } else { this.vTier = MaterialUtils.getTierOfMaterial((int)
+ * MathUtils.celsiusToKelvin(meltingPoint)); } } else { this.vTier = MaterialUtils.getTierOfMaterial((int)
+ * MathUtils.celsiusToKelvin(meltingPoint)); }
+ */
+ this.vTier = MaterialUtils.getTierOfMaterial(meltingPoint);
+
+ // Sets the materials 'tier'. Will probably replace this logic.
+
+ this.usesBlastFurnace = blastFurnace;
+ this.vVoltageMultiplier = MaterialUtils.getVoltageForTier(vTier);
+
+ this.vComponentCount = this.getComponentCount(inputs);
+ this.vSmallestRatio = this.getSmallestRatio(this.vMaterialInput);
+ int tempSmallestSize = 0;
+
+ if (this.vSmallestRatio != null) {
+ for (long l : this.vSmallestRatio) {
+ tempSmallestSize = (int) (tempSmallestSize + l);
+ }
+ this.smallestStackSizeWhenProcessing = tempSmallestSize; // Valid stacksizes
+ } else {
+ this.smallestStackSizeWhenProcessing = 1; // Valid stacksizes
+ }
+
+ // Makes a Fancy Chemical Tooltip
+
+ if (chemicalSymbol == null) {
+ chemicalSymbol = "";
+ }
+
+ this.vChemicalSymbol = chemicalSymbol;
+ if (this.vMaterialInput != null) {
+ this.vChemicalFormula = this.getToolTip(chemicalSymbol, OrePrefixes.dust.mMaterialAmount / M, true);
+ } else if (!this.vChemicalSymbol.equals("")) {
+ Logger.MATERIALS("materialInput is null, using a valid chemical symbol.");
+ this.vChemicalFormula = this.vChemicalSymbol;
+ } else {
+ Logger.MATERIALS("MaterialInput == null && chemicalSymbol probably equals nothing");
+ this.vChemicalSymbol = "??";
+ this.vChemicalFormula = "??";
+ }
+
+ if (generateFluid) {
+ final Materials aGregtechMaterial = tryFindGregtechMaterialEquivalent();
+ FluidStack aTest = FluidUtils.getWildcardFluidStack(localizedName, 1);
+ if (aTest != null) {
+ this.mFluid = aTest.getFluid();
+ checkForCellAndGenerate(this);
+ } else {
+ if (aGregtechMaterial != null && !MaterialUtils.isNullGregtechMaterial(aGregtechMaterial)) {
+ aTest = FluidUtils.getWildcardFluidStack(aGregtechMaterial, 1);
+ }
+ if (aTest != null) {
+ this.mFluid = aTest.getFluid();
+ checkForCellAndGenerate(this);
+ } else {
+ mFluid = generateFluid();
+ }
+ }
+ // Don't generate plasma for composites
+ if (this.getComposites()
+ .isEmpty()) {
+ this.mPlasma = this.generatePlasma();
+ }
+ } else {
+ this.mFluid = null;
+ this.mPlasma = null;
+ }
+ String ratio = "";
+ if (this.vSmallestRatio != null) {
+ for (long l : this.vSmallestRatio) {
+ if (ratio.equals("")) {
+ ratio = String.valueOf(l);
+ } else {
+ ratio = ratio + ":" + l;
+ }
+ }
+ }
+
+ this.textureSet = setTextureSet(set, vTier);
+
+ if (TinkerConstruct.isModLoaded() && this.materialState == MaterialState.SOLID) {
+ if (this.getProtons() >= 98 || this.getComposites()
+ .size() > 1 || this.getMeltingPointC() >= 3600) {
+ this.vTiConHandler = new BaseTinkersMaterial(this);
+ }
+ }
+
+ sChemicalFormula.put(materialName.toLowerCase(), this.vChemicalFormula);
+ Logger.MATERIALS("Creating a Material instance for " + materialName);
+ Logger.MATERIALS(
+ "Formula: " + this.vChemicalFormula
+ + " Smallest Stack: "
+ + this.smallestStackSizeWhenProcessing
+ + " Smallest Ratio:"
+ + ratio);
+ Logger.MATERIALS("Protons: " + this.vProtons);
+ Logger.MATERIALS("Neutrons: " + this.vNeutrons);
+ Logger.MATERIALS("Mass: " + this.vMass + "/units");
+ Logger.MATERIALS("Melting Point: " + this.meltingPointC + "C.");
+ Logger.MATERIALS("Boiling Point: " + this.boilingPointC + "C.");
+ } catch (Throwable t) {
+ Logger.MATERIALS("Stack Trace for " + materialName);
+ t.printStackTrace();
+ }
+ }
+
+ private static void checkForCellAndGenerate(Material material) {
+ if (!material.vGenerateCells) {
+ return;
+ }
+ String aName = Utils.sanitizeString(material.unlocalizedName);
+ String aName2 = Utils.sanitizeString(material.unlocalizedName.toLowerCase());
+ String aName3 = (material.localizedName == null) ? aName : material.localizedName;
+ ItemStack aTestCell1 = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + aName, 1);
+ ItemStack aTestCell2 = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + aName2, 1);
+ ItemStack aTestCell3 = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + aName3, 1);
+ if (aTestCell1 == null && aTestCell2 == null && aTestCell3 == null) {
+ Logger.INFO("Generating cell for " + material.localizedName);
+ new BaseItemCell(material);
+ } else {
+ if (aTestCell1 != null) {
+ Logger.INFO("Registering existing cell for " + material.localizedName + ", " + aName);
+ material.registerComponentForMaterial(OrePrefixes.cell, aTestCell1);
+ } else if (aTestCell2 != null) {
+ Logger.INFO("Registering existing cell for " + material.localizedName + ", " + aName2);
+ material.registerComponentForMaterial(OrePrefixes.cell, aTestCell2);
+ } else if (aTestCell3 != null) {
+ Logger.INFO("Registering existing cell for " + material.localizedName + ", " + aName3);
+ material.registerComponentForMaterial(OrePrefixes.cell, aTestCell3);
+ }
+ }
+ }
+
+ public final TextureSet getTextureSet() {
+ synchronized (this) {
+ return textureSet;
+ }
+ }
+
+ public TextureSet setTextureSet(TextureSet set) {
+ return setTextureSet(set, vTier);
+ }
+
+ public TextureSet setTextureSet(TextureSet set, int aTier) {
+ if (set != null) {
+ Logger.MATERIALS(
+ "Set textureset for " + this.localizedName
+ + " to be "
+ + set.mSetName
+ + ". This textureSet was supplied.");
+ return set;
+ }
+
+ int aGem = 0;
+ int aShiny = 0;
+ TextureSet aSet = null;
+
+ // Check Mixture Contents
+ for (MaterialStack m : this.getComposites()) {
+
+ // Gems
+ if (m.getStackMaterial() == ELEMENT.getInstance().AER) {
+ aGem++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().AQUA) {
+ aGem++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().IGNIS) {
+ aGem++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().TERRA) {
+ aGem++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().MAGIC) {
+ aGem++;
+ }
+ // Shiny Materials
+ if (m.getStackMaterial() == ELEMENT.getInstance().GOLD) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().SILVER) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().PLATINUM) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().TITANIUM) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().GERMANIUM) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().GALLIUM) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().MERCURY) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().MAGIC) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().SAMARIUM) {
+ aShiny++;
+ } else if (m.getStackMaterial() == ELEMENT.getInstance().TANTALUM) {
+ aShiny++;
+ }
+ }
+
+ if (aSet == null) {
+ if (aGem >= this.getComposites()
+ .size() / 2) {
+ if (MathUtils.isNumberEven(aGem)) {
+ Logger.MATERIALS(
+ "Set textureset for " + this.localizedName
+ + " to be "
+ + TextureSet.SET_GEM_HORIZONTAL.mSetName
+ + ".");
+ return TextureSet.SET_GEM_HORIZONTAL;
+ } else {
+ Logger.MATERIALS(
+ "Set textureset for " + this.localizedName
+ + " to be "
+ + TextureSet.SET_GEM_VERTICAL.mSetName
+ + ".");
+ return TextureSet.SET_GEM_VERTICAL;
+ }
+ }
+ }
+
+ if (aSet == null) {
+ if (aShiny >= this.getComposites()
+ .size() / 3) {
+ Logger.MATERIALS(
+ "Set textureset for " + this.localizedName + " to be " + TextureSet.SET_SHINY.mSetName + ".");
+ return TextureSet.SET_SHINY;
+ }
+ }
+
+ // build hash table with count
+ AutoMap<Material> sets = new AutoMap<>();
+ if (this.vMaterialInput != null) {
+ for (MaterialStack r : this.vMaterialInput) {
+ if (r.getStackMaterial()
+ .getTextureSet().mSetName.toLowerCase()
+ .contains("fluid")) {
+ sets.put(ELEMENT.getInstance().GOLD);
+ } else {
+ sets.put(r.getStackMaterial());
+ }
+ }
+ TextureSet mostUsedTypeTextureSet = MaterialUtils.getMostCommonTextureSet(new ArrayList<>(sets.values()));
+ if (mostUsedTypeTextureSet != null && mostUsedTypeTextureSet instanceof TextureSet) {
+ Logger.MATERIALS(
+ "Set textureset for " + this.localizedName + " to be " + mostUsedTypeTextureSet.mSetName + ".");
+ return mostUsedTypeTextureSet;
+ }
+ }
+ Logger.MATERIALS(
+ "Set textureset for " + this.localizedName + " to be " + Materials.Iron.mIconSet.mSetName + ". [Fallback]");
+ return Materials.Gold.mIconSet;
+ }
+
+ public final String getLocalizedName() {
+ if (this.localizedName != null) {
+ return this.localizedName;
+ }
+ return "ERROR BAD LOCALIZED NAME";
+ }
+
+ public final String getUnlocalizedName() {
+ if (this.unlocalizedName != null) {
+ return this.unlocalizedName;
+ }
+ return "ERROR.BAD.UNLOCALIZED.NAME";
+ }
+
+ public final String getTranslatedName() {
+ if (this.translatedName != null) {
+ return this.translatedName;
+ }
+ return "ERROR.BAD.TRANSLATED.NAME";
+ }
+
+ public final MaterialState getState() {
+ return this.materialState;
+ }
+
+ public final short[] getRGB() {
+ if (this.RGBA != null) {
+ return this.RGBA;
+ }
+ return new short[] { 255, 0, 0 };
+ }
+
+ public final short[] getRGBA() {
+ if (this.RGBA != null) {
+ if (this.RGBA.length == 4) {
+ return this.RGBA;
+ } else {
+ return new short[] { this.RGBA[0], this.RGBA[1], this.RGBA[2], 0 };
+ }
+ }
+ return new short[] { 255, 0, 0, 0 };
+ }
+
+ public final int getRgbAsHex() {
+
+ final int returnValue = Utils.rgbtoHexValue(this.RGBA[0], this.RGBA[1], this.RGBA[2]);
+ if (returnValue == 0) {
+ return (int) this.dataVar;
+ }
+ return Utils.rgbtoHexValue(this.RGBA[0], this.RGBA[1], this.RGBA[2]);
+ }
+
+ public final long getProtons() {
+ return this.vProtons;
+ }
+
+ public final long getNeutrons() {
+ return this.vNeutrons;
+ }
+
+ public final long getMass() {
+ return this.vProtons + this.vNeutrons;
+ }
+
+ public final int getMeltingPointC() {
+ return this.meltingPointC;
+ }
+
+ public final int getBoilingPointC() {
+ return this.boilingPointC;
+ }
+
+ public final int getMeltingPointK() {
+ return this.meltingPointK;
+ }
+
+ public final int getBoilingPointK() {
+ return this.boilingPointK;
+ }
+
+ public final boolean requiresBlastFurnace() {
+ return this.usesBlastFurnace;
+ }
+
+ public final ItemStack getComponentByPrefix(OrePrefixes aPrefix, int stacksize) {
+ String aKey = aPrefix.name();
+ Map<String, ItemStack> g = mComponentMap.get(this.unlocalizedName);
+ if (g == null) {
+ Map<String, ItemStack> aMap = new HashMap<>();
+ mComponentMap.put(unlocalizedName, aMap);
+ g = aMap;
+ }
+ ItemStack i = g.get(aKey);
+ if (i != null) {
+ return ItemUtils.getSimpleStack(i, stacksize);
+ } else {
+ // Try get a GT Material
+ Materials Erf = MaterialUtils.getMaterial(this.unlocalizedName);
+ if (Erf != null && !MaterialUtils.isNullGregtechMaterial(Erf)) {
+ ItemStack Erg = ItemUtils.getOrePrefixStack(aPrefix, Erf, stacksize);
+ if (Erg != null && ItemUtils.checkForInvalidItems(Erg)) {
+ Logger.MATERIALS("Found \"" + aKey + this.unlocalizedName + "\" using backup GT Materials option.");
+ g.put(aKey, Erg);
+ mComponentMap.put(unlocalizedName, g);
+ return Erg;
+ } else {
+ // Try get a molten cell
+ if (aPrefix == OrePrefixes.cell) {
+ Erg = ItemUtils.getOrePrefixStack(OrePrefixes.cellMolten, Erf, stacksize);
+ if (Erg != null && ItemUtils.checkForInvalidItems(Erg)) {
+ Logger.MATERIALS(
+ "Found \"" + OrePrefixes.cellMolten.name()
+ + this.unlocalizedName
+ + "\" using backup GT Materials option.");
+ g.put(aKey, Erg);
+ mComponentMap.put(unlocalizedName, g);
+ return Erg;
+ }
+ }
+ }
+ } else {
+ ItemStack u = ItemUtils.getItemStackOfAmountFromOreDictNoBroken(aKey + this.unlocalizedName, stacksize);
+ if (u != null) {
+ g.put(aKey, u);
+ mComponentMap.put(unlocalizedName, g);
+ return u;
+ }
+ }
+ // Logger.MATERIALS("Unabled to find \"" + aKey + this.unlocalizedName + "\"");
+ return ItemUtils.getErrorStack(stacksize, (aKey + this.unlocalizedName + " x" + stacksize));
+ }
+ }
+
+ public final Block getBlock() {
+ Block b = Block.getBlockFromItem(getBlock(1).getItem());
+ if (b == null) {
+ Logger.INFO(
+ "[ERROR] Tried to get invalid block for " + this.getLocalizedName()
+ + ", returning debug block instead.");
+ }
+ return b != null ? b : Blocks.lit_furnace;
+ }
+
+ public final ItemStack getBlock(final int stacksize) {
+ ItemStack i = getComponentByPrefix(OrePrefixes.block, stacksize);
+ return i != null ? i
+ : ItemUtils.getItemStackOfAmountFromOreDictNoBroken("block" + this.unlocalizedName, stacksize);
+ }
+
+ public final ItemStack getDust(final int stacksize) {
+ ItemStack i = getComponentByPrefix(OrePrefixes.dust, stacksize);
+ return i != null ? i : ItemUtils.getGregtechDust("dust" + this.unlocalizedName, stacksize);
+ }
+
+ public final ItemStack getSmallDust(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.dustSmall, stacksize);
+ }
+
+ public final ItemStack getTinyDust(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.dustTiny, stacksize);
+ }
+
+ public final ItemStack getIngot(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.ingot, stacksize);
+ }
+
+ public final ItemStack getHotIngot(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.ingotHot, stacksize);
+ }
+
+ public final ItemStack getPlate(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.plate, stacksize);
+ }
+
+ public final ItemStack getPlateDouble(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.plateDouble, stacksize);
+ }
+
+ public final ItemStack getPlateDense(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.plateDense, stacksize);
+ }
+
+ public final ItemStack getGear(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.gearGt, stacksize);
+ }
+
+ public final ItemStack getRod(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.stick, stacksize);
+ }
+
+ public final ItemStack getLongRod(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.stickLong, stacksize);
+ }
+
+ public final ItemStack getBolt(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.bolt, stacksize);
+ }
+
+ public final ItemStack getScrew(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.screw, stacksize);
+ }
+
+ public final ItemStack getFineWire(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireFine, stacksize);
+ }
+
+ public final ItemStack getFoil(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.foil, stacksize);
+ }
+
+ public final ItemStack getRing(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.ring, stacksize);
+ }
+
+ public final ItemStack getRotor(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.rotor, stacksize);
+ }
+
+ public final ItemStack getFrameBox(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.frameGt, stacksize);
+ }
+
+ public final ItemStack getCell(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cell, stacksize);
+ }
+
+ public final ItemStack getPlasmaCell(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cellPlasma, stacksize);
+ }
+
+ public final ItemStack getNugget(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.nugget, stacksize);
+ }
+
+ public final ItemStack getWire01(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireGt01, stacksize);
+ }
+
+ public final ItemStack getWire02(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireGt02, stacksize);
+ }
+
+ public final ItemStack getWire04(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireGt04, stacksize);
+ }
+
+ public final ItemStack getWire08(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireGt08, stacksize);
+ }
+
+ public final ItemStack getWire12(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireGt12, stacksize);
+ }
+
+ public final ItemStack getWire16(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.wireGt16, stacksize);
+ }
+
+ public final ItemStack getCable01(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cableGt01, stacksize);
+ }
+
+ public final ItemStack getCable02(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cableGt02, stacksize);
+ }
+
+ public final ItemStack getCable04(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cableGt04, stacksize);
+ }
+
+ public final ItemStack getCable08(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cableGt08, stacksize);
+ }
+
+ public final ItemStack getCable12(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cableGt12, stacksize);
+ }
+
+ public final ItemStack getCable16(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.cableGt16, stacksize);
+ }
+
+ /**
+ * Ore Components
+ *
+ * @return
+ */
+ public final ItemStack getOre(final int stacksize) {
+ return ItemUtils.getItemStackOfAmountFromOreDictNoBroken(
+ "ore" + Utils.sanitizeString(this.getUnlocalizedName()),
+ stacksize);
+ }
+
+ public final Block getOreBlock(final int stacksize) {
+ // Logger.DEBUG_MATERIALS("Trying to get ore block for "+this.getLocalizedName()+". Looking for
+ // '"+"ore"+Utils.sanitizeString(this.getUnlocalizedName())+"'.");
+ try {
+ ItemStack a1 = getOre(1);
+ Item a2 = a1.getItem();
+ Block a3 = Block.getBlockFromItem(a2);
+ if (a3 != null) {
+ return a3;
+ }
+
+ Block x = Block.getBlockFromItem(
+ ItemUtils
+ .getItemStackOfAmountFromOreDictNoBroken(
+ "ore" + Utils.sanitizeString(this.unlocalizedName),
+ stacksize)
+ .getItem());
+ if (x != null) {
+ return x;
+ }
+ } catch (Throwable t) {
+ // t.printStackTrace();
+ }
+ // Logger.MATERIALS("Failed getting the Ore Block for "+this.getLocalizedName()+".");
+ return Blocks.stone;
+ }
+
+ public final ItemStack getCrushed(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.crushed, stacksize);
+ }
+
+ public final ItemStack getCrushedPurified(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.crushedPurified, stacksize);
+ }
+
+ public final ItemStack getCrushedCentrifuged(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.crushedCentrifuged, stacksize);
+ }
+
+ public final ItemStack getDustPurified(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.dustPure, stacksize);
+ }
+
+ public final ItemStack getDustImpure(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.dustImpure, stacksize);
+ }
+
+ public final ItemStack getMilled(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.milled, stacksize);
+ }
+
+ public final ItemStack getRawOre(final int stacksize) {
+ return getComponentByPrefix(OrePrefixes.rawOre, stacksize);
+ }
+
+ public final boolean hasSolidForm() {
+ if (ItemUtils
+ .checkForInvalidItems(new ItemStack[] { getDust(1), getBlock(1), getTinyDust(1), getSmallDust(1) })) {
+ return true;
+ }
+ return false;
+ }
+
+ public final ItemStack[] getMaterialComposites() {
+ if (this.vMaterialInput != null && !this.vMaterialInput.isEmpty()) {
+ final ItemStack[] temp = new ItemStack[this.vMaterialInput.size()];
+ for (int i = 0; i < this.vMaterialInput.size(); i++) {
+ // Utils.LOG_MATERIALS("i:"+i);
+ ItemStack testNull = null;
+ try {
+ testNull = this.vMaterialInput.get(i)
+ .getValidStack();
+ } catch (final Throwable r) {
+ Logger.MATERIALS("Failed gathering material stack for " + this.localizedName + ".");
+ Logger.MATERIALS("What Failed: Length:" + this.vMaterialInput.size() + " current:" + i);
+ }
+ try {
+ if (testNull != null) {
+ // Utils.LOG_MATERIALS("not null");
+ temp[i] = this.vMaterialInput.get(i)
+ .getValidStack();
+ }
+ } catch (final Throwable r) {
+ Logger.MATERIALS("Failed setting slot " + i + ", using " + this.localizedName);
+ }
+ }
+ return temp;
+ }
+ return new ItemStack[] {};
+ }
+
+ public final ArrayList<MaterialStack> getComposites() {
+ return this.vMaterialInput;
+ }
+
+ public final int[] getMaterialCompositeStackSizes() {
+ if (!this.vMaterialInput.isEmpty()) {
+ final int[] temp = new int[this.vMaterialInput.size()];
+ for (int i = 0; i < this.vMaterialInput.size(); i++) {
+ if (this.vMaterialInput.get(i) != null) {
+ temp[i] = this.vMaterialInput.get(i)
+ .getDustStack().stackSize;
+ } else {
+ temp[i] = 0;
+ }
+ }
+ return temp;
+ }
+ return new int[] {};
+ }
+
+ private short getComponentCount(final MaterialStack[] inputs) {
+
+ if (inputs == null || inputs.length < 1) {
+ return 1;
+ }
+ int counterTemp = 0;
+ for (final MaterialStack m : inputs) {
+ if (m.getStackMaterial() != null) {
+ counterTemp++;
+ }
+ }
+ if (counterTemp != 0) {
+ return (short) counterTemp;
+ } else {
+ return 1;
+ }
+ }
+
+ public final long[] getSmallestRatio(final ArrayList<MaterialStack> tempInput) {
+ if (tempInput != null) {
+ if (!tempInput.isEmpty()) {
+ Logger.MATERIALS("length: " + tempInput.size());
+ Logger.MATERIALS("(inputs != null): " + (tempInput != null));
+ // Utils.LOG_MATERIALS("length: "+inputs.length);
+ final long[] tempRatio = new long[tempInput.size()];
+ for (int x = 0; x < tempInput.size(); x++) {
+ if (tempInput.get(x) != null) {
+ tempRatio[x] = tempInput.get(x)
+ .getPartsPerOneHundred();
+ }
+ }
+
+ final long[] smallestRatio = MathUtils.simplifyNumbersToSmallestForm(tempRatio);
+
+ if (smallestRatio.length > 0) {
+ String tempRatioStringThing1 = "";
+ for (long value : tempRatio) {
+ tempRatioStringThing1 = tempRatioStringThing1 + value + " : ";
+ }
+ Logger.MATERIALS("Default Ratio: " + tempRatioStringThing1);
+
+ String tempRatioStringThing = "";
+ int tempSmallestCraftingUseSize = 0;
+ for (long l : smallestRatio) {
+ tempRatioStringThing = tempRatioStringThing + l + " : ";
+ tempSmallestCraftingUseSize = (int) (tempSmallestCraftingUseSize + l);
+ }
+ // this.smallestStackSizeWhenProcessing = tempSmallestCraftingUseSize;
+ Logger.MATERIALS("Smallest Ratio: " + tempRatioStringThing);
+ return smallestRatio;
+ }
+ }
+ }
+ return new long[] {};
+ }
+
+ public final String getToolTip(final String chemSymbol, final long aMultiplier, final boolean aShowQuestionMarks) {
+ if (!aShowQuestionMarks && (this.vChemicalFormula.equals("?") || this.vChemicalFormula.equals("??"))) {
+ return "";
+ }
+ Logger.MATERIALS("===============| Calculating Atomic Formula for " + this.localizedName + " |===============");
+ if (!chemSymbol.equals("")) {
+ return chemSymbol;
+ }
+ final ArrayList<MaterialStack> tempInput = this.vMaterialInput;
+ if (tempInput != null) {
+ if (!tempInput.isEmpty()) {
+ String dummyFormula = "";
+ final long[] dummyFormulaArray = this.getSmallestRatio(tempInput);
+ if (dummyFormulaArray != null) {
+ if (dummyFormulaArray.length >= 1) {
+ for (int e = 0; e < tempInput.size(); e++) {
+ MaterialStack g = tempInput.get(e);
+ if (g != null) {
+ if (g.getStackMaterial() != null) {
+
+ String aChemSymbol = g.getStackMaterial().vChemicalSymbol;
+ String aChemFormula = g.getStackMaterial().vChemicalFormula;
+
+ if (aChemSymbol == null) {
+ aChemSymbol = "??";
+ }
+ if (aChemFormula == null) {
+ aChemFormula = "??";
+ }
+
+ if (!aChemSymbol.equals("??")) {
+ if (dummyFormulaArray[e] > 1) {
+
+ if (aChemFormula.length() > 3
+ || StringUtils.uppercaseCount(aChemFormula) > 1) {
+ dummyFormula = dummyFormula + "("
+ + aChemFormula
+ + ")"
+ + dummyFormulaArray[e];
+ } else {
+ dummyFormula = dummyFormula + aChemFormula + dummyFormulaArray[e];
+ }
+ } else if (dummyFormulaArray[e] == 1) {
+ if (aChemFormula.length() > 3
+ || StringUtils.uppercaseCount(aChemFormula) > 1) {
+ dummyFormula = dummyFormula + "(" + aChemFormula + ")";
+ } else {
+ dummyFormula = dummyFormula + aChemFormula;
+ }
+ } else {
+ dummyFormula = dummyFormula + "??";
+ }
+ } else {
+ dummyFormula = dummyFormula + "??";
+ }
+ } else {
+ dummyFormula = dummyFormula + "??";
+ }
+ }
+ }
+ return StringUtils.subscript(dummyFormula);
+ // return dummyFormula;
+ }
+ Logger.MATERIALS("dummyFormulaArray <= 0");
+ }
+ Logger.MATERIALS("dummyFormulaArray == null");
+ }
+ Logger.MATERIALS("tempInput.length <= 0");
+ }
+ Logger.MATERIALS("tempInput == null");
+ return "??";
+ }
+
+ public final boolean queueFluidGeneration() {
+ return isFluidQueued = true;
+ }
+
+ public static final void generateQueuedFluids() {
+ for (Material m : mMaterialMap) {
+ if (m.isFluidQueued) {}
+ }
+ }
+
+ // If we need a fluid, let's just queue it for later.
+ public boolean isFluidQueued = false;
+
+ public final Fluid generateFluid() {
+ if (this.materialState == MaterialState.ORE) {
+ return null;
+ }
+
+ Fluid aGTBaseFluid = null;
+
+ // Clean up Internal Fluid Generation
+ final Materials n1 = MaterialUtils
+ .getMaterial(this.getLocalizedName(), Utils.sanitizeString(this.getLocalizedName()));
+ final Materials n2 = MaterialUtils
+ .getMaterial(this.getUnlocalizedName(), Utils.sanitizeString(this.getUnlocalizedName()));
+
+ FluidStack f1 = FluidUtils.getWildcardFluidStack(n1, 1);
+ FluidStack f2 = FluidUtils.getWildcardFluidStack(n2, 1);
+ FluidStack f3 = FluidUtils
+ .getWildcardFluidStack(Utils.sanitizeString(this.getUnlocalizedName(), new char[] { '-', '_' }), 1);
+ FluidStack f4 = FluidUtils
+ .getWildcardFluidStack(Utils.sanitizeString(this.getLocalizedName(), new char[] { '-', '_' }), 1);
+
+ if (f1 != null) {
+ aGTBaseFluid = f1.getFluid();
+ } else if (f2 != null) {
+ aGTBaseFluid = f2.getFluid();
+ } else if (f3 != null) {
+ aGTBaseFluid = f3.getFluid();
+ } else if (f4 != null) {
+ aGTBaseFluid = f4.getFluid();
+ }
+
+ ItemStack aFullCell = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + this.getUnlocalizedName(), 1);
+ ItemStack aFullCell2 = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + this.getLocalizedName(), 1);
+ ItemStack aFullCell3 = ItemUtils.getItemStackOfAmountFromOreDictNoBroken(
+ "cell" + Utils.sanitizeString(this.getUnlocalizedName(), new char[] { '-', '_' }),
+ 1);
+ ItemStack aFullCell4 = ItemUtils.getItemStackOfAmountFromOreDictNoBroken(
+ "cell" + Utils.sanitizeString(this.getLocalizedName(), new char[] { '-', '_' }),
+ 1);
+
+ Logger.MATERIALS("Generating our own fluid.");
+ // Generate a Cell if we need to, but first validate all four searches are invalid
+
+ if (!ItemUtils.checkForInvalidItems(new ItemStack[] { aFullCell, aFullCell2, aFullCell3, aFullCell4 })) {
+ if (this.vGenerateCells) {
+ Item g = new BaseItemCell(this);
+ aFullCell = ItemUtils.getSimpleStack(g);
+ Logger.MATERIALS("Generated a cell for " + this.getUnlocalizedName());
+ } else {
+ Logger.MATERIALS("Did not generate a cell for " + this.getUnlocalizedName());
+ }
+ } else {
+ // One cell we searched for was valid, let's register it.
+ if (aFullCell != null) {
+ this.registerComponentForMaterial(ComponentTypes.CELL, aFullCell);
+ } else if (aFullCell2 != null) {
+ this.registerComponentForMaterial(ComponentTypes.CELL, aFullCell2);
+ } else if (aFullCell3 != null) {
+ this.registerComponentForMaterial(ComponentTypes.CELL, aFullCell3);
+ } else if (aFullCell4 != null) {
+ this.registerComponentForMaterial(ComponentTypes.CELL, aFullCell4);
+ }
+ }
+
+ // We found a GT fluid, let's use it.
+ // Good chance we registered the cell from this material too.
+ if (aGTBaseFluid != null) {
+ return aGTBaseFluid;
+ }
+
+ // This fluid does not exist at all, time to generate it.
+ if (this.materialState == MaterialState.SOLID) {
+ return FluidUtils.addGTFluid(
+ this.getUnlocalizedName(),
+ "Molten " + this.getLocalizedName(),
+ this.RGBA,
+ 4,
+ this.getMeltingPointK(),
+ aFullCell,
+ ItemUtils.getEmptyCell(),
+ 1000,
+ this.vGenerateCells);
+ } else if (this.materialState == MaterialState.LIQUID || this.materialState == MaterialState.PURE_LIQUID) {
+ return FluidUtils.addGTFluid(
+ this.getUnlocalizedName(),
+ this.getLocalizedName(),
+ this.RGBA,
+ 0,
+ this.getMeltingPointK(),
+ aFullCell,
+ ItemUtils.getEmptyCell(),
+ 1000,
+ this.vGenerateCells);
+ } else if (this.materialState == MaterialState.GAS || this.materialState == MaterialState.PURE_GAS) {
+ return FluidUtils
+ .generateGas(unlocalizedName, this.getLocalizedName(), getMeltingPointK(), getRGBA(), vGenerateCells);
+ /*
+ * return FluidUtils.addGTFluid( this.getUnlocalizedName(), this.getLocalizedName()+" Gas", this.RGBA, 2,
+ * this.getMeltingPointK(), aFullCell, ItemUtils.getEmptyCell(), 1000, this.vGenerateCells);
+ */
+ } else { // Plasma
+ return this.generatePlasma();
+ }
+ }
+
+ public final Fluid generatePlasma() {
+ if (this.materialState == MaterialState.ORE) {
+ return null;
+ }
+ final Materials isValid = tryFindGregtechMaterialEquivalent();
+
+ if (!this.vGenerateCells) {
+ return null;
+ }
+ if (isValid != null) {
+ for (Materials m : invalidMaterials.values()) {
+ if (isValid == m) {
+ return null;
+ }
+ }
+ if (isValid.mPlasma != null) {
+ Logger.MATERIALS("Using a pre-defined Plasma from GT.");
+ return isValid.mPlasma;
+ }
+ }
+ Logger.MATERIALS("Generating our own Plasma.");
+ return FluidUtils.addGTPlasma(this);
+ }
+
+ public Fluid getFluid() {
+ return mFluid;
+ }
+
+ public Fluid getPlasma() {
+ return mPlasma;
+ }
+
+ public final FluidStack getFluidStack(final int fluidAmount) {
+ if (this.mFluid == null) {
+ return null;
+ }
+ final FluidStack moltenFluid = new FluidStack(this.mFluid, fluidAmount);
+ return moltenFluid;
+ }
+
+ public final boolean setFluid(Fluid aFluid) {
+ if (this.mFluid == null) {
+ this.mFluid = aFluid;
+ return true;
+ }
+ return false;
+ }
+
+ public final int calculateMeltingPoint() {
+ try {
+ AutoMap<Integer> aDataSet = new AutoMap<>();
+ for (MaterialStack m : this.vMaterialInput) {
+ aDataSet.put(
+ m.getStackMaterial()
+ .getMeltingPointC());
+ }
+ long aAverage = MathUtils.getIntAverage(aDataSet);
+ return MathUtils.safeInt(aAverage);
+ } catch (Throwable r) {
+ r.printStackTrace();
+ return 500;
+ }
+ }
+
+ public final int calculateBoilingPoint() {
+ try {
+
+ AutoMap<Integer> aDataSet = new AutoMap<>();
+ for (MaterialStack m : this.vMaterialInput) {
+ aDataSet.put(
+ m.getStackMaterial()
+ .getBoilingPointC());
+ }
+ long aAverage = MathUtils.getIntAverage(aDataSet);
+ return MathUtils.safeInt(aAverage);
+ } catch (Throwable r) {
+ r.printStackTrace();
+ return 2500;
+ }
+ }
+
+ public final long calculateProtons() {
+ try {
+
+ AutoMap<Long> aDataSet = new AutoMap<>();
+ for (MaterialStack m : this.vMaterialInput) {
+ aDataSet.put(
+ m.getStackMaterial()
+ .getProtons());
+ }
+ long aAverage = MathUtils.getLongAverage(aDataSet);
+ return MathUtils.safeInt(aAverage);
+ } catch (Throwable r) {
+ r.printStackTrace();
+ return 50;
+ }
+ }
+
+ public final long calculateNeutrons() {
+ try {
+
+ AutoMap<Long> aDataSet = new AutoMap<>();
+ for (MaterialStack m : this.vMaterialInput) {
+ aDataSet.put(
+ m.getStackMaterial()
+ .getNeutrons());
+ }
+ long aAverage = MathUtils.getLongAverage(aDataSet);
+ return MathUtils.safeInt(aAverage);
+ } catch (Throwable r) {
+ r.printStackTrace();
+ return 75;
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (!Material.class.isInstance(obj)) {
+ return false;
+ }
+ Material aObj = (Material) obj;
+ if (aObj.unlocalizedName.equals(this.unlocalizedName)) {
+ if (aObj.localizedName.equals(this.localizedName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean registerComponentForMaterial(FluidStack aStack) {
+ return registerComponentForMaterial(this, aStack);
+ }
+
+ private static boolean registerComponentForMaterial(Material componentMaterial, FluidStack aStack) {
+ if (componentMaterial != null && aStack != null && componentMaterial.mFluid == null) {
+ componentMaterial.mFluid = aStack.getFluid();
+ return true;
+ }
+ return false;
+ }
+
+ public boolean registerComponentForMaterial(ComponentTypes aPrefix, ItemStack aStack) {
+ return registerComponentForMaterial(this, aPrefix.getGtOrePrefix(), aStack);
+ }
+
+ public boolean registerComponentForMaterial(OrePrefixes aPrefix, ItemStack aStack) {
+ return registerComponentForMaterial(this, aPrefix, aStack);
+ }
+
+ public static boolean registerComponentForMaterial(Material componentMaterial, ComponentTypes aPrefix,
+ ItemStack aStack) {
+ return registerComponentForMaterial(componentMaterial, aPrefix.getGtOrePrefix(), aStack);
+ }
+
+ public static boolean registerComponentForMaterial(Material componentMaterial, OrePrefixes aPrefix,
+ ItemStack aStack) {
+ if (componentMaterial == null) {
+ return false;
+ }
+ // Register Component
+ Map<String, ItemStack> aMap = Material.mComponentMap.get(componentMaterial.getUnlocalizedName());
+ if (aMap == null) {
+ aMap = new HashMap<>();
+ }
+ String aKey = aPrefix.name();
+ ItemStack x = aMap.get(aKey);
+ if (x == null) {
+ aMap.put(aKey, aStack);
+ Logger.MATERIALS(
+ "Registering a material component. Item: [" + componentMaterial.getUnlocalizedName()
+ + "] Map: ["
+ + aKey
+ + "]");
+ Material.mComponentMap.put(componentMaterial.getUnlocalizedName(), aMap);
+ return true;
+ } else {
+ // Bad
+ Logger.MATERIALS("Tried to double register a material component. ");
+ return false;
+ }
+ }
+
+ public Materials tryFindGregtechMaterialEquivalent() {
+ return tryFindGregtechMaterialEquivalent(this);
+ }
+
+ public static Materials tryFindGregtechMaterialEquivalent(Material aMaterial) {
+ String aMaterialName = aMaterial.getLocalizedName();
+ Materials aGregtechMaterial = Materials.get(aMaterialName);
+ if (aGregtechMaterial == null || MaterialUtils.isNullGregtechMaterial(aGregtechMaterial)) {
+ aMaterialName = aMaterialName.replace(" ", "_");
+ aGregtechMaterial = Materials.get(aMaterialName);
+ if (aGregtechMaterial == null || MaterialUtils.isNullGregtechMaterial(aGregtechMaterial)) {
+ aMaterialName = aMaterialName.replace(" ", "");
+ aGregtechMaterial = Materials.get(aMaterialName);
+ if (aGregtechMaterial == null || MaterialUtils.isNullGregtechMaterial(aGregtechMaterial)) {
+ return null;
+ } else {
+ return aGregtechMaterial;
+ }
+ } else {
+ return aGregtechMaterial;
+ }
+ } else {
+ return aGregtechMaterial;
+ }
+ }
+
+ public void setWerkstoffID(short werkstoffID) {
+ this.werkstoffID = werkstoffID;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/material/MaterialGenerator.java b/gtpp/src/main/java/gtPlusPlus/core/material/MaterialGenerator.java
new file mode 100644
index 0000000000..df2abd0acb
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/material/MaterialGenerator.java
@@ -0,0 +1,428 @@
+package gtPlusPlus.core.material;
+
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.block.base.BasicBlock.BlockTypes;
+import gtPlusPlus.core.block.base.BlockBaseModular;
+import gtPlusPlus.core.block.base.BlockBaseOre;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.item.base.BaseItemComponent.ComponentTypes;
+import gtPlusPlus.core.item.base.bolts.BaseItemBolt;
+import gtPlusPlus.core.item.base.dusts.BaseItemDust;
+import gtPlusPlus.core.item.base.dusts.BaseItemDust.DustState;
+import gtPlusPlus.core.item.base.gears.BaseItemGear;
+import gtPlusPlus.core.item.base.ingots.BaseItemIngot;
+import gtPlusPlus.core.item.base.ingots.BaseItemIngotHot;
+import gtPlusPlus.core.item.base.nugget.BaseItemNugget;
+import gtPlusPlus.core.item.base.ore.BaseItemCentrifugedCrushedOre;
+import gtPlusPlus.core.item.base.ore.BaseItemCrushedOre;
+import gtPlusPlus.core.item.base.ore.BaseItemImpureDust;
+import gtPlusPlus.core.item.base.ore.BaseItemPurifiedCrushedOre;
+import gtPlusPlus.core.item.base.ore.BaseItemPurifiedDust;
+import gtPlusPlus.core.item.base.ore.BaseItemRawOre;
+import gtPlusPlus.core.item.base.plates.BaseItemPlate;
+import gtPlusPlus.core.item.base.plates.BaseItemPlateDense;
+import gtPlusPlus.core.item.base.plates.BaseItemPlateDouble;
+import gtPlusPlus.core.item.base.rings.BaseItemRing;
+import gtPlusPlus.core.item.base.rods.BaseItemRod;
+import gtPlusPlus.core.item.base.rods.BaseItemRodLong;
+import gtPlusPlus.core.item.base.rotors.BaseItemRotor;
+import gtPlusPlus.core.item.base.screws.BaseItemScrew;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_AlloySmelter;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Assembler;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_BlastSmelter;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_DustGeneration;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Extruder;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_FluidCanning;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Fluids;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Fluorite;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_MaterialProcessing;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_MetalRecipe;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Ore;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Plasma;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Plates;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_Recycling;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_ShapedCrafting;
+
+public class MaterialGenerator {
+
+ public static final AutoMap<Set<RunnableWithInfo<Material>>> mRecipeMapsToGenerate = new AutoMap<>();
+
+ @SuppressWarnings("unused")
+ private static volatile Item temp;
+
+ @SuppressWarnings("unused")
+ private static volatile Block tempBlock;
+
+ @Deprecated
+ public static boolean addFluidCannerRecipe(ItemStack aEmpty, ItemStack aFullContainer, FluidStack aFluidIn,
+ FluidStack rFluidOut) {
+ return addFluidCannerRecipe(aEmpty, aFullContainer, aFluidIn, rFluidOut, null, null);
+ }
+
+ @Deprecated
+ public static boolean addFluidCannerRecipe(ItemStack aEmpty, ItemStack aFullContainer, FluidStack aFluidIn,
+ FluidStack rFluidOut, Integer aTime, Integer aEu) {
+
+ RecipeGen_FluidCanning g = new RecipeGen_FluidCanning(false, aEmpty, aFullContainer, aFluidIn, null, null, 0);
+ if (g != null && g.valid()) {
+ return true;
+ }
+ return false;
+ }
+
+ public static void generate(final Material matInfo) {
+ generate(matInfo, true);
+ }
+
+ public static void generate(final Material matInfo, final boolean generateEverything) {
+ generate(matInfo, generateEverything, true);
+ }
+
+ public static boolean generate(final Material matInfo, final boolean generateEverything,
+ final boolean generateBlastSmelterRecipes) {
+ try {
+ final String unlocalizedName = matInfo.getUnlocalizedName();
+ final String materialName = matInfo.getLocalizedName();
+ final short[] C = matInfo.getRGBA();
+ final int Colour = Utils.rgbtoHexValue(C[0], C[1], C[2]);
+ final boolean hotIngot = matInfo.requiresBlastFurnace();
+ int materialTier = matInfo.vTier; // TODO
+
+ if ((materialTier > 10) || (materialTier <= 0)) {
+ materialTier = 2;
+ }
+
+ int sRadiation = 0;
+ if (ItemUtils.isRadioactive(materialName) || (matInfo.vRadiationLevel != 0)) {
+ sRadiation = matInfo.vRadiationLevel;
+ }
+
+ if (matInfo.getState() == MaterialState.SOLID) {
+ if (generateEverything == true) {
+ if (sRadiation >= 1) {
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.STANDARD);
+ temp = new BaseItemIngot(matInfo);
+
+ temp = new BaseItemDust(matInfo);
+ temp = new BaseItemNugget(matInfo);
+ temp = new BaseItemPlate(matInfo);
+ temp = new BaseItemRod(matInfo);
+ temp = new BaseItemRodLong(matInfo);
+ } else {
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.STANDARD);
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.FRAME);
+ temp = new BaseItemIngot(matInfo);
+ if (hotIngot) {
+ temp = new BaseItemIngotHot(matInfo);
+ }
+ temp = new BaseItemDust(matInfo);
+ temp = new BaseItemNugget(matInfo);
+ temp = new BaseItemPlate(matInfo);
+ temp = new BaseItemPlateDouble(matInfo);
+ temp = new BaseItemBolt(matInfo);
+ temp = new BaseItemRod(matInfo);
+ temp = new BaseItemRodLong(matInfo);
+ temp = new BaseItemRing(matInfo);
+ temp = new BaseItemScrew(matInfo);
+ temp = new BaseItemRotor(matInfo);
+ temp = new BaseItemGear(matInfo);
+ temp = new BaseItemPlateDense(matInfo);
+ }
+ } else {
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.STANDARD);
+
+ temp = new BaseItemIngot(matInfo);
+ temp = new BaseItemDust(matInfo);
+ temp = new BaseItemNugget(matInfo);
+ temp = new BaseItemPlate(matInfo);
+ temp = new BaseItemPlateDouble(matInfo);
+ }
+ } else if (matInfo.getState() == MaterialState.LIQUID) {
+ if (generateEverything == true) {
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.STANDARD);
+ }
+ temp = new BaseItemIngot(matInfo);
+ temp = new BaseItemDust(matInfo);
+ temp = new BaseItemNugget(matInfo);
+ temp = new BaseItemPlate(matInfo);
+ temp = new BaseItemPlateDouble(matInfo);
+ } else if (matInfo.getState() == MaterialState.GAS) {
+ temp = new BaseItemDust(matInfo);
+ FluidUtils.generateGas(unlocalizedName, materialName, matInfo.getMeltingPointK(), C, true);
+ } else if (matInfo.getState() == MaterialState.PURE_GAS) {
+ FluidUtils.generateGas(unlocalizedName, materialName, matInfo.getMeltingPointK(), C, true);
+ return true;
+ } else if (matInfo.getState() == MaterialState.PURE_LIQUID) {
+ FluidUtils.generateFluidNoPrefix(unlocalizedName, materialName, matInfo.getMeltingPointK(), C);
+ return true;
+ } else if (matInfo.getState() == MaterialState.ORE) {
+
+ }
+
+ // Add A jillion Recipes - old code
+ new RecipeGen_AlloySmelter(matInfo);
+ new RecipeGen_Assembler(matInfo);
+ if (generateBlastSmelterRecipes) {
+ new RecipeGen_BlastSmelter(matInfo);
+ }
+ new RecipeGen_MetalRecipe(matInfo);
+ new RecipeGen_Extruder(matInfo);
+ new RecipeGen_Fluids(matInfo);
+ new RecipeGen_Plates(matInfo);
+ new RecipeGen_ShapedCrafting(matInfo);
+ new RecipeGen_MaterialProcessing(matInfo);
+
+ new RecipeGen_DustGeneration(matInfo);
+ new RecipeGen_Recycling(matInfo);
+ new RecipeGen_Plasma(matInfo);
+
+ return true;
+
+ } catch (final Throwable t) {
+
+ Logger.MATERIALS("" + matInfo.getLocalizedName() + " failed to generate.");
+ return false;
+ }
+ }
+
+ public static void generateDusts(final Material matInfo) {
+ final String unlocalizedName = matInfo.getUnlocalizedName();
+ final String materialName = matInfo.getLocalizedName();
+ final short[] C = matInfo.getRGBA();
+ final int Colour = Utils.rgbtoHexValue(C[0], C[1], C[2]);
+ int materialTier = matInfo.vTier; // TODO
+
+ if ((materialTier > 10) || (materialTier <= 0)) {
+ materialTier = 2;
+ }
+
+ int sRadiation = 0;
+ if (ItemUtils.isRadioactive(materialName) || (matInfo.vRadiationLevel != 0)) {
+ sRadiation = matInfo.vRadiationLevel;
+ }
+
+ if (matInfo.getState() == MaterialState.SOLID) {
+ temp = new BaseItemDust(matInfo);
+ }
+
+ // Add A jillion Recipes - old code
+ try {
+ RecipeGen_DustGeneration.addMixerRecipe_Standalone(matInfo);
+ new RecipeGen_Fluids(matInfo);
+ new RecipeGen_MaterialProcessing(matInfo);
+ } catch (Throwable t) {
+ Logger.MATERIALS("Failed to generate some recipes for " + materialName);
+ Logger.ERROR("Failed to generate some recipes for " + materialName);
+ t.printStackTrace();
+ }
+ // RecipeGen_Recycling.generateRecipes(matInfo);
+ }
+
+ public static void generateNuclearMaterial(final Material matInfo) {
+ generateNuclearMaterial(matInfo, true);
+ }
+
+ public static void generateNuclearDusts(final Material matInfo) {
+ generateNuclearDusts(matInfo, true);
+ }
+
+ public static void generateNuclearDusts(final Material matInfo, boolean generateDehydratorRecipe) {
+ generateNuclearMaterial(matInfo, false, true, false, false, true);
+ if (generateDehydratorRecipe && matInfo.getFluid() != null && matInfo.getDust(0) != null) {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(20) },
+ matInfo.getFluidStack(144),
+ null,
+ new ItemStack[] { matInfo.getDust(1), },
+ new int[] { 10000 },
+ 10 * (matInfo.vVoltageMultiplier / 5), // Time in ticks
+ matInfo.vVoltageMultiplier); // EU
+ } else {
+ Logger.INFO(
+ "Nuclear Dehydrator: Did not generate recipe for " + matInfo.getLocalizedName()
+ + " | Null Fluid? "
+ + (matInfo.getFluid() == null)
+ + " | Null Dust? "
+ + (matInfo.getDust(0) == null));
+ }
+ }
+
+ public static void generateNuclearMaterial(final Material matInfo, final boolean generatePlates) {
+ generateNuclearMaterial(matInfo, true, true, true, generatePlates, true);
+ }
+
+ public static void generateNuclearMaterial(final Material matInfo, final boolean generateBlock,
+ final boolean generateDusts, final boolean generateIngot, final boolean generatePlates,
+ final boolean disableOptionalRecipes) {
+ try {
+
+ if (generateBlock) {
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.STANDARD);
+ }
+ if (generateDusts) {
+ temp = new BaseItemDust(matInfo);
+ }
+ if (generateIngot) {
+ temp = new BaseItemIngot(matInfo);
+ temp = new BaseItemNugget(matInfo);
+ }
+
+ if (generatePlates) {
+ temp = new BaseItemPlate(matInfo);
+ temp = new BaseItemPlateDouble(matInfo);
+ new RecipeGen_Plates(matInfo);
+ new RecipeGen_Extruder(matInfo);
+ new RecipeGen_Assembler(matInfo);
+ }
+
+ if (!disableOptionalRecipes) {
+ new RecipeGen_ShapedCrafting(matInfo);
+ new RecipeGen_Fluids(matInfo);
+ new RecipeGen_MaterialProcessing(matInfo);
+ new RecipeGen_Recycling(matInfo);
+ }
+
+ new RecipeGen_MetalRecipe(matInfo);
+ new RecipeGen_DustGeneration(matInfo, disableOptionalRecipes);
+ new RecipeGen_Plasma(matInfo);
+
+ } catch (final Throwable t) {
+ Logger.MATERIALS("" + matInfo.getLocalizedName() + " failed to generate.");
+ }
+ }
+
+ public static void generateOreMaterial(final Material matInfo) {
+ generateOreMaterial(matInfo, true, true, true, matInfo.getRGBA());
+ }
+
+ @SuppressWarnings("unused")
+ public static void generateOreMaterial(final Material matInfo, boolean generateOre, boolean generateDust,
+ boolean generateSmallTinyDusts, short[] customRGB) {
+ try {
+
+ if (matInfo == null) {
+ Logger.DEBUG_MATERIALS("Invalid Material while constructing null material.");
+ return;
+ }
+
+ final String unlocalizedName = matInfo.getUnlocalizedName();
+ final String materialName = matInfo.getLocalizedName();
+ final short[] C = customRGB;
+ final Integer Colour = Utils.rgbtoHexValue(C[0], C[1], C[2]);
+
+ if (Colour == null) {
+ Logger.DEBUG_MATERIALS("Invalid Material while constructing " + materialName + ".");
+ return;
+ }
+
+ int sRadiation = 0;
+ if (matInfo.vRadiationLevel > 0) {
+ sRadiation = matInfo.vRadiationLevel;
+ }
+
+ if (generateOre) {
+ tempBlock = new BlockBaseOre(matInfo, BlockTypes.ORE);
+ }
+
+ DustState aState = new DustState(generateDust, generateSmallTinyDusts, generateSmallTinyDusts);
+
+ if (!aState.generatesDust()) {
+ if (aState.generatesSmallDust()) {
+ temp = new BaseItemComponent(matInfo, ComponentTypes.DUSTSMALL);
+ }
+ if (aState.generatesTinyDust()) {
+ temp = new BaseItemComponent(matInfo, ComponentTypes.DUSTTINY);
+ }
+ } else {
+ temp = new BaseItemDust(aState, matInfo);
+ }
+
+ temp = new BaseItemCrushedOre(matInfo);
+ temp = new BaseItemCentrifugedCrushedOre(matInfo);
+ temp = new BaseItemPurifiedCrushedOre(matInfo);
+ temp = new BaseItemImpureDust(matInfo);
+ temp = new BaseItemPurifiedDust(matInfo);
+ temp = new BaseItemRawOre(matInfo);
+
+ Logger.MATERIALS(
+ "Generated all ore components for " + matInfo.getLocalizedName()
+ + ", now generating processing recipes.");
+
+ if (matInfo == FLUORIDES.FLUORITE) {
+ new RecipeGen_Fluorite(matInfo);
+ } else {
+ new RecipeGen_Ore(matInfo);
+ }
+
+ } catch (final Throwable t) {
+ Logger.MATERIALS(
+ "[Error] " + (matInfo != null ? matInfo.getLocalizedName() : "Null Material") + " failed to generate.");
+ t.printStackTrace();
+ }
+ }
+
+ public static boolean generateOreMaterialWithAllExcessComponents(final Material matInfo) {
+ try {
+ if (matInfo == null) {
+ Logger.DEBUG_MATERIALS("Invalid Material while constructing null material.");
+ return false;
+ }
+ final short[] C = matInfo.getRGBA();
+ final Integer Colour = Utils.rgbtoHexValue(C[0], C[1], C[2]);
+
+ tempBlock = new BlockBaseOre(matInfo, BlockTypes.ORE);
+ tempBlock = new BlockBaseModular(matInfo, BlockTypes.STANDARD);
+ temp = new BaseItemIngot(matInfo);
+ temp = new BaseItemDust(matInfo);
+ temp = new BaseItemNugget(matInfo);
+ temp = new BaseItemPlate(matInfo);
+ temp = new BaseItemPlateDouble(matInfo);
+
+ temp = new BaseItemCrushedOre(matInfo);
+ temp = new BaseItemCentrifugedCrushedOre(matInfo);
+ temp = new BaseItemPurifiedCrushedOre(matInfo);
+ temp = new BaseItemImpureDust(matInfo);
+ temp = new BaseItemPurifiedDust(matInfo);
+ temp = new BaseItemRawOre(matInfo);
+
+ Logger.MATERIALS(
+ "Generated all ore & base components for " + matInfo.getLocalizedName()
+ + ", now generating processing recipes.");
+
+ new RecipeGen_Ore(matInfo, true);
+ new RecipeGen_AlloySmelter(matInfo);
+ new RecipeGen_Assembler(matInfo);
+ new RecipeGen_BlastSmelter(matInfo);
+ new RecipeGen_MetalRecipe(matInfo);
+ new RecipeGen_Extruder(matInfo);
+ new RecipeGen_Fluids(matInfo);
+ new RecipeGen_Plates(matInfo);
+ new RecipeGen_ShapedCrafting(matInfo);
+ new RecipeGen_MaterialProcessing(matInfo);
+ new RecipeGen_DustGeneration(matInfo);
+ new RecipeGen_Recycling(matInfo);
+ new RecipeGen_Plasma(matInfo);
+ return true;
+ } catch (final Throwable t) {
+ Logger.MATERIALS("" + matInfo.getLocalizedName() + " failed to generate.");
+ t.printStackTrace();
+ return false;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/material/MaterialStack.java b/gtpp/src/main/java/gtPlusPlus/core/material/MaterialStack.java
new file mode 100644
index 0000000000..37070a35ec
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/material/MaterialStack.java
@@ -0,0 +1,116 @@
+package gtPlusPlus.core.material;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.OrePrefixes;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.bartworks.BW_Utils;
+
+public class MaterialStack {
+
+ private final transient int[] vAmount;
+ private final Material stackMaterial;
+ private final double vPercentageToUse;
+
+ public MaterialStack(final Material inputs, final double partOutOf100) {
+ this.stackMaterial = inputs;
+ // Logger.INFO("Tried getting MaterialStack for "+inputs.getLocalizedName());
+ this.vPercentageToUse = partOutOf100;
+ this.vAmount = this.math(partOutOf100);
+ }
+
+ private int[] math(final double val) {
+ double i;
+ // Cast to a BigDecimal to round it.
+ final BigDecimal bd = new BigDecimal(val).setScale(2, RoundingMode.HALF_EVEN);
+ i = bd.doubleValue();
+ // Split the string into xx.xx
+ final String[] arr = String.valueOf(i)
+ .split("\\.");
+ final int[] intArr = new int[2];
+ intArr[0] = Integer.parseInt(arr[0]);
+ intArr[1] = Integer.parseInt(arr[1]);
+ return intArr;
+ }
+
+ public ItemStack getValidStack() {
+ if (this.stackMaterial.getDust(1) == null) {
+ // if (this.stackMaterial.getCell(1) == null){
+ return null;
+ // }
+ // return this.stackMaterial.getCell(this.vAmount[0]);
+ }
+ return this.stackMaterial.getDust(this.vAmount[0]);
+ }
+
+ public ItemStack getDustStack() {
+ return this.stackMaterial.getDust(this.vAmount[0]);
+ }
+
+ public ItemStack getDustStack(final int amount) {
+ return this.stackMaterial.getDust(amount);
+ }
+
+ public ItemStack getUnificatedDustStack(final int amount) {
+ if (this.stackMaterial.werkstoffID != 0) {
+ ItemStack stack = BW_Utils
+ .getCorrespondingItemStack(OrePrefixes.dust, this.stackMaterial.werkstoffID, amount);
+ if (stack != null) {
+ return stack;
+ }
+ }
+ return getDustStack(amount);
+ }
+
+ public Material getStackMaterial() {
+ if (this.stackMaterial == null) {
+ Logger.MATERIALS("Tried getStackMaterial, got an invalid material.");
+ Logger.MATERIALS(ReflectionUtils.getMethodName(0));
+ Logger.MATERIALS(ReflectionUtils.getMethodName(1));
+ Logger.MATERIALS(ReflectionUtils.getMethodName(2));
+ Logger.MATERIALS(ReflectionUtils.getMethodName(3));
+ return null;
+ }
+ return this.stackMaterial;
+ }
+
+ public double getvPercentageToUse() {
+ return this.vPercentageToUse;
+ }
+
+ public long[] getSmallestStackSizes() {
+ return this.stackMaterial.getSmallestRatio(this.stackMaterial.getComposites());
+ }
+
+ public int getPartsPerOneHundred() {
+ if (this.vAmount != null) {
+ if ((this.vAmount[0] >= 1) && (this.vAmount[0] <= 100)) {
+ return this.vAmount[0];
+ }
+ }
+ return 100;
+ }
+
+ public ItemStack getLeftOverStacksFromDecimalValue() {
+ final int temp = this.vAmount[1];
+ int getCount;
+ if ((temp >= 25) && (temp <= 99)) {
+ getCount = temp / 25;
+ return this.stackMaterial.getSmallDust(getCount);
+ } else if ((temp >= 11) && (temp <= 24)) {
+ getCount = temp / 11;
+ return this.stackMaterial.getTinyDust(getCount);
+ } else {
+ return null;
+ }
+ }
+
+ public ItemStack[] getValidItemStacks() {
+ return ItemUtils.validItemsForOreDict(this.stackMaterial.getUnlocalizedName());
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/material/NONMATERIAL.java b/gtpp/src/main/java/gtPlusPlus/core/material/NONMATERIAL.java
new file mode 100644
index 0000000000..5e084b84bf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/material/NONMATERIAL.java
@@ -0,0 +1,42 @@
+package gtPlusPlus.core.material;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TextureSet;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class NONMATERIAL {
+
+ // Soul Sand
+ public static final Material SOULSAND = MaterialUtils.generateMaterialFromGtENUM(Materials.SoulSand);
+
+ // Redstone
+ public static final Material REDSTONE = MaterialUtils.generateMaterialFromGtENUM(Materials.Redstone);
+
+ // Glowstone Dust
+ public static final Material GLOWSTONE = MaterialUtils.generateMaterialFromGtENUM(Materials.Glowstone);
+
+ // Enderpearl
+ public static final Material ENDERPEARL = MaterialUtils.generateMaterialFromGtENUM(Materials.EnderPearl);
+
+ // Raw Flesh
+ public static final Material MEAT = MaterialUtils.generateMaterialFromGtENUM(Materials.MeatRaw);
+
+ // Clay
+ public static final Material CLAY = MaterialUtils.generateMaterialFromGtENUM(Materials.Clay);
+
+ // Wrought Iron
+ public static final Material WROUGHT_IRON = MaterialUtils.generateMaterialFromGtENUM(Materials.WroughtIron);
+
+ // PTFE
+ public static final Material PTFE = MaterialUtils
+ .generateMaterialFromGtENUM(MaterialUtils.getMaterial("Polytetrafluoroethylene", "Plastic"));
+
+ // Plastic
+ public static final Material PLASTIC = MaterialUtils
+ .generateMaterialFromGtENUM(MaterialUtils.getMaterial("Plastic", "Rubber"));
+
+ static {
+ MEAT.setTextureSet(TextureSet.SET_ROUGH);
+ CLAY.setTextureSet(TextureSet.SET_ROUGH);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/material/ORES.java b/gtpp/src/main/java/gtPlusPlus/core/material/ORES.java
new file mode 100644
index 0000000000..5079639e38
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/material/ORES.java
@@ -0,0 +1,701 @@
+package gtPlusPlus.core.material;
+
+import gregtech.api.enums.TextureSet;
+import gtPlusPlus.core.client.CustomTextureSet.TextureSets;
+import gtPlusPlus.core.material.state.MaterialState;
+
+public final class ORES {
+
+ public static final Material AGARDITE_CD = new Material(
+ "Agardite (Cd)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 170, 188, 33, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (CdCa)Cu7(AsO2)4(O2H)5·3H2O
+ new MaterialStack(ELEMENT.getInstance().CADMIUM, 1), new MaterialStack(ELEMENT.getInstance().CALCIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 7), new MaterialStack(ELEMENT.getInstance().ARSENIC, 4),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 21),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 11) });
+
+ public static final Material AGARDITE_LA = new Material(
+ "Agardite (La)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 206, 232, 9, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (LaCa)Cu5(AsO6)2(OH)4·3H2O
+ new MaterialStack(ELEMENT.getInstance().LANTHANUM, 1), new MaterialStack(ELEMENT.getInstance().CALCIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 5), new MaterialStack(ELEMENT.getInstance().ARSENIC, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 19),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 10) });
+
+ public static final Material AGARDITE_ND = new Material(
+ "Agardite (Nd)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 225, 244, 78, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (NdCa)Cu6(As3O3)2(O2H)6·3H2O
+ new MaterialStack(ELEMENT.getInstance().NEODYMIUM, 1), new MaterialStack(ELEMENT.getInstance().CALCIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 6), new MaterialStack(ELEMENT.getInstance().ARSENIC, 6),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 21),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 12) });
+
+ public static final Material AGARDITE_Y = new Material(
+ "Agardite (Y)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 210, 232, 44, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (YCa)Cu5(As2O4)3(OH)6·3H2O
+ new MaterialStack(ELEMENT.getInstance().YTTRIUM, 1), new MaterialStack(ELEMENT.getInstance().CALCIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().COPPER, 5), new MaterialStack(ELEMENT.getInstance().ARSENIC, 6),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 21),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 12) });
+
+ // Alburnite
+ // Ag8GeTe2S4
+ public static final Material ALBURNITE = new Material(
+ "Alburnite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 16, 5, 105, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().GOLD, 8), new MaterialStack(ELEMENT.getInstance().GERMANIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().TELLURIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 4) });
+
+ public static final Material CERITE = new Material(
+ "Cerite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 68, 13, 0, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (Ce,La,Ca)9(Mg,Fe+3)(SiO4)6(SiO3OH)(OH)3
+ new MaterialStack(ELEMENT.getInstance().CERIUM, 9), new MaterialStack(ELEMENT.getInstance().LANTHANUM, 9),
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 9), new MaterialStack(ELEMENT.getInstance().MAGNESIUM, 3),
+ new MaterialStack(ELEMENT.getInstance().IRON, 3), new MaterialStack(ELEMENT.getInstance().SILICON, 7),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 20),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 4) });
+
+ // Comancheite
+ // Hg55N24(NH2,OH)4(Cl,Br)34
+ public static final Material COMANCHEITE = new Material(
+ "Comancheite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 65, 205, 105, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().MERCURY, 54 / 4),
+ new MaterialStack(ELEMENT.getInstance().NITROGEN, 28 / 4),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 12 / 4),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 8 / 4),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 34 / 4),
+ new MaterialStack(ELEMENT.getInstance().BROMINE, 34 / 4) });
+
+ public static final Material CROCROITE = new Material(
+ "Crocoite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_GEM_VERTICAL, // Texture Set
+ new short[] { 255, 143, 84, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().LEAD, 2),
+ new MaterialStack(ELEMENT.getInstance().CHROMIUM, 2), new MaterialStack(ELEMENT.getInstance().OXYGEN, 3),
+ new MaterialStack(ELEMENT.getInstance().CAESIUM, 1), });
+
+ public static final Material CRYOLITE = new Material(
+ "Cryolite (F)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_SHINY, // Texture Set
+ new short[] { 205, 205, 255, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 3), new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 6) });
+
+ // Demicheleite-(Br)
+ // BiSBr
+ public static final Material DEMICHELEITE_BR = new Material(
+ "Demicheleite (Br)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_SHINY, // Texture Set
+ new short[] { 165, 75, 75, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().BISMUTH, 13), new MaterialStack(ELEMENT.getInstance().SULFUR, 11),
+ new MaterialStack(ELEMENT.getInstance().BROMINE, 1) });
+
+ public static final Material FLORENCITE = new Material(
+ "Florencite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 249, 249, 124, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // SmAl3(PO4)2(OH)6
+ new MaterialStack(ELEMENT.getInstance().SAMARIUM, 1), new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 3),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 1), new MaterialStack(ELEMENT.getInstance().OXYGEN, 10),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 6) });
+
+ public static final Material FLUORCAPHITE = new Material(
+ "Fluorcaphite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 255, 255, 30, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (Ca,Sr,Ce,Na)5(PO4)3F
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 5), new MaterialStack(MISC_MATERIALS.STRONTIUM_OXIDE, 5),
+ new MaterialStack(ELEMENT.getInstance().CERIUM, 5), new MaterialStack(ELEMENT.getInstance().SODIUM, 5),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 3), new MaterialStack(ELEMENT.getInstance().OXYGEN, 12),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 6), });
+
+ // Gadolinite_Ce
+ public static final Material GADOLINITE_CE = new Material(
+ "Gadolinite (Ce)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 15, 159, 59, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CERIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().ERBIUM, 2), new MaterialStack(ELEMENT.getInstance().LANTHANUM, 2),
+ new MaterialStack(ELEMENT.getInstance().NEODYMIUM, 2), new MaterialStack(ELEMENT.getInstance().YTTRIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().GADOLINIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().BERYLLIUM, 2), new MaterialStack(ELEMENT.getInstance().SILICON, 7),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 14), });
+
+ // Gadolinite_Y
+ public static final Material GADOLINITE_Y = new Material(
+ "Gadolinite (Y)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 35, 189, 99, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CERIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().ERBIUM, 2), new MaterialStack(ELEMENT.getInstance().LANTHANUM, 2),
+ new MaterialStack(ELEMENT.getInstance().NEODYMIUM, 2), new MaterialStack(ELEMENT.getInstance().YTTRIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().GADOLINIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().BERYLLIUM, 3), new MaterialStack(ELEMENT.getInstance().SILICON, 4),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 9), });
+
+ public static final Material GEIKIELITE = new Material(
+ "Geikielite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.GEM_A.get(), // Texture Set
+ new short[] { 187, 193, 204, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().MAGNESIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 1), new MaterialStack(ELEMENT.getInstance().OXYGEN, 3) });
+
+ public static final Material GREENOCKITE = new Material(
+ "Greenockite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.GEM_A.get(), // Texture Set
+ new short[] { 110, 193, 25, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CADMIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 1), });
+
+ public static final Material HIBONITE = new Material(
+ "Hibonite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 58, 31, 0, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // ((Ca,Ce)(Al,Ti,Mg)12O19)
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 1), new MaterialStack(ELEMENT.getInstance().CERIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 12),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 12),
+ new MaterialStack(ELEMENT.getInstance().MAGNESIUM, 12),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 19), });
+
+ // Honeaite
+ // Au3TlTe2
+ public static final Material HONEAITE = new Material(
+ "Honeaite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 165, 165, 5, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().GOLD, 3), new MaterialStack(ELEMENT.getInstance().THALLIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().TELLURIUM, 2) });
+
+ // Irarsite
+ // (Ir,Ru,Rh,Pt)AsS
+ public static final Material IRARSITE = new Material(
+ "Irarsite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.ENRICHED.get(), // Texture Set
+ new short[] { 125, 105, 105, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().IRIDIUM, 1), new MaterialStack(ELEMENT.getInstance().RUTHENIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().RHODIUM, 1), new MaterialStack(ELEMENT.getInstance().PLATINUM, 1),
+ new MaterialStack(ELEMENT.getInstance().ARSENIC, 1), new MaterialStack(ELEMENT.getInstance().SULFUR, 1),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1) });
+
+ // Kashinite
+ // (Ir,Rh)2S3
+ public static final Material KASHINITE = new Material(
+ "Kashinite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_SHINY, // Texture Set
+ new short[] { 75, 105, 75, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().IRIDIUM, 2), new MaterialStack(ELEMENT.getInstance().RHODIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 3) });
+
+ // Tl(Cl,Br)
+ public static final Material LAFOSSAITE = new Material(
+ "Lafossaite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 165, 105, 205, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 1), new MaterialStack(ELEMENT.getInstance().BROMINE, 1),
+ new MaterialStack(ELEMENT.getInstance().THALLIUM, 1) });
+
+ public static final Material LANTHANITE_CE = new Material(
+ "Lanthanite (Ce)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 186, 113, 179, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (Ce)2(CO3)3·8(H2O)
+ new MaterialStack(ELEMENT.getInstance().CERIUM, 2), new MaterialStack(ELEMENT.getInstance().OXYGEN, 3),
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 3), new MaterialStack(ELEMENT.getInstance().HYDROGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1), });
+
+ public static final Material LANTHANITE_LA = new Material(
+ "Lanthanite (La)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 219, 160, 214, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (La)2(CO3)3·8(H2O)
+ new MaterialStack(ELEMENT.getInstance().LANTHANUM, 2), new MaterialStack(ELEMENT.getInstance().OXYGEN, 3),
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 3), new MaterialStack(ELEMENT.getInstance().HYDROGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1), });
+
+ public static final Material LANTHANITE_ND = new Material(
+ "Lanthanite (Nd)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 153, 76, 145, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (Nd)2(CO3)3·8(H2O)
+ new MaterialStack(ELEMENT.getInstance().NEODYMIUM, 2), new MaterialStack(ELEMENT.getInstance().OXYGEN, 3),
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 3), new MaterialStack(ELEMENT.getInstance().HYDROGEN, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 1), });
+
+ // Iodine Source
+ public static final Material LAUTARITE = new Material(
+ "Lautarite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 165, 105, 205, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 1), new MaterialStack(ELEMENT.getInstance().IODINE, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 6) });
+
+ public static final Material LEPERSONNITE = new Material(
+ "Lepersonnite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_EMERALD, // Texture Set
+ new short[] { 175, 175, 20, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CALCIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().YTTERBIUM, 3),
+ new MaterialStack(ELEMENT.getInstance().GADOLINIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().DYSPROSIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().URANIUM235, 2), new MaterialStack(ELEMENT.getInstance().OXYGEN, 29),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 24) });
+
+ // Miessiite
+ // Pd11Te2Se2
+ public static final Material MIESSIITE = new Material(
+ "Miessiite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 75, 75, 75, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().PALLADIUM, 11),
+ new MaterialStack(ELEMENT.getInstance().TELLURIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().SELENIUM, 2) });
+
+ public static final Material NICHROMITE = new Material(
+ "Nichromite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 22, 19, 19, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NICKEL, 1),
+ new MaterialStack(ELEMENT.getInstance().COBALT, 1), new MaterialStack(ELEMENT.getInstance().IRON, 3),
+ new MaterialStack(ELEMENT.getInstance().ALUMINIUM, 2), new MaterialStack(ELEMENT.getInstance().CHROMIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 8) });
+
+ // Perroudite
+ // Hg5Ag4S5(I,Br)2Cl2
+ public static final Material PERROUDITE = new Material(
+ "Perroudite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 77, 165, 174, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().SULFUR, 5),
+ new MaterialStack(ELEMENT.getInstance().SILVER, 4), new MaterialStack(ELEMENT.getInstance().IODINE, 2),
+ new MaterialStack(ELEMENT.getInstance().MERCURY, 5), new MaterialStack(ELEMENT.getInstance().BROMINE, 2),
+ new MaterialStack(ELEMENT.getInstance().CHLORINE, 2) });
+
+ public static final Material POLYCRASE = new Material(
+ "Polycrase", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_ROUGH, // Texture Set
+ new short[] { 51, 0, 11, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTRIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 1), new MaterialStack(ELEMENT.getInstance().CERIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().URANIUM235, 1), new MaterialStack(ELEMENT.getInstance().THORIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 2), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().TANTALUM, 2), new MaterialStack(ELEMENT.getInstance().OXYGEN, 6) });
+
+ // Radiobarite
+ // Radium, Barium, Barite?
+ public static final Material RADIOBARITE = new Material(
+ "Barite (Rd)", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FLINT, // Texture Set
+ new short[] { 205, 205, 205, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 0, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().BARIUM, 32), new MaterialStack(ELEMENT.getInstance().RADIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().SULFUR, 16), new MaterialStack(ELEMENT.getInstance().OXYGEN, 15) });
+
+ // Samarskite_Y
+ public static final Material SAMARSKITE_Y = new Material(
+ "Samarskite (Y)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.ENRICHED.get(), // Texture Set
+ new short[] { 65, 163, 164, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTRIUM, 2), // Y not YT/YB
+ new MaterialStack(ELEMENT.getInstance().IRON, 10), new MaterialStack(ELEMENT.getInstance().URANIUM235, 2),
+ new MaterialStack(ELEMENT.getInstance().THORIUM, 3), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().TANTALUM, 3) });
+
+ // Samarskite_YB
+ public static final Material SAMARSKITE_YB = new Material(
+ "Samarskite (Yb)", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.ENRICHED.get(), // Texture Set
+ new short[] { 95, 193, 194, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTERBIUM, 2), // Y not YT/YB
+ new MaterialStack(ELEMENT.getInstance().IRON, 9), new MaterialStack(ELEMENT.getInstance().URANIUM235, 3),
+ new MaterialStack(ELEMENT.getInstance().THORIUM, 2), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 3),
+ new MaterialStack(ELEMENT.getInstance().TANTALUM, 2) });
+
+ public static final Material TITANITE = new Material(
+ "Titanite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 184, 198, 105, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CALCIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 2), new MaterialStack(ELEMENT.getInstance().SILICON, 2),
+ new MaterialStack(ELEMENT.getInstance().THORIUM, 1), new MaterialStack(ELEMENT.getInstance().OXYGEN, 10) });
+
+ public static final Material XENOTIME = new Material(
+ "Xenotime", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_OPAL, // Texture Set
+ new short[] { 235, 89, 199, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTRIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().YTTERBIUM, 2), new MaterialStack(ELEMENT.getInstance().ERBIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().EUROPIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 8) });
+
+ public static final Material YTTRIAITE = new Material( // TODO
+ "Yttriaite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_METALLIC, // Texture Set
+ new short[] { 255, 143, 84, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTRIUM, 1), // Y not YT/YB
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 3), new MaterialStack(ELEMENT.getInstance().IRON, 4),
+ new MaterialStack(ELEMENT.getInstance().TIN, 1), new MaterialStack(ELEMENT.getInstance().NITROGEN, 2) });
+
+ public static final Material YTTRIALITE = new Material(
+ "Yttrialite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_RUBY, // Texture Set
+ new short[] { 35, 189, 99, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().YTTRIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().THORIUM, 2), new MaterialStack(ELEMENT.getInstance().SILICON, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 7), });
+
+ public static final Material YTTROCERITE = new Material(
+ "Yttrocerite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_DIAMOND, // Texture Set
+ new short[] { 35, 19, 199, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CERIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 1), new MaterialStack(ELEMENT.getInstance().FLUORINE, 5),
+ new MaterialStack(ELEMENT.getInstance().YTTRIUM, 1), });
+
+ public static final Material ZIMBABWEITE = new Material(
+ "Zimbabweite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 193, 187, 131, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CALCIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().POTASSIUM, 2), new MaterialStack(ELEMENT.getInstance().LEAD, 1),
+ new MaterialStack(ELEMENT.getInstance().ARSENIC, 4), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().TANTALUM, 4), new MaterialStack(ELEMENT.getInstance().TITANIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 18) });
+
+ public static final Material ZIRCON = new Material(
+ "Zircon", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.GEM_A.get(), // Texture Set
+ new short[] { 195, 19, 19, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().SILICON, 1), new MaterialStack(ELEMENT.getInstance().OXYGEN, 4), });
+
+ public static final Material ZIRCONILITE = new Material(
+ "Zirconolite", // Material Name
+ MaterialState.ORE, // State
+ TextureSet.SET_FINE, // Texture Set
+ new short[] { 45, 26, 0, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CALCIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 2), new MaterialStack(ELEMENT.getInstance().TITANIUM, 4),
+ new MaterialStack(ELEMENT.getInstance().CERIUM, 1), new MaterialStack(ELEMENT.getInstance().OXYGEN, 14) });
+
+ public static final Material ZIRCOPHYLLITE = new Material(
+ "Zircophyllite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.REFINED.get(), // Texture Set
+ new short[] { 30, 0, 6, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().POTASSIUM, 3),
+ new MaterialStack(ELEMENT.getInstance().SODIUM, 3), new MaterialStack(ELEMENT.getInstance().MANGANESE, 7),
+ new MaterialStack(ELEMENT.getInstance().IRON, 7), new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 2), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().SILICON, 8), new MaterialStack(ELEMENT.getInstance().OXYGEN, 13),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 7), });
+
+ public static final Material ZIRKELITE = new Material(
+ "Zirkelite", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.GEM_A.get(), // Texture Set
+ new short[] { 229, 208, 48, 0 }, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ -1, // Radiation
+ new MaterialStack[] { // (Ca,Th,Ce)Zr(Ti,Nb)2O7
+ new MaterialStack(ELEMENT.getInstance().CALCIUM, 1), new MaterialStack(ELEMENT.getInstance().THORIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().CERIUM, 1), new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 2), new MaterialStack(ELEMENT.getInstance().NIOBIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().OXYGEN, 7) });
+
+ public static final Material DEEP_EARTH_REACTOR_FUEL_DEPOSIT = new Material(
+ "Radioactive Mineral Mix", // Material Name
+ MaterialState.ORE, // State
+ TextureSets.NUCLEAR.get(), // Texture Set
+ null, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ 4, // Radiation
+ new MaterialStack[] { // Na3AlF6
+ new MaterialStack(ELEMENT.getInstance().RADON, 2), new MaterialStack(ELEMENT.getInstance().RADIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().URANIUM235, 1),
+ new MaterialStack(ELEMENT.getInstance().URANIUM238, 10),
+ new MaterialStack(ELEMENT.getInstance().THORIUM, 25),
+ new MaterialStack(ELEMENT.getInstance().THORIUM232, 4), new MaterialStack(FLUORCAPHITE, 6),
+ new MaterialStack(SAMARSKITE_Y, 8), new MaterialStack(TITANITE, 4) });
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/material/Particle.java b/gtpp/src/main/java/gtPlusPlus/core/material/Particle.java
new file mode 100644
index 0000000000..b5cd30184e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/material/Particle.java
@@ -0,0 +1,154 @@
+package gtPlusPlus.core.material;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.chemistry.IonParticles;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class Particle {
+
+ public static final Particle GRAVITON;
+
+ public static final Particle UP;
+ public static final Particle DOWN;
+ public static final Particle CHARM;
+ public static final Particle STRANGE;
+ public static final Particle TOP;
+ public static final Particle BOTTOM;
+
+ public static final Particle ELECTRON;
+ public static final Particle ELECTRON_NEUTRINO;
+ public static final Particle MUON;
+ public static final Particle MUON_NEUTRINO;
+ public static final Particle TAU;
+ public static final Particle TAU_NEUTRINO;
+
+ public static final Particle GLUON;
+ public static final Particle PHOTON;
+ public static final Particle Z_BOSON;
+ public static final Particle W_BOSON;
+ public static final Particle HIGGS_BOSON;
+
+ public static final Particle PROTON;
+ public static final Particle NEUTRON;
+ public static final Particle LAMBDA;
+ public static final Particle OMEGA;
+
+ public static final Particle PION;
+ public static final Particle ETA_MESON;
+
+ public static final Particle UNKNOWN;
+
+ public static final AutoMap<Particle> aMap = new AutoMap<>();
+
+ static {
+
+ /*
+ * Standard Model of Physics
+ */
+
+ // I exist, because I must.
+ GRAVITON = new Particle(ElementaryGroup.BOSON, "Graviton");
+
+ // Quarks
+ UP = new Particle(ElementaryGroup.QUARK, "Up");
+ DOWN = new Particle(ElementaryGroup.QUARK, "Down");
+ CHARM = new Particle(ElementaryGroup.QUARK, "Charm");
+ STRANGE = new Particle(ElementaryGroup.QUARK, "Strange");
+ TOP = new Particle(ElementaryGroup.QUARK, "Top");
+ BOTTOM = new Particle(ElementaryGroup.QUARK, "Bottom");
+
+ // Leptons
+ ELECTRON = new Particle(ElementaryGroup.LEPTON, "Electron");
+ MUON = new Particle(ElementaryGroup.LEPTON, "Muon");
+ TAU = new Particle(ElementaryGroup.LEPTON, "Tau");
+ ELECTRON_NEUTRINO = new Particle(ElementaryGroup.LEPTON, "Electron Neutrino");
+ MUON_NEUTRINO = new Particle(ElementaryGroup.LEPTON, "Muon Neutrino");
+ TAU_NEUTRINO = new Particle(ElementaryGroup.LEPTON, "Tau Neutrino");
+
+ // Bosons
+ GLUON = new Particle(ElementaryGroup.BOSON, "Gluon");
+ PHOTON = new Particle(ElementaryGroup.BOSON, "Photon");
+ Z_BOSON = new Particle(ElementaryGroup.BOSON, "Z Boson");
+ W_BOSON = new Particle(ElementaryGroup.BOSON, "W Boson");
+ HIGGS_BOSON = new Particle(ElementaryGroup.BOSON, "Higgs Boson");
+
+ /*
+ * Composite Particles
+ */
+
+ // Baryons
+ PROTON = new Particle(ElementaryGroup.BARYON, "Proton", new Particle[] { UP, UP, DOWN });
+ NEUTRON = new Particle(ElementaryGroup.BARYON, "Neutron", new Particle[] { UP, DOWN, DOWN });
+ LAMBDA = new Particle(ElementaryGroup.BARYON, "Lambda", new Particle[] { UP, DOWN, STRANGE });
+ OMEGA = new Particle(ElementaryGroup.BARYON, "Omega", new Particle[] { STRANGE, STRANGE, STRANGE });
+
+ // Mesons
+ PION = new Particle(ElementaryGroup.MESON, "Pion", new Particle[] { MUON, MUON_NEUTRINO });
+ ETA_MESON = new Particle(ElementaryGroup.MESON, "ETA Meson", new Particle[] { PION, PION, PION });
+
+ // Wildcard
+ UNKNOWN = new Particle(ElementaryGroup.UNKNOWN, "Unknown");
+ }
+
+ public static enum ElementaryGroup {
+ QUARK,
+ LEPTON,
+ BOSON,
+ BARYON,
+ MESON,
+ UNKNOWN;
+ }
+
+ public final ElementaryGroup mParticleType;
+ public final String mParticleName;
+ public final Particle[] mComposition;
+
+ public Particle(ElementaryGroup aParticleType, String aParticleName) {
+ this(aParticleType, aParticleName, null);
+ }
+
+ public Particle(ElementaryGroup aParticleType, String aParticleName, Particle[] aComposition) {
+ mParticleType = aParticleType;
+ mParticleName = aParticleName;
+ mComposition = aComposition == null ? new Particle[] { this } : aComposition;
+ aMap.put(this);
+ }
+
+ public static ItemStack getIon(String aElementName, int aCharge) {
+ for (String g : gtPlusPlus.core.item.chemistry.IonParticles.NameToMetaMap.keySet()) {
+ if (g.toLowerCase()
+ .equals(Utils.sanitizeString(aElementName.toLowerCase()))) {
+ Integer meta = gtPlusPlus.core.item.chemistry.IonParticles.NameToMetaMap
+ .get(Utils.sanitizeString(aElementName.toLowerCase()));
+ if (meta == null) {
+ meta = 0;
+ }
+ ItemStack aIon = ItemUtils.simpleMetaStack(ModItems.itemIonParticleBase, meta, 1);
+ if (aCharge != 0) {
+ IonParticles.setChargeState(aIon, aCharge);
+ }
+ return aIon;
+ }
+ }
+ return null;
+ }
+
+ public static ItemStack getBaseParticle(Particle aParticle) {
+ String aPartName = Utils.sanitizeString(aParticle.mParticleName.toLowerCase());
+ for (String g : gtPlusPlus.core.item.chemistry.StandardBaseParticles.NameToMetaMap.keySet()) {
+ if (g.toLowerCase()
+ .equals(aPartName)) {
+ Integer meta = gtPlusPlus.core.item.chemistry.StandardBaseParticles.NameToMetaMap.get(aPartName);
+ if (meta == null) {
+ meta = 0;
+ }
+ return ItemUtils.simpleMetaStack(ModItems.itemStandarParticleBase, meta, 1);
+ }
+ }
+ return null;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/material/nuclear/FLUORIDES.java b/gtpp/src/main/java/gtPlusPlus/core/material/nuclear/FLUORIDES.java
new file mode 100644
index 0000000000..5a50a604da
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/material/nuclear/FLUORIDES.java
@@ -0,0 +1,244 @@
+package gtPlusPlus.core.material.nuclear;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.state.MaterialState;
+
+public class FLUORIDES {
+
+ public static final Material FLUORITE = new Material(
+ "Fluorite (F)", // Material Name
+ MaterialState.ORE, // State
+ null, // Material Colour
+ Materials.Fluorine.mMeltingPoint, // Melting Point in C
+ Materials.Fluorine.mBlastFurnaceTemp, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ false, // Generate cells
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().CALCIUM, 16),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 32), new MaterialStack(ELEMENT.getInstance().IRON, 4),
+ new MaterialStack(ELEMENT.getInstance().CARBON, 2) });
+
+ // ThF4
+ public static final Material THORIUM_TETRAFLUORIDE = new Material(
+ "Thorium Tetrafluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().THORIUM232, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 4) });
+
+ // ThF6
+ public static final Material THORIUM_HEXAFLUORIDE = new Material(
+ "Thorium Hexafluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().THORIUM232, 1),
+ new MaterialStack(ELEMENT.getInstance().THORIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 12) });
+
+ // UF4
+ public static final Material URANIUM_TETRAFLUORIDE = new Material(
+ "Uranium Tetrafluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().URANIUM233, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 4) });
+
+ // UF6
+ public static final Material URANIUM_HEXAFLUORIDE = new Material(
+ "Uranium Hexafluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 2) });
+
+ // ZrF4
+
+ public static final Material ZIRCONIUM_TETRAFLUORIDE = new Material(
+ "Zirconium Tetrafluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Texture Set (Autogenerated)
+ 0,
+ null, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ false,
+ "ZrF\u2084",
+ -1,
+ true,
+ false,
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 4) });
+
+ /*
+ * public static final Material ZIRCONIUM_TETRAFLUORIDE = new Material( "Zirconium Tetrafluoride", //Material Name
+ * MaterialState.LIQUID, //State null, //Material Colour -1, //Melting Point in C -1, //Boiling Point in C -1,
+ * //Protons -1, //Neutrons false, //Uses Blast furnace? //Material Stacks with Percentage of required elements. new
+ * MaterialStack[]{ new MaterialStack(ELEMENT.getInstance().ZIRCONIUM, 1), new
+ * MaterialStack(ELEMENT.getInstance().FLUORINE, 4) });
+ */
+
+ // BeF2
+ public static final Material BERYLLIUM_FLUORIDE = new Material(
+ "Beryllium Fluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Material Colour
+ -1,
+ -1,
+ -1,
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().BERYLLIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 2) });
+
+ // LiF
+ public static final Material LITHIUM_FLUORIDE = new Material(
+ "Lithium Fluoride", // Material Name
+ MaterialState.LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().LITHIUM7, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 1) });
+
+ // LFTR sub components
+
+ // (NH4)HF2
+ public static final Material AMMONIUM_BIFLUORIDE = new Material(
+ "Ammonium Bifluoride", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ 126, // Melting Point in C
+ 240, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(MISC_MATERIALS.AMMONIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().HYDROGEN, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 2) });
+
+ // Be(OH)2
+ public static final Material BERYLLIUM_HYDROXIDE = new Material(
+ "Beryllium Hydroxide", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().BERYLLIUM, 1),
+ new MaterialStack(MISC_MATERIALS.HYDROXIDE, 2) });
+
+ // (NH4)2BeF4
+ public static final Material AMMONIUM_TETRAFLUOROBERYLLATE = new Material(
+ "Ammonium Tetrafluoroberyllate", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ 280, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(MISC_MATERIALS.AMMONIUM, 2),
+ new MaterialStack(ELEMENT.getInstance().BERYLLIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 4) });
+
+ // LFTR Output
+ public static final Material NEPTUNIUM_HEXAFLUORIDE = new Material(
+ "Neptunium Hexafluoride", // Material Name
+ MaterialState.GAS, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NEPTUNIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 6) });
+
+ public static final Material TECHNETIUM_HEXAFLUORIDE = new Material(
+ "Technetium Hexafluoride", // Material Name
+ MaterialState.GAS, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().TECHNETIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 6) });
+
+ public static final Material SELENIUM_HEXAFLUORIDE = new Material(
+ "Selenium Hexafluoride", // Material Name
+ MaterialState.GAS, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().SELENIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 6) });
+
+ public static final Material SODIUM_FLUORIDE = new Material(
+ "Sodium Fluoride", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().SODIUM, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 1) });
+
+ private static final FLUORIDES INSTANCE = new FLUORIDES();
+
+ public static FLUORIDES getInstance() {
+ return INSTANCE;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/material/nuclear/NUCLIDE.java b/gtpp/src/main/java/gtPlusPlus/core/material/nuclear/NUCLIDE.java
new file mode 100644
index 0000000000..ebd24bad07
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/material/nuclear/NUCLIDE.java
@@ -0,0 +1,311 @@
+package gtPlusPlus.core.material.nuclear;
+
+import gtPlusPlus.core.client.CustomTextureSet.TextureSets;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.data.StringUtils;
+
+public final class NUCLIDE {
+
+ public static final Material Li2BeF4 = new Material(
+ "Lithium Tetrafluoroberyllate (LFTB)", // Material Name
+ MaterialState.LIQUID, // State
+ TextureSets.NUCLEAR.get(),
+ null, // Material Colour
+ 566, // Melting Point in C
+ 870, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "Li2BeF4"), // Chemical Formula
+ 4, // Radioactivity Level
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 2),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1) });
+
+ public static final Material LiFBeF2ThF4UF4 = new Material(
+ "LFTR Fuel 3", // Material Name
+ MaterialState.LIQUID, // State
+ TextureSets.NUCLEAR.get(),
+ null, // Material Colour
+ 566, // Melting Point in C
+ 870, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2ThF4UF4"), // Chemical Formula
+ 5, // Radioactivity Level
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 65),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 28), new MaterialStack(FLUORIDES.THORIUM_TETRAFLUORIDE, 1),
+ new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1) });
+
+ public static final Material LiFBeF2ZrF4UF4 = new Material(
+ "LFTR Fuel 2", // Material Name
+ MaterialState.LIQUID, // State
+ TextureSets.NUCLEAR.get(),
+ null, // Material Colour
+ 650, // Melting Point in C
+ 940, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2ZrF4UF4"), // Chemical Formula
+ 5, // Radioactivity Level
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 65),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 28),
+ new MaterialStack(FLUORIDES.ZIRCONIUM_TETRAFLUORIDE, 5),
+ new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 2) });
+
+ public static final Material LiFBeF2ZrF4U235 = new Material(
+ "LFTR Fuel 1", // Material Name
+ MaterialState.LIQUID, // State
+ TextureSets.NUCLEAR.get(),
+ null, // Material Colour
+ 590, // Melting Point in C
+ 890, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2ZrF4") + StringUtils.superscript("235U"), // Chemical
+ // Formula
+ 5, // Radioactivity Level
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 55),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 25),
+ new MaterialStack(FLUORIDES.ZIRCONIUM_TETRAFLUORIDE, 6),
+ new MaterialStack(ELEMENT.getInstance().URANIUM235, 14) });
+
+ // Misc
+ public static final Material BurntLftrFuel_MK1 = new Material(
+ "Burnt Reactor Fuel I", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiBeF2UF4FP"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().LITHIUM, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1), new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().PROTACTINIUM, 1) });
+
+ public static final Material BurntLftrFuel_MK2 = new Material(
+ "Burnt Reactor Fuel II", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiBeF2UF4FP"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().LITHIUM, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1), new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().PROTACTINIUM, 1) });
+
+ // LFTR Core Fluids
+ public static final Material LiFBeF2UF4FP = new Material(
+ "Uranium Depleted Molten Salt (U Salt)", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2UF4FP"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1), new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().PROTACTINIUM, 1) });
+
+ public static final Material Sparged_LiFBeF2UF4FP = new Material(
+ "Helium Sparged U Salt", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2UF4FP"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1), new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().PROTACTINIUM, 1) });
+
+ public static final Material UF6F2FP = new Material(
+ "Phosphorous Uranium Hexafluoride (P-UF6)", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript("UF6F2FP"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.URANIUM_HEXAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 3),
+ new MaterialStack(ELEMENT.getInstance().PHOSPHORUS, 1) });
+
+ public static final Material LiFBeF2 = new Material(
+ "Stable Molten Salt Base", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1) });
+
+ public static final Material LiFBeF2UF4 = new Material(
+ "LFTR Fuel Base", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2UF4"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(LiFBeF2, 1), new MaterialStack(FLUORIDES.URANIUM_TETRAFLUORIDE, 1) });
+
+ // LFTR Blanket Fluids
+
+ // Tier 1 Fuel blanket output
+ public static final Material LiFThF4 = new Material(
+ "Thorium Depleted Molten Salt (T Salt)", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFThF4"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.THORIUM_TETRAFLUORIDE, 1) });
+
+ // Tier 2 Fuel blanket output
+ public static final Material LiFBeF2ThF4 = new Material(
+ "Thorium-Beryllium Depleted Molten Salt (TB Salt)", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2ThF4"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.THORIUM_TETRAFLUORIDE, 1) });
+
+ // Tier 1 Fuel blanket output
+ public static final Material Sparged_LiFThF4 = new Material(
+ "Fluorine Sparged T Salt", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFThF4"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.THORIUM_TETRAFLUORIDE, 1) });
+
+ // Tier 2 Fuel blanket output
+ public static final Material Sparged_LiFBeF2ThF4 = new Material(
+ "Fluorine Sparged TB Salt", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript(StringUtils.superscript("7") + "LiFBeF2ThF4"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.LITHIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.BERYLLIUM_FLUORIDE, 1),
+ new MaterialStack(FLUORIDES.THORIUM_TETRAFLUORIDE, 1) });
+
+ public static final Material UF6F2 = new Material(
+ "Fluorinated Uranium Hexafluoride (F-UF6)", // Material Name
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1, // Neutrons
+ false, // Uses Blast furnace?
+ StringUtils.subscript("UF6F2"), // Chemical Formula
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(FLUORIDES.URANIUM_HEXAFLUORIDE, 1),
+ new MaterialStack(ELEMENT.getInstance().FLUORINE, 2) });
+
+ // Secondary material is molten metal
+ public static final Material NAQ_FUEL_T1 = new Material(
+ "Naquadah Fuel",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NAQUADAH, 2),
+ new MaterialStack(ELEMENT.getInstance().TANTALUM, 3) });
+
+ // Secondary material is a plasma
+ public static final Material NAQ_FUEL_T2 = new Material(
+ "Enriched Naquadah Fuel",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NAQUADAH_ENRICHED, 2),
+ new MaterialStack(ELEMENT.getInstance().TITANIUM, 3) });
+
+ // Secondary material is a plasma
+ public static final Material NAQ_FUEL_T3 = new Material(
+ "Naquadria Fuel",
+ MaterialState.PURE_LIQUID, // State
+ null, // Material Colour
+ -1, // Melting Point in C
+ -1, // Boiling Point in C
+ -1, // Protons
+ -1,
+ false, // Uses Blast furnace?
+ // Material Stacks with Percentage of required elements.
+ new MaterialStack[] { new MaterialStack(ELEMENT.getInstance().NAQUADRIA, 2),
+ new MaterialStack(ELEMENT.getInstance().AMERICIUM, 3) });
+
+ private static final NUCLIDE INSTANCE = new NUCLIDE();
+
+ public static NUCLIDE getInstance() {
+ return INSTANCE;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/material/state/MaterialState.java b/gtpp/src/main/java/gtPlusPlus/core/material/state/MaterialState.java
new file mode 100644
index 0000000000..9fb5cde101
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/material/state/MaterialState.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.core.material.state;
+
+public enum MaterialState {
+
+ SOLID(0),
+ LIQUID(1),
+ GAS(2),
+ PLASMA(3),
+ PURE_LIQUID(4),
+ ORE(5),
+ PURE_GAS(6);
+
+ private final int STATE;
+
+ private MaterialState(final int State) {
+ this.STATE = State;
+ }
+
+ public int ID() {
+ return this.STATE;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/network/handler/AbstractClientMessageHandler.java b/gtpp/src/main/java/gtPlusPlus/core/network/handler/AbstractClientMessageHandler.java
new file mode 100644
index 0000000000..383f22dc23
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/network/handler/AbstractClientMessageHandler.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.core.network.handler;
+
+import net.minecraft.entity.player.EntityPlayer;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+
+public abstract class AbstractClientMessageHandler<T extends IMessage> extends AbstractMessageHandler<T> {
+
+ @Override
+ public final IMessage handleServerMessage(EntityPlayer player, T message, MessageContext ctx) {
+ return null;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/network/handler/AbstractMessageHandler.java b/gtpp/src/main/java/gtPlusPlus/core/network/handler/AbstractMessageHandler.java
new file mode 100644
index 0000000000..a50bee6092
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/network/handler/AbstractMessageHandler.java
@@ -0,0 +1,38 @@
+package gtPlusPlus.core.network.handler;
+
+import net.minecraft.entity.player.EntityPlayer;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.GTplusplus;
+
+public abstract class AbstractMessageHandler<T extends IMessage> implements IMessageHandler<T, IMessage> {
+
+ /**
+ * Handle a message received on the client side
+ *
+ * @return a message to send back to the Server, or null if no reply is necessary
+ */
+ @SideOnly(Side.CLIENT)
+ public abstract IMessage handleClientMessage(EntityPlayer player, T message, MessageContext ctx);
+
+ /**
+ * Handle a message received on the server side
+ *
+ * @return a message to send back to the Client, or null if no reply is necessary
+ */
+ public abstract IMessage handleServerMessage(EntityPlayer player, T message, MessageContext ctx);
+
+ @Override
+ public IMessage onMessage(T message, MessageContext ctx) {
+ if (ctx.side.isClient()) {
+ return handleClientMessage(GTplusplus.proxy.getPlayerEntity(ctx), message, ctx);
+ } else {
+ // server side proxy will return the server side EntityPlayer
+ return handleServerMessage(GTplusplus.proxy.getPlayerEntity(ctx), message, ctx);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/network/handler/AbstractServerMessageHandler.java b/gtpp/src/main/java/gtPlusPlus/core/network/handler/AbstractServerMessageHandler.java
new file mode 100644
index 0000000000..a45bf8dd17
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/network/handler/AbstractServerMessageHandler.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.core.network.handler;
+
+import net.minecraft.entity.player.EntityPlayer;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+
+public abstract class AbstractServerMessageHandler<T extends IMessage> extends AbstractMessageHandler<T> {
+
+ @Override
+ public final IMessage handleClientMessage(EntityPlayer player, T message, MessageContext ctx) {
+ return null;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/network/packet/AbstractPacket.java b/gtpp/src/main/java/gtPlusPlus/core/network/packet/AbstractPacket.java
new file mode 100644
index 0000000000..ef43795206
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/network/packet/AbstractPacket.java
@@ -0,0 +1,8 @@
+package gtPlusPlus.core.network.packet;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+
+public interface AbstractPacket extends IMessage {
+
+ public abstract String getPacketName();
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui.java b/gtpp/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui.java
new file mode 100644
index 0000000000..9dfa1dbad5
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui.java
@@ -0,0 +1,127 @@
+package gtPlusPlus.core.network.packet;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import cpw.mods.fml.relauncher.Side;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.network.handler.AbstractServerMessageHandler;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+import io.netty.buffer.ByteBuf;
+
+public class Packet_VolumetricFlaskGui extends AbstractServerMessageHandler<Packet_VolumetricFlaskGui>
+ implements AbstractPacket {
+
+ private int x;
+ private int y;
+ private int z;
+ private int flaskValue;
+
+ public Packet_VolumetricFlaskGui() {}
+
+ public Packet_VolumetricFlaskGui(TileEntityVolumetricFlaskSetter tile, int aCustomValue) {
+ x = tile.xCoord;
+ y = tile.yCoord;
+ z = tile.zCoord;
+ flaskValue = aCustomValue;
+ Logger.INFO("Created Packet with values (" + x + ", " + y + ", " + z + " | " + flaskValue + ")");
+ }
+
+ @Override
+ public void toBytes(ByteBuf buf) {
+ buf.writeInt(x);
+ buf.writeInt(y);
+ buf.writeInt(z);
+ buf.writeInt(flaskValue);
+ Logger.INFO("Writing to byte buffer.");
+ }
+
+ @Override
+ public void fromBytes(ByteBuf buf) {
+ x = buf.readInt();
+ y = buf.readInt();
+ z = buf.readInt();
+ flaskValue = buf.readInt();
+ Logger.INFO("Reading from byte buffer.");
+ }
+
+ public int getX() {
+ return x;
+ }
+
+ public void setX(int x) {
+ this.x = x;
+ }
+
+ public int getY() {
+ return y;
+ }
+
+ public void setY(int y) {
+ this.y = y;
+ }
+
+ public int getZ() {
+ return z;
+ }
+
+ public void setZ(int z) {
+ this.z = z;
+ }
+
+ public int getCustomValue() {
+ return flaskValue;
+ }
+
+ public void setCustomValue(int aVal) {
+ this.flaskValue = aVal;
+ }
+
+ protected TileEntityVolumetricFlaskSetter getTileEntity(Packet_VolumetricFlaskGui message, MessageContext ctx) {
+ Logger.INFO("Trying to get tile.");
+ World worldObj = getWorld(ctx);
+ if (worldObj == null) {
+ Logger.INFO("Bad world object.");
+ return null;
+ }
+ TileEntity te = worldObj.getTileEntity(message.getX(), message.getY(), message.getZ());
+ if (te == null) {
+ Logger.INFO("Bad Tile.");
+ return null;
+ }
+ if (te instanceof TileEntityVolumetricFlaskSetter) {
+ Logger.INFO("Found Tile.");
+ return (TileEntityVolumetricFlaskSetter) te;
+ }
+ Logger.INFO("Error.");
+ return null;
+ }
+
+ protected World getWorld(MessageContext ctx) {
+ if (ctx.side == Side.SERVER) {
+ return ctx.getServerHandler().playerEntity.worldObj;
+ } else {
+ return GTplusplus.proxy.getClientWorld();
+ }
+ }
+
+ @Override
+ public IMessage handleServerMessage(EntityPlayer player, Packet_VolumetricFlaskGui message, MessageContext ctx) {
+ TileEntityVolumetricFlaskSetter te = getTileEntity(message, ctx);
+ if (te != null) {
+ Logger.INFO("Setting value on tile. " + message.getCustomValue());
+ te.setCustomValue(message.getCustomValue());
+ // return new Packet_VolumetricFlaskGui2(te, message.getCustomValue());
+ }
+ return null;
+ }
+
+ @Override
+ public String getPacketName() {
+ return "Packet_VoluemtricFlaskSetter_ToServer";
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui2.java b/gtpp/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui2.java
new file mode 100644
index 0000000000..599469191b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/network/packet/Packet_VolumetricFlaskGui2.java
@@ -0,0 +1,126 @@
+package gtPlusPlus.core.network.packet;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import cpw.mods.fml.relauncher.Side;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.network.handler.AbstractClientMessageHandler;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+import io.netty.buffer.ByteBuf;
+
+public class Packet_VolumetricFlaskGui2 extends AbstractClientMessageHandler<Packet_VolumetricFlaskGui2>
+ implements AbstractPacket {
+
+ private int x;
+ private int y;
+ private int z;
+ private int flaskValue;
+
+ public Packet_VolumetricFlaskGui2() {}
+
+ public Packet_VolumetricFlaskGui2(TileEntityVolumetricFlaskSetter tile, int aCustomValue) {
+ x = tile.xCoord;
+ y = tile.yCoord;
+ z = tile.zCoord;
+ flaskValue = aCustomValue;
+ Logger.INFO("Created Packet with values (" + x + ", " + y + ", " + z + " | " + flaskValue + ")");
+ }
+
+ @Override
+ public void toBytes(ByteBuf buf) {
+ buf.writeInt(x);
+ buf.writeInt(y);
+ buf.writeInt(z);
+ buf.writeInt(flaskValue);
+ Logger.INFO("Writing to byte buffer.");
+ }
+
+ @Override
+ public void fromBytes(ByteBuf buf) {
+ x = buf.readInt();
+ y = buf.readInt();
+ z = buf.readInt();
+ flaskValue = buf.readInt();
+ Logger.INFO("Reading from byte buffer.");
+ }
+
+ public int getX() {
+ return x;
+ }
+
+ public void setX(int x) {
+ this.x = x;
+ }
+
+ public int getY() {
+ return y;
+ }
+
+ public void setY(int y) {
+ this.y = y;
+ }
+
+ public int getZ() {
+ return z;
+ }
+
+ public void setZ(int z) {
+ this.z = z;
+ }
+
+ public int getCustomValue() {
+ return flaskValue;
+ }
+
+ public void setCustomValue(int aVal) {
+ this.flaskValue = aVal;
+ }
+
+ protected TileEntityVolumetricFlaskSetter getTileEntity(Packet_VolumetricFlaskGui2 message, MessageContext ctx) {
+ Logger.INFO("Trying to get tile.");
+ World worldObj = getWorld(ctx);
+ if (worldObj == null) {
+ Logger.INFO("Bad world object.");
+ return null;
+ }
+ TileEntity te = worldObj.getTileEntity(message.getX(), message.getY(), message.getZ());
+ if (te == null) {
+ Logger.INFO("Bad Tile.");
+ return null;
+ }
+ if (te instanceof TileEntityVolumetricFlaskSetter) {
+ Logger.INFO("Found Tile.");
+ return (TileEntityVolumetricFlaskSetter) te;
+ }
+ Logger.INFO("Error.");
+ return null;
+ }
+
+ protected World getWorld(MessageContext ctx) {
+ if (ctx.side == Side.SERVER) {
+ return ctx.getServerHandler().playerEntity.worldObj;
+ } else {
+ return GTplusplus.proxy.getClientWorld();
+ }
+ }
+
+ @Override
+ public String getPacketName() {
+ return "Packet_VoluemtricFlaskSetter_ToClient";
+ }
+
+ @Override
+ public IMessage handleClientMessage(EntityPlayer player, Packet_VolumetricFlaskGui2 message, MessageContext ctx) {
+ TileEntityVolumetricFlaskSetter te = getTileEntity(message, ctx);
+ if (te != null) {
+ Logger.INFO("Setting value on tile. " + message.getCustomValue());
+ te.setCustomValue(message.getCustomValue());
+ }
+ return null;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/potion/GtPotionEffect.java b/gtpp/src/main/java/gtPlusPlus/core/potion/GtPotionEffect.java
new file mode 100644
index 0000000000..65e7d20af0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/potion/GtPotionEffect.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.potion;
+
+import net.minecraft.potion.PotionEffect;
+
+public class GtPotionEffect extends PotionEffect {
+
+ public GtPotionEffect(int aPotionID, int aDurationInSecs, int aLevel) {
+ super(aPotionID, aDurationInSecs * 20, aLevel, false);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/proxy/ClientProxy.java b/gtpp/src/main/java/gtPlusPlus/core/proxy/ClientProxy.java
new file mode 100644
index 0000000000..5f6f93542e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/proxy/ClientProxy.java
@@ -0,0 +1,190 @@
+package gtPlusPlus.core.proxy;
+
+import java.util.ArrayList;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.entity.RenderFireball;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.client.MinecraftForgeClient;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.client.FMLClientHandler;
+import cpw.mods.fml.client.registry.ClientRegistry;
+import cpw.mods.fml.client.registry.RenderingRegistry;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+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.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.client.renderer.CustomItemBlockRenderer;
+import gtPlusPlus.core.client.renderer.CustomOreBlockRenderer;
+import gtPlusPlus.core.client.renderer.RenderDecayChest;
+import gtPlusPlus.core.client.renderer.RenderMiningExplosivesPrimed;
+import gtPlusPlus.core.client.renderer.RenderSickBlaze;
+import gtPlusPlus.core.client.renderer.RenderStaballoyConstruct;
+import gtPlusPlus.core.client.renderer.RenderToxinball;
+import gtPlusPlus.core.common.CommonProxy;
+import gtPlusPlus.core.entity.EntityPrimedMiningExplosive;
+import gtPlusPlus.core.entity.monster.EntitySickBlaze;
+import gtPlusPlus.core.entity.monster.EntityStaballoyConstruct;
+import gtPlusPlus.core.entity.projectile.EntityLightningAttack;
+import gtPlusPlus.core.entity.projectile.EntityToxinballSmall;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.lib.CORE.ConfigSwitches;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+import gtPlusPlus.nei.NEI_GTPP_Config;
+import gtPlusPlus.xmod.gregtech.common.render.GTPP_CapeRenderer;
+import gtPlusPlus.xmod.gregtech.common.render.GTPP_FlaskRenderer;
+import gtPlusPlus.xmod.gregtech.common.render.GTPP_Render_MachineBlock;
+import ic2.core.item.ItemFluidCell;
+
+public class ClientProxy extends CommonProxy implements Runnable {
+
+ private final GTPP_CapeRenderer mCapeRenderer;
+
+ @SideOnly(Side.CLIENT)
+ public static boolean mFancyGraphics = false;
+
+ public ClientProxy() {
+ mCapeRenderer = new GTPP_CapeRenderer();
+ // Get Graphics Mode.
+ mFancyGraphics = Minecraft.isFancyGraphicsEnabled();
+ }
+
+ @SubscribeEvent
+ public void receiveRenderSpecialsEvent(net.minecraftforge.client.event.RenderPlayerEvent.Specials.Pre aEvent) {
+ if (ConfigSwitches.enableCustomCapes) {
+ mCapeRenderer.receiveRenderSpecialsEvent(aEvent);
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ public static String playerName = "";
+
+ @Override
+ public void preInit(final FMLPreInitializationEvent e) {
+ super.preInit(e);
+ if (ConfigSwitches.enableCustomCapes) {
+ onPreLoad();
+ }
+ // Do this weird things for textures.
+ GTplusplus.loadTextures();
+ }
+
+ @Override
+ public void init(final FMLInitializationEvent e) {
+
+ /**
+ * Custom Block Renderers
+ */
+ new CustomOreBlockRenderer();
+ new CustomItemBlockRenderer();
+ new GTPP_Render_MachineBlock();
+
+ new GTPP_FlaskRenderer();
+
+ MinecraftForge.EVENT_BUS.register(new NEI_GTPP_Config());
+
+ super.init(e);
+ }
+
+ @Override
+ public void postInit(final FMLPostInitializationEvent e) {
+ super.postInit(e);
+ }
+
+ @Override
+ public void registerRenderThings() {
+
+ // Standard GT++
+
+ /**
+ * Entities
+ */
+ RenderingRegistry
+ .registerEntityRenderingHandler(EntityPrimedMiningExplosive.class, new RenderMiningExplosivesPrimed());
+ RenderingRegistry.registerEntityRenderingHandler(EntitySickBlaze.class, new RenderSickBlaze());
+ RenderingRegistry
+ .registerEntityRenderingHandler(EntityStaballoyConstruct.class, new RenderStaballoyConstruct());
+ RenderingRegistry.registerEntityRenderingHandler(EntityToxinballSmall.class, new RenderToxinball(1F));
+ RenderingRegistry.registerEntityRenderingHandler(EntityLightningAttack.class, new RenderFireball(1F));
+
+ /**
+ * Tiles
+ */
+ Logger.INFO("Registering Custom Renderer for the Lead Lined Chest.");
+ ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDecayablesChest.class, new RenderDecayChest());
+ Logger.INFO("Registering Custom Renderer for the Egg Box.");
+
+ /**
+ * Items
+ */
+ for (Pair<Item, IItemRenderer> sItemRenderMappings : mItemRenderMappings) {
+ MinecraftForgeClient.registerItemRenderer(sItemRenderMappings.getKey(), sItemRenderMappings.getValue());
+ }
+ }
+
+ @Override
+ public int addArmor(final String armor) {
+ return RenderingRegistry.addNewArmourRendererPrefix(armor);
+ }
+
+ @Override
+ public void serverStarting(final FMLServerStartingEvent e) {}
+
+ public void onPreLoad() {
+
+ }
+
+ @Override
+ public void run() {
+
+ }
+
+ @Override
+ public void onLoadComplete(FMLLoadCompleteEvent event) {
+ if (CORE.ConfigSwitches.hideUniversalCells) {
+ hideUniversalCells();
+ }
+ super.onLoadComplete(event);
+ }
+
+ public void hideUniversalCells() {
+ ArrayList<ItemStack> itemList = new ArrayList<>();
+ for (Fluid fluid : FluidRegistry.getRegisteredFluids()
+ .values()) {
+ if (fluid == null) {
+ continue;
+ }
+ itemList.add(ItemFluidCell.getUniversalFluidCell(new FluidStack(fluid, 2147483647)));
+ }
+ for (ItemStack aCell : itemList) {
+ codechicken.nei.api.API.hideItem(aCell);
+ }
+ }
+
+ @Override
+ public World getClientWorld() {
+ return FMLClientHandler.instance()
+ .getClient().theWorld;
+ }
+
+ @Override
+ public EntityPlayer getPlayerEntity(MessageContext ctx) {
+ return (ctx.side.isClient() ? Minecraft.getMinecraft().thePlayer : super.getPlayerEntity(ctx));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/proxy/ServerProxy.java b/gtpp/src/main/java/gtPlusPlus/core/proxy/ServerProxy.java
new file mode 100644
index 0000000000..73b027af10
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/proxy/ServerProxy.java
@@ -0,0 +1,28 @@
+package gtPlusPlus.core.proxy;
+
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import gtPlusPlus.core.common.CommonProxy;
+
+@SuppressWarnings("unused")
+public class ServerProxy extends CommonProxy {
+
+ @Override
+ public void preInit(final FMLPreInitializationEvent e) {
+ // TODO Auto-generated method stub
+ super.preInit(e);
+ }
+
+ @Override
+ public void init(final FMLInitializationEvent e) {
+ // TODO Auto-generated method stub
+ super.init(e);
+ }
+
+ @Override
+ public void postInit(final FMLPostInitializationEvent e) {
+ // TODO Auto-generated method stub
+ super.postInit(e);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/recipe/LOADER_Machine_Components.java b/gtpp/src/main/java/gtPlusPlus/core/recipe/LOADER_Machine_Components.java
new file mode 100644
index 0000000000..a10d2cd05b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/recipe/LOADER_Machine_Components.java
@@ -0,0 +1,114 @@
+package gtPlusPlus.core.recipe;
+
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class LOADER_Machine_Components {
+
+ public static void initialise() {
+ registerDefaultComponents();
+
+ registerGTNHComponents();
+ }
+
+ private static void registerDefaultComponents() {
+ // Machine Components
+ CI.electricMotor_LV = ItemList.Electric_Motor_LV.get(1);
+ CI.electricMotor_MV = ItemList.Electric_Motor_MV.get(1);
+ CI.electricMotor_HV = ItemList.Electric_Motor_HV.get(1);
+ CI.electricMotor_EV = ItemList.Electric_Motor_EV.get(1);
+ CI.electricMotor_IV = ItemList.Electric_Motor_IV.get(1);
+ CI.electricPump_LV = ItemList.Electric_Pump_LV.get(1);
+ CI.electricPump_MV = ItemList.Electric_Pump_MV.get(1);
+ CI.electricPump_HV = ItemList.Electric_Pump_HV.get(1);
+ CI.electricPump_EV = ItemList.Electric_Pump_EV.get(1);
+ CI.electricPump_IV = ItemList.Electric_Pump_IV.get(1);
+ CI.electricPiston_LV = ItemList.Electric_Piston_LV.get(1);
+ CI.electricPiston_MV = ItemList.Electric_Piston_MV.get(1);
+ CI.electricPiston_HV = ItemList.Electric_Piston_HV.get(1);
+ CI.electricPiston_EV = ItemList.Electric_Piston_EV.get(1);
+ CI.electricPiston_IV = ItemList.Electric_Piston_IV.get(1);
+ CI.robotArm_LV = ItemList.Robot_Arm_LV.get(1);
+ CI.robotArm_MV = ItemList.Robot_Arm_MV.get(1);
+ CI.robotArm_HV = ItemList.Robot_Arm_HV.get(1);
+ CI.robotArm_EV = ItemList.Robot_Arm_EV.get(1);
+ CI.robotArm_IV = ItemList.Robot_Arm_IV.get(1);
+ CI.conveyorModule_LV = ItemList.Conveyor_Module_LV.get(1);
+ CI.conveyorModule_MV = ItemList.Conveyor_Module_MV.get(1);
+ CI.conveyorModule_HV = ItemList.Conveyor_Module_HV.get(1);
+ CI.conveyorModule_EV = ItemList.Conveyor_Module_EV.get(1);
+ CI.conveyorModule_IV = ItemList.Conveyor_Module_IV.get(1);
+ CI.emitter_LV = ItemList.Emitter_LV.get(1);
+ CI.emitter_MV = ItemList.Emitter_MV.get(1);
+ CI.emitter_HV = ItemList.Emitter_HV.get(1);
+ CI.emitter_EV = ItemList.Emitter_EV.get(1);
+ CI.emitter_IV = ItemList.Emitter_IV.get(1);
+ CI.fieldGenerator_LV = ItemList.Field_Generator_LV.get(1);
+ CI.fieldGenerator_MV = ItemList.Field_Generator_MV.get(1);
+ CI.fieldGenerator_HV = ItemList.Field_Generator_HV.get(1);
+ CI.fieldGenerator_EV = ItemList.Field_Generator_EV.get(1);
+ CI.fieldGenerator_IV = ItemList.Field_Generator_IV.get(1);
+ CI.sensor_LV = ItemList.Sensor_LV.get(1);
+ CI.sensor_MV = ItemList.Sensor_MV.get(1);
+ CI.sensor_HV = ItemList.Sensor_HV.get(1);
+ CI.sensor_EV = ItemList.Sensor_EV.get(1);
+ CI.sensor_IV = ItemList.Sensor_IV.get(1);
+ CI.fluidRegulator_LV = ItemList.FluidRegulator_LV.get(1);
+ CI.fluidRegulator_MV = ItemList.FluidRegulator_MV.get(1);
+ CI.fluidRegulator_HV = ItemList.FluidRegulator_HV.get(1);
+ CI.fluidRegulator_EV = ItemList.FluidRegulator_EV.get(1);
+ CI.fluidRegulator_IV = ItemList.FluidRegulator_IV.get(1);
+ }
+
+ private static void registerGTNHComponents() {
+ // Machine Components
+ CI.electricMotor_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32606, 1);
+ CI.electricMotor_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32607, 1);
+ CI.electricMotor_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32608, 1);
+
+ CI.electricPump_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32615, 1);
+ CI.electricPump_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32616, 1);
+ CI.electricPump_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32617, 1);
+
+ CI.electricPiston_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32645, 1);
+ CI.electricPiston_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32646, 1);
+ CI.electricPiston_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32647, 1);
+
+ CI.robotArm_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32655, 1);
+ CI.robotArm_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32656, 1);
+ CI.robotArm_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32657, 1);
+
+ CI.conveyorModule_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32635, 1);
+ CI.conveyorModule_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32636, 1);
+ CI.conveyorModule_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32637, 1);
+
+ CI.emitter_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32685, 1);
+ CI.emitter_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32686, 1);
+ CI.emitter_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32687, 1);
+
+ CI.fieldGenerator_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32675, 1);
+ CI.fieldGenerator_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32676, 1);
+ CI.fieldGenerator_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32677, 1);
+
+ CI.sensor_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32695, 1);
+ CI.sensor_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32696, 1);
+ CI.sensor_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32697, 1);
+
+ CI.fluidRegulator_LuV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32665, 1);
+ CI.fluidRegulator_ZPM = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32666, 1);
+ CI.fluidRegulator_UV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32667, 1);
+
+ // Thanks 0lafe
+ CI.electricMotor_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32596, 1);
+ CI.electricPump_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32618, 1);
+ CI.electricPiston_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32648, 1);
+ CI.robotArm_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32658, 1);
+ CI.conveyorModule_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32638, 1);
+ CI.emitter_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32688, 1);
+ CI.fieldGenerator_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32678, 1);
+ CI.sensor_UHV = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32698, 1);
+
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_GREGTECH.java b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_GREGTECH.java
new file mode 100644
index 0000000000..0900bbb4fa
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_GREGTECH.java
@@ -0,0 +1,1806 @@
+package gtPlusPlus.core.recipe;
+
+import static gregtech.api.enums.Mods.Backpack;
+import static gregtech.api.enums.Mods.Baubles;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.recipe.RecipeMaps.brewingRecipes;
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
+import static gregtech.api.recipe.RecipeMaps.distillationTowerRecipes;
+import static gregtech.api.recipe.RecipeMaps.distilleryRecipes;
+import static gregtech.api.recipe.RecipeMaps.electrolyzerRecipes;
+import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidHeaterRecipes;
+import static gregtech.api.recipe.RecipeMaps.fusionRecipes;
+import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.recipe.RecipeMaps.multiblockChemicalReactorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.BUCKETS;
+import static gregtech.api.util.GT_RecipeBuilder.HOURS;
+import static gregtech.api.util.GT_RecipeBuilder.INGOTS;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.AssemblyLine;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GT_RecipeConstants.FUSION_THRESHOLD;
+import static gregtech.api.util.GT_RecipeConstants.RESEARCH_ITEM;
+import static gregtech.api.util.GT_RecipeConstants.RESEARCH_TIME;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.thermalBoilerRecipes;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.common.Loader;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.item.chemistry.IonParticles;
+import gtPlusPlus.core.item.crafting.ItemDummyResearch;
+import gtPlusPlus.core.item.crafting.ItemDummyResearch.ASSEMBLY_LINE_RESEARCH;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.ORES;
+import gtPlusPlus.core.material.Particle;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class RECIPES_GREGTECH {
+
+ public static void run() {
+ Logger.INFO("Loading Recipes through GregAPI for Industrial Multiblocks.");
+ execute();
+ }
+
+ private static void execute() {
+ electrolyzerRecipes();
+ assemblerRecipes();
+ distilleryRecipes();
+ extractorRecipes();
+ fluidExtractorRecipes();
+ chemicalReactorRecipes();
+ dehydratorRecipes();
+ blastFurnaceRecipes();
+ largeChemReactorRecipes();
+ fusionRecipes();
+ compressorRecipes();
+ mixerRecipes();
+ macerationRecipes();
+ centrifugeRecipes();
+ cyclotronRecipes();
+ blastSmelterRecipes();
+ extruderRecipes();
+ cuttingSawRecipes();
+ breweryRecipes();
+ laserEngraverRecipes();
+ assemblyLineRecipes();
+ fluidHeaterRecipes();
+ chemplantRecipes();
+ alloySmelterRecipes();
+ thermalBoilerRecipes();
+
+ /*
+ * Special Recipe handlers
+ */
+ RECIPES_SeleniumProcessing.init();
+ RECIPES_RareEarthProcessing.init();
+
+ addFuels();
+ }
+
+ private static void alloySmelterRecipes() {
+
+ // Wood's Glass Laser Lens
+ GT_Values.RA.stdBuilder()
+ .itemInputs(MISC_MATERIALS.WOODS_GLASS.getDust(5), ItemList.Shape_Mold_Ball.get(0))
+ .itemOutputs(GregtechItemList.Laser_Lens_WoodsGlass.get(1))
+ .duration(5 * MINUTES)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(alloySmelterRecipes);
+ }
+
+ private static void chemplantRecipes() {
+
+ // This is subsequently absorbed in water to form nitric acid and nitric oxide.
+ // 3 NO2 (g) + H2O (l) → 2 HNO3 (aq) + NO (g) (ΔH = −117 kJ/mol)
+ // The nitric oxide is cycled back for reoxidation. Alternatively, if the last step is carried out in air:
+ // 4 NO2 (g) + O2 (g) + 2 H2O (l) → 4 HNO3 (aq)
+
+ // Advanced method for Nitric Acid Production
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), CI.getPinkCatalyst(0), },
+ new FluidStack[] { Materials.NitrogenDioxide.getGas(4000L), FluidUtils.getAir(4000),
+ FluidUtils.getWater(2000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack("nitricacid", 4000), },
+ 10 * 20,
+ 480,
+ 3);
+
+ // Advanced recipe for Fluorine Production
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), CI.getPurpleCatalyst(0),
+ ItemUtils.getSimpleStack(Blocks.sandstone, 64), ItemUtils.getSimpleStack(Blocks.sandstone, 64) },
+ new FluidStack[] { FluidUtils.getFluidStack("nitricacid", 4000), FluidUtils.getAir(8000) },
+ new ItemStack[] { FLUORIDES.FLUORITE.getOre(8), FLUORIDES.FLUORITE.getOre(4), FLUORIDES.FLUORITE.getOre(4),
+ FLUORIDES.FLUORITE.getOre(4), },
+ new FluidStack[] {},
+ new int[] { 0, 2500, 2000, 1500 },
+ 10 * 20,
+ 1024,
+ 5);
+
+ // Advanced recipe for Fluorine Production
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), CI.getPurpleCatalyst(0),
+ ItemUtils.getSimpleStack(Blocks.sand, 64), ItemUtils.getSimpleStack(Blocks.sand, 64) },
+ new FluidStack[] { FluidUtils.getFluidStack("nitricacid", 5000), FluidUtils.getAir(12000) },
+ new ItemStack[] { FLUORIDES.FLUORITE.getOre(4), FLUORIDES.FLUORITE.getOre(2), FLUORIDES.FLUORITE.getOre(2),
+ FLUORIDES.FLUORITE.getOre(2), },
+ new FluidStack[] {},
+ new int[] { 7500, 1500, 1000, 500 },
+ 10 * 20,
+ 1024,
+ 5);
+
+ // 3NO2 + H2O = 2HNO3 + NO
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(16), CI.getPinkCatalyst(0), },
+ new FluidStack[] { Materials.NitrogenDioxide.getGas(3000L), FluidUtils.getDistilledWater(1000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack("nitricacid", 2000), Materials.NitricOxide.getGas(1000L), },
+ 10 * 20,
+ 480,
+ 2);
+
+ // Produce Boric Acid
+ // Na2B4O7·10H2O + 2HCl = 4B(OH)3 + 2NaCl + 5H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(21),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustBorax", 23), },
+ new FluidStack[] { FluidUtils.getFluidStack(GenericChem.HydrochloricAcid, 2000) },
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustSalt", 4), },
+ new FluidStack[] { FluidUtils.getFluidStack("boricacid", 4000), FluidUtils.getWater(5000) },
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(3),
+ 3);
+
+ // Produce Th232
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(22), ELEMENT.getInstance().THORIUM.getDust(16) },
+ new FluidStack[] { FluidUtils.getDistilledWater(2000), FluidUtils.getFluidStack("boricacid", 1500) },
+ new ItemStack[] { ELEMENT.getInstance().THORIUM.getSmallDust(32),
+ ELEMENT.getInstance().THORIUM232.getDust(2), ELEMENT.getInstance().THORIUM232.getSmallDust(2),
+ ELEMENT.getInstance().URANIUM232.getDust(1), },
+ new FluidStack[] {},
+ new int[] { 0, 0, 1000, 250 },
+ 20 * 300,
+ MaterialUtils.getVoltageForTier(4),
+ 4);
+
+ // Modify Sapling into Pine Sapling
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(6), ItemUtils.getSimpleStack(Blocks.sapling, 32) },
+ new FluidStack[] { FluidUtils.getFluidStack("fluid.geneticmutagen", 2000),
+ FluidUtils.getDistilledWater(8000) },
+ new ItemStack[] { ItemUtils.getSimpleStack(BOP_Block_Registrator.sapling_Pine, 16) },
+ new FluidStack[] {},
+ 120 * 20,
+ 64,
+ 2);
+
+ int aLaureniumTier = ALLOY.LAURENIUM.vTier;
+ // Adding Recipes for Casings
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(12), CI.getTieredMachineCasing(aLaureniumTier - 1),
+ ALLOY.LAURENIUM.getPlate(8), CI.getGear(aLaureniumTier, 2) },
+ new FluidStack[] { CI.getTieredFluid(aLaureniumTier, 2 * 144),
+ CI.getAlternativeTieredFluid(aLaureniumTier - 1, 4 * 144),
+ CI.getTertiaryTieredFluid(aLaureniumTier - 2, 6 * 144) },
+ new ItemStack[] { GregtechItemList.Casing_Machine_Custom_3.get(1) },
+ new FluidStack[] {},
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(aLaureniumTier - 2),
+ 5);
+
+ int aBotmiumTier = ALLOY.BOTMIUM.vTier;
+ // Adding Recipes for Casings
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(12), CI.getTieredMachineCasing(aBotmiumTier - 1),
+ ALLOY.BOTMIUM.getPlate(8), CI.getGear(aBotmiumTier, 2) },
+ new FluidStack[] { CI.getTieredFluid(aBotmiumTier, 2 * 144),
+ CI.getAlternativeTieredFluid(aBotmiumTier - 1, 4 * 144),
+ CI.getTertiaryTieredFluid(aBotmiumTier - 2, 6 * 144) },
+ new ItemStack[] { GregtechItemList.Casing_Machine_Custom_4.get(1) },
+ new FluidStack[] {},
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(aBotmiumTier - 2),
+ 6);
+
+ // Refine GT HF into GT++ HF
+ if (FluidUtils.doesHydrofluoricAcidGtExist()) {
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(22), },
+ new FluidStack[] { FluidUtils.getHydrofluoricAcid(2000), FluidUtils.getHydrofluoricAcidGT(5000) },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getHydrofluoricAcid(4500) },
+ 30 * 20,
+ 480,
+ 3);
+ }
+ }
+
+ private static void fluidHeaterRecipes() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(20))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(FluidUtils.getHotWater(1000))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(fluidHeaterRecipes);
+ }
+
+ private static void fusionRecipes() {
+ // Hypogen
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ ELEMENT.STANDALONE.DRAGON_METAL.getFluidStack(144),
+ ELEMENT.STANDALONE.RHUGNOR.getFluidStack(288))
+ .fluidOutputs(ELEMENT.STANDALONE.HYPOGEN.getFluidStack(36))
+ .duration(6 * MINUTES + 49 * SECONDS + 12 * TICKS)
+ .eut(TierEU.RECIPE_UHV)
+ .metadata(FUSION_THRESHOLD, 1_200_000_000)
+ .addTo(fusionRecipes);
+
+ // Rhugnor
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ MaterialUtils.getMaterial("Infinity", "Neutronium")
+ .getMolten(144),
+ ALLOY.QUANTUM.getFluidStack(288))
+ .fluidOutputs(ELEMENT.STANDALONE.RHUGNOR.getFluidStack(144))
+ .duration(25 * SECONDS + 12 * TICKS)
+ .eut(TierEU.RECIPE_UV)
+ .metadata(FUSION_THRESHOLD, 2_000_000_000)
+ .addTo(fusionRecipes);
+ }
+
+ private static void assemblyLineRecipes() {
+
+ // Containment Casings
+ GT_Values.RA.stdBuilder()
+ .metadata(
+ RESEARCH_ITEM,
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_1_CONTAINMENT, 1))
+ .metadata(RESEARCH_TIME, 30 * MINUTES)
+ .itemInputs(
+ ItemList.Field_Generator_IV.get(32),
+ ItemList.Electric_Motor_EV.get(64),
+ ItemList.Energy_LapotronicOrb.get(32),
+ CI.getTieredComponent(OrePrefixes.cableGt12, 7, 32),
+ CI.getTieredComponent(OrePrefixes.wireGt16, 6, 64),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Naquadria, 64L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gadolinium, 32L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Samarium, 16L),
+ ALLOY.ARCANITE.getGear(8),
+ new Object[] { CI.getTieredCircuitOreDictName(5), 64 },
+ new Object[] { CI.getTieredCircuitOreDictName(6), 32 },
+ new Object[] { CI.getTieredCircuitOreDictName(7), 16 },
+ GregtechItemList.Laser_Lens_Special.get(1),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 3, 64))
+ .fluidInputs(
+ ALLOY.NITINOL_60.getFluidStack(144 * 9 * 4),
+ ALLOY.ENERGYCRYSTAL.getFluidStack(144 * 9 * 8),
+ ALLOY.TUMBAGA.getFluidStack(144 * 9 * 32),
+ Materials.Nichrome.getMolten(16 * INGOTS))
+ .itemOutputs(ItemUtils.getSimpleStack(ModBlocks.blockCasings3Misc, 15, 32))
+ .eut(TierEU.RECIPE_LuV)
+ .duration(20 * MINUTES)
+ .addTo(AssemblyLine);
+
+ // Turbine Automation Port
+ GT_Values.RA.stdBuilder()
+ .metadata(
+ RESEARCH_ITEM,
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_8_TURBINE_AUTOMATION, 1))
+ .metadata(RESEARCH_TIME, 24 * HOURS)
+ .itemInputs(
+ CI.getTieredMachineHull(8, 4),
+ CI.getConveyor(8, 24),
+ CI.getElectricMotor(7, 32),
+ CI.getElectricPiston(7, 16),
+ CI.getEnergyCore(6, 8),
+ CI.getPlate(8, 24),
+ CI.getTieredComponent(OrePrefixes.screw, 8, 48),
+ CI.getTieredComponent(OrePrefixes.bolt, 7, 32),
+ CI.getTieredComponent(OrePrefixes.rod, 6, 12),
+ new Object[] { CI.getTieredCircuitOreDictName(7), 20 },
+ CI.getTieredComponent(OrePrefixes.rotor, 6, 16))
+ .fluidInputs(
+ CI.getTieredFluid(8, 144 * 32),
+ CI.getAlternativeTieredFluid(7, 144 * 16),
+ CI.getTertiaryTieredFluid(7, 144 * 16),
+ ALLOY.BABBIT_ALLOY.getFluidStack(128 * 144))
+ .itemOutputs(GregtechItemList.Hatch_Input_TurbineHousing.get(4))
+ .eut(TierEU.RECIPE_UV)
+ .duration(2 * HOURS)
+ .addTo(AssemblyLine);
+
+ /*
+ * Containment casings
+ */
+ ItemStack[] aCoilWire = new ItemStack[] { ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 0, 64),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 1, 64),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 2, 64),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 3, 64), };
+ ItemStack[] aGemCasings = new ItemStack[] { GregtechItemList.Battery_Casing_Gem_1.get(1),
+ GregtechItemList.Battery_Casing_Gem_2.get(1), GregtechItemList.Battery_Casing_Gem_3.get(1),
+ GregtechItemList.Battery_Casing_Gem_4.get(1), };
+ ItemStack[] aResearch = new ItemStack[] { Particle.getBaseParticle(Particle.UNKNOWN),
+ GregtechItemList.Battery_Casing_Gem_1.get(1), GregtechItemList.Battery_Casing_Gem_2.get(1),
+ GregtechItemList.Battery_Casing_Gem_3.get(1), };
+
+ int aCasingSlot = 0;
+ for (int j = 6; j < 10; j++) {
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, aResearch[aCasingSlot])
+ .metadata(RESEARCH_TIME, 1 * HOURS)
+ .itemInputs(
+ CI.getTieredComponent(OrePrefixes.plate, j - 1, 16),
+ CI.getTieredComponent(OrePrefixes.cableGt08, j + 1, 32),
+ CI.getTieredComponent(OrePrefixes.gearGt, j - 1, 4),
+ aCoilWire[aCasingSlot])
+ .fluidInputs(
+ CI.getTieredFluid(j, 144 * 8),
+ CI.getTertiaryTieredFluid(j - 2, 144 * 16),
+ CI.getAlternativeTieredFluid(j, 144 * 16))
+ .itemOutputs(aGemCasings[aCasingSlot++])
+ .eut(GT_Values.V[j])
+ .duration(2 * MINUTES)
+ .addTo(AssemblyLine);
+ }
+
+ /*
+ * Gem Battery Recipes
+ */
+
+ ItemStack[] aGemBatteries = new ItemStack[] { GregtechItemList.Battery_Gem_1.get(1),
+ GregtechItemList.Battery_Gem_2.get(1), GregtechItemList.Battery_Gem_3.get(1),
+ GregtechItemList.Battery_Gem_4.get(1), };
+
+ ItemStack[] aExoticInputs = new ItemStack[] { Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.ELECTRON), Particle.getBaseParticle(Particle.CHARM),
+ Particle.getBaseParticle(Particle.GRAVITON) };
+ aCasingSlot = 0;
+ for (int j = 6; j < 10; j++) {
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, aExoticInputs[aCasingSlot])
+ .metadata(RESEARCH_TIME, 5 * HOURS)
+ .itemInputs(
+ aGemCasings[aCasingSlot],
+ ItemUtils.getSimpleStack(aExoticInputs[aCasingSlot], 16),
+ CI.getTieredComponent(OrePrefixes.plate, j, 16),
+ new Object[] { CI.getTieredCircuitOreDictName(j), 8 },
+ CI.getTieredComponent(OrePrefixes.wireGt16, j + 1, 32),
+ CI.getTieredComponent(OrePrefixes.bolt, j, 8),
+ CI.getTieredComponent(OrePrefixes.screw, j - 1, 8))
+ .fluidInputs(
+ CI.getTieredFluid(j, 144 * 1 * 16),
+ CI.getTertiaryTieredFluid(j - 2, 144 * 2 * 16),
+ CI.getAlternativeTieredFluid(j, 144 * 16),
+ CI.getTertiaryTieredFluid(j - 1, 144 * 16))
+ .itemOutputs(aGemBatteries[aCasingSlot++])
+ .eut(GT_Values.V[j])
+ .duration(2 * MINUTES)
+ .addTo(AssemblyLine);
+ }
+
+ if (Baubles.isModLoaded()) {
+ // Nano Healer
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemUtils.simpleMetaStack(Items.golden_apple, 1, 1))
+ .metadata(RESEARCH_TIME, 10 * MINUTES)
+ .itemInputs(
+ ItemUtils.getSimpleStack(aGemCasings[2], 4),
+ CI.getTieredComponent(OrePrefixes.plate, 8, 32),
+ new Object[] { CI.getTieredCircuitOreDictName(7), 16 },
+ CI.getTieredComponent(OrePrefixes.cableGt02, 7, 16),
+ CI.getTieredComponent(OrePrefixes.gearGt, 6, 6),
+ CI.getTieredComponent(OrePrefixes.screw, 7, 16),
+ CI.getTieredComponent(OrePrefixes.bolt, 5, 24),
+ CI.getTieredComponent(OrePrefixes.frameGt, 4, 12),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 3, 64))
+ .fluidInputs(
+ CI.getTieredFluid(7, 144 * 18 * 16),
+ CI.getTertiaryTieredFluid(7, 144 * 18 * 16),
+ CI.getAlternativeTieredFluid(6, 144 * 18 * 16),
+ CI.getAlternativeTieredFluid(7, 144 * 18 * 16))
+ .itemOutputs(ItemUtils.getItemStackFromFQRN("miscutils:personalHealingDevice", 1))
+ .eut(TierEU.RECIPE_ZPM)
+ .duration(1 * HOURS)
+ .addTo(AssemblyLine);
+
+ // Charge Pack LuV-UV
+
+ ItemStack[] aChargeResearch = new ItemStack[] {
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore7", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore8", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore9", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore10", 1), };
+
+ ItemStack[] aChargeOutputs = new ItemStack[] { ItemUtils.getSimpleStack(ModItems.itemChargePack_High_1, 1),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_High_2, 1),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_High_3, 1),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_High_4, 1), };
+
+ int aCurrSlot = 0;
+ for (int h = 6; h < 10; h++) {
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, aChargeResearch[aCurrSlot])
+ .metadata(RESEARCH_TIME, 10 * (aCurrSlot + 1) * MINUTES)
+ .itemInputs(
+ ItemUtils.getSimpleStack(aGemBatteries[aCurrSlot], 2),
+ aCoilWire[aCurrSlot],
+ CI.getTieredComponent(OrePrefixes.plate, h, 8),
+ new Object[] { CI.getTieredCircuitOreDictName(h), 4 },
+ new Object[] { CI.getTieredCircuitOreDictName(h - 1), 8 },
+ CI.getTieredComponent(OrePrefixes.cableGt12, h - 1, 16),
+ CI.getTieredComponent(OrePrefixes.screw, h, 16),
+ CI.getTieredComponent(OrePrefixes.bolt, h - 2, 32),
+ CI.getFieldGenerator(h - 1, 1))
+ .fluidInputs(
+ CI.getTieredFluid(h, 144 * 4 * 8),
+ CI.getTertiaryTieredFluid(h - 1, 144 * 4 * 8),
+ CI.getAlternativeTieredFluid(h - 1, 144 * 4 * 8),
+ CI.getAlternativeTieredFluid(h - 2, 144 * 4 * 8))
+ .itemOutputs(aChargeOutputs[aCurrSlot])
+ .eut(GT_Values.V[h])
+ .duration((aCurrSlot + 1) * HOURS)
+ .addTo(AssemblyLine);
+ aCurrSlot++;
+ }
+
+ // Cloaking device
+ GT_Values.RA.stdBuilder()
+ .metadata(
+ RESEARCH_ITEM,
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_9_CLOAKING, 1))
+ .metadata(RESEARCH_TIME, 10 * MINUTES)
+ .itemInputs(
+ ItemUtils.getSimpleStack(aGemCasings[3], 4),
+ CI.getTieredComponent(OrePrefixes.plate, 8, 32),
+ new Object[] { CI.getTieredCircuitOreDictName(7), 16 },
+ CI.getTieredComponent(OrePrefixes.cableGt04, 8, 16),
+ CI.getTieredComponent(OrePrefixes.gearGt, 7, 6),
+ CI.getTieredComponent(OrePrefixes.screw, 8, 16),
+ CI.getTieredComponent(OrePrefixes.bolt, 7, 24),
+ CI.getTieredComponent(OrePrefixes.frameGt, 5, 12),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 3, 64))
+ .fluidInputs(
+ CI.getTieredFluid(8, 144 * 18 * 16),
+ CI.getTertiaryTieredFluid(8, 144 * 18 * 16),
+ CI.getAlternativeTieredFluid(7, 144 * 18 * 16),
+ CI.getAlternativeTieredFluid(8, 144 * 18 * 16))
+ .itemOutputs(ItemUtils.getItemStackFromFQRN("miscutils:personalCloakingDevice-0.0", 1))
+ .eut(TierEU.RECIPE_UV)
+ .duration(1 * HOURS)
+ .addTo(AssemblyLine);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, GregtechItemList.Industrial_AlloyBlastSmelter.get(1, new Object() {}))
+ .metadata(RESEARCH_TIME, 30 * MINUTES)
+ .itemInputs(
+ GregtechItemList.Industrial_AlloyBlastSmelter.get(64L, new Object() {}),
+ GregtechItemList.Industrial_AlloyBlastSmelter.get(64L, new Object() {}),
+ GregtechItemList.Industrial_AlloyBlastSmelter.get(64L, new Object() {}),
+ GregtechItemList.Industrial_AlloyBlastSmelter.get(64L, new Object() {}),
+ ItemList.UV_Coil.get(16L, new Object() {}),
+ ItemList.Conveyor_Module_UV.get(4L, new Object() {}),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 8 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 16 },
+ ItemList.Circuit_Chip_PPIC.get(16, new Object() {}),
+ ALLOY.PIKYONIUM.getPlate(16),
+ ALLOY.CINOBITE.getScrew(32))
+ .fluidInputs(
+ ALLOY.PIKYONIUM.getFluidStack(144 * 8),
+ ALLOY.INDALLOY_140.getFluidStack(144 * 9),
+ Materials.SolderingAlloy.getMolten(144 * 10))
+ .itemOutputs(GregtechItemList.Mega_AlloyBlastSmelter.get(1L))
+ .eut(TierEU.RECIPE_UHV / 2)
+ .duration(1 * MINUTES)
+ .addTo(AssemblyLine);
+ }
+
+ private static void laserEngraverRecipes() {
+
+ // Laser Sensors and Emitters together
+ GregtechItemList[] aTransParts = new GregtechItemList[] { GregtechItemList.TransmissionComponent_LV,
+ GregtechItemList.TransmissionComponent_MV, GregtechItemList.TransmissionComponent_HV,
+ GregtechItemList.TransmissionComponent_EV, GregtechItemList.TransmissionComponent_IV,
+ GregtechItemList.TransmissionComponent_LuV, GregtechItemList.TransmissionComponent_ZPM,
+ GregtechItemList.TransmissionComponent_UV, GregtechItemList.TransmissionComponent_UHV, };
+ for (int i = 1; i < aTransParts.length; i++) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(CI.getEmitter(i, 2), CI.getSensor(i, 2))
+ .itemOutputs(aTransParts[i - 1].get(1))
+ .duration(5 * SECONDS)
+ .eut(GT_Values.VP[i])
+ .addTo(laserEngraverRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungsten, 6L),
+ GregtechItemList.Laser_Lens_Special.get(0))
+ .itemOutputs(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getDust(1))
+ .duration(3 * MINUTES)
+ .eut(MaterialUtils.getVoltageForTier(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.vTier))
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 8L),
+ GregtechItemList.Laser_Lens_Special.get(0))
+ .itemOutputs(ELEMENT.STANDALONE.ASTRAL_TITANIUM.getDust(1))
+ .duration(2 * MINUTES)
+ .eut(MaterialUtils.getVoltageForTier(ELEMENT.STANDALONE.ASTRAL_TITANIUM.vTier))
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ALLOY.NITINOL_60.getBlock(2), GregtechItemList.Laser_Lens_Special.get(0))
+ .itemOutputs(ELEMENT.STANDALONE.ADVANCED_NITINOL.getBlock(1))
+ .duration(1 * MINUTES)
+ .eut(MaterialUtils.getVoltageForTier(ELEMENT.STANDALONE.ADVANCED_NITINOL.vTier))
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 64L),
+ GregtechItemList.Laser_Lens_Special.get(0))
+ .itemOutputs(ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getDust(1))
+ .duration(5 * MINUTES)
+ .eut(MaterialUtils.getVoltageForTier(ELEMENT.STANDALONE.CHRONOMATIC_GLASS.vTier))
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(CI.getFieldGenerator(6, 1), CI.getEmitter(7, 2))
+ .itemOutputs(ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_1_CONTAINMENT, 1))
+ .duration(5 * MINUTES)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+
+ // Distillus Upgrade Chip
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GregtechItemList.Laser_Lens_WoodsGlass.get(0),
+ ItemUtils.simpleMetaStack(AgriculturalChem.mBioCircuit, 20, 1))
+ .itemOutputs(GregtechItemList.Distillus_Upgrade_Chip.get(1))
+ .duration(5 * MINUTES)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+ }
+
+ private static void breweryRecipes() {
+
+ if (Loader.isModLoaded("OpenBlocks")) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(14))
+ .fluidInputs(FluidRegistry.getFluidStack("mobessence", 100))
+ .fluidOutputs(FluidRegistry.getFluidStack("liquidxp", 1332))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(brewingRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(14))
+ .fluidInputs(FluidRegistry.getFluidStack("liquidxp", 1332))
+ .fluidOutputs(FluidRegistry.getFluidStack("mobessence", 100))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(brewingRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(BOP_Block_Registrator.sapling_Rainforest))
+ .fluidInputs(Materials.Water.getFluid(100L))
+ .fluidOutputs(Materials.Biomass.getFluid(100L))
+ .duration(1 * MINUTES)
+ .eut(3)
+ .addTo(brewingRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(BOP_Block_Registrator.sapling_Rainforest))
+ .fluidInputs(Materials.Honey.getFluid(100L))
+ .fluidOutputs(Materials.Biomass.getFluid(100L))
+ .duration(1 * MINUTES)
+ .eut(3)
+ .addTo(brewingRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(BOP_Block_Registrator.sapling_Rainforest))
+ .fluidInputs(FluidUtils.getFluidStack("juice", 100))
+ .fluidOutputs(Materials.Biomass.getFluid(100L))
+ .duration(1 * MINUTES)
+ .eut(3)
+ .addTo(brewingRecipes);
+ }
+
+ private static void cuttingSawRecipes() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("blockMeatRaw", 1))
+ .itemOutputs(ItemUtils.getItemStackOfAmountFromOreDict("plateMeatRaw", 9))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(cutterRecipes);
+ }
+
+ private static void electrolyzerRecipes() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(ModItems.dustDecayedRadium226, 1))
+ .fluidOutputs(FluidUtils.getFluidStack("radon", 144))
+ .duration(1 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(electrolyzerRecipes);
+ }
+
+ private static void extruderRecipes() {
+ // Osmium Credits
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("blockOsmium", 1), ItemList.Shape_Mold_Credit.get(0))
+ .itemOutputs(ItemList.Credit_Greg_Osmium.get(1))
+ .duration(6 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_EV / 2)
+ .addTo(extruderRecipes);
+ }
+
+ private static void blastSmelterRecipes() {
+
+ // Eglin Steel
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(6), ELEMENT.getInstance().IRON.getDust(4),
+ ALLOY.KANTHAL.getDust(1), ALLOY.INVAR.getDust(5), ELEMENT.getInstance().SULFUR.getDust(1),
+ ELEMENT.getInstance().CARBON.getDust(1), ELEMENT.getInstance().SILICON.getDust(4) },
+ ALLOY.EGLIN_STEEL.getFluidStack(16 * 144),
+ 0,
+ 20 * 45,
+ 120);
+
+ // HG1223
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(5), ELEMENT.getInstance().BARIUM.getDust(2),
+ ELEMENT.getInstance().CALCIUM.getDust(2), ELEMENT.getInstance().COPPER.getDust(3), },
+ new FluidStack[] { ELEMENT.getInstance().OXYGEN.getFluidStack(8000),
+ ELEMENT.getInstance().MERCURY.getFluidStack(1000), },
+ ALLOY.HG1223.getFluidStack(16 * 144),
+ null,
+ new int[] { 10000 }, // Output Chance
+ 20 * 120,
+ 30720);
+
+ // NITINOL_60
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(2), ELEMENT.getInstance().TITANIUM.getDust(3),
+ ELEMENT.getInstance().NICKEL.getDust(2) },
+ ALLOY.NITINOL_60.getFluidStack(5 * 144),
+ 0,
+ 20 * 75,
+ 7680);
+
+ // INDALLOY_140
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(5), ELEMENT.getInstance().BISMUTH.getDust(47),
+ ELEMENT.getInstance().LEAD.getDust(25), ELEMENT.getInstance().TIN.getDust(13),
+ ELEMENT.getInstance().CADMIUM.getDust(10), ELEMENT.getInstance().INDIUM.getDust(5) },
+ ALLOY.INDALLOY_140.getFluidStack(100 * 144),
+ 0,
+ 20 * 40,
+ 7680);
+
+ // Germanium Roasting
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(15),
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedSphalerite", 8),
+ ELEMENT.getInstance().CARBON.getDust(32), },
+ Materials.SulfuricAcid.getFluid(2000),
+ ELEMENT.getInstance().GERMANIUM.getFluidStack(288),
+ 0,
+ 20 * 300,
+ 4000);
+
+ // Rhenium Roasting
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(20),
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedScheelite", 8),
+ ELEMENT.getInstance().CARBON.getDust(32), },
+ Materials.SulfuricAcid.getFluid(10000),
+ ELEMENT.getInstance().RHENIUM.getFluidStack(144),
+ 0,
+ 20 * 300,
+ 4000);
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(20),
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedMolybdenite", 8),
+ ELEMENT.getInstance().CARBON.getDust(32), },
+ Materials.SulfuricAcid.getFluid(7500),
+ ELEMENT.getInstance().RHENIUM.getFluidStack(144),
+ 0,
+ 20 * 300,
+ 4000);
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(20),
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedMolybdenum", 8),
+ ELEMENT.getInstance().CARBON.getDust(32), },
+ Materials.SulfuricAcid.getFluid(5000),
+ ELEMENT.getInstance().RHENIUM.getFluidStack(288),
+ 0,
+ 20 * 300,
+ 4000);
+
+ // Thallium Roasting
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(21),
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedZinc", 3),
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedPyrite", 4),
+ ELEMENT.getInstance().CARBON.getDust(16), },
+ Materials.SulfuricAcid.getFluid(1250),
+ ELEMENT.getInstance().THALLIUM.getFluidStack(288),
+ new ItemStack[] {},
+ new int[] { 0 },
+ 20 * 75,
+ 8000,
+ 3700,
+ false);
+
+ // Strontium processing
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(21), MISC_MATERIALS.STRONTIUM_OXIDE.getDust(8),
+ ELEMENT.getInstance().ALUMINIUM.getDust(8), },
+ (FluidStack) null,
+ ELEMENT.getInstance().OXYGEN.getFluidStack(8000),
+ new ItemStack[] { ELEMENT.getInstance().ALUMINIUM.getIngot(8),
+ ELEMENT.getInstance().STRONTIUM.getIngot(8) },
+ new int[] { 10000, 10000 }, // Output Chance
+ 20 * 120,
+ 480 * 4);
+
+ // molten botmium
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(4),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustNitinol60", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustOsmium", 6),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRuthenium", 6),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustThallium", 3) },
+ GT_Values.NF,
+ ALLOY.BOTMIUM.getFluidStack(2304),
+ 0,
+ 20 * 120,
+ 491520);
+
+ // molten precious metals alloy
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(6),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRuthenium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRhodium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustPalladium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustPlatinum", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustOsmium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustIridium", 1) },
+ GT_Values.NF,
+ FluidUtils.getFluidStack("molten.precious metals alloy", 864),
+ 0,
+ 20 * 540,
+ 7864320);
+ }
+
+ private static void dehydratorRecipes() {
+ Logger.INFO("Loading Recipes for Chemical Dehydrator.");
+
+ ItemStack cropGrape = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cropGrape", 1);
+ ItemStack foodRaisins = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("foodRaisins", 1);
+
+ if (cropGrape != null && foodRaisins != null) CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(20), cropGrape }, // Item
+ null, // Fluid input (slot 1)
+ null, // Fluid output (slot 2)
+ new ItemStack[] { foodRaisins }, // Output
+ new int[] { 10000 },
+ 10, // Time in ticks
+ 2); // EU
+
+ // Process Waste Water
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(21) },
+ FluidUtils.getFluidStack("fluid.sludge", 1000),
+ FluidUtils.getFluidStack("nitricacid", 10),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustTinyIron", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyCopper", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyTin", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyNickel", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyCobalt", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyAluminium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinySilver", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyGold", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyIridium", 1) },
+ new int[] { 10, 5, 5, 4, 4, 3, 2, 2, 1 },
+ 2 * 20,
+ 500); // EU
+
+ // C8H10 = C8H8 + 2H
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), CI.emptyCells(3) },
+ FluidUtils.getFluidStack("fluid.ethylbenzene", 1000),
+ null,
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("cellStyrene", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellHydrogen", 2) },
+ new int[] { 10000, 10000 },
+ 3 * 20,
+ 30);
+
+ /*
+ * Add custom recipes for drying leather
+ */
+ if (Backpack.isModLoaded()) {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), new ItemStack(Items.leather, 2) },
+ FluidUtils.getFluidStack("fluid.ethylbenzene", 1000),
+ null,
+ new ItemStack[] { ItemUtils.getCorrectStacktype("Backpack:tannedLeather", 1) },
+ new int[] { 10000 },
+ 5 * 20,
+ 180);
+ if (NewHorizonsCoreMod.isModLoaded()) {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ArtificialLeather", 2L, 0) },
+ FluidUtils.getFluidStack("fluid.ethylbenzene", 1000),
+ null,
+ new ItemStack[] { ItemUtils.getCorrectStacktype("Backpack:tannedLeather", 1) },
+ new int[] { 10000 },
+ 5 * 20,
+ 180);
+ }
+ }
+ // Alternative ACETIC ANHYDRIDE recipe for Kevlar Line
+ // 2C2H4O2 = C4H6O3 + H2O
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), CI.emptyCells(1) },
+ FluidUtils.getFluidStack("aceticacid", 2000),
+ MISC_MATERIALS.ACETIC_ANHYDRIDE.getFluidStack(1000),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("cellWater", 1), },
+ new int[] { 10000 },
+ 30 * 20,
+ 480);
+ }
+
+ private static void largeChemReactorRecipes() {
+ // Styrene
+ // C8H10 = C8H8 + 2H
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs()
+ .fluidInputs(FluidUtils.getFluidStack("fluid.ethylbenzene", 1000))
+ .fluidOutputs(Materials.Styrene.getFluid(1000L), Materials.Hydrogen.getGas(2000))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // Short-cut Styrene
+ // C6H6 + C2H4 = C8H8 + 2H
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs()
+ .fluidInputs(Materials.Ethylene.getGas(500L), Materials.Benzene.getFluid(500L))
+ .fluidOutputs(Materials.Styrene.getFluid(500L), Materials.Hydrogen.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+ }
+
+ private static void assemblerRecipes() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Vanadium, 32L),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.VanadiumSteel, 8L))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.itemHalfCompleteCasings, 0, 4))
+ .fluidInputs(Materials.Oxygen.getGas(8000L))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.simpleMetaStack(ModItems.itemHalfCompleteCasings, 0, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.VanadiumGallium, 8L))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.itemHalfCompleteCasings, 1, 8))
+ .fluidInputs(Materials.Tantalum.getMolten(4 * INGOTS))
+ .duration(32 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.simpleMetaStack(ModItems.itemHalfCompleteCasings, 1, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Lead, 4L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(3), 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorHV, 2L))
+ .itemOutputs(ItemUtils.getSimpleStack(GregtechItemList.Casing_Vanadium_Redox.get(1), 1))
+ .fluidInputs(Materials.Oxygen.getGas(16 * BUCKETS))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GregtechItemList.Casing_Vanadium_Redox.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Titanium, 4L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(4), 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorEV, 2L))
+ .itemOutputs(GregtechItemList.Casing_Vanadium_Redox_IV.get(1))
+ .fluidInputs(Materials.Nitrogen.getGas(16 * BUCKETS))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GregtechItemList.Casing_Vanadium_Redox_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.TungstenSteel, 4L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(5), 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 2L))
+ .itemOutputs(GregtechItemList.Casing_Vanadium_Redox_LuV.get(1))
+ .fluidInputs(Materials.Helium.getGas(8 * BUCKETS))
+ .duration(12 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GregtechItemList.Casing_Vanadium_Redox_LuV.get(1),
+ ItemUtils.getItemStackOfAmountFromOreDict("plateAlloyIridium", 16),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(6), 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 2L))
+ .itemOutputs(GregtechItemList.Casing_Vanadium_Redox_ZPM.get(1))
+ .fluidInputs(Materials.Argon.getGas(4 * BUCKETS))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GregtechItemList.Casing_Vanadium_Redox_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Naquadah, 4L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(7), 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorZPM, 2L))
+ .itemOutputs(GregtechItemList.Casing_Vanadium_Redox_UV.get(1))
+ .fluidInputs(Materials.Radon.getGas(4 * BUCKETS))
+ .duration(50 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GregtechItemList.Casing_Vanadium_Redox_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Americium, 4L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(8), 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUV, 2L))
+ .itemOutputs(GregtechItemList.Casing_Vanadium_Redox_MAX.get(1))
+ .fluidInputs(FluidUtils.getFluidStack("krypton", 500))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(CI.explosiveITNT, 2),
+ ItemUtils.getSimpleStack(CI.explosiveTNT, 4),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Iron, 1L))
+ .itemOutputs(ItemUtils.getSimpleStack(ModBlocks.blockMiningExplosive, 3))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherStar, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.BlackSteel, 8L))
+ .itemOutputs(ItemUtils.getSimpleStack(ModBlocks.blockWitherGuard, 64))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.fluidRegulator_LV,
+ CI.electricMotor_LV,
+ CI.getTieredComponent(OrePrefixes.bolt, 1, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Brass, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Brass, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 2L))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 1, 1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.fluidRegulator_MV,
+ CI.electricMotor_MV,
+ CI.getTieredComponent(OrePrefixes.bolt, 2, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Invar, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Invar, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2L))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 2, 1))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.fluidRegulator_HV,
+ CI.electricMotor_HV,
+ CI.getTieredComponent(OrePrefixes.bolt, 3, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Chrome, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Chrome, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 2L))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 3, 1))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.fluidRegulator_EV,
+ CI.electricMotor_EV,
+ CI.getTieredComponent(OrePrefixes.bolt, 4, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Titanium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Titanium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2L))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 4, 1))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 1, 1), GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.toolGregtechPump, 1000, 1))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 2, 1), GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.toolGregtechPump, 1001, 1))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 3, 1), GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.toolGregtechPump, 1002, 1))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.simpleMetaStack(ModItems.itemGenericToken, 4, 1), GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(ItemUtils.simpleMetaStack(ModItems.toolGregtechPump, 1003, 1))
+ .duration(1 * MINUTES + 36 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ // Low tier Charge Packs
+
+ final ItemStack[] aPackBatteries = new ItemStack[] { ItemList.Battery_RE_LV_Lithium.get(4),
+ ItemList.Battery_RE_MV_Lithium.get(4), ItemList.Battery_RE_HV_Lithium.get(4),
+ GregtechItemList.Battery_RE_EV_Lithium.get(4), ItemList.Energy_LapotronicOrb.get(4), };
+ final ItemStack[] aPackPlates = new ItemStack[] { CI.getPlate(1, 8), CI.getPlate(2, 8), CI.getPlate(3, 8),
+ CI.getPlate(4, 8), CI.getPlate(5, 8), };
+ final ItemStack[] aPackWire = new ItemStack[] { CI.getTieredComponent(OrePrefixes.wireGt02, 1, 6),
+ CI.getTieredComponent(OrePrefixes.wireGt04, 2, 6), CI.getTieredComponent(OrePrefixes.wireGt08, 3, 6),
+ CI.getTieredComponent(OrePrefixes.wireGt12, 4, 6), CI.getTieredComponent(OrePrefixes.wireGt16, 5, 6), };
+ final ItemStack[] aPackCircuit = new ItemStack[] { CI.getTieredComponent(OrePrefixes.circuit, 1, 4),
+ CI.getTieredComponent(OrePrefixes.circuit, 2, 4), CI.getTieredComponent(OrePrefixes.circuit, 3, 4),
+ CI.getTieredComponent(OrePrefixes.circuit, 4, 4), CI.getTieredComponent(OrePrefixes.circuit, 5, 4), };
+ final ItemStack[] aPackRing = new ItemStack[] { CI.getTieredComponent(OrePrefixes.ring, 1, 12),
+ CI.getTieredComponent(OrePrefixes.ring, 2, 12), CI.getTieredComponent(OrePrefixes.ring, 3, 12),
+ CI.getTieredComponent(OrePrefixes.ring, 4, 12), CI.getTieredComponent(OrePrefixes.ring, 5, 12), };
+ final ItemStack[] aPackOutput = new ItemStack[] { ItemUtils.getSimpleStack(ModItems.itemChargePack_Low_1),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_Low_2),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_Low_3),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_Low_4),
+ ItemUtils.getSimpleStack(ModItems.itemChargePack_Low_5) };
+
+ for (int i = 1; i < 6; i++) {
+
+ int aAS = i - 1;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aPackPlates[aAS],
+ aPackRing[aAS],
+ aPackWire[aAS],
+ aPackCircuit[aAS],
+ aPackBatteries[aAS],
+ CI.getSensor(i, 4))
+ .itemOutputs(aPackOutput[aAS])
+ .fluidInputs(CI.getTieredFluid(i, (144 * 4)))
+ .duration(30 * i * SECONDS)
+ .eut(GT_Values.V[i])
+ .addTo(assemblerRecipes);
+ }
+
+ if (Baubles.isModLoaded()) {
+
+ // Turbine Housing Research Page
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(17),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Trinium, 64L),
+ CI.getSensor(6, 6),
+ CI.getBolt(7, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Platinum, 64L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(7), 12))
+ .itemOutputs(
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_8_TURBINE_AUTOMATION, 1))
+ .fluidInputs(CI.getAlternativeTieredFluid(7, 144 * 32))
+ .duration(5 * MINUTES)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ // Cloaking Device Research Page
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(17),
+ ItemUtils.getSimpleStack(ModItems.itemCircuitLFTR, 4),
+ CI.getFieldGenerator(6, 16),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Palladium, 32L),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(6), 12))
+ .itemOutputs(ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_9_CLOAKING, 1))
+ .fluidInputs(CI.getAlternativeTieredFluid(7, 144 * 32))
+ .duration(10 * MINUTES)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+ }
+ }
+
+ private static void distilleryRecipes() {
+ Logger.INFO("Registering Distillery/Distillation Tower Recipes.");
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(4))
+ .fluidInputs(Materials.Air.getGas(1000L))
+ .fluidOutputs(Materials.Helium.getGas(1L))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Air.getGas(20000L))
+ .fluidOutputs(Materials.Helium.getGas(25L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(distillationTowerRecipes);
+
+ // Apatite Distillation
+ /*
+ * so if you dissolve aparite in sulphuric acid you'll get a mixture of SO2, H2O, HF and HCl
+ */
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(FluidUtils.getFluidStack("sulfuricapatite", 5200))
+ .fluidOutputs(
+ FluidUtils.getFluidStack("sulfurousacid", 3800),
+ FluidUtils.getFluidStack("hydrogenchloride", 1000),
+ FluidUtils.getFluidStack("hydrofluoricacid", 400))
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(FluidUtils.getFluidStack("sulfurousacid", 1000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(500), Materials.Water.getFluid(500))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(distillationTowerRecipes);
+ }
+
+ private static void thermalBoilerRecipes() {
+ Logger.INFO("Registering Thermal Boiler Recipes.");
+
+ // Recipes with special value -1 display additional tooltip in NEI about lava filters.
+
+ // Lava
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(FluidUtils.getLava(1000), FluidUtils.getWater(16_000 / GT_Values.STEAM_PER_WATER))
+ .fluidOutputs(FluidUtils.getPahoehoeLava(1000), FluidUtils.getSteam(16_000))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Gold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tantalum, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungstate, 1),
+ new ItemStack(Blocks.obsidian, 1, 0))
+ .outputChances(444, 222, 56, 56, 56, 125, 1000)
+ .specialValue(-1)
+ .duration(1 * SECONDS)
+ .eut(0)
+ .addTo(thermalBoilerRecipes);
+
+ // Pahoehoe Lava
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(FluidUtils.getPahoehoeLava(1000), FluidUtils.getWater(16_000 / GT_Values.STEAM_PER_WATER))
+ .fluidOutputs(FluidUtils.getSteam(16_000))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Electrum, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tantalum, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungstate, 1),
+ new ItemStack(Blocks.obsidian, 1, 0))
+ .outputChances(167, 56, 56, 125, 3700)
+ .specialValue(-1)
+ .duration(1 * SECONDS)
+ .eut(0)
+ .addTo(thermalBoilerRecipes);
+
+ // Hot Coolant
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ FluidUtils.getFluidStack("ic2hotcoolant", 500),
+ FluidUtils.getWater(100_000 / GT_Values.STEAM_PER_WATER))
+ .fluidOutputs(FluidUtils.getFluidStack("ic2coolant", 500), FluidUtils.getSuperHeatedSteam(100_000))
+ .duration(1 * SECONDS)
+ .eut(0)
+ .addTo(thermalBoilerRecipes);
+
+ // Solar Salt (Hot)
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ MISC_MATERIALS.SOLAR_SALT_HOT.getFluidStack(100),
+ FluidUtils.getWater(100_000 / GT_Values.STEAM_PER_WATER))
+ .fluidOutputs(MISC_MATERIALS.SOLAR_SALT_COLD.getFluidStack(100), FluidUtils.getSuperHeatedSteam(100_000))
+ .duration(1 * SECONDS)
+ .eut(0)
+ .addTo(thermalBoilerRecipes);
+ }
+
+ private static void addFuels() {
+ Logger.INFO("Registering New Fuels.");
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(Items.lava_bucket))
+ .metadata(FUEL_VALUE, 32)
+ .metadata(FUEL_TYPE, 2)
+ .duration(0)
+ .eut(0)
+ .addTo(GT_RecipeConstants.Fuel);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getIC2Cell(2))
+ .metadata(FUEL_VALUE, 32)
+ .metadata(FUEL_TYPE, 2)
+ .duration(0)
+ .eut(0)
+ .addTo(GT_RecipeConstants.Fuel);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getIC2Cell(11))
+ .metadata(FUEL_VALUE, 24)
+ .metadata(FUEL_TYPE, 2)
+ .duration(0)
+ .eut(0)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+
+ private static void extractorRecipes() {
+ Logger.INFO("Registering Extractor Recipes.");
+ GT_ModHandler.addExtractionRecipe(
+ GregtechItemList.Battery_RE_EV_Sodium.get(1L, new Object[0]),
+ ItemList.Battery_Hull_HV.get(4L, new Object[0]));
+ GT_ModHandler.addExtractionRecipe(
+ GregtechItemList.Battery_RE_EV_Cadmium.get(1L, new Object[0]),
+ ItemList.Battery_Hull_HV.get(4L, new Object[0]));
+ GT_ModHandler.addExtractionRecipe(
+ GregtechItemList.Battery_RE_EV_Lithium.get(1L, new Object[0]),
+ ItemList.Battery_Hull_HV.get(4L, new Object[0]));
+ }
+
+ private static void fluidExtractorRecipes() {
+ // Gelid Cryotheum
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cryotheum, 1L))
+ .fluidOutputs(FluidUtils.getFluidStack("cryotheum", 250))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(fluidExtractionRecipes);
+
+ // Ender Fluid
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(Items.ender_pearl))
+ .fluidOutputs(FluidUtils.getFluidStack("ender", 250))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(fluidExtractionRecipes);
+
+ // Blazing Pyrotheum
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Pyrotheum, 1L))
+ .fluidOutputs(FluidUtils.getFluidStack("pyrotheum", 250))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ private static void centrifugeRecipes() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(CI.getNumberedAdvancedCircuit(2), MISC_MATERIALS.SOLAR_SALT_COLD.getCell(1))
+ .itemOutputs(
+ MISC_MATERIALS.SODIUM_NITRATE.getDust(3),
+ MISC_MATERIALS.POTASSIUM_NITRATE.getDust(2),
+ CI.emptyCells(1))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(centrifugeRecipes);
+ }
+
+ private static void mixerRecipes() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.getNumberedAdvancedCircuit(2),
+ CI.emptyCells(1),
+ MISC_MATERIALS.SODIUM_NITRATE.getDust(3),
+ MISC_MATERIALS.POTASSIUM_NITRATE.getDust(2))
+ .itemOutputs(MISC_MATERIALS.SOLAR_SALT_COLD.getCell(1))
+ .duration(2 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.getNumberedAdvancedCircuit(2),
+ Materials.Titanium.getDust(9),
+ Materials.Carbon.getDust(9),
+ Materials.Potassium.getDust(9),
+ Materials.Lithium.getDust(9),
+ Materials.Sulfur.getDust(9))
+ .itemOutputs(ALLOY.LEAGRISIUM.getDust(50))
+ .fluidInputs(Materials.Hydrogen.getGas(5000))
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.getNumberedAdvancedCircuit(2),
+ Materials.Steel.getDust(16),
+ Materials.Molybdenum.getDust(1),
+ Materials.Titanium.getDust(1),
+ Materials.Nickel.getDust(4),
+ Materials.Cobalt.getDust(2))
+ .itemOutputs(ALLOY.MARAGING250.getDust(24))
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(mixerRecipes);
+ }
+
+ private static void chemicalReactorRecipes() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.getNumberedAdvancedCircuit(21),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 32L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Sulfur, 8L))
+ .fluidInputs(FluidUtils.getFluidStack("sulfuricacid", 4000))
+ .fluidOutputs(FluidUtils.getFluidStack("sulfuricapatite", 8000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // KOH + HNO3 = KNO3 + H2O
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(GenericChem.mPotassiumHydroxide, 3), CI.getNumberedAdvancedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.PotassiumNitrade, 5L))
+ .fluidInputs(Materials.NitricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // Na2CO3 + 2HNO3 = 2NaNO3 + CO2 + H2O
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mSodiumCarbonate, 6),
+ CI.getNumberedAdvancedCircuit(1))
+ .itemOutputs(MISC_MATERIALS.SODIUM_NITRATE.getDust(10))
+ .fluidInputs(Materials.NitricAcid.getFluid(2000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+ }
+
+ private static void blastFurnaceRecipes() {
+
+ // Synthetic Graphite
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ALLOY.SILICON_CARBIDE.getDust(16), GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Silicon, 8L))
+ .fluidInputs(Materials.Nitrogen.getGas(4000))
+ .fluidOutputs()
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_IV)
+ .metadata(COIL_HEAT, 4500)
+ .addTo(blastFurnaceRecipes);
+
+ }
+
+ private static void compressorRecipes() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Clay, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Clay, 1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatRaw, 9L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, Materials.MeatRaw, 1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.FusionComputer_UV.get(9))
+ .itemOutputs(GregtechItemList.Compressed_Fusion_Reactor.get(1))
+ .duration(1 * HOURS + 50 * MINUTES)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(compressorRecipes);
+ }
+
+ private static void macerationRecipes() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.block, Materials.MeatRaw, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatRaw, 9L))
+ .duration(44 * SECONDS)
+ .eut(4)
+ .addTo(maceratorRecipes);
+
+ if (ItemUtils.simpleMetaStack("chisel:limestone", 0, 1) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("limestone", 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 4L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ }
+ }
+
+ private static void cyclotronRecipes() {
+
+ // Polonium
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1),
+ FluidUtils.getFluidStack("molten.bismuth", 1),
+ new ItemStack[] { GregtechItemList.Pellet_RTG_PO210.get(1) },
+ null,
+ new int[] { 100 },
+ 20 * 300 * 100,
+ 2040 * 4,
+ 500 * 20);
+
+ // Americium
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1),
+ FluidUtils.getFluidStack("molten.americium", 1),
+ new ItemStack[] { GregtechItemList.Pellet_RTG_AM241.get(4) },
+ null,
+ new int[] { 2500 },
+ 20 * 300 * 100,
+ 1020 * 4,
+ 500 * 20); // PO Special Value
+
+ // Strontium u235
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1),
+ FluidUtils.getFluidStack("molten.uranium235", 10),
+ new ItemStack[] { GregtechItemList.Pellet_RTG_SR90.get(1) },
+ null,
+ new int[] { 570 },
+ 20 * 300 * 100,
+ 1020 * 4,
+ 500 * 20); // PO Special Value
+
+ // Strontium u233
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1),
+ FluidUtils.getFluidStack("molten.uranium233", 10),
+ new ItemStack[] { GregtechItemList.Pellet_RTG_SR90.get(1) },
+ null,
+ new int[] { 660 },
+ 20 * 300 * 100,
+ 1020 * 4,
+ 500 * 20); // PO Special Value
+
+ // Strontium pu239
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1),
+ FluidUtils.getFluidStack("molten.plutonium", 10),
+ new ItemStack[] { GregtechItemList.Pellet_RTG_SR90.get(1) },
+ null,
+ new int[] { 220 },
+ 20 * 300 * 100,
+ 1020 * 4,
+ 500 * 20); // PO Special Value
+
+ // Plutonium
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1),
+ FluidUtils.getFluidStack("molten.plutonium238", 1),
+ new ItemStack[] { GregtechItemList.Pellet_RTG_PU238.get(2) },
+ null,
+ new int[] { 780 },
+ 20 * 300 * 100,
+ 1020 * 4,
+ 500 * 20); // PO Special Value
+
+ // Neptunium
+ CORE.RA.addCyclotronRecipe(
+ new ItemStack[] { ELEMENT.getInstance().URANIUM238.getDust(1) },
+ FluidUtils.getFluidStack("deuterium", 400),
+ new ItemStack[] { ItemUtils.getSimpleStack(ModItems.dustNeptunium238) },
+ null,
+ new int[] { 500 },
+ 20 * 5,
+ 500 * 4,
+ 500 * 20); // PO Special Value
+
+ /*
+ * Particle Science
+ */
+
+ // Quark Smash
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(3),
+ FluidUtils.getFluidStack("plasma.hydrogen", 100),
+ new ItemStack[] { Particle.getBaseParticle(Particle.UP), Particle.getBaseParticle(Particle.DOWN),
+ Particle.getBaseParticle(Particle.CHARM), Particle.getBaseParticle(Particle.STRANGE),
+ Particle.getBaseParticle(Particle.TOP), Particle.getBaseParticle(Particle.BOTTOM), },
+ null,
+ new int[] { 50, 50, 50, 50, 50, 50 },
+ 20 * 300 * 9,
+ (int) MaterialUtils.getVoltageForTier(7),
+ 750 * 20);
+
+ // Lepton Smash
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(6),
+ FluidUtils.getFluidStack("plasma.helium", 1500),
+ new ItemStack[] { Particle.getBaseParticle(Particle.ELECTRON), Particle.getBaseParticle(Particle.MUON),
+ Particle.getBaseParticle(Particle.TAU), Particle.getBaseParticle(Particle.ELECTRON_NEUTRINO),
+ Particle.getBaseParticle(Particle.MUON_NEUTRINO), Particle.getBaseParticle(Particle.TAU_NEUTRINO), },
+ null,
+ new int[] { 600, 40, 20, 15, 10, 5 },
+ 20 * 300 * 8,
+ (int) MaterialUtils.getVoltageForTier(7),
+ 750 * 20);
+
+ // Boson Smash
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(9),
+ FluidUtils.getFluidStack("plasma.helium", 1500),
+ new ItemStack[] { Particle.getBaseParticle(Particle.GLUON), Particle.getBaseParticle(Particle.PHOTON),
+ Particle.getBaseParticle(Particle.Z_BOSON), Particle.getBaseParticle(Particle.W_BOSON),
+ Particle.getBaseParticle(Particle.HIGGS_BOSON), },
+ null,
+ new int[] { 160, 260, 150, 150, 1 },
+ 20 * 300 * 6,
+ (int) MaterialUtils.getVoltageForTier(7),
+ 750 * 20);
+
+ // Mixed Smash 1
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(12),
+ Materials.Americium.getPlasma(2500),
+ new ItemStack[] { Particle.getBaseParticle(Particle.GRAVITON), Particle.getBaseParticle(Particle.ETA_MESON),
+ Particle.getBaseParticle(Particle.PION), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.NEUTRON), Particle.getBaseParticle(Particle.LAMBDA),
+ Particle.getBaseParticle(Particle.OMEGA), Particle.getBaseParticle(Particle.HIGGS_BOSON), },
+ null,
+ new int[] { 50, 50, 50, 40, 30, 20, 20, 10 },
+ 1000 * 20,
+ (int) MaterialUtils.getVoltageForTier(8),
+ 750 * 20);
+
+ // Mixed Smash 1
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(12),
+ new FluidStack(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getPlasma(), 2500),
+ new ItemStack[] { Particle.getBaseParticle(Particle.GRAVITON), Particle.getBaseParticle(Particle.ETA_MESON),
+ Particle.getBaseParticle(Particle.PION), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.NEUTRON), Particle.getBaseParticle(Particle.LAMBDA),
+ Particle.getBaseParticle(Particle.OMEGA), Particle.getBaseParticle(Particle.HIGGS_BOSON), },
+ null,
+ new int[] { 5000, 200, 200, 100, 80, 60, 40, 30 },
+ 100 * 20,
+ (int) MaterialUtils.getVoltageForTier(8),
+ 750 * 20);
+
+ // Graviton Smash
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(15),
+ FluidUtils.getFluidStack("plasma.hydrogen", 100),
+ new ItemStack[] { Particle.getBaseParticle(Particle.GRAVITON), Particle.getBaseParticle(Particle.UNKNOWN) },
+ null,
+ new int[] { 1000, 100 },
+ 20 * (90),
+ (int) MaterialUtils.getVoltageForTier(6),
+ 1000 * 20);
+
+ FluidStack aPlasma = Materials.Duranium.getMolten(40);
+ FluidStack aPlasma_NULL = Materials._NULL.getPlasma(1);
+
+ if (aPlasma == null || aPlasma.isFluidEqual(aPlasma_NULL)) {
+ aPlasma = Materials.Americium.getMolten(20);
+ }
+
+ // Quantum Anomaly
+ CORE.RA.addCyclotronRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(24), Particle.getBaseParticle(Particle.UNKNOWN), },
+ aPlasma,
+ new ItemStack[] { GregtechItemList.Laser_Lens_Special.get(1) },
+ null,
+ new int[] { 100 },
+ 20 * (25),
+ (int) MaterialUtils.getVoltageForTier(8),
+ 500 * 20);
+
+ /*
+ * Ions
+ */
+
+ int IonCount = 2;
+ int tenCountA = 2;
+ int tenCountB = 0;
+ for (String y : IonParticles.MetaToNameMap.values()) {
+ if (y.toLowerCase()
+ .contains("hydrogen")) {
+ continue;
+ }
+ FluidStack aPlasma2 = FluidUtils.getFluidStack("plasma." + y.toLowerCase(), 2);
+ Materials aTestMat = MaterialUtils.getMaterial(y);
+ FluidStack aPlasma3 = aTestMat != null ? aTestMat.getPlasma(2) : aPlasma2;
+
+ // Ionize Plasma
+ if ((aPlasma2 != null && !aPlasma2.isFluidEqual(aPlasma_NULL))
+ || (aPlasma3 != null && !aPlasma3.isFluidEqual(aPlasma_NULL))) {
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(1 + (tenCountA - 1)),
+ aPlasma2 != null ? aPlasma2 : aPlasma3,
+ new ItemStack[] { Particle.getIon(y, 1), Particle.getIon(y, 2), Particle.getIon(y, 3),
+ Particle.getIon(y, -1), Particle.getIon(y, -2), Particle.getIon(y, -3), Particle.getIon(y, 1),
+ Particle.getIon(y, 2), Particle.getIon(y, -1), },
+ null,
+ new int[] { 275, 250, 225, 275, 250, 225, 275, 250, 275 },
+ 20 * 20 * (IonCount++) * tenCountA,
+ (int) MaterialUtils.getVoltageForTier(7),
+ 1500 * 20 * tenCountA);
+ } else {
+ Logger.INFO("Plasma for " + y + " does not exist, please report this to Alkalus.");
+ }
+
+ if (tenCountB == 12) {
+ tenCountB = 0;
+ tenCountA++;
+ } else {
+ tenCountB++;
+ }
+ }
+
+ // Generate Hydrogen Ion Recipe
+ CORE.RA.addCyclotronRecipe(
+ CI.getNumberedCircuit(24),
+ FluidUtils.getWildcardFluidStack("hydrogen", 1000),
+ new ItemStack[] { Particle.getIon("Hydrogen", 1), Particle.getIon("Hydrogen", 2),
+ Particle.getIon("Hydrogen", 3), Particle.getIon("Hydrogen", 1), Particle.getIon("Hydrogen", 2),
+ Particle.getIon("Hydrogen", 3), Particle.getIon("Hydrogen", -1), Particle.getIon("Hydrogen", -2),
+ Particle.getIon("Hydrogen", -3) },
+ null,
+ new int[] { 500, 500, 500, 500, 500, 500, 500, 500, 500 },
+ 20 * 20,
+ (int) MaterialUtils.getVoltageForTier(6),
+ 2500);
+
+ // Generate Hydrogen Plasma Recipe
+ CORE.RA.addCyclotronRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(21), Particle.getIon("Hydrogen", 0), },
+ FluidUtils.getFluidStack("hydrogen", 1000),
+ new ItemStack[] { Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.NEUTRON),
+ Particle.getBaseParticle(Particle.ELECTRON), Particle.getBaseParticle(Particle.UNKNOWN),
+ Particle.getBaseParticle(Particle.UNKNOWN), Particle.getBaseParticle(Particle.UNKNOWN), },
+ FluidUtils.getFluidStack("plasma.hydrogen", 100),
+ new int[] { 1250, 1250, 1250, 750, 750, 750 },
+ 20 * 60 * 2,
+ (int) MaterialUtils.getVoltageForTier(6),
+ 750 * 20);
+
+ // Generate Protons Easily
+ CORE.RA.addCyclotronRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(20), Particle.getIon("Hydrogen", 0) },
+ FluidUtils.getWildcardFluidStack("hydrogen", 100),
+ new ItemStack[] { Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), },
+ null,
+ new int[] { 750, 750, 750, 750, 750, 750, 750, 750, 750 },
+ 20 * 20,
+ (int) MaterialUtils.getVoltageForTier(6),
+ 1500);
+
+ CORE.RA.addCyclotronRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(22), Particle.getBaseParticle(Particle.UNKNOWN), },
+ FluidUtils.getWildcardFluidStack("hydrogen", 100),
+ new ItemStack[] { Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.PROTON),
+ Particle.getBaseParticle(Particle.PROTON), },
+ null,
+ new int[] { 375, 375, 375, 375, 375, 375, 375, 375, 375 },
+ 20 * 20,
+ (int) MaterialUtils.getVoltageForTier(6),
+ 1500);
+
+ // Create Strange Dust
+ CORE.RA.addCyclotronRecipe(
+ new ItemStack[] { ELEMENT.getInstance().PLUTONIUM238.getDust(1), Particle.getBaseParticle(Particle.UNKNOWN),
+ Particle.getBaseParticle(Particle.UNKNOWN), Particle.getBaseParticle(Particle.UNKNOWN),
+ Particle.getBaseParticle(Particle.UNKNOWN), Particle.getBaseParticle(Particle.UNKNOWN),
+ Particle.getBaseParticle(Particle.UNKNOWN), Particle.getBaseParticle(Particle.UNKNOWN),
+ Particle.getBaseParticle(Particle.UNKNOWN), },
+ FluidUtils.getFluidStack(FluidUtils.getWildcardFluidStack("ender", 1000), 1000),
+ new ItemStack[] { ORES.DEEP_EARTH_REACTOR_FUEL_DEPOSIT.getDust(1) },
+ null,
+ new int[] { 2500 },
+ 20 * 60 * 15,
+ (int) MaterialUtils.getVoltageForTier(7),
+ 250);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_General.java b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_General.java
new file mode 100644
index 0000000000..5e198bfac4
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_General.java
@@ -0,0 +1,475 @@
+package gtPlusPlus.core.recipe;
+
+import static gregtech.api.enums.Mods.EnderIO;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gtPlusPlus.core.recipe.common.CI.bitsd;
+import static gtPlusPlus.core.util.minecraft.ItemUtils.getSimpleStack;
+import static gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechConduits.generatePipeRecipes;
+import static gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechConduits.generateWireRecipes;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+import gtPlusPlus.xmod.gregtech.common.helpers.VolumetricFlaskHelper;
+
+public class RECIPES_General {
+
+ static final ItemStack NULL = null;
+ static ItemStack RECIPE_Paper;
+ static ItemStack RECIPE_Dirt;
+ static ItemStack RECIPE_Snow;
+ static ItemStack RECIPE_Obsidian;
+ static String RECIPE_LapisDust = "dustLazurite";
+ static ItemStack OUTPUT_Blueprint;
+ static ItemStack RECIPE_CraftingTable;
+ static ItemStack RECIPE_BasicCasingIC2;
+
+ public static void loadRecipes() {
+ RECIPE_Paper = ItemUtils.getSimpleStack(Items.paper);
+ RECIPE_Dirt = ItemUtils.getSimpleStack(Blocks.dirt);
+ RECIPE_Snow = ItemUtils.getSimpleStack(Blocks.snow);
+ RECIPE_Obsidian = ItemUtils.getSimpleStack(Blocks.obsidian);
+ RECIPE_CraftingTable = ItemUtils.getSimpleStack(Blocks.crafting_table);
+ RECIPE_BasicCasingIC2 = ItemUtils.getItemStackFromFQRN("IC2:blockMachine", 1);
+ OUTPUT_Blueprint = ItemUtils.getSimpleStack(ModItems.itemBlueprintBase, 2);
+ run();
+ addCompressedObsidian();
+ migratedRecipes();
+ }
+
+ private static void run() {
+ // Workbench Blueprint
+ RecipeUtils.addShapedRecipe(
+ RECIPE_Paper,
+ RECIPE_LapisDust,
+ NULL,
+ RECIPE_Paper,
+ RECIPE_LapisDust,
+ NULL,
+ RECIPE_LapisDust,
+ RECIPE_LapisDust,
+ NULL,
+ OUTPUT_Blueprint);
+
+ // Rainforest oak Sapling
+ if (RecipeUtils.addShapedRecipe(
+ "stickWood",
+ "stickWood",
+ "stickWood",
+ "stickWood",
+ "treeSapling",
+ "stickWood",
+ "stickWood",
+ "dustBone",
+ "stickWood",
+ ItemUtils.getSimpleStack(BOP_Block_Registrator.sapling_Rainforest))) {
+ Logger.INFO("Added a recipe for Rainforest oak Saplings.");
+ }
+
+ // Iron bars
+ final ItemStack ironBars = ItemUtils.getItemStackFromFQRN("dreamcraft:item.SteelBars", 1);
+
+ // Fish Trap
+ if (RecipeUtils.addShapedRecipe(
+ ironBars,
+ ironBars,
+ ironBars,
+ ironBars,
+ "frameGtWroughtIron",
+ ironBars,
+ ironBars,
+ ironBars,
+ ironBars,
+ ItemUtils.getSimpleStack(ModBlocks.blockFishTrap))) {
+ Logger.INFO("Added a recipe for the Fish Trap.");
+ }
+
+ // Potin
+ if (RecipeUtils.addShapelessGregtechRecipe(
+ new Object[] { "dustLead", "dustBronze", "dustTin", "dustLead", "dustBronze" },
+ ALLOY.POTIN.getDust(5))) {
+ Logger.INFO("Added shapeless recipe for Potin Dust.");
+ }
+
+ // Tumbaga
+ if (RecipeUtils.addShapelessGregtechRecipe(
+ new Object[] { "dustGold", "dustGold", "dustCopper" },
+ ItemUtils.getSimpleStack(ModItems.dustTumbagaMix))) {
+ Logger.INFO("Added shapeless recipe for Tumbaga Mix.");
+ }
+ if (RecipeUtils.addShapelessGregtechRecipe(
+ new Object[] { ItemUtils.getSimpleStack(ModItems.dustTumbagaMix),
+ ItemUtils.getSimpleStack(ModItems.dustTumbagaMix), ItemUtils.getSimpleStack(ModItems.dustTumbagaMix),
+ "dustGold" },
+ ALLOY.TUMBAGA.getDust(10))) {
+ Logger.INFO("Added shapeless recipe for Tumbaga Dust.");
+ }
+
+ if (CORE.ConfigSwitches.enableMachine_Pollution) {
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolFile,
+ "plateIron",
+ "stickIron",
+ "plateIron",
+ "ringIron",
+ "plateIron",
+ "stickIron",
+ "plateIron",
+ CI.craftingToolHammer_Hard,
+ ItemUtils.simpleMetaStack(ModItems.itemBasicTurbine, 0, 1));
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolFile,
+ "plateBronze",
+ "stickBronze",
+ "plateBronze",
+ "ringBronze",
+ "plateBronze",
+ "stickBronze",
+ "plateBronze",
+ CI.craftingToolHammer_Hard,
+ ItemUtils.simpleMetaStack(ModItems.itemBasicTurbine, 1, 1));
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolFile,
+ "plateSteel",
+ "stickSteel",
+ "plateSteel",
+ "ringSteel",
+ "plateSteel",
+ "stickSteel",
+ "plateSteel",
+ CI.craftingToolHammer_Hard,
+ ItemUtils.simpleMetaStack(ModItems.itemBasicTurbine, 2, 1));
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(Blocks.glass, 16),
+ ItemUtils.getSimpleStack(Blocks.glowstone, 16),
+ ItemList.Large_Fluid_Cell_Steel.get(1),
+ CI.getNumberedAdvancedCircuit(4))
+ .itemOutputs(VolumetricFlaskHelper.getLargeVolumetricFlask(2))
+ .fluidInputs(FluidUtils.getFluidStack("molten.borosilicateglass", 2000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(Blocks.glass, 64),
+ ItemUtils.getSimpleStack(Blocks.glowstone, 64),
+ ItemList.Large_Fluid_Cell_TungstenSteel.get(1),
+ CI.getNumberedAdvancedCircuit(5))
+ .itemOutputs(VolumetricFlaskHelper.getGiganticVolumetricFlask(2))
+ .fluidInputs(FluidUtils.getFluidStack("molten.borosilicateglass", 8000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ // Mining Explosive
+ Logger.RECIPE("[Inspection] Explosives");
+ if (RecipeUtils.addShapedRecipe(
+ CI.explosiveITNT,
+ CI.explosiveTNT,
+ CI.explosiveITNT,
+ CI.explosiveTNT,
+ "frameGtIron",
+ CI.explosiveTNT,
+ "dustSulfur",
+ CI.explosiveTNT,
+ "dustSulfur",
+ ItemUtils.getSimpleStack(ModBlocks.blockMiningExplosive, 3))) {
+ Logger.INFO("Added a recipe for Mining Explosives.");
+ }
+
+ // Alkalus Coin
+ if (RecipeUtils.addShapedRecipe(
+ "gemExquisiteRuby",
+ "gemFlawlessDiamond",
+ "gemExquisiteDiamond",
+ "gemFlawlessRuby",
+ ItemList.Credit_Greg_Osmium.get(1),
+ "gemFlawlessSapphire",
+ "gemExquisiteEmerald",
+ "gemFlawlessEmerald",
+ "gemExquisiteSapphire",
+ ItemUtils.getSimpleStack(ModItems.itemAlkalusDisk))) {
+ Logger.INFO("Added a recipe for The Alkalus Disk.");
+ }
+
+ /*
+ * final String fancyGems[] = new String[]{"gemExquisiteDiamond", "gemExquisiteEmerald", "gemExquisiteRuby",
+ * "gemExquisiteSapphire"}; final ItemStack gemShards[] = new
+ * ItemStack[]{ItemUtils.simpleMetaStack(ModItems.itemGemShards, 0, 1),
+ * ItemUtils.simpleMetaStack(ModItems.itemGemShards, 1, 1), ItemUtils.simpleMetaStack(ModItems.itemGemShards, 2,
+ * 1), ItemUtils.simpleMetaStack(ModItems.itemGemShards, 3, 1)}; int l=0; for (final String gem : fancyGems){
+ * GameRegistry.addShapelessRecipe( gemShards[l], ItemUtils.getItemStackOfAmountFromOreDict(gem, 1), new
+ * ItemStack(ModItems.itemAlkalusDisk, 1, OreDictionary.WILDCARD_VALUE)); l++; }
+ */
+
+ Logger.RECIPE("[Inspection] Wither Cage");
+ if (RecipeUtils.addShapedRecipe(
+ "stickBlackSteel",
+ "plateTungstenSteel",
+ "stickBlackSteel",
+ "plateTungstenSteel",
+ getSimpleStack(Items.nether_star),
+ "plateTungstenSteel",
+ "stickBlackSteel",
+ "plateTungstenSteel",
+ "stickBlackSteel",
+ ItemUtils.getSimpleStack(ModBlocks.blockWitherGuard, 32))) {
+ Logger.INFO("Added a recipe for Wither Cages.");
+ }
+
+ // Magic Feather
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(Items.feather, 64),
+ ItemUtils.getSimpleStack(Blocks.emerald_block, 32),
+ ItemUtils.getSimpleStack(Blocks.diamond_block, 32),
+ Materials.Ruby.getBlocks(32),
+ Materials.Sapphire.getBlocks(32),
+ ItemUtils.getSimpleStack(Blocks.gold_block, 32))
+ .itemOutputs(ItemUtils.getSimpleStack(ModItems.itemMagicFeather, 1))
+ .fluidInputs(Materials.Silver.getMolten(32 * 144))
+ .duration(2 * MINUTES)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ // Pest Killer
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.getTieredMachineCasing(1),
+ CI.getElectricPump(2, 1),
+ CI.getPlate(2, 4),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(0), 2),
+ CI.getNumberedCircuit(16))
+ .itemOutputs(ItemUtils.getSimpleStack(ModBlocks.blockPestKiller))
+ .fluidInputs(FluidUtils.getHotWater(500))
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_LV / 2)
+ .addTo(assemblerRecipes);
+ }
+
+ private static boolean addCompressedObsidian() {
+ // Invert Obsidian
+ ItemStack aInvertedObsidian = ItemUtils.simpleMetaStack(ModBlocks.blockCompressedObsidian, 5, 1);
+ if (RecipeUtils.addShapedRecipe(
+ getSimpleStack(Items.redstone),
+ getSimpleStack(Items.glowstone_dust),
+ getSimpleStack(Items.redstone),
+ getSimpleStack(Items.glowstone_dust),
+ ItemUtils.simpleMetaStack(ModBlocks.blockCompressedObsidian, 1, 1),
+ getSimpleStack(Items.glowstone_dust),
+ getSimpleStack(Items.redstone),
+ getSimpleStack(Items.glowstone_dust),
+ getSimpleStack(Items.redstone),
+ aInvertedObsidian)) {
+ Logger.INFO("Added a recipe for Inverted Obsidian.");
+ }
+
+ final ItemStack[] mItems = new ItemStack[6];
+ mItems[0] = ItemUtils.getSimpleStack(Blocks.obsidian);
+ for (int r = 0; r < 5; r++) {
+ mItems[r + 1] = ItemUtils.simpleMetaStack(ModBlocks.blockCompressedObsidian, r, 1);
+ }
+
+ final ItemStack[] mItems2 = new ItemStack[6];
+ mItems2[0] = ItemUtils.getSimpleStack(Blocks.glowstone);
+ for (int r = 0; r < 5; r++) {
+ mItems2[r + 1] = ItemUtils.simpleMetaStack(ModBlocks.blockCompressedObsidian, 6 + r, 1);
+ }
+
+ // Compressed Obsidian 1-5
+ for (int r = 0; r < 5; r++) {
+
+ final ItemStack input = mItems[r];
+ final ItemStack output = mItems[r + 1];
+
+ if (RecipeUtils.addShapedRecipe(input, input, input, input, input, input, input, input, input, output)) {
+ Logger.INFO("Added a recipe for Compressed Obsidian [" + r + "]");
+ }
+
+ if (RecipeUtils
+ .addShapelessGregtechRecipe(new ItemStack[] { output }, ItemUtils.getSimpleStack(input, 9))) {
+ Logger.INFO("Added a shapeless recipe for Compressed Obsidian [" + r + "]");
+ }
+ }
+
+ // Compressed Glowstone 1-5
+ for (int r = 0; r < 5; r++) {
+
+ final ItemStack input = mItems2[r];
+ final ItemStack output = mItems2[r + 1];
+
+ if (RecipeUtils.addShapedRecipe(
+ input,
+ input,
+ input,
+ input,
+ r == 2 ? aInvertedObsidian : input,
+ input,
+ input,
+ input,
+ input,
+ output)) {
+ Logger.INFO("Added a recipe for Compressed Glowstone [" + r + "]");
+ }
+
+ if (RecipeUtils
+ .addShapelessGregtechRecipe(new ItemStack[] { output }, ItemUtils.getSimpleStack(input, 9))) {
+ Logger.INFO("Added a shapeless recipe for Compressed Glowstone [" + r + "]");
+ }
+ }
+ return true;
+ }
+
+ private static void migratedRecipes() {
+
+ RecipeUtils.generateMortarRecipe(
+ ItemUtils.getSimpleStack(ModItems.itemPlateRawMeat),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustMeatRaw", 1));
+
+ generateWireRecipes(ELEMENT.getInstance().ZIRCONIUM);
+ generateWireRecipes(ALLOY.HG1223);
+ generateWireRecipes(ALLOY.LEAGRISIUM);
+ generateWireRecipes(ALLOY.TRINIUM_TITANIUM);
+ generateWireRecipes(ELEMENT.STANDALONE.HYPOGEN);
+ generateWireRecipes(ELEMENT.STANDALONE.CHRONOMATIC_GLASS);
+
+ // No Material for void, natch.
+ if (Thaumcraft.isModLoaded()) {
+ generatePipeRecipes(GT_Materials.Void.mDefaultLocalName, GT_Materials.Void.getMass(), 16);
+ }
+
+ Material[] gtpp = new Material[] { ALLOY.STABALLOY, ALLOY.TANTALLOY_60, ALLOY.TANTALLOY_61, ALLOY.POTIN,
+ ALLOY.MARAGING300, ALLOY.MARAGING350, ALLOY.INCONEL_690, ALLOY.INCONEL_792, ALLOY.HASTELLOY_X,
+ ALLOY.TRINIUM_NAQUADAH_CARBON };
+
+ for (Material mat : gtpp) {
+ // generatePipeRecipes multiplies the voltage multiplier by 8 because ??! reasons.
+ generatePipeRecipes(mat.getLocalizedName(), mat.getMass(), mat.vVoltageMultiplier / 8);
+ }
+
+ Materials[] h = new Materials[] { Materials.Europium, Materials.Tungsten, Materials.DarkSteel, Materials.Clay,
+ Materials.Lead, };
+
+ for (Materials e : h) {
+ if (e == Materials.DarkSteel) {
+ if (!EnderIO.isModLoaded()) {
+ continue;
+ }
+ }
+ int tVoltageMultiplier = (e.mBlastFurnaceTemp >= 2800) ? 64 : 16;
+ generatePipeRecipes(e.mDefaultLocalName, e.getMass(), tVoltageMultiplier);
+ }
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[6],
+ ALLOY.MARAGING250.getGear(1),
+ CI.component_Plate[6],
+ CI.getTieredCircuitOreDictName(4),
+ GregtechItemList.Casing_AdvancedVacuum.get(1),
+ CI.getTieredCircuitOreDictName(4),
+ CI.component_Plate[5],
+ ItemList.Hatch_Input_IV.get(1),
+ CI.component_Plate[5],
+ GregtechItemList.Hatch_Input_Cryotheum.get(1L));
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[6],
+ ALLOY.MARAGING300.getGear(1),
+ CI.component_Plate[6],
+ CI.getTieredCircuitOreDictName(5),
+ GregtechItemList.Casing_Adv_BlastFurnace.get(1),
+ CI.getTieredCircuitOreDictName(5),
+ CI.component_Plate[6],
+ ItemList.Hatch_Input_IV.get(1),
+ CI.component_Plate[6],
+ GregtechItemList.Hatch_Input_Pyrotheum.get(1L));
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[8],
+ ALLOY.PIKYONIUM.getGear(1),
+ CI.component_Plate[9],
+ CI.getTieredCircuitOreDictName(7),
+ GregtechItemList.Casing_Naq_Reactor_A.get(1),
+ CI.getTieredCircuitOreDictName(7),
+ CI.component_Plate[9],
+ ItemList.Hatch_Input_ZPM.get(1),
+ CI.component_Plate[8],
+ GregtechItemList.Hatch_Input_Naquadah.get(1L, new Object[0]));
+
+ if (PollutionUtils.isPollutionEnabled()) {
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_LV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_LV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_LV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_MV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_MV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_MV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_HV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_HV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_HV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_EV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_EV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_EV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_IV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_IV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_IV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_LuV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_LuV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_LuV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_ZPM.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_ZPM.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_ZPM.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_UV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_UV.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_UV.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Muffler_Adv_MAX.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "M", "P", Character.valueOf('M'), ItemList.Hatch_Muffler_MAX.get(1),
+ Character.valueOf('P'), GregtechItemList.Pollution_Cleaner_MAX.get(1) });
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_LaserEngraver.java b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_LaserEngraver.java
new file mode 100644
index 0000000000..1f8d5d9a8e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_LaserEngraver.java
@@ -0,0 +1,135 @@
+package gtPlusPlus.core.recipe;
+
+import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.HOURS;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OreDictNames;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.interfaces.IOreRecipeRegistrator;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+
+public class RECIPES_LaserEngraver implements IOreRecipeRegistrator {
+
+ public RECIPES_LaserEngraver() {
+ OrePrefixes.crafting.add(this);
+ }
+
+ @Override
+ public void registerOre(final OrePrefixes aPrefix, final Materials aMaterial, final String aOreDictName,
+ final String aModName, final ItemStack aStack) {
+ if (aOreDictName.equals(OreDictNames.craftingLensWhite.toString())) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Lithium, 2L),
+ GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(ItemUtils.getItemStackOfAmountFromOreDict("plateDoubleLithium7", 1))
+ .duration(4 * MINUTES)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 3L),
+ GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(ItemUtils.getItemStackOfAmountFromOreDict("dustLithium7", 1))
+ .duration(2 * MINUTES)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ } else if (aOreDictName.equals(OreDictNames.craftingLensLime.toString())) {
+ // Coil Wires
+ ItemStack coilWire1 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemDehydratorCoilWire", "coilWire1", 0, 1);
+ ItemStack coilWire2 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemDehydratorCoilWire:1", "coilWire2", 1, 1);
+ ItemStack coilWire3 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemDehydratorCoilWire:2", "coilWire3", 2, 1);
+ ItemStack coilWire4 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemDehydratorCoilWire:3", "coilWire4", 3, 1);
+
+ // Simple Life
+ String wire = "wireGt02";
+
+ // Wires to Laser
+ ItemStack wireT1a = ItemUtils.getItemStackOfAmountFromOreDict(wire + "Aluminium", 1);
+ ItemStack wireT1b = ItemUtils.getItemStackOfAmountFromOreDict(wire + "Nichrome", 1);
+ ItemStack wireT2a = ItemUtils.getItemStackOfAmountFromOreDict(wire + "Osmium", 1);
+ ItemStack wireT2b = ItemUtils.getItemStackOfAmountFromOreDict(wire + "Platinum", 1);
+ ItemStack wireT3a = ItemUtils.getItemStackOfAmountFromOreDict(wire + "VanadiumGallium", 1);
+ ItemStack wireT3b = ItemUtils.getItemStackOfAmountFromOreDict(wire + "YttriumBariumCuprate", 1);
+ ItemStack wireT3c = ItemUtils.getItemStackOfAmountFromOreDict(wire + "NiobiumTitanium", 1);
+ ItemStack wireT4a = ItemUtils.getItemStackOfAmountFromOreDict(wire + "Naquadah", 1);
+
+ // T1
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT1a, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire1)
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(laserEngraverRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT1b, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire1)
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(laserEngraverRecipes);
+ // T2
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT2a, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire2)
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT2b, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire2)
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+ // T3
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT3a, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire3)
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT3b, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire3)
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT3c, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire3)
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+ // T4
+ GT_Values.RA.stdBuilder()
+ .itemInputs(wireT4a, GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(coilWire4)
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(laserEngraverRecipes);
+
+ } else if (aOreDictName.equals(OreDictNames.craftingLensOrange.toString())) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(ModItems.itemAlkalusDisk), GT_Utility.copyAmount(0L, aStack))
+ .itemOutputs(ItemUtils.getSimpleStack(Dimension_Everglades.portalItem))
+ .duration(3 * HOURS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_MachineComponents.java b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_MachineComponents.java
new file mode 100644
index 0000000000..4929872caa
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_MachineComponents.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.core.recipe;
+
+public class RECIPES_MachineComponents {
+
+ // Fluid Pipe
+ public static String pipeTier7 = "pipeHugeSteel";
+ public static String pipeTier8 = "pipeHugeStainlessSteel";
+ public static String pipeTier9 = "pipeHugeTitanium";
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_Machines.java b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_Machines.java
new file mode 100644
index 0000000000..2f9e347b52
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_Machines.java
@@ -0,0 +1,2960 @@
+package gtPlusPlus.core.recipe;
+
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.EternalSingularity;
+import static gregtech.api.enums.Mods.GoodGenerator;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.enums.Mods.RemoteIO;
+
+import java.util.List;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import com.github.technus.tectech.recipe.TT_recipeAdder;
+import com.github.technus.tectech.thing.CustomItemList;
+import com.google.common.collect.ImmutableList;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.item.crafting.ItemDummyResearch;
+import gtPlusPlus.core.item.crafting.ItemDummyResearch.ASSEMBLY_LINE_RESEARCH;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.covers.CoverManager;
+import gtPlusPlus.xmod.gregtech.common.helpers.VolumetricFlaskHelper;
+
+public class RECIPES_Machines {
+
+ // Outputs
+ public static ItemStack RECIPE_Buffer_ULV = GregtechItemList.Energy_Buffer_1by1_ULV.get(1);
+ public static ItemStack RECIPE_Buffer_LV = GregtechItemList.Energy_Buffer_1by1_LV.get(1);
+ public static ItemStack RECIPE_Buffer_MV = GregtechItemList.Energy_Buffer_1by1_MV.get(1);
+ public static ItemStack RECIPE_Buffer_HV = GregtechItemList.Energy_Buffer_1by1_HV.get(1);
+ public static ItemStack RECIPE_Buffer_EV = GregtechItemList.Energy_Buffer_1by1_EV.get(1);
+ public static ItemStack RECIPE_Buffer_IV = GregtechItemList.Energy_Buffer_1by1_IV.get(1);
+ public static ItemStack RECIPE_Buffer_LuV = GregtechItemList.Energy_Buffer_1by1_LuV.get(1);
+ public static ItemStack RECIPE_Buffer_ZPM = GregtechItemList.Energy_Buffer_1by1_ZPM.get(1);
+ public static ItemStack RECIPE_Buffer_UV = GregtechItemList.Energy_Buffer_1by1_UV.get(1);
+ public static ItemStack RECIPE_Buffer_MAX = GregtechItemList.Energy_Buffer_1by1_MAX.get(1);
+ // Industrial Centrifuge
+ public static ItemStack RECIPE_IndustrialCentrifugeController;
+ public static ItemStack RECIPE_IndustrialCentrifugeCasing;
+ // Industrial Coke Oven
+ public static ItemStack RECIPE_IndustrialCokeOvenController;
+ public static ItemStack RECIPE_IndustrialCokeOvenFrame;
+ public static ItemStack RECIPE_IndustrialCokeOvenCasingA;
+ public static ItemStack RECIPE_IndustrialCokeOvenCasingB;
+ // Industrial Electrolyzer
+ public static ItemStack RECIPE_IndustrialElectrolyzerController;
+ public static ItemStack RECIPE_IndustrialElectrolyzerFrame;
+ // Industrial Material Press
+ public static ItemStack RECIPE_IndustrialMaterialPressController;
+ public static ItemStack RECIPE_IndustrialMaterialPressFrame;
+ // Industrial Maceration Stack
+ public static ItemStack RECIPE_IndustrialMacerationStackController;
+ public static ItemStack RECIPE_IndustrialMacerationStackFrame;
+ // Industrial Wire Factory
+ public static ItemStack RECIPE_IndustrialWireFactoryController;
+ public static ItemStack RECIPE_IndustrialWireFactoryFrame;
+ // Industrial Multi Tank
+ public static ItemStack RECIPE_IndustrialMultiTankController;
+ public static ItemStack RECIPE_IndustrialMultiTankFrame;
+ // Industrial Matter Fabricator
+ public static ItemStack RECIPE_IndustrialMatterFabController;
+ public static ItemStack RECIPE_IndustrialMatterFabFrame;
+ public static ItemStack RECIPE_IndustrialMatterFabCoil;
+ // Industrial Blast Smelter
+ public static ItemStack RECIPE_IndustrialBlastSmelterController;
+ public static ItemStack RECIPE_IndustrialBlastSmelterFrame;
+ public static ItemStack RECIPE_IndustrialBlastSmelterCoil;
+ // Industrial Sieve
+ public static ItemStack RECIPE_IndustrialSieveController;
+ public static ItemStack RECIPE_IndustrialSieveFrame;
+ public static ItemStack RECIPE_IndustrialSieveGrate;
+ // Industrial Tree Farmer
+ public static ItemStack RECIPE_TreeFarmController;
+ public static ItemStack RECIPE_TreeFarmFrame;
+ // Tesseracts
+ public static ItemStack RECIPE_TesseractGenerator;
+ public static ItemStack RECIPE_TesseractTerminal;
+ // Thermal Boiler
+ public static ItemStack RECIPE_ThermalBoilerController;
+ public static ItemStack RECIPE_ThermalBoilerCasing;
+
+ // Thorium Reactor
+ public static ItemStack RECIPE_LFTRController;
+ public static ItemStack RECIPE_LFTROuterCasing;
+ public static ItemStack RECIPE_LFTRInnerCasing;
+
+ // Nuclear Salt Processing Plant
+ public static ItemStack RECIPE_SaltPlantController;
+
+ // Cyclotron
+ public static ItemStack RECIPE_CyclotronController;
+ public static ItemStack RECIPE_CyclotronOuterCasing;
+ public static ItemStack RECIPE_CyclotronInnerCoil;
+
+ // Wire
+ public static String cableTier4 = "cableGt04Gold";
+ public static String cableTier6 = "cableGt04Tungsten";
+
+ public static String pipeTier1 = "pipeHuge" + "Clay";
+ public static String pipeTier2 = "pipeHuge" + "Potin";
+ public static String pipeTier3 = "pipeHuge" + "Steel";
+ public static String pipeTier4 = "pipeHuge" + "StainlessSteel";
+ public static String pipeTier7 = "pipeHuge" + "Tantalloy60";
+
+ // EV/IV MACHINES
+ public static ItemStack IV_MACHINE_Electrolyzer;
+ public static ItemStack EV_MACHINE_Centrifuge;
+ public static ItemStack EV_MACHINE_BendingMachine;
+ public static ItemStack IV_MACHINE_Wiremill;
+ public static ItemStack EV_MACHINE_Macerator;
+ public static ItemStack IV_MACHINE_Macerator;
+ public static ItemStack IV_MACHINE_Cutter;
+ public static ItemStack IV_MACHINE_Extruder;
+ public static ItemStack HV_MACHINE_Sifter;
+ public static ItemStack EV_MACHINE_ThermalCentrifuge;
+ public static ItemStack EV_MACHINE_OreWasher;
+ public static ItemStack IV_MACHINE_AlloySmelter;
+ public static ItemStack IV_MACHINE_Mixer;
+ public static ItemStack EV_MACHINE_ChemicalBath;
+
+ // Plates
+ public static String plateBronze = "plateBronze";
+ public static String plateSteel = "plateSteel";
+
+ // Pipes
+ public static String pipeHugeStainlessSteel = "pipeHugeStainlessSteel";
+
+ // Lava Boiler
+ public static ItemStack boiler_Coal;
+ public static ItemStack IC2MFE;
+ public static ItemStack IC2MFSU;
+
+ // Misc
+ public static ItemStack INPUT_RCCokeOvenBlock;
+
+ public static final void loadRecipes() {
+ run();
+ Logger.INFO("Loading Recipes for the Various machine blocks.");
+ }
+
+ private static void run() {
+
+ initModItems();
+ tieredMachineHulls();
+ energyCores();
+ wirelessChargers();
+ largeArcFurnace();
+ industrialVacuumFurnace();
+ fakeMachineCasingCovers();
+ overflowValveCovers();
+ superBuses();
+ distillus();
+ algaeFarm();
+ chemPlant();
+ zyngen();
+ milling();
+ sparging();
+ chisels();
+ rockBreaker();
+ thermicFluidHeater();
+ advHeatExchanger();
+ chiselBuses();
+ solidifierHatches();
+
+ gt4FarmManager();
+ gt4Inventory();
+
+ multiForgeHammer();
+ multiMolecularTransformer();
+ multiXlTurbines();
+ multiSolarTower();
+ multiElementalDuplicator();
+
+ resonanceChambers();
+ modulators();
+ }
+
+ private static void thermicFluidHeater() {
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getPlate(5, 1),
+ CI.circuitTier5,
+ CI.getPlate(5, 1),
+ pipeTier7,
+ ItemList.Machine_IV_FluidHeater.get(1),
+ pipeTier7,
+ CI.getPlate(5, 1),
+ CI.circuitTier4,
+ CI.getPlate(5, 1),
+ GregtechItemList.Controller_IndustrialFluidHeater.get(1));
+ }
+
+ private static void advHeatExchanger() {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Machine_Multi_HeatExchanger.get(1),
+ CI.getDoublePlate(6, 8), CI.getScrew(6, 16), CI.getCircuit(5, 8) },
+ CI.tieredMaterials[5].getMolten(144 * 8),
+ GregtechItemList.XL_HeatExchanger.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(6));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Casing_StableTitanium.get(1),
+ CI.getPlate(5, 4), CI.getScrew(5, 8), },
+ CI.tieredMaterials[5].getMolten(144 * 2),
+ GregtechItemList.Casing_XL_HeatExchanger.get(1),
+ 20 * 5,
+ MaterialUtils.getVoltageForTier(6));
+ }
+
+ private static void gt4FarmManager() {
+
+ ItemList[] aInputHatches = new ItemList[] { ItemList.Hatch_Input_LV, ItemList.Hatch_Input_MV,
+ ItemList.Hatch_Input_HV, ItemList.Hatch_Input_EV, ItemList.Hatch_Input_IV, ItemList.Hatch_Input_LuV,
+ ItemList.Hatch_Input_ZPM, ItemList.Hatch_Input_UV };
+ GregtechItemList[] aOutputMachines = new GregtechItemList[] { GregtechItemList.GT4_Crop_Harvester_LV,
+ GregtechItemList.GT4_Crop_Harvester_MV, GregtechItemList.GT4_Crop_Harvester_HV,
+ GregtechItemList.GT4_Crop_Harvester_EV, GregtechItemList.GT4_Crop_Harvester_IV,
+ GregtechItemList.GT4_Crop_Harvester_LuV, GregtechItemList.GT4_Crop_Harvester_ZPM,
+ GregtechItemList.GT4_Crop_Harvester_UV };
+
+ int aTier = 1;
+ for (int i = 0; i < 8; i++) {
+ RecipeUtils.addShapedRecipe(
+ CI.getRobotArm(aTier, 1),
+ CI.getSensor(aTier, 1),
+ CI.getRobotArm(aTier, 1),
+ ItemUtils.getOrePrefixStack(OrePrefixes.toolHeadSense, CI.tieredMaterials[aTier], 1),
+ CI.getTieredMachineHull(aTier, 1),
+ ItemUtils.getOrePrefixStack(OrePrefixes.toolHeadSense, CI.tieredMaterials[aTier], 1),
+ CI.getTieredCircuitOreDictName(aTier),
+ aInputHatches[i].get(1),
+ CI.getTieredCircuitOreDictName(aTier),
+ aOutputMachines[i].get(1));
+ aTier++;
+ }
+ }
+
+ private static void gt4Inventory() {
+
+ GregtechItemList[] aOutputElectricCraftingTable = new GregtechItemList[] {
+ GregtechItemList.GT4_Electric_Auto_Workbench_LV, GregtechItemList.GT4_Electric_Auto_Workbench_MV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_HV, GregtechItemList.GT4_Electric_Auto_Workbench_EV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_IV, GregtechItemList.GT4_Electric_Auto_Workbench_LuV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_ZPM, GregtechItemList.GT4_Electric_Auto_Workbench_UV };
+
+ int aTier = 1;
+ for (int i = 0; i < 8; i++) {
+ RecipeUtils.addShapedRecipe(
+ ItemUtils.getOrePrefixStack(OrePrefixes.plate, CI.tieredMaterials[aTier], 1),
+ ItemUtils.getSimpleStack(Blocks.crafting_table),
+ ItemUtils.getOrePrefixStack(OrePrefixes.plate, CI.tieredMaterials[aTier], 1),
+ CI.getTieredCircuitOreDictName(aTier),
+ CI.getTieredMachineHull(aTier),
+ CI.getTieredCircuitOreDictName(aTier),
+ ItemUtils.getOrePrefixStack(OrePrefixes.plate, CI.tieredMaterials[aTier], 1),
+ CI.getRobotArm(aTier, 1),
+ ItemUtils.getOrePrefixStack(OrePrefixes.plate, CI.tieredMaterials[aTier], 1),
+ aOutputElectricCraftingTable[i].get(1));
+ aTier++;
+ }
+ }
+
+ private static void multiForgeHammer() {
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(CI.machineHull_IV, 2), ItemList.Machine_IV_Hammer.get(1),
+ CI.getPlate(4, 8), CI.getBolt(5, 32), ELEMENT.getInstance().ZIRCONIUM.getFineWire(32),
+ ItemUtils.getItemStackOfAmountFromOreDict("circuitElite", 4) },
+ CI.getTieredFluid(4, 144 * 12),
+ GregtechItemList.Controller_IndustrialForgeHammer.get(1),
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(5));
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Casing_IndustrialForgeHammer.get(1),
+ CI.bitsd,
+ new Object[] { "IBI", "HCH", "IHI", 'I', CI.getPlate(4, 1), 'B', ALLOY.BABBIT_ALLOY.getPlate(1), 'C',
+ ItemList.Casing_HeatProof.get(1), 'H', ALLOY.HASTELLOY_X.getRod(1) });
+ }
+
+ private static void multiMolecularTransformer() {
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getTieredGTPPMachineCasing(6, 1), CI.getPlate(5, 16), CI.getBolt(5, 32),
+ ALLOY.HG1223.getFineWire(64), CI.getEmitter(4, 8),
+ ItemUtils.getItemStackOfAmountFromOreDict("circuitMaster", 10) },
+ CI.getTieredFluid(5, 144 * 16),
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_11_MOLECULAR_TRANSFORMER, 1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(5));
+
+ CORE.RA.addAssemblylineRecipe(
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_11_MOLECULAR_TRANSFORMER, 1),
+ 20 * 60 * 30,
+ new Object[] { ALLOY.HG1223.getFineWire(64), ALLOY.HG1223.getFineWire(64),
+ ItemList.Electric_Motor_IV.get(16), ItemList.Energy_LapotronicOrb.get(16),
+ CI.getTieredComponent(OrePrefixes.cableGt12, 6, 16), CI.getTieredComponent(OrePrefixes.wireGt16, 5, 32),
+ ALLOY.ZERON_100.getFrameBox(4), ALLOY.ZIRCONIUM_CARBIDE.getPlateDouble(32),
+ ALLOY.BABBIT_ALLOY.getPlate(64), ALLOY.LEAGRISIUM.getGear(8),
+ new Object[] { CI.getTieredCircuitOreDictName(4), 64 },
+ new Object[] { CI.getTieredCircuitOreDictName(5), 32 },
+ new Object[] { CI.getTieredCircuitOreDictName(6), 16 },
+ GregtechItemList.Laser_Lens_WoodsGlass.get(1), },
+ new FluidStack[] { ALLOY.NITINOL_60.getFluidStack(144 * 9 * (2)),
+ ALLOY.INCOLOY_MA956.getFluidStack(144 * 9 * (8)), ALLOY.KANTHAL.getFluidStack(144 * 1 * (4)), },
+ GregtechItemList.Controller_MolecularTransformer.get(1),
+ 20 * 60 * 10 * (1),
+ MaterialUtils.getVoltageForTier(6));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(16), CI.getPlate(6, 4), CI.getScrew(6, 8),
+ ELEMENT.getInstance().PALLADIUM.getFineWire(16), CI.getSensor(5, 2),
+ ItemUtils.getItemStackOfAmountFromOreDict("circuitElite", 4) },
+ CI.getTieredFluid(5, 144 * 4),
+ GregtechItemList.Casing_Molecular_Transformer_1.get(1),
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(5));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(16), CI.getPlate(5, 4), CI.getScrew(5, 8),
+ ItemList.Casing_Coil_Nichrome.get(2), CI.getFieldGenerator(3, 2),
+ ItemUtils.getItemStackOfAmountFromOreDict("circuitData", 8) },
+ CI.getTieredFluid(5, 144 * 4),
+ GregtechItemList.Casing_Molecular_Transformer_2.get(1),
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(5));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(16), ItemUtils.getSimpleStack(Blocks.glowstone, 16),
+ CI.getGear(5, 8), ELEMENT.getInstance().TITANIUM.getWire04(4), CI.getFieldGenerator(4, 2),
+ ItemUtils.getItemStackOfAmountFromOreDict("circuitData", 8) },
+ CI.getTieredFluid(5, 144 * 4),
+ GregtechItemList.Casing_Molecular_Transformer_3.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(5));
+ }
+
+ private static void multiXlTurbines() {
+
+ RecipeUtils.addShapedRecipe(
+ CI.getDoublePlate(4, 1),
+ CI.getElectricMotor(3, 1),
+ CI.getDoublePlate(4, 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellLubricant", 1),
+ ItemList.Casing_Gearbox_Titanium.get(1),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellLubricant", 1),
+ CI.getDoublePlate(4, 1),
+ CI.getElectricMotor(3, 1),
+ CI.getDoublePlate(4, 1),
+ GregtechItemList.Casing_Turbine_Shaft.get(1));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Casing_Turbine.get(1), CI.getPlate(4, 4),
+ CI.getScrew(4, 8), CI.getCircuit(4, 4), CI.getGear(3, 8) },
+ CI.tieredMaterials[3].getMolten(144 * 8),
+ GregtechItemList.Hatch_Turbine_Rotor.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(4));
+
+ // Steam
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Casing_Turbine.get(1), CI.getPlate(3, 4),
+ CI.getScrew(3, 8), },
+ CI.tieredMaterials[2].getMolten(144 * 2),
+ GregtechItemList.Casing_Turbine_LP.get(1),
+ 20 * 5,
+ MaterialUtils.getVoltageForTier(3));
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.LargeSteamTurbine.get(1), CI.getPlate(4, 8),
+ CI.getScrew(4, 16), CI.getGear(4, 4), CI.getCircuit(4, 8) },
+ CI.tieredMaterials[4].getMolten(144 * 8),
+ GregtechItemList.Large_Steam_Turbine.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(4));
+
+ // Gas
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Casing_Turbine1.get(1), CI.getPlate(4, 4),
+ CI.getScrew(4, 8), },
+ CI.tieredMaterials[3].getMolten(144 * 2),
+ GregtechItemList.Casing_Turbine_Gas.get(1),
+ 20 * 5,
+ MaterialUtils.getVoltageForTier(4));
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.LargeGasTurbine.get(1), CI.getPlate(5, 8),
+ CI.getScrew(5, 16), CI.getGear(5, 4), CI.getCircuit(5, 8) },
+ CI.tieredMaterials[5].getMolten(144 * 8),
+ GregtechItemList.Large_Gas_Turbine.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(5));
+
+ // HP Steam
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Casing_Turbine2.get(1), CI.getPlate(5, 4),
+ CI.getScrew(5, 8), },
+ CI.tieredMaterials[4].getMolten(144 * 2),
+ GregtechItemList.Casing_Turbine_HP.get(1),
+ 20 * 5,
+ MaterialUtils.getVoltageForTier(5));
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.LargeHPSteamTurbine.get(1), CI.getPlate(6, 8),
+ CI.getScrew(6, 16), CI.getGear(6, 4), CI.getCircuit(6, 8) },
+ CI.tieredMaterials[6].getMolten(144 * 8),
+ GregtechItemList.Large_HPSteam_Turbine.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Plasma
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.Casing_Turbine3.get(1), CI.getPlate(6, 4),
+ CI.getScrew(6, 8), },
+ CI.tieredMaterials[5].getMolten(144 * 2),
+ GregtechItemList.Casing_Turbine_Plasma.get(1),
+ 20 * 5,
+ MaterialUtils.getVoltageForTier(6));
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18), ItemList.LargePlasmaTurbine.get(1), CI.getPlate(7, 8),
+ CI.getScrew(7, 16), CI.getGear(7, 4), CI.getCircuit(7, 8) },
+ CI.tieredMaterials[7].getMolten(144 * 8),
+ GregtechItemList.Large_Plasma_Turbine.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(7));
+ if (GoodGenerator.isModLoaded()) {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18),
+ GT_ModHandler.getModItem(GoodGenerator.ID, "supercriticalFluidTurbineCasing", 1),
+ GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedplate", 4, 10101),
+ GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedscrew", 8, 10101) },
+ FluidRegistry.getFluidStack("molten.adamantium alloy", 144 * 2),
+ GregtechItemList.Casing_Turbine_SC.get(1),
+ 20 * 5,
+ MaterialUtils.getVoltageForTier(6));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(18),
+ GT_ModHandler.getModItem(GregTech.ID, "gt.blockmachines", 1, 32016),
+ GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedplate", 8, 10104),
+ GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedscrew", 16, 10104),
+ GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedgearGt", 4, 10104), CI.getCircuit(7, 8) },
+ FluidRegistry.getFluidStack("molten.hikarium", 144 * 8),
+ GregtechItemList.Large_SCSteam_Turbine.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(7));
+ }
+ }
+
+ private static void multiSolarTower() {
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), CI.getTieredGTPPMachineCasing(3, 4),
+ ALLOY.MARAGING250.getPlate(8), ALLOY.MARAGING250.getBolt(8), ALLOY.MARAGING250.getScrew(8),
+ CI.getCircuit(5, 8) },
+ CI.getTieredFluid(3, 144 * 16),
+ GregtechItemList.Industrial_Solar_Tower.get(1),
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(4));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), ALLOY.MARAGING350.getFrameBox(1),
+ ALLOY.STAINLESS_STEEL.getPlate(4), ALLOY.MARAGING350.getScrew(8) },
+ CI.getTieredFluid(3, 144 * 4),
+ GregtechItemList.Casing_SolarTower_Structural.get(1),
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(3));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), ALLOY.MARAGING250.getFrameBox(1),
+ ALLOY.STAINLESS_STEEL.getPlate(4), ALLOY.MARAGING250.getBolt(16),
+ ELEMENT.getInstance().ALUMINIUM.getScrew(8) },
+ CI.getTieredFluid(3, 144 * 4),
+ GregtechItemList.Casing_SolarTower_SaltContainment.get(1),
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(3));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), ALLOY.MARAGING250.getFrameBox(1),
+ ALLOY.STEEL_BLACK.getPlate(4), ALLOY.MARAGING250.getScrew(8) },
+ CI.getAlternativeTieredFluid(3, 144 * 4),
+ GregtechItemList.Casing_SolarTower_HeatContainment.get(1),
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(3));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), CI.getTieredGTPPMachineCasing(2, 1), CI.getPlate(3, 2),
+ CI.getGear(3, 4), CI.getElectricMotor(3, 2), CI.getCircuit(3, 4) },
+ CI.getTertiaryTieredFluid(3, 144 * 4),
+ GregtechItemList.Solar_Tower_Reflector.get(1),
+ 20 * 60,
+ MaterialUtils.getVoltageForTier(3));
+ }
+
+ private static void multiElementalDuplicator() {
+
+ CORE.RA.addAssemblylineRecipe(
+ ItemList.Machine_IV_Replicator.get(1),
+ 20 * 60 * 60 * 12,
+ new Object[] { CI.getTieredMachineHull(7, 4), CI.getFieldGenerator(5, 16), CI.getElectricMotor(7, 16),
+ CI.getElectricPiston(7, 4), CI.getEnergyCore(6, 2), CI.getPlate(7, 16), CI.getScrew(7, 32),
+ CI.getBolt(6, 32), CI.getTieredComponent(OrePrefixes.rod, 6, 10),
+ new Object[] { CI.getTieredCircuitOreDictName(7), 20 }, ItemList.Tool_DataOrb.get(32),
+ GregtechItemList.Laser_Lens_Special.get(1) },
+ new FluidStack[] { CI.getTieredFluid(7, 144 * 32), CI.getAlternativeTieredFluid(6, 144 * 16),
+ CI.getTertiaryTieredFluid(6, 144 * 16), ALLOY.BABBIT_ALLOY.getFluidStack(128 * 144), },
+ GregtechItemList.Controller_ElementalDuplicator.get(1),
+ 20 * 60 * 60,
+ (int) MaterialUtils.getVoltageForTier(7));
+
+ CORE.RA.addAssemblylineRecipe(
+ GregtechItemList.Modulator_III.get(1),
+ 20 * 60 * 60 * 4,
+ new Object[] { CI.getTieredGTPPMachineCasing(7, 2), CI.getFieldGenerator(4, 4), CI.getEnergyCore(4, 2),
+ CI.getPlate(7, 8), CI.getScrew(6, 16), CI.getBolt(6, 16), CI.getTieredComponent(OrePrefixes.rod, 5, 16),
+ new Object[] { CI.getTieredCircuitOreDictName(6), 32 }, ItemList.Tool_DataOrb.get(32), },
+ new FluidStack[] { CI.getTieredFluid(6, 144 * 16), CI.getAlternativeTieredFluid(5, 144 * 8),
+ CI.getTertiaryTieredFluid(5, 144 * 8), ALLOY.BABBIT_ALLOY.getFluidStack(64 * 144), },
+ GregtechItemList.Hatch_Input_Elemental_Duplicator.get(1),
+ 20 * 60 * 60 * (2),
+ (int) MaterialUtils.getVoltageForTier(6));
+
+ CORE.RA.addAssemblylineRecipe(
+ GregtechItemList.ResonanceChamber_III.get(1),
+ 20 * 60 * 60 * 2,
+ new Object[] { CI.getTieredMachineHull(6, 5), CI.getFieldGenerator(3, 16), CI.getEnergyCore(2, 2),
+ CI.getPlate(7, 4), CI.getScrew(7, 4), CI.getBolt(6, 8), CI.getTieredComponent(OrePrefixes.rod, 5, 4),
+ new Object[] { CI.getTieredCircuitOreDictName(5), 4 }, ItemList.Tool_DataStick.get(4), },
+ new FluidStack[] { CI.getTieredFluid(5, 144 * 16), CI.getAlternativeTieredFluid(4, 144 * 8),
+ CI.getTertiaryTieredFluid(4, 144 * 8), ALLOY.BABBIT_ALLOY.getFluidStack(16 * 144), },
+ GregtechItemList.Casing_ElementalDuplicator.get(1),
+ 20 * 60 * (10),
+ (int) MaterialUtils.getVoltageForTier(6));
+ }
+
+ private static void resonanceChambers() {
+ int aFieldTier = 1;
+ int aCasingTier = 4;
+ for (int i = 0; i < 4; i++) {
+ RecipeUtils.addShapedRecipe(
+ CI.getDoublePlate(aCasingTier, 1),
+ CI.getFieldGenerator(aFieldTier, 1),
+ CI.getDoublePlate(aCasingTier, 1),
+ CI.getFieldGenerator(aFieldTier, 1),
+ CI.getTieredMachineCasing(aCasingTier),
+ CI.getFieldGenerator(aFieldTier, 1),
+ CI.getDoublePlate(aCasingTier, 1),
+ CI.getFieldGenerator(aFieldTier, 1),
+ CI.getDoublePlate(aCasingTier, 1),
+ ItemUtils.simpleMetaStack(ModBlocks.blockSpecialMultiCasings2, i, 1));
+ aCasingTier++;
+ aFieldTier++;
+ }
+ }
+
+ private static void modulators() {
+ int aCasingTier = 4;
+ for (int i = 4; i < 8; i++) {
+ RecipeUtils.addShapedRecipe(
+ CI.getTieredCircuitOreDictName(aCasingTier),
+ CI.getPlate(aCasingTier, 1),
+ CI.getTieredCircuitOreDictName(aCasingTier),
+ CI.getPlate(aCasingTier, 1),
+ CI.getTieredMachineCasing(aCasingTier),
+ CI.getPlate(aCasingTier, 1),
+ CI.getTieredCircuitOreDictName(aCasingTier),
+ CI.getPlate(aCasingTier, 1),
+ CI.getTieredCircuitOreDictName(aCasingTier),
+ ItemUtils.simpleMetaStack(ModBlocks.blockSpecialMultiCasings2, i, 1));
+ aCasingTier++;
+ }
+ }
+
+ private static void zyngen() {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(6), CI.getTieredMachineHull(4),
+ ItemList.Machine_IV_AlloySmelter.get(1), CI.getGear(3, 16), CI.getBolt(3, 64), CI.getPlate(4, 16) },
+ CI.getAlternativeTieredFluid(4, 144 * 8),
+ GregtechItemList.Industrial_AlloySmelter.get(1),
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(4));
+ }
+
+ private static void chemPlant() {
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Casing_Machine_Custom_1.get(2L, new Object[0]),
+ CI.bits,
+ new Object[] { "PhP", "PFP", "PwP", 'P', OrePrefixes.plate.get(Materials.Bronze), 'F',
+ OrePrefixes.frameGt.get(Materials.Bronze) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Casing_Machine_Custom_2.get(2L, new Object[0]),
+ CI.bits,
+ new Object[] { "PPP", "hFw", "PPP", 'P', OrePrefixes.plate.get(Materials.Aluminium), 'F',
+ OrePrefixes.frameGt.get(Materials.Aluminium) });
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(19), CI.getTieredGTPPMachineCasing(2, 4),
+ CI.getTieredComponentOfMaterial(Materials.Aluminium, OrePrefixes.gearGt, 4),
+ CI.getTieredComponentOfMaterial(Materials.AnnealedCopper, OrePrefixes.plate, 16),
+ CI.getTieredComponentOfMaterial(Materials.Plastic, OrePrefixes.pipeLarge, 4),
+ CI.getTieredComponent(OrePrefixes.frameGt, 2, 4), },
+ ALLOY.STEEL_BLACK.getFluidStack(2 * (144 * 4)),
+ GregtechItemList.ChemicalPlant_Controller.get(1),
+ 120 * 20,
+ MaterialUtils.getVoltageForTier(2));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(15), CI.getTieredGTPPMachineCasing(1, 2),
+ ItemList.Hatch_Input_Bus_MV.get(1),
+ CI.getTieredComponentOfMaterial(Materials.Bronze, OrePrefixes.gearGt, 8),
+ CI.getTieredComponentOfMaterial(Materials.Lead, OrePrefixes.plate, 48),
+ CI.getTieredComponentOfMaterial(Materials.SolderingAlloy, OrePrefixes.wireFine, 16), },
+ ALLOY.BRONZE.getFluidStack(2 * (144 * 4)),
+ GregtechItemList.Bus_Catalysts.get(1),
+ 60 * 20,
+ MaterialUtils.getVoltageForTier(2));
+ }
+
+ private static void algaeFarm() {
+
+ // Give the bad algae a use.
+ CORE.RA.addDistilleryRecipe(
+ ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 32),
+ null,
+ null,
+ ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 4),
+ 20 * 15,
+ 16,
+ false);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(21), CI.getTieredGTPPMachineCasing(0, 4),
+ CI.getTieredComponentOfMaterial(Materials.Aluminium, OrePrefixes.rod, 12),
+ CI.getTieredComponentOfMaterial(Materials.Wood, OrePrefixes.plate, 32),
+ CI.getTieredComponentOfMaterial(Materials.Steel, OrePrefixes.bolt, 16),
+ CI.getTieredComponentOfMaterial(Materials.Redstone, OrePrefixes.dust, 32), },
+ ALLOY.POTIN.getFluidStack(2 * (144 * 4)),
+ GregtechItemList.AlgaeFarm_Controller.get(1),
+ 60 * 20,
+ MaterialUtils.getVoltageForTier(2));
+ }
+
+ private static void distillus() {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(19), ItemList.Distillation_Tower.get(2),
+ GregtechItemList.GTPP_Casing_IV.get(16), CI.getTieredComponent(OrePrefixes.circuit, 6, 8) },
+ new FluidStack[] { ALLOY.AQUATIC_STEEL.getFluidStack(144 * 32), ALLOY.BABBIT_ALLOY.getFluidStack(144 * 16),
+ ALLOY.BRONZE.getFluidStack(144 * 64), ALLOY.KANTHAL.getFluidStack(144 * 16), },
+ new ItemStack[] { GregtechItemList.Machine_Adv_DistillationTower.get(1) },
+ new FluidStack[] {},
+ 20 * 600,
+ MaterialUtils.getVoltageForTier(6),
+ 5);
+ }
+
+ private static void overflowValveCovers() {
+ ItemStack aOutputs[] = new ItemStack[] { GregtechItemList.Cover_Overflow_LV.get(1L),
+ GregtechItemList.Cover_Overflow_MV.get(1L), GregtechItemList.Cover_Overflow_HV.get(1L),
+ GregtechItemList.Cover_Overflow_EV.get(1L), GregtechItemList.Cover_Overflow_IV.get(1L), };
+
+ for (int tier = 1; tier < aOutputs.length + 1; tier++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(19), CI.getElectricPump(tier, 2),
+ CI.getElectricMotor(tier, 2), CI.getPlate(tier, 4) },
+ Materials.SolderingAlloy.getFluid(tier * (144)),
+ aOutputs[tier - 1].copy(),
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(tier));
+ }
+ }
+
+ private static void tieredMachineHulls() {
+
+ GregtechItemList[] aHulls = new GregtechItemList[] { GregtechItemList.GTPP_Casing_ULV,
+ GregtechItemList.GTPP_Casing_LV, GregtechItemList.GTPP_Casing_MV, GregtechItemList.GTPP_Casing_HV,
+ GregtechItemList.GTPP_Casing_EV, GregtechItemList.GTPP_Casing_IV, GregtechItemList.GTPP_Casing_LuV,
+ GregtechItemList.GTPP_Casing_ZPM, GregtechItemList.GTPP_Casing_UV, GregtechItemList.GTPP_Casing_UHV };
+
+ for (int i = 0; i < 10; i++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(20), CI.getTieredMachineCasing(i), CI.getPlate(i, 8),
+ CI.getGear(i, 2), CI.getTieredComponent(OrePrefixes.cableGt02, i, 4),
+ CI.getTieredComponent(OrePrefixes.circuit, i, 2) },
+ CI.getAlternativeTieredFluid(i, 144 * (i + 1) * 2),
+ aHulls[i].get(1),
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(i));
+ }
+ }
+
+ private static void initModItems() {
+ IC2MFE = ItemUtils.getItemStackWithMeta(true, "IC2:blockElectric", "IC2_MFE", 1, 1);
+ IC2MFSU = ItemUtils.getItemStackWithMeta(true, "IC2:blockElectric", "IC2_MFSU", 2, 1);
+
+ // Lava Boiler
+ boiler_Coal = ItemList.Machine_Bronze_Boiler.get(1);
+
+ // IV/EV/HV MACHINES
+ IV_MACHINE_Electrolyzer = ItemList.Machine_IV_Electrolyzer.get(1);
+ EV_MACHINE_Centrifuge = ItemList.Machine_EV_Centrifuge.get(1);
+ EV_MACHINE_BendingMachine = ItemList.Machine_EV_Bender.get(1);
+ IV_MACHINE_Wiremill = ItemList.Machine_IV_Wiremill.get(1);
+ EV_MACHINE_Macerator = ItemList.Machine_EV_Macerator.get(1);
+ IV_MACHINE_Macerator = ItemList.Machine_IV_Macerator.get(1);
+ IV_MACHINE_Cutter = ItemList.Machine_IV_Cutter.get(1);
+ IV_MACHINE_Extruder = ItemList.Machine_IV_Extruder.get(1);
+ HV_MACHINE_Sifter = ItemList.Machine_HV_Sifter.get(1);
+ EV_MACHINE_ThermalCentrifuge = ItemList.Machine_EV_ThermalCentrifuge.get(1);
+ EV_MACHINE_OreWasher = ItemList.Machine_EV_OreWasher.get(1);
+ IV_MACHINE_AlloySmelter = ItemList.Machine_IV_AlloySmelter.get(1);
+ IV_MACHINE_Mixer = ItemList.Machine_IV_Mixer.get(1);
+ EV_MACHINE_ChemicalBath = ItemList.Machine_EV_ChemicalBath.get(1);
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCokeOven) {
+ if (Railcraft.isModLoaded()) {
+ // Misc
+ INPUT_RCCokeOvenBlock = ItemUtils
+ .getItemStackWithMeta(Railcraft.isModLoaded(), "Railcraft:machine.alpha", "Coke_Oven_RC", 7, 1);
+ }
+ }
+ runModRecipes();
+ }
+
+ private static void runModRecipes() {
+ // Computer Cube
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(CI.getDataOrb(), 4 * (1)), ItemList.Cover_Screen.get(4),
+ CI.machineHull_IV, ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(7), 2) },
+ ELEMENT.getInstance().TANTALUM.getFluidStack(144 * 16),
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ 60 * 20 * 3,
+ 8000);
+
+ // Circuit programmer
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(CI.robotArm_LV, 4 * (1)),
+ ItemList.Cover_Controller.get(1, CI.electricMotor_MV), CI.machineHull_MV,
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(1), 2),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(2), 2) },
+ ELEMENT.getInstance().IRON.getFluidStack(144 * 4),
+ ItemUtils.getSimpleStack(ModBlocks.blockCircuitProgrammer),
+ 60 * 10 * 1,
+ 30);
+
+ // Lead Lined Chest
+ for (ItemStack plateRubber : OreDictionary.getOres("plateAnyRubber")) CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.machineHull_LV, GT_Utility.copyAmount(32, plateRubber),
+ ItemUtils.getItemStackOfAmountFromOreDict("plateDenseLead", 9),
+ ItemUtils.getSimpleStack(Blocks.chest) },
+ ELEMENT.getInstance().LEAD.getFluidStack(144 * 16),
+ ItemUtils.getSimpleStack(ModBlocks.blockDecayablesChest),
+ 60 * 10 * 3,
+ 60);
+
+ // RTG
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getItemStackWithMeta(true, "IC2:blockGenerator:6", "IC2-RTG", 6, 1),
+ ALLOY.NITINOL_60.getPlate(8), ALLOY.MARAGING350.getGear(4),
+ ItemUtils.getSimpleStack(CI.fieldGenerator_EV, 8),
+ ItemUtils.getItemStackOfAmountFromOreDict("wireFinePlatinum", 32),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(6), 4) },
+ ALLOY.NIOBIUM_CARBIDE.getFluidStack(144 * 16),
+ GregtechItemList.RTG.get(1),
+ 60 * 20 * 10,
+ 8000);
+
+ // Super Jukebox
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.machineHull_LV, ItemUtils.getItemStackOfAmountFromOreDict("circuitBasic", 4),
+ ItemUtils.getItemStackOfAmountFromOreDict("plateTumbaga", 8),
+ ItemUtils.getSimpleStack(Blocks.jukebox) },
+ ELEMENT.getInstance().COPPER.getFluidStack(144 * 2),
+ ItemUtils.getSimpleStack(ModBlocks.blockCustomJukebox),
+ 20 * 30,
+ 30);
+
+ // Poo Collector
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.machineHull_MV, ItemList.FluidRegulator_MV.get(2),
+ CI.getTieredComponent(OrePrefixes.pipeMedium, 2, 2), ALLOY.EGLIN_STEEL.getPlate(4),
+ ALLOY.POTIN.getScrew(6) },
+ ALLOY.TUMBAGA.getFluidStack(144 * 4),
+ ItemUtils.getSimpleStack(ModBlocks.blockPooCollector),
+ 20 * 60,
+ 30);
+
+ // Adv. Poo Collector
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getTieredMachineHull(-1), ItemUtils.getSimpleStack(ModBlocks.blockPooCollector),
+ ItemList.FluidRegulator_IV.get(2), CI.getTieredComponent(OrePrefixes.pipeHuge, 6, 4),
+ CI.getTieredComponent(OrePrefixes.screw, 6, 16) },
+ CI.getAlternativeTieredFluid(5, 144 * 9),
+ ItemUtils.getSimpleStack(ModBlocks.blockPooCollector, 8, 1),
+ 20 * 60 * 5,
+ 500);
+
+ ItemStack aBronzeBricks = ItemUtils.simpleMetaStack(GregTech_API.sBlockCasings1, 10, 1);
+ // Steam Macerator Multi
+ RecipeUtils.addShapedGregtechRecipe(
+ aBronzeBricks,
+ "gemDiamond",
+ aBronzeBricks,
+ "craftingPiston",
+ ALLOY.TUMBAGA.getFrameBox(1),
+ "craftingPiston",
+ aBronzeBricks,
+ "gemDiamond",
+ aBronzeBricks,
+ GregtechItemList.Controller_SteamMaceratorMulti.get(1));
+ // Steam Compressor Multi
+ RecipeUtils.addShapedGregtechRecipe(
+ aBronzeBricks,
+ "craftingPiston",
+ aBronzeBricks,
+ ALLOY.TUMBAGA.getGear(1),
+ ALLOY.TUMBAGA.getFrameBox(1),
+ ALLOY.TUMBAGA.getGear(1),
+ aBronzeBricks,
+ "craftingPiston",
+ aBronzeBricks,
+ GregtechItemList.Controller_SteamCompressorMulti.get(1));
+
+ // Steam Hatch
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateBronze",
+ "pipeMediumBronze",
+ "plateBronze",
+ "plateBronze",
+ GregtechItemList.GT_FluidTank_ULV.get(1),
+ "plateBronze",
+ "plateBronze",
+ "pipeMediumBronze",
+ "plateBronze",
+ GregtechItemList.Hatch_Input_Steam.get(1));
+
+ // Steam Input Bus
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateBronze",
+ ALLOY.TUMBAGA.getPlate(1),
+ "plateBronze",
+ "plateTin",
+ ItemUtils.getSimpleStack(Blocks.hopper),
+ "plateTin",
+ "plateBronze",
+ ALLOY.TUMBAGA.getPlate(1),
+ "plateBronze",
+ GregtechItemList.Hatch_Input_Bus_Steam.get(1));
+
+ // Steam Output Bus
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateBronze",
+ "plateTin",
+ "plateBronze",
+ ALLOY.TUMBAGA.getPlate(1),
+ ItemUtils.getSimpleStack(Blocks.hopper),
+ ALLOY.TUMBAGA.getPlate(1),
+ "plateBronze",
+ "plateTin",
+ "plateBronze",
+ GregtechItemList.Hatch_Output_Bus_Steam.get(1));
+
+ // Flask Configurator
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(8), CI.getTieredMachineHull(2),
+ ItemUtils.getSimpleStack(ModBlocks.blockCircuitProgrammer), VolumetricFlaskHelper.getVolumetricFlask(8),
+ CI.getTieredComponent(OrePrefixes.pipeSmall, 2, 2), CI.getPlate(2, 4) },
+ CI.getAlternativeTieredFluid(1, 144 * 8),
+ ItemUtils.getSimpleStack(ModBlocks.blockVolumetricFlaskSetter, 1),
+ 20 * 60,
+ 120);
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCentrifuge) {
+ // Industrial Centrifuge
+ RECIPE_IndustrialCentrifugeController = GregtechItemList.Industrial_Centrifuge.get(1);
+ RECIPE_IndustrialCentrifugeCasing = GregtechItemList.Casing_Centrifuge1.get(1);
+
+ // Industrial Centrifuge
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.circuitTier4,
+ pipeHugeStainlessSteel,
+ CI.circuitTier4,
+ CI.component_Plate[6],
+ EV_MACHINE_Centrifuge,
+ CI.component_Plate[6],
+ CI.component_Plate[8],
+ CI.machineCasing_EV,
+ CI.component_Plate[8],
+ RECIPE_IndustrialCentrifugeController);
+ // Centrifuge Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[6],
+ "stickTumbaga",
+ CI.component_Plate[6],
+ CI.component_Plate[8],
+ "stickTumbaga",
+ CI.component_Plate[8],
+ CI.component_Plate[6],
+ "stickTumbaga",
+ CI.component_Plate[6],
+ RECIPE_IndustrialCentrifugeCasing);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.MARAGING250.getPlate(4), ALLOY.INCONEL_792.getPlate(2), ALLOY.TUMBAGA.getRod(3),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialCentrifugeCasing,
+ 50,
+ 16);
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCokeOven) {
+ // Industrial Coke Oven
+ RECIPE_IndustrialCokeOvenController = GregtechItemList.Industrial_CokeOven.get(1);
+ RECIPE_IndustrialCokeOvenFrame = GregtechItemList.Casing_CokeOven.get(1);
+ RECIPE_IndustrialCokeOvenCasingA = GregtechItemList.Casing_CokeOven_Coil1.get(1);
+ RECIPE_IndustrialCokeOvenCasingB = GregtechItemList.Casing_CokeOven_Coil2.get(1);
+
+ if (Railcraft.isModLoaded()) {
+ // Industrial Coke Oven
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[7],
+ CI.circuitTier4,
+ CI.component_Plate[7],
+ CI.machineCasing_EV,
+ INPUT_RCCokeOvenBlock,
+ CI.machineCasing_EV,
+ CI.component_Plate[7],
+ CI.circuitTier4,
+ CI.component_Plate[7],
+ RECIPE_IndustrialCokeOvenController);
+ }
+ // Coke Oven Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[7],
+ CI.component_Rod[7],
+ CI.component_Plate[7],
+ CI.component_Rod[7],
+ "frameGtTantalloy61",
+ CI.component_Rod[7],
+ CI.component_Plate[7],
+ CI.component_Rod[7],
+ CI.component_Plate[7],
+ RECIPE_IndustrialCokeOvenFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.TANTALLOY_61.getPlate(4), ALLOY.TANTALLOY_61.getRod(4),
+ ALLOY.TANTALLOY_61.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialCokeOvenFrame,
+ 50,
+ 16);
+ // Coke Oven Coil 1
+ RecipeUtils.addShapedGregtechRecipe(
+ plateBronze,
+ plateBronze,
+ plateBronze,
+ "frameGtBronze",
+ CI.gearboxCasing_Tier_1,
+ "frameGtBronze",
+ plateBronze,
+ plateBronze,
+ plateBronze,
+ RECIPE_IndustrialCokeOvenCasingA);
+ // Coke Oven Coil 2
+ RecipeUtils.addShapedGregtechRecipe(
+ plateSteel,
+ plateSteel,
+ plateSteel,
+ "frameGtSteel",
+ CI.gearboxCasing_Tier_2,
+ "frameGtSteel",
+ plateSteel,
+ plateSteel,
+ plateSteel,
+ RECIPE_IndustrialCokeOvenCasingB);
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialElectrolyzer) {
+ // Industrial Electrolyzer
+ RECIPE_IndustrialElectrolyzerController = GregtechItemList.Industrial_Electrolyzer.get(1);
+ RECIPE_IndustrialElectrolyzerFrame = GregtechItemList.Casing_Electrolyzer.get(1);
+
+ // Electrolyzer Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "platePotin",
+ "stickLongChrome",
+ "platePotin",
+ "stickLongPotin",
+ "frameGtPotin",
+ "stickLongPotin",
+ "platePotin",
+ "stickLongPotin",
+ "platePotin",
+ RECIPE_IndustrialElectrolyzerFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.POTIN.getPlate(4), ALLOY.POTIN.getLongRod(3),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Chrome, 1), ALLOY.POTIN.getFrameBox(1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialElectrolyzerFrame,
+ 50,
+ 16);
+ // Industrial Electrolyzer
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateStellite",
+ CI.circuitTier5,
+ "plateStellite",
+ CI.machineCasing_IV,
+ IV_MACHINE_Electrolyzer,
+ CI.machineCasing_IV,
+ "plateStellite",
+ "rotorStellite",
+ "plateStellite",
+ RECIPE_IndustrialElectrolyzerController);
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialPlatePress) {
+ // Industrial Material Press
+ RECIPE_IndustrialMaterialPressController = GregtechItemList.Industrial_PlatePress.get(1);
+ RECIPE_IndustrialMaterialPressFrame = GregtechItemList.Casing_MaterialPress.get(1);
+
+ // Material Press Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateTitanium",
+ "stickLongTumbaga",
+ "plateTitanium",
+ "stickTantalloy60",
+ "frameGtTumbaga",
+ "stickTantalloy60",
+ "plateTitanium",
+ "stickLongTumbaga",
+ "plateTitanium",
+ RECIPE_IndustrialMaterialPressFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 4),
+ ALLOY.TANTALLOY_60.getRod(2), ALLOY.TUMBAGA.getLongRod(2), ALLOY.TUMBAGA.getFrameBox(1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialMaterialPressFrame,
+ 50,
+ 16);
+ // Industrial Material Press
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateTitanium",
+ CI.circuitTier4,
+ "plateTitanium",
+ CI.machineCasing_EV,
+ EV_MACHINE_BendingMachine,
+ CI.machineCasing_EV,
+ "plateTitanium",
+ CI.circuitTier4,
+ "plateTitanium",
+ RECIPE_IndustrialMaterialPressController);
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialMacerationStack) {
+ // Industrial Maceration Stack
+ RECIPE_IndustrialMacerationStackController = GregtechItemList.Industrial_MacerationStack.get(1);
+ RECIPE_IndustrialMacerationStackFrame = GregtechItemList.Casing_MacerationStack.get(1);
+
+ // Maceration Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "platePalladium",
+ "platePalladium",
+ "platePalladium",
+ "stickPlatinum",
+ "frameGtInconel625",
+ "stickPlatinum",
+ "platePalladium",
+ "stickLongPalladium",
+ "platePalladium",
+ RECIPE_IndustrialMacerationStackFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Palladium, 5),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Platinum, 2),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Palladium, 1),
+ ALLOY.INCONEL_625.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialMacerationStackFrame,
+ 50,
+ 16);
+ // Industrial Maceration stack
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateTitanium",
+ EV_MACHINE_Macerator,
+ "plateTitanium",
+ EV_MACHINE_Macerator,
+ CI.circuitTier4,
+ EV_MACHINE_Macerator,
+ "plateTitanium",
+ EV_MACHINE_Macerator,
+ "plateTitanium",
+ RECIPE_IndustrialMacerationStackController);
+ // T2-Upgrade Card
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateTungstenCarbide",
+ IV_MACHINE_Macerator,
+ "plateTungstenCarbide",
+ IV_MACHINE_Macerator,
+ CI.circuitTier7,
+ IV_MACHINE_Macerator,
+ "plateTungstenCarbide",
+ IV_MACHINE_Macerator,
+ "plateTungstenCarbide",
+ GregtechItemList.Maceration_Upgrade_Chip.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialWireMill) {
+ // Industrial Wire Factory
+ RECIPE_IndustrialWireFactoryController = GregtechItemList.Industrial_WireFactory.get(1);
+ RECIPE_IndustrialWireFactoryFrame = GregtechItemList.Casing_WireFactory.get(1);
+
+ // Wire Factory Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateBlueSteel",
+ "stickBlueSteel",
+ "plateBlueSteel",
+ "stickBlueSteel",
+ "frameGtBlueSteel",
+ "stickBlueSteel",
+ "plateBlueSteel",
+ "stickBlueSteel",
+ "plateBlueSteel",
+ RECIPE_IndustrialWireFactoryFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BlueSteel, 4),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.BlueSteel, 4),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.BlueSteel, 1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialWireFactoryFrame,
+ 50,
+ 16);
+ // Industrial Wire Factory
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateZeron100",
+ CI.machineCasing_IV,
+ "plateZeron100",
+ CI.circuitTier5,
+ IV_MACHINE_Wiremill,
+ CI.circuitTier5,
+ "plateZeron100",
+ CI.machineCasing_IV,
+ "plateZeron100",
+ RECIPE_IndustrialWireFactoryController);
+ }
+
+ // Tiered Tanks
+ if (CORE.ConfigSwitches.enableMachine_FluidTanks) {
+ CI.component_Plate[1] = "plateTin";
+ pipeTier1 = "pipeLargeClay";
+ CI.circuitTier1 = ItemList.Circuit_Primitive.get(1);
+ CI.component_Plate[2] = "plateCopper";
+ pipeTier2 = "pipeHugeClay";
+ CI.component_Plate[3] = "plateBronze";
+ pipeTier3 = "pipeMediumBronze";
+ CI.component_Plate[4] = "plateIron";
+ pipeTier4 = "pipeMediumSteel";
+ CI.component_Plate[5] = "plateSteel";
+ CI.component_Plate[6] = "plateRedstone";
+ CI.component_Plate[7] = "plateAluminium";
+ CI.component_Plate[8] = "plateDarkSteel";
+ ItemStack waterBucket = ItemUtils.getSimpleStack(Items.water_bucket);
+
+ // Allows clearing stored fluids.
+ GregtechItemList[] aTanks = new GregtechItemList[] { GregtechItemList.GT_FluidTank_ULV,
+ GregtechItemList.GT_FluidTank_LV, GregtechItemList.GT_FluidTank_MV, GregtechItemList.GT_FluidTank_HV };
+ for (GregtechItemList aTank : aTanks) {
+ RecipeUtils.addShapelessGregtechRecipe(new Object[] { aTank.get(1) }, aTank.get(1));
+ }
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[1],
+ CI.component_Plate[5],
+ CI.component_Plate[1],
+ CI.component_Plate[4],
+ pipeTier1,
+ CI.component_Plate[4],
+ CI.component_Plate[4],
+ waterBucket,
+ CI.component_Plate[4],
+ GregtechItemList.GT_FluidTank_ULV.get(1));
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[5],
+ CI.component_Plate[4],
+ CI.component_Plate[5],
+ CI.component_Plate[3],
+ pipeTier2,
+ CI.component_Plate[3],
+ CI.component_Plate[3],
+ CI.electricPump_LV,
+ CI.component_Plate[3],
+ GregtechItemList.GT_FluidTank_LV.get(1));
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[8],
+ CI.component_Plate[3],
+ CI.component_Plate[8],
+ CI.component_Plate[5],
+ pipeTier3,
+ CI.component_Plate[5],
+ CI.component_Plate[5],
+ CI.electricPump_LV,
+ CI.component_Plate[5],
+ GregtechItemList.GT_FluidTank_MV.get(1));
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.circuitTier1,
+ CI.component_Plate[7],
+ CI.circuitTier1,
+ CI.component_Plate[8],
+ pipeTier4,
+ CI.component_Plate[8],
+ CI.circuitTier1,
+ CI.electricPump_MV,
+ CI.circuitTier1,
+ GregtechItemList.GT_FluidTank_HV.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_MultiTank) {
+ // Industrial Multi Tank
+ // RECIPE_IndustrialMultiTankController = GregtechItemList.Industrial_MultiTank.get(1);
+ RECIPE_IndustrialMultiTankFrame = GregtechItemList.Casing_MultitankExterior.get(1);
+
+ // Industrial Multi Tank Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "stickGrisium",
+ "plateGrisium",
+ "stickGrisium",
+ "plateGrisium",
+ "frameGtGrisium",
+ "plateGrisium",
+ "plateGrisium",
+ "plateGrisium",
+ "plateGrisium",
+ RECIPE_IndustrialMultiTankFrame);
+ // Industrial Multi Tank
+ RecipeUtils.addShapedGregtechRecipe(
+ "pipeHugeTantalloy60",
+ "gearGrisium",
+ "pipeHugeTantalloy60",
+ CI.circuitTier4,
+ RECIPE_IndustrialMultiTankFrame,
+ CI.circuitTier4,
+ "plateDoubleGrisium",
+ "rotorGrisium",
+ "plateDoubleGrisium",
+ RECIPE_IndustrialMultiTankController);
+ }
+ // TODO
+
+ // Semi-Fluid Generators
+ ItemStack[][] aSemiFluidInputs = new ItemStack[5][10];
+ aSemiFluidInputs[0] = new ItemStack[] { CI.getNumberedBioCircuit(14), CI.getTieredMachineHull(1, 1),
+ CI.getElectricMotor(1, 2), CI.getElectricPiston(1, 2), CI.getTieredComponent(OrePrefixes.cableGt01, 1, 1),
+ CI.getTieredComponent(OrePrefixes.circuit, 1, 1), CI.getGear(1, 2) };
+ aSemiFluidInputs[1] = new ItemStack[] { CI.getNumberedBioCircuit(14), CI.getTieredMachineHull(2, 1),
+ CI.getElectricMotor(2, 2), CI.getElectricPiston(2, 2), CI.getTieredComponent(OrePrefixes.cableGt01, 2, 1),
+ CI.getTieredComponent(OrePrefixes.circuit, 2, 1), CI.getGear(2, 2) };
+ aSemiFluidInputs[2] = new ItemStack[] { CI.getNumberedBioCircuit(14), CI.getTieredMachineHull(3, 1),
+ CI.getElectricMotor(3, 2), CI.getElectricPiston(3, 2), CI.getTieredComponent(OrePrefixes.cableGt01, 3, 1),
+ CI.getTieredComponent(OrePrefixes.circuit, 3, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.Chrome, 2) };
+ aSemiFluidInputs[3] = new ItemStack[] { CI.getNumberedBioCircuit(14), CI.getTieredMachineHull(4, 1),
+ CI.getElectricMotor(4, 2), CI.getElectricPiston(4, 2), CI.getTieredComponent(OrePrefixes.cableGt01, 4, 1),
+ CI.getTieredComponent(OrePrefixes.circuit, 4, 1), CI.getGear(4, 2) };
+ aSemiFluidInputs[4] = new ItemStack[] { CI.getNumberedBioCircuit(14), CI.getTieredMachineHull(5, 1),
+ CI.getElectricMotor(5, 2), CI.getElectricPiston(5, 2), CI.getTieredComponent(OrePrefixes.cableGt01, 5, 1),
+ CI.getTieredComponent(OrePrefixes.circuit, 5, 1), CI.getGear(5, 2) };
+ FluidStack[] aSemiFluidFluidInputs = new FluidStack[] { ALLOY.POLYETHYLENE.getFluidStack(144),
+ ALLOY.POLYETHYLENE.getFluidStack(144), ALLOY.POLYETHYLENE.getFluidStack(144),
+ ALLOY.POLYETHYLENE.getFluidStack(144), ALLOY.POLYTETRAFLUOROETHYLENE.getFluidStack(144) };
+
+ ItemStack[] aSemifluids = new ItemStack[] { GregtechItemList.Generator_SemiFluid_LV.get(1),
+ GregtechItemList.Generator_SemiFluid_MV.get(1), GregtechItemList.Generator_SemiFluid_HV.get(1),
+ GregtechItemList.Generator_SemiFluid_EV.get(1), GregtechItemList.Generator_SemiFluid_IV.get(1) };
+ for (int o = 0; o < 5; o++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ aSemiFluidInputs[o],
+ aSemiFluidFluidInputs[o],
+ aSemifluids[o],
+ 20 * 30,
+ MaterialUtils.getVoltageForTier(o + 1));
+ }
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Generator_SemiFluid_LV.get(1L),
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_LV, 'P', ItemList.Electric_Piston_LV, 'E',
+ ItemList.Electric_Motor_LV, 'C', OrePrefixes.circuit.get(Materials.Basic), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tin), 'G', ALLOY.TUMBAGA.getGear(2) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Generator_SemiFluid_MV.get(1L),
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_MV, 'P', ItemList.Electric_Piston_MV, 'E',
+ ItemList.Electric_Motor_MV, 'C', OrePrefixes.circuit.get(Materials.Good), 'W',
+ OrePrefixes.cableGt01.get(Materials.AnyCopper), 'G', ALLOY.EGLIN_STEEL.getGear(2) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Generator_SemiFluid_HV.get(1L),
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_HV, 'P', ItemList.Electric_Piston_HV, 'E',
+ ItemList.Electric_Motor_HV, 'C', OrePrefixes.circuit.get(Materials.Advanced), 'W',
+ OrePrefixes.cableGt01.get(Materials.Gold), 'G',
+ GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.Chrome, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Generator_SemiFluid_EV.get(1L),
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_EV, 'P', ItemList.Electric_Piston_EV, 'E',
+ ItemList.Electric_Motor_EV, 'C', OrePrefixes.circuit.get(Materials.Data), 'W',
+ OrePrefixes.cableGt01.get(Materials.Aluminium), 'G', ALLOY.INCOLOY_DS.getGear(1) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Generator_SemiFluid_IV.get(1L),
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_IV, 'P', ItemList.Electric_Piston_IV, 'E',
+ ItemList.Electric_Motor_IV, 'C', OrePrefixes.circuit.get(Materials.Elite), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tungsten), 'G', ALLOY.NITINOL_60.getGear(1) });
+
+ if (CORE.ConfigSwitches.enableMultiblock_AlloyBlastSmelter) {
+ // Industrial Blast Smelter
+ RECIPE_IndustrialBlastSmelterController = GregtechItemList.Industrial_AlloyBlastSmelter.get(1);
+ RECIPE_IndustrialBlastSmelterFrame = GregtechItemList.Casing_BlastSmelter.get(1);
+ RECIPE_IndustrialBlastSmelterCoil = GregtechItemList.Casing_Coil_BlastSmelter.get(1);
+
+ // Blast Smelter
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateZirconiumCarbide",
+ CI.circuitTier5,
+ "plateZirconiumCarbide",
+ cableTier6,
+ IV_MACHINE_AlloySmelter,
+ cableTier6,
+ "plateZirconiumCarbide",
+ CI.circuitTier5,
+ "plateZirconiumCarbide",
+ RECIPE_IndustrialBlastSmelterController);
+ // Blast Smelter Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateZirconiumCarbide",
+ CI.craftingToolHammer_Hard,
+ "plateZirconiumCarbide",
+ "plateZirconiumCarbide",
+ "frameGtZirconiumCarbide",
+ "plateZirconiumCarbide",
+ "plateZirconiumCarbide",
+ CI.craftingToolWrench,
+ "plateZirconiumCarbide",
+ RECIPE_IndustrialBlastSmelterFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.ZIRCONIUM_CARBIDE.getPlate(6), ALLOY.ZIRCONIUM_CARBIDE.getFrameBox(1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialBlastSmelterFrame,
+ 50,
+ 16);
+ // Blast Smelter Coil
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateStaballoy",
+ "plateStaballoy",
+ "plateStaballoy",
+ "frameGtStaballoy",
+ CI.gearboxCasing_Tier_3,
+ "frameGtStaballoy",
+ "plateStaballoy",
+ "plateStaballoy",
+ "plateStaballoy",
+ RECIPE_IndustrialBlastSmelterCoil);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.STABALLOY.getPlate(6), ALLOY.STABALLOY.getFrameBox(2), CI.gearboxCasing_Tier_3,
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialBlastSmelterCoil,
+ 50,
+ 16);
+ }
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemList.Casing_Coil_Infinity.get(1), ItemList.Reactor_Coolant_Sp_6.get(4),
+ ALLOY.LAURENIUM.getPlateDouble(2), CustomItemList.eM_Coil.get(1) },
+ ALLOY.QUANTUM.getFluidStack(144 * 4),
+ GregtechItemList.Casing_Coil_QuantumForceTransformer.get(1),
+ 60 * 30,
+ MaterialUtils.getVoltageForTier(6));
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.Casing_Coil_QuantumForceTransformer.get(1),
+ 2048 * 120 * 20,
+ 2048,
+ (int) GT_Values.VP[11],
+ 16,
+ new Object[] { GregtechItemList.Controller_MolecularTransformer.get(1),
+ GT_ModHandler.getModItem(EternalSingularity.ID, "eternal_singularity", 1),
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 8 }, ItemList.Electric_Pump_UEV.get(4),
+ ItemList.Field_Generator_UEV.get(4), GregtechItemList.Laser_Lens_Special.get(1) },
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 10),
+ ALLOY.PIKYONIUM.getFluidStack(144 * 32) },
+ GregtechItemList.QuantumForceTransformer.get(1),
+ 1200 * 20,
+ (int) GT_Values.VP[11]);
+
+ if (CORE.ConfigSwitches.enableMultiblock_MatterFabricator) {
+ // Industrial Matter Fabricator
+ RECIPE_IndustrialMatterFabController = GregtechItemList.Industrial_MassFab.get(1);
+ RECIPE_IndustrialMatterFabFrame = GregtechItemList.Casing_MatterFab.get(1);
+ RECIPE_IndustrialMatterFabCoil = GregtechItemList.Casing_MatterGen.get(1);
+
+ // Matter Fabricator CPU
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getPlate(8, 1),
+ CI.circuitTier8,
+ CI.getPlate(8, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04.get(Materials.NaquadahAlloy), 1L),
+ CI.machineCasing_UV,
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04.get(Materials.NaquadahAlloy), 1L),
+ CI.getPlate(8, 1),
+ CI.circuitTier8,
+ CI.getPlate(8, 1),
+ RECIPE_IndustrialMatterFabController);
+ // Matter Fabricator Frame Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateNiobiumCarbide",
+ CI.component_Rod[8],
+ "plateNiobiumCarbide",
+ CI.component_Rod[8],
+ "frameGtInconel690",
+ CI.component_Rod[8],
+ "plateNiobiumCarbide",
+ CI.component_Rod[8],
+ "plateNiobiumCarbide",
+ RECIPE_IndustrialMatterFabFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.NIOBIUM_CARBIDE.getPlate(4), ALLOY.INCONEL_792.getRod(4),
+ ALLOY.INCONEL_690.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialMatterFabFrame,
+ 50,
+ 16);
+ // Matter Fabricator Coil
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getPlate(6, 1),
+ CI.getPlate(7, 1),
+ CI.getPlate(6, 1),
+ "frameGtStellite",
+ CI.machineCasing_UV,
+ "frameGtStellite",
+ CI.getPlate(6, 1),
+ CI.getPlate(7, 1),
+ CI.getPlate(6, 1),
+ RECIPE_IndustrialMatterFabCoil);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { CI.machineCasing_UV, ALLOY.ZERON_100.getPlate(4), ALLOY.PIKYONIUM.getPlate(2),
+ ALLOY.STELLITE.getFrameBox(2), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialMatterFabCoil,
+ 50,
+ 16);
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialSifter) {
+ // Industrial Sieve
+ RECIPE_IndustrialSieveController = GregtechItemList.Industrial_Sifter.get(1);
+ RECIPE_IndustrialSieveFrame = GregtechItemList.Casing_Sifter.get(1);
+ RECIPE_IndustrialSieveGrate = GregtechItemList.Casing_SifterGrate.get(1);
+
+ // Industrial Sieve
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateEglinSteel",
+ CI.circuitTier3,
+ "plateEglinSteel",
+ cableTier4,
+ HV_MACHINE_Sifter,
+ cableTier4,
+ "plateEglinSteel",
+ CI.circuitTier3,
+ "plateEglinSteel",
+ RECIPE_IndustrialSieveController);
+ // Industrial Sieve Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateEglinSteel",
+ "plateEglinSteel",
+ "plateEglinSteel",
+ "plateEglinSteel",
+ "frameGtTumbaga",
+ "plateEglinSteel",
+ "plateEglinSteel",
+ "plateEglinSteel",
+ "plateEglinSteel",
+ RECIPE_IndustrialSieveFrame);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.EGLIN_STEEL.getPlate(8), ALLOY.TUMBAGA.getFrameBox(1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialSieveFrame,
+ 50,
+ 16);
+ // Industrial Sieve Grate
+ RecipeUtils.addShapedGregtechRecipe(
+ "frameGtEglinSteel",
+ "wireFineSteel",
+ "frameGtEglinSteel",
+ "wireFineSteel",
+ "wireFineSteel",
+ "wireFineSteel",
+ "frameGtEglinSteel",
+ "wireFineSteel",
+ "frameGtEglinSteel",
+ RECIPE_IndustrialSieveGrate);
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 5),
+ ALLOY.EGLIN_STEEL.getFrameBox(4), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ RECIPE_IndustrialSieveGrate,
+ 50,
+ 16);
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_TreeFarmer) {
+ // Industrial Tree Farmer
+ RECIPE_TreeFarmController = GregtechItemList.Industrial_TreeFarm.get(1);
+ RECIPE_TreeFarmFrame = GregtechItemList.Casing_PLACEHOLDER_TreeFarmer.get(1);
+ // Industrial Tree Farm Controller
+ RecipeUtils.addShapedGregtechRecipe(
+ ItemList.Field_Generator_IV.get(1),
+ ALLOY.INCOLOY_MA956.getRotor(1),
+ ItemList.Field_Generator_IV.get(1),
+ ALLOY.NITINOL_60.getPlate(1),
+ GregtechItemList.GTPP_Casing_IV.get(1),
+ ALLOY.NITINOL_60.getPlate(1),
+ ItemList.Field_Generator_IV.get(1),
+ ALLOY.INCONEL_792.getComponentByPrefix(OrePrefixes.pipeMedium, 1),
+ ItemList.Field_Generator_IV.get(1),
+ RECIPE_TreeFarmController);
+ // Industrial Tree Farm Frame
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(2), ALLOY.TUMBAGA.getFrameBox(1),
+ ItemUtils.getItemStackOfAmountFromOreDict("pipeTinySteel", 1), ItemList.MV_Coil.get(1),
+ ItemList.IC2_Plantball.get(4), GT_OreDictUnificator.get(OrePrefixes.plank, Materials.Wood, 8), },
+ GT_ModHandler.getDistilledWater(2000),
+ RECIPE_TreeFarmFrame,
+ 200,
+ 64);
+ }
+
+ if (CORE.ConfigSwitches.enableMachine_Tesseracts) {
+ // Tesseracts
+ RECIPE_TesseractGenerator = GregtechItemList.GT4_Tesseract_Generator.get(1);
+ RECIPE_TesseractTerminal = GregtechItemList.GT4_Tesseract_Terminal.get(1);
+ // Tesseract Generator
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateTitanium",
+ "circuitMaster",
+ "plateTitanium",
+ "circuitMaster",
+ ItemUtils.getSimpleStack(Blocks.ender_chest),
+ "circuitMaster",
+ "plateTitanium",
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ "plateTitanium",
+ RECIPE_TesseractGenerator);
+ // Tesseract Terminal
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateTitanium",
+ "circuitElite",
+ "plateTitanium",
+ "circuitElite",
+ ItemUtils.getSimpleStack(Blocks.ender_chest),
+ "circuitElite",
+ "plateTitanium",
+ CI.machineHull_EV,
+ "plateTitanium",
+ RECIPE_TesseractTerminal);
+ }
+
+ if (CORE.ConfigSwitches.enableMachine_SimpleWasher) {
+ final List<ItemStack> washers = ImmutableList.of(
+ GregtechItemList.SimpleDustWasher_LV.get(1),
+ GregtechItemList.SimpleDustWasher_MV.get(1),
+ GregtechItemList.SimpleDustWasher_HV.get(1),
+ GregtechItemList.SimpleDustWasher_EV.get(1),
+ GregtechItemList.SimpleDustWasher_IV.get(1),
+ GregtechItemList.SimpleDustWasher_LuV.get(1),
+ GregtechItemList.SimpleDustWasher_ZPM.get(1),
+ GregtechItemList.SimpleDustWasher_UV.get(1));
+
+ for (int i = 0; i < washers.size(); i++) {
+ final int tier = i + 1;
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getTieredMachineHull(tier),
+ CI.getTieredComponent(OrePrefixes.screw, tier, tier * 4),
+ CI.getTieredComponent(OrePrefixes.plate, tier - 1, tier * 2),
+ CI.getTieredComponent(OrePrefixes.rod, tier, tier),
+ CI.getTieredComponent(OrePrefixes.circuit, tier, 1) },
+ CI.getTieredFluid(tier, 144 * tier),
+ washers.get(i),
+ 20 * 5 * tier,
+ (int) GT_Values.V[tier]);
+ }
+ }
+
+ if (CORE.ConfigSwitches.enableMachine_Pollution && PollutionUtils.isPollutionEnabled()) {
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateCarbon",
+ "plateCarbon",
+ "plateCarbon",
+ "dustCarbon",
+ "dustCarbon",
+ "dustCarbon",
+ "plateCarbon",
+ "plateCarbon",
+ "plateCarbon",
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 0, 1));
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateCarbon",
+ "plateCarbon",
+ "plateCarbon",
+ "cellLithiumPeroxide",
+ "dustCarbon",
+ "cellLithiumPeroxide",
+ "plateCarbon",
+ "plateCarbon",
+ "plateCarbon",
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 1, 1));
+
+ // Pollution Detector
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateSteel",
+ CI.sensor_LV,
+ "plateSteel",
+ "plateSteel",
+ CI.electricMotor_LV,
+ "plateSteel",
+ CI.getTieredCircuit(1),
+ CI.machineHull_LV,
+ CI.getTieredCircuit(1),
+ GregtechItemList.Pollution_Detector.get(1));
+
+ // LV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[1],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 0, 1),
+ CI.component_Plate[1],
+ CI.component_Plate[1],
+ CI.electricMotor_LV,
+ CI.component_Plate[1],
+ CI.getTieredCircuit(1),
+ CI.machineHull_LV,
+ CI.getTieredCircuit(1),
+ GregtechItemList.Pollution_Cleaner_LV.get(1));
+ // MV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[2],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 0, 1),
+ CI.component_Plate[2],
+ CI.component_Plate[2],
+ CI.electricMotor_MV,
+ CI.component_Plate[2],
+ CI.getTieredCircuit(2),
+ CI.machineHull_MV,
+ CI.getTieredCircuit(2),
+ GregtechItemList.Pollution_Cleaner_MV.get(1));
+ // HV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[3],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 0, 1),
+ CI.component_Plate[3],
+ CI.component_Plate[3],
+ CI.electricMotor_HV,
+ CI.component_Plate[3],
+ CI.getTieredCircuit(3),
+ CI.machineHull_HV,
+ CI.getTieredCircuit(3),
+ GregtechItemList.Pollution_Cleaner_HV.get(1));
+ // EV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[4],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 0, 1),
+ CI.component_Plate[4],
+ CI.component_Plate[4],
+ CI.electricMotor_EV,
+ CI.component_Plate[4],
+ CI.getTieredCircuit(4),
+ CI.machineHull_EV,
+ CI.getTieredCircuit(4),
+ GregtechItemList.Pollution_Cleaner_EV.get(1));
+ // IV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[5],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 1, 1),
+ CI.component_Plate[5],
+ CI.component_Plate[5],
+ CI.electricMotor_IV,
+ CI.component_Plate[5],
+ CI.getTieredCircuit(5),
+ CI.machineHull_IV,
+ CI.getTieredCircuit(5),
+ GregtechItemList.Pollution_Cleaner_IV.get(1));
+ // LuV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[6],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 1, 1),
+ CI.component_Plate[6],
+ CI.component_Plate[6],
+ CI.electricMotor_LuV,
+ CI.component_Plate[6],
+ CI.getTieredCircuit(6),
+ CI.machineHull_LuV,
+ CI.getTieredCircuit(6),
+ GregtechItemList.Pollution_Cleaner_LuV.get(1));
+ // ZPM
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[7],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 1, 1),
+ CI.component_Plate[7],
+ CI.component_Plate[7],
+ CI.electricMotor_ZPM,
+ CI.component_Plate[7],
+ CI.getTieredCircuit(7),
+ CI.machineHull_ZPM,
+ CI.getTieredCircuit(7),
+ GregtechItemList.Pollution_Cleaner_ZPM.get(1));
+ // UV
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[8],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 1, 1),
+ CI.component_Plate[8],
+ CI.component_Plate[8],
+ CI.electricMotor_UV,
+ CI.component_Plate[8],
+ CI.getTieredCircuit(8),
+ CI.machineHull_UV,
+ CI.getTieredCircuit(8),
+ GregtechItemList.Pollution_Cleaner_UV.get(1));
+ // MAX
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[9],
+ ItemUtils.simpleMetaStack(ModItems.itemAirFilter, 1, 1),
+ CI.component_Plate[9],
+ CI.component_Plate[9],
+ CI.electricMotor_UHV,
+ CI.component_Plate[9],
+ CI.getTieredCircuit(9),
+ CI.machineHull_UHV,
+ CI.getTieredCircuit(9),
+ GregtechItemList.Pollution_Cleaner_MAX.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_ThermalBoiler) {
+ RECIPE_ThermalBoilerController = GregtechItemList.GT4_Thermal_Boiler.get(1);
+ RECIPE_ThermalBoilerCasing = GregtechItemList.Casing_ThermalContainment.get(2);
+ ItemStack centrifugeEV = ItemList.Machine_EV_Centrifuge.get(1);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "craftingGeothermalGenerator",
+ centrifugeEV,
+ "craftingGeothermalGenerator",
+ "gearGtTitanium",
+ CI.getTieredCircuitOreDictName(6),
+ "gearGtTitanium",
+ "craftingGeothermalGenerator",
+ centrifugeEV,
+ "craftingGeothermalGenerator",
+ RECIPE_ThermalBoilerController);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "craftingGeothermalGenerator",
+ centrifugeEV,
+ "craftingGeothermalGenerator",
+ "gearGtTungstenSteel",
+ CI.getTieredCircuitOreDictName(5),
+ "gearGtTungstenSteel",
+ "craftingGeothermalGenerator",
+ centrifugeEV,
+ "craftingGeothermalGenerator",
+ RECIPE_ThermalBoilerController);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ ALLOY.MARAGING350.getPlate(1),
+ "plateStainlessSteel",
+ ALLOY.MARAGING350.getPlate(1),
+ "circuitAdvanced",
+ CI.machineCasing_HV,
+ "circuitAdvanced",
+ ALLOY.MARAGING350.getPlate(1),
+ ALLOY.MARAGING350.getPlate(1),
+ ALLOY.MARAGING350.getPlate(1),
+ RECIPE_ThermalBoilerCasing);
+
+ // Lava Filter Recipe
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(18),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCarbon", 32),
+ ItemUtils.getItemStackOfAmountFromOreDict("wireFineSteel", 32),
+ ItemUtils.getItemStackOfAmountFromOreDict("ringTumbaga", 16),
+ ItemUtils.getItemStackOfAmountFromOreDict("foilCopper", 4),
+ ItemUtils.getItemStackWithMeta(true, "IC2:itemPartCarbonMesh", "RawCarbonMesh", 0, 64), },
+ CI.getTieredFluid(3, 144),
+ ItemUtils.getSimpleStack(ModItems.itemLavaFilter, 16),
+ 1600,
+ 240);
+ }
+
+ // Air Intake Hatch
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.component_Plate[6],
+ ItemList.Casing_Grate.get(1),
+ CI.component_Plate[6],
+ CI.component_Plate[6],
+ CI.getFluidRegulator(5, 1),
+ CI.component_Plate[6],
+ CI.getTieredCircuit(5),
+ ItemList.Hatch_Input_IV.get(1),
+ CI.getTieredCircuit(5),
+ GregtechItemList.Hatch_Air_Intake.get(1));
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getPlate(7, 1),
+ GregtechItemList.Hatch_Air_Intake.get(1),
+ CI.getPlate(7, 1),
+ CI.getPlate(7, 1),
+ CI.getFluidRegulator(7, 1),
+ CI.getPlate(7, 1),
+ CI.getTieredCircuit(7),
+ ItemList.Hatch_Input_ZPM.get(1),
+ CI.getTieredCircuit(7),
+ GregtechItemList.Hatch_Air_Intake_Extreme.get(1));
+
+ if (CORE.ConfigSwitches.enableMultiblock_LiquidFluorideThoriumReactor) {
+
+ // Thorium Reactor
+ RECIPE_LFTRController = GregtechItemList.ThoriumReactor.get(1);
+ RECIPE_LFTRInnerCasing = GregtechItemList.Casing_Reactor_II.get(1); // Zeron
+ RECIPE_LFTROuterCasing = GregtechItemList.Casing_Reactor_I.get(1); // Hastelloy
+
+ ItemStack controlCircuit = ItemUtils.getSimpleStack(ModItems.itemCircuitLFTR);
+ RecipeUtils.addShapedGregtechRecipe(
+ controlCircuit,
+ "cableGt12Naquadah",
+ controlCircuit,
+ "plateDoubleHastelloyN",
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ "plateDoubleHastelloyN",
+ "plateThorium232",
+ CI.machineHull_IV,
+ "plateThorium232",
+ RECIPE_LFTRController);
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateDoubleHastelloyC276",
+ CI.craftingToolScrewdriver,
+ "plateDoubleHastelloyC276",
+ "gearGtTalonite",
+ CI.fieldGenerator_LV,
+ "gearGtTalonite",
+ "plateDoubleHastelloyC276",
+ CI.craftingToolHammer_Hard,
+ "plateDoubleHastelloyC276",
+ RECIPE_LFTRInnerCasing);
+
+ ItemStack IC2HeatPlate = ItemUtils.getItemStackFromFQRN("IC2:reactorPlatingHeat", 1);
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateDoubleHastelloyN",
+ IC2HeatPlate,
+ "plateDoubleHastelloyN",
+ IC2HeatPlate,
+ "frameGtHastelloyC276",
+ IC2HeatPlate,
+ "plateDoubleHastelloyN",
+ IC2HeatPlate,
+ "plateDoubleHastelloyN",
+ RECIPE_LFTROuterCasing);
+
+ // LFTR Control Circuit
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(6), 1),
+ CI.fieldGenerator_HV },
+ null,
+ controlCircuit,
+ 240 * 20,
+ 500);
+
+ // Fission Fuel Plant
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getTieredCircuitOreDictName(5),
+ CI.craftingToolSolderingIron,
+ CI.getTieredCircuitOreDictName(5),
+ "plateDenseTungstenSteel",
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ "plateDenseTungstenSteel",
+ "gearGtStellite",
+ CI.machineHull_IV,
+ "gearGtStellite",
+ GregtechItemList.Industrial_FuelRefinery.get(1));
+
+ ItemStack mInnerTank = ItemList.Super_Tank_IV.get(1);
+
+ // Incoloy Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateIncoloyDS",
+ "pipeHugeStaballoy",
+ "plateIncoloyDS",
+ "gearGtIncoloyDS",
+ mInnerTank,
+ "gearGtIncoloyDS",
+ "plateIncoloyDS",
+ "pipeHugeStaballoy",
+ "plateIncoloyDS",
+ GregtechItemList.Casing_Refinery_Internal.get(1));
+
+ // Hastelloy-N Sealant Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateIncoloyMA956",
+ "plateHastelloyN",
+ "plateIncoloyMA956",
+ "plateHastelloyN",
+ "frameGtHastelloyC276",
+ "plateHastelloyN",
+ "plateIncoloyMA956",
+ "plateHastelloyN",
+ "plateIncoloyMA956",
+ GregtechItemList.Casing_Refinery_External.get(1));
+
+ // Hastelloy-X Structural Casing
+ RecipeUtils.addShapedGregtechRecipe(
+ "ringInconel792",
+ "gearGtHastelloyX",
+ CI.component_Plate[5],
+ CI.craftingToolHammer_Hard,
+ "frameGtHastelloyC276",
+ CI.craftingToolWrench,
+ CI.component_Plate[5],
+ CI.getTieredMachineCasing(4),
+ "ringInconel792",
+ GregtechItemList.Casing_Refinery_Structural.get(1));
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getPlate(5, 1),
+ ALLOY.HASTELLOY_X.getPlateDouble(1),
+ CI.getPlate(5, 1),
+ CI.getPlate(5, 1),
+ CI.getTieredMachineCasing(5),
+ CI.getPlate(5, 1),
+ CI.getRobotArm(5, 1),
+ ItemList.Casing_FrostProof.get(1),
+ CI.getRobotArm(5, 1),
+ GregtechItemList.ColdTrap_IV.get(1));
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getPlate(7, 1),
+ ALLOY.HS188A.getPlateDouble(1),
+ CI.getPlate(7, 1),
+ CI.getPlate(7, 1),
+ GregtechItemList.ColdTrap_IV.get(1),
+ CI.getPlate(7, 1),
+ CI.getRobotArm(7, 1),
+ ItemList.Casing_FrostProof.get(1),
+ CI.getRobotArm(7, 1),
+ GregtechItemList.ColdTrap_ZPM.get(1));
+
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getFieldGenerator(3, 1),
+ CI.getRobotArm(5, 1),
+ CI.getPlate(5, 1),
+ ALLOY.HASTELLOY_N.getPlateDouble(1),
+ ItemList.Machine_IV_ChemicalReactor.get(1),
+ ALLOY.HASTELLOY_N.getPlateDouble(1),
+ CI.getPlate(5, 1),
+ ALLOY.HASTELLOY_N.getPlateDouble(1),
+ CI.getFieldGenerator(3, 1),
+ GregtechItemList.ReactorProcessingUnit_IV.get(1));
+ RecipeUtils.addShapedGregtechRecipe(
+ CI.getFieldGenerator(5, 1),
+ CI.getRobotArm(7, 1),
+ CI.getPlate(7, 1),
+ ALLOY.HS188A.getPlateDouble(1),
+ GregtechItemList.ReactorProcessingUnit_IV.get(1),
+ ALLOY.HS188A.getPlateDouble(1),
+ CI.getPlate(7, 1),
+ ALLOY.HS188A.getPlateDouble(1),
+ CI.getFieldGenerator(5, 1),
+ GregtechItemList.ReactorProcessingUnit_ZPM.get(1));
+
+ // Nuclear Salt Processing Plant Controller
+ RECIPE_SaltPlantController = GregtechItemList.Nuclear_Salt_Processing_Plant.get(1);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "plateOsmiridium",
+ GregtechItemList.ReactorProcessingUnit_IV.get(1),
+ "plateOsmiridium",
+ "plateRuridit",
+ CI.getTieredCircuitOreDictName(7),
+ "plateRuridit",
+ "plateOsmiridium",
+ GregtechItemList.ColdTrap_IV.get(1),
+ "plateOsmiridium",
+ RECIPE_SaltPlantController);
+ }
+
+ // Cyclotron
+ if (CORE.ConfigSwitches.enableMultiblock_Cyclotron) {
+ RECIPE_CyclotronController = GregtechItemList.COMET_Cyclotron.get(1);
+ RECIPE_CyclotronOuterCasing = GregtechItemList.Casing_Cyclotron_External.get(1);
+ RECIPE_CyclotronInnerCoil = GregtechItemList.Casing_Cyclotron_Coil.get(1);
+
+ // Outer Casing
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemList.Casing_FrostProof.get(1),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 0, 4), ALLOY.INCOLOY_DS.getPlate(8),
+ ALLOY.INCONEL_690.getScrew(16), ALLOY.EGLIN_STEEL.getLongRod(4), CI.getElectricPiston(3, 2) },
+ ALLOY.ZIRCONIUM_CARBIDE.getFluidStack(144 * 8), // Input Fluid
+ RECIPE_CyclotronOuterCasing,
+ 30 * 20 * 2,
+ MaterialUtils.getVoltageForTier(4));
+
+ // Inner Coil
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemList.Casing_Coil_Nichrome.get(1),
+ ItemUtils.simpleMetaStack("miscutils:itemDehydratorCoilWire", 1, 8),
+ ALLOY.INCOLOY_MA956.getPlate(8), ALLOY.TANTALLOY_61.getBolt(16), ALLOY.INCOLOY_020.getScrew(32),
+ CI.getFieldGenerator(4, 1) },
+ ALLOY.HG1223.getFluidStack(144 * 5), // Input Fluid
+ RECIPE_CyclotronInnerCoil,
+ 60 * 20 * 2,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Controller
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.machineHull_IV, ItemUtils.getSimpleStack(RECIPE_CyclotronInnerCoil, 2),
+ ALLOY.INCOLOY_020.getPlate(8), ALLOY.TANTALLOY_61.getGear(2), ALLOY.INCOLOY_MA956.getScrew(16),
+ ItemUtils.getItemStackOfAmountFromOreDict(CI.getTieredCircuitOreDictName(5), 16) },
+ ALLOY.INCOLOY_020.getFluidStack(144 * 9), // Input Fluid
+ RECIPE_CyclotronController,
+ 60 * 20 * 5,
+ MaterialUtils.getVoltageForTier(5));
+ }
+
+ // Mazut
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Controller_LargeSemifluidGenerator.get(1L),
+ CI.bitsd,
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_EV, 'P', ItemList.Electric_Piston_EV, 'E',
+ ItemList.Electric_Pump_EV, 'C', OrePrefixes.circuit.get(Materials.Data), 'W',
+ OrePrefixes.cableGt08.get(Materials.Electrum), 'G', ALLOY.INCONEL_792.getGear(1) });
+
+ if (CORE.ConfigSwitches.enableMultiblock_PowerSubstation) {
+ RecipeUtils.addShapedRecipe(
+ "screwTitanium",
+ "plateIncoloy020",
+ "screwTitanium",
+ "plateIncoloy020",
+ "frameGtIncoloyMA956",
+ "plateIncoloy020",
+ "screwTitanium",
+ "plateIncoloy020",
+ "screwTitanium",
+ GregtechItemList.Casing_Power_SubStation.get(1));
+
+ ItemStack mBattery = ItemUtils.getSimpleStack(ModItems.itemCircuitLFTR);
+
+ RecipeUtils.addShapedRecipe(
+ "plateIncoloyMA956",
+ mBattery,
+ "plateIncoloyMA956",
+ GregtechItemList.Casing_Power_SubStation.get(1),
+ GregtechItemList.Casing_Vanadium_Redox.get(1),
+ GregtechItemList.Casing_Power_SubStation.get(1),
+ "plateIncoloy020",
+ "plateIncoloyMA956",
+ "plateIncoloy020",
+ GregtechItemList.PowerSubStation.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialThermalCentrifuge) {
+ RecipeUtils.addShapedRecipe(
+ "plateRedSteel",
+ CI.craftingToolHammer_Hard,
+ "plateRedSteel",
+ "plateRedSteel",
+ "frameGtBlackSteel",
+ "plateRedSteel",
+ "plateRedSteel",
+ CI.craftingToolWrench,
+ "plateRedSteel",
+ GregtechItemList.Casing_ThermalCentrifuge.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedSteel, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.BlackSteel, 1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_ThermalCentrifuge.get(1L),
+ 50,
+ 16);
+
+ RecipeUtils.addShapedRecipe(
+ "plateRedSteel",
+ "circuitData",
+ "plateRedSteel",
+ "stickTalonite",
+ EV_MACHINE_ThermalCentrifuge,
+ "stickTalonite",
+ "plateRedSteel",
+ "gearGtTalonite",
+ "plateRedSteel",
+ GregtechItemList.Industrial_ThermalCentrifuge.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialWashPlant) {
+ RecipeUtils.addShapedRecipe(
+ "plateGrisium",
+ CI.craftingToolHammer_Hard,
+ "plateGrisium",
+ "plateTalonite",
+ "frameGtGrisium",
+ "plateTalonite",
+ "plateGrisium",
+ CI.craftingToolWrench,
+ "plateGrisium",
+ GregtechItemList.Casing_WashPlant.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.LEAGRISIUM.getPlate(4), ALLOY.TALONITE.getPlate(2),
+ ALLOY.LEAGRISIUM.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_WashPlant.get(1L),
+ 50,
+ 16);
+
+ RecipeUtils.addShapedRecipe(
+ "plateGrisium",
+ EV_MACHINE_OreWasher,
+ "plateGrisium",
+ "plateTalonite",
+ "circuitData",
+ "plateTalonite",
+ "plateGrisium",
+ EV_MACHINE_ChemicalBath,
+ "plateGrisium",
+ GregtechItemList.Industrial_WashPlant.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_LargeAutoCrafter) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GregtechItemList.Casing_Multi_Use.get(1), 1),
+ ItemList.Block_IridiumTungstensteel.get(1), CI.getTieredComponent(OrePrefixes.circuit, 2, 16),
+ CI.getTieredComponent(OrePrefixes.screw, 5, 32), CI.getTieredComponent(OrePrefixes.bolt, 5, 12),
+ CI.getTieredComponent(OrePrefixes.plate, 6, 8), },
+ CI.getTertiaryTieredFluid(6, 144 * (4)),
+ GregtechItemList.Casing_Autocrafter.get(1),
+ 20 * 60 * 2,
+ MaterialUtils.getVoltageForTier(5));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { GregtechItemList.Casing_Refinery_Structural.get(4),
+ ItemUtils.getSimpleStack(ModItems.itemCircuitLFTR, 1),
+ CI.getTieredComponent(OrePrefixes.cableGt08, 6, 16), CI.getTransmissionComponent(5, 2),
+ GregtechItemList.Gregtech_Computer_Cube.get(1), },
+ CI.getTieredFluid(7, 144 * 8),
+ GregtechItemList.GT4_Multi_Crafter.get(1),
+ 20 * 60 * 5,
+ MaterialUtils.getVoltageForTier(5));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GregtechItemList.Casing_Multi_Use.get(1), 1),
+ CI.getEmitter(4, 2), CI.getRobotArm(4, 2), CI.getTieredComponent(OrePrefixes.circuit, 2, 8),
+ CI.getTieredComponent(OrePrefixes.screw, 3, 8), CI.getTieredComponent(OrePrefixes.plate, 5, 4), },
+ CI.getAlternativeTieredFluid(5, 144 * 4),
+ ItemUtils.getSimpleStack(ModBlocks.blockProjectTable),
+ 20 * 30 * 3,
+ MaterialUtils.getVoltageForTier(4));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCuttingMachine) {
+ ItemStack plate = ALLOY.MARAGING300.getPlate(1);
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.craftingToolHammer_Hard,
+ plate,
+ "plateStellite",
+ "frameGtTalonite",
+ "plateStellite",
+ plate,
+ CI.craftingToolWrench,
+ plate,
+ GregtechItemList.Casing_CuttingFactoryFrame.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.MARAGING300.getPlate(4), ALLOY.STELLITE.getPlate(2),
+ ALLOY.TALONITE.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_CuttingFactoryFrame.get(1L),
+ 50,
+ 16);
+
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.getTieredCircuit(4),
+ plate,
+ "wireFinePlatinum",
+ IV_MACHINE_Cutter,
+ "wireFinePlatinum",
+ plate,
+ CI.getTieredCircuit(4),
+ plate,
+ GregtechItemList.Industrial_CuttingFactoryController.get(1));
+ }
+
+ // IV_MACHINE_Extruder
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialExtrudingMachine) {
+ ItemStack plate = ALLOY.INCONEL_690.getPlate(1);
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.craftingToolHammer_Hard,
+ plate,
+ "plateTalonite",
+ "frameGtStaballoy",
+ "plateTalonite",
+ plate,
+ CI.craftingToolWrench,
+ plate,
+ GregtechItemList.Casing_Extruder.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.INCONEL_690.getPlate(4), ALLOY.TALONITE.getPlate(2),
+ ALLOY.STABALLOY.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_Extruder.get(1L),
+ 50,
+ 16);
+
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.getTieredCircuit(5),
+ plate,
+ CI.electricPiston_IV,
+ IV_MACHINE_Extruder,
+ CI.electricPiston_IV,
+ plate,
+ CI.getTieredCircuit(5),
+ plate,
+ GregtechItemList.Industrial_Extruder.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialFishingPort) {
+ ItemStack plate = ALLOY.AQUATIC_STEEL.getPlate(1);
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.craftingToolHammer_Hard,
+ plate,
+ "plateEglinSteel",
+ "frameGtEglinSteel",
+ "plateEglinSteel",
+ plate,
+ CI.craftingToolWrench,
+ plate,
+ GregtechItemList.Casing_FishPond.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.AQUATIC_STEEL.getPlate(4), ALLOY.EGLIN_STEEL.getPlate(2),
+ ALLOY.EGLIN_STEEL.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_FishPond.get(1L),
+ 50,
+ 16);
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.getTieredCircuit(5),
+ plate,
+ "wireFineElectrum",
+ ItemUtils.getSimpleStack(ModBlocks.blockFishTrap),
+ "wireFineElectrum",
+ plate,
+ CI.getTieredCircuit(5),
+ plate,
+ GregtechItemList.Industrial_FishingPond.get(1));
+ }
+
+ if (true) {
+ // Advanced Vacuum Freezer
+ ItemStack plate = ALLOY.HG1223.getPlateDouble(1);
+ ItemStack gear = ALLOY.INCOLOY_MA956.getGear(1);
+ ItemStack frame = ALLOY.LAFIUM.getFrameBox(1);
+ ItemStack cell1 = ItemList.Reactor_Coolant_He_6.get(1);
+ ItemStack cell2 = ItemList.Reactor_Coolant_NaK_6.get(1);
+
+ RecipeUtils.addShapedRecipe(
+ plate,
+ gear,
+ plate,
+ cell1,
+ frame,
+ cell2,
+ plate,
+ gear,
+ plate,
+ GregtechItemList.Casing_AdvancedVacuum.get(1));
+ RecipeUtils.addShapedRecipe(
+ gear,
+ CI.getTieredCircuit(6),
+ gear,
+ CI.electricPiston_IV,
+ GregtechItemList.Casing_AdvancedVacuum.get(1),
+ CI.electricPiston_IV,
+ plate,
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ plate,
+ GregtechItemList.Industrial_Cryogenic_Freezer.get(1));
+
+ // Advanced Blast Furnace
+ plate = ALLOY.HASTELLOY_N.getPlateDouble(1);
+ gear = ALLOY.HASTELLOY_W.getGear(1);
+ frame = ALLOY.HASTELLOY_X.getFrameBox(1);
+ cell1 = ItemUtils.simpleMetaStack("IC2:reactorHeatSwitchDiamond:1", 1, 1);
+ cell2 = ItemUtils.simpleMetaStack("IC2:reactorVentGold:1", 1, 1);
+ ItemStack cell3 = ItemUtils.simpleMetaStack("IC2:reactorVentDiamond:1:1", 1, 1);
+
+ RecipeUtils.addShapedRecipe(
+ plate,
+ cell1,
+ plate,
+ cell3,
+ frame,
+ cell2,
+ plate,
+ gear,
+ plate,
+ GregtechItemList.Casing_Adv_BlastFurnace.get(1));
+ RecipeUtils.addShapedRecipe(
+ gear,
+ CI.getTieredCircuit(6),
+ gear,
+ CI.robotArm_IV,
+ GregtechItemList.Casing_Adv_BlastFurnace.get(1),
+ CI.robotArm_IV,
+ plate,
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ plate,
+ GregtechItemList.Machine_Adv_BlastFurnace.get(1));
+ // Hatch_Input_Pyrotheum
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Input_IV.get(1), GregtechItemList.Casing_Adv_BlastFurnace.get(1),
+ ALLOY.MARAGING250.getPlate(4), ALLOY.MARAGING300.getGear(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Elite, 2),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Hatch_Input_Pyrotheum.get(1L),
+ 50,
+ 16);
+ // Casing_Adv_BlastFurnace
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.HASTELLOY_X.getFrameBox(1), ALLOY.HASTELLOY_N.getPlateDouble(4),
+ ALLOY.HASTELLOY_W.getGear(1), ItemUtils.simpleMetaStack("IC2:reactorHeatSwitchDiamond:1", 1, 1),
+ ItemUtils.simpleMetaStack("IC2:reactorVentGold:1", 1, 1),
+ ItemUtils.simpleMetaStack("IC2:reactorVentDiamond:1:1", 1, 1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_Adv_BlastFurnace.get(1L),
+ 50,
+ 16);
+
+ // Advanced Implosion Compressor
+ plate = ItemUtils.getItemStackOfAmountFromOreDict("plateAlloyIridium", 1);
+ gear = ALLOY.LEAGRISIUM.getGear(1);
+ frame = ALLOY.CINOBITE.getFrameBox(1);
+ cell1 = ItemUtils.simpleMetaStack("IC2:reactorHeatSwitchDiamond:1", 1, 1);
+ cell2 = ItemUtils.simpleMetaStack("IC2:reactorVentGold:1", 1, 1);
+
+ RecipeUtils.addShapedRecipe(
+ gear,
+ CI.getTieredCircuit(6),
+ gear,
+ CI.fieldGenerator_IV,
+ CI.machineHull_ZPM,
+ CI.robotArm_IV,
+ plate,
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ plate,
+ GregtechItemList.Machine_Adv_ImplosionCompressor.get(1));
+
+ // Supply Depot
+ plate = ALLOY.TUNGSTEN_CARBIDE.getPlateDouble(1);
+ gear = ALLOY.TRINIUM_TITANIUM.getRing(1);
+ frame = ALLOY.TUNGSTEN_CARBIDE.getFrameBox(1);
+ cell1 = CI.conveyorModule_LuV;
+ cell2 = CI.electricMotor_LuV;
+ ItemStack casingAmazon = GregtechItemList.Casing_AmazonWarehouse.get(1);
+
+ RecipeUtils.addShapedRecipe(
+ plate,
+ ItemUtils.getItemStackOfAmountFromOreDict("cableGt12VanadiumGallium", 1),
+ plate,
+ cell1,
+ frame,
+ cell2,
+ plate,
+ gear,
+ plate,
+ GregtechItemList.Casing_AmazonWarehouse.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.TUNGSTEN_CARBIDE.getFrameBox(1), ALLOY.TUNGSTEN_CARBIDE.getPlateDouble(4),
+ ALLOY.TRINIUM_TITANIUM.getRing(1), ItemList.Electric_Motor_LuV.get(1),
+ ItemList.Conveyor_Module_LuV.get(1),
+ ItemUtils.getItemStackOfAmountFromOreDict("cableGt12VanadiumGallium", 1),
+ GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_AmazonWarehouse.get(1L),
+ 50,
+ 16);
+ RecipeUtils.addShapedRecipe(
+ casingAmazon,
+ CI.getTieredCircuit(7),
+ casingAmazon,
+ CI.robotArm_LuV,
+ ItemList.Machine_LuV_Unboxinator.get(1),
+ CI.robotArm_LuV,
+ CI.conveyorModule_LuV,
+ GregtechItemList.Gregtech_Computer_Cube.get(1),
+ CI.conveyorModule_LuV,
+ GregtechItemList.Amazon_Warehouse_Controller.get(1));
+
+ // Industrial Mixing Machine
+ RecipeUtils.addShapedRecipe(
+ "plateStaballoy",
+ CI.getTieredCircuit(5),
+ "plateStaballoy",
+ "plateZirconiumCarbide",
+ IV_MACHINE_Mixer,
+ "plateZirconiumCarbide",
+ "plateStaballoy",
+ CI.getTieredCircuit(5),
+ "plateStaballoy",
+ GregtechItemList.Industrial_Mixer.get(1));
+ }
+
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialMultiMachine) {
+ ItemStack plate = ALLOY.STABALLOY.getPlate(1);
+
+ ItemStack o_Compressor = ItemList.Machine_IV_Compressor.get(1);
+ ItemStack o_Lathe = ItemList.Machine_IV_Lathe.get(1);
+ ItemStack o_Electromagnet = ItemList.Machine_IV_Polarizer.get(1);
+ ItemStack o_Fermenter = ItemList.Machine_IV_Fermenter.get(1);
+ ItemStack o_Distillery = ItemList.Machine_IV_FluidExtractor.get(1);
+ ItemStack o_Extractor = ItemList.Machine_IV_Extractor.get(1);
+
+ RecipeUtils.addShapedRecipe(
+ plate,
+ CI.craftingToolHammer_Hard,
+ plate,
+ "plateStainlessSteel",
+ "frameGtZirconiumCarbide",
+ "plateStainlessSteel",
+ plate,
+ CI.craftingToolWrench,
+ plate,
+ GregtechItemList.Casing_Multi_Use.get(1));
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ALLOY.STABALLOY.getPlate(4),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 2),
+ ALLOY.ZIRCONIUM_CARBIDE.getFrameBox(1), GT_Utility.getIntegratedCircuit(1), },
+ GT_Values.NF,
+ GregtechItemList.Casing_Multi_Use.get(1L),
+ 50,
+ 16);
+
+ RecipeUtils.addShapedRecipe(
+ o_Compressor,
+ o_Lathe,
+ o_Electromagnet,
+ plate,
+ ItemUtils.getSimpleStack(ModBlocks.blockProjectTable),
+ plate,
+ o_Fermenter,
+ o_Distillery,
+ o_Extractor,
+ GregtechItemList.Industrial_MultiMachine.get(1));
+ }
+
+ /*
+ * 6/1/19 - Content additions
+ */
+
+ // Drilling Platform Casings
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("frameGtTriniumNaquadahCarbonite", 4),
+ ItemUtils.getItemStackOfAmountFromOreDict("plateDoubleTriniumTitaniumAlloy", 1 * (1)),
+ ItemUtils.getItemStackOfAmountFromOreDict("gearGtPikyonium64B", 2 * (1)),
+ ALLOY.TRINIUM_REINFORCED_STEEL.getPlateDouble(4 * 1),
+ ItemUtils.getSimpleStack((CI.machineHull_LuV), 1 * 1), },
+ ALLOY.MARAGING350.getFluidStack(144 * 16 * 1),
+ GregtechItemList.Casing_BedrockMiner.get(1),
+ (int) GT_Values.V[4],
+ (int) GT_Values.V[6]);
+
+ int aCostMultiplier = 1;
+
+ // Reservoir Hatch
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Input_EV.get(1), GT_ModHandler.getModItem(RemoteIO.ID, "tile.machine", 1),
+ ItemList.Electric_Pump_EV.get(1) },
+ GT_Values.NF,
+ GregtechItemList.Hatch_Reservoir.get(1),
+ 100,
+ 1920);
+
+ // Mystic Frame
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { GregtechItemList.Casing_Multi_Use.get(1),
+ ItemList.Field_Generator_MV.get(1, CI.circuitTier7),
+ ItemList.Field_Generator_HV.get(1, CI.circuitTier7), ItemList.Emitter_HV.get(1, CI.circuitTier7),
+ ItemList.Sensor_HV.get(1, CI.circuitTier7),
+ CI.getTieredComponent(OrePrefixes.plate, 7, 8 * aCostMultiplier),
+ CI.getTieredComponent(OrePrefixes.wireGt08, 8, 4 * aCostMultiplier), },
+ CI.getTieredFluid(6, (144 * 8)), // Input Fluid
+ ItemUtils.getSimpleStack(Dimension_Everglades.blockPortalFrame, 2),
+ 45 * 20 * 1 * (6),
+ MaterialUtils.getVoltageForTier(6));
+
+ // Player Doors
+ ItemStack[] aDoorInputs = new ItemStack[] { ItemUtils.getSimpleStack(Blocks.log2),
+ ItemUtils.getSimpleStack(Blocks.iron_block), ItemUtils.getSimpleStack(Blocks.glass),
+ ItemUtils.getSimpleStack(Blocks.packed_ice), ItemUtils.getSimpleStack(Blocks.cactus), };
+ ItemStack[] aDoorOutputs = new ItemStack[] { ItemUtils.getSimpleStack(ModBlocks.blockPlayerDoorWooden),
+ ItemUtils.getSimpleStack(ModBlocks.blockPlayerDoorIron),
+ ItemUtils.getSimpleStack(ModBlocks.blockPlayerDoorCustom_Glass),
+ ItemUtils.getSimpleStack(ModBlocks.blockPlayerDoorCustom_Ice),
+ ItemUtils.getSimpleStack(ModBlocks.blockPlayerDoorCustom_Cactus), };
+
+ for (int y = 0; y < aDoorInputs.length; y++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(Items.iron_door), aDoorInputs[y],
+ ItemList.Sensor_LV.get(1, CI.circuitTier7),
+ CI.getTieredComponent(OrePrefixes.plate, 1, 2 * aCostMultiplier),
+ CI.getTieredComponent(OrePrefixes.wireGt02, 1, 2 * aCostMultiplier),
+ ItemUtils.getSimpleStack(Items.redstone, 16) },
+ CI.getTieredFluid(1, (144 * 2)), // Input Fluid
+ aDoorOutputs[y],
+ 100,
+ MaterialUtils.getVoltageForTier(1));
+ }
+
+ Logger.INFO("Done loading recipes for the Various machine blocks.");
+ }
+
+ private static void energyCores() {
+
+ ItemStack[] aBufferOutput = new ItemStack[] { RECIPE_Buffer_ULV, RECIPE_Buffer_LV, RECIPE_Buffer_MV,
+ RECIPE_Buffer_HV, RECIPE_Buffer_EV, RECIPE_Buffer_IV, RECIPE_Buffer_LuV, RECIPE_Buffer_ZPM,
+ RECIPE_Buffer_UV, RECIPE_Buffer_MAX };
+
+ ItemStack[] aOutput = new ItemStack[] {
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "1", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "2", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "3", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "4", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "5", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "6", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "7", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "8", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "9", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "10", 1) };
+
+ for (int i = 0; i < 10; i++) {
+
+ ItemStack aPrevTier = (i == 0 ? CI.getTieredMachineHull(1) : aOutput[i - 1]);
+ aPrevTier.stackSize = 1;
+ int aTier = (i + 1);
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { aPrevTier, CI.getTieredComponent(OrePrefixes.plate, aTier, 4),
+ CI.getTieredComponent(OrePrefixes.cableGt04, i, 2),
+ CI.getTieredComponent(OrePrefixes.circuit, aTier, 2),
+ CI.getTieredComponent(OrePrefixes.screw, aTier, 6),
+ CI.getTieredComponent(OrePrefixes.bolt, i, 12), },
+ CI.getTieredFluid(i, (144 * 4 * aTier)), // Input Fluid
+ aOutput[i],
+ 45 * 10 * 1 * (aTier),
+ MaterialUtils.getVoltageForTier(i));
+
+ // Energy Buffer
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(aOutput[i], 4),
+ CI.getTieredComponent(OrePrefixes.plate, aTier, 8),
+ CI.getTieredComponent(OrePrefixes.wireGt08, i, 4), CI.getTieredComponent(OrePrefixes.circuit, i, 4),
+ CI.getTieredComponent(OrePrefixes.stickLong, aTier, 4),
+ CI.getTieredComponent(OrePrefixes.gearGt, i, 5), },
+ CI.getTieredFluid(aTier, (144 * 16 * aTier)), // Input Fluid
+ aBufferOutput[i],
+ 45 * 20 * 1 * (aTier),
+ MaterialUtils.getVoltageForTier(i));
+ }
+ }
+
+ private static void wirelessChargers() {
+
+ ItemStack[] aChargers = new ItemStack[] { GregtechItemList.Charger_LV.get(1),
+ GregtechItemList.Charger_MV.get(1), GregtechItemList.Charger_HV.get(1), GregtechItemList.Charger_EV.get(1),
+ GregtechItemList.Charger_IV.get(1), GregtechItemList.Charger_LuV.get(1),
+ GregtechItemList.Charger_ZPM.get(1), GregtechItemList.Charger_UV.get(1),
+ GregtechItemList.Charger_UHV.get(1) };
+
+ for (int tier = 1; tier < aChargers.length + 1; tier++) {
+
+ ItemStack[] aInputs = new ItemStack[] { CI.getTieredMachineHull(tier, 1),
+ CI.getTransmissionComponent(tier, 2), CI.getFieldGenerator(tier, 1),
+ CI.getTieredComponent(OrePrefixes.plate, tier + 1, 4),
+ CI.getTieredComponent(OrePrefixes.circuit, tier + 1, 2), };
+ CORE.RA.addSixSlotAssemblingRecipe(
+ aInputs,
+ CI.getAlternativeTieredFluid(tier, (144 * 2 * (tier + 1))), // Input Fluid
+ aChargers[tier - 1],
+ 45 * 10 * (tier + 1),
+ MaterialUtils.getVoltageForTier(tier));
+ }
+ }
+
+ private static void largeArcFurnace() {
+ int aCostMultiplier = 1;
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { GregtechItemList.Casing_Multi_Use.get(aCostMultiplier),
+ CI.getTransmissionComponent(2, 2 * aCostMultiplier), CI.getElectricPiston(4, 2 * aCostMultiplier),
+ CI.getTieredComponent(OrePrefixes.plate, 5, 4 * aCostMultiplier),
+ CI.getTieredComponent(OrePrefixes.pipeSmall, 4, 1 * aCostMultiplier), },
+ CI.getAlternativeTieredFluid(5, (144 * 2 * 4)), // Input Fluid
+ GregtechItemList.Casing_Industrial_Arc_Furnace.get(1),
+ 20 * 10 * 1 * (6),
+ MaterialUtils.getVoltageForTier(5));
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { GregtechItemList.Casing_Industrial_Arc_Furnace.get(1),
+ CI.getFieldGenerator(4, 2 * aCostMultiplier), CI.getRobotArm(5, 4 * aCostMultiplier),
+ CI.getEnergyCore(4, 2 * aCostMultiplier),
+ CI.getTieredComponent(OrePrefixes.plate, 6, 8 * aCostMultiplier),
+ CI.getTieredComponent(OrePrefixes.circuit, 5, 8 * aCostMultiplier), },
+ CI.getAlternativeTieredFluid(6, (144 * 4 * 5)), // Input Fluid
+ GregtechItemList.Industrial_Arc_Furnace.get(1),
+ 60 * 20 * 8,
+ MaterialUtils.getVoltageForTier(6));
+ }
+
+ private static void industrialVacuumFurnace() {
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { GregtechItemList.Casing_Multi_Use.get(1), CI.getHeatCoil(2), CI.getElectricPiston(3, 2),
+ CI.getTieredComponent(OrePrefixes.plate, 6, 4), CI.getTieredComponent(OrePrefixes.gearGt, 6, 2), },
+ CI.getTertiaryTieredFluid(5, (144 * 2 * 4)), // Input Fluid
+ GregtechItemList.Casing_Vacuum_Furnace.get(1),
+ 20 * 10 * 6,
+ MaterialUtils.getVoltageForTier(6));
+
+ ;
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { GregtechItemList.Casing_Vacuum_Furnace.get(1),
+ CI.getTieredComponent(OrePrefixes.wireGt16, 7, 4), CI.getEnergyCore(5, 1), CI.getRobotArm(4, 4),
+ CI.getTieredComponent(OrePrefixes.plate, 6, 8), CI.getTieredComponent(OrePrefixes.circuit, 6, 8), },
+ CI.getTieredFluid(6, (144 * 4 * 5)), // Input Fluid
+ GregtechItemList.Controller_Vacuum_Furnace.get(1),
+ 60 * 20 * 12,
+ MaterialUtils.getVoltageForTier(6));
+ }
+
+ private static void milling() {
+
+ /*
+ * public static ItemStack RECIPE_ISAMill_Controller; public static ItemStack RECIPE_ISAMill_Gearbox; public
+ * static ItemStack RECIPE_ISAMill_Casing; public static ItemStack RECIPE_ISAMill_Hatch; public static ItemStack
+ * RECIPE_Flotation_Controller; public static ItemStack RECIPE_Flotation_Casing;
+ */
+
+ // Isa Mill Controller
+ CORE.RA.addAssemblylineRecipe(
+ ItemList.Machine_IV_Macerator.get(1),
+ 20 * 60 * 20,
+ new Object[] { GregtechItemList.Casing_IsaMill_Gearbox.get(4), CI.getTieredGTPPMachineCasing(6, 4),
+ ItemList.Component_Grinder_Tungsten.get(16), new Object[] { CI.getTieredCircuitOreDictName(6), 8 },
+ ALLOY.INCONEL_625.getGear(8), ALLOY.INCONEL_625.getPlate(32), ALLOY.ZERON_100.getPlateDouble(8),
+ ALLOY.ZERON_100.getPlateDouble(8), ALLOY.ZERON_100.getScrew(64),
+ CI.getTieredComponentOfMaterial(Materials.NiobiumTitanium, OrePrefixes.wireFine, 32),
+ CI.getTieredComponentOfMaterial(Materials.NiobiumTitanium, OrePrefixes.wireFine, 32),
+ CI.getTieredComponentOfMaterial(Materials.Titanium, OrePrefixes.foil, 16),
+ CI.getTieredComponentOfMaterial(Materials.Titanium, OrePrefixes.foil, 16), },
+ new FluidStack[] { CI.getTieredFluid(6, 16 * 144), CI.getAlternativeTieredFluid(6, 32 * 144),
+ CI.getTertiaryTieredFluid(6, 32 * 144) },
+ GregtechItemList.Controller_IsaMill.get(1),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Isa Mill Gearbox
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(7), ItemList.Casing_Gearbox_Titanium.get(2),
+ ALLOY.INCONEL_625.getGear(4),
+ CI.getTieredComponentOfMaterial(Materials.HSSE, OrePrefixes.gearGtSmall, 8),
+ ALLOY.INCONEL_625.getPlate(16), ALLOY.ZERON_100.getBolt(16), },
+ ALLOY.TUNGSTENSTEEL.getFluidStack(8 * 144),
+ GregtechItemList.Casing_IsaMill_Gearbox.get(1),
+ 60 * 20 * 2,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Isa Mill Casing
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(7), CI.getTieredGTPPMachineCasing(5, 1),
+ ALLOY.INCONEL_625.getPlate(8), ALLOY.ZERON_100.getRod(4),
+ CI.getTieredComponentOfMaterial(Materials.HSSG, OrePrefixes.gearGtSmall, 4),
+ ALLOY.ZERON_100.getScrew(8), },
+ ELEMENT.getInstance().TITANIUM.getFluidStack(4 * 144),
+ GregtechItemList.Casing_IsaMill_Casing.get(1),
+ 60 * 20 * 2,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Isa Mill Pipe
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(7), CI.getTieredGTPPMachineCasing(4, 2),
+ ALLOY.INCONEL_625.getPlateDouble(4), ALLOY.INCOLOY_MA956.getRing(8),
+ CI.getTieredComponentOfMaterial(Materials.HSSE, OrePrefixes.plate, 8),
+ ALLOY.INCOLOY_MA956.getBolt(16), },
+ ELEMENT.getInstance().ALUMINIUM.getFluidStack(8 * 144),
+ GregtechItemList.Casing_IsaMill_Pipe.get(1),
+ 60 * 20 * 8,
+ MaterialUtils.getVoltageForTier(4));
+
+ // Flotation Cell Controller
+ CORE.RA.addAssemblylineRecipe(
+ ItemList.Distillation_Tower.get(1),
+ 20 * 60 * 20,
+ new Object[] { GregtechItemList.Casing_Flotation_Cell.get(4), CI.getTieredGTPPMachineCasing(5, 4),
+ ItemList.Machine_IV_Distillery.get(1), new Object[] { CI.getTieredCircuitOreDictName(6), 8 },
+ ALLOY.STELLITE.getGear(8), ALLOY.STELLITE.getPlate(32), ALLOY.HASTELLOY_N.getPlateDouble(8),
+ ALLOY.HASTELLOY_N.getPlateDouble(8), ALLOY.HASTELLOY_N.getScrew(64),
+ CI.getTieredComponentOfMaterial(Materials.YttriumBariumCuprate, OrePrefixes.wireFine, 64),
+ CI.getTieredComponentOfMaterial(Materials.YttriumBariumCuprate, OrePrefixes.wireFine, 64),
+ CI.getTieredComponentOfMaterial(Materials.Platinum, OrePrefixes.foil, 32),
+ CI.getTieredComponentOfMaterial(Materials.Platinum, OrePrefixes.foil, 32), },
+ new FluidStack[] { CI.getTieredFluid(5, 16 * 144), CI.getAlternativeTieredFluid(4, 32 * 144),
+ CI.getTertiaryTieredFluid(4, 32 * 144) },
+ GregtechItemList.Controller_Flotation_Cell.get(1),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Flotation Cell Casing
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(7), CI.getTieredGTPPMachineCasing(4, 1),
+ ALLOY.AQUATIC_STEEL.getPlate(8), ALLOY.STELLITE.getRing(8),
+ CI.getTieredComponentOfMaterial(Materials.HSSG, OrePrefixes.plateDouble, 4),
+ ALLOY.HASTELLOY_N.getScrew(8), },
+ ALLOY.STAINLESS_STEEL.getFluidStack(8 * 144),
+ GregtechItemList.Casing_Flotation_Cell.get(1),
+ 60 * 20 * 2,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Milling Bus
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(7), CI.getTieredGTPPMachineCasing(5, 1),
+ ItemList.Hatch_Input_Bus_EV.get(1),
+ CI.getTieredComponentOfMaterial(Materials.Titanium, OrePrefixes.gearGt, 8),
+ CI.getTieredComponentOfMaterial(Materials.TungstenSteel, OrePrefixes.plate, 32),
+ CI.getTieredComponentOfMaterial(Materials.SolderingAlloy, OrePrefixes.wireFine, 16), },
+ ELEMENT.getInstance().TUNGSTEN.getFluidStack(8 * 144),
+ GregtechItemList.Bus_Milling_Balls.get(1),
+ 60 * 20 * 4,
+ MaterialUtils.getVoltageForTier(5));
+ }
+
+ private static void sparging() {
+
+ // Sparge Tower Research
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(8), ELEMENT.getInstance().HELIUM.getCell(8),
+ ELEMENT.getInstance().FLUORINE.getCell(8), ALLOY.HS188A.getIngot(8),
+ ItemList.Distillation_Tower.get(1) },
+ null,
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_10_SPARGING, 1),
+ 60 * 20 * 5,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Sparge Tower Controller
+ CORE.RA.addAssemblylineRecipe(
+ ItemDummyResearch.getResearchStack(ASSEMBLY_LINE_RESEARCH.RESEARCH_10_SPARGING, 1),
+ 20 * 60 * 20,
+ new Object[] { GregtechItemList.Casing_Sparge_Tower_Exterior.get(4), CI.getTieredGTPPMachineCasing(4, 4),
+ ItemList.Machine_IV_Distillery.get(1), new Object[] { CI.getTieredCircuitOreDictName(5), 8 },
+ ALLOY.HS188A.getGear(8), ALLOY.HS188A.getPlate(32), ALLOY.HASTELLOY_N.getPlateDouble(8),
+ ALLOY.HASTELLOY_N.getPlateDouble(8), ALLOY.HASTELLOY_N.getScrew(64),
+ CI.getTieredComponentOfMaterial(Materials.YttriumBariumCuprate, OrePrefixes.wireFine, 64),
+ CI.getTieredComponentOfMaterial(Materials.YttriumBariumCuprate, OrePrefixes.wireFine, 64),
+ CI.getTieredComponentOfMaterial(Materials.Platinum, OrePrefixes.foil, 32),
+ CI.getTieredComponentOfMaterial(Materials.Platinum, OrePrefixes.foil, 32), },
+ new FluidStack[] { CI.getTieredFluid(4, 16 * 144), CI.getAlternativeTieredFluid(3, 32 * 144),
+ CI.getTertiaryTieredFluid(3, 32 * 144) },
+ GregtechItemList.Controller_Sparge_Tower.get(1),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(6));
+
+ // Sparge Tower Casing
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(8), CI.getTieredGTPPMachineCasing(3, 1),
+ ALLOY.HS188A.getPlate(2), ALLOY.HASTELLOY_N.getRing(4),
+ CI.getTieredComponentOfMaterial(Materials.TungstenSteel, OrePrefixes.plateDouble, 4),
+ ALLOY.HASTELLOY_N.getScrew(4), },
+ ALLOY.STAINLESS_STEEL.getFluidStack(8 * 144),
+ GregtechItemList.Casing_Sparge_Tower_Exterior.get(1),
+ 60 * 20 * 2,
+ MaterialUtils.getVoltageForTier(5));
+ }
+
+ private static void chisels() {
+ ItemStack[] aChisels = new ItemStack[] { GregtechItemList.GT_Chisel_LV.get(1),
+ GregtechItemList.GT_Chisel_MV.get(1), GregtechItemList.GT_Chisel_HV.get(1), };
+ for (int i = 1; i < 4; i++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(10 + i), CI.getTieredMachineCasing(i), CI.getPlate(i, 4),
+ CI.getElectricMotor(i, 2), CI.getConveyor(i, 2), CI.getRobotArm(i, 1) },
+ CI.getTieredFluid(i, 144 * 4),
+ aChisels[i - 1],
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(i));
+ }
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(14), aChisels[2], CI.getPlate(4, 8), CI.getElectricMotor(4, 8),
+ CI.getConveyor(4, 8), CI.getRobotArm(4, 4) },
+ CI.getTieredFluid(4, 144 * 8),
+ GregtechItemList.Controller_IndustrialAutoChisel.get(1),
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(4));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(14), ItemList.Casing_SolidSteel.get(2), CI.getPlate(4, 2),
+ CI.getTieredComponent(OrePrefixes.plate, 3, 4), CI.getTieredComponent(OrePrefixes.ring, 3, 8),
+ CI.getTieredComponent(OrePrefixes.rod, 2, 4), },
+ CI.getTieredFluid(2, 144 * 2),
+ GregtechItemList.Casing_IndustrialAutoChisel.get(1),
+ 20 * 20,
+ MaterialUtils.getVoltageForTier(3));
+ }
+
+ private static void rockBreaker() {
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(12), ItemList.Machine_EV_RockBreaker.get(1),
+ ALLOY.STAINLESS_STEEL.getPlate(8), ALLOY.STAINLESS_STEEL.getRing(4),
+ CI.getTieredComponentOfMaterial(Materials.Aluminium, OrePrefixes.plateDouble, 8),
+ ALLOY.EGLIN_STEEL.getScrew(8), },
+ ELEMENT.getInstance().ALUMINIUM.getFluidStack(144 * 8),
+ GregtechItemList.Controller_IndustrialRockBreaker.get(1),
+ 60 * 20 * 2,
+ MaterialUtils.getVoltageForTier(4));
+ }
+
+ private static void fakeMachineCasingCovers() {
+ int aMaxTier = GT_Values.VOLTAGE_NAMES.length;
+ ItemStack aTier[] = new ItemStack[aMaxTier];
+ for (int i = 0; i < aMaxTier; i++) {
+ aTier[i] = ItemUtils.simpleMetaStack(CoverManager.Cover_Gt_Machine_Casing, i, 7);
+ }
+ // Add recipes for new ones
+ for (int i = 0; i < aMaxTier; i++) {
+ GT_Values.RA
+ .addCutterRecipe(CI.getTieredMachineCasing(i), aTier[i], null, 20 * 5 * i, (int) GT_Values.V[i]);
+ }
+ }
+
+ private static void superBuses() {
+ GregtechItemList[] mSuperBusesInput = new GregtechItemList[] { GregtechItemList.Hatch_SuperBus_Input_LV,
+ GregtechItemList.Hatch_SuperBus_Input_MV, GregtechItemList.Hatch_SuperBus_Input_HV,
+ GregtechItemList.Hatch_SuperBus_Input_EV, GregtechItemList.Hatch_SuperBus_Input_IV,
+ GregtechItemList.Hatch_SuperBus_Input_LuV, GregtechItemList.Hatch_SuperBus_Input_ZPM,
+ GregtechItemList.Hatch_SuperBus_Input_UV, GregtechItemList.Hatch_SuperBus_Input_MAX, };
+
+ GregtechItemList[] mSuperBusesOutput = new GregtechItemList[] { GregtechItemList.Hatch_SuperBus_Output_LV,
+ GregtechItemList.Hatch_SuperBus_Output_MV, GregtechItemList.Hatch_SuperBus_Output_HV,
+ GregtechItemList.Hatch_SuperBus_Output_EV, GregtechItemList.Hatch_SuperBus_Output_IV,
+ GregtechItemList.Hatch_SuperBus_Output_LuV, GregtechItemList.Hatch_SuperBus_Output_ZPM,
+ GregtechItemList.Hatch_SuperBus_Output_UV, GregtechItemList.Hatch_SuperBus_Output_MAX, };
+
+ ItemStack[] mInputHatch = new ItemStack[] { ItemList.Hatch_Input_Bus_EV.get(1),
+ ItemList.Hatch_Input_Bus_IV.get(1), ItemList.Hatch_Input_Bus_LuV.get(1),
+ ItemList.Hatch_Input_Bus_ZPM.get(1), ItemList.Hatch_Input_Bus_UV.get(1),
+ ItemList.Hatch_Input_Bus_MAX.get(1), GregtechItemList.Hatch_SuperBus_Input_LV.get(1),
+ GregtechItemList.Hatch_SuperBus_Input_MV.get(1), GregtechItemList.Hatch_SuperBus_Input_HV.get(1),
+ GregtechItemList.Hatch_SuperBus_Input_EV.get(1), };
+
+ ItemStack[] mOutputHatch = new ItemStack[] { ItemList.Hatch_Output_Bus_EV.get(1),
+ ItemList.Hatch_Output_Bus_IV.get(1), ItemList.Hatch_Output_Bus_LuV.get(1),
+ ItemList.Hatch_Output_Bus_ZPM.get(1), ItemList.Hatch_Output_Bus_UV.get(1),
+ ItemList.Hatch_Output_Bus_MAX.get(1), GregtechItemList.Hatch_SuperBus_Output_LV.get(1),
+ GregtechItemList.Hatch_SuperBus_Output_MV.get(1), GregtechItemList.Hatch_SuperBus_Output_HV.get(1),
+ GregtechItemList.Hatch_SuperBus_Output_EV.get(1), };
+
+ // Input Buses
+ for (int tier = 1; tier < mSuperBusesInput.length + 1; tier++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17), mInputHatch[tier - 1], CI.getElectricMotor(tier, 2),
+ CI.getConveyor(tier, 5), CI.getBolt(tier, 16),
+ CI.getTieredComponent(OrePrefixes.circuit, tier, 2) },
+ CI.getAlternativeTieredFluid(tier, 144 * 8),
+ mSuperBusesInput[tier - 1].get(1),
+ 20 * 30 * 2,
+ (int) GT_Values.V[tier]);
+ }
+ // Output Buses
+ for (int tier = 1; tier < mSuperBusesOutput.length + 1; tier++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(18), mOutputHatch[tier - 1], CI.getElectricPiston(tier, 2),
+ CI.getConveyor(tier, 5), CI.getGear(tier, 3), CI.getTieredComponent(OrePrefixes.circuit, tier, 2) },
+ CI.getTertiaryTieredFluid(tier, 144 * 8),
+ mSuperBusesOutput[tier - 1].get(1),
+ 20 * 30 * 2,
+ (int) GT_Values.V[tier]);
+ }
+ }
+
+ private static void chiselBuses() {
+ ItemStack[] mSuperBusesInput = new ItemStack[] { GregtechItemList.Hatch_SuperBus_Input_LV.get(1),
+ GregtechItemList.Hatch_SuperBus_Input_MV.get(1), GregtechItemList.Hatch_SuperBus_Input_HV.get(1), };
+
+ ItemStack[] mChiselBuses = new ItemStack[] { GregtechItemList.GT_MetaTileEntity_ChiselBus_LV.get(1),
+ GregtechItemList.GT_MetaTileEntity_ChiselBus_MV.get(1),
+ GregtechItemList.GT_MetaTileEntity_ChiselBus_HV.get(1), };
+
+ for (int tier = 1; tier < mChiselBuses.length + 1; tier++) {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17), mSuperBusesInput[tier - 1], CI.getSensor(tier, 1),
+ CI.getRobotArm(tier, 2), CI.getBolt(tier, 16), ItemUtils.getSimpleStack(Blocks.chest) },
+ CI.getAlternativeTieredFluid(tier, 144 * 2),
+ mChiselBuses[tier - 1],
+ 20 * 30 * 2,
+ (int) GT_Values.VP[tier + 1]);
+ }
+ }
+
+ private static void solidifierHatches() {
+ ItemStack[] mSuperBusesInput = new ItemStack[] { ItemList.Hatch_Input_IV.get(1),
+ ItemList.Hatch_Input_LuV.get(1), ItemList.Hatch_Input_ZPM.get(1), ItemList.Hatch_Input_UV.get(1), };
+
+ ItemStack[] mSolidifierHatches = new ItemStack[] { GregtechItemList.GT_MetaTileEntity_Solidifier_I.get(1),
+ GregtechItemList.GT_MetaTileEntity_Solidifier_II.get(1),
+ GregtechItemList.GT_MetaTileEntity_Solidifier_III.get(1),
+ GregtechItemList.GT_MetaTileEntity_Solidifier_IV.get(1), };
+
+ for (int i = 0; i < 4; i++) {
+ int componentTier = i + 5;
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17), mSuperBusesInput[i], CI.getSensor(componentTier, 1),
+ CI.getFluidRegulator(componentTier, 1),
+ CI.getTieredComponent(OrePrefixes.circuit, componentTier + 1, 4),
+ ItemUtils.getSimpleStack(Blocks.chest) },
+ CI.getTieredFluid(componentTier, 144 * 2),
+ mSolidifierHatches[i],
+ 20 * 30,
+ (int) GT_Values.VP[componentTier]);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_RareEarthProcessing.java b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_RareEarthProcessing.java
new file mode 100644
index 0000000000..0cf0152c53
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_RareEarthProcessing.java
@@ -0,0 +1,168 @@
+package gtPlusPlus.core.recipe;
+
+import static gregtech.api.recipe.RecipeMaps.brewingRecipes;
+import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
+import static gregtech.api.recipe.RecipeMaps.electrolyzerRecipes;
+import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gtPlusPlus.core.material.MISC_MATERIALS.BRINE;
+import static gtPlusPlus.core.material.MISC_MATERIALS.HYDROGEN_CHLORIDE;
+import static gtPlusPlus.core.material.MISC_MATERIALS.HYDROGEN_CHLORIDE_MIX;
+import static gtPlusPlus.core.material.MISC_MATERIALS.RARE_EARTH_HIGH;
+import static gtPlusPlus.core.material.MISC_MATERIALS.RARE_EARTH_LOW;
+import static gtPlusPlus.core.material.MISC_MATERIALS.RARE_EARTH_MID;
+
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.ORES;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class RECIPES_RareEarthProcessing {
+
+ public static void init() {
+
+ // Brine Check and assignment
+ FluidStack mBrine = FluidUtils.getFluidStack("brine", 1000);
+ if (mBrine == null) {
+ Fluid f = BRINE.generateFluid();
+ BRINE.registerComponentForMaterial(FluidUtils.getFluidStack(f, 1000));
+ mBrine = BRINE.getFluidStack(1000);
+ } else {
+ BRINE.registerComponentForMaterial(FluidUtils.getFluidStack(mBrine, 1000));
+ }
+
+ // Hydrogen Chloride Check and assignment
+ FluidStack mHydrogenChloride = FluidUtils.getFluidStack("hydrogenchloride", 1000);
+ if (mHydrogenChloride == null) {
+ HYDROGEN_CHLORIDE.generateFluid();
+ mHydrogenChloride = BRINE.getFluidStack(1000);
+ } else {
+ HYDROGEN_CHLORIDE.registerComponentForMaterial(FluidUtils.getFluidStack(mHydrogenChloride, 1000));
+ }
+
+ // Add Process for creating Brine
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 16L))
+ .fluidInputs(Materials.SaltWater.getFluid(2000L))
+ .fluidOutputs(FluidUtils.getFluidStack(mBrine, 4000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(brewingRecipes);
+
+ // Chloralkali process
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1), ItemList.Cell_Empty.get(2L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Chlorine, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 1L))
+ .fluidInputs(FluidUtils.getFluidStack(mBrine, 2000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(electrolyzerRecipes);
+
+ // Generate Special Laser Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Chlorine, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 1L),
+ CI.getNumberedBioCircuit(2))
+ .itemOutputs(ItemUtils.getSimpleStack(ModItems.cellHydrogenChlorideMix, 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GregtechItemList.Laser_Lens_WoodsGlass.get(0))
+ .fluidInputs(HYDROGEN_CHLORIDE_MIX.getFluidStack(4000))
+ .fluidOutputs(HYDROGEN_CHLORIDE.getFluidStack(4000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .noOptimize()
+ .addTo(laserEngraverRecipes);
+
+ // Set Material Tiers correctly
+ ORES.GREENOCKITE.vTier = 1;
+ RARE_EARTH_LOW.vTier = 1;
+ RARE_EARTH_MID.vTier = 3;
+ RARE_EARTH_HIGH.vTier = 5;
+
+ // Set Material Voltages correctly
+ ORES.GREENOCKITE.vVoltageMultiplier = 30;
+ RARE_EARTH_LOW.vVoltageMultiplier = 30;
+ RARE_EARTH_MID.vVoltageMultiplier = 480;
+ RARE_EARTH_HIGH.vVoltageMultiplier = 7680;
+
+ // Set Material Tooltips to be shorter
+ RARE_EARTH_LOW.vChemicalFormula = "??????";
+ RARE_EARTH_MID.vChemicalFormula = "??????";
+ RARE_EARTH_HIGH.vChemicalFormula = "??????";
+
+ // Set Material Tooltips to be shorter
+ RARE_EARTH_LOW.vChemicalSymbol = "??";
+ RARE_EARTH_MID.vChemicalSymbol = "??";
+ RARE_EARTH_HIGH.vChemicalSymbol = "??";
+
+ // Generate Ore Materials
+ MaterialGenerator.generateOreMaterial(RARE_EARTH_LOW);
+ MaterialGenerator.generateOreMaterial(RARE_EARTH_MID);
+ MaterialGenerator.generateOreMaterial(RARE_EARTH_HIGH);
+
+ // industrial strength HCl
+ Fluid aHydrochloric = FluidUtils.getFluidStack("hydrogenchloride", 1)
+ .getFluid();
+
+ // LV Rare Earth
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RareEarth, 3L))
+ .itemOutputs(RARE_EARTH_LOW.getCrushed(2), RARE_EARTH_LOW.getCrushed(2), RARE_EARTH_LOW.getCrushed(2))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(chemicalBathRecipes);
+
+ // HV Rare Earth
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RareEarth, 3L))
+ .itemOutputs(RARE_EARTH_MID.getCrushed(2), RARE_EARTH_MID.getCrushed(2), RARE_EARTH_MID.getCrushed(2))
+ .outputChances(10000, 9000, 8000)
+ .fluidInputs(FluidUtils.getFluidStack(aHydrochloric, 1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalBathRecipes);
+
+ // IV Rare Earth
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RareEarth, 3L))
+ .itemOutputs(RARE_EARTH_HIGH.getCrushed(2), RARE_EARTH_HIGH.getCrushed(2), RARE_EARTH_HIGH.getCrushed(2))
+ .outputChances(10000, 9000, 8000)
+ .fluidInputs(FluidUtils.getHydrofluoricAcid(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(chemicalBathRecipes);
+
+ // IV Rare Earth
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RareEarth, 3L))
+ .itemOutputs(RARE_EARTH_HIGH.getCrushed(2), RARE_EARTH_HIGH.getCrushed(2), RARE_EARTH_HIGH.getCrushed(2))
+ .outputChances(9000, 8000, 7000)
+ .fluidInputs(Materials.HydrofluoricAcid.getFluid(2000L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(chemicalBathRecipes);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_SeleniumProcessing.java b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_SeleniumProcessing.java
new file mode 100644
index 0000000000..b7a7b43549
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_SeleniumProcessing.java
@@ -0,0 +1,142 @@
+package gtPlusPlus.core.recipe;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.reflect.AddGregtechRecipe;
+
+public class RECIPES_SeleniumProcessing {
+
+ public static void init() {
+
+ // We need this
+ MaterialUtils.generateSpecialDustAndAssignToAMaterial(MISC_MATERIALS.SELENIUM_DIOXIDE, false);
+
+ // Makes Selenium Dioxide
+ processCopperRecipes();
+
+ // Liquify the Dried Dioxide
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1),
+ 13,
+ FluidUtils.getSteam(500),
+ null,
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getFluidStack(1000),
+ 20,
+ 1024);
+
+ // Produce Selenious Acid
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getCell(1),
+ 14,
+ FluidUtils.getHotWater(4000),
+ CI.emptyCells(1),
+ MISC_MATERIALS.SELENIOUS_ACID.getFluidStack(1000),
+ 20,
+ 2048);
+
+ // Make Selenium
+ CORE.RA.addBlastSmelterRecipe(
+ new ItemStack[] { ItemUtils.getGregtechCircuit(14), ELEMENT.getInstance().CARBON.getDust(16), },
+ new FluidStack[] { MISC_MATERIALS.SELENIOUS_ACID.getFluidStack(750),
+ Materials.SulfuricAcid.getFluid(8000), },
+ ELEMENT.getInstance().SELENIUM.getFluidStack(144 * 1),
+ new ItemStack[] { ELEMENT.getInstance().SELENIUM.getIngot(1), ELEMENT.getInstance().SELENIUM.getIngot(1), },
+ new int[] { 10000, 2000, 2000 },
+ 20 * 300,
+ 7200);
+
+ /*
+ * // Old recipes for Selenium Roasting CORE.RA.addBlastSmelterRecipe( new ItemStack[] {
+ * ItemUtils.getGregtechCircuit(16), ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedPyrite", 8),
+ * ELEMENT.getInstance().CARBON.getDust(32), }, Materials.SulfuricAcid.getFluid(4000),
+ * ELEMENT.getInstance().SELENIUM.getFluid(144), 0, 20 * 300, 2000); CORE.RA.addBlastSmelterRecipe( new
+ * ItemStack[] { ItemUtils.getGregtechCircuit(17),
+ * ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedChalcopyrite", 8),
+ * ELEMENT.getInstance().CARBON.getDust(32), }, Materials.SulfuricAcid.getFluid(4000),
+ * ELEMENT.getInstance().SELENIUM.getFluid(144), 0, 20 * 300, 2000); CORE.RA.addBlastSmelterRecipe( new
+ * ItemStack[] { ItemUtils.getGregtechCircuit(18),
+ * ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedGalena", 8),
+ * ELEMENT.getInstance().CARBON.getDust(32), }, Materials.SulfuricAcid.getFluid(4000),
+ * ELEMENT.getInstance().SELENIUM.getFluid(144), 0, 20 * 300, 2000);
+ */
+ }
+
+ public static void processCopperRecipes() {
+
+ // Copper
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(23),
+ ItemUtils.getOrePrefixStack(OrePrefixes.crushedPurified, Materials.Copper, 1), // Item Input
+ },
+ FluidUtils.getHotWater(1000), // Fluid
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getFluidStack(20), // Fluid
+ new ItemStack[] { ItemUtils.getOrePrefixStack(OrePrefixes.crushedCentrifuged, Materials.Copper, 1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), }, // Output
+ new int[] { 10000, 100, 100, 500, 500, 500, 1000, 1000, 1000 },
+ 40 * 20, // Time in ticks
+ 1024); // EU
+
+ // Tetra
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(23),
+ ItemUtils.getOrePrefixStack(OrePrefixes.crushedPurified, Materials.Tetrahedrite, 1), // Item
+ // Input
+ },
+ FluidUtils.getHotWater(1000), // Fluid
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getFluidStack(10), // Fluid
+ new ItemStack[] { ItemUtils.getOrePrefixStack(OrePrefixes.crushedCentrifuged, Materials.Tetrahedrite, 1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), }, // Output
+ new int[] { 10000, 100, 100, 300, 300, 300, 800, 800, 800 },
+ 40 * 20, // Time in ticks
+ 1024); // EU
+
+ // Chalco
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(23),
+ ItemUtils.getOrePrefixStack(OrePrefixes.crushedPurified, Materials.Chalcopyrite, 1), // Item
+ // Input
+ },
+ FluidUtils.getHotWater(1000), // Fluid
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getFluidStack(10), // Fluid
+ new ItemStack[] { ItemUtils.getOrePrefixStack(OrePrefixes.crushedCentrifuged, Materials.Chalcopyrite, 1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), }, // Output
+ new int[] { 10000, 100, 100, 300, 300, 300, 800, 800, 800 },
+ 40 * 20, // Time in ticks
+ 1024); // EU
+
+ // Malachite
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(23),
+ ItemUtils.getOrePrefixStack(OrePrefixes.crushedPurified, Materials.Malachite, 1), // Item Input
+ },
+ FluidUtils.getHotWater(1000), // Fluid
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getFluidStack(10), // Fluid
+ new ItemStack[] { ItemUtils.getOrePrefixStack(OrePrefixes.crushedCentrifuged, Materials.Malachite, 1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getSmallDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1),
+ MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), MISC_MATERIALS.SELENIUM_DIOXIDE.getTinyDust(1), }, // Output
+ new int[] { 10000, 100, 100, 300, 300, 300, 800, 800, 800 },
+ 40 * 20, // Time in ticks
+ 1024); // EU
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_Tools.java b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_Tools.java
new file mode 100644
index 0000000000..229b7cc045
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPES_Tools.java
@@ -0,0 +1,118 @@
+package gtPlusPlus.core.recipe;
+
+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;
+
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RECIPES_Tools {
+
+ // Outputs
+ public static ItemStack RECIPE_SandStone = new ItemStack(Blocks.sandstone, 2);
+ public static ItemStack RECIPE_Sand = new ItemStack(Blocks.sand, 4);
+
+ public static ItemStack RECIPE_DivisionSigil;
+
+ // MC Items
+ public static Item Apple = Items.apple;
+
+ // MC Blocks
+ public static Block CobbleStone = Blocks.cobblestone;
+ public static Block Dirt = Blocks.dirt;
+ public static Block Sand = Blocks.sand;
+ public static Block Gravel = Blocks.gravel;
+ public static Block Sandstone = Blocks.sandstone;
+
+ // null
+ public static String empty = " ";
+
+ // Batteries
+ public static String batteryBasic = "batteryBasic";
+ public static String batteryAdvanced = "batteryAdvanced";
+ public static String batteryElite = "batteryElite";
+ public static String batteryMaster = "batteryMaster";
+ public static String batteryUltimate = "batteryUltimate";
+
+ // Circuits
+ public static String circuitPrimitive = "circuitPrimitive";
+ public static String circuitBasic = "circuitBasic";
+ public static String circuitGood = "circuitGood";
+ public static String circuitAdvanced = "circuitAdvanced";
+ public static String circuitElite = "circuitElite";
+ public static String circuitMaster = "circuitMaster";
+ public static String circuitUltimate = "circuitUltimate";
+
+ // Cables
+ public static String cableGt01Electrum = "cableGt01Electrum";
+ public static String cableGt02Electrum = "cableGt02Electrum";
+ public static String cableGt01RedstoneAlloy = "cableGt01RedstoneAlloy";
+ public static String cableGt02RedstoneAlloy = "cableGt02RedstoneAlloy";
+ public static String cableGt01Copper = "cableGt01Copper";
+ public static String cableGt02Copper = "cableGt02Copper";
+ public static String cableGt01AnnealedCopper = "cableGt01AnnealedCopper";
+ public static String cableGt02AnnealedCopper = "cableGt02AnnealedCopper";
+
+ // Rods
+ public static String stickWood = "stickWood";
+ public static String stickStaballoy = "stickStaballoy";
+ public static String stickTitanium = "stickTitanium";
+ public static String stickIron = "stickIron";
+ public static String stickGold = "stickGold";
+ public static String stickSilver = "stickSilver";
+ public static String stickSteel = "stickSteel";
+ public static String stickBronze = "stickBronze";
+ public static String stickTungsten = "stickTungsten";
+ public static String stickRedAlloy = "stickRedAlloy";
+ public static String stickInvar = "stickInvar";
+ public static String stickElectrum = "stickElectrum";
+ public static String stickElectricalSteel = "stickElectricalSteel";
+
+ // Plates
+ public static String plateStaballoy = "plateStaballoy";
+ public static String plateTitanium = "plateTitanium";
+ public static String plateIron = "plateIron";
+ public static String plateGold = "plateGold";
+ public static String plateSilver = "plateSilver";
+ public static String plateSteel = "plateSteel";
+ public static String plateBronze = "plateBronze";
+ public static String plateTungsten = "plateTungsten";
+ public static String plateRedAlloy = "plateRedAlloy";
+ public static String plateInvar = "plateInvar";
+ public static String plateElectrum = "plateElectrum";
+ public static String plateElectricalSteel = "plateElectricalSteel";
+
+ // Ingots
+ public static String ingotStaballoy = "ingotStaballoy";
+ public static String ingotTitanium = "ingotTitanium";
+ public static String ingotIron = "ingotIron";
+ public static String ingotGold = "ingotGold";
+ public static String ingotSilver = "ingotSilver";
+ public static String ingotSteel = "ingotSteel";
+ public static String ingotBronze = "ingotBronze";
+ public static String ingotTungsten = "ingotTungsten";
+ public static String ingotRedAlloy = "ingotRedAlloy";
+ public static String ingotInvar = "ingotInvar";
+ public static String ingotElectrum = "ingotElectrum";
+ public static String ingotUranium = "ingotUranium";
+ public static String ingotElectricalSteel = "ingotElectricalSteel";
+
+ // Crafting Tools
+ public static String craftingToolHardHammer = "craftingToolHardHammer";
+ public static String craftingToolSoftHammer = "craftingToolSoftHammer";
+ public static String craftingToolFile = "craftingToolFile";
+ public static String craftingToolSaw = "craftingToolSaw";
+ public static String craftingToolPickaxe = "craftingToolPickaxe";
+ public static String craftingToolWrench = "craftingToolWrench";
+ public static String craftingToolCrowbar = "craftingToolCrowbar";
+ public static String craftingToolKnife = "craftingToolKnife";
+ public static String craftingToolScrewdriver = "craftingToolScrewdriver";
+
+ public static ItemStack personalCloakingDevice = ItemUtils.getSimpleStack(ModItems.itemPersonalCloakingDevice);
+ public static String plateDoubleNiChrome = "plateDoubleNichrome";
+ public static String plateIridiumAlloy = "plateAlloyIridium";
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPE_Batteries.java b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPE_Batteries.java
new file mode 100644
index 0000000000..4369fdbfa3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/recipe/RECIPE_Batteries.java
@@ -0,0 +1,62 @@
+package gtPlusPlus.core.recipe;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class RECIPE_Batteries {
+
+ static ItemStack RECIPE_Battery_Sodium = GregtechItemList.Battery_RE_EV_Sodium.get(1);
+ static ItemStack RECIPE_Battery_Cadmium = GregtechItemList.Battery_RE_EV_Cadmium.get(1);
+ static ItemStack RECIPE_Battery_Lithium = GregtechItemList.Battery_RE_EV_Lithium.get(1);
+ static ItemStack GT_Battery_Sodium = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32539, 1);
+ static ItemStack GT_Battery_Cadmium = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32537, 1);
+ static ItemStack GT_Battery_Lithium = ItemUtils.simpleMetaStack("gregtech:gt.metaitem.01", 32538, 1);
+ static ItemStack machineTransformer_EV;
+
+ public static void loadRecipes() {
+ machineTransformer_EV = ItemList.Transformer_EV_HV.get(1);
+ run();
+ }
+
+ private static void run() {
+
+ RecipeUtils.addShapedGregtechRecipe(
+ GT_Battery_Sodium,
+ RECIPES_Machines.cableTier4,
+ GT_Battery_Sodium,
+ CI.circuitTier3,
+ machineTransformer_EV,
+ CI.circuitTier3,
+ GT_Battery_Sodium,
+ RECIPES_Machines.cableTier4,
+ GT_Battery_Sodium,
+ RECIPE_Battery_Sodium);
+ RecipeUtils.addShapedGregtechRecipe(
+ GT_Battery_Cadmium,
+ RECIPES_Machines.cableTier4,
+ GT_Battery_Cadmium,
+ CI.circuitTier3,
+ machineTransformer_EV,
+ CI.circuitTier3,
+ GT_Battery_Cadmium,
+ RECIPES_Machines.cableTier4,
+ GT_Battery_Cadmium,
+ RECIPE_Battery_Cadmium);
+ RecipeUtils.addShapedGregtechRecipe(
+ GT_Battery_Lithium,
+ RECIPES_Machines.cableTier4,
+ GT_Battery_Lithium,
+ CI.circuitTier3,
+ machineTransformer_EV,
+ CI.circuitTier3,
+ GT_Battery_Lithium,
+ RECIPES_Machines.cableTier4,
+ GT_Battery_Lithium,
+ RECIPE_Battery_Lithium);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/recipe/ShapedRecipeObject.java b/gtpp/src/main/java/gtPlusPlus/core/recipe/ShapedRecipeObject.java
new file mode 100644
index 0000000000..18c1c2c70c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/recipe/ShapedRecipeObject.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.core.recipe;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class ShapedRecipeObject {
+
+ public Object object_A;
+ public Object object_B;
+ public Object object_C;
+ public Object object_D;
+ public Object object_E;
+ public Object object_F;
+ public Object object_G;
+ public Object object_H;
+ public Object object_I;
+ public ItemStack object_OUTPUT;
+
+ public ShapedRecipeObject(final Object input_A, final Object input_B, final Object input_C, final Object input_D,
+ final Object input_E, final Object input_F, final Object input_G, final Object input_H, final Object input_I,
+ final ItemStack input_Output) {
+ this.object_A = input_A;
+ this.object_B = input_B;
+ this.object_C = input_C;
+ this.object_D = input_D;
+ this.object_E = input_E;
+ this.object_F = input_F;
+ this.object_G = input_G;
+ this.object_H = input_H;
+ this.object_I = input_I;
+ this.object_OUTPUT = input_Output;
+ Logger.SPECIFIC_WARNING("ShapedRecipeObject", "New object created.", 36);
+ }
+
+ public void buildRecipe() {
+ RecipeUtils.recipeBuilder(
+ this.object_A,
+ this.object_B,
+ this.object_C,
+ this.object_D,
+ this.object_E,
+ this.object_F,
+ this.object_G,
+ this.object_H,
+ this.object_I,
+ this.object_OUTPUT);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/recipe/common/CI.java b/gtpp/src/main/java/gtPlusPlus/core/recipe/common/CI.java
new file mode 100644
index 0000000000..5c1620160d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/recipe/common/CI.java
@@ -0,0 +1,1008 @@
+package gtPlusPlus.core.recipe.common;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.recipe.LOADER_Machine_Components;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import ic2.core.Ic2Items;
+
+public class CI {
+
+ // null
+ public static ItemStack _NULL = ItemUtils.getErrorStack(1);
+
+ // bits
+ public static long bits = GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED;
+ public static long bitsd = GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED;
+
+ // Circuits
+ public static Object circuitPrimitive;
+ public static Object circuitTier1;
+ public static Object circuitTier2;
+ public static Object circuitTier3;
+ public static Object circuitTier4;
+ public static Object circuitTier5;
+ public static Object circuitTier6;
+ public static Object circuitTier7;
+ public static Object circuitTier8;
+ public static Object circuitTier9;
+
+ // Machine Components
+ public static ItemStack electricMotor_LV;
+ public static ItemStack electricMotor_MV;
+ public static ItemStack electricMotor_HV;
+ public static ItemStack electricMotor_EV;
+ public static ItemStack electricMotor_IV;
+ public static ItemStack electricMotor_LuV;
+ public static ItemStack electricMotor_ZPM;
+ public static ItemStack electricMotor_UV;
+ public static ItemStack electricMotor_UHV;
+ public static ItemStack electricPump_LV;
+ public static ItemStack electricPump_MV;
+ public static ItemStack electricPump_HV;
+ public static ItemStack electricPump_EV;
+ public static ItemStack electricPump_IV;
+ public static ItemStack electricPump_LuV;
+ public static ItemStack electricPump_ZPM;
+ public static ItemStack electricPump_UV;
+ public static ItemStack electricPump_UHV;
+ public static ItemStack electricPiston_LV;
+ public static ItemStack electricPiston_MV;
+ public static ItemStack electricPiston_HV;
+ public static ItemStack electricPiston_EV;
+ public static ItemStack electricPiston_IV;
+ public static ItemStack electricPiston_LuV;
+ public static ItemStack electricPiston_ZPM;
+ public static ItemStack electricPiston_UV;
+ public static ItemStack electricPiston_UHV;
+ public static ItemStack robotArm_LV;
+ public static ItemStack robotArm_MV;
+ public static ItemStack robotArm_HV;
+ public static ItemStack robotArm_EV;
+ public static ItemStack robotArm_IV;
+ public static ItemStack robotArm_LuV;
+ public static ItemStack robotArm_ZPM;
+ public static ItemStack robotArm_UV;
+ public static ItemStack robotArm_UHV;
+ public static ItemStack conveyorModule_LV;
+ public static ItemStack conveyorModule_MV;
+ public static ItemStack conveyorModule_HV;
+ public static ItemStack conveyorModule_EV;
+ public static ItemStack conveyorModule_IV;
+ public static ItemStack conveyorModule_LuV;
+ public static ItemStack conveyorModule_ZPM;
+ public static ItemStack conveyorModule_UV;
+ public static ItemStack conveyorModule_UHV;
+ public static ItemStack emitter_LV;
+ public static ItemStack emitter_MV;
+ public static ItemStack emitter_HV;
+ public static ItemStack emitter_EV;
+ public static ItemStack emitter_IV;
+ public static ItemStack emitter_LuV;
+ public static ItemStack emitter_ZPM;
+ public static ItemStack emitter_UV;
+ public static ItemStack emitter_UHV;
+ public static ItemStack fieldGenerator_LV;
+ public static ItemStack fieldGenerator_MV;
+ public static ItemStack fieldGenerator_HV;
+ public static ItemStack fieldGenerator_EV;
+ public static ItemStack fieldGenerator_IV;
+ public static ItemStack fieldGenerator_LuV;
+ public static ItemStack fieldGenerator_ZPM;
+ public static ItemStack fieldGenerator_UV;
+ public static ItemStack fieldGenerator_UHV;
+ public static ItemStack sensor_LV;
+ public static ItemStack sensor_MV;
+ public static ItemStack sensor_HV;
+ public static ItemStack sensor_EV;
+ public static ItemStack sensor_IV;
+ public static ItemStack sensor_LuV;
+ public static ItemStack sensor_ZPM;
+ public static ItemStack sensor_UV;
+ public static ItemStack sensor_UHV;
+
+ public static ItemStack fluidRegulator_LV;
+ public static ItemStack fluidRegulator_MV;
+ public static ItemStack fluidRegulator_HV;
+ public static ItemStack fluidRegulator_EV;
+ public static ItemStack fluidRegulator_IV;
+ public static ItemStack fluidRegulator_LuV;
+ public static ItemStack fluidRegulator_ZPM;
+ public static ItemStack fluidRegulator_UV;
+
+ // Machine Casings
+ public static ItemStack machineCasing_ULV;
+ public static ItemStack machineCasing_LV;
+ public static ItemStack machineCasing_MV;
+ public static ItemStack machineCasing_HV;
+ public static ItemStack machineCasing_EV;
+ public static ItemStack machineCasing_IV;
+ public static ItemStack machineCasing_LuV;
+ public static ItemStack machineCasing_ZPM;
+ public static ItemStack machineCasing_UV;
+ public static ItemStack machineCasing_UHV;
+
+ // Machine Hulls
+ public static ItemStack machineHull_ULV;
+ public static ItemStack machineHull_LV;
+ public static ItemStack machineHull_MV;
+ public static ItemStack machineHull_HV;
+ public static ItemStack machineHull_EV;
+ public static ItemStack machineHull_IV;
+ public static ItemStack machineHull_LuV;
+ public static ItemStack machineHull_ZPM;
+ public static ItemStack machineHull_UV;
+ public static ItemStack machineHull_UHV;
+
+ // Gearbox Casings
+ public static ItemStack gearboxCasing_Tier_1;
+ public static ItemStack gearboxCasing_Tier_2;
+ public static ItemStack gearboxCasing_Tier_3;
+ public static ItemStack gearboxCasing_Tier_4;
+
+ public static String[] component_Plate;
+ public static String[] component_Rod;
+ public static String[] component_Ingot;
+
+ // Crafting Tools
+ public static String craftingToolWrench = "craftingToolWrench";
+ public static String craftingToolHammer_Hard = "craftingToolHardHammer";
+ public static String craftingToolScrewdriver = "craftingToolScrewdriver";
+ public static String craftingToolFile = "craftingToolFile";
+ public static String craftingToolMortar = "craftingToolMortar";
+ public static String craftingToolSaw = "craftingToolSaw";
+ public static String craftingToolWireCutter = "craftingToolWirecutter";
+ public static String craftingToolSolderingIron = "craftingToolSolderingIron";
+
+ // Explosives
+ public static ItemStack explosivePowderKeg;
+ public static ItemStack explosiveTNT;
+ public static ItemStack explosiveITNT;
+
+ public static Materials[] tieredMaterials = new Materials[] { Materials.Iron, Materials.Steel, Materials.Aluminium,
+ Materials.StainlessSteel, Materials.Titanium, Materials.TungstenSteel, Materials.Chrome, Materials.Iridium,
+ Materials.Osmium, Materials.Neutronium };
+
+ public static void preInit() {
+
+ // Tiered Components
+ component_Plate = new String[] { getTieredComponent(OrePrefixes.plate, 0),
+ getTieredComponent(OrePrefixes.plate, 1), getTieredComponent(OrePrefixes.plate, 2),
+ getTieredComponent(OrePrefixes.plate, 3), getTieredComponent(OrePrefixes.plate, 4),
+ getTieredComponent(OrePrefixes.plate, 5), getTieredComponent(OrePrefixes.plate, 6),
+ getTieredComponent(OrePrefixes.plate, 7), getTieredComponent(OrePrefixes.plate, 8),
+ getTieredComponent(OrePrefixes.plate, 9), getTieredComponent(OrePrefixes.plate, 10),
+ getTieredComponent(OrePrefixes.plate, 11) };
+ component_Rod = new String[] { getTieredComponent(OrePrefixes.stick, 0),
+ getTieredComponent(OrePrefixes.stick, 1), getTieredComponent(OrePrefixes.stick, 2),
+ getTieredComponent(OrePrefixes.stick, 3), getTieredComponent(OrePrefixes.stick, 4),
+ getTieredComponent(OrePrefixes.stick, 5), getTieredComponent(OrePrefixes.stick, 6),
+ getTieredComponent(OrePrefixes.stick, 7), getTieredComponent(OrePrefixes.stick, 8),
+ getTieredComponent(OrePrefixes.stick, 9), getTieredComponent(OrePrefixes.stick, 10),
+ getTieredComponent(OrePrefixes.stick, 11) };
+ component_Ingot = new String[] { getTieredComponent(OrePrefixes.ingot, 0),
+ getTieredComponent(OrePrefixes.ingot, 1), getTieredComponent(OrePrefixes.ingot, 2),
+ getTieredComponent(OrePrefixes.ingot, 3), getTieredComponent(OrePrefixes.ingot, 4),
+ getTieredComponent(OrePrefixes.ingot, 5), getTieredComponent(OrePrefixes.ingot, 6),
+ getTieredComponent(OrePrefixes.ingot, 7), getTieredComponent(OrePrefixes.ingot, 8),
+ getTieredComponent(OrePrefixes.ingot, 9), getTieredComponent(OrePrefixes.ingot, 10),
+ getTieredComponent(OrePrefixes.ingot, 11) };
+
+ // Circuits
+ circuitPrimitive = getTieredCircuit(0);
+ circuitTier1 = getTieredCircuit(1);
+ circuitTier2 = getTieredCircuit(2);
+ circuitTier3 = getTieredCircuit(3);
+ circuitTier4 = getTieredCircuit(4);
+ circuitTier5 = getTieredCircuit(5);
+ circuitTier6 = getTieredCircuit(6);
+ circuitTier7 = getTieredCircuit(7);
+ circuitTier8 = getTieredCircuit(8);
+ circuitTier9 = getTieredCircuit(9);
+ }
+
+ public static Object getTieredCircuit(int tier) {
+ return getTieredCircuitOreDictName(tier);
+ }
+
+ public static String getTieredCircuitOreDictName(int tier) {
+ if (tier == 0) {
+ return "circuitPrimitive";
+ } else if (tier == 1) {
+ return "circuitBasic";
+ } else if (tier == 2) {
+ return "circuitGood";
+ } else if (tier == 3) {
+ return "circuitAdvanced";
+ } else if (tier == 4) {
+ return "circuitData";
+ } else if (tier == 5) {
+ return "circuitElite";
+ } else if (tier == 6) {
+ return "circuitMaster";
+ } else if (tier == 7) {
+ return "circuitUltimate";
+ } else if (tier == 8) {
+ return "circuitSuperconductor";
+ } else if (tier == 9) {
+ return "circuitInfinite";
+ } else if (tier == 10) {
+ return "circuitQuantum";
+ } else {
+ return "circuitPrimitive";
+ }
+ }
+
+ public static ItemStack getNumberedCircuit(int Meta) {
+ return ItemUtils.getGregtechCircuit(Meta);
+ }
+
+ private static Object getMaterialFromTier(int tier) {
+ if (tier == 0) {
+ return Materials.Wood;
+ } else if (tier == 1) {
+ return Materials.Lead;
+ } else if (tier == 2) {
+ return Materials.Bronze;
+ } else if (tier == 3) {
+ return Materials.Steel;
+ } else if (tier == 4) {
+ return ALLOY.EGLIN_STEEL;
+ } else if (tier == 5) {
+ return Materials.Aluminium;
+ } else if (tier == 6) {
+ return ALLOY.MARAGING250;
+ } else if (tier == 7) {
+ return ALLOY.TANTALLOY_61;
+ } else if (tier == 8) {
+ return ALLOY.INCONEL_792;
+ } else if (tier == 9) {
+ return ALLOY.ZERON_100;
+ } else if (tier == 10) {
+ return Materials.NaquadahEnriched;
+ } else if (tier == 11) {
+ return Materials.Neutronium;
+ }
+ return Materials._NULL;
+ }
+
+ public static String getTieredComponent(OrePrefixes type, int tier) {
+ Object material = getMaterialFromTier(tier);
+ if (material != null) {
+ if (material instanceof Materials) {
+ // return (ItemStack) type.get(material);
+ String materialName = ((Materials) material).mDefaultLocalName;
+ Logger.INFO("Searching for a component named " + type.name() + materialName);
+ // return ItemUtils.getItemStackOfAmountFromOreDict(type.name()+materialName, 1);
+ return (type.name() + materialName);
+ } else {
+ String materialName = (Utils.sanitizeString(((Material) material).getLocalizedName()));
+ Logger.INFO("Searching for a component named " + type.name() + materialName);
+ // return ItemUtils.getItemStackOfAmountFromOreDict(type.name()+materialName, 1);
+ return (type.name() + materialName);
+ }
+ }
+ Logger.INFO("[Components] Failed getting a tiered component. " + type.name() + " | " + tier);
+ return null;
+ }
+
+ public static ItemStack getDataOrb() {
+ return ItemList.Tool_DataOrb.get(1);
+ }
+
+ public static ItemStack getDataStick() {
+ return ItemList.Tool_DataStick.get(1);
+ }
+
+ public static ItemStack getTieredMachineHull(int tier) {
+ if (tier == 0) {
+ return machineHull_ULV;
+ } else if (tier == 1) {
+ return machineHull_LV;
+ } else if (tier == 2) {
+ return machineHull_MV;
+ } else if (tier == 3) {
+ return machineHull_HV;
+ } else if (tier == 4) {
+ return machineHull_EV;
+ } else if (tier == 5) {
+ return machineHull_IV;
+ } else if (tier == 6) {
+ return machineHull_LuV;
+ } else if (tier == 7) {
+ return machineHull_ZPM;
+ } else if (tier == 8) {
+ return machineHull_UV;
+ } else if (tier == 9) {
+ return machineHull_UHV;
+ } else {
+ return GregtechItemList.Casing_Multi_Use.get(1);
+ }
+ }
+
+ public static ItemStack getTieredMachineCasing(int tier) {
+ if (tier == 0) {
+ if (machineCasing_ULV == null) {
+ machineCasing_ULV = ItemList.Casing_ULV.get(1);
+ }
+ return machineCasing_ULV;
+ } else if (tier == 1) {
+ return machineCasing_LV;
+ } else if (tier == 2) {
+ return machineCasing_MV;
+ } else if (tier == 3) {
+ return machineCasing_HV;
+ } else if (tier == 4) {
+ return machineCasing_EV;
+ } else if (tier == 5) {
+ return machineCasing_IV;
+ } else if (tier == 6) {
+ return machineCasing_LuV;
+ } else if (tier == 7) {
+ return machineCasing_ZPM;
+ } else if (tier == 8) {
+ return machineCasing_UV;
+ } else if (tier == 9) {
+ return machineCasing_UHV;
+ } else {
+ return GregtechItemList.Casing_Multi_Use.get(1);
+ }
+ }
+
+ public static void init() {
+ // Set Explosives
+ explosivePowderKeg = ItemList.Block_Powderbarrel.get(1);
+ explosiveTNT = ItemUtils.getSimpleStack(Blocks.tnt)
+ .copy();
+ explosiveITNT = Ic2Items.industrialTnt.copy();
+
+ // Machine Casings
+ machineCasing_ULV = ItemList.Casing_ULV.get(1);
+ machineCasing_LV = ItemList.Casing_LV.get(1);
+ machineCasing_MV = ItemList.Casing_MV.get(1);
+ machineCasing_HV = ItemList.Casing_HV.get(1);
+ machineCasing_EV = ItemList.Casing_EV.get(1);
+ machineCasing_IV = ItemList.Casing_IV.get(1);
+ machineCasing_LuV = ItemList.Casing_LuV.get(1);
+ machineCasing_ZPM = ItemList.Casing_ZPM.get(1);
+ machineCasing_UV = ItemList.Casing_UV.get(1);
+ machineCasing_UHV = ItemList.Casing_MAX.get(1);
+
+ // Machine Hulls
+ machineHull_ULV = ItemList.Hull_ULV.get(1);
+ machineHull_LV = ItemList.Hull_LV.get(1);
+ machineHull_MV = ItemList.Hull_MV.get(1);
+ machineHull_HV = ItemList.Hull_HV.get(1);
+ machineHull_EV = ItemList.Hull_EV.get(1);
+ machineHull_IV = ItemList.Hull_IV.get(1);
+ machineHull_LuV = ItemList.Hull_LuV.get(1);
+ machineHull_ZPM = ItemList.Hull_ZPM.get(1);
+ machineHull_UV = ItemList.Hull_UV.get(1);
+ machineHull_UHV = ItemList.Hull_MAX.get(1);
+
+ // Gear box Casings
+ gearboxCasing_Tier_1 = ItemList.Casing_Gearbox_Bronze.get(1);
+ gearboxCasing_Tier_2 = ItemList.Casing_Gearbox_Steel.get(1);
+ gearboxCasing_Tier_3 = ItemList.Casing_Gearbox_Titanium.get(1);
+ gearboxCasing_Tier_4 = ItemList.Casing_Gearbox_TungstenSteel.get(1);
+
+ // Machine Components
+ LOADER_Machine_Components.initialise();
+ }
+
+ public static ItemStack emptyCells(int i) {
+ return ItemUtils.getEmptyCell(i);
+ }
+
+ private static final Material[] aMaterial_Main = new Material[] { ALLOY.POTIN, ALLOY.TUMBAGA, ALLOY.EGLIN_STEEL,
+ ALLOY.INCONEL_625, ALLOY.INCOLOY_DS, ALLOY.NITINOL_60, ALLOY.ZERON_100, ALLOY.PIKYONIUM,
+ ELEMENT.STANDALONE.ADVANCED_NITINOL, ALLOY.ABYSSAL, ALLOY.QUANTUM, ELEMENT.STANDALONE.HYPOGEN };
+
+ private static final Material[] aMaterial_Secondary = new Material[] { ALLOY.STEEL, ALLOY.SILICON_CARBIDE,
+ ALLOY.BLOODSTEEL, ALLOY.TANTALUM_CARBIDE, ALLOY.INCONEL_792, ALLOY.ARCANITE, ALLOY.LAFIUM, ALLOY.CINOBITE,
+ ALLOY.TITANSTEEL, ALLOY.OCTIRON, ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN, ELEMENT.STANDALONE.HYPOGEN };
+
+ private static final Material[] aMaterial_Tertiary = new Material[] { ELEMENT.getInstance().LEAD,
+ ELEMENT.getInstance().ALUMINIUM, ELEMENT.STANDALONE.BLACK_METAL, ELEMENT.getInstance().TITANIUM,
+ ALLOY.HASTELLOY_N, ALLOY.ENERGYCRYSTAL, ALLOY.TRINIUM_NAQUADAH_CARBON, ALLOY.TRINIUM_REINFORCED_STEEL, // Arceus
+ ALLOY.TITANSTEEL, ELEMENT.STANDALONE.ASTRAL_TITANIUM, ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN,
+ ELEMENT.STANDALONE.HYPOGEN };
+
+ private static final Materials[] aMaterial_Cables = new Materials[] { Materials.Tin, Materials.Cobalt,
+ Materials.AnnealedCopper, Materials.Gold, Materials.Titanium, Materials.Nichrome, Materials.Platinum,
+ Materials.YttriumBariumCuprate, Materials.Naquadah, Materials.Duranium, Materials.SuperconductorUHV, };
+
+ private static final Materials[] aMaterial_Circuits = new Materials[] { Materials.Primitive, Materials.Basic,
+ Materials.Good, Materials.Advanced, Materials.Data, Materials.Data, Materials.Elite, Materials.Master,
+ Materials.Ultimate, Materials.SuperconductorUHV, Materials.Infinite, };
+
+ private static final Material[][] aMaster = new Material[][] { aMaterial_Main, aMaterial_Secondary,
+ aMaterial_Tertiary };
+
+ public static FluidStack getTieredFluid(int aTier, int aAmount) {
+ return getTieredFluid(aTier, aAmount, 0);
+ }
+
+ public static FluidStack getAlternativeTieredFluid(int aTier, int aAmount) {
+ return getTieredFluid(aTier, aAmount, 1);
+ }
+
+ public static FluidStack getTertiaryTieredFluid(int aTier, int aAmount) {
+ return getTieredFluid(aTier, aAmount, 2);
+ }
+
+ public static FluidStack getTieredFluid(int aTier, int aAmount, int aType) {
+ // Weird Legacy handling
+ /*
+ * ItemStack aCell = getTieredComponent(OrePrefixes.liquid, aTier, 1); FluidStack a =
+ * GT_Utility.getFluidForFilledItem(aCell, true); if (a == null) { a = aMaster[aType][aTier].getFluid(aAmount);
+ * }
+ */
+
+ // Modern Handling
+ FluidStack a = aMaster[aType][aTier].getFluidStack(aAmount);
+ if (a == null) {
+ ItemStack aCell = getTieredComponent(OrePrefixes.liquid, aTier, 1);
+ if (aCell != null) {
+ a = GT_Utility.getFluidForFilledItem(aCell, true);
+ a.amount = aAmount;
+ }
+ }
+ return a;
+ }
+
+ public static ItemStack getEnergyCore(int aTier, int aAmount) {
+ ItemStack[] aOutput = new ItemStack[] {
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "1", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "2", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "3", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "4", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "5", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "6", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "7", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "8", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "9", 1),
+ ItemUtils.getItemStackFromFQRN("miscutils:item.itemBufferCore" + "10", 1) };
+ return ItemUtils.getSimpleStack(aOutput[MathUtils.balance(aTier, 0, 9)], aAmount);
+ }
+
+ public static ItemStack getPlate(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.plate, aTier, aAmount);
+ }
+
+ public static ItemStack getDoublePlate(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.plateDouble, aTier, aAmount);
+ }
+
+ public static ItemStack getGear(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.gearGt, aTier, aAmount);
+ }
+
+ public static ItemStack getIngot(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.ingot, aTier, aAmount);
+ }
+
+ public static ItemStack getBolt(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.bolt, aTier, aAmount);
+ }
+
+ public static ItemStack getScrew(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.screw, aTier, aAmount);
+ }
+
+ public static ItemStack getCircuit(int aTier, int aAmount) {
+ return getTieredComponent(OrePrefixes.circuit, aTier, aAmount);
+ }
+
+ public static ItemStack getTieredComponent(OrePrefixes aPrefix, int aTier, int aAmount) {
+ aTier = Math.max(0, aTier);
+
+ Material m;
+
+ if (aPrefix == OrePrefixes.liquid) {
+ int aMatID = (aTier == 0 || aTier == 2 || aTier == 5 || aTier == 8 ? 0
+ : (aTier == 1 || aTier == 3 || aTier == 6 || aTier == 9 ? 1 : 2));
+ ItemStack aCell = aMaster[aMatID][aTier].getCell(aAmount);
+ return aCell;
+ }
+
+ if (aPrefix == OrePrefixes.circuit) {
+ /*
+ * if (aTier == 4) { return ItemUtils.getSimpleStack(CI.getDataStick(), aAmount); } else if (aTier == 5) {
+ * return ItemUtils.getSimpleStack(CI.getDataOrb(), aAmount); }
+ */
+ return ItemUtils.getOrePrefixStack(OrePrefixes.circuit, aMaterial_Circuits[aTier], aAmount);
+ }
+
+ // Check for Cables first, catch SuperConductor case and swap to wire.
+ if (aPrefix == OrePrefixes.cableGt01 || aPrefix == OrePrefixes.cableGt02
+ || aPrefix == OrePrefixes.cableGt04
+ || aPrefix == OrePrefixes.cableGt08
+ || aPrefix == OrePrefixes.cableGt12) {
+ // Special Handler
+ if (aTier == 10) {
+ if (aPrefix == OrePrefixes.cableGt01) {
+ aPrefix = OrePrefixes.wireGt02;
+ } else if (aPrefix == OrePrefixes.cableGt02) {
+ aPrefix = OrePrefixes.wireGt04;
+ } else if (aPrefix == OrePrefixes.cableGt04) {
+ aPrefix = OrePrefixes.wireGt08;
+ } else if (aPrefix == OrePrefixes.cableGt08) {
+ aPrefix = OrePrefixes.wireGt12;
+ } else if (aPrefix == OrePrefixes.cableGt12) {
+ aPrefix = OrePrefixes.wireGt16;
+ }
+ } else {
+ return ItemUtils.getOrePrefixStack(aPrefix, aMaterial_Cables[aTier], aAmount);
+ }
+ }
+ if (aPrefix == OrePrefixes.wireGt01 || aPrefix == OrePrefixes.wireGt02
+ || aPrefix == OrePrefixes.wireGt04
+ || aPrefix == OrePrefixes.wireGt08
+ || aPrefix == OrePrefixes.wireGt12
+ || aPrefix == OrePrefixes.wireGt16) {
+ return ItemUtils.getOrePrefixStack(aPrefix, aMaterial_Cables[aTier], aAmount);
+ }
+
+ if (aPrefix == OrePrefixes.pipeTiny || aPrefix == OrePrefixes.pipeSmall
+ || aPrefix == OrePrefixes.pipe
+ || aPrefix == OrePrefixes.pipeMedium
+ || aPrefix == OrePrefixes.pipeLarge
+ || aPrefix == OrePrefixes.pipeHuge) {
+
+ if (aPrefix == OrePrefixes.pipe) {
+ aPrefix = OrePrefixes.pipeMedium;
+ }
+
+ if (aTier == 0) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.Lead, aAmount);
+ } else if (aTier == 1) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.Steel, aAmount);
+ } else if (aTier == 2) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.StainlessSteel, aAmount);
+ } else if (aTier == 3) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.Tungsten, aAmount);
+ } else if (aTier == 4) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.TungstenSteel, aAmount);
+ } else if (aTier == 5) {
+ return ItemUtils.getOrePrefixStack(aPrefix, ALLOY.MARAGING350, aAmount);
+ } else if (aTier == 6) {
+ return ItemUtils.getOrePrefixStack(aPrefix, ALLOY.STABALLOY, aAmount);
+ } else if (aTier == 7) {
+ return ItemUtils.getOrePrefixStack(aPrefix, ALLOY.HASTELLOY_X, aAmount);
+ } else if (aTier == 8) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.Ultimate, aAmount);
+ } else if (aTier == 9) {
+ return ItemUtils.getOrePrefixStack(OrePrefixes.pipeMedium, Materials.SuperconductorUHV, aAmount);
+ } else if (aTier == 10) {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.Europium, aAmount);
+ } else {
+ return ItemUtils.getOrePrefixStack(aPrefix, Materials.Titanium, aAmount);
+ }
+ }
+
+ if (aPrefix == OrePrefixes.rod) {
+ aPrefix = OrePrefixes.stick;
+ }
+
+ if (aPrefix == OrePrefixes.gear || aPrefix == OrePrefixes.gearGt) {
+ m = aMaster[0][aTier];
+ } else if (aPrefix == OrePrefixes.rod || aPrefix == OrePrefixes.stick) {
+ m = aMaster[0][aTier];
+ } else if (aPrefix == OrePrefixes.stickLong) {
+ m = aMaster[1][aTier];
+ } else if (aPrefix == OrePrefixes.bolt) {
+ m = aMaster[2][aTier];
+ } else if (aPrefix == OrePrefixes.screw) {
+ m = aMaster[0][aTier];
+ } else if (aPrefix == OrePrefixes.rotor) {
+ m = aMaster[1][aTier];
+ } else if (aPrefix == OrePrefixes.frame || aPrefix == OrePrefixes.frameGt) {
+ m = aMaster[2][aTier];
+ } else if (aPrefix == OrePrefixes.ingot) {
+ m = aMaster[1][aTier];
+ } else if (aPrefix == OrePrefixes.plate) {
+ m = aMaster[0][aTier];
+ } else if (aPrefix == OrePrefixes.plateDouble) {
+ m = aMaster[0][aTier];
+ } else if (aPrefix == OrePrefixes.ring) {
+ m = aMaster[2][aTier];
+ } else if (aPrefix == OrePrefixes.cell) {
+ m = aMaster[1][aTier];
+ } else {
+ m = aMaterial_Main[aTier];
+ }
+
+ ItemStack aReturn = ItemUtils.getOrePrefixStack(aPrefix, m, aAmount);
+
+ // If Invalid, Try First Material
+ if (!ItemUtils.checkForInvalidItems(aReturn)) {
+ m = aMaster[0][aTier];
+ aReturn = ItemUtils.getOrePrefixStack(aPrefix, m, aAmount);
+
+ // If Invalid, Try Second Material
+ if (!ItemUtils.checkForInvalidItems(aReturn)) {
+ m = aMaster[1][aTier];
+ aReturn = ItemUtils.getOrePrefixStack(aPrefix, m, aAmount);
+
+ // If Invalid, Try Third Material
+ if (!ItemUtils.checkForInvalidItems(aReturn)) {
+ m = aMaster[2][aTier];
+ aReturn = ItemUtils.getOrePrefixStack(aPrefix, m, aAmount);
+
+ // All Invalid?
+ // Let's add a special error ingot.
+ if (!ItemUtils.checkForInvalidItems(aReturn)) {
+ aReturn = ItemUtils.getErrorStack(1, (aPrefix + m.getLocalizedName() + " x" + aAmount));
+ }
+ }
+ }
+ }
+
+ return aReturn;
+ }
+
+ public static ItemStack getElectricMotor(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricMotor_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.electricMotor_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getFluidRegulator(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 0;
+ if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fluidRegulator_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.fluidRegulator_UV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getElectricPiston(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPiston_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.electricPiston_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getElectricPump(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.electricPump_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.electricPump_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.electricPump_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getRobotArm(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.robotArm_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.robotArm_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.robotArm_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getConveyor(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.conveyorModule_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.conveyorModule_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getEmitter(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.emitter_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.emitter_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.emitter_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getSensor(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.sensor_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.sensor_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.sensor_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getFieldGenerator(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 1;
+ if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.fieldGenerator_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.fieldGenerator_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getTieredMachineHull(int aTier, int aSize) {
+ ItemStack aType;
+ int aLazyTier = 0;
+ if (aTier == aLazyTier++) {
+ aType = CI.machineHull_ULV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_LV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_MV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_HV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_EV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_IV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_LuV;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_ZPM;
+ } else if (aTier == aLazyTier++) {
+ aType = CI.machineHull_UV;
+ } else if (aTier == aLazyTier) {
+ aType = CI.machineHull_UHV;
+ } else {
+ throw new IllegalArgumentException();
+ }
+ return ItemUtils.getSimpleStack(aType, aSize);
+ }
+
+ public static ItemStack getHeatCoil(int i) {
+ if (i > 8) {
+ i = 8;
+ }
+ return ItemUtils.simpleMetaStack(GregTech_API.sBlockCasings5, i, 1);
+ }
+
+ public static ItemStack getNumberedBioCircuit(int i) {
+ return ItemUtils.simpleMetaStack(AgriculturalChem.mBioCircuit, i, 0);
+ }
+
+ public static ItemStack getNumberedAdvancedCircuit(int i) {
+ return ItemUtils.simpleMetaStack(GenericChem.mAdvancedCircuit, i, 0);
+ }
+
+ public static ItemStack getTieredGTPPMachineCasing(int aTier, int aAmount) {
+ GregtechItemList[] aHulls = new GregtechItemList[] { GregtechItemList.GTPP_Casing_ULV,
+ GregtechItemList.GTPP_Casing_LV, GregtechItemList.GTPP_Casing_MV, GregtechItemList.GTPP_Casing_HV,
+ GregtechItemList.GTPP_Casing_EV, GregtechItemList.GTPP_Casing_IV, GregtechItemList.GTPP_Casing_LuV,
+ GregtechItemList.GTPP_Casing_ZPM, GregtechItemList.GTPP_Casing_UV, GregtechItemList.GTPP_Casing_UHV };
+ return aHulls[aTier].get(aAmount);
+ }
+
+ public static ItemStack getTieredComponentOfMaterial(Materials aMaterial, OrePrefixes aPrefix, int aAmount) {
+ return ItemUtils.getOrePrefixStack(aPrefix, aMaterial, aAmount);
+ }
+
+ public static ItemStack getTransmissionComponent(int aTier, int aAmount) {
+ GregtechItemList[] aTransParts = new GregtechItemList[] { null, GregtechItemList.TransmissionComponent_LV,
+ GregtechItemList.TransmissionComponent_MV, GregtechItemList.TransmissionComponent_HV,
+ GregtechItemList.TransmissionComponent_EV, GregtechItemList.TransmissionComponent_IV,
+ GregtechItemList.TransmissionComponent_LuV, GregtechItemList.TransmissionComponent_ZPM,
+ GregtechItemList.TransmissionComponent_UV, GregtechItemList.TransmissionComponent_UHV, };
+ return aTransParts[aTier].get(aAmount);
+ }
+
+ public static ItemStack getEmptyCatalyst(int aAmount) {
+ return ItemUtils.simpleMetaStack(AgriculturalChem.mAgrichemItem1, 13, aAmount);
+ }
+
+ /**
+ * Aluminium + Silver Catalyst
+ *
+ * @param aAmount - Stacksize
+ * @return - A Catalyst stack of given size
+ */
+ public static ItemStack getGreenCatalyst(int aAmount) {
+ return ItemUtils.simpleMetaStack(AgriculturalChem.mAgrichemItem1, 14, aAmount);
+ }
+
+ /**
+ * Iridium + Ruthenium Catalyst
+ *
+ * @param aAmount - Stacksize
+ * @return - A Catalyst stack of given size
+ */
+ public static ItemStack getPurpleCatalyst(int aAmount) {
+ return ItemUtils.simpleMetaStack(GenericChem.mGenericChemItem1, 4, aAmount);
+ }
+
+ /**
+ * Platinum + Rhodium Catalyst
+ *
+ * @param aAmount - Stacksize
+ * @return - A Catalyst stack of given size
+ */
+ public static ItemStack getPinkCatalyst(int aAmount) {
+ return ItemUtils.simpleMetaStack(GenericChem.mGenericChemItem1, 6, aAmount);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/slots/SlotCrafting.java b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotCrafting.java
new file mode 100644
index 0000000000..323943b950
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotCrafting.java
@@ -0,0 +1,154 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemHoe;
+import net.minecraft.item.ItemPickaxe;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemSword;
+import net.minecraft.stats.AchievementList;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+
+public class SlotCrafting extends Slot {
+
+ /** The craft matrix inventory linked to this result slot. */
+ private final IInventory craftMatrix;
+ /** The player that is using the GUI where this slot resides. */
+ private final EntityPlayer thePlayer;
+ /**
+ * The number of items that have been crafted so far. Gets passed to ItemStack.onCrafting before being reset.
+ */
+ private int amountCrafted;
+
+ public SlotCrafting(final EntityPlayer p_i1823_1_, final IInventory p_i1823_2_, final IInventory p_i1823_3_,
+ final int p_i1823_4_, final int p_i1823_5_, final int p_i1823_6_) {
+ super(p_i1823_3_, p_i1823_4_, p_i1823_5_, p_i1823_6_);
+ this.thePlayer = p_i1823_1_;
+ this.craftMatrix = p_i1823_2_;
+ }
+
+ /**
+ * Check if the stack is a valid item for this slot. Always true beside for the armor slots.
+ */
+ @Override
+ public boolean isItemValid(final ItemStack p_75214_1_) {
+ return false;
+ }
+
+ /**
+ * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
+ * stack.
+ */
+ @Override
+ public ItemStack decrStackSize(final int p_75209_1_) {
+ if (this.getHasStack()) {
+ this.amountCrafted += Math.min(p_75209_1_, this.getStack().stackSize);
+ }
+
+ return super.decrStackSize(p_75209_1_);
+ }
+
+ /**
+ * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
+ * internal count then calls onCrafting(item).
+ */
+ @Override
+ protected void onCrafting(final ItemStack p_75210_1_, final int p_75210_2_) {
+ this.amountCrafted += p_75210_2_;
+ this.onCrafting(p_75210_1_);
+ }
+
+ /**
+ * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood.
+ */
+ @Override
+ protected void onCrafting(final ItemStack p_75208_1_) {
+ p_75208_1_.onCrafting(this.thePlayer.worldObj, this.thePlayer, this.amountCrafted);
+ this.amountCrafted = 0;
+
+ if (p_75208_1_.getItem() == Item.getItemFromBlock(Blocks.crafting_table)) {
+ this.thePlayer.addStat(AchievementList.buildWorkBench, 1);
+ }
+
+ if (p_75208_1_.getItem() instanceof ItemPickaxe) {
+ this.thePlayer.addStat(AchievementList.buildPickaxe, 1);
+ }
+
+ if (p_75208_1_.getItem() == Item.getItemFromBlock(Blocks.furnace)) {
+ this.thePlayer.addStat(AchievementList.buildFurnace, 1);
+ }
+
+ if (p_75208_1_.getItem() instanceof ItemHoe) {
+ this.thePlayer.addStat(AchievementList.buildHoe, 1);
+ }
+
+ if (p_75208_1_.getItem() == Items.bread) {
+ this.thePlayer.addStat(AchievementList.makeBread, 1);
+ }
+
+ if (p_75208_1_.getItem() == Items.cake) {
+ this.thePlayer.addStat(AchievementList.bakeCake, 1);
+ }
+
+ if ((p_75208_1_.getItem() instanceof ItemPickaxe)
+ && (((ItemPickaxe) p_75208_1_.getItem()).func_150913_i() != Item.ToolMaterial.WOOD)) {
+ this.thePlayer.addStat(AchievementList.buildBetterPickaxe, 1);
+ }
+
+ if (p_75208_1_.getItem() instanceof ItemSword) {
+ this.thePlayer.addStat(AchievementList.buildSword, 1);
+ }
+
+ if (p_75208_1_.getItem() == Item.getItemFromBlock(Blocks.enchanting_table)) {
+ this.thePlayer.addStat(AchievementList.enchantments, 1);
+ }
+
+ if (p_75208_1_.getItem() == Item.getItemFromBlock(Blocks.bookshelf)) {
+ this.thePlayer.addStat(AchievementList.bookcase, 1);
+ }
+ }
+
+ @Override
+ public void onPickupFromSlot(final EntityPlayer p_82870_1_, final ItemStack p_82870_2_) {
+ FMLCommonHandler.instance()
+ .firePlayerCraftingEvent(p_82870_1_, p_82870_2_, this.craftMatrix);
+ this.onCrafting(p_82870_2_);
+
+ for (int i = 0; i < this.craftMatrix.getSizeInventory(); ++i) {
+ final ItemStack itemstack1 = this.craftMatrix.getStackInSlot(i);
+
+ if (itemstack1 != null) {
+ this.craftMatrix.decrStackSize(i, 1);
+
+ if (itemstack1.getItem()
+ .hasContainerItem(itemstack1)) {
+ final ItemStack itemstack2 = itemstack1.getItem()
+ .getContainerItem(itemstack1);
+
+ if ((itemstack2 != null) && itemstack2.isItemStackDamageable()
+ && (itemstack2.getItemDamage() > itemstack2.getMaxDamage())) {
+ MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(this.thePlayer, itemstack2));
+ continue;
+ }
+
+ if (!itemstack1.getItem()
+ .doesContainerItemLeaveCraftingGrid(itemstack1)
+ || !this.thePlayer.inventory.addItemStackToInventory(itemstack2)) {
+ if (this.craftMatrix.getStackInSlot(i) == null) {
+ this.craftMatrix.setInventorySlotContents(i, itemstack2);
+ } else {
+ this.thePlayer.dropPlayerItemWithRandomChoice(itemstack2, false);
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/slots/SlotCraftingNoCollect.java b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotCraftingNoCollect.java
new file mode 100644
index 0000000000..03581ef705
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotCraftingNoCollect.java
@@ -0,0 +1,139 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemHoe;
+import net.minecraft.item.ItemPickaxe;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemSword;
+import net.minecraft.stats.AchievementList;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+
+public class SlotCraftingNoCollect extends SlotCrafting {
+
+ /** The craft matrix inventory linked to this result slot. */
+ private final IInventory craftMatrix;
+ /** The player that is using the GUI where this slot resides. */
+ private EntityPlayer thePlayer;
+ /**
+ * The number of items that have been crafted so far. Gets passed to ItemStack.onCrafting before being reset.
+ */
+ private int amountCrafted;
+
+ public SlotCraftingNoCollect(EntityPlayer player, IInventory inventory, IInventory inventory2, int x, int y,
+ int z) {
+ super(player, inventory, inventory2, x, y, z);
+ this.thePlayer = player;
+ this.craftMatrix = inventory;
+ }
+
+ /**
+ * Check if the stack is a valid item for this slot. Always true beside for the armor slots.
+ */
+ @Override
+ public boolean isItemValid(ItemStack p_75214_1_) {
+ return false;
+ }
+
+ /**
+ * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
+ * stack.
+ */
+ @Override
+ public ItemStack decrStackSize(int amount) {
+ if (this.getHasStack()) {
+ this.amountCrafted += Math.min(amount, this.getStack().stackSize);
+ }
+
+ return super.decrStackSize(amount);
+ }
+
+ /**
+ * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
+ * internal count then calls onCrafting(item).
+ */
+ @Override
+ protected void onCrafting(ItemStack output, int amount) {
+ this.amountCrafted += amount;
+ this.onCrafting(output);
+ }
+
+ /**
+ * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood.
+ */
+ @Override
+ protected void onCrafting(ItemStack output) {
+ output.onCrafting(this.thePlayer.worldObj, this.thePlayer, this.amountCrafted);
+ this.amountCrafted = 0;
+
+ if (output.getItem() == Item.getItemFromBlock(Blocks.crafting_table)) {
+ this.thePlayer.addStat(AchievementList.buildWorkBench, 1);
+ }
+
+ if (output.getItem() instanceof ItemPickaxe) {
+ this.thePlayer.addStat(AchievementList.buildPickaxe, 1);
+ }
+
+ if (output.getItem() == Item.getItemFromBlock(Blocks.furnace)) {
+ this.thePlayer.addStat(AchievementList.buildFurnace, 1);
+ }
+
+ if (output.getItem() instanceof ItemHoe) {
+ this.thePlayer.addStat(AchievementList.buildHoe, 1);
+ }
+
+ if (output.getItem() == Items.bread) {
+ this.thePlayer.addStat(AchievementList.makeBread, 1);
+ }
+
+ if (output.getItem() == Items.cake) {
+ this.thePlayer.addStat(AchievementList.bakeCake, 1);
+ }
+
+ if (output.getItem() instanceof ItemPickaxe
+ && ((ItemPickaxe) output.getItem()).func_150913_i() != Item.ToolMaterial.WOOD) {
+ this.thePlayer.addStat(AchievementList.buildBetterPickaxe, 1);
+ }
+
+ if (output.getItem() instanceof ItemSword) {
+ this.thePlayer.addStat(AchievementList.buildSword, 1);
+ }
+
+ if (output.getItem() == Item.getItemFromBlock(Blocks.enchanting_table)) {
+ this.thePlayer.addStat(AchievementList.enchantments, 1);
+ }
+
+ if (output.getItem() == Item.getItemFromBlock(Blocks.bookshelf)) {
+ this.thePlayer.addStat(AchievementList.bookcase, 1);
+ }
+ }
+
+ @Override
+ public void onPickupFromSlot(EntityPlayer player, ItemStack output) {
+ FMLCommonHandler.instance()
+ .firePlayerCraftingEvent(player, output, craftMatrix);
+ this.onCrafting(output);
+
+ /*
+ * for (int i = 0; i < this.craftMatrix.getSizeInventory(); ++i) { ItemStack itemstack1 =
+ * this.craftMatrix.getStackInSlot(i); if (itemstack1 != null) { this.craftMatrix.decrStackSize(i, 1); if
+ * (itemstack1.getItem().hasContainerItem(itemstack1)) { ItemStack itemstack2 =
+ * itemstack1.getItem().getContainerItem(itemstack1); if (itemstack2 != null &&
+ * itemstack2.isItemStackDamageable() && itemstack2.getItemDamage() > itemstack2.getMaxDamage()) {
+ * MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(thePlayer, itemstack2)); continue; } if
+ * (!itemstack1.getItem().doesContainerItemLeaveCraftingGrid(itemstack1) ||
+ * !this.thePlayer.inventory.addItemStackToInventory(itemstack2)) { if (this.craftMatrix.getStackInSlot(i) ==
+ * null) { this.craftMatrix.setInventorySlotContents(i, itemstack2); } else {
+ * this.thePlayer.dropPlayerItemWithRandomChoice(itemstack2, false); } } } } }
+ */
+ }
+
+ @Override
+ public boolean canTakeStack(EntityPlayer player) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/slots/SlotDataStick.java b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotDataStick.java
new file mode 100644
index 0000000000..3b39da877a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotDataStick.java
@@ -0,0 +1,42 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.recipe.common.CI;
+
+public class SlotDataStick extends Slot {
+
+ public SlotDataStick(final IInventory inventory, final int slot, final int x, final int y) {
+ super(inventory, slot, x, y);
+ }
+
+ public static ItemStack[] mDataItems = new ItemStack[2];
+
+ @Override
+ public synchronized boolean isItemValid(final ItemStack itemstack) {
+ boolean isValid = false;
+ if (itemstack != null) {
+ if (mDataItems[0] == null) {
+ mDataItems[0] = CI.getDataStick();
+ }
+ if (mDataItems[1] == null) {
+ mDataItems[1] = CI.getDataOrb();
+ }
+ if (mDataItems[0] != null && mDataItems[1] != null) {
+ if (GT_Utility.areStacksEqual(itemstack, mDataItems[0], true)
+ || GT_Utility.areStacksEqual(itemstack, mDataItems[1], true)) {
+ isValid = true;
+ }
+ }
+ }
+ return isValid;
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/slots/SlotGeneric.java b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotGeneric.java
new file mode 100644
index 0000000000..bfb384efe8
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotGeneric.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+public class SlotGeneric extends Slot {
+
+ public SlotGeneric(final IInventory inventory, final int aSlotID, final int x, final int y) {
+ super(inventory, aSlotID, x, y);
+ }
+
+ @Override
+ public boolean isItemValid(final ItemStack itemstack) {
+ return true;
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return 64;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/slots/SlotIntegratedCircuit.java b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotIntegratedCircuit.java
new file mode 100644
index 0000000000..dc75c88369
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotIntegratedCircuit.java
@@ -0,0 +1,110 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.recipe.common.CI;
+
+public class SlotIntegratedCircuit extends Slot {
+
+ public static Item mCircuitItem;
+ public static Item mCircuitItem2;
+ public static Item mCircuitItem3;
+ private final short mCircuitLock;
+
+ public SlotIntegratedCircuit(final IInventory inventory, final int slot, final int x, final int y) {
+ this(Short.MAX_VALUE + 1, inventory, slot, x, y);
+ }
+
+ public SlotIntegratedCircuit(int mTypeLock, final IInventory inventory, final int slot, final int x, final int y) {
+ super(inventory, slot, x, y);
+ if (mTypeLock > Short.MAX_VALUE || mTypeLock < Short.MIN_VALUE) {
+ mCircuitLock = -1;
+ } else {
+ mCircuitLock = (short) mTypeLock;
+ }
+ }
+
+ @Override
+ public synchronized boolean isItemValid(final ItemStack itemstack) {
+ return isItemValidForSlot(mCircuitLock, itemstack);
+ }
+
+ public static synchronized boolean isItemValidForSlot(final ItemStack itemstack) {
+ return isItemValidForSlot(-1, itemstack);
+ }
+
+ public static synchronized boolean isItemValidForSlot(int aLockedCircuitNumber, final ItemStack itemstack) {
+ boolean isValid = false;
+ if (mCircuitItem == null) {
+ mCircuitItem = CI.getNumberedCircuit(0)
+ .getItem();
+ }
+ if (mCircuitItem2 == null) {
+ mCircuitItem2 = CI.getNumberedBioCircuit(0)
+ .getItem();
+ }
+ if (mCircuitItem3 == null) {
+ mCircuitItem3 = CI.getNumberedAdvancedCircuit(0)
+ .getItem();
+ }
+ if (mCircuitItem != null && mCircuitItem2 != null && mCircuitItem3 != null) {
+ if (itemstack != null) {
+ if (itemstack.getItem() == mCircuitItem || itemstack.getItem() == mCircuitItem2
+ || itemstack.getItem() == mCircuitItem3) {
+ if (aLockedCircuitNumber == -1) {
+ isValid = true;
+ } else {
+ if (itemstack.getItemDamage() == aLockedCircuitNumber) {
+ isValid = true;
+ }
+ }
+ }
+ }
+ }
+ return isValid;
+ }
+
+ /**
+ * Returns the circuit type. -1 is invalid, 0 is standard, 1 is GT++ bio.
+ *
+ * @param itemstack - the Circuit Stack.
+ * @return
+ */
+ public static synchronized int isRegularProgrammableCircuit(final ItemStack itemstack) {
+ if (mCircuitItem == null) {
+ mCircuitItem = CI.getNumberedCircuit(0)
+ .getItem();
+ }
+ if (mCircuitItem2 == null) {
+ mCircuitItem2 = CI.getNumberedBioCircuit(0)
+ .getItem();
+ }
+ if (mCircuitItem3 == null) {
+ mCircuitItem3 = CI.getNumberedAdvancedCircuit(0)
+ .getItem();
+ }
+ if (mCircuitItem != null && mCircuitItem2 != null && mCircuitItem3 != null) {
+ if (itemstack != null) {
+ if (itemstack.getItem() == mCircuitItem || itemstack.getItem() == mCircuitItem2
+ || itemstack.getItem() == mCircuitItem3) {
+ if (itemstack.getItem() == mCircuitItem) {
+ return 0;
+ } else if (itemstack.getItem() == mCircuitItem2) {
+ return 1;
+ } else if (itemstack.getItem() == mCircuitItem3) {
+ return 2;
+ }
+ }
+ }
+ }
+ return -1;
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return 64;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/slots/SlotJukebox.java b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotJukebox.java
new file mode 100644
index 0000000000..1351e5c188
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotJukebox.java
@@ -0,0 +1,35 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemRecord;
+import net.minecraft.item.ItemStack;
+
+public class SlotJukebox extends SlotGeneric {
+
+ private final boolean isDisplay;
+
+ public SlotJukebox(IInventory inventory, int x, int y, int z) {
+ this(inventory, x, y, z, false);
+ }
+
+ public SlotJukebox(IInventory inventory, int x, int y, int z, boolean display) {
+ super(inventory, x, y, z);
+ isDisplay = display;
+ }
+
+ @Override
+ public boolean isItemValid(ItemStack itemstack) {
+ return (itemstack != null && itemstack.getItem() instanceof ItemRecord);
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+
+ @Override
+ public boolean canTakeStack(EntityPlayer p_82869_1_) {
+ return !isDisplay;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/slots/SlotNoInput.java b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotNoInput.java
new file mode 100644
index 0000000000..d4e8696075
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotNoInput.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+public class SlotNoInput extends Slot {
+
+ public SlotNoInput(final IInventory inventory, final int index, final int x, final int y) {
+ super(inventory, index, x, y);
+ }
+
+ @Override
+ public boolean isItemValid(final ItemStack itemstack) {
+ return false;
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return 0;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/slots/SlotVolumetricFlask.java b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotVolumetricFlask.java
new file mode 100644
index 0000000000..c84c88a0b5
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/slots/SlotVolumetricFlask.java
@@ -0,0 +1,28 @@
+package gtPlusPlus.core.slots;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.xmod.gregtech.common.helpers.VolumetricFlaskHelper;
+
+public class SlotVolumetricFlask extends Slot {
+
+ public SlotVolumetricFlask(final IInventory inventory, final int slot, final int x, final int y) {
+ super(inventory, slot, x, y);
+ }
+
+ @Override
+ public synchronized boolean isItemValid(final ItemStack itemstack) {
+ return isItemValidForSlot(itemstack);
+ }
+
+ public static synchronized boolean isItemValidForSlot(final ItemStack itemstack) {
+ return VolumetricFlaskHelper.isVolumetricFlask(itemstack);
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return 16;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/tileentities/ModTileEntities.java b/gtpp/src/main/java/gtPlusPlus/core/tileentities/ModTileEntities.java
new file mode 100644
index 0000000000..56cf2fdbab
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/tileentities/ModTileEntities.java
@@ -0,0 +1,35 @@
+package gtPlusPlus.core.tileentities;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.general.BlockSuperLight.TileEntitySuperLight;
+import gtPlusPlus.core.block.machine.Machine_SuperJukebox.TileEntitySuperJukebox;
+import gtPlusPlus.core.tileentities.general.TileEntityCircuitProgrammer;
+import gtPlusPlus.core.tileentities.general.TileEntityDecayablesChest;
+import gtPlusPlus.core.tileentities.general.TileEntityFishTrap;
+import gtPlusPlus.core.tileentities.general.TileEntityInfiniteFluid;
+import gtPlusPlus.core.tileentities.general.TileEntityVolumetricFlaskSetter;
+import gtPlusPlus.core.tileentities.machines.TileEntityAdvPooCollector;
+import gtPlusPlus.core.tileentities.machines.TileEntityPestKiller;
+import gtPlusPlus.core.tileentities.machines.TileEntityPooCollector;
+import gtPlusPlus.core.tileentities.machines.TileEntityProjectTable;
+
+public class ModTileEntities {
+
+ public static void init() {
+ Logger.INFO("Registering Tile Entities.");
+ GameRegistry.registerTileEntity(TileEntityPooCollector.class, "TileEntityPooCollector");
+ GameRegistry.registerTileEntity(TileEntityAdvPooCollector.class, "TileEntityAdvPooCollector");
+ GameRegistry.registerTileEntity(TileEntityFishTrap.class, "TileFishTrap");
+ GameRegistry.registerTileEntity(TileEntityInfiniteFluid.class, "TileInfiniteFluid");
+ GameRegistry.registerTileEntity(TileEntityProjectTable.class, "TileProjectTable");
+ GameRegistry.registerTileEntity(TileEntityCircuitProgrammer.class, "TileCircuitProgrammer");
+ GameRegistry.registerTileEntity(TileEntityDecayablesChest.class, "TileDecayablesChest");
+ GameRegistry.registerTileEntity(TileEntitySuperJukebox.class, "TileEntitySuperJukebox");
+ GameRegistry.registerTileEntity(TileEntitySuperLight.class, "TileEntitySuperLight");
+ GameRegistry.registerTileEntity(TileEntityPestKiller.class, "TileEntityPestKiller");
+
+ GameRegistry.registerTileEntity(TileEntityVolumetricFlaskSetter.class, "TileEntityVolumetricFlaskSetter");
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/tileentities/base/TileEntityBase.java b/gtpp/src/main/java/gtPlusPlus/core/tileentities/base/TileEntityBase.java
new file mode 100644
index 0000000000..98f1d67439
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/tileentities/base/TileEntityBase.java
@@ -0,0 +1,1419 @@
+package gtPlusPlus.core.tileentities.base;
+
+import java.util.UUID;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.IDescribable;
+import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.net.GT_Packet_Block_Event;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.covers.CoverInfo;
+import gtPlusPlus.api.interfaces.ILazyCoverable;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.BTF_Inventory;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import ic2.api.Direction;
+
+public class TileEntityBase extends TileEntity implements ILazyCoverable, IGregTechDeviceInformation, IDescribable {
+
+ private String customName;
+ public String mOwnerName = "null";
+ public String mOwnerUUID = "null";
+ private boolean mIsOwnerOP = false;
+
+ public final BTF_Inventory mInventory;
+
+ public TileEntityBase(int aCapacity) {
+ mInventory = new BTF_Inventory(aCapacity, this);
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ super.writeToNBT(nbt);
+ if (this.hasCustomInventoryName()) {
+ nbt.setString("CustomName", this.getCustomName());
+ }
+ nbt.setBoolean("mIsOwnerOP", this.mIsOwnerOP);
+ nbt.setString("mOwnerName", this.mOwnerName);
+ nbt.setString("mOwnerUUID", this.mOwnerUUID);
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+
+ super.readFromNBT(nbt);
+
+ if (nbt.hasKey("CustomName", 8)) {
+ this.setCustomName(nbt.getString("CustomName"));
+ }
+
+ this.mIsOwnerOP = nbt.getBoolean("mIsOwnerOP");
+ this.mOwnerName = nbt.getString("mOwnerName");
+ this.mOwnerUUID = nbt.getString("mOwnerUUID");
+ }
+
+ @Override
+ public void updateEntity() {
+ long aTick = System.currentTimeMillis();
+ this.isDead = false;
+ if (!firstTicked) {
+ onFirstTick();
+ }
+ try {
+ if (this.isServerSide()) {
+ onPreTick(aTick);
+ }
+ } catch (Throwable t) {
+ Logger.ERROR("Tile Entity Encountered an error in it's pre-tick stage.");
+ t.printStackTrace();
+ }
+ try {
+ if (this.isServerSide()) {
+ onTick(aTick);
+ }
+ } catch (Throwable t) {
+ Logger.ERROR("Tile Entity Encountered an error in it's tick stage.");
+ t.printStackTrace();
+ }
+ try {
+ if (this.isServerSide()) {
+ onPostTick(aTick);
+ }
+ } catch (Throwable t) {
+ Logger.ERROR("Tile Entity Encountered an error in it's post-tick stage.");
+ t.printStackTrace();
+ }
+ }
+
+ public boolean onPreTick(long aTick) {
+ return true;
+ }
+
+ public boolean onTick(long aTick) {
+ try {
+ if (this.isServerSide()) {
+ processRecipe();
+ }
+ } catch (Throwable t) {
+ Logger.ERROR("Tile Entity Encountered an error in it's processing of a recipe stage.");
+ t.printStackTrace();
+ }
+ return true;
+ }
+
+ public boolean onPostTick(long aTick) {
+ return true;
+ }
+
+ public boolean processRecipe() {
+ return true;
+ }
+
+ @Override
+ public boolean canUpdate() {
+ return true;
+ }
+
+ public String getOwner() {
+ if (this.mOwnerName == null) {
+ return "null";
+ }
+ return this.mOwnerName;
+ }
+
+ public UUID getOwnerUUID() {
+ return UUID.fromString(this.mOwnerUUID);
+ }
+
+ public boolean isOwnerOP() {
+ return mIsOwnerOP;
+ }
+
+ public void setOwnerInformation(String mName, String mUUID, boolean mOP) {
+ if (isServerSide()) {
+ if (this.mOwnerName == null || this.mOwnerUUID == null
+ || this.mOwnerName.equals("null")
+ || this.mOwnerUUID.equals("null")) {
+ this.mOwnerName = mName;
+ this.mOwnerUUID = mUUID;
+ this.mIsOwnerOP = mOP;
+ }
+ }
+ }
+
+ @Override
+ public boolean isServerSide() {
+ if (this.hasWorldObj()) {
+ if (!this.getWorldObj().isRemote) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public final boolean isClientSide() {
+ return this.worldObj.isRemote;
+ }
+
+ public String getCustomName() {
+ return this.customName;
+ }
+
+ public void setCustomName(String customName) {
+ this.customName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.customName : "container.tileentity.name";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return this.customName != null && !this.customName.equals("");
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.mInventory.getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(int aIndex) {
+ return this.mInventory.getStackInSlot(aIndex);
+ }
+
+ @Override
+ public ItemStack decrStackSize(int aIndex, int aAmount) {
+ if (canAccessData()) {
+ mInventoryChanged = true;
+ return mInventory.decrStackSize(aIndex, aAmount);
+ }
+ return null;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(int p_70304_1_) {
+ return this.mInventory.getStackInSlotOnClosing(p_70304_1_);
+ }
+
+ @Override
+ public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_) {
+ this.mInventory.setInventorySlotContents(p_70299_1_, p_70299_2_);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return this.mInventory.getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean isUseableByPlayer(EntityPlayer p_70300_1_) {
+ return this.mInventory.isUseableByPlayer(p_70300_1_);
+ }
+
+ @Override
+ public void openInventory() {
+ this.mInventory.openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ this.mInventory.closeInventory();
+ }
+
+ /**
+ * Can put aStack into Slot
+ */
+ @Override
+ public boolean isItemValidForSlot(int aIndex, ItemStack aStack) {
+ return canAccessData() && mInventory.isItemValidForSlot(aIndex, aStack);
+ }
+
+ /**
+ * returns all valid Inventory Slots, no matter which Side (Unless it's covered). The Side Stuff is done in the
+ * following two Functions.
+ */
+ @Override
+ public int[] getAccessibleSlotsFromSide(int ordinalSide) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (canAccessData() && (coverInfo.letsItemsOut(-1) || coverInfo.letsItemsIn(-1)))
+ return mInventory.getAccessibleSlotsFromSide(ordinalSide);
+ return new int[0];
+ }
+
+ /**
+ * Can put aStack into Slot at Side
+ */
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ return canAccessData() && (mRunningThroughTick || !mInputDisabled)
+ && getCoverInfoAtSide(side).letsItemsIn(aIndex)
+ && mInventory.canInsertItem(aIndex, aStack, ordinalSide);
+ }
+
+ /**
+ * Can pull aStack out of Slot from Side
+ */
+ @Override
+ public boolean canExtractItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ return canAccessData() && (mRunningThroughTick || !mOutputDisabled)
+ && getCoverInfoAtSide(side).letsItemsOut(aIndex)
+ && mInventory.canExtractItem(aIndex, aStack, ordinalSide);
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return this.canAccessData() ? this.mInventory.isValidSlot(aIndex) : false;
+ }
+
+ private final GT_CoverBehavior[] mCoverBehaviors = new GT_CoverBehavior[] { GregTech_API.sNoBehavior,
+ GregTech_API.sNoBehavior, GregTech_API.sNoBehavior, GregTech_API.sNoBehavior, GregTech_API.sNoBehavior,
+ GregTech_API.sNoBehavior };
+ protected TileEntityBase mMetaTileEntity;
+ protected long mStoredEnergy = 0;
+ protected int mAverageEUInputIndex = 0, mAverageEUOutputIndex = 0;
+ protected boolean mReleaseEnergy = false;
+ protected int[] mAverageEUInput = new int[11], mAverageEUOutput = new int[11];
+ private boolean[] mActiveEUInputs = new boolean[] { false, false, false, false, false, false },
+ mActiveEUOutputs = new boolean[] { false, false, false, false, false, false };
+ private byte[] mSidedRedstone = new byte[] { 15, 15, 15, 15, 15, 15 };
+ private int[] mCoverSides = new int[] { 0, 0, 0, 0, 0, 0 }, mCoverData = new int[] { 0, 0, 0, 0, 0, 0 },
+ mTimeStatistics = new int[GregTech_API.TICKS_FOR_LAG_AVERAGING];
+ private boolean mHasEnoughEnergy = true;
+ protected boolean mRunningThroughTick = false;
+ protected boolean mInputDisabled = false;
+ protected boolean mOutputDisabled = false;
+ private boolean mMuffler = false;
+ private boolean mLockUpgrade = false;
+ private boolean mActive = false;
+ private boolean mRedstone = false;
+ private boolean mWorkUpdate = false;
+ private boolean mSteamConverter = false;
+ private boolean mInventoryChanged = false;
+ private boolean mWorks = true;
+ private boolean mNeedsUpdate = true;
+ private boolean mNeedsBlockUpdate = true;
+ private boolean mSendClientData = false;
+ private boolean oRedstone = false;
+ private boolean mEnergyStateReady = false;
+ private byte mColor = 0, oColor = 0, mStrongRedstone = 0, oRedstoneData = 63, oTextureData = 0, oUpdateData = 0,
+ oTexturePage = 0, oLightValueClient = -1, oLightValue = -1, mLightValue = 0, mOtherUpgrades = 0, mFacing = 0,
+ oFacing = 0, mWorkData = 0;
+ private int mDisplayErrorCode = 0, oX = 0, oY = 0, oZ = 0, mTimeStatisticsIndex = 0, mLagWarningCount = 0;
+ private short mID = 0;
+ protected long mTickTimer = 0;
+ private long oOutput = 0;
+ private long mAcceptedAmperes = Long.MAX_VALUE;
+
+ /**
+ * Cover Support
+ */
+ public void issueClientUpdate() {
+ this.mSendClientData = true;
+ }
+
+ protected final boolean canAccessData() {
+ return !isDead() && !this.isInvalid();
+ }
+
+ @Override
+ public void issueBlockUpdate() {
+ super.markDirty();
+ }
+
+ @Override
+ public void issueCoverUpdate(ForgeDirection side) {
+ this.issueClientUpdate();
+ }
+
+ @Override
+ public void receiveCoverData(ForgeDirection coverSide, int coverID, int coverData) {
+ if (coverSide != ForgeDirection.UNKNOWN && (mCoverSides[coverSide.ordinal()] == coverID))
+ setCoverDataAtSide(coverSide, coverData);
+ }
+
+ @Override
+ public long getTimer() {
+ return this.mTickTimer;
+ }
+
+ @Override
+ public long getOutputAmperage() {
+ return this.canAccessData() && this.mMetaTileEntity.isElectric() ? this.mMetaTileEntity.maxAmperesOut() : 0L;
+ }
+
+ @Override
+ public long getOutputVoltage() {
+ return this.canAccessData() && this.mMetaTileEntity.isElectric() && this.mMetaTileEntity.isEnetOutput()
+ ? this.mMetaTileEntity.maxEUOutput()
+ : 0L;
+ }
+
+ @Override
+ public long getInputAmperage() {
+ return this.canAccessData() && this.mMetaTileEntity.isElectric() ? this.mMetaTileEntity.maxAmperesIn() : 0L;
+ }
+
+ @Override
+ public long getInputVoltage() {
+ return this.canAccessData() && this.mMetaTileEntity.isElectric() ? this.mMetaTileEntity.maxEUInput()
+ : 2147483647L;
+ }
+
+ @Override
+ public boolean decreaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooLessEnergy) {
+ return !this.canAccessData() ? false
+ : (this.mHasEnoughEnergy = this.decreaseStoredEU(aEnergy, aIgnoreTooLessEnergy));
+ }
+
+ @Override
+ public boolean increaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooMuchEnergy) {
+ if (!this.canAccessData()) {
+ return false;
+ } else if (this.getStoredEU() >= this.getEUCapacity() && !aIgnoreTooMuchEnergy) {
+ return false;
+ } else {
+ this.setStoredEU(this.mMetaTileEntity.getEUVar() + aEnergy);
+ return true;
+ }
+ }
+
+ @Override
+ public boolean inputEnergyFrom(ForgeDirection side) {
+ return side == ForgeDirection.UNKNOWN ? true
+ : (!this.isServerSide() ? this.isEnergyInputSide(side)
+ : side != ForgeDirection.UNKNOWN && this.mActiveEUInputs[side.ordinal()] && !this.mReleaseEnergy);
+ }
+
+ @Override
+ public boolean outputsEnergyTo(ForgeDirection side) {
+ return side == ForgeDirection.UNKNOWN ? true
+ : (!this.isServerSide() ? this.isEnergyOutputSide(side)
+ : side != ForgeDirection.UNKNOWN && this.mActiveEUOutputs[side.ordinal()] || this.mReleaseEnergy);
+ }
+
+ private boolean isEnergyInputSide(ForgeDirection side) {
+ if (side != ForgeDirection.UNKNOWN) {
+ if (!this.getCoverInfoAtSide(side)
+ .letsEnergyIn()) {
+ return false;
+ }
+
+ if (this.isInvalid() || this.mReleaseEnergy) {
+ return false;
+ }
+
+ if (this.canAccessData() && this.mMetaTileEntity.isElectric() && this.mMetaTileEntity.isEnetInput()) {
+ return this.mMetaTileEntity.isInputFacing(side);
+ }
+ }
+
+ return false;
+ }
+
+ private boolean isEnergyOutputSide(ForgeDirection side) {
+ if (side != ForgeDirection.UNKNOWN) {
+ if (!this.getCoverInfoAtSide(side)
+ .letsEnergyOut()) {
+ return false;
+ }
+
+ if (this.isInvalid() || this.mReleaseEnergy) {
+ return this.mReleaseEnergy;
+ }
+
+ if (this.canAccessData() && this.mMetaTileEntity.isElectric() && this.mMetaTileEntity.isEnetOutput()) {
+ return this.mMetaTileEntity.isOutputFacing(side);
+ }
+ }
+
+ return false;
+ }
+
+ public boolean isOutputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ public boolean isInputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ private final TileEntity[] mBufferedTileEntities = new TileEntity[6];
+ public boolean ignoreUnloadedChunks = true;
+ public boolean isDead = false;
+
+ private void clearNullMarkersFromTileEntityBuffer() {
+ for (int i = 0; i < this.mBufferedTileEntities.length; ++i) {
+ if (this.mBufferedTileEntities[i] == this) {
+ this.mBufferedTileEntities[i] = null;
+ }
+ }
+ }
+
+ protected final void clearTileEntityBuffer() {
+ for (int i = 0; i < this.mBufferedTileEntities.length; ++i) {
+ this.mBufferedTileEntities[i] = null;
+ }
+ }
+
+ @Override
+ public final World getWorld() {
+ return this.worldObj;
+ }
+
+ @Override
+ public final int getXCoord() {
+ return this.xCoord;
+ }
+
+ @Override
+ public final short getYCoord() {
+ return (short) this.yCoord;
+ }
+
+ @Override
+ public final int getZCoord() {
+ return this.zCoord;
+ }
+
+ @Override
+ public final int getOffsetX(ForgeDirection side, int aMultiplier) {
+ return this.xCoord + side.offsetX * aMultiplier;
+ }
+
+ @Override
+ public final short getOffsetY(ForgeDirection side, int aMultiplier) {
+ return (short) (this.yCoord + side.offsetY * aMultiplier);
+ }
+
+ @Override
+ public final int getOffsetZ(ForgeDirection side, int aMultiplier) {
+ return this.zCoord + side.offsetZ * aMultiplier;
+ }
+
+ @Override
+ public final int getRandomNumber(int aRange) {
+ return this.worldObj.rand.nextInt(aRange);
+ }
+
+ @Override
+ public final BiomeGenBase getBiome(int aX, int aZ) {
+ return this.worldObj.getBiomeGenForCoords(aX, aZ);
+ }
+
+ @Override
+ public final BiomeGenBase getBiome() {
+ return this.getBiome(this.xCoord, this.zCoord);
+ }
+
+ @Override
+ public final Block getBlockOffset(int aX, int aY, int aZ) {
+ return this.getBlock(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final Block getBlockAtSide(ForgeDirection side) {
+ return this.getBlockAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final Block getBlockAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return this.getBlock(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final byte getMetaIDOffset(int aX, int aY, int aZ) {
+ return this.getMetaID(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final byte getMetaIDAtSide(ForgeDirection side) {
+ return this.getMetaIDAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final byte getMetaIDAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return this.getMetaID(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final byte getLightLevelOffset(int aX, int aY, int aZ) {
+ return this.getLightLevel(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final byte getLightLevelAtSide(ForgeDirection side) {
+ return this.getLightLevelAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final byte getLightLevelAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return this.getLightLevel(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final boolean getOpacityOffset(int aX, int aY, int aZ) {
+ return this.getOpacity(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final boolean getOpacityAtSide(ForgeDirection side) {
+ return this.getOpacityAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final boolean getOpacityAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return this.getOpacity(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final boolean getSkyOffset(int aX, int aY, int aZ) {
+ return this.getSky(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final boolean getSkyAtSide(ForgeDirection side) {
+ return this.getSkyAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final boolean getSkyAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return this.getSky(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final boolean getAirOffset(int aX, int aY, int aZ) {
+ return this.getAir(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final boolean getAirAtSide(ForgeDirection side) {
+ return this.getAirAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final boolean getAirAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return this.getAir(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final TileEntity getTileEntityOffset(int aX, int aY, int aZ) {
+ return this.getTileEntity(this.xCoord + aX, this.yCoord + aY, this.zCoord + aZ);
+ }
+
+ @Override
+ public final TileEntity getTileEntityAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return aDistance == 1 ? this.getTileEntityAtSide(side)
+ : this.getTileEntity(
+ this.getOffsetX(side, aDistance),
+ this.getOffsetY(side, aDistance),
+ this.getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final IInventory getIInventory(int aX, int aY, int aZ) {
+ TileEntity tTileEntity = this.getTileEntity(aX, aY, aZ);
+ return tTileEntity instanceof IInventory ? (IInventory) tTileEntity : null;
+ }
+
+ @Override
+ public final IInventory getIInventoryOffset(int aX, int aY, int aZ) {
+ TileEntity tTileEntity = this.getTileEntityOffset(aX, aY, aZ);
+ return tTileEntity instanceof IInventory ? (IInventory) tTileEntity : null;
+ }
+
+ @Override
+ public final IInventory getIInventoryAtSide(ForgeDirection side) {
+ TileEntity tTileEntity = this.getTileEntityAtSide(side);
+ return tTileEntity instanceof IInventory ? (IInventory) tTileEntity : null;
+ }
+
+ @Override
+ public final IInventory getIInventoryAtSideAndDistance(ForgeDirection side, int aDistance) {
+ TileEntity tTileEntity = this.getTileEntityAtSideAndDistance(side, aDistance);
+ return tTileEntity instanceof IInventory ? (IInventory) tTileEntity : null;
+ }
+
+ @Override
+ public final IFluidHandler getITankContainer(int aX, int aY, int aZ) {
+ TileEntity tTileEntity = this.getTileEntity(aX, aY, aZ);
+ return tTileEntity instanceof IFluidHandler ? (IFluidHandler) tTileEntity : null;
+ }
+
+ @Override
+ public final IFluidHandler getITankContainerOffset(int aX, int aY, int aZ) {
+ TileEntity tTileEntity = this.getTileEntityOffset(aX, aY, aZ);
+ return tTileEntity instanceof IFluidHandler ? (IFluidHandler) tTileEntity : null;
+ }
+
+ @Override
+ public final IFluidHandler getITankContainerAtSide(ForgeDirection side) {
+ TileEntity tTileEntity = this.getTileEntityAtSide(side);
+ return tTileEntity instanceof IFluidHandler ? (IFluidHandler) tTileEntity : null;
+ }
+
+ @Override
+ public final IFluidHandler getITankContainerAtSideAndDistance(ForgeDirection side, int aDistance) {
+ TileEntity tTileEntity = this.getTileEntityAtSideAndDistance(side, aDistance);
+ return tTileEntity instanceof IFluidHandler ? (IFluidHandler) tTileEntity : null;
+ }
+
+ @Override
+ public final IGregTechTileEntity getIGregTechTileEntity(int aX, int aY, int aZ) {
+ TileEntity tTileEntity = this.getTileEntity(aX, aY, aZ);
+ return tTileEntity instanceof IGregTechTileEntity ? (IGregTechTileEntity) tTileEntity : null;
+ }
+
+ @Override
+ public final IGregTechTileEntity getIGregTechTileEntityOffset(int aX, int aY, int aZ) {
+ TileEntity tTileEntity = this.getTileEntityOffset(aX, aY, aZ);
+ return tTileEntity instanceof IGregTechTileEntity ? (IGregTechTileEntity) tTileEntity : null;
+ }
+
+ @Override
+ public final IGregTechTileEntity getIGregTechTileEntityAtSide(ForgeDirection side) {
+ TileEntity tTileEntity = this.getTileEntityAtSide(side);
+ return tTileEntity instanceof IGregTechTileEntity ? (IGregTechTileEntity) tTileEntity : null;
+ }
+
+ @Override
+ public final IGregTechTileEntity getIGregTechTileEntityAtSideAndDistance(ForgeDirection side, int aDistance) {
+ TileEntity tTileEntity = this.getTileEntityAtSideAndDistance(side, aDistance);
+ return tTileEntity instanceof IGregTechTileEntity ? (IGregTechTileEntity) tTileEntity : null;
+ }
+
+ @Override
+ public final Block getBlock(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? Blocks.air
+ : this.worldObj.getBlock(aX, aY, aZ);
+ }
+
+ @Override
+ public final byte getMetaID(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? 0
+ : (byte) this.worldObj.getBlockMetadata(aX, aY, aZ);
+ }
+
+ @Override
+ public final byte getLightLevel(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? 0
+ : (byte) ((int) (this.worldObj.getLightBrightness(aX, aY, aZ) * 15.0F));
+ }
+
+ @Override
+ public final boolean getSky(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? true
+ : this.worldObj.canBlockSeeTheSky(aX, aY, aZ);
+ }
+
+ @Override
+ public final boolean getOpacity(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? false
+ : GT_Utility.isOpaqueBlock(this.worldObj, aX, aY, aZ);
+ }
+
+ @Override
+ public final boolean getAir(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? true
+ : GT_Utility.isBlockAir(this.worldObj, aX, aY, aZ);
+ }
+
+ @Override
+ public final TileEntity getTileEntity(int aX, int aY, int aZ) {
+ return this.ignoreUnloadedChunks && this.crossedChunkBorder(aX, aZ) && !this.worldObj.blockExists(aX, aY, aZ)
+ ? null
+ : this.worldObj.getTileEntity(aX, aY, aZ);
+ }
+
+ @Override
+ public final TileEntity getTileEntityAtSide(ForgeDirection side) {
+ final int ordinalSide = side.ordinal();
+ if (side != ForgeDirection.UNKNOWN && this.mBufferedTileEntities[ordinalSide] != this) {
+ int tX = this.getOffsetX(side, 1);
+ short tY = this.getOffsetY(side, 1);
+ int tZ = this.getOffsetZ(side, 1);
+ if (this.crossedChunkBorder(tX, tZ)) {
+ this.mBufferedTileEntities[ordinalSide] = null;
+ if (this.ignoreUnloadedChunks && !this.worldObj.blockExists(tX, tY, tZ)) {
+ return null;
+ }
+ }
+
+ if (this.mBufferedTileEntities[ordinalSide] == null) {
+ this.mBufferedTileEntities[ordinalSide] = this.worldObj.getTileEntity(tX, tY, tZ);
+ if (this.mBufferedTileEntities[ordinalSide] == null) {
+ this.mBufferedTileEntities[ordinalSide] = this;
+ return null;
+ } else {
+ return this.mBufferedTileEntities[ordinalSide];
+ }
+ } else if (this.mBufferedTileEntities[ordinalSide].isInvalid()) {
+ this.mBufferedTileEntities[ordinalSide] = null;
+ return this.getTileEntityAtSide(side);
+ } else {
+ return this.mBufferedTileEntities[ordinalSide].xCoord == tX
+ && this.mBufferedTileEntities[ordinalSide].yCoord == tY
+ && this.mBufferedTileEntities[ordinalSide].zCoord == tZ ? this.mBufferedTileEntities[ordinalSide]
+ : null;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public boolean isDead() {
+ return this.isDead || this.isInvalidTileEntity();
+ }
+
+ @Override
+ public void validate() {
+ this.clearNullMarkersFromTileEntityBuffer();
+ super.validate();
+ }
+
+ @Override
+ public void invalidate() {
+ this.clearNullMarkersFromTileEntityBuffer();
+ super.invalidate();
+ }
+
+ @Override
+ public void onChunkUnload() {
+ this.clearNullMarkersFromTileEntityBuffer();
+ super.onChunkUnload();
+ this.isDead = true;
+ }
+
+ public final void onAdjacentBlockChange(int aX, int aY, int aZ) {
+ this.clearNullMarkersFromTileEntityBuffer();
+ }
+
+ @Override
+ public final void sendBlockEvent(byte aID, byte aValue) {
+ GT_Values.NW.sendPacketToAllPlayersInRange(
+ this.worldObj,
+ new GT_Packet_Block_Event(this.xCoord, (short) this.yCoord, this.zCoord, aID, aValue),
+ this.xCoord,
+ this.zCoord);
+ }
+
+ private boolean crossedChunkBorder(int aX, int aZ) {
+ return aX >> 4 != this.xCoord >> 4 || aZ >> 4 != this.zCoord >> 4;
+ }
+
+ public final void setOnFire() {
+ GT_Utility.setCoordsOnFire(this.worldObj, this.xCoord, this.yCoord, this.zCoord, false);
+ }
+
+ public final void setToFire() {
+ this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord, Blocks.fire);
+ }
+
+ @Override
+ public byte getInternalInputRedstoneSignal(ForgeDirection side) {
+ return (byte) (getCoverBehaviorAtSide(side).getRedstoneInput(
+ side,
+ getInputRedstoneSignal(side),
+ getCoverIDAtSide(side),
+ getCoverDataAtSide(side),
+ this) & 15);
+ }
+
+ @Override
+ public byte getInputRedstoneSignal(ForgeDirection side) {
+ return (byte) (worldObj
+ .getIndirectPowerLevelTo(getOffsetX(side, 1), getOffsetY(side, 1), getOffsetZ(side, 1), side.ordinal())
+ & 15);
+ }
+
+ @Override
+ public byte getOutputRedstoneSignal(ForgeDirection side) {
+ return getCoverBehaviorAtSide(side)
+ .manipulatesSidedRedstoneOutput(side, getCoverIDAtSide(side), getCoverDataAtSide(side), this)
+ ? mSidedRedstone[side.ordinal()]
+ : getGeneralRS(side);
+ }
+
+ public boolean allowGeneralRedstoneOutput() {
+ return false;
+ }
+
+ @Override
+ public byte getGeneralRS(ForgeDirection side) {
+ return allowGeneralRedstoneOutput() ? mSidedRedstone[side.ordinal()] : 0;
+ }
+
+ @Override
+ public void setInternalOutputRedstoneSignal(ForgeDirection side, byte aStrength) {
+ if (!getCoverBehaviorAtSide(side)
+ .manipulatesSidedRedstoneOutput(side, getCoverIDAtSide(side), getCoverDataAtSide(side), this))
+ setOutputRedstoneSignal(side, aStrength);
+ }
+
+ @Override
+ public void setOutputRedstoneSignal(ForgeDirection side, byte aStrength) {
+ aStrength = (byte) Math.min(Math.max(0, aStrength), 15);
+ if (side != ForgeDirection.UNKNOWN && mSidedRedstone[side.ordinal()] != aStrength) {
+ mSidedRedstone[side.ordinal()] = aStrength;
+ issueBlockUpdate();
+ }
+ }
+
+ @Override
+ public boolean hasInventoryBeenModified() {
+ return mInventoryChanged;
+ }
+
+ @Override
+ public void setGenericRedstoneOutput(boolean aOnOff) {
+ mRedstone = aOnOff;
+ }
+
+ @Override
+ public GT_CoverBehavior getCoverBehaviorAtSide(ForgeDirection side) {
+ return side != ForgeDirection.UNKNOWN ? mCoverBehaviors[side.ordinal()] : GregTech_API.sNoBehavior;
+ }
+
+ @Override
+ public void setCoverIDAtSide(ForgeDirection side, int aID) {
+ if (setCoverIDAtSideNoUpdate(side, aID)) {
+ issueCoverUpdate(side);
+ issueBlockUpdate();
+ }
+ }
+
+ @Override
+ public boolean setCoverIDAtSideNoUpdate(ForgeDirection side, int aID) {
+ if (side != ForgeDirection.UNKNOWN) {
+ final int ordinalSide = side.ordinal();
+ mCoverSides[ordinalSide] = aID;
+ mCoverData[ordinalSide] = 0;
+ mCoverBehaviors[ordinalSide] = (GT_CoverBehavior) GregTech_API.getCoverBehaviorNew(aID);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void setCoverIdAndDataAtSide(ForgeDirection side, int aId, ISerializableObject aData) {
+ setCoverIDAtSide(side, aId);
+ setCoverDataAtSide(side, aData);
+ }
+
+ @Override
+ public void setCoverItemAtSide(ForgeDirection side, ItemStack aCover) {
+ GregTech_API.getCoverBehaviorNew(aCover)
+ .placeCover(side, aCover, this);
+ }
+
+ @Override
+ public int getCoverIDAtSide(ForgeDirection side) {
+ if (side != ForgeDirection.UNKNOWN) return mCoverSides[side.ordinal()];
+ return 0;
+ }
+
+ @Override
+ public ItemStack getCoverItemAtSide(ForgeDirection side) {
+ return GT_Utility.intToStack(getCoverIDAtSide(side));
+ }
+
+ @Override
+ public boolean canPlaceCoverIDAtSide(ForgeDirection side, int aID) {
+ return getCoverIDAtSide(side) == 0;
+ }
+
+ @Override
+ public boolean canPlaceCoverItemAtSide(ForgeDirection side, ItemStack aCover) {
+ return getCoverIDAtSide(side) == 0;
+ }
+
+ @Override
+ public void setCoverDataAtSide(ForgeDirection side, int aData) {
+ if (side != ForgeDirection.UNKNOWN) mCoverData[side.ordinal()] = aData;
+ }
+
+ @Override
+ public int getCoverDataAtSide(ForgeDirection side) {
+ if (side != ForgeDirection.UNKNOWN) return mCoverData[side.ordinal()];
+ return 0;
+ }
+
+ public byte getLightValue() {
+ return mLightValue;
+ }
+
+ @Override
+ public void setLightValue(byte aLightValue) {
+ mLightValue = (byte) (aLightValue & 15);
+ }
+
+ @Override
+ public long getAverageElectricInput() {
+ int rEU = 0;
+ for (int i = 0; i < mAverageEUInput.length; i++) {
+ if (i != mAverageEUInputIndex) rEU += mAverageEUInput[i];
+ }
+ return rEU / (mAverageEUInput.length - 1);
+ }
+
+ @Override
+ public long getAverageElectricOutput() {
+ int rEU = 0;
+ for (int i = 0; i < mAverageEUOutput.length; i++) {
+ if (i != mAverageEUOutputIndex) rEU += mAverageEUOutput[i];
+ }
+ return rEU / (mAverageEUOutput.length - 1);
+ }
+
+ public boolean hasSidedRedstoneOutputBehavior() {
+ return false;
+ }
+
+ @Override
+ public boolean dropCover(ForgeDirection side, ForgeDirection droppedSide, boolean aForced) {
+ if (getCoverBehaviorAtSide(side)
+ .onCoverRemoval(side, getCoverIDAtSide(side), mCoverData[side.ordinal()], this, aForced) || aForced) {
+ ItemStack tStack = getCoverBehaviorAtSide(side)
+ .getDrop(side, getCoverIDAtSide(side), getCoverDataAtSide(side), this);
+ if (tStack != null) {
+ tStack.setTagCompound(null);
+ EntityItem tEntity = new EntityItem(
+ worldObj,
+ getOffsetX(droppedSide, 1) + 0.5,
+ getOffsetY(droppedSide, 1) + 0.5,
+ getOffsetZ(droppedSide, 1) + 0.5,
+ tStack);
+ tEntity.motionX = 0;
+ tEntity.motionY = 0;
+ tEntity.motionZ = 0;
+ worldObj.spawnEntityInWorld(tEntity);
+ }
+ setCoverIDAtSide(side, 0);
+ if (mMetaTileEntity.hasSidedRedstoneOutputBehavior()) {
+ setOutputRedstoneSignal(side, (byte) 0);
+ } else {
+ setOutputRedstoneSignal(side, (byte) 15);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public String getOwnerName() {
+ if (GT_Utility.isStringInvalid(mOwnerName)) return "Player";
+ return mOwnerName;
+ }
+
+ public String setOwnerName(String aName) {
+ if (GT_Utility.isStringInvalid(aName)) return mOwnerName = "Player";
+ return mOwnerName = aName;
+ }
+
+ @Override
+ public byte getComparatorValue(ForgeDirection side) {
+ return canAccessData() ? mMetaTileEntity.getComparatorValue(side) : 0;
+ }
+
+ @Override
+ public byte getStrongOutputRedstoneSignal(ForgeDirection side) {
+ final int ordinalSide = side.ordinal();
+ return side != ForgeDirection.UNKNOWN && (mStrongRedstone & (1 << ordinalSide)) != 0
+ ? (byte) (mSidedRedstone[ordinalSide] & 15)
+ : 0;
+ }
+
+ @Override
+ public void setStrongOutputRedstoneSignal(ForgeDirection side, byte aStrength) {
+ mStrongRedstone |= (1 << side.ordinal());
+ setOutputRedstoneSignal(side, aStrength);
+ }
+
+ @Override
+ public long injectEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage) {
+ if (!canAccessData() || !mMetaTileEntity.isElectric()
+ || !inputEnergyFrom(side)
+ || aAmperage <= 0
+ || aVoltage <= 0
+ || getStoredEU() >= getEUCapacity()
+ || mMetaTileEntity.maxAmperesIn() <= mAcceptedAmperes) return 0;
+ if (aVoltage > getInputVoltage()) {
+ doExplosion(aVoltage);
+ return 0;
+ }
+ if (increaseStoredEnergyUnits(
+ aVoltage * (aAmperage = Math.min(
+ aAmperage,
+ Math.min(
+ mMetaTileEntity.maxAmperesIn() - mAcceptedAmperes,
+ 1 + ((getEUCapacity() - getStoredEU()) / aVoltage)))),
+ true)) {
+ mAverageEUInput[mAverageEUInputIndex] += aVoltage * aAmperage;
+ mAcceptedAmperes += aAmperage;
+ return aAmperage;
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean drainEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage) {
+ if (!canAccessData() || !mMetaTileEntity.isElectric()
+ || !outputsEnergyTo(side)
+ || getStoredEU() - (aVoltage * aAmperage) < mMetaTileEntity.getMinimumStoredEU()) return false;
+ if (decreaseStoredEU(aVoltage * aAmperage, false)) {
+ mAverageEUOutput[mAverageEUOutputIndex] += aVoltage * aAmperage;
+ return true;
+ }
+ return false;
+ }
+
+ public double getOutputEnergyUnitsPerTick() {
+ return oOutput;
+ }
+
+ public boolean isTeleporterCompatible(ForgeDirection side) {
+ return false;
+ }
+
+ public double demandedEnergyUnits() {
+ if (mReleaseEnergy || !canAccessData() || !mMetaTileEntity.isEnetInput()) return 0;
+ return getEUCapacity() - getStoredEU();
+ }
+
+ public double injectEnergyUnits(ForgeDirection aDirection, double aAmount) {
+ return injectEnergyUnits(aDirection, (int) aAmount, 1) > 0 ? 0 : aAmount;
+ }
+
+ public boolean acceptsEnergyFrom(TileEntity aEmitter, ForgeDirection aDirection) {
+ return inputEnergyFrom(aDirection);
+ }
+
+ public boolean emitsEnergyTo(TileEntity aReceiver, ForgeDirection aDirection) {
+ return outputsEnergyTo(aDirection);
+ }
+
+ public double getOfferedEnergy() {
+ return (canAccessData() && getStoredEU() - mMetaTileEntity.getMinimumStoredEU() >= oOutput)
+ ? Math.max(0, oOutput)
+ : 0;
+ }
+
+ public void drawEnergy(double amount) {
+ mAverageEUOutput[mAverageEUOutputIndex] += amount;
+ decreaseStoredEU((int) amount, true);
+ }
+
+ public int injectEnergy(ForgeDirection aForgeDirection, int aAmount) {
+ return injectEnergyUnits(aForgeDirection, aAmount, 1) > 0 ? 0 : aAmount;
+ }
+
+ public int addEnergy(int aEnergy) {
+ if (!canAccessData()) return 0;
+ if (aEnergy > 0) increaseStoredEnergyUnits(aEnergy, true);
+ else decreaseStoredEU(-aEnergy, true);
+ return (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getEUVar());
+ }
+
+ public boolean isAddedToEnergyNet() {
+ return false;
+ }
+
+ public int demandsEnergy() {
+ if (mReleaseEnergy || !canAccessData() || !mMetaTileEntity.isEnetInput()) return 0;
+ return getCapacity() - getStored();
+ }
+
+ public int getCapacity() {
+ return (int) Math.min(Integer.MAX_VALUE, getEUCapacity());
+ }
+
+ public int getStored() {
+ return (int) Math.min(Integer.MAX_VALUE, Math.min(getStoredEU(), getCapacity()));
+ }
+
+ public void setStored(int aEU) {
+ if (canAccessData()) setStoredEU(aEU);
+ }
+
+ public int getMaxSafeInput() {
+ return (int) Math.min(Integer.MAX_VALUE, getInputVoltage());
+ }
+
+ public int getMaxEnergyOutput() {
+ if (mReleaseEnergy) return Integer.MAX_VALUE;
+ return getOutput();
+ }
+
+ public int getOutput() {
+ return (int) Math.min(Integer.MAX_VALUE, oOutput);
+ }
+
+ public int injectEnergy(Direction aDirection, int aAmount) {
+ return injectEnergyUnits(aDirection.toForgeDirection(), aAmount, 1) > 0 ? 0 : aAmount;
+ }
+
+ public boolean acceptsEnergyFrom(TileEntity aReceiver, Direction aDirection) {
+ return inputEnergyFrom(aDirection.toForgeDirection());
+ }
+
+ public boolean emitsEnergyTo(TileEntity aReceiver, Direction aDirection) {
+ return outputsEnergyTo(aDirection.toForgeDirection());
+ }
+
+ @Override
+ public boolean isInvalidTileEntity() {
+ return isInvalid();
+ }
+
+ @Override
+ public boolean addStackToSlot(int aIndex, ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return true;
+ if (aIndex < 0 || aIndex >= getSizeInventory()) return false;
+ ItemStack tStack = getStackInSlot(aIndex);
+ if (GT_Utility.isStackInvalid(tStack)) {
+ setInventorySlotContents(aIndex, aStack);
+ return true;
+ }
+ aStack = GT_OreDictUnificator.get(aStack);
+ if (GT_Utility.areStacksEqual(tStack, aStack)
+ && tStack.stackSize + aStack.stackSize <= Math.min(aStack.getMaxStackSize(), getInventoryStackLimit())) {
+ tStack.stackSize += aStack.stackSize;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addStackToSlot(int aIndex, ItemStack aStack, int aAmount) {
+ return addStackToSlot(aIndex, GT_Utility.copyAmount(aAmount, aStack));
+ }
+
+ @Override
+ public void markDirty() {
+ super.markDirty();
+ mInventoryChanged = true;
+ }
+
+ /**
+ * To Do
+ */
+ public boolean isElectric() {
+ return true;
+ }
+
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ public long maxEUStore() {
+ return 0L;
+ }
+
+ public long maxEUInput() {
+ return 0L;
+ }
+
+ public long maxEUOutput() {
+ return 0L;
+ }
+
+ public long maxAmperesOut() {
+ return 1L;
+ }
+
+ public long maxAmperesIn() {
+ return 1L;
+ }
+
+ public void doEnergyExplosion() {
+ if (this.getUniversalEnergyCapacity() > 0L
+ && this.getUniversalEnergyStored() >= this.getUniversalEnergyCapacity() / 5L) {
+ this.doExplosion(
+ this.oOutput * (long) (this.getUniversalEnergyStored() >= this.getUniversalEnergyCapacity() ? 4
+ : (this.getUniversalEnergyStored() >= this.getUniversalEnergyCapacity() / 2L ? 2 : 1)));
+ GT_Mod arg9999 = GT_Mod.instance;
+ GT_Mod.achievements.issueAchievement(
+ this.getWorldObj()
+ .getPlayerEntityByName(this.mOwnerName),
+ "electricproblems");
+ }
+ }
+
+ public void doExplosion(long aAmount) {
+ if (this.canAccessData()) {
+ if (GregTech_API.sMachineWireFire && this.mMetaTileEntity.isElectric()) {
+ try {
+ this.mReleaseEnergy = true;
+ Util.emitEnergyToNetwork(GT_Values.V[5], Math.max(1L, this.getStoredEU() / GT_Values.V[5]), this);
+ } catch (Exception arg4) {}
+ }
+ this.mReleaseEnergy = false;
+ this.onExplosion();
+ PollutionUtils.addPollution(this, 100000);
+ this.mMetaTileEntity.doExplosion(aAmount);
+ }
+ }
+
+ public void onExplosion() {}
+
+ @Override
+ public String[] getDescription() {
+ return this.canAccessData() ? this.mMetaTileEntity.getDescription() : new String[0];
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return null;
+ }
+
+ public long getEUVar() {
+ return this.mStoredEnergy;
+ }
+
+ public void setEUVar(long aEnergy) {
+ this.mStoredEnergy = aEnergy;
+ }
+
+ @Override
+ public long getStoredEU() {
+ return this.canAccessData() ? Math.min(this.mMetaTileEntity.getEUVar(), this.getEUCapacity()) : 0L;
+ }
+
+ @Override
+ public long getEUCapacity() {
+ return this.canAccessData() ? this.mMetaTileEntity.maxEUStore() : 0L;
+ }
+
+ public long getMinimumStoredEU() {
+ return 512L;
+ }
+
+ public boolean setStoredEU(long aEnergy) {
+ if (!this.canAccessData()) {
+ return false;
+ } else {
+ if (aEnergy < 0L) {
+ aEnergy = 0L;
+ }
+
+ this.mMetaTileEntity.setEUVar(aEnergy);
+ return true;
+ }
+ }
+
+ public boolean decreaseStoredEU(long aEnergy, boolean aIgnoreTooLessEnergy) {
+ if (!this.canAccessData()) {
+ return false;
+ } else if (this.mMetaTileEntity.getEUVar() - aEnergy < 0L && !aIgnoreTooLessEnergy) {
+ return false;
+ } else {
+ this.setStoredEU(this.mMetaTileEntity.getEUVar() - aEnergy);
+ if (this.mMetaTileEntity.getEUVar() < 0L) {
+ this.setStoredEU(0L);
+ return false;
+ } else {
+ return true;
+ }
+ }
+ }
+
+ // Required as of 5.09.32-pre5
+ public boolean energyStateReady() {
+ return false;
+ }
+
+ private boolean firstTicked = false;
+
+ public boolean onFirstTick() {
+ if (!firstTicked) {
+ firstTicked = true;
+ if (this.mInventory != null) {
+ this.mInventory.purgeNulls();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Adds support for the newer function added by
+ * https://github.com/Blood-Asp/GT5-Unofficial/commit/73ee102b63efd92c0f164a7ed7a79ebcd2619617#diff-3051838621d8ae87aa5ccd1345e1f07d
+ */
+ public boolean inputEnergyFrom(byte arg0, boolean arg1) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ /**
+ * Adds support for the newer function added by
+ * https://github.com/Blood-Asp/GT5-Unofficial/commit/73ee102b63efd92c0f164a7ed7a79ebcd2619617#diff-3051838621d8ae87aa5ccd1345e1f07d
+ */
+ public boolean outputsEnergyTo(byte arg0, boolean arg1) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityCircuitProgrammer.java b/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityCircuitProgrammer.java
new file mode 100644
index 0000000000..0be6959b8f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityCircuitProgrammer.java
@@ -0,0 +1,313 @@
+package gtPlusPlus.core.tileentities.general;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.tileentity.TileEntity;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.inventories.InventoryCircuitProgrammer;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.slots.SlotIntegratedCircuit;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class TileEntityCircuitProgrammer extends TileEntity implements ISidedInventory {
+
+ private int tickCount = 0;
+ private final InventoryCircuitProgrammer inventoryContents;
+ private String customName;
+ public int locationX;
+ public int locationY;
+ public int locationZ;
+ private int aCurrentMode = 0;
+
+ public TileEntityCircuitProgrammer() {
+ this.inventoryContents = new InventoryCircuitProgrammer();
+ this.setTileLocation();
+ }
+
+ public boolean setTileLocation() {
+ if (this.hasWorldObj()) {
+ if (!this.getWorldObj().isRemote) {
+ this.locationX = this.xCoord;
+ this.locationY = this.yCoord;
+ this.locationZ = this.zCoord;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Rename to hasCircuitToConfigure
+ public final boolean hasCircuitToConfigure() {
+ for (ItemStack i : this.getInventory()
+ .getInventory()) {
+ if (i == null) {
+ continue;
+ } else {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public InventoryCircuitProgrammer getInventory() {
+ return this.inventoryContents;
+ }
+
+ public boolean addOutput() {
+ ItemStack[] aInputs = this.getInventory()
+ .getInventory()
+ .clone();
+ // Check if there is output in slot.
+ Boolean hasOutput = false;
+ if (aInputs[25] != null) {
+ hasOutput = true;
+ }
+ AutoMap<Integer> aValidSlots = new AutoMap<>();
+ int aSlotCount = 0;
+ for (ItemStack i : aInputs) {
+ if (i != null) {
+ aValidSlots.put(aSlotCount);
+ }
+ aSlotCount++;
+ }
+ for (int e : aValidSlots) {
+ boolean doAdd = false;
+ ItemStack g = this.getStackInSlot(e);
+ int aSize = 0;
+ ItemStack aInputStack = null;
+ int aTypeInSlot = SlotIntegratedCircuit.isRegularProgrammableCircuit(g);
+ if (aTypeInSlot >= 0 && g != null) {
+ // No Existing Output
+ if (!hasOutput) {
+ aSize = g.stackSize;
+ doAdd = true;
+ }
+ // Existing Output
+ else {
+ ItemStack f = this.getStackInSlot(25);
+ int aTypeInCheckedSlot = SlotIntegratedCircuit.isRegularProgrammableCircuit(f);
+ // Check that the Circuit in the Output slot is not null and the same type as the circuit input.
+ if (aTypeInCheckedSlot >= 0 && (aTypeInSlot == aTypeInCheckedSlot) && f != null) {
+ if (g.getItem() == f.getItem() && f.getItemDamage() == e) {
+ aSize = f.stackSize + g.stackSize;
+ if (aSize > 64) {
+ aInputStack = g.copy();
+ aInputStack.stackSize = (aSize - 64);
+ }
+ doAdd = true;
+ }
+ }
+ }
+ if (doAdd) {
+ // Check Circuit Type
+ ItemStack aOutput;
+ if (aTypeInSlot == 0) {
+ aOutput = CI.getNumberedCircuit(e);
+ } else if (aTypeInSlot == 1) {
+ aOutput = CI.getNumberedBioCircuit(e);
+ } else if (aTypeInSlot == 2) {
+ aOutput = CI.getNumberedAdvancedCircuit(e);
+ } else {
+ aOutput = null;
+ }
+
+ if (aOutput != null) {
+ aOutput.stackSize = aSize;
+ this.setInventorySlotContents(e, aInputStack);
+ this.setInventorySlotContents(25, aOutput);
+ return true;
+ }
+ }
+ }
+ continue;
+ }
+ return false;
+ }
+
+ @Override
+ public void updateEntity() {
+ try {
+ if (!this.worldObj.isRemote) {
+ if (tickCount % 10 == 0) {
+ if (hasCircuitToConfigure()) {
+ this.addOutput();
+ this.markDirty();
+ }
+ }
+ this.tickCount++;
+ }
+ } catch (final Throwable t) {}
+ }
+
+ public boolean anyPlayerInRange() {
+ return this.worldObj.getClosestPlayer(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, 32) != null;
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ super.writeToNBT(nbt);
+ // Utils.LOG_WARNING("Trying to write NBT data to TE.");
+ final NBTTagCompound chestData = new NBTTagCompound();
+ this.inventoryContents.writeToNBT(chestData);
+ nbt.setTag("ContentsChest", chestData);
+ if (this.hasCustomInventoryName()) {
+ nbt.setString("CustomName", this.getCustomName());
+ }
+ nbt.setInteger("aCurrentMode", aCurrentMode);
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+ super.readFromNBT(nbt);
+ // Utils.LOG_WARNING("Trying to read NBT data from TE.");
+ this.inventoryContents.readFromNBT(nbt.getCompoundTag("ContentsChest"));
+ if (nbt.hasKey("CustomName", 8)) {
+ this.setCustomName(nbt.getString("CustomName"));
+ }
+ aCurrentMode = nbt.getInteger("aCurrentMode");
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.getInventory()
+ .getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.getInventory()
+ .getStackInSlot(slot);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int count) {
+ return this.getInventory()
+ .decrStackSize(slot, count);
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ return this.getInventory()
+ .getStackInSlotOnClosing(slot);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.getInventory()
+ .setInventorySlotContents(slot, stack);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return this.getInventory()
+ .getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return this.getInventory()
+ .isUseableByPlayer(entityplayer);
+ }
+
+ @Override
+ public void openInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .closeInventory();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return this.getInventory()
+ .isItemValidForSlot(slot, itemstack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ final int[] accessibleSides = new int[this.getSizeInventory()];
+ for (int r = 0; r < this.getInventory()
+ .getSizeInventory(); r++) {
+ accessibleSides[r] = r;
+ }
+ return accessibleSides;
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return p_102007_1_ >= 0 && p_102007_1_ <= 24;
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return p_102008_1_ == 25;
+ }
+
+ public String getCustomName() {
+ return this.customName;
+ }
+
+ public void setCustomName(final String customName) {
+ this.customName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.customName : "container.circuitprogrammer";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return (this.customName != null) && !this.customName.equals("");
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ final NBTTagCompound tag = new NBTTagCompound();
+ this.writeToNBT(tag);
+ return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.blockMetadata, tag);
+ }
+
+ @Override
+ public void onDataPacket(final NetworkManager net, final S35PacketUpdateTileEntity pkt) {
+ final NBTTagCompound tag = pkt.func_148857_g();
+ this.readFromNBT(tag);
+ }
+
+ public boolean onScrewdriverRightClick(byte side, EntityPlayer player, int x, int y, int z) {
+ try {
+ if (aCurrentMode == 24) {
+ aCurrentMode = 0;
+ } else {
+ aCurrentMode++;
+ }
+ PlayerUtils.messagePlayer(player, "Now configuring units for type " + aCurrentMode + ".");
+ return true;
+ } catch (Throwable t) {
+ return false;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityDecayablesChest.java b/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityDecayablesChest.java
new file mode 100644
index 0000000000..b641f2e99e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityDecayablesChest.java
@@ -0,0 +1,378 @@
+package gtPlusPlus.core.tileentities.general;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.inventories.Inventory_DecayablesChest;
+import gtPlusPlus.core.item.materials.DustDecayable;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class TileEntityDecayablesChest extends TileEntity implements ISidedInventory {
+
+ private final Inventory_DecayablesChest inventoryContents;
+
+ /** Determines if the check for adjacent chests has taken place. */
+ public boolean adjacentChestChecked;
+ /** Contains the chest tile located adjacent to this one (if any) */
+ public TileEntityDecayablesChest adjacentChestZNeg;
+ /** Contains the chest tile located adjacent to this one (if any) */
+ public TileEntityDecayablesChest adjacentChestXPos;
+ /** Contains the chest tile located adjacent to this one (if any) */
+ public TileEntityDecayablesChest adjacentChestXNeg;
+ /** Contains the chest tile located adjacent to this one (if any) */
+ public TileEntityDecayablesChest adjacentChestZPos;
+ /** The current angle of the lid (between 0 and 1) */
+ public float lidAngle;
+ /** The angle of the lid last tick */
+ public float prevLidAngle;
+ /** The number of players currently using this chest */
+ public int numPlayersUsing;
+
+ private String customName;
+
+ private int cachedChestType;
+ private int tickCount = 0;
+
+ public TileEntityDecayablesChest() {
+ this.inventoryContents = new Inventory_DecayablesChest();
+ }
+
+ public Inventory_DecayablesChest getInventory() {
+ return this.inventoryContents;
+ }
+
+ @Override
+ public void updateEntity() {
+
+ // Try do chesty stuff
+ try {
+ this.updateEntityChest();
+ } catch (Throwable t) {
+
+ }
+
+ try {
+ if (!this.worldObj.isRemote) {
+ this.tickCount++;
+ if ((this.tickCount % 10) == 0) {
+ cachedChestType = 1;
+ }
+
+ if ((this.tickCount % 20) == 0) {
+ for (ItemStack inv : this.getInventory()
+ .getInventory()) {
+ if (inv == null) {
+ continue;
+ }
+ if (inv.getItem() instanceof DustDecayable D) {
+ tryUpdateDecayable(D, inv, this.worldObj);
+ }
+ }
+ }
+ updateSlots();
+ }
+ } catch (final Throwable t) {}
+ }
+
+ public void tryUpdateDecayable(final DustDecayable b, ItemStack iStack, final World world) {
+ if (world == null || iStack == null) {
+ return;
+ }
+ if (world.isRemote) {
+ return;
+ }
+
+ boolean a1, a2;
+ int u = 0;
+ a1 = b.isTicking(world, iStack);
+ a2 = false;
+ int SECONDS_TO_PROCESS = 1;
+ while (u < (20 * SECONDS_TO_PROCESS)) {
+ if (!a1) {
+ break;
+ }
+ a1 = b.isTicking(world, iStack);
+ a2 = b.tickItemTag(world, iStack);
+ u++;
+ }
+ Logger.MACHINE_INFO("| " + b.getUnlocalizedName() + " | " + a1 + "/" + a2);
+
+ if (!a1 && !a2) {
+ ItemStack replacement = ItemUtils.getSimpleStack(b.getDecayResult());
+ replacement.stackSize = 1;
+ // iStack = replacement.copy();
+ for (int fff = 0; fff < this.inventoryContents.getSizeInventory(); fff++) {
+ if (this.inventoryContents.getStackInSlot(fff) == iStack) {
+ this.inventoryContents.setInventorySlotContents(fff, replacement.copy());
+ }
+ }
+
+ updateSlots();
+ this.inventoryContents.markDirty();
+ }
+ }
+
+ public boolean anyPlayerInRange() {
+ return this.worldObj.getClosestPlayer(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, 32) != null;
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ super.writeToNBT(nbt);
+ // Utils.LOG_WARNING("Trying to write NBT data to TE.");
+ final NBTTagCompound chestData = new NBTTagCompound();
+ this.inventoryContents.writeToNBT(chestData);
+ nbt.setTag("ContentsChest", chestData);
+ if (this.hasCustomInventoryName()) {
+ nbt.setString("CustomName", this.getCustomName());
+ }
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+ super.readFromNBT(nbt);
+ // Utils.LOG_WARNING("Trying to read NBT data from TE.");
+ this.inventoryContents.readFromNBT(nbt.getCompoundTag("ContentsChest"));
+ if (nbt.hasKey("CustomName", 8)) {
+ this.setCustomName(nbt.getString("CustomName"));
+ }
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.getInventory()
+ .getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.getInventory()
+ .getStackInSlot(slot);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int count) {
+ return this.getInventory()
+ .decrStackSize(slot, count);
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ return this.getInventory()
+ .getStackInSlotOnClosing(slot);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.getInventory()
+ .setInventorySlotContents(slot, stack);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return this.getInventory()
+ .getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return this.getInventory()
+ .isUseableByPlayer(entityplayer);
+ }
+
+ @Override
+ public void openInventory() {
+ if (this.numPlayersUsing < 0) {
+ this.numPlayersUsing = 0;
+ }
+ if (!this.worldObj.isRemote) {
+ this.numPlayersUsing++;
+ cachedChestType = 1;
+ }
+ this.worldObj
+ .addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, this.numPlayersUsing);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ if (!this.worldObj.isRemote) {
+ this.numPlayersUsing--;
+ cachedChestType = 1;
+ }
+ this.worldObj
+ .addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, this.numPlayersUsing);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .closeInventory();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return this.getInventory()
+ .isItemValidForSlot(slot, itemstack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ final int[] accessibleSides = new int[this.getSizeInventory()];
+ for (int r = 0; r < this.getInventory()
+ .getSizeInventory(); r++) {
+ accessibleSides[r] = r;
+ }
+ return accessibleSides;
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return this.getInventory()
+ .isItemValidForSlot(0, p_102007_2_);
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return this.getInventory()
+ .isItemValidForSlot(0, p_102008_2_);
+ }
+
+ public String getCustomName() {
+ return this.customName;
+ }
+
+ public void setCustomName(final String customName) {
+ this.customName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.customName : "container.DecayablesChest";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return (this.customName != null) && !this.customName.equals("");
+ }
+
+ /**
+ * Causes the TileEntity to reset all it's cached values for it's container Block, metadata and in the case of
+ * chests, the adjacent chest check
+ */
+ @Override
+ public void updateContainingBlockInfo() {
+ super.updateContainingBlockInfo();
+ this.adjacentChestChecked = false;
+ }
+
+ /**
+ * Performs the check for adjacent chests to determine if this chest is double or not.
+ */
+ public void checkForAdjacentChests() {
+ if (!this.adjacentChestChecked) {
+ this.adjacentChestChecked = true;
+ this.adjacentChestZNeg = null;
+ this.adjacentChestXPos = null;
+ this.adjacentChestXNeg = null;
+ this.adjacentChestZPos = null;
+ }
+ }
+
+ public void updateEntityChest() {
+ float f;
+ this.prevLidAngle = this.lidAngle;
+ f = 0.04F;
+ double d2;
+ if (this.numPlayersUsing > 0 && this.lidAngle == 0.0F
+ && this.adjacentChestZNeg == null
+ && this.adjacentChestXNeg == null) {
+ double d1 = (double) this.xCoord + 0.5D;
+ d2 = (double) this.zCoord + 0.5D;
+ this.worldObj.playSoundEffect(
+ d1,
+ (double) this.yCoord + 0.5D,
+ d2,
+ "random.chestopen",
+ 0.5F,
+ this.worldObj.rand.nextFloat() * 0.1F + 0.9F);
+ }
+
+ if (this.numPlayersUsing == 0 && this.lidAngle > 0.0F || this.numPlayersUsing > 0 && this.lidAngle < 1.0F) {
+ float f1 = this.lidAngle;
+ if (this.numPlayersUsing > 0) {
+ // this.lidAngle += f;
+ this.lidAngle += (float) (f * (1 + 0.10 * 0.01));
+ } else {
+ // this.lidAngle -= f;
+ this.lidAngle -= (float) (f * (1 + 0.10 * 0.01));
+ }
+ if (this.lidAngle > 1.0F) {
+ this.lidAngle = 1.0F;
+ }
+ float f2 = 0.5F;
+ if (this.lidAngle < f2 && f1 >= f2 && this.adjacentChestZNeg == null && this.adjacentChestXNeg == null) {
+ d2 = (double) this.xCoord + 0.5D;
+ double d0 = (double) this.zCoord + 0.5D;
+ this.worldObj.playSoundEffect(
+ d2,
+ (double) this.yCoord + 0.5D,
+ d0,
+ "random.chestclosed",
+ 0.5F,
+ this.worldObj.rand.nextFloat() * 0.1F + 0.9F);
+ }
+
+ if (this.lidAngle < 0.0F) {
+ this.lidAngle = 0.0F;
+ }
+ }
+ }
+
+ /**
+ * Called when a client event is received with the event number and argument, see World.sendClientEvent
+ */
+ @Override
+ public boolean receiveClientEvent(int p_145842_1_, int p_145842_2_) {
+ if (p_145842_1_ == 1) {
+ this.numPlayersUsing = p_145842_2_;
+ return true;
+ } else {
+ return super.receiveClientEvent(p_145842_1_, p_145842_2_);
+ }
+ }
+
+ /**
+ * invalidates a tile entity
+ */
+ @Override
+ public final void invalidate() {
+ super.invalidate();
+ cachedChestType = 1;
+ this.updateContainingBlockInfo();
+ this.checkForAdjacentChests();
+ }
+
+ private int updateSlots() {
+ // Have slots changed?
+ if (cachedChestType == 0) {
+ return 0;
+ }
+ ItemUtils.organiseInventory(getInventory());
+ cachedChestType = 0;
+ return cachedChestType;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityFishTrap.java b/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityFishTrap.java
new file mode 100644
index 0000000000..1a09b6b423
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityFishTrap.java
@@ -0,0 +1,294 @@
+package gtPlusPlus.core.tileentities.general;
+
+import static gregtech.api.enums.Mods.PamsHarvestCraft;
+
+import java.util.Random;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.FishingHooks;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.inventories.InventoryFishTrap;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class TileEntityFishTrap extends TileEntity implements ISidedInventory {
+
+ private int tickCount = 0;
+ private final InventoryFishTrap inventoryContents;
+ private String customName;
+ // The number of water blocks is used as an index to get the tick rate.
+ private final static short[] waterBlocksToTickRate = new short[] { 0, 0, 5600, 4400, 3200, 2000, 1750 };
+ private int surroundingWaterBlocks = 0;
+
+ public TileEntityFishTrap() {
+ this.inventoryContents = new InventoryFishTrap();
+ }
+
+ private int getNumberOfSurroundingWater() {
+ if (!this.hasWorldObj() || this.getWorldObj().isRemote) {
+ return 0;
+ }
+ final Block[] surroundingBlocks = new Block[6];
+ surroundingBlocks[0] = this.worldObj.getBlock(this.xCoord, this.yCoord + 1, this.zCoord); // Above
+ surroundingBlocks[1] = this.worldObj.getBlock(this.xCoord, this.yCoord - 1, this.zCoord); // Below
+ surroundingBlocks[2] = this.worldObj.getBlock(this.xCoord + 1, this.yCoord, this.zCoord);
+ surroundingBlocks[3] = this.worldObj.getBlock(this.xCoord - 1, this.yCoord, this.zCoord);
+ surroundingBlocks[4] = this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord + 1);
+ surroundingBlocks[5] = this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord - 1);
+ int waterCount = 0;
+ int trapCount = 0;
+ for (final Block checkBlock : surroundingBlocks) {
+ if (checkBlock == ModBlocks.blockFishTrap) {
+ trapCount++;
+ } else if ((checkBlock == Blocks.water) || (checkBlock == Blocks.flowing_water)) {
+ waterCount++;
+ }
+ }
+ // Explicitly check for at least 2 water blocks.
+ if (waterCount < 2) {
+ return 0;
+ }
+ // Only allow the first four traps to count towards valid neighbor blocks.
+ return waterCount + Math.min(trapCount, 4);
+ }
+
+ public InventoryFishTrap getInventory() {
+ return this.inventoryContents;
+ }
+
+ private void tryAddLoot() {
+ ItemUtils.organiseInventory(getInventory());
+ final ItemStack loot = this.generateLootForFishTrap();
+ if (loot == null) {
+ return;
+ }
+ for (final ItemStack contents : this.getInventory()
+ .getInventory()) {
+ if (GT_Utility.areStacksEqual(loot, contents)) {
+ if (contents.stackSize < contents.getMaxStackSize()) {
+ contents.stackSize++;
+ this.markDirty();
+ return;
+ }
+ }
+ }
+ int checkingSlot = 0;
+ for (final ItemStack contents : this.getInventory()
+ .getInventory()) {
+ if (contents == null) {
+ this.getInventory()
+ .setInventorySlotContents(checkingSlot, loot);
+ this.markDirty();
+ return;
+ }
+ checkingSlot++;
+ }
+ }
+
+ @Nullable
+ private ItemStack generateLootForFishTrap() {
+ final int lootWeight = MathUtils.randInt(0, 100);
+ ItemStack loot = null;
+ if (lootWeight <= 5) {
+ loot = ItemUtils.getSimpleStack(Items.slime_ball);
+ } else if (lootWeight <= 10) {
+ loot = ItemUtils.getSimpleStack(Items.bone);
+ } else if (lootWeight <= 15) {
+ loot = ItemUtils.getSimpleStack(Blocks.sand);
+ } else if (lootWeight <= 20) {
+ loot = ItemUtils.simpleMetaStack(Items.dye, 0, 1);
+ }
+ // Junk Loot
+ else if (lootWeight <= 23) {
+ if (PamsHarvestCraft.isModLoaded()) {
+ loot = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cropSeaweed", 1);
+ } else {
+ loot = ItemUtils.getSimpleStack(Blocks.dirt);
+ }
+ }
+ // Pam Fish
+ else if (lootWeight <= 99) {
+ final Random xstr = new Random();
+ loot = FishingHooks.getRandomFishable(xstr, 100);
+ } else if (lootWeight == 100) {
+ final int rareLoot = MathUtils.randInt(1, 10);
+ if (rareLoot <= 4) {
+ loot = Materials.Iron.getNuggets(1);
+ } else if (rareLoot <= 7) {
+ loot = ItemUtils.getSimpleStack(Items.gold_nugget);
+ } else if (rareLoot <= 9) {
+ loot = ItemUtils.getSimpleStack(Items.emerald);
+ } else {
+ loot = ItemUtils.getSimpleStack(Items.diamond);
+ }
+ }
+ if (loot != null) {
+ loot.stackSize = 1;
+ }
+ return loot;
+ }
+
+ @Override
+ public void updateEntity() {
+ if (this.worldObj.isRemote) {
+ return;
+ }
+
+ this.tickCount++;
+ // Only recalculate the amount of neighboring water/trap blocks every 20 ticks.
+ if ((this.tickCount % 20) == 0) {
+ this.surroundingWaterBlocks = getNumberOfSurroundingWater();
+ }
+
+ if ((waterBlocksToTickRate[this.surroundingWaterBlocks] != 0)
+ && this.tickCount > waterBlocksToTickRate[this.surroundingWaterBlocks]) {
+ int aExtraLootChance = MathUtils.randInt(1, 1000);
+ if (aExtraLootChance >= 999) {
+ this.tryAddLoot();
+ this.tryAddLoot();
+ this.tryAddLoot();
+ } else {
+ this.tryAddLoot();
+ }
+ this.markDirty();
+
+ this.tickCount = 0;
+ }
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ super.writeToNBT(nbt);
+ final NBTTagCompound chestData = new NBTTagCompound();
+ this.inventoryContents.writeToNBT(chestData);
+ nbt.setTag("ContentsChest", chestData);
+ if (this.hasCustomInventoryName()) {
+ nbt.setString("CustomName", this.getCustomName());
+ }
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+ super.readFromNBT(nbt);
+ this.inventoryContents.readFromNBT(nbt.getCompoundTag("ContentsChest"));
+ if (nbt.hasKey("CustomName", 8)) {
+ this.setCustomName(nbt.getString("CustomName"));
+ }
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.getInventory()
+ .getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.getInventory()
+ .getStackInSlot(slot);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int count) {
+ return this.getInventory()
+ .decrStackSize(slot, count);
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ return this.getInventory()
+ .getStackInSlotOnClosing(slot);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.getInventory()
+ .setInventorySlotContents(slot, stack);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return this.getInventory()
+ .getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return this.getInventory()
+ .isUseableByPlayer(entityplayer);
+ }
+
+ @Override
+ public void openInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .closeInventory();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return this.getInventory()
+ .isItemValidForSlot(slot, itemstack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ final int[] accessibleSides = new int[this.getSizeInventory()];
+ for (int r = 0; r < this.getInventory()
+ .getSizeInventory(); r++) {
+ accessibleSides[r] = r;
+ }
+ return accessibleSides;
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return true;
+ }
+
+ public String getCustomName() {
+ return this.customName;
+ }
+
+ public void setCustomName(final String customName) {
+ this.customName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.customName : "container.fishtrap";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return (this.customName != null) && !this.customName.isEmpty();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityInfiniteFluid.java b/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityInfiniteFluid.java
new file mode 100644
index 0000000000..fd528c589d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityInfiniteFluid.java
@@ -0,0 +1,148 @@
+package gtPlusPlus.core.tileentities.general;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidEvent;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTank;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+public class TileEntityInfiniteFluid extends TileEntity implements IFluidHandler {
+
+ public FluidTank tank = new FluidTank(Integer.MAX_VALUE);
+ private boolean needsUpdate = false;
+ private int updateTimer = 0;
+
+ public TileEntityInfiniteFluid() {}
+
+ @Override
+ public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
+ needsUpdate = true;
+ return this.tank.fill(resource, doFill);
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
+ needsUpdate = true;
+ return this.tank.drain(resource.amount, doDrain);
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
+ needsUpdate = true;
+ FluidStack fluid = this.tank.getFluid();
+ // return this.tank.drain(maxDrain, doDrain);
+ if (fluid == null) {
+ return null;
+ }
+
+ int drained = maxDrain;
+ if (fluid.amount < drained) {
+ drained = fluid.amount;
+ }
+
+ FluidStack stack = new FluidStack(fluid, drained);
+ if (doDrain) {
+ fluid.amount -= drained;
+ if (fluid.amount <= 0) {
+ fluid = null;
+ }
+
+ if (this != null) {
+ FluidEvent.fireEvent(
+ new FluidEvent.FluidDrainingEvent(
+ fluid,
+ this.getWorldObj(),
+ this.xCoord,
+ this.yCoord,
+ this.zCoord,
+ this.tank,
+ 0));
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection from, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection from, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection from) {
+ return new FluidTankInfo[] { this.tank.getInfo() };
+ }
+
+ public float getAdjustedVolume() {
+ needsUpdate = true;
+ float amount = tank.getFluidAmount();
+ float capacity = tank.getCapacity();
+ float volume = (amount / capacity) * 0.8F;
+ return volume;
+ }
+
+ @Override
+ public void updateEntity() {
+
+ if (this.tank.getFluid() != null) {
+ FluidStack bigStorage = this.tank.getFluid();
+ bigStorage.amount = this.tank.getCapacity();
+ this.tank.setFluid(bigStorage);
+ }
+
+ if (needsUpdate) {
+
+ if (this.tank.getFluid() != null) {
+ FluidStack bigStorage = this.tank.getFluid();
+ bigStorage.amount = this.tank.getCapacity();
+ this.tank.setFluid(bigStorage);
+ }
+
+ if (updateTimer == 0) {
+ updateTimer = 10; // every 10 ticks it will send an update
+ } else {
+ --updateTimer;
+ if (updateTimer == 0) {
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ needsUpdate = false;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound tag) {
+ tank.readFromNBT(tag);
+ super.readFromNBT(tag);
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound tag) {
+ tank.writeToNBT(tag);
+ super.writeToNBT(tag);
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ NBTTagCompound tag = new NBTTagCompound();
+ writeToNBT(tag);
+ return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.blockMetadata, tag);
+ }
+
+ @Override
+ public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
+ NBTTagCompound tag = pkt.func_148857_g();
+ readFromNBT(tag);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityVolumetricFlaskSetter.java b/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityVolumetricFlaskSetter.java
new file mode 100644
index 0000000000..a9bc2b0049
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/tileentities/general/TileEntityVolumetricFlaskSetter.java
@@ -0,0 +1,418 @@
+package gtPlusPlus.core.tileentities.general;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.container.Container_VolumetricFlaskSetter;
+import gtPlusPlus.core.inventories.Inventory_VolumetricFlaskSetter;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.helpers.VolumetricFlaskHelper;
+
+public class TileEntityVolumetricFlaskSetter extends TileEntity implements ISidedInventory {
+
+ private int tickCount = 0;
+ private final Inventory_VolumetricFlaskSetter inventoryContents;
+ private String customName;
+ public int locationX;
+ public int locationY;
+ public int locationZ;
+ private int aCurrentMode = 0;
+ private int aCustomValue = 1000;
+
+ public TileEntityVolumetricFlaskSetter() {
+ this.inventoryContents = new Inventory_VolumetricFlaskSetter();
+ this.setTileLocation();
+ }
+
+ public int getCustomValue() {
+ // Logger.INFO("Value: "+this.aCustomValue);
+ return this.aCustomValue;
+ }
+
+ public void setCustomValue(int aVal) {
+ log("Old Value: " + this.aCustomValue);
+ this.aCustomValue = (short) MathUtils.balance(aVal, 0, Short.MAX_VALUE);
+ log("New Value: " + this.aCustomValue);
+ markDirty();
+ }
+
+ public boolean setTileLocation() {
+ if (this.hasWorldObj()) {
+ if (!this.getWorldObj().isRemote) {
+ this.locationX = this.xCoord;
+ this.locationY = this.yCoord;
+ this.locationZ = this.zCoord;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Rename to hasCircuitToConfigure
+ public final boolean hasFlask() {
+ for (int i = 0; i < this.getInventory()
+ .getInventory().length - 1; i++) {
+ if (i == Container_VolumetricFlaskSetter.SLOT_OUTPUT) {
+ continue;
+ }
+ if (this.getInventory()
+ .getInventory()[i] != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public Inventory_VolumetricFlaskSetter getInventory() {
+ return this.inventoryContents;
+ }
+
+ private int getFlaskType(ItemStack aStack) {
+ if (VolumetricFlaskHelper.isNormalVolumetricFlask(aStack)) {
+ return 1;
+ } else if (VolumetricFlaskHelper.isLargeVolumetricFlask(aStack)) {
+ return 2;
+ } else if (VolumetricFlaskHelper.isGiganticVolumetricFlask(aStack)) {
+ return 3;
+ }
+ return 0;
+ }
+
+ private int getCapacityForSlot(int aSlot) {
+ return switch (aSlot) {
+ case 0 -> // 16
+ 16;
+ case 1 -> // 36
+ 36;
+ case 2 -> // 144
+ 144;
+ case 3 -> // 432
+ 432;
+ case 4 -> // 576
+ 576;
+ case 5 -> // 720
+ 720;
+ case 6 -> // 864
+ 864;
+ case 7 -> // Custom
+ getCustomValue();
+ default -> 1000;
+ };
+ }
+
+ public boolean addOutput() {
+
+ // Don't do anything unless we have items
+ if (!hasFlask()) {
+ Logger.INFO("No Flasks.");
+ return false;
+ }
+
+ ItemStack[] aInputs = this.getInventory()
+ .getInventory()
+ .clone();
+
+ // Check if there is output in slot.
+ Boolean hasOutput = false;
+ if (aInputs[Container_VolumetricFlaskSetter.SLOT_OUTPUT] != null) {
+ hasOutput = true;
+ if (aInputs[Container_VolumetricFlaskSetter.SLOT_OUTPUT].stackSize >= 16) {
+ return false;
+ }
+ }
+ AutoMap<Integer> aValidSlots = new AutoMap<>();
+ int aSlotCount = 0;
+ for (ItemStack i : aInputs) {
+ if (i != null) {
+ aValidSlots.put(aSlotCount);
+ }
+ aSlotCount++;
+ }
+ for (int e : aValidSlots) {
+
+ // Skip slot 7 (Custom) unless it has a value > 0
+ if (e == 7 && getCustomValue() <= 0) {
+ log("Skipping Custom slot as value <= 0");
+ continue;
+ }
+ if (e == Container_VolumetricFlaskSetter.SLOT_OUTPUT) {
+ continue;
+ }
+
+ boolean doAdd = false;
+ ItemStack g = this.getStackInSlot(e);
+ FluidStack aInputFluidStack = VolumetricFlaskHelper.getFlaskFluid(g);
+ int aSize = 0;
+ ItemStack aInputStack = null;
+ int aTypeInSlot = getFlaskType(g);
+ if (aTypeInSlot > 0 && g != null) {
+ // No Existing Output
+ if (!hasOutput) {
+ aSize = g.stackSize;
+ doAdd = true;
+ }
+ // Existing Output
+ else {
+ ItemStack f = aInputs[Container_VolumetricFlaskSetter.SLOT_OUTPUT];
+ FluidStack aFluidInCheckedSlot = VolumetricFlaskHelper.getFlaskFluid(f);
+ int aTypeInCheckedSlot = getFlaskType(f);
+ // Check that the Circuit in the Output slot is not null and the same type as the circuit input.
+ if (aTypeInCheckedSlot > 0 && (aTypeInSlot == aTypeInCheckedSlot) && f != null) {
+ if (g.getItem() == f.getItem()
+ && VolumetricFlaskHelper.getFlaskCapacity(f) == getCapacityForSlot(e)
+ && ((aInputFluidStack == null && aFluidInCheckedSlot == null)
+ || aInputFluidStack.isFluidEqual(aFluidInCheckedSlot))) {
+ log(
+ "Input Slot Flask Contains: "
+ + (aInputFluidStack != null ? aInputFluidStack.getLocalizedName() : "Empty"));
+ log(
+ "Output Slot Flask Contains: "
+ + (aFluidInCheckedSlot != null ? aFluidInCheckedSlot.getLocalizedName() : "Empty"));
+ aSize = f.stackSize + g.stackSize;
+ if (aSize > 16) {
+ aInputStack = g.copy();
+ aInputStack.stackSize = (aSize - 16);
+ }
+ doAdd = true;
+ }
+ }
+ }
+ if (doAdd) {
+ // Check Circuit Type
+ ItemStack aOutput;
+ FluidStack aOutputFluid = null;
+ if (!VolumetricFlaskHelper.isFlaskEmpty(g)) {
+ aOutputFluid = aInputFluidStack.copy();
+ }
+ if (aTypeInSlot == 1) {
+ aOutput = VolumetricFlaskHelper.getVolumetricFlask(1);
+ } else if (aTypeInSlot == 2) {
+ aOutput = VolumetricFlaskHelper.getLargeVolumetricFlask(1);
+ } else if (aTypeInSlot == 3) {
+ aOutput = VolumetricFlaskHelper.getGiganticVolumetricFlask(1);
+ } else {
+ aOutput = null;
+ }
+ if (aOutput != null) {
+ aOutput.stackSize = aSize;
+ int aCapacity = getCapacityForSlot(e);
+ VolumetricFlaskHelper.setNewFlaskCapacity(aOutput, aCapacity);
+ if (aOutputFluid != null) {
+ if (aOutputFluid.amount > aCapacity) {
+ aOutputFluid.amount = aCapacity;
+ }
+ VolumetricFlaskHelper.setFluid(aOutput, aOutputFluid);
+ }
+ this.setInventorySlotContents(e, aInputStack);
+ this.setInventorySlotContents(Container_VolumetricFlaskSetter.SLOT_OUTPUT, aOutput);
+ return true;
+ }
+ }
+ }
+ continue;
+ }
+ return false;
+ }
+
+ @Override
+ public void updateEntity() {
+ try {
+ if (!this.worldObj.isRemote) {
+ if (tickCount % 10 == 0) {
+ if (hasFlask()) {
+ this.addOutput();
+ this.markDirty();
+ }
+ }
+ this.tickCount++;
+ }
+ } catch (final Throwable t) {}
+ }
+
+ public boolean anyPlayerInRange() {
+ return this.worldObj.getClosestPlayer(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, 32) != null;
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ super.writeToNBT(nbt);
+ // Utils.LOG_WARNING("Trying to write NBT data to TE.");
+ final NBTTagCompound chestData = new NBTTagCompound();
+ this.inventoryContents.writeToNBT(chestData);
+ nbt.setTag("ContentsChest", chestData);
+ nbt.setInteger("aCustomValue", aCustomValue);
+ if (this.hasCustomInventoryName()) {
+ nbt.setString("CustomName", this.getCustomName());
+ }
+ nbt.setInteger("aCurrentMode", aCurrentMode);
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+ super.readFromNBT(nbt);
+ // Utils.LOG_WARNING("Trying to read NBT data from TE.");
+ this.inventoryContents.readFromNBT(nbt.getCompoundTag("ContentsChest"));
+ this.aCustomValue = nbt.getInteger("aCustomValue");
+ if (nbt.hasKey("CustomName", 8)) {
+ this.setCustomName(nbt.getString("CustomName"));
+ }
+ aCurrentMode = nbt.getInteger("aCurrentMode");
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.getInventory()
+ .getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.getInventory()
+ .getStackInSlot(slot);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int count) {
+ return this.getInventory()
+ .decrStackSize(slot, count);
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ return this.getInventory()
+ .getStackInSlotOnClosing(slot);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.getInventory()
+ .setInventorySlotContents(slot, stack);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return this.getInventory()
+ .getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return this.getInventory()
+ .isUseableByPlayer(entityplayer);
+ }
+
+ @Override
+ public void openInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .closeInventory();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return this.getInventory()
+ .isItemValidForSlot(slot, itemstack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ final int[] accessibleSides = new int[this.getSizeInventory()];
+ for (int r = 0; r < this.getInventory()
+ .getSizeInventory(); r++) {
+ accessibleSides[r] = r;
+ }
+ return accessibleSides;
+ }
+
+ @Override
+ public boolean canInsertItem(final int aSlot, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return aSlot == aCurrentMode;
+ }
+
+ @Override
+ public boolean canExtractItem(final int aSlot, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return aSlot == Container_VolumetricFlaskSetter.SLOT_OUTPUT;
+ }
+
+ public String getCustomName() {
+ return this.customName;
+ }
+
+ public void setCustomName(final String customName) {
+ this.customName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.customName : "container.VolumetricFlaskSetter";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return (this.customName != null) && !this.customName.equals("");
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ final NBTTagCompound tag = new NBTTagCompound();
+ this.writeToNBT(tag);
+ return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.blockMetadata, tag);
+ }
+
+ @Override
+ public void onDataPacket(final NetworkManager net, final S35PacketUpdateTileEntity pkt) {
+ final NBTTagCompound tag = pkt.func_148857_g();
+ this.readFromNBT(tag);
+ }
+
+ public boolean onScrewdriverRightClick(byte side, EntityPlayer player, int x, int y, int z) {
+
+ if (player.isSneaking()) {
+ PlayerUtils.messagePlayer(player, "Value: " + this.getCustomValue());
+ }
+
+ try {
+ if (aCurrentMode == 7) {
+ aCurrentMode = 0;
+ } else {
+ aCurrentMode++;
+ }
+ PlayerUtils.messagePlayer(player, "Slot " + aCurrentMode + " is now default.");
+ return true;
+ } catch (Throwable t) {
+ return false;
+ }
+ }
+
+ public void log(String aString) {
+ Logger.INFO("[Flask-Tile] " + aString);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityAdvPooCollector.java b/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityAdvPooCollector.java
new file mode 100644
index 0000000000..5e0aaf8370
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityAdvPooCollector.java
@@ -0,0 +1,140 @@
+package gtPlusPlus.core.tileentities.machines;
+
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.passive.EntityAnimal;
+import net.minecraft.entity.passive.EntityChicken;
+import net.minecraft.entity.passive.EntityCow;
+import net.minecraft.entity.passive.EntityHorse;
+import net.minecraft.entity.passive.EntityMooshroom;
+import net.minecraft.entity.passive.EntitySheep;
+import net.minecraft.entity.passive.EntityVillager;
+import net.minecraft.entity.passive.IAnimals;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class TileEntityAdvPooCollector extends TileEntityBaseFluidCollector {
+
+ public TileEntityAdvPooCollector() {
+ super(18, 128000);
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection from, Fluid fluid) {
+ return false;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection from, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public void onPreLogicTick() {}
+
+ @Override
+ public <V> boolean addDrop(V aPooMaker) {
+ int aChance = MathUtils.randInt(0, 50000);
+ if (aChance > 0) {
+ ItemStack aPoop;
+ if (aChance <= 200) {
+ aPoop = ItemUtils.getItemStackOfAmountFromOreDict("dustManureByproducts", 1);
+ } else if (aChance <= 1000) {
+ aPoop = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallManureByproducts", 1);
+ } else if (aChance <= 2000) {
+ aPoop = ItemUtils.getItemStackOfAmountFromOreDict("dustTinyManureByproducts", 1);
+ } else {
+ return false;
+ }
+
+ // Add to inventory if not full, else espawn in world
+ if (!this.mInventory.addItemStack(aPoop)) {
+ EntityItem entity = new EntityItem(worldObj, xCoord, yCoord + 1.5, zCoord, aPoop);
+ worldObj.spawnEntityInWorld(entity);
+ }
+ }
+
+ return false;
+ }
+
+ private static AutoMap<Class> aEntityToDrain = new AutoMap<>();
+
+ @Override
+ public AutoMap<Class> aThingsToLookFor() {
+ if (aEntityToDrain.isEmpty()) {
+ aEntityToDrain.add(EntityAnimal.class);
+ aEntityToDrain.add(IAnimals.class);
+ aEntityToDrain.add(EntityVillager.class);
+ aEntityToDrain.add(EntityPlayer.class);
+ }
+ return aEntityToDrain;
+ }
+
+ @Override
+ public <V> int onPostTick(V aPooMaker) {
+ if (this.tank.getFluidAmount() < this.tank.getCapacity()) {
+ int aPooAmount = 0;
+ // Vanilla Animals
+ if (aPooMaker instanceof EntityChicken) {
+ aPooAmount = MathUtils.randInt(1, 40);
+ } else if (aPooMaker instanceof EntityHorse) {
+ aPooAmount = MathUtils.randInt(20, 40);
+ } else if (aPooMaker instanceof EntityCow) {
+ aPooAmount = MathUtils.randInt(18, 45);
+ } else if (aPooMaker instanceof EntityMooshroom) {
+ aPooAmount = 17;
+ } else if (aPooMaker instanceof EntitySheep) {
+ aPooAmount = MathUtils.randInt(8, 30);
+ } else {
+ if (aPooMaker instanceof EntityAnimal || aPooMaker instanceof IAnimals) {
+ aPooAmount = MathUtils.randInt(5, 35);
+ } else if (aPooMaker instanceof EntityVillager) {
+ aPooAmount = MathUtils.randInt(25, 30);
+ } else if (aPooMaker instanceof EntityPlayer) {
+ aPooAmount = MathUtils.randInt(1, 3);
+ } else {
+ aPooAmount = MathUtils.randInt(1, 10);
+ }
+ }
+ aPooAmount = Math.max(Math.min(this.tank.getCapacity() - this.tank.getFluidAmount(), aPooAmount), 1);
+ return Math.max(
+ 1,
+ (aPooAmount
+ * MathUtils
+ .getRandomFromArray(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4 })
+ / 10));
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public Fluid fluidToProvide() {
+ return AgriculturalChem.PoopJuice;
+ }
+
+ @Override
+ public ItemStack itemToSpawnInWorldIfTankIsFull() {
+ int a = MathUtils.randInt(0, 75);
+ ItemStack aItem = null;
+ if (a <= 30) {
+ aItem = ItemUtils.getSimpleStack(AgriculturalChem.dustDirt);
+ } else if (a <= 40) {
+ aItem = ItemUtils.getItemStackOfAmountFromOreDict("dustManureByproducts", 1);
+ } else if (a <= 55) {
+ aItem = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallManureByproducts", 1);
+ }
+ return aItem;
+ }
+
+ @Override
+ public int getBaseTickRate() {
+ return MathUtils.randInt(50, 200);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityBaseFluidCollector.java b/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityBaseFluidCollector.java
new file mode 100644
index 0000000000..6340415e82
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityBaseFluidCollector.java
@@ -0,0 +1,241 @@
+package gtPlusPlus.core.tileentities.machines;
+
+import java.util.List;
+
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidEvent;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTank;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.BTF_FluidTank;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.tileentities.base.TileEntityBase;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public abstract class TileEntityBaseFluidCollector extends TileEntityBase implements IFluidHandler {
+
+ public final FluidTank tank;
+ private boolean needsUpdate = false;
+ private int updateTimer = 0;
+ private long internalTickCounter = 0;
+ private BlockPos internalBlockLocation;
+
+ public TileEntityBaseFluidCollector(int aInvSlotCount, int aTankCapcity) {
+ super(aInvSlotCount);
+ tank = new BTF_FluidTank(aTankCapcity);
+ }
+
+ @Override
+ public final int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
+ needsUpdate = true;
+ return this.tank.fill(resource, doFill);
+ }
+
+ @Override
+ public final FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
+ needsUpdate = true;
+ return this.tank.drain(resource.amount, doDrain);
+ }
+
+ @Override
+ public final FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
+ needsUpdate = true;
+ FluidStack fluid = this.tank.getFluid();
+ // return this.tank.drain(maxDrain, doDrain);
+ if (fluid == null) {
+ return null;
+ }
+
+ int drained = maxDrain;
+ if (fluid.amount < drained) {
+ drained = fluid.amount;
+ }
+
+ FluidStack stack = new FluidStack(fluid, drained);
+ if (doDrain) {
+ fluid.amount -= drained;
+ if (fluid.amount <= 0) {
+ fluid = null;
+ }
+
+ if (this != null) {
+ FluidEvent.fireEvent(
+ new FluidEvent.FluidDrainingEvent(
+ fluid,
+ this.getWorldObj(),
+ this.xCoord,
+ this.yCoord,
+ this.zCoord,
+ this.tank,
+ 0));
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection from, Fluid fluid) {
+ return false;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection from, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public final FluidTankInfo[] getTankInfo(ForgeDirection from) {
+ return new FluidTankInfo[] { this.tank.getInfo() };
+ }
+
+ @Override
+ public final void updateEntity() {
+ super.updateEntity();
+ onPreLogicTick();
+ logicTick();
+ if (needsUpdate) {
+ if (updateTimer == 0) {
+ updateTimer = 10; // every 10 ticks it will send an update
+ } else {
+ --updateTimer;
+ if (updateTimer == 0) {
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ needsUpdate = false;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound tag) {
+ tank.readFromNBT(tag);
+ super.readFromNBT(tag);
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound tag) {
+ tank.writeToNBT(tag);
+ super.writeToNBT(tag);
+ }
+
+ @Override
+ public final Packet getDescriptionPacket() {
+ NBTTagCompound tag = new NBTTagCompound();
+ writeToNBT(tag);
+ return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.blockMetadata, tag);
+ }
+
+ @Override
+ public final void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
+ NBTTagCompound tag = pkt.func_148857_g();
+ readFromNBT(tag);
+ }
+
+ public int getBaseTickRate() {
+ return MathUtils.randInt(200, 300);
+ }
+
+ public abstract AutoMap<Class> aThingsToLookFor();
+
+ public abstract void onPreLogicTick();
+
+ public final void logicTick() {
+
+ if (this.worldObj == null || this.worldObj.isRemote) {
+ return;
+ }
+ if (internalTickCounter % getBaseTickRate() == 0) {
+ if (internalBlockLocation == null) {
+ internalBlockLocation = new BlockPos(this);
+ }
+ BlockPos p = internalBlockLocation;
+ if (p != null) {
+ if (p.world != null) {
+ World w = this.worldObj;
+ if (w == null) {
+ return;
+ }
+ Chunk c = w.getChunkFromBlockCoords(p.xPos, p.zPos);
+ if (c != null) {
+ if (c.isChunkLoaded) {
+ int startX = p.xPos - 2;
+ int startY = p.yPos;
+ int startZ = p.zPos - 2;
+ int endX = p.xPos + 3;
+ int endY = p.yPos + 5;
+ int endZ = p.zPos + 3;
+ AxisAlignedBB box = AxisAlignedBB.getBoundingBox(startX, startY, startZ, endX, endY, endZ);
+ if (box != null) {
+ for (Class c2 : aThingsToLookFor()) {
+ tickEntityType(w, box, c2);
+ }
+ } else {
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ internalTickCounter++;
+ }
+
+ @SuppressWarnings("unchecked")
+ public final void tickEntityType(World w, AxisAlignedBB box, Class aClassToFind) {
+ List<?> entities = w.getEntitiesWithinAABB(aClassToFind, box);
+ if (entities != null && !entities.isEmpty()) {
+ interactWithEntities(entities);
+ }
+ }
+
+ public final <V> void interactWithEntities(List<V> entities) {
+ for (V aEntity : entities) {
+ addDrop(aEntity);
+ if (this.tank.getFluidAmount() < this.tank.getCapacity()) {
+ int aFluidAmount = onPostTick(aEntity);
+ aFluidAmount = Math
+ .max(Math.min(this.tank.getCapacity() - this.tank.getFluidAmount(), aFluidAmount), 1);
+ this.tank.fill(FluidUtils.getFluidStack(fluidToProvide(), aFluidAmount), true);
+ } else {
+ ItemStack aDirtStack = ItemUtils.getSimpleStack(itemToSpawnInWorldIfTankIsFull(), 1);
+ if (!ItemUtils.checkForInvalidItems(aDirtStack)) {
+ return;
+ }
+ if (!this.mInventory.addItemStack(aDirtStack)) {
+ EntityItem entity = new EntityItem(worldObj, xCoord, yCoord + 1.5, zCoord, aDirtStack);
+ worldObj.spawnEntityInWorld(entity);
+ }
+ }
+ }
+ }
+
+ /**
+ * Return the amount of fluid for this entity type
+ *
+ * @param aEntity
+ * @return
+ */
+ public abstract <V> int onPostTick(V aEntity);
+
+ public abstract <V> boolean addDrop(V aPooMaker);
+
+ public abstract Fluid fluidToProvide();
+
+ public abstract ItemStack itemToSpawnInWorldIfTankIsFull();
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPestKiller.java b/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPestKiller.java
new file mode 100644
index 0000000000..dfdb7104b0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPestKiller.java
@@ -0,0 +1,532 @@
+package gtPlusPlus.core.tileentities.machines;
+
+import static gregtech.api.enums.Mods.Forestry;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.passive.EntityBat;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.DamageSource;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidEvent;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTank;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.BTF_FluidTank;
+import gtPlusPlus.core.inventories.InventoryPestKiller;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class TileEntityPestKiller extends TileEntity implements ISidedInventory, IFluidHandler {
+
+ private final int mBaseTickRate = 20 * 30;
+ private final InventoryPestKiller mInventory;
+ private final FluidTank mTank;
+ private int mChunkX;
+ private int mChunkZ;
+ private boolean mSet = false;
+
+ private int mTickCounter = 0;
+ private int mUpdateTick = 0;
+ private boolean mNeedsUpdate = false;
+ private String mCustomName;
+
+ private static final AutoMap<Class<?>> mEntityMap = new AutoMap<>();
+
+ static {
+ mEntityMap.put(EntityBat.class);
+ if (Forestry.isModLoaded()) {
+ mEntityMap.put(ReflectionUtils.getClass("forestry.lepidopterology.entities.EntityButterfly"));
+ }
+ }
+
+ public TileEntityPestKiller() {
+ this.mInventory = new InventoryPestKiller();
+ mTank = new BTF_FluidTank(2000);
+ }
+
+ public InventoryPestKiller getInventory() {
+ return this.mInventory;
+ }
+
+ public FluidTank getTank() {
+ return mTank;
+ }
+
+ private void setup() {
+ World w = this.worldObj;
+ if (w != null) {
+ Chunk c = w.getChunkFromBlockCoords(this.xCoord, this.zCoord);
+ if (c != null) {
+ mChunkX = c.xPosition;
+ mChunkZ = c.zPosition;
+ mSet = true;
+ }
+ }
+ }
+
+ @SuppressWarnings("rawtypes")
+ public boolean tryKillPests() {
+ int min = 0;
+ int max = 0;
+ switch (getTier()) {
+ case 1 -> {
+ min = -2;
+ max = 3;
+ }
+ case 2 -> {
+ min = -4;
+ max = 5;
+ }
+ default -> {}
+ // code block
+ }
+ int aChunkCount = 0;
+ AutoMap<Entity> entities = new AutoMap<>();
+ if (min != 0 && max != 0) {
+ for (int x = min; x < max; x++) {
+ for (int z = min; z < max; z++) {
+ Chunk c = getChunkFromOffsetIfLoaded(x, z);
+ if (c != null) {
+ if (c.hasEntities) {
+ aChunkCount++;
+ List[] lists = c.entityLists;
+ for (List o : lists) {
+ for (Object e : o) {
+ if (e instanceof Entity) {
+ for (Class<?> C : mEntityMap) {
+ if (e.getClass()
+ .equals(C) || C.isAssignableFrom(e.getClass())) {
+ entities.put((Entity) e);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } else {
+ Chunk c = getChunkFromOffsetIfLoaded(0, 0);
+ if (c != null) {
+ if (c.hasEntities) {
+ List[] lists = c.entityLists;
+ for (List o : lists) {
+ for (Object e : o) {
+ if (e instanceof Entity) {
+ for (Class<?> C : mEntityMap) {
+ if (e.getClass()
+ .equals(C) || C.isAssignableFrom(e.getClass())) {
+ entities.put((Entity) e);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ boolean killed = false;
+ if (!entities.isEmpty()) {
+ for (Entity e : entities) {
+ if (e != null) {
+ if (e.isEntityAlive()) {
+ if (this.mTank.getFluidAmount() >= 1 || getTier() == 0) {
+ if (getTier() > 0) {
+ int aChanceToUse = MathUtils.randInt(1, (100 * getTier()));
+ if (aChanceToUse == 1) {
+ this.mTank.drain(1, true);
+ }
+ }
+ EntityUtils.doDamage(e, DamageSource.generic, Short.MAX_VALUE);
+ e.setDead();
+ killed = true;
+ }
+ }
+ }
+ }
+ }
+ updateTileEntity();
+ return killed;
+ }
+
+ public Chunk getChunkFromOffsetIfLoaded(int x, int y) {
+ Chunk c = this.worldObj.getChunkFromChunkCoords(mChunkX + x, mChunkZ + y);
+ if (c.isChunkLoaded) {
+ return c;
+ }
+ return null;
+ }
+
+ public int getTier() {
+ if (this.mTank != null) {
+ FluidStack f = mTank.getFluid();
+ if (f != null) {
+ if (f.isFluidEqual(FluidUtils.getWildcardFluidStack("formaldehyde", 1))) {
+ return 1;
+ } else if (f.isFluidEqual(MISC_MATERIALS.HYDROGEN_CYANIDE.getFluidStack(1))) {
+ return 2;
+ }
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public void updateEntity() {
+ if (worldObj.isRemote) {
+ return;
+ }
+ if (!mSet) {
+ setup();
+ }
+ this.mTickCounter++;
+ if (this.mTank != null) {
+ if (this.hasFluidSpace()) {
+ handleInventory();
+ }
+ }
+ if (this.mTickCounter % this.mBaseTickRate == 0) {
+ tryKillPests();
+ }
+ updateTick();
+ }
+
+ public boolean anyPlayerInRange() {
+ return this.worldObj.getClosestPlayer(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, 32) != null;
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ mTank.writeToNBT(nbt);
+ super.writeToNBT(nbt);
+ // Utils.LOG_MACHINE_INFO("Trying to write NBT data to TE.");
+ final NBTTagCompound chestData = new NBTTagCompound();
+ this.mInventory.writeToNBT(chestData);
+ nbt.setTag("ContentsChest", chestData);
+ if (this.hasCustomInventoryName()) {
+ nbt.setString("CustomName", this.getCustomName());
+ }
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+ mTank.readFromNBT(nbt);
+ super.readFromNBT(nbt);
+ // Utils.LOG_MACHINE_INFO("Trying to read NBT data from TE.");
+ this.mInventory.readFromNBT(nbt.getCompoundTag("ContentsChest"));
+ if (nbt.hasKey("CustomName", 8)) {
+ this.setCustomName(nbt.getString("CustomName"));
+ }
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return this.getInventory()
+ .getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int slot) {
+ return this.getInventory()
+ .getStackInSlot(slot);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int slot, final int count) {
+ return this.getInventory()
+ .decrStackSize(slot, count);
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int slot) {
+ return this.getInventory()
+ .getStackInSlotOnClosing(slot);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int slot, final ItemStack stack) {
+ this.getInventory()
+ .setInventorySlotContents(slot, stack);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return this.getInventory()
+ .getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer entityplayer) {
+ return this.getInventory()
+ .isUseableByPlayer(entityplayer);
+ }
+
+ @Override
+ public void openInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .openInventory();
+ }
+
+ @Override
+ public void closeInventory() {
+ this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 1, 1);
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType());
+ this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType());
+ this.getInventory()
+ .closeInventory();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int slot, final ItemStack itemstack) {
+ return this.getInventory()
+ .isItemValidForSlot(slot, itemstack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ final int[] accessibleSides = new int[this.getSizeInventory()];
+ for (int r = 0; r < this.getInventory()
+ .getSizeInventory(); r++) {
+ accessibleSides[r] = r;
+ }
+ return accessibleSides;
+ }
+
+ @Override
+ public boolean canInsertItem(final int aSlot, final ItemStack aStack, final int p_102007_3_) {
+ if (this.getInventory()
+ .getInventory()[0] == null) {
+ return true;
+ } else if (GT_Utility.areStacksEqual(
+ aStack,
+ this.getInventory()
+ .getInventory()[0])) {
+ if (this.getInventory()
+ .getInventory()[0].stackSize < 64) {
+ int diff = 64 - this.getInventory()
+ .getInventory()[0].stackSize;
+ if (aStack.stackSize <= diff) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(final int aSlot, final ItemStack aStack, final int p_102008_3_) {
+ if (this.getInventory()
+ .getInventory()[1] == null) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public String getCustomName() {
+ return this.mCustomName;
+ }
+
+ public void setCustomName(final String customName) {
+ this.mCustomName = customName;
+ }
+
+ @Override
+ public String getInventoryName() {
+ return this.hasCustomInventoryName() ? this.mCustomName : "container.pestkiller";
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return (this.mCustomName != null) && !this.mCustomName.equals("");
+ }
+
+ @Override
+ public final int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
+ updateTileEntity();
+ return this.mTank.fill(resource, doFill);
+ }
+
+ @Override
+ public final FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
+ updateTileEntity();
+ return this.mTank.drain(resource.amount, doDrain);
+ }
+
+ @Override
+ public final FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
+ FluidStack fluid = this.mTank.getFluid();
+ // return this.tank.drain(maxDrain, doDrain);
+ if (fluid == null) {
+ return null;
+ }
+
+ int drained = maxDrain;
+ if (fluid.amount < drained) {
+ drained = fluid.amount;
+ }
+
+ FluidStack stack = new FluidStack(fluid, drained);
+ if (doDrain) {
+ fluid.amount -= drained;
+ if (fluid.amount <= 0) {
+ fluid = null;
+ }
+
+ if (this != null) {
+ FluidEvent.fireEvent(
+ new FluidEvent.FluidDrainingEvent(
+ fluid,
+ this.getWorldObj(),
+ this.xCoord,
+ this.yCoord,
+ this.zCoord,
+ this.mTank,
+ 0));
+ }
+ }
+ updateTileEntity();
+ return stack;
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection from, Fluid fluid) {
+ return mTank.getFluid() == null || mTank.getFluid()
+ .getFluid()
+ .equals(fluid);
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection from, Fluid fluid) {
+ return false;
+ }
+
+ @Override
+ public final FluidTankInfo[] getTankInfo(ForgeDirection from) {
+ return new FluidTankInfo[] { this.mTank.getInfo() };
+ }
+
+ @Override
+ public final Packet getDescriptionPacket() {
+ NBTTagCompound tag = new NBTTagCompound();
+ writeToNBT(tag);
+ return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.blockMetadata, tag);
+ }
+
+ @Override
+ public final void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
+ NBTTagCompound tag = pkt.func_148857_g();
+ readFromNBT(tag);
+ }
+
+ public boolean hasFluidSpace() {
+ if (this.mTank.getFluidAmount() <= 1000) {
+ return true;
+ }
+ return false;
+ }
+
+ public boolean drainCell() {
+ boolean didFill = false;
+ ItemStack aInput = this.getStackInSlot(0);
+ if (aInput == null) {
+ return false;
+ }
+ aInput = aInput.copy();
+ if (aInput != null && (this.getStackInSlot(1) == null || this.getStackInSlot(1).stackSize < 64)) {
+ ArrayList<ItemStack> t1Cells = OreDictionary.getOres("cellFormaldehyde");
+ ArrayList<ItemStack> t2Cells = OreDictionary.getOres("cellHydrogenCyanide");
+ didFill = addFluid(t1Cells, aInput, FluidUtils.getWildcardFluidStack("formaldehyde", 1000));
+ if (!didFill) {
+ didFill = addFluid(t2Cells, aInput, MISC_MATERIALS.HYDROGEN_CYANIDE.getFluidStack(1000));
+ }
+ }
+
+ return didFill;
+ }
+
+ public boolean handleInventory() {
+ if (this.getInventory() != null && drainCell()) {
+ this.decrStackSize(0, 1);
+ if (this.getStackInSlot(1) == null) {
+ this.setInventorySlotContents(1, CI.emptyCells(1));
+ } else {
+ this.getStackInSlot(1).stackSize++;
+ }
+ this.updateTileEntity();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean addFluid(ArrayList<ItemStack> inputs, ItemStack aInput, FluidStack aFluidForInput) {
+ for (ItemStack a : inputs) {
+ if (GT_Utility.areStacksEqual(a, aInput)) {
+ if (mTank.getFluid() == null || mTank.getFluid()
+ .isFluidEqual(aFluidForInput)) {
+ boolean didFill = fill(ForgeDirection.UNKNOWN, aFluidForInput, true) > 0;
+ return didFill;
+ }
+ } else {
+ continue;
+ }
+ }
+ return false;
+ }
+
+ public void updateTileEntity() {
+ this.getInventory()
+ .markDirty();
+ this.markDirty();
+ this.mNeedsUpdate = true;
+ }
+
+ private void updateTick() {
+ if (mNeedsUpdate) {
+ if (mUpdateTick == 0) {
+ mUpdateTick = 4; // every 4 ticks it will send an update
+ } else {
+ --mUpdateTick;
+ if (mUpdateTick == 0) {
+ markDirty();
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ mNeedsUpdate = false;
+ }
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPooCollector.java b/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPooCollector.java
new file mode 100644
index 0000000000..d0d4ee3661
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityPooCollector.java
@@ -0,0 +1,128 @@
+package gtPlusPlus.core.tileentities.machines;
+
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.passive.EntityAnimal;
+import net.minecraft.entity.passive.EntityChicken;
+import net.minecraft.entity.passive.EntityCow;
+import net.minecraft.entity.passive.EntityHorse;
+import net.minecraft.entity.passive.EntityMooshroom;
+import net.minecraft.entity.passive.EntitySheep;
+import net.minecraft.entity.passive.IAnimals;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class TileEntityPooCollector extends TileEntityBaseFluidCollector {
+
+ public TileEntityPooCollector() {
+ super(9, 8000);
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection from, Fluid fluid) {
+ return false;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection from, Fluid fluid) {
+ return true;
+ }
+
+ @Override
+ public void onPreLogicTick() {}
+
+ @Override
+ public <V> boolean addDrop(V aPooMaker) {
+ int aChance = MathUtils.randInt(0, 50000);
+ if (aChance > 0) {
+ ItemStack aPoop;
+ if (aChance <= 100) {
+ aPoop = ItemUtils.getItemStackOfAmountFromOreDict("dustManureByproducts", 1);
+ } else if (aChance <= 500) {
+ aPoop = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallManureByproducts", 1);
+ } else if (aChance <= 1250) {
+ aPoop = ItemUtils.getItemStackOfAmountFromOreDict("dustTinyManureByproducts", 1);
+ } else {
+ return false;
+ }
+ if (!ItemUtils.checkForInvalidItems(aPoop)) {
+ return false;
+ }
+
+ // Add poop to world
+ // Logger.INFO("Adding animal waste for "+aPooMaker.getCommandSenderName());
+
+ // Add to inventory if not full, else espawn in world
+ if (!this.mInventory.addItemStack(aPoop)) {
+ EntityItem entity = new EntityItem(worldObj, xCoord, yCoord + 1.5, zCoord, aPoop);
+ worldObj.spawnEntityInWorld(entity);
+ }
+ }
+
+ return false;
+ }
+
+ private static AutoMap<Class> aEntityToDrain = new AutoMap<>();
+
+ @Override
+ public AutoMap<Class> aThingsToLookFor() {
+ if (aEntityToDrain.isEmpty()) {
+ aEntityToDrain.add(EntityAnimal.class);
+ aEntityToDrain.add(IAnimals.class);
+ }
+ return aEntityToDrain;
+ }
+
+ @Override
+ public <V> int onPostTick(V aPooMaker) {
+ if (this.tank.getFluidAmount() < this.tank.getCapacity()) {
+ int aPooAmount = 0;
+ // Vanilla Animals
+ if (aPooMaker instanceof EntityChicken) {
+ aPooAmount = MathUtils.randInt(1, 40);
+ } else if (aPooMaker instanceof EntityHorse) {
+ aPooAmount = MathUtils.randInt(20, 40);
+ } else if (aPooMaker instanceof EntityCow) {
+ aPooAmount = MathUtils.randInt(18, 45);
+ } else if (aPooMaker instanceof EntityMooshroom) {
+ aPooAmount = 17;
+ } else if (aPooMaker instanceof EntitySheep) {
+ aPooAmount = MathUtils.randInt(8, 30);
+ } else {
+ if (aPooMaker instanceof EntityAnimal || aPooMaker instanceof IAnimals) {
+ aPooAmount = MathUtils.randInt(5, 35);
+ } else {
+ aPooAmount = MathUtils.randInt(1, 10);
+ }
+ }
+ aPooAmount = Math.max((Math.min(this.tank.getCapacity() - this.tank.getFluidAmount(), aPooAmount) / 10), 1);
+ return aPooAmount;
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public Fluid fluidToProvide() {
+ return AgriculturalChem.PoopJuice;
+ }
+
+ @Override
+ public ItemStack itemToSpawnInWorldIfTankIsFull() {
+ int a = MathUtils.randInt(0, 100);
+ ItemStack aItem = null;
+ if (a <= 30) {
+ aItem = ItemUtils.getSimpleStack(AgriculturalChem.dustDirt);
+ } else if (a <= 40) {
+ aItem = ItemUtils.getItemStackOfAmountFromOreDict("dustSmallManureByproducts", 1);
+ } else if (a <= 55) {
+ aItem = ItemUtils.getItemStackOfAmountFromOreDict("dustTinyManureByproducts", 1);
+ }
+ return aItem;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityProjectTable.java b/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityProjectTable.java
new file mode 100644
index 0000000000..7c90ddc1c2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/tileentities/machines/TileEntityProjectTable.java
@@ -0,0 +1,165 @@
+package gtPlusPlus.core.tileentities.machines;
+
+import java.util.List;
+import java.util.Vector;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+
+import gregtech.api.enums.ItemList;
+import gregtech.common.items.GT_MetaGenerated_Item_01;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.container.Container_ProjectTable;
+import gtPlusPlus.core.inventories.projecttable.InventoryProjectMain;
+import gtPlusPlus.core.inventories.projecttable.InventoryProjectOutput;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechItems;
+import ic2.api.network.INetworkDataProvider;
+import ic2.api.network.INetworkUpdateListener;
+import ic2.api.tile.IWrenchable;
+import ic2.core.IC2;
+
+public class TileEntityProjectTable extends TileEntity
+ implements INetworkDataProvider, INetworkUpdateListener, IWrenchable {
+
+ public InventoryProjectMain inventoryGrid;
+ public InventoryProjectOutput inventoryOutputs;
+
+ private Container_ProjectTable container;
+
+ public TileEntityProjectTable() {
+ this.inventoryGrid = new InventoryProjectMain(); // number of slots - without product slot
+ this.inventoryOutputs = new InventoryProjectOutput(); // number of slots - without product slot
+ this.canUpdate();
+ }
+
+ public void setContainer(Container_ProjectTable container) {
+ this.container = container;
+ }
+
+ public NBTTagCompound getTag(final NBTTagCompound nbt, final String tag) {
+ if (!nbt.hasKey(tag)) {
+ nbt.setTag(tag, new NBTTagCompound());
+ }
+ return nbt.getCompoundTag(tag);
+ }
+
+ @Override
+ public void writeToNBT(final NBTTagCompound nbt) {
+ super.writeToNBT(nbt);
+ nbt.setShort("facing", this.facing);
+ this.inventoryGrid.writeToNBT(this.getTag(nbt, "ContentsGrid"));
+ this.inventoryOutputs.writeToNBT(this.getTag(nbt, "ContentsOutput"));
+ }
+
+ @Override
+ public void readFromNBT(final NBTTagCompound nbt) {
+ super.readFromNBT(nbt);
+ this.prevFacing = (this.facing = nbt.getShort("facing"));
+ this.inventoryGrid.readFromNBT(nbt.getCompoundTag("ContentsGrid"));
+ this.inventoryOutputs.readFromNBT(nbt.getCompoundTag("ContentsOutput"));
+ }
+
+ @Override
+ public List<String> getNetworkedFields() {
+ final List<String> ret = new Vector(2);
+ ret.add("facing");
+ return ret;
+ }
+
+ @Override
+ public boolean wrenchCanSetFacing(final EntityPlayer entityPlayer, final int side) {
+ return false;
+ }
+
+ private short facing = 0;
+ public short prevFacing = 0;
+
+ @Override
+ public void setFacing(final short facing1) {
+ this.facing = facing1;
+ if (this.prevFacing != facing1) {
+ IC2.network.get()
+ .updateTileEntityField(this, "facing");
+ }
+ this.prevFacing = facing1;
+ }
+
+ @Override
+ public short getFacing() {
+ return this.facing;
+ }
+
+ @Override
+ public boolean wrenchCanRemove(final EntityPlayer entityPlayer) {
+ return true;
+ }
+
+ @Override
+ public float getWrenchDropRate() {
+ return 1.0F;
+ }
+
+ @Override
+ public ItemStack getWrenchDrop(final EntityPlayer entityPlayer) {
+ return new ItemStack(
+ this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord),
+ 1,
+ this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord));
+ }
+
+ @Override
+ public void onNetworkUpdate(final String field) {
+ this.prevFacing = this.facing;
+ }
+
+ @Override
+ public void updateEntity() {
+ if (!this.worldObj.isRemote) {
+ // Data stick
+ ItemStack dataStick = this.inventoryOutputs.getStackInSlot(0);
+ if (dataStick != null && this.container != null && container.getOutputContent() != null) {
+ if ((dataStick.getItem() instanceof GT_MetaGenerated_Item_01 && dataStick.getItemDamage() == 32708)
+ || (dataStick == ItemList.Tool_DataStick.get(1))
+ || (dataStick == GregtechItemList.Old_Tool_DataStick.get(1))
+ || (dataStick.getItem() instanceof MetaGeneratedGregtechItems
+ && dataStick.getItemDamage() == 32208)) {
+
+ Logger.INFO("Found Data Stick and valid container.");
+
+ ItemStack outputComponent = container.getOutputContent();
+ ItemStack[] craftInputComponent = container.getInputComponents();
+
+ ItemStack newStick = NBTUtils
+ .writeItemsToNBT(dataStick, new ItemStack[] { outputComponent }, "Output");
+ newStick = NBTUtils.writeItemsToNBT(newStick, craftInputComponent);
+ NBTUtils.setBookTitle(newStick, "Encrypted Project Data");
+ NBTUtils.setBoolean(newStick, "mEncrypted", true);
+ int slotm = 0;
+ Logger.WARNING("Uploading to Data Stick.");
+ for (ItemStack is : NBTUtils.readItemsFromNBT(newStick)) {
+ if (is != null) {
+ Logger.WARNING("Uploaded " + is.getDisplayName() + " into memory slot " + slotm + ".");
+ } else {
+ Logger.WARNING("Left memory slot " + slotm + " blank.");
+ }
+ slotm++;
+ }
+ Logger.WARNING("Encrypting Data Stick.");
+ this.inventoryOutputs.setInventorySlotContents(1, newStick);
+ this.inventoryOutputs.setInventorySlotContents(0, null);
+ }
+ }
+
+ }
+ super.updateEntity();
+ }
+
+ @Override
+ public boolean canUpdate() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/MovingAverageLong.java b/gtpp/src/main/java/gtPlusPlus/core/util/MovingAverageLong.java
new file mode 100644
index 0000000000..7111fbd5e1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/MovingAverageLong.java
@@ -0,0 +1,59 @@
+package gtPlusPlus.core.util;
+
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+public class MovingAverageLong {
+
+ private final long[] storage;
+ private int ptr;
+
+ public MovingAverageLong(int sampleSize) {
+ storage = new long[sampleSize];
+ }
+
+ public void set(long average) {
+ Arrays.fill(storage, average);
+ }
+
+ public void sample(long data) {
+ storage[ptr] = data;
+ ptr = (ptr + 1) % storage.length;
+ }
+
+ public long get() {
+ BigInteger result = BigInteger.ZERO;
+ for (long l : storage) {
+ result = result.add(BigInteger.valueOf(l));
+ }
+ return result.divide(BigInteger.valueOf(storage.length))
+ .longValue();
+ }
+
+ public void write(NBTTagCompound tagCompound, String key) {
+ ByteBuffer buf = ByteBuffer.allocate(storage.length * Long.BYTES)
+ .order(ByteOrder.nativeOrder());
+ buf.asLongBuffer()
+ .put(storage);
+ tagCompound.setByteArray(key, buf.array());
+ }
+
+ /**
+ * if read failed, the internal states would not be changed.
+ *
+ * @return true if successful, false otherwise.
+ */
+ public boolean read(NBTTagCompound tagCompound, String key) {
+ ByteBuffer buf = ByteBuffer.wrap(tagCompound.getByteArray(key));
+ if (buf.remaining() != storage.length * Long.BYTES)
+ // not very good...
+ return false;
+ buf.asLongBuffer()
+ .get(storage);
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/Utils.java b/gtpp/src/main/java/gtPlusPlus/core/util/Utils.java
new file mode 100644
index 0000000000..610cc4f8fa
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/Utils.java
@@ -0,0 +1,436 @@
+package gtPlusPlus.core.util;
+
+import java.awt.Color;
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.IChatComponent;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.common.util.EnumHelper;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.EnumUtils;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import ic2.core.Ic2Items;
+import ic2.core.init.InternalName;
+import ic2.core.item.resources.ItemCell;
+
+public class Utils {
+
+ public static boolean isServer() {
+ return FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isServer();
+ }
+
+ public static boolean isClient() {
+ return FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isClient();
+ }
+
+ public static TC_AspectStack getTcAspectStack(final TC_Aspects aspect, final long size) {
+ return getTcAspectStack(aspect.name(), (int) size);
+ }
+
+ public static TC_AspectStack getTcAspectStack(final String aspect, final long size) {
+ return getTcAspectStack(aspect, (int) size);
+ }
+
+ public static TC_AspectStack getTcAspectStack(final TC_Aspects aspect, final int size) {
+ return getTcAspectStack(aspect.name(), size);
+ }
+
+ public static TC_AspectStack getTcAspectStack(final String aspect, final int size) {
+
+ TC_AspectStack returnValue = null;
+
+ if (aspect.equalsIgnoreCase("COGNITIO")) {
+ // Adds in Compat for older GT Versions which Misspell aspects.
+ try {
+ if (EnumUtils.isValidEnum(TC_Aspects.class, "COGNITIO")) {
+ Logger.WARNING("TC Aspect found - " + aspect);
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf("COGNITIO"), size);
+ } else {
+ Logger.INFO(
+ "Fallback TC Aspect found - " + aspect
+ + " - PLEASE UPDATE GREGTECH TO A NEWER VERSION TO REMOVE THIS MESSAGE - THIS IS NOT AN ERROR");
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf("COGNITO"), size);
+ }
+ } catch (final NoSuchFieldError r) {
+ Logger.INFO("Invalid Thaumcraft Aspects - Report this issue to Alkalus");
+ }
+ } else if (aspect.equalsIgnoreCase("EXANIMUS")) {
+ // Adds in Compat for older GT Versions which Misspell aspects.
+ try {
+ if (EnumUtils.isValidEnum(TC_Aspects.class, "EXANIMUS")) {
+ Logger.WARNING("TC Aspect found - " + aspect);
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf("EXANIMUS"), size);
+ } else {
+ Logger.INFO(
+ "Fallback TC Aspect found - " + aspect
+ + " - PLEASE UPDATE GREGTECH TO A NEWER VERSION TO REMOVE THIS MESSAGE - THIS IS NOT AN ERROR");
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf("EXAMINIS"), size);
+ }
+ } catch (final NoSuchFieldError r) {
+ Logger.INFO("Invalid Thaumcraft Aspects - Report this issue to Alkalus");
+ }
+
+ } else if (aspect.equalsIgnoreCase("PRAECANTATIO")) {
+ // Adds in Compat for older GT Versions which Misspell aspects.
+ try {
+ if (EnumUtils.isValidEnum(TC_Aspects.class, "PRAECANTATIO")) {
+ Logger.WARNING("TC Aspect found - " + aspect);
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf("PRAECANTATIO"), size);
+ } else {
+ Logger.INFO(
+ "Fallback TC Aspect found - " + aspect
+ + " - PLEASE UPDATE GREGTECH TO A NEWER VERSION TO REMOVE THIS MESSAGE - THIS IS NOT AN ERROR");
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf("PRAECANTIO"), size);
+ }
+ } catch (final NoSuchFieldError r) {
+ Logger.INFO("Invalid Thaumcraft Aspects - Report this issue to Alkalus");
+ }
+ } else {
+ Logger.WARNING("TC Aspect found - " + aspect);
+ returnValue = new TC_AspectStack(TC_Aspects.valueOf(aspect), size);
+ }
+
+ return returnValue;
+ }
+
+ // Register an event to both busses.
+ public static void registerEvent(Object o) {
+ MinecraftForge.EVENT_BUS.register(o);
+ FMLCommonHandler.instance()
+ .bus()
+ .register(o);
+ }
+
+ // Send a message to all players on the server
+ public static void sendServerMessage(final String translationKey) {
+ sendServerMessage(new ChatComponentText(translationKey));
+ }
+
+ // Send a message to all players on the server
+ public static void sendServerMessage(final IChatComponent chatComponent) {
+ MinecraftServer.getServer()
+ .getConfigurationManager()
+ .sendChatMsg(chatComponent);
+ }
+
+ /**
+ * Returns if that Liquid is IC2Steam.
+ */
+ public static boolean isIC2Steam(final FluidStack aFluid) {
+ if (aFluid == null) {
+ return false;
+ }
+ return aFluid.isFluidEqual(getIC2Steam(1));
+ }
+
+ /**
+ * Returns a Liquid Stack with given amount of IC2Steam.
+ */
+ public static FluidStack getIC2Steam(final long aAmount) {
+ return FluidRegistry.getFluidStack("ic2steam", (int) aAmount);
+ }
+
+ public static int rgbtoHexValue(final int r, final int g, final int b) {
+ if ((r > 255) || (g > 255) || (b > 255) || (r < 0) || (g < 0) || (b < 0)) {
+ return 0;
+ }
+ final Color c = new Color(r, g, b);
+ String temp = Integer.toHexString(c.getRGB() & 0xFFFFFF)
+ .toUpperCase();
+ temp = Utils.appenedHexNotationToString(temp);
+ return Integer.decode(temp);
+ }
+
+ /*
+ * http://javadevnotes.com/java-left-pad-string-with-zeros-examples
+ */
+ public static String padWithZerosLefts(final String originalString, final int length) {
+ final StringBuilder sb = new StringBuilder();
+ while ((sb.length() + originalString.length()) < length) {
+ sb.append('0');
+ }
+ sb.append(originalString);
+ return sb.toString();
+ }
+
+ /*
+ * Original Code by Chandana Napagoda - https://cnapagoda.blogspot.com.au/2011/03/java-hex-color-code-generator.
+ * html
+ */
+ public static Map<Integer, String> hexColourGeneratorRandom(final int colorCount) {
+ final HashMap<Integer, String> hexColorMap = new HashMap<>();
+ for (int a = 0; a < colorCount; a++) {
+ String code = "" + (int) (Math.random() * 256);
+ code = code + code + code;
+ final int i = Integer.parseInt(code);
+ hexColorMap.put(
+ a,
+ Integer.toHexString(0x1000000 | i)
+ .substring(1)
+ .toUpperCase());
+ Logger.WARNING(
+ "" + Integer.toHexString(0x1000000 | i)
+ .substring(1)
+ .toUpperCase());
+ }
+ return hexColorMap;
+ }
+
+ public static String appenedHexNotationToString(final Object hexAsStringOrInt) {
+ final String hexChar = "0x";
+ String result;
+ if (hexAsStringOrInt.getClass() == String.class) {
+
+ if (((String) hexAsStringOrInt).length() != 6) {
+ final String temp = padWithZerosLefts((String) hexAsStringOrInt, 6);
+ }
+ result = hexChar + hexAsStringOrInt;
+ return result;
+ } else if (hexAsStringOrInt.getClass() == Integer.class) {
+ String aa = String.valueOf(hexAsStringOrInt);
+ if (aa.length() != 6) {
+ result = padWithZerosLefts(aa, 6);
+ } else {
+ result = hexChar + hexAsStringOrInt;
+ }
+ return result;
+ } else {
+ return null;
+ }
+ }
+
+ public static File getMcDir() {
+ if (Utils.isClient()) {
+ if (Minecraft.getMinecraft() != null) {
+ return Minecraft.getMinecraft().mcDataDir;
+ }
+ }
+ return new File(".");
+ }
+
+ private static short cellID = 15;
+
+ public static ItemStack createInternalNameAndFluidCell(final String s) {
+ Logger.WARNING("1");
+ final InternalName yourName = EnumHelper.addEnum(InternalName.class, s, new Class[0], new Object[0]);
+ Logger.WARNING("2 " + yourName.name());
+ final ItemCell item = (ItemCell) Ic2Items.cell.getItem();
+ Logger.WARNING("3 " + item.getUnlocalizedName());
+ try {
+ Logger.WARNING("4");
+ final Class<? extends ItemCell> clz = item.getClass();
+ Logger.WARNING("5 " + clz.getSimpleName());
+ final Method methode = clz.getDeclaredMethod("addCell", int.class, InternalName.class, Block[].class);
+ Logger.WARNING("6 " + methode.getName());
+ methode.setAccessible(true);
+ Logger.WARNING("7 " + methode.isAccessible());
+ final ItemStack temp = (ItemStack) methode.invoke(item, cellID++, yourName, new Block[0]);
+ Logger.WARNING("Successfully created " + temp.getDisplayName() + "s.");
+ FluidContainerRegistry.registerFluidContainer(
+ FluidUtils.getFluidStack(s.toLowerCase(), 1000),
+ temp.copy(),
+ Ic2Items.cell.copy());
+ ItemUtils.addItemToOreDictionary(temp.copy(), "cell" + s);
+ return temp;
+ } catch (final Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static String sanitizeString(final String input, final char[] dontRemove) {
+
+ // List of characters to remove
+ final HashSet<Character> toRemoveSet = new HashSet<>();
+ Collections.addAll(
+ toRemoveSet,
+ ' ',
+ '-',
+ '_',
+ '~',
+ '?',
+ '!',
+ '@',
+ '#',
+ '$',
+ '%',
+ '^',
+ '&',
+ '*',
+ '(',
+ ')',
+ '{',
+ '}',
+ '[',
+ ']');
+
+ // Remove characters from the toRemoveSet if they are in dontRemove
+ for (char e : dontRemove) {
+ toRemoveSet.remove(e);
+ }
+
+ // Construct a sanitized string
+ StringBuilder sanitized = new StringBuilder();
+ for (char c : input.toCharArray()) {
+ if (!toRemoveSet.contains(c)) {
+ sanitized.append(c);
+ }
+ }
+
+ return sanitized.toString();
+ }
+
+ public static String sanitizeString(final String input) {
+ String temp;
+ String output;
+
+ temp = input.replace(" ", "");
+ temp = temp.replace("-", "");
+ temp = temp.replace("_", "");
+ temp = temp.replace("?", "");
+ temp = temp.replace("!", "");
+ temp = temp.replace("@", "");
+ temp = temp.replace("#", "");
+ temp = temp.replace("(", "");
+ temp = temp.replace(")", "");
+ temp = temp.replace("{", "");
+ temp = temp.replace("}", "");
+ temp = temp.replace("[", "");
+ temp = temp.replace("]", "");
+ temp = temp.replace(" ", "");
+ output = temp;
+ return output;
+ }
+
+ public static String sanitizeStringKeepBrackets(final String input) {
+ String temp;
+ String output;
+
+ temp = input.replace(" ", "");
+ temp = temp.replace("-", "");
+ temp = temp.replace("_", "");
+ temp = temp.replace("?", "");
+ temp = temp.replace("!", "");
+ temp = temp.replace("@", "");
+ temp = temp.replace("#", "");
+ temp = temp.replace(" ", "");
+ output = temp;
+ return output;
+ }
+
+ public static String addBookTitleLocalization(final String aTitle) {
+ return GT_LanguageManager
+ .addStringLocalization("Book." + aTitle + ".Name", aTitle, !GregTech_API.sPostloadFinished);
+ }
+
+ public static String[] addBookPagesLocalization(final String aTitle, final String[] aPages) {
+ String[] aLocalizationPages = new String[aPages.length];
+ for (byte i = 0; i < aPages.length; i = (byte) (i + 1)) {
+ aLocalizationPages[i] = GT_LanguageManager.addStringLocalization(
+ "Book." + aTitle + ".Page" + ((i < 10) ? "0" + i : Byte.valueOf(i)),
+ aPages[i],
+ !GregTech_API.sPostloadFinished);
+ }
+ return aLocalizationPages;
+ }
+
+ public static ItemStack getWrittenBook(ItemStack book, int ID, String mapping, String title, String author,
+ String[] pages) {
+
+ if (GT_Utility.isStringInvalid(mapping)) {
+ return null;
+ }
+
+ ItemStack stack = CORE.sBookList.get(mapping);
+ if (stack != null) {
+ return GT_Utility.copyAmount(1L, stack);
+ }
+
+ if (GT_Utility.isStringInvalid(title) || GT_Utility.isStringInvalid(author) || pages.length <= 0) {
+ return null;
+ }
+
+ stack = (book == null) ? new ItemStack(ModItems.itemCustomBook, 1, ID) : book;
+
+ NBTTagCompound NBT = new NBTTagCompound();
+ String localizationTitle = addBookTitleLocalization(title);
+ NBT.setString("title", localizationTitle);
+ NBT.setString("author", author);
+
+ NBTTagList NBTList = new NBTTagList();
+ String[] localizationPages = addBookPagesLocalization(title, pages);
+
+ for (byte i = 0; i < pages.length; i++) {
+ pages[i] = localizationPages[i].replaceAll("<BR>", "\n");
+ if (i < 48) {
+ if (pages[i].length() < 256) {
+ NBTList.appendTag(new NBTTagString(pages[i]));
+ } else {
+ Logger.INFO("WARNING: String for written Book too long! -> " + pages[i]);
+ GT_Log.err.println("WARNING: String for written Book too long! -> " + pages[i]);
+ }
+ } else {
+ Logger.INFO("WARNING: Too much Pages for written Book! -> " + title);
+ GT_Log.err.println("WARNING: Too much Pages for written Book! -> " + title);
+ break;
+ }
+ }
+
+ String credits = String.format(
+ "Credits to %s for writing this Book. This was Book Nr. %d at its creation. Gotta get 'em all!",
+ author,
+ ID);
+ NBTList.appendTag(new NBTTagString(credits));
+ NBT.setTag("pages", NBTList);
+
+ stack.setTagCompound(NBT);
+
+ String logMessage = String.format(
+ "GT++_Mod: Added Book to Book++ List - Mapping: '%s' - Name: '%s' - Author: '%s'",
+ mapping,
+ title,
+ author);
+ GT_Log.out.println(logMessage);
+
+ NBTUtils.createIntegerTagCompound(stack, "stats", "mMeta", ID);
+ CORE.sBookList.put(mapping, stack);
+
+ Logger.INFO(String.format("Creating book: %s by %s. Using Meta %d.", title, author, ID));
+
+ return GT_Utility.copy(stack);
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/data/AES.java b/gtpp/src/main/java/gtPlusPlus/core/util/data/AES.java
new file mode 100644
index 0000000000..85f20a3367
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/data/AES.java
@@ -0,0 +1,135 @@
+package gtPlusPlus.core.util.data;
+
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.Base64;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+
+public class AES {
+
+ private final String secret;
+
+ private final SecretKeySpec secretKey;
+
+ private final byte[] key;
+
+ public AES() {
+
+ this("Darkness In Their Hearts");
+ }
+
+ public AES(String aSecret) {
+
+ secret = aSecret;
+
+ key = getBytes(getHashedString(secret));
+
+ secretKey = generateKey(key);
+ }
+
+ private static String getHashedString(String aString) {
+
+ return toHexString(getSHA(aString));
+ }
+
+ private static byte[] getSHA(String input) {
+
+ MessageDigest md;
+
+ try {
+
+ md = MessageDigest.getInstance("SHA-256");
+
+ return md.digest(input.getBytes(StandardCharsets.UTF_8));
+
+ } catch (NoSuchAlgorithmException e) {
+
+ e.printStackTrace();
+ }
+
+ return new byte[] {};
+ }
+
+ private static String toHexString(byte[] hash) {
+
+ BigInteger number = new BigInteger(1, hash);
+
+ StringBuilder hexString = new StringBuilder(number.toString(16));
+
+ while (hexString.length() < 32) {
+
+ hexString.insert(0, '0');
+ }
+
+ return hexString.toString();
+ }
+
+ private byte[] getBytes(String aKey) {
+
+ byte[] aKeyData;
+
+ MessageDigest sha;
+
+ try {
+
+ sha = MessageDigest.getInstance("SHA-256");
+
+ return sha.digest(aKey.getBytes(StandardCharsets.UTF_8));
+
+ } catch (NoSuchAlgorithmException e1) {
+
+ e1.printStackTrace();
+
+ try {
+
+ aKeyData = aKey.getBytes("UTF-8");
+
+ sha = MessageDigest.getInstance("SHA-1");
+
+ aKeyData = sha.digest(key);
+
+ aKeyData = Arrays.copyOf(key, 16);
+
+ return aKeyData;
+
+ } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
+
+ e.printStackTrace();
+
+ }
+ }
+
+ return new byte[] {};
+ }
+
+ private SecretKeySpec generateKey(byte[] aKey) {
+
+ return new SecretKeySpec(aKey, "AES");
+ }
+
+ public String decode(String strToDecrypt) {
+
+ try {
+
+ Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
+
+ cipher.init(Cipher.DECRYPT_MODE, secretKey);
+
+ return new String(
+ cipher.doFinal(
+ Base64.getDecoder()
+ .decode(strToDecrypt)));
+
+ } catch (Exception ignored) {
+
+ }
+
+ return null;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/data/ArrayUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/data/ArrayUtils.java
new file mode 100644
index 0000000000..d5ab990917
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/data/ArrayUtils.java
@@ -0,0 +1,44 @@
+package gtPlusPlus.core.util.data;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+
+public class ArrayUtils {
+
+ public static <V> V[] insertElementAtIndex(V[] aArray, int aIndex, V aObjectToInsert) {
+ V[] newArray = Arrays.copyOf(aArray, aArray.length + 1);
+ for (int i = 0; i < aIndex; i++) {
+ newArray[i] = aArray[i];
+ }
+ newArray[aIndex] = aObjectToInsert;
+ for (int i = (aIndex + 1); i < newArray.length; i++) {
+ newArray[i] = aArray[i - 1];
+ }
+ return newArray;
+ }
+
+ public static Object[] removeNulls(final Object[] v) {
+ List<Object> list = new ArrayList<>(Arrays.asList(v));
+ list.removeAll(Collections.singleton((Object) null));
+ return list.toArray(new Object[list.size()]);
+ }
+
+ public static ItemStack[] removeNulls(final ItemStack[] v) {
+ List<ItemStack> list = new ArrayList<>(Arrays.asList(v));
+ list.removeAll(Collections.singleton((ItemStack) null));
+ return list.toArray(new ItemStack[list.size()]);
+ }
+
+ public static String toString(Object[] aArray, String string) {
+ return org.apache.commons.lang3.ArrayUtils.toString(aArray, string);
+ }
+
+ public static String toString(Object[] aArray) {
+ return org.apache.commons.lang3.ArrayUtils.toString(aArray);
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/data/FileUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/data/FileUtils.java
new file mode 100644
index 0000000000..b2e5d04375
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/data/FileUtils.java
@@ -0,0 +1,112 @@
+package gtPlusPlus.core.util.data;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.ArrayList;
+import java.util.List;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.Utils;
+
+public class FileUtils {
+
+ private static final Charset utf8 = StandardCharsets.UTF_8;
+
+ public static boolean doesFileExist(File f) {
+ if (f != null && f.exists() && !f.isDirectory()) {
+ return true;
+ }
+ return false;
+ }
+
+ public static File createFile(String path, String filename, String extension) {
+ File file = new File(Utils.getMcDir(), path + filename + extension);
+ return createFile(file);
+ }
+
+ public static File createFile(File aFile) {
+ boolean blnCreated = false;
+ Logger.INFO("Trying to use path " + aFile.getPath());
+ try {
+ Logger.INFO("Trying to use path " + aFile.getCanonicalPath());
+ Logger.INFO("Trying to use absolute path " + aFile.getAbsolutePath());
+ blnCreated = aFile.createNewFile();
+ } catch (IOException ioe) {
+ Logger.INFO("Error while creating a new empty file :" + ioe);
+ return null;
+ }
+ return blnCreated ? aFile : null;
+ }
+
+ public static File getFile(String filename, String extension) {
+ return getFile("", filename, extension);
+ }
+
+ public static File getFile(String path, String filename, String extension) {
+ if (path == null || path.length() <= 0) {
+ path = "";
+ } else {
+ path = path + "/";
+ }
+ if (filename == null || filename.length() <= 0) {
+ return null;
+ }
+ if (extension == null || extension.length() <= 0) {
+ extension = ".txt";
+ } else {
+ extension = "." + extension;
+ }
+ File file = new File(Utils.getMcDir(), path + filename + extension);
+ boolean doesExist = doesFileExist(file);
+
+ if (doesExist) {
+ Logger.INFO("Found File: " + file.getAbsolutePath());
+ return file;
+ } else {
+ Logger.INFO("Creating file, as it was not found.");
+ return createFile(path, filename, extension);
+ }
+ }
+
+ public static void appendListToFile(File file, List<String> content) {
+ try {
+ long oldSize;
+ long newSize;
+ if (doesFileExist(file)) {
+ Path p = Paths.get(file.getPath());
+ if (p != null && Files.isWritable(p)) {
+ oldSize = Files.size(p);
+ try {
+ Files.write(p, content, utf8, StandardOpenOption.APPEND);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ newSize = Files.size(p);
+ }
+ }
+ } catch (IOException ignored) {}
+ }
+
+ /**
+ * Reads the contents of a file line by line to a List of Strings using the default encoding for the VM. The file is
+ * always closed.
+ *
+ * @param file the file to read, must not be {@code null}
+ * @return the list of Strings representing each line in the file, never {@code null}
+ * @throws IOException in case of an I/O error
+ * @since 1.3
+ */
+ public static List<String> readLines(File file) {
+ try {
+ return org.apache.commons.io.FileUtils.readLines(file, utf8);
+ } catch (IOException e) {
+ return new ArrayList<>();
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/data/LocaleUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/data/LocaleUtils.java
new file mode 100644
index 0000000000..f72e5c6a51
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/data/LocaleUtils.java
@@ -0,0 +1,86 @@
+package gtPlusPlus.core.util.data;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GTPlusPlusEverglades;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.Loader;
+import cpw.mods.fml.common.ModContainer;
+import cpw.mods.fml.common.registry.GameData;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class LocaleUtils {
+
+ public static void generateFakeLocaleFile() {
+ for (ModContainer modcontainer : Loader.instance()
+ .getModList()) {
+ if (modcontainer.getModId()
+ .toLowerCase()
+ .equals(GTPlusPlus.ID)) {
+ String S = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
+ writeToFile(S);
+ dumpItemsAndBlocksForModContainer(modcontainer);
+ }
+ }
+ }
+
+ public static void dumpItemsAndBlocksForModContainer(ModContainer mod) {
+ writeToFile("Dumping Items from " + mod.getModId() + ".");
+ for (Object C : GameData.getItemRegistry()) {
+
+ try {
+
+ if (C != null) {
+ if (C instanceof Item R) {
+ ItemStack IS = ItemUtils.getSimpleStack(R);
+ String modid = ItemUtils.getModId(IS);
+ if (modid.equals(GTPlusPlus.ID) || modid.equals(GTPlusPlusEverglades.ID)) {
+ String S = "[" + modid + "] " + IS.getUnlocalizedName() + ".name=";
+ writeToFile(S);
+ }
+ }
+ }
+
+ } catch (Throwable ignored) {}
+ }
+ writeToFile("Dumping Blocks from " + mod.getModId() + ".");
+ for (Object B : GameData.getBlockRegistry()) {
+
+ try {
+
+ if (B != null) {
+ if (B instanceof Block R) {
+ ItemStack IS = ItemUtils.getSimpleStack(R);
+ String modid = ItemUtils.getModId(IS);
+ if (modid.equals(GTPlusPlus.ID) || modid.equals(GTPlusPlusEverglades.ID)) {
+ String S = "[" + modid + "] " + IS.getUnlocalizedName() + ".name=";
+ writeToFile(S);
+ }
+ }
+ }
+
+ } catch (Throwable ignored) {}
+ }
+
+ }
+
+ public static void writeToFile(String S) {
+ try {
+ File F = new File(Utils.getMcDir(), "config/GTplusplus/en_US.lang");
+ BufferedWriter writer;
+ writer = new BufferedWriter(new FileWriter(F, true));
+ writer.write(S);
+ writer.newLine();
+ writer.close();
+ } catch (IOException ignored) {}
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/data/StringUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/data/StringUtils.java
new file mode 100644
index 0000000000..77efadbc9a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/data/StringUtils.java
@@ -0,0 +1,177 @@
+package gtPlusPlus.core.util.data;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.Utils;
+
+public class StringUtils {
+
+ public static String superscript(String str) {
+ str = str.replaceAll("0", "\u2070");
+ str = str.replaceAll("1", "\u00B9");
+ str = str.replaceAll("2", "\u00B2");
+ str = str.replaceAll("3", "\u00B3");
+ str = str.replaceAll("4", "\u2074");
+ str = str.replaceAll("5", "\u2075");
+ str = str.replaceAll("6", "\u2076");
+ str = str.replaceAll("7", "\u2077");
+ str = str.replaceAll("8", "\u2078");
+ str = str.replaceAll("9", "\u2079");
+ return str;
+ }
+
+ public static String subscript(String str) {
+ str = str.replaceAll("0", "\u2080");
+ str = str.replaceAll("1", "\u2081");
+ str = str.replaceAll("2", "\u2082");
+ str = str.replaceAll("3", "\u2083");
+ str = str.replaceAll("4", "\u2084");
+ str = str.replaceAll("5", "\u2085");
+ str = str.replaceAll("6", "\u2086");
+ str = str.replaceAll("7", "\u2087");
+ str = str.replaceAll("8", "\u2088");
+ str = str.replaceAll("9", "\u2089");
+ return str;
+ }
+
+ public static boolean containsSuperOrSubScript(final String s) {
+ if (s.contains(StringUtils.superscript("0"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("1"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("2"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("3"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("4"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("5"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("6"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("7"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("8"))) {
+ return true;
+ } else if (s.contains(StringUtils.superscript("9"))) {
+ return true;
+ }
+ if (s.contains(StringUtils.subscript("0"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("1"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("2"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("3"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("4"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("5"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("6"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("7"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("8"))) {
+ return true;
+ } else if (s.contains(StringUtils.subscript("9"))) {
+ return true;
+ }
+ return false;
+ }
+
+ public static String firstLetterCaps(String data) {
+ String firstLetter = data.substring(0, 1)
+ .toUpperCase();
+ String restLetters = data.substring(1)
+ .toLowerCase();
+ return firstLetter + restLetters;
+ }
+
+ public static <V> String getDataStringFromArray(V[] parameterTypes) {
+ if (parameterTypes == null || parameterTypes.length == 0) {
+ return "empty/null";
+ } else {
+ StringBuilder aData = new StringBuilder();
+ for (V y : parameterTypes) {
+ if (y != null) {
+ aData.append(", ")
+ .append(y);
+ }
+ }
+ return aData.toString();
+ }
+ }
+
+ /**
+ * Is this a special regex character for delimination? (.$|()[]{}^?*+\\)
+ *
+ * @param aChar - The char to test
+ * @return - Is this a special character?
+ */
+ public static boolean isSpecialCharacter(char aChar) {
+ return aChar == '"' || aChar == '.'
+ || aChar == '$'
+ || aChar == '|'
+ || aChar == '('
+ || aChar == ')'
+ || aChar == '['
+ || aChar == ']'
+ || aChar == '{'
+ || aChar == '}'
+ || aChar == '^'
+ || aChar == '?'
+ || aChar == '*'
+ || aChar == '+'
+ || aChar == '\\';
+ }
+
+ public static boolean isEscaped(String aString) {
+ return aString.charAt(0) == '\\';
+ }
+
+ public static String splitAndUppercase(String aInput, String aDelim) {
+
+ if (!isEscaped(aDelim)) {
+ boolean isSpecial = false;
+ for (int o = 0; o < aInput.length(); o++) {
+ if (isSpecialCharacter(aInput.charAt(o))) {
+ isSpecial = true;
+ }
+ }
+ if (isSpecial) {
+ aDelim = "\\" + aDelim;
+ }
+ }
+
+ Logger.INFO("Splitting " + aInput);
+ String[] aSplit = aInput.split(aDelim);
+ Logger.INFO("Split into " + aSplit == null ? "" + 0 : aSplit.length + " parts.");
+ if (aSplit == null || aSplit.length == 0) {
+ return aInput;
+ } else {
+ AutoMap<String> aTemp = new AutoMap<>();
+ for (String s : aSplit) {
+ Logger.INFO("Found: " + s);
+ s = s.replace(".", "");
+ s = Utils.sanitizeString(s);
+ s = firstLetterCaps(s);
+ Logger.INFO("Formatted & Captilized: " + s);
+ aTemp.put(s);
+ }
+ Logger.INFO("Rebuilding");
+ StringBuilder aReturn = new StringBuilder();
+ for (String s : aTemp) {
+ aReturn.append(s);
+ Logger.INFO("Step: " + aReturn);
+ }
+ return aReturn.toString();
+ }
+ }
+
+ public static long uppercaseCount(String aString) {
+ return aString.chars()
+ .filter(Character::isUpperCase)
+ .count();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/math/MathUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/math/MathUtils.java
new file mode 100644
index 0000000000..ac3ef2e947
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/math/MathUtils.java
@@ -0,0 +1,528 @@
+package gtPlusPlus.core.util.math;
+
+import java.text.NumberFormat;
+import java.util.Map;
+import java.util.Random;
+
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.Utils;
+
+public class MathUtils {
+
+ static final Random rand = CORE.RANDOM;
+
+ /** Formats a number with group separator and at most 2 fraction digits. */
+ private static final NumberFormat sNumberFormat = NumberFormat.getInstance();
+
+ static {
+ sNumberFormat.setMaximumFractionDigits(2);
+ }
+
+ /**
+ * Returns a psuedo-random number between min and max, inclusive. The difference between min and max can be at most
+ * Integer.MAX_VALUE - 1.
+ *
+ * @param min Minimim value
+ * @param max Maximim value. Must be greater than min.
+ * @return Integer between min and max, inclusive.
+ * @see java.util.Random#nextInt(int)
+ */
+ public static int randInt(final int min, final int max) {
+ // nextInt is normally exclusive of the top value,
+ // so add 1 to make it inclusive
+ return rand.nextInt((max - min) + 1) + min;
+ }
+
+ /**
+ * Returns a psuedo-random number between min and max, inclusive. The difference between min and max can be at most
+ * Long.MAX_VALUE - 1.
+ *
+ * @param min Minimim value
+ * @param max Maximim value. Must be greater than min.
+ * @return Long between min and max, inclusive.
+ * @see java.util.Random#nextLong(long)
+ */
+ public static long randLong(final long min, final long max) {
+ // nextInt is normally exclusive of the top value,
+ // so add 1 to make it inclusive
+ return MathUtils.nextLong(rand, (max - min) + 1) + min;
+ }
+
+ private static long nextLong(final Random rng, final long n) {
+ // error checking and 2^x checking removed for simplicity.
+ long bits, val;
+ do {
+ bits = (rng.nextLong() << 1) >>> 1;
+ val = bits % n;
+ } while (((bits - val) + (n - 1)) < 0L);
+ return val;
+ }
+
+ /**
+ * Returns a psuedo-random number between min and max, inclusive. The difference between min and max can be at most
+ * Double.MAX_VALUE - 1.
+ *
+ * @param min Minimim value
+ * @param max Maximim value. Must be greater than min.
+ * @return Double between min and max, inclusive.
+ * @see java.util.Random#nextDouble(double)
+ */
+ public static double randDouble(final double min, final double max) {
+ // nextInt is normally exclusive of the top value,
+ // so add 1 to make it inclusive
+ return MathUtils.nextDouble(rand, (max - min) + 1) + min;
+ }
+
+ private static double nextDouble(final Random rng, final double n) {
+ // error checking and 2^x checking removed for simplicity.
+ double bits, val;
+ do {
+ bits = (rng.nextLong() << 1) >>> 1;
+ val = bits % n;
+ } while (((bits - val) + (n - 1)) < 0L);
+ return val;
+ }
+
+ /**
+ * Returns a psuedo-random number between min and max, inclusive. The difference between min and max can be at most
+ * Float.MAX_VALUE - 1.
+ *
+ * @param min Minimim value
+ * @param max Maximim value. Must be greater than min.
+ * @return Float between min and max, inclusive.
+ * @see java.util.Random#nextFloat(float)
+ */
+ public static float randFloat(final float min, final float max) {
+ // nextInt is normally exclusive of the top value,
+ // so add 1 to make it inclusive
+ return MathUtils.nextFloat(rand, (max - min) + 1) + min;
+ }
+
+ private static float nextFloat(final Random rng, final float n) {
+ // error checking and 2^x checking removed for simplicity.
+ float bits, val;
+ do {
+ bits = (rng.nextLong() << 1) >>> 1;
+ val = bits % n;
+ } while (((bits - val) + (n - 1)) < 0L);
+ return val;
+ }
+
+ /**
+ * Returns a percentage. The returned number is the % of X in Y. Supports Doubles.
+ *
+ * @param current Current value.
+ * @param max Maximim value. Must be greater than min.
+ * @return double between min and max, inclusive.
+ */
+ public static double findPercentage(final double current, final double max) {
+ return Math.round(((current / max) * 100) * 100.00) / 100.00;
+ }
+
+ /**
+ * Returns a percentage. The returned number is the % of X in Y. Supports Floats.
+ *
+ * @param current Current value.
+ * @param max Maximim value. Must be greater than min.
+ * @return double between min and max, inclusive.
+ */
+ public static float findPercentage(final float current, final float max) {
+ return (float) (Math.round(((current / max) * 100) * 100.00) / 100.00);
+ }
+
+ public static int findPercentageOfInt(long input, float percentage) {
+ return (int) (input * (percentage / 100.0f));
+ }
+
+ // Smooth Rounding Function
+ /**
+ * Returns a double. The returned number is d rounded to the nearest d.01. Supports Doubles.
+ *
+ * @return double Rounded value.
+ */
+ public static double decimalRounding(final double d) {
+ return Math.round(d * 2) / 2.0;
+ }
+
+ // Smooth Rounding Function (Nearest 5)
+ /**
+ * Returns a double. The returned number is d rounded to the nearest d.5. Supports Doubles.
+ *
+ * @return double Rounded value.
+ */
+ public static double decimalRoundingToWholes(final double d) {
+ return 5 * (Math.round(d / 5));
+ }
+
+ // Smooth Rounding Function
+ /**
+ * Returns a integer. The returned number is d rounded to the nearest flat integer. Supports Doubles as input.
+ *
+ * @return integer Rounded value.
+ */
+ public static int roundToClosestInt(final double d) {
+ return (int) (Math.round(d * 2) / 2.0);
+ }
+
+ // Smooth Rounding Function
+ /**
+ * Returns a long. The returned number is d rounded to the nearest flat long. Supports Doubles as input.
+ *
+ * @return long Rounded value.
+ */
+ public static long roundToClosestLong(final double d) {
+ return (long) (Math.round(d * 2) / 2.0);
+ }
+
+ /**
+ * Returns a boolean. The returned boolean is based on the odd/eveness of the input. Supports ints.
+ *
+ * @param x Value A.
+ * @return boolean Whether or not it divides evenly.
+ */
+ public static boolean isNumberEven(final long x) {
+ if ((x % 2) == 0) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns an int. The returned number is the value on i + 273.15F. Supports ints.
+ *
+ * @param i Temp in Celcius.
+ * @return int The celcius temp returned as Kelvin, rounded to the readest whole.
+ */
+ public static float celsiusToKelvin(final int i) {
+ final double f = i + 273.15F;
+ return (int) decimalRoundingToWholes(f);
+ }
+
+ /**
+ * Returns a random hex value. The returned value is between 000000-ffffff.
+ *
+ * @return hexInteger between min and max, inclusive.
+ */
+ public static int generateSingularRandomHexValue() {
+ String temp;
+ final int randomInt = randInt(1, 5);
+ final Map<Integer, String> colours = Utils.hexColourGeneratorRandom(5);
+
+ if ((colours.get(randomInt) != null) && (colours.size() > 0)) {
+ temp = colours.get(randomInt);
+ } else {
+ temp = "0F0F0F";
+ }
+
+ Logger.WARNING("Operating with " + temp);
+ temp = Utils.appenedHexNotationToString(String.valueOf(temp));
+ return Integer.decode(temp);
+ }
+
+ public static long[] simplifyNumbersToSmallestForm(final long[] inputArray) {
+ final long GCD = gcd(inputArray);
+ final long[] outputArray = new long[inputArray.length];
+ for (int i = 0; i < inputArray.length; i++) {
+ if (GCD != 0) {
+ outputArray[i] = (inputArray[i] / GCD);
+ } else {
+ outputArray[i] = inputArray[i];
+ }
+ }
+ if (outputArray.length > 0) {
+ return outputArray;
+ }
+ return new long[] {};
+ }
+
+ private static long gcd(long a, long b) {
+ while (b > 0) {
+ final long temp = b;
+ b = a % b; // % is remainder
+ a = temp;
+ }
+ return a;
+ }
+
+ private static long gcd(final long[] input) {
+ long result = input[0];
+ for (int i = 1; i < input.length; i++) {
+ result = gcd(result, input[i]);
+ }
+ return result;
+ }
+
+ public static int getRgbAsHex(final short[] RGBA) {
+ final int returnValue = Utils.rgbtoHexValue(RGBA[0], RGBA[1], RGBA[2]);
+ return (returnValue == 0) ? 0 : returnValue;
+ }
+
+ public static byte safeByte(long number) {
+ return number > Byte.MAX_VALUE ? Byte.MAX_VALUE : (byte) number;
+ }
+
+ public static short safeShort(long number) {
+ return number > Short.MAX_VALUE ? Short.MAX_VALUE : (short) number;
+ }
+
+ public static int safeInt(long number, int margin) {
+ return number > Integer.MAX_VALUE - margin ? Integer.MAX_VALUE - margin : (int) number;
+ }
+
+ public static int safeInt(long number) {
+ return number > GT_Values.V[GT_Values.V.length - 1] ? safeInt(GT_Values.V[GT_Values.V.length - 1], 1)
+ : number < Integer.MIN_VALUE ? Integer.MIN_VALUE : (int) number;
+ }
+
+ public static int getRandomFromArray(int[] mValues) {
+ int[] mLargeChanceArray = new int[(mValues.length - 1) * 1000];
+ int mValueSelection;
+ for (int g = 0; g < mLargeChanceArray.length; g++) {
+ mValueSelection = randInt(0, mValues.length - 1);
+ mLargeChanceArray[g] = mValues[mValueSelection];
+ }
+ return mLargeChanceArray[randInt(0, mLargeChanceArray.length - 1)];
+ }
+
+ /*
+ * Averages
+ */
+
+ public static byte getByteAverage(AutoMap<Byte> aDataSet) {
+ byte[] aNewSet = new byte[aDataSet.size()];
+ for (int u = 0; u < aDataSet.size(); u++) {
+ byte b = getSafeByte(aDataSet.get(u));
+ aNewSet[u] = b;
+ }
+ return getByteAverage(aNewSet);
+ }
+
+ public static short getShortAverage(AutoMap<Short> aDataSet) {
+ short[] aNewSet = new short[aDataSet.size()];
+ for (int u = 0; u < aDataSet.size(); u++) {
+ short b = getSafeShort(aDataSet.get(u));
+ aNewSet[u] = b;
+ }
+ return getShortAverage(aNewSet);
+ }
+
+ public static int getIntAverage(AutoMap<Integer> aDataSet) {
+ int[] aNewSet = new int[aDataSet.size()];
+ for (int u = 0; u < aDataSet.size(); u++) {
+ int b = getSafeInt(aDataSet.get(u));
+ aNewSet[u] = b;
+ }
+ return getIntAverage(aNewSet);
+ }
+
+ public static long getLongAverage(AutoMap<Long> aDataSet) {
+ long[] aNewSet = new long[aDataSet.size()];
+ for (int u = 0; u < aDataSet.size(); u++) {
+ long b = getSafeLong(aDataSet.get(u));
+ aNewSet[u] = b;
+ }
+ return getLongAverage(aNewSet);
+ }
+
+ public static byte getByteAverage(byte[] aDataSet) {
+ if (aDataSet.length == 0) {
+ return 0;
+ }
+ int divisor = aDataSet.length;
+ byte total = 0;
+ for (byte i : aDataSet) {
+ total += i;
+ }
+ byte result = safeByte(total / divisor);
+ return result;
+ }
+
+ public static short getShortAverage(short[] aDataSet) {
+ if (aDataSet.length == 0) {
+ return 0;
+ }
+ int divisor = aDataSet.length;
+ Logger.WARNING("Calculating Average Short. Divisor: " + divisor);
+ short total = 0;
+ for (short i : aDataSet) {
+ Logger.WARNING("Adding " + i);
+ total += i;
+ }
+ short result = safeShort((total / divisor));
+ Logger.WARNING("Average: " + result);
+ return result;
+ }
+
+ public static int getIntAverage(int[] aDataSet) {
+ if (aDataSet.length == 0) {
+ return 0;
+ }
+ int divisor = aDataSet.length;
+ int total = 0;
+ for (int i : aDataSet) {
+ total += i;
+ }
+ int result = safeInt(total / divisor);
+ return result;
+ }
+
+ public static long getLongAverage(long[] aDataSet) {
+ if (aDataSet.length == 0) {
+ return 0;
+ }
+ int divisor = aDataSet.length;
+ long total = 0;
+ for (long i : aDataSet) {
+ total += i;
+ }
+ return (total / divisor);
+ }
+
+ public static int howManyPlaces(int aValueForGen) {
+ if (aValueForGen < 0) {
+ aValueForGen = makeNegative(aValueForGen);
+ }
+ String a = String.valueOf(aValueForGen);
+ return a.length();
+ }
+
+ /**
+ * Inverts the value, making Positives into Negatives and vice versa.
+ *
+ * @param aPositive - An int value, either positive or negative.
+ * @return - Inverted int Value.
+ */
+ public static int makeNegative(int aPositive) {
+ if (aPositive > 0) {
+ return -aPositive;
+ } else if (aPositive < 0) {
+ return +aPositive;
+ } else {
+ return 0;
+ }
+ }
+
+ public static <V> V safeCast(Object aNumberType) {
+ long a1;
+ double a2;
+ a1 = Long.parseLong(aNumberType.toString());
+ a2 = Double.parseDouble(aNumberType.toString());
+
+ if ((aNumberType.getClass() == byte.class) || (aNumberType instanceof Byte)) {
+ if (a1 >= Byte.MIN_VALUE && a1 <= Byte.MAX_VALUE) {
+ String s = String.valueOf(a1);
+ Byte s1 = Byte.valueOf(s);
+ return (V) s1;
+ }
+ } else if ((aNumberType.getClass() == short.class) || (aNumberType instanceof Short)) {
+ if (a1 >= Short.MIN_VALUE && a1 <= Short.MAX_VALUE) {
+ String s = String.valueOf(a1);
+ Short s1 = Short.valueOf(s);
+ return (V) s1;
+ }
+ } else if ((aNumberType.getClass() == int.class) || (aNumberType instanceof Integer)) {
+ if (a1 >= Integer.MIN_VALUE && a1 <= Integer.MAX_VALUE) {
+ String s = String.valueOf(a1);
+ Integer s1 = Integer.valueOf(s);
+ return (V) s1;
+ }
+ } else if ((aNumberType.getClass() == long.class) || (aNumberType instanceof Long)) {
+ if (a1 >= Long.MIN_VALUE && a1 <= Long.MAX_VALUE) {
+ String s = String.valueOf(a1);
+ Long s1 = Long.valueOf(s);
+ return (V) s1;
+ }
+ } else if ((aNumberType.getClass() == float.class) || (aNumberType instanceof Float)) {
+ if (a2 >= Float.MIN_VALUE && a2 <= Float.MAX_VALUE) {
+ String s = String.valueOf(a1);
+ Float s1 = Float.valueOf(s);
+ return (V) s1;
+ }
+ } else if ((aNumberType.getClass() == double.class) || (aNumberType instanceof Double)) {
+ if (a2 >= Double.MIN_VALUE && a2 <= Double.MAX_VALUE) {
+ String s = String.valueOf(a1);
+ Double s1 = Double.valueOf(s);
+ return (V) s1;
+ }
+ }
+
+ Integer o = 0;
+ return (V) o;
+ }
+
+ public static byte getSafeByte(Byte b) {
+ Byte a = safeCast(b);
+ return a;
+ }
+
+ public static short getSafeShort(Short b) {
+ Short a = safeCast(b);
+ return a;
+ }
+
+ public static int getSafeInt(Integer b) {
+ Integer a = safeCast(b);
+ return a;
+ }
+
+ public static long getSafeLong(Long b) {
+ Long a = safeCast(b);
+ return a;
+ }
+
+ public static int safeCast_LongToInt(long o) {
+ if (o > Integer.MAX_VALUE) {
+ return Integer.MAX_VALUE;
+ } else {
+ int i = (int) o;
+ return i;
+ }
+ }
+
+ /**
+ * Balances a number within a range.
+ *
+ * @param aInput - The number to balance
+ * @param aMin - The minimum bounds
+ * @param aMax - The maximum bounds
+ * @return - An Integer which will be between the bounds, or a boundary value.
+ */
+ public static int balance(int aInput, int aMin, int aMax) {
+ return Math.max(Math.min(aInput, aMax), aMin);
+ }
+
+ /**
+ * Returns the smaller of two {@code Number}s. That is, the result the argument closer to the value of
+ * {@link Long#MIN_VALUE}. If the arguments have the same value, the result is that same value.
+ *
+ * @param a an argument.
+ * @param b another argument.
+ * @return the smaller of {@code a} and {@code b}.
+ */
+ public static Number min(Number a, Number b) {
+ return (a.longValue() <= b.longValue()) ? a : b;
+ }
+
+ /**
+ * Returns the greater of two {@code Number}s. That is, the result is the argument closer to the value of
+ * {@link Long#MAX_VALUE}. If the arguments have the same value, the result is that same value.
+ *
+ * @param a an argument.
+ * @param b another argument.
+ * @return the larger of {@code a} and {@code b}.
+ */
+ public static Number max(Number a, Number b) {
+ return (a.longValue() >= b.longValue()) ? a : b;
+ }
+
+ public static String formatNumbers(long aNumber) {
+ return sNumberFormat.format(aNumber);
+ }
+
+ public static String formatNumbers(double aNumber) {
+ return sNumberFormat.format(aNumber);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/EntityUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/EntityUtils.java
new file mode 100644
index 0000000000..87bd0e60c6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/EntityUtils.java
@@ -0,0 +1,146 @@
+package gtPlusPlus.core.util.minecraft;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.EnumCreatureAttribute;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.handler.events.EntityDeathHandler;
+import ic2.core.IC2Potion;
+import ic2.core.item.armor.ItemArmorHazmat;
+
+public class EntityUtils {
+
+ public static void setEntityOnFire(final Entity aEntity, final int length) {
+ if (!isEntityImmuneToFire(aEntity)) {
+ aEntity.setFire(length);
+ }
+ }
+
+ public static boolean isEntityImmuneToFire(Entity aEntity) {
+ return aEntity.isImmuneToFire();
+ }
+
+ public static BlockPos findBlockPosUnderEntity(final Entity parEntity) {
+ final int blockX = MathHelper.floor_double(parEntity.posX);
+ final int blockY = MathHelper.floor_double(parEntity.boundingBox.minY) - 1;
+ final int blockZ = MathHelper.floor_double(parEntity.posZ);
+ return new BlockPos(blockX, blockY, blockZ, parEntity.worldObj);
+ }
+
+ public static BlockPos findBlockPosOfEntity(final Entity parEntity) {
+ final int blockX = MathHelper.floor_double(parEntity.posX);
+ final int blockY = MathHelper.floor_double(parEntity.boundingBox.minY);
+ final int blockZ = MathHelper.floor_double(parEntity.posZ);
+ return new BlockPos(blockX, blockY, blockZ, parEntity.worldObj);
+ }
+
+ public static void applyRadiationDamageToEntity(final int stackSize, final int radiationLevel, final World world,
+ final Entity entityHolding) {
+ if (!world.isRemote) {
+ if ((radiationLevel > 0) && (entityHolding instanceof final EntityLivingBase entityLiving)) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ if (!ItemArmorHazmat.hasCompleteHazmat(entityLiving)
+ && !GT_Utility.isWearingFullRadioHazmat(entityLiving)) {
+ if (entityLiving.getActivePotionEffect(IC2Potion.radiation) != null) {
+ entityLiving.getActivePotionEffect(IC2Potion.radiation);
+ }
+ applyRadioactivity(entityLiving, radiationLevel, stackSize);
+ }
+ }
+ }
+ }
+ }
+
+ public static void applyRadioactivity(EntityLivingBase aEntity, int aLevel, int aAmountOfItems) {
+ if (aLevel > 0 && aEntity != null
+ && aEntity.getCreatureAttribute() != EnumCreatureAttribute.UNDEAD
+ && aEntity.getCreatureAttribute() != EnumCreatureAttribute.ARTHROPOD
+ && !ItemArmorHazmat.hasCompleteHazmat(aEntity)) {
+ PotionEffect tEffect;
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.moveSlowdown.id,
+ aLevel * 140 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.moveSlowdown)) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.digSlowdown.id,
+ aLevel * 150 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.digSlowdown)) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.confusion.id,
+ aLevel * 130 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.confusion)) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.weakness.id,
+ aLevel * 150 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.weakness)) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.hunger.id,
+ aLevel * 130 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.hunger)) == null ? 0 : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ IC2Potion.radiation.id,
+ aLevel * 180 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.potionTypes[24])) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ }
+ }
+
+ public static void applyHeatDamageToEntity(final int heatLevel, final World world, final Entity entityHolding) {
+ if (!world.isRemote) {
+ if ((heatLevel > 0) && (entityHolding instanceof final EntityLivingBase entityLiving)) {
+ if (!((EntityPlayer) entityHolding).capabilities.isCreativeMode) {
+ if (!GT_Utility.isWearingFullHeatHazmat(entityLiving)) {
+ GT_Utility.applyHeatDamage(entityLiving, heatLevel);
+ }
+ }
+ }
+ }
+ }
+
+ public static void doDamage(Entity entity, DamageSource dmg, int i) {
+ entity.attackEntityFrom(dmg, i);
+ }
+
+ /**
+ * Provides the ability to provide custom drops upon the death of EntityLivingBase objects.
+ *
+ * @param aMobClass - The Base Class you want to drop this item.
+ * @param aStack - The ItemStack, stack size is not respected.
+ * @param aMaxAmount - The maximum size of the ItemStack which drops.
+ * @param aChance - Chance out of 10000, where 100 is 1%. (1 = 0.01% - this is ok)
+ */
+ public static void registerDropsForMob(Class<?> aMobClass, ItemStack aStack, int aMaxAmount, int aChance) {
+ EntityDeathHandler.registerDropsForMob(aMobClass, aStack, aMaxAmount, aChance);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/FluidUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/FluidUtils.java
new file mode 100644
index 0000000000..2b6e96541d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/FluidUtils.java
@@ -0,0 +1,667 @@
+package gtPlusPlus.core.util.minecraft;
+
+import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import java.util.HashMap;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.FluidGT6;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.item.base.cell.BaseItemPlasmaCell;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+
+public class FluidUtils {
+
+ private static HashMap<String, Fluid> sFluidCache = new HashMap<>();
+
+ public static FluidStack getWater(final int amount) {
+ return FluidUtils.getFluidStack("water", amount);
+ }
+
+ public static FluidStack getDistilledWater(final int amount) {
+ return FluidUtils.getFluidStack("ic2distilledwater", amount);
+ }
+
+ public static FluidStack getHotWater(final int amount) {
+ return FluidUtils.getFluidStack("ic2hotwater", amount);
+ }
+
+ public static FluidStack getLava(final int amount) {
+ return FluidUtils.getFluidStack("lava", amount);
+ }
+
+ public static FluidStack getPahoehoeLava(final int amount) {
+ return FluidUtils.getFluidStack("ic2pahoehoelava", amount);
+ }
+
+ public static FluidStack getSteam(final int amount) {
+ return FluidUtils.getFluidStack("steam", amount);
+ }
+
+ public static FluidStack getSuperHeatedSteam(final int amount) {
+ return FluidUtils.getFluidStack("ic2superheatedsteam", amount);
+ }
+
+ public static FluidStack getHydrofluoricAcid(int amount) {
+ return FluidUtils.getFluidStack("hydrofluoricacid", amount);
+ }
+
+ public static Fluid sGregtechHydrofluoricAcid = null;
+
+ public static FluidStack getHydrofluoricAcidGT(int amount) {
+ if (sGregtechHydrofluoricAcid == null) {
+ FluidStack aGTHF = FluidUtils.getFluidStack("hydrofluoricacid_gt5u", 1);
+ sGregtechHydrofluoricAcid = aGTHF != null ? aGTHF.getFluid() : getHydrofluoricAcid(1).getFluid();
+ }
+ return FluidUtils.getFluidStack(sGregtechHydrofluoricAcid, amount);
+ }
+
+ public static boolean doesHydrofluoricAcidGtExist() {
+ if (sGregtechHydrofluoricAcid == null) {
+ getHydrofluoricAcidGT(1);
+ }
+ return sGregtechHydrofluoricAcid != null && sGregtechHydrofluoricAcid != getHydrofluoricAcid(1).getFluid();
+ }
+
+ private static FluidStack createFluidStack(Fluid aFluid, int aAmount) {
+ if (aFluid != null) {
+ return new FluidStack(aFluid, aAmount);
+ }
+ return null;
+ }
+
+ public static FluidStack getFluidStack(final String aFluidName, final int aAmount) {
+ Fluid aFluid = sFluidCache.get(aFluidName);
+ if (aFluid != null) {
+ return createFluidStack(aFluid, aAmount);
+ } else {
+ Fluid aLookupFluid = FluidRegistry.getFluid(aFluidName);
+ if (aLookupFluid != null) {
+ sFluidCache.put(aFluidName, aLookupFluid);
+ return createFluidStack(aLookupFluid, aAmount);
+ }
+ }
+ return null;
+ }
+
+ public static FluidStack getFluidStack(final FluidStack aFluidStack, final int aAmount) {
+ if (aFluidStack == null) {
+ return null;
+ }
+ return new FluidStack(aFluidStack, aAmount);
+ }
+
+ public static FluidStack getFluidStack(final Fluid aFluid, final int aAmount) {
+ if (aFluid == null) {
+ return null;
+ }
+ return new FluidStack(aFluid, aAmount);
+ }
+
+ public static Fluid addGtFluid(final String aName, final String aLocalized, final GT_Materials aMaterial,
+ final int aState, final long aTemperatureK, final ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount) {
+ return addGtFluid(
+ aName,
+ aLocalized,
+ aMaterial,
+ aState,
+ aTemperatureK,
+ aFullContainer,
+ aEmptyContainer,
+ aFluidAmount,
+ true);
+ }
+
+ public static Fluid addGtFluid(final String aName, final String aLocalized, final GT_Materials aMaterial,
+ final int aState, final long aTemperatureK, final ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount, final boolean aGenerateCell) {
+ Fluid g = addGTFluid(
+ aName,
+ "fluid.autogenerated",
+ aLocalized,
+ aMaterial != null ? aMaterial.mRGBa : new short[] { 255, 255, 255, 0 },
+ aState,
+ aTemperatureK,
+ aFullContainer,
+ aEmptyContainer,
+ aFluidAmount,
+ aGenerateCell);
+ if (aMaterial != null) {
+ switch (aState) {
+ case 1 -> {
+ aMaterial.mFluid = (g);
+ }
+ case 2 -> {
+ aMaterial.mGas = (g);
+ }
+ case 3 -> {
+ aMaterial.mPlasma = (g);
+ }
+ }
+ }
+ return g;
+ }
+
+ public static Fluid addGTFluid(final String aName, final String aLocalized, final short[] aRGBa, final int aState,
+ final long aTemperatureK, final ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount, final boolean aGenerateCell) {
+ return addGTFluid(
+ "molten." + aName,
+ "molten.autogenerated",
+ aLocalized,
+ aRGBa,
+ aState,
+ aTemperatureK,
+ aFullContainer,
+ aEmptyContainer,
+ aFluidAmount,
+ aGenerateCell);
+ }
+
+ public static Fluid addGTFluidNonMolten(final String aName, final String aLocalized, final short[] aRGBa,
+ final int aState, final long aTemperatureK, final ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount, final boolean aGenerateCell) {
+ return addGTFluid(
+ "fluid." + aName,
+ "fluid.autogenerated",
+ aLocalized,
+ aRGBa,
+ aState,
+ aTemperatureK,
+ aFullContainer,
+ aEmptyContainer,
+ aFluidAmount,
+ aGenerateCell);
+ }
+
+ public static Fluid addGTFluidNoPrefix(final String aName, final String aLocalized, final short[] aRGBa,
+ final int aState, final long aTemperatureK, final ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount, final boolean aGenerateCell) {
+ return addGTFluid(
+ aName,
+ "fluid.autogenerated",
+ aLocalized,
+ aRGBa,
+ aState,
+ aTemperatureK,
+ aFullContainer,
+ aEmptyContainer,
+ aFluidAmount,
+ aGenerateCell);
+ }
+
+ // Gas
+ public static Fluid addGtGas(final String aName, final String aLocalized, final short[] aRGBa, final int aState,
+ final long aTemperatureK, final ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount, final boolean aGenerateCell) {
+ return addGTFluid(
+ aName,
+ "fluid.autogenerated",
+ aLocalized,
+ aRGBa,
+ aState,
+ aTemperatureK,
+ aFullContainer,
+ aEmptyContainer,
+ aFluidAmount,
+ aGenerateCell);
+ }
+
+ public static Fluid addGTPlasma(final Material aMaterial) {
+ if (aMaterial.getLocalizedName()
+ .toLowerCase()
+ .contains("clay")
+ || (aMaterial.getComposites()
+ .size() > 1)
+ || aMaterial.getLocalizedName()
+ .toLowerCase()
+ .contains("wrought")) {
+ return null;
+ }
+ Logger.INFO("Generating a " + aMaterial.getLocalizedName() + " Plasma Cell");
+ if (aMaterial.vComponentCount != 1) {
+ Logger.INFO("Compound made from: ");
+ for (final MaterialStack x : aMaterial.getComposites()) {
+ Logger.INFO(
+ x.getStackMaterial()
+ .getLocalizedName());
+ }
+ Logger.INFO("Material is a composite, not generating plasma.");
+ return null;
+ }
+
+ ItemStack temp = null;
+ // Generate a Cell if we need to
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellPlasma" + aMaterial.getUnlocalizedName(), 1)
+ == null) {
+ new BaseItemPlasmaCell(aMaterial);
+ temp = aMaterial.getPlasmaCell(1);
+ } else {
+ temp = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellPlasma" + aMaterial.getUnlocalizedName(), 1);
+ }
+ if (temp != null) {
+ return addGTFluid(
+ "plasma." + Utils.sanitizeString(
+ aMaterial.getLocalizedName()
+ .toLowerCase()),
+ "plasma.autogenerated",
+ aMaterial.getLocalizedName() + " Plasma",
+ aMaterial.getRGBA(),
+ 3,
+ 10000,
+ temp,
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ }
+ return null;
+ }
+
+ public static Fluid addGTFluid(String aName, final String aTexture, final String aLocalized, final short[] aRGBa,
+ final int aState, final long aTemperatureK, ItemStack aFullContainer, final ItemStack aEmptyContainer,
+ final int aFluidAmount, final boolean aGenerateFilledCell) {
+
+ String aNameOriginal = aName;
+ Logger.INFO("Generating Fluid for " + aName);
+
+ aName = Utils.sanitizeString(aName.toLowerCase());
+
+ String aLocalName = (aLocalized == null) ? aName : aLocalized;
+
+ Fluid rFluid;
+ Fluid gFluid = FluidRegistry.getFluid(aName);
+ FluidStack aCheck = FluidUtils.getWildcardFluidStack(aName.toLowerCase(), 1000);
+ boolean register = false;
+ if (aCheck != null) {
+ rFluid = aCheck.getFluid();
+ } else if (gFluid != null) {
+ rFluid = gFluid;
+ } else {
+ rFluid = new FluidGT6(aName, aTexture, (aRGBa != null) ? aRGBa : Dyes._NULL.getRGBA());
+ register = true;
+ }
+
+ if (register) {
+ GT_LanguageManager.addStringLocalization(rFluid.getUnlocalizedName(), aLocalName);
+ if (FluidRegistry.registerFluid(rFluid)) {
+ switch (aState) {
+ case 0 -> {
+ rFluid.setGaseous(false);
+ rFluid.setViscosity(10000);
+ }
+ case 1, 4 -> {
+ rFluid.setGaseous(false);
+ rFluid.setViscosity(1000);
+ }
+ case 2 -> {
+ rFluid.setGaseous(true);
+ rFluid.setDensity(-100);
+ rFluid.setViscosity(200);
+ }
+ case 3 -> {
+ rFluid.setGaseous(true);
+ rFluid.setDensity(-10000);
+ rFluid.setViscosity(10);
+ rFluid.setLuminosity(15);
+ }
+ }
+ }
+ }
+
+ String aNameNonMolten = aLocalName.contains("Molten") ? aLocalName.replace("Molten", "") : aLocalName;
+
+ if (aFullContainer == null) {
+ ItemStack oreStack = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + aLocalName, 1);
+ aFullContainer = oreStack;
+ if (aFullContainer == null) {
+ oreStack = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + aNameOriginal, 1);
+ aFullContainer = oreStack;
+ if (aFullContainer == null) {
+ oreStack = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + aNameNonMolten, 1);
+ aFullContainer = oreStack;
+ if (aFullContainer != null) {
+ Logger.INFO("Found cell for " + aNameNonMolten);
+ }
+ } else {
+ Logger.INFO("Found cell for " + aNameOriginal);
+ }
+ } else {
+ Logger.INFO("Found cell for " + aLocalName);
+ }
+ }
+
+ Item tempCell = null;
+ // Generate a Cell if we need to
+ if (aGenerateFilledCell && aFullContainer == null) {
+ String aMatName = aNameOriginal;
+ if (aMatName.contains("molten.")) {
+ aMatName = aMatName.replace("molten.", "");
+ aMatName = aMatName.substring(0, 1)
+ .toUpperCase() + aMatName.substring(1);
+ }
+ if (aMatName.contains("fluid.")) {
+ aMatName = aMatName.replace("fluid.", "");
+ aMatName = aMatName.substring(0, 1)
+ .toUpperCase() + aMatName.substring(1);
+ }
+ Logger.INFO("Generating cell for " + aMatName + ", " + aLocalName);
+ tempCell = new BaseItemComponent(aMatName, aLocalName, aRGBa);
+ aFullContainer = ItemUtils.getSimpleStack(tempCell);
+ }
+
+ if ((rFluid.getTemperature() == new Fluid("test").getTemperature()) || (rFluid.getTemperature() <= 0)) {
+ rFluid.setTemperature((int) (aTemperatureK));
+ }
+ if ((aFullContainer != null) && (aEmptyContainer != null)
+ && !FluidContainerRegistry
+ .registerFluidContainer(new FluidStack(rFluid, aFluidAmount), aFullContainer, aEmptyContainer)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Cell_Empty.get(1L))
+ .itemOutputs(aFullContainer)
+ .fluidInputs(new FluidStack(rFluid, aFluidAmount))
+ .duration(4)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+ }
+ return rFluid;
+ }
+
+ public static boolean valid(final Object aStack) {
+ return (aStack instanceof ItemStack) && (((ItemStack) aStack).getItem() != null)
+ && (((ItemStack) aStack).stackSize >= 0);
+ }
+
+ public static boolean invalid(final Object aStack) {
+ return !(aStack instanceof ItemStack) || (((ItemStack) aStack).getItem() == null)
+ || (((ItemStack) aStack).stackSize < 0);
+ }
+
+ public static boolean equal(final ItemStack aStack1, final ItemStack aStack2) {
+ return equal(aStack1, aStack2, false);
+ }
+
+ public static boolean equal(final ItemStack aStack1, final ItemStack aStack2, final boolean aIgnoreNBT) {
+ return (aStack1 != null) && (aStack2 != null) && equal_(aStack1, aStack2, aIgnoreNBT);
+ }
+
+ public static boolean equal_(final ItemStack aStack1, final ItemStack aStack2, final boolean aIgnoreNBT) {
+ return (aStack1.getItem() == aStack2.getItem())
+ && (aIgnoreNBT || ((aStack1.getTagCompound() == null == (aStack2.getTagCompound() == null))
+ && ((aStack1.getTagCompound() == null) || aStack1.getTagCompound()
+ .equals(aStack2.getTagCompound()))))
+ && ((meta(aStack1) == meta(aStack2)) || (meta(aStack1) == 32767) || (meta(aStack2) == 32767));
+ }
+
+ public static ItemStack copy(final Object... aStacks) {
+ for (final Object tStack : aStacks) {
+ if (valid(tStack)) {
+ return ((ItemStack) tStack).copy();
+ }
+ }
+ return null;
+ }
+
+ public static ItemStack copyMeta(final long aMetaData, final Object... aStacks) {
+ final ItemStack rStack = copy(aStacks);
+ if (invalid(rStack)) {
+ return null;
+ }
+ return meta(rStack, aMetaData);
+ }
+
+ public static short meta(final ItemStack aStack) {
+ return (short) Items.feather.getDamage(aStack);
+ }
+
+ public static ItemStack meta(final ItemStack aStack, final long aMeta) {
+ Items.feather.setDamage(aStack, (short) aMeta);
+ return aStack;
+ }
+
+ public static ItemStack amount(final long aAmount, final Object... aStacks) {
+ final ItemStack rStack = copy(aStacks);
+ if (invalid(rStack)) {
+ return null;
+ }
+ rStack.stackSize = (int) aAmount;
+ return rStack;
+ }
+
+ public static ItemStack container(final ItemStack aStack, final boolean aCheckIFluidContainerItems) {
+ if (invalid(aStack)) {
+ return null;
+ }
+ if (aStack.getItem()
+ .hasContainerItem(aStack)) {
+ return aStack.getItem()
+ .getContainerItem(aStack);
+ }
+ if (equal(aStack, ItemUtils.getEmptyCell(), true)) {
+ return null;
+ }
+ if (aCheckIFluidContainerItems && (aStack.getItem() instanceof IFluidContainerItem)
+ && (((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0)) {
+ final ItemStack tStack = amount(1L, aStack);
+ ((IFluidContainerItem) aStack.getItem()).drain(tStack, Integer.MAX_VALUE, true);
+ if (!equal(aStack, tStack)) {
+ return tStack;
+ }
+ return null;
+ }
+ if (equal(aStack, ItemList.IC2_ForgeHammer.get(1)) || equal(aStack, ItemList.IC2_WireCutter.get(1))) {
+ return copyMeta(meta(aStack) + 1, aStack);
+ }
+ return null;
+ }
+
+ public static ItemStack container(final ItemStack aStack, final boolean aCheckIFluidContainerItems,
+ final int aStacksize) {
+ return amount(aStacksize, container(aStack, aCheckIFluidContainerItems));
+ }
+
+ public static Fluid generateFluidNonMolten(final String unlocalizedName, final String localizedName,
+ final int MeltingPoint, final short[] RGBA, final ItemStack dustStack, final ItemStack dustStack2) {
+ return generateFluidNonMolten(
+ unlocalizedName,
+ localizedName,
+ MeltingPoint,
+ RGBA,
+ dustStack,
+ dustStack2,
+ 144,
+ true);
+ }
+
+ public static Fluid generateFluidNonMolten(final String unlocalizedName, final String localizedName,
+ final int MeltingPoint, final short[] RGBA, final ItemStack dustStack, final ItemStack dustStack2,
+ final boolean aGenerateCell) {
+ return generateFluidNonMolten(
+ unlocalizedName,
+ localizedName,
+ MeltingPoint,
+ RGBA,
+ dustStack,
+ dustStack2,
+ 144,
+ aGenerateCell);
+ }
+
+ public static final Fluid generateFluidNonMolten(final String unlocalizedName, final String localizedName,
+ final int MeltingPoint, final short[] RGBA, ItemStack dustStack, final ItemStack dustStack2,
+ final int amountPerItem, final boolean aGenerateCell) {
+ if (dustStack == null) {
+ dustStack = ItemUtils
+ .getItemStackOfAmountFromOreDictNoBroken("dust" + Utils.sanitizeString(localizedName), 1);
+ }
+ FluidStack aFStack = (FluidUtils.getFluidStack(unlocalizedName.toLowerCase(), 1));
+ if (aFStack == null) {
+ Logger.WARNING("Generating our own fluid.");
+
+ final Fluid gtFluid = FluidUtils.addGTFluidNonMolten(
+ unlocalizedName,
+ localizedName,
+ RGBA,
+ 4,
+ MeltingPoint,
+ null,
+ ItemUtils.getEmptyCell(),
+ 1000,
+ aGenerateCell);
+
+ if (dustStack != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(dustStack)
+ .fluidOutputs(FluidUtils.getFluidStack(gtFluid, amountPerItem))
+ .duration(1 * SECONDS)
+ .eut(16)
+ .addTo(fluidExtractionRecipes);
+ }
+ if (dustStack2 != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(dustStack2)
+ .fluidOutputs(FluidUtils.getFluidStack(gtFluid, amountPerItem))
+ .duration(1 * SECONDS)
+ .eut(16)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ return gtFluid;
+ } else {
+ Logger.INFO("FLUID GENERATION FAILED FOR " + localizedName + ", ALREADY EXISTS");
+ return aFStack.getFluid();
+ }
+ }
+
+ public static Fluid generateFluidNoPrefix(final String unlocalizedName, final String localizedName,
+ final int MeltingPoint, final short[] RGBA) {
+ return generateFluidNoPrefix(unlocalizedName, localizedName, MeltingPoint, RGBA, true);
+ }
+
+ public static Fluid generateFluidNoPrefix(final String unlocalizedName, final String localizedName,
+ final int MeltingPoint, final short[] RGBA, final boolean aGenerateCell) {
+ Fluid gtFluid;
+ if (FluidUtils.getFluidStack(unlocalizedName.toLowerCase(), 1) == null) {
+ Logger.WARNING("Generating our own fluid.");
+ gtFluid = FluidUtils.addGTFluidNoPrefix(
+ unlocalizedName,
+ localizedName,
+ RGBA,
+ 4,
+ MeltingPoint,
+ null,
+ ItemUtils.getEmptyCell(),
+ 1000,
+ aGenerateCell);
+ } else {
+ gtFluid = FluidUtils.getFluidStack(unlocalizedName.toLowerCase(), 1)
+ .getFluid();
+ }
+ return gtFluid;
+ }
+
+ public static Fluid generateGas(final String unlocalizedName, final String localizedName, final int MeltingPoint,
+ final short[] RGBA, final boolean aGenerateCell) {
+ Fluid gtFluid;
+ if (FluidUtils.getFluidStack(unlocalizedName.toLowerCase(), 1) == null) {
+ Logger.WARNING("Generating our own gas.");
+ gtFluid = FluidUtils.addGtGas(
+ unlocalizedName,
+ localizedName,
+ RGBA,
+ 3,
+ MeltingPoint,
+ null,
+ ItemUtils.getEmptyCell(),
+ 1000,
+ aGenerateCell);
+ } else {
+ gtFluid = FluidUtils.getFluidStack(unlocalizedName.toLowerCase(), 1)
+ .getFluid();
+ }
+ return gtFluid;
+ }
+
+ public static boolean doesFluidExist(String aFluidName) {
+ FluidStack aFStack1 = (FluidUtils.getFluidStack("molten" + "." + aFluidName.toLowerCase(), 1));
+ FluidStack aFStack2 = (FluidUtils.getFluidStack("fluid" + "." + aFluidName.toLowerCase(), 1));
+ FluidStack aFStack3 = (FluidUtils.getFluidStack(aFluidName.toLowerCase(), 1));
+ FluidStack aFStack4 = (FluidUtils.getFluidStack(aFluidName, 1));
+ FluidStack aFStack5 = (FluidUtils.getFluidStack("liquid_" + aFluidName.toLowerCase(), 1));
+ FluidStack aFStack6 = (FluidUtils.getFluidStack("liquid" + "." + aFluidName.toLowerCase(), 1));
+ return aFStack1 != null || aFStack2 != null
+ || aFStack3 != null
+ || aFStack4 != null
+ || aFStack5 != null
+ || aFStack6 != null;
+ }
+
+ public static FluidStack getWildcardFluidStack(String aFluidName, int amount) {
+ FluidStack aFStack1 = (FluidUtils.getFluidStack(aFluidName, amount));
+ FluidStack aFStack2 = (FluidUtils.getFluidStack(aFluidName.toLowerCase(), amount));
+ FluidStack aFStack3 = (FluidUtils.getFluidStack("molten" + "." + aFluidName.toLowerCase(), amount));
+ FluidStack aFStack4 = (FluidUtils.getFluidStack("fluid" + "." + aFluidName.toLowerCase(), amount));
+ FluidStack aFStack5 = (FluidUtils.getFluidStack("liquid_" + aFluidName.toLowerCase(), amount));
+ FluidStack aFStack6 = (FluidUtils.getFluidStack("liquid" + "." + aFluidName.toLowerCase(), amount));
+ if (aFStack1 != null) {
+ return aFStack1;
+ }
+ if (aFStack2 != null) {
+ return aFStack2;
+ }
+ if (aFStack3 != null) {
+ return aFStack3;
+ }
+ if (aFStack4 != null) {
+ return aFStack4;
+ }
+ if (aFStack5 != null) {
+ return aFStack5;
+ }
+ if (aFStack6 != null) {
+ return aFStack6;
+ }
+ return null;
+ }
+
+ public static FluidStack getWildcardFluidStack(Materials aMaterial, int amount) {
+ FluidStack aFStack1 = aMaterial.getFluid(amount);
+ FluidStack aFStack2 = aMaterial.getGas(amount);
+ FluidStack aFStack3 = aMaterial.getMolten(amount);
+ FluidStack aFStack4 = aMaterial.getSolid(amount);
+ if (aFStack1 != null) {
+ return aFStack1;
+ } else if (aFStack2 != null) {
+ return aFStack2;
+ } else if (aFStack3 != null) {
+ return aFStack3;
+ } else if (aFStack4 != null) {
+ return aFStack4;
+ } else {
+ return null;
+ }
+ }
+
+ public static FluidStack getAir(int aAmount) {
+ return FluidUtils.getFluidStack("air", aAmount);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/InventoryUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/InventoryUtils.java
new file mode 100644
index 0000000000..c8a7ed26da
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/InventoryUtils.java
@@ -0,0 +1,68 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class InventoryUtils {
+
+ private static final Random mRandom = new Random();
+
+ public static void dropInventoryItems(World world, int x, int y, int z, Block block) {
+ TileEntity tileentity = world.getTileEntity(x, y, z);
+
+ if (tileentity != null && tileentity instanceof IInventory aTileInv
+ && ((IInventory) tileentity).getSizeInventory() > 0) {
+
+ int aMinSlot = 0;
+ int aMaxSlot = aTileInv.getSizeInventory() - 1;
+
+ for (int i1 = aMinSlot; i1 < aMaxSlot; ++i1) {
+ ItemStack itemstack = aTileInv.getStackInSlot(i1);
+
+ if (itemstack != null) {
+ float f = mRandom.nextFloat() * 0.8F + 0.1F;
+ float f1 = mRandom.nextFloat() * 0.8F + 0.1F;
+ EntityItem entityitem;
+
+ for (float f2 = mRandom.nextFloat() * 0.8F + 0.1F; itemstack.stackSize > 0; world
+ .spawnEntityInWorld(entityitem)) {
+ int j1 = mRandom.nextInt(21) + 10;
+
+ if (j1 > itemstack.stackSize) {
+ j1 = itemstack.stackSize;
+ }
+
+ itemstack.stackSize -= j1;
+ entityitem = new EntityItem(
+ world,
+ x + f,
+ y + f1,
+ z + f2,
+ new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage()));
+ float f3 = 0.05F;
+ entityitem.motionX = (float) mRandom.nextGaussian() * f3;
+ entityitem.motionY = (float) mRandom.nextGaussian() * f3 + 0.2F;
+ entityitem.motionZ = (float) mRandom.nextGaussian() * f3;
+
+ if (itemstack.hasTagCompound()) {
+ entityitem.getEntityItem()
+ .setTagCompound(
+ (NBTTagCompound) itemstack.getTagCompound()
+ .copy());
+ }
+ }
+ }
+ }
+
+ world.func_147453_f(x, y, z, block);
+ }
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/ItemUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/ItemUtils.java
new file mode 100644
index 0000000000..16a71133c6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/ItemUtils.java
@@ -0,0 +1,1012 @@
+package gtPlusPlus.core.util.minecraft;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.enums.Mods.Minecraft;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Items;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.common.registry.GameRegistry.UniqueIdentifier;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.base.dusts.BaseItemDustUnique;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.xmod.gregtech.api.items.Gregtech_MetaTool;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+import gtPlusPlus.xmod.gregtech.loaders.RecipeGen_DustGeneration;
+
+public class ItemUtils {
+
+ public static ItemStack getSimpleStack(final Item x) {
+ return getSimpleStack(x, 1);
+ }
+
+ public static ItemStack getSimpleStack(final Block x) {
+ return simpleMetaStack(Item.getItemFromBlock(x), 0, 1);
+ }
+
+ public static ItemStack getSimpleStack(final Block x, int i) {
+ if (i == 0) {
+ return getSimpleStack(x, i, 1);
+ }
+
+ return getSimpleStack(x, 0, i);
+ }
+
+ public static ItemStack getSimpleStack(final Block x, int meta, int i) {
+ return simpleMetaStack(Item.getItemFromBlock(x), meta, i);
+ }
+
+ public static ItemStack getSimpleStack(final Item x, final int i) {
+ return new ItemStack(x, i);
+ }
+
+ public static ItemStack getSimpleStack(final ItemStack x, final int i) {
+ if (x == null) {
+ return null;
+ }
+ final ItemStack r = x.copy();
+ r.stackSize = i;
+ return r;
+ }
+
+ public static final int WILDCARD_VALUE = Short.MAX_VALUE;
+
+ public static ItemStack getWildcardStack(final ItemStack x) {
+ return ItemUtils.simpleMetaStack(x, WILDCARD_VALUE, 1);
+ }
+
+ public static ItemStack getIC2Cell(final int meta) {
+ return GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCellEmpty", 1L, meta);
+ }
+
+ public static ItemStack getEmptyCell() {
+ return getEmptyCell(1);
+ }
+
+ public static ItemStack getEmptyCell(int i) {
+ if (ItemList.Cell_Empty.hasBeenSet()) {
+ return ItemList.Cell_Empty.get(i);
+ }
+ final ItemStack temp = GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCellEmpty", i, 0);
+ return temp != null ? temp : null;
+ }
+
+ public static void getItemForOreDict(final String FQRN, final String oreDictName, final String itemName,
+ final int meta) {
+ try {
+ Item em = null;
+ final Item em1 = getItemFromFQRN(FQRN);
+
+ if (em1 != null) {
+ em = em1;
+ }
+
+ if (em != null) {
+
+ final ItemStack metaStack = new ItemStack(em, 1, meta);
+ GT_OreDictUnificator.registerOre(oreDictName, metaStack);
+
+ }
+ } catch (final NullPointerException e) {
+ Logger.ERROR(itemName + " not found. [NULL]");
+ }
+ }
+
+ public static void addItemToOreDictionary(ItemStack stack, final String oreDictName, boolean useWildcardMeta) {
+ if (useWildcardMeta) {
+ stack = ItemUtils.getWildcardStack(stack);
+ }
+ try {
+ OreDictionary.registerOre(oreDictName, stack);
+ } catch (final NullPointerException e) {
+ Logger.ERROR(ItemUtils.getItemName(stack) + " not registered. [NULL]");
+ }
+ }
+
+ public static void addItemToOreDictionary(final ItemStack stack, final String oreDictName) {
+ addItemToOreDictionary(stack, oreDictName, false);
+ }
+
+ public static ItemStack getItemStackWithMeta(final boolean MOD, final String FQRN, final String itemName,
+ final int meta, final int itemstackSize) {
+ if (MOD) {
+ try {
+ Item em = null;
+ final Item em1 = getItemFromFQRN(FQRN);
+
+ if (em1 != null) {
+ if (null == em) {
+ em = em1;
+ }
+ if (em != null) {
+ final ItemStack metaStack = new ItemStack(em, itemstackSize, meta);
+ return metaStack;
+ }
+ }
+ return null;
+ } catch (final NullPointerException e) {
+ Logger.ERROR(itemName + " not found. [NULL]");
+ return null;
+ }
+ }
+ return null;
+ }
+
+ public static ItemStack simpleMetaStack(final String FQRN, final int meta, final int itemstackSize) {
+ try {
+ Item em = null;
+ final Item em1 = getItemFromFQRN(FQRN);
+ // Utils.LOG_WARNING("Found: "+em1.getUnlocalizedName()+":"+meta);
+ if (em1 != null) {
+ if (null == em) {
+ em = em1;
+ }
+ if (em != null) {
+ final ItemStack metaStack = new ItemStack(em, itemstackSize, meta);
+ return metaStack;
+ }
+ }
+ return null;
+ } catch (final NullPointerException e) {
+ Logger.ERROR(FQRN + " not found. [NULL]");
+ return null;
+ }
+ }
+
+ public static ItemStack simpleMetaStack(ItemStack simpleStack, int meta, int size) {
+ return simpleMetaStack(simpleStack.getItem(), meta, size);
+ }
+
+ public static ItemStack simpleMetaStack(final Item item, int meta, int size) {
+ if (item == null) {
+ return null;
+ }
+ if (meta < 0 || meta > Short.MAX_VALUE) {
+ meta = 0;
+ }
+ if (size < 0 || size > 64) {
+ size = 1;
+ }
+ return new ItemStack(item, size, meta);
+ }
+
+ public static ItemStack simpleMetaStack(final Block block, final int meta, final int size) {
+ return simpleMetaStack(Item.getItemFromBlock(block), meta, size);
+ }
+
+ public static ItemStack getCorrectStacktype(final String fqrn, final int stackSize) {
+ final String oreDict = "ore:";
+ ItemStack temp;
+ if (fqrn.toLowerCase()
+ .contains(oreDict.toLowerCase())) {
+ final String sanitizedName = fqrn.replace(oreDict, "");
+ temp = ItemUtils.getItemStackFromFQRN(sanitizedName, stackSize);
+ return temp;
+ }
+ final String[] fqrnSplit = fqrn.split(":");
+ String temp1;
+ String temp2;
+ temp1 = fqrnSplit[1];
+ if (fqrnSplit.length < 3) {
+ temp2 = "0";
+ } else {
+ temp2 = fqrnSplit[2];
+ }
+ temp = ItemUtils.getItemStackWithMeta(true, fqrn, temp1, Integer.parseInt(temp2), stackSize);
+ return temp;
+ }
+
+ public static Item getItemFromFQRN(final String fqrn) // fqrn = fully qualified resource name
+ {
+ final String[] fqrnSplit = fqrn.split(":");
+ return GameRegistry.findItem(fqrnSplit[0], fqrnSplit[1]);
+ }
+
+ public static ItemStack getItemStackFromFQRN(final String fqrn, final int Size) // fqrn = fully qualified resource
+ // name
+ {
+ Logger.INFO("Trying to split string '" + fqrn + "'.");
+ final String[] fqrnSplit = fqrn.split(":");
+ if (fqrnSplit.length < 2) {
+ return null;
+ } else {
+ if (fqrnSplit.length == 2) {
+ Logger.INFO("Mod: " + fqrnSplit[0] + ", Item: " + fqrnSplit[1]);
+ return GameRegistry.findItemStack(fqrnSplit[0], fqrnSplit[1], Size);
+ } else if (fqrnSplit.length == 3 && fqrnSplit[2] != null && fqrnSplit[2].length() > 0) {
+ Logger.INFO("Mod: " + fqrnSplit[0] + ", Item: " + fqrnSplit[1] + ", Meta: " + fqrnSplit[2]);
+ ItemStack aStack = GameRegistry.findItemStack(fqrnSplit[0], fqrnSplit[1], Size);
+ int aMeta = Integer.parseInt(fqrnSplit[2]);
+ if (aStack != null && (aMeta >= 0 && aMeta <= Short.MAX_VALUE)) {
+ return ItemUtils.simpleMetaStack(aStack, aMeta, Size);
+ } else {
+ Logger.INFO("Could not find instance of Item: " + fqrnSplit[1]);
+ }
+ }
+ }
+ return null;
+ }
+
+ public static ItemStack[] validItemsForOreDict(final String oredictName) {
+ final List<?> validNames = MaterialUtils.oreDictValuesForEntry(oredictName);
+ final ItemStack[] inputs = new ItemStack[validNames.size()];
+ for (int i = 0; i < validNames.size(); i++) {
+ inputs[i] = (ItemStack) validNames.get(i);
+ }
+ return inputs;
+ }
+
+ public static ItemStack getItemStackOfAmountFromOreDict(String oredictName, final int amount) {
+ String mTemp = oredictName;
+
+ if (oredictName.contains("-") || oredictName.contains("_")) {
+ mTemp = Utils.sanitizeString(mTemp, new char[] { '-', '_' });
+ } else {
+ mTemp = Utils.sanitizeString(mTemp);
+ }
+
+ if (oredictName.contains("rod")) {
+ String s = "stick" + oredictName.substring(3);
+ oredictName = s;
+ }
+
+ // Banned Materials and replacements for GT5.8 compat.
+
+ if (oredictName.toLowerCase()
+ .contains("ingotclay")) {
+ return getSimpleStack(Items.clay_ball, amount);
+ }
+
+ final ArrayList<ItemStack> oreDictList = OreDictionary.getOres(mTemp);
+ if (!oreDictList.isEmpty()) {
+ final ItemStack returnValue = oreDictList.get(0)
+ .copy();
+ returnValue.stackSize = amount;
+ return returnValue;
+ }
+ Logger.INFO("Failed to find `" + oredictName + "` in OD.");
+ return getErrorStack(amount, oredictName + " x" + amount);
+ // return getItemStackOfAmountFromOreDictNoBroken(mTemp, amount);
+ }
+
+ public static ItemStack getItemStackOfAmountFromOreDictNoBroken(String oredictName, final int amount) {
+ if (CORE_Preloader.DEBUG_MODE) {
+ Logger.WARNING("Looking up: " + oredictName + " - from method: " + ReflectionUtils.getMethodName(1));
+ Logger.WARNING("Looking up: " + oredictName + " - from method: " + ReflectionUtils.getMethodName(2));
+ Logger.WARNING("Looking up: " + oredictName + " - from method: " + ReflectionUtils.getMethodName(3));
+ Logger.WARNING("Looking up: " + oredictName + " - from method: " + ReflectionUtils.getMethodName(4));
+ Logger.WARNING("Looking up: " + oredictName + " - from method: " + ReflectionUtils.getMethodName(5));
+ }
+
+ try {
+
+ if (oredictName.contains("-") || oredictName.contains("_")) {
+ oredictName = Utils.sanitizeString(oredictName, new char[] { '-', '_' });
+ } else {
+ oredictName = Utils.sanitizeString(oredictName);
+ }
+
+ // Adds a check to grab dusts using GT methodology if possible.
+ ItemStack returnValue = null;
+ if (oredictName.toLowerCase()
+ .contains("dust")) {
+ final String MaterialName = oredictName.toLowerCase()
+ .replace("dust", "");
+ final Materials m = Materials.get(MaterialName);
+ if (m != null && m != Materials._NULL) {
+ returnValue = getGregtechDust(m, amount);
+ if (checkForInvalidItems(returnValue)) {
+ return returnValue;
+ }
+ }
+ }
+ if (returnValue == null) {
+ returnValue = getItemStackOfAmountFromOreDict(oredictName, amount);
+ if (ItemUtils.checkForInvalidItems(returnValue)) {
+ return returnValue.copy();
+ }
+ }
+
+ Logger.RECIPE(oredictName + " was not valid.");
+ return null;
+ } catch (final Throwable t) {
+ return null;
+ }
+ }
+
+ public static ItemStack getGregtechDust(final Materials material, final int amount) {
+ final ItemStack returnValue = GT_OreDictUnificator.get(OrePrefixes.dust, material, 1L);
+ if (returnValue != null) {
+ if (ItemUtils.checkForInvalidItems(returnValue)) {
+ return returnValue.copy();
+ }
+ }
+ Logger.WARNING(material + " was not valid.");
+ return null;
+ }
+
+ // NullFormula
+ public static Item[] generateSpecialUseDusts(final String unlocalizedName, final String materialName,
+ final int Colour) {
+ return generateSpecialUseDusts(unlocalizedName, materialName, "NullFormula", Colour);
+ }
+
+ public static Item[] generateSpecialUseDusts(final String unlocalizedName, final String materialName,
+ String mChemForm, final int Colour) {
+ GT_LanguageManager.addStringLocalization("gtplusplus.material." + materialName, materialName);
+ final Item[] output = {
+ new BaseItemDustUnique("itemDust" + unlocalizedName, materialName, mChemForm, Colour, "Dust"),
+ new BaseItemDustUnique("itemDustSmall" + unlocalizedName, materialName, mChemForm, Colour, "Small"),
+ new BaseItemDustUnique("itemDustTiny" + unlocalizedName, materialName, mChemForm, Colour, "Tiny") };
+
+ // Generate Shaped/Shapeless Recipes
+
+ final ItemStack normalDust = ItemUtils.getSimpleStack(output[0]);
+ final ItemStack smallDust = ItemUtils.getSimpleStack(output[1]);
+ final ItemStack tinyDust = ItemUtils.getSimpleStack(output[2]);
+
+ CORE.RA.addpackagerRecipe(ItemList.Schematic_Dust.get(0), smallDust, tinyDust, normalDust);
+
+ if (ItemUtils.checkForInvalidItems(tinyDust) && ItemUtils.checkForInvalidItems(normalDust)) {
+ if (RecipeUtils.addShapedRecipe(
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ normalDust)) {
+ Logger.WARNING("9 Tiny dust to 1 Dust Recipe: " + materialName + " - Success");
+ } else {
+ Logger.WARNING("9 Tiny dust to 1 Dust Recipe: " + materialName + " - Failed");
+ }
+
+ if (RecipeUtils.addShapedRecipe(
+ normalDust,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ ItemUtils.getSimpleStack(tinyDust, 9))) {
+ Logger.WARNING("9 Tiny dust from 1 Recipe: " + materialName + " - Success");
+ } else {
+ Logger.WARNING("9 Tiny dust from 1 Recipe: " + materialName + " - Failed");
+ }
+ }
+
+ if (ItemUtils.checkForInvalidItems(smallDust) && ItemUtils.checkForInvalidItems(normalDust)) {
+ if (RecipeUtils.addShapedRecipe(
+ smallDust,
+ smallDust,
+ null,
+ smallDust,
+ smallDust,
+ null,
+ null,
+ null,
+ null,
+ normalDust)) {
+ Logger.WARNING("4 Small dust to 1 Dust Recipe: " + materialName + " - Success");
+ } else {
+ Logger.WARNING("4 Small dust to 1 Dust Recipe: " + materialName + " - Failed");
+ }
+ if (RecipeUtils.addShapedRecipe(
+ null,
+ normalDust,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ ItemUtils.getSimpleStack(smallDust, 4))) {
+ Logger.WARNING("4 Small dust from 1 Dust Recipe: " + materialName + " - Success");
+ } else {
+ Logger.WARNING("4 Small dust from 1 Dust Recipe: " + materialName + " - Failed");
+ }
+ }
+
+ return output;
+ }
+
+ public static Item[] generateSpecialUseDusts(final Material material, final boolean onlyLargeDust) {
+ return generateSpecialUseDusts(material, onlyLargeDust, false);
+ }
+
+ public static Item[] generateSpecialUseDusts(final Material material, final boolean onlyLargeDust,
+ final boolean disableExtraRecipes) {
+ final String materialName = material.getUnlocalizedName();
+ final String unlocalizedName = Utils.sanitizeString(materialName);
+ final int Colour = material.getRgbAsHex();
+ final String aChemForm = material.vChemicalFormula;
+ final boolean isChemFormvalid = (aChemForm != null && aChemForm.length() > 0);
+ Item[] output = null;
+ if (onlyLargeDust == false) {
+ output = new Item[] {
+ new BaseItemDustUnique(
+ "itemDust" + unlocalizedName,
+ materialName,
+ isChemFormvalid ? aChemForm : "",
+ Colour,
+ "Dust"),
+ new BaseItemDustUnique(
+ "itemDustSmall" + unlocalizedName,
+ materialName,
+ isChemFormvalid ? aChemForm : "",
+ Colour,
+ "Small"),
+ new BaseItemDustUnique(
+ "itemDustTiny" + unlocalizedName,
+ materialName,
+ isChemFormvalid ? aChemForm : "",
+ Colour,
+ "Tiny") };
+ } else {
+ output = new Item[] { new BaseItemDustUnique("itemDust" + unlocalizedName, materialName, Colour, "Dust") };
+ }
+
+ new RecipeGen_DustGeneration(material, disableExtraRecipes);
+
+ return output;
+ }
+
+ public static boolean isRadioactive(final String materialName) {
+ int sRadiation = 0;
+ if (materialName.toLowerCase()
+ .contains("uranium")) {
+ sRadiation = 2;
+ } else if (materialName.toLowerCase()
+ .contains("plutonium")) {
+ sRadiation = 4;
+ } else if (materialName.toLowerCase()
+ .contains("thorium")) {
+ sRadiation = 1;
+ }
+ if (sRadiation >= 1) {
+ return true;
+ }
+ return false;
+ }
+
+ public static int getRadioactivityLevel(final String materialName) {
+ int sRadiation = 0;
+ if (materialName.toLowerCase()
+ .contains("uranium")) {
+ sRadiation = 2;
+ } else if (materialName.toLowerCase()
+ .contains("plutonium")) {
+ sRadiation = 4;
+ } else if (materialName.toLowerCase()
+ .contains("thorium")) {
+ sRadiation = 1;
+ }
+ return sRadiation;
+ }
+
+ public static String getArrayStackNames(final FluidStack[] aStack) {
+ String itemNames = "Fluid Array: ";
+ for (final FluidStack alph : aStack) {
+ if (alph != null) {
+ final String temp = itemNames;
+ itemNames = temp + ", " + alph.getLocalizedName() + " x" + alph.amount;
+ } else {
+ final String temp = itemNames;
+ itemNames = temp + ", " + "null" + " x" + "0";
+ }
+ }
+ return itemNames;
+ }
+
+ public static String getArrayStackNames(final ItemStack[] aStack) {
+ String itemNames = "";
+ int aPos = 0;
+ for (final ItemStack alph : aStack) {
+ if (alph == null) {
+ continue;
+ }
+ if (alph != null) {
+ final String temp = itemNames;
+ itemNames = temp + (aPos > 0 ? ", " : "") + alph.getDisplayName() + " x" + alph.stackSize;
+ aPos++;
+ }
+ }
+ return itemNames;
+ }
+
+ public static ItemStack getGregtechCircuit(final int Meta) {
+ return ItemUtils.getItemStackWithMeta(true, "gregtech:gt.integrated_circuit", "Gregtech Circuit", Meta, 0);
+ }
+
+ private static final Map<Item, String> mModidCache = new HashMap<>();
+
+ private static String getModId(final Item item) {
+ if (mModidCache.containsKey(item)) {
+ return mModidCache.get(item);
+ }
+ String value = "";
+ try {
+ final GameRegistry.UniqueIdentifier id = GameRegistry.findUniqueIdentifierFor(item);
+ if (id != null) {
+ final String modname = (id.modId == null ? id.name : id.modId);
+ value = ((id == null) || id.modId.equals("")) ? Minecraft.ID : modname;
+ }
+ } catch (final Throwable t) {
+ try {
+ final UniqueIdentifier t2 = GameRegistry.findUniqueIdentifierFor(Block.getBlockFromItem(item));
+ if (t2 != null) {
+ final String modname = (t2.modId == null ? t2.name : t2.modId);
+ value = ((t2 == null) || t2.modId.equals("")) ? Minecraft.ID : modname;
+ }
+ } catch (final Throwable t3) {
+ t3.printStackTrace();
+ value = "bad modid";
+ }
+ }
+ if (!mModidCache.containsKey(item)) {
+ return mModidCache.put(item, value);
+ }
+ return value;
+ }
+
+ public static String getModId(final ItemStack key) {
+ return getModId(key.getItem());
+ }
+
+ // Take 2 - GT/GT++ Dusts
+ public static ItemStack getGregtechDust(final String oredictName, final int amount) {
+ final ArrayList<ItemStack> oreDictList = OreDictionary.getOres(oredictName);
+ if (!oreDictList.isEmpty()) {
+ ItemStack returnvalue;
+ for (ItemStack itemStack : oreDictList) {
+ final String modid = getModId(itemStack.getItem());
+ if (modid != null && (modid.equals(GregTech.ID) || modid.equals(GTPlusPlus.ID))) {
+ returnvalue = itemStack.copy();
+ returnvalue.stackSize = amount;
+ return returnvalue;
+ }
+ }
+ }
+ return getNonTinkersDust(oredictName, amount);
+ }
+
+ // Anything But Tinkers Dust
+ public static ItemStack getNonTinkersDust(final String oredictName, final int amount) {
+ final ArrayList<ItemStack> oreDictList = OreDictionary.getOres(oredictName);
+ if (!oreDictList.isEmpty()) {
+ ItemStack returnvalue;
+ for (ItemStack itemStack : oreDictList) {
+ final String modid = getModId(itemStack.getItem());
+ if (modid != null && !modid.equals("tconstruct")) {
+ returnvalue = itemStack.copy();
+ returnvalue.stackSize = amount;
+ return returnvalue;
+ }
+ }
+ }
+ // If only Tinkers dust exists, bow down and just use it.
+ return getItemStackOfAmountFromOreDictNoBroken(oredictName, amount);
+ }
+
+ public static ItemStack getOrePrefixStack(OrePrefixes mPrefix, Material mMat, int mAmount) {
+
+ String mName = Utils.sanitizeString(mMat.getLocalizedName());
+
+ String mItemName = mPrefix.name() + mName;
+ ItemStack gregstack = ItemUtils.getItemStackOfAmountFromOreDictNoBroken(mItemName, mAmount);
+ if (gregstack == null) {
+ return null;
+ }
+ return (gregstack);
+ }
+
+ public static ItemStack getOrePrefixStack(OrePrefixes mPrefix, Materials mMat, int mAmount) {
+ if (mPrefix == OrePrefixes.rod) {
+ mPrefix = OrePrefixes.stick;
+ }
+ ItemStack aGtStack = GT_OreDictUnificator.get(mPrefix, mMat, mAmount);
+ if (aGtStack == null) {
+ Logger
+ .INFO("Failed to find `" + mPrefix + MaterialUtils.getMaterialName(mMat) + "` in OD. [Prefix Search]");
+ return getErrorStack(mAmount, (mPrefix.toString() + MaterialUtils.getMaterialName(mMat) + " x" + mAmount));
+ } else {
+ return aGtStack;
+ }
+ }
+
+ public static ItemStack getErrorStack(int mAmount) {
+ return getErrorStack(mAmount, null);
+ }
+
+ public static ItemStack getErrorStack(int mAmount, String aName) {
+ ItemStack g = getSimpleStack(ModItems.AAA_Broken, 1);
+ if (aName != null) {
+ NBTUtils.setBookTitle(g, EnumChatFormatting.RED + aName);
+ }
+ return g;
+ }
+
+ public static ItemStack[] getStackOfAllOreDictGroup(String oredictname) {
+ final ArrayList<ItemStack> oreDictList = OreDictionary.getOres(oredictname);
+ if (!oreDictList.isEmpty()) {
+ final ItemStack[] returnValues = new ItemStack[oreDictList.size()];
+ for (int i = 0; i < oreDictList.size(); i++) {
+ if (oreDictList.get(i) != null) {
+ returnValues[i] = oreDictList.get(i);
+ }
+ }
+ return returnValues.length > 0 ? returnValues : null;
+ } else {
+ return null;
+ }
+ }
+
+ public static boolean registerFuel(ItemStack aBurnable, int burn) {
+ return CORE.burnables.add(new Pair<>(burn, aBurnable));
+ }
+
+ public static boolean checkForInvalidItems(ItemStack mInput) {
+ return checkForInvalidItems(new ItemStack[] { mInput });
+ }
+
+ public static boolean checkForInvalidItems(ItemStack[] mInput) {
+ return checkForInvalidItems(mInput, new ItemStack[] {});
+ }
+
+ /**
+ *
+ * @param mInputs
+ * @return {@link Boolean} - True if {@link ItemStack}[] only contains valid items.
+ */
+ public static boolean checkForInvalidItems(ItemStack[] mInputs, ItemStack[] mOutputs) {
+ if (mInputs == null || mOutputs == null) {
+ return false;
+ }
+
+ if (mInputs.length > 0) {
+ for (ItemStack stack : mInputs) {
+ if (stack != null) {
+ if (stack.getItem() != null) {
+ if (stack.getItem() == ModItems.AAA_Broken || stack.getItem()
+ .getClass() == ModItems.AAA_Broken.getClass()) {
+ return false;
+ } else if (stack.getItem() == ModItems.ZZZ_Empty || stack.getItem()
+ .getClass() == ModItems.ZZZ_Empty.getClass()) {
+ return false;
+ } else {
+ continue;
+ }
+ } else {
+ continue;
+ }
+ } else {
+ return false;
+ }
+ }
+ }
+ if (mOutputs.length > 0) {
+ for (ItemStack stack : mOutputs) {
+ if (stack != null) {
+ if (stack.getItem() != null) {
+ if (stack.getItem() == ModItems.AAA_Broken || stack.getItem()
+ .getClass() == ModItems.AAA_Broken.getClass()) {
+ return false;
+ } else if (stack.getItem() == ModItems.ZZZ_Empty || stack.getItem()
+ .getClass() == ModItems.ZZZ_Empty.getClass()) {
+ return false;
+ } else {
+ continue;
+ }
+ } else {
+ continue;
+ }
+ } else {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ public static IInventory organiseInventory(IInventory aInputInventory) {
+ ItemStack[] p = new ItemStack[aInputInventory.getSizeInventory()];
+ for (int o = 0; o < aInputInventory.getSizeInventory(); o++) {
+ p[o] = aInputInventory.getStackInSlot(o);
+ }
+ // ItemStack[] g = organiseInventory(p);
+
+ IInventory aTemp = aInputInventory;
+ for (int i = 0; i < p.length; ++i) {
+ for (int j = i + 1; j < p.length; ++j) {
+ if (p[j] != null && (p[i] == null || GT_Utility.areStacksEqual(p[i], p[j]))) {
+ GT_Utility.moveStackFromSlotAToSlotB(aTemp, aTemp, j, i, (byte) 64, (byte) 1, (byte) 64, (byte) 1);
+ }
+ }
+ }
+
+ return aTemp;
+ }
+
+ public static String getFluidName(FluidStack aFluid) {
+ return aFluid != null ? aFluid.getFluid()
+ .getLocalizedName(aFluid) : "NULL";
+ }
+
+ public static String getItemName(ItemStack aStack) {
+ if (aStack == null) {
+ return "ERROR - Empty Stack";
+ }
+ String aDisplay = null;
+ try {
+ aDisplay = ("" + StatCollector.translateToLocal(
+ aStack.getItem()
+ .getUnlocalizedNameInefficiently(aStack) + ".name")).trim();
+ if (aStack.hasTagCompound()) {
+ if (aStack.stackTagCompound != null && aStack.stackTagCompound.hasKey("display", 10)) {
+ NBTTagCompound nbttagcompound = aStack.stackTagCompound.getCompoundTag("display");
+
+ if (nbttagcompound.hasKey("Name", 8)) {
+ aDisplay = nbttagcompound.getString("Name");
+ }
+ }
+ }
+ } catch (Throwable ignored) {
+
+ }
+ if (aDisplay == null || aDisplay.length() <= 0) {
+ aDisplay = aStack.getUnlocalizedName() + ":" + aStack.getItemDamage();
+ } else {
+ aDisplay += " | Meta: " + aStack.getItemDamage();
+ }
+ return aDisplay;
+ }
+
+ public static String getUnlocalizedItemName(ItemStack aStack) {
+ if (aStack == null) {
+ return "ERROR.Empty.Stack";
+ }
+ String aDisplay = null;
+ try {
+ aDisplay = (aStack.getUnlocalizedName()).trim();
+ } catch (Throwable t) {
+ aDisplay = aStack.getItem()
+ .getUnlocalizedName();
+ }
+ if (aDisplay == null || aDisplay.length() <= 0) {
+ aDisplay = aStack.getItem()
+ .getUnlocalizedNameInefficiently(aStack);
+ }
+ return aDisplay;
+ }
+
+ public static boolean isItemGregtechTool(ItemStack aStack) {
+ if (aStack == null) {
+ return false;
+ }
+ final Item mItem = aStack.getItem();
+ final Item aSkookum = ItemUtils.getItemFromFQRN("miscutils:gt.plusplus.metatool.01");
+ final Class aSkookClass = aSkookum.getClass();
+ if (aSkookClass.isInstance(mItem) || mItem instanceof GT_MetaGenerated_Tool_01
+ || mItem instanceof MetaGeneratedGregtechTools
+ || mItem instanceof Gregtech_MetaTool
+ || mItem == aSkookum) {
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean isToolScrewdriver(ItemStack aScrewdriver) {
+ if (isItemGregtechTool(aScrewdriver)
+ && (aScrewdriver.getItemDamage() == 22 || aScrewdriver.getItemDamage() == 150)) {
+ return true;
+ }
+ return false;
+ }
+
+ public static ItemStack[] cleanItemStackArray(ItemStack[] input) {
+ int aArraySize = input.length;
+ ItemStack[] aOutput = new ItemStack[aArraySize];
+ AutoMap<ItemStack> aCleanedItems = new AutoMap<>();
+ for (ItemStack checkStack : input) {
+ if (ItemUtils.checkForInvalidItems(checkStack)) {
+ aCleanedItems.put(checkStack);
+ }
+ }
+ for (int i = 0; i < aArraySize; i++) {
+ ItemStack aMappedStack = aCleanedItems.get(i);
+ if (aMappedStack != null) {
+ aOutput[i] = aMappedStack;
+ }
+ }
+ return aOutput;
+ }
+
+ public static boolean doesOreDictHaveEntryFor(String string) {
+ return OreDictUtils.containsValidEntries(string);
+ }
+
+ public static void hideItemFromNEI(ItemStack aItemToHide) {
+ codechicken.nei.api.API.hideItem(aItemToHide);
+ }
+
+ public static ItemStack getNullStack() {
+ return GT_Values.NI;
+ }
+
+ public static ItemStack depleteStack(ItemStack aStack) {
+ return depleteStack(aStack, 1);
+ }
+
+ public static ItemStack depleteStack(ItemStack aStack, int aAmount) {
+ final int cap = aStack.stackSize;
+ if (cap >= 1 && cap >= aAmount) {
+ ItemStack aDepStack = aStack.copy();
+ aDepStack.stackSize = (MathUtils.balance((aDepStack.stackSize - 1), 0, 64));
+ if (aDepStack.stackSize > 0) {
+ return aDepStack;
+ }
+ }
+ return getNullStack();
+ }
+
+ public static boolean isControlCircuit(ItemStack aStack) {
+ if (aStack != null) {
+ Item aItem = aStack.getItem();
+ if (aItem == CI.getNumberedBioCircuit(0)
+ .getItem() || aItem
+ == CI.getNumberedCircuit(0)
+ .getItem()
+ || aItem == CI.getNumberedAdvancedCircuit(0)
+ .getItem()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static boolean isCatalyst(ItemStack aStack) {
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mBlueCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mBrownCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mOrangeCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mPurpleCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mRedCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mYellowCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mPinkCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mFormaldehydeCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mSolidAcidCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mInfiniteMutationCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, AgriculturalChem.mGreenCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mPlatinumGroupCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mPlasticPolymerCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mRubberPolymerCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mAdhesionPromoterCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mTitaTungstenIndiumCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mRadioactivityCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mRareEarthGroupCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mSimpleNaquadahCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mAdvancedNaquadahCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mRawIntelligenceCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mUltimatePlasticCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mBiologicalIntelligenceCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.TemporalHarmonyCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mLimpidWaterCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mFlawlessWaterCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mParticleAccelerationCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mSynchrotronCapableCatalyst, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mAlgagenicGrowthPromoterCatalyst, true)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ public static boolean isMillingBall(ItemStack aStack) {
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mMillingBallAlumina, true)) {
+ return true;
+ }
+ if (GT_Utility.areStacksEqual(aStack, GenericChem.mMillingBallSoapstone, true)) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/LangUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/LangUtils.java
new file mode 100644
index 0000000000..28d017d749
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/LangUtils.java
@@ -0,0 +1,41 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.lang.reflect.Field;
+import java.util.Map;
+import java.util.Properties;
+
+import cpw.mods.fml.common.registry.LanguageRegistry;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class LangUtils {
+
+ @SuppressWarnings("unchecked")
+ public static void rewriteEntryForLanguageRegistry(String aLang, String aKey, String aNewValue) {
+ LanguageRegistry aInstance = LanguageRegistry.instance();
+ Field aModLanguageData = ReflectionUtils.getField(LanguageRegistry.class, "modLanguageData");
+ if (aModLanguageData != null) {
+ Map<String, Properties> aProps;
+ Object aInstanceProps;
+ try {
+ aInstanceProps = aModLanguageData.get(aInstance);
+ if (aInstanceProps != null) {
+ aProps = (Map<String, Properties>) aInstanceProps;
+ Properties aLangProps = aProps.get(aLang);
+ if (aLangProps != null) {
+ if (aLangProps.containsKey(aKey)) {
+ aLangProps.remove(aKey);
+ aLangProps.put(aKey, aNewValue);
+ } else {
+ aLangProps.put(aKey, aNewValue);
+ }
+ aProps.remove(aLang);
+ aProps.put(aLang, aLangProps);
+ ReflectionUtils.setField(aInstance, aModLanguageData, aProps);
+ }
+ }
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {
+
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/MaterialUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/MaterialUtils.java
new file mode 100644
index 0000000000..881ccb3c41
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/MaterialUtils.java
@@ -0,0 +1,372 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.enums.Element;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.TypeCounter;
+import gtPlusPlus.core.client.CustomTextureSet.TextureSets;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.item.base.BaseItemComponent.ComponentTypes;
+import gtPlusPlus.core.item.base.foil.BaseItemFoil;
+import gtPlusPlus.core.item.base.wire.BaseItemFineWire;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public class MaterialUtils {
+
+ public static List<?> oreDictValuesForEntry(final String oredictName) {
+ List<?> oredictItemNames;
+ if (OreDictionary.doesOreNameExist(oredictName)) {
+ oredictItemNames = OreDictionary.getOres(oredictName);
+ return oredictItemNames;
+ }
+ return null;
+ }
+
+ private static final Map<String, Material> mGeneratedMaterialMap = new HashMap<>();
+
+ public static Material generateMaterialFromGtENUM(final Materials material) {
+ return generateMaterialFromGtENUM(material, null, null);
+ }
+
+ public static Material generateMaterialFromGtENUM(final Materials material, TextureSet aCustomTextures) {
+ return generateMaterialFromGtENUM(material, null, aCustomTextures);
+ }
+
+ public static Material generateMaterialFromGtENUM(final Materials material, short[] customRGB) {
+ return generateMaterialFromGtENUM(material, customRGB, null);
+ }
+
+ public static Material generateMaterialFromGtENUM(final Materials material, short[] customRGB,
+ TextureSet aCustomTextures) {
+ String aMaterialKey = getMaterialName(material).toLowerCase();
+ if (mGeneratedMaterialMap.containsKey(aMaterialKey)) {
+ return mGeneratedMaterialMap.get(aMaterialKey);
+ }
+
+ try {
+ String name = material.mName;
+ final short[] rgba = (customRGB == null ? material.mRGBa : customRGB);
+ final int melting = material.mMeltingPoint;
+ final int boiling = material.mBlastFurnaceTemp;
+ final long protons = material.getProtons();
+ final long neutrons = material.getNeutrons();
+ final boolean blastFurnace = material.mBlastFurnaceRequired;
+ int radioactivity = 0;
+ if (material.isRadioactive()) {
+ ItemStack aDustStack = ItemUtils.getOrePrefixStack(OrePrefixes.dust, material, 1);
+ radioactivity = aDustStack != null ? GT_Utility.getRadioactivityLevel(aDustStack) : 0;
+ if (radioactivity == 0) {
+ long aProtons = material.getProtons();
+ radioactivity = (int) Math.min(Math.max((aProtons / 30), 1), 9);
+ }
+ }
+ Logger.MATERIALS("[Debug] Calculated Radiation level to be " + radioactivity + ".");
+ TextureSet iconSet = null;
+ if (aCustomTextures == null) {
+ if (material.isRadioactive()) {
+ iconSet = TextureSets.NUCLEAR.get();
+ } else {
+ iconSet = material.mIconSet;
+ }
+ } else {
+ iconSet = aCustomTextures;
+ }
+ if (iconSet == null || iconSet.mSetName.toLowerCase()
+ .contains("fluid")) {
+ iconSet = TextureSet.SET_METALLIC;
+ }
+ Logger.MATERIALS("[Debug] Calculated Texture Set to be " + iconSet.mSetName + ".");
+
+ final int durability = material.mDurability;
+ boolean mGenerateCell = false;
+ boolean mGenerateFluid = true;
+ MaterialState materialState;
+ String chemicalFormula = StringUtils.subscript(Utils.sanitizeString(material.mChemicalFormula));
+ final Element element = material.mElement;
+
+ // Weird Blacklist of Bad Chemical Strings
+ if (material.mElement == Element.Pb || material.mElement == Element.Na || material.mElement == Element.Ar) {
+ chemicalFormula = StringUtils.subscript(Utils.sanitizeString(material.mElement.name()));
+ }
+
+ // Determine default state
+ Logger.MATERIALS("[Debug] Setting State of GT generated material. " + material.mDefaultLocalName);
+ if (material.getMolten(1) != null || material.getSolid(1) != null) {
+ materialState = MaterialState.SOLID;
+ Logger.MATERIALS("[Debug] Molten or Solid was not null.");
+ if (material.getMolten(1) == null && material.getSolid(1) != null) {
+ Logger.MATERIALS("[Debug] Molten is Null, Solid is not. Enabling cell generation.");
+ mGenerateCell = true;
+ } else if (material.getMolten(1) != null && material.getSolid(1) == null) {
+ Logger.MATERIALS("[Debug] Molten is not Null, Solid is null. Not enabling cell generation.");
+ // mGenerateCell = true;
+ }
+ Logger.MATERIALS("[Debug] State set as solid.");
+ } else if (material.getFluid(1) != null) {
+ Logger.MATERIALS("[Debug] State set as liquid.");
+ materialState = MaterialState.LIQUID;
+ } else if (material.getGas(1) != null) {
+ Logger.MATERIALS("[Debug] State set as gas.");
+ materialState = MaterialState.GAS;
+ } else {
+ Logger.MATERIALS(
+ "[Debug] State set as solid. This material has no alternative states, so for safety we wont generate anything.");
+ materialState = MaterialState.SOLID;
+ mGenerateFluid = false;
+ }
+
+ if (name.toLowerCase()
+ .contains("infused")) {
+ final String tempname = name.substring(7);
+ name = "Infused " + tempname;
+ }
+ if (hasValidRGBA(rgba) || (element == Element.H)
+ || ((material == Materials.InfusedAir) || (material == Materials.InfusedFire)
+ || (material == Materials.InfusedEarth)
+ || (material == Materials.InfusedWater))) {
+ Material M = new Material(
+ name,
+ materialState,
+ iconSet,
+ durability,
+ rgba,
+ melting,
+ boiling,
+ protons,
+ neutrons,
+ blastFurnace,
+ chemicalFormula,
+ radioactivity,
+ mGenerateCell,
+ mGenerateFluid);
+ mGeneratedMaterialMap.put(aMaterialKey, M);
+ return M;
+ } else {
+ Logger.DEBUG_MATERIALS(
+ "Failed to generate GT++ material instance for " + material.mName
+ + " | Valid RGB? "
+ + (hasValidRGBA(rgba)));
+ }
+ } catch (Throwable t) {
+ Logger.DEBUG_MATERIALS("Failed to generate GT++ material instance for " + material.mName);
+ t.printStackTrace();
+ }
+ return null;
+ }
+
+ public static Material generateQuickMaterial(final String materialName, final MaterialState defaultState,
+ final short[] colour, final int sRadioactivity) {
+ String aMaterialKey = materialName.toLowerCase();
+ if (mGeneratedMaterialMap.containsKey(aMaterialKey)) {
+ return mGeneratedMaterialMap.get(aMaterialKey);
+ }
+
+ final Material temp = new Material(
+ materialName,
+ defaultState,
+ colour,
+ 1000, // melting
+ 3000, // boiling
+ 50, // Protons
+ 50, // Neutrons
+ false,
+ "",
+ sRadioactivity);
+ mGeneratedMaterialMap.put(aMaterialKey, temp);
+ return temp;
+ }
+
+ public static boolean hasValidRGBA(final short[] rgba) {
+ if (rgba == null || rgba.length < 3 || rgba.length > 4) {
+ return false;
+ }
+ return true;
+ }
+
+ public static int getTierOfMaterial(final double aMeltingPoint) {
+ return aMeltingPoint < 1000 ? 0 : (MathUtils.roundToClosestInt(aMeltingPoint / 1000f));
+ }
+
+ public static int getVoltageForTier(int aTier) {
+ // aTier += 1; - Probably some logic to this, idk.
+
+ return switch (aTier) {
+ case 0 -> 16;
+ case 1 -> 30;
+ case 2 -> 120;
+ case 3 -> 480;
+ case 4 -> 1920;
+ case 5 -> 7680;
+ case 6 -> 30720;
+ case 7 -> 122880;
+ case 8 -> 491520;
+ case 9 -> 1966080;
+ case 10 -> 7864320;
+ case 11 -> 31457280;
+ case 12 -> 125829120;
+ case 13 -> 503316480;
+ case 14 -> 2013265920;
+ default -> Integer.MAX_VALUE;
+ };
+
+ }
+
+ private static Materials getMaterialByName(String materialName) {
+ for (Materials m : Materials.values()) {
+ if (MaterialUtils.getMaterialName(m)
+ .toLowerCase()
+ .equals(materialName.toLowerCase())) {
+ return m;
+ }
+ }
+ return null;
+ }
+
+ public static String getMaterialName(Materials mat) {
+ String mName = mat.mDefaultLocalName;
+ if (mName == null || mName.equals("")) {
+ mName = mat.mName;
+ }
+ return mName;
+ }
+
+ public static TextureSet getMostCommonTextureSet(List<Material> list) {
+ TypeCounter<TextureSet> aCounter = new TypeCounter<>(TextureSet.class);
+ for (Material m : list) {
+ TextureSet t = m.getTextureSet();
+ if (t == null) {
+ t = Materials.Gold.mIconSet;
+ }
+ if (t != null) {
+ aCounter.add(t, t.mSetName);
+ }
+ }
+ return aCounter.getResults();
+ }
+
+ public static Materials getMaterial(String aMaterialName, String aFallbackMaterialName) {
+ Materials g = getMaterial(aMaterialName);
+ if (g == null) {
+ g = getMaterial(aFallbackMaterialName);
+ }
+ if (g == null) {
+ Logger.INFO(
+ "Failed finding material '" + aMaterialName
+ + "' & fallback '"
+ + aFallbackMaterialName
+ + "', returning _NULL.");
+ CORE.crash();
+ }
+ return g;
+ }
+
+ public static Materials getMaterial(String aMaterialName) {
+ Materials m = Materials.get(aMaterialName);
+ if (m == Materials._NULL) {
+ m = getMaterialByName(aMaterialName);
+ }
+ if (m == null) {
+ Logger.INFO("Failed finding material '" + aMaterialName + "', returning _NULL.");
+ m = Materials._NULL;
+ }
+ return m;
+ }
+
+ public static AutoMap<Material> getCompoundMaterialsRecursively(Material aMat) {
+ return getCompoundMaterialsRecursively_Speiger(aMat);
+ }
+
+ public static AutoMap<Material> getCompoundMaterialsRecursively_Speiger(Material toSearch) {
+ AutoMap<Material> resultList = new AutoMap<>();
+ if (toSearch.getComposites()
+ .isEmpty()) {
+ resultList.put(toSearch);
+ return resultList;
+ }
+ final int HARD_LIMIT = 1000;
+
+ // Could be a Deque but i dont use the interface
+ // enough to use it as default.
+ LinkedList<Material> toCheck = new LinkedList<>();
+
+ toCheck.add(toSearch);
+ int processed = 0;
+ while (!toCheck.isEmpty() && processed < HARD_LIMIT) {
+ Material current = toCheck.remove();
+ if (current.getComposites()
+ .isEmpty()) {
+ resultList.put(current);
+ } else {
+ for (MaterialStack entry : current.getComposites()) {
+ toCheck.add(entry.getStackMaterial());
+ }
+ }
+ processed++;
+ }
+ return resultList;
+ }
+
+ public static void generateComponentAndAssignToAMaterial(ComponentTypes aType, Material aMaterial) {
+ generateComponentAndAssignToAMaterial(aType, aMaterial, true);
+ }
+
+ public static void generateComponentAndAssignToAMaterial(ComponentTypes aType, Material aMaterial,
+ boolean generateRecipes) {
+ Item aGC;
+ if (aType == ComponentTypes.FINEWIRE) {
+ aGC = new BaseItemFineWire(aMaterial);
+ } else if (aType == ComponentTypes.FOIL) {
+ aGC = new BaseItemFoil(aMaterial);
+ } else {
+ aGC = new BaseItemComponent(aMaterial, aType);
+ }
+ String aFormattedLangName = aType.getName();
+
+ if (!aFormattedLangName.startsWith(" ")) {
+ if (aFormattedLangName.contains("@")) {
+ String[] aSplit = aFormattedLangName.split("@");
+ aFormattedLangName = aSplit[0] + " " + aMaterial.getLocalizedName() + " " + aSplit[1];
+ }
+ }
+
+ if (aFormattedLangName.equals(aType.getName())) {
+ aFormattedLangName = aMaterial.getLocalizedName() + aFormattedLangName;
+ }
+
+ Logger.MATERIALS("[Lang] " + aGC.getUnlocalizedName() + ".name=" + aFormattedLangName);
+ aMaterial.registerComponentForMaterial(aType, ItemUtils.getSimpleStack(aGC));
+ }
+
+ public static void generateSpecialDustAndAssignToAMaterial(Material aMaterial, boolean generateMixerRecipes) {
+ Item[] aDusts = ItemUtils.generateSpecialUseDusts(aMaterial, false, !generateMixerRecipes);
+ if (aDusts.length > 0) {
+ aMaterial.registerComponentForMaterial(OrePrefixes.dust, ItemUtils.getSimpleStack(aDusts[0]));
+ aMaterial.registerComponentForMaterial(OrePrefixes.dustSmall, ItemUtils.getSimpleStack(aDusts[1]));
+ aMaterial.registerComponentForMaterial(OrePrefixes.dustTiny, ItemUtils.getSimpleStack(aDusts[2]));
+ }
+ }
+
+ public static boolean isNullGregtechMaterial(Materials aGregtechMaterial) {
+ return aGregtechMaterial == Materials._NULL || aGregtechMaterial.equals(Materials._NULL)
+ || aGregtechMaterial.mName.equals(Materials._NULL.mName);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/MiningUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/MiningUtils.java
new file mode 100644
index 0000000000..3abc92b69e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/MiningUtils.java
@@ -0,0 +1,133 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.util.HashMap;
+
+import gregtech.common.GT_Worldgen_GT_Ore_Layer;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class MiningUtils {
+
+ public static int mMoonID = -99;
+ public static int mMarsID = -99;
+ public static int mCometsID = -99;
+
+ public static void iterateAllOreTypes() {
+ HashMap<String, Integer> M = new HashMap<>();
+ String aTextWorldGen;
+ if (MiningUtils.findAndMapOreTypesFromGT()) {
+ int mapKey = 0;
+ for (AutoMap<GT_Worldgen_GT_Ore_Layer> g : MiningUtils.mOreMaps) {
+ for (GT_Worldgen_GT_Ore_Layer h : g) {
+
+ try {
+ aTextWorldGen = (String) ReflectionUtils
+ .getField(GT_Worldgen_GT_Ore_Layer.class, "aTextWorldgen")
+ .get(h);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ aTextWorldGen = h.mWorldGenName;
+ }
+
+ M.put(aTextWorldGen + h.mWorldGenName, mapKey);
+ Logger.INFO("Found Vein type: " + aTextWorldGen + h.mWorldGenName + " in map with key: " + mapKey);
+ }
+ mapKey++;
+ }
+ }
+ }
+
+ public static AutoMap<GT_Worldgen_GT_Ore_Layer>[] mOreMaps = new AutoMap[7];
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_Overworld = new AutoMap<>();
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_Nether = new AutoMap<>();
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_End = new AutoMap<>();
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_Moon = new AutoMap<>();
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_Mars = new AutoMap<>();
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_Comets = new AutoMap<>();
+ private static final AutoMap<GT_Worldgen_GT_Ore_Layer> Ores_Misc = new AutoMap<>();
+
+ public static boolean findAndMapOreTypesFromGT() {
+ // Gets Moon ID
+
+ boolean aEndAsteroids;
+ try {
+ if (ReflectionUtils.getClass("micdoodle8.mods.galacticraft.core.util.ConfigManagerCore") != null
+ && mMoonID == -99) {
+ mMoonID = ReflectionUtils
+ .getField(
+ ReflectionUtils.getClass("micdoodle8.mods.galacticraft.core.util.ConfigManagerCore"),
+ "idDimensionMoon")
+ .getInt(null);
+ }
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {}
+
+ // Gets Mars ID
+ try {
+ if (ReflectionUtils.getClass("micdoodle8.mods.galacticraft.planets.mars.ConfigManagerMars") != null
+ && mMarsID == -99) {
+ mMarsID = ReflectionUtils
+ .getField(
+ ReflectionUtils.getClass("micdoodle8.mods.galacticraft.planets.mars.ConfigManagerMars"),
+ "dimensionIDMars")
+ .getInt(null);
+ }
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {}
+
+ // Get Comets ID
+ try {
+ if (ReflectionUtils.getClass("micdoodle8.mods.galacticraft.planets.asteroids.ConfigManagerAsteroids")
+ != null && mCometsID == -99) {
+ mCometsID = ReflectionUtils
+ .getField(
+ ReflectionUtils
+ .getClass("micdoodle8.mods.galacticraft.planets.asteroids.ConfigManagerAsteroids"),
+ "dimensionIDAsteroids")
+ .getInt(null);
+ }
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {}
+
+ // Clear Cache
+ Ores_Overworld.clear();
+ Ores_Nether.clear();
+ Ores_End.clear();
+ Ores_Misc.clear();
+
+ for (GT_Worldgen_GT_Ore_Layer x : GT_Worldgen_GT_Ore_Layer.sList) {
+ if (x.mEnabled) {
+
+ try {
+ aEndAsteroids = ReflectionUtils.getField(GT_Worldgen_GT_Ore_Layer.class, "mEndAsteroid")
+ .getBoolean(x);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ aEndAsteroids = false;
+ }
+
+ if (x.mOverworld) {
+ Ores_Overworld.put(x);
+ }
+ if (x.mNether) {
+ Ores_Nether.put(x);
+ }
+ if (x.mEnd || aEndAsteroids) {
+ Ores_End.put(x);
+ }
+ if (x.mOverworld || x.mNether || (x.mEnd || aEndAsteroids)) {
+ continue;
+ }
+
+ Ores_Misc.put(x);
+ } else {
+ Ores_Comets.put(x);
+ }
+ }
+
+ mOreMaps[0] = Ores_Overworld;
+ mOreMaps[1] = Ores_Nether;
+ mOreMaps[2] = Ores_End;
+ mOreMaps[3] = Ores_Moon;
+ mOreMaps[4] = Ores_Mars;
+ mOreMaps[5] = Ores_Comets;
+ mOreMaps[6] = Ores_Misc;
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/NBTUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/NBTUtils.java
new file mode 100644
index 0000000000..4b0f15b81e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/NBTUtils.java
@@ -0,0 +1,164 @@
+package gtPlusPlus.core.util.minecraft;
+
+import static gtPlusPlus.core.item.ModItems.ZZZ_Empty;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+import gregtech.api.util.GT_Utility;
+
+public class NBTUtils {
+
+ public static NBTTagCompound getNBT(ItemStack aStack) {
+ NBTTagCompound rNBT = aStack.getTagCompound();
+ return ((rNBT == null) ? new NBTTagCompound() : rNBT);
+ }
+
+ public static void setBookTitle(ItemStack aStack, String aTitle) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setString("title", aTitle);
+ GT_Utility.ItemNBT.setNBT(aStack, tNBT);
+ }
+
+ public static ItemStack[] readItemsFromNBT(ItemStack itemstack) {
+ NBTTagCompound tNBT = getNBT(itemstack);
+ final NBTTagList list = tNBT.getTagList("Items", 10);
+ ItemStack inventory[] = new ItemStack[list.tagCount()];
+ for (int i = 0; i < list.tagCount(); i++) {
+ final NBTTagCompound data = list.getCompoundTagAt(i);
+ final int slot = data.getInteger("Slot");
+ if ((slot >= 0) && (slot < list.tagCount())) {
+ if (ItemStack.loadItemStackFromNBT(data) == ItemUtils.getSimpleStack(ZZZ_Empty)) {
+ inventory[slot] = null;
+ } else {
+ inventory[slot] = ItemStack.loadItemStackFromNBT(data);
+ }
+ }
+ }
+ return inventory;
+ }
+
+ public static ItemStack writeItemsToNBT(ItemStack itemstack, ItemStack[] stored) {
+ NBTTagCompound tNBT = getNBT(itemstack);
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < stored.length; i++) {
+ final ItemStack stack = stored[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ } else {
+ final NBTTagCompound data = new NBTTagCompound();
+ ItemStack nullstack = ItemUtils.getSimpleStack(ZZZ_Empty);
+ nullstack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ tNBT.setTag("Items", list);
+ itemstack.setTagCompound(tNBT);
+ return itemstack;
+ }
+
+ public static ItemStack writeItemsToNBT(ItemStack itemstack, ItemStack[] stored, String customkey) {
+ NBTTagCompound tNBT = getNBT(itemstack);
+ final NBTTagList list = new NBTTagList();
+ for (int i = 0; i < stored.length; i++) {
+ final ItemStack stack = stored[i];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("Slot", i);
+ list.appendTag(data);
+ }
+ }
+ tNBT.setTag(customkey, list);
+ itemstack.setTagCompound(tNBT);
+ return itemstack;
+ }
+
+ public static void setBoolean(ItemStack aStack, String aTag, boolean aBoolean) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setBoolean(aTag, aBoolean);
+ GT_Utility.ItemNBT.setNBT(aStack, tNBT);
+ }
+
+ public static boolean getBoolean(ItemStack aStack, String aTag) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ return tNBT.getBoolean(aTag);
+ }
+
+ public static void setInteger(ItemStack aStack, String aTag, int aInt) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setInteger(aTag, aInt);
+ GT_Utility.ItemNBT.setNBT(aStack, tNBT);
+ }
+
+ public static int getInteger(ItemStack aStack, String aTag) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ return tNBT.getInteger(aTag);
+ }
+
+ public static void setLong(ItemStack aStack, String aTag, long aInt) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setLong(aTag, aInt);
+ GT_Utility.ItemNBT.setNBT(aStack, tNBT);
+ }
+
+ public static long getLong(ItemStack aStack, String aTag) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ return tNBT.getLong(aTag);
+ }
+
+ public static void setString(ItemStack aStack, String aTag, String aString) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setString(aTag, aString);
+ GT_Utility.ItemNBT.setNBT(aStack, tNBT);
+ }
+
+ public static String getString(ItemStack aStack, String aTag) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ return tNBT.getString(aTag);
+ }
+
+ public static boolean hasKey(ItemStack stack, String key) {
+ final NBTTagCompound itemData = getNBT(stack);
+ if (itemData.hasKey(key)) {
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean createIntegerTagCompound(ItemStack rStack, String tagName, String keyName, int keyValue) {
+ final NBTTagCompound tagMain = getNBT(rStack);
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setInteger(keyName, keyValue);
+ tagMain.setTag(tagName, tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static NBTTagCompound getTagCompound(ItemStack aStack, String tagName) {
+ NBTTagCompound aNBT = getNBT(aStack);
+ if (aNBT != null && hasKey(aStack, tagName)) {
+ aNBT = aNBT.getCompoundTag(tagName);
+ if (aNBT != null) {
+ return aNBT;
+ }
+ }
+ return null;
+ }
+
+ public static boolean hasTagCompound(ItemStack aStack) {
+ return aStack.hasTagCompound();
+ }
+
+ public static void createEmptyTagCompound(ItemStack aStack) {
+ if (!hasTagCompound(aStack)) {
+ NBTTagCompound aTag = new NBTTagCompound();
+ aStack.setTagCompound(aTag);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/OreDictUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/OreDictUtils.java
new file mode 100644
index 0000000000..0c8e971443
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/OreDictUtils.java
@@ -0,0 +1,20 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+public class OreDictUtils {
+
+ public static boolean containsValidEntries(String aOreName) {
+ boolean a = OreDictionary.doesOreNameExist(aOreName);
+ List<ItemStack> b = OreDictionary.getOres(aOreName, false);
+
+ if (!a) {
+ return false;
+ } else {
+ return b != null && !b.isEmpty();
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/PlayerUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/PlayerUtils.java
new file mode 100644
index 0000000000..ba7353cba6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/PlayerUtils.java
@@ -0,0 +1,206 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.WeakHashMap;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.FakePlayer;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class PlayerUtils {
+
+ public static final Map<String, EntityPlayer> mCachedFakePlayers = new WeakHashMap<>();
+ private static final Class mThaumcraftFakePlayer;
+
+ static {
+ if (ReflectionUtils.doesClassExist("thaumcraft.common.lib.FakeThaumcraftPlayer")) {
+ mThaumcraftFakePlayer = ReflectionUtils.getClass("thaumcraft.common.lib.FakeThaumcraftPlayer");
+ } else {
+ mThaumcraftFakePlayer = null;
+ }
+ }
+
+ public static List<EntityPlayerMP> getOnlinePlayers() {
+ final List<EntityPlayerMP> onlinePlayers = MinecraftServer.getServer()
+ .getConfigurationManager().playerEntityList;
+ return onlinePlayers;
+ }
+
+ public static void messagePlayer(final EntityPlayer P, final String S) {
+ gregtech.api.util.GT_Utility.sendChatToPlayer(P, S);
+ }
+
+ public static void messagePlayer(final EntityPlayer P, final IChatComponent S) {
+ P.addChatComponentMessage(S);
+ }
+
+ public static EntityPlayer getPlayer(final String name) {
+ try {
+ for (final EntityPlayer temp : getOnlinePlayers()) {
+ if (temp.getDisplayName()
+ .equalsIgnoreCase(name)) {
+ return temp;
+ }
+ }
+ } catch (final Throwable ignored) {}
+ return null;
+ }
+
+ public static EntityPlayer getPlayerOnServerFromUUID(final UUID parUUID) {
+ if (parUUID == null) {
+ return null;
+ }
+ for (final EntityPlayerMP player : getOnlinePlayers()) {
+ if (player.getUniqueID()
+ .equals(parUUID)) {
+ return player;
+ }
+ }
+ return null;
+ }
+
+ public static boolean isPlayerOP(final EntityPlayer player) {
+ if (player.canCommandSenderUseCommand(2, "")) {
+ return true;
+ }
+ return false;
+ }
+
+ // Not Clientside
+ public static ItemStack getItemStackInPlayersHand(final World world, final String Name) {
+ final EntityPlayer thePlayer = getPlayer(Name);
+ ItemStack heldItem = null;
+ try {
+ heldItem = thePlayer.getHeldItem();
+ } catch (final NullPointerException e) {
+ return null;
+ }
+ if (heldItem != null) {
+ return heldItem;
+ }
+ return null;
+ }
+
+ @SideOnly(Side.CLIENT)
+ public static ItemStack getItemStackInPlayersHand() {
+ final Minecraft mc = Minecraft.getMinecraft();
+ ItemStack heldItem;
+ try {
+ heldItem = mc.thePlayer.getHeldItem();
+ } catch (final NullPointerException e) {
+ return null;
+ }
+ if (heldItem != null) {
+ return heldItem;
+ }
+ return null;
+ }
+
+ public static ItemStack getItemStackInPlayersHand(final EntityPlayer player) {
+ ItemStack heldItem;
+ try {
+ heldItem = player.getHeldItem();
+ } catch (final NullPointerException e) {
+ e.printStackTrace();
+ return null;
+ }
+ if (heldItem != null) {
+ return heldItem;
+ } else {
+ if (Utils.isClient()) {
+ heldItem = player.getItemInUse();
+ } else {
+ heldItem = player.getCurrentEquippedItem();
+ }
+ }
+ return heldItem;
+ }
+
+ public static final UUID getPlayersUUIDByName(final String aPlayerName) {
+ final EntityPlayer player = PlayerUtils.getPlayer(aPlayerName);
+ if (player != null) {
+ return player.getUniqueID();
+ }
+ return null;
+ }
+
+ public static void messageAllPlayers(String string) {
+ Utils.sendServerMessage(string);
+ }
+
+ public static boolean isCreative(EntityPlayer aPlayer) {
+ return aPlayer.capabilities.isCreativeMode;
+ }
+
+ public static boolean canTakeDamage(EntityPlayer aPlayer) {
+ return !aPlayer.capabilities.disableDamage;
+ }
+
+ public static void cacheFakePlayer(EntityPlayer aPlayer) {
+ ChunkCoordinates aChunkLocation = aPlayer.getPlayerCoordinates();
+ // Cache Fake Player
+ if (aPlayer instanceof FakePlayer
+ || (mThaumcraftFakePlayer != null && mThaumcraftFakePlayer.isInstance(aPlayer))
+ || (aPlayer.getCommandSenderName() == null || aPlayer.getCommandSenderName()
+ .length() <= 0)
+ || (aPlayer.isEntityInvulnerable() && !aPlayer.canCommandSenderUseCommand(0, "") && (aChunkLocation == null)
+ || (aChunkLocation.posX == 0 && aChunkLocation.posY == 0 && aChunkLocation.posZ == 0))) {
+ mCachedFakePlayers.put(
+ aPlayer.getUniqueID()
+ .toString(),
+ aPlayer);
+ }
+ }
+
+ public static boolean isCachedFakePlayer(String aUUID) {
+ return mCachedFakePlayers.containsKey(aUUID);
+ }
+
+ public static boolean isRealPlayer(EntityLivingBase aEntity) {
+ if (aEntity instanceof EntityPlayer p) {
+ ChunkCoordinates aChunkLocation = p.getPlayerCoordinates();
+ if (p instanceof FakePlayer) {
+ cacheFakePlayer(p);
+ return false;
+ }
+ if (mThaumcraftFakePlayer != null && mThaumcraftFakePlayer.isInstance(p)) {
+ cacheFakePlayer(p);
+ return false;
+ }
+ if (p.getCommandSenderName() == null) {
+ cacheFakePlayer(p);
+ return false;
+ }
+ if (p.getCommandSenderName()
+ .length() <= 0) {
+ cacheFakePlayer(p);
+ return false;
+ }
+ if (p.isEntityInvulnerable() && !p.canCommandSenderUseCommand(0, "")
+ && (aChunkLocation.posX == 0 && aChunkLocation.posY == 0 && aChunkLocation.posZ == 0)) {
+ cacheFakePlayer(p);
+ return false;
+ }
+ if (!isCachedFakePlayer(
+ p.getUniqueID()
+ .toString())) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/RecipeUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/RecipeUtils.java
new file mode 100644
index 0000000000..ed2da4d7f7
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/RecipeUtils.java
@@ -0,0 +1,465 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
+import net.minecraft.item.crafting.IRecipe;
+import net.minecraft.item.crafting.ShapelessRecipes;
+import net.minecraftforge.oredict.ShapedOreRecipe;
+import net.minecraftforge.oredict.ShapelessOreRecipe;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.ShapedRecipe;
+import gtPlusPlus.core.handler.COMPAT_HANDLER;
+import gtPlusPlus.core.handler.Recipes.LateRegistrationHandler;
+import gtPlusPlus.core.handler.Recipes.RegistrationHandler;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.data.ArrayUtils;
+
+public class RecipeUtils {
+
+ public static int mInvalidID = 1;
+
+ public static void recipeBuilder(final Object slot_1, final Object slot_2, final Object slot_3, final Object slot_4,
+ final Object slot_5, final Object slot_6, final Object slot_7, final Object slot_8, final Object slot_9,
+ ItemStack resultItem) {
+
+ if (resultItem == null) {
+ Logger.RECIPE(
+ "[Fix] Found a recipe with an invalid output, yet had a valid inputs. Using Dummy output so recipe can be found..");
+ resultItem = ItemUtils.getItemStackOfAmountFromOreDict("givemeabrokenitem", 1);
+ resultItem.setItemDamage(mInvalidID++);
+ RegistrationHandler.recipesFailed++;
+
+ } else if ((slot_1 == null) && (slot_2 == null)
+ && (slot_3 == null)
+ && (slot_4 == null)
+ && (slot_5 == null)
+ && (slot_6 == null)
+ && (slot_7 == null)
+ && (slot_8 == null)
+ && (slot_9 == null)) {
+ Logger.RECIPE("[Fix] Found a recipe with 0 inputs, yet had a valid output.");
+ Logger.RECIPE(
+ "[Fix] Error found while adding a recipe for: " + resultItem != null ? resultItem.getDisplayName()
+ : "Bad Output Item" + " | Please report this issue on Github.");
+ RegistrationHandler.recipesFailed++;
+ return;
+ }
+
+ Object[] o = new Object[] { slot_1, slot_2, slot_3, slot_4, slot_5, slot_6, slot_7, slot_8, slot_9 };
+
+ try {
+ int size = COMPAT_HANDLER.mRecipesToGenerate.size();
+ COMPAT_HANDLER.mRecipesToGenerate.put(new InternalRecipeObject(o, resultItem, false));
+ // Utils.LOG_WARNING("Success! Added a recipe for "+resultItem.getDisplayName());
+ if (COMPAT_HANDLER.mRecipesToGenerate.size() > size) {
+ if (!COMPAT_HANDLER.areInitItemsLoaded) {
+ RegistrationHandler.recipesSuccess++;
+ } else {
+ LateRegistrationHandler.recipesSuccess++;
+ }
+ }
+ } catch (RuntimeException k) {
+ Logger.RECIPE(
+ "[Fix] Invalid Recipe detected for: " + resultItem != null ? resultItem.getUnlocalizedName()
+ : "INVALID OUTPUT ITEM");
+ if (!COMPAT_HANDLER.areInitItemsLoaded) {
+ RegistrationHandler.recipesFailed++;
+ } else {
+ LateRegistrationHandler.recipesFailed++;
+ }
+ }
+ }
+
+ public static void removeCraftingRecipe(Object x) {
+ if (null == x) {
+ return;
+ }
+ if (x instanceof String) {
+ final Item R = ItemUtils.getItemFromFQRN((String) x);
+ if (R != null) {
+ x = R;
+ } else {
+ return;
+ }
+ }
+ if ((x instanceof Item) || (x instanceof ItemStack)) {
+ if (x instanceof Item) {
+ final ItemStack r = new ItemStack((Item) x);
+ Logger.RECIPE("Removing Recipe for " + r.getUnlocalizedName());
+ } else {
+ Logger.RECIPE("Removing Recipe for " + ((ItemStack) x).getUnlocalizedName());
+ }
+ if (x instanceof ItemStack) {
+ final Item r = ((ItemStack) x).getItem();
+ if (null != r) {
+ x = r;
+ } else {
+ Logger.RECIPE("Recipe removal failed - Tell Alkalus.");
+ return;
+ }
+ }
+ if (RecipeUtils.attemptRecipeRemoval((Item) x)) {
+ Logger.RECIPE("Recipe removal successful");
+ return;
+ }
+ Logger.RECIPE("Recipe removal failed - Tell Alkalus.");
+ }
+ }
+
+ private static boolean attemptRecipeRemoval(final Item I) {
+ Logger.RECIPE("Create list of recipes.");
+ final List<IRecipe> recipes = CraftingManager.getInstance()
+ .getRecipeList();
+ final Iterator<IRecipe> items = recipes.iterator();
+ Logger.RECIPE("Begin list iteration.");
+ while (items.hasNext()) {
+ final ItemStack is = items.next()
+ .getRecipeOutput();
+ if ((is != null) && (is.getItem() == I)) {
+ items.remove();
+ Logger.RECIPE("Remove a recipe with " + I.getUnlocalizedName() + " as output.");
+ continue;
+ }
+ }
+ Logger.RECIPE("All recipes should be gone?");
+ if (!items.hasNext()) {
+ Logger.RECIPE("We iterated once, let's try again to double check.");
+ for (IRecipe recipe : recipes) {
+ final ItemStack is = recipe.getRecipeOutput();
+ if ((is != null) && (is.getItem() == I)) {
+ items.remove();
+ Logger.RECIPE("REMOVING MISSED RECIPE - RECHECK CONSTRUCTORS");
+ return true;
+ }
+ }
+ Logger.RECIPE("Should be all gone now after double checking, so return true.");
+ return true;
+ }
+ Logger.RECIPE("Return false, because something went wrong.");
+ return false;
+ }
+
+ public static boolean addShapedGregtechRecipe(final Object InputItem1, final Object InputItem2,
+ final Object InputItem3, final Object InputItem4, final Object InputItem5, final Object InputItem6,
+ final Object InputItem7, final Object InputItem8, final Object InputItem9, final ItemStack OutputItem) {
+
+ Object[] o = { InputItem1, InputItem2, InputItem3, InputItem4, InputItem5, InputItem6, InputItem7, InputItem8,
+ InputItem9 };
+
+ if (gtPlusPlus.GTplusplus.CURRENT_LOAD_PHASE != GTplusplus.INIT_PHASE.POST_INIT) {
+ CORE.crash(
+ "Load Phase " + gtPlusPlus.GTplusplus.CURRENT_LOAD_PHASE
+ + " should be "
+ + GTplusplus.INIT_PHASE.POST_INIT
+ + ". Unable to register recipe.");
+ }
+
+ int size = COMPAT_HANDLER.mGtRecipesToGenerate.size();
+ COMPAT_HANDLER.mGtRecipesToGenerate.put(new InternalRecipeObject(o, OutputItem, true));
+
+ if (COMPAT_HANDLER.mGtRecipesToGenerate.size() > size) {
+ if (!COMPAT_HANDLER.areInitItemsLoaded) {
+ RegistrationHandler.recipesSuccess++;
+ } else {
+ LateRegistrationHandler.recipesSuccess++;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean addShapelessGregtechRecipe(final Object[] inputItems, final ItemStack OutputItem) {
+ // Catch Invalid Recipes
+ if (inputItems.length > 9 || inputItems.length < 1) {
+ if (OutputItem != null) {
+ Logger.RECIPE(
+ "[Fix] Invalid input array for shapeless recipe, which should output "
+ + OutputItem.getDisplayName());
+ }
+ return false;
+ }
+ // let gregtech handle shapeless recipes.
+ if (GT_ModHandler.addShapelessCraftingRecipe(OutputItem, inputItems)) {
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean generateMortarRecipe(ItemStack aStack, ItemStack aOutput) {
+ return RecipeUtils
+ .addShapedGregtechRecipe(aStack, null, null, CI.craftingToolMortar, null, null, null, null, null, aOutput);
+ }
+
+ public static class InternalRecipeObject implements RunnableWithInfo<String> {
+
+ final ItemStack mOutput;
+ final ShapedOreRecipe mRecipe;
+ public final boolean isValid;
+
+ public InternalRecipeObject(Object[] aInputs, ItemStack aOutput, boolean gtRecipe) {
+ Logger.RECIPE("===================================");
+ mOutput = aOutput != null ? aOutput.copy() : null;
+ Object[] aFiltered = new Object[9];
+ int aValid = 0;
+ for (Object o : aInputs) {
+ if (o instanceof ItemStack) {
+ aFiltered[aValid++] = o;
+ } else if (o instanceof Item) {
+ aFiltered[aValid++] = ItemUtils.getSimpleStack((Item) o);
+ } else if (o instanceof Block) {
+ aFiltered[aValid++] = ItemUtils.getSimpleStack((Block) o);
+ } else if (o instanceof String) {
+ aFiltered[aValid++] = o;
+ } else if (o == null) {
+ aFiltered[aValid++] = null;
+ } else {
+ Logger.RECIPE(
+ "Cleaned a " + o.getClass()
+ .getSimpleName() + " from recipe input.");
+ }
+ }
+
+ int validCounter = 0, invalidCounter = 0;
+ for (Object p : aFiltered) {
+ if (p instanceof ItemStack) {
+ validCounter++;
+ } else if (p instanceof Item) {
+ validCounter++;
+ } else if (p instanceof Block) {
+ validCounter++;
+ } else if (p instanceof String) {
+ validCounter++;
+ } else if (p == null) {
+ validCounter++;
+ } else {
+ invalidCounter++;
+ }
+ }
+
+ Logger.RECIPE("Using " + validCounter + " valid inputs and " + invalidCounter + " invalid inputs.");
+ ShapedRecipe r = new ShapedRecipe(aFiltered, mOutput);
+ if (r != null && r.mRecipe != null) {
+ isValid = true;
+ } else {
+ isValid = false;
+ }
+ mRecipe = r != null ? r.mRecipe : null;
+ }
+
+ @Override
+ public void run() {
+ if (this.isValid) {
+ GameRegistry.addRecipe(mRecipe);
+ } else {
+ Logger.RECIPE(
+ "[Fix] Invalid shapped recipe outputting "
+ + (mOutput != null ? mOutput.getDisplayName() : "Bad Output Item"));
+ }
+ }
+
+ @Override
+ public String getInfoData() {
+ if (mOutput != null && mOutput instanceof ItemStack) {
+ return mOutput.getDisplayName();
+ }
+ return "";
+ }
+ }
+
+ public static boolean removeRecipeByOutput(ItemStack aOutput) {
+ return removeRecipeByOutput(aOutput, true, false, false);
+ }
+
+ public static boolean removeRecipeByOutput(ItemStack aOutput, boolean aIgnoreNBT,
+ boolean aNotRemoveShapelessRecipes, boolean aOnlyRemoveNativeHandlers) {
+ if (aOutput == null) {
+ return false;
+ } else {
+ boolean rReturn = false;
+ ArrayList<IRecipe> tList = (ArrayList) CraftingManager.getInstance()
+ .getRecipeList();
+ aOutput = GT_OreDictUnificator.get(aOutput);
+ int tList_sS = tList.size();
+
+ for (int i = 0; i < tList_sS; ++i) {
+ IRecipe tRecipe = (IRecipe) tList.get(i);
+ if (!aNotRemoveShapelessRecipes
+ || !(tRecipe instanceof ShapelessRecipes) && !(tRecipe instanceof ShapelessOreRecipe)) {
+ if (aOnlyRemoveNativeHandlers) {
+ if (!gregtech.api.util.GT_ModHandler.sNativeRecipeClasses.contains(
+ tRecipe.getClass()
+ .getName())) {
+ continue;
+ }
+ } else if (gregtech.api.util.GT_ModHandler.sSpecialRecipeClasses.contains(
+ tRecipe.getClass()
+ .getName())) {
+ continue;
+ }
+
+ ItemStack tStack = tRecipe.getRecipeOutput();
+ if (GT_Utility.areStacksEqual(GT_OreDictUnificator.get(tStack), aOutput, aIgnoreNBT)) {
+ tList.remove(i--);
+ tList_sS = tList.size();
+ rReturn = true;
+ }
+ }
+ }
+
+ return rReturn;
+ }
+ }
+
+ public static void addSmeltingRecipe(ItemStack aStackInput, ItemStack aStackOutput, float aXpGained) {
+
+ GameRegistry.addSmelting(aStackInput, aStackOutput, aXpGained);
+ }
+
+ public static boolean addShapedRecipe(Object Input_1, Object Input_2, Object Input_3, Object Input_4,
+ Object Input_5, Object Input_6, Object Input_7, Object Input_8, Object Input_9, ItemStack aOutputStack) {
+ return addShapedRecipe(
+ new Object[] { Input_1, Input_2, Input_3, Input_4, Input_5, Input_6, Input_7, Input_8, Input_9 },
+ aOutputStack);
+ }
+
+ private static boolean addShapedRecipe(Object[] Inputs, ItemStack aOutputStack) {
+ Object[] Slots = new Object[9];
+
+ String aFullString = "";
+ String aFullStringExpanded = "abcdefghi";
+
+ for (int i = 0; i < 9; i++) {
+ Object o = Inputs[i];
+
+ if (o instanceof ItemStack) {
+ Slots[i] = ItemUtils.getSimpleStack((ItemStack) o, 1);
+ aFullString += aFullStringExpanded.charAt(i);
+ } else if (o instanceof Item) {
+ Slots[i] = ItemUtils.getSimpleStack((Item) o, 1);
+ aFullString += aFullStringExpanded.charAt(i);
+ } else if (o instanceof Block) {
+ Slots[i] = ItemUtils.getSimpleStack((Block) o, 1);
+ aFullString += aFullStringExpanded.charAt(i);
+ } else if (o instanceof String) {
+ Slots[i] = o;
+ aFullString += aFullStringExpanded.charAt(i);
+ } else if (o instanceof ItemData aData) {
+ ItemStack aStackFromGT = ItemUtils.getOrePrefixStack(aData.mPrefix, aData.mMaterial.mMaterial, 1);
+ Slots[i] = aStackFromGT;
+ aFullString += aFullStringExpanded.charAt(i);
+ } else if (o == null) {
+ Slots[i] = null;
+ aFullString += " ";
+ } else {
+ Slots[i] = null;
+ Logger.INFO(
+ "Cleaned a " + o.getClass()
+ .getSimpleName() + " from recipe input.");
+ Logger.INFO("ERROR");
+ CORE.crash("Bad Shaped Recipe.");
+ }
+ }
+ Logger.RECIPE("Using String: " + aFullString);
+
+ String aRow1 = aFullString.substring(0, 3);
+ String aRow2 = aFullString.substring(3, 6);
+ String aRow3 = aFullString.substring(6, 9);
+ Logger.RECIPE("" + aRow1);
+ Logger.RECIPE("" + aRow2);
+ Logger.RECIPE("" + aRow3);
+
+ String[] aStringData = new String[] { aRow1, aRow2, aRow3 };
+ Object[] aDataObject = new Object[19];
+ aDataObject[0] = aStringData;
+ int aIndex = 0;
+
+ for (int u = 1; u < 20; u += 2) {
+ if (aIndex == 9) {
+ break;
+ }
+ if (aFullString.charAt(aIndex) != (' ')) {
+ aDataObject[u] = aFullString.charAt(aIndex);
+ aDataObject[u + 1] = Slots[aIndex];
+ Logger.INFO(
+ "(" + aIndex
+ + ") "
+ + aFullString.charAt(aIndex)
+ + " | "
+ + (Slots[aIndex] instanceof ItemStack ? ItemUtils.getItemName((ItemStack) Slots[aIndex])
+ : Slots[aIndex] instanceof String ? (String) Slots[aIndex] : "Unknown"));
+ }
+ aIndex++;
+ }
+
+ Logger.RECIPE("Data Size: " + aDataObject.length);
+ aDataObject = ArrayUtils.removeNulls(aDataObject);
+ Logger.RECIPE("Clean Size: " + aDataObject.length);
+ Logger.RECIPE("ArrayData: " + Arrays.toString(aDataObject));
+
+ ShapedOreRecipe aRecipe = new ShapedOreRecipe(aOutputStack, aDataObject);
+
+ int size = COMPAT_HANDLER.mRecipesToGenerate.size();
+ COMPAT_HANDLER.mRecipesToGenerate.put(new InternalRecipeObject2(aRecipe));
+ if (COMPAT_HANDLER.mRecipesToGenerate.size() > size) {
+ if (!COMPAT_HANDLER.areInitItemsLoaded) {
+ RegistrationHandler.recipesSuccess++;
+ } else {
+ LateRegistrationHandler.recipesSuccess++;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public static class InternalRecipeObject2 implements RunnableWithInfo<String> {
+
+ final ItemStack mOutput;
+ final ShapedOreRecipe mRecipe;
+ final boolean isValid;
+
+ public InternalRecipeObject2(ShapedOreRecipe aRecipe) {
+ mRecipe = aRecipe;
+ mOutput = aRecipe.getRecipeOutput();
+ if (mOutput != null) {
+ this.isValid = true;
+ } else {
+ this.isValid = false;
+ }
+ }
+
+ @Override
+ public void run() {
+ if (this.isValid) {
+ GameRegistry.addRecipe(mRecipe);
+ } else {
+ Logger.INFO(
+ "[Fix] Invalid shapped recipe outputting " + mOutput != null ? mOutput.getDisplayName()
+ : "Bad Output Item");
+ }
+ }
+
+ @Override
+ public String getInfoData() {
+ if (mOutput != null) {
+ return mOutput.getDisplayName();
+ }
+ return "";
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/gregtech/PollutionUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/gregtech/PollutionUtils.java
new file mode 100644
index 0000000000..4e6e508c15
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/minecraft/gregtech/PollutionUtils.java
@@ -0,0 +1,147 @@
+package gtPlusPlus.core.util.minecraft.gregtech;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords;
+import gregtech.common.GT_Pollution;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.base.cell.BaseItemCell;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class PollutionUtils {
+
+ public static AutoMap<FluidStack> mPollutionFluidStacks = new AutoMap<>();
+
+ public static boolean isPollutionEnabled() {
+ return GT_Mod.gregtechproxy.mPollution;
+ }
+
+ public static boolean addPollution(IGregTechTileEntity te, int pollutionValue) {
+ if (GT_Mod.gregtechproxy.mPollution) {
+ GT_Pollution.addPollution(te, pollutionValue);
+ return true;
+ }
+ return false;
+ }
+
+ public static void addPollution(IHasWorldObjectAndCoords aTileOfSomeSort, int pollutionValue) {
+ if (GT_Mod.gregtechproxy.mPollution) {
+ Chunk c = aTileOfSomeSort.getWorld()
+ .getChunkFromBlockCoords(aTileOfSomeSort.getXCoord(), aTileOfSomeSort.getZCoord());
+ addPollution(c, pollutionValue);
+ }
+ }
+
+ public static void addPollution(Chunk aChunk, int pollutionValue) {
+ if (GT_Mod.gregtechproxy.mPollution) {
+ GT_Pollution.addPollution(aChunk, pollutionValue);
+ }
+ }
+
+ public static void removePollution(IGregTechTileEntity te, int pollutionValue) {
+ addPollution(te, -pollutionValue);
+ }
+
+ public static void removePollution(Chunk aChunk, int pollutionValue) {
+ addPollution(aChunk, -pollutionValue);
+ }
+
+ public static void nullifyPollution(IGregTechTileEntity te) {
+ if (te == null) {
+ return;
+ }
+ nullifyPollution((IHasWorldObjectAndCoords) te);
+ }
+
+ public static void nullifyPollution(IHasWorldObjectAndCoords aTileOfSomeSort) {
+ if (aTileOfSomeSort == null) {
+ return;
+ }
+ Chunk c = aTileOfSomeSort.getWorld()
+ .getChunkFromBlockCoords(aTileOfSomeSort.getXCoord(), aTileOfSomeSort.getZCoord());
+ nullifyPollution(c);
+ }
+
+ public static void nullifyPollution(Chunk aChunk) {
+ if (GT_Mod.gregtechproxy.mPollution) {
+ if (aChunk == null) {
+ return;
+ }
+ int getCurrentPollution = getPollution(aChunk);
+ if (getCurrentPollution > 0) {
+ removePollution(aChunk, getCurrentPollution);
+ }
+ }
+ }
+
+ public static int getPollution(IGregTechTileEntity te) {
+ return GT_Pollution.getPollution(te);
+ }
+
+ public static int getPollution(Chunk te) {
+ return GT_Pollution.getPollution(te);
+ }
+
+ public static void setPollutionFluids() {
+ if (mPollutionFluidStacks.isEmpty()) {
+ FluidStack CD, CM, SD;
+ CD = FluidUtils.getFluidStack("carbondioxide", 1000);
+ CM = FluidUtils.getFluidStack("carbonmonoxide", 1000);
+ SD = FluidUtils.getFluidStack("sulfurdioxide", 1000);
+ if (PollutionUtils.mPollutionFluidStacks.size() == 0) {
+ if (CD != null) {
+ Logger.INFO("[PollutionCompat] Found carbon dioxide fluid, registering it.");
+ PollutionUtils.mPollutionFluidStacks.put(CD);
+ MISC_MATERIALS.CARBON_DIOXIDE.registerComponentForMaterial(CD);
+ ItemStack cellCD = ItemUtils.getItemStackOfAmountFromOreDict("cellCarbonDioxide", 1);
+ if (ItemUtils.checkForInvalidItems(cellCD)) {
+ Logger.INFO("[PollutionCompat] Found carbon dioxide cell, registering component.");
+ MISC_MATERIALS.CARBON_DIOXIDE.registerComponentForMaterial(OrePrefixes.cell, cellCD);
+ } else {
+ Logger.INFO("[PollutionCompat] Did not find carbon dioxide cell, registering new component.");
+ new BaseItemCell(MISC_MATERIALS.CARBON_DIOXIDE);
+ }
+ } else {
+ MaterialGenerator.generate(MISC_MATERIALS.CARBON_DIOXIDE, false, false);
+ }
+
+ if (CM != null) {
+ Logger.INFO("[PollutionCompat] Found carbon monoxide fluid, registering it.");
+ PollutionUtils.mPollutionFluidStacks.put(CM);
+ MISC_MATERIALS.CARBON_MONOXIDE.registerComponentForMaterial(CM);
+ ItemStack cellCD = ItemUtils.getItemStackOfAmountFromOreDict("cellCarbonMonoxide", 1);
+ if (ItemUtils.checkForInvalidItems(cellCD)) {
+ Logger.INFO("[PollutionCompat] Found carbon monoxide cell, registering component.");
+ MISC_MATERIALS.CARBON_MONOXIDE.registerComponentForMaterial(OrePrefixes.cell, cellCD);
+ } else {
+ Logger.INFO("[PollutionCompat] Did not find carbon monoxide cell, registering new component.");
+ new BaseItemCell(MISC_MATERIALS.CARBON_MONOXIDE);
+ }
+ } else {
+ MaterialGenerator.generate(MISC_MATERIALS.CARBON_MONOXIDE, false, false);
+ }
+
+ if (SD != null) {
+ Logger.INFO("[PollutionCompat] Found sulfur dioxide fluid, registering it.");
+ PollutionUtils.mPollutionFluidStacks.put(SD);
+ }
+ }
+ } else {
+ if (mPollutionFluidStacks.size() != 3) {
+ Logger.INFO("Unable to detect all 3 pollution fluids. Found: ");
+ Logger.INFO(ArrayUtils.toString(mPollutionFluidStacks));
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/recipe/GT_RecipeUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/recipe/GT_RecipeUtils.java
new file mode 100644
index 0000000000..c5498e4f59
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/recipe/GT_RecipeUtils.java
@@ -0,0 +1,95 @@
+package gtPlusPlus.core.util.recipe;
+
+import static gtPlusPlus.core.slots.SlotIntegratedCircuit.isRegularProgrammableCircuit;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gnu.trove.map.hash.TCustomHashMap;
+import gnu.trove.set.hash.TCustomHashSet;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.objects.Logger;
+
+public class GT_RecipeUtils {
+
+ public static List<GT_Recipe> removeDuplicates(List<GT_Recipe> inputRecipes, String recipeMapName) {
+ TCustomHashSet<GT_Recipe> recipesHashSet = new TCustomHashSet<>(RecipeHashStrat.RecipeHashingStrategy);
+ ArrayList<GT_Recipe> recipeOutput = new ArrayList<>();
+ TCustomHashMap<GT_Recipe, ItemStack> circuitMap = new TCustomHashMap<>(RecipeHashStrat.RecipeHashingStrategy);
+ int removedRecipeCount = 0;
+
+ for (GT_Recipe recipeInput : inputRecipes) {
+ ItemStack savedCircuit = null;
+ // create a new input ItemStack array that does not contain programmable circuits if they were in the recipe
+ ArrayList<ItemStack> itemInputsWithoutProgrammableCircuit = new ArrayList<>();
+ // iterate over the recipe input items and add them all to a new array without any programmable circuits
+ for (ItemStack itemStack : recipeInput.mInputs) {
+ if (itemStack == null) {
+ continue;
+ }
+ if (isRegularProgrammableCircuit(itemStack) == -1) {
+ itemInputsWithoutProgrammableCircuit.add(itemStack);
+ } else {
+ savedCircuit = itemStack;
+ }
+ }
+ GT_Recipe newRecipe = new GT_Recipe(
+ false,
+ itemInputsWithoutProgrammableCircuit.toArray(new ItemStack[0]),
+ recipeInput.mOutputs,
+ recipeInput.mSpecialItems,
+ recipeInput.mChances,
+ recipeInput.mFluidInputs,
+ recipeInput.mFluidOutputs,
+ recipeInput.mDuration,
+ recipeInput.mEUt,
+ recipeInput.mSpecialValue);
+ if (!recipesHashSet.contains(newRecipe)) {
+ // if the recipes customHashSet does not contain the new recipe then add it
+ recipesHashSet.add(newRecipe);
+ } else {
+ removedRecipeCount++;
+ }
+ if (savedCircuit != null) {
+ // if the current recipe has a circuit and the recipe (without circuits) is already in the
+ // circuit map then check make sure the circuit map saves the recipe with the smallest circuit
+ // damage value. This is to prevent a case where recipe load order would affect which duplicate
+ // recipes with multiple circuit values gets removed.
+ if (circuitMap.containsKey(newRecipe)) {
+ if (circuitMap.get(newRecipe)
+ .getItemDamage() > savedCircuit.getItemDamage()) {
+ circuitMap.put(newRecipe, savedCircuit);
+ }
+ } else {
+ // If the circuit map does not have the recipe in it yet then add it
+ circuitMap.put(newRecipe, savedCircuit);
+ }
+ }
+ }
+ // iterate over all recipes without duplicates and add them to the output. If the recipe had a programmable
+ // circuit in it then add it back with its damage value coming from the circuit map.
+ for (GT_Recipe filteredRecipe : recipesHashSet) {
+ // check to see if the recipe is in the circuit map
+ if (circuitMap.contains(filteredRecipe)) {
+ // add the circuit back
+ // update the item input array with the new input from
+ // ItemInputsWithoutProgrammableCircuit + circuit map circuit
+ filteredRecipe.mInputs = ArrayUtils.add(filteredRecipe.mInputs, circuitMap.get(filteredRecipe));
+ }
+ // if the recipe was not in the circuit map then just add it the output as no updates to the item input
+ // needs to be made
+ recipeOutput.add(filteredRecipe);
+ }
+ // print results to log
+ Logger.INFO(
+ "Recipe Array duplication removal process completed for '" + recipeMapName
+ + "': '"
+ + removedRecipeCount
+ + "' removed.");
+ return recipeOutput;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/recipe/RecipeHashStrat.java b/gtpp/src/main/java/gtPlusPlus/core/util/recipe/RecipeHashStrat.java
new file mode 100644
index 0000000000..18323a4c8b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/recipe/RecipeHashStrat.java
@@ -0,0 +1,116 @@
+package gtPlusPlus.core.util.recipe;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Objects;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gnu.trove.strategy.HashingStrategy;
+import gregtech.api.util.GT_Recipe;
+
+public class RecipeHashStrat {
+
+ public static final HashingStrategy<GT_Recipe> RecipeHashingStrategy = new HashingStrategy<>() {
+
+ @Override
+ public int computeHashCode(GT_Recipe recipe) {
+ return com.google.common.base.Objects.hashCode(recipe.mDuration, recipe.mEUt);
+ }
+
+ @Override
+ public boolean equals(GT_Recipe recipe1, GT_Recipe recipe2) {
+ return areRecipesEqual(recipe1, recipe2);
+ }
+ };
+
+ public static boolean areRecipesEqual(GT_Recipe recipe1, GT_Recipe recipe2) {
+ // both item outputs use a copy to prevent interfering with chance based output orders
+ // sort all the arrays for recipe1
+ RecipeHashStrat.sortItemStackArray(recipe1.mInputs);
+ ItemStack[] recipe1OutputCopy = recipe1.mOutputs.clone();
+ RecipeHashStrat.sortItemStackArray(recipe1OutputCopy);
+ RecipeHashStrat.sortFluidStackArray(recipe1.mFluidInputs);
+ RecipeHashStrat.sortFluidStackArray(recipe1.mFluidOutputs);
+ // sort all the arrays for recipe2
+
+ RecipeHashStrat.sortItemStackArray(recipe2.mInputs);
+ ItemStack[] recipe2OutputCopy = recipe2.mOutputs.clone();
+ RecipeHashStrat.sortItemStackArray(recipe2OutputCopy);
+ RecipeHashStrat.sortFluidStackArray(recipe2.mFluidInputs);
+ RecipeHashStrat.sortFluidStackArray(recipe2.mFluidOutputs);
+
+ // checks if the recipe EUt, Duration, inputs and outputs for both items and fluids are equal
+ if (recipe1.mEUt != recipe2.mEUt) {
+ return false;
+ }
+ if (recipe1.mDuration != recipe2.mDuration) {
+ return false;
+ }
+ if (!areItemsStackArraysEqual(recipe1.mInputs, recipe2.mInputs)) {
+ return false;
+ }
+ if (!areItemsStackArraysEqual(recipe1OutputCopy, recipe2OutputCopy)) {
+ return false;
+ }
+ if (!areFluidStackArraysEqual(recipe1.mFluidInputs, recipe2.mFluidInputs)) {
+ return false;
+ }
+ if (!areFluidStackArraysEqual(recipe1.mFluidOutputs, recipe2.mFluidOutputs)) {
+ return false;
+ }
+ return true;
+
+ }
+
+ public static void sortItemStackArray(ItemStack[] itemStackArray) {
+ Arrays.sort(
+ itemStackArray,
+ Comparator.<ItemStack, Integer>comparing(itemStack -> Item.getIdFromItem(itemStack.getItem()))
+ .thenComparing(ItemStack::getItemDamage)
+ .thenComparing(itemStack -> itemStack.stackSize));
+ }
+
+ public static void sortFluidStackArray(FluidStack[] fluidStackArray) {
+ Arrays.sort(
+ fluidStackArray,
+ Comparator.comparing(FluidStack::getFluidID)
+ .thenComparing(fluidStack -> fluidStack.amount));
+ }
+
+ public static boolean areItemsStackArraysEqual(ItemStack[] array1, ItemStack[] array2) {
+ if (array1.length != array2.length) {
+ return false;
+ }
+ for (int i = 0; i < array1.length; i++) {
+ if (!Objects.equals(array1[i].getItem(), array2[i].getItem())) {
+ return false;
+ }
+ if (!Objects.equals(array1[i].getItemDamage(), array2[i].getItemDamage())) {
+ return false;
+ }
+ if (!Objects.equals(array1[i].stackSize, array2[i].stackSize)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static boolean areFluidStackArraysEqual(FluidStack[] array1, FluidStack[] array2) {
+ if (array1.length != array2.length) {
+ return false;
+ }
+ for (int i = 0; i < array1.length; i++) {
+ // check if the string representation of both FluidStacks are not equal
+ if (!Objects.equals(array1[i].getFluid(), array2[i].getFluid())) {
+ return false;
+ }
+ if (!Objects.equals(array1[i].amount, array2[i].amount)) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/reflect/AddGregtechRecipe.java b/gtpp/src/main/java/gtPlusPlus/core/util/reflect/AddGregtechRecipe.java
new file mode 100644
index 0000000000..807fba9238
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/reflect/AddGregtechRecipe.java
@@ -0,0 +1,77 @@
+package gtPlusPlus.core.util.reflect;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+
+public final class AddGregtechRecipe {
+
+ public static boolean importPyroRecipe(GT_Recipe aRecipe) {
+
+ int aModifiedTime = (int) (aRecipe.mDuration * 0.8);
+
+ if (aRecipe.mInputs == null || aRecipe.mFluidInputs == null
+ || aRecipe.mFluidOutputs == null
+ || aRecipe.mOutputs == null) {
+ return false;
+ }
+ if (aRecipe.mInputs.length > 2 || aRecipe.mFluidInputs.length > 1
+ || aRecipe.mFluidOutputs.length > 1
+ || aRecipe.mOutputs.length > 9) {
+ return false;
+ } else if (aRecipe.mInputs.length <= 0) {
+ return false;
+ }
+
+ int aCircuitNumber = -1;
+ Item aCircuit = CI.getNumberedCircuit(1)
+ .getItem();
+ boolean hasCircuit = false;
+
+ for (ItemStack a : aRecipe.mInputs) {
+ if (a != null && a.getItem() == aCircuit) {
+ hasCircuit = true;
+ aCircuitNumber = a.getItemDamage();
+ break;
+ }
+ }
+
+ ItemStack aInputItem = null;
+ if (!hasCircuit || aCircuitNumber < 1) {
+ return false;
+ }
+
+ for (ItemStack a : aRecipe.mInputs) {
+ if (a != null && a.getItem() != aCircuit) {
+ aInputItem = a;
+ break;
+ }
+ }
+
+ return CORE.RA.addCokeOvenRecipe(
+ aCircuitNumber,
+ aInputItem,
+ aRecipe.mFluidInputs,
+ aRecipe.mFluidOutputs,
+ aRecipe.mOutputs,
+ aModifiedTime,
+ aRecipe.mEUt);
+ }
+
+ @Deprecated
+ public static boolean addCokeAndPyrolyseRecipes(ItemStack input1, int circuitNumber, FluidStack inputFluid1,
+ ItemStack output1, FluidStack outputFluid1, int timeInSeconds, int euTick) {
+ // Seconds Conversion
+ int TIME = timeInSeconds * 20;
+ int TIMEPYRO = TIME + (TIME / 5);
+ // Even though it says coke and pyrolyse, ICO recipes are imported from pyrolyse by #importPyroRecipe
+ GT_Values.RA.addPyrolyseRecipe(input1, inputFluid1, circuitNumber, output1, outputFluid1, TIMEPYRO, euTick);
+
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/reflect/ReflectionUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/reflect/ReflectionUtils.java
new file mode 100644
index 0000000000..078cef6ea8
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/reflect/ReflectionUtils.java
@@ -0,0 +1,727 @@
+package gtPlusPlus.core.util.reflect;
+
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.google.common.reflect.ClassPath;
+import com.gtnewhorizon.gtnhlib.reflect.Fields;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.data.StringUtils;
+
+@SuppressWarnings({ "unchecked", "rawtypes" })
+public class ReflectionUtils {
+
+ public static Map<String, Class<?>> mCachedClasses = new LinkedHashMap<>();
+ public static Map<String, CachedMethod> mCachedMethods = new LinkedHashMap<>();
+ public static Map<String, CachedField> mCachedFields = new LinkedHashMap<>();
+ public static Map<String, CachedConstructor> mCachedConstructors = new LinkedHashMap<>();
+ public static Map<Field, Fields.ClassFields.Field> mCachedFieldAccessors = new LinkedHashMap<>();
+
+ private static class CachedConstructor {
+
+ private final Constructor<?> METHOD;
+
+ public CachedConstructor(Constructor<?> aCons) {
+ METHOD = aCons;
+ }
+
+ public Constructor<?> get() {
+ return METHOD;
+ }
+ }
+
+ private static class CachedMethod {
+
+ private final Method METHOD;
+
+ public CachedMethod(Method aMethod, boolean isStatic) {
+ METHOD = aMethod;
+ }
+
+ public Method get() {
+ return METHOD;
+ }
+
+ }
+
+ private static class CachedField {
+
+ private final Field FIELD;
+
+ public CachedField(Field aField, boolean isStatic) {
+ FIELD = aField;
+ }
+
+ public Field get() {
+ return FIELD;
+ }
+
+ }
+
+ private static Fields.ClassFields.Field cacheAccessor(Field f) {
+ return mCachedFieldAccessors.computeIfAbsent(
+ f,
+ (field) -> Fields.ofClass(field.getDeclaringClass())
+ .getUntypedField(Fields.LookupType.DECLARED_IN_HIERARCHY, field.getName()));
+ }
+
+ private static boolean cacheClass(Class<?> aClass) {
+ if (aClass == null) {
+ return false;
+ }
+ Class<?> y = mCachedClasses.get(aClass.getCanonicalName());
+ if (y == null) {
+ mCachedClasses.put(aClass.getCanonicalName(), aClass);
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean cacheMethod(Class<?> aClass, Method aMethod) {
+ if (aMethod == null) {
+ return false;
+ }
+ boolean isStatic = Modifier.isStatic(aMethod.getModifiers());
+ CachedMethod y = mCachedMethods
+ .get(aClass.getName() + "." + aMethod.getName() + "." + ArrayUtils.toString(aMethod.getParameterTypes()));
+ if (y == null) {
+ mCachedMethods.put(
+ aClass.getName() + "." + aMethod.getName() + "." + ArrayUtils.toString(aMethod.getParameterTypes()),
+ new CachedMethod(aMethod, isStatic));
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean cacheField(Class<?> aClass, Field aField) {
+ if (aField == null) {
+ return false;
+ }
+ boolean isStatic = Modifier.isStatic(aField.getModifiers());
+ CachedField y = mCachedFields.get(aClass.getName() + "." + aField.getName());
+ if (y == null) {
+ mCachedFields.put(aClass.getName() + "." + aField.getName(), new CachedField(aField, isStatic));
+ return true;
+ }
+ return false;
+ }
+
+ private static void cacheConstructor(Class<?> aClass, Constructor<?> aConstructor) {
+ if (aConstructor == null) {
+ return;
+ }
+ mCachedConstructors.computeIfAbsent(
+ aClass.getName() + "." + ArrayUtils.toString(aConstructor.getParameterTypes()),
+ k -> new CachedConstructor(aConstructor));
+ }
+
+ /**
+ * Returns a cached {@link Constructor} object.
+ *
+ * @param aClass - Class containing the Constructor.
+ * @param aTypes - Varags Class Types for objects constructor.
+ * @return - Valid, non-final, {@link Method} object, or {@link null}.
+ */
+ public static Constructor<?> getConstructor(Class<?> aClass, Class<?>... aTypes) {
+ if (aClass == null || aTypes == null) {
+ return null;
+ }
+
+ String aMethodKey = ArrayUtils.toString(aTypes);
+ // Logger.REFLECTION("Looking up method in cache: "+(aClass.getName()+"."+aMethodName + "." + aMethodKey));
+ CachedConstructor y = mCachedConstructors.get(aClass.getName() + "." + aMethodKey);
+ if (y == null) {
+ Constructor<?> u = getConstructor_Internal(aClass, aTypes);
+ if (u != null) {
+ Logger.REFLECTION("Caching Constructor: " + aClass.getName() + "." + aMethodKey);
+ cacheConstructor(aClass, u);
+ return u;
+ } else {
+ return null;
+ }
+ } else {
+ return y.get();
+ }
+ }
+
+ /**
+ * Returns a cached {@link Class} object.
+ *
+ * @param aClassCanonicalName - The canonical name of the underlying class.
+ * @return - Valid, {@link Class} object, or {@link null}.
+ */
+ public static Class<?> getClass(String aClassCanonicalName) {
+ if (aClassCanonicalName == null || aClassCanonicalName.length() <= 0) {
+ return null;
+ }
+ Class<?> y = mCachedClasses.get(aClassCanonicalName);
+ if (y == null) {
+ y = getClass_Internal(aClassCanonicalName);
+ if (y != null) {
+ Logger.REFLECTION("Caching Class: " + aClassCanonicalName);
+ cacheClass(y);
+ }
+ }
+ return y;
+ }
+
+ /**
+ * Returns a cached {@link Method} object. Wraps {@link #getMethod(Class, String, Class...)}.
+ *
+ * @param aObject - Object containing the Method.
+ * @param aMethodName - Method's name in {@link String} form.
+ * @param aTypes - Class Array of Types for {@link Method}'s constructor.
+ * @return - Valid, non-final, {@link Method} object, or {@link null}.
+ */
+ public static Method getMethod(Object aObject, String aMethodName, Class[] aTypes) {
+ return getMethod(aObject.getClass(), aMethodName, aTypes);
+ }
+
+ /**
+ * Returns a cached {@link Method} object.
+ *
+ * @param aClass - Class containing the Method.
+ * @param aMethodName - Method's name in {@link String} form.
+ * @param aTypes - Varags Class Types for {@link Method}'s constructor.
+ * @return - Valid, non-final, {@link Method} object, or {@link null}.
+ */
+ public static Method getMethod(Class<?> aClass, String aMethodName, Class<?>... aTypes) {
+ if (aClass == null || aMethodName == null || aMethodName.length() <= 0) {
+ return null;
+ }
+ String aMethodKey = ArrayUtils.toString(aTypes);
+ // Logger.REFLECTION("Looking up method in cache: "+(aClass.getName()+"."+aMethodName + "." + aMethodKey));
+ CachedMethod y = mCachedMethods.get(aClass.getName() + "." + aMethodName + "." + aMethodKey);
+ if (y == null) {
+ Method u = getMethod_Internal(aClass, aMethodName, aTypes);
+ if (u != null) {
+ Logger.REFLECTION("Caching Method: " + aMethodName + "." + aMethodKey);
+ cacheMethod(aClass, u);
+ return u;
+ } else {
+ return null;
+ }
+ } else {
+ return y.get();
+ }
+ }
+
+ /**
+ * Returns a cached {@link Field} object.
+ *
+ * @param aClass - Class containing the Method.
+ * @param aFieldName - Field name in {@link String} form.
+ * @return - Valid, non-final, {@link Field} object, or {@link null}.
+ */
+ public static Field getField(final Class<?> aClass, final String aFieldName) {
+ if (aClass == null || aFieldName == null || aFieldName.length() <= 0) {
+ return null;
+ }
+ CachedField y = mCachedFields.get(aClass.getName() + "." + aFieldName);
+ if (y == null) {
+ Field u;
+ try {
+ u = getField_Internal(aClass, aFieldName);
+ if (u != null) {
+ Logger.REFLECTION("Caching Field '" + aFieldName + "' from " + aClass.getName());
+ cacheField(aClass, u);
+ return u;
+ }
+ } catch (NoSuchFieldException e) {}
+ return null;
+
+ } else {
+ return y.get();
+ }
+ }
+
+ /**
+ * Returns a cached {@link Field} object.
+ *
+ * @param aInstance - {@link Object} to get the field instance from.
+ * @param aFieldName - Field name in {@link String} form.
+ * @return - Valid, non-final, {@link Field} object, or {@link null}.
+ */
+ public static <T> T getField(final Object aInstance, final String aFieldName) {
+ try {
+ return (T) getField(aInstance.getClass(), aFieldName).get(aInstance);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ return null;
+ }
+ }
+
+ /*
+ * Utility Functions
+ */
+
+ public static boolean doesClassExist(final String classname) {
+ return isClassPresent(classname);
+ }
+
+ public static void makeFieldAccessible(final Field field) {
+ if (!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(
+ field.getDeclaringClass()
+ .getModifiers())) {
+ field.setAccessible(true);
+ }
+ }
+
+ public static void makeMethodAccessible(final Method field) {
+ if (!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(
+ field.getDeclaringClass()
+ .getModifiers())) {
+ field.setAccessible(true);
+ }
+ }
+
+ /**
+ * Get the method name for a depth in call stack. <br />
+ * Utility function
+ *
+ * @param depth depth in the call stack (0 means current method, 1 means call method, ...)
+ * @return Method name
+ */
+ public static String getMethodName(final int depth) {
+ final StackTraceElement[] ste = new Throwable().getStackTrace();
+ // System. out.println(ste[ste.length-depth].getClassName()+"#"+ste[ste.length-depth].getMethodName());
+ if (ste.length < depth) {
+ return "No valid stack.";
+ }
+ return ste[depth + 1].getMethodName();
+ }
+
+ /**
+ *
+ * @param aPackageName - The full {@link Package} name in {@link String} form.
+ * @return - {@link Boolean} object. True if loaded > 0 classes.
+ */
+ public static boolean dynamicallyLoadClassesInPackage(String aPackageName) {
+ ClassLoader classLoader = ReflectionUtils.class.getClassLoader();
+ int loaded = 0;
+ try {
+ ClassPath path = ClassPath.from(classLoader);
+ for (ClassPath.ClassInfo info : path.getTopLevelClassesRecursive(aPackageName)) {
+ Class<?> clazz = Class.forName(info.getName(), true, classLoader);
+ if (clazz != null) {
+ loaded++;
+ Logger.INFO("Found " + clazz.getCanonicalName() + ". [" + loaded + "]");
+ }
+ }
+ } catch (ClassNotFoundException | IOException e) {
+
+ }
+
+ return loaded > 0;
+ }
+
+ public static void loadClass(String aClassName) {
+ try {
+ Class.forName(aClassName, true, ReflectionUtils.class.getClassLoader());
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static boolean setField(final Object object, final String fieldName, final Object fieldValue) {
+ Class<?> clazz;
+ if (object instanceof Class) {
+ clazz = (Class<?>) object;
+ } else {
+ clazz = object.getClass();
+ }
+ while (clazz != null) {
+ try {
+ final Field field = getField(clazz, fieldName);
+ if (field != null) {
+ setFieldValue_Internal(object, field, fieldValue);
+ return true;
+ }
+ } catch (final NoSuchFieldException e) {
+ Logger.REFLECTION("setField(" + object + ", " + fieldName + ") failed.");
+ clazz = clazz.getSuperclass();
+ } catch (final Exception e) {
+ Logger.REFLECTION("setField(" + object + ", " + fieldName + ") failed.");
+ throw new IllegalStateException(e);
+ }
+ }
+ return false;
+ }
+
+ public static boolean setField(final Object object, final Field field, final Object fieldValue) {
+ if (field == null) return false;
+ Class<?> clazz;
+ if (object instanceof Class) {
+ clazz = (Class<?>) object;
+ } else {
+ clazz = object.getClass();
+ }
+ while (clazz != null) {
+ try {
+ final Field field2 = getField(clazz, field.getName());
+ if (field2 != null) {
+ setFieldValue_Internal(object, field, fieldValue);
+ return true;
+ }
+ } catch (final NoSuchFieldException e) {
+ Logger.REFLECTION("setField(" + object + ", " + field.getName() + ") failed.");
+ clazz = clazz.getSuperclass();
+ } catch (final Exception e) {
+ Logger.REFLECTION("setField(" + object + ", " + field.getName() + ") failed.");
+ throw new IllegalStateException(e);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Allows to change the state of an immutable instance. Huh?!?
+ */
+ public static void setFinalFieldValue(Class<?> clazz, String fieldName, Object newValue) {
+ Field nameField = getField(clazz, fieldName);
+ try {
+ setFieldValue_Internal(clazz, nameField, newValue);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ public static void setByte(Object clazz, String fieldName, byte newValue) {
+ Field nameField = getField(clazz.getClass(), fieldName);
+ cacheAccessor(nameField).setValue(null, newValue);
+ }
+
+ public static boolean invokeVoid(Object objectInstance, String methodName, Class[] parameters, Object[] values) {
+ if (objectInstance == null || methodName == null || parameters == null || values == null) {
+ return false;
+ }
+ Class<?> mLocalClass = (objectInstance instanceof Class ? (Class<?>) objectInstance
+ : objectInstance.getClass());
+ Logger.REFLECTION(
+ "Trying to invoke " + methodName + " on an instance of " + mLocalClass.getCanonicalName() + ".");
+ try {
+ Method mInvokingMethod = mLocalClass.getDeclaredMethod(methodName, parameters);
+ if (mInvokingMethod != null) {
+ Logger.REFLECTION(methodName + " was not null.");
+ mInvokingMethod.invoke(objectInstance, values);
+ Logger.REFLECTION("Successfully invoked " + methodName + ".");
+ return true;
+ } else {
+ Logger.REFLECTION(methodName + " is null.");
+ }
+ } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException e) {
+ Logger.REFLECTION(
+ "Failed to Dynamically invoke " + methodName + " on an object of type: " + mLocalClass.getName());
+ }
+
+ Logger.REFLECTION("Invoke failed or did something wrong.");
+ return false;
+ }
+
+ /*
+ * Below Code block is used for determining generic types associated with type<E>
+ */
+
+ /*
+ * End of Generics Block
+ */
+
+ private static Field getField_Internal(final Class<?> clazz, final String fieldName) throws NoSuchFieldException {
+ try {
+ Logger.REFLECTION("Field: Internal Lookup: " + fieldName);
+ Field k = clazz.getDeclaredField(fieldName);
+ makeFieldAccessible(k);
+ return k;
+ } catch (final NoSuchFieldException e) {
+ Logger.REFLECTION("Field: Internal Lookup Failed: " + fieldName);
+ final Class<?> superClass = clazz.getSuperclass();
+ if (superClass == null) {
+ Logger.REFLECTION("Unable to find field '" + fieldName + "'");
+ throw e;
+ }
+ Logger.REFLECTION("Method: Recursion Lookup: " + fieldName + " - Checking in " + superClass.getName());
+ return getField_Internal(superClass, fieldName);
+ }
+ }
+
+ /**
+ * if (isPresent("com.optionaldependency.DependencyClass")) || This block will never execute when the dependency is
+ * not present. There is therefore no more risk of code throwing NoClassDefFoundException.
+ */
+ private static boolean isClassPresent(final String className) {
+ try {
+ Class.forName(className);
+ return true;
+ } catch (final Throwable ex) {
+ // Class or one of its dependencies is not present...
+ return false;
+ }
+ }
+
+ private static Method getMethod_Internal(Class<?> aClass, String aMethodName, Class<?>... aTypes) {
+ Method m = null;
+ try {
+ Logger.REFLECTION("Method: Internal Lookup: " + aMethodName);
+ m = aClass.getDeclaredMethod(aMethodName, aTypes);
+ if (m != null) {
+ m.setAccessible(true);
+ }
+ } catch (Throwable t) {
+ Logger.REFLECTION("Method: Internal Lookup Failed: " + aMethodName);
+ try {
+ m = getMethodRecursively(aClass, aMethodName);
+ } catch (NoSuchMethodException e) {
+ Logger.REFLECTION("Unable to find method '" + aMethodName + "'");
+ e.printStackTrace();
+ dumpClassInfo(aClass);
+ }
+ }
+ return m;
+ }
+
+ private static Constructor<?> getConstructor_Internal(Class<?> aClass, Class<?>... aTypes) {
+ Constructor<?> c = null;
+ try {
+ Logger.REFLECTION("Constructor: Internal Lookup: " + aClass.getName());
+ c = aClass.getDeclaredConstructor(aTypes);
+ if (c != null) {
+ c.setAccessible(true);
+ }
+ } catch (Throwable t) {
+ Logger.REFLECTION("Constructor: Internal Lookup Failed: " + aClass.getName());
+ try {
+ c = getConstructorRecursively(aClass, aTypes);
+ } catch (Exception e) {
+ Logger.REFLECTION("Unable to find method '" + aClass.getName() + "'");
+ e.printStackTrace();
+ dumpClassInfo(aClass);
+ }
+ }
+ return c;
+ }
+
+ private static Constructor<?> getConstructorRecursively(Class<?> aClass, Class<?>... aTypes) throws Exception {
+ try {
+ Logger.REFLECTION("Constructor: Recursion Lookup: " + aClass.getName());
+ Constructor<?> c = aClass.getConstructor(aTypes);
+ if (c != null) {
+ c.setAccessible(true);
+ }
+ return c;
+ } catch (final NoSuchMethodException | IllegalArgumentException e) {
+ final Class<?> superClass = aClass.getSuperclass();
+ if (superClass == null || superClass == Object.class) {
+ throw e;
+ }
+ return getConstructor_Internal(superClass, aTypes);
+ }
+ }
+
+ private static Method getMethodRecursively(final Class<?> clazz, final String aMethodName)
+ throws NoSuchMethodException {
+ try {
+ Logger.REFLECTION("Method: Recursion Lookup: " + aMethodName);
+ Method k = clazz.getDeclaredMethod(aMethodName);
+ makeMethodAccessible(k);
+ return k;
+ } catch (final NoSuchMethodException e) {
+ final Class<?> superClass = clazz.getSuperclass();
+ if (superClass == null || superClass == Object.class) {
+ throw e;
+ }
+ return getMethod_Internal(superClass, aMethodName);
+ }
+ }
+
+ private static void dumpClassInfo(Class<?> aClass) {
+ Logger.INFO(
+ "We ran into an error processing reflection in " + aClass.getName() + ", dumping all data for debugging.");
+ // Get the methods
+ Method[] methods = aClass.getDeclaredMethods();
+ Field[] fields = aClass.getDeclaredFields();
+ Constructor[] consts = aClass.getDeclaredConstructors();
+
+ Logger.INFO("Dumping all Methods.");
+ for (Method method : methods) {
+ System.out
+ .println(method.getName() + " | " + StringUtils.getDataStringFromArray(method.getParameterTypes()));
+ }
+ Logger.INFO("Dumping all Fields.");
+ for (Field f : fields) {
+ System.out.println(f.getName());
+ }
+ Logger.INFO("Dumping all Constructors.");
+ for (Constructor<?> c : consts) {
+ System.out.println(
+ c.getName() + " | "
+ + c.getParameterCount()
+ + " | "
+ + StringUtils.getDataStringFromArray(c.getParameterTypes()));
+ }
+ }
+
+ private static Class<?> getNonPublicClass(final String className) {
+ Class<?> c = null;
+ try {
+ c = Class.forName(className);
+ } catch (final ClassNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ // full package name --------^^^^^^^^^^
+ // or simpler without Class.forName:
+ // Class<package1.A> c = package1.A.class;
+
+ if (null != c) {
+ // In our case we need to use
+ Constructor<?> constructor = null;
+ try {
+ constructor = c.getDeclaredConstructor();
+ } catch (NoSuchMethodException | SecurityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ // note: getConstructor() can return only public constructors
+ // so we needed to search for any Declared constructor
+
+ // now we need to make this constructor accessible
+ if (null != constructor) {
+ constructor.setAccessible(true); // ABRACADABRA!
+
+ try {
+ final Object o = constructor.newInstance();
+ return (Class<?>) o;
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ return null;
+ }
+
+ private static Class<?> getClass_Internal(String string) {
+ Class<?> aClass = null;
+ if (ReflectionUtils.doesClassExist(string)) {
+ try {
+ aClass = Class.forName(string);
+ } catch (ClassNotFoundException e) {
+ aClass = getNonPublicClass(string);
+ }
+ }
+
+ if (aClass == null) {
+ String aClassName = "";
+ Logger.REFLECTION("Splitting " + string + " to try look for hidden classes.");
+ String[] aData = string.split("\\.");
+ Logger.REFLECTION("Obtained " + aData.length + " pieces.");
+ for (int i = 0; i < (aData.length - 1); i++) {
+ aClassName += (i > 0) ? "." + aData[i] : "" + aData[i];
+ Logger.REFLECTION("Building: " + aClassName);
+ }
+ if (aClassName != null && aClassName.length() > 0) {
+ Logger.REFLECTION("Trying to search '" + aClassName + "' for inner classes.");
+ Class<?> clazz = ReflectionUtils.getClass(aClassName);
+ if (clazz != null) {
+ Class[] y = clazz.getDeclaredClasses();
+ if (y == null || y.length <= 0) {
+ Logger.REFLECTION("No hidden inner classes found.");
+ return null;
+ } else {
+ boolean found = false;
+ for (Class<?> h : y) {
+ Logger.REFLECTION("Found hidden inner class: " + h.getCanonicalName());
+ if (h.getSimpleName()
+ .toLowerCase()
+ .equals(aData[aData.length - 1].toLowerCase())) {
+ Logger.REFLECTION(
+ "Found correct class. [" + aData[aData.length - 1]
+ + "] Caching at correct location: "
+ + string);
+ Logger.REFLECTION("Found at location: " + h.getCanonicalName());
+ ReflectionUtils.mCachedClasses.put(string, h);
+ aClass = h;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ return null;
+ }
+ }
+ } else {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ }
+ return aClass;
+ }
+
+ /**
+ *
+ * Set the value of a field reflectively.
+ */
+ private static void setFieldValue_Internal(Object owner, Field field, Object value) throws Exception {
+ cacheAccessor(field).setValue(owner, value);
+ }
+
+ public static boolean doesFieldExist(Class<?> clazz, String string) {
+ if (clazz != null) {
+ if (ReflectionUtils.getField(clazz, string) != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static <T> T getFieldValue(Field field) {
+ return getFieldValue(field, null);
+ }
+
+ public static <T> T getFieldValue(Field field, Object instance) {
+ try {
+ return (T) field.get(instance);
+ } catch (IllegalArgumentException | IllegalAccessException e) {}
+ return null;
+ }
+
+ public static <T> T createNewInstanceFromConstructor(Constructor aConstructor, Object[] aArgs) {
+ T aInstance;
+ try {
+ aInstance = (T) aConstructor.newInstance(aArgs);
+ if (aInstance != null) {
+ return aInstance;
+ }
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static Enum getEnum(Class<Enum> sgtbees, String name) {
+ if (sgtbees.isEnum()) {
+ Object[] aValues = sgtbees.getEnumConstants();
+ for (Object o : aValues) {
+ if (o.toString()
+ .toLowerCase()
+ .equals(name.toLowerCase())) {
+ return (Enum) o;
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/util/sys/KeyboardUtils.java b/gtpp/src/main/java/gtPlusPlus/core/util/sys/KeyboardUtils.java
new file mode 100644
index 0000000000..9c8b471ff6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/util/sys/KeyboardUtils.java
@@ -0,0 +1,37 @@
+package gtPlusPlus.core.util.sys;
+
+import net.minecraft.client.Minecraft;
+
+import org.lwjgl.input.Keyboard;
+
+public class KeyboardUtils {
+
+ public static boolean isCtrlKeyDown() {
+ try {
+ if (!Keyboard.isCreated()) {
+ return false;
+ }
+ // prioritize CONTROL, but allow OPTION as well on Mac (note: GuiScreen's isCtrlKeyDown only checks for the
+ // OPTION key on Mac)
+ boolean isCtrlKeyDown = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL)
+ || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL);
+ if (!isCtrlKeyDown && Minecraft.isRunningOnMac)
+ isCtrlKeyDown = Keyboard.isKeyDown(Keyboard.KEY_LMETA) || Keyboard.isKeyDown(Keyboard.KEY_RMETA);
+
+ return isCtrlKeyDown;
+ } catch (Throwable t) {
+ return false;
+ }
+ }
+
+ public static boolean isShiftKeyDown() {
+ try {
+ if (!Keyboard.isCreated()) {
+ return false;
+ }
+ return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT);
+ } catch (Throwable t) {
+ return false;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/world/explosions/ExplosionHandler.java b/gtpp/src/main/java/gtPlusPlus/core/world/explosions/ExplosionHandler.java
new file mode 100644
index 0000000000..fdad398f6f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/world/explosions/ExplosionHandler.java
@@ -0,0 +1,31 @@
+package gtPlusPlus.core.world.explosions;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.world.World;
+
+public class ExplosionHandler {
+
+ /**
+ * Creates an explosion. Args: entity, x, y, z, strength
+ */
+ public MiningExplosion createExplosion(final World world, final Entity entityObj, final double x, final double y,
+ final double z, final float size, final boolean makesFlames, final boolean makesSmoke) {
+ return this.newExplosion(world, entityObj, x, y, z, size, makesFlames, makesSmoke);
+ }
+
+ /**
+ * returns a new explosion.
+ */
+ public MiningExplosion newExplosion(final World world, final Entity entityObj, final double x, final double y,
+ final double z, final float size, final boolean makesFlames, final boolean makesSmoke) {
+ final MiningExplosion explosion = new MiningExplosion(world, entityObj, x, y, z, size);
+ explosion.isFlaming = makesFlames;
+ explosion.isSmoking = makesSmoke;
+ if (net.minecraftforge.event.ForgeEventFactory.onExplosionStart(world, explosion)) {
+ return explosion;
+ }
+ explosion.doExplosionA();
+ explosion.doExplosionB(true);
+ return explosion;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/core/world/explosions/MiningExplosion.java b/gtpp/src/main/java/gtPlusPlus/core/world/explosions/MiningExplosion.java
new file mode 100644
index 0000000000..4d5473d349
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/core/world/explosions/MiningExplosion.java
@@ -0,0 +1,442 @@
+package gtPlusPlus.core.world.explosions;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.enchantment.EnchantmentProtection;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.ChunkPosition;
+import net.minecraft.world.Explosion;
+import net.minecraft.world.World;
+
+import gregtech.api.objects.XSTR;
+import gtPlusPlus.core.entity.EntityPrimedMiningExplosive;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public class MiningExplosion extends Explosion {
+
+ private final int field_77289_h = 16;
+ private final Random explosionRNG = new XSTR();
+ private final World worldObj;
+
+ private final Map<Entity, Vec3> field_77288_k = new HashMap<>();
+
+ public MiningExplosion(final World worldObj, final Entity entityObj, final double x, final double y, final double z,
+ final float size) {
+ super(worldObj, entityObj, x, y, z, size);
+ this.worldObj = worldObj;
+ this.exploder = entityObj;
+ this.explosionSize = size;
+ this.explosionX = x;
+ this.explosionY = y;
+ this.explosionZ = z;
+ }
+
+ /**
+ * Does the first part of the explosion (destroy blocks)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void doExplosionA() {
+ final float f = this.explosionSize;
+ final HashSet<ChunkPosition> hashset = new HashSet<>();
+ int i;
+ int j;
+ int k;
+ double d5;
+ double d6;
+ double d7;
+
+ for (i = 0; i < this.field_77289_h; ++i) {
+ for (j = 0; j < this.field_77289_h; ++j) {
+ for (k = 0; k < this.field_77289_h; ++k) {
+ if ((i == 0) || (i == (this.field_77289_h - 1))
+ || (j == 0)
+ || (j == (this.field_77289_h - 1))
+ || (k == 0)
+ || (k == (this.field_77289_h - 1))) {
+ double d0 = ((i / (this.field_77289_h - 1.0F)) * 2.0F) - 1.0F;
+ double d1 = ((j / (this.field_77289_h - 1.0F)) * 2.0F) - 1.0F;
+ double d2 = ((k / (this.field_77289_h - 1.0F)) * 2.0F) - 1.0F;
+ final double d3 = Math.sqrt((d0 * d0) + (d1 * d1) + (d2 * d2));
+ d0 /= d3;
+ d1 /= d3;
+ d2 /= d3;
+ float f1 = this.explosionSize * (0.7F + (this.worldObj.rand.nextFloat() * 0.6F));
+ d5 = this.explosionX;
+ d6 = this.explosionY;
+ d7 = this.explosionZ;
+
+ for (final float f2 = 0.3F; f1 > 0.0F; f1 -= f2 * 0.75F) {
+ final int j1 = MathHelper.floor_double(d5);
+ final int k1 = MathHelper.floor_double(d6);
+ final int l1 = MathHelper.floor_double(d7);
+ final Block block = this.worldObj.getBlock(j1, k1, l1);
+
+ if (block.getMaterial() != Material.air) {
+ final float f3 = this.exploder != null
+ ? this.exploder.func_145772_a(this, this.worldObj, j1, k1, l1, block)
+ : block.getExplosionResistance(
+ this.exploder,
+ this.worldObj,
+ j1,
+ k1,
+ l1,
+ this.explosionX,
+ this.explosionY,
+ this.explosionZ);
+ f1 -= (f3 + 0.3F) * f2;
+ }
+
+ if ((f1 > 0.0F) && ((this.exploder == null)
+ || this.exploder.func_145774_a(this, this.worldObj, j1, k1, l1, block, f1))) {
+ hashset.add(new ChunkPosition(j1, k1, l1));
+ }
+
+ d5 += d0 * f2;
+ d6 += d1 * f2;
+ d7 += d2 * f2;
+ }
+ }
+ }
+ }
+ }
+
+ this.affectedBlockPositions.addAll(hashset);
+ this.explosionSize *= 2.0F;
+ i = MathHelper.floor_double(this.explosionX - this.explosionSize - 1.0D);
+ j = MathHelper.floor_double(this.explosionX + this.explosionSize + 1.0D);
+ k = MathHelper.floor_double(this.explosionY - this.explosionSize - 1.0D);
+ final int i2 = MathHelper.floor_double(this.explosionY + this.explosionSize + 1.0D);
+ final int l = MathHelper.floor_double(this.explosionZ - this.explosionSize - 1.0D);
+ final int j2 = MathHelper.floor_double(this.explosionZ + this.explosionSize + 1.0D);
+ final List<Entity> list = this.worldObj
+ .getEntitiesWithinAABBExcludingEntity(this.exploder, AxisAlignedBB.getBoundingBox(i, k, l, j, i2, j2));
+ net.minecraftforge.event.ForgeEventFactory.onExplosionDetonate(this.worldObj, this, list, this.explosionSize);
+ final Vec3 vec3 = Vec3.createVectorHelper(this.explosionX, this.explosionY, this.explosionZ);
+
+ for (final Entity entity : list) {
+ final double d4 = entity.getDistance(this.explosionX, this.explosionY, this.explosionZ)
+ / this.explosionSize;
+
+ if (d4 <= 1.0D) {
+ d5 = entity.posX - this.explosionX;
+ d6 = (entity.posY + entity.getEyeHeight()) - this.explosionY;
+ d7 = entity.posZ - this.explosionZ;
+ final double d9 = MathHelper.sqrt_double((d5 * d5) + (d6 * d6) + (d7 * d7));
+
+ if (d9 != 0.0D) {
+ d5 /= d9;
+ d6 /= d9;
+ d7 /= d9;
+ final double d10 = this.worldObj.getBlockDensity(vec3, entity.boundingBox);
+ final double d11 = (1.0D - d4) * d10;
+ entity.attackEntityFrom(
+ DamageSource.setExplosionSource(this),
+ ((int) (((((d11 * d11) + d11) / 2.0D) * 8.0D * this.explosionSize) + 1.0D)));
+ final double d8 = EnchantmentProtection.func_92092_a(entity, d11);
+ entity.motionX += d5 * d8;
+ entity.motionY += d6 * d8;
+ entity.motionZ += d7 * d8;
+
+ if (entity instanceof EntityPlayer) {
+ this.field_77288_k.put(entity, Vec3.createVectorHelper(d5 * d11, d6 * d11, d7 * d11));
+ }
+ }
+ }
+ }
+
+ this.explosionSize = f;
+ }
+
+ /**
+ * Does the second part of the explosion (sound, particles, drop spawn)
+ */
+ @Override
+ public void doExplosionB(final boolean p_77279_1_) {
+ this.worldObj.playSoundEffect(
+ this.explosionX,
+ this.explosionY,
+ this.explosionZ,
+ "random.explode",
+ 4.0F,
+ (1.0F + ((this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.2F)) * 0.7F);
+
+ if ((this.explosionSize >= 2.0F) && this.isSmoking) {
+ this.worldObj
+ .spawnParticle("hugeexplosion", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "smoke",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "explode",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ } else {
+ this.worldObj
+ .spawnParticle("largeexplode", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle(
+ "smoke",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "explode",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+
+ Iterator<ChunkPosition> iterator;
+ ChunkPosition chunkposition;
+ int i;
+ int j;
+ int k;
+ Block block;
+
+ if (this.isSmoking) {
+ iterator = this.affectedBlockPositions.iterator();
+
+ while (iterator.hasNext()) {
+ chunkposition = iterator.next();
+ i = chunkposition.chunkPosX;
+ j = chunkposition.chunkPosY;
+ k = chunkposition.chunkPosZ;
+ block = this.worldObj.getBlock(i, j, k);
+
+ if (p_77279_1_) {
+ final double d0 = i + this.worldObj.rand.nextFloat();
+ final double d1 = j + this.worldObj.rand.nextFloat();
+ final double d2 = k + this.worldObj.rand.nextFloat();
+ double d3 = d0 - this.explosionX;
+ double d4 = d1 - this.explosionY;
+ double d5 = d2 - this.explosionZ;
+ final double d6 = MathHelper.sqrt_double((d3 * d3) + (d4 * d4) + (d5 * d5));
+ d3 /= d6;
+ d4 /= d6;
+ d5 /= d6;
+ double d7 = 0.5D / ((d6 / this.explosionSize) + 0.1D);
+ d7 *= (this.worldObj.rand.nextFloat() * this.worldObj.rand.nextFloat()) + 0.3F;
+ d3 *= d7;
+ d4 *= d7;
+ d5 *= d7;
+ this.worldObj.spawnParticle(
+ "explode",
+ (d0 + (this.explosionX * 1.0D)) / 2.0D,
+ (d1 + (this.explosionY * 1.0D)) / 2.0D,
+ (d2 + (this.explosionZ * 1.0D)) / 2.0D,
+ d3,
+ d4,
+ d5);
+ this.worldObj.spawnParticle("smoke", d0, d1, d2, d3, d4, d5);
+ this.worldObj.spawnParticle(
+ "smoke",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largesmoke",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "cloud",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "flame",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "explode",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "largeexplode",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ this.worldObj.spawnParticle(
+ "hugeexplosion",
+ this.explosionX + MathUtils.randDouble(0, 1),
+ this.explosionY + MathUtils.randDouble(0, 1),
+ this.explosionZ + MathUtils.randDouble(0, 1),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+
+ if (block.getMaterial() != Material.air) {
+ if (block.canDropFromExplosion(this)) {
+ // world, x, y, z, world.getBlockMetadata(x, y, z), dropProb, 0
+ block.dropBlockAsItemWithChance(
+ this.worldObj,
+ i,
+ j,
+ k,
+ this.worldObj.getBlockMetadata(i, j, k),
+ 1F,
+ 0);
+ }
+
+ block.onBlockExploded(this.worldObj, i, j, k, this);
+ }
+ }
+ }
+
+ if (this.isFlaming) {
+ iterator = this.affectedBlockPositions.iterator();
+
+ while (iterator.hasNext()) {
+ chunkposition = iterator.next();
+ i = chunkposition.chunkPosX;
+ j = chunkposition.chunkPosY;
+ k = chunkposition.chunkPosZ;
+ block = this.worldObj.getBlock(i, j, k);
+ final Block block1 = this.worldObj.getBlock(i, j - 1, k);
+
+ if ((block.getMaterial() == Material.air) && block1.func_149730_j()
+ && (this.explosionRNG.nextInt(3) == 0)) {
+ this.worldObj.setBlock(i, j, k, Blocks.fire);
+ }
+ }
+ }
+ }
+
+ @Override
+ public Map<Entity, Vec3> func_77277_b() {
+ return this.field_77288_k;
+ }
+
+ /**
+ * Returns either the entity that placed the explosive block, the entity that caused the explosion or null.
+ */
+ @Override
+ public EntityLivingBase getExplosivePlacedBy() {
+ return this.exploder == null ? null
+ : (this.exploder instanceof EntityPrimedMiningExplosive
+ ? ((EntityPrimedMiningExplosive) this.exploder).getTntPlacedBy()
+ : (this.exploder instanceof EntityLivingBase ? (EntityLivingBase) this.exploder : null));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/GTplusplus_Everglades.java b/gtpp/src/main/java/gtPlusPlus/everglades/GTplusplus_Everglades.java
new file mode 100644
index 0000000000..34c6b01648
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/GTplusplus_Everglades.java
@@ -0,0 +1,194 @@
+package gtPlusPlus.everglades;
+
+import static gregtech.api.enums.Mods.GTPlusPlusEverglades;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.common.config.Configuration;
+
+import com.github.bartimaeusnek.crossmod.galacticgreg.GT_TileEntity_VoidMiner_Base;
+
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.Mod.EventHandler;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+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.registry.GameRegistry;
+import gregtech.api.enums.Mods;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.lib.CORE.Everglades;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.ORES;
+import gtPlusPlus.everglades.biome.Biome_Everglades;
+import gtPlusPlus.everglades.block.DarkWorldContentLoader;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+import gtPlusPlus.everglades.gen.gt.WorldGen_GT_Base;
+import gtPlusPlus.everglades.gen.gt.WorldGen_GT_Ore_Layer;
+import gtPlusPlus.everglades.gen.gt.WorldGen_Ores;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.xmod.gregtech.HANDLER_GT;
+import gtPlusPlus.xmod.gregtech.api.util.GTPP_Config;
+
+@Mod(
+ modid = Mods.Names.G_T_PLUS_PLUS_EVERGLADES,
+ name = Everglades.NAME,
+ version = Everglades.VERSION,
+ dependencies = "required-after:Forge; after:dreamcraft; after:IC2; required-after:gregtech; required-after:miscutils;")
+public class GTplusplus_Everglades implements ActionListener {
+
+ // Mod Instance
+ @Mod.Instance(Mods.Names.G_T_PLUS_PLUS_EVERGLADES)
+ public static GTplusplus_Everglades instance;
+
+ // Dark World Handler
+ protected static volatile Biome_Everglades Everglades_Biome;
+ protected static volatile Dimension_Everglades Everglades_Dimension;
+
+ // Pre-Init
+ @Mod.EventHandler
+ public void preInit(final FMLPreInitializationEvent event) {
+ Logger.INFO("Loading " + GTPlusPlusEverglades.ID + " V" + Everglades.VERSION);
+
+ // Setup
+ setVars(event);
+
+ setEvergladesBiome(new Biome_Everglades());
+ Everglades_Dimension = new Dimension_Everglades();
+
+ // Load Dark World
+ getEvergladesBiome().instance = instance;
+ Everglades_Dimension.instance = instance;
+ getEvergladesBiome().preInit(event);
+
+ // Load/Set Custom Ore Gen
+ HANDLER_GT.sCustomWorldgenFile = new GTPP_Config(
+ new Configuration(
+ new File(new File(event.getModConfigurationDirectory(), "GTplusplus"), "WorldGeneration.cfg")));
+ }
+
+ @EventHandler
+ public void load(final FMLInitializationEvent e) {
+ Logger.INFO("Begin resource allocation for " + GTPlusPlusEverglades.ID + " V" + Everglades.VERSION);
+
+ // Load World and Biome
+ GameRegistry.registerWorldGenerator(new WorldGen_GT_Base(), Short.MAX_VALUE);
+ getEvergladesBiome().load();
+ Everglades_Dimension.load();
+ addToVoidMinerDrops();
+ }
+
+ public static synchronized void GenerateOreMaterials() {
+ MaterialGenerator.generateOreMaterial(ORES.CROCROITE);
+ MaterialGenerator.generateOreMaterial(ORES.GEIKIELITE);
+ MaterialGenerator.generateOreMaterial(ORES.NICHROMITE);
+ MaterialGenerator.generateOreMaterial(ORES.TITANITE);
+ MaterialGenerator.generateOreMaterial(ORES.ZIMBABWEITE);
+ MaterialGenerator.generateOreMaterial(ORES.ZIRCONILITE);
+ MaterialGenerator.generateOreMaterial(ORES.GADOLINITE_CE);
+ MaterialGenerator.generateOreMaterial(ORES.GADOLINITE_Y);
+ MaterialGenerator.generateOreMaterial(ORES.LEPERSONNITE);
+ MaterialGenerator.generateOreMaterial(ORES.SAMARSKITE_Y);
+ MaterialGenerator.generateOreMaterial(ORES.SAMARSKITE_YB);
+ MaterialGenerator.generateOreMaterial(ORES.XENOTIME);
+ MaterialGenerator.generateOreMaterial(ORES.YTTRIAITE);
+ MaterialGenerator.generateOreMaterial(ORES.YTTRIALITE);
+ MaterialGenerator.generateOreMaterial(ORES.YTTROCERITE);
+ MaterialGenerator.generateOreMaterial(ORES.ZIRCON);
+ MaterialGenerator.generateOreMaterial(ORES.POLYCRASE);
+ MaterialGenerator.generateOreMaterial(ORES.ZIRCOPHYLLITE);
+ MaterialGenerator.generateOreMaterial(ORES.ZIRKELITE);
+ MaterialGenerator.generateOreMaterial(ORES.LANTHANITE_LA);
+ MaterialGenerator.generateOreMaterial(ORES.LANTHANITE_CE);
+ MaterialGenerator.generateOreMaterial(ORES.LANTHANITE_ND);
+ MaterialGenerator.generateOreMaterial(ORES.AGARDITE_Y);
+ MaterialGenerator.generateOreMaterial(ORES.AGARDITE_CD);
+ MaterialGenerator.generateOreMaterial(ORES.AGARDITE_LA);
+ MaterialGenerator.generateOreMaterial(ORES.AGARDITE_ND);
+ MaterialGenerator.generateOreMaterial(ORES.HIBONITE);
+ MaterialGenerator.generateOreMaterial(ORES.CERITE);
+ MaterialGenerator.generateOreMaterial(ORES.FLUORCAPHITE);
+ MaterialGenerator.generateOreMaterial(ORES.FLORENCITE);
+ MaterialGenerator.generateOreMaterial(ORES.CRYOLITE);
+
+ MaterialGenerator.generateOreMaterial(ORES.LAUTARITE);
+ MaterialGenerator.generateOreMaterial(ORES.LAFOSSAITE);
+ MaterialGenerator.generateOreMaterial(ORES.DEMICHELEITE_BR);
+ MaterialGenerator.generateOreMaterial(ORES.COMANCHEITE);
+ MaterialGenerator.generateOreMaterial(ORES.PERROUDITE);
+ MaterialGenerator.generateOreMaterial(ORES.HONEAITE);
+ MaterialGenerator.generateOreMaterial(ORES.ALBURNITE);
+ MaterialGenerator.generateOreMaterial(ORES.MIESSIITE);
+ MaterialGenerator.generateOreMaterial(ORES.KASHINITE);
+ MaterialGenerator.generateOreMaterial(ORES.IRARSITE);
+ MaterialGenerator.generateOreMaterial(ORES.GREENOCKITE);
+ MaterialGenerator.generateOreMaterial(ORES.RADIOBARITE);
+ MaterialGenerator.generateOreMaterial(ORES.DEEP_EARTH_REACTOR_FUEL_DEPOSIT);
+
+ }
+
+ protected synchronized void setVars(FMLPreInitializationEvent event) {
+ // Init WorldGen config.
+ HANDLER_GT.sCustomWorldgenFile = new GTPP_Config(
+ new Configuration(
+ new File(new File(event.getModConfigurationDirectory(), "GTplusplus"), "WorldGeneration.cfg")));
+
+ if (DimensionManager.isDimensionRegistered(Dimension_Everglades.DIMID)) {
+ Dimension_Everglades.DIMID = DimensionManager.getNextFreeDimId();
+ }
+
+ /*
+ * Set World Generation Values
+ */
+ WorldGen_Ores.generateValidOreVeins();
+ WorldGen_GT_Base.oreveinPercentage = 64;
+ WorldGen_GT_Base.oreveinAttempts = 16;
+ WorldGen_GT_Base.oreveinMaxPlacementAttempts = 4;
+ if (CORE_Preloader.DEBUG_MODE || CORE.DEVENV) {
+ WorldGen_GT_Base.debugWorldGen = true;
+ }
+ DarkWorldContentLoader.run();
+ }
+
+ public void addToVoidMinerDrops() {
+ for (WorldGen_GT_Ore_Layer t : WorldGen_Ores.validOreveins.values()) {
+ addVMDrop(t.mPrimaryMeta, 0, t.mWeight);
+ addVMDrop(t.mSecondaryMeta, 0, t.mWeight);
+ addVMDrop(t.mBetweenMeta, 0, t.mWeight);
+ addVMDrop(t.mSporadicMeta, 0, t.mWeight);
+ }
+ }
+
+ public void addVMDrop(Block block, int meta, float weight) {
+ GT_TileEntity_VoidMiner_Base.addBlockToDimensionList(CORE.EVERGLADES_ID, block, meta, weight);
+ }
+
+ @EventHandler
+ public void serverLoad(FMLServerStartingEvent event) {
+ getEvergladesBiome().serverLoad(event);
+ }
+
+ @EventHandler
+ public static void postInit(final FMLPostInitializationEvent e) {
+ Logger.INFO("Finished loading Everglades plugin for GT++.");
+ }
+
+ public static synchronized Biome_Everglades getEvergladesBiome() {
+ return Everglades_Biome;
+ }
+
+ public static synchronized void setEvergladesBiome(Biome_Everglades darkWorld_Biome) {
+ Everglades_Biome = darkWorld_Biome;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ // TODO Auto-generated method stub
+
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/biome/BiomeGenerator_Custom.java b/gtpp/src/main/java/gtPlusPlus/everglades/biome/BiomeGenerator_Custom.java
new file mode 100644
index 0000000000..fce5efca36
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/biome/BiomeGenerator_Custom.java
@@ -0,0 +1,361 @@
+package gtPlusPlus.everglades.biome;
+
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.BIG_SHROOM;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.CACTUS;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.CLAY;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.DEAD_BUSH;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.FLOWERS;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.GRASS;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.LAKE;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.LILYPAD;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.PUMPKIN;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.REED;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.SAND;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.SAND_PASS2;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.SHROOM;
+import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.TREE;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.COAL;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.DIAMOND;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.DIRT;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.GOLD;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.GRAVEL;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.IRON;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.LAPIS;
+import static net.minecraftforge.event.terraingen.OreGenEvent.GenerateMinable.EventType.REDSTONE;
+
+import java.util.Random;
+
+import net.minecraft.block.BlockFlower;
+import net.minecraft.block.material.Material;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.biome.BiomeDecorator;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraft.world.gen.feature.WorldGenAbstractTree;
+import net.minecraft.world.gen.feature.WorldGenBigMushroom;
+import net.minecraft.world.gen.feature.WorldGenCactus;
+import net.minecraft.world.gen.feature.WorldGenDeadBush;
+import net.minecraft.world.gen.feature.WorldGenFlowers;
+import net.minecraft.world.gen.feature.WorldGenLiquids;
+import net.minecraft.world.gen.feature.WorldGenPumpkin;
+import net.minecraft.world.gen.feature.WorldGenReed;
+import net.minecraft.world.gen.feature.WorldGenerator;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.terraingen.DecorateBiomeEvent;
+import net.minecraftforge.event.terraingen.OreGenEvent;
+import net.minecraftforge.event.terraingen.TerrainGen;
+
+import gtPlusPlus.everglades.gen.WorldGenDeadLilly;
+import gtPlusPlus.everglades.gen.WorldGenMinable_Custom;
+
+public class BiomeGenerator_Custom extends BiomeDecorator {
+
+ public WorldGenerator fluoriteGen;
+
+ public BiomeGenerator_Custom() {
+ // Basic Blocks
+ this.sandGen = new WorldGenMinable_Custom(Blocks.sand, 12);
+ this.gravelAsSandGen = new WorldGenMinable_Custom(Blocks.gravel, 8);
+ this.dirtGen = new WorldGenMinable_Custom(Blocks.dirt, 32);
+ this.gravelGen = new WorldGenMinable_Custom(Blocks.gravel, 12);
+
+ // Oregen
+ this.coalGen = new WorldGenMinable_Custom(Blocks.coal_ore, 16);
+ this.ironGen = new WorldGenMinable_Custom(Blocks.iron_ore, 12);
+ this.goldGen = new WorldGenMinable_Custom(Blocks.gold_ore, 12);
+ this.redstoneGen = new WorldGenMinable_Custom(Blocks.redstone_ore, 10);
+ this.diamondGen = new WorldGenMinable_Custom(Blocks.diamond_ore, 12);
+ this.lapisGen = new WorldGenMinable_Custom(Blocks.lapis_ore, 8);
+
+ // Nature
+ this.yellowFlowerGen = new WorldGenFlowers(Blocks.yellow_flower);
+ this.mushroomBrownGen = new WorldGenFlowers(Blocks.brown_mushroom);
+ this.mushroomRedGen = new WorldGenFlowers(Blocks.red_mushroom);
+ this.bigMushroomGen = new WorldGenBigMushroom();
+ this.reedGen = new WorldGenReed();
+ this.cactusGen = new WorldGenCactus();
+ this.waterlilyGen = new WorldGenDeadLilly();
+
+ this.flowersPerChunk = 1;
+ this.grassPerChunk = 5;
+ this.sandPerChunk = 3;
+ this.sandPerChunk2 = 5;
+ this.clayPerChunk = 7;
+
+ this.generateLakes = true;
+ }
+
+ @Override
+ public void decorateChunk(World p_150512_1_, Random p_150512_2_, BiomeGenBase p_150512_3_, int p_150512_4_,
+ int p_150512_5_) {
+ if (this.currentWorld != null) {
+ throw new RuntimeException("Already decorating!!");
+ } else {
+ this.currentWorld = p_150512_1_;
+ this.randomGenerator = p_150512_2_;
+ this.chunk_X = p_150512_4_;
+ this.chunk_Z = p_150512_5_;
+ this.genDecorations(p_150512_3_);
+ this.currentWorld = null;
+ this.randomGenerator = null;
+ }
+ }
+
+ @Override
+ protected void genDecorations(BiomeGenBase p_150513_1_) {
+ MinecraftForge.EVENT_BUS.post(new DecorateBiomeEvent.Pre(currentWorld, randomGenerator, chunk_X, chunk_Z));
+ this.generateOres();
+ int i;
+ int j;
+ int k;
+
+ boolean doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, SAND);
+ for (i = 0; doGen && i < this.sandPerChunk2; ++i) {
+ j = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ k = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ this.sandGen.generate(
+ this.currentWorld,
+ this.randomGenerator,
+ j,
+ this.currentWorld.getTopSolidOrLiquidBlock(j, k),
+ k);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, CLAY);
+ for (i = 0; doGen && i < this.clayPerChunk; ++i) {
+ j = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ k = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ this.clayGen.generate(
+ this.currentWorld,
+ this.randomGenerator,
+ j,
+ this.currentWorld.getTopSolidOrLiquidBlock(j, k),
+ k);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, SAND_PASS2);
+ for (i = 0; doGen && i < this.sandPerChunk; ++i) {
+ j = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ k = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ this.gravelAsSandGen.generate(
+ this.currentWorld,
+ this.randomGenerator,
+ j,
+ this.currentWorld.getTopSolidOrLiquidBlock(j, k),
+ k);
+ }
+
+ i = this.treesPerChunk;
+
+ if (this.randomGenerator.nextInt(10) == 0) {
+ ++i;
+ }
+
+ int l;
+ int i1;
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, TREE);
+ for (j = 0; doGen && j < i; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = this.currentWorld.getHeightValue(k, l);
+ WorldGenAbstractTree worldgenabstracttree = p_150513_1_.func_150567_a(this.randomGenerator);
+ worldgenabstracttree.setScale(1.0D, 1.0D, 1.0D);
+
+ if (worldgenabstracttree.generate(this.currentWorld, this.randomGenerator, k, i1, l)) {
+ worldgenabstracttree.func_150524_b(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, BIG_SHROOM);
+ for (j = 0; doGen && j < this.bigMushroomsPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ this.bigMushroomGen
+ .generate(this.currentWorld, this.randomGenerator, k, this.currentWorld.getHeightValue(k, l), l);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, FLOWERS);
+ for (j = 0; doGen && j < this.flowersPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) + 32);
+ String s = p_150513_1_.func_150572_a(this.randomGenerator, k, i1, l);
+ BlockFlower blockflower = BlockFlower.func_149857_e(s);
+
+ if (blockflower.getMaterial() != Material.air) {
+ this.yellowFlowerGen.func_150550_a(blockflower, BlockFlower.func_149856_f(s));
+ this.yellowFlowerGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, GRASS);
+ for (j = 0; doGen && j < this.grassPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2);
+ WorldGenerator worldgenerator = p_150513_1_.getRandomWorldGenForGrass(this.randomGenerator);
+ worldgenerator.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, DEAD_BUSH);
+ for (j = 0; doGen && j < this.deadBushPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2);
+ (new WorldGenDeadBush(Blocks.deadbush)).generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, LILYPAD);
+ for (j = 0; doGen && j < this.waterlilyPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+
+ for (i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2); i1 > 0
+ && this.currentWorld.isAirBlock(k, i1 - 1, l); --i1) {
+ ;
+ }
+
+ this.waterlilyGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, SHROOM);
+ for (j = 0; doGen && j < this.mushroomsPerChunk; ++j) {
+ if (this.randomGenerator.nextInt(4) == 0) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = this.currentWorld.getHeightValue(k, l);
+ this.mushroomBrownGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ if (this.randomGenerator.nextInt(8) == 0) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2);
+ this.mushroomRedGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+ }
+
+ if (doGen && this.randomGenerator.nextInt(4) == 0) {
+ j = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ k = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ l = nextInt(this.currentWorld.getHeightValue(j, k) * 2);
+ this.mushroomBrownGen.generate(this.currentWorld, this.randomGenerator, j, l, k);
+ }
+
+ if (doGen && this.randomGenerator.nextInt(8) == 0) {
+ j = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ k = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ l = nextInt(this.currentWorld.getHeightValue(j, k) * 2);
+ this.mushroomRedGen.generate(this.currentWorld, this.randomGenerator, j, l, k);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, REED);
+ for (j = 0; doGen && j < this.reedsPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2);
+ this.reedGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ for (j = 0; doGen && j < 10; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2);
+ this.reedGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, PUMPKIN);
+ if (doGen && this.randomGenerator.nextInt(32) == 0) {
+ j = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ k = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ l = nextInt(this.currentWorld.getHeightValue(j, k) * 2);
+ (new WorldGenPumpkin()).generate(this.currentWorld, this.randomGenerator, j, l, k);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, CACTUS);
+ for (j = 0; doGen && j < this.cactiPerChunk; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ i1 = nextInt(this.currentWorld.getHeightValue(k, l) * 2);
+ this.cactusGen.generate(this.currentWorld, this.randomGenerator, k, i1, l);
+ }
+
+ doGen = TerrainGen.decorate(currentWorld, randomGenerator, chunk_X, chunk_Z, LAKE);
+ if (doGen && this.generateLakes) {
+ for (j = 0; j < 50; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.randomGenerator.nextInt(this.randomGenerator.nextInt(248) + 8);
+ i1 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ (new WorldGenLiquids(Blocks.flowing_water)).generate(this.currentWorld, this.randomGenerator, k, l, i1);
+ }
+
+ for (j = 0; j < 20; ++j) {
+ k = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
+ l = this.randomGenerator
+ .nextInt(this.randomGenerator.nextInt(this.randomGenerator.nextInt(240) + 8) + 8);
+ i1 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
+ (new WorldGenLiquids(Blocks.flowing_lava)).generate(this.currentWorld, this.randomGenerator, k, l, i1);
+ }
+ }
+
+ MinecraftForge.EVENT_BUS.post(new DecorateBiomeEvent.Post(currentWorld, randomGenerator, chunk_X, chunk_Z));
+ }
+
+ /**
+ * Standard ore generation helper. Generates most ores.
+ */
+ @Override
+ protected void genStandardOre1(int p_76795_1_, WorldGenerator p_76795_2_, int p_76795_3_, int p_76795_4_) {
+ for (int l = 0; l < p_76795_1_; ++l) {
+ int i1 = this.chunk_X + this.randomGenerator.nextInt(16);
+ int j1 = this.randomGenerator.nextInt(p_76795_4_ - p_76795_3_) + p_76795_3_;
+ int k1 = this.chunk_Z + this.randomGenerator.nextInt(16);
+ p_76795_2_.generate(this.currentWorld, this.randomGenerator, i1, j1, k1);
+ }
+ }
+
+ /**
+ * Standard ore generation helper. Generates Lapis Lazuli.
+ */
+ @Override
+ protected void genStandardOre2(int p_76793_1_, WorldGenerator p_76793_2_, int p_76793_3_, int p_76793_4_) {
+ for (int l = 0; l < p_76793_1_; ++l) {
+ int i1 = this.chunk_X + this.randomGenerator.nextInt(16);
+ int j1 = this.randomGenerator.nextInt(p_76793_4_) + this.randomGenerator.nextInt(p_76793_4_)
+ + (p_76793_3_ - p_76793_4_);
+ int k1 = this.chunk_Z + this.randomGenerator.nextInt(16);
+ p_76793_2_.generate(this.currentWorld, this.randomGenerator, i1, j1, k1);
+ }
+ }
+
+ /**
+ * Generates ores in the current chunk
+ */
+ @Override
+ protected void generateOres() {
+ MinecraftForge.ORE_GEN_BUS.post(new OreGenEvent.Pre(currentWorld, randomGenerator, chunk_X, chunk_Z));
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, dirtGen, chunk_X, chunk_Z, DIRT))
+ this.genStandardOre1(20, this.dirtGen, 0, 256);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, gravelGen, chunk_X, chunk_Z, GRAVEL))
+ this.genStandardOre1(10, this.gravelGen, 0, 256);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, coalGen, chunk_X, chunk_Z, COAL))
+ this.genStandardOre1(20, this.coalGen, 0, 128);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, ironGen, chunk_X, chunk_Z, IRON))
+ this.genStandardOre1(20, this.ironGen, 0, 64);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, goldGen, chunk_X, chunk_Z, GOLD))
+ this.genStandardOre1(2, this.goldGen, 0, 32);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, redstoneGen, chunk_X, chunk_Z, REDSTONE))
+ this.genStandardOre1(8, this.redstoneGen, 0, 16);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, diamondGen, chunk_X, chunk_Z, DIAMOND))
+ this.genStandardOre1(1, this.diamondGen, 0, 16);
+ if (TerrainGen.generateOre(currentWorld, randomGenerator, lapisGen, chunk_X, chunk_Z, LAPIS))
+ this.genStandardOre2(1, this.lapisGen, 16, 16);
+ MinecraftForge.ORE_GEN_BUS.post(new OreGenEvent.Post(currentWorld, randomGenerator, chunk_X, chunk_Z));
+ }
+
+ private int nextInt(int i) {
+ if (i <= 1) return 0;
+ return this.randomGenerator.nextInt(i);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/biome/Biome_Everglades.java b/gtpp/src/main/java/gtPlusPlus/everglades/biome/Biome_Everglades.java
new file mode 100644
index 0000000000..61c8ab5c26
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/biome/Biome_Everglades.java
@@ -0,0 +1,83 @@
+package gtPlusPlus.everglades.biome;
+
+import net.minecraft.entity.monster.EntityPigZombie;
+import net.minecraft.entity.passive.EntityBat;
+import net.minecraft.entity.passive.EntitySquid;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraftforge.common.BiomeDictionary;
+import net.minecraftforge.common.BiomeManager;
+
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import cpw.mods.fml.common.event.FMLServerStartingEvent;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.entity.monster.EntitySickBlaze;
+import gtPlusPlus.core.entity.monster.EntityStaballoyConstruct;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+
+public class Biome_Everglades {
+
+ public static BiomeGenEverglades biome = new BiomeGenEverglades();
+
+ public Object instance;
+
+ public Biome_Everglades() {}
+
+ public void load() {
+ BiomeDictionary.registerBiomeType(biome, BiomeDictionary.Type.DEAD);
+ BiomeManager.addSpawnBiome(biome);
+ }
+
+ public void serverLoad(FMLServerStartingEvent event) {}
+
+ public void preInit(FMLPreInitializationEvent event) {}
+
+ static class BiomeGenEverglades extends BiomeGenBase {
+
+ @SuppressWarnings("unchecked")
+ public BiomeGenEverglades() {
+ super(CORE.EVERGLADESBIOME_ID);
+ // this.setBiomeID();
+ this.theBiomeDecorator = new BiomeGenerator_Custom();
+ this.theBiomeDecorator.treesPerChunk = 10;
+ // Logger.INFO("Dark World Temperature Category: "+getTempCategory());
+ this.setBiomeName("Toxic Everglades");
+ this.topBlock = Dimension_Everglades.blockTopLayer;
+ this.fillerBlock = Dimension_Everglades.blockSecondLayer;
+ this.enableRain = true;
+ this.enableSnow = false;
+ this.rainfall = 0.7F;
+ this.setHeight(new BiomeGenBase.Height(0.3F, 0.5F));
+ this.heightVariation = 0.4F;
+ this.waterColorMultiplier = 0x17290A;
+ this.rootHeight = -0.25f; // Ground level
+
+ this.spawnableMonsterList.clear();
+ this.spawnableCreatureList.clear();
+ this.spawnableWaterCreatureList.clear();
+ this.spawnableCaveCreatureList.clear();
+
+ // Enemies
+ this.spawnableMonsterList.add(new BiomeGenBase.SpawnListEntry(EntitySickBlaze.class, 100, 2, 6));
+ this.spawnableMonsterList.add(new BiomeGenBase.SpawnListEntry(EntityPigZombie.class, 75, 4, 16));
+ this.spawnableMonsterList.add(new BiomeGenBase.SpawnListEntry(EntityStaballoyConstruct.class, 20, 1, 2));
+
+ // Animals
+ this.spawnableWaterCreatureList.add(new BiomeGenBase.SpawnListEntry(EntitySquid.class, 1, 1, 6));
+ this.spawnableCaveCreatureList.add(new BiomeGenBase.SpawnListEntry(EntityBat.class, 10, 8, 8));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getSkyColorByTemp(float par1) {
+ return 0xF67A14;
+ }
+
+ @SuppressWarnings({ "unchecked", "unused" })
+ private boolean addToMonsterSpawnLists(Class<?> EntityClass, int a, int b, int c) {
+ this.spawnableCaveCreatureList.add(new SpawnListEntry(EntityClass, a, b, c));
+ return true;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/biome/GenLayerBiomes.java b/gtpp/src/main/java/gtPlusPlus/everglades/biome/GenLayerBiomes.java
new file mode 100644
index 0000000000..fe799fbe42
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/biome/GenLayerBiomes.java
@@ -0,0 +1,26 @@
+package gtPlusPlus.everglades.biome;
+
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraft.world.gen.layer.GenLayer;
+import net.minecraft.world.gen.layer.IntCache;
+
+public class GenLayerBiomes extends GenLayer {
+
+ protected BiomeGenBase[] allowedBiomes = { Biome_Everglades.biome, };
+
+ public GenLayerBiomes(long seed) {
+ super(seed);
+ }
+
+ @Override
+ public int[] getInts(int x, int z, int width, int depth) {
+ int[] dest = IntCache.getIntCache(width * depth);
+ for (int dz = 0; dz < depth; dz++) {
+ for (int dx = 0; dx < width; dx++) {
+ this.initChunkSeed(dx + x, dz + z);
+ dest[(dx + dz * width)] = this.allowedBiomes[nextInt(this.allowedBiomes.length)].biomeID;
+ }
+ }
+ return dest;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/biome/GenLayerEverglades.java b/gtpp/src/main/java/gtPlusPlus/everglades/biome/GenLayerEverglades.java
new file mode 100644
index 0000000000..dec0ed1429
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/biome/GenLayerEverglades.java
@@ -0,0 +1,32 @@
+package gtPlusPlus.everglades.biome;
+
+import net.minecraft.world.WorldType;
+import net.minecraft.world.gen.layer.GenLayer;
+import net.minecraft.world.gen.layer.GenLayerVoronoiZoom;
+import net.minecraft.world.gen.layer.GenLayerZoom;
+
+public class GenLayerEverglades extends GenLayer {
+
+ public GenLayerEverglades(long seed) {
+ super(seed);
+ }
+
+ public static GenLayer[] makeTheWorld(long seed, WorldType type) {
+ GenLayer biomes = new GenLayerBiomes(1L);
+ biomes = new GenLayerZoom(1000L, biomes);
+ biomes = new GenLayerZoom(1001L, biomes);
+ biomes = new GenLayerZoom(1002L, biomes);
+ biomes = new GenLayerZoom(1003L, biomes);
+ biomes = new GenLayerZoom(1004L, biomes);
+ biomes = new GenLayerZoom(1005L, biomes);
+ GenLayer genlayervoronoizoom = new GenLayerVoronoiZoom(10L, biomes);
+ biomes.initWorldGenSeed(seed);
+ genlayervoronoizoom.initWorldGenSeed(seed);
+ return new GenLayer[] { biomes, genlayervoronoizoom };
+ }
+
+ @Override
+ public int[] getInts(int p_75904_1_, int p_75904_2_, int p_75904_3_, int p_75904_4_) {
+ return new int[] {};
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldGround.java b/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldGround.java
new file mode 100644
index 0000000000..a91ed0cd84
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldGround.java
@@ -0,0 +1,23 @@
+package gtPlusPlus.everglades.block;
+
+import static gregtech.api.enums.Mods.Minecraft;
+
+import net.minecraft.block.BlockGrass;
+
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class BlockDarkWorldGround extends BlockGrass implements ITileTooltip {
+
+ public BlockDarkWorldGround() {
+ this.setCreativeTab(AddToCreativeTab.tabBOP);
+ this.setBlockName("blockDarkWorldGround");
+ this.setHardness(1.0F);
+ this.setBlockTextureName(Minecraft.ID + ":" + "grass");
+ }
+
+ @Override
+ public int getTooltipID() {
+ return 2;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPollutedDirt.java b/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPollutedDirt.java
new file mode 100644
index 0000000000..a99b852a5a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPollutedDirt.java
@@ -0,0 +1,68 @@
+package gtPlusPlus.everglades.block;
+
+import static gregtech.api.enums.Mods.Minecraft;
+
+import net.minecraft.block.BlockDirt;
+import net.minecraft.world.ColorizerGrass;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class BlockDarkWorldPollutedDirt extends BlockDirt implements ITileTooltip {
+
+ public BlockDarkWorldPollutedDirt() {
+ this.setCreativeTab(AddToCreativeTab.tabBOP);
+ this.setBlockName("blockDarkWorldGround2");
+ this.setHardness(0.5F);
+ this.setBlockTextureName(Minecraft.ID + ":" + "dirt");
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getBlockColor() {
+ double d0 = 0.5D;
+ double d1 = 1.0D;
+ return ColorizerGrass.getGrassColor(d0, d1);
+ }
+
+ /**
+ * Returns the color this block should be rendered. Used by leaves.
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderColor(int p_149741_1_) {
+ return this.getBlockColor();
+ }
+
+ /**
+ * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called
+ * when first determining what to render.
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int colorMultiplier(IBlockAccess p_149720_1_, int p_149720_2_, int p_149720_3_, int p_149720_4_) {
+ int l = 0;
+ int i1 = 0;
+ int j1 = 0;
+
+ for (int k1 = -1; k1 <= 1; ++k1) {
+ for (int l1 = -1; l1 <= 1; ++l1) {
+ int i2 = p_149720_1_.getBiomeGenForCoords(p_149720_2_ + l1, p_149720_4_ + k1)
+ .getBiomeGrassColor(p_149720_2_ + l1, p_149720_3_, p_149720_4_ + k1);
+ l += (i2 & 16711680) >> 16;
+ i1 += (i2 & 65280) >> 8;
+ j1 += i2 & 255;
+ }
+ }
+
+ return (l / 9 & 255) << 16 | (i1 / 9 & 255) << 8 | j1 / 9 & 255;
+ }
+
+ @Override
+ public int getTooltipID() {
+ return 3;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPortalFrame.java b/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPortalFrame.java
new file mode 100644
index 0000000000..1f8b82e9ca
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldPortalFrame.java
@@ -0,0 +1,26 @@
+package gtPlusPlus.everglades.block;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class BlockDarkWorldPortalFrame extends Block implements ITileTooltip {
+
+ public BlockDarkWorldPortalFrame() {
+ super(Material.iron);
+ this.setCreativeTab(AddToCreativeTab.tabBOP);
+ this.setBlockName("blockDarkWorldPortalFrame");
+ this.setHardness(3.0F);
+ this.setLightLevel(0.5F);
+ this.setBlockTextureName(GTPlusPlus.ID + ":" + "metro/TEXTURE_TECH_PANEL_A");
+ }
+
+ @Override
+ public int getTooltipID() {
+ return 0;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldSludgeFluid.java b/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldSludgeFluid.java
new file mode 100644
index 0000000000..b4943d1886
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockDarkWorldSludgeFluid.java
@@ -0,0 +1,70 @@
+package gtPlusPlus.everglades.block;
+
+import net.minecraft.block.material.MapColor;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.material.MaterialLiquid;
+import net.minecraftforge.fluids.Fluid;
+
+public class BlockDarkWorldSludgeFluid extends Fluid {
+
+ public static final Material SLUDGE = new MaterialLiquid(MapColor.dirtColor);
+
+ protected static int mapColor = 0xFFFFFFFF;
+ protected static float overlayAlpha = 0.2F;
+ protected static Material material = SLUDGE;
+
+ public BlockDarkWorldSludgeFluid(String fluidName, int rgbColour) {
+ this(fluidName, rgbColour, null);
+ }
+
+ public BlockDarkWorldSludgeFluid(String fluidName, int rgbColour, Float overlayAlpha) {
+ super(fluidName);
+ setColor(rgbColour);
+ if (overlayAlpha != null) {
+ setAlpha(overlayAlpha);
+ } else {
+ setAlpha(0);
+ }
+ }
+
+ @Override
+ public int getColor() {
+ return mapColor;
+ }
+
+ public BlockDarkWorldSludgeFluid setColor(int parColor) {
+ mapColor = parColor;
+ return this;
+ }
+
+ public float getAlpha() {
+ return overlayAlpha;
+ }
+
+ public BlockDarkWorldSludgeFluid setAlpha(float parOverlayAlpha) {
+ overlayAlpha = parOverlayAlpha;
+ return this;
+ }
+
+ /*
+ * public blockDarkWorldSludgeFluid setEmptySound(SoundEvent parSound) { emptySound = parSound; return this; }
+ * public SoundEvent getEmptySound() { return emptySound; }
+ * @Override public blockDarkWorldSludgeFluid setFillSound(SoundEvent parSound) { fillSound = parSound; return this;
+ * }
+ * @Override public SoundEvent getFillSound() { return fillSound; }
+ */
+
+ public BlockDarkWorldSludgeFluid setMaterial(Material parMaterial) {
+ material = parMaterial;
+ return this;
+ }
+
+ public Material getMaterial() {
+ return material;
+ }
+
+ /*
+ * @Override public boolean doesVaporize(FluidStack fluidStack) { if (block == null) return false; return
+ * block.getDefaultState().getMaterial() == getMaterial(); }
+ */
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockEvergladesPortal.java b/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockEvergladesPortal.java
new file mode 100644
index 0000000000..eafa67980d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/block/BlockEvergladesPortal.java
@@ -0,0 +1,393 @@
+package gtPlusPlus.everglades.block;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockBreakable;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.interfaces.ITileTooltip;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+import gtPlusPlus.everglades.world.TeleporterDimensionMod;
+
+public class BlockEvergladesPortal extends BlockBreakable implements ITileTooltip {
+
+ IIcon gor = null, dol = null, st1 = null, st2 = null, st3 = null, st4 = null;
+
+ public BlockEvergladesPortal() {
+ super("portal", Material.portal, false);
+ this.setTickRandomly(true);
+ this.setHardness(-1.0F);
+ this.setLightLevel(0.75F);
+ this.setCreativeTab(CreativeTabs.tabBlock);
+ this.setBlockName("blockDarkWorldPortal");
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public IIcon getIcon(int ordinalSide, int meta) {
+
+ if (ordinalSide == 0) return gor;
+ else if (ordinalSide == 1) return dol;
+ else if (ordinalSide == 2) return st1;
+ else if (ordinalSide == 3) return st2;
+ else if (ordinalSide == 4) return st4;
+ else if (ordinalSide == 5) return st3;
+ else return gor;
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void registerBlockIcons(IIconRegister reg) {
+ this.gor = reg.registerIcon("portal");
+ this.dol = reg.registerIcon("portal");
+ this.st1 = reg.registerIcon("portal");
+ this.st2 = reg.registerIcon("portal");
+ this.st3 = reg.registerIcon("portal");
+ this.st4 = reg.registerIcon("portal");
+ }
+
+ /**
+ * Ticks the block if it's been scheduled
+ */
+ @Override
+ public void updateTick(World par1World, int x, int y, int z, Random par5Random) {
+ super.updateTick(par1World, x, y, z, par5Random);
+
+ int blockCount = 0;
+ BlockPos portal = new BlockPos(x, y, z, par1World.provider.dimensionId);
+
+ for (BlockPos side : portal.getSurroundingBlocks()) {
+ Block b = side.getBlockAtPos();
+ if (b == Dimension_Everglades.blockPortalFrame || b == Dimension_Everglades.portalBlock) {
+ blockCount++;
+ }
+ }
+ if (blockCount < 4) {
+ par1World.setBlockToAir(x, y, z);
+ }
+ }
+
+ /**
+ * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
+ * cleared to be reused)
+ */
+ @Override
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) {
+ return null;
+ }
+
+ /**
+ * Updates the blocks bounds based on its current state. Args: world, x, y, z
+ */
+ @Override
+ public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) {
+ float f;
+ float f1;
+ if (par1IBlockAccess.getBlock(par2 - 1, par3, par4) != this
+ && par1IBlockAccess.getBlock(par2 + 1, par3, par4) != this) {
+ f = 0.125F;
+ f1 = 0.5F;
+ this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f1, 0.5F + f, 1.0F, 0.5F + f1);
+ } else {
+ f = 0.5F;
+ f1 = 0.125F;
+ this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f1, 0.5F + f, 1.0F, 0.5F + f1);
+ }
+ }
+
+ /**
+ * Is this block (a) opaque and (B) a full 1m cube? This determines whether or not to render the shared face of two
+ * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
+ */
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ /**
+ * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
+ */
+ @Override
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ /**
+ * Checks to see if this location is valid to create a portal and will return True if it does. Args: world, x, y, z
+ */
+ public boolean tryToCreatePortal(World par1World, int par2, int par3, int par4) {
+ byte b0 = 0;
+ byte b1 = 0;
+ if (par1World.getBlock(par2 - 1, par3, par4) == Dimension_Everglades.blockPortalFrame
+ || par1World.getBlock(par2 + 1, par3, par4) == Dimension_Everglades.blockPortalFrame) {
+ b0 = 1;
+ }
+ if (par1World.getBlock(par2, par3, par4 - 1) == Dimension_Everglades.blockPortalFrame
+ || par1World.getBlock(par2, par3, par4 + 1) == Dimension_Everglades.blockPortalFrame) {
+ b1 = 1;
+ }
+ if (b0 == b1) {
+ return false;
+ } else {
+ if (par1World.getBlock(par2 - b0, par3, par4 - b1) == Blocks.air) {
+ par2 -= b0;
+ par4 -= b1;
+ }
+ int l;
+ int i1;
+ for (l = -1; l <= 2; ++l) {
+ for (i1 = -1; i1 <= 3; ++i1) {
+ boolean flag = l == -1 || l == 2 || i1 == -1 || i1 == 3;
+ if (l != -1 && l != 2 || i1 != -1 && i1 != 3) {
+ Block j1 = par1World.getBlock(par2 + b0 * l, par3 + i1, par4 + b1 * l);
+ if (flag) {
+ if (j1 != Dimension_Everglades.blockPortalFrame) {
+ return false;
+ }
+ }
+ /*
+ * else if (j1 != 0 && j1 != Main.TutorialFire.blockID) { return false; }
+ */
+ }
+ }
+ }
+ for (l = 0; l < 2; ++l) {
+ for (i1 = 0; i1 < 3; ++i1) {
+ par1World.setBlock(par2 + b0 * l, par3 + i1, par4 + b1 * l, this, 0, 2);
+ }
+ }
+ return true;
+ }
+ }
+
+ /**
+ * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
+ * their own) Args: x, y, z, neighbor blockID
+ */
+ public void onNeighborBlockChange(BlockPos pos) {
+ int x = pos.xPos, y = pos.yPos, z = pos.zPos;
+ Logger.INFO("Trigger");
+ int blockCount = 0;
+ BlockPos portal = pos;
+ World par1World = portal.world;
+ for (BlockPos side : portal.getSurroundingBlocks()) {
+ Block b = side.getBlockAtPos();
+ if (b == Dimension_Everglades.blockPortalFrame || b == Dimension_Everglades.portalBlock) {
+ blockCount++;
+ }
+ }
+ if (blockCount < 4) {
+ par1World.setBlockToAir(x, y, z);
+ par1World.scheduleBlockUpdate(x, y, z, portal.getBlockAtPos(), 0);
+ }
+
+ byte b0 = 0;
+ byte b1 = 1;
+ if (par1World.getBlock(x - 1, y, z) == this || par1World.getBlock(x + 1, y, z) == this) {
+ b0 = 1;
+ b1 = 0;
+ }
+ int i1;
+ for (i1 = y; par1World.getBlock(x, i1 - 1, z) == this; --i1) {
+ ;
+ }
+ if (par1World.getBlock(x, i1 - 1, z) != Dimension_Everglades.blockPortalFrame) {
+ par1World.setBlockToAir(x, y, z);
+ } else {
+ int j1;
+ for (j1 = 1; j1 < 4 && par1World.getBlock(x, i1 + j1, z) == this; ++j1) {
+ ;
+ }
+ if (j1 == 3 && par1World.getBlock(x, i1 + j1, z) == Dimension_Everglades.blockPortalFrame) {
+ boolean flag = par1World.getBlock(x - 1, y, z) == this || par1World.getBlock(x + 1, y, z) == this;
+ boolean flag1 = par1World.getBlock(x, y, z - 1) == this || par1World.getBlock(x, y, z + 1) == this;
+ if (flag && flag1) {
+ par1World.setBlockToAir(x, y, z);
+ } else {
+ if ((par1World.getBlock(x + b0, y, z + b1) != Dimension_Everglades.blockPortalFrame
+ || par1World.getBlock(x - b0, y, z - b1) != this)
+ && (par1World.getBlock(x - b0, y, z - b1) != Dimension_Everglades.blockPortalFrame
+ || par1World.getBlock(x + b0, y, z + b1) != this)) {
+ par1World.setBlockToAir(x, y, z);
+ }
+ }
+ } else {
+ par1World.setBlockToAir(x, y, z);
+ }
+ }
+ }
+
+ @Override
+ public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
+ onNeighborBlockChange(new BlockPos(x, y, z, world.provider.dimensionId));
+ super.onNeighborBlockChange(world, x, y, z, block);
+ }
+
+ /*
+ * @Override public void onNeighborChange(IBlockAccess world, int x, int y, int z, int tileX, int tileY, int tileZ)
+ * { onNeighborBlockChange(new BlockPos(x, y, z, world.)); super.onNeighborChange(world, x, y, z, tileX, tileY,
+ * tileZ); }
+ */
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ /**
+ * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
+ * coordinates. Args: blockAccess, x, y, z, side
+ */
+ public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) {
+ if (par1IBlockAccess.getBlock(par2, par3, par4) == this) {
+ return false;
+ } else {
+ boolean flag = par1IBlockAccess.getBlock(par2 - 1, par3, par4) == this
+ && par1IBlockAccess.getBlock(par2 - 2, par3, par4) != this;
+ boolean flag1 = par1IBlockAccess.getBlock(par2 + 1, par3, par4) == this
+ && par1IBlockAccess.getBlock(par2 + 2, par3, par4) != this;
+ boolean flag2 = par1IBlockAccess.getBlock(par2, par3, par4 - 1) == this
+ && par1IBlockAccess.getBlock(par2, par3, par4 - 2) != this;
+ boolean flag3 = par1IBlockAccess.getBlock(par2, par3, par4 + 1) == this
+ && par1IBlockAccess.getBlock(par2, par3, par4 + 2) != this;
+ boolean flag4 = flag || flag1;
+ boolean flag5 = flag2 || flag3;
+ return flag4 && par5 == 4 ? true
+ : (flag4 && par5 == 5 ? true : (flag5 && par5 == 2 ? true : flag5 && par5 == 3));
+ }
+ }
+
+ /**
+ * Returns the quantity of items to drop on block destruction.
+ */
+ @Override
+ public int quantityDropped(Random par1Random) {
+ return 0;
+ }
+
+ /**
+ * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity
+ */
+ @Override
+ public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity) {
+ if ((par5Entity.ridingEntity == null) && (par5Entity.riddenByEntity == null)
+ && ((par5Entity instanceof EntityPlayerMP thePlayer))) {
+ if (thePlayer.timeUntilPortal > 0) {
+ thePlayer.timeUntilPortal = 100;
+ } else if (thePlayer.dimension != Dimension_Everglades.DIMID) {
+ thePlayer.timeUntilPortal = 100;
+ thePlayer.mcServer.getConfigurationManager()
+ .transferPlayerToDimension(
+ thePlayer,
+ Dimension_Everglades.DIMID,
+ new TeleporterDimensionMod(
+ thePlayer.mcServer.worldServerForDimension(Dimension_Everglades.DIMID)));
+ } else {
+ thePlayer.timeUntilPortal = 100;
+ thePlayer.mcServer.getConfigurationManager()
+ .transferPlayerToDimension(
+ thePlayer,
+ 0,
+ new TeleporterDimensionMod(thePlayer.mcServer.worldServerForDimension(0)));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ /**
+ * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
+ */
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ /**
+ * A randomly called display update to be able to add particles or other items for display
+ */
+ public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random) {
+ if (CORE.RANDOM.nextInt(100) == 0) {
+ par1World.playSound(
+ par2 + 0.5D,
+ par3 + 0.5D,
+ par4 + 0.5D,
+ "portal.portal",
+ 0.5F,
+ CORE.RANDOM.nextFloat() * 0.4F + 0.8F,
+ false);
+ }
+ for (int l = 0; l < 4; ++l) {
+ double d0 = par2 + CORE.RANDOM.nextFloat();
+ double d1 = par3 + CORE.RANDOM.nextFloat();
+ double d2 = par4 + CORE.RANDOM.nextFloat();
+ double d3 = 0.0D;
+ double d4 = 0.0D;
+ double d5 = 0.0D;
+ int i1 = CORE.RANDOM.nextInt(2) * 2 - 1;
+ d3 = (CORE.RANDOM.nextFloat() - 0.5D) * 0.5D;
+ d4 = (CORE.RANDOM.nextFloat() - 0.5D) * 0.5D;
+ d5 = (CORE.RANDOM.nextFloat() - 0.5D) * 0.5D;
+ if (par1World.getBlock(par2 - 1, par3, par4) != this && par1World.getBlock(par2 + 1, par3, par4) != this) {
+ d0 = par2 + 0.5D + 0.25D * i1;
+ d3 = CORE.RANDOM.nextFloat() * 2.0F * i1;
+ } else {
+ d2 = par4 + 0.5D + 0.25D * i1;
+ d5 = CORE.RANDOM.nextFloat() * 2.0F * i1;
+ }
+ par1World.spawnParticle("reddust", d0 + 0.1D, d1, d2, d3, d4, d5);
+ par1World.spawnParticle("smoke", d0, d1 + 0.1D, d2, 0, 0, 0);
+
+ Random R = new Random();
+
+ if (R.nextInt(10) == 0) {
+ par1World.spawnParticle("largesmoke", d0, d1, d2, 0, 0 + 0.2D, 0);
+ } else if (R.nextInt(5) == 1) {
+ par1World.spawnParticle("flame", d0, d1, d2, 0, 0 + 0.1D, 0);
+ }
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ /**
+ * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
+ */
+ public int idPicked(World par1World, int par2, int par3, int par4) {
+ return 0;
+ }
+
+ @Override
+ public int colorMultiplier(final IBlockAccess par1IBlockAccess, final int par2, final int par3, final int par4) {
+ return Utils.rgbtoHexValue(0, 255, 0);
+ }
+
+ @Override
+ public int getRenderColor(final int aMeta) {
+ return Utils.rgbtoHexValue(0, 255, 0);
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return EnumChatFormatting.OBFUSCATED + super.getLocalizedName();
+ }
+
+ @Override
+ public int getTooltipID() {
+ return 1;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/block/DarkWorldContentLoader.java b/gtpp/src/main/java/gtPlusPlus/everglades/block/DarkWorldContentLoader.java
new file mode 100644
index 0000000000..7cbc1cb5e0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/block/DarkWorldContentLoader.java
@@ -0,0 +1,73 @@
+package gtPlusPlus.everglades.block;
+
+import static gtPlusPlus.everglades.dimension.Dimension_Everglades.blockFluidLakes;
+import static gtPlusPlus.everglades.dimension.Dimension_Everglades.blockPortalFrame;
+import static gtPlusPlus.everglades.dimension.Dimension_Everglades.blockSecondLayer;
+import static gtPlusPlus.everglades.dimension.Dimension_Everglades.blockTopLayer;
+import static gtPlusPlus.everglades.dimension.Dimension_Everglades.portalBlock;
+import static gtPlusPlus.everglades.dimension.Dimension_Everglades.portalItem;
+
+import net.minecraft.init.Blocks;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.block.base.BlockBaseFluid;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.everglades.item.ItemBlockToxicEverglades;
+import gtPlusPlus.everglades.item.ItemEvergladesPortalTrigger;
+
+public class DarkWorldContentLoader {
+
+ // Static Vars
+ public static BlockDarkWorldSludgeFluid SLUDGE;
+
+ public static synchronized void run() {
+ initMisc();
+ initItems();
+ initBlocks();
+ }
+
+ public static synchronized boolean initMisc() {
+
+ // Fluids
+ SLUDGE = (BlockDarkWorldSludgeFluid) new BlockDarkWorldSludgeFluid("sludge", Utils.rgbtoHexValue(30, 130, 30))
+ .setDensity(1800)
+ .setGaseous(false)
+ .setLuminosity(2)
+ .setViscosity(25000)
+ .setTemperature(300);
+ FluidRegistry.registerFluid(SLUDGE);
+
+ return true;
+ }
+
+ public static synchronized boolean initItems() {
+ portalItem = (ItemEvergladesPortalTrigger) (new ItemEvergladesPortalTrigger()
+ .setUnlocalizedName("everglades.trigger"));
+ GameRegistry.registerItem(portalItem, "everglades.trigger");
+ return true;
+ }
+
+ public static synchronized boolean initBlocks() {
+
+ // Create Block Instances
+ blockFluidLakes = new BlockBaseFluid("Sludge", SLUDGE, BlockDarkWorldSludgeFluid.SLUDGE).setLightLevel(2f)
+ .setLightOpacity(1)
+ .setBlockName("fluidSludge");
+ portalBlock = new BlockEvergladesPortal();
+ blockTopLayer = new BlockDarkWorldGround();
+ blockSecondLayer = new BlockDarkWorldPollutedDirt();
+ blockPortalFrame = new BlockDarkWorldPortalFrame();
+
+ // Registry
+ GameRegistry.registerBlock(portalBlock, ItemBlockToxicEverglades.class, "dimensionDarkWorld_portal");
+ GameRegistry.registerBlock(blockTopLayer, ItemBlockToxicEverglades.class, "blockDarkWorldGround");
+ GameRegistry.registerBlock(blockSecondLayer, ItemBlockToxicEverglades.class, "blockDarkWorldGround2");
+ GameRegistry.registerBlock(blockPortalFrame, ItemBlockToxicEverglades.class, "blockDarkWorldPortalFrame");
+
+ // Make Flammable
+ Blocks.fire.setFireInfo(blockTopLayer, 30, 20);
+
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/chunk/ChunkProviderModded.java b/gtpp/src/main/java/gtPlusPlus/everglades/chunk/ChunkProviderModded.java
new file mode 100644
index 0000000000..ad0c601092
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/chunk/ChunkProviderModded.java
@@ -0,0 +1,560 @@
+package gtPlusPlus.everglades.chunk;
+
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockFalling;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.IProgressUpdate;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.ChunkPosition;
+import net.minecraft.world.SpawnerAnimals;
+import net.minecraft.world.World;
+import net.minecraft.world.WorldType;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraft.world.chunk.IChunkProvider;
+import net.minecraft.world.gen.MapGenBase;
+import net.minecraft.world.gen.MapGenCaves;
+import net.minecraft.world.gen.MapGenRavine;
+import net.minecraft.world.gen.NoiseGenerator;
+import net.minecraft.world.gen.NoiseGeneratorOctaves;
+import net.minecraft.world.gen.NoiseGeneratorPerlin;
+import net.minecraft.world.gen.feature.WorldGenLakes;
+import net.minecraft.world.gen.structure.MapGenMineshaft;
+import net.minecraft.world.gen.structure.MapGenScatteredFeature;
+import net.minecraft.world.gen.structure.MapGenVillage;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.terraingen.ChunkProviderEvent;
+import net.minecraftforge.event.terraingen.PopulateChunkEvent;
+import net.minecraftforge.event.terraingen.TerrainGen;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+
+public class ChunkProviderModded implements IChunkProvider {
+
+ private Random rand;
+ private NoiseGeneratorOctaves field_147431_j;
+ private NoiseGeneratorOctaves field_147432_k;
+ private NoiseGeneratorOctaves field_147429_l;
+ private NoiseGeneratorPerlin field_147430_m;
+ /**
+ * A NoiseGeneratorOctaves used in generating terrain
+ */
+ public NoiseGeneratorOctaves noiseGen5;
+ /**
+ * A NoiseGeneratorOctaves used in generating terrain
+ */
+ public NoiseGeneratorOctaves noiseGen6;
+ public NoiseGeneratorOctaves mobSpawnerNoise;
+ /**
+ * Reference to the World object.
+ */
+ private World worldObj;
+ private WorldType field_147435_p;
+ private final double[] field_147434_q;
+ private final float[] parabolicField;
+ private double[] stoneNoise = new double[256];
+ private MapGenBase caveGenerator = new MapGenCaves();
+ /**
+ * Holds Stronghold Generator
+ */
+ /**
+ * Holds Village Generator
+ */
+ private MapGenVillage villageGenerator = new MapGenVillage();
+ /**
+ * Holds Mineshaft Generator
+ */
+ private MapGenMineshaft mineshaftGenerator = new MapGenMineshaft();
+ private MapGenScatteredFeature scatteredFeatureGenerator = new MapGenScatteredFeature();
+ /**
+ * Holds ravine generator
+ */
+ private MapGenBase ravineGenerator = new MapGenRavine();
+ /**
+ * The biomes that are used to generate the chunk
+ */
+ private BiomeGenBase[] biomesForGeneration;
+ double[] field_147427_d;
+ double[] field_147428_e;
+ double[] field_147425_f;
+ double[] field_147426_g;
+ int[][] field_73219_j = new int[32][32];
+ {
+ caveGenerator = TerrainGen
+ .getModdedMapGen(caveGenerator, net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.CAVE);
+ /*
+ * strongholdGenerator = (MapGenStronghold) TerrainGen.getModdedMapGen(strongholdGenerator,
+ * net.minecraftforge.event.terraingen.InitMapGenEvent.EventType. STRONGHOLD);
+ */
+ villageGenerator = (MapGenVillage) TerrainGen
+ .getModdedMapGen(villageGenerator, net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.VILLAGE);
+ mineshaftGenerator = (MapGenMineshaft) TerrainGen.getModdedMapGen(
+ mineshaftGenerator,
+ net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.MINESHAFT);
+ scatteredFeatureGenerator = (MapGenScatteredFeature) TerrainGen.getModdedMapGen(
+ scatteredFeatureGenerator,
+ net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.SCATTERED_FEATURE);
+ ravineGenerator = TerrainGen
+ .getModdedMapGen(ravineGenerator, net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.RAVINE);
+ }
+
+ public ChunkProviderModded(World par1World, long par2) {
+ this.worldObj = par1World;
+ this.field_147435_p = par1World.getWorldInfo()
+ .getTerrainType();
+ this.rand = new Random(par2);
+ this.field_147431_j = new NoiseGeneratorOctaves(this.rand, 16);
+ this.field_147432_k = new NoiseGeneratorOctaves(this.rand, 16);
+ this.field_147429_l = new NoiseGeneratorOctaves(this.rand, 8);
+ this.field_147430_m = new NoiseGeneratorPerlin(this.rand, 4);
+ this.noiseGen5 = new NoiseGeneratorOctaves(this.rand, 10);
+ this.noiseGen6 = new NoiseGeneratorOctaves(this.rand, 16);
+ this.mobSpawnerNoise = new NoiseGeneratorOctaves(this.rand, 8);
+ this.field_147434_q = new double[825];
+ this.parabolicField = new float[25];
+
+ for (int j = -2; j <= 2; ++j) {
+ for (int k = -2; k <= 2; ++k) {
+ float f = 10.0F / MathHelper.sqrt_float(j * j + k * k + 0.2F);
+ this.parabolicField[j + 2 + (k + 2) * 5] = f;
+ }
+ }
+
+ NoiseGenerator[] noiseGens = { field_147431_j, field_147432_k, field_147429_l, field_147430_m, noiseGen5,
+ noiseGen6, mobSpawnerNoise };
+ noiseGens = TerrainGen.getModdedNoiseGenerators(par1World, this.rand, noiseGens);
+ this.field_147431_j = (NoiseGeneratorOctaves) noiseGens[0];
+ this.field_147432_k = (NoiseGeneratorOctaves) noiseGens[1];
+ this.field_147429_l = (NoiseGeneratorOctaves) noiseGens[2];
+ this.field_147430_m = (NoiseGeneratorPerlin) noiseGens[3];
+ this.noiseGen5 = (NoiseGeneratorOctaves) noiseGens[4];
+ this.noiseGen6 = (NoiseGeneratorOctaves) noiseGens[5];
+ this.mobSpawnerNoise = (NoiseGeneratorOctaves) noiseGens[6];
+ }
+
+ public void func_147424_a(int p_147424_1_, int p_147424_2_, Block[] p_147424_3_) {
+ byte b0 = 63;
+ this.biomesForGeneration = this.worldObj.getWorldChunkManager()
+ .getBiomesForGeneration(this.biomesForGeneration, p_147424_1_ * 4 - 2, p_147424_2_ * 4 - 2, 10, 10);
+ this.func_147423_a(p_147424_1_ * 4, 0, p_147424_2_ * 4);
+
+ for (int k = 0; k < 4; ++k) {
+ int l = k * 5;
+ int i1 = (k + 1) * 5;
+
+ for (int j1 = 0; j1 < 4; ++j1) {
+ int k1 = (l + j1) * 33;
+ int l1 = (l + j1 + 1) * 33;
+ int i2 = (i1 + j1) * 33;
+ int j2 = (i1 + j1 + 1) * 33;
+
+ for (int k2 = 0; k2 < 32; ++k2) {
+ double d0 = 0.125D;
+ double d1 = this.field_147434_q[k1 + k2];
+ double d2 = this.field_147434_q[l1 + k2];
+ double d3 = this.field_147434_q[i2 + k2];
+ double d4 = this.field_147434_q[j2 + k2];
+ double d5 = (this.field_147434_q[k1 + k2 + 1] - d1) * d0;
+ double d6 = (this.field_147434_q[l1 + k2 + 1] - d2) * d0;
+ double d7 = (this.field_147434_q[i2 + k2 + 1] - d3) * d0;
+ double d8 = (this.field_147434_q[j2 + k2 + 1] - d4) * d0;
+
+ for (int l2 = 0; l2 < 8; ++l2) {
+ double d9 = 0.25D;
+ double d10 = d1;
+ double d11 = d2;
+ double d12 = (d3 - d1) * d9;
+ double d13 = (d4 - d2) * d9;
+
+ for (int i3 = 0; i3 < 4; ++i3) {
+ int j3 = i3 + k * 4 << 12 | 0 + j1 * 4 << 8 | k2 * 8 + l2;
+ short short1 = 256; // TODO - wots dis do
+ j3 -= short1;
+ double d14 = 0.25D;
+ double d16 = (d11 - d10) * d14;
+ double d15 = d10 - d16;
+
+ for (int k3 = 0; k3 < 4; ++k3) {
+ if ((d15 += d16) > 0.0D) {
+ p_147424_3_[j3 += short1] = Dimension_Everglades.blockMainFiller;
+ } else if (k2 * 8 + l2 < b0) {
+ try {
+ p_147424_3_[j3 += short1] = Dimension_Everglades.blockFluidLakes; // River Fluid
+ // .
+ } catch (Throwable t) {
+ p_147424_3_[j3 += short1] = Blocks.water; // River Fluid Fallback
+ }
+ } else {
+ p_147424_3_[j3 += short1] = null;
+ }
+ }
+
+ d10 += d12;
+ d11 += d13;
+ }
+
+ d1 += d5;
+ d2 += d6;
+ d3 += d7;
+ d4 += d8;
+ }
+ }
+ }
+ }
+ }
+
+ public void replaceBlocksForBiome(int p_147422_1_, int p_147422_2_, Block[] p_147422_3_, byte[] p_147422_4_,
+ BiomeGenBase[] p_147422_5_) {
+ ChunkProviderEvent.ReplaceBiomeBlocks event = new ChunkProviderEvent.ReplaceBiomeBlocks(
+ this,
+ p_147422_1_,
+ p_147422_2_,
+ p_147422_3_,
+ new byte[256],
+ p_147422_5_,
+ null);
+ MinecraftForge.EVENT_BUS.post(event);
+ if (event.getResult() == cpw.mods.fml.common.eventhandler.Event.Result.DENY) return;
+
+ double d0 = 0.03125D;
+ this.stoneNoise = this.field_147430_m
+ .func_151599_a(this.stoneNoise, p_147422_1_ * 16, p_147422_2_ * 16, 16, 16, d0 * 2.0D, d0 * 2.0D, 1.0D);
+
+ for (int k = 0; k < 16; ++k) {
+ for (int l = 0; l < 16; ++l) {
+ BiomeGenBase biomegenbase = p_147422_5_[l + k * 16];
+ biomegenbase.genTerrainBlocks(
+ this.worldObj,
+ this.rand,
+ p_147422_3_,
+ p_147422_4_,
+ p_147422_1_ * 16 + k,
+ p_147422_2_ * 16 + l,
+ this.stoneNoise[l + k * 16]);
+ }
+ }
+ }
+
+ /**
+ * loads or generates the chunk at the chunk location specified
+ */
+ @Override
+ public Chunk loadChunk(int par1, int par2) {
+ return this.provideChunk(par1, par2);
+ }
+
+ /**
+ * Will return back a chunk, if it doesn't exist and its not a MP client it will generates all the blocks for the
+ * specified chunk from the map seed and chunk seed
+ */
+ @Override
+ public Chunk provideChunk(int par1, int par2) {
+ this.rand.setSeed(par1 * 341873128712L + par2 * 132897987541L);
+ Block[] ablock = new Block[65536];
+ byte[] abyte = new byte[65536];
+ this.func_147424_a(par1, par2, ablock);
+ this.biomesForGeneration = this.worldObj.getWorldChunkManager()
+ .loadBlockGeneratorData(this.biomesForGeneration, par1 * 16, par2 * 16, 16, 16);
+ this.replaceBlocksForBiome(par1, par2, ablock, abyte, this.biomesForGeneration);
+
+ Chunk chunk = new Chunk(this.worldObj, ablock, abyte, par1, par2);
+ byte[] abyte1 = chunk.getBiomeArray();
+
+ for (int k = 0; k < abyte1.length; ++k) {
+ abyte1[k] = (byte) this.biomesForGeneration[k].biomeID;
+ }
+
+ chunk.generateSkylightMap();
+ return chunk;
+ }
+
+ private void func_147423_a(int p_147423_1_, int p_147423_2_, int p_147423_3_) {
+ this.field_147426_g = this.noiseGen6
+ .generateNoiseOctaves(this.field_147426_g, p_147423_1_, p_147423_3_, 5, 5, 200.0D, 200.0D, 0.5D);
+ this.field_147427_d = this.field_147429_l.generateNoiseOctaves(
+ this.field_147427_d,
+ p_147423_1_,
+ p_147423_2_,
+ p_147423_3_,
+ 5,
+ 33,
+ 5,
+ 8.555150000000001D,
+ 4.277575000000001D,
+ 8.555150000000001D);
+ this.field_147428_e = this.field_147431_j.generateNoiseOctaves(
+ this.field_147428_e,
+ p_147423_1_,
+ p_147423_2_,
+ p_147423_3_,
+ 5,
+ 33,
+ 5,
+ 684.412D,
+ 684.412D,
+ 684.412D);
+ this.field_147425_f = this.field_147432_k.generateNoiseOctaves(
+ this.field_147425_f,
+ p_147423_1_,
+ p_147423_2_,
+ p_147423_3_,
+ 5,
+ 33,
+ 5,
+ 684.412D,
+ 684.412D,
+ 684.412D);
+ int l = 0;
+ int i1 = 0;
+ for (int j1 = 0; j1 < 5; ++j1) {
+ for (int k1 = 0; k1 < 5; ++k1) {
+ float f = 0.0F;
+ float f1 = 0.0F;
+ float f2 = 0.0F;
+ byte b0 = 2;
+ BiomeGenBase biomegenbase = this.biomesForGeneration[j1 + 2 + (k1 + 2) * 10];
+
+ for (int l1 = -b0; l1 <= b0; ++l1) {
+ for (int i2 = -b0; i2 <= b0; ++i2) {
+ BiomeGenBase biomegenbase1 = this.biomesForGeneration[j1 + l1 + 2 + (k1 + i2 + 2) * 10];
+ float f3 = biomegenbase1.rootHeight;
+ float f4 = biomegenbase1.heightVariation;
+
+ if (this.field_147435_p == WorldType.AMPLIFIED && f3 > 0.0F) {
+ f3 = 1.0F + f3 * 2.0F;
+ f4 = 1.0F + f4 * 4.0F;
+ }
+
+ float f5 = this.parabolicField[l1 + 2 + (i2 + 2) * 5] / (f3 + 2.0F);
+
+ if (biomegenbase1.rootHeight > biomegenbase.rootHeight) {
+ f5 /= 2.0F;
+ }
+
+ f += f4 * f5;
+ f1 += f3 * f5;
+ f2 += f5;
+ }
+ }
+
+ f /= f2;
+ f1 /= f2;
+ f = f * 0.9F + 0.1F;
+ f1 = (f1 * 4.0F - 1.0F) / 8.0F;
+ double d13 = this.field_147426_g[i1] / 8000.0D;
+
+ if (d13 < 0.0D) {
+ d13 = -d13 * 0.3D;
+ }
+
+ d13 = d13 * 3.0D - 2.0D;
+
+ if (d13 < 0.0D) {
+ d13 /= 2.0D;
+
+ if (d13 < -1.0D) {
+ d13 = -1.0D;
+ }
+
+ d13 /= 1.4D;
+ d13 /= 2.0D;
+ } else {
+ if (d13 > 1.0D) {
+ d13 = 1.0D;
+ }
+
+ d13 /= 8.0D;
+ }
+
+ ++i1;
+ double d12 = f1;
+ double d14 = f;
+ d12 += d13 * 0.2D;
+ d12 = d12 * 8.5D / 8.0D;
+ double d5 = 8.5D + d12 * 4.0D;
+
+ for (int j2 = 0; j2 < 33; ++j2) {
+ double d6 = (j2 - d5) * 12.0D * 128.0D / 256.0D / d14;
+
+ if (d6 < 0.0D) {
+ d6 *= 4.0D;
+ }
+
+ double d7 = this.field_147428_e[l] / 512.0D;
+ double d8 = this.field_147425_f[l] / 512.0D;
+ double d9 = (this.field_147427_d[l] / 10.0D + 1.0D) / 2.0D;
+ double d10 = MathHelper.denormalizeClamp(d7, d8, d9) - d6;
+
+ if (j2 > 29) {
+ double d11 = (j2 - 29) / 3.0F;
+ d10 = d10 * (1.0D - d11) + -10.0D * d11;
+ }
+
+ this.field_147434_q[l] = d10;
+ ++l;
+ }
+ }
+ }
+ }
+
+ /**
+ * Checks to see if a chunk exists at x, y
+ */
+ @Override
+ public boolean chunkExists(int par1, int par2) {
+ return true;
+ }
+
+ /**
+ * Populates chunk with ores etc etc
+ */
+ @Override
+ public void populate(IChunkProvider par1IChunkProvider, int par2, int par3) {
+ BlockFalling.fallInstantly = false;
+ int k = par2 * 16;
+ int l = par3 * 16;
+ BiomeGenBase biomegenbase = this.worldObj.getBiomeGenForCoords(k + 16, l + 16);
+ this.rand.setSeed(this.worldObj.getSeed());
+ long i1 = this.rand.nextLong() / 2L * 2L + 1L;
+ long j1 = this.rand.nextLong() / 2L * 2L + 1L;
+ this.rand.setSeed(par2 * i1 + par3 * j1 ^ this.worldObj.getSeed());
+ boolean flag = false;
+
+ MinecraftForge.EVENT_BUS.post(new PopulateChunkEvent.Pre(par1IChunkProvider, worldObj, rand, par2, par3, flag));
+
+ int k1;
+ int l1;
+ int i2;
+
+ if (biomegenbase != BiomeGenBase.desert && biomegenbase != BiomeGenBase.desertHills
+ && !flag
+ && this.rand.nextInt(4) == 0
+ && TerrainGen.populate(
+ par1IChunkProvider,
+ worldObj,
+ rand,
+ par2,
+ par3,
+ flag,
+ net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.LAKE)) {
+ k1 = k + this.rand.nextInt(16) + 8;
+ l1 = this.rand.nextInt(256);
+ i2 = l + this.rand.nextInt(16) + 8;
+ try {
+ (new WorldGenLakes(Dimension_Everglades.blockFluidLakes))
+ .generate(this.worldObj, this.rand, k1, l1, i2);
+ } catch (NullPointerException n) {
+ n.getStackTrace();
+ (new WorldGenLakes(Blocks.lava)).generate(this.worldObj, this.rand, k1, l1, i2);
+ Logger.INFO("Error while generating DarkWorld Lake.");
+ }
+ }
+
+ if (TerrainGen.populate(
+ par1IChunkProvider,
+ worldObj,
+ rand,
+ par2,
+ par3,
+ flag,
+ net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.LAVA) && !flag
+ && this.rand.nextInt(8) == 0) {
+ k1 = k + this.rand.nextInt(16) + 8;
+ l1 = this.rand.nextInt(this.rand.nextInt(248) + 8);
+ i2 = l + this.rand.nextInt(16) + 8;
+
+ if (l1 < 63 || this.rand.nextInt(10) == 0) { // Changes 63 -> 128
+ try {
+ (new WorldGenLakes(Blocks.lava)).generate(this.worldObj, this.rand, k1, l1, i2);
+ } catch (NullPointerException n) {
+ Logger.INFO("Error while generating DarkWorld Lake. [2]");
+ }
+ }
+ }
+ biomegenbase.decorate(this.worldObj, this.rand, k, l);
+ SpawnerAnimals.performWorldGenSpawning(this.worldObj, biomegenbase, k + 8, l + 8, 16, 16, this.rand);
+ k += 8;
+ l += 8;
+
+ MinecraftForge.EVENT_BUS
+ .post(new PopulateChunkEvent.Post(par1IChunkProvider, worldObj, rand, par2, par3, flag));
+
+ BlockFalling.fallInstantly = false;
+ }
+
+ /**
+ * Two modes of operation: if passed true, save all Chunks in one go. If passed false, save up to two chunks. Return
+ * true if all chunks have been saved.
+ */
+ @Override
+ public boolean saveChunks(boolean par1, IProgressUpdate par2IProgressUpdate) {
+ return true;
+ }
+
+ /**
+ * Save extra data not associated with any Chunk. Not saved during autosave, only during world unload. Currently
+ * unimplemented.
+ */
+ @Override
+ public void saveExtraData() {}
+
+ /**
+ * Unloads chunks that are marked to be unloaded. This is not guaranteed to unload every such chunk.
+ */
+ @Override
+ public boolean unloadQueuedChunks() {
+ return false;
+ }
+
+ /**
+ * Returns if the IChunkProvider supports saving.
+ */
+ @Override
+ public boolean canSave() {
+ return true;
+ }
+
+ /**
+ * Converts the instance data to a readable string.
+ */
+ @Override
+ public String makeString() {
+ return "RandomLevelSource";
+ }
+
+ /**
+ * Returns a list of creatures of the specified type that can spawn at the given location.
+ */
+ @SuppressWarnings("rawtypes")
+ @Override
+ public List getPossibleCreatures(EnumCreatureType par1EnumCreatureType, int par2, int par3, int par4) {
+ BiomeGenBase biomegenbase = this.worldObj.getBiomeGenForCoords(par2, par4);
+ return par1EnumCreatureType == EnumCreatureType.monster
+ && this.scatteredFeatureGenerator.func_143030_a(par2, par3, par4)
+ ? this.scatteredFeatureGenerator.getScatteredFeatureSpawnList()
+ : biomegenbase.getSpawnableList(par1EnumCreatureType);
+ }
+
+ @Override
+ public ChunkPosition func_147416_a(World p_147416_1_, String p_147416_2_, int p_147416_3_, int p_147416_4_,
+ int p_147416_5_) {
+ return "Village".equals(p_147416_2_) && this.villageGenerator != null
+ ? this.villageGenerator.func_151545_a(p_147416_1_, p_147416_3_, p_147416_4_, p_147416_5_)
+ : null;
+ }
+
+ @Override
+ public int getLoadedChunkCount() {
+ return 0;
+ }
+
+ @Override
+ public void recreateStructures(int par1, int par2) {
+
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/dimension/Dimension_Everglades.java b/gtpp/src/main/java/gtPlusPlus/everglades/dimension/Dimension_Everglades.java
new file mode 100644
index 0000000000..0520c5850b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/dimension/Dimension_Everglades.java
@@ -0,0 +1,29 @@
+package gtPlusPlus.everglades.dimension;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraftforge.common.DimensionManager;
+
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.everglades.block.BlockEvergladesPortal;
+import gtPlusPlus.everglades.item.ItemEvergladesPortalTrigger;
+import gtPlusPlus.everglades.world.WorldProviderMod;
+
+public class Dimension_Everglades {
+
+ public Object instance;
+ public static int DIMID = CORE.EVERGLADES_ID;
+ public static BlockEvergladesPortal portalBlock;
+ public static ItemEvergladesPortalTrigger portalItem;
+ public static Block blockTopLayer;
+ public static Block blockSecondLayer;
+ public static Block blockMainFiller = Blocks.stone;
+ public static Block blockSecondaryFiller;
+ public static Block blockFluidLakes;
+ public static Block blockPortalFrame;
+
+ public void load() {
+ DimensionManager.registerProviderType(DIMID, WorldProviderMod.class, false);
+ DimensionManager.registerDimension(DIMID, DIMID);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/gen/WorldGenDeadLilly.java b/gtpp/src/main/java/gtPlusPlus/everglades/gen/WorldGenDeadLilly.java
new file mode 100644
index 0000000000..37947452c5
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/gen/WorldGenDeadLilly.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.everglades.gen;
+
+import java.util.Random;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenWaterlily;
+
+public class WorldGenDeadLilly extends WorldGenWaterlily {
+
+ @Override
+ public boolean generate(World world, Random rand, int x, int y, int z) {
+ for (int l = 0; l < 10; ++l) {
+ int i1 = x + rand.nextInt(8) - rand.nextInt(8);
+ int j1 = y + rand.nextInt(4) - rand.nextInt(4);
+ int k1 = z + rand.nextInt(8) - rand.nextInt(8);
+
+ if (world.isAirBlock(i1, j1, k1) && Blocks.waterlily.canPlaceBlockAt(world, i1, j1, k1)) {
+ world.setBlock(i1, j1, k1, Blocks.waterlily, 0, 2);
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/gen/WorldGenMinable_Custom.java b/gtpp/src/main/java/gtPlusPlus/everglades/gen/WorldGenMinable_Custom.java
new file mode 100644
index 0000000000..e3ce830f27
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/gen/WorldGenMinable_Custom.java
@@ -0,0 +1,90 @@
+package gtPlusPlus.everglades.gen;
+
+import static gtPlusPlus.core.lib.CORE.PI;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenMinable;
+
+import gtPlusPlus.api.objects.Logger;
+
+public class WorldGenMinable_Custom extends WorldGenMinable {
+
+ /** The block to generate. */
+ private Block oreToGenerate;
+ /** The number of blocks to generate. */
+ private int numberOfBlocks;
+ /** The block to replace. */
+ private Block blockToReplace;
+ /** The meta of the block. */
+ private int mineableBlockMeta;
+
+ public WorldGenMinable_Custom(final Block block, final int count) {
+ super(block, count, Blocks.stone);
+ }
+
+ public WorldGenMinable_Custom(final Block block, final int count, final Block target) {
+ super(block, count, target);
+ this.oreToGenerate = block;
+ this.numberOfBlocks = count;
+ this.blockToReplace = target;
+ }
+
+ public WorldGenMinable_Custom(final Block block, final int meta, final int number, final Block target) {
+ this(block, number, target);
+ this.mineableBlockMeta = meta;
+ }
+
+ @Override
+ public boolean generate(final World world, final Random rand, final int x, final int y, final int z) {
+ final float f = rand.nextFloat() * PI;
+ final double d0 = x + 16 + ((MathHelper.sin(f) * this.numberOfBlocks) / 4.0F);
+ final double d1 = (x + 16) - ((MathHelper.sin(f) * this.numberOfBlocks) / 4.0F);
+ final double d2 = z + 16 + ((MathHelper.cos(f) * this.numberOfBlocks) / 4.0F);
+ final double d3 = (z + 16) - ((MathHelper.cos(f) * this.numberOfBlocks) / 4.0F);
+ final double d4 = (y + rand.nextInt(8)) - 1;
+ final double d5 = (y + rand.nextInt(8)) - 1;
+
+ for (int l = 0; l <= this.numberOfBlocks; ++l) {
+ final double d6 = d0 + (((d1 - d0) * l) / this.numberOfBlocks);
+ final double d7 = d4 + (((d5 - d4) * l) / this.numberOfBlocks);
+ final double d8 = d2 + (((d3 - d2) * l) / this.numberOfBlocks);
+ final double d9 = (rand.nextDouble() * this.numberOfBlocks) / 8.0D;
+ final double d10 = ((MathHelper.sin((l * PI) / this.numberOfBlocks) + 1.0F) * d9) + 1.0D;
+ final double d11 = ((MathHelper.sin((l * PI) / this.numberOfBlocks) + 1.0F) * d9) + 1.0D;
+ final int i1 = MathHelper.floor_double(d6 - (d10 / 2.0D));
+ final int j1 = MathHelper.floor_double(d7 - (d11 / 2.0D));
+ final int k1 = MathHelper.floor_double(d8 - (d10 / 2.0D));
+ final int l1 = MathHelper.floor_double(d6 + (d10 / 2.0D));
+ final int i2 = MathHelper.floor_double(d7 + (d11 / 2.0D));
+ final int j2 = MathHelper.floor_double(d8 + (d10 / 2.0D));
+
+ for (int k2 = i1; k2 <= l1; ++k2) {
+ final double d12 = ((k2 + 0.5D) - d6) / (d10 / 2.0D);
+ if ((d12 * d12) < 1.0D) {
+ for (int l2 = j1; l2 <= i2; ++l2) {
+ final double d13 = ((l2 + 0.5D) - d7) / (d11 / 2.0D);
+ if (((d12 * d12) + (d13 * d13)) < 1.0D) {
+ for (int i3 = k1; i3 <= j2; ++i3) {
+ final double d14 = ((i3 + 0.5D) - d8) / (d10 / 2.0D);
+ if ((((d12 * d12) + (d13 * d13) + (d14 * d14)) < 1.0D) && world.getBlock(k2, l2, i3)
+ .isReplaceableOreGen(world, k2, l2, i3, this.blockToReplace)) {
+ world.setBlock(k2, l2, i3, this.oreToGenerate, this.mineableBlockMeta, 3);
+ Logger.INFO(
+ "Generated a " + this.oreToGenerate
+ .getLocalizedName() + " at x: " + k2 + " | y: " + l2 + " | z: " + i3);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT.java b/gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT.java
new file mode 100644
index 0000000000..a35b528726
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT.java
@@ -0,0 +1,49 @@
+package gtPlusPlus.everglades.gen.gt;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import gtPlusPlus.xmod.gregtech.HANDLER_GT;
+
+public abstract class WorldGen_GT {
+
+ public final String mWorldGenName;
+ public final boolean mEnabled;
+ private final Map<String, Boolean> mDimensionMap = new ConcurrentHashMap<>();
+
+ public WorldGen_GT(String aName, List aList, boolean aDefault) {
+ this.mWorldGenName = aName;
+ this.mEnabled = HANDLER_GT.sCustomWorldgenFile.get("worldgen", this.mWorldGenName, aDefault);
+ if (this.mEnabled) {
+ aList.add(this);
+ }
+ }
+
+ public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ return false;
+ }
+
+ public boolean executeCavegen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ return false;
+ }
+
+ public boolean isGenerationAllowed(World aWorld, int aDimensionType, int aAllowedDimensionType) {
+ String aDimName = aWorld.provider.getDimensionName();
+ Boolean tAllowed = (Boolean) this.mDimensionMap.get(aDimName);
+ if (tAllowed == null) {
+ boolean tValue = HANDLER_GT.sCustomWorldgenFile
+ .get("worldgen.dimensions." + this.mWorldGenName, aDimName, aDimensionType == aAllowedDimensionType);
+ this.mDimensionMap.put(aDimName, Boolean.valueOf(tValue));
+ return tValue;
+ } else {
+ return tAllowed;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Base.java b/gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Base.java
new file mode 100644
index 0000000000..ac93a847fa
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Base.java
@@ -0,0 +1,580 @@
+package gtPlusPlus.everglades.gen.gt;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraft.world.chunk.IChunkProvider;
+import net.minecraft.world.gen.feature.WorldGenMinable;
+
+import cpw.mods.fml.common.IWorldGenerator;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_Log;
+import gregtech.common.GT_Worldgenerator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+import gtPlusPlus.xmod.gregtech.HANDLER_GT;
+
+public class WorldGen_GT_Base implements IWorldGenerator {
+
+ /**
+ * Class Variables
+ */
+
+ /**
+ * Control percentage of filled 3x3 chunks. Lower number means less oreveins spawn
+ */
+ public static int oreveinPercentage;
+ /**
+ * Control number of attempts to find a valid orevein. Generally this maximum limit isn't hit, selecting a vein is
+ * cheap
+ */
+ public static int oreveinAttempts;
+ /**
+ * Control number of attempts to place a valid orevein. If a vein wasn't placed due to height restrictions,
+ * completely in the water, etc, another attempt is tried.
+ */
+ public static int oreveinMaxPlacementAttempts;
+ /**
+ * Debug parameter for world generation. Tracks chunks added/removed from run queue.
+ */
+ public static boolean debugWorldGen = false;
+ /**
+ * Try re-implement Richard Hendrick's Chunk by Chunk Ore Generation from his GT5u fork.
+ */
+ public static List<Runnable> mList = new ArrayList<>();
+
+ public static HashSet<Long> ProcChunks = new HashSet<>();
+ // This is probably not going to work. Trying to create a fake orevein to
+ // put into hashtable when there will be no ores in a vein.
+ public static WorldGen_GT_Ore_Layer noOresInVein = new WorldGen_GT_Ore_Layer(
+ "vein0",
+ 0,
+ 255,
+ 0,
+ 0,
+ 0,
+ ELEMENT.getInstance().IRON,
+ ELEMENT.getInstance().IRON,
+ ELEMENT.getInstance().IRON,
+ ELEMENT.getInstance().IRON);
+
+ public static Hashtable<Long, WorldGen_GT_Ore_Layer> validOreveins = new Hashtable<>(1024);
+
+ public boolean mIsGenerating = false;
+ public static final Object listLock = new Object();
+ // private static boolean gcAsteroids = true;
+
+ public WorldGen_GT_Base() {
+ if (debugWorldGen) {
+ GT_Log.out.println("GTPP_Worldgenerator created");
+ }
+ }
+
+ @Override
+ public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator,
+ IChunkProvider chunkProvider) {
+ if (world.provider.dimensionId == Dimension_Everglades.DIMID) {
+ generateSafely(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider);
+ }
+ }
+
+ public synchronized void generateSafely(Random random, int chunkX, int chunkZ, World world,
+ IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
+ int xDim = Dimension_Everglades.DIMID;
+ switch (world.provider.dimensionId) {
+ case -1: // Nether
+ // generateNether(world, random, chunkX * 16, chunkZ * 16);
+ break;
+ case 0: // Overworld
+ // generateSurface(world, random, chunkX * 16, chunkZ * 16);
+ break;
+ case 1: // End
+ // generateEnd(world, random, chunkX * 16, chunkZ * 16);
+ break;
+ default: // Any other dimension
+ if (world.provider.dimensionId != xDim) {
+ break;
+ } else {
+ generateEverglades(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider);
+ break;
+ }
+ }
+ }
+
+ private synchronized void generateEverglades(Random aRandom, int aX, int aZ, World aWorld,
+ IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ Logger.WORLD("Trying to Generate Dimension.");
+ synchronized (listLock) {
+ Logger.WORLD("Locked List addition.");
+ if (WorldGen_GT_Base.mList.add(
+ new WorldGenContainer(
+ new XSTR(Math.abs(aRandom.nextInt()) + 1),
+ aX,
+ aZ,
+ Dimension_Everglades.DIMID,
+ aWorld,
+ aChunkGenerator,
+ aChunkProvider,
+ aWorld.getBiomeGenForCoords(aX * 16 + 8, aZ * 16 + 8).biomeName))) {
+ Logger.WORLD("Locked List addition. Success.");
+ } else {
+ Logger.WORLD("Locked List addition. Fail.");
+ }
+ if (debugWorldGen) GT_Log.out.println(
+ "ADD WorldSeed:" + aWorld.getSeed()
+ + " DimId"
+ + aWorld.provider.dimensionId
+ + " chunk x:"
+ + aX
+ + " z:"
+ + aZ
+ + " SIZE: "
+ + WorldGen_GT_Base.mList.size());
+ }
+
+ if (!this.mIsGenerating) {
+ Logger.WORLD("Is not generating.");
+ this.mIsGenerating = true;
+ Logger.WORLD("Setting Generation to true.");
+ int mList_sS = WorldGen_GT_Base.mList.size();
+ mList_sS = Math.min(mList_sS, 3); // Run a maximum of 3 chunks at a
+ // time through worldgen. Extra
+ // chunks get done later.
+ for (int i = 0; i < mList_sS; i++) {
+ WorldGenContainer toRun = (WorldGenContainer) WorldGen_GT_Base.mList.get(0);
+ if (debugWorldGen) GT_Log.out.println(
+ "RUN WorldSeed:" + aWorld.getSeed()
+ + " DimId"
+ + aWorld.provider.dimensionId
+ + " chunk x:"
+ + toRun.mX
+ + " z:"
+ + toRun.mZ
+ + " SIZE: "
+ + WorldGen_GT_Base.mList.size()
+ + " i: "
+ + i);
+ synchronized (listLock) {
+ Logger.WORLD("Locked List Removal.");
+ WorldGen_GT_Base.mList.remove(0);
+ }
+ toRun.run();
+ }
+ this.mIsGenerating = false;
+ Logger.WORLD("Is Generating now set to false..");
+ }
+ }
+
+ public void generateOre(Block block, World world, Random random, int chunk_x, int chunk_z, int maxX, int maxZ,
+ int maxVeinSize, int chancesToSpawn, int minY, int maxY, Block generateIn) {
+ int heightRange = maxY - minY;
+ WorldGenMinable worldgenminable = new WorldGenMinable(block, maxVeinSize, generateIn);
+ for (int k1 = 0; k1 < chancesToSpawn; ++k1) {
+ int xrand = random.nextInt(16);
+ int yrand = random.nextInt(heightRange) + minY;
+ int zrand = random.nextInt(16);
+ worldgenminable.generate(world, random, chunk_x + xrand, yrand, chunk_z + zrand);
+ }
+ }
+
+ public static class WorldGenContainer implements Runnable {
+
+ public final Random mRandom;
+ public final int mX;
+ public final int mZ;
+ public final int mDimensionType;
+ public final World mWorld;
+ public final IChunkProvider mChunkGenerator;
+ public final IChunkProvider mChunkProvider;
+ public final String mBiome;
+
+ // Local class to track which orevein seeds must be checked when doing
+ // chunkified worldgen
+ class NearbySeeds {
+
+ public int mX;
+ public int mZ;
+
+ NearbySeeds(int x, int z) {
+ this.mX = x;
+ this.mZ = z;
+ }
+ };
+
+ public static ArrayList<NearbySeeds> seedList = new ArrayList<>();
+
+ // aX and aZ are now the by-chunk X and Z for the chunk of interest
+ public WorldGenContainer(Random aRandom, int aX, int aZ, int aDimensionType, World aWorld,
+ IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider, String aBiome) {
+ this.mRandom = aRandom;
+ this.mX = aX;
+ this.mZ = aZ;
+ this.mDimensionType = aDimensionType;
+ this.mWorld = aWorld;
+ this.mChunkGenerator = aChunkGenerator;
+ this.mChunkProvider = aChunkProvider;
+ this.mBiome = aBiome;
+ }
+
+ public void worldGenFindVein(int oreseedX, int oreseedZ) {
+ // Explanation of oreveinseed implementation.
+ // (long)this.mWorld.getSeed()<<16) Deep Dark does two oregen
+ // passes, one with getSeed set to +1 the original world seed. This
+ // pushes that +1 off the low bits of oreseedZ, so that the hashes
+ // are far apart for the two passes.
+ // ((this.mWorld.provider.dimensionId & 0xffL)<<56) Puts the
+ // dimension in the top bits of the hash, to make sure to get unique
+ // hashes per dimension
+ // ((long)oreseedX & 0x000000000fffffffL) << 28) Puts the chunk X in
+ // the bits 29-55. Cuts off the top few bits of the chunk so we have
+ // bits for dimension.
+ // ( (long)oreseedZ & 0x000000000fffffffL )) Puts the chunk Z in the
+ // bits 0-27. Cuts off the top few bits of the chunk so we have bits
+ // for dimension.
+ long oreveinSeed = (this.mWorld.getSeed() << 16)
+ ^ ((this.mWorld.provider.dimensionId & 0xffL) << 56 | ((oreseedX & 0x000000000fffffffL) << 28)
+ | (oreseedZ & 0x000000000fffffffL)); // Use
+ // an
+ // RNG
+ // that
+ // is
+ // identical
+ // every
+ // time
+ // it
+ // is
+ // called
+ // for
+ // this
+ // oreseed.
+ XSTR oreveinRNG = new XSTR(oreveinSeed);
+ int oreveinPercentageRoll = oreveinRNG.nextInt(100); // Roll the
+ // dice, see
+ // if we get
+ // an
+ // orevein
+ // here at
+ // all
+ int noOrePlacedCount = 0;
+ String tDimensionName = "";
+ if (debugWorldGen) {
+ tDimensionName = this.mWorld.provider.getDimensionName();
+ }
+
+ if (debugWorldGen) {
+ GT_Log.out.println(
+ " Finding oreveins for oreveinSeed=" + oreveinSeed
+ + " mX="
+ + this.mX
+ + " mZ="
+ + this.mZ
+ + " oreseedX="
+ + oreseedX
+ + " oreseedZ="
+ + oreseedZ
+ + " worldSeed="
+ + this.mWorld.getSeed());
+ }
+
+ Logger
+ .INFO("[World Generation Debug] !validOreveins.containsKey(oreveinSeed) | oreveinSeed: " + oreveinSeed);
+ // Search for a valid orevein for this dimension
+ if (!validOreveins.containsKey(oreveinSeed)) {
+
+ Logger.INFO(
+ "[World Generation Debug] oreveinPercentageRoll < oreveinPercentage? "
+ + ((oreveinPercentageRoll < oreveinPercentage)));
+ Logger.INFO(
+ "[World Generation Debug] WorldGen_GT_Ore_Layer.sWeight > 0? "
+ + (WorldGen_GT_Ore_Layer.sWeight > 0));
+ Logger.INFO(
+ "[World Generation Debug] WorldGen_GT_Ore_Layer.sList.size() > 0? "
+ + (WorldGen_GT_Ore_Layer.sList.size() > 0));
+ if ((oreveinPercentageRoll < oreveinPercentage) && (WorldGen_GT_Ore_Layer.sWeight > 0)
+ && (WorldGen_GT_Ore_Layer.sList.size() > 0)) {
+ int placementAttempts = 0;
+ boolean oreveinFound = false;
+ int i;
+ for (i = 0; (i < oreveinAttempts) && (!oreveinFound)
+ && (placementAttempts < oreveinMaxPlacementAttempts); i++) {
+ Logger.INFO("[World Generation Debug] i: " + i);
+ Logger.INFO("[World Generation Debug] placementAttempts: " + placementAttempts);
+ Logger.INFO("[World Generation Debug] oreveinAttempts: " + oreveinAttempts);
+ Logger.INFO(
+ "[World Generation Debug] (placementAttempts < oreveinMaxPlacementAttempts): "
+ + (placementAttempts < oreveinMaxPlacementAttempts));
+ Logger.INFO("[World Generation Debug] oreveinFound: " + oreveinFound);
+ int tRandomWeight = oreveinRNG.nextInt(WorldGen_GT_Ore_Layer.sWeight);
+ for (WorldGen_GT_Ore_Layer tWorldGen : WorldGen_GT_Ore_Layer.sList) {
+ Logger.INFO(
+ "[World Generation Debug] Iterating sList - Size: "
+ + WorldGen_GT_Ore_Layer.sList.size());
+ tRandomWeight -= (tWorldGen).mWeight;
+ if (tRandomWeight <= 0) {
+ try {
+ // Adjust the seed so that this layer has a
+ // series of unique random numbers.
+ // Otherwise multiple attempts at this same
+ // oreseed will get the same offset and X/Z
+ // values. If an orevein failed, any orevein
+ // with the
+ // same minimum heights would fail as well.
+ // This prevents that, giving each orevein a
+ // unique height each pass through here.
+ int placementResult = tWorldGen.executeWorldgenChunkified(
+ this.mWorld,
+ new XSTR(oreveinSeed ^ (Block.getIdFromBlock(tWorldGen.mPrimaryMeta))),
+ this.mBiome,
+ this.mDimensionType,
+ this.mX * 16,
+ this.mZ * 16,
+ oreseedX * 16,
+ oreseedZ * 16,
+ this.mChunkGenerator,
+ this.mChunkProvider);
+ switch (placementResult) {
+ case WorldGen_GT_Ore_Layer.ORE_PLACED -> {
+ if (debugWorldGen) GT_Log.out.println(
+ " Added oreveinSeed=" + oreveinSeed
+ + " tries at oremix="
+ + i
+ + " placementAttempts="
+ + placementAttempts
+ + " dimensionName="
+ + tDimensionName);
+ validOreveins.put(oreveinSeed, tWorldGen);
+ oreveinFound = true;
+ Logger.INFO("[World Generation Debug] ORE_PLACED");
+ }
+ case WorldGen_GT_Ore_Layer.NO_ORE_IN_BOTTOM_LAYER -> {
+ placementAttempts++;
+ Logger.INFO(
+ "[World Generation Debug] NO_ORE_IN_BOTTOM_LAYER | Attempts: "
+ + placementAttempts);
+ }
+ // SHould do retry in this case
+ // until out of chances
+ case WorldGen_GT_Ore_Layer.NO_OVERLAP -> {
+ // Orevein didn't reach this chunk,
+ // can't add it yet to the hash
+ Logger.INFO("[World Generation Debug] NO_OVERLAP");
+ if (debugWorldGen) GT_Log.out.println(
+ " Added far oreveinSeed=" + oreveinSeed
+ + " "
+ + (tWorldGen).mWorldGenName
+ + " tries at oremix="
+ + i
+ + " placementAttempts="
+ + placementAttempts
+ + " dimensionName="
+ + tDimensionName);
+ validOreveins.put(oreveinSeed, tWorldGen);
+ oreveinFound = true;
+ }
+ case WorldGen_GT_Ore_Layer.NO_OVERLAP_AIR_BLOCK -> {
+ if (debugWorldGen) GT_Log.out.println(
+ " No overlap and air block in test spot=" + oreveinSeed
+ + " "
+ + (tWorldGen).mWorldGenName
+ + " tries at oremix="
+ + i
+ + " placementAttempts="
+ + placementAttempts
+ + " dimensionName="
+ + tDimensionName);
+ // SHould do retry in this case until out of chances
+ Logger.INFO("[World Generation Debug] NO_OVERLAP_AIR_BLOCK");
+ placementAttempts++;
+ }
+ }
+ break; // Try the next orevein
+ } catch (Throwable e) {
+ if (debugWorldGen) GT_Log.out.println(
+ "Exception occurred on oreVein" + tWorldGen
+ + " oreveinSeed="
+ + oreveinSeed
+ + " mX="
+ + this.mX
+ + " mZ="
+ + this.mZ
+ + " oreseedX="
+ + oreseedX
+ + " oreseedZ="
+ + oreseedZ);
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ }
+ // Only add an empty orevein if are unable to place a vein
+ // at the oreseed chunk.
+ if ((!oreveinFound) && (this.mX == oreseedX) && (this.mZ == oreseedZ)) {
+ if (debugWorldGen) GT_Log.out.println(
+ " Empty oreveinSeed=" + oreveinSeed
+ + " mX="
+ + this.mX
+ + " mZ="
+ + this.mZ
+ + " oreseedX="
+ + oreseedX
+ + " oreseedZ="
+ + oreseedZ
+ + " tries at oremix="
+ + i
+ + " placementAttempts="
+ + placementAttempts
+ + " dimensionName="
+ + tDimensionName);
+ validOreveins.put(oreveinSeed, noOresInVein);
+ }
+ } else if (oreveinPercentageRoll >= oreveinPercentage) {
+ if (debugWorldGen) GT_Log.out.println(
+ " Skipped oreveinSeed=" + oreveinSeed
+ + " mX="
+ + this.mX
+ + " mZ="
+ + this.mZ
+ + " oreseedX="
+ + oreseedX
+ + " oreseedZ="
+ + oreseedZ
+ + " RNG="
+ + oreveinPercentageRoll
+ + " %="
+ + oreveinPercentage
+ + " dimensionName="
+ + tDimensionName);
+ validOreveins.put(oreveinSeed, noOresInVein);
+ }
+ } else {
+ // oreseed is located in the previously processed table
+ if (debugWorldGen) GT_Log.out
+ .print(" Valid oreveinSeed=" + oreveinSeed + " validOreveins.size()=" + validOreveins.size() + " ");
+ WorldGen_GT_Ore_Layer tWorldGen = validOreveins.get(oreveinSeed);
+ oreveinRNG.setSeed(oreveinSeed ^ (Block.getIdFromBlock(tWorldGen.mPrimaryMeta))); // Reset
+ // RNG
+ // to
+ // only
+ // be
+ // based
+ // on
+ // oreseed
+ // X/Z
+ // and
+ // type
+ // of
+ // vein
+ int placementResult = tWorldGen.executeWorldgenChunkified(
+ this.mWorld,
+ oreveinRNG,
+ this.mBiome,
+ this.mDimensionType,
+ this.mX * 16,
+ this.mZ * 16,
+ oreseedX * 16,
+ oreseedZ * 16,
+ this.mChunkGenerator,
+ this.mChunkProvider);
+ switch (placementResult) {
+ case WorldGen_GT_Ore_Layer.NO_ORE_IN_BOTTOM_LAYER -> {
+ if (debugWorldGen) GT_Log.out.println(" No ore in bottom layer");
+ }
+ case WorldGen_GT_Ore_Layer.NO_OVERLAP -> {
+ if (debugWorldGen) GT_Log.out.println(" No overlap");
+ }
+ }
+ }
+ }
+
+ @Override
+ public void run() {
+ long startTime = System.nanoTime();
+ int oreveinMaxSize;
+
+ // Determine bounding box on how far out to check for oreveins
+ // affecting this chunk
+ // For now, manually reducing oreveinMaxSize when not in the
+ // Underdark for performance
+ if (this.mWorld.provider.getDimensionName()
+ .equals("Underdark")) {
+ oreveinMaxSize = 24; // Leave Deep Dark/Underdark max oregen at
+ // 32, instead of 64
+ } else {
+ oreveinMaxSize = 48;
+ }
+
+ int wXbox = this.mX - (oreveinMaxSize / 16);
+ int eXbox = this.mX + (oreveinMaxSize / 16 + 1); // Need to add 1
+ // since it is
+ // compared
+ // using a <
+ int nZbox = this.mZ - (oreveinMaxSize / 16);
+ int sZbox = this.mZ + (oreveinMaxSize / 16 + 1);
+
+ // Search for orevein seeds and add to the list;
+ for (int x = wXbox; x < eXbox; x++) {
+ for (int z = nZbox; z < sZbox; z++) {
+ // Determine if this X/Z is an orevein seed
+ if (GT_Worldgenerator.isOreChunk(x, z)) {
+ if (debugWorldGen) GT_Log.out.println("Adding seed x=" + x + " z=" + z);
+ seedList.add(new NearbySeeds(x, z));
+ }
+ }
+ }
+
+ // Now process each oreseed vs this requested chunk
+ for (; seedList.size() != 0; seedList.remove(0)) {
+ if (debugWorldGen)
+ GT_Log.out.println("Processing seed x=" + seedList.get(0).mX + " z=" + seedList.get(0).mZ);
+ worldGenFindVein(seedList.get(0).mX, seedList.get(0).mZ);
+ }
+
+ long oregenTime = System.nanoTime();
+
+ // Do leftover worldgen for this chunk (GT_Stones and GT_small_ores)
+ try {
+ for (WorldGen_GT tWorldGen : HANDLER_GT.sWorldgenListEverglades) {
+ /*
+ * if (debugWorldGen) GT_Log.out.println( "tWorldGen.mWorldGenName="+tWorldGen.mWorldGenName );
+ */
+ tWorldGen.executeWorldgen(
+ this.mWorld,
+ this.mRandom,
+ this.mBiome,
+ this.mDimensionType,
+ this.mX * 16,
+ this.mZ * 16,
+ this.mChunkGenerator,
+ this.mChunkProvider);
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+
+ long leftOverTime = System.nanoTime();
+
+ Chunk tChunk = this.mWorld.getChunkFromBlockCoords(this.mX, this.mZ);
+ if (tChunk != null) {
+ tChunk.isModified = true;
+ }
+ long endTime = System.nanoTime();
+ long duration = (endTime - startTime);
+ if (debugWorldGen) {
+ GT_Log.out.println(
+ " Oregen took " + (oregenTime - startTime)
+ + " Leftover gen took "
+ + (leftOverTime - oregenTime)
+ + " Worldgen took "
+ + duration
+ + " nanoseconds");
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Ore_Layer.java b/gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Ore_Layer.java
new file mode 100644
index 0000000000..773109a818
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_GT_Ore_Layer.java
@@ -0,0 +1,590 @@
+package gtPlusPlus.everglades.gen.gt;
+
+import static gtPlusPlus.everglades.gen.gt.WorldGen_GT_Base.debugWorldGen;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Log;
+import gregtech.common.blocks.GT_Block_Ores;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+import gtPlusPlus.xmod.gregtech.HANDLER_GT;
+
+public class WorldGen_GT_Ore_Layer extends WorldGen_GT {
+
+ public static ArrayList<WorldGen_GT_Ore_Layer> sList = new ArrayList<>();
+ public static int sWeight = 0;
+ public final short mMinY;
+ public final short mMaxY;
+ public final short mWeight;
+ public final short mDensity;
+ public final short mSize;
+ public Block mPrimaryMeta;
+ public Block mSecondaryMeta;
+ public Block mBetweenMeta;
+ public Block mSporadicMeta;
+ public final Material mPrimary;
+ public final Material mSecondary;
+ public final Material mBetween;
+ public final Material mSporadic;
+
+ // public final String mBiome;
+ public final String mRestrictBiome;
+ public final boolean mOverworld;
+ public final boolean mNether;
+ public final boolean mEnd;
+ public static final int WRONG_BIOME = 0;
+ public static final int WRONG_DIMENSION = 1;
+ public static final int NO_ORE_IN_BOTTOM_LAYER = 2;
+ public static final int NO_OVERLAP = 3;
+ public static final int ORE_PLACED = 4;
+ public static final int NO_OVERLAP_AIR_BLOCK = 5;
+
+ public final String aTextWorldgen = "worldgen.";
+
+ public WorldGen_GT_Ore_Layer(String aName, int aMinY, int aMaxY, int aWeight, int aDensity, int aSize,
+ Material aPrimary, Material aSecondary, Material aBetween, Material aSporadic) {
+ this(
+ aName,
+ true,
+ aMinY,
+ aMaxY,
+ aWeight,
+ aDensity,
+ aSize,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ aPrimary,
+ aSecondary,
+ aBetween,
+ aSporadic);
+ }
+
+ public WorldGen_GT_Ore_Layer(String aName, boolean aDefault, int aMinY, int aMaxY, int aWeight, int aDensity,
+ int aSize, boolean aOverworld, boolean aNether, boolean aEnd, boolean GC_UNUSED1, boolean GC_UNUSED2,
+ boolean GC_UNUSED3, Material aPrimary, Material aSecondary, Material aBetween, Material aSporadic) {
+ super(aName, sList, aDefault);
+ Logger.WORLD("Creating Ore Layer Object");
+ this.mOverworld = HANDLER_GT.sCustomWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "Overworld", aOverworld);
+ this.mNether = HANDLER_GT.sCustomWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "Nether", aNether);
+ this.mEnd = HANDLER_GT.sCustomWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "TheEnd", aEnd);
+ this.mMinY = 5;
+ short mMaxY = 14;
+ if (mMaxY < (this.mMinY + 7)) {
+ GT_Log.out.println("Oremix " + this.mWorldGenName + " has invalid Min/Max heights!");
+ mMaxY = (short) (this.mMinY + 7);
+ }
+ this.mMaxY = mMaxY;
+ this.mWeight = ((short) HANDLER_GT.sCustomWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "RandomWeight", aWeight));
+ this.mDensity = ((short) HANDLER_GT.sCustomWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "Density", aDensity));
+ this.mSize = ((short) Math
+ .max(1, HANDLER_GT.sCustomWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "Size", aSize)));
+ this.mPrimary = aPrimary;
+ this.mSecondary = aSecondary;
+ this.mBetween = aBetween;
+ this.mSporadic = aSporadic;
+ this.mPrimaryMeta = aPrimary.getOreBlock(1);
+ this.mSecondaryMeta = aSecondary.getOreBlock(1);
+ this.mBetweenMeta = aBetween.getOreBlock(1);
+ this.mSporadicMeta = aSporadic.getOreBlock(1);
+ this.mRestrictBiome = HANDLER_GT.sCustomWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "RestrictToBiomeName", "None");
+
+ // if (mPrimaryMeta != -1 && GregTech_API.sGeneratedMaterials[(mPrimaryMeta % 1000)] == null) throw new
+ // IllegalArgumentException("A Material for the supplied ID " + mPrimaryMeta + " for " + mWorldGenName + " does
+ // not exist");
+ // if (mSecondaryMeta != -1 && GregTech_API.sGeneratedMaterials[(mSecondaryMeta % 1000)] == null) throw new
+ // IllegalArgumentException("A Material for the supplied ID " + mSecondaryMeta + " for " + mWorldGenName + "
+ // does not exist");
+ // if (mBetweenMeta != -1 && GregTech_API.sGeneratedMaterials[(mBetweenMeta % 1000)] == null) throw new
+ // IllegalArgumentException("A Material for the supplied ID " + mBetweenMeta + " for " + mWorldGenName + " does
+ // not exist");
+ // if (mPrimaryMeta != -1 && GregTech_API.sGeneratedMaterials[(mSporadicMeta % 1000)] == null) throw new
+ // IllegalArgumentException("A Material for the supplied ID " + mSporadicMeta + " for " + mWorldGenName + " does
+ // not exist");
+
+ if (this.mEnabled) {
+ sWeight += this.mWeight;
+ }
+ }
+
+ public int executeWorldgenChunkified(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, int aSeedX, int aSeedZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+
+ // Debug Handler
+ /**
+ * This handles Variables that are null during Init
+ */
+ if (this.mPrimaryMeta == Blocks.stone || this.mSecondaryMeta == Blocks.stone
+ || this.mBetweenMeta == Blocks.stone
+ || this.mSporadicMeta == Blocks.stone) {
+ this.mPrimaryMeta = this.mPrimary.getOreBlock(1);
+ this.mSecondaryMeta = this.mSecondary.getOreBlock(1);
+ this.mBetweenMeta = this.mBetween.getOreBlock(1);
+ this.mSporadicMeta = this.mSporadic.getOreBlock(1);
+ Logger.WORLD(
+ "[Vein Generator] An Ore in a Vein had defaulted back to a default value, so they have now been reset to correct values.");
+ }
+
+ if (mWorldGenName.equals("vein0")) {
+ if (debugWorldGen) GT_Log.out.println(" NoOresInVein-vein0");
+ // This is a special empty orevein
+ Logger.WORLD("[World Generation Debug] Special Empty Vein placed.");
+ return ORE_PLACED;
+ }
+ if (aDimensionType != Dimension_Everglades.DIMID) {
+ /*
+ * // Debug code, but spams log if (debugWorldGen) { GT_Log.out.println( "Wrong dimension" ); }
+ */
+ Logger.WORLD("[World Generation Debug] Wrong dimension.");
+ return WRONG_DIMENSION;
+ }
+ if (!this.mRestrictBiome.equals("None") && !(this.mRestrictBiome.equals(aBiome))) {
+ return WRONG_BIOME;
+ }
+ int[] placeCount = new int[4];
+
+ int tMinY = mMinY + aRandom.nextInt(mMaxY - mMinY - 5);
+ // Determine West/East ends of orevein
+ int wXVein = aSeedX - aRandom.nextInt(mSize); // West side
+ int eXVein = aSeedX + 16 + aRandom.nextInt(mSize);
+ // Limit Orevein to only blocks present in current chunk
+ int wX = Math.max(wXVein, aChunkX + 2); // Bias placement by 2 blocks to prevent worldgen cascade.
+ int eX = Math.min(eXVein, aChunkX + 2 + 16);
+ if (wX >= eX) { // No overlap between orevein and this chunk exists in X
+ Block tBlock = aWorld.getBlock(aChunkX + 8, tMinY, aChunkZ + 8);
+ if (tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Blocks.stone)
+ || tBlock
+ .isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Dimension_Everglades.blockSecondLayer)
+ || tBlock
+ .isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Dimension_Everglades.blockMainFiller)
+ || tBlock.isReplaceableOreGen(
+ aWorld,
+ aChunkX + 8,
+ tMinY,
+ aChunkZ + 8,
+ Dimension_Everglades.blockSecondaryFiller)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Blocks.netherrack)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Blocks.end_stone)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, GregTech_API.sBlockGranites)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, GregTech_API.sBlockStones)) {
+ // Didn't reach, but could have placed. Save orevein for future use.
+ return NO_OVERLAP;
+ } else {
+ // Didn't reach, but couldn't place in test spot anywys, try for another orevein
+ return NO_OVERLAP_AIR_BLOCK;
+ }
+ }
+ // Determine North/Sound ends of orevein
+ int nZVein = aSeedZ - aRandom.nextInt(mSize);
+ int sZVein = aSeedZ + 16 + aRandom.nextInt(mSize);
+
+ int nZ = Math.max(nZVein, aChunkZ + 2); // Bias placement by 2 blocks to prevent worldgen cascade.
+ int sZ = Math.min(sZVein, aChunkZ + 2 + 16);
+ if (nZ >= sZ) { // No overlap between orevein and this chunk exists in Z
+ Block tBlock = aWorld.getBlock(aChunkX + 8, tMinY, aChunkZ + 8);
+ if (tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Blocks.stone)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Blocks.netherrack)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, Blocks.end_stone)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, GregTech_API.sBlockGranites)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 8, tMinY, aChunkZ + 8, GregTech_API.sBlockStones)) {
+ // Didn't reach, but could have placed. Save orevein for future use.
+ return NO_OVERLAP;
+ } else {
+ // Didn't reach, but couldn't place in test spot anywys, try for another orevein
+ return NO_OVERLAP_AIR_BLOCK;
+ }
+ }
+
+ if (debugWorldGen) {
+ String tDimensionName = aWorld.provider.getDimensionName();
+ GT_Log.out.print(
+ "Trying Orevein:" + this.mWorldGenName
+ + " Dimension="
+ + tDimensionName
+ + " mX="
+ + aChunkX / 16
+ + " mZ="
+ + aChunkZ / 16
+ + " oreseedX="
+ + aSeedX / 16
+ + " oreseedZ="
+ + aSeedZ / 16
+ + " cY="
+ + tMinY);
+ }
+ // Adjust the density down the more chunks we are away from the oreseed. The 5 chunks surrounding the seed
+ // should always be max density due to truncation of Math.sqrt().
+ int localDensity = (Math.max(
+ 1,
+ this.mDensity / ((int) Math
+ .sqrt(2 + Math.pow(aChunkX / 16 - aSeedX / 16, 2) + Math.pow(aChunkZ / 16 - aSeedZ / 16, 2)))));
+
+ // To allow for early exit due to no ore placed in the bottom layer (probably because we are in the sky), unroll
+ // 1 pass through the loop
+ // Now we do bottom-level-first oregen, and work our way upwards.
+ int level = tMinY - 1; // Dunno why, but the first layer is actually played one below tMinY. Go figure.
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math
+ .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSecondaryMeta != null)) {
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, false)) {
+ placeCount[1]++;
+ }
+ } else
+ if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta != null)) { // Sporadics are only 1 per vertical column normally,
+ // reduce by 1/7 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, false)) placeCount[3]++;
+ }
+ }
+ }
+ /*
+ * if ((placeCount[1]+placeCount[3])==0) { if (debugWorldGen) GT_Log.out.println( " No ore in bottom layer" );
+ * return NO_ORE_IN_BOTTOM_LAYER; // Exit early, didn't place anything in the bottom layer }
+ */
+ Logger.WORLD("[World Generation Debug] Trying to set Ores?");
+ for (level = tMinY; level < (tMinY - 1 + 3); level++) {
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math.max(
+ 1,
+ Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSecondaryMeta != null)) {
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, false)) {
+ placeCount[1]++;
+ }
+ } else if ((aRandom.nextInt(7) == 0)
+ && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta != null)) { // Sporadics are only 1 per vertical column normally,
+ // reduce by 1/7 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, false)) placeCount[3]++;
+ }
+ }
+ }
+ }
+ // Low Middle layer is between + sporadic
+ // level should be = tMinY-1+3 from end of for loop
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math
+ .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mBetweenMeta != null)) { // Between are only 1 per vertical column, reduce by 1/2 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, false)) {
+ placeCount[2]++;
+ }
+ } else
+ if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta != null)) { // Sporadics are only 1 per vertical column normally,
+ // reduce by 1/7 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, false)) placeCount[3]++;
+ }
+ }
+ }
+ // High Middle layer is between + primary + sporadic
+ level++; // Increment level to next layer
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math
+ .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mBetweenMeta != null)) { // Between are only 1 per vertical column, reduce by 1/2 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, false)) {
+ placeCount[2]++;
+ }
+ } else if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mPrimaryMeta != null)) {
+ if (setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, false)) {
+ placeCount[0]++;
+ }
+ } else
+ if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta != null)) { // Sporadics are only 1 per vertical column normally,
+ // reduce by 1/7 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, false)) placeCount[3]++;
+ }
+ }
+ }
+ // Top two layers are primary + sporadic
+ level++; // Increment level to next layer
+ for (; level < (tMinY + 6); level++) { // should do two layers
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math.max(
+ 1,
+ Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mPrimaryMeta != null)) {
+ if (setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, false)) {
+ placeCount[0]++;
+ }
+ } else if ((aRandom.nextInt(7) == 0)
+ && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta != null)) { // Sporadics are only 1 per vertical column normally,
+ // reduce by 1/7 to
+ // compensate
+ if (setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, false)) placeCount[3]++;
+ }
+ }
+ }
+ }
+ if (debugWorldGen) {
+ String tDimensionName = aWorld.provider.getDimensionName();
+ GT_Log.out.println(
+ "Generated Orevein:" + this.mWorldGenName
+ + " Dimension="
+ + tDimensionName
+ + " mX="
+ + aChunkX / 16
+ + " mZ="
+ + aChunkZ / 16
+ + " oreseedX="
+ + aSeedX / 16
+ + " oreseedZ="
+ + aSeedZ / 16
+ + " cY="
+ + tMinY
+ + " wXVein"
+ + wXVein
+ + " eXVein"
+ + eXVein
+ + " nZVein"
+ + nZVein
+ + " sZVein"
+ + sZVein
+ + " locDen="
+ + localDensity
+ + " Den="
+ + this.mDensity
+ + " Sec="
+ + placeCount[1]
+ + " Spo="
+ + placeCount[3]
+ + " Bet="
+ + placeCount[2]
+ + " Pri="
+ + placeCount[0]);
+ }
+ // Something (at least the bottom layer must have 1 block) must have been placed, return true
+ return ORE_PLACED;
+ }
+
+ private String fString = "unset", ore1String = "unset", ore2String = "unset", ore3String = "unset",
+ ore4String = "unset";
+ Map<Materials, String> gtOreMap = new HashMap<>();
+
+ public boolean setOreBlock(World aWorld, int aX, int aY, int aZ, Block aMetaData, boolean isSmallOre, boolean air) {
+ if (!air) {
+ aY = Math.min(aWorld.getActualHeight(), Math.max(aY, 1));
+ }
+
+ // Set GT ORE
+ if (aMetaData instanceof GT_Block_Ores) {
+ if (ore1String.equals("unset")) {
+ ore1String = Utils.sanitizeString(
+ this.mPrimary.getLocalizedName()
+ .toLowerCase());
+ }
+ if (ore2String.equals("unset")) {
+ ore2String = Utils.sanitizeString(
+ this.mSecondaryMeta.getLocalizedName()
+ .toLowerCase());
+ }
+ if (ore3String.equals("unset")) {
+ ore3String = Utils.sanitizeString(
+ this.mBetweenMeta.getLocalizedName()
+ .toLowerCase());
+ }
+ if (ore4String.equals("unset")) {
+ ore4String = Utils.sanitizeString(
+ this.mSporadicMeta.getLocalizedName()
+ .toLowerCase());
+ }
+
+ if (this.mPrimaryMeta == aMetaData) {
+ for (Materials f : Materials.values()) {
+ if (!gtOreMap.containsKey(f)) {
+ gtOreMap.put(f, Utils.sanitizeString(f.mName.toLowerCase()));
+ }
+ fString = gtOreMap.get(f);
+ if (fString.contains(ore1String)) {
+ int r = f.mMetaItemSubID;
+ if (setOreBlock(aWorld, aX, aY, aZ, r, false)) {
+ Logger.WORLD(
+ "[World Generation Debug] Set " + f.mDefaultLocalName
+ + " Ore at X: "
+ + aX
+ + " | Y: "
+ + aY
+ + " | Z: "
+ + aZ);
+ return true;
+ }
+ }
+ }
+ }
+ if (this.mSecondaryMeta == aMetaData) {
+ for (Materials f : Materials.values()) {
+ if (!gtOreMap.containsKey(f)) {
+ gtOreMap.put(f, Utils.sanitizeString(f.mName.toLowerCase()));
+ }
+ fString = gtOreMap.get(f);
+ if (fString.contains(ore2String)) {
+ int r = f.mMetaItemSubID;
+ if (setOreBlock(aWorld, aX, aY, aZ, r, false)) {
+ Logger.WORLD(
+ "[World Generation Debug] Set " + f.mDefaultLocalName
+ + " Ore at X: "
+ + aX
+ + " | Y: "
+ + aY
+ + " | Z: "
+ + aZ);
+ return true;
+ }
+ }
+ }
+ }
+ if (this.mBetweenMeta == aMetaData) {
+ for (Materials f : Materials.values()) {
+ if (!gtOreMap.containsKey(f)) {
+ gtOreMap.put(f, Utils.sanitizeString(f.mName.toLowerCase()));
+ }
+ fString = gtOreMap.get(f);
+ if (fString.contains(ore3String)) {
+ int r = f.mMetaItemSubID;
+ if (setOreBlock(aWorld, aX, aY, aZ, r, false)) {
+ Logger.WORLD(
+ "[World Generation Debug] Set " + f.mDefaultLocalName
+ + " Ore at X: "
+ + aX
+ + " | Y: "
+ + aY
+ + " | Z: "
+ + aZ);
+ return true;
+ }
+ }
+ }
+ }
+ if (this.mSporadicMeta == aMetaData) {
+ for (Materials f : Materials.values()) {
+ if (!gtOreMap.containsKey(f)) {
+ gtOreMap.put(f, Utils.sanitizeString(f.mName.toLowerCase()));
+ }
+ fString = gtOreMap.get(f);
+ if (fString.contains(ore4String)) {
+ int r = f.mMetaItemSubID;
+ if (setOreBlock(aWorld, aX, aY, aZ, r, false)) {
+ Logger.WORLD(
+ "[World Generation Debug] Set " + f.mDefaultLocalName
+ + " Ore at X: "
+ + aX
+ + " | Y: "
+ + aY
+ + " | Z: "
+ + aZ);
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ Block tBlock = aWorld.getBlock(aX, aY, aZ);
+ Block tOreBlock = aMetaData;
+ int BlockMeta = aWorld.getBlockMetadata(aX, aY, aZ);
+ String BlockName = tBlock.getUnlocalizedName();
+ if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.stone)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.sand)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.dirt)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockGranites)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockStones)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Dimension_Everglades.blockSecondLayer)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Dimension_Everglades.blockMainFiller)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Dimension_Everglades.blockSecondaryFiller)
+ || tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.sandstone)) {
+
+ if (aWorld.setBlock(aX, aY, aZ, tOreBlock, 0, 3)) {
+ Logger.WORLD(
+ "[World Generation Debug] Set " + tOreBlock
+ .getLocalizedName() + " at X: " + aX + " | Y: " + aY + " | Z: " + aZ);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int mMetaItemSubID, boolean useless) {
+
+ // Get Class and Methods
+ Method setOres = null;
+
+ try {
+ setOres = GT_TileEntity_Ores.class.getDeclaredMethod(
+ "setOreBlock",
+ World.class,
+ int.class,
+ int.class,
+ int.class,
+ int.class,
+ boolean.class);
+ } catch (NoSuchMethodException | SecurityException e) {
+
+ }
+
+ try {
+ if (setOres != null) {
+ setOres.invoke(null, aWorld, aX, aY, aZ, mMetaItemSubID, useless);
+ } else {
+ return false;
+ }
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+
+ }
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_Ores.java b/gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_Ores.java
new file mode 100644
index 0000000000..e45b4bcd20
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/gen/gt/WorldGen_Ores.java
@@ -0,0 +1,263 @@
+package gtPlusPlus.everglades.gen.gt;
+
+import java.util.Hashtable;
+
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.ORES;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+
+public class WorldGen_Ores {
+
+ public static WorldGen_GT_Ore_Layer BaseVein = new WorldGen_GT_Ore_Layer(
+ "veinA",
+ 20,
+ 40,
+ 1,
+ 1,
+ 128,
+ ELEMENT.getInstance().IRON,
+ ELEMENT.getInstance().IRON,
+ ELEMENT.getInstance().IRON,
+ ELEMENT.getInstance().IRON);
+
+ /**
+ * Custom ore Veins
+ */
+ public static WorldGen_GT_Ore_Layer Vein1 = new WorldGen_GT_Ore_Layer(
+ "vein1",
+ 0,
+ 60,
+ 30,
+ 2,
+ 16,
+ ORES.AGARDITE_CD,
+ ORES.AGARDITE_LA,
+ ORES.DEMICHELEITE_BR,
+ ORES.IRARSITE);
+
+ public static WorldGen_GT_Ore_Layer Vein2 = new WorldGen_GT_Ore_Layer(
+ "vein2",
+ 0,
+ 60,
+ 30,
+ 2,
+ 16,
+ ORES.AGARDITE_ND,
+ ORES.AGARDITE_Y,
+ ORES.KASHINITE,
+ ORES.CERITE);
+
+ public static WorldGen_GT_Ore_Layer Vein3 = new WorldGen_GT_Ore_Layer(
+ "vein3",
+ 0,
+ 60,
+ 30,
+ 3,
+ 32,
+ ORES.CERITE,
+ ORES.NICHROMITE,
+ ORES.XENOTIME,
+ ORES.HIBONITE);
+
+ public static WorldGen_GT_Ore_Layer Vein4 = new WorldGen_GT_Ore_Layer(
+ "vein4",
+ 0,
+ 60,
+ 40,
+ 3,
+ 32,
+ ORES.GEIKIELITE,
+ ORES.CRYOLITE,
+ ORES.GADOLINITE_CE,
+ ORES.AGARDITE_ND);
+
+ public static WorldGen_GT_Ore_Layer Vein5 = new WorldGen_GT_Ore_Layer(
+ "vein5",
+ 30,
+ 128,
+ 20,
+ 2,
+ 48,
+ ORES.HIBONITE,
+ ORES.YTTRIALITE,
+ ORES.ZIRCONILITE,
+ ORES.CERITE);
+ public static WorldGen_GT_Ore_Layer Vein6 = new WorldGen_GT_Ore_Layer(
+ "vein6",
+ 0,
+ 40,
+ 20,
+ 2,
+ 48,
+ ORES.XENOTIME,
+ ORES.ZIRKELITE,
+ ORES.CROCROITE,
+ ORES.IRARSITE);
+ public static WorldGen_GT_Ore_Layer Vein7 = new WorldGen_GT_Ore_Layer(
+ "vein7",
+ 40,
+ 128,
+ 20,
+ 2,
+ 48,
+ ORES.HONEAITE,
+ ORES.MIESSIITE,
+ ORES.SAMARSKITE_Y,
+ ORES.SAMARSKITE_YB);
+ public static WorldGen_GT_Ore_Layer Vein8 = new WorldGen_GT_Ore_Layer(
+ "vein8",
+ 0,
+ 40,
+ 20,
+ 2,
+ 48,
+ ORES.TITANITE,
+ ORES.ZIMBABWEITE,
+ ORES.ZIRCON,
+ ORES.FLORENCITE);
+
+ public static WorldGen_GT_Ore_Layer Vein9 = new WorldGen_GT_Ore_Layer(
+ "vein9",
+ 10,
+ 30,
+ 20,
+ 1,
+ 48,
+ ORES.LANTHANITE_CE,
+ FLUORIDES.FLUORITE,
+ ORES.LAFOSSAITE,
+ ORES.FLORENCITE);
+ public static WorldGen_GT_Ore_Layer Vein10 = new WorldGen_GT_Ore_Layer(
+ "vein10",
+ 20,
+ 50,
+ 20,
+ 2,
+ 32,
+ ORES.GEIKIELITE,
+ ORES.YTTROCERITE,
+ ORES.LANTHANITE_LA,
+ ORES.RADIOBARITE);
+ public static WorldGen_GT_Ore_Layer Vein11 = new WorldGen_GT_Ore_Layer(
+ "vein11",
+ 30,
+ 70,
+ 20,
+ 1,
+ 48,
+ FLUORIDES.FLUORITE,
+ ORES.KASHINITE,
+ ORES.ZIRCON,
+ ORES.CRYOLITE);
+ public static WorldGen_GT_Ore_Layer Vein12 = new WorldGen_GT_Ore_Layer(
+ "vein12",
+ 40,
+ 80,
+ 20,
+ 3,
+ 32,
+ ORES.CERITE,
+ ORES.ALBURNITE,
+ ORES.MIESSIITE,
+ ORES.HIBONITE);
+
+ /**
+ * Best Rarest Veins 2017
+ */
+ public static WorldGen_GT_Ore_Layer Vein13 = new WorldGen_GT_Ore_Layer(
+ "vein13",
+ 5,
+ 15,
+ 5,
+ 1,
+ 16,
+ ORES.CRYOLITE,
+ ORES.RADIOBARITE,
+ ORES.HONEAITE,
+ ORES.FLORENCITE);
+
+ public static WorldGen_GT_Ore_Layer Vein14 = new WorldGen_GT_Ore_Layer(
+ "vein14",
+ 10,
+ 20,
+ 8,
+ 2,
+ 16,
+ ORES.DEMICHELEITE_BR,
+ ORES.PERROUDITE,
+ ORES.IRARSITE,
+ ORES.RADIOBARITE);
+
+ public static WorldGen_GT_Ore_Layer Vein15 = new WorldGen_GT_Ore_Layer(
+ "vein15",
+ 5,
+ 25,
+ 5,
+ 3,
+ 24,
+ ORES.FLUORCAPHITE,
+ ORES.LAFOSSAITE,
+ ORES.GADOLINITE_CE,
+ ORES.GADOLINITE_Y);
+
+ public static WorldGen_GT_Ore_Layer Vein16 = new WorldGen_GT_Ore_Layer(
+ "vein16",
+ 0,
+ 25,
+ 4,
+ 2,
+ 32,
+ ORES.YTTROCERITE,
+ ORES.LEPERSONNITE,
+ ORES.LAUTARITE,
+ FLUORIDES.FLUORITE);
+
+ public static WorldGen_GT_Ore_Layer Vein17 = new WorldGen_GT_Ore_Layer(
+ "vein17",
+ 10,
+ 35,
+ 4,
+ 1,
+ 32,
+ ORES.FLORENCITE,
+ ORES.LAUTARITE,
+ ORES.SAMARSKITE_YB,
+ ORES.POLYCRASE);
+ public static WorldGen_GT_Ore_Layer Vein18 = new WorldGen_GT_Ore_Layer(
+ "vein18",
+ 15,
+ 40,
+ 4,
+ 1,
+ 48,
+ ORES.GADOLINITE_CE,
+ ORES.GADOLINITE_Y,
+ ORES.AGARDITE_LA,
+ ORES.AGARDITE_CD);
+
+ public static Hashtable<Long, WorldGen_GT_Ore_Layer> validOreveins = new Hashtable<>(1024);
+
+ static long ID = 0;
+
+ public static void generateValidOreVeins() {
+ validOreveins.put(ID++, BaseVein);
+ validOreveins.put(ID++, Vein1);
+ validOreveins.put(ID++, Vein2);
+ validOreveins.put(ID++, Vein3);
+ validOreveins.put(ID++, Vein4);
+ validOreveins.put(ID++, Vein5);
+ validOreveins.put(ID++, Vein6);
+ validOreveins.put(ID++, Vein7);
+ validOreveins.put(ID++, Vein8);
+ validOreveins.put(ID++, Vein9);
+ validOreveins.put(ID++, Vein10);
+ validOreveins.put(ID++, Vein11);
+ validOreveins.put(ID++, Vein12);
+ validOreveins.put(ID++, Vein13);
+ validOreveins.put(ID++, Vein14);
+ validOreveins.put(ID++, Vein15);
+ validOreveins.put(ID++, Vein16);
+ validOreveins.put(ID++, Vein17);
+ validOreveins.put(ID++, Vein18);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/item/ItemBlockToxicEverglades.java b/gtpp/src/main/java/gtPlusPlus/everglades/item/ItemBlockToxicEverglades.java
new file mode 100644
index 0000000000..b5c66ff8b4
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/item/ItemBlockToxicEverglades.java
@@ -0,0 +1,37 @@
+package gtPlusPlus.everglades.item;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.interfaces.ITileTooltip;
+
+public class ItemBlockToxicEverglades extends ItemBlock {
+
+ protected final int mID;
+
+ public ItemBlockToxicEverglades(final Block block) {
+ super(block);
+ this.mID = ((ITileTooltip) block).getTooltipID();
+ }
+
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ if (this.mID == 0) { // blockDarkWorldPortalFrame
+ list.add("Use this to access the Toxic Everglades.");
+ list.add("Assembled in the same shape as the Nether Portal.");
+ } else if (this.mID == 1) { // blockDarkWorldPortal
+ list.add("Place this if you are lazy to create the portal structure, slacker.");
+ } else if (this.mID == 2) { // blockDarkWorldGround
+ list.add("Will burn very quickly if it happens to catch fire.");
+ } else if (this.mID == 3) { // blockDarkWorldPollutedDirt
+ list.add("Maybe you can do something with this?.");
+ if (stack.getItemDamage() > 0) {
+ list.add("This smells worse than a bean fart...");
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/item/ItemEvergladesPortalTrigger.java b/gtpp/src/main/java/gtPlusPlus/everglades/item/ItemEvergladesPortalTrigger.java
new file mode 100644
index 0000000000..be15c2a0d2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/item/ItemEvergladesPortalTrigger.java
@@ -0,0 +1,113 @@
+package gtPlusPlus.everglades.item;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+
+public class ItemEvergladesPortalTrigger extends Item {
+
+ public ItemEvergladesPortalTrigger() {
+ super();
+ this.maxStackSize = 1;
+ setMaxDamage(64);
+ setCreativeTab(CreativeTabs.tabTools);
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemAlkalusDisk");
+ }
+
+ @Override
+ public Item setMaxStackSize(int int1) {
+ return super.setMaxStackSize(1);
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack thisItem) {
+ return EnumRarity.epic;
+ }
+
+ @Override
+ public boolean hasEffect(ItemStack par1ItemStack, int pass) {
+ return true;
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack p_77653_1_) {
+ return EnumChatFormatting.GOLD + "Alkalus Disk ["
+ + EnumChatFormatting.RED
+ + "Activated"
+ + EnumChatFormatting.GOLD
+ + "]";
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ list.add(EnumChatFormatting.GREEN + "Shines the way, towards the far away Everglades.");
+ list.add(
+ EnumChatFormatting.GREEN + "This item produces such a temperature, that you'd hate to use it incorrectly.");
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ return Utils.rgbtoHexValue(255, 128, 0);
+ }
+
+ @Override
+ public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4,
+ int par5, int par6, int par7, float par8, float par9, float par10) {
+ if (par7 == 0) {
+ par5--;
+ }
+ if (par7 == 1) {
+ par5++;
+ }
+ if (par7 == 2) {
+ par6--;
+ }
+ if (par7 == 3) {
+ par6++;
+ }
+ if (par7 == 4) {
+ par4--;
+ }
+ if (par7 == 5) {
+ par4++;
+ }
+ if (!par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack)) {
+ return false;
+ }
+ Block i1 = par3World.getBlock(par4, par5, par6);
+ if (i1 == Blocks.air) {
+ par3World.playSoundEffect(
+ par4 + 0.5D,
+ par5 + 0.5D,
+ par6 + 0.5D,
+ "fire.ignite",
+ 1.0F,
+ itemRand.nextFloat() * 0.4F + 0.8F);
+ if (Dimension_Everglades.portalBlock.tryToCreatePortal(par3World, par4, par5, par6)) {
+ // Make a Portal
+ } else {
+ if (!par3World.isRemote) {
+ par3World.setBlock(par4, par5, par6, ModBlocks.blockHellfire, 0, 3);
+ }
+ }
+ }
+ par1ItemStack.damageItem(1, par2EntityPlayer);
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/world/TeleporterDimensionMod.java b/gtpp/src/main/java/gtPlusPlus/everglades/world/TeleporterDimensionMod.java
new file mode 100644
index 0000000000..51f549ad9c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/world/TeleporterDimensionMod.java
@@ -0,0 +1,472 @@
+package gtPlusPlus.everglades.world;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.util.Direction;
+import net.minecraft.util.LongHashMap;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.Teleporter;
+import net.minecraft.world.WorldServer;
+
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+
+public class TeleporterDimensionMod extends Teleporter {
+
+ private final WorldServer worldServerInstance;
+ /**
+ * A private Random() function in Teleporter
+ */
+ private final Random random;
+ /**
+ * Stores successful portal placement locations for rapid lookup.
+ */
+ private final LongHashMap destinationCoordinateCache = new LongHashMap();
+ /**
+ * A list of valid keys for the destinationCoordainteCache. These are based on the X & Z of the players initial
+ * location.
+ */
+ @SuppressWarnings("rawtypes")
+ private final List destinationCoordinateKeys = new ArrayList();
+
+ public TeleporterDimensionMod(WorldServer par1WorldServer) {
+ super(par1WorldServer);
+ this.worldServerInstance = par1WorldServer;
+ this.random = new Random(par1WorldServer.getSeed());
+ }
+
+ /**
+ * Place an entity in a nearby portal, creating one if necessary.
+ */
+ @Override
+ public void placeInPortal(Entity par1Entity, double par2, double par4, double par6, float par8) {
+ if (this.worldServerInstance.provider.dimensionId != 1) {
+ if (!this.placeInExistingPortal(par1Entity, par2, par4, par6, par8)) {
+ this.makePortal(par1Entity);
+ this.placeInExistingPortal(par1Entity, par2, par4, par6, par8);
+ }
+ } else {
+ int i = MathHelper.floor_double(par1Entity.posX);
+ int j = MathHelper.floor_double(par1Entity.posY) - 1;
+ int k = MathHelper.floor_double(par1Entity.posZ);
+ byte b0 = 1;
+ byte b1 = 0;
+
+ for (int l = -2; l <= 2; ++l) {
+ for (int i1 = -2; i1 <= 2; ++i1) {
+ for (int j1 = -1; j1 < 3; ++j1) {
+ int k1 = i + i1 * b0 + l * b1;
+ int l1 = j + j1;
+ int i2 = k + i1 * b1 - l * b0;
+ boolean flag = j1 < 0;
+ this.worldServerInstance
+ .setBlock(k1, l1, i2, flag ? Dimension_Everglades.blockPortalFrame : Blocks.air);
+ }
+ }
+ }
+
+ par1Entity.setLocationAndAngles(i, j, k, par1Entity.rotationYaw, 0.0F);
+ par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D;
+ }
+ }
+
+ /**
+ * Place an entity in a nearby portal which already exists.
+ */
+ @Override
+ public boolean placeInExistingPortal(Entity par1Entity, double par2, double par4, double par6, float par8) {
+ short short1 = 128;
+ double d3 = -1.0D;
+ int i = 0;
+ int j = 0;
+ int k = 0;
+ int l = MathHelper.floor_double(par1Entity.posX);
+ int i1 = MathHelper.floor_double(par1Entity.posZ);
+ long j1 = ChunkCoordIntPair.chunkXZ2Int(l, i1);
+ boolean flag = true;
+ double d7;
+ int l3;
+
+ if (this.destinationCoordinateCache.containsItem(j1)) {
+ Teleporter.PortalPosition portalposition = (Teleporter.PortalPosition) this.destinationCoordinateCache
+ .getValueByKey(j1);
+ d3 = 0.0D;
+ i = portalposition.posX;
+ j = portalposition.posY;
+ k = portalposition.posZ;
+ portalposition.lastUpdateTime = this.worldServerInstance.getTotalWorldTime();
+ flag = false;
+ } else {
+ for (l3 = l - short1; l3 <= l + short1; ++l3) {
+ double d4 = l3 + 0.5D - par1Entity.posX;
+
+ for (int l1 = i1 - short1; l1 <= i1 + short1; ++l1) {
+ double d5 = l1 + 0.5D - par1Entity.posZ;
+
+ for (int i2 = this.worldServerInstance.getActualHeight() - 1; i2 >= 0; --i2) {
+ if (this.worldServerInstance.getBlock(l3, i2, l1) == Dimension_Everglades.portalBlock) {
+ while (this.worldServerInstance.getBlock(l3, i2 - 1, l1)
+ == Dimension_Everglades.portalBlock) {
+ --i2;
+ }
+
+ d7 = i2 + 0.5D - par1Entity.posY;
+ double d8 = d4 * d4 + d7 * d7 + d5 * d5;
+
+ if (d3 < 0.0D || d8 < d3) {
+ d3 = d8;
+ i = l3;
+ j = i2;
+ k = l1;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (d3 >= 0.0D) {
+ if (flag) {
+ this.destinationCoordinateCache
+ .add(j1, new Teleporter.PortalPosition(i, j, k, this.worldServerInstance.getTotalWorldTime()));
+ this.destinationCoordinateKeys.add(Long.valueOf(j1));
+ }
+
+ double d11 = i + 0.5D;
+ double d6 = j + 0.5D;
+ d7 = k + 0.5D;
+ int i4 = -1;
+
+ if (this.worldServerInstance.getBlock(i - 1, j, k) == Dimension_Everglades.portalBlock) {
+ i4 = 2;
+ }
+
+ if (this.worldServerInstance.getBlock(i + 1, j, k) == Dimension_Everglades.portalBlock) {
+ i4 = 0;
+ }
+
+ if (this.worldServerInstance.getBlock(i, j, k - 1) == Dimension_Everglades.portalBlock) {
+ i4 = 3;
+ }
+
+ if (this.worldServerInstance.getBlock(i, j, k + 1) == Dimension_Everglades.portalBlock) {
+ i4 = 1;
+ }
+
+ int j2 = par1Entity.getTeleportDirection();
+
+ if (i4 > -1) {
+ int k2 = Direction.rotateLeft[i4];
+ int l2 = Direction.offsetX[i4];
+ int i3 = Direction.offsetZ[i4];
+ int j3 = Direction.offsetX[k2];
+ int k3 = Direction.offsetZ[k2];
+ boolean flag1 = !this.worldServerInstance.isAirBlock(i + l2 + j3, j, k + i3 + k3)
+ || !this.worldServerInstance.isAirBlock(i + l2 + j3, j + 1, k + i3 + k3);
+ boolean flag2 = !this.worldServerInstance.isAirBlock(i + l2, j, k + i3)
+ || !this.worldServerInstance.isAirBlock(i + l2, j + 1, k + i3);
+
+ if (flag1 && flag2) {
+ i4 = Direction.rotateOpposite[i4];
+ k2 = Direction.rotateOpposite[k2];
+ l2 = Direction.offsetX[i4];
+ i3 = Direction.offsetZ[i4];
+ j3 = Direction.offsetX[k2];
+ k3 = Direction.offsetZ[k2];
+ l3 = i - j3;
+ d11 -= j3;
+ int k1 = k - k3;
+ d7 -= k3;
+ flag1 = !this.worldServerInstance.isAirBlock(l3 + l2 + j3, j, k1 + i3 + k3)
+ || !this.worldServerInstance.isAirBlock(l3 + l2 + j3, j + 1, k1 + i3 + k3);
+ flag2 = !this.worldServerInstance.isAirBlock(l3 + l2, j, k1 + i3)
+ || !this.worldServerInstance.isAirBlock(l3 + l2, j + 1, k1 + i3);
+ }
+
+ float f1 = 0.5F;
+ float f2 = 0.5F;
+
+ if (!flag1 && flag2) {
+ f1 = 1.0F;
+ } else if (flag1 && !flag2) {
+ f1 = 0.0F;
+ } else if (flag1 && flag2) {
+ f2 = 0.0F;
+ }
+
+ d11 += j3 * f1 + f2 * l2;
+ d7 += k3 * f1 + f2 * i3;
+ float f3 = 0.0F;
+ float f4 = 0.0F;
+ float f5 = 0.0F;
+ float f6 = 0.0F;
+
+ if (i4 == j2) {
+ f3 = 1.0F;
+ f4 = 1.0F;
+ } else if (i4 == Direction.rotateOpposite[j2]) {
+ f3 = -1.0F;
+ f4 = -1.0F;
+ } else if (i4 == Direction.rotateRight[j2]) {
+ f5 = 1.0F;
+ f6 = -1.0F;
+ } else {
+ f5 = -1.0F;
+ f6 = 1.0F;
+ }
+
+ double d9 = par1Entity.motionX;
+ double d10 = par1Entity.motionZ;
+ par1Entity.motionX = d9 * f3 + d10 * f6;
+ par1Entity.motionZ = d9 * f5 + d10 * f4;
+ par1Entity.rotationYaw = par8 - j2 * 90 + i4 * 90;
+ } else {
+ par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D;
+ }
+
+ par1Entity.setLocationAndAngles(d11, d6, d7, par1Entity.rotationYaw, par1Entity.rotationPitch);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean makePortal(Entity par1Entity) {
+ byte b0 = 16;
+ double d0 = -1.0D;
+ int i = MathHelper.floor_double(par1Entity.posX);
+ int j = MathHelper.floor_double(par1Entity.posY);
+ int k = MathHelper.floor_double(par1Entity.posZ);
+ int l = i;
+ int i1 = j;
+ int j1 = k;
+ int k1 = 0;
+ int l1 = this.random.nextInt(4);
+ int i2;
+ double d1;
+ double d2;
+ int k2;
+ int i3;
+ int k3;
+ int j3;
+ int i4;
+ int l3;
+ int k4;
+ int j4;
+ int i5;
+ int l4;
+ double d3;
+ double d4;
+
+ for (i2 = i - b0; i2 <= i + b0; ++i2) {
+ d1 = i2 + 0.5D - par1Entity.posX;
+
+ for (k2 = k - b0; k2 <= k + b0; ++k2) {
+ d2 = k2 + 0.5D - par1Entity.posZ;
+ label274: for (i3 = this.worldServerInstance.getActualHeight() - 1; i3 >= 0; --i3) {
+ if (this.worldServerInstance.isAirBlock(i2, i3, k2)) {
+ while (i3 > 0 && this.worldServerInstance.isAirBlock(i2, i3 - 1, k2)) {
+ --i3;
+ }
+
+ for (j3 = l1; j3 < l1 + 4; ++j3) {
+ k3 = j3 % 2;
+ l3 = 1 - k3;
+
+ if (j3 % 4 >= 2) {
+ k3 = -k3;
+ l3 = -l3;
+ }
+
+ for (i4 = 0; i4 < 3; ++i4) {
+ for (j4 = 0; j4 < 4; ++j4) {
+ for (k4 = -1; k4 < 4; ++k4) {
+ l4 = i2 + (j4 - 1) * k3 + i4 * l3;
+ i5 = i3 + k4;
+ int j5 = k2 + (j4 - 1) * l3 - i4 * k3;
+
+ if (k4 < 0 && !this.worldServerInstance.getBlock(l4, i5, j5)
+ .getMaterial()
+ .isSolid() || k4 >= 0 && !this.worldServerInstance.isAirBlock(l4, i5, j5)) {
+ continue label274;
+ }
+ }
+ }
+ }
+
+ d4 = i3 + 0.5D - par1Entity.posY;
+ d3 = d1 * d1 + d4 * d4 + d2 * d2;
+
+ if (d0 < 0.0D || d3 < d0) {
+ d0 = d3;
+ l = i2;
+ i1 = i3;
+ j1 = k2;
+ k1 = j3 % 4;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (d0 < 0.0D) {
+ for (i2 = i - b0; i2 <= i + b0; ++i2) {
+ d1 = i2 + 0.5D - par1Entity.posX;
+
+ for (k2 = k - b0; k2 <= k + b0; ++k2) {
+ d2 = k2 + 0.5D - par1Entity.posZ;
+ label222: for (i3 = this.worldServerInstance.getActualHeight() - 1; i3 >= 0; --i3) {
+ if (this.worldServerInstance.isAirBlock(i2, i3, k2)) {
+ while (i3 > 0 && this.worldServerInstance.isAirBlock(i2, i3 - 1, k2)) {
+ --i3;
+ }
+
+ for (j3 = l1; j3 < l1 + 2; ++j3) {
+ k3 = j3 % 2;
+ l3 = 1 - k3;
+
+ for (i4 = 0; i4 < 4; ++i4) {
+ for (j4 = -1; j4 < 4; ++j4) {
+ k4 = i2 + (i4 - 1) * k3;
+ l4 = i3 + j4;
+ i5 = k2 + (i4 - 1) * l3;
+
+ if (j4 < 0 && !this.worldServerInstance.getBlock(k4, l4, i5)
+ .getMaterial()
+ .isSolid() || j4 >= 0 && !this.worldServerInstance.isAirBlock(k4, l4, i5)) {
+ continue label222;
+ }
+ }
+ }
+
+ d4 = i3 + 0.5D - par1Entity.posY;
+ d3 = d1 * d1 + d4 * d4 + d2 * d2;
+
+ if (d0 < 0.0D || d3 < d0) {
+ d0 = d3;
+ l = i2;
+ i1 = i3;
+ j1 = k2;
+ k1 = j3 % 2;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ int k5 = l;
+ int j2 = i1;
+ k2 = j1;
+ int l5 = k1 % 2;
+ int l2 = 1 - l5;
+
+ if (k1 % 4 >= 2) {
+ l5 = -l5;
+ l2 = -l2;
+ }
+
+ boolean flag;
+
+ if (d0 < 0.0D) {
+ if (i1 < 70) {
+ i1 = 70;
+ }
+
+ if (i1 > this.worldServerInstance.getActualHeight() - 10) {
+ i1 = this.worldServerInstance.getActualHeight() - 10;
+ }
+
+ j2 = i1;
+
+ for (i3 = -1; i3 <= 1; ++i3) {
+ for (j3 = 1; j3 < 3; ++j3) {
+ for (k3 = -1; k3 < 3; ++k3) {
+ l3 = k5 + (j3 - 1) * l5 + i3 * l2;
+ i4 = j2 + k3;
+ j4 = k2 + (j3 - 1) * l2 - i3 * l5;
+ flag = k3 < 0;
+ this.worldServerInstance
+ .setBlock(l3, i4, j4, flag ? Dimension_Everglades.blockPortalFrame : Blocks.air);
+ }
+ }
+ }
+ }
+
+ for (i3 = 0; i3 < 4; ++i3) {
+ for (j3 = 0; j3 < 4; ++j3) {
+ for (k3 = -1; k3 < 4; ++k3) {
+ l3 = k5 + (j3 - 1) * l5;
+ i4 = j2 + k3;
+ j4 = k2 + (j3 - 1) * l2;
+ flag = j3 == 0 || j3 == 3 || k3 == -1 || k3 == 3;
+ this.worldServerInstance.setBlock(
+ l3,
+ i4,
+ j4,
+ flag ? Dimension_Everglades.blockPortalFrame : Dimension_Everglades.portalBlock,
+ 0,
+ 2);
+ }
+ }
+
+ for (j3 = 0; j3 < 4; ++j3) {
+ for (k3 = -1; k3 < 4; ++k3) {
+ l3 = k5 + (j3 - 1) * l5;
+ i4 = j2 + k3;
+ j4 = k2 + (j3 - 1) * l2;
+ this.worldServerInstance
+ .notifyBlocksOfNeighborChange(l3, i4, j4, this.worldServerInstance.getBlock(l3, i4, j4));
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * called periodically to remove out-of-date portal locations from the cache list. Argument par1 is a
+ * WorldServer.getTotalWorldTime() value.
+ */
+ @Override
+ public void removeStalePortalLocations(long par1) {
+ if (par1 % 100L == 0L) {
+ @SuppressWarnings("rawtypes")
+ Iterator iterator = this.destinationCoordinateKeys.iterator();
+ long j = par1 - 600L;
+
+ while (iterator.hasNext()) {
+ Long olong = (Long) iterator.next();
+ Teleporter.PortalPosition portalposition = (Teleporter.PortalPosition) this.destinationCoordinateCache
+ .getValueByKey(olong);
+
+ if (portalposition == null || portalposition.lastUpdateTime < j) {
+ iterator.remove();
+ this.destinationCoordinateCache.remove(olong);
+ }
+ }
+ }
+ }
+
+ public class PortalPosition extends ChunkCoordinates {
+
+ /**
+ * The worldtime at which this PortalPosition was last verified
+ */
+ public long lastUpdateTime;
+
+ public PortalPosition(int par2, int par3, int par4, long par5) {
+ super(par2, par3, par4);
+ this.lastUpdateTime = par5;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/world/WorldChunkManagerCustom.java b/gtpp/src/main/java/gtPlusPlus/everglades/world/WorldChunkManagerCustom.java
new file mode 100644
index 0000000000..d1a621addf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/world/WorldChunkManagerCustom.java
@@ -0,0 +1,250 @@
+package gtPlusPlus.everglades.world;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.crash.CrashReport;
+import net.minecraft.crash.CrashReportCategory;
+import net.minecraft.util.ReportedException;
+import net.minecraft.world.ChunkPosition;
+import net.minecraft.world.WorldType;
+import net.minecraft.world.biome.BiomeCache;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraft.world.biome.WorldChunkManager;
+import net.minecraft.world.gen.layer.GenLayer;
+import net.minecraft.world.gen.layer.IntCache;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.everglades.biome.GenLayerEverglades;
+
+public class WorldChunkManagerCustom extends WorldChunkManager {
+
+ private GenLayer genBiomes;
+ /** A GenLayer containing the indices into BiomeGenBase.biomeList[] */
+ private GenLayer biomeIndexLayer;
+ /** The BiomeCache object for this world. */
+ private BiomeCache biomeCache;
+ /** A list of biomes that the player can spawn in. */
+ private List<BiomeGenBase> biomesToSpawnIn;
+
+ @SuppressWarnings({ "rawtypes" })
+ public WorldChunkManagerCustom() {
+ this.biomeCache = new BiomeCache(this);
+ this.biomesToSpawnIn = new ArrayList();
+ this.biomesToSpawnIn.addAll(allowedBiomes); // TODO
+ }
+
+ public WorldChunkManagerCustom(long seed, WorldType worldType) {
+ this();
+ // i changed this to my GenLayerDarkWorld
+ GenLayer[] agenlayer = GenLayerEverglades.makeTheWorld(seed, worldType);
+
+ agenlayer = getModdedBiomeGenerators(worldType, seed, agenlayer);
+ this.genBiomes = agenlayer[0];
+ this.biomeIndexLayer = agenlayer[1];
+ }
+
+ /**
+ * Gets the list of valid biomes for the player to spawn in.
+ */
+ @Override
+ public List<BiomeGenBase> getBiomesToSpawnIn() {
+ return this.biomesToSpawnIn;
+ }
+
+ /**
+ * Returns a list of rainfall values for the specified blocks. Args: listToReuse, x, z, width, length.
+ */
+ @Override
+ public float[] getRainfall(float[] listToReuse, int x, int z, int width, int length) {
+ IntCache.resetIntCache();
+
+ if (listToReuse == null || listToReuse.length < width * length) {
+ listToReuse = new float[width * length];
+ }
+
+ int[] aint = this.biomeIndexLayer.getInts(x, z, width, length);
+
+ for (int i1 = 0; i1 < width * length; ++i1) {
+ try {
+ float f = BiomeGenBase.getBiome(aint[i1])
+ .getIntRainfall() / 65536.0F;
+
+ if (f > 1.0F) {
+ f = 1.0F;
+ }
+
+ listToReuse[i1] = f;
+ } catch (Throwable throwable) {
+ CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Invalid Biome id");
+ CrashReportCategory crashreportcategory = crashreport.makeCategory("DownfallBlock");
+ crashreportcategory.addCrashSection("biome id", Integer.valueOf(i1));
+ crashreportcategory.addCrashSection("downfalls[] size", Integer.valueOf(listToReuse.length));
+ crashreportcategory.addCrashSection("x", Integer.valueOf(x));
+ crashreportcategory.addCrashSection("z", Integer.valueOf(z));
+ crashreportcategory.addCrashSection("w", Integer.valueOf(width));
+ crashreportcategory.addCrashSection("h", Integer.valueOf(length));
+ throw new ReportedException(crashreport);
+ }
+ }
+
+ return listToReuse;
+ }
+
+ /**
+ * Return an adjusted version of a given temperature based on the y height
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public float getTemperatureAtHeight(float par1, int par2) {
+ return par1;
+ }
+
+ /**
+ * Returns an array of biomes for the location input.
+ */
+ @Override
+ public BiomeGenBase[] getBiomesForGeneration(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4,
+ int par5) {
+ IntCache.resetIntCache();
+
+ if (par1ArrayOfBiomeGenBase == null || par1ArrayOfBiomeGenBase.length < par4 * par5) {
+ par1ArrayOfBiomeGenBase = new BiomeGenBase[par4 * par5];
+ }
+
+ int[] aint = this.genBiomes.getInts(par2, par3, par4, par5);
+
+ try {
+ for (int i = 0; i < par4 * par5; ++i) {
+ par1ArrayOfBiomeGenBase[i] = BiomeGenBase.getBiome(aint[i]);
+ }
+
+ return par1ArrayOfBiomeGenBase;
+ } catch (Throwable throwable) {
+ CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Invalid Biome id");
+ CrashReportCategory crashreportcategory = crashreport.makeCategory("RawBiomeBlock");
+ crashreportcategory.addCrashSection("biomes[] size", Integer.valueOf(par1ArrayOfBiomeGenBase.length));
+ crashreportcategory.addCrashSection("x", Integer.valueOf(par2));
+ crashreportcategory.addCrashSection("z", Integer.valueOf(par3));
+ crashreportcategory.addCrashSection("w", Integer.valueOf(par4));
+ crashreportcategory.addCrashSection("h", Integer.valueOf(par5));
+ throw new ReportedException(crashreport);
+ }
+ }
+
+ /**
+ * Returns biomes to use for the blocks and loads the other data like temperature and humidity onto the
+ * WorldChunkManager Args: oldBiomeList, x, z, width, depth
+ */
+ @Override
+ public BiomeGenBase[] loadBlockGeneratorData(BiomeGenBase[] oldBiomeList, int x, int z, int width, int depth) {
+ return this.getBiomeGenAt(oldBiomeList, x, z, width, depth, true);
+ }
+
+ /**
+ * Return a list of biomes for the specified blocks. Args: listToReuse, x, y, width, length, cacheFlag (if false,
+ * don't check biomeCache to avoid infinite loop in BiomeCacheBlock)
+ */
+ @Override
+ public BiomeGenBase[] getBiomeGenAt(BiomeGenBase[] listToReuse, int x, int y, int width, int length,
+ boolean cacheFlag) {
+ IntCache.resetIntCache();
+
+ if (listToReuse == null || listToReuse.length < width * length) {
+ listToReuse = new BiomeGenBase[width * length];
+ }
+
+ if (cacheFlag && width == 16 && length == 16 && (x & 15) == 0 && (y & 15) == 0) {
+ BiomeGenBase[] abiomegenbase1 = this.biomeCache.getCachedBiomes(x, y);
+ System.arraycopy(abiomegenbase1, 0, listToReuse, 0, width * length);
+ return listToReuse;
+ } else {
+ int[] aint = this.biomeIndexLayer.getInts(x, y, width, length);
+
+ for (int i = 0; i < width * length; ++i) {
+ listToReuse[i] = BiomeGenBase.getBiome(aint[i]);
+ }
+ return listToReuse;
+ }
+ }
+
+ /**
+ * checks given Chunk's Biomes against List of allowed ones
+ */
+ @Override
+ @SuppressWarnings("rawtypes")
+ public boolean areBiomesViable(int x, int y, int z, List par4List) {
+ IntCache.resetIntCache();
+ int l = x - z >> 2;
+ int i1 = y - z >> 2;
+ int j1 = x + z >> 2;
+ int k1 = y + z >> 2;
+ int l1 = j1 - l + 1;
+ int i2 = k1 - i1 + 1;
+ int[] aint = this.genBiomes.getInts(l, i1, l1, i2);
+
+ try {
+ for (int j2 = 0; j2 < l1 * i2; ++j2) {
+ BiomeGenBase biomegenbase = BiomeGenBase.getBiome(aint[j2]);
+
+ if (!par4List.contains(biomegenbase)) {
+ return false;
+ }
+ }
+
+ return true;
+ } catch (Throwable throwable) {
+ CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Invalid Biome id");
+ CrashReportCategory crashreportcategory = crashreport.makeCategory("Layer");
+ crashreportcategory.addCrashSection("Layer", this.genBiomes.toString());
+ crashreportcategory.addCrashSection("x", Integer.valueOf(x));
+ crashreportcategory.addCrashSection("z", Integer.valueOf(y));
+ crashreportcategory.addCrashSection("radius", Integer.valueOf(z));
+ crashreportcategory.addCrashSection("allowed", par4List);
+ throw new ReportedException(crashreport);
+ }
+ }
+
+ /**
+ * Finds a valid position within a range, that is in one of the listed biomes. Searches {par1,par2} +-par3 blocks.
+ * Strongly favors positive y positions.
+ */
+ @Override
+ @SuppressWarnings("rawtypes")
+ public ChunkPosition findBiomePosition(int p_150795_1_, int p_150795_2_, int p_150795_3_, List p_150795_4_,
+ Random p_150795_5_) {
+ IntCache.resetIntCache();
+ int l = p_150795_1_ - p_150795_3_ >> 2;
+ int i1 = p_150795_2_ - p_150795_3_ >> 2;
+ int j1 = p_150795_1_ + p_150795_3_ >> 2;
+ int k1 = p_150795_2_ + p_150795_3_ >> 2;
+ int l1 = j1 - l + 1;
+ int i2 = k1 - i1 + 1;
+ int[] aint = this.genBiomes.getInts(l, i1, l1, i2);
+ ChunkPosition chunkposition = null;
+ int j2 = 0;
+
+ for (int k2 = 0; k2 < l1 * i2; ++k2) {
+ int l2 = l + k2 % l1 << 2;
+ int i3 = i1 + k2 / l1 << 2;
+ BiomeGenBase biomegenbase = BiomeGenBase.getBiome(aint[k2]);
+
+ if (p_150795_4_.contains(biomegenbase) && (chunkposition == null || p_150795_5_.nextInt(j2 + 1) == 0)) {
+ chunkposition = new ChunkPosition(l2, 0, i3);
+ ++j2;
+ }
+ }
+
+ return chunkposition;
+ }
+
+ /**
+ * Calls the WorldChunkManager's biomeCache.cleanupCache()
+ */
+ @Override
+ public void cleanupCache() {
+ this.biomeCache.cleanupCache();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/everglades/world/WorldProviderMod.java b/gtpp/src/main/java/gtPlusPlus/everglades/world/WorldProviderMod.java
new file mode 100644
index 0000000000..c8a69a3b0e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/everglades/world/WorldProviderMod.java
@@ -0,0 +1,59 @@
+package gtPlusPlus.everglades.world;
+
+import net.minecraft.util.Vec3;
+import net.minecraft.world.WorldProvider;
+import net.minecraft.world.WorldType;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.everglades.chunk.ChunkProviderModded;
+import gtPlusPlus.everglades.dimension.Dimension_Everglades;
+
+public class WorldProviderMod extends WorldProvider {
+
+ @Override
+ public void registerWorldChunkManager() {
+ this.worldChunkMgr = new WorldChunkManagerCustom(this.worldObj.getSeed(), WorldType.AMPLIFIED);
+ this.isHellWorld = false;
+ this.hasNoSky = false;
+ this.dimensionId = Dimension_Everglades.DIMID;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public Vec3 getFogColor(float par1, float par2) {
+ return Vec3.createVectorHelper(0.01568627450980392D, 0.09019607843137255D, 0.0D);
+ }
+
+ @Override
+ public IChunkProvider createChunkGenerator() {
+ return new ChunkProviderModded(this.worldObj, this.worldObj.getSeed() - 1278);
+ }
+
+ @Override
+ public boolean canCoordinateBeSpawn(int par1, int par2) {
+ return false;
+ }
+
+ @Override
+ public float getSunBrightness(float par1) {
+ return (par1 * 2F);
+ }
+
+ @Override
+ public float getStarBrightness(float par1) {
+ return (par1 * 5F);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean doesXZShowFog(int par1, int par2) {
+ return true;
+ }
+
+ @Override
+ public String getDimensionName() {
+ return "dimensionDarkWorld";
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/nei/DecayableRecipeHandler.java b/gtpp/src/main/java/gtPlusPlus/nei/DecayableRecipeHandler.java
new file mode 100644
index 0000000000..499e53c317
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/nei/DecayableRecipeHandler.java
@@ -0,0 +1,273 @@
+package gtPlusPlus.nei;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.client.resources.I18n;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+
+import codechicken.lib.gui.GuiDraw;
+import codechicken.nei.PositionedStack;
+import codechicken.nei.recipe.TemplateRecipeHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.gui.machine.GUI_DecayablesChest;
+import gtPlusPlus.core.handler.Recipes.DecayableRecipe;
+import gtPlusPlus.core.item.base.dusts.BaseItemDustUnique;
+import gtPlusPlus.core.item.materials.DustDecayable;
+import gtPlusPlus.core.lib.VanillaColours;
+import gtPlusPlus.nei.handlers.NeiTextureHandler;
+
+public class DecayableRecipeHandler extends TemplateRecipeHandler {
+
+ public static final String mNEIName = "Decayables";
+
+ @Override
+ public String getRecipeName() {
+ return StatCollector.translateToLocal("GTPP.container.decaychest.name");
+ }
+
+ @Override
+ public String getGuiTexture() {
+ return GTPlusPlus.ID + ":textures/gui/nei/decayables.png";
+ }
+
+ @Override
+ public Class<? extends GuiContainer> getGuiClass() {
+ return GUI_DecayablesChest.class;
+ }
+
+ @Override
+ public String getOverlayIdentifier() {
+ return "GTPP_Decayables";
+ }
+
+ @Override
+ public int recipiesPerPage() {
+ return 1;
+ }
+
+ @Override
+ public void loadTransferRects() {
+ this.transferRects
+ .add(new RecipeTransferRect(new Rectangle(6, 3, 16, 16), getOverlayIdentifier(), new Object[0]));
+ }
+
+ @Override
+ public void loadCraftingRecipes(ItemStack result) {
+ if (result == null || (!DustDecayable.class.isInstance(result.getItem())
+ && !BaseItemDustUnique.class.isInstance(result.getItem()))) {
+ return;
+ }
+ if (result != null) {
+ // Logger.INFO("Looking up crafting recipes for "+ItemUtils.getItemName(result));
+ }
+ final List<DecayableRecipe> recipes = DecayableRecipe.mRecipes;
+ for (final DecayableRecipe recipe : recipes) {
+ if (recipe.isValid()) {
+ final ItemStack input = recipe.mInput.copy();
+ final ItemStack output = recipe.mOutput.copy();
+ if (!GT_Utility.areStacksEqual(result, output, true)) {
+ continue;
+ }
+ // Logger.INFO("Showing Usage result for "+ItemUtils.getItemName(result));
+ final DecayableRecipeNEI rec = new DecayableRecipeNEI(input, output, recipe.mTime);
+ this.arecipes.add(rec);
+ sort();
+ }
+ }
+ }
+
+ @Override
+ public void loadCraftingRecipes(String outputId, Object... results) {
+ if (outputId.equals(getOverlayIdentifier()) && this.getClass() == DecayableRecipeHandler.class) {
+ final List<DecayableRecipe> recipes = DecayableRecipe.mRecipes;
+ for (final DecayableRecipe recipe : recipes) {
+ if (recipe.isValid()) {
+ final ItemStack input = recipe.mInput.copy();
+ final ItemStack output = recipe.mOutput.copy();
+ final DecayableRecipeNEI rec = new DecayableRecipeNEI(input, output, recipe.mTime);
+ this.arecipes.add(rec);
+ sort();
+ }
+ }
+ } else {
+ super.loadCraftingRecipes(outputId, results);
+ }
+ }
+
+ @Override
+ public void loadUsageRecipes(ItemStack ingredient) {
+ final List<DecayableRecipe> recipes = DecayableRecipe.mRecipes;
+ if (ingredient != null) {
+ // Logger.INFO("Looking up Usage results for "+ItemUtils.getItemName(ingredient));
+ }
+ for (final DecayableRecipe recipe : recipes) {
+ if (recipe.isValid()) {
+ final ItemStack input = recipe.mInput.copy();
+ final ItemStack output = recipe.mOutput.copy();
+ if (!GT_Utility.areStacksEqual(ingredient, input, true)) {
+ continue;
+ }
+ // Logger.INFO("Showing up Usage results for "+ItemUtils.getItemName(ingredient));
+ final DecayableRecipeNEI rec = new DecayableRecipeNEI(input, output, recipe.mTime);
+ // rec.setIngredientPermutation((Collection) rec.input, ingredient);
+ this.arecipes.add(rec);
+ sort();
+ }
+ }
+ }
+
+ private void sort() {
+ List<DecayableRecipeNEI> g = new ArrayList<>();
+ for (CachedRecipe u : arecipes) {
+ g.add((DecayableRecipeNEI) u);
+ }
+ if (g != null && !g.isEmpty()) {
+ Collections.sort(g);
+ }
+ }
+
+ @Override
+ public void drawExtras(int recipeIndex) {
+ DecayableRecipeNEI recipe = (DecayableRecipeNEI) this.arecipes.get(recipeIndex);
+
+ // GuiDraw.drawStringC(I18n.format("GTPP.container.decaychest.result", new Object[]{}), 43, 10, 8421504, false);
+
+ int cost = recipe.time;
+ if (cost > 0) {
+
+ // NEI Strings
+ String s = I18n.format("GTPP.nei.info", new Object[] { cost });
+ String s0 = I18n.format("GTPP.nei.timetaken", new Object[] { cost });
+
+ // Time Strings
+ String s1 = I18n.format("GTPP.time.ticks", new Object[] { cost });
+ String s2 = I18n.format("GTPP.time.seconds", new Object[] { cost });
+ String s3 = I18n.format("GTPP.time.minutes", new Object[] { cost });
+ String s4 = I18n.format("GTPP.time.hours", new Object[] { cost });
+ String s5 = I18n.format("GTPP.time.days", new Object[] { cost });
+ String s6 = I18n.format("GTPP.time.months", new Object[] { cost });
+ int y = 20;
+
+ int secs = cost / 20;
+ int mins = secs / 60;
+ int hours = mins / 60;
+ int days = hours / 24;
+ int months = days / 30;
+
+ String suffix;
+ int formattedTime;
+ if (cost <= 20) {
+ suffix = s1;
+ formattedTime = cost;
+ } else if (cost <= (20 * 60)) {
+ suffix = s2;
+ formattedTime = secs;
+ } else if (cost <= (20 * 60 * 60)) {
+ suffix = s3;
+ formattedTime = mins;
+ } else if (cost <= (20 * 60 * 60 * 24)) {
+ suffix = s4;
+ formattedTime = hours;
+ } else if (cost < (20 * 60 * 60 * 24 * 30)) {
+ suffix = s5;
+ formattedTime = days;
+ } else if (cost <= (20 * 60 * 60 * 24 * 30)) {
+ suffix = s6;
+ formattedTime = months;
+ } else {
+ suffix = s1;
+ formattedTime = cost;
+ }
+
+ int x = 5;
+ GuiDraw.drawString(s, x, 25, VanillaColours.DYE_BLACK.getAsInt(), false);
+ GuiDraw.drawString(s0, x, 40, VanillaColours.DYE_BLACK.getAsInt(), false);
+
+ GuiDraw.drawString(suffix, x + 16, y + 30, VanillaColours.DYE_BLACK.getAsInt(), false);
+
+ // Values
+ GuiDraw.drawString(("" + formattedTime), x, y + 30, VanillaColours.DYE_GREEN.getAsInt(), false);
+
+ if (hours > 1) {
+ int aLeftoverMinutes = (cost - (hours * (20 * 60 * 60)));
+ if (aLeftoverMinutes > 0) {
+ int secs2 = aLeftoverMinutes / 20;
+ int mins2 = secs2 / 60;
+ GuiDraw.drawString(s3, x + 16, y + 42, VanillaColours.DYE_BLACK.getAsInt(), false);
+ GuiDraw.drawString(("" + mins2), x, y + 42, VanillaColours.DYE_GREEN.getAsInt(), false);
+ }
+ }
+ }
+
+ NeiTextureHandler.RECIPE_BUTTON.renderIcon(6.0D, 3.0D, 16.0D, 16.0D, 0.0D, true);
+ }
+
+ public class DecayableRecipeNEI extends TemplateRecipeHandler.CachedRecipe implements Comparable<CachedRecipe> {
+
+ private PositionedStack input;
+ private PositionedStack output;
+ public int time;
+
+ @Override
+ public PositionedStack getIngredient() {
+ return this.input;
+ }
+
+ @Override
+ public PositionedStack getResult() {
+ return this.output;
+ }
+
+ public DecayableRecipeNEI(final ItemStack input, final ItemStack result, final int time) {
+ super();
+ this.input = new PositionedStack(input, 93, 24);
+ this.output = new PositionedStack(result, 142, 42);
+ this.time = time;
+ }
+
+ @Override
+ public int compareTo(CachedRecipe o) {
+ boolean b = DecayableRecipeNEI.class.isInstance(o);
+ if (b) {
+ DecayableRecipeNEI p = (DecayableRecipeNEI) o;
+ if (p.time > this.time) {
+ return 1;
+ } else if (p.time == this.time) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj != null) {
+ if (DecayableRecipeNEI.class.isInstance(obj)) {
+ DecayableRecipeNEI p = (DecayableRecipeNEI) obj;
+ if (p != null) {
+ // Time check first to keep it simple and not unbox the Recipes.
+ if (p.time == this.time) {
+ ItemStack aInput = p.input.item;
+ ItemStack aOutput = p.output.item;
+ if (GT_Utility.areStacksEqual(aInput, this.input.item, true)) {
+ if (GT_Utility.areStacksEqual(aOutput, this.output.item, true)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/nei/GT_NEI_LFTR_Sparging.java b/gtpp/src/main/java/gtPlusPlus/nei/GT_NEI_LFTR_Sparging.java
new file mode 100644
index 0000000000..c7c657f04a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/nei/GT_NEI_LFTR_Sparging.java
@@ -0,0 +1,502 @@
+package gtPlusPlus.nei;
+
+import java.awt.Rectangle;
+import java.lang.ref.SoftReference;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.lwjgl.opengl.GL11;
+
+import codechicken.lib.gui.GuiDraw;
+import codechicken.nei.PositionedStack;
+import codechicken.nei.recipe.GuiCraftingRecipe;
+import codechicken.nei.recipe.GuiRecipe;
+import codechicken.nei.recipe.GuiUsageRecipe;
+import codechicken.nei.recipe.TemplateRecipeHandler;
+import cpw.mods.fml.common.event.FMLInterModComms;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GasSpargingRecipe;
+import gregtech.api.util.GasSpargingRecipeMap;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class GT_NEI_LFTR_Sparging extends TemplateRecipeHandler {
+
+ public static final String mNEIName = GasSpargingRecipeMap.mNEIDisplayName;
+ private SoftReference<List<GasSpargingRecipeNEI>> mCachedRecipes = null;
+
+ public GT_NEI_LFTR_Sparging() {
+ this.transferRects.add(
+ new TemplateRecipeHandler.RecipeTransferRect(
+ new Rectangle(65, 13, 36, 18),
+ this.getOverlayIdentifier(),
+ new Object[0]));
+ if (!NEI_GTPP_Config.sIsAdded) {
+ FMLInterModComms.sendRuntimeMessage(
+ GT_Values.GT,
+ "NEIPlugins",
+ "register-crafting-handler",
+ "gregtechplusplus@" + this.getRecipeName() + "@" + this.getOverlayIdentifier());
+ GuiCraftingRecipe.craftinghandlers.add(this);
+ GuiUsageRecipe.usagehandlers.add(this);
+ }
+ }
+
+ @Override
+ public String getRecipeName() {
+ return mNEIName;
+ }
+
+ @Override
+ public String getGuiTexture() {
+ return GasSpargingRecipeMap.mNEIGUIPath;
+ }
+
+ @Override
+ public String getOverlayIdentifier() {
+ return gregtech.api.util.GasSpargingRecipeMap.mUnlocalizedName;
+ }
+
+ @Override
+ public int recipiesPerPage() {
+ return 1;
+ }
+
+ @Override
+ public void drawBackground(final int recipe) {
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GuiDraw.changeTexture(this.getGuiTexture());
+ GuiDraw.drawTexturedModalRect(-4, -8, 1, 3, 174, 68);
+ }
+
+ @Override
+ public void loadTransferRects() {
+ this.transferRects
+ .add(new RecipeTransferRect(new Rectangle(72, 14, 22, 16), getOverlayIdentifier(), new Object[0]));
+ }
+
+ public List<GasSpargingRecipeNEI> getCache() {
+ List<GasSpargingRecipeNEI> cache;
+ if (mCachedRecipes == null || (cache = mCachedRecipes.get()) == null) {
+ cache = GasSpargingRecipeMap.mRecipes.stream() // do not use parallel stream. This is already parallelized
+ // by NEI
+ .sorted()
+ .map(temp -> createCachedRecipe(temp))
+ .collect(Collectors.toList());
+ // while the NEI parallelize handlers, for each individual handler it still uses sequential execution model
+ // so we do not need any synchronization here
+ mCachedRecipes = new SoftReference<>(cache);
+ }
+ return cache;
+ }
+
+ public GasSpargingRecipeNEI createCachedRecipe(GasSpargingRecipe aRecipe) {
+ return new GasSpargingRecipeNEI(aRecipe);
+ }
+
+ @Override
+ public void loadCraftingRecipes(String outputId, Object... results) {
+ if (outputId.equals(getOverlayIdentifier())) {
+ arecipes.addAll(getCache());
+ } else {
+ super.loadCraftingRecipes(outputId, results);
+ }
+ }
+
+ @Override
+ public void loadCraftingRecipes(ItemStack aResult) {
+ ItemData tPrefixMaterial = GT_OreDictUnificator.getAssociation(aResult);
+
+ ArrayList<ItemStack> tResults = new ArrayList<>();
+ tResults.add(aResult);
+ tResults.add(GT_OreDictUnificator.get(true, aResult));
+ if ((tPrefixMaterial != null) && (!tPrefixMaterial.mBlackListed)
+ && (!tPrefixMaterial.mPrefix.mFamiliarPrefixes.isEmpty())) {
+ for (OrePrefixes tPrefix : tPrefixMaterial.mPrefix.mFamiliarPrefixes) {
+ tResults.add(GT_OreDictUnificator.get(tPrefix, tPrefixMaterial.mMaterial.mMaterial, 1L));
+ }
+ }
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(aResult, true);
+ FluidStack tFluidStack;
+ if (tFluid != null) {
+ tFluidStack = tFluid;
+ tResults.add(GT_Utility.getFluidDisplayStack(tFluid, false));
+ } else tFluidStack = GT_Utility.getFluidFromDisplayStack(aResult);
+ if (tFluidStack != null) {
+ tResults.addAll(GT_Utility.getContainersFromFluid(tFluidStack));
+ }
+ for (GasSpargingRecipeNEI recipe : getCache()) {
+ if (tResults.stream()
+ .anyMatch(stack -> recipe.contains(recipe.mOutputs, stack))) arecipes.add(recipe);
+ }
+ }
+
+ @Override
+ public void loadUsageRecipes(ItemStack aInput) {
+ ItemData tPrefixMaterial = GT_OreDictUnificator.getAssociation(aInput);
+
+ ArrayList<ItemStack> tInputs = new ArrayList<>();
+ tInputs.add(aInput);
+ tInputs.add(GT_OreDictUnificator.get(false, aInput));
+ if ((tPrefixMaterial != null) && (!tPrefixMaterial.mPrefix.mFamiliarPrefixes.isEmpty())) {
+ for (OrePrefixes tPrefix : tPrefixMaterial.mPrefix.mFamiliarPrefixes) {
+ tInputs.add(GT_OreDictUnificator.get(tPrefix, tPrefixMaterial.mMaterial.mMaterial, 1L));
+ }
+ }
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(aInput, true);
+ FluidStack tFluidStack;
+ if (tFluid != null) {
+ tFluidStack = tFluid;
+ tInputs.add(GT_Utility.getFluidDisplayStack(tFluid, false));
+ } else tFluidStack = GT_Utility.getFluidFromDisplayStack(aInput);
+ if (tFluidStack != null) {
+ tInputs.addAll(GT_Utility.getContainersFromFluid(tFluidStack));
+ }
+ for (GasSpargingRecipeNEI recipe : getCache()) {
+ if (tInputs.stream()
+ .anyMatch(stack -> recipe.contains(recipe.mInputs, stack))) arecipes.add(recipe);
+ }
+ }
+
+ protected static void drawText(int aX, int aY, String aString, int aColor) {
+ Minecraft.getMinecraft().fontRenderer.drawString(aString, aX, aY, aColor);
+ }
+
+ @Override
+ public void drawExtras(int aRecipeIndex) {
+ final long tEUt = ((GasSpargingRecipeNEI) this.arecipes.get(aRecipeIndex)).mRecipe.mEUt;
+ final long tDuration = ((GasSpargingRecipeNEI) this.arecipes.get(aRecipeIndex)).mRecipe.mDuration;
+ drawText(10, 73, "Total: " + MathUtils.formatNumbers((long) (tDuration * tEUt)) + " EU", -16777216);
+ drawText(10, 83, "Usage: " + MathUtils.formatNumbers(tEUt) + " EU/t", -16777216);
+ drawText(
+ 10,
+ 93,
+ "Time: " + (tDuration < 20 ? "< 1" : MathUtils.formatNumbers(0.05d * tDuration)) + " secs",
+ -16777216);
+ drawText(10, 103, "Gas not used to sparge is", -16777216);
+ drawText(10, 113, "returned alongside outputs.", -16777216);
+ }
+
+ @Override
+ public List<String> handleItemTooltip(final GuiRecipe<?> gui, final ItemStack aStack, final List<String> currenttip,
+ final int aRecipeIndex) {
+ final TemplateRecipeHandler.CachedRecipe tObject = this.arecipes.get(aRecipeIndex);
+ if ((tObject instanceof final GasSpargingRecipeNEI tRecipe)) {
+ ItemStack aSpargeInput = tRecipe.mOutputs.get(0).item;
+ ItemStack aSpentFuel = tRecipe.mOutputs.get(1).item;
+ for (final PositionedStack tStack : tRecipe.mOutputs) {
+ if (aStack == tStack.item) {
+ if (ItemList.Display_Fluid.isStackEqual(tStack.item, true, true)) {
+ if (GT_Utility.areStacksEqual(aStack, aSpentFuel, true)) {
+ break;
+ }
+ if (GT_Utility.areStacksEqual(aStack, aSpargeInput, true)) {
+ currenttip.add("The amount returned is the remainder after all other outputs.");
+ }
+ currenttip.add(
+ "Maximum Output: " + (((FixedPositionedStack) tStack).mChance / 100)
+ + "."
+ + ((((FixedPositionedStack) tStack).mChance % 100) < 10
+ ? "0" + (((FixedPositionedStack) tStack).mChance % 100)
+ : Integer.valueOf(((FixedPositionedStack) tStack).mChance % 100))
+ + "L");
+ break;
+ }
+ break;
+ }
+ }
+ for (final PositionedStack tStack : tRecipe.mInputs) {
+ if (GT_Utility.areStacksEqual(aStack, tStack.item)) {
+ if ((gregtech.api.enums.ItemList.Display_Fluid.isStackEqual(tStack.item, true, true))
+ || (tStack.item.stackSize != 0)) {
+ break;
+ }
+ if (ItemUtils.isControlCircuit(aStack)) {
+ currenttip.add("Does not get consumed in the process");
+ }
+ break;
+ }
+ }
+ }
+ return currenttip;
+ }
+
+ public class FixedPositionedStack extends PositionedStack {
+
+ public final int mChance;
+ public boolean permutated = false;
+
+ public FixedPositionedStack(final Object object, final int x, final int y) {
+ this(object, x, y, 0);
+ }
+
+ public FixedPositionedStack(final Object object, final int x, final int y, final int aChance) {
+ super(object, x, y, true);
+ this.mChance = aChance;
+ }
+
+ @Override
+ public void generatePermutations() {
+ if (this.permutated) {
+ return;
+ }
+ final ArrayList<ItemStack> tDisplayStacks = new ArrayList<>();
+ for (final ItemStack tStack : this.items) {
+ if (GT_Utility.isStackValid(tStack)) {
+ if (tStack.getItemDamage() == 32767) {
+ final List<ItemStack> permutations = codechicken.nei.ItemList.itemMap.get(tStack.getItem());
+ if (!permutations.isEmpty()) {
+ ItemStack stack;
+ for (final Iterator<ItemStack> i$ = permutations.iterator(); i$.hasNext(); tDisplayStacks
+ .add(GT_Utility.copyAmount(tStack.stackSize, new Object[] { stack }))) {
+ stack = i$.next();
+ }
+ } else {
+ final ItemStack base = new ItemStack(tStack.getItem(), tStack.stackSize);
+ base.stackTagCompound = tStack.stackTagCompound;
+ tDisplayStacks.add(base);
+ }
+ } else {
+ tDisplayStacks.add(GT_Utility.copy(new Object[] { tStack }));
+ }
+ }
+ }
+ this.items = (tDisplayStacks.toArray(new ItemStack[0]));
+ if (this.items.length == 0) {
+ this.items = new ItemStack[] { new ItemStack(Blocks.fire) };
+ }
+ this.permutated = true;
+ this.setPermutationToRender(0);
+ }
+ }
+
+ public class GasSpargingRecipeNEI extends CachedRecipe implements Comparable<CachedRecipe> {
+
+ public final GasSpargingRecipe mRecipe;
+ public final List<PositionedStack> mOutputs = new ArrayList<>();
+ public final List<PositionedStack> mInputs = new ArrayList<>();
+
+ public GasSpargingRecipeNEI(GasSpargingRecipe tRecipe) {
+ super();
+ this.mRecipe = tRecipe;
+ int tStartIndex = 0;
+ if (tRecipe.mFluidInputs.length > 0) {
+ if ((tRecipe.mFluidInputs[0] != null) && (tRecipe.mFluidInputs[0].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[0], true),
+ 30,
+ 5));
+ }
+ if ((tRecipe.mFluidInputs.length > 1) && (tRecipe.mFluidInputs[1] != null)
+ && (tRecipe.mFluidInputs[1].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[1], true),
+ 12,
+ 5));
+ }
+ if ((tRecipe.mFluidInputs.length > 2) && (tRecipe.mFluidInputs[2] != null)
+ && (tRecipe.mFluidInputs[2].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[2], true),
+ 48,
+ 5));
+ }
+ if ((tRecipe.mFluidInputs.length > 3) && (tRecipe.mFluidInputs[3] != null)
+ && (tRecipe.mFluidInputs[3].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[3], true),
+ 12,
+ 23));
+ }
+ if ((tRecipe.mFluidInputs.length > 4) && (tRecipe.mFluidInputs[4] != null)
+ && (tRecipe.mFluidInputs[4].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[4], true),
+ 30,
+ 23));
+ }
+ if ((tRecipe.mFluidInputs.length > 5) && (tRecipe.mFluidInputs[5] != null)
+ && (tRecipe.mFluidInputs[5].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[5], true),
+ 48,
+ 23));
+ }
+ if ((tRecipe.mFluidInputs.length > 6) && (tRecipe.mFluidInputs[6] != null)
+ && (tRecipe.mFluidInputs[6].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[6], true),
+ 12,
+ 41));
+ }
+ if ((tRecipe.mFluidInputs.length > 7) && (tRecipe.mFluidInputs[7] != null)
+ && (tRecipe.mFluidInputs[7].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[7], true),
+ 30,
+ 41));
+ }
+ if ((tRecipe.mFluidInputs.length > 8) && (tRecipe.mFluidInputs[8] != null)
+ && (tRecipe.mFluidInputs[8].getFluid() != null)) {
+ this.mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidInputs[8], true),
+ 48,
+ 41));
+ }
+ }
+
+ tStartIndex = 0;
+ if (tRecipe.mFluidOutputs.length > 0) {
+ if ((tRecipe.mFluidOutputs[0] != null) && (tRecipe.mFluidOutputs[0].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[0], false),
+ 120,
+ 5,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 1) && (tRecipe.mFluidOutputs[1] != null)
+ && (tRecipe.mFluidOutputs[1].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[1], true),
+ 102,
+ 5,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 2) && (tRecipe.mFluidOutputs[2] != null)
+ && (tRecipe.mFluidOutputs[2].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[2], false),
+ 138,
+ 5,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 3) && (tRecipe.mFluidOutputs[3] != null)
+ && (tRecipe.mFluidOutputs[3].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[3], false),
+ 102,
+ 23,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 4) && (tRecipe.mFluidOutputs[4] != null)
+ && (tRecipe.mFluidOutputs[4].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[4], false),
+ 120,
+ 23,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 5) && (tRecipe.mFluidOutputs[5] != null)
+ && (tRecipe.mFluidOutputs[5].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[5], false),
+ 138,
+ 23,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 6) && (tRecipe.mFluidOutputs[6] != null)
+ && (tRecipe.mFluidOutputs[6].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[6], false),
+ 102,
+ 41,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 7) && (tRecipe.mFluidOutputs[7] != null)
+ && (tRecipe.mFluidOutputs[7].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[7], false),
+ 120,
+ 41,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ if ((tRecipe.mFluidOutputs.length > 8) && (tRecipe.mFluidOutputs[8] != null)
+ && (tRecipe.mFluidOutputs[8].getFluid() != null)) {
+ this.mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(tRecipe.mFluidOutputs[8], false),
+ 138,
+ 41,
+ tRecipe.getMaxOutput(tStartIndex++)));
+ }
+ }
+ }
+
+ @Override
+ public int compareTo(CachedRecipe o) {
+ boolean b = GasSpargingRecipeNEI.class.isInstance(o);
+ if (b) {
+ GasSpargingRecipeNEI p = (GasSpargingRecipeNEI) o;
+ if (p.mOutputs.size() > this.mOutputs.size()) {
+ return 1;
+ } else if (p.mOutputs.size() == this.mOutputs.size()) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj != null) {
+ if (GasSpargingRecipeNEI.class.isInstance(obj)) {
+ GasSpargingRecipeNEI p = (GasSpargingRecipeNEI) obj;
+ if (p != null) {
+ if (GT_Utility.areStacksEqual(p.mInputs.get(0).item, this.mInputs.get(0).item, true)) {
+ if (p.mOutputs.size() == this.mOutputs.size()) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public List<PositionedStack> getIngredients() {
+ return this.getCycledIngredients(GT_NEI_LFTR_Sparging.this.cycleticks / 10, this.mInputs);
+ }
+
+ @Override
+ public PositionedStack getResult() {
+ return null;
+ }
+
+ @Override
+ public List<PositionedStack> getOtherStacks() {
+ return this.mOutputs;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/nei/NEI_GTPP_Config.java b/gtpp/src/main/java/gtPlusPlus/nei/NEI_GTPP_Config.java
new file mode 100644
index 0000000000..16cc1e8cbf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/nei/NEI_GTPP_Config.java
@@ -0,0 +1,102 @@
+package gtPlusPlus.nei;
+
+import java.util.Arrays;
+
+import net.minecraft.item.ItemStack;
+
+import codechicken.nei.api.API;
+import codechicken.nei.api.IConfigureNEI;
+import codechicken.nei.event.NEIRegisterHandlerInfosEvent;
+import codechicken.nei.recipe.HandlerInfo;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.api.enums.Mods;
+import gregtech.api.recipe.RecipeMaps;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class NEI_GTPP_Config implements IConfigureNEI {
+
+ public static boolean sIsAdded = true;
+
+ @Override
+ public synchronized void loadConfig() {
+ sIsAdded = false;
+
+ Logger.INFO("NEI Registration: Registering NEI handler for " + DecayableRecipeHandler.mNEIName);
+ API.registerRecipeHandler(new DecayableRecipeHandler());
+ API.registerUsageHandler(new DecayableRecipeHandler());
+ API.addRecipeCatalyst(new ItemStack(ModBlocks.blockDecayablesChest, 1), "GTPP_Decayables");
+
+ Logger.INFO("NEI Registration: Registering NEI handler for " + GT_NEI_LFTR_Sparging.mNEIName);
+ new GT_NEI_LFTR_Sparging();
+ API.addRecipeCatalyst(GregtechItemList.Controller_Sparge_Tower.get(1), "gtpp.recipe.lftr.sparging");
+
+ for (GregtechItemList item : Arrays.asList(
+ GregtechItemList.GT4_Electric_Auto_Workbench_LV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_MV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_HV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_EV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_IV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_LuV,
+ GregtechItemList.GT4_Electric_Auto_Workbench_ZPM,
+ GregtechItemList.GT4_Electric_Auto_Workbench_UV)) {
+ API.addRecipeCatalyst(item.get(1), "crafting", -10);
+ }
+ // Bronze workbench
+ API.removeRecipeCatalyst(ItemUtils.getItemStackFromFQRN("gregtech:gt.blockmachines:31081", 1), "crafting");
+ API.removeRecipeCatalyst(ItemUtils.getItemStackFromFQRN("gregtech:gt.blockmachines:31082", 1), "crafting");
+
+ // Moved to its own handler
+ API.removeRecipeCatalyst(
+ GregtechItemList.Controller_Vacuum_Furnace.get(1),
+ GTPPRecipeMaps.chemicalDehydratorRecipes.unlocalizedName);
+
+ // ULV simple washer
+ API.removeRecipeCatalyst(
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.blockmachines:767", 1),
+ GTPPRecipeMaps.simpleWasherRecipes.unlocalizedName);
+
+ // ULV combustion generator
+ API.removeRecipeCatalyst(
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.blockmachines:960", 1),
+ RecipeMaps.dieselFuels.unlocalizedName);
+
+ // ULV gas turbine
+ API.removeRecipeCatalyst(
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.blockmachines:961", 1),
+ RecipeMaps.gasTurbineFuels.unlocalizedName);
+
+ // Hide Flasks
+ if (Utils.isClient()) {
+ API.addItemListEntry(GregtechItemList.VOLUMETRIC_FLASK_8k.get(1));
+ API.addItemListEntry(GregtechItemList.VOLUMETRIC_FLASK_32k.get(1));
+ }
+ sIsAdded = true;
+ }
+
+ @SubscribeEvent
+ public void registerHandlerInfo(NEIRegisterHandlerInfosEvent event) {
+ event.registerHandlerInfo(
+ new HandlerInfo.Builder("gtpp.recipe.lftr.sparging", CORE.name, Mods.GTPlusPlus.ID)
+ .setDisplayStack(GregtechItemList.Controller_Sparge_Tower.get(1))
+ .setShiftY(6)
+ .setHeight(135)
+ .setMaxRecipesPerPage(1)
+ .build());
+ }
+
+ @Override
+ public String getName() {
+ return "GT++ NEI Plugin";
+ }
+
+ @Override
+ public String getVersion() {
+ return "(1.12)";
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/nei/handlers/NeiTextureHandler.java b/gtpp/src/main/java/gtPlusPlus/nei/handlers/NeiTextureHandler.java
new file mode 100644
index 0000000000..2644ffb4ff
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/nei/handlers/NeiTextureHandler.java
@@ -0,0 +1,126 @@
+package gtPlusPlus.nei.handlers;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.texture.TextureManager;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+
+/**
+ * Based on crazypants.enderio.gui.IconEIO
+ *
+ * @author Original EIO Author
+ *
+ * This is free and unencumbered software released into the public domain.
+ *
+ * Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source
+ * code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means.
+ *
+ * In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all
+ * copyright interest in the software to the public domain. We make this dedication for the benefit of the
+ * public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt
+ * act of relinquishment in perpetuity of all present and future rights to this software under copyright law.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * For more information, please refer to <http://unlicense.org/>
+ *
+ * https://github.com/SleepyTrousers/EnderIO/blob/release/1.7.10/2.2/src/main/java/crazypants/render/RenderUtil.java
+ *
+ */
+public final class NeiTextureHandler {
+
+ public static final NeiTextureHandler RECIPE_BUTTON = new NeiTextureHandler(128, 116, 24, 24);
+
+ public final double minU;
+ public final double maxU;
+ public final double minV;
+ public final double maxV;
+ public final double width;
+ public final double height;
+
+ public static final ResourceLocation TEXTURE = new ResourceLocation(
+ GTPlusPlus.ID + ":textures/gui/nei/widgets.png");
+
+ public NeiTextureHandler(int x, int y, int width, int height) {
+ this(
+ width,
+ height,
+ (float) (0.00390625D * (double) x),
+ (float) (0.00390625D * (double) (x + width)),
+ (float) (0.00390625D * (double) y),
+ (float) (0.00390625D * (double) (y + height)));
+ }
+
+ public NeiTextureHandler(double width, double height, double minU, double maxU, double minV, double maxV) {
+ this.width = width;
+ this.height = height;
+ this.minU = minU;
+ this.maxU = maxU;
+ this.minV = minV;
+ this.maxV = maxV;
+ }
+
+ public void renderIcon(double x, double y, double width, double height, double zLevel, boolean doDraw) {
+ this.renderIcon(x, y, width, height, zLevel, doDraw, false);
+ }
+
+ public void renderIcon(double x, double y, double width, double height, double zLevel, boolean doDraw,
+ boolean flipY) {
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ Tessellator tessellator = Tessellator.instance;
+ if (doDraw) {
+ bindTexture(TEXTURE);
+ tessellator.startDrawingQuads();
+ }
+
+ if (flipY) {
+ tessellator.addVertexWithUV(x, y + height, zLevel, this.minU, this.minV);
+ tessellator.addVertexWithUV(x + width, y + height, zLevel, this.maxU, this.minV);
+ tessellator.addVertexWithUV(x + width, y + 0.0D, zLevel, this.maxU, this.maxV);
+ tessellator.addVertexWithUV(x, y + 0.0D, zLevel, this.minU, this.maxV);
+ } else {
+ tessellator.addVertexWithUV(x, y + height, zLevel, this.minU, this.maxV);
+ tessellator.addVertexWithUV(x + width, y + height, zLevel, this.maxU, this.maxV);
+ tessellator.addVertexWithUV(x + width, y + 0.0D, zLevel, this.maxU, this.minV);
+ tessellator.addVertexWithUV(x, y + 0.0D, zLevel, this.minU, this.minV);
+ }
+
+ if (doDraw) {
+ tessellator.draw();
+ }
+ }
+
+ public static final ResourceLocation BLOCK_TEX;
+ public static final ResourceLocation ITEM_TEX;
+ public static final ResourceLocation GLINT_TEX;
+ public static int BRIGHTNESS_MAX;
+
+ static {
+ BLOCK_TEX = TextureMap.locationBlocksTexture;
+ ITEM_TEX = TextureMap.locationItemsTexture;
+ GLINT_TEX = new ResourceLocation("textures/misc/enchanted_item_glint.png");
+ BRIGHTNESS_MAX = 15728880;
+ }
+
+ public static TextureManager engine() {
+ return Minecraft.getMinecraft().renderEngine;
+ }
+
+ public static void bindTexture(String string) {
+ engine().bindTexture(new ResourceLocation(string));
+ }
+
+ public static void bindTexture(ResourceLocation tex) {
+ engine().bindTexture(tex);
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeDefinition.java b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeDefinition.java
new file mode 100644
index 0000000000..890a9020c9
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeDefinition.java
@@ -0,0 +1,49 @@
+package gtPlusPlus.plugin.agrichem;
+
+public enum AlgaeDefinition {
+
+ /*
+ * In general, the productivity of freshwater algae is primarily limited by the availability of the nutrient
+ * phosphate (PO4-3), while that of marine algae is limited by nitrate (NO3-) or ammonium (NH4+). Some algal
+ * species, however, may have unusual nutrient requirements, and their productivity may be limited by certain
+ * micronutrients, such as silica, in the case of diatoms.
+ */
+
+ Euglenophyta("Euglenophyta", "Euglenoids", true, false, getRGB(147, 168, 50)),
+ Chrysophyta("Chrysophyta", "Golden-Brown Algae", true, true, getRGB(186, 146, 0)),
+ Pyrrophyta("Pyrrophyta", "Fire Algae", true, true, getRGB(250, 118, 2)),
+ Chlorophyta("Chlorophyta", "Green Algae", true, true, getRGB(99, 181, 62)),
+ Rhodophyta("Rhodophyta", "Red Algae", false, true, getRGB(153, 5, 22)),
+ Paeophyta("Paeophyta", "Brown Algae", false, true, getRGB(94, 78, 47)),
+ Xanthophyta("Xanthophyta", "Yellow-Green Algae", true, false, getRGB(118, 138, 16));
+
+ public final String mScientificName;
+ public final String mSimpleName;
+ public final boolean mSaltWater;
+ public final boolean mFreshWater;
+ public final int mColour;
+
+ AlgaeDefinition(String aScientificName, String aSimpleName, boolean aFresh, boolean aSalt, int aColour) {
+ mScientificName = aScientificName;
+ mSimpleName = aSimpleName;
+ mFreshWater = aFresh;
+ mSaltWater = aSalt;
+ mColour = aColour;
+ }
+
+ public static AlgaeDefinition getByIndex(int aIndex) {
+ return switch (aIndex) {
+ default -> Euglenophyta;
+ case 1 -> Chrysophyta;
+ case 2 -> Pyrrophyta;
+ case 3 -> Chlorophyta;
+ case 4 -> Rhodophyta;
+ case 5 -> Paeophyta;
+ case 6 -> Xanthophyta;
+ };
+ }
+
+ private static int getRGB(int r, int g, int b) {
+ return AlgaeUtils.rgbtoHexValue(r, g, b);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeUtils.java b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeUtils.java
new file mode 100644
index 0000000000..4906d0483f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/AlgaeUtils.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.plugin.agrichem;
+
+import gtPlusPlus.core.util.Utils;
+
+public class AlgaeUtils {
+
+ public static int rgbtoHexValue(final int r, final int g, final int b) {
+ return Utils.rgbtoHexValue(r, g, b);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/BioRecipes.java b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/BioRecipes.java
new file mode 100644
index 0000000000..a4bbd6e03a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/BioRecipes.java
@@ -0,0 +1,1257 @@
+package gtPlusPlus.plugin.agrichem;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.recipe.RecipeMaps.distilleryRecipes;
+import static gregtech.api.recipe.RecipeMaps.extractorRecipes;
+import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.recipe.RecipeMaps.latheRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.recipe.RecipeMaps.multiblockChemicalReactorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.chemicalDehydratorRecipes;
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.chemicalPlantRecipes;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeConstants;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.base.BaseItemComponent;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.OreDictUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.plugin.agrichem.block.AgrichemFluids;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.railcraft.utils.RailcraftUtils;
+import ic2.core.Ic2Items;
+
+public class BioRecipes {
+
+ private static Item mFert;
+ private static Item mDustDirt;
+
+ private static Fluid mSalineWater;
+ private static Fluid mDistilledWater;
+ private static Fluid mThermalWater;
+ private static Fluid mAir;
+ private static Fluid mSulfuricWasteWater;
+ private static Fluid mAmmonia;
+ private static Fluid mMethanol;
+ private static Fluid mAceticAcid;
+ private static Fluid mPropionicAcid;
+ private static Fluid mLiquidPlastic;
+ private static Fluid mFermentationBase;
+ private static Fluid mCarbonDioxide;
+ private static Fluid mCarbonMonoxide;
+ private static Fluid mEthylene;
+ private static Fluid mEthanol;
+ private static Fluid mChlorine;
+ private static Fluid mHydrogen;
+ private static Fluid mDilutedSulfuricAcid;
+ private static Fluid mSulfuricAcid;
+ private static Fluid mUrea;
+ public static Fluid mFormaldehyde;
+ private static Fluid mLiquidResin;
+ private static Fluid mMethane;
+ private static Fluid mBenzene;
+ private static Fluid mEthylbenzene;
+ private static Fluid mStyrene;
+ private static Fluid mButanol;
+ private static Fluid mAcetone;
+
+ private static ItemStack getGreenAlgaeRecipeChip() {
+ return getBioChip(4);
+ }
+
+ private static ItemStack getBrownAlgaeRecipeChip() {
+ return getBioChip(8);
+ }
+
+ private static ItemStack getGoldenBrownAlgaeRecipeChip() {
+ return getBioChip(12);
+ }
+
+ private static ItemStack getRedAlgaeRecipeChip() {
+ return getBioChip(16);
+ }
+
+ private static ItemStack getBioChip(int aID) {
+ return ItemUtils.simpleMetaStack(AgriculturalChem.mBioCircuit, aID, 0);
+ }
+
+ public static void init() {
+ Logger.INFO("[Bio] Setting Variables");
+ initRecipeVars();
+ Logger.INFO("[Bio] Generating Biochip Recipes");
+ recipeBioChip();
+ Logger.INFO("[Bio] Generating Recipes");
+ recipeAlgaeBiomass();
+ Logger.INFO("[Bio] Finished with recipes");
+ }
+
+ private static void initRecipeVars() {
+ mFert = AgriculturalChem.dustOrganicFertilizer;
+ mDustDirt = AgriculturalChem.dustDirt;
+
+ // 5.08 Salt Water Solution ;)
+ if (!FluidUtils.doesFluidExist("saltwater")) {
+ mSalineWater = FluidUtils
+ .generateFluidNoPrefix("saltwater", "Salt Water", 200, new short[] { 10, 30, 220, 100 });
+ } else {
+ Materials aSaltWater = MaterialUtils.getMaterial("saltwater");
+ if (aSaltWater != null) {
+ FluidStack aWaterStack = aSaltWater.getFluid(1);
+ if (aWaterStack != null) {
+ mSalineWater = aSaltWater.getFluid(1)
+ .getFluid();
+ }
+ }
+ if (mSalineWater == null) {
+ mSalineWater = FluidUtils.getWildcardFluidStack("saltwater", 1)
+ .getFluid();
+ }
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellSaltWater", 1) == null) {
+ new BaseItemComponent("saltwater", "Salt Water", new short[] { 10, 30, 220 });
+ }
+ }
+
+ mDistilledWater = FluidUtils.getDistilledWater(1)
+ .getFluid();
+ mThermalWater = FluidUtils.getFluidStack("ic2hotwater", 1)
+ .getFluid();
+ mAir = FluidUtils.getFluidStack("air", 1)
+ .getFluid();
+ mSulfuricWasteWater = FluidUtils.getFluidStack("sulfuricapatite", 1)
+ .getFluid();
+ mAmmonia = MISC_MATERIALS.AMMONIA.getFluidStack(1)
+ .getFluid();
+ mEthylene = FluidUtils.getFluidStack("ethylene", 1)
+ .getFluid();
+ mEthanol = FluidUtils.getFluidStack("bioethanol", 1)
+ .getFluid();
+ mDilutedSulfuricAcid = FluidUtils.getFluidStack("dilutedsulfuricacid", 1)
+ .getFluid();
+ mSulfuricAcid = FluidUtils.getFluidStack("sulfuricacid", 1)
+ .getFluid();
+ mFormaldehyde = FluidUtils.getFluidStack("fluid.formaldehyde", 1)
+ .getFluid();
+ mMethane = FluidUtils.getFluidStack("methane", 1)
+ .getFluid();
+ mBenzene = FluidUtils.getFluidStack("benzene", 1)
+ .getFluid();
+ mEthylbenzene = FluidUtils.getFluidStack("fluid.ethylbenzene", 1)
+ .getFluid();
+ mStyrene = FluidUtils.getFluidStack("styrene", 1)
+ .getFluid();
+ mMethanol = FluidUtils.getFluidStack("methanol", 1)
+ .getFluid();
+ mLiquidPlastic = FluidUtils.getWildcardFluidStack("plastic", 1)
+ .getFluid();
+ mCarbonDioxide = MISC_MATERIALS.CARBON_DIOXIDE.getFluidStack(1)
+ .getFluid();
+ mCarbonMonoxide = MISC_MATERIALS.CARBON_MONOXIDE.getFluidStack(1)
+ .getFluid();
+ mChlorine = FluidUtils.getFluidStack("chlorine", 1)
+ .getFluid();
+ mHydrogen = FluidUtils.getFluidStack("hydrogen", 1)
+ .getFluid();
+ mAceticAcid = AgrichemFluids.mAceticAcid;
+ mPropionicAcid = AgrichemFluids.mPropionicAcid;
+ mUrea = AgrichemFluids.mUrea;
+ mLiquidResin = AgrichemFluids.mLiquidResin;
+ mFermentationBase = AgrichemFluids.mFermentationBase;
+ mButanol = AgrichemFluids.mButanol;
+ mAcetone = AgrichemFluids.mAcetone;
+ }
+
+ private static void recipeAlgaeBiomass() {
+
+ // TODO
+ // Add in recipes to get initial Biomass
+
+ recipeGreenAlgae();
+ recipeBrownAlgae();
+ recipeGoldenBrownAlgae();
+ recipeRedAlgae();
+ recipeWoodPellets();
+ recipeWoodBricks();
+ recipeCellulosePulp();
+ recipeCatalystCarrier();
+ recipeAluminiumSilverCatalyst();
+ recipeAceticAcid();
+ recipePropionicAcid();
+ recipeFermentationBase();
+ recipeEthanol();
+ recipeCelluloseFibre();
+ recipeGoldenBrownCelluloseFiber();
+ recipeRedCelluloseFiber();
+ recipeSodiumHydroxide();
+ recipeSodiumCarbonate();
+ recipePelletMold();
+ recipeAluminiumPellet();
+ recipeAlumina();
+ recipeAluminium();
+ recipeLithiumChloride();
+ recipeSulfuricAcid();
+ recipeUrea();
+ recipeRawBioResin();
+ recipeLiquidResin();
+ recipeCompost();
+ recipeMethane();
+ recipeBenzene();
+ recipeStyrene();
+ registerFuels();
+ }
+
+ private static void registerFuels() {
+
+ // Burnables
+ ItemUtils.registerFuel(ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1), 800);
+ ItemUtils.registerFuel(ItemUtils.getSimpleStack(AgriculturalChem.mWoodBrick, 1), 4800);
+
+ // Combustion Fuels
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict("cellButanol", 1))
+ .metadata(FUEL_VALUE, 400)
+ .metadata(FUEL_TYPE, 0)
+ .duration(0)
+ .eut(0)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+
+ private static void recipeGreenAlgae() {
+ // Compost
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 4))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 1))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ // Turn into Cellulose
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getGreenAlgaeRecipeChip(), ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 10))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 5))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeBrownAlgae() {
+ // Compost
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 2))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 1))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ // Alginic acid
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 10))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mAlginicAcid, 2))
+ .duration(2 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(extractorRecipes);
+
+ // Lithium Chloride
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getBrownAlgaeRecipeChip(), ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 20))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mLithiumChloride, 5))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ // Sodium Carbonate
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getBrownAlgaeRecipeChip(), ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 40))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mSodiumCarbonate, 20))
+ .fluidInputs(FluidUtils.getDistilledWater(2000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+ }
+
+ private static void recipeGoldenBrownAlgae() {
+ // Compost
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 1))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 1))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ // Turn into Cellulose
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getGoldenBrownAlgaeRecipeChip(),
+ ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 10))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownCelluloseFiber, 5))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeRedAlgae() {
+ // Compost
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 1))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 2))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ // Turn into Cellulose
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getRedAlgaeRecipeChip(), ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 10))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mRedCelluloseFiber, 5))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeCelluloseFibre() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 8),
+ ItemUtils.getSimpleStack(AgriculturalChem.mAlginicAcid, 2))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCellulosePulp, 10))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(UniversalChemical);
+
+ // Craft into Wood Pellets
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getBioChip(2), ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 12))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 24))
+ .duration(2 * SECONDS + 8 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ // Methanol Extraction
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 12))
+ .fluidOutputs(Materials.Methanol.getFluid(1000L))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(fluidExtractionRecipes);
+
+ // Compost
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 3))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 1))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ // Plastic
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(16), ItemUtils.getSimpleStack(AgriculturalChem.mCellulosePulp, 4), },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mAceticAcid, 500),
+ FluidUtils.getFluidStack(BioRecipes.mPropionicAcid, 500), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mLiquidPlastic, (1000)), },
+ 10 * 20,
+ 240,
+ 2);
+ }
+
+ private static void recipeWoodPellets() {
+ // Shapeless Recipe
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1) },
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodBrick, 2));
+
+ // Extruder Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 12),
+ ItemUtils.getSimpleStack(AgriculturalChem.mPelletMold, 0))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 3))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(extruderRecipes);
+
+ // Assembly Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getBioChip(2), ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 8))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mWoodBrick, 2))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ // CO2
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 1))
+ .fluidOutputs(FluidUtils.getFluidStack(mCarbonDioxide, 70))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(fluidExtractionRecipes);
+
+ // Add Charcoal Recipe
+ if (Railcraft.isModLoaded()) {
+ RailcraftUtils.addCokeOvenRecipe(
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 2),
+ true,
+ true,
+ ItemUtils.getItemStackOfAmountFromOreDict("gemCharcoal", 3),
+ GT_Values.NF,
+ 1200);
+ }
+ CORE.RA.addCokeOvenRecipe(
+ ItemUtils.getSimpleStack(AgriculturalChem.mWoodPellet, 2),
+ getBioChip(3),
+ null,
+ GT_Values.NF,
+ ItemUtils.getItemStackOfAmountFromOreDict("gemCharcoal", 3),
+ 120,
+ 16);
+ }
+
+ private static void recipeWoodBricks() {
+
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getBioChip(3), ItemUtils.getOrePrefixStack(OrePrefixes.dust, Materials.Wood, 50))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mWoodBrick, 1))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeCellulosePulp() {
+
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getBioChip(2), ItemUtils.getSimpleStack(AgriculturalChem.mCellulosePulp, 4))
+ .itemOutputs(ItemUtils.getSimpleStack(Items.paper, 4))
+ .duration(2 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeCatalystCarrier() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getBioChip(20),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Tin, 6L))
+ .itemOutputs(CI.getEmptyCatalyst(1))
+ .duration(5 * MINUTES)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeAluminiumSilverCatalyst() {
+ // Assembler Recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getBioChip(4),
+ CI.getEmptyCatalyst(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 4L))
+ .itemOutputs(CI.getGreenCatalyst(10))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void recipeAceticAcid() {
+
+ // CH4O + CO = C2H4O2
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getGreenCatalyst(0) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mMethanol, 700),
+ FluidUtils.getFluidStack(BioRecipes.mCarbonMonoxide, 700), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mAceticAcid, 700), },
+ 120 * 20,
+ 60,
+ 1);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(CI.getNumberedBioCircuit(14))
+ .fluidInputs(FluidUtils.getFluidStack(mFermentationBase, 1000))
+ .fluidOutputs(FluidUtils.getFluidStack(mAceticAcid, 1000))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 2))
+ .duration(60 * SECONDS)
+ .eut(16)
+ .noOptimize()
+ .addTo(chemicalDehydratorRecipes);
+ }
+
+ public static final HashSet<GT_ItemStack> mFruits = new HashSet<>();
+ public static final HashSet<GT_ItemStack> mVege = new HashSet<>();
+ public static final HashSet<GT_ItemStack> mNuts = new HashSet<>();
+ public static final HashSet<GT_ItemStack> mSeeds = new HashSet<>();
+
+ public static final AutoMap<ItemStack> mList_Master_FruitVege = new AutoMap<>();
+ public static final AutoMap<ItemStack> mList_Master_Seeds = new AutoMap<>();
+
+ private static void processFermentationOreDict() {
+ processOreDictEntry("listAllfruit", mFruits);
+ processOreDictEntry("listAllFruit", mFruits);
+ processOreDictEntry("listAllveggie", mVege);
+ processOreDictEntry("listAllVeggie", mVege);
+ processOreDictEntry("listAllnut", mNuts);
+ processOreDictEntry("listAllNut", mNuts);
+ processOreDictEntry("listAllseed", mSeeds);
+ processOreDictEntry("listAllSeed", mSeeds);
+
+ if (!mFruits.isEmpty()) {
+ for (GT_ItemStack g : mFruits) {
+ mList_Master_FruitVege.put(g.toStack());
+ }
+ }
+ if (!mVege.isEmpty()) {
+ for (GT_ItemStack g : mVege) {
+ mList_Master_FruitVege.put(g.toStack());
+ }
+ }
+ if (!mNuts.isEmpty()) {
+ for (GT_ItemStack g : mNuts) {
+ mList_Master_FruitVege.put(g.toStack());
+ }
+ }
+ if (!mSeeds.isEmpty()) {
+ for (GT_ItemStack g : mSeeds) {
+ mList_Master_Seeds.put(g.toStack());
+ }
+ }
+ }
+
+ // Make Fermentation
+ private static void processOreDictEntry(String aOreName, HashSet<GT_ItemStack> mfruits2) {
+ ArrayList<ItemStack> aTemp = OreDictionary.getOres(aOreName);
+ if (!aTemp.isEmpty()) {
+ for (ItemStack stack : aTemp) {
+ mfruits2.add(new GT_ItemStack(stack));
+ }
+ }
+ }
+
+ private static void recipeFermentationBase() {
+ processFermentationOreDict();
+ AutoMap<ItemStack> aFruitVege = mList_Master_FruitVege;
+ AutoMap<ItemStack> aSeeds = mList_Master_Seeds;
+ ArrayList<ItemStack> aMap = OreDictionary.getOres("cropSugarbeet");
+ for (ItemStack a : aFruitVege) {
+ if (aMap.contains(a)) {
+ continue;
+ }
+ if (ItemUtils.checkForInvalidItems(a)) {
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(2), ItemUtils.getSimpleStack(a, 10) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 1000), },
+ 30 * 20,
+ 2,
+ 0);
+ }
+ }
+ for (ItemStack a : aSeeds) {
+ if (ItemUtils.checkForInvalidItems(a)) {
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(3), ItemUtils.getSimpleStack(a, 20) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 1000), },
+ 30 * 20,
+ 2,
+ 0);
+ }
+ }
+
+ // Sugar Cane
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(4), ItemUtils.getSimpleStack(Items.reeds, 32) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 1000), },
+ 30 * 20,
+ 30,
+ 0);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(5), ItemUtils.getSimpleStack(Items.reeds, 32),
+ ItemUtils.getSimpleStack(ModItems.dustCalciumCarbonate, 2) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mThermalWater, 2000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 2000), },
+ 10 * 20,
+ 30,
+ 0);
+
+ // Sugar Beet
+ if (OreDictUtils.containsValidEntries("cropSugarbeet")) {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(4), ItemUtils.getItemStackOfAmountFromOreDict("cropSugarbeet", 4), },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 1000), },
+ 30 * 20,
+ 30,
+ 0);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(5), ItemUtils.getItemStackOfAmountFromOreDict("cropSugarbeet", 4),
+ ItemUtils.getSimpleStack(ModItems.dustCalciumCarbonate, 2) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mThermalWater, 2000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 2000), },
+ 10 * 20,
+ 30,
+ 0);
+ }
+
+ // Produce Acetone, Butanol and Ethanol
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getBioChip(5),
+ ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownCelluloseFiber, 6),
+ ItemUtils.getSimpleStack(AgriculturalChem.mRedCelluloseFiber, 16))
+ .fluidInputs(FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 48000))
+ .fluidOutputs(
+ FluidUtils.getFluidStack(BioRecipes.mButanol, 18000),
+ FluidUtils.getFluidStack(BioRecipes.mAcetone, 9000),
+ FluidUtils.getFluidStack(BioRecipes.mEthanol, 3000))
+ .duration(100 * SECONDS)
+ .eut(32)
+ .specialValue(1)
+ .noOptimize()
+ .addTo(chemicalPlantRecipes);
+ }
+
+ private static void recipePropionicAcid() {
+ // C2H4 + CO + H2O = C3H6O2
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getGreenCatalyst(0) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mEthylene, 1000),
+ FluidUtils.getFluidStack(BioRecipes.mCarbonMonoxide, 1000),
+ FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mPropionicAcid, 1000), },
+ 10 * 20,
+ 60,
+ 1);
+ }
+
+ private static void recipeEthanol() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(BioRecipes.getBioChip(2))
+ .fluidInputs(FluidUtils.getFluidStack(BioRecipes.mFermentationBase, 1000))
+ .fluidOutputs(FluidUtils.getFluidStack(BioRecipes.mEthanol, 100))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(distilleryRecipes);
+ }
+
+ private static void recipeGoldenBrownCelluloseFiber() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownCelluloseFiber, 5))
+ .fluidOutputs(Materials.Ammonia.getGas(500))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ private static void recipeRedCelluloseFiber() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getSimpleStack(AgriculturalChem.mRedCelluloseFiber, 3))
+ .itemOutputs(ItemUtils.getSimpleStack(ModItems.dustCalciumCarbonate, 5))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(extractorRecipes);
+ }
+
+ private static void recipeSodiumHydroxide() {
+ // NaCl·H2O = NaOH + Cl + H
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(4) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mSalineWater, 1000), },
+ new ItemStack[] { ItemUtils.getSimpleStack(AgriculturalChem.mSodiumHydroxide, 3) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mChlorine, 1000),
+ FluidUtils.getFluidStack(BioRecipes.mHydrogen, 1000), },
+ 300 * 20,
+ 120,
+ 1);
+
+ // Na + H2O = NaOH + H
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(5), ItemUtils.getItemStackOfAmountFromOreDict("dustSodium", 5) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 5000), },
+ new ItemStack[] { ItemUtils.getSimpleStack(AgriculturalChem.mSodiumHydroxide, 15) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mHydrogen, 5000), },
+ 60 * 20,
+ 60,
+ 1);
+ }
+
+ private static void recipeSodiumCarbonate() {
+
+ if (OreDictUtils.containsValidEntries("fuelCoke")) {
+ // Na2CO3 + Al2O3 =C= 2NaAlO2 + CO2
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(18), ItemUtils.getItemStackOfAmountFromOreDict("fuelCoke", 1),
+ ItemUtils.getSimpleStack(AgriculturalChem.mSodiumCarbonate, 6),
+ ItemUtils.getSimpleStack(AgriculturalChem.mAluminiumPellet, 5) },
+ new FluidStack[] {},
+ new ItemStack[] { ItemUtils.getSimpleStack(AgriculturalChem.mSodiumAluminate, 8) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mCarbonDioxide, 1000), },
+ 120 * 20,
+ 120,
+ 1);
+ }
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(18), ItemUtils.getItemStackOfAmountFromOreDict("dustCoal", 2),
+ ItemUtils.getSimpleStack(AgriculturalChem.mSodiumCarbonate, 6),
+ ItemUtils.getSimpleStack(AgriculturalChem.mAluminiumPellet, 5) },
+ new FluidStack[] {},
+ new ItemStack[] { ItemUtils.getSimpleStack(AgriculturalChem.mSodiumAluminate, 8) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mCarbonDioxide, 1000), },
+ 180 * 20,
+ 120,
+ 1);
+ }
+
+ private static void recipePelletMold() {
+ GregtechItemList.Pellet_Mold.set(ItemUtils.getSimpleStack(AgriculturalChem.mPelletMold, 1));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ALLOY.TUMBAGA.getBlock(1))
+ .itemOutputs(GregtechItemList.Pellet_Mold.get(1))
+ .duration(7 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 4 * 3)
+ .addTo(latheRecipes);
+ }
+
+ private static void recipeAluminiumPellet() {
+
+ // Ore Names, no prefix
+ AutoMap<String> aOreNames = new AutoMap<>();
+
+ aOreNames.put("Lazurite");
+ aOreNames.put("Bauxite");
+ aOreNames.put("Grossular");
+ aOreNames.put("Pyrope");
+ aOreNames.put("Sodalite");
+ aOreNames.put("Spodumene");
+ aOreNames.put("Ruby");
+ aOreNames.put("Sapphire");
+ aOreNames.put("GreenSapphire");
+
+ // Voltage
+ HashMap<String, Integer> aOreData1 = new HashMap<>();
+ // Input Count
+ HashMap<String, Integer> aOreData2 = new HashMap<>();
+ // Output Count
+ HashMap<String, Integer> aOreData3 = new HashMap<>();
+
+ aOreData1.put("Lazurite", 120);
+ aOreData1.put("Bauxite", 90);
+ aOreData1.put("Grossular", 90);
+ aOreData1.put("Pyrope", 90);
+ aOreData1.put("Sodalite", 90);
+ aOreData1.put("Spodumene", 90);
+ aOreData1.put("Ruby", 60);
+ aOreData1.put("Sapphire", 30);
+ aOreData1.put("GreenSapphire", 30);
+ aOreData2.put("Lazurite", 14);
+ aOreData2.put("Bauxite", 39);
+ aOreData2.put("Grossular", 20);
+ aOreData2.put("Pyrope", 20);
+ aOreData2.put("Sodalite", 11);
+ aOreData2.put("Spodumene", 10);
+ aOreData2.put("Ruby", 6);
+ aOreData2.put("Sapphire", 5);
+ aOreData2.put("GreenSapphire", 5);
+ aOreData3.put("Lazurite", 3);
+ aOreData3.put("Bauxite", 16);
+ aOreData3.put("Grossular", 2);
+ aOreData3.put("Pyrope", 2);
+ aOreData3.put("Sodalite", 3);
+ aOreData3.put("Spodumene", 1);
+ aOreData3.put("Ruby", 2);
+ aOreData3.put("Sapphire", 2);
+ aOreData3.put("GreenSapphire", 2);
+
+ // Assemble all valid crushed ore types for making pellet mix
+ HashMap<String, ItemStack> aOreCache = new HashMap<>();
+ for (String aOreName : aOreNames) {
+ String aTemp = aOreName;
+ aOreName = "crushedPurified" + aOreName;
+ if (ItemUtils.doesOreDictHaveEntryFor(aOreName)) {
+ aOreCache.put(aTemp, ItemUtils.getItemStackOfAmountFromOreDict(aOreName, 1));
+ }
+ }
+
+ for (String aOreName : aOreNames) {
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(14),
+ ItemUtils.getSimpleStack(aOreCache.get(aOreName), aOreData2.get(aOreName)) },
+ new FluidStack[] { FluidUtils.getSteam(2000 * aOreData2.get(aOreName)) },
+ new ItemStack[] { ItemUtils.getSimpleStack(
+ AgriculturalChem.mCleanAluminiumMix,
+ (int) (Math.ceil(aOreData3.get(aOreName) * 1.4))) },
+ new FluidStack[] { FluidUtils
+ .getFluidStack(AgriculturalChem.RedMud, 100 * (int) (Math.ceil(aOreData3.get(aOreName) * 1.4))) },
+ 20 * 60,
+ aOreData1.get(aOreName),
+ aOreName.equals("Bauxite") ? 2 : 1);
+ }
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mCleanAluminiumMix, 3),
+ ItemUtils.getSimpleStack(AgriculturalChem.mPelletMold, 0))
+ .itemOutputs(ItemUtils.getSimpleStack(AgriculturalChem.mAluminiumPellet, 4))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(extruderRecipes);
+ }
+
+ private static void recipeAlumina() {
+ // 2NaAlO2 + 2NaOH + 2CO2 = Al2O3 + 2Na2CO3 + H2O
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mSodiumAluminate, 8),
+ ItemUtils.getSimpleStack(AgriculturalChem.mSodiumHydroxide, 6))
+ .itemOutputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mAlumina, 5),
+ ItemUtils.getSimpleStack(AgriculturalChem.mSodiumCarbonate, 12))
+ .fluidInputs(Materials.CarbonDioxide.getGas(2000L))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+ }
+
+ private static void recipeAluminium() {
+ // 2Al2O3 + 3C = 4Al + 3CO2
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(AgriculturalChem.mAlumina, 10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 3L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4L))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(3000L))
+ .duration(2 * MINUTES)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1600)
+ .addTo(blastFurnaceRecipes);
+ }
+
+ private static void recipeLithiumChloride() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RockSalt, 8),
+ ItemUtils.getSimpleStack(AgriculturalChem.mLithiumChloride, 10))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Lithium, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Lithium, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lithium, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Potassium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Potassium, 5))
+ .outputChances(7500, 8000, 8500, 9000, 7500, 8500)
+ .fluidInputs(FluidUtils.getFluidStack(BioRecipes.mAir, 4000))
+ .fluidOutputs(FluidUtils.getFluidStack(BioRecipes.mChlorine, 500))
+ .duration(1 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_MV / 2)
+ .addTo(multiblockChemicalReactorRecipes);
+ if (OreDictUtils.containsValidEntries("dustPotash")) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Potash, 10),
+ ItemUtils.getSimpleStack(AgriculturalChem.mLithiumChloride, 16))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Lithium, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Lithium, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lithium, 7),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 2))
+ .outputChances(7500, 8000, 8500, 9000, 9000, 9000)
+ .fluidInputs(FluidUtils.getFluidStack(BioRecipes.mThermalWater, 2000))
+ .fluidOutputs(FluidUtils.getFluidStack(BioRecipes.mChlorine, 250))
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+ }
+ }
+
+ private static void recipeSulfuricAcid() {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(7), ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 10),
+ ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 6) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 5000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mSulfuricAcid, 5000), },
+ 50 * 20,
+ 60,
+ 1);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(7), ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownCelluloseFiber, 2),
+ ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 10) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 5000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mSulfuricAcid, 5000), },
+ 6 * 20,
+ 180,
+ 3);
+ }
+
+ private static void recipeUrea() {
+
+ // 2NH3 + CO2 = CH4N2O + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(9), },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mAmmonia, 600),
+ FluidUtils.getFluidStack(BioRecipes.mCarbonDioxide, 300), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mUrea, 300),
+ FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 300), },
+ 5 * 20,
+ 30,
+ 1);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(9), },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mUrea, 200),
+ FluidUtils.getFluidStack(BioRecipes.mFormaldehyde, 200), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mLiquidResin, 200) },
+ 5 * 20,
+ 30,
+ 1);
+ }
+
+ private static void recipeRawBioResin() {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(3), ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 5),
+ ItemUtils.getSimpleStack(Blocks.dirt, 1) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 100), },
+ new ItemStack[] { ItemUtils.getSimpleStack(AgriculturalChem.mRawBioResin, 1), },
+ new FluidStack[] {},
+ 1 * 20,
+ 30,
+ 1);
+ }
+
+ private static void recipeLiquidResin() {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(3), ItemUtils.getSimpleStack(AgriculturalChem.mRawBioResin, 1) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mEthanol, 200), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mLiquidResin, 500), },
+ 5 * 20,
+ 30,
+ 1);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(3), ItemUtils.getSimpleStack(AgriculturalChem.mCellulosePulp, 8) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mLiquidResin, 144), },
+ new ItemStack[] { ItemUtils.getSimpleStack(Ic2Items.resin, 32) },
+ new FluidStack[] {},
+ 60 * 20,
+ 30,
+ 1);
+ }
+
+ private static void recipeCompost() {
+ ItemStack aFert;
+ if (Forestry.isModLoaded()) {
+ aFert = ItemUtils.getSimpleStack(AgriculturalChem.aFertForestry, 32);
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(11), ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 16),
+ ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 8) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mUrea, 200), },
+ new ItemStack[] { aFert },
+ new FluidStack[] {},
+ 30 * 20,
+ 60,
+ 1);
+ }
+
+ aFert = ItemUtils.getSimpleStack(AgriculturalChem.aFertIC2, 32);
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(12), ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 16),
+ ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 8) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mUrea, 200), },
+ new ItemStack[] { aFert },
+ new FluidStack[] {},
+ 30 * 20,
+ 60,
+ 1);
+ }
+
+ private static void recipeMethane() {
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(12), ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 10) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mDistilledWater, 500), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mMethane, 500), },
+ 5 * 20,
+ 64,
+ 1);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(13), ItemUtils.getSimpleStack(AgriculturalChem.mCelluloseFiber, 8),
+ ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownCelluloseFiber, 6),
+ ItemUtils.getSimpleStack(AgriculturalChem.mRedCelluloseFiber, 4) },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mMethane, 2000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mEthylene, 2000), },
+ 10 * 20,
+ 60,
+ 1);
+ }
+
+ private static void recipeBenzene() {
+
+ // 6CH4 = C6H6 + 18H
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(19), CI.getGreenCatalyst(0), },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mMethane, 6000), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mBenzene, 1000), Materials.Hydrogen.getGas(18000) },
+ 8 * 20,
+ 120,
+ 2);
+ }
+
+ private static void recipeStyrene() {
+
+ // C8H10 = C8H8 + 2H
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { getBioChip(20), CI.getGreenCatalyst(0), },
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mEthylbenzene, 100), },
+ new ItemStack[] {},
+ new FluidStack[] { FluidUtils.getFluidStack(BioRecipes.mStyrene, 100), Materials.Hydrogen.getGas(200) },
+ 16 * 20,
+ 480,
+ 2);
+ }
+
+ private static void recipeBioChip() {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 0L),
+ 0,
+ new Object[] { OrePrefixes.circuit.get(Materials.Primitive) });
+
+ long bits = 0;
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 1L, new Object[0]),
+ bits,
+ new Object[] { "d ", " P ", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 2L, new Object[0]),
+ bits,
+ new Object[] { " d ", " P ", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 3L, new Object[0]),
+ bits,
+ new Object[] { " d", " P ", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 4L, new Object[0]),
+ bits,
+ new Object[] { " ", " Pd", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 5L, new Object[0]),
+ bits,
+ new Object[] { " ", " P ", " d", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 6L, new Object[0]),
+ bits,
+ new Object[] { " ", " P ", " d ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 7L, new Object[0]),
+ bits,
+ new Object[] { " ", " P ", "d ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 8L, new Object[0]),
+ bits,
+ new Object[] { " ", "dP ", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 9L, new Object[0]),
+ bits,
+ new Object[] { "P d", " ", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 10L, new Object[0]),
+ bits,
+ new Object[] { "P ", " d", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 11L, new Object[0]),
+ bits,
+ new Object[] { "P ", " ", " d", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 12L, new Object[0]),
+ bits,
+ new Object[] { "P ", " ", " d ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 13L, new Object[0]),
+ bits,
+ new Object[] { " P", " ", " d", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 14L, new Object[0]),
+ bits,
+ new Object[] { " P", " ", " d ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 15L, new Object[0]),
+ bits,
+ new Object[] { " P", " ", "d ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 16L, new Object[0]),
+ bits,
+ new Object[] { " P", "d ", " ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 17L, new Object[0]),
+ bits,
+ new Object[] { " ", " ", "d P", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 18L, new Object[0]),
+ bits,
+ new Object[] { " ", "d ", " P", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 19L, new Object[0]),
+ bits,
+ new Object[] { "d ", " ", " P", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 20L, new Object[0]),
+ bits,
+ new Object[] { " d ", " ", " P", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 21L, new Object[0]),
+ bits,
+ new Object[] { "d ", " ", "P ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 22L, new Object[0]),
+ bits,
+ new Object[] { " d ", " ", "P ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 23L, new Object[0]),
+ bits,
+ new Object[] { " d", " ", "P ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ addCraftingRecipe(
+ GregtechItemList.Circuit_BioRecipeSelector.getWithDamage(1L, 24L, new Object[0]),
+ bits,
+ new Object[] { " ", " d", "P ", 'P',
+ GregtechItemList.Circuit_BioRecipeSelector.getWildcard(1L, new Object[0]) });
+ }
+
+ public static boolean addCraftingRecipe(ItemStack aResult, long aBitMask, Object[] aRecipe) {
+ Method mAddRecipe = ReflectionUtils.getMethod(
+ GT_ModHandler.class,
+ "addCraftingRecipe",
+ new Class[] { ItemStack.class, Enchantment[].class, int[].class, boolean.class, boolean.class,
+ boolean.class, boolean.class, boolean.class, boolean.class, boolean.class, boolean.class, boolean.class,
+ boolean.class, boolean.class, boolean.class, boolean.class, Object[].class });
+ boolean didInvoke = false;
+ if (mAddRecipe != null) {
+ try {
+ didInvoke = (boolean) mAddRecipe.invoke(
+ null,
+ aResult,
+ new Enchantment[] {},
+ new int[] {},
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ aRecipe);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ return didInvoke;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/Core_Agrichem.java b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/Core_Agrichem.java
new file mode 100644
index 0000000000..0c3d7d2867
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/Core_Agrichem.java
@@ -0,0 +1,56 @@
+package gtPlusPlus.plugin.agrichem;
+
+import gtPlusPlus.api.interfaces.IPlugin;
+import gtPlusPlus.plugin.agrichem.block.AgrichemFluids;
+import gtPlusPlus.plugin.manager.Core_Manager;
+
+// Called by Core_Manager#veryEarlyInit
+@SuppressWarnings("unused")
+public class Core_Agrichem implements IPlugin {
+
+ static final Core_Agrichem mInstance;
+
+ static {
+ mInstance = new Core_Agrichem();
+ Core_Manager.registerPlugin(mInstance);
+ mInstance.log("Preparing " + mInstance.getPluginName() + " for use.");
+ }
+
+ @Override
+ public boolean preInit() {
+ AgrichemFluids.init();
+ return true;
+ }
+
+ @Override
+ public boolean init() {
+ mInstance.log("Setting Items");
+ return true;
+ }
+
+ @Override
+ public boolean postInit() {
+ mInstance.log("Generating Recipes");
+ return true;
+ }
+
+ @Override
+ public boolean serverStart() {
+ return true;
+ }
+
+ @Override
+ public boolean serverStop() {
+ return true;
+ }
+
+ @Override
+ public String getPluginName() {
+ return "GT++ Agrichemistry Module";
+ }
+
+ @Override
+ public String getPluginAbbreviation() {
+ return "FARM";
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/IAlgalItem.java b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/IAlgalItem.java
new file mode 100644
index 0000000000..8ce137a323
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/IAlgalItem.java
@@ -0,0 +1,12 @@
+package gtPlusPlus.plugin.agrichem;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.plugin.agrichem.logic.AlgaeGeneticData;
+
+public interface IAlgalItem {
+
+ AlgaeDefinition getAlgaeType(ItemStack aStack);
+
+ AlgaeGeneticData getSpeciesData(ItemStack aStack);
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/block/AgrichemFluids.java b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/block/AgrichemFluids.java
new file mode 100644
index 0000000000..bd72654f0a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/block/AgrichemFluids.java
@@ -0,0 +1,77 @@
+package gtPlusPlus.plugin.agrichem.block;
+
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public class AgrichemFluids {
+
+ /*
+ * Saline Water - saltwater Sulfuric Waste Water - sulfuricapatite Methanol - methanol Hot Water - ic2hotwater
+ * Acetic Acid Propionic Acid Fermentation Base Ethylene - ethylene Ethanol - bioethanol Diluted SA -
+ * filutedsulfuricacid Sulfuric Acid - sulfuricacid Urea Formaldehyde - fluid.formaldehyde Liquid Resin Methane -
+ * methane Benzene - benzene Ethylbenzene - fluid.ethylbenzene Styrene - styrene
+ */
+
+ public static Fluid mAceticAcid;
+ public static Fluid mPropionicAcid;
+ public static Fluid mFermentationBase;
+ public static Fluid mUrea;
+ public static Fluid mLiquidResin;
+ public static Fluid mAcetone;
+ public static Fluid mButanol;
+
+ public static void init() {
+ if (!FluidRegistry.isFluidRegistered("aceticacid")) {
+ mAceticAcid = FluidUtils
+ .generateFluidNoPrefix("aceticacid", "Acetic Acid", 200, new short[] { 97, 168, 96, 100 }, true);
+ } else {
+ mAceticAcid = FluidRegistry.getFluid("aceticacid");
+ }
+ if (!FluidRegistry.isFluidRegistered("propionicacid")) {
+ mPropionicAcid = FluidUtils.generateFluidNoPrefix(
+ "propionicacid",
+ "Propionic Acid",
+ 200,
+ new short[] { 198, 209, 148, 100 },
+ true);
+ } else {
+ mPropionicAcid = FluidRegistry.getFluid("propionicacid");
+ }
+ if (!FluidRegistry.isFluidRegistered("fermentation.base")) {
+ mFermentationBase = FluidUtils.generateFluidNoPrefix(
+ "fermentation.base",
+ "Fermentation Base",
+ 200,
+ new short[] { 107, 100, 63, 100 },
+ true);
+ } else {
+ mFermentationBase = FluidRegistry.getFluid("fermentation.base");
+ }
+ if (!FluidRegistry.isFluidRegistered("ureamix")) {
+ mUrea = FluidUtils.generateFluidNoPrefix("ureamix", "Urea Mix", 200, new short[] { 71, 55, 12, 100 }, true);
+ } else {
+ mUrea = FluidRegistry.getFluid("ureamix");
+ }
+ if (!FluidRegistry.isFluidRegistered("liquidresin")) {
+ mLiquidResin = FluidUtils
+ .generateFluidNoPrefix("liquidresin", "Liquid Resin", 200, new short[] { 59, 58, 56, 100 }, true);
+ } else {
+ mLiquidResin = FluidRegistry.getFluid("liquidresin");
+ }
+
+ if (!FluidRegistry.isFluidRegistered("acetone")) {
+ mAcetone = FluidUtils
+ .generateFluidNoPrefix("acetone", "Acetone", 200, new short[] { 59, 58, 56, 100 }, true);
+ } else {
+ mAcetone = FluidRegistry.getFluid("acetone");
+ }
+ if (!FluidRegistry.isFluidRegistered("butanol")) {
+ mButanol = FluidUtils
+ .generateFluidNoPrefix("butanol", "Butanol", 200, new short[] { 159, 58, 56, 100 }, true);
+ } else {
+ mButanol = FluidRegistry.getFluid("butanol");
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAgrichemBase.java b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAgrichemBase.java
new file mode 100644
index 0000000000..8a6d189898
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAgrichemBase.java
@@ -0,0 +1,268 @@
+package gtPlusPlus.plugin.agrichem.item.algae;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.client.renderer.texture.TextureAtlasSprite;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+import net.minecraftforge.oredict.OreDictionary;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.core.item.chemistry.general.ItemGenericChemBase;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.OreDictUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class ItemAgrichemBase extends Item {
+
+ protected final IIcon base[];
+
+ /*
+ * 0 - Algae Biomass 1 - Green Algae Biomass 2 - Brown Algae Biomass 3 - Golden-Brown Algae Biomass 4 - Red Algae
+ * Biomass 5 - Cellulose Fiber 6 - Golden-Brown Cellulose Fiber 7 - Red Cellulose Fiber 8 - Compost 9 - Wood Pellet
+ * 10 - Wood Brick 11 - Cellulose Pulp 12 - Raw Bio Resin 13 - Catalyst Carrier 14 - Green Metal Catalyst 15 -
+ * Alginic Acid 16 - Alumina 17 - Aluminium Pellet 18 - Sodium Aluminate 19 - Sodium Hydroxide // Exists in Newer GT
+ * 20 - Sodium Carbonate 21 - Lithium Chloride 22 - Pellet Mold 23 - Clean Aluminium Mix 24 - Pinecone 25 - Crushed
+ * Pine
+ */
+
+ public ItemAgrichemBase() {
+ this.setHasSubtypes(true);
+ this.setNoRepair();
+ this.setMaxStackSize(64);
+ this.setMaxDamage(0);
+ base = new IIcon[26];
+ this.setUnlocalizedName("BasicAgrichemItem");
+ GameRegistry.registerItem(this, this.getUnlocalizedName());
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public boolean shouldRotateAroundWhenRendering() {
+ return super.shouldRotateAroundWhenRendering();
+ }
+
+ @Override
+ public void onUpdate(ItemStack p_77663_1_, World p_77663_2_, Entity p_77663_3_, int p_77663_4_,
+ boolean p_77663_5_) {
+ super.onUpdate(p_77663_1_, p_77663_2_, p_77663_3_, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ return super.getItemStackDisplayName(aStack);
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack p_77613_1_) {
+ return EnumRarity.common;
+ }
+
+ @Override
+ public boolean requiresMultipleRenderPasses() {
+ return false;
+ }
+
+ private static boolean mHasCheckedForSodiumHydroxide = false;
+ private static boolean mShowSodiumHydroxide = true;
+
+ private static boolean checkSodiumHydroxide() {
+ if (mHasCheckedForSodiumHydroxide) {
+ return mShowSodiumHydroxide;
+ } else {
+ if (OreDictUtils.containsValidEntries("dustSodiumHydroxide_GT5U")
+ || OreDictUtils.containsValidEntries("dustSodiumHydroxide")) {
+ List<ItemStack> aTest = OreDictionary.getOres("dustSodiumHydroxide", false);
+ if (aTest.isEmpty()) {
+ aTest = OreDictionary.getOres("dustSodiumHydroxide_GT5U", false);
+ if (!aTest.isEmpty()) {
+ mShowSodiumHydroxide = false;
+ }
+ } else {
+ mShowSodiumHydroxide = false;
+ }
+ }
+ }
+ mHasCheckedForSodiumHydroxide = true;
+ return mShowSodiumHydroxide;
+ }
+
+ @Override
+ public void getSubItems(Item aItem, CreativeTabs p_150895_2_, List aList) {
+ for (int i = 0; i < base.length; i++) {
+ if (i == 19) {
+ // Only show if it doesn't exist.
+ if (checkSodiumHydroxide()) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, i, 1));
+ }
+ } else {
+ aList.add(ItemUtils.simpleMetaStack(aItem, i, 1));
+ }
+ }
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack p_82789_1_, ItemStack p_82789_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
+ return false;
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public int getItemEnchantability(ItemStack stack) {
+ return 0;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister u) {
+ for (int i = 0; i < this.base.length; i++) {
+ String aPath = GTPlusPlus.ID + ":" + "bioscience/MetaItem1/" + i;
+ this.base[i] = u.registerIcon(aPath);
+ }
+ }
+
+ private boolean isTextureValid(String aPath) {
+ if (aPath == null) {
+ return false;
+ } else if (aPath.indexOf(92) == -1) {
+ Constructor aTextureAtlasSprite = ReflectionUtils.getConstructor(TextureAtlasSprite.class, String.class);
+ if (aTextureAtlasSprite != null) {
+ try {
+ TextureAtlasSprite aTestAtlas = (TextureAtlasSprite) aTextureAtlasSprite.newInstance(aPath);
+ if (aTestAtlas != null) {
+ return true;
+ }
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException e) {}
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ return this.base[damage];
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int damage) {
+ return this.base[damage];
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
+ return this.base[stack.getItemDamage()];
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return this.base[stack.getItemDamage()];
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return super.getUnlocalizedName() + "." + stack.getItemDamage();
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack aStack) {
+ if (ItemUtils.isCatalyst(aStack)) {
+ if (aStack.getTagCompound() == null || aStack.getTagCompound()
+ .hasNoTags()) {
+ createCatalystNBT(aStack);
+ }
+ double currentDamage = getCatalystDamage(aStack);
+ return currentDamage / getCatalystMaxDamage(aStack);
+ } else {
+ return 1D;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer player, List list, boolean bool) {
+ boolean aHasSpecialTooltips = false;
+ int aMaxDamage = 0;
+ int aDamageSegment = 0;
+ int aDam = 0;
+ EnumChatFormatting durability = EnumChatFormatting.GRAY;
+ if (ItemUtils.isCatalyst(aStack)) {
+ list.add(EnumChatFormatting.GRAY + "Active Reaction Agent");
+ aMaxDamage = getCatalystMaxDamage(aStack);
+ aDamageSegment = aMaxDamage / 5;
+ aDam = aMaxDamage - getCatalystDamage(aStack);
+ aHasSpecialTooltips = true;
+ }
+ if (aHasSpecialTooltips) {
+ if (aDam > aDamageSegment * 3) {
+ durability = EnumChatFormatting.GREEN;
+ } else if (aDam > aDamageSegment * 2) {
+ durability = EnumChatFormatting.YELLOW;
+ } else if (aDam > aDamageSegment) {
+ durability = EnumChatFormatting.GOLD;
+ } else if (aDam >= 0) {
+ durability = EnumChatFormatting.RED;
+ }
+ list.add(durability + "" + (aDam) + EnumChatFormatting.GRAY + " / " + aMaxDamage);
+ }
+ super.addInformation(aStack, player, list, bool);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack aStack) {
+ if (ItemUtils.isCatalyst(aStack)) {
+ int aDam = getCatalystDamage(aStack);
+ return aDam > 0;
+ }
+ return false;
+ }
+
+ public static boolean createCatalystNBT(ItemStack rStack) {
+ return ItemGenericChemBase.createCatalystNBT(rStack);
+ }
+
+ public static int getCatalystDamage(ItemStack aStack) {
+ return ItemGenericChemBase.getCatalystDamage(aStack);
+ }
+
+ public static int getCatalystMaxDamage(ItemStack aStack) {
+ return ItemGenericChemBase.getCatalystMaxDamage(aStack);
+ }
+
+ public static void setCatalystDamage(ItemStack aStack, int aAmount) {
+ ItemGenericChemBase.setCatalystDamage(aStack, aAmount);
+ }
+
+ public static int getMaxCatalystDurability(ItemStack aStack) {
+ return ItemGenericChemBase.getMaxCatalystDurability(aStack);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAlgaeBase.java b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAlgaeBase.java
new file mode 100644
index 0000000000..f34348a3af
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/item/algae/ItemAlgaeBase.java
@@ -0,0 +1,225 @@
+package gtPlusPlus.plugin.agrichem.item.algae;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.plugin.agrichem.AlgaeDefinition;
+import gtPlusPlus.plugin.agrichem.IAlgalItem;
+import gtPlusPlus.plugin.agrichem.logic.AlgaeGeneticData;
+
+public class ItemAlgaeBase extends Item implements IAlgalItem {
+
+ protected IIcon base;
+ protected IIcon overlay;
+
+ public ItemAlgaeBase() {
+ this.setHasSubtypes(true);
+ this.setMaxDamage(127);
+ this.setNoRepair();
+ this.setMaxStackSize(32);
+ this.setUnlocalizedName("BasicAlgaeItem");
+ GameRegistry.registerItem(this, this.getUnlocalizedName());
+ }
+
+ @Override
+ public boolean isDamageable() {
+ return false;
+ }
+
+ @Override
+ public boolean shouldRotateAroundWhenRendering() {
+ return super.shouldRotateAroundWhenRendering();
+ }
+
+ @Override
+ public void onUpdate(ItemStack p_77663_1_, World p_77663_2_, Entity p_77663_3_, int p_77663_4_,
+ boolean p_77663_5_) {
+ if (!p_77663_1_.hasTagCompound() || p_77663_1_.getTagCompound()
+ .hasNoTags()) {
+ p_77663_1_ = initNBT(p_77663_1_);
+ }
+ super.onUpdate(p_77663_1_, p_77663_2_, p_77663_3_, p_77663_4_, p_77663_5_);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ return EnumChatFormatting.UNDERLINE + super.getItemStackDisplayName(aStack);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer p_77624_2_, List aList, boolean p_77624_4_) {
+ int aDam = aStack.getItemDamage();
+ try {
+ aList.add(AlgaeDefinition.getByIndex(aDam).mSimpleName);
+ if (!aStack.hasTagCompound() || aStack.getTagCompound()
+ .hasNoTags()) {
+ aStack = initNBT(aStack);
+ } else {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ boolean mRequiresLight = aNBT.getBoolean("mRequiresLight");
+ boolean mSaltWater = aNBT.getBoolean("mSaltWater");
+ boolean mFreshWater = aNBT.getBoolean("mFreshWater");
+ byte mTempTolerance = aNBT.getByte("mTempTolerance");
+ float mFertility = aNBT.getFloat("mFertility");
+ float mProductionSpeed = aNBT.getFloat("mProductionSpeed");
+ byte mLifespan = aNBT.getByte("mLifespan");
+ int mGeneration = aNBT.getInteger("mGeneration");
+
+ aList.add("Requires Light: " + mRequiresLight);
+ aList.add("Salt Water: " + mSaltWater);
+ aList.add("Fresh Water: " + mFreshWater);
+ aList.add("Temp Tolerance: " + mTempTolerance);
+ aList.add("Growth: " + mFertility);
+ aList.add("Production: " + mProductionSpeed);
+ aList.add("Lifespan in days: " + mLifespan);
+ aList.add("Generation: " + mGeneration);
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ super.addInformation(aStack, p_77624_2_, aList, p_77624_4_);
+ }
+
+ @Override
+ public EnumRarity getRarity(ItemStack p_77613_1_) {
+ return EnumRarity.uncommon;
+ }
+
+ @Override
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public void getSubItems(Item aItem, CreativeTabs p_150895_2_, List aList) {
+ for (int i = 0; i < AlgaeDefinition.values().length; i++) {
+ aList.add(ItemUtils.simpleMetaStack(aItem, i, 1));
+ }
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack p_82789_1_, ItemStack p_82789_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
+ return false;
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public int getItemEnchantability(ItemStack stack) {
+ return 0;
+ }
+
+ @Override
+ public int getColorFromItemStack(ItemStack aStack, int aMeta) {
+ return AlgaeDefinition.getByIndex(aStack.getItemDamage()).mColour;
+ }
+
+ @Override
+ public IIcon getIconFromDamageForRenderPass(final int damage, final int pass) {
+ if (pass == 0) {
+ return this.base;
+ }
+ return this.overlay;
+ }
+
+ @Override
+ public void registerIcons(final IIconRegister i) {
+ this.base = i.registerIcon(GTPlusPlus.ID + ":" + "bioscience/BasicAlgae");
+ this.overlay = i.registerIcon(GTPlusPlus.ID + ":" + "bioscience/BasicAlgae_Overlay");
+ }
+
+ public static ItemStack initNBT(ItemStack aFreshAlgae) {
+ NBTTagCompound aNewTag = new NBTTagCompound();
+ ItemAlgaeBase aItem;
+ if (aFreshAlgae.getItem() instanceof ItemAlgaeBase) {
+ aItem = (ItemAlgaeBase) aFreshAlgae.getItem();
+ if (!aFreshAlgae.hasTagCompound()) {
+ AlgaeGeneticData y = aItem.getSpeciesData(aFreshAlgae);
+ aNewTag = y.writeToNBT();
+ aFreshAlgae.setTagCompound(aNewTag);
+ } else {
+ aNewTag = aFreshAlgae.getTagCompound();
+ }
+ }
+ return aFreshAlgae;
+ }
+
+ @Override
+ public AlgaeDefinition getAlgaeType(ItemStack aStack) {
+ return AlgaeDefinition.getByIndex(aStack != null ? aStack.getItemDamage() : 3);
+ }
+
+ @Override
+ public AlgaeGeneticData getSpeciesData(ItemStack aStack) {
+ NBTTagCompound aTag;
+ if (!aStack.hasTagCompound() || aStack.getTagCompound()
+ .hasNoTags()) {
+ aTag = new NBTTagCompound();
+ AlgaeGeneticData aGenes;
+ if (aStack.getItemDamage() < 3 || aStack.getItemDamage() > 5) {
+ aGenes = new AlgaeGeneticData();
+ aTag = aGenes.writeToNBT();
+ } else {
+ byte aTemp, aLifespan;
+ float aFert, aSpeed;
+
+ int aDam = aStack.getItemDamage();
+ aTemp = (byte) (aDam == 3 ? 0 : aDam == 4 ? 2 : 1);
+ aLifespan = (byte) (aDam == 3 ? 1 : aDam == 4 ? 3f : 2f);
+ aFert = (float) (aDam == 3 ? 2f : aDam == 4 ? 1f : 1.75f);
+ aSpeed = (float) (aDam == 3 ? 1f : aDam == 4 ? 1.5f : 2f);
+
+ aGenes = new AlgaeGeneticData(
+ true,
+ true,
+ AlgaeDefinition.getByIndex(aDam).mSaltWater,
+ AlgaeDefinition.getByIndex(aDam).mFreshWater,
+ aTemp,
+ aFert,
+ aSpeed,
+ aLifespan,
+ 0,
+ new AutoMap<>());
+ aTag = aGenes.writeToNBT();
+ }
+ } else {
+ aTag = aStack.getTagCompound();
+ }
+
+ return new AlgaeGeneticData(aTag);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGeneticData.java b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGeneticData.java
new file mode 100644
index 0000000000..6b7b72aa71
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGeneticData.java
@@ -0,0 +1,129 @@
+package gtPlusPlus.plugin.agrichem.logic;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+
+public class AlgaeGeneticData {
+
+ private final int mLifespan;
+
+ private final int mGeneration;
+
+ private final boolean mIsDominant;
+
+ private final boolean mRequiresLight;
+
+ private final boolean mSaltWater;
+
+ private final boolean mFreshWater;
+
+ private final byte mTempTolerance;
+
+ private final float mFertility;
+
+ private final float mProductionSpeed;
+
+ private final AutoMap<AlgaeGrowthRequirement> mSpecialRequirements;
+
+ public AlgaeGeneticData() {
+ this(true, true, true, true, (byte) 0, 1f, 1f, (byte) 30, 0, new AutoMap<>());
+ }
+
+ public AlgaeGeneticData(boolean isDominant, boolean requiresLight, boolean isSalt, boolean isFresh,
+ byte aTempTolerance, float aFertility, float aSpeed, byte aLifespan, int aGeneration,
+ AutoMap<AlgaeGrowthRequirement> aRequirements) {
+ mIsDominant = isDominant;
+ mRequiresLight = requiresLight;
+ mSaltWater = isSalt;
+ mFreshWater = isFresh;
+ mTempTolerance = aTempTolerance;
+ mFertility = aFertility;
+ mProductionSpeed = aSpeed;
+ mLifespan = aLifespan;
+ mGeneration = aGeneration;
+ mSpecialRequirements = aRequirements;
+ }
+
+ public AlgaeGeneticData(NBTTagCompound aNBT) {
+ if (aNBT == null || aNBT.hasNoTags()) {
+ mIsDominant = true;
+ mRequiresLight = true;
+ mSaltWater = true;
+ mFreshWater = true;
+ mTempTolerance = 0;
+ mFertility = 1;
+ mProductionSpeed = 1;
+ mLifespan = 30;
+ mGeneration = 0;
+ } else {
+ mIsDominant = aNBT.getBoolean("mIsDominant");
+ mRequiresLight = aNBT.getBoolean("mRequiresLight");
+ mSaltWater = aNBT.getBoolean("mSaltWater");
+ mFreshWater = aNBT.getBoolean("mFreshWater");
+ mTempTolerance = aNBT.getByte("mTempTolerance");
+ mFertility = aNBT.getFloat("mFertility");
+ mProductionSpeed = aNBT.getFloat("mProductionSpeed");
+ mLifespan = aNBT.getByte("mLifespan");
+ mGeneration = aNBT.getInteger("mGeneration");
+ }
+ mSpecialRequirements = new AutoMap<>();
+ }
+
+ /**
+ * In MC Days
+ */
+ public final int getLifespan() {
+ return this.mLifespan;
+ }
+
+ public final boolean isDominant() {
+ return this.mIsDominant;
+ }
+
+ public final boolean RequiresLight() {
+ return this.mRequiresLight;
+ }
+
+ public final boolean isSaltWater() {
+ return this.mSaltWater;
+ }
+
+ public final boolean isFreshWater() {
+ return this.mFreshWater;
+ }
+
+ public final byte getTempTolerance() {
+ return this.mTempTolerance;
+ }
+
+ public final float getFertility() {
+ return this.mFertility;
+ }
+
+ public final float getProductionSpeed() {
+ return this.mProductionSpeed;
+ }
+
+ public final int getGeneration() {
+ return this.mGeneration;
+ }
+
+ public final AutoMap<AlgaeGrowthRequirement> getSpecialRequirements() {
+ return this.mSpecialRequirements;
+ }
+
+ public NBTTagCompound writeToNBT() {
+ NBTTagCompound aGenes = new NBTTagCompound();
+ aGenes.setBoolean("mIsDominant", this.mIsDominant);
+ aGenes.setBoolean("mRequiresLight", this.mRequiresLight);
+ aGenes.setBoolean("mSaltWater", this.mSaltWater);
+ aGenes.setBoolean("mFreshWater", this.mFreshWater);
+ aGenes.setInteger("mLifespan", this.mLifespan);
+ aGenes.setInteger("mGeneration", this.mGeneration);
+ aGenes.setByte("mTempTolerance", this.mTempTolerance);
+ aGenes.setFloat("mFertility", this.mFertility);
+ aGenes.setFloat("mProductionSpeed", this.mProductionSpeed);
+ return aGenes;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGrowthRequirement.java b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGrowthRequirement.java
new file mode 100644
index 0000000000..07b89e5b5e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/agrichem/logic/AlgaeGrowthRequirement.java
@@ -0,0 +1,4 @@
+package gtPlusPlus.plugin.agrichem.logic;
+
+public class AlgaeGrowthRequirement {
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/fixes/interfaces/IBugFix.java b/gtpp/src/main/java/gtPlusPlus/plugin/fixes/interfaces/IBugFix.java
new file mode 100644
index 0000000000..b35ad2c063
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/fixes/interfaces/IBugFix.java
@@ -0,0 +1,6 @@
+package gtPlusPlus.plugin.fixes.interfaces;
+
+public interface IBugFix {
+
+ boolean isFixValid();
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/Core_VanillaFixes.java b/gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/Core_VanillaFixes.java
new file mode 100644
index 0000000000..cc181756c0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/Core_VanillaFixes.java
@@ -0,0 +1,101 @@
+package gtPlusPlus.plugin.fixes.vanilla;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.interfaces.IPlugin;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.plugin.manager.Core_Manager;
+
+// Called by Core_Manager#veryEarlyInit
+@SuppressWarnings("unused")
+public class Core_VanillaFixes implements IPlugin {
+
+ static final Core_VanillaFixes mInstance;
+ static final VanillaBedHeightFix mBedFixInstance;
+ static final VanillaBackgroundMusicFix mMusicFixInstance;
+
+ static {
+ mInstance = new Core_VanillaFixes();
+ mBedFixInstance = new VanillaBedHeightFix(mInstance);
+ mMusicFixInstance = new VanillaBackgroundMusicFix(mInstance);
+ mInstance.log("Preparing " + mInstance.getPluginName() + " for use.");
+ }
+
+ Core_VanillaFixes() {
+ Core_Manager.registerPlugin(this);
+ }
+
+ @Override
+ public boolean preInit() {
+ return fixVanillaOD();
+ }
+
+ @Override
+ public boolean init() {
+ return true;
+ }
+
+ @Override
+ public boolean postInit() {
+ return true;
+ }
+
+ @Override
+ public boolean serverStart() {
+ mMusicFixInstance.manage();
+ return true;
+ }
+
+ @Override
+ public boolean serverStop() {
+ return true;
+ }
+
+ @Override
+ public String getPluginName() {
+ return "GT++ Vanilla Fixes Module";
+ }
+
+ @Override
+ public String getPluginAbbreviation() {
+ return "VFIX";
+ }
+
+ private boolean fixVanillaOD() {
+ registerToOreDict(ItemUtils.getSimpleStack(Items.blaze_rod), "rodBlaze");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.nether_wart), "cropNetherWart");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.reeds), "sugarcane");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.paper), "paper");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.ender_pearl), "enderpearl");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.bone), "bone");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.gunpowder), "gunpowder");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.string), "string");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.nether_star), "netherStar");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.leather), "leather");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.feather), "feather");
+ registerToOreDict(ItemUtils.getSimpleStack(Items.egg), "egg");
+ registerToOreDict(ItemUtils.getSimpleStack(Blocks.end_stone), "endstone");
+ registerToOreDict(ItemUtils.getSimpleStack(Blocks.vine), "vine");
+ registerToOreDict(ItemUtils.getSimpleStack(Blocks.cactus), "blockCactus");
+ registerToOreDict(ItemUtils.getSimpleStack(Blocks.grass), "grass");
+ registerToOreDict(ItemUtils.getSimpleStack(Blocks.obsidian), "obsidian");
+ registerToOreDict(ItemUtils.getSimpleStack(Blocks.crafting_table), "workbench");
+ return true;
+ }
+
+ private void registerToOreDict(ItemStack aStack, String aString) {
+ if (aStack.getItem() == Items.blaze_rod) {
+ mInstance
+ .log("Registering " + aStack.getDisplayName() + " to OreDictionary under the tag '" + aString + "'.");
+ } else {
+ mInstance.log(
+ "Registering " + aStack.getDisplayName()
+ + " to OreDictionary under the tag '"
+ + aString
+ + "'. (Added to Forge in 1.8.9)");
+ }
+ ItemUtils.addItemToOreDictionary(aStack, aString);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBackgroundMusicFix.java b/gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBackgroundMusicFix.java
new file mode 100644
index 0000000000..22ae6f29c6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBackgroundMusicFix.java
@@ -0,0 +1,64 @@
+package gtPlusPlus.plugin.fixes.vanilla;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import gtPlusPlus.api.interfaces.IPlugin;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.plugin.fixes.interfaces.IBugFix;
+import gtPlusPlus.plugin.fixes.vanilla.music.MusicTocker;
+import gtPlusPlus.preloader.CORE_Preloader;
+
+public class VanillaBackgroundMusicFix implements IBugFix {
+
+ private final IPlugin mParent;
+ private final boolean enabled;
+ private MusicTocker mFixInstance;
+
+ public VanillaBackgroundMusicFix(IPlugin minstance) {
+ mParent = minstance;
+ if (CORE_Preloader.enableWatchdogBGM > 0 && Utils.isClient()) {
+ mParent.log("[BGM] Registering BGM delay Fix.");
+ enabled = true;
+ mFixInstance = new MusicTocker(mParent);
+ } else if (CORE_Preloader.enableWatchdogBGM > 0 && Utils.isServer()) {
+ mParent.log("[BGM] Tried registering BGM delay Fix on Server, disabling.");
+ enabled = false;
+ } else {
+ mParent.log("[BGM] Not registering BGM delay Fix.");
+ enabled = false;
+ }
+ }
+
+ @Override
+ public boolean isFixValid() {
+ return enabled;
+ }
+
+ public void manage() {
+ if (CORE_Preloader.enableWatchdogBGM > 0 && Utils.isClient()) {
+ TimerTask task = new ManageTask(this.mFixInstance);
+ Timer timer = new Timer("BGM-WatchDog");
+ long delay = 1000 * 60;
+ timer.scheduleAtFixedRate(task, delay, 5000);
+ }
+ }
+
+ private static class ManageTask extends TimerTask {
+
+ private final MusicTocker A;
+
+ public ManageTask(MusicTocker a) {
+ A = a;
+ }
+
+ @Override
+ public void run() {
+ if (CORE_Preloader.enableWatchdogBGM > 0 && Utils.isClient()) {
+ if (!A.mVanillaManager) {
+ A.run();
+ }
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBedHeightFix.java b/gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBedHeightFix.java
new file mode 100644
index 0000000000..60ab048ca3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/VanillaBedHeightFix.java
@@ -0,0 +1,85 @@
+package gtPlusPlus.plugin.fixes.vanilla;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
+
+import cpw.mods.fml.common.eventhandler.EventPriority;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gtPlusPlus.api.interfaces.IPlugin;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.plugin.fixes.interfaces.IBugFix;
+import gtPlusPlus.preloader.CORE_Preloader;
+
+public class VanillaBedHeightFix implements IBugFix {
+
+ private final Method mSleepInBedAt;
+ private final IPlugin mParent;
+
+ public VanillaBedHeightFix(IPlugin minstance) {
+ mParent = minstance;
+ Method m;
+ if (!CORE_Preloader.DEV_ENVIRONMENT) {
+ m = ReflectionUtils.getMethod(EntityPlayer.class, "func_71018_a", int.class, int.class, int.class);
+ } else {
+ m = ReflectionUtils.getMethod(
+ net.minecraft.entity.player.EntityPlayer.class,
+ "sleepInBedAt",
+ int.class,
+ int.class,
+ int.class);
+ }
+ if (m != null) {
+ mSleepInBedAt = m;
+ mParent.log("Registering Bed Height Fix.");
+ Utils.registerEvent(this);
+ } else {
+ mSleepInBedAt = null;
+ }
+ }
+
+ @Override
+ public boolean isFixValid() {
+ return mSleepInBedAt != null;
+ }
+
+ /**
+ * Fix created by deNULL -
+ * https://github.com/deNULL/BugPatch/blob/master/src/main/java/ru/denull/BugPatch/mod/ClientEvents.java#L45
+ *
+ * @param evt - The event where a player sleeps
+ */
+ @SubscribeEvent(priority = EventPriority.HIGHEST)
+ public void playerSleepInBed(PlayerSleepInBedEvent evt) {
+ Logger.WARNING("Sleep Event Detected. Player is sleeping at Y: " + evt.y);
+ if (evt.y <= 0 && isFixValid()) {
+ int correctY = 256 + evt.y;
+ if (correctY <= 0) {
+ Logger.WARNING(
+ "You're trying to sleep at y=" + evt.y
+ + ", which is impossibly low. However, fixed y value is "
+ + correctY
+ + ", which is still below 0. Falling back to default behavior.");
+ } else {
+ Logger.WARNING(
+ "You're trying to sleep at y=" + evt.y
+ + ". This is probably caused by overflow, stopping original event; retrying with y="
+ + correctY
+ + ".");
+ evt.result = EntityPlayer.EnumStatus.OTHER_PROBLEM;
+ try {
+ mSleepInBedAt.invoke(evt.entityPlayer, evt.x, correctY, evt.z);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ Logger.WARNING("Encountered an error trying to sleep.");
+ }
+ }
+ } else if (!isFixValid()) {
+ Logger.WARNING(
+ "Method sleepInBedAt was not found in EntityPlayer (wrong MC and/or Forge version?), unable to fix");
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/music/MusicTocker.java b/gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/music/MusicTocker.java
new file mode 100644
index 0000000000..c669f93f62
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/fixes/vanilla/music/MusicTocker.java
@@ -0,0 +1,131 @@
+package gtPlusPlus.plugin.fixes.vanilla.music;
+
+import java.lang.reflect.Field;
+import java.util.Random;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.audio.ISound;
+import net.minecraft.client.audio.MusicTicker;
+import net.minecraft.client.audio.PositionedSoundRecord;
+import net.minecraft.util.MathHelper;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.objects.XSTR;
+import gtPlusPlus.api.interfaces.IPlugin;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+
+@SideOnly(Side.CLIENT)
+public class MusicTocker extends MusicTicker implements Runnable {
+
+ private final Random mRandom = new XSTR();
+ private final Minecraft mMinecraft;
+ private final IPlugin mPlugin;
+ private ISound mSound;
+ private int mTimeUntilNextTrack = 100;
+
+ public boolean mVanillaManager = false;
+
+ public MusicTocker(IPlugin aPlugin) {
+ super(Minecraft.getMinecraft());
+ mPlugin = aPlugin;
+ mMinecraft = Minecraft.getMinecraft();
+ mPlugin.log("[BGM] Created BGM Watchdog with a delay of " + getDelay() + " ticks.");
+ inject();
+ }
+
+ private static int getDelay() {
+ return CORE_Preloader.enableWatchdogBGM;
+ }
+
+ private boolean inject() {
+ mPlugin.log("[BGM] Inject new Watchdog into Minecraft instance.");
+ ReflectionUtils.setField(Minecraft.getMinecraft(), "mcMusicTicker", this);
+ mPlugin.log("[BGM] Verifying...");
+ Field f = ReflectionUtils.getField(Minecraft.class, "mcMusicTicker");
+ try {
+ Object m = f.get(mMinecraft);
+ if (m != null) {
+ if (m instanceof MusicTocker || m.getClass()
+ .isAssignableFrom(getClass())) {
+ mPlugin.log("[BGM] Success.");
+ return true;
+ } else if (m instanceof MusicTicker || m.getClass()
+ .isAssignableFrom(MusicTicker.class)) {
+ mPlugin.log("[BGM] Found Vanilla MusicTicker, but may be instance of MusicTocker.");
+ return true;
+ }
+ }
+ } catch (IllegalArgumentException | IllegalAccessException e) {}
+
+ mPlugin.log("[BGM] Failed.");
+ return false;
+ }
+
+ private void updateInternalNumber() {
+ if (ReflectionUtils.doesFieldExist(getClass(), "field_147676_d")) {
+ ReflectionUtils.setField(this, "field_147676_d", mTimeUntilNextTrack);
+ }
+ }
+
+ private void updateInternalSound(ISound aSound) {
+ if (ReflectionUtils.doesFieldExist(getClass(), "field_147678_c")) {
+ ReflectionUtils.setField(this, "field_147678_c", aSound);
+ }
+ }
+
+ /**
+ * Updates the JList with a new model.
+ */
+ @Override
+ public void update() {
+ run();
+ mVanillaManager = true;
+ }
+
+ @Override
+ public void run() {
+ MusicType musictype = this.mMinecraft.func_147109_W();
+
+ if (this.mSound != null) {
+ if (!musictype.getMusicTickerLocation()
+ .equals(this.mSound.getPositionedSoundLocation())) {
+ this.mMinecraft.getSoundHandler()
+ .stopSound(this.mSound);
+ this.mTimeUntilNextTrack = MathHelper.getRandomIntegerInRange(this.mRandom, 0, getDelay() / 2);
+ updateInternalNumber();
+ Logger.INFO("[BGM] Adjusted BGM delay 1");
+ }
+ if (!this.mMinecraft.getSoundHandler()
+ .isSoundPlaying(this.mSound)) {
+ this.mSound = null;
+ updateInternalSound(null);
+ this.mTimeUntilNextTrack = Math.min(
+ MathHelper.getRandomIntegerInRange(this.mRandom, getDelay(), getDelay() * 2),
+ this.mTimeUntilNextTrack);
+ updateInternalNumber();
+ Logger.INFO("[BGM] Adjusted BGM delay 2");
+ }
+ } else if (this.mSound == null && this.mTimeUntilNextTrack-- <= 0) {
+ this.mSound = PositionedSoundRecord.func_147673_a(musictype.getMusicTickerLocation());
+ updateInternalSound(mSound);
+ this.mMinecraft.getSoundHandler()
+ .playSound(this.mSound);
+ this.mTimeUntilNextTrack = getDelay();
+ updateInternalNumber();
+ Logger.INFO("[BGM] Adjusted BGM 3");
+ }
+
+ /*
+ * try { // Get Value stored in underlying object. Integer aRealDelay = (Integer)
+ * ReflectionUtils.getField(getClass(), "field_147676_d").get(this); if (aRealDelay == null) { return; } else {
+ * if (aRealDelay > getDelay() || aRealDelay <= 0) { this.mTimeUntilNextTrack = getDelay();
+ * updateInternalNumber(); } else { this.mTimeUntilNextTrack -= 5 * 20; updateInternalNumber(); } aRealDelay =
+ * (Integer) ReflectionUtils.getField(getClass(), "field_147676_d").get(this);
+ * Logger.INFO("[BGM] Adjusted BGM - "+aRealDelay); } } catch (IllegalArgumentException | IllegalAccessException
+ * e) { }
+ */
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/plugin/manager/Core_Manager.java b/gtpp/src/main/java/gtPlusPlus/plugin/manager/Core_Manager.java
new file mode 100644
index 0000000000..be1dafd231
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/plugin/manager/Core_Manager.java
@@ -0,0 +1,94 @@
+package gtPlusPlus.plugin.manager;
+
+import gtPlusPlus.api.interfaces.IPlugin;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class Core_Manager {
+
+ public static AutoMap<IPlugin> mPlugins = new AutoMap<>();
+
+ /**
+ * @param plugin - Dynamically registers the plugin for loading.
+ */
+ public static void registerPlugin(IPlugin plugin) {
+ Logger.INFO("[Plugin] " + "Registered " + plugin.getPluginName() + ".");
+ mPlugins.put(plugin);
+ }
+
+ /**
+ * Dynamically loads all class objects within the "gtPlusPlus.plugin" package.
+ */
+ public static void veryEarlyInit() {
+ if (ReflectionUtils.dynamicallyLoadClassesInPackage("gtPlusPlus.plugin")) {
+ Logger.INFO("[Plugin] Plugin System loaded.");
+ }
+ }
+
+ public static boolean preInit() {
+ try {
+ for (IPlugin h : mPlugins) {
+ if (h.preInit()) {
+ Logger.INFO("[Plugin] Completed Pre-Init Phase for " + h.getPluginName() + ".");
+ } else {
+ Logger.INFO("[Plugin] Failed during Pre-Init Phase for " + h.getPluginName() + ".");
+ }
+ }
+ return true;
+ } catch (Throwable ignored) {}
+ return false;
+ }
+
+ public static boolean init() {
+ try {
+ for (IPlugin h : mPlugins) {
+ if (h.init()) {
+ Logger.INFO("[Plugin] Completed Init Phase for " + h.getPluginName() + ".");
+ } else {
+ Logger.INFO("[Plugin] Failed during Init Phase for " + h.getPluginName() + ".");
+ }
+ }
+ return true;
+ } catch (Throwable ignored) {}
+ return false;
+ }
+
+ public static boolean postInit() {
+ try {
+ for (IPlugin h : mPlugins) {
+ if (h.postInit()) {
+ Logger.INFO("[Plugin] Completed Post-Init Phase for " + h.getPluginName() + ".");
+ } else {
+ Logger.INFO("[Plugin] Failed during Post-Init Phase for " + h.getPluginName() + ".");
+ }
+ }
+ return true;
+ } catch (Throwable ignored) {}
+ return false;
+ }
+
+ public static void serverStart() {
+ try {
+ for (IPlugin h : mPlugins) {
+ if (h.serverStart()) {
+ Logger.INFO("[Plugin] Completed Server Start Phase for " + h.getPluginName() + ".");
+ } else {
+ Logger.INFO("[Plugin] Failed during Server Start Phase for " + h.getPluginName() + ".");
+ }
+ }
+ } catch (Throwable ignored) {}
+ }
+
+ public static void serverStop() {
+ try {
+ for (IPlugin h : mPlugins) {
+ if (h.serverStop()) {
+ Logger.INFO("[Plugin] Completed Server Stop Phase for " + h.getPluginName() + ".");
+ } else {
+ Logger.INFO("[Plugin] Failed during Server Stop Phase for " + h.getPluginName() + ".");
+ }
+ }
+ } catch (Throwable ignored) {}
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/preloader/CORE_Preloader.java b/gtpp/src/main/java/gtPlusPlus/preloader/CORE_Preloader.java
new file mode 100644
index 0000000000..146c92764b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/preloader/CORE_Preloader.java
@@ -0,0 +1,33 @@
+package gtPlusPlus.preloader;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import cpw.mods.fml.common.versioning.ArtifactVersion;
+
+public class CORE_Preloader {
+
+ public static final String NAME = "GT++ Preloader";
+ public static final String MODID = "GT++_Preloader";
+ public static final String VERSION = "0.5-Beta";
+ public static final List<ArtifactVersion> DEPENDENCIES;
+ public static final String JAVA_VERSION = System.getProperty("java.version");
+
+ public static File MC_DIR;
+ public static boolean DEV_ENVIRONMENT = false;
+ public static boolean DEBUG_MODE = false;
+ public static boolean enableOldGTcircuits = false;
+ public static int enableWatchdogBGM = 0;
+
+ public static void setMinecraftDirectory(File aDir) {
+ MC_DIR = aDir;
+ }
+
+ static {
+ ArrayList<ArtifactVersion> deps = new ArrayList<>();
+ // deps.add("required-before:gregtech;");
+ DEPENDENCIES = Collections.unmodifiableList(deps);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/preloader/Preloader_GT_OreDict.java b/gtpp/src/main/java/gtPlusPlus/preloader/Preloader_GT_OreDict.java
new file mode 100644
index 0000000000..9a350ab5e4
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/preloader/Preloader_GT_OreDict.java
@@ -0,0 +1,103 @@
+package gtPlusPlus.preloader;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraft.item.ItemStack;
+
+import org.apache.logging.log4j.Level;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+import gregtech.common.items.GT_MetaGenerated_Item_01;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class Preloader_GT_OreDict {
+
+ public static boolean shouldPreventRegistration(final String string, final ItemStack bannedItem) {
+
+ if (bannedItem == null) {
+ return false;
+ } else if (!CORE_Preloader.enableOldGTcircuits) {
+ return false;
+ }
+
+ try {
+ if (CORE_Preloader.enableOldGTcircuits) {
+ if ((bannedItem != null) && ItemUtils.getModId(bannedItem)
+ .toLowerCase()
+ .equals(GregTech.ID)) {
+ final int damageValue = bannedItem.getItemDamage() - 32000;
+ if (bannedItem.getItem() instanceof GT_MetaGenerated_Item_01) { // 700-720
+ if ((damageValue >= 700) && (damageValue <= 720)) {
+ return true;
+ }
+ } else {
+ if (ReflectionUtils.doesClassExist("gregtech.common.items.GT_MetaGenerated_Item_03")) { // 6/11/12/14/16/20/30-57/69-73/79-96
+ final Class<?> MetaItem03 = ReflectionUtils
+ .getClass("gregtech.common.items.GT_MetaGenerated_Item_03");
+ if (isInstanceOf(MetaItem03, bannedItem.getItem())) {
+ if ((damageValue == 6) || (damageValue == 7)
+ || (damageValue == 11)
+ || (damageValue == 12)
+ || (damageValue == 14)
+ || (damageValue == 16)
+ || (damageValue == 20)
+ || (damageValue == 21)
+ || (damageValue == 22)) {
+ return true;
+ } else if ((damageValue >= 30) && (damageValue <= 57)) {
+ return true;
+ } else if ((damageValue >= 69) && (damageValue <= 73)) {
+ return true;
+ } else if ((damageValue >= 78) && (damageValue <= 96)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ } catch (final Throwable e) {
+ if (CORE.ConfigSwitches.showHiddenNEIItems) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] OreDictTransformer",
+ Level.INFO,
+ "A mod tried to register an invalid item with the OreDictionary.");
+ if (bannedItem != null) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] OreDictTransformer",
+ Level.INFO,
+ "Please report this issue to the authors of %s",
+ ItemUtils.getModId(bannedItem));
+ try {
+ if (bannedItem.getItemDamage() <= Short.MAX_VALUE - 1) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] OreDictTransformer",
+ Level.INFO,
+ "Item was not null, but still invalidly registering: %s",
+ bannedItem.getDisplayName() != null ? bannedItem.getDisplayName()
+ : "INVALID ITEM FOUND");
+ } else {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] OreDictTransformer",
+ Level.INFO,
+ "Item was not null, but still invalidly registering: %s",
+ "Found Wildcard item that is being registered too early.");
+ }
+ } catch (Exception h) {
+ h.printStackTrace();
+ }
+ }
+ }
+ // FMLRelaunchLog.log("[GT++ ASM] OreDictTransformer", Level.INFO, "%s", e.getMessage());
+ }
+ return false;
+ }
+
+ // Simplification of Life.
+ private static boolean isInstanceOf(final Class<?> clazz, final Object obj) {
+ return clazz.isInstance(obj);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/preloader/Preloader_Logger.java b/gtpp/src/main/java/gtPlusPlus/preloader/Preloader_Logger.java
new file mode 100644
index 0000000000..477e1371e3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/preloader/Preloader_Logger.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.preloader;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class Preloader_Logger {
+
+ private Preloader_Logger() {}
+
+ // Logging Functions
+ public static final Logger MODLOGGER = LogManager.getLogger("GT++ ASM");
+
+ public static Logger getLogger() {
+ return MODLOGGER;
+ }
+
+ // Non-Dev Comments
+
+ public static void INFO(final String s, final String s2) {
+ INFO(s);
+ INFO(s2);
+ }
+
+ public static void INFO(final String s) {
+ MODLOGGER.info(s);
+ }
+
+ // Developer Comments
+ public static void WARNING(final String s) {
+ MODLOGGER.warn(s);
+ }
+
+ // Errors
+ public static void ERROR(final String s) {
+ MODLOGGER.fatal(s);
+ }
+
+ public static void LOG(String string, Level info, String string2) {
+ if (info.equals(Level.INFO)) {
+ INFO("[" + string + "] " + string2);
+ }
+ if (info.equals(Level.WARN)) {
+ WARNING("[" + string + "] " + string2);
+ }
+ if (info.equals(Level.ERROR)) {
+ ERROR("[" + string + "] " + string2);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/preloader/asm/AsmConfig.java b/gtpp/src/main/java/gtPlusPlus/preloader/asm/AsmConfig.java
new file mode 100644
index 0000000000..b4a49c275c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/preloader/asm/AsmConfig.java
@@ -0,0 +1,144 @@
+package gtPlusPlus.preloader.asm;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.common.config.Property;
+
+import org.apache.logging.log4j.Level;
+
+import cpw.mods.fml.common.FMLLog;
+import gtPlusPlus.preloader.Preloader_Logger;
+
+public class AsmConfig {
+
+ public static Configuration config;
+
+ public static boolean enableOreDictPatch;
+ public static boolean enableGtTooltipFix;
+ public static boolean enableGtNbtFix;
+ public static boolean enableGtCharcoalPitFix;
+ public static boolean enableCofhPatch;
+ public static boolean enableTcAspectSafety;
+ public static boolean enabledLwjglKeybindingFix;
+ public static boolean enabledFixEntitySetHealth;
+ public static boolean enableThaumicTinkererRepairFix;
+
+ public static boolean disableAllLogging;
+ public static boolean debugMode;
+
+ static {
+ config = new Configuration(new File("config/GTplusplus/asm.cfg"));
+ syncConfig(true);
+ }
+
+ public static void syncConfig(boolean load) {
+ ArrayList<String> propOrder = new ArrayList<>();
+ ArrayList<String> propOrderDebug = new ArrayList<>();
+
+ try {
+ if (!config.isChild && load) {
+ config.load();
+ }
+
+ Property prop;
+
+ // Debug
+ prop = config.get("debug", "disableAllLogging", true);
+ prop.comment = "Disables ALL logging from GT++.";
+ prop.setLanguageKey("gtpp.disableAllLogging")
+ .setRequiresMcRestart(false);
+ disableAllLogging = prop.getBoolean(true);
+ propOrderDebug.add(prop.getName());
+
+ prop = config.get("debug", "debugMode", false);
+ prop.comment = "Enables all sorts of debug logging. (Don't use unless told to, breaks other things.)";
+ prop.setLanguageKey("gtpp.debugMode")
+ .setRequiresMcRestart(false);
+ debugMode = prop.getBoolean(false);
+ propOrderDebug.add(prop.getName());
+
+ prop = config.get("debug", "enabledFixEntitySetHealth", false);
+ prop.comment = "Enable/Disable entity setHealth() fix.";
+ prop.setLanguageKey("gtpp.enabledFixEntitySetHealth")
+ .setRequiresMcRestart(true);
+ enabledFixEntitySetHealth = prop.getBoolean(false);
+ propOrderDebug.add(prop.getName());
+
+ prop = config.get("debug", "enableGtNbtFix", true);
+ prop.comment = "Enable/Disable GT NBT Persistency Fix";
+ prop.setLanguageKey("gtpp.enableGtNbtFix")
+ .setRequiresMcRestart(true);
+ enableGtNbtFix = prop.getBoolean(true);
+ propOrderDebug.add(prop.getName());
+
+ prop = config.get("debug", "enableCofhPatch", false);
+ prop.comment = "Enable/Disable COFH OreDictionaryArbiter Patch (Useful for Development)";
+ prop.setLanguageKey("gtpp.enableCofhPatch")
+ .setRequiresMcRestart(true);
+ enableCofhPatch = prop.getBoolean(false);
+ propOrderDebug.add(prop.getName());
+
+ prop = config.get("debug", "enableOreDictPatch", false);
+ prop.comment = "Enable/Disable Forge OreDictionary Patch (Useful for Development)";
+ prop.setLanguageKey("gtpp.enableOreDictPatch")
+ .setRequiresMcRestart(true);
+ enableOreDictPatch = prop.getBoolean(false);
+ propOrderDebug.add(prop.getName());
+
+ prop = config.get("debug", "enableThaumicTinkererRepairFix", false);
+ prop.comment = "Enable/Disable Patch for Thaumic Repairer";
+ prop.setLanguageKey("gtpp.enableThaumicTinkererRepairFix")
+ .setRequiresMcRestart(true);
+ enableThaumicTinkererRepairFix = prop.getBoolean(false);
+ propOrderDebug.add(prop.getName());
+
+ // General Features
+ prop = config.get("general", "enabledLwjglKeybindingFix", true);
+ prop.comment = "Prevents the game crashing from having invalid keybinds. https://github.com/alkcorp/GTplusplus/issues/544";
+ prop.setLanguageKey("gtpp.enabledLwjglKeybindingFix")
+ .setRequiresMcRestart(true);
+ enabledLwjglKeybindingFix = prop.getBoolean(true);
+ propOrder.add(prop.getName());
+
+ prop = config.get("general", "enableGtTooltipFix", true);
+ prop.comment = "Enable/Disable Custom GT Tooltips";
+ prop.setLanguageKey("gtpp.enableGtTooltipFix")
+ .setRequiresMcRestart(true);
+ enableGtTooltipFix = prop.getBoolean(true);
+ propOrder.add(prop.getName());
+
+ prop = config.get("general", "enableGtCharcoalPitFix", true);
+ prop.comment = "Makes the Charcoal Pile Igniter work better.";
+ prop.setLanguageKey("gtpp.enableGtCharcoalPitFix")
+ .setRequiresMcRestart(true);
+ enableGtCharcoalPitFix = prop.getBoolean(true);
+ propOrder.add(prop.getName());
+
+ // TC Aspect Safety
+ prop = config.get("general", "enableTcAspectSafety", true);
+ prop.comment = "Fixes small oversights in Thaumcraft 4.";
+ prop.setLanguageKey("gtpp.enableTcAspectSafety")
+ .setRequiresMcRestart(true);
+ enableTcAspectSafety = prop.getBoolean(true);
+ propOrder.add(prop.getName());
+
+ config.setCategoryPropertyOrder("general", propOrder);
+ config.setCategoryPropertyOrder("debug", propOrderDebug);
+ if (config.hasChanged()) {
+ config.save();
+ }
+
+ Preloader_Logger.INFO("Gt Nbt Fix - Enabled: " + enableGtNbtFix);
+ Preloader_Logger.INFO("Gt Tooltip Fix - Enabled: " + enableGtTooltipFix);
+ Preloader_Logger.INFO("COFH Patch - Enabled: " + enableCofhPatch);
+ Preloader_Logger.INFO("Thaumcraft Aspect Safety Patch - Enabled: " + enableTcAspectSafety);
+ Preloader_Logger
+ .INFO("Fix bad usage of EntityLivingBase.setHealth Patch - Enabled: " + enabledFixEntitySetHealth);
+
+ } catch (Exception var3) {
+ FMLLog.log(Level.ERROR, var3, "GT++ ASM had a problem loading it's config", new Object[0]);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/preloader/asm/Preloader_DummyContainer.java b/gtpp/src/main/java/gtPlusPlus/preloader/asm/Preloader_DummyContainer.java
new file mode 100644
index 0000000000..c77f570a8d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/preloader/asm/Preloader_DummyContainer.java
@@ -0,0 +1,70 @@
+package gtPlusPlus.preloader.asm;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.io.File;
+import java.util.Collections;
+
+import net.minecraftforge.common.config.Configuration;
+
+import com.google.common.eventbus.EventBus;
+import com.google.common.eventbus.Subscribe;
+
+import cpw.mods.fml.common.DummyModContainer;
+import cpw.mods.fml.common.LoadController;
+import cpw.mods.fml.common.ModMetadata;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.preloader.Preloader_Logger;
+
+public class Preloader_DummyContainer extends DummyModContainer {
+
+ public Preloader_DummyContainer() {
+ super(new ModMetadata());
+ ModMetadata meta = getMetadata();
+ meta.modId = CORE_Preloader.MODID;
+ meta.name = CORE_Preloader.NAME;
+ meta.version = CORE_Preloader.VERSION;
+ meta.credits = "Roll Credits ...";
+ meta.authorList = Collections.singletonList("Alkalus");
+ meta.screenshots = new String[0];
+ meta.parent = GTPlusPlus.ID;
+ }
+
+ @Override
+ public boolean registerBus(EventBus bus, LoadController controller) {
+ bus.register(this);
+ return true;
+ }
+
+ @Subscribe
+ public void preInit(FMLPreInitializationEvent event) {
+ Preloader_Logger.INFO("Loading " + CORE_Preloader.MODID + " V" + CORE_Preloader.VERSION);
+ // Handle GT++ Config
+ handleConfigFile(event);
+ }
+
+ public static void handleConfigFile(final FMLPreInitializationEvent event) {
+ final Configuration config = new Configuration(
+ new File(event.getModConfigurationDirectory(), "GTplusplus/GTplusplus.cfg"));
+ config.load();
+
+ // BGM Watchdog
+ CORE_Preloader.enableWatchdogBGM = config.getInt(
+ "enableWatchdogBGM",
+ "features",
+ 0,
+ 0,
+ Short.MAX_VALUE,
+ "Set to a value greater than 0 to reduce the ticks taken to delay between BGM tracks. Acceptable Values are 1-32767, where 0 is disabled. Vanilla Uses 12,000 & 24,000. 200 is 10s.");
+
+ // Circuits
+ CORE_Preloader.enableOldGTcircuits = config.getBoolean(
+ "enableOldGTcircuits",
+ GregTech.ID,
+ false,
+ "Restores circuits and their recipes from Pre-5.09.28 times.");
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java b/gtpp/src/main/java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java
new file mode 100644
index 0000000000..cdd25bb268
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/preloader/asm/Preloader_FMLLoadingPlugin.java
@@ -0,0 +1,47 @@
+package gtPlusPlus.preloader.asm;
+
+import java.io.File;
+import java.util.Map;
+
+import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
+import cpw.mods.fml.relauncher.IFMLLoadingPlugin.MCVersion;
+import cpw.mods.fml.relauncher.IFMLLoadingPlugin.SortingIndex;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.preloader.asm.transformers.Preloader_Transformer_Handler;
+
+@SortingIndex(10097)
+@MCVersion(value = "1.7.10")
+@IFMLLoadingPlugin.TransformerExclusions("gtPlusPlus.preloader")
+@IFMLLoadingPlugin.Name(CORE_Preloader.NAME)
+public class Preloader_FMLLoadingPlugin implements IFMLLoadingPlugin {
+
+ @Override
+ public String getAccessTransformerClass() {
+ return null;
+ }
+
+ @Override
+ public String[] getASMTransformerClass() {
+ return new String[] { Preloader_Transformer_Handler.class.getName() };
+ }
+
+ @Override
+ public String getModContainerClass() {
+ return Preloader_DummyContainer.class.getName();
+ }
+
+ @Override
+ public String getSetupClass() {
+ return null;
+ }
+
+ @Override
+ public void injectData(Map<String, Object> data) {
+ CORE_Preloader.DEV_ENVIRONMENT = !(boolean) data.get("runtimeDeobfuscationEnabled");
+ File mcDir = (File) data.get("mcLocation");
+ if (mcDir != null && mcDir.exists()) {
+ CORE_Preloader.setMinecraftDirectory(mcDir);
+ }
+ CORE_Preloader.DEBUG_MODE = AsmConfig.debugMode;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter.java b/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter.java
new file mode 100644
index 0000000000..0b41846928
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter.java
@@ -0,0 +1,187 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.ACC_STATIC;
+import static org.objectweb.asm.Opcodes.ALOAD;
+import static org.objectweb.asm.Opcodes.ASM5;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+import static org.objectweb.asm.Opcodes.RETURN;
+
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+
+import cofh.core.util.oredict.OreDictionaryArbiter;
+import cofh.lib.util.ItemWrapper;
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+import gnu.trove.map.TMap;
+import gnu.trove.map.hash.THashMap;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class ClassTransformer_COFH_OreDictionaryArbiter {
+
+ // The qualified name of the class we plan to transform.
+ private static final String className = "cofh.core.util.oredict.OreDictionaryArbiter";
+ // cofh/core/util/oredict/OreDictionaryArbiter
+
+ private final boolean isValid;
+ private final ClassReader reader;
+ private final ClassWriter writer;
+
+ public ClassTransformer_COFH_OreDictionaryArbiter(byte[] basicClass) {
+ ClassReader aTempReader = null;
+ ClassWriter aTempWriter = null;
+ aTempReader = new ClassReader(basicClass);
+ aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES);
+ aTempReader.accept(new localClassVisitor(aTempWriter), 0);
+
+ if (aTempReader != null && aTempWriter != null) {
+ isValid = true;
+ } else {
+ isValid = false;
+ }
+ reader = aTempReader;
+ writer = aTempWriter;
+
+ if (reader != null && writer != null) {
+ injectMethod("registerOreDictionaryEntry");
+ }
+ }
+
+ public boolean isValidTransformer() {
+ return isValid;
+ }
+
+ public ClassReader getReader() {
+ return reader;
+ }
+
+ public ClassWriter getWriter() {
+ return writer;
+ }
+
+ public void injectMethod(String aMethodName) {
+
+ String aItemStack = "net/minecraft/item/ItemStack";
+ MethodVisitor mv;
+ if (aMethodName.equals("registerOreDictionaryEntry")) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] COFH OreDictionaryArbiter Patch",
+ Level.INFO,
+ "Injecting " + aMethodName + " into " + className + ". ItemStack: " + aItemStack);
+ mv = getWriter().visitMethod(
+ ACC_PUBLIC + ACC_STATIC,
+ "registerOreDictionaryEntry",
+ "(L" + aItemStack + ";Ljava/lang/String;)V",
+ null,
+ null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(61, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter$FixCOFH",
+ "registerOreDictionaryEntry",
+ "(L" + aItemStack + ";Ljava/lang/String;)V",
+ false);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLineNumber(62, l1);
+ mv.visitInsn(RETURN);
+ Label l2 = new Label();
+ mv.visitLabel(l2);
+ mv.visitLocalVariable("arg", "L" + aItemStack + ";", null, l0, l2, 0);
+ mv.visitLocalVariable("arg0", "Ljava/lang/String;", null, l0, l2, 1);
+ mv.visitMaxs(2, 2);
+ mv.visitEnd();
+ }
+ FMLRelaunchLog.log("[GT++ ASM] COFH OreDictionaryArbiter Patch", Level.INFO, "Method injection complete.");
+ }
+
+ public static final class localClassVisitor extends ClassVisitor {
+
+ public localClassVisitor(ClassVisitor cv) {
+ super(ASM5, cv);
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ if (name.equals("registerOreDictionaryEntry")) {
+ FMLRelaunchLog.log("[GT++ ASM] COFH OreDictionaryArbiter Patch", Level.INFO, "Removing method " + name);
+ return null;
+ }
+ MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ return methodVisitor;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public static class FixCOFH {
+
+ private static BiMap<String, Integer> oreIDs;
+ private static TMap<Integer, ArrayList<ItemStack>> oreStacks;
+ private static TMap<ItemWrapper, ArrayList<Integer>> stackIDs;
+ private static TMap<ItemWrapper, ArrayList<String>> stackNames;
+
+ static {
+ try {
+ oreIDs = (BiMap<String, Integer>) ReflectionUtils.getField(OreDictionaryArbiter.class, "oreIDs")
+ .get(null);
+ oreStacks = (TMap<Integer, ArrayList<ItemStack>>) ReflectionUtils
+ .getField(OreDictionaryArbiter.class, "oreStacks")
+ .get(null);
+ stackIDs = (TMap<ItemWrapper, ArrayList<Integer>>) ReflectionUtils
+ .getField(OreDictionaryArbiter.class, "stackIDs")
+ .get(null);
+ stackNames = (TMap<ItemWrapper, ArrayList<String>>) ReflectionUtils
+ .getField(OreDictionaryArbiter.class, "stackNames")
+ .get(null);
+ } catch (Throwable t) {
+ oreIDs = HashBiMap.create();
+ oreStacks = new THashMap<>();
+ stackIDs = new THashMap<>();
+ stackNames = new THashMap<>();
+ }
+ }
+
+ public static void registerOreDictionaryEntry(ItemStack arg, String arg0) {
+ try {
+ if (arg == null) {
+ return;
+ }
+ if (arg.getItem() != null && !Strings.isNullOrEmpty(arg0)) {
+ int arg1 = OreDictionary.getOreID(arg0);
+ oreIDs.put(arg0, Integer.valueOf(arg1));
+ if (!oreStacks.containsKey(Integer.valueOf(arg1))) {
+ oreStacks.put(Integer.valueOf(arg1), new ArrayList<>());
+ }
+ ((ArrayList<ItemStack>) oreStacks.get(Integer.valueOf(arg1))).add(arg);
+ ItemWrapper arg2 = ItemWrapper.fromItemStack(arg);
+ if (!stackIDs.containsKey(arg2)) {
+ stackIDs.put(arg2, new ArrayList<>());
+ stackNames.put(arg2, new ArrayList<>());
+ }
+ ((ArrayList<Integer>) stackIDs.get(arg2)).add(Integer.valueOf(arg1));
+ ((ArrayList<String>) stackNames.get(arg2)).add(arg0);
+ }
+ } catch (Throwable t) {
+ return;
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool.java b/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool.java
new file mode 100644
index 0000000000..7aa5ff4f90
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool.java
@@ -0,0 +1,233 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.ALOAD;
+import static org.objectweb.asm.Opcodes.ARETURN;
+import static org.objectweb.asm.Opcodes.ASM5;
+import static org.objectweb.asm.Opcodes.ILOAD;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+import static org.objectweb.asm.Opcodes.IRETURN;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+
+public class ClassTransformer_IC2_GetHarvestTool {
+
+ private final boolean isValid;
+ private final ClassReader reader;
+ private final ClassWriter writer;
+ private final String className;
+
+ private final String aName_getItemDropped;
+ private final String aName_damageDropped;
+
+ public static String getHarvestTool(int aMeta) {
+ return "wrench";
+ }
+
+ public static Item getItemDropped(Block aBlock, int meta, Random random, int fortune) {
+ return Item.getItemFromBlock(aBlock);
+ }
+
+ public static int damageDropped(int aMeta) {
+ return aMeta;
+ }
+
+ public ClassTransformer_IC2_GetHarvestTool(byte[] basicClass, boolean obfuscated, String aClassName) {
+ className = aClassName;
+ ClassReader aTempReader = null;
+ ClassWriter aTempWriter = null;
+
+ aName_getItemDropped = obfuscated ? "func_149650_a" : "getItemDropped";
+ aName_damageDropped = obfuscated ? "func_149692_a" : "damageDropped";
+
+ FMLRelaunchLog.log(
+ "[GT++ ASM] IC2 getHarvestTool Patch",
+ Level.INFO,
+ "Attempting to patch in mode " + className + ". Obfuscated? " + obfuscated);
+
+ aTempReader = new ClassReader(basicClass);
+ aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES);
+ aTempReader.accept(new localClassVisitor(aTempWriter, className), 0);
+
+ if (aTempReader != null && aTempWriter != null) {
+ isValid = true;
+ } else {
+ isValid = false;
+ }
+
+ FMLRelaunchLog.log("[GT++ ASM] IC2 getHarvestTool Patch", Level.INFO, "Valid patch? " + isValid + ".");
+ reader = aTempReader;
+ writer = aTempWriter;
+
+ if (reader != null && writer != null) {
+ FMLRelaunchLog.log("[GT++ ASM] IC2 getHarvestTool Patch", Level.INFO, "Attempting Method Injection.");
+ injectMethod("getHarvestTool");
+ if (aClassName.equals("ic2.core.block.machine.BlockMachine2")
+ || aClassName.equals("ic2.core.block.machine.BlockMachine3")
+ || aClassName.equals("ic2.core.block.wiring.BlockElectric")) {
+ injectMethod(aName_getItemDropped);
+ injectMethod(aName_damageDropped);
+ } else if (aClassName.equals("ic2.core.block.generator.block.BlockGenerator")
+ || aClassName.equals("ic2.core.block.machine.BlockMachine")) {
+ injectMethod(aName_damageDropped);
+ }
+ }
+ }
+
+ public boolean isValidTransformer() {
+ return isValid;
+ }
+
+ public ClassReader getReader() {
+ return reader;
+ }
+
+ public ClassWriter getWriter() {
+ return writer;
+ }
+
+ public boolean injectMethod(String aMethodName) {
+ MethodVisitor mv;
+ boolean didInject = false;
+ String aFormattedClassName = className.replace('.', '/');
+ ClassWriter cw = getWriter();
+
+ FMLRelaunchLog.log("[GT++ ASM] IC2 getHarvestTool Patch", Level.INFO, "Injecting " + aMethodName + ".");
+ if (aMethodName.equals("getHarvestTool")) {
+ mv = getWriter().visitMethod(ACC_PUBLIC, "getHarvestTool", "(I)Ljava/lang/String;", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(63, l0);
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool",
+ "getHarvestTool",
+ "(I)Ljava/lang/String;",
+ false);
+ mv.visitInsn(ARETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("this", "L" + aFormattedClassName + ";", null, l0, l1, 0);
+ mv.visitLocalVariable("aMeta", "I", null, l0, l1, 1);
+ mv.visitMaxs(1, 2);
+ mv.visitEnd();
+ didInject = true;
+ } else if (aMethodName.equals(aName_getItemDropped)) {
+ mv = cw.visitMethod(
+ ACC_PUBLIC,
+ aName_getItemDropped,
+ "(ILjava/util/Random;I)Lnet/minecraft/item/Item;",
+ null,
+ null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(44, l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitVarInsn(ILOAD, 3);
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool",
+ "getItemDropped",
+ "(Lnet/minecraft/block/Block;ILjava/util/Random;I)Lnet/minecraft/item/Item;",
+ false);
+ mv.visitInsn(ARETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("this", "L" + aFormattedClassName + ";", null, l0, l1, 0);
+ mv.visitLocalVariable("meta", "I", null, l0, l1, 1);
+ mv.visitLocalVariable("random", "Ljava/util/Random;", null, l0, l1, 2);
+ mv.visitLocalVariable("fortune", "I", null, l0, l1, 3);
+ mv.visitMaxs(4, 4);
+ mv.visitEnd();
+ didInject = true;
+ } else if (aMethodName.equals(aName_damageDropped)) {
+ mv = cw.visitMethod(ACC_PUBLIC, aName_damageDropped, "(I)I", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(48, l0);
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_GetHarvestTool",
+ "damageDropped",
+ "(I)I",
+ false);
+ mv.visitInsn(IRETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("this", "L" + aFormattedClassName + ";", null, l0, l1, 0);
+ mv.visitLocalVariable("meta", "I", null, l0, l1, 1);
+ mv.visitMaxs(1, 2);
+ mv.visitEnd();
+ didInject = true;
+ }
+ FMLRelaunchLog.log("[GT++ ASM] IC2 getHarvestTool Patch", Level.INFO, "Method injection complete.");
+ return didInject;
+ }
+
+ public final class localClassVisitor extends ClassVisitor {
+
+ String aClassName;
+
+ public localClassVisitor(ClassVisitor cv, String aName) {
+ super(ASM5, cv);
+ aClassName = aName;
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ MethodVisitor methodVisitor;
+ if (aClassName.equals("ic2.core.block.machine.BlockMachine2")
+ || aClassName.equals("ic2.core.block.machine.BlockMachine3")
+ || aClassName.equals("ic2.core.block.wiring.BlockElectric")) {
+ if (name.equals(aName_getItemDropped)) {
+ methodVisitor = null;
+ } else if (name.equals(aName_damageDropped)) {
+ methodVisitor = null;
+ } else if (name.equals("getHarvestTool")) {
+ methodVisitor = null;
+ } else {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ }
+ } else if (aClassName.equals("ic2.core.block.generator.block.BlockGenerator")
+ || aClassName.equals("ic2.core.block.machine.BlockMachine")) {
+ if (name.equals(aName_damageDropped)) {
+ methodVisitor = null;
+ } else if (name.equals("getHarvestTool")) {
+ methodVisitor = null;
+ } else {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ }
+ } else {
+ if (name.equals("getHarvestTool")) {
+ methodVisitor = null;
+ } else {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ }
+ }
+ if (methodVisitor == null) {
+ FMLRelaunchLog
+ .log("[GT++ ASM] IC2 getHarvestTool Patch", Level.INFO, "Found method " + name + ", removing.");
+ }
+ return methodVisitor;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_LWJGL_Keyboard.java b/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_LWJGL_Keyboard.java
new file mode 100644
index 0000000000..4d3c78e6bd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_LWJGL_Keyboard.java
@@ -0,0 +1,297 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.ACC_STATIC;
+import static org.objectweb.asm.Opcodes.ACC_SYNCHRONIZED;
+import static org.objectweb.asm.Opcodes.ARETURN;
+import static org.objectweb.asm.Opcodes.ASM5;
+import static org.objectweb.asm.Opcodes.ILOAD;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.settings.GameSettings;
+import net.minecraft.client.settings.KeyBinding;
+
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class ClassTransformer_LWJGL_Keyboard {
+
+ private final boolean isValid;
+ private final ClassReader reader;
+ private final ClassWriter writer;
+
+ private static final HashMap<String, String> mBadKeyCache = new HashMap<>();
+
+ /**
+ * Gets a key's name
+ *
+ * @param key The key
+ * @return a String with the key's human readable name in it or null if the key is unnamed
+ */
+ public static synchronized String getKeyName(int key) {
+ if (init()) {
+ String[] aTemp = getKeyName();
+ if (key < aTemp.length && key >= 0) {
+ return aTemp[key];
+ }
+ }
+ String aCachedValue = mBadKeyCache.get("key-" + key);
+ if (aCachedValue == null) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Unable to map key code " + key + " to LWJGL keymap.");
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Caching key value to be empty.");
+ // mBadKeyCache.put("key-"+key, getKeyName()[0x00]);
+ aCachedValue = "FIX!";
+ mBadKeyCache.put("key-" + key, aCachedValue);
+ trySetClientKey(key);
+ }
+ return aCachedValue; // Return nothing
+ }
+
+ public static void trySetClientKey(int aKey) {
+ if (Utils.isClient() && ReflectionUtils.doesClassExist("net.minecraft.client.Minecraft")) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Trying to set key value to be empty.");
+ GameSettings options = Minecraft.getMinecraft().gameSettings;
+ KeyBinding[] akeybinding = Minecraft.getMinecraft().gameSettings.keyBindings;
+ int i = akeybinding.length;
+ for (KeyBinding keybinding : akeybinding) {
+ if (keybinding != null && keybinding.getKeyCode() == aKey) {
+ options.setOptionKeyBinding(keybinding, 0);
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Set keybind " + aKey + " to 0.");
+ break;
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("rawtypes")
+ private static Class mKeyboard;
+
+ private static Field mKeyName;
+
+ @SuppressWarnings("rawtypes")
+ private static boolean init() {
+ if (mKeyName != null) {
+ return true;
+ }
+ Class aKeyboard = ReflectionUtils.getClass("org.lwjgl.input.Keyboard");
+ if (aKeyboard != null) {
+ mKeyboard = aKeyboard;
+ Field aKeyName = ReflectionUtils.getField(mKeyboard, "keyName");
+ if (aKeyName != null) {
+ mKeyName = aKeyName;
+ }
+ }
+ return mKeyName != null;
+ }
+
+ private static String[] getKeyName() {
+ if (init()) {
+ try {
+ Object o = mKeyName.get(null);
+ if (o instanceof String[]y) {
+ return y;
+ }
+ } catch (IllegalArgumentException | IllegalAccessException e) {}
+ }
+ return new String[] {};
+ }
+
+ public ClassTransformer_LWJGL_Keyboard(byte[] basicClass, boolean isClientSettings) {
+ ClassReader aTempReader = null;
+ ClassWriter aTempWriter = null;
+ aTempReader = new ClassReader(basicClass);
+ aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES);
+ if (!isClientSettings) {
+ // gtPlusPlus.preloader.keyboard.BetterKeyboard.init();
+ aTempReader.accept(new PatchLWJGL(aTempWriter), 0);
+ injectLWJGLPatch(aTempWriter);
+ } else {
+ // gtPlusPlus.preloader.keyboard.BetterKeyboard.init();
+ aTempReader.accept(new PatchClientSettings(aTempWriter), 0);
+ injectClientSettingPatch(aTempWriter);
+ }
+ if (aTempReader != null && aTempWriter != null) {
+ isValid = true;
+ } else {
+ isValid = false;
+ }
+ FMLRelaunchLog
+ .log("[GT++ ASM] LWJGL Keybinding index out of bounds fix", Level.INFO, "Valid? " + isValid + ".");
+ reader = aTempReader;
+ writer = aTempWriter;
+ }
+
+ public boolean isValidTransformer() {
+ return isValid;
+ }
+
+ public ClassReader getReader() {
+ return reader;
+ }
+
+ public ClassWriter getWriter() {
+ return writer;
+ }
+
+ private boolean isClientSettingsObfuscated = false;
+
+ public boolean injectLWJGLPatch(ClassWriter cw) {
+ MethodVisitor mv;
+ boolean didInject = false;
+ FMLRelaunchLog
+ .log("[GT++ ASM] LWJGL Keybinding index out of bounds fix", Level.INFO, "Injecting " + "getKeyName" + ".");
+ mv = cw
+ .visitMethod(ACC_PUBLIC + ACC_STATIC + ACC_SYNCHRONIZED, "getKeyName", "(I)Ljava/lang/String;", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(49, l0);
+ mv.visitVarInsn(ILOAD, 0);
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/asm/transformers/ClassTransformer_LWJGL_Keyboard",
+ "getKeyName",
+ "(I)Ljava/lang/String;",
+ false);
+ mv.visitInsn(ARETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("key", "I", null, l0, l1, 0);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ didInject = true;
+
+ FMLRelaunchLog
+ .log("[GT++ ASM] LWJGL Keybinding index out of bounds fix", Level.INFO, "Method injection complete.");
+ return didInject;
+ }
+
+ public boolean injectClientSettingPatch(ClassWriter cw) {
+ MethodVisitor mv;
+ boolean didInject = false;
+ String aMethodName = this.isClientSettingsObfuscated ? "func_74298_c" : "getKeyDisplayString";
+ FMLRelaunchLog
+ .log("[GT++ ASM] LWJGL Keybinding index out of bounds fix", Level.INFO, "Injecting " + aMethodName + ".");
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, aMethodName, "(I)Ljava/lang/String;", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(130, l0);
+ mv.visitVarInsn(ILOAD, 0);
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/keyboard/BetterKeyboard",
+ "getKeyDisplayString",
+ "(I)Ljava/lang/String;",
+ false);
+ mv.visitInsn(ARETURN);
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitLocalVariable("p_74298_0_", "I", null, l0, l1, 0);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ didInject = true;
+ FMLRelaunchLog
+ .log("[GT++ ASM] LWJGL Keybinding index out of bounds fix", Level.INFO, "Method injection complete.");
+ return didInject;
+ }
+
+ public class PatchClientSettings extends ClassVisitor {
+
+ public PatchClientSettings(ClassVisitor cv) {
+ super(ASM5, cv);
+ this.cv = cv;
+ }
+
+ private final String[] aMethodsToStrip = new String[] { "func_74298_c", "getKeyDisplayString" };
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ MethodVisitor methodVisitor;
+ boolean found = false;
+
+ for (String s : aMethodsToStrip) {
+ if (name.equals(s)) {
+ if (name.equals(aMethodsToStrip[0])) {
+ isClientSettingsObfuscated = true;
+ } else {
+ isClientSettingsObfuscated = false;
+ }
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ } else {
+ methodVisitor = null;
+ }
+ if (found) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Found method " + name + ", removing.");
+ }
+ return methodVisitor;
+ }
+ }
+
+ public class PatchLWJGL extends ClassVisitor {
+
+ public PatchLWJGL(ClassVisitor cv) {
+ super(ASM5, cv);
+ this.cv = cv;
+ }
+
+ private final String[] aMethodsToStrip = new String[] { "getKeyName" };
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ MethodVisitor methodVisitor;
+ boolean found = false;
+
+ for (String s : aMethodsToStrip) {
+ if (name.equals(s)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ } else {
+ methodVisitor = null;
+ }
+ if (found) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Found method " + name + ", removing.");
+ }
+ return methodVisitor;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_TC_ItemWispEssence.java b/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_TC_ItemWispEssence.java
new file mode 100644
index 0000000000..cf8b08d40c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_TC_ItemWispEssence.java
@@ -0,0 +1,317 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.AALOAD;
+import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.ACONST_NULL;
+import static org.objectweb.asm.Opcodes.ALOAD;
+import static org.objectweb.asm.Opcodes.ARETURN;
+import static org.objectweb.asm.Opcodes.ARRAYLENGTH;
+import static org.objectweb.asm.Opcodes.ASM5;
+import static org.objectweb.asm.Opcodes.ASTORE;
+import static org.objectweb.asm.Opcodes.DUP;
+import static org.objectweb.asm.Opcodes.F_APPEND;
+import static org.objectweb.asm.Opcodes.F_CHOP;
+import static org.objectweb.asm.Opcodes.F_SAME;
+import static org.objectweb.asm.Opcodes.F_SAME1;
+import static org.objectweb.asm.Opcodes.GETSTATIC;
+import static org.objectweb.asm.Opcodes.GOTO;
+import static org.objectweb.asm.Opcodes.I2L;
+import static org.objectweb.asm.Opcodes.ICONST_0;
+import static org.objectweb.asm.Opcodes.IFEQ;
+import static org.objectweb.asm.Opcodes.IFLE;
+import static org.objectweb.asm.Opcodes.IFNONNULL;
+import static org.objectweb.asm.Opcodes.IFNULL;
+import static org.objectweb.asm.Opcodes.ILOAD;
+import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
+import static org.objectweb.asm.Opcodes.IRETURN;
+import static org.objectweb.asm.Opcodes.ISTORE;
+import static org.objectweb.asm.Opcodes.L2I;
+import static org.objectweb.asm.Opcodes.LDIV;
+import static org.objectweb.asm.Opcodes.LREM;
+import static org.objectweb.asm.Opcodes.NEW;
+
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+
+public class ClassTransformer_TC_ItemWispEssence {
+
+ private final boolean isValid;
+ private final ClassReader reader;
+ private final ClassWriter writer;
+
+ public ClassTransformer_TC_ItemWispEssence(byte[] basicClass, boolean obfuscated2) {
+ ClassReader aTempReader = null;
+ ClassWriter aTempWriter = null;
+ FMLRelaunchLog.log(
+ "[GT++ ASM] Thaumcraft WispEssence_Patch",
+ Level.INFO,
+ "Are we patching obfuscated methods? " + obfuscated2);
+ String aGetColour = obfuscated2 ? "func_82790_a" : "getColorFromItemStack";
+ aTempReader = new ClassReader(basicClass);
+ aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES);
+ aTempReader.accept(new AddAdapter(aTempWriter, new String[] { "getAspects", aGetColour }), 0);
+ injectMethod("getAspects", aTempWriter, obfuscated2);
+ injectMethod(aGetColour, aTempWriter, obfuscated2);
+ if (aTempReader != null && aTempWriter != null) {
+ isValid = true;
+ } else {
+ isValid = false;
+ }
+ FMLRelaunchLog.log("[GT++ ASM] Thaumcraft WispEssence_Patch", Level.INFO, "Valid? " + isValid + ".");
+ reader = aTempReader;
+ writer = aTempWriter;
+ }
+
+ public boolean isValidTransformer() {
+ return isValid;
+ }
+
+ public ClassReader getReader() {
+ return reader;
+ }
+
+ public ClassWriter getWriter() {
+ return writer;
+ }
+
+ public boolean injectMethod(String aMethodName, ClassWriter cw, boolean obfuscated) {
+ MethodVisitor mv;
+ boolean didInject = false;
+ FMLRelaunchLog.log("[GT++ ASM] Thaumcraft WispEssence_Patch", Level.INFO, "Injecting " + aMethodName + ".");
+
+ String aGetColour = obfuscated ? "func_82790_a" : "getColorFromItemStack";
+ String aHasTagCompound = obfuscated ? "func_77942_o" : "hasTagCompound";
+ String aGetTagCompound = obfuscated ? "func_77978_p" : "getTagCompound";
+
+ if (aMethodName.equals("getAspects")) {
+ mv = cw.visitMethod(
+ ACC_PUBLIC,
+ "getAspects",
+ "(Lnet/minecraft/item/ItemStack;)Lthaumcraft/api/aspects/AspectList;",
+ null,
+ null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(141, l0);
+ mv.visitVarInsn(ALOAD, 1);
+ Label l1 = new Label();
+ mv.visitJumpInsn(IFNONNULL, l1);
+ Label l2 = new Label();
+ mv.visitLabel(l2);
+ mv.visitLineNumber(142, l2);
+ mv.visitInsn(ACONST_NULL);
+ mv.visitInsn(ARETURN);
+ mv.visitLabel(l1);
+ mv.visitLineNumber(144, l1);
+ mv.visitFrame(F_SAME, 0, null, 0, null);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/item/ItemStack", aHasTagCompound, "()Z", false);
+ Label l3 = new Label();
+ mv.visitJumpInsn(IFEQ, l3);
+ Label l4 = new Label();
+ mv.visitLabel(l4);
+ mv.visitLineNumber(145, l4);
+ mv.visitTypeInsn(NEW, "thaumcraft/api/aspects/AspectList");
+ mv.visitInsn(DUP);
+ mv.visitMethodInsn(INVOKESPECIAL, "thaumcraft/api/aspects/AspectList", "<init>", "()V", false);
+ mv.visitVarInsn(ASTORE, 2);
+ Label l5 = new Label();
+ mv.visitLabel(l5);
+ mv.visitLineNumber(146, l5);
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "net/minecraft/item/ItemStack",
+ aGetTagCompound,
+ "()Lnet/minecraft/nbt/NBTTagCompound;",
+ false);
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "thaumcraft/api/aspects/AspectList",
+ "readFromNBT",
+ "(Lnet/minecraft/nbt/NBTTagCompound;)V",
+ false);
+ Label l6 = new Label();
+ mv.visitLabel(l6);
+ mv.visitLineNumber(147, l6);
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "thaumcraft/api/aspects/AspectList", "size", "()I", false);
+ Label l7 = new Label();
+ mv.visitJumpInsn(IFLE, l7);
+ mv.visitVarInsn(ALOAD, 2);
+ Label l8 = new Label();
+ mv.visitJumpInsn(GOTO, l8);
+ mv.visitLabel(l7);
+ mv.visitFrame(F_APPEND, 1, new Object[] { "thaumcraft/api/aspects/AspectList" }, 0, null);
+ mv.visitInsn(ACONST_NULL);
+ mv.visitLabel(l8);
+ mv.visitFrame(F_SAME1, 0, null, 1, new Object[] { "thaumcraft/api/aspects/AspectList" });
+ mv.visitInsn(ARETURN);
+ mv.visitLabel(l3);
+ mv.visitLineNumber(149, l3);
+ mv.visitFrame(F_CHOP, 1, null, 0, null);
+ mv.visitInsn(ACONST_NULL);
+ mv.visitInsn(ARETURN);
+ Label l9 = new Label();
+ mv.visitLabel(l9);
+ mv.visitLocalVariable(
+ "this",
+ "LgtPlusPlus/preloader/asm/transformers/ClassTransformer_TC_ItemWispEssence;",
+ null,
+ l0,
+ l9,
+ 0);
+ mv.visitLocalVariable("itemstack", "Lnet/minecraft/item/ItemStack;", null, l0, l9, 1);
+ mv.visitLocalVariable("aspects", "Lthaumcraft/api/aspects/AspectList;", null, l5, l3, 2);
+ mv.visitMaxs(2, 3);
+ mv.visitEnd();
+ didInject = true;
+ } else if (aMethodName.equals(aGetColour)) {
+
+ // thaumcraft/common/items/ItemWispEssence
+ mv = cw.visitMethod(ACC_PUBLIC, aGetColour, "(Lnet/minecraft/item/ItemStack;I)I", null, null);
+ AnnotationVisitor av0;
+ {
+ av0 = mv.visitAnnotation("Lcpw/mods/fml/relauncher/SideOnly;", true);
+ av0.visitEnum("value", "Lcpw/mods/fml/relauncher/Side;", "CLIENT");
+ av0.visitEnd();
+ }
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(197, l0);
+ mv.visitVarInsn(ALOAD, 1);
+ Label l1 = new Label();
+ mv.visitJumpInsn(IFNONNULL, l1);
+ Label l2 = new Label();
+ mv.visitLabel(l2);
+ mv.visitLineNumber(198, l2);
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(IRETURN);
+ mv.visitLabel(l1);
+ mv.visitLineNumber(200, l1);
+ mv.visitFrame(F_SAME, 0, null, 0, null);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "thaumcraft/common/items/ItemWispEssence",
+ "getAspects",
+ "(Lnet/minecraft/item/ItemStack;)Lthaumcraft/api/aspects/AspectList;",
+ false);
+ Label l3 = new Label();
+ mv.visitJumpInsn(IFNULL, l3);
+ Label l4 = new Label();
+ mv.visitLabel(l4);
+ mv.visitLineNumber(201, l4);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "thaumcraft/common/items/ItemWispEssence",
+ "getAspects",
+ "(Lnet/minecraft/item/ItemStack;)Lthaumcraft/api/aspects/AspectList;",
+ false);
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "thaumcraft/api/aspects/AspectList",
+ "getAspects",
+ "()[Lthaumcraft/api/aspects/Aspect;",
+ false);
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(AALOAD);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "thaumcraft/api/aspects/Aspect", "getColor", "()I", false);
+ mv.visitInsn(IRETURN);
+ mv.visitLabel(l3);
+ mv.visitLineNumber(203, l3);
+ mv.visitFrame(F_SAME, 0, null, 0, null);
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J", false);
+ mv.visitLdcInsn(new Long(500L));
+ mv.visitInsn(LDIV);
+ mv.visitFieldInsn(
+ GETSTATIC,
+ "thaumcraft/common/items/ItemWispEssence",
+ "displayAspects",
+ "[Lthaumcraft/api/aspects/Aspect;");
+ mv.visitInsn(ARRAYLENGTH);
+ mv.visitInsn(I2L);
+ mv.visitInsn(LREM);
+ mv.visitInsn(L2I);
+ mv.visitVarInsn(ISTORE, 3);
+ Label l5 = new Label();
+ mv.visitLabel(l5);
+ mv.visitLineNumber(204, l5);
+ mv.visitFieldInsn(
+ GETSTATIC,
+ "thaumcraft/common/items/ItemWispEssence",
+ "displayAspects",
+ "[Lthaumcraft/api/aspects/Aspect;");
+ mv.visitVarInsn(ILOAD, 3);
+ mv.visitInsn(AALOAD);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "thaumcraft/api/aspects/Aspect", "getColor", "()I", false);
+ mv.visitInsn(IRETURN);
+ Label l6 = new Label();
+ mv.visitLabel(l6);
+ mv.visitLocalVariable("this", "Lthaumcraft/common/items/ItemWispEssence;", null, l0, l6, 0);
+ mv.visitLocalVariable("stack", "Lnet/minecraft/item/ItemStack;", null, l0, l6, 1);
+ mv.visitLocalVariable("par2", "I", null, l0, l6, 2);
+ mv.visitLocalVariable("idx", "I", null, l5, l6, 3);
+ mv.visitMaxs(4, 4);
+ mv.visitEnd();
+ didInject = true;
+ }
+
+ FMLRelaunchLog.log(
+ "[GT++ ASM] Thaumcraft WispEssence_Patch",
+ Level.INFO,
+ "Method injection complete. " + (obfuscated ? "Obfuscated" : "Non-Obfuscated"));
+ return didInject;
+ }
+
+ public class AddAdapter extends ClassVisitor {
+
+ public AddAdapter(ClassVisitor cv, String[] aMethods) {
+ super(ASM5, cv);
+ this.cv = cv;
+ this.aMethodsToStrip = aMethods;
+ }
+
+ private final String[] aMethodsToStrip;
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+
+ MethodVisitor methodVisitor;
+ boolean found = false;
+
+ for (String s : aMethodsToStrip) {
+ if (name.equals(s)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ } else {
+ methodVisitor = null;
+ }
+
+ if (found) {
+ FMLRelaunchLog
+ .log("[GT++ ASM] Thaumcraft WispEssence_Patch", Level.INFO, "Found method " + name + ", removing.");
+ }
+ return methodVisitor;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java b/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java
new file mode 100644
index 0000000000..82526b1290
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_ClassTransformer.java
@@ -0,0 +1,79 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.ALOAD;
+import static org.objectweb.asm.Opcodes.ASM5;
+import static org.objectweb.asm.Opcodes.IFEQ;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+import static org.objectweb.asm.Opcodes.RETURN;
+
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+
+public class Preloader_ClassTransformer {
+
+ public static final class OreDictionaryVisitor extends ClassVisitor {
+
+ public OreDictionaryVisitor(ClassVisitor cv) {
+ super(ASM5, cv);
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ if (name.equals("registerOreImpl") && desc.equals("(Ljava/lang/String;Lnet/minecraft/item/ItemStack;)V")) {
+ FMLRelaunchLog.log("[GT++ ASM] OreDictTransformer", Level.INFO, "Found target method. [Unobfuscated]");
+ return new RegisterOreImplVisitor(methodVisitor, false);
+ } else if (name.equals("registerOreImpl") && desc.equals("(Ljava/lang/String;Ladd;)V")) {
+ FMLRelaunchLog.log("[GT++ ASM] OreDictTransformer", Level.INFO, "Found target method. [Obfuscated]");
+ return new RegisterOreImplVisitor(methodVisitor, true);
+ }
+ return methodVisitor;
+ }
+ }
+
+ private static final class RegisterOreImplVisitor extends MethodVisitor {
+
+ private final boolean mObfuscated;
+
+ public RegisterOreImplVisitor(MethodVisitor mv, boolean obfuscated) {
+ super(ASM5, mv);
+ this.mObfuscated = obfuscated;
+ }
+
+ @Override
+ public void visitCode() {
+ FMLRelaunchLog
+ .log("[GT++ ASM] OreDictTransformer", Level.INFO, "Fixing Forge's poor attempt at an oreDictionary.");
+ super.visitCode();
+ super.visitVarInsn(ALOAD, 0);
+ super.visitVarInsn(ALOAD, 1);
+ if (!mObfuscated) {
+ FMLRelaunchLog
+ .log("[GT++ ASM] OreDictTransformer", Level.INFO, "Injecting target method. [Unobfuscated]");
+ super.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/Preloader_GT_OreDict",
+ "shouldPreventRegistration",
+ "(Ljava/lang/String;Lnet/minecraft/item/ItemStack;)Z",
+ false);
+ } else {
+ FMLRelaunchLog
+ .log("[GT++ ASM] OreDictTransformer", Level.INFO, "Injecting target method. [Obfuscated]");
+ super.visitMethodInsn(
+ INVOKESTATIC,
+ "gtPlusPlus/preloader/Preloader_GT_OreDict",
+ "shouldPreventRegistration",
+ "(Ljava/lang/String;Ladd;)Z",
+ false);
+ }
+ Label endLabel = new Label();
+ super.visitJumpInsn(IFEQ, endLabel);
+ super.visitInsn(RETURN);
+ super.visitLabel(endLabel);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java b/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
new file mode 100644
index 0000000000..922ce88e27
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.launchwrapper.IClassTransformer;
+
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassWriter;
+
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.preloader.Preloader_Logger;
+import gtPlusPlus.preloader.asm.AsmConfig;
+import gtPlusPlus.preloader.asm.transformers.Preloader_ClassTransformer.OreDictionaryVisitor;
+
+public class Preloader_Transformer_Handler implements IClassTransformer {
+
+ private static final Set<String> IC2_WRENCH_PATCH_CLASS_NAMES = new HashSet<>();
+ private static final String LWJGL_KEYBOARD = "org.lwjgl.input.Keyboard";
+ private static final String MINECRAFT_GAMESETTINGS = "net.minecraft.client.settings.GameSettings";
+ private static final String FORGE_CHUNK_MANAGER = "net.minecraftforge.common.ForgeChunkManager";
+ private static final String FORGE_ORE_DICTIONARY = "net.minecraftforge.oredict.OreDictionary";
+ private static final String COFH_ORE_DICTIONARY_ARBITER = "cofh.core.util.oredict.OreDictionaryArbiter";
+ private static final String THAUMCRAFT_ITEM_WISP_ESSENCE = "thaumcraft.common.items.ItemWispEssence";
+
+ static {
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.BlockTileEntity");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.machine.BlockMachine");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.machine.BlockMachine2");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.machine.BlockMachine3");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.kineticgenerator.block.BlockKineticGenerator");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.heatgenerator.block.BlockHeatGenerator");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.generator.block.BlockGenerator");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.reactor.block.BlockReactorAccessHatch");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.reactor.block.BlockReactorChamber");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.reactor.block.BlockReactorFluidPort");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.reactor.block.BlockReactorRedstonePort");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.reactor.block.BlockReactorVessel");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.personal.BlockPersonal.class");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.wiring.BlockChargepad.class");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.wiring.BlockElectric.class");
+ IC2_WRENCH_PATCH_CLASS_NAMES.add("ic2.core.block.wiring.BlockLuminator.class");
+ }
+
+ @Override
+ public byte[] transform(String name, String transformedName, byte[] basicClass) {
+ // Fix LWJGL index array out of bounds on keybinding IDs
+ if ((transformedName.equals(LWJGL_KEYBOARD) || transformedName.equals(MINECRAFT_GAMESETTINGS))
+ && AsmConfig.enabledLwjglKeybindingFix
+ // Do not transform if using lwjgl3
+ && !ReflectionUtils.doesClassExist("org.lwjgl.system.Platform")) {
+ boolean isClientSettingsClass = !transformedName.equals("org.lwjgl.input.Keyboard");
+ Preloader_Logger.INFO("LWJGL Keybinding index out of bounds fix", "Transforming " + transformedName);
+ return new ClassTransformer_LWJGL_Keyboard(basicClass, isClientSettingsClass).getWriter()
+ .toByteArray();
+ }
+
+ // Fix the OreDictionary - Forge
+ if (transformedName.equals(FORGE_ORE_DICTIONARY) && AsmConfig.enableOreDictPatch) {
+ Preloader_Logger.INFO("OreDictTransformer", "Transforming " + transformedName);
+ ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
+ new ClassReader(basicClass).accept(new OreDictionaryVisitor(classWriter), 0);
+ return classWriter.toByteArray();
+ }
+
+ // Fix the OreDictionary COFH
+ if (transformedName.equals(COFH_ORE_DICTIONARY_ARBITER)
+ && (AsmConfig.enableCofhPatch || CORE_Preloader.DEV_ENVIRONMENT)) {
+ Preloader_Logger.INFO("COFH", "Transforming " + transformedName);
+ return new ClassTransformer_COFH_OreDictionaryArbiter(basicClass).getWriter()
+ .toByteArray();
+ }
+
+ if (IC2_WRENCH_PATCH_CLASS_NAMES.contains(transformedName)) {
+ Preloader_Logger.INFO("IC2 getHarvestTool Patch", "Transforming " + transformedName);
+ return new ClassTransformer_IC2_GetHarvestTool(basicClass, !CORE_Preloader.DEV_ENVIRONMENT, transformedName)
+ .getWriter()
+ .toByteArray();
+ }
+
+ // Fix Thaumcraft stuff
+ // Patching ItemWispEssence to allow invalid item handling
+ if (transformedName.equals(THAUMCRAFT_ITEM_WISP_ESSENCE) && AsmConfig.enableTcAspectSafety) {
+ Preloader_Logger.INFO("Thaumcraft WispEssence_Patch", "Transforming " + transformedName);
+ return new ClassTransformer_TC_ItemWispEssence(basicClass, !CORE_Preloader.DEV_ENVIRONMENT).getWriter()
+ .toByteArray();
+ }
+
+ return basicClass;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/preloader/keyboard/BetterKeyboard.java b/gtpp/src/main/java/gtPlusPlus/preloader/keyboard/BetterKeyboard.java
new file mode 100644
index 0000000000..510689911c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/preloader/keyboard/BetterKeyboard.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2002-2008 LWJGL Project All rights reserved. Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following conditions are met: * Redistributions of source code
+ * must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in
+ * binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution. * Neither the name of 'LWJGL' nor the names of
+ * its contributors may be used to endorse or promote products derived from this software without specific prior written
+ * permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package gtPlusPlus.preloader.keyboard;
+
+import java.lang.reflect.Field;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.client.resources.I18n;
+
+import org.apache.logging.log4j.Level;
+import org.lwjgl.BufferUtils;
+import org.lwjgl.input.Keyboard;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.asm.transformers.ClassTransformer_LWJGL_Keyboard;
+
+/**
+ * <br>
+ * A raw Keyboard interface. This can be used to poll the current state of the keys, or read all the keyboard presses /
+ * releases since the last read.
+ *
+ * DO NOT REMOVE. CALLED BY ASM CODE.
+ *
+ * @author cix_foo <cix_foo@users.sourceforge.net>
+ * @author elias_naur <elias_naur@users.sourceforge.net>
+ * @author Brian Matzon <brian@matzon.dk>
+ * @version $Revision$ $Id$
+ */
+@SuppressWarnings("unused")
+public class BetterKeyboard {
+
+ public static final int KEYBOARD_SIZE = Short.MAX_VALUE;
+
+ private static boolean init = false;
+
+ public static void init() {
+ if (!init) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Trying to patch out LWJGL internal arrays with larger ones.");
+ Field aKeyNameSize = ReflectionUtils.getField(Keyboard.class, "keyName");
+ Field aKeyMapSize = ReflectionUtils.getField(Keyboard.class, "keyMap");
+ Field aKeyDownBuffer = ReflectionUtils.getField(Keyboard.class, "keyDownBuffer");
+ String[] aOldKeyNameArray = ReflectionUtils.getFieldValue(aKeyNameSize);
+ if (aOldKeyNameArray != null && aOldKeyNameArray.length < Short.MAX_VALUE) {
+ String[] aNewKeyNameArray = new String[Short.MAX_VALUE];
+ for (int i = 0; i < aOldKeyNameArray.length; i++) {
+ aNewKeyNameArray[i] = aOldKeyNameArray[i];
+ }
+ try {
+ ReflectionUtils.setFinalFieldValue(Keyboard.class, aKeyNameSize.getName(), aNewKeyNameArray);
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Patched Field: " + aKeyNameSize.getName());
+ } catch (Throwable t) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Failed Patching Field: " + aKeyDownBuffer.getName());
+ }
+ }
+ Map<String, Integer> aOldKeyMapArray = ReflectionUtils.getFieldValue(aKeyMapSize);
+ if (aOldKeyNameArray != null && aOldKeyMapArray.size() < Short.MAX_VALUE) {
+ Map<String, Integer> aNewKeyMapArray = new HashMap<String, Integer>(Short.MAX_VALUE);
+ aNewKeyMapArray.putAll(aOldKeyMapArray);
+ try {
+ ReflectionUtils.setFinalFieldValue(Keyboard.class, aKeyMapSize.getName(), aNewKeyMapArray);
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Patched Field: " + aKeyMapSize.getName());
+ } catch (Throwable t) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Failed Patching Field: " + aKeyDownBuffer.getName());
+ }
+ }
+ ByteBuffer aOldByteBuffer = ReflectionUtils.getFieldValue(aKeyDownBuffer);
+ if (aOldByteBuffer != null && aOldByteBuffer.capacity() == Keyboard.KEYBOARD_SIZE) {
+ ByteBuffer aNewByteBuffer = BufferUtils.createByteBuffer(Short.MAX_VALUE);
+ try {
+ ReflectionUtils.setFinalFieldValue(Keyboard.class, aKeyDownBuffer.getName(), aNewByteBuffer);
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Patched Field: " + aKeyDownBuffer.getName());
+ } catch (Throwable t) {
+ FMLRelaunchLog.log(
+ "[GT++ ASM] LWJGL Keybinding index out of bounds fix",
+ Level.INFO,
+ "Failed Patching Field: " + aKeyDownBuffer.getName());
+ }
+ }
+ init = true;
+ }
+ }
+
+ /**
+ * Gets a key's name
+ *
+ * @param key The key
+ * @return a String with the key's human readable name in it or null if the key is unnamed
+ */
+ public static synchronized String getKeyName(int key) {
+ return ClassTransformer_LWJGL_Keyboard.getKeyName(key);
+ }
+
+ /**
+ * Represents a key or mouse button as a string. Args: key
+ */
+ public static String getKeyDisplayString(int aKeyValue) {
+ return aKeyValue < 0 ? I18n.format("key.mouseButton", new Object[] { Integer.valueOf(aKeyValue + 101) })
+ : getKeyName(aKeyValue);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/recipes/CokeAndPyrolyseOven.java b/gtpp/src/main/java/gtPlusPlus/recipes/CokeAndPyrolyseOven.java
new file mode 100644
index 0000000000..347010f71b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/recipes/CokeAndPyrolyseOven.java
@@ -0,0 +1,73 @@
+package gtPlusPlus.recipes;
+
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.AddGregtechRecipe;
+
+public class CokeAndPyrolyseOven {
+
+ public static void onLoadComplete() {
+ convertPyroToCokeOven();
+ }
+
+ public static void postInit() {
+ Logger.INFO("Loading Recipes for Industrial Coking Oven.");
+ // Wood to Charcoal
+ // Try use all woods found
+ ArrayList<ItemStack> aLogData = OreDictionary.getOres("logWood");
+ for (ItemStack stack : aLogData) {
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ ItemUtils.getSimpleStack(stack, 20),
+ 20,
+ GT_ModHandler.getSteam(1000),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Charcoal, 24L),
+ FluidUtils.getFluidStack("fluid.coalgas", 1440),
+ 60,
+ 30);
+ }
+
+ // Coal to Coke
+ AddGregtechRecipe.addCokeAndPyrolyseRecipes(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 16L),
+ 22,
+ GT_ModHandler.getSteam(1000),
+ ItemUtils.getItemStackOfAmountFromOreDict("fuelCoke", 10),
+ FluidUtils.getFluidStack("fluid.coalgas", 2880),
+ 30,
+ 120);
+
+ // Coke & Coal
+ CORE.RA.addCokeOvenRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 12L),
+ ItemUtils.getItemStackOfAmountFromOreDict("fuelCoke", 6),
+ GT_ModHandler.getSteam(2000),
+ FluidUtils.getFluidStack("fluid.coalgas", 5040),
+ ItemUtils.getItemStackOfAmountFromOreDict("fuelCoke", 14),
+ 60 * 20,
+ 240);
+
+ }
+
+ private static void convertPyroToCokeOven() {
+ int aCount = 0;
+ for (GT_Recipe g : RecipeMaps.pyrolyseRecipes.getAllRecipes()) {
+ if (AddGregtechRecipe.importPyroRecipe(g)) {
+ aCount++;
+ }
+ }
+ Logger.INFO("Converted " + aCount + " Pyrolyse recipes into Industrial Coke Oven recipes.");
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/recipes/RecipeRemovals.java b/gtpp/src/main/java/gtPlusPlus/recipes/RecipeRemovals.java
new file mode 100644
index 0000000000..4462f81fc7
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/recipes/RecipeRemovals.java
@@ -0,0 +1,107 @@
+package gtPlusPlus.recipes;
+
+import static gtPlusPlus.core.util.minecraft.MaterialUtils.getMaterialName;
+
+import java.util.Collection;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import advsolar.common.AdvancedSolarPanel;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Mods;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Recipe;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class RecipeRemovals {
+
+ public static void postInit() {
+ if (Mods.AdvancedSolarPanel.isModLoaded()) {
+ RecipeUtils.removeRecipeByOutput(ItemUtils.getSimpleStack(AdvancedSolarPanel.blockMolecularTransformer));
+ }
+ }
+
+ public static void onLoadComplete() {
+ removeCrudeTurbineRotors();
+ }
+
+ // Doesn't actually remove recipes, just hide them
+ private static void removeCrudeTurbineRotors() {
+ int aRemoved = 0;
+ int CUT = CORE.turbineCutoffBase;
+ Item aU;
+ Collection<GT_Recipe> aAssRecipes = RecipeMaps.assemblerRecipes.getAllRecipes();
+ // 170, 172, 174, 176
+ if (aAssRecipes.size() > 0) {
+ for (GT_Recipe aG : aAssRecipes) {
+ if (ArrayUtils.isNotEmpty(aG.mOutputs)) {
+ for (ItemStack aI : aG.mOutputs) {
+ if (aI == null) {
+ continue;
+ }
+ aU = aI.getItem();
+ if (aU == null) {
+ continue;
+ }
+ if (aU instanceof GT_MetaGenerated_Tool_01) {
+ int aMeta = aI.getItemDamage();
+ // Found a Turbine
+ if (aMeta >= 170 && aMeta <= 176) {
+ int aCutoff;
+ String aType;
+ switch (aMeta) {
+ case 170 -> {
+ aCutoff = CUT;
+ aType = "Small ";
+ }
+ case 172 -> {
+ aCutoff = 2 * CUT;
+ aType = "";
+ }
+ case 174 -> {
+ aCutoff = 3 * CUT;
+ aType = "Large ";
+ }
+ default -> { // 176
+ aCutoff = 4 * CUT;
+ aType = "Huge ";
+ }
+ }
+ Materials aMainMaterial = GT_MetaGenerated_Tool.getPrimaryMaterial(aI);
+ Materials aSecondaryMaterial = GT_MetaGenerated_Tool.getSecondaryMaterial(aI);
+ long rotorDurabilityMax = GT_MetaGenerated_Tool.getToolMaxDamage(aI);
+ if (rotorDurabilityMax < aCutoff) {
+ Logger.WARNING(
+ "[Turbine Cleanup] " + getMaterialName(aMainMaterial)
+ + " "
+ + aType
+ + "Turbines have "
+ + rotorDurabilityMax
+ + ", which is below the cutoff durability of "
+ + aCutoff
+ + ", disabling.");
+ aG.mEnabled = false;
+ aG.mHidden = true;
+ aG.mCanBeBuffered = false;
+ aRemoved++;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ Logger.INFO("Removed " + aRemoved + " useless Turbines.");
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/HANDLER_CropsPlusPlus.java b/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/HANDLER_CropsPlusPlus.java
new file mode 100644
index 0000000000..9ca5488280
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/HANDLER_CropsPlusPlus.java
@@ -0,0 +1,16 @@
+package gtPlusPlus.xmod.bartcrops;
+
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+
+public class HANDLER_CropsPlusPlus {
+
+ public static void preInit(FMLPreInitializationEvent preinit) {
+ LoaderOfTheCrops.load(preinit);
+ }
+
+ public static void postInit(FMLPostInitializationEvent postinit) {
+ LoaderOfTheCrops.register();
+ LoaderOfTheCrops.registerBaseSeed();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/LoaderOfTheCrops.java b/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/LoaderOfTheCrops.java
new file mode 100644
index 0000000000..c3c2f0b6cc
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/LoaderOfTheCrops.java
@@ -0,0 +1,109 @@
+package gtPlusPlus.xmod.bartcrops;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.bartcrops.crops.Crop_Hemp;
+import ic2.api.crops.CropCard;
+import ic2.api.crops.Crops;
+
+/**
+ * Mostly borrowed from the Crops++ Crop Loader.
+ *
+ * @author Alkalus
+ */
+public class LoaderOfTheCrops {
+
+ private static List<Boolean> mHasCropObj = new ArrayList<>();
+ private CropCard mCropObj;
+ private ItemStack mBaseSeed;
+ private static List<LoaderOfTheCrops> mCropList = cropLoader();
+
+ public LoaderOfTheCrops(CropCard cropObj) {
+ this.mCropObj = cropObj;
+ }
+
+ public LoaderOfTheCrops(CropCard cropObj, ItemStack baseseed) {
+ this.mCropObj = cropObj;
+ this.mBaseSeed = baseseed;
+ }
+
+ public static CropCard cropUnpackerCC(LoaderOfTheCrops inp) {
+ return inp.mCropObj;
+ }
+
+ private static ItemStack cropUnpackerCG(LoaderOfTheCrops inp) {
+ return inp.mBaseSeed;
+ }
+
+ private static LoaderOfTheCrops cropHelper(CropCard cropObj) {
+ return new LoaderOfTheCrops(cropObj, ItemUtils.getItemStackOfAmountFromOreDict("crop" + cropObj.name(), 0));
+ }
+
+ public static List<LoaderOfTheCrops> cropLoader() {
+ List<LoaderOfTheCrops> p = new ArrayList<>();
+
+ p.add(new LoaderOfTheCrops(new Crop_Hemp(), new ItemStack(Item.getItemById(111), 3)));
+
+ return p;
+ }
+
+ private static List<CropCard> cropObjs() {
+ List<CropCard> p = new ArrayList<>();
+
+ for (LoaderOfTheCrops loaderOfTheCrops : mCropList) {
+ p.add(cropUnpackerCC((LoaderOfTheCrops) loaderOfTheCrops));
+ }
+
+ return p;
+ }
+
+ private static List<ItemStack> setBaseSeed() {
+ List<ItemStack> p = new ArrayList<>();
+
+ for (LoaderOfTheCrops loaderOfTheCrops : mCropList) {
+ p.add(cropUnpackerCG((LoaderOfTheCrops) loaderOfTheCrops));
+ }
+
+ return p;
+ }
+
+ private static List<String> setnames() {
+ List<String> s = new ArrayList<>();
+
+ for (int i = 0; i < mCropList.size(); ++i) {
+ s.add(((CropCard) cropObjs().get(i)).name());
+ }
+
+ return s;
+ }
+
+ public static void load(FMLPreInitializationEvent preinit) {
+ for (int i = 0; i < mCropList.size(); ++i) {
+ mHasCropObj.add(true);
+ }
+ }
+
+ public static void register() {
+ for (int i = 0; i < mCropList.size(); ++i) {
+ if ((Boolean) mHasCropObj.get(i) && cropObjs().get(i) != null) {
+ Crops.instance.registerCrop((CropCard) cropObjs().get(i));
+ }
+ }
+ }
+
+ public static void registerBaseSeed() {
+ List<ItemStack> baseseed = new ArrayList<>(setBaseSeed());
+
+ for (int i = 0; i < mCropList.size(); ++i) {
+ if (baseseed.get(i) != null && cropObjs().get(i) != null) {
+ Crops.instance.registerBaseSeed((ItemStack) baseseed.get(i), (CropCard) cropObjs().get(i), 1, 1, 1, 1);
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseAestheticCrop.java b/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseAestheticCrop.java
new file mode 100644
index 0000000000..c794c40878
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseAestheticCrop.java
@@ -0,0 +1,34 @@
+package gtPlusPlus.xmod.bartcrops.abstracts;
+
+import gtPlusPlus.preloader.CORE_Preloader;
+import ic2.api.crops.ICropTile;
+
+public abstract class BaseAestheticCrop extends BaseHarvestableCrop {
+
+ @Override
+ public int tier() {
+ return 1;
+ }
+
+ @Override
+ public int stat(int n) {
+ return switch (n) {
+ case 0 -> 0;
+ case 1 -> 0;
+ case 2 -> 0;
+ case 3 -> 4;
+ case 4 -> 0;
+ default -> 0;
+ };
+ }
+
+ @Override
+ public int growthDuration(ICropTile crop) {
+ return CORE_Preloader.DEBUG_MODE ? 1 : 225;
+ }
+
+ @Override
+ public byte getSizeAfterHarvest(ICropTile crop) {
+ return 1;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseCrop.java b/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseCrop.java
new file mode 100644
index 0000000000..405c1ef1e1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseCrop.java
@@ -0,0 +1,67 @@
+package gtPlusPlus.xmod.bartcrops.abstracts;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import ic2.api.crops.CropCard;
+import ic2.api.crops.ICropTile;
+import speiger.src.crops.api.ICropCardInfo;
+
+public abstract class BaseCrop extends CropCard implements ICropCardInfo {
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerSprites(IIconRegister iconRegister) {
+ this.textures = new IIcon[this.maxSize()];
+ for (int i = 1; i <= this.textures.length; ++i) {
+ this.textures[i - 1] = iconRegister
+ .registerIcon(GTPlusPlus.ID + ":crop/blockCrop." + this.name() + "." + i);
+ }
+ }
+
+ @Override
+ public float dropGainChance() {
+ return (float) (Math.pow(0.95D, (double) ((float) this.tier())) * (double) 1f);
+ }
+
+ @Override
+ public boolean canCross(ICropTile crop) {
+ return crop.getSize() == this.maxSize();
+ }
+
+ @Override
+ public int getrootslength(ICropTile crop) {
+ return 3;
+ }
+
+ @Override
+ public String discoveredBy() {
+ return "Alkalus";
+ }
+
+ @Override
+ public String owner() {
+ return "Gtplusplus";
+ }
+
+ @Override
+ public List<String> getCropInformation() {
+ List<String> ret = new ArrayList<>();
+ ret.add(Arrays.toString(this.attributes()));
+ return ret;
+ }
+
+ public ItemStack getDisplayItem(CropCard card) {
+ return ItemUtils.getItemStackOfAmountFromOreDict("crop" + this.name(), 0);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseHarvestableCrop.java b/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseHarvestableCrop.java
new file mode 100644
index 0000000000..80325edff0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/abstracts/BaseHarvestableCrop.java
@@ -0,0 +1,73 @@
+package gtPlusPlus.xmod.bartcrops.abstracts;
+
+import gtPlusPlus.preloader.CORE_Preloader;
+import ic2.api.crops.ICropTile;
+
+public abstract class BaseHarvestableCrop extends BaseCrop {
+
+ @Override
+ public int tier() {
+ return 2;
+ }
+
+ @Override
+ public int stat(int n) {
+ return switch (n) {
+ case 0 -> 0;
+ case 1 -> 4;
+ case 2 -> 0;
+ case 3 -> 4;
+ case 4 -> 0;
+ default -> 0;
+ };
+ }
+
+ @Override
+ public boolean canGrow(ICropTile crop) {
+ return crop.getSize() < 3;
+ }
+
+ @Override
+ public int getOptimalHavestSize(ICropTile crop) {
+ return 3;
+ }
+
+ @Override
+ public boolean canBeHarvested(ICropTile crop) {
+ return crop.getSize() == 3;
+ }
+
+ @Override
+ public int weightInfluences(ICropTile crop, float humidity, float nutrients, float air) {
+ return (int) ((double) humidity * 1.2D + (double) nutrients * 0.9D + (double) air * 0.9D);
+ }
+
+ @Override
+ public int growthDuration(ICropTile crop) {
+ short r;
+ if (CORE_Preloader.DEBUG_MODE) {
+ r = 1;
+ } else if (crop.getSize() == 2) {
+ r = 200;
+ } else {
+ r = 700;
+ }
+
+ return r;
+ }
+
+ @Override
+ public byte getSizeAfterHarvest(ICropTile crop) {
+ return 2;
+ }
+
+ @Override
+ public int maxSize() {
+ return 3;
+ }
+
+ @Override
+ public String discoveredBy() {
+ return "Alkalus";
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/crops/Crop_Hemp.java b/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/crops/Crop_Hemp.java
new file mode 100644
index 0000000000..f5bf252edb
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bartcrops/crops/Crop_Hemp.java
@@ -0,0 +1,41 @@
+package gtPlusPlus.xmod.bartcrops.crops;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.bartcrops.abstracts.BaseAestheticCrop;
+import ic2.api.crops.ICropTile;
+
+public class Crop_Hemp extends BaseAestheticCrop {
+
+ @Override
+ public int tier() {
+ return 2;
+ }
+
+ @Override
+ public String name() {
+ return "Hemp";
+ }
+
+ @Override
+ public int growthDuration(ICropTile crop) {
+ return 550;
+ }
+
+ @Override
+ public String[] attributes() {
+ return new String[] { "Green", "Soil", "Orange" };
+ }
+
+ @Override
+ public ItemStack getGain(ICropTile crop) {
+ return new ItemStack(Items.string, MathUtils.randInt(1, 3), 0);
+ }
+
+ @Override
+ public ItemStack getDisplayItem() {
+ return new ItemStack(Items.string, 1, 0);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bartworks/BW_Utils.java b/gtpp/src/main/java/gtPlusPlus/xmod/bartworks/BW_Utils.java
new file mode 100644
index 0000000000..e3fdc9ae0a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bartworks/BW_Utils.java
@@ -0,0 +1,17 @@
+package gtPlusPlus.xmod.bartworks;
+
+import net.minecraft.item.ItemStack;
+
+import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
+import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
+
+import gregtech.api.enums.OrePrefixes;
+
+public class BW_Utils {
+
+ public static ItemStack getCorrespondingItemStack(OrePrefixes orePrefixes, short werkstoffID, int amount) {
+ Werkstoff werkstoff = Werkstoff.werkstoffHashMap.get(werkstoffID);
+ if (werkstoff == null) return null;
+ return WerkstoffLoader.getCorrespondingItemStackUnsafe(orePrefixes, werkstoff, amount);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bop/HANDLER_BiomesOPlenty.java b/gtpp/src/main/java/gtPlusPlus/xmod/bop/HANDLER_BiomesOPlenty.java
new file mode 100644
index 0000000000..7727eaef38
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bop/HANDLER_BiomesOPlenty.java
@@ -0,0 +1,178 @@
+package gtPlusPlus.xmod.bop;
+
+import static gregtech.api.enums.Mods.BiomesOPlenty;
+
+import java.lang.reflect.Field;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+
+public class HANDLER_BiomesOPlenty {
+
+ public static Item mPineCone;
+
+ public static Block logs1;
+ public static Block logs2;
+ public static Block logs3;
+ public static Block logs4;
+
+ public static Block leaves1;
+ public static Block leaves2;
+ public static Block leaves3;
+ public static Block leaves4;
+
+ public static Block colorizedLeaves1;
+ public static Block colorizedLeaves2;
+
+ public static Block saplings;
+ public static Block colorizedSaplings;
+
+ public static void preInit() {
+ BOP_Block_Registrator.run();
+ if (BiomesOPlenty.isModLoaded()) {
+ setFields();
+ registerPineconeToOreDict();
+ }
+ }
+
+ public static void postInit() {
+ BOP_Block_Registrator.recipes();
+ }
+
+ private static void registerPineconeToOreDict() {
+ if (mPineCone != null) {
+ ItemStack aPinecone = ItemUtils.simpleMetaStack(mPineCone, 13, 1);
+ if (aPinecone != null) {
+ ItemUtils.addItemToOreDictionary(aPinecone, "pinecone");
+ }
+ }
+ }
+
+ public static ItemStack getStack(Block aBlock, int aMeta, int aSize) {
+ return ItemUtils.simpleMetaStack(aBlock, aMeta, aSize);
+ }
+
+ // BOPCBlocks.logs4 - 0
+ // BOPCBlocks.colorizedLeaves2 - 1
+
+ private static void setFields() {
+ Field aBopMiscItem = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCItems"), "misc");
+
+ Field aBopBlock1 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "logs1");
+ Field aBopBlock2 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "logs2");
+ Field aBopBlock3 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "logs3");
+ Field aBopBlock4 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "logs4");
+
+ Field aBopLeaves1 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "leaves1");
+ Field aBopLeaves2 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "leaves2");
+ Field aBopLeaves3 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "leaves3");
+ Field aBopLeaves4 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "leaves4");
+
+ Field aBopColouredLeaves1 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "colorizedLeaves1");
+ Field aBopColouredLeaves2 = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "colorizedLeaves2");
+
+ Field aBopSapling = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "saplings");
+ Field aBopColouredSapling = ReflectionUtils
+ .getField(ReflectionUtils.getClass("biomesoplenty.api.content.BOPCBlocks"), "colorizedSaplings");
+
+ if (aBopMiscItem != null) {
+ Item aMiscItem = ReflectionUtils.getFieldValue(aBopMiscItem);
+ if (aMiscItem != null) {
+ mPineCone = aMiscItem;
+ }
+ }
+
+ if (aBopBlock1 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopBlock1);
+ if (aBlock != null) {
+ logs1 = aBlock;
+ }
+ }
+ if (aBopBlock2 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopBlock2);
+ if (aBlock != null) {
+ logs2 = aBlock;
+ }
+ }
+ if (aBopBlock3 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopBlock3);
+ if (aBlock != null) {
+ logs3 = aBlock;
+ }
+ }
+ if (aBopBlock4 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopBlock4);
+ if (aBlock != null) {
+ logs4 = aBlock;
+ }
+ }
+
+ if (aBopLeaves1 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopLeaves1);
+ if (aBlock != null) {
+ leaves1 = aBlock;
+ }
+ }
+ if (aBopLeaves2 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopLeaves2);
+ if (aBlock != null) {
+ leaves2 = aBlock;
+ }
+ }
+ if (aBopLeaves3 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopLeaves3);
+ if (aBlock != null) {
+ leaves3 = aBlock;
+ }
+ }
+ if (aBopLeaves4 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopLeaves4);
+ if (aBlock != null) {
+ leaves4 = aBlock;
+ }
+ }
+
+ if (aBopColouredLeaves1 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopColouredLeaves1);
+ if (aBlock != null) {
+ colorizedLeaves1 = aBlock;
+ }
+ }
+ if (aBopColouredLeaves2 != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopColouredLeaves2);
+ if (aBlock != null) {
+ colorizedLeaves2 = aBlock;
+ }
+ }
+
+ if (aBopSapling != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopSapling);
+ if (aBlock != null) {
+ saplings = aBlock;
+ }
+ }
+ if (aBopColouredSapling != null) {
+ Block aBlock = ReflectionUtils.getFieldValue(aBopColouredSapling);
+ if (aBlock != null) {
+ colorizedSaplings = aBlock;
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/BOP_Block_Registrator.java b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/BOP_Block_Registrator.java
new file mode 100644
index 0000000000..4a3c91e9cb
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/BOP_Block_Registrator.java
@@ -0,0 +1,173 @@
+package gtPlusPlus.xmod.bop.blocks;
+
+import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.loaders.oreprocessing.ProcessingLog.addPyrolyeOvenRecipes;
+
+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;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.bop.blocks.pine.LeavesPineTree;
+import gtPlusPlus.xmod.bop.blocks.pine.LogPineTree;
+import gtPlusPlus.xmod.bop.blocks.pine.SaplingPineTree;
+import gtPlusPlus.xmod.bop.blocks.rainforest.LeavesRainforestTree;
+import gtPlusPlus.xmod.bop.blocks.rainforest.LogRainforestTree;
+import gtPlusPlus.xmod.bop.blocks.rainforest.SaplingRainforestTree;
+
+public class BOP_Block_Registrator {
+
+ public static Block log_Rainforest;
+ public static Block leaves_Rainforest;
+ public static Block sapling_Rainforest;
+ public static Block log_Pine;
+ public static Block leaves_Pine;
+ public static Block sapling_Pine;
+
+ // Runs Each tree Type separately
+ public static void run() {
+ registerTree_Rainforest();
+ registerTree_Pine();
+ }
+
+ private static void registerTree_Rainforest() {
+ log_Rainforest = new LogRainforestTree();
+ leaves_Rainforest = new LeavesRainforestTree();
+ sapling_Rainforest = new SaplingRainforestTree();
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(log_Rainforest), "logWood", true);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(leaves_Rainforest), "treeLeaves", true);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(sapling_Rainforest), "treeSapling", true);
+ }
+
+ private static void registerTree_Pine() {
+ log_Pine = new LogPineTree();
+ leaves_Pine = new LeavesPineTree();
+ sapling_Pine = new SaplingPineTree();
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(log_Pine), "logWood", true);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(leaves_Pine), "treeLeaves", true);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(sapling_Pine), "treeSapling", true);
+ }
+
+ public static void recipes() {
+ // Rainforest Oak
+ addLogRecipes(ItemUtils.getSimpleStack(log_Rainforest));
+ // Pine
+ addLogRecipes(ItemUtils.getSimpleStack(log_Pine));
+ }
+
+ public static void addLogRecipes(final ItemStack aStack) {
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { aStack },
+ ItemUtils
+ .getSimpleStack(Item.getItemFromBlock(Blocks.planks), GT_Mod.gregtechproxy.mNerfedWoodPlank ? 2 : 4));
+ RecipeUtils.recipeBuilder(
+ CI.craftingToolSaw,
+ null,
+ null,
+ aStack,
+ null,
+ null,
+ null,
+ null,
+ null,
+ ItemUtils.getSimpleStack(Item.getItemFromBlock(Blocks.planks), 4));
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Wood, 2L),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "sLf", 'L', GT_Utility.copyAmount(1L, aStack) });
+
+ final short aMeta = (short) aStack.getItemDamage();
+ if (GT_Utility.areStacksEqual(
+ GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(1L, aStack), false, null),
+ new ItemStack(Items.coal, 1, 1))) {
+ addPyrolyeOvenRecipes(aStack);
+ GT_ModHandler.removeFurnaceSmelting(GT_Utility.copyAmount(1L, aStack));
+ }
+ if (aMeta == 32767) {
+ for (int i = 0; i < 32767; ++i) {
+ if (GT_Utility.areStacksEqual(
+ GT_ModHandler.getSmeltingOutput(new ItemStack(aStack.getItem(), 1, i), false, null),
+ new ItemStack(Items.coal, 1, 1))) {
+ addPyrolyeOvenRecipes(aStack);
+ GT_ModHandler.removeFurnaceSmelting(new ItemStack(aStack.getItem(), 1, i));
+ }
+ final ItemStack tStack = GT_ModHandler.getRecipeOutput(new ItemStack(aStack.getItem(), 1, i));
+ if (tStack == null) {
+ if (i >= 16) {
+ break;
+ }
+ } else {
+ final ItemStack tPlanks = GT_Utility.copy(tStack);
+ tPlanks.stackSize = tPlanks.stackSize * 3 / 2;
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(aStack.getItem(), 1, i))
+ .itemOutputs(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? ((long) tStack.stackSize)
+ : (((long) tStack.stackSize) * 5L / 4),
+ tStack),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(cutterRecipes);
+ GT_ModHandler.removeRecipe(new ItemStack(aStack.getItem(), 1, i));
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? ((long) tStack.stackSize)
+ : (((long) tStack.stackSize) * 5L / 4),
+ tStack),
+ new Object[] { "s", "L", 'L', new ItemStack(aStack.getItem(), 1, i) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility
+ .copyAmount(tStack.stackSize / (GT_Mod.gregtechproxy.mNerfedWoodPlank ? 2 : 1), tStack),
+ new Object[] { new ItemStack(aStack.getItem(), 1, i) });
+ }
+ }
+ } else {
+ final ItemStack tStack2 = GT_ModHandler.getRecipeOutput(GT_Utility.copyAmount(1L, aStack));
+ if (tStack2 != null) {
+ final ItemStack tPlanks2 = GT_Utility.copy(tStack2);
+ tPlanks2.stackSize = tPlanks2.stackSize * 3 / 2;
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1L, aStack))
+ .itemOutputs(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? ((long) tStack2.stackSize)
+ : (((long) tStack2.stackSize) * 5L / 4),
+ tStack2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(cutterRecipes);
+ GT_ModHandler.removeRecipe(GT_Utility.copyAmount(1L, aStack));
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? ((long) tStack2.stackSize)
+ : (((long) tStack2.stackSize) * 5L / 4),
+ tStack2),
+ new Object[] { "s", "L", 'L', GT_Utility.copyAmount(1L, aStack) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.copyAmount(tStack2.stackSize / (GT_Mod.gregtechproxy.mNerfedWoodPlank ? 2 : 1), tStack2),
+ new Object[] { GT_Utility.copyAmount(1L, aStack) });
+ }
+ }
+ if (GT_Utility.areStacksEqual(
+ GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(1L, aStack), false, null),
+ new ItemStack(Items.coal, 1, 1))) {
+ addPyrolyeOvenRecipes(aStack);
+ GT_ModHandler.removeFurnaceSmelting(GT_Utility.copyAmount(1L, aStack));
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LeavesBase.java b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LeavesBase.java
new file mode 100644
index 0000000000..171bb9a58c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LeavesBase.java
@@ -0,0 +1,106 @@
+package gtPlusPlus.xmod.bop.blocks.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.BlockLeaves;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class LeavesBase extends BlockLeaves {
+
+ protected IIcon[][] leafTextures = new IIcon[2][];
+ protected String[][] leafType = new String[][] { {}, {} };
+ protected String[] treeType = new String[] {};
+ protected ItemStack[] bonusDrops;
+
+ public LeavesBase(String blockNameLocalized, String blockNameUnlocalized, ItemStack[] bonusDrops) {
+ this.bonusDrops = bonusDrops;
+ String blockName = "block" + Utils.sanitizeString(blockNameLocalized) + "Leaves";
+ GameRegistry.registerBlock(this, ItemBlock.class, blockName);
+ this.setBlockName(blockName);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(this), "treeLeaves", true);
+ this.setCreativeTab(AddToCreativeTab.tabBOP);
+ Blocks.fire.setFireInfo(this, 80, 150);
+ }
+
+ private void setVanillaVariable(Object toSet, Object value) {
+ toSet = value;
+ }
+
+ @Override
+ public int quantityDropped(Random p_149745_1_) {
+ return p_149745_1_.nextInt(20) == 0 ? 1 : 0;
+ }
+
+ @Override // Drops when Leaf is broken
+ protected void func_150124_c(World world, int x, int y, int z, int meta, int randomChance) {
+ Logger.INFO("Dropping Bonus Drops");
+ for (ItemStack bonusDrop : this.bonusDrops) {
+ if (bonusDrop != null && world.rand.nextInt(randomChance) == 0) {
+ this.dropBlockAsItem(world, x, y, z, ItemUtils.getSimpleStack(bonusDrop, 1));
+ }
+ }
+ }
+
+ /**
+ * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(Item item, CreativeTabs tab, @SuppressWarnings("rawtypes") List metaList) {
+ for (int i = 0; i < this.treeType.length; ++i) {
+ metaList.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int ordinalSide, int metaID) {
+ return (metaID & 3) == 1 ? this.leafTextures[this.field_150127_b][1]
+ : this.leafTextures[this.field_150127_b][0];
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister iIcon) {
+ for (int i = 0; i < leafType.length; ++i) {
+ this.leafTextures[i] = new IIcon[leafType[i].length];
+ for (int j = 0; j < leafType[i].length; ++j) {
+ this.leafTextures[i][j] = iIcon
+ .registerIcon(GTPlusPlus.ID + ":" + "trees/" + "leaves/" + "leaves_" + leafType[i][j]);
+ }
+ }
+ setVanillaVariable(this.field_150129_M, this.leafTextures);
+ }
+
+ @Override
+ public String[] func_150125_e() {
+ return treeType;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LogBase.java b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LogBase.java
new file mode 100644
index 0000000000..2cf8ba1fbc
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/base/LogBase.java
@@ -0,0 +1,85 @@
+package gtPlusPlus.xmod.bop.blocks.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.block.BlockLog;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public abstract class LogBase extends BlockLog {
+
+ public String[] treeType = new String[] {};
+ protected IIcon[] textureSide;
+ protected IIcon[] textureTop;
+
+ public LogBase(String blockNameLocalized, String blockNameUnlocalized, String[] treeTypes) {
+ this.treeType = treeTypes;
+ String blockName = "block" + Utils.sanitizeString(blockNameLocalized) + "Log";
+ GameRegistry.registerBlock(this, ItemBlock.class, blockName);
+ this.setBlockName(blockName);
+ ItemUtils.addItemToOreDictionary(
+ ItemUtils.getSimpleStack(this),
+ "log" + Utils.sanitizeString(blockNameLocalized),
+ true);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(this), "logWood", true);
+ this.setCreativeTab(AddToCreativeTab.tabBOP);
+ Blocks.fire.setFireInfo(this, 20, 100);
+ }
+
+ private void setVanillaVariable(Object toSet, Object value) {
+ toSet = value;
+ }
+
+ /**
+ * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(Item item, CreativeTabs tab, List metaList) {
+ for (int i = 0; i < this.textureSide.length; ++i) {
+ metaList.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ protected IIcon getTopIcon(int meta) {
+ return this.textureTop[meta % this.textureTop.length];
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ protected IIcon getSideIcon(int metaID) {
+ return this.textureSide[metaID % this.textureSide.length];
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister iIcon) {
+ this.textureSide = new IIcon[treeType.length];
+ this.textureTop = new IIcon[treeType.length];
+
+ for (int i = 0; i < this.textureSide.length; ++i) {
+ this.textureSide[i] = iIcon.registerIcon(GTPlusPlus.ID + ":" + "trees/" + "logs/" + "log_" + treeType[i]);
+ this.textureTop[i] = iIcon
+ .registerIcon(GTPlusPlus.ID + ":" + "trees/" + "logs/" + "log_" + treeType[i] + "_top");
+ }
+
+ setVanillaVariable(this.field_150167_a, this.textureSide);
+ setVanillaVariable(this.field_150166_b, this.textureTop);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/base/SaplingBase.java b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/base/SaplingBase.java
new file mode 100644
index 0000000000..ff5c8770d4
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/base/SaplingBase.java
@@ -0,0 +1,166 @@
+package gtPlusPlus.xmod.bop.blocks.base;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockSapling;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenBigTree;
+import net.minecraft.world.gen.feature.WorldGenTrees;
+import net.minecraft.world.gen.feature.WorldGenerator;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class SaplingBase extends BlockSapling {
+
+ protected String[] saplingTypes = new String[] {};
+ protected IIcon[] saplingTextures = new IIcon[] {};
+
+ // Sapling types - field_149882_a
+ // Iicons - field_149881_b
+
+ protected SaplingBase(String blockNameLocalized, String blockNameUnlocalized, String[] saplingTypes) {
+ float f = 0.4F;
+ this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f);
+ this.saplingTypes = saplingTypes;
+ this.saplingTextures = new IIcon[saplingTypes.length];
+ String blockName = "block" + Utils.sanitizeString(blockNameLocalized);
+ GameRegistry.registerBlock(this, ItemBlock.class, blockName);
+ this.setBlockName(blockName);
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(this), "treeSapling", true);
+ this.setCreativeTab(AddToCreativeTab.tabBOP);
+ }
+
+ private void setVanillaVariable(Object toSet, Object value) {
+ toSet = value;
+ }
+
+ /**
+ * Gets the block's texture. Args: side, meta
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int someInt, int meta) {
+ /*
+ * meta &= 7; return saplingTextures[MathHelper.clamp_int(meta, 0, 5)];
+ */
+ // return this.saplingTextures[meta % this.saplingTextures.length];
+ try {
+ return this.saplingTextures[meta];
+ } catch (Throwable T) {
+ Logger.WARNING("Invalid Sapling meta is " + meta);
+ return this.saplingTextures[0];
+ }
+ }
+
+ /**
+ * Ticks the block if it's been scheduled
+ */
+ @Override
+ public void updateTick(World world, int x, int y, int z, Random rand) {
+ if (!world.isRemote) {
+ super.updateTick(world, x, y, z, rand);
+ if (world.getBlockLightValue(x, y + 1, z) >= 9 && rand.nextInt(7) == 0) {
+ Logger.WARNING("Update Tick");
+ this.updateMeta(world, x, y, z, rand);
+ } else {
+ Logger.WARNING("Tried to Tick.");
+ }
+ }
+ }
+
+ // Dunno - Think it is doGrow || doGrowthTick
+ @Override
+ public void func_149853_b(World world, Random rand, int x, int y, int z) {
+ Logger.WARNING("Please find what calls me - func_149853_b");
+ this.updateMeta(world, x, y, z, rand);
+ }
+
+ public void updateMeta(World world, int x, int y, int z, Random rand) {
+ func_149879_c(world, x, y, z, rand);
+ }
+
+ @Override
+ public void func_149879_c(World world, int x, int y, int z, Random rand) {
+ Logger.WARNING("func_149879_c - 1");
+ int l = world.getBlockMetadata(x, y, z);
+
+ if ((l & 8) == 0) {
+ Logger.WARNING("func_149879_c - 2");
+ world.setBlockMetadataWithNotify(x, y, z, l | 8, 4);
+ } else {
+ Logger.WARNING("func_149879_c - 3");
+ this.func_149878_d(world, x, y, z, rand);
+ }
+ }
+
+ @Override
+ public void func_149878_d(World world, int x, int y, int z, Random rand) {
+ Logger.WARNING("func_149878_d - 1");
+ if (!net.minecraftforge.event.terraingen.TerrainGen.saplingGrowTree(world, rand, x, y, z)) return;
+ int l = world.getBlockMetadata(x, y, z) & 7;
+ Object object = rand.nextInt(10) == 0 ? new WorldGenBigTree(true) : new WorldGenTrees(true);
+ int i1 = 0;
+ int j1 = 0;
+ boolean flag = false;
+
+ Block block = Blocks.air;
+
+ world.setBlock(x, y, z, block, 0, 4);
+
+ if (!((WorldGenerator) object).generate(world, rand, x + i1, y, z + j1)) {
+ world.setBlock(x, y, z, this, l, 4);
+ }
+ }
+
+ @Override
+ public boolean func_149880_a(World world, int p_149880_2_, int p_149880_3_, int p_149880_4_, int p_149880_5_) {
+ return world.getBlock(p_149880_2_, p_149880_3_, p_149880_4_) == this
+ && (world.getBlockMetadata(p_149880_2_, p_149880_3_, p_149880_4_) & 7) == p_149880_5_;
+ }
+
+ /**
+ * Determines the damage on the item the block drops. Used in cloth and wood.
+ */
+ @Override
+ public int damageDropped(int meta) {
+ return MathHelper.clamp_int(meta & 7, 0, 5);
+ }
+
+ /**
+ * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(Item item, CreativeTabs tab, List metaList) {
+ for (int i = 0; i < this.saplingTextures.length; ++i) {
+ metaList.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister iIcon) {
+ for (int i = 0; i < saplingTextures.length; ++i) {
+ saplingTextures[i] = iIcon
+ .registerIcon(GTPlusPlus.ID + ":" + "trees/" + "saplings/" + "sapling_" + saplingTypes[i]);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LeavesPineTree.java b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LeavesPineTree.java
new file mode 100644
index 0000000000..93f7e59a1e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LeavesPineTree.java
@@ -0,0 +1,41 @@
+package gtPlusPlus.xmod.bop.blocks.pine;
+
+import java.util.Random;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+import gtPlusPlus.xmod.bop.blocks.base.LeavesBase;
+
+public class LeavesPineTree extends LeavesBase {
+
+ public LeavesPineTree() {
+ super("Pine", "pine", new ItemStack[] {});
+ this.treeType = new String[] { "pine" };
+ this.leafType = new String[][] { { "pine" }, { "pine_opaque" } };
+ }
+
+ @Override
+ public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) {
+ return Item.getItemFromBlock(BOP_Block_Registrator.sapling_Pine);
+ }
+
+ @Override // Drops when Leaf is broken
+ protected void func_150124_c(World world, int x, int y, int z, int meta, int randomChance) {
+ Logger.INFO("Dropping Bonus Drops");
+ if (MathUtils.randInt(0, 10) >= 9) {
+ this.dropBlockAsItem(
+ world,
+ x,
+ y,
+ z,
+ ItemUtils.getSimpleStack(AgriculturalChem.mPinecone, MathUtils.randInt(1, 4)));
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LogPineTree.java b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LogPineTree.java
new file mode 100644
index 0000000000..98e384cd3f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/LogPineTree.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.bop.blocks.pine;
+
+import gtPlusPlus.xmod.bop.blocks.base.LogBase;
+
+public class LogPineTree extends LogBase {
+
+ public LogPineTree() {
+ super("Pine Log", "pine", new String[] { "pine" });
+ this.treeType = new String[] { "pine" };
+ }
+
+ /*
+ * @Override
+ * @SideOnly(Side.CLIENT) protected IIcon getSideIcon(int metaID){ return this.textureSide[metaID %
+ * this.textureSide.length]; }
+ * @Override
+ * @SideOnly(Side.CLIENT) protected IIcon getTopIcon(int metaID){ return this.textureTop[metaID %
+ * this.textureTop.length]; }
+ */
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/SaplingPineTree.java b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/SaplingPineTree.java
new file mode 100644
index 0000000000..2c2bb38af6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/pine/SaplingPineTree.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.xmod.bop.blocks.pine;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenBigTree;
+import net.minecraft.world.gen.feature.WorldGenTrees;
+import net.minecraft.world.gen.feature.WorldGenerator;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.bop.blocks.base.SaplingBase;
+import gtPlusPlus.xmod.bop.world.features.trees.WorldGenPineTree;
+
+public class SaplingPineTree extends SaplingBase {
+
+ public SaplingPineTree() {
+ super("Pine Sapling", "pine", new String[] { "pine" });
+ }
+
+ @Override
+ public void func_149878_d(World world, int x, int y, int z, Random rand) {
+ Logger.WARNING("func_149878_d - 1");
+ if (!net.minecraftforge.event.terraingen.TerrainGen.saplingGrowTree(world, rand, x, y, z)) return;
+ rand.nextInt(10);
+ new WorldGenBigTree(true);
+ new WorldGenTrees(true);
+ int i1 = 0;
+ int j1 = 0;
+ boolean flag = false;
+
+ Block block = Blocks.air;
+
+ if (flag) {
+ world.setBlock(x + i1, y, z + j1, block, 0, 4);
+ world.setBlock(x + i1 + 1, y, z + j1, block, 0, 4);
+ world.setBlock(x + i1, y, z + j1 + 1, block, 0, 4);
+ world.setBlock(x + i1 + 1, y, z + j1 + 1, block, 0, 4);
+ } else {
+ world.setBlock(x, y, z, block, 0, 4);
+ }
+ Object obj = new WorldGenPineTree();
+ if (obj != null) {
+ world.setBlockToAir(x, y, z);
+ if (!((WorldGenerator) obj).generate(world, CORE.RANDOM, x, y, z)) {
+ world.setBlock(x, y, z, this, 0, 2);
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LeavesRainforestTree.java b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LeavesRainforestTree.java
new file mode 100644
index 0000000000..816b666a40
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LeavesRainforestTree.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.bop.blocks.rainforest;
+
+import java.util.Random;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+import gtPlusPlus.xmod.bop.blocks.base.LeavesBase;
+
+public class LeavesRainforestTree extends LeavesBase {
+
+ public LeavesRainforestTree() {
+ super("Rainforest Oak", "rainforestoak", new ItemStack[] { ItemUtils.getSimpleStack(Items.apple) });
+ this.treeType = new String[] { "rainforest" };
+ this.leafType = new String[][] { { "rainforest" }, { "rainforest_opaque" } };
+ }
+
+ @Override
+ public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) {
+ return Item.getItemFromBlock(BOP_Block_Registrator.sapling_Rainforest);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LogRainforestTree.java b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LogRainforestTree.java
new file mode 100644
index 0000000000..4e769b7c95
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/LogRainforestTree.java
@@ -0,0 +1,12 @@
+package gtPlusPlus.xmod.bop.blocks.rainforest;
+
+import gtPlusPlus.xmod.bop.blocks.base.LogBase;
+
+public class LogRainforestTree extends LogBase {
+
+ public LogRainforestTree() {
+ super("Rainforest Oak", "rainforestoak", new String[] { "rainforest" });
+ this.treeType = new String[] { "rainforest" };
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/SaplingRainforestTree.java b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/SaplingRainforestTree.java
new file mode 100644
index 0000000000..362eb2f541
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bop/blocks/rainforest/SaplingRainforestTree.java
@@ -0,0 +1,65 @@
+package gtPlusPlus.xmod.bop.blocks.rainforest;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenBigTree;
+import net.minecraft.world.gen.feature.WorldGenTrees;
+import net.minecraft.world.gen.feature.WorldGenerator;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+import gtPlusPlus.xmod.bop.blocks.base.SaplingBase;
+import gtPlusPlus.xmod.bop.world.features.trees.WorldGenRainForestTree_Ex;
+
+public class SaplingRainforestTree extends SaplingBase {
+
+ public SaplingRainforestTree() {
+ super("Rainforest Oak Sapling", "rainforestoak", new String[] { "rainforest" });
+ }
+
+ @Override
+ public void func_149878_d(World world, int x, int y, int z, Random rand) {
+ Logger.WARNING("func_149878_d - 1");
+ if (!net.minecraftforge.event.terraingen.TerrainGen.saplingGrowTree(world, rand, x, y, z)) return;
+ int l = world.getBlockMetadata(x, y, z) & 7;
+ rand.nextInt(10);
+ new WorldGenBigTree(true);
+ new WorldGenTrees(true);
+ int i1 = 0;
+ int j1 = 0;
+ boolean flag = false;
+
+ Block block = Blocks.air;
+
+ if (flag) {
+ world.setBlock(x + i1, y, z + j1, block, 0, 4);
+ world.setBlock(x + i1 + 1, y, z + j1, block, 0, 4);
+ world.setBlock(x + i1, y, z + j1 + 1, block, 0, 4);
+ world.setBlock(x + i1 + 1, y, z + j1 + 1, block, 0, 4);
+ } else {
+ world.setBlock(x, y, z, block, 0, 4);
+ }
+ Object o = new WorldGenRainForestTree_Ex(
+ BOP_Block_Registrator.log_Rainforest,
+ BOP_Block_Registrator.leaves_Rainforest,
+ 0,
+ 0,
+ true,
+ 50,
+ 75);
+
+ if (!((WorldGenerator) o).generate(world, rand, x + i1, y, z + j1)) {
+ if (flag) {
+ world.setBlock(x + i1, y, z + j1, this, l, 4);
+ world.setBlock(x + i1 + 1, y, z + j1, this, l, 4);
+ world.setBlock(x + i1, y, z + j1 + 1, this, l, 4);
+ world.setBlock(x + i1 + 1, y, z + j1 + 1, this, l, 4);
+ } else {
+ world.setBlock(x, y, z, this, l, 4);
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenPineTree.java b/gtpp/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenPineTree.java
new file mode 100644
index 0000000000..bc97042c82
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenPineTree.java
@@ -0,0 +1,172 @@
+package gtPlusPlus.xmod.bop.world.features.trees;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockSapling;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenAbstractTree;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.bop.blocks.BOP_Block_Registrator;
+
+public class WorldGenPineTree extends WorldGenAbstractTree {
+
+ public WorldGenPineTree() {
+ super(true);
+ }
+
+ @Override
+ public boolean generate(World world, Random random, int x, int y, int z) {
+ while (world.isAirBlock(x, y, z) && y > 2) {
+ --y;
+ }
+
+ Block aSoilBlock = world.getBlock(x, y, z);
+
+ if (!canBlockSustainSapling(world, aSoilBlock, x, y, z)) {
+ return false;
+ } else {
+ int height;
+ int branches;
+ for (height = -2; height <= 2; ++height) {
+ for (branches = -2; branches <= 2; ++branches) {
+ if (world.isAirBlock(x + height, y - 1, z + branches)
+ && world.isAirBlock(x + height, y - 2, z + branches)
+ && !world.isAirBlock(x + height, y, z + branches)) {
+ return false;
+ }
+ }
+ }
+
+ height = 2 + MathUtils.randInt(8, 16);
+ branches = 2 + MathUtils.randInt(6, 18);
+ int h = 1;
+ aSoilBlock.onPlantGrow(world, x, y - 1, z, x, y, z);
+
+ int c;
+ int r = MathUtils.randInt(1, 3);
+ for (c = 0; c < height; ++c) {
+ this.buildBlock(world, x, y + h, z, BOP_Block_Registrator.log_Pine, 0);
+ h++;
+ if (c >= r && c % 2 == 0) {
+ this.generateBranch(world, random, x, y + h, z, c);
+ }
+ }
+
+ this.generateTop(world, x, y + h, z);
+ return true;
+ }
+ }
+
+ public void generateTop(World world, int x, int y, int z) {
+ for (int i = -1; i < 2; ++i) {
+ for (int j = -1; j < 2; ++j) {
+ this.buildBlock(world, x + i, y, z + j, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ }
+
+ this.buildBlock(world, x, y, z, BOP_Block_Registrator.log_Pine, 0);
+ this.buildBlock(world, x + 1, y + 1, z, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x, y + 1, z - 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x, y + 1, z + 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x - 1, y + 1, z, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x, y + 2, z, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+
+ public void generateBranch(World world, Random rand, int x, int y, int z, int n) {
+ int var99999;
+ int var99998;
+ for (var99999 = -1; var99999 < 2; ++var99999) {
+ for (var99998 = -1; var99998 < 2; ++var99998) {
+ this.buildBlock(world, x + var99999, y, z + var99998, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ }
+
+ var99999 = rand.nextInt(2);
+ var99998 = rand.nextInt(2);
+ int var99997 = rand.nextInt(2);
+ int var99996 = rand.nextInt(2);
+ if (n % 2 == 0) {
+ if (var99998 == 0) {
+ this.buildBlock(world, x + 1, y - 1, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x + 2, y - 1, z - 1, BOP_Block_Registrator.leaves_Pine, 0);
+ if (var99999 == 0) {
+ this.buildBlock(world, x + 2, y - 2, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ } else {
+ this.buildBlock(world, x + 2, y - 1, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ } else {
+ this.buildBlock(world, x + 1, y, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x + 2, y, z - 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x + 2, y, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+
+ if (var99997 == 0) {
+ this.buildBlock(world, x - 2, y - 1, z + 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x - 1, y - 1, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ if (var99996 == 0) {
+ this.buildBlock(world, x - 2, y - 2, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ } else {
+ this.buildBlock(world, x - 2, y - 1, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ } else {
+ this.buildBlock(world, x - 2, y, z + 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x - 1, y, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x - 2, y, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ } else {
+ if (var99998 == 0) {
+ this.buildBlock(world, x + 2, y - 1, z + 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x + 1, y - 1, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ if (var99999 == 0) {
+ this.buildBlock(world, x + 2, y - 2, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ } else {
+ this.buildBlock(world, x + 2, y - 1, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ } else {
+ this.buildBlock(world, x + 2, y, z + 1, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x + 1, y, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ if (var99999 == 0) {
+ this.buildBlock(world, x + 2, y - 1, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ } else {
+ this.buildBlock(world, x + 2, y, z + 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ }
+
+ if (var99997 == 0) {
+ this.buildBlock(world, x - 1, y - 1, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x - 2, y - 1, z - 1, BOP_Block_Registrator.leaves_Pine, 0);
+ if (var99996 == 0) {
+ this.buildBlock(world, x - 2, y - 2, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ } else {
+ this.buildBlock(world, x - 2, y - 1, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ } else {
+ this.buildBlock(world, x - 1, y, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ this.buildBlock(world, x - 2, y, z - 1, BOP_Block_Registrator.leaves_Pine, 0);
+ if (var99996 == 0) {
+ this.buildBlock(world, x - 2, y - 1, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ } else {
+ this.buildBlock(world, x - 2, y, z - 2, BOP_Block_Registrator.leaves_Pine, 0);
+ }
+ }
+ }
+
+ this.buildBlock(world, x, y, z, BOP_Block_Registrator.log_Pine, 0);
+ this.buildBlock(world, x, y + 1, z, BOP_Block_Registrator.log_Pine, 0);
+ }
+
+ public void buildBlock(World world, int x, int y, int z, Block block, int meta) {
+ if (world.isAirBlock(x, y, z) || world.getBlock(x, y, z)
+ .isLeaves(world, x, y, z)) {
+ world.setBlock(x, y, z, block, meta, 2);
+ }
+ }
+
+ public boolean canBlockSustainSapling(World world, Block block, int x, int y, int z) {
+ return block.canSustainPlant(world, x, y, z, ForgeDirection.UP, (BlockSapling) Blocks.sapling);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenRainForestTree_Ex.java b/gtpp/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenRainForestTree_Ex.java
new file mode 100644
index 0000000000..d3ad2efaea
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/bop/world/features/trees/WorldGenRainForestTree_Ex.java
@@ -0,0 +1,310 @@
+package gtPlusPlus.xmod.bop.world.features.trees;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockSapling;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenAbstractTree;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gtPlusPlus.api.objects.Logger;
+
+public class WorldGenRainForestTree_Ex extends WorldGenAbstractTree {
+
+ private final int minTreeHeight;
+ private final int randomTreeHeight;
+ private final Block wood;
+ private final Block leaves;
+ private final int woodMeta;
+ private final int leavesMeta;
+
+ // return random.nextInt(5) == 0 ? new WorldGenTrees(false, 4 + random.nextInt(7), 3, 3, true) : new
+ // WorldGenRainforestTree1(BOPCBlocks.logs4, BOPCBlocks.colorizedLeaves2, 3, 2, false, 8, 8);
+
+ public WorldGenRainForestTree_Ex(Block wood, Block leaves, int woodMeta, int leavesMeta, boolean doBlockNotify,
+ int minTreeHeight, int randomTreeHeight) {
+ super(doBlockNotify);
+ this.wood = wood;
+ this.leaves = leaves;
+ this.woodMeta = woodMeta;
+ this.leavesMeta = leavesMeta;
+ this.minTreeHeight = minTreeHeight;
+ this.randomTreeHeight = randomTreeHeight;
+ }
+
+ @Override
+ public boolean generate(World world, Random random, int x, int y, int z) {
+ int treeHeight = random.nextInt(this.randomTreeHeight) + this.minTreeHeight;
+ boolean flag = true;
+ if ((y >= 1) && (y + treeHeight + 1 <= 256)) {
+ for (int i1 = y; i1 <= y + 1 + treeHeight; i1++) {
+ byte b0 = 1;
+ if (i1 == y) {
+ b0 = 0;
+ }
+ if (i1 >= y + 1 + treeHeight - 2) {
+ b0 = 2;
+ }
+ for (int j1 = x - b0; (j1 <= x + b0) && (flag); j1++) {
+ for (int k1 = z - b0; (k1 <= z + b0) && (flag); k1++) {
+ if ((i1 >= 0) && (i1 < 256)) {
+ Block block = world.getBlock(j1, i1, k1);
+ if (!isReplaceable(world, j1, i1, k1)) {
+ flag = false;
+ }
+ } else {
+ flag = false;
+ }
+ }
+ }
+ }
+ if (!flag) {
+ return false;
+ }
+ Block block2 = world.getBlock(x, y - 1, z);
+
+ boolean isSoil = block2
+ .canSustainPlant(world, x, y - 1, z, ForgeDirection.UP, (BlockSapling) Blocks.sapling);
+ if ((isSoil) && (y < 256 - treeHeight - 1)) {
+ block2.onPlantGrow(world, x, y - 1, z, x, y, z);
+ byte b0 = 3;
+ byte b1 = 0;
+ Logger.WARNING("Sapling located at X:" + x + " | Y:" + y + " | Z:" + z);
+ for (int k1 = y - b0 + treeHeight; k1 <= y + treeHeight; k1++) {
+ Logger
+ .WARNING("[1]| k1 = " + k1 + " | y = " + y + " | b0 = " + b0 + " | l = " + treeHeight + " | ");
+ int i3 = k1 - (y + treeHeight);
+ int l1 = b1 + 1 - i3;
+ for (int i2 = x - l1; i2 <= x + l1; i2++) {
+ int j2 = i2 - x;
+ Logger.WARNING("[2]| i2 = " + i2 + " | x = " + x + " | l1 = " + l1 + " | j2 = " + j2 + " | ");
+ for (int k2 = z - l1; k2 <= z + l1; k2++) {
+ int l2 = k2 - z;
+ Logger
+ .WARNING("[3]| k2 = " + k2 + " | z = " + z + " | l1 = " + l1 + " | l2 = " + l2 + " | ");
+ if ((Math.abs(j2) != l1) || (Math.abs(l2) != l1)
+ || ((random.nextInt(2) != 0) && (i3 != 0))) {
+ Block block1 = world.getBlock(i2, k1, k2);
+ if ((block1.isAir(world, i2, k1, k2)) || (block1.isLeaves(world, i2, k1, k2))) {
+ Logger.WARNING("Setting something as leaves?");
+ setBlockAndNotifyAdequately(world, i2, k1, k2, this.leaves, this.leavesMeta);
+ }
+ }
+ }
+ }
+ }
+ for (int k1 = 0; k1 < treeHeight; k1++) {
+ Logger.WARNING("Building tree - Layer " + k1 + " | Max height is " + treeHeight);
+ Block block = world.getBlock(x, y + k1, z);
+ if ((block.isAir(world, x, y + k1, z)) || (block.isLeaves(world, x, y + k1, z))) {
+ setBlockAndNotifyAdequately(world, x, y + k1, z, this.wood, this.woodMeta);
+
+ // Trying this to make trunk
+ setBlockAndNotifyAdequately(world, x, y + k1, z + 1, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + k1, z - 1, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x + 1, y + k1, z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x - 1, y + k1, z, this.wood, this.woodMeta);
+
+ if (k1 >= 5) {
+ if (k1 % 5 == 0) {
+ // Bottom layer
+ Block block5 = world.getBlock(x, y + k1, z);
+ for (int xDir = -5; xDir <= 5; xDir++) {
+ for (int zDir = -5; zDir <= 5; zDir++) {
+ if (canRemoveLeafBlockLayer2(-5, 5, xDir, -5, 5, zDir)) {
+ Logger.WARNING(
+ "Doing Nothing at " + "x=" + xDir + " | y=" + y + " z=" + zDir);
+ } else {
+ Logger.WARNING(
+ "Trying to place leaves at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + " z="
+ + zDir);
+ block5 = world.getBlock(x + xDir, y + k1, z + zDir);
+ if (block5.isAir(world, x + xDir, y + k1, x + zDir)) {
+ setBlockAndNotifyAdequately(
+ world,
+ x + xDir,
+ y + k1,
+ z + zDir,
+ this.leaves,
+ this.leavesMeta);
+ }
+ }
+ }
+ }
+ // Next Layer
+ for (int xDir = -4; xDir <= 4; xDir++) {
+ for (int zDir = -4; zDir <= 4; zDir++) {
+ if (canRemoveLeafBlockLayer2(-4, 4, xDir, -4, 4, zDir)) {
+ Logger.WARNING(
+ "Doing Nothing at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + k1
+ + 1
+ + " z="
+ + zDir);
+ } else {
+ Logger.WARNING(
+ "Trying to place leaves at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + k1
+ + 1
+ + " z="
+ + zDir);
+ block5 = world.getBlock(x + xDir, y + k1 + 1, z + zDir);
+ if (block5.isAir(world, x + xDir, y + k1 + 1, x + zDir)) {
+ setBlockAndNotifyAdequately(
+ world,
+ x + xDir,
+ y + k1 + 1,
+ z + zDir,
+ this.leaves,
+ this.leavesMeta);
+ }
+ }
+ }
+ }
+
+ // Third Layer
+ for (int xDir = -3; xDir <= 3; xDir++) {
+ for (int zDir = -3; zDir <= 3; zDir++) {
+ if (canRemoveLeafBlockLayer2(-3, 3, xDir, -3, 3, zDir)) {
+ Logger.WARNING(
+ "Doing Nothing at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + k1
+ + 2
+ + " z="
+ + zDir);
+ } else {
+ Logger.WARNING(
+ "Trying to place leaves at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + k1
+ + 2
+ + " z="
+ + zDir);
+ block5 = world.getBlock(x + xDir, y + k1 + 2, z + zDir);
+ if (block5.isAir(world, x + xDir, y + k1 + 2, x + zDir)) {
+ setBlockAndNotifyAdequately(
+ world,
+ x + xDir,
+ y + k1 + 2,
+ z + zDir,
+ this.leaves,
+ this.leavesMeta);
+ }
+ }
+ }
+ }
+
+ // Fourth Layer
+ for (int xDir = -2; xDir <= 2; xDir++) {
+ for (int zDir = -2; zDir <= 2; zDir++) {
+ if (canRemoveLeafBlockLayer2(-2, 2, xDir, -2, 2, zDir)) {
+ Logger.WARNING(
+ "Doing Nothing at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + k1
+ + 3
+ + " z="
+ + zDir);
+ } else {
+ Logger.WARNING(
+ "Trying to place leaves at " + "x="
+ + xDir
+ + " | y="
+ + y
+ + k1
+ + 3
+ + " z="
+ + zDir);
+ block5 = world.getBlock(x + xDir, y + k1 + 3, z + zDir);
+ if (block5.isAir(world, x + xDir, y + k1 + 3, x + zDir)) {
+ setBlockAndNotifyAdequately(
+ world,
+ x + xDir,
+ y + k1 + 3,
+ z + zDir,
+ this.leaves,
+ this.leavesMeta);
+ }
+ }
+ }
+ }
+ } else {
+
+ }
+ }
+
+ setBlockAndNotifyAdequately(world, x - 3, y + (treeHeight - 3), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x + 3, y + (treeHeight - 3), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 3), z - 3, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 3), z + 3, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x - 2, y + (treeHeight - 4), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x + 2, y + (treeHeight - 4), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 4), z - 2, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 4), z + 2, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x - 2, y + (treeHeight - 5), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x + 2, y + (treeHeight - 5), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 5), z - 2, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 5), z + 2, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x - 1, y + (treeHeight - 6), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x + 1, y + (treeHeight - 6), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 6), z - 1, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 6), z + 1, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 3), z, this.leaves, this.leavesMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 2), z, this.leaves, this.leavesMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 1), z, this.leaves, this.leavesMeta);
+ setBlockAndNotifyAdequately(world, x, y + treeHeight, z, this.leaves, this.leavesMeta);
+ func_150515_a(world, x, y + (treeHeight - 4), z, Blocks.air);
+ func_150515_a(world, x, y + (treeHeight - 5), z, Blocks.air);
+ setBlockAndNotifyAdequately(world, x - 1, y + (treeHeight - 3), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x + 1, y + (treeHeight - 3), z, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 3), z - 1, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 3), z + 1, this.wood, this.woodMeta);
+ setBlockAndNotifyAdequately(world, x, y + (treeHeight - 2), z, this.wood, this.woodMeta);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+ return false;
+ }
+
+ private boolean canRemoveLeafBlockLayer2(int xDirMin, int xDirMax, int xDir, int zDirMin, int zDirMax, int zDir) {
+ if (xDir == xDirMin || xDir == xDirMin + 1 || xDir == xDirMax || xDir == xDirMax - 1) {
+ if (zDir == zDirMin || zDir == zDirMin + 1 || zDir == zDirMax || zDir == zDirMax - 1) {
+ if (xDir == xDirMin + 1 && zDir == zDirMin + 1) {
+ return false;
+ } else if (xDir == xDirMin + 1 && zDir == zDirMax - 1) {
+ return false;
+ } else if (xDir == xDirMax - 1 && zDir == zDirMin + 1) {
+ return false;
+ } else if (xDir == xDirMax - 1 && zDir == zDirMax - 1) {
+ return false;
+ }
+ return true;
+ }
+ return false;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/HANDLER_FR.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/HANDLER_FR.java
new file mode 100644
index 0000000000..a1b96d0f2f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/HANDLER_FR.java
@@ -0,0 +1,23 @@
+package gtPlusPlus.xmod.forestry;
+
+import static gregtech.api.enums.Mods.Forestry;
+
+import gtPlusPlus.xmod.forestry.bees.items.FR_ItemRegistry;
+import gtPlusPlus.xmod.forestry.bees.recipe.FR_Gregtech_Recipes;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public class HANDLER_FR {
+
+ public static void preInit() {
+ if (Forestry.isModLoaded()) {
+ FR_ItemRegistry.Register();
+ }
+ }
+
+ public static void postInit() {
+ if (Forestry.isModLoaded()) {
+ FR_Gregtech_Recipes.registerItems();
+ new GTPP_Bees();
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/CustomCombs.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/CustomCombs.java
new file mode 100644
index 0000000000..3c00c79fcb
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/CustomCombs.java
@@ -0,0 +1,94 @@
+package gtPlusPlus.xmod.forestry.bees.custom;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.util.Utils;
+
+public enum CustomCombs {
+ // Custom Bees
+
+ // Rubbers & Silicons
+ SILICON("silicon", true, Materials.Silicon, 100),
+ RUBBER("rubber", true, Materials.Rubber, 100),
+ PLASTIC("polyethylene", true, Materials.Plastic, 75),
+ PTFE("polytetrafluoroethylene", true, GTPP_Bees.PTFE, 50),
+ PBS("styrene-butadiene", true, GTPP_Bees.PBS, 25),
+
+ // Fuels
+ BIOMASS("biomass", true, Materials.Biomass, 100),
+ ETHANOL("ethanol", true, Materials.Ethanol, 75),
+ DIESEL("diesel", true, Materials.Fuel, 50),
+ NITRO("nitro", true, Materials.NitroFuel, 25),
+ HOOTCH("hootch", true, Materials.Silicon, 50),
+ ROCKETFUEL("rocket", true, Materials.Silicon, 25),
+
+ // Materials which are hard, if not impossible to obtain.
+ FLUORINE("fluorine", true, Materials.Fluorine, 25),
+ COKE("coke", true, Materials._NULL, 50),
+ FORCE("force", true, Materials.Force, 50),
+ NIKOLITE("nikolite", true, Materials.Nikolite, 75),
+ MITHRIL("mithril", true, Materials.Mithril, 10),
+ ADAMANTIUM("adamantium", true, Materials.Adamantium, 5),
+
+ // Trash
+ SALT("salt", true, Materials.Salt, 75),
+ SAND("sand", true, Materials.Sand, 100),;
+
+ private static final int[][] colours = new int[][] {
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, // SILICON
+ { Utils.rgbtoHexValue(55, 55, 55), Utils.rgbtoHexValue(75, 75, 75) }, // RUBBER
+ { Utils.rgbtoHexValue(245, 245, 245), Utils.rgbtoHexValue(175, 175, 175) }, // PLASTIC
+ { Utils.rgbtoHexValue(150, 150, 150), Utils.rgbtoHexValue(75, 75, 75) }, // PTFE
+ { Utils.rgbtoHexValue(33, 26, 24), Utils.rgbtoHexValue(23, 16, 14) }, // PBS
+ // Unused
+ { Utils.rgbtoHexValue(33, 225, 24), Utils.rgbtoHexValue(23, 175, 14) }, // Biofuel
+ { Utils.rgbtoHexValue(255, 128, 0), Utils.rgbtoHexValue(220, 156, 32) }, // Ethanol
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(30, 230, 230), Utils.rgbtoHexValue(10, 150, 150) }, // Fluorine
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(250, 250, 20), Utils.rgbtoHexValue(200, 200, 5) }, // Force
+ { Utils.rgbtoHexValue(60, 180, 200), Utils.rgbtoHexValue(40, 150, 170) }, // Nikolite
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, //
+ { Utils.rgbtoHexValue(75, 75, 75), Utils.rgbtoHexValue(125, 125, 125) }, { 0x666666, 0x525252 },
+ { 0x2E8F5B, 0xDCC289 }, { 0x4C4C4C, 0x333333 }, { 0x808080, 0x999999 }, { 0x57CFFB, 0xBBEEFF },
+ { 0x7D0F0F, 0xD11919 }, { 0x1947D1, 0x476CDA }, { 0xE6005C, 0xCC0052 }, { 0x0033CC, 0x00248F },
+ { 0xCCFFFF, 0xA3CCCC }, { 0x248F24, 0xCCFFCC }, { 0x248F24, 0x2EB82E }, { 0xD4D4D4, 0x58300B },
+ { 0xFF6600, 0xE65C00 }, { 0xD4D4D4, 0xDDDDDD }, { 0x666699, 0xA3A3CC }, { 0xDA9147, 0xDE9C59 },
+ { 0x808080, 0x999999 }, { 0x8585AD, 0x9D9DBD }, { 0xF0DEF0, 0xF2E1F2 }, { 0xC2C2D6, 0xCECEDE },
+ { 0xE6B800, 0xCFA600 }, { 0x008AB8, 0xD6D6FF }, { 0xD5D5D5, 0xAAAAAA }, { 0xCC99FF, 0xDBB8FF },
+ { 0xEBA1EB, 0xF2C3F2 }, { 0x62626D, 0x161620 }, { 0xE6E6E6, 0xFFFFCC }, { 0xDADADA, 0xD1D1E0 },
+ { 0x19AF19, 0x169E16 }, { 0x335C33, 0x6B8F00 }, { 0x003300, 0x002400 }, };
+ public boolean showInList;
+ public final Materials material;
+ public final int chance;
+ private final String name;
+
+ private CustomCombs(String pName, boolean show, Materials material, int chance) {
+ this.name = pName;
+ this.material = material;
+ this.chance = chance;
+ this.showInList = show;
+ }
+
+ public void setHidden() {
+ this.showInList = false;
+ }
+
+ public String getName() {
+ // return "gt.comb."+this.name;
+ return GT_LanguageManager.addStringLocalization(
+ "comb." + this.name,
+ this.name.substring(0, 1)
+ .toUpperCase() + this.name.substring(1) + " Comb");
+ }
+
+ public int[] getColours() {
+ return colours[this.ordinal()];
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bee_Definition.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bee_Definition.java
new file mode 100644
index 0000000000..0cdb49a9b5
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bee_Definition.java
@@ -0,0 +1,604 @@
+package gtPlusPlus.xmod.forestry.bees.custom;
+
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Locale;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.BiomeDictionary.Type;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.commons.lang3.text.WordUtils;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.apiculture.EnumBeeType;
+import forestry.api.apiculture.IAlleleBeeSpecies;
+import forestry.api.apiculture.IAlleleBeeSpeciesCustom;
+import forestry.api.apiculture.IBee;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeMutationCustom;
+import forestry.api.core.EnumHumidity;
+import forestry.api.core.EnumTemperature;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IAllele;
+import forestry.apiculture.genetics.Bee;
+import forestry.apiculture.genetics.BeeDefinition;
+import forestry.apiculture.genetics.BeeVariation;
+import forestry.apiculture.genetics.IBeeDefinition;
+import forestry.core.genetics.alleles.AlleleHelper;
+import gregtech.loaders.misc.GT_BeeDefinition;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public enum GTPP_Bee_Definition implements IBeeDefinition {
+
+ SILICON(GTPP_Branch_Definition.ORGANIC, "Silicon", true, Utils.rgbtoHexValue(75, 75, 75),
+ Utils.rgbtoHexValue(125, 125, 125)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getSlagComb(), 0.10f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SILICON), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(
+ getGregtechBeeType("SLIMEBALL"),
+ getGregtechBeeType("STICKYRESIN"),
+ 10);
+ }
+ },
+
+ RUBBER(GTPP_Branch_Definition.ORGANIC, "Rubber", true, Utils.rgbtoHexValue(55, 55, 55),
+ Utils.rgbtoHexValue(75, 75, 75)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getSlagComb(), 0.10f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.RUBBER), 0.30f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(
+ getGregtechBeeType("SLIMEBALL"),
+ getGregtechBeeType("STICKYRESIN"),
+ 10);
+ }
+ },
+
+ PLASTIC(GTPP_Branch_Definition.ORGANIC, "Plastic", true, Utils.rgbtoHexValue(245, 245, 245),
+ Utils.rgbtoHexValue(175, 175, 175)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getStoneComb(), 0.30f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.PLASTIC), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(RUBBER.species, getGregtechBeeType("OIL"), 10);
+ }
+ },
+
+ PTFE(GTPP_Branch_Definition.ORGANIC, "Ptfe", true, Utils.rgbtoHexValue(150, 150, 150),
+ Utils.rgbtoHexValue(75, 75, 75)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getStoneComb(), 0.30f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.PTFE), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(RUBBER.species, PLASTIC.species, 10);
+ }
+ },
+
+ PBS(GTPP_Branch_Definition.ORGANIC, "Pbs", true, Utils.rgbtoHexValue(33, 26, 24), Utils.rgbtoHexValue(23, 16, 14)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getStoneComb(), 0.30f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.PBS), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(PTFE.species, PLASTIC.species, 10);
+ }
+ },
+
+ /**
+ * Fuels
+ */
+ BIOMASS(GTPP_Branch_Definition.ORGANIC, "Biomass", true, Utils.rgbtoHexValue(33, 225, 24),
+ Utils.rgbtoHexValue(23, 175, 14)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SAND), 0.40f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.BIOMASS), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(getSpecies("Industrious"), getSpecies("Rural"), 10);
+ tMutation.restrictBiomeType(Type.FOREST);
+ }
+ },
+
+ ETHANOL(GTPP_Branch_Definition.ORGANIC, "Ethanol", true, Utils.rgbtoHexValue(255, 128, 0),
+ Utils.rgbtoHexValue(220, 156, 32)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SAND), 0.40f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.ETHANOL), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(BIOMASS.species, getSpecies("Farmerly"), 5);
+ tMutation.restrictBiomeType(Type.FOREST);
+ }
+ },
+
+ /**
+ * Materials
+ */
+ FLUORINE(GTPP_Branch_Definition.ORGANIC, "Fluorine", true, Utils.rgbtoHexValue(30, 230, 230),
+ Utils.rgbtoHexValue(10, 150, 150)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getStoneComb(), 0.40f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.FLUORINE), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.COLD);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(
+ getGregtechBeeType("LAPIS"),
+ getGregtechBeeType("SAPPHIRE"),
+ 5);
+ tMutation.restrictBiomeType(Type.COLD);
+ }
+ },
+
+ // Coke
+
+ // Force
+ FORCE(GTPP_Branch_Definition.METAL, "Force", true, Utils.rgbtoHexValue(250, 250, 20),
+ Utils.rgbtoHexValue(200, 200, 5)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getStoneComb(), 0.30f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SAND), 0.25f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.FORCE), 0.25f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SALT), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.HOT);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(
+ getGregtechBeeType("STEEL"),
+ getGregtechBeeType("GOLD"),
+ 10);
+ tMutation.restrictBiomeType(Type.HOT);
+ }
+ },
+
+ // Nikolite
+ NIKOLITE(GTPP_Branch_Definition.METAL, "Nikolite", true, Utils.rgbtoHexValue(60, 180, 200),
+ Utils.rgbtoHexValue(40, 150, 170)) {
+
+ @Override
+ protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ beeSpecies.addProduct(getStoneComb(), 0.30f);
+ beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.NIKOLITE), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.HOT);
+ }
+
+ @Override
+ protected void setAlleles(IAllele[] template) {
+ template = BeeDefinition.COMMON.getTemplate();
+ }
+
+ @Override
+ protected void registerMutations() {
+ IBeeMutationCustom tMutation = registerMutation(
+ getGregtechBeeType("ALUMINIUM"),
+ getGregtechBeeType("SILVER"),
+ 8);
+ tMutation.restrictBiomeType(Type.HOT);
+ }
+ },
+
+ /*
+ * CLAY(GTPP_Branch_Definition.ORGANIC, "Clay", true, 0x19d0ec, 0xffdc16) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GT_ModHandler.getModItem(GT_Values.MOD_ID_FR, "beeCombs", 1, 0), 0.30f);
+ * beeSpecies.addProduct(new ItemStack(Items.clay_ball, 1), 0.15f); beeSpecies.setHumidity(EnumHumidity.DAMP);
+ * beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.MEADOWS.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Industrious"), getSpecies("Diligent"), 20); } },
+ * SLIMEBALL(GTPP_Branch_Definition.ORGANIC, "SlimeBall", true, 0x4E9E55, 0x00FF15) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GT_ModHandler.getModItem(GT_Values.MOD_ID_FR, "beeCombs", 1, 15), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STICKY), 0.30f);
+ * beeSpecies.setHumidity(EnumHumidity.DAMP); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.MARSHY.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Marshy"), CLAY.species, 15); } }, PEAT(GTPP_Branch_Definition.ORGANIC, "Peat", true,
+ * 0x906237, 0x58300B) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.LIGNIE), 0.30f);
+ * beeSpecies.addProduct(GT_ModHandler.getModItem(GT_Values.MOD_ID_FR, "beeCombs", 1, 0), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.RURAL.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Rural"), CLAY.species, 20); } }, STICKYRESIN(GTPP_Branch_Definition.ORGANIC,
+ * "StickyResin", true, 0x2E8F5B, 0xDCC289) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GT_ModHandler.getModItem(GT_Values.MOD_ID_FR, "beeCombs", 1, 0), 0.30f);
+ * beeSpecies.addProduct(ItemList.IC2_Resin.get(1, new Object[0]), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.MEADOWS.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(SLIMEBALL.species,
+ * PEAT.species, 25); } }, COAL(GTPP_Branch_Definition.ORGANIC, "Coal", true, 0x666666, 0x525252) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.LIGNIE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.COAL), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.AUSTERE.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Industrious"), PEAT.species, 18); } }, OIL(GTPP_Branch_Definition.ORGANIC, "Oil",
+ * true, 0x4C4C4C, 0x333333) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GT_ModHandler.getModItem(GT_Values.MOD_ID_FR, "beeCombs", 1, 0), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.OIL), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.DAMP); beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ * beeSpecies.setNocturnal(); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.MEADOWS.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(COAL.species,
+ * STICKYRESIN.species, 8); } }, REDSTONE(GTPP_Branch_Definition.GEM, "Redstone", true, 0x7D0F0F, 0xD11919) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.REDSTONE), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Industrious"), getSpecies("Demonic"), 20); } }, LAPIS(GTPP_Branch_Definition.GEM,
+ * "Lapis", true, 0x1947D1, 0x476CDA) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.LAPIS), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Demonic"), getSpecies("Imperial"), 20); } }, CERTUS(GTPP_Branch_Definition.GEM,
+ * "CertusQuartz", true, 0x57CFFB, 0xBBEEFF) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.CERTUS), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Hermitic"), LAPIS.species, 20); } }, RUBY(GTPP_Branch_Definition.GEM, "Ruby", true,
+ * 0xE6005C, 0xCC0052) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.RUBY), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(REDSTONE.species,
+ * DIAMOND.species, 10); } }, SAPPHIRE(GTPP_Branch_Definition.GEM, "Sapphire", true, 0x0033CC, 0x00248F) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SAPPHIRE), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(CERTUS.species,
+ * LAPIS.species, 10); } }, DIAMOND(GTPP_Branch_Definition.GEM, "Diamond", true, 0xCCFFFF, 0xA3CCCC) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.DIAMOND), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(CERTUS.species,
+ * COAL.species, 6); } }, OLIVINE(GTPP_Branch_Definition.GEM, "Olivine", true, 0x248F24, 0xCCFFCC) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.OLIVINE), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(CERTUS.species,
+ * getSpecies("Ended"), 10); } }, EMERALD(GTPP_Branch_Definition.GEM, "Emerald", true, 0x248F24, 0x2EB82E) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STONE), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.EMERALD), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.COLD); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(OLIVINE.species,
+ * DIAMOND.species, 8); } }, COPPER(GTPP_Branch_Definition.METAL, "Copper", true, 0xFF6600, 0xE65C00) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.COPPER), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation =
+ * registerMutation(getSpecies("Majestic"), CLAY.species, 25); } }, TIN(GTPP_Branch_Definition.METAL, "Tin", true,
+ * 0xD4D4D4, 0xDDDDDD) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.TIN), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(CLAY.species,
+ * getSpecies("Diligent"), 25); } }, LEAD(GTPP_Branch_Definition.METAL, "Lead", true, 0x666699, 0xA3A3CC) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.LEAD), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.DAMP); beeSpecies.setTemperature(EnumTemperature.WARM); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(COAL.species,
+ * COPPER.species, 25); } }, IRON(GTPP_Branch_Definition.METAL, "Iron", true, 0xDA9147, 0xDE9C59) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.IRON), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(TIN.species,
+ * COPPER.species, 25); } }, STEEL(GTPP_Branch_Definition.METAL, "Steel", true, 0x808080, 0x999999) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.STEEL), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(IRON.species,
+ * COAL.species, 20); } }, NICKEL(GTPP_Branch_Definition.METAL, "Nickel", true, 0x8585AD, 0x8585AD) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.NICKEL), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(IRON.species,
+ * COPPER.species, 25); } }, ZINC(GTPP_Branch_Definition.METAL, "Zinc", true, 0xF0DEF0, 0xF2E1F2) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.ZINC), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(IRON.species,
+ * TIN.species, 20); } }, SILVER(GTPP_Branch_Definition.METAL, "Silver", true, 0xC2C2D6, 0xCECEDE) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SILVER), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(LEAD.species,
+ * TIN.species, 20); } }, GOLD(GTPP_Branch_Definition.METAL, "Gold", true, 0xEBC633, 0xEDCC47) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.GOLD), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.NORMAL); beeSpecies.setTemperature(EnumTemperature.NORMAL); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(LEAD.species,
+ * COPPER.species, 20); } }, ALUMINIUM(GTPP_Branch_Definition.RAREMETAL, "Aluminium", true, 0xB8B8FF, 0xD6D6FF) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.ALUMINIUM), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.ARID); beeSpecies.setTemperature(EnumTemperature.HOT); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(NICKEL.species,
+ * ZINC.species, 18); } }, TITANIUM(GTPP_Branch_Definition.RAREMETAL, "Titanium", true, 0xCC99FF, 0xDBB8FF) {
+ * @Override protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.SLAG), 0.30f);
+ * beeSpecies.addProduct(GTPP_Bees.combs.getStackForType(CustomCombs.TITANIUM), 0.15f);
+ * beeSpecies.setHumidity(EnumHumidity.ARID); beeSpecies.setTemperature(EnumTemperature.HOT); }
+ * @Override protected void setAlleles(IAllele[] template) { template = BeeDefinition.COMMON.getTemplate(); }
+ * @Override protected void registerMutations() { IBeeMutationCustom tMutation = registerMutation(REDSTONE.species,
+ * ALUMINIUM.species, 5); } }
+ */
+
+ ;
+
+ private final GTPP_Branch_Definition branch;
+ private final IAlleleBeeSpeciesCustom species;
+
+ private IAllele[] template;
+ private IBeeGenome genome;
+
+ GTPP_Bee_Definition(GTPP_Branch_Definition branch, String binomial, boolean dominant, int primary, int secondary) {
+ String lowercaseName = this.toString()
+ .toLowerCase(Locale.ENGLISH);
+ String species = "species" + WordUtils.capitalize(lowercaseName);
+
+ String uid = "forestry." + species;
+ String description = "for.description." + species;
+ String name = "for.bees.species." + lowercaseName;
+
+ this.branch = branch;
+ this.species = BeeManager.beeFactory.createSpecies(
+ uid,
+ dominant,
+ "Sengir",
+ name,
+ description,
+ branch.getBranch(),
+ binomial,
+ primary,
+ secondary);
+ }
+
+ public static void initBees() {
+ for (GTPP_Bee_Definition bee : values()) {
+ bee.init();
+ }
+ for (GTPP_Bee_Definition bee : values()) {
+ bee.registerMutations();
+ }
+ }
+
+ private static IAlleleBeeSpecies getSpecies(String name) {
+ return (IAlleleBeeSpecies) AlleleManager.alleleRegistry.getAllele(
+ (new StringBuilder()).append("forestry.species")
+ .append(name)
+ .toString());
+ }
+
+ protected abstract void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies);
+
+ protected abstract void setAlleles(IAllele[] template);
+
+ protected abstract void registerMutations();
+
+ private void init() {
+ setSpeciesProperties(species);
+
+ template = branch.getTemplate();
+ AlleleHelper.instance.set(template, EnumBeeChromosome.SPECIES, species);
+ setAlleles(template);
+
+ genome = BeeManager.beeRoot.templateAsGenome(template);
+
+ BeeManager.beeRoot.registerTemplate(template);
+ }
+
+ protected final IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, IAlleleBeeSpecies parent2,
+ int chance) {
+ IAllele[] template = getTemplate();
+ Logger.DEBUG_BEES("parent1: " + (parent1 != null));
+ Logger.DEBUG_BEES("parent2: " + (parent2 != null));
+ Logger.DEBUG_BEES("chance: " + (chance));
+ Logger.DEBUG_BEES("template: " + (template != null));
+ return BeeManager.beeMutationFactory.createMutation(parent1, parent2, template, chance);
+ }
+
+ @Override
+ public final IAllele[] getTemplate() {
+ return Arrays.copyOf(template, template.length);
+ }
+
+ @Override
+ public final IBeeGenome getGenome() {
+ return genome;
+ }
+
+ @Override
+ public final IBee getIndividual() {
+ return new Bee(genome);
+ }
+
+ @Override
+ public final ItemStack getMemberStack(EnumBeeType beeType) {
+ IBee bee = getIndividual();
+ return BeeManager.beeRoot.getMemberStack(bee, beeType.ordinal());
+ }
+
+ public final IBeeDefinition getRainResist() {
+ return new BeeVariation.RainResist(this);
+ }
+
+ private static ItemStack getSlagComb() {
+ return issStackValid(ItemUtils.getSimpleStack(GTPP_Bees.Comb_Slag, 1));
+ }
+
+ private static ItemStack getStoneComb() {
+ return issStackValid(ItemUtils.getSimpleStack(GTPP_Bees.Comb_Stone, 1));
+ }
+
+ private static ItemStack issStackValid(ItemStack result) {
+ if (result == null) {
+ return ItemUtils.getErrorStack(1);
+ }
+ return result;
+ }
+
+ public static IAlleleBeeSpecies getGregtechBeeType(String name) {
+ try {
+ Enum<GT_BeeDefinition> gtBeeEnumObject = Enum.valueOf(GT_BeeDefinition.class, name);
+ Field gtBeesField = FieldUtils.getDeclaredField(GT_BeeDefinition.class, "species", true);
+ gtBeesField.setAccessible(true);
+ ReflectionUtils.makeFieldAccessible(gtBeesField);
+ Object beeType = gtBeesField.get(gtBeeEnumObject);
+ return (IAlleleBeeSpecies) beeType;
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bees.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bees.java
new file mode 100644
index 0000000000..4d04e3ad31
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Bees.java
@@ -0,0 +1,172 @@
+package gtPlusPlus.xmod.forestry.bees.custom;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.base.ingots.BaseItemIngot_OLD;
+import gtPlusPlus.core.item.base.misc.BaseItemMisc;
+import gtPlusPlus.core.item.base.misc.BaseItemMisc.MiscTypes;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class GTPP_Bees {
+
+ // Custom Comb Drop Base Items
+ public static Item dropForceGem;
+ public static Item dropBiomassBlob;
+ public static Item dropEthanolBlob;
+ public static Item dropNikoliteDust;
+ public static Item dropFluorineBlob;
+
+ // Base Comb Item
+ public static ItemCustomComb combs;
+
+ // Combs obtained via reflection
+ public static ItemStack Comb_Slag;
+ public static ItemStack Comb_Stone;
+
+ // Materials obtained via reflection
+ public static Materials PTFE;
+ public static Materials PBS;
+
+ // public static GTPP_Branch_Definition definition;
+
+ public GTPP_Bees() {
+ if (Forestry.isModLoaded()) {
+
+ // Set Materials and Comb stacks from GT via Reflection
+ setMaterials();
+ setCustomItems();
+
+ try {
+ combs = new ItemCustomComb();
+ combs.initCombsRecipes();
+ GTPP_Bee_Definition.initBees();
+ } catch (Throwable t) {
+ Logger.BEES("Failed to load bees, probably due to an ancient forestry version");
+ t.printStackTrace();
+ }
+ }
+ }
+
+ private void setCustomItems() {
+ dropForceGem = new BaseItemMisc("Force", new short[] { 250, 250, 20 }, 64, MiscTypes.GEM, null);
+ dropBiomassBlob = new BaseItemMisc("Biomass", new short[] { 33, 225, 24 }, 64, MiscTypes.DROP, null);
+ dropEthanolBlob = new BaseItemMisc("Ethanol", new short[] { 255, 128, 0 }, 64, MiscTypes.DROP, null);
+
+ // Nikolite may not exist, so lets make it.
+ dropNikoliteDust = ItemUtils
+ .generateSpecialUseDusts("Nikolite", "Nikolite", Utils.rgbtoHexValue(60, 180, 200))[2];
+
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("ingotNikolite", 1) == null) {
+ new BaseItemIngot_OLD("itemIngotNikolite", "Nikolite", Utils.rgbtoHexValue(60, 180, 200), 0);
+ }
+
+ dropFluorineBlob = new BaseItemMisc("Fluorine", new short[] { 30, 230, 230 }, 64, MiscTypes.DROP, null);
+ addRecipes();
+ }
+
+ private void addRecipes() {
+ addExtractorRecipe(ItemUtils.getSimpleStack(dropBiomassBlob), FluidUtils.getFluidStack("biomass", 30));
+ addExtractorRecipe(ItemUtils.getSimpleStack(dropEthanolBlob), FluidUtils.getFluidStack("ethanol", 6));
+ addExtractorRecipe(ItemUtils.getSimpleStack(dropFluorineBlob), FluidUtils.getFluidStack("fluorine", 4));
+ }
+
+ private void addExtractorRecipe(ItemStack input, FluidStack output) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(input)
+ .fluidOutputs(output)
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(8)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ private static boolean tryGetBeesBoolean() {
+ try {
+ Class<?> mProxy = Class.forName("gregtech.GT_Mod.gregtechproxy");
+ Field mNerf = FieldUtils.getDeclaredField(mProxy, "mGTBees", true);
+ boolean returnValue = (boolean) mNerf.get(GT_Mod.gregtechproxy);
+ return returnValue;
+ } catch (ClassNotFoundException | IllegalArgumentException | IllegalAccessException e) {
+ return false;
+ }
+ }
+
+ private void setMaterials() {
+ try {
+
+ Class<?> gtBees = Class.forName("gregtech.loaders.misc.GT_Bees");
+ Class<?> gtCombItemClass = Class.forName("gregtech.common.items.ItemComb");
+ Class gtCombEnumClass = Class.forName("gregtech.common.items.CombType");
+ Field gtCombs = FieldUtils.getDeclaredField(gtBees, "combs", true);
+ gtCombs.setAccessible(true);
+ ReflectionUtils.makeFieldAccessible(gtCombs);
+ Enum gtCombTypeSlag = Enum.valueOf(gtCombEnumClass, "SLAG");
+ Enum gtCombTypeStone = Enum.valueOf(gtCombEnumClass, "STONE");
+ Object oCombObject = gtCombs.get(null);
+
+ Logger.DEBUG_BEES("Field getModifiers: " + gtCombs.getModifiers());
+ Logger.DEBUG_BEES("Field toGenericString: " + gtCombs.toGenericString());
+ Logger.DEBUG_BEES("Field getClass: " + gtCombs.getClass());
+ Logger.DEBUG_BEES("Field isEnumConstant: " + gtCombs.isEnumConstant());
+ Logger.DEBUG_BEES("Field isSynthetic: " + gtCombs.isSynthetic());
+ Logger.DEBUG_BEES("Field get(gtBees) != null: " + (gtCombs.get(gtBees) != null));
+ Logger.DEBUG_BEES("Field isAccessible: " + gtCombs.isAccessible());
+
+ Logger.BEES("gtBees: " + (gtBees != null));
+ Logger.BEES("gtCombItemClass: " + (gtCombItemClass != null));
+ Logger.BEES("gtCombEnumClass: " + (gtCombEnumClass != null));
+ Logger.BEES("gtCombs: " + (gtCombs != null));
+ Logger.BEES("gtCombTypeSlag: " + (gtCombTypeSlag != null));
+ Logger.BEES("gtCombTypeStone: " + (gtCombTypeStone != null));
+ Logger.BEES("oCombObject: " + (oCombObject != null));
+
+ // if (gtCombItemClass.isInstance(oCombObject)){
+ Method getStackForType;
+ getStackForType = gtCombItemClass.getDeclaredMethod("getStackForType", gtCombEnumClass);
+
+ if (getStackForType != null) {
+ Logger.BEES("Found Method: getStackForType");
+ }
+ if (Comb_Slag == null) {
+ Comb_Slag = (ItemStack) getStackForType.invoke(gtBees, gtCombTypeSlag);
+ }
+ if (Comb_Stone == null) {
+ Comb_Stone = (ItemStack) getStackForType.invoke(gtBees, gtCombTypeStone);
+ }
+
+ } catch (NullPointerException | ClassNotFoundException | IllegalArgumentException | IllegalAccessException
+ | NoSuchMethodException | SecurityException | InvocationTargetException e) {
+ Logger.BEES("Bad Reflection. setMaterials()");
+ }
+
+ PTFE = trySetValue("Polytetrafluoroethylene");
+ PBS = trySetValue("StyreneButadieneRubber");
+ }
+
+ private Materials trySetValue(String material) {
+ Materials mTemp = Materials.get(material);
+ if (mTemp != Materials._NULL) {
+ return mTemp;
+ }
+ return Materials._NULL;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Branch_Definition.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Branch_Definition.java
new file mode 100644
index 0000000000..94e6078c49
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/GTPP_Branch_Definition.java
@@ -0,0 +1,76 @@
+package gtPlusPlus.xmod.forestry.bees.custom;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IClassification;
+import gtPlusPlus.api.objects.Logger;
+
+public enum GTPP_Branch_Definition {
+
+ ORGANIC("ORGANIC"),
+ GEM("GEM"),
+ METAL("METAL"),
+ RAREMETAL("RAREMETAL"),
+ RADIOACTIVE("RADIOACTIVE");
+
+ final String mFieldName;
+ final Enum mActualValues;
+
+ GTPP_Branch_Definition(String mValue) {
+ this.mFieldName = mValue;
+ this.mActualValues = setEnumVar(mValue);
+ }
+
+ public final IAllele[] getTemplate() {
+ Class gtBranchDefClass;
+ try {
+ gtBranchDefClass = Class.forName("gregtech.loaders.misc.GT_BranchDefinition");
+ Enum enumA = mActualValues;
+ Method methodMyMethod = gtBranchDefClass.getMethod("getTemplate");
+
+ Logger.INFO("[Bees] gtBranchDefClass: " + (gtBranchDefClass != null));
+ Logger.INFO("[Bees] enumA: " + (enumA != null));
+ Logger.INFO("[Bees] methodMyMethod: " + (methodMyMethod != null));
+
+ return (IAllele[]) methodMyMethod.invoke(enumA);
+ } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException
+ | IllegalArgumentException | InvocationTargetException e) {
+ Logger.INFO("[Bees] Bad Reflection. getTemplate()");
+ e.printStackTrace();
+ // gregtech.loaders.misc.GT_BranchDefinition.getTemplate()
+ return null;
+ }
+ }
+
+ public final IClassification getBranch() {
+ Class gtBranchDefClass;
+ try {
+ gtBranchDefClass = Class.forName("gregtech.loaders.misc.GT_BranchDefinition");
+ Enum enum_MY_SAMPLE_ENUM = mActualValues;
+ Method methodMyMethod = gtBranchDefClass.getMethod("getBranch");
+
+ Logger.INFO("[Bees] gtBranchDefClass: " + (gtBranchDefClass != null));
+ Logger.INFO("[Bees] enum_MY_SAMPLE_ENUM: " + (enum_MY_SAMPLE_ENUM != null));
+ Logger.INFO("[Bees] methodMyMethod: " + (methodMyMethod != null));
+
+ return (IClassification) methodMyMethod.invoke(enum_MY_SAMPLE_ENUM);
+ } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException
+ | IllegalArgumentException | InvocationTargetException e) {
+ Logger.INFO("[Bees] Bad Reflection. getBranch()");
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ private Enum setEnumVar(String value) {
+ try {
+ Class gtBranchDefClass = Class.forName("gregtech.loaders.misc.GT_BranchDefinition");
+ Enum branchDef = Enum.valueOf(gtBranchDefClass, value);
+ return branchDef;
+ } catch (ClassNotFoundException e) {
+ return null;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/ItemCustomComb.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/ItemCustomComb.java
new file mode 100644
index 0000000000..63c0ae53ec
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/custom/ItemCustomComb.java
@@ -0,0 +1,142 @@
+package gtPlusPlus.xmod.forestry.bees.custom;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class ItemCustomComb extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public ItemCustomComb() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gtpp.comb");
+ GameRegistry.registerItem(this, "gtpp.comb", GTPlusPlus.ID);
+ }
+
+ public ItemStack getStackForType(CustomCombs type) {
+ return new ItemStack(this, 1, type.ordinal());
+ }
+
+ public ItemStack getStackForType(CustomCombs type, int count) {
+ return new ItemStack(this, count, type.ordinal());
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List list) {
+ for (CustomCombs type : CustomCombs.values()) {
+ if (type.showInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public int getRenderPasses(int meta) {
+ return 2;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister) {
+ this.itemIcon = par1IconRegister.registerIcon("forestry:beeCombs.0");
+ this.secondIcon = par1IconRegister.registerIcon("forestry:beeCombs.1");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ int meta = Math.max(0, Math.min(CustomCombs.values().length - 1, stack.getItemDamage()));
+ int colour = CustomCombs.values()[meta].getColours()[0];
+
+ if (pass >= 1) {
+ colour = CustomCombs.values()[meta].getColours()[1];
+ }
+
+ return colour;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return CustomCombs.values()[stack.getItemDamage()].getName();
+ }
+
+ public void initCombsRecipes() {
+ ItemStack tComb;
+
+ tComb = getStackForType(CustomCombs.SILICON);
+ addSpecialCent(tComb, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Silicon, 1), 30);
+ // addProcess(tComb, Materials.Silver, 100);
+ // addProcess(tComb, Materials.Galena, 100);
+
+ // Rubbers
+ tComb = getStackForType(CustomCombs.RUBBER);
+ addSpecialCent(tComb, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Rubber, 1), 30);
+ tComb = getStackForType(CustomCombs.PLASTIC);
+ addSpecialCent(tComb, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plastic, 1), 20);
+ tComb = getStackForType(CustomCombs.PTFE);
+ addSpecialCent(tComb, GT_OreDictUnificator.get(OrePrefixes.dustTiny, GTPP_Bees.PTFE, 1), 10);
+ tComb = getStackForType(CustomCombs.PBS);
+ addSpecialCent(tComb, GT_OreDictUnificator.get(OrePrefixes.dustTiny, GTPP_Bees.PBS, 1), 5);
+
+ // Fuels
+ tComb = getStackForType(CustomCombs.BIOMASS);
+ addSpecialCent(tComb, ItemUtils.getSimpleStack(GTPP_Bees.dropBiomassBlob), 5);
+ tComb = getStackForType(CustomCombs.PBS);
+ addSpecialCent(tComb, ItemUtils.getSimpleStack(GTPP_Bees.dropEthanolBlob), 5);
+
+ // Misc Materials
+ tComb = getStackForType(CustomCombs.FORCE);
+ addSpecialCent(tComb, ItemUtils.getSimpleStack(GTPP_Bees.dropForceGem), 5);
+ tComb = getStackForType(CustomCombs.FLUORINE);
+ addSpecialCent(tComb, ItemUtils.getSimpleStack(GTPP_Bees.dropFluorineBlob), 5);
+ tComb = getStackForType(CustomCombs.NIKOLITE);
+ addSpecialCent(tComb, ItemUtils.getSimpleStack(GTPP_Bees.dropNikoliteDust), 5);
+ }
+
+ public void addSpecialCent(ItemStack tComb, ItemStack aOutput, int chance) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tComb)
+ .itemOutputs(aOutput, ItemList.FR_Wax.get(1))
+ .outputChances(chance * 100, 3000)
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_CombType.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_CombType.java
new file mode 100644
index 0000000000..31b14ed4e6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_CombType.java
@@ -0,0 +1,62 @@
+package gtPlusPlus.xmod.forestry.bees.handler;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public enum GTPP_CombType {
+
+ DRAGONBLOOD(0, "Dragon Blood", true, 30, Utils.rgbtoHexValue(220, 20, 20), Utils.rgbtoHexValue(20, 20, 20)),
+ FORCE(1, "Force", true, 30, Utils.rgbtoHexValue(250, 250, 20), Utils.rgbtoHexValue(200, 200, 5));
+
+ public boolean mShowInList;
+ public final Material mMaterial;
+ public final int mChance;
+ public final int mID;
+
+ private final String mName;
+ private final String mNameUnlocal;
+ private final int[] mColour;
+
+ private static void map(int aId, GTPP_CombType aType) {
+ GTPP_Bees.sCombMappings.put(aId, aType);
+ }
+
+ public static GTPP_CombType get(int aID) {
+ return GTPP_Bees.sCombMappings.get(aID);
+ }
+
+ GTPP_CombType(int aID, String aName, boolean aShow, int aChance, int... aColour) {
+ this.mID = aID;
+ this.mName = aName;
+ this.mNameUnlocal = aName.toLowerCase()
+ .replaceAll(" ", "");
+ this.mChance = aChance;
+ this.mShowInList = aShow;
+ this.mColour = aColour;
+ map(aID, this);
+ this.mMaterial = GTPP_Bees.sMaterialMappings.get(
+ aName.toLowerCase()
+ .replaceAll(" ", ""));
+ GT_LanguageManager.addStringLocalization("gtplusplus.comb." + this.mNameUnlocal, this.mName + " Comb");
+ }
+
+ public void setHidden() {
+ this.mShowInList = false;
+ }
+
+ public String getName() {
+ return GT_LanguageManager.getTranslation("gtplusplus.comb." + this.mNameUnlocal);
+ }
+
+ public int[] getColours() {
+ return mColour == null || mColour.length != 2 ? new int[] { 0, 0 } : mColour;
+ }
+
+ public ItemStack getStackForType(int count) {
+ return new ItemStack(GTPP_Bees.combs, count, mID);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_DropType.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_DropType.java
new file mode 100644
index 0000000000..9819c586cd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_DropType.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.xmod.forestry.bees.handler;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public enum GTPP_DropType {
+
+ DRAGONBLOOD(0, "Dragon Blood", true, Utils.rgbtoHexValue(220, 20, 20), Utils.rgbtoHexValue(20, 20, 20)),
+ FORCE(1, "Force", true, Utils.rgbtoHexValue(250, 250, 20), Utils.rgbtoHexValue(200, 200, 5));
+
+ public boolean mShowInList;
+ public final Material mMaterial;
+ public int mChance;
+ public final int mID;
+
+ private final String mName;
+ private final String mNameUnlocal;
+ private final int[] mColour;
+
+ private static void map(int aId, GTPP_DropType aType) {
+ GTPP_Bees.sDropMappings.put(aId, aType);
+ }
+
+ public static GTPP_DropType get(int aID) {
+ return GTPP_Bees.sDropMappings.get(aID);
+ }
+
+ private GTPP_DropType(int aID, String aName, boolean aShow, int... aColour) {
+ this.mID = aID;
+ this.mName = aName;
+ this.mNameUnlocal = aName.toLowerCase()
+ .replaceAll(" ", "");
+ this.mShowInList = aShow;
+ this.mColour = aColour;
+ map(aID, this);
+ this.mMaterial = GTPP_Bees.sMaterialMappings.get(
+ aName.toLowerCase()
+ .replaceAll(" ", ""));
+ GT_LanguageManager.addStringLocalization("gtplusplus.drop." + this.mNameUnlocal, this.mName + " Drop");
+ }
+
+ public void setHidden() {
+ this.mShowInList = false;
+ }
+
+ public String getName() {
+ return GT_LanguageManager.getTranslation("gtplusplus.drop." + this.mNameUnlocal);
+ }
+
+ public int[] getColours() {
+ return mColour;
+ }
+
+ public ItemStack getStackForType(int count) {
+ return new ItemStack(GTPP_Bees.drop, count, mID);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PollenType.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PollenType.java
new file mode 100644
index 0000000000..66451c7581
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PollenType.java
@@ -0,0 +1,60 @@
+package gtPlusPlus.xmod.forestry.bees.handler;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public enum GTPP_PollenType {
+
+ DRAGONBLOOD(0, "Dragon Blood", true, Utils.rgbtoHexValue(220, 20, 20), Utils.rgbtoHexValue(20, 20, 20));
+
+ public boolean mShowInList;
+ public final Material mMaterial;
+ public int mChance;
+ public final int mID;
+
+ private final String mName;
+ private final String mNameUnlocal;
+ private final int[] mColour;
+
+ private static void map(int aId, GTPP_PollenType aType) {
+ GTPP_Bees.sPollenMappings.put(aId, aType);
+ }
+
+ public static GTPP_PollenType get(int aID) {
+ return GTPP_Bees.sPollenMappings.get(aID);
+ }
+
+ private GTPP_PollenType(int aID, String aName, boolean aShow, int... aColour) {
+ this.mID = aID;
+ this.mName = aName;
+ this.mNameUnlocal = aName.toLowerCase()
+ .replaceAll(" ", "");
+ this.mShowInList = aShow;
+ this.mColour = aColour;
+ map(aID, this);
+ this.mMaterial = GTPP_Bees.sMaterialMappings.get(
+ aName.toLowerCase()
+ .replaceAll(" ", ""));
+ GT_LanguageManager.addStringLocalization("gtplusplus.pollen." + this.mNameUnlocal, this.mName + " Pollen");
+ }
+
+ public void setHidden() {
+ this.mShowInList = false;
+ }
+
+ public String getName() {
+ return GT_LanguageManager.getTranslation("gtplusplus.pollen." + this.mNameUnlocal);
+ }
+
+ public int[] getColours() {
+ return mColour;
+ }
+
+ public ItemStack getStackForType(int count) {
+ return new ItemStack(GTPP_Bees.pollen, count, mID);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PropolisType.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PropolisType.java
new file mode 100644
index 0000000000..eb3b617077
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/handler/GTPP_PropolisType.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.xmod.forestry.bees.handler;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public enum GTPP_PropolisType {
+
+ DRAGONBLOOD(0, "Dragon Blood", true, Utils.rgbtoHexValue(220, 20, 20)),
+ FORCE(1, "Force", true, Utils.rgbtoHexValue(250, 250, 20));
+
+ public boolean mShowInList;
+ public final Material mMaterial;
+ public int mChance;
+ public final int mID;
+
+ private final String mName;
+ private final String mNameUnlocal;
+ private final int mColour;
+
+ private static void map(int aId, GTPP_PropolisType aType) {
+ GTPP_Bees.sPropolisMappings.put(aId, aType);
+ }
+
+ public static GTPP_PropolisType get(int aID) {
+ return GTPP_Bees.sPropolisMappings.get(aID);
+ }
+
+ private GTPP_PropolisType(int aID, String aName, boolean aShow, int aColour) {
+ this.mID = aID;
+ this.mName = aName;
+ this.mNameUnlocal = aName.toLowerCase()
+ .replaceAll(" ", "");
+ this.mShowInList = aShow;
+ this.mColour = aColour;
+ map(aID, this);
+ this.mMaterial = GTPP_Bees.sMaterialMappings.get(
+ aName.toLowerCase()
+ .replaceAll(" ", ""));
+ GT_LanguageManager.addStringLocalization("gtplusplus.propolis." + this.mNameUnlocal, this.mName + " Propolis");
+ }
+
+ public void setHidden() {
+ this.mShowInList = false;
+ }
+
+ public String getName() {
+ return GT_LanguageManager.getTranslation("gtplusplus.propolis." + this.mNameUnlocal);
+ }
+
+ public int getColours() {
+ return mColour;
+ }
+
+ public ItemStack getStackForType(int count) {
+ return new ItemStack(GTPP_Bees.propolis, count, mID);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_ItemRegistry.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_ItemRegistry.java
new file mode 100644
index 0000000000..b61a91710e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_ItemRegistry.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2011-2014 SirSengir. All rights reserved. This program and the accompanying materials are made
+ * available under the terms of the GNU Lesser Public License v3 which accompanies this distribution, and is available
+ * at http://www.gnu.org/licenses/lgpl-3.0.txt
+ *
+ * Various Contributors including, but not limited to: SirSengir (original work), CovertJaguar, Player, Binnie,
+ * MysteriousAges
+ ******************************************************************************/
+package gtPlusPlus.xmod.forestry.bees.items;
+
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.WeightedRandomChestContent;
+import net.minecraftforge.common.ChestGenHooks;
+
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import forestry.core.utils.StringUtil;
+import gregtech.api.enums.Mods;
+
+public class FR_ItemRegistry {
+
+ // ----- Apiary Frames ----------------------
+
+ // Magic Bee Frame Items
+ public static MB_ItemFrame hiveFrameAccelerated;
+ public static MB_ItemFrame hiveFrameVoid;
+ public static MB_ItemFrame hiveFrameMutagenic;
+ public static MB_ItemFrame hiveFrameBusy;
+
+ // Extra Bee Frame Items
+ public static MB_ItemFrame hiveFrameCocoa;
+ public static MB_ItemFrame hiveFrameCaged;
+ public static MB_ItemFrame hiveFrameSoul;
+ public static MB_ItemFrame hiveFrameClay;
+ public static MB_ItemFrame hiveFrameNova;
+
+ // Frame Items added by bartimaeusnek
+ public static MB_ItemFrame hiveFrameDecay;
+ public static MB_ItemFrame hiveFrameSlow;
+ public static MB_ItemFrame hiveFrameStalilize;
+ public static MB_ItemFrame hiveFrameArborist;
+
+ @Optional.Method(modid = Mods.Names.FORESTRY)
+ public static void Register() {
+
+ // Forestry Frames
+ // frameUntreated = registerItem(new FR_ItemHiveFrame(80, 0.9f), "frameUntreated");
+ // frameImpregnated = registerItem(new FR_ItemHiveFrame(240, 0.4f), "frameImpregnated");
+ // frameProven = registerItem(new FR_ItemHiveFrame(720, 0.3f), "frameProven");
+
+ // Magic Bee like Frames
+
+ hiveFrameVoid = new MB_ItemFrame(
+ MB_FrameType.USELESS,
+ EnumRarity.common,
+ "No more cheaty frames for GTNH players.");
+
+ hiveFrameAccelerated = new MB_ItemFrame(
+ MB_FrameType.ACCELERATED,
+ "Longevity for bees isn't very common, especially if they're working harder.");
+ hiveFrameMutagenic = new MB_ItemFrame(
+ MB_FrameType.MUTAGENIC,
+ EnumRarity.epic,
+ "Evolution of the fittest, finest and fastest.");
+ hiveFrameBusy = new MB_ItemFrame(MB_FrameType.BUSY, "Your bee will work harder and longer than you expected.");
+ ChestGenHooks.addItem(
+ ChestGenHooks.STRONGHOLD_CORRIDOR,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameVoid), 1, 1, 14));
+ ChestGenHooks.addItem(
+ ChestGenHooks.STRONGHOLD_LIBRARY,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameVoid), 1, 3, 18));
+ ChestGenHooks.addItem(
+ ChestGenHooks.DUNGEON_CHEST,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameVoid), 1, 1, 14));
+ ChestGenHooks.addItem(
+ ChestGenHooks.MINESHAFT_CORRIDOR,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameVoid), 1, 1, 9));
+ ChestGenHooks.addItem(
+ ChestGenHooks.PYRAMID_DESERT_CHEST,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameMutagenic), 1, 1, 9));
+ ChestGenHooks.addItem(
+ ChestGenHooks.PYRAMID_JUNGLE_CHEST,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameMutagenic), 1, 3, 12));
+ ChestGenHooks.addItem(
+ ChestGenHooks.MINESHAFT_CORRIDOR,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameMutagenic), 1, 3, 8));
+ ChestGenHooks.addItem(
+ ChestGenHooks.DUNGEON_CHEST,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameMutagenic), 1, 3, 12));
+
+ // Frame Items added by bartimaeusnek
+ hiveFrameDecay = new MB_ItemFrame(
+ MB_FrameType.DECAYING,
+ EnumRarity.uncommon,
+ "Who really needs stable genetics?");
+ hiveFrameSlow = new MB_ItemFrame(MB_FrameType.SLOWING, EnumRarity.common, "The journey is its own reward.");
+ hiveFrameStalilize = new MB_ItemFrame(
+ MB_FrameType.STABILIZING,
+ EnumRarity.rare,
+ "If you wish your bees to keep their form.");
+ hiveFrameArborist = new MB_ItemFrame(
+ MB_FrameType.ARBORISTS,
+ EnumRarity.common,
+ "Who need Bees when you can have Trees?");
+ ChestGenHooks.addItem(
+ ChestGenHooks.PYRAMID_JUNGLE_CHEST,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameArborist), 1, 4, 24));
+ ChestGenHooks.addItem(
+ ChestGenHooks.STRONGHOLD_LIBRARY,
+ new WeightedRandomChestContent(new ItemStack(hiveFrameSlow), 1, 4, 24));
+ }
+
+ protected static <T extends Item> T registerItem(final T item, final String name) {
+ item.setUnlocalizedName(name);
+ GameRegistry.registerItem(item, StringUtil.cleanItemName(item));
+ return item;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_StringUtil.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_StringUtil.java
new file mode 100644
index 0000000000..c63401aecf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/FR_StringUtil.java
@@ -0,0 +1,14 @@
+package gtPlusPlus.xmod.forestry.bees.items;
+
+import net.minecraft.util.StatCollector;
+
+public class FR_StringUtil {
+
+ public static String getLocalizedString(final String key) {
+ if (StatCollector.canTranslate(key)) {
+ return StatCollector.translateToLocal(key);
+ }
+ return StatCollector.translateToFallback(key);
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_FrameType.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_FrameType.java
new file mode 100644
index 0000000000..418c05587f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_FrameType.java
@@ -0,0 +1,126 @@
+package gtPlusPlus.xmod.forestry.bees.items;
+
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeModifier;
+
+public enum MB_FrameType implements IBeeModifier {
+
+ // ExtraBees Clone Frames
+ // Name, FrameHP, territory (1f), Mutation rate, lifespan rate, production rate, genetic decay (1f)
+ COCOA("Chocolate", 240, 1.0f, 1.0f, 0.50f, 0.50f, 1f), // production was 1.5x, now +0.5
+ CAGE("Restraint", 240, 0.5f, 1.0f, 0.75f, -0.25f, 1f), // production was 0.75x, now -0.25
+ SOUL("Soul", 80, 1.0f, 1.5f, 0.75f, -0.75f, 1f), // production was 0.25x, now -0.75
+ CLAY("Healing", 240, 1.0f, 0.5f, 1.50f, -0.25f, 1f), // production was 0.75x, now -0.25
+ NOVA("Nova", 240, 1.0f, 100.0f, 0.0001f, 0.00f, 1f), // production was 1x, now +0
+
+ // Name, FrameHP, territory (1f), Mutation rate, lifespan rate, production rate, genetic decay (1f)
+ ACCELERATED("Accelerated", 175, 1f, 1.2f, 0.9f, 0.8f, 1f), // production was 1.8x, now +0.8
+ VOID("Void", 20, 1f, 1f, 0.0001f, 9f, 1f), // production was 10x, now +9
+ MUTAGENIC("Mutagenic", 3, 1f, 5f, 0.0001f, 9f, 1f), // production was 10x, now +9
+ BUSY("Busy", 2000, 1f, 0f, 3f, 3f, 1f), // production was 4x, now +3
+ USELESS("Useless", 100, 1f, 0f, 1f, 0f, 1f), // production was 1x, now +0
+
+ // Frame Items added by bartimaeusnek
+ DECAYING("Decaying", 240, 1f, 1f, 1f, 0f, 10f), // enhanches decay to 10x // production was 1x, now +0
+ SLOWING("Slowing", 175, 1f, 0.5f, 2f, -0.5f, 1f), // reduces mutation, production rate and enhanches lifespan //
+ // production was 0.5x, now -0.5
+ STABILIZING("Stabilizing", 60, 1f, 0.1f, 1f, -0.9f, 0.5f), // reduces mutation, production and decay // production
+ // was 0.1x, now -0.9
+ ARBORISTS("Arborists", 240, 3f, 0f, 3f, -9001f, 1f); // 3x territory and lifespan, sets mutation and production to
+ // zero // production was 0x, now -9001
+
+ private final String frameName;
+ public final int maxDamage;
+
+ private final float territoryMod;
+ private final float mutationMod;
+ private final float lifespanMod;
+ private final float productionMod;
+ private final float floweringMod;
+ private final float geneticDecayMod;
+ private final boolean isSealed;
+ private final boolean isLit;
+ private final boolean isSunlit;
+ private final boolean isHellish;
+
+ MB_FrameType(final String name, final int damage, final float territory, final float mutation, final float lifespan,
+ final float production, final float geneticDecay) {
+ this(name, damage, territory, mutation, lifespan, production, 1f, geneticDecay, false, false, false, false);
+ }
+
+ MB_FrameType(final String name, final int damage, final float territory, final float mutation, final float lifespan,
+ final float production, final float flowering, final float geneticDecay, final boolean sealed,
+ final boolean lit, final boolean sunlit, final boolean hellish) {
+ this.frameName = name;
+ this.maxDamage = damage;
+
+ this.territoryMod = territory;
+ this.mutationMod = mutation;
+ this.lifespanMod = lifespan;
+ this.productionMod = production;
+ this.floweringMod = flowering;
+ this.geneticDecayMod = geneticDecay;
+ this.isSealed = sealed;
+ this.isLit = lit;
+ this.isSunlit = sunlit;
+ this.isHellish = hellish;
+ }
+
+ public String getName() {
+ return this.frameName;
+ }
+
+ public String getLocalizedName() {
+ return FR_StringUtil.getLocalizedString("frame." + this.frameName);
+ }
+
+ @Override
+ public float getTerritoryModifier(final IBeeGenome genome, final float currentModifier) {
+ return this.territoryMod;
+ }
+
+ @Override
+ public float getMutationModifier(final IBeeGenome genome, final IBeeGenome mate, final float currentModifier) {
+ return this.mutationMod;
+ }
+
+ @Override
+ public float getLifespanModifier(final IBeeGenome genome, final IBeeGenome mate, final float currentModifier) {
+ return this.lifespanMod;
+ }
+
+ @Override
+ public float getProductionModifier(final IBeeGenome genome, final float currentModifier) {
+ return this.productionMod;
+ }
+
+ @Override
+ public float getFloweringModifier(final IBeeGenome genome, final float currentModifier) {
+ return this.floweringMod;
+ }
+
+ @Override
+ public float getGeneticDecay(final IBeeGenome genome, final float currentModifier) {
+ return this.geneticDecayMod;
+ }
+
+ @Override
+ public boolean isSealed() {
+ return this.isSealed;
+ }
+
+ @Override
+ public boolean isSelfLighted() {
+ return this.isLit;
+ }
+
+ @Override
+ public boolean isSunlightSimulated() {
+ return this.isSunlit;
+ }
+
+ @Override
+ public boolean isHellish() {
+ return this.isHellish;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_ItemFrame.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_ItemFrame.java
new file mode 100644
index 0000000000..e5d36d15e8
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/MB_ItemFrame.java
@@ -0,0 +1,142 @@
+package gtPlusPlus.xmod.forestry.bees.items;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.apiculture.IBee;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeHousing;
+import forestry.api.apiculture.IBeeModifier;
+import forestry.api.apiculture.IHiveFrame;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public class MB_ItemFrame extends Item implements IHiveFrame {
+
+ private final MB_FrameType type;
+ private EnumRarity rarity_value = EnumRarity.uncommon;
+ private final String toolTip;
+
+ public MB_ItemFrame(final MB_FrameType frameType, final String description) {
+ this(frameType, EnumRarity.uncommon, description);
+ }
+
+ public MB_ItemFrame(final MB_FrameType frameType, final EnumRarity rarity, final String description) {
+ super();
+ this.type = frameType;
+ this.setMaxDamage(this.type.maxDamage);
+ this.setMaxStackSize(1);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setUnlocalizedName("frame" + frameType.getName());
+ this.rarity_value = rarity;
+ this.toolTip = description;
+ GameRegistry.registerItem(this, "frame" + frameType.getName());
+ }
+
+ @Override
+ public void addInformation(final ItemStack stack, final EntityPlayer aPlayer, final List list, final boolean bool) {
+ if ((this.toolTip != "") || !this.toolTip.equals("")) {
+ list.add(EnumChatFormatting.GRAY + this.toolTip);
+ }
+ super.addInformation(stack, aPlayer, list, bool);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(final IIconRegister par1IconRegister) {
+ this.itemIcon = par1IconRegister.registerIcon(GTPlusPlus.ID + ":frame" + this.type.getName());
+ }
+
+ // --------- IHiveFrame functions -----------------------------------------
+
+ @Override
+ public ItemStack frameUsed(final IBeeHousing housing, ItemStack frame, final IBee queen, final int wear) {
+ frame.setItemDamage(frame.getItemDamage() + wear);
+
+ if (frame.getItemDamage() >= frame.getMaxDamage()) {
+ // Break the frame.
+ frame = null;
+ }
+
+ return frame;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public EnumRarity getRarity(final ItemStack par1ItemStack) {
+ return this.rarity_value;
+ }
+
+ @Override
+ public boolean hasEffect(final ItemStack par1ItemStack, final int pass) {
+ if ((this.rarity_value == EnumRarity.uncommon) || (this.rarity_value == EnumRarity.common)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public IBeeModifier getBeeModifier() {
+ return this.type;
+ }
+
+ @Override
+ public boolean isBookEnchantable(final ItemStack itemstack1, final ItemStack itemstack2) {
+ return false;
+ }
+
+ @Override
+ public boolean isRepairable() {
+ return false;
+ }
+
+ public float getTerritoryModifier(final IBeeGenome genome, final float currentModifier) {
+ return this.type.getTerritoryModifier(genome, currentModifier);
+ }
+
+ public float getMutationModifier(final IBeeGenome genome, final IBeeGenome mate, final float currentModifier) {
+ return this.type.getMutationModifier(genome, mate, currentModifier);
+ }
+
+ public float getLifespanModifier(final IBeeGenome genome, final IBeeGenome mate, final float currentModifier) {
+ return this.type.getLifespanModifier(genome, mate, currentModifier);
+ }
+
+ public float getProductionModifier(final IBeeGenome genome, final float currentModifier) {
+ return this.type.getProductionModifier(genome, currentModifier);
+ }
+
+ public float getFloweringModifier(final IBeeGenome genome, final float currentModifier) {
+ return this.type.getFloweringModifier(genome, currentModifier);
+ }
+
+ public float getGeneticDecay(final IBeeGenome genome, final float currentModifier) {
+ return this.type.getGeneticDecay(genome, currentModifier);
+ }
+
+ public boolean isSealed() {
+ return this.type.isSealed();
+ }
+
+ public boolean isSelfLighted() {
+ return this.type.isSelfLighted();
+ }
+
+ public boolean isSunlightSimulated() {
+ return this.type.isSunlightSimulated();
+ }
+
+ public boolean isHellish() {
+ return this.type.isHellish();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Comb.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Comb.java
new file mode 100644
index 0000000000..7c9cc5a990
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Comb.java
@@ -0,0 +1,131 @@
+package gtPlusPlus.xmod.forestry.bees.items.output;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_CombType;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_DropType;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_PropolisType;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public class GTPP_Comb extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public GTPP_Comb() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gtpp.comb");
+ GameRegistry.registerItem(this, "gtpp.comb", GTPlusPlus.ID);
+ }
+
+ public ItemStack getStackForType(GTPP_CombType type) {
+ return new ItemStack(this, 1, type.mID);
+ }
+
+ public ItemStack getStackForType(GTPP_CombType type, int count) {
+ return new ItemStack(this, count, type.mID);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List list) {
+ for (GTPP_CombType type : GTPP_CombType.values()) {
+ if (type.mShowInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public int getRenderPasses(int meta) {
+ return 2;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister) {
+ this.itemIcon = par1IconRegister.registerIcon("forestry:beeCombs.0");
+ this.secondIcon = par1IconRegister.registerIcon("forestry:beeCombs.1");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ int colour = GTPP_CombType.get(stack.getItemDamage())
+ .getColours()[0];
+
+ if (pass >= 1) {
+ colour = GTPP_CombType.get(stack.getItemDamage())
+ .getColours()[1];
+ }
+
+ return colour;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return GTPP_CombType.get(stack.getItemDamage())
+ .getName();
+ }
+
+ public static void initCombsRecipes() {
+
+ addChemicalRecipe(
+ GTPP_CombType.DRAGONBLOOD,
+ new ItemStack[] { GT_ModHandler.getModItem(Forestry.ID, "refractoryWax", 1L, 0),
+ GTPP_Bees.propolis.getStackForType(GTPP_PropolisType.DRAGONBLOOD),
+ GTPP_Bees.drop.getStackForType(GTPP_DropType.DRAGONBLOOD) },
+ new int[] { 3000, 1500, 500 });
+ addChemicalRecipe(
+ GTPP_CombType.FORCE,
+ new ItemStack[] { GT_ModHandler.getModItem(Forestry.ID, "beeswax", 1L, 0),
+ GTPP_Bees.propolis.getStackForType(GTPP_PropolisType.FORCE),
+ GTPP_Bees.drop.getStackForType(GTPP_DropType.FORCE) },
+ new int[] { 5000, 3000, 1000 });
+ }
+
+ public static void addChemicalRecipe(GTPP_CombType aInputStack, ItemStack[] aOutputs, int[] aChances) {
+ Material aMat = aInputStack.mMaterial;
+ long aEU = aMat.vVoltageMultiplier;
+ int aTier = Math.max(aMat.vTier / 2, 1);
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { aInputStack.getStackForType(aTier), },
+ new FluidStack[] {},
+ aOutputs,
+ new FluidStack[] {},
+ aChances,
+ aTier * 20 * 60,
+ aEU,
+ aTier);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Drop.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Drop.java
new file mode 100644
index 0000000000..a84d11e74c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Drop.java
@@ -0,0 +1,131 @@
+package gtPlusPlus.xmod.forestry.bees.items.output;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_DropType;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public class GTPP_Drop extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public GTPP_Drop() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gtpp.drop");
+ GameRegistry.registerItem(this, "gtpp.drop", GTPlusPlus.ID);
+ }
+
+ public ItemStack getStackForType(GTPP_DropType type) {
+ return new ItemStack(this, 1, type.mID);
+ }
+
+ public ItemStack getStackForType(GTPP_DropType type, int count) {
+ return new ItemStack(this, count, type.mID);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List list) {
+ for (GTPP_DropType type : GTPP_DropType.values()) {
+ if (type.mShowInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public int getRenderPasses(int meta) {
+ return 2;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister) {
+ this.itemIcon = par1IconRegister.registerIcon("forestry:honeyDrop.0");
+ this.secondIcon = par1IconRegister.registerIcon("forestry:honeyDrop.1");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ int colour = GTPP_DropType.get(stack.getItemDamage())
+ .getColours()[0];
+
+ if (pass >= 1) {
+ colour = GTPP_DropType.get(stack.getItemDamage())
+ .getColours()[1];
+ }
+
+ return colour;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return GTPP_DropType.get(stack.getItemDamage())
+ .getName();
+ }
+
+ private static final int[] sFluidOutputs = new int[] { 144, 136, 128, 120, 112, 104, 96, 88, 80, 72, 64, 48, 32, 16,
+ 8, 4 };
+
+ public static void initDropsRecipes() {
+ ItemStack tDrop;
+ Logger.BEES("Processing recipes for " + GTPP_Bees.sDropMappings.size() + " Drops.");
+ for (GTPP_DropType aDrop : GTPP_Bees.sDropMappings.values()) {
+ tDrop = aDrop.getStackForType(1);
+ if (addProcess(
+ tDrop,
+ new FluidStack(aDrop.mMaterial.getFluid(), sFluidOutputs[aDrop.mMaterial.vTier]),
+ aDrop.mMaterial.vTier * 20 * 30,
+ aDrop.mMaterial.vVoltageMultiplier)) {
+ Logger.BEES("Added Drop extraction recipe for: " + aDrop.getName());
+ } else {
+ Logger.BEES("Failed to add Drop extraction recipe for: " + aDrop.getName());
+ }
+ }
+ }
+
+ public static boolean addProcess(ItemStack tDrop, FluidStack aOutput, int aDuration, int aEUt) {
+ if (aOutput == null) {
+ return false;
+ }
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tDrop)
+ .fluidOutputs(aOutput)
+ .duration(aDuration * TICKS)
+ .eut(aEUt)
+ .addTo(fluidExtractionRecipes);
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Pollen.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Pollen.java
new file mode 100644
index 0000000000..7e959151a0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Pollen.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.xmod.forestry.bees.items.output;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_PollenType;
+
+public class GTPP_Pollen extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public GTPP_Pollen() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gtpp.pollen");
+ GameRegistry.registerItem(this, "gtpp.pollen", GTPlusPlus.ID);
+ }
+
+ public ItemStack getStackForType(GTPP_PollenType type) {
+ return new ItemStack(this, 1, type.mID);
+ }
+
+ public ItemStack getStackForType(GTPP_PollenType type, int count) {
+ return new ItemStack(this, count, type.mID);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List list) {
+ for (GTPP_PollenType type : GTPP_PollenType.values()) {
+ if (type.mShowInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public int getRenderPasses(int meta) {
+ return 2;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister) {
+ this.itemIcon = par1IconRegister.registerIcon("forestry:pollen.0");
+ this.secondIcon = par1IconRegister.registerIcon("forestry:pollen.1");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ int colour = GTPP_PollenType.get(stack.getItemDamage())
+ .getColours()[0];
+
+ if (pass >= 1) {
+ colour = GTPP_PollenType.get(stack.getItemDamage())
+ .getColours()[1];
+ }
+
+ return colour;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return GTPP_PollenType.get(stack.getItemDamage())
+ .getName();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Propolis.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Propolis.java
new file mode 100644
index 0000000000..1c1bd95d09
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/items/output/GTPP_Propolis.java
@@ -0,0 +1,110 @@
+package gtPlusPlus.xmod.forestry.bees.items.output;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.recipe.RecipeMaps.extractorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_PropolisType;
+import gtPlusPlus.xmod.forestry.bees.registry.GTPP_Bees;
+
+public class GTPP_Propolis extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public GTPP_Propolis() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gtpp.propolis");
+ GameRegistry.registerItem(this, "gtpp.propolis", GTPlusPlus.ID);
+ }
+
+ public ItemStack getStackForType(GTPP_PropolisType type) {
+ return new ItemStack(this, 1, type.mID);
+ }
+
+ public ItemStack getStackForType(GTPP_PropolisType type, int count) {
+ return new ItemStack(this, count, type.mID);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List list) {
+ for (GTPP_PropolisType type : GTPP_PropolisType.values()) {
+ if (type.mShowInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister par1IconRegister) {
+ this.itemIcon = par1IconRegister.registerIcon("forestry:propolis.0");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return itemIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ return GTPP_PropolisType.get(stack.getItemDamage())
+ .getColours();
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return GTPP_PropolisType.get(stack.getItemDamage())
+ .getName();
+ }
+
+ public static void initPropolisRecipes() {
+ ItemStack tDrop;
+ Logger.BEES("Processing recipes for " + GTPP_Bees.sPropolisMappings.size() + " Propolis.");
+ for (GTPP_PropolisType aProp : GTPP_Bees.sPropolisMappings.values()) {
+ tDrop = aProp.getStackForType(1);
+ if (addProcess(
+ tDrop,
+ aProp.mMaterial.getDust(1),
+ Math.min(Math.max(10000 - (aProp.mMaterial.vTier * 625), 100), 10000),
+ aProp.mMaterial.vTier * 20 * 15,
+ aProp.mMaterial.vVoltageMultiplier)) {
+ Logger.BEES("Added Propolis extraction recipe for: " + aProp.getName());
+ } else {
+ Logger.BEES("Failed to add Propolis extraction recipe for: " + aProp.getName());
+ }
+ }
+ }
+
+ public static boolean addProcess(ItemStack tDrop, ItemStack aOutput, int aChance, int aDuration, int aEUt) {
+ if (aOutput == null) {
+ return false;
+ }
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tDrop)
+ .itemOutputs(aOutput)
+ .outputChances(aChance)
+ .duration(aDuration * TICKS)
+ .eut(aEUt)
+ .addTo(extractorRecipes);
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/recipe/FR_Gregtech_Recipes.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/recipe/FR_Gregtech_Recipes.java
new file mode 100644
index 0000000000..ce982cd67e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/recipe/FR_Gregtech_Recipes.java
@@ -0,0 +1,134 @@
+package gtPlusPlus.xmod.forestry.bees.recipe;
+
+import static gregtech.api.enums.Mods.MagicBees;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.forestry.bees.items.FR_ItemRegistry;
+
+public class FR_Gregtech_Recipes {
+
+ private static String rod_Electrum = "stickElectrum";
+ private static String rod_LongElectrum = "stickLongElectrum";
+ private static String foil_Electrum = "foilElectrum";
+ private static String rod_Uranium = "stickUranium";
+ private static String rod_LongUranium = "stickLongUranium";
+ private static String foil_Uranium235 = "foilUranium235";
+ private static ItemStack hiveFrameAccelerated = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameAccelerated);
+ private static ItemStack hiveFrameMutagenic = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameMutagenic);
+ private static ItemStack hiveFrameVoid = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameVoid);
+ private static ItemStack hiveFrameBusy = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameBusy);
+
+ private static ItemStack hiveFrameCocoa = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameCocoa);
+ private static ItemStack hiveFrameCaged = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameCaged);
+ private static ItemStack hiveFrameSoul = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameSoul);
+ private static ItemStack hiveFrameClay = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameClay);
+ private static ItemStack hiveFrameNova = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameNova);
+
+ private static ItemStack hiveFrameImpregnated = ItemUtils.getItemStackFromFQRN("Forestry:frameImpregnated", 1);
+ private static ItemStack blockSoulSand = new ItemStack(Blocks.soul_sand, 1);
+ private static ItemStack blockIronBars = new ItemStack(Blocks.iron_bars, 1);
+ private static ItemStack itemClayDust = new ItemStack(Items.clay_ball, 1);
+ private static ItemStack itemCocoaBeans = new ItemStack(Items.dye, 1, 3);
+
+ private static ItemStack hiveFrameDecay = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameDecay);
+ private static ItemStack hiveFrameSlow = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameSlow);
+ private static ItemStack hiveFrameStalilize = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameStalilize);
+ private static ItemStack hiveFrameArborist = ItemUtils.getSimpleStack(FR_ItemRegistry.hiveFrameArborist);
+
+ public static void registerItems() {
+ // Magic Bee Like Frames
+ RecipeUtils.addShapedGregtechRecipe(
+ rod_LongElectrum,
+ rod_Electrum,
+ rod_LongElectrum,
+ rod_LongElectrum,
+ foil_Electrum,
+ rod_LongElectrum,
+ rod_Electrum,
+ rod_Electrum,
+ rod_Electrum,
+ hiveFrameAccelerated);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ rod_LongUranium,
+ rod_Uranium,
+ rod_LongUranium,
+ rod_LongUranium,
+ foil_Uranium235,
+ rod_LongUranium,
+ rod_Uranium,
+ rod_Uranium,
+ rod_Uranium,
+ hiveFrameMutagenic);
+ if (MagicBees.isModLoaded()) {
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { hiveFrameVoid },
+ ItemUtils.getCorrectStacktype("MagicBees:frameOblivion", 1));
+ }
+ RecipeUtils.addShapedGregtechRecipe(
+ "stickLongBlueSteel",
+ "stickBlueSteel",
+ "stickLongBlueSteel",
+ "stickLongBlueSteel",
+ ItemUtils.getSimpleStack(Items.nether_star),
+ "stickLongBlueSteel",
+ "stickBlueSteel",
+ "stickBlueSteel",
+ "stickBlueSteel",
+ hiveFrameBusy);
+
+ // Frame Items added by bartimaeusnek
+ RecipeUtils.addShapedGregtechRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("stickLongTumbaga", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("stickTumbaga", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("stickLongTumbaga", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("stickLongTumbaga", 1),
+ foil_Electrum,
+ ItemUtils.getItemStackOfAmountFromOreDict("stickLongTumbaga", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("stickTumbaga", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("stickTumbaga", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("stickTumbaga", 1),
+ hiveFrameSlow);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "stickLongWroughtIron",
+ "stickWroughtIron",
+ "stickLongWroughtIron",
+ "stickLongWroughtIron",
+ "foilZinc",
+ "stickLongWroughtIron",
+ "stickWroughtIron",
+ "stickWroughtIron",
+ "stickWroughtIron",
+ hiveFrameDecay);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "stickLongOsmiridium",
+ "stickOsmiridium",
+ "stickLongOsmiridium",
+ "stickLongOsmiridium",
+ "foilOsmiridium",
+ "stickLongOsmiridium",
+ "stickOsmiridium",
+ "stickOsmiridium",
+ "stickOsmiridium",
+ hiveFrameStalilize);
+
+ RecipeUtils.addShapedGregtechRecipe(
+ "stickLongWoodSealed",
+ "stickWoodSealed",
+ "stickLongWoodSealed",
+ "stickLongWoodSealed",
+ Items.paper,
+ "stickLongWoodSealed",
+ "stickWoodSealed",
+ "stickWoodSealed",
+ "stickWoodSealed",
+ hiveFrameArborist);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_AlleleBeeSpecies.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_AlleleBeeSpecies.java
new file mode 100644
index 0000000000..05ce6e56e6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_AlleleBeeSpecies.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.xmod.forestry.bees.registry;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.apiculture.IAlleleBeeSpeciesCustom;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IClassification;
+import forestry.apiculture.genetics.alleles.AlleleBeeSpecies;
+
+public class GTPP_AlleleBeeSpecies extends AlleleBeeSpecies {
+
+ public GTPP_AlleleBeeSpecies(String uid, boolean dominant, String unlocalizedName, String authority,
+ String unlocalizedDescription, IClassification branch, String binomial, int primaryColor, int secondaryColor) {
+ super(
+ uid,
+ unlocalizedName,
+ authority,
+ unlocalizedDescription,
+ dominant,
+ branch,
+ binomial,
+ primaryColor,
+ secondaryColor);
+ AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.SPECIES);
+ }
+
+ @Override
+ public IAlleleBeeSpeciesCustom addProduct(ItemStack product, Float chance) {
+ if (product == null || product.getItem() == null) {
+ product = new ItemStack(Items.boat);
+ }
+ if (chance <= 0.0f || chance > 1.0f) {
+ chance = 0.1f;
+ }
+ return super.addProduct(product, chance);
+ }
+
+ @Override
+ public IAlleleBeeSpeciesCustom addSpecialty(ItemStack specialty, Float chance) {
+ if (specialty == null || specialty.getItem() == null) {
+ specialty = new ItemStack(Items.boat);
+ }
+ if (chance <= 0.0f || chance > 1.0f) {
+ chance = 0.1f;
+ }
+ return super.addSpecialty(specialty, chance);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BeeDefinition.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BeeDefinition.java
new file mode 100644
index 0000000000..73418bdab8
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BeeDefinition.java
@@ -0,0 +1,301 @@
+package gtPlusPlus.xmod.forestry.bees.registry;
+
+import static forestry.api.apiculture.EnumBeeChromosome.EFFECT;
+import static forestry.api.apiculture.EnumBeeChromosome.HUMIDITY_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.LIFESPAN;
+import static forestry.api.apiculture.EnumBeeChromosome.SPECIES;
+import static forestry.api.apiculture.EnumBeeChromosome.TEMPERATURE_TOLERANCE;
+import static forestry.api.core.EnumHumidity.ARID;
+import static gregtech.api.enums.Mods.Forestry;
+
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.function.Consumer;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.BiomeDictionary;
+
+import org.apache.commons.lang3.text.WordUtils;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.EnumBeeType;
+import forestry.api.apiculture.IAlleleBeeEffect;
+import forestry.api.apiculture.IAlleleBeeSpecies;
+import forestry.api.apiculture.IBee;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeMutationCustom;
+import forestry.api.core.EnumHumidity;
+import forestry.api.core.EnumTemperature;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IAlleleFlowers;
+import forestry.apiculture.genetics.Bee;
+import forestry.apiculture.genetics.BeeVariation;
+import forestry.apiculture.genetics.IBeeDefinition;
+import forestry.apiculture.genetics.alleles.AlleleEffect;
+import forestry.core.genetics.alleles.AlleleHelper;
+import forestry.core.genetics.alleles.EnumAllele.Lifespan;
+import forestry.core.genetics.alleles.EnumAllele.Tolerance;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.common.items.CombType;
+import gregtech.loaders.misc.GT_Bees;
+import gtPlusPlus.core.material.ELEMENT.STANDALONE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_CombType;
+
+public enum GTPP_BeeDefinition implements IBeeDefinition {
+
+ DRAGONBLOOD(GTPP_BranchDefinition.LEGENDARY, "Dragon Blood", STANDALONE.DRAGON_METAL, true,
+ Utils.rgbtoHexValue(220, 20, 20), Utils.rgbtoHexValue(20, 20, 20), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+ beeSpecies.addSpecialty(GTPP_Bees.combs.getStackForType(GTPP_CombType.DRAGONBLOOD), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectAggressive);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_3);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_3);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation("DRAGONESSENCE", "NEUTRONIUM", 2);
+ tMutation.restrictHumidity(ARID);
+ tMutation.requireResource(STANDALONE.DRAGON_METAL.getBlock(), 1);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
+ }),
+ FORCE(GTPP_BranchDefinition.LEGENDARY, "Force", STANDALONE.FORCE, true, Utils.rgbtoHexValue(250, 250, 20),
+ Utils.rgbtoHexValue(200, 200, 5), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SALT), 0.15f);
+ beeSpecies.addSpecialty(GTPP_Bees.combs.getStackForType(GTPP_CombType.FORCE), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.HOT);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectAggressive);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation("STEEL", "GOLD", 10);
+ tMutation.restrictHumidity(ARID);
+ tMutation.restrictBiomeType(BiomeDictionary.Type.HOT);
+ }),;
+
+ private final GTPP_BranchDefinition branch;
+ private final GTPP_AlleleBeeSpecies species;
+ private final Consumer<GTPP_AlleleBeeSpecies> mSpeciesProperties;
+ private final Consumer<IAllele[]> mAlleles;
+ private final Consumer<GTPP_BeeDefinition> mMutations;
+ private IAllele[] template;
+ private IBeeGenome genome;
+
+ GTPP_BeeDefinition(GTPP_BranchDefinition branch, String binomial, Materials aMat, boolean dominant, int primary,
+ int secondary, Consumer<GTPP_AlleleBeeSpecies> aSpeciesProperties, Consumer<IAllele[]> aAlleles,
+ Consumer<GTPP_BeeDefinition> aMutations) {
+ this(
+ branch,
+ binomial,
+ MaterialUtils.generateMaterialFromGtENUM(aMat),
+ dominant,
+ primary,
+ secondary,
+ aSpeciesProperties,
+ aAlleles,
+ aMutations);
+ }
+
+ GTPP_BeeDefinition(GTPP_BranchDefinition branch, String binomial, Material aMat, boolean dominant, int primary,
+ int secondary, Consumer<GTPP_AlleleBeeSpecies> aSpeciesProperties, Consumer<IAllele[]> aAlleles,
+ Consumer<GTPP_BeeDefinition> aMutations) {
+ this.mAlleles = aAlleles;
+ this.mMutations = aMutations;
+ this.mSpeciesProperties = aSpeciesProperties;
+ String lowercaseName = this.toString()
+ .toLowerCase(Locale.ENGLISH);
+ String species = WordUtils.capitalize(binomial);
+ String uid = "gtpp.bee.species" + species;
+ String description = "for.description." + species;
+ String name = "for.bees.species." + lowercaseName;
+ GT_LanguageManager.addStringLocalization("for.bees.species." + lowercaseName, species, true);
+ GTPP_Bees.sMaterialMappings.put(
+ binomial.toLowerCase()
+ .replaceAll(" ", ""),
+ aMat);
+ this.branch = branch;
+ this.species = new GTPP_AlleleBeeSpecies(
+ uid,
+ dominant,
+ name,
+ "GT++",
+ description,
+ branch.getBranch(),
+ binomial,
+ primary,
+ secondary);
+ }
+
+ public static void initBees() {
+ for (GTPP_BeeDefinition bee : values()) {
+ bee.init();
+ }
+ for (GTPP_BeeDefinition bee : values()) {
+ bee.registerMutations();
+ }
+ }
+
+ private static IAlleleBeeEffect getEffect(byte modid, String name) {
+ String s = switch (modid) {
+ case GTPP_Bees.EXTRABEES -> "extrabees.effect." + name;
+ case GTPP_Bees.GENDUSTRY -> "gendustry.effect." + name;
+ case GTPP_Bees.MAGICBEES -> "magicbees.effect" + name;
+ case GTPP_Bees.GREGTECH -> "gregtech.effect" + name;
+ default -> "forestry.effect" + name;
+ };
+ return (IAlleleBeeEffect) AlleleManager.alleleRegistry.getAllele(s);
+ }
+
+ private static IAlleleFlowers getFlowers(byte modid, String name) {
+ String s = switch (modid) {
+ case GTPP_Bees.EXTRABEES -> "extrabees.flower." + name;
+ case GTPP_Bees.GENDUSTRY -> "gendustry.flower." + name;
+ case GTPP_Bees.MAGICBEES -> "magicbees.flower" + name;
+ case GTPP_Bees.GREGTECH -> "gregtech.flower" + name;
+ default -> "forestry.flowers" + name;
+ };
+ return (IAlleleFlowers) AlleleManager.alleleRegistry.getAllele(s);
+ }
+
+ private static IAlleleBeeSpecies getSpecies(byte modid, String name) {
+ String s = switch (modid) {
+ case GTPP_Bees.EXTRABEES -> "extrabees.species." + name;
+ case GTPP_Bees.GENDUSTRY -> "gendustry.bee." + name;
+ case GTPP_Bees.MAGICBEES -> "magicbees.species" + name;
+ case GTPP_Bees.GREGTECH -> "gregtech.species" + name;
+ default -> "forestry.species" + name;
+ };
+ IAlleleBeeSpecies ret = (IAlleleBeeSpecies) AlleleManager.alleleRegistry.getAllele(s);
+ return ret;
+ }
+
+ private final void setSpeciesProperties(GTPP_AlleleBeeSpecies species2) {
+ this.mSpeciesProperties.accept(species2);
+ }
+
+ private final void setAlleles(IAllele[] template) {
+ this.mAlleles.accept(template);
+ }
+
+ private final void registerMutations() {
+ this.mMutations.accept(this);
+ }
+
+ private void init() {
+ setSpeciesProperties(species);
+
+ template = branch.getTemplate();
+ AlleleHelper.instance.set(template, SPECIES, species);
+ setAlleles(template);
+
+ genome = BeeManager.beeRoot.templateAsGenome(template);
+
+ BeeManager.beeRoot.registerTemplate(template);
+ }
+
+ private final IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, IAlleleBeeSpecies parent2,
+ int chance) {
+ return registerMutation(parent1, parent2, chance, 1f);
+ }
+
+ private final IBeeMutationCustom registerMutation(GTPP_BeeDefinition parent1, IAlleleBeeSpecies parent2,
+ int chance) {
+ return registerMutation(parent1, parent2, chance, 1f);
+ }
+
+ private final IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, GTPP_BeeDefinition parent2,
+ int chance) {
+ return registerMutation(parent1, parent2, chance, 1f);
+ }
+
+ private final IBeeMutationCustom registerMutation(GTPP_BeeDefinition parent1, GTPP_BeeDefinition parent2,
+ int chance) {
+ return registerMutation(parent1, parent2, chance, 1f);
+ }
+
+ private final IBeeMutationCustom registerMutation(String parent1, String parent2, int chance) {
+ return registerMutation(getGregtechBeeType(parent1), getGregtechBeeType(parent2), chance, 1f);
+ }
+
+ /**
+ * Diese neue Funtion erlaubt Mutationsraten unter 1%. Setze dazu die Mutationsrate als Bruch mit chance /
+ * chancedivider This new function allows Mutation percentages under 1%. Set them as a fraction with chance /
+ * chancedivider
+ */
+ private final IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, IAlleleBeeSpecies parent2, int chance,
+ float chancedivider) {
+ return new GTPP_Bee_Mutation(parent1, parent2, this.getTemplate(), chance, chancedivider);
+ }
+
+ private final IBeeMutationCustom registerMutation(GTPP_BeeDefinition parent1, IAlleleBeeSpecies parent2, int chance,
+ float chancedivider) {
+ return registerMutation(parent1.species, parent2, chance, chancedivider);
+ }
+
+ private final IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, GTPP_BeeDefinition parent2, int chance,
+ float chancedivider) {
+ return registerMutation(parent1, parent2.species, chance, chancedivider);
+ }
+
+ private final IBeeMutationCustom registerMutation(GTPP_BeeDefinition parent1, GTPP_BeeDefinition parent2,
+ int chance, float chancedivider) {
+ return registerMutation(parent1.species, parent2, chance, chancedivider);
+ }
+
+ private final IBeeMutationCustom registerMutation(String parent1, String parent2, int chance, float chancedivider) {
+ return registerMutation(getGregtechBeeType(parent1), getGregtechBeeType(parent2), chance, chancedivider);
+ }
+
+ @Override
+ public final IAllele[] getTemplate() {
+ return Arrays.copyOf(template, template.length);
+ }
+
+ @Override
+ public final IBeeGenome getGenome() {
+ return genome;
+ }
+
+ @Override
+ public final IBee getIndividual() {
+ return new Bee(genome);
+ }
+
+ @Override
+ public final ItemStack getMemberStack(EnumBeeType beeType) {
+ return BeeManager.beeRoot.getMemberStack(getIndividual(), beeType.ordinal());
+ }
+
+ public final IBeeDefinition getRainResist() {
+ return new BeeVariation.RainResist(this);
+ }
+
+ private static final Class sGtBees = ReflectionUtils.getClass("gregtech.loaders.misc.GT_BeeDefinition");
+
+ public static IAlleleBeeSpecies getGregtechBeeType(String name) {
+ try {
+ Enum aBeeObject = ReflectionUtils.getEnum(sGtBees, name);
+ Field gtBeesField = ReflectionUtils.getField(sGtBees, "species");
+ IAlleleBeeSpecies beeType = ReflectionUtils.getFieldValue(gtBeesField, aBeeObject);
+ return beeType != null ? beeType : null;
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return null;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bee_Mutation.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bee_Mutation.java
new file mode 100644
index 0000000000..d20b7ffb73
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bee_Mutation.java
@@ -0,0 +1,86 @@
+package gtPlusPlus.xmod.forestry.bees.registry;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.IAlleleBeeSpecies;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeHousing;
+import forestry.api.apiculture.IBeeModifier;
+import forestry.api.core.IClimateProvider;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IGenome;
+import forestry.api.genetics.IMutationCondition;
+import forestry.apiculture.genetics.BeeMutation;
+import forestry.core.genetics.mutations.Mutation;
+
+public class GTPP_Bee_Mutation extends BeeMutation {
+
+ private final float split;
+
+ public GTPP_Bee_Mutation(IAlleleBeeSpecies bee0, IAlleleBeeSpecies bee1, IAllele[] result, int chance,
+ float split) {
+ super(bee0, bee1, result, chance);
+ this.split = split;
+ BeeManager.beeRoot.registerMutation(this);
+ }
+
+ @Override
+ public float getBaseChance() {
+ return super.getBaseChance() / split;
+ }
+
+ @Override
+ public float getChance(IBeeHousing housing, IAlleleBeeSpecies allele0, IAlleleBeeSpecies allele1,
+ IBeeGenome genome0, IBeeGenome genome1) {
+ World world = housing != null ? housing.getWorld() : null;
+ ChunkCoordinates housingCoordinates = housing != null ? housing.getCoordinates() : null;
+ int x = housingCoordinates != null ? housingCoordinates.posX : 0;
+ int y = housingCoordinates != null ? housingCoordinates.posY : 0;
+ int z = housingCoordinates != null ? housingCoordinates.posZ : 0;
+
+ float processedChance = getBasicChance(world, x, y, z, allele0, allele1, genome0, genome1, housing);
+
+ if (processedChance <= 0f) {
+ return 0f;
+ }
+
+ IBeeModifier beeHousingModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
+ IBeeModifier beeModeModifier = BeeManager.beeRoot.getBeekeepingMode(world)
+ .getBeeModifier();
+
+ processedChance *= beeHousingModifier.getMutationModifier(genome0, genome1, processedChance);
+ processedChance *= beeModeModifier.getMutationModifier(genome0, genome1, processedChance);
+
+ return processedChance;
+ }
+
+ @SuppressWarnings("unchecked")
+ private float getBasicChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
+ IGenome genome1, IClimateProvider climate) {
+ float mutationChance = this.getBaseChance();
+ List<IMutationCondition> mutationConditions = null;
+ Field f = FieldUtils.getDeclaredField(Mutation.class, "mutationConditions", true);
+ if (f == null) f = FieldUtils.getField(Mutation.class, "mutationConditions", true);
+ if (f == null) return mutationChance;
+ try {
+ mutationConditions = f.get(this) instanceof List ? (List<IMutationCondition>) f.get(this) : null;
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ if (mutationConditions != null) for (IMutationCondition mutationCondition : mutationConditions) {
+ mutationChance *= mutationCondition.getChance(world, x, y, z, allele0, allele1, genome0, genome1, climate);
+ if (mutationChance == 0) {
+ return 0;
+ }
+ }
+ return mutationChance;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bees.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bees.java
new file mode 100644
index 0000000000..77b7d57954
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_Bees.java
@@ -0,0 +1,69 @@
+package gtPlusPlus.xmod.forestry.bees.registry;
+
+import static gregtech.api.enums.Mods.Forestry;
+
+import java.util.HashMap;
+
+import gregtech.GT_Mod;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_CombType;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_DropType;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_PollenType;
+import gtPlusPlus.xmod.forestry.bees.handler.GTPP_PropolisType;
+import gtPlusPlus.xmod.forestry.bees.items.output.GTPP_Comb;
+import gtPlusPlus.xmod.forestry.bees.items.output.GTPP_Drop;
+import gtPlusPlus.xmod.forestry.bees.items.output.GTPP_Pollen;
+import gtPlusPlus.xmod.forestry.bees.items.output.GTPP_Propolis;
+
+public class GTPP_Bees {
+
+ public static final byte FORESTRY = 0;
+ public static final byte EXTRABEES = 1;
+ public static final byte GENDUSTRY = 2;
+ public static final byte MAGICBEES = 3;
+ public static final byte GREGTECH = 4;
+
+ public static GTPP_Propolis propolis;
+ public static GTPP_Pollen pollen;
+ public static GTPP_Drop drop;
+ public static GTPP_Comb combs;
+
+ public static HashMap<String, Material> sMaterialMappings = new HashMap<>();
+ public static HashMap<Integer, GTPP_PropolisType> sPropolisMappings = new HashMap<>();
+ public static HashMap<Integer, GTPP_PollenType> sPollenMappings = new HashMap<>();
+ public static HashMap<Integer, GTPP_DropType> sDropMappings = new HashMap<>();
+ public static HashMap<Integer, GTPP_CombType> sCombMappings = new HashMap<>();
+
+ public GTPP_Bees() {
+ if (Forestry.isModLoaded() && GT_Mod.gregtechproxy.mGTBees) {
+ Logger.BEES("Creating required items.");
+ propolis = new GTPP_Propolis();
+ pollen = new GTPP_Pollen();
+ drop = new GTPP_Drop();
+ combs = new GTPP_Comb();
+
+ Logger.BEES("Loading types.");
+ initTypes();
+
+ Logger.BEES("Adding recipes.");
+ GTPP_Drop.initDropsRecipes();
+ GTPP_Propolis.initPropolisRecipes();
+ GTPP_Comb.initCombsRecipes();
+
+ Logger.BEES("Initialising bees.");
+ GTPP_BeeDefinition.initBees();
+
+ Logger.BEES("Done!");
+ }
+ }
+
+ private static void initTypes() {
+ ReflectionUtils.loadClass("gtPlusPlus.xmod.forestry.bees.registry.GTPP_BeeDefinition");
+ ReflectionUtils.loadClass("gtPlusPlus.xmod.forestry.bees.handler.GTPP_CombType");
+ ReflectionUtils.loadClass("gtPlusPlus.xmod.forestry.bees.handler.GTPP_DropType");
+ ReflectionUtils.loadClass("gtPlusPlus.xmod.forestry.bees.handler.GTPP_PollenType");
+ ReflectionUtils.loadClass("gtPlusPlus.xmod.forestry.bees.handler.GTPP_PropolisType");
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BranchDefinition.java b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BranchDefinition.java
new file mode 100644
index 0000000000..39af813dec
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/forestry/bees/registry/GTPP_BranchDefinition.java
@@ -0,0 +1,89 @@
+package gtPlusPlus.xmod.forestry.bees.registry;
+
+import static forestry.api.apiculture.EnumBeeChromosome.CAVE_DWELLING;
+import static forestry.api.apiculture.EnumBeeChromosome.EFFECT;
+import static forestry.api.apiculture.EnumBeeChromosome.FERTILITY;
+import static forestry.api.apiculture.EnumBeeChromosome.FLOWERING;
+import static forestry.api.apiculture.EnumBeeChromosome.FLOWER_PROVIDER;
+import static forestry.api.apiculture.EnumBeeChromosome.HUMIDITY_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.LIFESPAN;
+import static forestry.api.apiculture.EnumBeeChromosome.NOCTURNAL;
+import static forestry.api.apiculture.EnumBeeChromosome.SPEED;
+import static forestry.api.apiculture.EnumBeeChromosome.TEMPERATURE_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.TERRITORY;
+import static forestry.api.apiculture.EnumBeeChromosome.TOLERANT_FLYER;
+
+import java.util.Arrays;
+import java.util.function.Consumer;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IClassification;
+import forestry.apiculture.genetics.alleles.AlleleEffect;
+import forestry.core.genetics.alleles.AlleleHelper;
+import forestry.core.genetics.alleles.EnumAllele.Fertility;
+import forestry.core.genetics.alleles.EnumAllele.Flowering;
+import forestry.core.genetics.alleles.EnumAllele.Flowers;
+import forestry.core.genetics.alleles.EnumAllele.Lifespan;
+import forestry.core.genetics.alleles.EnumAllele.Speed;
+import forestry.core.genetics.alleles.EnumAllele.Territory;
+import forestry.core.genetics.alleles.EnumAllele.Tolerance;
+
+public enum GTPP_BranchDefinition {
+
+ LEGENDARY("gtpp.legendary", "Summa Potestas", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_2);
+ AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_2);
+ AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+ AlleleHelper.instance.set(alleles, NOCTURNAL, true);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.END);
+ AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.SLOW);
+ AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
+ AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGER);
+ });
+
+ private static IAllele[] defaultTemplate;
+ private final IClassification branch;
+ private final Consumer<IAllele[]> mBranchProperties;
+
+ GTPP_BranchDefinition(String internal, String scientific, Consumer<IAllele[]> aBranchProperties) {
+ this.branch = BeeManager.beeFactory.createBranch(internal.toLowerCase(), scientific);
+ this.mBranchProperties = aBranchProperties;
+ }
+
+ private static IAllele[] getDefaultTemplate() {
+ if (defaultTemplate == null) {
+ defaultTemplate = new IAllele[EnumBeeChromosome.values().length];
+
+ AlleleHelper.instance.set(defaultTemplate, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(defaultTemplate, LIFESPAN, Lifespan.SHORTER);
+ AlleleHelper.instance.set(defaultTemplate, FERTILITY, Fertility.NORMAL);
+ AlleleHelper.instance.set(defaultTemplate, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(defaultTemplate, NOCTURNAL, false);
+ AlleleHelper.instance.set(defaultTemplate, HUMIDITY_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(defaultTemplate, TOLERANT_FLYER, false);
+ AlleleHelper.instance.set(defaultTemplate, CAVE_DWELLING, false);
+ AlleleHelper.instance.set(defaultTemplate, FLOWER_PROVIDER, Flowers.VANILLA);
+ AlleleHelper.instance.set(defaultTemplate, FLOWERING, Flowering.SLOWEST);
+ AlleleHelper.instance.set(defaultTemplate, TERRITORY, Territory.AVERAGE);
+ AlleleHelper.instance.set(defaultTemplate, EFFECT, AlleleEffect.effectNone);
+ }
+ return Arrays.copyOf(defaultTemplate, defaultTemplate.length);
+ }
+
+ private final void setBranchProperties(IAllele[] template) {
+ this.mBranchProperties.accept(template);
+ }
+
+ public final IAllele[] getTemplate() {
+ IAllele[] template = getDefaultTemplate();
+ setBranchProperties(template);
+ return template;
+ }
+
+ public final IClassification getBranch() {
+ return branch;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/HANDLER_GT.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/HANDLER_GT.java
new file mode 100644
index 0000000000..e95baf43df
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/HANDLER_GT.java
@@ -0,0 +1,98 @@
+package gtPlusPlus.xmod.gregtech;
+
+import static gregtech.api.enums.Mods.AdvancedSolarPanel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import gregtech.api.GregTech_API;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_Config;
+import gtPlusPlus.core.handler.COMPAT_HANDLER;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.everglades.gen.gt.WorldGen_GT;
+import gtPlusPlus.recipes.CokeAndPyrolyseOven;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+import gtPlusPlus.xmod.gregtech.api.util.GTPP_Config;
+import gtPlusPlus.xmod.gregtech.common.Meta_GT_Proxy;
+import gtPlusPlus.xmod.gregtech.common.blocks.fluid.GregtechFluidHandler;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+import gtPlusPlus.xmod.gregtech.loaders.Gregtech_Blocks;
+import gtPlusPlus.xmod.gregtech.loaders.ProcessingAngleGrinder;
+import gtPlusPlus.xmod.gregtech.loaders.ProcessingElectricSnips;
+import gtPlusPlus.xmod.gregtech.loaders.misc.AddCustomMachineToPA;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_AlgaeFarm;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_MolecularTransformer;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_TreeFarm;
+import gtPlusPlus.xmod.gregtech.registration.gregtech.GregtechConduits;
+
+public class HANDLER_GT {
+
+ public static GT_Config mMaterialProperties = null;
+ public static GTPP_Config sCustomWorldgenFile = null;
+ public static final List<WorldGen_GT> sWorldgenListEverglades = new ArrayList<>();
+ public static GT_MetaGenerated_Tool sMetaGeneratedToolInstance;
+
+ public static void preInit() {
+
+ if (mMaterialProperties != null) {
+ GT_Materials.init(mMaterialProperties);
+ }
+
+ GregtechFluidHandler.run();
+ }
+
+ public static void init() {
+
+ // Load General Blocks and set up some Basic Meta Tile Entity states
+ Gregtech_Blocks.run();
+
+ // Add Custom Pipes, Wires and Cables.
+ GregtechConduits.run();
+
+ // Register Tile Entities
+ COMPAT_HANDLER.registerGregtechMachines();
+
+ sMetaGeneratedToolInstance = MetaGeneratedGregtechTools.getInstance();
+ }
+
+ public static void postInit() {
+
+ // Only loads if the config option is true (default: true)
+ new ProcessingAngleGrinder().run();
+ new ProcessingElectricSnips().run();
+
+ // Add recipes
+ CokeAndPyrolyseOven.postInit();
+
+ // Register custom singles to the PA
+ AddCustomMachineToPA.register();
+
+ // Register some custom recipe maps for any enabled multiblocks.
+ // MultiblockRecipeMapHandler.run();
+
+ if (GregtechItemList.Circuit_BioRecipeSelector.hasBeenSet()) {
+ for (int i = 1; i <= 24; i++) {
+ GregTech_API.registerConfigurationCircuit(CI.getNumberedBioCircuit(i), 0);
+ }
+ }
+
+ if (GregtechItemList.Circuit_T3RecipeSelector.hasBeenSet()) {
+ for (int i = 1; i <= 24; i++) {
+ GregTech_API.registerConfigurationCircuit(CI.getNumberedAdvancedCircuit(i), 3);
+ }
+ }
+ }
+
+ public static void onLoadComplete(FMLLoadCompleteEvent event) {
+ CokeAndPyrolyseOven.onLoadComplete();
+ Meta_GT_Proxy.fixIC2FluidNames();
+ RecipeLoader_AlgaeFarm.generateRecipes();
+ RecipeLoader_TreeFarm.generateRecipes();
+ if (AdvancedSolarPanel.isModLoaded()) {
+ RecipeLoader_MolecularTransformer.run();
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechItemList.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechItemList.java
new file mode 100644
index 0000000000..6367d22f77
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechItemList.java
@@ -0,0 +1,980 @@
+package gtPlusPlus.xmod.gregtech.api.enums;
+
+import static gregtech.api.enums.GT_Values.W;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.xmod.gregtech.api.interfaces.GregtechItemContainer;
+
+/**
+ * Class containing all non-OreDict Items of GregTech.
+ */
+public enum GregtechItemList implements GregtechItemContainer {
+
+ /**
+ * Items
+ */
+
+ // Advanced Hazmat Suit
+ Armour_Hazmat_Advanced_Helmet,
+ Armour_Hazmat_Advanced_Chest,
+ Armour_Hazmat_Advanced_Legs,
+ Armour_Hazmat_Advanced_Boots,
+
+ // Gregtech Machine Parts
+ Electric_Motor_LuV,
+ Electric_Motor_ZPM,
+ Electric_Motor_UV,
+ Electric_Pump_LuV,
+ Electric_Pump_ZPM,
+ Electric_Pump_UV,
+ Conveyor_Module_LuV,
+ Conveyor_Module_ZPM,
+ Conveyor_Module_UV,
+ Electric_Piston_LuV,
+ Electric_Piston_ZPM,
+ Electric_Piston_UV,
+ Robot_Arm_LuV,
+ Robot_Arm_ZPM,
+ Robot_Arm_UV,
+ Field_Generator_LuV,
+ Field_Generator_ZPM,
+ Field_Generator_UV,
+ Emitter_LuV,
+ Emitter_ZPM,
+ Emitter_UV,
+ Sensor_LuV,
+ Sensor_ZPM,
+ Sensor_UV,
+
+ // Mixed Components
+ TransmissionComponent_LV,
+ TransmissionComponent_MV,
+ TransmissionComponent_HV,
+ TransmissionComponent_EV,
+ TransmissionComponent_IV,
+ TransmissionComponent_LuV,
+ TransmissionComponent_ZPM,
+ TransmissionComponent_UV,
+ TransmissionComponent_UHV,
+
+ // Recipe Circuit
+ Circuit_BioRecipeSelector,
+ Circuit_T3RecipeSelector,
+
+ // Circuits
+ Old_Circuit_Primitive,
+ Old_Circuit_Basic,
+ Old_Circuit_Good,
+ Old_Circuit_Advanced,
+ Old_Circuit_Data,
+ Old_Circuit_Elite,
+ Old_Circuit_Master,
+ Old_Tool_DataOrb,
+ Old_Circuit_Ultimate,
+ Old_Tool_DataStick,
+ Circuit_IV,
+ Circuit_LuV,
+ Circuit_ZPM,
+
+ // Circuit Parts
+ Circuit_Board_IV,
+ Circuit_Board_LuV,
+ Circuit_Board_ZPM,
+ Circuit_Parts_Crystal_Chip_IV,
+ Circuit_Parts_Crystal_Chip_LuV,
+ Circuit_Parts_Crystal_Chip_ZPM,
+ Circuit_Parts_IV,
+ Circuit_Parts_LuV,
+ Circuit_Parts_ZPM,
+ Circuit_Parts_Wiring_IV,
+ Circuit_Parts_Wiring_LuV,
+ Circuit_Parts_Wiring_ZPM,
+
+ // Old Style Circuits
+ Old_Circuit_Board_Basic,
+ Old_Circuit_Board_Advanced,
+ Old_Circuit_Board_Elite,
+ Old_Circuit_Parts_Crystal_Chip_Elite,
+ Old_Circuit_Parts_Crystal_Chip_Master,
+ Old_Circuit_Parts_Advanced,
+ Old_Circuit_Parts_Wiring_Basic,
+ Old_Circuit_Parts_Wiring_Advanced,
+ Old_Circuit_Parts_Wiring_Elite,
+ Old_Empty_Board_Basic,
+ Old_Empty_Board_Elite,
+
+ // Batteries
+ Battery_RE_EV_Sodium,
+ Battery_RE_EV_Cadmium,
+ Battery_RE_EV_Lithium,
+
+ // Shapes for Extruder
+ Shape_Extruder_WindmillShaft,
+ Shape_Extruder_SmallGear,
+
+ // Cooked Raisin Toast for ImQ009
+ Food_Baked_Raisin_Bread,
+
+ // Fluid Cells to regulate flows.
+ Fluid_Cell_1L,
+ Fluid_Cell_16L,
+ Fluid_Cell_36L,
+ Fluid_Cell_144L,
+
+ // Debug
+ TESTITEM,
+
+ // Larger Volumetric Flasks
+ VOLUMETRIC_FLASK_8k,
+ VOLUMETRIC_FLASK_32k,
+
+ // RTG Fuels
+ Pellet_RTG_PU238,
+ Pellet_RTG_SR90,
+ Pellet_RTG_PO210,
+ Pellet_RTG_AM241,
+
+ // Computer Cube
+ Gregtech_Computer_Cube,
+
+ // Casings for batteries
+ Battery_Casing_Gem_1,
+ Battery_Casing_Gem_2,
+ Battery_Casing_Gem_3,
+ Battery_Casing_Gem_4,
+
+ // Custom Batteries
+ Battery_Gem_1,
+ Battery_Gem_2,
+ Battery_Gem_3,
+ Battery_Gem_4,
+
+ // Compressed Fusion MK3
+ Compressed_Fusion_Reactor,
+
+ // Carbon Materials
+
+ // End Game Laser Engraver Lens
+ Laser_Lens_WoodsGlass,
+ Laser_Lens_Special,
+
+ // Pellet Mold
+ Pellet_Mold,
+
+ // Upgrade chip for Distillus
+ Distillus_Upgrade_Chip,
+ Maceration_Upgrade_Chip,
+
+ // Milling Balls
+ Milling_Ball_Alumina,
+ Milling_Ball_Soapstone,
+
+ // ----------------------------------------------------------------------------
+
+ /**
+ * MultiBlocks
+ */
+
+ // Tier GT++ Casings
+ GTPP_Casing_ULV,
+ GTPP_Casing_LV,
+ GTPP_Casing_MV,
+ GTPP_Casing_HV,
+ GTPP_Casing_EV,
+ GTPP_Casing_IV,
+ GTPP_Casing_LuV,
+ GTPP_Casing_ZPM,
+ GTPP_Casing_UV,
+ GTPP_Casing_UHV,
+
+ // IronBlastFurnace Machine_Bronze_BlastFurnace
+ Casing_IronPlatedBricks,
+
+ // Large Centrifuge
+ Industrial_Centrifuge,
+ Casing_Centrifuge1,
+
+ // Large Alloy Smelter
+ Industrial_AlloySmelter,
+
+ // Coke Oven
+ Industrial_CokeOven,
+ Casing_CokeOven,
+ Casing_CokeOven_Coil1,
+ Casing_CokeOven_Coil2,
+
+ // Bending Maching // Plate Press // Press
+ Industrial_PlatePress,
+ Casing_MaterialPress,
+
+ // Matter Fab
+ Industrial_MassFab,
+ Casing_MatterGen,
+ Casing_MatterFab,
+
+ // ABS
+ Industrial_AlloyBlastSmelter,
+ Casing_Coil_BlastSmelter,
+ Casing_BlastSmelter,
+ Mega_AlloyBlastSmelter,
+
+ // Quantum Force Transformer
+ QuantumForceTransformer,
+ Casing_Coil_QuantumForceTransformer,
+ NeutronPulseManipulator,
+ CosmicFabricManipulator,
+ InfinityInfusedManipulator,
+ SpaceTimeContinuumRipper,
+ NeutronShieldingCore,
+ CosmicFabricShieldingCore,
+ InfinityInfusedShieldingCore,
+ SpaceTimeBendingCore,
+ ForceFieldGlass,
+
+ // Industrial Electrolyzer
+ Industrial_Electrolyzer,
+ Casing_Electrolyzer,
+
+ // Industrial Maceration Stack
+ Industrial_MacerationStack,
+ Casing_MacerationStack,
+
+ // Industrial Wire Factory
+ Industrial_WireFactory,
+ Casing_WireFactory,
+
+ // Power sub-station for mass storage. 3 hatches for input and output, whatever voltages you desire.
+ PowerSubStation,
+ Casing_Vanadium_Redox,
+ Casing_Vanadium_Redox_IV,
+ Casing_Vanadium_Redox_LuV,
+ Casing_Vanadium_Redox_ZPM,
+ Casing_Vanadium_Redox_UV,
+ Casing_Vanadium_Redox_MAX,
+ Casing_Power_SubStation,
+
+ // LFTR
+ ThoriumReactor,
+ Casing_Reactor_I,
+ Casing_Reactor_II,
+
+ // Nuclear Salt Processing Plant
+ Nuclear_Salt_Processing_Plant,
+
+ // Multitank
+ /* Industrial_MultiTank, */
+ Industrial_MultiTankDense,
+ Casing_MultitankExterior,
+
+ // Fission Fuel Refinery
+ Industrial_FuelRefinery,
+ Casing_Refinery_External,
+ Casing_Refinery_Structural,
+ Casing_Refinery_Internal,
+
+ // Industrial Sifter
+ Industrial_Sifter,
+ Casing_Sifter,
+ Casing_SifterGrate,
+
+ // Large Thermal Centrifuge
+ Industrial_ThermalCentrifuge,
+ Casing_ThermalCentrifuge,
+
+ // Cyclotron
+ COMET_Cyclotron,
+ Casing_Cyclotron_Coil,
+ Casing_Cyclotron_External,
+
+ // Thermal Boiler
+ GT4_Thermal_Boiler,
+ Casing_ThermalContainment,
+
+ // Tree Farm
+ Industrial_TreeFarm,
+ TreeFarmer_Structural,
+ Casing_PLACEHOLDER_TreeFarmer,
+
+ // Fish Pond
+ Industrial_FishingPond,
+ Casing_FishPond,
+
+ // Algae
+ AlgaeFarm_Controller,
+
+ // Chemical Plant
+ ChemicalPlant_Controller,
+
+ // GT4 autoCrafter
+ GT4_Multi_Crafter,
+ Casing_Autocrafter,
+
+ // industrial Ore-Washer
+ Industrial_WashPlant,
+ Casing_WashPlant,
+
+ // Cutting Factory Controller
+ Industrial_CuttingFactoryController,
+ Casing_CuttingFactoryFrame,
+
+ // Large Extruder
+ Industrial_Extruder,
+ Casing_Extruder,
+
+ // Multi-Machine
+ Industrial_MultiMachine,
+ Casing_Multi_Use,
+
+ // Bedrock Mining Platforms
+ /* BedrockMiner_MKI, */
+ /* BedrockMiner_MKII, */
+ /* BedrockMiner_MKIII, */
+ Casing_BedrockMiner,
+
+ // Large Packager
+ Amazon_Warehouse_Controller,
+ Casing_AmazonWarehouse,
+
+ // Advanced GT vanilla Multis
+ Machine_Adv_BlastFurnace,
+ Casing_Adv_BlastFurnace,
+ Machine_Adv_ImplosionCompressor,
+ Machine_Adv_DistillationTower,
+
+ // Advanced Vacuum Freezer
+ Industrial_Cryogenic_Freezer,
+ Casing_AdvancedVacuum,
+
+ // FusionTek MK IV
+ FusionComputer_UV2,
+ Casing_Fusion_External,
+ Casing_Fusion_Internal,
+
+ // FusionTech MK V
+
+ FusionComputer_UV3,
+ Casing_Fusion_External2,
+ Casing_Fusion_Internal2,
+
+ // large mixer
+ Industrial_Mixer,
+
+ // Naq Reactor
+ Casing_Naq_Reactor_A,
+ Casing_Naq_Reactor_B,
+ Casing_Naq_Reactor_C,
+ /* Controller_Naq_Reactor, */
+ Casing_Containment,
+
+ // Arc Furnace
+ Industrial_Arc_Furnace,
+ Casing_Industrial_Arc_Furnace,
+
+ // Solar Tower
+ Industrial_Solar_Tower,
+ Casing_SolarTower_Structural,
+ Casing_SolarTower_SaltContainment,
+ Casing_SolarTower_HeatContainment,
+
+ // Larger Turbines
+ Large_Steam_Turbine,
+ Large_HPSteam_Turbine,
+ Large_Gas_Turbine,
+ Large_Plasma_Turbine,
+ Large_SCSteam_Turbine,
+ Casing_Turbine_Shaft,
+ Casing_Turbine_LP,
+ Casing_Turbine_HP,
+ Casing_Turbine_Gas,
+ Casing_Turbine_Plasma,
+ Casing_Turbine_SC,
+ XL_HeatExchanger,
+ Casing_XL_HeatExchanger,
+
+ // Large Engine
+ Casing_Reinforced_Engine_Casing,
+
+ // Large Vacuum Furnace
+ Casing_Vacuum_Furnace,
+ Controller_Vacuum_Furnace,
+
+ // Large Rocket Engine
+ Casing_RocketEngine,
+ Controller_RocketEngine,
+
+ // Large Semi-Fluid
+ Controller_LargeSemifluidGenerator,
+
+ // IsaMill
+ Controller_IsaMill,
+ Casing_IsaMill_Casing,
+ Casing_IsaMill_Gearbox,
+ Casing_IsaMill_Pipe,
+
+ // Flotation Cell
+ Controller_Flotation_Cell,
+ Casing_Flotation_Cell,
+
+ // Sparge Tower
+ Controller_Sparge_Tower,
+ Casing_Sparge_Tower_Exterior,
+ Casing_Sparge_Tower_Interior,
+
+ // Elemental Duplicator
+ Controller_ElementalDuplicator,
+ Casing_ElementalDuplicator,
+
+ // Forge Hammer
+ Controller_IndustrialForgeHammer,
+ Casing_IndustrialForgeHammer,
+
+ // Molecular Transformer
+ Controller_MolecularTransformer,
+ Casing_Molecular_Transformer_1,
+ Casing_Molecular_Transformer_2,
+ Casing_Molecular_Transformer_3,
+
+ // Big Steam Macerator
+ Controller_SteamMaceratorMulti,
+ // Big Steam Compressor
+ Controller_SteamCompressorMulti,
+
+ // Industrial Rock Breaker
+ Controller_IndustrialRockBreaker,
+
+ // Industrial Chisel
+ Controller_IndustrialAutoChisel,
+ Casing_IndustrialAutoChisel,
+
+ // Industrial Fluid Heater
+ Controller_IndustrialFluidHeater,
+
+ // Custom Machine Casings
+ Casing_Machine_Custom_1,
+ Casing_Machine_Custom_2,
+ Casing_Machine_Custom_3,
+ Casing_Machine_Custom_4,
+ Casing_Machine_Custom_5,
+ Casing_Machine_Custom_6,
+
+ // ----------------------------------------------------------------------------
+
+ /**
+ * Custom hatches/Busses
+ */
+
+ // Buffer Dynamos
+ Hatch_Buffer_Dynamo_ULV,
+ Hatch_Buffer_Dynamo_LV,
+ Hatch_Buffer_Dynamo_MV,
+ Hatch_Buffer_Dynamo_HV,
+ Hatch_Buffer_Dynamo_EV,
+ Hatch_Buffer_Dynamo_IV,
+ Hatch_Buffer_Dynamo_LuV,
+ Hatch_Buffer_Dynamo_ZPM,
+ Hatch_Buffer_Dynamo_UV,
+ Hatch_Buffer_Dynamo_MAX,
+
+ // Air Intake hatch
+ Hatch_Air_Intake,
+ Hatch_Air_Intake_Extreme,
+
+ // Reservoir Hatch
+ Hatch_Reservoir,
+
+ // XL Turbine Rotor Hatch
+ Hatch_Turbine_Rotor,
+
+ // Standard Turbine Rotor Hatch
+ Hatch_Input_TurbineHousing,
+
+ // Milling Ball Bus
+ Bus_Milling_Balls,
+
+ // Catalyst Bus
+ Bus_Catalysts,
+
+ // Custom Fluid Hatches
+ Hatch_Input_Cryotheum,
+ Hatch_Input_Pyrotheum,
+ Hatch_Input_Naquadah,
+ Hatch_Input_Steam,
+
+ // Steam Multi Buses
+ Hatch_Input_Bus_Steam,
+ Hatch_Output_Bus_Steam,
+
+ // Elemental Duplicator Data Orb Bus
+ Hatch_Input_Elemental_Duplicator,
+
+ // RTG Hatch
+
+ // Battery hatches for PSS
+ Hatch_Input_Battery_MV,
+ Hatch_Input_Battery_EV,
+ Hatch_Output_Battery_MV,
+ Hatch_Output_Battery_EV,
+
+ // Advanced Mufflers
+ Hatch_Muffler_Adv_LV,
+ Hatch_Muffler_Adv_MV,
+ Hatch_Muffler_Adv_HV,
+ Hatch_Muffler_Adv_EV,
+ Hatch_Muffler_Adv_IV,
+ Hatch_Muffler_Adv_LuV,
+ Hatch_Muffler_Adv_ZPM,
+ Hatch_Muffler_Adv_UV,
+ Hatch_Muffler_Adv_MAX,
+
+ // Super Input Busses
+ Hatch_SuperBus_Input_LV,
+ Hatch_SuperBus_Input_MV,
+ Hatch_SuperBus_Input_HV,
+ Hatch_SuperBus_Input_EV,
+ Hatch_SuperBus_Input_IV,
+ Hatch_SuperBus_Input_LuV,
+ Hatch_SuperBus_Input_ZPM,
+ Hatch_SuperBus_Input_UV,
+ Hatch_SuperBus_Input_MAX,
+
+ // Super Output Busses
+ Hatch_SuperBus_Output_LV,
+ Hatch_SuperBus_Output_MV,
+ Hatch_SuperBus_Output_HV,
+ Hatch_SuperBus_Output_EV,
+ Hatch_SuperBus_Output_IV,
+ Hatch_SuperBus_Output_LuV,
+ Hatch_SuperBus_Output_ZPM,
+ Hatch_SuperBus_Output_UV,
+ Hatch_SuperBus_Output_MAX,
+
+ // Chisel Buses for Industrial Chisel
+ GT_MetaTileEntity_ChiselBus_LV,
+ GT_MetaTileEntity_ChiselBus_MV,
+ GT_MetaTileEntity_ChiselBus_HV,
+
+ // Solidifier Hatches for Industrial Multi Machine
+ GT_MetaTileEntity_Solidifier_I,
+ GT_MetaTileEntity_Solidifier_II,
+ GT_MetaTileEntity_Solidifier_III,
+ GT_MetaTileEntity_Solidifier_IV,
+
+ // ----------------------------------------------------------------------------
+
+ /**
+ * Blocks
+ */
+ ResonanceChamber_I,
+ ResonanceChamber_II,
+ ResonanceChamber_III,
+ ResonanceChamber_IV,
+
+ Modulator_I,
+ Modulator_II,
+ Modulator_III,
+ Modulator_IV,
+
+ // ----------------------------------------------------------------------------
+
+ /**
+ * Single Block Tile Entities
+ */
+
+ // Crate Box
+ CrateStorage,
+
+ // Auto TC Research Creator
+ Thaumcraft_Researcher,
+
+ // infinite Items
+ Infinite_Item_Chest,
+
+ // GT4 automation
+ GT4_Electric_Auto_Workbench_LV,
+ GT4_Electric_Auto_Workbench_MV,
+ GT4_Electric_Auto_Workbench_HV,
+ GT4_Electric_Auto_Workbench_EV,
+ GT4_Electric_Auto_Workbench_IV,
+ GT4_Electric_Auto_Workbench_LuV,
+ GT4_Electric_Auto_Workbench_ZPM,
+ GT4_Electric_Auto_Workbench_UV,
+ GT4_Electric_Inventory_Manager_LV,
+ GT4_Electric_Inventory_Manager_MV,
+ GT4_Electric_Inventory_Manager_HV,
+ GT4_Electric_Inventory_Manager_EV,
+ GT4_Electric_Inventory_Manager_IV,
+ GT4_Electric_Inventory_Manager_LuV,
+ GT4_Electric_Inventory_Manager_ZPM,
+ GT4_Electric_Inventory_Manager_UV,
+
+ // GT4 Crop Harvester
+ GT4_Crop_Harvester_LV,
+ GT4_Crop_Harvester_MV,
+ GT4_Crop_Harvester_HV,
+ GT4_Crop_Harvester_EV,
+ GT4_Crop_Harvester_IV,
+ GT4_Crop_Harvester_LuV,
+ GT4_Crop_Harvester_ZPM,
+ GT4_Crop_Harvester_UV,
+
+ // Geothermal Engines
+ Geothermal_Engine_EV,
+ Geothermal_Engine_IV,
+ Geothermal_Engine_LuV,
+
+ // Tesseracts
+ GT4_Tesseract_Generator,
+ GT4_Tesseract_Terminal,
+
+ // Advanced Boilers
+ Boiler_Advanced_LV,
+ Boiler_Advanced_MV,
+ Boiler_Advanced_HV,
+
+ // Fancy Pollution Devices
+ Pollution_Detector,
+ Pollution_Cleaner_LV,
+ Pollution_Cleaner_MV,
+ Pollution_Cleaner_HV,
+ Pollution_Cleaner_EV,
+ Pollution_Cleaner_IV,
+ Pollution_Cleaner_LuV,
+ Pollution_Cleaner_ZPM,
+ Pollution_Cleaner_UV,
+ Pollution_Cleaner_MAX,
+
+ // Debug machine
+ Pollution_Creator,
+
+ // Basically is an automatic Cauldron
+ SimpleDustWasher_ULV,
+ SimpleDustWasher_MV,
+ SimpleDustWasher_EV,
+ SimpleDustWasher_LuV,
+ SimpleDustWasher_UV,
+
+ // Solar Tower Reflector
+ Solar_Tower_Reflector,
+
+ // Super Tier Chests
+ Super_Chest_LV,
+ Super_Chest_MV,
+ Super_Chest_HV,
+ Super_Chest_EV,
+ Super_Chest_IV,
+
+ // Wireless Chargers
+ Charger_LV,
+ Charger_MV,
+ Charger_HV,
+ Charger_EV,
+ Charger_IV,
+ Charger_LuV,
+ Charger_ZPM,
+ Charger_UV,
+ Charger_UHV,
+
+ // Reactor Processing Unit
+ ReactorProcessingUnit_IV,
+ ReactorProcessingUnit_ZPM,
+
+ // Cold Trap
+ ColdTrap_IV,
+ ColdTrap_ZPM,
+
+ // Solar Generators
+ GT_Solar_ULV,
+ GT_Solar_LV,
+ GT_Solar_MV,
+ GT_Solar_HV,
+ GT_Solar_EV,
+ GT_Solar_IV,
+ GT_Solar_LuV,
+ GT_Solar_ZPM,
+ GT_Solar_UV,
+ GT_Solar_MAX,
+
+ // Variable voltage RF convertor
+ Energy_Buffer_1by1_ULV,
+ Energy_Buffer_1by1_LV,
+ Energy_Buffer_1by1_MV,
+ Energy_Buffer_1by1_HV,
+ Energy_Buffer_1by1_EV,
+ Energy_Buffer_1by1_IV,
+ Energy_Buffer_1by1_LuV,
+ Energy_Buffer_1by1_ZPM,
+ Energy_Buffer_1by1_UV,
+ Energy_Buffer_1by1_MAX,
+
+ // Rocket Engines
+ Rocket_Engine_EV,
+ Rocket_Engine_IV,
+ Rocket_Engine_LuV,
+
+ // Hi Amp Transformers
+ Transformer_HA_LV_ULV,
+ Transformer_HA_MV_LV,
+ Transformer_HA_HV_MV,
+ Transformer_HA_EV_HV,
+ Transformer_HA_IV_EV,
+ Transformer_HA_LuV_IV,
+ Transformer_HA_ZPM_LuV,
+ Transformer_HA_UV_ZPM,
+ Transformer_HA_MAX_UV,
+
+ // Semi-Fluid generators
+ Generator_SemiFluid_LV,
+ Generator_SemiFluid_MV,
+ Generator_SemiFluid_HV,
+ Generator_SemiFluid_EV,
+ Generator_SemiFluid_IV,
+
+ // Advanced Mixer 4x4
+ Machine_Advanced_LV_Mixer,
+ Machine_Advanced_MV_Mixer,
+ Machine_Advanced_HV_Mixer,
+ Machine_Advanced_EV_Mixer,
+ Machine_Advanced_IV_Mixer,
+ Machine_Advanced_LuV_Mixer,
+ Machine_Advanced_ZPM_Mixer,
+ Machine_Advanced_UV_Mixer,
+
+ // Block that enables uplink to a superconductor network
+ SuperConductorInputNode,
+
+ // Heat Pipes
+ HeatPipe_Tier_1,
+ HeatPipe_Tier_2,
+ HeatPipe_Tier_3,
+
+ // Chemical Dehydrators for nuclear fuels
+ GT_Dehydrator_MV,
+ GT_Dehydrator_HV,
+ GT_Dehydrator_EV,
+ GT_Dehydrator_IV,
+ GT_Dehydrator_LuV,
+ GT_Dehydrator_ZPM,
+
+ // Fluid Storage Tanks
+ GT_FluidTank_ULV,
+ GT_FluidTank_LV,
+ GT_FluidTank_MV,
+ GT_FluidTank_HV,
+ GT_FluidTank_EV,
+ GT_FluidTank_IV,
+ GT_FluidTank_LuV,
+ GT_FluidTank_ZPM,
+ GT_FluidTank_UV,
+ GT_FluidTank_MAX,
+
+ // GT RTG
+ RTG,
+
+ // Chisel Machines
+ GT_Chisel_LV,
+ GT_Chisel_MV,
+ GT_Chisel_HV,
+
+ // Plasma Tank
+ /* Plasma_Tank, */
+
+ // ----------------------------------------------------------------------------
+
+ /**
+ * Covers
+ */
+
+ // Fluid Void Covers
+ Cover_Overflow_LV,
+ Cover_Overflow_MV,
+ Cover_Overflow_HV,
+ Cover_Overflow_EV,
+ Cover_Overflow_IV,
+
+ // Item Void Covers
+ Cover_Overflow_Item_ULV,
+ Cover_Overflow_Item_LV,
+ Cover_Overflow_Item_MV,
+ Cover_Overflow_Item_HV,
+ Cover_Overflow_Item_EV,
+ Cover_Overflow_Item_IV,
+
+ // ----------------------------------------------------------------------------
+ // Additional washers
+ SimpleDustWasher_LV,
+ SimpleDustWasher_HV,
+ SimpleDustWasher_IV,
+ SimpleDustWasher_ZPM,
+
+ ;
+
+ public static final GregtechItemList[] DYE_ONLY_ITEMS = { Energy_Buffer_1by1_EV, Energy_Buffer_1by1_EV };
+ private ItemStack mStack;
+ private boolean mHasNotBeenSet = true;
+
+ @Override
+ public GregtechItemList set(final Item aItem) {
+ this.mHasNotBeenSet = false;
+ if (aItem == null) {
+ return this;
+ }
+ final ItemStack aStack = new ItemStack(aItem, 1, 0);
+ this.mStack = GT_Utility.copyAmount(1, aStack);
+ return this;
+ }
+
+ @Override
+ public GregtechItemList set(final ItemStack aStack) {
+ this.mHasNotBeenSet = false;
+ this.mStack = GT_Utility.copyAmount(1, aStack);
+ return this;
+ }
+
+ @Override
+ public Item getItem() {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(this.mStack)) {
+ return null;
+ }
+ return this.mStack.getItem();
+ }
+
+ @Override
+ public Block getBlock() {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ return getBlockFromStack(this.getItem());
+ }
+
+ @Override
+ public final boolean hasBeenSet() {
+ return !this.mHasNotBeenSet;
+ }
+
+ @Override
+ public boolean isStackEqual(final Object aStack) {
+ return this.isStackEqual(aStack, false, false);
+ }
+
+ @Override
+ public boolean isStackEqual(final Object aStack, final boolean aWildcard, final boolean aIgnoreNBT) {
+ if (GT_Utility.isStackInvalid(aStack)) {
+ return false;
+ }
+ return GT_Utility
+ .areUnificationsEqual((ItemStack) aStack, aWildcard ? this.getWildcard(1) : this.get(1), aIgnoreNBT);
+ }
+
+ public static Block getBlockFromStack(Object aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return Blocks.air;
+ return Block.getBlockFromItem(((ItemStack) aStack).getItem());
+ }
+
+ @Override
+ public ItemStack get(final long aAmount, final Object... aReplacements) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(this.mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmount(aAmount, GT_OreDictUnificator.get(this.mStack));
+ }
+
+ @Override
+ public ItemStack getWildcard(final long aAmount, final Object... aReplacements) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(this.mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, W, GT_OreDictUnificator.get(this.mStack));
+ }
+
+ @Override
+ public ItemStack getUndamaged(final long aAmount, final Object... aReplacements) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(this.mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, 0, GT_OreDictUnificator.get(this.mStack));
+ }
+
+ @Override
+ public ItemStack getAlmostBroken(final long aAmount, final Object... aReplacements) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(this.mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility
+ .copyAmountAndMetaData(aAmount, this.mStack.getMaxDamage() - 1, GT_OreDictUnificator.get(this.mStack));
+ }
+
+ @Override
+ public ItemStack getWithName(final long aAmount, final String aDisplayName, final Object... aReplacements) {
+ final ItemStack rStack = this.get(1, aReplacements);
+ if (GT_Utility.isStackInvalid(rStack)) {
+ return null;
+ }
+ rStack.setStackDisplayName(aDisplayName);
+ return GT_Utility.copyAmount(aAmount, rStack);
+ }
+
+ @Override
+ public ItemStack getWithCharge(final long aAmount, final int aEnergy, final Object... aReplacements) {
+ final ItemStack rStack = this.get(1, aReplacements);
+ if (GT_Utility.isStackInvalid(rStack)) {
+ return null;
+ }
+ GT_ModHandler.chargeElectricItem(rStack, aEnergy, Integer.MAX_VALUE, true, false);
+ return GT_Utility.copyAmount(aAmount, rStack);
+ }
+
+ @Override
+ public ItemStack getWithDamage(final long aAmount, final long aMetaValue, final Object... aReplacements) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(this.mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, aMetaValue, GT_OreDictUnificator.get(this.mStack));
+ }
+
+ @Override
+ public GregtechItemList registerOre(final Object... aOreNames) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ for (final Object tOreName : aOreNames) {
+ GT_OreDictUnificator.registerOre(tOreName, this.get(1));
+ }
+ return this;
+ }
+
+ @Override
+ public GregtechItemList registerWildcardAsOre(final Object... aOreNames) {
+ if (this.mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + this.name() + "' has not been set to an Item at this time!");
+ }
+ for (final Object tOreName : aOreNames) {
+ GT_OreDictUnificator.registerOre(tOreName, this.getWildcard(1));
+ }
+ return this;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOreDictNames.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOreDictNames.java
new file mode 100644
index 0000000000..4bd8831098
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOreDictNames.java
@@ -0,0 +1,39 @@
+package gtPlusPlus.xmod.gregtech.api.enums;
+
+/*
+ * Electric Components. usual Materials for this are: Primitive (Tier 1) Basic (Tier 2) as used by UE as well : IC2
+ * Circuit and RE-Battery Good (Tier 3) Advanced (Tier 4) as used by UE as well : Advanced Circuit, Advanced Battery and
+ * Lithium Battery Data (Tier 5) : Data Storage Circuit Elite (Tier 6) as used by UE as well : Energy Crystal and Data
+ * Control Circuit Master (Tier 7) : Energy Flow Circuit and Lapotron Crystal Ultimate (Tier 8) : Data Orb and
+ * Lapotronic Energy Orb Infinite (Cheaty) Circuits Circuit_Primitive, Circuit_Basic, Circuit_Good, Circuit_Advanced,
+ * Circuit_Data, Circuit_Elite, Circuit_Master, Tool_DataOrb, Circuit_Ultimate, Tool_DataStick, Circuit_IV, Circuit_LuV,
+ * Circuit_ZPM, Circuit Parts Circuit_Board_IV, Circuit_Board_LuV, Circuit_Board_ZPM, Circuit_Parts_Crystal_Chip_IV,
+ * Circuit_Parts_Crystal_Chip_LuV, Circuit_Parts_Crystal_Chip_ZPM, Circuit_Parts_IV, Circuit_Parts_LuV,
+ * Circuit_Parts_ZPM, Circuit_Parts_Wiring_IV, Circuit_Parts_Wiring_LuV, Circuit_Parts_Wiring_ZPM;
+ */
+public enum GregtechOreDictNames {
+
+ buffer_core,
+ itemGregConduit,
+ Circuit_IV,
+ Circuit_LuV,
+ Circuit_ZPM,
+ Circuit_Board_IV,
+ Circuit_Board_LuV,
+ Circuit_Board_ZPM,
+ Circuit_Parts_Crystal_Chip_IV,
+ Circuit_Parts_Crystal_Chip_LuV,
+ Circuit_Parts_Crystal_Chip_ZPM,
+ Circuit_Parts_IV,
+ Circuit_Parts_LuV,
+ Circuit_Parts_ZPM,
+ Circuit_Parts_Wiring_IV,
+ Circuit_Parts_Wiring_LuV,
+ Circuit_Parts_Wiring_ZPM;
+
+ public String unlocalisedName;
+
+ private void ModObject() {
+ this.unlocalisedName = this.name();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOrePrefixes.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOrePrefixes.java
new file mode 100644
index 0000000000..3185810495
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechOrePrefixes.java
@@ -0,0 +1,1324 @@
+package gtPlusPlus.xmod.gregtech.api.enums;
+
+import static gregtech.api.enums.GT_Values.B;
+import static gregtech.api.enums.GT_Values.D2;
+import static gregtech.api.enums.GT_Values.M;
+import static gtPlusPlus.core.util.Utils.getTcAspectStack;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Element;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.interfaces.IColorModulationContainer;
+import gregtech.api.interfaces.ICondition;
+import gregtech.api.interfaces.ISubTagContainer;
+import gregtech.api.objects.MaterialStack;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.Interface_OreRecipeRegistrator;
+import gtPlusPlus.xmod.gregtech.api.objects.GregtechItemData;
+import gtPlusPlus.xmod.gregtech.api.objects.GregtechMaterialStack;
+
+public enum GregtechOrePrefixes {
+
+ /*
+ * Electric Components. usual Materials for this are: Primitive (Tier 1) Basic (Tier 2) as used by UE as well : IC2
+ * Circuit and RE-Battery Good (Tier 3) Advanced (Tier 4) as used by UE as well : Advanced Circuit, Advanced Battery
+ * and Lithium Battery Data (Tier 5) : Data Storage Circuit Elite (Tier 6) as used by UE as well : Energy Crystal
+ * and Data Control Circuit Master (Tier 7) : Energy Flow Circuit and Lapotron Crystal Ultimate (Tier 8) : Data Orb
+ * and Lapotronic Energy Orb Infinite (Cheaty)
+ */
+ ingotHot("Hot Ingots", "Hot ", " Ingot", true, true, false, false, false, false, false, true, false, false, B[1],
+ M * 1, 16, 12), // A hot Ingot, which has to be cooled down by a Vacuum Freezer.
+ ingot("Ingots", "", " Ingot", true, true, false, false, false, false, false, true, false, false, B[1], M * 1, 64,
+ 11), // A regular Ingot. Introduced by Eloraam
+ dustTiny("Tiny Dusts", "Tiny Pile of ", " Dust", true, true, false, false, false, false, false, true, false, false,
+ B[0] | B[1] | B[2] | B[3], M / 9, 64, 0), // 1/9th of a Dust.
+ dustSmall("Small Dusts", "Small Pile of ", " Dust", true, true, false, false, false, false, false, true, false,
+ false, B[0] | B[1] | B[2] | B[3], M / 4, 64, 1), // 1/4th of a Dust.
+ dustImpure("Impure Dusts", "Impure Pile of ", " Dust", true, true, false, false, false, false, false, true, false,
+ true, B[3], M * 1, 64, 3), // Dust with impurities. 1 Unit of Main Material and 1/9 - 1/4 Unit of secondary
+ // Material
+ dustRefined("Refined Dusts", "Refined Pile of ", " Dust", true, true, false, false, false, false, false, true,
+ false, true, B[3], M * 1, 64, 2),
+ dustPure("Purified Dusts", "Purified Pile of ", " Dust", true, true, false, false, false, false, false, true, false,
+ true, B[3], M * 1, 64, 4),
+ dust("Dusts", "", " Dust", true, true, false, false, false, false, false, true, false, false,
+ B[0] | B[1] | B[2] | B[3], M * 1, 64, 2), // Pure Dust worth of one Ingot or Gem. Introduced by Alblaka.
+ nugget("Nuggets", "", " Nugget", true, true, false, false, false, false, false, true, false, false, B[1], M / 9, 64,
+ 9), // A Nugget. Introduced by Eloraam
+ plate("Plates", "", " Plate", true, true, false, false, false, false, true, true, false, false, B[1] | B[2], M * 1,
+ 64, 17), // Regular Plate made of one Ingot/Dust. Introduced by Calclavia
+ block("Storage Blocks", "Block of ", "", true, true, false, false, false, true, true, false, false, false, 0, M * 9,
+ 64, 71), // Storage Block consisting out of 9 Ingots/Gems/Dusts. Introduced by CovertJaguar
+ gem("Gemstones", "", "", true, true, true, false, false, false, true, true, false, false, B[2], M * 1, 64, 8), // A
+ // regular
+ // Gem
+ // worth
+ // one
+ // Dust.
+ // Introduced
+ // by
+ // Eloraam
+ gemChipped("Chipped Gemstones", "Chipped ", "", true, true, true, false, false, false, true, true, false, false,
+ B[2], M / 4, 64, 59), // A regular Gem worth one small Dust. Introduced by TerraFirmaCraft
+ gemFlawed("Flawed Gemstones", "Flawed ", "", true, true, true, false, false, false, true, true, false, false, B[2],
+ M / 2, 64, 60), // A regular Gem worth two small Dusts. Introduced by TerraFirmaCraft
+ gemFlawless("Flawless Gemstones", "Flawless ", "", true, true, true, false, false, false, true, true, false, false,
+ B[2], M * 2, 32, 61), // A regular Gem worth two Dusts. Introduced by TerraFirmaCraft
+ gemExquisite("Exquisite Gemstones", "Exquisite ", "", true, true, true, false, false, false, true, true, false,
+ false, B[2], M * 4, 16, 62), // A regular Gem worth four Dusts. Introduced by TerraFirmaCraft
+ stick("Sticks/Rods", "", " Rod", true, true, false, false, false, false, true, true, false, false, B[1] | B[2],
+ M / 2, 64, 23), // Stick made of half an Ingot. Introduced by Eloraam
+ type2("16x Wires", "16x ", " Wire", true, true, false, false, false, false, true, false, false, false, 0, M * 8, 64,
+ -1),
+
+ toolAngleGrinder("Angle Grinder", "", "Angle Grinder", true, true, false, false, false, false, true, true, false,
+ false, B[6], M * 6, 16, 37), // consisting out of 6 Ingots.
+ toolElectricSnips("Electric Snips", "", "Electric Snips", true, true, false, false, false, false, true, true, false,
+ false, B[6], M * 6, 16, 37), // consisting out of 6 Ingots.
+ toolElectricLighter("Electric Lighter", "", "Electric Lighter", true, true, false, false, false, false, true, true,
+ false, false, B[6], M * 6, 16, 37), // consisting out of 6 Ingots.
+ toolElectricButcherKnife("Electric Butcher Knife", "", "Electric Butcher Knife", true, true, false, false, false,
+ false, true, true, false, false, B[6], M * 6, 16, 37), // consisting out of 6 Ingots.
+
+ batterySingleuse("Single Use Batteries", "", "", false, true, false, false, false, false, false, false, false,
+ false, 0, -1, 64, -1),
+ battery("Reusable Batteries", "", "", false, true, false, false, false, false, false, false, false, false, 0, -1,
+ 64, -1), // Introduced by Calclavia
+ circuit("Circuits", "", "", true, true, false, false, false, false, false, false, false, false, 0, -1, 64, -1), // Introduced
+ // by
+ // Calclavia
+ chipset("Chipsets", "", "", true, true, false, false, false, false, false, false, false, false, 0, -1, 64, -1), // Introduced
+ ;
+
+ public static final int VERSION = 508;
+
+ static {
+ ingotHot.mHeatDamage = 3.0F;
+ }
+
+ public final ArrayList<ItemStack> mPrefixedItems = new ArrayList<>();
+ public final short mTextureIndex;
+ public final String mRegularLocalName, mLocalizedMaterialPre, mLocalizedMaterialPost;
+ public final boolean mIsUsedForOreProcessing, mIsEnchantable, mIsUnificatable, mIsMaterialBased, mIsSelfReferencing,
+ mIsContainer, mDontUnificateActively, mIsUsedForBlocks, mAllowNormalRecycling, mGenerateDefaultItem;
+ public final List<TC_AspectStack> mAspects = new ArrayList<>();
+ public final Collection<GregtechOrePrefixes> mFamiliarPrefixes = new HashSet<>();
+ /**
+ * Used to determine the amount of Material this Prefix contains. Multiply or Divide GregTech_API.MATERIAL_UNIT to
+ * get the Amounts in comparision to one Ingot. 0 = Null Negative = Undefined Amount
+ */
+ public final long mMaterialAmount;
+
+ private final Collection<Materials> mNotGeneratedItems = new HashSet<>(), mIgnoredMaterials = new HashSet<>(),
+ mGeneratedItems = new HashSet<>();
+ private final ArrayList<Interface_OreRecipeRegistrator> mOreProcessing = new ArrayList<>();
+ private final ArrayList<Interface_OreRecipeRegistrator> mOreProcessingFake = new ArrayList<>();
+ public final ItemStack mContainerItem = null;
+ public final ICondition<ISubTagContainer> mCondition = null;
+ public byte mDefaultStackSize = 64;
+ public final GregtechMaterialStack mSecondaryMaterial = null;
+ public final GregtechOrePrefixes mPrefixInto = this;
+ public float mHeatDamage = 0.0F; // Negative for Frost Damage
+ /**
+ * Yes this Value can be changed to add Bits for the MetaGenerated-Item-Check.
+ */
+ public int mMaterialGenerationBits = 0;
+
+ private GregtechOrePrefixes(final String aRegularLocalName, final String aLocalizedMaterialPre,
+ final String aLocalizedMaterialPost, final boolean aIsUnificatable, final boolean aIsMaterialBased,
+ final boolean aIsSelfReferencing, final boolean aIsContainer, final boolean aDontUnificateActively,
+ final boolean aIsUsedForBlocks, final boolean aAllowNormalRecycling, final boolean aGenerateDefaultItem,
+ final boolean aIsEnchantable, final boolean aIsUsedForOreProcessing, final int aMaterialGenerationBits,
+ final long aMaterialAmount, final int aDefaultStackSize, final int aTextureindex) {
+ this.mIsUnificatable = aIsUnificatable;
+ this.mIsMaterialBased = aIsMaterialBased;
+ this.mIsSelfReferencing = aIsSelfReferencing;
+ this.mIsContainer = aIsContainer;
+ this.mDontUnificateActively = aDontUnificateActively;
+ this.mIsUsedForBlocks = aIsUsedForBlocks;
+ this.mAllowNormalRecycling = aAllowNormalRecycling;
+ this.mGenerateDefaultItem = aGenerateDefaultItem;
+ this.mIsEnchantable = aIsEnchantable;
+ this.mIsUsedForOreProcessing = aIsUsedForOreProcessing;
+ this.mMaterialGenerationBits = aMaterialGenerationBits;
+ this.mMaterialAmount = aMaterialAmount;
+ this.mRegularLocalName = aRegularLocalName;
+ this.mLocalizedMaterialPre = aLocalizedMaterialPre;
+ this.mLocalizedMaterialPost = aLocalizedMaterialPost;
+ this.mDefaultStackSize = (byte) aDefaultStackSize;
+ this.mTextureIndex = (short) aTextureindex;
+
+ // TODO - Utilise some form of way to check if it's gt 5.9 if so, use string switch.
+ if (this.name()
+ .startsWith("ore")) {
+ getTcAspectStack(TC_Aspects.TERRA.name(), 1).addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("wire")
+ || this.name()
+ .startsWith("cable")) {
+ getTcAspectStack(TC_Aspects.ELECTRUM.name(), 1).addToAspectList(this.mAspects);
+ } else
+ if (this.name()
+ .startsWith("dust")) {
+ getTcAspectStack(TC_Aspects.PERDITIO.name(), 1).addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("crushed")) {
+ getTcAspectStack(TC_Aspects.PERFODIO.name(), 1).addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("ingot")
+ || this.name()
+ .startsWith("nugget")) {
+ getTcAspectStack(TC_Aspects.METALLUM.name(), 1).addToAspectList(this.mAspects);
+ } else
+ if (this.name()
+ .startsWith("armor")) {
+ getTcAspectStack(TC_Aspects.TUTAMEN.name(), 1).addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("stone")) {
+ getTcAspectStack(TC_Aspects.TERRA.name(), 1).addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("pipe")) {
+ getTcAspectStack(TC_Aspects.ITER.name(), 1).addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("gear")) {
+ getTcAspectStack(TC_Aspects.MOTUS.name(), 1).addToAspectList(this.mAspects);
+ getTcAspectStack(TC_Aspects.MACHINA.name(), 1)
+ .addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("frame")
+ || this.name()
+ .startsWith("plate")) {
+ getTcAspectStack(TC_Aspects.FABRICO.name(), 1)
+ .addToAspectList(this.mAspects);
+ } else
+ if (this.name()
+ .startsWith("tool")) {
+ getTcAspectStack(TC_Aspects.INSTRUMENTUM.name(), 2)
+ .addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("gem")
+ || this.name()
+ .startsWith("crystal")
+ || this.name()
+ .startsWith("lens")) {
+ getTcAspectStack(TC_Aspects.VITREUS.name(), 1)
+ .addToAspectList(this.mAspects);
+ } else
+ if (this.name()
+ .startsWith("crate")) {
+ getTcAspectStack(TC_Aspects.ITER.name(), 2)
+ .addToAspectList(this.mAspects);
+ } else if (this.name()
+ .startsWith("circuit")) {
+ getTcAspectStack("COGNITIO", 1);
+ } else if (this.name()
+ .startsWith("battery")) {
+ getTcAspectStack(TC_Aspects.ELECTRUM.name(), 1)
+ .addToAspectList(this.mAspects);
+ }
+ }
+
+ public static GregtechOrePrefixes getOrePrefix(final String aOre) {
+ for (final GregtechOrePrefixes tPrefix : values()) {
+ if (aOre.startsWith(tPrefix.toString())) {
+ return tPrefix;
+ }
+ }
+ return null;
+ }
+
+ public static String stripPrefix(final String aOre) {
+ for (final GregtechOrePrefixes tPrefix : values()) {
+ if (aOre.startsWith(tPrefix.toString())) {
+ return aOre.replaceFirst(tPrefix.toString(), "");
+ }
+ }
+ return aOre;
+ }
+
+ public static String replacePrefix(final String aOre, final GregtechOrePrefixes aPrefix) {
+ for (final GregtechOrePrefixes tPrefix : values()) {
+ if (aOre.startsWith(tPrefix.toString())) {
+ return aOre.replaceFirst(tPrefix.toString(), aPrefix.toString());
+ }
+ }
+ return "";
+ }
+
+ public static GregtechOrePrefixes getPrefix(final String aPrefixName) {
+ return getPrefix(aPrefixName, null);
+ }
+
+ public static GregtechOrePrefixes getPrefix(final String aPrefixName, final GregtechOrePrefixes aReplacement) {
+ final Object tObject = GT_Utility.getFieldContent(GregtechOrePrefixes.class, aPrefixName, false, false);
+ if ((tObject != null) && (tObject instanceof GregtechOrePrefixes)) {
+ return (GregtechOrePrefixes) tObject;
+ }
+ return aReplacement;
+ }
+
+ public static Materials getMaterial(final String aOre) {
+ return Materials.get(stripPrefix(aOre));
+ }
+
+ public static Materials getMaterial(final String aOre, final GregtechOrePrefixes aPrefix) {
+ return Materials.get(aOre.replaceFirst(aPrefix.toString(), ""));
+ }
+
+ public static Materials getRealMaterial(final String aOre, final GregtechOrePrefixes aPrefix) {
+ return Materials.getRealMaterial(aOre.replaceFirst(aPrefix.toString(), ""));
+ }
+
+ public static boolean isInstanceOf(final String aName, final GregtechOrePrefixes aPrefix) {
+ return aName == null ? false : aName.startsWith(aPrefix.toString());
+ }
+
+ public boolean add(final ItemStack aStack) {
+ if (aStack == null) {
+ return false;
+ }
+ if (!this.contains(aStack)) {
+ this.mPrefixedItems.add(aStack);
+ }
+ while (this.mPrefixedItems.contains(null)) {
+ this.mPrefixedItems.remove(null);
+ }
+ return true;
+ }
+
+ public boolean contains(final ItemStack aStack) {
+ if (aStack == null) {
+ return false;
+ }
+ for (final ItemStack tStack : this.mPrefixedItems) {
+ if (GT_Utility.areStacksEqual(aStack, tStack, !tStack.hasTagCompound())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean doGenerateItem(final Materials aMaterial) {
+ return (aMaterial != null) && (aMaterial != Materials._NULL)
+ && (((aMaterial.mTypes & this.mMaterialGenerationBits) != 0) || this.mGeneratedItems.contains(aMaterial))
+ && !this.mNotGeneratedItems.contains(aMaterial)
+ && ((this.mCondition == null) || this.mCondition.isTrue(aMaterial));
+ }
+
+ public boolean ignoreMaterials(final Materials... aMaterials) {
+ for (final Materials tMaterial : aMaterials) {
+ if (tMaterial != null) {
+ this.mIgnoredMaterials.add(tMaterial);
+ }
+ }
+ return true;
+ }
+
+ public boolean addFamiliarPrefix(final GregtechOrePrefixes aPrefix) {
+ if ((aPrefix == null) || this.mFamiliarPrefixes.contains(aPrefix) || (aPrefix == this)) {
+ return false;
+ }
+ return this.mFamiliarPrefixes.add(aPrefix);
+ }
+
+ public boolean add(final Interface_OreRecipeRegistrator aRegistrator) {
+ if (aRegistrator == null) {
+ return false;
+ }
+ return this.mOreProcessing.add(aRegistrator);
+ }
+
+ public void processOre(final GT_Materials aMaterial, final String aOreDictName, final String aModName,
+ final ItemStack aStack) {
+ if ((aMaterial != null)
+ && ((aMaterial != GT_Materials._NULL) || this.mIsSelfReferencing || !this.mIsMaterialBased)
+ && GT_Utility.isStackValid(aStack)) {
+ for (final Interface_OreRecipeRegistrator tRegistrator : this.mOreProcessing) {
+ if (D2) {
+ GT_Log.ore.println(
+ "Processing '" + aOreDictName
+ + "' with the Prefix '"
+ + this.name()
+ + "' and the Material '"
+ + aMaterial.name()
+ + "' at "
+ + GT_Utility.getClassName(tRegistrator));
+ }
+ tRegistrator.registerOre(this, aMaterial, aOreDictName, aModName, GT_Utility.copyAmount(1, aStack));
+ }
+ }
+ }
+
+ // TODO
+ public void processOre(final Materials aMaterial, final String aOreDictName, final String aModName,
+ final ItemStack aStack) {
+ if ((aMaterial != null) && ((aMaterial != Materials._NULL) || this.mIsSelfReferencing || !this.mIsMaterialBased)
+ && GT_Utility.isStackValid(aStack)) {
+ for (final Interface_OreRecipeRegistrator tRegistrator : this.mOreProcessingFake) {
+ if (D2) {
+ GT_Log.ore.println(
+ "Processing '" + aOreDictName
+ + "' with the Prefix '"
+ + this.name()
+ + "' and the Material '"
+ + aMaterial.mName
+ + "' at "
+ + GT_Utility.getClassName(tRegistrator));
+ }
+ tRegistrator.registerOre(this, aMaterial, aOreDictName, aModName, GT_Utility.copyAmount(1, aStack));
+ }
+ }
+ }
+
+ public Object get(final Object aMaterial) {
+ if (aMaterial instanceof GT_Materials) {
+ return new GregtechItemData(this, (GT_Materials) aMaterial);
+ }
+ return this.name() + aMaterial;
+ }
+
+ public String getDefaultLocalNameForItem(final Materials aMaterial) {
+
+ // Use Standard Localization
+ return this.mLocalizedMaterialPre + aMaterial.mDefaultLocalName + this.mLocalizedMaterialPost;
+ }
+
+ public enum GT_Materials implements IColorModulationContainer, ISubTagContainer {
+
+ /**
+ * This is the Default Material returned in case no Material has been found or a NullPointer has been inserted
+ * at a location where it shouldn't happen.
+ * <p/>
+ * Mainly for preventing NullPointer Exceptions and providing Default Values.
+ *
+ * Unknown Material Components. Dead End Section.
+ *
+ * Alkalus Range 730-799 & 970-998 (aMetaItemSubID, TextureSet, aToolSpeed, aToolDurability, aToolQuality,
+ * aTypes, R, G, B, Alpha, aLocalName, aFuelType, aFuelPower, aMeltingPoint, aBlastFurnaceTemp,
+ * aBlastFurnaceRequired, aTransparent, aOreValue, aDensityMultiplier, aDensityDivider, aColor
+ * this(aMetaItemSubID, aIconSet, aToolSpeed, aToolDurability, aToolQuality, true);
+ *
+ */
+ _NULL(-1, TextureSet.SET_NONE, 1.0F, 0, 0, 0, 255, 255, 255, 0, "NULL", 0, 0, 0, 0, false, false, 1, 1, 1,
+ Dyes._NULL, Element._NULL, Arrays.asList(getTcAspectStack(TC_Aspects.VACUOS.name(), 1))),
+
+ // Lapis(526, TextureSet.SET_LAPIS, 1.0F, 0, 1, 1 | 4 | 8, 70, 70, 220, 0, "Lapis", 0, 0, -1, 0, false, false,
+ // 3, 1, 1, Dyes.dyeBlue, 2, Arrays.asList(new MaterialStack(Materials.Lazurite, 12), new
+ // MaterialStack(Materials.Sodalite, 2), new MaterialStack(Materials.Pyrite, 1), new
+ // MaterialStack(Materials.Calcite, 1)), Arrays.asList(getTcAspectStack(TC_Aspects.SENSUS, 1))),
+ Pyrotheum(20, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 255, 128, 0, 0, "Pyrotheum", 0, 0, -1, 0, false,
+ false, 2, 3, 1, Dyes.dyeYellow, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1)),
+ Arrays.asList(getTcAspectStack("PRAECANTATIO", 2), getTcAspectStack(TC_Aspects.IGNIS, 1))),
+ Cryotheum(21, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 102, 178, 255, 0, "Cryotheum", 0, 0, -1, 0, false,
+ false, 2, 3, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Blizz, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Snow, 1),
+ new MaterialStack(Materials.Niter, 1)),
+ Arrays.asList(getTcAspectStack("PRAECANTATIO", 2), getTcAspectStack(TC_Aspects.GELUM, 1))),
+ Ender(22, TextureSet.SET_FLUID, 1.0F, 0, 2, 1, 255, 255, 255, 0, "Ender", 0, 0, -1, 0, false, false, 3, 1, 1,
+ Dyes.dyeGreen),
+
+ /**
+ * Circuitry, Batteries and other Technical things
+ */
+ Symbiotic(-1, TextureSet.SET_NONE, 1.0F, 0, 0, 0, 255, 255, 255, 0, "IV Tier", 0, 0, -1, 0, false, false, 1, 1,
+ 1, Dyes.dyeLightGray,
+ Arrays.asList(getTcAspectStack(TC_Aspects.ELECTRUM, 4), getTcAspectStack(TC_Aspects.MACHINA, 4))),
+ Neutronic(-1, TextureSet.SET_NONE, 1.0F, 0, 0, 0, 255, 255, 255, 0, "LuV Tier", 0, 0, -1, 0, false, false, 1, 1,
+ 1, Dyes.dyeLightGray,
+ Arrays.asList(getTcAspectStack(TC_Aspects.ELECTRUM, 6), getTcAspectStack(TC_Aspects.MACHINA, 6))),
+ Quantum(-1, TextureSet.SET_NONE, 1.0F, 0, 0, 0, 255, 255, 255, 0, "ZPM Tier", 0, 0, -1, 0, false, false, 1, 1,
+ 1, Dyes.dyeLightGray,
+ Arrays.asList(getTcAspectStack(TC_Aspects.ELECTRUM, 8), getTcAspectStack(TC_Aspects.MACHINA, 8))),
+
+ Superconductor(-1, TextureSet.SET_NONE, 1.0F, 0, 0, 0, 190, 240, 190, 0, "Superconductor", 0, 0, -1, 0, false,
+ false, 1, 1, 1, Dyes.dyeGreen, Arrays.asList(getTcAspectStack(TC_Aspects.ELECTRUM, 8))),
+
+ Staballoy(30, TextureSet.SET_ROUGH, 10.0F, 5120, 4, 1 | 2 | 16 | 32 | 64 | 128, 68, 75, 66, 0, "Staballoy", 0,
+ 0, 1500, 2800, true, false, 1, 3, 1, Dyes.dyeGreen, 2,
+ Arrays.asList(new MaterialStack(Materials.Titanium, 1), new MaterialStack(Materials.Uranium, 9)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ Bedrockium(31, TextureSet.SET_FINE, 8.0F, 8196, 3, 1 | 2 | 16 | 32 | 64 | 128, 39, 39, 39, 0, "Bedrockium", 0,
+ 0, -1, 0, false, false, 1, 5, 1, Dyes.dyeLightGray, 2,
+ Arrays.asList(new MaterialStack(Materials.Carbon, 63), new MaterialStack(Materials.Carbon, 56)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.VACUOS, 8), getTcAspectStack(TC_Aspects.TUTAMEN, 3))),
+ BloodSteel(32, TextureSet.SET_METALLIC, 11.0F, 768, 4, 1 | 2 | 16 | 32 | 64 | 128, 142, 28, 0, 0, "Blood Steel",
+ 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeRed, 2, Arrays.asList(new MaterialStack(Materials.Steel, 3)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.VICTUS, 8), getTcAspectStack(TC_Aspects.IGNIS, 3))),
+ Void(33, TextureSet.SET_METALLIC, 6.0F, 1280, 3, 1 | 2 | 16 | 32 | 64 | 128, 82, 17, 82, 0, "Void Metal", 0, 0,
+ -1, 0, false, false, 3, 1, 1, Dyes.dyeBlack,
+ Arrays.asList(getTcAspectStack("PRAECANTATIO", 5), getTcAspectStack(TC_Aspects.VACUOS, 7))),
+ ConductiveIron(34, TextureSet.SET_METALLIC, 5.0F, 256, 2, 1 | 2, 164, 109, 100, 0, "Conductive Iron", 0, 0, -1,
+ 0, false, false, 3, 1, 1, Dyes.dyeRed, 2,
+ Arrays.asList(new MaterialStack(Materials.Iron, 6), new MaterialStack(Materials.Redstone, 2)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.POTENTIA, 2), getTcAspectStack(TC_Aspects.METALLUM, 2))),
+ ElectricalSteel(35, TextureSet.SET_METALLIC, 7.0F, 768, 3, 1 | 2 | 64 | 128, 194, 194, 194, 0,
+ "Electrical Steel", 0, 0, 1811, 1000, true, false, 3, 1, 1, Dyes.dyeLightGray, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Iron, 3),
+ new MaterialStack(Materials.Coal, 2),
+ new MaterialStack(Materials.Silicon, 2)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.MAGNETO, 2), getTcAspectStack(TC_Aspects.ELECTRUM, 5))),
+ EnergeticAlloy(36, TextureSet.SET_SHINY, 5.0F, 512, 3, 1 | 2 | 64 | 128, 252, 152, 45, 0, "Energetic Alloy", 0,
+ 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeOrange, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Gold, 3),
+ new MaterialStack(Materials.Glowstone, 2),
+ new MaterialStack(Materials.Redstone, 2)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.POTENTIA, 4), getTcAspectStack(TC_Aspects.LUX, 3))),
+ VibrantAlloy(37, TextureSet.SET_SHINY, 7.0F, 1280, 4, 1 | 2 | 64 | 128, 204, 242, 142, 0, "Vibrant Alloy", 0, 0,
+ -1, 0, false, false, 3, 1, 1, Dyes.dyeLime, 2,
+ Arrays.asList(new MaterialStack(Materials.EnergeticAlloy, 1), new MaterialStack(Materials.EnderPearl, 3)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.MACHINA, 5), getTcAspectStack(TC_Aspects.TELUM, 4))),
+ PulsatingIron(38, TextureSet.SET_SHINY, 5.0F, 256, 2, 1 | 2 | 64 | 128, 50, 91, 21, 0, "Pulsating Iron", 0, 0,
+ -1, 0, false, false, 3, 1, 1, Dyes.dyeGreen, 2,
+ Arrays.asList(new MaterialStack(Materials.Iron, 2), new MaterialStack(Materials.EnderPearl, 2)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.ALIENIS, 3), getTcAspectStack(TC_Aspects.METALLUM, 3))),
+ /* TODO */ RedstoneAlloy(39, TextureSet.SET_METALLIC, 1.0F, 256, 2, 1 | 2 | 16 | 32 | 64, 178, 34, 34, 0,
+ "Redstone Alloy", 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeRed, 2,
+ Arrays.asList(new MaterialStack(Materials.Iron, 2), new MaterialStack(Materials.Redstone, 4))),
+
+ // Needs more Use, I think.
+ Tantalloy60(40, TextureSet.SET_DULL, 8.0F, 5120, 3, 1 | 2 | 16 | 32 | 64 | 128, 68, 75, 166, 0, "Tantalloy-60",
+ 0, 0, 3035, 2200, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(new MaterialStack(Materials.Tungsten, 1), new MaterialStack(Materials.Tantalum, 9)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ Tantalloy61(41, TextureSet.SET_DULL, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 122, 135, 196, 0,
+ "Tantalloy-61", 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+
+ Potin(42, TextureSet.SET_METALLIC, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 201, 151, 129, 0, "Potin", 0, 0,
+ 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ Inconel792(43, TextureSet.SET_METALLIC, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 108, 240, 118, 0,
+ "Inconel-792", 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ Inconel690(44, TextureSet.SET_DULL, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 118, 220, 138, 0, "Inconel-690",
+ 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ MaragingSteel300(45, TextureSet.SET_METALLIC, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 150, 150, 150, 0,
+ "Maraging Steel 300", 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ MaragingSteel350(46, TextureSet.SET_METALLIC, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 160, 160, 160, 0,
+ "Maraging Steel 350", 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+ HastelloyX(47, TextureSet.SET_SHINY, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 255, 193, 37, 0, "Hastelloy-X",
+ 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+
+ TriniumNaquadahCarbonite(48, TextureSet.SET_SHINY, 7.0F, 5120, 2, 1 | 2 | 16 | 32 | 64 | 128, 255, 233, 0, 0,
+ "Trinium Naquadah Carbonite", 0, 0, 3015, 2150, true, false, 1, 2, 1, Dyes.dyeLightBlue, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Tungsten, 1),
+ new MaterialStack(Materials.Tantalum, 9),
+ new MaterialStack(Materials.Titanium, 1)),
+ Arrays.asList(getTcAspectStack(TC_Aspects.METALLUM, 8), getTcAspectStack(TC_Aspects.STRONTIO, 3))),
+
+ // Radioactive Materials
+ HydrofluoricAcid(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 200, 200, 200, 0, "Hydrofluoric Acid", 0, 0,
+ -1, 0, false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ UraniumHexaFluoride(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 73, 220, 83, 0, "Uranium Hexafluoride",
+ 0, 0, -1, 0, false, false, 2, 3, 1, Dyes.dyeLime, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ UraniumTetraFluoride(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 73, 220, 83, 0, "Uranium Tetrafluoride",
+ 0, 0, -1, 0, false, false, 2, 3, 1, Dyes.dyeLime, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ ThoriumTetraFluoride(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 15, 120, 15, 0, "Thorium Tetrafluoride",
+ 0, 0, -1, 0, false, false, 2, 3, 1, Dyes.dyeGreen, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+
+ SulfurousAcid(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 110, 220, 30, 0, "Sulfurous Acid", 0, 0, -1, 0,
+ false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ SulfurDioxide(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 150, 200, 50, 0, "Sulfur Dioxide", 0, 0, -1, 0,
+ false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ HydrogenChloride(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 150, 240, 90, 0, "Hydrogen Chloride", 0, 0,
+ -1, 0, false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ SulfuricApatite(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 0, 105, 105, 0, "Sulfuric Apatite Solution",
+ 0, 0, -1, 0, false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+
+ SulfuricLithium(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 0, 105, 105, 0, "Sulfuric Lithium Solution",
+ 0, 0, -1, 0, false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),
+ LithiumHydroxide(-1, TextureSet.SET_FLUID, 1.0F, 0, 1, 2 | 16 | 32, 0, 105, 105, 0, "Lithium Hydroxide", 0, 0,
+ -1, 0, false, false, 2, 3, 1, Dyes.dyeWhite, 2,
+ Arrays.asList(
+ new MaterialStack(Materials.Coal, 1),
+ new MaterialStack(Materials.Redstone, 1),
+ new MaterialStack(Materials.Blaze, 1),
+ new MaterialStack(Materials.Sulfur, 1))),;
+
+ /**
+ * List of all Materials.
+ */
+ public static final Collection<GT_Materials> VALUES = new HashSet<>(Arrays.asList(values()));
+
+ static {
+ /*
+ * Primitive.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING); Basic.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ * Good.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING); Advanced.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ * Data.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING); Elite.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ * Master.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING); Ultimate.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ * Superconductor.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING); Infinite.add(SubTag.NO_SMASHING,
+ * SubTag.NO_SMELTING);
+ */
+ Symbiotic.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Neutronic.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Quantum.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ }
+
+ /**
+ * This Array can be changed dynamically by a Tick Handler in order to get a glowing Effect on all GT Meta Items
+ * out of this Material.
+ */
+ public final short[] mRGBa = new short[] { 255, 255, 255, 0 }, mMoltenRGBa = new short[] { 255, 255, 255, 0 };
+
+ public final TextureSet mIconSet;
+ public final int mMetaItemSubID;
+ public final boolean mUnificatable;
+ public final GT_Materials mMaterialInto;
+ public final List<MaterialStack> mMaterialList = new ArrayList<>();
+ public final List<GT_Materials> mOreByProducts = new ArrayList<>(), mOreReRegistrations = new ArrayList<>();
+ public final List<TC_AspectStack> mAspects = new ArrayList<>();
+ private final ArrayList<ItemStack> mMaterialItems = new ArrayList<>();
+ private final Collection<SubTag> mSubTags = new HashSet<>();
+ public Enchantment mEnchantmentTools = null, mEnchantmentArmors = null;
+ public byte mEnchantmentToolsLevel = 0, mEnchantmentArmorsLevel = 0;
+ public boolean mBlastFurnaceRequired = false;
+ public float mToolSpeed = 1.0F, mHeatDamage = 0.0F;
+ public String mChemicalFormula = "?", mDefaultLocalName = "null";
+ public Dyes mColor = Dyes._NULL;
+ public short mMeltingPoint = 0, mBlastFurnaceTemp = 0;
+ public int mTypes = 0, mDurability = 16, mFuelPower = 0, mFuelType = 0, mExtraData = 0, mOreValue = 0,
+ mOreMultiplier = 1, mByProductMultiplier = 1, mSmeltingMultiplier = 1;
+ public long mDensity = M;
+ public Element mElement = null;
+ public GT_Materials mDirectSmelting = this;
+ public GT_Materials mOreReplacement = this;
+ public GT_Materials mMacerateInto = this;
+ public GT_Materials mSmeltInto = this;
+ public GT_Materials mArcSmeltInto = this;
+ public final GT_Materials mHandleMaterial = this;
+ public byte mToolQuality = 0;
+ public final Fluid mSolid = null;
+ public Fluid mFluid = null;
+ public Fluid mGas = null;
+ public Fluid mPlasma = null;
+ /**
+ * This Fluid is used as standard Unit for Molten Materials. 1296 is a Molten Block, what means 144 is one
+ * Material Unit worth
+ */
+ public final Fluid mStandardMoltenFluid = null;
+
+ private GT_Materials(final int aMetaItemSubID, final TextureSet aIconSet, final float aToolSpeed,
+ final int aToolDurability, final int aToolQuality, final boolean aUnificatable) {
+ this.mUnificatable = aUnificatable;
+ this.mMaterialInto = this;
+ this.mMetaItemSubID = aMetaItemSubID;
+ this.mToolQuality = (byte) aToolQuality;
+ this.mDurability = aToolDurability;
+ this.mToolSpeed = aToolSpeed;
+ this.mIconSet = aIconSet;
+ if (aMetaItemSubID >= 0) {
+ if (CORE.sMU_GeneratedMaterials[aMetaItemSubID] == null) {
+ CORE.sMU_GeneratedMaterials[aMetaItemSubID] = this;
+ } else {
+ throw new IllegalArgumentException("The Index " + aMetaItemSubID + " is already used!");
+ }
+ }
+ }
+
+ private GT_Materials(final GT_Materials aMaterialInto, final boolean aReRegisterIntoThis) {
+ this.mUnificatable = false;
+ this.mDefaultLocalName = aMaterialInto.mDefaultLocalName;
+ this.mMaterialInto = aMaterialInto.mMaterialInto;
+ if (aReRegisterIntoThis) {
+ this.mMaterialInto.mOreReRegistrations.add(this);
+ }
+ this.mChemicalFormula = aMaterialInto.mChemicalFormula;
+ this.mMetaItemSubID = -1;
+ this.mIconSet = TextureSet.SET_NONE;
+ }
+
+ /**
+ * @param aMetaItemSubID the Sub-ID used in my own MetaItems. Range 0-1000. -1 for no Material
+ * @param aTypes which kind of Items should be generated. Bitmask as follows: 1 = Dusts of all
+ * kinds. 2 = Dusts, Ingots, Plates, Rods/Sticks, Machine Components and other
+ * Metal specific things. 4 = Dusts, Gems, Plates, Lenses (if transparent). 8 =
+ * Dusts, Impure Dusts, crushed Ores, purified Ores, centrifuged Ores etc. 16 =
+ * Cells 32 = Plasma Cells 64 = Tool Heads 128 = Gears
+ * @param aR, aG, aB Color of the Material 0-255 each.
+ * @param aA transparency of the Material Texture. 0 = fully visible, 255 = Invisible.
+ * @param aLocalName The Name used as Default for localization.
+ * @param aFuelType Type of Generator to get Energy from this Material.
+ * @param aFuelPower EU generated. Will be multiplied by 1000, also additionally multiplied by 2 for
+ * Gems.
+ * @param aAmplificationValue Amount of UUM amplifier gotten from this.
+ * @param aUUMEnergy Amount of EU needed to shape the UUM into this Material.
+ * @param aMeltingPoint Used to determine the smelting Costs in Furnii.
+ * @param aBlastFurnaceTemp Used to determine the needed Heat capactiy Costs in Blast Furnii.
+ * @param aBlastFurnaceRequired If this requires a Blast Furnace.
+ * @param aColor Vanilla MC Wool Color which comes the closest to this.
+ */
+ private GT_Materials(final int aMetaItemSubID, final TextureSet aIconSet, final float aToolSpeed,
+ final int aToolDurability, final int aToolQuality, final int aTypes, final int aR, final int aG,
+ final int aB, final int aA, final String aLocalName, final int aFuelType, final int aFuelPower,
+ final int aMeltingPoint, final int aBlastFurnaceTemp, final boolean aBlastFurnaceRequired,
+ final boolean aTransparent, final int aOreValue, final int aDensityMultiplier, final int aDensityDivider,
+ final Dyes aColor) {
+ this(aMetaItemSubID, aIconSet, aToolSpeed, aToolDurability, aToolQuality, true);
+ this.mDefaultLocalName = aLocalName;
+ this.mMeltingPoint = (short) aMeltingPoint;
+ this.mBlastFurnaceTemp = (short) aBlastFurnaceTemp;
+ this.mBlastFurnaceRequired = aBlastFurnaceRequired;
+ if (aTransparent) {
+ this.add(SubTag.TRANSPARENT);
+ }
+ this.mFuelPower = aFuelPower;
+ this.mFuelType = aFuelType;
+ this.mOreValue = aOreValue;
+ this.mDensity = (M * aDensityMultiplier) / aDensityDivider;
+ this.mColor = aColor == null ? Dyes._NULL : aColor;
+ if (this.mColor != null) {
+ this.add(SubTag.HAS_COLOR);
+ }
+ this.mRGBa[0] = this.mMoltenRGBa[0] = (short) aR;
+ this.mRGBa[1] = this.mMoltenRGBa[1] = (short) aG;
+ this.mRGBa[2] = this.mMoltenRGBa[2] = (short) aB;
+ this.mRGBa[3] = this.mMoltenRGBa[3] = (short) aA;
+ this.mTypes = aTypes;
+ if ((this.mTypes & 2) != 0) {
+ this.add(SubTag.SMELTING_TO_FLUID);
+ }
+ }
+
+ private GT_Materials(final int aMetaItemSubID, final TextureSet aIconSet, final float aToolSpeed,
+ final int aToolDurability, final int aToolQuality, final int aTypes, final int aR, final int aG,
+ final int aB, final int aA, final String aLocalName, final int aFuelType, final int aFuelPower,
+ final int aMeltingPoint, final int aBlastFurnaceTemp, final boolean aBlastFurnaceRequired,
+ final boolean aTransparent, final int aOreValue, final int aDensityMultiplier, final int aDensityDivider,
+ final Dyes aColor, final List<TC_AspectStack> aAspects) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aToolDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor);
+ this.mAspects.addAll(aAspects);
+ }
+
+ /**
+ * @param aElement The Element Enum represented by this Material
+ */
+ private GT_Materials(final int aMetaItemSubID, final TextureSet aIconSet, final float aToolSpeed,
+ final int aToolDurability, final int aToolQuality, final int aTypes, final int aR, final int aG,
+ final int aB, final int aA, final String aLocalName, final int aFuelType, final int aFuelPower,
+ final int aMeltingPoint, final int aBlastFurnaceTemp, final boolean aBlastFurnaceRequired,
+ final boolean aTransparent, final int aOreValue, final int aDensityMultiplier, final int aDensityDivider,
+ final Dyes aColor, final Element aElement, final List<TC_AspectStack> aAspects) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aToolDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor);
+ this.mElement = aElement;
+ // mElement.mLinkedMaterials.add(this);
+ if (aElement == Element._NULL) {
+ this.mChemicalFormula = "Empty";
+ } else {
+ this.mChemicalFormula = aElement.toString();
+ this.mChemicalFormula = this.mChemicalFormula.replaceAll("_", "-");
+ }
+ this.mAspects.addAll(aAspects);
+ }
+
+ private GT_Materials(final int aMetaItemSubID, final TextureSet aIconSet, final float aToolSpeed,
+ final int aToolDurability, final int aToolQuality, final int aTypes, final int aR, final int aG,
+ final int aB, final int aA, final String aLocalName, final int aFuelType, final int aFuelPower,
+ final int aMeltingPoint, final int aBlastFurnaceTemp, final boolean aBlastFurnaceRequired,
+ final boolean aTransparent, final int aOreValue, final int aDensityMultiplier, final int aDensityDivider,
+ final Dyes aColor, final int aExtraData, final List<MaterialStack> aMaterialList) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aToolDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor,
+ aExtraData,
+ aMaterialList,
+ null);
+ }
+
+ private GT_Materials(final int aMetaItemSubID, final TextureSet aIconSet, final float aToolSpeed,
+ final int aToolDurability, final int aToolQuality, final int aTypes, final int aR, final int aG,
+ final int aB, final int aA, final String aLocalName, final int aFuelType, final int aFuelPower,
+ final int aMeltingPoint, final int aBlastFurnaceTemp, final boolean aBlastFurnaceRequired,
+ final boolean aTransparent, final int aOreValue, final int aDensityMultiplier, final int aDensityDivider,
+ final Dyes aColor, final int aExtraData, final List<MaterialStack> aMaterialList,
+ final List<TC_AspectStack> aAspects) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aToolDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor);
+ this.mExtraData = aExtraData;
+ this.mMaterialList.addAll(aMaterialList);
+ this.mChemicalFormula = "";
+ for (final MaterialStack tMaterial : this.mMaterialList) {
+ this.mChemicalFormula += tMaterial.toString();
+ }
+ this.mChemicalFormula = this.mChemicalFormula.replaceAll("_", "-");
+
+ int tAmountOfComponents = 0, tMeltingPoint = 0;
+ for (final MaterialStack tMaterial : this.mMaterialList) {
+ tAmountOfComponents += tMaterial.mAmount;
+ if (tMaterial.mMaterial.mMeltingPoint > 0) {
+ tMeltingPoint += tMaterial.mMaterial.mMeltingPoint * tMaterial.mAmount;
+ }
+ if (aAspects == null) {
+ for (final TC_AspectStack tAspect : tMaterial.mMaterial.mAspects) {
+ tAspect.addToAspectList(this.mAspects);
+ }
+ }
+ }
+
+ if (this.mMeltingPoint < 0) {
+ this.mMeltingPoint = (short) (tMeltingPoint / tAmountOfComponents);
+ }
+
+ tAmountOfComponents *= aDensityMultiplier;
+ tAmountOfComponents /= aDensityDivider;
+ if (aAspects == null) {
+ for (final TC_AspectStack tAspect : this.mAspects) {
+ tAspect.mAmount = Math.max(1, tAspect.mAmount / Math.max(1, tAmountOfComponents));
+ }
+ } else {
+ this.mAspects.addAll(aAspects);
+ }
+ }
+
+ public static GT_Materials get(final String aMaterialName) {
+ final Object tObject = GT_Utility.getFieldContent(GT_Materials.class, aMaterialName, false, false);
+ if ((tObject != null) && (tObject instanceof GT_Materials)) {
+ return (GT_Materials) tObject;
+ }
+ return _NULL;
+ }
+
+ public static GT_Materials getRealMaterial(final String aMaterialName) {
+ return get(aMaterialName).mMaterialInto;
+ }
+
+ /**
+ * Called in preInit with the Config to set Values.
+ *
+ * @param aConfiguration
+ */
+ public static void init(final GT_Config aConfiguration) {
+ for (final GT_Materials tMaterial : VALUES) {
+ final String tString = tMaterial.toString()
+ .toLowerCase();
+ tMaterial.mHeatDamage = (float) aConfiguration
+ .get(ConfigCategories.Materials.heatdamage, tString, tMaterial.mHeatDamage);
+ if (tMaterial.mBlastFurnaceRequired) {
+ tMaterial.mBlastFurnaceRequired = aConfiguration
+ .get(ConfigCategories.Materials.blastfurnacerequirements, tString, true);
+ }
+ if (tMaterial.mBlastFurnaceRequired && aConfiguration.get(
+ ConfigCategories.Materials.blastinductionsmelter,
+ tString,
+ tMaterial.mBlastFurnaceTemp < 1500)) {}
+ }
+ }
+
+ public boolean isRadioactive() {
+ if (this.mElement != null) {
+ return this.mElement.mHalfLifeSeconds >= 0;
+ }
+ for (final MaterialStack tMaterial : this.mMaterialList) {
+ if (tMaterial.mMaterial.isRadioactive()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public long getProtons() {
+ if (this.mElement != null) {
+ return this.mElement.getProtons();
+ }
+ if (this.mMaterialList.size() <= 0) {
+ return Element.Tc.getProtons();
+ }
+ long rAmount = 0, tAmount = 0;
+ for (final MaterialStack tMaterial : this.mMaterialList) {
+ tAmount += tMaterial.mAmount;
+ rAmount += tMaterial.mAmount * tMaterial.mMaterial.getProtons();
+ }
+ return (this.getDensity() * rAmount) / (tAmount * M);
+ }
+
+ public long getNeutrons() {
+ if (this.mElement != null) {
+ return this.mElement.getNeutrons();
+ }
+ if (this.mMaterialList.size() <= 0) {
+ return Element.Tc.getNeutrons();
+ }
+ long rAmount = 0, tAmount = 0;
+ for (final MaterialStack tMaterial : this.mMaterialList) {
+ tAmount += tMaterial.mAmount;
+ rAmount += tMaterial.mAmount * tMaterial.mMaterial.getNeutrons();
+ }
+ return (this.getDensity() * rAmount) / (tAmount * M);
+ }
+
+ public long getMass() {
+ if (this.mElement != null) {
+ return this.mElement.getMass();
+ }
+ if (this.mMaterialList.size() <= 0) {
+ return Element.Tc.getMass();
+ }
+ long rAmount = 0, tAmount = 0;
+ for (final MaterialStack tMaterial : this.mMaterialList) {
+ tAmount += tMaterial.mAmount;
+ rAmount += tMaterial.mAmount * tMaterial.mMaterial.getMass();
+ }
+ return (this.getDensity() * rAmount) / (tAmount * M);
+ }
+
+ public long getDensity() {
+ return this.mDensity;
+ }
+
+ public String getToolTip() {
+ return this.getToolTip(1, false);
+ }
+
+ public String getToolTip(final boolean aShowQuestionMarks) {
+ return this.getToolTip(1, aShowQuestionMarks);
+ }
+
+ public String getToolTip(final long aMultiplier) {
+ return this.getToolTip(aMultiplier, false);
+ }
+
+ public String getToolTip(final long aMultiplier, final boolean aShowQuestionMarks) {
+ if (!aShowQuestionMarks && this.mChemicalFormula.equals("?")) {
+ return "";
+ }
+ if ((aMultiplier >= (M * 2)) && !this.mMaterialList.isEmpty()) {
+ return (((this.mElement != null)
+ || ((this.mMaterialList.size() < 2) && (this.mMaterialList.get(0).mAmount == 1)))
+ ? this.mChemicalFormula
+ : "(" + this.mChemicalFormula + ")")
+ + aMultiplier;
+ }
+ return this.mChemicalFormula;
+ }
+
+ /**
+ * Adds an ItemStack to this Material.
+ */
+ public GT_Materials add(final ItemStack aStack) {
+ if ((aStack != null) && !this.contains(aStack)) {
+ this.mMaterialItems.add(aStack);
+ }
+ return this;
+ }
+
+ /**
+ * This is used to determine if any of the ItemStacks belongs to this Material.
+ */
+ public boolean contains(final ItemStack... aStacks) {
+ if ((aStacks == null) || (aStacks.length <= 0)) {
+ return false;
+ }
+ for (final ItemStack tStack : this.mMaterialItems) {
+ for (final ItemStack aStack : aStacks) {
+ if (GT_Utility.areStacksEqual(aStack, tStack, !tStack.hasTagCompound())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * This is used to determine if an ItemStack belongs to this Material.
+ */
+ public boolean remove(final ItemStack aStack) {
+ if (aStack == null) {
+ return false;
+ }
+ boolean temp = false;
+ for (int i = 0; i < this.mMaterialItems.size(); i++) {
+ if (GT_Utility.areStacksEqual(aStack, this.mMaterialItems.get(i))) {
+ this.mMaterialItems.remove(i--);
+ temp = true;
+ }
+ }
+ return temp;
+ }
+
+ /**
+ * Adds a SubTag to this Material
+ */
+ @Override
+ public ISubTagContainer add(final SubTag... aTags) {
+ if (aTags != null) {
+ for (final SubTag aTag : aTags) {
+ if ((aTag != null) && !this.contains(aTag)) {
+ aTag.addContainerToList(this);
+ this.mSubTags.add(aTag);
+ }
+ }
+ }
+ return this;
+ }
+
+ /**
+ * If this Material has this exact SubTag
+ */
+ @Override
+ public boolean contains(final SubTag aTag) {
+ return this.mSubTags.contains(aTag);
+ }
+
+ /**
+ * Removes a SubTag from this Material
+ */
+ @Override
+ public boolean remove(final SubTag aTag) {
+ return this.mSubTags.remove(aTag);
+ }
+
+ /**
+ * Sets the Heat Damage for this Material (negative = frost)
+ */
+ public GT_Materials setHeatDamage(final float aHeatDamage) {
+ this.mHeatDamage = aHeatDamage;
+ return this;
+ }
+
+ /**
+ * Adds a Material to the List of Byproducts when grinding this Ore. Is used for more precise Ore grinding, so
+ * that it is possible to choose between certain kinds of Materials.
+ */
+ public GT_Materials addOreByProduct(final GT_Materials aMaterial) {
+ if (!this.mOreByProducts.contains(aMaterial.mMaterialInto)) {
+ this.mOreByProducts.add(aMaterial.mMaterialInto);
+ }
+ return this;
+ }
+
+ /**
+ * Adds multiple Materials to the List of Byproducts when grinding this Ore. Is used for more precise Ore
+ * grinding, so that it is possible to choose between certain kinds of Materials.
+ */
+ public GT_Materials addOreByProducts(final GT_Materials... aMaterials) {
+ for (final GT_Materials tMaterial : aMaterials) {
+ if (tMaterial != null) {
+ this.addOreByProduct(tMaterial);
+ }
+ }
+ return this;
+ }
+
+ /**
+ * If this Ore gives multiple drops of its Main Material. Lapis Ore for example gives about 6 drops.
+ */
+ public GT_Materials setOreMultiplier(final int aOreMultiplier) {
+ if (aOreMultiplier > 0) {
+ this.mOreMultiplier = aOreMultiplier;
+ }
+ return this;
+ }
+
+ /**
+ * If this Ore gives multiple drops of its Byproduct Material.
+ */
+ public GT_Materials setByProductMultiplier(final int aByProductMultiplier) {
+ if (aByProductMultiplier > 0) {
+ this.mByProductMultiplier = aByProductMultiplier;
+ }
+ return this;
+ }
+
+ /**
+ * If this Ore gives multiple drops of its Main Material. Lapis Ore for example gives about 6 drops.
+ */
+ public GT_Materials setSmeltingMultiplier(final int aSmeltingMultiplier) {
+ if (aSmeltingMultiplier > 0) {
+ this.mSmeltingMultiplier = aSmeltingMultiplier;
+ }
+ return this;
+ }
+
+ /**
+ * This Ore should be smolten directly into an Ingot of this Material instead of an Ingot of itself.
+ */
+ public GT_Materials setDirectSmelting(final GT_Materials aMaterial) {
+ if (aMaterial != null) {
+ this.mDirectSmelting = aMaterial.mMaterialInto.mDirectSmelting;
+ }
+ return this;
+ }
+
+ /**
+ * This Material should be the Main Material this Ore gets ground into. Example, Chromite giving Chrome or
+ * Tungstate giving Tungsten.
+ */
+ public GT_Materials setOreReplacement(final GT_Materials aMaterial) {
+ if (aMaterial != null) {
+ this.mOreReplacement = aMaterial.mMaterialInto.mOreReplacement;
+ }
+ return this;
+ }
+
+ /**
+ * This Material smelts always into an instance of aMaterial. Used for Magnets.
+ */
+ public GT_Materials setSmeltingInto(final GT_Materials aMaterial) {
+ if (aMaterial != null) {
+ this.mSmeltInto = aMaterial.mMaterialInto.mSmeltInto;
+ }
+ return this;
+ }
+
+ /**
+ * This Material arc smelts always into an instance of aMaterial. Used for Wrought Iron.
+ */
+ public GT_Materials setArcSmeltingInto(final GT_Materials aMaterial) {
+ if (aMaterial != null) {
+ this.mArcSmeltInto = aMaterial.mMaterialInto.mArcSmeltInto;
+ }
+ return this;
+ }
+
+ /**
+ * This Material macerates always into an instance of aMaterial.
+ */
+ public GT_Materials setMaceratingInto(final GT_Materials aMaterial) {
+ if (aMaterial != null) {
+ this.mMacerateInto = aMaterial.mMaterialInto.mMacerateInto;
+ }
+ return this;
+ }
+
+ public GT_Materials setEnchantmentForTools(final Enchantment aEnchantment, final int aEnchantmentLevel) {
+ this.mEnchantmentTools = aEnchantment;
+ this.mEnchantmentToolsLevel = (byte) aEnchantmentLevel;
+ return this;
+ }
+
+ public GT_Materials setEnchantmentForArmors(final Enchantment aEnchantment, final int aEnchantmentLevel) {
+ this.mEnchantmentArmors = aEnchantment;
+ this.mEnchantmentArmorsLevel = (byte) aEnchantmentLevel;
+ return this;
+ }
+
+ public FluidStack getSolid(final long aAmount) {
+ if (this.mSolid == null) {
+ return null;
+ }
+ return new FluidStack(this.mSolid, (int) aAmount);
+ }
+
+ public FluidStack getFluid(final long aAmount) {
+ if (this.mFluid == null) {
+ return null;
+ }
+ return new FluidStack(this.mFluid, (int) aAmount);
+ }
+
+ public FluidStack getGas(final long aAmount) {
+ if (this.mGas == null) {
+ return null;
+ }
+ return new FluidStack(this.mGas, (int) aAmount);
+ }
+
+ public FluidStack getPlasma(final long aAmount) {
+ if (this.mPlasma == null) {
+ return null;
+ }
+ return new FluidStack(this.mPlasma, (int) aAmount);
+ }
+
+ public FluidStack getMolten(final long aAmount) {
+ if (this.mStandardMoltenFluid == null) {
+ return null;
+ }
+ return new FluidStack(this.mStandardMoltenFluid, (int) aAmount);
+ }
+
+ @Override
+ public short[] getRGBA() {
+ return this.mRGBa;
+ }
+
+ public static final int VERSION = 508;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechToolDictNames.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechToolDictNames.java
new file mode 100644
index 0000000000..0a116b1b9f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/enums/GregtechToolDictNames.java
@@ -0,0 +1,9 @@
+package gtPlusPlus.xmod.gregtech.api.enums;
+
+public enum GregtechToolDictNames {
+ craftingToolHandPump,
+ craftingToolAngleGrinder,
+ craftingToolElectricSnips,
+ craftingToolElectricLighter,
+ craftingToolElectricButcherKnife;
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/GTPP_UITextures.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/GTPP_UITextures.java
new file mode 100644
index 0000000000..e6276713f3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/GTPP_UITextures.java
@@ -0,0 +1,139 @@
+package gtPlusPlus.xmod.gregtech.api.gui;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import com.gtnewhorizons.modularui.api.drawable.AdaptableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+public class GTPP_UITextures {
+
+ public static final UITexture OVERLAY_SLOT_COAL = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/coal");
+ public static final UITexture OVERLAY_SLOT_CANISTER_DARK = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/canister_dark");
+
+ public static final AdaptableUITexture BACKGROUND_YELLOW = AdaptableUITexture
+ .of(GTPlusPlus.ID, "gui/background/yellow", 176, 166, 4);
+
+ public static final AdaptableUITexture SLOT_ITEM_YELLOW = AdaptableUITexture
+ .of(GTPlusPlus.ID, "gui/slot/item_yellow", 18, 18, 1);
+ public static final AdaptableUITexture[] SLOT_INVENTORY_MANAGER = new AdaptableUITexture[] {
+ AdaptableUITexture.of(GTPlusPlus.ID, "gui/slot/red", 18, 18, 1),
+ AdaptableUITexture.of(GTPlusPlus.ID, "gui/slot/green", 18, 18, 1),
+ AdaptableUITexture.of(GTPlusPlus.ID, "gui/slot/blue", 18, 18, 1),
+ AdaptableUITexture.of(GTPlusPlus.ID, "gui/slot/cyan", 18, 18, 1),
+ AdaptableUITexture.of(GTPlusPlus.ID, "gui/slot/magenta", 18, 18, 1),
+ AdaptableUITexture.of(GTPlusPlus.ID, "gui/slot/yellow", 18, 18, 1), };
+
+ public static final UITexture BUTTON_STANDARD_BRONZE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/button/standard_bronze");
+
+ public static final UITexture OVERLAY_SLOT_WEED_EX = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/weed_ex");
+ public static final UITexture OVERLAY_SLOT_FERTILIZER = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/fertilizer");
+ public static final UITexture OVERLAY_SLOT_ELECTRIC_TOOL = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/electric_tool");
+ public static final UITexture OVERLAY_SLOT_PAGE_PRINTED_BRONZE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/page_printed_bronze");
+ public static final UITexture OVERLAY_SLOT_ARROW = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow");
+ public static final UITexture OVERLAY_SLOT_ARROW_BRONZE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_bronze");
+ public static final UITexture OVERLAY_SLOT_CRAFT_OUTPUT = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/craft_output");
+ public static final UITexture OVERLAY_SLOT_CRAFT_OUTPUT_BRONZE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/craft_output_bronze");
+ public static final UITexture OVERLAY_SLOT_PARK = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/park");
+ public static final UITexture OVERLAY_SLOT_PARK_BRONZE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_slot/park_bronze");
+ public static final UITexture OVERLAY_SLOT_INGOT = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/ingot");
+ public static final UITexture OVERLAY_SLOT_ARROW_4 = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_4");
+ public static final UITexture OVERLAY_SLOT_TURBINE = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/turbine");
+ public static final UITexture OVERLAY_SLOT_CHEST = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/chest");
+ public static final UITexture[] OVERLAY_SLOT_INVENTORY_MANAGER_COLOR = new UITexture[] {
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/red"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/green"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/blue"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/cyan"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/magenta"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/yellow"), };
+ public static final UITexture[] OVERLAY_SLOT_INVENTORY_MANAGER_ARROW = new UITexture[] {
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_red"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_green"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_blue"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_cyan"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_magenta"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_slot/arrow_yellow"), };
+
+ public static final UITexture PROGRESSBAR_FLUID_REACTOR = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/progressbar/fluid_reactor");
+ public static final UITexture PROGRESSBAR_BOILER_EMPTY = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/progressbar/boiler_empty");
+ public static final UITexture PROGRESSBAR_FUEL = UITexture.fullImage(GTPlusPlus.ID, "gui/progressbar/fuel");
+ public static final UITexture PROGRESSBAR_ARROW_2 = UITexture.fullImage(GTPlusPlus.ID, "gui/progressbar/arrow_2");
+ public static final UITexture PROGRESSBAR_PSS_ENERGY = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/progressbar/pss_energy");
+
+ public static final AdaptableUITexture TAB_TITLE_YELLOW = AdaptableUITexture
+ .of(GTPlusPlus.ID, "gui/tab/title_yellow", 28, 28, 4);
+ public static final AdaptableUITexture TAB_TITLE_ANGULAR_YELLOW = AdaptableUITexture
+ .of(GTPlusPlus.ID, "gui/tab/title_angular_yellow", 28, 28, 4);
+ public static final AdaptableUITexture TAB_TITLE_DARK_YELLOW = AdaptableUITexture
+ .of(GTPlusPlus.ID, "gui/tab/title_dark_yellow", 28, 28, 4);
+
+ public static final UITexture OVERLAY_BUTTON_HARVESTER_MODE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/harvester_mode");
+ public static final UITexture OVERLAY_BUTTON_HARVESTER_TOGGLE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/harvester_toggle");
+ public static final UITexture OVERLAY_BUTTON_FLUSH = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/flush");
+ public static final UITexture OVERLAY_BUTTON_FLUSH_BRONZE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/flush_bronze");
+ public static final UITexture OVERLAY_BUTTON_AUTOMATION = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/automation");
+ public static final UITexture OVERLAY_BUTTON_LOCK = UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/lock");
+ public static final UITexture[] OVERLAY_BUTTON_THROUGHPUT = IntStream.range(0, 4) // GT_MetaTileEntity_ElectricAutoWorkbench#MAX_THROUGHPUT
+ .mapToObj(i -> UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/throughput_" + i))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+ public static final UITexture[] OVERLAY_BUTTON_MODE = IntStream.range(0, 10) // GT_MetaTileEntity_ElectricAutoWorkbench#MAX_MODES
+ .mapToObj(i -> UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/mode_" + i))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+ public static final UITexture[] OVERLAY_BUTTON_DIRECTION = new UITexture[] {
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/bottom"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/top"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/north"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/south"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/west"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/east"), };
+ public static final UITexture[] OVERLAY_BUTTON_DIRECTION_GRAY = new UITexture[] {
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/bottom_gray"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/top_gray"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/north_gray"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/south_gray"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/west_gray"),
+ UITexture.fullImage(GTPlusPlus.ID, "gui/overlay_button/east_gray"), };
+ public static final UITexture OVERLAY_BUTTON_TIP_GREEN = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/tip_green");
+ public static final UITexture OVERLAY_BUTTON_TIP_RED = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/tip_red");
+ public static final UITexture OVERLAY_BUTTON_ACTIVE_STATE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/active_state");
+ public static final UITexture OVERLAY_BUTTON_CHANGE_MODE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/change_mode");
+ public static final UITexture OVERLAY_BUTTON_PLUS_MINUS = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/overlay_button/plus_minus");
+
+ public static final UITexture PICTURE_WORKBENCH_CIRCLE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/picture/workbench_circle");
+ public static final UITexture PICTURE_ARROW_WHITE_DOWN = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/picture/arrow_white_down");
+ public static final UITexture PICTURE_REDSTONE_CIRCUIT_SCREEN = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/picture/redstone_circuit_screen");
+ public static final UITexture PICTURE_ELECTRICITY_ERROR = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/picture/electricity_error");
+ public static final UITexture PICTURE_ELECTRICITY_FINE = UITexture
+ .fullImage(GTPlusPlus.ID, "gui/picture/electricity_fine");
+ public static final UITexture PICTURE_ENERGY_FRAME = UITexture.fullImage(GTPlusPlus.ID, "gui/picture/energy_frame");
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/widget/ElectricSlotWidget.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/widget/ElectricSlotWidget.java
new file mode 100644
index 0000000000..e522d41799
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/widget/ElectricSlotWidget.java
@@ -0,0 +1,40 @@
+package gtPlusPlus.xmod.gregtech.api.gui.widget;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import ic2.api.info.Info;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+
+public class ElectricSlotWidget extends SlotWidget {
+
+ public ElectricSlotWidget(IItemHandlerModifiable handler, int index) {
+ this(new BaseSlot(handler, index, false) {
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+ });
+ }
+
+ private ElectricSlotWidget(BaseSlot slot) {
+ super(slot);
+ setFilter(
+ stack -> (accepts(stack)) || (stack.getItem() instanceof GT_MetaGenerated_Tool)
+ || (stack.getItem() instanceof IElectricItem));
+ }
+
+ private boolean accepts(final ItemStack stack) {
+ if (stack == null) {
+ return false;
+ }
+ return (Info.itemEnergy.getEnergyValue(stack) > 0.0D)
+ || (ElectricItem.manager.discharge(stack, (1.0D / 0.0D), 4, true, true, true) > 0.0D);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/GregtechItemContainer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/GregtechItemContainer.java
new file mode 100644
index 0000000000..9431739c45
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/GregtechItemContainer.java
@@ -0,0 +1,40 @@
+package gtPlusPlus.xmod.gregtech.api.interfaces;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+public interface GregtechItemContainer {
+
+ public Item getItem();
+
+ public Block getBlock();
+
+ public boolean isStackEqual(Object aStack);
+
+ public boolean isStackEqual(Object aStack, boolean aWildcard, boolean aIgnoreNBT);
+
+ public ItemStack get(long aAmount, Object... aReplacements);
+
+ public ItemStack getWildcard(long aAmount, Object... aReplacements);
+
+ public ItemStack getUndamaged(long aAmount, Object... aReplacements);
+
+ public ItemStack getAlmostBroken(long aAmount, Object... aReplacements);
+
+ public ItemStack getWithDamage(long aAmount, long aMetaValue, Object... aReplacements);
+
+ public GregtechItemContainer set(Item aItem);
+
+ public GregtechItemContainer set(ItemStack aStack);
+
+ public GregtechItemContainer registerOre(Object... aOreNames);
+
+ public GregtechItemContainer registerWildcardAsOre(Object... aOreNames);
+
+ public ItemStack getWithCharge(long aAmount, int aEnergy, Object... aReplacements);
+
+ public ItemStack getWithName(long aAmount, String aDisplayName, Object... aReplacements);
+
+ public boolean hasBeenSet();
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/IGregtech_RecipeAdder.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/IGregtech_RecipeAdder.java
new file mode 100644
index 0000000000..faa39dadc3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/IGregtech_RecipeAdder.java
@@ -0,0 +1,380 @@
+package gtPlusPlus.xmod.gregtech.api.interfaces.internal;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.core.material.Material;
+
+@SuppressWarnings("UnusedReturnValue")
+public interface IGregtech_RecipeAdder {
+
+ /**
+ * Adds a Coke Oven Recipe
+ *
+ * @param aInput1 = first Input (not null, and respects StackSize)
+ * @param aInput2 = second Input (can be null, and respects StackSize)
+ * @param aFluidOutput = Output of the Creosote (not null, and respects StackSize)
+ * @param aFluidInput = fluid Input (can be null, and respects StackSize)
+ * @param aOutput = Output of the Coal/coke (can be null, and respects StackSize)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+ boolean addCokeOvenRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack aOutput, int aDuration, int aEUt);
+
+ boolean addCokeOvenRecipe(int aCircuit, ItemStack aInput2, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs,
+ ItemStack[] aOutputs, int aDuration, int aEUt);
+
+ boolean addCokeOvenRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int aDuration, int aEUt);
+
+ /**
+ * Adds a Matter Fabricator Recipe
+ *
+ * @param aFluidOutput = Output of the UU-Matter (not null, and respects StackSize)
+ * @param aFluidInput = fluid Input (can be UU_Amp or null, and respects StackSize)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+ @Deprecated
+ boolean addMatterFabricatorRecipe(FluidStack aFluidInput, FluidStack aFluidOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Dehydrator. (up to 9 Outputs)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aFluidInput = fluid Input (can be UU_Amp or null, and respects StackSize)
+ * @param aFluidOutput = Output of the UU-Matter (not null, and respects StackSize)
+ * @param aOutputItems = ItemStack[] (not null, and respects StackSize)
+ * @param aChances = Output Change (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+ boolean addDehydratorRecipe(ItemStack[] aInput, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack[] aOutputItems, int[] aChances, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Alloy Blast Smelter. (up to 9 Inputs)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aOutput = Output of the Molten Metal (not null, and respects StackSize)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aOutput, int aChance, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Alloy Blast Smelter. (up to 9 Inputs)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aInputFluid = Input of a fluid (can be null, and respects StackSize)
+ * @param aOutput = Output of the Molten Metal (not null, and respects StackSize)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Alloy Blast Smelter. (up to 9 Inputs, More than 1 Fluids)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aInputFluid = FluidStack[] (can be null, and respects StackSize)
+ * @param aOutput = Output of the Molten Metal (not null, and respects StackSize)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Alloy Blast Smelter. (up to 9 Inputs)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aInputFluid = Input of a fluid (can be null, and respects StackSize)
+ * @param aOutput = Output of the Molten Metal (not null, and respects StackSize)
+ * @param aOutputStack = Item Output (Can be null)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt);
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt, int aSpecialValue);
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue, boolean aOptimizeRecipe);
+
+ /**
+ * Adds a Recipe for the Alloy Blast Smelter. (up to 9 Inputs, More than 1 fluids)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aInputFluid = FluidStack[] (can be null, and respects StackSize)
+ * @param aOutput = Output of the Molten Metal (not null, and respects StackSize)
+ * @param aOutputStack = Item Output (Can be null)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt);
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt, int aSpecialValue);
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue, boolean aOptimizeRecipe);
+
+ /**
+ * Adds a Recipe for the LFTRr. (up to 9 Inputs)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aInputFluid = Input of a fluid (can be null, and respects StackSize)
+ * @param aOutput = Output of the Molten Salts (not null, and respects StackSize)
+ * @param aOutputStack = Item Output (Can be null)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @param aSpecialValue = Power produced in EU/t per dynamo
+ * @return true if the Recipe got added, otherwise false.
+ */
+
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue);
+
+ /**
+ * Adds a Recipe for the Quantum Force Smelter (up to 9 Inputs)
+ *
+ *
+ **/
+ boolean addQuantumTransformerRecipe(ItemStack[] aInput, FluidStack[] aFluidInput, FluidStack[] aFluidOutput,
+ ItemStack[] aOutputStack, int[] aChances, int aDuration, int aEUt, int aSpecialValue);
+
+ /**
+ * Adds a Recipe for the LFTRr. (up to 9 Inputs, More than 1 fluids)
+ *
+ * @param aInput = ItemStack[] (not null, and respects StackSize)
+ * @param aInputFluid = FluidStack[] (can be null, and respects StackSize)
+ * @param aOutput = Output of the Molten Salts (not null, and respects StackSize)
+ * @param aOutputStack = Item Output (Can be null)
+ * @param aChance = Output Chance (can be == 0)
+ * @param aDuration = Duration (must be >= 0)
+ * @param aEUt = EU per tick needed for heating up (must be >= 0)
+ * @param aSpecialValue = Power produced in EU/t per dynamo
+ * @return true if the Recipe got added, otherwise false.
+ */
+ @Deprecated
+ boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue);
+
+ /**
+ * Adds a custom Semifluid fuel for the GT++ SemiFluid Generators.
+ *
+ * @param aFuelItem - A Fluidstack to be consumed.
+ * @param aFuelValue - Fuel value in thousands (1 = 1000)
+ * @return - Was the Fuel added?
+ */
+ boolean addSemifluidFuel(FluidStack aFuelItem, int aFuelValue);
+
+ /**
+ * Adds a custom Semifluid fuel for the GT++ SemiFluid Generators.
+ *
+ * @param aFuelItem - A Fluidstack to be consumed.
+ * @param aFuelValue - Fuel value in thousands (1 = 1000)
+ * @return - Was the Fuel added?
+ */
+ boolean addSemifluidFuel(ItemStack aFuelItem, int aFuelValue);
+
+ boolean addFissionFuel(FluidStack aInput1, FluidStack aInput2, FluidStack aInput3, FluidStack aInput4,
+ FluidStack aInput5, FluidStack aInput6, FluidStack aInput7, FluidStack aInput8, FluidStack aInput9,
+ FluidStack aOutput1, FluidStack aOutput2, int aDuration, int aEUt);
+
+ boolean addFissionFuel(boolean aOptimise, FluidStack aInput1, FluidStack aInput2, FluidStack aInput3,
+ FluidStack aInput4, FluidStack aInput5, FluidStack aInput6, FluidStack aInput7, FluidStack aInput8,
+ FluidStack aInput9, FluidStack aOutput1, FluidStack aOutput2, int aDuration, int aEUt);
+
+ boolean addCyclotronRecipe(ItemStack aInput, FluidStack aFluidInput, ItemStack[] aOutputs, FluidStack aFluidOutput,
+ int[] aChances, int aDuration, int aEUt, int aSpecialValue);
+
+ boolean addCyclotronRecipe(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack[] aOutput,
+ FluidStack aFluidOutput, int[] aChances, int aDuration, int aEUt, int aSpecialValue);
+
+ @Deprecated
+ boolean addMixerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ ItemStack aOutput4, int aDuration, int aEUt);
+
+ boolean addMultiblockCentrifugeRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs,
+ ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial);
+
+ boolean addMultiblockElectrolyzerRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs,
+ ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial);
+
+ boolean addAdvancedFreezerRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs,
+ ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial);
+
+ @Deprecated
+ boolean addSixSlotAssemblingRecipe(ItemStack[] aInputs, FluidStack aInputFluid, ItemStack aOutput1, int aDuration,
+ int aEUt);
+
+ /**
+ * Adds an Assemblyline Recipe
+ *
+ * @param aInputs must be != null, 4-16 inputs
+ * @param aFluidInputs 0-4 fluids
+ * @param aOutput must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addAssemblylineRecipe(ItemStack aResearchItem, int aResearchTime, ItemStack[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds a Assemblyline Recipe
+ *
+ * @param aInputs elements should be: ItemStack for single item; ItemStack[] for multiple equivalent items;
+ * {OreDict, amount} for oredict.
+ */
+ @Deprecated
+ boolean addAssemblylineRecipe(ItemStack aResearchItem, int aResearchTime, Object[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput1, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack input1, ItemStack input2, FluidStack inputFluid, FluidStack outputFluid,
+ ItemStack output, int time, int eu);
+
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack input1, ItemStack input2, FluidStack inputFluid, FluidStack outputFluid,
+ ItemStack output, Object object, int time, int eu);
+
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack input1, ItemStack input2, FluidStack inputFluid, FluidStack outputFluid,
+ ItemStack output, ItemStack object, int time);
+
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack input1, ItemStack input2, int aCircuit, FluidStack inputFluid,
+ FluidStack outputFluid, ItemStack output, ItemStack output2, int time, int eu);
+
+ @Deprecated
+ boolean addMultiblockChemicalRecipe(ItemStack[] itemStacks, FluidStack[] fluidStacks, FluidStack[] fluidStacks2,
+ ItemStack[] outputs, int time, int eu);
+
+ @Deprecated
+ boolean addCompressorRecipe(ItemStack aInput1, ItemStack aOutput1, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addBrewingRecipe(ItemStack aIngredient, FluidStack aInput, FluidStack aOutput, int aTime, int aEu,
+ boolean aHidden);
+
+ @Deprecated
+ boolean addBrewingRecipe(int aCircuit, FluidStack aInput, FluidStack aOutput, int aTime, int aEu, boolean aHidden);
+
+ @Deprecated
+ boolean addSmeltingAndAlloySmeltingRecipe(ItemStack aDust, ItemStack aOutput);
+
+ @Deprecated
+ boolean addFluidExtractionRecipe(ItemStack input, FluidStack output, int aTime, int aEu);
+
+ @Deprecated
+ boolean addFluidExtractionRecipe(ItemStack aContainer, ItemStack aFullContainer, FluidStack rFluidOut, int aTime,
+ int aEu);
+
+ @Deprecated
+ boolean addFluidCannerRecipe(ItemStack aContainer, ItemStack aFullContainer, FluidStack rFluidIn);
+
+ @Deprecated
+ boolean addFluidCannerRecipe(ItemStack aContainer, ItemStack aFullContainer, FluidStack rFluidIn,
+ FluidStack rFluidOut);
+
+ @Deprecated
+ boolean addFluidCannerRecipe(ItemStack aContainer, ItemStack aFullContainer, FluidStack rFluidIn,
+ FluidStack rFluidOut, int aTime, int aEu);
+
+ boolean addVacuumFurnaceRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, int aDuration, int aEUt, int aLevel);
+
+ boolean addVacuumFurnaceRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aLevel);
+
+ @Deprecated
+ boolean addUvLaserRecipe(ItemStack aInput1, ItemStack aOutput, int time, long eu);
+
+ boolean addChemicalPlantRecipe(ItemStack[] aInputs, FluidStack[] aInputFluids, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int time, long eu, int aTier);
+
+ boolean addChemicalPlantRecipe(ItemStack[] aInputs, FluidStack[] aInputFluids, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int[] aChances, int time, long eu, int aTier);
+
+ @Deprecated
+ boolean addBlastRecipe(ItemStack[] aInputs, FluidStack[] aInputFluids, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int time, long eu, int aHeat);
+
+ @Deprecated
+ boolean addPyrolyseRecipe(ItemStack aInput, FluidStack aFluidInput, int intCircuit, ItemStack aOutput,
+ FluidStack aFluidOutput, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addExtractorRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addExtractorRecipe(ItemStack aInput, ItemStack aOutput, int aChance, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addDistilleryRecipe(ItemStack aCircuit, FluidStack aInput, FluidStack aOutput, ItemStack aSolidOutput,
+ int aDuration, int aEUt, boolean aHidden);
+
+ @Deprecated
+ boolean addPulverisationRecipe(final ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2,
+ final ItemStack aOutput3);
+
+ boolean addMillingRecipe(Materials aMat, int aEU);
+
+ boolean addMillingRecipe(Material aMat, int aEU);
+
+ boolean addFlotationRecipe(Materials aMat, ItemStack aXanthate, FluidStack[] aInputFluids,
+ FluidStack[] aOutputFluids, int aTime, int aEU);
+
+ boolean addFlotationRecipe(Material aMat, ItemStack aXanthate, FluidStack[] aInputFluids,
+ FluidStack[] aOutputFluids, int aTime, int aEU);
+
+ @Deprecated
+ boolean addpackagerRecipe(ItemStack aRecipeType, ItemStack aInput1, ItemStack aInput2, ItemStack aOutputStack1);
+
+ boolean addFuelForRTG(ItemStack aFuelPellet, int aFuelDays, int aVoltage);
+
+ boolean addColdTrapRecipe(int aCircuit, ItemStack aInput, FluidStack aFluidInput, ItemStack[] aOutputs,
+ int[] aChances, FluidStack aFluidOutput, int aTime, int aEU);
+
+ boolean addReactorProcessingUnitRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ ItemStack[] aOutputs, int[] aChances, FluidStack aFluidOutput, int aTime, int aEU);
+
+ @Deprecated
+ boolean addFluidHeaterRecipe(ItemStack aCircuit, FluidStack aInput, FluidStack aOutput, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addVacuumFreezerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEU);
+
+ boolean addMolecularTransformerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEU);
+
+ boolean addMolecularTransformerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEU, int aAmps);
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ItemBehaviour.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ItemBehaviour.java
new file mode 100644
index 0000000000..545a97288f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ItemBehaviour.java
@@ -0,0 +1,46 @@
+package gtPlusPlus.xmod.gregtech.api.interfaces.internal;
+
+import java.util.List;
+
+import net.minecraft.dispenser.IBlockSource;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import gregtech.api.enums.SubTag;
+import gtPlusPlus.xmod.gregtech.api.items.Gregtech_MetaItem_Base;
+
+public interface Interface_ItemBehaviour<E extends Item> {
+
+ public boolean onLeftClickEntity(E aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity);
+
+ public boolean onItemUse(E aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ int aSide, float hitX, float hitY, float hitZ);
+
+ public boolean onItemUseFirst(E aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ int aSide, float hitX, float hitY, float hitZ);
+
+ public ItemStack onItemRightClick(E aItem, ItemStack aStack, World aWorld, EntityPlayer aPlayer);
+
+ public List<String> getAdditionalToolTips(E aItem, List<String> aList, ItemStack aStack);
+
+ public void onUpdate(E aItem, ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, boolean aIsInHand);
+
+ public boolean isItemStackUsable(E aItem, ItemStack aStack);
+
+ public boolean canDispense(E aItem, IBlockSource aSource, ItemStack aStack);
+
+ public ItemStack onDispense(E aItem, IBlockSource aSource, ItemStack aStack);
+
+ public boolean hasProjectile(Gregtech_MetaItem_Base aItem, SubTag aProjectileType, ItemStack aStack);
+
+ public EntityArrow getProjectile(E aItem, SubTag aProjectileType, ItemStack aStack, World aWorld, double aX,
+ double aY, double aZ);
+
+ public EntityArrow getProjectile(E aItem, SubTag aProjectileType, ItemStack aStack, World aWorld,
+ EntityLivingBase aEntity, float aSpeed);
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_OreRecipeRegistrator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_OreRecipeRegistrator.java
new file mode 100644
index 0000000000..6ae25525bd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_OreRecipeRegistrator.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.api.interfaces.internal;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+
+public interface Interface_OreRecipeRegistrator {
+
+ /**
+ * Contains a Code Fragment, used in the OrePrefix to register Recipes. Better than using a switch/case, like I did
+ * before.
+ *
+ * @param aPrefix always != null
+ * @param aMaterial always != null, and can be == _NULL if the Prefix is Self Referencing or not Material based!
+ * @param aStack always != null
+ */
+ public void registerOre(GregtechOrePrefixes aPrefix, GT_Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack);
+
+ public void registerOre(GregtechOrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack copyAmount);
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ToolStats.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ToolStats.java
new file mode 100644
index 0000000000..97d952d4a1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/interfaces/internal/Interface_ToolStats.java
@@ -0,0 +1,202 @@
+package gtPlusPlus.xmod.gregtech.api.interfaces.internal;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.DamageSource;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.IToolStats;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gtPlusPlus.xmod.gregtech.api.items.Gregtech_MetaTool;
+
+/**
+ * The Stats for GT Tools. Not including any Material Modifiers.
+ * <p/>
+ * And this is supposed to not have any ItemStack Parameters as these are generic Stats.
+ */
+public interface Interface_ToolStats extends IToolStats {
+
+ /**
+ * Called when aPlayer crafts this Tool
+ */
+ @Override
+ public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer);
+
+ /**
+ * Called when this gets added to a Tool Item
+ */
+ public void onStatsAddedToTool(Gregtech_MetaTool gregtech_MetaTool, int aID);
+
+ /**
+ * @return Damage the Tool receives when breaking a Block. 100 is one Damage Point (or 100 EU).
+ */
+ @Override
+ public int getToolDamagePerBlockBreak();
+
+ /**
+ * @return Damage the Tool receives when converting the drops of a Block. 100 is one Damage Point (or 100 EU).
+ */
+ @Override
+ public int getToolDamagePerDropConversion();
+
+ /**
+ * @return Damage the Tool receives when being used as Container Item. 100 is one use, however it is usually 8 times
+ * more than normal.
+ */
+ @Override
+ public int getToolDamagePerContainerCraft();
+
+ /**
+ * @return Damage the Tool receives when being used as Weapon, 200 is the normal Value, 100 for actual Weapons.
+ */
+ @Override
+ public int getToolDamagePerEntityAttack();
+
+ /**
+ * @return Basic Quality of the Tool, 0 is normal. If increased, it will increase the general quality of all Tools
+ * of this Type. Decreasing is also possible.
+ */
+ @Override
+ public int getBaseQuality();
+
+ /**
+ * @return The Damage Bonus for this Type of Tool against Mobs. 1.0F is normal punch.
+ */
+ @Override
+ public float getBaseDamage();
+
+ /**
+ * @return This gets the Hurt Resistance time for Entities getting hit. (always does 1 as minimum)
+ */
+ @Override
+ public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity);
+
+ /**
+ * @return This is a multiplier for the Tool Speed. 1.0F = no special Speed.
+ */
+ @Override
+ public float getSpeedMultiplier();
+
+ /**
+ * @return This is a multiplier for the Tool Speed. 1.0F = no special Durability.
+ */
+ @Override
+ public float getMaxDurabilityMultiplier();
+
+ @Override
+ public DamageSource getDamageSource(EntityLivingBase aPlayer, Entity aEntity);
+
+ @Override
+ public String getMiningSound();
+
+ @Override
+ public String getCraftingSound();
+
+ @Override
+ public String getEntityHitSound();
+
+ @Override
+ public String getBreakingSound();
+
+ @Override
+ public Enchantment[] getEnchantments(ItemStack aStack);
+
+ @Override
+ public int[] getEnchantmentLevels(ItemStack aStack);
+
+ /**
+ * @return If this Tool can be used for blocking Damage like a Sword.
+ */
+ @Override
+ public boolean canBlock();
+
+ /**
+ * @return If this Tool can be used as an RC Crowbar.
+ */
+ @Override
+ public boolean isCrowbar();
+
+ /**
+ * @return If this Tool can be used as an BC Wrench.
+ */
+ @Override
+ public boolean isWrench();
+
+ /**
+ * @return If this Tool can be used as Weapon i.e. if that is the main purpose.
+ */
+ @Override
+ public boolean isWeapon();
+
+ /**
+ * @return If this Tool is a Ranged Weapon. Return false at isWeapon unless you have a Blade attached to your
+ * Bow/Gun or something
+ */
+ @Override
+ public boolean isRangedWeapon();
+
+ /**
+ * @return If this Tool can be used as Weapon i.e. if that is the main purpose.
+ */
+ @Override
+ public boolean isMiningTool();
+
+ /**
+ * aBlock.getHarvestTool(aMetaData) can return the following Values for example. "axe", "pickaxe", "sword",
+ * "shovel", "hoe", "grafter", "saw", "wrench", "crowbar", "file", "hammer", "plow", "plunger", "scoop",
+ * "screwdriver", "sense", "scythe", "softhammer", "cutter", "plasmatorch"
+ *
+ * @return If this is a minable Block. Tool Quality checks (like Diamond Tier or something) are separate from this
+ * check.
+ */
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData);
+
+ /**
+ * This lets you modify the Drop List, when this type of Tool has been used.
+ *
+ * @return the Amount of modified Items.
+ */
+ @Override
+ public int convertBlockDrops(List<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX,
+ int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent);
+
+ /**
+ * @return Returns a broken Version of the Item.
+ */
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack);
+
+ /**
+ * @return the Damage actually done to the Mob.
+ */
+ @Override
+ public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack,
+ EntityPlayer aPlayer);
+
+ /**
+ * @return the Damage actually done to the Mob.
+ */
+ @Override
+ public float getMagicDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack,
+ EntityPlayer aPlayer);
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack);
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack);
+
+ /**
+ * Called when this gets added to a Tool Item
+ */
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID);
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_Generic_Item.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_Generic_Item.java
new file mode 100644
index 0000000000..3ad04ab014
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_Generic_Item.java
@@ -0,0 +1,204 @@
+package gtPlusPlus.xmod.gregtech.api.items;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+import net.minecraft.block.BlockDispenser;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.dispenser.BehaviorDefaultDispenseItem;
+import net.minecraft.dispenser.BehaviorProjectileDispense;
+import net.minecraft.dispenser.IBlockSource;
+import net.minecraft.dispenser.IPosition;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.IProjectile;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.SubTag;
+import gregtech.api.interfaces.IProjectileItem;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+
+/**
+ * Extended by most Items, also used as a fallback Item, to prevent the accidental deletion when Errors occur.
+ */
+public class Gregtech_Generic_Item extends Item implements IProjectileItem {
+
+ private final String mName, mTooltip;
+ protected IIcon mIcon;
+
+ public Gregtech_Generic_Item(final String aUnlocalized, final String aEnglish, final String aEnglishTooltip) {
+ this(aUnlocalized, aEnglish, aEnglishTooltip, true);
+ }
+
+ public Gregtech_Generic_Item(final String aUnlocalized, final String aEnglish, final String aEnglishTooltip,
+ final boolean aWriteToolTipIntoLangFile) {
+ super();
+ this.mName = aUnlocalized;
+ GT_LanguageManager.addStringLocalization(this.mName + ".name", aEnglish);
+ if (GT_Utility.isStringValid(aEnglishTooltip)) {
+ GT_LanguageManager.addStringLocalization(
+ this.mTooltip = this.mName + ".tooltip_main",
+ aEnglishTooltip,
+ aWriteToolTipIntoLangFile);
+ } else {
+ this.mTooltip = null;
+ }
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GameRegistry.registerItem(this, this.mName, GTPlusPlus.ID);
+ BlockDispenser.dispenseBehaviorRegistry.putObject(this, new GT_Item_Dispense());
+ }
+
+ @Override
+ public final Item setUnlocalizedName(final String aName) {
+ return this;
+ }
+
+ @Override
+ public final String getUnlocalizedName() {
+ return this.mName;
+ }
+
+ @Override
+ public String getUnlocalizedName(final ItemStack aStack) {
+ return this.getHasSubtypes() ? this.mName + "." + this.getDamage(aStack) : this.mName;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(final IIconRegister aIconRegister) {
+ this.mIcon = aIconRegister.registerIcon(GTPlusPlus.ID + ":" + this.mName);
+ }
+
+ @Override
+ public boolean doesSneakBypassUse(final World aWorld, final int aX, final int aY, final int aZ,
+ final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public IIcon getIconFromDamage(final int par1) {
+ return this.mIcon;
+ }
+
+ public int getTier(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public void addInformation(final ItemStack aStack, final EntityPlayer aPlayer, final List aList,
+ final boolean aF3_H) {
+ if ((this.getMaxDamage() > 0) && !this.getHasSubtypes()) {
+ aList.add((aStack.getMaxDamage() - this.getDamage(aStack)) + " / " + aStack.getMaxDamage());
+ }
+ if (this.mTooltip != null) {
+ aList.add(GT_LanguageManager.getTranslation(this.mTooltip));
+ }
+ if (GT_ModHandler.isElectricItem(aStack)) {
+ aList.add("Tier: " + this.getTier(aStack));
+ }
+ this.addAdditionalToolTips(aList, aStack);
+ }
+
+ protected void addAdditionalToolTips(final List aList, final ItemStack aStack) {
+ //
+ }
+
+ @Override
+ public void onCreated(final ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ this.isItemStackUsable(aStack);
+ }
+
+ public boolean isItemStackUsable(final ItemStack aStack) {
+ return true;
+ }
+
+ public ItemStack onDispense(final IBlockSource aSource, final ItemStack aStack) {
+ final EnumFacing enumfacing = BlockDispenser.func_149937_b(aSource.getBlockMetadata());
+ final IPosition iposition = BlockDispenser.func_149939_a(aSource);
+ final ItemStack itemstack1 = aStack.splitStack(1);
+ BehaviorDefaultDispenseItem.doDispense(aSource.getWorld(), itemstack1, 6, enumfacing, iposition);
+ return aStack;
+ }
+
+ @Override
+ public EntityArrow getProjectile(final SubTag aProjectileType, final ItemStack aStack, final World aWorld,
+ final double aX, final double aY, final double aZ) {
+ return null;
+ }
+
+ @Override
+ public EntityArrow getProjectile(final SubTag aProjectileType, final ItemStack aStack, final World aWorld,
+ final EntityLivingBase aEntity, final float aSpeed) {
+ return null;
+ }
+
+ @Override
+ public boolean hasProjectile(final SubTag aProjectileType, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public ItemStack getContainerItem(final ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public boolean hasContainerItem(final ItemStack aStack) {
+ return this.getContainerItem(aStack) != null;
+ }
+
+ public static class GT_Item_Dispense extends BehaviorProjectileDispense {
+
+ @Override
+ public ItemStack dispenseStack(final IBlockSource aSource, final ItemStack aStack) {
+ return ((Gregtech_Generic_Item) aStack.getItem()).onDispense(aSource, aStack);
+ }
+
+ @Override
+ protected IProjectile getProjectileEntity(final World aWorld, final IPosition aPosition) {
+ return null;
+ }
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ if (stack.getDisplayName()
+ .contains("LuV")) {
+ HEX_OxFFFFFF = 0xffffcc;
+ } else if (stack.getDisplayName()
+ .contains("ZPM")) {
+ HEX_OxFFFFFF = 0xace600;
+ } else if (stack.getDisplayName()
+ .contains("UV")) {
+ HEX_OxFFFFFF = 0xffff00;
+ } else if (stack.getDisplayName()
+ .contains("MAX")) {
+ HEX_OxFFFFFF = 0xff0000;
+ } else if (stack.getDisplayName()
+ .contains("Sodium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(0, 0, 150);
+ } else if (stack.getDisplayName()
+ .contains("Cadmium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(50, 50, 60);
+ } else if (stack.getDisplayName()
+ .contains("Lithium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(225, 220, 255);
+ } else {
+ HEX_OxFFFFFF = 0xffffff;
+ }
+ return HEX_OxFFFFFF;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem.java
new file mode 100644
index 0000000000..015ba9d716
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem.java
@@ -0,0 +1,357 @@
+package gtPlusPlus.xmod.gregtech.api.items;
+
+import static gregtech.api.enums.GT_Values.D1;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumAction;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+import gregtech.api.interfaces.IFoodStat;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.IItemContainer;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.Interface_ItemBehaviour;
+
+public abstract class Gregtech_MetaItem extends Gregtech_MetaItem_Base {
+
+ /**
+ * All instances of this Item Class are listed here. This gets used to register the Renderer to all Items of this
+ * Type, if useStandardMetaItemRenderer() returns true.
+ * <p/>
+ * You can also use the unlocalized Name gotten from getUnlocalizedName() as Key if you want to get a specific Item.
+ */
+ public static final HashMap<String, Gregtech_MetaItem> sInstances = new HashMap<>();
+
+ /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */
+
+ public final short mOffset, mItemAmount;
+ public final BitSet mEnabledItems;
+ public final BitSet mVisibleItems;
+ public final IIcon[][] mIconList;
+
+ public final HashMap<Short, IFoodStat> mFoodStats = new HashMap<>();
+ public final HashMap<Short, Long[]> mElectricStats = new HashMap<>();
+ public final HashMap<Short, Long[]> mFluidContainerStats = new HashMap<>();
+ public final HashMap<Short, Short> mBurnValues = new HashMap<>();
+
+ /**
+ * Creates the Item using these Parameters.
+ *
+ * @param aUnlocalized The Unlocalized Name of this Item.
+ */
+ public Gregtech_MetaItem(final String aUnlocalized, final short aOffset, final short aItemAmount) {
+ super(aUnlocalized);
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ this.setHasSubtypes(true);
+ this.setMaxDamage(0);
+ this.mEnabledItems = new BitSet(aItemAmount);
+ this.mVisibleItems = new BitSet(aItemAmount);
+
+ this.mOffset = (short) Math.min(32766, aOffset);
+ this.mItemAmount = (short) Math.min(aItemAmount, 32766 - this.mOffset);
+ this.mIconList = new IIcon[aItemAmount][1];
+
+ sInstances.put(this.getUnlocalizedName(), this);
+ }
+
+ /**
+ * This adds a Custom Item to the ending Range.
+ *
+ * @param aID The Id of the assigned Item [0 - mItemAmount] (The MetaData gets auto-shifted by +mOffset)
+ * @param aEnglish The Default Localized Name of the created Item
+ * @param aToolTip The Default ToolTip of the created Item, you can also insert null for having no ToolTip
+ * @param aFoodBehavior The Food Value of this Item. Can be null aswell. Just a convenience thing.
+ * @param aRandomData The OreDict Names you want to give the Item. Also used for TC Aspects and some other things.
+ * @return An ItemStack containing the newly created Item.
+ */
+ public final ItemStack addItem(final int aID, final String aEnglish, String aToolTip, final Object... aRandomData) {
+ if (aToolTip == null) {
+ aToolTip = "";
+ }
+ if ((aID >= 0) && (aID < this.mItemAmount)) {
+ final ItemStack rStack = new ItemStack(this, 1, this.mOffset + aID);
+ this.mEnabledItems.set(aID);
+ this.mVisibleItems.set(aID);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName(rStack) + ".name", aEnglish);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName(rStack) + ".tooltip", aToolTip);
+ final List<TC_AspectStack> tAspects = new ArrayList<>();
+ // Important Stuff to do first
+ for (final Object tRandomData : aRandomData) {
+ if (tRandomData instanceof SubTag) {
+ if (tRandomData == SubTag.INVISIBLE) {
+ this.mVisibleItems.set(aID, false);
+ continue;
+ }
+ if (tRandomData == SubTag.NO_UNIFICATION) {
+ GT_OreDictUnificator.addToBlacklist(rStack);
+ continue;
+ }
+ }
+ }
+ // now check for the rest
+ for (final Object tRandomData : aRandomData) {
+ if (tRandomData != null) {
+ boolean tUseOreDict = true;
+
+ if (tRandomData instanceof Interface_ItemBehaviour) {
+ this.addItemBehavior(
+ this.mOffset + aID,
+ (Interface_ItemBehaviour<Gregtech_MetaItem_Base>) tRandomData);
+ tUseOreDict = false;
+ }
+ if (tRandomData instanceof IItemContainer) {
+ ((IItemContainer) tRandomData).set(rStack);
+ tUseOreDict = false;
+ }
+ if (tRandomData instanceof SubTag) {
+ continue;
+ }
+ if (tRandomData instanceof TC_AspectStack) {
+ ((TC_AspectStack) tRandomData).addToAspectList(tAspects);
+ continue;
+ }
+ if (tRandomData instanceof ItemData) {
+ if (GT_Utility.isStringValid(tRandomData)) {
+ GT_OreDictUnificator.registerOre(tRandomData, rStack);
+ } else {
+ GT_OreDictUnificator.addItemData(rStack, (ItemData) tRandomData);
+ }
+ continue;
+ }
+ if (tUseOreDict) {
+ GT_OreDictUnificator.registerOre(tRandomData, rStack);
+ continue;
+ }
+ }
+ }
+ if (GregTech_API.sThaumcraftCompat != null) {
+ GregTech_API.sThaumcraftCompat.registerThaumcraftAspectsToItem(rStack, tAspects, false);
+ }
+ return rStack;
+ }
+ return null;
+ }
+
+ /**
+ * Sets the Furnace Burn Value for the Item.
+ *
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aValue 200 = 1 Burn Process = 500 EU, max = 32767 (that is 81917.5 EU)
+ * @return the Item itself for convenience in constructing.
+ */
+ public final Gregtech_MetaItem setBurnValue(final int aMetaValue, final int aValue) {
+ if ((aMetaValue < 0) || (aMetaValue >= (this.mOffset + this.mEnabledItems.length())) || (aValue < 0)) {
+ return this;
+ }
+ if (aValue == 0) {
+ this.mBurnValues.remove((short) aMetaValue);
+ } else {
+ this.mBurnValues.put((short) aMetaValue, aValue > Short.MAX_VALUE ? Short.MAX_VALUE : (short) aValue);
+ }
+ return this;
+ }
+
+ /**
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aMaxCharge Maximum Charge. (if this is == 0 it will remove the Electric Behavior)
+ * @param aTransferLimit Transfer Limit.
+ * @param aTier The electric Tier.
+ * @param aSpecialData If this Item has a Fixed Charge, like a SingleUse Battery (if > 0). Use -1 if you want to
+ * make this Battery chargeable (the use and canUse Functions will still discharge if you just
+ * use this) Use -2 if you want to make this Battery dischargeable. Use -3 if you want to make
+ * this Battery charge/discharge-able.
+ * @return the Item itself for convenience in constructing.
+ */
+ public final Gregtech_MetaItem setElectricStats(final int aMetaValue, final long aMaxCharge,
+ final long aTransferLimit, final long aTier, final long aSpecialData, final boolean aUseAnimations) {
+ if ((aMetaValue < 0) || (aMetaValue >= (this.mOffset + this.mEnabledItems.length()))) {
+ return this;
+ }
+ if (aMaxCharge == 0) {
+ this.mElectricStats.remove((short) aMetaValue);
+ } else {
+ this.mElectricStats.put(
+ (short) aMetaValue,
+ new Long[] { aMaxCharge, Math.max(0, aTransferLimit), Math.max(-1, aTier), aSpecialData });
+ if ((aMetaValue >= this.mOffset) && aUseAnimations) {
+ this.mIconList[aMetaValue - this.mOffset] = Arrays.copyOf(
+ this.mIconList[aMetaValue - this.mOffset],
+ Math.max(9, this.mIconList[aMetaValue - this.mOffset].length));
+ }
+ }
+ return this;
+ }
+
+ /**
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aMaxCharge Maximum Charge. (if this is == 0 it will remove the Electric Behavior)
+ * @param aTransferLimit Transfer Limit.
+ * @param aTier The electric Tier.
+ * @param aSpecialData If this Item has a Fixed Charge, like a SingleUse Battery (if > 0). Use -1 if you want to
+ * make this Battery chargeable (the use and canUse Functions will still discharge if you just
+ * use this) Use -2 if you want to make this Battery dischargeable. Use -3 if you want to make
+ * this Battery charge/discharge-able.
+ * @return the Item itself for convenience in constructing.
+ */
+ public final Gregtech_MetaItem setFluidContainerStats(final int aMetaValue, final long aCapacity,
+ final long aStacksize) {
+ if ((aMetaValue < 0) || (aMetaValue >= (this.mOffset + this.mEnabledItems.length()))) {
+ return this;
+ }
+ if (aCapacity < 0) {
+ this.mElectricStats.remove((short) aMetaValue);
+ } else {
+ this.mFluidContainerStats.put((short) aMetaValue, new Long[] { aCapacity, Math.max(1, aStacksize) });
+ }
+ return this;
+ }
+
+ /**
+ * @return if this MetaGenerated Item should use my Default Renderer System.
+ */
+ public boolean useStandardMetaItemRenderer() {
+ return true;
+ }
+
+ /**
+ * @return the Color Modulation the Material is going to be rendered with.
+ */
+ public short[] getRGBa(final ItemStack aStack) {
+ return Materials._NULL.getRGBA();
+ }
+
+ /**
+ * @return the Icon the Material is going to be rendered with.
+ */
+ public IIconContainer getIconContainer(final int aMetaData) {
+ return null;
+ }
+
+ /* ---------- INTERNAL OVERRIDES ---------- */
+
+ @Override
+ public ItemStack onItemRightClick(final ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ return super.onItemRightClick(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ public int getMaxItemUseDuration(final ItemStack aStack) {
+ return this.mFoodStats.get((short) this.getDamage(aStack)) == null ? 0 : 32;
+ }
+
+ @Override
+ public EnumAction getItemUseAction(final ItemStack aStack) {
+ return EnumAction.none;
+ }
+
+ @Override
+ public final ItemStack onEaten(final ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ final IFoodStat tStat = this.mFoodStats.get((short) this.getDamage(aStack));
+ if (tStat != null) {}
+
+ return aStack;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(final Item var1, final CreativeTabs aCreativeTab, final List aList) {
+ for (int i = 0, j = this.mEnabledItems.length(); i < j; i++) {
+ if (this.mVisibleItems.get(i) || (D1 && this.mEnabledItems.get(i))) {
+ final Long[] tStats = this.mElectricStats.get((short) (this.mOffset + i));
+ if ((tStats != null) && (tStats[3] < 0)) {
+ final ItemStack tStack = new ItemStack(this, 1, this.mOffset + i);
+ this.setCharge(tStack, Math.abs(tStats[0]));
+ this.isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ if ((tStats == null) || (tStats[3] != -2)) {
+ final ItemStack tStack = new ItemStack(this, 1, this.mOffset + i);
+ this.isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void registerIcons(final IIconRegister aIconRegister) {
+ for (short i = 0, j = (short) this.mEnabledItems.length(); i < j; i++) {
+ if (this.mEnabledItems.get(i)) {
+ for (byte k = 1; k < this.mIconList[i].length; k++) {
+ this.mIconList[i][k] = aIconRegister
+ .registerIcon(GTPlusPlus.ID + ":" + this.getUnlocalizedName() + "/" + i + "/" + k);
+ }
+ this.mIconList[i][0] = aIconRegister
+ .registerIcon(GTPlusPlus.ID + ":" + this.getUnlocalizedName() + "/" + i);
+ }
+ }
+ }
+
+ @Override
+ public final Long[] getElectricStats(final ItemStack aStack) {
+ return this.mElectricStats.get((short) aStack.getItemDamage());
+ }
+
+ @Override
+ public final Long[] getFluidContainerStats(final ItemStack aStack) {
+ return this.mFluidContainerStats.get((short) aStack.getItemDamage());
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(final ItemStack aStack, final ItemStack aBook) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(final ItemStack aStack, final ItemStack aMaterial) {
+ return false;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ if (stack.getDisplayName()
+ .contains("LuV")) {
+ HEX_OxFFFFFF = 0xffffcc;
+ } else if (stack.getDisplayName()
+ .contains("ZPM")) {
+ HEX_OxFFFFFF = 0xace600;
+ } else if (stack.getDisplayName()
+ .contains("UV")) {
+ HEX_OxFFFFFF = 0xffff00;
+ } else if (stack.getDisplayName()
+ .contains("MAX")) {
+ HEX_OxFFFFFF = 0xff0000;
+ } else {
+ HEX_OxFFFFFF = 0xffffff;
+ }
+ return HEX_OxFFFFFF;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_Base.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_Base.java
new file mode 100644
index 0000000000..3c4418c2bf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_Base.java
@@ -0,0 +1,745 @@
+package gtPlusPlus.xmod.gregtech.api.items;
+
+import static gregtech.api.enums.GT_Values.D1;
+import static gregtech.api.enums.GT_Values.V;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.dispenser.IBlockSource;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.inventory.Container;
+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.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.Interface_ItemBehaviour;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+import ic2.api.item.IElectricItemManager;
+import ic2.api.item.ISpecialElectricItem;
+
+public abstract class Gregtech_MetaItem_Base extends Gregtech_Generic_Item
+ implements ISpecialElectricItem, IElectricItemManager, IFluidContainerItem {
+
+ /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */
+ private final HashMap<Short, ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>>> mItemBehaviors = new HashMap<>();
+
+ /**
+ * Creates the Item using these Parameters.
+ *
+ * @param aUnlocalized The Unlocalized Name of this Item.
+ * @param aGeneratedPrefixList The OreDict Prefixes you want to have generated.
+ */
+ public Gregtech_MetaItem_Base(final String aUnlocalized) {
+ super(aUnlocalized, "Generated Item", null, false);
+ this.setHasSubtypes(true);
+ this.setMaxDamage(0);
+ }
+
+ /**
+ * Adds a special Item Behaviour to the Item.
+ * <p/>
+ * Note: the boolean Behaviours sometimes won't be executed if another boolean Behaviour returned true before.
+ *
+ * @param aMetaValue the Meta Value of the Item you want to add it to. [0 - 32765]
+ * @param aBehavior the Click Behavior you want to add.
+ * @return the Item itself for convenience in constructing.
+ */
+ public final Gregtech_MetaItem_Base addItemBehavior(final int aMetaValue,
+ final Interface_ItemBehaviour<Gregtech_MetaItem_Base> aBehavior) {
+ if ((aMetaValue < 0) || (aMetaValue >= 32766) || (aBehavior == null)) {
+ return this;
+ }
+ ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors.get((short) aMetaValue);
+ if (tList == null) {
+ tList = new ArrayList<>(1);
+ this.mItemBehaviors.put((short) aMetaValue, tList);
+ }
+ tList.add(aBehavior);
+ return this;
+ }
+
+ public abstract Long[] getElectricStats(ItemStack aStack);
+
+ public abstract Long[] getFluidContainerStats(ItemStack aStack);
+
+ @Override
+ public boolean hasProjectile(final SubTag aProjectileType, final ItemStack aStack) {
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ if (tBehavior.hasProjectile(this, aProjectileType, aStack)) {
+ return true;
+ }
+ }
+ }
+ return super.hasProjectile(aProjectileType, aStack);
+ }
+
+ @Override
+ public EntityArrow getProjectile(final SubTag aProjectileType, final ItemStack aStack, final World aWorld,
+ final double aX, final double aY, final double aZ) {
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ final EntityArrow rArrow = tBehavior.getProjectile(this, aProjectileType, aStack, aWorld, aX, aY, aZ);
+ if (rArrow != null) {
+ return rArrow;
+ }
+ }
+ }
+ return super.getProjectile(aProjectileType, aStack, aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public EntityArrow getProjectile(final SubTag aProjectileType, final ItemStack aStack, final World aWorld,
+ final EntityLivingBase aEntity, final float aSpeed) {
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ final EntityArrow rArrow = tBehavior
+ .getProjectile(this, aProjectileType, aStack, aWorld, aEntity, aSpeed);
+ if (rArrow != null) {
+ return rArrow;
+ }
+ }
+ }
+ return super.getProjectile(aProjectileType, aStack, aWorld, aEntity, aSpeed);
+ }
+
+ @Override
+ public ItemStack onDispense(final IBlockSource aSource, final ItemStack aStack) {
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ if (tBehavior.canDispense(this, aSource, aStack)) {
+ return tBehavior.onDispense(this, aSource, aStack);
+ }
+ }
+ }
+ return super.onDispense(aSource, aStack);
+ }
+
+ @Override
+ public boolean isItemStackUsable(final ItemStack aStack) {
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ if (!tBehavior.isItemStackUsable(this, aStack)) {
+ return false;
+ }
+ }
+ }
+ return super.isItemStackUsable(aStack);
+ }
+
+ @Override
+ public boolean onLeftClickEntity(final ItemStack aStack, final EntityPlayer aPlayer, final Entity aEntity) {
+ this.use(aStack, 0, aPlayer);
+ this.isItemStackUsable(aStack);
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ try {
+ if (tBehavior.onLeftClickEntity(this, aStack, aPlayer, aEntity)) {
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ }
+ return true;
+ }
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ return false;
+ }
+ } catch (final Throwable e) {
+ if (D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onItemUse(final ItemStack aStack, final EntityPlayer aPlayer, final World aWorld, final int aX,
+ final int aY, final int aZ, final int ordinalSide, final float hitX, final float hitY, final float hitZ) {
+ this.use(aStack, 0, aPlayer);
+ this.isItemStackUsable(aStack);
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ try {
+ if (tBehavior.onItemUse(this, aStack, aPlayer, aWorld, aX, aY, aZ, ordinalSide, hitX, hitY, hitZ)) {
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ }
+ return true;
+ }
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ return false;
+ }
+ } catch (final Throwable e) {
+ if (D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onItemUseFirst(final ItemStack aStack, final EntityPlayer aPlayer, final World aWorld, final int aX,
+ final int aY, final int aZ, final int ordinalSide, final float hitX, final float hitY, final float hitZ) {
+ this.use(aStack, 0, aPlayer);
+ this.isItemStackUsable(aStack);
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ try {
+ if (tBehavior
+ .onItemUseFirst(this, aStack, aPlayer, aWorld, aX, aY, aZ, ordinalSide, hitX, hitY, hitZ)) {
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ }
+ return true;
+ }
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ return false;
+ }
+ } catch (final Throwable e) {
+ if (D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ this.use(aStack, 0, aPlayer);
+ this.isItemStackUsable(aStack);
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ try {
+ aStack = tBehavior.onItemRightClick(this, aStack, aWorld, aPlayer);
+ } catch (final Throwable e) {
+ if (D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ }
+ return aStack;
+ }
+
+ @Override
+ public final void addInformation(final ItemStack aStack, final EntityPlayer aPlayer, List aList,
+ final boolean aF3_H) {
+ final String tKey = this.getUnlocalizedName(aStack) + ".tooltip",
+ tString = GT_LanguageManager.getTranslation(tKey);
+ if (GT_Utility.isStringValid(tString) && !tKey.equals(tString)) {
+ aList.add(tString);
+ }
+
+ Long[] tStats = this.getElectricStats(aStack);
+ if (tStats != null) {
+ if (tStats[3] > 0) {
+ aList.add(
+ EnumChatFormatting.AQUA + "Contains "
+ + GT_Utility.formatNumbers(tStats[3])
+ + " EU Tier: "
+ + (tStats[2] >= 0 ? tStats[2] : 0)
+ + EnumChatFormatting.GRAY);
+ } else {
+ final long tCharge = this.getRealCharge(aStack);
+ if ((tStats[3] == -2) && (tCharge <= 0)) {
+ aList.add(
+ EnumChatFormatting.AQUA + "Empty. You should recycle it properly." + EnumChatFormatting.GRAY);
+ } else {
+ aList.add(
+ EnumChatFormatting.AQUA + ""
+ + GT_Utility.formatNumbers(tCharge)
+ + " / "
+ + GT_Utility.formatNumbers(Math.abs(tStats[0]))
+ + " EU - Voltage: "
+ + GT_Utility.formatNumbers(
+ V[(int) (tStats[2] >= 0 ? tStats[2] < V.length ? tStats[2] : V.length - 1 : 1)])
+ + EnumChatFormatting.GRAY);
+ }
+ }
+ }
+
+ tStats = this.getFluidContainerStats(aStack);
+ if ((tStats != null) && (tStats[0] > 0)) {
+ final FluidStack tFluid = this.getFluidContent(aStack);
+ aList.add(
+ EnumChatFormatting.BLUE
+ + ((tFluid == null ? "No Fluids Contained" : GT_Utility.getFluidName(tFluid, true)))
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ EnumChatFormatting.BLUE
+ + (GT_Utility.formatNumbers(tFluid == null ? 0 : tFluid.amount) + "L / "
+ + GT_Utility.formatNumbers(tStats[0])
+ + "L")
+ + EnumChatFormatting.GRAY);
+ }
+
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ aList = tBehavior.getAdditionalToolTips(this, aList, aStack);
+ }
+ }
+
+ this.addAdditionalToolTips(aList, aStack);
+ }
+
+ @Override
+ public void onUpdate(final ItemStack aStack, final World aWorld, final Entity aPlayer, final int aTimer,
+ final boolean aIsInHand) {
+ final ArrayList<Interface_ItemBehaviour<Gregtech_MetaItem_Base>> tList = this.mItemBehaviors
+ .get((short) this.getDamage(aStack));
+ if (tList != null) {
+ for (final Interface_ItemBehaviour<Gregtech_MetaItem_Base> tBehavior : tList) {
+ tBehavior.onUpdate(this, aStack, aWorld, aPlayer, aTimer, aIsInHand);
+ }
+ }
+ }
+
+ @Override
+ public final boolean canProvideEnergy(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return false;
+ }
+ return (tStats[3] > 0) || ((aStack.stackSize == 1) && ((tStats[3] == -2) || (tStats[3] == -3)));
+ }
+
+ @Override
+ public final double getMaxCharge(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ return Math.abs(tStats[0]);
+ }
+
+ @Override
+ public final double getTransferLimit(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ return Math.max(tStats[1], tStats[3]);
+ }
+
+ @Override
+ public final double charge(final ItemStack aStack, final double aCharge, final int aTier,
+ final boolean aIgnoreTransferLimit, final boolean aSimulate) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats == null) || (tStats[2] > aTier)
+ || !((tStats[3] == -1) || (tStats[3] == -3) || ((tStats[3] < 0) && (aCharge == Integer.MAX_VALUE)))
+ || (aStack.stackSize != 1)) {
+ return 0;
+ }
+ final long tChargeBefore = this.getRealCharge(aStack),
+ tNewCharge = aCharge == Integer.MAX_VALUE ? Long.MAX_VALUE
+ : Math.min(
+ Math.abs(tStats[0]),
+ tChargeBefore + (aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge)));
+ if (!aSimulate) {
+ this.setCharge(aStack, tNewCharge);
+ }
+ return tNewCharge - tChargeBefore;
+ }
+
+ @Override
+ public final double discharge(final ItemStack aStack, final double aCharge, final int aTier,
+ final boolean aIgnoreTransferLimit, final boolean aBatteryAlike, final boolean aSimulate) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats == null) || (tStats[2] > aTier)) {
+ return 0;
+ }
+ if (aBatteryAlike && !this.canProvideEnergy(aStack)) {
+ return 0;
+ }
+ if (tStats[3] > 0) {
+ if ((aCharge < tStats[3]) || (aStack.stackSize < 1)) {
+ return 0;
+ }
+ if (!aSimulate) {
+ aStack.stackSize--;
+ }
+ return tStats[3];
+ }
+ final long tChargeBefore = this.getRealCharge(aStack), tNewCharge = Math
+ .max(0, tChargeBefore - (aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge)));
+ if (!aSimulate) {
+ this.setCharge(aStack, tNewCharge);
+ }
+ return tChargeBefore - tNewCharge;
+ }
+
+ @Override
+ public final double getCharge(final ItemStack aStack) {
+ return this.getRealCharge(aStack);
+ }
+
+ @Override
+ public final boolean canUse(final ItemStack aStack, final double aAmount) {
+ return this.getRealCharge(aStack) >= aAmount;
+ }
+
+ @Override
+ public final boolean use(final ItemStack aStack, final double aAmount, final EntityLivingBase aPlayer) {
+ this.chargeFromArmor(aStack, aPlayer);
+ if ((aPlayer instanceof EntityPlayer) && ((EntityPlayer) aPlayer).capabilities.isCreativeMode) {
+ return true;
+ }
+ final double tTransfer = this.discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, true);
+ if (tTransfer == aAmount) {
+ this.discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false);
+ this.chargeFromArmor(aStack, aPlayer);
+ return true;
+ }
+ this.discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false);
+ this.chargeFromArmor(aStack, aPlayer);
+ return false;
+ }
+
+ @Override
+ public final void chargeFromArmor(final ItemStack aStack, final EntityLivingBase aPlayer) {
+ if ((aPlayer == null) || aPlayer.worldObj.isRemote) {
+ return;
+ }
+ for (int i = 1; i < 5; i++) {
+ final ItemStack tArmor = aPlayer.getEquipmentInSlot(i);
+ if (GT_ModHandler.isElectricItem(tArmor)) {
+ final IElectricItem tArmorItem = (IElectricItem) tArmor.getItem();
+ if (tArmorItem.canProvideEnergy(tArmor) && (tArmorItem.getTier(tArmor) >= this.getTier(aStack))) {
+ final double tCharge = ElectricItem.manager.discharge(
+ tArmor,
+ this.charge(aStack, Integer.MAX_VALUE - 1, Integer.MAX_VALUE, true, true),
+ Integer.MAX_VALUE,
+ true,
+ true,
+ false);
+ if (tCharge > 0) {
+ this.charge(aStack, tCharge, Integer.MAX_VALUE, true, false);
+ if (aPlayer instanceof EntityPlayer) {
+ final Container tContainer = ((EntityPlayer) aPlayer).openContainer;
+ if (tContainer != null) {
+ tContainer.detectAndSendChanges();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public final long getRealCharge(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ if (tStats[3] > 0) {
+ return (int) (long) tStats[3];
+ }
+ final NBTTagCompound tNBT = aStack.getTagCompound();
+ return tNBT == null ? 0 : tNBT.getLong("GT.ItemCharge");
+ }
+
+ public final boolean setCharge(final ItemStack aStack, long aCharge) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats == null) || (tStats[3] > 0)) {
+ return false;
+ }
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ }
+ tNBT.removeTag("GT.ItemCharge");
+ aCharge = Math.min(tStats[0] < 0 ? Math.abs(tStats[0] / 2) : aCharge, Math.abs(tStats[0]));
+ if (aCharge > 0) {
+ aStack.setItemDamage(this.getChargedMetaData(aStack));
+ tNBT.setLong("GT.ItemCharge", aCharge);
+ } else {
+ aStack.setItemDamage(this.getEmptyMetaData(aStack));
+ }
+ if (tNBT.hasNoTags()) {
+ aStack.setTagCompound(null);
+ } else {
+ aStack.setTagCompound(tNBT);
+ }
+ this.isItemStackUsable(aStack);
+ return true;
+ }
+
+ public short getChargedMetaData(final ItemStack aStack) {
+ return (short) aStack.getItemDamage();
+ }
+
+ public short getEmptyMetaData(final ItemStack aStack) {
+ return (short) aStack.getItemDamage();
+ }
+
+ @Override
+ public FluidStack getFluid(final ItemStack aStack) {
+ return this.getFluidContent(aStack);
+ }
+
+ @Override
+ public int getCapacity(final ItemStack aStack) {
+ final Long[] tStats = this.getFluidContainerStats(aStack);
+ return tStats == null ? 0 : (int) Math.max(0, tStats[0]);
+ }
+
+ @Override
+ public int fill(final ItemStack aStack, final FluidStack aFluid, final boolean doFill) {
+ if ((aStack == null) || (aStack.stackSize != 1)) {
+ return 0;
+ }
+
+ final ItemStack tStack = GT_Utility.fillFluidContainer(aFluid, aStack, false, false);
+ if (tStack != null) {
+ aStack.setItemDamage(tStack.getItemDamage());
+ aStack.func_150996_a(tStack.getItem());
+ return GT_Utility.getFluidForFilledItem(tStack, false).amount;
+ }
+
+ final Long[] tStats = this.getFluidContainerStats(aStack);
+ if ((tStats == null) || (tStats[0] <= 0)
+ || (aFluid == null)
+ || (aFluid.getFluid()
+ .getID() <= 0)
+ || (aFluid.amount <= 0)) {
+ return 0;
+ }
+
+ FluidStack tFluid = this.getFluidContent(aStack);
+
+ if ((tFluid == null) || (tFluid.getFluid()
+ .getID() <= 0)) {
+ if (aFluid.amount <= tStats[0]) {
+ if (doFill) {
+ this.setFluidContent(aStack, aFluid);
+ }
+ return aFluid.amount;
+ }
+ if (doFill) {
+ tFluid = aFluid.copy();
+ tFluid.amount = (int) (long) tStats[0];
+ this.setFluidContent(aStack, tFluid);
+ }
+ return (int) (long) tStats[0];
+ }
+
+ if (!tFluid.isFluidEqual(aFluid)) {
+ return 0;
+ }
+
+ final int space = (int) (long) tStats[0] - tFluid.amount;
+ if (aFluid.amount <= space) {
+ if (doFill) {
+ tFluid.amount += aFluid.amount;
+ this.setFluidContent(aStack, tFluid);
+ }
+ return aFluid.amount;
+ }
+ if (doFill) {
+ tFluid.amount = (int) (long) tStats[0];
+ this.setFluidContent(aStack, tFluid);
+ }
+ return space;
+ }
+
+ @Override
+ public FluidStack drain(final ItemStack aStack, final int maxDrain, final boolean doDrain) {
+ if ((aStack == null) || (aStack.stackSize != 1)) {
+ return null;
+ }
+
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(aStack, false);
+ if ((tFluid != null) && (maxDrain >= tFluid.amount)) {
+ final ItemStack tStack = GT_Utility.getContainerItem(aStack, false);
+ if (tStack == null) {
+ aStack.stackSize = 0;
+ return tFluid;
+ }
+ aStack.setItemDamage(tStack.getItemDamage());
+ aStack.func_150996_a(tStack.getItem());
+ return tFluid;
+ }
+
+ final Long[] tStats = this.getFluidContainerStats(aStack);
+ if ((tStats == null) || (tStats[0] <= 0)) {
+ return null;
+ }
+
+ tFluid = this.getFluidContent(aStack);
+ if (tFluid == null) {
+ return null;
+ }
+
+ int used = maxDrain;
+ if (tFluid.amount < used) {
+ used = tFluid.amount;
+ }
+ if (doDrain) {
+ tFluid.amount -= used;
+ this.setFluidContent(aStack, tFluid);
+ }
+
+ final FluidStack drained = tFluid.copy();
+ drained.amount = used;
+ return drained;
+ }
+
+ public FluidStack getFluidContent(final ItemStack aStack) {
+ final Long[] tStats = this.getFluidContainerStats(aStack);
+ if ((tStats == null) || (tStats[0] <= 0)) {
+ return GT_Utility.getFluidForFilledItem(aStack, false);
+ }
+ final NBTTagCompound tNBT = aStack.getTagCompound();
+ return tNBT == null ? null : FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("GT.FluidContent"));
+ }
+
+ public void setFluidContent(final ItemStack aStack, final FluidStack aFluid) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ } else {
+ tNBT.removeTag("GT.FluidContent");
+ }
+ if ((aFluid != null) && (aFluid.amount > 0)) {
+ tNBT.setTag("GT.FluidContent", aFluid.writeToNBT(new NBTTagCompound()));
+ }
+ if (tNBT.hasNoTags()) {
+ aStack.setTagCompound(null);
+ } else {
+ aStack.setTagCompound(tNBT);
+ }
+ this.isItemStackUsable(aStack);
+ }
+
+ @Override
+ public int getItemStackLimit(final ItemStack aStack) {
+ Long[] tStats = this.getElectricStats(aStack);
+ if ((tStats != null) && ((tStats[3] == -1) || (tStats[3] == -3)) && (this.getRealCharge(aStack) > 0)) {
+ return 1;
+ }
+ tStats = this.getFluidContainerStats(aStack);
+ if (tStats != null) {
+ return (int) (long) tStats[1];
+ }
+ return 64;
+ }
+
+ @Override
+ public final Item getChargedItem(final ItemStack itemStack) {
+ return this;
+ }
+
+ @Override
+ public final Item getEmptyItem(final ItemStack itemStack) {
+ return this;
+ }
+
+ @Override
+ public final int getTier(final ItemStack aStack) {
+ final Long[] tStats = this.getElectricStats(aStack);
+ return (int) (tStats == null ? Integer.MAX_VALUE : tStats[2]);
+ }
+
+ @Override
+ public final String getToolTip(final ItemStack aStack) {
+ return null;
+ } // This has its own ToolTip Handler, no need to let the IC2 Handler screw us up at this Point
+
+ @Override
+ public final IElectricItemManager getManager(final ItemStack aStack) {
+ return this;
+ } // We are our own Manager
+
+ @Override
+ public final boolean getShareTag() {
+ return true;
+ } // just to be sure.
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(final ItemStack aStack, final ItemStack aBook) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(final ItemStack aStack, final ItemStack aMaterial) {
+ return false;
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+ if (stack.getDisplayName()
+ .contains("LuV")) {
+ HEX_OxFFFFFF = 0xffffcc;
+ } else if (stack.getDisplayName()
+ .contains("ZPM")) {
+ HEX_OxFFFFFF = 0xace600;
+ } else if (stack.getDisplayName()
+ .contains("UV")) {
+ HEX_OxFFFFFF = 0xffff00;
+ } else if (stack.getDisplayName()
+ .contains("MAX")) {
+ HEX_OxFFFFFF = 0xff0000;
+ } else if (stack.getDisplayName()
+ .contains("Sodium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(0, 0, 150);
+ } else if (stack.getDisplayName()
+ .contains("Cadmium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(50, 50, 60);
+ } else if (stack.getDisplayName()
+ .contains("Lithium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(225, 220, 255);
+ } else {
+ HEX_OxFFFFFF = 0xffffff;
+ }
+ return HEX_OxFFFFFF;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_X32.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_X32.java
new file mode 100644
index 0000000000..c04acb9537
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaItem_X32.java
@@ -0,0 +1,266 @@
+package gtPlusPlus.xmod.gregtech.api.items;
+
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+
+/**
+ * @author Gregorius Techneticies
+ * <p/>
+ * One Item for everything!
+ * <p/>
+ * This brilliant Item Class is used for automatically generating all possible variations of Material Items,
+ * like Dusts, Ingots, Gems, Plates and similar. It saves me a ton of work, when adding Items, because I always
+ * have to make a new Item SubType for each OreDict Prefix, when adding a new Material.
+ * <p/>
+ * As you can see, up to 32766 Items can be generated using this Class. And the last 766 Items can be custom
+ * defined, just to save space and MetaData.
+ * <p/>
+ * These Items can also have special RightClick abilities, electric Charge or even be set to become a Food alike
+ * Item.
+ */
+public abstract class Gregtech_MetaItem_X32 extends Gregtech_MetaItem {
+
+ protected final OrePrefixes[] mGeneratedPrefixList;
+
+ /**
+ * Creates the Item using these Parameters.
+ *
+ * @param aUnlocalized The Unlocalized Name of this Item.
+ * @param aGeneratedPrefixList The OreDict Prefixes you want to have generated.
+ */
+ public Gregtech_MetaItem_X32(final String aUnlocalized, final OrePrefixes... aGeneratedPrefixList) {
+ super(aUnlocalized, (short) 32000, (short) 766);
+ this.mGeneratedPrefixList = Arrays.copyOf(aGeneratedPrefixList, 32);
+
+ for (int i = 0; i < 32000; i++) {
+ final OrePrefixes tPrefix = this.mGeneratedPrefixList[i / 1000];
+ if (tPrefix == null) {
+ continue;
+ }
+ final Materials tMaterial = GregTech_API.sGeneratedMaterials[i % 1000];
+ if (tMaterial == null) {
+ continue;
+ }
+ if (this.doesMaterialAllowGeneration(tPrefix, tMaterial)) {
+ final ItemStack tStack = new ItemStack(this, 1, i);
+ GT_LanguageManager.addStringLocalization(
+ this.getUnlocalizedName(tStack) + ".name",
+ this.getDefaultLocalization(tPrefix, tMaterial, i));
+ GT_LanguageManager.addStringLocalization(
+ this.getUnlocalizedName(tStack) + ".tooltip",
+ tMaterial.getToolTip(tPrefix.mMaterialAmount / GT_Values.M));
+ if (tPrefix.mIsUnificatable) {
+ GT_OreDictUnificator.set(tPrefix, tMaterial, tStack);
+ } else {
+ GT_OreDictUnificator.registerOre(tPrefix.get(tMaterial), tStack);
+ }
+ if (((tPrefix == OrePrefixes.stick) || (tPrefix == OrePrefixes.wireFine))
+ && ((tMaterial == Materials.Lead) || (tMaterial == Materials.Tin)
+ || (tMaterial == Materials.SolderingAlloy))) {
+ GregTech_API.sSolderingMetalList.add(tStack);
+ }
+ }
+ }
+ }
+
+ /* ---------- OVERRIDEABLE FUNCTIONS ---------- */
+
+ /**
+ * @return the Color Modulation the Material is going to be rendered with.
+ */
+ @Override
+ public short[] getRGBa(final ItemStack aStack) {
+ final Materials tMaterial = GregTech_API.sGeneratedMaterials[this.getDamage(aStack) % 1000];
+ return tMaterial == null ? Materials._NULL.mRGBa : tMaterial.mRGBa;
+ }
+
+ /**
+ * @param aPrefix this can be null, you have to return false in that case
+ * @param aMaterial this can be null, you have to return false in that case
+ * @return if this Item should be generated and visible.
+ */
+ public boolean doesMaterialAllowGeneration(final OrePrefixes aPrefix, final Materials aMaterial) {
+ // You have to check for at least these Conditions in every Case! So add a super Call like the following for
+ // this before executing your Code:
+ // if (!super.doesMaterialAllowGeneration(aPrefix, aMaterial)) return false;
+ return (aPrefix != null) && (aMaterial != null) && aPrefix.doGenerateItem(aMaterial);
+ }
+
+ /* ---------- OVERRIDEABLE FUNCTIONS ---------- */
+
+ /**
+ * @param aPrefix the OreDict Prefix
+ * @param aMaterial the Material
+ * @param aMetaData a Index from [0 - 31999]
+ * @return the Localized Name when default LangFiles are used.
+ */
+ public String getDefaultLocalization(final OrePrefixes aPrefix, final Materials aMaterial, final int aMetaData) {
+ return aPrefix.getDefaultLocalNameForItem(aMaterial);
+ }
+
+ /**
+ * @param aMetaData a Index from [0 - 31999]
+ * @param aMaterial the Material
+ * @return an Icon Container for the Item Display.
+ */
+ public final IIconContainer getIconContainer(final int aMetaData, final Materials aMaterial) {
+ return (this.mGeneratedPrefixList[aMetaData / 1000] != null)
+ && (this.mGeneratedPrefixList[aMetaData / 1000].mTextureIndex >= 0)
+ ? aMaterial.mIconSet.mTextures[this.mGeneratedPrefixList[aMetaData / 1000].mTextureIndex]
+ : null;
+ }
+
+ /**
+ * @param aPrefix always != null
+ * @param aMaterial always != null
+ * @param aDoShowAllItems this is the Configuration Setting of the User, if he wants to see all the Stuff like Tiny
+ * Dusts or Crushed Ores as well.
+ * @return if this Item should be visible in NEI or Creative
+ */
+ public boolean doesShowInCreative(final OrePrefixes aPrefix, final Materials aMaterial,
+ final boolean aDoShowAllItems) {
+ return true;
+ }
+
+ /* ---------- INTERNAL OVERRIDES ---------- */
+
+ @Override
+ public ItemStack getContainerItem(final ItemStack aStack) {
+ final int aDamage = aStack.getItemDamage();
+ if ((aDamage < 32000) && (aDamage >= 0)) {
+ final Materials aMaterial = GregTech_API.sGeneratedMaterials[aDamage % 1000];
+ if ((aMaterial != null) && (aMaterial != Materials.Empty) && (aMaterial != Materials._NULL)) {
+ final OrePrefixes aPrefix = this.mGeneratedPrefixList[aDamage / 1000];
+ if (aPrefix != null) {
+ return GT_Utility.copyAmount(1, aPrefix.mContainerItem);
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public final IIconContainer getIconContainer(final int aMetaData) {
+ return GregTech_API.sGeneratedMaterials[aMetaData % 1000] == null ? null
+ : this.getIconContainer(aMetaData, GregTech_API.sGeneratedMaterials[aMetaData % 1000]);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void getSubItems(final Item var1, final CreativeTabs aCreativeTab, final List aList) {
+ for (int i = 0; i < 32000; i++) {
+ if (this.doesMaterialAllowGeneration(
+ this.mGeneratedPrefixList[i / 1000],
+ GregTech_API.sGeneratedMaterials[i % 1000])
+ && this.doesShowInCreative(
+ this.mGeneratedPrefixList[i / 1000],
+ GregTech_API.sGeneratedMaterials[i % 1000],
+ GregTech_API.sDoShowAllItemsInCreative)) {
+ final ItemStack tStack = new ItemStack(this, 1, i);
+ this.isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ }
+ super.getSubItems(var1, aCreativeTab, aList);
+ }
+
+ @Override
+ public final IIcon getIconFromDamage(final int aMetaData) {
+ if (aMetaData < 0) {
+ return null;
+ }
+ if (aMetaData < 32000) {
+ final Materials tMaterial = GregTech_API.sGeneratedMaterials[aMetaData % 1000];
+ if (tMaterial == null) {
+ return null;
+ }
+ final IIconContainer tIcon = this.getIconContainer(aMetaData, tMaterial);
+ if (tIcon != null) {
+ return tIcon.getIcon();
+ }
+ return null;
+ }
+ return (aMetaData - 32000) < this.mIconList.length ? this.mIconList[aMetaData - 32000][0] : null;
+ }
+
+ @Override
+ public int getItemStackLimit(final ItemStack aStack) {
+ final int tDamage = this.getDamage(aStack);
+ if ((tDamage < 32000) && (this.mGeneratedPrefixList[tDamage / 1000] != null)) {
+ return Math
+ .min(super.getItemStackLimit(aStack), this.mGeneratedPrefixList[tDamage / 1000].mDefaultStackSize);
+ }
+ return super.getItemStackLimit(aStack);
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, int HEX_OxFFFFFF) {
+
+ int aMeta = stack.getItemDamage();
+ if (stack.getDisplayName()
+ .contains("Sodium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(90, 90, 255);
+ } else if (stack.getDisplayName()
+ .contains("Cadmium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(150, 150, 80);
+ } else if (stack.getDisplayName()
+ .contains("Lithium")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(225, 220, 255);
+ } else if (stack.getDisplayName()
+ .contains("Wrought")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(200, 180, 180);
+ } else if (stack.getDisplayName()
+ .contains("Bronze")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(255, 128, 0);
+ } else if (stack.getDisplayName()
+ .contains("Brass")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(255, 180, 0);
+ } else if (stack.getDisplayName()
+ .contains("Invar")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(180, 180, 120);
+ } else {
+ if (aMeta > 50 && aMeta != 150) {
+ HEX_OxFFFFFF = 0xffffff;
+ } else if (stack.getDisplayName()
+ .contains("ULV")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(200, 180, 180);
+ } else if (stack.getDisplayName()
+ .contains("LuV")) {
+ HEX_OxFFFFFF = 0xffffcc;
+ } else if (stack.getDisplayName()
+ .contains("ZPM")) {
+ HEX_OxFFFFFF = 0xffe600;
+ } else if (stack.getDisplayName()
+ .contains("UV")) {
+ HEX_OxFFFFFF = 0xffb300;
+ } else if (stack.getDisplayName()
+ .contains("MAX")) {
+ HEX_OxFFFFFF = Utils.rgbtoHexValue(
+ MathUtils.randInt(220, 250),
+ MathUtils.randInt(221, 251),
+ MathUtils.randInt(220, 250));
+ } else {
+ HEX_OxFFFFFF = 0xffffff;
+ }
+ }
+ return HEX_OxFFFFFF;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaTool.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaTool.java
new file mode 100644
index 0000000000..fcfa5fae50
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/items/Gregtech_MetaTool.java
@@ -0,0 +1,692 @@
+package gtPlusPlus.xmod.gregtech.api.items;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map.Entry;
+
+import net.minecraft.block.Block;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.SharedMonsterAttributes;
+import net.minecraft.entity.item.EntityMinecart;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.potion.Potion;
+import net.minecraft.stats.AchievementList;
+import net.minecraft.stats.StatList;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+import net.minecraftforge.event.world.BlockEvent;
+
+import buildcraft.api.tools.IToolWrench;
+import cpw.mods.fml.common.Optional;
+import gregtech.api.enchants.Enchantment_Radioactivity;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Mods;
+import gregtech.api.interfaces.IDamagableItem;
+import gregtech.api.interfaces.IToolStats;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.Interface_ToolStats;
+import mods.railcraft.api.core.items.IToolCrowbar;
+
+/**
+ * This is an example on how you can create a Tool ItemStack, in this case a Bismuth Wrench:
+ * GT_MetaGenerated_Tool.sInstances.get("gt.metatool.01").getToolWithStats(16, 1, Materials.Bismuth, Materials.Bismuth,
+ * null);
+ */
+@Optional.InterfaceList({
+ @Optional.Interface(iface = "forestry.api.arboriculture.IToolGrafter", modid = Mods.Names.FORESTRY),
+ @Optional.Interface(iface = "mods.railcraft.api.core.items.IToolCrowbar", modid = Mods.Names.RAILCRAFT),
+ @Optional.Interface(iface = "buildcraft.api.tools.IToolWrench", modid = "BuildCraft"),
+ @Optional.Interface(iface = "crazypants.enderio.api.tool.ITool", modid = Mods.Names.ENDER_I_O) })
+public abstract class Gregtech_MetaTool extends GT_MetaGenerated_Tool
+ implements IDamagableItem, IToolCrowbar, IToolWrench {
+
+ /**
+ * All instances of this Item Class are listed here. This gets used to register the Renderer to all Items of this
+ * Type, if useStandardMetaItemRenderer() returns true.
+ * <p/>
+ * You can also use the unlocalized Name gotten from getUnlocalizedName() as Key if you want to get a specific Item.
+ */
+ public static final HashMap<String, Gregtech_MetaTool> sInstances = new HashMap<>();
+
+ /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */
+
+ public final HashMap<Short, IToolStats> mToolStats = new HashMap<>();
+
+ /**
+ * Creates the Item using these Parameters.
+ *
+ * @param aUnlocalized The Unlocalized Name of this Item.
+ */
+ public Gregtech_MetaTool(final String aUnlocalized) {
+ super(aUnlocalized);
+ GT_ModHandler.registerBoxableItemToToolBox(new ItemStack(this));
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ this.setMaxStackSize(1);
+ sInstances.put(this.getUnlocalizedName(), this);
+ }
+
+ /**
+ * Called by the Block Harvesting Event within the GT_Proxy
+ */
+ @Override
+ public void onHarvestBlockEvent(final ArrayList<ItemStack> aDrops, final ItemStack aStack,
+ final EntityPlayer aPlayer, final Block aBlock, final int aX, final int aY, final int aZ, final byte aMetaData,
+ final int aFortune, final boolean aSilkTouch, final BlockEvent.HarvestDropsEvent aEvent) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (this.isItemStackUsable(aStack) && (this.getDigSpeed(aStack, aBlock, aMetaData) > 0.0F)) {
+ this.doDamage(
+ aStack,
+ tStats.convertBlockDrops(
+ aDrops,
+ aStack,
+ aPlayer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ aMetaData,
+ aFortune,
+ aSilkTouch,
+ aEvent) * tStats.getToolDamagePerDropConversion());
+ }
+ }
+
+ @Override
+ public boolean onLeftClickEntity(final ItemStack aStack, final EntityPlayer aPlayer, final Entity aEntity) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if ((tStats == null) || !this.isItemStackUsable(aStack)) {
+ return true;
+ }
+ GT_Utility.doSoundAtClient(tStats.getEntityHitSound(), 1, 1.0F);
+ if (super.onLeftClickEntity(aStack, aPlayer, aEntity)) {
+ return true;
+ }
+ if (aEntity.canAttackWithItem() && !aEntity.hitByEntity(aPlayer)) {
+ final float tMagicDamage = tStats.getMagicDamageAgainstEntity(
+ aEntity instanceof EntityLivingBase
+ ? EnchantmentHelper.getEnchantmentModifierLiving(aPlayer, (EntityLivingBase) aEntity)
+ : 0.0F,
+ aEntity,
+ aStack,
+ aPlayer);
+ float tDamage = tStats.getNormalDamageAgainstEntity(
+ (float) aPlayer.getEntityAttribute(SharedMonsterAttributes.attackDamage)
+ .getAttributeValue() + this.getToolCombatDamage(aStack),
+ aEntity,
+ aStack,
+ aPlayer);
+ if ((tDamage + tMagicDamage) > 0.0F) {
+ final boolean tCriticalHit = (aPlayer.fallDistance > 0.0F) && !aPlayer.onGround
+ && !aPlayer.isOnLadder()
+ && !aPlayer.isInWater()
+ && !aPlayer.isPotionActive(Potion.blindness)
+ && (aPlayer.ridingEntity == null)
+ && (aEntity instanceof EntityLivingBase);
+ if (tCriticalHit && (tDamage > 0.0F)) {
+ tDamage *= 1.5F;
+ }
+ tDamage += tMagicDamage;
+ if (aEntity.attackEntityFrom(tStats.getDamageSource(aPlayer, aEntity), tDamage)) {
+ if (aEntity instanceof EntityLivingBase) {
+ aEntity.setFire(EnchantmentHelper.getFireAspectModifier(aPlayer) * 4);
+ }
+ final int tKnockcack = (aPlayer.isSprinting() ? 1 : 0) + (aEntity instanceof EntityLivingBase
+ ? EnchantmentHelper.getKnockbackModifier(aPlayer, (EntityLivingBase) aEntity)
+ : 0);
+ if (tKnockcack > 0) {
+ aEntity.addVelocity(
+ -MathHelper.sin((aPlayer.rotationYaw * (float) Math.PI) / 180.0F) * tKnockcack * 0.5F,
+ 0.1D,
+ MathHelper.cos((aPlayer.rotationYaw * (float) Math.PI) / 180.0F) * tKnockcack * 0.5F);
+ aPlayer.motionX *= 0.6D;
+ aPlayer.motionZ *= 0.6D;
+ aPlayer.setSprinting(false);
+ }
+ if (tCriticalHit) {
+ aPlayer.onCriticalHit(aEntity);
+ }
+ if (tMagicDamage > 0.0F) {
+ aPlayer.onEnchantmentCritical(aEntity);
+ }
+ if (tDamage >= 18.0F) {
+ aPlayer.triggerAchievement(AchievementList.overkill);
+ }
+ aPlayer.setLastAttacker(aEntity);
+ if (aEntity instanceof EntityLivingBase) {
+ EnchantmentHelper.func_151384_a((EntityLivingBase) aEntity, aPlayer);
+ }
+ EnchantmentHelper.func_151385_b(aPlayer, aEntity);
+ if (aEntity instanceof EntityLivingBase) {
+ aPlayer.addStat(StatList.damageDealtStat, Math.round(tDamage * 10.0F));
+ }
+ aEntity.hurtResistantTime = Math
+ .max(1, tStats.getHurtResistanceTime(aEntity.hurtResistantTime, aEntity));
+ aPlayer.addExhaustion(0.3F);
+ this.doDamage(aStack, tStats.getToolDamagePerEntityAttack());
+ }
+ }
+ }
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ }
+ return true;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(final ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if ((tStats != null) && tStats.canBlock()) {
+ aPlayer.setItemInUse(aStack, 72000);
+ }
+ return super.onItemRightClick(aStack, aWorld, aPlayer);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void addAdditionalToolTips(final List aList, final ItemStack aStack) {
+ final long tMaxDamage = getToolMaxDamage(aStack);
+ final Materials tMaterial = getPrimaryMaterial(aStack);
+ final IToolStats tStats = this.getToolStats(aStack);
+ final int tOffset = this.getElectricStats(aStack) != null ? 2 : 1;
+ if (tStats != null) {
+ final String name = aStack.getUnlocalizedName();
+ if (name.equals("gt.metatool.01.170") || name.equals("gt.metatool.01.172")
+ || name.equals("gt.metatool.01.174")
+ || name.equals("gt.metatool.01.176")) {
+ aList.add(
+ tOffset + 0,
+ EnumChatFormatting.WHITE + "Durability: "
+ + EnumChatFormatting.GREEN
+ + (tMaxDamage - getToolDamage(aStack))
+ + " / "
+ + tMaxDamage
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 1,
+ EnumChatFormatting.WHITE + tMaterial.mDefaultLocalName
+ + EnumChatFormatting.YELLOW
+ + " lvl "
+ + this.getHarvestLevel(aStack, "")
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 2,
+ EnumChatFormatting.WHITE + "Turbine Efficency: "
+ + EnumChatFormatting.BLUE
+ + (50.0F + (10.0F * this.getToolCombatDamage(aStack)))
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Optimal Steam flow: "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed * 1000)
+ + EnumChatFormatting.GRAY
+ + "L/sec");
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Optimal Gas flow(EU burnvalue per tick): "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed * 25)
+ + EnumChatFormatting.GRAY
+ + "EU/t");
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Optimal Plasma flow(Plasma energyvalue per tick): "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed * 1000)
+ + EnumChatFormatting.GRAY
+ + "EU/t");
+
+ } else {
+ aList.add(
+ tOffset + 0,
+ EnumChatFormatting.WHITE + "Durability: "
+ + EnumChatFormatting.GREEN
+ + (tMaxDamage - getToolDamage(aStack))
+ + " / "
+ + tMaxDamage
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 1,
+ EnumChatFormatting.WHITE + tMaterial.mDefaultLocalName
+ + EnumChatFormatting.YELLOW
+ + " lvl "
+ + this.getHarvestLevel(aStack, "")
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 2,
+ EnumChatFormatting.WHITE + "Attack Damage: "
+ + EnumChatFormatting.BLUE
+ + this.getToolCombatDamage(aStack)
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Mining Speed: "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math
+ .max(Float.MIN_NORMAL, tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed)
+ + EnumChatFormatting.GRAY);
+ }
+ }
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void addAdditionalToolTips(final List aList, final ItemStack aStack, final EntityPlayer aPlayer) {
+ final long tMaxDamage = getToolMaxDamage(aStack);
+ final Materials tMaterial = getPrimaryMaterial(aStack);
+ final IToolStats tStats = this.getToolStats(aStack);
+ final int tOffset = this.getElectricStats(aStack) != null ? 2 : 1;
+ if (tStats != null) {
+ final String name = aStack.getUnlocalizedName();
+ if (name.equals("gt.metatool.01.170") || name.equals("gt.metatool.01.172")
+ || name.equals("gt.metatool.01.174")
+ || name.equals("gt.metatool.01.176")) {
+ aList.add(
+ tOffset + 0,
+ EnumChatFormatting.WHITE + "Durability: "
+ + EnumChatFormatting.GREEN
+ + (tMaxDamage - getToolDamage(aStack))
+ + " / "
+ + tMaxDamage
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 1,
+ EnumChatFormatting.WHITE + tMaterial.mDefaultLocalName
+ + EnumChatFormatting.YELLOW
+ + " lvl "
+ + this.getHarvestLevel(aStack, "")
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 2,
+ EnumChatFormatting.WHITE + "Turbine Efficency: "
+ + EnumChatFormatting.BLUE
+ + (50.0F + (10.0F * this.getToolCombatDamage(aStack)))
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Optimal Steam flow: "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed * 1000)
+ + EnumChatFormatting.GRAY
+ + "L/sec");
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Optimal Gas flow(EU burnvalue per tick): "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed * 50)
+ + EnumChatFormatting.GRAY
+ + "EU/t");
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Optimal Plasma flow(Plasma energyvalue per tick): "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed * 1000)
+ + EnumChatFormatting.GRAY
+ + "EU/t");
+
+ } else {
+ aList.add(
+ tOffset + 0,
+ EnumChatFormatting.WHITE + "Durability: "
+ + EnumChatFormatting.GREEN
+ + (tMaxDamage - getToolDamage(aStack))
+ + " / "
+ + tMaxDamage
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 1,
+ EnumChatFormatting.WHITE + tMaterial.mDefaultLocalName
+ + EnumChatFormatting.YELLOW
+ + " lvl "
+ + this.getHarvestLevel(aStack, "")
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 2,
+ EnumChatFormatting.WHITE + "Attack Damage: "
+ + EnumChatFormatting.BLUE
+ + this.getToolCombatDamage(aStack)
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + "Mining Speed: "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + Math
+ .max(Float.MIN_NORMAL, tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed)
+ + EnumChatFormatting.GRAY);
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("GT.ToolStats");
+ if ((aNBT != null) && aNBT.hasKey("Heat")) {
+ int tHeat = aNBT.getInteger("Heat");
+ final long tWorldTime = aPlayer.getEntityWorld()
+ .getWorldTime();
+ if (aNBT.hasKey("HeatTime")) {
+ final long tHeatTime = aNBT.getLong("HeatTime");
+ if (tWorldTime > (tHeatTime + 10)) {
+ tHeat = (int) (tHeat - ((tWorldTime - tHeatTime) / 10));
+ if ((tHeat < 300) && (tHeat > -10000)) {
+ tHeat = 300;
+ }
+ }
+ aNBT.setLong("HeatTime", tWorldTime);
+ if (tHeat > -10000) {
+ aNBT.setInteger("Heat", tHeat);
+ }
+ }
+
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.RED + "Heat: "
+ + aNBT.getInteger("Heat")
+ + " K"
+ + EnumChatFormatting.GRAY);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public Long[] getFluidContainerStats(final ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public Long[] getElectricStats(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("GT.ToolStats");
+ if ((aNBT != null) && aNBT.getBoolean("Electric")) {
+ return new Long[] { aNBT.getLong("MaxCharge"), aNBT.getLong("Voltage"), aNBT.getLong("Tier"),
+ aNBT.getLong("SpecialData") };
+ }
+ }
+ return new Long[] {};
+ }
+
+ @Override
+ public float getToolCombatDamage(final ItemStack aStack) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (tStats == null) {
+ return 0;
+ }
+ return tStats.getBaseDamage() + getPrimaryMaterial(aStack).mToolQuality;
+ }
+
+ @Override
+ public float getDigSpeed(final ItemStack aStack, final Block aBlock, final int aMetaData) {
+ if (!this.isItemStackUsable(aStack)) {
+ return 0.0F;
+ }
+ final IToolStats tStats = this.getToolStats(aStack);
+ if ((tStats == null) || (Math.max(0, this.getHarvestLevel(aStack, "")) < aBlock.getHarvestLevel(aMetaData))) {
+ return 0.0F;
+ }
+ return tStats.isMinableBlock(aBlock, (byte) aMetaData)
+ ? Math.max(Float.MIN_NORMAL, tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed)
+ : 0.0F;
+ }
+
+ @Override
+ public boolean onBlockDestroyed(final ItemStack aStack, final World aWorld, final Block aBlock, final int aX,
+ final int aY, final int aZ, final EntityLivingBase aPlayer) {
+ if (!this.isItemStackUsable(aStack)) {
+ return false;
+ }
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (tStats == null) {
+ return false;
+ }
+ GT_Utility.doSoundAtClient(tStats.getMiningSound(), 1, 1.0F);
+ this.doDamage(
+ aStack,
+ (int) Math.max(1, aBlock.getBlockHardness(aWorld, aX, aY, aZ) * tStats.getToolDamagePerBlockBreak()));
+ return this.getDigSpeed(aStack, aBlock, aWorld.getBlockMetadata(aX, aY, aZ)) > 0.0F;
+ }
+
+ private ItemStack getContainerItem(ItemStack aStack, final boolean playSound) {
+ if (!this.isItemStackUsable(aStack)) {
+ return null;
+ }
+ aStack = GT_Utility.copyAmount(1, aStack);
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (tStats == null) {
+ return null;
+ }
+ this.doDamage(aStack, tStats.getToolDamagePerContainerCraft());
+ aStack = aStack.stackSize > 0 ? aStack : null;
+ if (playSound) {}
+ return aStack;
+ }
+
+ @Override
+ public Interface_ToolStats getToolStats(final ItemStack aStack) {
+ this.isItemStackUsable(aStack);
+ return this.getToolStatsInternal(aStack);
+ }
+
+ private Interface_ToolStats getToolStatsInternal(final ItemStack aStack) {
+ return (Interface_ToolStats) (aStack == null ? null : this.mToolStats.get((short) aStack.getItemDamage()));
+ }
+
+ @Override
+ public boolean canWhack(final EntityPlayer aPlayer, final ItemStack aStack, final int aX, final int aY,
+ final int aZ) {
+ if (!this.isItemStackUsable(aStack)) {
+ return false;
+ }
+ final IToolStats tStats = this.getToolStats(aStack);
+ return (tStats != null) && tStats.isCrowbar();
+ }
+
+ @Override
+ public void onWhack(final EntityPlayer aPlayer, final ItemStack aStack, final int aX, final int aY, final int aZ) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (tStats != null) {
+ this.doDamage(aStack, tStats.getToolDamagePerEntityAttack());
+ }
+ }
+
+ @Override
+ public boolean canWrench(final EntityPlayer player, final int x, final int y, final int z) {
+ // System.out.println("canWrench");
+ if (player == null) {
+ return false;
+ }
+ if (player.getCurrentEquippedItem() == null) {
+ return false;
+ }
+ if (!this.isItemStackUsable(player.getCurrentEquippedItem())) {
+ return false;
+ }
+ final Interface_ToolStats tStats = this.getToolStats(player.getCurrentEquippedItem());
+ return (tStats != null) && tStats.isWrench();
+ }
+
+ @Override
+ public void wrenchUsed(final EntityPlayer player, final int x, final int y, final int z) {
+ if (player == null) {
+ return;
+ }
+ if (player.getCurrentEquippedItem() == null) {
+ return;
+ }
+ final IToolStats tStats = this.getToolStats(player.getCurrentEquippedItem());
+ if (tStats != null) {
+ this.doDamage(player.getCurrentEquippedItem(), tStats.getToolDamagePerEntityAttack());
+ }
+ }
+
+ @Override
+ public boolean canLink(final EntityPlayer aPlayer, final ItemStack aStack, final EntityMinecart cart) {
+ if (!this.isItemStackUsable(aStack)) {
+ return false;
+ }
+ final IToolStats tStats = this.getToolStats(aStack);
+ return (tStats != null) && tStats.isCrowbar();
+ }
+
+ @Override
+ public void onLink(final EntityPlayer aPlayer, final ItemStack aStack, final EntityMinecart cart) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (tStats != null) {
+ this.doDamage(aStack, tStats.getToolDamagePerEntityAttack());
+ }
+ }
+
+ @Override
+ public boolean canBoost(final EntityPlayer aPlayer, final ItemStack aStack, final EntityMinecart cart) {
+ if (!this.isItemStackUsable(aStack)) {
+ return false;
+ }
+ final IToolStats tStats = this.getToolStats(aStack);
+ return (tStats != null) && tStats.isCrowbar();
+ }
+
+ @Override
+ public void onBoost(final EntityPlayer aPlayer, final ItemStack aStack, final EntityMinecart cart) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if (tStats != null) {
+ this.doDamage(aStack, tStats.getToolDamagePerEntityAttack());
+ }
+ }
+
+ @Override
+ public void onCreated(final ItemStack aStack, final World aWorld, final EntityPlayer aPlayer) {
+ final IToolStats tStats = this.getToolStats(aStack);
+ if ((tStats != null) && (aPlayer != null)) {
+ tStats.onToolCrafted(aStack, aPlayer);
+ }
+ super.onCreated(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ public boolean isFull3D() {
+ return true;
+ }
+
+ @Override
+ public boolean isItemStackUsable(final ItemStack aStack) {
+ final IToolStats tStats = this.getToolStatsInternal(aStack);
+ if (((aStack.getItemDamage() % 2) == 1) || (tStats == null)) {
+ final NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT.removeTag("ench");
+ }
+ return false;
+ }
+ final Materials aMaterial = getPrimaryMaterial(aStack);
+ final HashMap<Integer, Integer> tMap = new HashMap<>(), tResult = new HashMap<>();
+ if (aMaterial.mEnchantmentTools != null) {
+ tMap.put(aMaterial.mEnchantmentTools.effectId, (int) aMaterial.mEnchantmentToolsLevel);
+ if (aMaterial.mEnchantmentTools == Enchantment.fortune) {
+ tMap.put(Enchantment.looting.effectId, (int) aMaterial.mEnchantmentToolsLevel);
+ }
+ if (aMaterial.mEnchantmentTools == Enchantment.knockback) {
+ tMap.put(Enchantment.power.effectId, (int) aMaterial.mEnchantmentToolsLevel);
+ }
+ if (aMaterial.mEnchantmentTools == Enchantment.fireAspect) {
+ tMap.put(Enchantment.flame.effectId, (int) aMaterial.mEnchantmentToolsLevel);
+ }
+ }
+ final Enchantment[] tEnchants = tStats.getEnchantments(aStack);
+ final int[] tLevels = tStats.getEnchantmentLevels(aStack);
+ for (int i = 0; i < tEnchants.length; i++) {
+ if (tLevels[i] > 0) {
+ final Integer tLevel = tMap.get(tEnchants[i].effectId);
+ tMap.put(
+ tEnchants[i].effectId,
+ tLevel == null ? tLevels[i] : tLevel == tLevels[i] ? tLevel + 1 : Math.max(tLevel, tLevels[i]));
+ }
+ }
+ for (final Entry<Integer, Integer> tEntry : tMap.entrySet()) {
+ if ((tEntry.getKey() == 33) || ((tEntry.getKey() == 20) && (tEntry.getValue() > 2))
+ || (tEntry.getKey() == Enchantment_Radioactivity.INSTANCE.effectId)) {
+ tResult.put(tEntry.getKey(), tEntry.getValue());
+ } else {
+ switch (Enchantment.enchantmentsList[tEntry.getKey()].type) {
+ case weapon:
+ if (tStats.isWeapon()) {
+ tResult.put(tEntry.getKey(), tEntry.getValue());
+ }
+ break;
+ case all:
+ tResult.put(tEntry.getKey(), tEntry.getValue());
+ break;
+ case armor:
+ case armor_feet:
+ case armor_head:
+ case armor_legs:
+ case armor_torso:
+ break;
+ case bow:
+ if (tStats.isRangedWeapon()) {
+ tResult.put(tEntry.getKey(), tEntry.getValue());
+ }
+ break;
+ case breakable:
+ break;
+ case fishing_rod:
+ break;
+ case digger:
+ if (tStats.isMiningTool()) {
+ tResult.put(tEntry.getKey(), tEntry.getValue());
+ }
+ break;
+ }
+ }
+ }
+ EnchantmentHelper.setEnchantments(tResult, aStack);
+ return true;
+ }
+
+ @Override
+ public short getChargedMetaData(final ItemStack aStack) {
+ return (short) (aStack.getItemDamage() - (aStack.getItemDamage() % 2));
+ }
+
+ @Override
+ public short getEmptyMetaData(final ItemStack aStack) {
+ final NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT.removeTag("ench");
+ }
+ return (short) ((aStack.getItemDamage() + 1) - (aStack.getItemDamage() % 2));
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(final ItemStack aStack, final ItemStack aBook) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(final ItemStack aStack, final ItemStack aMaterial) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ChiselBus.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ChiselBus.java
new file mode 100644
index 0000000000..3009c80c80
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ChiselBus.java
@@ -0,0 +1,78 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.util.EnumChatFormatting;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.Scrollable;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+
+public class GT_MetaTileEntity_ChiselBus extends GT_MetaTileEntity_Hatch_InputBus implements IAddUIWidgets {
+
+ public GT_MetaTileEntity_ChiselBus(int id, String name, String nameRegional, int tier) {
+ super(id, name, nameRegional, tier);
+ }
+
+ public GT_MetaTileEntity_ChiselBus(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, getSlots(aTier), aDescription, aTextures);
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex < getSlots(this.mTier);
+ }
+
+ public static int getSlots(int aTier) {
+ return (1 + aTier) * 16 + 1;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ChiselBus(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean allowSelectCircuit() {
+ return false;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { "Item Input Bus for Industrial Chisel", getSlots(this.mTier) - 1 + " + 1 " + " Slots",
+ "Added by: " + EnumChatFormatting.AQUA
+ + "Quetz4l"
+ + " - "
+ + EnumChatFormatting.RED
+ + "[GT++]"
+ + EnumChatFormatting.RESET };
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ int slotIndex = 0;
+ final Scrollable scrollable = new Scrollable().setVerticalScroll();
+ for (int row = 0; row * 4 < inventoryHandler.getSlots() - 1; row++) {
+ int columnsToMake = Math.min(inventoryHandler.getSlots() - row * 4, 4);
+ for (int column = 0; column < columnsToMake; column++) {
+ scrollable.widget(
+ new SlotWidget(inventoryHandler, slotIndex++).setPos(column * 18, row * 18)
+ .setSize(18, 18));
+
+ }
+ }
+
+ builder.widget(
+ scrollable.setSize(18 * 4 + 4, 18 * 4)
+ .setPos(52, 7)); // main slots
+ builder.widget(
+ new SlotWidget(inventoryHandler, slotIndex).setPos(18, 18)
+ .setSize(18, 18)); // slot for target
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake.java
new file mode 100644
index 0000000000..bab504910e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake.java
@@ -0,0 +1,128 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public class GT_MetaTileEntity_Hatch_AirIntake extends GT_MetaTileEntity_Hatch_FluidGenerator {
+
+ public GT_MetaTileEntity_Hatch_AirIntake(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_AirIntake(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_AirIntake(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getCustomTooltip() {
+ String[] aTooltip = new String[3];
+ aTooltip[0] = "DO NOT OBSTRUCT THE INPUT!";
+ aTooltip[1] = "Draws in Air from the surrounding environment";
+ aTooltip[2] = "Creates " + getAmountOfFluidToGenerate() + "L of Air every " + getMaxTickTime() + " ticks";
+ return aTooltip;
+ }
+
+ @Override
+ public Fluid getFluidToGenerate() {
+ return FluidUtils.getAir(1)
+ .getFluid();
+ }
+
+ @Override
+ public int getAmountOfFluidToGenerate() {
+ return 1000;
+ }
+
+ @Override
+ public int getMaxTickTime() {
+ return 4;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 128000;
+ }
+
+ @Override
+ public boolean doesHatchMeetConditionsToGenerate() {
+ return this.getBaseMetaTileEntity()
+ .getAirAtSide(
+ this.getBaseMetaTileEntity()
+ .getFrontFacing());
+ }
+
+ @Override
+ public void generateParticles(World aWorld, String name) {
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ return;
+ }
+ final float ran1 = GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat();
+ float ran2 = 0.0f;
+ float ran3 = 0.0f;
+ ran2 = GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat();
+ ran3 = GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat();
+
+ final IGregTechTileEntity aMuffler = this.getBaseMetaTileEntity();
+ final ForgeDirection aDir = aMuffler.getFrontFacing();
+ final float xPos = aDir.offsetX * 0.76f + aMuffler.getXCoord() + 0.25f;
+ float yPos = aDir.offsetY * 0.76f + aMuffler.getYCoord() + 0.65f;
+ final float zPos = aDir.offsetZ * 0.76f + aMuffler.getZCoord() + 0.25f;
+ float ySpd = aDir.offsetY * 0.1f + 0.2f + 0.1f * GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat();
+ float xSpd;
+ float zSpd;
+ if (aDir.offsetY == -1) {
+ // Logger.INFO("Y = -1");
+ final float temp = GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 2.0f * CORE.PI;
+ xSpd = (float) Math.sin(temp) * 0.1f;
+ zSpd = (float) Math.cos(temp) * 0.1f;
+ ySpd = -ySpd;
+ yPos = yPos - 0.8f;
+ } else {
+ xSpd = aDir.offsetX * (0.1f + 0.2f * GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat());
+ zSpd = aDir.offsetZ * (0.1f + 0.2f * GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat());
+
+ xSpd = -xSpd;
+ zSpd = -zSpd;
+ }
+
+ aWorld.spawnParticle(
+ name,
+ (double) (xPos + ran1 * 0.5f),
+ (double) (yPos + GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 0.5f),
+ (double) (zPos + GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 0.5f),
+ (double) xSpd,
+ (double) -ySpd,
+ (double) zSpd);
+ aWorld.spawnParticle(
+ name,
+ (double) (xPos + ran2 * 0.5f),
+ (double) (yPos + GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 0.5f),
+ (double) (zPos + GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 0.5f),
+ (double) xSpd,
+ (double) -ySpd,
+ (double) zSpd);
+ aWorld.spawnParticle(
+ name,
+ (double) (xPos + ran3 * 0.5f),
+ (double) (yPos + GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 0.5f),
+ (double) (zPos + GT_MetaTileEntity_Hatch_AirIntake.floatGen.nextFloat() * 0.5f),
+ (double) xSpd,
+ (double) -ySpd,
+ (double) zSpd);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake_Extreme.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake_Extreme.java
new file mode 100644
index 0000000000..007310fc06
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_AirIntake_Extreme.java
@@ -0,0 +1,37 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+public class GT_MetaTileEntity_Hatch_AirIntake_Extreme extends GT_MetaTileEntity_Hatch_AirIntake {
+
+ public GT_MetaTileEntity_Hatch_AirIntake_Extreme(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_AirIntake_Extreme(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_AirIntake_Extreme(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public int getAmountOfFluidToGenerate() {
+ return 8000;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 256000;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DynamoBuffer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DynamoBuffer.java
new file mode 100644
index 0000000000..f375900800
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DynamoBuffer.java
@@ -0,0 +1,67 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_DynamoBuffer extends GT_MetaTileEntity_Hatch_Dynamo {
+
+ public GT_MetaTileEntity_Hatch_DynamoBuffer(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_DynamoBuffer(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TexturesGtBlock.OVERLAYS_ENERGY_OUT_MULTI_BUFFER[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TexturesGtBlock.OVERLAYS_ENERGY_OUT_MULTI_BUFFER[this.mTier] };
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0L;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512L + GT_Values.V[this.mTier + 1] * 2048L;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_DynamoBuffer(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ String[] g;
+ g = new String[] { "Dynamo with internal storage and additional Amp capacity",
+ "Does not accept more than " + (this.maxEUOutput() * this.maxAmperesIn()) + "EU/t as input",
+ CORE.GT_Tooltip.get() };
+
+ return g;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 4;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 4;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_ElementalDataOrbHolder.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_ElementalDataOrbHolder.java
new file mode 100644
index 0000000000..336c6eb011
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_ElementalDataOrbHolder.java
@@ -0,0 +1,229 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import java.util.ArrayList;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_ElementalDataOrbHolder extends GT_MetaTileEntity_Hatch
+ implements IConfigurationCircuitSupport {
+
+ public GT_MetaTileEntity_Hatch_ElementalDataOrbHolder(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 17,
+ new String[] { "Holds Data Orbs for the Elemental Duplicator", "Can insert/extract the circuit slot",
+ "A circuit must be used to select a slot (1-16)", CORE.GT_Tooltip.get() });
+ }
+
+ public GT_MetaTileEntity_Hatch_ElementalDataOrbHolder(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 17, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_ElementalDataOrbHolder(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 17, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Data_Orb) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Data_Orb) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_ElementalDataOrbHolder(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ fillStacksIntoFirstSlots();
+ }
+ }
+
+ public void updateSlots() {
+ for (int i = 0; i < mInventory.length - 1; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ fillStacksIntoFirstSlots();
+ }
+
+ protected void fillStacksIntoFirstSlots() {
+ for (int i = 0; i < mInventory.length - 1; i++) {
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) {
+ mInventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {}
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ Logger.INFO("Checking if we can pull " + aStack.getDisplayName() + " from slot " + aIndex);
+ if (aIndex == mInventory.length - 1 && ItemUtils.isControlCircuit(aStack)
+ && side == getBaseMetaTileEntity().getFrontFacing()) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ Logger.INFO("Checking if we can put " + aStack.getDisplayName() + " into slot " + aIndex);
+ if (aIndex == mInventory.length - 1 && ItemUtils.isControlCircuit(aStack)
+ && side == getBaseMetaTileEntity().getFrontFacing()) {
+ return true;
+ }
+ return false;
+ }
+
+ public ArrayList<ItemStack> getInventory() {
+ ArrayList<ItemStack> aContents = new ArrayList<>();
+ for (int i = getBaseMetaTileEntity().getSizeInventory() - 2; i >= 0; i--) {
+ if (getBaseMetaTileEntity().getStackInSlot(i) != null)
+ aContents.add(getBaseMetaTileEntity().getStackInSlot(i));
+ }
+ return aContents;
+ }
+
+ public ItemStack getOrbByCircuit() {
+ ItemStack aCirc = getBaseMetaTileEntity().getStackInSlot(getCircuitSlot());
+ if (aCirc != null && ItemUtils.isControlCircuit(aCirc)) {
+ int slot = aCirc.getItemDamage() - 1; // slots are 0 indexed but there's no 0 circuit
+ if (slot < getBaseMetaTileEntity().getSizeInventory() - 1) {
+ return getBaseMetaTileEntity().getStackInSlot(slot);
+ } else {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ if (aIndex == mInventory.length - 1 && ItemUtils.isControlCircuit(aStack)
+ && ordinalSide == getBaseMetaTileEntity().getFrontFacing()
+ .ordinal()) {
+ Logger.INFO("Putting " + aStack.getDisplayName() + " into slot " + aIndex);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ if (aIndex == mInventory.length - 1 && ItemUtils.isControlCircuit(aStack)) {
+ Logger.INFO("Pulling " + aStack.getDisplayName() + " from slot " + aIndex);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean allowSelectCircuit() {
+ return true;
+ }
+
+ @Override
+ public int getCircuitSlot() {
+ return getSlots(mTier);
+ }
+
+ @Override
+ public int getCircuitSlotX() {
+ return 153;
+ }
+
+ @Override
+ public int getCircuitSlotY() {
+ return 63;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 4)
+ .startFromSlot(0)
+ .endAtSlot(15)
+ .background(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_DATA_ORB)
+ .applyForWidget(
+ widget -> widget.setFilter(stack -> ItemList.Tool_DataOrb.isStackEqual(stack, false, true)))
+ .build()
+ .setPos(52, 7));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_FluidGenerator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_FluidGenerator.java
new file mode 100644
index 0000000000..b4e213e829
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_FluidGenerator.java
@@ -0,0 +1,255 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public abstract class GT_MetaTileEntity_Hatch_FluidGenerator extends GT_MetaTileEntity_Hatch_Input {
+
+ protected static XSTR floatGen = new XSTR();
+ public int mProgresstime = 0, mMaxProgresstime = 0;
+
+ public GT_MetaTileEntity_Hatch_FluidGenerator(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_FluidGenerator(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public abstract String[] getCustomTooltip();
+
+ public abstract Fluid getFluidToGenerate();
+
+ public abstract int getAmountOfFluidToGenerate();
+
+ public abstract int getMaxTickTime();
+
+ @Override
+ public synchronized String[] getDescription() {
+ mDescriptionArray[1] = "Capacity: " + GT_Utility.formatNumbers(getCapacity()) + "L";
+ final String[] hatchTierString = new String[] { "Hatch Tier: " + GT_Utility.getColoredTierNameFromTier(mTier) };
+
+ String[] aCustomTips = getCustomTooltip();
+ final String[] desc = new String[mDescriptionArray.length + aCustomTips.length + 2];
+ System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length);
+ System.arraycopy(hatchTierString, 0, desc, mDescriptionArray.length, 1);
+ System.arraycopy(aCustomTips, 0, desc, mDescriptionArray.length + 1, aCustomTips.length);
+ desc[mDescriptionArray.length + aCustomTips.length] = CORE.GT_Tooltip.get();
+ return desc;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture,
+ new GT_RenderedTexture((IIconContainer) Textures.BlockIcons.OVERLAY_MUFFLER) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture,
+ new GT_RenderedTexture((IIconContainer) Textures.BlockIcons.OVERLAY_MUFFLER) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return false;
+ }
+
+ @Override
+ public abstract MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity);
+
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (!aBaseMetaTileEntity.isAllowedToWork()) {
+ aBaseMetaTileEntity.setActive(false);
+ mProgresstime = 0;
+ mMaxProgresstime = 0;
+ } else {
+ aBaseMetaTileEntity.setActive(true);
+ mMaxProgresstime = getMaxTickTime();
+ if (++mProgresstime >= mMaxProgresstime) {
+ if (this.canTankBeFilled()) {
+ addFluidToHatch(aTick);
+ }
+ mProgresstime = 0;
+ }
+ }
+ }
+
+ @Override
+ public int getProgresstime() {
+ return mProgresstime;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return mMaxProgresstime;
+ }
+
+ @Override
+ public int increaseProgress(int aProgress) {
+ mProgresstime += aProgress;
+ return mMaxProgresstime - mProgresstime;
+ }
+
+ public abstract void generateParticles(final World aWorld, final String name);
+
+ @Override
+ public int getTankPressure() {
+ return 100;
+ }
+
+ @Override
+ public abstract int getCapacity();
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ public abstract boolean doesHatchMeetConditionsToGenerate();
+
+ public boolean addFluidToHatch(long aTick) {
+ if (!doesHatchMeetConditionsToGenerate()) {
+ return false;
+ }
+ int aFillAmount = this.fill(FluidUtils.getFluidStack(getFluidToGenerate(), getAmountOfFluidToGenerate()), true);
+ if (aFillAmount > 0) {
+ if (this.getBaseMetaTileEntity()
+ .isClientSide()) {
+ generateParticles(
+ this.getBaseMetaTileEntity()
+ .getWorld(),
+ "cloud");
+ }
+ }
+ return aFillAmount > 0;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return true;
+ }
+
+ @Override
+ public int fill(FluidStack aFluid, boolean doFill) {
+ if (aFluid == null || aFluid.getFluid()
+ .getID() <= 0 || aFluid.amount <= 0 || aFluid.getFluid() != getFluidToGenerate() || !canTankBeFilled()) {
+ return 0;
+ }
+
+ if (getFillableStack() == null || getFillableStack().getFluid()
+ .getID() <= 0) {
+ if (aFluid.amount <= getCapacity()) {
+ if (doFill) {
+ setFillableStack(aFluid.copy());
+ getBaseMetaTileEntity().markDirty();
+ }
+ return aFluid.amount;
+ }
+ if (doFill) {
+ setFillableStack(aFluid.copy());
+ getFillableStack().amount = getCapacity();
+ getBaseMetaTileEntity().markDirty();
+ }
+ return getCapacity();
+ }
+
+ if (!getFillableStack().isFluidEqual(aFluid)) return 0;
+
+ int space = getCapacity() - getFillableStack().amount;
+ if (aFluid.amount <= space) {
+ if (doFill) {
+ getFillableStack().amount += aFluid.amount;
+ getBaseMetaTileEntity().markDirty();
+ }
+ return aFluid.amount;
+ }
+ if (doFill) getFillableStack().amount = getCapacity();
+ return space;
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection aSide, Fluid aFluid) {
+ return false;
+ }
+
+ @Override
+ public int fill(ForgeDirection arg0, FluidStack arg1, boolean arg2) {
+ return 0;
+ }
+
+ @Override
+ public int fill_default(ForgeDirection aSide, FluidStack aFluid, boolean doFill) {
+ return 0;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mProgresstime", mProgresstime);
+ aNBT.setInteger("mMaxProgresstime", mMaxProgresstime);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mProgresstime = aNBT.getInteger("mProgresstime");
+ mMaxProgresstime = aNBT.getInteger("mMaxProgresstime");
+ super.loadNBTData(aNBT);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBattery.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBattery.java
new file mode 100644
index 0000000000..c55ddda47d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBattery.java
@@ -0,0 +1,235 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.gui.widget.ElectricSlotWidget;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_InputBattery extends GT_MetaTileEntity_Hatch {
+
+ public final RecipeMap<?> mRecipeMap = null;
+
+ public GT_MetaTileEntity_Hatch_InputBattery(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, getSlots(aTier), "Chargeable Item Bus for Multiblocks");
+ }
+
+ public GT_MetaTileEntity_Hatch_InputBattery(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aTier < 1 ? 1 : aTier == 1 ? 4 : aTier == 2 ? 4 : 16, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ int mSlots = 0;
+ if (this.mTier == 2) {
+ mSlots = 4;
+ } else if (this.mTier == 4) {
+ mSlots = 16;
+ } else {
+ mSlots = 16;
+ }
+ return ArrayUtils.addAll(this.mDescriptionArray, "Capacity: " + mSlots + " slots", CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512 + V[mTier + 1] * 16;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 4;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Charger) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Charger) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_InputBattery(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ fillStacksIntoFirstSlots();
+ }
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (aBaseMetaTileEntity.getMetaTileEntity() instanceof MetaTileEntity mMetaTileEntity) {
+ if (mMetaTileEntity.rechargerSlotCount() > 0 && aBaseMetaTileEntity.getStoredEU() > 0) {
+ for (int i = mMetaTileEntity.rechargerSlotStartIndex(),
+ k = mMetaTileEntity.rechargerSlotCount() + i; i < k; i++) {
+ if (aBaseMetaTileEntity.getStoredEU() > 0 && mMetaTileEntity.mInventory[i] != null) {
+ for (int u = 0; u < 10; u++) {
+ aBaseMetaTileEntity.decreaseStoredEnergyUnits(
+ GT_ModHandler.chargeElectricItem(
+ mMetaTileEntity.mInventory[i],
+ (int) Math.min(V[this.mTier] * 15, aBaseMetaTileEntity.getStoredEU()),
+ (int) Math.min(Integer.MAX_VALUE, GT_Values.V[u]),
+ false,
+ false),
+ true);
+ if (mMetaTileEntity.mInventory[i].stackSize <= 0) {
+ mMetaTileEntity.mInventory[i] = null;
+ }
+ }
+ }
+ }
+ } else {}
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ }
+
+ public void updateSlots() {
+ for (int i = 0; i < mInventory.length; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ fillStacksIntoFirstSlots();
+ }
+
+ protected void fillStacksIntoFirstSlots() {
+ for (int i = 0; i < mInventory.length; i++)
+ for (int j = i + 1; j < mInventory.length; j++) if (mInventory[j] != null
+ && (mInventory[i] == null || GT_Utility.areStacksEqual(mInventory[i], mInventory[j]))) {
+ GT_Utility.moveStackFromSlotAToSlotB(
+ getBaseMetaTileEntity(),
+ getBaseMetaTileEntity(),
+ j,
+ i,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ }
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == getBaseMetaTileEntity().getFrontFacing()
+ && (mRecipeMap == null || mRecipeMap.containsInput(aStack));
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == getBaseMetaTileEntity().getFrontFacing()
+ && (mRecipeMap == null || mRecipeMap.containsInput(aStack));
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return switch (mTier) {
+ case 2 -> 4;
+ case 4 -> 16;
+ default -> 16;
+ };
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (mTier == 2) {
+ for (int i = 0; i < 4; i++) {
+ builder
+ .widget(new ElectricSlotWidget(inventoryHandler, i).setPos(70 + (i % 2) * 18, 25 + (i / 2) * 18));
+ }
+ } else {
+ for (int i = 0; i < 16; i++) {
+ builder.widget(new ElectricSlotWidget(inventoryHandler, i).setPos(52 + (i % 4) * 18, 7 + (i / 4) * 18));
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler_Adv.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler_Adv.java
new file mode 100644
index 0000000000..a3261af6f6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler_Adv.java
@@ -0,0 +1,370 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.GT_Mod;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Config;
+import gregtech.common.GT_Pollution;
+import gtPlusPlus.core.item.general.ItemAirFilter;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_Muffler_Adv extends GT_MetaTileEntity_Hatch_Muffler implements IAddGregtechLogo {
+
+ protected int SLOT_FILTER = 0;
+
+ @Override
+ public void onConfigLoad(GT_Config aConfig) {
+ super.onConfigLoad(aConfig);
+ try {
+ int a1 = GT_Mod.gregtechproxy.mPollutionSmogLimit;
+ if (a1 > 0) {
+ mPollutionSmogLimit = a1;
+ }
+ } catch (Throwable t) {
+ mPollutionSmogLimit = 500000;
+ }
+ }
+
+ private int mPollutionSmogLimit = 500000;
+
+ public GT_MetaTileEntity_Hatch_Muffler_Adv(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, 1, new String[] { "" });
+ }
+
+ public GT_MetaTileEntity_Hatch_Muffler_Adv(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures);
+ }
+
+ final String[] mDescription = new String[] { "Outputs pollution from a multiblock", "DO NOT OBSTRUCT THE OUTPUT!",
+ "Requires 3 Air Blocks in front of the exhaust face",
+ mTier < 5 ? "Requires an Air Filter"
+ : "Requires an Air Filter " + EnumChatFormatting.WHITE + "[Tier 2]" + EnumChatFormatting.GRAY,
+ "Can take Air Filters from an input bus of the multiblock",
+ "Reduces Pollution to " + calculatePollutionReduction(100, true) + "%",
+ "Recovers " + (100 - calculatePollutionReduction(100, true)) + "% of CO2/CO/SO2", CORE.GT_Tooltip.get() };
+
+ @Override
+ public String[] getDescription() {
+ return mDescription;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Muffler_Adv) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Muffler_Adv) };
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex == SLOT_FILTER;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return (aIndex == this.SLOT_FILTER && isAirFilter(aStack));
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Muffler_Adv(this.mName, this.mTier, mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean polluteEnvironment(MetaTileEntity parentTileEntity) {
+ if (!airCheck()) return false; // Muffler obstructed.
+
+ int emission = 10000;
+ if (damageAirFilter(parentTileEntity)) {
+ // damageAirFilter already checks that we have a valid filter.
+ emission = calculatePollutionReduction(emission, true);
+ } else {
+ // Revert to reduction of the basic muffler.
+ emission = super.calculatePollutionReduction(emission);
+ }
+ GT_Pollution.addPollution(getBaseMetaTileEntity(), emission);
+ return true;
+ }
+
+ @Override
+ public int calculatePollutionReduction(int aPollution) {
+ // This is called by EBF to calculate exhaust gas amounts, we need to check the filter.
+ return calculatePollutionReduction(aPollution, false);
+ }
+
+ /**
+ * Calculates pollution reduction.
+ *
+ * @param aPollution Amount of pollution to be reduced.
+ * @param ignoreFilter If this is true, assumes that a valid filter is present without checking (for example, to
+ * build tooltips).
+ * @return Amount of pollution after reduction.
+ */
+ protected int calculatePollutionReduction(int aPollution, boolean ignoreFilter) {
+ if (!ignoreFilter && !hasAirFilter()) {
+ // Without a filter, downgrade to basic muffler reduction.
+ return super.calculatePollutionReduction(aPollution);
+ }
+
+ // Special case to be always better than a basic muffler.
+ if (mTier < 2) return (int) (aPollution * 0.95);
+ if (mTier > 8) return 0;
+
+ return (int) (aPollution * Math.pow(0.64D, mTier - 1));
+ }
+
+ /**
+ *
+ * @return True if enough blocks in front of the muffler are air.
+ */
+ private boolean airCheck() {
+ IGregTechTileEntity bmte = getBaseMetaTileEntity();
+ ForgeDirection facing = bmte.getFrontFacing();
+ return bmte.getAirAtSide(facing) && bmte.getAirAtSideAndDistance(facing, 1)
+ && bmte.getAirAtSideAndDistance(facing, 2);
+ }
+
+ /**
+ * Try to damage an air filter. Will first try to find a valid filter in the hatch's own inventory, then in the
+ * input buses of the parent multiblock. If the filter is destroyed, will try to replace it from the parent
+ * multiblock's input buses again.
+ *
+ * @param parentTileEntity Which multiblock this hatch is a part of. If this is null, only checks inventory of the
+ * muffler.
+ * @return True if the filter has been successfully damaged.
+ */
+ private boolean damageAirFilter(MetaTileEntity parentTileEntity) {
+ if (!findAirFilter(parentTileEntity)) return false; // No filter available.
+
+ ItemStack filter = mInventory[SLOT_FILTER];
+ if (filter == null) return false; // This should never happen if findAirFilter() above succeeded.
+
+ long currentDamage = ItemAirFilter.getFilterDamage(filter);
+ if (currentDamage < ItemAirFilter.getFilterMaxDamage(filter) - 1) {
+ // Damage filter by one step.
+ ItemAirFilter.setFilterDamage(filter, currentDamage + 1);
+ return true;
+ } else {
+ // Destroy the filter.
+ mInventory[SLOT_FILTER] = null;
+
+ // Try to find a new one.
+ findAirFilter(parentTileEntity);
+
+ // Regardless of whether we have a new filter or not, *this* operation succeeded.
+ return true;
+ }
+ }
+
+ /**
+ * Try to find a valid air filter in the input buses of the parent multiblock.
+ *
+ * @param parentTileEntity Which multiblock this hatch is a part of. If this is null, only checks inventory of the
+ * muffler.
+ * @return True if the inventory of the muffler already contains an air filter, or if one was retrieved from the
+ * parent multiblock.
+ */
+ private boolean findAirFilter(MetaTileEntity parentTileEntity) {
+ if (hasAirFilter()) return true; // Has a filter in inventory.
+ if (mInventory[SLOT_FILTER] != null) return false; // Has a non-filter item in inventory.
+ if (parentTileEntity == null) return false; // Unknown parent multiblock.
+
+ if (parentTileEntity instanceof GT_MetaTileEntity_MultiBlockBase GTMultiBase) {
+ for (var inputBus : GTMultiBase.mInputBusses) {
+ for (ItemStack stack : inputBus.mInventory) {
+ if (isAirFilter(stack)) {
+ ItemStack stackCopy = stack.copy();
+ if (GTMultiBase.depleteInput(stack)) {
+ mInventory[SLOT_FILTER] = stackCopy;
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ *
+ * @return True if the item currently in the inventory is an air filter valid for this tier of muffler hatch.
+ */
+ private boolean hasAirFilter() {
+ return isAirFilter(mInventory[SLOT_FILTER]);
+ }
+
+ /**
+ *
+ * @param filter
+ * @return True if the argument is an air filter valid for this tier of muffler hatch.
+ */
+ public boolean isAirFilter(ItemStack filter) {
+ if (filter == null) return false;
+ if (filter.getItem() instanceof ItemAirFilter) {
+ if (mTier < 5) {
+ // Accept any filter.
+ return true;
+ } else {
+ // Accept only T2 filter.
+ return filter.getItemDamage() == 1;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+
+ if (aBaseMetaTileEntity.isClientSide()) {
+ if (this.getBaseMetaTileEntity()
+ .isActive()) {
+ String aParticleName;
+ if ((aTick % 2) == 0) {
+ aParticleName = "cloud";
+ } else {
+ aParticleName = "smoke";
+ }
+ this.pollutionParticles(
+ this.getBaseMetaTileEntity()
+ .getWorld(),
+ aParticleName);
+ }
+ }
+ }
+
+ @Override
+ public void pollutionParticles(World aWorld, String name) {
+ float ran1 = CORE.RANDOM.nextFloat();
+ float ran2 = 0.0F;
+ float ran3 = 0.0F;
+ boolean chk1 = ran1 * 100.0F < (float) this.calculatePollutionReduction(100);
+ boolean chk2;
+ boolean chk3;
+ int aPollutionAmount = PollutionUtils.getPollution(getBaseMetaTileEntity());
+ if (aPollutionAmount >= mPollutionSmogLimit) {
+ ran2 = CORE.RANDOM.nextFloat();
+ ran3 = CORE.RANDOM.nextFloat();
+ chk2 = ran2 * 100.0F < (float) this.calculatePollutionReduction(100);
+ chk3 = ran3 * 100.0F < (float) this.calculatePollutionReduction(100);
+ if (!chk1 && !chk2 && !chk3) {
+ return;
+ }
+ } else {
+ if (!chk1) {
+ return;
+ }
+
+ chk3 = false;
+ chk2 = false;
+ }
+
+ IGregTechTileEntity aMuffler = this.getBaseMetaTileEntity();
+ ForgeDirection aDir = aMuffler.getFrontFacing();
+ float xPos = (float) aDir.offsetX * 0.76F + (float) aMuffler.getXCoord() + 0.25F;
+ float yPos = (float) aDir.offsetY * 0.76F + (float) aMuffler.getYCoord() + 0.25F;
+ float zPos = (float) aDir.offsetZ * 0.76F + (float) aMuffler.getZCoord() + 0.25F;
+ float ySpd = (float) aDir.offsetY * 0.1F + 0.2F + 0.1F * CORE.RANDOM.nextFloat();
+ float xSpd;
+ float zSpd;
+ if (aDir.offsetY == -1) {
+ float temp = CORE.RANDOM.nextFloat() * 2.0F * CORE.PI;
+ xSpd = (float) Math.sin((double) temp) * 0.1F;
+ zSpd = (float) Math.cos((double) temp) * 0.1F;
+ } else {
+ xSpd = (float) aDir.offsetX * (0.1F + 0.2F * CORE.RANDOM.nextFloat());
+ zSpd = (float) aDir.offsetZ * (0.1F + 0.2F * CORE.RANDOM.nextFloat());
+ }
+
+ if (chk1) {
+ aWorld.spawnParticle(
+ name,
+ (double) (xPos + ran1 * 0.5F),
+ (double) (yPos + CORE.RANDOM.nextFloat() * 0.5F),
+ (double) (zPos + CORE.RANDOM.nextFloat() * 0.5F),
+ (double) xSpd,
+ (double) ySpd,
+ (double) zSpd);
+ }
+
+ if (chk2) {
+ aWorld.spawnParticle(
+ name,
+ (double) (xPos + ran2 * 0.5F),
+ (double) (yPos + CORE.RANDOM.nextFloat() * 0.5F),
+ (double) (zPos + CORE.RANDOM.nextFloat() * 0.5F),
+ (double) xSpd,
+ (double) ySpd,
+ (double) zSpd);
+ }
+
+ if (chk3) {
+ aWorld.spawnParticle(
+ name,
+ (double) (xPos + ran3 * 0.5F),
+ (double) (yPos + CORE.RANDOM.nextFloat() * 0.5F),
+ (double) (zPos + CORE.RANDOM.nextFloat() * 0.5F),
+ (double) xSpd,
+ (double) ySpd,
+ (double) zSpd);
+ }
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {}
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return new GUITextureSet().setMainBackground(GTPP_UITextures.BACKGROUND_YELLOW)
+ .setItemSlot(GTPP_UITextures.SLOT_ITEM_YELLOW)
+ .setTitleTab(
+ GTPP_UITextures.TAB_TITLE_YELLOW,
+ GTPP_UITextures.TAB_TITLE_DARK_YELLOW,
+ GTPP_UITextures.TAB_TITLE_ANGULAR_YELLOW);
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new SlotWidget(inventoryHandler, 0).setFilter(stack -> stack.getItem() instanceof ItemAirFilter)
+ .setBackground(getGUITextureSet().getItemSlot())
+ .setPos(79, 34));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Naquadah.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Naquadah.java
new file mode 100644
index 0000000000..ad94907d4c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Naquadah.java
@@ -0,0 +1,203 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import java.lang.reflect.Field;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class GT_MetaTileEntity_Hatch_Naquadah extends GT_MetaTileEntity_Hatch_Input {
+
+ public final FluidStack[] mFluidsToUse = new FluidStack[3];
+ public final int mFluidCapacity;
+
+ public GT_MetaTileEntity_Hatch_Naquadah(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional, 6);
+ mFluidCapacity = 32000;
+ initHatch();
+ }
+
+ public GT_MetaTileEntity_Hatch_Naquadah(final String aName, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, 6, aDescription[0], aTextures);
+ mFluidCapacity = 32000;
+ initHatch();
+ }
+
+ private void initHatch() {
+ if (mFluidsToUse[0] == null) {
+ mFluidsToUse[0] = Materials.Naquadah.getMolten(1);
+ }
+ if (mFluidsToUse[1] == null) {
+ mFluidsToUse[1] = Materials.NaquadahEnriched.getMolten(1);
+ }
+ if (mFluidsToUse[2] == null) {
+ mFluidsToUse[2] = Materials.Naquadria.getMolten(1);
+ }
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture,
+ new GT_RenderedTexture((IIconContainer) Textures.BlockIcons.NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture,
+ new GT_RenderedTexture((IIconContainer) Textures.BlockIcons.NAQUADAH_REACTOR_FLUID_SIDE) };
+ }
+
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ if (side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 0) {
+ for (FluidStack f : mFluidsToUse) {
+ if (f != null) {
+ if (GT_Utility.getFluidForFilledItem(aStack, true)
+ .getFluid() == f.getFluid()) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(final FluidStack aFluid) {
+ for (FluidStack f : mFluidsToUse) {
+ if (f != null) {
+ if (aFluid.getFluid() == f.getFluid()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int getCapacity() {
+ return this.mFluidCapacity;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Naquadah(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ if (aDescCache[0] == null || aDescCache[0].contains(".name") || aDescCache[0].contains("fluid.")) {
+ aDescCache[0] = formatFluidString(this.mFluidsToUse[0]);
+ }
+ if (aDescCache[1] == null || aDescCache[1].contains(".name") || aDescCache[1].contains("fluid.")) {
+ aDescCache[1] = formatFluidString(this.mFluidsToUse[1]);
+ }
+ if (aDescCache[2] == null || aDescCache[2].contains(".name") || aDescCache[2].contains("fluid.")) {
+ aDescCache[2] = formatFluidString(this.mFluidsToUse[2]);
+ }
+ String aNaq = aDescCache[0];
+ String aEnrNaq = aDescCache[1];
+ String aNaquad = aDescCache[2];
+ String[] s2 = new String[] { "Fluid Input for Multiblocks", "Capacity: " + getCapacity() + "L",
+ "Accepted Fluid: " + aNaq, "Accepted Fluid: " + aEnrNaq, "Accepted Fluid: " + aNaquad,
+ CORE.GT_Tooltip.get() };
+ return s2;
+ }
+
+ private static String[] aDescCache = new String[3];
+
+ private String formatFluidString(FluidStack f) {
+ FluidStack mLockedStack = f;
+ Integer mLockedTemp = 0;;
+ String mTempMod = "" + EnumChatFormatting.RESET;
+ mLockedTemp = mLockedStack.getFluid()
+ .getTemperature();
+ if (mLockedTemp != null) {
+ if (mLockedTemp <= -3000) {
+ mTempMod = "" + EnumChatFormatting.DARK_PURPLE;
+ } else if (mLockedTemp >= -2999 && mLockedTemp <= -500) {
+ mTempMod = "" + EnumChatFormatting.DARK_BLUE;
+ } else if (mLockedTemp >= -499 && mLockedTemp <= -50) {
+ mTempMod = "" + EnumChatFormatting.BLUE;
+ } else if (mLockedTemp >= 30 && mLockedTemp <= 300) {
+ mTempMod = "" + EnumChatFormatting.AQUA;
+ } else if (mLockedTemp >= 301 && mLockedTemp <= 800) {
+ mTempMod = "" + EnumChatFormatting.YELLOW;
+ } else if (mLockedTemp >= 801 && mLockedTemp <= 1500) {
+ mTempMod = "" + EnumChatFormatting.GOLD;
+ } else if (mLockedTemp >= 1501) {
+ mTempMod = "" + EnumChatFormatting.RED;
+ }
+ }
+ return mTempMod + mLockedStack.getLocalizedName();
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ // TODO Auto-generated method stub
+ return super.getTextureSet(aTextures);
+ }
+
+ private Field F1, F2;
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int aColorIndex, boolean aActive, boolean aRedstone) {
+ byte a1 = 0, a2 = 0;
+ try {
+ if (F1 == null) {
+ F1 = ReflectionUtils.getField(getClass(), "actualTexture");
+ }
+ if (F2 == null) {
+ F2 = ReflectionUtils.getField(getClass(), "mTexturePage");
+ }
+
+ if (F1 != null) {
+ a1 = F1.getByte(this);
+ }
+ if (F2 != null) {
+ a2 = F2.getByte(this);
+ }
+ } catch (IllegalArgumentException | IllegalAccessException n) {}
+
+ int textureIndex = a1 | a2 << 7;
+ byte texturePointer = (byte) (a1 & 127);
+
+ if (side == ForgeDirection.UP || side == ForgeDirection.DOWN) {
+ ITexture g = textureIndex > 0 ? BlockIcons.casingTexturePages[a2][texturePointer]
+ : BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1];
+
+ return new ITexture[] { g,
+ new GT_RenderedTexture((IIconContainer) Textures.BlockIcons.NAQUADAH_REACTOR_FLUID_TOP_ACTIVE) };
+ }
+
+ return side != facing
+ ? (textureIndex > 0 ? new ITexture[] { BlockIcons.casingTexturePages[a2][texturePointer] }
+ : new ITexture[] { BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1] })
+ : (textureIndex > 0
+ ? (aActive ? this.getTexturesActive(BlockIcons.casingTexturePages[a2][texturePointer])
+ : this.getTexturesInactive(BlockIcons.casingTexturePages[a2][texturePointer]))
+ : (aActive ? this.getTexturesActive(BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1])
+ : this.getTexturesInactive(BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1])));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBattery.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBattery.java
new file mode 100644
index 0000000000..58dc7ec380
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBattery.java
@@ -0,0 +1,222 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.gui.widget.ElectricSlotWidget;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_OutputBattery extends GT_MetaTileEntity_Hatch {
+
+ public GT_MetaTileEntity_Hatch_OutputBattery(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, getSlots(aTier), "Dischargeable Item Bus for Multiblocks");
+ }
+
+ public GT_MetaTileEntity_Hatch_OutputBattery(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aTier < 1 ? 1 : aTier == 1 ? 4 : aTier == 2 ? 9 : 16, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ int mSlots = 0;
+ if (this.mTier == 2) {
+ mSlots = 4;
+ } else if (this.mTier == 4) {
+ mSlots = 16;
+ } else {
+ mSlots = 16;
+ }
+ return ArrayUtils.addAll(this.mDescriptionArray, "Capacity: " + mSlots + " slots", CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512 + V[mTier + 1] * 8;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Discharger) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Hatch_Discharger) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_OutputBattery(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ public void updateSlots() {
+ for (int i = 0; i < mInventory.length; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ fillStacksIntoFirstSlots();
+ }
+
+ protected void fillStacksIntoFirstSlots() {
+ for (int i = 0; i < mInventory.length; i++)
+ for (int j = i + 1; j < mInventory.length; j++) if (mInventory[j] != null
+ && (mInventory[i] == null || GT_Utility.areStacksEqual(mInventory[i], mInventory[j]))) {
+ GT_Utility.moveStackFromSlotAToSlotB(
+ getBaseMetaTileEntity(),
+ getBaseMetaTileEntity(),
+ j,
+ i,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ }
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return mTier == 2 ? 4 : 16;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ fillStacksIntoFirstSlots();
+ }
+
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (aBaseMetaTileEntity.getMetaTileEntity() instanceof MetaTileEntity mMetaTileEntity) {
+ if (mMetaTileEntity.dechargerSlotCount() > 0
+ && mMetaTileEntity.getEUVar() < aBaseMetaTileEntity.getEUCapacity()) {
+ for (int i = mMetaTileEntity.dechargerSlotStartIndex(),
+ k = mMetaTileEntity.dechargerSlotCount() + i; i < k; i++) {
+ if (mMetaTileEntity.mInventory[i] != null
+ && mMetaTileEntity.getEUVar() < aBaseMetaTileEntity.getEUCapacity()) {
+ aBaseMetaTileEntity.increaseStoredEnergyUnits(
+ GT_ModHandler.dischargeElectricItem(
+ mMetaTileEntity.mInventory[i],
+ (int) Math.min(
+ V[mTier] * 15,
+ aBaseMetaTileEntity.getEUCapacity() - aBaseMetaTileEntity.getStoredEU()),
+ (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getInputTier()),
+ true,
+ false,
+ false),
+ true);
+ if (mMetaTileEntity.mInventory[i].stackSize <= 0) mMetaTileEntity.mInventory[i] = null;
+ }
+ }
+ }
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (mTier == 2) {
+ for (int i = 0; i < 4; i++) {
+ builder
+ .widget(new ElectricSlotWidget(inventoryHandler, i).setPos(70 + (i % 2) * 18, 25 + (i / 2) * 18));
+ }
+ } else {
+ for (int i = 0; i < 16; i++) {
+ builder.widget(new ElectricSlotWidget(inventoryHandler, i).setPos(52 + (i % 4) * 18, 7 + (i / 4) * 18));
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Reservoir.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Reservoir.java
new file mode 100644
index 0000000000..bfe8290240
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Reservoir.java
@@ -0,0 +1,75 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.world.World;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_Reservoir extends GT_MetaTileEntity_Hatch_FluidGenerator {
+
+ public GT_MetaTileEntity_Hatch_Reservoir(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_Reservoir(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Reservoir(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getCustomTooltip() {
+ String[] aTooltip = new String[2];
+ aTooltip[0] = "Infinite water supply hatch";
+ aTooltip[1] = "Fills to max capacity every 5 seconds";
+ return aTooltip;
+ }
+
+ @Override
+ public Fluid getFluidToGenerate() {
+ return FluidRegistry.WATER;
+ }
+
+ @Override
+ public int getAmountOfFluidToGenerate() {
+ return 2_000_000_000;
+ }
+
+ @Override
+ public int getMaxTickTime() {
+ return 100;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 2_000_000_000;
+ }
+
+ @Override
+ public boolean doesHatchMeetConditionsToGenerate() {
+ return true;
+ }
+
+ @Override
+ public void generateParticles(World aWorld, String name) {}
+
+ @Override
+ public ITexture[] getTexturesActive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Water) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(final ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Water) };
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Solidifier.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Solidifier.java
new file mode 100644
index 0000000000..94c28877d8
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Solidifier.java
@@ -0,0 +1,72 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Hatch_Solidifier extends GT_MetaTileEntity_Hatch_Input {
+
+ static final int moldSlot = 2;
+
+ public GT_MetaTileEntity_Hatch_Solidifier(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] {
+ "Fluid Input with Mold for " + EnumChatFormatting.YELLOW
+ + "Large Processing Factory"
+ + EnumChatFormatting.RESET,
+ "#22 Circuit is imprinted in Hatch", "Capacity: " + GT_Utility.formatNumbers(getCapacity()) + "L",
+ "Added by: " + EnumChatFormatting.AQUA
+ + "Quetz4l"
+ + " - "
+ + EnumChatFormatting.RED
+ + "[GT++]"
+ + EnumChatFormatting.RESET };
+ }
+
+ public GT_MetaTileEntity_Hatch_Solidifier(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, getSlots(aTier), aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Solidifier(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ public ItemStack getMold() {
+ return this.getStackInSlot(moldSlot);
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(
+ new SlotWidget(inventoryHandler, moldSlot).setPos(125, 35)
+ .setSize(18, 18));
+ }
+
+ @Override
+ public void onBlockDestroyed() {
+ super.onBlockDestroyed();
+ }
+
+ // for a drop-down form when the hatch is destroyed
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ if (aIndex == moldSlot) return true;
+ else return super.isValidSlot(aIndex);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusInput.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusInput.java
new file mode 100644
index 0000000000..5cc1e64d13
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusInput.java
@@ -0,0 +1,279 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.ITEM_IN_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_Hatch_Steam_BusInput extends GT_MetaTileEntity_Hatch {
+
+ public RecipeMap<?> mRecipeMap = null;
+ public boolean disableSort;
+
+ public GT_MetaTileEntity_Hatch_Steam_BusInput(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ getSlots(aTier),
+ new String[] { "Item Input for Steam Multiblocks",
+ "Shift + right click with screwdriver to toggle automatic item shuffling", "Capacity: 4 stacks",
+ "Does not work with non-steam multiblocks", CORE.GT_Tooltip.get() });
+ }
+
+ public GT_MetaTileEntity_Hatch_Steam_BusInput(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Steam_BusInput(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(ITEM_IN_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(ITEM_IN_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Steam_BusInput(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ fillStacksIntoFirstSlots();
+ }
+ }
+
+ public void updateSlots() {
+ for (int i = 0; i < mInventory.length; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ fillStacksIntoFirstSlots();
+ }
+
+ protected void fillStacksIntoFirstSlots() {
+ if (disableSort) {
+ for (int i = 0; i < mInventory.length; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ } else {
+ for (int i = 0; i < mInventory.length; i++)
+ for (int j = i + 1; j < mInventory.length; j++) if (mInventory[j] != null
+ && (mInventory[i] == null || GT_Utility.areStacksEqual(mInventory[i], mInventory[j])))
+ GT_Utility.moveStackFromSlotAToSlotB(
+ getBaseMetaTileEntity(),
+ getBaseMetaTileEntity(),
+ j,
+ i,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("disableSort", disableSort);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ disableSort = aNBT.getBoolean("disableSort");
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ disableSort = !disableSort;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("200.1", "Automatic Item Shuffling: ")
+ + (disableSort ? GT_Utility.trans("087", "Disabled") : GT_Utility.trans("088", "Enabled")));
+ }
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == getBaseMetaTileEntity().getFrontFacing()
+ && (mRecipeMap == null || mRecipeMap.containsInput(aStack));
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[14][17][];
+ for (byte c = -1; c < 16; c++) {
+ if (rTextures[0][c + 1] == null) rTextures[0][c + 1] = getSideFacingActive(c);
+ if (rTextures[1][c + 1] == null) rTextures[1][c + 1] = getSideFacingInactive(c);
+ if (rTextures[2][c + 1] == null) rTextures[2][c + 1] = getFrontFacingActive(c);
+ if (rTextures[3][c + 1] == null) rTextures[3][c + 1] = getFrontFacingInactive(c);
+ if (rTextures[4][c + 1] == null) rTextures[4][c + 1] = getTopFacingActive(c);
+ if (rTextures[5][c + 1] == null) rTextures[5][c + 1] = getTopFacingInactive(c);
+ if (rTextures[6][c + 1] == null) rTextures[6][c + 1] = getBottomFacingActive(c);
+ if (rTextures[7][c + 1] == null) rTextures[7][c + 1] = getBottomFacingInactive(c);
+ if (rTextures[8][c + 1] == null) rTextures[8][c + 1] = getBottomFacingPipeActive(c);
+ if (rTextures[9][c + 1] == null) rTextures[9][c + 1] = getBottomFacingPipeInactive(c);
+ if (rTextures[10][c + 1] == null) rTextures[10][c + 1] = getTopFacingPipeActive(c);
+ if (rTextures[11][c + 1] == null) rTextures[11][c + 1] = getTopFacingPipeInactive(c);
+ if (rTextures[12][c + 1] == null) rTextures[12][c + 1] = getSideFacingPipeActive(c);
+ if (rTextures[13][c + 1] == null) rTextures[13][c + 1] = getSideFacingPipeInactive(c);
+ }
+ return rTextures;
+ }
+
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP) };
+ }
+
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP) };
+ }
+
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM) };
+ }
+
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM) };
+ }
+
+ public ITexture[] getBottomFacingPipeActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getBottomFacingPipeInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getTopFacingPipeActive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getTopFacingPipeInactive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getSideFacingPipeActive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getSideFacingPipeInactive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ getBaseMetaTileEntity().add2by2Slots(builder);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusOutput.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusOutput.java
new file mode 100644
index 0000000000..1d4dbc8987
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Steam_BusOutput.java
@@ -0,0 +1,215 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.ITEM_OUT_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.render.TextureFactory;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_Hatch_Steam_BusOutput extends GT_MetaTileEntity_Hatch {
+
+ public GT_MetaTileEntity_Hatch_Steam_BusOutput(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 4,
+ new String[] { "Item Output for Steam Multiblocks", "Does not automatically export items",
+ "Capacity: 4 stacks", "Does not work with non-steam multiblocks", CORE.GT_Tooltip.get() });
+ }
+
+ public GT_MetaTileEntity_Hatch_Steam_BusOutput(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Steam_BusOutput(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(ITEM_OUT_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(ITEM_OUT_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Steam_BusOutput(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[14][17][];
+ for (byte c = -1; c < 16; c++) {
+ if (rTextures[0][c + 1] == null) rTextures[0][c + 1] = getSideFacingActive(c);
+ if (rTextures[1][c + 1] == null) rTextures[1][c + 1] = getSideFacingInactive(c);
+ if (rTextures[2][c + 1] == null) rTextures[2][c + 1] = getFrontFacingActive(c);
+ if (rTextures[3][c + 1] == null) rTextures[3][c + 1] = getFrontFacingInactive(c);
+ if (rTextures[4][c + 1] == null) rTextures[4][c + 1] = getTopFacingActive(c);
+ if (rTextures[5][c + 1] == null) rTextures[5][c + 1] = getTopFacingInactive(c);
+ if (rTextures[6][c + 1] == null) rTextures[6][c + 1] = getBottomFacingActive(c);
+ if (rTextures[7][c + 1] == null) rTextures[7][c + 1] = getBottomFacingInactive(c);
+ if (rTextures[8][c + 1] == null) rTextures[8][c + 1] = getBottomFacingPipeActive(c);
+ if (rTextures[9][c + 1] == null) rTextures[9][c + 1] = getBottomFacingPipeInactive(c);
+ if (rTextures[10][c + 1] == null) rTextures[10][c + 1] = getTopFacingPipeActive(c);
+ if (rTextures[11][c + 1] == null) rTextures[11][c + 1] = getTopFacingPipeInactive(c);
+ if (rTextures[12][c + 1] == null) rTextures[12][c + 1] = getSideFacingPipeActive(c);
+ if (rTextures[13][c + 1] == null) rTextures[13][c + 1] = getSideFacingPipeInactive(c);
+ }
+ return rTextures;
+ }
+
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE) };
+ }
+
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP) };
+ }
+
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP) };
+ }
+
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM) };
+ }
+
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM) };
+ }
+
+ public ITexture[] getBottomFacingPipeActive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getBottomFacingPipeInactive(byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM : Textures.BlockIcons.MACHINE_BRONZE_BOTTOM),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getTopFacingPipeActive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getTopFacingPipeInactive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP : Textures.BlockIcons.MACHINE_BRONZE_TOP),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getSideFacingPipeActive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getSideFacingPipeInactive(byte aColor) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ mTier == 1 ? Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE : Textures.BlockIcons.MACHINE_BRONZE_SIDE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ getBaseMetaTileEntity().add2by2Slots(builder);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Turbine.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Turbine.java
new file mode 100644
index 0000000000..ed3101f309
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Turbine.java
@@ -0,0 +1,435 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE5;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GregtechMetaTileEntity_LargerTurbineBase;
+
+@SuppressWarnings("deprecation")
+public class GT_MetaTileEntity_Hatch_Turbine extends GT_MetaTileEntity_Hatch {
+
+ public boolean mHasController = false;
+ public boolean mUsingAnimation = true;
+ private String mControllerLocation;
+ public int mEUt = 0;
+
+ public GT_MetaTileEntity_Hatch_Turbine(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, 16, "Turbine Rotor holder for XL Turbines");
+ }
+
+ public GT_MetaTileEntity_Hatch_Turbine(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Turbine(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription[0], aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Right Click with a soldering iron to reset controller link",
+ "Right Click with a wrench to remove turbine",
+ "Right Click with a screwdriver for technical information",
+ "Sneak + Right Click with a wrench to rotate",
+ "Sneak + Right Click with a screwdriver to disable animations",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, getFrontFacingTurbineTexture() };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, getFrontFacingTurbineTexture() };
+ }
+
+ public int getEU() {
+ return this.mEUt;
+ }
+
+ public void setEU(int aEU) {
+ this.mEUt = aEU;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return facing.offsetY == 0;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ public boolean hasTurbine() {
+ ItemStack aStack = this.mInventory[0];
+ boolean aIsValid = GregtechMetaTileEntity_LargerTurbineBase.isValidTurbine(aStack);
+ return aIsValid;
+ }
+
+ public ItemStack getTurbine() {
+ if (hasTurbine()) {
+ return this.mInventory[0];
+ }
+ return null;
+ }
+
+ public boolean canWork() {
+ return hasTurbine();
+ }
+
+ public boolean insertTurbine(ItemStack aTurbine) {
+ if (GregtechMetaTileEntity_LargerTurbineBase.isValidTurbine(aTurbine)) {
+ this.mInventory[0] = aTurbine;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Turbine(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+
+ public void damageTurbine(int aEUt, int damageFactorLow, float damageFactorHigh) {
+ damageTurbine((long) aEUt, damageFactorLow, damageFactorHigh);
+ }
+
+ public void damageTurbine(long aEUt, int damageFactorLow, float damageFactorHigh) {
+ if (hasTurbine() && MathUtils.randInt(0, 1) == 0) {
+ ItemStack aTurbine = getTurbine();
+ ((GT_MetaGenerated_Tool) aTurbine.getItem()).doDamage(
+ aTurbine,
+ (long) getDamageToComponent(aTurbine)
+ * (long) Math.min((float) aEUt / (float) damageFactorLow, Math.pow(aEUt, damageFactorHigh)));
+ }
+ }
+
+ private int getDamageToComponent(ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mHasController", mHasController);
+ aNBT.setBoolean("mUsingAnimation", mUsingAnimation);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mHasController = aNBT.getBoolean("mHasController");
+ mUsingAnimation = aNBT.getBoolean("mUsingAnimation");
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (this.mHasController) {
+ if (aTick % 20 == 0) {
+ if (isControllerActive()) {
+ this.getBaseMetaTileEntity()
+ .setActive(true);
+ } else {
+ this.getBaseMetaTileEntity()
+ .setActive(false);
+ }
+ }
+ } else if (!this.mHasController && this.mControllerLocation != null) {
+ // Weird Invalid State
+ if (setController(BlockPos.generateBlockPos(mControllerLocation))) {
+ // Valid
+ }
+ } else {
+ // No Controller
+ }
+ if (this.mInventory[0] != null && this.mInventory[0].stackSize <= 0) this.mInventory[0] = null;
+ }
+
+ public boolean isControllerActive() {
+ GregtechMetaTileEntity_LargerTurbineBase x = getController();
+ if (x != null) {
+ // Logger.INFO("Checking Status of Controller. Running? "+(x.mEUt > 0));
+ return x.lEUt > 0;
+ }
+ // Logger.INFO("Status of Controller failed, controller is null.");
+ return false;
+ }
+
+ public GregtechMetaTileEntity_LargerTurbineBase getController() {
+ if (this.mHasController && this.mControllerLocation != null && this.mControllerLocation.length() > 0) {
+ BlockPos p = BlockPos.generateBlockPos(mControllerLocation);
+ if (p != null) {
+ // Logger.INFO(p.getLocationString());
+ IGregTechTileEntity tTileEntity = getBaseMetaTileEntity()
+ .getIGregTechTileEntity(p.xPos, p.yPos, p.zPos);
+ if (tTileEntity != null
+ && tTileEntity.getMetaTileEntity() instanceof GregtechMetaTileEntity_LargerTurbineBase) {
+ return (GregtechMetaTileEntity_LargerTurbineBase) tTileEntity.getMetaTileEntity();
+ } else {
+ if (tTileEntity == null) {
+ Logger.INFO("Controller MTE is null, somehow?");
+ } else {
+ Logger.INFO("Controller is a different MTE to expected");
+ }
+ }
+ }
+ }
+ // Logger.INFO("Failed to Get Controller.");
+ return null;
+ }
+
+ public boolean canSetNewController() {
+ if ((mControllerLocation != null && mControllerLocation.length() > 0) || this.mHasController) {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean setController(BlockPos aPos) {
+ clearController();
+ if (canSetNewController()) {
+ mControllerLocation = aPos.getUniqueIdentifier();
+ mHasController = true;
+ Logger.INFO("Successfully injected controller into this Turbine Assembly Hatch.");
+ }
+ return mHasController;
+ }
+
+ public void clearController() {
+ this.mControllerLocation = null;
+ this.mHasController = false;
+ }
+
+ public boolean usingAnimations() {
+ return mUsingAnimation;
+ }
+
+ private ITexture getFrontFacingTurbineTexture() {
+ if (!mHasController) {
+ return this.getBaseMetaTileEntity()
+ .isActive() ? new GT_RenderedTexture(LARGETURBINE_ST_ACTIVE5)
+ : new GT_RenderedTexture(LARGETURBINE_ST5);
+ } else {
+ if (usingAnimations()) {
+ if (isControllerActive()) {
+ return getController().frontFaceActive;
+ }
+ }
+ return getController().frontFace;
+ }
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public boolean isItemValidForSlot(int aIndex, ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(int ordinalSide) {
+ return new int[] {};
+ }
+
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ return false;
+ }
+
+ public void setActive(boolean b) {
+ this.getBaseMetaTileEntity()
+ .setActive(b);
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (!aPlayer.isSneaking()) {
+ PlayerUtils.messagePlayer(aPlayer, "Using Animations? " + usingAnimations());
+ PlayerUtils.messagePlayer(aPlayer, "Has Controller? " + this.mHasController);
+ if (mHasController) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Controller Location: " + BlockPos.generateBlockPos(mControllerLocation)
+ .getLocationString());
+ PlayerUtils.messagePlayer(aPlayer, "Controller Active? " + this.isControllerActive());
+ }
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Active? " + this.getBaseMetaTileEntity()
+ .isActive());
+ PlayerUtils.messagePlayer(aPlayer, "Has Turbine inserted? " + this.hasTurbine());
+ if (this.hasTurbine()) {
+ Materials aMat = GT_MetaGenerated_Tool.getPrimaryMaterial(getTurbine());
+ String aSize = GregtechMetaTileEntity_LargerTurbineBase
+ .getTurbineSizeString(GregtechMetaTileEntity_LargerTurbineBase.getTurbineSize(getTurbine()));
+ PlayerUtils.messagePlayer(aPlayer, "Using: " + aMat.mLocalizedName + " " + aSize);
+ }
+ } else {
+ this.mUsingAnimation = !mUsingAnimation;
+ if (this.mUsingAnimation) {
+ PlayerUtils.messagePlayer(aPlayer, "Using Animated Turbine Texture.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Using Static Turbine Texture.");
+ }
+ }
+ }
+
+ @Override
+ public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, float aX,
+ float aY, float aZ) {
+ if (this.getBaseMetaTileEntity()
+ .isServerSide() && !aPlayer.isSneaking()) {
+ ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
+ if (tCurrentItem != null) {
+ if (tCurrentItem.getItem() instanceof GT_MetaGenerated_Tool) {
+ return onToolClick(tCurrentItem, aPlayer, wrenchingSide);
+ }
+ }
+ }
+ return super.onWrenchRightClick(side, wrenchingSide, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
+ if (tCurrentItem != null) {
+ if (tCurrentItem.getItem() instanceof GT_MetaGenerated_Tool) {
+ return onToolClick(tCurrentItem, aPlayer, wrenchingSide);
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean onToolClick(ItemStack tCurrentItem, EntityPlayer aPlayer, ForgeDirection side) {
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList)) {
+ boolean aHasTurbine = this.hasTurbine();
+ if (aPlayer.inventory.getFirstEmptyStack() >= 0 && aHasTurbine) {
+ if (PlayerUtils.isCreative(aPlayer)
+ || GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
+ aPlayer.inventory.addItemStackToInventory((this.getTurbine()));
+ this.mInventory[0] = null;
+ GT_Utility.sendChatToPlayer(aPlayer, "Removed turbine with wrench.");
+ return true;
+ }
+ } else {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ aHasTurbine ? "Cannot remove turbine, no free inventory space." : "No turbine to remove.");
+ }
+ } else if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList)) {
+ if (mControllerLocation != null && mControllerLocation.length() > 0) {
+ if (setController(BlockPos.generateBlockPos(mControllerLocation))) {
+ if (PlayerUtils.isCreative(aPlayer)
+ || GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
+ String tChat = "Trying to Reset linked Controller";
+ IGregTechTileEntity g = this.getBaseMetaTileEntity();
+ GT_Utility.sendChatToPlayer(aPlayer, tChat);
+ GT_Utility.sendSoundToPlayers(
+ g.getWorld(),
+ SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE,
+ 1.0F,
+ -1,
+ g.getXCoord(),
+ g.getYCoord(),
+ g.getZCoord());
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new SlotWidget(inventoryHandler, 0).setFilter(GregtechMetaTileEntity_LargerTurbineBase::isValidTurbine)
+ .setAccess(false, true)
+ .setPos(79, 34));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_TurbineProvider.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_TurbineProvider.java
new file mode 100644
index 0000000000..e9626a310c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_TurbineProvider.java
@@ -0,0 +1,221 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GregtechMetaTileEntity_LargerTurbineBase;
+
+public class GT_MetaTileEntity_Hatch_TurbineProvider extends GT_MetaTileEntity_Hatch_InputBus {
+
+ public GT_MetaTileEntity_Hatch_TurbineProvider(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_TurbineProvider(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_TurbineProvider(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { "An automation port for Large Turbines",
+ "Will attempt once per 1200 ticks to fill the turbine slot of it's parent turbine",
+ "You may adjust this with a screwdriver", "Hold shift to adjust in finer amounts",
+ "Hold control to adjust direction", "Left Click with Screwdriver to reset",
+ "This module assumes the entire turbine is in the same Chunk", CORE.GT_Tooltip.get() };
+ }
+
+ private GT_MetaTileEntity_LargeTurbine mParent = null;
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ if (aTimer % mRefreshTime == 0 && this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ tryRefillTurbine();
+ }
+ }
+
+ private void tryFindParentTurbine() {
+ Logger.INFO("This turbine housing has no parent, searching world.");
+ IGregTechTileEntity T = this.getBaseMetaTileEntity();
+ World W = T.getWorld();
+ Chunk C = W.getChunkFromBlockCoords(T.getXCoord(), T.getZCoord());
+ for (Object o : C.chunkTileEntityMap.values()) {
+ if (o instanceof IGregTechTileEntity G) {
+ final IMetaTileEntity aMetaTileEntity = G.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ continue;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_LargeTurbine aTurb) {
+ for (GT_MetaTileEntity_Hatch_InputBus ee : aTurb.mInputBusses) {
+ if (ee.equals(this)) {
+ mParent = aTurb;
+ Logger.INFO("Found a Parent to attach to this housing.");
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void tryRefillTurbine() {
+ if (mParent == null) {
+ tryFindParentTurbine();
+ }
+ if (mParent != null && mParent.mInventory[1] == null) {
+ for (ItemStack aStack : this.mInventory) {
+ if (isItemStackTurbine(aStack)) {
+ setGUIItemStack(aStack);
+ }
+ }
+ }
+ }
+
+ protected boolean setGUIItemStack(ItemStack aNewGuiSlotContents) {
+ boolean result = false;
+ if (mParent.mInventory[1] == null) {
+ mParent.mInventory[1] = aNewGuiSlotContents != null ? aNewGuiSlotContents.copy() : null;
+ mParent.depleteInput(aNewGuiSlotContents);
+ mParent.updateSlots();
+ this.updateSlots();
+ result = true;
+ }
+ return result;
+ }
+
+ public boolean isItemStackTurbine(ItemStack aStack) {
+ if (aStack.getItem() instanceof GT_MetaGenerated_Tool) {
+ if (aStack.getItemDamage() >= 170 && aStack.getItemDamage() <= 176) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isItemStackScrewdriver(ItemStack aStack) {
+ if (aStack.getItem() instanceof GT_MetaGenerated_Tool) {
+ if (aStack.getItemDamage() == 22 || aStack.getItemDamage() == 150) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return isItemStackTurbine(aStack);
+ }
+
+ private int mRefreshTime = 1200;
+ private boolean mDescending = true;
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mRefreshTime", mRefreshTime);
+ aNBT.setBoolean("mDescending", mDescending);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mRefreshTime = aNBT.getInteger("mRefreshTime");
+ mDescending = aNBT.getBoolean("mDescending");
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer != null) {
+ if (KeyboardUtils.isCtrlKeyDown()) {
+ mDescending = !mDescending;
+ PlayerUtils.messagePlayer(aPlayer, "Direction: " + (mDescending ? "DOWN" : "UP"));
+ } else {
+ int aAmount = 0;
+ if (KeyboardUtils.isShiftKeyDown()) {
+ aAmount = 10;
+ } else {
+ aAmount = 100;
+ }
+ if (mDescending) {
+ mRefreshTime -= aAmount;
+ if (mRefreshTime < 0) {
+ mRefreshTime = 1200;
+ }
+ } else {
+ mRefreshTime += aAmount;
+ if (mRefreshTime > 1200) {
+ mRefreshTime = 0;
+ }
+ }
+ PlayerUtils.messagePlayer(aPlayer, "Set check time to be every " + mRefreshTime + " ticks.");
+ }
+ }
+ }
+
+ @Override
+ public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ boolean aDidScrewdriver = false;
+ if (aPlayer != null) {
+ if (aPlayer.getHeldItem() != null) {
+ if (isItemStackScrewdriver(aPlayer.getHeldItem())) {
+ aDidScrewdriver = true;
+ mRefreshTime = 1200;
+ PlayerUtils.messagePlayer(aPlayer, "Reset check time to " + mRefreshTime + " ticks.");
+ }
+ }
+ }
+ if (!aDidScrewdriver) {
+ super.onLeftclick(aBaseMetaTileEntity, aPlayer);
+ }
+ }
+
+ @Override
+ public boolean allowSelectCircuit() {
+ return false;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new SlotWidget(inventoryHandler, 0).setFilter(GregtechMetaTileEntity_LargerTurbineBase::isValidTurbine)
+ .setAccess(false, true)
+ .setPos(79, 34));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Input.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Input.java
new file mode 100644
index 0000000000..5794e6adf8
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Input.java
@@ -0,0 +1,65 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.Scrollable;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_SuperBus_Input extends GT_MetaTileEntity_Hatch_InputBus {
+
+ public GT_MetaTileEntity_SuperBus_Input(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, getSlots(aTier) + 1);
+ }
+
+ public GT_MetaTileEntity_SuperBus_Input(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, getSlots(aTier) + 1, aDescription, aTextures);
+ }
+
+ /**
+ * Returns a factor of 16 based on tier.
+ *
+ * @param aTier The tier of this bus.
+ * @return (1 + aTier) * 16
+ */
+ public static int getSlots(int aTier) {
+ return (1 + aTier) * 16;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_SuperBus_Input(this.mName, this.mTier, mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { "Item Input for Multiblocks", "" + getSlots(this.mTier) + " Slots",
+ CORE.GT_Tooltip.get() };
+ }
+
+ @Override
+ public int getCircuitSlot() {
+ return getSlots(mTier);
+ }
+
+ @Override
+ public void addUIWidgets(Builder builder, UIBuildContext buildContext) {
+ final Scrollable scrollable = new Scrollable().setVerticalScroll();
+ for (int row = 0; row * 4 < inventoryHandler.getSlots() - 1; row++) {
+ int columnsToMake = Math.min(inventoryHandler.getSlots() - row * 4, 4);
+ for (int column = 0; column < columnsToMake; column++) {
+ scrollable.widget(
+ new SlotWidget(inventoryHandler, row * 4 + column).setPos(column * 18, row * 18)
+ .setSize(18, 18));
+ }
+ }
+ builder.widget(
+ scrollable.setSize(18 * 4 + 4, 18 * 4)
+ .setPos(52, 7));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Output.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Output.java
new file mode 100644
index 0000000000..aee6235ab9
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SuperBus_Output.java
@@ -0,0 +1,105 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.inventory.IInventory;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.Scrollable;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_SuperBus_Output extends GT_MetaTileEntity_Hatch_OutputBus {
+
+ public GT_MetaTileEntity_SuperBus_Output(int id, String name, String nameRegional, int tier) {
+ super(id, name, nameRegional, tier, getSlots(tier));
+ }
+
+ public GT_MetaTileEntity_SuperBus_Output(String name, int tier, String[] description, ITexture[][][] textures) {
+ super(name, tier, getSlots(tier), description, textures);
+ }
+
+ /**
+ * Returns a factor of 16 based on tier.
+ *
+ * @param aTier The tier of this bus.
+ * @return (1 + aTier) * 16
+ */
+ public static int getSlots(int aTier) {
+ return (1 + aTier) * 16;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_SuperBus_Output(this.mName, this.mTier, mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ this.fillStacksIntoFirstSlots();
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ }
+
+ public void updateSlots() {
+ for (int i = 0; i < this.mInventory.length; ++i) {
+ if (this.mInventory[i] != null && this.mInventory[i].stackSize <= 0) {
+ this.mInventory[i] = null;
+ }
+ }
+ this.fillStacksIntoFirstSlots();
+ }
+
+ protected void fillStacksIntoFirstSlots() {
+ for (int i = 0; i < this.mInventory.length; ++i) {
+ for (int j = i + 1; j < this.mInventory.length; ++j) {
+ if (this.mInventory[j] != null && (this.mInventory[i] == null
+ || GT_Utility.areStacksEqual(this.mInventory[i], this.mInventory[j]))) {
+ GT_Utility.moveStackFromSlotAToSlotB(
+ (IInventory) this.getBaseMetaTileEntity(),
+ (IInventory) this.getBaseMetaTileEntity(),
+ j,
+ i,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ }
+ }
+ }
+ }
+
+ @Override
+ public String[] getDescription() {
+ String[] aDesc = new String[] { "Item Output for Multiblocks", "" + getSlots(this.mTier) + " Slots",
+ CORE.GT_Tooltip.get() };
+ return aDesc;
+ }
+
+ @Override
+ public void addUIWidgets(Builder builder, UIBuildContext buildContext) {
+ final Scrollable scrollable = new Scrollable().setVerticalScroll();
+ for (int row = 0; row * 4 < inventoryHandler.getSlots() - 1; row++) {
+ int columnsToMake = Math.min(inventoryHandler.getSlots() - row * 4, 4);
+ for (int column = 0; column < columnsToMake; column++) {
+ scrollable.widget(
+ new SlotWidget(inventoryHandler, row * 4 + column).setPos(column * 18, row * 18)
+ .setSize(18, 18));
+ }
+ }
+ builder.widget(
+ scrollable.setSize(18 * 4 + 4, 18 * 4)
+ .setPos(52, 7));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntityFluid.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntityFluid.java
new file mode 100644
index 0000000000..e9f9a2dda4
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntityFluid.java
@@ -0,0 +1,117 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid;
+import gregtech.api.render.TextureFactory;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+
+public class GregtechMetaPipeEntityFluid extends GT_MetaPipeEntity_Fluid {
+
+ public final GT_Materials mMaterial;
+
+ public GregtechMetaPipeEntityFluid(int aID, String aName, String aNameRegional, float aThickNess,
+ GT_Materials aMaterial, int aCapacity, int aHeatResistance, boolean aGasProof) {
+ this(aID, aName, aNameRegional, aThickNess, aMaterial, aCapacity, aHeatResistance, aGasProof, 1);
+ }
+
+ public GregtechMetaPipeEntityFluid(final String aName, final float aThickNess, final GT_Materials aMaterial,
+ final int aCapacity, final int aHeatResistance, final boolean aGasProof) {
+ this(aName, aThickNess, aMaterial, aCapacity, aHeatResistance, aGasProof, 1);
+ }
+
+ public GregtechMetaPipeEntityFluid(int aID, String aName, String aNameRegional, float aThickNess,
+ GT_Materials aMaterial, int aCapacity, int aHeatResistance, boolean aGasProof, int aFluidTypes) {
+ super(aID, aName, aNameRegional, aThickNess, null, aCapacity, aHeatResistance, aGasProof, aFluidTypes);
+ this.mLastReceivedFrom = 0;
+ this.oLastReceivedFrom = 0;
+ this.mMaterial = aMaterial;
+ }
+
+ public GregtechMetaPipeEntityFluid(String aName, float aThickNess, GT_Materials aMaterial, int aCapacity,
+ int aHeatResistance, boolean aGasProof, int aFluidTypes) {
+ super(aName, aThickNess, null, aCapacity, aHeatResistance, aGasProof, aFluidTypes);
+ this.mLastReceivedFrom = 0;
+ this.oLastReceivedFrom = 0;
+ this.mMaterial = aMaterial;
+ }
+
+ @Override
+ public byte getTileEntityBaseType() {
+ return this.mMaterial == null ? 4
+ : (byte) ((this.mMaterial.contains(SubTag.WOOD) ? 12 : 4)
+ + Math.max(0, Math.min(3, this.mMaterial.mToolQuality)));
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaPipeEntityFluid(
+ this.mName,
+ this.mThickNess,
+ this.mMaterial,
+ this.mCapacity,
+ this.mHeatResistance,
+ this.mGasProof);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections,
+ int aColorIndex, boolean aConnected, boolean aRedstone) {
+ float tThickNess = getThickNess();
+ if (mDisableInput == 0)
+ return new ITexture[] { aConnected ? getBaseTexture(tThickNess, mPipeAmount, mMaterial, aColorIndex)
+ : TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) };
+ int tMask = 0;
+ int[][] sRestrictionArray = { { 2, 3, 5, 4 }, { 2, 3, 5, 4 }, { 1, 0, 5, 4 }, { 1, 0, 4, 5 }, { 1, 0, 2, 3 },
+ { 1, 0, 2, 3 } };
+ if (side != ForgeDirection.UNKNOWN) {
+ for (int i = 0; i < 4; i++)
+ if (isInputDisabledAtSide(ForgeDirection.getOrientation(sRestrictionArray[side.ordinal()][i])))
+ tMask |= 1 << i;
+ // Full block size renderer flips side 5 and 2 textures, flip restrictor textures to compensate
+ if (side == ForgeDirection.EAST || side == ForgeDirection.UP)
+ if (tMask > 3 && tMask < 12) tMask = (tMask ^ 12);
+ }
+ return new ITexture[] { aConnected ? getBaseTexture(tThickNess, mPipeAmount, mMaterial, aColorIndex)
+ : TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)),
+ getRestrictorTexture(tMask) };
+ }
+
+ protected static ITexture getBaseTexture(float aThickNess, int aPipeAmount, GT_Materials aMaterial,
+ int aColorIndex) {
+ if (aPipeAmount >= 9) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeNonuple.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ if (aPipeAmount >= 4) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeQuadruple.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.124F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.374F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeTiny.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.499F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeSmall.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.749F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeMedium.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.874F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeLarge.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeHuge.mTextureIndex],
+ Dyes.getModulation(aColorIndex, aMaterial.mRGBa));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntity_Cable.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntity_Cable.java
new file mode 100644
index 0000000000..9b1408ba51
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaPipeEntity_Cable.java
@@ -0,0 +1,156 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntityCable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+
+public class GregtechMetaPipeEntity_Cable extends GT_MetaPipeEntity_Cable implements IMetaTileEntityCable {
+
+ private static Textures.BlockIcons INSULATION_MEDIUM_PLUS;
+
+ static {
+ try {
+ INSULATION_MEDIUM_PLUS = (Textures.BlockIcons) GT_Utility
+ .getField(Textures.BlockIcons.class, "INSULATION_MEDIUM_PLUS")
+ .get(null);
+ } catch (IllegalAccessException | NullPointerException e) {
+ throw new Error(e);
+ }
+ }
+
+ private short[] vRGB = null;
+
+ public GregtechMetaPipeEntity_Cable(final int aID, final String aName, final String aNameRegional,
+ final float aThickNess, final Materials aMaterial, final long aCableLossPerMeter, final long aAmperage,
+ final long aVoltage, final boolean aInsulated, final boolean aCanShock, final short[] aRGB) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aThickNess,
+ aMaterial,
+ aCableLossPerMeter,
+ aAmperage,
+ aVoltage,
+ aInsulated,
+ aCanShock);
+ this.vRGB = aRGB == null || aRGB.length != 4 ? Materials.Iron.mRGBa : aRGB;
+ }
+
+ public GregtechMetaPipeEntity_Cable(final String aName, final float aThickNess, final Materials aMaterial,
+ final long aCableLossPerMeter, final long aAmperage, final long aVoltage, final boolean aInsulated,
+ final boolean aCanShock, final short[] aRGB) {
+ super(aName, aThickNess, aMaterial, aCableLossPerMeter, aAmperage, aVoltage, aInsulated, aCanShock);
+ this.vRGB = aRGB == null || aRGB.length != 4 ? Materials.Iron.mRGBa : aRGB;
+ }
+
+ public GregtechMetaPipeEntity_Cable(final int aID, final String aName, final String aNameRegional,
+ final float aThickNess, final long aCableLossPerMeter, final long aAmperage, final long aVoltage,
+ final boolean aInsulated, final boolean aCanShock, final short[] aRGB) {
+ this(
+ aID,
+ aName,
+ aNameRegional,
+ aThickNess,
+ null,
+ aCableLossPerMeter,
+ aAmperage,
+ aVoltage,
+ aInsulated,
+ aCanShock,
+ aRGB);
+ }
+
+ public GregtechMetaPipeEntity_Cable(final String aName, final float aThickNess, final long aCableLossPerMeter,
+ final long aAmperage, final long aVoltage, final boolean aInsulated, final boolean aCanShock,
+ final short[] aRGB) {
+ this(aName, aThickNess, null, aCableLossPerMeter, aAmperage, aVoltage, aInsulated, aCanShock, aRGB);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaPipeEntity_Cable(
+ this.mName,
+ this.mThickNess,
+ this.mMaterial,
+ this.mCableLossPerMeter,
+ this.mAmperage,
+ this.mVoltage,
+ this.mInsulated,
+ this.mCanShock,
+ this.vRGB);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections,
+ int aColorIndex, boolean aConnected, boolean aRedstone) {
+ return getTextureGTNH(aBaseMetaTileEntity, side, aConnections, aColorIndex, aConnected, aRedstone);
+ }
+
+ private ITexture[] getTextureGTNH(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection aSide, int aConnections,
+ int aColorIndex, boolean aConnected, boolean aRedstone) {
+
+ Materials wireMaterial = mMaterial;
+ if (wireMaterial == null) {
+ wireMaterial = Materials.Iron;
+ }
+
+ if (!mInsulated) return new ITexture[] { new GT_RenderedTexture(
+ wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire],
+ Dyes.getModulation(aColorIndex, vRGB)) };
+ if (aConnected) {
+ float tThickNess = getThickNess();
+ if (tThickNess < 0.124F) return new ITexture[] { new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_FULL,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.374F) // 0.375 x1
+ return new ITexture[] {
+ new GT_RenderedTexture(wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], vRGB),
+ new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_TINY,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.499F) // 0.500 x2
+ return new ITexture[] {
+ new GT_RenderedTexture(wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], vRGB),
+ new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_SMALL,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.624F) // 0.625 x4
+ return new ITexture[] {
+ new GT_RenderedTexture(wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], vRGB),
+ new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_MEDIUM,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.749F) // 0.750 x8
+ return new ITexture[] {
+ new GT_RenderedTexture(wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], vRGB),
+ new GT_RenderedTexture(
+ INSULATION_MEDIUM_PLUS,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.874F) // 0.825 x12
+ return new ITexture[] {
+ new GT_RenderedTexture(wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], vRGB),
+ new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_LARGE,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ return new ITexture[] {
+ new GT_RenderedTexture(wireMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], vRGB),
+ new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_HUGE,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ }
+ return new ITexture[] { new GT_RenderedTexture(
+ Textures.BlockIcons.INSULATION_FULL,
+ Dyes.getModulation(aColorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaTreeFarmerStructural.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaTreeFarmerStructural.java
new file mode 100644
index 0000000000..0aaaa75584
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/GregtechMetaTreeFarmerStructural.java
@@ -0,0 +1,49 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.machines.GregtechMetaTreeFarmerBase;
+
+public class GregtechMetaTreeFarmerStructural extends GregtechMetaTreeFarmerBase {
+
+ public GregtechMetaTreeFarmerStructural(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier, 0, "Structural Blocks for the Tree Farmer.");
+ }
+
+ public GregtechMetaTreeFarmerStructural(final String aName, final int aTier, final int aInvSlotCount,
+ final String[] aDescription, final ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTreeFarmerStructural(
+ this.mName,
+ this.mTier,
+ this.mInventory.length,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture getOverlayIcon() {
+ return new GT_RenderedTexture(Textures.BlockIcons.VOID);
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound paramNBTTagCompound) {}
+
+ @Override
+ public void loadNBTData(final NBTTagCompound paramNBTTagCompound) {}
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GT_MetaTileEntity_Hatch_CustomFluidBase.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GT_MetaTileEntity_Hatch_CustomFluidBase.java
new file mode 100644
index 0000000000..6a85c06c1b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GT_MetaTileEntity_Hatch_CustomFluidBase.java
@@ -0,0 +1,214 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base;
+
+import static gregtech.api.enums.Textures.BlockIcons.FLUID_IN_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
+
+import gregtech.GT_Mod;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public class GT_MetaTileEntity_Hatch_CustomFluidBase extends GT_MetaTileEntity_Hatch {
+
+ public final Fluid mLockedFluid;
+ public final int mFluidCapacity;
+ protected FluidStack mLockedStack = null;
+ protected String mTempMod = null;
+
+ public GT_MetaTileEntity_Hatch_CustomFluidBase(Fluid aFluid, int aAmount, final int aID, final String aName,
+ final String aNameRegional) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ 6,
+ 3,
+ new String[] { "Fluid Input for Multiblocks", "Capacity: " + GT_Utility.formatNumbers(aAmount) + "L" });
+ this.mLockedFluid = aFluid;
+ this.mFluidCapacity = aAmount;
+ }
+
+ public GT_MetaTileEntity_Hatch_CustomFluidBase(Fluid aFluid, int aAmount, final String aName,
+ final String[] aDescription, final ITexture[][][] aTextures) {
+ super(aName, 6, 3, aDescription[0], aTextures);
+ this.mLockedFluid = aFluid;
+ this.mFluidCapacity = aAmount;
+ }
+
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ if (side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 0) {
+ FluidStack fs = GT_Utility.getFluidForFilledItem(aStack, true);
+ return fs != null && fs.getFluid() == this.mLockedFluid;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 1;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(FLUID_IN_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(FLUID_IN_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ // return true;
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ public void updateSlots() {
+ if (mInventory[getInputSlot()] != null && mInventory[getInputSlot()].stackSize <= 0)
+ mInventory[getInputSlot()] = null;
+ }
+
+ @Override
+ public int getTankPressure() {
+ return -100;
+ }
+
+ @Override
+ public int getCapacity() {
+ return this.mFluidCapacity;
+ }
+
+ @Override
+ public String[] getDescription() {
+ if (mLockedStack == null) {
+ mLockedStack = FluidUtils.getFluidStack(mLockedFluid, 1);
+ }
+ int aFluidTemp = 0;
+ boolean isSteam = false;
+ if (mLockedFluid != null) {
+ aFluidTemp = mLockedFluid.getTemperature();
+ mTempMod = mLockedFluid.getName();
+ }
+ if (mTempMod.equalsIgnoreCase("steam")) {
+ isSteam = true;
+ }
+
+ EnumChatFormatting aColour = EnumChatFormatting.BLUE;
+ if (aFluidTemp <= -3000) {
+ aColour = EnumChatFormatting.DARK_PURPLE;
+ } else if (aFluidTemp >= -2999 && aFluidTemp <= -500) {
+ aColour = EnumChatFormatting.DARK_BLUE;
+ } else if (aFluidTemp >= -499 && aFluidTemp <= -50) {
+ aColour = EnumChatFormatting.BLUE;
+ } else if (aFluidTemp >= 30 && aFluidTemp <= 300) {
+ aColour = EnumChatFormatting.AQUA;
+ } else if (aFluidTemp >= 301 && aFluidTemp <= 800) {
+ aColour = EnumChatFormatting.YELLOW;
+ } else if (aFluidTemp >= 801 && aFluidTemp <= 1500) {
+ aColour = EnumChatFormatting.GOLD;
+ } else if (aFluidTemp >= 1501) {
+ aColour = EnumChatFormatting.RED;
+ }
+ String aFluidName = "Accepted Fluid: " + aColour
+ + (mLockedStack != null ? mLockedStack.getLocalizedName() : "Empty")
+ + EnumChatFormatting.RESET;
+ return new String[] { "Fluid Input for " + (isSteam ? "Steam " : "") + "Multiblocks",
+ "Capacity: " + getCapacity() + "L", aFluidName, CORE.GT_Tooltip.get() };
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(final FluidStack aFluid) {
+ return this.mLockedFluid.getName()
+ .equals(
+ aFluid.getFluid()
+ .getName());
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_CustomFluidBase(
+ this.mLockedFluid,
+ this.mFluidCapacity,
+ this.mName,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ protected FluidSlotWidget createFluidSlot() {
+ return super.createFluidSlot().setFilter(f -> f == mLockedFluid);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTileEntity.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTileEntity.java
new file mode 100644
index 0000000000..e260347ca5
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTileEntity.java
@@ -0,0 +1,74 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base;
+
+import static gregtech.api.enums.GT_Values.GT;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+public abstract class GregtechMetaTileEntity extends MetaTileEntity {
+
+ /**
+ * Value between [0 - 9] to describe the Tier of this Machine.
+ */
+ protected byte mTier;
+
+ /**
+ * A simple Description.
+ */
+ protected final String mDescription;
+
+ /**
+ * Contains all Textures used by this Block.
+ */
+ public final ITexture[][][] mTextures;
+
+ public GregtechMetaTileEntity(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final int aInvSlotCount, final String aDescription, final ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aInvSlotCount);
+ this.mTier = (byte) Math.max(0, Math.min(aTier, 9));
+ this.mDescription = aDescription;
+
+ // must always be the last call!
+ if (GT.isClientSide()) {
+ this.mTextures = this.getTextureSet(aTextures);
+ } else {
+ this.mTextures = null;
+ }
+ }
+
+ public GregtechMetaTileEntity(final String aName, final int aTier, final int aInvSlotCount,
+ final String aDescription, final ITexture[][][] aTextures) {
+ super(aName, aInvSlotCount);
+ this.mTier = (byte) aTier;
+ this.mDescription = aDescription;
+ this.mTextures = aTextures;
+ }
+
+ @Override
+ public byte getTileEntityBaseType() {
+ return (byte) (Math.min(3, this.mTier <= 0 ? 0 : 1 + ((this.mTier - 1) / 4)));
+ }
+
+ @Override
+ public long getInputTier() {
+ return this.mTier;
+ }
+
+ @Override
+ public long getOutputTier() {
+ return this.mTier;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { this.mDescription };
+ }
+
+ /**
+ * Used Client Side to get a Texture Set for this Block. Called after setting the Tier and the Description so that
+ * those two are accessible.
+ *
+ * @param aTextures is the optional Array you can give to the Constructor.
+ */
+ public abstract ITexture[][][] getTextureSet(ITexture[] aTextures);
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTransformerHiAmp.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTransformerHiAmp.java
new file mode 100644
index 0000000000..c6a088fb1c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMetaTransformerHiAmp.java
@@ -0,0 +1,117 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Transformer;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class GregtechMetaTransformerHiAmp extends GT_MetaTileEntity_Transformer {
+
+ private boolean mHalfMode = false;
+
+ public GregtechMetaTransformerHiAmp(int aID, String aName, String aNameRegional, int aTier, String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aDescription);
+ }
+
+ public GregtechMetaTransformerHiAmp(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public long maxEUStore() {
+ return ((512L + gregtech.api.enums.GT_Values.V[(this.mTier + 1)] * 2L) * 8);
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ if (this.mHalfMode) {
+ return ((getBaseMetaTileEntity().isAllowedToWork()) ? 8L : 2L);
+ }
+ return ((getBaseMetaTileEntity().isAllowedToWork()) ? 16L : 4L);
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ if (this.mHalfMode) {
+ return ((getBaseMetaTileEntity().isAllowedToWork()) ? 2L : 8L);
+ }
+ return ((getBaseMetaTileEntity().isAllowedToWork()) ? 4L : 16L);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[12][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] };
+ rTextures[1][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] };
+ rTextures[2][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] };
+ rTextures[3][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier + 1] };
+ rTextures[4][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier + 1] };
+ rTextures[5][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier + 1] };
+ rTextures[6][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] };
+ rTextures[7][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] };
+ rTextures[8][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] };
+ rTextures[9][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier + 1] };
+ rTextures[10][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier + 1] };
+ rTextures[11][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier + 1] };
+ }
+ return rTextures;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTransformerHiAmp(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Accepts 4A and outputs 16A",
+ "Toggle 2A/8A half-mode with Screwdriver",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setBoolean("mHalfMode", this.mHalfMode);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ this.mHalfMode = aNBT.getBoolean("mHalfMode");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ this.mHalfMode = !mHalfMode;
+ if (this.mHalfMode) {
+ PlayerUtils.messagePlayer(aPlayer, "Transformer is now running at 2A:8A in/out Ratio.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Transformer is now running at 4A:16A in/out Ratio.");
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_MultiBlockBase.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_MultiBlockBase.java
new file mode 100644
index 0000000000..e756a92343
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_MultiBlockBase.java
@@ -0,0 +1,1799 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base;
+
+import static gregtech.api.enums.Mods.TecTech;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.function.BiConsumer;
+import java.util.function.BiPredicate;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+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.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.IGT_HatchAdder;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gregtech.common.tileentities.machines.IDualInputHatch;
+import gtPlusPlus.GTplusplus;
+import gtPlusPlus.GTplusplus.INIT_PHASE;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.preloader.CORE_Preloader;
+import gtPlusPlus.preloader.asm.AsmConfig;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_AirIntake;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBattery;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBattery;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Steam_BusInput;
+
+// Glee8e - 11/12/21 - 2:15pm
+// Yeah, now I see what's wrong. Someone inherited from GregtechMeta_MultiBlockBase instead of
+// GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialDehydrator> as it should have been
+// so any method in GregtechMetaTileEntity_IndustrialDehydrator would see generic field declared in
+// GregtechMeta_MultiBlockBase without generic parameter
+
+public abstract class GregtechMeta_MultiBlockBase<T extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<T>>
+ extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<T> {
+
+ public static final boolean DEBUG_DISABLE_CORES_TEMPORARILY = true;
+
+ public GT_Recipe mLastRecipe;
+ protected long mTotalRunTime = 0;
+
+ /**
+ * Don't use this for recipe input check, otherwise you'll get duplicated fluids
+ */
+ public ArrayList<GT_MetaTileEntity_Hatch_AirIntake> mAirIntakes = new ArrayList<>();
+
+ public ArrayList<GT_MetaTileEntity_Hatch_InputBattery> mChargeHatches = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch_OutputBattery> mDischargeHatches = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch> mAllEnergyHatches = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch> mAllDynamoHatches = new ArrayList<>();
+
+ public GregtechMeta_MultiBlockBase(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMeta_MultiBlockBase(final String aName) {
+ super(aName);
+ }
+
+ private static int toStackCount(Entry<ItemStack, Integer> e) {
+ int tMaxStackSize = e.getKey()
+ .getMaxStackSize();
+ int tStackSize = e.getValue();
+ return (tStackSize + tMaxStackSize - 1) / tMaxStackSize;
+ }
+
+ public long getTotalRuntimeInTicks() {
+ return this.mTotalRunTime;
+ }
+
+ public abstract String getMachineType();
+
+ public String getMachineTooltip() {
+ return "Machine Type: " + EnumChatFormatting.YELLOW + getMachineType() + EnumChatFormatting.RESET;
+ }
+
+ public String[] getExtraInfoData() {
+ return new String[0];
+ }
+
+ @Override
+ public String[] getInfoData() {
+ ArrayList<String> mInfo = new ArrayList<>();
+ if (!this.getMetaName()
+ .equals("")) {
+ mInfo.add(this.getMetaName());
+ }
+
+ String[] extra = getExtraInfoData();
+
+ if (extra == null) {
+ extra = new String[0];
+ }
+ if (extra.length > 0) {
+ for (String s : extra) {
+ mInfo.add(s);
+ }
+ }
+
+ long seconds = (this.mTotalRunTime / 20);
+ int weeks = (int) (TimeUnit.SECONDS.toDays(seconds) / 7);
+ int days = (int) (TimeUnit.SECONDS.toDays(seconds) - 7 * weeks);
+ long hours = TimeUnit.SECONDS.toHours(seconds) - TimeUnit.DAYS.toHours(days)
+ - TimeUnit.DAYS.toHours(7L * weeks);
+ long minutes = TimeUnit.SECONDS.toMinutes(seconds) - (TimeUnit.SECONDS.toHours(seconds) * 60);
+ long second = TimeUnit.SECONDS.toSeconds(seconds) - (TimeUnit.SECONDS.toMinutes(seconds) * 60);
+
+ mInfo.add(getMachineTooltip());
+
+ // Lets borrow the GTNH handling
+
+ mInfo.add(
+ StatCollector.translateToLocal("GTPP.multiblock.progress") + ": "
+ + EnumChatFormatting.GREEN
+ + mProgresstime / 20
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + mMaxProgresstime / 20
+ + EnumChatFormatting.RESET
+ + " s");
+
+ if (!this.mAllEnergyHatches.isEmpty()) {
+ long storedEnergy = getStoredEnergyInAllEnergyHatches();
+ long maxEnergy = getMaxEnergyStorageOfAllEnergyHatches();
+ mInfo.add(StatCollector.translateToLocal("GTPP.multiblock.energy") + ":");
+ mInfo.add(
+ StatCollector.translateToLocal(
+ "" + EnumChatFormatting.GREEN
+ + Long.toString(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + Long.toString(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU"));
+
+ mInfo.add(StatCollector.translateToLocal("GTPP.multiblock.mei") + ":");
+ mInfo.add(
+ StatCollector.translateToLocal(
+ "" + EnumChatFormatting.YELLOW
+ + Long.toString(getMaxInputVoltage())
+ + EnumChatFormatting.RESET
+ + " EU/t(*2A) "
+ + StatCollector.translateToLocal("GTPP.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Values.VN[GT_Utility.getTier(getMaxInputVoltage())]
+ + EnumChatFormatting.RESET));;
+ }
+ if (!this.mAllDynamoHatches.isEmpty()) {
+ long storedEnergy = getStoredEnergyInAllDynamoHatches();
+ long maxEnergy = getMaxEnergyStorageOfAllDynamoHatches();
+ mInfo.add(StatCollector.translateToLocal("GTPP.multiblock.energy") + " In Dynamos:");
+ mInfo.add(
+ StatCollector.translateToLocal(
+ "" + EnumChatFormatting.GREEN
+ + Long.toString(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + Long.toString(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU"));
+ }
+
+ if (-lEUt > 0) {
+ mInfo.add(StatCollector.translateToLocal("GTPP.multiblock.usage") + ":");
+ mInfo.add(
+ StatCollector
+ .translateToLocal("" + EnumChatFormatting.RED + (-lEUt) + EnumChatFormatting.RESET + " EU/t"));
+ } else {
+ mInfo.add(StatCollector.translateToLocal("GTPP.multiblock.generation") + ":");
+ mInfo.add(
+ StatCollector
+ .translateToLocal("" + EnumChatFormatting.GREEN + lEUt + EnumChatFormatting.RESET + " EU/t"));
+ }
+
+ mInfo.add(
+ StatCollector.translateToLocal("GTPP.multiblock.problems") + ": "
+ + EnumChatFormatting.RED
+ + (getIdealStatus() - getRepairStatus())
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GTPP.multiblock.efficiency")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + Float.toString(mEfficiency / 100.0F)
+ + EnumChatFormatting.RESET
+ + " %");
+
+ if (this.getPollutionPerSecond(null) > 0) {
+ int mPollutionReduction = getPollutionReductionForAllMufflers();
+ mInfo.add(
+ StatCollector.translateToLocal("GTPP.multiblock.pollution") + ": "
+ + EnumChatFormatting.RED
+ + this.getPollutionPerSecond(null)
+ + EnumChatFormatting.RESET
+ + "/sec");
+ mInfo.add(
+ StatCollector.translateToLocal("GTPP.multiblock.pollutionreduced") + ": "
+ + EnumChatFormatting.GREEN
+ + mPollutionReduction
+ + EnumChatFormatting.RESET
+ + " %");
+ }
+
+ mInfo.add(
+ StatCollector.translateToLocal("GTPP.CC.parallel") + ": "
+ + EnumChatFormatting.GREEN
+ + (getMaxParallelRecipes())
+ + EnumChatFormatting.RESET);
+
+ mInfo.add(
+ "Total Time Since Built: " + EnumChatFormatting.DARK_GREEN
+ + Integer.toString(weeks)
+ + EnumChatFormatting.RESET
+ + " Weeks, "
+ + EnumChatFormatting.DARK_GREEN
+ + Integer.toString(days)
+ + EnumChatFormatting.RESET
+ + " Days, ");
+ mInfo.add(
+ EnumChatFormatting.DARK_GREEN + Long.toString(hours)
+ + EnumChatFormatting.RESET
+ + " Hours, "
+ + EnumChatFormatting.DARK_GREEN
+ + Long.toString(minutes)
+ + EnumChatFormatting.RESET
+ + " Minutes, "
+ + EnumChatFormatting.DARK_GREEN
+ + Long.toString(second)
+ + EnumChatFormatting.RESET
+ + " Seconds.");
+ mInfo.add("Total Time in ticks: " + EnumChatFormatting.DARK_GREEN + Long.toString(this.mTotalRunTime));
+
+ String[] mInfo2 = mInfo.toArray(new String[mInfo.size()]);
+ return mInfo2;
+ }
+
+ public int getPollutionReductionForAllMufflers() {
+ int mPollutionReduction = 0;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ mPollutionReduction = Math.max(calculatePollutionReductionForHatch(tHatch, 100), mPollutionReduction);
+ }
+ return mPollutionReduction;
+ }
+
+ public long getStoredEnergyInAllEnergyHatches() {
+ long storedEnergy = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mAllEnergyHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ }
+ return storedEnergy;
+ }
+
+ public long getMaxEnergyStorageOfAllEnergyHatches() {
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mAllEnergyHatches)) {
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+ return maxEnergy;
+ }
+
+ public long getStoredEnergyInAllDynamoHatches() {
+ long storedEnergy = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mAllDynamoHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ }
+ return storedEnergy;
+ }
+
+ public long getMaxEnergyStorageOfAllDynamoHatches() {
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mAllDynamoHatches)) {
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+ return maxEnergy;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ private String[] aCachedToolTip;
+
+ /*
+ * private final String aRequiresMuffler = "1x Muffler Hatch"; private final String aRequiresCoreModule =
+ * "1x Core Module"; private final String aRequiresMaint = "1x Maintanence Hatch";
+ */
+
+ public static final String TAG_HIDE_HATCHES = "TAG_HIDE_HATCHES";
+ public static final String TAG_HIDE_MAINT = "TAG_HIDE_MAINT";
+ public static final String TAG_HIDE_POLLUTION = "TAG_HIDE_POLLUTION";
+ public static final String TAG_HIDE_MACHINE_TYPE = "TAG_HIDE_MACHINE_TYPE";
+
+ public abstract int getMaxParallelRecipes();
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack paramItemStack) {
+ return true;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack paramItemStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack p0) {
+ return false;
+ }
+
+ /**
+ * A Static {@link Method} object which holds the current status of logging.
+ */
+ public static Method aLogger = null;
+
+ public void log(String s) {
+ if (!AsmConfig.disableAllLogging) {
+ if (CORE_Preloader.DEBUG_MODE) {
+ Logger.INFO(s);
+ } else {
+ Logger.MACHINE_INFO(s);
+ }
+ }
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(GT_Utility.roundUpVoltage(this.getMaxInputVoltage()));
+ logic.setAvailableAmperage(1L);
+ }
+
+ public long getMaxInputEnergy() {
+ long rEnergy = 0;
+ if (mEnergyHatches.size() == 1) // so it only takes 1 amp is only 1 hatch is present so it works like most gt
+ // multies
+ return mEnergyHatches.get(0)
+ .getBaseMetaTileEntity()
+ .getInputVoltage();
+ for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches))
+ rEnergy += tHatch.getBaseMetaTileEntity()
+ .getInputVoltage()
+ * tHatch.getBaseMetaTileEntity()
+ .getInputAmperage();
+ return rEnergy;
+ }
+
+ public boolean isMachineRunning() {
+ boolean aRunning = this.getBaseMetaTileEntity()
+ .isActive();
+ // log("Queried Multiblock is currently running: "+aRunning);
+ return aRunning;
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+
+ // Time Counter
+ if (aBaseMetaTileEntity.isServerSide()) {
+ this.mTotalRunTime++;
+ }
+
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (this.mUpdate == 1 || this.mStartUpCheck == 1) {
+ this.mChargeHatches.clear();
+ this.mDischargeHatches.clear();
+ this.mAirIntakes.clear();
+ this.mTecTechEnergyHatches.clear();
+ this.mTecTechDynamoHatches.clear();
+ this.mAllEnergyHatches.clear();
+ this.mAllDynamoHatches.clear();
+ }
+ }
+
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public void explodeMultiblock() {
+ MetaTileEntity tTileEntity;
+ for (final Iterator<GT_MetaTileEntity_Hatch_InputBattery> localIterator = this.mChargeHatches
+ .iterator(); localIterator.hasNext(); tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(gregtech.api.enums.GT_Values.V[8])) {
+ tTileEntity = localIterator.next();
+ }
+ tTileEntity = null;
+ for (final Iterator<GT_MetaTileEntity_Hatch_OutputBattery> localIterator = this.mDischargeHatches
+ .iterator(); localIterator.hasNext(); tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(gregtech.api.enums.GT_Values.V[8])) {
+ tTileEntity = localIterator.next();
+ }
+ tTileEntity = null;
+ for (final Iterator<GT_MetaTileEntity_Hatch> localIterator = this.mTecTechDynamoHatches
+ .iterator(); localIterator.hasNext(); tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(gregtech.api.enums.GT_Values.V[8])) {
+ tTileEntity = localIterator.next();
+ }
+ tTileEntity = null;
+ for (final Iterator<GT_MetaTileEntity_Hatch> localIterator = this.mTecTechEnergyHatches
+ .iterator(); localIterator.hasNext(); tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(gregtech.api.enums.GT_Values.V[8])) {
+ tTileEntity = localIterator.next();
+ }
+
+ super.explodeMultiblock();
+ }
+
+ protected boolean setGUIItemStack(ItemStack aNewGuiSlotContents) {
+ boolean result = false;
+ if (this.mInventory[1] == null) {
+ this.mInventory[1] = aNewGuiSlotContents != null ? aNewGuiSlotContents.copy() : null;
+ this.depleteInput(aNewGuiSlotContents);
+ this.updateSlots();
+ result = true;
+ }
+ return result;
+ }
+
+ public ItemStack findItemInInventory(Item aSearchStack) {
+ return findItemInInventory(aSearchStack, 0);
+ }
+
+ public ItemStack findItemInInventory(Item aSearchStack, int aMeta) {
+ return findItemInInventory(ItemUtils.simpleMetaStack(aSearchStack, aMeta, 1));
+ }
+
+ public ItemStack findItemInInventory(ItemStack aSearchStack) {
+ if (aSearchStack != null && this.mInputBusses.size() > 0) {
+ for (GT_MetaTileEntity_Hatch_InputBus bus : this.mInputBusses) {
+ if (bus != null) {
+ for (ItemStack uStack : bus.mInventory) {
+ if (uStack != null) {
+ if (aSearchStack.getClass()
+ .isInstance(uStack.getItem())) {
+ return uStack;
+ }
+ }
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Deplete fluid input from a set of restricted hatches. This assumes these hatches can store nothing else but your
+ * expected fluid
+ */
+ protected boolean depleteInputFromRestrictedHatches(Collection<GT_MetaTileEntity_Hatch_CustomFluidBase> aHatches,
+ int aAmount) {
+ for (final GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(aHatches)) {
+ FluidStack tLiquid = tHatch.getFluid();
+ if (tLiquid == null || tLiquid.amount < aAmount) {
+ continue;
+ }
+ tLiquid = tHatch.drain(aAmount, false);
+ if (tLiquid != null && tLiquid.amount >= aAmount) {
+ tLiquid = tHatch.drain(aAmount, true);
+ return tLiquid != null && tLiquid.amount >= aAmount;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void updateSlots() {
+ for (final GT_MetaTileEntity_Hatch_InputBattery tHatch : filterValidMTEs(this.mChargeHatches)) {
+ tHatch.updateSlots();
+ }
+ for (final GT_MetaTileEntity_Hatch_OutputBattery tHatch : filterValidMTEs(this.mDischargeHatches)) {
+ tHatch.updateSlots();
+ }
+ super.updateSlots();
+ }
+
+ /**
+ * Causes a Random Maint. Issue.
+ *
+ * @return {@link boolean} - Returns whether or not an issue was caused, should always be true.
+ */
+ public boolean causeMaintenanceIssue() {
+ boolean b = false;
+ switch (this.getBaseMetaTileEntity()
+ .getRandomNumber(6)) {
+ case 0 -> {
+ this.mWrench = false;
+ b = true;
+ }
+ case 1 -> {
+ this.mScrewdriver = false;
+ b = true;
+ }
+ case 2 -> {
+ this.mSoftHammer = false;
+ b = true;
+ }
+ case 3 -> {
+ this.mHardHammer = false;
+ b = true;
+ }
+ case 4 -> {
+ this.mSolderingTool = false;
+ b = true;
+ }
+ case 5 -> {
+ this.mCrowbar = false;
+ b = true;
+ }
+ }
+ return b;
+ }
+
+ public void fixAllMaintenanceIssue() {
+ this.mCrowbar = true;
+ this.mWrench = true;
+ this.mHardHammer = true;
+ this.mSoftHammer = true;
+ this.mSolderingTool = true;
+ this.mScrewdriver = true;
+ }
+
+ public boolean checkHatch() {
+ return mMaintenanceHatches.size() <= 1
+ && (this.getPollutionPerSecond(null) > 0 ? !mMufflerHatches.isEmpty() : true);
+ }
+
+ @Override
+ public void clearHatches() {
+ super.clearHatches();
+ this.mChargeHatches.clear();
+ this.mDischargeHatches.clear();
+ this.mAirIntakes.clear();
+ this.mTecTechEnergyHatches.clear();
+ this.mTecTechDynamoHatches.clear();
+ this.mAllEnergyHatches.clear();
+ this.mAllDynamoHatches.clear();
+ }
+
+ public <E> boolean addToMachineListInternal(ArrayList<E> aList, final IGregTechTileEntity aTileEntity,
+ final int aBaseCasingIndex) {
+ return addToMachineListInternal(aList, getMetaTileEntity(aTileEntity), aBaseCasingIndex);
+ }
+
+ public <E> boolean addToMachineListInternal(ArrayList<E> aList, final IMetaTileEntity aTileEntity,
+ final int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+
+ // Check type
+ /*
+ * Class <?> aHatchType = ReflectionUtils.getTypeOfGenericObject(aList); if
+ * (!aHatchType.isInstance(aTileEntity)) { return false; }
+ */
+
+ // Try setRecipeMap
+
+ try {
+ if (aTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ resetRecipeMapForHatch((GT_MetaTileEntity_Hatch) aTileEntity, getRecipeMap());
+ }
+ if (aTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) {
+ resetRecipeMapForHatch((GT_MetaTileEntity_Hatch) aTileEntity, getRecipeMap());
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+
+ if (aList.isEmpty()) {
+ if (aTileEntity instanceof GT_MetaTileEntity_Hatch) {
+ if (GTplusplus.CURRENT_LOAD_PHASE == INIT_PHASE.STARTED) {
+ log(
+ "Adding " + aTileEntity.getInventoryName()
+ + " at "
+ + new BlockPos(aTileEntity.getBaseMetaTileEntity()).getLocationString());
+ }
+ updateTexture(aTileEntity, aBaseCasingIndex);
+ return aList.add((E) aTileEntity);
+ }
+ } else {
+ IGregTechTileEntity aCur = aTileEntity.getBaseMetaTileEntity();
+ if (aList.contains(aTileEntity)) {
+ log(
+ "Found Duplicate " + aTileEntity.getInventoryName()
+ + " @ "
+ + new BlockPos(aCur).getLocationString());
+ return false;
+ }
+ BlockPos aCurPos = new BlockPos(aCur);
+ boolean aExists = false;
+ for (E m : aList) {
+ IGregTechTileEntity b = ((IMetaTileEntity) m).getBaseMetaTileEntity();
+ if (b != null) {
+ BlockPos aPos = new BlockPos(b);
+ if (aPos != null) {
+ if (aCurPos.equals(aPos)) {
+ if (GTplusplus.CURRENT_LOAD_PHASE == INIT_PHASE.STARTED) {
+ log("Found Duplicate " + b.getInventoryName() + " at " + aPos.getLocationString());
+ }
+ return false;
+ }
+ }
+ }
+ }
+ if (aTileEntity instanceof GT_MetaTileEntity_Hatch) {
+ if (GTplusplus.CURRENT_LOAD_PHASE == INIT_PHASE.STARTED) {
+ log("Adding " + aCur.getInventoryName() + " at " + aCurPos.getLocationString());
+ }
+ updateTexture(aTileEntity, aBaseCasingIndex);
+ return aList.add((E) aTileEntity);
+ }
+ }
+ return false;
+ }
+
+ private IMetaTileEntity getMetaTileEntity(final IGregTechTileEntity aTileEntity) {
+ if (aTileEntity == null) {
+ return null;
+ }
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ return aMetaTileEntity;
+ }
+
+ @Override
+ public boolean addToMachineList(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ return addToMachineList(getMetaTileEntity(aTileEntity), aBaseCasingIndex);
+ }
+
+ public boolean addToMachineList(final IMetaTileEntity aMetaTileEntity, final int aBaseCasingIndex) {
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+
+ // Use this to determine the correct value, then update the hatch texture after.
+ boolean aDidAdd = false;
+
+ // Handle Custom Hatches
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBattery) {
+ log("Found GT_MetaTileEntity_Hatch_InputBattery");
+ aDidAdd = addToMachineListInternal(mChargeHatches, aMetaTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBattery) {
+ log("Found GT_MetaTileEntity_Hatch_OutputBattery");
+ aDidAdd = addToMachineListInternal(mDischargeHatches, aMetaTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_AirIntake) {
+ aDidAdd = addToMachineListInternal(mAirIntakes, aMetaTileEntity, aBaseCasingIndex)
+ && addToMachineListInternal(mInputHatches, aMetaTileEntity, aBaseCasingIndex);
+ }
+
+ // Handle TT Multi-A Energy Hatches
+ else if (TecTech.isModLoaded() && isThisHatchMultiEnergy(aMetaTileEntity)) {
+ log("Found isThisHatchMultiEnergy");
+ aDidAdd = addToMachineListInternal(mTecTechEnergyHatches, aMetaTileEntity, aBaseCasingIndex);
+ updateMasterEnergyHatchList(aMetaTileEntity);
+ }
+
+ // Handle TT Multi-A Dynamos
+ else if (TecTech.isModLoaded() && isThisHatchMultiDynamo(aMetaTileEntity)) {
+ log("Found isThisHatchMultiDynamo");
+ aDidAdd = addToMachineListInternal(mTecTechDynamoHatches, aMetaTileEntity, aBaseCasingIndex);
+ updateMasterDynamoHatchList(aMetaTileEntity);
+ }
+
+ // Handle Fluid Hatches using seperate logic
+ else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input)
+ aDidAdd = addToMachineListInternal(mInputHatches, aMetaTileEntity, aBaseCasingIndex);
+ else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output)
+ aDidAdd = addToMachineListInternal(mOutputHatches, aMetaTileEntity, aBaseCasingIndex);
+
+ // Process Remaining hatches using Vanilla GT Logic
+ else if (aMetaTileEntity instanceof IDualInputHatch hatch) {
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ aDidAdd = addToMachineListInternal(mDualInputHatches, aMetaTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus)
+ aDidAdd = addToMachineListInternal(mInputBusses, aMetaTileEntity, aBaseCasingIndex);
+ else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus)
+ aDidAdd = addToMachineListInternal(mOutputBusses, aMetaTileEntity, aBaseCasingIndex);
+ else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy) {
+ aDidAdd = addToMachineListInternal(mEnergyHatches, aMetaTileEntity, aBaseCasingIndex);
+ updateMasterEnergyHatchList(aMetaTileEntity);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo) {
+ aDidAdd = addToMachineListInternal(mDynamoHatches, aMetaTileEntity, aBaseCasingIndex);
+ updateMasterDynamoHatchList(aMetaTileEntity);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance)
+ aDidAdd = addToMachineListInternal(mMaintenanceHatches, aMetaTileEntity, aBaseCasingIndex);
+ else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler)
+ aDidAdd = addToMachineListInternal(mMufflerHatches, aMetaTileEntity, aBaseCasingIndex);
+
+ // return super.addToMachineList(aTileEntity, aBaseCasingIndex);
+ return aDidAdd;
+ }
+
+ @Override
+ public boolean addMaintenanceToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addMufflerToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input
+ || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output
+ || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ public boolean addAirIntakeToMachineList(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_AirIntake) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ public boolean addFluidInputToMachineList(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ return addFluidInputToMachineList(getMetaTileEntity(aTileEntity), aBaseCasingIndex);
+ }
+
+ public boolean addFluidInputToMachineList(final IMetaTileEntity aMetaTileEntity, final int aBaseCasingIndex) {
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ public boolean clearRecipeMapForAllInputHatches() {
+ return resetRecipeMapForAllInputHatches(null);
+ }
+
+ public boolean resetRecipeMapForAllInputHatches() {
+ return resetRecipeMapForAllInputHatches(this.getRecipeMap());
+ }
+
+ public boolean resetRecipeMapForAllInputHatches(RecipeMap<?> aMap) {
+ int cleared = 0;
+ for (GT_MetaTileEntity_Hatch_Input g : this.mInputHatches) {
+ if (resetRecipeMapForHatch(g, aMap)) {
+ cleared++;
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_InputBus g : this.mInputBusses) {
+ if (resetRecipeMapForHatch(g, aMap)) {
+ cleared++;
+ }
+ }
+ return cleared > 0;
+ }
+
+ public boolean resetRecipeMapForHatch(IGregTechTileEntity aTileEntity, RecipeMap<?> aMap) {
+ try {
+ final IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input
+ || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus
+ || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Steam_BusInput) {
+ return resetRecipeMapForHatch((GT_MetaTileEntity_Hatch) aMetaTileEntity, aMap);
+ } else {
+ return false;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return false;
+ }
+ }
+
+ public boolean resetRecipeMapForHatch(GT_MetaTileEntity_Hatch aTileEntity, RecipeMap<?> aMap) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ final IMetaTileEntity aMetaTileEntity = aTileEntity;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input
+ || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus
+ || aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Steam_BusInput) {
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = null;
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = aMap;
+ if (aMap != null) {
+ log("Remapped Input Hatch to " + aMap.unlocalizedName + ".");
+ } else {
+ log("Cleared Input Hatch.");
+ }
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) {
+ ((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity).mRecipeMap = null;
+ ((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity).mRecipeMap = aMap;
+ if (aMap != null) {
+ log("Remapped Input Bus to " + aMap.unlocalizedName + ".");
+ } else {
+ log("Cleared Input Bus.");
+ }
+ } else {
+ ((GT_MetaTileEntity_Hatch_Steam_BusInput) aMetaTileEntity).mRecipeMap = null;
+ ((GT_MetaTileEntity_Hatch_Steam_BusInput) aMetaTileEntity).mRecipeMap = aMap;
+ if (aMap != null) {
+ log("Remapped Input Bus to " + aMap.unlocalizedName + ".");
+ } else {
+ log("Cleared Input Bus.");
+ }
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ clearRecipeMapForAllInputHatches();
+ onModeChangeByScrewdriver(side, aPlayer, aX, aY, aZ);
+ resetRecipeMapForAllInputHatches();
+ }
+
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {}
+
+ /**
+ * Enable Texture Casing Support if found in GT 5.09
+ */
+ public boolean updateTexture(final IGregTechTileEntity aTileEntity, int aCasingID) {
+ return updateTexture(getMetaTileEntity(aTileEntity), aCasingID);
+ }
+
+ /**
+ * Enable Texture Casing Support if found in GT 5.09
+ */
+ public boolean updateTexture(final IMetaTileEntity aTileEntity, int aCasingID) {
+ try { // gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch.updateTexture(int)
+
+ final IMetaTileEntity aMetaTileEntity = aTileEntity;
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ Method mProper = ReflectionUtils.getMethod(GT_MetaTileEntity_Hatch.class, "updateTexture", int.class);
+ if (mProper != null) {
+ if (GT_MetaTileEntity_Hatch.class.isInstance(aMetaTileEntity)) {
+ mProper.setAccessible(true);
+ mProper.invoke(aMetaTileEntity, aCasingID);
+ // log("Good Method Call for updateTexture.");
+ return true;
+ }
+ } else {
+ log("Bad Method Call for updateTexture.");
+ if (GT_MetaTileEntity_Hatch.class.isInstance(aMetaTileEntity)) {
+ if (aCasingID <= Byte.MAX_VALUE) {
+ ((GT_MetaTileEntity_Hatch) aTileEntity).updateTexture(aCasingID);
+ log(
+ "Good Method Call for updateTexture. Used fallback method of setting mMachineBlock as casing id was <= 128.");
+ return true;
+ } else {
+ log("updateTexture returning false. 1.2");
+ }
+ } else {
+ log("updateTexture returning false. 1.3");
+ }
+ }
+ log("updateTexture returning false. 1");
+ return false;
+ } catch (SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ log("updateTexture returning false.");
+ log("updateTexture returning false. 2");
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * TecTech Support
+ */
+
+ /**
+ * This is the array Used to Store the Tectech Multi-Amp Dynamo hatches.
+ */
+ public ArrayList<GT_MetaTileEntity_Hatch> mTecTechDynamoHatches = new ArrayList<>();
+
+ /**
+ * This is the array Used to Store the Tectech Multi-Amp Energy hatches.
+ */
+ public ArrayList<GT_MetaTileEntity_Hatch> mTecTechEnergyHatches = new ArrayList<>();
+
+ /**
+ * TecTech Multi-Amp Dynamo Support
+ *
+ * @param aTileEntity - The Dynamo Hatch
+ * @param aBaseCasingIndex - Casing Texture
+ * @return
+ */
+ public boolean addMultiAmpDynamoToMachineList(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ final IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (isThisHatchMultiDynamo(aTileEntity)) {
+ return addToMachineListInternal(mTecTechDynamoHatches, aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ public boolean isThisHatchMultiDynamo(IGregTechTileEntity aTileEntity) {
+ return isThisHatchMultiDynamo(getMetaTileEntity(aTileEntity));
+ }
+
+ public boolean isThisHatchMultiDynamo(IMetaTileEntity aMetaTileEntity) {
+ Class<?> mDynamoClass;
+ mDynamoClass = ReflectionUtils
+ .getClass("com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoMulti");
+ if (mDynamoClass != null) {
+ if (mDynamoClass.isInstance(aMetaTileEntity)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addDynamoToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo || isThisHatchMultiDynamo(aMetaTileEntity)) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ private boolean updateMasterDynamoHatchList(IMetaTileEntity aMetaTileEntity) {
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch aHatch) {
+ return mAllDynamoHatches.add(aHatch);
+ }
+ return false;
+ }
+
+ /**
+ * TecTech Multi-Amp Energy Hatch Support
+ *
+ * @param aTileEntity - The Energy Hatch
+ * @param aBaseCasingIndex - Casing Texture
+ * @return
+ */
+ public boolean addMultiAmpEnergyToMachineList(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ final IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (isThisHatchMultiEnergy(aMetaTileEntity)) {
+ return addToMachineListInternal(mTecTechEnergyHatches, aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ public boolean isThisHatchMultiEnergy(IGregTechTileEntity aTileEntity) {
+ return isThisHatchMultiEnergy(getMetaTileEntity(aTileEntity));
+ }
+
+ public boolean isThisHatchMultiEnergy(IMetaTileEntity aMetaTileEntity) {
+ Class<?> mDynamoClass;
+ mDynamoClass = ReflectionUtils
+ .getClass("com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti");
+ if (mDynamoClass != null) {
+ if (mDynamoClass.isInstance(aMetaTileEntity)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addEnergyInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = getMetaTileEntity(aTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy || isThisHatchMultiEnergy(aMetaTileEntity)) {
+ return addToMachineList(aMetaTileEntity, aBaseCasingIndex);
+ }
+ return false;
+ }
+
+ private boolean updateMasterEnergyHatchList(IMetaTileEntity aMetaTileEntity) {
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch aHatch) {
+ return mAllEnergyHatches.add(aHatch);
+ }
+ return false;
+ }
+
+ /**
+ * Pollution Management
+ */
+ public int calculatePollutionReductionForHatch(GT_MetaTileEntity_Hatch_Muffler hatch, int poll) {
+ return hatch.calculatePollutionReduction(poll);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setLong("mTotalRunTime", this.mTotalRunTime);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mTotalRunTime = aNBT.getLong("mTotalRunTime");
+ if (aNBT.hasKey("mVoidExcess")) {
+ // backward compatibility
+ voidingMode = aNBT.getBoolean("mVoidExcess") ? VoidingMode.VOID_ALL : VoidingMode.VOID_NONE;
+ }
+ if (aNBT.hasKey("mUseMultiparallelMode")) {
+ // backward compatibility
+ batchMode = aNBT.getBoolean("mUseMultiparallelMode");
+ }
+ }
+
+ /**
+ * Custom Tool Handling
+ */
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ // Do Things
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ // Logger.INFO("Right Clicked Controller.");
+ ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
+ if (tCurrentItem != null) {
+ // Logger.INFO("Holding Item.");
+ if (tCurrentItem.getItem() instanceof GT_MetaGenerated_Tool) {
+ // Logger.INFO("Is GT_MetaGenerated_Tool.");
+ int[] aOreID = OreDictionary.getOreIDs(tCurrentItem);
+ for (int id : aOreID) {
+ // Plunger
+ if (OreDictionary.getOreName(id)
+ .equals("craftingToolPlunger")) {
+ // Logger.INFO("Is Plunger.");
+ return onPlungerRightClick(aPlayer, side, aX, aY, aZ);
+ }
+ }
+ }
+ }
+ }
+ // Do Super
+ boolean aSuper = super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ return aSuper;
+ }
+
+ public boolean onPlungerRightClick(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ) {
+ int aHatchIndex = 0;
+ PlayerUtils.messagePlayer(aPlayer, "Trying to clear " + mOutputHatches.size() + " output hatches.");
+ for (GT_MetaTileEntity_Hatch_Output hatch : this.mOutputHatches) {
+ if (hatch.mFluid != null) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Clearing " + hatch.mFluid.amount
+ + "L of "
+ + hatch.mFluid.getLocalizedName()
+ + " from hatch "
+ + aHatchIndex
+ + ".");
+ hatch.mFluid = null;
+ }
+ aHatchIndex++;
+ }
+ return aHatchIndex > 0;
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ batchMode = !batchMode;
+ if (batchMode) {
+ GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOn"));
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("misc.BatchModeTextOff"));
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ if (supportsVoidProtection() && wrenchingSide == getBaseMetaTileEntity().getFrontFacing()) {
+ Set<VoidingMode> allowed = getAllowedVoidingModes();
+ setVoidingMode(getVoidingMode().nextInCollection(allowed));
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.gui.button.voiding_mode") + " "
+ + StatCollector.translateToLocal(getVoidingMode().getTransKey()));
+ return true;
+ } else return super.onSolderingToolRightClick(side, wrenchingSide, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public void onServerStart() {
+ super.onServerStart();
+ tryTickWaitTimerDown();
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ tryTickWaitTimerDown();
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ tryTickWaitTimerDown();
+ }
+
+ @Override
+ public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ super.onCreated(aStack, aWorld, aPlayer);
+ tryTickWaitTimerDown();
+ }
+
+ private void tryTickWaitTimerDown() {
+ /*
+ * if (mStartUpCheck > 10) { mStartUpCheck = 10; }
+ */
+ }
+
+ // Only support to use meta to tier
+
+ /**
+ * accept meta [0, maxMeta)
+ *
+ * @param maxMeta exclusive
+ */
+ public static <T> IStructureElement<T> addTieredBlock(Block aBlock, BiConsumer<T, Integer> aSetTheMeta,
+ Function<T, Integer> aGetTheMeta, int maxMeta) {
+ return addTieredBlock(aBlock, (t, i) -> {
+ aSetTheMeta.accept(t, i);
+ return true;
+ }, aGetTheMeta, 0, maxMeta);
+ }
+
+ /**
+ *
+ * @param minMeta inclusive
+ * @param maxMeta exclusive
+ */
+ public static <T> IStructureElement<T> addTieredBlock(Block aBlock, BiConsumer<T, Integer> aSetTheMeta,
+ Function<T, Integer> aGetTheMeta, int minMeta, int maxMeta) {
+ return addTieredBlock(aBlock, (t, i) -> {
+ aSetTheMeta.accept(t, i);
+ return true;
+ }, aGetTheMeta, minMeta, maxMeta);
+ }
+
+ /**
+ *
+ * @param minMeta inclusive
+ * @param maxMeta exclusive
+ */
+ public static <T> IStructureElement<T> addTieredBlock(Block aBlock, BiPredicate<T, Integer> aSetTheMeta,
+ Function<T, Integer> aGetTheMeta, int minMeta, int maxMeta) {
+
+ return new IStructureElement<>() {
+
+ @Override
+ public boolean check(T t, World world, int x, int y, int z) {
+ Block tBlock = world.getBlock(x, y, z);
+ if (aBlock == tBlock) {
+ Integer currentMeta = aGetTheMeta.apply(t);
+ int newMeta = tBlock.getDamageValue(world, x, y, z) + 1;
+ if (newMeta > maxMeta || newMeta < minMeta + 1) return false;
+ if (currentMeta == 0) {
+ return aSetTheMeta.test(t, newMeta);
+ } else {
+ return currentMeta == newMeta;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
+ StructureLibAPI.hintParticle(world, x, y, z, aBlock, getMeta(trigger));
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
+ return world.setBlock(x, y, z, aBlock, getMeta(trigger), 3);
+ }
+
+ private int getMeta(ItemStack trigger) {
+ int meta = trigger.stackSize;
+ if (meta <= 0) meta = minMeta;
+ if (meta + minMeta >= maxMeta) meta = maxMeta - 1 - minMeta;
+ return meta + minMeta;
+ }
+
+ @Nullable
+ @Override
+ public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ return BlocksToPlace.create(aBlock, getMeta(trigger));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ if (world.getBlock(x, y, z) == aBlock) {
+ if (world.getBlockMetadata(x, y, z) == getMeta(trigger)) {
+ return PlaceResult.SKIP;
+ }
+ return PlaceResult.REJECT;
+ }
+ return StructureUtility.survivalPlaceBlock(
+ aBlock,
+ getMeta(trigger),
+ world,
+ x,
+ y,
+ z,
+ env.getSource(),
+ env.getActor(),
+ env.getChatter());
+ }
+ };
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int aColorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ if (aActive) return new ITexture[] { getCasingTexture(), TextureFactory.builder()
+ .addIcon(getActiveOverlay())
+ .extFacing()
+ .build() };
+ return new ITexture[] { getCasingTexture(), TextureFactory.builder()
+ .addIcon(getInactiveOverlay())
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { getCasingTexture() };
+ }
+
+ protected IIconContainer getActiveOverlay() {
+ return null;
+ }
+
+ protected IIconContainer getInactiveOverlay() {
+ return null;
+ }
+
+ protected ITexture getCasingTexture() {
+ return Textures.BlockIcons.getCasingTextureForId(getCasingTextureId());
+ }
+
+ protected int getCasingTextureId() {
+ return 0;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (doesBindPlayerInventory()) {
+ super.addUIWidgets(builder, buildContext);
+ } else {
+ addNoPlayerInventoryUI(builder, buildContext);
+ }
+ }
+
+ private static final Materials GOOD = Materials.Uranium;
+ private static final Materials BAD = Materials.Plutonium;
+ private static final ConcurrentHashMap<String, ItemStack> mToolStacks = new ConcurrentHashMap<>();
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+
+ protected void addNoPlayerInventoryUI(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(3, 4)
+ .setSize(152, 159));
+ for (int i = 0; i < 9; i++) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.BUTTON_STANDARD)
+ .setPos(155, 3 + i * 18)
+ .setSize(18, 18));
+ }
+
+ DynamicPositionedColumn screenElements = new DynamicPositionedColumn();
+ drawTextsNoPlayerInventory(screenElements);
+ builder.widget(screenElements);
+
+ setupToolDisplay();
+
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(mWrench + "WRENCH")).asWidget()
+ .setPos(156, 58))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mWrench, val -> mWrench = val));
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(mCrowbar + "CROWBAR")).asWidget()
+ .setPos(156, 76))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mCrowbar, val -> mCrowbar = val));
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(mHardHammer + "HARDHAMMER")).asWidget()
+ .setPos(156, 94))
+ .widget(
+ new TextWidget("H").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(167, 103))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mHardHammer, val -> mHardHammer = val));
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(mSoftHammer + "SOFTHAMMER")).asWidget()
+ .setPos(156, 112))
+ .widget(
+ new TextWidget("M").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(167, 121))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mSoftHammer, val -> mSoftHammer = val));
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(mScrewdriver + "SCREWDRIVER")).asWidget()
+ .setPos(156, 130))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mScrewdriver, val -> mScrewdriver = val));
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(mSolderingTool + "SOLDERING_IRON_LV")).asWidget()
+ .setPos(156, 148))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mSolderingTool, val -> mSolderingTool = val));
+ builder.widget(
+ new ItemDrawable(() -> mToolStacks.get(getBaseMetaTileEntity().isActive() + "GLASS")).asWidget()
+ .setPos(156, 22))
+ .widget(
+ TextWidget.dynamicString(() -> getBaseMetaTileEntity().isActive() ? "On" : "Off")
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(157, 31))
+ .widget(
+ new FakeSyncWidget.BooleanSyncer(
+ () -> getBaseMetaTileEntity().isActive(),
+ val -> getBaseMetaTileEntity().setActive(val)));
+ }
+
+ protected void drawTextsNoPlayerInventory(DynamicPositionedColumn screenElements) {
+ screenElements.setSynced(false)
+ .setSpace(0)
+ .setPos(6, 7);
+
+ screenElements
+ .widget(
+ new TextWidget(GT_Utility.trans("138", "Incomplete Structure.")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mMachine))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mMachine, val -> mMachine = val))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.machines.input") + " "
+ + StatCollector.translateToLocal("GTPP.machines.tier")
+ + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Values.VOLTAGE_NAMES[(int) getInputTier()])
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getInputTier() > 0))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.machines.output") + " "
+ + StatCollector.translateToLocal("GTPP.machines.tier")
+ + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Values.VOLTAGE_NAMES[(int) getOutputTier()])
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getOutputTier() > 0))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.multiblock.progress") + ": "
+ + EnumChatFormatting.GREEN
+ + getBaseMetaTileEntity().getProgress() / 20
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + getBaseMetaTileEntity().getMaxProgress() / 20
+ + EnumChatFormatting.RESET
+ + " s")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ new TextWidget(StatCollector.translateToLocal("GTPP.multiblock.energy") + ":")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal(
+ "" + EnumChatFormatting.GREEN
+ + getStoredEnergyInAllEnergyHatches()
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + getMaxEnergyStorageOfAllEnergyHatches()
+ + EnumChatFormatting.RESET
+ + " EU"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ new TextWidget(StatCollector.translateToLocal("GTPP.multiblock.usage") + ":")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getLastRecipeEU() > 0 && getLastRecipeDuration() > 0))
+ .widget(
+ TextWidget.dynamicString(
+ () -> StatCollector.translateToLocal(
+ "" + EnumChatFormatting.RED + -getLastRecipeEU() + EnumChatFormatting.RESET + " EU/t/parallel"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getLastRecipeEU() > 0 && getLastRecipeDuration() > 0))
+ .widget(
+ TextWidget.dynamicString(() -> StatCollector.translateToLocal("GTPP.multiblock.generation") + ":")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getLastRecipeEU() < 0 && getLastRecipeDuration() > 0))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal(
+ "" + EnumChatFormatting.GREEN
+ + getLastRecipeEU()
+ + EnumChatFormatting.RESET
+ + " EU/t/parallel"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getLastRecipeEU() < 0 && getLastRecipeDuration() > 0))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.multiblock.duration") + ": "
+ + EnumChatFormatting.RED
+ + getLastRecipeDuration()
+ + EnumChatFormatting.RESET
+ + " ticks")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine && getLastRecipeEU() != 0 && getLastRecipeDuration() > 0))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.multiblock.specialvalue") + ": "
+ + EnumChatFormatting.RED
+ + getLastRecipeEU()
+ + EnumChatFormatting.RESET
+ + "")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(
+ widget -> mMachine && getLastRecipeEU() != 0
+ && getLastRecipeDuration() > 0
+ && (mLastRecipe != null ? mLastRecipe.mSpecialValue : 0) > 0))
+ .widget(
+ new TextWidget(StatCollector.translateToLocal("GTPP.multiblock.mei") + ":")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal(
+ "" + EnumChatFormatting.YELLOW
+ + getMaxInputVoltage()
+ + EnumChatFormatting.RESET
+ + " EU/t(*2A) "
+ + StatCollector.translateToLocal("GTPP.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Values.VN[GT_Utility.getTier(getMaxInputVoltage())]
+ + EnumChatFormatting.RESET))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.multiblock.efficiency") + ": "
+ + EnumChatFormatting.YELLOW
+ + (mEfficiency / 100.0F)
+ + EnumChatFormatting.RESET
+ + " %")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.multiblock.pollution") + ": "
+ + EnumChatFormatting.RED
+ + (getPollutionPerTick(null) * 20)
+ + EnumChatFormatting.RESET
+ + "/sec")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocal("GTPP.multiblock.pollutionreduced") + ": "
+ + EnumChatFormatting.GREEN
+ + getPollutionReductionForAllMufflers()
+ + EnumChatFormatting.RESET
+ + " %")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ new TextWidget("Total Time Since Built: ").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> "" + EnumChatFormatting.DARK_GREEN
+ + getRuntimeWeeksDisplay()
+ + EnumChatFormatting.RESET
+ + " Weeks,")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> "" + EnumChatFormatting.DARK_GREEN
+ + getRuntimeDaysDisplay()
+ + EnumChatFormatting.RESET
+ + " Days,")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> "" + EnumChatFormatting.DARK_GREEN
+ + getRuntimeHoursDisplay()
+ + EnumChatFormatting.RESET
+ + " Hours,")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> "" + EnumChatFormatting.DARK_GREEN
+ + getRuntimeMinutesDisplay()
+ + EnumChatFormatting.RESET
+ + " Minutes,")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> "" + EnumChatFormatting.DARK_GREEN
+ + getRuntimeSecondsDisplay()
+ + EnumChatFormatting.RESET
+ + " Seconds")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> mMachine));
+ }
+
+ protected int getLastRecipeEU() {
+ return mLastRecipe != null ? mLastRecipe.mEUt : 0;
+ }
+
+ protected int getLastRecipeDuration() {
+ return mLastRecipe != null ? mLastRecipe.mDuration : 0;
+ }
+
+ protected long getRuntimeSeconds() {
+ return getTotalRuntimeInTicks() / 20;
+ }
+
+ protected long getRuntimeWeeksDisplay() {
+ return TimeUnit.SECONDS.toDays(getRuntimeSeconds()) / 7;
+ }
+
+ protected long getRuntimeDaysDisplay() {
+ return TimeUnit.SECONDS.toDays(getRuntimeSeconds()) - 7 * getRuntimeWeeksDisplay();
+ }
+
+ protected long getRuntimeHoursDisplay() {
+ return TimeUnit.SECONDS.toHours(getRuntimeSeconds()) - TimeUnit.DAYS.toHours(getRuntimeDaysDisplay())
+ - TimeUnit.DAYS.toHours(7 * getRuntimeWeeksDisplay());
+ }
+
+ protected long getRuntimeMinutesDisplay() {
+ return TimeUnit.SECONDS.toMinutes(getRuntimeSeconds()) - (TimeUnit.SECONDS.toHours(getRuntimeSeconds()) * 60);
+ }
+
+ protected long getRuntimeSecondsDisplay() {
+ return TimeUnit.SECONDS.toSeconds(getRuntimeSeconds()) - (TimeUnit.SECONDS.toMinutes(getRuntimeSeconds()) * 60);
+ }
+
+ protected void setupToolDisplay() {
+ if (!mToolStacks.isEmpty()) return;
+
+ mToolStacks.put(
+ true + "WRENCH",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.WRENCH, 1, GOOD, Materials.Tungsten, null));
+ mToolStacks.put(
+ true + "CROWBAR",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.CROWBAR, 1, GOOD, Materials.Tungsten, null));
+ mToolStacks.put(
+ true + "HARDHAMMER",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.HARDHAMMER, 1, GOOD, Materials.Tungsten, null));
+ mToolStacks.put(
+ true + "SOFTHAMMER",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.SOFTMALLET, 1, GOOD, Materials.Tungsten, null));
+ mToolStacks.put(
+ true + "SCREWDRIVER",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.SCREWDRIVER, 1, GOOD, Materials.Tungsten, null));
+ mToolStacks.put(
+ true + "SOLDERING_IRON_LV",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.SOLDERING_IRON_LV, 1, GOOD, Materials.Tungsten, null));
+
+ mToolStacks.put(
+ false + "WRENCH",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.WRENCH, 1, BAD, Materials.Tungsten, null));
+ mToolStacks.put(
+ false + "CROWBAR",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.CROWBAR, 1, BAD, Materials.Tungsten, null));
+ mToolStacks.put(
+ false + "HARDHAMMER",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.HARDHAMMER, 1, BAD, Materials.Tungsten, null));
+ mToolStacks.put(
+ false + "SOFTHAMMER",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.SOFTMALLET, 1, BAD, Materials.Tungsten, null));
+ mToolStacks.put(
+ false + "SCREWDRIVER",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.SCREWDRIVER, 1, BAD, Materials.Tungsten, null));
+ mToolStacks.put(
+ false + "SOLDERING_IRON_LV",
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.SOLDERING_IRON_LV, 1, BAD, Materials.Tungsten, null));
+
+ ItemStack aGlassPane1 = ItemUtils.getItemStackOfAmountFromOreDict("paneGlassRed", 1);
+ ItemStack aGlassPane2 = ItemUtils.getItemStackOfAmountFromOreDict("paneGlassLime", 1);
+ mToolStacks.put("falseGLASS", aGlassPane1);
+ mToolStacks.put("trueGLASS", aGlassPane2);
+ }
+
+ public enum GTPPHatchElement implements IHatchElement<GregtechMeta_MultiBlockBase<?>> {
+
+ AirIntake(GregtechMeta_MultiBlockBase::addAirIntakeToMachineList, GT_MetaTileEntity_Hatch_AirIntake.class) {
+
+ @Override
+ public long count(GregtechMeta_MultiBlockBase<?> t) {
+ return t.mAirIntakes.size();
+ }
+ },
+ TTDynamo(GregtechMeta_MultiBlockBase::addMultiAmpDynamoToMachineList,
+ "com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoMulti") {
+
+ @Override
+ public long count(GregtechMeta_MultiBlockBase<?> t) {
+ return t.mTecTechDynamoHatches.size();
+ }
+ },
+ TTEnergy(GregtechMeta_MultiBlockBase::addMultiAmpEnergyToMachineList,
+ "com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti") {
+
+ @Override
+ public long count(GregtechMeta_MultiBlockBase<?> t) {
+ return t.mTecTechEnergyHatches.size();
+ }
+ },;
+
+ @SuppressWarnings("unchecked")
+ private static <T> Class<T> retype(Class<?> clazz) {
+ return (Class<T>) clazz;
+ }
+
+ private final List<? extends Class<? extends IMetaTileEntity>> mMteClasses;
+ private final IGT_HatchAdder<? super GregtechMeta_MultiBlockBase<?>> mAdder;
+
+ @SafeVarargs
+ GTPPHatchElement(IGT_HatchAdder<? super GregtechMeta_MultiBlockBase<?>> aAdder,
+ Class<? extends IMetaTileEntity>... aMteClasses) {
+ this.mMteClasses = Arrays.asList(aMteClasses);
+ this.mAdder = aAdder;
+ }
+
+ GTPPHatchElement(IGT_HatchAdder<? super GregtechMeta_MultiBlockBase<?>> aAdder, String... aClassNames) {
+ this.mMteClasses = Arrays.stream(aClassNames)
+ .map(ReflectionUtils::getClass)
+ .filter(Objects::nonNull)
+ .<Class<? extends IMetaTileEntity>>map(GTPPHatchElement::retype)
+ .collect(Collectors.toList());
+ this.mAdder = aAdder;
+ }
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return mMteClasses;
+ }
+
+ @Override
+ public IGT_HatchAdder<? super GregtechMeta_MultiBlockBase<?>> adder() {
+ return mAdder;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_SteamMultiBase.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_SteamMultiBase.java
new file mode 100644
index 0000000000..6e501815f0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GregtechMeta_SteamMultiBase.java
@@ -0,0 +1,428 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static mcp.mobius.waila.api.SpecialChars.GREEN;
+import static mcp.mobius.waila.api.SpecialChars.RED;
+import static mcp.mobius.waila.api.SpecialChars.RESET;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_HatchElementBuilder;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GT_Waila;
+import gregtech.api.util.IGT_HatchAdder;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Steam_BusInput;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Steam_BusOutput;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public abstract class GregtechMeta_SteamMultiBase<T extends GregtechMeta_SteamMultiBase<T>>
+ extends GregtechMeta_MultiBlockBase<T> {
+
+ public ArrayList<GT_MetaTileEntity_Hatch_Steam_BusInput> mSteamInputs = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch_Steam_BusOutput> mSteamOutputs = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch_CustomFluidBase> mSteamInputFluids = new ArrayList<>();
+
+ protected static final String TT_steaminputbus = StatCollector.translateToLocal("GTPP.MBTT.SteamInputBus");
+ protected static final String TT_steamoutputbus = StatCollector.translateToLocal("GTPP.MBTT.SteamOutputBus");
+ protected static final String TT_steamhatch = StatCollector.translateToLocal("GTPP.MBTT.SteamHatch");
+
+ public GregtechMeta_SteamMultiBase(String aName) {
+ super(aName);
+ }
+
+ public GregtechMeta_SteamMultiBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(getCasingTextureIndex()),
+ aActive ? getFrontOverlayActive() : getFrontOverlay() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(getCasingTextureIndex()) };
+ }
+
+ protected abstract GT_RenderedTexture getFrontOverlay();
+
+ protected abstract GT_RenderedTexture getFrontOverlayActive();
+
+ private int getCasingTextureIndex() {
+ return 10;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(V[1]);
+ // We need to trick the GT_ParallelHelper we have enough amps for all recipe parallels.
+ logic.setAvailableAmperage(getMaxParallelRecipes());
+ logic.setAmperageOC(false);
+ }
+
+ public ArrayList<FluidStack> getAllSteamStacks() {
+ ArrayList<FluidStack> aFluids = new ArrayList<>();
+ FluidStack aSteam = FluidUtils.getSteam(1);
+ for (FluidStack aFluid : this.getStoredFluids()) {
+ if (aFluid.isFluidEqual(aSteam)) {
+ aFluids.add(aFluid);
+ }
+ }
+ return aFluids;
+ }
+
+ public int getTotalSteamStored() {
+ int aSteam = 0;
+ for (FluidStack aFluid : getAllSteamStacks()) {
+ aSteam += aFluid.amount;
+ }
+ return aSteam;
+ }
+
+ public boolean tryConsumeSteam(int aAmount) {
+ if (getTotalSteamStored() <= 0) {
+ return false;
+ } else {
+ return this.depleteInput(FluidUtils.getSteam(aAmount));
+ }
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack arg0) {
+ return 0;
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (this.mUpdate == 1 || this.mStartUpCheck == 1) {
+ this.mSteamInputs.clear();
+ this.mSteamOutputs.clear();
+ this.mSteamInputFluids.clear();
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ /**
+ * Called every tick the Machine runs
+ */
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ fixAllMaintenanceIssue();
+ if (lEUt < 0) {
+ long aSteamVal = ((-lEUt * 10000) / Math.max(1000, mEfficiency));
+ // Logger.INFO("Trying to drain "+aSteamVal+" steam per tick.");
+ if (!tryConsumeSteam((int) aSteamVal)) {
+ stopMachine(ShutDownReasonRegistry.POWER_LOSS);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean addToMachineList(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ log("Invalid IGregTechTileEntity");
+ return false;
+ }
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ log("Invalid IMetaTileEntity");
+ return false;
+ }
+
+ // Use this to determine the correct value, then update the hatch texture after.
+ boolean aDidAdd = false;
+
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_CustomFluidBase) {
+ log("Adding Steam Input Hatch");
+ aDidAdd = addToMachineListInternal(mSteamInputFluids, aMetaTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Steam_BusInput) {
+ log(
+ "Trying to set recipe map. Type: "
+ + (getRecipeMap() != null ? getRecipeMap().unlocalizedName : "Null"));
+ this.resetRecipeMapForHatch(aTileEntity, getRecipeMap());
+ log("Adding Steam Input Bus");
+ aDidAdd = addToMachineListInternal(mSteamInputs, aMetaTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Steam_BusOutput) {
+ log("Adding Steam Output Bus");
+ aDidAdd = addToMachineListInternal(mSteamOutputs, aMetaTileEntity, aBaseCasingIndex);
+ }
+
+ return aDidAdd;
+ }
+
+ /*
+ * Handle I/O with custom hatches
+ */
+
+ @Override
+ public boolean depleteInput(FluidStack aLiquid) {
+ if (aLiquid == null) return false;
+ for (GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(mSteamInputFluids)) {
+ FluidStack tLiquid = tHatch.getFluid();
+ if (tLiquid != null && tLiquid.isFluidEqual(aLiquid)) {
+ tLiquid = tHatch.drain(aLiquid.amount, false);
+ if (tLiquid != null && tLiquid.amount >= aLiquid.amount) {
+ tLiquid = tHatch.drain(aLiquid.amount, true);
+ return tLiquid != null && tLiquid.amount >= aLiquid.amount;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean depleteInput(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return false;
+ FluidStack aLiquid = GT_Utility.getFluidForFilledItem(aStack, true);
+ if (aLiquid != null) return depleteInput(aLiquid);
+ for (GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(mSteamInputFluids)) {
+ if (GT_Utility.areStacksEqual(
+ aStack,
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(0))) {
+ if (tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(0).stackSize >= aStack.stackSize) {
+ tHatch.getBaseMetaTileEntity()
+ .decrStackSize(0, aStack.stackSize);
+ return true;
+ }
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_Steam_BusInput tHatch : filterValidMTEs(mSteamInputs)) {
+ tHatch.mRecipeMap = getRecipeMap();
+ for (int i = tHatch.getBaseMetaTileEntity()
+ .getSizeInventory() - 1; i >= 0; i--) {
+ if (GT_Utility.areStacksEqual(
+ aStack,
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i))) {
+ if (tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(0).stackSize >= aStack.stackSize) {
+ tHatch.getBaseMetaTileEntity()
+ .decrStackSize(0, aStack.stackSize);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public ArrayList<FluidStack> getStoredFluids() {
+ ArrayList<FluidStack> rList = new ArrayList<>();
+ for (GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(mSteamInputFluids)) {
+ if (tHatch.getFillableStack() != null) {
+ rList.add(tHatch.getFillableStack());
+ }
+ }
+ return rList;
+ }
+
+ @Override
+ public ArrayList<ItemStack> getStoredInputs() {
+ ArrayList<ItemStack> rList = new ArrayList<>();
+ for (GT_MetaTileEntity_Hatch_Steam_BusInput tHatch : filterValidMTEs(mSteamInputs)) {
+ tHatch.mRecipeMap = getRecipeMap();
+ for (int i = tHatch.getBaseMetaTileEntity()
+ .getSizeInventory() - 1; i >= 0; i--) {
+ if (tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i) != null) {
+ rList.add(
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i));
+ }
+ }
+ }
+ return rList;
+ }
+
+ @Override
+ public boolean addOutput(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return false;
+ aStack = GT_Utility.copy(aStack);
+ boolean outputSuccess = true;
+ while (outputSuccess && aStack.stackSize > 0) {
+ outputSuccess = false;
+ ItemStack single = aStack.splitStack(1);
+ for (GT_MetaTileEntity_Hatch_Steam_BusOutput tHatch : filterValidMTEs(mSteamOutputs)) {
+ if (!outputSuccess) {
+ for (int i = tHatch.getSizeInventory() - 1; i >= 0 && !outputSuccess; i--) {
+ if (tHatch.getBaseMetaTileEntity()
+ .addStackToSlot(i, single)) outputSuccess = true;
+ }
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_Output tHatch : filterValidMTEs(mOutputHatches)) {
+ if (!outputSuccess && tHatch.outputsItems()) {
+ if (tHatch.getBaseMetaTileEntity()
+ .addStackToSlot(1, single)) outputSuccess = true;
+ }
+ }
+ }
+ return outputSuccess;
+ }
+
+ @Override
+ public ArrayList<ItemStack> getStoredOutputs() {
+ ArrayList<ItemStack> rList = new ArrayList<>();
+ for (GT_MetaTileEntity_Hatch_Steam_BusOutput tHatch : filterValidMTEs(mSteamOutputs)) {
+ for (int i = tHatch.getBaseMetaTileEntity()
+ .getSizeInventory() - 1; i >= 0; i--) {
+ rList.add(
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i));
+ }
+ }
+ return rList;
+ }
+
+ @Override
+ public List<ItemStack> getItemOutputSlots(ItemStack[] toOutput) {
+ List<ItemStack> ret = new ArrayList<>();
+ for (final GT_MetaTileEntity_Hatch tBus : filterValidMTEs(mSteamOutputs)) {
+ final IInventory tBusInv = tBus.getBaseMetaTileEntity();
+ for (int i = 0; i < tBusInv.getSizeInventory(); i++) {
+ ret.add(tBus.getStackInSlot(i));
+ }
+ }
+ return ret;
+ }
+
+ @Override
+ public void updateSlots() {
+ for (GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(mSteamInputFluids)) tHatch.updateSlots();
+ for (GT_MetaTileEntity_Hatch_Steam_BusInput tHatch : filterValidMTEs(mSteamInputs)) tHatch.updateSlots();
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return false;
+ }
+
+ @Override
+ public void clearHatches() {
+ super.clearHatches();
+ mSteamInputFluids.clear();
+ mSteamInputs.clear();
+ mSteamOutputs.clear();
+ }
+
+ @Override
+ public boolean resetRecipeMapForAllInputHatches(RecipeMap<?> aMap) {
+ boolean ret = super.resetRecipeMapForAllInputHatches(aMap);
+ for (GT_MetaTileEntity_Hatch_Steam_BusInput hatch : mSteamInputs) {
+ if (resetRecipeMapForHatch(hatch, aMap)) {
+ ret = true;
+ }
+ }
+ return ret;
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ final NBTTagCompound tag = accessor.getNBTData();
+
+ if (tag.getBoolean("incompleteStructure")) {
+ currentTip.add(RED + "** INCOMPLETE STRUCTURE **" + RESET);
+ }
+ currentTip.add(
+ (tag.getBoolean("hasProblems") ? (RED + "** HAS PROBLEMS **") : GREEN + "Running Fine") + RESET
+ + " Efficiency: "
+ + tag.getFloat("efficiency")
+ + "%");
+
+ boolean isActive = tag.getBoolean("isActive");
+ if (isActive) {
+ long actualEnergyUsage = tag.getLong("energyUsage");
+ if (actualEnergyUsage > 0) {
+ currentTip.add(
+ StatCollector.translateToLocalFormatted("GTPP.waila.steam.use", formatNumbers(actualEnergyUsage)));
+ }
+ }
+ currentTip.add(
+ GT_Waila.getMachineProgressString(isActive, tag.getInteger("maxProgress"), tag.getInteger("progress")));
+ // Show ns on the tooltip
+ if (GT_Mod.gregtechproxy.wailaAverageNS && tag.hasKey("averageNS")) {
+ int tAverageTime = tag.getInteger("averageNS");
+ currentTip.add("Average CPU load of ~" + formatNumbers(tAverageTime) + " ns");
+ }
+ super.getMTEWailaBody(itemStack, currentTip, accessor, config);
+ }
+
+ protected static <T extends GregtechMeta_SteamMultiBase<T>> GT_HatchElementBuilder<T> buildSteamInput(
+ Class<T> typeToken) {
+ return buildHatchAdder(typeToken).adder(GregtechMeta_SteamMultiBase::addToMachineList)
+ .hatchIds(31040)
+ .shouldReject(t -> !t.mSteamInputFluids.isEmpty());
+ }
+
+ protected enum SteamHatchElement implements IHatchElement<GregtechMeta_SteamMultiBase<?>> {
+
+ InputBus_Steam {
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return Collections.singletonList(GT_MetaTileEntity_Hatch_Steam_BusInput.class);
+ }
+
+ @Override
+ public long count(GregtechMeta_SteamMultiBase<?> t) {
+ return t.mSteamInputs.size();
+ }
+ },
+ OutputBus_Steam {
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return Collections.singletonList(GT_MetaTileEntity_Hatch_Steam_BusOutput.class);
+ }
+
+ @Override
+ public long count(GregtechMeta_SteamMultiBase<?> t) {
+ return t.mSteamOutputs.size();
+ }
+ },;
+
+ @Override
+ public IGT_HatchAdder<? super GregtechMeta_SteamMultiBase<?>> adder() {
+ return GregtechMeta_SteamMultiBase::addToMachineList;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaBoilerBase.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaBoilerBase.java
new file mode 100644
index 0000000000..3f0d8d1ec1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaBoilerBase.java
@@ -0,0 +1,361 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.generators;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public abstract class GregtechMetaBoilerBase extends GT_MetaTileEntity_BasicTank {
+
+ public int mTemperature = 20;
+ public int mProcessingEnergy = 0;
+ public int mLossTimer = 0;
+ public FluidStack mSteam = null;
+ public boolean mHadNoWater = false;
+ public long RI = MathUtils.randLong(5L, 30L);
+
+ public GregtechMetaBoilerBase(final int aID, final String aName, final String aNameRegional,
+ final String aDescription, final ITexture... aTextures) {
+ super(aID, aName, aNameRegional, 0, 4, aDescription, aTextures);
+ }
+
+ public GregtechMetaBoilerBase(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ ITexture[] tmp = this.mTextures[side.offsetY == 0 ? side != facing ? 2 : ((byte) (aActive ? 4 : 3))
+ : side.ordinal()][aColorIndex + 1];
+ if ((side != facing) && (tmp.length == 2)) {
+ tmp = new ITexture[] { tmp[0] };
+ }
+ return tmp;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return false;
+ }
+
+ @Override
+ public boolean isPneumatic() {
+ return false;
+ }
+
+ @Override
+ public boolean isSteampowered() {
+ return false;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return facing.offsetY == 0;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return true;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return this.mTemperature;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return 500;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ if (aPlayer != null) {
+ if (GT_Utility.areStacksEqual(aPlayer.getCurrentEquippedItem(), new ItemStack(Items.water_bucket, 1))) {
+ this.fill(Materials.Water.getFluid(1000 * aPlayer.getCurrentEquippedItem().stackSize), true);
+ aPlayer.getCurrentEquippedItem()
+ .func_150996_a(Items.bucket);
+ } else {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(final FluidStack aFluid) {
+ return GT_ModHandler.isWater(aFluid);
+ }
+
+ @Override
+ public FluidStack getDrainableStack() {
+ return this.mSteam;
+ }
+
+ @Override
+ public FluidStack setDrainableStack(final FluidStack aFluid) {
+ this.mSteam = aFluid;
+ return this.mSteam;
+ }
+
+ @Override
+ public boolean isDrainableStackSeparate() {
+ return true;
+ }
+
+ @Override
+ public boolean allowCoverOnSide(final ForgeDirection side, final GT_ItemStack aCover) {
+ return GregTech_API.getCoverBehaviorNew(aCover.toStack())
+ .isSimpleCover();
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mLossTimer", this.mLossTimer);
+ aNBT.setInteger("mTemperature", this.mTemperature);
+ aNBT.setInteger("mProcessingEnergy", this.mProcessingEnergy);
+ if (this.mSteam != null) {
+ try {
+ aNBT.setTag("mSteam", this.mSteam.writeToNBT(new NBTTagCompound()));
+ } catch (final Throwable e) {}
+ }
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mLossTimer = aNBT.getInteger("mLossTimer");
+ this.mTemperature = aNBT.getInteger("mTemperature");
+ this.mProcessingEnergy = aNBT.getInteger("mProcessingEnergy");
+ this.mSteam = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mSteam"));
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ if ((aBaseMetaTileEntity.isServerSide()) && (aTick > 20L)) {
+ if (this.mTemperature <= 20) {
+ this.mTemperature = 20;
+ this.mLossTimer = 0;
+ }
+ if (++this.mLossTimer > 40) {
+ this.mTemperature -= 1;
+ this.mLossTimer = 0;
+ }
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (side != aBaseMetaTileEntity.getFrontFacing()) {
+ final IFluidHandler tTileEntity = aBaseMetaTileEntity.getITankContainerAtSide(side);
+ if (tTileEntity != null) {
+ final FluidStack tDrained = aBaseMetaTileEntity
+ .drain(side, Math.max(1, this.mSteam.amount / 2), false);
+ if (tDrained != null) {
+ final int tFilledAmount = tTileEntity.fill(side.getOpposite(), tDrained, false);
+ if (tFilledAmount > 0) {
+ tTileEntity.fill(
+ side.getOpposite(),
+ aBaseMetaTileEntity.drain(side, tFilledAmount, true),
+ true);
+ }
+ }
+ }
+ }
+ }
+ if ((aTick % 10L) == 0L) {
+ if (this.mTemperature > 100) {
+ if ((this.mFluid == null) || (!GT_ModHandler.isWater(this.mFluid)) || (this.mFluid.amount <= 0)) {
+ this.mHadNoWater = true;
+ } else {
+ if (this.mHadNoWater) {
+ aBaseMetaTileEntity.doExplosion(2048L);
+ return;
+ }
+ this.mFluid.amount -= 1;
+ if (this.mSteam == null) {
+ this.mSteam = GT_ModHandler.getSteam(150L);
+ } else if (GT_ModHandler.isSteam(this.mSteam)) {
+ this.mSteam.amount += 150;
+ } else {
+ this.mSteam = GT_ModHandler.getSteam(150L);
+ }
+ }
+ } else {
+ this.mHadNoWater = false;
+ }
+ }
+ if ((this.mSteam != null) && (this.mSteam.amount > getSteamCapacity())) {
+ this.sendSound((byte) 1);
+ this.mSteam.amount = getSteamCapacity() * 3 / 4;
+ }
+ if ((this.mProcessingEnergy <= 0) && (aBaseMetaTileEntity.isAllowedToWork())
+ && (this.mInventory[2] != null)) {
+ if ((GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.gem.get(Materials.Coal)))
+ || (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.dust.get(Materials.Coal)))
+ || (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.dustImpure.get(Materials.Coal)))
+ || (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.crushed.get(Materials.Coal)))) {
+ this.mProcessingEnergy += 160;
+ aBaseMetaTileEntity.decrStackSize(2, 1);
+ if (aBaseMetaTileEntity.getRandomNumber(3) == 0) {
+ aBaseMetaTileEntity
+ .addStackToSlot(3, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L));
+ }
+ } else if (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.gem.get(Materials.Charcoal))) {
+ this.mProcessingEnergy += 160;
+ aBaseMetaTileEntity.decrStackSize(2, 1);
+ if (aBaseMetaTileEntity.getRandomNumber(3) == 0) {
+ aBaseMetaTileEntity
+ .addStackToSlot(3, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Ash, 1L));
+ }
+ } else if (GT_OreDictUnificator.isItemStackInstanceOf(this.mInventory[2], "fuelCoke")) {
+ this.mProcessingEnergy += 640;
+ aBaseMetaTileEntity.decrStackSize(2, 1);
+ if (aBaseMetaTileEntity.getRandomNumber(2) == 0) {
+ aBaseMetaTileEntity
+ .addStackToSlot(3, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Ash, 1L));
+ }
+ } else if ((GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.gem.get(Materials.Lignite)))
+ || (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.dust.get(Materials.Lignite)))
+ || (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.dustImpure.get(Materials.Lignite)))
+ || (GT_OreDictUnificator
+ .isItemStackInstanceOf(this.mInventory[2], OrePrefixes.crushed.get(Materials.Lignite)))) {
+ this.mProcessingEnergy += 40;
+ aBaseMetaTileEntity.decrStackSize(2, 1);
+ if (aBaseMetaTileEntity.getRandomNumber(8) == 0) {
+ aBaseMetaTileEntity.addStackToSlot(
+ 3,
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L));
+ }
+ }
+ }
+ if ((this.mTemperature < 1000) && (this.mProcessingEnergy > 0) && ((aTick % 12L) == 0L)) {
+ this.mProcessingEnergy -= 2;
+ this.mTemperature += 1;
+ }
+ aBaseMetaTileEntity.setActive(this.mProcessingEnergy > 0);
+ }
+ }
+
+ @Override
+ // Since this type of machine can have different water and steam capacities, we need to override getTankInfo() to
+ // support returning those different capacities.
+ public FluidTankInfo[] getTankInfo(ForgeDirection aSide) {
+ return new FluidTankInfo[] { new FluidTankInfo(this.mFluid, getCapacity()),
+ new FluidTankInfo(this.mSteam, getSteamCapacity()) };
+ }
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return (aIndex == 1) || (aIndex == 3);
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return aIndex == 2;
+ }
+
+ @Override
+ public void doSound(final byte aIndex, final double aX, final double aY, final double aZ) {
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.RANDOM_FIZZ, 2, 1.0F, aX, aY, aZ);
+ for (int l = 0; l < 8; l++) {
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .spawnParticle(
+ "largesmoke",
+ (aX - 0.5D) + Math.random(),
+ aY,
+ (aZ - 0.5D) + Math.random(),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ }
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ // This type of machine can have different water and steam capacities.
+ public int getSteamCapacity() {
+ return 32000;
+ }
+
+ @Override
+ public int getTankPressure() {
+ return 100;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaSolarGenerator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaSolarGenerator.java
new file mode 100644
index 0000000000..5e0588acfd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechMetaSolarGenerator.java
@@ -0,0 +1,241 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.generators;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+
+public abstract class GregtechMetaSolarGenerator extends GT_MetaTileEntity_BasicTank {
+
+ public int mEfficiency;
+ public int mProcessingEnergy = 0;
+ public int mSolarCharge = 20;
+ public int mLossTimer = 0;
+ public static int sEnergyPerTick = 16;
+
+ public GregtechMetaSolarGenerator(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final String aDescription, final ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, 3, aDescription, aTextures);
+ }
+
+ public GregtechMetaSolarGenerator(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.add(this.mDescriptionArray, "Efficiency: " + this.getEfficiency() + "%");
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return this.getFront(aColor);
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return this.getBack(aColor);
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return this.getBottom(aColor);
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return this.getTop(aColor);
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection side) {
+ return side.offsetY == 0;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return aIndex < 2;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return this.getBaseMetaTileEntity()
+ .isAllowedToWork() ? V[this.mTier] : 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(this.getEUVar(), (V[this.mTier] * 40) + this.getMinimumStoredEU());
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork()
+ && (aTick > 20L)
+ && (aBaseMetaTileEntity.getUniversalEnergyStored()
+ < (this.maxEUOutput() + aBaseMetaTileEntity.getEUCapacity()))) {
+
+ if (this.mSolarCharge <= 20) {
+ this.mSolarCharge = 20;
+ this.mLossTimer = 0;
+ }
+ if (++this.mLossTimer > 45) {
+ this.mSolarCharge -= 1;
+ this.mLossTimer = 0;
+ }
+
+ if ((aTick % 25L) == 0L) {
+ if (this.mSolarCharge > 100) {
+ if ((this.mProcessingEnergy > 0) && (aBaseMetaTileEntity.isAllowedToWork())
+ && ((aTick % 256L) == 0L)
+ && (!aBaseMetaTileEntity.getWorld()
+ .isThundering()
+ && (aBaseMetaTileEntity.getUniversalEnergyStored()
+ < ((this.maxEUOutput() * 20) + this.getMinimumStoredEU())))) {
+ this.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits((sEnergyPerTick * this.getEfficiency()) / 10, false);
+ }
+ }
+ }
+
+ if ((this.mSolarCharge < 500) && (this.mProcessingEnergy > 0) && ((aTick % 12L) == 0L)) {
+ this.mProcessingEnergy -= 1;
+ this.mSolarCharge += 1;
+ }
+
+ if ((this.mProcessingEnergy <= 0) && (aBaseMetaTileEntity.isAllowedToWork())
+ && ((aTick % 256L) == 0L)
+ && (!aBaseMetaTileEntity.getWorld()
+ .isThundering())) {
+ final boolean bRain = aBaseMetaTileEntity.getWorld()
+ .isRaining() && (aBaseMetaTileEntity.getBiome().rainfall > 0.0F);
+ this.mProcessingEnergy += (bRain && (aBaseMetaTileEntity.getWorld().skylightSubtracted >= 4))
+ || !aBaseMetaTileEntity.getSkyAtSide(ForgeDirection.UP) ? 0
+ : !bRain && aBaseMetaTileEntity.getWorld()
+ .isDaytime() ? 8 : 1;
+ }
+
+ if (aBaseMetaTileEntity.isServerSide()) {
+ aBaseMetaTileEntity.setActive(
+ aBaseMetaTileEntity.isAllowedToWork() && (aBaseMetaTileEntity.getUniversalEnergyStored()
+ >= (this.maxEUOutput() + this.getMinimumStoredEU())));
+ }
+ }
+ }
+
+ public abstract int getEfficiency();
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechRocketFuelGeneratorBase.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechRocketFuelGeneratorBase.java
new file mode 100644
index 0000000000..83745f393a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/generators/GregtechRocketFuelGeneratorBase.java
@@ -0,0 +1,338 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.generators;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import java.util.Collection;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.RecipeMapWorkable;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+
+public abstract class GregtechRocketFuelGeneratorBase extends GT_MetaTileEntity_BasicTank implements RecipeMapWorkable {
+
+ protected int pollMin, pollMax;
+
+ public GregtechRocketFuelGeneratorBase(final int aID, final String aName, final String aNameRegional,
+ final int aTier, final String aDescription, final ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, 3, aDescription, aTextures);
+ pollMin = (int) (CORE.ConfigSwitches.baseMinPollutionPerSecondRocketFuelGenerator
+ * CORE.ConfigSwitches.pollutionReleasedByTierRocketFuelGenerator[mTier]);
+ pollMax = (int) (CORE.ConfigSwitches.baseMaxPollutionPerSecondRocketFuelGenerator
+ * CORE.ConfigSwitches.pollutionReleasedByTierRocketFuelGenerator[mTier]);
+ }
+
+ public GregtechRocketFuelGeneratorBase(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ pollMin = (int) (CORE.ConfigSwitches.baseMinPollutionPerSecondRocketFuelGenerator
+ * CORE.ConfigSwitches.pollutionReleasedByTierRocketFuelGenerator[mTier]);
+ pollMax = (int) (CORE.ConfigSwitches.baseMaxPollutionPerSecondRocketFuelGenerator
+ * CORE.ConfigSwitches.pollutionReleasedByTierRocketFuelGenerator[mTier]);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ @Override
+ public String[] getDescription() {
+ String aPollution = "Causes between " + pollMin + " and " + pollMax + " Pollution per second";
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Fuel Efficiency: " + this.getEfficiency() + "%",
+ aPollution,
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1] };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return this.getFront(aColor);
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return this.getBack(aColor);
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return this.getBottom(aColor);
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return this.getTop(aColor);
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection side) {
+ return side.offsetY == 0;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return aIndex < 2;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return this.getBaseMetaTileEntity()
+ .getFrontFacing() == side;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return V[this.mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(this.getEUVar(), (V[this.mTier] * 500) + this.getMinimumStoredEU());
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(final FluidStack aFluid) {
+ return this.getFuelValue(aFluid) > 0;
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && ((aTick % 10) == 0)) {
+ if (this.mFluid == null) {
+ if (aBaseMetaTileEntity.getUniversalEnergyStored() < (this.maxEUOutput() + this.getMinimumStoredEU())) {
+ this.mInventory[this.getStackDisplaySlot()] = null;
+ } else {
+ if (this.mInventory[this.getStackDisplaySlot()] == null) {
+ this.mInventory[this.getStackDisplaySlot()] = new ItemStack(Blocks.fire, 1);
+ }
+ this.mInventory[this.getStackDisplaySlot()].setStackDisplayName(
+ "Generating: " + (aBaseMetaTileEntity.getUniversalEnergyStored() - this.getMinimumStoredEU())
+ + " EU");
+ }
+ } else {
+ final int tFuelValue = this.getFuelValue(this.mFluid),
+ tConsumed = this.consumedFluidPerOperation(this.mFluid);
+ if ((tFuelValue > 0) && (tConsumed > 0) && (this.mFluid.amount >= tConsumed)) {
+ final long tFluidAmountToUse = Math.min(
+ this.mFluid.amount / tConsumed,
+ (((this.maxEUOutput() * 20) + this.getMinimumStoredEU())
+ - aBaseMetaTileEntity.getUniversalEnergyStored()) / tFuelValue);
+ if ((tFluidAmountToUse > 0)
+ && aBaseMetaTileEntity.increaseStoredEnergyUnits(tFluidAmountToUse * tFuelValue, true)) {
+ int aSafeFloor = (int) Math.max(((tFluidAmountToUse * tConsumed) / 3), 1);
+ this.mFluid.amount -= (int) aSafeFloor;
+ PollutionUtils.addPollution(getBaseMetaTileEntity(), 10 * getPollution());
+ }
+ }
+ }
+ if ((this.mInventory[this.getInputSlot()] != null)
+ && (aBaseMetaTileEntity.getUniversalEnergyStored()
+ < ((this.maxEUOutput() * 20) + this.getMinimumStoredEU()))
+ && (GT_Utility.getFluidForFilledItem(this.mInventory[this.getInputSlot()], true) == null)) {
+ final int tFuelValue = this.getFuelValue(this.mInventory[this.getInputSlot()]);
+ if (tFuelValue > 0) {
+ final ItemStack tEmptyContainer = this.getEmptyContainer(this.mInventory[this.getInputSlot()]);
+ if (aBaseMetaTileEntity.addStackToSlot(this.getOutputSlot(), tEmptyContainer)) {
+ aBaseMetaTileEntity.increaseStoredEnergyUnits(tFuelValue, true);
+ aBaseMetaTileEntity.decrStackSize(this.getInputSlot(), 1);
+ PollutionUtils.addPollution(getBaseMetaTileEntity(), getPollution() / 2);
+ }
+ }
+ }
+ }
+
+ if (aBaseMetaTileEntity.isServerSide()) {
+ aBaseMetaTileEntity.setActive(
+ aBaseMetaTileEntity.isAllowedToWork() && (aBaseMetaTileEntity.getUniversalEnergyStored()
+ >= (this.maxEUOutput() + this.getMinimumStoredEU())));
+ }
+ }
+
+ public int getPollution() {
+ return MathUtils.randInt(pollMin, pollMax);
+ }
+
+ @Override
+ public abstract RecipeMap<?> getRecipeMap();
+
+ public abstract int getEfficiency();
+
+ public int consumedFluidPerOperation(final FluidStack aLiquid) {
+ return 1;
+ }
+
+ public int getFuelValue(final FluidStack aLiquid) {
+ if ((aLiquid == null) || (this.getRecipeMap() == null)) {
+ return 0;
+ }
+ FluidStack tLiquid;
+ final Collection<GT_Recipe> tRecipeList = this.getRecipeMap()
+ .getAllRecipes();
+ for (final GT_Recipe tFuel : tRecipeList) {
+ if ((tLiquid = tFuel.mFluidInputs[0]) != null) {
+ if (aLiquid.isFluidEqual(tLiquid)) {
+ int aperOp = this.consumedFluidPerOperation(tLiquid);
+ return (int) (((long) tFuel.mSpecialValue * this.getEfficiency() * aperOp) / 100);
+ }
+ }
+ }
+ return 0;
+ }
+
+ public int getFuelValue(final ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack) || (this.getRecipeMap() == null)) {
+ return 0;
+ }
+ final GT_Recipe tFuel = this.getRecipeMap()
+ .findRecipe(this.getBaseMetaTileEntity(), false, Long.MAX_VALUE, null, aStack);
+ if (tFuel != null) {
+ return (int) ((tFuel.mSpecialValue * 1000L * this.getEfficiency()) / 100);
+ }
+ return 0;
+ }
+
+ public ItemStack getEmptyContainer(final ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack) || (this.getRecipeMap() == null)) {
+ return null;
+ }
+ final GT_Recipe tFuel = this.getRecipeMap()
+ .findRecipe(this.getBaseMetaTileEntity(), false, Long.MAX_VALUE, null, aStack);
+ if (tFuel != null) {
+ return GT_Utility.copy(tFuel.getOutput(0));
+ }
+ return GT_Utility.getContainerItem(aStack, true);
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack) && ((this.getFuelValue(aStack) > 0)
+ || (this.getFuelValue(GT_Utility.getFluidForFilledItem(aStack, true)) > 0));
+ }
+
+ @Override
+ public int getCapacity() {
+ return 32000;
+ }
+
+ @Override
+ public int getTankPressure() {
+ return -100;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/machines/GregtechMetaTreeFarmerBase.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/machines/GregtechMetaTreeFarmerBase.java
new file mode 100644
index 0000000000..fe3253244a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/machines/GregtechMetaTreeFarmerBase.java
@@ -0,0 +1,180 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.machines;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public abstract class GregtechMetaTreeFarmerBase extends GT_MetaTileEntity_TieredMachineBlock {
+
+ public GregtechMetaTreeFarmerBase(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final int aInvSlotCount, final String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription);
+ }
+
+ public GregtechMetaTreeFarmerBase(final String aName, final int aTier, final int aInvSlotCount,
+ final String[] aDescription, final ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(final ForgeDirection side) {
+ return !this.isOutputFacing(side);
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return this.getBaseMetaTileEntity()
+ .getBackFacing() == side;
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 0;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return false;
+ }
+
+ public abstract ITexture getOverlayIcon();
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Farm_Manager) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Farm_Manager) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Acacia_Log) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Podzol) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Farm_Manager) };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return this.getFront(aColor);
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return this.getBack(aColor);
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return this.getBottom(aColor);
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return this.getTop(aColor);
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return this.getSides(aColor);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_Catalysts.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_Catalysts.java
new file mode 100644
index 0000000000..b53e540044
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_Catalysts.java
@@ -0,0 +1,71 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_Catalysts extends GT_MetaTileEntity_Hatch_NbtConsumable {
+
+ public GT_MetaTileEntity_Hatch_Catalysts(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, 0, 16, "Dedicated Catalyst Storage", false);
+ }
+
+ public GT_MetaTileEntity_Hatch_Catalysts(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, 0, 16, aDescription, false, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Bus_Catalyst) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Bus_Catalyst) };
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.add(this.mDescriptionArray, CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Catalysts(mName, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public String getNameGUI() {
+ return "Catalyst Container";
+ }
+
+ @Override
+ public AutoMap<ItemStack> getItemsValidForUsageSlots() {
+ return new AutoMap<>();
+ }
+
+ @Override
+ public boolean isItemValidForUsageSlot(ItemStack aStack) {
+ return ItemUtils.isCatalyst(aStack);
+ }
+
+ @Override
+ public int getInputSlotCount() {
+ return 16;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_MillingBalls.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_MillingBalls.java
new file mode 100644
index 0000000000..e3134f5812
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_MillingBalls.java
@@ -0,0 +1,71 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Hatch_MillingBalls extends GT_MetaTileEntity_Hatch_NbtConsumable {
+
+ public GT_MetaTileEntity_Hatch_MillingBalls(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, 6, 4, "Dedicated Milling Ball Storage", false);
+ }
+
+ public GT_MetaTileEntity_Hatch_MillingBalls(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, 6, 4, aDescription, false, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Bus_Milling_Balls) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TexturesGtBlock.Overlay_Bus_Milling_Balls) };
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.add(this.mDescriptionArray, CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_MillingBalls(mName, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public String getNameGUI() {
+ return "Ball Housing";
+ }
+
+ @Override
+ public AutoMap<ItemStack> getItemsValidForUsageSlots() {
+ return new AutoMap<>();
+ }
+
+ @Override
+ public boolean isItemValidForUsageSlot(ItemStack aStack) {
+ return ItemUtils.isMillingBall(aStack);
+ }
+
+ @Override
+ public int getInputSlotCount() {
+ return 4;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_NbtConsumable.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_NbtConsumable.java
new file mode 100644
index 0000000000..e81c9ed554
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/nbthandlers/GT_MetaTileEntity_Hatch_NbtConsumable.java
@@ -0,0 +1,353 @@
+package gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public abstract class GT_MetaTileEntity_Hatch_NbtConsumable extends GT_MetaTileEntity_Hatch
+ implements IAddGregtechLogo {
+
+ private final int mInputslotCount;
+ private final int mTotalSlotCount;
+ private final boolean mAllowDuplicateUsageTypes;
+
+ public GT_MetaTileEntity_Hatch_NbtConsumable(int aID, String aName, String aNameRegional, int aTier,
+ int aInputSlots, String aDescription, boolean aAllowDuplicateTypes) {
+ super(aID, aName, aNameRegional, aTier, aInputSlots * 2, aDescription);
+ mInputslotCount = getInputSlotCount();
+ mTotalSlotCount = getInputSlotCount() * 2;
+ mAllowDuplicateUsageTypes = aAllowDuplicateTypes;
+ }
+
+ public GT_MetaTileEntity_Hatch_NbtConsumable(String aName, int aTier, int aInputSlots, String[] aDescription,
+ boolean aAllowDuplicateTypes, ITexture[][][] aTextures) {
+ super(aName, aTier, aInputSlots * 2, aDescription, aTextures);
+ mInputslotCount = getInputSlotCount();
+ mTotalSlotCount = getInputSlotCount() * 2;
+ mAllowDuplicateUsageTypes = aAllowDuplicateTypes;
+ }
+
+ @Override
+ public abstract ITexture[] getTexturesActive(ITexture aBaseTexture);
+
+ @Override
+ public abstract ITexture[] getTexturesInactive(ITexture aBaseTexture);
+
+ public abstract int getInputSlotCount();
+
+ @Override
+ public final boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public final boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public final boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public abstract MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity);
+
+ @Override
+ public final boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ public abstract String getNameGUI();
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ validateUsageSlots();
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ fillStacksIntoFirstSlots();
+ tryFillUsageSlots();
+ }
+ }
+
+ public final void updateSlots() {
+ for (int i = 0; i < mInventory.length; i++) {
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) {
+ mInventory[i] = null;
+ }
+ // Only moves items in the first four slots
+ if (i <= getSlotID_LastInput()) {
+ fillStacksIntoFirstSlots();
+ }
+ }
+ }
+
+ protected void validateUsageSlots() {
+ for (int i = getSlotID_FirstUsage(); i <= getSlotID_LastUsage(); i++) {
+ if (mInventory[i] != null && mInventory[i].stackSize < 1) {
+ mInventory[i] = null;
+ this.markDirty();
+ }
+ }
+ }
+
+ // Only moves items in the first four slots
+ protected final void fillStacksIntoFirstSlots() {
+ for (int i = 0; i <= getSlotID_LastInput(); i++) {
+ for (int j = i + 1; j <= getSlotID_LastInput(); j++) {
+ if (mInventory[j] != null
+ && (mInventory[i] == null || GT_Utility.areStacksEqual(mInventory[i], mInventory[j]))) {
+ GT_Utility.moveStackFromSlotAToSlotB(
+ getBaseMetaTileEntity(),
+ getBaseMetaTileEntity(),
+ j,
+ i,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ }
+ }
+ }
+ }
+
+ public final void tryFillUsageSlots() {
+ int aSlotSpace = (mInputslotCount - getContentUsageSlots().size());
+ if (aSlotSpace > 0) {
+ Logger.INFO("We have empty usage slots. " + aSlotSpace);
+ for (int i = getSlotID_FirstInput(); i <= getSlotID_LastInput(); i++) {
+ ItemStack aStackToTryMove = mInventory[i];
+ if (aStackToTryMove != null && isItemValidForUsageSlot(aStackToTryMove)) {
+ Logger.INFO("Trying to move stack from input slot " + i);
+ if (moveItemFromStockToUsageSlots(aStackToTryMove)) {
+ Logger.INFO("Updating Slots.");
+ updateSlots();
+ }
+ }
+ }
+ }
+ }
+
+ private int getSlotID_FirstInput() {
+ return 0;
+ }
+
+ private int getSlotID_LastInput() {
+ return mInputslotCount - 1;
+ }
+
+ private int getSlotID_FirstUsage() {
+ return mInputslotCount;
+ }
+
+ private int getSlotID_LastUsage() {
+ return mTotalSlotCount - 1;
+ }
+
+ public final AutoMap<ItemStack> getContentUsageSlots() {
+ AutoMap<ItemStack> aItems = new AutoMap<>();
+ for (int i = mInputslotCount; i < mTotalSlotCount; i++) {
+ if (mInventory[i] != null) {
+ aItems.add(mInventory[i]);
+ }
+ }
+ return aItems;
+ }
+
+ public final boolean moveItemFromStockToUsageSlots(ItemStack aStack) {
+ return moveItemFromStockToUsageSlots(aStack, mAllowDuplicateUsageTypes);
+ }
+
+ public final boolean moveItemFromStockToUsageSlots(ItemStack aStack, boolean aAllowMultiOfSameTypeInUsageSlots) {
+ if (aStack != null) {
+ if (aStack.stackSize > 0) {
+
+ if (!isItemValidForUsageSlot(aStack)) {
+ Logger.INFO("Stack not valid: " + ItemUtils.getItemName(aStack));
+ return false;
+ }
+
+ // Copy the input stack into a new object
+ ItemStack aStackToMove = aStack.copy();
+ // Set stack size of stack to move to 1.
+ aStackToMove.stackSize = 1;
+ // Did we set a stack in the usage slots?
+ boolean aDidSet = false;
+ // Did we find another of this item already in the usage slots?
+ boolean aFoundMatching = false;
+ // Continue processing with our new stack
+ // First check for duplicates
+ for (int i = getSlotID_FirstUsage(); i <= getSlotID_LastUsage(); i++) {
+ if (mInventory[i] != null) {
+ if (GT_Utility.areStacksEqual(aStackToMove, mInventory[i], true)) {
+ Logger.INFO("Found matching stack in slot " + i + ".");
+ aFoundMatching = true;
+ break;
+ }
+ }
+ }
+ // Then Move stack to Usage slots
+ for (int i = getSlotID_FirstUsage(); i <= getSlotID_LastUsage(); i++) {
+ if (mInventory[i] == null) {
+ if ((aFoundMatching && aAllowMultiOfSameTypeInUsageSlots) || !aFoundMatching) {
+ mInventory[i] = aStackToMove;
+ aDidSet = true;
+ Logger.INFO("Moving new stack to usage slots.");
+ break;
+ }
+ }
+ }
+ if (aDidSet) {
+ Logger.INFO("Depleting input stack size by 1.");
+ // Depleted one from the original input stack
+ aStack.stackSize--;
+ }
+ return aDidSet;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public final boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public final boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == getBaseMetaTileEntity().getFrontFacing() && isItemValidForUsageSlot(aStack)
+ && aIndex < mInputslotCount;
+ }
+
+ /**
+ * Items that get compared when checking for Usage Slot validity. Can return an empty map if
+ * isItemValidForUsageSlot() is overridden.
+ *
+ * @return
+ */
+ public abstract AutoMap<ItemStack> getItemsValidForUsageSlots();
+
+ /**
+ * Checks if the given item is valid for Usage Slots. Can be overridden for easier handling if you already have
+ * methods to check this.
+ *
+ * @param aStack
+ * @return
+ */
+ public boolean isItemValidForUsageSlot(ItemStack aStack) {
+ if (aStack != null) {
+ for (ItemStack aValid : getItemsValidForUsageSlots()) {
+ if (GT_Utility.areStacksEqual(aStack, aValid, true)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ switch (mTotalSlotCount) {
+ case 8, 18 -> builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(152, 63));
+ case 32 -> builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(79, 35));
+ }
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ switch (mTotalSlotCount) {
+ case 8 -> {
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 2)
+ .startFromSlot(0)
+ .endAtSlot(3)
+ .build()
+ .setPos(25, 25));
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 2)
+ .startFromSlot(4)
+ .endAtSlot(7)
+ .canInsert(false)
+ .build()
+ .setPos(115, 25));
+ builder.widget(
+ new TextWidget("Stock").setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(25, 16))
+ .widget(
+ new TextWidget("Active").setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(115, 16));
+ }
+ case 18 -> {
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .startFromSlot(0)
+ .endAtSlot(8)
+ .build()
+ .setPos(25, 19));
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .startFromSlot(9)
+ .endAtSlot(17)
+ .canInsert(false)
+ .build()
+ .setPos(97, 19));
+ builder.widget(
+ new TextWidget("Stock").setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(25, 14))
+ .widget(
+ new TextWidget("Active").setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(15, 14));
+ }
+ case 32 -> {
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 4)
+ .startFromSlot(0)
+ .endAtSlot(15)
+ .build()
+ .setPos(7, 7));
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 4)
+ .startFromSlot(16)
+ .endAtSlot(31)
+ .canInsert(false)
+ .build()
+ .setPos(96, 7));
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_CopiedBlockTexture.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_CopiedBlockTexture.java
new file mode 100644
index 0000000000..6a780d227c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_CopiedBlockTexture.java
@@ -0,0 +1,28 @@
+package gtPlusPlus.xmod.gregtech.api.objects;
+
+import net.minecraft.block.Block;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.objects.GT_CopiedBlockTexture;
+
+/**
+ * Made this to get rid of deprecation warnings <i>everywhere</i>.
+ *
+ * @author Alkalus
+ *
+ */
+@SuppressWarnings("deprecation")
+public class GTPP_CopiedBlockTexture extends GT_CopiedBlockTexture {
+
+ public GTPP_CopiedBlockTexture(Block aBlock, int aSide, int aMeta, short[] aRGBa, boolean aAllowAlpha) {
+ super(aBlock, aMeta, aMeta, aRGBa, aAllowAlpha);
+ }
+
+ public GTPP_CopiedBlockTexture(Block aBlock, int aSide, int aMeta, short[] aRGBa) {
+ this(aBlock, aSide, aMeta, aRGBa, true);
+ }
+
+ public GTPP_CopiedBlockTexture(Block aBlock, int aSide, int aMeta) {
+ this(aBlock, aSide, aMeta, Dyes._NULL.mRGBa);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_RenderedTexture.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_RenderedTexture.java
new file mode 100644
index 0000000000..0da0136193
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GTPP_RenderedTexture.java
@@ -0,0 +1,27 @@
+package gtPlusPlus.xmod.gregtech.api.objects;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.objects.GT_RenderedTexture;
+
+/**
+ * Made this to get rid of deprecation warnings <i>everywhere</i>.
+ *
+ * @author Alkalus
+ *
+ */
+@SuppressWarnings("deprecation")
+public class GTPP_RenderedTexture extends GT_RenderedTexture {
+
+ public GTPP_RenderedTexture(IIconContainer aIcon, short[] aRGBa, boolean aAllowAlpha) {
+ super(aIcon, aRGBa, aAllowAlpha);
+ }
+
+ public GTPP_RenderedTexture(IIconContainer aIcon, short[] aRGBa) {
+ this(aIcon, aRGBa, true);
+ }
+
+ public GTPP_RenderedTexture(IIconContainer aIcon) {
+ this(aIcon, Dyes._NULL.mRGBa);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechItemData.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechItemData.java
new file mode 100644
index 0000000000..967d3ae916
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechItemData.java
@@ -0,0 +1,147 @@
+package gtPlusPlus.xmod.gregtech.api.objects;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.objects.GT_ArrayList;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+
+public class GregtechItemData {
+
+ private static final GregtechMaterialStack[] EMPTY_GT_MaterialStack_ARRAY = new GregtechMaterialStack[0];
+
+ public final List<Object> mExtraData = new GT_ArrayList<>(false, 1);
+ public final GregtechOrePrefixes mPrefix;
+ public final GregtechMaterialStack mMaterial;
+ public final GregtechMaterialStack[] mByProducts;
+ public boolean mBlackListed = false;
+ public ItemStack mUnificationTarget = null;
+
+ public GregtechItemData(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial,
+ final boolean aBlackListed) {
+ this.mPrefix = aPrefix;
+ this.mMaterial = aMaterial == null ? null : new GregtechMaterialStack(aMaterial, aPrefix.mMaterialAmount);
+ this.mBlackListed = aBlackListed;
+ this.mByProducts = (aPrefix.mSecondaryMaterial == null) || (aPrefix.mSecondaryMaterial.mMaterial == null)
+ ? EMPTY_GT_MaterialStack_ARRAY
+ : new GregtechMaterialStack[] { aPrefix.mSecondaryMaterial.clone() };
+ }
+
+ public GregtechItemData(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial) {
+ this(aPrefix, aMaterial, false);
+ }
+
+ public GregtechItemData(final GregtechMaterialStack aMaterial, final GregtechMaterialStack... aByProducts) {
+ this.mPrefix = null;
+ this.mMaterial = aMaterial.mMaterial == null ? null : aMaterial.clone();
+ this.mBlackListed = true;
+ if (aByProducts == null) {
+ this.mByProducts = EMPTY_GT_MaterialStack_ARRAY;
+ } else {
+ final GregtechMaterialStack[] tByProducts = aByProducts.length < 1 ? EMPTY_GT_MaterialStack_ARRAY
+ : new GregtechMaterialStack[aByProducts.length];
+ int j = 0;
+ for (GregtechMaterialStack aByProduct : aByProducts) {
+ if ((aByProduct != null) && (aByProduct.mMaterial != null)) {
+ tByProducts[j++] = aByProduct.clone();
+ }
+ }
+ this.mByProducts = j > 0 ? new GregtechMaterialStack[j] : EMPTY_GT_MaterialStack_ARRAY;
+ for (int i = 0; i < this.mByProducts.length; i++) {
+ this.mByProducts[i] = tByProducts[i];
+ }
+ }
+ }
+
+ public GregtechItemData(final GT_Materials aMaterial, final long aAmount,
+ final GregtechMaterialStack... aByProducts) {
+ this(new GregtechMaterialStack(aMaterial, aAmount), aByProducts);
+ }
+
+ public GregtechItemData(final GT_Materials aMaterial, final long aAmount, final GT_Materials aByProduct,
+ final long aByProductAmount) {
+ this(new GregtechMaterialStack(aMaterial, aAmount), new GregtechMaterialStack(aByProduct, aByProductAmount));
+ }
+
+ public GregtechItemData(final GregtechItemData... aData) {
+ this.mPrefix = null;
+ this.mBlackListed = true;
+
+ final ArrayList<GregtechMaterialStack> aList = new ArrayList<>(), rList = new ArrayList<>();
+
+ for (final GregtechItemData tData : aData) {
+ if (tData != null) {
+ if (tData.hasValidMaterialData() && (tData.mMaterial.mAmount > 0)) {
+ aList.add(tData.mMaterial.clone());
+ }
+ for (final GregtechMaterialStack tMaterial : tData.mByProducts) {
+ if (tMaterial.mAmount > 0) {
+ aList.add(tMaterial.clone());
+ }
+ }
+ }
+ }
+
+ for (final GregtechMaterialStack aMaterial : aList) {
+ boolean temp = true;
+ for (final GregtechMaterialStack tMaterial : rList) {
+ if (aMaterial.mMaterial == tMaterial.mMaterial) {
+ tMaterial.mAmount += aMaterial.mAmount;
+ temp = false;
+ break;
+ }
+ }
+ if (temp) {
+ rList.add(aMaterial.clone());
+ }
+ }
+
+ rList.sort((a, b) -> Long.compare(b.mAmount, a.mAmount));
+
+ if (rList.isEmpty()) {
+ this.mMaterial = null;
+ } else {
+ this.mMaterial = rList.get(0);
+ rList.remove(0);
+ }
+
+ this.mByProducts = rList.toArray(new GregtechMaterialStack[0]);
+ }
+
+ public boolean hasValidPrefixMaterialData() {
+ return (this.mPrefix != null) && (this.mMaterial != null) && (this.mMaterial.mMaterial != null);
+ }
+
+ public boolean hasValidPrefixData() {
+ return this.mPrefix != null;
+ }
+
+ public boolean hasValidMaterialData() {
+ return (this.mMaterial != null) && (this.mMaterial.mMaterial != null);
+ }
+
+ public ArrayList<GregtechMaterialStack> getAllGT_MaterialStacks() {
+ final ArrayList<GregtechMaterialStack> rList = new ArrayList<>();
+ if (this.hasValidMaterialData()) {
+ rList.add(this.mMaterial);
+ }
+ rList.addAll(Arrays.asList(this.mByProducts));
+ return rList;
+ }
+
+ public GregtechMaterialStack getByProduct(final int aIndex) {
+ return (aIndex >= 0) && (aIndex < this.mByProducts.length) ? this.mByProducts[aIndex] : null;
+ }
+
+ @Override
+ public String toString() {
+ if ((this.mPrefix == null) || (this.mMaterial == null) || (this.mMaterial.mMaterial == null)) {
+ return "";
+ }
+ return this.mPrefix.name() + this.mMaterial.mMaterial.name();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechMaterialStack.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechMaterialStack.java
new file mode 100644
index 0000000000..d1ee02f480
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/objects/GregtechMaterialStack.java
@@ -0,0 +1,55 @@
+package gtPlusPlus.xmod.gregtech.api.objects;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+
+public class GregtechMaterialStack implements Cloneable {
+
+ public long mAmount;
+ public GT_Materials mMaterial;
+
+ public GregtechMaterialStack(final GT_Materials aMaterial, final long aAmount) {
+ this.mMaterial = aMaterial == null ? GT_Materials._NULL : aMaterial;
+ this.mAmount = aAmount;
+ }
+
+ public GregtechMaterialStack copy(final long aAmount) {
+ return new GregtechMaterialStack(this.mMaterial, aAmount);
+ }
+
+ @Override
+ public GregtechMaterialStack clone() {
+ return new GregtechMaterialStack(this.mMaterial, this.mAmount);
+ }
+
+ @Override
+ public boolean equals(final Object aObject) {
+ if (aObject == this) {
+ return true;
+ }
+ if (aObject == null) {
+ return false;
+ }
+ if (aObject instanceof GT_Materials) {
+ return aObject == this.mMaterial;
+ }
+ if (aObject instanceof GregtechMaterialStack) {
+ return (((GregtechMaterialStack) aObject).mMaterial == this.mMaterial)
+ && ((this.mAmount < 0) || (((GregtechMaterialStack) aObject).mAmount < 0)
+ || (((GregtechMaterialStack) aObject).mAmount == this.mAmount));
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return ((this.mMaterial.mMaterialList.size() > 1) && (this.mAmount > 1) ? "(" : "")
+ + this.mMaterial.getToolTip(true)
+ + ((this.mMaterial.mMaterialList.size() > 1) && (this.mAmount > 1) ? ")" : "")
+ + (this.mAmount > 1 ? this.mAmount : "");
+ }
+
+ @Override
+ public int hashCode() {
+ return this.mMaterial.hashCode();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/util/GTPP_Config.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/util/GTPP_Config.java
new file mode 100644
index 0000000000..65beea207a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/util/GTPP_Config.java
@@ -0,0 +1,123 @@
+package gtPlusPlus.xmod.gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.E;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.common.config.Property;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class GTPP_Config implements Runnable {
+
+ public static boolean troll = false;
+
+ public static Configuration sConfigFileIDs;
+ public final Configuration mConfig;
+
+ public GTPP_Config(Configuration aConfig) {
+ mConfig = aConfig;
+ mConfig.load();
+ mConfig.save();
+ }
+
+ public static int addIDConfig(Object aCategory, String aName, int aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = sConfigFileIDs.get(
+ aCategory.toString()
+ .replaceAll("\\|", "."),
+ aName.replaceAll("\\|", "."),
+ aDefault);
+ int rResult = tProperty.getInt(aDefault);
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) sConfigFileIDs.save();
+ return rResult;
+ }
+
+ public static String getStackConfigName(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return E;
+ Object rName = GT_OreDictUnificator.getAssociation(aStack);
+ if (rName != null) return rName.toString();
+ try {
+ if (GT_Utility.isStringValid(rName = aStack.getUnlocalizedName())) return rName.toString();
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ String sName = aStack.getItem()
+ .toString();
+ String[] tmp = sName.split("@");
+ if (tmp.length > 0) sName = tmp[0];
+ return sName + "." + aStack.getItemDamage();
+ }
+
+ public boolean get(Object aCategory, ItemStack aStack, boolean aDefault) {
+ String aName = getStackConfigName(aStack);
+ return get(aCategory, aName, aDefault);
+ }
+
+ public boolean get(Object aCategory, String aName, boolean aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ (aName + "_" + aDefault).replaceAll("\\|", "_"),
+ aDefault);
+ boolean rResult = tProperty.getBoolean(aDefault);
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save();
+ return rResult;
+ }
+
+ public int get(Object aCategory, ItemStack aStack, int aDefault) {
+ return get(aCategory, getStackConfigName(aStack), aDefault);
+ }
+
+ public int get(Object aCategory, String aName, int aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ (aName + "_" + aDefault).replaceAll("\\|", "_"),
+ aDefault);
+ int rResult = tProperty.getInt(aDefault);
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save();
+ return rResult;
+ }
+
+ public double get(Object aCategory, ItemStack aStack, double aDefault) {
+ return get(aCategory, getStackConfigName(aStack), aDefault);
+ }
+
+ public double get(Object aCategory, String aName, double aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ (aName + "_" + aDefault).replaceAll("\\|", "_"),
+ aDefault);
+ double rResult = tProperty.getDouble(aDefault);
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save();
+ return rResult;
+ }
+
+ public String get(Object aCategory, ItemStack aStack, String aDefault) {
+ return get(aCategory, getStackConfigName(aStack), aDefault);
+ }
+
+ public String get(Object aCategory, String aName, String aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ (aName + "_" + aDefault).replaceAll("\\|", "_"),
+ aDefault);
+ String rResult = tProperty.getString();
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save();
+ return rResult;
+ }
+
+ @Override
+ public void run() {
+ mConfig.save();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/util/SpecialBehaviourTooltipHandler.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/util/SpecialBehaviourTooltipHandler.java
new file mode 100644
index 0000000000..df95b7de2b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/api/util/SpecialBehaviourTooltipHandler.java
@@ -0,0 +1,35 @@
+package gtPlusPlus.xmod.gregtech.api.util;
+
+import java.util.HashMap;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.event.entity.player.ItemTooltipEvent;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.api.util.GT_Utility;
+
+public class SpecialBehaviourTooltipHandler {
+
+ private static final HashMap<ItemStack, String> mTooltipCache = new HashMap<>();
+
+ public static void addTooltipForItem(ItemStack aStack, String aTooltip) {
+ mTooltipCache.put(aStack, aTooltip);
+ }
+
+ @SubscribeEvent
+ public void onItemTooltip(ItemTooltipEvent event) {
+ if (event != null) {
+ if (event.itemStack != null) {
+ for (ItemStack aKey : mTooltipCache.keySet()) {
+ if (GT_Utility.areStacksEqual(aKey, event.itemStack, false)) {
+ String s = mTooltipCache.get(aKey);
+ if (s != null && s.length() > 0) {
+ event.toolTip.add(EnumChatFormatting.RED + s);
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy.java
new file mode 100644
index 0000000000..c53e217560
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy.java
@@ -0,0 +1,96 @@
+package gtPlusPlus.xmod.gregtech.common;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import cpw.mods.fml.common.registry.LanguageRegistry;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.TAE;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.handler.AchievementHandler;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.LangUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.common.covers.CoverManager;
+import ic2.core.init.BlocksItems;
+import ic2.core.init.InternalName;
+
+public class Meta_GT_Proxy {
+
+ public static AchievementHandler mAssemblyAchievements;
+
+ public Meta_GT_Proxy() {}
+
+ public static void preInit() {
+ fixIC2FluidNames();
+ CoverManager.generateCustomCovers();
+ }
+
+ public static void init() {
+ PollutionUtils.setPollutionFluids();
+ fixIC2FluidNames();
+ }
+
+ public static void postInit() {
+ mAssemblyAchievements = new AchievementHandler();
+ fixIC2FluidNames();
+
+ // Finalise TAE
+ TAE.finalizeTAE();
+ }
+
+ @SuppressWarnings("deprecation")
+ public static void fixIC2FluidNames() {
+ // Fix IC2 Hot Water name
+ try {
+ String aNewHeatedWaterName = "Heated Water";
+ Logger.INFO("Renaming [IC2 Hotspring Water] --> [" + aNewHeatedWaterName + "].");
+ LanguageRegistry.instance()
+ .addStringLocalization("fluidHotWater", "Heated Water");
+ LanguageRegistry.instance()
+ .addStringLocalization("fluidHotWater", aNewHeatedWaterName);
+ LanguageRegistry.instance()
+ .addStringLocalization("ic2.fluidHotWater", aNewHeatedWaterName);
+ GT_LanguageManager.addStringLocalization("fluidHotWater", aNewHeatedWaterName);
+ GT_LanguageManager.addStringLocalization("ic2.fluidHotWater", aNewHeatedWaterName);
+
+ Block b = BlocksItems.getFluidBlock(InternalName.fluidHotWater);
+ if (b != null) {
+ LanguageRegistry.addName(ItemUtils.getSimpleStack(b), aNewHeatedWaterName);
+ LanguageRegistry.instance()
+ .addStringLocalization(b.getUnlocalizedName(), aNewHeatedWaterName);
+ GT_LanguageManager.addStringLocalization(b.getUnlocalizedName(), aNewHeatedWaterName);
+ }
+ Fluid f = BlocksItems.getFluid(InternalName.fluidHotWater);
+ if (f != null) {
+ LanguageRegistry.instance()
+ .addStringLocalization(f.getUnlocalizedName(), aNewHeatedWaterName);
+ GT_LanguageManager.addStringLocalization(f.getUnlocalizedName(), aNewHeatedWaterName);
+ int aDam = FluidRegistry.getFluidID(f);
+ ItemStack s = ItemList.Display_Fluid.getWithDamage(1, aDam);
+ if (s != null) {
+ LanguageRegistry.addName(s, aNewHeatedWaterName);
+ }
+ }
+
+ String[] aLangs = new String[] { "de_DE", "en_US", "en_GB", "en_IC", "es_AR", "es_ES", "es_MX", "es_UY",
+ "es_VE", "fr_CA", "fr_FR", "it_IT", "ko_KR", "pt_BR", "pt_PT", "ru_RU", "sv_SE", "tr_TR", "zh_CN",
+ "zh_TW", };
+ String[] aLangValues = new String[] { "Erhitztes Wasser", "Heated Water", "Heated Water", "Heated Water",
+ "Agua caliente", "Agua caliente", "Agua caliente", "Agua caliente", "Agua caliente", "Eau chauffée",
+ "Eau chauffée", "Acqua riscaldata", "온수", "Água aquecida", "Água aquecida", "Вода с подогревом",
+ "Uppvärmt vatten", "Isıtılmış Su", "热水", "热水", };
+ for (int i = 0; i < aLangs.length; i++) {
+ Logger
+ .REFLECTION("Trying to inject new lang data for " + aLangs[i] + ", using value: " + aLangValues[i]);
+ LangUtils.rewriteEntryForLanguageRegistry(aLangs[i], "fluidHotWater", aLangValues[i]);
+ LangUtils.rewriteEntryForLanguageRegistry(aLangs[i], "ic2.fluidHotWater", aLangValues[i]);
+ }
+ } catch (Throwable t) {
+
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks.java
new file mode 100644
index 0000000000..ee0d040394
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks.java
@@ -0,0 +1,79 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.TAE;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.CasingTextureHandler;
+
+public class GregtechMetaCasingBlocks extends GregtechMetaCasingBlocksAbstract {
+
+ CasingTextureHandler TextureHandler = new CasingTextureHandler();
+
+ public GregtechMetaCasingBlocks() {
+ super(GregtechMetaCasingItems.class, "miscutils.blockcasings", GT_Material_Casings.INSTANCE);
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ if (i == 2 || i == 3 || i == 4) {
+ continue;
+ }
+ TAE.registerTexture(0, i, new GTPP_CopiedBlockTexture(this, 6, i));
+ }
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Centrifuge Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Structural Coke Oven Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".2.name", "Heat Resistant Coke Oven Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Heat Proof Coke Oven Casing"); // 60
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".4.name", "Material Press Machine Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Electrolyzer Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Wire Factory Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".7.name", "Maceration Stack Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".8.name", "Matter Generation Coil"); // 65
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Matter Fabricator Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "Iron Plated Bricks");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".11.name", "Multitank Exterior Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".12.name", "Hastelloy-N Reactor Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".13.name", "Zeron-100 Reactor Shielding");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".14.name", "Blast Smelter Heat Containment Coil ");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".15.name", "Blast Smelter Casing Block");
+ GregtechItemList.Casing_Centrifuge1.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_CokeOven.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_CokeOven_Coil1.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_CokeOven_Coil2.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Casing_MaterialPress.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Casing_Electrolyzer.set(new ItemStack(this, 1, 5));
+ GregtechItemList.Casing_WireFactory.set(new ItemStack(this, 1, 6));
+ GregtechItemList.Casing_MacerationStack.set(new ItemStack(this, 1, 7));
+ GregtechItemList.Casing_MatterGen.set(new ItemStack(this, 1, 8));
+ GregtechItemList.Casing_MatterFab.set(new ItemStack(this, 1, 9));
+ GregtechItemList.Casing_IronPlatedBricks.set(new ItemStack(this, 1, 10));
+ GregtechItemList.Casing_MultitankExterior.set(new ItemStack(this, 1, 11));
+ GregtechItemList.Casing_Reactor_I.set(new ItemStack(this, 1, 12));
+ GregtechItemList.Casing_Reactor_II.set(new ItemStack(this, 1, 13));
+ GregtechItemList.Casing_Coil_BlastSmelter.set(new ItemStack(this, 1, 14));
+ GregtechItemList.Casing_BlastSmelter.set(new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) { // Texture ID's. case 0 == ID[57]
+ return CasingTextureHandler.getIcon(ordinalSide, aMeta);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide) {
+ final GregtechMetaCasingBlocks i = this;
+ return CasingTextureHandler
+ .handleCasingsGT(aWorld, xCoord, yCoord, zCoord, ForgeDirection.getOrientation(ordinalSide), i);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks2.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks2.java
new file mode 100644
index 0000000000..9d53c281a2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks2.java
@@ -0,0 +1,111 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+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.IIcon;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.CasingTextureHandler2;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.storage.GregtechMetaTileEntity_PowerSubStationController;
+
+public class GregtechMetaCasingBlocks2 extends GregtechMetaCasingBlocksAbstract {
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ aList.add(new ItemStack(aItem, 1, 0));
+ aList.add(new ItemStack(aItem, 1, 1));
+ aList.add(new ItemStack(aItem, 1, 2));
+ aList.add(new ItemStack(aItem, 1, 3));
+ aList.add(new ItemStack(aItem, 1, 4));
+ aList.add(new ItemStack(aItem, 1, 5));
+ aList.add(new ItemStack(aItem, 1, 6));
+ aList.add(new ItemStack(aItem, 1, 7));
+ aList.add(new ItemStack(aItem, 1, 8));
+ aList.add(new ItemStack(aItem, 1, 9));
+ aList.add(new ItemStack(aItem, 1, 10));
+ aList.add(new ItemStack(aItem, 1, 11));
+ aList.add(new ItemStack(aItem, 1, 12));
+ aList.add(new ItemStack(aItem, 1, 13));
+
+ aList.add(new ItemStack(aItem, 1, 15));
+
+ }
+
+ public static class GregtechMetaCasingItemBlocks2 extends GregtechMetaCasingItems {
+
+ public GregtechMetaCasingItemBlocks2(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ int meta = aStack.getItemDamage();
+ int tier = GregtechMetaTileEntity_PowerSubStationController.getCellTier(field_150939_a, meta);
+ if (meta == 7 && tier > 0) {
+ long capacity = GregtechMetaTileEntity_PowerSubStationController.getCapacityFromCellTier(tier);
+ aList.add("Energy Storage: " + GT_Utility.formatNumbers(capacity));
+ }
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaCasingBlocks2() {
+ super(GregtechMetaCasingItemBlocks2.class, "gtplusplus.blockcasings.2", GT_Material_Casings.INSTANCE);
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ if (i == 4 || i == 10 || i == 11 || i == 12 || i == 14) {
+ continue;
+ }
+ TAE.registerTexture(1, i, new GTPP_CopiedBlockTexture(this, 6, i));
+ }
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Thermal Processing Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Hastelloy-N Sealant Block");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "Hastelloy-X Structural Block");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".3.name", "Incoloy-DS Fluid Containment Block");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".4.name", "Wash Plant Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Industrial Sieve Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Large Sieve Grate");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".7.name", "Vanadium Redox Power Cell (EV)");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".8.name", "Sub-Station External Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Cyclotron Coil");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "Cyclotron Outer Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".11.name", "Thermal Containment Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".12.name", "Bulk Production Frame");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".13.name", "Cutting Factory Frame");
+
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".15.name", "Sterile Farm Casing");
+
+ GregtechItemList.Casing_ThermalCentrifuge.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_Refinery_External.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_Refinery_Structural.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_Refinery_Internal.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Casing_WashPlant.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Casing_Sifter.set(new ItemStack(this, 1, 5));
+ GregtechItemList.Casing_SifterGrate.set(new ItemStack(this, 1, 6));
+ GregtechItemList.Casing_Vanadium_Redox.set(new ItemStack(this, 1, 7));
+ GregtechItemList.Casing_Power_SubStation.set(new ItemStack(this, 1, 8));
+ GregtechItemList.Casing_Cyclotron_Coil.set(new ItemStack(this, 1, 9));
+ GregtechItemList.Casing_Cyclotron_External.set(new ItemStack(this, 1, 10));
+ GregtechItemList.Casing_ThermalContainment.set(new ItemStack(this, 1, 11));
+ GregtechItemList.Casing_Autocrafter.set(new ItemStack(this, 1, 12));
+ GregtechItemList.Casing_CuttingFactoryFrame.set(new ItemStack(this, 1, 13));
+
+ GregtechItemList.Casing_PLACEHOLDER_TreeFarmer.set(new ItemStack(this, 1, 15)); // Tree Farmer Textures
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return CasingTextureHandler2.getIcon(ordinalSide, aMeta);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks3.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks3.java
new file mode 100644
index 0000000000..76fb077de1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks3.java
@@ -0,0 +1,379 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.TAE;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.CasingTextureHandler3;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.storage.GregtechMetaTileEntity_PowerSubStationController;
+
+public class GregtechMetaCasingBlocks3 extends GregtechMetaCasingBlocksAbstract {
+
+ public static boolean mConnectedMachineTextures = false;
+ CasingTextureHandler3 TextureHandler = new CasingTextureHandler3();
+
+ public static class GregtechMetaCasingItemBlocks3 extends GregtechMetaCasingItems {
+
+ public GregtechMetaCasingItemBlocks3(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ int meta = aStack.getItemDamage();
+ int tier = GregtechMetaTileEntity_PowerSubStationController.getCellTier(field_150939_a, meta);
+ if (tier > 0) {
+ long capacity = GregtechMetaTileEntity_PowerSubStationController.getCapacityFromCellTier(tier);
+ aList.add("Energy Storage: " + GT_Utility.formatNumbers(capacity));
+ }
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaCasingBlocks3() {
+ super(GregtechMetaCasingItemBlocks3.class, "gtplusplus.blockcasings.3", GT_Material_Casings.INSTANCE);
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ // Free up Redox casing in TAE
+ if (i >= 4 && i <= 8) {
+ continue;
+ }
+ TAE.registerTexture(2, i, new GTPP_CopiedBlockTexture(this, 6, i));
+ }
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Aquatic Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Inconel Reinforced Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "Multi-Use Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Trinium Plated Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".4.name", "Vanadium Redox Power Cell (IV)");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".5.name", "Vanadium Redox Power Cell (LuV)");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".6.name", "Vanadium Redox Power Cell (ZPM)");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".7.name", "Vanadium Redox Power Cell (UV)");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".8.name", "Vanadium Redox Power Cell (UHV)");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Supply Depot Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "Advanced Cryogenic Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".11.name", "Volcanus Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".12.name", "Fusion Machine Casing MK III");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".13.name", "Advanced Fusion Coil");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".14.name", "Unnamed"); // Can Use, don't
+ // change texture
+ // (Used for Fusion
+ // MK4)
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".15.name", "Containment Casing");
+ GregtechItemList.Casing_FishPond.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_Extruder.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_Multi_Use.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_BedrockMiner.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Casing_Vanadium_Redox_IV.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Casing_Vanadium_Redox_LuV.set(new ItemStack(this, 1, 5));
+ GregtechItemList.Casing_Vanadium_Redox_ZPM.set(new ItemStack(this, 1, 6));
+ GregtechItemList.Casing_Vanadium_Redox_UV.set(new ItemStack(this, 1, 7));
+ GregtechItemList.Casing_Vanadium_Redox_MAX.set(new ItemStack(this, 1, 8));
+ GregtechItemList.Casing_AmazonWarehouse.set(new ItemStack(this, 1, 9));
+ GregtechItemList.Casing_AdvancedVacuum.set(new ItemStack(this, 1, 10));
+ GregtechItemList.Casing_Adv_BlastFurnace.set(new ItemStack(this, 1, 11));
+ GregtechItemList.Casing_Fusion_External.set(new ItemStack(this, 1, 12));
+ GregtechItemList.Casing_Fusion_Internal.set(new ItemStack(this, 1, 13));
+ GregtechItemList.Casing_Containment.set(new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return CasingTextureHandler3.getIcon(ordinalSide, aMeta);
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public IIcon getIcon(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide) {
+ final Block thisBlock = aWorld.getBlock(xCoord, yCoord, zCoord);
+ final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ if ((tMeta != 12) || !GregtechMetaCasingBlocks3.mConnectedMachineTextures) {
+ return getIcon(ordinalSide, tMeta);
+ }
+ final int tStartIndex = 0;
+ if (tMeta == 12) {
+ final boolean[] tConnectedSides = {
+ aWorld.getBlock(xCoord, yCoord - 1, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord - 1, zCoord) == tMeta,
+ aWorld.getBlock(xCoord, yCoord + 1, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord + 1, zCoord) == tMeta,
+ aWorld.getBlock(xCoord + 1, yCoord, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord + 1, yCoord, zCoord) == tMeta,
+ aWorld.getBlock(xCoord, yCoord, zCoord + 1) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord, zCoord + 1) == tMeta,
+ aWorld.getBlock(xCoord - 1, yCoord, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord - 1, yCoord, zCoord) == tMeta,
+ aWorld.getBlock(xCoord, yCoord, zCoord - 1) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord, zCoord - 1) == tMeta };
+ switch (ordinalSide) {
+ case 0: {
+ if (tConnectedSides[0]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 5].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 8].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 9].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 10].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 11].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[2]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[5] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 0].getIcon();
+ }
+ }
+ case 1: {
+ if (tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 5].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 8].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 9].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 10].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 11].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[3] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 0].getIcon();
+ }
+ }
+ case 2: {
+ if (tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 3].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 11].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 10].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 9].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 8].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 0].getIcon();
+ }
+ }
+ case 3: {
+ if (tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 3].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 10].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 11].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 8].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 9].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 0].getIcon();
+ }
+ }
+ case 4: {
+ if (tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 2].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 10].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 9].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 8].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 11].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 0].getIcon();
+ }
+ if (!tConnectedSides[3] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 1].getIcon();
+ }
+ }
+ case 5: {
+ if (tConnectedSides[2]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 4].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 11].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 8].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 9].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 10].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 0].getIcon();
+ }
+ if (!tConnectedSides[3] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 1].getIcon();
+ }
+ break;
+ }
+ }
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS[tStartIndex + 7].getIcon();
+ }
+ return CasingTextureHandler3.getIcon(ordinalSide, tMeta);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks4.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks4.java
new file mode 100644
index 0000000000..a150d7e828
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks4.java
@@ -0,0 +1,126 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaCasingBlocks4 extends GregtechMetaCasingBlocksAbstract {
+
+ public GregtechMetaCasingBlocks4() {
+ super(GregtechMetaCasingItems.class, "gtplusplus.blockcasings.4", GT_Material_Casings.INSTANCE);
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ if (i == 2 || i == 4 || i == 5 || i == 6 || i == 7 || i == 8 || i == 12 || i == 13 || i == 14 || i == 15) {
+ continue;
+ }
+ TAE.registerTexture(3, i, new GTPP_CopiedBlockTexture(this, 6, i));
+ }
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Naquadah Reactor Base");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Reactor Piping");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "Naquadah Containment Chamber");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Tempered Arc Furnace Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".4.name", "Quantum Force Transformer Coil Casings");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "Vacuum Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".11.name", "Turbodyne Casing");
+
+ GregtechItemList.Casing_Naq_Reactor_A.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_Naq_Reactor_B.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_Naq_Reactor_C.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_Industrial_Arc_Furnace.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Casing_Coil_QuantumForceTransformer.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Casing_Vacuum_Furnace.set(new ItemStack(this, 1, 10));
+ GregtechItemList.Casing_RocketEngine.set(new ItemStack(this, 1, 11));
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return getStaticIcon((byte) ordinalSide, (byte) aMeta);
+ }
+
+ public static IIcon getStaticIcon(final byte aSide, final byte aMeta) {
+ // Texture ID's. case 0 == ID[57]
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ switch (aMeta) {
+ case 0 -> {
+ return TexturesGtBlock.Casing_Trinium_Titanium.getIcon();
+ }
+ case 1 -> {
+ return TexturesGtBlock.TEXTURE_TECH_C.getIcon();
+ }
+ case 2 -> {
+ return TexturesGtBlock.TEXTURE_ORGANIC_PANEL_A_GLOWING.getIcon();
+ }
+ case 3 -> {
+ return TexturesGtBlock.TEXTURE_METAL_PANEL_A.getIcon();
+ }
+ case 4 -> {
+ return TexturesGtBlock.Casing_Coil_QFT.getIcon();
+ }
+ case 5 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 6 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 7 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 8 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 9 -> {
+ return TexturesGtBlock.Casing_Material_MaragingSteel.getIcon();
+ }
+ case 10 -> {
+ if (aSide < 2) {
+ return TexturesGtBlock.TEXTURE_STONE_RED_B.getIcon();
+ } else {
+ return TexturesGtBlock.TEXTURE_STONE_RED_A.getIcon();
+ }
+ }
+ case 11 -> {
+ return TexturesGtBlock.TEXTURE_CASING_ROCKETDYNE.getIcon();
+ }
+ case 12 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 13 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 14 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 15 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ default -> {
+ return TexturesGtBlock.Casing_Material_MaragingSteel.getIcon();
+ }
+ }
+ }
+ return TexturesGtBlock._PlaceHolder.getIcon();
+ }
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ aList.add(new ItemStack(aItem, 1, 0));
+ aList.add(new ItemStack(aItem, 1, 1));
+ aList.add(new ItemStack(aItem, 1, 2));
+ aList.add(new ItemStack(aItem, 1, 3));
+ aList.add(new ItemStack(aItem, 1, 4));
+
+ aList.add(new ItemStack(aItem, 1, 10));
+ aList.add(new ItemStack(aItem, 1, 11));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks5.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks5.java
new file mode 100644
index 0000000000..cc573cd188
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks5.java
@@ -0,0 +1,159 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGrinderMultiblock;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaCasingBlocks5 extends GregtechMetaCasingBlocksAbstract {
+
+ // Free Indexes within TAE: 91, 92, 94, 100, 101, 102, 103, 104, 114, 116, 117, 118, 119, 120, 121, 124, 125, 126,
+ // 127
+ // 19 Free Indexes
+ private static final TexturesGrinderMultiblock mGrinderOverlayHandler = new TexturesGrinderMultiblock();
+
+ public GregtechMetaCasingBlocks5() {
+ super(GregtechMetaCasingItems.class, "gtplusplus.blockcasings.5", GT_Material_Casings.INSTANCE);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "IsaMill Exterior Casing"); // IsaMill
+ // Casing
+ TAE.registerTexture(0, 2, new GTPP_CopiedBlockTexture(this, 6, 0));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "IsaMill Piping"); // IsaMill
+ // Pipe
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "IsaMill Gearbox"); // IsaMill
+ // Gearbox
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Elemental Confinement Shell"); // Duplicator
+ // Casing
+ TAE.registerTexture(0, 3, new GTPP_CopiedBlockTexture(this, 6, 3));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".4.name", "Sparge Tower Exterior Casing"); // Sparge
+ // Tower
+ // Casing
+ TAE.registerTexture(0, 4, new GTPP_CopiedBlockTexture(this, 6, 4));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Sturdy Printer Casing"); // Unused
+ TAE.registerTexture(1, 10, new GTPP_CopiedBlockTexture(this, 6, 5));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Forge Casing"); // Forge Hammer
+ // Casing
+ TAE.registerTexture(1, 11, new GTPP_CopiedBlockTexture(this, 6, 6));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".7.name", "Neutron Pulse Manipulator");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".8.name", "Cosmic Fabric Manipulator");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Infinity Infused Manipulator");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "SpaceTime Continuum Ripper");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".11.name", "Neutron Shielding Core");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".12.name", "Cosmic Fabric Shielding Core");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".13.name", "Infinity Infused Shielding Core");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".14.name", "SpaceTime Bending Core");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".15.name", "Force Field Glass");
+
+ GregtechItemList.Casing_IsaMill_Casing.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_IsaMill_Pipe.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_IsaMill_Gearbox.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_ElementalDuplicator.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Casing_Sparge_Tower_Exterior.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Casing_IndustrialAutoChisel.set(new ItemStack(this, 1, 5));
+ GregtechItemList.Casing_IndustrialForgeHammer.set(new ItemStack(this, 1, 6));
+ GregtechItemList.NeutronPulseManipulator.set(new ItemStack(this, 1, 7));
+ GregtechItemList.CosmicFabricManipulator.set(new ItemStack(this, 1, 8));
+ GregtechItemList.InfinityInfusedManipulator.set(new ItemStack(this, 1, 9));
+ GregtechItemList.SpaceTimeContinuumRipper.set(new ItemStack(this, 1, 10));
+ GregtechItemList.NeutronShieldingCore.set(new ItemStack(this, 1, 11));
+ GregtechItemList.CosmicFabricShieldingCore.set(new ItemStack(this, 1, 12));
+ GregtechItemList.InfinityInfusedShieldingCore.set(new ItemStack(this, 1, 13));
+ GregtechItemList.SpaceTimeBendingCore.set(new ItemStack(this, 1, 14));
+ GregtechItemList.ForceFieldGlass.set(new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return getStaticIcon(ordinalSide, aMeta);
+ }
+
+ public static IIcon getStaticIcon(final int ordinalSide, final int aMeta) {
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ switch (aMeta) {
+ case 0 -> {
+ return TexturesGtBlock.TEXTURE_PIPE_GRINDING_MILL.getIcon();
+ }
+ case 1 -> {
+ return TexturesGtBlock.TEXTURE_CASING_GRINDING_MILL.getIcon();
+ }
+ case 2 -> {
+ return TexturesGtBlock.TEXTURE_GEARBOX_GRINDING_MILL.getIcon();
+ }
+ case 3 -> {
+ return TexturesGtBlock.TEXTURE_TECH_PANEL_D.getIcon();
+ }
+ case 4 -> {
+ return TexturesGtBlock.Casing_Machine_Metal_Sheet_H.getIcon();
+ }
+ case 5 -> {
+ return TexturesGtBlock.Casing_Machine_Metal_Sheet_I.getIcon();
+ }
+ case 6 -> {
+ return TexturesGtBlock.TEXTURE_TECH_PANEL_H.getIcon();
+ }
+ case 7 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return TexturesGtBlock.Manipulator_Top.getIcon();
+ }
+ return TexturesGtBlock.NeutronPulseManipulator.getIcon();
+ }
+ case 8 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return TexturesGtBlock.Manipulator_Top.getIcon();
+ }
+ return TexturesGtBlock.CosmicFabricManipulator.getIcon();
+ }
+ case 9 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return TexturesGtBlock.Manipulator_Top.getIcon();
+ }
+ return TexturesGtBlock.InfinityInfusedManipulator.getIcon();
+ }
+ case 10 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return TexturesGtBlock.Manipulator_Top.getIcon();
+ }
+ return TexturesGtBlock.SpaceTimeContinuumRipper.getIcon();
+ }
+ case 11 -> {
+ return TexturesGtBlock.NeutronShieldingCore.getIcon();
+ }
+ case 12 -> {
+ return TexturesGtBlock.CosmicFabricShieldingCore.getIcon();
+ }
+ case 13 -> {
+ return TexturesGtBlock.InfinityInfusedShieldingCore.getIcon();
+ }
+ case 14 -> {
+ return TexturesGtBlock.SpaceTimeBendingCore.getIcon();
+ }
+ case 15 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return TexturesGtBlock.Blank.getIcon();
+ }
+ return TexturesGtBlock.ForceFieldGlass.getIcon();
+ }
+ }
+ }
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide) {
+ final GregtechMetaCasingBlocks5 i = this;
+ return mGrinderOverlayHandler.handleCasingsGT(aWorld, xCoord, yCoord, zCoord, ordinalSide, i);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks6.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks6.java
new file mode 100644
index 0000000000..d257078461
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocks6.java
@@ -0,0 +1,341 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+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.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.TAE;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.CasingTextureHandler6;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaCasingBlocks6 extends GregtechMetaCasingBlocksAbstract {
+
+ public static boolean mConnectedMachineTextures = false;
+ CasingTextureHandler6 TextureHandler = new CasingTextureHandler6();
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ for (int i = 0; i < 3; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+
+ public static class GregtechMetaCasingItemBlocks3 extends GregtechMetaCasingItems {
+
+ public GregtechMetaCasingItemBlocks3(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaCasingBlocks6() {
+ super(GregtechMetaCasingItemBlocks3.class, "gtplusplus.blockcasings.6", GT_Material_Casings.INSTANCE);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Fusion Machine Casing MK IV");
+ TAE.registerTexture(3, 4, new GTPP_CopiedBlockTexture(this, 6, 0));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Advanced Fusion Coil II");
+ TAE.registerTexture(3, 5, new GTPP_CopiedBlockTexture(this, 6, 1));
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "Unnamed");
+ TAE.registerTexture(3, 6, new GTPP_CopiedBlockTexture(this, 6, 2));
+ GregtechItemList.Casing_Fusion_External2.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_Fusion_Internal2.set(new ItemStack(this, 1, 1));
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return CasingTextureHandler6.getIcon(ordinalSide, aMeta);
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public IIcon getIcon(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide) {
+ final Block thisBlock = aWorld.getBlock(xCoord, yCoord, zCoord);
+ final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ if ((tMeta != 0) || !GregtechMetaCasingBlocks6.mConnectedMachineTextures) {
+ return getIcon(ordinalSide, tMeta);
+ }
+ final int tStartIndex = 0;
+ if (tMeta == 0) {
+ final boolean[] tConnectedSides = {
+ aWorld.getBlock(xCoord, yCoord - 1, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord - 1, zCoord) == tMeta,
+ aWorld.getBlock(xCoord, yCoord + 1, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord + 1, zCoord) == tMeta,
+ aWorld.getBlock(xCoord + 1, yCoord, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord + 1, yCoord, zCoord) == tMeta,
+ aWorld.getBlock(xCoord, yCoord, zCoord + 1) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord, zCoord + 1) == tMeta,
+ aWorld.getBlock(xCoord - 1, yCoord, zCoord) == thisBlock
+ && aWorld.getBlockMetadata(xCoord - 1, yCoord, zCoord) == tMeta,
+ aWorld.getBlock(xCoord, yCoord, zCoord - 1) == thisBlock
+ && aWorld.getBlockMetadata(xCoord, yCoord, zCoord - 1) == tMeta };
+ switch (ordinalSide) {
+ case 0: {
+ if (tConnectedSides[0]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 5].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 8].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 9].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 10].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 11].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[2]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[5] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 0].getIcon();
+ }
+ }
+ case 1: {
+ if (tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 5].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 8].getIcon();
+ }
+ if (tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 9].getIcon();
+ }
+ if (tConnectedSides[4] && tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 10].getIcon();
+ }
+ if (!tConnectedSides[4] && tConnectedSides[5] && tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 11].getIcon();
+ }
+ if (!tConnectedSides[4] && !tConnectedSides[5] && !tConnectedSides[2] && !tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[3] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 0].getIcon();
+ }
+ }
+ case 2: {
+ if (tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 3].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 11].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 10].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 9].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 8].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 0].getIcon();
+ }
+ }
+ case 3: {
+ if (tConnectedSides[3]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 3].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 10].getIcon();
+ }
+ if (tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 11].getIcon();
+ }
+ if (tConnectedSides[2] && tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 8].getIcon();
+ }
+ if (!tConnectedSides[2] && tConnectedSides[0] && tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 9].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[0] && !tConnectedSides[4] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[2] && !tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 1].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 0].getIcon();
+ }
+ }
+ case 4: {
+ if (tConnectedSides[4]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 4].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 2].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 10].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 9].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 8].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 11].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 0].getIcon();
+ }
+ if (!tConnectedSides[3] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 1].getIcon();
+ }
+ }
+ case 5: {
+ if (tConnectedSides[2]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 6].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 5].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 2].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 3].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 4].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 11].getIcon();
+ }
+ if (tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 8].getIcon();
+ }
+ if (tConnectedSides[0] && tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 9].getIcon();
+ }
+ if (!tConnectedSides[0] && tConnectedSides[3] && tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 10].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[3] && !tConnectedSides[1] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ if (!tConnectedSides[0] && !tConnectedSides[1]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 0].getIcon();
+ }
+ if (!tConnectedSides[3] && !tConnectedSides[5]) {
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 1].getIcon();
+ }
+ break;
+ }
+ }
+ return TexturesGtBlock.CONNECTED_FUSION_HULLS_MK4[tStartIndex + 7].getIcon();
+ }
+ return CasingTextureHandler6.getIcon(ordinalSide, tMeta);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksAbstract.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksAbstract.java
new file mode 100644
index 0000000000..a87f6c92b3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksAbstract.java
@@ -0,0 +1,151 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+import java.util.Random;
+
+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.Entity;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Block_Casings_Abstract;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+
+public abstract class GregtechMetaCasingBlocksAbstract extends GT_Block_Casings_Abstract {
+
+ public GregtechMetaCasingBlocksAbstract(final Class<? extends ItemBlock> aItemClass, final String aName,
+ final Material aMaterial) {
+ super(aItemClass, aName, aMaterial);
+ this.setStepSound(soundTypeMetal);
+ this.setCreativeTab(AddToCreativeTab.tabMachines);
+ GregTech_API.registerMachineBlock(this, -1);
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + "." + 32767 + ".name", "Any Sub Block of this");
+ }
+
+ @Override
+ public String getHarvestTool(final int aMeta) {
+ return "wrench";
+ }
+
+ @Override
+ public int getHarvestLevel(final int aMeta) {
+ return 2;
+ }
+
+ @Override
+ public float getBlockHardness(final World aWorld, final int aX, final int aY, final int aZ) {
+ return Blocks.iron_block.getBlockHardness(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public float getExplosionResistance(final Entity aTNT) {
+ return Blocks.iron_block.getExplosionResistance(aTNT);
+ }
+
+ @Override
+ protected boolean canSilkHarvest() {
+ return false;
+ }
+
+ @Override
+ public void onBlockAdded(final World aWorld, final int aX, final int aY, final int aZ) {
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return this.mUnlocalizedName;
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return StatCollector.translateToLocal(this.mUnlocalizedName + ".name");
+ }
+
+ @Override
+ public boolean canBeReplacedByLeaves(final IBlockAccess aWorld, final int aX, final int aY, final int aZ) {
+ return false;
+ }
+
+ @Override
+ public boolean isNormalCube(final IBlockAccess aWorld, final int aX, final int aY, final int aZ) {
+ return true;
+ }
+
+ @Override
+ public boolean renderAsNormalBlock() {
+ return true;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public int getRenderBlockPass() {
+ return 0;
+ }
+
+ @Override
+ public void breakBlock(final World aWorld, final int aX, final int aY, final int aZ, final Block aBlock,
+ final int aMetaData) {
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(final EnumCreatureType type, final IBlockAccess world, final int x, final int y,
+ final int z) {
+ return false;
+ }
+
+ @Override
+ public int damageDropped(final int par1) {
+ return par1;
+ }
+
+ @Override
+ public int getDamageValue(final World par1World, final int par2, final int par3, final int par4) {
+ return par1World.getBlockMetadata(par2, par3, par4);
+ }
+
+ @Override
+ public int quantityDropped(final Random par1Random) {
+ return 1;
+ }
+
+ @Override
+ public Item getItemDropped(final int par1, final Random par2Random, final int par3) {
+ return Item.getItemFromBlock(this);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(final IIconRegister aIconRegister) {}
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(final Item aItem, final CreativeTabs par2CreativeTabs, final List aList) {
+ for (int i = 0; i < 16; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksPipeGearbox.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksPipeGearbox.java
new file mode 100644
index 0000000000..ad2b11f924
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingBlocksPipeGearbox.java
@@ -0,0 +1,91 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.HashMap;
+
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaCasingBlocksPipeGearbox extends GregtechMetaCasingBlocksAbstract {
+
+ private static HashMap<Integer, Integer> sMaterialMapping = new HashMap<>();
+
+ public GregtechMetaCasingBlocksPipeGearbox() {
+ super(GregtechMetaCasingItems.class, "gtplusplus.blockcasings.pipesgears", GT_Material_Casings.INSTANCE);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Eglin Steel Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Inconel-792 Gear Box Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".2.name", "Incoloy MA956 Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Nitinol-60 Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".4.name", "Zeron-100 Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Pikyonium Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Titansteel Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".7.name", "Abyssal Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".8.name", "Babbit Alloy Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Inconel-690 Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "Stellite Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".11.name", "Nitinol-60 Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".12.name", "Lafium Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".13.name", "Cinobite Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".14.name", "Titansteel Pipe Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".15.name", "Abyssal Pipe Casing");
+
+ int aMappingID = 0;
+ sMaterialMapping.put(aMappingID++, ALLOY.EGLIN_STEEL.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.INCONEL_792.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.INCOLOY_MA956.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.NITINOL_60.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.ZERON_100.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.PIKYONIUM.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.TITANSTEEL.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.ABYSSAL.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.BABBIT_ALLOY.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.INCONEL_690.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.STELLITE.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.NITINOL_60.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.LAFIUM.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.CINOBITE.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.TITANSTEEL.getRgbAsHex());
+ sMaterialMapping.put(aMappingID++, ALLOY.ABYSSAL.getRgbAsHex());
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int meta) {
+ if ((meta >= 0) && (meta < 16)) {
+ switch (meta) {
+ case 0, 1, 2, 3, 4, 5, 6, 7 -> {
+ return TexturesGtBlock.TEXTURE_GEARBOX_GENERIC.getIcon();
+ }
+ case 8, 9, 10, 11, 12, 13, 14, 15 -> {
+ return TexturesGtBlock.TEXTURE_PIPE_GENERIC.getIcon();
+ }
+ }
+ }
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public int colorMultiplier(final IBlockAccess par1IBlockAccess, final int par2, final int par3, final int par4) {
+ return sMaterialMapping.get(par1IBlockAccess.getBlockMetadata(par2, par3, par4));
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public int getRenderColor(final int aMeta) {
+ return sMaterialMapping.get(aMeta);
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public int getBlockColor() {
+ return super.getBlockColor();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingItems.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingItems.java
new file mode 100644
index 0000000000..f86c6af265
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaCasingItems.java
@@ -0,0 +1,10 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import net.minecraft.block.Block;
+
+public class GregtechMetaCasingItems extends GregtechMetaItemCasingsAbstract {
+
+ public GregtechMetaCasingItems(final Block par1) {
+ super(par1);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaItemCasingsAbstract.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaItemCasingsAbstract.java
new file mode 100644
index 0000000000..23d9ab5007
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaItemCasingsAbstract.java
@@ -0,0 +1,67 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_LanguageManager;
+
+public abstract class GregtechMetaItemCasingsAbstract extends ItemBlock {
+
+ protected final String mCasing_Centrifuge = GT_LanguageManager
+ .addStringLocalization("mu.centrifugecasing", "Warning! Standing in the Centrifuge not recommended");
+ protected final String mCasing_CokeOven = GT_LanguageManager
+ .addStringLocalization("mu.cokeoven", "Sturdy and Strong");
+ protected final String mCasing_CokeCoil1 = GT_LanguageManager
+ .addStringLocalization("mu.coil01tooltip", "Base Heating Capacity = 1350 Kelvin");
+ protected final String mCasing_CokeCoil2 = GT_LanguageManager
+ .addStringLocalization("mu.coil02tooltip", "Base Heating Capacity = 2275 Kelvin");
+ protected final String mNoMobsToolTip = GT_LanguageManager
+ .addStringLocalization("gt.nomobspawnsonthisblock", "Mobs cannot Spawn on this Block");
+ protected final String mNoTileEntityToolTip = GT_LanguageManager
+ .addStringLocalization("gt.notileentityinthisblock", "This is NOT a TileEntity!");
+
+ public GregtechMetaItemCasingsAbstract(final Block par1) {
+ super(par1);
+ this.setMaxDamage(0);
+ this.setHasSubtypes(true);
+ // setCreativeTab(AddToCreativeTab.tabMachines);
+ }
+
+ @Override
+ public int getMetadata(final int aMeta) {
+ return aMeta;
+ }
+
+ @Override
+ public String getUnlocalizedName(final ItemStack aStack) {
+ return this.field_150939_a.getUnlocalizedName() + "." + this.getDamage(aStack);
+ }
+
+ @Override
+ public void addInformation(final ItemStack aStack, final EntityPlayer aPlayer, final List aList,
+ final boolean aF3_H) {
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ switch (this.getDamage(aStack)) {
+ case 0:
+ // aList.add(this.mCasing_Centrifuge);
+ break;
+ case 1:
+ // aList.add(this.mCasing_CokeOven);
+ break;
+ case 2:
+ // aList.add(this.mCasing_CokeCoil1);
+ break;
+ case 3:
+ // aList.add(this.mCasing_CokeCoil2);
+ break;
+ default:
+ break;
+ }
+ aList.add(this.mNoMobsToolTip);
+ aList.add(this.mNoTileEntityToolTip);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMachineCasings.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMachineCasings.java
new file mode 100644
index 0000000000..473c13f3da
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMachineCasings.java
@@ -0,0 +1,76 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+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.IIcon;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaSpecialMachineCasings extends GregtechMetaCasingBlocksAbstract {
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ for (int i = 0; i < 4; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+
+ public static class SpecialCasingItemBlock extends GregtechMetaCasingItems {
+
+ public SpecialCasingItemBlock(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ int aMeta = aStack.getItemDamage();
+ if (aMeta < 10) {
+ // aList.add("Tier: "+GT_Values.VN[aMeta]);
+ }
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaSpecialMachineCasings() {
+ super(SpecialCasingItemBlock.class, "gtplusplus.blockspecialcasings.2", GT_Material_Casings.INSTANCE);
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ // TAE.registerTextures(new GT_CopiedBlockTexture(this, 6, i));
+ // Don't register these Textures, They already exist within vanilla GT. (May not exist in 5.08)
+ }
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Strong Bronze Machine Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".1.name", "Sturdy Aluminium Machine Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".2.name", "Vigorous Laurenium Machine Casing");
+ TAE.registerTexture(84, new GTPP_CopiedBlockTexture(this, 6, 2));
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".3.name", "Rugged Botmium Machine Casing");
+
+ GregtechItemList.Casing_Machine_Custom_1.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_Machine_Custom_2.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_Machine_Custom_3.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_Machine_Custom_4.set(new ItemStack(this, 1, 3));
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return switch (aMeta) {
+ case 0 -> Textures.BlockIcons.MACHINE_BRONZEPLATEDBRICKS.getIcon();
+ case 1 -> Textures.BlockIcons.MACHINE_CASING_FROST_PROOF.getIcon();
+ case 2 -> TexturesGtBlock.Casing_Material_Laurenium.getIcon();
+ case 3 -> Textures.BlockIcons.MACHINE_HEATPROOFCASING.getIcon();
+ default -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ };
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings.java
new file mode 100644
index 0000000000..1d7c853e71
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings.java
@@ -0,0 +1,120 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.objects.GTPP_CopiedBlockTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.turbine.LargeTurbineTextureHandler;
+
+public class GregtechMetaSpecialMultiCasings extends GregtechMetaCasingBlocksAbstract {
+
+ public static class SpecialCasingItemBlock extends GregtechMetaCasingItems {
+
+ public SpecialCasingItemBlock(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ int aMeta = aStack.getItemDamage();
+ if (aMeta < 10) {
+ // aList.add("Tier: "+GT_Values.VN[aMeta]);
+ }
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaSpecialMultiCasings() {
+ super(SpecialCasingItemBlock.class, "gtplusplus.blockspecialcasings.1", GT_Material_Casings.INSTANCE);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Turbine Shaft");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".1.name", "Reinforced Steam Turbine Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".2.name", "Reinforced HP Steam Turbine Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".3.name", "Reinforced Gas Turbine Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".4.name", "Reinforced Plasma Turbine Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Tesla Containment Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Structural Solar Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".7.name", "Salt Containment Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".8.name", "Thermally Insulated Casing");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Flotation Cell Casings");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".10.name", "Reinforced Engine Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".11.name", "Molecular Containment Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".12.name", "High Voltage Current Capacitor");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".13.name", "Particle Containment Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".14.name", "Reinforced Heat Exchanger Casing");
+ GT_LanguageManager
+ .addStringLocalization(this.getUnlocalizedName() + ".15.name", "Reinforced SC Turbine Casing");
+ TAE.registerTexture(1, 12, new GTPP_CopiedBlockTexture(this, 6, 14));
+
+ GregtechItemList.Casing_Turbine_Shaft.set(new ItemStack(this, 1, 0));
+ GregtechItemList.Casing_Turbine_LP.set(new ItemStack(this, 1, 1));
+ GregtechItemList.Casing_Turbine_HP.set(new ItemStack(this, 1, 2));
+ GregtechItemList.Casing_Turbine_Gas.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Casing_Turbine_Plasma.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Casing_SolarTower_Structural.set(new ItemStack(this, 1, 6));
+ GregtechItemList.Casing_SolarTower_SaltContainment.set(new ItemStack(this, 1, 7));
+ GregtechItemList.Casing_SolarTower_HeatContainment.set(new ItemStack(this, 1, 8));
+ GregtechItemList.Casing_Flotation_Cell.set(new ItemStack(this, 1, 9));
+ GregtechItemList.Casing_Reinforced_Engine_Casing.set(new ItemStack(this, 1, 10));
+ GregtechItemList.Casing_Molecular_Transformer_1.set(new ItemStack(this, 1, 11));
+ GregtechItemList.Casing_Molecular_Transformer_2.set(new ItemStack(this, 1, 12));
+ GregtechItemList.Casing_Molecular_Transformer_3.set(new ItemStack(this, 1, 13));
+ GregtechItemList.Casing_XL_HeatExchanger.set(new ItemStack(this, 1, 14));
+ GregtechItemList.Casing_Turbine_SC.set(new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide) {
+ return LargeTurbineTextureHandler
+ .handleCasingsGT(aWorld, xCoord, yCoord, zCoord, ForgeDirection.getOrientation(ordinalSide), this);
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return getStaticIcon((byte) ordinalSide, (byte) aMeta);
+ }
+
+ public static IIcon getStaticIcon(final int ordinalSide, final byte aMeta) {
+ return switch (aMeta) {
+ case 0 -> TexturesGtBlock.Casing_Redox_1.getIcon();
+ case 1 -> Textures.BlockIcons.MACHINE_CASING_TURBINE.getIcon();
+ case 2 -> Textures.BlockIcons.MACHINE_CASING_STABLE_TITANIUM.getIcon();
+ case 3 -> Textures.BlockIcons.MACHINE_CASING_CLEAN_STAINLESSSTEEL.getIcon();
+ case 4 -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon();
+ case 5 -> TexturesGtBlock.Casing_Material_RedSteel.getIcon();
+ case 6 -> TexturesGtBlock.Casing_Material_MaragingSteel.getIcon();
+ case 7 -> TexturesGtBlock.Casing_Material_Stellite.getIcon();
+ case 8 -> TexturesGtBlock.Casing_Machine_Simple_Top.getIcon();
+ case 9 -> TexturesGtBlock.TEXTURE_CASING_FLOTATION.getIcon();
+ case 10 -> TexturesGtBlock.Casing_Material_Talonite.getIcon();
+ case 11 -> Textures.BlockIcons.MACHINE_CASING_RADIATIONPROOF.getIcon();
+ case 12 -> TexturesGtBlock.Casing_Redox_5.getIcon();
+ case 13 -> TexturesGtBlock.TEXTURE_MAGIC_PANEL_B.getIcon();
+ case 14 -> TexturesGtBlock.Casing_Material_Talonite.getIcon();
+ case 15 -> TexturesGtBlock.Turbine_SC_Material_Casing.getIcon();
+ default -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ };
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings2.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings2.java
new file mode 100644
index 0000000000..9a2912c2c5
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaSpecialMultiCasings2.java
@@ -0,0 +1,99 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+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.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaSpecialMultiCasings2 extends GregtechMetaCasingBlocksAbstract {
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ for (int i = 0; i < 8; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+
+ public static class SpecialCasingItemBlock extends GregtechMetaCasingItems {
+
+ public SpecialCasingItemBlock(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ int aMeta = aStack.getItemDamage();
+ if (aMeta < 4) {
+ aList.add("Provides quantum stability");
+ }
+ if (aMeta >= 4 && aMeta < 8) {
+ aList.add("Provides quantum modulation");
+ }
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaSpecialMultiCasings2() {
+ super(SpecialCasingItemBlock.class, "gtplusplus.blockspecialcasings.3", GT_Material_Casings.INSTANCE);
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ // TAE.registerTextures(new GT_CopiedBlockTexture(this, 6, i));
+ // Don't register these Textures, They already exist within vanilla GT. (May not exist in 5.08)
+ }
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Resonance Chamber I");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Resonance Chamber II");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "Resonance Chamber III");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Resonance Chamber IV");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".4.name", "Modulator I");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Modulator II");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Modulator III");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".7.name", "Modulator IV");
+
+ GregtechItemList.ResonanceChamber_I.set(new ItemStack(this, 1, 0));
+ GregtechItemList.ResonanceChamber_II.set(new ItemStack(this, 1, 1));
+ GregtechItemList.ResonanceChamber_III.set(new ItemStack(this, 1, 2));
+ GregtechItemList.ResonanceChamber_IV.set(new ItemStack(this, 1, 3));
+ GregtechItemList.Modulator_I.set(new ItemStack(this, 1, 4));
+ GregtechItemList.Modulator_II.set(new ItemStack(this, 1, 5));
+ GregtechItemList.Modulator_III.set(new ItemStack(this, 1, 6));
+ GregtechItemList.Modulator_IV.set(new ItemStack(this, 1, 7));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide) {
+ return getStaticIcon((byte) ordinalSide, (byte) aWorld.getBlockMetadata(xCoord, yCoord, zCoord));
+ }
+
+ @Override
+ public IIcon getIcon(final int ordinalSide, final int aMeta) {
+ return getStaticIcon((byte) ordinalSide, (byte) aMeta);
+ }
+
+ public static IIcon getStaticIcon(final byte aSide, final byte aMeta) {
+ return switch (aMeta) {
+ case 0 -> TexturesGtBlock.Casing_Resonance_1.getIcon();
+ case 1 -> TexturesGtBlock.Casing_Resonance_2.getIcon();
+ case 2 -> TexturesGtBlock.Casing_Resonance_3.getIcon();
+ case 3 -> TexturesGtBlock.Casing_Resonance_4.getIcon();
+ case 4 -> TexturesGtBlock.Casing_Modulator_1.getIcon();
+ case 5 -> TexturesGtBlock.Casing_Modulator_2.getIcon();
+ case 6 -> TexturesGtBlock.Casing_Modulator_3.getIcon();
+ case 7 -> TexturesGtBlock.Casing_Modulator_4.getIcon();
+ default -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ };
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaTieredCasingBlocks1.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaTieredCasingBlocks1.java
new file mode 100644
index 0000000000..7ddab1c471
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/GregtechMetaTieredCasingBlocks1.java
@@ -0,0 +1,84 @@
+package gtPlusPlus.xmod.gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+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.IIcon;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Material_Casings;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTieredCasingBlocks1 extends GregtechMetaCasingBlocksAbstract {
+
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ for (int i = 0; i < 10; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+
+ public static class TieredCasingItemBlock extends GregtechMetaCasingItems {
+
+ public TieredCasingItemBlock(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ int aMeta = aStack.getItemDamage();
+ if (aMeta < 10) {
+ aList.add("Tier: " + GT_Values.VN[aMeta]);
+ }
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+ }
+
+ public GregtechMetaTieredCasingBlocks1() {
+ super(TieredCasingItemBlock.class, "gtplusplus.blocktieredcasings.1", GT_Material_Casings.INSTANCE);
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".0.name", "Integral Encasement I");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".1.name", "Integral Encasement II");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".2.name", "Integral Encasement III");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".3.name", "Integral Encasement IV");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".4.name", "Integral Encasement V");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".5.name", "Integral Framework I");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".6.name", "Integral Framework II");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".7.name", "Integral Framework III");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".8.name", "Integral Framework IV");
+ GT_LanguageManager.addStringLocalization(this.getUnlocalizedName() + ".9.name", "Integral Framework V");
+
+ GregtechItemList.GTPP_Casing_ULV.set(new ItemStack(this, 1, 0));
+ GregtechItemList.GTPP_Casing_LV.set(new ItemStack(this, 1, 1));
+ GregtechItemList.GTPP_Casing_MV.set(new ItemStack(this, 1, 2));
+ GregtechItemList.GTPP_Casing_HV.set(new ItemStack(this, 1, 3));
+ GregtechItemList.GTPP_Casing_EV.set(new ItemStack(this, 1, 4));
+ GregtechItemList.GTPP_Casing_IV.set(new ItemStack(this, 1, 5));
+ GregtechItemList.GTPP_Casing_LuV.set(new ItemStack(this, 1, 6));
+ GregtechItemList.GTPP_Casing_ZPM.set(new ItemStack(this, 1, 7));
+ GregtechItemList.GTPP_Casing_UV.set(new ItemStack(this, 1, 8));
+ GregtechItemList.GTPP_Casing_UHV.set(new ItemStack(this, 1, 9));
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ if (aMeta < 10) {
+ return TexturesGtBlock.TIERED_MACHINE_HULLS[aMeta].getIcon();
+ }
+ return switch (aMeta) {
+ case 10 -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ case 11 -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ case 12 -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ case 13 -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ case 14 -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ case 15 -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ default -> Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ };
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/fluid/GregtechFluidHandler.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/fluid/GregtechFluidHandler.java
new file mode 100644
index 0000000000..e478bf5c18
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/fluid/GregtechFluidHandler.java
@@ -0,0 +1,146 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.fluid;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+
+public class GregtechFluidHandler {
+
+ protected static int cellID = 0;
+
+ public static void run() {
+ start();
+ }
+
+ private static void start() {
+ Logger.INFO("Adding in our own GT versions of Thermal Foundation Fluids if they do not already exist.");
+ if (!FluidRegistry.isFluidRegistered("cryotheum")) {
+ FluidUtils.addGtFluid(
+ "cryotheum",
+ "Gelid Cryotheum",
+ GT_Materials.Cryotheum,
+ 4,
+ -1200,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.Cryotheum, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000);
+ }
+ if (!FluidRegistry.isFluidRegistered("pyrotheum")) {
+ FluidUtils.addGtFluid(
+ "pyrotheum",
+ "Blazing Pyrotheum",
+ GT_Materials.Pyrotheum,
+ 4,
+ 4000,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.Pyrotheum, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000);
+ }
+ if (!FluidRegistry.isFluidRegistered("ender")) {
+ FluidUtils.addGtFluid(
+ "ender",
+ "Resonant Ender",
+ GT_Materials.Ender,
+ 4,
+ 4000,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.Ender, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000);
+ }
+ Logger.INFO("Adding in GT Fluids for various nuclear related content.");
+
+ FluidUtils.addGtFluid(
+ "hydrofluoricAcid",
+ "Industrial Strength Hydrofluoric Acid",
+ GT_Materials.HydrofluoricAcid,
+ 1,
+ 120,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.HydrofluoricAcid, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ generateIC2FluidCell("HydrofluoricAcid");
+
+ FluidUtils.generateFluidNoPrefix(
+ "SulfurDioxide",
+ "High Quality Sulfur Dioxide",
+ 263,
+ GT_Materials.SulfurDioxide.mRGBa);
+
+ FluidUtils.addGtFluid(
+ "sulfurousAcid",
+ "Sulfurous Acid",
+ GT_Materials.SulfurousAcid,
+ 4,
+ 75,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.SulfurousAcid, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ generateIC2FluidCell("SulfurousAcid");
+
+ FluidUtils.addGtFluid(
+ "sulfuricApatite",
+ "Sulfuric Apatite Mix",
+ GT_Materials.SulfuricApatite,
+ 4,
+ 500,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.SulfuricApatite, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ generateIC2FluidCell("SulfuricApatite");
+
+ // Check for Hydrogen Chloride
+ if (FluidUtils.getFluidStack("hydrogenchloride", 1) == null) {
+ FluidUtils.addGtFluid(
+ "hydrogenChloride",
+ "Industrial Strength Hydrogen Chloride",
+ GT_Materials.HydrogenChloride,
+ 4,
+ 75,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.HydrogenChloride, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ generateIC2FluidCell("HydrogenChloride");
+ }
+
+ FluidUtils.addGtFluid(
+ "sulfuricLithium",
+ "Sulfuric Lithium Mix",
+ GT_Materials.SulfuricLithium,
+ 4,
+ 280,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.SulfuricLithium, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ generateIC2FluidCell("SulfuricLithium");
+
+ FluidUtils.addGtFluid(
+ "lithiumHydroxide",
+ "Lithium Hydroxide",
+ GT_Materials.LithiumHydroxide,
+ 4,
+ 500,
+ GT_OreDictUnificator.get(OrePrefixes.cell, GT_Materials.LithiumHydroxide, 1L),
+ ItemUtils.getEmptyCell(),
+ 1000,
+ false);
+ generateIC2FluidCell("LithiumHydroxide");
+ }
+
+ private static ItemStack generateIC2FluidCell(final String fluidNameWithCaps) {
+ Logger.INFO("Adding a Cell for " + fluidNameWithCaps);
+ return Utils.createInternalNameAndFluidCell(fluidNameWithCaps);
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler.java
new file mode 100644
index 0000000000..c85bac7115
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler.java
@@ -0,0 +1,57 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks;
+
+public class CasingTextureHandler {
+
+ private static final TexturesCentrifugeMultiblock gregtechX = new TexturesCentrifugeMultiblock();
+
+ public static IIcon getIcon(final int ordinalSide, final int aMeta) { // Texture ID's. case 0 == ID[57]
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ return switch (aMeta) {
+ // Centrifuge
+ case 0 -> TexturesGtBlock.Casing_Material_Centrifuge.getIcon();
+ // Coke Oven Frame
+ case 1 -> TexturesGtBlock.Casing_Material_Tantalloy61.getIcon();
+ // Coke Oven Casing Tier 1
+ case 2 -> Textures.BlockIcons.MACHINE_CASING_FIREBOX_BRONZE.getIcon();
+ // Coke Oven Casing Tier 2
+ case 3 -> Textures.BlockIcons.MACHINE_CASING_FIREBOX_STEEL.getIcon();
+ // Material Press Casings
+ case 4 -> Textures.BlockIcons.MACHINE_CASING_STABLE_TITANIUM.getIcon();
+ // Electrolyzer Casings
+ case 5 -> TexturesGtBlock.Casing_Material_Potin.getIcon();
+ // Broken Blue Fusion Casings
+ case 6 -> TexturesGtBlock.Casing_Material_MaragingSteel.getIcon();
+ // Maceration Stack Casings
+ case 7 -> TexturesGtBlock.Casing_Material_Tumbaga.getIcon();
+ // Broken Pink Fusion Casings
+ case 8 -> TexturesGtBlock.TEXTURE_ORGANIC_PANEL_A_GLOWING.getIcon();
+ // Matter Fabricator Casings
+ case 9 -> TexturesGtBlock.TEXTURE_METAL_PANEL_F.getIcon();
+ // Iron Blast Fuance Textures
+ case 10 -> TexturesGtBlock.Casing_Machine_Simple_Top.getIcon();
+ // Multitank Exterior Casing
+ case 11 -> TexturesGtBlock.Casing_Material_Grisium.getIcon();
+ // Reactor Casing I
+ case 12 -> TexturesGtBlock.Casing_Material_Stellite.getIcon();
+ // Reactor Casing II
+ case 13 -> TexturesGtBlock.Casing_Material_Zeron100.getIcon();
+ case 14 -> TexturesGtBlock.Casing_Staballoy_Firebox.getIcon();
+ case 15 -> TexturesGtBlock.Casing_Material_ZirconiumCarbide.getIcon();
+ default -> Textures.BlockIcons.MACHINE_CASING_RADIOACTIVEHAZARD.getIcon();
+ };
+ }
+ return Textures.BlockIcons.MACHINE_CASING_GEARBOX_TUNGSTENSTEEL.getIcon();
+ }
+
+ public static IIcon handleCasingsGT(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final ForgeDirection side, final GregtechMetaCasingBlocks thisBlock) {
+ return gregtechX.handleCasingsGT(aWorld, xCoord, yCoord, zCoord, side, thisBlock);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler2.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler2.java
new file mode 100644
index 0000000000..1da572fb35
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler2.java
@@ -0,0 +1,71 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import net.minecraft.util.IIcon;
+
+import gregtech.api.enums.Textures;
+
+public class CasingTextureHandler2 {
+
+ public static IIcon getIcon(final int ordinalSide, final int aMeta) { // Texture ID's. case 0 == ID[57]
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ switch (aMeta) {
+ case 0 -> {
+ return TexturesGtBlock.Casing_Material_RedSteel.getIcon();
+ }
+ case 1 -> {
+ return TexturesGtBlock.Casing_Material_HastelloyX.getIcon();
+ }
+ case 2 -> {
+ return TexturesGtBlock.Casing_Material_HastelloyN.getIcon();
+ }
+ case 3 -> {
+ return TexturesGtBlock.Casing_Material_Fluid_IncoloyDS.getIcon();
+ }
+ case 4 -> {
+ return TexturesGtBlock.Casing_Material_Grisium.getIcon();
+ }
+ case 5 -> {
+ return TexturesGtBlock.Casing_Machine_Metal_Panel_A.getIcon();
+ }
+ case 6 -> {
+ return TexturesGtBlock.Casing_Machine_Metal_Grate_A.getIcon();
+ }
+ case 7 -> {
+ return TexturesGtBlock.Casing_Redox_1.getIcon();
+ }
+ case 8 -> {
+ return TexturesGtBlock.Casing_Machine_Metal_Sheet_A.getIcon();
+ }
+ case 9 -> {
+ return TexturesGtBlock.Overlay_Machine_Cyber_A.getIcon();
+ }
+ case 10 -> {
+ return Textures.BlockIcons.MACHINE_CASING_RADIATIONPROOF.getIcon();
+ }
+ case 11 -> {
+ return TexturesGtBlock.Casing_Material_Tantalloy61.getIcon();
+ }
+ case 12 -> {
+ return TexturesGtBlock.Casing_Machine_Simple_Top.getIcon();
+ }
+ case 13 -> {
+ if (ordinalSide < 2) {
+ return TexturesGtBlock.TEXTURE_TECH_A.getIcon();
+ } else {
+ return TexturesGtBlock.TEXTURE_TECH_B.getIcon();
+ }
+ }
+ case 14 -> {
+ return Textures.BlockIcons.RENDERING_ERROR.getIcon();
+ }
+ case 15 -> {
+ return TexturesGtBlock.Casing_Machine_Acacia_Log.getIcon();
+ }
+ default -> {
+ return TexturesGtBlock.Overlay_UU_Matter.getIcon();
+ }
+ }
+ }
+ return TexturesGtBlock._PlaceHolder.getIcon();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler3.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler3.java
new file mode 100644
index 0000000000..6b2627ec39
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler3.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import net.minecraft.util.IIcon;
+
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks3;
+
+public class CasingTextureHandler3 {
+
+ public static IIcon getIcon(final int ordinalSide, final int aMeta) { // Texture ID's. case 0 == ID[57]
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ return switch (aMeta) {
+ case 0 ->
+ // Aquatic Casing
+ TexturesGtBlock.TEXTURE_METAL_PANEL_B.getIcon();
+ case 1 ->
+ // Inconel Reinforced Casing
+ TexturesGtBlock.TEXTURE_METAL_PANEL_D.getIcon();
+ case 2 ->
+ // Multi-Use Casing
+ TexturesGtBlock.TEXTURE_METAL_PANEL_C.getIcon();
+ case 3 ->
+ // Trinium Plated Mining Platform Casing
+ TexturesGtBlock.Casing_Trinium_Naquadah_Vent.getIcon();
+ case 4 ->
+ // Vanadium Redox IV
+ TexturesGtBlock.Casing_Redox_2.getIcon();
+ case 5 ->
+ // Vanadium Redox LuV
+ TexturesGtBlock.Casing_Redox_3.getIcon();
+ case 6 ->
+ // Vanadium Redox ZPM
+ TexturesGtBlock.Casing_Redox_4.getIcon();
+ case 7 ->
+ // Vanadium Redox UV
+ TexturesGtBlock.Casing_Redox_5.getIcon();
+ case 8 ->
+ // Vanadium Redox MAX
+ TexturesGtBlock.Casing_Redox_6.getIcon();
+ case 9 ->
+ // Amazon Warehouse Casing
+ TexturesGtBlock.TEXTURE_CASING_AMAZON.getIcon();
+ case 10 ->
+ // Adv. Vac. Freezer
+ TexturesGtBlock.TEXTURE_CASING_ADVANCED_CRYOGENIC.getIcon();
+ case 11 ->
+ // Adv. EBF
+ TexturesGtBlock.TEXTURE_CASING_ADVANCED_VOLCNUS.getIcon();
+ case 12 -> TexturesGtBlock.TEXTURE_CASING_FUSION_COIL_II.getIcon();
+ case 13 -> TexturesGtBlock.TEXTURE_CASING_FUSION_COIL_II_INNER.getIcon();
+ case 14 -> TexturesGtBlock.TEXTURE_CASING_FUSION_CASING_ULTRA.getIcon();
+ case 15 -> TexturesGtBlock.TEXTURE_MAGIC_PANEL_A.getIcon();
+ default -> TexturesGtBlock._PlaceHolder.getIcon();
+ };
+ }
+ return TexturesGtBlock._PlaceHolder.getIcon();
+ }
+
+ static {
+ GregtechMetaCasingBlocks3.mConnectedMachineTextures = true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler6.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler6.java
new file mode 100644
index 0000000000..b8d5a024df
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/CasingTextureHandler6.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import net.minecraft.util.IIcon;
+
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks6;
+
+public class CasingTextureHandler6 {
+
+ public static IIcon getIcon(final int ordinalSide, final int aMeta) { // Texture ID's. case 0 == ID[57]
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ return switch (aMeta) {
+ case 0 -> TexturesGtBlock.TEXTURE_CASING_FUSION_COIL_III.getIcon();
+ case 1 -> TexturesGtBlock.TEXTURE_CASING_FUSION_COIL_III_INNER.getIcon();
+ case 2 -> TexturesGtBlock.TEXTURE_CASING_FUSION_CASING_HYPER.getIcon();
+ default -> TexturesGtBlock._PlaceHolder.getIcon();
+ };
+ }
+ return TexturesGtBlock._PlaceHolder.getIcon();
+ }
+
+ static {
+ GregtechMetaCasingBlocks6.mConnectedMachineTextures = true;
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesCentrifugeMultiblock.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesCentrifugeMultiblock.java
new file mode 100644
index 0000000000..058d2a7f1e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesCentrifugeMultiblock.java
@@ -0,0 +1,151 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.CustomIcon;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialCentrifuge;
+
+public class TexturesCentrifugeMultiblock {
+
+ private static CustomIcon GT8_1_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE1");
+ private static CustomIcon GT8_1 = new CustomIcon("iconsets/LARGECENTRIFUGE1");
+ private static CustomIcon GT8_2_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE2");
+ private static CustomIcon GT8_2 = new CustomIcon("iconsets/LARGECENTRIFUGE2");
+ private static CustomIcon GT8_3_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE3");
+ private static CustomIcon GT8_3 = new CustomIcon("iconsets/LARGECENTRIFUGE3");
+ private static CustomIcon GT8_4_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE4");
+ private static CustomIcon GT8_4 = new CustomIcon("iconsets/LARGECENTRIFUGE4");
+ private static CustomIcon GT8_5_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE5");
+ private static CustomIcon GT8_5 = new CustomIcon("iconsets/LARGECENTRIFUGE5");
+ private static CustomIcon GT8_6_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE6");
+ private static CustomIcon GT8_6 = new CustomIcon("iconsets/LARGECENTRIFUGE6");
+ private static CustomIcon GT8_7_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE7");
+ private static CustomIcon GT8_7 = new CustomIcon("iconsets/LARGECENTRIFUGE7");
+ private static CustomIcon GT8_8_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE8");
+ private static CustomIcon GT8_8 = new CustomIcon("iconsets/LARGECENTRIFUGE8");
+ private static CustomIcon GT8_9_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE9");
+ private static CustomIcon GT8_9 = new CustomIcon("iconsets/LARGECENTRIFUGE9");
+
+ private static CustomIcon frontFace_0 = (GT8_1);
+ private static CustomIcon frontFaceActive_0 = (GT8_1_Active);
+ private static CustomIcon frontFace_1 = (GT8_2);
+ private static CustomIcon frontFaceActive_1 = (GT8_2_Active);
+ private static CustomIcon frontFace_2 = (GT8_3);
+ private static CustomIcon frontFaceActive_2 = (GT8_3_Active);
+ private static CustomIcon frontFace_3 = (GT8_4);
+ private static CustomIcon frontFaceActive_3 = (GT8_4_Active);
+ private static CustomIcon frontFace_4 = (GT8_5);
+ private static CustomIcon frontFaceActive_4 = (GT8_5_Active);
+ private static CustomIcon frontFace_5 = (GT8_6);
+ private static CustomIcon frontFaceActive_5 = (GT8_6_Active);
+ private static CustomIcon frontFace_6 = (GT8_7);
+ private static CustomIcon frontFaceActive_6 = (GT8_7_Active);
+ private static CustomIcon frontFace_7 = (GT8_8);
+ private static CustomIcon frontFaceActive_7 = (GT8_8_Active);
+ private static CustomIcon frontFace_8 = (GT8_9);
+ private static CustomIcon frontFaceActive_8 = (GT8_9_Active);
+
+ CustomIcon[] CENTRIFUGE = new CustomIcon[] { frontFace_0, frontFace_1, frontFace_2, frontFace_3, frontFace_4,
+ frontFace_5, frontFace_6, frontFace_7, frontFace_8 };
+
+ CustomIcon[] CENTRIFUGE_ACTIVE = new CustomIcon[] { frontFaceActive_0, frontFaceActive_1, frontFaceActive_2,
+ frontFaceActive_3, frontFaceActive_4, frontFaceActive_5, frontFaceActive_6, frontFaceActive_7,
+ frontFaceActive_8 };
+
+ public IIcon handleCasingsGT(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final ForgeDirection side, final GregtechMetaCasingBlocks thisBlock) {
+ return this.handleCasingsGT58(aWorld, xCoord, yCoord, zCoord, side, thisBlock);
+ }
+
+ private static int isCentrifugeControllerWithSide(IBlockAccess aWorld, int aX, int aY, int aZ,
+ ForgeDirection side) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (!(tTileEntity instanceof IGregTechTileEntity tTile)) return 0;
+ if (tTile.getMetaTileEntity() instanceof GregtechMetaTileEntity_IndustrialCentrifuge
+ && tTile.getFrontFacing() == side) return tTile.isActive() ? 1 : 2;
+ return 0;
+ }
+
+ public IIcon handleCasingsGT58(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final ForgeDirection side, final GregtechMetaCasingBlocks thisBlock) {
+ final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ final int ordinalSide = side.ordinal();
+ if (tMeta != 0) {
+ return CasingTextureHandler.getIcon(ordinalSide, tMeta);
+ }
+
+ int tInvertLeftRightMod = ordinalSide % 2 * 2 - 1;
+ switch (ordinalSide / 2) {
+ case 0 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ if (isCentrifugeControllerWithSide(aWorld, xCoord + j, yCoord, zCoord + i, side) != 0) {
+ IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld
+ .getTileEntity(xCoord + j, yCoord, zCoord + i)).getMetaTileEntity();
+ return getIconByIndex(tMetaTileEntity, 4 - i * 3 - j);
+ }
+ }
+ }
+ }
+ case 1 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ if (isCentrifugeControllerWithSide(aWorld, xCoord + j, yCoord + i, zCoord, side) != 0) {
+ IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld
+ .getTileEntity(xCoord + j, yCoord + i, zCoord)).getMetaTileEntity();
+ return getIconByIndex(tMetaTileEntity, 4 + i * 3 - j * tInvertLeftRightMod);
+ }
+ }
+ }
+ }
+ case 2 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ if (isCentrifugeControllerWithSide(aWorld, xCoord, yCoord + i, zCoord + j, side) != 0) {
+ IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld
+ .getTileEntity(xCoord, yCoord + i, zCoord + j)).getMetaTileEntity();
+ return getIconByIndex(tMetaTileEntity, 4 + i * 3 + j * tInvertLeftRightMod);
+ }
+ }
+ }
+ }
+ }
+ return TexturesGtBlock.Casing_Material_Centrifuge.getIcon();
+ }
+
+ public boolean isCentrifugeRunning(IMetaTileEntity aTile) {
+ if (aTile == null) {
+ return false;
+ } else {
+ return aTile.getBaseMetaTileEntity()
+ .isActive();
+ }
+ }
+
+ public boolean isUsingAnimatedTexture(IMetaTileEntity aMetaTileEntity) {
+ if (aMetaTileEntity != null) {
+ if (aMetaTileEntity instanceof GregtechMetaTileEntity_IndustrialCentrifuge) {
+ return ((GregtechMetaTileEntity_IndustrialCentrifuge) aMetaTileEntity).usingAnimations();
+ }
+ }
+ return false;
+ }
+
+ public IIcon getIconByIndex(IMetaTileEntity aMetaTileEntity, int aIndex) {
+ if (isUsingAnimatedTexture(aMetaTileEntity)) {
+ if (isCentrifugeRunning(aMetaTileEntity)) {
+ return this.CENTRIFUGE_ACTIVE[aIndex].getIcon();
+ }
+ }
+ return this.CENTRIFUGE[aIndex].getIcon();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGrinderMultiblock.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGrinderMultiblock.java
new file mode 100644
index 0000000000..e7d09bd308
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGrinderMultiblock.java
@@ -0,0 +1,134 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks5;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.CustomIcon;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IsaMill;
+
+public class TexturesGrinderMultiblock {
+
+ private static CustomIcon GT8_1_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE1");
+ private static CustomIcon GT8_1 = new CustomIcon("iconsets/Grinder/GRINDER1");
+ private static CustomIcon GT8_2_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE2");
+ private static CustomIcon GT8_2 = new CustomIcon("iconsets/Grinder/GRINDER2");
+ private static CustomIcon GT8_3_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE3");
+ private static CustomIcon GT8_3 = new CustomIcon("iconsets/Grinder/GRINDER3");
+ private static CustomIcon GT8_4_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE4");
+ private static CustomIcon GT8_4 = new CustomIcon("iconsets/Grinder/GRINDER4");
+ private static CustomIcon GT8_5_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE5");
+ private static CustomIcon GT8_5 = new CustomIcon("iconsets/Grinder/GRINDER5");
+ private static CustomIcon GT8_6_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE6");
+ private static CustomIcon GT8_6 = new CustomIcon("iconsets/Grinder/GRINDER6");
+ private static CustomIcon GT8_7_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE7");
+ private static CustomIcon GT8_7 = new CustomIcon("iconsets/Grinder/GRINDER7");
+ private static CustomIcon GT8_8_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE8");
+ private static CustomIcon GT8_8 = new CustomIcon("iconsets/Grinder/GRINDER8");
+ private static CustomIcon GT8_9_Active = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE9");
+ private static CustomIcon GT8_9 = new CustomIcon("iconsets/Grinder/GRINDER9");
+
+ private static CustomIcon frontFace_0 = (GT8_1);
+ private static CustomIcon frontFaceActive_0 = (GT8_1_Active);
+ private static CustomIcon frontFace_1 = (GT8_2);
+ private static CustomIcon frontFaceActive_1 = (GT8_2_Active);
+ private static CustomIcon frontFace_2 = (GT8_3);
+ private static CustomIcon frontFaceActive_2 = (GT8_3_Active);
+ private static CustomIcon frontFace_3 = (GT8_4);
+ private static CustomIcon frontFaceActive_3 = (GT8_4_Active);
+ private static CustomIcon frontFace_4 = (GT8_5);
+ private static CustomIcon frontFaceActive_4 = (GT8_5_Active);
+ private static CustomIcon frontFace_5 = (GT8_6);
+ private static CustomIcon frontFaceActive_5 = (GT8_6_Active);
+ private static CustomIcon frontFace_6 = (GT8_7);
+ private static CustomIcon frontFaceActive_6 = (GT8_7_Active);
+ private static CustomIcon frontFace_7 = (GT8_8);
+ private static CustomIcon frontFaceActive_7 = (GT8_8_Active);
+ private static CustomIcon frontFace_8 = (GT8_9);
+ private static CustomIcon frontFaceActive_8 = (GT8_9_Active);
+
+ CustomIcon[] GRINDER = new CustomIcon[] { frontFace_0, frontFace_1, frontFace_2, frontFace_3, frontFace_4,
+ frontFace_5, frontFace_6, frontFace_7, frontFace_8 };
+
+ CustomIcon[] GRINDER_ACTIVE = new CustomIcon[] { frontFaceActive_0, frontFaceActive_1, frontFaceActive_2,
+ frontFaceActive_3, frontFaceActive_4, frontFaceActive_5, frontFaceActive_6, frontFaceActive_7,
+ frontFaceActive_8 };
+
+ private static int isIsaControllerWithSide(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection side) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (!(tTileEntity instanceof IGregTechTileEntity tTile)) return 0;
+ if (tTile.getMetaTileEntity() instanceof GregtechMetaTileEntity_IsaMill && tTile.getFrontFacing() == side)
+ return tTile.isActive() ? 1 : 2;
+ return 0;
+ }
+
+ public IIcon handleCasingsGT(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final int ordinalSide, final GregtechMetaCasingBlocks5 ii) {
+ final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ if (tMeta != 1) {
+ return GregtechMetaCasingBlocks5.getStaticIcon(ordinalSide, tMeta);
+ }
+ int tInvertLeftRightMod = ordinalSide % 2 * 2 - 1;
+ switch (ordinalSide / 2) {
+ case 0 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ if (isIsaControllerWithSide(aWorld, xCoord + j, yCoord, zCoord + i, side) != 0) {
+ IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld
+ .getTileEntity(xCoord + j, yCoord, zCoord + i)).getMetaTileEntity();
+ return getIconByIndex(tMetaTileEntity, 4 - i * 3 - j);
+ }
+ }
+ }
+ }
+ case 1 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ if (isIsaControllerWithSide(aWorld, xCoord + j, yCoord + i, zCoord, side) != 0) {
+ IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld
+ .getTileEntity(xCoord + j, yCoord + i, zCoord)).getMetaTileEntity();
+ return getIconByIndex(tMetaTileEntity, 4 + i * 3 - j * tInvertLeftRightMod);
+ }
+ }
+ }
+ }
+ case 2 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ if (isIsaControllerWithSide(aWorld, xCoord, yCoord + i, zCoord + j, side) != 0) {
+ IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld
+ .getTileEntity(xCoord, yCoord + i, zCoord + j)).getMetaTileEntity();
+ return getIconByIndex(tMetaTileEntity, 4 + i * 3 + j * tInvertLeftRightMod);
+ }
+ }
+ }
+ }
+ }
+ return TexturesGtBlock.TEXTURE_CASING_GRINDING_MILL.getIcon();
+ }
+
+ public boolean isCentrifugeRunning(IMetaTileEntity aTile) {
+ if (aTile == null) {
+ return false;
+ } else {
+ return aTile.getBaseMetaTileEntity()
+ .isActive();
+ }
+ }
+
+ public IIcon getIconByIndex(IMetaTileEntity aMetaTileEntity, int aIndex) {
+ if (isCentrifugeRunning(aMetaTileEntity)) {
+ return this.GRINDER_ACTIVE[aIndex].getIcon();
+ }
+
+ return this.GRINDER[aIndex].getIcon();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtBlock.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtBlock.java
new file mode 100644
index 0000000000..743cd0b85b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtBlock.java
@@ -0,0 +1,486 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.lib.CORE;
+
+public class TexturesGtBlock {
+
+ private static boolean mAnimated = CORE.ConfigSwitches.enableAnimatedTextures;
+
+ private static AutoMap<Runnable> mCustomiconMap = new AutoMap<>();
+
+ /*
+ * Handles Custom Textures.
+ */
+
+ public static class CustomIcon implements IIconContainer, Runnable {
+
+ protected IIcon mIcon;
+ protected String mIconName;
+ protected String mModID;
+
+ public CustomIcon(final String aIconName) {
+ this(GTPlusPlus.ID, aIconName);
+ }
+
+ public CustomIcon(final String aModID, final String aIconName) {
+ this.mIconName = aIconName;
+ this.mModID = aModID;
+ mCustomiconMap.put(this);
+ Logger.WARNING("Constructing a Custom Texture. " + this.mIconName);
+ GregTech_API.sGTBlockIconload.add(this);
+ }
+
+ @Override
+ public IIcon getIcon() {
+ return this.mIcon;
+ }
+
+ @Override
+ public IIcon getOverlayIcon() {
+ return null;
+ }
+
+ @Override
+ public void run() {
+ this.mIcon = GregTech_API.sBlockIcons.registerIcon(this.mModID + ":" + this.mIconName);
+ Logger.WARNING(
+ "FIND ME _ Processing texture: " + this.getTextureFile()
+ .getResourcePath());
+ }
+
+ @Override
+ public ResourceLocation getTextureFile() {
+ return TextureMap.locationBlocksTexture;
+ }
+ }
+
+ /*
+ * Add Some Custom Textures below. I am not sure whether or not I need to declare them as such, but better to be
+ * safe than sorry. Right?
+ */
+
+ // PlaceHolder Texture
+ private static final CustomIcon Internal_PlaceHolder = new CustomIcon("TileEntities/_PlaceHolder");
+ public static final CustomIcon _PlaceHolder = Internal_PlaceHolder;
+
+ public static final CustomIcon OVERLAY_ENERGY_OUT_MULTI_BUFFER = new CustomIcon(
+ "iconsets/OVERLAY_ENERGY_OUT_MULTI_BUFFER");
+
+ // Machine Casings
+ // Simple
+ private static final CustomIcon Internal_Casing_Machine_Simple_Top = new CustomIcon("TileEntities/machine_top");
+ public static final CustomIcon Casing_Machine_Simple_Top = Internal_Casing_Machine_Simple_Top;
+ private static final CustomIcon Internal_Casing_Machine_Simple_Bottom = new CustomIcon(
+ "TileEntities/machine_bottom");
+ public static final CustomIcon Casing_Machine_Simple_Bottom = Internal_Casing_Machine_Simple_Bottom;
+ // Advanced and Ultra
+ private static final CustomIcon Internal_Casing_Machine_Advanced = new CustomIcon("TileEntities/high_adv_machine");
+ public static final CustomIcon Casing_Machine_Advanced = Internal_Casing_Machine_Advanced;
+ private static final CustomIcon Internal_Casing_Machine_Ultra = new CustomIcon("TileEntities/adv_machine_lesu");
+ public static final CustomIcon Casing_Machine_Ultra = Internal_Casing_Machine_Ultra;
+ // Dimensional - Non Overlay
+ private static final CustomIcon Internal_Casing_Machine_Dimensional = new CustomIcon(
+ "TileEntities/adv_machine_dimensional");
+ public static final CustomIcon Casing_Machine_Dimensional = Internal_Casing_Machine_Dimensional;
+
+ // Material Casings
+ private static final CustomIcon Internal_Casing_Tantalloy61 = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_TANTALLOY61");
+ public static final CustomIcon Casing_Material_Tantalloy61 = Internal_Casing_Tantalloy61;
+ private static final CustomIcon Internal_Casing_MaragingSteel = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_MARAGINGSTEEL");
+ public static final CustomIcon Casing_Material_MaragingSteel = Internal_Casing_MaragingSteel;
+ private static final CustomIcon Internal_Casing_Stellite = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_STELLITE");
+ public static final CustomIcon Casing_Material_Stellite = Internal_Casing_Stellite;
+ private static final CustomIcon Internal_Casing_Talonite = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_TALONITE");
+ public static final CustomIcon Casing_Material_Talonite = Internal_Casing_Talonite;
+ private static final CustomIcon Internal_Turbine_SC_Casing = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE");
+ public static final CustomIcon Turbine_SC_Material_Casing = Internal_Turbine_SC_Casing;
+ private static final CustomIcon Internal_Casing_Tumbaga = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_TUMBAGA");
+ public static final CustomIcon Casing_Material_Tumbaga = Internal_Casing_Tumbaga;
+ private static final CustomIcon Internal_Casing_Zeron100 = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_ZERON100");
+ public static final CustomIcon Casing_Material_Zeron100 = Internal_Casing_Zeron100;
+ private static final CustomIcon Internal_Casing_Potin = new CustomIcon("TileEntities/MACHINE_CASING_STABLE_POTIN");
+ public static final CustomIcon Casing_Material_Potin = Internal_Casing_Potin;
+
+ private static final CustomIcon Internal_Casing_Grisium = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_GRISIUM");
+ public static final CustomIcon Casing_Material_Grisium = Internal_Casing_Grisium;
+ private static final CustomIcon Internal_Casing_RedSteel = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_RED_STEEL");
+ public static final CustomIcon Casing_Material_RedSteel = Internal_Casing_RedSteel;
+ private static final CustomIcon Internal_Casing_ZirconiumCarbide = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_ZIRCONIUM_CARBIDE");
+ public static final CustomIcon Casing_Material_ZirconiumCarbide = Internal_Casing_ZirconiumCarbide;
+
+ private static final CustomIcon Internal_Casing_HastelloyX = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_HASTELLOY_X");
+ public static final CustomIcon Casing_Material_HastelloyX = Internal_Casing_HastelloyX;
+ private static final CustomIcon Internal_Casing_HastelloyN = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_HASTELLOY_N");
+ public static final CustomIcon Casing_Material_HastelloyN = Internal_Casing_HastelloyN;
+ private static final CustomIcon Internal_Casing_Fluid_IncoloyDS = new CustomIcon(
+ "TileEntities/MACHINE_CASING_FLUID_INCOLOY_DS");
+ public static final CustomIcon Casing_Material_Fluid_IncoloyDS = Internal_Casing_Fluid_IncoloyDS;
+
+ private static final CustomIcon Internal_Casing_Laurenium = new CustomIcon("TileEntities/MACHINE_CASING_LAURENIUM");
+ public static final CustomIcon Casing_Material_Laurenium = Internal_Casing_Laurenium;
+
+ // Trinium Alloys
+ public static final CustomIcon Casing_Trinium_Titanium = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_TRINIUM_TITANIUM");
+ public static final CustomIcon Casing_Trinium_Naquadah_Vent = new CustomIcon(
+ "TileEntities/MACHINE_CASING_STABLE_TRINIUM_NAQUADAH_VENT");
+
+ // Material Machine/Firebox Casings
+ private static final CustomIcon Internal_Casing_Staballoy_Firebox = new CustomIcon(
+ "TileEntities/MACHINE_CASING_FIREBOX_STABALLOY");
+ public static final CustomIcon Casing_Staballoy_Firebox = Internal_Casing_Staballoy_Firebox;
+
+ // Misc Casings
+ private static final CustomIcon Internal_Casing_Machine_Redstone_Off = new CustomIcon(
+ "TileEntities/cover_redstone_conductor");
+ public static final CustomIcon Casing_Machine_Redstone_Off = Internal_Casing_Machine_Redstone_Off;
+ private static final CustomIcon Internal_Casing_Machine_Redstone_On = new CustomIcon(
+ "TileEntities/cover_redstone_emitter");
+ public static final CustomIcon Casing_Machine_Redstone_On = Internal_Casing_Machine_Redstone_On;
+
+ // Redox Cells
+ public static final CustomIcon Casing_Redox_1 = new CustomIcon("redox/redox1");
+ public static final CustomIcon Casing_Redox_2 = new CustomIcon("redox/redox2");
+ public static final CustomIcon Casing_Redox_3 = new CustomIcon("redox/redox3");
+ public static final CustomIcon Casing_Redox_4 = new CustomIcon("redox/redox4");
+ public static final CustomIcon Casing_Redox_5 = new CustomIcon("redox/redox5");
+ public static final CustomIcon Casing_Redox_6 = new CustomIcon("redox/redox6");
+
+ // Special Block 2
+ public static final CustomIcon Casing_Resonance_1 = new CustomIcon("special/block_1");
+ public static final CustomIcon Casing_Resonance_2 = new CustomIcon("special/block_2");
+ public static final CustomIcon Casing_Resonance_3 = new CustomIcon("special/block_3");
+ public static final CustomIcon Casing_Resonance_4 = new CustomIcon("special/block_4");
+ public static final CustomIcon Casing_Modulator_1 = new CustomIcon("special/block_5");
+ public static final CustomIcon Casing_Modulator_2 = new CustomIcon("special/block_6");
+ public static final CustomIcon Casing_Modulator_3 = new CustomIcon("special/block_7");
+ public static final CustomIcon Casing_Modulator_4 = new CustomIcon("special/block_8");
+
+ // Centrifuge Casing
+ private static final CustomIcon Internal_Casing_Centrifuge = new CustomIcon(
+ "TileEntities/MACHINE_CASING_CENTRIFUGE");
+ public static final CustomIcon Casing_Material_Centrifuge = Internal_Casing_Centrifuge;
+
+ // Quantum Force Transformer Casing
+ // spotless:off
+ private static final CustomIcon Internal_Casing_QFT = new CustomIcon("TileEntities/MACHINE_CASING_QFT_COIL");
+ public static final CustomIcon Casing_Coil_QFT = Internal_Casing_QFT;
+ public static final CustomIcon NeutronPulseManipulator = mAnimated ? new CustomIcon("NeutronPulseManipulator") : new CustomIcon("NeutronPulseManipulatorStatic");
+ public static final CustomIcon CosmicFabricManipulator = mAnimated ? new CustomIcon("CosmicFabricManipulator") : new CustomIcon("CosmicFabricManipulatorStatic");
+ public static final CustomIcon InfinityInfusedManipulator = mAnimated ? new CustomIcon("InfinityInfusedManipulator") : new CustomIcon("InfinityInfusedManipulatorStatic");
+ public static final CustomIcon SpaceTimeContinuumRipper = mAnimated ? new CustomIcon("SpaceTimeContinuumRipper") : new CustomIcon("SpaceTimeContinuumRipperStatic");
+ public static final CustomIcon Manipulator_Top = new CustomIcon("Manipulator_Top");
+ public static final CustomIcon NeutronShieldingCore = mAnimated ? new CustomIcon("NeutronShieldingCore") : new CustomIcon("NeutronShieldingCoreStatic");
+ public static final CustomIcon CosmicFabricShieldingCore = mAnimated ? new CustomIcon("CosmicFabricShieldingCore") : new CustomIcon("CosmicFabricShieldingCoreStatic");
+ public static final CustomIcon InfinityInfusedShieldingCore = mAnimated ? new CustomIcon("InfinityInfusedShieldingCore") : new CustomIcon("InfinityInfusedShieldingCoreStatic");
+ public static final CustomIcon SpaceTimeBendingCore = mAnimated ? new CustomIcon("SpaceTimeBendingCore") : new CustomIcon("SpaceTimeBendingCoreStatic");
+ public static final CustomIcon ForceFieldGlass = new CustomIcon("ForceFieldGlass");
+ public static final CustomIcon ForceField = new CustomIcon("rendering/ForceField");
+ public static final CustomIcon Blank = new CustomIcon("Blank");
+ //spotless:on
+
+ // MACHINE_CASING_FARM_MANAGER_STRUCTURAL
+ // Farm Manager Casings
+ private static final CustomIcon Internal_Casing_Machine_Farm_Manager = new CustomIcon(
+ "TileEntities/MACHINE_CASING_FARM_MANAGER_STRUCTURAL");
+ public static final CustomIcon Casing_Machine_Farm_Manager = Internal_Casing_Machine_Farm_Manager;
+ // Acacia_Log
+ private static final CustomIcon Internal_Casing_Machine_Acacia_Log = new CustomIcon("TileEntities/log_acacia_top");
+ public static final CustomIcon Casing_Machine_Acacia_Log = Internal_Casing_Machine_Acacia_Log;
+ // Podzol Top
+ private static final CustomIcon Internal_Casing_Machine_Podzol = new CustomIcon("TileEntities/dirt_podzol_top");
+ public static final CustomIcon Casing_Machine_Podzol = Internal_Casing_Machine_Podzol;
+
+ // Structural Blocks
+ private static final CustomIcon Internal_Casing_Machine_Metal_Grate_A = new CustomIcon("chrono/MetalGrate");
+ public static final CustomIcon Casing_Machine_Metal_Grate_A = Internal_Casing_Machine_Metal_Grate_A;
+
+ private static final CustomIcon Internal_Casing_Machine_Metal_Panel_A = new CustomIcon("chrono/MetalPanel");
+ public static final CustomIcon Casing_Machine_Metal_Panel_A = Internal_Casing_Machine_Metal_Panel_A;
+ private static final CustomIcon Internal_Casing_Machine_Metal_Sheet_A = new CustomIcon("chrono/MetalSheet");
+ public static final CustomIcon Casing_Machine_Metal_Sheet_A = Internal_Casing_Machine_Metal_Sheet_A;
+ private static final CustomIcon Internal_Casing_Machine_Metal_Sheet_H = new CustomIcon("chrono/MetalSheet8");
+ public static final CustomIcon Casing_Machine_Metal_Sheet_H = Internal_Casing_Machine_Metal_Sheet_H;
+ private static final CustomIcon Internal_Casing_Machine_Metal_Sheet_I = new CustomIcon("chrono/MetalSheet9");
+ public static final CustomIcon Casing_Machine_Metal_Sheet_I = Internal_Casing_Machine_Metal_Sheet_I;
+ private static final CustomIcon Internal_Overlay_Machine_Cyber_A = new CustomIcon("chrono/CyberPanel");
+ public static final CustomIcon Overlay_Machine_Cyber_A = Internal_Overlay_Machine_Cyber_A;
+
+ public static final CustomIcon TEXTURE_CASING_AMAZON = new CustomIcon("TileEntities/CASING_AMAZON");
+ public static final CustomIcon TEXTURE_CASING_ADVANCED_CRYOGENIC = new CustomIcon(
+ "TileEntities/MACHINE_CASING_ADVANCED_CRYOGENIC");
+ public static final CustomIcon TEXTURE_CASING_ADVANCED_VOLCNUS = new CustomIcon(
+ "TileEntities/MACHINE_CASING_ADVANCED_VOLCANUS");
+ public static final CustomIcon TEXTURE_CASING_ROCKETDYNE = new CustomIcon("TileEntities/MACHINE_CASING_ROCKETDYNE");
+ public static final CustomIcon TEXTURE_CASING_GRINDING_MILL = new CustomIcon(
+ "TileEntities/MACHINE_CASING_GRINDING_FACTORY");
+ public static final CustomIcon TEXTURE_CASING_FLOTATION = new CustomIcon("TileEntities/MACHINE_CASING_FLOTATION");
+
+ // Custom Pipes
+ public static final CustomIcon TEXTURE_PIPE_GRINDING_MILL = new CustomIcon("TileEntities/MACHINE_CASING_PIPE_T1");
+ public static final CustomIcon TEXTURE_PIPE_GENERIC = new CustomIcon("iconsets/MACHINE_CASING_PIPE_GENERIC");
+
+ // Custom Gearboxes
+ public static final CustomIcon TEXTURE_GEARBOX_GRINDING_MILL = new CustomIcon(
+ "TileEntities/MACHINE_CASING_GEARBOX_T1");
+ public static final CustomIcon TEXTURE_GEARBOX_GENERIC = new CustomIcon("iconsets/MACHINE_CASING_GEARBOX_GENERIC");
+
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II = new CustomIcon("iconsets/MACHINE_CASING_FUSION_3");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_INNER = new CustomIcon(
+ "iconsets/MACHINE_CASING_FUSION_COIL_II");
+ public static final CustomIcon TEXTURE_CASING_FUSION_CASING_ULTRA = new CustomIcon(
+ "iconsets/MACHINE_CASING_FUSION_GLASS_ULTRA");
+
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III = new CustomIcon("iconsets/MACHINE_CASING_FUSION_4");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_INNER = new CustomIcon(
+ "iconsets/MACHINE_CASING_FUSION_COIL_III");
+ public static final CustomIcon TEXTURE_CASING_FUSION_CASING_HYPER = new CustomIcon(
+ "iconsets/MACHINE_CASING_FUSION_GLASS_HYPER");
+ //
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_1 = new CustomIcon("iconsets/FUSIONIII_1");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_2 = new CustomIcon("iconsets/FUSIONIII_2");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_3 = new CustomIcon("iconsets/FUSIONIII_3");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_4 = new CustomIcon("iconsets/FUSIONIII_4");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_5 = new CustomIcon("iconsets/FUSIONIII_5");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_6 = new CustomIcon("iconsets/FUSIONIII_6");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_7 = new CustomIcon("iconsets/FUSIONIII_7");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_8 = new CustomIcon("iconsets/FUSIONIII_8");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_9 = new CustomIcon("iconsets/FUSIONIII_9");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_10 = new CustomIcon("iconsets/FUSIONIII_10");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_11 = new CustomIcon("iconsets/FUSIONIII_11");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_II_12 = new CustomIcon("iconsets/FUSIONIII_12");
+
+ // MK5 Fusion casings
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_1 = new CustomIcon("iconsets/FUSIONIV_1");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_2 = new CustomIcon("iconsets/FUSIONIV_2");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_3 = new CustomIcon("iconsets/FUSIONIV_3");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_4 = new CustomIcon("iconsets/FUSIONIV_4");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_5 = new CustomIcon("iconsets/FUSIONIV_5");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_6 = new CustomIcon("iconsets/FUSIONIV_6");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_7 = new CustomIcon("iconsets/FUSIONIV_7");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_8 = new CustomIcon("iconsets/FUSIONIV_8");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_9 = new CustomIcon("iconsets/FUSIONIV_9");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_10 = new CustomIcon("iconsets/FUSIONIV_10");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_11 = new CustomIcon("iconsets/FUSIONIV_11");
+ public static final CustomIcon TEXTURE_CASING_FUSION_COIL_III_12 = new CustomIcon("iconsets/FUSIONIV_12");
+
+ // Overlays
+ // Fan Textures
+ private static final CustomIcon Internal_Overlay_Machine_Vent = new CustomIcon(
+ "TileEntities/machine_top_vent_rotating");
+ public static final CustomIcon Overlay_Machine_Vent = Internal_Overlay_Machine_Vent;
+ private static final CustomIcon Internal_Overlay_Machine_Vent_Fast = new CustomIcon(
+ "TileEntities/machine_top_vent_rotating_fast");
+ public static final CustomIcon Overlay_Machine_Vent_Fast = Internal_Overlay_Machine_Vent_Fast;
+ private static final CustomIcon Internal_Overlay_Machine_Vent_Adv = new CustomIcon(
+ "TileEntities/adv_machine_vent_rotating");
+ // Diesel Engines
+ private static final CustomIcon Internal_Overlay_Machine_Diesel_Vertical = new CustomIcon(
+ "TileEntities/machine_top_dieselmotor");
+ public static final CustomIcon Overlay_Machine_Diesel_Vertical = Internal_Overlay_Machine_Diesel_Vertical;
+ private static final CustomIcon Internal_Overlay_Machine_Diesel_Horizontal = new CustomIcon(
+ "TileEntities/machine_top_dieselmotor2");
+ public static final CustomIcon Overlay_Machine_Diesel_Horizontal = Internal_Overlay_Machine_Diesel_Horizontal;
+ private static final CustomIcon Internal_Overlay_Machine_Diesel_Vertical_Active = new CustomIcon(
+ "TileEntities/machine_top_dieselmotor_active");
+ public static final CustomIcon Overlay_Machine_Diesel_Vertical_Active = Internal_Overlay_Machine_Diesel_Vertical_Active;
+ private static final CustomIcon Internal_Overlay_Machine_Diesel_Horizontal_Active = new CustomIcon(
+ "TileEntities/machine_top_dieselmotor2_active");
+ public static final CustomIcon Overlay_Machine_Diesel_Horizontal_Active = Internal_Overlay_Machine_Diesel_Horizontal_Active;
+ // Computer Screens
+ private static final CustomIcon Internal_Casing_Machine_Screen_1 = new CustomIcon(
+ "TileEntities/adv_machine_screen_random1");
+ public static final CustomIcon Casing_Machine_Screen_1 = Internal_Casing_Machine_Screen_1;
+ private static final CustomIcon Internal_Casing_Machine_Screen_2 = new CustomIcon(
+ "TileEntities/adv_machine_screen_random2");
+ public static final CustomIcon Casing_Machine_Screen_2 = Internal_Casing_Machine_Screen_2;
+ private static final CustomIcon Internal_Casing_Machine_Screen_3 = new CustomIcon(
+ "TileEntities/adv_machine_screen_random3");
+ public static final CustomIcon Casing_Machine_Screen_3 = Internal_Casing_Machine_Screen_3;
+
+ private static final CustomIcon Internal_Casing_Machine_Screen_Rainbow = new CustomIcon(
+ "TileEntities/overlay_rainbowscreen");
+ public static final CustomIcon Casing_Machine_Screen_Rainbow = Internal_Casing_Machine_Screen_Rainbow;
+ private static final CustomIcon Internal_Casing_Machine_Screen_Frequency = new CustomIcon(
+ "TileEntities/adv_machine_screen_frequency");
+ public static final CustomIcon Casing_Machine_Screen_Frequency = Internal_Casing_Machine_Screen_Frequency;
+ private static final CustomIcon Internal_Overlay_Machine_Screen_Logo = new CustomIcon(
+ "TileEntities/adv_machine_screen_logo");
+ public static final CustomIcon Overlay_Machine_Screen_Logo = Internal_Overlay_Machine_Screen_Logo;
+
+ // Machine Controller Overlays
+ private static final CustomIcon Internal_Overlay_Machine_Controller_Default = new CustomIcon(
+ "iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED");
+ public static final CustomIcon Overlay_Machine_Controller_Default = Internal_Overlay_Machine_Controller_Default;
+ private static final CustomIcon Internal_Overlay_Machine_Controller_Default_Active = new CustomIcon(
+ "iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE");
+ public static final CustomIcon Overlay_Machine_Controller_Default_Active = Internal_Overlay_Machine_Controller_Default_Active;
+
+ private static final CustomIcon Internal_Overlay_Machine_Controller_Advanced = new CustomIcon(
+ "iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED");
+ public static final CustomIcon Overlay_Machine_Controller_Advanced = Internal_Overlay_Machine_Controller_Advanced;
+ private static final CustomIcon Internal_Overlay_Machine_Controller_Advanced_Active = new CustomIcon(
+ "iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE");
+ public static final CustomIcon Overlay_Machine_Controller_Advanced_Active = Internal_Overlay_Machine_Controller_Advanced_Active;
+
+ // Crafting Overlays
+ public static final CustomIcon Casing_Adv_Workbench_Crafting_Overlay = new CustomIcon(
+ "TileEntities/gt4/machine_top_crafting");
+
+ public static final CustomIcon Casing_CropHarvester_Cutter = new CustomIcon("TileEntities/gt4/OVERLAY_CROP");
+ public static final CustomIcon Casing_CropHarvester_Boxes = new CustomIcon("TileEntities/gt4/OVERLAY_BOXES");
+
+ // Covers
+ private static final CustomIcon Internal_Overlay_Overflow_Valve = new CustomIcon("iconsets/OVERLAY_OVERFLOW_VALVE");
+ public static final CustomIcon Overlay_Overflow_Valve = Internal_Overlay_Overflow_Valve;
+
+ // Hatch Overlays
+ // Charger Texture
+ private static final CustomIcon Internal_Overlay_Hatch_Charger = new CustomIcon("TileEntities/cover_charger");
+ public static final CustomIcon Overlay_Hatch_Charger = Internal_Overlay_Hatch_Charger;
+ // Discharger Texture
+ private static final CustomIcon Internal_Overlay_Hatch_Discharger = new CustomIcon("TileEntities/cover_discharge");
+ public static final CustomIcon Overlay_Hatch_Discharger = Internal_Overlay_Hatch_Discharger;
+ // Advanced Muffler
+ private static final CustomIcon Internal_Overlay_Hatch_Muffler_Adv = new CustomIcon("iconsets/OVERLAY_MUFFLER_ADV");
+ public static final CustomIcon Overlay_Hatch_Muffler_Adv = Internal_Overlay_Hatch_Muffler_Adv;
+ // Milling Ball Bus
+ private static final CustomIcon Internal_Overlay_Bus_Milling_Balls = new CustomIcon(
+ "iconsets/OVERLAY_MILLING_BALL_BUS");
+ public static final CustomIcon Overlay_Bus_Milling_Balls = Internal_Overlay_Bus_Milling_Balls;
+ // Catalyst Bus
+ private static final CustomIcon Internal_Overlay_Bus_Catalyst = new CustomIcon("iconsets/OVERLAY_CATALYSTS");
+ public static final CustomIcon Overlay_Bus_Catalyst = Internal_Overlay_Bus_Catalyst;
+
+ // Data Orb Hatch
+ public static final CustomIcon Overlay_Hatch_Data_Orb = new CustomIcon("iconsets/OVERLAY_DATA_ORB");
+
+ // Dimensional
+ private static final CustomIcon Internal_Overlay_Machine_Dimensional_Orange = new CustomIcon(
+ "TileEntities/adv_machine_dimensional_cover_orange");
+ public static final CustomIcon Overlay_Machine_Dimensional_Orange = Internal_Overlay_Machine_Dimensional_Orange;
+ // Icons
+ private static final CustomIcon Internal_Overlay_MatterFab = new CustomIcon("TileEntities/adv_machine_matterfab");
+ public static final CustomIcon Overlay_MatterFab = Internal_Overlay_MatterFab;
+ private static final CustomIcon Internal_Overlay_MatterFab_Active = new CustomIcon(
+ "TileEntities/adv_machine_matterfab_active");
+ public static final CustomIcon Overlay_MatterFab_Active = Internal_Overlay_MatterFab_Active;
+
+ private static final CustomIcon Internal_Overlay_MatterFab_Animated = new CustomIcon(
+ "TileEntities/adv_machine_matterfab_animated");
+ public static final CustomIcon Overlay_MatterFab_Animated = Internal_Overlay_MatterFab_Animated;
+ private static final CustomIcon Internal_Overlay_MatterFab_Active_Animated = new CustomIcon(
+ "TileEntities/adv_machine_matterfab_active_animated");
+ public static final CustomIcon Overlay_MatterFab_Active_Animated = Internal_Overlay_MatterFab_Active_Animated;
+
+ private static final CustomIcon Internal_Overlay_Water = new CustomIcon("TileEntities/adv_machine_water");
+ public static final CustomIcon Overlay_Water = Internal_Overlay_Water;
+ private static final CustomIcon Internal_Overlay_UU_Matter = new CustomIcon("TileEntities/adv_machine_uum");
+ public static final CustomIcon Overlay_UU_Matter = Internal_Overlay_UU_Matter;
+
+ // GT++ Tiered Hulls
+ public static final CustomIcon TEXTURE_CASING_TIERED_ULV = new CustomIcon("iconsets/TieredHulls/CASING_ULV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_LV = new CustomIcon("iconsets/TieredHulls/CASING_LV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_MV = new CustomIcon("iconsets/TieredHulls/CASING_MV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_HV = new CustomIcon("iconsets/TieredHulls/CASING_HV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_EV = new CustomIcon("iconsets/TieredHulls/CASING_EV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_IV = new CustomIcon("iconsets/TieredHulls/CASING_IV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_LuV = new CustomIcon("iconsets/TieredHulls/CASING_LuV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_ZPM = new CustomIcon("iconsets/TieredHulls/CASING_ZPM");
+ public static final CustomIcon TEXTURE_CASING_TIERED_UV = new CustomIcon("iconsets/TieredHulls/CASING_UV");
+ public static final CustomIcon TEXTURE_CASING_TIERED_MAX = new CustomIcon("iconsets/TieredHulls/CASING_MAX");
+
+ // Metroid related
+ public static final CustomIcon TEXTURE_METAL_PANEL_A = new CustomIcon("metro/TEXTURE_METAL_PANEL_A");
+ public static final CustomIcon TEXTURE_METAL_PANEL_B = new CustomIcon("metro/TEXTURE_METAL_PANEL_B");
+ public static final CustomIcon TEXTURE_METAL_PANEL_C = new CustomIcon("metro/TEXTURE_METAL_PANEL_C");
+ public static final CustomIcon TEXTURE_METAL_PANEL_D = new CustomIcon("metro/TEXTURE_METAL_PANEL_D");
+ public static final CustomIcon TEXTURE_METAL_PANEL_F = new CustomIcon("metro/TEXTURE_METAL_PANEL_F");
+
+ public static final CustomIcon TEXTURE_MAGIC_PANEL_A = new CustomIcon("metro/TEXTURE_MAGIC_A");
+ public static final CustomIcon TEXTURE_MAGIC_PANEL_B = new CustomIcon("metro/TEXTURE_MAGIC_B");
+
+ public static final CustomIcon TEXTURE_ORGANIC_PANEL_A_GLOWING = new CustomIcon(
+ "metro/TEXTURE_ORGANIC_PANEL_A_GLOWING");
+
+ public static final CustomIcon TEXTURE_STONE_RED_A = new CustomIcon("metro/TEXTURE_STONE_RED_A");
+ public static final CustomIcon TEXTURE_STONE_RED_B = new CustomIcon("metro/TEXTURE_STONE_RED_B");
+
+ public static final CustomIcon OVERLAY_SC_TURBINE1 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL1");
+ public static final CustomIcon OVERLAY_SC_TURBINE2 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL2");
+ public static final CustomIcon OVERLAY_SC_TURBINE3 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL3");
+ public static final CustomIcon OVERLAY_SC_TURBINE4 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL4");
+ public static final CustomIcon OVERLAY_SC_TURBINE5 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL5");
+ public static final CustomIcon OVERLAY_SC_TURBINE6 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL6");
+ public static final CustomIcon OVERLAY_SC_TURBINE7 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL7");
+ public static final CustomIcon OVERLAY_SC_TURBINE8 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL8");
+ public static final CustomIcon OVERLAY_SC_TURBINE9 = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE_IDEL9");
+
+ public static final CustomIcon OVERLAY_SC_TURBINE1_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE1");
+ public static final CustomIcon OVERLAY_SC_TURBINE2_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE2");
+ public static final CustomIcon OVERLAY_SC_TURBINE3_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE3");
+ public static final CustomIcon OVERLAY_SC_TURBINE4_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE4");
+ public static final CustomIcon OVERLAY_SC_TURBINE5_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE5");
+ public static final CustomIcon OVERLAY_SC_TURBINE6_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE6");
+ public static final CustomIcon OVERLAY_SC_TURBINE7_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE7");
+ public static final CustomIcon OVERLAY_SC_TURBINE8_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE8");
+ public static final CustomIcon OVERLAY_SC_TURBINE9_ACTIVE = new TexturesGtBlock.CustomIcon("iconsets/SC_TURBINE9");
+ public static final CustomIcon TEXTURE_TECH_A = new CustomIcon("metro/TEXTURE_TECH_A");
+ public static final CustomIcon TEXTURE_TECH_B = new CustomIcon("metro/TEXTURE_TECH_B");
+ public static final CustomIcon TEXTURE_TECH_C = new CustomIcon("metro/TEXTURE_TECH_C");
+
+ public static final CustomIcon TEXTURE_TECH_PANEL_D = new CustomIcon("metro/TEXTURE_TECH_PANEL_D");
+ public static final CustomIcon TEXTURE_TECH_PANEL_H = new CustomIcon("metro/TEXTURE_TECH_PANEL_H");
+
+ public static ITexture[] OVERLAYS_ENERGY_OUT_MULTI_BUFFER = new ITexture[] {
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 220, 220, 220, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 220, 220, 220, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 255, 100, 0, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 255, 255, 30, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 128, 128, 128, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 240, 240, 245, 0 }),
+ new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI_BUFFER, new short[] { 240, 240, 245, 0 }) };
+
+ public static IIconContainer[] CONNECTED_FUSION_HULLS = new IIconContainer[] { TEXTURE_CASING_FUSION_COIL_II_1,
+ TEXTURE_CASING_FUSION_COIL_II_2, TEXTURE_CASING_FUSION_COIL_II_3, TEXTURE_CASING_FUSION_COIL_II_4,
+ TEXTURE_CASING_FUSION_COIL_II_5, TEXTURE_CASING_FUSION_COIL_II_6, TEXTURE_CASING_FUSION_COIL_II_7,
+ TEXTURE_CASING_FUSION_COIL_II_8, TEXTURE_CASING_FUSION_COIL_II_9, TEXTURE_CASING_FUSION_COIL_II_10,
+ TEXTURE_CASING_FUSION_COIL_II_11, TEXTURE_CASING_FUSION_COIL_II_12 };
+
+ public static IIconContainer[] CONNECTED_FUSION_HULLS_MK4 = new IIconContainer[] { TEXTURE_CASING_FUSION_COIL_III_1,
+ TEXTURE_CASING_FUSION_COIL_III_2, TEXTURE_CASING_FUSION_COIL_III_3, TEXTURE_CASING_FUSION_COIL_III_4,
+ TEXTURE_CASING_FUSION_COIL_III_5, TEXTURE_CASING_FUSION_COIL_III_6, TEXTURE_CASING_FUSION_COIL_III_7,
+ TEXTURE_CASING_FUSION_COIL_III_8, TEXTURE_CASING_FUSION_COIL_III_9, TEXTURE_CASING_FUSION_COIL_III_10,
+ TEXTURE_CASING_FUSION_COIL_III_11, TEXTURE_CASING_FUSION_COIL_III_12 };
+
+ public static IIconContainer[] TIERED_MACHINE_HULLS = new IIconContainer[] { TEXTURE_CASING_TIERED_ULV,
+ TEXTURE_CASING_TIERED_LV, TEXTURE_CASING_TIERED_MV, TEXTURE_CASING_TIERED_HV, TEXTURE_CASING_TIERED_EV,
+ TEXTURE_CASING_TIERED_IV, TEXTURE_CASING_TIERED_LuV, TEXTURE_CASING_TIERED_ZPM, TEXTURE_CASING_TIERED_UV,
+ TEXTURE_CASING_TIERED_MAX };
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtTools.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtTools.java
new file mode 100644
index 0000000000..a9f74cd75d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/TexturesGtTools.java
@@ -0,0 +1,51 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IIconContainer;
+import gtPlusPlus.api.objects.Logger;
+
+public final class TexturesGtTools {
+
+ public static final CustomIcon ANGLE_GRINDER = new CustomIcon("iconsets/ANGLE_GRINDER");
+ public static final CustomIcon ELECTRIC_SNIPS = new CustomIcon("iconsets/ELECTRIC_SNIPS");
+
+ public static final class CustomIcon implements IIconContainer, Runnable {
+
+ private IIcon mIcon, mOverlay;
+ private final String mIconName;
+
+ public CustomIcon(final String aIconName) {
+ this.mIconName = aIconName;
+ Logger.INFO("Constructing a Custom Texture. " + this.mIconName);
+ GregTech_API.sGTItemIconload.add(this);
+ }
+
+ @Override
+ public IIcon getIcon() {
+ return this.mIcon;
+ }
+
+ @Override
+ public IIcon getOverlayIcon() {
+ return this.mOverlay;
+ }
+
+ @Override
+ public void run() {
+ this.mIcon = GregTech_API.sItemIcons.registerIcon(GTPlusPlus.ID + ":" + this.mIconName);
+ // Utils.LOG_INFO("Registering a Custom Texture. "+mIcon.g);
+ this.mOverlay = GregTech_API.sItemIcons.registerIcon(GTPlusPlus.ID + ":" + this.mIconName + "_OVERLAY");
+ }
+
+ @Override
+ public ResourceLocation getTextureFile() {
+ return TextureMap.locationItemsTexture;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/turbine/LargeTurbineTextureHandler.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/turbine/LargeTurbineTextureHandler.java
new file mode 100644
index 0000000000..c983044319
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/blocks/textures/turbine/LargeTurbineTextureHandler.java
@@ -0,0 +1,410 @@
+package gtPlusPlus.xmod.gregtech.common.blocks.textures.turbine;
+
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_SS_ACTIVE9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_ST_ACTIVE9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TI_ACTIVE9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU9;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE1;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE2;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE3;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE4;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE6;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE7;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE8;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_TU_ACTIVE9;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE1;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE1_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE2;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE2_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE3;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE3_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE4;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE4_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE5;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE5_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE6;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE6_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE7;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE7_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE8;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE8_ACTIVE;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE9;
+import static gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.OVERLAY_SC_TURBINE9_ACTIVE;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Turbine;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaSpecialMultiCasings;
+
+public class LargeTurbineTextureHandler {
+
+ /**
+ * LP Turbines
+ */
+ public static IIcon[] OVERLAY_LP_TURBINE = new IIcon[] { LARGETURBINE_ST1.getIcon(), LARGETURBINE_ST2.getIcon(),
+ LARGETURBINE_ST3.getIcon(), LARGETURBINE_ST4.getIcon(), LARGETURBINE_ST5.getIcon(), LARGETURBINE_ST6.getIcon(),
+ LARGETURBINE_ST7.getIcon(), LARGETURBINE_ST8.getIcon(), LARGETURBINE_ST9.getIcon(), };
+
+ public static IIcon[] OVERLAY_LP_TURBINE_ACTIVE = new IIcon[] { LARGETURBINE_ST_ACTIVE1.getIcon(),
+ LARGETURBINE_ST_ACTIVE2.getIcon(), LARGETURBINE_ST_ACTIVE3.getIcon(), LARGETURBINE_ST_ACTIVE4.getIcon(),
+ LARGETURBINE_ST_ACTIVE5.getIcon(), LARGETURBINE_ST_ACTIVE6.getIcon(), LARGETURBINE_ST_ACTIVE7.getIcon(),
+ LARGETURBINE_ST_ACTIVE8.getIcon(), LARGETURBINE_ST_ACTIVE9.getIcon(), };
+
+ /**
+ * HP Turbines
+ */
+ public static IIcon[] OVERLAY_HP_TURBINE = new IIcon[] { LARGETURBINE_TI1.getIcon(), LARGETURBINE_TI2.getIcon(),
+ LARGETURBINE_TI3.getIcon(), LARGETURBINE_TI4.getIcon(), LARGETURBINE_TI5.getIcon(), LARGETURBINE_TI6.getIcon(),
+ LARGETURBINE_TI7.getIcon(), LARGETURBINE_TI8.getIcon(), LARGETURBINE_TI9.getIcon(), };
+
+ public static IIcon[] OVERLAY_HP_TURBINE_ACTIVE = new IIcon[] { LARGETURBINE_TI_ACTIVE1.getIcon(),
+ LARGETURBINE_TI_ACTIVE2.getIcon(), LARGETURBINE_TI_ACTIVE3.getIcon(), LARGETURBINE_TI_ACTIVE4.getIcon(),
+ LARGETURBINE_TI_ACTIVE5.getIcon(), LARGETURBINE_TI_ACTIVE6.getIcon(), LARGETURBINE_TI_ACTIVE7.getIcon(),
+ LARGETURBINE_TI_ACTIVE8.getIcon(), LARGETURBINE_TI_ACTIVE9.getIcon(), };
+
+ /**
+ * Gas Turbines
+ */
+ public static IIcon[] OVERLAY_GAS_TURBINE = new IIcon[] { LARGETURBINE_SS1.getIcon(), LARGETURBINE_SS2.getIcon(),
+ LARGETURBINE_SS3.getIcon(), LARGETURBINE_SS4.getIcon(), LARGETURBINE_SS5.getIcon(), LARGETURBINE_SS6.getIcon(),
+ LARGETURBINE_SS7.getIcon(), LARGETURBINE_SS8.getIcon(), LARGETURBINE_SS9.getIcon(), };
+
+ public static IIcon[] OVERLAY_GAS_TURBINE_ACTIVE = new IIcon[] { LARGETURBINE_SS_ACTIVE1.getIcon(),
+ LARGETURBINE_SS_ACTIVE2.getIcon(), LARGETURBINE_SS_ACTIVE3.getIcon(), LARGETURBINE_SS_ACTIVE4.getIcon(),
+ LARGETURBINE_SS_ACTIVE5.getIcon(), LARGETURBINE_SS_ACTIVE6.getIcon(), LARGETURBINE_SS_ACTIVE7.getIcon(),
+ LARGETURBINE_SS_ACTIVE8.getIcon(), LARGETURBINE_SS_ACTIVE9.getIcon(), };
+
+ /**
+ * Plasma Turbines
+ */
+ public static IIcon[] OVERLAY_PLASMA_TURBINE = new IIcon[] { LARGETURBINE_TU1.getIcon(), LARGETURBINE_TU2.getIcon(),
+ LARGETURBINE_TU3.getIcon(), LARGETURBINE_TU4.getIcon(), LARGETURBINE_TU5.getIcon(), LARGETURBINE_TU6.getIcon(),
+ LARGETURBINE_TU7.getIcon(), LARGETURBINE_TU8.getIcon(), LARGETURBINE_TU9.getIcon(), };
+
+ public static IIcon[] OVERLAY_PLASMA_TURBINE_ACTIVE = new IIcon[] { LARGETURBINE_TU_ACTIVE1.getIcon(),
+ LARGETURBINE_TU_ACTIVE2.getIcon(), LARGETURBINE_TU_ACTIVE3.getIcon(), LARGETURBINE_TU_ACTIVE4.getIcon(),
+ LARGETURBINE_TU_ACTIVE5.getIcon(), LARGETURBINE_TU_ACTIVE6.getIcon(), LARGETURBINE_TU_ACTIVE7.getIcon(),
+ LARGETURBINE_TU_ACTIVE8.getIcon(), LARGETURBINE_TU_ACTIVE9.getIcon(), };
+
+ public static IIcon[] OVERLAY_SC_TURBINE = new IIcon[] { OVERLAY_SC_TURBINE1.getIcon(),
+ OVERLAY_SC_TURBINE2.getIcon(), OVERLAY_SC_TURBINE3.getIcon(), OVERLAY_SC_TURBINE4.getIcon(),
+ OVERLAY_SC_TURBINE5.getIcon(), OVERLAY_SC_TURBINE6.getIcon(), OVERLAY_SC_TURBINE7.getIcon(),
+ OVERLAY_SC_TURBINE8.getIcon(), OVERLAY_SC_TURBINE9.getIcon(), };
+
+ public static IIcon[] OVERLAY_SC_TURBINE_ACTIVE = new IIcon[] { OVERLAY_SC_TURBINE1_ACTIVE.getIcon(),
+ OVERLAY_SC_TURBINE2_ACTIVE.getIcon(), OVERLAY_SC_TURBINE3_ACTIVE.getIcon(),
+ OVERLAY_SC_TURBINE4_ACTIVE.getIcon(), OVERLAY_SC_TURBINE5_ACTIVE.getIcon(),
+ OVERLAY_SC_TURBINE6_ACTIVE.getIcon(), OVERLAY_SC_TURBINE7_ACTIVE.getIcon(),
+ OVERLAY_SC_TURBINE8_ACTIVE.getIcon(), OVERLAY_SC_TURBINE9_ACTIVE.getIcon(), };
+
+ public static IIcon handleCasingsGT(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord,
+ final ForgeDirection side, final GregtechMetaSpecialMultiCasings i) {
+ final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+
+ // 0 shaft
+ // 1 LP
+ // 2 HP
+ // 3 Gas
+ // 4 Plasma
+
+ IIcon[] mGetCurrentTextureSet = null;
+ IIcon[] mGetCurrentTextureSet_ACTIVE = null;
+
+ if ((tMeta <= 0 || tMeta >= 5) && tMeta != 15) {
+ return GregtechMetaSpecialMultiCasings.getStaticIcon(side.ordinal(), (byte) tMeta);
+ } else {
+ if (tMeta == 1) {
+ mGetCurrentTextureSet = OVERLAY_LP_TURBINE;
+ mGetCurrentTextureSet_ACTIVE = OVERLAY_LP_TURBINE_ACTIVE;
+ } else if (tMeta == 2) {
+ mGetCurrentTextureSet = OVERLAY_HP_TURBINE;
+ mGetCurrentTextureSet_ACTIVE = OVERLAY_HP_TURBINE_ACTIVE;
+ } else if (tMeta == 3) {
+ mGetCurrentTextureSet = OVERLAY_GAS_TURBINE;
+ mGetCurrentTextureSet_ACTIVE = OVERLAY_GAS_TURBINE_ACTIVE;
+ } else if (tMeta == 4) {
+ mGetCurrentTextureSet = OVERLAY_PLASMA_TURBINE;
+ mGetCurrentTextureSet_ACTIVE = OVERLAY_PLASMA_TURBINE_ACTIVE;
+ } else {
+ mGetCurrentTextureSet = OVERLAY_SC_TURBINE;
+ mGetCurrentTextureSet_ACTIVE = OVERLAY_SC_TURBINE_ACTIVE;
+ }
+ if (mGetCurrentTextureSet == null || mGetCurrentTextureSet_ACTIVE == null) {
+ return GregtechMetaSpecialMultiCasings.getStaticIcon(side.ordinal(), (byte) tMeta);
+ }
+
+ if ((side == ForgeDirection.NORTH) || (side == ForgeDirection.SOUTH)) {
+ TileEntity tTileEntity;
+ IMetaTileEntity tMetaTileEntity;
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord + (side == ForgeDirection.SOUTH ? 1 : -1), yCoord - 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[0];
+ }
+ return mGetCurrentTextureSet[0];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord + (side == ForgeDirection.SOUTH ? 1 : -1), yCoord, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[3];
+ }
+ return mGetCurrentTextureSet[3];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord + (side == ForgeDirection.SOUTH ? 1 : -1), yCoord + 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[6];
+ }
+ return mGetCurrentTextureSet[6];
+ }
+ if ((null != (tTileEntity = aWorld.getTileEntity(xCoord, yCoord - 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[1];
+ }
+ return mGetCurrentTextureSet[1];
+ }
+ if ((null != (tTileEntity = aWorld.getTileEntity(xCoord, yCoord + 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[7];
+ }
+ return mGetCurrentTextureSet[7];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord + (side == ForgeDirection.NORTH ? 1 : -1), yCoord + 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[8];
+ }
+ return mGetCurrentTextureSet[8];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord + (side == ForgeDirection.NORTH ? 1 : -1), yCoord, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[5];
+ }
+ return mGetCurrentTextureSet[5];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord + (side == ForgeDirection.NORTH ? 1 : -1), yCoord - 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[2];
+ }
+ return mGetCurrentTextureSet[2];
+ }
+ } else if ((side == ForgeDirection.WEST) || (side == ForgeDirection.EAST)) {
+ TileEntity tTileEntity;
+ Object tMetaTileEntity;
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord, yCoord - 1, zCoord + (side == ForgeDirection.WEST ? 1 : -1))))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[0];
+ }
+ return mGetCurrentTextureSet[0];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord, yCoord, zCoord + (side == ForgeDirection.WEST ? 1 : -1))))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[3];
+ }
+ return mGetCurrentTextureSet[3];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord, yCoord + 1, zCoord + (side == ForgeDirection.WEST ? 1 : -1))))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[6];
+ }
+ return mGetCurrentTextureSet[6];
+ }
+ if ((null != (tTileEntity = aWorld.getTileEntity(xCoord, yCoord - 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[1];
+ }
+ return mGetCurrentTextureSet[1];
+ }
+ if ((null != (tTileEntity = aWorld.getTileEntity(xCoord, yCoord + 1, zCoord)))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[7];
+ }
+ return mGetCurrentTextureSet[7];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord, yCoord + 1, zCoord + (side == ForgeDirection.EAST ? 1 : -1))))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[8];
+ }
+ return mGetCurrentTextureSet[8];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord, yCoord, zCoord + (side == ForgeDirection.EAST ? 1 : -1))))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[5];
+ }
+ return mGetCurrentTextureSet[5];
+ }
+ if ((null != (tTileEntity = aWorld
+ .getTileEntity(xCoord, yCoord - 1, zCoord + (side == ForgeDirection.EAST ? 1 : -1))))
+ && ((tTileEntity instanceof IGregTechTileEntity))
+ && (((IGregTechTileEntity) tTileEntity).getFrontFacing() == side)
+ && (null != (tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()))
+ && ((tMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine))) {
+ if (isUsingAnimatedTexture(tTileEntity)) {
+ return mGetCurrentTextureSet_ACTIVE[2];
+ }
+ return mGetCurrentTextureSet[2];
+ }
+ }
+ }
+ return GregtechMetaSpecialMultiCasings.getStaticIcon(side.ordinal(), (byte) tMeta);
+ }
+
+ public static boolean isUsingAnimatedTexture(TileEntity tTileEntity) {
+ boolean aVal = true;
+ IGregTechTileEntity aTile;
+ if (tTileEntity instanceof IGregTechTileEntity) {
+ aTile = (IGregTechTileEntity) tTileEntity;
+ if (aTile != null) {
+ final IMetaTileEntity aMetaTileEntity = aTile.getMetaTileEntity();
+ if (aMetaTileEntity != null && aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine) {
+ aVal = ((GT_MetaTileEntity_Hatch_Turbine) aMetaTileEntity).getBaseMetaTileEntity()
+ .isActive();
+ // Logger.INFO("Returning "+aVal+" as Rotor Assembly controller status");
+ }
+ }
+ }
+ return aVal;
+ }
+
+ public static GT_MetaTileEntity_Hatch_Turbine isTurbineHatch(final IGregTechTileEntity aTileEntity) {
+ if (aTileEntity != null) {
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity != null && aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine) {
+ return (GT_MetaTileEntity_Hatch_Turbine) aMetaTileEntity;
+ }
+ }
+ return null;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/CoverManager.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/CoverManager.java
new file mode 100644
index 0000000000..c1f87ef041
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/CoverManager.java
@@ -0,0 +1,16 @@
+package gtPlusPlus.xmod.gregtech.common.covers;
+
+import gtPlusPlus.xmod.gregtech.common.items.covers.MetaItemCoverCasings;
+
+public class CoverManager {
+
+ // GT
+ public static MetaItemCoverCasings Cover_Gt_Machine_Casing;
+
+ public static void generateCustomCovers() {
+
+ // GT Machine Casings
+ Cover_Gt_Machine_Casing = new MetaItemCoverCasings();
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_Overflow.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_Overflow.java
new file mode 100644
index 0000000000..8b75f4f156
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_Overflow.java
@@ -0,0 +1,203 @@
+package gtPlusPlus.xmod.gregtech.common.covers;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget;
+
+public class GTPP_Cover_Overflow extends GT_CoverBehavior {
+
+ public final int mTransferRate;
+ public final int mInitialTransferRate;
+ public final int mMaxTransferRate;
+
+ public GTPP_Cover_Overflow(int aTransferRate) {
+ this.mTransferRate = aTransferRate * 1000 / 10;
+ this.mInitialTransferRate = aTransferRate;
+ this.mMaxTransferRate = aTransferRate * 1000;
+ }
+
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ if (aCoverVariable == 0) {
+ return aCoverVariable;
+ }
+ if ((aTileEntity instanceof IFluidHandler)) {
+ // Logger.INFO("Trying to Void via Overflow.");
+ IFluidHandler tTank1;
+ ForgeDirection directionFrom;
+ directionFrom = ForgeDirection.UNKNOWN;
+ tTank1 = (IFluidHandler) aTileEntity;
+ if (tTank1 != null) {
+ FluidStack aTankStack = tTank1.getTankInfo(directionFrom)[0].fluid;
+ if (aTankStack != null) {
+ // Logger.INFO("Found Fluid inside self - "+aTankStack.getLocalizedName()+", overflow point set at
+ // "+aCoverVariable+"L and we have "+aTankStack.amount+"L inside.");
+ if (aTankStack.amount > aCoverVariable) {
+ int aAmountToDrain = aTankStack.amount - aCoverVariable;
+ // Logger.INFO("There is "+aAmountToDrain+" more fluid in the tank than we would like.");
+ if (aAmountToDrain > 0) {
+ FluidStack tLiquid = tTank1.drain(directionFrom, Math.abs(aAmountToDrain), true);
+ if (tLiquid != null) {
+ // Logger.INFO("Drained "+aAmountToDrain+"L.");
+ }
+ }
+ }
+ } else {
+ // Logger.INFO("Could not simulate drain on self.");
+ }
+ }
+ }
+ return aCoverVariable;
+ }
+
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (GT_Utility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) {
+ aCoverVariable += (mMaxTransferRate * (aPlayer.isSneaking() ? 0.1f : 0.01f));
+ } else {
+ aCoverVariable -= (mMaxTransferRate * (aPlayer.isSneaking() ? 0.1f : 0.01f));
+ }
+ if (aCoverVariable > mMaxTransferRate) {
+ aCoverVariable = mInitialTransferRate;
+ }
+ if (aCoverVariable <= 0) {
+ aCoverVariable = mMaxTransferRate;
+ }
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("322", "Overflow point: ") + aCoverVariable + GT_Utility.trans("323", "L"));
+ return aCoverVariable;
+ }
+
+ public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ boolean aShift = aPlayer.isSneaking();
+ int aAmount = aShift ? 128 : 8;
+ if (GT_Utility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) {
+ aCoverVariable += aAmount;
+ } else {
+ aCoverVariable -= aAmount;
+ }
+ if (aCoverVariable > mMaxTransferRate) {
+ aCoverVariable = mInitialTransferRate;
+ }
+ if (aCoverVariable <= 0) {
+ aCoverVariable = mMaxTransferRate;
+ }
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("322", "Overflow point: ") + aCoverVariable + GT_Utility.trans("323", "L"));
+ aTileEntity.setCoverDataAtSide(side, new ISerializableObject.LegacyCoverData(aCoverVariable));
+ return true;
+ }
+
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 5;
+ }
+
+ // GUI
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new OverflowUIFactory(buildContext).createWindow();
+ }
+
+ private class OverflowUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ public OverflowUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ AtomicBoolean warn = new AtomicBoolean(false);
+
+ builder
+ .widget(
+ new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GTPP_Cover_Overflow.this)
+ .addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) convert(coverData),
+ (coverData, state) -> new ISerializableObject.LegacyCoverData(state.intValue()),
+ widget -> widget.setBounds(0, mMaxTransferRate)
+ .setScrollValues(1000, 144, 100000)
+ .setFocusOnGuiOpen(true)
+ .setPos(startX + spaceX * 0, startY + spaceY * 1 + 8)
+ .setSize(spaceX * 4 - 3, 12)))
+ .widget(
+ new TextWidget(GT_Utility.trans("322", "Overflow point: ")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX, 4 + startY + spaceY * 0 + 8));
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_ToggleVisual.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_ToggleVisual.java
new file mode 100644
index 0000000000..42ab793c9c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/covers/GTPP_Cover_ToggleVisual.java
@@ -0,0 +1,184 @@
+package gtPlusPlus.xmod.gregtech.common.covers;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class GTPP_Cover_ToggleVisual extends GT_CoverBehavior {
+
+ private static final Map<String, Integer> sConnectionStateForEntityMap = new ConcurrentHashMap<>();
+ private static final Map<String, String> sPrefixMap = new ConcurrentHashMap<>();
+ private static final int VALUE_OFF = 0;
+ private static final int VALUE_ON = 1;
+
+ public static String generateUniqueKey(ForgeDirection side, ICoverable aEntity) {
+ try {
+ BlockPos aPos = new BlockPos(
+ aEntity.getIGregTechTileEntity(aEntity.getXCoord(), aEntity.getYCoord(), aEntity.getZCoord()));
+
+ String s = aEntity.getInventoryName() + "." + aPos.getUniqueIdentifier() + side.name();
+ return s;
+ } catch (Throwable t) {}
+ XSTR x = new XSTR();
+ return "ERROR." + x.getSeed() + x.hashCode() + x.nextDouble() + ".ID";
+ }
+
+ public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ PlayerUtils
+ .messagePlayer(aPlayer, GT_Utility.trans("756", "Connectable: ") + getConnectionState(aCoverVariable));
+ return super.onCoverRightclick(side, aCoverID, aCoverVariable, aTileEntity, aPlayer, aX, aY, aZ);
+ }
+
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return super.onCoverScrewdriverclick(side, aCoverID, aCoverVariable, aTileEntity, aPlayer, aX, aY, aZ);
+ }
+
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 1;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ try {
+ String aKey = generateUniqueKey(side, aTileEntity);
+ Integer b = sConnectionStateForEntityMap.get(aKey);
+ // Logger.INFO("Val: "+aCoverVariable);
+ if (b != null && aCoverVariable != b) {
+ aCoverVariable = b;
+ }
+ if (b == null) {
+ b = aCoverVariable;
+ sConnectionStateForEntityMap.put(aKey, b);
+ trySetState(side, b == VALUE_ON ? VALUE_ON : VALUE_OFF, aTileEntity);
+ }
+ } catch (Throwable t) {
+
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ @Override
+ public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return getConnectionState(aCoverVariable);
+ }
+
+ @Override
+ public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return super.alwaysLookConnected(side, aCoverID, aCoverVariable, aTileEntity);
+ }
+
+ @Override
+ public byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ if (!getConnectionState(aCoverVariable)) {
+ return 0;
+ }
+ return super.getRedstoneInput(side, aInputRedstone, aCoverID, aCoverVariable, aTileEntity);
+ }
+
+ @Override
+ public void placeCover(ForgeDirection side, ItemStack aCover, ICoverable aTileEntity) {
+ String aKey = generateUniqueKey(side, aTileEntity);
+ boolean state = getCoverConnections(aCover);
+ sPrefixMap.put(aKey, aCover.getUnlocalizedName());
+ Logger.INFO("Mapping key " + aKey + " to " + state);
+ sConnectionStateForEntityMap.put(aKey, state ? VALUE_ON : VALUE_OFF);
+ Logger.INFO("Key Value: " + (state ? VALUE_ON : VALUE_OFF));
+ // Try set cover state directly
+ // trySetState(aSide, state ? VALUE_ON : VALUE_OFF, aTileEntity);
+ super.placeCover(side, aCover, aTileEntity);
+ }
+
+ @Override
+ public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ boolean aForced) {
+ String aKey = generateUniqueKey(side, aTileEntity);
+ sConnectionStateForEntityMap.remove(aKey);
+ // Logger.INFO("Unmapping key "+aKey+".");
+ return true;
+ }
+
+ public static boolean getConnectionState(int aCoverVar) {
+ return aCoverVar == VALUE_ON;
+ }
+
+ private static void trySetState(ForgeDirection side, int aState, ICoverable aTile) {
+ // Try set cover state directly
+ if (aTile instanceof IGregTechTileEntity gTileEntity) {
+ gTileEntity.setCoverDataAtSide(side, new ISerializableObject.LegacyCoverData(aState));
+ }
+ }
+
+ public static boolean getConnectionState(ForgeDirection side, ICoverable aTile) {
+ String aKey = generateUniqueKey(side, aTile);
+ return getConnectionState(aKey);
+ }
+
+ public static boolean getConnectionState(String aKey) {
+ Integer b = sConnectionStateForEntityMap.get(aKey);
+ // Logger.INFO("Get State: "+b+" | "+aKey);
+ return b != null ? b == VALUE_ON : false;
+ }
+
+ public static final boolean getCoverConnections(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("CustomCoverMeta");
+ if (aNBT != null) {
+ return aNBT.getBoolean("AllowConnections");
+ }
+ }
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/ChargingHelper.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/ChargingHelper.java
new file mode 100644
index 0000000000..924484e098
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/ChargingHelper.java
@@ -0,0 +1,346 @@
+package gtPlusPlus.xmod.gregtech.common.helpers;
+
+import static gregtech.api.GregTech_API.mEUtoRF;
+import static gregtech.api.enums.Mods.Baubles;
+import static gregtech.api.enums.Mods.COFHCore;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+
+import baubles.api.BaublesApi;
+import cofh.api.energy.IEnergyContainerItem;
+import cpw.mods.fml.common.eventhandler.EventPriority;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.TickEvent.ServerTickEvent;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.common.items.GT_MetaGenerated_Item_01;
+import gregtech.common.items.GT_MetaGenerated_Item_02;
+import gregtech.common.items.GT_MetaGenerated_Item_03;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaWirelessCharger;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+
+public class ChargingHelper {
+
+ private static final Map<String, Pair<GregtechMetaWirelessCharger, Byte>> mValidPlayers = new HashMap<>();
+ protected static Map<BlockPos, GregtechMetaWirelessCharger> mChargerMap = new HashMap<>();
+ private int mTickTimer = 0;
+ private static final int mTickMultiplier = 20;
+
+ @SubscribeEvent(priority = EventPriority.HIGHEST)
+ public void onServerTick(ServerTickEvent event) {
+ if (++mTickTimer % mTickMultiplier == 0) {
+ if (Utils.isServer()) {
+ for (EntityPlayer mPlayerMan : PlayerUtils.getOnlinePlayers()) {
+ doPlayerChargeTick(mPlayerMan);
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private void doPlayerChargeTick(EntityPlayer mPlayerMan) {
+ try {
+ long mVoltage;
+ long mEuStored;
+
+ if (!mChargerMap.isEmpty() && mValidPlayers.containsKey(mPlayerMan.getDisplayName())) {
+ InventoryPlayer mPlayerInventory = mPlayerMan.inventory;
+ ItemStack[] mArmourContents = mPlayerInventory.armorInventory.clone();
+ ItemStack[] mInventoryContents = mPlayerInventory.mainInventory.clone();
+ ItemStack[] baubleSlots = null;
+ if (Baubles.isModLoaded()) {
+ IInventory baubleInv = BaublesApi.getBaubles(mPlayerMan);
+ if (baubleInv != null) {
+ baubleSlots = new ItemStack[baubleInv.getSizeInventory()];
+ for (int i = 0; i < baubleInv.getSizeInventory(); i++) {
+ baubleSlots[i] = baubleInv.getStackInSlot(i);
+ }
+ }
+ }
+
+ for (GregtechMetaWirelessCharger mEntityTemp : mChargerMap.values()) {
+ if (mEntityTemp != null) {
+ if (mEntityTemp.getBaseMetaTileEntity() == null || !mEntityTemp.getBaseMetaTileEntity()
+ .isAllowedToWork()) continue;
+ if (mPlayerMan.getEntityWorld().provider.dimensionId == mEntityTemp.getDimensionID()) {
+ mVoltage = mEntityTemp.maxEUInput();
+ mEuStored = mEntityTemp.getEUVar();
+ if (mVoltage > 0 && mEuStored >= mVoltage) {
+ Map<String, UUID> LR = mEntityTemp.getLongRangeMap();
+ Map<String, UUID> LO = mEntityTemp.getLocalMap();
+
+ long mStartingEu = mEntityTemp.getEUVar();
+ if (canCharge(mEntityTemp, mPlayerMan, LR, LO)) {
+ chargeItems(mEntityTemp, mArmourContents);
+ chargeItems(mEntityTemp, mInventoryContents);
+ chargeItems(mEntityTemp, baubleSlots);
+ }
+
+ if (mStartingEu - mEntityTemp.getEUVar() <= 0) {
+ long mMaxDistance;
+ if (mEntityTemp.getMode() == 0) {
+ mMaxDistance = (4 * GT_Values.V[mEntityTemp.getTier()]);
+ } else if (mEntityTemp.getMode() == 1) {
+ mMaxDistance = (mEntityTemp.getTier() * 10L);
+ } else {
+ mMaxDistance = (4 * GT_Values.V[mEntityTemp.getTier()] / 2);
+ }
+ double mDistance = calculateDistance(mEntityTemp, mPlayerMan);
+ long mVoltageCost = MathUtils.findPercentageOfInt(mMaxDistance, (float) mDistance);
+
+ if (mVoltageCost > 0) {
+ if (mVoltageCost > mEntityTemp.maxEUInput()) {
+ mEntityTemp.setEUVar((mEntityTemp.getEUVar() - mEntityTemp.maxEUInput()));
+ } else {
+ mEntityTemp.setEUVar((mEntityTemp.getEUVar() - mVoltageCost));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } catch (Throwable t) {
+ if (!mChargerMap.isEmpty()) {
+ for (BlockPos aPos : mChargerMap.keySet()) {
+ GregtechMetaWirelessCharger r = mChargerMap.get(aPos);
+ if (r == null || r.getBaseMetaTileEntity()
+ .isInvalidTileEntity()) {
+ mChargerMap.remove(aPos);
+ }
+ }
+ }
+ }
+ }
+
+ public static GregtechMetaWirelessCharger getEntry(BlockPos mPos) {
+ return mChargerMap.get(mPos);
+ }
+
+ public static boolean addEntry(BlockPos mPos, GregtechMetaWirelessCharger mEntity) {
+ if (mEntity == null) {
+ return false;
+ }
+ mChargerMap.put(mPos, mEntity);
+ return true;
+ }
+
+ public static boolean removeEntry(BlockPos mPos, GregtechMetaWirelessCharger mEntity) {
+ if (mEntity == null) {
+ return false;
+ }
+ if (mChargerMap.containsKey(mPos)) {
+ return mChargerMap.remove(mPos, mEntity);
+ } else {
+ return false;
+ }
+ }
+
+ public static boolean addValidPlayer(EntityPlayer mPlayer, GregtechMetaWirelessCharger mEntity) {
+ if (mEntity == null) {
+ return false;
+ }
+ if (mValidPlayers.containsKey(mPlayer.getDisplayName())) {
+ return false;
+ } else {
+ Pair<GregtechMetaWirelessCharger, Byte> mEntry = new Pair<>(mEntity, (byte) mEntity.getMode());
+ return mValidPlayers.put(mPlayer.getDisplayName(), mEntry) == null;
+ }
+ }
+
+ public static boolean removeValidPlayer(EntityPlayer mPlayer, GregtechMetaWirelessCharger mEntity) {
+ if (mEntity == null) {
+ return false;
+ }
+ if (mValidPlayers.containsKey(mPlayer.getDisplayName())) {
+ Pair<GregtechMetaWirelessCharger, Byte> mEntry = new Pair<>(mEntity, (byte) mEntity.getMode());
+ return mValidPlayers.remove(mPlayer.getDisplayName(), mEntry);
+ } else {
+ return false;
+ }
+ }
+
+ private boolean canCharge(GregtechMetaWirelessCharger charger, EntityPlayer chargeablePlayer,
+ Map<String, UUID> longRangeChargers, Map<String, UUID> shortRangeChargers) {
+ if (charger.getMode() == 0) {
+ return !longRangeChargers.isEmpty() && longRangeChargers.containsKey(chargeablePlayer.getDisplayName());
+ } else if (charger.getMode() == 1) {
+ return !shortRangeChargers.isEmpty() && shortRangeChargers.containsKey(chargeablePlayer.getDisplayName());
+ } else {
+ if (!longRangeChargers.isEmpty() && longRangeChargers.containsKey(chargeablePlayer.getDisplayName())) {
+ return true;
+ }
+ return !shortRangeChargers.isEmpty() && shortRangeChargers.containsKey(chargeablePlayer.getDisplayName());
+ }
+ }
+
+ private double calculateDistance(GregtechMetaWirelessCharger mEntityTemp, EntityPlayer mPlayerMan) {
+ if (mEntityTemp == null || mPlayerMan == null) {
+ return 0;
+ }
+ return mEntityTemp.getDistanceBetweenTwoPositions(
+ mEntityTemp.getTileEntityPosition(),
+ mEntityTemp.getPositionOfEntity(mPlayerMan));
+ }
+
+ private void chargeItems(@Nonnull GregtechMetaWirelessCharger mEntity, ItemStack[] mItems) {
+ if (mItems == null || mItems.length == 0) {
+ return;
+ }
+ chargeItemsEx(mEntity, mItems);
+ }
+
+ private void chargeItemsEx(@Nonnull GregtechMetaWirelessCharger mEntity, ItemStack[] mItems) {
+ // Bad Inventory
+ if (mItems == null || mItems.length == 0) {
+ return;
+ }
+ // Set Variables to Charge
+ final long mVoltage = mEntity.maxEUInput();
+ long mEuStored = mEntity.getEUVar();
+ // For Inventory Contents
+
+ for (ItemStack mTemp : mItems) {
+ // Is item Electrical
+ if (isItemValid(mTemp)) {
+ // Transfer Limit
+ double mItemEuTLimit = ((IElectricItem) mTemp.getItem()).getTransferLimit(mTemp);
+ // Check if Tile has more or equal EU to what can be transferred into the item.
+ if (mEuStored >= mItemEuTLimit) {
+
+ double mItemMaxCharge = ((IElectricItem) mTemp.getItem()).getMaxCharge(mTemp);
+ double mitemCurrentCharge = ElectricItem.manager.getCharge(mTemp);
+
+ if (mitemCurrentCharge >= mItemMaxCharge) {
+ continue;
+ }
+
+ // Try to get charge direct from NBT for GT and IC2 stacks
+ if (mTemp.getItem() instanceof GT_MetaGenerated_Tool_01
+ || mTemp.getItem() instanceof GT_MetaGenerated_Item_01
+ || mTemp.getItem() instanceof GT_MetaGenerated_Item_02
+ || mTemp.getItem() instanceof GT_MetaGenerated_Item_03
+ || mTemp.getItem()
+ .getClass()
+ .getName()
+ .equalsIgnoreCase(GT_MetaGenerated_Tool_01.class.getName())) {
+ if (!NBTUtils.hasKey(mTemp, "GT.ItemCharge")) {
+ if (!mTemp.getDisplayName()
+ .toLowerCase()
+ .contains("battery")) {
+ if (!GT_ModHandler.isElectricItem(mTemp)) {
+ continue;
+ }
+ } else {
+ mitemCurrentCharge = 0;
+ }
+ } else {
+ mitemCurrentCharge = NBTUtils.getLong(mTemp, "GT.ItemCharge");
+ }
+ } else if (mTemp.getItem() instanceof IElectricItem) {
+ mitemCurrentCharge = NBTUtils.getLong(mTemp, "charge");
+ }
+
+ double mVoltageIncrease;
+ if (mItemEuTLimit >= mVoltage) {
+ mVoltageIncrease = mVoltage;
+ } else if (mItemEuTLimit < mVoltage) {
+ mVoltageIncrease = mItemEuTLimit;
+ } else {
+ mVoltageIncrease = mItemEuTLimit;
+ }
+
+ int mMulti;
+ if ((mitemCurrentCharge + (mVoltageIncrease * 20)) <= (mItemMaxCharge - (mVoltageIncrease * 20))) {
+ mMulti = 20;
+ } else if ((mitemCurrentCharge + (mVoltageIncrease * 10))
+ <= (mItemMaxCharge - (mVoltageIncrease * 10))) {
+ mMulti = 10;
+ } else if ((mitemCurrentCharge + (mVoltageIncrease * 5))
+ <= (mItemMaxCharge - (mVoltageIncrease * 5))) {
+ mMulti = 5;
+ } else {
+ mMulti = 1;
+ }
+
+ int mMultiVoltage = (int) (mMulti * mVoltageIncrease);
+
+ if ((mitemCurrentCharge + mMultiVoltage) <= mItemMaxCharge) {
+ if (GT_ModHandler.chargeElectricItem(mTemp, mMultiVoltage, Integer.MAX_VALUE, true, false)
+ > 0) {
+ for (int i = 0; i < mMulti; i++) {
+ ElectricItem.manager.charge(mTemp, mVoltageIncrease, Integer.MAX_VALUE, false, false);
+ }
+ }
+ if (ElectricItem.manager.getCharge(mTemp) > mitemCurrentCharge) {
+ mEntity.setEUVar(mEuStored - (mVoltage * mMulti));
+ mEuStored = mEntity.getEUVar();
+ }
+ }
+
+ // Try top up Item Chrage
+ mitemCurrentCharge = ElectricItem.manager.getCharge(mTemp);
+ if (mitemCurrentCharge < mItemMaxCharge && mitemCurrentCharge >= (mItemMaxCharge - mVoltage)) {
+ int xDif = (int) (mItemMaxCharge - mitemCurrentCharge);
+ if (GT_ModHandler.chargeElectricItem(mTemp, xDif, Integer.MAX_VALUE, true, false) >= 0) {
+ if (ElectricItem.manager.getCharge(mTemp) >= mItemMaxCharge) {
+ mEntity.setEUVar(mEntity.getEUVar() - (xDif));
+ mEuStored = mEntity.getEUVar();
+ }
+ }
+ }
+ }
+ } else if (isItemValidRF(mTemp)) {
+ try {
+ IEnergyContainerItem rfItem = (IEnergyContainerItem) mTemp.getItem();
+ if (rfItem != null) {
+ long chargedPower = Math.min(
+ rfItem.getMaxEnergyStored(mTemp) - rfItem.getEnergyStored(mTemp),
+ mEntity.getEUVar() * mEUtoRF / 100L);
+ chargedPower = rfItem.receiveEnergy(
+ mTemp,
+ chargedPower > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) chargedPower,
+ false);
+ chargedPower = chargedPower * 100L / mEUtoRF;
+ mEntity.setEUVar(Math.max(mEntity.getEUVar() - chargedPower, 0));
+ mEuStored = mEntity.getEUVar();
+ }
+ } catch (Exception ignored) {
+
+ }
+ }
+ }
+ }
+
+ public static boolean isItemValid(final ItemStack itemstack) {
+ if (itemstack == null) {
+ return false;
+ }
+ if (GT_ModHandler.isElectricItem(itemstack)) {
+ return true;
+ }
+ return itemstack.getItem() instanceof IElectricItem;
+ }
+
+ private static boolean isItemValidRF(final ItemStack itemStack) {
+ return itemStack != null && COFHCore.isModLoaded() && itemStack.getItem() instanceof IEnergyContainerItem;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/FlotationRecipeHandler.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/FlotationRecipeHandler.java
new file mode 100644
index 0000000000..8cbb473a42
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/FlotationRecipeHandler.java
@@ -0,0 +1,62 @@
+package gtPlusPlus.xmod.gregtech.common.helpers;
+
+import java.util.HashMap;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+
+public class FlotationRecipeHandler {
+
+ private static final HashMap<String, Material> sMaterialMap = new HashMap<>();
+ private static final HashMap<String, ItemStack> sMilledMap = new HashMap<>();
+
+ public static boolean registerOreType(Material aMaterial) {
+ String aMaterialKey = aMaterial.getUnlocalizedName();
+ if (sMaterialMap.containsKey(aMaterialKey)) {
+ Logger.WARNING("Tried to register a Flotation material already in use. Material: " + aMaterialKey);
+ return false;
+ } else {
+ sMaterialMap.put(aMaterialKey, aMaterial);
+ sMilledMap.put(aMaterialKey, aMaterial.getMilled(1));
+ }
+ return true;
+ }
+
+ public static Material getMaterialOfMilledProduct(ItemStack aMilled) {
+ for (String aKey : sMilledMap.keySet()) {
+ ItemStack aTempMilledStack = sMilledMap.get(aKey);
+ if (GT_Utility.areStacksEqual(aTempMilledStack, aMilled, true)) {
+ return sMaterialMap.get(aKey);
+ }
+ }
+ return null;
+ }
+
+ public static ItemStack findMilledStack(GT_Recipe aRecipe) {
+ if (aRecipe == null || aRecipe.mInputs == null || aRecipe.mInputs.length <= 0) {
+ return null;
+ }
+ return findMilledStack(aRecipe.mInputs);
+ }
+
+ public static ItemStack findMilledStack(ItemStack[] aInputs) {
+ if (aInputs == null || aInputs.length <= 0) {
+ return null;
+ }
+ for (ItemStack aStack : aInputs) {
+ for (int oredictID : OreDictionary.getOreIDs(aStack)) {
+ String oredict = OreDictionary.getOreName(oredictID);
+ if (oredict.startsWith(OrePrefixes.milled.toString())) {
+ return aStack;
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/GT_MethodHelper.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/GT_MethodHelper.java
new file mode 100644
index 0000000000..ced9b46c3e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/GT_MethodHelper.java
@@ -0,0 +1,19 @@
+package gtPlusPlus.xmod.gregtech.common.helpers;
+
+import net.minecraft.block.Block;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ITexturedTileEntity;
+
+public class GT_MethodHelper {
+
+ public static ITexture[] getTexture(TileEntity tTileEntity, Block aBlock, ForgeDirection side) {
+ if (tTileEntity instanceof ITexturedTileEntity) {
+ return ((ITexturedTileEntity) tTileEntity).getTexture(aBlock, side);
+ }
+ return BlockIcons.ERROR_RENDERING;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/VolumetricFlaskHelper.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/VolumetricFlaskHelper.java
new file mode 100644
index 0000000000..2b0e2a7a4d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/VolumetricFlaskHelper.java
@@ -0,0 +1,125 @@
+package gtPlusPlus.xmod.gregtech.common.helpers;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.common.items.GT_VolumetricFlask;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class VolumetricFlaskHelper {
+
+ public static ItemStack getVolumetricFlask(int aAmount) {
+ return ItemList.VOLUMETRIC_FLASK.get(aAmount);
+ }
+
+ public static ItemStack getLargeVolumetricFlask(int aAmount) {
+ return GregtechItemList.VOLUMETRIC_FLASK_8k.get(aAmount);
+ }
+
+ public static ItemStack getGiganticVolumetricFlask(int aAmount) {
+ return GregtechItemList.VOLUMETRIC_FLASK_32k.get(aAmount);
+ }
+
+ public static boolean isVolumetricFlask(ItemStack aStack) {
+ return isNormalVolumetricFlask(aStack) || isLargeVolumetricFlask(aStack) || isGiganticVolumetricFlask(aStack);
+ }
+
+ public static boolean isNormalVolumetricFlask(ItemStack aStack) {
+ return aStack.getItem() == ItemList.VOLUMETRIC_FLASK.getItem();
+ }
+
+ public static boolean isLargeVolumetricFlask(ItemStack aStack) {
+ return GregtechItemList.VOLUMETRIC_FLASK_8k.getItem() == aStack.getItem();
+ }
+
+ public static boolean isGiganticVolumetricFlask(ItemStack aStack) {
+ return GregtechItemList.VOLUMETRIC_FLASK_32k.getItem() == aStack.getItem();
+ }
+
+ public static int getMaxFlaskCapacity(ItemStack aStack) {
+ if (aStack != null) {
+ Item aItem = aStack.getItem();
+ if (aItem instanceof GT_VolumetricFlask) {
+ return ((GT_VolumetricFlask) aItem).getMaxCapacity();
+ }
+ }
+ return 0;
+ }
+
+ public static boolean isFlaskEmpty(ItemStack aStack) {
+ return getFlaskFluid(aStack) == null;
+ }
+
+ public static FluidStack getFlaskFluid(ItemStack aStack) {
+ if (aStack.hasTagCompound()) {
+ NBTTagCompound nbt = aStack.getTagCompound();
+ if (nbt.hasKey("Fluid", 10)) return FluidStack.loadFluidStackFromNBT(nbt.getCompoundTag("Fluid"));
+ }
+ return null;
+ }
+
+ public static void setFluid(ItemStack stack, FluidStack fluidStack) {
+ boolean removeFluid = (fluidStack == null) || (fluidStack.amount <= 0);
+ NBTTagCompound nbt = stack.getTagCompound();
+ if (nbt == null) {
+ if (removeFluid) return;
+ stack.setTagCompound(nbt = new NBTTagCompound());
+ }
+ if (removeFluid) {
+ nbt.removeTag("Fluid");
+ if (nbt.hasNoTags()) {
+ stack.setTagCompound(null);
+ }
+ } else {
+ nbt.setTag("Fluid", fluidStack.writeToNBT(new NBTTagCompound()));
+ }
+ }
+
+ public static int getFlaskCapacity(ItemStack aStack) {
+ int capacity = 1000;
+ if (aStack.hasTagCompound()) {
+ NBTTagCompound nbt = aStack.getTagCompound();
+ if (nbt.hasKey("Capacity", 3)) capacity = nbt.getInteger("Capacity");
+ }
+ return Math.min(getMaxFlaskCapacity(aStack), capacity);
+ }
+
+ public static boolean setNewFlaskCapacity(ItemStack aStack, int aCapacity) {
+ if (aStack == null || aCapacity <= 0) {
+ return false;
+ }
+ aCapacity = Math.min(aCapacity, getMaxFlaskCapacity(aStack));
+ NBTTagCompound nbt = aStack.getTagCompound();
+ if (nbt == null) {
+ aStack.setTagCompound(nbt = new NBTTagCompound());
+ }
+ nbt.setInteger("Capacity", aCapacity);
+ return true;
+ }
+
+ public static int fillFlask(ItemStack stack, FluidStack resource, boolean doFill) {
+ if (stack.stackSize != 1) return 0;
+ if ((resource == null) || (resource.amount <= 0)) {
+ return 0;
+ }
+ FluidStack fluidStack = getFlaskFluid(stack);
+ if (fluidStack == null) {
+ fluidStack = new FluidStack(resource, 0);
+ } else if (!fluidStack.isFluidEqual(resource)) {
+ return 0;
+ }
+ int amount = Math.min(getMaxFlaskCapacity(stack) - fluidStack.amount, resource.amount);
+ if ((doFill) && (amount > 0)) {
+ fluidStack.amount += amount;
+ setFluid(stack, fluidStack);
+ }
+ return amount;
+ }
+
+ public static Item generateNewFlask(String unlocalized, String english, int maxCapacity) {
+ return new GT_VolumetricFlask(unlocalized, english, maxCapacity);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/tesseract/TesseractHelper.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/tesseract/TesseractHelper.java
new file mode 100644
index 0000000000..3717f17554
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/helpers/tesseract/TesseractHelper.java
@@ -0,0 +1,256 @@
+package gtPlusPlus.xmod.gregtech.common.helpers.tesseract;
+
+import static gtPlusPlus.core.lib.CORE.sTesseractGeneratorOwnershipMap;
+import static gtPlusPlus.core.lib.CORE.sTesseractTerminalOwnershipMap;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.UUID;
+
+import net.minecraft.entity.player.EntityPlayer;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_TesseractGenerator;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_TesseractTerminal;
+
+public class TesseractHelper {
+
+ /**
+ * Tesseract Generator Helpers
+ *
+ * @param player
+ * @return
+ */
+
+ // Checks if a Generator is owned by a player.
+ public static final boolean isGeneratorOwnedByPlayer(EntityPlayer player,
+ GT_MetaTileEntity_TesseractGenerator generator) {
+ if (player == null) {
+ Logger.WARNING("Failed. [isGeneratorOwnedByPlayer]");
+ return false;
+ }
+ // Utils.LOG_WARNING("Success. [isGeneratorOwnedByPlayer] 1");
+ UUID playerIdentifier = player.getUniqueID();
+ if (!sTesseractGeneratorOwnershipMap.isEmpty() && playerIdentifier != null) {
+ // Utils.LOG_WARNING("Success. [isGeneratorOwnedByPlayer] 2");
+ Map<Integer, GT_MetaTileEntity_TesseractGenerator> generators = getGeneratorOwnershipByPlayer(player);
+ Set<Entry<Integer, GT_MetaTileEntity_TesseractGenerator>> players = generators.entrySet();
+ for (Entry<Integer, GT_MetaTileEntity_TesseractGenerator> current : players) {
+ // Utils.LOG_WARNING("Success. [isGeneratorOwnedByPlayer] 3");
+ if (current.getValue()
+ .equals(generator)) {
+ // Utils.LOG_WARNING("Success. [isGeneratorOwnedByPlayer] 4");
+ return true;
+ }
+ }
+ }
+ Logger.WARNING("Failed. [isGeneratorOwnedByPlayer]");
+ return false;
+ }
+
+ // Saves A Generator to the Players UUID map along with the Freq.
+ public static final boolean setGeneratorOwnershipByPlayer(EntityPlayer player, int freq,
+ GT_MetaTileEntity_TesseractGenerator generator) {
+ if (player == null) {
+ return false;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ Logger.WARNING("Setting Generator on " + freq + " for " + player.getDisplayName() + ".");
+ if (playerIdentifier != null) {
+ Map<Integer, GT_MetaTileEntity_TesseractGenerator> playerOwned = sTesseractGeneratorOwnershipMap
+ .get(playerIdentifier);
+ if (playerOwned == null || playerOwned.isEmpty()) {
+ Map<Integer, GT_MetaTileEntity_TesseractGenerator> newOwnershipMap = new HashMap<>();
+ newOwnershipMap.put(freq, generator);
+ sTesseractGeneratorOwnershipMap.put(playerIdentifier, newOwnershipMap);
+ Logger.WARNING("Success! [Empty Map]");
+ return true;
+ } else if (sTesseractGeneratorOwnershipMap.containsKey(playerIdentifier)) {
+ Map<Integer, GT_MetaTileEntity_TesseractGenerator> ownershipMap = sTesseractGeneratorOwnershipMap
+ .get(playerIdentifier);
+ if (!ownershipMap.containsKey(freq)) {
+ ownershipMap.put(freq, generator);
+ }
+ ownershipMap.put(freq, generator);
+ sTesseractGeneratorOwnershipMap.put(playerIdentifier, ownershipMap);
+ Logger.WARNING("Success!");
+ return true;
+ }
+ }
+ Logger.WARNING("Failed. [setGeneratorOwnershipByPlayer]");
+ return false;
+ }
+
+ // Gets Generator based on Frequency.
+ public static final GT_MetaTileEntity_TesseractGenerator getGeneratorByFrequency(EntityPlayer player, int freq) {
+ if (player == null) {
+ return null;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ Logger.WARNING("Getting Generator on " + freq + " for " + player.getDisplayName() + ".");
+ if (!sTesseractGeneratorOwnershipMap.isEmpty() && playerIdentifier != null) {
+ // Utils.LOG_WARNING("Success. [getGeneratorByFrequency] 1");
+ Map<Integer, GT_MetaTileEntity_TesseractGenerator> generators = getGeneratorOwnershipByPlayer(player);
+ Set<Entry<Integer, GT_MetaTileEntity_TesseractGenerator>> players = generators.entrySet();
+ for (Entry<Integer, GT_MetaTileEntity_TesseractGenerator> current : players) {
+ // Utils.LOG_WARNING("Success. [getGeneratorByFrequency] 2");
+ if (current.getKey()
+ .equals(freq)) {
+ // Utils.LOG_WARNING("Success. [getGeneratorByFrequency] 3");
+ Logger.WARNING("Success!");
+ return current.getValue();
+ }
+ }
+ }
+ Logger.WARNING("Failed. [getGeneratorByFrequency]");
+ return null;
+ }
+
+ // Remove Tesseract Generator
+ public static final boolean removeGenerator(EntityPlayer player, int frequency) {
+ if (player == null) {
+ return false;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ if (!sTesseractGeneratorOwnershipMap.isEmpty() && playerIdentifier != null) {
+ sTesseractGeneratorOwnershipMap.get(playerIdentifier)
+ .remove(frequency);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ *
+ * Tesseract Terminal Helpers
+ *
+ * @param player
+ * @return
+ */
+
+ // Checks if a Terminal is owned by a player.
+ public static final boolean isTerminalOwnedByPlayer(EntityPlayer player,
+ GT_MetaTileEntity_TesseractTerminal generator) {
+ if (player == null) {
+ return false;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ if (!sTesseractTerminalOwnershipMap.isEmpty() && playerIdentifier != null) {
+ Map<Integer, GT_MetaTileEntity_TesseractTerminal> generators = getTerminalOwnershipByPlayer(player);
+ Set<Entry<Integer, GT_MetaTileEntity_TesseractTerminal>> players = generators.entrySet();
+ for (Entry<Integer, GT_MetaTileEntity_TesseractTerminal> current : players) {
+ if (current.getValue()
+ .equals(generator)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ // Saves A Terminal to the Players UUID map along with the Freq.
+ public static final boolean setTerminalOwnershipByPlayer(EntityPlayer player, int freq,
+ GT_MetaTileEntity_TesseractTerminal generator) {
+ if (player == null) {
+ return false;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ if (playerIdentifier != null) {
+ Logger.WARNING("Setting Terminal on " + freq + " for " + player.getDisplayName() + ".");
+ Map<Integer, GT_MetaTileEntity_TesseractTerminal> playerOwned = sTesseractTerminalOwnershipMap
+ .get(playerIdentifier);
+ if (playerOwned == null || playerOwned.isEmpty()) {
+ Map<Integer, GT_MetaTileEntity_TesseractTerminal> newOwnershipMap = new HashMap<>();
+ newOwnershipMap.put(freq, generator);
+ sTesseractTerminalOwnershipMap.put(playerIdentifier, newOwnershipMap);
+ Logger.WARNING("Success! [Empty Map]");
+ return true;
+ } else if (sTesseractTerminalOwnershipMap.containsKey(playerIdentifier)) {
+ Map<Integer, GT_MetaTileEntity_TesseractTerminal> ownershipMap = sTesseractTerminalOwnershipMap
+ .get(playerIdentifier);
+ if (!ownershipMap.containsKey(freq)) {
+ ownershipMap.put(freq, generator);
+ }
+ sTesseractTerminalOwnershipMap.put(playerIdentifier, ownershipMap);
+ Logger.WARNING("Success!");
+ return true;
+ }
+ }
+ Logger.WARNING("Failed. [setTerminalOwnershipByPlayer]");
+ return false;
+ }
+
+ // Gets Terminal based on Frequency.
+ public static final GT_MetaTileEntity_TesseractTerminal getTerminalByFrequency(EntityPlayer player, int freq) {
+ if (player == null) {
+ return null;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ Logger.WARNING("Getting Terminal on " + freq + " for " + player.getDisplayName() + ".");
+ if (!sTesseractTerminalOwnershipMap.isEmpty() && playerIdentifier != null) {
+ Map<Integer, GT_MetaTileEntity_TesseractTerminal> generators = getTerminalOwnershipByPlayer(player);
+ Set<Entry<Integer, GT_MetaTileEntity_TesseractTerminal>> players = generators.entrySet();
+ for (Entry<Integer, GT_MetaTileEntity_TesseractTerminal> current : players) {
+ if (current.getKey()
+ .equals(freq)) {
+ Logger.WARNING("Success!");
+ return current.getValue();
+ }
+ }
+ }
+ Logger.WARNING("Failed. [getTerminalByFrequency]");
+ return null;
+ }
+
+ // Remove Tesseract Terminal
+ public static final boolean removeTerminal(EntityPlayer player, int frequency) {
+ if (player == null) {
+ return false;
+ }
+ UUID playerIdentifier = player.getUniqueID();
+ if (!sTesseractTerminalOwnershipMap.isEmpty() && playerIdentifier != null) {
+ sTesseractTerminalOwnershipMap.get(playerIdentifier)
+ .remove(frequency);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ *
+ * Internal Methods
+ *
+ */
+ private static Map<Integer, GT_MetaTileEntity_TesseractGenerator> getGeneratorOwnershipByPlayer(
+ EntityPlayer player) {
+ UUID playerIdentifier = player.getUniqueID();
+ if (!sTesseractGeneratorOwnershipMap.isEmpty() && playerIdentifier != null) {
+ Set<Entry<UUID, Map<Integer, GT_MetaTileEntity_TesseractGenerator>>> players = sTesseractGeneratorOwnershipMap
+ .entrySet();
+ for (Entry<UUID, Map<Integer, GT_MetaTileEntity_TesseractGenerator>> current : players) {
+ if (current.getKey()
+ .compareTo(playerIdentifier) == 0) {
+ return current.getValue();
+ }
+ }
+ }
+ return null;
+ }
+
+ private static Map<Integer, GT_MetaTileEntity_TesseractTerminal> getTerminalOwnershipByPlayer(EntityPlayer player) {
+ UUID playerIdentifier = player.getUniqueID();
+ if (!sTesseractTerminalOwnershipMap.isEmpty() && playerIdentifier != null) {
+ Set<Entry<UUID, Map<Integer, GT_MetaTileEntity_TesseractTerminal>>> players = sTesseractTerminalOwnershipMap
+ .entrySet();
+ for (Entry<UUID, Map<Integer, GT_MetaTileEntity_TesseractTerminal>> current : players) {
+ if (current.getKey()
+ .compareTo(playerIdentifier) == 0) {
+ return current.getValue();
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaCustomCoverItem.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaCustomCoverItem.java
new file mode 100644
index 0000000000..8edb8c2cf9
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaCustomCoverItem.java
@@ -0,0 +1,222 @@
+package gtPlusPlus.xmod.gregtech.common.items;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.List;
+
+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;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import org.apache.commons.lang3.StringUtils;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.objects.GT_MultiTexture;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+import gtPlusPlus.xmod.gregtech.common.covers.GTPP_Cover_ToggleVisual;
+
+public class MetaCustomCoverItem extends Item {
+
+ protected final IIcon[] icons;
+ private final String mModID;
+ private final String mTextureSetName;
+ protected final IIconContainer[] mTextures;
+ private final short[][] mRGB;
+
+ public MetaCustomCoverItem(String aModId, int aTextureCount, String aTextureSetName, IIconContainer[] aTextures,
+ short[][] aRGB) {
+ super();
+ icons = new IIcon[aTextureCount];
+ mModID = aModId;
+ mTextureSetName = Utils.sanitizeString(aTextureSetName);
+ mTextures = aTextures;
+ mRGB = aRGB;
+ this.setTextureName(GTPlusPlus.ID + ":" + "itemPlate");
+ this.setHasSubtypes(true);
+ String unlocalizedName = "itemCustomMetaCover." + mModID + "." + mTextureSetName;
+ this.setUnlocalizedName(unlocalizedName);
+ this.setCreativeTab(AddToCreativeTab.tabMisc);
+ this.setMaxStackSize(1);
+ GameRegistry.registerItem(this, unlocalizedName);
+ registerCover();
+ Logger.INFO(
+ "[Covers] Generated Custom covers for " + mModID
+ + " using "
+ + aTextureCount
+ + " textures from "
+ + mTextureSetName
+ + ".");
+ }
+
+ public boolean hide() {
+ return true;
+ }
+
+ private void registerCover() {
+ // CommonProxy.registerItemRendererGlobal(this, new CustomItemBlockRenderer());
+ for (int i = 0; i < icons.length; i++) {
+ ItemStack thisStack = ItemUtils.simpleMetaStack(this, i, 1);
+ if (i > 0 && hide()) {
+ ItemUtils.hideItemFromNEI(thisStack);
+ }
+ GregTech_API.registerCover(
+ thisStack,
+ new GT_MultiTexture(new ITexture[] { new GT_RenderedTexture(mTextures[i]) }),
+ new GTPP_Cover_ToggleVisual());
+ }
+ }
+
+ /*
+ * @Override public void registerIcons(IIconRegister reg) { for (int i = 0; i < icons.length; i++) { this.icons[i] =
+ * mTextures[i].getIcon(); } }
+ * @Override public IIcon getIconFromDamage(int meta) { return this.icons[meta]; }
+ */
+
+ @Override
+ public void getSubItems(Item item, CreativeTabs tab, List list) {
+ for (int i = 0; i < icons.length; i++) {
+ list.add(new ItemStack(item, 1, i));
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack stack) {
+ return this.getUnlocalizedName() + "_" + stack.getItemDamage();
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ return StringUtils.capitalize(mTextureSetName) + " (" + tItem.getItemDamage() + ")"; // super.getItemStackDisplayName(tItem);
+ }
+
+ private static boolean createNBT(ItemStack rStack) {
+ final NBTTagCompound tagMain = new NBTTagCompound();
+ final NBTTagCompound tagNBT = new NBTTagCompound();
+ tagNBT.setLong("Damage", 0);
+ tagNBT.setBoolean("AllowConnections", false);
+ tagMain.setTag("CustomCoverMeta", tagNBT);
+ rStack.setTagCompound(tagMain);
+ return true;
+ }
+
+ public static final long getCoverDamage(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("CustomCoverMeta");
+ if (aNBT != null) {
+ return aNBT.getLong("Damage");
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return 0L;
+ }
+
+ public static final boolean setCoverDamage(final ItemStack aStack, final long aDamage) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("CustomCoverMeta");
+ if (aNBT != null) {
+ aNBT.setLong("Damage", aDamage);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static final boolean getCoverConnections(final ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("CustomCoverMeta");
+ if (aNBT != null) {
+ return aNBT.getBoolean("AllowConnections");
+ }
+ } else {
+ createNBT(aStack);
+ }
+ return false;
+ }
+
+ public static final boolean setCoverConnections(final ItemStack aStack, final boolean aConnections) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("CustomCoverMeta");
+ if (aNBT != null) {
+ aNBT.setBoolean("AllowConnections", aConnections);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ if (stack.getTagCompound() == null) {
+ createNBT(stack);
+ }
+ double currentDamage = getCoverDamage(stack);
+ double meta = stack.getItemDamage() == 0 ? 50 : 2500;
+ double durabilitypercent = currentDamage / meta;
+ return durabilitypercent;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
+ if (KeyboardUtils.isShiftKeyDown()) {
+ boolean con = getCoverConnections(stack);
+ if (con) {
+ setCoverConnections(stack, false);
+ } else {
+ setCoverConnections(stack, true);
+ }
+ }
+ return stack;
+ }
+
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
+ boolean cons = getCoverConnections(stack);
+ list.add(EnumChatFormatting.GRAY + "Allows Connections: " + cons);
+ list.add(EnumChatFormatting.GRAY + "Shift Rmb to change state before applying");
+ super.addInformation(stack, player, list, bool);
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return false;
+ }
+
+ @Override
+ public Item setFull3D() {
+ // TODO Auto-generated method stub
+ return super.setFull3D();
+ }
+
+ @Override
+ public boolean isFull3D() {
+ // TODO Auto-generated method stub
+ return super.isFull3D();
+ }
+
+ @Override
+ public int getColorFromItemStack(final ItemStack stack, final int HEX_OxFFFFFF) {
+ if (this.mRGB == null) {
+ return super.getColorFromItemStack(stack, HEX_OxFFFFFF);
+ }
+ int aMeta = stack.getItemDamage();
+ return Utils.rgbtoHexValue(mRGB[aMeta][0], mRGB[aMeta][1], mRGB[aMeta][2]);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechItems.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechItems.java
new file mode 100644
index 0000000000..8173a868aa
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechItems.java
@@ -0,0 +1,292 @@
+package gtPlusPlus.xmod.gregtech.common.items;
+
+import static gregtech.client.GT_TooltipHandler.Tier.EV;
+import static gregtech.client.GT_TooltipHandler.registerTieredTooltip;
+import static gtPlusPlus.core.util.Utils.getTcAspectStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.enums.Textures;
+import gregtech.api.objects.GT_MultiTexture;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.items.Gregtech_MetaItem_X32;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.covers.GTPP_Cover_Overflow;
+
+public class MetaGeneratedGregtechItems extends Gregtech_MetaItem_X32 {
+
+ public static final MetaGeneratedGregtechItems INSTANCE;
+
+ static {
+ INSTANCE = new MetaGeneratedGregtechItems();
+ }
+
+ public MetaGeneratedGregtechItems() {
+ super("MU-metaitem.01", new OrePrefixes[] { null });
+ }
+
+ public void generateMetaItems() {
+ int tLastID = 0;
+
+ // Extruder Shape
+ GregtechItemList.Shape_Extruder_WindmillShaft
+ .set(this.addItem(40, "Extruder Shape (Shaft)", "Extruder Shape for making Windmill Shafts"));
+
+ // Batteries
+ GregtechItemList.Battery_RE_EV_Sodium.set(
+ this.addItem(
+ tLastID = 50,
+ "Quad Cell Sodium Battery",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 2L),
+ getTcAspectStack(TC_Aspects.METALLUM, 2L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 2L)));
+ this.setElectricStats(32000 + tLastID, 3200000L, GT_Values.V[4], 4L, -3L, true);
+ registerTieredTooltip(GregtechItemList.Battery_RE_EV_Sodium.get(1), EV);
+
+ GregtechItemList.Battery_RE_EV_Cadmium.set(
+ this.addItem(
+ tLastID = 52,
+ "Quad Cell Cadmium Battery",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 1L),
+ getTcAspectStack(TC_Aspects.METALLUM, 1L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 1L)));
+ this.setElectricStats(32000 + tLastID, 4800000L, GT_Values.V[4], 4L, -3L, true);
+ registerTieredTooltip(GregtechItemList.Battery_RE_EV_Cadmium.get(1), EV);
+
+ GregtechItemList.Battery_RE_EV_Lithium.set(
+ this.addItem(
+ tLastID = 54,
+ "Quad Cell Lithium Battery",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 3L),
+ getTcAspectStack(TC_Aspects.METALLUM, 3L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 3L)));
+ this.setElectricStats(32000 + tLastID, 6400000L, GT_Values.V[4], 4L, -3L, true);
+ registerTieredTooltip(GregtechItemList.Battery_RE_EV_Lithium.get(1), EV);
+
+ /**
+ * Power Gems
+ */
+ GregtechItemList.Battery_Gem_1.set(
+ this.addItem(
+ tLastID = 66,
+ "Proton Cell",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 8L),
+ getTcAspectStack(TC_Aspects.METALLUM, 24L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 16L)));
+ this.setElectricStats(32000 + tLastID, GT_Values.V[6] * 20 * 300 / 4, GT_Values.V[6], 6L, -3L, false);
+ GregtechItemList.Battery_Gem_2.set(
+ this.addItem(
+ tLastID = 68,
+ "Electron Cell",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 16L),
+ getTcAspectStack(TC_Aspects.METALLUM, 32L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 32L)));
+ this.setElectricStats(32000 + tLastID, GT_Values.V[7] * 20 * 300 / 4, GT_Values.V[7], 7L, -3L, false);
+ GregtechItemList.Battery_Gem_3.set(
+ this.addItem(
+ tLastID = 70,
+ "Quark Entanglement",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 32L),
+ getTcAspectStack(TC_Aspects.METALLUM, 48L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 64L)));
+ this.setElectricStats(32000 + tLastID, GT_Values.V[8] * 20 * 300 / 4, GT_Values.V[8], 8L, -3L, false);
+
+ // RTG Pellet
+ GregtechItemList.Pellet_RTG_PU238.set(
+ this.addItem(
+ 41,
+ StringUtils.superscript("238") + "Pu Pellet",
+ "",
+ getTcAspectStack(TC_Aspects.RADIO, 4L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 2L),
+ getTcAspectStack(TC_Aspects.METALLUM, 2L)));
+ GregtechItemList.Pellet_RTG_SR90.set(
+ this.addItem(
+ 42,
+ StringUtils.superscript("90") + "Sr Pellet",
+ "",
+ getTcAspectStack(TC_Aspects.RADIO, 4L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 2L),
+ getTcAspectStack(TC_Aspects.METALLUM, 2L)));
+ GregtechItemList.Pellet_RTG_PO210.set(
+ this.addItem(
+ 43,
+ StringUtils.superscript("210") + "Po Pellet",
+ "",
+ getTcAspectStack(TC_Aspects.RADIO, 4L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 2L),
+ getTcAspectStack(TC_Aspects.METALLUM, 2L)));
+ GregtechItemList.Pellet_RTG_AM241.set(
+ this.addItem(
+ 44,
+ StringUtils.superscript("241") + "Am Pellet",
+ "",
+ getTcAspectStack(TC_Aspects.RADIO, 4L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 2L),
+ getTcAspectStack(TC_Aspects.METALLUM, 2L)));
+
+ CORE.RA.addFuelForRTG(GregtechItemList.Pellet_RTG_PU238.get(1), MathUtils.roundToClosestInt(87.7f), 64);
+ CORE.RA.addFuelForRTG(GregtechItemList.Pellet_RTG_SR90.get(1), MathUtils.roundToClosestInt(28.8f), 32);
+ CORE.RA.addFuelForRTG(GregtechItemList.Pellet_RTG_PO210.get(1), 1, 512);
+ CORE.RA.addFuelForRTG(GregtechItemList.Pellet_RTG_AM241.get(1), 216, 16);
+ CORE.RA.addFuelForRTG(GT_ModHandler.getIC2Item("RTGPellets", 1), MathUtils.roundToClosestInt(2.6f), 8);
+
+ // Computer Cube
+ GregtechItemList.Gregtech_Computer_Cube.set(
+ this.addItem(
+ tLastID = 55,
+ "Gregtech Computer Cube",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 8L),
+ getTcAspectStack(TC_Aspects.METALLUM, 8L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 8L)));
+ this.setElectricStats(32000 + tLastID, GT_Values.V[6] * 10 * 60 * 20, GT_Values.V[5], 5L, -3L, false);
+
+ GregtechItemList.Cover_Overflow_LV.set(
+ this.addItem(
+ 72,
+ "Overflow Valve (LV)",
+ "Maximum void amount: 64,000",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 1L),
+ getTcAspectStack(TC_Aspects.MACHINA, 1L),
+ getTcAspectStack(TC_Aspects.ITER, 1L),
+ getTcAspectStack(TC_Aspects.AQUA, 1L)));
+ GregtechItemList.Cover_Overflow_MV.set(
+ this.addItem(
+ 73,
+ "Overflow Valve (MV)",
+ "Maximum void amount: 512,000",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 1L),
+ getTcAspectStack(TC_Aspects.MACHINA, 1L),
+ getTcAspectStack(TC_Aspects.ITER, 1L),
+ getTcAspectStack(TC_Aspects.AQUA, 1L)));
+ GregtechItemList.Cover_Overflow_HV.set(
+ this.addItem(
+ 74,
+ "Overflow Valve (HV)",
+ "Maximum void amount: 4,096,000",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 1L),
+ getTcAspectStack(TC_Aspects.MACHINA, 1L),
+ getTcAspectStack(TC_Aspects.ITER, 1L),
+ getTcAspectStack(TC_Aspects.AQUA, 1L)));
+ GregtechItemList.Cover_Overflow_EV.set(
+ this.addItem(
+ 75,
+ "Overflow Valve (EV)",
+ "Maximum void amount: 32,768,000",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 1L),
+ getTcAspectStack(TC_Aspects.MACHINA, 1L),
+ getTcAspectStack(TC_Aspects.ITER, 1L),
+ getTcAspectStack(TC_Aspects.AQUA, 1L)));
+ GregtechItemList.Cover_Overflow_IV.set(
+ this.addItem(
+ 76,
+ "Overflow Valve (IV)",
+ "Maximum void amount: 262,144,000",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 1L),
+ getTcAspectStack(TC_Aspects.MACHINA, 1L),
+ getTcAspectStack(TC_Aspects.ITER, 1L),
+ getTcAspectStack(TC_Aspects.AQUA, 1L)));
+
+ GregTech_API.registerCover(
+ GregtechItemList.Cover_Overflow_LV.get(1L),
+ new GT_MultiTexture(
+ Textures.BlockIcons.MACHINE_CASINGS[4][0],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Overflow_Valve)),
+ new GTPP_Cover_Overflow(64));
+ GregTech_API.registerCover(
+ GregtechItemList.Cover_Overflow_MV.get(1L),
+ new GT_MultiTexture(
+ Textures.BlockIcons.MACHINE_CASINGS[5][0],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Overflow_Valve)),
+ new GTPP_Cover_Overflow(512));
+ GregTech_API.registerCover(
+ GregtechItemList.Cover_Overflow_HV.get(1L),
+ new GT_MultiTexture(
+ Textures.BlockIcons.MACHINE_CASINGS[5][0],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Overflow_Valve)),
+ new GTPP_Cover_Overflow(4096));
+ GregTech_API.registerCover(
+ GregtechItemList.Cover_Overflow_EV.get(1L),
+ new GT_MultiTexture(
+ Textures.BlockIcons.MACHINE_CASINGS[8][0],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Overflow_Valve)),
+ new GTPP_Cover_Overflow(32768));
+ GregTech_API.registerCover(
+ GregtechItemList.Cover_Overflow_IV.get(1L),
+ new GT_MultiTexture(
+ Textures.BlockIcons.MACHINE_CASINGS[8][0],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Overflow_Valve)),
+ new GTPP_Cover_Overflow(262144));
+
+ // Fusion Reactor MK4 Singularity
+ GregtechItemList.Compressed_Fusion_Reactor.set(
+ this.addItem(
+ 100,
+ "Hypervisor Matrix (Fusion)",
+ "A memory unit containing an RI (Restricted Intelligence)"));
+
+ GregtechItemList.Laser_Lens_Special
+ .set(this.addItem(105, "Quantum Anomaly", "Probably should shoot it with lasers"));
+
+ GregtechItemList.Battery_Casing_Gem_1.set(this.addItem(106, "Containment Unit I", "Used in crafting"));
+ GregtechItemList.Battery_Casing_Gem_2.set(this.addItem(107, "Containment Unit II", "Used in crafting"));
+ GregtechItemList.Battery_Casing_Gem_3.set(this.addItem(108, "Advanced Containment Unit", "Used in crafting"));
+ GregtechItemList.Battery_Casing_Gem_4.set(this.addItem(109, "Exotic Containment Unit", "Used in crafting"));
+
+ GregtechItemList.Battery_Gem_4.set(
+ this.addItem(
+ tLastID = 110,
+ "Graviton Anomaly",
+ "Reusable",
+ getTcAspectStack(TC_Aspects.ELECTRUM, 64L),
+ getTcAspectStack(TC_Aspects.METALLUM, 64L),
+ getTcAspectStack(TC_Aspects.POTENTIA, 64L)));
+ this.setElectricStats(32000 + tLastID, (64000000000L * 16), GT_Values.V[9], 9L, -3L, false);
+
+ /*
+ * High Tier 'Saws' for the tree Farm
+ */
+
+ GregtechItemList.Laser_Lens_WoodsGlass.set(
+ this.addItem(140, "Wood's Glass Lens", "Allows UV & IF to pass through, blocks visible light spectrums"));
+
+ // 141 now unused, was the ulv transmission component
+ int aStartID = 142;
+ GregtechItemList[] aTransParts = new GregtechItemList[] { GregtechItemList.TransmissionComponent_LV,
+ GregtechItemList.TransmissionComponent_MV, GregtechItemList.TransmissionComponent_HV,
+ GregtechItemList.TransmissionComponent_EV, GregtechItemList.TransmissionComponent_IV,
+ GregtechItemList.TransmissionComponent_LuV, GregtechItemList.TransmissionComponent_ZPM,
+ GregtechItemList.TransmissionComponent_UV, GregtechItemList.TransmissionComponent_UHV, };
+ for (int tier = 1; tier < aTransParts.length + 1; tier++) {
+ aTransParts[tier - 1].set(
+ this.addItem(
+ aStartID++,
+ "Transmission Component (" + GT_Values.VN[tier] + ")",
+ "",
+ getTcAspectStack(TC_Aspects.ELECTRUM, tier),
+ getTcAspectStack(TC_Aspects.MACHINA, tier),
+ getTcAspectStack(TC_Aspects.MAGNETO, tier)));
+ }
+
+ // Distillus Chip
+ GregtechItemList.Distillus_Upgrade_Chip
+ .set(this.addItem(151, "Distillus Upgrade Chip", "Used to upgrade Distillus to Tier 2"));
+ GregtechItemList.Maceration_Upgrade_Chip
+ .set(this.addItem(152, "Maceration Upgrade Chip", "Used to upgrade Maceration Stack to Tier 2"));
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechTools.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechTools.java
new file mode 100644
index 0000000000..30250a46f3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/MetaGeneratedGregtechTools.java
@@ -0,0 +1,54 @@
+package gtPlusPlus.xmod.gregtech.common.items;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechToolDictNames;
+import gtPlusPlus.xmod.gregtech.common.tools.TOOL_Gregtech_AngleGrinder;
+import gtPlusPlus.xmod.gregtech.common.tools.TOOL_Gregtech_ElectricSnips;
+
+public class MetaGeneratedGregtechTools extends GT_MetaGenerated_Tool {
+
+ public static final short ANGLE_GRINDER = 7834;
+ public static final short ELECTRIC_SNIPS = 7934;
+ public static GT_MetaGenerated_Tool INSTANCE;
+
+ static {
+ INSTANCE = new MetaGeneratedGregtechTools();
+ }
+
+ public static GT_MetaGenerated_Tool getInstance() {
+ return INSTANCE;
+ }
+
+ private MetaGeneratedGregtechTools() {
+ super("plusplus.metatool.01");
+
+ // Electric File
+ this.addTool(
+ ANGLE_GRINDER,
+ "Angle Grinder",
+ "Hand-held electric filing device",
+ new TOOL_Gregtech_AngleGrinder(),
+ GregtechToolDictNames.craftingToolAngleGrinder,
+ ToolDictNames.craftingToolFile,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L));
+
+ // Electric Wire Cutter
+ GregTech_API.registerWireCutter(
+ this.addTool(
+ ELECTRIC_SNIPS,
+ "Automatic Snips",
+ "Hand-held electric wire cutter",
+ new TOOL_Gregtech_ElectricSnips(),
+ GregtechToolDictNames.craftingToolElectricSnips,
+ ToolDictNames.craftingToolWireCutter,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 4L)));
+
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Choocher.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Choocher.java
new file mode 100644
index 0000000000..f85822750d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Choocher.java
@@ -0,0 +1,91 @@
+package gtPlusPlus.xmod.gregtech.common.items.behaviours;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.items.behaviors.Behaviour_None;
+import gregtech.common.items.behaviors.Behaviour_Wrench;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+
+public class Behaviour_Choocher extends Behaviour_None {
+
+ private boolean isWrench = true;
+ private final Behaviour_Wrench wrench = new Behaviour_Wrench(150);
+ private final Behaviour_Prospecting_Ex prospecting = new Behaviour_Prospecting_Ex(10, 1250);
+ private final String mTooltip1 = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.choochering1", "Current tool mode: ");
+ private final String mTooltip2 = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.choochering2", "Change tool mode using Shift+Rightclick.");
+ private final String mTooltipH = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.prospectingEx", "Usable for Prospecting large areas.");
+ private final String mTooltipW = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.wrench", "Rotates Blocks on Rightclick.");
+
+ public Behaviour_Choocher() {}
+
+ @Override
+ public boolean onItemUseFirst(final GT_MetaBase_Item aItem, final ItemStack aStack, final EntityPlayer aPlayer,
+ final World aWorld, final int aX, final int aY, final int aZ, final ForgeDirection side, final float hitX,
+ final float hitY, final float hitZ) {
+ if (aWorld.isRemote) {
+ return false;
+ }
+
+ boolean inWrenchMode;
+ if (NBTUtils.hasKey(aStack, "aMode")) {
+ inWrenchMode = NBTUtils.getBoolean(aStack, "aMode");
+ } else {
+ aStack.getTagCompound()
+ .setBoolean("aMode", true);
+ inWrenchMode = true;
+ }
+
+ if (aPlayer.isSneaking()) {
+ boolean aModeNew = !inWrenchMode;
+ aStack.getTagCompound()
+ .setBoolean("aMode", aModeNew);
+ PlayerUtils.messagePlayer(aPlayer, "Mode: " + (aModeNew ? "Wrench" : "Hammer"));
+ return true;
+ } else {
+ if (inWrenchMode) {
+ return this.wrench.onItemUseFirst(aItem, aStack, aPlayer, aWorld, aX, aY, aZ, side, hitZ, hitZ, hitZ);
+ } else {
+ return this.prospecting
+ .onItemUseFirst(aItem, aStack, aPlayer, aWorld, aX, aY, aZ, side, hitX, hitY, hitZ);
+ }
+ }
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(final GT_MetaBase_Item aItem, final List<String> aList,
+ final ItemStack aStack) {
+
+ boolean inWrenchMode;
+ if (NBTUtils.hasKey(aStack, "aMode")) {
+ inWrenchMode = NBTUtils.getBoolean(aStack, "aMode");
+ } else {
+ NBTUtils.setBoolean(aStack, "aMode", true);
+ aStack.getTagCompound()
+ .setBoolean("aMode", true);
+ inWrenchMode = true;
+ }
+
+ if (inWrenchMode) {
+ aList.add(this.mTooltip1 + "Wrench");
+ aList.add(this.mTooltipW);
+ } else {
+ aList.add(this.mTooltip1 + "Prospecting");
+ aList.add(this.mTooltipH);
+ }
+ aList.add(this.mTooltip2);
+
+ return aList;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Electric_Lighter.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Electric_Lighter.java
new file mode 100644
index 0000000000..f3d7f87a86
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Electric_Lighter.java
@@ -0,0 +1,225 @@
+package gtPlusPlus.xmod.gregtech.common.items.behaviours;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.monster.EntityCreeper;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import codechicken.lib.math.MathHelper;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.items.behaviors.Behaviour_None;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.entity.projectile.EntityLightningAttack;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.NBTUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.helpers.ChargingHelper;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+import ic2.api.item.IElectricItemManager;
+
+public class Behaviour_Electric_Lighter extends Behaviour_None {
+
+ private final String mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.lighter.tooltip", "Can light things on Fire");
+ private final String mTooltipUses = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.lighter.uses", "Remaining Uses:");
+ private final String mTooltipUnstackable = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.unstackable", "Not usable when stacked!");
+
+ public Behaviour_Electric_Lighter() {}
+
+ @Override
+ public boolean onLeftClickEntity(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) {
+ if (!aPlayer.worldObj.isRemote && aStack != null && aStack.stackSize == 1) {
+ boolean rOutput = false;
+ if (aEntity instanceof EntityCreeper) {
+ if (this.prepare(aStack) || aPlayer.capabilities.isCreativeMode) {
+ GT_Utility.sendSoundToPlayers(
+ aPlayer.worldObj,
+ SoundResource.FIRE_IGNITE,
+ 1.0F,
+ 1.0F,
+ MathHelper.floor_double(aEntity.posX),
+ MathHelper.floor_double(aEntity.posY),
+ MathHelper.floor_double(aEntity.posZ));
+ ((EntityCreeper) aEntity).func_146079_cb();
+ rOutput = true;
+ }
+ }
+ return rOutput;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean onItemUse(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, int ordinalSide, float hitX, float hitY, float hitZ) {
+ if (!aWorld.isRemote && aStack != null && aStack.stackSize == 1) {
+ if (aPlayer.isSneaking()) {
+ Logger.INFO("Changing Mode");
+ boolean aCurrentMode = NBTUtils.getBoolean(aStack, "aFireballMode");
+ Logger.INFO("Is currently in Fireball mode? " + aCurrentMode);
+ boolean aNewMode = !aCurrentMode;
+ Logger.INFO("Is now set to Fireball mode? " + aNewMode);
+ aStack.getTagCompound()
+ .setBoolean("aFireballMod", aNewMode);
+ // NBTUtils.setBoolean(aStack, "aFireballMode", aNewMode);
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Current Mode: " + EnumChatFormatting.RED + (aNewMode ? "Projectile" : "Fire Starter"));
+ } else {
+ boolean aCurrentMode = NBTUtils.getBoolean(aStack, "aFireballMode");
+ if (aCurrentMode) {
+ // Shoot Lightning Attack
+ aWorld
+ .playSoundAtEntity(aPlayer, "random.bow", 0.5F, 0.4F / (CORE.RANDOM.nextFloat() * 0.4F + 0.8F));
+ if (!aWorld.isRemote) {
+ aWorld.spawnEntityInWorld(new EntityLightningAttack(aWorld, aPlayer, hitX, hitY, hitZ));
+ }
+ } else {
+ // Lights Fires Mode
+ Logger.WARNING("Preparing Lighter a");
+ boolean rOutput = false;
+ ForgeDirection tDirection = ForgeDirection.getOrientation(ordinalSide);
+ aX += tDirection.offsetX;
+ aY += tDirection.offsetY;
+ aZ += tDirection.offsetZ;
+ if (GT_Utility.isBlockAir(aWorld, aX, aY, aZ)
+ && aPlayer.canPlayerEdit(aX, aY, aZ, ordinalSide, aStack)) {
+ Logger.WARNING("Preparing Lighter b");
+ if (this.prepare(aStack) || aPlayer.capabilities.isCreativeMode) {
+ Logger.WARNING("Preparing Lighter c");
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.FIRE_IGNITE, 1.0F, 1.0F, aX, aY, aZ);
+ aWorld.setBlock(aX, aY, aZ, Blocks.fire);
+ rOutput = true;
+ // ItemNBT.setLighterFuel(aStack, tFuelAmount);
+ return rOutput;
+ }
+ }
+ }
+ }
+ }
+ Logger.WARNING("Preparing Lighter z");
+ return false;
+ }
+
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, int ordinalSide, float hitX, float hitY, float hitZ) {
+ if (!aWorld.isRemote && aStack != null && aStack.stackSize == 1) {
+ if (aPlayer.isSneaking()) {
+ Logger.INFO("Changing Mode");
+ boolean aCurrentMode = NBTUtils.getBoolean(aStack, "aFireballMode");
+ Logger.INFO("Is currently in Fireball mode? " + aCurrentMode);
+ boolean aNewMode = !aCurrentMode;
+ Logger.INFO("Is now set to Fireball mode? " + aNewMode);
+ aStack.getTagCompound()
+ .setBoolean("aFireballMode", aNewMode);
+ // NBTUtils.setBoolean(aStack, "aFireballMode", aNewMode);
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Current Mode: " + EnumChatFormatting.RED + (aNewMode ? "Projectile" : "Fire Starter"));
+ } else {
+ boolean aCurrentMode = NBTUtils.getBoolean(aStack, "aFireballMode");
+ if (aCurrentMode) {
+ // Shoot Lightning Attack
+ aWorld
+ .playSoundAtEntity(aPlayer, "random.bow", 0.5F, 0.4F / (CORE.RANDOM.nextFloat() * 0.4F + 0.8F));
+ if (!aWorld.isRemote) {
+ aWorld.spawnEntityInWorld(new EntityLightningAttack(aWorld, aPlayer, hitX, hitY, hitZ));
+ }
+ } else {
+ // Lights Fires Mode
+ Logger.WARNING("Preparing Lighter a");
+ boolean rOutput = false;
+ ForgeDirection tDirection = ForgeDirection.getOrientation(ordinalSide);
+ aX += tDirection.offsetX;
+ aY += tDirection.offsetY;
+ aZ += tDirection.offsetZ;
+ if (GT_Utility.isBlockAir(aWorld, aX, aY, aZ)
+ && aPlayer.canPlayerEdit(aX, aY, aZ, ordinalSide, aStack)) {
+ Logger.WARNING("Preparing Lighter b");
+ if (this.prepare(aStack) || aPlayer.capabilities.isCreativeMode) {
+ Logger.WARNING("Preparing Lighter c");
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.FIRE_IGNITE, 1.0F, 1.0F, aX, aY, aZ);
+ aWorld.setBlock(aX, aY, aZ, Blocks.fire);
+ rOutput = true;
+ // ItemNBT.setLighterFuel(aStack, tFuelAmount);
+ return rOutput;
+ }
+ }
+ }
+ }
+ }
+ Logger.WARNING("Preparing Lighter z");
+ return false;
+ }
+
+ private boolean prepare(ItemStack aStack) {
+ if (aStack != null) {
+ Logger.WARNING("Preparing Lighter 1");
+ if (aStack.getItem() instanceof MetaGeneratedGregtechTools) {
+ Logger.WARNING("Preparing Lighter 2");
+ if (ChargingHelper.isItemValid(aStack)) {
+ Logger.WARNING("Preparing Lighter 3");
+ if (aStack.getItem() instanceof IElectricItemManager aItemElec) {
+ Logger.WARNING("Preparing Lighter 4");
+ double aCharge = aItemElec.getCharge(aStack);
+ long aEuCost = 4096 * 2;
+ if (aCharge >= aEuCost) {
+ Logger.WARNING("Preparing Lighter 5");
+ aItemElec.discharge(aStack, aEuCost, 3, true, true, false);
+ return true;
+ }
+ }
+ }
+ }
+ }
+ Logger.WARNING("Preparing Lighter 0");
+ return false;
+ }
+
+ private void useUp(ItemStack aStack) {}
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ int aUses = 0;
+ if (aStack != null) {
+ if (aStack.getItem() instanceof MetaGeneratedGregtechTools) {
+ if (ChargingHelper.isItemValid(aStack)) {
+ if (aStack.getItem() instanceof IElectricItemManager aItemElec) {
+ double aCharge = aItemElec.getCharge(aStack);
+ long aEuCost = 4096 * 2;
+ aUses = (int) (aCharge / aEuCost);
+ }
+ }
+ boolean aCurrentMode;
+ if (!NBTUtils.hasTagCompound(aStack)) {
+ NBTUtils.createEmptyTagCompound(aStack);
+ }
+ if (NBTUtils.hasKey(aStack, "aFireballMode")) {
+ aCurrentMode = NBTUtils.getBoolean(aStack, "aFireballMode");
+ } else {
+ aStack.getTagCompound()
+ .setBoolean("aFireballMode", false);
+ aCurrentMode = false;
+ }
+ aList.add("Current Mode: " + EnumChatFormatting.RED + (aCurrentMode ? "Projectile" : "Fire Starter"));
+ }
+ }
+
+ aList.add(this.mTooltipUses + " " + aUses);
+ aList.add(this.mTooltipUnstackable);
+ return aList;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Prospecting_Ex.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Prospecting_Ex.java
new file mode 100644
index 0000000000..5749204296
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/behaviours/Behaviour_Prospecting_Ex.java
@@ -0,0 +1,140 @@
+package gtPlusPlus.xmod.gregtech.common.items.behaviours;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.IFluidBlock;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Block_Ores;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+import gregtech.common.items.behaviors.Behaviour_Prospecting;
+
+public class Behaviour_Prospecting_Ex extends Behaviour_Prospecting {
+
+ private final int mVanillaCosts;
+ private final int mEUCosts;
+
+ public Behaviour_Prospecting_Ex(final int aVanillaCosts, final int aEUCosts) {
+ super(aVanillaCosts, aEUCosts);
+ this.mVanillaCosts = aVanillaCosts;
+ this.mEUCosts = aEUCosts;
+ }
+
+ @Override
+ public boolean onItemUseFirst(final GT_MetaBase_Item aItem, final ItemStack aStack, final EntityPlayer aPlayer,
+ final World aWorld, final int aX, final int aY, final int aZ, final ForgeDirection side, final float hitX,
+ final float hitY, final float hitZ) {
+ if (aWorld.isRemote) {
+ return false;
+ }
+ final Block aBlock = aWorld.getBlock(aX, aY, aZ);
+ if (aBlock == null) {
+ return false;
+ }
+ final byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ);
+
+ ItemData tAssotiation = GT_OreDictUnificator.getAssociation(new ItemStack(aBlock, 1, aMeta));
+ if ((tAssotiation != null) && (tAssotiation.mPrefix.toString()
+ .startsWith("ore"))) {
+ GT_Utility
+ .sendChatToPlayer(aPlayer, "This is " + tAssotiation.mMaterial.mMaterial.mDefaultLocalName + " Ore.");
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_ANVIL_USE, 1.0F, -1.0F, aX, aY, aZ);
+ return true;
+ }
+ if ((aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.stone))
+ || (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockGranites))
+ || (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.netherrack))
+ || (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.end_stone))
+ || (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.dirt))
+ || (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.grass))) {
+ if (GT_ModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) {
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_ANVIL_USE, 1.0F, -1.0F, aX, aY, aZ);
+ int tX = aX;
+ int tY = aY;
+ int tZ = aZ;
+ int tMetaID = 0;
+ final int tQuality = ((aItem instanceof GT_MetaGenerated_Tool)
+ ? ((GT_MetaGenerated_Tool) aItem).getHarvestLevel(aStack, "")
+ : 0) * 3;
+
+ int i = 0;
+ for (final int j = 6 + tQuality; i < j; i++) {
+ tX -= side.offsetX;
+ tY -= side.offsetY;
+ tZ -= side.offsetZ;
+
+ final Block tBlock = aWorld.getBlock(tX, tY, tZ);
+ if ((tBlock == Blocks.lava) || (tBlock == Blocks.flowing_lava)) {
+ GT_Utility.sendChatToPlayer(aPlayer, "There is Lava behind this Block.");
+ break;
+ }
+ if ((tBlock == Blocks.water) || (tBlock == Blocks.flowing_water)
+ || ((tBlock instanceof IFluidBlock))) {
+ GT_Utility.sendChatToPlayer(aPlayer, "There is a Liquid behind this Block.");
+ break;
+ }
+ if ((tBlock == Blocks.monster_egg) || (!GT_Utility.hasBlockHitBox(aWorld, tX, tY, tZ))) {
+ GT_Utility.sendChatToPlayer(aPlayer, "There is an Air Pocket behind this Block.");
+ break;
+ }
+ if (tBlock != aBlock) {
+ if (i >= 4) {
+ break;
+ }
+ GT_Utility.sendChatToPlayer(aPlayer, "Material is changing behind this Block.");
+ break;
+ }
+ }
+ final Random tRandom = new Random(aX ^ aY ^ aZ ^ side.ordinal());
+ i = 0;
+ for (final int j = 9 + (2 * tQuality); i < j; i++) {
+ tX = (aX - 4 - tQuality) + tRandom.nextInt(j);
+ tY = (aY - 4 - tQuality) + tRandom.nextInt(j);
+ tZ = (aZ - 4 - tQuality) + tRandom.nextInt(j);
+ final Block tBlock = aWorld.getBlock(tX, tY, tZ);
+ if ((tBlock instanceof GT_Block_Ores)) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(tX, tY, tZ);
+ if ((tTileEntity instanceof GT_TileEntity_Ores)) {
+ final Materials tMaterial = GregTech_API.sGeneratedMaterials[(((GT_TileEntity_Ores) tTileEntity).mMetaData
+ % 1000)];
+ if ((tMaterial != null) && (tMaterial != Materials._NULL)) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ "Found traces of " + tMaterial.mDefaultLocalName + " Ore.");
+ return true;
+ }
+ }
+ } else {
+ tMetaID = aWorld.getBlockMetadata(tX, tY, tZ);
+ tAssotiation = GT_OreDictUnificator.getAssociation(new ItemStack(tBlock, 1, tMetaID));
+ if ((tAssotiation != null) && (tAssotiation.mPrefix.toString()
+ .startsWith("ore"))) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ "Found traces of " + tAssotiation.mMaterial.mMaterial.mDefaultLocalName + " Ore.");
+ return true;
+ }
+ }
+ }
+ GT_Utility.sendChatToPlayer(aPlayer, "No Ores found.");
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/covers/MetaItemCoverCasings.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/covers/MetaItemCoverCasings.java
new file mode 100644
index 0000000000..987924952a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/items/covers/MetaItemCoverCasings.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.xmod.gregtech.common.items.covers;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.common.items.MetaCustomCoverItem;
+
+public class MetaItemCoverCasings extends MetaCustomCoverItem {
+
+ public MetaItemCoverCasings() {
+ super(
+ GTPlusPlus.ID,
+ Textures.BlockIcons.MACHINECASINGS_SIDE.length,
+ "Gt Machine Casings",
+ Textures.BlockIcons.MACHINECASINGS_SIDE,
+ null);
+ }
+
+ @Override
+ public void registerIcons(IIconRegister reg) {
+ for (int i = 0; i < icons.length; i++) {
+ this.icons[i] = reg.registerIcon(GTPlusPlus.ID + ":" + "covers/" + i);
+ }
+ }
+
+ @Override
+ public boolean hide() {
+ return false;
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int meta) {
+ return this.icons[MathUtils.balance(meta, 0, 15)];
+ }
+
+ @Override
+ public String getItemStackDisplayName(final ItemStack tItem) {
+ return EnumChatFormatting.LIGHT_PURPLE + StatCollector.translateToLocalFormatted(
+ "item.itemCustomMetaCover.miscutils.GtMachineCasings",
+ GT_Values.VOLTAGE_NAMES[MathUtils.balance(tItem.getItemDamage(), 0, GT_Values.VOLTAGE_NAMES.length - 1)]); // super.getItemStackDisplayName(tItem);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_CapeRenderer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_CapeRenderer.java
new file mode 100644
index 0000000000..a281a205d2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_CapeRenderer.java
@@ -0,0 +1,500 @@
+package gtPlusPlus.xmod.gregtech.common.render;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.ForkJoinPool;
+
+import net.minecraft.client.entity.AbstractClientPlayer;
+import net.minecraft.client.model.ModelBiped;
+import net.minecraft.client.renderer.entity.RenderManager;
+import net.minecraft.client.renderer.entity.RenderPlayer;
+import net.minecraft.potion.Potion;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.event.RenderPlayerEvent;
+
+import org.apache.commons.io.IOUtils;
+import org.lwjgl.opengl.GL11;
+
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.lib.CORE.ConfigSwitches;
+import gtPlusPlus.core.proxy.ClientProxy;
+import gtPlusPlus.core.util.data.AES;
+import gtPlusPlus.core.util.data.FileUtils;
+import gtPlusPlus.core.util.math.MathUtils;
+
+public class GTPP_CapeRenderer extends RenderPlayer {
+
+ private static final ResourceLocation[] mCapes = { new ResourceLocation("miscutils:textures/OrangeHD.png"),
+ new ResourceLocation("miscutils:textures/FancyCapeHD.png"),
+ new ResourceLocation("miscutils:textures/TesterCapeHD.png"),
+ new ResourceLocation("miscutils:textures/PatreonCapeHD.png"),
+ new ResourceLocation("miscutils:textures/DevCapeHD.png"), };
+
+ private final boolean mInit;
+
+ public GTPP_CapeRenderer() {
+ mInit = init();
+ }
+
+ private boolean init() {
+ if (mInit) {
+ return false;
+ }
+ return CapeUtils.init();
+ }
+
+ private static boolean hasResourceChecked = false;
+ private static boolean hasSetRenderer = false;
+ private boolean hasCape = false;
+ private ResourceLocation tResource = null;
+
+ public synchronized void receiveRenderSpecialsEvent(RenderPlayerEvent.Specials.Pre aEvent) {
+
+ // Check we have set Render Manager
+ if (this.renderManager == null) {
+ hasSetRenderer = false;
+ }
+
+ // Set Render Manager
+ if (!hasSetRenderer) {
+ if (RenderManager.instance != null) {
+ setRenderManager(RenderManager.instance);
+ hasSetRenderer = true;
+ }
+ }
+
+ // Actually Render
+ if (hasSetRenderer) {
+
+ // We have capes turned off, so let's not render.
+ if (!ConfigSwitches.enableCustomCapes) {
+ return;
+ }
+
+ if (!CapeUtils.mapsPopulated) {
+ if (!CapeUtils.cacheReady) {
+ return;
+ }
+ CapeUtils.writeCacheToMaps();
+ CapeUtils.mapsPopulated = true;
+ }
+
+ // We have already checked if this player has a cape, but since they do not, we best not render.
+ if (hasResourceChecked) {
+ if (!hasCape && !CORE.DEVENV) {
+ return;
+ }
+ }
+
+ // Allocate client player object
+ AbstractClientPlayer aPlayer = (AbstractClientPlayer) aEvent.entityPlayer;
+
+ // Make sure we don't keep checking on clients who dont have capes.
+ if (!hasResourceChecked) {
+
+ // Get players UUID
+ String aPlayerUUID = aPlayer != null ? aPlayer.getGameProfile()
+ .getId()
+ .toString() : "BAD";
+
+ // If for whatever reason this fails, we just exit early.
+ if (aPlayerUUID.equals("BAD")) {
+ return;
+ }
+
+ // Automatically allocate a Dev cape while in Dev mode.
+ if (tResource == null && CORE.DEVENV) {
+ tResource = mCapes[4];
+ hasCape = true;
+ }
+
+ String aPlayerName = ClientProxy.playerName;
+
+ // Check cape lists for the cape this player owns.
+ if (!hasCape) {
+ for (Pair<String, String> aData : CapeUtils.mOrangeCapes) {
+ if (aData.getKey()
+ .equals(aPlayerUUID) || aPlayerName.equals(aData.getValue())) {
+ tResource = mCapes[0];
+ hasCape = true;
+ break;
+ }
+ }
+ }
+ if (!hasCape) {
+ for (Pair<String, String> aData : CapeUtils.mMiscCapes) {
+ if (aData.getKey()
+ .equals(aPlayerUUID) || aPlayerName.equals(aData.getValue())) {
+ tResource = mCapes[1];
+ hasCape = true;
+ break;
+ }
+ }
+ }
+ if (!hasCape) {
+ for (Pair<String, String> aData : CapeUtils.mBetaTestCapes) {
+ if (aData.getKey()
+ .equals(aPlayerUUID) || aPlayerName.equals(aData.getValue())) {
+ tResource = mCapes[2];
+ hasCape = true;
+ break;
+ }
+ }
+ }
+ if (!hasCape) {
+ for (Pair<String, String> aData : CapeUtils.mPatreonCapes) {
+ if (aData.getKey()
+ .equals(aPlayerUUID) || aPlayerName.equals(aData.getValue())) {
+ tResource = mCapes[3];
+ hasCape = true;
+ break;
+ }
+ }
+ }
+ if (!hasCape) {
+ for (Pair<String, String> aData : CapeUtils.mDevCapes) {
+ if (aData.getKey()
+ .equals(aPlayerUUID) || aPlayerName.equals(aData.getValue())) {
+ tResource = mCapes[4];
+ hasCape = true;
+ break;
+ }
+ }
+ }
+ hasResourceChecked = true;
+ }
+
+ if (hasResourceChecked) {
+ // We have met all the conditions, let's render that cape.
+ renderCapeOnPlayer(aEvent, aPlayer);
+ }
+ }
+ }
+
+ private boolean renderCapeOnPlayer(RenderPlayerEvent.Specials.Pre aEvent, AbstractClientPlayer aPlayer) {
+ float aPartialTicks = aEvent.partialRenderTick;
+ try {
+ if (tResource == null && CORE.DEVENV) {
+ tResource = mCapes[3];
+ }
+
+ // If player is invisible, don't render.
+ if (GT_Utility.getFullInvisibility(aPlayer) || aPlayer.isInvisible()
+ || GT_Utility.getPotion(aPlayer, Integer.valueOf(Potion.invisibility.id))) {
+ aEvent.setCanceled(true);
+ return false;
+ }
+
+ if ((tResource != null) && (!aPlayer.getHideCape())) {
+ bindTexture(tResource);
+ GL11.glPushMatrix();
+ GL11.glTranslatef(0.0F, 0.0F, 0.125F);
+ double d0 = aPlayer.field_71091_bM + (aPlayer.field_71094_bP - aPlayer.field_71091_bM) * aPartialTicks
+ - (aPlayer.prevPosX + (aPlayer.posX - aPlayer.prevPosX) * aPartialTicks);
+ double d1 = aPlayer.field_71096_bN + (aPlayer.field_71095_bQ - aPlayer.field_71096_bN) * aPartialTicks
+ - (aPlayer.prevPosY + (aPlayer.posY - aPlayer.prevPosY) * aPartialTicks);
+ double d2 = aPlayer.field_71097_bO + (aPlayer.field_71085_bR - aPlayer.field_71097_bO) * aPartialTicks
+ - (aPlayer.prevPosZ + (aPlayer.posZ - aPlayer.prevPosZ) * aPartialTicks);
+ float f6 = aPlayer.prevRenderYawOffset
+ + (aPlayer.renderYawOffset - aPlayer.prevRenderYawOffset) * aPartialTicks;
+ double d3 = MathHelper.sin(f6 * CORE.PI / 180.0F);
+ double d4 = -MathHelper.cos(f6 * CORE.PI / 180.0F);
+ float f7 = (float) d1 * 10.0F;
+ float f8 = (float) (d0 * d3 + d2 * d4) * 100.0F;
+ float f9 = (float) (d0 * d4 - d2 * d3) * 100.0F;
+ if (f7 < -6.0F) {
+ f7 = -6.0F;
+ }
+ if (f7 > 32.0F) {
+ f7 = 32.0F;
+ }
+ if (f8 < 0.0F) {
+ f8 = 0.0F;
+ }
+ float f10 = aPlayer.prevCameraYaw + (aPlayer.cameraYaw - aPlayer.prevCameraYaw) * aPartialTicks;
+ f7 += MathHelper.sin(
+ (aPlayer.prevDistanceWalkedModified
+ + (aPlayer.distanceWalkedModified - aPlayer.prevDistanceWalkedModified) * aPartialTicks) * 6.0F)
+ * 32.0F
+ * f10;
+ if (aPlayer.isSneaking()) {
+ f7 += 25.0F;
+ }
+ GL11.glRotatef(6.0F + f8 / 2.0F + f7, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(f9 / 2.0F, 0.0F, 0.0F, 1.0F);
+ GL11.glRotatef(-f9 / 2.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
+ ((ModelBiped) this.mainModel).renderCloak(0.0625F);
+ GL11.glPopMatrix();
+ return true;
+ }
+ } catch (Throwable e) {
+
+ }
+ return false;
+ }
+
+ private static class CapeUtils {
+
+ private static char SPLIT_CHARACTER = '§';
+ private static AES sAES;
+ private static volatile boolean cacheReady = false;
+ private static boolean mapsPopulated = false;
+
+ // UUID - Username
+ private static final AutoMap<Pair<String, String>> mOrangeCapes = new AutoMap<>();
+ private static final AutoMap<Pair<String, String>> mMiscCapes = new AutoMap<>();
+ private static final AutoMap<Pair<String, String>> mBetaTestCapes = new AutoMap<>();
+ private static final AutoMap<Pair<String, String>> mPatreonCapes = new AutoMap<>();
+ private static final AutoMap<Pair<String, String>> mDevCapes = new AutoMap<>();
+
+ private static boolean init() {
+ CapeUtils.handleOldCapeCache();
+ if (CORE.DEVENV) {
+ return true;
+ }
+ ForkJoinPool.commonPool()
+ .execute(() -> {
+ try {
+ if (shouldDownloadCapeList()) {
+ downloadCapeList();
+ }
+ } catch (Exception ignored) {}
+ cacheReady = true;
+ });
+ return true;
+ }
+
+ private static boolean shouldDownloadCapeList() {
+ if (!doesCapeCacheExistLocally()) {
+ return true;
+ }
+ if (isCapeCacheWeekOld()) {
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean isCapeCacheWeekOld() {
+ if (!doesCapeCacheExistLocally()) {
+ return true;
+ } else {
+ File dat = CapeUtils.getCapeCache();
+ Date dateLastMod = new Date(dat.lastModified());
+ Date dateNow = new Date(System.currentTimeMillis() - (7l * 24 * 60 * 60 * 1000));
+ if (dateLastMod.before(dateNow)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static void downloadCapeList() {
+ try {
+ File dat = getCapeCache();
+ File temp = allocateTempFile();
+ InputStream inputStream = new URL("https://alkcorp.overminddl1.com/CapeCache.dat").openStream();
+ FileOutputStream fileOS = new FileOutputStream(temp);
+ IOUtils.copy(inputStream, fileOS);
+ if (isDownloadedCapeListBigger(temp)) {
+ fileOS = new FileOutputStream(dat);
+ IOUtils.copy(inputStream, fileOS);
+ }
+ } catch (Throwable t) {
+ Logger.INFO("Unable to download GT++ cape list.");
+ }
+ }
+
+ private static boolean isDownloadedCapeListBigger(File aFile) {
+ double aExistingFileSize = (doesCapeCacheExistLocally() ? getCapeCache().length() : 0);
+ double aNewFileSize = aFile.length();
+ if (aNewFileSize > aExistingFileSize) {
+ return true;
+ }
+ return false;
+ }
+
+ private static void handleOldCapeCache() {
+ File aCacheFile = FileUtils.getFile("GTPP", "dat");
+ if (FileUtils.doesFileExist(aCacheFile)) {
+ aCacheFile.delete();
+ }
+ }
+
+ private static boolean doesCapeCacheExistLocally() {
+ File aCacheFile = FileUtils.getFile("CapeCache", "dat");
+ if (FileUtils.doesFileExist(aCacheFile)) {
+ return true;
+ }
+ return false;
+ }
+
+ private static File getCapeCache() {
+ File aCacheFile = FileUtils.getFile("CapeCache", "dat");
+ if (FileUtils.doesFileExist(aCacheFile)) {
+ FileUtils.createFile(aCacheFile);
+ }
+ return aCacheFile;
+ }
+
+ public static final List<String> getDataFromCache() {
+ File aCacheFile = getCapeCache();
+ List<String> aCache = FileUtils.readLines(aCacheFile);
+ if (aCache != null && !aCache.isEmpty()) {
+ return aCache;
+ }
+ return new AutoMap<>();
+ }
+
+ private static File allocateTempFile() {
+ File tempFile = null;
+ try {
+ tempFile = File.createTempFile("gtpp-", null);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ if (tempFile == null) {
+ tempFile = FileUtils
+ .createFile("", "gtpp-" + MathUtils.randInt(Short.MAX_VALUE, (Integer.MAX_VALUE / 2)), "tmp");
+ }
+ tempFile.deleteOnExit();
+ return tempFile;
+ }
+
+ public static final void writeCacheToMaps() {
+ List<String> aCacheData = getDataFromCache();
+ if (aCacheData != null && !aCacheData.isEmpty()) {
+ if (sAES == null) {
+ sAES = new AES();
+ }
+ AutoMap<String> aDecodedData = new AutoMap<>();
+ for (String aToDecode : aCacheData) {
+ aDecodedData.put(sAES.decode(aToDecode));
+ }
+ if (!aDecodedData.isEmpty()) {
+ AutoMap<Pair<String, String>> aCapeType1 = new AutoMap<>();
+ AutoMap<Pair<String, String>> aCapeType2 = new AutoMap<>();
+ AutoMap<Pair<String, String>> aCapeType3 = new AutoMap<>();
+ AutoMap<Pair<String, String>> aCapeType4 = new AutoMap<>();
+ AutoMap<Pair<String, String>> aCapeType5 = new AutoMap<>();
+ boolean didProcessStringData = false;
+ Logger.INFO("Decoded String Count: " + aDecodedData.size());
+ for (String aToSplit : aDecodedData) {
+ String[] aSplitData = aToSplit.split("" + SPLIT_CHARACTER);
+ if (aSplitData != null && aSplitData.length >= 2) {
+ if (aSplitData[0] != null) {
+ Integer aCapeTypeID2 = Integer.parseInt(aSplitData[0]);
+ if (aCapeTypeID2 != null) {
+ int aCapeTypeID = aCapeTypeID2;
+ Pair<String, String> aFinalString = new Pair<>(
+ "UUID: " + aSplitData[1],
+ "Username: "
+ + (aSplitData[2] != null && aSplitData[0].length() > 0 ? aSplitData[2]
+ : "Not Specified"));
+ Logger.INFO("Cape Type: " + aCapeTypeID);
+ switch (aCapeTypeID) {
+ case 0 -> {
+ aCapeType1.add(aFinalString);
+ Logger.INFO(
+ "Added user to map " + aCapeTypeID
+ + ", map now holds "
+ + aCapeType1.size()
+ + " users.");
+ }
+ case 1 -> {
+ aCapeType2.add(aFinalString);
+ Logger.INFO(
+ "Added user to map " + aCapeTypeID
+ + ", map now holds "
+ + aCapeType2.size()
+ + " users.");
+ }
+ case 2 -> {
+ aCapeType3.add(aFinalString);
+ Logger.INFO(
+ "Added user to map " + aCapeTypeID
+ + ", map now holds "
+ + aCapeType3.size()
+ + " users.");
+ }
+ case 3 -> {
+ aCapeType4.add(aFinalString);
+ Logger.INFO(
+ "Added user to map " + aCapeTypeID
+ + ", map now holds "
+ + aCapeType4.size()
+ + " users.");
+ }
+ case 4 -> {
+ aCapeType5.add(aFinalString);
+ Logger.INFO(
+ "Added user to map " + aCapeTypeID
+ + ", map now holds "
+ + aCapeType5.size()
+ + " users.");
+ }
+ default -> {}
+ }
+ }
+ }
+ }
+ }
+ if (!aCapeType1.isEmpty() || !aCapeType2.isEmpty()
+ || !aCapeType3.isEmpty()
+ || !aCapeType4.isEmpty()
+ || !aCapeType5.isEmpty()) {
+ didProcessStringData = true;
+ } else {
+ // did not process any data
+ }
+ if (didProcessStringData) {
+ if (!aCapeType1.isEmpty()) {
+ for (Pair<String, String> aUser : aCapeType1) {
+ Logger.INFO("Adding Generic cape for " + aUser.getKey());
+ mOrangeCapes.add(aUser);
+ }
+ }
+ if (!aCapeType2.isEmpty()) {
+ for (Pair<String, String> aUser : aCapeType2) {
+ Logger.INFO("Adding Blue cape for " + aUser.getKey());
+ mMiscCapes.add(aUser);
+ }
+ }
+ if (!aCapeType3.isEmpty()) {
+ for (Pair<String, String> aUser : aCapeType3) {
+ Logger.INFO("Adding Beta cape for " + aUser.getKey());
+ mBetaTestCapes.add(aUser);
+ }
+ }
+ if (!aCapeType4.isEmpty()) {
+ for (Pair<String, String> aUser : aCapeType4) {
+ Logger.INFO("Adding Patreon cape for " + aUser.getKey());
+ mPatreonCapes.add(aUser);
+ }
+ }
+ if (!aCapeType5.isEmpty()) {
+ for (Pair<String, String> aUser : aCapeType5) {
+ Logger.INFO("Adding Dev cape for " + aUser.getKey());
+ mDevCapes.add(aUser);
+ }
+ }
+ }
+ } else {
+ // No data decoded
+ }
+ } else {
+ // Nothing was cached?
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_FlaskRenderer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_FlaskRenderer.java
new file mode 100644
index 0000000000..0c9e59e2f2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_FlaskRenderer.java
@@ -0,0 +1,107 @@
+package gtPlusPlus.xmod.gregtech.common.render;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.ItemRenderer;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.client.MinecraftForgeClient;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.common.items.GT_VolumetricFlask;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import ic2.core.util.DrawUtil;
+
+@SideOnly(cpw.mods.fml.relauncher.Side.CLIENT)
+public final class GTPP_FlaskRenderer implements net.minecraftforge.client.IItemRenderer {
+
+ public GTPP_FlaskRenderer() {
+ MinecraftForgeClient.registerItemRenderer(GregtechItemList.VOLUMETRIC_FLASK_8k.getItem(), this);
+ MinecraftForgeClient.registerItemRenderer(GregtechItemList.VOLUMETRIC_FLASK_32k.getItem(), this);
+ }
+
+ @Override
+ public boolean handleRenderType(ItemStack item, ItemRenderType type) {
+ return type != ItemRenderType.FIRST_PERSON_MAP;
+ }
+
+ @Override
+ public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, IItemRenderer.ItemRendererHelper helper) {
+ return type == ItemRenderType.ENTITY;
+ }
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
+ GT_VolumetricFlask cell = (GT_VolumetricFlask) item.getItem();
+
+ int aType = cell.getMaxCapacity() == 8000 ? 0 : 1;
+ IIcon icon = item.getIconIndex();
+ GL11.glEnable(3042);
+ GL11.glEnable(3008);
+ if (type.equals(ItemRenderType.ENTITY)) {
+ GL11.glRotated(180.0D, 0.0D, 0.0D, 1.0D);
+ GL11.glRotated(90.0D, 0.0D, 1.0D, 0.0D);
+ GL11.glTranslated(-0.5D, -0.6D, 0.0D);
+ } else if (type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON)) {
+ GL11.glTranslated(1.0D, 1.0D, 0.0D);
+ GL11.glRotated(180.0D, 0.0D, 0.0D, 1.0D);
+ } else if (type.equals(ItemRenderType.EQUIPPED)) {
+ GL11.glRotated(180.0D, 0.0D, 0.0D, 1.0D);
+ GL11.glTranslated(-1.0D, -1.0D, 0.0D);
+ }
+
+ FluidStack fs = cell.getFluid(item);
+ if (fs != null) {
+ IIcon iconWindow = cell.iconWindow;
+ IIcon fluidicon = fs.getFluid()
+ .getIcon(fs);
+ int fluidColor = fs.getFluid()
+ .getColor(fs);
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
+ GL11.glBlendFunc(0, 1);
+ if (type.equals(ItemRenderType.INVENTORY)) {
+ DrawUtil.renderIcon(iconWindow, 16.0D, 0.0D, 0.0F, 0.0F, -1.0F);
+ } else {
+ DrawUtil.renderIcon(iconWindow, 1.0D, -0.001D, 0.0F, 0.0F, 1.0F);
+ DrawUtil.renderIcon(iconWindow, 1.0D, -0.0615D, 0.0F, 0.0F, -1.0F);
+ }
+
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture);
+ GL11.glBlendFunc(770, 771);
+ GL11.glDepthFunc(514);
+ GL11.glColor3ub((byte) (fluidColor >> 16), (byte) (fluidColor >> 8), (byte) fluidColor);
+ if (type.equals(ItemRenderType.INVENTORY)) {
+ DrawUtil.renderIcon(fluidicon, 16.0D, 0.0D, 0.0F, 0.0F, -1.0F);
+ } else {
+ DrawUtil.renderIcon(fluidicon, 1.0D, -0.001D, 0.0F, 0.0F, 1.0F);
+ DrawUtil.renderIcon(fluidicon, 1.0D, -0.0615D, 0.0F, 0.0F, -1.0F);
+ }
+
+ GL11.glColor3ub((byte) -1, (byte) -1, (byte) -1);
+ GL11.glDepthFunc(515);
+ }
+
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
+ GL11.glBlendFunc(770, 771);
+ if (type.equals(ItemRenderType.INVENTORY)) {
+ DrawUtil.renderIcon(icon, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F);
+ } else {
+ ItemRenderer.renderItemIn2D(
+ Tessellator.instance,
+ icon.getMaxU(),
+ icon.getMinV(),
+ icon.getMinU(),
+ icon.getMaxV(),
+ icon.getIconWidth(),
+ icon.getIconHeight(),
+ 0.0625F);
+ }
+ GL11.glDisable(3008);
+ GL11.glDisable(3042);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_Render_MachineBlock.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_Render_MachineBlock.java
new file mode 100644
index 0000000000..bfd16b4cc5
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/render/GTPP_Render_MachineBlock.java
@@ -0,0 +1,1250 @@
+package gtPlusPlus.xmod.gregtech.common.render;
+
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_DOWN;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_EAST;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_NORTH;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_SOUTH;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_UP;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_WEST;
+import static gregtech.api.interfaces.metatileentity.IConnectable.HAS_FOAM;
+import static gregtech.api.interfaces.metatileentity.IConnectable.NO_CONNECTION;
+import static net.minecraftforge.common.util.ForgeDirection.DOWN;
+import static net.minecraftforge.common.util.ForgeDirection.EAST;
+import static net.minecraftforge.common.util.ForgeDirection.NORTH;
+import static net.minecraftforge.common.util.ForgeDirection.SOUTH;
+import static net.minecraftforge.common.util.ForgeDirection.UP;
+import static net.minecraftforge.common.util.ForgeDirection.WEST;
+
+import java.util.EnumMap;
+import java.util.EnumSet;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.registry.RenderingRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IPipeRenderedTileEntity;
+import gregtech.api.interfaces.tileentity.ITexturedTileEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+import gregtech.common.blocks.GT_Block_Machines;
+import gregtech.common.render.GT_Renderer_Block;
+import gtPlusPlus.xmod.gregtech.common.helpers.GT_MethodHelper;
+
+public class GTPP_Render_MachineBlock extends GT_Renderer_Block {
+
+ public static GTPP_Render_MachineBlock INSTANCE;
+ public final int mRenderID = RenderingRegistry.getNextAvailableRenderId();
+
+ public GTPP_Render_MachineBlock() {
+ INSTANCE = this;
+ RenderingRegistry.registerBlockHandler(this);
+ }
+
+ private static ITexture[] getTexture(IMetaTileEntity tile, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean active, boolean arg5) {
+ final IGregTechTileEntity gtTile = tile.getBaseMetaTileEntity();
+ return tile.getTexture(gtTile, side, facing, (byte) colorIndex, active, arg5);
+ }
+
+ private static ITexture[] getTexture(IMetaTileEntity tile, ForgeDirection side, int facingMask, int colorIndex,
+ boolean active, boolean arg5) {
+ final MetaPipeEntity gtTile = (MetaPipeEntity) tile.getBaseMetaTileEntity();
+ return gtTile.getTexture((IGregTechTileEntity) tile, side, facingMask, colorIndex, active, arg5);
+ }
+
+ private static void renderNormalInventoryMetaTileEntity(Block aBlock, int aMeta, RenderBlocks aRenderer) {
+ if (aMeta > 0 && aMeta < GregTech_API.METATILEENTITIES.length) {
+ IMetaTileEntity tMetaTileEntity = GregTech_API.METATILEENTITIES[aMeta];
+ if (tMetaTileEntity != null) {
+ aBlock.setBlockBoundsForItemRender();
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ if (tMetaTileEntity.getBaseMetaTileEntity() instanceof IPipeRenderedTileEntity pipeRenderedTile) {
+ float tThickness = pipeRenderedTile.getThickNess();
+ float sp = (1.0F - tThickness) / 2.0F;
+ aBlock.setBlockBounds(0.0F, sp, sp, 1.0F, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, -1.0F, 0.0F);
+ renderNegativeYFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, DOWN, 0b001001, -1, false, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 1.0F, 0.0F);
+ renderPositiveYFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, UP, 0b001001, -1, false, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 0.0F, -1.0F);
+ renderNegativeZFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.NORTH, 0b001001, -1, false, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 0.0F, 1.0F);
+ renderPositiveZFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.SOUTH, 0b001001, -1, false, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(-1.0F, 0.0F, 0.0F);
+ renderNegativeXFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.WEST, 0b001001, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(1.0F, 0.0F, 0.0F);
+ renderPositiveXFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.EAST, 0b001001, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ } else {
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, -1.0F, 0.0F);
+ renderNegativeYFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, DOWN, ForgeDirection.WEST, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 1.0F, 0.0F);
+ renderPositiveYFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, UP, ForgeDirection.WEST, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 0.0F, -1.0F);
+ renderNegativeZFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.NORTH, ForgeDirection.WEST, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(0.0F, 0.0F, 1.0F);
+ renderPositiveZFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.SOUTH, ForgeDirection.WEST, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(-1.0F, 0.0F, 0.0F);
+ renderNegativeXFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.WEST, ForgeDirection.WEST, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(1.0F, 0.0F, 0.0F);
+ renderPositiveXFacing(
+ null,
+ aRenderer,
+ aBlock,
+ 0,
+ 0,
+ 0,
+ getTexture(tMetaTileEntity, ForgeDirection.EAST, ForgeDirection.WEST, -1, true, false),
+ true);
+ Tessellator.instance.draw();
+ }
+
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ }
+ }
+ }
+
+ public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock,
+ RenderBlocks aRenderer) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+
+ return tTileEntity instanceof ITexturedTileEntity
+ ? renderStandardBlock(
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ aBlock,
+ aRenderer,
+ new ITexture[][] { GT_MethodHelper.getTexture(tTileEntity, aBlock, DOWN),
+ GT_MethodHelper.getTexture(tTileEntity, aBlock, UP),
+ GT_MethodHelper.getTexture(tTileEntity, aBlock, ForgeDirection.NORTH),
+ GT_MethodHelper.getTexture(tTileEntity, aBlock, ForgeDirection.SOUTH),
+ GT_MethodHelper.getTexture(tTileEntity, aBlock, ForgeDirection.WEST),
+ GT_MethodHelper.getTexture(tTileEntity, aBlock, ForgeDirection.EAST) })
+ : false;
+ }
+
+ public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock,
+ RenderBlocks aRenderer, ITexture[][] aTextures) {
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[DOWN.ordinal()], true);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[UP.ordinal()], true);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[ForgeDirection.NORTH.ordinal()], true);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[ForgeDirection.SOUTH.ordinal()], true);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[ForgeDirection.WEST.ordinal()], true);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[ForgeDirection.EAST.ordinal()], true);
+ return true;
+ }
+
+ public boolean renderPipeBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock,
+ IPipeRenderedTileEntity aTileEntity, RenderBlocks aRenderer) {
+ final int aConnections = aTileEntity.getConnections();
+ if ((aConnections & HAS_FOAM) != 0) {
+ return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer);
+ } else {
+ float tThickness = aTileEntity.getThickNess();
+ if (tThickness >= 0.99F) {
+ return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer);
+ } else {
+ float sp = (1.0F - tThickness) / 2.0F;
+ int connexionSidesBits = 0;
+
+ for (int ordinalSide = 0; ordinalSide < 6; ++ordinalSide) {
+ if ((aConnections & 1 << ordinalSide) != 0) {
+ connexionSidesBits = connexionSidesBits | 1 << (ordinalSide + 2) % 6;
+ }
+ }
+
+ final EnumSet<ForgeDirection> coveredSides = EnumSet.noneOf(ForgeDirection.class);
+
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (aTileEntity.getCoverIDAtSide(side) != 0) coveredSides.add(side);
+ }
+
+ if (coveredSides.containsAll(EnumSet.of(DOWN, UP, NORTH, SOUTH, WEST, EAST))) {
+ return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer);
+ } else {
+ final EnumMap<ForgeDirection, ITexture[]> texture = new EnumMap<>(ForgeDirection.class);
+ final EnumMap<ForgeDirection, ITexture[]> textureUncovered = new EnumMap<>(ForgeDirection.class);
+
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ texture.put(side, GT_MethodHelper.getTexture((TileEntity) aTileEntity, aBlock, side));
+ textureUncovered.put(side, aTileEntity.getTextureUncovered(side));
+ }
+
+ switch (connexionSidesBits) {
+ case NO_CONNECTION -> {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ }
+ case (CONNECTED_DOWN | CONNECTED_UP) -> {
+ aBlock.setBlockBounds(0.0F, sp, sp, 1.0F, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ if (!coveredSides.contains(WEST)) {
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ }
+ if (!coveredSides.contains(EAST)) {
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ }
+ }
+ case (CONNECTED_NORTH | CONNECTED_SOUTH) -> {
+ aBlock.setBlockBounds(sp, 0.0F, sp, sp + tThickness, 1.0F, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ if (!coveredSides.contains(DOWN)) {
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ }
+ if (!coveredSides.contains(UP)) {
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ }
+ }
+ case (CONNECTED_WEST | CONNECTED_EAST) -> {
+ aBlock.setBlockBounds(sp, sp, 0.0F, sp + tThickness, sp + tThickness, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ if (!coveredSides.contains(NORTH)) {
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ }
+ if (!coveredSides.contains(SOUTH)) {
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ }
+ }
+ default -> {
+ if ((connexionSidesBits & CONNECTED_DOWN) == 0) {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ } else {
+ aBlock.setBlockBounds(0.0F, sp, sp, sp, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ if (!coveredSides.contains(WEST)) {
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ }
+ }
+ if ((connexionSidesBits & CONNECTED_UP) == 0) {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ } else {
+ aBlock.setBlockBounds(sp + tThickness, sp, sp, 1.0F, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ if (!coveredSides.contains(EAST)) {
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ }
+ }
+ if ((connexionSidesBits & CONNECTED_NORTH) == 0) {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ } else {
+ aBlock.setBlockBounds(sp, 0.0F, sp, sp + tThickness, sp, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ if (!coveredSides.contains(DOWN)) {
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ }
+ }
+ if ((connexionSidesBits & CONNECTED_SOUTH) == 0) {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ } else {
+ aBlock.setBlockBounds(sp, sp + tThickness, sp, sp + tThickness, 1.0F, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ if (!coveredSides.contains(UP)) {
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ }
+ }
+ if ((connexionSidesBits & CONNECTED_WEST) == 0) {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ } else {
+ aBlock.setBlockBounds(sp, sp, 0.0F, sp + tThickness, sp + tThickness, sp);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ if (!coveredSides.contains(NORTH)) {
+ renderNegativeZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(NORTH),
+ false);
+ }
+ }
+ if ((connexionSidesBits & CONNECTED_EAST) == 0) {
+ aBlock.setBlockBounds(sp, sp, sp, sp + tThickness, sp + tThickness, sp + tThickness);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ } else {
+ aBlock.setBlockBounds(sp, sp, sp + tThickness, sp + tThickness, sp + tThickness, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(DOWN),
+ false);
+ renderPositiveYFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(UP),
+ false);
+ renderNegativeXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(WEST),
+ false);
+ renderPositiveXFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(EAST),
+ false);
+ if (!coveredSides.contains(SOUTH)) {
+ renderPositiveZFacing(
+ aWorld,
+ aRenderer,
+ aBlock,
+ aX,
+ aY,
+ aZ,
+ textureUncovered.get(SOUTH),
+ false);
+ }
+ }
+ }
+ }
+
+ if (coveredSides.contains(DOWN)) {
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(DOWN), false);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(DOWN), false);
+ if (!coveredSides.contains(NORTH)) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(DOWN), false);
+ }
+
+ if (!coveredSides.contains(SOUTH)) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(DOWN), false);
+ }
+
+ if (!coveredSides.contains(WEST)) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(DOWN), false);
+ }
+
+ if (!coveredSides.contains(EAST)) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(DOWN), false);
+ }
+ }
+
+ if (coveredSides.contains(UP)) {
+ aBlock.setBlockBounds(0.0F, 0.875F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(UP), false);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(UP), false);
+ if (!coveredSides.contains(NORTH)) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(UP), false);
+ }
+
+ if (!coveredSides.contains(SOUTH)) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(UP), false);
+ }
+
+ if (!coveredSides.contains(WEST)) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(UP), false);
+ }
+
+ if (!coveredSides.contains(EAST)) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(UP), false);
+ }
+ }
+
+ if (coveredSides.contains(NORTH)) {
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.125F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!coveredSides.contains(DOWN)) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(NORTH), false);
+ }
+
+ if (!coveredSides.contains(UP)) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(NORTH), false);
+ }
+
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(NORTH), false);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(NORTH), false);
+ if (!coveredSides.contains(WEST)) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(NORTH), false);
+ }
+
+ if (!coveredSides.contains(EAST)) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(NORTH), false);
+ }
+ }
+
+ if (coveredSides.contains(SOUTH)) {
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.875F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!coveredSides.contains(DOWN)) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(SOUTH), false);
+ }
+
+ if (!coveredSides.contains(UP)) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(SOUTH), false);
+ }
+
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(SOUTH), false);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(SOUTH), false);
+ if (!coveredSides.contains(WEST)) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(SOUTH), false);
+ }
+
+ if (!coveredSides.contains(EAST)) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(SOUTH), false);
+ }
+ }
+
+ if (coveredSides.contains(WEST)) {
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 0.125F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!coveredSides.contains(DOWN)) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(WEST), false);
+ }
+
+ if (!coveredSides.contains(UP)) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(WEST), false);
+ }
+
+ if (!coveredSides.contains(NORTH)) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(WEST), false);
+ }
+
+ if (!coveredSides.contains(SOUTH)) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(WEST), false);
+ }
+
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(WEST), false);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(WEST), false);
+ }
+
+ if (coveredSides.contains(EAST)) {
+ aBlock.setBlockBounds(0.875F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!coveredSides.contains(DOWN)) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(EAST), false);
+ }
+
+ if (!coveredSides.contains(UP)) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(EAST), false);
+ }
+
+ if (!coveredSides.contains(NORTH)) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(EAST), false);
+ }
+
+ if (!coveredSides.contains(SOUTH)) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(EAST), false);
+ }
+
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(EAST), false);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, texture.get(EAST), false);
+ }
+
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ return true;
+ }
+ }
+ }
+ }
+
+ public static void renderNegativeYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if (aFullBlock && !aBlock.shouldSideBeRendered(aWorld, aX, aY - 1, aZ, 0)) {
+ return;
+ }
+
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY - 1 : aY, aZ));
+ }
+
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderYNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderPositiveYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if (aFullBlock && !aBlock.shouldSideBeRendered(aWorld, aX, aY + 1, aZ, 1)) {
+ return;
+ }
+
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY + 1 : aY, aZ));
+ }
+
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderYPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderNegativeZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if (aFullBlock && !aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ - 1, 2)) {
+ return;
+ }
+
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ - 1 : aZ));
+ }
+
+ aRenderer.flipTexture = !aFullBlock;
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderZNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderPositiveZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if (aFullBlock && !aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ + 1, 3)) {
+ return;
+ }
+
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ + 1 : aZ));
+ }
+
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderZPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderNegativeXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if (aFullBlock && !aBlock.shouldSideBeRendered(aWorld, aX - 1, aY, aZ, 4)) {
+ return;
+ }
+
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX - 1 : aX, aY, aZ));
+ }
+
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderXNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ aRenderer.flipTexture = false;
+ }
+
+ public static void renderPositiveXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if (aFullBlock && !aBlock.shouldSideBeRendered(aWorld, aX + 1, aY, aZ, 5)) {
+ return;
+ }
+
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX + 1 : aX, aY, aZ));
+ }
+
+ aRenderer.flipTexture = !aFullBlock;
+ if (aIcon != null) {
+ for (ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderXPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ aRenderer.flipTexture = false;
+ }
+
+ @Override
+ public void renderInventoryBlock(Block aBlock, int aMeta, int aModelID, RenderBlocks aRenderer) {
+ aMeta += 30400;
+ if (aBlock instanceof GT_Block_Machines) {
+ if (aMeta > 0 && aMeta < GregTech_API.METATILEENTITIES.length
+ && GregTech_API.METATILEENTITIES[aMeta] != null
+ && !GregTech_API.METATILEENTITIES[aMeta].renderInInventory(aBlock, aMeta, aRenderer)) {
+ renderNormalInventoryMetaTileEntity(aBlock, aMeta, aRenderer);
+ }
+ }
+ aBlock.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ }
+
+ @Override
+ public boolean renderWorldBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, int aModelID,
+ RenderBlocks aRenderer) {
+ TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity == null ? false
+ : (aTileEntity instanceof IGregTechTileEntity
+ && ((IGregTechTileEntity) aTileEntity).getMetaTileEntity() != null
+ && ((IGregTechTileEntity) aTileEntity).getMetaTileEntity()
+ .renderInWorld(aWorld, aX, aY, aZ, aBlock, aRenderer)
+ ? true
+ : (aTileEntity instanceof IPipeRenderedTileEntity
+ ? renderPipeBlock(
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ aBlock,
+ (IPipeRenderedTileEntity) aTileEntity,
+ aRenderer)
+ : renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer)));
+ }
+
+ @Override
+ public boolean shouldRender3DInInventory(int aModel) {
+ return true;
+ }
+
+ @Override
+ public int getRenderId() {
+ return this.mRenderID;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_ElectricAutoWorkbench.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_ElectricAutoWorkbench.java
new file mode 100644
index 0000000000..87ae66b2ad
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_ElectricAutoWorkbench.java
@@ -0,0 +1,873 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.automation;
+
+import java.util.ArrayList;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.oredict.OreDictionary;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_ElectricAutoWorkbench extends GT_MetaTileEntity_BasicTank implements IAddGregtechLogo {
+
+ public int mMode = 0, mCurrentSlot = 0, mThroughPut = 0, mTicksUntilNextUpdate = 20;
+ public boolean mLastCraftSuccessful = false;
+ protected String mLocalName;
+
+ private static final int MAX_MODES = 10;
+ private static final int MAX_THROUGHPUT = 4;
+
+ public GT_MetaTileEntity_ElectricAutoWorkbench(final int aID, final int aTier, final String aDescription) {
+ super(
+ aID,
+ "basicmachine.automation.autoworkbench.0" + aTier,
+ "Auto Workbench (" + GT_Values.VN[aTier] + ")",
+ aTier,
+ 30,
+ aDescription);
+ mLocalName = "Auto Workbench (" + GT_Values.VN[aTier] + ")";
+ }
+
+ public GT_MetaTileEntity_ElectricAutoWorkbench(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 30, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return true;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex < 19;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return !isOutputFacing(side);
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getBackFacing();
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return GT_Values.V[mTier];
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return mThroughPut % 2 == 0 ? GT_Values.V[mTier] : 0;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return GT_Values.V[this.mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(2048L, GT_Values.V[this.mTier] * (this.mTier * GT_Values.V[this.mTier]));
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 30;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ElectricAutoWorkbench(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mMode", mMode);
+ aNBT.setInteger("mThroughPut", mThroughPut);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mMode = aNBT.getInteger("mMode");
+ mThroughPut = aNBT.getInteger("mThroughPut");
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) {
+ return side != getBaseMetaTileEntity().getFrontFacing() && side != getBaseMetaTileEntity().getBackFacing();
+ }
+
+ private void switchMode() {
+ mInventory[28] = null;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (getBaseMetaTileEntity().isAllowedToWork() && getBaseMetaTileEntity().isServerSide()
+ && getBaseMetaTileEntity().getUniversalEnergyStored() >= (mMode == 5 || mMode == 6 ? 128 : 2048)
+ && (getBaseMetaTileEntity().hasWorkJustBeenEnabled() || --mTicksUntilNextUpdate < 1)) {
+ mTicksUntilNextUpdate = 32;
+
+ for (byte i = 19; i < 28; i++) {
+ if (mInventory[i] != null && mInventory[i].isItemStackDamageable()
+ && mInventory[i].getItem()
+ .hasContainerItem(mInventory[i])) {
+ mInventory[i].setItemDamage(OreDictionary.WILDCARD_VALUE);
+ }
+ }
+
+ if (mInventory[18] == null) {
+ for (byte i = 0; i < 18 && mFluid != null; i++) {
+ ItemStack tOutput = GT_Utility.fillFluidContainer(mFluid, mInventory[i], false, true);
+ if (tOutput != null) {
+ for (byte j = 0; j < 9; j++) {
+ if (mInventory[j] == null || (GT_Utility.areStacksEqual(tOutput, mInventory[j])
+ && mInventory[j].stackSize + tOutput.stackSize <= tOutput.getMaxStackSize())) {
+ mFluid.amount -= GT_Utility.getFluidForFilledItem(tOutput, true).amount
+ * tOutput.stackSize;
+ getBaseMetaTileEntity().decrStackSize(i, 1);
+ if (mInventory[j] == null) {
+ mInventory[j] = tOutput;
+ } else {
+ mInventory[j].stackSize++;
+ }
+ if (mFluid.amount <= 0) mFluid = null;
+ break;
+ }
+ }
+ }
+ }
+
+ ItemStack[] tRecipe = new ItemStack[9];
+ ItemStack tTempStack = null, tOutput = null;
+
+ if (mInventory[17] != null && mThroughPut < 2 && mMode != 0) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[17];
+ mInventory[17] = null;
+ }
+ } else {
+ if (!mLastCraftSuccessful) {
+ mCurrentSlot = (mCurrentSlot + 1) % 18;
+ for (int i = 0; i < 17 && mInventory[mCurrentSlot] == null; i++)
+ mCurrentSlot = (mCurrentSlot + 1) % 18;
+ }
+ switch (mMode) {
+ case 0 -> {
+ if (mInventory[mCurrentSlot] != null
+ && !isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2 && mCurrentSlot < 8) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ for (int i = 0; i < 9; i++) {
+ tRecipe[i] = mInventory[i + 19];
+ if (tRecipe[i] != null) {
+ tRecipe[i] = GT_Utility.copy(tRecipe[i]);
+ tRecipe[i].stackSize = 1;
+ }
+ }
+ }
+ case 1 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ tRecipe[1] = tTempStack;
+ tRecipe[3] = tTempStack;
+ tRecipe[4] = tTempStack;
+ } else break;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ tRecipe[2] = tTempStack;
+ tRecipe[5] = tTempStack;
+ tRecipe[6] = tTempStack;
+ tRecipe[7] = tTempStack;
+ tRecipe[8] = tTempStack;
+ } else break;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 2 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 3 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ tRecipe[1] = tTempStack;
+ tRecipe[3] = tTempStack;
+ tRecipe[4] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 4 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ tRecipe[1] = tTempStack;
+ tRecipe[2] = tTempStack;
+ tRecipe[3] = tTempStack;
+ tRecipe[4] = tTempStack;
+ tRecipe[5] = tTempStack;
+ tRecipe[6] = tTempStack;
+ tRecipe[7] = tTempStack;
+ tRecipe[8] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 5 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ tOutput = GT_OreDictUnificator.get(true, tTempStack);
+ if (tOutput != null && GT_Utility.areStacksEqual(tOutput, tTempStack)) tOutput = null;
+ if (tOutput == null) {
+ tRecipe[0] = null;
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 6 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ } else if (OrePrefixes.dustSmall.contains(mInventory[mCurrentSlot])) {
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ tRecipe[1] = tTempStack;
+ tRecipe[3] = tTempStack;
+ tRecipe[4] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe)
+ == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ } else if (OrePrefixes.dustTiny.contains(mInventory[mCurrentSlot])) {
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ tRecipe[1] = tTempStack;
+ tRecipe[2] = tTempStack;
+ tRecipe[3] = tTempStack;
+ tRecipe[4] = tTempStack;
+ tRecipe[5] = tTempStack;
+ tRecipe[6] = tTempStack;
+ tRecipe[7] = tTempStack;
+ tRecipe[8] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe)
+ == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ } else {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 7 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])
+ || !OrePrefixes.nugget.contains(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ tRecipe[0] = tTempStack;
+ tRecipe[1] = tTempStack;
+ tRecipe[2] = tTempStack;
+ tRecipe[3] = tTempStack;
+ tRecipe[4] = tTempStack;
+ tRecipe[5] = tTempStack;
+ tRecipe[6] = tTempStack;
+ tRecipe[7] = tTempStack;
+ tRecipe[8] = tTempStack;
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe) == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+ case 8 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])
+ || mInventory[mCurrentSlot].getItemDamage() <= 0
+ || !mInventory[mCurrentSlot].getItem()
+ .isRepairable()) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ tTempStack = GT_Utility.copy(mInventory[mCurrentSlot]);
+ tTempStack.stackSize = 1;
+ for (int i = mCurrentSlot + 1; i < 18; i++) {
+ if (mInventory[i] != null && mInventory[i].getItem() == tTempStack.getItem()
+ && mInventory[mCurrentSlot].getItemDamage() + mInventory[i].getItemDamage()
+ > tTempStack.getMaxDamage()) {
+ tRecipe[0] = tTempStack;
+ tRecipe[1] = GT_Utility.copy(mInventory[i]);
+ if (GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe)
+ == null) {
+ if (mInventory[18] == null) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ break;
+ }
+ }
+ }
+ case 9 -> {
+ if (isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(mInventory[mCurrentSlot])) {
+ if (mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mCurrentSlot];
+ mInventory[mCurrentSlot] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ break;
+ }
+ for (byte i = 0, j = 0; i < 18 && j < 9
+ && (j < 2
+ || GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe)
+ == null); i++) {
+ tRecipe[j] = mInventory[(mCurrentSlot + i) % 18];
+ if (tRecipe[j] != null) {
+ tRecipe[j] = GT_Utility.copy(tRecipe[j]);
+ tRecipe[j].stackSize = 1;
+ j++;
+ }
+ }
+ if (tRecipe[1] == null) tRecipe[0] = null;
+ }
+ }
+ }
+
+ if (tOutput == null)
+ tOutput = GT_ModHandler.getAllRecipeOutput(getBaseMetaTileEntity().getWorld(), tRecipe);
+
+ if (tOutput != null || mMode == 0) mInventory[28] = tOutput;
+
+ if (tOutput == null) {
+ mLastCraftSuccessful = false;
+ } else {
+ if ((tTempStack = GT_OreDictUnificator.get(true, tOutput)) != null) {
+ tTempStack.stackSize = tOutput.stackSize;
+ tOutput = tTempStack;
+ }
+
+ mInventory[28] = GT_Utility.copy(tOutput);
+ ArrayList<ItemStack> tList = recipeContent(tRecipe), tContent = benchContent();
+ if (tList.size() > 0 && tContent.size() > 0) {
+
+ boolean success = (mMode == 6 || mMode == 7 || mInventory[17] == null);
+ for (byte i = 0; i < tList.size() && success; i++) {
+ success = false;
+ for (byte j = 0; j < tContent.size() && !success; j++) {
+ if (GT_Utility.areStacksEqual(tList.get(i), tContent.get(j))) {
+ if (tList.get(i).stackSize <= tContent.get(j).stackSize) {
+ success = true;
+ }
+ }
+ }
+ }
+
+ if (success) {
+ mLastCraftSuccessful = true;
+
+ for (byte i = 8; i > -1; i--) {
+ for (byte j = 17; j > -1; j--) {
+ if (tRecipe[i] != null && mInventory[j] != null) {
+ if (GT_Utility.areStacksEqual(tRecipe[i], mInventory[j])) {
+ ItemStack tStack = GT_Utility.getContainerItem(mInventory[j], true);
+ if (tStack != null) {
+ getBaseMetaTileEntity().decrStackSize(j, 1);
+ if (!tStack.isItemStackDamageable()
+ || tStack.getItemDamage() < tStack.getMaxDamage()) {
+ for (byte k = 9; k < 18; k++) {
+ if (mInventory[k] == null) {
+ mInventory[k] = GT_Utility.copy(tStack);
+ break;
+ } else if (GT_Utility.areStacksEqual(mInventory[k], tStack)
+ && mInventory[k].stackSize + tStack.stackSize
+ <= tStack.getMaxStackSize()) {
+ mInventory[k].stackSize += tStack.stackSize;
+ break;
+ }
+ }
+ }
+ } else {
+ getBaseMetaTileEntity().decrStackSize(j, 1);
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ mInventory[18] = GT_Utility.copy(tOutput);
+ getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(mMode == 5 || mMode == 6 || mMode == 7 ? 128 : 2048, true);
+ mTicksUntilNextUpdate = 1;
+ } else {
+ mLastCraftSuccessful = false;
+ if (mInventory[mMode == 0 ? 8 : 17] != null && mInventory[18] == null && mThroughPut < 2) {
+ mInventory[18] = mInventory[mMode == 0 ? 8 : 17];
+ mInventory[mMode == 0 ? 8 : 17] = null;
+ mTicksUntilNextUpdate = 1;
+ }
+ }
+ }
+
+ if (mInventory[18] == null && mThroughPut < 2) {
+ for (byte i = 0; i < 8; i++) {
+ for (byte j = i; ++j < 9;) {
+ if (GT_Utility.areStacksEqual(mInventory[i], mInventory[j])
+ && mInventory[i].getMaxStackSize() > 8) {
+ mInventory[18] = mInventory[j];
+ mInventory[j] = null;
+ mTicksUntilNextUpdate = 1;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (mThroughPut < 2) {
+ getBaseMetaTileEntity().decreaseStoredEnergyUnits(
+ GT_Utility.moveOneItemStack(
+ getBaseMetaTileEntity(),
+ getBaseMetaTileEntity().getIInventoryAtSide(getBaseMetaTileEntity().getBackFacing()),
+ getBaseMetaTileEntity().getBackFacing(),
+ getBaseMetaTileEntity().getFrontFacing(),
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1) * 10,
+ true);
+ }
+ }
+ }
+
+ private boolean isItemTypeOrItsEmptyLiquidContainerInCraftingGrid(ItemStack aStack) {
+ if (aStack == null) return true;
+ for (byte i = 19; i < 28; i++) {
+ if (mInventory[i] != null) {
+ if (GT_Utility.areStacksEqual(mInventory[i], aStack)) return true;
+ if (GT_Utility.areStacksEqual(GT_Utility.getContainerForFilledItem(mInventory[i], true), aStack))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private ArrayList<ItemStack> recipeContent(ItemStack[] tRecipe) {
+ ArrayList<ItemStack> tList = new ArrayList<>();
+ for (byte i = 0; i < 9; i++) {
+ if (tRecipe[i] != null) {
+ boolean temp = false;
+ for (ItemStack itemStack : tList) {
+ if (GT_Utility.areStacksEqual(tRecipe[i], itemStack)) {
+ itemStack.stackSize++;
+ temp = true;
+ break;
+ }
+ }
+ if (!temp) tList.add(GT_Utility.copy(1, tRecipe[i]));
+ }
+ }
+ return tList;
+ }
+
+ private ArrayList<ItemStack> benchContent() {
+ ArrayList<ItemStack> tList = new ArrayList<>();
+ for (byte i = 0; i < 18; i++) {
+ if (mInventory[i] != null) {
+ boolean temp = false;
+ for (byte j = 0; j < tList.size(); j++) {
+ if (GT_Utility.areStacksEqual(mInventory[i], mInventory[j])) {
+ tList.get(j).stackSize += mInventory[i].stackSize;
+ temp = true;
+ break;
+ }
+ }
+ if (!temp) tList.add(GT_Utility.copy(mInventory[i]));
+ }
+ }
+ return tList;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return mMode == 0 ? aIndex >= 10 : aIndex >= 18;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return mMode == 0 ? aIndex < 9 : aIndex < 18;
+ }
+
+ /*
+ * @Override public int getTextureIndex(byte aSide, byte aFacing, boolean aActive, boolean aRedstone) { if (aSide ==
+ * aFacing) return 112; if (GT_Utility.getOppositeSide(aSide) == aFacing) return 113; return 114; }
+ */
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ @Override
+ public int getTankPressure() {
+ return -100;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { "Automatic Crafting Table Mk III",
+ // this.mDescription,
+ CORE.GT_Tooltip.get() };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFront(i);
+ rTextures[6][i + 1] = this.getBack(i);
+ rTextures[7][i + 1] = this.getBottom(i);
+ rTextures[8][i + 1] = this.getTop(i);
+ rTextures[9][i + 1] = this.getSides(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == facing) {
+ return this.mTextures[0][aColorIndex + 1];
+ } else if (side.getOpposite() == facing) {
+ return this.mTextures[1][aColorIndex + 1];
+ } else {
+ return this.mTextures[4][aColorIndex + 1];
+ }
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Adv_Workbench_Crafting_Overlay) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1],
+ new GT_RenderedTexture(BlockIcons.OVERLAY_PIPE) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1], };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Adv_Workbench_Crafting_Overlay) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Adv_Workbench_Crafting_Overlay) };
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(118, 22));
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .endAtSlot(8)
+ .build()
+ .setPos(7, 4))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 9)
+ .startFromSlot(9)
+ .endAtSlot(17)
+ .canInsert(false)
+ .background(GT_UITextures.SLOT_DARK_GRAY)
+ .applyForWidget(SlotWidget::disableShiftInsert)
+ .build()
+ .setPos(7, 59))
+ .widget(
+ new SlotWidget(inventoryHandler, 18).setAccess(true, false)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_OUT)
+ .setPos(151, 40))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SLOTS_HOLO_3BY3)
+ .setPos(62, 4)
+ .setSize(54, 54))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .startFromSlot(19)
+ .endAtSlot(27)
+ .phantom(true)
+ .background(GT_UITextures.TRANSPARENT)
+ .build()
+ .setPos(62, 4))
+ .widget(
+ SlotWidget.phantom(inventoryHandler, 28)
+ .disableInteraction()
+ .setBackground(getGUITextureSet().getItemSlot(), GTPP_UITextures.OVERLAY_SLOT_ARROW_4)
+ .setPos(151, 4));
+ builder.widget(
+ new CycleButtonWidget().setGetter(() -> mThroughPut)
+ .setSetter(val -> mThroughPut = val)
+ .setLength(MAX_THROUGHPUT)
+ .setTextureGetter(i -> GTPP_UITextures.OVERLAY_BUTTON_THROUGHPUT[i])
+ .setBackground(GT_UITextures.BUTTON_STANDARD)
+ .setPos(120, 4)
+ .setSize(18, 18));
+ String[] mModeText = new String[] { "Normal Crafting Table", "???", "1x1", "2x2", "3x3", "Unifier", "Dust",
+ "???", "Hammer?", "Circle" };
+ CycleButtonWidget modeButton = new CycleButtonWidget().setGetter(() -> mMode)
+ .setSetter(val -> {
+ mMode = val;
+ switchMode();
+ })
+ .setLength(MAX_MODES)
+ .setTextureGetter(i -> GTPP_UITextures.OVERLAY_BUTTON_MODE[i]);
+ for (int i = 0; i < MAX_MODES; i++) {
+ modeButton.addTooltip(i, "Mode: " + mModeText[i]);
+ }
+ builder.widget(
+ modeButton.setBackground(GT_UITextures.BUTTON_STANDARD)
+ .setPos(120, 40)
+ .setSize(18, 18));
+ builder.widget(
+ new DrawableWidget().setDrawable(GTPP_UITextures.PICTURE_WORKBENCH_CIRCLE)
+ .setPos(136, 23)
+ .setSize(16, 16))
+ .widget(
+ new DrawableWidget().setDrawable(GTPP_UITextures.PICTURE_ARROW_WHITE_DOWN)
+ .setPos(155, 23)
+ .setSize(10, 16));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractGenerator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractGenerator.java
new file mode 100644
index 0000000000..7fc2b50f68
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractGenerator.java
@@ -0,0 +1,834 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.automation;
+
+import static gtPlusPlus.core.lib.CORE.sTesseractGeneratorOwnershipMap;
+import static gtPlusPlus.core.lib.CORE.sTesseractTerminalOwnershipMap;
+
+import java.util.UUID;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IDigitalChest;
+import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.helpers.tesseract.TesseractHelper;
+
+public class GT_MetaTileEntity_TesseractGenerator extends GT_MetaTileEntity_BasicTank {
+
+ public static int TESSERACT_ENERGY_COST_DIMENSIONAL = 512;
+ public static int TESSERACT_ENERGY_COST = 128;
+ public byte isWorking = 0;
+ public int oFrequency = 0;
+ public int mNeededEnergy = 0;
+ public int mFrequency = 0;
+ public UUID mOwner;
+
+ public GT_MetaTileEntity_TesseractGenerator(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier, 3, "");
+ }
+
+ public GT_MetaTileEntity_TesseractGenerator(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TesseractGenerator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return true;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(final ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getBackFacing();
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return this.getBaseMetaTileEntity()
+ .getEUCapacity() / 2;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 512;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512 * 32;
+ }
+
+ @Override
+ public long maxSteamStore() {
+ return this.maxEUStore();
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean ownerControl() {
+ return true;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (TesseractHelper.getGeneratorByFrequency(PlayerUtils.getPlayerOnServerFromUUID(mOwner), this.mFrequency)
+ == this) && (this.isWorking >= 20) ? 999 : 0;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return 1000;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setInteger("mFrequency", this.mFrequency);
+ if (mOwner != null) aNBT.setString("mOwner", mOwner.toString());
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ this.mFrequency = aNBT.getInteger("mFrequency");
+ try {
+ this.mOwner = UUID.fromString(aNBT.getString("mOnwer"));
+ } catch (IllegalArgumentException i) {
+
+ }
+ }
+
+ @Override
+ public void onConfigLoad(final GT_Config aConfig) {
+ int J = 4;
+ TESSERACT_ENERGY_COST = 128 * J;
+ TESSERACT_ENERGY_COST_DIMENSIONAL = 512 * J;
+ }
+
+ @Override
+ public void onServerStart() {
+ sTesseractGeneratorOwnershipMap.clear();
+ sTesseractTerminalOwnershipMap.clear();
+ }
+
+ public void onServerStop() {
+ sTesseractGeneratorOwnershipMap.clear();
+ sTesseractTerminalOwnershipMap.clear();
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer,
+ final ForgeDirection side, final float aX, final float aY, final float aZ) {
+
+ if (this.mOwner == null) {
+ if (this.getBaseMetaTileEntity()
+ .getOwnerName() != null
+ && !this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .equals("")) {
+ if (this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .toLowerCase()
+ .equals(
+ aPlayer.getDisplayName()
+ .toLowerCase())) {
+ this.mOwner = PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName());
+ }
+ }
+ }
+
+ if (side == this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) == 0) {
+ final float[] tCoords = GT_Utility.getClickedFacingCoords(side, aX, aY, aZ);
+ switch ((byte) ((byte) (int) (tCoords[0] * 2.0F) + (2 * (byte) (int) (tCoords[1] * 2.0F)))) {
+ case 0:
+ Logger.WARNING("Freq. -1 | " + this.mFrequency);
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency -= 1;
+
+ break;
+ case 1:
+ Logger.WARNING("Freq. +1 | " + this.mFrequency);
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency += 1;
+ default:
+ // Utils.LOG_WARNING("Did not click the correct place.");
+ break;
+ }
+ if (getGeneratorEntity(this.mFrequency) != null && getGeneratorEntity(this.mFrequency) != this) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ "Frequency: " + this.mFrequency + EnumChatFormatting.RED + " (Occupied)");
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, "Frequency: " + this.mFrequency);
+ }
+ } else if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) != 0) {
+ GT_Utility.sendChatToPlayer(aPlayer, "This is not your Tesseract Generator to configure.");
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(final ForgeDirection side, final EntityPlayer aPlayer, final float aX,
+ final float aY, final float aZ) {
+ if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) == 0) {
+ if (side == this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ final float[] tCoords = GT_Utility.getClickedFacingCoords(side, aX, aY, aZ);
+ switch ((byte) ((byte) (int) (tCoords[0] * 2.0F) + (2 * (byte) (int) (tCoords[1] * 2.0F)))) {
+ case 0 -> {
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency -= 64;
+ }
+ case 1 -> {
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency += 64;
+ }
+ case 2 -> {
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency -= 512;
+ }
+ case 3 -> {
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency += 512;
+ }
+ }
+ if (getGeneratorEntity(this.mFrequency) != null && getGeneratorEntity(this.mFrequency) != this) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ "Frequency: " + this.mFrequency + EnumChatFormatting.RED + " (Occupied)");
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, "Frequency: " + this.mFrequency);
+ }
+ }
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, "This is not your Tesseract Generator to configure.");
+ }
+ }
+
+ public boolean allowCoverOnSide(final ForgeDirection side, final int aCoverID) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public String[] getInfoData() {
+ final TileEntity tTileEntity = this.getBaseMetaTileEntity()
+ .getTileEntityAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork())
+ && ((tTileEntity instanceof IGregTechDeviceInformation))
+ && (((IGregTechDeviceInformation) tTileEntity).isGivingInformation())) {
+ return ((IGregTechDeviceInformation) tTileEntity).getInfoData();
+ }
+ return new String[] { "Tesseract Generator", "Freqency:", "" + this.mFrequency,
+ (getGeneratorEntity() == this) && (this.isWorking >= 20) ? "Active" : "Inactive" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ public boolean isSendingInformation() {
+ final TileEntity tTileEntity = this.getBaseMetaTileEntity()
+ .getTileEntityAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork()) && ((tTileEntity instanceof IGregTechDeviceInformation))) {
+ return ((IGregTechDeviceInformation) tTileEntity).isGivingInformation();
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isDigitalChest() {
+ final TileEntity tTileEntity = this.getBaseMetaTileEntity()
+ .getTileEntityAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork()) && ((tTileEntity instanceof IDigitalChest))) {
+ return ((IDigitalChest) tTileEntity).isDigitalChest();
+ }
+ return false;
+ }
+
+ @Override
+ public ItemStack[] getStoredItemData() {
+ final TileEntity tTileEntity = this.getBaseMetaTileEntity()
+ .getTileEntityAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork()) && ((tTileEntity instanceof IDigitalChest))) {
+ return ((IDigitalChest) tTileEntity).getStoredItemData();
+ }
+ return new ItemStack[] {};
+ }
+
+ @Override
+ public void setItemCount(final int aCount) {
+ final TileEntity tTileEntity = this.getBaseMetaTileEntity()
+ .getTileEntityAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork()) && ((tTileEntity instanceof IDigitalChest))) {
+ ((IDigitalChest) tTileEntity).setItemCount(aCount);
+ }
+ }
+
+ @Override
+ public int getMaxItemCount() {
+ final TileEntity tTileEntity = this.getBaseMetaTileEntity()
+ .getTileEntityAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork()) && ((tTileEntity instanceof IDigitalChest))) {
+ return ((IDigitalChest) tTileEntity).getMaxItemCount();
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int aIndex, final ItemStack aStack) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.isItemValidForSlot(aIndex, aStack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int ordinalSide) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return new int[0];
+ }
+ if ((tTileEntity instanceof ISidedInventory)) {
+ return ((ISidedInventory) tTileEntity).getAccessibleSlotsFromSide(ordinalSide);
+ }
+ final int[] rArray = new int[this.getSizeInventory()];
+ for (int i = 0; i < this.getSizeInventory(); i++) {
+ rArray[i] = i;
+ }
+ return rArray;
+ }
+
+ @Override
+ public boolean canInsertItem(final int aIndex, final ItemStack aStack, final int ordinalSide) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ if ((tTileEntity instanceof ISidedInventory)) {
+ return ((ISidedInventory) tTileEntity).canInsertItem(aIndex, aStack, ordinalSide);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean canExtractItem(final int aIndex, final ItemStack aStack, final int ordinalSide) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ if ((tTileEntity instanceof ISidedInventory)) {
+ return ((ISidedInventory) tTileEntity).canExtractItem(aIndex, aStack, ordinalSide);
+ }
+ return true;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int aIndex) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.getStackInSlot(aIndex);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int aIndex, final ItemStack aStack) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return;
+ }
+ tTileEntity.setInventorySlotContents(aIndex, aStack);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int aIndex, final int aAmount) {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.decrStackSize(aIndex, aAmount);
+ }
+
+ @Override
+ public String getInventoryName() {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return "";
+ }
+ return tTileEntity.getInventoryName();
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ final IInventory tTileEntity = this.getBaseMetaTileEntity()
+ .getIInventoryAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean canFill(final ForgeDirection aSide, final Fluid aFluid) {
+ final IFluidHandler tTileEntity = this.getBaseMetaTileEntity()
+ .getITankContainerAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.canFill(aSide, aFluid);
+ }
+
+ @Override
+ public boolean canDrain(final ForgeDirection aSide, final Fluid aFluid) {
+ final IFluidHandler tTileEntity = this.getBaseMetaTileEntity()
+ .getITankContainerAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.canDrain(aSide, aFluid);
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(final ForgeDirection aSide) {
+ final IFluidHandler tTileEntity = this.getBaseMetaTileEntity()
+ .getITankContainerAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return new FluidTankInfo[0];
+ }
+ return tTileEntity.getTankInfo(aSide);
+ }
+
+ @Override
+ public int fill_default(final ForgeDirection aDirection, final FluidStack aFluid, final boolean doFill) {
+ final IFluidHandler tTileEntity = this.getBaseMetaTileEntity()
+ .getITankContainerAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.fill(aDirection, aFluid, doFill);
+ }
+
+ @Override
+ public FluidStack drain(final ForgeDirection aDirection, final int maxDrain, final boolean doDrain) {
+ final IFluidHandler tTileEntity = this.getBaseMetaTileEntity()
+ .getITankContainerAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.drain(aDirection, maxDrain, doDrain);
+ }
+
+ @Override
+ public FluidStack drain(final ForgeDirection aSide, final FluidStack aFluid, final boolean doDrain) {
+ final IFluidHandler tTileEntity = this.getBaseMetaTileEntity()
+ .getITankContainerAtSide(
+ this.getBaseMetaTileEntity()
+ .getBackFacing());
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.drain(aSide, aFluid, doDrain);
+ }
+
+ public boolean addEnergyConsumption(final GT_MetaTileEntity_TesseractTerminal aTerminal) {
+ if (!this.getBaseMetaTileEntity()
+ .isAllowedToWork()) {
+ return false;
+ }
+ int J = (aTerminal.getBaseMetaTileEntity()
+ .getWorld()
+ == this.getBaseMetaTileEntity()
+ .getWorld() ? TESSERACT_ENERGY_COST : TESSERACT_ENERGY_COST_DIMENSIONAL);
+
+ J *= 4;
+
+ this.mNeededEnergy += J;
+
+ return true;
+ }
+
+ public boolean isValidTesseractGenerator(final String aOwnerName, final boolean aWorkIrrelevant) {
+ return (this.getBaseMetaTileEntity() != null) && (!this.getBaseMetaTileEntity()
+ .isInvalidTileEntity())
+ && (this.getBaseMetaTileEntity()
+ .isAllowedToWork())
+ && ((aOwnerName == null) || (this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .equals(aOwnerName)))
+ && ((aWorkIrrelevant) || (this.isWorking >= 20));
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ // TODO Auto-generated method stub
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ // Utils.LOG_WARNING("Ticking Generator. 0");
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ // Utils.LOG_WARNING("Ticking Generator.");
+ // Set owner
+ if (PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName())
+ != null) {
+ if (this.mOwner == null) {
+ Logger.WARNING("Setting Generators Owner. 1");
+ this.mOwner = PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName());
+ }
+ }
+
+ if (this.mFrequency != this.oFrequency) {
+
+ Logger.WARNING("mFreq != oFreq");
+
+ if (getGeneratorEntity() == this) {
+ getGeneratorEntity(this.oFrequency);
+ this.getBaseMetaTileEntity()
+ .issueBlockUpdate();
+ Logger.WARNING("this Gen == oFreq on map - do block update");
+ }
+ Logger.WARNING("mFreq will be set to oFreq");
+ this.oFrequency = this.mFrequency;
+ }
+ if ((this.getBaseMetaTileEntity()
+ .isAllowedToWork())
+ && (this.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(this.mNeededEnergy, false))) {
+ // Utils.LOG_WARNING("Can Work & Has Energy");
+ if ((getGeneratorEntity(Integer.valueOf(this.mFrequency)) == null)
+ || (!getGeneratorEntity(Integer.valueOf(this.mFrequency)).isValidTesseractGenerator(null, true))) {
+ // Utils.LOG_WARNING("storing TE I think to mFreq map?");
+ TesseractHelper.setGeneratorOwnershipByPlayer(
+ PlayerUtils.getPlayerOnServerFromUUID(mOwner),
+ this.mFrequency,
+ this);
+ }
+ } else {
+ if (getGeneratorEntity(Integer.valueOf(this.mFrequency)) == this) {
+ Logger.WARNING("this gen == mFreq on map - do block update");
+ TesseractHelper.removeGenerator(PlayerUtils.getPlayerOnServerFromUUID(mOwner), this.mFrequency);
+ this.getBaseMetaTileEntity()
+ .issueBlockUpdate();
+ }
+ this.isWorking = 0;
+ }
+ if (getGeneratorEntity(Integer.valueOf(this.mFrequency)) == this) {
+ // Utils.LOG_WARNING("mFreq == this - do work related things");
+ if (this.isWorking < 20) {
+ this.isWorking = ((byte) (this.isWorking + 1));
+ }
+ if (this.isWorking == 20) {
+ this.getBaseMetaTileEntity()
+ .issueBlockUpdate();
+ this.isWorking = ((byte) (this.isWorking + 1));
+ }
+ } else {
+ this.isWorking = 0;
+ }
+ this.mNeededEnergy = 0;
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Generates a Tesseract for the attached Inventory",
+ "Connect with pipes to insert items",
+ "Consumes " + TESSERACT_ENERGY_COST + "EU/t for same dimension transfers",
+ "Consumes " + TESSERACT_ENERGY_COST_DIMENSIONAL + "EU/t for cross dimensional transfers",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ return new ITexture[0][0][0];
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return side == facing
+ ? new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Dimensional),
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_Frequency) }
+ : new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Dimensional),
+ new GT_RenderedTexture(Textures.BlockIcons.VOID) };
+ }
+
+ // To-Do?
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ private GT_MetaTileEntity_TesseractGenerator getGeneratorEntity() {
+ GT_MetaTileEntity_TesseractGenerator thisGenerator = TesseractHelper
+ .getGeneratorByFrequency(PlayerUtils.getPlayerOnServerFromUUID(mOwner), this.mFrequency);
+ if (thisGenerator != null) {
+ return thisGenerator;
+ }
+ return null;
+ }
+
+ private GT_MetaTileEntity_TesseractGenerator getGeneratorEntity(int frequency) {
+ GT_MetaTileEntity_TesseractGenerator thisGenerator = TesseractHelper
+ .getGeneratorByFrequency(PlayerUtils.getPlayerOnServerFromUUID(mOwner), frequency);
+ if (thisGenerator != null) {
+ return thisGenerator;
+ }
+ return null;
+ }
+
+ @Override
+ public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ if (this.getBaseMetaTileEntity()
+ .getOwnerName() != null
+ && !this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .equals("")) {
+ this.mOwner = PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName());
+ Logger.WARNING("Setting Generators Owner. 2");
+ }
+ super.onCreated(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ public void onRemoval() {
+ try {
+ CORE.sTesseractGeneratorOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ super.onRemoval();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractTerminal.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractTerminal.java
new file mode 100644
index 0000000000..659f34e0d8
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/automation/GT_MetaTileEntity_TesseractTerminal.java
@@ -0,0 +1,644 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.automation;
+
+import java.util.UUID;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.helpers.tesseract.TesseractHelper;
+
+public class GT_MetaTileEntity_TesseractTerminal extends GT_MetaTileEntity_BasicTank {
+
+ public int mFrequency = 0;
+ public UUID mOwner;
+ public boolean mDidWork = false;
+ public static boolean sInterDimensionalTesseractAllowed = true;
+ private static int TESSERACT_ENERGY_COST = 128;
+ private static int TESSERACT_ENERGY_COST_DIMENSIONAL = 512;
+
+ public GT_MetaTileEntity_TesseractTerminal(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier, 3, "");
+ }
+
+ public GT_MetaTileEntity_TesseractTerminal(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TesseractTerminal(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getBackFacing();
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return (this.getBaseMetaTileEntity()
+ .getEUCapacity() / 100);
+ }
+
+ @Override
+ public long maxEUInput() {
+ return TESSERACT_ENERGY_COST_DIMENSIONAL;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return TESSERACT_ENERGY_COST_DIMENSIONAL * 8 * 32;
+ }
+
+ @Override
+ public long maxSteamStore() {
+ return this.maxEUStore();
+ }
+
+ @Override
+ public boolean ownerControl() {
+ return true;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return this.getTesseract(this.mFrequency, false) != null ? 999 : 0;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return 1000;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setInteger("mFrequency", this.mFrequency);
+ aNBT.setString("mOwner", mOwner.toString());
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ this.mFrequency = aNBT.getInteger("mFrequency");
+ this.mOwner = UUID.fromString(aNBT.getString("mOnwer"));
+ }
+
+ @Override
+ public void onConfigLoad(final GT_Config aConfig) {
+ sInterDimensionalTesseractAllowed = true;
+ TESSERACT_ENERGY_COST = 512;
+ TESSERACT_ENERGY_COST_DIMENSIONAL = 2048;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer,
+ final ForgeDirection side, final float aX, final float aY, final float aZ) {
+
+ if (this.mOwner == null) {
+ if (this.getBaseMetaTileEntity()
+ .getOwnerName() != null
+ && !this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .equals("")) {
+ if (this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .toLowerCase()
+ .equals(
+ aPlayer.getDisplayName()
+ .toLowerCase())) {
+ this.mOwner = PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName());
+ }
+ }
+ }
+
+ if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) == 0) {
+ if (side == this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ final float[] tCoords = GT_Utility.getClickedFacingCoords(side, aX, aY, aZ);
+ switch ((byte) ((byte) (int) (tCoords[0] * 2.0F) + (2 * (byte) (int) (tCoords[1] * 2.0F)))) {
+ case 0:
+ // Utils.LOG_WARNING("Freq. -1 | " + this.mFrequency);
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency -= 1;
+ break;
+ case 1:
+ // Utils.LOG_WARNING("Freq. +1 | " + this.mFrequency);
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency += 1;
+ default:
+ // Utils.LOG_WARNING("Did not click the correct place.");
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ break;
+ }
+ PlayerUtils.messagePlayer(aPlayer, "Frequency: " + this.mFrequency);
+ if (this.getTesseract(this.mFrequency, false) != null) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ new StringBuilder().append(EnumChatFormatting.GREEN)
+ .append(" (Connected)")
+ .toString());
+ }
+ }
+ } else if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) != 0) {
+ GT_Utility.sendChatToPlayer(aPlayer, "This is not your Tesseract Terminal to configure.");
+ }
+ return true;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(final ForgeDirection side, final EntityPlayer aPlayer, final float aX,
+ final float aY, final float aZ) {
+ if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) == 0) {
+ if (side == this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ final float[] tCoords = GT_Utility.getClickedFacingCoords(side, aX, aY, aZ);
+ switch ((byte) ((byte) (int) (tCoords[0] * 2.0F) + (2 * (byte) (int) (tCoords[1] * 2.0F)))) {
+ case 0 -> {
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency -= 64;
+ }
+ case 1 -> {
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency += 64;
+ }
+ case 2 -> {
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency -= 512;
+ }
+ case 3 -> {
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ this.mFrequency += 512;
+ }
+ }
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ "Frequency: " + this.mFrequency
+ + (this.getTesseract(this.mFrequency, false) == null ? ""
+ : new StringBuilder().append(EnumChatFormatting.GREEN)
+ .append(" (Connected)")
+ .toString()));
+ }
+ } else if (aPlayer.getUniqueID()
+ .compareTo(this.mOwner) != 0) {
+ GT_Utility.sendChatToPlayer(aPlayer, "This is not your Tesseract Terminal to configure.");
+ }
+ }
+
+ public boolean allowCoverOnSide(final ForgeDirection side, final int aCoverID) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ public GT_MetaTileEntity_TesseractGenerator getTesseract(final int aFrequency, final boolean aWorkIrrelevant) {
+ final GT_MetaTileEntity_TesseractGenerator rTesseract = TesseractHelper
+ .getGeneratorByFrequency(PlayerUtils.getPlayerOnServerFromUUID(mOwner), aFrequency);
+ if (rTesseract == null) {
+ return null;
+ }
+ if (!TesseractHelper.isGeneratorOwnedByPlayer(PlayerUtils.getPlayerOnServerFromUUID(mOwner), rTesseract)) {
+ return null;
+ }
+ if (rTesseract.mFrequency != aFrequency) {
+ TesseractHelper.setTerminalOwnershipByPlayer(
+ PlayerUtils.getPlayerOnServerFromUUID(mOwner),
+ Integer.valueOf(aFrequency),
+ null);
+ return null;
+ }
+ if (!rTesseract.isValidTesseractGenerator(
+ this.getBaseMetaTileEntity()
+ .getOwnerName(),
+ aWorkIrrelevant)) {
+ return null;
+ }
+ if ((!sInterDimensionalTesseractAllowed) && (rTesseract.getBaseMetaTileEntity()
+ .getWorld()
+ != this.getBaseMetaTileEntity()
+ .getWorld())) {
+ return null;
+ }
+ return rTesseract;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity != null) && (this.getBaseMetaTileEntity()
+ .isAllowedToWork()) && (tTileEntity.isSendingInformation())) {
+ return tTileEntity.getInfoData();
+ }
+ return new String[] { "Tesseract Generator", "Freqency:", "" + this.mFrequency,
+ this.getTesseract(this.mFrequency, false) != null ? "Active" : "Inactive" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public boolean isDigitalChest() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.isDigitalChest();
+ }
+
+ @Override
+ public ItemStack[] getStoredItemData() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.getStoredItemData();
+ }
+
+ @Override
+ public void setItemCount(final int aCount) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return;
+ }
+ tTileEntity.setItemCount(aCount);
+ }
+
+ @Override
+ public int getMaxItemCount() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.getMaxItemCount();
+ }
+
+ @Override
+ public boolean isItemValidForSlot(final int aIndex, final ItemStack aStack) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.isItemValidForSlot(aIndex, aStack);
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int ordinalSide) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return new int[0];
+ }
+ return tTileEntity.getAccessibleSlotsFromSide(ordinalSide);
+ }
+
+ @Override
+ public boolean canInsertItem(final int aIndex, final ItemStack aStack, final int ordinalSide) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.canInsertItem(aIndex, aStack, ordinalSide);
+ }
+
+ @Override
+ public boolean canExtractItem(final int aIndex, final ItemStack aStack, final int ordinalSide) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.canExtractItem(aIndex, aStack, ordinalSide);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.getSizeInventory();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int aIndex) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.getStackInSlot(aIndex);
+ }
+
+ @Override
+ public void setInventorySlotContents(final int aIndex, final ItemStack aStack) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return;
+ }
+ tTileEntity.setInventorySlotContents(aIndex, aStack);
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int aIndex, final int aAmount) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.decrStackSize(aIndex, aAmount);
+ }
+
+ @Override
+ public String getInventoryName() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return "";
+ }
+ return tTileEntity.getInventoryName();
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.getInventoryStackLimit();
+ }
+
+ @Override
+ public boolean canFill(final ForgeDirection aSide, final Fluid aFluid) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.canFill(aSide, aFluid);
+ }
+
+ @Override
+ public boolean canDrain(final ForgeDirection aSide, final Fluid aFluid) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return false;
+ }
+ return tTileEntity.canDrain(aSide, aFluid);
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(final ForgeDirection aSide) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return new FluidTankInfo[0];
+ }
+ return tTileEntity.getTankInfo(aSide);
+ }
+
+ @Override
+ public int fill_default(final ForgeDirection aDirection, final FluidStack aFluid, final boolean doFill) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return 0;
+ }
+ return tTileEntity.fill(aDirection, aFluid, doFill);
+ }
+
+ @Override
+ public FluidStack drain(final ForgeDirection aDirection, final int maxDrain, final boolean doDrain) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.drain(aDirection, maxDrain, doDrain);
+ }
+
+ @Override
+ public FluidStack drain(final ForgeDirection aSide, final FluidStack aFluid, final boolean doDrain) {
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, false);
+ if ((tTileEntity == null) || (!this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ return null;
+ }
+ return tTileEntity.drain(aSide, aFluid, doDrain);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if ((this.getBaseMetaTileEntity()
+ .isServerSide())
+ && (this.getBaseMetaTileEntity()
+ .isAllowedToWork())) {
+ // Set owner
+ if (PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName())
+ != null) {
+ if (this.mOwner == null) {
+ this.mOwner = PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName());
+ }
+ }
+ final GT_MetaTileEntity_TesseractGenerator tTileEntity = this.getTesseract(this.mFrequency, true);
+ if (tTileEntity != null) {
+ tTileEntity.addEnergyConsumption(this);
+ if ((!this.mDidWork) && (this.getTesseract(this.mFrequency, false) != null)) {
+ this.mDidWork = true;
+ this.getBaseMetaTileEntity()
+ .issueBlockUpdate();
+ this.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(128, false);
+ }
+ } else if (this.mDidWork == true) {
+ this.mDidWork = false;
+ this.getBaseMetaTileEntity()
+ .issueBlockUpdate();
+ }
+ }
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Accesses Tesseract Generators remotely",
+ "Connect with pipes to extract items or fluids",
+ "Outputs from the back face",
+ "Consumes " + TESSERACT_ENERGY_COST + "EU/t for same dimension transfers",
+ "Consumes " + TESSERACT_ENERGY_COST_DIMENSIONAL + "EU/t for cross dimensional transfers",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ return new ITexture[0][0][0];
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return side == facing
+ ? new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Dimensional),
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_Frequency) }
+ : new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Dimensional),
+ new GT_RenderedTexture(Textures.BlockIcons.VOID) };
+ }
+
+ // To-Do?
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ if (this.getBaseMetaTileEntity()
+ .getOwnerName() != null
+ && !this.getBaseMetaTileEntity()
+ .getOwnerName()
+ .equals("")) {
+ this.mOwner = PlayerUtils.getPlayersUUIDByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName());
+ }
+ super.onCreated(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ public void onRemoval() {
+ try {
+ CORE.sTesseractTerminalOwnershipMap.get(mOwner)
+ .remove(this.mFrequency);
+ } catch (Throwable t) {}
+ super.onRemoval();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_Base.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_Base.java
new file mode 100644
index 0000000000..b27c1a759a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_Base.java
@@ -0,0 +1,333 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntityFurnace;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidTankInfo;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.common.tileentities.boilers.GT_MetaTileEntity_Boiler;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+
+public class GT_MetaTileEntity_Boiler_Base extends GT_MetaTileEntity_Boiler {
+
+ private final int steamPerSecond;
+ private final int tier;
+
+ public GT_MetaTileEntity_Boiler_Base(int aID, String aNameRegional, int tier) {
+ super(
+ aID,
+ "electricboiler." + tier + ".tier.single",
+ aNameRegional,
+ "Produces " + (CORE.ConfigSwitches.boilerSteamPerSecond * tier) + "L of Steam per second");
+ this.steamPerSecond = (CORE.ConfigSwitches.boilerSteamPerSecond * tier);
+ this.tier = tier;
+ }
+
+ public GT_MetaTileEntity_Boiler_Base(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ this.steamPerSecond = (CORE.ConfigSwitches.boilerSteamPerSecond * aTier);
+ this.tier = aTier;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Produces " + getPollution() + " pollution/sec",
+ "Consumes fuel only when temperature is less than 100C",
+ "Fuel with burn time greater than 500 is more efficient.",
+ "Doesn't explode if there's no water",
+ CORE.GT_Tooltip.get());
+ }
+
+ public ITexture getOverlayIcon() {
+ return new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ protected GT_RenderedTexture getCasingTexture() {
+ if (this.tier == 1) {
+ return new GT_RenderedTexture(Textures.BlockIcons.MACHINE_LV_SIDE);
+ } else if (this.tier == 2) {
+ return new GT_RenderedTexture(Textures.BlockIcons.MACHINE_MV_SIDE);
+ } else {
+ return new GT_RenderedTexture(Textures.BlockIcons.MACHINE_HV_SIDE);
+ }
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.tier][aColor + 1], this.getCasingTexture() };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.tier][aColor + 1], this.getCasingTexture() };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return this.getFront(aColor);
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return this.getBottom(aColor);
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return this.getTop(aColor);
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return this.getSides(aColor);
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection side) {
+ return side.offsetY == 0;
+ }
+
+ // Please find out what I do.
+ // I do stuff within the GUI.
+ // this.mTemperature = Math.min(54, Math.max(0, this.mTemperature * 54 / (((GT_MetaTileEntity_Boiler)
+ // this.mTileEntity.getMetaTileEntity()).maxProgresstime() - 10)));
+ @Override
+ public int maxProgresstime() {
+ return 1000 + (250 * tier);
+ }
+
+ @Override
+ public boolean isElectric() {
+ return false;
+ }
+
+ @Override
+ public int getCapacity() {
+ return (16000 + (16000 * tier));
+ }
+
+ // This type of machine can have different water and steam capacities.
+ @Override
+ public int getSteamCapacity() {
+ return 2 * getCapacity();
+ }
+
+ @Override
+ protected int getProductionPerSecond() {
+ return steamPerSecond;
+ }
+
+ @Override
+ protected int getMaxTemperature() {
+ return maxProgresstime();
+ }
+
+ @Override
+ protected int getEnergyConsumption() {
+ return 2;
+ }
+
+ @Override
+ protected int getCooldownInterval() {
+ return 40;
+ }
+
+ @Override
+ protected int getHeatUpRate() {
+ return 10;
+ }
+
+ @Override
+ protected void updateFuel(IGregTechTileEntity tile, long ticks) {
+ ItemStack fuelStack = this.mInventory[2];
+ if (fuelStack == null) return;
+
+ int burnTime = getBurnTime(fuelStack);
+ if (burnTime > 0 && this.mTemperature <= 101) {
+ consumeFuel(tile, fuelStack, burnTime);
+ }
+ }
+
+ @Override
+ // Since this type of machine can have different water and steam capacities, we need to override getTankInfo() to
+ // support returning those different capacities.
+ public FluidTankInfo[] getTankInfo(ForgeDirection aSide) {
+ return new FluidTankInfo[] { new FluidTankInfo(this.mFluid, getCapacity()),
+ new FluidTankInfo(this.mSteam, getSteamCapacity()) };
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return aIndex == 1 || aIndex == 3;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return aIndex == 2;
+ }
+
+ @Override
+ protected int getPollution() {
+ return (int) (CORE.ConfigSwitches.basePollutionPerSecondBoiler
+ * CORE.ConfigSwitches.pollutionReleasedByTierBoiler[this.tier]);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boiler_Base(this.mName, tier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ protected void onDangerousWaterLack(IGregTechTileEntity tile, long ticks) {
+ // Smart boilers don't explode!
+ }
+
+ /**
+ * Returns burn time if the stack is a valid fuel, otherwise return 0.
+ */
+ private static int getBurnTime(ItemStack stack) {
+ int burnTime = GameRegistry.getFuelValue(stack);
+ if (burnTime <= 0) {
+ burnTime = TileEntityFurnace.getItemBurnTime(stack);
+ }
+
+ return burnTime;
+ }
+
+ public void consumeFuel(IGregTechTileEntity tile, ItemStack fuel, int burnTime) {
+ this.mProcessingEnergy += burnTime / 10;
+ this.mTemperature += burnTime / 500; // will add bonus temperature points if the burn time is pretty high
+
+ tile.decrStackSize(2, 1);
+ if (tile.getRandomNumber(3) == 0) {
+ if (fuel.getDisplayName()
+ .toLowerCase()
+ .contains("charcoal")
+ || fuel.getDisplayName()
+ .toLowerCase()
+ .contains("coke")) {
+ tile.addStackToSlot(3, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Ash, 1L));
+ } else {
+ tile.addStackToSlot(3, GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L));
+ }
+ }
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCover) {
+ if (side != this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ return true;
+ }
+ return super.allowCoverOnSide(side, aCover);
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return GUITextureSet.DEFAULT;
+ }
+
+ @Override
+ protected IDrawable[] getFuelSlotBackground() {
+ return new IDrawable[] { getGUITextureSet().getItemSlot(), GTPP_UITextures.OVERLAY_SLOT_COAL };
+ }
+
+ @Override
+ protected IDrawable[] getAshSlotBackground() {
+ return new IDrawable[] { getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_DUST };
+ }
+
+ @Override
+ public int getTitleColor() {
+ return COLOR_TITLE.get();
+ }
+
+ @Override
+ protected IDrawable getOverlaySlotIn() {
+ return GT_UITextures.OVERLAY_SLOT_IN;
+ }
+
+ @Override
+ protected IDrawable getOverlaySlotOut() {
+ return GT_UITextures.OVERLAY_SLOT_OUT;
+ }
+
+ @Override
+ protected IDrawable getOverlaySlotCanister() {
+ return GTPP_UITextures.OVERLAY_SLOT_CANISTER_DARK;
+ }
+
+ @Override
+ protected UITexture getProgressbarEmpty() {
+ return GTPP_UITextures.PROGRESSBAR_BOILER_EMPTY;
+ }
+
+ @Override
+ protected UITexture getProgressbarFuel() {
+ return GTPP_UITextures.PROGRESSBAR_FUEL;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_HV.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_HV.java
new file mode 100644
index 0000000000..e77915aa01
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_HV.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Boiler_HV extends GT_MetaTileEntity_Boiler_Base {
+
+ public GT_MetaTileEntity_Boiler_HV(int aID, String aNameRegional, int aBoilerTier) {
+ super(aID, aNameRegional, aBoilerTier);
+ }
+
+ public GT_MetaTileEntity_Boiler_HV(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boiler_HV(this.mName, 3, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ protected GT_RenderedTexture getCasingTexture() {
+ return new GT_RenderedTexture(Textures.BlockIcons.MACHINE_HV_SIDE);
+ }
+
+ @Override
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT) };
+ }
+
+ @Override
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Material_Talonite) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(final byte aColor) {
+ return getTop(aColor);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_LV.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_LV.java
new file mode 100644
index 0000000000..23abfe1e3f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_LV.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Boiler_LV extends GT_MetaTileEntity_Boiler_Base {
+
+ public GT_MetaTileEntity_Boiler_LV(int aID, String aNameRegional, int aBoilerTier) {
+ super(aID, aNameRegional, aBoilerTier);
+ }
+
+ public GT_MetaTileEntity_Boiler_LV(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boiler_LV(this.mName, 1, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ protected GT_RenderedTexture getCasingTexture() {
+ return new GT_RenderedTexture(Textures.BlockIcons.MACHINE_LV_SIDE);
+ }
+
+ @Override
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT) };
+ }
+
+ @Override
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Material_Potin) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(final byte aColor) {
+ return getTop(aColor);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_MV.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_MV.java
new file mode 100644
index 0000000000..379f67b55d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_Boiler_MV.java
@@ -0,0 +1,52 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MetaTileEntity_Boiler_MV extends GT_MetaTileEntity_Boiler_Base {
+
+ public GT_MetaTileEntity_Boiler_MV(int aID, String aNameRegional, int aBoilerTier) {
+ super(aID, aNameRegional, aBoilerTier);
+ }
+
+ public GT_MetaTileEntity_Boiler_MV(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boiler_MV(this.mName, 2, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ protected GT_RenderedTexture getCasingTexture() {
+ return new GT_RenderedTexture(Textures.BlockIcons.MACHINE_MV_SIDE);
+ }
+
+ @Override
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT) };
+ }
+
+ @Override
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Material_Tumbaga) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_FRONT_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(final byte aColor) {
+ return getTop(aColor);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_SemiFluidGenerator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_SemiFluidGenerator.java
new file mode 100644
index 0000000000..993b0e9035
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GT_MetaTileEntity_SemiFluidGenerator.java
@@ -0,0 +1,173 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_SemiFluidGenerator extends GT_MetaTileEntity_BasicGenerator {
+
+ public int mEfficiency;
+
+ public GT_MetaTileEntity_SemiFluidGenerator(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, "Requires semi-fluid Fuel", new ITexture[0]);
+ onConfigLoad();
+ }
+
+ public GT_MetaTileEntity_SemiFluidGenerator(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ onConfigLoad();
+ }
+
+ @Override
+ public int getPollution() {
+ return (int) (CORE.ConfigSwitches.basePollutionPerSecondSemiFluidGenerator
+ * CORE.ConfigSwitches.pollutionReleasedByTierSemiFluidGenerator[this.mTier]);
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile.get(
+ ConfigCategories.machineconfig,
+ "SemiFluidGenerator.efficiency.tier." + this.mTier,
+ 100 - (this.mTier * 5));
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_SemiFluidGenerator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ // Logger.WARNING("Fuel Count: "+Gregtech_Recipe_Map.sSemiFluidLiquidFuels.mRecipeList.size());
+ return GTPPRecipeMaps.semiFluidFuels;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Produces " + (this.getPollution()) + " pollution/sec",
+ "Fuel Efficiency: " + this.getEfficiency() + "%",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public int getEfficiency() {
+ return this.mEfficiency;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return (side == getBaseMetaTileEntity().getFrontFacing());
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCover) {
+ if (side != this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ return true;
+ }
+ return super.allowCoverOnSide(side, aCover);
+ }
+
+ @Override
+ public int getFuelValue(ItemStack aStack) {
+ if ((GT_Utility.isStackInvalid(aStack)) || (getRecipeMap() == null)) {
+ Logger.WARNING("Bad Fuel?");
+ return 0;
+ }
+ int rValue = Math.max(GT_ModHandler.getFuelValue(aStack) * 6 / 5, super.getFuelValue(aStack));
+ if (ItemList.Fuel_Can_Plastic_Filled.isStackEqual(aStack, false, true)) {
+ rValue = Math.max(rValue, GameRegistry.getFuelValue(aStack) * 3);
+ }
+ Logger.WARNING("Good Fuel: " + rValue);
+ return rValue;
+ }
+
+ @Override
+ public ITexture[] getFront(byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_FRONT),
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBack(byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_TOP) };
+ }
+
+ @Override
+ public ITexture[] getBottom(byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM) };
+ }
+
+ @Override
+ public ITexture[] getTop(byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_SIDE) };
+ }
+
+ @Override
+ public ITexture[] getSides(byte aColor) {
+ return new ITexture[] { super.getSides(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_TOP) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_FRONT_ACTIVE),
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBackActive(byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_TOP_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_SIDE_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(byte aColor) {
+ return new ITexture[] { super.getSidesActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_TOP_ACTIVE) };
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityGeothermalGenerator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityGeothermalGenerator.java
new file mode 100644
index 0000000000..e1f1c8a2e6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityGeothermalGenerator.java
@@ -0,0 +1,176 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntityGeothermalGenerator extends GT_MetaTileEntity_BasicGenerator {
+
+ public int mEfficiency;
+
+ public GregtechMetaTileEntityGeothermalGenerator(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier, "Requires Pahoehoe Lava or Normal Lava as Fuel", new ITexture[0]);
+ this.onConfigLoad();
+ }
+
+ public GregtechMetaTileEntityGeothermalGenerator(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ this.onConfigLoad();
+ }
+
+ @Override
+ public String[] getDescription() {
+ String aPollution = "Causes " + this.getPollution() + " Pollution per second";
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Generates power at " + this.getEfficiency() + "% Efficiency per tick",
+ aPollution,
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public int getCapacity() {
+ // return MathUtils.roundToClosestMultiple(32000*(this.mTier/2), 25000);
+ return 5000 * this.mTier;
+ }
+
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile.get(
+ ConfigCategories.machineconfig,
+ "ThermalGenerator.efficiency.tier." + this.mTier,
+ (100 - (this.mTier * 7)));
+ }
+
+ @Override
+ public int getEfficiency() {
+ return this.mEfficiency;
+ }
+
+ @Override
+ public int getFuelValue(final ItemStack aStack) {
+ int rValue = Math.max((GT_ModHandler.getFuelValue(aStack) * 6) / 5, super.getFuelValue(aStack));
+ if (ItemList.Fuel_Can_Plastic_Filled.isStackEqual(aStack, false, true)) {
+ rValue = Math.max(rValue, GameRegistry.getFuelValue(aStack) * 3);
+ }
+ return rValue;
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntityGeothermalGenerator(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_SIDE),
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_BACK),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Diesel_Vertical) };
+ }
+
+ @Override
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM) };
+ }
+
+ @Override
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_SIDE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER) };
+ }
+
+ @Override
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { super.getSides(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_LAVA_FRONT) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_SIDE_ACTIVE),
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_BACK_ACTIVE),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Diesel_Vertical_Active) };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.DIESEL_GENERATOR_SIDE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { super.getSidesActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.BOILER_LAVA_FRONT_ACTIVE) };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.hotFuels;
+ }
+
+ @Override
+ public int getPollution() {
+ return (int) (CORE.ConfigSwitches.basePollutionPerSecondGeothermalGenerator
+ * CORE.ConfigSwitches.pollutionReleasedByTierGeothermalGenerator[mTier]);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityRocketFuelGenerator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityRocketFuelGenerator.java
new file mode 100644
index 0000000000..45d4177709
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntityRocketFuelGenerator.java
@@ -0,0 +1,156 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.generators.GregtechRocketFuelGeneratorBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntityRocketFuelGenerator extends GregtechRocketFuelGeneratorBase {
+
+ public int mEfficiency;
+
+ public GregtechMetaTileEntityRocketFuelGenerator(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(aID, aName, aNameRegional, aTier, "Requires GT++ Rocket Fuels", new ITexture[0]);
+ this.onConfigLoad();
+ }
+
+ public GregtechMetaTileEntityRocketFuelGenerator(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ this.onConfigLoad();
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntityRocketFuelGenerator(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.rocketFuels;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 32000;
+ }
+
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile.get(
+ ConfigCategories.machineconfig,
+ "RocketEngine.efficiency.tier." + this.mTier,
+ 80 - (10 * (this.mTier - 4)));
+ }
+
+ @Override
+ public int getEfficiency() {
+ int eff = 80 - (10 * (this.mTier - 4));
+ return eff;
+ }
+
+ @Override
+ public int getFuelValue(final ItemStack aStack) {
+ int rValue = Math.max((GT_ModHandler.getFuelValue(aStack) * 6) / 5, super.getFuelValue(aStack));
+ if (ItemList.Fuel_Can_Plastic_Filled.isStackEqual(aStack, false, true)) {
+ rValue = Math.max(rValue, GameRegistry.getFuelValue(aStack) * 3);
+ }
+ return rValue;
+ }
+
+ private GT_RenderedTexture getCasingTexture() {
+ if (this.mTier <= 4) {
+ return new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top);
+ } else if (this.mTier == 5) {
+
+ return new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Advanced);
+ } else {
+
+ return new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Ultra);
+ }
+ // return new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top);
+ }
+
+ @Override
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0], this.getCasingTexture(),
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Vent) };
+ }
+
+ @Override
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ @Override
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Redstone_Off) };
+ }
+
+ @Override
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { super.getSides(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Diesel_Horizontal) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0], this.getCasingTexture(),
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Vent_Fast) };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Redstone_On) };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { super.getSidesActive(aColor)[0], this.getCasingTexture(),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Diesel_Horizontal_Active) };
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntity_RTG.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntity_RTG.java
new file mode 100644
index 0000000000..32cf3a92cc
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/GregtechMetaTileEntity_RTG.java
@@ -0,0 +1,379 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class GregtechMetaTileEntity_RTG extends GT_MetaTileEntity_BasicGenerator {
+
+ public int mEfficiency;
+ private long mTicksToBurnFor;
+ private int mVoltage = 0;
+ private GT_Recipe mCurrentRecipe;
+ private int mDaysRemaining = 0;
+ private int mDayTick = 0;
+ private byte mNewTier = 0;
+
+ public int removeDayOfTime() {
+ if (this.mDaysRemaining > 0) {
+ return this.mDaysRemaining--;
+ }
+ return this.mDaysRemaining;
+ }
+
+ // Generates fuel value based on MC days
+ public static int convertDaysToTicks(float days) {
+ int value = 0;
+ value = MathUtils.roundToClosestInt(20 * 86400 * days);
+ return value;
+ }
+
+ public static long getTotalEUGenerated(int ticks, int voltage) {
+ return ticks * voltage;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setLong("mTicksToBurnFor", this.mTicksToBurnFor);
+ aNBT.setInteger("mVoltage", this.mVoltage);
+ aNBT.setInteger("mDaysRemaining", this.mDaysRemaining);
+ aNBT.setInteger("mDayTick", this.mDayTick);
+ aNBT.setByte("mNewTier", this.mNewTier);
+
+ if (this.mCurrentRecipe != null) {
+ final NBTTagList list = new NBTTagList();
+ final ItemStack stack = this.mCurrentRecipe.mInputs[0];
+ if (stack != null) {
+ final NBTTagCompound data = new NBTTagCompound();
+ stack.writeToNBT(data);
+ data.setInteger("mSlot", 0);
+ list.appendTag(data);
+ }
+ aNBT.setTag("mRecipeItem", list);
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mTicksToBurnFor = aNBT.getLong("mTicksToBurnFor");
+ this.mVoltage = aNBT.getInteger("mVoltage");
+ this.mDaysRemaining = aNBT.getInteger("mDaysRemaining");
+ this.mDayTick = aNBT.getInteger("mDayTick");
+ this.mNewTier = aNBT.getByte("mNewTier");
+
+ try {
+ ReflectionUtils.setByte(this, "mTier", this.mNewTier);
+ } catch (Exception e) {
+ if (this.getBaseMetaTileEntity() != null) {
+ IGregTechTileEntity thisTile = this.getBaseMetaTileEntity();
+ if (thisTile.isAllowedToWork() || thisTile.isActive()) {
+ thisTile.setActive(false);
+ }
+ }
+ }
+
+ final NBTTagList list = aNBT.getTagList("mRecipeItem", 10);
+ final NBTTagCompound data = list.getCompoundTagAt(0);
+ ItemStack lastUsedFuel = ItemStack.loadItemStackFromNBT(data);
+ if (lastUsedFuel != null) {
+ this.mCurrentRecipe = getRecipeMap().findRecipe(
+ getBaseMetaTileEntity(),
+ false,
+ 9223372036854775807L,
+ null,
+ new ItemStack[] { lastUsedFuel });
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (this.mDayTick < 24000) {
+ this.mDayTick++;
+ } else if (this.mDayTick >= 24000) {
+ this.mDayTick = 0;
+ this.mDaysRemaining = this.removeDayOfTime();
+ }
+ }
+
+ if ((aBaseMetaTileEntity.isServerSide()) && (aBaseMetaTileEntity.isAllowedToWork()) && (aTick % 10L == 0L)) {
+ long tProducedEU = 0L;
+ if (this.mFluid == null) {
+ if (aBaseMetaTileEntity.getUniversalEnergyStored() < maxEUOutput() + getMinimumStoredEU()) {
+ this.mInventory[getStackDisplaySlot()] = null;
+ } else {
+ if (this.mInventory[getStackDisplaySlot()] == null)
+ this.mInventory[getStackDisplaySlot()] = new ItemStack(Blocks.fire, 1);
+ this.mInventory[getStackDisplaySlot()].setStackDisplayName(
+ "Generating: "
+ + GT_Utility.formatNumbers(
+ aBaseMetaTileEntity.getUniversalEnergyStored() - getMinimumStoredEU())
+ + " EU");
+ }
+ } else {
+ int tFuelValue = getFuelValue(this.mFluid);
+ int tConsumed = consumedFluidPerOperation(this.mFluid);
+ if ((tFuelValue > 0) && (tConsumed > 0) && (this.mFluid.amount > tConsumed)) {
+ long tFluidAmountToUse = Math.min(
+ this.mFluid.amount / tConsumed,
+ (maxEUStore() - aBaseMetaTileEntity.getUniversalEnergyStored()) / tFuelValue);
+ if ((tFluidAmountToUse > 0L)
+ && (aBaseMetaTileEntity.increaseStoredEnergyUnits(tFluidAmountToUse * tFuelValue, true))) {
+ tProducedEU = tFluidAmountToUse * tFuelValue;
+ FluidStack tmp260_257 = this.mFluid;
+ tmp260_257.amount = (int) (tmp260_257.amount - (tFluidAmountToUse * tConsumed));
+ }
+ }
+ }
+ if ((this.mInventory[getInputSlot()] != null)
+ && (aBaseMetaTileEntity.getUniversalEnergyStored() < maxEUOutput() * 20L + getMinimumStoredEU())
+ && (GT_Utility.getFluidForFilledItem(this.mInventory[getInputSlot()], true) == null)) {
+ int tFuelValue = getFuelValue(this.mInventory[getInputSlot()]);
+ if (tFuelValue > 0) {
+ ItemStack tEmptyContainer = getEmptyContainer(this.mInventory[getInputSlot()]);
+ if (aBaseMetaTileEntity.addStackToSlot(getOutputSlot(), tEmptyContainer)) {
+ aBaseMetaTileEntity.increaseStoredEnergyUnits(tFuelValue, true);
+ aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1);
+ tProducedEU = tFuelValue;
+ }
+ }
+ }
+ if ((tProducedEU > 0L) && (getPollution() > 0)) {
+ PollutionUtils
+ .addPollution(aBaseMetaTileEntity, (int) (tProducedEU * getPollution() / 500 * this.mTier + 1L));
+ }
+ }
+
+ if (aBaseMetaTileEntity.isServerSide()) aBaseMetaTileEntity.setActive(
+ (aBaseMetaTileEntity.isAllowedToWork())
+ && (aBaseMetaTileEntity.getUniversalEnergyStored() >= maxEUOutput() + getMinimumStoredEU()));
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Fuel is measured in minecraft days (Check with Scanner)",
+ "RTG changes output voltage depending on fuel",
+ "Generates power at " + GT_Utility.formatNumbers(this.getEfficiency()) + "% Efficiency per tick",
+ "Output Voltage: " + GT_Utility.formatNumbers(this.getOutputTier()) + " EU/t",
+ CORE.GT_Tooltip.get());
+ }
+
+ public GregtechMetaTileEntity_RTG(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, "Requires RTG Pellets", new ITexture[0]);
+ }
+
+ private byte getTier() {
+ int voltage = this.mVoltage;
+ if (voltage >= 512) {
+ return 4;
+ } else if (voltage >= 128) {
+ return 3;
+ } else if (voltage >= 32) {
+ return 2;
+ } else if (voltage >= 8) {
+ return 1;
+ }
+ return 0;
+ }
+
+ public GregtechMetaTileEntity_RTG(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return ((side.offsetY == 0) && (side != getBaseMetaTileEntity().getFrontFacing())
+ && (side != getBaseMetaTileEntity().getBackFacing()));
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_RTG(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.rtgFuels;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 0;
+ }
+
+ @Override
+ public int getEfficiency() {
+ return this.mEfficiency = 100;
+ }
+
+ @Override
+ public ITexture[] getFront(byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_MASSFAB) };
+ }
+
+ @Override
+ public ITexture[] getBack(byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP) };
+ }
+
+ @Override
+ public ITexture[] getBottom(byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP) };
+ }
+
+ @Override
+ public ITexture[] getTop(byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP),
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_FLUID_SIDE) };
+ }
+
+ @Override
+ public ITexture[] getSides(byte aColor) {
+ return new ITexture[] { gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS[this.mTier][(0)],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE),
+ gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[getTier()] };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_MASSFAB_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getBackActive(byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE),
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(byte aColor) {
+ return new ITexture[] { gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS[this.mTier][(0)],
+ new GT_RenderedTexture(Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE),
+ gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[getTier()] };
+ }
+
+ @Override
+ public int getPollution() {
+ return 0;
+ }
+
+ @Override
+ public int getFuelValue(ItemStack aStack) {
+ if ((GT_Utility.isStackInvalid(aStack)) || (getRecipeMap() == null)) return 0;
+ GT_Recipe tFuel = getRecipeMap()
+ .findRecipe(getBaseMetaTileEntity(), false, 9223372036854775807L, null, new ItemStack[] { aStack });
+ if (tFuel != null) {
+ this.mCurrentRecipe = tFuel;
+ int voltage = tFuel.mEUt;
+ this.mVoltage = voltage;
+ // this.mDaysRemaining = tFuel.mSpecialValue*365;
+
+ // Do some voodoo.
+ byte mTier2;
+ // mTier2 = ReflectionUtils.getField(this.getClass(), "mTier");
+ try {
+ if (ItemStack.areItemStacksEqual(tFuel.mInputs[0], GregtechItemList.Pellet_RTG_AM241.get(1))) {
+ mTier2 = 1;
+ } else if (ItemStack.areItemStacksEqual(tFuel.mInputs[0], GregtechItemList.Pellet_RTG_PO210.get(1))) {
+ mTier2 = 3;
+ } else if (ItemStack.areItemStacksEqual(tFuel.mInputs[0], GregtechItemList.Pellet_RTG_PU238.get(1))) {
+ mTier2 = 2;
+ } else if (ItemStack.areItemStacksEqual(tFuel.mInputs[0], GregtechItemList.Pellet_RTG_SR90.get(1))) {
+ mTier2 = 1;
+ } else {
+ mTier2 = 0;
+ }
+ ReflectionUtils.setByte(this, "mTier", mTier2);
+ this.mNewTier = mTier2;
+ } catch (Exception e) {
+ Logger.WARNING("Failed setting mTier.");
+ e.printStackTrace();
+ }
+
+ this.mTicksToBurnFor = getTotalEUGenerated(convertDaysToTicks(tFuel.mSpecialValue), voltage);
+ if (mTicksToBurnFor >= Integer.MAX_VALUE) {
+ mTicksToBurnFor = Integer.MAX_VALUE;
+ Logger.WARNING("Fuel went over Int limit, setting to MAX_VALUE.");
+ }
+ this.mDaysRemaining = MathUtils.roundToClosestInt(mTicksToBurnFor / 20 / 60 / 3);
+ Logger.WARNING("step | " + (int) (mTicksToBurnFor * getEfficiency() / 100L));
+ return (int) (mTicksToBurnFor * getEfficiency() / 100L);
+ }
+ Logger.WARNING("Not sure");
+ return 0;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return ((getBaseMetaTileEntity().isAllowedToWork()) ? this.mVoltage : 0L);
+ }
+
+ @Override
+ public long getOutputTier() {
+ if (this.mCurrentRecipe != null) {
+ return this.mVoltage = this.mCurrentRecipe.mEUt;
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { "RTG - Running at tier " + this.mTier, "Active: " + this.getBaseMetaTileEntity()
+ .isActive(), "Current Output: " + GT_Utility.formatNumbers(mVoltage) + " EU/t",
+ "Days of Fuel remaining: " + GT_Utility.formatNumbers(mTicksToBurnFor / 20 / 60 / 20),
+ "Hours of Fuel remaining: " + GT_Utility.formatNumbers(mTicksToBurnFor / 20 / 60 / 60),
+ "Ticks of " + this.mVoltage + "v remaining: " + mTicksToBurnFor,
+ this.mCurrentRecipe.mInputs[0].getDisplayName() + " x1" };
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_CombustionGenerator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_CombustionGenerator.java
new file mode 100644
index 0000000000..24770e9503
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_CombustionGenerator.java
@@ -0,0 +1,59 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators.ULV;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.common.tileentities.generators.GT_MetaTileEntity_DieselGenerator;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_ULV_CombustionGenerator extends GT_MetaTileEntity_DieselGenerator {
+
+ public GT_MetaTileEntity_ULV_CombustionGenerator(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_ULV_CombustionGenerator(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Produces " + (this.getPollution() * 20) + " pollution/sec",
+ "Fuel Efficiency: " + this.getEfficiency() + "%",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(getEUVar(), V[1] * 80L + getMinimumStoredEU());
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ULV_CombustionGenerator(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ @Override
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "DieselGenerator.efficiency.tier." + this.mTier, 95);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_SteamTurbine.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_SteamTurbine.java
new file mode 100644
index 0000000000..26429b1486
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/ULV/GT_MetaTileEntity_ULV_SteamTurbine.java
@@ -0,0 +1,42 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.generators.ULV;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.common.tileentities.generators.GT_MetaTileEntity_SteamTurbine;
+
+public class GT_MetaTileEntity_ULV_SteamTurbine extends GT_MetaTileEntity_SteamTurbine {
+
+ public GT_MetaTileEntity_ULV_SteamTurbine(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, 0);
+ }
+
+ public GT_MetaTileEntity_ULV_SteamTurbine(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, 0, aDescription, aTextures);
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(getEUVar(), V[1] * 80L + getMinimumStoredEU());
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ULV_SteamTurbine(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ @Override
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "SteamTurbine.efficiency.tier." + this.mTier, 6 + 1);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_CropHarvestor.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_CropHarvestor.java
new file mode 100644
index 0000000000..c592a68a40
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_CropHarvestor.java
@@ -0,0 +1,716 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+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.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizon.gtnhlib.util.map.ItemStackMap;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import ic2.api.crops.CropCard;
+import ic2.api.crops.ICropTile;
+import ic2.core.item.DamageHandler;
+
+public class GT_MetaTileEntity_CropHarvestor extends GT_MetaTileEntity_BasicTank {
+
+ private static final int SLOT_WEEDEX_1 = 1;
+ private static final int SLOT_WEEDEX_2 = 2;
+ private static final int SLOT_FERT_1 = 3;
+ private static final int SLOT_FERT_4 = 6;
+ private static final int SLOT_OUTPUT_START = 7;
+
+ public boolean mModeAlternative = false;
+ public boolean mHarvestEnabled = true;
+
+ public GT_MetaTileEntity_CropHarvestor(final int aID, final int aTier, final String aDescription) {
+ super(
+ aID,
+ "basicmachine.cropharvester.0" + aTier,
+ "Crop Manager (" + GT_Values.VN[aTier] + ")",
+ aTier,
+ 21,
+ aDescription);
+ }
+
+ public GT_MetaTileEntity_CropHarvestor(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 21, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return true;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return true;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 8;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return GT_Values.V[this.mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return GT_Values.V[this.mTier] * (this.mTier * GT_Values.V[this.mTier]);
+ }
+
+ @Override
+ public long maxEUInput() {
+ return GT_Values.V[this.mTier];
+ }
+
+ @Override
+ public int getCapacity() {
+ return 32000 * this.mTier;
+ }
+
+ @Override
+ public int getTankPressure() {
+ return -100;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_CropHarvestor(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 21;
+ }
+
+ private static int getRange(int aTier) {
+ return switch (aTier) {
+ case 1 -> 1;
+ case 2 -> 5;
+ case 3 -> 9;
+ case 4 -> 13;
+ case 5 -> 17;
+ case 6 -> 21;
+ case 7 -> 25;
+ case 8 -> 29;
+ case 9 -> 33;
+ default -> 0;
+ };
+ }
+
+ private HashSet<ICropTile> mCropCache = new HashSet<>();
+ private boolean mInvalidCache = false;
+
+ public boolean doesInventoryHaveSpace() {
+ for (int i = SLOT_OUTPUT_START; i < this.getSizeInventory(); i++) {
+ if (this.mInventory[i] == null || this.mInventory[i].stackSize < 64) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public long powerUsage() {
+ return this.maxEUInput() / 8;
+ }
+
+ public long powerUsageSecondary() {
+ return this.maxEUInput() / 32;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (!getBaseMetaTileEntity().isServerSide() || !getBaseMetaTileEntity().isAllowedToWork()
+ || (!getBaseMetaTileEntity().hasWorkJustBeenEnabled() && aTick % 100 != 0)) return;
+
+ if (this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored() < getMinimumStoredEU()) return;
+
+ int aTileX = this.getBaseMetaTileEntity()
+ .getXCoord();
+ int aTileY = this.getBaseMetaTileEntity()
+ .getXCoord();
+ int aTileZ = this.getBaseMetaTileEntity()
+ .getXCoord();
+
+ int aRadius = 10 + getRange(this.mTier);
+ int aSide = (aRadius - 1) / 2;
+ Map<ItemStack, Integer> aAllDrops = new ItemStackMap<>(true);
+
+ if (this.mCropCache.isEmpty() || aTick % 1200 == 0 || this.mInvalidCache) {
+ if (!this.mCropCache.isEmpty()) {
+ this.mCropCache.clear();
+ }
+ // Logger.INFO("Looking for crops.");
+ for (int y = -2; y <= 2; y++) {
+ for (int x = (-aSide); x <= aSide; x++) {
+ for (int z = (-aSide); z <= aSide; z++) {
+ TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntityOffset(x, y, z);
+ if (tTileEntity != null && tTileEntity instanceof ICropTile tCrop) {
+ this.mCropCache.add(tCrop);
+ }
+ }
+ }
+ }
+ }
+
+ // Process Cache
+ if (!doesInventoryHaveSpace()) return;
+
+ for (ICropTile tCrop : this.mCropCache) {
+ if (tCrop == null) {
+ this.mInvalidCache = true;
+ break;
+ }
+ CropCard aCrop = tCrop.getCrop();
+ if (aCrop == null) continue;
+
+ if (this.mModeAlternative) processSecondaryFunctions(tCrop);
+ if (!this.mHarvestEnabled) continue;
+
+ if (aCrop.canBeHarvested(tCrop) && tCrop.getSize() == aCrop.getOptimalHavestSize(tCrop)) {
+ if (!getBaseMetaTileEntity().decreaseStoredEnergyUnits(powerUsage(), true)) continue;
+ ItemStack[] aHarvest = tCrop.harvest_automated(true);
+ if (aHarvest == null) continue;
+
+ for (ItemStack aStack : aHarvest) {
+ if (!ItemUtils.checkForInvalidItems(aStack)) continue;
+ if (this.mTier * 5 > MathUtils.randInt(1, 100)) {
+ aStack.stackSize += Math.floor(tCrop.getGain() / 10);
+ Logger.INFO("Bonus output given for " + aCrop.displayName());
+ }
+ Logger.INFO("Harvested " + aCrop.displayName());
+ aAllDrops.merge(aStack, aStack.stackSize, Integer::sum);
+ }
+ }
+ }
+
+ if (aAllDrops.isEmpty()) return;
+
+ Logger.INFO("Handling " + aAllDrops.size() + " Harvests");
+ for (int i = SLOT_OUTPUT_START; i < this.getSizeInventory() && !aAllDrops.isEmpty(); i++) {
+ ItemStack invStack = mInventory[i];
+ if (invStack == null || GT_Utility.isStackInvalid(invStack) || invStack.stackSize == 0) {
+ Iterator<Entry<ItemStack, Integer>> iter = aAllDrops.entrySet()
+ .iterator();
+ if (!iter.hasNext()) return;
+ Entry<ItemStack, Integer> e = iter.next();
+ int toAdd = e.getValue();
+ int toAddThisSlot = Math.min(
+ toAdd,
+ e.getKey()
+ .getMaxStackSize());
+ getBaseMetaTileEntity().setInventorySlotContents(i, GT_Utility.copyAmount(toAddThisSlot, e.getKey()));
+ toAdd -= toAddThisSlot;
+ if (toAdd <= toAddThisSlot) {
+ iter.remove();
+ } else {
+ e.setValue(toAdd);
+ }
+ } else {
+ Integer toAddMaybeNull = aAllDrops.get(invStack);
+ if (toAddMaybeNull != null) {
+ int toAdd = toAddMaybeNull;
+ int space = Math.min(invStack.getMaxStackSize(), getInventoryStackLimit()) - invStack.stackSize;
+ if (toAdd <= space) {
+ getBaseMetaTileEntity().addStackToSlot(i, invStack, toAdd);
+ aAllDrops.remove(invStack);
+ } else {
+ getBaseMetaTileEntity().addStackToSlot(i, invStack, space);
+ aAllDrops.put(invStack, toAdd - space);
+ }
+ }
+ }
+ }
+ }
+
+ public boolean hasFertilizer() {
+ for (int i = SLOT_FERT_1; i <= SLOT_FERT_4; i++) {
+ if (this.mInventory[i] != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean consumeFertilizer(boolean aSimulate) {
+ if (hasFertilizer()) {
+ for (int i = SLOT_FERT_1; i <= SLOT_FERT_4; i++) {
+ if (this.mInventory[i] != null) {
+ consume(i, 1, aSimulate);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean hasWeedEX() {
+ for (int i = SLOT_WEEDEX_1; i <= SLOT_WEEDEX_2; i++) {
+ if (this.mInventory[i] != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean consumeWeedEX(boolean aSimulate) {
+ if (hasWeedEX()) {
+ for (int i = SLOT_WEEDEX_1; i <= SLOT_WEEDEX_2; i++) {
+ if (this.mInventory[i] != null) {
+ damage(i, 1, aSimulate);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public void processSecondaryFunctions(ICropTile aCrop) {
+ if (!this.mModeAlternative) {
+ return;
+ }
+ if (hasFertilizer() && consumeFertilizer(true)
+ && this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored() >= getMinimumStoredEU()
+ && getBaseMetaTileEntity().decreaseStoredEnergyUnits(powerUsageSecondary(), true)
+ && applyFertilizer(aCrop)) {
+ if (consumeFertilizer(false)) {
+ // Logger.INFO("Consumed Fert.");
+ }
+ }
+ if (this.getFluidAmount() > 0 && this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored() >= getMinimumStoredEU()
+ && getBaseMetaTileEntity().decreaseStoredEnergyUnits(powerUsageSecondary(), true)
+ && applyHydration(aCrop)) {
+ // Logger.INFO("Consumed Water.");
+ }
+ if (hasWeedEX() && consumeWeedEX(true)
+ && this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored() >= getMinimumStoredEU()
+ && getBaseMetaTileEntity().decreaseStoredEnergyUnits(powerUsageSecondary(), true)
+ && applyWeedEx(aCrop)) {
+ if (consumeWeedEX(false)) {
+ // Logger.INFO("Consumed Weed-EX.");
+ }
+ }
+ }
+
+ public boolean applyWeedEx(ICropTile aCrop) {
+ if (aCrop.getWeedExStorage() < 150) {
+ aCrop.setWeedExStorage(aCrop.getWeedExStorage() + 50);
+ boolean triggerDecline;
+ triggerDecline = aCrop.getWorld().rand.nextInt(3) == 0;
+ if (aCrop.getCrop() != null && aCrop.getCrop()
+ .isWeed(aCrop) && aCrop.getWeedExStorage() >= 75 && triggerDecline) {
+ switch (aCrop.getWorld().rand.nextInt(5)) {
+ case 0:
+ if (aCrop.getGrowth() > 0) {
+ aCrop.setGrowth((byte) (aCrop.getGrowth() - 1));
+ }
+ case 1:
+ if (aCrop.getGain() > 0) {
+ aCrop.setGain((byte) (aCrop.getGain() - 1));
+ }
+ default:
+ if (aCrop.getResistance() > 0) {
+ aCrop.setResistance((byte) (aCrop.getResistance() - 1));
+ }
+ }
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean applyFertilizer(ICropTile aCrop) {
+ if (aCrop.getNutrientStorage() >= 100) {
+ return false;
+ } else {
+ // Logger.INFO("Current Nutrient: "+aCrop.getNutrientStorage()+" for "+aCrop.getCrop().displayName());
+ aCrop.setNutrientStorage(aCrop.getNutrientStorage() + 100);
+ return true;
+ }
+ }
+
+ public boolean applyHydration(ICropTile aCrop) {
+ if (aCrop.getHydrationStorage() >= 200 || this.getFluidAmount() == 0) {
+ // Logger.INFO("Hydration Max");
+ return false;
+ } else {
+ int apply = 200 - aCrop.getHydrationStorage();
+ if (this.getFluidAmount() >= 0) {
+ int drain = 0;
+ if (this.getFluidAmount() >= apply) {
+ drain = apply;
+ } else {
+ drain = this.getFluidAmount();
+ }
+ this.mFluid.amount -= drain;
+ if (this.mFluid.amount <= 0) {
+ this.mFluid = null;
+ }
+ // Logger.INFO("Did Hydrate");
+ aCrop.setHydrationStorage(aCrop.getHydrationStorage() + drain);
+ return true;
+ } else {
+ // Logger.INFO("No water?");
+ return false;
+ }
+ }
+ }
+
+ public boolean consume(int aSlot, int amount, boolean simulate) {
+ ItemStack stack = this.mInventory[aSlot];
+ if (stack != null && stack.stackSize >= amount) {
+ int currentAmount = Math.min(amount, stack.stackSize);
+ amount -= currentAmount;
+ if (!simulate) {
+ if (stack.stackSize == currentAmount) {
+ this.mInventory[aSlot] = null;
+ } else {
+ stack.stackSize -= currentAmount;
+ }
+ } else {
+ return amount >= 0;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public ItemStack damage(int aSlot, int amount, boolean simulate) {
+ ItemStack ret = null;
+ int damageApplied = 0;
+ ItemStack stack = this.mInventory[aSlot];
+ Item item = stack.getItem();
+ if (stack != null && item.isDamageable()
+ && (ret == null || stack.getItem() == ret.getItem() && ItemStack.areItemStackTagsEqual(stack, ret))) {
+ if (simulate) {
+ stack = stack.copy();
+ }
+ int maxDamage = DamageHandler.getMaxDamage(stack);
+ while (amount > 0 && stack.stackSize > 0) {
+ int currentAmount = Math.min(amount, maxDamage - DamageHandler.getDamage(stack));
+ DamageHandler.damage(stack, currentAmount, null);
+ damageApplied += currentAmount;
+ amount -= currentAmount;
+ if (DamageHandler.getDamage(stack) >= maxDamage) {
+ --stack.stackSize;
+ DamageHandler.setDamage(stack, 0);
+ }
+
+ if (ret == null) {
+ ret = stack.copy();
+ }
+ }
+ if (stack.stackSize == 0 && !simulate) {
+ this.mInventory[aSlot] = null;
+ }
+ }
+
+ if (ret != null) {
+ int i = DamageHandler.getMaxDamage(ret);
+ ret.stackSize = damageApplied / i;
+ DamageHandler.setDamage(ret, damageApplied % i);
+ }
+ return ret;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return aStack != null && aIndex >= SLOT_OUTPUT_START && aIndex < this.getSizeInventory();
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (aStack != null) {
+ if (aStack.getItem()
+ .getUnlocalizedName()
+ .equals("ic2.itemFertilizer")) {
+ return aIndex >= SLOT_FERT_1 && aIndex <= SLOT_FERT_4;
+ } else if (aStack.getItem()
+ .getUnlocalizedName()
+ .equals("ic2.itemWeedEx")) {
+ return aIndex >= SLOT_WEEDEX_1 && aIndex <= SLOT_WEEDEX_2;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String[] getDescription() {
+ int aRadius = 10 + getRange(this.mTier);
+ int aSide = (aRadius - 1) / 2;
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "Secondary mode can Hydrate/Fertilize/Weed-EX",
+ "Consumes " + powerUsage() + "eu per harvest",
+ "Consumes " + powerUsageSecondary() + "eu per secondary operation",
+ "Can harvest 1 block level above and below itself",
+ "Radius: " + aSide + " blocks each side (" + aRadius + "x3x" + aRadius + ")",
+ "Has " + (this.mTier * 5) + "% chance for extra drops",
+ "Holds " + this.getCapacity() + "L of Water",
+ CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) {
+ return true;
+ }
+
+ /*
+ * @Override public int getTextureIndex(byte aSide, byte aFacing, boolean aActive, boolean aRedstone) { if (aSide ==
+ * aFacing) return 118+(aRedstone?8:0); if (GT_Utility.getOppositeSide(aSide) == aFacing) return
+ * 113+(aRedstone?8:0); int tIndex = 128+(aRedstone?8:0); switch (aFacing) { case 0: return tIndex+64; case 1:
+ * return tIndex+32; case 2: switch (aSide) { case 0: return tIndex+32; case 1: return tIndex+32; case 4: return
+ * tIndex+16; case 5: return tIndex+48; } case 3: switch (aSide) { case 0: return tIndex+64; case 1: return
+ * tIndex+64; case 4: return tIndex+48; case 5: return tIndex+16; } case 4: switch (aSide) { case 0: return
+ * tIndex+16; case 1: return tIndex+16; case 2: return tIndex+48; case 3: return tIndex+16; } case 5: switch (aSide)
+ * { case 0: return tIndex+48; case 1: return tIndex+48; case 2: return tIndex+16; case 3: return tIndex+48; } }
+ * return tIndex; }
+ */
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFront(i);
+ rTextures[6][i + 1] = this.getBack(i);
+ rTextures[7][i + 1] = this.getBottom(i);
+ rTextures[8][i + 1] = this.getTop(i);
+ rTextures[9][i + 1] = this.getSides(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == ForgeDirection.DOWN || side == ForgeDirection.UP) {
+ return this.mTextures[3][aColorIndex + 1];
+ } else {
+ return this.mTextures[4][aColorIndex + 1];
+ }
+ /*
+ * return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0 : aSide == GT_Utility.getOppositeSide(aFacing)
+ * ? 1 : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ */
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_CropHarvester_Cutter) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_CropHarvester_Cutter) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_CropHarvester_Boxes) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_CropHarvester_Boxes) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_CropHarvester_Cutter) };
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mModeAlternative", this.mModeAlternative);
+ aNBT.setBoolean("mHarvestEnabled", this.mHarvestEnabled);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mModeAlternative = aNBT.getBoolean("mModeAlternative");
+ if (aNBT.hasKey("mHarvestEnabled")) {
+ this.mHarvestEnabled = aNBT.getBoolean("mHarvestEnabled");
+ }
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new CycleButtonWidget().setToggle(() -> mModeAlternative, val -> mModeAlternative = val)
+ .setTexture(GTPP_UITextures.OVERLAY_BUTTON_HARVESTER_MODE)
+ .addTooltip(0, "Enable Hydration/Fertilizing/Weed-EX")
+ .addTooltip(1, "Disable Hydration/Fertilizing/Weed-EX")
+ .setBackground(GT_UITextures.BUTTON_STANDARD)
+ .setPos(47, 63)
+ .setSize(18, 18));
+ builder.widget(
+ new CycleButtonWidget().setToggle(() -> mHarvestEnabled, val -> mHarvestEnabled = val)
+ .setTexture(GTPP_UITextures.OVERLAY_BUTTON_HARVESTER_TOGGLE)
+ .addTooltip(0, "Enable Harvest")
+ .addTooltip(1, "Disable Harvest")
+ .setBackground(GT_UITextures.BUTTON_STANDARD)
+ .setPos(67, 63)
+ .setSize(18, 18));
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 2)
+ .startFromSlot(SLOT_WEEDEX_1)
+ .endAtSlot(SLOT_WEEDEX_2)
+ .applyForWidget(
+ widget -> widget.setFilter(
+ stack -> stack != null && stack.getItem()
+ .getUnlocalizedName()
+ .equals("ic2.itemWeedEx"))
+ .setBackground(getGUITextureSet().getItemSlot(), GTPP_UITextures.OVERLAY_SLOT_WEED_EX))
+ .build()
+ .setPos(7, 13))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 2)
+ .startFromSlot(SLOT_FERT_1)
+ .endAtSlot(SLOT_FERT_4)
+ .applyForWidget(
+ widget -> widget.setFilter(
+ stack -> stack != null && stack.getItem()
+ .getUnlocalizedName()
+ .equals("ic2.itemFertilizer"))
+ .setBackground(getGUITextureSet().getItemSlot(), GTPP_UITextures.OVERLAY_SLOT_FERTILIZER))
+ .build()
+ .setPos(7, 31))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 6)
+ .startFromSlot(SLOT_OUTPUT_START)
+ .endAtSlot(SLOT_OUTPUT_START + 6 * 3)
+ .canInsert(false)
+ .build()
+ .setPos(61, 7));
+ builder
+ .widget(
+ new ProgressBar()
+ .setTexture(GTPP_UITextures.PROGRESSBAR_BOILER_EMPTY, GT_UITextures.PROGRESSBAR_BOILER_WATER, 54)
+ .setDirection(ProgressBar.Direction.UP)
+ .setProgress(() -> (float) getFluidAmount() / getCapacity())
+ .setSynced(false, false)
+ .dynamicTooltip(
+ () -> Collections.singletonList("Water: " + getFluidAmount() + "L / " + getCapacity() + "L"))
+ .setPos(47, 7)
+ .setSize(10, 54))
+ .widget(new FakeSyncWidget.FluidStackSyncer(this::getDrainableStack, this::setDrainableStack));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaAtmosphericReconditioner.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaAtmosphericReconditioner.java
new file mode 100644
index 0000000000..9f2789b520
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaAtmosphericReconditioner.java
@@ -0,0 +1,893 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import java.util.Collections;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.general.ItemAirFilter;
+import gtPlusPlus.core.item.general.ItemBasicScrubberTurbine;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaAtmosphericReconditioner extends GT_MetaTileEntity_BasicMachine {
+
+ public int mPollutionReduction = 0;
+ protected int mBaseEff = 2500;
+ protected int mOptimalAirFlow = 0;
+ protected boolean mHasPollution = false;
+ protected int SLOT_ROTOR = 5;
+ protected int SLOT_FILTER = 6;
+ protected static boolean mPollutionEnabled = true;
+
+ protected boolean mSaveRotor = false;
+
+ public GregtechMetaAtmosphericReconditioner(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 2,
+ "Making sure you don't live in Gwalior - Uses 2A",
+ 3,
+ 0,
+ new ITexture[] { new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_SIDE_MASSFAB_ACTIVE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_SIDE_MASSFAB),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_MatterFab_Active),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_MatterFab),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Vent_Fast),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Vent),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB_ACTIVE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB) });
+ mPollutionEnabled = PollutionUtils.isPollutionEnabled();
+ }
+
+ public GregtechMetaAtmosphericReconditioner(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 2, aDescription, aTextures, 2, 0);
+ mPollutionEnabled = PollutionUtils.isPollutionEnabled();
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaAtmosphericReconditioner(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+
+ boolean highTier = this.mTier >= 7;
+
+ String[] A = ArrayUtils.addAll(
+ this.mDescriptionArray,
+ highTier ? "Will attempt to remove 1/4 pollution from 8 surrounding chunks" : "",
+ highTier ? "If these chunks are not loaded, they will be ignored" : "",
+ "Requires a turbine rotor and an Air Filter [T1/T2] to run.",
+ "The turbine rotor must be manually inserted/replaced",
+ "Can be configured with a soldering iron to change modes",
+ "Low Efficiency: Removes half pollution, Turbine takes 50% dmg",
+ "High Efficiency: Removes full pollution, Turbine takes 100% dmg",
+ "Turbine Rotor will not break in LE mode",
+ "Insert an equal tier Conveyor Module to enable automation");
+ if (!mPollutionEnabled) {
+ String[] B = new String[] { "===============================================",
+ "Pollution is disabled, scrubbers will now have a bonus use",
+ "They are now able to remove ALL lingering pollution as GT ignores it", "and it will linger forever!",
+ "===============================================", };
+ A = ArrayUtils.addAll(A, B);
+ }
+ return A;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mOptimalAirFlow", this.mOptimalAirFlow);
+ aNBT.setBoolean("mSaveRotor", mSaveRotor);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mOptimalAirFlow = aNBT.getInteger("mOptimalAirFlow");
+ this.mSaveRotor = aNBT.getBoolean("mSaveRotor");
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 2;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return V[mTier] * 2;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return V[mTier] * 256;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+
+ // Get Current Pollution Amount.
+ int mCurrentPollution = getCurrentChunkPollution();
+ boolean isIdle = true;
+
+ // Get Inventory Item
+ ItemStack stackRotor = this.mInventory[SLOT_ROTOR];
+ ItemStack stackFilter = this.mInventory[SLOT_FILTER];
+
+ // Power Drain
+ long drainEU = maxEUInput() * maxAmperesIn();
+ if (aBaseMetaTileEntity.isActive() && aBaseMetaTileEntity.getStoredEU() >= drainEU) {
+ if (aBaseMetaTileEntity.decreaseStoredEnergyUnits(drainEU, false)) {
+ isIdle = false;
+ } else {
+ aBaseMetaTileEntity.setActive(false);
+ this.sendSound((byte) -122);
+ }
+ } else if (!aBaseMetaTileEntity.isActive() && aBaseMetaTileEntity.getStoredEU() >= drainEU / 4) {
+ if (aBaseMetaTileEntity.decreaseStoredEnergyUnits((drainEU / 4), false)) {
+ isIdle = false;
+ } else {
+ aBaseMetaTileEntity.setActive(false);
+ this.sendSound((byte) -122);
+ }
+ } else {
+ aBaseMetaTileEntity.setActive(false);
+ this.sendSound((byte) -122);
+ }
+
+ // Only try once/sec.
+ if (!isIdle && aTick % 20L == 0L) {
+
+ for (int i = 0; i < this.mInventory.length; i++) {
+ ItemStack aSlotContent = this.mInventory[i];
+ if (aSlotContent != null) {
+ Logger.INFO("Found " + aSlotContent.getDisplayName() + " in slot " + i);
+ }
+ }
+
+ for (int i = 0; i < this.mInventory.length; i++) {
+ if (hasRotor(this.mInventory[i])) {
+ Logger.INFO("Found Rotor in slot " + i);
+ break;
+ }
+ }
+ for (int i = 0; i < this.mInventory.length; i++) {
+ if (hasAirFilter(this.mInventory[i])) {
+ Logger.INFO("Found Filter in slot " + i);
+ break;
+ }
+ }
+
+ // Check if machine can work.
+ if ((aBaseMetaTileEntity.isAllowedToWork())) {
+ Logger.INFO("Can work.");
+
+ // Enable machine animation/graphic
+ if (hasRotor(stackRotor) && hasAirFilter(stackFilter) && this.mHasPollution) {
+ if (!this.getBaseMetaTileEntity()
+ .isActive()) {
+ Logger.INFO("Set Active.");
+ aBaseMetaTileEntity.setActive(true);
+ }
+ } else if (!this.mHasPollution || mCurrentPollution <= 0
+ || stackRotor == null
+ || stackFilter == null
+ || !hasRotor(stackRotor)
+ || !hasAirFilter(stackFilter)) {
+ if (!this.getBaseMetaTileEntity()
+ .isActive()) {
+ Logger.INFO("Set Inactive.");
+ aBaseMetaTileEntity.setActive(false);
+ this.sendSound((byte) -122);
+ }
+ }
+
+ // If Active.
+ if (aBaseMetaTileEntity.isActive()) {
+ Logger.INFO("Doing something.");
+
+ // Do nothing if there is no pollution.
+ if (this.mHasPollution && mCurrentPollution > 0) {
+ Logger
+ .INFO("Has Pollution? " + mHasPollution + ", Current Pollution: " + mCurrentPollution);
+
+ // Only check every 30s.
+ if (!isIdle && aTick % (20L * 30) == 0L) {
+ mPollutionEnabled = PollutionUtils.isPollutionEnabled();
+ // Clear out pollution if it's disabled, because I am a nice gal.
+ if (!PollutionUtils.isPollutionEnabled()) {
+ PollutionUtils.nullifyPollution(this.getBaseMetaTileEntity());
+ }
+ }
+
+ // Use a Turbine
+ if (hasRotor(stackRotor) && hasAirFilter(stackFilter)) {
+ Logger.INFO("Found Turbine.");
+
+ mBaseEff = getBaseEfficiency(stackRotor);
+ mOptimalAirFlow = getOptimalAirFlow(stackRotor);
+
+ // Make sure we have a valid Turbine and Eff/Airflow
+ if (this.mBaseEff > 0 && this.mOptimalAirFlow > 0) {
+ // Utils.LOG_WARNING("Pollution Cleaner [5]");
+
+ // Log Debug information.
+ Logger.INFO("mBaseEff[1]:" + mBaseEff);
+ Logger.INFO("mOptimalAirFlow[1]:" + mOptimalAirFlow);
+
+ // Calculate The Voltage we are running
+ long tVoltage = drainEU;
+ byte tTier = (byte) Math.max(1, GT_Utility.getTier(tVoltage));
+
+ // Check Sides for Air,
+ // More air means more pollution processing.
+ int mAirSides = getFreeSpaces();
+
+ int reduction = 0;
+
+ // If no sides are free, how will you process the atmosphere?
+ if (mAirSides > 0) {
+ reduction += (((Math.max((tTier - 2), 1) * 2) * 50) * mAirSides); // Was
+ // originally
+ // *100
+ Logger.INFO("mPollutionReduction[1]:" + reduction);
+
+ // I stole this code
+ reduction = (MathUtils.safeInt((long) reduction * this.mBaseEff) / 100000)
+ * mAirSides
+ * Math.max((tTier - 2), 1);
+ Logger.INFO("reduction[2]:" + reduction);
+ reduction = MathUtils.safeInt(((long) reduction / 100) * this.mOptimalAirFlow);
+ Logger.INFO("reduction[3]:" + reduction);
+
+ mPollutionReduction = reduction;
+
+ // Set a temp to remove variable to aleviate duplicate code.
+ int toRemove = 0;
+
+ Logger.INFO("mCurrentPollution[4]:" + mCurrentPollution);
+ Logger.INFO("mCurrentPollution[5]:" + reduction);
+ if (reduction <= mCurrentPollution) {
+ // Clean some Air.
+ toRemove = reduction;
+ } else {
+ // Makes sure we don't get negative pollution.
+ toRemove = mCurrentPollution;
+ }
+
+ toRemove = toRemove / 2;
+ Logger.INFO("mCurrentPollution[6]:" + toRemove);
+
+ // We are good to clean
+ if (toRemove > 0) {
+ if (damageTurbineRotor() && damageAirFilter()) {
+ Logger.INFO("Removing " + toRemove + " pollution");
+ removePollution(mSaveRotor ? (toRemove / 2) : toRemove);
+ Logger.INFO("mNewPollution[4]:" + getCurrentChunkPollution());
+ } else {
+ Logger.INFO("Could not damage turbine rotor or Air Filter.");
+ aBaseMetaTileEntity.setActive(false);
+ }
+ } // End of pollution removal block.
+ } // End of valid air sides block.
+ } // End of valid toolstats block.
+ } // End of correct inventory item block.
+ else {
+ // Utils.LOG_WARNING("Wrong Tool metaitem Found.");
+ }
+ }
+ } else if (!aBaseMetaTileEntity.isActive()) {
+ return;
+ }
+ } // End of can work block.
+ else { // Disable Machine.
+ // aBaseMetaTileEntity.setActive(false);
+ }
+ } // End of 1/sec action block.
+ else {
+
+ if (hasRotor(stackRotor) && hasAirFilter(stackFilter)
+ && this.mHasPollution
+ && !isIdle
+ && aBaseMetaTileEntity.isAllowedToWork()) {
+ aBaseMetaTileEntity.setActive(true);
+ } else if (isIdle || !this.mHasPollution
+ || mCurrentPollution <= 0
+ || stackRotor == null
+ || stackFilter == null
+ || !hasRotor(stackRotor)
+ || !hasAirFilter(stackFilter)) {
+ aBaseMetaTileEntity.setActive(false);
+ }
+ }
+ if (this.getBaseMetaTileEntity()
+ .isActive()) {
+ if (MathUtils.randInt(0, 5) <= 2) {
+ this.sendSound((byte) -120);
+ }
+ }
+ } // End of is serverside block.
+ }
+
+ public int getCurrentChunkPollution() {
+ int mCurrentChunkPollution = 0;
+ if (this.mTier < 7) {
+ mCurrentChunkPollution = PollutionUtils.getPollution(getBaseMetaTileEntity());
+ } else {
+ AutoMap<Chunk> aSurrounding = new AutoMap<>();
+ World aWorld = this.getBaseMetaTileEntity()
+ .getWorld();
+ int xPos = this.getBaseMetaTileEntity()
+ .getXCoord();
+ int zPos = this.getBaseMetaTileEntity()
+ .getZCoord();
+ Chunk a1 = aWorld.getChunkFromBlockCoords(xPos - 32, zPos - 32);
+ Chunk a2 = aWorld.getChunkFromBlockCoords(xPos - 32, zPos);
+ Chunk a3 = aWorld.getChunkFromBlockCoords(xPos - 32, zPos + 32);
+ Chunk b1 = aWorld.getChunkFromBlockCoords(xPos, zPos - 32);
+ Chunk b2 = aWorld.getChunkFromBlockCoords(xPos, zPos);
+ Chunk b3 = aWorld.getChunkFromBlockCoords(xPos, zPos + 32);
+ Chunk c1 = aWorld.getChunkFromBlockCoords(xPos + 32, zPos - 32);
+ Chunk c2 = aWorld.getChunkFromBlockCoords(xPos + 32, zPos);
+ Chunk c3 = aWorld.getChunkFromBlockCoords(xPos + 32, zPos + 32);
+ aSurrounding.put(a1);
+ aSurrounding.put(a2);
+ aSurrounding.put(a3);
+ aSurrounding.put(b1);
+ aSurrounding.put(b2);
+ aSurrounding.put(b3);
+ aSurrounding.put(c1);
+ aSurrounding.put(c2);
+ aSurrounding.put(c3);
+ for (Chunk r : aSurrounding) {
+ mCurrentChunkPollution += getPollutionInChunk(r);
+ }
+ }
+ if (mCurrentChunkPollution > 0) {
+ mHasPollution = true;
+ } else {
+ mHasPollution = false;
+ }
+ return mCurrentChunkPollution;
+ }
+
+ public int getPollutionInChunk(Chunk aChunk) {
+ int mCurrentChunkPollution = PollutionUtils.getPollution(aChunk);
+ if (mCurrentChunkPollution > 0) {
+ mHasPollution = true;
+ } else {
+ mHasPollution = false;
+ }
+ return mCurrentChunkPollution;
+ }
+
+ public boolean hasRotor(ItemStack rotorStack) {
+ if (rotorStack != null) {
+ if (rotorStack.getItem() instanceof ItemBasicScrubberTurbine) {
+ // Logger.INFO("Found Basic Turbine Rotor.");
+ return true;
+ } else if (rotorStack.getItem() instanceof GT_MetaGenerated_Tool && rotorStack.getItemDamage() >= 170
+ && rotorStack.getItemDamage() <= 179) {
+ // Logger.INFO("Found Turbine Rotor.");
+ return true;
+ } else {
+ // Logger.INFO("Found: "+rotorStack.getDisplayName()+":"+rotorStack.getItemDamage());
+ }
+ }
+ // Logger.INFO("Found No Turbine Rotor.");
+ return false;
+ }
+
+ public boolean damageTurbineRotor() {
+ try {
+
+ boolean creativeRotor = false;
+ ItemStack rotorStack = this.mInventory[SLOT_ROTOR];
+ if (rotorStack == null) {
+ return false;
+ } else if (rotorStack.getItem() instanceof ItemBasicScrubberTurbine) {
+ long currentUse = ItemBasicScrubberTurbine.getFilterDamage(rotorStack);
+ // Remove broken Filter
+ if (rotorStack.getItemDamage() == 0 && currentUse >= 2000 - 10) {
+ Logger.INFO("Depleting ItemBasicScrubberTurbine T1");
+ this.mInventory[this.SLOT_FILTER] = null;
+ return false;
+ } else if (rotorStack.getItemDamage() == 1 && currentUse >= 4000 - 10) {
+ Logger.INFO("Depleting ItemBasicScrubberTurbine T2");
+ this.mInventory[this.SLOT_FILTER] = null;
+ return false;
+ } else if (rotorStack.getItemDamage() == 2 && currentUse >= 6000 - 10) {
+ Logger.INFO("Depleting ItemBasicScrubberTurbine T3");
+ this.mInventory[this.SLOT_FILTER] = null;
+ return false;
+ } else {
+ // Do Damage
+ Logger.INFO("Damaging ItemBasicScrubberTurbine");
+ ItemBasicScrubberTurbine.setFilterDamage(rotorStack, currentUse + 10);
+ Logger.INFO("Rotor Damage: " + currentUse);
+ return true;
+ }
+ } else if (rotorStack.getItem() instanceof GT_MetaGenerated_Tool_01) {
+ Materials t1 = GT_MetaGenerated_Tool.getPrimaryMaterial(rotorStack);
+ Materials t2 = GT_MetaGenerated_Tool.getSecondaryMaterial(rotorStack);
+ if (t1 == Materials._NULL && t2 == Materials._NULL) {
+ Logger.INFO("Found creative rotor.");
+ creativeRotor = true;
+ }
+ } else {
+ Logger.INFO("Bad item in rotor slot.");
+ return false;
+ }
+
+ if (mInventory[SLOT_ROTOR].getItem() instanceof GT_MetaGenerated_Tool_01
+ && ((GT_MetaGenerated_Tool) mInventory[SLOT_ROTOR].getItem()).getToolStats(mInventory[SLOT_ROTOR])
+ .getSpeedMultiplier() > 0
+ && GT_MetaGenerated_Tool.getPrimaryMaterial(mInventory[SLOT_ROTOR]).mToolSpeed > 0) {
+
+ long damageValue = (long) Math
+ .floor(Math.abs(MathUtils.randFloat(1, 2) - MathUtils.randFloat(1, 3)) * (1 + 3 - 1) + 1);
+ double fDam = Math
+ .floor(Math.abs(MathUtils.randFloat(1f, 2f) - MathUtils.randFloat(1f, 2f)) * (1f + 2f - 1f) + 1f);
+ damageValue -= fDam;
+
+ // Logger.INFO("Trying to do "+damageValue+" damage to the rotor. ["+fDam+"]");
+ /*
+ * Materials M1 = GT_MetaGenerated_Tool.getPrimaryMaterial(this.mInventory[this.SLOT_ROTOR]); Materials
+ * M2 = GT_MetaGenerated_Tool.getSecondaryMaterial(this.mInventory[this.SLOT_ROTOR]);
+ * Logger.INFO("Trying to do "+damageValue+" damage to the rotor. [2]");
+ */
+
+ // Damage Rotor
+ // int rotorDurability = this.mInventory[this.SLOT_ROTOR].getItemDamage();
+ long rotorDamage = creativeRotor ? 0
+ : GT_MetaGenerated_Tool.getToolDamage(this.mInventory[this.SLOT_ROTOR]);
+ long rotorDurabilityMax = creativeRotor ? Integer.MAX_VALUE
+ : GT_MetaGenerated_Tool.getToolMaxDamage(this.mInventory[this.SLOT_ROTOR]);
+ long rotorDurability = (rotorDurabilityMax - rotorDamage);
+ Logger.INFO(
+ "Rotor Damage: " + rotorDamage
+ + " | Max Durability: "
+ + rotorDurabilityMax
+ + " | "
+ + " Remaining Durability: "
+ + rotorDurability);
+ if (rotorDurability >= damageValue) {
+
+ if (!mSaveRotor) {
+ Logger.INFO("Damaging Rotor.");
+
+ if (!creativeRotor) GT_ModHandler
+ .damageOrDechargeItem(this.mInventory[this.SLOT_ROTOR], (int) damageValue, 0, null);
+
+ long tempDur = GT_MetaGenerated_Tool.getToolDamage(this.mInventory[this.SLOT_ROTOR]);
+ if (tempDur < rotorDurabilityMax) {
+ return true;
+ } else {
+ rotorDurability = 0;
+ }
+ } else {
+ Logger.INFO("Damaging Rotor.");
+ if (rotorDurability > 1000) {
+ if (!creativeRotor) GT_ModHandler
+ .damageOrDechargeItem(this.mInventory[this.SLOT_ROTOR], (int) damageValue / 2, 0, null);
+ long tempDur = GT_MetaGenerated_Tool.getToolDamage(this.mInventory[this.SLOT_ROTOR]);
+ if (tempDur < rotorDurabilityMax) {
+ return true;
+ } else {
+ rotorDurability = 0;
+ }
+ }
+ }
+ }
+
+ if (rotorDurability <= 0 && !mSaveRotor && !creativeRotor) {
+ Logger.INFO("Destroying Rotor.");
+ this.mInventory[this.SLOT_ROTOR] = null;
+ return false;
+ } else if (rotorDurability <= 0 && mSaveRotor) {
+ Logger.INFO("Saving Rotor.");
+ return false;
+ }
+
+ } else {
+ Logger.INFO("Bad Rotor.");
+ return false;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ return false;
+ }
+
+ public int getFreeSpaces() {
+ int mAir = 0;
+ IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity();
+ if (aBaseMetaTileEntity.getAirOffset(1, 0, 0)) {
+ mAir++;
+ }
+ if (aBaseMetaTileEntity.getAirOffset(-1, 0, 0)) {
+ mAir++;
+ }
+ if (aBaseMetaTileEntity.getAirOffset(0, 0, 1)) {
+ mAir++;
+ }
+ if (aBaseMetaTileEntity.getAirOffset(0, 0, -1)) {
+ mAir++;
+ }
+ if (aBaseMetaTileEntity.getAirOffset(0, 1, 0)) {
+ mAir++;
+ }
+ if (aBaseMetaTileEntity.getAirOffset(0, -1, 0)) {
+ mAir++;
+ }
+ return mAir;
+ }
+
+ public boolean removePollution(int toRemove) {
+
+ if (this == null || this.getBaseMetaTileEntity() == null
+ || this.getBaseMetaTileEntity()
+ .getWorld() == null) {
+ return false;
+ }
+
+ if (this.mTier < 7) {
+ int startPollution = getCurrentChunkPollution();
+ Logger.INFO("Current Chunk Pollution: " + startPollution);
+ PollutionUtils.removePollution(this.getBaseMetaTileEntity(), toRemove);
+ int after = getCurrentChunkPollution();
+ Logger.INFO("Current Chunk Pollution: " + after);
+ return (after < startPollution);
+ } else {
+ int chunksWithRemoval = 0;
+ int totalRemoved = 0;
+ AutoMap<Chunk> aSurrounding = new AutoMap<>();
+ Chunk aThisChunk = this.getBaseMetaTileEntity()
+ .getWorld()
+ .getChunkFromBlockCoords(
+ this.getBaseMetaTileEntity()
+ .getXCoord(),
+ this.getBaseMetaTileEntity()
+ .getZCoord());
+ int mainChunkX = aThisChunk.xPosition;
+ int mainChunkZ = aThisChunk.zPosition;
+
+ World aWorld = this.getBaseMetaTileEntity()
+ .getWorld();
+ int xPos = this.getBaseMetaTileEntity()
+ .getXCoord();
+ int zPos = this.getBaseMetaTileEntity()
+ .getZCoord();
+
+ Chunk a1 = aWorld.getChunkFromBlockCoords(xPos - 32, zPos - 32);
+ Chunk a2 = aWorld.getChunkFromBlockCoords(xPos - 32, zPos);
+ Chunk a3 = aWorld.getChunkFromBlockCoords(xPos - 32, zPos + 32);
+ Chunk b1 = aWorld.getChunkFromBlockCoords(xPos, zPos - 32);
+ Chunk b2 = aWorld.getChunkFromBlockCoords(xPos, zPos);
+ Chunk b3 = aWorld.getChunkFromBlockCoords(xPos, zPos + 32);
+ Chunk c1 = aWorld.getChunkFromBlockCoords(xPos + 32, zPos - 32);
+ Chunk c2 = aWorld.getChunkFromBlockCoords(xPos + 32, zPos);
+ Chunk c3 = aWorld.getChunkFromBlockCoords(xPos + 32, zPos + 32);
+
+ aSurrounding.put(a1);
+ aSurrounding.put(a2);
+ aSurrounding.put(a3);
+ aSurrounding.put(b1);
+ aSurrounding.put(b2);
+ aSurrounding.put(b3);
+ aSurrounding.put(c1);
+ aSurrounding.put(c2);
+ aSurrounding.put(c3);
+
+ for (Chunk r : aSurrounding) {
+ if (!r.isChunkLoaded) {
+ continue;
+ }
+
+ int startPollution = getPollutionInChunk(r);
+ if (startPollution == 0) {
+ continue;
+ }
+
+ Logger.INFO(
+ "Trying to remove pollution from chunk " + r.xPosition
+ + ", "
+ + r.zPosition
+ + " | "
+ + startPollution);
+ int after = 0;
+ boolean isMainChunk = r.isAtLocation(mainChunkX, mainChunkZ);
+
+ int removal = Math.max(0, !isMainChunk ? (toRemove / 4) : toRemove);
+ if (removePollution(r, removal)) {
+ chunksWithRemoval++;
+ after = getPollutionInChunk(r);
+ } else {
+ after = 0;
+ }
+ if (startPollution - after > 0) {
+ totalRemoved += (startPollution - after);
+ }
+ Logger.INFO(
+ "Removed " + (startPollution - after)
+ + " pollution from chunk "
+ + r.xPosition
+ + ", "
+ + r.zPosition
+ + " | "
+ + after);
+ }
+ return totalRemoved > 0 && chunksWithRemoval > 0;
+ }
+ }
+
+ public boolean removePollution(Chunk aChunk, int toRemove) {
+ int before = getCurrentChunkPollution();
+ PollutionUtils.removePollution(aChunk, toRemove);
+ int after = getCurrentChunkPollution();
+ return (after < before);
+ }
+
+ public boolean hasAirFilter(ItemStack filter) {
+ if (filter == null) {
+ return false;
+ }
+ return filter.getItem() instanceof ItemAirFilter;
+ }
+
+ public boolean damageAirFilter() {
+ ItemStack filter = this.mInventory[this.SLOT_FILTER];
+ if (filter == null) {
+ return false;
+ }
+
+ boolean creativeRotor = false;
+ ItemStack rotorStack = this.mInventory[SLOT_ROTOR];
+ if (rotorStack != null) {
+ if (rotorStack.getItem() instanceof GT_MetaGenerated_Tool_01) {
+ Materials t1 = GT_MetaGenerated_Tool.getPrimaryMaterial(rotorStack);
+ Materials t2 = GT_MetaGenerated_Tool.getSecondaryMaterial(rotorStack);
+ if (t1 == Materials._NULL && t2 == Materials._NULL) {
+ creativeRotor = true;
+ }
+ }
+ }
+
+ if (creativeRotor) {
+ return true;
+ }
+
+ if (filter.getItem() instanceof ItemAirFilter) {
+
+ long currentUse = ItemAirFilter.getFilterDamage(filter);
+
+ // Remove broken Filter
+ if (filter.getItemDamage() == 0 && currentUse >= 50 - 1) {
+ this.mInventory[this.SLOT_FILTER] = null;
+ return false;
+ } else if (filter.getItemDamage() == 1 && currentUse >= 2500 - 1) {
+ this.mInventory[this.SLOT_FILTER] = null;
+ return false;
+ } else {
+ // Do Damage
+ ItemAirFilter.setFilterDamage(filter, currentUse + 1);
+ Logger.INFO("Filter Damage: " + currentUse);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ if (aIndex == SLOT_FILTER) {
+ if (aStack.getItem() instanceof ItemAirFilter) {
+ Logger.INFO("Inserting Air Filter into " + aIndex);
+ return true;
+ }
+ }
+ if (aIndex == SLOT_ROTOR) {
+ if (this.mInventory[7] != null) {
+ Logger.INFO("Found conveyor, can automate turbines. Inserting into " + aIndex);
+ if (aStack.getItem() instanceof ItemBasicScrubberTurbine) {
+ return true;
+ }
+ if (aStack.getItem() instanceof GT_MetaGenerated_Tool && aStack.getItemDamage() >= 170
+ && aStack.getItemDamage() <= 179) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ if (aIndex == -120) {
+ GT_Utility
+ .doSoundAtClient(SoundResource.IC2_TOOLS_BATTERY_USE, MathUtils.randInt(5, 50), 0.05F, aX, aY, aZ);
+ } else {
+ super.doSound((byte) 0, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public String[] getInfoData() {
+ AutoMap<String> aTooltipSuper = new AutoMap<>();
+ for (String s : super.getInfoData()) {
+ aTooltipSuper.put(s);
+ }
+ int mAirSides = getFreeSpaces();
+ int reduction = 0;
+
+ try {
+ long tVoltage = maxEUInput();
+ byte tTier = (byte) Math.max(1, GT_Utility.getTier(tVoltage));
+ reduction += (((Math.max((tTier - 2), 1) * 2) * 50) * mAirSides);
+ reduction = (MathUtils.safeInt((long) reduction * this.mBaseEff) / 100000) * mAirSides
+ * Math.max((tTier - 2), 1);
+ reduction = MathUtils.safeInt(((long) reduction / 100) * this.mOptimalAirFlow);
+
+ aTooltipSuper.put("Maximum pollution removed per second: " + reduction);
+ } catch (Throwable t) {
+ aTooltipSuper.put("Maximum pollution removed per second: " + mPollutionReduction);
+ }
+ aTooltipSuper.put("Air Sides: " + mAirSides);
+
+ String[] mBuiltOutput = new String[aTooltipSuper.size()];
+ int aIndex = 0;
+ for (String i : aTooltipSuper) {
+ mBuiltOutput[aIndex++] = i;
+ }
+
+ return mBuiltOutput;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) {
+ if (side.offsetY != 0) {
+ return false;
+ }
+ return super.allowCoverOnSide(side, aCoverID);
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return super.getTopFacingInactive(aColor);
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ aNBT.setInteger("mOptimalAirFlow", this.mOptimalAirFlow);
+ aNBT.setBoolean("mSaveRotor", mSaveRotor);
+ super.setItemNBT(aNBT);
+ }
+
+ private static ItemStack[] sGregTurbines;
+
+ public static ItemStack getTieredTurbine(int aTier) {
+ if (sGregTurbines == null) {
+ sGregTurbines = new ItemStack[3];
+ sGregTurbines[0] = GT_MetaGenerated_Tool.sInstances.get("gt.metatool.01")
+ .getToolWithStats(GT_MetaGenerated_Tool_01.TURBINE_SMALL, 1, Materials.Iron, Materials.Iron, null);
+ sGregTurbines[1] = GT_MetaGenerated_Tool.sInstances.get("gt.metatool.01")
+ .getToolWithStats(GT_MetaGenerated_Tool_01.TURBINE_SMALL, 1, Materials.Bronze, Materials.Bronze, null);
+ sGregTurbines[2] = GT_MetaGenerated_Tool.sInstances.get("gt.metatool.01")
+ .getToolWithStats(GT_MetaGenerated_Tool_01.TURBINE_SMALL, 1, Materials.Steel, Materials.Steel, null);
+ } else {
+ return sGregTurbines[aTier];
+ }
+
+ return null;
+ }
+
+ public int getBaseEfficiency(ItemStack aStackRotor) {
+ if (aStackRotor.getItem() instanceof ItemBasicScrubberTurbine) {
+ return getBaseEfficiency(getTieredTurbine(aStackRotor.getItemDamage()));
+ }
+ return (int) ((50.0F
+ + (10.0F * ((GT_MetaGenerated_Tool) aStackRotor.getItem()).getToolCombatDamage(aStackRotor))) * 100);
+ }
+
+ public int getOptimalAirFlow(ItemStack aStackRotor) {
+ if (aStackRotor.getItem() instanceof ItemBasicScrubberTurbine) {
+ return getOptimalAirFlow(getTieredTurbine(aStackRotor.getItemDamage()));
+ }
+ return (int) Math.max(
+ Float.MIN_NORMAL,
+ ((GT_MetaGenerated_Tool) aStackRotor.getItem()).getToolStats(aStackRotor)
+ .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(aStackRotor).mToolSpeed * 50);
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(new SlotWidget(inventoryHandler, SLOT_ROTOR).setFilter(stack -> {
+ if (stack.getItem() instanceof ItemBasicScrubberTurbine) {
+ return true;
+ }
+ return stack.getItem() instanceof GT_MetaGenerated_Tool && stack.getItemDamage() >= 170
+ && stack.getItemDamage() <= 179;
+ })
+ .setBackground(getGUITextureSet().getItemSlot(), GTPP_UITextures.OVERLAY_SLOT_TURBINE)
+ .setPos(52, 24))
+ .widget(
+ new SlotWidget(inventoryHandler, SLOT_FILTER)
+ .setFilter(stack -> stack.getItem() instanceof ItemAirFilter)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_RECYCLE)
+ .setPos(106, 24))
+ .widget(
+ new SlotWidget(inventoryHandler, 7)
+ .setFilter(stack -> GT_Utility.areStacksEqual(stack, CI.getConveyor(mTier, 1), true))
+ .setPos(124, 62));
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_INFORMATION)
+ .dynamicTooltip(() -> Collections.singletonList("Reduction: " + mPollutionReduction + "/s"))
+ .attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(() -> mPollutionReduction, val -> mPollutionReduction = val),
+ builder,
+ (widget, val) -> widget.notifyTooltipChange())
+ .setPos(163, 5)
+ .setSize(7, 18));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionCreator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionCreator.java
new file mode 100644
index 0000000000..d7b6b8fffd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionCreator.java
@@ -0,0 +1,458 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMetaTileEntity;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaPollutionCreator extends GregtechMetaTileEntity {
+
+ int mCurrentPollution;
+ int mAveragePollution;
+ int mAveragePollutionArray[] = new int[10];
+ private int mArrayPos = 0;
+ private int mTickTimer = 0;
+ private int mSecondTimer = 0;
+
+ public GregtechMetaPollutionCreator(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final String aDescription, final int aSlotCount) {
+ super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription);
+ }
+
+ public GregtechMetaPollutionCreator(final String aName, final int aTier, final String aDescription,
+ final ITexture[][][] aTextures, final int aSlotCount) {
+ super(aName, aTier, aSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { this.mDescription, "A useful debug machine to create pollution.", CORE.GT_Tooltip.get() };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_2) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_2) };
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier + 3][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (pollutionMultiplier > 99) {
+ pollutionMultiplier = 1;
+ } else {
+ pollutionMultiplier++;
+ }
+ PlayerUtils.messagePlayer(aPlayer, "Pollution Mutliplier is now " + pollutionMultiplier + ".");
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaPollutionCreator(
+ this.mName,
+ this.mTier,
+ this.mDescription,
+ this.mTextures,
+ this.mInventory.length);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(final ForgeDirection side) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 0;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored();
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyCapacity();
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ this.showPollution(aPlayer.getEntityWorld(), aPlayer);
+ return true;
+ }
+
+ public int pollutionMultiplier = 1;
+
+ private void showPollution(final World worldIn, final EntityPlayer playerIn) {
+ if (!PollutionUtils.isPollutionEnabled()) {
+ PlayerUtils.messagePlayer(playerIn, "This block is useless, Pollution is disabled.");
+ } else {
+ addPollution();
+ PlayerUtils
+ .messagePlayer(playerIn, "This chunk now contains " + getCurrentChunkPollution() + " pollution.");
+ // PlayerUtils.messagePlayer(playerIn, "Average over last ten minutes: "+getAveragePollutionOverLastTen()+"
+ // pollution.");
+ }
+ }
+
+ private boolean addPollution() {
+ PollutionUtils.addPollution(getBaseMetaTileEntity(), 100000 * pollutionMultiplier);
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ public int getCurrentChunkPollution() {
+ return getCurrentChunkPollution(this.getBaseMetaTileEntity());
+ }
+
+ public int getCurrentChunkPollution(IGregTechTileEntity aBaseMetaTileEntity) {
+ return PollutionUtils.getPollution(aBaseMetaTileEntity);
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { this.getLocalName(), "Current Pollution: " + this.mCurrentPollution,
+ "Average/10 minutes:" + getAveragePollutionOverLastTen() };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ return new int[] {};
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return false;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int p_70301_1_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int p_70298_1_, final int p_70298_2_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int p_70304_1_) {
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int p_70299_1_, final ItemStack p_70299_2_) {}
+
+ @Override
+ public String getInventoryName() {
+ return null;
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return false;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 0;
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer p_70300_1_) {
+ return false;
+ }
+
+ @Override
+ public void openInventory() {}
+
+ @Override
+ public void closeInventory() {}
+
+ @Override
+ public boolean isItemValidForSlot(final int p_94041_1_, final ItemStack p_94041_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setInteger("mCurrentPollution", this.mCurrentPollution);
+ aNBT.setInteger("mAveragePollution", this.mAveragePollution);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ this.mCurrentPollution = aNBT.getInteger("mCurrentPollution");
+ this.mAveragePollution = aNBT.getInteger("mAveragePollution");
+ }
+
+ @Override
+ public void onFirstTick(final IGregTechTileEntity aBaseMetaTileEntity) {
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ if (this.mCurrentPollution == 0) {
+ this.mCurrentPollution = getCurrentChunkPollution();
+ }
+ if (this.mArrayPos < 0 || this.mArrayPos > 9) {
+ this.mArrayPos = 0;
+ }
+ this.mTickTimer = 0;
+ }
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ // TickTimer - 20 times a second
+ this.mTickTimer++;
+ if (mTickTimer % 20 == 0) {
+ this.mCurrentPollution = getCurrentChunkPollution();
+ }
+ }
+ }
+
+ public int getAveragePollutionOverLastTen() {
+ int counter = 0;
+ int total = 0;
+
+ for (int j : this.mAveragePollutionArray) {
+ if (j != 0) {
+ total += j;
+ counter++;
+ }
+ }
+ int returnValue = 0;
+ if (total > 0 && counter > 0) {
+ returnValue = (total / counter);
+ this.mAveragePollution = returnValue;
+ } else {
+ returnValue = getCurrentChunkPollution();
+ }
+ // Logger.INFO("| DEBUG: "+returnValue +" | ArrayPos:"+this.mArrayPos+" | Counter:"+counter+" | Total:"+total+"
+ // |");
+ return returnValue;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionDetector.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionDetector.java
new file mode 100644
index 0000000000..92443d2658
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaPollutionDetector.java
@@ -0,0 +1,502 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMetaTileEntity;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaPollutionDetector extends GregtechMetaTileEntity {
+
+ int mCurrentPollution;
+ int mAveragePollution;
+ int mAveragePollutionArray[] = new int[10];
+ private int mArrayPos = 0;
+ private int mTickTimer = 0;
+ private int mSecondTimer = 0;
+ private long mRedstoneLevel = 0;
+
+ public GregtechMetaPollutionDetector(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final String aDescription, final int aSlotCount) {
+ super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription);
+ }
+
+ public GregtechMetaPollutionDetector(final String aName, final int aTier, final String aDescription,
+ final ITexture[][][] aTextures, final int aSlotCount) {
+ super(aName, aTier, aSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { this.mDescription, "Right click to check pollution levels.",
+ "Configure with screwdriver to set redstone output amount.", "Does not use power.", CORE.GT_Tooltip.get() };
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return side == facing
+ ? new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Dimensional),
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_Frequency) }
+ : new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Dimensional),
+ new GT_RenderedTexture(Textures.BlockIcons.VOID) };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ /*
+ * @Override public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final byte aSide, final
+ * byte aFacing, final int aColorIndex, final boolean aActive, final boolean aRedstone) { return
+ * this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0 : side == facing.getOpposite() ? 1 : side ==
+ * ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1]; }
+ */
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_2) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_2) };
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaPollutionDetector(
+ this.mName,
+ this.mTier,
+ this.mDescription,
+ this.mTextures,
+ this.mInventory.length);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(final ForgeDirection side) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 0;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored();
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyCapacity();
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ this.showPollution(aPlayer.getEntityWorld(), aPlayer);
+ return true;
+ }
+
+ private void showPollution(final World worldIn, final EntityPlayer playerIn) {
+ if (!PollutionUtils.isPollutionEnabled()) {
+ PlayerUtils.messagePlayer(playerIn, "This block is useless, Pollution is disabled.");
+ } else {
+ PlayerUtils.messagePlayer(playerIn, "This chunk contains " + getCurrentChunkPollution() + " pollution.");
+ PlayerUtils.messagePlayer(playerIn, "Emit Redstone at pollution level: " + this.mRedstoneLevel);
+ }
+ }
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ public int getCurrentChunkPollution() {
+ return getCurrentChunkPollution(this.getBaseMetaTileEntity());
+ }
+
+ public int getCurrentChunkPollution(IGregTechTileEntity aBaseMetaTileEntity) {
+ return PollutionUtils.getPollution(aBaseMetaTileEntity);
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { this.getLocalName(), "Current Pollution: " + this.mCurrentPollution,
+ "Average/10 Sec: " + this.mAveragePollution, "Emit Redstone at pollution level: " + this.mRedstoneLevel };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ return new int[] {};
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return false;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int p_70301_1_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int p_70298_1_, final int p_70298_2_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int p_70304_1_) {
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int p_70299_1_, final ItemStack p_70299_2_) {}
+
+ @Override
+ public String getInventoryName() {
+ return null;
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return false;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 0;
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer p_70300_1_) {
+ return false;
+ }
+
+ @Override
+ public void openInventory() {}
+
+ @Override
+ public void closeInventory() {}
+
+ @Override
+ public boolean isItemValidForSlot(final int p_94041_1_, final ItemStack p_94041_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setInteger("mCurrentPollution", this.mCurrentPollution);
+ aNBT.setInteger("mAveragePollution", this.mAveragePollution);
+ aNBT.setLong("mRedstoneLevel", this.mRedstoneLevel);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ this.mCurrentPollution = aNBT.getInteger("mCurrentPollution");
+ this.mAveragePollution = aNBT.getInteger("mAveragePollution");
+ this.mRedstoneLevel = aNBT.getLong("mRedstoneLevel");
+ }
+
+ @Override
+ public void onFirstTick(final IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ }
+
+ public boolean allowCoverOnSide(final ForgeDirection side, final int aCoverID) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+
+ // Only Calc server-side
+ if (!this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ return;
+ }
+ // Emit Redstone
+ if (this.getCurrentChunkPollution() >= this.mRedstoneLevel) {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ this.getBaseMetaTileEntity()
+ .setStrongOutputRedstoneSignal(side, (byte) 16);
+ }
+ this.markDirty();
+ } else {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ this.getBaseMetaTileEntity()
+ .setStrongOutputRedstoneSignal(side, (byte) 0);
+ }
+ this.markDirty();
+ }
+
+ // Do Math for stats
+ if (this.mTickTimer % 20 == 0) {
+ mCurrentPollution = this.getCurrentChunkPollution();
+ if (mArrayPos > mAveragePollutionArray.length - 1) {
+ mArrayPos = 0;
+ }
+ mAveragePollutionArray[mArrayPos] = mCurrentPollution;
+ mAveragePollution = getAveragePollutionOverLastTen();
+ mArrayPos++;
+ }
+ this.mTickTimer++;
+ }
+
+ public int getAveragePollutionOverLastTen() {
+ return MathUtils.getIntAverage(mAveragePollutionArray);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+
+ if (side == this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ final float[] tCoords = GT_Utility.getClickedFacingCoords(side, aX, aY, aZ);
+ switch ((byte) ((byte) (int) (tCoords[0] * 2.0F) + (2 * (byte) (int) (tCoords[1] * 2.0F)))) {
+ case 0 -> this.mRedstoneLevel -= 5000;
+ case 1 -> this.mRedstoneLevel += 5000;
+ case 2 -> this.mRedstoneLevel -= 50000;
+ case 3 -> this.mRedstoneLevel += 50000;
+ }
+ this.markDirty();
+ GT_Utility.sendChatToPlayer(aPlayer, "Emit Redstone at Pollution Level: " + this.mRedstoneLevel);
+ }
+
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean allowGeneralRedstoneOutput() {
+ if (this.getCurrentChunkPollution() >= this.mRedstoneLevel) {
+ this.markDirty();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ }
+
+ @Override
+ public void onMachineBlockUpdate() {
+ super.onMachineBlockUpdate();
+ }
+
+ @Override
+ public boolean hasSidedRedstoneOutputBehavior() {
+ if (this.getCurrentChunkPollution() >= this.mRedstoneLevel) {
+ this.markDirty();
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaTileEntity_AutoChisel.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaTileEntity_AutoChisel.java
new file mode 100644
index 0000000000..751771f2b4
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaTileEntity_AutoChisel.java
@@ -0,0 +1,190 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.BasicUIProperties;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import team.chisel.carving.Carving;
+
+public class GregtechMetaTileEntity_AutoChisel extends GT_MetaTileEntity_BasicMachine {
+
+ private ItemStack mInputCache;
+ private ItemStack mOutputCache;
+
+ public GregtechMetaTileEntity_AutoChisel(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 1,
+ "Chisels things, Gregtech style",
+ 1,
+ 1,
+ new ITexture[] { new GT_RenderedTexture(BlockIcons.OVERLAY_SIDE_MASSFAB_ACTIVE),
+ new GT_RenderedTexture(BlockIcons.OVERLAY_SIDE_MASSFAB),
+ new GT_RenderedTexture(BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_ACTIVE),
+ new GT_RenderedTexture(BlockIcons.OVERLAY_FRONT_MULTI_SMELTER),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_MatterFab_Active),
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_MatterFab),
+ new GT_RenderedTexture(BlockIcons.OVERLAY_BOTTOM_MASSFAB_ACTIVE),
+ new GT_RenderedTexture(BlockIcons.OVERLAY_BOTTOM_MASSFAB) });
+ }
+
+ public GregtechMetaTileEntity_AutoChisel(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures, 1, 1);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_AutoChisel(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(
+ this.mDescriptionArray,
+ "What you want to chisel goes in slot 1",
+ "What you want to get goes in the special slot (bottom right)",
+ "If special slot is empty, first chisel result is used");
+ }
+
+ private boolean hasValidCache(ItemStack aStack, ItemStack aSpecialSlot, boolean aClearOnFailure) {
+ if (mInputCache != null && mOutputCache != null) {
+ if (GT_Utility.areStacksEqual(aStack, mInputCache)
+ && GT_Utility.areStacksEqual(aSpecialSlot, mOutputCache)) {
+ return true;
+ }
+ }
+ // clear cache if it was invalid
+ if (aClearOnFailure) {
+ mInputCache = null;
+ mOutputCache = null;
+ }
+ return false;
+ }
+
+ private void cacheItem(ItemStack mInputItem, ItemStack mOutputItem) {
+ mOutputCache = mOutputItem.copy();
+ mInputCache = mInputItem.copy();
+ }
+
+ @Override
+ protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return hasValidCache(aStack, this.getSpecialSlot(), false) ? true
+ : super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) && hasChiselResults(aStack);
+ }
+
+ // lets make sure the user isn't trying to make something from a block that doesn't have this as a valid target
+ private static boolean canBeMadeFrom(ItemStack from, ItemStack to) {
+ List<ItemStack> results = getItemsForChiseling(from);
+ for (ItemStack s : results) {
+ if (s.getItem() == to.getItem() && s.getItemDamage() == to.getItemDamage()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // lets make sure the user isn't trying to make something from a block that doesn't have this as a valid target
+ private static boolean hasChiselResults(ItemStack from) {
+ List<ItemStack> results = getItemsForChiseling(from);
+ return results.size() > 0;
+ }
+
+ private static List<ItemStack> getItemsForChiseling(ItemStack aStack) {
+ return Carving.chisel.getItemsForChiseling(aStack);
+ }
+
+ private static ItemStack getChiselOutput(ItemStack aInput, ItemStack aTarget) {
+ ItemStack tOutput = null;
+ if (aTarget != null && canBeMadeFrom(aInput, aTarget)) {
+ tOutput = aTarget;
+ } else if (aTarget != null && !canBeMadeFrom(aInput, aTarget)) {
+ tOutput = null;
+ } else {
+ tOutput = getItemsForChiseling(aInput).get(0);
+ }
+ return tOutput;
+ }
+
+ @Override
+ public int checkRecipe() {
+ ItemStack tOutput = null;
+ ItemStack aInput = getInputAt(0);
+ ItemStack aTarget = getSpecialSlot();
+ boolean tIsCached = hasValidCache(aInput, aTarget, true);
+ if (aInput != null && hasChiselResults(aInput) && aInput.stackSize > 0) {
+ tOutput = tIsCached ? mOutputCache.copy() : getChiselOutput(aInput, aTarget);
+ if (tOutput != null) {
+ tOutput = tOutput.copy();
+ tOutput.stackSize = 1;
+ // We can chisel this
+ if (canOutput(tOutput)) {
+ getInputAt(0).stackSize -= 1;
+ calculateOverclockedNess(16, 20);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1) {
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ }
+ if (!tIsCached) {
+ cacheItem(ItemUtils.getSimpleStack(aInput, 1), ItemUtils.getSimpleStack(tOutput, 1));
+ }
+ this.mOutputItems[0] = tOutput.copy();
+ return FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ } else {
+ mOutputBlocked++;
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ }
+ }
+ }
+ return DID_NOT_FIND_RECIPE;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ private static final FallbackableUITexture progressBarTexture = GT_UITextures
+ .fallbackableProgressbar("auto_chisel", GT_UITextures.PROGRESSBAR_COMPRESS);
+
+ @Override
+ protected BasicUIProperties getUIProperties() {
+ return super.getUIProperties().toBuilder()
+ .progressBarTexture(progressBarTexture)
+ .build();
+ }
+
+ @Override
+ protected SlotWidget createItemInputSlot(int index, IDrawable[] backgrounds, Pos2d pos) {
+ return (SlotWidget) super.createItemInputSlot(index, backgrounds, pos)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_COMPRESSOR);
+ }
+
+ @Override
+ protected SlotWidget createSpecialSlot(IDrawable[] backgrounds, Pos2d pos, BasicUIProperties uiProperties) {
+ return (SlotWidget) super.createSpecialSlot(backgrounds, pos, uiProperties)
+ .setGTTooltip(() -> mTooltipCache.getData("GTPP.machines.chisel_slot.tooltip"));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaWirelessCharger.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaWirelessCharger.java
new file mode 100644
index 0000000000..b1289958a9
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaWirelessCharger.java
@@ -0,0 +1,672 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMetaTileEntity;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.helpers.ChargingHelper;
+
+public class GregtechMetaWirelessCharger extends GregtechMetaTileEntity {
+
+ private int mCurrentDimension = 0;
+ public int mMode = 0;
+ public boolean mLocked = true;
+
+ public GregtechMetaWirelessCharger(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final String aDescription, final int aSlotCount) {
+ super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription);
+ }
+
+ public GregtechMetaWirelessCharger(final String aName, final int aTier, final String aDescription,
+ final ITexture[][][] aTextures, final int aSlotCount) {
+ super(aName, aTier, aSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { this.mDescription, "Can be locked to the owner by sneaking with a screwdriver",
+ "Can also be locked with a lock upgrade", "", "3 Modes, Long-Range, Local and Mixed.",
+ "Long-Range: Can supply 2A of power to a single player up to " + (GT_Values.V[this.mTier] * 4) + "m away.",
+ "Local: Can supply several Amps to each player within " + this.mTier * 20 + "m.",
+ "Mixed: Provides both 2A of long range and 1A per player locally.",
+ "Mixed mode is more conservative of power and as a result only",
+ "Gets half the distances each singular mode gets.", CORE.GT_Tooltip.get() };
+ }
+
+ public int getTier() {
+ return this.mTier;
+ }
+
+ public int getMode() {
+ return this.mMode;
+ }
+
+ public int getDimensionID() {
+ return this.mCurrentDimension;
+ }
+
+ public Map<String, UUID> getLocalMap() {
+ return this.mLocalChargingMap;
+ }
+
+ public Map<String, UUID> getLongRangeMap() {
+ return this.mWirelessChargingMap;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_2) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Screen_2) };
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+
+ if (aPlayer.isSneaking()) {
+ mLocked = !mLocked;
+ PlayerUtils.messagePlayer(aPlayer, mLocked ? "Locked to owner." : "Unlocked.");
+ return;
+ }
+
+ mWirelessChargingMap.clear();
+ mLocalChargingMap.clear();
+ if (!this.getBaseMetaTileEntity()
+ .getWorld().playerEntities.isEmpty()) {
+ for (Object mTempPlayer : this.getBaseMetaTileEntity()
+ .getWorld().playerEntities) {
+ if (mTempPlayer instanceof EntityPlayer || mTempPlayer instanceof EntityPlayerMP) {
+ EntityPlayer mTemp = (EntityPlayer) mTempPlayer;
+ ChargingHelper.removeValidPlayer(mTemp, this);
+ }
+ }
+ }
+
+ if (this.mMode >= 2) {
+ this.mMode = 0;
+ } else {
+ this.mMode++;
+ }
+ if (this.mMode == 0) {
+ PlayerUtils.messagePlayer(aPlayer, "Now in Long-Range Charge Mode.");
+ } else if (this.mMode == 1) {
+ PlayerUtils.messagePlayer(aPlayer, "Now in Local Charge Mode.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Now in Mixed Charge Mode.");
+ }
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaWirelessCharger(
+ this.mName,
+ this.mTier,
+ this.mDescription,
+ this.mTextures,
+ this.mInventory.length);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(final ForgeDirection side) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return GT_Values.V[this.mTier] * 128;
+ }
+
+ @Override
+ public int getCapacity() {
+ return (int) (GT_Values.V[this.mTier] * 32);
+ }
+
+ @Override
+ public long maxEUInput() {
+ return GT_Values.V[this.mTier];
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ if (this.mMode == 0) {
+ return 2;
+ } else if (this.mMode == 1) {
+ return this.mLocalChargingMap.size() * 8;
+ } else {
+ return ((this.mLocalChargingMap.size() * 4) + this.mWirelessChargingMap.size());
+ }
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored();
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyCapacity();
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { this.getLocalName() };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ return new int[] {};
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return false;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int p_70301_1_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int p_70298_1_, final int p_70298_2_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int p_70304_1_) {
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int p_70299_1_, final ItemStack p_70299_2_) {}
+
+ @Override
+ public String getInventoryName() {
+ return null;
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return false;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 0;
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer p_70300_1_) {
+ return false;
+ }
+
+ @Override
+ public void openInventory() {}
+
+ @Override
+ public void closeInventory() {}
+
+ @Override
+ public boolean isItemValidForSlot(final int p_94041_1_, final ItemStack p_94041_2_) {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setBoolean("mLocked", this.mLocked);
+ aNBT.setInteger("mMode", this.mMode);
+ aNBT.setInteger("mCurrentDimension", this.mCurrentDimension);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ this.mLocked = aNBT.getBoolean("mLocked");
+ this.mMode = aNBT.getInteger("mMode");
+ this.mCurrentDimension = aNBT.getInteger("mCurrentDimension");
+ }
+
+ @Override
+ public void onFirstTick(final IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ }
+
+ private Map<String, UUID> mWirelessChargingMap = new HashMap<>();
+ private Map<String, UUID> mLocalChargingMap = new HashMap<>();
+
+ private boolean isValidPlayer(EntityPlayer aPlayer) {
+ BaseMetaTileEntity aTile = (BaseMetaTileEntity) this.getBaseMetaTileEntity();
+ if (mLocked || (aTile != null && aTile.privateAccess())) {
+ if (aPlayer.getUniqueID()
+ .equals(getBaseMetaTileEntity().getOwnerUuid())) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void onPostTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+
+ if (this.mCurrentDimension != aBaseMetaTileEntity.getWorld().provider.dimensionId) {
+ this.mCurrentDimension = aBaseMetaTileEntity.getWorld().provider.dimensionId;
+ }
+
+ if (aTick % 20 == 0) {
+ boolean mHasBeenMapped = this.equals(ChargingHelper.getEntry(getTileEntityPosition()));
+ if (!mHasBeenMapped) {
+ mHasBeenMapped = ChargingHelper.addEntry(getTileEntityPosition(), this);
+ }
+
+ if (mHasBeenMapped && !aBaseMetaTileEntity.getWorld().playerEntities.isEmpty()) {
+ for (Object mTempPlayer : aBaseMetaTileEntity.getWorld().playerEntities) {
+ if (mTempPlayer instanceof EntityPlayer || mTempPlayer instanceof EntityPlayerMP) {
+ EntityPlayer mTemp = (EntityPlayer) mTempPlayer;
+
+ if (this.mMode == 1 || this.mMode == 2) {
+ int tempRange = (this.mMode == 1 ? this.mTier * 20 : this.mTier * 10);
+ if (getDistanceBetweenTwoPositions(getTileEntityPosition(), getPositionOfEntity(mTemp))
+ < tempRange) {
+ if (isValidPlayer(mTemp)
+ && !mLocalChargingMap.containsKey(mTemp.getDisplayName())) {
+ mLocalChargingMap.put(mTemp.getDisplayName(), mTemp.getPersistentID());
+ ChargingHelper.addValidPlayer(mTemp, this);
+ // PlayerUtils.messagePlayer(mTemp, "You have entered charging range.
+ // ["+tempRange+"m - Local].");
+ }
+ } else {
+ if (mLocalChargingMap.containsKey(mTemp.getDisplayName())) {
+ if (mLocalChargingMap.remove(mTemp.getDisplayName()) != null) {
+ // PlayerUtils.messagePlayer(mTemp, "You have left charging range.
+ // ["+tempRange+"m - Local].");
+ ChargingHelper.removeValidPlayer(mTemp, this);
+ }
+ }
+ }
+ }
+ if (this.mMode == 0 || this.mMode == 2) {
+ int tempRange = (int) (this.mMode == 0 ? 4 * GT_Values.V[this.mTier]
+ : 2 * GT_Values.V[this.mTier]);
+ if (getDistanceBetweenTwoPositions(getTileEntityPosition(), getPositionOfEntity(mTemp))
+ <= tempRange) {
+ if (!mWirelessChargingMap.containsKey(mTemp.getDisplayName())) {
+ if (isValidPlayer(mTemp)) {
+ mWirelessChargingMap.put(mTemp.getDisplayName(), mTemp.getPersistentID());
+ ChargingHelper.addValidPlayer(mTemp, this);
+ PlayerUtils.messagePlayer(
+ mTemp,
+ "You have entered charging range. [" + tempRange + "m - Long-Range].");
+ }
+ }
+ } else {
+ if (mWirelessChargingMap.containsKey(mTemp.getDisplayName())) {
+ if (mWirelessChargingMap.remove(mTemp.getDisplayName()) != null) {
+ PlayerUtils.messagePlayer(
+ mTemp,
+ "You have left charging range. [" + tempRange + "m - Long Range].");
+ ChargingHelper.removeValidPlayer(mTemp, this);
+ }
+ }
+ }
+ }
+ /*
+ * if (this.mMode == 0 || this.mMode == 2){ int tempRange = (int) (this.mMode == 0 ?
+ * 4*GT_Values.V[this.mTier] : 2*GT_Values.V[this.mTier]); if
+ * (getDistanceBetweenTwoPositions(getTileEntityPosition(), getPositionOfEntity(mTemp)) <
+ * tempRange){ if (!mWirelessChargingMap.containsKey(mTemp)){
+ * mWirelessChargingMap.put(mTemp, mTemp.getPersistentID());
+ * PlayerUtils.messagePlayer(mTemp, "You have entered charging range. ["+tempRange+"m].");
+ * ChargingHelper.addValidPlayer(mTemp, this); } } else { if
+ * (mWirelessChargingMap.containsKey(mTemp)){ if (mWirelessChargingMap.remove(mTemp) !=
+ * null){ PlayerUtils.messagePlayer(mTemp,
+ * "You have left charging range. ["+tempRange+"m].");
+ * ChargingHelper.removeValidPlayer(mTemp, this); } } } }
+ */
+
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public BlockPos getTileEntityPosition() {
+ return new BlockPos(
+ this.getBaseMetaTileEntity()
+ .getXCoord(),
+ this.getBaseMetaTileEntity()
+ .getYCoord(),
+ this.getBaseMetaTileEntity()
+ .getZCoord(),
+ this.getBaseMetaTileEntity()
+ .getWorld());
+ }
+
+ public BlockPos getPositionOfEntity(Entity mEntity) {
+ if (mEntity == null) {
+ return null;
+ }
+ return EntityUtils.findBlockPosUnderEntity(mEntity);
+ }
+
+ public double getDistanceBetweenTwoPositions(BlockPos objectA, BlockPos objectB) {
+ if (objectA == null || objectB == null) {
+ return 0f;
+ }
+ int[] objectArray1 = new int[] { objectA.xPos, objectA.yPos, objectA.zPos };
+ int[] objectArray2 = new int[] { objectB.xPos, objectB.yPos, objectB.zPos };
+
+ final double distance = Math.sqrt(
+ (objectArray2[0] - objectArray1[0]) * (objectArray2[0] - objectArray1[0])
+ + (objectArray2[1] - objectArray1[1]) * (objectArray2[1] - objectArray1[1])
+ + (objectArray2[2] - objectArray1[2]) * (objectArray2[2] - objectArray1[2]));
+ return distance;
+ }
+
+ @Override
+ public void onRemoval() {
+
+ ChargingHelper.removeEntry(getTileEntityPosition(), this);
+
+ mWirelessChargingMap.clear();
+ mLocalChargingMap.clear();
+ if (!this.getBaseMetaTileEntity()
+ .getWorld().playerEntities.isEmpty()) {
+ for (Object mTempPlayer : this.getBaseMetaTileEntity()
+ .getWorld().playerEntities) {
+ if (mTempPlayer instanceof EntityPlayer || mTempPlayer instanceof EntityPlayerMP) {
+ EntityPlayer mTemp = (EntityPlayer) mTempPlayer;
+ ChargingHelper.removeValidPlayer(mTemp, this);
+ }
+ }
+ }
+
+ super.onRemoval();
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+
+ int tempRange;
+
+ if (this.mMode == 0 || this.mMode == 2) {
+ tempRange = (int) (this.mMode == 0 ? 4 * GT_Values.V[this.mTier] : 2 * GT_Values.V[this.mTier]);
+ } else {
+ tempRange = this.mMode == 1 ? this.mTier * 20 : this.mTier * 10;
+ }
+
+ if (this.mMode == 2) {
+ PlayerUtils
+ .messagePlayer(aPlayer, "Mixed Mode | Local: " + this.mTier * 10 + "m | Long: " + tempRange + "m");
+ PlayerUtils.messagePlayer(aPlayer, "Players with access:");
+ for (String name : this.getLocalMap()
+ .keySet()) {
+ PlayerUtils.messagePlayer(aPlayer, "Local: " + name);
+ }
+ for (String name : this.getLongRangeMap()
+ .keySet()) {
+ PlayerUtils.messagePlayer(aPlayer, "Long: " + name);
+ }
+ } else if (this.mMode == 1) {
+ PlayerUtils.messagePlayer(aPlayer, "Local Mode: " + this.mTier * 20 + "m");
+ PlayerUtils.messagePlayer(aPlayer, "Players with access:");
+ for (String name : this.getLocalMap()
+ .keySet()) {
+ PlayerUtils.messagePlayer(aPlayer, "" + name);
+ }
+
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Long-range Mode: " + tempRange + "m");
+ PlayerUtils.messagePlayer(aPlayer, "Players with access:");
+ for (String name : this.getLongRangeMap()
+ .keySet()) {
+ PlayerUtils.messagePlayer(aPlayer, "" + name);
+ }
+ }
+
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ }
+
+ @Override
+ public void onServerStart() {
+ mWirelessChargingMap.clear();
+ mLocalChargingMap.clear();
+ super.onServerStart();
+ }
+
+ @Override
+ public void onExplosion() {
+ ChargingHelper.removeEntry(getTileEntityPosition(), this);
+ super.onExplosion();
+ }
+
+ @Override
+ public void doExplosion(long aExplosionPower) {
+ ChargingHelper.removeEntry(getTileEntityPosition(), this);
+ super.doExplosion(aExplosionPower);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/misc/GMTE_AmazonPackager.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/misc/GMTE_AmazonPackager.java
new file mode 100644
index 0000000000..0e71c3b9b1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/misc/GMTE_AmazonPackager.java
@@ -0,0 +1,168 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.misc;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GMTE_AmazonPackager extends GregtechMeta_MultiBlockBase<GMTE_AmazonPackager>
+ implements ISurvivalConstructable {
+
+ private int mCasing;
+
+ private static IStructureDefinition<GMTE_AmazonPackager> STRUCTURE_DEFINITION = null;
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GMTE_AmazonPackager(mName);
+ }
+
+ public GMTE_AmazonPackager(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GMTE_AmazonPackager(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Packager";
+ }
+
+ @Override
+ public IStructureDefinition<GMTE_AmazonPackager> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GMTE_AmazonPackager>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GMTE_AmazonPackager.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(TAE.getIndexFromPage(2, 9))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 9))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Amazon Warehouse")
+ .addInfo("This Multiblock is used for EXTREME packaging requirements")
+ .addInfo("Dust Schematics are inserted into the input busses")
+ .addInfo("If inserted into the controller, it is shared across all busses")
+ .addInfo("1x, 2x, 3x & Other Schematics are to be placed into the controller GUI slot")
+ .addInfo("500% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 75% of the EU/t normally required")
+ .addInfo("Processes 16 items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoMin("Supply Depot Casings", 10, false)
+ .addInputBus("Any casing", 1)
+ .addOutputBus("Any casing", 1)
+ .addEnergyHatch("Any casing", 1)
+ .addMaintenanceHatch("Any casing", 1)
+ .addMufflerHatch("Any casing", 1)
+ .toolTipFinisher("GT++");
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(2, 9);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.packagerRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 6F)
+ .setEuModifier(0.75F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 10 && checkHatch();
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack p0) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack arg0) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiPackager;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (16 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialAlloySmelter.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialAlloySmelter.java
new file mode 100644
index 0000000000..e5d138dfda
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialAlloySmelter.java
@@ -0,0 +1,223 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+
+import net.minecraft.item.ItemStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMetaTileEntity_IndustrialAlloySmelter extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialAlloySmelter> implements ISurvivalConstructable {
+
+ public static int CASING_TEXTURE_ID;
+ private HeatingCoilLevel mHeatingCapacity;
+ private int mLevel = 0;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialAlloySmelter> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialAlloySmelter(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 1);
+ }
+
+ public GregtechMetaTileEntity_IndustrialAlloySmelter(String aName) {
+ super(aName);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 1);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialAlloySmelter(this.mName);
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.alloySmelterRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialAlloySmelter;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Alloy Smelter";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Alloy Smelter")
+ .addInfo("Gains one parallel per voltage tier")
+ .addInfo("Gains one multiplier per coil tier")
+ .addInfo("Parallel = Tier * Coil Tier")
+ .addInfo("Gains 5% speed bonus per coil tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 5, 3, true)
+ .addController("Bottom center")
+ .addCasingInfoMin("Inconel Reinforced Casings", 8, false)
+ .addOtherStructurePart("Integral Encasement V", "Middle Layer")
+ .addOtherStructurePart("Heating Coils", "Above and below Integral Encasements")
+ .addInputBus("Any Inconel Reinforced Casing", 1)
+ .addOutputBus("Any Inconel Reinforced Casing", 1)
+ .addEnergyHatch("Any Inconel Reinforced Casing", 1)
+ .addMaintenanceHatch("Any Inconel Reinforced Casing", 1)
+ .addMufflerHatch("Any Inconel Reinforced Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialAlloySmelter> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialAlloySmelter>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "HHH", "H-H", "HHH" }, { "VVV", "V-V", "VVV" },
+ { "HHH", "H-H", "HHH" }, { "C~C", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialAlloySmelter.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 1))))
+ .addElement(
+ 'H',
+ ofCoil(
+ GregtechMetaTileEntity_IndustrialAlloySmelter::setCoilLevel,
+ GregtechMetaTileEntity_IndustrialAlloySmelter::getCoilLevel))
+ .addElement('V', ofBlock(ModBlocks.blockCasingsTieredGTPP, 4))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 4, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 4, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mLevel = 0;
+ setCoilLevel(HeatingCoilLevel.None);
+ return checkPiece(mName, 1, 4, 0) && mCasing >= 8
+ && getCoilLevel() != HeatingCoilLevel.None
+ && (mLevel = getCoilLevel().getTier() + 1) > 0
+ && checkHatch();
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (this.mLevel * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setSpeedBoost(100F / (100F + 5F * mLevel))
+ .setHeatOC(true)
+ .setRecipeHeat(0)
+ // Need to multiply by 2 because heat OC is done only once every 1800 and this one does it once
+ // every
+ // 900
+ .setMachineHeat((int) (getCoilLevel().getHeat() * 2));
+ }
+ }.setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ public HeatingCoilLevel getCoilLevel() {
+ return mHeatingCapacity;
+ }
+
+ public void setCoilLevel(HeatingCoilLevel aCoilLevel) {
+ mHeatingCapacity = aCoilLevel;
+ }
+
+ @Override
+ public boolean isInputSeparationEnabled() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialArcFurnace.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialArcFurnace.java
new file mode 100644
index 0000000000..c27422fb93
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialArcFurnace.java
@@ -0,0 +1,337 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialArcFurnace
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialArcFurnace> implements ISurvivalConstructable {
+
+ // 862
+ private static final int mCasingTextureID = TAE.getIndexFromPage(3, 3);
+ public static String mCasingName = "Tempered Arc Furnace Casing";
+ private boolean mPlasmaMode = false;
+ private int mSize = 0;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialArcFurnace> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialArcFurnace(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialArcFurnace(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialArcFurnace(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "(Plasma/Electric) Arc Furnace";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for Industrial Arc Furnace")
+ .addInfo("250% faster than using single block machines of the same voltage")
+ .addInfo("Processes 8 items per voltage tier * W/L")
+ .addInfo("Right-click controller with a Screwdriver to change modes")
+ .addInfo("Max Size required to process Plasma recipes")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .addController("Top center")
+ .addStructureInfo("Size: nxnx3 [WxHxL] (Hollow)")
+ .addStructureInfo("n can be 3, 5 or 7")
+ .addCasingInfoMin(mCasingName, 10, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ /**
+ * The front part of multi. Used to determine the tier, or in other words, determine the size of multi.
+ */
+ private static final String STRUCTURE_PIECE_FRONT = "front";
+ /**
+ * The rest part of multi.
+ */
+ private static final String STRUCTURE_PIECE_REST = "rest";
+ private static final int MAX_TIER = 3;
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialArcFurnace> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialArcFurnace>builder()
+ .addShape(STRUCTURE_PIECE_FRONT + 1, new String[][] { { "CCC", "C~C", "CCC" } })
+ .addShape(STRUCTURE_PIECE_FRONT + 2, new String[][] { { "CCCCC", "C C", "C C", "C C", "CCCCC" } })
+ .addShape(
+ STRUCTURE_PIECE_FRONT + 3,
+ new String[][] { { "CCCCCCC", "C C", "C C", "C C", "C C", "C C", "CCCCCCC" }, })
+ .addShape(STRUCTURE_PIECE_REST + 1, new String[][] { { "CCC", "C-C", "CCC" }, { "CCC", "CCC", "CCC" } })
+ .addShape(
+ STRUCTURE_PIECE_REST + 2,
+ new String[][] { { "CCCCC", "C---C", "C---C", "C---C", "CCCCC" },
+ { "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" } })
+ .addShape(
+ STRUCTURE_PIECE_REST + 3,
+ new String[][] { { "CCCCCCC", "C-----C", "C-----C", "C-----C", "C-----C", "C-----C", "CCCCCCC" },
+ { "CCCCCCC", "CCCCCCC", "CCCCCCC", "CCCCCCC", "CCCCCCC", "CCCCCCC", "CCCCCCC" }, })
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialArcFurnace.class)
+ .atLeast(InputBus, InputHatch, OutputBus, OutputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .allowOnly(ForgeDirection.NORTH)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings4Misc, 3))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ private int getTierFromHint(ItemStack stackSize) {
+ if (stackSize.stackSize <= 0 || stackSize.stackSize >= MAX_TIER) {
+ return MAX_TIER;
+ }
+ return stackSize.stackSize;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ int maxTier = getTierFromHint(stackSize);
+ for (int tier = 1; tier <= maxTier; tier++) {
+ buildPiece(STRUCTURE_PIECE_FRONT + tier, stackSize, hintsOnly, tier, tier, 0);
+ }
+ buildPiece(STRUCTURE_PIECE_REST + maxTier, stackSize, hintsOnly, maxTier, maxTier, -1);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int maxTier = getTierFromHint(stackSize);
+ int built;
+ for (int tier = 1; tier <= maxTier; tier++) {
+ built = survivialBuildPiece(
+ STRUCTURE_PIECE_FRONT + tier,
+ stackSize,
+ tier,
+ tier,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ if (built >= 0) return built;
+ }
+
+ return survivialBuildPiece(
+ STRUCTURE_PIECE_REST + maxTier,
+ stackSize,
+ maxTier,
+ maxTier,
+ -1,
+ elementBudget,
+ env,
+ false,
+ true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mSize = 0;
+ int tier = 0;
+ while (tier < MAX_TIER && checkPiece(STRUCTURE_PIECE_FRONT + (tier + 1), (tier + 1), (tier + 1), 0)) {
+ tier++;
+ }
+ if (tier <= 0) return false;
+ if (checkPiece(STRUCTURE_PIECE_REST + tier, tier, tier, -1)) {
+ mSize = 2 * tier + 1;
+ return mCasing >= 10 && checkHatch();
+ }
+ return false;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return mCasingTextureID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return mPlasmaMode ? RecipeMaps.plasmaArcFurnaceRecipes : RecipeMaps.arcFurnaceRecipes;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(RecipeMaps.arcFurnaceRecipes, RecipeMaps.plasmaArcFurnaceRecipes);
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 3.5F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (this.mSize * 8 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialArcFurnace;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings4Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 3;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) mCasingTextureID;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (this.mSize > 5) {
+ this.mPlasmaMode = !mPlasmaMode;
+ if (mPlasmaMode) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "[" + EnumChatFormatting.RED
+ + "MODE"
+ + EnumChatFormatting.RESET
+ + "] "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + "Plasma"
+ + EnumChatFormatting.RESET);
+ } else {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "[" + EnumChatFormatting.RED
+ + "MODE"
+ + EnumChatFormatting.RESET
+ + "] "
+ + EnumChatFormatting.YELLOW
+ + "Electric"
+ + EnumChatFormatting.RESET);
+ }
+ } else {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "[" + EnumChatFormatting.RED
+ + "MODE"
+ + EnumChatFormatting.RESET
+ + "] "
+ + EnumChatFormatting.GRAY
+ + "Cannot change mode, structure not large enough."
+ + EnumChatFormatting.RESET);
+ }
+ mLastRecipe = null;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mPlasmaMode", mPlasmaMode);
+ aNBT.setInteger("mSize", mSize);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mPlasmaMode = aNBT.getBoolean("mPlasmaMode");
+ mSize = aNBT.getInteger("mSize");
+ }
+
+ @Override
+ public void onMachineBlockUpdate() {
+ mUpdate = 100;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCentrifuge.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCentrifuge.java
new file mode 100644
index 0000000000..c04620d4b4
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCentrifuge.java
@@ -0,0 +1,228 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.CustomIcon;
+
+public class GregtechMetaTileEntity_IndustrialCentrifuge
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialCentrifuge> implements ISurvivalConstructable {
+
+ private boolean mIsAnimated;
+ private static final CustomIcon frontFaceActive = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE5");
+ private static final CustomIcon frontFace = new CustomIcon("iconsets/LARGECENTRIFUGE5");
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialCentrifuge> STRUCTURE_DEFINITION = null;
+ // public static double recipesComplete = 0;
+
+ public GregtechMetaTileEntity_IndustrialCentrifuge(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ mIsAnimated = true;
+ }
+
+ public GregtechMetaTileEntity_IndustrialCentrifuge(final String aName) {
+ super(aName);
+ mIsAnimated = true;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialCentrifuge(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Centrifuge";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Centrifuge")
+ .addInfo("125% faster than using single block machines of the same voltage")
+ .addInfo("Disable animations with a screwdriver")
+ .addInfo("Only uses 90% of the EU/t normally required")
+ .addInfo("Processes six items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Centrifuge Casings", 6, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialCentrifuge> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialCentrifuge>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialCentrifuge.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 0))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ if (usingAnimations()) {
+ return frontFaceActive;
+ } else {
+ return frontFace;
+ }
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return frontFace;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(0);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.centrifugeNonCellRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setEuModifier(0.9F)
+ .setSpeedBonus(1F / 2.25F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (6 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasingsMisc;
+ }
+
+ public byte getCasingMeta() {
+ return 0;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.GTPP_INDEX(0);
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialCentrifuge;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ this.mIsAnimated = !mIsAnimated;
+ Logger.INFO("Is Centrifuge animated " + this.mIsAnimated);
+ if (this.mIsAnimated) {
+ PlayerUtils.messagePlayer(aPlayer, "Using Animated Turbine Texture. ");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Using Static Turbine Texture. ");
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mIsAnimated", mIsAnimated);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("mIsAnimated")) {
+ mIsAnimated = aNBT.getBoolean("mIsAnimated");
+ } else {
+ mIsAnimated = true;
+ }
+ }
+
+ public boolean usingAnimations() {
+ // Logger.INFO("Is animated? "+this.mIsAnimated);
+ return this.mIsAnimated;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialChisel.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialChisel.java
new file mode 100644
index 0000000000..a9f18dfce8
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialChisel.java
@@ -0,0 +1,342 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_StreamUtil;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ChiselBus;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import team.chisel.carving.Carving;
+
+public class GregtechMetaTileEntity_IndustrialChisel
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialChisel> implements ISurvivalConstructable {
+
+ private int mCasing;
+
+ private ItemStack target;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialChisel> STRUCTURE_DEFINITION = null;
+ private ItemStack mInputCache;
+ private ItemStack mOutputCache;
+ private GT_Recipe mCachedRecipe;
+
+ public GregtechMetaTileEntity_IndustrialChisel(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialChisel(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialChisel(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Chisel";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Factory Grade Auto Chisel")
+ .addInfo("Target block goes in Controller slot for common Input Buses")
+ .addInfo("You can also set a target block in each Chisel Input Bus and use them as an Input Bus")
+ .addInfo("If no target is provided for common buses, the result of the first chisel is used")
+ .addInfo("Speed: +200% | EU Usage: 75% | Parallel: Tier x 16")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoMin("Sturdy Printer Casing", 6, false)
+ .addInputBus("Any casing", 1)
+ .addOutputBus("Any casing", 1)
+ .addEnergyHatch("Any casing", 1)
+ .addMaintenanceHatch("Any casing", 1)
+ .addMufflerHatch("Any casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialChisel> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialChisel>builder()
+ .addShape(
+ mName,
+ transpose(
+ // spotless:off
+ new String[][] {
+ { "CCC", "CCC", "CCC" },
+ { "C~C", "C-C", "CCC" },
+ { "CCC", "CCC", "CCC" },
+ }))
+ // spotless:on
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialChisel.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(90)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings5Misc, 5))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 90;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ private boolean hasValidCache(ItemStack aStack, ItemStack aSpecialSlot, boolean aClearOnFailure) {
+ if (mInputCache != null && mOutputCache != null && mCachedRecipe != null) {
+ if (GT_Utility.areStacksEqual(aStack, mInputCache)
+ && GT_Utility.areStacksEqual(aSpecialSlot, mOutputCache)) {
+ return true;
+ }
+ }
+ // clear cache if it was invalid
+ if (aClearOnFailure) {
+ mInputCache = null;
+ mOutputCache = null;
+ mCachedRecipe = null;
+ }
+ return false;
+ }
+
+ private void cacheItem(ItemStack aInputItem, ItemStack aOutputItem, GT_Recipe aRecipe) {
+ mInputCache = aInputItem.copy();
+ mOutputCache = aOutputItem.copy();
+ mCachedRecipe = aRecipe;
+ }
+
+ // lets make sure the user isn't trying to make something from a block that doesn't have this as a valid target
+ private static boolean canBeMadeFrom(ItemStack from, ItemStack to) {
+ List<ItemStack> results = getItemsForChiseling(from);
+ for (ItemStack s : results) {
+ if (s.getItem() == to.getItem() && s.getItemDamage() == to.getItemDamage()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // lets make sure the user isn't trying to make something from a block that doesn't have this as a valid target
+ private static boolean hasChiselResults(ItemStack from) {
+ List<ItemStack> results = getItemsForChiseling(from);
+ return results.size() > 0;
+ }
+
+ private static List<ItemStack> getItemsForChiseling(ItemStack aStack) {
+ return Carving.chisel.getItemsForChiseling(aStack);
+ }
+
+ private static ItemStack getChiselOutput(ItemStack aInput, ItemStack aTarget) {
+ ItemStack tOutput;
+ if (aTarget != null && canBeMadeFrom(aInput, aTarget)) {
+ tOutput = aTarget;
+ } else if (aTarget != null && !canBeMadeFrom(aInput, aTarget)) {
+ tOutput = null;
+ } else {
+ tOutput = getItemsForChiseling(aInput).get(0);
+ }
+ return tOutput;
+ }
+
+ private GT_Recipe generateChiselRecipe(ItemStack aInput) {
+ boolean tIsCached = hasValidCache(aInput, this.target, true);
+ if (tIsCached || aInput != null && hasChiselResults(aInput)) {
+ ItemStack tOutput = tIsCached ? mOutputCache.copy() : getChiselOutput(aInput, this.target);
+ if (tOutput != null) {
+ if (mCachedRecipe != null && GT_Utility.areStacksEqual(aInput, mInputCache)
+ && GT_Utility.areStacksEqual(tOutput, mOutputCache)) {
+ return mCachedRecipe;
+ }
+ // We can chisel this
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { ItemUtils.getSimpleStack(aInput, 1) },
+ new ItemStack[] { ItemUtils.getSimpleStack(tOutput, 1) },
+ null,
+ new int[] { 10000 },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ 20,
+ 16,
+ 0);
+
+ // Cache it
+ cacheItem(aInput, tOutput, aRecipe);
+ return aRecipe;
+ }
+ }
+ return null;
+ }
+
+ private GT_Recipe getRecipe() {
+ for (GT_MetaTileEntity_Hatch_InputBus bus : this.mInputBusses) {
+ if (bus instanceof GT_MetaTileEntity_ChiselBus) { // Chisel buses
+ if (bus.mInventory[bus.getSizeInventory() - 1] == null) continue;
+ this.target = bus.mInventory[bus.getSizeInventory() - 1];
+
+ for (int i = bus.getSizeInventory() - 2; i >= 0; i--) {
+ ItemStack itemsInSlot = bus.mInventory[i];
+ if (itemsInSlot != null) {
+ GT_Recipe tRecipe = generateChiselRecipe(itemsInSlot);
+ if (tRecipe != null) {
+ return tRecipe;
+ }
+ }
+ }
+ } else {
+ target = this.getControllerSlot(); // Common buses
+ for (int i = bus.getSizeInventory() - 1; i >= 0; i--) {
+ ItemStack itemsInSlot = bus.mInventory[i];
+ if (itemsInSlot != null) {
+ GT_Recipe tRecipe = generateChiselRecipe(itemsInSlot);
+ if (tRecipe != null) {
+ return tRecipe;
+ }
+ }
+ }
+ }
+
+ }
+ return null;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Nonnull
+ @Override
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ return GT_StreamUtil.ofNullable(getRecipe());
+ }
+ }.setSpeedBonus(1F / 3F)
+ .setEuModifier(0.75F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void sendStartMultiBlockSoundLoop() {
+ sendLoopStart(PROCESS_START_SOUND_INDEX);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (16 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ private static ResourceLocation sChiselSound = null;
+
+ private static ResourceLocation getChiselSound() {
+ if (sChiselSound == null) {
+ sChiselSound = new ResourceLocation(Carving.chisel.getVariationSound(Blocks.stone, 0));
+ }
+ return sChiselSound;
+ }
+
+ @Override
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ switch (aIndex) {
+ case PROCESS_START_SOUND_INDEX -> GT_Utility
+ .doSoundAtClient(getChiselSound(), getTimeBetweenProcessSounds(), 1.0F, 1.0F, aX, aY, aZ);
+ case INTERRUPT_SOUND_INDEX -> GT_Utility
+ .doSoundAtClient(SoundResource.IC2_MACHINES_INTERRUPT_ONE, 100, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialChisel;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCokeOven.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCokeOven.java
new file mode 100644
index 0000000000..b71600e3fd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCokeOven.java
@@ -0,0 +1,209 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialCokeOven
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialCokeOven> implements ISurvivalConstructable {
+
+ private int mLevel = 0;
+ private int mCasing;
+ private int mCasing1;
+ private int mCasing2;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialCokeOven> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialCokeOven(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialCokeOven(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialCokeOven(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Coke Oven";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Processes Logs and Coal into Charcoal and Coal Coke.")
+ .addInfo("Controller Block for the Industrial Coke Oven")
+ .addInfo("Gain 4% energy discount per voltage tier")
+ .addInfo("Process 12x materials with Heat Resistant Casings")
+ .addInfo("Or 24x materials with Heat Proof Casings")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front middle at bottom")
+ .addCasingInfoMin("Structural Coke Oven Casings", 8, false)
+ .addCasingInfoMin("Heat Resistant/Proof Coke Oven Casings", 8, false)
+ .addInputBus("Any Structural Coke Oven Casing", 1)
+ .addOutputBus("Any Structural Coke Oven Casing", 1)
+ .addInputHatch("Any Structural Coke Oven Casing", 1)
+ .addOutputHatch("Any Structural Coke Oven Casing", 1)
+ .addEnergyHatch("Any Structural Coke Oven Casing", 1)
+ .addMaintenanceHatch("Any Structural Coke Oven Casing", 1)
+ .addMufflerHatch("Any Structural Coke Oven Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialCokeOven> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialCokeOven>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "HHH", "H-H", "HHH" }, { "C~C", "CCC", "CCC" }, }))
+ .addShape(
+ mName + "1",
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "aaa", "a-a", "aaa" }, { "C~C", "CCC", "CCC" }, }))
+ .addShape(
+ mName + "2",
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "bbb", "b-b", "bbb" }, { "C~C", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialCokeOven.class)
+ .atLeast(InputBus, OutputBus, InputHatch, OutputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(TAE.GTPP_INDEX(1))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 1))))
+ .addElement(
+ 'H',
+ ofChain(
+ onElementPass(x -> ++x.mCasing1, ofBlock(ModBlocks.blockCasingsMisc, 2)),
+ onElementPass(x -> ++x.mCasing2, ofBlock(ModBlocks.blockCasingsMisc, 3))))
+ .addElement('a', ofBlock(ModBlocks.blockCasingsMisc, 2))
+ .addElement('b', ofBlock(ModBlocks.blockCasingsMisc, 3))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ if (stackSize.stackSize == 1) buildPiece(mName + "1", stackSize, hintsOnly, 1, 2, 0);
+ else buildPiece(mName + "2", stackSize, hintsOnly, 1, 2, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ if (stackSize.stackSize == 1)
+ return survivialBuildPiece(mName + "1", stackSize, 1, 2, 0, elementBudget, env, false, true);
+ else return survivialBuildPiece(mName + "2", stackSize, 1, 2, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mCasing1 = 0;
+ mCasing2 = 0;
+ mLevel = 0;
+ if (checkPiece(mName, 1, 2, 0)) {
+ if (mCasing1 == 8) mLevel = 1;
+ if (mCasing2 == 8) mLevel = 2;
+ return mLevel > 0 && mCasing >= 8 && checkHatch();
+ }
+ return false;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(1);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.cokeOvenRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void setupProcessingLogic(ProcessingLogic logic) {
+ super.setupProcessingLogic(logic);
+ logic.setEuModifier((100F - (GT_Utility.getTier(getMaxInputVoltage()) * 4)) / 100F);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return this.mLevel * 12;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialCokeOven;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCuttingMachine.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCuttingMachine.java
new file mode 100644
index 0000000000..295f195d55
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialCuttingMachine.java
@@ -0,0 +1,230 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialCuttingMachine extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialCuttingMachine> implements ISurvivalConstructable {
+
+ private boolean mCuttingMode = true;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialCuttingMachine> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialCuttingMachine(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialCuttingMachine(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialCuttingMachine(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Cutting Machine / Slicing Machine";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Cutting Factory")
+ .addInfo("200% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 75% of the EU/t normally required")
+ .addInfo("Processes four items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 5, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Cutting Factory Frames", 14, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialCuttingMachine> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialCuttingMachine>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC", "CCC", "CCC" }, { "C~C", "C-C", "C-C", "C-C", "CCC" },
+ { "CCC", "CCC", "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialCuttingMachine.class)
+ .atLeast(InputBus, InputHatch, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 13))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 14 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(29);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return mCuttingMode ? RecipeMaps.cutterRecipes : RecipeMaps.slicerRecipes;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(RecipeMaps.cutterRecipes, RecipeMaps.slicerRecipes);
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 3F)
+ .setEuModifier(0.75F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialCuttingMachine;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean isInputSeparationEnabled() {
+ return true;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 13;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.GTPP_INDEX(29);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mCuttingMode = !mCuttingMode;
+ String aMode = mCuttingMode ? "Cutting" : "Slicing";
+ PlayerUtils.messagePlayer(aPlayer, "Mode: " + aMode);
+ mLastRecipe = null;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mCuttingMode", mCuttingMode);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("mCuttingMode")) {
+ mCuttingMode = aNBT.getBoolean("mCuttingMode");
+ } else {
+ mCuttingMode = true;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialDehydrator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialDehydrator.java
new file mode 100644
index 0000000000..9122090f89
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialDehydrator.java
@@ -0,0 +1,250 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialDehydrator
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialDehydrator> implements ISurvivalConstructable {
+
+ private static int CASING_TEXTURE_ID;
+ private static String mCasingName = "Vacuum Casing";
+ private HeatingCoilLevel mHeatingCapacity;
+ private boolean mDehydratorMode = false;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialDehydrator> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialDehydrator(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(3, 10);
+ }
+
+ public GregtechMetaTileEntity_IndustrialDehydrator(String aName) {
+ super(aName);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(3, 10);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialDehydrator(mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Factory Grade Vacuum Furnace")
+ .addInfo("Can toggle the operation temperature with a Screwdriver")
+ .addInfo("All Dehydrator recipes are Low Temp recipes")
+ .addInfo("Speed: +120% | EU Usage: 50% | Parallel: 4")
+ .addInfo("Each 900K over the min. Heat Capacity grants 5% speedup (multiplicatively)")
+ .addInfo("Each 1800K over the min. Heat Capacity allows for one upgraded overclock")
+ .addInfo("Upgraded overclocks reduce recipe time to 25% and increase EU/t to 400%")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 5, 3, true)
+ .addController("Bottom Center")
+ .addCasingInfoMin(mCasingName, 5, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialDehydrator> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialDehydrator>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "HHH", "H-H", "HHH" }, { "HHH", "H-H", "HHH" },
+ { "HHH", "H-H", "HHH" }, { "C~C", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialDehydrator.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings4Misc, 10))))
+ .addElement(
+ 'H',
+ ofCoil(
+ GregtechMetaTileEntity_IndustrialDehydrator::setCoilLevel,
+ GregtechMetaTileEntity_IndustrialDehydrator::getCoilLevel))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 4, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 4, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ setCoilLevel(HeatingCoilLevel.None);
+ return checkPiece(mName, 1, 4, 0) && mCasing >= 5 && getCoilLevel() != HeatingCoilLevel.None && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return mDehydratorMode ? GTPPRecipeMaps.chemicalDehydratorNonCellRecipes : GTPPRecipeMaps.vacuumFurnaceRecipes;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(GTPPRecipeMaps.chemicalDehydratorNonCellRecipes, GTPPRecipeMaps.vacuumFurnaceRecipes);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialDehydrator;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Vacuum Furnace / Dehydrator";
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 4;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ return recipe.mSpecialValue <= getCoilLevel().getHeat() ? CheckRecipeResultRegistry.SUCCESSFUL
+ : CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
+ }
+
+ @NotNull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setHeatOC(true)
+ .setHeatDiscount(true)
+ .setRecipeHeat(recipe.mSpecialValue)
+ .setMachineHeat((int) getCoilLevel().getHeat());
+ }
+ }.setSpeedBonus(1F / 2.2F)
+ .setEuModifier(0.5F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mDehydratorMode = !mDehydratorMode;
+ String aMode = mDehydratorMode ? "Dehydrator" : "Vacuum Furnace";
+ PlayerUtils.messagePlayer(aPlayer, "Mode: " + aMode);
+ mLastRecipe = null;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mDehydratorMode", mDehydratorMode);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mDehydratorMode = aNBT.getBoolean("mDehydratorMode");
+ }
+
+ public HeatingCoilLevel getCoilLevel() {
+ return mHeatingCapacity;
+ }
+
+ public void setCoilLevel(HeatingCoilLevel aCoilLevel) {
+ mHeatingCapacity = aCoilLevel;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialElectrolyzer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialElectrolyzer.java
new file mode 100644
index 0000000000..f12007b952
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialElectrolyzer.java
@@ -0,0 +1,169 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialElectrolyzer extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialElectrolyzer> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialElectrolyzer> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialElectrolyzer(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialElectrolyzer(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialElectrolyzer(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Electrolyzer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Electrolyzer")
+ .addInfo("180% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 90% of the EU/t normally required")
+ .addInfo("Processes two items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Electrolyzer Casings", 6, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialElectrolyzer> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialElectrolyzer>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialElectrolyzer.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(TAE.GTPP_INDEX(5))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 5))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(5);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.electrolyzerNonCellRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2.8F)
+ .setEuModifier(0.9F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialElectrolyzer;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 2 * GT_Utility.getTier(this.getMaxInputVoltage());
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialExtruder.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialExtruder.java
new file mode 100644
index 0000000000..ea61048f33
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialExtruder.java
@@ -0,0 +1,194 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialExtruder
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialExtruder> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialExtruder> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialExtruder(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialExtruder(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialExtruder(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Extruder";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Material Extruder")
+ .addInfo("250% faster than using single block machines of the same voltage")
+ .addInfo("Processes four items per voltage tier")
+ .addInfo("Extrusion Shape for recipe goes in the Input Bus")
+ .addInfo("Each Input Bus can have a different shape!")
+ .addInfo("You can use several input buses per multiblock")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 5, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Inconel Reinforced Casings", 14, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialExtruder> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialExtruder>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC", "CCC", "CCC" }, { "C~C", "C-C", "C-C", "C-C", "CCC" },
+ { "CCC", "CCC", "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialExtruder.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 14 && checkHatch();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_COMPRESSOR_OP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(33);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.extruderRecipes;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 3.5F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialExtruder;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings3Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 1;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.GTPP_INDEX(33);
+ }
+
+ @Override
+ public boolean isInputSeparationEnabled() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialFluidHeater.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialFluidHeater.java
new file mode 100644
index 0000000000..a34532ee83
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialFluidHeater.java
@@ -0,0 +1,204 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialFluidHeater extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialFluidHeater> implements ISurvivalConstructable {
+
+ private int mCasing1;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialFluidHeater> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialFluidHeater(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialFluidHeater(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialFluidHeater(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Fluid Heater";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Fluid Heater")
+ .addInfo("120% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 90% of the EU/t normally required")
+ .addInfo("Processes eight items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(5, 6, 5, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Top/Bottom layer: Multi-use Casings", 34, false)
+ .addCasingInfoMin("Middle layers: Thermal Containment Casing", 47, false)
+ .addInputBus("Bottom Layer (optional)", 1)
+ .addInputHatch("Bottom Layer", 1)
+ .addOutputBus("Top Layer (optional)", 1)
+ .addOutputHatch("Top Layer", 1)
+ .addEnergyHatch("Any Multi-use Casing", 1)
+ .addMaintenanceHatch("Any Multi-use Casing", 1)
+ .addMufflerHatch("Any Multi-use Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialFluidHeater> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialFluidHeater>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { " TTT ", "TTTTT", "TTTTT", "TTTTT", " TTT " },
+ { " XXX ", "X---X", "X---X", "X---X", " XXX " },
+ { " XXX ", "X---X", "X---X", "X---X", " XXX " },
+ { " XXX ", "X---X", "X---X", "X---X", " XXX " },
+ { " X~X ", "X---X", "X---X", "X---X", " XXX " },
+ { " BBB ", "BBBBB", "BBBBB", "BBBBB", " BBB " }, }))
+ .addElement(
+ 'B',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialFluidHeater.class)
+ .atLeast(InputBus, InputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing1, ofBlock(getCasingBlock2(), getCasingMeta2()))))
+ .addElement('X', ofBlock(getCasingBlock1(), getCasingMeta1()))
+ .addElement(
+ 'T',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialFluidHeater.class)
+ .atLeast(OutputBus, OutputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing1, ofBlock(getCasingBlock2(), getCasingMeta2()))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 2, 4, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 2, 4, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing1 = 0;
+ boolean didBuild = checkPiece(mName, 2, 4, 0);
+ log("Built? " + didBuild + ", " + mCasing1);
+ return didBuild && mCasing1 >= 34 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(0, 1);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.fluidHeaterRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2.2F)
+ .setEuModifier(0.9F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (8 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialThermalCentrifuge;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock1() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public byte getCasingMeta1() {
+ return 11;
+ }
+
+ public Block getCasingBlock2() {
+ return ModBlocks.blockCasings3Misc;
+ }
+
+ public byte getCasingMeta2() {
+ return 2;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.getIndexFromPage(2, 2);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialForgeHammer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialForgeHammer.java
new file mode 100644
index 0000000000..8e2f040d75
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialForgeHammer.java
@@ -0,0 +1,244 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlocksTiered;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.Mods.EnderIO;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.enums.Mods.ThaumicBases;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.ITierConverter;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class GregtechMetaTileEntity_IndustrialForgeHammer extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialForgeHammer> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private int mAnvilTier = 0;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialForgeHammer> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialForgeHammer(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialForgeHammer(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialForgeHammer(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Forge Hammer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Forge Hammer")
+ .addInfo("Speed: +100% | EU Usage: 100% | Parallel: Tier x Anvil Tier x 8")
+ .addInfo("T1 - Vanilla Anvil");
+ if (Railcraft.isModLoaded()) {
+ tt.addInfo("T2 - Steel Anvil");
+ }
+ if (EnderIO.isModLoaded()) {
+ tt.addInfo("T3 - Dark Steel Anvil");
+ }
+ if (ThaumicBases.isModLoaded()) {
+ tt.addInfo("T3 - Thaumium Anvil");
+ tt.addInfo("T4 - Void Metal Anvil");
+ }
+
+ tt.addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Forge Casing", 6, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .addOtherStructurePart("Anvil", "In the center of 3x3x3 structure", 2)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialForgeHammer> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ Map<Block, Integer> anvilTiers = new HashMap<>();
+
+ anvilTiers.put(Blocks.anvil, 1);
+
+ if (Railcraft.isModLoaded()) {
+ anvilTiers.put(GameRegistry.findBlock(Railcraft.ID, "anvil"), 2);
+ }
+
+ if (EnderIO.isModLoaded()) {
+ anvilTiers.put(GameRegistry.findBlock(EnderIO.ID, "blockDarkSteelAnvil"), 3);
+ }
+
+ if (ThaumicBases.isModLoaded()) {
+ anvilTiers.put(GameRegistry.findBlock(ThaumicBases.ID, "thaumicAnvil"), 3);
+ anvilTiers.put(GameRegistry.findBlock(ThaumicBases.ID, "voidAnvil"), 4);
+ }
+
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialForgeHammer>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "CAC", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialForgeHammer.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(TAE.getIndexFromPage(1, 11))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings5Misc, 6))))
+ .addElement(
+ 'A',
+ ofBlocksTiered(
+ anvilTierConverter(anvilTiers),
+ getAllAnvilTiers(anvilTiers),
+ 0,
+ GregtechMetaTileEntity_IndustrialForgeHammer::setAnvilTier,
+ GregtechMetaTileEntity_IndustrialForgeHammer::getAnvilTier))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ private static List<Pair<Block, Integer>> getAllAnvilTiers(Map<Block, Integer> anvilTiers) {
+ return anvilTiers.entrySet()
+ .stream()
+ .map(e -> Pair.of(e.getKey(), e.getValue()))
+ .collect(Collectors.toList());
+ }
+
+ private static ITierConverter<Integer> anvilTierConverter(Map<Block, Integer> anvilTiers) {
+ return (block, meta) -> block == null ? 0 : anvilTiers.getOrDefault(block, 0);
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.RANDOM_ANVIL_USE;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(1, 11);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.hammerRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1 / 2F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (8 * getAnvilTier() * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialForgeHammer;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ private void setAnvilTier(int tier) {
+ mAnvilTier = tier;
+ }
+
+ private int getAnvilTier() {
+ return mAnvilTier;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMacerator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMacerator.java
new file mode 100644
index 0000000000..5591b9fbe8
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMacerator.java
@@ -0,0 +1,458 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.List;
+import java.util.Random;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants.NBT;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GregtechMetaTileEntity_IndustrialMacerator
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialMacerator> implements ISurvivalConstructable {
+
+ private int controllerTier = 1;
+ private int mCasing;
+ private int mPerLayer;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialMacerator> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialMacerator(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialMacerator(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialMacerator(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Macerator/Pulverizer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller block for the Industrial Maceration Stack")
+ .addInfo("60% faster than using single block machines of the same voltage")
+ .addInfo("Maximum of n*tier parallels, LV = Tier 1, MV = Tier 2, etc.")
+ .addInfo("n=2 initially. n=8 after inserting Maceration Upgrade Chip.")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 6, 3, true)
+ .addController("Bottom center")
+ .addCasingInfoMin("Maceration Stack Casings (After upgrade)", 26, false)
+ .addCasingInfoMin("Stable Titanium Casings (Before upgrade)", 26, false)
+ .addInputBus("Bottom casing", 1)
+ .addEnergyHatch("Any casing", 1)
+ .addMaintenanceHatch("Any casing", 1)
+ .addOutputBus("One per layer except bottom layer", 2)
+ .addMufflerHatch("Any casing except bottom layer", 2)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialMacerator> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialMacerator>builder()
+ .addShape(mName + "top1", transpose(new String[][] { { "ccc", "ccc", "ccc" }, }))
+ .addShape(mName + "mid1", transpose(new String[][] { { "ccc", "c-c", "ccc" }, }))
+ .addShape(mName + "bottom1", transpose(new String[][] { { "b~b", "bbb", "bbb" }, }))
+ .addShape(mName + "top2", transpose(new String[][] { { "CCC", "CCC", "CCC" }, }))
+ .addShape(mName + "mid2", transpose(new String[][] { { "CCC", "C-C", "CCC" }, }))
+ .addShape(mName + "bottom2", transpose(new String[][] { { "B~B", "BBB", "BBB" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMacerator.class).anyOf(OutputBus)
+ .shouldReject(t -> t.mPerLayer + 1 == t.mOutputBusses.size())
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(TAE.GTPP_INDEX(7))
+ .dot(2)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMacerator.class)
+ .atLeast(Energy, Maintenance, Muffler)
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(TAE.GTPP_INDEX(7))
+ .dot(2)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 7))))
+ .addElement(
+ 'B',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMacerator.class)
+ .atLeast(Energy, Maintenance, InputBus)
+ .disallowOnly(ForgeDirection.UP)
+ .casingIndex(TAE.GTPP_INDEX(7))
+ .dot(2)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 7))))
+ .addElement(
+ 'c',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMacerator.class).anyOf(OutputBus)
+ .shouldReject(t -> t.mPerLayer + 1 == t.mOutputBusses.size())
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 2))
+ .dot(2)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMacerator.class)
+ .atLeast(Energy, Maintenance, Muffler)
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 2))
+ .dot(2)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(GregTech_API.sBlockCasings4, 2))))
+ .addElement(
+ 'b',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMacerator.class)
+ .atLeast(Energy, Maintenance, InputBus)
+ .disallowOnly(ForgeDirection.UP)
+ .casingIndex(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 2))
+ .dot(2)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(GregTech_API.sBlockCasings4, 2))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName + "bottom" + controllerTier, stackSize, hintsOnly, 1, 0, 0);
+ buildPiece(mName + "mid" + controllerTier, stackSize, hintsOnly, 1, 1, 0);
+ buildPiece(mName + "mid" + controllerTier, stackSize, hintsOnly, 1, 2, 0);
+ buildPiece(mName + "mid" + controllerTier, stackSize, hintsOnly, 1, 3, 0);
+ buildPiece(mName + "mid" + controllerTier, stackSize, hintsOnly, 1, 4, 0);
+ buildPiece(mName + "top" + controllerTier, stackSize, hintsOnly, 1, 5, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int built;
+ built = survivialBuildPiece(
+ mName + "bottom" + controllerTier,
+ stackSize,
+ 1,
+ 0,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ mPerLayer = 0;
+ if (built >= 0) return built;
+ built = survivialBuildPiece(
+ mName + "mid" + controllerTier,
+ stackSize,
+ 1,
+ 1,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ mPerLayer = 1;
+ if (built >= 0) return built;
+ built = survivialBuildPiece(
+ mName + "mid" + controllerTier,
+ stackSize,
+ 1,
+ 2,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ if (built >= 0) return built;
+ mPerLayer = 2;
+ built = survivialBuildPiece(
+ mName + "mid" + controllerTier,
+ stackSize,
+ 1,
+ 3,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ if (built >= 0) return built;
+ mPerLayer = 3;
+ built = survivialBuildPiece(
+ mName + "mid" + controllerTier,
+ stackSize,
+ 1,
+ 4,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ if (built >= 0) return built;
+ mPerLayer = 4;
+ return survivialBuildPiece(mName + "top" + controllerTier, stackSize, 1, 5, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mPerLayer = 0;
+ if (checkPiece(mName + "bottom" + controllerTier, 1, 0, 0)) {
+ while (mPerLayer < 4) {
+ if (!checkPiece(mName + "mid" + controllerTier, 1, mPerLayer + 1, 0)
+ || mPerLayer + 1 != mOutputBusses.size()) return false;
+ mPerLayer++;
+ }
+ return checkPiece(mName + "top" + controllerTier, 1, 5, 0) && mOutputBusses.size() == 5
+ && mCasing >= 26
+ && checkHatch();
+ }
+ return false;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_MACERATOR_OP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_MatterFab_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_MatterFab;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return switch (controllerTier) {
+ case 2 -> TAE.GTPP_INDEX(7);
+ default -> GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 2);
+ };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.maceratorRecipes;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -10;
+ }
+
+ @Override
+ public void onPreTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())
+ && (aBaseMetaTileEntity.getFrontFacing() != ForgeDirection.UP)
+ && (aBaseMetaTileEntity.getCoverIDAtSide(ForgeDirection.UP) == 0)
+ && (!aBaseMetaTileEntity.getOpacityAtSide(ForgeDirection.UP))) {
+ final Random tRandom = aBaseMetaTileEntity.getWorld().rand;
+ aBaseMetaTileEntity.getWorld()
+ .spawnParticle(
+ "smoke",
+ (aBaseMetaTileEntity.getXCoord() + 0.8F) - (tRandom.nextFloat() * 0.6F),
+ aBaseMetaTileEntity.getYCoord() + 0.3f + (tRandom.nextFloat() * 0.2F),
+ (aBaseMetaTileEntity.getZCoord() + 1.2F) - (tRandom.nextFloat() * 1.6F),
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide() && aTick % 20 == 0 && controllerTier == 1) {
+ ItemStack aGuiStack = this.getControllerSlot();
+ if (GregtechItemList.Maceration_Upgrade_Chip.isStackEqual(aGuiStack, false, true)) {
+ controllerTier = 2;
+ mInventory[1] = ItemUtils.depleteStack(aGuiStack);
+ markDirty();
+ // schedule a structure check
+ mUpdated = true;
+ }
+ }
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ if (controllerTier == 1 && !aPlayer.isSneaking()) {
+ ItemStack heldItem = aPlayer.getHeldItem();
+ if (GregtechItemList.Maceration_Upgrade_Chip.isStackEqual(heldItem, false, true)) {
+ controllerTier = 2;
+ aPlayer.setCurrentItemOrArmor(0, ItemUtils.depleteStack(heldItem));
+ if (getBaseMetaTileEntity().isServerSide()) {
+ markDirty();
+ aPlayer.inventory.markDirty();
+ // schedule a structure check
+ mUpdated = true;
+ }
+ return true;
+ }
+ }
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ }
+
+ @Override
+ public void onValueUpdate(byte aValue) {
+ controllerTier = aValue;
+ }
+
+ @Override
+ public byte getUpdateData() {
+ return (byte) controllerTier;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setByte("mTier", (byte) controllerTier);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (!aNBT.hasKey("mTier", NBT.TAG_BYTE))
+ // we assume old macerators are all T2 variants, as they were made before price reduction and shouldn't need
+ // to worry about upgrading
+ controllerTier = 2;
+ else controllerTier = aNBT.getByte("mTier");
+ }
+
+ @Override
+ public void initDefaultModes(NBTTagCompound aNBT) {
+ super.initDefaultModes(aNBT);
+ if (aNBT == null || !aNBT.hasKey("mTier")) {
+ controllerTier = 1;
+ } else {
+ controllerTier = aNBT.getByte("mTier");
+ }
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ super.setItemNBT(aNBT);
+ aNBT.setByte("mTier", (byte) controllerTier);
+ }
+
+ @Override
+ public void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {
+ super.addAdditionalTooltipInformation(stack, tooltip);
+ NBTTagCompound aNBT = stack.getTagCompound();
+ int tier;
+ if (aNBT == null || !aNBT.hasKey("mTier")) {
+ tier = 1;
+ } else {
+ tier = aNBT.getInteger("mTier");
+ }
+ tooltip.add(StatCollector.translateToLocalFormatted("tooltip.large_macerator.tier", tier));
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 1.6F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ final long tVoltage = getMaxInputVoltage();
+ final byte tTier = (byte) Math.max(1, GT_Utility.getTier(tVoltage));
+ return Math.max(1, (controllerTier == 1 ? 2 : 8) * tTier);
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMacerator;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return true;
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ tag.setInteger("tier", controllerTier);
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ final NBTTagCompound tag = accessor.getNBTData();
+ if (tag.hasKey("tier")) {
+ currentTip.add(
+ "Tier: " + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(tag.getInteger("tier"))
+ + EnumChatFormatting.RESET);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMixer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMixer.java
new file mode 100644
index 0000000000..3f4c4ccfa4
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMixer.java
@@ -0,0 +1,213 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialMixer
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialMixer> implements ISurvivalConstructable {
+
+ public static int CASING_TEXTURE_ID;
+ public static String mCasingName = "Multi-Use Casing";
+ public static String mCasingName2 = "Titanium Turbine Casing";
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialMixer> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialMixer(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 2);
+ inputSeparation = true;
+ }
+
+ public GregtechMetaTileEntity_IndustrialMixer(final String aName) {
+ super(aName);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 2);
+ inputSeparation = true;
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
+ if (aNBT.hasKey("isBussesSeparate")) {
+ inputSeparation = aNBT.getBoolean("isBussesSeparate");
+ }
+ // Fallback for existing mixers
+ else {
+ inputSeparation = true;
+ }
+ }
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialMixer(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Mixer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Mixer")
+ .addInfo("250% faster than using single block machines of the same voltage")
+ .addInfo("Processes eight recipes per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 4, 3, false)
+ .addController("Second Layer Center")
+ .addCasingInfoMin(mCasingName, 6, false)
+ .addCasingInfoMin(mCasingName2, 2, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialMixer> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialMixer>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "CCC", "CMC", "CCC" }, { "C~C", "CMC", "CCC" },
+ { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMixer.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 2))))
+ .addElement('M', ofBlock(GregTech_API.sBlockCasings4, 11))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 2, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 2, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 2, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_COMPRESSOR_OP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.mixerNonCellRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 3.5F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (8 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMixer;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ inputSeparation = !inputSeparation;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation);
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMolecularTransformer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMolecularTransformer.java
new file mode 100644
index 0000000000..02b0bcf978
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMolecularTransformer.java
@@ -0,0 +1,241 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialMolecularTransformer
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialMolecularTransformer>
+ implements ISurvivalConstructable {
+
+ private static final int CASING_TEXTURE_ID = 48;
+ private int mCasing = 0;
+
+ public GregtechMetaTileEntity_IndustrialMolecularTransformer(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialMolecularTransformer(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialMolecularTransformer(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Molecular Transformer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Changes the structure of items to produce new ones")
+ .addInfo("Maximum 1x of each bus/hatch.")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(7, 7, 7, false)
+ .addController("Top Center")
+ .addCasingInfoMin("Robust Tungstensteel Machine Casing", 40, false)
+ .addCasingInfoMin("Tungstensteel Coils", 16, false)
+ .addCasingInfoMin("Molecular Containment Casing", 52, false)
+ .addCasingInfoMin("High Voltage Current Capacitor", 32, false)
+ .addCasingInfoMin("Particle Containment Casing", 4, false)
+ .addCasingInfoMin("Resonance Chamber I", 5, false)
+ .addCasingInfoMin("Modulator I", 4, false)
+ .addInputBus("Any Robust Tungstensteel Machine Casing", 1)
+ .addOutputBus("Any Robust Tungstensteel Machine Casing", 1)
+ .addEnergyHatch("Any Robust Tungstensteel Machine Casing", 1)
+ .addMaintenanceHatch("Any Robust Tungstensteel Machine Casing", 1)
+ .addMufflerHatch("Any Robust Tungstensteel Machine Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialMolecularTransformer> STRUCTURE_DEFINITION = null;
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialMolecularTransformer> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialMolecularTransformer>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ (new String[][] { { " ", " ", " xxx ", " x~x ", " xxx ", " ", " " },
+ { " ", " xxx ", " xyyyx ", " xyzyx ", " xyyyx ", " xxx ", " " },
+ { " ", " xxx ", " xyyyx ", " xyzyx ", " xyyyx ", " xxx ", " " },
+ { " ", " xxx ", " xyyyx ", " xyzyx ", " xyyyx ", " xxx ", " " },
+ { " t ", " ttxtt ", " tyyyt ", "txyzyxt", " tyyyt ", " ttxtt ", " t " },
+ { " c ", " ccecc ", " cxfxc ", "cefefec", " cxfxc ", " ccecc ", " c " },
+ { " h ", " hhhhh ", " hhhhh ", "hhhhhhh", " hhhhh ", " hhhhh ", " h " }, }))
+ .addElement('x', ofBlock(getCasingBlock(), getCasingMeta()))
+ .addElement('y', ofBlock(getCasingBlock(), getCasingMeta2()))
+ .addElement('z', ofBlock(getCasingBlock(), getCasingMeta3()))
+ .addElement('e', ofBlock(getCasingBlock2(), 0))
+ .addElement('f', ofBlock(getCasingBlock2(), 4))
+ .addElement('c', ofBlock(getCoilBlock(), 3))
+ .addElement('t', ofBlock(getCasingBlock3(), getTungstenCasingMeta()))
+ .addElement(
+ 'h',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMolecularTransformer.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(
+ onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock3(), getTungstenCasingMeta()))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ boolean aDidBuild = checkPiece(STRUCTURE_PIECE_MAIN, 3, 3, 0);
+ if (this.mInputBusses.size() != 1 || this.mOutputBusses.size() != 1 || this.mEnergyHatches.size() != 1) {
+ return false;
+ }
+ // there are 16 slot that only allow casing, so we subtract this from the grand total required
+ return aDidBuild && mCasing >= 40 - 16 && checkHatch();
+ }
+
+ protected static int getCasingTextureIndex() {
+ return CASING_TEXTURE_ID;
+ }
+
+ protected static Block getCasingBlock() {
+ return ModBlocks.blockSpecialMultiCasings;
+ }
+
+ protected static Block getCasingBlock2() {
+ return ModBlocks.blockSpecialMultiCasings2;
+ }
+
+ protected static Block getCasingBlock3() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ protected static Block getCoilBlock() {
+ return GregTech_API.sBlockCasings5;
+ }
+
+ protected static int getCasingMeta() {
+ return 11;
+ }
+
+ protected static int getCasingMeta2() {
+ return 12;
+ }
+
+ protected static int getCasingMeta3() {
+ return 13;
+ }
+
+ protected static int getTungstenCasingMeta() {
+ return 0;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d == ForgeDirection.UP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 44;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.molecularTransformerRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic();
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiMolecularTransformer;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMultiMachine.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMultiMachine.java
new file mode 100644
index 0000000000..52c7736ae3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialMultiMachine.java
@@ -0,0 +1,514 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_CraftingInput_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Input_ME;
+import gregtech.common.tileentities.machines.IDualInputHatch;
+import gregtech.common.tileentities.machines.IDualInputInventory;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Solidifier;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GregtechMetaTileEntity_IndustrialMultiMachine extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialMultiMachine> implements ISurvivalConstructable {
+
+ protected int mInternalMode = 0;
+ private static final int MODE_COMPRESSOR = 0;
+ private static final int MODE_LATHE = 1;
+ private static final int MODE_MAGNETIC = 2;
+ private static final int MODE_FERMENTER = 3;
+ private static final int MODE_FLUIDEXTRACT = 4;
+ private static final int MODE_EXTRACTOR = 5;
+ private static final int MODE_LASER = 6;
+ private static final int MODE_AUTOCLAVE = 7;
+ private static final int MODE_FLUIDSOLIDIFY = 8;
+ private static final int[][] MODE_MAP = new int[][] { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 } };
+ public static final String[] aToolTipNames = new String[9];
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialMultiMachine> STRUCTURE_DEFINITION = null;
+
+ static {
+ for (int id = 0; id < 9; id++) {
+ RecipeMap<?> recipeMap = getRecipeMap(id);
+ if (recipeMap != null) {
+ String aNEI = GT_LanguageManager.getTranslation(getRecipeMap(id).unlocalizedName);
+ aToolTipNames[id] = aNEI != null ? aNEI : "BAD NEI NAME (Report to Github)";
+ }
+ }
+ }
+
+ public GregtechMetaTileEntity_IndustrialMultiMachine(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialMultiMachine(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialMultiMachine(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Nine in One";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ String[] aBuiltStrings = new String[3];
+ aBuiltStrings[0] = aToolTipNames[0] + ", " + aToolTipNames[1] + ", " + aToolTipNames[2];
+ aBuiltStrings[1] = aToolTipNames[3] + ", " + aToolTipNames[4] + ", " + aToolTipNames[5];
+ aBuiltStrings[2] = aToolTipNames[6] + ", " + aToolTipNames[7] + ", " + aToolTipNames[8];
+
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Multi-Machine")
+ .addInfo("250% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 80% of the EU/t normally required")
+ .addInfo("Processes two items per voltage tier")
+ .addInfo("Machine Type: Metal - " + EnumChatFormatting.YELLOW + aBuiltStrings[0] + EnumChatFormatting.RESET)
+ .addInfo("Machine Type: Fluid - " + EnumChatFormatting.YELLOW + aBuiltStrings[1] + EnumChatFormatting.RESET)
+ .addInfo("Machine Type: Misc - " + EnumChatFormatting.YELLOW + aBuiltStrings[2] + EnumChatFormatting.RESET)
+ .addInfo("Read Multi-Machine Manual for extra information")
+ .addInfo(
+ EnumChatFormatting.AQUA + "You can use Solidifier Hatch to solidify multiple liquids."
+ + EnumChatFormatting.RESET)
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Multi-Use Casings", 6, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialMultiMachine> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialMultiMachine>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialMultiMachine.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(getTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 2))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return getTextureIndex();
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (2 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ if (mInternalMode == 0) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMultiMachine_ModeMetal;
+ } else if (mInternalMode == 1) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMultiMachine_ModeFluid;
+ } else { // config 2
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialMultiMachine_ModeMisc;
+ }
+ }
+
+ public int getTextureIndex() {
+ return TAE.getIndexFromPage(2, 2);
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ private ItemStack getCircuit(ItemStack[] t) {
+ for (ItemStack j : t) {
+ if (j.getItem() == CI.getNumberedCircuit(0)
+ .getItem()) {
+ if (j.getItemDamage() >= 20 && j.getItemDamage() <= 22) {
+ return j;
+ }
+ }
+ }
+ return null;
+ }
+
+ private int getCircuitID(ItemStack circuit) {
+ int H = circuit.getItemDamage();
+ int T = (H == 20 ? 0 : (H == 21 ? 1 : (H == 22 ? 2 : -1)));
+ return MODE_MAP[this.mInternalMode][T];
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return null;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(
+ RecipeMaps.compressorRecipes,
+ RecipeMaps.latheRecipes,
+ RecipeMaps.polarizerRecipes,
+ RecipeMaps.fermentingRecipes,
+ RecipeMaps.fluidExtractionRecipes,
+ RecipeMaps.extractorRecipes,
+ RecipeMaps.laserEngraverRecipes,
+ RecipeMaps.autoclaveRecipes,
+ RecipeMaps.fluidSolidifierRecipes);
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -10;
+ }
+
+ private static RecipeMap<?> getRecipeMap(int aMode) {
+ if (aMode == MODE_COMPRESSOR) {
+ return RecipeMaps.compressorRecipes;
+ } else if (aMode == MODE_LATHE) {
+ return RecipeMaps.latheRecipes;
+ } else if (aMode == MODE_MAGNETIC) {
+ return RecipeMaps.polarizerRecipes;
+ } else if (aMode == MODE_FERMENTER) {
+ return RecipeMaps.fermentingRecipes;
+ } else if (aMode == MODE_FLUIDEXTRACT) {
+ return RecipeMaps.fluidExtractionRecipes;
+ } else if (aMode == MODE_EXTRACTOR) {
+ return RecipeMaps.extractorRecipes;
+ } else if (aMode == MODE_LASER) {
+ return RecipeMaps.laserEngraverRecipes;
+ } else if (aMode == MODE_AUTOCLAVE) {
+ return RecipeMaps.autoclaveRecipes;
+ } else if (aMode == MODE_FLUIDSOLIDIFY) {
+ return RecipeMaps.fluidSolidifierRecipes;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ private ItemStack lastCircuit = null;
+
+ @Nonnull
+ @Override
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ ItemStack circuit = getCircuit(inputItems);
+ if (circuit == null) {
+ return Stream.empty();
+ }
+ if (!GT_Utility.areStacksEqual(circuit, lastCircuit)) {
+ lastRecipe = null;
+ lastCircuit = circuit;
+ }
+ RecipeMap<?> foundMap = getRecipeMap(getCircuitID(circuit));
+ if (foundMap == null) {
+ return Stream.empty();
+ }
+ return super.findRecipeMatches(foundMap);
+ }
+ }.setSpeedBonus(1F / 3.5F)
+ .setEuModifier(0.8F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (mInternalMode < 2) {
+ mInternalMode++;
+ } else {
+ mInternalMode = 0;
+ }
+ String mModeString = (mInternalMode == 0 ? "Metal"
+ : mInternalMode == 1 ? "Fluid" : mInternalMode == 2 ? "Misc." : "null");
+ PlayerUtils.messagePlayer(aPlayer, "Multi-Machine is now in " + mModeString + " mode.");
+ mLastRecipe = null;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ String[] data = super.getInfoData();
+ ArrayList<String> mInfo = new ArrayList<>(Arrays.asList(data));
+ String mode;
+ if (mInternalMode == 0) {
+ mode = StatCollector.translateToLocal("GTPP.multiblock.multimachine.metal");
+ } else if (mInternalMode == 1) {
+ mode = StatCollector.translateToLocal("GTPP.multiblock.multimachine.fluid");
+ } else {
+ mode = StatCollector.translateToLocal("GTPP.multiblock.multimachine.misc");
+ }
+ mInfo.add(mode);
+ return mInfo.toArray(new String[0]);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mInternalMode", mInternalMode);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ this.mInternalMode = aNBT.getInteger("mInternalMode");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public boolean isInputSeparationEnabled() {
+ return true;
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ tag.setInteger("mode", mInternalMode);
+ }
+
+ @Override
+ protected CheckRecipeResult doCheckRecipe() {
+
+ if (mInternalMode != 2 || !isInputSeparationEnabled()) {
+ return super.doCheckRecipe();
+ } else {
+ CheckRecipeResult result = CheckRecipeResultRegistry.NO_RECIPE;
+
+ // check crafting input hatches first
+ if (supportsCraftingMEBuffer()) {
+ for (IDualInputHatch dualInputHatch : mDualInputHatches) {
+ for (var it = dualInputHatch.inventories(); it.hasNext();) {
+ IDualInputInventory slot = it.next();
+ processingLogic.setInputItems(slot.getItemInputs());
+ processingLogic.setInputFluids(slot.getFluidInputs());
+ CheckRecipeResult foundResult = processingLogic.process();
+ if (foundResult.wasSuccessful()) {
+ return foundResult;
+ }
+ if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) {
+ // Recipe failed in interesting way, so remember that and continue searching
+ result = foundResult;
+ }
+ }
+ }
+ }
+
+ // Logic for GT_MetaTileEntity_Hatch_Solidifier
+ for (GT_MetaTileEntity_Hatch_Input solidifierHatch : mInputHatches) {
+ if (solidifierHatch instanceof GT_MetaTileEntity_Hatch_Solidifier) {
+ ItemStack mold = ((GT_MetaTileEntity_Hatch_Solidifier) solidifierHatch).getMold();
+ FluidStack fluid = solidifierHatch.getFluid();
+
+ if (mold != null && fluid != null) {
+ List<ItemStack> inputItems = new ArrayList<>();
+ inputItems.add(mold);
+ inputItems.add(ItemUtils.getGregtechCircuit(22));
+
+ processingLogic.setInputItems(inputItems.toArray(new ItemStack[0]));
+ processingLogic.setInputFluids(fluid);
+
+ CheckRecipeResult foundResult = processingLogic.process();
+ if (foundResult.wasSuccessful()) {
+ return foundResult;
+ }
+ if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) {
+ // Recipe failed in interesting way, so remember that and continue searching
+ result = foundResult;
+ }
+ }
+ }
+ }
+ processingLogic.clear();
+ processingLogic.setInputFluids(getStoredFluids());
+ // Default logic
+ for (GT_MetaTileEntity_Hatch_InputBus bus : mInputBusses) {
+ if (bus instanceof GT_MetaTileEntity_Hatch_CraftingInput_ME) {
+ continue;
+ }
+ List<ItemStack> inputItems = new ArrayList<>();
+ for (int i = bus.getSizeInventory() - 1; i >= 0; i--) {
+ ItemStack stored = bus.getStackInSlot(i);
+ if (stored != null) {
+ inputItems.add(stored);
+ }
+ }
+ if (canUseControllerSlotForRecipe() && getControllerSlot() != null) {
+ inputItems.add(getControllerSlot());
+ }
+ processingLogic.setInputItems(inputItems.toArray(new ItemStack[0]));
+ CheckRecipeResult foundResult = processingLogic.process();
+ if (foundResult.wasSuccessful()) {
+ return foundResult;
+ }
+ if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) {
+ // Recipe failed in interesting way, so remember that and continue searching
+ result = foundResult;
+ }
+ }
+
+ return result;
+ }
+ }
+
+ @Override
+ public ArrayList<FluidStack> getStoredFluids() {
+ ArrayList<FluidStack> rList = new ArrayList<>();
+ for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) {
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_Solidifier) {
+ continue;
+ }
+
+ setHatchRecipeMap(tHatch);
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_MultiInput) {
+ for (FluidStack tFluid : ((GT_MetaTileEntity_Hatch_MultiInput) tHatch).getStoredFluid()) {
+ if (tFluid != null) {
+ rList.add(tFluid);
+ }
+ }
+ } else if (tHatch instanceof GT_MetaTileEntity_Hatch_Input_ME) {
+ if (tHatch.isValid()) {
+ for (FluidStack fluidStack : ((GT_MetaTileEntity_Hatch_Input_ME) tHatch).getStoredFluids()) {
+ if (fluidStack == null) continue;
+ rList.add(fluidStack);
+ }
+ }
+ } else {
+ if (tHatch.getFillableStack() != null) {
+ rList.add(tHatch.getFillableStack());
+ }
+ }
+ }
+
+ return rList;
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ final NBTTagCompound tag = accessor.getNBTData();
+ if (tag.hasKey("mode")) {
+ currentTip.add("Mode: " + EnumChatFormatting.YELLOW + switch (tag.getInteger("mode")) {
+ case 1 -> "Fluid";
+ case 2 -> "Misc";
+ default -> "Metal";
+ } + EnumChatFormatting.RESET);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialPlatePress.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialPlatePress.java
new file mode 100644
index 0000000000..972cf492b6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialPlatePress.java
@@ -0,0 +1,218 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialPlatePress
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialPlatePress> implements ISurvivalConstructable {
+
+ private boolean mFormingMode = false;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialPlatePress> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialPlatePress(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialPlatePress(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialPlatePress(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Bending Machine, Forming Press";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for Advanced Bending & Forming")
+ .addInfo("500% faster than using single block machines of the same voltage")
+ .addInfo("Processes four items per voltage tier")
+ .addInfo("Circuit for recipe goes in the Input Bus")
+ .addInfo("Each Input Bus can have a different Circuit/Shape!")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Material Press Machine Casings", 6, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialPlatePress> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialPlatePress>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialPlatePress.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(50)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 4))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 6 && checkHatch();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_COMPRESSOR_OP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 50;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return mFormingMode ? RecipeMaps.formingPressRecipes : RecipeMaps.benderRecipes;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(RecipeMaps.formingPressRecipes, RecipeMaps.benderRecipes);
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 6F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ if (this.mFormingMode) return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialPlatePress_ModeForming;
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialPlatePress_ModeBending;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setBoolean("mFormingMode", mFormingMode);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mFormingMode = aNBT.getBoolean("mFormingMode");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mFormingMode = !mFormingMode;
+ if (mFormingMode) {
+ PlayerUtils.messagePlayer(aPlayer, "Now running in Forming Press Mode.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Now running in Bending Mode.");
+ }
+ mLastRecipe = null;
+ }
+
+ @Override
+ public boolean isInputSeparationEnabled() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialSifter.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialSifter.java
new file mode 100644
index 0000000000..e4dd3d11ba
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialSifter.java
@@ -0,0 +1,209 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.Random;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialSifter
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialSifter> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialSifter> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialSifter(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialSifter(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialSifter(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Sifter";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Sifter")
+ .addInfo("400% faster than single-block machines of the same voltage")
+ .addInfo("Only uses 75% of the EU/t normally required")
+ .addInfo("Processes four items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(5, 3, 5, false)
+ .addController("Bottom Center")
+ .addCasingInfoMin("Sieve Grate", 18, false)
+ .addCasingInfoMin("Sieve Casings", 35, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialSifter> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialSifter>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCCCC", "CMMMC", "CMMMC", "CMMMC", "CCCCC" },
+ { "CCCCC", "CMMMC", "CMMMC", "CMMMC", "CCCCC" },
+ { "CC~CC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialSifter.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(TAE.GTPP_INDEX(21))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 5))))
+ .addElement('M', ofBlock(ModBlocks.blockCasings2Misc, 6))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 2, 2, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 2, 2, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 2, 2, 0) && mCasing >= 35 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(21);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.sifterRecipes;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ public void onPreTick(final IGregTechTileEntity aBaseMetaTileEntity, final long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())
+ && (aBaseMetaTileEntity.getFrontFacing() != ForgeDirection.UP)
+ && (aBaseMetaTileEntity.getCoverIDAtSide(ForgeDirection.UP) == 0)
+ && (!aBaseMetaTileEntity.getOpacityAtSide(ForgeDirection.UP))) {
+ final Random tRandom = aBaseMetaTileEntity.getWorld().rand;
+ if (tRandom.nextFloat() > 0.4) return;
+
+ final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX * 2;
+ final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ * 2;
+
+ aBaseMetaTileEntity.getWorld()
+ .spawnParticle(
+ "smoke",
+ (aBaseMetaTileEntity.getXCoord() + xDir + 2.1F) - (tRandom.nextFloat() * 3.2F),
+ aBaseMetaTileEntity.getYCoord() + 2.5f + (tRandom.nextFloat() * 1.2F),
+ (aBaseMetaTileEntity.getZCoord() + zDir + 2.1F) - (tRandom.nextFloat() * 3.2F),
+ 0.0,
+ 0.0,
+ 0.0);
+ }
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 5F)
+ .setEuModifier(0.75F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialSifter;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialThermalCentrifuge.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialThermalCentrifuge.java
new file mode 100644
index 0000000000..14ff4ebb6d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialThermalCentrifuge.java
@@ -0,0 +1,184 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialThermalCentrifuge extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialThermalCentrifuge> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialThermalCentrifuge> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialThermalCentrifuge(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialThermalCentrifuge(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialThermalCentrifuge(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Thermal Centrifuge";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Thermal Centrifuge")
+ .addInfo("150% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 80% of the EU/t normally required")
+ .addInfo("Processes eight items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 2, 3, false)
+ .addController("Front Center")
+ .addCasingInfoMin("Thermal Processing Casings/Noise Hazard Sign Blocks", 8, false)
+ .addInputBus("Bottom Casing", 1)
+ .addOutputBus("Bottom Casing", 1)
+ .addEnergyHatch("Bottom Casing", 1)
+ .addMaintenanceHatch("Bottom Casing", 1)
+ .addMufflerHatch("Bottom Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialThermalCentrifuge> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialThermalCentrifuge>builder()
+ .addShape(mName, transpose(new String[][] { { "X~X", "XXX", "XXX" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialThermalCentrifuge.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 0)),
+ onElementPass(x -> ++x.mCasing, ofBlock(GregTech_API.sBlockCasings3, 9))))
+ .addElement(
+ 'X',
+ ofChain(
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 0)),
+ onElementPass(x -> ++x.mCasing, ofBlock(GregTech_API.sBlockCasings3, 9))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 0, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 0, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 0, 0) && mCasing >= 8 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return getCasingTextureIndex();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.thermalCentrifugeRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2.5F)
+ .setEuModifier(0.8F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (8 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialThermalCentrifuge;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 0;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.GTPP_INDEX(16);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialVacuumFreezer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialVacuumFreezer.java
new file mode 100644
index 0000000000..aba508e183
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialVacuumFreezer.java
@@ -0,0 +1,261 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Objects;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GT_MetaTileEntity_Hatch_CustomFluidBase;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialVacuumFreezer extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialVacuumFreezer> implements ISurvivalConstructable {
+
+ public static int CASING_TEXTURE_ID;
+ public static String mCryoFuelName = "Gelid Cryotheum";
+ public static String mCasingName = "Advanced Cryogenic Casing";
+ public static String mHatchName = "Cryotheum Hatch";
+ public static FluidStack mFuelStack;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialVacuumFreezer> STRUCTURE_DEFINITION = null;
+
+ private final ArrayList<GT_MetaTileEntity_Hatch_CustomFluidBase> mCryotheumHatches = new ArrayList<>();
+
+ public GregtechMetaTileEntity_IndustrialVacuumFreezer(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ mFuelStack = FluidUtils.getFluidStack("cryotheum", 1);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 10);
+ }
+
+ public GregtechMetaTileEntity_IndustrialVacuumFreezer(final String aName) {
+ super(aName);
+ mFuelStack = FluidUtils.getFluidStack("cryotheum", 1);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 10);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return (IMetaTileEntity) new GregtechMetaTileEntity_IndustrialVacuumFreezer(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Vacuum Freezer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Factory Grade Advanced Vacuum Freezer")
+ .addInfo("Speed: +100% | EU Usage: 100% | Parallel: 4")
+ .addInfo("Consumes 20L of " + mCryoFuelName + "/s during operation")
+ .addInfo("Constructed exactly the same as a normal Vacuum Freezer")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin(mCasingName, 10, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addOtherStructurePart(mHatchName, "Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialVacuumFreezer> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialVacuumFreezer>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialVacuumFreezer.class)
+ .adder(GregtechMetaTileEntity_IndustrialVacuumFreezer::addCryotheumHatch)
+ .hatchId(967)
+ .shouldReject(t -> !t.mCryotheumHatches.isEmpty())
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialVacuumFreezer.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 10))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mCryotheumHatches.clear();
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 10 && checkHatch();
+ }
+
+ @Override
+ public boolean checkHatch() {
+ return super.checkHatch() && !mCryotheumHatches.isEmpty();
+ }
+
+ private boolean addCryotheumHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_CustomFluidBase
+ && aMetaTileEntity.getBaseMetaTileEntity()
+ .getMetaTileID() == 967) {
+ return addToMachineListInternal(mCryotheumHatches, aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void updateSlots() {
+ for (GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(mCryotheumHatches)) tHatch.updateSlots();
+ super.updateSlots();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.advancedFreezerRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 4;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialVacuumFreezer;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ private int mGraceTimer = 2;
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ /*
+ * if (this.getBaseMetaTileEntity().isActive()) { if (!this.depleteInput(mFuelStack.copy())) {
+ * this.getBaseMetaTileEntity().setActive(false); } }
+ */
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+
+ if (this.mStartUpCheck < 0) {
+ if (this.mMaxProgresstime > 0 && this.mProgresstime != 0 || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()) {
+ if (aTick % 10 == 0 || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()) {
+ if (!this.depleteInputFromRestrictedHatches(this.mCryotheumHatches, 10)) {
+ if (mGraceTimer-- == 0) {
+ this.causeMaintenanceIssue();
+ this.stopMachine(
+ ShutDownReasonRegistry
+ .outOfFluid(Objects.requireNonNull(FluidUtils.getFluidStack("cryotheum", 20))));
+ mGraceTimer = 2;
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWashPlant.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWashPlant.java
new file mode 100644
index 0000000000..a12db63f4e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWashPlant.java
@@ -0,0 +1,372 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.isAir;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import ic2.core.init.BlocksItems;
+import ic2.core.init.InternalName;
+
+public class GregtechMetaTileEntity_IndustrialWashPlant
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialWashPlant> implements ISurvivalConstructable {
+
+ private int mMode = 0;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialWashPlant> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialWashPlant(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialWashPlant(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialWashPlant(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Ore Washer, Simple Washer, Chemical Bath";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Wash Plant")
+ .addInfo("Can be configured with a screwdriver to also do Simple Washer and process Chemical Bathing")
+ .addInfo("400% faster than using single block machines of the same voltage")
+ .addInfo("Processes four item per voltage tier")
+ .addInfo("Always requires an Input Hatch full of water to refill structure")
+ .addInfo("Need to be filled with water.")
+ .addInfo("Will automatically fill water from input hatch.")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(5, 3, 7, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Wash Plant Casings", 40, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialWashPlant> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialWashPlant>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCCCC", "CwwwC", "CwwwC", "CwwwC", "CwwwC", "CwwwC", "CCCCC" },
+ { "CC~CC", "CwwwC", "CwwwC", "CwwwC", "CwwwC", "CwwwC", "CCCCC" },
+ { "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialWashPlant.class)
+ .atLeast(InputBus, InputHatch, OutputHatch, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .addElement(
+ 'w',
+ ofChain(
+ isAir(),
+ ofBlockAnyMeta(Blocks.water),
+ ofBlockAnyMeta(Blocks.flowing_water),
+ ofBlockAnyMeta(BlocksItems.getFluidBlock(InternalName.fluidDistilledWater))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 2, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 2, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 2, 1, 0) && mCasing >= 40 && checkHatch();
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ // don't rotate a washer, water will flow out.
+ return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return getCasingTextureIndex();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return mMode == 0 ? RecipeMaps.oreWasherRecipes
+ : mMode == 1 ? GTPPRecipeMaps.simpleWasherRecipes : RecipeMaps.chemicalBathRecipes;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays
+ .asList(RecipeMaps.oreWasherRecipes, GTPPRecipeMaps.simpleWasherRecipes, RecipeMaps.chemicalBathRecipes);
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -10;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ if (checkForWater()) {
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ return SimpleCheckRecipeResult.ofFailure("no_water");
+ }
+ }.setSpeedBonus(1F / 5F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ if (mMode == 2) return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialWashPlant_ModeChemBath;
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialWashPlant_ModeWasher;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 4;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.GTPP_INDEX(11);
+ }
+
+ public boolean checkForWater() {
+
+ // Get Facing direction
+ IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity();
+ int mDirectionX = aBaseMetaTileEntity.getBackFacing().offsetX;
+ int mCurrentDirectionX;
+ int mCurrentDirectionZ;
+ int mOffsetX_Lower = 0;
+ int mOffsetX_Upper = 0;
+ int mOffsetZ_Lower = 0;
+ int mOffsetZ_Upper = 0;
+
+ if (mDirectionX == 0) {
+ mCurrentDirectionX = 2;
+ mCurrentDirectionZ = 3;
+ mOffsetX_Lower = -2;
+ mOffsetX_Upper = 2;
+ mOffsetZ_Lower = -3;
+ mOffsetZ_Upper = 3;
+ } else {
+ mCurrentDirectionX = 3;
+ mCurrentDirectionZ = 2;
+ mOffsetX_Lower = -3;
+ mOffsetX_Upper = 3;
+ mOffsetZ_Lower = -2;
+ mOffsetZ_Upper = 2;
+ }
+
+ // if (aBaseMetaTileEntity.fac)
+
+ final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX * mCurrentDirectionX;
+ final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ * mCurrentDirectionZ;
+
+ int tAmount = 0;
+ for (int i = mOffsetX_Lower + 1; i <= mOffsetX_Upper - 1; ++i) {
+ for (int j = mOffsetZ_Lower + 1; j <= mOffsetZ_Upper - 1; ++j) {
+ for (int h = 0; h < 2; ++h) {
+ Block tBlock = aBaseMetaTileEntity.getBlockOffset(xDir + i, h, zDir + j);
+ byte tMeta = aBaseMetaTileEntity.getMetaIDOffset(xDir + i, h, zDir + j);
+ if (tBlock == Blocks.air || tBlock == Blocks.flowing_water || tBlock == Blocks.water) {
+ if (this.getStoredFluids() != null) {
+ for (FluidStack stored : this.getStoredFluids()) {
+ if (stored.isFluidEqual(FluidUtils.getFluidStack("water", 1))) {
+ if (stored.amount >= 1000) {
+ // Utils.LOG_WARNING("Going to try swap an air block for water from inut bus.");
+ stored.amount -= 1000;
+ Block fluidUsed = null;
+ if (tBlock == Blocks.air || tBlock == Blocks.flowing_water) {
+ fluidUsed = Blocks.water;
+ }
+ if (tBlock == Blocks.water) {
+ fluidUsed = BlocksItems.getFluidBlock(InternalName.fluidDistilledWater);
+ }
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(
+ aBaseMetaTileEntity.getXCoord() + xDir + i,
+ aBaseMetaTileEntity.getYCoord() + h,
+ aBaseMetaTileEntity.getZCoord() + zDir + j,
+ fluidUsed);
+ }
+ }
+ }
+ }
+ }
+ if (tBlock == Blocks.water) {
+ ++tAmount;
+ // Utils.LOG_WARNING("Found Water");
+ } else if (tBlock == BlocksItems.getFluidBlock(InternalName.fluidDistilledWater)) {
+ ++tAmount;
+ ++tAmount;
+ // Utils.LOG_WARNING("Found Distilled Water");
+ }
+ }
+ }
+ }
+
+ boolean isValidWater = tAmount >= 45;
+ if (isValidWater) {
+ Logger.WARNING("Filled structure.");
+ } else {
+ Logger.WARNING("Did not fill structure.");
+ }
+ return isValidWater;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mMode", mMode);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ if (aNBT.hasKey("mChemicalMode")) {
+ boolean aTempMode = aNBT.getBoolean("mChemicalMode");
+ if (aTempMode) {
+ mMode = 2;
+ } else {
+ mMode = 0;
+ }
+ aNBT.removeTag("mChemicalMode");
+ }
+ if (aNBT.hasKey("mMode")) {
+ mMode = aNBT.getInteger("mMode");
+ }
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mMode++;
+ if (mMode > 2) {
+ mMode = 0;
+ }
+ if (mMode == 0) {
+ PlayerUtils.messagePlayer(aPlayer, "Wash Plant is now running in Ore Washer Mode.");
+ } else if (mMode == 1) {
+ PlayerUtils.messagePlayer(aPlayer, "Wash Plant is now running in Simple Washer Mode.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Wash Plant is now running in Chemical Bath Mode.");
+ }
+ mLastRecipe = null;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWireMill.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWireMill.java
new file mode 100644
index 0000000000..15ae5a96f8
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IndustrialWireMill.java
@@ -0,0 +1,215 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialWireMill
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialWireMill> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialWireMill> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialWireMill(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ inputSeparation = true;
+ }
+
+ public GregtechMetaTileEntity_IndustrialWireMill(final String aName) {
+ super(aName);
+ inputSeparation = true;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialWireMill(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Wiremill";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Wire Factory")
+ .addInfo("200% faster than using single block machines of the same voltage")
+ .addInfo("Only uses 75% of the EU/t normally required")
+ .addInfo("Processes four items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 5, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Wire Factory Casings", 14, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialWireMill> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialWireMill>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC", "CCC", "CCC" }, { "C~C", "C-C", "C-C", "C-C", "CCC" },
+ { "CCC", "CCC", "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialWireMill.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 14 && checkHatch();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_RECYCLER_OP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(6);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.wiremillRecipes;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 3F)
+ .setEuModifier(0.75F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ inputSeparation = !inputSeparation;
+ aPlayer.addChatMessage(
+ new ChatComponentTranslation(
+ inputSeparation ? "interaction.separateBusses.enabled" : "interaction.separateBusses.disabled"));
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
+ inputSeparation = aNBT.getBoolean("isBussesSeparate");
+ }
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialWireMill;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasingsMisc;
+ }
+
+ public byte getCasingMeta() {
+ return 6;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) TAE.GTPP_INDEX(6);
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IsaMill.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IsaMill.java
new file mode 100644
index 0000000000..c14cae9b88
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_IsaMill.java
@@ -0,0 +1,529 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import net.minecraft.block.Block;
+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.DamageSource;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.chemistry.general.ItemGenericChemBase;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.EntityUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers.GT_MetaTileEntity_Hatch_MillingBalls;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.CustomIcon;
+
+public class GregtechMetaTileEntity_IsaMill extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IsaMill>
+ implements ISurvivalConstructable {
+
+ protected boolean boostEu = false;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IsaMill> STRUCTURE_DEFINITION = null;
+
+ private static final IIconContainer frontFaceActive = new CustomIcon("iconsets/Grinder/GRINDER_ACTIVE5");
+ private static final IIconContainer frontFace = new CustomIcon("iconsets/Grinder/GRINDER5");
+
+ private final ArrayList<GT_MetaTileEntity_Hatch_MillingBalls> mMillingBallBuses = new ArrayList<>();
+ private static final DamageSource mIsaMillDamageSource = new DamageSource("gtpp.grinder").setDamageBypassesArmor();
+
+ public GregtechMetaTileEntity_IsaMill(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IsaMill(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Large Grinding Machine")
+ .addInfo("Grind ores.")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 7, false)
+ .addController("Front Center")
+ .addCasingInfoMin("IsaMill Exterior Casing", 40, false)
+ .addOtherStructurePart("IsaMill Gearbox", "5x, Inner Blocks")
+ .addOtherStructurePart("IsaMill Piping", "8x, ring around controller")
+ .addStructureInfo("IsaMill Pipings must not be obstructed in front (only air blocks)")
+ .addOtherStructurePart("Milling Ball Hatch", "Any Casing")
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IsaMill> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IsaMill>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "DDD", "CCC", "CCC", "CCC", "CCC", "CCC", "CCC" },
+ { "D~D", "CGC", "CGC", "CGC", "CGC", "CGC", "CCC" },
+ { "DDD", "CCC", "CCC", "CCC", "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_IsaMill.class)
+ .adder(GregtechMetaTileEntity_IsaMill::addMillingBallsHatch)
+ .hatchClass(GT_MetaTileEntity_Hatch_MillingBalls.class)
+ .shouldReject(t -> !t.mMillingBallBuses.isEmpty())
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_IsaMill.class)
+ .atLeast(InputBus, OutputBus, InputHatch, OutputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .addElement('D', ofBlock(getIntakeBlock(), getIntakeMeta()))
+ .addElement('G', ofBlock(getGearboxBlock(), getGearboxMeta()))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mMillingBallBuses.clear();
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 48 - 8 && checkHatch();
+ }
+
+ @Override
+ public boolean checkHatch() {
+ return super.checkHatch() && mMillingBallBuses.size() == 1;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return frontFaceActive;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return frontFace;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(2);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return getMaxEfficiency(aStack) > 0;
+ }
+
+ private boolean addMillingBallsHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_MillingBalls) {
+ return addToMachineListInternal(mMillingBallBuses, aMetaTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_MillingBalls) {
+ log("Found GT_MetaTileEntity_Hatch_MillingBalls");
+ return addToMachineListInternal(mMillingBallBuses, aMetaTileEntity, aBaseCasingIndex);
+ }
+ return super.addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.millingRecipes;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (this.mUpdate == 1 || this.mStartUpCheck == 1) {
+ this.mMillingBallBuses.clear();
+ }
+ }
+ if (aTick % 20 == 0 && isMachineRunning()) {
+ checkForEntities(aBaseMetaTileEntity, aTick);
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ private final AutoMap<BlockPos> mFrontBlockPosCache = new AutoMap<>();
+
+ public void checkForEntities(IGregTechTileEntity aBaseMetaTileEntity, long aTime) {
+
+ if (aTime % 100 == 0) {
+ mFrontBlockPosCache.clear();
+ }
+ if (mFrontBlockPosCache.isEmpty()) {
+ ForgeDirection tSide = aBaseMetaTileEntity.getBackFacing();
+ int aTileX = aBaseMetaTileEntity.getXCoord();
+ int aTileY = aBaseMetaTileEntity.getYCoord();
+ int aTileZ = aBaseMetaTileEntity.getZCoord();
+ boolean xFacing = tSide.offsetX != 0;
+ boolean zFacing = tSide.offsetZ != 0;
+
+ // Check Casings
+ int aDepthOffset = (tSide == ForgeDirection.NORTH || tSide == ForgeDirection.WEST) ? 1 : -1;
+ for (int aHorizontalOffset = -1; aHorizontalOffset < 2; aHorizontalOffset++) {
+ for (int aVerticalOffset = -1; aVerticalOffset < 2; aVerticalOffset++) {
+ int aX = !xFacing ? (aTileX + aHorizontalOffset) : (aTileX + aDepthOffset);
+ int aY = aTileY + aVerticalOffset;
+ int aZ = !zFacing ? (aTileZ + aHorizontalOffset) : (aTileZ + aDepthOffset);
+ mFrontBlockPosCache.add(new BlockPos(aX, aY, aZ, aBaseMetaTileEntity.getWorld()));
+ }
+ }
+ }
+
+ AutoMap<EntityLivingBase> aEntities = getEntities(mFrontBlockPosCache, aBaseMetaTileEntity.getWorld());
+ if (!aEntities.isEmpty()) {
+ for (EntityLivingBase aFoundEntity : aEntities) {
+ if (aFoundEntity instanceof EntityPlayer aPlayer) {
+ if (PlayerUtils.isCreative(aPlayer) || !PlayerUtils.canTakeDamage(aPlayer)) {
+ continue;
+ } else {
+ if (aFoundEntity.getHealth() > 0) {
+ EntityUtils.doDamage(aFoundEntity, mIsaMillDamageSource, getPlayerDamageValue(aPlayer, 10));
+ if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())) {
+ generateParticles(aFoundEntity);
+ }
+ }
+ }
+ } else if (aFoundEntity.getHealth() > 0) {
+ EntityUtils.doDamage(
+ aFoundEntity,
+ mIsaMillDamageSource,
+ Math.max(1, (int) (aFoundEntity.getMaxHealth() / 3)));
+ if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())) {
+ generateParticles(aFoundEntity);
+ }
+ }
+ }
+ }
+ }
+
+ // 20 armor points add 80% damage reduction, more points add more damage reduction
+ private int getPlayerDamageValue(EntityPlayer player, int damage) {
+ int armorValue = player.getTotalArmorValue();
+ int reducedDamage = (int) (damage - damage * (armorValue * 0.04));
+ return Math.max(reducedDamage, 0);
+ }
+
+ private static AutoMap<EntityLivingBase> getEntities(AutoMap<BlockPos> aPositionsToCheck, World aWorld) {
+ AutoMap<EntityLivingBase> aEntities = new AutoMap<>();
+ HashSet<Chunk> aChunksToCheck = new HashSet<>();
+ if (!aPositionsToCheck.isEmpty()) {
+ Chunk aLocalChunk;
+ for (BlockPos aPos : aPositionsToCheck) {
+ aLocalChunk = aWorld.getChunkFromBlockCoords(aPos.xPos, aPos.zPos);
+ aChunksToCheck.add(aLocalChunk);
+ }
+ }
+ if (!aChunksToCheck.isEmpty()) {
+ AutoMap<EntityLivingBase> aEntitiesFound = new AutoMap<>();
+ for (Chunk aChunk : aChunksToCheck) {
+ if (aChunk.isChunkLoaded) {
+ List[] aEntityLists = aChunk.entityLists;
+ for (List aEntitySubList : aEntityLists) {
+ for (Object aEntity : aEntitySubList) {
+ if (aEntity instanceof EntityLivingBase aPlayer) {
+ aEntitiesFound.add(aPlayer);
+ }
+ }
+ }
+ }
+ }
+ if (!aEntitiesFound.isEmpty()) {
+ for (EntityLivingBase aEntity : aEntitiesFound) {
+ BlockPos aPlayerPos = EntityUtils.findBlockPosOfEntity(aEntity);
+ for (BlockPos aBlockSpaceToCheck : aPositionsToCheck) {
+ if (aBlockSpaceToCheck.equals(aPlayerPos)) {
+ aEntities.add(aEntity);
+ }
+ }
+ }
+ }
+ }
+ return aEntities;
+ }
+
+ private static void generateParticles(EntityLivingBase aEntity) {
+ BlockPos aPlayerPosBottom = EntityUtils.findBlockPosOfEntity(aEntity);
+ BlockPos aPlayerPosTop = aPlayerPosBottom.getUp();
+ AutoMap<BlockPos> aEntityPositions = new AutoMap<>();
+ aEntityPositions.add(aPlayerPosBottom);
+ aEntityPositions.add(aPlayerPosTop);
+ for (int i = 0; i < 64; i++) {
+ BlockPos aEffectPos = aEntityPositions.get(aEntity.height > 1f ? MathUtils.randInt(0, 1) : 0);
+ float aOffsetX = MathUtils.randFloat(-0.35f, 0.35f);
+ float aOffsetY = MathUtils.randFloat(-0.25f, 0.35f);
+ float aOffsetZ = MathUtils.randFloat(-0.35f, 0.35f);
+ aEntity.worldObj.spawnParticle(
+ "reddust",
+ aEffectPos.xPos + aOffsetX,
+ aEffectPos.yPos + 0.3f + aOffsetY,
+ aEffectPos.zPos + aOffsetZ,
+ 0.0D,
+ 0.0D,
+ 0.0D);
+ }
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings5Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 0;
+ }
+
+ public Block getIntakeBlock() {
+ return ModBlocks.blockCasings5Misc;
+ }
+
+ public byte getIntakeMeta() {
+ return 1;
+ }
+
+ public Block getGearboxBlock() {
+ return ModBlocks.blockCasings5Misc;
+ }
+
+ public byte getGearboxMeta() {
+ return 2;
+ }
+
+ public byte getCasingTextureIndex() {
+ return 66;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IsaMill(this.mName);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIsaMill;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] { "IsaMill Grinding Machine", "Current Efficiency: " + (mEfficiency / 100) + "%",
+ getIdealStatus() == getRepairStatus() ? "No Maintainance issues" : "Needs Maintainance" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Grinding Machine";
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ /*
+ * Milling Ball Handling
+ */
+
+ @Override
+ public ArrayList<ItemStack> getStoredInputs() {
+ ArrayList<ItemStack> tItems = super.getStoredInputs();
+ for (GT_MetaTileEntity_Hatch_MillingBalls tHatch : filterValidMTEs(mMillingBallBuses)) {
+ AutoMap<ItemStack> aHatchContent = tHatch.getContentUsageSlots();
+ if (!aHatchContent.isEmpty()) {
+ tItems.addAll(aHatchContent);
+ }
+ }
+ return tItems;
+ }
+
+ public int getMaxBallDurability(ItemStack aStack) {
+ return ItemGenericChemBase.getMaxBallDurability(aStack);
+ }
+
+ private ItemStack findMillingBall(ItemStack[] aItemInputs) {
+ if (mMillingBallBuses.size() != 1) {
+ return null;
+ } else {
+ GT_MetaTileEntity_Hatch_MillingBalls aBus = mMillingBallBuses.get(0);
+ if (aBus != null) {
+ AutoMap<ItemStack> aAvailableItems = aBus.getContentUsageSlots();
+ if (!aAvailableItems.isEmpty()) {
+ for (final ItemStack aInput : aItemInputs) {
+ if (ItemUtils.isMillingBall(aInput)) {
+ for (ItemStack aBall : aAvailableItems) {
+ if (GT_Utility.areStacksEqual(aBall, aInput, true)) {
+ Logger.INFO("Found a valid milling ball to use.");
+ return aBall;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ private void damageMillingBall(ItemStack aStack) {
+ if (MathUtils.randFloat(0, 10000000) / 10000000f < (1.2f - (0.2 * 1))) {
+ int damage = getMillingBallDamage(aStack) + 1;
+ log("damage milling ball " + damage);
+ if (damage >= getMaxBallDurability(aStack)) {
+ log("consuming milling ball");
+ aStack.stackSize -= 1;
+ } else {
+ setDamage(aStack, damage);
+ }
+ } else {
+ log("not damaging milling ball");
+ }
+ }
+
+ private int getMillingBallDamage(ItemStack aStack) {
+ return ItemGenericChemBase.getMillingBallDamage(aStack);
+ }
+
+ private void setDamage(ItemStack aStack, int aAmount) {
+ ItemGenericChemBase.setMillingBallDamage(aStack, aAmount);
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ ItemStack millingBall;
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ millingBall = findMillingBall(inputItems);
+ if (millingBall == null) {
+ return SimpleCheckRecipeResult.ofFailure("no_milling_ball");
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ CheckRecipeResult result = super.process();
+ if (result.wasSuccessful()) {
+ damageMillingBall(millingBall);
+ }
+ return result;
+ }
+ }.enablePerfectOverclock();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_NuclearSaltProcessingPlant.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_NuclearSaltProcessingPlant.java
new file mode 100644
index 0000000000..6d1593bec9
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_NuclearSaltProcessingPlant.java
@@ -0,0 +1,224 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMetaTileEntity_NuclearSaltProcessingPlant extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_NuclearSaltProcessingPlant> implements ISurvivalConstructable {
+
+ protected GT_Recipe lastRecipeToBuffer;
+ private int casing;
+ private static IStructureDefinition<GregtechMetaTileEntity_NuclearSaltProcessingPlant> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_NuclearSaltProcessingPlant(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_NuclearSaltProcessingPlant(String mName) {
+ super(mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Reactor Processing Unit, Cold Trap";
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity tileEntity) {
+ return new GregtechMetaTileEntity_NuclearSaltProcessingPlant(this.mName);
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack itemStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAutoCrafter;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Nuclear Salt Processing Plant")
+ .addInfo("Processes depleted nuclear salts that come from the LFTR")
+ .addInfo("Handles the recipes of the Reactor Processor Unit and Cold Trap")
+ .addInfo("Only Thermally Insulated Casings can be replaced with hatches")
+ .addInfo("Mufflers on top, Energy Hatches on bottom, exactly 2 of each are required")
+ .addInfo("Maintenance Hatch goes on the back, opposite of the controller block")
+ .addInfo("Inputs go on the left side of the multi, outputs on the right side")
+ .addInfo("150% faster than using single block machines of the same voltage")
+ .addInfo("Processes two items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("IV Machine Casing", 58, false)
+ .addCasingInfoMin("Thermally Insulated Casing", 1, false)
+ .addInputBus("Left Half", 2)
+ .addInputHatch("Left Half", 2)
+ .addOutputBus("Right Half", 3)
+ .addOutputHatch("Right Half", 3)
+ .addMufflerHatch("Top Side, 2 Required", 4)
+ .addEnergyHatch("Bottom Side, 2 Required", 5)
+ .addMaintenanceHatch("Back Side, Opposite of Controller", 6)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DISASSEMBLER_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DISASSEMBLER;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(0, 10);
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_NuclearSaltProcessingPlant> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_NuclearSaltProcessingPlant>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "AAA AAA", "ADA ADA", "AAA AAA" },
+ { "ABBA ACCA", "B AAA C", "ABBA ACCA" }, { "ABBB~CCCA", "B C", "ABBBFCCCA" },
+ { "ABBA ACCA", "B AAA C", "ABBA ACCA" }, { "AAA AAA", "AEA AEA", "AAA AAA" } }))
+ .addElement('A', ofBlock(GregTech_API.sBlockCasings1, 5))
+ .addElement(
+ 'B',
+ buildHatchAdder(GregtechMetaTileEntity_NuclearSaltProcessingPlant.class)
+ .atLeast(InputBus, InputHatch)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(2)
+ .buildAndChain(onElementPass(x -> ++x.casing, ofBlock(ModBlocks.blockSpecialMultiCasings, 8))))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_NuclearSaltProcessingPlant.class)
+ .atLeast(OutputBus, OutputHatch)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(3)
+ .buildAndChain(onElementPass(x -> ++x.casing, ofBlock(ModBlocks.blockSpecialMultiCasings, 8))))
+ .addElement(
+ 'D',
+ buildHatchAdder(GregtechMetaTileEntity_NuclearSaltProcessingPlant.class).atLeast(Muffler)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(4)
+ .buildAndChain(onElementPass(x -> ++x.casing, ofBlock(ModBlocks.blockSpecialMultiCasings, 8))))
+ .addElement(
+ 'E',
+ buildHatchAdder(GregtechMetaTileEntity_NuclearSaltProcessingPlant.class).atLeast(Energy)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(5)
+ .buildAndChain(onElementPass(x -> ++x.casing, ofBlock(ModBlocks.blockSpecialMultiCasings, 8))))
+ .addElement(
+ 'F',
+ buildHatchAdder(GregtechMetaTileEntity_NuclearSaltProcessingPlant.class).atLeast(Maintenance)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(6)
+ .buildAndChain(onElementPass(x -> ++x.casing, ofBlock(ModBlocks.blockSpecialMultiCasings, 8))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack itemStack, boolean hintsOnly) {
+ buildPiece(mName, itemStack, hintsOnly, 4, 2, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack itemStack, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, itemStack, 4, 2, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity baseMetaTileEntity, ItemStack itemStack) {
+ casing = 0;
+ return checkPiece(mName, 4, 2, 0) && checkHatch();
+ }
+
+ @Override
+ public boolean checkHatch() {
+ return mEnergyHatches.size() == 2 && mMufflerHatches.size() == 2 && super.checkHatch();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.nuclearSaltProcessingPlantRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2.5F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 2 * (Math.max(1, GT_Utility.getTier(getMaxInputVoltage())));
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ final String running = (this.mMaxProgresstime > 0 ? "Salt Plant running" : "Salt Plant stopped");
+ final String maintenance = (this.getIdealStatus() == this.getRepairStatus() ? "No Maintenance issues"
+ : "Needs Maintenance");
+ String tSpecialText;
+
+ if (lastRecipeToBuffer != null && lastRecipeToBuffer.mOutputs[0].getDisplayName() != null) {
+ tSpecialText = "Currently processing: " + lastRecipeToBuffer.mOutputs[0].getDisplayName();
+ } else {
+ tSpecialText = "Currently processing: Nothing";
+ }
+
+ return new String[] { "Nuclear Salt Processing Plant", running, maintenance, tSpecialText };
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_SpargeTower.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_SpargeTower.java
new file mode 100644
index 0000000000..5f4203b99e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/GregtechMetaTileEntity_SpargeTower.java
@@ -0,0 +1,507 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.isAir;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GasSpargingRecipe;
+import gregtech.api.util.GasSpargingRecipeMap;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_SpargeTower extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_SpargeTower>
+ implements ISurvivalConstructable {
+
+ protected static final String STRUCTURE_PIECE_BASE = "base";
+ protected static final String STRUCTURE_PIECE_LAYER = "layer";
+ protected static final String STRUCTURE_PIECE_LAYER_HINT = "layerHint";
+ protected static final String STRUCTURE_PIECE_TOP_HINT = "topHint";
+ private static final IStructureDefinition<GregtechMetaTileEntity_SpargeTower> STRUCTURE_DEFINITION;
+
+ static {
+ IHatchElement<GregtechMetaTileEntity_SpargeTower> layeredOutputHatch = OutputHatch
+ .withCount(GregtechMetaTileEntity_SpargeTower::getCurrentLayerOutputHatchCount)
+ .withAdder(GregtechMetaTileEntity_SpargeTower::addLayerOutputHatch);
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_SpargeTower>builder()
+ .addShape(STRUCTURE_PIECE_BASE, transpose(new String[][] { { "b~b", "bbb", "bbb" }, }))
+ .addShape(STRUCTURE_PIECE_LAYER, transpose(new String[][] { { "lll", "lcl", "lll" } }))
+ .addShape(STRUCTURE_PIECE_LAYER_HINT, transpose(new String[][] { { "lll", "l-l", "lll" } }))
+ .addShape(STRUCTURE_PIECE_TOP_HINT, transpose(new String[][] { { "lll", "lll", "lll" } }))
+ .addElement(
+ 'b',
+ buildHatchAdder(GregtechMetaTileEntity_SpargeTower.class)
+ .atLeast(Energy, InputHatch, InputBus, Maintenance)
+ .disallowOnly(ForgeDirection.UP)
+ .casingIndex(getCasingIndex())
+ .dot(1)
+ .buildAndChain(
+ onElementPass(
+ GregtechMetaTileEntity_SpargeTower::onCasingFound,
+ ofBlock(ModBlocks.blockCasings5Misc, 4))))
+ .addElement(
+ 'l',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_SpargeTower.class).atLeast(layeredOutputHatch)
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(getCasingIndex())
+ .dot(2)
+ .build(),
+ ofHatchAdder(GregtechMetaTileEntity_SpargeTower::addEnergyInputToMachineList, getCasingIndex(), 2),
+ ofHatchAdder(GregtechMetaTileEntity_SpargeTower::addMaintenanceToMachineList, getCasingIndex(), 2),
+ onElementPass(
+ GregtechMetaTileEntity_SpargeTower::onCasingFound,
+ ofBlock(ModBlocks.blockCasings5Misc, 4))))
+ .addElement(
+ 'c',
+ ofChain(
+ onElementPass(
+ t -> t.onTopLayerFound(false),
+ ofHatchAdder(GregtechMetaTileEntity_SpargeTower::addOutputToMachineList, getCasingIndex(), 3)),
+ onElementPass(
+ t -> t.onTopLayerFound(false),
+ ofHatchAdder(
+ GregtechMetaTileEntity_SpargeTower::addMaintenanceToMachineList,
+ getCasingIndex(),
+ 3)),
+ onElementPass(t -> t.onTopLayerFound(true), ofBlock(ModBlocks.blockCasings5Misc, 4)),
+ isAir()))
+ .build();
+ }
+
+ protected final List<List<GT_MetaTileEntity_Hatch_Output>> mOutputHatchesByLayer = new ArrayList<>();
+ protected int mHeight;
+ protected int mCasing;
+ protected boolean mTopLayerFound;
+
+ public GregtechMetaTileEntity_SpargeTower(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_SpargeTower(String aName) {
+ super(aName);
+ }
+
+ public static int getCasingIndex() {
+ return 68;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_SpargeTower(this.mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Gas Sparge Tower")
+ .addInfo("Controller block for the Sparging Tower")
+ .addInfo("Runs gases through depleted molten salts to extract precious fluids")
+ .addInfo("Works the same way as the Distillation Tower, but with a fixed height of 8")
+ .addInfo("Fluids are only put out at the correct height")
+ .addInfo("The correct height equals the slot number in the NEI recipe")
+ .addSeparator()
+ .beginStructureBlock(3, 8, 3, true)
+ .addController("Front bottom")
+ .addOtherStructurePart("Sparge Tower Exterior Casing", "45 (minimum)")
+ .addEnergyHatch("Any casing", 1, 2)
+ .addMaintenanceHatch("Any casing", 1, 2, 3)
+ .addInputHatch("2x Input Hatches (Any bottom layer casing)", 1)
+ .addOutputHatch("6x Output Hatches (At least one per layer except bottom layer)", 2, 3)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return getCasingIndex();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ if (GTPPRecipeMaps.spargeTowerFakeRecipes.getAllRecipes()
+ .isEmpty()) {
+ generateRecipes();
+ }
+ return GTPPRecipeMaps.spargeTowerFakeRecipes;
+ }
+
+ private static boolean generateRecipes() {
+ for (GasSpargingRecipe aRecipe : GasSpargingRecipeMap.mRecipes) {
+ GT_Recipe newRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ null,
+ aRecipe.mFluidInputs.clone(),
+ new FluidStack[] {},
+ aRecipe.mDuration,
+ aRecipe.mEUt,
+ 0);
+ GTPPRecipeMaps.spargeTowerFakeRecipes.add(newRecipe);
+ }
+ return !GTPPRecipeMaps.spargeTowerFakeRecipes.getAllRecipes()
+ .isEmpty();
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ ArrayList<FluidStack> tFluidList = getStoredFluids();
+ long tVoltage = GT_Utility.roundUpVoltage(this.getMaxInputVoltage());
+ byte tTier = (byte) Math.max(0, GT_Utility.getTier(tVoltage));
+ FluidStack[] tFluids = tFluidList.toArray(new FluidStack[0]);
+ if (tFluids.length > 0) {
+ GT_Recipe tRecipe = getRecipeMap()
+ .findRecipe(getBaseMetaTileEntity(), false, gregtech.api.enums.GT_Values.V[tTier], tFluids);
+ if (tRecipe != null) {
+ FluidStack[] possibleOutputs = getPossibleByproductsOfSparge(
+ tRecipe.mFluidInputs[0],
+ tRecipe.mFluidInputs[1]).toArray(new FluidStack[0]);
+ if (canOutputAll(possibleOutputs) && tRecipe.isRecipeInputEqual(true, tFluids)) {
+ this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
+ this.mEfficiencyIncrease = 10000;
+
+ calculateOverclockedNessMulti((long) tRecipe.mEUt, tRecipe.mDuration, 1, tVoltage);
+ mMaxProgresstime = Math.max(1, mMaxProgresstime);
+ ArrayList<FluidStack> aFluidOutputs = getByproductsOfSparge(
+ tRecipe.mFluidInputs[0],
+ tRecipe.mFluidInputs[1]);
+ this.mOutputFluids = aFluidOutputs.toArray(new FluidStack[0]);
+ updateSlots();
+
+ if (lEUt > 0) {
+ lEUt = (-lEUt);
+ }
+
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ }
+ }
+ this.lEUt = 0;
+ this.mEfficiency = 0;
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ private static List<FluidStack> getPossibleByproductsOfSparge(final FluidStack aSpargeGas,
+ final FluidStack aSpentFuel) {
+ GasSpargingRecipe aSpargeRecipe = GasSpargingRecipeMap.findRecipe(aSpargeGas, aSpentFuel);
+ ArrayList<FluidStack> aOutputGases = new ArrayList<>();
+ if (aSpargeRecipe == null) {
+ return aOutputGases;
+ }
+
+ aOutputGases.add(aSpargeRecipe.mOutputSpargedFuel.copy());
+ ArrayList<FluidStack> aTempMap = new ArrayList<>();
+ for (int i = 2; i < aSpargeRecipe.mFluidOutputs.length; i++) {
+ int aGasAmount = aSpargeRecipe.mMaxOutputQuantity[i - 2] / 100;
+ FluidStack aOutput = aSpargeRecipe.mFluidOutputs[i].copy();
+ FluidStack aSpargeOutput = null;
+ if (aGasAmount > 0) {
+ aSpargeOutput = new FluidStack(aOutput.getFluid(), aGasAmount);
+ }
+ aTempMap.add(aSpargeOutput);
+ }
+ aOutputGases.add(new FluidStack(aSpargeRecipe.mInputGas.getFluid(), aSpargeRecipe.mInputGas.amount));
+ aOutputGases.addAll(aTempMap);
+ return aOutputGases;
+ }
+
+ private static ArrayList<FluidStack> getByproductsOfSparge(final FluidStack aSpargeGas,
+ final FluidStack aSpentFuel) {
+ GasSpargingRecipe aSpargeRecipe = GasSpargingRecipeMap.findRecipe(aSpargeGas, aSpentFuel);
+ ArrayList<FluidStack> aOutputGases = new ArrayList<>();
+ if (aSpargeRecipe == null) {
+ Logger.INFO("Did not find sparge recipe!");
+ return aOutputGases;
+ }
+ int aSpargeGasAmount = aSpargeRecipe.mInputGas.amount;
+
+ aOutputGases.add(aSpargeRecipe.mOutputSpargedFuel.copy());
+ ArrayList<FluidStack> aTempMap = new ArrayList<>();
+ for (int i = 2; i < aSpargeRecipe.mFluidOutputs.length; i++) {
+ int aGasAmount = MathUtils.randInt(0, (aSpargeRecipe.mMaxOutputQuantity[i - 2] / 100));
+ FluidStack aOutput = aSpargeRecipe.mFluidOutputs[i].copy();
+ aSpargeGasAmount -= aGasAmount;
+ FluidStack aSpargeOutput = null;
+ if (aGasAmount > 0) {
+ aSpargeOutput = new FluidStack(aOutput.getFluid(), aGasAmount);
+ }
+ aTempMap.add(aSpargeOutput);
+ }
+ Logger.INFO("Sparge gas left: " + aSpargeGasAmount);
+ if (aSpargeGasAmount > 0) {
+ aOutputGases.add(new FluidStack(aSpargeRecipe.mInputGas.getFluid(), aSpargeGasAmount));
+ }
+ // Logger.INFO("Sparge Outputs: "+ItemUtils.getArrayStackNames(aTempMap));
+ aOutputGases.addAll(aTempMap);
+ Logger.INFO("Sparge output size: " + aOutputGases.size());
+ // Logger.INFO("Output of sparging: "+ItemUtils.getArrayStackNames(aOutputGases));
+ return aOutputGases;
+ }
+
+ protected void onCasingFound() {
+ mCasing++;
+ }
+
+ protected void onTopLayerFound(boolean aIsCasing) {
+ mTopLayerFound = true;
+ if (aIsCasing) {
+ onCasingFound();
+ }
+ }
+
+ protected int getCurrentLayerOutputHatchCount() {
+ return mOutputHatchesByLayer.size() < mHeight || mHeight <= 0 ? 0
+ : mOutputHatchesByLayer.get(mHeight - 1)
+ .size();
+ }
+
+ protected boolean addLayerOutputHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null || aTileEntity.isDead()
+ || !(aTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_Hatch_Output tHatch)) {
+ Logger.INFO("Bad Output Hatch");
+ return false;
+ }
+ while (mOutputHatchesByLayer.size() < mHeight) {
+ mOutputHatchesByLayer.add(new ArrayList<>());
+ }
+ tHatch.updateTexture(aBaseCasingIndex);
+ boolean addedHatch = mOutputHatchesByLayer.get(mHeight - 1)
+ .add(tHatch);
+ Logger.INFO("Added Hatch: " + addedHatch);
+ return addedHatch;
+ }
+
+ @Override
+ public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
+ return getFluidOutputSlotsByLayer(toOutput, mOutputHatchesByLayer);
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ // don't rotate a freaking tower, it won't work
+ return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_SpargeTower> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ // reset
+ mOutputHatchesByLayer.forEach(List::clear);
+ mHeight = 1;
+ mTopLayerFound = false;
+ mCasing = 0;
+
+ // check base
+ if (!checkPiece(STRUCTURE_PIECE_BASE, 1, 0, 0)) {
+ Logger.INFO("Bad Base. Height: " + mHeight);
+ return false;
+ }
+
+ // check each layer
+ while (mHeight < 8 && checkPiece(STRUCTURE_PIECE_LAYER, 1, mHeight, 0) && !mTopLayerFound) {
+ if (mOutputHatchesByLayer.get(mHeight - 1)
+ .isEmpty()) {
+ // layer without output hatch
+ Logger.INFO("Height: " + mHeight + " - Missing output on " + (mHeight - 1));
+ return false;
+ }
+ // not top
+ mHeight++;
+ }
+
+ // validate final invariants...
+ Logger.INFO("Height: " + mHeight);
+ Logger.INFO("Casings: " + mCasing);
+ Logger.INFO("Required: " + (7 * mHeight - 5));
+ Logger.INFO("Found Top: " + mTopLayerFound);
+ return mCasing >= 45 && mTopLayerFound && mMaintenanceHatches.size() == 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerTick(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ protected void addFluidOutputs(FluidStack[] mOutputFluids2) {
+ for (int i = 0; i < mOutputFluids2.length && i < mOutputHatchesByLayer.size(); i++) {
+ FluidStack tStack = mOutputFluids2[i] != null ? mOutputFluids2[i].copy() : null;
+ if (tStack == null) {
+ continue;
+ }
+ if (!dumpFluid(mOutputHatchesByLayer.get(i), tStack, true)) {
+ dumpFluid(mOutputHatchesByLayer.get(i), tStack, false);
+ }
+ }
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_BASE, stackSize, hintsOnly, 1, 0, 0);
+ int tTotalHeight = 8; // min 2 output layer, so at least 1 + 2 height
+ for (int i = 1; i < tTotalHeight - 1; i++) {
+ buildPiece(STRUCTURE_PIECE_LAYER_HINT, stackSize, hintsOnly, 1, i, 0);
+ }
+ buildPiece(STRUCTURE_PIECE_TOP_HINT, stackSize, hintsOnly, 1, tTotalHeight - 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ mHeight = 0;
+ int built = survivialBuildPiece(STRUCTURE_PIECE_BASE, stackSize, 1, 0, 0, elementBudget, env, false, true);
+ if (built >= 0) return built;
+ int tTotalHeight = 8; // min 2 output layer, so at least 1 + 2 height
+ for (int i = 1; i < tTotalHeight - 1; i++) {
+ mHeight = i;
+ built = survivialBuildPiece(
+ STRUCTURE_PIECE_LAYER_HINT,
+ stackSize,
+ 1,
+ i,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ if (built >= 0) return built;
+ }
+ mHeight = tTotalHeight - 1;
+ return survivialBuildPiece(
+ STRUCTURE_PIECE_TOP_HINT,
+ stackSize,
+ 1,
+ tTotalHeight - 1,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Gas Sparger";
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public boolean onPlungerRightClick(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ) {
+ int aLayerIndex = 0;
+ PlayerUtils
+ .messagePlayer(aPlayer, "Trying to clear " + mOutputHatchesByLayer.size() + " layers of output hatches.");
+ for (List<GT_MetaTileEntity_Hatch_Output> layer : this.mOutputHatchesByLayer) {
+ int aHatchIndex = 0;
+ for (GT_MetaTileEntity_Hatch_Output hatch : layer) {
+ if (hatch.mFluid != null) {
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Clearing " + hatch.mFluid.amount
+ + "L of "
+ + hatch.mFluid.getLocalizedName()
+ + " from hatch "
+ + aHatchIndex
+ + " on layer "
+ + aLayerIndex
+ + ".");
+ hatch.mFluid = null;
+ }
+ aHatchIndex++;
+ }
+ aLayerIndex++;
+ }
+ return aLayerIndex > 0;
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ // Ensure that lEUt is negative from loaded NBT data, since this multi consumes EU
+ if (lEUt > 0) {
+ lEUt = (-lEUt);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_DistillationTower.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_DistillationTower.java
new file mode 100644
index 0000000000..8296b8e7cb
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_DistillationTower.java
@@ -0,0 +1,491 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.isAir;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdder;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Output_ME;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMetaTileEntity_Adv_DistillationTower extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_Adv_DistillationTower> implements ISurvivalConstructable {
+
+ private Mode mMode = Mode.DistillationTower;
+ private boolean mUpgraded = false;
+
+ protected static final String STRUCTURE_PIECE_BASE = "base";
+ protected static final String STRUCTURE_PIECE_LAYER = "layer";
+ protected static final String STRUCTURE_PIECE_LAYER_HINT = "layerHint";
+ protected static final String STRUCTURE_PIECE_TOP_HINT = "topHint";
+
+ protected final List<List<GT_MetaTileEntity_Hatch_Output>> mOutputHatchesByLayer = new ArrayList<>();
+ protected int mHeight;
+ protected int mCasing;
+ protected boolean mTopLayerFound;
+
+ private static IStructureDefinition<GregtechMetaTileEntity_Adv_DistillationTower> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_Adv_DistillationTower(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Adv_DistillationTower(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Adv_DistillationTower(this.mName);
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_Adv_DistillationTower> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ IHatchElement<GregtechMetaTileEntity_Adv_DistillationTower> layeredOutputHatch = OutputHatch
+ .withCount(GregtechMetaTileEntity_Adv_DistillationTower::getCurrentLayerOutputHatchCount)
+ .withAdder(GregtechMetaTileEntity_Adv_DistillationTower::addLayerOutputHatch);
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_Adv_DistillationTower>builder()
+ .addShape(STRUCTURE_PIECE_BASE, transpose(new String[][] { { "b~b", "bbb", "bbb" }, }))
+ .addShape(STRUCTURE_PIECE_LAYER, transpose(new String[][] { { "lll", "lcl", "lll" }, }))
+ .addShape(STRUCTURE_PIECE_LAYER_HINT, transpose(new String[][] { { "lll", "l-l", "lll" }, }))
+ .addShape(STRUCTURE_PIECE_TOP_HINT, transpose(new String[][] { { "ttt", "ttt", "ttt" }, }))
+ .addElement(
+ 'b',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_Adv_DistillationTower.class)
+ .atLeast(Energy, OutputBus, InputHatch, InputBus, Maintenance)
+ .disallowOnly(ForgeDirection.UP)
+ .casingIndex(getCasingTextureId())
+ .dot(1)
+ .build(),
+ ofBlock(GregTech_API.sBlockCasings4, 1)))
+ .addElement(
+ 'l',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_Adv_DistillationTower.class)
+ .atLeast(layeredOutputHatch, Energy, Maintenance)
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(getCasingTextureId())
+ .dot(2)
+ .build(),
+ ofHatchAdder(
+ GregtechMetaTileEntity_Adv_DistillationTower::addMufflerToMachineList,
+ getCasingTextureId(),
+ 3),
+ ofBlock(GregTech_API.sBlockCasings4, 1)))
+ .addElement(
+ 'c',
+ ofChain(
+ onElementPass(
+ GregtechMetaTileEntity_Adv_DistillationTower::onTopLayerFound,
+ ofHatchAdder(
+ GregtechMetaTileEntity_Adv_DistillationTower::addMufflerToMachineList,
+ getCasingTextureId(),
+ 3)),
+ onElementPass(
+ GregtechMetaTileEntity_Adv_DistillationTower::onTopLayerFound,
+ ofHatchAdder(
+ GregtechMetaTileEntity_Adv_DistillationTower::addOutputToMachineList,
+ getCasingTextureId(),
+ 3)),
+ onElementPass(
+ GregtechMetaTileEntity_Adv_DistillationTower::onTopLayerFound,
+ ofHatchAdder(
+ GregtechMetaTileEntity_Adv_DistillationTower::addMaintenanceToMachineList,
+ getCasingTextureId(),
+ 3)),
+ onElementPass(
+ GregtechMetaTileEntity_Adv_DistillationTower::onTopLayerFound,
+ ofBlock(GregTech_API.sBlockCasings4, 1)),
+ isAir()))
+ .addElement(
+ 't',
+ buildHatchAdder(GregtechMetaTileEntity_Adv_DistillationTower.class)
+ .atLeast(layeredOutputHatch, Muffler)
+ .disallowOnly(ForgeDirection.DOWN)
+ .casingIndex(getCasingTextureId())
+ .dot(2)
+ .buildAndChain(GregTech_API.sBlockCasings4, 1))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ protected int getCurrentLayerOutputHatchCount() {
+ return mOutputHatchesByLayer.size() < mHeight || mHeight <= 0 ? 0
+ : mOutputHatchesByLayer.get(mHeight - 1)
+ .size();
+ }
+
+ protected boolean addLayerOutputHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null || aTileEntity.isDead()
+ || !(aTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_Hatch_Output tHatch)) return false;
+ while (mOutputHatchesByLayer.size() < mHeight) mOutputHatchesByLayer.add(new ArrayList<>());
+ tHatch.updateTexture(aBaseCasingIndex);
+ return mOutputHatchesByLayer.get(mHeight - 1)
+ .add(tHatch) && mOutputHatches.add(tHatch);
+ }
+
+ protected void onTopLayerFound() {
+ mTopLayerFound = true;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Advanced Distillation Tower")
+ .addInfo("Use 85% less energy in distillery mode")
+ .addInfo("250%/100% faster in DT/distillery mode")
+ .addInfo("Right click the controller with screwdriver to change mode.")
+ .addInfo("Max parallel dictated by tower tier and mode")
+ .addInfo("DTower Mode: T1=4, T2=12")
+ .addInfo("Distilery Mode: Tower Tier * (4*InputTier)")
+ .addInfo("Distilery Mode require a full height tower")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .addCasingInfoMin("Clean Stainless Steel Machine Casing", 7, false)
+ .addInputBus("Bottom Casing", 1)
+ .addOutputBus("Bottom Casing", 1)
+ .addInputHatch("Bottom Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addOutputHatch("One per layer except bottom", 2)
+ .addMufflerHatch("Top Casing", 3)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_BASE, stackSize, hintsOnly, 1, 0, 0);
+ int tTotalHeight = Math.min(12, stackSize.stackSize + 2); // min 2 output layer, so at least 1 + 2 height
+ for (int i = 1; i < tTotalHeight - 1; i++) {
+ buildPiece(STRUCTURE_PIECE_LAYER_HINT, stackSize, hintsOnly, 1, i, 0);
+ }
+ buildPiece(STRUCTURE_PIECE_TOP_HINT, stackSize, hintsOnly, 1, tTotalHeight - 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ mHeight = 0;
+ int built = survivialBuildPiece(STRUCTURE_PIECE_BASE, stackSize, 1, 0, 0, elementBudget, env, false, true);
+ if (built >= 0) return built;
+ int tTotalHeight = Math.min(12, stackSize.stackSize + 2); // min 2 output layer, so at least 1 + 2 height
+ for (int i = 1; i < tTotalHeight - 1; i++) {
+ mHeight = i;
+ built = survivialBuildPiece(
+ STRUCTURE_PIECE_LAYER_HINT,
+ stackSize,
+ 1,
+ i,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ if (built >= 0) return built;
+ }
+ mHeight = tTotalHeight - 1;
+ return survivialBuildPiece(
+ STRUCTURE_PIECE_TOP_HINT,
+ stackSize,
+ 1,
+ tTotalHeight - 1,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ // reset
+ mOutputHatchesByLayer.forEach(List::clear);
+ mHeight = 1;
+ mTopLayerFound = false;
+
+ // check base
+ if (!checkPiece(STRUCTURE_PIECE_BASE, 1, 0, 0)) return false;
+
+ // check each layer
+ while (mHeight < 12) {
+ if (!checkPiece(STRUCTURE_PIECE_LAYER, 1, mHeight, 0)) {
+ return false;
+ }
+ if (mOutputHatchesByLayer.size() < mHeight || mOutputHatchesByLayer.get(mHeight - 1)
+ .isEmpty())
+ // layer without output hatch
+ return false;
+ if (mTopLayerFound || !mMufflerHatches.isEmpty()) {
+ break;
+ }
+ // not top
+ mHeight++;
+ }
+ boolean check = mTopLayerFound && mHeight >= 2 && checkHatch();
+ if (check && mHeight < 11) {
+ // force the mode to DT if not in full height
+ mMode = Mode.DistillationTower;
+ mLastRecipe = null;
+ }
+ return check;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return mMode.getRecipeMap();
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(RecipeMaps.distilleryRecipes, RecipeMaps.distillationTowerRecipes);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ // don't rotate a freaking tower, it won't work
+ return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ if (this.mMode == Mode.Distillery)
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAdvDistillationTower_ModeDistillery;
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAdvDistillationTower_ModeDT;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setByte("mMode", (byte) mMode.ordinal());
+ aNBT.setBoolean("mUpgraded", mUpgraded);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mMode = Mode.values()[aNBT.getByte("mMode")];
+ mUpgraded = aNBT.getBoolean("mUpgraded");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (mHeight < 11) {
+ PlayerUtils.messagePlayer(aPlayer, "Cannot switch mode if not in full height.");
+ return;
+ }
+ mMode = mMode.next();
+ PlayerUtils.messagePlayer(aPlayer, "Now running in " + mMode + " Mode.");
+ mLastRecipe = null;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean addOutput(FluidStack aLiquid) {
+ if (aLiquid == null) return false;
+ FluidStack copiedFluidStack = aLiquid.copy();
+ for (List<GT_MetaTileEntity_Hatch_Output> hatches : mOutputHatchesByLayer) {
+ if (dumpFluid(hatches, copiedFluidStack, true)) return true;
+ }
+ for (List<GT_MetaTileEntity_Hatch_Output> hatches : mOutputHatchesByLayer) {
+ if (dumpFluid(hatches, copiedFluidStack, false)) return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected void addFluidOutputs(FluidStack[] mOutputFluids2) {
+ if (mMode == Mode.DistillationTower) {
+ // dt mode
+ for (int i = 0; i < mOutputFluids2.length && i < mOutputHatchesByLayer.size(); i++) {
+ FluidStack tStack = mOutputFluids2[i].copy();
+ if (!dumpFluid(mOutputHatchesByLayer.get(i), tStack, true))
+ dumpFluid(mOutputHatchesByLayer.get(i), tStack, false);
+ }
+ } else {
+ // distillery mode
+ for (FluidStack outputFluidStack : mOutputFluids2) {
+ addOutput(outputFluidStack);
+ }
+ }
+ }
+
+ @Override
+ public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
+ return getFluidOutputSlotsByLayer(toOutput, mOutputHatchesByLayer);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Distillery, Distillation Tower";
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void setupProcessingLogic(ProcessingLogic logic) {
+ super.setupProcessingLogic(logic);
+ logic.setEuModifier(mMode == Mode.Distillery ? 0.15F : 1F);
+ logic.setSpeedBonus(mMode == Mode.Distillery ? 1F / 2F : 1F / 3.5F);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return switch (mMode) {
+ case DistillationTower -> getTierOfTower() == 1 ? 4 : getTierOfTower() == 2 ? 12 : 0;
+ case Distillery -> getTierOfTower() * (4 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ default -> 0;
+ };
+ }
+
+ private int getTierOfTower() {
+ return mUpgraded ? 2 : 1;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 49;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aTick % 20 == 0 && !mUpgraded) {
+ ItemStack aGuiStack = this.getControllerSlot();
+ if (aGuiStack != null) {
+ if (GT_Utility.areStacksEqual(aGuiStack, GregtechItemList.Distillus_Upgrade_Chip.get(1))) {
+ this.mUpgraded = true;
+ mInventory[1] = ItemUtils.depleteStack(aGuiStack);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean canDumpFluidToME() {
+ // All fluids can be dumped to ME only if each layer contains a ME Output Hatch.
+ return this.mOutputHatchesByLayer.stream()
+ .allMatch(
+ tLayerOutputHatches -> tLayerOutputHatches.stream()
+ .anyMatch(tHatch -> tHatch instanceof GT_MetaTileEntity_Hatch_Output_ME));
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ aNBT.setBoolean("mUpgraded", mUpgraded);
+ super.setItemNBT(aNBT);
+ }
+
+ @Override
+ public void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {
+ super.addAdditionalTooltipInformation(stack, tooltip);
+ NBTTagCompound aNBT = stack.getTagCompound();
+ if (aNBT != null && aNBT.hasKey("mUpgraded")) {
+ tooltip.add(StatCollector.translateToLocal("tooltip.large_distill_tower.upgraded"));
+ }
+ }
+
+ private enum Mode {
+
+ DistillationTower(RecipeMaps.distillationTowerRecipes),
+ Distillery(RecipeMaps.distilleryRecipes),;
+
+ static final Mode[] VALUES = values();
+ private final RecipeMap<?> recipeMap;
+
+ Mode(RecipeMap<?> recipeMap) {
+ this.recipeMap = recipeMap;
+ }
+
+ public RecipeMap<?> getRecipeMap() {
+ return recipeMap;
+ }
+
+ public Mode next() {
+ return VALUES[(ordinal() + 1) % VALUES.length];
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_EBF.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_EBF.java
new file mode 100644
index 0000000000..89c219c14e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_EBF.java
@@ -0,0 +1,333 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Objects;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GT_MetaTileEntity_Hatch_CustomFluidBase;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_Adv_EBF extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_Adv_EBF>
+ implements ISurvivalConstructable {
+
+ public static int CASING_TEXTURE_ID;
+ public static String mHotFuelName = "Blazing Pyrotheum";
+ public static String mCasingName = "Volcanus Casing";
+ public static String mHatchName = "Pyrotheum Hatch";
+ private static IStructureDefinition<GregtechMetaTileEntity_Adv_EBF> STRUCTURE_DEFINITION = null;
+ private int mCasing;
+ private final ArrayList<GT_MetaTileEntity_Hatch_CustomFluidBase> mPyrotheumHatches = new ArrayList<>();
+
+ private HeatingCoilLevel mHeatingCapacity = HeatingCoilLevel.None;
+
+ public GregtechMetaTileEntity_Adv_EBF(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 11);
+ }
+
+ public GregtechMetaTileEntity_Adv_EBF(String aName) {
+ super(aName);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(2, 11);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Blast Furnace";
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Adv_EBF(this.mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Factory Grade Advanced Blast Furnace")
+ .addInfo("Speed: +120% | EU Usage: 90% | Parallel: 8")
+ .addInfo("Consumes 10L of " + mHotFuelName + " per second during operation")
+ .addInfo("Constructed exactly the same as a normal EBF")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .addController("Bottom center")
+ .addCasingInfoMin(mCasingName, 8, false)
+ .addInputHatch("Any Casing", 1)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addOtherStructurePart(mHatchName, "Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] { StatCollector.translateToLocal("GT5U.EBF.heat") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mHeatingCapacity.getHeat())
+ + EnumChatFormatting.RESET
+ + " K" };
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_Adv_EBF> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_Adv_EBF>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "HHH", "H-H", "HHH" }, { "HHH", "H-H", "HHH" },
+ { "C~C", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_Adv_EBF.class)
+ .adder(GregtechMetaTileEntity_Adv_EBF::addPyrotheumHatch)
+ .hatchId(968)
+ .shouldReject(x -> !x.mPyrotheumHatches.isEmpty())
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_Adv_EBF.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 11))))
+ .addElement(
+ 'H',
+ ofCoil(GregtechMetaTileEntity_Adv_EBF::setCoilLevel, GregtechMetaTileEntity_Adv_EBF::getCoilLevel))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mPyrotheumHatches.clear();
+ setCoilLevel(HeatingCoilLevel.None);
+ return checkPiece(mName, 1, 3, 0) && mCasing >= 8 && getCoilLevel() != HeatingCoilLevel.None && checkHatch();
+ }
+
+ @Override
+ public boolean checkHatch() {
+ return super.checkHatch() && !mPyrotheumHatches.isEmpty();
+ }
+
+ private boolean addPyrotheumHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_CustomFluidBase
+ && aMetaTileEntity.getBaseMetaTileEntity()
+ .getMetaTileID() == 968) {
+ return addToMachineListInternal(mPyrotheumHatches, aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void updateSlots() {
+ for (GT_MetaTileEntity_Hatch_CustomFluidBase tHatch : filterValidMTEs(mPyrotheumHatches)) tHatch.updateSlots();
+ super.updateSlots();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.blastFurnaceRecipes;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ return recipe.mSpecialValue <= getCoilLevel().getHeat() ? CheckRecipeResultRegistry.SUCCESSFUL
+ : CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
+ }
+
+ @NotNull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setHeatOC(true)
+ .setHeatDiscount(true)
+ .setRecipeHeat(recipe.mSpecialValue)
+ .setMachineHeat((int) getCoilLevel().getHeat());
+ }
+ }.setSpeedBonus(1F / 2.2F)
+ .setEuModifier(0.9F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAdvEBF;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ private int mGraceTimer = 2;
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ // Try dry Pyrotheum after all other logic
+ if (this.mStartUpCheck < 0) {
+ if (this.mMaxProgresstime > 0 && this.mProgresstime != 0 || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()) {
+ if (aTick % 10 == 0 || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()) {
+ if (!this.depleteInputFromRestrictedHatches(this.mPyrotheumHatches, 5)) {
+ if (mGraceTimer-- == 0) {
+ this.causeMaintenanceIssue();
+ this.stopMachine(
+ ShutDownReasonRegistry
+ .outOfFluid(Objects.requireNonNull(FluidUtils.getFluidStack("pyrotheum", 10))));
+ mGraceTimer = 2;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 8;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ inputSeparation = !inputSeparation;
+ aPlayer.addChatMessage(
+ new ChatComponentTranslation(
+ inputSeparation ? "interaction.separateBusses.enabled" : "interaction.separateBusses.disabled"));
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
+ inputSeparation = aNBT.getBoolean("isBussesSeparate");
+ }
+ }
+
+ public HeatingCoilLevel getCoilLevel() {
+ return mHeatingCapacity;
+ }
+
+ public void setCoilLevel(HeatingCoilLevel aCoilLevel) {
+ mHeatingCapacity = aCoilLevel;
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK4.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK4.java
new file mode 100644
index 0000000000..0981a34b85
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK4.java
@@ -0,0 +1,200 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced;
+
+import java.lang.reflect.Method;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.AdvancedFusionOverclockDescriber;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_FusionComputer;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_Adv_Fusion_MK4 extends GT_MetaTileEntity_FusionComputer {
+
+ public static final Method mUpdateHatchTexture;
+
+ static {
+ mUpdateHatchTexture = ReflectionUtils.getMethod(GT_MetaTileEntity_Hatch.class, "updateTexture", int.class);
+ }
+
+ public GregtechMetaTileEntity_Adv_Fusion_MK4(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Adv_Fusion_MK4(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected OverclockDescriber createOverclockDescriber() {
+ return new AdvancedFusionOverclockDescriber((byte) tier(), capableStartupCanonical());
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Fusion Reactor")
+ .addInfo("HARNESSING THE POWER OF A BLUE GIANT")
+ .addInfo("Controller block for the Fusion Reactor Mk IV")
+ .addInfo("131072EU/t and 320M EU capacity per Energy Hatch")
+ .addInfo("If the recipe has a startup cost greater than the")
+ .addInfo("number of energy hatches * cap, you can't do it")
+ .addInfo("Performs 4/4 overclocks")
+ .addSeparator()
+ .beginStructureBlock(15, 3, 15, false)
+ .addController("See diagram when placed")
+ .addCasingInfoMin("Fusion Machine Casings MK III", 79, false)
+ .addStructureInfo("Cover the coils with casing")
+ .addOtherStructurePart("Advanced Fusion Coils", "Center part of the ring")
+ .addEnergyHatch("1-16, Specified casings", 2)
+ .addInputHatch("2-16, Specified casings", 1)
+ .addOutputHatch("1-16, Specified casings", 3)
+ .addStructureInfo("ALL Hatches must be UHV or better")
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public int tier() {
+ return 9;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return (640010000L * 4) * (Math.min(16, this.mEnergyHatches.size())) / 8L;
+ }
+
+ @Override
+ public long capableStartupCanonical() {
+ return 5_120_000_000L;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Adv_Fusion_MK4(mName);
+ }
+
+ @Override
+ public Block getCasing() {
+ return getFusionCoil();
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 12;
+ }
+
+ @Override
+ public Block getFusionCoil() {
+ return ModBlocks.blockCasings3Misc;
+ }
+
+ @Override
+ public int getFusionCoilMeta() {
+ return 13;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return super.createProcessingLogic().setOverclock(2, 2);
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa)),
+ TextureFactory.builder()
+ .addIcon(this.getIconOverlay())
+ .extFacing()
+ .build() };
+ } else if (!aActive) {
+ return new ITexture[] { new GT_RenderedTexture(
+ Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa)) };
+ } else {
+ return new ITexture[] { new GT_RenderedTexture(
+ TexturesGtBlock.TEXTURE_CASING_FUSION_CASING_ULTRA,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa)) };
+ }
+ }
+
+ @Override
+ public ITexture getTextureOverlay() {
+ return new GT_RenderedTexture(
+ this.getBaseMetaTileEntity()
+ .isActive() ? TexturesGtBlock.Casing_Machine_Screen_3 : TexturesGtBlock.Casing_Machine_Screen_1);
+ }
+
+ public IIconContainer getIconOverlay() {
+ return this.getBaseMetaTileEntity()
+ .isActive() ? TexturesGtBlock.Casing_Machine_Screen_3 : TexturesGtBlock.Casing_Machine_Screen_1;
+ }
+
+ @Override
+ public boolean turnCasingActive(final boolean status) {
+ try {
+ if (this.mEnergyHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Energy hatch : this.mEnergyHatches) {
+ mUpdateHatchTexture.invoke(hatch, (status ? TAE.getIndexFromPage(2, 14) : 53));
+ }
+ }
+ if (this.mOutputHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Output hatch2 : this.mOutputHatches) {
+ mUpdateHatchTexture.invoke(hatch2, (status ? TAE.getIndexFromPage(2, 14) : 53));
+ }
+ }
+ if (this.mInputHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Input hatch3 : this.mInputHatches) {
+ mUpdateHatchTexture.invoke(hatch3, (status ? TAE.getIndexFromPage(2, 14) : 53));
+ }
+ }
+ } catch (Throwable t) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ String tier = "IV";
+ float plasmaOut = 0;
+ int powerRequired = 0;
+ if (this.mLastRecipe != null) {
+ powerRequired = this.mLastRecipe.mEUt;
+ if (this.mLastRecipe.getFluidOutput(0) != null) {
+ plasmaOut = (float) this.mLastRecipe.getFluidOutput(0).amount / (float) this.mLastRecipe.mDuration;
+ }
+ }
+
+ return new String[] { "Fusion Reactor MK " + tier, "EU Required: " + powerRequired + "EU/t",
+ "Stored EU: " + mEUStore + " / " + maxEUStore(), "Plasma Output: " + plasmaOut + "L/t" };
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK5.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK5.java
new file mode 100644
index 0000000000..b2c2e5eb27
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Fusion_MK5.java
@@ -0,0 +1,200 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced;
+
+import java.lang.reflect.Method;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.AdvancedFusionOverclockDescriber;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_FusionComputer;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_Adv_Fusion_MK5 extends GT_MetaTileEntity_FusionComputer {
+
+ public static final Method mUpdateHatchTexture;
+
+ static {
+ mUpdateHatchTexture = ReflectionUtils.getMethod(GT_MetaTileEntity_Hatch.class, "updateTexture", int.class);
+ }
+
+ public GregtechMetaTileEntity_Adv_Fusion_MK5(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Adv_Fusion_MK5(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected OverclockDescriber createOverclockDescriber() {
+ return new AdvancedFusionOverclockDescriber((byte) tier(), capableStartupCanonical());
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Fusion Reactor")
+ .addInfo("HARNESSING THE POWER OF A NEUTRON STAR")
+ .addInfo("Controller block for the Fusion Reactor Mk V")
+ .addInfo("524,288EU/t and 1.28B EU capacity per Energy Hatch")
+ .addInfo("If the recipe has a startup cost greater than the")
+ .addInfo("number of energy hatches * cap, you can't do it")
+ .addInfo("Performs 4/4 overclocks")
+ .addSeparator()
+ .beginStructureBlock(15, 3, 15, false)
+ .addController("See diagram when placed")
+ .addCasingInfoMin("Fusion Machine Casings MK IV", 79, false)
+ .addStructureInfo("Cover the coils with casing")
+ .addOtherStructurePart("Advanced Fusion Coils II", "Center part of the ring")
+ .addEnergyHatch("1-16, Specified casings", 2)
+ .addInputHatch("2-16, Specified casings", 1)
+ .addOutputHatch("1-16, Specified casings", 3)
+ .addStructureInfo("ALL Hatches must be UEV or better")
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public int tier() {
+ return 10;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return (640010000L * 16) * (Math.min(16, this.mEnergyHatches.size())) / 8L;
+ }
+
+ @Override
+ public long capableStartupCanonical() {
+ return 20_480_000_000L;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Adv_Fusion_MK5(mName);
+ }
+
+ @Override
+ public Block getCasing() {
+ return getFusionCoil();
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 0;
+ }
+
+ @Override
+ public Block getFusionCoil() {
+ return ModBlocks.blockCasings6Misc;
+ }
+
+ @Override
+ public int getFusionCoilMeta() {
+ return 1;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return super.createProcessingLogic().setOverclock(2, 2);
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] {
+ new GT_RenderedTexture(
+ Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa)),
+ TextureFactory.builder()
+ .addIcon(this.getIconOverlay())
+ .extFacing()
+ .build() };
+ } else if (!aActive) {
+ return new ITexture[] { new GT_RenderedTexture(
+ Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa)) };
+ } else {
+ return new ITexture[] { new GT_RenderedTexture(
+ TexturesGtBlock.TEXTURE_CASING_FUSION_CASING_HYPER,
+ Dyes.getModulation(-1, Dyes._NULL.mRGBa)) };
+ }
+ }
+
+ @Override
+ public ITexture getTextureOverlay() {
+ return new GT_RenderedTexture(
+ this.getBaseMetaTileEntity()
+ .isActive() ? TexturesGtBlock.Casing_Machine_Screen_Rainbow : TexturesGtBlock.Casing_Machine_Screen_1);
+ }
+
+ public IIconContainer getIconOverlay() {
+ return this.getBaseMetaTileEntity()
+ .isActive() ? TexturesGtBlock.Casing_Machine_Screen_Rainbow : TexturesGtBlock.Casing_Machine_Screen_1;
+ }
+
+ @Override
+ public boolean turnCasingActive(final boolean status) {
+ try {
+ if (this.mEnergyHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Energy hatch : this.mEnergyHatches) {
+ mUpdateHatchTexture.invoke(hatch, (status ? TAE.getIndexFromPage(3, 6) : 53));
+ }
+ }
+ if (this.mOutputHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Output hatch2 : this.mOutputHatches) {
+ mUpdateHatchTexture.invoke(hatch2, (status ? TAE.getIndexFromPage(3, 6) : 53));
+ }
+ }
+ if (this.mInputHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Input hatch3 : this.mInputHatches) {
+ mUpdateHatchTexture.invoke(hatch3, (status ? TAE.getIndexFromPage(3, 6) : 53));
+ }
+ }
+ } catch (Throwable t) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ String tier = "V";
+ float plasmaOut = 0;
+ int powerRequired = 0;
+ if (this.mLastRecipe != null) {
+ powerRequired = this.mLastRecipe.mEUt;
+ if (this.mLastRecipe.getFluidOutput(0) != null) {
+ plasmaOut = (float) this.mLastRecipe.getFluidOutput(0).amount / (float) this.mLastRecipe.mDuration;
+ }
+ }
+
+ return new String[] { "Fusion Reactor MK " + tier, "EU Required: " + powerRequired + "EU/t",
+ "Stored EU: " + mEUStore + " / " + maxEUStore(), "Plasma Output: " + plasmaOut + "L/t" };
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_HeatExchanger.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_HeatExchanger.java
new file mode 100644
index 0000000000..e4340c4d28
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_HeatExchanger.java
@@ -0,0 +1,414 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.block.base.BasicBlock.BlockTypes;
+import gtPlusPlus.core.block.base.BlockBaseModular;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_Adv_HeatExchanger
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_Adv_HeatExchanger> {
+
+ private static final int CASING_INDEX = TAE.getIndexFromPage(1, 12);
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+
+ private static final IStructureDefinition<GregtechMetaTileEntity_Adv_HeatExchanger> STRUCTURE_DEFINITION = StructureDefinition
+ .<GregtechMetaTileEntity_Adv_HeatExchanger>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(
+ new String[][] { { " ccc ", "cCCCc", "cCCCc", "cCCCc", " ccc " },
+ { " ccc ", "cPPPc", "cPPPc", "cPPPc", " ccc " }, { " ccc ", "cPPPc", "cPPPc", "cPPPc", " ccc " },
+ { " ccc ", "cPPPc", "cPPPc", "cPPPc", " ccc " }, { " ccc ", "cPPPc", "cPPPc", "cPPPc", " ccc " },
+ { " c~c ", "cPPPc", "cPPPc", "cPPPc", " ccc " }, { " hhh ", "hHHHh", "hHHHh", "hHHHh", " hhh " },
+ { " f f ", "f f", " ", "f f", " f f " },
+ { " f f ", "f f", " ", "f f", " f f " }, }))
+ .addElement('P', ofBlock(GregTech_API.sBlockCasings2, 15))
+ .addElement('f', ofBlock(getFrame(), 0))
+ .addElement(
+ 'C',
+ ofChain(
+ ofHatchAdder(
+ GregtechMetaTileEntity_Adv_HeatExchanger::addColdFluidOutputToMachineList,
+ CASING_INDEX,
+ 2),
+ onElementPass(
+ GregtechMetaTileEntity_Adv_HeatExchanger::onCasingAdded,
+ ofBlock(ModBlocks.blockSpecialMultiCasings, 14))))
+ .addElement(
+ 'H',
+ ofChain(
+ ofHatchAdder(GregtechMetaTileEntity_Adv_HeatExchanger::addHotFluidInputToMachineList, CASING_INDEX, 3),
+ onElementPass(
+ GregtechMetaTileEntity_Adv_HeatExchanger::onCasingAdded,
+ ofBlock(ModBlocks.blockSpecialMultiCasings, 14))))
+ .addElement(
+ 'h',
+ ofChain(
+ ofHatchAdder(GregtechMetaTileEntity_Adv_HeatExchanger::addInputToMachineList, CASING_INDEX, 1),
+ ofHatchAdder(GregtechMetaTileEntity_Adv_HeatExchanger::addOutputToMachineList, CASING_INDEX, 1),
+ ofHatchAdder(GregtechMetaTileEntity_Adv_HeatExchanger::addMaintenanceToMachineList, CASING_INDEX, 1),
+ onElementPass(
+ GregtechMetaTileEntity_Adv_HeatExchanger::onCasingAdded,
+ ofBlock(ModBlocks.blockSpecialMultiCasings, 14))))
+ .addElement(
+ 'c',
+ ofChain(
+ onElementPass(
+ GregtechMetaTileEntity_Adv_HeatExchanger::onCasingAdded,
+ ofBlock(ModBlocks.blockSpecialMultiCasings, 14))))
+ .build();
+ public static float penalty_per_config = 0.015f; // penalize 1.5% efficiency per circuitry level (1-25)
+
+ private GT_MetaTileEntity_Hatch_Input mInputHotFluidHatch;
+ private GT_MetaTileEntity_Hatch_Output mOutputColdFluidHatch;
+ private boolean superheated = false;
+ private int superheated_threshold = 0;
+ private float water;
+ private int mCasingAmount;
+
+ public GregtechMetaTileEntity_Adv_HeatExchanger(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Adv_HeatExchanger(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the XL Heat Exchanger")
+ .addInfo("More complicated than a Fusion Reactor. Seriously")
+ .addInfo("But you know this by now, right?")
+ .addInfo("Works as fast as 32 Large Heat Exchangers")
+ .addSeparator()
+ .addInfo("Inputs are Hot Coolant or Lava")
+ .addInfo("Outputs Coolant or Pahoehoe Lava and SH Steam/Steam")
+ .addInfo("Outputs SH Steam if input flow is equal to or above a certain value:")
+ .addInfo("Hot Coolant: 25,600 L/s, maximum 51,200 L/s, max output 10,240,000 SH Steam/s")
+ .addInfo("Lava: 32,000 L/s, maximum 64,000 L/s, max output 5,120,000 SH Steam/s")
+ .addInfo("A circuit in the controller lowers the SH Steam threshold and efficiency")
+ .addInfo("3.75% reduction and 1.5% efficiency loss per circuit config over 1")
+ .addSeparator()
+ .beginStructureBlock(5, 9, 5, false)
+ .addController("Front bottom")
+ .addCasingInfoMin("Reinforced Heat Exchanger Casing", 90, false)
+ .addOtherStructurePart("Tungstensteel Pipe Casing", "Center 3x5x3 (45 blocks)")
+ .addMaintenanceHatch("Any casing", 1)
+ .addInputHatch("Hot fluid, bottom center", 2)
+ .addInputHatch("Distilled water, any bottom layer casing", 1)
+ .addOutputHatch("Cold fluid, top center", 3)
+ .addOutputHatch("Steam/SH Steam, any bottom layer casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ superheated = aNBT.getBoolean("superheated");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setBoolean("superheated", superheated);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_INDEX;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> !r.isUpsideDown() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ if (mInputHotFluidHatch.getFluid() == null) return CheckRecipeResultRegistry.SUCCESSFUL;
+
+ int fluidAmountToConsume = mInputHotFluidHatch.getFluidAmount(); // how much fluid is in hatch
+
+ // The XL LHE works as fast as 32 regular LHEs. These are the comments from the original LHE,
+ // with changes where the values needed to change for the 32x speed multiplier
+ superheated_threshold = 128000; // default: must have 4000L -> 128000L per second to generate superheated steam
+ float efficiency = 1f; // default: operate at 100% efficiency with no integrated circuitry
+ int shs_reduction_per_config = 4800; // reduce threshold 150L -> 4800L per second per circuitry level (1-25)
+ float steam_output_multiplier = 20f; // default: multiply output by 4 * 10 (boosted x5)
+ float penalty = 0.0f; // penalty to apply to output based on circuitry level (1-25).
+ boolean do_lava = false;
+
+ // Do we have an integrated circuit with a valid configuration?
+ if (mInventory[1] != null && mInventory[1].getUnlocalizedName()
+ .startsWith("gt.integrated_circuit")) {
+ int circuit_config = mInventory[1].getItemDamage();
+ if (circuit_config >= 1 && circuit_config <= 25) {
+ // If so, apply the penalty and reduced threshold.
+ penalty = (circuit_config - 1) * penalty_per_config;
+ superheated_threshold -= (shs_reduction_per_config * (circuit_config - 1));
+ }
+ }
+ efficiency -= penalty;
+
+ // If we're working with lava, adjust the threshold and multipliers accordingly.
+ if (GT_ModHandler.isLava(mInputHotFluidHatch.getFluid())) {
+ steam_output_multiplier /= 5f; // lava is not boosted
+ superheated_threshold /= 4f; // unchanged
+ do_lava = true;
+ } else if (mInputHotFluidHatch.getFluid()
+ .isFluidEqual(FluidRegistry.getFluidStack("ic2hotcoolant", 1))) {
+ steam_output_multiplier /= 2f; // was boosted x2 on top of x5 -> total x10 -> nerf with this code back
+ // to 5x
+ superheated_threshold /= 5f; // 10x smaller since the Hot Things production in reactor is the same.
+ } else {
+ // If we're working with neither, fail out
+ superheated_threshold = 0;
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ superheated = fluidAmountToConsume >= superheated_threshold; // set the internal superheated flag if we have
+ // enough hot fluid. Used in the
+ // onRunningTick method.
+ fluidAmountToConsume = Math.min(fluidAmountToConsume, superheated_threshold * 2); // Don't consume too much hot
+ // fluid per second, maximum
+ // is 2x SH threshold.
+ mInputHotFluidHatch.drain(fluidAmountToConsume, true);
+ this.mMaxProgresstime = 20;
+ this.lEUt = (long) (fluidAmountToConsume * steam_output_multiplier * efficiency);
+ if (do_lava) {
+ mOutputColdFluidHatch.fill(FluidRegistry.getFluidStack("ic2pahoehoelava", fluidAmountToConsume), true);
+ } else {
+ mOutputColdFluidHatch.fill(FluidRegistry.getFluidStack("ic2coolant", fluidAmountToConsume), true);
+ }
+ this.mEfficiencyIncrease = 80;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ private int useWater(float input) {
+ water = water + input;
+ int usage = (int) water;
+ water = water - usage;
+ return usage;
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (this.lEUt > 0) {
+ int tGeneratedEU = (int) (this.lEUt * 2L * this.mEfficiency / 10000L); // APPROXIMATELY how much steam to
+ // generate.
+ if (tGeneratedEU > 0) {
+
+ if (superheated) tGeneratedEU /= 2; // We produce half as much superheated steam if necessary
+
+ int distilledConsumed = useWater(tGeneratedEU / 160f); // how much distilled water to consume
+ // tGeneratedEU = distilledConsumed * 160; // EXACTLY how much steam to generate, producing a perfect
+ // 1:160 ratio with distilled water consumption
+
+ FluidStack distilledStack = GT_ModHandler.getDistilledWater(distilledConsumed);
+ if (depleteInput(distilledStack)) // Consume the distilled water
+ {
+ if (superheated) {
+ addOutput(FluidRegistry.getFluidStack("ic2superheatedsteam", tGeneratedEU)); // Generate
+ // superheated
+ // steam
+ } else {
+ addOutput(GT_ModHandler.getSteam(tGeneratedEU)); // Generate regular steam
+ }
+ } else {
+ GT_Log.exp.println(this.mName + " had no more Distilled water!");
+ explodeMultiblock(); // Generate crater
+ }
+ }
+ return true;
+ }
+ return true;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_Adv_HeatExchanger> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ private void onCasingAdded() {
+ mCasingAmount++;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mOutputColdFluidHatch = null;
+ mInputHotFluidHatch = null;
+ mCasingAmount = 0;
+ return checkPiece(STRUCTURE_PIECE_MAIN, 2, 5, 0) && mCasingAmount >= 90 && mMaintenanceHatches.size() == 1;
+ }
+
+ public boolean addColdFluidOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ mOutputColdFluidHatch = (GT_MetaTileEntity_Hatch_Output) aMetaTileEntity;
+ return true;
+ }
+ return false;
+ }
+
+ public boolean addHotFluidInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = getRecipeMap();
+ mInputHotFluidHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Adv_HeatExchanger(this.mName);
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return super.isGivingInformation();
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] {
+ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s",
+ StatCollector.translateToLocal("GT5U.multiblock.usage") + " "
+ + StatCollector.translateToLocal("GT5U.LHE.steam")
+ + ": "
+ + (superheated ? EnumChatFormatting.RED : EnumChatFormatting.YELLOW)
+ + GT_Utility.formatNumbers(superheated ? -2 * lEUt : -lEUt)
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": "
+ + EnumChatFormatting.RED
+ + (getIdealStatus() - getRepairStatus())
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.multiblock.efficiency")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + mEfficiency / 100.0F
+ + EnumChatFormatting.RESET
+ + " %",
+ StatCollector.translateToLocal("GT5U.LHE.superheated") + ": "
+ + (superheated ? EnumChatFormatting.RED : EnumChatFormatting.BLUE)
+ + superheated
+ + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.LHE.superheated") + " "
+ + StatCollector.translateToLocal("GT5U.LHE.threshold")
+ + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(superheated_threshold)
+ + EnumChatFormatting.RESET };
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 5, 0);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Heat Exchanger";
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 0;
+ }
+
+ private static Block sFrame;
+
+ public static Block getFrame() {
+ if (sFrame == null) {
+ sFrame = BlockBaseModular.getMaterialBlock(ALLOY.TALONITE, BlockTypes.FRAME);
+ }
+ return sFrame;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Implosion.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Implosion.java
new file mode 100644
index 0000000000..432ce23e74
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/advanced/GregtechMetaTileEntity_Adv_Implosion.java
@@ -0,0 +1,177 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.GregTech_API.sBlockCasings4;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_Adv_Implosion
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_Adv_Implosion> {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_Adv_Implosion> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_Adv_Implosion(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Adv_Implosion(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Adv_Implosion(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Implosion Compressor";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Factory Grade Advanced Implosion Compressor")
+ .addInfo("Speed: +100% | EU Usage: 100% | Parallel: ((Tier/2)+1)")
+ .addInfo("Constructed exactly the same as a normal Implosion Compressor")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoMin("Robust TungstenSteel Casing", 10, false)
+ .addInputBus("Any casing", 1)
+ .addOutputBus("Any casing", 1)
+ .addEnergyHatch("Any casing", 1)
+ .addMaintenanceHatch("Any casing", 1)
+ .addMufflerHatch("Any casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_Adv_Implosion> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_Adv_Implosion>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_Adv_Implosion.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(48)
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(sBlockCasings4, 0))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 10 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 48;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.implosionRecipes;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.RANDOM_EXPLODE;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAdvImplosion;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (GT_Utility.getTier(this.getMaxInputVoltage()) / 2 + 1);
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamCompressor.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamCompressor.java
new file mode 100644
index 0000000000..0845c7f061
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamCompressor.java
@@ -0,0 +1,156 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.steam;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.GregTech_API.sBlockCasings1;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_SteamMultiBase;
+
+public class GregtechMetaTileEntity_SteamCompressor
+ extends GregtechMeta_SteamMultiBase<GregtechMetaTileEntity_SteamCompressor> implements ISurvivalConstructable {
+
+ private String mCasingName = "Bronze Plated Bricks";
+ private static IStructureDefinition<GregtechMetaTileEntity_SteamCompressor> STRUCTURE_DEFINITION = null;
+ private int mCasing;
+
+ public GregtechMetaTileEntity_SteamCompressor(String aName) {
+ super(aName);
+ }
+
+ public GregtechMetaTileEntity_SteamCompressor(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity arg0) {
+ return new GregtechMetaTileEntity_SteamCompressor(this.mName);
+ }
+
+ @Override
+ protected GT_RenderedTexture getFrontOverlay() {
+ return new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR);
+ }
+
+ @Override
+ protected GT_RenderedTexture getFrontOverlayActive() {
+ return new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Compressor";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Steam Compressor")
+ .addInfo("33.3% faster than using a single block Steam Compressor.")
+ .addInfo("Uses only 66.6% of the steam/s compared to a single block Steam Compressor.")
+ .addInfo("Compresses up to " + getMaxParallelRecipes() + " things at a time")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 4, true)
+ .addController("Front center")
+ .addCasingInfoMin(mCasingName, 28, false)
+ .addOtherStructurePart(TT_steaminputbus, "Any casing", 1)
+ .addOtherStructurePart(TT_steamoutputbus, "Any casing", 1)
+ .addOtherStructurePart(TT_steamhatch, "Any casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_SteamCompressor> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_SteamCompressor>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC", "CCC" }, { "C~C", "C-C", "C-C", "CCC" },
+ { "CCC", "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildSteamInput(GregtechMetaTileEntity_SteamCompressor.class).casingIndex(10)
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_SteamCompressor.class)
+ .atLeast(SteamHatchElement.InputBus_Steam, SteamHatchElement.OutputBus_Steam)
+ .casingIndex(10)
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(sBlockCasings1, 10))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ fixAllMaintenanceIssue();
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 28;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 8;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.compressorRecipes;
+ }
+
+ // note that a basic steam machine has .setEUtDiscount(2F).setSpeedBoost(2F). So these are bonuses.
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Override
+ @Nonnull
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return GT_OverclockCalculator.ofNoOverclock(recipe)
+ .setEUtDiscount(1.33F)
+ .setSpeedBoost(1.5F);
+ }
+ }.setMaxParallel(getMaxParallelRecipes());
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamMacerator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamMacerator.java
new file mode 100644
index 0000000000..dce362fa14
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/GregtechMetaTileEntity_SteamMacerator.java
@@ -0,0 +1,165 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.steam;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.GregTech_API.sBlockCasings1;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_SteamMultiBase;
+
+public class GregtechMetaTileEntity_SteamMacerator
+ extends GregtechMeta_SteamMultiBase<GregtechMetaTileEntity_SteamMacerator> implements ISurvivalConstructable {
+
+ private String mCasingName = "Bronze Plated Bricks";
+ private static IStructureDefinition<GregtechMetaTileEntity_SteamMacerator> STRUCTURE_DEFINITION = null;
+ private int mCasing;
+
+ public GregtechMetaTileEntity_SteamMacerator(String aName) {
+ super(aName);
+ }
+
+ public GregtechMetaTileEntity_SteamMacerator(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity arg0) {
+ return new GregtechMetaTileEntity_SteamMacerator(this.mName);
+ }
+
+ @Override
+ protected GT_RenderedTexture getFrontOverlay() {
+ return new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR);
+ }
+
+ @Override
+ protected GT_RenderedTexture getFrontOverlayActive() {
+ return new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Macerator";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ if (mCasingName.contains("gt.blockcasings")) {
+ mCasingName = ItemList.Casing_BronzePlatedBricks.get(1)
+ .getDisplayName();
+ }
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Steam Macerator")
+ .addInfo("33.3% faster than using a single block Steam Macerator.")
+ .addInfo("Uses only 66.6% of the steam/s required compared to a single block Steam Macerator.")
+ .addInfo("Macerates up to " + getMaxParallelRecipes() + " things at a time")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoMin(mCasingName, 14, false)
+ .addOtherStructurePart(TT_steaminputbus, "Any casing", 1)
+ .addOtherStructurePart(TT_steamoutputbus, "Any casing", 1)
+ .addOtherStructurePart(TT_steamhatch, "Any casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_SteamMacerator> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_SteamMacerator>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildSteamInput(GregtechMetaTileEntity_SteamMacerator.class).casingIndex(10)
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_SteamMacerator.class)
+ .atLeast(SteamHatchElement.InputBus_Steam, SteamHatchElement.OutputBus_Steam)
+ .casingIndex(10)
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(sBlockCasings1, 10))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ fixAllMaintenanceIssue();
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 14;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 8;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.maceratorRecipes;
+ }
+
+ // note that a basic steam machine has .setEUtDiscount(2F).setSpeedBoost(2F). So these are bonuses.
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Override
+ @Nonnull
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return GT_OverclockCalculator.ofNoOverclock(recipe)
+ .setEUtDiscount(1.33F)
+ .setSpeedBoost(1.5F);
+ }
+
+ }.setMaxParallel(getMaxParallelRecipes());
+ }
+
+ @Override
+ public int getItemOutputLimit() {
+ return 1;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_AutoCrafter.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_AutoCrafter.java
new file mode 100644
index 0000000000..6cae5e4bcd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_AutoCrafter.java
@@ -0,0 +1,196 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GT4Entity_AutoCrafter extends GregtechMeta_MultiBlockBase<GT4Entity_AutoCrafter>
+ implements ISurvivalConstructable {
+
+ protected GT_Recipe lastRecipeToBuffer;
+ private int casing;
+ private static IStructureDefinition<GT4Entity_AutoCrafter> STRUCTURE_DEFINITION = null;
+
+ public GT4Entity_AutoCrafter(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT4Entity_AutoCrafter(String mName) {
+ super(mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Assembler";
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity tileEntity) {
+ return new GT4Entity_AutoCrafter(this.mName);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack itemStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAutoCrafter;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Highly Advanced Assembling Machine")
+ .addInfo("200% faster than using single block machines of the same voltage")
+ .addInfo("Processes two items per voltage tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoRange("Bulk Production Frame", 10, 25, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DISASSEMBLER_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DISASSEMBLER;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(0, 10);
+ }
+
+ @Override
+ public IStructureDefinition<GT4Entity_AutoCrafter> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GT4Entity_AutoCrafter>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GT4Entity_AutoCrafter.class)
+ .atLeast(InputBus, OutputBus, InputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.casing, ofBlock(ModBlocks.blockCasings2Misc, 12))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack itemStack, boolean hintsOnly) {
+ buildPiece(mName, itemStack, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack itemStack, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, itemStack, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity baseMetaTileEntity, ItemStack itemStack) {
+ casing = 0;
+ return checkPiece(mName, 1, 1, 0) && casing >= 10 && checkHatch();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.assemblerRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 3F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 2 * (Math.max(1, GT_Utility.getTier(getMaxInputVoltage())));
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ final String running = (this.mMaxProgresstime > 0 ? "Auto-Crafter running" : "Auto-Crafter stopped");
+ final String maintenance = (this.getIdealStatus() == this.getRepairStatus() ? "No Maintenance issues"
+ : "Needs Maintenance");
+ String tSpecialText;
+
+ if (lastRecipeToBuffer != null && lastRecipeToBuffer.mOutputs[0].getDisplayName() != null) {
+ tSpecialText = "Currently processing: " + lastRecipeToBuffer.mOutputs[0].getDisplayName();
+ } else {
+ tSpecialText = "Currently processing: Nothing";
+ }
+
+ return new String[] { "Large Scale Auto-Assembler v1.01c", running, maintenance, tSpecialText };
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_ThermalBoiler.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_ThermalBoiler.java
new file mode 100644
index 0000000000..b7a4afb878
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GT4Entity_ThermalBoiler.java
@@ -0,0 +1,353 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT4Entity_ThermalBoiler extends GregtechMeta_MultiBlockBase<GT4Entity_ThermalBoiler>
+ implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GT4Entity_ThermalBoiler> STRUCTURE_DEFINITION = null;
+
+ private static final int lavaFilterResilience = 30; // Damage lava filter with 1/n probability every operation.
+ private int dryHeatCounter = 0; // Counts up to dryHeatMaximum to check for explosion conditions.
+ private static final int dryHeatMaximum = 10; // 10 consecutive operations without water = BOOM
+
+ private static final Item itemLavaFilter = ItemList.Component_LavaFilter.getItem();
+ private static final Item itemObsidian = Item.getItemFromBlock(Blocks.obsidian);
+ private static final Fluid fluidWater = FluidRegistry.WATER;
+ private static final Fluid fluidDistilledWater = FluidUtils.getDistilledWater(1)
+ .getFluid();
+ private static final Fluid fluidSteam = FluidUtils.getSteam(1)
+ .getFluid();
+ private static final Fluid fluidSHSteam = FluidUtils.getSuperHeatedSteam(1)
+ .getFluid();
+
+ public GT4Entity_ThermalBoiler(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT4Entity_ThermalBoiler(String mName) {
+ super(mName);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT4Entity_ThermalBoiler(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Boiler";
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return (aStack != null && aStack.getItem() == itemLavaFilter) ? 1 : 0;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.thermalBoilerRecipes;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return false;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ // Only test against the first fluid input in the recipe.
+ // We still want to run if we lack water (and subsequently explode).
+ @NotNull
+ @Override
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ if (lastRecipe != null && depleteInput(lastRecipe.mFluidInputs[0], true)) {
+ return Stream.of(lastRecipe);
+ }
+ if (map == null) {
+ return Stream.empty();
+ }
+ return map.getAllRecipes()
+ .stream()
+ .filter(recipe -> depleteInput(recipe.mFluidInputs[0], true));
+ }
+
+ @NotNull
+ @Override
+ protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) {
+ GT_Recipe adjustedRecipe = recipe.copy();
+
+ // Hack the recipe logic to not consume water, so that we can explode.
+ for (FluidStack inputFluid : adjustedRecipe.mFluidInputs) {
+ if (inputFluid != null
+ && (inputFluid.getFluid() == fluidWater || inputFluid.getFluid() == fluidDistilledWater)) {
+ inputFluid.amount = 0;
+ }
+ }
+
+ // If we don't have a lava filter, remove non-obsidian outputs
+ // so that output space for them is not required if void protection is on.
+ if (!findLavaFilter()) {
+ for (ItemStack outputItem : adjustedRecipe.mOutputs) {
+ if (outputItem != null && outputItem.getItem() != itemObsidian) {
+ outputItem.stackSize = 0;
+ }
+ }
+ }
+ return super.createParallelHelper(adjustedRecipe);
+ }
+ };
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ // super.checkProcessing() instantly sets efficiency to maximum, override this.
+ int efficiency = mEfficiency;
+ CheckRecipeResult result = super.checkProcessing();
+ if (result.wasSuccessful()) {
+ mEfficiency = efficiency;
+ mEfficiencyIncrease = mMaxProgresstime * getEfficiencyIncrease();
+
+ // Adjust steam output based on efficiency.
+ if (mOutputFluids != null) {
+ for (FluidStack outputFluid : mOutputFluids) {
+ if (outputFluid != null
+ && (outputFluid.getFluid() == fluidSteam || outputFluid.getFluid() == fluidSHSteam)) {
+
+ // Purely for display reasons, we don't actually make any EU.
+ if (outputFluid.getFluid() == fluidSteam) {
+ lEUt = outputFluid.amount / mMaxProgresstime / 2;
+ } else {
+ lEUt = outputFluid.amount / mMaxProgresstime;
+ }
+
+ // Adjust steam output based on efficiency.
+ // TODO: This is not reflected in the GUI while the player has it open??
+ if (mEfficiency < getMaxEfficiency(null)) {
+ outputFluid.amount = Math
+ .max(1, (outputFluid.amount * mEfficiency) / getMaxEfficiency(null));
+ }
+
+ // Consume water to run recipe.
+ if (!useWater(outputFluid.amount)) {
+ outputFluid.amount = 0;
+ lEUt = 0;
+ }
+ }
+ }
+ }
+
+ // Remove non-obsidian outputs if we can't damage lava filter.
+ if (mOutputItems != null && mOutputItems.length > 0) {
+ if (!damageLavaFilter()) {
+ for (ItemStack outputItem : mOutputItems) {
+ if (outputItem != null && outputItem.getItem() != itemObsidian) {
+ outputItem.stackSize = 0;
+ }
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ private boolean findLavaFilter() {
+ if (getControllerSlot() == null) {
+ for (var bus : mInputBusses) {
+ for (ItemStack stack : bus.mInventory) {
+ if (stack != null && stack.getItem() == itemLavaFilter) {
+ setGUIItemStack(stack);
+ return true;
+ }
+ }
+ }
+ return false;
+ } else {
+ return getControllerSlot().getItem() == itemLavaFilter;
+ }
+ }
+
+ private boolean damageLavaFilter() {
+ if (!findLavaFilter()) return false;
+ if (getBaseMetaTileEntity().getRandomNumber(lavaFilterResilience) > 0) return true;
+
+ ItemStack filter = getControllerSlot();
+ if (filter.attemptDamageItem(1, getBaseMetaTileEntity().getWorld().rand)) {
+ mInventory[1] = null;
+ }
+ return true;
+ }
+
+ private boolean useWater(int steamAmount) {
+ // Round up to not dupe decimal amounts of water.
+ int waterAmount = Math.floorDiv(steamAmount + GT_Values.STEAM_PER_WATER - 1, GT_Values.STEAM_PER_WATER);
+ if (depleteInput(FluidUtils.getWater(waterAmount)) || depleteInput(FluidUtils.getDistilledWater(waterAmount))) {
+ dryHeatCounter = 0;
+ return true;
+ } else {
+ // Add some leniency with explosions.
+ if (dryHeatCounter < dryHeatMaximum) {
+ ++dryHeatCounter;
+ } else {
+ GT_Log.exp.println(this.mName + " was too hot and had no more Water!");
+ explodeMultiblock(); // Generate crater
+ }
+ return false;
+ }
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ public int getEfficiencyIncrease() {
+ return 12;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiThermalBoiler;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Thermal Boiler Controller")
+ .addInfo("Converts Water & Heat into Steam")
+ .addInfo("Filters raw materials from lava")
+ .addInfo("Explodes if water is not supplied")
+ .addInfo("Consult user manual for more information")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Thermal Containment Casings", 10, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(1);
+ }
+
+ @Override
+ public IStructureDefinition<GT4Entity_ThermalBoiler> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GT4Entity_ThermalBoiler>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GT4Entity_ThermalBoiler.class)
+ .atLeast(InputBus, OutputBus, InputHatch, OutputHatch, Maintenance, Muffler)
+ .casingIndex(TAE.getIndexFromPage(0, 1))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 11))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 10 && checkHatch();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_ElementalDuplicator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_ElementalDuplicator.java
new file mode 100644
index 0000000000..d835d9be4c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_ElementalDuplicator.java
@@ -0,0 +1,352 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_ElementalDataOrbHolder;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMTE_ElementalDuplicator extends GregtechMeta_MultiBlockBase<GregtechMTE_ElementalDuplicator>
+ implements ISurvivalConstructable {
+
+ private final ArrayList<GT_MetaTileEntity_Hatch_ElementalDataOrbHolder> mReplicatorDataOrbHatches = new ArrayList<>();
+ private static final int CASING_TEXTURE_ID = TAE.getIndexFromPage(0, 3);
+ private int mCasing = 0;
+
+ public GregtechMTE_ElementalDuplicator(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMTE_ElementalDuplicator(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMTE_ElementalDuplicator(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Replicator";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Produces Elemental Material from UU Matter")
+ .addInfo("Speed: +100% | EU Usage: 100% | Parallel: 8 * Tier")
+ .addInfo("Maximum 1x of each bus/hatch.")
+ .addInfo("Requires circuit 1-16 in your Data Orb Repository")
+ .addInfo("depending on what Data Orb you want to prioritize")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(9, 6, 9, true)
+ .addController("Top Center")
+ .addCasingInfoMin("Elemental Confinement Shell", 138, false)
+ .addCasingInfoMin("Matter Fabricator Casing", 24, false)
+ .addCasingInfoMin("Particle Containment Casing", 24, false)
+ .addCasingInfoMin("Matter Generation Coil", 24, false)
+ .addCasingInfoMin("High Voltage Current Capacitor", 20, false)
+ .addCasingInfoMin("Resonance Chamber III", 24, false)
+ .addCasingInfoMin("Modulator III", 16, false)
+ .addOtherStructurePart("Data Orb Repository", "1x", 1)
+ .addInputHatch("Any 1 dot hint", 1)
+ .addOutputBus("Any 1 dot hint", 1)
+ .addOutputHatch("Any 1 dot hint", 1)
+ .addEnergyHatch("Any 1 dot hint", 1)
+ .addMaintenanceHatch("Any 1 dot hint", 1)
+ .addMufflerHatch("Any 1 dot hint", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static IStructureDefinition<GregtechMTE_ElementalDuplicator> STRUCTURE_DEFINITION = null;
+
+ @Override
+ public IStructureDefinition<GregtechMTE_ElementalDuplicator> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMTE_ElementalDuplicator>builder()
+
+ // h = Hatch
+ // c = Casing
+
+ // a = MF Casing 1
+ // b = Matter Gen Coil
+
+ // d = Current Capacitor
+ // e = Particle
+
+ // f = Resonance III
+ // g = Modulator III
+
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ (new String[][] {
+ { " ccc ", " ccccc ", " ccccccc ", "ccchhhccc", "ccch~hccc", "ccchhhccc", " ccccccc ",
+ " ccccc ", " ccc " },
+ { " cac ", " abfba ", " abfgfba ", "cbfgdgfbc", "afgdddgfa", "cbfgdgfbc", " abfgfba ",
+ " abfba ", " cac " },
+ { " cec ", " e e ", " e e ", "c d c", "e ddd e", "c d c", " e e ",
+ " e e ", " cec " },
+ { " cec ", " e e ", " e e ", "c d c", "e ddd e", "c d c", " e e ",
+ " e e ", " cec " },
+ { " cac ", " abfba ", " abfgfba ", "cbfgdgfbc", "afgdddgfa", "cbfgdgfbc", " abfgfba ",
+ " abfba ", " cac " },
+ { " ccc ", " ccccc ", " ccccccc ", "ccchhhccc", "ccchhhccc", "ccchhhccc", " ccccccc ",
+ " ccccc ", " ccc " }, }))
+ .addElement('a', ofBlock(getCasingBlock4(), getCasingMeta6()))
+ .addElement('b', ofBlock(getCasingBlock4(), getCasingMeta7()))
+ .addElement('d', ofBlock(getCasingBlock2(), getCasingMeta2()))
+ .addElement('e', ofBlock(getCasingBlock2(), getCasingMeta3()))
+ .addElement('f', ofBlock(getCasingBlock3(), getCasingMeta4()))
+ .addElement('g', ofBlock(getCasingBlock3(), getCasingMeta5()))
+ .addElement('c', lazy(t -> onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .addElement(
+ 'h',
+ lazy(
+ t -> ofChain(
+ buildHatchAdder(GregtechMTE_ElementalDuplicator.class)
+ .atLeast(InputHatch, OutputBus, OutputHatch, Maintenance, Muffler, Energy)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMTE_ElementalDuplicator.class)
+ .hatchClass(GT_MetaTileEntity_Hatch_ElementalDataOrbHolder.class)
+ .shouldReject(x -> x.mReplicatorDataOrbHatches.size() >= 1)
+ .adder(GregtechMTE_ElementalDuplicator::addDataOrbHatch)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta())))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 4, 4, 0);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ boolean aDidBuild = checkPiece(STRUCTURE_PIECE_MAIN, 4, 4, 0);
+ if (this.mInputHatches.size() != 1 || (this.mOutputBusses.size() != 1 && this.mOutputHatches.size() != 0)
+ || this.mEnergyHatches.size() != 1
+ || this.mReplicatorDataOrbHatches.size() != 1) {
+ return false;
+ }
+ log("Casings: " + mCasing);
+ return aDidBuild && mCasing >= 138 && checkHatch();
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack itemStack, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, itemStack, 4, 4, 0, elementBudget, env, false, true);
+ }
+
+ protected static int getCasingTextureIndex() {
+ return CASING_TEXTURE_ID;
+ }
+
+ protected static Block getCasingBlock() {
+ return ModBlocks.blockCasings5Misc;
+ }
+
+ protected static Block getCasingBlock2() {
+ return ModBlocks.blockSpecialMultiCasings;
+ }
+
+ protected static Block getCasingBlock3() {
+ return ModBlocks.blockSpecialMultiCasings2;
+ }
+
+ protected static Block getCasingBlock4() {
+ return ModBlocks.blockCasingsMisc;
+ }
+
+ protected static int getCasingMeta() {
+ return 3;
+ }
+
+ protected static int getCasingMeta2() {
+ return 12;
+ }
+
+ protected static int getCasingMeta3() {
+ return 13;
+ }
+
+ protected static int getCasingMeta4() {
+ return 2;
+ }
+
+ protected static int getCasingMeta5() {
+ return 6;
+ }
+
+ protected static int getCasingMeta6() {
+ return 9;
+ }
+
+ protected static int getCasingMeta7() {
+ return 8;
+ }
+
+ private boolean addDataOrbHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_ElementalDataOrbHolder) {
+ try {
+ return addToMachineListInternal(mReplicatorDataOrbHatches, aMetaTileEntity, aBaseCasingIndex);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d == ForgeDirection.UP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.replicatorRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().setSpeedBonus(1F / 2F)
+ .enablePerfectOverclock()
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void setupProcessingLogic(ProcessingLogic logic) {
+ super.setupProcessingLogic(logic);
+ for (GT_MetaTileEntity_Hatch_ElementalDataOrbHolder hatch : filterValidMTEs(mReplicatorDataOrbHatches)) {
+ ItemStack orb = hatch.getOrbByCircuit();
+ logic.setSpecialSlotItem(orb);
+ break;
+ }
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (8 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiMolecularTransformer;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (this.mUpdate == 1 || this.mStartUpCheck == 1) {
+ this.mReplicatorDataOrbHatches.clear();
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public ArrayList<ItemStack> getStoredInputs() {
+ ArrayList<ItemStack> tItems = super.getStoredInputs();
+ for (GT_MetaTileEntity_Hatch_ElementalDataOrbHolder tHatch : filterValidMTEs(mReplicatorDataOrbHatches)) {
+ tItems.add(tHatch.getOrbByCircuit());
+ }
+ tItems.removeAll(Collections.singleton(null));
+ return tItems;
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_FrothFlotationCell.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_FrothFlotationCell.java
new file mode 100644
index 0000000000..8f807b94fd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_FrothFlotationCell.java
@@ -0,0 +1,287 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.List;
+import java.util.Objects;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.helpers.FlotationRecipeHandler;
+
+public class GregtechMTE_FrothFlotationCell extends GregtechMeta_MultiBlockBase<GregtechMTE_FrothFlotationCell>
+ implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMTE_FrothFlotationCell> STRUCTURE_DEFINITION = null;
+
+ public GregtechMTE_FrothFlotationCell(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMTE_FrothFlotationCell(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMTE_FrothFlotationCell(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Flotation Cell";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Process that milled ore!")
+ .addInfo("You can only ever process one type of material per controller")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(7, 9, 7, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Inconel Reinforced Casing", 68, false)
+ .addCasingInfoMin("Flotation Casing", 52, false)
+ .addInputBus("Bottom Casing", 1)
+ .addInputHatch("Bottom Casing", 1)
+ .addOutputHatch("Bottom Casing", 1)
+ .addEnergyHatch("Bottom Casing", 1)
+ .addMaintenanceHatch("Bottom Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(2, 1);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.flotationCellRecipes;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMTE_FrothFlotationCell> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMTE_FrothFlotationCell>builder()
+ .addShape(
+ mName,
+ new String[][] { { " ", " ", " X ", " X~X ", " X ", " ", " " },
+ { " ", " F ", " FFF ", " FF FF ", " FFF ", " F ", " " },
+ { " ", " F ", " F F ", " F F ", " F F ", " F ", " " },
+ { " ", " F ", " F F ", " F F ", " F F ", " F ", " " },
+ { " ", " F ", " F F ", " F F ", " F F ", " F ", " " },
+ { " ", " F ", " F F ", " F F ", " F F ", " F ", " " },
+ { " ", " F ", " F F ", " F F ", " F F ", " F ", " " },
+ { " CCC ", " CCCCC ", "CCCCCCC", "CCCCCCC", "CCCCCCC", " CCCCC ", " CCC " },
+ { " CCC ", " CCCCC ", "CCCCCCC", "CCCCCCC", "CCCCCCC", " CCCCC ", " CCC " }, })
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMTE_FrothFlotationCell.class)
+ .atLeast(InputBus, InputHatch, OutputHatch, Maintenance, Energy)
+ .casingIndex(getCasingTextureId())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings3Misc, 1))))
+ .addElement('F', ofBlock(ModBlocks.blockSpecialMultiCasings, 9))
+ .addElement('X', ofBlock(ModBlocks.blockCasings3Misc, 1))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 3, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 3, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 3, 3, 0) && mCasing >= 68 - 4 && checkHatch();
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d == ForgeDirection.UP;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiFrothFlotationCell;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ /*
+ * Material checks Makes sure we can only ever use one type of material in this flotation cell. We used
+ * to depend on Alk's hash, but it's unreliable and user-hostile So we're using unlocalized name of
+ * material now.
+ */
+ Material foundMaterial = FlotationRecipeHandler
+ .getMaterialOfMilledProduct(FlotationRecipeHandler.findMilledStack(recipe));
+ String foundMaterialName = null;
+ if (foundMaterial != null) {
+ foundMaterialName = foundMaterial.getUnlocalizedName();
+ }
+
+ if (foundMaterialName == null) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ // Set material locked for this controller
+ if (lockedMaterialName == null) {
+ lockedMaterialName = foundMaterialName;
+ }
+
+ // Check material match
+ if (!Objects.equals(lockedMaterialName, foundMaterialName)) {
+ return SimpleCheckRecipeResult.ofFailure("machine_locked_to_different_recipe");
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ }.enablePerfectOverclock();
+ }
+
+ /*
+ * Handle NBT
+ */
+
+ private String lockedMaterialName = null;
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ if (lockedMaterialName != null) {
+ aNBT.setString("lockedMaterialName", lockedMaterialName);
+ }
+ super.setItemNBT(aNBT);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ if (lockedMaterialName != null) {
+ aNBT.setString("lockedMaterialName", lockedMaterialName);
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("lockedMaterialName", Constants.NBT.TAG_STRING)) {
+ lockedMaterialName = aNBT.getString("lockedMaterialName");
+ }
+ }
+
+ @Override
+ public void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {
+ if (stack.hasTagCompound() && stack.getTagCompound()
+ .hasKey("lockedMaterialName")) {
+ tooltip.add(
+ StatCollector.translateToLocal("tooltip.flotationCell.lockedTo") + " "
+ + StatCollector.translateToLocal(
+ stack.getTagCompound()
+ .getString("lockedMaterialName")));
+ }
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] { "Locked material: " + lockedMaterialName };
+ }
+
+ @Override
+ public boolean isRecipeLockingEnabled() {
+ return lockedMaterialName != null && !lockedMaterialName.equals("");
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(new FakeSyncWidget.StringSyncer(() -> lockedMaterialName, val -> lockedMaterialName = val));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_NuclearReactor.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_NuclearReactor.java
new file mode 100644
index 0000000000..2faccc9697
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMTE_NuclearReactor.java
@@ -0,0 +1,524 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.filterByMTETier;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.nuclear.NUCLIDE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMTE_NuclearReactor extends GregtechMeta_MultiBlockBase<GregtechMTE_NuclearReactor>
+ implements ISurvivalConstructable {
+
+ protected int mFuelRemaining = 0;
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMTE_NuclearReactor> STRUCTURE_DEFINITION = null;
+
+ public GregtechMTE_NuclearReactor(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMTE_NuclearReactor(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public long maxEUStore() {
+ return (640000000L * (Math.min(16, this.mEnergyHatches.size()))) / 16L;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Reactor";
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.liquidFluorineThoriumReactorRecipes;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Liquid Fluoride Thorium Reactor.")
+ .addInfo("Produces energy and new elements from Radioactive Beta Decay!")
+ .addInfo("Input LFTB and a molten salt as fuel, and match the 4 Buffered Dynamo Hatches:")
+ .addInfo("LFTR Fuel 1 (4 EV Hatches), LFTR Fuel 2 (4 IV Hatches), LFTR Fuel 3 (4 LuV Hatches)")
+ .addInfo("If using better hatches for a worse fuel, only 1 hatch will output EU")
+ .addInfo("Outputs U233 every 10 seconds, on average, while the reactor is running")
+ .addInfo("Check NEI to see the other 3 outputs - they differ between fuels")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(7, 4, 7, true)
+ .addController("Bottom Center")
+ .addCasingInfoMin("Hastelloy-N Reactor Casing", 27, false)
+ .addCasingInfoMin("Zeron-100 Reactor Shielding", 26, false)
+ .addInputHatch("Top or bottom layer edges", 1)
+ .addOutputHatch("Top or bottom layer edges", 1)
+ .addDynamoHatch("Top or bottom layer edges", 1)
+ .addMaintenanceHatch("Top or bottom layer edges", 1)
+ .addMufflerHatch("Top 3x3", 2)
+ .addStructureInfo("All dynamos must be between EV and LuV tier.")
+ .addStructureInfo("All other hatches must be IV+ tier.")
+ .addStructureInfo("4x Output Hatches or 1x Output Hatch (ME), 1+ Input Hatches, 4x Dynamo Hatches")
+ .addStructureInfo("2x Maintenance Hatches, 4x Mufflers")
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ final String tRunning = (this.mMaxProgresstime > 0 ? "Reactor running" : "Reactor stopped");
+ final String tMaintainance = (this.getIdealStatus() == this.getRepairStatus() ? "No Maintainance issues"
+ : "Needs Maintainance");
+
+ return new String[] { "Liquid Fluoride Thorium Reactor", tRunning, tMaintainance,
+ "Current Output: " + this.lEUt + " EU/t", "Fuel Remaining: " + this.mFuelRemaining + " Litres",
+ "Current Efficiency: " + (this.mEfficiency / 5) + "%", "Current Efficiency (Raw): " + (this.mEfficiency),
+ "It requires you to have 100% Efficiency." };
+ }
+
+ @Override
+ public boolean allowCoverOnSide(final ForgeDirection side, final GT_ItemStack aStack) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ boolean aWarmedUp = this.mEfficiency == this.getMaxEfficiency(null);
+ if (!aBaseMetaTileEntity.isActive() || !aWarmedUp) {
+ if (side == facing) {
+ if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)),
+ TextureFactory.builder()
+ .addIcon(Textures.BlockIcons.OVERLAY_FRONT_REPLICATOR_ACTIVE)
+ .extFacing()
+ .build() };
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)),
+ TextureFactory.builder()
+ .addIcon(Textures.BlockIcons.OVERLAY_FRONT_REPLICATOR)
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)) };
+ } else if (aBaseMetaTileEntity.isActive() && aWarmedUp) {
+ if (side == facing) {
+ if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(13)),
+ TextureFactory.builder()
+ .addIcon(Textures.BlockIcons.OVERLAY_FRONT_REPLICATOR_ACTIVE)
+ .extFacing()
+ .build() };
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(13)),
+ TextureFactory.builder()
+ .addIcon(Textures.BlockIcons.OVERLAY_FRONT_REPLICATOR)
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(13)) };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)) };
+ }
+
+ public final boolean addNuclearReactorEdgeList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo dynamo
+ && dynamo.getTierForStructure() >= 4
+ && dynamo.getTierForStructure() <= 6) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input hatch
+ && hatch.getTierForStructure() >= 5) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output hatch
+ && hatch.getTierForStructure() >= 5) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ public final boolean addNuclearReactorTopList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler hatch && hatch.getTierForStructure() >= 5) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMTE_NuclearReactor> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMTE_NuclearReactor>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] {
+ { "CCCCCCC", "COOOOOC", "COXXXOC", "COXXXOC", "COXXXOC", "COOOOOC", "CCCCCCC" },
+ { "GGGGGGG", "G-----G", "G-----G", "G-----G", "G-----G", "G-----G", "GGGGGGG" },
+ { "GGGGGGG", "G-----G", "G-----G", "G-----G", "G-----G", "G-----G", "GGGGGGG" },
+ { "CCC~CCC", "COOOOOC", "COOOOOC", "COOOOOC", "COOOOOC", "COOOOOC", "CCCCCCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMTE_NuclearReactor.class).atLeast(Maintenance)
+ .casingIndex(TAE.GTPP_INDEX(12))
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMTE_NuclearReactor.class).atLeast(InputHatch, OutputHatch)
+ .adder(GregtechMTE_NuclearReactor::addNuclearReactorEdgeList)
+ .hatchItemFilterAnd(t -> filterByMTETier(5, Integer.MAX_VALUE))
+ .casingIndex(TAE.GTPP_INDEX(12))
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMTE_NuclearReactor.class).atLeast(Dynamo)
+ .adder(GregtechMTE_NuclearReactor::addNuclearReactorEdgeList)
+ .hatchItemFilterAnd(t -> filterByMTETier(4, 6))
+ .casingIndex(TAE.GTPP_INDEX(12))
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 12))))
+ .addElement(
+ 'X',
+ buildHatchAdder(GregtechMTE_NuclearReactor.class).atLeast(Muffler)
+ .adder(GregtechMTE_NuclearReactor::addNuclearReactorTopList)
+ .hatchItemFilterAnd(t -> filterByMTETier(5, Integer.MAX_VALUE))
+ .casingIndex(TAE.GTPP_INDEX(12))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 12))))
+ .addElement('O', ofBlock(ModBlocks.blockCasingsMisc, 12))
+ .addElement('G', ofBlock(ModBlocks.blockCasingsMisc, 13))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 3, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 3, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ if (checkPiece(mName, 3, 3, 0) && mCasing >= 27) {
+ if ((mOutputHatches.size() >= 3 || canDumpFluidToME()) && mInputHatches.size() >= 1
+ && mDynamoHatches.size() == 4
+ && mMufflerHatches.size() == 4
+ && mMaintenanceHatches.size() == 2) {
+ fixAllMaintenanceIssue();
+ this.turnCasingActive(false);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Alk's Life Lessons from Greg.
+ /*
+ * [23:41:15] <GregoriusTechneticies> xdir and zdir are x2 and not x3 [23:41:26] <GregoriusTechneticies> thats you
+ * issue [23:44:33] <Alkalus> mmm? [23:44:49] <Alkalus> Should they be x3? [23:44:50] <GregoriusTechneticies> you
+ * just do a x2, what is for a 5x5 multiblock [23:45:01] <GregoriusTechneticies> x3 is for a 7x7 one [23:45:06]
+ * <Alkalus> I have no idea what that value does, tbh.. [23:45:15] <GregoriusTechneticies> its the offset [23:45:23]
+ * <Alkalus> Debugging checkMachine has been a pain and I usually trash designs that don't work straight up..
+ * [23:45:28] <GregoriusTechneticies> it determines the horizontal middle of the multiblock [23:45:47]
+ * <GregoriusTechneticies> which is in your case THREE blocks away from the controller [23:45:51] <Alkalus> Ahh
+ * [23:45:57] <GregoriusTechneticies> and not 2 [23:46:06] <Alkalus> Noted, thanks :D
+ */
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerTick(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMTE_NuclearReactor(this.mName);
+ }
+
+ public boolean turnCasingActive(final boolean status) {
+ // TODO
+ if (this.mDynamoHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Dynamo hatch : this.mDynamoHatches) {
+ hatch.updateTexture(status ? TAE.GTPP_INDEX(13) : TAE.GTPP_INDEX(12));
+ }
+ }
+ if (this.mMufflerHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Muffler hatch : this.mMufflerHatches) {
+ hatch.updateTexture(status ? TAE.GTPP_INDEX(13) : TAE.GTPP_INDEX(12));
+ }
+ }
+ if (this.mOutputHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Output hatch : this.mOutputHatches) {
+ hatch.updateTexture(status ? TAE.GTPP_INDEX(13) : TAE.GTPP_INDEX(12));
+ }
+ }
+ if (this.mInputHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Input hatch : this.mInputHatches) {
+ hatch.updateTexture(status ? TAE.GTPP_INDEX(13) : TAE.GTPP_INDEX(12));
+ }
+ }
+ if (this.mMaintenanceHatches != null) {
+ for (final GT_MetaTileEntity_Hatch_Maintenance hatch : this.mMaintenanceHatches) {
+ hatch.updateTexture(status ? TAE.GTPP_INDEX(13) : TAE.GTPP_INDEX(12));
+ }
+ }
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return GT_OverclockCalculator.ofNoOverclock(recipe.mSpecialValue * 4L, recipe.mDuration);
+ }
+
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ CheckRecipeResult result = super.process();
+ if (!result.wasSuccessful()) {
+ resetMultiProcessing();
+ }
+ return result;
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ mFuelRemaining = 0;
+ int li2bef4 = 0;
+ FluidStack aFuelFluid = null;
+ for (FluidStack aFluidInput : recipe.mFluidInputs) {
+ if (!aFluidInput.getFluid()
+ .equals(NUCLIDE.Li2BeF4.getFluid())) {
+ aFuelFluid = aFluidInput;
+ break;
+ }
+ }
+ if (aFuelFluid != null) {
+ for (FluidStack fluidStack : getStoredFluids()) {
+ if (fluidStack.isFluidEqual(aFuelFluid)) {
+ mFuelRemaining += fluidStack.amount;
+ } else if (fluidStack.getFluid()
+ .equals(NUCLIDE.Li2BeF4.getFluid())) {
+ li2bef4 += fluidStack.amount;
+ }
+ }
+ }
+ if (mFuelRemaining < 100) {
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+ if (li2bef4 < 200) {
+ return SimpleCheckRecipeResult.ofFailure("no_li2bef4");
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ };
+ }
+
+ protected void resetMultiProcessing() {
+ this.mEfficiency = 0;
+ this.mLastRecipe = null;
+ stopMachine(ShutDownReasonRegistry.NONE);
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ // Warm up for 4~ minutes
+ if (mEfficiency < this.getMaxEfficiency(null)) {
+ this.mMaxProgresstime = 1;
+ this.mEfficiencyIncrease = 2;
+ return SimpleCheckRecipeResult.ofSuccess("warm_up");
+ }
+ CheckRecipeResult result = super.checkProcessing();
+ if (result.wasSuccessful()) {
+ // We produce EU, so we negate the value, if negative
+ if (lEUt < 0) {
+ lEUt = -lEUt;
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public void explodeMultiblock() {
+ this.mInventory[1] = null;
+ long explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ for (final MetaTileEntity tTileEntity : this.mInputBusses) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mOutputBusses) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mInputHatches) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mOutputHatches) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mDynamoHatches) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mMufflerHatches) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mEnergyHatches) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ for (final MetaTileEntity tTileEntity : this.mMaintenanceHatches) {
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+ explodevalue = MathUtils.randLong(Integer.MAX_VALUE, 8589934588L);
+ this.getBaseMetaTileEntity()
+ .doExplosion(explodevalue);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.getWorld().isRemote) {
+ if (aBaseMetaTileEntity.isActive()) {
+ // Set casings active if we're warmed up.
+ if (this.mEfficiency == this.getMaxEfficiency(null)) {
+ this.turnCasingActive(true);
+ } else {
+ this.turnCasingActive(false);
+ }
+ } else {
+ this.turnCasingActive(false);
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ // See if we're warmed up.
+ if (this.mEfficiency == this.getMaxEfficiency(null)) {
+ // Try output some Uranium-233
+ if (MathUtils.randInt(1, 300) == 1) {
+ this.addOutput(ELEMENT.getInstance().URANIUM233.getFluidStack(MathUtils.randInt(1, 10)));
+ }
+ }
+ return super.onRunningTick(aStack);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mFuelRemaining", this.mFuelRemaining);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ this.mFuelRemaining = aNBT.getInteger("mFuelRemaining");
+ super.loadNBTData(aNBT);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntityTreeFarm.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntityTreeFarm.java
new file mode 100644
index 0000000000..0441907f40
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntityTreeFarm.java
@@ -0,0 +1,809 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.TTEnergy;
+
+import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemShears;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import forestry.api.arboriculture.IToolGrafter;
+import forestry.api.arboriculture.ITree;
+import forestry.api.arboriculture.TreeManager;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Mods;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.VoidProtectionHelper;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_InputBus_ME;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+
+public class GregtechMetaTileEntityTreeFarm extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntityTreeFarm>
+ implements ISurvivalConstructable {
+
+ public static int CASING_TEXTURE_ID;
+ private static final int TICKS_PER_OPERATION = 100;
+ private static final int TOOL_DAMAGE_PER_OPERATION = 1;
+ private static final int TOOL_CHARGE_PER_OPERATION = 32;
+
+ private int mCasing;
+ public static String mCasingName = "Sterile Farm Casing";
+ private static IStructureDefinition<GregtechMetaTileEntityTreeFarm> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntityTreeFarm(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(1, 15);
+ }
+
+ public GregtechMetaTileEntityTreeFarm(final String aName) {
+ super(aName);
+ CASING_TEXTURE_ID = TAE.getIndexFromPage(1, 15);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntityTreeFarm(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Tree Farm";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller block for the Tree Growth Simulator")
+ .addInfo("Farms and harvests trees using EU")
+ .addInfo("Place a sapling in the controller slot")
+ .addInfo("Place a tool in an input bus")
+ .addInfo("Different tools are required for different outputs")
+ .addInfo("Advanced tools multiply output amount")
+ .addInfo(" Logs: Saw (1x), Buzzsaw (2x), Chainsaw (4x)")
+ .addInfo(" Saplings: Branch Cutter (1x), Grafter (3x)")
+ .addInfo(" Leaves: Shears (1x), Wire Cutter (2x), Automatic Snips (4x)")
+ .addInfo(" Fruit: Knife (1x)")
+ .addInfo("Multiple tools can be used at the same time")
+ .addSeparator()
+ .addInfo("Work time is fixed at 5 seconds")
+ .addInfo("Energy input tier multiplies output further")
+ .addInfo("Output multiplier is equal to: 2*tier^2 - 2*tier + 5")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoMin(mCasingName, 8, false)
+ .addInputBus("Any casing", 1)
+ .addStructureInfo(
+ EnumChatFormatting.YELLOW + "Stocking Input Busses and Crafting Input Busses/Buffers are not allowed!")
+ .addOutputBus("Any casing", 1)
+ .addEnergyHatch("Any casing", 1)
+ .addMaintenanceHatch("Any casing", 1)
+ .addMufflerHatch("Any casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_TEXTURE_ID;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 8 && checkHatch();
+ }
+
+ @Override
+ public boolean addInputBusToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ // Tools from a stocking inout bus can not be damaged, this would cause an infinite durability exploit.
+ // Therefore disallow ME input bus.
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus_ME) return false;
+ return super.addInputBusToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+
+ @Override
+ public boolean supportsCraftingMEBuffer() {
+ return false;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ // Batch mode would not do anything, processing time is fixed at 100 ticks.
+ return false;
+ }
+
+ @Override
+ public boolean isBatchModeEnabled() {
+ return false;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiTreeFarm;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntityTreeFarm> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntityTreeFarm>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "C~C", "C-C", "CCC" }, { "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntityTreeFarm.class)
+ .atLeast(
+ InputHatch,
+ OutputHatch,
+ InputBus,
+ OutputBus,
+ Maintenance,
+ Energy.or(TTEnergy),
+ Muffler)
+ .casingIndex(CASING_TEXTURE_ID)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 15))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ /* Processing logic. */
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ if (aStack == null) return false;
+ if (isValidSapling(aStack)) return true;
+ /*
+ * In previous versions, a saw used to go in the controller slot. We do not want an update to stop processing of
+ * a machine set up like this. Instead, a sapling is placed in this slot at the start of the next operation.
+ */
+ if (aStack.getItem() instanceof GT_MetaGenerated_Tool_01) return true;
+ return false;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ // Only for NEI, not used in processing logic.
+ return GTPPRecipeMaps.treeGrowthSimulatorFakeRecipes;
+ }
+
+ /**
+ * Valid processing modes (types of output) for the Tree Growth Simulator.
+ */
+ public enum Mode {
+ LOG,
+ SAPLING,
+ LEAVES,
+ FRUIT
+ }
+
+ /**
+ * Edit this to change relative yields for different modes. For example, logs are output at 5 times the rate of
+ * saplings.
+ */
+ private static final EnumMap<Mode, Integer> modeMultiplier = new EnumMap<>(Mode.class);
+ static {
+ modeMultiplier.put(Mode.LOG, 5);
+ modeMultiplier.put(Mode.SAPLING, 1);
+ modeMultiplier.put(Mode.LEAVES, 2);
+ modeMultiplier.put(Mode.FRUIT, 1);
+ }
+
+ /**
+ * Return the output multiplier for a given power tier.
+ *
+ * @param tier Power tier the machine runs on.
+ * @return Factor to multiply all outputs by.
+ */
+ private static int getTierMultiplier(int tier) {
+ /*
+ * Where does this formula come from? [12:57 AM] boubou_19: i did. Basically Pandoro measured the output of a
+ * WA-ed farming station for each tier of WA, then i computed the Lagrange interpolating polynomial of his
+ * dataset, which gave this
+ */
+ return (2 * (tier * tier)) - (2 * tier) + 5;
+ }
+
+ /**
+ * Key of this map is the registry name of the sapling, followed by ":", and the sapling's metadata value.
+ * <p>
+ * The value of the map is a list of products by {@link Mode}. Products for some modes can be null if the tree does
+ * not produce anything in that mode (for example, it has no fruit).
+ */
+ public static final HashMap<String, EnumMap<Mode, ItemStack>> treeProductsMap = new HashMap<>();
+
+ @Override
+ public ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Override
+ @Nonnull
+ public CheckRecipeResult process() {
+ if (inputItems == null) {
+ inputItems = new ItemStack[0];
+ }
+ if (inputFluids == null) {
+ inputFluids = new FluidStack[0];
+ }
+
+ ItemStack sapling = findSapling();
+ if (sapling == null) return SimpleCheckRecipeResult.ofFailure("no_sapling");
+
+ EnumMap<Mode, ItemStack> outputPerMode = getOutputsForSapling(sapling);
+ if (outputPerMode == null) {
+ // This should usually not be possible, outputs for all valid saplings should be defined.
+ Logger.INFO("No output found for sapling: " + sapling.getDisplayName());
+ return SimpleCheckRecipeResult.ofFailure("no_output_for_sapling");
+ }
+
+ int tier = Math.max(1, GT_Utility.getTier(availableVoltage * availableAmperage));
+ int tierMultiplier = getTierMultiplier(tier);
+
+ List<ItemStack> outputs = new ArrayList<>();
+ for (Mode mode : Mode.values()) {
+ ItemStack output = outputPerMode.get(mode);
+ if (output == null) continue; // This sapling has no output in this mode.
+
+ // Find a tool to use in this mode.
+ int toolMultiplier = useToolForMode(mode);
+ if (toolMultiplier < 0) continue; // No valid tool for this mode found.
+
+ // Increase output by the relevant multipliers.
+ ItemStack out = output.copy();
+ out.stackSize *= tierMultiplier * modeMultiplier.get(mode) * toolMultiplier;
+ outputs.add(out);
+ }
+
+ if (outputs.isEmpty()) {
+ // No outputs can be produced using the tools we have available.
+ return SimpleCheckRecipeResult.ofFailure("no_tools");
+ }
+
+ outputItems = outputs.toArray(new ItemStack[0]);
+
+ VoidProtectionHelper voidProtection = new VoidProtectionHelper().setMachine(machine)
+ .setItemOutputs(outputItems)
+ .build();
+ if (voidProtection.isItemFull()) {
+ return CheckRecipeResultRegistry.ITEM_OUTPUT_FULL;
+ }
+
+ duration = TICKS_PER_OPERATION;
+ calculatedEut = GT_Values.VP[tier];
+
+ return SimpleCheckRecipeResult.ofSuccess("growing_trees");
+ }
+ };
+ }
+
+ /* Handling tools. */
+
+ /**
+ * Attempts to find a tool appropriate for the given mode, and damage/discharge it by one use.
+ *
+ * @param mode The mode to use. This specifies which tools are valid.
+ * @return Production multiplier based on the tool used, or -1 if no appropriate tool was found.
+ */
+ private int useToolForMode(Mode mode) {
+ for (ItemStack stack : getStoredInputs()) {
+ int toolMultiplier = getToolMultiplier(stack, mode);
+ if (toolMultiplier < 0) continue;
+ boolean canDamage = GT_ModHandler
+ .damageOrDechargeItem(stack, TOOL_DAMAGE_PER_OPERATION, TOOL_CHARGE_PER_OPERATION, null);
+ if (canDamage) {
+ // Tool was used.
+ if (GT_ModHandler.isElectricItem(stack)
+ && !GT_ModHandler.canUseElectricItem(stack, TOOL_CHARGE_PER_OPERATION)) {
+ // Tool is out of charge, move it to output.
+ depleteInput(stack);
+ addOutput(stack);
+ }
+ return toolMultiplier;
+ } else {
+ // Correct item type, but the tool could not be used.
+ depleteInput(stack);
+ addOutput(stack);
+ }
+
+ }
+ return -1;
+ }
+
+ /**
+ * Calculate output multiplier for a given tool and mode.
+ *
+ * @param toolStack The tool to use.
+ * @param mode The mode to use.
+ * @return Output multiplier for the given tool used in the given mode. If the tool is not appropriate for this
+ * mode, returns -1.
+ */
+ public static int getToolMultiplier(ItemStack toolStack, Mode mode) {
+ Item tool = toolStack.getItem();
+ switch (mode) {
+ case LOG:
+ if (tool instanceof GT_MetaGenerated_Tool_01) {
+ switch (toolStack.getItemDamage()) {
+ case GT_MetaGenerated_Tool_01.SAW:
+ case GT_MetaGenerated_Tool_01.POCKET_SAW:
+ case GT_MetaGenerated_Tool_01.POCKET_MULTITOOL:
+ return 1;
+ case GT_MetaGenerated_Tool_01.BUZZSAW_LV:
+ case GT_MetaGenerated_Tool_01.BUZZSAW_MV:
+ case GT_MetaGenerated_Tool_01.BUZZSAW_HV:
+ return 2;
+ case GT_MetaGenerated_Tool_01.CHAINSAW_LV:
+ case GT_MetaGenerated_Tool_01.CHAINSAW_MV:
+ case GT_MetaGenerated_Tool_01.CHAINSAW_HV:
+ return 4;
+ }
+ }
+ break;
+
+ case SAPLING:
+ if (tool instanceof GT_MetaGenerated_Tool_01) {
+ switch (toolStack.getItemDamage()) {
+ case GT_MetaGenerated_Tool_01.BRANCHCUTTER:
+ case GT_MetaGenerated_Tool_01.POCKET_BRANCHCUTTER:
+ case GT_MetaGenerated_Tool_01.POCKET_MULTITOOL:
+ return 1;
+ }
+ }
+ if (tool instanceof IToolGrafter && tool.isDamageable()) {
+ return 3;
+ }
+ break;
+
+ case LEAVES:
+ // Do not allow unbreakable tools. Operation should have a running cost.
+ if (tool instanceof ItemShears && tool.isDamageable()) {
+ return 1;
+ }
+ if (tool instanceof GT_MetaGenerated_Tool_01) {
+ switch (toolStack.getItemDamage()) {
+ case GT_MetaGenerated_Tool_01.POCKET_MULTITOOL:
+ return 1;
+ case GT_MetaGenerated_Tool_01.WIRECUTTER:
+ case GT_MetaGenerated_Tool_01.POCKET_WIRECUTTER:
+ return 2;
+ }
+ }
+ if (tool instanceof MetaGeneratedGregtechTools) {
+ if (toolStack.getItemDamage() == MetaGeneratedGregtechTools.ELECTRIC_SNIPS) {
+ return 4;
+ }
+ }
+ break;
+
+ case FRUIT:
+ if (tool instanceof GT_MetaGenerated_Tool_01) {
+ switch (toolStack.getItemDamage()) {
+ case GT_MetaGenerated_Tool_01.KNIFE:
+ case GT_MetaGenerated_Tool_01.POCKET_KNIFE:
+ case GT_MetaGenerated_Tool_01.POCKET_MULTITOOL:
+ return 1;
+ }
+ }
+ break;
+ }
+
+ // No valid tool was found.
+ return -1;
+ }
+
+ /* Handling saplings. */
+
+ /**
+ * Finds a valid sapling from input buses, and places it into the controller slot.
+ *
+ * @return The sapling that was found (now in the controller slot).
+ */
+ private ItemStack findSapling() {
+ ItemStack controllerSlot = getControllerSlot();
+
+ if (isValidSapling(controllerSlot)) {
+ return controllerSlot;
+ }
+
+ if (controllerSlot != null) {
+ // Non-sapling item in controller slot. This could be a saw from an older version of the TGS.
+ // We first try to swap it with a sapling from an input bus to not interrupt existing setups.
+ if (!legacyToolSwap()) {
+ // Swap failed, output whatever is blocking the slot.
+ addOutput(controllerSlot);
+ mInventory[1] = null;
+ }
+ }
+
+ // Here controller slot is empty, find a valid sapling to use.
+ for (ItemStack stack : getStoredInputs()) {
+ if (isValidSapling(stack)) {
+ mInventory[1] = stack.splitStack(1);
+ return mInventory[1];
+ }
+ }
+
+ // No saplings were found.
+ return null;
+ }
+
+ /**
+ * In previous versions, the saw used to be placed in the controller slot and the sapling into an input bus. We do
+ * not want to break existing setups like this, so we attempt to swap the two if possible.
+ *
+ * @return True on success, false otherwise.
+ */
+ private boolean legacyToolSwap() {
+ ItemStack controllerSlot = getControllerSlot();
+ if (controllerSlot == null || !(controllerSlot.getItem() instanceof GT_MetaGenerated_Tool_01)) return false;
+
+ for (GT_MetaTileEntity_Hatch_InputBus inputBus : filterValidMTEs(mInputBusses)) {
+ ItemStack[] inventory = inputBus.getRealInventory();
+ for (int slot = 0; slot < inventory.length; ++slot) {
+ if (isValidSapling(inventory[slot])) {
+ // Do the swap.
+ mInventory[1] = inventory[slot];
+ inventory[slot] = controllerSlot;
+ inputBus.updateSlots();
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Check if an ItemStack is a sapling that can be farmed.
+ *
+ * @param stack An ItemStack.
+ * @return True if stack is a valid sapling that can be farmed.
+ */
+ private boolean isValidSapling(ItemStack stack) {
+ if (stack == null) return false;
+ String registryName = Item.itemRegistry.getNameForObject(stack.getItem());
+ return treeProductsMap.containsKey(registryName + ":" + stack.getItemDamage())
+ || "Forestry:sapling".equals(registryName);
+ }
+
+ /**
+ * Get a list of possible outputs for a sapling, for each mode. This is either recovered from
+ * {@link #treeProductsMap}, or generated from stats of Forestry saplings.
+ *
+ * @param sapling A sapling to farm.
+ * @return A map of outputs for each mode. Outputs for some modes might be null.
+ */
+ private static EnumMap<Mode, ItemStack> getOutputsForSapling(ItemStack sapling) {
+ String registryName = Item.itemRegistry.getNameForObject(sapling.getItem());
+ if ("Forestry:sapling".equals(registryName)) {
+ return getOutputsForForestrySapling(sapling);
+ } else {
+ return treeProductsMap.get(registryName + ":" + sapling.getItemDamage());
+ }
+ }
+
+ /**
+ * Calculate outputs for Forestry saplings. Default amounts stored in {@link #treeProductsMap} are adjusted based
+ * the genetics of the input sapling.
+ * <p>
+ * Relevant stats:
+ * <ul>
+ * <li>height, girth: Affects log output.</li>
+ * <li>fertility (called Saplings in game): Affects sapling output.</li>
+ * <li>yield: Affects fruit output.</li>
+ * </ul>
+ * See {@link forestry.core.genetics.alleles.EnumAllele} for detailed numeric values for each allele.
+ *
+ * @param sapling A sapling to farm. Must be a Forestry sapling with a valid genome.
+ * @return A map of outputs for each mode. Outputs for some modes might be null.
+ */
+ private static EnumMap<Mode, ItemStack> getOutputsForForestrySapling(ItemStack sapling) {
+ ITree tree = TreeManager.treeRoot.getMember(sapling);
+ if (tree == null) return null;
+
+ String speciesUUID = tree.getIdent();
+
+ EnumMap<Mode, ItemStack> defaultMap = treeProductsMap.get("Forestry:sapling:" + speciesUUID);
+ if (defaultMap == null) return null;
+
+ // We need to make a new map so that we don't modify the stored amounts of outputs.
+ EnumMap<Mode, ItemStack> adjustedMap = new EnumMap<>(Mode.class);
+
+ ItemStack log = defaultMap.get(Mode.LOG);
+ if (log != null) {
+ double height = Math.max(
+ 3 * (tree.getGenome()
+ .getHeight() - 1),
+ 0) + 1;
+ double girth = tree.getGenome()
+ .getGirth();
+
+ log = log.copy();
+ log.stackSize = (int) (log.stackSize * height * girth);
+ adjustedMap.put(Mode.LOG, log);
+ }
+
+ ItemStack saplingOut = defaultMap.get(Mode.SAPLING);
+ if (saplingOut != null) {
+ // Lowest = 0.01 ... Average = 0.05 ... Highest = 0.3
+ double fertility = tree.getGenome()
+ .getFertility() * 10;
+
+ // Return a copy of the *input* sapling, retaining its genetics.
+ int stackSize = Math.max(1, (int) (saplingOut.stackSize * fertility));
+ saplingOut = sapling.copy();
+ saplingOut.stackSize = stackSize;
+ adjustedMap.put(Mode.SAPLING, saplingOut);
+ }
+
+ ItemStack leaves = defaultMap.get(Mode.LEAVES);
+ if (leaves != null) {
+ adjustedMap.put(Mode.LEAVES, leaves.copy());
+ }
+
+ ItemStack fruit = defaultMap.get(Mode.FRUIT);
+ if (fruit != null) {
+ // Lowest = 0.025 ... Average = 0.2 ... Highest = 0.4
+ double yield = tree.getGenome()
+ .getYield() * 10;
+
+ fruit = fruit.copy();
+ fruit.stackSize = (int) (fruit.stackSize * yield);
+ adjustedMap.put(Mode.FRUIT, fruit);
+ }
+
+ return adjustedMap;
+ }
+
+ /* Recipe registration. */
+
+ /**
+ * Registers outputs for a sapling. This method assumes that output in mode SAPLING is the same as the input
+ * sapling. Output amount is further modified by mode, machine tier, and tool used. Recipes are added in
+ * {@link gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_TreeFarm}.
+ *
+ * @param sapling The input sapling to farm, and also the output in mode SAPLING.
+ * @param log ItemStack to output in mode LOG.
+ * @param leaves ItemStack to output in mode LEAVES.
+ * @param fruit ItemStack to output in mode FRUIT.
+ */
+ public static void registerTreeProducts(ItemStack sapling, ItemStack log, ItemStack leaves, ItemStack fruit) {
+ registerTreeProducts(sapling, log, sapling, leaves, fruit);
+ }
+
+ /**
+ * Registers outputs for a sapling. Output amount is further modified by mode, machine tier, and tool used. Recipes
+ * are added in {@link gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_TreeFarm}.
+ *
+ * @param saplingIn The input sapling to farm.
+ * @param log ItemStack to output in mode LOG.
+ * @param saplingOut ItemStack to output in mode SAPLING.
+ * @param leaves ItemStack to output in mode LEAVES.
+ * @param fruit ItemStack to output in mode FRUIT.
+ */
+ public static void registerTreeProducts(ItemStack saplingIn, ItemStack log, ItemStack saplingOut, ItemStack leaves,
+ ItemStack fruit) {
+ String key = Item.itemRegistry.getNameForObject(saplingIn.getItem()) + ":" + saplingIn.getItemDamage();
+ EnumMap<Mode, ItemStack> map = new EnumMap<>(Mode.class);
+ if (log != null) map.put(Mode.LOG, log);
+ if (saplingOut != null) map.put(Mode.SAPLING, saplingOut);
+ if (leaves != null) map.put(Mode.LEAVES, leaves);
+ if (fruit != null) map.put(Mode.FRUIT, fruit);
+ treeProductsMap.put(key, map);
+
+ if (!addFakeRecipeToNEI(saplingIn, log, saplingOut, leaves, fruit)) {
+ Logger.INFO("Registering NEI fake recipe for " + key + " failed!");
+ }
+ }
+
+ /**
+ * For Forestry trees, the output amounts depend on the genetics of the sapling. Here we register only the types of
+ * items to output. In {@link #getOutputsForForestrySapling(ItemStack)} these outputs are then multiplied according
+ * to the stats of the real sapling that is in the controller slot.
+ */
+ public static void registerForestryTree(String speciesUID, ItemStack sapling, ItemStack log, ItemStack leaves,
+ ItemStack fruit) {
+ String key = "Forestry:sapling:" + speciesUID;
+ EnumMap<Mode, ItemStack> map = new EnumMap<>(Mode.class);
+ map.put(Mode.LOG, log);
+ map.put(Mode.SAPLING, sapling);
+ map.put(Mode.LEAVES, leaves);
+ map.put(Mode.FRUIT, fruit);
+ treeProductsMap.put(key, map);
+
+ // In the NEI recipe we want to display outputs adjusted for the default genetics of this tree type.
+ // To do this we use the same method as when calculating real outputs.
+ map = getOutputsForForestrySapling(sapling);
+ if (map == null) {
+ Logger.INFO("Could not create Forestry tree output map for " + speciesUID);
+ return;
+ }
+ addFakeRecipeToNEI(
+ sapling,
+ map.get(Mode.LOG),
+ map.get(Mode.SAPLING),
+ map.get(Mode.LEAVES),
+ map.get(Mode.FRUIT));
+ }
+
+ /**
+ * This array is used to get the rotating display of items in NEI showing all possible tools for a given mode.
+ */
+ private static final ItemStack[][] altToolsForNEI;
+ static {
+ GT_MetaGenerated_Tool toolInstance = GT_MetaGenerated_Tool_01.INSTANCE;
+ altToolsForNEI = new ItemStack[][] {
+ // Mode.LOG
+ { toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.SAW, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.POCKET_SAW, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.BUZZSAW_LV, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.CHAINSAW_LV, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.BUZZSAW_MV, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.CHAINSAW_MV, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.BUZZSAW_HV, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.CHAINSAW_HV, 1, null, null, null), },
+ // Mode.SAPLING
+ { toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.BRANCHCUTTER, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.POCKET_BRANCHCUTTER, 1, null, null, null),
+ GT_ModHandler.getModItem(Mods.Forestry.ID, "grafter", 1, 0), },
+ // Mode.LEAVES
+ { new ItemStack(Items.shears),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.WIRECUTTER, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.POCKET_WIRECUTTER, 1, null, null, null),
+ MetaGeneratedGregtechTools.getInstance()
+ .getToolWithStats(MetaGeneratedGregtechTools.ELECTRIC_SNIPS, 1, null, null, null), },
+ // Mode.FRUIT
+ { toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.KNIFE, 1, null, null, null),
+ toolInstance.getToolWithStats(GT_MetaGenerated_Tool_01.POCKET_KNIFE, 1, null, null, null), } };
+ }
+
+ /**
+ * Add a recipe for this tree to NEI. These recipes are only used in NEI, they are never used for processing logic.
+ *
+ * @return True if the recipe was added successfully.
+ */
+ public static boolean addFakeRecipeToNEI(ItemStack saplingIn, ItemStack log, ItemStack saplingOut, ItemStack leaves,
+ ItemStack fruit) {
+ int recipeCount = GTPPRecipeMaps.treeGrowthSimulatorFakeRecipes.getAllRecipes()
+ .size();
+
+ // Sapling goes into the "special" slot.
+ ItemStack specialStack = saplingIn.copy();
+ specialStack.stackSize = 0;
+
+ /*
+ * Calculate the correct amount of outputs for each mode. The amount displayed in NEI should take into account
+ * the mode multiplier, but not tool/tier multipliers as those can change dynamically. If the sapling has an
+ * output in this mode, also add the tools usable for this mode as inputs.
+ */
+ ItemStack[][] inputStacks = new ItemStack[Mode.values().length][];
+ ItemStack[] outputStacks = new ItemStack[Mode.values().length];
+
+ for (Mode mode : Mode.values()) {
+ ItemStack output = switch (mode) {
+ case LOG -> log;
+ case SAPLING -> saplingOut;
+ case LEAVES -> leaves;
+ case FRUIT -> fruit;
+ };
+ if (output != null) {
+ int ordinal = mode.ordinal();
+ inputStacks[ordinal] = altToolsForNEI[ordinal];
+ outputStacks[ordinal] = output.copy();
+ outputStacks[ordinal].stackSize *= modeMultiplier.get(mode);
+ }
+ }
+
+ Logger.INFO(
+ "Adding Tree Growth Simulation NEI recipe for " + specialStack.getDisplayName()
+ + " -> "
+ + ItemUtils.getArrayStackNames(outputStacks));
+
+ GTPPRecipeMaps.treeGrowthSimulatorFakeRecipes.addFakeRecipe(
+ false,
+ new GT_Recipe.GT_Recipe_WithAlt(
+ false,
+ null, // All inputs are taken from aAtl argument.
+ outputStacks,
+ specialStack,
+ null,
+ null,
+ null,
+ TICKS_PER_OPERATION,
+ 0,
+ recipeCount, // special value, also sorts recipes correctly in order of addition.
+ inputStacks));
+
+ return GTPPRecipeMaps.treeGrowthSimulatorFakeRecipes.getAllRecipes()
+ .size() > recipeCount;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_AlloyBlastSmelter.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_AlloyBlastSmelter.java
new file mode 100644
index 0000000000..580efdcdab
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_AlloyBlastSmelter.java
@@ -0,0 +1,235 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+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.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_AlloyBlastSmelter
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_AlloyBlastSmelter> implements ISurvivalConstructable {
+
+ private int mMode = 0;
+ private boolean isUsingControllerCircuit = false;
+ private static Item circuit;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_AlloyBlastSmelter> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_AlloyBlastSmelter(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_AlloyBlastSmelter(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_AlloyBlastSmelter(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Fluid Alloy Cooker";
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("isBussesSeparate")) {
+ inputSeparation = aNBT.getBoolean("isBussesSeparate");
+ }
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Alloy Blast Smelter")
+ .addInfo("20% Faster than the Electric Blast Furnace")
+ .addInfo("Allows Complex GT++ alloys to be created")
+ .addInfo("Accepts only one Energy Hatch")
+ .addInfo("Circuit for recipe goes in the Input Bus or GUI slot")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 4, 3, true)
+ .addController("Bottom Center")
+ .addCasingInfoMin("Blast Smelter Casings", 5, false)
+ .addCasingInfoMin("Blast Smelter Heat Containment Coils", 16, false)
+ .addInputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_AlloyBlastSmelter> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_AlloyBlastSmelter>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "HHH", "H-H", "HHH" }, { "HHH", "H-H", "HHH" },
+ { "C~C", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_AlloyBlastSmelter.class)
+ .atLeast(InputBus, InputHatch, OutputBus, OutputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(TAE.GTPP_INDEX(15))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 15))))
+ .addElement('H', ofBlock(ModBlocks.blockCasingsMisc, 14))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 1, 3, 0) && mCasing >= 5 && mEnergyHatches.size() == 1 && checkHatch();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_INDUCTION_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(15);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.alloyBlastSmelterRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()) {
+ // Get Controller Circuit
+ if (circuit == null) {
+ circuit = CI.getNumberedCircuit(0)
+ .getItem();
+ }
+ if (aStack != null && aStack.getItem() == circuit) {
+ this.mMode = aStack.getItemDamage();
+ return this.isUsingControllerCircuit = true;
+ } else {
+ if (aStack == null) {
+ this.isUsingControllerCircuit = false;
+ return true; // Allowed empty
+ }
+ Logger.WARNING("Not circuit in GUI inputs.");
+ return this.isUsingControllerCircuit = false;
+ }
+ }
+ Logger.WARNING("No Circuit, clientside.");
+ return this.isUsingControllerCircuit = false;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic();
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ inputSeparation = !inputSeparation;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation);
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiABS;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Cyclotron.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Cyclotron.java
new file mode 100644
index 0000000000..5861885bd0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Cyclotron.java
@@ -0,0 +1,331 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.chemistry.IonParticles;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_Cyclotron extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_Cyclotron>
+ implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_Cyclotron> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_Cyclotron(int aID, String aName, String aNameRegional, int tier) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Cyclotron(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Particle Accelerator";
+ }
+
+ public int tier() {
+ return 5;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 1800000000L;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Cyclotron(this.mName);
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) {
+ return side != getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_Cyclotron> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_Cyclotron>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] {
+ { " ", " hhh ", " hh hh ", " h h ",
+ " h h ", " h h ", " h h ", " h h ",
+ " h h ", " h h ", " h h ", " h h ",
+ " hh hh ", " hhh ", " ", },
+ { " hhh ", " hhccchh ", " hcchhhcch ", " hchh hhch ",
+ " hch hch ", " hch hch ", "hch hch", "hch hch",
+ "hch hch", " hch hch ", " hch hch ", " hchh hhch ",
+ " hcch~hcch ", " hhccchh ", " hhh ", },
+ { " ", " hhh ", " hh hh ", " h h ",
+ " h h ", " h h ", " h h ", " h h ",
+ " h h ", " h h ", " h h ", " h h ",
+ " hh hh ", " hhh ", " ", } }))
+ .addElement(
+ 'h',
+ buildHatchAdder(GregtechMetaTileEntity_Cyclotron.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch, OutputHatch)
+ .casingIndex(44)
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .addElement('c', ofBlock(getCyclotronCoil(), getCyclotronCoilMeta()))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 7, 1, 12);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 7, 1, 12, elementBudget, env, false, true);
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.GT_MACHINES_FUSION_LOOP;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 7, 1, 12) && mCasing >= 40 && checkHatch();
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public int getCasingMeta() {
+ return 10;
+ }
+
+ public Block getCyclotronCoil() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public int getCyclotronCoilMeta() {
+ return 9;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Super Magnetic Speed Shooter")
+ .addSeparator()
+ .addInfo("Particles are accelerated over 186 revolutions to 80% light speed")
+ .addInfo("Can produce a continuous beam current of 2.2 mA at 590 MeV")
+ .addInfo("Which will be extracted from the Isochronous Cyclotron")
+ .addSeparator()
+ .addInfo("Consists of the same layout as a Fusion Reactor")
+ .addInfo("Any external casing can be a hatch/bus, unlike Fusion")
+ .addInfo("Cyclotron Machine Casings around Cyclotron Coil Blocks")
+ .addInfo("All Hatches must be IV or better")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .addCasingInfoMin("Cyclotron Machine Casings", 40, false)
+ .addCasingInfoMin("Cyclotron Coil", 32, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return getIconOverlay();
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return getIconOverlay();
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 44;
+ }
+
+ public IIconContainer getIconOverlay() {
+ if (this.getBaseMetaTileEntity()
+ .isActive()) {
+ return TexturesGtBlock.Overlay_MatterFab_Active_Animated;
+ }
+ return TexturesGtBlock.Overlay_MatterFab_Animated;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.cyclotronRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ fixAllMaintenanceIssue();
+ CheckRecipeResult result = super.process();
+ if (result.wasSuccessful()) {
+ for (ItemStack s : outputItems) {
+ if (s != null) {
+ if (s.getItem() instanceof IonParticles) {
+ long aCharge = IonParticles.getChargeState(s);
+ if (aCharge == 0) {
+ IonParticles.setChargeState(
+ s,
+ MathUtils.getRandomFromArray(
+ new int[] { -5, -5, -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2,
+ -2, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
+ 5, 5, 5, 6, 6 }));
+ }
+ }
+ }
+ }
+ }
+ return result;
+ }
+ };
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (this.mOutputBusses.size() > 0) {
+ for (GT_MetaTileEntity_Hatch_OutputBus g : this.mOutputBusses) {
+ if (g != null) {
+ for (ItemStack s : g.mInventory) {
+ if (s != null) {
+ if (s.getItem() instanceof IonParticles) {
+ long aCharge = IonParticles.getChargeState(s);
+ if (aCharge == 0) {
+ IonParticles.setChargeState(
+ s,
+ MathUtils.getRandomFromArray(
+ new int[] { -5, -5, -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2,
+ -2, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
+ 5, 5, 5, 6, 6 }));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ this.fixAllMaintenanceIssue();
+ return super.onRunningTick(aStack);
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiCyclotron;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ String tier = tier() == 5 ? "I" : "II";
+ float plasmaOut = 0;
+ int powerRequired = 0;
+ if (this.mLastRecipe != null) {
+ powerRequired = this.mLastRecipe.mEUt;
+ if (this.mLastRecipe.getFluidOutput(0) != null) {
+ plasmaOut = (float) this.mLastRecipe.getFluidOutput(0).amount / (float) this.mLastRecipe.mDuration;
+ }
+ }
+
+ return new String[] { "COMET - Compact Cyclotron MK " + tier, "EU Required: " + powerRequired + "EU/t",
+ "Stored EU: " + this.getEUVar() + " / " + maxEUStore() };
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialFishingPond.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialFishingPond.java
new file mode 100644
index 0000000000..78e4a17274
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialFishingPond.java
@@ -0,0 +1,489 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gtPlusPlus.core.util.data.ArrayUtils.removeNulls;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.WeightedRandomFishable;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.FishPondFakeRecipe;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import ic2.core.init.BlocksItems;
+import ic2.core.init.InternalName;
+
+public class GregtechMetaTileEntity_IndustrialFishingPond extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialFishingPond> implements ISurvivalConstructable {
+
+ private boolean isUsingControllerCircuit = false;
+ private static final Item circuit = CI.getNumberedCircuit(0)
+ .getItem();
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialFishingPond> STRUCTURE_DEFINITION = null;
+ private static final Class<?> cofhWater;
+
+ static {
+ cofhWater = ReflectionUtils.getClass("cofh.asmhooks.block.BlockWater");
+ }
+
+ public GregtechMetaTileEntity_IndustrialFishingPond(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialFishingPond(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialFishingPond(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Fish Trap";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Fishing Pond")
+ .addInfo("Can process (Tier + 1) * 2 recipes")
+ .addInfo("Put a numbered circuit into the input bus.")
+ .addInfo("Circuit 14 for Fish")
+ .addInfo("Circuit 15 for Junk")
+ .addInfo("Circuit 16 for Treasure")
+ .addInfo("Need to be filled with water.")
+ .addInfo("Will automatically fill water from input hatch.")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(9, 3, 9, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Aquatic Casings", 64, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialFishingPond> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialFishingPond>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] {
+ { "XXXXXXXXX", "X X", "X X", "X X", "X X", "X X", "X X",
+ "X X", "XXXXXXXXX" },
+ { "XXXX~XXXX", "X X", "X X", "X X", "X X", "X X", "X X",
+ "X X", "XXXXXXXXX" },
+ { "XXXXXXXXX", "XXXXXXXXX", "XXXXXXXXX", "XXXXXXXXX", "XXXXXXXXX", "XXXXXXXXX", "XXXXXXXXX",
+ "XXXXXXXXX", "XXXXXXXXX" }, }))
+ .addElement(
+ 'X',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialFishingPond.class)
+ .atLeast(InputBus, OutputBus, Maintenance, Energy, Muffler, InputHatch)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 4, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 4, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 4, 1, 0) && mCasing >= 64 && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return getCasingTextureIndex();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.fishPondRecipes;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ ItemStack controllerStack = getControllerSlot();
+ if (controllerStack != null) {
+ if (controllerStack.getItem() == circuit) {
+ this.isUsingControllerCircuit = true;
+ this.mMode = controllerStack.getItemDamage();
+ } else {
+ this.isUsingControllerCircuit = false;
+ }
+ } else {
+ this.isUsingControllerCircuit = false;
+ }
+ if (!hasGenerateRecipes) {
+ generateRecipes();
+ }
+ if (!checkForWater()) {
+ return SimpleCheckRecipeResult.ofFailure("no_water");
+ }
+ ItemStack[] tItemInputs = getStoredInputs().toArray(new ItemStack[0]);
+ FluidStack[] tFluidInputs = getStoredFluids().toArray(new FluidStack[0]);
+
+ if (!isUsingControllerCircuit && tItemInputs.length == 0) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ long tEnergy = getMaxInputEnergy();
+
+ getCircuit(tItemInputs);
+
+ ItemStack[] mFishOutput = generateLoot(this.mMode);
+ mFishOutput = removeNulls(mFishOutput);
+ GT_Recipe g = new GT_Recipe(
+ true,
+ new ItemStack[] {},
+ mFishOutput,
+ null,
+ new int[] {},
+ tFluidInputs,
+ null,
+ 200,
+ 16,
+ 0);
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(g.mEUt)
+ .setEUt(tEnergy)
+ .setDuration(g.mDuration);
+ GT_ParallelHelper helper = new GT_ParallelHelper().setRecipe(g)
+ .setItemInputs(tItemInputs)
+ .setFluidInputs(tFluidInputs)
+ .setAvailableEUt(tEnergy)
+ .setMaxParallel(getMaxParallelRecipes())
+ .setConsumption(true)
+ .setOutputCalculation(true)
+ .setMachine(this)
+ .enableBatchMode(batchMode ? 128 : 1)
+ .setCalculator(calculator);
+
+ helper.build();
+
+ if (helper.getCurrentParallel() == 0) {
+ return CheckRecipeResultRegistry.ITEM_OUTPUT_FULL;
+ }
+
+ this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
+ this.mEfficiencyIncrease = 10000;
+
+ lEUt = -calculator.getConsumption();
+ mMaxProgresstime = (int) Math.ceil(calculator.getDuration() * helper.getDurationMultiplierDouble());
+
+ mOutputItems = helper.getItemOutputs();
+ mOutputFluids = null;
+ updateSlots();
+
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (2 * (GT_Utility.getTier(this.getMaxInputVoltage()) + 1));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialFishingPond;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings3Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 0;
+ }
+
+ public int getCasingTextureIndex() {
+ return TAE.GTPP_INDEX(32);
+ }
+
+ public boolean checkForWater() {
+
+ // Get Facing direction
+ IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity();
+ int mDirectionX = aBaseMetaTileEntity.getBackFacing().offsetX;
+ int mCurrentDirectionX;
+ int mCurrentDirectionZ;
+ int mOffsetX_Lower = 0;
+ int mOffsetX_Upper = 0;
+ int mOffsetZ_Lower = 0;
+ int mOffsetZ_Upper = 0;
+
+ mCurrentDirectionX = 4;
+ mCurrentDirectionZ = 4;
+
+ mOffsetX_Lower = -4;
+ mOffsetX_Upper = 4;
+ mOffsetZ_Lower = -4;
+ mOffsetZ_Upper = 4;
+
+ // if (aBaseMetaTileEntity.fac)
+
+ final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX * mCurrentDirectionX;
+ final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ * mCurrentDirectionZ;
+
+ int tAmount = 0;
+ for (int i = mOffsetX_Lower + 1; i <= mOffsetX_Upper - 1; ++i) {
+ for (int j = mOffsetZ_Lower + 1; j <= mOffsetZ_Upper - 1; ++j) {
+ for (int h = 0; h < 2; h++) {
+ Block tBlock = aBaseMetaTileEntity.getBlockOffset(xDir + i, h, zDir + j);
+ byte tMeta = aBaseMetaTileEntity.getMetaIDOffset(xDir + i, h, zDir + j);
+ if (isNotStaticWater(tBlock, tMeta)) {
+ if (this.getStoredFluids() != null) {
+ for (FluidStack stored : this.getStoredFluids()) {
+ if (stored.isFluidEqual(FluidUtils.getFluidStack("water", 1))) {
+ if (stored.amount >= 1000) {
+ // Utils.LOG_WARNING("Going to try swap an air block for water from inut bus.");
+ stored.amount -= 1000;
+ Block fluidUsed = Blocks.water;
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(
+ aBaseMetaTileEntity.getXCoord() + xDir + i,
+ aBaseMetaTileEntity.getYCoord() + h,
+ aBaseMetaTileEntity.getZCoord() + zDir + j,
+ fluidUsed);
+ }
+ }
+ }
+ }
+ }
+ tBlock = aBaseMetaTileEntity.getBlockOffset(xDir + i, h, zDir + j);
+ if (tBlock == Blocks.water || tBlock == Blocks.flowing_water) {
+ ++tAmount;
+ }
+ }
+ }
+ }
+
+ return tAmount >= 60;
+ }
+
+ private boolean isNotStaticWater(Block block, byte meta) {
+ return block == Blocks.air || block == Blocks.flowing_water
+ || block == BlocksItems.getFluidBlock(InternalName.fluidDistilledWater)
+ || (cofhWater != null && cofhWater.isAssignableFrom(block.getClass()) && meta != 0);
+ }
+
+ private static AutoMap<AutoMap<WeightedRandomFishable>> categories = new AutoMap<>();
+ private static AutoMap<WeightedRandomFishable> categoryFish = new AutoMap<>();
+ private static AutoMap<WeightedRandomFishable> categoryJunk = new AutoMap<>();
+ private static AutoMap<WeightedRandomFishable> categoryLoot = new AutoMap<>();
+ private static boolean hasGenerateRecipes = false;
+ private int mMode = 14;
+ private int mMax = 8;
+
+ private void generateRecipes() {
+ if (hasGenerateRecipes) return;
+
+ categories.put(categoryFish);
+ categories.put(categoryJunk);
+ categories.put(categoryLoot);
+ for (WeightedRandomFishable h : FishPondFakeRecipe.fish) {
+ categoryFish.put(h);
+ }
+ for (WeightedRandomFishable h : FishPondFakeRecipe.junk) {
+ categoryJunk.put(h);
+ }
+ for (WeightedRandomFishable h : FishPondFakeRecipe.treasure) {
+ categoryLoot.put(h);
+ }
+ hasGenerateRecipes = true;
+ }
+
+ private int getCircuit(ItemStack[] t) {
+ if (!this.isUsingControllerCircuit) {
+ for (ItemStack j : t) {
+ if (j.getItem() == CI.getNumberedCircuit(0)
+ .getItem()) {
+ // Fish
+ if (j.getItemDamage() == 14) {
+ mMax = 8 + (this.getMaxParallelRecipes() - 2);
+ this.mMode = 14;
+ break;
+ }
+ // Junk
+ else if (j.getItemDamage() == 15) {
+ this.mMode = 15;
+ mMax = 4;
+ break;
+ }
+ // Loot
+ else if (j.getItemDamage() == 16) {
+ this.mMode = 16;
+ mMax = 4;
+ break;
+ } else {
+ this.mMode = 0;
+ mMax = 0;
+ break;
+ }
+ } else {
+ this.mMode = 0;
+ mMax = 0;
+ break;
+ }
+ }
+ }
+ return this.mMode;
+ }
+
+ // reflection map
+ private static Map<WeightedRandomFishable, ItemStack> reflectiveFishMap = new HashMap<>();
+
+ private ItemStack reflectiveFish(WeightedRandomFishable y) {
+ if (reflectiveFishMap.containsKey(y)) {
+ return reflectiveFishMap.get(y);
+ }
+ ItemStack t;
+ try {
+ t = (ItemStack) ReflectionUtils.getField(WeightedRandomFishable.class, "field_150711_b")
+ .get(y);
+ ItemStack k = ItemUtils.getSimpleStack(t, 1);
+ reflectiveFishMap.put(y, k);
+ return t;
+ } catch (IllegalArgumentException | IllegalAccessException e) {}
+ return null;
+ }
+
+ private ItemStack[] generateLoot(int mode) {
+ ItemStack[] mFishOutput = new ItemStack[this.mMax];
+ if (this.mMode == 14) {
+ for (int k = 0; k < this.mMax; k++) {
+ if (mFishOutput[k] == null) for (WeightedRandomFishable g : categoryFish.values()) {
+ if (MathUtils.randInt(0, (65 - getMaxParallelRecipes())) <= 2) {
+ ItemStack t = reflectiveFish(g);
+ if (t != null) {
+ mFishOutput[k] = ItemUtils.getSimpleStack(t, 1);
+ }
+ }
+ }
+ }
+ } else if (this.mMode == 15) {
+ for (int k = 0; k < this.mMax; k++) {
+ if (mFishOutput[k] == null) for (WeightedRandomFishable g : categoryJunk.values()) {
+ if (MathUtils.randInt(0, 100) <= 1) {
+ ItemStack t = reflectiveFish(g);
+ if (t != null) {
+ mFishOutput[k] = ItemUtils.getSimpleStack(t, 1);
+ }
+ }
+ }
+ }
+ } else if (this.mMode == 16) {
+ for (int k = 0; k < this.mMax; k++) {
+ if (mFishOutput[k] == null) for (WeightedRandomFishable g : categoryLoot.values()) {
+ if (MathUtils.randInt(0, 1000) <= 2) {
+ ItemStack t = reflectiveFish(g);
+ if (t != null) {
+ mFishOutput[k] = ItemUtils.getSimpleStack(t, 1);
+ }
+ }
+ }
+ }
+ } else {
+ mFishOutput = null;
+ }
+ return mFishOutput;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialRockBreaker.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialRockBreaker.java
new file mode 100644
index 0000000000..e7e74ac061
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_IndustrialRockBreaker.java
@@ -0,0 +1,367 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.ArrayList;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_IndustrialRockBreaker extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_IndustrialRockBreaker> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_IndustrialRockBreaker> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_IndustrialRockBreaker(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_IndustrialRockBreaker(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_IndustrialRockBreaker(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Rock Breaker";
+ }
+
+ private static final String casingBaseName = GT_LanguageManager.getTranslation("gtplusplus.blockcasings.2.0.name");
+ private static final String casingMiddleName = GT_LanguageManager
+ .getTranslation("gtplusplus.blockcasings.2.11.name");
+ private static final String anyBaseCasing = "Any " + casingBaseName;
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Industrial Rock Breaker")
+ .addInfo("Speed: +200% | EU Usage: 75% | Parallel: Tier x 8")
+ .addInfo("Circuit goes in the GUI slot")
+ .addInfo("1 = cobble, 2 = stone, 3 = obsidian")
+ .addInfo("Supply Water/Lava")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 4, 3, true)
+ .addController("Bottom Center")
+ .addCasingInfoMin(casingBaseName, 9, false)
+ .addCasingInfoExactly(casingMiddleName, 16, false)
+ .addInputBus(anyBaseCasing, 1)
+ .addInputHatch(anyBaseCasing, 1)
+ .addOutputBus(anyBaseCasing, 1)
+ .addEnergyHatch(anyBaseCasing, 1)
+ .addMaintenanceHatch(anyBaseCasing, 1)
+ .addMufflerHatch(anyBaseCasing, 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_IndustrialRockBreaker> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_IndustrialRockBreaker>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCC", "CCC", "CCC" }, { "HHH", "H-H", "HHH" }, { "HHH", "H-H", "HHH" },
+ { "C~C", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_IndustrialRockBreaker.class)
+ .atLeast(InputBus, InputHatch, OutputBus, Maintenance, Energy, Muffler)
+ .casingIndex(TAE.GTPP_INDEX(16))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 0))))
+ .addElement('H', ofBlock(ModBlocks.blockCasings2Misc, 11))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ boolean aCheckPiece = checkPiece(mName, 1, 3, 0);
+ boolean aCasingCount = mCasing >= 9;
+ boolean aCheckHatch = checkHatch();
+ log("" + aCheckPiece + ", " + aCasingCount + ", " + aCheckHatch);
+ return aCheckPiece && aCasingCount && aCheckHatch;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_INDUCTION_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(16);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.rockBreakerFakeRecipes;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ private static GT_Recipe sRecipe_Cobblestone;
+ private static GT_Recipe sRecipe_SmoothStone;
+ private static GT_Recipe sRecipe_Redstone;
+
+ private static void generateRecipes() {
+ sRecipe_Cobblestone = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(1) },
+ new ItemStack[] { ItemUtils.getSimpleStack(Blocks.cobblestone) },
+ null,
+ new int[] { 10000 },
+ null,
+ null,
+ 16,
+ 32,
+ 0);
+ sRecipe_SmoothStone = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(2) },
+ new ItemStack[] { ItemUtils.getSimpleStack(Blocks.stone) },
+ null,
+ new int[] { 10000 },
+ null,
+ null,
+ 16,
+ 32,
+ 0);
+ sRecipe_Redstone = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L) },
+ new ItemStack[] { ItemUtils.getSimpleStack(Blocks.obsidian) },
+ null,
+ new int[] { 10000 },
+ null,
+ null,
+ 128,
+ 32,
+ 0);
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ ArrayList<FluidStack> aFluids = this.getStoredFluids();
+ if (aFluids.isEmpty()) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ boolean aHasWater = false;
+ boolean aHasLava = false;
+ for (FluidStack aFluid : aFluids) {
+ if (aFluid.getFluid() == FluidRegistry.WATER) {
+ aHasWater = true;
+ } else if (aFluid.getFluid() == FluidRegistry.LAVA) {
+ aHasLava = true;
+ }
+ }
+ ArrayList<ItemStack> aItems = this.getStoredInputs();
+ boolean aHasRedstone = false;
+ if (!aItems.isEmpty()) {
+ for (ItemStack aItem : aItems) {
+ if (GT_Utility
+ .areStacksEqual(aItem, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L))) {
+ aHasRedstone = true;
+ break;
+ }
+ }
+ }
+
+ if (!aHasWater) {
+ return SimpleCheckRecipeResult.ofFailure("no_water");
+ }
+ if (!aHasLava) {
+ return SimpleCheckRecipeResult.ofFailure("no_lava");
+ }
+ ItemStack aGuiCircuit = this.getControllerSlot();
+ if (!ItemUtils.isControlCircuit(aGuiCircuit)) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ if (sRecipe_Cobblestone == null || sRecipe_SmoothStone == null || sRecipe_Redstone == null) {
+ generateRecipes();
+ }
+
+ int aCircuit = aGuiCircuit.getItemDamage();
+
+ GT_Recipe tRecipe = null;
+ switch (aCircuit) {
+ case 1 -> tRecipe = sRecipe_Cobblestone;
+ case 2 -> tRecipe = sRecipe_SmoothStone;
+ case 3 -> {
+ if (aHasRedstone) {
+ tRecipe = sRecipe_Redstone;
+ }
+ }
+ }
+
+ if (tRecipe == null) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ ItemStack[] aItemInputs = aItems.toArray(new ItemStack[0]);
+ FluidStack[] aFluidInputs = new FluidStack[] {};
+
+ long tEnergy = getMaxInputEnergy();
+ // Remember last recipe - an optimization for findRecipe()
+ this.mLastRecipe = tRecipe;
+
+ GT_ParallelHelper helper = new GT_ParallelHelper().setRecipe(tRecipe)
+ .setItemInputs(aItemInputs)
+ .setFluidInputs(aFluidInputs)
+ .setAvailableEUt(tEnergy)
+ .setMaxParallel(getMaxParallelRecipes())
+ .setConsumption(true)
+ .setOutputCalculation(true)
+ .setEUtModifier(0.75F)
+ .setMachine(this);
+
+ if (batchMode) {
+ helper.enableBatchMode(128);
+ }
+
+ helper.build();
+
+ if (helper.getCurrentParallel() == 0) {
+ return CheckRecipeResultRegistry.ITEM_OUTPUT_FULL;
+ }
+
+ this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
+ this.mEfficiencyIncrease = 10000;
+
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(tRecipe.mEUt)
+ .setEUt(tEnergy)
+ .setDuration(tRecipe.mDuration)
+ .setEUtDiscount(0.75F)
+ .setSpeedBoost(1F / 3F)
+ .setParallel((int) Math.floor(helper.getCurrentParallel() / helper.getDurationMultiplierDouble()))
+ .calculate();
+ lEUt = -calculator.getConsumption();
+ mMaxProgresstime = (int) Math.ceil(calculator.getDuration() * helper.getDurationMultiplierDouble());
+
+ mOutputItems = helper.getItemOutputs();
+ mOutputFluids = helper.getFluidOutputs();
+ updateSlots();
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (8 * GT_Utility.getTier(this.getMaxInputVoltage()));
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiIndustrialRockBreaker;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public ArrayList<ItemStack> getStoredInputs() {
+ ArrayList<ItemStack> aInputs = super.getStoredInputs();
+ if (this.getControllerSlot() != null) {
+ aInputs.add(this.getControllerSlot());
+ }
+ return aInputs;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeRocketEngine.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeRocketEngine.java
new file mode 100644
index 0000000000..e77ac454ee
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeRocketEngine.java
@@ -0,0 +1,524 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.AirIntake;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.TTDynamo;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableMap;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.chemistry.RocketFuels;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_AirIntake;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_LargeRocketEngine
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_LargeRocketEngine> implements ISurvivalConstructable {
+
+ protected int fuelConsumption;
+ protected int fuelValue;
+ protected int fuelRemaining;
+ protected int freeFuelTicks = 0;
+ protected int euProduction = 0;
+ protected boolean boostEu;
+
+ public static String mLubricantName = "Carbon Dioxide";
+ public static String mCoolantName = "Liquid Hydrogen";
+
+ public static String mCasingName = "Turbodyne Casing";
+ public static String mIntakeHatchName = "Tungstensteel Turbine Casing";
+ public static String mGearboxName = "Inconel Reinforced Casing";
+
+ private static Fluid sAirFluid = null;
+ private static FluidStack sAirFluidStack = null;
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_LargeRocketEngine> STRUCTURE_DEFINITION = null;
+
+ private static final int CASING_ID = TAE.getIndexFromPage(3, 11);
+
+ public GregtechMetaTileEntity_LargeRocketEngine(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ this.fuelConsumption = 0;
+ this.fuelValue = 0;
+ this.fuelRemaining = 0;
+ this.boostEu = false;
+ setAir();
+ }
+
+ public GregtechMetaTileEntity_LargeRocketEngine(final String aName) {
+ super(aName);
+ this.fuelConsumption = 0;
+ this.fuelValue = 0;
+ this.fuelRemaining = 0;
+ this.boostEu = false;
+ setAir();
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Large Rocket Engine")
+ .addInfo("Generating Power from Rocket Fuels - Supports TecTech Multi-Amp Dynamos!")
+ .addInfo("Supply GT++ Rocket Fuels and 1000L of " + mLubricantName + " per hour")
+ .addInfo("Produces as much energy as you put fuel in, with optional boosting")
+ .addInfo("This multi doesn't accept fluids if not enabled - enable it first!")
+ .addInfo("Consumes 2000L/s of air and pollutes 1500 gibbl/s per 16384 eu/t produced")
+ .addInfo("Place 1-8 Air Intake Hatches on the sides to maintain Air input")
+ .addInfo("If it runs out of air, it will shut down and have to be manually restarted")
+ .addInfo("Supply 3L of " + mCoolantName + " per second, per 1000 EU/t to boost")
+ .addInfo("Takes 3x the amount of " + mLubricantName + " and maintains efficiency")
+ .addInfo("Fuel efficiency starts at ~160%, falls more slowly at higher EU/t if boosted")
+ .addInfo("If producing more than 30k EU/t, fuel efficiency will be lower:")
+ .addInfo("(These thresholds are 3x higher when boosted, boosted values displayed second)")
+ .addInfo("- 75% of max fuel efficiency at 53k or 159k EU/t output energy")
+ .addInfo("- 50% of max fuel efficiency at 69k or 207k EU/t output energy")
+ .addInfo("- 25% of max fuel efficiency at 98k or 294k EU/t output energy")
+ .addInfo("formula: x = input of energy (30000^(1/3)/ x^(1/3)) * (80000^(1/3)/ x^(1/3))")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 10, false)
+ .addController("Front Center")
+ .addCasingInfoMin(mCasingName, 64, false)
+ .addCasingInfoMin(mGearboxName, 8, false)
+ .addStructureHint("Air Intake Hatch", 1)
+ .addInputBus("Side center line", 1)
+ .addInputHatch("Side center line", 1)
+ .addMaintenanceHatch("Any Block Touching Inconel Reinforced Casing", 1)
+ .addDynamoHatch("Top center line", 2)
+ .addMufflerHatch("Back Center", 3)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_LargeRocketEngine> getStructureDefinition() {
+ if (this.STRUCTURE_DEFINITION == null) {
+ this.STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_LargeRocketEngine>builder()
+ .addShape(
+ this.mName,
+ transpose(
+ new String[][] { { "CTC", "CTC", "CTC", "CTC", "CTC", "CTC", "CTC", "CTC", "CTC", "CTC" },
+ { "C~C", "SIS", "SIS", "SIS", "SIS", "SIS", "SIS", "SIS", "SIS", "CMC" },
+ { "CCC", "CSC", "CSC", "CSC", "CSC", "CSC", "CSC", "CSC", "CSC", "CCC" }, }))
+ .addElement('C', ofBlock(getCasingBlock(), getCasingMeta()))
+ .addElement('I', ofBlock(getGearboxBlock(), getGearboxMeta()))
+ // side
+ .addElement(
+ 'S',
+ buildHatchAdder(GregtechMetaTileEntity_LargeRocketEngine.class)
+ .atLeast(ImmutableMap.of(AirIntake, 8, InputBus, 1, InputHatch, 3, Maintenance, 1))
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ // top
+ .addElement(
+ 'T',
+ buildHatchAdder(GregtechMetaTileEntity_LargeRocketEngine.class)
+ .atLeast(ImmutableMap.of(AirIntake, 8, Dynamo.or(TTDynamo), 1, Maintenance, 1))
+ .casingIndex(getCasingTextureIndex())
+ .dot(2)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .addElement('M', Muffler.newAny(getCasingTextureIndex(), 3))
+ .build();
+ }
+ return this.STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(this.mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ this.mCasing = 0;
+ this.mTecTechDynamoHatches.clear();
+ this.mAllDynamoHatches.clear();
+ this.mAirIntakes.clear();
+ return checkPiece(this.mName, 1, 1, 0) && this.mCasing >= 64 - 48
+ && this.mAirIntakes.size() >= 1
+ && checkHatch();
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return CASING_ID;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return this.getMaxEfficiency(aStack) > 0;
+ }
+
+ public static void setAir() {
+ if (sAirFluidStack == null) {
+ sAirFluidStack = FluidUtils.getFluidStack("air", 1);
+ }
+ if (sAirFluid == null && sAirFluidStack != null) {
+ sAirFluid = sAirFluidStack.getFluid();
+ }
+ }
+
+ public int getAir() {
+ setAir();
+ if (this.mAirIntakes.isEmpty() || this.mAirIntakes.size() <= 0) {
+ return 0;
+ } else {
+ int totalAir = 0;
+ for (GT_MetaTileEntity_Hatch_AirIntake u : this.mAirIntakes) {
+ if (u != null && u.mFluid != null) {
+ FluidStack f = u.mFluid;
+ if (f.isFluidEqual(sAirFluidStack)) {
+ totalAir += f.amount;
+ }
+ }
+ }
+ return totalAir;
+ }
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.rocketFuels;
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ final ArrayList<FluidStack> tFluids = this.getStoredFluids();
+ this.clearRecipeMapForAllInputHatches();
+ int aircount = getAir();
+ int aAirToConsume = this.euProduction / 100;
+ if (aircount < aAirToConsume) {
+ stopMachine(ShutDownReasonRegistry.outOfFluid(new FluidStack(sAirFluid, aAirToConsume)));
+ return SimpleCheckRecipeResult.ofFailure("no_air");
+ } else {
+ int aTotalAir = 0;
+ for (GT_MetaTileEntity_Hatch_AirIntake aAirHatch : this.mAirIntakes) {
+ if (aAirHatch.mFluid != null) {
+ aTotalAir += aAirHatch.getFluidAmount();
+ }
+ }
+ if (aTotalAir >= aAirToConsume) {
+ int aSplitAmount = (aAirToConsume / this.mAirIntakes.size());
+ if (aSplitAmount > 0) {
+ for (GT_MetaTileEntity_Hatch_AirIntake aAirHatch : mAirIntakes) {
+ boolean hasIntakeAir = aAirHatch.drain(aSplitAmount, true) != null;
+ if (!hasIntakeAir) {
+ this.freeFuelTicks = 0;
+ return SimpleCheckRecipeResult.ofFailure("no_air");
+ }
+ }
+ }
+ }
+ }
+ // reset fuel ticks in case it does not reset when it stops
+ if (this.freeFuelTicks != 0 && this.mProgresstime == 0 && this.mEfficiency == 0) this.freeFuelTicks = 0;
+
+ if (tFluids.size() > 0 && getRecipeMap() != null) {
+ if (this.mRuntime % 72 == 0) {
+ if (!consumeCO2()) {
+ this.freeFuelTicks = 0;
+ return SimpleCheckRecipeResult.ofFailure("no_co2");
+ }
+ }
+ if (this.freeFuelTicks == 0) {
+ this.boostEu = consumeLOH();
+ }
+ for (final FluidStack hatchFluid1 : tFluids) {
+ if (hatchFluid1.isFluidEqual(sAirFluidStack)) {
+ continue;
+ }
+ if (this.freeFuelTicks == 0) {
+ for (final GT_Recipe aFuel : getRecipeMap().getAllRecipes()) {
+ final FluidStack tLiquid;
+ tLiquid = aFuel.mFluidInputs[0];
+ if (hatchFluid1.isFluidEqual(tLiquid)) {
+ if (!consumeFuel(aFuel, hatchFluid1.amount)) {
+ continue;
+ }
+ this.fuelValue = aFuel.mSpecialValue * 3;
+ this.fuelRemaining = hatchFluid1.amount;
+ this.lEUt = ((this.mEfficiency < 2000) ? 0 : GT_Values.V[5] << 1);
+ this.mProgresstime = 1;
+ this.mMaxProgresstime = 1;
+ this.mEfficiencyIncrease = this.euProduction / 2000;
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+ }
+ } else {
+ this.mEfficiencyIncrease = this.euProduction / 2000;
+ this.freeFuelTicks--;
+ this.lEUt = ((this.mEfficiency < 1000) ? 0 : GT_Values.V[5] << 1);
+ this.mProgresstime = 1;
+ this.mMaxProgresstime = 1;
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+ }
+ }
+ this.lEUt = 0;
+ this.mEfficiency = 0;
+ this.freeFuelTicks = 0;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+
+ /**
+ * Consumes Fuel if required. Free Fuel Ticks are handled here.
+ *
+ * @param aFuel
+ * @return
+ */
+ public boolean consumeFuel(GT_Recipe aFuel, int amount) {
+ amount *= this.boostEu ? 0.3 : 0.9;
+ this.freeFuelTicks = 0;
+ int value = aFuel.mSpecialValue * 3;
+ int energy = value * amount;
+ if (amount < 5) return false;
+ FluidStack tLiquid = FluidUtils.getFluidStack(aFuel.mFluidInputs[0], (this.boostEu ? amount * 3 : amount));
+ if (!this.depleteInput(tLiquid)) {
+ return false;
+ } else {
+ this.fuelConsumption = this.boostEu ? amount * 3 : amount;
+ this.freeFuelTicks = 20;
+ setEUProduction(energy);
+ return true;
+ }
+ }
+
+ public void setEUProduction(int energy) {
+ energy /= 20;
+ double energyEfficiency;
+ double tDivideEnergy = Math.cbrt(energy);
+ if (energy > 30000) {
+ // cbrt(30 000) /
+ energyEfficiency = (31.072325 / tDivideEnergy);
+ if (energy >= 80000)
+ // cbrt(80 000) /
+ energyEfficiency *= (43.0886938 / tDivideEnergy);
+ energyEfficiency *= energy;
+ } else {
+ energyEfficiency = energy;
+ }
+ this.euProduction = (int) (energyEfficiency);
+ if (this.boostEu) this.euProduction *= 3;
+ }
+
+ public boolean consumeCO2() {
+ return this.depleteInput(MISC_MATERIALS.CARBON_DIOXIDE.getFluidStack(this.boostEu ? 3 : 1))
+ || this.depleteInput(FluidUtils.getFluidStack("carbondioxide", (this.boostEu ? 3 : 1)));
+ }
+
+ public boolean consumeLOH() {
+ int LOHamount = (3 * this.euProduction) / 1000;
+ return this.depleteInput(FluidUtils.getFluidStack(RocketFuels.Liquid_Hydrogen, LOHamount)); // (40 * ((long)
+ // euProduction /
+ // 10000))
+ }
+
+ @Override
+ public boolean addEnergyOutput(long aEU) {
+ if (aEU <= 0) {
+ return true;
+ }
+ if (this.mAllDynamoHatches.size() > 0) {
+ return addEnergyOutputMultipleDynamos(aEU, true);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addEnergyOutputMultipleDynamos(long aEU, boolean aAllowMixedVoltageDynamos) {
+ int injected = 0;
+ long totalOutput = 0;
+ long aFirstVoltageFound = -1;
+ boolean aFoundMixedDynamos = false;
+ for (GT_MetaTileEntity_Hatch aDynamo : filterValidMTEs(this.mAllDynamoHatches)) {
+ long aVoltage = aDynamo.maxEUOutput();
+ long aTotal = aDynamo.maxAmperesOut() * aVoltage;
+ // Check against voltage to check when hatch mixing
+ if (aFirstVoltageFound == -1) {
+ aFirstVoltageFound = aVoltage;
+ } else {
+ if (aFirstVoltageFound != aVoltage) {
+ aFoundMixedDynamos = true;
+ }
+ }
+ totalOutput += aTotal;
+ }
+
+ if (totalOutput < aEU || (aFoundMixedDynamos && !aAllowMixedVoltageDynamos)) {
+ explodeMultiblock();
+ return false;
+ }
+
+ long leftToInject;
+ long aVoltage;
+ int aAmpsToInject;
+ int aRemainder;
+
+ for (GT_MetaTileEntity_Hatch aDynamo : filterValidMTEs(this.mAllDynamoHatches)) {
+ leftToInject = aEU - injected;
+ aVoltage = aDynamo.maxEUOutput();
+ aAmpsToInject = (int) (leftToInject / aVoltage);
+ aRemainder = (int) (leftToInject - (aAmpsToInject * aVoltage));
+ long powerGain;
+ for (int i = 0; i < Math.min(aDynamo.maxAmperesOut(), aAmpsToInject + 1); i++) {
+ if (i == Math.min(aDynamo.maxAmperesOut(), aAmpsToInject)) {
+ powerGain = aRemainder;
+ } else {
+ powerGain = aVoltage;
+ }
+ aDynamo.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits(powerGain, false);
+ injected += powerGain;
+ }
+ }
+ return injected > 0;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockCasings4Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 11;
+ }
+
+ public Block getGearboxBlock() {
+ return ModBlocks.blockCasings3Misc;
+ }
+
+ public byte getGearboxMeta() {
+ return 1;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) CASING_ID;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_LargeRocketEngine(this.mName);
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setInteger("freeFuelTicks", this.freeFuelTicks);
+ aNBT.setInteger("euProduction", this.euProduction);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.freeFuelTicks = aNBT.getInteger("freeFuelTicks");
+ this.euProduction = aNBT.getInteger("euProduction");
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return this.euProduction;
+ }
+
+ @Override
+ public int getPollutionPerTick(final ItemStack aStack) {
+ return 75 * (this.euProduction / 10000);
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] { "Rocket Engine", "Current Air: " + getAir(),
+ "Current Pollution: " + getPollutionPerTick(null),
+ "Time until next fuel consumption: " + this.freeFuelTicks,
+ "Current Output: " + this.lEUt * this.mEfficiency / 10000 + " EU/t",
+ "Fuel Consumption: " + (this.fuelConsumption) + "L/s", "Fuel Value: " + this.fuelValue + " EU/L",
+ "Fuel Remaining: " + this.fuelRemaining + " Litres", "Current Efficiency: " + this.mEfficiency / 100 + "%",
+ (this.getIdealStatus() == this.getRepairStatus()) ? "No Maintainance issues" : "Needs Maintainance" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Rocket Engine";
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java
new file mode 100644
index 0000000000..4403779d09
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_LargeSemifluidGenerator.java
@@ -0,0 +1,332 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.TTDynamo;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMetaTileEntity_LargeSemifluidGenerator extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_LargeSemifluidGenerator> implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_LargeSemifluidGenerator> STRUCTURE_DEFINITION = null;
+
+ protected int fuelConsumption = 0;
+ protected int fuelValue = 0;
+ protected int fuelRemaining = 0;
+ protected boolean boostEu = false;
+
+ public GregtechMetaTileEntity_LargeSemifluidGenerator(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_LargeSemifluidGenerator(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Large Semifluid Generator")
+ .addInfo("Engine Intake Casings must not be obstructed in front (only air blocks)")
+ .addInfo("Supply Semifluid Fuels and 2000L of Lubricant per hour to run.")
+ .addInfo("Supply 80L of Oxygen per second to boost output (optional).")
+ .addInfo("Default: Produces 2048EU/t at 100% efficiency")
+ .addInfo("Boosted: Produces 6144EU/t at 150% efficiency")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 4, false)
+ .addController("Front Center")
+ .addCasingInfoMin("Stable Titanium Machine Casing", 16, false)
+ .addCasingInfoMin("Steel Gear Box Machine Casing", 2, false)
+ .addCasingInfoMin("Engine Intake Machine Casing", 8, false)
+ .addInputHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .addDynamoHatch("Back Center", 2)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return 50;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return getMaxEfficiency(aStack) > 0;
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ ArrayList<FluidStack> tFluids = getStoredFluids();
+
+ // Check for lubricant and oxygen first, so we can compute costs ahead of time.
+ // This will allow us to check costs without needing to actually try to deplete fluids
+ // (wasting earlier fluids in the check if later fluids turn out to be insufficient).
+ FluidStack lubricant = Materials.Lubricant.getFluid(0L);
+ FluidStack oxygen = Materials.Oxygen.getGas(0L);
+ for (FluidStack hatchFluid : tFluids) {
+ if (hatchFluid.isFluidEqual(lubricant)) {
+ lubricant.amount = Math.max(lubricant.amount, hatchFluid.amount);
+ } else if (hatchFluid.isFluidEqual(oxygen)) {
+ oxygen.amount = Math.max(oxygen.amount, hatchFluid.amount);
+ }
+ }
+ boostEu = oxygen.amount >= 4L;
+ long lubricantCost = boostEu ? 2L : 1L;
+ if (lubricant.amount < lubricantCost) {
+ return SimpleCheckRecipeResult.ofFailure("no_lubricant");
+ }
+
+ for (FluidStack hatchFluid : tFluids) { // Loops through hatches
+ GT_Recipe aFuel = GTPPRecipeMaps.semiFluidFuels.getBackend()
+ .findFuel(hatchFluid);
+ if (aFuel == null) {
+ // Not a valid semi-fluid fuel.
+ continue;
+ }
+
+ int newEUt = boostEu ? 4096 : 2048;
+ fuelConsumption = newEUt / aFuel.mSpecialValue; // Calc fuel consumption
+ FluidStack tLiquid = new FluidStack(hatchFluid.getFluid(), fuelConsumption);
+ if (depleteInput(tLiquid)) { // Deplete that amount
+ // We checked beforehand, so both of these depletions should succeed.
+ // But check the return values anyway just to be safe.
+ if (boostEu) {
+ if (!depleteInput(Materials.Oxygen.getGas(4L))) {
+ return SimpleCheckRecipeResult.ofFailure("no_oxygen");
+ }
+ }
+ // Deplete Lubricant. 2000L should = 1 hour of runtime (if baseEU = 2048)
+ if (mRuntime % 72 == 0 || mRuntime == 0) {
+ if (!depleteInput(Materials.Lubricant.getFluid(lubricantCost))) {
+ return SimpleCheckRecipeResult.ofFailure("no_lubricant");
+ }
+ }
+
+ fuelValue = aFuel.mSpecialValue;
+ fuelRemaining = hatchFluid.amount; // Record available fuel
+ this.lEUt = mEfficiency < 2000 ? 0 : newEUt; // Output 0 if startup is less than 20%
+ this.mProgresstime = 1;
+ this.mMaxProgresstime = 1;
+ this.mEfficiencyIncrease = 15;
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+ }
+
+ this.lEUt = 0;
+ this.mEfficiency = 0;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_LargeSemifluidGenerator> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_LargeSemifluidGenerator>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "III", "CCC", "CCC", "CCC" }, { "I~I", "CGC", "CGC", "CMC" },
+ { "III", "CCC", "CCC", "CCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_LargeSemifluidGenerator.class)
+ .atLeast(Muffler, InputHatch, Maintenance)
+ .casingIndex(getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(getCasingBlock(), getCasingMeta()))))
+ .addElement('G', ofBlock(getGearboxBlock(), getGearboxMeta()))
+ .addElement('I', ofBlock(getIntakeBlock(), getIntakeMeta()))
+ .addElement(
+ 'M',
+ Dynamo.or(TTDynamo)
+ .newAny(getCasingTextureIndex(), 2))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mDynamoHatches.clear();
+ return checkPiece(mName, 1, 1, 0) && mCasing >= 16 && checkHatch();
+ }
+
+ public final boolean addLargeSemifluidGeneratorList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ public final boolean addLargeSemifluidGeneratorBackList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo || this.isThisHatchMultiDynamo(aTileEntity)) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ public byte getCasingMeta() {
+ return 2;
+ }
+
+ public Block getIntakeBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ public byte getIntakeMeta() {
+ return 13;
+ }
+
+ public Block getGearboxBlock() {
+ return GregTech_API.sBlockCasings2;
+ }
+
+ public byte getGearboxMeta() {
+ return 3;
+ }
+
+ public byte getCasingTextureIndex() {
+ return 50;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_LargeSemifluidGenerator(this.mName);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return boostEu ? 15000 : 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiLargeSemiFluidGenerator;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] { "Large Semifluid Generator", "Current Output: " + lEUt * mEfficiency / 10000 + " EU/t",
+ "Fuel Consumption: " + fuelConsumption + "L/t", "Fuel Value: " + fuelValue + " EU/L",
+ "Fuel Remaining: " + fuelRemaining + " Litres", "Current Efficiency: " + (mEfficiency / 100) + "%",
+ getIdealStatus() == getRepairStatus() ? "No Maintainance issues" : "Needs Maintainance" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Semifluid Generator";
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 0;
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_MassFabricator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_MassFabricator.java
new file mode 100644
index 0000000000..69042b7982
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_MassFabricator.java
@@ -0,0 +1,337 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaTileEntity_MassFabricator
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_MassFabricator> implements ISurvivalConstructable {
+
+ public static int sUUAperUUM = 1;
+ public static int sUUASpeedBonus = 4;
+ public static int sDurationMultiplier = 3200;
+
+ public static String mCasingName1 = "Matter Fabricator Casing";
+ public static String mCasingName2 = "Containment Casing";
+ public static String mCasingName3 = "Matter Generation Coil";
+
+ private int mMode = 0;
+
+ private static final int MODE_SCRAP = 1;
+ private static final int MODE_UU = 0;
+
+ public static boolean sRequiresUUA = false;
+ private static final FluidStack[] mUU = new FluidStack[2];
+ private static final ItemStack[] mScrap = new ItemStack[2];
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_MassFabricator> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_MassFabricator(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_MassFabricator(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Mass Fabricator / Recycler";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Matter Fabricator")
+ .addInfo("Speed: +0% | EU Usage: 80%")
+ .addInfo("Parallel: Scrap = 64 | UU = 8 * Tier")
+ .addInfo("Produces UU-A, UU-M & Scrap")
+ .addInfo("Change mode with screwdriver")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(5, 4, 5, true)
+ .addController("Front Center")
+ .addCasingInfoMin(mCasingName3, 9, false)
+ .addCasingInfoMin(mCasingName2, 24, false)
+ .addCasingInfoMin(mCasingName1, 36, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .addOutputHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addMaintenanceHatch("Any Casing", 1)
+ .addMufflerHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_MatterFab_Active_Animated;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_MatterFab_Animated;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(9);
+ }
+
+ @Override
+ public void onConfigLoad(final GT_Config aConfig) {
+ super.onConfigLoad(aConfig);
+ sDurationMultiplier = aConfig
+ .get(ConfigCategories.machineconfig, "Massfabricator.UUM_Duration_Multiplier", sDurationMultiplier);
+ sUUAperUUM = aConfig.get(ConfigCategories.machineconfig, "Massfabricator.UUA_per_UUM", sUUAperUUM);
+ sUUASpeedBonus = aConfig.get(ConfigCategories.machineconfig, "Massfabricator.UUA_Speed_Bonus", sUUASpeedBonus);
+ sRequiresUUA = aConfig.get(ConfigCategories.machineconfig, "Massfabricator.UUA_Requirement", sRequiresUUA);
+ // Materials.UUAmplifier.mChemicalFormula = ("Mass Fabricator Eff/Speed Bonus: x" + sUUASpeedBonus);
+ }
+
+ public static boolean sInit = false;
+
+ public static void init() {
+ if (!sInit) {
+ if (mScrap[0] == null) {
+ mScrap[0] = ItemUtils.getSimpleStack(ItemUtils.getItemFromFQRN("IC2:itemScrap"));
+ }
+ if (mScrap[1] == null) {
+ mScrap[1] = ItemUtils.getSimpleStack(ItemUtils.getItemFromFQRN("IC2:itemScrapbox"));
+ }
+ if (mUU[0] == null) {
+ mUU[0] = Materials.UUAmplifier.getFluid(100);
+ }
+ if (mUU[1] == null) {
+ mUU[1] = Materials.UUMatter.getFluid(100);
+ }
+ sInit = true;
+ }
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_MassFabricator> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_MassFabricator>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" },
+ { "CGGGC", "G---G", "G---G", "G---G", "CGGGC" },
+ { "CGGGC", "G---G", "G---G", "G---G", "CGGGC" },
+ { "CC~CC", "CHHHC", "CHHHC", "CHHHC", "CCCCC" }, }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_MassFabricator.class)
+ .atLeast(InputBus, OutputBus, InputHatch, OutputHatch, Maintenance, Energy, Muffler)
+ .casingIndex(TAE.GTPP_INDEX(9))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasingsMisc, 9))))
+ .addElement('H', ofBlock(ModBlocks.blockCasingsMisc, 8))
+ .addElement('G', ofBlock(ModBlocks.blockCasings3Misc, 15))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 2, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 2, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ return checkPiece(mName, 2, 3, 0) && mCasing >= 36 && checkHatch();
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiMassFabricator;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_MassFabricator(this.mName);
+ }
+
+ /**
+ * Special Recipe Handling
+ */
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return this.mMode == MODE_SCRAP ? RecipeMaps.recyclerRecipes : GTPPRecipeMaps.multiblockMassFabricatorRecipes;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(RecipeMaps.recyclerRecipes, GTPPRecipeMaps.multiblockMassFabricatorRecipes);
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ init();
+ return super.process();
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ if (mMode == MODE_SCRAP) {
+ if (recipe.mOutputs == null) {
+ return SimpleCheckRecipeResult.ofSuccess("no_scrap");
+ }
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ if (mMode == MODE_SCRAP) {
+ if (inputItems != null) {
+ for (ItemStack item : inputItems) {
+ if (item == null || item.stackSize == 0) continue;
+ ItemStack aPotentialOutput = GT_ModHandler
+ .getRecyclerOutput(GT_Utility.copyAmount(1, item), 0);
+ GT_Recipe recipe = new GT_Recipe(
+ false,
+ new ItemStack[] { GT_Utility.copyAmount(1, item) },
+ aPotentialOutput == null ? null : new ItemStack[] { aPotentialOutput },
+ null,
+ new int[] { 2000 },
+ null,
+ null,
+ 40,
+ MaterialUtils.getVoltageForTier(1),
+ 0);
+ return Stream.of(recipe);
+ }
+ }
+ return Stream.empty();
+ }
+ return super.findRecipeMatches(map);
+ }
+ }.setEuModifier(0.8F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void setupProcessingLogic(ProcessingLogic logic) {
+ super.setupProcessingLogic(logic);
+ logic.enablePerfectOverclock();
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return this.mMode == MODE_SCRAP ? 64 : 8 * (Math.max(1, GT_Utility.getTier(getMaxInputVoltage())));
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ int aMode = this.mMode + 1;
+ if (aMode > 1) {
+ this.mMode = MODE_UU;
+ PlayerUtils.messagePlayer(aPlayer, "Mode [" + this.mMode + "]: Matter/AmpliFabricator");
+ } else if (aMode == 1) {
+ this.mMode = MODE_SCRAP;
+ PlayerUtils.messagePlayer(aPlayer, "Mode [" + this.mMode + "]: Recycler");
+ } else {
+ this.mMode = MODE_SCRAP;
+ PlayerUtils.messagePlayer(aPlayer, "Mode [" + this.mMode + "]: Recycler");
+ }
+ mLastRecipe = null;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mMode", mMode);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mMode = aNBT.getInteger("mMode");
+ super.loadNBTData(aNBT);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_QuantumForceTransformer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_QuantumForceTransformer.java
new file mode 100644
index 0000000000..bd5e579cd2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_QuantumForceTransformer.java
@@ -0,0 +1,939 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.ExoticEnergy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_OreDictUnificator.getAssociation;
+import static gregtech.api.util.GT_ParallelHelper.addFluidsLong;
+import static gregtech.api.util.GT_ParallelHelper.addItemsLong;
+import static gregtech.api.util.GT_ParallelHelper.calculateChancedOutputMultiplier;
+import static gregtech.api.util.GT_RecipeBuilder.BUCKETS;
+import static gregtech.api.util.GT_RecipeBuilder.INGOTS;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.ITierConverter;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class GregtechMetaTileEntity_QuantumForceTransformer
+ extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GregtechMetaTileEntity_QuantumForceTransformer>
+ implements ISurvivalConstructable {
+
+ private int mCasing;
+ protected int mCraftingTier = 0;
+ protected int mFocusingTier = 0;
+ protected int mMaxParallel = 0;
+ private boolean mFluidMode = false, doFermium = false, doNeptunium = false;
+ private static final Fluid mNeptunium = ELEMENT.getInstance().NEPTUNIUM.getPlasma();
+ private static final Fluid mFermium = ELEMENT.getInstance().FERMIUM.getPlasma();
+ private static final String MAIN_PIECE = "main";
+ private GT_MetaTileEntity_Hatch_Input mNeptuniumHatch;
+ private GT_MetaTileEntity_Hatch_Input mFermiumHatch;
+ private static final IStructureDefinition<GregtechMetaTileEntity_QuantumForceTransformer> STRUCTURE_DEFINITION = StructureDefinition
+ .<GregtechMetaTileEntity_QuantumForceTransformer>builder()
+ .addShape(
+ MAIN_PIECE,
+ new String[][] { // A - 142, B - 234, C - 177, D - 96, E - 224, H - 36, M - 21
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " ", " ", " BAB ", " BBBBABBBB ",
+ " BAAAAAAAB ", " BABBABBAB ", " BA AB ", " A A ", " A A ",
+ " A A " },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " ", " BAB ", " AAABBBAAA ", " BAAAAAAAAAB ",
+ " B B ", " A A ", " A A ", " ", " ",
+ " " },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " BAB ", " AA AA ", " AA AA ", " BAA AAB ",
+ " B B ", " A A ", " A A ", " ", " ",
+ " " },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " BAAAB ", " AA AA ", " AA AA ", "BAA AAB",
+ "B B", "A A", "A A", "A A", "A A",
+ "A A" },
+ { " TTT ", " EEE ", " EEE ", " EEE ", " DDD ",
+ " EEE ", " DDD ", " EEE ", " EEE ", " EEE ",
+ " DDD ", " BAEEEAB ", " AA EEE AA ", " A EEE A ", "BA DDD AB",
+ "B EEE B", "B DDD B", " EEE ", " EEE ", " EEE ",
+ " Z~X " },
+ { " TTTTT ", " ECCCE ", " ECCCE ", " ECCCE ", " D D ",
+ " ECCCE ", " D D ", " ECCCE ", " ECCCE ", " ECCCE ",
+ " D D ", " BAECCCEAB ", " A ECCCE A ", " A ECCCE A ", "BA D D AB",
+ "B ECCCE B", "B D D B", "B ECCCE B", " ECCCE ", " ECCCE ",
+ " HHHHH " },
+ { " TTTTTTT ", " ECCCCCE ", " EC CE ", " EC CE ", " D D ",
+ " EC CE ", " D D ", " EC CE ", " EC CE ", " EC CE ",
+ " D D ", " BAEC CEAB ", " B EC CE B ", "BB EC CE BB", "BA D D AB",
+ "A EC CE A", "A D D A", "A EC CE A", " EC CE ", " EC CE ",
+ " HHHHHHH " },
+ { " TTTTTTT ", " ECCCCCE ", " EC CE ", " EC CE ", " D D ",
+ " EC CE ", " D D ", " EC CE ", " EC CE ", " EC CE ",
+ " D D ", " AAEC CEAA ", " A EC CE A ", "AB EC CE BA", "AA D D AA",
+ "A EC CE A", "A D D A", " EC CE ", " EC CE ", " EC CE ",
+ " HHHHHHH " },
+ { " TTTTTTT ", " ECCCCCE ", " EC CE ", " EC CE ", " D D ",
+ " EC CE ", " D D ", " EC CE ", " EC CE ", " EC CE ",
+ " D D ", " BAEC CEAB ", " B EC CE B ", "BB EC CE BB", "BA D D AB",
+ "A EC CE A", "A D D A", "A EC CE A", " EC CE ", " EC CE ",
+ " HHHHHHH " },
+ { " TTTTT ", " ECCCE ", " ECCCE ", " ECCCE ", " D D ",
+ " ECCCE ", " D D ", " ECCCE ", " ECCCE ", " ECCCE ",
+ " D D ", " BAECCCEAB ", " A ECCCE A ", " A ECCCE A ", "BA D D AB",
+ "B ECCCE B", "B D D B", "B ECCCE B", " ECCCE ", " ECCCE ",
+ " HHHHH " },
+ { " TTT ", " EEE ", " EEE ", " EEE ", " DDD ",
+ " EEE ", " DDD ", " EEE ", " EEE ", " EEE ",
+ " DDD ", " BAEEEAB ", " AA EEE AA ", " A EEE A ", "BA DDD AB",
+ "B EEE B", "B DDD B", " EEE ", " EEE ", " EEE ",
+ " HHH " },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " BAAAB ", " AA AA ", " AA AA ", "BAA AAB",
+ "B B", "A A", "A A", "A A", "A A",
+ "A A" },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " BAB ", " AA AA ", " AA AA ", " BAA AAB ",
+ " B B ", " A A ", " A A ", " ", " ",
+ " " },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " ", " BAB ", " AAABBBAAA ", " BAAAAAAAAAB ",
+ " B B ", " A A ", " A A ", " ", " ",
+ " " },
+ { " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ",
+ " ", " ", " ", " BAB ", " BBBBABBBB ",
+ " BBBAAABBB ", " ABBAAABBA ", " A BA AB A ", " A A ", " A A ",
+ " A A " }, })
+ .addElement(
+ 'A',
+ withChannel(
+ "manipulator",
+ StructureUtility.ofBlocksTiered(
+ craftingTierConverter(),
+ getAllCraftingTiers(),
+ 0,
+ GregtechMetaTileEntity_QuantumForceTransformer::setCraftingTier,
+ GregtechMetaTileEntity_QuantumForceTransformer::getCraftingTier)))
+ .addElement(
+ 'B',
+ withChannel(
+ "shielding",
+ StructureUtility.ofBlocksTiered(
+ focusingTierConverter(),
+ getAllFocusingTiers(),
+ 0,
+ GregtechMetaTileEntity_QuantumForceTransformer::setFocusingTier,
+ GregtechMetaTileEntity_QuantumForceTransformer::getFocusingTier)))
+ .addElement('C', ofBlock(ModBlocks.blockCasings4Misc, 4))
+ .addElement('D', ofBlock(ModBlocks.blockCasings2Misc, 12))
+ .addElement('E', lazy(t -> ofBlock(t.getCasingBlock1(), t.getCasingMeta1())))
+ .addElement(
+ 'H',
+ buildHatchAdder(GregtechMetaTileEntity_QuantumForceTransformer.class)
+ .atLeast(InputBus, InputHatch, Maintenance, Energy.or(ExoticEnergy))
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(4)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 12))))
+ .addElement(
+ 'T',
+ buildHatchAdder(GregtechMetaTileEntity_QuantumForceTransformer.class)
+ .atLeast(OutputBus, OutputHatch, Maintenance)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(5)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 12))))
+ .addElement(
+ 'Z',
+ buildHatchAdder(GregtechMetaTileEntity_QuantumForceTransformer.class)
+ .hatchClass(GT_MetaTileEntity_Hatch_Input.class)
+ .adder(GregtechMetaTileEntity_QuantumForceTransformer::addNeptuniumHatch)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(5)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 12))))
+ .addElement(
+ 'X',
+ buildHatchAdder(GregtechMetaTileEntity_QuantumForceTransformer.class)
+ .hatchClass(GT_MetaTileEntity_Hatch_Input.class)
+ .adder(GregtechMetaTileEntity_QuantumForceTransformer::addFermiumHatch)
+ .casingIndex(TAE.getIndexFromPage(0, 10))
+ .dot(5)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 12))))
+ .build();
+
+ public GregtechMetaTileEntity_QuantumForceTransformer(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_QuantumForceTransformer(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_QuantumForceTransformer(this.mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Quantum Force Transformer")
+ .addInfo("Controller Block for the Quantum Force Transformer")
+ .addInfo("Allows Complex chemical lines to be performed instantly in one step")
+ .addInfo("Every recipe requires a catalyst, each catalyst adds 1 parallel and lasts forever")
+ .addInfo("Accepts TecTech Energy and Laser Hatches")
+ .addInfo("All inputs go on the bottom, all outputs go on the top")
+ .addInfo("Put a circuit in the controller to specify the focused output")
+ .addInfo("Check NEI to see the order of outputs, and which circuit number you need.")
+ .addInfo("If separate input busses are enabled put the circuit in the circuit slot of the bus")
+ .addInfo("Uses FocusTier*4*sqrt(parallels) Neptunium Plasma if focusing")
+ .addInfo("Can use FocusTier*4*sqrt(parallels) Fermium Plasma for additional chance output")
+ .addInfo("Use a screwdriver to enable Fluid mode")
+ .addInfo(
+ "Fluid mode turns all possible outputs into their fluid variant, those which can't are left as they were.")
+ .addInfo("This multi gets improved when all casings of some types are upgraded")
+ .addInfo("Casing functions:")
+ .addInfo("Pulse Manipulators: Recipe Tier Allowed (check NEI for the tier of each recipe)")
+ .addInfo("Shielding Cores: Focusing Tier (equal to or higher than recipe tier to allow focus)")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(15, 21, 15, true)
+ .addController("Bottom Center")
+ .addCasingInfoMin("Bulk Production Frame", 80, false)
+ .addCasingInfoMin("Quantum Force Conductor", 177, false)
+ .addCasingInfoMin("Force Field Glass", 224, false)
+ .addCasingInfoMin("Pulse Manipulators", 236, true)
+ .addCasingInfoMin("Shielding Cores", 142, true)
+ .addInputBus(EnumChatFormatting.BLUE + "Bottom" + EnumChatFormatting.GRAY + " Layer", 4)
+ .addInputHatch(EnumChatFormatting.BLUE + "Bottom" + EnumChatFormatting.GRAY + " Layer", 4)
+ .addOutputHatch(EnumChatFormatting.AQUA + "Top" + EnumChatFormatting.GRAY + " Layer", 5)
+ .addOutputBus(EnumChatFormatting.AQUA + "Top" + EnumChatFormatting.GRAY + " Layer", 5)
+ .addEnergyHatch(EnumChatFormatting.BLUE + "Bottom" + EnumChatFormatting.GRAY + " Layer", 4)
+ .addMaintenanceHatch(
+ EnumChatFormatting.BLUE + "Bottom"
+ + EnumChatFormatting.GRAY
+ + " or "
+ + EnumChatFormatting.AQUA
+ + "Top"
+ + EnumChatFormatting.GRAY
+ + " Layer",
+ 4,
+ 5)
+ .addStructureInfo(
+ EnumChatFormatting.WHITE + "Neptunium Plasma Hatch: "
+ + EnumChatFormatting.GREEN
+ + "Left"
+ + EnumChatFormatting.GRAY
+ + " side of Controller")
+ .addStructureInfo(
+ EnumChatFormatting.WHITE + "Fermium Plasma Hatch: "
+ + EnumChatFormatting.DARK_GREEN
+ + "Right"
+ + EnumChatFormatting.GRAY
+ + " side of Controller")
+ .toolTipFinisher(
+ GT_Values.AuthorBlueWeabo + EnumChatFormatting.RESET
+ + EnumChatFormatting.GREEN
+ + " + Steelux"
+ + EnumChatFormatting.RESET
+ + " - [GT++]");
+ return tt;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_QuantumForceTransformer> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ this.mCasing = 0;
+ this.mCraftingTier = 0;
+ this.mFocusingTier = 0;
+ if (!checkPiece(MAIN_PIECE, 7, 20, 4)) {
+ return false;
+ }
+
+ if (mMaintenanceHatches.size() != 1 || mOutputBusses.isEmpty() || mOutputHatches.isEmpty()) {
+ return false;
+ }
+
+ return checkExoticAndNormalEnergyHatches();
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(MAIN_PIECE, stackSize, hintsOnly, 7, 20, 4);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(MAIN_PIECE, stackSize, 7, 20, 4, elementBudget, env, false, true);
+ }
+
+ public static List<Pair<Block, Integer>> getAllCraftingTiers() {
+ return new ArrayList<>() {
+
+ {
+ add(Pair.of(ModBlocks.blockCasings5Misc, 7));
+ add(Pair.of(ModBlocks.blockCasings5Misc, 8));
+ add(Pair.of(ModBlocks.blockCasings5Misc, 9));
+ add(Pair.of(ModBlocks.blockCasings5Misc, 10));
+ }
+ };
+ }
+
+ public static List<Pair<Block, Integer>> getAllFocusingTiers() {
+ return new ArrayList<>() {
+
+ {
+ add(Pair.of(ModBlocks.blockCasings5Misc, 11));
+ add(Pair.of(ModBlocks.blockCasings5Misc, 12));
+ add(Pair.of(ModBlocks.blockCasings5Misc, 13));
+ add(Pair.of(ModBlocks.blockCasings5Misc, 14));
+ }
+ };
+ }
+
+ public static ITierConverter<Integer> craftingTierConverter() {
+ return (block, meta) -> {
+ if (block == null) {
+ return -1;
+ } else if (block == ModBlocks.blockCasings5Misc) { // Resonance Chambers
+ switch (meta) {
+ case 7 -> {
+ return 1;
+ }
+ case 8 -> {
+ return 2;
+ }
+ case 9 -> {
+ return 3;
+ }
+ case 10 -> {
+ return 4;
+ }
+ }
+ }
+ return -1;
+ };
+ }
+
+ public static ITierConverter<Integer> focusingTierConverter() {
+ return (block, meta) -> {
+ if (block == null) {
+ return -1;
+ } else if (block == ModBlocks.blockCasings5Misc) { // Generation Coils
+ switch (meta) {
+ case 11 -> {
+ return 1;
+ }
+ case 12 -> {
+ return 2;
+ }
+ case 13 -> {
+ return 3;
+ }
+ case 14 -> {
+ return 4;
+ }
+ }
+ }
+ return -1;
+ };
+ }
+
+ private void setCraftingTier(int tier) {
+ mCraftingTier = tier;
+ }
+
+ private void setFocusingTier(int tier) {
+ mFocusingTier = tier;
+ }
+
+ private int getCraftingTier() {
+ return mCraftingTier;
+ }
+
+ private int getFocusingTier() {
+ return mFocusingTier;
+ }
+
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ protected int getCasingTextureId() {
+ return TAE.getIndexFromPage(0, 10);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.quantumForceTransformerRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ private int[] chances;
+ private FluidStack[] fluidModeItems;
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ if (recipe.mSpecialValue > getCraftingTier()) {
+ return CheckRecipeResultRegistry.insufficientMachineTier(recipe.mSpecialValue);
+ }
+ ItemStack catalyst = null;
+ for (ItemStack item : recipe.mInputs) {
+ if (ItemUtils.isCatalyst(item)) {
+ catalyst = item;
+ break;
+ }
+ }
+
+ if (catalyst == null) {
+ return SimpleCheckRecipeResult.ofFailure("no_catalyst");
+ }
+
+ maxParallel = 0;
+ for (ItemStack item : inputItems) {
+ if (ItemUtils.isCatalyst(item) && item.isItemEqual(catalyst)) {
+ maxParallel += item.stackSize;
+ }
+ }
+
+ mMaxParallel = maxParallel;
+ doFermium = false;
+ doNeptunium = false;
+
+ if (recipe.mSpecialValue <= getFocusingTier()) {
+ if (drain(mFermiumHatch, new FluidStack(mFermium, 1), false)) {
+ doFermium = true;
+ }
+ if (drain(mNeptuniumHatch, new FluidStack(mNeptunium, 1), false)) {
+ doNeptunium = true;
+ }
+ }
+
+ chances = getOutputChances(recipe, doNeptunium ? findProgrammedCircuitNumber() : -1);
+
+ // Handle Fluid Mode. Add fluid that item can be turned into to fluidModeItems.
+ // null if Fluid Mode is disabled or item cannot be turned into fluid.
+ fluidModeItems = new FluidStack[recipe.mOutputs.length];
+ if (mFluidMode) {
+ for (int i = 0; i < recipe.mOutputs.length; i++) {
+ ItemStack item = recipe.getOutput(i);
+ if (item == null) continue;
+ ItemData data = getAssociation(item);
+ Materials mat = data == null ? null : data.mMaterial.mMaterial;
+ if (mat != null) {
+ if (mat.mStandardMoltenFluid != null) {
+ fluidModeItems[i] = mat.getMolten(INGOTS);
+ } else if (mat.mFluid != null) {
+ fluidModeItems[i] = mat.getFluid(BUCKETS);
+ }
+ }
+ }
+ }
+
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ public GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) {
+ return super.createParallelHelper(recipe).setCustomItemOutputCalculation(parallel -> {
+ ArrayList<ItemStack> items = new ArrayList<>();
+
+ for (int i = 0; i < recipe.mOutputs.length; i++) {
+ ItemStack item = recipe.getOutput(i);
+ if (item == null || fluidModeItems[i] != null) continue;
+ ItemStack itemToAdd = item.copy();
+ double outputMultiplier = calculateChancedOutputMultiplier(chances[i], parallel);
+ long itemAmount = (long) (item.stackSize * outputMultiplier);
+ addItemsLong(items, itemToAdd, itemAmount);
+ }
+
+ return items.toArray(new ItemStack[0]);
+ })
+ .setCustomFluidOutputCalculation(parallel -> {
+ ArrayList<FluidStack> fluids = new ArrayList<>();
+
+ if (mFluidMode) {
+ for (int i = 0; i < recipe.mOutputs.length; i++) {
+ FluidStack fluid = fluidModeItems[i];
+ if (fluid == null) continue;
+ FluidStack fluidToAdd = fluid.copy();
+ double outputMultiplier = calculateChancedOutputMultiplier(chances[i], parallel);
+ int itemAmount = recipe.mOutputs[i].stackSize;
+ long fluidAmount = (long) (fluidToAdd.amount * outputMultiplier * itemAmount);
+ addFluidsLong(fluids, fluidToAdd, fluidAmount);
+ }
+ }
+
+ for (int i = 0; i < recipe.mFluidOutputs.length; i++) {
+ FluidStack fluid = recipe.getFluidOutput(i);
+ if (fluid == null) continue;
+ FluidStack fluidToAdd = fluid.copy();
+ double outputMultiplier = calculateChancedOutputMultiplier(
+ chances[i + recipe.mOutputs.length],
+ parallel);
+ long fluidAmount = (long) (fluidToAdd.amount * outputMultiplier);
+ addFluidsLong(fluids, fluidToAdd, fluidAmount);
+ }
+
+ return fluids.toArray(new FluidStack[0]);
+ });
+ }
+
+ private int findProgrammedCircuitNumber() {
+ if (isInputSeparationEnabled()) {
+ for (ItemStack stack : inputItems) {
+ if (GT_Utility.isAnyIntegratedCircuit(stack)) {
+ return stack.getItemDamage() - 1;
+ }
+ }
+ return -1;
+ } else {
+ final ItemStack controllerStack = getControllerSlot();
+ return GT_Utility.isAnyIntegratedCircuit(controllerStack) ? controllerStack.getItemDamage() - 1
+ : -1;
+ }
+ }
+ };
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(getAverageInputVoltage());
+ logic.setAvailableAmperage(getMaxInputAmps());
+ }
+
+ private byte runningTick = 0;
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (!super.onRunningTick(aStack)) {
+ return false;
+ }
+
+ if (runningTick % 20 == 0) {
+ int amount = (int) (getFocusingTier() * 4
+ * Math.sqrt(Math.min(mMaxParallel, processingLogic.getCurrentParallels())));
+ if (doFermium) {
+ FluidStack fermiumToConsume = new FluidStack(mFermium, amount);
+ if (!drain(mFermiumHatch, fermiumToConsume, true)) {
+ doFermium = false;
+ stopMachine(ShutDownReasonRegistry.outOfFluid(fermiumToConsume));
+ return false;
+ }
+ }
+
+ if (doNeptunium) {
+ FluidStack neptuniumToConsume = new FluidStack(mNeptunium, amount);
+ if (!drain(mNeptuniumHatch, neptuniumToConsume, true)) {
+ doNeptunium = false;
+ stopMachine(ShutDownReasonRegistry.outOfFluid(neptuniumToConsume));
+ return false;
+ }
+ }
+
+ runningTick = 1;
+ } else {
+ runningTick++;
+ }
+
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+ // TODO: Look for proper fix
+ // Updates every 30 sec
+ if (mUpdate <= -550) mUpdate = 50;
+ }
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ private int[] getOutputChances(GT_Recipe tRecipe, int aChanceIncreased) {
+ int difference = getFocusingTier() - tRecipe.mSpecialValue;
+ int aOutputsAmount = tRecipe.mOutputs.length + tRecipe.mFluidOutputs.length;
+ int aChancePerOutput = 10000 / aOutputsAmount;
+ int[] tChances = new int[aOutputsAmount];
+ Arrays.fill(tChances, aChancePerOutput);
+
+ switch (difference) {
+ case 0 -> {
+ for (int i = 0; i < tChances.length; i++) {
+ if (doNeptunium) {
+ if (i == aChanceIncreased) {
+ tChances[i] += aChancePerOutput / 2 * (aOutputsAmount - 1);
+ } else {
+ tChances[i] /= 2;
+ }
+ }
+
+ if (doFermium) {
+ tChances[i] += (10000 - tChances[i]) / 4;
+ }
+ }
+ }
+ case 1 -> {
+ for (int i = 0; i < tChances.length; i++) {
+ if (doNeptunium) {
+ if (i == aChanceIncreased) {
+ tChances[i] += aChancePerOutput * 3 / 4 * (aOutputsAmount - 1);
+ } else {
+ tChances[i] /= 4;
+ }
+ }
+
+ if (doFermium) {
+ tChances[i] += (10000 - tChances[i]) / 3;
+ }
+ }
+ }
+ case 2, 3 -> {
+ for (int i = 0; i < tChances.length; i++) {
+ if (doNeptunium) {
+ if (i == aChanceIncreased) {
+ tChances[i] = 10000;
+ } else {
+ tChances[i] = 0;
+ }
+ }
+
+ if (doFermium) {
+ tChances[i] += (10000 - tChances[i]) / 2;
+ }
+ }
+ }
+ }
+ return tChances;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mFluidMode = !mFluidMode;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("miscutils.machines.QFTFluidMode") + " " + mFluidMode);
+ }
+
+ public boolean addNeptuniumHatch(IGregTechTileEntity aTileEntity, short aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = null;
+ mNeptuniumHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity;
+ return true;
+ }
+ return false;
+ }
+
+ public boolean addFermiumHatch(IGregTechTileEntity aTileEntity, short aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = null;
+ mFermiumHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity;
+ return true;
+ }
+ return false;
+ }
+
+ public Block getCasingBlock1() {
+ return ModBlocks.blockCasings5Misc;
+ }
+
+ public byte getCasingMeta1() {
+ return 15;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setBoolean("mFluidMode", mFluidMode);
+ aNBT.setBoolean("doFermium", doFermium);
+ aNBT.setBoolean("doNeptunium", doNeptunium);
+ aNBT.setInteger("mMaxParallel", mMaxParallel);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
+ inputSeparation = aNBT.getBoolean("mSeparateInputBusses");
+ }
+ if (!aNBT.hasKey(BATCH_MODE_NBT_KEY)) {
+ batchMode = aNBT.getBoolean("mBatchMode");
+ }
+ mFluidMode = aNBT.getBoolean("mFluidMode");
+ doFermium = aNBT.getBoolean("doFermium");
+ doNeptunium = aNBT.getBoolean("doNeptunium");
+ mMaxParallel = aNBT.getInteger("mMaxParallel");
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int aColorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ if (aActive) return new ITexture[] { getCasingTexture(), TextureFactory.builder()
+ .addIcon(getActiveOverlay())
+ .extFacing()
+ .build() };
+ return new ITexture[] { getCasingTexture(), TextureFactory.builder()
+ .addIcon(getInactiveOverlay())
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { getCasingTexture() };
+ }
+
+ private ITexture getCasingTexture() {
+ return Textures.BlockIcons.getCasingTextureForId(getCasingTextureId());
+ }
+
+ @SideOnly(Side.CLIENT)
+ private void renderForceField(double x, double y, double z, int side, double minU, double maxU, double minV,
+ double maxV) {
+ // spotless:off
+ Tessellator tes = Tessellator.instance;
+ switch (side) {
+ case 0 -> {
+ tes.addVertexWithUV(x + 3, y, z + 7, maxU, maxV);
+ tes.addVertexWithUV(x + 3, y + 4, z + 7, maxU, minV);
+ tes.addVertexWithUV(x - 3, y + 4, z + 7, minU, minV);
+ tes.addVertexWithUV(x - 3, y, z + 7, minU, maxV);
+ tes.addVertexWithUV(x - 3, y, z + 7, minU, maxV);
+ tes.addVertexWithUV(x - 3, y + 4, z + 7, minU, minV);
+ tes.addVertexWithUV(x + 3, y + 4, z + 7, maxU, minV);
+ tes.addVertexWithUV(x + 3, y, z + 7, maxU, maxV);
+ }
+ case 1 -> {
+ tes.addVertexWithUV(x + 7, y, z + 4, maxU, maxV);
+ tes.addVertexWithUV(x + 7, y + 4, z + 4, maxU, minV);
+ tes.addVertexWithUV(x + 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x + 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x + 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x + 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x + 7, y + 4, z + 4, maxU, minV);
+ tes.addVertexWithUV(x + 7, y, z + 4, maxU, maxV);
+ }
+ case 2 -> {
+ tes.addVertexWithUV(x + 3, y, z - 7, maxU, maxV);
+ tes.addVertexWithUV(x + 3, y + 4, z - 7, maxU, minV);
+ tes.addVertexWithUV(x - 3, y + 4, z - 7, minU, minV);
+ tes.addVertexWithUV(x - 3, y, z - 7, minU, maxV);
+ tes.addVertexWithUV(x - 3, y, z - 7, minU, maxV);
+ tes.addVertexWithUV(x - 3, y + 4, z - 7, minU, minV);
+ tes.addVertexWithUV(x + 3, y + 4, z - 7, maxU, minV);
+ tes.addVertexWithUV(x + 3, y, z - 7, maxU, maxV);
+ }
+ case 3 -> {
+ tes.addVertexWithUV(x - 7, y, z + 4, maxU, maxV);
+ tes.addVertexWithUV(x - 7, y + 4, z + 4, maxU, minV);
+ tes.addVertexWithUV(x - 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x - 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x - 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x - 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x - 7, y + 4, z + 4, maxU, minV);
+ tes.addVertexWithUV(x - 7, y, z + 4, maxU, maxV);
+ }
+ case 4 -> {
+ tes.addVertexWithUV(x - 3, y, z + 7, maxU, maxV);
+ tes.addVertexWithUV(x - 3, y + 4, z + 7, maxU, minV);
+ tes.addVertexWithUV(x - 7, y + 4, z + 4, minU, minV);
+ tes.addVertexWithUV(x - 7, y, z + 4, minU, maxV);
+ tes.addVertexWithUV(x - 7, y, z + 4, minU, maxV);
+ tes.addVertexWithUV(x - 7, y + 4, z + 4, minU, minV);
+ tes.addVertexWithUV(x - 3, y + 4, z + 7, maxU, minV);
+ tes.addVertexWithUV(x - 3, y, z + 7, maxU, maxV);
+ }
+ case 5 -> {
+ tes.addVertexWithUV(x - 3, y, z - 7, maxU, maxV);
+ tes.addVertexWithUV(x - 3, y + 4, z - 7, maxU, minV);
+ tes.addVertexWithUV(x - 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x - 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x - 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x - 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x - 3, y + 4, z - 7, maxU, minV);
+ tes.addVertexWithUV(x - 3, y, z - 7, maxU, maxV);
+ }
+ case 6 -> {
+ tes.addVertexWithUV(x + 3, y, z + 7, maxU, maxV);
+ tes.addVertexWithUV(x + 3, y + 4, z + 7, maxU, minV);
+ tes.addVertexWithUV(x + 7, y + 4, z + 4, minU, minV);
+ tes.addVertexWithUV(x + 7, y, z + 4, minU, maxV);
+ tes.addVertexWithUV(x + 7, y, z + 4, minU, maxV);
+ tes.addVertexWithUV(x + 7, y + 4, z + 4, minU, minV);
+ tes.addVertexWithUV(x + 3, y + 4, z + 7, maxU, minV);
+ tes.addVertexWithUV(x + 3, y, z + 7, maxU, maxV);
+ }
+ case 7 -> {
+ tes.addVertexWithUV(x + 3, y, z - 7, maxU, maxV);
+ tes.addVertexWithUV(x + 3, y + 4, z - 7, maxU, minV);
+ tes.addVertexWithUV(x + 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x + 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x + 7, y, z - 4, minU, maxV);
+ tes.addVertexWithUV(x + 7, y + 4, z - 4, minU, minV);
+ tes.addVertexWithUV(x + 3, y + 4, z - 7, maxU, minV);
+ tes.addVertexWithUV(x + 3, y, z - 7, maxU, maxV);
+ }
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public boolean renderInWorld(IBlockAccess aWorld, int x, int y, int z, Block block, RenderBlocks renderer) {
+ Tessellator tes = Tessellator.instance;
+ IIcon forceField = TexturesGtBlock.ForceField.getIcon();
+ if (getBaseMetaTileEntity().isActive()) {
+ double minU = forceField.getMinU();
+ double maxU = forceField.getMaxU();
+ double minV = forceField.getMinV();
+ double maxV = forceField.getMaxV();
+ double xBaseOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetX;
+ double zBaseOffset = 3 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
+ tes.setColorOpaque_F(1f, 1f, 1f);
+ tes.setBrightness(15728880);
+ //Center O: 0, 0 1 ------- 8
+ //Corner 1: 7, -2 / \
+ //Corner 2: 3, -6 2 / \ 7
+ //Corner 3: -2, -6 | |
+ //Corner 4: -6, -2 | O |
+ //Corner 5: -6, 3 | |
+ //Corner 6: -2, 7 3 \ / 6
+ //Corner 7: 3, 7 \ /
+ //Corner 8: 7, 3 4 ------- 5
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 0, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 1, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 2, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 3, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 4, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 5, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 6, minU, maxU, minV, maxV);
+ renderForceField(x + xBaseOffset + 0.5, y, z + zBaseOffset + 0.5, 7, minU, maxU, minV, maxV);
+ }
+ // Needs to be false to render the controller
+ return false;
+ //spotless:on
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Refinery.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Refinery.java
new file mode 100644
index 0000000000..8a6564858e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_Refinery.java
@@ -0,0 +1,220 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.filterByMTETier;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMetaTileEntity_Refinery extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_Refinery>
+ implements ISurvivalConstructable {
+
+ private int mCasing;
+ private static IStructureDefinition<GregtechMetaTileEntity_Refinery> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_Refinery(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_Refinery(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Fuel Refinery";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Fission Fuel Processing Unit")
+ .addInfo("Refines fluorides and Uranium into nuclear fuel for the LFTR")
+ .addInfo("LFTR Fuel 2 and Fuel 3 have alternative, much more efficient recipes")
+ .addInfo("However, they require fission breeding outputs from the LFTR itself")
+ .addInfo("Only one Energy Hatch is allowed per Processing Unit")
+ .addInfo("All recipe times in this multi are very long, watch out!")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 9, 3, false)
+ .addController("Bottom Center")
+ .addCasingInfoMin("Hastelloy-X Structural Block", 7, false)
+ .addCasingInfoMin("Incoloy-DS Fluid Containment Block", 5, false)
+ .addCasingInfoMin("Zeron-100 Reactor Shielding", 4, false)
+ .addCasingInfoMin("Hastelloy-N Sealant Blocks", 17, false)
+ .addInputHatch("Base platform", 1)
+ .addOutputHatch("Base platform", 1)
+ .addMufflerHatch("Base platform", 1)
+ .addMaintenanceHatch("Base platform", 1)
+ .addEnergyHatch("Base platform", 1)
+ .addStructureInfo("Muffler's Tier must be IV+")
+ .addStructureInfo("2-4x Input Hatches, 1-2x Output Hatches")
+ .addStructureInfo("1x Muffler, 1x Maintenance Hatch, 1x Energy Hatch")
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_ACTIVE;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return TAE.GTPP_INDEX(18);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.fissionFuelProcessingRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic();
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public boolean addMufflerToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler
+ && ((GT_MetaTileEntity_Hatch_Muffler) aMetaTileEntity).mTier >= 5) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_Refinery> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_Refinery>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] { { " ", " N ", " " }, { " N ", "NIN", " N " }, { " N ", "NIN", " N " },
+ { " N ", "NIN", " N " }, { " Z ", "ZIZ", " Z " }, { " N ", "NIN", " N " },
+ { "XXX", "XXX", "XXX" }, { "X~X", "XXX", "XXX" }, }))
+ .addElement(
+ 'X',
+ ofChain(
+ buildHatchAdder(GregtechMetaTileEntity_Refinery.class)
+ .atLeast(Energy, Maintenance, OutputHatch, OutputBus, InputHatch)
+ .casingIndex(TAE.GTPP_INDEX(18))
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMetaTileEntity_Refinery.class).atLeast(Muffler)
+ .adder(GregtechMetaTileEntity_Refinery::addMufflerToMachineList)
+ .hatchItemFilterAnd(t -> filterByMTETier(6, Integer.MAX_VALUE))
+ .casingIndex(TAE.GTPP_INDEX(18))
+ .dot(1)
+ .build(),
+ onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 2))))
+ .addElement('I', ofBlock(ModBlocks.blockCasings2Misc, 3))
+ .addElement('N', ofBlock(ModBlocks.blockCasings2Misc, 1))
+ .addElement('Z', ofBlock(ModBlocks.blockCasingsMisc, 13))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 1, 7, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 1, 7, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ if (checkPiece(mName, 1, 7, 0) && mCasing >= 7) {
+ if (this.mInputHatches.size() >= 2 && this.mInputHatches.size() <= 4
+ && this.mOutputHatches.size() >= 1
+ && this.mOutputHatches.size() <= 2
+ && this.mMufflerHatches.size() == 1
+ && this.mMaintenanceHatches.size() == 1
+ && this.mEnergyHatches.size() == 1) {
+ this.resetRecipeMapForAllInputHatches(this.getRecipeMap());
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(final ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiRefinery;
+ }
+
+ @Override
+ public int getDamageToComponent(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_Refinery(this.mName);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_SolarTower.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_SolarTower.java
new file mode 100644
index 0000000000..0395ab5a01
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/GregtechMetaTileEntity_SolarTower.java
@@ -0,0 +1,675 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.tileentities.misc.TileEntitySolarHeater;
+
+public class GregtechMetaTileEntity_SolarTower extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_SolarTower>
+ implements ISurvivalConstructable {
+
+ // 862
+ private static final int mCasingTextureID = TAE.getIndexFromPage(3, 9);
+ private int mHeatLevel = 0;
+ private int mCasing1;
+ private int mCasing2;
+ private int mCasing3;
+ private int mCasing4;
+
+ public ArrayList<TileEntitySolarHeater> mSolarHeaters = new ArrayList<>();
+
+ public GregtechMetaTileEntity_SolarTower(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_SolarTower(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_SolarTower(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Solar Tower";
+ }
+
+ @Override
+ protected final GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Contributing Green Energy towards the future")
+ .addInfo("Surround with rings of Solar Reflectors")
+ .addInfo("The Reflectors increase the internal heat value of the Tower (see below for formula)")
+ .addInfo("Each Reflector ring increases tier, the first ring is required for the Tower to work")
+ .addInfo("Input: " + MISC_MATERIALS.SOLAR_SALT_COLD.getLocalizedName())
+ .addInfo("Output: " + MISC_MATERIALS.SOLAR_SALT_HOT.getLocalizedName())
+ .addInfo("Every cycle (10 seconds), heat increases and all the Cold Solar Salt is heated")
+ .addInfo("Converting Cold to Hot Solar Salt reduces heat, equal to the amount converted")
+ .addInfo("This conversion only happens if heat >= 30000 and controller efficiency = 100%")
+ .addInfo("If there's more Cold Salt than heat, all the heat is used up and returns to 0")
+ .addInfo("The heat increase is most efficient at exactly half of maximum heat")
+ .addInfo("Minimum efficiency at 0 or 100000 heat, maximum efficiency at 50000")
+ .addInfo("Heat Efficiency formula: ( 7000 - [|currentHeat - 50000| ^ 0.8]) / 7000")
+ .addInfo("Heat gain per cycle: numberHeaters * heatEfficiency * (10 + bonus)")
+ .addInfo("Bonus: 1 ring = +1, 2 rings = +2, 3 rings = +4, 4 rings = +8, 5 rings = +16")
+ .addInfo("Total number of reflectors based on how many rings are built:")
+ .addInfo("1 ring = 36, 2 rings = 88, 3 rings = 156, 4 rings = 240, 5 rings = 340")
+ .addSeparator()
+ .beginVariableStructureBlock(15, 31, 28, 28, 15, 31, false)
+ .addController("Top Middle")
+ .addCasingInfoMin("Structural Solar Casing", 229, false)
+ .addCasingInfoMin("Thermally Insulated Casing", 60, false)
+ .addCasingInfoMin("Salt Containment Casing", 66, false)
+ .addCasingInfoMin("Thermal Containment Casing", 60, false)
+ .addInputHatch("Any 2 dot hint(min 1)", 2)
+ .addOutputHatch("Any 2 dot hint(min 1)", 2)
+ .addMaintenanceHatch("Any 2 dot hint", 2)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ private static final String STRUCTURE_PIECE_BASE = "base";
+ private static final String STRUCTURE_PIECE_TOWER = "tower";
+ private static final String STRUCTURE_PIECE_TOP = "top";
+
+ private static final String[] STRUCTURE_PIECE_SOLAR_HEATER_RING = { "ring1", "ring2", "ring3", "ring4", "ring5" };
+ private static final String SOLAR_HEATER_RING_1 = STRUCTURE_PIECE_SOLAR_HEATER_RING[0];
+ private static final String SOLAR_HEATER_RING_2 = STRUCTURE_PIECE_SOLAR_HEATER_RING[1];
+ private static final String SOLAR_HEATER_RING_3 = STRUCTURE_PIECE_SOLAR_HEATER_RING[2];
+ private static final String SOLAR_HEATER_RING_4 = STRUCTURE_PIECE_SOLAR_HEATER_RING[3];
+ private static final String SOLAR_HEATER_RING_5 = STRUCTURE_PIECE_SOLAR_HEATER_RING[4];
+
+ private static final ClassValue<IStructureDefinition<GregtechMetaTileEntity_SolarTower>> STRUCTURE_DEFINITION = new ClassValue<>() {
+
+ @Override
+ protected IStructureDefinition<GregtechMetaTileEntity_SolarTower> computeValue(Class<?> type) {
+ return StructureDefinition.<GregtechMetaTileEntity_SolarTower>builder()
+
+ // s = salt
+ // c = thermal containment
+ // i = thermal insulated
+ // t = solar structural
+ // h = hatch
+ // g = solar heater
+
+ .addShape(
+ STRUCTURE_PIECE_TOP,
+ (new String[][] { { " ", " ", " ~ ", " ", " " },
+ { " ", " s ", " sss ", " s ", " " },
+ { " c ", " ccc ", "ccscc", " ccc ", " c " },
+ { " c ", " ccc ", "ccscc", " ccc ", " c " },
+ { " c ", " ccc ", "ccscc", " ccc ", " c " },
+ { " c ", " ccc ", "ccscc", " ccc ", " c " },
+ { " c ", " ccc ", "ccscc", " ccc ", " c " }, }))
+ .addShape(
+ STRUCTURE_PIECE_TOWER,
+ (new String[][] { { " i ", "isi", " i " }, { " i ", "isi", " i " }, { " i ", "isi", " i " },
+ { " i ", "isi", " i " }, { " i ", "isi", " i " }, { " i ", "isi", " i " },
+ { " i ", "isi", " i " }, { " i ", "isi", " i " }, { " i ", "isi", " i " },
+ { " i ", "isi", " i " }, { " i ", "isi", " i " }, { " i ", "isi", " i " },
+ { " i ", "isi", " i " }, { " i ", "isi", " i " }, { " i ", "isi", " i " }, }))
+ .addShape(
+ STRUCTURE_PIECE_BASE,
+ (new String[][] {
+ { " ", " ", " t ", " ttt ", " ttstt ", " ttssstt ",
+ " ttstt ", " ttt ", " t ", " ", " " },
+ { " ", " ", " t ", " ttt ", " tssst ", " ttssstt ",
+ " tssst ", " ttt ", " t ", " ", " " },
+ { " ", " t ", " ttt ", " ttttt ", " ttssstt ", " tttsssttt ",
+ " ttssstt ", " ttttt ", " ttt ", " t ", " " },
+ { " ", " t ", " ttt ", " ttttt ", " ttssstt ", " tttsssttt ",
+ " ttssstt ", " ttttt ", " ttt ", " t ", " " },
+ { " hhh ", " ttttt ", " ttttttt ", " ttttttttt ", "htttsssttth", "htttsssttth",
+ "htttsssttth", " ttttttttt ", " ttttttt ", " ttttt ", " hhh " },
+ { " hhh ", " ttttt ", " ttttttt ", " ttttttttt ", "httttttttth", "httttttttth",
+ "httttttttth", " ttttttttt ", " ttttttt ", " ttttt ", " hhh " }, }))
+ .addShape(
+ SOLAR_HEATER_RING_1,
+ (new String[][] { { " ggggg ", " g g ", " g g ", " g g ",
+ " g g ", "g g", "g g", "g g", "g g",
+ "g g", " g g ", " g g ", " g g ", " g g ",
+ " ggggg ", } }))
+ .addShape(
+ SOLAR_HEATER_RING_2,
+ (new String[][] {
+ { " ggggggggg ", " g g ", " g g ", " g g ",
+ " g g ", "g g", "g g", "g g",
+ "g g", "g g", "g g", "g g",
+ "g g", "g g", " g g ", " g g ",
+ " g g ", " g g ", " ggggggggg ", } }))
+ .addShape(
+ SOLAR_HEATER_RING_3,
+ (new String[][] { { " ggggggggggggg ", " g g ", " g g ",
+ " g g ", " g g ", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ " g g ", " g g ", " g g ",
+ " g g ", " ggggggggggggg ", } }))
+ .addShape(
+ SOLAR_HEATER_RING_4,
+ (new String[][] { { " ggggggggggggggggg ", " g g ",
+ " g g ", " g g ", " g g ",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", "g g",
+ "g g", "g g", " g g ",
+ " g g ", " g g ", " g g ",
+ " ggggggggggggggggg ", } }))
+ .addShape(
+ SOLAR_HEATER_RING_5,
+ (new String[][] { { " ggggggggggggggggggggg ", " g g ",
+ " g g ", " g g ",
+ " g g ", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ "g g", "g g",
+ " g g ", " g g ",
+ " g g ", " g g ",
+ " ggggggggggggggggggggg ", } }))
+ .addElement(
+ 'g',
+ lazy(
+ t -> buildHatchAdder(GregtechMetaTileEntity_SolarTower.class)
+ .hatchClass(TileEntitySolarHeater.class)
+ .adder(GregtechMetaTileEntity_SolarTower::addSolarHeater)
+ // Use a positive casing index to make adder builder happy
+ .casingIndex(1)
+ .dot(1)
+ .continueIfSuccess()
+ .build()))
+ .addElement(
+ 't',
+ lazy(t -> onElementPass(x -> ++x.mCasing1, ofBlock(t.getCasingBlock(), t.getCasingMeta()))))
+ .addElement(
+ 'i',
+ lazy(t -> onElementPass(x -> ++x.mCasing2, ofBlock(t.getCasingBlock(), t.getCasingMeta2()))))
+ .addElement(
+ 's',
+ lazy(t -> onElementPass(x -> ++x.mCasing3, ofBlock(t.getCasingBlock(), t.getCasingMeta3()))))
+ .addElement(
+ 'c',
+ lazy(t -> onElementPass(x -> ++x.mCasing4, ofBlock(t.getCasingBlock2(), t.getCasingMeta4()))))
+ .addElement(
+ 'h',
+ lazy(
+ t -> buildHatchAdder(GregtechMetaTileEntity_SolarTower.class)
+ .atLeast(InputHatch, OutputHatch, Maintenance)
+ .casingIndex(t.getCasingTextureIndex())
+ .dot(2)
+ .buildAndChain(
+ onElementPass(x -> ++x.mCasing1, ofBlock(t.getCasingBlock(), t.getCasingMeta())))))
+ .build();
+ }
+ };
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ resetSolarHeaters();
+ this.mMaintenanceHatches.clear();
+ this.mInputHatches.clear();
+ this.mOutputHatches.clear();
+ mCasing1 = 0;
+ mCasing2 = 0;
+ mCasing3 = 0;
+ mCasing4 = 0;
+
+ boolean aStructureTop = checkPiece(STRUCTURE_PIECE_TOP, 2, 2, 0);
+ log("Top Check: " + aStructureTop);
+ boolean aStructureTower = checkPiece(STRUCTURE_PIECE_TOWER, 1, 1, -7);
+ log("Tower Check: " + aStructureTower);
+ boolean aStructureBase = checkPiece(STRUCTURE_PIECE_BASE, 5, 5, -22);
+ log("Base Check: " + aStructureBase);
+ boolean aCasingCount1 = mCasing1 >= 229;
+ boolean aCasingCount2 = mCasing2 == 60;
+ boolean aCasingCount3 = mCasing3 == 66;
+ boolean aCasingCount4 = mCasing4 == 60;
+ boolean aAllStructure = aStructureTop && aStructureTower && aStructureBase;
+ boolean aAllCasings = aCasingCount1 && aCasingCount2 && aCasingCount3 && aCasingCount4;
+ if (!aAllCasings || !aAllStructure
+ || mMaintenanceHatches.size() != 1
+ || mInputHatches.size() < 1
+ || mOutputHatches.size() < 1) {
+ log(
+ "Bad Hatches - Solar Heaters: " + mSolarHeaters.size()
+ + ", Maint: "
+ + mMaintenanceHatches.size()
+ + ", Input Hatches: "
+ + mInputHatches.size()
+ + ", Output Hatches: "
+ + mOutputHatches.size()
+ + ", Top: "
+ + aStructureTop
+ + ", Tower: "
+ + aStructureTower
+ + ", Base: "
+ + aStructureBase
+ + ", Casing Count: "
+ + aCasingCount1
+ + " | Found: "
+ + mCasing1
+ + ", Casing Count: "
+ + aCasingCount2
+ + " | Found: "
+ + mCasing2
+ + ", Casing Count: "
+ + aCasingCount3
+ + " | Found: "
+ + mCasing3
+ + ", Casing Count: "
+ + aCasingCount4
+ + " | Found: "
+ + mCasing4);
+ return false;
+ }
+ log(
+ "Built " + this.getLocalName()
+ + " with "
+ + mCasing1
+ + " Structural Solar casings, "
+ + mCasing2
+ + " Thermally Insulated casings, "
+ + mCasing3
+ + " Salt Containment casings, "
+ + mCasing4
+ + " Thermal Containment casings.");
+ return aAllCasings && aAllStructure;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ // Tower
+ buildPiece(STRUCTURE_PIECE_TOP, stackSize, hintsOnly, 2, 2, 0);
+ buildPiece(STRUCTURE_PIECE_TOWER, stackSize, hintsOnly, 1, 1, -7);
+ buildPiece(STRUCTURE_PIECE_BASE, stackSize, hintsOnly, 5, 5, -22);
+
+ // Solar Heaters
+ if (stackSize.stackSize >= 1) {
+ buildPiece(SOLAR_HEATER_RING_1, stackSize, hintsOnly, 7, 7, -27);
+ if (stackSize.stackSize >= 2) {
+ buildPiece(SOLAR_HEATER_RING_2, stackSize, hintsOnly, 9, 9, -27);
+ if (stackSize.stackSize >= 3) {
+ buildPiece(SOLAR_HEATER_RING_3, stackSize, hintsOnly, 11, 11, -27);
+ if (stackSize.stackSize >= 4) {
+ buildPiece(SOLAR_HEATER_RING_4, stackSize, hintsOnly, 13, 13, -27);
+ if (stackSize.stackSize >= 5) {
+ buildPiece(SOLAR_HEATER_RING_5, stackSize, hintsOnly, 15, 15, -27);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ int built;
+ int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 2);
+ // Tower
+ built = survivialBuildPiece(STRUCTURE_PIECE_TOP, stackSize, 2, 2, 0, realBudget, env, false, true);
+ if (built >= 0) return built;
+ built = survivialBuildPiece(STRUCTURE_PIECE_TOWER, stackSize, 1, 1, -7, realBudget, env, false, true);
+ if (built >= 0) return built;
+ built = survivialBuildPiece(STRUCTURE_PIECE_BASE, stackSize, 5, 5, -22, realBudget, env, false, true);
+ if (built >= 0) return built;
+
+ // Solar Heaters
+ if (stackSize.stackSize < 1) return -1;
+ built = survivialBuildPiece(SOLAR_HEATER_RING_1, stackSize, 7, 7, -27, realBudget, env, false, true);
+ if (built >= 0) return built;
+ if (stackSize.stackSize < 2) return -1;
+ built = survivialBuildPiece(SOLAR_HEATER_RING_2, stackSize, 9, 9, -27, realBudget, env, false, true);
+ if (built >= 0) return built;
+ if (stackSize.stackSize < 3) return -1;
+ built = survivialBuildPiece(SOLAR_HEATER_RING_3, stackSize, 11, 11, -27, realBudget, env, false, true);
+ if (built >= 0) return built;
+ if (stackSize.stackSize < 4) return -1;
+ built = survivialBuildPiece(SOLAR_HEATER_RING_4, stackSize, 13, 13, -27, realBudget, env, false, true);
+ if (built >= 0) return built;
+ if (stackSize.stackSize < 5) return -1;
+ return survivialBuildPiece(SOLAR_HEATER_RING_5, stackSize, 15, 15, -27, realBudget, env, false, true);
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_SolarTower> getStructureDefinition() {
+ return STRUCTURE_DEFINITION.get(getClass());
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_MAGNETIZER_LOOP;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == ForgeDirection.DOWN || side == ForgeDirection.UP) {
+ if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)),
+ TextureFactory.builder()
+ .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Default_Active)
+ .extFacing()
+ .build() };
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)),
+ TextureFactory.builder()
+ .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Default)
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(12)) };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ // Only for visual
+ return GTPPRecipeMaps.solarTowerRecipes;
+ }
+
+ private int getHeaterTier() {
+ int aSolarHeaterCounter = this.mSolarHeaters.size();
+ if (aSolarHeaterCounter > 0) {
+ if (aSolarHeaterCounter == 36) {
+ return 1;
+ } else if (aSolarHeaterCounter == 88) {
+ return 2;
+ } else if (aSolarHeaterCounter == 156) {
+ return 4;
+ } else if (aSolarHeaterCounter == 240) {
+ return 8;
+ } else if (aSolarHeaterCounter == 340) {
+ return 16;
+ }
+ }
+ return 0;
+ }
+
+ private int getHeaterCountForTier(int aTier) {
+ return switch (aTier) {
+ case 1 -> 36;
+ case 2 -> 88;
+ case 4 -> 156;
+ case 8 -> 240;
+ case 16 -> 340;
+ default -> 0;
+ };
+ }
+
+ public boolean getConnectedSolarReflectors() {
+
+ resetSolarHeaters();
+ int aRing = 1;
+
+ if (this.mSolarHeaters.size() < 36) {
+ // 15x15
+ boolean aRing1 = checkPiece(SOLAR_HEATER_RING_1, 7, 7, -27);
+ if (aRing1) {
+ // log("Found Ring: "+(aRing++)+", Total: "+this.mSolarHeaters.size());
+ }
+ }
+ if (this.mSolarHeaters.size() < 88) {
+ // 17x17
+ boolean aRing2 = checkPiece(SOLAR_HEATER_RING_2, 9, 9, -27);
+ if (aRing2) {
+ // log("Found Ring: "+(aRing++)+", Total: "+this.mSolarHeaters.size());
+ }
+ }
+ if (this.mSolarHeaters.size() < 156) {
+ // 19x19
+ boolean aRing3 = checkPiece(SOLAR_HEATER_RING_3, 11, 11, -27);
+ if (aRing3) {
+ // log("Found Ring: "+(aRing++)+", Total: "+this.mSolarHeaters.size());
+ }
+ }
+ if (this.mSolarHeaters.size() < 240) {
+ // 21x21
+ boolean aRing4 = checkPiece(SOLAR_HEATER_RING_4, 13, 13, -27);
+ if (aRing4) {
+ // log("Found Ring: "+(aRing++)+", Total: "+this.mSolarHeaters.size());
+ }
+ }
+ if (this.mSolarHeaters.size() < 340) {
+ // 23x23
+ boolean aRing5 = checkPiece(SOLAR_HEATER_RING_5, 15, 15, -27);
+ if (aRing5) {
+ // log("Found Ring: "+(aRing++)+", Total: "+this.mSolarHeaters.size());
+ }
+ }
+ return mSolarHeaters.size() > 0;
+ }
+
+ private boolean addSolarHeater(IGregTechTileEntity aTileEntity, int a) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof TileEntitySolarHeater mTile) {
+ if (!mTile.hasSolarTower() && mTile.canSeeSky()) {
+ // Logger.INFO("Found Solar Reflector, Injecting Data.");
+ mTile.setSolarTower(this);
+ return this.mSolarHeaters.add(mTile);
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d == ForgeDirection.UP;
+ }
+
+ private Fluid mColdSalt = null;
+ private Fluid mHotSalt = null;
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ this.mEfficiencyIncrease = 100;
+ this.mMaxProgresstime = 200;
+
+ if (this.mSolarHeaters.isEmpty() || this.mSolarHeaters.size() < 340
+ || this.getTotalRuntimeInTicks() % 200 == 0) {
+ getConnectedSolarReflectors();
+ }
+
+ int aTier = getHeaterTier();
+ int aHeaters = getHeaterCountForTier(aTier);
+
+ // Original formula was (-Math.pow(this.mHeatLevel - 50000, 0.8) + 7000) / 7000
+ // However, negative numbers to the power of a non-integer result in NaN, by default
+ // Max efficiency is 1, at mHeatLevel = 50000, and it lowers at the same rate if going above or below this heat
+ // Min efficiency is 0.179, at mHeatLevel = 0 or 100000
+ double aEfficiency = (-Math.pow(Math.abs(this.mHeatLevel - 50000), 0.8) + 7000) / 7000;
+
+ World w = this.getBaseMetaTileEntity()
+ .getWorld();
+
+ // Manage Heat every 10s
+ // Add Heat First, if sources available and it's daytime, heat gain is halved if raining
+ if (w != null) {
+ if (aHeaters > 0 && w.isDaytime()) {
+ if (w.isRaining() && this.getBaseMetaTileEntity()
+ .getBiome().rainfall > 0.0F) {
+ this.mHeatLevel += GT_Utility.safeInt((long) ((aHeaters / 2) * aEfficiency * (10 + aTier)));
+ } else {
+ this.mHeatLevel += GT_Utility.safeInt((long) (aHeaters * aEfficiency * (10 + aTier)));
+ }
+ }
+
+ // Remove Heat, based on time of day
+ if (mHeatLevel > 0) {
+ if (mHeatLevel > 100000) {
+ this.mHeatLevel = 100000;
+ } else {
+ this.mHeatLevel -= 10;
+ }
+ }
+ }
+
+ if (this.mEfficiency == this.getMaxEfficiency(null) && this.mHeatLevel >= 30000) {
+ if (mColdSalt == null) {
+ mColdSalt = MISC_MATERIALS.SOLAR_SALT_COLD.getFluid();
+ }
+ if (mHotSalt == null) {
+ mHotSalt = MISC_MATERIALS.SOLAR_SALT_HOT.getFluid();
+ }
+ ArrayList<FluidStack> aFluids = this.getStoredFluids();
+ for (FluidStack aFluid : aFluids) {
+ if (aFluid.getFluid()
+ .equals(mColdSalt)) {
+ int aFluidAmount = Math.min(aFluid.amount, this.mHeatLevel);
+
+ this.mHeatLevel -= aFluidAmount;
+ this.depleteInput(FluidUtils.getFluidStack(mColdSalt, aFluidAmount));
+ this.addOutput(FluidUtils.getFluidStack(mHotSalt, aFluidAmount));
+ this.mHeatLevel = Math.max(this.mHeatLevel, 0);
+
+ break;
+ }
+ }
+ }
+
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerTick(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockSpecialMultiCasings;
+ }
+
+ public Block getCasingBlock2() {
+ return ModBlocks.blockCasings2Misc;
+ }
+
+ public byte getCasingMeta() {
+ return 6;
+ }
+
+ public byte getCasingMeta2() {
+ return 8;
+ }
+
+ public byte getCasingMeta3() {
+ return 7;
+ }
+
+ public byte getCasingMeta4() {
+ return 11;
+ }
+
+ public byte getCasingTextureIndex() {
+ return (byte) mCasingTextureID;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {}
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mHeatLevel", mHeatLevel);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mHeatLevel = aNBT.getInteger("mHeatLevel");
+ }
+
+ @Override
+ public void onRemoval() {
+ resetSolarHeaters();
+ super.onRemoval();
+ }
+
+ private void resetSolarHeaters() {
+ for (TileEntitySolarHeater aTile : this.mSolarHeaters) {
+ aTile.clearSolarTower();
+ }
+ this.mSolarHeaters.clear();
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ return new String[] { "Internal Heat Level: " + this.mHeatLevel,
+ "Connected Solar Reflectors: " + this.mSolarHeaters.size() };
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/algae/GregtechMTE_AlgaePondBase.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/algae/GregtechMTE_AlgaePondBase.java
new file mode 100644
index 0000000000..8a3442b5e7
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/algae/GregtechMTE_AlgaePondBase.java
@@ -0,0 +1,376 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.algae;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TAE;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_StreamUtil;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.loaders.recipe.RecipeLoader_AlgaeFarm;
+import ic2.core.init.BlocksItems;
+import ic2.core.init.InternalName;
+
+public class GregtechMTE_AlgaePondBase extends GregtechMeta_MultiBlockBase<GregtechMTE_AlgaePondBase>
+ implements ISurvivalConstructable {
+
+ private int mLevel = -1;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMTE_AlgaePondBase> STRUCTURE_DEFINITION = null;
+ private int checkMeta;
+ private int minTierOfHatch;
+ private static final Class<?> cofhWater;
+
+ static {
+ cofhWater = ReflectionUtils.getClass("cofh.asmhooks.block.BlockWater");
+ }
+
+ public GregtechMTE_AlgaePondBase(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMTE_AlgaePondBase(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMTE_AlgaePondBase(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Algae Pond";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Grows Algae!")
+ .addInfo("Controller Block for the Algae Farm")
+ .addInfo("Provide compost to boost production by one tier")
+ .addInfo("Does not require power or maintenance")
+ .addInfo("All Machine Casings must be the same tier, this dictates machine speed.")
+ .addInfo("All Buses/Hatches must, at least, match the tier of the Casings")
+ .addInfo("Fill Input Hatch with Water to fill the inside of the multiblock.")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(9, 3, 9, true)
+ .addController("Front Center")
+ .addCasingInfoMin("Machine Casings", 64, true)
+ .addCasingInfoMin("Sterile Farm Casings", 64, false)
+ .addInputBus("Any Casing", 1)
+ .addOutputBus("Any Casing", 1)
+ .addInputHatch("Any Casing", 1)
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ public void setMeta(int meta) {
+ checkMeta = meta;
+ }
+
+ public int getMeta() {
+ return checkMeta;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMTE_AlgaePondBase> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMTE_AlgaePondBase>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] {
+ { "XXXXXXXXX", "X X", "X X", "X X", "X X", "X X", "X X",
+ "X X", "XXXXXXXXX" },
+ { "XXXXXXXXX", "X X", "X X", "X X", "X X", "X X", "X X",
+ "X X", "XXXXXXXXX" },
+ { "CCCC~CCCC", "CCCCCCCCC", "CCCCCCCCC", "CCCCCCCCC", "CCCCCCCCC", "CCCCCCCCC", "CCCCCCCCC",
+ "CCCCCCCCC", "CCCCCCCCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMTE_AlgaePondBase.class).atLeast(InputHatch, InputBus, OutputBus)
+ .casingIndex(TAE.getIndexFromPage(1, 15))
+ .dot(1)
+ .build(),
+ onElementPass(
+ x -> ++x.mCasing,
+ addTieredBlock(
+ GregTech_API.sBlockCasings1,
+ GregtechMTE_AlgaePondBase::setMeta,
+ GregtechMTE_AlgaePondBase::getMeta,
+ 10))))
+ .addElement('X', ofBlock(ModBlocks.blockCasings2Misc, 15))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 4, 2, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 4, 2, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mLevel = 0;
+ checkMeta = 0;
+ minTierOfHatch = 100;
+ if (checkPiece(mName, 4, 2, 0) && mCasing >= 64 && checkMeta > 0) {
+ mLevel = checkMeta - 1;
+ return mLevel <= minTierOfHatch;
+ }
+ return false;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d.offsetY == 0 && r.isNotRotated() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Default;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ int aID = TAE.getIndexFromPage(1, 15);
+ if (mLevel > -1) {
+ aID = mLevel;
+ }
+ return aID;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 2;
+ }
+
+ public boolean checkForWater() {
+
+ // Get Facing direction
+ IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity();
+ int mDirectionX = aBaseMetaTileEntity.getBackFacing().offsetX;
+ int mCurrentDirectionX;
+ int mCurrentDirectionZ;
+ int mOffsetX_Lower = 0;
+ int mOffsetX_Upper = 0;
+ int mOffsetZ_Lower = 0;
+ int mOffsetZ_Upper = 0;
+
+ mCurrentDirectionX = 4;
+ mCurrentDirectionZ = 4;
+
+ mOffsetX_Lower = -4;
+ mOffsetX_Upper = 4;
+ mOffsetZ_Lower = -4;
+ mOffsetZ_Upper = 4;
+
+ // if (aBaseMetaTileEntity.fac)
+
+ final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX * mCurrentDirectionX;
+ final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ * mCurrentDirectionZ;
+
+ int tAmount = 0;
+ for (int i = mOffsetX_Lower + 1; i <= mOffsetX_Upper - 1; ++i) {
+ for (int j = mOffsetZ_Lower + 1; j <= mOffsetZ_Upper - 1; ++j) {
+ for (int h = 0; h < 2; h++) {
+ Block tBlock = aBaseMetaTileEntity.getBlockOffset(xDir + i, h, zDir + j);
+ byte tMeta = aBaseMetaTileEntity.getMetaIDOffset(xDir + i, h, zDir + j);
+ if (isNotStaticWater(tBlock, tMeta)) {
+ if (this.getStoredFluids() != null) {
+ for (FluidStack stored : this.getStoredFluids()) {
+ if (stored.isFluidEqual(FluidUtils.getFluidStack("water", 1))) {
+ if (stored.amount >= 1000) {
+ // Utils.LOG_WARNING("Going to try swap an air block for water from inut bus.");
+ stored.amount -= 1000;
+ Block fluidUsed = Blocks.water;
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(
+ aBaseMetaTileEntity.getXCoord() + xDir + i,
+ aBaseMetaTileEntity.getYCoord() + h,
+ aBaseMetaTileEntity.getZCoord() + zDir + j,
+ fluidUsed);
+ }
+ }
+ }
+ }
+ }
+ tBlock = aBaseMetaTileEntity.getBlockOffset(xDir + i, h, zDir + j);
+ if (tBlock == Blocks.water || tBlock == Blocks.flowing_water) {
+ ++tAmount;
+ // Logger.INFO("Found Water");
+ }
+ }
+ }
+ }
+
+ boolean isValidWater = tAmount >= 49;
+
+ if (isValidWater) {
+ Logger.INFO("Filled structure.");
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private boolean isNotStaticWater(Block block, byte meta) {
+ return block == Blocks.air || block == Blocks.flowing_water
+ || block == BlocksItems.getFluidBlock(InternalName.fluidDistilledWater)
+ || (cofhWater != null && cofhWater.isAssignableFrom(block.getClass()) && meta != 0);
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(final ItemStack aStack) {
+ return CORE.ConfigSwitches.pollutionPerSecondMultiAlgaePond;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ this.fixAllMaintenanceIssue();
+ // Silly Client Syncing
+ if (aBaseMetaTileEntity.isClientSide()) {
+ this.mLevel = getCasingTier();
+ }
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Nonnull
+ @Override
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ return GT_StreamUtil
+ .ofNullable(RecipeLoader_AlgaeFarm.getTieredRecipeFromCache(mLevel, isUsingCompost(inputItems)));
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ if (!checkForWater()) {
+ return SimpleCheckRecipeResult.ofFailure("no_water");
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ }.setEuModifier(0F)
+ .setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ private boolean isUsingCompost(ItemStack[] aItemInputs) {
+ ItemStack aCompost = ItemUtils.getSimpleStack(AgriculturalChem.mCompost, 1);
+ for (ItemStack i : aItemInputs) {
+ if (GT_Utility.areStacksEqual(aCompost, i)) {
+ if (i.stackSize >= RecipeLoader_AlgaeFarm.compostForTier(mLevel)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private int getCasingTier() {
+ if (this.getBaseMetaTileEntity()
+ .getWorld() == null) {
+ return 0;
+ }
+ try {
+ Block aInitStructureCheck;
+ int aInitStructureCheckMeta;
+ IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity();
+ int xDir = aBaseMetaTileEntity.getBackFacing().offsetX;
+ int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ;
+ aInitStructureCheck = aBaseMetaTileEntity.getBlockOffset(xDir, -1, zDir);
+ aInitStructureCheckMeta = aBaseMetaTileEntity.getMetaIDOffset(xDir, -1, zDir);
+ if (aInitStructureCheck == GregTech_API.sBlockCasings1) {
+ return aInitStructureCheckMeta;
+ }
+ return 0;
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return 0;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/chemplant/GregtechMTE_ChemicalPlant.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/chemplant/GregtechMTE_ChemicalPlant.java
new file mode 100644
index 0000000000..30d2f75457
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/chemplant/GregtechMTE_ChemicalPlant.java
@@ -0,0 +1,676 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.chemplant;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.filterByMTETier;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.GregTechTileClientEvents;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.tileentities.machines.IDualInputHatch;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Triplet;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.item.chemistry.general.ItemGenericChemBase;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers.GT_MetaTileEntity_Hatch_Catalysts;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMTE_ChemicalPlant extends GregtechMeta_MultiBlockBase<GregtechMTE_ChemicalPlant>
+ implements ISurvivalConstructable {
+
+ private int mSolidCasingTier = 0;
+ private int mMachineCasingTier = 0;
+ private int mPipeCasingTier = 0;
+ private int mCoilTier = 0;
+ private HeatingCoilLevel checkCoil;
+ private int[] checkCasing = new int[8];
+ private int checkMachine;
+ private int checkPipe;
+ private int maxTierOfHatch;
+ private int mCasing;
+ private static IStructureDefinition<GregtechMTE_ChemicalPlant> STRUCTURE_DEFINITION = null;
+
+ private final ArrayList<GT_MetaTileEntity_Hatch_Catalysts> mCatalystBuses = new ArrayList<>();
+
+ private static final HashMap<Integer, Triplet<Block, Integer, Integer>> mTieredBlockRegistry = new HashMap<>();
+
+ public GregtechMTE_ChemicalPlant(final int aID, final String aName, final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMTE_ChemicalPlant(final String aName) {
+ super(aName);
+ }
+
+ public static boolean registerMachineCasingForTier(int aTier, Block aBlock, int aMeta, int aCasingTextureID) {
+ Triplet<Block, Integer, Integer> aCasingData = new Triplet<>(aBlock, aMeta, aCasingTextureID);
+ if (mTieredBlockRegistry.containsKey(aTier)) {
+ CORE.crash(
+ "Tried to register a Machine casing for tier " + aTier
+ + " to the Chemical Plant, however this tier already contains one.");
+ }
+ mTieredBlockRegistry.put(aTier, aCasingData);
+ return true;
+ }
+
+ private static int getCasingTextureIdForTier(int aTier) {
+ if (!mTieredBlockRegistry.containsKey(aTier)) {
+ return 10;
+ }
+ int aCasingID = mTieredBlockRegistry.get(aTier)
+ .getValue_3();
+ // Logger.INFO("Found casing texture ID "+aCasingID+" for tier "+aTier);
+ return aCasingID;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMTE_ChemicalPlant(this.mName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Chemical Plant";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the Chemical Plant")
+ .addInfo("Heavy Industry, now right at your doorstep!")
+ .addInfo("Please read the user manual for more information on construction and usage")
+ .addSeparator()
+ .addController("Bottom Center")
+ .addStructureHint("Catalyst Housing", 1)
+ .addInputBus("Bottom Casing", 1)
+ .addOutputBus("Bottom Casing", 1)
+ .addInputHatch("Bottom Casing", 1)
+ .addOutputHatch("Bottom Casing", 1)
+ .addEnergyHatch("Bottom Casing", 1)
+ .addMaintenanceHatch("Bottom Casing", 1)
+ .addSubChannelUsage("casing", "metal machine casing")
+ .addSubChannelUsage("machine", "tier machine casing")
+ .addSubChannelUsage("coil", "heating coil blocks")
+ .addSubChannelUsage("pipe", "pipe casing blocks")
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ public void setMachineMeta(int meta) {
+ checkMachine = meta;
+ }
+
+ public int getMachineMeta() {
+ return checkMachine;
+ }
+
+ public void setPipeMeta(int meta) {
+ checkPipe = meta;
+ }
+
+ public int getPipeMeta() {
+ return checkPipe;
+ }
+
+ public void setCoilMeta(HeatingCoilLevel meta) {
+ checkCoil = meta;
+ }
+
+ public HeatingCoilLevel getCoilMeta() {
+ return checkCoil;
+ }
+
+ @Override
+ public IStructureDefinition<GregtechMTE_ChemicalPlant> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ IStructureElement<GregtechMTE_ChemicalPlant> allCasingsElement = withChannel(
+ "casing",
+ ofChain(
+ IntStream.range(0, 8)
+ .mapToObj(GregtechMTE_ChemicalPlant::ofSolidCasing)
+ .collect(Collectors.toList())));
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMTE_ChemicalPlant>builder()
+ .addShape(
+ mName,
+ transpose(
+ new String[][] {
+ { "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX" },
+ { "X X", " MMMMM ", " MHHHM ", " MHHHM ", " MHHHM ", " MMMMM ", "X X" },
+ { "X X", " ", " PPP ", " PPP ", " PPP ", " ", "X X" },
+ { "X X", " ", " HHH ", " HHH ", " HHH ", " ", "X X" },
+ { "X X", " ", " PPP ", " PPP ", " PPP ", " ", "X X" },
+ { "X X", " MMMMM ", " MHHHM ", " MHHHM ", " MHHHM ", " MMMMM ", "X X" },
+ { "CCC~CCC", "CMMMMMC", "CMMMMMC", "CMMMMMC", "CMMMMMC", "CMMMMMC", "CCCCCCC" }, }))
+ .addElement(
+ 'C',
+ ofChain(
+ buildHatchAdder(GregtechMTE_ChemicalPlant.class).atLeast(Maintenance)
+ .casingIndex(getCasingTextureID())
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMTE_ChemicalPlant.class)
+ .atLeast(InputHatch, OutputHatch, InputBus, OutputBus)
+ .adder(GregtechMTE_ChemicalPlant::addChemicalPlantList)
+ .hatchItemFilterAnd(
+ (t, s) -> filterByMTETier(
+ Integer.MIN_VALUE,
+ s.stackSize >= 10 ? Integer.MAX_VALUE : s.stackSize))
+ .casingIndex(getCasingTextureID())
+ .dot(1)
+ .build(),
+ buildHatchAdder(GregtechMTE_ChemicalPlant.class)
+ .hatchClass(GT_MetaTileEntity_Hatch_Catalysts.class)
+ .shouldReject(t -> t.mCatalystBuses.size() >= 1)
+ .adder(GregtechMTE_ChemicalPlant::addChemicalPlantList)
+ .casingIndex(getCasingTextureID())
+ .dot(1)
+ .build(),
+ allCasingsElement))
+ .addElement('X', allCasingsElement)
+ .addElement(
+ 'M',
+ withChannel(
+ "machine",
+ addTieredBlock(
+ GregTech_API.sBlockCasings1,
+ GregtechMTE_ChemicalPlant::setMachineMeta,
+ GregtechMTE_ChemicalPlant::getMachineMeta,
+ 10)))
+ .addElement(
+ 'H',
+ withChannel(
+ "coil",
+ ofCoil(GregtechMTE_ChemicalPlant::setCoilMeta, GregtechMTE_ChemicalPlant::getCoilMeta)))
+ .addElement(
+ 'P',
+ withChannel(
+ "pipe",
+ addTieredBlock(
+ GregTech_API.sBlockCasings2,
+ GregtechMTE_ChemicalPlant::setPipeMeta,
+ GregtechMTE_ChemicalPlant::getPipeMeta,
+ 12,
+ 16)))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ private static IStructureElement<GregtechMTE_ChemicalPlant> ofSolidCasing(int aIndex) {
+ return new IStructureElement<GregtechMTE_ChemicalPlant>() {
+
+ @Override
+ public boolean check(GregtechMTE_ChemicalPlant t, World world, int x, int y, int z) {
+ if (check(aIndex, world, x, y, z)) {
+ t.checkCasing[aIndex]++;
+ t.mCasing++;
+ return true;
+ } else return false;
+ }
+
+ private boolean check(int aIndex, World world, int x, int y, int z) {
+ Block block = world.getBlock(x, y, z);
+ int meta = world.getBlockMetadata(x, y, z);
+ Block target = mTieredBlockRegistry.get(aIndex)
+ .getValue_1();
+ int targetMeta = mTieredBlockRegistry.get(aIndex)
+ .getValue_2();
+ return target.equals(block) && meta == targetMeta;
+ }
+
+ int getIndex(int size) {
+ if (size > 8) size = 8;
+ return size - 1;
+ }
+
+ @Override
+ public boolean spawnHint(GregtechMTE_ChemicalPlant t, World world, int x, int y, int z, ItemStack trigger) {
+ StructureLibAPI.hintParticle(
+ world,
+ x,
+ y,
+ z,
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_1(),
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_2());
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(GregtechMTE_ChemicalPlant t, World world, int x, int y, int z,
+ ItemStack trigger) {
+ return world.setBlock(
+ x,
+ y,
+ z,
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_1(),
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_2(),
+ 3);
+ }
+
+ @Nullable
+ @Override
+ public BlocksToPlace getBlocksToPlace(GregtechMTE_ChemicalPlant gregtechMTE_chemicalPlant, World world,
+ int x, int y, int z, ItemStack trigger, AutoPlaceEnvironment env) {
+ return BlocksToPlace.create(
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_1(),
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_2());
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(GregtechMTE_ChemicalPlant t, World world, int x, int y, int z,
+ ItemStack trigger, AutoPlaceEnvironment env) {
+ if (check(getIndex(trigger.stackSize), world, x, y, z)) return PlaceResult.SKIP;
+ return StructureUtility.survivalPlaceBlock(
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_1(),
+ mTieredBlockRegistry.get(getIndex(trigger.stackSize))
+ .getValue_2(),
+ world,
+ x,
+ y,
+ z,
+ env.getSource(),
+ env.getActor(),
+ env.getChatter());
+ }
+ };
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(mName, stackSize, hintsOnly, 3, 6, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(mName, stackSize, 3, 6, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ for (int i = 0; i < 8; i++) {
+ checkCasing[i] = 0;
+ }
+ checkPipe = 0;
+ checkMachine = 0;
+ mSolidCasingTier = 0;
+ mMachineCasingTier = 0;
+ mPipeCasingTier = 0;
+ mCoilTier = 0;
+ maxTierOfHatch = 0;
+ mCatalystBuses.clear();
+ setCoilMeta(HeatingCoilLevel.None);
+ if (checkPiece(mName, 3, 6, 0) && mCasing >= 70) {
+ for (int i = 0; i < 8; i++) {
+ if (checkCasing[i] == mCasing) {
+ mSolidCasingTier = i;
+ } else if (checkCasing[i] > 0) return false;
+ }
+ mMachineCasingTier = checkMachine - 1;
+ mPipeCasingTier = checkPipe - 12;
+ mCoilTier = checkCoil.getTier();
+ getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData());
+ updateHatchTexture();
+ return (mMachineCasingTier >= 9 || mMachineCasingTier >= maxTierOfHatch) && mCatalystBuses.size() <= 1;
+ }
+ return false;
+ }
+
+ public void updateHatchTexture() {
+ for (GT_MetaTileEntity_Hatch h : mCatalystBuses) h.updateTexture(getCasingTextureID());
+ for (IDualInputHatch h : mDualInputHatches) h.updateTexture(getCasingTextureID());
+ for (GT_MetaTileEntity_Hatch h : mInputBusses) h.updateTexture(getCasingTextureID());
+ for (GT_MetaTileEntity_Hatch h : mMaintenanceHatches) h.updateTexture(getCasingTextureID());
+ for (GT_MetaTileEntity_Hatch h : mEnergyHatches) h.updateTexture(getCasingTextureID());
+ for (GT_MetaTileEntity_Hatch h : mOutputBusses) h.updateTexture(getCasingTextureID());
+ for (GT_MetaTileEntity_Hatch h : mInputHatches) h.updateTexture(getCasingTextureID());
+ for (GT_MetaTileEntity_Hatch h : mOutputHatches) h.updateTexture(getCasingTextureID());
+ }
+
+ public final boolean addChemicalPlantList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Catalysts) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) {
+ maxTierOfHatch = Math.max(maxTierOfHatch, ((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity).mTier);
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy) {
+ maxTierOfHatch = Math.max(maxTierOfHatch, ((GT_MetaTileEntity_Hatch_Energy) aMetaTileEntity).mTier);
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus) {
+ maxTierOfHatch = Math.max(maxTierOfHatch, ((GT_MetaTileEntity_Hatch_OutputBus) aMetaTileEntity).mTier);
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ maxTierOfHatch = Math.max(maxTierOfHatch, ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mTier);
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) {
+ maxTierOfHatch = Math.max(maxTierOfHatch, ((GT_MetaTileEntity_Hatch_Output) aMetaTileEntity).mTier);
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP;
+ }
+
+ @Override
+ protected IIconContainer getActiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active;
+ }
+
+ @Override
+ protected IIconContainer getInactiveOverlay() {
+ return TexturesGtBlock.Overlay_Machine_Controller_Advanced;
+ }
+
+ @Override
+ protected int getCasingTextureId() {
+ return getCasingTextureID();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.chemicalPlantRecipes;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 2 * getPipeCasingTier();
+ }
+
+ private int getSolidCasingTier() {
+ return this.mSolidCasingTier;
+ }
+
+ private int getMachineCasingTier() {
+ return mMachineCasingTier;
+ }
+
+ private int getPipeCasingTier() {
+ return mPipeCasingTier;
+ }
+
+ private int getCasingTextureID() {
+ // Check the Tier Client Side
+ int aTier = mSolidCasingTier;
+ return getCasingTextureIdForTier(aTier);
+ }
+
+ public boolean addToMachineList(IGregTechTileEntity aTileEntity) {
+ int aMaxTier = getMachineCasingTier();
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_TieredMachineBlock aMachineBlock) {
+ int aTileTier = aMachineBlock.mTier;
+ if (aTileTier > aMaxTier) {
+ log("Hatch tier too high.");
+ return false;
+ } else {
+ return addToMachineList(aTileEntity, getCasingTextureID());
+ }
+ } else {
+ log("Bad Tile Entity being added to hatch map."); // Shouldn't ever happen, but.. ya know..
+ return false;
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mSolidCasingTier", this.mSolidCasingTier);
+ aNBT.setInteger("mMachineCasingTier", this.mMachineCasingTier);
+ aNBT.setInteger("mPipeCasingTier", this.mPipeCasingTier);
+ aNBT.setInteger("mCoilTier", this.mCoilTier);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mSolidCasingTier = aNBT.getInteger("mSolidCasingTier");
+ mMachineCasingTier = aNBT.getInteger("mMachineCasingTier");
+ mPipeCasingTier = aNBT.getInteger("mPipeCasingTier");
+ mCoilTier = aNBT.getInteger("mCoilTier");
+ }
+
+ @Override
+ public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Catalysts) {
+ log("Found GT_MetaTileEntity_Hatch_Catalysts");
+ return addToMachineListInternal(mCatalystBuses, aMetaTileEntity, aBaseCasingIndex);
+ }
+ return super.addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerTick(final ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ public int getMaxCatalystDurability() {
+ return 50;
+ }
+
+ @Override
+ public byte getUpdateData() {
+ return (byte) mSolidCasingTier;
+ }
+
+ @Override
+ public void receiveClientEvent(byte aEventID, byte aValue) {
+ super.receiveClientEvent(aEventID, aValue);
+ if (aEventID == GregTechTileClientEvents.CHANGE_CUSTOM_DATA && (aValue & 0x80) == 0) {
+ // received an update data from above method
+ // if no &0x80 clause it might catch the noop texture page event
+ mSolidCasingTier = aValue;
+ }
+ }
+
+ private void damageCatalyst(@Nonnull ItemStack aStack, int minParallel) {
+ // Awakened Draconium Coils with Tungstensteel Pipe Casings (or above) no longer consume catalysts.
+ if (!isCatalystDamageable()) return;
+ for (int i = 0; i < minParallel; i++) {
+ if (MathUtils.randFloat(0, 10000000) / 10000000f < (1.2f - (0.2 * this.mPipeCasingTier))) {
+ int damage = getDamage(aStack) + 1;
+ if (damage >= getMaxCatalystDurability()) {
+ addOutput(CI.getEmptyCatalyst(1));
+ aStack.stackSize -= 1;
+ return;
+ } else {
+ setDamage(aStack, damage);
+ }
+ }
+ }
+ }
+
+ private boolean isCatalystDamageable() {
+ return this.mCoilTier < 10 || this.mPipeCasingTier < 4;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ ItemStack catalyst;
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ if (recipe.mSpecialValue > mSolidCasingTier) {
+ return CheckRecipeResultRegistry.insufficientMachineTier(recipe.mSpecialValue + 1);
+ }
+ // checks if it has a catalyst
+ ItemStack catalystInRecipe = null;
+ for (ItemStack item : recipe.mInputs) {
+ if (ItemUtils.isCatalyst(item)) {
+ catalystInRecipe = item;
+ break;
+ }
+ }
+
+ if (catalystInRecipe != null) {
+ catalyst = findCatalyst(getCatalystInputs().toArray(new ItemStack[0]), catalystInRecipe);
+ if (catalyst == null) {
+ return SimpleCheckRecipeResult.ofFailure("no_catalyst");
+ }
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ ArrayList<ItemStack> inputItemsList = new ArrayList<>(Arrays.asList(inputItems));
+ inputItemsList.addAll(getCatalystInputs());
+ inputItems = inputItemsList.toArray(new ItemStack[0]);
+ return super.process();
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult onRecipeStart(@NotNull GT_Recipe recipe) {
+ if (catalyst != null) {
+ damageCatalyst(catalyst, getCurrentParallels());
+ }
+ return super.onRecipeStart(recipe);
+ }
+ }.setMaxParallelSupplier(this::getMaxParallelRecipes);
+ }
+
+ @Override
+ protected void setupProcessingLogic(ProcessingLogic logic) {
+ super.setupProcessingLogic(logic);
+ // Same speed bonus as pyro oven
+ logic.setSpeedBonus(2F / (1 + this.mCoilTier));
+ }
+
+ @Override
+ public void updateSlots() {
+ super.updateSlots();
+ for (GT_MetaTileEntity_Hatch_Catalysts h : mCatalystBuses) {
+ h.updateSlots();
+ h.tryFillUsageSlots();
+ }
+ }
+
+ private ItemStack findCatalyst(ItemStack[] aItemInputs, ItemStack catalyst) {
+ if (aItemInputs != null) {
+ for (ItemStack item : aItemInputs) {
+ if (GT_Utility.areStacksEqual(item, catalyst, true)) {
+ return item;
+ }
+ }
+ }
+ return null;
+ }
+
+ private int getDamage(@Nonnull ItemStack aStack) {
+ return ItemGenericChemBase.getCatalystDamage(aStack);
+ }
+
+ private void setDamage(@Nonnull ItemStack aStack, int aAmount) {
+ ItemGenericChemBase.setCatalystDamage(aStack, aAmount);
+ }
+
+ /*
+ * Catalyst Handling
+ */
+ public ArrayList<ItemStack> getCatalystInputs() {
+ ArrayList<ItemStack> tItems = new ArrayList<>();
+ for (GT_MetaTileEntity_Hatch_Catalysts tHatch : filterValidMTEs(mCatalystBuses)) {
+ AutoMap<ItemStack> aHatchContent = tHatch.getContentUsageSlots();
+ if (!aHatchContent.isEmpty()) {
+ tItems.addAll(aHatchContent);
+ }
+ }
+ return tItems;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/mega/GregTechMetaTileEntity_MegaAlloyBlastSmelter.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/mega/GregTechMetaTileEntity_MegaAlloyBlastSmelter.java
new file mode 100644
index 0000000000..1679629c88
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/mega/GregTechMetaTileEntity_MegaAlloyBlastSmelter.java
@@ -0,0 +1,468 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.mega;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.ExoticEnergy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.bartimaeusnek.bartworks.API.BorosilicateGlass;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregTechMetaTileEntity_MegaAlloyBlastSmelter
+ extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GregTechMetaTileEntity_MegaAlloyBlastSmelter>
+ implements ISurvivalConstructable {
+
+ private static final int MAX_PARALLELS = 256;
+ private HeatingCoilLevel coilLevel;
+ private byte glassTier = -1;
+ private boolean hasNormalCoils;
+
+ private static final IStructureDefinition<GregTechMetaTileEntity_MegaAlloyBlastSmelter> STRUCTURE_DEFINITION = StructureDefinition
+ .<GregTechMetaTileEntity_MegaAlloyBlastSmelter>builder()
+ .addShape(
+ "main",
+ new String[][] {
+ { " ", " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ", " ",
+ " ", " DDDDD ", " CCCCC ", " AEEEA ", " AE~EA ", " AEEEA ",
+ " CCCCC ", " ZZZZZ " },
+ { " DDDDD ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ",
+ " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ",
+ " DDDDD ", " D D ", " C C ", " A A ", " A A ", " A A ",
+ " C C ", " ZZZZZZZ " },
+ { " DDDDDDD ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ",
+ " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ",
+ " DBBBBBD ", " D BBBBB D ", " C BBBBB C ", " A BBBBB A ", " A BBBBB A ", " A BBBBB A ",
+ " C BBBBB C ", " ZZZZZZZZZ " },
+ { " DDDDDDDDD ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " DB BD ", "D B B D", "C B B C", "A B B A", "A B B A", "A B B A",
+ "C B B C", "ZZZZZZZZZZZ" },
+ { " DDDDDDDDD ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " DB BD ", "D B B D", "C B B C", "A B B A", "A B B A", "A B B A",
+ "C B B C", "ZZZZZZZZZZZ" },
+ { " DDDDFDDDD ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " DB BD ", "D B B D", "C B B C", "A B B A", "A B B A", "A B B A",
+ "C B B C", "ZZZZZZZZZZZ" },
+ { " DDDDDDDDD ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " DB BD ", "D B B D", "C B B C", "A B B A", "A B B A", "A B B A",
+ "C B B C", "ZZZZZZZZZZZ" },
+ { " DDDDDDDDD ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ", " AB BA ",
+ " DB BD ", "D B B D", "C B B C", "A B B A", "A B B A", "A B B A",
+ "C B B C", "ZZZZZZZZZZZ" },
+ { " DDDDDDD ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ",
+ " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ",
+ " DBBBBBD ", " D BBBBB D ", " C BBBBB C ", " A BBBBB A ", " A BBBBB A ", " A BBBBB A ",
+ " C BBBBB C ", " ZZZZZZZZZ " },
+ { " DDDDD ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ",
+ " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ",
+ " DDDDD ", " D D ", " C C ", " A A ", " A A ", " A A ",
+ " C C ", " ZZZZZZZ " },
+ { " ", " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ", " ",
+ " ", " DDDDD ", " CCCCC ", " AAAAA ", " AAAAA ", " AAAAA ",
+ " CCCCC ", " ZZZZZ " } })
+ .addElement(
+ 'B',
+ withChannel(
+ "coil",
+ ofChain(
+ onElementPass(
+ te -> te.hasNormalCoils = false,
+ ofCoil(
+ GregTechMetaTileEntity_MegaAlloyBlastSmelter::setCoilLevel,
+ GregTechMetaTileEntity_MegaAlloyBlastSmelter::getCoilLevel)),
+ onElementPass(te -> te.hasNormalCoils = true, ofBlock(ModBlocks.blockCasingsMisc, 14)))))
+
+ .addElement(
+ 'Z',
+ buildHatchAdder(GregTechMetaTileEntity_MegaAlloyBlastSmelter.class)
+ .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Energy, ExoticEnergy)
+ .casingIndex(TAE.GTPP_INDEX(15))
+ .dot(1)
+ .buildAndChain(ofBlock(ModBlocks.blockCasingsMisc, 15)))
+ .addElement(
+ 'E',
+ buildHatchAdder(GregTechMetaTileEntity_MegaAlloyBlastSmelter.class).atLeast(Maintenance)
+ .casingIndex(TAE.GTPP_INDEX(15))
+ .dot(2)
+ .buildAndChain(ofBlock(ModBlocks.blockCasingsMisc, 15)))
+ .addElement('D', ofBlock(ModBlocks.blockCasingsMisc, 15))
+ .addElement('C', ofBlock(ModBlocks.blockCasingsMisc, 14))
+ .addElement(
+ 'A',
+ withChannel(
+ "glass",
+ BorosilicateGlass.ofBoroGlass((byte) -1, (te, t) -> te.glassTier = t, te -> te.glassTier)))
+ .addElement('F', Muffler.newAny(TAE.GTPP_INDEX(15), 3))
+ .build();
+
+ public GregTechMetaTileEntity_MegaAlloyBlastSmelter(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregTechMetaTileEntity_MegaAlloyBlastSmelter(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ if (glassTier < GT_Utility.getTier(recipe.mEUt)) {
+ return CheckRecipeResultRegistry.insufficientMachineTier(GT_Utility.getTier(recipe.mEUt));
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe)
+ .setSpeedBoost((float) (1.0 - getCoilDiscount(coilLevel)));
+ }
+ }.setMaxParallel(MAX_PARALLELS);
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(getMaxInputEu());
+ logic.setAvailableAmperage(1);
+ }
+
+ @Override
+ public boolean addOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ boolean exotic = addExoticEnergyInputToMachineList(aTileEntity, aBaseCasingIndex);
+ return super.addToMachineList(aTileEntity, aBaseCasingIndex) || exotic;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ glassTier = -1;
+ coilLevel = HeatingCoilLevel.None;
+ if (!checkPiece("main", 5, 16, 0)) return false;
+ if (hasNormalCoils) coilLevel = HeatingCoilLevel.None;
+ if (mMaintenanceHatches.size() != 1) return false;
+ if (mMufflerHatches.size() != 1) return false;
+ if (this.glassTier < 10 && !getExoticAndNormalEnergyHatchList().isEmpty()) {
+ for (GT_MetaTileEntity_Hatch hatchEnergy : getExoticAndNormalEnergyHatchList()) {
+ if (this.glassTier < hatchEnergy.mTier) {
+ return false;
+ }
+ }
+ }
+ // Disallow lasers if the glass is below UV tier
+ if (glassTier < 8) {
+ for (GT_MetaTileEntity_Hatch hatchEnergy : getExoticEnergyHatches()) {
+ if (hatchEnergy.getConnectionType() == GT_MetaTileEntity_Hatch.ConnectionType.LASER) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ public double getCoilDiscount(HeatingCoilLevel lvl) {
+ // Since there are only 14 tiers (starting from 0), this is what the function is.
+ double unRounded = (lvl != null ? lvl.getTier() : 0) / 130.0D;
+ if (unRounded < 0) return 1F;
+ double rounded = Math.floor(unRounded * 1000) / 1000;
+
+ return Math.max(0, rounded);
+ }
+
+ @Override
+ public void explodeMultiblock() {
+ super.explodeMultiblock();
+ }
+
+ @Override
+ public List<GT_MetaTileEntity_Hatch> getExoticAndNormalEnergyHatchList() {
+ List<GT_MetaTileEntity_Hatch> tHatches = new ArrayList<>();
+ tHatches.addAll(mExoticEnergyHatches);
+ tHatches.addAll(mEnergyHatches);
+ return tHatches;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece("main", stackSize, hintsOnly, 5, 16, 0);
+ }
+
+ @Override
+ public IStructureDefinition<GregTechMetaTileEntity_MegaAlloyBlastSmelter> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Fluid Alloy Cooker")
+ .addInfo("Controller block for the Mega Alloy Blast Smelter")
+ .addInfo(
+ "Runs the same recipes as the normal ABS, except with up to " + EnumChatFormatting.BOLD
+ + EnumChatFormatting.UNDERLINE
+ + MAX_PARALLELS
+ + EnumChatFormatting.RESET
+ + EnumChatFormatting.GRAY
+ + " parallels.")
+ .addInfo("Every coil tier above cupronickel grants a speed bonus, based on this function:")
+ .addInfo("Bonus = TIER / 150, rounded to the nearest thousandth.")
+ .addInfo(
+ EnumChatFormatting.ITALIC
+ + "Can also use normal ABS coils in their place instead, if you don't like the bonuses :)"
+ + EnumChatFormatting.RESET
+ + EnumChatFormatting.GRAY)
+ .addInfo("The glass limits the tier of the energy hatch. UEV glass unlocks all tiers.")
+ .addInfo("UV glass required for TecTech laser hatches.")
+ .addInfo(
+ EnumChatFormatting.ITALIC + "\"all it does is make metals hot\""
+ + EnumChatFormatting.RESET
+ + EnumChatFormatting.GRAY)
+ .beginStructureBlock(11, 20, 11, false)
+ .addStructureInfo("This structure is too complex! See schematic for details.")
+ .addMaintenanceHatch("Around the controller", 2)
+ .addOtherStructurePart("Input Bus, Output Bus, Input Hatch, Output Bus, Energy Hatch", "Bottom Casing", 1)
+ .addMufflerHatch("1 in the center of the top layer", 3)
+ .toolTipFinisher(
+ EnumChatFormatting.AQUA + "MadMan310 "
+ + EnumChatFormatting.GRAY
+ + "via "
+ + EnumChatFormatting.RED
+ + "GT++");
+ return tt;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ int paras = getBaseMetaTileEntity().isActive() ? processingLogic.getCurrentParallels() : 0;
+ int discountP = (int) (getCoilDiscount(coilLevel) * 1000) / 10;
+
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mExoticEnergyHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ return new String[] { "------------ Critical Information ------------",
+ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mProgresstime)
+ + EnumChatFormatting.RESET
+ + "t / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime)
+ + EnumChatFormatting.RESET
+ + "t",
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(-lEUt)
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getAverageInputVoltage())
+ + EnumChatFormatting.RESET
+ + " EU/t(*"
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getMaxInputAmps())
+ + EnumChatFormatting.RESET
+ + "A) "
+ + StatCollector.translateToLocal("GT5U.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Values.VN[GT_Utility.getTier(getAverageInputVoltage())]
+ + EnumChatFormatting.RESET,
+ "Parallels: " + EnumChatFormatting.BLUE + paras + EnumChatFormatting.RESET,
+ "Coil Discount: " + EnumChatFormatting.BLUE + discountP + "%" + EnumChatFormatting.RESET,
+ "-----------------------------------------" };
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GregTechMetaTileEntity_MegaAlloyBlastSmelter(this.mName);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int aColorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ if (aActive) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(15)),
+ TextureFactory.builder()
+ .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active)
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(15)),
+ TextureFactory.builder()
+ .addIcon(TexturesGtBlock.Overlay_Machine_Controller_Advanced)
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(15)) };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return GTPPRecipeMaps.alloyBlastSmelterRecipes;
+ }
+
+ public HeatingCoilLevel getCoilLevel() {
+ return coilLevel;
+ }
+
+ public void setCoilLevel(HeatingCoilLevel coilLevel) {
+ this.coilLevel = coilLevel;
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ // Lock to single recipe
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ } else {
+ inputSeparation = !inputSeparation;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation);
+ }
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ, ItemStack aTool) {
+ if (aPlayer.isSneaking()) {
+ batchMode = !batchMode;
+ if (batchMode) {
+ GT_Utility.sendChatToPlayer(aPlayer, "Batch recipes.");
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, "Don't batch recipes.");
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 102400;
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ return survivialBuildPiece("main", stackSize, 5, 16, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.glassTier = aNBT.getByte("glassTier");
+ if (!aNBT.hasKey(INPUT_SEPARATION_NBT_KEY)) {
+ inputSeparation = aNBT.getBoolean("separateBusses");
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setByte("glassTier", glassTier);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Gas.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Gas.java
new file mode 100644
index 0000000000..84fac40265
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Gas.java
@@ -0,0 +1,208 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines;
+
+import static gtPlusPlus.core.lib.CORE.RANDOM;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.recipe.maps.FuelBackend;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+@SuppressWarnings("deprecation")
+public class GT_MTE_LargeTurbine_Gas extends GregtechMetaTileEntity_LargerTurbineBase {
+
+ private static final HashSet<Fluid> BLACKLIST = new HashSet<>();
+
+ static {
+ BLACKLIST.add(
+ Materials.Benzene.getFluid(0)
+ .getFluid());
+ }
+
+ public GT_MTE_LargeTurbine_Gas(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MTE_LargeTurbine_Gas(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MTE_LargeTurbine_Gas(mName);
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 3;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 58;
+ }
+
+ @Override
+ protected boolean requiresOutputHatch() {
+ return false;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 4000;
+ }
+
+ @Override
+ public int getFuelValue(FluidStack aLiquid) {
+ if (aLiquid == null) {
+ return 0;
+ }
+ GT_Recipe tFuel = getRecipeMap().getBackend()
+ .findFuel(aLiquid);
+ if (tFuel != null) {
+ return tFuel.mSpecialValue;
+ }
+ return 0;
+ }
+
+ @Override
+ public RecipeMap<FuelBackend> getRecipeMap() {
+ return RecipeMaps.gasTurbineFuels;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -20;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ List<FluidStack> fluids = getStoredFluids();
+ for (FluidStack fluid : fluids) {
+ if (fluid != null && BLACKLIST.contains(fluid.getFluid())) {
+ return SimpleCheckRecipeResult.ofFailure("fuel_blacklisted");
+ }
+ }
+ return super.checkProcessing();
+ }
+
+ @Override
+ long fluidIntoPower(ArrayList<FluidStack> aFluids, long aOptFlow, int aBaseEff, float[] flowMultipliers) {
+ if (aFluids.size() >= 1) {
+ int tEU = 0;
+ int actualOptimalFlow = 0;
+ FluidStack firstFuelType = new FluidStack(aFluids.get(0), 0); // Identify a SINGLE type of fluid to process.
+ // Doesn't matter which one. Ignore the rest!
+ int fuelValue = getFuelValue(firstFuelType);
+ // log("Fuel Value of "+aFluids.get(0).getLocalizedName()+" is "+fuelValue+"eu");
+ if (aOptFlow < fuelValue) {
+ // turbine too weak and/or fuel too powerful
+ // at least consume 1L
+ this.realOptFlow = 1;
+ // wastes the extra fuel and generate aOptFlow directly
+ depleteInput(new FluidStack(firstFuelType, 1));
+ this.storedFluid += 1;
+ return GT_Utility.safeInt((long) aOptFlow * (long) aBaseEff / 10000L);
+ }
+
+ actualOptimalFlow = GT_Utility.safeInt((long) (aOptFlow * (double) flowMultipliers[1] / fuelValue));
+ this.realOptFlow = actualOptimalFlow;
+
+ int remainingFlow = GT_Utility.safeInt((long) (actualOptimalFlow * 1.25f)); // Allowed to use up to 125% of
+ // optimal flow. Variable
+ // required outside of loop for
+ // multi-hatch scenarios.
+ int flow = 0;
+ int totalFlow = 0;
+
+ storedFluid = 0;
+ for (FluidStack aFluid : aFluids) {
+ if (aFluid.isFluidEqual(firstFuelType)) {
+ flow = Math.min(aFluid.amount, remainingFlow); // try to use up to 125% of optimal flow w/o
+ // exceeding remainingFlow
+ depleteInput(new FluidStack(aFluid, flow)); // deplete that amount
+ this.storedFluid += aFluid.amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = GT_Utility.safeInt((long) totalFlow * fuelValue);
+
+ if (totalFlow == actualOptimalFlow) {
+ tEU = GT_Utility.safeInt((long) tEU * (long) aBaseEff / 10000L);
+ } else {
+ float efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow);
+ tEU *= efficiency;
+ tEU = GT_Utility.safeInt((long) tEU * (long) aBaseEff / 10000L);
+ }
+
+ return tEU;
+ }
+ return 0;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return (RANDOM.nextInt(4) == 0) ? 0 : 1;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Large Gas Turbine";
+ }
+
+ @Override
+ protected String getTurbineType() {
+ return "Gas";
+ }
+
+ @Override
+ protected String getCasingName() {
+ return "Reinforced Gas Turbine Casing";
+ }
+
+ @Override
+ protected ITexture getTextureFrontFace() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced);
+ }
+
+ @Override
+ protected ITexture getTextureFrontFaceActive() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Plasma.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Plasma.java
new file mode 100644
index 0000000000..db99b52be1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Plasma.java
@@ -0,0 +1,314 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.recipe.maps.FuelBackend;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Turbine;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+@SuppressWarnings("deprecation")
+public class GT_MTE_LargeTurbine_Plasma extends GregtechMetaTileEntity_LargerTurbineBase {
+
+ private static final HashSet<Fluid> BLACKLIST = new HashSet<>();
+
+ public GT_MTE_LargeTurbine_Plasma(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MTE_LargeTurbine_Plasma(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MTE_LargeTurbine_Plasma(mName);
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 4;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 60;
+ }
+
+ @Override
+ protected boolean requiresOutputHatch() {
+ return true;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getFuelValue(FluidStack aLiquid) {
+ if (aLiquid == null) {
+ return 0;
+ }
+ GT_Recipe tFuel = getRecipeMap().getBackend()
+ .findFuel(aLiquid);
+ if (tFuel != null) {
+ return tFuel.mSpecialValue;
+ }
+ return 0;
+ }
+
+ @Override
+ public RecipeMap<FuelBackend> getRecipeMap() {
+ return RecipeMaps.plasmaFuels;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -20;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+
+ try {
+ ArrayList<GT_MetaTileEntity_Hatch_Turbine> aEmptyTurbineRotorHatches = getEmptyTurbineAssemblies();
+ if (aEmptyTurbineRotorHatches.size() > 0) {
+ hatch: for (GT_MetaTileEntity_Hatch_Turbine aHatch : aEmptyTurbineRotorHatches) {
+ ArrayList<ItemStack> aTurbines = getAllBufferedTurbines();
+ for (ItemStack aTurbineItem : aTurbines) {
+ if (aTurbineItem == null) {
+ continue;
+ }
+ if (aHatch.insertTurbine(aTurbineItem.copy())) {
+ depleteTurbineFromStock(aTurbineItem);
+ continue hatch;
+ }
+ }
+ }
+ }
+
+ if (getEmptyTurbineAssemblies().size() > 0 || !areAllTurbinesTheSame()) {
+ stopMachine(ShutDownReasonRegistry.NO_TURBINE);
+ return CheckRecipeResultRegistry.NO_TURBINE_FOUND;
+ }
+
+ ArrayList<FluidStack> tFluids = getStoredFluids();
+
+ if (tFluids.size() > 0) {
+ for (FluidStack fluid : tFluids) {
+ if (fluid != null && BLACKLIST.contains(fluid.getFluid())) {
+ return SimpleCheckRecipeResult.ofFailure("fuel_blacklisted");
+ }
+ }
+ if (baseEff == 0 || optFlow == 0
+ || counter >= 512
+ || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()
+ || this.getBaseMetaTileEntity()
+ .hasInventoryBeenModified()) {
+ counter = 0;
+
+ float aTotalBaseEff = 0;
+ float aTotalOptimalFlow = 0;
+
+ ItemStack aStack = getFullTurbineAssemblies().get(0)
+ .getTurbine();
+ aTotalBaseEff += GT_Utility.safeInt(
+ (long) ((5F + ((GT_MetaGenerated_Tool) aStack.getItem()).getToolCombatDamage(aStack)) * 1000F));
+ aTotalOptimalFlow += GT_Utility.safeInt(
+ (long) Math.max(
+ Float.MIN_NORMAL,
+ ((GT_MetaGenerated_Tool) aStack.getItem()).getToolStats(aStack)
+ .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mToolSpeed
+ * 50));
+
+ // Calculate total EU/t (as shown on turbine tooltip (Fast mode doesn't affect))
+ double aEUPerTurbine = aTotalOptimalFlow * 40
+ * 0.0105
+ * GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mPlasmaMultiplier
+ * (50.0f + (10.0f * ((GT_MetaGenerated_Tool) aStack.getItem()).getToolCombatDamage(aStack)));
+ aTotalOptimalFlow *= getSpeedMultiplier();
+
+ if (aTotalOptimalFlow < 0) {
+ aTotalOptimalFlow = 100;
+ }
+
+ flowMultipliers[0] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mSteamMultiplier;
+ flowMultipliers[1] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mGasMultiplier;
+ flowMultipliers[2] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mPlasmaMultiplier;
+ baseEff = MathUtils.roundToClosestInt(aTotalBaseEff);
+ optFlow = MathUtils.roundToClosestInt(aTotalOptimalFlow);
+ euPerTurbine = MathUtils.roundToClosestInt(aEUPerTurbine);
+ if (optFlow <= 0 || baseEff <= 0) {
+ stopMachine(ShutDownReasonRegistry.NONE); // in case the turbine got removed
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+ } else {
+ counter++;
+ }
+ }
+
+ // How much the turbine should be producing with this flow
+ long newPower = fluidIntoPower(tFluids, optFlow, baseEff, flowMultipliers);
+
+ // Reduce produced power depending on the ratio between fuel value and turbine EU/t with the following
+ // formula:
+ // EU/t = EU/t * MIN(1, ( ( (FuelValue / 200) ^ 2 ) / EUPerTurbine))
+ int fuelValue = 0;
+ if (tFluids.size() > 0) {
+ fuelValue = getFuelValue(new FluidStack(tFluids.get(0), 0));
+ }
+ float magicValue = (fuelValue * 0.005f) * (fuelValue * 0.005f);
+ float efficiencyLoss = Math.min(1.0f, magicValue / euPerTurbine);
+ newPower *= efficiencyLoss;
+
+ long difference = newPower - this.lEUt; // difference between current output and new output
+
+ // Magic numbers: can always change by at least 10 eu/t, but otherwise by at most 1 percent of the
+ // difference in power level (per tick)
+ // This is how much the turbine can actually change during this tick
+ int maxChangeAllowed = Math.max(10, GT_Utility.safeInt((long) Math.abs(difference) / 100));
+
+ if (Math.abs(difference) > maxChangeAllowed) { // If this difference is too big, use the maximum allowed
+ // change
+ int change = maxChangeAllowed * (difference > 0 ? 1 : -1); // Make the change positive or negative.
+ this.lEUt += change; // Apply the change
+ } else {
+ this.lEUt = newPower;
+ }
+ if (this.lEUt <= 0) {
+ this.lEUt = 0;
+ this.mEfficiency = 0;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ } else {
+ this.mMaxProgresstime = 20;
+ this.mEfficiencyIncrease = 10;
+ // Overvoltage is handled inside the MultiBlockBase when pushing out to dynamos. no need to do it here.
+ // Play sounds (GT++ addition - GT multiblocks play no sounds)
+ enableAllTurbineHatches();
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+
+ @Override
+ long fluidIntoPower(ArrayList<FluidStack> aFluids, long aOptFlow, int aBaseEff, float[] flowMultipliers) {
+ if (aFluids.size() >= 1) {
+ aOptFlow *= 800; // CHANGED THINGS HERE, check recipe runs once per 20 ticks
+ int tEU = 0;
+
+ int actualOptimalFlow = 0;
+
+ FluidStack firstFuelType = new FluidStack(aFluids.get(0), 0); // Identify a SINGLE type of fluid to process.
+ // Doesn't matter which one. Ignore the rest!
+ int fuelValue = getFuelValue(firstFuelType);
+ actualOptimalFlow = GT_Utility
+ .safeInt((long) Math.ceil((double) aOptFlow * (double) flowMultipliers[2] / (double) fuelValue));
+ this.realOptFlow = actualOptimalFlow; // For scanner info
+
+ int remainingFlow = GT_Utility.safeInt((long) (actualOptimalFlow * 1.25f)); // Allowed to use up to 125% of
+ // optimal flow. Variable
+ // required outside of loop for
+ // multi-hatch scenarios.
+ int flow = 0;
+ int totalFlow = 0;
+
+ storedFluid = 0;
+ for (FluidStack aFluid : aFluids) {
+ if (aFluid.isFluidEqual(firstFuelType)) {
+ flow = Math.min(aFluid.amount, remainingFlow); // try to use up w/o exceeding remainingFlow
+ depleteInput(new FluidStack(aFluid, flow)); // deplete that amount
+ this.storedFluid += aFluid.amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ }
+ }
+ String fn = FluidRegistry.getFluidName(firstFuelType);
+ String[] nameSegments = fn.split("\\.", 2);
+ if (nameSegments.length == 2) {
+ String outputName = nameSegments[1];
+ FluidStack output = FluidRegistry.getFluidStack(outputName, totalFlow);
+ if (output == null) {
+ output = FluidRegistry.getFluidStack("molten." + outputName, totalFlow);
+ }
+ if (output != null) {
+ addOutput(output);
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = GT_Utility.safeInt((long) ((fuelValue / 20D) * (double) totalFlow));
+
+ if (totalFlow == actualOptimalFlow) {
+ tEU = GT_Utility.safeInt((long) (aBaseEff / 10000D * tEU));
+ } else {
+ double efficiency = 1.0D - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow);
+
+ tEU = (int) (tEU * efficiency);
+ tEU = GT_Utility.safeInt((long) (aBaseEff / 10000D * tEU));
+ }
+
+ return tEU;
+ }
+ return 0;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Large Plasma Turbine";
+ }
+
+ @Override
+ protected String getTurbineType() {
+ return "Plasma";
+ }
+
+ @Override
+ protected String getCasingName() {
+ return "Reinforced Plasma Turbine Casing";
+ }
+
+ @Override
+ protected ITexture getTextureFrontFace() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced);
+ }
+
+ @Override
+ protected ITexture getTextureFrontFaceActive() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SCSteam.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SCSteam.java
new file mode 100644
index 0000000000..7ee40757fd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SCSteam.java
@@ -0,0 +1,126 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines;
+
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GT_MTE_LargeTurbine_SCSteam extends GregtechMetaTileEntity_LargerTurbineBase {
+
+ public GT_MTE_LargeTurbine_SCSteam(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MTE_LargeTurbine_SCSteam(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MTE_LargeTurbine_SCSteam(mName);
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 15;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 1538;
+ }
+
+ @Override
+ protected boolean requiresOutputHatch() {
+ return true;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getFuelValue(FluidStack aLiquid) {
+ return 0;
+ }
+
+ @Override
+ long fluidIntoPower(ArrayList<FluidStack> aFluids, long aOptFlow, int aBaseEff, float[] flowMultipliers) {
+ int tEU = 0;
+ int totalFlow = 0; // Byproducts are based on actual flow
+ int flow = 0;
+ // Variable required outside of loop for
+ // multi-hatch scenarios.
+ this.realOptFlow = aOptFlow;
+ // this.realOptFlow = (double) aOptFlow * (double) flowMultipliers[0];
+ // Will there be an multiplier for SC?
+ int remainingFlow = MathUtils.safeInt((long) (realOptFlow * 1.25f)); // Allowed to use up to
+ // 125% of optimal flow.
+
+ storedFluid = 0;
+ FluidStack tSCSteam = FluidRegistry.getFluidStack("supercriticalsteam", 1);
+ for (int i = 0; i < aFluids.size() && remainingFlow > 0; i++) {
+ if (GT_Utility.areFluidsEqual(aFluids.get(i), tSCSteam, true)) {
+ flow = Math.min(aFluids.get(i).amount, remainingFlow); // try to use up w/o exceeding remainingFlow
+ depleteInput(new FluidStack(aFluids.get(i), flow)); // deplete that amount
+ this.storedFluid += aFluids.get(i).amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = totalFlow;
+ addOutput(GT_ModHandler.getSteam(totalFlow));
+ if (totalFlow != realOptFlow) {
+ float efficiency = 1.0f - Math.abs((totalFlow - (float) realOptFlow) / (float) realOptFlow);
+ // if(totalFlow>aOptFlow){efficiency = 1.0f;}
+ tEU *= efficiency;
+ tEU = Math.max(1, MathUtils.safeInt((long) tEU * (long) aBaseEff / 10000L));
+ } else {
+ tEU = MathUtils.safeInt((long) tEU * (long) aBaseEff / 10000L);
+ }
+
+ return tEU * 100L;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 8;
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Large Supercritical Steam Turbine";
+ }
+
+ @Override
+ protected String getTurbineType() {
+ return "Supercritical Steam";
+ }
+
+ @Override
+ protected String getCasingName() {
+ return "Reinforced SC Turbine Casing";
+ }
+
+ @Override
+ protected ITexture getTextureFrontFace() {
+ return TextureFactory.of(TexturesGtBlock.Overlay_Machine_Controller_Advanced);
+ }
+
+ @Override
+ protected ITexture getTextureFrontFaceActive() {
+ return TextureFactory.of(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SHSteam.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SHSteam.java
new file mode 100644
index 0000000000..d1346d3a51
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_SHSteam.java
@@ -0,0 +1,204 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines;
+
+import java.util.ArrayList;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+@SuppressWarnings("deprecation")
+public class GT_MTE_LargeTurbine_SHSteam extends GregtechMetaTileEntity_LargerTurbineBase {
+
+ public boolean achievement = false;
+ private boolean looseFit = false;
+
+ public GT_MTE_LargeTurbine_SHSteam(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MTE_LargeTurbine_SHSteam(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MTE_LargeTurbine_SHSteam(mName);
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 2;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 59;
+ }
+
+ @Override
+ protected boolean requiresOutputHatch() {
+ return true;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getFuelValue(FluidStack aLiquid) {
+ return 0;
+ }
+
+ @Override
+ long fluidIntoPower(ArrayList<FluidStack> aFluids, long aOptFlow, int aBaseEff, float[] flowMultipliers) {
+ if (looseFit) {
+ aOptFlow *= 4;
+ if (aBaseEff > 10000) {
+ aOptFlow *= Math.pow(1.1f, ((aBaseEff - 7500) / 10000F) * 20f);
+ aBaseEff = 7500;
+ } else if (aBaseEff > 7500) {
+ aOptFlow *= Math.pow(1.1f, ((aBaseEff - 7500) / 10000F) * 20f);
+ aBaseEff *= 0.75f;
+ } else {
+ aBaseEff *= 0.75f;
+ }
+ }
+ // prevent overflow like that in SC Steam
+ long tEU = 0;
+ int totalFlow = 0; // Byproducts are based on actual flow
+ int flow = 0;
+
+ // Variable required outside of loop for
+ // multi-hatch scenarios.
+ this.realOptFlow = aOptFlow * flowMultipliers[0];
+
+ int remainingFlow = MathUtils.safeInt((long) (realOptFlow * 1.25f)); // Allowed to use up to
+ // 125% of optimal flow.
+
+ storedFluid = 0;
+ for (int i = 0; i < aFluids.size() && remainingFlow > 0; i++) {
+ String fluidName = aFluids.get(i)
+ .getFluid()
+ .getUnlocalizedName(aFluids.get(i));
+ if (fluidName.equals("ic2.fluidSuperheatedSteam")) {
+ flow = Math.min(aFluids.get(i).amount, remainingFlow); // try to use up w/o exceeding remainingFlow
+ depleteInput(new FluidStack(aFluids.get(i), flow)); // deplete that amount
+ this.storedFluid += aFluids.get(i).amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ if (!achievement) {
+ try {
+ GT_Mod.achievements.issueAchievement(
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .getPlayerEntityByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName()),
+ "efficientsteam");
+ } catch (Exception e) {}
+ achievement = true;
+ }
+ } else if (fluidName.equals("fluid.steam") || fluidName.equals("ic2.fluidSteam")
+ || fluidName.equals("fluid.mfr.steam.still.name")) {
+ depleteInput(new FluidStack(aFluids.get(i), aFluids.get(i).amount));
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = totalFlow;
+ addOutput(GT_ModHandler.getSteam(totalFlow));
+ if (totalFlow != realOptFlow) {
+ float efficiency = 1.0f - Math.abs((totalFlow - (float) realOptFlow) / (float) realOptFlow);
+ // if(totalFlow>aOptFlow){efficiency = 1.0f;}
+ tEU *= efficiency;
+ tEU = Math.max(1L, tEU * aBaseEff / 10000L);
+ } else {
+ tEU = tEU * aBaseEff / 10000L;
+ }
+
+ return tEU;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ // Using a screwdriver to change modes should allow for any combination of Slow/Fast and Tight/Loose Mode
+ // Whenever there's a mode switch, there will be two messages on the player chat
+ // The two messages specify which two modes the turbine is on after the change
+ // (Tight/Loose changes on every action, Slow/Fast changes every other action, all pairs are cycled this way)
+ if (side == getBaseMetaTileEntity().getFrontFacing()) {
+ looseFit ^= true;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ looseFit ? "Fitting is Loose (Higher Flow)" : "Fitting is Tight (Higher Efficiency)");
+ }
+
+ if (looseFit) {
+ super.onModeChangeByScrewdriver(side, aPlayer, aX, aY, aZ);
+ } else if (mFastMode) {
+ PlayerUtils.messagePlayer(aPlayer, "Running in Fast (48x) Mode.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Running in Slow (16x) Mode.");
+ }
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return (looseFit && CORE.RANDOM.nextInt(4) == 0) ? 0 : 1;
+ }
+
+ @Override
+ public boolean isLooseMode() {
+ return looseFit;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("turbineFitting", looseFit);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ looseFit = aNBT.getBoolean("turbineFitting");
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Large Super-heated Steam Turbine";
+ }
+
+ @Override
+ protected String getTurbineType() {
+ return "Super-heated Steam";
+ }
+
+ @Override
+ protected String getCasingName() {
+ return "Reinforced HP Steam Turbine Casing";
+ }
+
+ @Override
+ protected ITexture getTextureFrontFace() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced);
+ }
+
+ @Override
+ protected ITexture getTextureFrontFaceActive() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Steam.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Steam.java
new file mode 100644
index 0000000000..c882b84aab
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GT_MTE_LargeTurbine_Steam.java
@@ -0,0 +1,215 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines;
+
+import static gtPlusPlus.core.lib.CORE.RANDOM;
+
+import java.util.ArrayList;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+@SuppressWarnings("deprecation")
+public class GT_MTE_LargeTurbine_Steam extends GregtechMetaTileEntity_LargerTurbineBase {
+
+ private float water;
+ private boolean achievement = false;
+ private boolean looseFit = false;
+
+ public GT_MTE_LargeTurbine_Steam(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MTE_LargeTurbine_Steam(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MTE_LargeTurbine_Steam(mName);
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 1;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 16;
+ }
+
+ @Override
+ protected boolean requiresOutputHatch() {
+ return true;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 0;
+ }
+
+ private int useWater(float input) {
+ water = water + input;
+ int usage = (int) water;
+ water = water - usage;
+ return usage;
+ }
+
+ @Override
+ public int getFuelValue(FluidStack aLiquid) {
+ return 0;
+ }
+
+ @Override
+ long fluidIntoPower(ArrayList<FluidStack> aFluids, long aOptFlow, int aBaseEff, float[] flowMultipliers) {
+ if (looseFit) {
+ aOptFlow *= 4;
+ if (aBaseEff > 10000) {
+ aOptFlow *= Math.pow(1.1f, ((aBaseEff - 7500) / 10000F) * 20f);
+ aBaseEff = 7500;
+ } else if (aBaseEff > 7500) {
+ aOptFlow *= Math.pow(1.1f, ((aBaseEff - 7500) / 10000F) * 20f);
+ aBaseEff *= 0.75f;
+ } else {
+ aBaseEff *= 0.75f;
+ }
+ }
+ // prevent overflow like that in SC Steam
+ long tEU = 0;
+ int totalFlow = 0; // Byproducts are based on actual flow
+ int flow = 0;
+
+ // Variable required outside of loop for
+ // multi-hatch scenarios.
+ this.realOptFlow = aOptFlow * flowMultipliers[0];
+
+ int remainingFlow = MathUtils.safeInt((long) (realOptFlow * 1.25f)); // Allowed to
+ // use up to
+ // 125% of
+ // optimal flow.
+
+ storedFluid = 0;
+ for (int i = 0; i < aFluids.size() && remainingFlow > 0; i++) { // loop through each hatch; extract inputs and
+ // track totals.
+ String fluidName = aFluids.get(i)
+ .getFluid()
+ .getUnlocalizedName(aFluids.get(i));
+ if (fluidName.equals("fluid.steam") || fluidName.equals("ic2.fluidSteam")
+ || fluidName.equals("fluid.mfr.steam.still.name")) {
+ flow = Math.min(aFluids.get(i).amount, remainingFlow); // try to use up w/o exceeding remainingFlow
+ depleteInput(new FluidStack(aFluids.get(i), flow)); // deplete that amount
+ this.storedFluid += aFluids.get(i).amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ if (!achievement) {
+ GT_Mod.achievements.issueAchievement(
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .getPlayerEntityByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName()),
+ "muchsteam");
+ achievement = true;
+ }
+ } else if (fluidName.equals("ic2.fluidSuperheatedSteam")) {
+ depleteInput(new FluidStack(aFluids.get(i), aFluids.get(i).amount));
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = totalFlow;
+ int waterToOutput = useWater(totalFlow / 160.0f);
+ addOutput(GT_ModHandler.getDistilledWater(waterToOutput));
+ if (totalFlow != realOptFlow) {
+ float efficiency = 1.0f - Math.abs((totalFlow - (float) realOptFlow) / (float) realOptFlow);
+ // if(totalFlow>aOptFlow){efficiency = 1.0f;}
+ tEU *= efficiency;
+ tEU = Math.max(1L, tEU * aBaseEff / 20000L);
+ } else {
+ tEU = tEU * aBaseEff / 20000L;
+ }
+
+ return tEU;
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ // Using a screwdriver to change modes should allow for any combination of Slow/Fast and Tight/Loose Mode
+ // Whenever there's a mode switch, there will be two messages on the player chat
+ // The two messages specify which two modes the turbine is on after the change
+ // (Tight/Loose changes on every action, Slow/Fast changes every other action, all pairs are cycled this way)
+ if (side == getBaseMetaTileEntity().getFrontFacing()) {
+ looseFit ^= true;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ looseFit ? "Fitting: Loose - More Flow" : "Fitting: Tight - More Efficiency");
+ }
+
+ if (looseFit) {
+ super.onModeChangeByScrewdriver(side, aPlayer, aX, aY, aZ);
+ } else if (mFastMode) {
+ PlayerUtils.messagePlayer(aPlayer, "Running in Fast (48x) Mode.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Running in Slow (16x) Mode.");
+ }
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return (looseFit && RANDOM.nextInt(4) == 0) ? 0 : 1;
+ }
+
+ @Override
+ public boolean isLooseMode() {
+ return looseFit;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("turbineFitting", looseFit);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ looseFit = aNBT.getBoolean("turbineFitting");
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Large Steam Turbine";
+ }
+
+ @Override
+ protected String getTurbineType() {
+ return "Steam";
+ }
+
+ @Override
+ protected String getCasingName() {
+ return "Reinforced Steam Turbine Casing";
+ }
+
+ @Override
+ protected ITexture getTextureFrontFace() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced);
+ }
+
+ @Override
+ protected ITexture getTextureFrontFaceActive() {
+ return new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Controller_Advanced_Active);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GregtechMetaTileEntity_LargerTurbineBase.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GregtechMetaTileEntity_LargerTurbineBase.java
new file mode 100644
index 0000000000..eec137cea2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/turbines/GregtechMetaTileEntity_LargerTurbineBase.java
@@ -0,0 +1,893 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.TTDynamo;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.minecraft.BlockPos;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Turbine;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public abstract class GregtechMetaTileEntity_LargerTurbineBase
+ extends GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_LargerTurbineBase> implements ISurvivalConstructable {
+
+ protected int baseEff = 0;
+ protected long optFlow = 0;
+ protected long euPerTurbine = 0;
+ protected double realOptFlow = 0;
+ protected int storedFluid = 0;
+ protected int counter = 0;
+ protected boolean mFastMode = false;
+ protected double mufflerReduction = 1;
+ protected float[] flowMultipliers = new float[] { 1, 1, 1 };
+
+ public ITexture frontFace;
+ public ITexture frontFaceActive;
+
+ public ArrayList<GT_MetaTileEntity_Hatch_Turbine> mTurbineRotorHatches = new ArrayList<>();
+
+ public GregtechMetaTileEntity_LargerTurbineBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ frontFace = getTextureFrontFace();
+ frontFaceActive = getTextureFrontFaceActive();
+ }
+
+ public GregtechMetaTileEntity_LargerTurbineBase(String aName) {
+ super(aName);
+ frontFace = getTextureFrontFace();
+ frontFaceActive = getTextureFrontFaceActive();
+ }
+
+ protected abstract ITexture getTextureFrontFace();
+
+ protected abstract ITexture getTextureFrontFaceActive();
+
+ protected abstract String getTurbineType();
+
+ protected abstract String getCasingName();
+
+ protected abstract boolean requiresOutputHatch();
+
+ @Override
+ protected final GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Controller Block for the XL " + getTurbineType() + " Turbine")
+ .addInfo("Runs as fast as 16 Large Turbines of the same type, takes the space of 12")
+ .addInfo("Right-click with screwdriver to enable Fast Mode, to run it even faster")
+ .addInfo("Optimal flow will increase or decrease accordingly on mode switch")
+ .addInfo("Fast Mode increases speed to 48x instead of 16x, with some penalties")
+ .addInfo("Maintenance problems and turbine damage happen 12x as often in Fast Mode");
+ if (getTurbineType().contains("Steam")) {
+ tt.addInfo("XL Steam Turbines can use Loose Mode with either Slow or Fast Mode");
+ }
+ if (getTurbineType().equals("Plasma")) {
+ tt.addInfo("Plasma fuel efficiency is lower for high tier turbines when using low-grade plasmas")
+ .addInfo("Efficiency = ((FuelValue / 200,000)^2) / (EU per Turbine)");
+ }
+ tt.addPollutionAmount(getPollutionPerSecond(null))
+ .addInfo("Pollution is 3x higher in Fast Mode")
+ .addSeparator()
+ .beginStructureBlock(7, 9, 7, false)
+ .addController("Top Middle")
+ .addCasingInfoMin(getCasingName(), 360, false)
+ .addCasingInfoMin("Rotor Shaft", 30, false)
+ .addOtherStructurePart("Rotor Assembly", "Any 1 dot hint", 1)
+ .addInputBus("Any 4 dot hint (min 1)", 4)
+ .addInputHatch("Any 4 dot hint(min 1)", 4);
+ if (requiresOutputHatch()) {
+ tt.addOutputHatch("Any 4 dot hint(min 1)", 4);
+ }
+ tt.addDynamoHatch("Any 4 dot hint(min 1)", 4)
+ .addMaintenanceHatch("Any 4 dot hint(min 1)", 4);
+ if (requiresMufflers()) {
+ tt.addMufflerHatch("Any 7 dot hint (x4)", 7);
+ }
+ tt.toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final ClassValue<IStructureDefinition<GregtechMetaTileEntity_LargerTurbineBase>> STRUCTURE_DEFINITION = new ClassValue<>() {
+
+ @Override
+ @SuppressWarnings("SpellCheckingInspection")
+ protected IStructureDefinition<GregtechMetaTileEntity_LargerTurbineBase> computeValue(Class<?> type) {
+ return StructureDefinition.<GregtechMetaTileEntity_LargerTurbineBase>builder()
+ // c = turbine casing
+ // s = turbine shaft
+ // t = turbine housing
+ // h = dynamo/maint
+ // m = muffler
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ (new String[][] { { "ccchccc", "ccccccc", "ccmmmcc", "ccm~mcc", "ccmmmcc", "ccccccc", "ccchccc" },
+ { "ctchctc", "cscccsc", "cscccsc", "cscccsc", "cscccsc", "cscccsc", "ctchctc" },
+ { "ccchccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccchccc" },
+ { "ccchccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccchccc" },
+ { "ctchctc", "cscccsc", "cscccsc", "cscccsc", "cscccsc", "cscccsc", "ctchctc" },
+ { "ccchccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccchccc" },
+ { "ccchccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccchccc" },
+ { "ctchctc", "cscccsc", "cscccsc", "cscccsc", "cscccsc", "cscccsc", "ctchctc" },
+ { "ccchccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccccccc", "ccchccc" }, }))
+ .addElement('c', lazy(t -> ofBlock(t.getCasingBlock(), t.getCasingMeta())))
+ .addElement('s', lazy(t -> ofBlock(t.getShaftBlock(), t.getTurbineShaftMeta())))
+ .addElement(
+ 't',
+ lazy(
+ t -> buildHatchAdder(GregtechMetaTileEntity_LargerTurbineBase.class)
+ .adder(GregtechMetaTileEntity_LargerTurbineBase::addTurbineHatch)
+ .hatchClass(GT_MetaTileEntity_Hatch_Turbine.class)
+ .casingIndex(t.getCasingTextureIndex())
+ .dot(1)
+ .build()))
+ .addElement(
+ 'h',
+ lazy(
+ t -> buildHatchAdder(GregtechMetaTileEntity_LargerTurbineBase.class)
+ .atLeast(InputBus, InputHatch, OutputHatch, Dynamo.or(TTDynamo), Maintenance)
+ .casingIndex(t.getCasingTextureIndex())
+ .dot(4)
+ .buildAndChain(t.getCasingBlock(), t.getCasingMeta())))
+ .addElement(
+ 'm',
+ lazy(
+ t -> buildHatchAdder(GregtechMetaTileEntity_LargerTurbineBase.class).atLeast(Muffler)
+ .casingIndex(t.getCasingTextureIndex())
+ .dot(7)
+ .buildAndChain(t.getCasingBlock(), t.getCasingMeta())))
+ .build();
+ }
+ };
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_LargerTurbineBase> getStructureDefinition() {
+ return STRUCTURE_DEFINITION.get(getClass());
+ }
+
+ private boolean requiresMufflers() {
+ if (!PollutionUtils.isPollutionEnabled()) {
+ return false;
+ }
+ return getPollutionPerSecond(null) > 0;
+ }
+
+ public final double getMufflerReduction() {
+ double totalReduction = 0;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ totalReduction += ((double) tHatch.calculatePollutionReduction(100)) / 100;
+ }
+ return totalReduction / 4;
+ }
+
+ @Override
+ public void clearHatches() {
+ super.clearHatches();
+ mTurbineRotorHatches.clear();
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ // we do not check for casing count here. the bare minimal is 372 but we only require 360
+ boolean aStructure = checkPiece(STRUCTURE_PIECE_MAIN, 3, 3, 0);
+ log("Structure Check: " + aStructure);
+ if (mTurbineRotorHatches.size() != 12 || mMaintenanceHatches.size() != 1
+ || (mDynamoHatches.size() < 1 && mTecTechDynamoHatches.size() < 1)
+ || (requiresMufflers() && mMufflerHatches.size() != 4)
+ || mInputBusses.size() < 1
+ || mInputHatches.size() < 1
+ || (requiresOutputHatch() && mOutputHatches.size() < 1)) {
+ log(
+ "Bad Hatches - Turbine Housings: " + mTurbineRotorHatches.size()
+ + ", Maint: "
+ + mMaintenanceHatches.size()
+ + ", Dynamo: "
+ + mDynamoHatches.size()
+ + ", Muffler: "
+ + mMufflerHatches.size()
+ + ", Input Buses: "
+ + mInputBusses.size()
+ + ", Input Hatches: "
+ + mInputHatches.size()
+ + ", Output Hatches: "
+ + mOutputHatches.size());
+ return false;
+ }
+ mufflerReduction = getMufflerReduction();
+ return aStructure;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 3, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 2);
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 3, 3, 0, realBudget, env, false, true);
+ }
+
+ public boolean addTurbineHatch(final IGregTechTileEntity aTileEntity, final int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ final IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Turbine aTurbineHatch) {
+ log("Found GT_MetaTileEntity_Hatch_Turbine");
+ updateTexture(aTileEntity, aBaseCasingIndex);
+ IGregTechTileEntity g = this.getBaseMetaTileEntity();
+ if (aTurbineHatch.setController(new BlockPos(g.getXCoord(), g.getYCoord(), g.getZCoord(), g.getWorld()))) {
+ boolean aDidAdd = this.mTurbineRotorHatches.add(aTurbineHatch);
+ Logger.INFO("Injected Controller into Turbine Assembly. Found: " + this.mTurbineRotorHatches.size());
+ return aDidAdd;
+ } else {
+ Logger.INFO("Failed to inject controller into Turbine Assembly Hatch.");
+ }
+ }
+ log("Bad Turbine Housing");
+ return false;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return getMaxEfficiency(aStack) > 0;
+ }
+
+ public Block getCasingBlock() {
+ return ModBlocks.blockSpecialMultiCasings;
+ }
+
+ public final Block getShaftBlock() {
+ return ModBlocks.blockSpecialMultiCasings;
+ }
+
+ public abstract int getCasingMeta();
+
+ public byte getTurbineShaftMeta() {
+ return 0;
+ }
+
+ public abstract int getCasingTextureIndex();
+
+ public abstract int getFuelValue(FluidStack aLiquid);
+
+ public static boolean isValidTurbine(ItemStack aTurbine) {
+ return (aTurbine != null && aTurbine.getItem() instanceof GT_MetaGenerated_Tool
+ && aTurbine.getItemDamage() >= 170
+ && aTurbine.getItemDamage() <= 176);
+ }
+
+ protected ArrayList<ItemStack> getAllBufferedTurbines() {
+ startRecipeProcessing();
+ ArrayList<ItemStack> aTurbinesInStorage = new ArrayList<>();
+ for (ItemStack aStack : getStoredInputs()) {
+ if (isValidTurbine(aStack)) {
+ int stackSize = aStack.stackSize;
+ while (stackSize > 0) {
+ int tmpStackSize = Math.min(stackSize, aStack.getMaxStackSize());
+ ItemStack copy = aStack.copy();
+ copy.stackSize = tmpStackSize;
+ aTurbinesInStorage.add(copy);
+ stackSize -= tmpStackSize;
+ }
+ }
+ }
+ endRecipeProcessing();
+ return aTurbinesInStorage;
+ }
+
+ public boolean areAllTurbinesTheSame() {
+ ArrayList<GT_MetaTileEntity_Hatch_Turbine> aTurbineAssemblies = getFullTurbineAssemblies();
+ if (aTurbineAssemblies.size() < 12) {
+ log("Found " + aTurbineAssemblies.size() + ", expected 12.");
+ return false;
+ }
+ AutoMap<Materials> aTurbineMats = new AutoMap<>();
+ AutoMap<Integer> aTurbineSizes = new AutoMap<>();
+ for (GT_MetaTileEntity_Hatch_Turbine aHatch : aTurbineAssemblies) {
+ aTurbineMats.add(GT_MetaGenerated_Tool.getPrimaryMaterial(aHatch.getTurbine()));
+ aTurbineSizes.add(getTurbineSize(aHatch.getTurbine()));
+ }
+ Materials aBaseMat = aTurbineMats.get(0);
+ int aBaseSize = aTurbineSizes.get(0);
+ for (int aSize : aTurbineSizes) {
+ if (aBaseSize != aSize) {
+ return false;
+ }
+ }
+ for (Materials aMat : aTurbineMats) {
+ if (aBaseMat != aMat) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static int getTurbineSize(ItemStack aTurbine) {
+ if (isValidTurbine(aTurbine)) {
+ if (aTurbine.getItemDamage() >= 170 && aTurbine.getItemDamage() < 172) {
+ return 1;
+ } else if (aTurbine.getItemDamage() >= 172 && aTurbine.getItemDamage() < 174) {
+ return 2;
+ } else if (aTurbine.getItemDamage() >= 174 && aTurbine.getItemDamage() < 176) {
+ return 3;
+ } else if (aTurbine.getItemDamage() >= 176 && aTurbine.getItemDamage() < 178) {
+ return 4;
+ }
+ }
+ return 0;
+ }
+
+ public static String getTurbineSizeString(int aSize) {
+ return switch (aSize) {
+ case 1 -> "Small Turbine";
+ case 2 -> "Turbine";
+ case 3 -> "Large Turbine";
+ case 4 -> "Huge Turbine";
+ default -> "";
+ };
+ }
+
+ protected ArrayList<GT_MetaTileEntity_Hatch_Turbine> getEmptyTurbineAssemblies() {
+ ArrayList<GT_MetaTileEntity_Hatch_Turbine> aEmptyTurbineRotorHatches = new ArrayList<>();
+ // log("Checking "+mTurbineRotorHatches.size()+" Assemblies for empties.");
+ for (GT_MetaTileEntity_Hatch_Turbine aTurbineHatch : this.mTurbineRotorHatches) {
+ if (!aTurbineHatch.hasTurbine()) {
+ aEmptyTurbineRotorHatches.add(aTurbineHatch);
+ }
+ }
+ return aEmptyTurbineRotorHatches;
+ }
+
+ protected ArrayList<GT_MetaTileEntity_Hatch_Turbine> getFullTurbineAssemblies() {
+ ArrayList<GT_MetaTileEntity_Hatch_Turbine> aTurbineRotorHatches = new ArrayList<>();
+ // log("Checking "+mTurbineRotorHatches.size()+" Assemblies for Turbines.");
+ for (GT_MetaTileEntity_Hatch_Turbine aTurbineHatch : this.mTurbineRotorHatches) {
+ if (aTurbineHatch.hasTurbine()) {
+ // log("Found Assembly with Turbine.");
+ aTurbineRotorHatches.add(aTurbineHatch);
+ }
+ }
+ return aTurbineRotorHatches;
+ }
+
+ protected void depleteTurbineFromStock(ItemStack aTurbine) {
+ if (aTurbine == null) {
+ return;
+ }
+ startRecipeProcessing();
+ for (GT_MetaTileEntity_Hatch_InputBus aInputBus : this.mInputBusses) {
+ for (int slot = aInputBus.getSizeInventory() - 1; slot >= 0; slot--) {
+ ItemStack aStack = aInputBus.getStackInSlot(slot);
+ if (aStack != null && GT_Utility.areStacksEqual(aStack, aTurbine)) {
+ aStack.stackSize -= aTurbine.stackSize;
+ updateSlots();
+ endRecipeProcessing();
+ return;
+ }
+ }
+ }
+ endRecipeProcessing();
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ try {
+ ArrayList<GT_MetaTileEntity_Hatch_Turbine> aEmptyTurbineRotorHatches = getEmptyTurbineAssemblies();
+ if (aEmptyTurbineRotorHatches.size() > 0) {
+ hatch: for (GT_MetaTileEntity_Hatch_Turbine aHatch : aEmptyTurbineRotorHatches) {
+ ArrayList<ItemStack> aTurbines = getAllBufferedTurbines();
+ for (ItemStack aTurbineItem : aTurbines) {
+ if (aTurbineItem == null) {
+ continue;
+ }
+ if (aHatch.insertTurbine(aTurbineItem.copy())) {
+ depleteTurbineFromStock(aTurbineItem);
+ continue hatch;
+ }
+ }
+ }
+ }
+
+ if (getEmptyTurbineAssemblies().size() > 0 || !areAllTurbinesTheSame()) {
+ stopMachine(ShutDownReasonRegistry.NO_TURBINE);
+ return CheckRecipeResultRegistry.NO_TURBINE_FOUND;
+ }
+
+ ArrayList<FluidStack> tFluids = getStoredFluids();
+
+ if (tFluids.size() > 0) {
+ if (baseEff == 0 || optFlow == 0
+ || counter >= 512
+ || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()
+ || this.getBaseMetaTileEntity()
+ .hasInventoryBeenModified()) {
+ counter = 0;
+ float aTotalBaseEff = 0;
+ float aTotalOptimalFlow = 0;
+
+ ItemStack aStack = getFullTurbineAssemblies().get(0)
+ .getTurbine();
+ aTotalBaseEff += GT_Utility.safeInt(
+ (long) ((5F + ((GT_MetaGenerated_Tool) aStack.getItem()).getToolCombatDamage(aStack)) * 1000F));
+ aTotalOptimalFlow += GT_Utility.safeInt(
+ (long) Math.max(
+ Float.MIN_NORMAL,
+ ((GT_MetaGenerated_Tool) aStack.getItem()).getToolStats(aStack)
+ .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mToolSpeed
+ * 50)
+ * getSpeedMultiplier());
+ if (aTotalOptimalFlow < 0) {
+ aTotalOptimalFlow = 100;
+ }
+
+ flowMultipliers[0] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mSteamMultiplier;
+ flowMultipliers[1] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mGasMultiplier;
+ flowMultipliers[2] = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mPlasmaMultiplier;
+ baseEff = MathUtils.roundToClosestInt(aTotalBaseEff);
+ optFlow = MathUtils.roundToClosestInt(aTotalOptimalFlow);
+ if (optFlow <= 0 || baseEff <= 0) {
+ stopMachine(ShutDownReasonRegistry.NONE); // in case the turbine got removed
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+ } else {
+ counter++;
+ }
+ }
+
+ // How much the turbine should be producing with this flow
+ long newPower = fluidIntoPower(tFluids, optFlow, baseEff, flowMultipliers);
+ long difference = newPower - this.lEUt; // difference between current output and new output
+
+ // Magic numbers: can always change by at least 10 eu/t, but otherwise by at most 1 percent of the
+ // difference in power level (per tick)
+ // This is how much the turbine can actually change during this tick
+ int maxChangeAllowed = Math.max(10, GT_Utility.safeInt(Math.abs(difference) / 100));
+
+ if (Math.abs(difference) > maxChangeAllowed) { // If this difference is too big, use the maximum allowed
+ // change
+ int change = maxChangeAllowed * (difference > 0 ? 1 : -1); // Make the change positive or negative.
+ this.lEUt += change; // Apply the change
+ } else {
+ this.lEUt = newPower;
+ }
+ if (this.lEUt <= 0) {
+ this.lEUt = 0;
+ this.mEfficiency = 0;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ } else {
+ this.mMaxProgresstime = 1;
+ this.mEfficiencyIncrease = 10;
+ // Overvoltage is handled inside the MultiBlockBase when pushing out to dynamos. no need to do it here.
+ // Play sounds (GT++ addition - GT multiblocks play no sounds)
+ enableAllTurbineHatches();
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+
+ @Override
+ public boolean doRandomMaintenanceDamage() {
+ if (getMaxParallelRecipes() == 0) {
+ stopMachine(ShutDownReasonRegistry.NO_TURBINE);
+ return false;
+ }
+
+ if (mRuntime++ > 1000) {
+ mRuntime = 0;
+
+ if (getBaseMetaTileEntity().getRandomNumber(6000) < getMaintenanceThreshold()) {
+ switch (getBaseMetaTileEntity().getRandomNumber(6)) {
+ case 0 -> mWrench = false;
+ case 1 -> mScrewdriver = false;
+ case 2 -> mSoftHammer = false;
+ case 3 -> mHardHammer = false;
+ case 4 -> mSolderingTool = false;
+ case 5 -> mCrowbar = false;
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_Turbine aHatch : getFullTurbineAssemblies()) {
+ // This cycle depletes durability from the turbine rotors.
+ // The amount of times it is run depends on turbineDamageMultiplier
+ // In XL turbines, durability loss is around 5.2-5.3x faster than in singles
+ // To compensate for that, the mEU/t scaling is divided by 5 to make it only slightly faster
+ for (int i = 0; i < getTurbineDamageMultiplier(); i++) {
+ aHatch.damageTurbine(lEUt / 5, damageFactorLow, damageFactorHigh);
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return (getFullTurbineAssemblies().size());
+ }
+
+ abstract long fluidIntoPower(ArrayList<FluidStack> aFluids, long aOptFlow, int aBaseEff, float[] flowMultipliers);
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return this.getMaxParallelRecipes() == 12 ? 10000 : 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ public boolean isLooseMode() {
+ return false;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ int mPollutionReduction = (int) (100 * mufflerReduction);
+
+ String tRunning = mMaxProgresstime > 0
+ ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.running.true")
+ + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.running.false")
+ + EnumChatFormatting.RESET;
+
+ String tMaintenance = getIdealStatus() == getRepairStatus()
+ ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false")
+ + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true")
+ + EnumChatFormatting.RESET;
+ int tDura;
+
+ StringBuilder aTurbineDamage = new StringBuilder();
+ for (GT_MetaTileEntity_Hatch_Turbine aHatch : this.getFullTurbineAssemblies()) {
+ ItemStack aTurbine = aHatch.getTurbine();
+ tDura = MathUtils.safeInt(
+ (long) (100.0f / GT_MetaGenerated_Tool.getToolMaxDamage(aTurbine)
+ * (GT_MetaGenerated_Tool.getToolDamage(aTurbine)) + 1));
+ aTurbineDamage.append(EnumChatFormatting.RED)
+ .append(GT_Utility.formatNumbers(tDura))
+ .append(EnumChatFormatting.RESET)
+ .append("% | ");
+ }
+
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ boolean aIsSteam = this.getClass()
+ .getName()
+ .toLowerCase()
+ .contains("steam");
+
+ String[] ret = new String[] {
+ // 8 Lines available for information panels
+ tRunning + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(((lEUt * mEfficiency) / 10000))
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ tMaintenance,
+ StatCollector.translateToLocal("GT5U.turbine.efficiency") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers((mEfficiency / 100F))
+ + EnumChatFormatting.RESET
+ + "%",
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("GT5U.turbine.flow") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(MathUtils.safeInt((long) realOptFlow))
+ + EnumChatFormatting.RESET
+ + " L/s"
+ + EnumChatFormatting.YELLOW
+ + " ("
+ + (isLooseMode() ? StatCollector.translateToLocal("GT5U.turbine.loose")
+ : StatCollector.translateToLocal("GT5U.turbine.tight"))
+ + ")",
+ StatCollector.translateToLocal("GT5U.turbine.fuel") + ": "
+ + EnumChatFormatting.GOLD
+ + GT_Utility.formatNumbers(storedFluid)
+ + EnumChatFormatting.RESET
+ + "L",
+ StatCollector.translateToLocal("GT5U.turbine.dmg") + ": " + aTurbineDamage,
+ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mPollutionReduction)
+ + EnumChatFormatting.RESET
+ + " %" };
+ if (!aIsSteam) ret[4] = StatCollector.translateToLocal("GT5U.turbine.flow") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(MathUtils.safeInt((long) realOptFlow))
+ + EnumChatFormatting.RESET
+ + " L/t";
+ return ret;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public boolean polluteEnvironment(int aPollutionLevel) {
+ if (this.requiresMufflers()) {
+ mPollution += aPollutionLevel * getPollutionMultiplier() * mufflerReduction;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ if (mPollution >= 10000) {
+ if (PollutionUtils.addPollution(this.getBaseMetaTileEntity(), 10000)) {
+ mPollution -= 10000;
+ }
+ } else {
+ break;
+ }
+ }
+ return mPollution < 10000;
+ }
+ return true;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ // This should not be a hard limit, due to TecTech dynamos
+ if (mFastMode) {
+ return 64;
+ } else {
+ return 16;
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setBoolean("mFastMode", mFastMode);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mFastMode = aNBT.getBoolean("mFastMode");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mFastMode = !mFastMode;
+ if (mFastMode) {
+ PlayerUtils.messagePlayer(aPlayer, "Running in Fast (48x) Mode.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Running in Slow (16x) Mode.");
+ }
+ }
+
+ public final ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side,
+ ForgeDirection facing, int aColorIndex, boolean aActive, boolean aRedstone) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[1][aColorIndex + 1],
+ facing == side ? getFrontFacingTurbineTexture(aActive)
+ : Textures.BlockIcons.getCasingTextureForId(getCasingTextureIndex()) };
+ }
+
+ protected ITexture getFrontFacingTurbineTexture(boolean isActive) {
+ if (isActive) {
+ return frontFaceActive;
+ }
+ return frontFace;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (this.maxProgresstime() > 0 || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()) {
+ enableAllTurbineHatches();
+ }
+ if (this.maxProgresstime() <= 0) {
+ stopMachine(ShutDownReasonRegistry.NONE);
+ }
+ }
+ }
+
+ @Override
+ public void stopMachine(@NotNull ShutDownReason reason) {
+ baseEff = 0;
+ optFlow = 0;
+ disableAllTurbineHatches();
+ super.stopMachine(reason);
+ }
+
+ @Override
+ public void onRemoval() {
+ super.onRemoval();
+ for (GT_MetaTileEntity_Hatch_Turbine h : this.mTurbineRotorHatches) {
+ h.clearController();
+ }
+ disableAllTurbineHatches();
+ this.mTurbineRotorHatches.clear();
+ }
+
+ public void enableAllTurbineHatches() {
+ updateTurbineHatches(this.isMachineRunning());
+ }
+
+ public void disableAllTurbineHatches() {
+ updateTurbineHatches(false);
+ }
+
+ private Long mLastHatchUpdate;
+
+ public void updateTurbineHatches(boolean aState) {
+ if (mLastHatchUpdate == null) {
+ mLastHatchUpdate = System.currentTimeMillis() / 1000;
+ }
+ if (this.mTurbineRotorHatches.isEmpty() || ((System.currentTimeMillis() / 1000) - mLastHatchUpdate) <= 2) {
+ return;
+ }
+ for (GT_MetaTileEntity_Hatch_Turbine h : filterValidMTEs(this.mTurbineRotorHatches)) {
+ h.setActive(aState);
+ }
+
+ mLastHatchUpdate = System.currentTimeMillis() / 1000;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> d == ForgeDirection.UP;
+ }
+
+ /**
+ * Called every tick the Machine runs
+ */
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (lEUt > 0) {
+ addEnergyOutput((lEUt * mEfficiency) / 10000);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addEnergyOutput(long aEU) {
+ if (aEU <= 0) {
+ return true;
+ }
+ if (this.mAllDynamoHatches.size() > 0) {
+ return addEnergyOutputMultipleDynamos(aEU, true);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addEnergyOutputMultipleDynamos(long aEU, boolean aAllowMixedVoltageDynamos) {
+ int injected = 0;
+ long aFirstVoltageFound = -1;
+ for (GT_MetaTileEntity_Hatch aDynamo : filterValidMTEs(mAllDynamoHatches)) {
+ long aVoltage = aDynamo.maxEUOutput();
+ // Check against voltage to check when hatch mixing
+ if (aFirstVoltageFound == -1) {
+ aFirstVoltageFound = aVoltage;
+ }
+ }
+
+ long leftToInject;
+ long aVoltage;
+ int aAmpsToInject;
+ int aRemainder;
+ int ampsOnCurrentHatch;
+ for (GT_MetaTileEntity_Hatch aDynamo : filterValidMTEs(mAllDynamoHatches)) {
+ leftToInject = aEU - injected;
+ aVoltage = aDynamo.maxEUOutput();
+ aAmpsToInject = (int) (leftToInject / aVoltage);
+ aRemainder = (int) (leftToInject - (aAmpsToInject * aVoltage));
+ ampsOnCurrentHatch = (int) Math.min(aDynamo.maxAmperesOut(), aAmpsToInject);
+
+ // add full amps
+ aDynamo.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits(aVoltage * ampsOnCurrentHatch, false);
+ injected += aVoltage * ampsOnCurrentHatch;
+
+ // add reminder
+ if (aRemainder > 0 && ampsOnCurrentHatch < aDynamo.maxAmperesOut()) {
+ aDynamo.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits(aRemainder, false);
+ injected += aRemainder;
+ }
+ }
+ return injected > 0;
+ }
+
+ public int getSpeedMultiplier() {
+ return mFastMode ? 48 : 16;
+ }
+
+ public int getMaintenanceThreshold() {
+ return mFastMode ? 12 : 1;
+ }
+
+ public int getPollutionMultiplier() {
+ return mFastMode ? 3 : 1;
+ }
+
+ public int getTurbineDamageMultiplier() {
+ return mFastMode ? 3 : 1;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java
new file mode 100644
index 0000000000..67244cb399
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java
@@ -0,0 +1,939 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.storage;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onlyIf;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.Mods.TecTech;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.TTDynamo;
+import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase.GTPPHatchElement.TTEnergy;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants.NBT;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.alignment.constructable.ChannelDataAccessor;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.drawable.Text;
+import com.gtnewhorizons.modularui.api.forge.PlayerMainInvWrapper;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.TAE;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.MovingAverageLong;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.preloader.asm.AsmConfig;
+import gtPlusPlus.xmod.gregtech.api.gui.GTPP_UITextures;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
+
+public class GregtechMetaTileEntity_PowerSubStationController extends
+ GregtechMeta_MultiBlockBase<GregtechMetaTileEntity_PowerSubStationController> implements ISurvivalConstructable {
+
+ private static enum TopState {
+ MayBeTop,
+ Top,
+ NotTop
+ }
+
+ protected long mAverageEuUsage = 0;
+ protected final MovingAverageLong mAverageEuAdded = new MovingAverageLong(20);
+ protected final MovingAverageLong mAverageEuConsumed = new MovingAverageLong(20);
+ protected long mTotalEnergyAdded = 0;
+ protected long mTotalEnergyConsumed = 0;
+ protected long mTotalEnergyLost = 0;
+ protected boolean mIsOutputtingPower = false;
+ protected long mBatteryCapacity = 0;
+
+ private final int ENERGY_TAX = 5;
+
+ private int mCasing;
+ private int[] cellCount = new int[6];
+ private TopState topState = TopState.MayBeTop;
+ private static IStructureDefinition<GregtechMetaTileEntity_PowerSubStationController> STRUCTURE_DEFINITION = null;
+
+ public GregtechMetaTileEntity_PowerSubStationController(final int aID, final String aName,
+ final String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GregtechMetaTileEntity_PowerSubStationController(final String aName) {
+ super(aName);
+ }
+
+ @Override
+ public String getMachineType() {
+ return "Energy Buffer";
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType(getMachineType())
+ .addInfo("Consumes " + this.ENERGY_TAX + "% of the average voltage of all energy type hatches")
+ .addInfo("Does not require maintenance")
+ .addInfo(
+ "Can be built with variable height between " + (CELL_HEIGHT_MIN + 2) + "-" + (CELL_HEIGHT_MAX + 2) + "")
+ .addInfo("Hatches can be placed nearly anywhere")
+ .addInfo("HV Energy/Dynamo Hatches are the lowest tier you can use")
+ .addInfo("Supports voltages >= UHV using MAX tier components.")
+ .addSeparator()
+ .addController("Bottom Center")
+ .addCasingInfoMin("Sub-Station External Casings", 10, false)
+ .addDynamoHatch("Any Casing", 1)
+ .addEnergyHatch("Any Casing", 1)
+ .addSubChannelUsage("capacitor", "Vanadium Capacitor Cell Tier")
+ .addSubChannelUsage("height", "Height of structure")
+ .toolTipFinisher(CORE.GT_Tooltip_Builder.get());
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(24)),
+ new GT_RenderedTexture(
+ aActive ? Textures.BlockIcons.OVERLAY_FRONT_DISASSEMBLER_ACTIVE
+ : Textures.BlockIcons.OVERLAY_FRONT_DISASSEMBLER) };
+ }
+ if (side == this.getBaseMetaTileEntity()
+ .getBackFacing()) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(24)),
+ mIsOutputtingPower ? Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[(int) this.getOutputTier()]
+ : Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[(int) this.getInputTier()] };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TAE.GTPP_INDEX(23)) };
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ // if (mBatteryCapacity <= 0) return false;
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ private void checkMachineProblem(String msg, int xOff, int yOff, int zOff) {
+ final IGregTechTileEntity te = this.getBaseMetaTileEntity();
+ final Block tBlock = te.getBlockOffset(xOff, yOff, zOff);
+ final byte tMeta = te.getMetaIDOffset(xOff, yOff, zOff);
+ String name = tBlock.getLocalizedName();
+ String problem = msg + ": (" + xOff + ", " + yOff + ", " + zOff + ") " + name + ":" + tMeta;
+ checkMachineProblem(problem);
+ }
+
+ private void checkMachineProblem(String msg) {
+ if (!AsmConfig.disableAllLogging) {
+ Logger.INFO("Power Sub-Station problem: " + msg);
+ }
+ }
+
+ public static int getCellTier(Block aBlock, int aMeta) {
+ if (aBlock == ModBlocks.blockCasings2Misc && aMeta == 7) {
+ return 4;
+ } else if (aBlock == ModBlocks.blockCasings3Misc && aMeta == 4) {
+ return 5;
+ } else if (aBlock == ModBlocks.blockCasings3Misc && aMeta == 5) {
+ return 6;
+ } else if (aBlock == ModBlocks.blockCasings3Misc && aMeta == 6) {
+ return 7;
+ } else if (aBlock == ModBlocks.blockCasings3Misc && aMeta == 7) {
+ return 8;
+ } else if (aBlock == ModBlocks.blockCasings3Misc && aMeta == 8) {
+ return 9;
+ } else {
+ return -1;
+ }
+ }
+
+ public static int getMetaFromTier(int tier) {
+ if (tier == 4) return 7;
+ if (tier >= 5 && tier <= 9) return tier - 1;
+ return 0;
+ }
+
+ public static Block getBlockFromTier(int tier) {
+ return switch (tier) {
+ case 4 -> ModBlocks.blockCasings2Misc;
+ case 5, 6, 7, 8, 9 -> ModBlocks.blockCasings3Misc;
+ default -> null;
+ };
+ }
+
+ public static int getMaxHatchTier(int aCellTier) {
+ switch (aCellTier) {
+ case 9 -> {
+ return GT_Values.VOLTAGE_NAMES[9].equals("Ultimate High Voltage") ? 15 : 9;
+ }
+ default -> {
+ if (aCellTier < 4) {
+ return 0;
+ } else {
+ return aCellTier;
+ }
+ }
+ }
+ }
+
+ public static final int CELL_HEIGHT_MAX = 16;
+ public static final int CELL_HEIGHT_MIN = 2;
+
+ @Override
+ public IStructureDefinition<GregtechMetaTileEntity_PowerSubStationController> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<GregtechMetaTileEntity_PowerSubStationController>builder()
+ .addShape(
+ mName + "bottom",
+ transpose(new String[][] { { "BB~BB", "BBBBB", "BBBBB", "BBBBB", "BBBBB" } }))
+ .addShape(
+ mName + "layer",
+ transpose(new String[][] { { "CCCCC", "CIIIC", "CIIIC", "CIIIC", "CCCCC" } }))
+ .addShape(mName + "mid", transpose(new String[][] { { "CCCCC", "CHHHC", "CHHHC", "CHHHC", "CCCCC" } }))
+ .addShape(mName + "top", transpose(new String[][] { { "TTTTT", "TTTTT", "TTTTT", "TTTTT", "TTTTT" } }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GregtechMetaTileEntity_PowerSubStationController.class)
+ .atLeast(Energy.or(TTEnergy), Dynamo.or(TTDynamo), Maintenance)
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .casingIndex(TAE.GTPP_INDEX(24))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 8))))
+ .addElement(
+ 'B',
+ buildHatchAdder(GregtechMetaTileEntity_PowerSubStationController.class)
+ .atLeast(Energy.or(TTEnergy), Dynamo.or(TTDynamo), Maintenance)
+ .disallowOnly(ForgeDirection.UP)
+ .casingIndex(TAE.GTPP_INDEX(24))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 8))))
+ .addElement(
+ 'T',
+ buildHatchAdder(GregtechMetaTileEntity_PowerSubStationController.class)
+ .atLeast(Energy.or(TTEnergy), Dynamo.or(TTDynamo), Maintenance)
+ .disallowOnly(ForgeDirection.DOWN)
+ .casingIndex(TAE.GTPP_INDEX(24))
+ .dot(1)
+ .buildAndChain(onElementPass(x -> ++x.mCasing, ofBlock(ModBlocks.blockCasings2Misc, 8))))
+ .addElement(
+ 'I',
+ withChannel(
+ "cell",
+ ofChain(
+ onlyIf(
+ x -> x.topState != TopState.NotTop,
+ onElementPass(
+ x -> x.topState = TopState.Top,
+ ofHatchAdderOptional(
+ GregtechMetaTileEntity_PowerSubStationController::addPowerSubStationList,
+ TAE.GTPP_INDEX(24),
+ 1,
+ ModBlocks.blockCasings2Misc,
+ 8))),
+ onlyIf(
+ x -> x.topState != TopState.Top,
+ onElementPass(
+ x -> x.topState = TopState.NotTop,
+ ofChain(
+ onElementPass(x -> ++x.cellCount[0], ofCell(4)),
+ onElementPass(x -> ++x.cellCount[1], ofCell(5)),
+ onElementPass(x -> ++x.cellCount[2], ofCell(6)),
+ onElementPass(x -> ++x.cellCount[3], ofCell(7)),
+ onElementPass(x -> ++x.cellCount[4], ofCell(8)),
+ onElementPass(x -> ++x.cellCount[5], ofCell(9))))))))
+ .addElement('H', ofCell(4))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ public static <T> IStructureElement<T> ofCell(int aIndex) {
+ return new IStructureElement<T>() {
+
+ @Override
+ public boolean check(T t, World world, int x, int y, int z) {
+ Block block = world.getBlock(x, y, z);
+ int meta = world.getBlockMetadata(x, y, z);
+ int tier = getCellTier(block, meta);
+ return aIndex == tier;
+ }
+
+ public int getIndex(int size) {
+ if (size > 6) size = 6;
+ return size + 3;
+ }
+
+ @Override
+ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
+ StructureLibAPI.hintParticle(
+ world,
+ x,
+ y,
+ z,
+ getBlockFromTier(getIndex(trigger.stackSize)),
+ getMetaFromTier(getIndex(trigger.stackSize)));
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
+ return world.setBlock(
+ x,
+ y,
+ z,
+ getBlockFromTier(getIndex(trigger.stackSize)),
+ getMetaFromTier(getIndex(trigger.stackSize)),
+ 3);
+ }
+
+ @Nullable
+ @Override
+ public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ return BlocksToPlace.create(getBlockFromTier(trigger.stackSize), getMetaFromTier(trigger.stackSize));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ Block block = world.getBlock(x, y, z);
+ int meta = world.getBlockMetadata(x, y, z);
+ int tier = getCellTier(block, meta);
+ if (tier >= 0) return PlaceResult.SKIP;
+ return StructureUtility.survivalPlaceBlock(
+ getBlockFromTier(getIndex(trigger.stackSize)),
+ getMetaFromTier(getIndex(trigger.stackSize)),
+ world,
+ x,
+ y,
+ z,
+ env.getSource(),
+ env.getActor(),
+ env.getChatter());
+ }
+ };
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ int layer = Math.min(stackSize.stackSize + 3, 18);
+ log("Layer: " + layer);
+ log("Building 0");
+ buildPiece(mName + "bottom", stackSize, hintsOnly, 2, 0, 0);
+ log("Built 0");
+ for (int i = 1; i < layer - 1; i++) {
+ log("Building " + i);
+ buildPiece(mName + "mid", stackSize, hintsOnly, 2, i, 0);
+ log("Built " + i);
+ }
+ log("Building " + (layer - 1));
+ buildPiece(mName + "top", stackSize, hintsOnly, 2, layer - 1, 0);
+ log("Built " + (layer - 1));
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int layer = Math.min(ChannelDataAccessor.getChannelData(stackSize, "height") + 3, 18);
+ int built;
+ built = survivialBuildPiece(mName + "bottom", stackSize, 2, 0, 0, elementBudget, env, false, true);
+ if (built >= 0) return built;
+ for (int i = 1; i < layer - 1; i++) {
+ built = survivialBuildPiece(mName + "mid", stackSize, 2, i, 0, elementBudget, env, false, true);
+ if (built >= 0) return built;
+ }
+ return survivialBuildPiece(mName + "top", stackSize, 2, layer - 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasing = 0;
+ mEnergyHatches.clear();
+ mDynamoHatches.clear();
+ mTecTechEnergyHatches.clear();
+ mTecTechDynamoHatches.clear();
+ mAllEnergyHatches.clear();
+ mAllDynamoHatches.clear();
+ for (int i = 0; i < 6; i++) {
+ cellCount[i] = 0;
+ }
+ log("Checking 0");
+ if (!checkPiece(mName + "bottom", 2, 0, 0)) {
+ log("Failed on Layer 0");
+ return false;
+ }
+ log("Pass 0");
+ int layer = 1;
+ topState = TopState.MayBeTop;
+ while (true) {
+ if (!checkPiece(mName + "layer", 2, layer, 0)) return false;
+ layer++;
+ if (topState == TopState.Top) break; // top found, break out
+ topState = TopState.MayBeTop;
+ if (layer > 18) return false; // too many layers
+ }
+ int level = 0;
+ for (int i = 0; i < 6; i++) {
+ if (cellCount[i] != 0) {
+ if (level == 0) {
+ level = i + 4;
+ } else {
+ return false;
+ }
+ }
+ }
+ int tier = getMaxHatchTier(level);
+ long volSum = 0;
+ for (GT_MetaTileEntity_Hatch hatch : mAllDynamoHatches) {
+ if (hatch.mTier > tier || hatch.mTier < 3) {
+ return false;
+ }
+ volSum += (8L << (hatch.mTier * 2));
+ }
+ for (GT_MetaTileEntity_Hatch hatch : mAllEnergyHatches) {
+ if (hatch.mTier > tier || hatch.mTier < 3) {
+ return false;
+ }
+ volSum += (8L << (hatch.mTier * 2));
+ }
+ mBatteryCapacity = getCapacityFromCellTier(level) * cellCount[level - 4];
+ if (mAllEnergyHatches.size() + mAllDynamoHatches.size() > 0) {
+ mAverageEuUsage = volSum / (mAllEnergyHatches.size() + mAllDynamoHatches.size());
+ } else mAverageEuUsage = 0;
+ fixAllMaintenanceIssue();
+ return true;
+ }
+
+ public final boolean addPowerSubStationList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ } else {
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (TecTech.isModLoaded()) {
+ if (isThisHatchMultiDynamo(aMetaTileEntity)) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ } else if (isThisHatchMultiEnergy(aMetaTileEntity)) {
+ return addToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+ }
+ }
+ return false;
+ }
+
+ // Define storage capacity of smallest cell tier (EV) and compute higher tiers from it
+ private static final long CELL_TIER_EV_CAPACITY = 100 * 1000 * 1000;
+ private static final long CELL_TIER_MULTIPLIER = 4; // each tier's capacity is this many times the previous tier
+
+ public static long getCapacityFromCellTier(int aOverallCellTier) {
+ // Use integer math instead of `Math.pow` to avoid range/precision errors
+ if (aOverallCellTier < 4) return 0;
+ aOverallCellTier -= 4;
+ long capacity = CELL_TIER_EV_CAPACITY;
+ while (aOverallCellTier > 0) {
+ capacity *= CELL_TIER_MULTIPLIER;
+ aOverallCellTier--;
+ }
+ return capacity;
+ }
+
+ @Override
+ public int getMaxEfficiency(final ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaTileEntity_PowerSubStationController(this.mName);
+ }
+
+ // mTotalEnergyAdded
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setLong("mAverageEuUsage", this.mAverageEuUsage);
+ this.mAverageEuAdded.write(aNBT, "mAverageEuAdded");
+ this.mAverageEuConsumed.write(aNBT, "mAverageEuConsumed");
+
+ // Usage Stats
+ aNBT.setLong("mTotalEnergyAdded", this.mTotalEnergyAdded);
+ aNBT.setLong("mTotalEnergyLost", this.mTotalEnergyLost);
+ aNBT.setLong("mTotalEnergyConsumed", this.mTotalEnergyConsumed);
+ aNBT.setLong("mTotalRunTime", this.mTotalRunTime);
+ aNBT.setBoolean("mIsOutputtingPower", this.mIsOutputtingPower);
+ aNBT.setLong("mBatteryCapacity", this.mBatteryCapacity);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+
+ // Best not to get a long if the Tag Map is holding an int
+ if (aNBT.hasKey("mAverageEuUsage")) {
+ this.mAverageEuUsage = aNBT.getLong("mAverageEuUsage");
+ }
+ switch (aNBT.func_150299_b("mAverageEuAdded")) {
+ case NBT.TAG_BYTE_ARRAY -> this.mAverageEuAdded.read(aNBT, "mAverageEuAdded");
+ case NBT.TAG_LONG -> this.mAverageEuAdded.set(aNBT.getLong("mAverageEuAdded"));
+ }
+ switch (aNBT.func_150299_b("mAverageEuConsumed")) {
+ case NBT.TAG_BYTE_ARRAY -> this.mAverageEuConsumed.read(aNBT, "mAverageEuConsumed");
+ case NBT.TAG_LONG -> this.mAverageEuConsumed.set(aNBT.getLong("mAverageEuConsumed"));
+ }
+
+ // Usage Stats
+ this.mTotalEnergyAdded = aNBT.getLong("mTotalEnergyAdded");
+ this.mTotalEnergyLost = aNBT.getLong("mTotalEnergyLost");
+ this.mTotalEnergyConsumed = aNBT.getLong("mTotalEnergyConsumed");
+ this.mTotalRunTime = aNBT.getLong("mTotalRunTime");
+
+ this.mIsOutputtingPower = aNBT.getBoolean("mIsOutputtingPower");
+
+ this.mBatteryCapacity = aNBT.getLong("mBatteryCapacity");
+
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public @NotNull CheckRecipeResult checkProcessing() {
+ this.mProgresstime = 0;
+ this.mMaxProgresstime = 200;
+ this.lEUt = 0;
+ this.mEfficiencyIncrease = 10000;
+ this.fixAllMaintenanceIssue();
+ return SimpleCheckRecipeResult.ofSuccess("managing_power");
+ }
+
+ @Override
+ public int getMaxParallelRecipes() {
+ return 1;
+ }
+
+ private long drawEnergyFromHatch(MetaTileEntity aHatch) {
+ long stored = aHatch.getEUVar();
+ long voltage = aHatch.maxEUInput() * aHatch.maxAmperesIn();
+
+ if (voltage > stored || (voltage + this.getEUVar() > this.mBatteryCapacity)) {
+ return 0;
+ }
+
+ if (this.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits(voltage, false)) {
+ aHatch.setEUVar((stored - voltage));
+ this.mTotalEnergyAdded += voltage;
+ return voltage;
+ }
+ return 0;
+ }
+
+ private long addEnergyToHatch(MetaTileEntity aHatch) {
+ long voltage = aHatch.maxEUOutput() * aHatch.maxAmperesOut();
+
+ if (aHatch.getEUVar() > aHatch.maxEUStore() - voltage) {
+ return 0;
+ }
+
+ if (this.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(voltage, false)) {
+ aHatch.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits(voltage, false);
+ this.mTotalEnergyConsumed += voltage;
+ return voltage;
+ }
+ return 0;
+ }
+
+ private long computeEnergyTax() {
+ float mTax = mAverageEuUsage * (ENERGY_TAX / 100f);
+
+ // Increase tax up to 2x if machine is not fully repaired (does not actually work at the moment, mEfficiency is
+ // always 0)
+ // mTax = mTax * (1f + (10000f - mEfficiency) / 10000f);
+
+ return MathUtils.roundToClosestLong(mTax);
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ this.fixAllMaintenanceIssue();
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ // First, decay overcharge (1% of stored energy plus 1000 EU per tick)
+ if (this.getEUVar() > this.mBatteryCapacity) {
+ long energy = (long) (this.getEUVar() * 0.990f) - 1000;
+ this.setEUVar(energy);
+ }
+
+ // Pay Tax
+ long mDecrease = computeEnergyTax();
+ this.mTotalEnergyLost += Math.min(mDecrease, this.getEUVar());
+ this.setEUVar(Math.max(0, this.getEUVar() - mDecrease));
+
+ long aInputAverage = 0;
+ long aOutputAverage = 0;
+ // Input Power
+ for (GT_MetaTileEntity_Hatch THatch : filterValidMTEs(this.mDischargeHatches)) {
+ aInputAverage += drawEnergyFromHatch(THatch);
+ }
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(this.mAllEnergyHatches)) {
+ aInputAverage += drawEnergyFromHatch(tHatch);
+ }
+
+ // Output Power
+ for (GT_MetaTileEntity_Hatch THatch : filterValidMTEs(this.mChargeHatches)) {
+ aOutputAverage += addEnergyToHatch(THatch);
+ }
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(this.mAllDynamoHatches)) {
+ aOutputAverage += addEnergyToHatch(tHatch);
+ }
+ // reset progress time
+ mProgresstime = 0;
+
+ this.mAverageEuAdded.sample(aInputAverage);
+ this.mAverageEuConsumed.sample(aOutputAverage);
+
+ return true;
+ }
+
+ @Override
+ public boolean drainEnergyInput(long aEU) {
+ // Not applicable to this machine
+ return true;
+ }
+
+ @Override
+ public boolean addEnergyOutput(long aEU) {
+ // Not applicable to this machine
+ return true;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return mBatteryCapacity;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public String[] getExtraInfoData() {
+ String mode;
+ if (mIsOutputtingPower) {
+ mode = EnumChatFormatting.GOLD + "Output" + EnumChatFormatting.RESET;
+ } else {
+ mode = EnumChatFormatting.BLUE + "Input" + EnumChatFormatting.RESET;
+ }
+
+ String storedEnergyText;
+ if (this.getEUVar() > this.mBatteryCapacity) {
+ storedEnergyText = EnumChatFormatting.RED + GT_Utility.formatNumbers(this.getEUVar())
+ + EnumChatFormatting.RESET;
+ } else {
+ storedEnergyText = EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.getEUVar())
+ + EnumChatFormatting.RESET;
+ }
+
+ int errorCode = this.getBaseMetaTileEntity()
+ .getErrorDisplayID();
+ boolean mMaint = (errorCode != 0);
+
+ return new String[] { "Ergon Energy - District Sub-Station", "Stored EU: " + storedEnergyText,
+ "Capacity: " + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(this.maxEUStore())
+ + EnumChatFormatting.RESET,
+ "Running Costs: " + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(this.computeEnergyTax())
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ "Controller Mode: " + mode,
+ "Requires Maintenance: " + (!mMaint ? EnumChatFormatting.GREEN : EnumChatFormatting.RED)
+ + mMaint
+ + EnumChatFormatting.RESET
+ + " | Code: ["
+ + (!mMaint ? EnumChatFormatting.GREEN : EnumChatFormatting.RED)
+ + errorCode
+ + EnumChatFormatting.RESET
+ + "]",
+ "----------------------", "Stats for Nerds",
+ "Average Input: " + EnumChatFormatting.BLUE
+ + GT_Utility.formatNumbers(this.getAverageEuAdded())
+ + EnumChatFormatting.RESET
+ + " EU",
+ "Average Output: " + EnumChatFormatting.GOLD
+ + GT_Utility.formatNumbers(this.getAverageEuConsumed())
+ + EnumChatFormatting.RESET
+ + " EU",
+ "Total Input: " + EnumChatFormatting.BLUE
+ + GT_Utility.formatNumbers(this.mTotalEnergyAdded)
+ + EnumChatFormatting.RESET
+ + " EU",
+ "Total Output: " + EnumChatFormatting.GOLD
+ + GT_Utility.formatNumbers(this.mTotalEnergyConsumed)
+ + EnumChatFormatting.RESET
+ + " EU",
+ "Total Costs: " + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(this.mTotalEnergyLost)
+ + EnumChatFormatting.RESET
+ + " EU", };
+ }
+
+ @Override
+ public void explodeMultiblock() {
+ // TODO Auto-generated method stub
+ super.explodeMultiblock();
+ }
+
+ @Override
+ public void doExplosion(long aExplosionPower) {
+ // TODO Auto-generated method stub
+ super.doExplosion(aExplosionPower);
+ }
+
+ @Override
+ public long getMaxInputVoltage() {
+ return 32768;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return !mIsOutputtingPower;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return mIsOutputtingPower;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return (side == this.getBaseMetaTileEntity()
+ .getBackFacing() && !mIsOutputtingPower);
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return (side == this.getBaseMetaTileEntity()
+ .getBackFacing() && mIsOutputtingPower);
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 32;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 32;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 32768;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 32768;
+ }
+
+ public final long getAverageEuAdded() {
+ return this.mAverageEuAdded.get();
+ }
+
+ public final long getAverageEuConsumed() {
+ return this.mAverageEuConsumed.get();
+ }
+
+ @Override
+ public void onModeChangeByScrewdriver(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mIsOutputtingPower = !mIsOutputtingPower;
+ if (mIsOutputtingPower) {
+ PlayerUtils.messagePlayer(aPlayer, "Sub-Station is now outputting power from the controller.");
+ } else {
+ PlayerUtils.messagePlayer(aPlayer, "Sub-Station is now inputting power into the controller.");
+ }
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+
+ @Override
+ public int getGUIWidth() {
+ return 196;
+ }
+
+ @Override
+ public int getGUIHeight() {
+ return 191;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(175, 166));
+ }
+
+ private long clientEUIn, clientEUOut, clientEULoss, clientEUStored;
+ private float clientProgress;
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(4, 4)
+ .setSize(149, 149))
+ .widget(new SlotWidget(inventoryHandler, 0).setPos(154, 4))
+ .widget(
+ new SlotWidget(inventoryHandler, 1).setAccess(true, false)
+ .setPos(154, 22))
+ .widget(
+ SlotGroup.ofItemHandler(new PlayerMainInvWrapper(buildContext.getPlayer().inventory), 9)
+ .endAtSlot(8)
+ .build()
+ .setPos(7, 166))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> getBaseMetaTileEntity().getErrorDisplayID() == 0
+ ? getBaseMetaTileEntity().isActive() ? "Running perfectly" : "Turn on with Mallet"
+ : "")
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 8))
+ .widget(
+ new FakeSyncWidget.BooleanSyncer(
+ () -> getBaseMetaTileEntity().isActive(),
+ val -> getBaseMetaTileEntity().setActive(val)))
+ .widget(
+ new FakeSyncWidget.IntegerSyncer(
+ () -> getBaseMetaTileEntity().getErrorDisplayID(),
+ val -> getBaseMetaTileEntity().setErrorDisplayID(val)))
+ .widget(
+ new TextWidget("In").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(178, 10))
+ .widget(
+ new TextWidget("Out").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(176, 28))
+ .widget(new FakeSyncWidget.LongSyncer(this::getAverageEuAdded, val -> clientEUIn = val))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "Avg In: " + numberFormat.format(clientEUIn) + " EU")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 20))
+ .widget(new FakeSyncWidget.LongSyncer(this::getAverageEuConsumed, val -> clientEUOut = val))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "Avg Out: " + numberFormat.format(clientEUOut) + " EU")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 30))
+ .widget(new FakeSyncWidget.LongSyncer(this::computeEnergyTax, val -> clientEULoss = val))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(() -> "Powerloss: " + numberFormat.format(clientEULoss) + " EU per tick")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 40))
+ .widget(
+ new DrawableWidget().setDrawable(GTPP_UITextures.PICTURE_ENERGY_FRAME)
+ .setPos(4, 155)
+ .setSize(149, 7))
+ .widget(new FakeSyncWidget.FloatSyncer(this::getProgress, val -> clientProgress = val))
+ .widget(
+ new ProgressBar().setProgress(this::getProgress)
+ .setTexture(GTPP_UITextures.PROGRESSBAR_PSS_ENERGY, 147)
+ .setDirection(ProgressBar.Direction.RIGHT)
+ .setPos(5, 156)
+ .setSize(147, 5))
+ .widget(
+ new TextWidget("Stored:").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 132))
+ .widget(
+ new FakeSyncWidget.LongSyncer(() -> getBaseMetaTileEntity().getStoredEU(), val -> clientEUStored = val))
+ .widget(new TextWidget().setTextSupplier(() -> {
+ int colorScale = (int) (clientProgress * 100 * 2.55);
+ return new Text(numberFormat.format(clientEUStored) + " EU")
+ .color(Utils.rgbtoHexValue((255 - colorScale), colorScale, 0));
+ })
+ .setPos(10, 142))
+ .widget(
+ new TextWidget().setStringSupplier(() -> numberFormat.format(clientProgress * 100) + "%")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(70, 155));
+ }
+
+ private float getProgress() {
+ return (float) getBaseMetaTileEntity().getStoredEU() / getBaseMetaTileEntity().getEUCapacity();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/misc/TileEntitySolarHeater.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/misc/TileEntitySolarHeater.java
new file mode 100644
index 0000000000..141f4bbc43
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/misc/TileEntitySolarHeater.java
@@ -0,0 +1,343 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.misc;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_SolarTower;
+
+public class TileEntitySolarHeater extends GT_MetaTileEntity_TieredMachineBlock {
+
+ public boolean mHasTower = false;
+ private GregtechMetaTileEntity_SolarTower mTower = null;
+
+ private int mTX, mTY, mTZ;
+ private Byte mRequiredFacing;
+
+ public TileEntitySolarHeater(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final String aDescription, final int aSlotCount) {
+ super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription);
+ }
+
+ public TileEntitySolarHeater(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures, final int aSlotCount) {
+ super(aName, aTier, aSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.addAll(this.mDescriptionArray, "Point me at a Solar Tower", CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top),
+ new GT_RenderedTexture(Textures.BlockIcons.SOLARPANEL_IV) };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top),
+ new GT_RenderedTexture(Textures.BlockIcons.SOLARPANEL_LuV) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top),
+ new GT_RenderedTexture(Textures.BlockIcons.SOLARPANEL_IV) };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top),
+ new GT_RenderedTexture(Textures.BlockIcons.SOLARPANEL_IV) };
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top) };
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Bottom) };
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top),
+ new GT_RenderedTexture(Textures.BlockIcons.SOLARPANEL_LuV) };
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { new GT_RenderedTexture(TexturesGtBlock.Casing_Machine_Simple_Top),
+ new GT_RenderedTexture(Textures.BlockIcons.SOLARPANEL_IV) };
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new TileEntitySolarHeater(this.mName, this.mTier, this.mDescriptionArray, this.mTextures, 0);
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { this.getLocalName(), "Testificate" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer p_70300_1_) {
+ return false;
+ }
+
+ public boolean allowCoverOnSide(final byte aSide, final int aCoverID) {
+ return false;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ return new int[] {};
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int p_70301_1_) {
+ return null;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 0;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 0;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 0;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return facing.offsetY == 0;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ /*
+ * aNBT.setBoolean("mHasTower", mHasTower); if (this.mHasTower) { aNBT.setInteger("mTX", mTX);
+ * aNBT.setInteger("mTY", mTY); aNBT.setInteger("mTZ", mTZ); }
+ */
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ /*
+ * this.mHasTower = aNBT.getBoolean("mHasTower"); if (this.mHasTower) { if (aNBT.hasKey("mTX")) this.mTX =
+ * aNBT.getInteger("mTX"); if (aNBT.hasKey("mTY")) this.mTY = aNBT.getInteger("mTY"); if (aNBT.hasKey("mTZ"))
+ * this.mTZ = aNBT.getInteger("mTZ"); }
+ */
+ }
+
+ @Override
+ public long getInputTier() {
+ return 0;
+ }
+
+ @Override
+ public long getOutputTier() {
+ return 0;
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onExplosion() {}
+
+ public boolean hasSolarTower() {
+ return mHasTower;
+ }
+
+ public GregtechMetaTileEntity_SolarTower getSolarTower() {
+ if (this.mHasTower) {
+ return mTower;
+ }
+ return null;
+ }
+
+ public boolean canSeeSky() {
+ if (this.getBaseMetaTileEntity()
+ .getWorld()
+ .canBlockSeeTheSky(
+ this.getBaseMetaTileEntity()
+ .getXCoord(),
+ this.getBaseMetaTileEntity()
+ .getYCoord() + 1,
+ this.getBaseMetaTileEntity()
+ .getZCoord())) {
+ return true;
+ }
+ return false;
+ }
+
+ public boolean setSolarTower(GregtechMetaTileEntity_SolarTower aTowerTile) {
+ if (!hasSolarTower()) {
+ this.mTX = aTowerTile.getBaseMetaTileEntity()
+ .getXCoord();
+ this.mTY = (int) aTowerTile.getBaseMetaTileEntity()
+ .getYCoord();
+ this.mTZ = aTowerTile.getBaseMetaTileEntity()
+ .getZCoord();
+ this.mHasTower = true;
+ this.mTower = aTowerTile;
+ return true;
+ }
+ return false;
+ }
+
+ public boolean clearSolarTower() {
+ if (mHasTower || mRequiredFacing != null || this.mTower != null) {
+ this.mTX = 0;
+ this.mTY = 0;
+ this.mTZ = 0;
+ this.mRequiredFacing = null;
+ this.mTower = null;
+ this.mHasTower = false;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public void onRemoval() {
+ super.onRemoval();
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side.offsetY == 0;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public void onFacingChange() {
+ super.onFacingChange();
+ }
+
+ @Override
+ public void doExplosion(long aExplosionPower) {}
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredChest.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredChest.java
new file mode 100644
index 0000000000..07a63a6ba4
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredChest.java
@@ -0,0 +1,250 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.storage;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_TieredChest extends GT_MetaTileEntity_TieredMachineBlock implements IAddUIWidgets {
+
+ public int mItemCount = 0;
+ public ItemStack mItemStack = null;
+ private static final double mStorageFactor = (270000.0D / 16);
+
+ public GT_MetaTileEntity_TieredChest(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 3,
+ "This Chest stores " + (int) (Math.pow(6.0D, (double) aTier) * mStorageFactor) + " Items",
+ new ITexture[0]);
+ }
+
+ public GT_MetaTileEntity_TieredChest(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return ArrayUtils.add(this.mDescriptionArray, CORE.GT_Tooltip.get());
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TieredChest(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (this.getBaseMetaTileEntity()
+ .isServerSide()
+ && this.getBaseMetaTileEntity()
+ .isAllowedToWork()) {
+ if (this.getItemCount() <= 0) {
+ this.mItemStack = null;
+ this.mItemCount = 0;
+ }
+
+ if (this.mItemStack == null && this.mInventory[0] != null) {
+ this.mItemStack = this.mInventory[0].copy();
+ }
+
+ if (this.mInventory[0] != null && this.mItemCount < this.getMaxItemCount()
+ && GT_Utility.areStacksEqual(this.mInventory[0], this.mItemStack)) {
+ this.mItemCount += this.mInventory[0].stackSize;
+ if (this.mItemCount > this.getMaxItemCount()) {
+ this.mInventory[0].stackSize = this.mItemCount - this.getMaxItemCount();
+ this.mItemCount = this.getMaxItemCount();
+ } else {
+ this.mInventory[0] = null;
+ }
+ }
+
+ if (this.mInventory[1] == null && this.mItemStack != null) {
+ this.mInventory[1] = this.mItemStack.copy();
+ this.mInventory[1].stackSize = Math.min(this.mItemStack.getMaxStackSize(), this.mItemCount);
+ this.mItemCount -= this.mInventory[1].stackSize;
+ } else if (this.mItemCount > 0 && GT_Utility.areStacksEqual(this.mInventory[1], this.mItemStack)
+ && this.mInventory[1].getMaxStackSize() > this.mInventory[1].stackSize) {
+ int tmp = Math
+ .min(this.mItemCount, this.mInventory[1].getMaxStackSize() - this.mInventory[1].stackSize);
+ this.mInventory[1].stackSize += tmp;
+ this.mItemCount -= tmp;
+ }
+
+ if (this.mItemStack != null) {
+ this.mInventory[2] = this.mItemStack.copy();
+ this.mInventory[2].stackSize = Math.min(this.mItemStack.getMaxStackSize(), this.mItemCount);
+ } else {
+ this.mInventory[2] = null;
+ }
+ }
+ }
+
+ private int getItemCount() {
+ return this.mItemCount;
+ }
+
+ @Override
+ public void setItemCount(int aCount) {
+ this.mItemCount = aCount;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return this.mItemCount + (this.mInventory[0] == null ? 0 : this.mInventory[0].stackSize)
+ + (this.mInventory[1] == null ? 0 : this.mInventory[1].stackSize);
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return this.getMaxItemCount();
+ }
+
+ @Override
+ public int getMaxItemCount() {
+ return (int) (Math.pow(6.0D, (double) this.mTier) * mStorageFactor - 128.0D);
+ }
+
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return aIndex == 1;
+ }
+
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return aIndex == 0 && (this.mInventory[0] == null || GT_Utility.areStacksEqual(this.mInventory[0], aStack));
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return this.mItemStack == null
+ ? new String[] { "Super Storage Chest", "Stored Items:", "No Items", Integer.toString(0),
+ Integer.toString(this.getMaxItemCount()) }
+ : new String[] { "Super Storage Chest", "Stored Items:", this.mItemStack.getDisplayName(),
+ Integer.toString(this.mItemCount), Integer.toString(this.getMaxItemCount()) };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mItemCount", this.mItemCount);
+ if (this.mItemStack != null) {
+ aNBT.setTag("mItemStack", this.mItemStack.writeToNBT(new NBTTagCompound()));
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ if (aNBT.hasKey("mItemCount")) {
+ this.mItemCount = aNBT.getInteger("mItemCount");
+ }
+
+ if (aNBT.hasKey("mItemStack")) {
+ this.mItemStack = ItemStack.loadItemStackFromNBT((NBTTagCompound) aNBT.getTag("mItemStack"));
+ }
+ }
+
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int aColorIndex, boolean aActive, boolean aRedstone) {
+ return aBaseMetaTileEntity.getFrontFacing() == ForgeDirection.DOWN && side == ForgeDirection.WEST
+ ? new ITexture[] { BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1],
+ new GT_RenderedTexture(BlockIcons.OVERLAY_QCHEST) }
+ : (side == aBaseMetaTileEntity.getFrontFacing()
+ ? new ITexture[] { BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1],
+ new GT_RenderedTexture(BlockIcons.OVERLAY_QCHEST) }
+ : new ITexture[] { BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1] });
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return new ITexture[0][0][0];
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(7, 16)
+ .setSize(71, 45))
+ .widget(
+ new SlotWidget(inventoryHandler, 0)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_IN)
+ .setPos(79, 16))
+ .widget(
+ new SlotWidget(inventoryHandler, 1).setAccess(true, false)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_OUT)
+ .setPos(79, 52))
+ .widget(
+ SlotWidget.phantom(inventoryHandler, 2)
+ .disableInteraction()
+ .setBackground(GT_UITextures.TRANSPARENT)
+ .setPos(59, 42))
+ .widget(
+ new TextWidget("Item Amount").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 20))
+ .widget(
+ new TextWidget().setStringSupplier(() -> numberFormat.format(mItemCount))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 30));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredTank.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredTank.java
new file mode 100644
index 0000000000..a9fc7a3fd4
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredTank.java
@@ -0,0 +1,194 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.storage;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+
+public class GT_MetaTileEntity_TieredTank extends GT_MetaTileEntity_BasicTank {
+
+ public GT_MetaTileEntity_TieredTank(final int aID, final String aName, final String aNameRegional,
+ final int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 3,
+ "Stores " + GT_Utility.formatNumbers(((int) (Math.pow(2, aTier) * 32000))) + "L of fluid");
+ }
+
+ public GT_MetaTileEntity_TieredTank(final String aName, final int aTier, final String[] aDescription,
+ final ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ List<String> description = new ArrayList<>(Arrays.asList(this.mDescriptionArray));
+ description.add("A portable tank.");
+ if (this.mFluid != null) {
+ description.add("Fluid: " + mFluid.getLocalizedName() + " " + mFluid.amount + "L");
+ }
+ description.add(CORE.GT_Tooltip.get());
+ return description.toArray(new String[0]);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ return new ITexture[0][0][0];
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return side == ForgeDirection.UP
+ ? new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1],
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_SIDE_POTIONBREWER_ACTIVE) }
+ : new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColorIndex + 1],
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_SIDE_POTIONBREWER) };
+ }
+
+ @Override
+ public void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {
+ if (stack.hasTagCompound() && stack.stackTagCompound.hasKey("mFluid")) {
+ final FluidStack tContents = FluidStack
+ .loadFluidStackFromNBT(stack.stackTagCompound.getCompoundTag("mFluid"));
+ if (tContents != null && tContents.amount > 0) {
+ tooltip.add(
+ GT_LanguageManager.addStringLocalization(
+ "TileEntity_TANK_INFO",
+ "Contains Fluid: ",
+ !GregTech_API.sPostloadFinished) + EnumChatFormatting.YELLOW
+ + tContents.getLocalizedName()
+ + EnumChatFormatting.GRAY);
+ tooltip.add(
+ GT_LanguageManager.addStringLocalization(
+ "TileEntity_TANK_AMOUNT",
+ "Fluid Amount: ",
+ !GregTech_API.sPostloadFinished) + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(tContents.amount)
+ + " L"
+ + EnumChatFormatting.GRAY);
+ }
+ }
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public final byte getUpdateData() {
+ return 0x00;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+
+ if (this.mFluid == null) {
+ return new String[] { GT_Values.VOLTAGE_NAMES[this.mTier] + " Fluid Tank", "Stored Fluid:", "No Fluid",
+ 0 + "L", this.getCapacity() + "L" };
+ }
+ return new String[] { GT_Values.VOLTAGE_NAMES[this.mTier] + " Fluid Tank", "Stored Fluid:",
+ this.mFluid.getLocalizedName(), this.mFluid.amount + "L", this.getCapacity() + "L" };
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TieredTank(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public int getCapacity() {
+ return (int) (Math.pow(2, this.mTier) * 32000);
+ }
+
+ @Override
+ public int getTankPressure() {
+ return 100;
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ if (mFluid != null) {
+ Logger.WARNING("Setting item fluid nbt");
+ aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound()));
+ if (aNBT.hasKey("mFluid")) {
+ Logger.WARNING("Set mFluid to NBT.");
+ }
+ }
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GregtechMetaEnergyBuffer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GregtechMetaEnergyBuffer.java
new file mode 100644
index 0000000000..17b2d77756
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GregtechMetaEnergyBuffer.java
@@ -0,0 +1,439 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.storage;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMetaTileEntity;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock;
+
+public class GregtechMetaEnergyBuffer extends GregtechMetaTileEntity {
+
+ protected byte aCurrentOutputAmperage = 4;
+
+ public GregtechMetaEnergyBuffer(final int aID, final String aName, final String aNameRegional, final int aTier,
+ final String aDescription, final int aSlotCount) {
+ super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription);
+ }
+
+ public GregtechMetaEnergyBuffer(final String aName, final int aTier, final String aDescription,
+ final ITexture[][][] aTextures, final int aSlotCount) {
+ super(aName, aTier, aSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { this.mDescription, "Defaults 4A In/Out", "Change output Amperage with a screwdriver",
+ "Now Portable!", CORE.GT_Tooltip.get() };
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCover) {
+ if (side != this.getBaseMetaTileEntity()
+ .getFrontFacing()) {
+ return true;
+ }
+ return super.allowCoverOnSide(side, aCover);
+ }
+
+ /*
+ * MACHINE_STEEL_SIDE
+ */
+
+ @Override
+ public ITexture[][][] getTextureSet(final ITexture[] aTextures) {
+ final ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = this.getFront(i);
+ rTextures[1][i + 1] = this.getBack(i);
+ rTextures[2][i + 1] = this.getBottom(i);
+ rTextures[3][i + 1] = this.getTop(i);
+ rTextures[4][i + 1] = this.getSides(i);
+ rTextures[5][i + 1] = this.getFrontActive(i);
+ rTextures[6][i + 1] = this.getBackActive(i);
+ rTextures[7][i + 1] = this.getBottomActive(i);
+ rTextures[8][i + 1] = this.getTopActive(i);
+ rTextures[9][i + 1] = this.getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(final IGregTechTileEntity aBaseMetaTileEntity, final ForgeDirection side,
+ final ForgeDirection facing, final int aColorIndex, final boolean aActive, final boolean aRedstone) {
+ return this.mTextures[(aActive ? 5 : 0) + (side == facing ? 0
+ : side == facing.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][aColorIndex + 1];
+ }
+
+ public ITexture[] getFront(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
+ }
+
+ public ITexture[] getBack(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Dimensional_Orange) };
+ }
+
+ public ITexture[] getBottom(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Dimensional_Orange) };
+ }
+
+ public ITexture[] getTop(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Screen_Logo) };
+ }
+
+ public ITexture[] getSides(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Dimensional_Orange) };
+ }
+
+ public ITexture[] getFrontActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[this.mTier] };
+ }
+
+ public ITexture[] getBackActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Dimensional_Orange) };
+ }
+
+ public ITexture[] getBottomActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Dimensional_Orange) };
+ }
+
+ public ITexture[] getTopActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Screen_Logo) };
+ }
+
+ public ITexture[] getSidesActive(final byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[this.mTier][aColor + 1],
+ new GT_RenderedTexture(TexturesGtBlock.Overlay_Machine_Dimensional_Orange) };
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(final IGregTechTileEntity aTileEntity) {
+ return new GregtechMetaEnergyBuffer(
+ this.mName,
+ this.mTier,
+ this.mDescription,
+ this.mTextures,
+ this.mInventory.length);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(final int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(final ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(final ForgeDirection side) {
+ return side != this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isOutputFacing(final ForgeDirection side) {
+ return side == this.getBaseMetaTileEntity()
+ .getFrontFacing();
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return V[this.mTier] * 2;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return V[this.mTier] * 250000;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[this.mTier];
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return V[this.mTier];
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return aCurrentOutputAmperage;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return aCurrentOutputAmperage;
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyStored();
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return (int) this.getBaseMetaTileEntity()
+ .getUniversalEnergyCapacity();
+ }
+
+ @Override
+ public boolean isAccessAllowed(final EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public void saveNBTData(final NBTTagCompound aNBT) {
+ aNBT.setByte("aCurrentOutputAmperage", aCurrentOutputAmperage);
+ long aEU = this.getBaseMetaTileEntity()
+ .getStoredEU();
+ if (aEU > 0) {
+ aNBT.setLong("aStoredEU", aEU);
+ if (aNBT.hasKey("aStoredEU")) {
+ Logger.WARNING("Set aStoredEU to NBT.");
+ }
+ }
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ aCurrentOutputAmperage = aNBT.getByte("aCurrentOutputAmperage");
+ if (aNBT.hasKey("aStoredEU")) {
+ this.setEUVar(aNBT.getLong("aStoredEU"));
+ }
+ }
+
+ @Override
+ public boolean onRightclick(final IGregTechTileEntity aBaseMetaTileEntity, final EntityPlayer aPlayer) {
+ Logger.WARNING("Right Click on MTE by Player");
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+
+ Logger.WARNING("MTE is Client-side");
+ this.showEnergy(aPlayer.getEntityWorld(), aPlayer);
+ return true;
+ }
+
+ protected void showEnergy(final World worldIn, final EntityPlayer playerIn) {
+ final long tempStorage = this.getBaseMetaTileEntity()
+ .getStoredEU();
+ final double c = ((double) tempStorage / this.maxEUStore()) * 100;
+ final double roundOff = Math.round(c * 100.00) / 100.00;
+ PlayerUtils.messagePlayer(
+ playerIn,
+ "Energy: " + GT_Utility.formatNumbers(tempStorage) + " EU at " + V[this.mTier] + "v (" + roundOff + "%)");
+ PlayerUtils.messagePlayer(playerIn, "Amperage: " + GT_Utility.formatNumbers(maxAmperesOut()) + "A");
+ }
+ // Utils.LOG_WARNING("Begin Show Energy");
+ /*
+ * //Utils.LOG_INFO("getProgresstime: "+tempStorage+" maxProgresstime: "+maxEUStore()+" C: "+c);
+ * Utils.LOG_INFO("getProgressTime: "+getProgresstime()); Utils.LOG_INFO("maxProgressTime: "+maxProgresstime());
+ * Utils.LOG_INFO("getMinimumStoredEU: "+getMinimumStoredEU()); Utils.LOG_INFO("maxEUStore: "+maxEUStore());
+ */
+ /*
+ * final long d = (tempStorage * 100L) / maxEUStore();
+ * Utils.LOG_INFO("getProgresstime: "+tempStorage+" maxProgresstime: "+maxEUStore()+" D: "+d); final double
+ * roundOff2 = Math.round(d * 100.00) / 100.00; Utils.messagePlayer(playerIn, "Energy: " + tempStorage +
+ * " EU at "+V[mTier]+"v ("+roundOff2+"%)"); Utils.LOG_WARNING("Making new instance of Guihandler"); GuiHandler
+ * block = new GuiHandler(); Utils.LOG_WARNING("Guihandler.toString(): "+block.toString());
+ * block.getClientGuiElement(1, playerIn, worldIn, (int) playerIn.posX, (int) playerIn.posY, (int) playerIn.posZ);
+ */
+
+ @Override
+ public boolean allowPullStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(final IGregTechTileEntity aBaseMetaTileEntity, final int aIndex,
+ final ForgeDirection side, final ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ String cur = GT_Utility.formatNumbers(
+ this.getBaseMetaTileEntity()
+ .getStoredEU());
+ String max = GT_Utility.formatNumbers(
+ this.getBaseMetaTileEntity()
+ .getEUCapacity());
+
+ // Right-align current storage with maximum storage
+ String fmt = String.format("%%%ds", max.length());
+ cur = String.format(fmt, cur);
+
+ return new String[] { cur + " EU stored", max + " EU capacity" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(final int p_94128_1_) {
+ return new int[] {};
+ }
+
+ @Override
+ public boolean canInsertItem(final int p_102007_1_, final ItemStack p_102007_2_, final int p_102007_3_) {
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(final int p_102008_1_, final ItemStack p_102008_2_, final int p_102008_3_) {
+ return false;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(final int p_70301_1_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack decrStackSize(final int p_70298_1_, final int p_70298_2_) {
+ return null;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(final int p_70304_1_) {
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(final int p_70299_1_, final ItemStack p_70299_2_) {}
+
+ @Override
+ public String getInventoryName() {
+ return super.getInventoryName();
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return false;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 0;
+ }
+
+ @Override
+ public boolean isUseableByPlayer(final EntityPlayer p_70300_1_) {
+ return false;
+ }
+
+ @Override
+ public void openInventory() {}
+
+ @Override
+ public void closeInventory() {}
+
+ @Override
+ public boolean isItemValidForSlot(final int p_94041_1_, final ItemStack p_94041_2_) {
+ return false;
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ aNBT.setByte("aCurrentOutputAmperage", aCurrentOutputAmperage);
+ long aEU = this.getBaseMetaTileEntity()
+ .getStoredEU();
+ if (aEU > 0) {
+ aNBT.setLong("aStoredEU", aEU);
+ if (aNBT.hasKey("aStoredEU")) {
+ Logger.WARNING("Set aStoredEU to NBT.");
+ }
+ }
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ byte aTest = (byte) (aCurrentOutputAmperage + 1);
+ if (aTest > 16 || aTest <= 0) {
+ aTest = 1;
+ }
+ aCurrentOutputAmperage = aTest;
+ PlayerUtils.messagePlayer(aPlayer, "Now handling " + aCurrentOutputAmperage + " Amps.");
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/creative/GT_MetaTileEntity_InfiniteItemHolder.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/creative/GT_MetaTileEntity_InfiniteItemHolder.java
new file mode 100644
index 0000000000..2dca8d5c30
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/creative/GT_MetaTileEntity_InfiniteItemHolder.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.xmod.gregtech.common.tileentities.storage.creative;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.core.util.sys.KeyboardUtils;
+import gtPlusPlus.xmod.gregtech.common.tileentities.storage.GT_MetaTileEntity_TieredChest;
+
+public class GT_MetaTileEntity_InfiniteItemHolder extends GT_MetaTileEntity_TieredChest {
+
+ public GT_MetaTileEntity_InfiniteItemHolder(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_InfiniteItemHolder(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.getWorld().isRemote) {
+ return false;
+ }
+
+ if (!KeyboardUtils.isShiftKeyDown()) {
+ if (this.mItemStack == null) {
+ if (aPlayer.getHeldItem() != null) {
+ this.mItemStack = aPlayer.getHeldItem()
+ .copy();
+ this.mItemCount = Short.MAX_VALUE;
+ aPlayer.setCurrentItemOrArmor(0, null);
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Now holding " + this.mItemStack.getDisplayName() + " x" + Short.MAX_VALUE + ".");
+ return true;
+ }
+ } else {
+ if (aPlayer.getHeldItem() == null) {
+ aPlayer.entityDropItem(mItemStack, 1);
+ this.mItemStack = null;
+ this.mItemCount = 0;
+ PlayerUtils.messagePlayer(aPlayer, "Emptying.");
+ return true;
+ }
+ }
+ }
+
+ PlayerUtils.messagePlayer(
+ aPlayer,
+ "Currently holding: " + (this.mItemStack != null ? this.mItemStack.getDisplayName() : "Nothing")
+ + " x"
+ + this.mItemCount);
+ return true;
+ // return super.onRightclick(aBaseMetaTileEntity, aPlayer);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (mItemStack != null) {
+ setItemCount(0);
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ }
+
+ @Override
+ public void setItemCount(int aCount) {
+ super.setItemCount(Short.MAX_VALUE);
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_InfiniteItemHolder(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_AngleGrinder.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_AngleGrinder.java
new file mode 100644
index 0000000000..6af3a61487
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_AngleGrinder.java
@@ -0,0 +1,175 @@
+package gtPlusPlus.xmod.gregtech.common.tools;
+
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityIronGolem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.stats.AchievementList;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures.ItemIcons;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.common.items.behaviors.Behaviour_None;
+import gregtech.common.tools.GT_Tool;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtTools;
+
+public class TOOL_Gregtech_AngleGrinder extends GT_Tool {
+
+ public static final List<String> mEffectiveList = Arrays
+ .asList(new String[] { EntityIronGolem.class.getName(), "EntityTowerGuardian" });
+
+ @Override
+ public float getNormalDamageAgainstEntity(final float aOriginalDamage, final Entity aEntity, final ItemStack aStack,
+ final EntityPlayer aPlayer) {
+ String tName = aEntity.getClass()
+ .getName();
+ tName = tName.substring(tName.lastIndexOf(".") + 1);
+ return (mEffectiveList.contains(tName)) || (tName.contains("Golem")) ? aOriginalDamage * 2.0F : aOriginalDamage;
+ }
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 100;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 8.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 2F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.8F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.RANDOM_ANVIL_USE.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return SoundResource.RANDOM_ANVIL_BREAK.toString();
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isWrench() {
+ return false;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isWeapon() {
+ return true;
+ }
+
+ @Override
+ public boolean isMinableBlock(final Block aBlock, final byte aMetaData) {
+ final String tTool = aBlock.getHarvestTool(aMetaData);
+ return (tTool != null) && (tTool.equals("sword") || tTool.equals("file"));
+ }
+
+ @Override
+ public int convertBlockDrops(final List<ItemStack> aDrops, final ItemStack aStack, final EntityPlayer aPlayer,
+ final Block aBlock, final int aX, final int aY, final int aZ, final byte aMetaData, final int aFortune,
+ final boolean aSilkTouch, final BlockEvent.HarvestDropsEvent aEvent) {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getBrokenItem(final ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return (IIconContainer) (aIsToolHead ? TexturesGtTools.ANGLE_GRINDER : ItemIcons.POWER_UNIT_HV);
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa : Materials.TungstenSteel.mRGBa;
+ }
+
+ @Override
+ public void onToolCrafted(final ItemStack aStack, final EntityPlayer aPlayer) {
+ super.onToolCrafted(aStack, aPlayer);
+ aPlayer.triggerAchievement(AchievementList.buildSword);
+ try {
+ GT_Mod.achievements.issueAchievement(aPlayer, "tools");
+ GT_Mod.achievements.issueAchievement(aPlayer, "unitool");
+ } catch (final Exception e) {}
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(final EntityLivingBase aPlayer, final EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " has been Ground out of existence by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+
+ @Override
+ public void onStatsAddedToTool(final GT_MetaGenerated_Tool aItem, final int aID) {
+ aItem.addItemBehavior(aID, new Behaviour_None());
+ }
+
+ @Override
+ public boolean isGrafter() {
+ return false;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_ElectricSnips.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_ElectricSnips.java
new file mode 100644
index 0000000000..25ad03548a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/common/tools/TOOL_Gregtech_ElectricSnips.java
@@ -0,0 +1,96 @@
+package gtPlusPlus.xmod.gregtech.common.tools;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.stats.AchievementList;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures.ItemIcons;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.common.tools.GT_Tool_WireCutter;
+import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtTools;
+
+public class TOOL_Gregtech_ElectricSnips extends GT_Tool_WireCutter {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 100;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 4.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.4F;
+ }
+
+ @Override
+ public ItemStack getBrokenItem(final ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return (IIconContainer) (aIsToolHead ? TexturesGtTools.ELECTRIC_SNIPS : ItemIcons.POWER_UNIT_MV);
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa : Materials.TungstenSteel.mRGBa;
+ }
+
+ @Override
+ public void onToolCrafted(final ItemStack aStack, final EntityPlayer aPlayer) {
+ super.onToolCrafted(aStack, aPlayer);
+ aPlayer.triggerAchievement(AchievementList.buildSword);
+ try {
+ GT_Mod.achievements.issueAchievement(aPlayer, "tools");
+ GT_Mod.achievements.issueAchievement(aPlayer, "unitool");
+ } catch (final Exception e) {}
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(final EntityLivingBase aPlayer, final EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " has been Snipped out of existence by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/Gregtech_Blocks.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/Gregtech_Blocks.java
new file mode 100644
index 0000000000..1a3d07f510
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/Gregtech_Blocks.java
@@ -0,0 +1,34 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks2;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks3;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks4;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks5;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks6;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocksPipeGearbox;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaSpecialMachineCasings;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaSpecialMultiCasings;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaSpecialMultiCasings2;
+import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaTieredCasingBlocks1;
+
+public class Gregtech_Blocks {
+
+ public static void run() {
+
+ // Casing Blocks
+ ModBlocks.blockCasingsMisc = new GregtechMetaCasingBlocks();
+ ModBlocks.blockCasings2Misc = new GregtechMetaCasingBlocks2();
+ ModBlocks.blockCasings3Misc = new GregtechMetaCasingBlocks3();
+ ModBlocks.blockCasings4Misc = new GregtechMetaCasingBlocks4();
+ ModBlocks.blockCasings5Misc = new GregtechMetaCasingBlocks5();
+ ModBlocks.blockCasings6Misc = new GregtechMetaCasingBlocks6();
+
+ ModBlocks.blockCasingsTieredGTPP = new GregtechMetaTieredCasingBlocks1();
+ ModBlocks.blockSpecialMultiCasings = new GregtechMetaSpecialMultiCasings();
+ ModBlocks.blockSpecialMultiCasings2 = new GregtechMetaSpecialMultiCasings2();
+ ModBlocks.blockCustomMachineCasings = new GregtechMetaSpecialMachineCasings();
+ ModBlocks.blockCustomPipeGearCasings = new GregtechMetaCasingBlocksPipeGearbox();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingAngleGrinder.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingAngleGrinder.java
new file mode 100644
index 0000000000..e2723e5248
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingAngleGrinder.java
@@ -0,0 +1,133 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_ModHandler.RecipeBits;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.Interface_OreRecipeRegistrator;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+
+public class ProcessingAngleGrinder implements Interface_OreRecipeRegistrator, Runnable {
+
+ public ProcessingAngleGrinder() {
+ GregtechOrePrefixes.toolAngleGrinder.add(this);
+ }
+
+ @Override
+ public void registerOre(final GregtechOrePrefixes aPrefix, final Materials aMaterial, final String aOreDictName,
+ final String aModName, final ItemStack aStack) {
+ if ((aMaterial != Materials.Stone) && (aMaterial != Materials.Flint)) {
+ if (aMaterial != Materials.Rubber) {
+ if ((!aMaterial.contains(SubTag.WOOD)) && (!aMaterial.contains(SubTag.BOUNCY))
+ && (!aMaterial.contains(SubTag.NO_SMASHING))) {}
+ }
+ }
+ }
+
+ @Override
+ public void registerOre(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial, final String aOreDictName,
+ final String aModName, final ItemStack aStack) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void materialsLoops() {
+ final Materials[] i = Materials.values();
+ final int size = i.length;
+ Logger.MATERIALS("Materials to attempt tool gen. with: " + size);
+ int used = 0;
+ Materials aMaterial = null;
+ for (Materials materials : i) {
+ aMaterial = materials;
+ if ((aMaterial != Materials.Stone) && (aMaterial != Materials.Flint)
+ && (aMaterial != Materials.Rubber)
+ && (aMaterial != Materials._NULL)) {
+ if ((!aMaterial.contains(SubTag.WOOD)) && (!aMaterial.contains(SubTag.BOUNCY))
+ && (!aMaterial.contains(SubTag.NO_SMASHING))
+ && (!aMaterial.contains(SubTag.TRANSPARENT))
+ && (!aMaterial.contains(SubTag.FLAMMABLE))
+ && (!aMaterial.contains(SubTag.MAGICAL))
+ && (!aMaterial.contains(SubTag.NO_SMELTING))) {
+ Logger.MATERIALS("Generating Angle Grinder from " + MaterialUtils.getMaterialName(aMaterial));
+ // Input 1
+
+ final ItemStack plate = GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L);
+ final ItemStack longrod = GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L);
+
+ if ((null != plate && longrod != null)) {
+ addRecipe(aMaterial, 1600000L, 3, ItemList.Battery_RE_HV_Lithium.get(1));
+ addRecipe(aMaterial, 1200000L, 3, ItemList.Battery_RE_HV_Cadmium.get(1));
+ addRecipe(aMaterial, 800000L, 3, ItemList.Battery_RE_HV_Sodium.get(1));
+ used++;
+ } else {
+ Logger.MATERIALS(
+ "Unable to generate Angle Grinder from " + MaterialUtils.getMaterialName(aMaterial)
+ + ", Plate or Long Rod may be invalid. Invalid | Plate? "
+ + (plate == null)
+ + " | Rod? "
+ + (longrod == null)
+ + " |");
+ }
+ // GT_ModHandler.addCraftingRecipe(,
+ // GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS |
+ // GT_ModHandler.RecipeBits.BUFFERED, new Object[]{"P H", "PIP", " I ",
+ // Character.valueOf('I'), OrePrefixes.ingot.get(aMaterial),
+ // Character.valueOf('P'), OrePrefixes.plate.get(aMaterial),
+ // Character.valueOf('H'), OrePrefixes.toolHeadHammer.get(aMaterial)});
+ } else {
+ Logger
+ .MATERIALS("Unable to generate Angle Grinder from " + MaterialUtils.getMaterialName(aMaterial));
+ }
+ } else {
+ Logger.MATERIALS("Unable to generate Angle Grinder from " + MaterialUtils.getMaterialName(aMaterial));
+ }
+ }
+
+ Logger.INFO("Materials used for tool gen: " + used);
+ }
+
+ @Override
+ public void run() {
+ Logger.INFO("Generating Angle Grinders for all valid GT Materials.");
+ this.materialsLoops();
+ }
+
+ public boolean addRecipe(Materials aMaterial, long aBatteryStorage, int aVoltageTier, ItemStack aBattery) {
+
+ ItemStack aOutputStack = MetaGeneratedGregtechTools.INSTANCE.getToolWithStats(
+ MetaGeneratedGregtechTools.ANGLE_GRINDER,
+ 1,
+ aMaterial,
+ Materials.Titanium,
+ new long[] { aBatteryStorage, GT_Values.V[aVoltageTier], 3L, -1L });
+
+ long aDura = MetaGeneratedGregtechTools.getToolMaxDamage(aOutputStack);
+ if (aDura <= 32000) {
+ Logger.MATERIALS(
+ "Unable to generate Angle Grinder from " + MaterialUtils.getMaterialName(aMaterial)
+ + ", Durability: "
+ + aDura);
+ return false;
+ }
+
+ return GT_ModHandler.addCraftingRecipe(
+ aOutputStack,
+ RecipeBits.DISMANTLEABLE | RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | RecipeBits.BUFFERED,
+ new Object[] { "SXL", "GMG", "PBP", 'X', ItemList.Component_Grinder_Tungsten.get(1), 'M',
+ CI.getElectricMotor(aVoltageTier, 1), 'S', OrePrefixes.screw.get(Materials.Titanium), 'L',
+ OrePrefixes.stickLong.get(aMaterial), 'P', OrePrefixes.plate.get(aMaterial), 'G',
+ ELEMENT.STANDALONE.BLACK_METAL.getGear(1), 'B', aBattery });
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingElectricSnips.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingElectricSnips.java
new file mode 100644
index 0000000000..9a60f2c6bf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/ProcessingElectricSnips.java
@@ -0,0 +1,137 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.Interface_OreRecipeRegistrator;
+import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
+
+public class ProcessingElectricSnips implements Interface_OreRecipeRegistrator, Runnable {
+
+ public ProcessingElectricSnips() {
+ GregtechOrePrefixes.toolElectricSnips.add(this);
+ }
+
+ @Override
+ public void registerOre(final GregtechOrePrefixes aPrefix, final Materials aMaterial, final String aOreDictName,
+ final String aModName, final ItemStack aStack) {
+ if ((aMaterial != Materials.Stone) && (aMaterial != Materials.Flint)) {
+ if (aMaterial != Materials.Rubber) {
+ if ((!aMaterial.contains(SubTag.WOOD)) && (!aMaterial.contains(SubTag.BOUNCY))
+ && (!aMaterial.contains(SubTag.NO_SMASHING))) {}
+ }
+ }
+ }
+
+ @Override
+ public void registerOre(final GregtechOrePrefixes aPrefix, final GT_Materials aMaterial, final String aOreDictName,
+ final String aModName, final ItemStack aStack) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void materialsLoops() {
+ final Materials[] i = Materials.values();
+ final int size = i.length;
+ Logger.MATERIALS("Materials to attempt tool gen. with: " + size);
+ int used = 0;
+ Materials aMaterial = null;
+ for (Materials materials : i) {
+ aMaterial = materials;
+ if ((aMaterial != Materials.Stone) && (aMaterial != Materials.Flint)
+ && (aMaterial != Materials.Rubber)
+ && (aMaterial != Materials._NULL)) {
+ if ((!aMaterial.contains(SubTag.WOOD)) && (!aMaterial.contains(SubTag.BOUNCY))
+ && (!aMaterial.contains(SubTag.NO_SMASHING))
+ && (!aMaterial.contains(SubTag.TRANSPARENT))
+ && (!aMaterial.contains(SubTag.FLAMMABLE))
+ && (!aMaterial.contains(SubTag.MAGICAL))
+ && (!aMaterial.contains(SubTag.NO_SMELTING))) {
+ Logger.MATERIALS("Generating Electric Snips from " + MaterialUtils.getMaterialName(aMaterial));
+ // Input 1
+
+ final ItemStack plate = GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L);
+
+ if ((null != plate)) {
+ addRecipe(aMaterial, 1600000L, 3, ItemList.Battery_RE_HV_Lithium.get(1));
+ addRecipe(aMaterial, 1200000L, 3, ItemList.Battery_RE_HV_Cadmium.get(1));
+ addRecipe(aMaterial, 800000L, 3, ItemList.Battery_RE_HV_Sodium.get(1));
+ used++;
+ } else {
+ Logger.MATERIALS(
+ "Unable to generate Electric Snips from " + MaterialUtils.getMaterialName(aMaterial)
+ + ", Plate or Long Rod may be invalid. Invalid | Plate? "
+ + (plate == null)
+ + " | Rod? "
+ + " |");
+ }
+ // GT_ModHandler.addCraftingRecipe(,
+ // GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS |
+ // GT_ModHandler.RecipeBits.BUFFERED, new Object[]{"P H", "PIP", " I ",
+ // Character.valueOf('I'), OrePrefixes.ingot.get(aMaterial),
+ // Character.valueOf('P'), OrePrefixes.plate.get(aMaterial),
+ // Character.valueOf('H'), OrePrefixes.toolHeadHammer.get(aMaterial)});
+ } else {
+ Logger.MATERIALS(
+ "Unable to generate Electric Snips from " + MaterialUtils.getMaterialName(aMaterial));
+ }
+ } else {
+ Logger.MATERIALS("Unable to generate Electric Snips from " + MaterialUtils.getMaterialName(aMaterial));
+ }
+ }
+
+ Logger.INFO("Materials used for tool gen: " + used);
+ }
+
+ @Override
+ public void run() {
+ Logger.INFO("Generating Electric Snips for all valid GT Materials.");
+ this.materialsLoops();
+ }
+
+ public boolean addRecipe(Materials aMaterial, long aBatteryStorage, int aVoltageTier, ItemStack aBattery) {
+
+ ItemStack aOutputStack = MetaGeneratedGregtechTools.INSTANCE.getToolWithStats(
+ MetaGeneratedGregtechTools.ELECTRIC_SNIPS,
+ 1,
+ aMaterial,
+ Materials.Titanium,
+ new long[] { aBatteryStorage, GT_Values.V[aVoltageTier], 3L, -1L });
+
+ ItemStack aInputCutter = GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.WIRECUTTER, 1, aMaterial, aMaterial, null);
+
+ long aDura = MetaGeneratedGregtechTools.getToolMaxDamage(aOutputStack);
+ if (aDura <= 32000) {
+ Logger.MATERIALS(
+ "Unable to generate Electric Snips from " + MaterialUtils.getMaterialName(aMaterial)
+ + ", Durability: "
+ + aDura);
+ return false;
+ }
+ return RecipeUtils.addShapedRecipe(
+ OrePrefixes.wireFine.get(Materials.Electrum),
+ aInputCutter,
+ OrePrefixes.wireFine.get(Materials.Electrum),
+ ELEMENT.STANDALONE.WHITE_METAL.getGear(1),
+ CI.getElectricMotor(aVoltageTier, 1),
+ ELEMENT.STANDALONE.WHITE_METAL.getGear(1),
+ OrePrefixes.plate.get(aMaterial),
+ aBattery,
+ OrePrefixes.plate.get(aMaterial),
+ aOutputStack);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_AlloySmelter.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_AlloySmelter.java
new file mode 100644
index 0000000000..d455697330
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_AlloySmelter.java
@@ -0,0 +1,63 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_AlloySmelter extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_AlloySmelter(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+ final int tVoltageMultiplier = material.vVoltageMultiplier;
+
+ // Nuggets
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getNugget(1)))
+ GT_Values.RA.addAlloySmelterRecipe(
+ material.getIngot(1),
+ ItemList.Shape_Mold_Nugget.get(0),
+ material.getNugget(9),
+ (int) Math.max(material.getMass() * 2L, 1L),
+ tVoltageMultiplier);
+
+ // Gears
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1)) && ItemUtils.checkForInvalidItems(material.getGear(1)))
+ GT_Values.RA.addAlloySmelterRecipe(
+ material.getIngot(8),
+ ItemList.Shape_Mold_Gear.get(0),
+ material.getGear(1),
+ (int) Math.max(material.getMass() * 2L, 1L),
+ tVoltageMultiplier);
+
+ // Ingot
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getNugget(1)))
+ GT_Values.RA.addAlloySmelterRecipe(
+ material.getNugget(9),
+ ItemList.Shape_Mold_Ingot.get(0),
+ material.getIngot(1),
+ (int) Math.max(material.getMass() * 2L, 1L),
+ tVoltageMultiplier);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Assembler.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Assembler.java
new file mode 100644
index 0000000000..1594568d23
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Assembler.java
@@ -0,0 +1,69 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_Assembler extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Assembler(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+
+ // Frame Box
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { material.getRod(1), material.getFrameBox(1) }))
+ GT_Values.RA.addAssemblerRecipe(
+ material.getRod(4),
+ ItemUtils.getGregtechCircuit(4),
+ material.getFrameBox(1),
+ 60,
+ material.vVoltageMultiplier);
+
+ // Rotor
+ if (ItemUtils
+ .checkForInvalidItems(new ItemStack[] { material.getPlate(1), material.getRing(1), material.getRotor(1) }))
+ addAssemblerRecipe(
+ material.getPlate(4),
+ material.getRing(1),
+ material.getRotor(1),
+ 240,
+ material.vVoltageMultiplier);
+ }
+
+ private static void addAssemblerRecipe(final ItemStack input1, final ItemStack input2, final ItemStack output1,
+ final int seconds, final int euCost) {
+ GT_Values.RA.addAssemblerRecipe(
+ input1,
+ input2,
+ FluidUtils.getFluidStack("molten.solderingalloy", 16),
+ output1,
+ seconds,
+ euCost);
+ GT_Values.RA
+ .addAssemblerRecipe(input1, input2, FluidUtils.getFluidStack("molten.tin", 32), output1, seconds, euCost);
+ GT_Values.RA
+ .addAssemblerRecipe(input1, input2, FluidUtils.getFluidStack("molten.lead", 48), output1, seconds, euCost);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Base.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Base.java
new file mode 100644
index 0000000000..d000889757
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Base.java
@@ -0,0 +1,15 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.core.material.Material;
+
+public abstract class RecipeGen_Base implements RunnableWithInfo<Material> {
+
+ protected Material toGenerate;
+ protected boolean disableOptional;
+
+ @Override
+ public Material getInfoData() {
+ return toGenerate;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelter.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelter.java
new file mode 100644
index 0000000000..2d573c9fb7
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelter.java
@@ -0,0 +1,321 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeCategories;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.material.nuclear.NUCLIDE;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class RecipeGen_BlastSmelter extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_BlastSmelter(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateARecipe(this.toGenerate);
+ }
+
+ private void generateARecipe(final Material M) {
+
+ // Add a Blast Smelting Recipe, Let's go!
+ ItemStack tStack;
+ if (null != (tStack = M.getDust(1))) {
+
+ final Material[] badMaterials = { FLUORIDES.THORIUM_HEXAFLUORIDE, FLUORIDES.THORIUM_TETRAFLUORIDE,
+ ALLOY.BLOODSTEEL, NUCLIDE.LiFBeF2ThF4UF4, NUCLIDE.LiFBeF2ZrF4UF4, NUCLIDE.LiFBeF2ZrF4U235 };
+ for (final Material R : badMaterials) {
+ if (M == R) {
+ return;
+ }
+ }
+
+ // Prepare some Variables
+ ItemStack[] components;
+ ArrayList<MaterialStack> tMaterial = new ArrayList<>();
+ int inputStackCount = 0;
+ int fluidAmount = 0;
+ final boolean doTest = true;
+ tMaterial = M.getComposites();
+
+ // This Bad boy here is what dictates unique recipes.
+ ItemStack circuitGT;
+
+ // Set a duration - OLD
+ /*
+ * int duration = 0; if (M.getMeltingPointK() > 150){ duration = (int) Math.max(M.getMass() / 50L, 1L) *
+ * M.getMeltingPointK(); } else { duration = (int) Math.max(M.getMass() / 50L, 1L) * 150; }
+ */
+
+ long aVoltage = MaterialUtils.getVoltageForTier(M.vTier);
+
+ // Set a duration - NEW
+ int duration = 120 * M.vTier * 10;
+
+ if (M.vTier <= 4) {
+ duration = 20 * M.vTier * 10;
+ }
+
+ int mMaterialListSize = 0;
+
+ int mTotalPartsCounter = M.smallestStackSizeWhenProcessing;
+
+ if (M.getComposites() != null) {
+ for (final gtPlusPlus.core.material.MaterialStack ternkfsdf : M.getComposites()) {
+ if (ternkfsdf != null) {
+ mMaterialListSize++;
+ // mTotalPartsCounter += ternkfsdf.getSmallestStackSizes()[0];
+ }
+ }
+ } else {
+ mMaterialListSize = 1;
+ }
+
+ if (duration <= 0) {
+ final int second = 20;
+ duration = 14 * second * mMaterialListSize * 8;
+ }
+
+ Logger.WARNING("[BAS] Size: " + mMaterialListSize);
+
+ // Make a simple one Material MaterialStack[] and log it for validity.
+ circuitGT = ItemUtils.getGregtechCircuit(1);
+ final ItemStack[] tItemStackTest = new ItemStack[] { circuitGT, tStack };
+ inputStackCount = 1;
+ fluidAmount = 144 * inputStackCount;
+ Logger.WARNING(
+ "[BAS] Adding an Alloy Blast Smelter Recipe for " + M.getLocalizedName()
+ + ". Gives "
+ + fluidAmount
+ + "L of molten metal.");
+ for (int das = 0; das < tItemStackTest.length; das++) {
+ if (tItemStackTest[das] != null) {
+ Logger.WARNING(
+ "[BAS] tMaterial[" + das
+ + "]: "
+ + tItemStackTest[das].getDisplayName()
+ + " Meta: "
+ + tItemStackTest[das].getItemDamage()
+ + ", Amount: "
+ + tItemStackTest[das].stackSize);
+ }
+ }
+
+ final boolean hasMoreInputThanACircuit = (tItemStackTest.length > 1);
+
+ // Generate Recipes for all singular materials that can be made molten.
+ if (hasMoreInputThanACircuit) {
+ if (M.requiresBlastFurnace()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tItemStackTest)
+ .fluidOutputs(M.getFluidStack(fluidAmount))
+ .duration(duration / (mTotalPartsCounter > 0 ? mTotalPartsCounter : 1))
+ .eut(aVoltage)
+ .recipeCategory(GTPPRecipeCategories.absNonAlloyRecipes)
+ .addTo(GTPPRecipeMaps.alloyBlastSmelterRecipes);
+ } else {
+ Logger.WARNING("[BAS] Failed.");
+ }
+ } else {
+ if (CORE.RA.addBlastSmelterRecipe(
+ tItemStackTest,
+ M.getFluidStack(fluidAmount),
+ 100,
+ duration / (mTotalPartsCounter > 0 ? mTotalPartsCounter : 1) / 2,
+ (int) aVoltage)) {
+ Logger.WARNING("[BAS] Success.");
+ if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Ingot.get(0),
+ M.getFluidStack(144),
+ M.getIngot(1),
+ duration / 2,
+ 60)) {
+ Logger.WARNING("[BAS] Success, Also added a Fluid solidifier recipe.");
+ /*
+ * if (GT_Values.RA.addFluidExtractionRecipe(M.getIngot(1), null, M.getFluidStack(144), 100,
+ * duration/2, 60)){ Logger.WARNING("[BAS] Success, Also added a Fluid Extractor recipe."); } if
+ * (GT_Values.RA.addFluidExtractionRecipe(M.getNugget(1), null, M.getFluidStack(16), 100,
+ * duration/2/9, 60)){ Logger.WARNING("[BAS] Success, Also added a Fluid Extractor recipe."); }
+ */
+ /*
+ * if (GT_Values.RA.addFluidExtractionRecipe(M.getSmallDust(1), null, M.getFluid(36), 100,
+ * duration/2/4, 60)){ Logger.WARNING("[BAS] Success, Also added a Fluid Extractor recipe."); }
+ * if (GT_Values.RA.addFluidExtractionRecipe(M.getTinyDust(1), null, M.getFluid(16), 100,
+ * duration/2/9, 60)){ Logger.WARNING("[BAS] Success, Also added a Fluid Extractor recipe."); }
+ */
+ }
+ } else {
+ Logger.WARNING("[BAS] Failed.");
+ }
+ }
+
+ if (tMaterial != null) {
+ // Reset the Variables for compounds if last recipe was a success.
+ inputStackCount = 0;
+
+ // If this Material has some kind of compound list, proceed
+ if (mMaterialListSize > 1) {
+ final gtPlusPlus.core.material.MaterialStack[] tempStack = new gtPlusPlus.core.material.MaterialStack[mMaterialListSize];
+ circuitGT = ItemUtils.getGregtechCircuit(mMaterialListSize);
+ // Just double checking
+ if (tempStack.length > 1) {
+
+ // Builds me a MaterialStack[] from the MaterialList of M.
+ int ooo = 0;
+ for (final gtPlusPlus.core.material.MaterialStack xMaterial : M.getComposites()) {
+ if (xMaterial != null) {
+ if (xMaterial.getStackMaterial() != null) {
+ Logger.WARNING(
+ "[BAS] FOUND: " + xMaterial.getStackMaterial()
+ .getLocalizedName());
+ Logger.WARNING(
+ "[BAS] ADDING: " + xMaterial.getStackMaterial()
+ .getLocalizedName());
+ }
+ tempStack[ooo] = xMaterial;
+ }
+ ooo++;
+ }
+
+ // Builds me an ItemStack[] of the materials. - Without a circuit - this gets a good count for
+ // the 144L fluid multiplier
+ components = new ItemStack[9];
+ inputStackCount = 0;
+ FluidStack componentsFluid = null;
+ for (int irc = 0; irc < M.getComposites()
+ .size(); irc++) {
+ if (M.getComposites()
+ .get(irc) != null) {
+ final int r = (int) M.vSmallestRatio[irc];
+ inputStackCount = inputStackCount + r;
+ if ((M.getComposites()
+ .get(irc)
+ .getStackMaterial()
+ .getState() != MaterialState.SOLID)
+ || !ItemUtils.checkForInvalidItems(
+ M.getComposites()
+ .get(irc)
+ .getDustStack(r))) {
+ final int xr = r;
+ if ((xr > 0) && (xr <= 100)) {
+ final int mathmatics = (r * 1000);
+ componentsFluid = FluidUtils.getFluidStack(
+ M.getComposites()
+ .get(irc)
+ .getStackMaterial()
+ .getFluidStack(mathmatics),
+ mathmatics);
+ }
+ } else {
+ components[irc] = M.getComposites()
+ .get(irc)
+ .getUnificatedDustStack(r);
+ }
+ }
+ }
+
+ // Adds a circuit
+ if ((mMaterialListSize < 9) && (mMaterialListSize != 0)) {
+ final ItemStack[] components_NoCircuit = components;
+ // Builds me an ItemStack[] of the materials. - With a circuit
+ components = new ItemStack[components_NoCircuit.length + 1];
+ for (int fr = 0; fr < components.length; fr++) {
+ if (fr == 0) {
+ components[0] = circuitGT;
+ } else {
+ components[fr] = components_NoCircuit[fr - 1];
+ }
+ }
+ Logger.WARNING(
+ "[BAS] Should have added a circuit. mMaterialListSize: " + mMaterialListSize
+ + " | circuit: "
+ + components[0].getDisplayName());
+ } else {
+ Logger.WARNING("[BAS] Did not add a circuit. mMaterialListSize: " + mMaterialListSize);
+ }
+
+ // Set Fluid output
+ fluidAmount = 144 * inputStackCount;
+
+ Logger.WARNING(
+ "[BAS] Adding an Alloy Blast Smelter Recipe for " + M.getLocalizedName()
+ + " using it's compound dusts. This material has "
+ + inputStackCount
+ + " parts. Gives "
+ + fluidAmount
+ + "L of molten metal.");
+ Logger.WARNING("[BAS] tMaterial.length: " + components.length + ".");
+ for (int das = 0; das < components.length; das++) {
+ if (components[das] != null) {
+ Logger.WARNING(
+ "[BAS] tMaterial[" + das
+ + "]: "
+ + components[das].getDisplayName()
+ + " Meta: "
+ + components[das].getItemDamage()
+ + ", Amount: "
+ + components[das].stackSize);
+ }
+ }
+
+ // Adds Recipe
+ if (M.requiresBlastFurnace()) {
+ if (CORE.RA.addBlastSmelterRecipe(
+ components,
+ componentsFluid,
+ M.getFluidStack(fluidAmount),
+ 100,
+ duration,
+ (int) aVoltage)) {
+ Logger.WARNING("[BAS] Success.");
+ } else {
+ Logger.WARNING("[BAS] Failed.");
+ }
+ } else {
+ if (CORE.RA.addBlastSmelterRecipe(
+ components,
+ componentsFluid,
+ M.getFluidStack(fluidAmount),
+ 100,
+ duration,
+ (int) aVoltage / 2)) {
+ Logger.WARNING("[BAS] Success.");
+ } else {
+ Logger.WARNING("[BAS] Failed.");
+ }
+ }
+ }
+ }
+ } else {
+ Logger.WARNING("[BAS] doTest: " + doTest + " | tMaterial != null: " + (tMaterial != null));
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelterGT_GTNH.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelterGT_GTNH.java
new file mode 100644
index 0000000000..5398a6a0b5
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_BlastSmelterGT_GTNH.java
@@ -0,0 +1,252 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.minecraft.ItemStackData;
+import gtPlusPlus.api.recipe.GTPPRecipeCategories;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_BlastSmelterGT_GTNH {
+
+ private static Map<String, FluidStack> mCachedIngotToFluidRegistry = new HashMap<>();
+ private static Map<String, String> mCachedHotToColdRegistry = new HashMap<>();
+
+ private static synchronized void setIngotToFluid(final ItemStackData stack, final FluidStack fluid) {
+ if (stack != null && fluid != null) {
+ mCachedIngotToFluidRegistry.put(stack.getUniqueDataIdentifier(), fluid);
+ }
+ }
+
+ private static synchronized void setHotToCold(final ItemStackData hot, final ItemStackData cold) {
+ if (hot != null && cold != null) {
+ mCachedHotToColdRegistry.put(hot.getUniqueDataIdentifier(), cold.getUniqueDataIdentifier());
+ }
+ }
+
+ private static synchronized FluidStack getFluidFromIngot(final ItemStackData ingot) {
+ ItemStackData h = ingot;
+ if (mCachedIngotToFluidRegistry.containsKey(h.getUniqueDataIdentifier())) {
+ Logger.MACHINE_INFO("[ABS] mCachedIngotToFluidRegistry contains Output Ingot.");
+ return mCachedIngotToFluidRegistry.get(h.getUniqueDataIdentifier());
+ }
+ if (mCachedHotToColdRegistry.containsKey(h.getUniqueDataIdentifier())) {
+ Logger.MACHINE_INFO("[ABS] mCachedHotToColdRegistry contains Output Ingot.");
+ return mCachedIngotToFluidRegistry.get(mCachedHotToColdRegistry.get(h.getUniqueDataIdentifier()));
+ }
+ Logger.MACHINE_INFO("[ABS] Neither Cache contains Output Ingot.");
+ return null;
+ }
+
+ private static boolean isValid(final ItemStack[] inputs, final ItemStack outputs[], final FluidStack[] fluidIn,
+ final FluidStack fluidOut) {
+ if (inputs != null && outputs != null
+ && fluidIn != null
+ && fluidOut != null
+ && inputs.length > 0
+ && outputs.length > 0) {
+ return true;
+ }
+ return false;
+ }
+
+ public static synchronized boolean generateGTNHBlastSmelterRecipesFromEBFList() {
+
+ // Make a counting object
+ int mSuccess = 0;
+
+ Logger.INFO("[ABS] Starting recipe generation based on EBF recipe map.");
+ Logger.INFO("[ABS] Caching Ingots and their Molten fluid..");
+ // Ingots/Dusts -> Fluids
+ for (GT_Recipe x : RecipeMaps.fluidExtractionRecipes.getAllRecipes()) {
+ ItemStack validInput = null;
+ FluidStack validOutput = null;
+ // If there aren't both non empty inputs and outputs, we skip
+ if (ArrayUtils.isEmpty(x.mInputs) || ArrayUtils.isEmpty(x.mFluidOutputs)) {
+ continue;
+ }
+
+ for (int tag : OreDictionary.getOreIDs(x.mInputs[0])) {
+ String oreName = OreDictionary.getOreName(tag)
+ .toLowerCase();
+ String mType = "ingot";
+ if (oreName.startsWith(mType) && !oreName.contains("double")
+ && !oreName.contains("triple")
+ && !oreName.contains("quad")
+ && !oreName.contains("quintuple")) {
+ validInput = x.mInputs[0];
+ }
+ }
+
+ validOutput = x.mFluidOutputs[0];
+
+ if (validInput != null) {
+ ItemStackData R = new ItemStackData(validInput);
+ setIngotToFluid(R, validOutput);
+ Logger.MACHINE_INFO(
+ "[ABS][I2F] Cached " + validInput.getDisplayName()
+ + " to "
+ + validOutput.getLocalizedName()
+ + ". Stored Under ID of "
+ + R.getUniqueDataIdentifier());
+ }
+ }
+
+ Logger.INFO("[ABS] Caching Ingots and their Hot form...");
+ // Hot Ingots -> Cold Ingots
+ for (GT_Recipe x : RecipeMaps.vacuumFreezerRecipes.getAllRecipes()) {
+ ItemStack validInput = null;
+ ItemStack validOutput = null;
+ // If we the input is an ingot and it and the output are valid, map it to cache.
+ if (ArrayUtils.isNotEmpty(x.mInputs) && x.mInputs[0] != null) {
+ validInput = x.mInputs[0];
+ }
+ if (ArrayUtils.isNotEmpty(x.mOutputs) && x.mOutputs[0] != null) {
+ validOutput = x.mOutputs[0];
+ }
+ if (validInput != null && validOutput != null) {
+ ItemStackData R1 = new ItemStackData(validInput);
+ ItemStackData R2 = new ItemStackData(validOutput);
+ setHotToCold(R1, R2);
+ Logger.MACHINE_INFO(
+ "[ABS][H2C] Cached " + validInput.getDisplayName()
+ + " to "
+ + validOutput.getDisplayName()
+ + ". Stored Under ID of "
+ + R1.getUniqueDataIdentifier()
+ + ", links to ID "
+ + R2.getUniqueDataIdentifier());
+ }
+ }
+
+ Logger.INFO("[ABS] Generating recipes based on existing EBF recipes.");
+ // Okay, so now lets Iterate existing EBF recipes.
+ for (GT_Recipe x : RecipeMaps.blastFurnaceRecipes.getAllRecipes()) {
+ ItemStack[] inputs, outputs;
+ FluidStack[] inputsF;
+ int voltage, time, special;
+ boolean enabled;
+ inputs = x.mInputs.clone();
+ outputs = x.mOutputs.clone();
+ inputsF = x.mFluidInputs.clone();
+ voltage = x.mEUt;
+ time = x.mDuration;
+ enabled = x.mEnabled;
+ special = x.mSpecialValue;
+
+ // continue to next recipe if the Temp is too high.
+ if (special > 3600) {
+ Logger.MACHINE_INFO("[ABS] Skipping ABS addition for GTNH due to temp.");
+ continue;
+ } else {
+ FluidStack mMoltenStack = null;
+ int mMoltenCount = 0;
+ // If We have a valid Output, let's try use our cached data to get it's molten form.
+ if (x.mOutputs != null && x.mOutputs[0] != null) {
+ mMoltenCount = x.mOutputs[0].stackSize;
+ ItemStackData R = new ItemStackData(x.mOutputs[0]);
+ Logger.MACHINE_INFO(
+ "[ABS] Found " + x.mOutputs[0].getDisplayName()
+ + " as valid EBF output, finding it's fluid from the cache. We will require "
+ + (144 * mMoltenCount)
+ + "L. Looking for ID "
+ + R.getUniqueDataIdentifier());
+ FluidStack tempFluid = getFluidFromIngot(R);
+ if (tempFluid != null) {
+ // Logger.MACHINE_INFO("[ABS] Got Fluid from Cache.");
+ mMoltenStack = FluidUtils.getFluidStack(tempFluid, mMoltenCount * 144);
+ } else {
+ Logger.MACHINE_INFO("[ABS] Failed to get Fluid from Cache.");
+ }
+ }
+ // If this recipe is enabled and we have a valid molten fluidstack, let's try add this recipe.
+ if (enabled && isValid(inputs, outputs, inputsF, mMoltenStack)) {
+ // Boolean to decide whether or not to create a new circuit later
+ boolean circuitFound = false;
+
+ // Build correct input stack
+ ArrayList<ItemStack> aTempList = new ArrayList<>();
+ for (ItemStack recipeItem : inputs) {
+ if (ItemUtils.isControlCircuit(recipeItem)) {
+ circuitFound = true;
+ }
+ aTempList.add(recipeItem);
+ }
+
+ inputs = aTempList.toArray(new ItemStack[aTempList.size()]);
+ int inputLength = inputs.length;
+ // If no circuit was found, increase array length by 1 to add circuit at newInput[0]
+ if (!circuitFound) {
+ inputLength++;
+ }
+
+ ItemStack[] newInput = new ItemStack[inputLength];
+
+ int l = 0;
+ // If no circuit was found, add a circuit here
+ if (!circuitFound) {
+ l = 1;
+ newInput[0] = CI.getNumberedCircuit(inputs.length);
+ }
+
+ for (ItemStack y : inputs) {
+ newInput[l++] = y;
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(newInput)
+ .fluidInputs(inputsF)
+ .fluidOutputs(mMoltenStack)
+ .duration(MathUtils.roundToClosestInt(time * 0.8))
+ .eut(voltage)
+ .recipeCategory(
+ inputLength <= 2 ? GTPPRecipeCategories.absNonAlloyRecipes
+ : GTPPRecipeMaps.alloyBlastSmelterRecipes.getDefaultRecipeCategory())
+ .addTo(GTPPRecipeMaps.alloyBlastSmelterRecipes);
+ } else {
+ if (!enabled) {
+ Logger.MACHINE_INFO("[ABS] Failure. EBF recipe was not enabled.");
+ } else {
+ Logger.MACHINE_INFO("[ABS] Failure. Invalid Inputs or Outputs.");
+ if (inputs == null) {
+ Logger.MACHINE_INFO("[ABS] Inputs were not Valid.");
+ } else {
+ Logger.MACHINE_INFO("[ABS] inputs size: " + inputs.length);
+ }
+ if (outputs == null) {
+ Logger.MACHINE_INFO("[ABS] Outputs were not Valid.");
+ } else {
+ Logger.MACHINE_INFO("[ABS] outputs size: " + outputs.length);
+ }
+ if (inputsF == null) {
+ Logger.MACHINE_INFO("[ABS] Input Fluids were not Valid.");
+ } else {
+ Logger.MACHINE_INFO("[ABS] inputsF size: " + inputsF.length);
+ }
+ if (mMoltenStack == null) {
+ Logger.MACHINE_INFO("[ABS] Output Fluid were not Valid.");
+ }
+ }
+ }
+ }
+ }
+
+ Logger.INFO("[ABS] Processed " + mSuccess + " recipes.");
+ return mSuccess > 0;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_DustGeneration.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_DustGeneration.java
new file mode 100644
index 0000000000..1499ea3cad
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_DustGeneration.java
@@ -0,0 +1,448 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class RecipeGen_DustGeneration extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_DustGeneration(final Material M) {
+ this(M, false);
+ }
+
+ public RecipeGen_DustGeneration(final Material M, final boolean O) {
+ this.toGenerate = M;
+ this.disableOptional = O;
+ mRecipeGenMap.add(this);
+ final ItemStack normalDust = M.getDust(1);
+ final ItemStack smallDust = M.getSmallDust(1);
+ final ItemStack tinyDust = M.getTinyDust(1);
+ if (tinyDust != null && normalDust != null) {
+ if (RecipeUtils.addShapedRecipe(
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ normalDust)) {
+ Logger.INFO("9 Tiny dust to 1 Dust Recipe: " + M.getLocalizedName() + " - Success");
+ } else {
+ Logger.INFO("9 Tiny dust to 1 Dust Recipe: " + M.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(normalDust, null, null, null, null, null, null, null, null, M.getTinyDust(9))) {
+ Logger.INFO("9 Tiny dust from 1 Recipe: " + M.getLocalizedName() + " - Success");
+ } else {
+ Logger.INFO("9 Tiny dust from 1 Recipe: " + M.getLocalizedName() + " - Failed");
+ }
+ }
+
+ if (smallDust != null && normalDust != null) {
+ if (RecipeUtils.addShapedRecipe(
+ smallDust,
+ smallDust,
+ null,
+ smallDust,
+ smallDust,
+ null,
+ null,
+ null,
+ null,
+ normalDust)) {
+ Logger.INFO("4 Small dust to 1 Dust Recipe: " + M.getLocalizedName() + " - Success");
+ } else {
+ Logger.INFO("4 Small dust to 1 Dust Recipe: " + M.getLocalizedName() + " - Failed");
+ }
+ if (RecipeUtils
+ .addShapedRecipe(null, normalDust, null, null, null, null, null, null, null, M.getSmallDust(4))) {
+ Logger.INFO("4 Small dust from 1 Dust Recipe: " + M.getLocalizedName() + " - Success");
+ } else {
+ Logger.INFO("4 Small dust from 1 Dust Recipe: " + M.getLocalizedName() + " - Failed");
+ }
+ }
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate, this.disableOptional);
+ }
+
+ private void generateRecipes(final Material material, final boolean disableOptional) {
+
+ Logger.INFO("Generating Shaped Crafting recipes for " + material.getLocalizedName());
+
+ final ItemStack normalDust = material.getDust(1);
+ final ItemStack smallDust = material.getSmallDust(1);
+ final ItemStack tinyDust = material.getTinyDust(1);
+
+ final ItemStack[] inputStacks = material.getMaterialComposites();
+ final ItemStack outputStacks = material.getDust(material.smallestStackSizeWhenProcessing);
+
+ // Macerate blocks back to dusts.
+ final ItemStack materialBlock = material.getBlock(1);
+ final ItemStack materialFrameBox = material.getFrameBox(1);
+
+ if (ItemUtils.checkForInvalidItems(materialBlock)) {
+ GT_ModHandler.addPulverisationRecipe(materialBlock, material.getDust(9));
+ }
+
+ if (ItemUtils.checkForInvalidItems(materialFrameBox)) {
+ GT_ModHandler.addPulverisationRecipe(materialFrameBox, material.getDust(2));
+ }
+
+ if (ItemUtils.checkForInvalidItems(smallDust) && ItemUtils.checkForInvalidItems(tinyDust)) {
+ generatePackagerRecipes(material);
+ }
+
+ ItemStack ingot = material.getIngot(1);
+ if (ItemUtils.checkForInvalidItems(normalDust) && ItemUtils.checkForInvalidItems(ingot)) {
+ addFurnaceRecipe(material);
+ addMacerationRecipe(material);
+ }
+
+ // Is this a composite?
+ if ((inputStacks != null) && !disableOptional) {
+ // Is this a composite?
+ Logger.WARNING("mixer length: " + inputStacks.length);
+ if ((inputStacks.length != 0) && (inputStacks.length <= 4)) {
+ // Log Input items
+ Logger.WARNING(ItemUtils.getArrayStackNames(inputStacks));
+ final long[] inputStackSize = material.vSmallestRatio;
+ Logger.WARNING("mixer is stacksizeVar null? " + (inputStackSize != null));
+ // Is smallest ratio invalid?
+ if (inputStackSize != null) {
+ // set stack sizes on an input ItemStack[]
+ for (short x = 0; x < inputStacks.length; x++) {
+ if ((inputStacks[x] != null) && (inputStackSize[x] != 0)) {
+ inputStacks[x].stackSize = (int) inputStackSize[x];
+ }
+ }
+ // Relog input values, with stack sizes
+ Logger.WARNING(ItemUtils.getArrayStackNames(inputStacks));
+
+ // Get us four ItemStacks to input into the mixer
+ ItemStack[] input = new ItemStack[4];
+
+ input[0] = (inputStacks.length >= 1) ? ((inputStacks[0] == null) ? null : inputStacks[0]) : null;
+ input[1] = (inputStacks.length >= 2) ? ((inputStacks[1] == null) ? null : inputStacks[1]) : null;
+ input[2] = (inputStacks.length >= 3) ? ((inputStacks[2] == null) ? null : inputStacks[2]) : null;
+ input[3] = (inputStacks.length >= 4) ? ((inputStacks[3] == null) ? null : inputStacks[3]) : null;
+
+ if (inputStacks.length == 1) {
+ input[1] = input[0];
+ input[0] = CI.getNumberedCircuit(inputStacks.length + 10);
+ } else if (inputStacks.length == 2) {
+ input[2] = input[1];
+ input[1] = input[0];
+ input[0] = CI.getNumberedCircuit(inputStacks.length + 10);
+
+ } else if (inputStacks.length == 3) {
+ input[3] = input[2];
+ input[2] = input[1];
+ input[1] = input[0];
+ input[0] = CI.getNumberedCircuit(inputStacks.length + 10);
+ }
+
+ /*
+ * for (int g = 0; g<4; g++) { if(inputStacks.length > g) { input[g] = inputStacks[g] != null ?
+ * inputStacks[g] : null; } else { input[g] = CI.getNumberedCircuit(g+10); break; } }
+ */
+
+ // Add mixer Recipe
+ FluidStack oxygen = GT_Values.NF;
+ if (material.getComposites() != null) {
+ for (final MaterialStack x : material.getComposites()) {
+ if (!material.getComposites()
+ .isEmpty()) {
+ if (x != null) {
+ if (x.getStackMaterial() != null) {
+ if (x.getStackMaterial()
+ .getDust(1) == null) {
+ if (x.getStackMaterial()
+ .getState() != MaterialState.SOLID
+ && x.getStackMaterial()
+ .getState() != MaterialState.ORE
+ && x.getStackMaterial()
+ .getState() != MaterialState.PLASMA) {
+ oxygen = x.getStackMaterial()
+ .getFluidStack(1000);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ input = ItemUtils.cleanItemStackArray(input);
+
+ // Add mixer Recipe
+ if (GT_Values.RA.addMixerRecipe(
+ input[0],
+ input[1],
+ input[2],
+ input[3],
+ oxygen,
+ null,
+ outputStacks,
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) // Was 6, but let's try 2. This makes Potin LV, for example.
+ {
+ Logger.WARNING("Dust Mixer Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Dust Mixer Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Add Shapeless recipe for low tier alloys.
+ /*
+ * if (tVoltageMultiplier <= 30){ if (RecipeUtils.addShapedGregtechRecipe(inputStacks,
+ * outputStacks)){
+ * Logger.WARNING("Dust Shapeless Recipe: "+material.getLocalizedName()+" - Success"); } else {
+ * Logger.WARNING("Dust Shapeless Recipe: "+material.getLocalizedName()+" - Failed"); } }
+ */
+ }
+ }
+ }
+ }
+
+ public static boolean addMixerRecipe_Standalone(final Material material) {
+ final ItemStack[] inputStacks = material.getMaterialComposites();
+ final ItemStack outputStacks = material.getDust(material.smallestStackSizeWhenProcessing);
+ // Is this a composite?
+ if ((inputStacks != null)) {
+ // Is this a composite?
+ Logger.WARNING("mixer length: " + inputStacks.length);
+ if ((inputStacks.length >= 1) && (inputStacks.length <= 4)) {
+ // Log Input items
+ Logger.WARNING(ItemUtils.getArrayStackNames(inputStacks));
+ final long[] inputStackSize = material.vSmallestRatio;
+ Logger.WARNING("mixer is stacksizeVar not null? " + (inputStackSize != null));
+ // Is smallest ratio invalid?
+ if (inputStackSize != null) {
+ // set stack sizes on an input ItemStack[]
+ for (short x = 0; x < inputStacks.length; x++) {
+ if ((inputStacks[x] != null) && (inputStackSize[x] != 0)) {
+ inputStacks[x].stackSize = (int) inputStackSize[x];
+ }
+ }
+ // Relog input values, with stack sizes
+ Logger.WARNING(ItemUtils.getArrayStackNames(inputStacks));
+
+ // Get us four ItemStacks to input into the mixer
+ ItemStack input1, input2, input3, input4;
+ input1 = inputStacks[0];
+ input2 = (inputStacks.length >= 2) ? (input2 = (inputStacks[1] == null) ? null : inputStacks[1])
+ : null;
+ input3 = (inputStacks.length >= 3) ? (input3 = (inputStacks[2] == null) ? null : inputStacks[2])
+ : null;
+ input4 = (inputStacks.length >= 4) ? (input4 = (inputStacks[3] == null) ? null : inputStacks[3])
+ : null;
+
+ if (inputStacks.length == 1) {
+ input2 = input1;
+ input1 = CI.getNumberedCircuit(20);
+ } else if (inputStacks.length == 2) {
+ input3 = input2;
+ input2 = input1;
+ input1 = CI.getNumberedCircuit(20);
+
+ } else if (inputStacks.length == 3) {
+ input4 = input3;
+ input3 = input2;
+ input2 = input1;
+ input1 = CI.getNumberedCircuit(20);
+ }
+
+ // Add mixer Recipe
+ FluidStack oxygen = GT_Values.NF;
+ if (material.getComposites() != null) {
+ int compSlot = 0;
+ for (final MaterialStack x : material.getComposites()) {
+ if (!material.getComposites()
+ .isEmpty()) {
+ if (x != null) {
+ if (x.getStackMaterial() != null) {
+ if (x.getStackMaterial()
+ .getDust(1) == null) {
+ MaterialState f = x.getStackMaterial()
+ .getState();
+ if (f == MaterialState.GAS || f == MaterialState.LIQUID
+ || f == MaterialState.PURE_LIQUID
+ || f == MaterialState.PURE_GAS) {
+ oxygen = x.getStackMaterial()
+ .getFluidStack((int) (material.vSmallestRatio[compSlot] * 1000));
+ }
+ }
+ }
+ }
+ }
+ compSlot++;
+ }
+ }
+
+ // Add mixer Recipe
+ try {
+ if (GT_Values.RA.addMixerRecipe(
+ input1,
+ input2,
+ input3,
+ input4,
+ oxygen,
+ null,
+ outputStacks,
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) // Was 6, but let's try 2. This makes Potin LV, for
+ // example.
+ {
+ Logger.WARNING("Dust Mixer Recipe: " + material.getLocalizedName() + " - Success");
+ return true;
+ } else {
+ Logger.WARNING("Dust Mixer Recipe: " + material.getLocalizedName() + " - Failed");
+ return false;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ } else {
+ Logger.WARNING("inputStackSize == NUll - " + material.getLocalizedName());
+ }
+ } else {
+ Logger.WARNING("InputStacks is out range 1-4 - " + material.getLocalizedName());
+ }
+ } else {
+ Logger.WARNING("InputStacks == NUll - " + material.getLocalizedName());
+ }
+ return false;
+ }
+
+ public static boolean generatePackagerRecipes(Material aMatInfo) {
+ AutoMap<Boolean> aResults = new AutoMap<>();
+ // Small Dust
+ aResults.put(
+ GT_Values.RA.addBoxingRecipe(
+ GT_Utility.copyAmount(4L, new Object[] { aMatInfo.getSmallDust(4) }),
+ ItemList.Schematic_Dust.get(0L, new Object[0]),
+ aMatInfo.getDust(1),
+ 100,
+ 4));
+ // Tiny Dust
+ aResults.put(
+ GT_Values.RA.addBoxingRecipe(
+ GT_Utility.copyAmount(9L, new Object[] { aMatInfo.getTinyDust(9) }),
+ ItemList.Schematic_Dust.get(0L, new Object[0]),
+ aMatInfo.getDust(1),
+ 100,
+ 4));
+
+ for (boolean b : aResults) {
+ if (!b) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void addMacerationRecipe(Material aMatInfo) {
+ try {
+ Logger.MATERIALS("Adding Maceration recipe for " + aMatInfo.getLocalizedName() + " Ingot -> Dusts");
+ final int chance = (aMatInfo.vTier * 10) / MathUtils.randInt(10, 20);
+ GT_ModHandler.addPulverisationRecipe(aMatInfo.getIngot(1), aMatInfo.getDust(1), null, chance);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ private void addFurnaceRecipe(Material aMatInfo) {
+
+ ItemStack aDust = aMatInfo.getDust(1);
+ ItemStack aOutput;
+ try {
+ if (aMatInfo.requiresBlastFurnace()) {
+ aOutput = aMatInfo.getHotIngot(1);
+ if (ItemUtils.checkForInvalidItems(aOutput)) {
+ if (addBlastFurnaceRecipe(aMatInfo, aDust, null, aOutput, null, aMatInfo.getMeltingPointK())) {
+ Logger
+ .MATERIALS("Successfully added a blast furnace recipe for " + aMatInfo.getLocalizedName());
+ } else {
+ Logger.MATERIALS("Failed to add a blast furnace recipe for " + aMatInfo.getLocalizedName());
+ }
+ } else {
+ Logger.MATERIALS("Failed to add a blast furnace recipe for " + aMatInfo.getLocalizedName());
+ }
+ } else {
+ aOutput = aMatInfo.getIngot(1);
+ if (ItemUtils.checkForInvalidItems(aOutput)) {
+ if (CORE.RA.addSmeltingAndAlloySmeltingRecipe(aDust, aOutput)) {
+ Logger.MATERIALS("Successfully added a furnace recipe for " + aMatInfo.getLocalizedName());
+ } else {
+ Logger.MATERIALS("Failed to add a furnace recipe for " + aMatInfo.getLocalizedName());
+ }
+ }
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ private boolean addBlastFurnaceRecipe(Material aMatInfo, final ItemStack input1, final ItemStack input2,
+ final ItemStack output1, final ItemStack output2, final int tempRequired) {
+
+ try {
+ int timeTaken = 125 * aMatInfo.vTier * 10;
+
+ if (aMatInfo.vTier <= 4) {
+ timeTaken = 25 * aMatInfo.vTier * 10;
+ }
+ int aSlot = aMatInfo.vTier;
+ if (aSlot < 2) {
+ aSlot = 2;
+ }
+ long aVoltage = aMatInfo.vVoltageMultiplier;
+
+ return GT_Values.RA.addBlastRecipe(
+ input1,
+ input2,
+ GT_Values.NF,
+ GT_Values.NF,
+ output1,
+ output2,
+ timeTaken,
+ (int) aVoltage,
+ tempRequired);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return false;
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Extruder.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Extruder.java
new file mode 100644
index 0000000000..a69a96b925
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Extruder.java
@@ -0,0 +1,159 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_Extruder extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Extruder(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+
+ final ItemStack itemIngot = material.getIngot(1);
+ final ItemStack itemPlate = material.getPlate(1);
+ final ItemStack itemGear = material.getGear(1);
+
+ final ItemStack shape_Plate = ItemList.Shape_Extruder_Plate.get(0);
+ final ItemStack shape_Ring = ItemList.Shape_Extruder_Ring.get(0);
+ final ItemStack shape_Gear = ItemList.Shape_Extruder_Gear.get(0);
+ final ItemStack shape_Rod = ItemList.Shape_Extruder_Rod.get(0);
+ final ItemStack shape_Bolt = ItemList.Shape_Extruder_Bolt.get(0);
+ final ItemStack shape_Block = ItemList.Shape_Extruder_Block.get(0);
+ final ItemStack shape_Ingot = ItemList.Shape_Extruder_Ingot.get(0);
+
+ Logger.WARNING("Generating Extruder recipes for " + material.getLocalizedName());
+
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getBlock(1))) {
+ // Ingot Recipe
+ if (GT_Values.RA.addExtruderRecipe(
+ material.getBlock(1),
+ shape_Ingot,
+ material.getIngot(9),
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Ingot Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Ingot Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Block Recipe
+ if (GT_Values.RA.addExtruderRecipe(
+ material.getIngot(9),
+ shape_Block,
+ material.getBlock(1),
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Block Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Block Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Plate Recipe
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getPlate(1)))
+ if (GT_Values.RA.addExtruderRecipe(itemIngot, shape_Plate, itemPlate, 10, material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Plate Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Plate Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Ring Recipe
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1)) && ItemUtils.checkForInvalidItems(material.getRing(1)))
+ if (!material.isRadioactive) {
+ if (GT_Values.RA.addExtruderRecipe(
+ itemIngot,
+ shape_Ring,
+ material.getRing(4),
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Ring Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Ring Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Gear Recipe
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1)) && ItemUtils.checkForInvalidItems(material.getGear(1)))
+ if (!material.isRadioactive) {
+ if (GT_Values.RA.addExtruderRecipe(
+ material.getIngot(4),
+ shape_Gear,
+ itemGear,
+ (int) Math.max(material.getMass() * 5L, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Gear Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Gear Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Rod Recipe
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1)) && ItemUtils.checkForInvalidItems(material.getRod(1)))
+ if (GT_Values.RA.addExtruderRecipe(
+ itemIngot,
+ shape_Rod,
+ material.getRod(2),
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Bolt Recipe
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1)) && ItemUtils.checkForInvalidItems(material.getBolt(1)))
+ if (!material.isRadioactive) {
+ if (GT_Values.RA.addExtruderRecipe(
+ itemIngot,
+ shape_Bolt,
+ material.getBolt(8),
+ (int) Math.max(material.getMass() * 2L * 1, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Bolt Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Bolt Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Rotor Recipe
+ // Shape_Extruder_Rotor
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getRotor(1)))
+ if (GT_Values.RA.addExtruderRecipe(
+ material.getIngot(5),
+ ItemList.Shape_Extruder_Rotor.get(0),
+ material.getRotor(1),
+ (int) Math.max(material.getMass() * 5L * 1, 1),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Extruder Rotor Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Extruder Rotor Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_FluidCanning.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_FluidCanning.java
new file mode 100644
index 0000000000..fb6dc807ef
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_FluidCanning.java
@@ -0,0 +1,222 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class RecipeGen_FluidCanning implements Runnable {
+
+ public static void init() {
+ FluidCanningRunnableHandler x = new FluidCanningRunnableHandler();
+ x.run();
+ }
+
+ private static class FluidCanningRunnableHandler implements RunnableWithInfo<String> {
+
+ @Override
+ public void run() {
+ mHasRun = true;
+ for (RecipeGen_FluidCanning aRecipe : mCache) {
+ aRecipe.run();
+ }
+ }
+
+ @Override
+ public String getInfoData() {
+ return "Fluid Canning Recipes";
+ }
+ }
+
+ private static boolean mHasRun = false;
+
+ private static HashSet<RecipeGen_FluidCanning> mCache = new HashSet<>();
+
+ private static void addRunnableToRecipeCache(RecipeGen_FluidCanning r) {
+ if (mHasRun) {
+ CORE.crash();
+ }
+ mCache.add(r);
+ }
+
+ protected boolean disableOptional;
+
+ private final GT_Recipe recipe;
+ private final boolean isValid;
+
+ public boolean valid() {
+ return isValid;
+ }
+
+ // Alternative Constructor
+ public RecipeGen_FluidCanning(boolean aExtracting, ItemStack aEmpty, ItemStack aFull, FluidStack aFluidIn,
+ FluidStack aFluidOut, Integer aDuration, Integer aEUt) {
+ ItemStack aInput;
+ ItemStack aOutput;
+ FluidStack aFluidInput;
+ FluidStack aFluidOutput;
+
+ // Safety check on the duration
+ if (aDuration == null || aDuration <= 0) {
+ aDuration = (aFluidIn != null) ? (aFluidIn.amount / 62)
+ : ((aFluidOut != null) ? (aFluidOut.amount / 62) : 10);
+ }
+
+ // Safety check on the EU
+ if (aEUt == null || aEUt <= 0) {
+ if (aExtracting) {
+ aEUt = 2;
+ } else {
+ aEUt = 1;
+ }
+ }
+
+ // Set Item stacks correctly, invert if extraction recipe.
+ if (aExtracting) {
+ aInput = aFull;
+ aOutput = aEmpty;
+ aFluidInput = GT_Values.NF;
+ aFluidOutput = aFluidIn;
+ } else {
+ aInput = aEmpty;
+ aOutput = aFull;
+ aFluidInput = aFluidIn;
+ aFluidOutput = aFluidOut != null ? aFluidOut : GT_Values.NF;
+ }
+
+ // Check validity
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] { 10000 },
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ 0);
+
+ // Check Valid
+ boolean aTempValidityCheck = false;
+ // Logger.INFO("Validity Check.");
+ if (aExtracting) {
+ Logger.INFO("Extracting.");
+ if (aInput != null && aFluidOutput != null) {
+ // Logger.INFO("Pass.");
+ aTempValidityCheck = true;
+ }
+ } else {
+ // Logger.INFO("Canning.");
+ if (aInput != null && aOutput != null && (aFluidInput != null || aFluidOutput != null)) {
+ // Logger.INFO("Pass.");
+ aTempValidityCheck = true;
+ }
+ }
+
+ if (aTempValidityCheck) {
+ // Valid Recipe
+ recipe = aRecipe;
+ disableOptional = aExtracting;
+ isValid = true;
+ addRunnableToRecipeCache(this);
+ } else {
+ // Logger.INFO("Failed Validity Check.");
+ isValid = false;
+ disableOptional = aExtracting;
+ aRecipe.mEnabled = false;
+ aRecipe.mHidden = true;
+ recipe = null;
+ }
+ }
+
+ @Override
+ public void run() {
+ Logger.INFO("Processing Recipe with Hash: " + recipe.hashCode());
+ generateRecipes();
+ }
+
+ private void generateRecipes() {
+ if (isValid && recipe != null) {
+ if (this.disableOptional) {
+ addFluidExtractionRecipe(recipe);
+ } else {
+ addFluidCannerRecipe(recipe);
+ }
+ }
+ }
+
+ private void addFluidExtractionRecipe(GT_Recipe aRecipe) {
+ CORE.crash();
+ Logger.INFO(
+ "[FE-Debug] " + aRecipe.mFluidOutputs[0].amount
+ + "L of "
+ + aRecipe.mFluidOutputs[0].getLocalizedName()
+ + " fluid extractor from 1 "
+ + aRecipe.mInputs[0].getDisplayName()
+ + " - Success. Time: "
+ + aRecipe.mDuration
+ + ", Voltage: "
+ + aRecipe.mEUt);
+ int aCount1 = getMapSize(RecipeMaps.fluidExtractionRecipes);
+ int aCount2 = aCount1;
+ RecipeMaps.fluidExtractionRecipes.addRecipe(aRecipe);
+ aCount1 = getMapSize(RecipeMaps.fluidExtractionRecipes);
+ if (aCount1 <= aCount2) {
+ Logger.INFO(
+ "[ERROR] Failed adding Extraction recipe for " + ItemUtils.getArrayStackNames(aRecipe.mInputs)
+ + ", "
+ + ItemUtils.getArrayStackNames(aRecipe.mOutputs)
+ + ", "
+ + ItemUtils.getArrayStackNames(aRecipe.mFluidInputs)
+ + ", "
+ + ItemUtils.getArrayStackNames(aRecipe.mFluidOutputs));
+ dumpStack();
+ }
+ }
+
+ private void addFluidCannerRecipe(GT_Recipe aRecipe) {
+ boolean result;
+ int aCount1 = getMapSize(RecipeMaps.fluidCannerRecipes);
+ int aCount2 = aCount1;
+ RecipeMaps.fluidCannerRecipes.addRecipe(aRecipe);
+ aCount1 = getMapSize(RecipeMaps.fluidCannerRecipes);
+ if (aCount1 <= aCount2) {
+ Logger.INFO(
+ "[ERROR] Failed adding Canning recipe for " + ItemUtils.getArrayStackNames(aRecipe.mInputs)
+ + ", "
+ + ItemUtils.getArrayStackNames(aRecipe.mOutputs)
+ + ", "
+ + ItemUtils.getArrayStackNames(aRecipe.mFluidInputs)
+ + ", "
+ + ItemUtils.getArrayStackNames(aRecipe.mFluidOutputs));
+ dumpStack();
+ }
+ }
+
+ private void dumpStack() {
+ int parents = 2;
+ for (int i = 0; i < 6; i++) {
+ Logger.INFO(
+ (disableOptional ? "EXTRACTING" : "CANNING") + " DEBUG | "
+ + (i == 0 ? "Called from: " : "Parent: ")
+ + ReflectionUtils.getMethodName(i + parents));
+ }
+ }
+
+ private int getMapSize(RecipeMap<?> aMap) {
+ return aMap.getAllRecipes()
+ .size();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluids.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluids.java
new file mode 100644
index 0000000000..dd0c1b505c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluids.java
@@ -0,0 +1,212 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_Fluids extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Fluids(final Material M) {
+ this(M, false);
+ }
+
+ public RecipeGen_Fluids(final Material M, final boolean dO) {
+ this.toGenerate = M;
+ this.disableOptional = dO;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate, this.disableOptional);
+ }
+
+ private void generateRecipes(final Material material, final boolean dO) {
+
+ if (material == null) {
+ return;
+ }
+
+ // Melting Shapes to fluid
+ if (material.getFluidStack(1) != null && !material.getFluidStack(1)
+ .getUnlocalizedName()
+ .toLowerCase()
+ .contains("plasma")) {
+
+ // Making Shapes from fluid
+
+ // Ingot
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Ingot.get(0), // Item Shape
+ material.getFluidStack(144), // Fluid Input
+ material.getIngot(1), // output
+ 32, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING("144l fluid molder for 1 ingot Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("144l fluid molder for 1 ingot Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Plate
+ if (ItemUtils.checkForInvalidItems(material.getPlate(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Plate.get(0), // Item Shape
+ material.getFluidStack(144), // Fluid Input
+ material.getPlate(1), // output
+ 32, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING("144l fluid molder for 1 plate Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("144l fluid molder for 1 plate Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Nugget
+ if (ItemUtils.checkForInvalidItems(material.getNugget(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Nugget.get(0), // Item Shape
+ material.getFluidStack(16), // Fluid Input
+ material.getNugget(1), // output
+ 16, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING("16l fluid molder for 1 nugget Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("16l fluid molder for 1 nugget Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Gears
+ if (ItemUtils.checkForInvalidItems(material.getGear(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Gear.get(0), // Item Shape
+ material.getFluidStack(576), // Fluid Input
+ material.getGear(1), // output
+ 128, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING("576l fluid molder for 1 gear Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("576l fluid molder for 1 gear Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Blocks
+ if (ItemUtils.checkForInvalidItems(material.getBlock(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Block.get(0), // Item Shape
+ material.getFluidStack(144 * 9), // Fluid Input
+ material.getBlock(1), // output
+ 288, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 block Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 block Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // GTNH
+
+ // Rod
+ if (ItemUtils.checkForInvalidItems(material.getRod(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Rod.get(0), // Item Shape
+ material.getFluidStack(72), // Fluid Input
+ material.getRod(1), // output
+ 150, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Rod Long
+ if (ItemUtils.checkForInvalidItems(material.getLongRod(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Rod_Long.get(0), // Item
+ // Shape
+ material.getFluidStack(144), // Fluid Input
+ material.getLongRod(1), // output
+ 300, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 rod long Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 rod long Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Bolt
+ if (ItemUtils.checkForInvalidItems(material.getBolt(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Bolt.get(0), // Item Shape
+ material.getFluidStack(18), // Fluid Input
+ material.getBolt(1), // output
+ 50, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 bolt Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 bolt Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Screw
+ if (ItemUtils.checkForInvalidItems(material.getScrew(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Screw.get(0), // Item Shape
+ material.getFluidStack(18), // Fluid Input
+ material.getScrew(1), // output
+ 50, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 screw Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 screw Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Ring
+ if (ItemUtils.checkForInvalidItems(material.getRing(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Ring.get(0), // Item Shape
+ material.getFluidStack(36), // Fluid Input
+ material.getRing(1), // output
+ 100, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 ring Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 ring Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Rotor
+ if (ItemUtils.checkForInvalidItems(material.getRotor(1))) if (GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Rotor.get(0), // Item Shape
+ material.getFluidStack(612), // Fluid Input
+ material.getRotor(1), // output
+ 100, // Duration
+ material.vVoltageMultiplier // Eu Tick
+ )) {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 rotor Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING(
+ (144 * 9) + "l fluid molder from 1 rotor Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluorite.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluorite.java
new file mode 100644
index 0000000000..a3ba819fb6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Fluorite.java
@@ -0,0 +1,267 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class RecipeGen_Fluorite extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Fluorite(final Material material) {
+ this.toGenerate = material;
+ mRecipeGenMap.add(this);
+
+ /**
+ * Shaped Crafting
+ */
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolHammer_Hard,
+ null,
+ null,
+ material.getCrushedPurified(1),
+ null,
+ null,
+ null,
+ null,
+ null,
+ material.getDustPurified(1));
+
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolHammer_Hard,
+ null,
+ null,
+ material.getCrushed(1),
+ null,
+ null,
+ null,
+ null,
+ null,
+ material.getDustImpure(1));
+
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolHammer_Hard,
+ null,
+ null,
+ material.getCrushedCentrifuged(1),
+ null,
+ null,
+ null,
+ null,
+ null,
+ material.getDust(1));
+
+ final ItemStack normalDust = material.getDust(1);
+ final ItemStack smallDust = material.getSmallDust(1);
+ final ItemStack tinyDust = material.getTinyDust(1);
+
+ if (RecipeUtils.addShapedRecipe(
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ normalDust)) {
+ Logger.WARNING("9 Tiny dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("9 Tiny dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(normalDust, null, null, null, null, null, null, null, null, material.getTinyDust(9))) {
+ Logger.WARNING("9 Tiny dust from 1 Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("9 Tiny dust from 1 Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(smallDust, smallDust, null, smallDust, smallDust, null, null, null, null, normalDust)) {
+ Logger.WARNING("4 Small dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("4 Small dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(null, normalDust, null, null, null, null, null, null, null, material.getSmallDust(4))) {
+ Logger.WARNING("4 Small dust from 1 Dust Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("4 Small dust from 1 Dust Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ public static void generateRecipes(final Material material) {
+
+ int tVoltageMultiplier = MaterialUtils.getVoltageForTier(material.vTier);
+
+ final ItemStack dustStone = ItemUtils.getItemStackOfAmountFromOreDict("dustStone", 1);
+
+ ItemStack tinyDustA = FLUORIDES.FLUORITE.getTinyDust(1);
+ ItemStack tinyDustB = FLUORIDES.FLUORITE.getTinyDust(1);
+ ItemStack matDust = FLUORIDES.FLUORITE.getDust(1);
+ ItemStack matDustA = FLUORIDES.FLUORITE.getDust(1);
+
+ /**
+ * Package
+ */
+ // Allow ore dusts to be packaged
+ if (ItemUtils.checkForInvalidItems(material.getSmallDust(1))
+ && ItemUtils.checkForInvalidItems(material.getTinyDust(1))) {
+ RecipeGen_DustGeneration.generatePackagerRecipes(material);
+ }
+
+ /**
+ * Macerate
+ */
+ // Macerate ore to Crushed
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getOre(1),
+ new ItemStack[] { material.getCrushed(2) },
+ new int[] { 10000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate ore to Crushed ore'");
+ }
+ // Macerate raw ore to Crushed
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getRawOre(1),
+ new ItemStack[] { material.getCrushed(2) },
+ new int[] { 10000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate raw ore to Crushed ore'");
+ }
+
+ // Macerate Centrifuged to Pure Dust
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getCrushedCentrifuged(1),
+ new ItemStack[] { matDust, matDustA },
+ new int[] { 10000, 1000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate Centrifuged ore to Pure Dust'");
+ }
+ if (GT_ModHandler.addThermalCentrifugeRecipe(
+ material.getCrushedPurified(1),
+ (int) Math.min(5000L, Math.abs(material.getMass() * 20L)),
+ material.getCrushedCentrifuged(1),
+ tinyDustA,
+ dustStone)) {
+ Logger.MATERIALS(
+ "[ThermalCentrifuge] Added Recipe: 'Washed ore to Centrifuged Ore' | Input: "
+ + material.getCrushedPurified(1)
+ .getDisplayName()
+ + " | Outputs: "
+ + material.getCrushedCentrifuged(1)
+ .getDisplayName()
+ + ", "
+ + tinyDustA.getDisplayName()
+ + ", "
+ + dustStone.getDisplayName()
+ + ".");
+ }
+
+ GT_Values.RA.addChemicalBathRecipe(
+ FLUORIDES.FLUORITE.getCrushed(2),
+ FluidUtils.getFluidStack("hydrogen", 2000),
+ FLUORIDES.FLUORITE.getCrushedPurified(8),
+ FLUORIDES.FLUORITE.getDustImpure(4),
+ FLUORIDES.FLUORITE.getDustPurified(2),
+ new int[] { 10000, 5000, 1000 },
+ 30 * 20,
+ 240);
+
+ /**
+ * Forge Hammer
+ */
+ if (GT_Values.RA.addForgeHammerRecipe(material.getCrushedCentrifuged(1), matDust, 10, tVoltageMultiplier / 4)) {
+ Logger.MATERIALS("[ForgeHammer] Added Recipe: 'Crushed Centrifuged to Pure Dust'");
+ }
+
+ /**
+ * Centrifuge
+ */
+ // Purified Dust to Clean
+ if (GT_Values.RA.addCentrifugeRecipe(
+ material.getDustPurified(1),
+ null,
+ null, // In Fluid
+ null, // Out Fluid
+ matDust,
+ tinyDustA,
+ null,
+ null,
+ null,
+ null,
+ new int[] { 10000, 10000 }, // Chances
+ (int) Math.max(1L, material.getMass() * 8L), // Time
+ tVoltageMultiplier / 2)) { // Eu
+ Logger.MATERIALS("[Centrifuge] Added Recipe: Purified Dust to Clean Dust");
+ }
+
+ // Impure Dust to Clean
+ if (GT_Values.RA.addCentrifugeRecipe(
+ material.getDustImpure(1),
+ null,
+ null, // In Fluid
+ null, // Out Fluid
+ matDust,
+ tinyDustB,
+ null,
+ null,
+ null,
+ null,
+ new int[] { 10000, 10000 }, // Chances
+ (int) Math.max(1L, material.getMass() * 8L), // Time
+ tVoltageMultiplier / 2)) { // Eu
+ Logger.MATERIALS("[Centrifuge] Added Recipe: Inpure Dust to Clean Dust");
+ }
+
+ // CaF2 + H2SO4 → CaSO4(solid) + 2 HF
+ FluidStack aGregtechHydro = FluidUtils.getFluidStack("hydrofluoricacid_gt5u", 16000);
+ if (aGregtechHydro == null) {
+ aGregtechHydro = FluidUtils.getFluidStack("hydrofluoricacid", 16000);
+ }
+
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(5), FLUORIDES.FLUORITE.getDust(37), },
+ FluidUtils.getFluidStack("sulfuricacid", 8000),
+ aGregtechHydro, // Fluid output (slot 2)
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustCalciumSulfate", 15),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSilver", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustGold", 2),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTin", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCopper", 2) },
+ new int[] { 10000, 1000, 1000, 3000, 2000 },
+ 10 * 60 * 20,
+ 240); // EU
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MaterialProcessing.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MaterialProcessing.java
new file mode 100644
index 0000000000..83bbe6a6d7
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MaterialProcessing.java
@@ -0,0 +1,318 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_MaterialProcessing extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_MaterialProcessing(final Material M) {
+ this(M, false);
+ }
+
+ public RecipeGen_MaterialProcessing(final Material M, final boolean O) {
+ this.toGenerate = M;
+ this.disableOptional = O;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate, this.disableOptional);
+ }
+
+ private void generateRecipes(final Material material, final boolean disableOptional) {
+ if (disableOptional) {
+ return;
+ }
+
+ if (material.getMaterialComposites().length > 1) {
+ Logger.MATERIALS("[Recipe Generator Debug] [" + material.getLocalizedName() + "]");
+ final int tVoltageMultiplier = material.vVoltageMultiplier;
+ int[] partSizes = new int[99];
+ if (material.vSmallestRatio != null) {
+ partSizes = new int[material.vSmallestRatio.length];
+ for (int hu = 0; hu < material.vSmallestRatio.length; hu++) {
+ partSizes[hu] = (int) material.vSmallestRatio[hu];
+ }
+ }
+ AutoMap<Pair<Integer, Material>> componentMap = new AutoMap<>();
+ int alnsnfds = 0;
+ for (MaterialStack r : material.getComposites()) {
+ if (r != null) {
+ componentMap.put(new Pair<>(partSizes[alnsnfds], r.getStackMaterial()));
+ }
+ alnsnfds++;
+ }
+
+ /**
+ * Centrifuge
+ */
+
+ // Process Dust
+ if (componentMap.size() > 0 && componentMap.size() <= 6) {
+ ItemStack mInternalOutputs[] = new ItemStack[6];
+ int mChances[] = new int[6];
+ int mCellCount = 0;
+
+ int mTotalCount = 0;
+
+ int mCounter = 0;
+ for (Pair<Integer, Material> f : componentMap) {
+ if (f.getValue()
+ .getState() != MaterialState.SOLID) {
+ Logger.MATERIALS(
+ "[Centrifuge] Found Fluid Component, adding " + f.getKey()
+ + " cells of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getCell(f.getKey());
+ mCellCount += f.getKey();
+ mTotalCount += f.getKey();
+ Logger.MATERIALS(
+ "[Centrifuge] In total, adding " + mCellCount
+ + " cells for "
+ + material.getLocalizedName()
+ + " processing.");
+ } else {
+ Logger.MATERIALS(
+ "[Centrifuge] Found Solid Component, adding " + f.getKey()
+ + " dusts of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getDust(f.getKey());
+ mTotalCount += f.getKey();
+ }
+ }
+
+ // Build Output Array
+ for (int g = 0; g < mInternalOutputs.length; g++) {
+ Logger.MATERIALS(
+ "[Centrifuge] Is output[" + g
+ + "] valid with a chance? "
+ + (mInternalOutputs[g] != null ? 10000 : 0));
+ mChances[g] = (mInternalOutputs[g] != null ? 10000 : 0);
+ }
+
+ ItemStack emptyCell = null;
+ if (mCellCount > 0) {
+ emptyCell = ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", mCellCount);
+ Logger.MATERIALS("[Centrifuge] Recipe now requires " + mCellCount + " empty cells as input.");
+ }
+
+ ItemStack mainDust = material.getDust(material.smallestStackSizeWhenProcessing);
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Centrifuge] Recipe now requires " + material.smallestStackSizeWhenProcessing
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ mainDust = material.getDust(mTotalCount);
+ Logger.MATERIALS("[Centrifuge] Could not find valid input dust, trying alternative.");
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Centrifuge] Recipe now requires " + mTotalCount
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ Logger.MATERIALS("[Centrifuge] Could not find valid input dust, exiting.");
+ }
+ }
+
+ for (int j = 0; j < mInternalOutputs.length; j++) {
+ if (mInternalOutputs[j] == null) {
+ mInternalOutputs[j] = GT_Values.NI;
+ Logger.MATERIALS("[Centrifuge] Set slot " + j + " to null.");
+ } else {
+ Logger.MATERIALS(
+ "[Centrifuge] Set slot " + j + " to " + mInternalOutputs[j].getDisplayName() + ".");
+ }
+ }
+
+ try {
+ if (addCentrifgeRecipe(
+ mainDust,
+ emptyCell, // input 2
+ null, // Input fluid 1
+ null, // Output fluid 1
+ mInternalOutputs[0],
+ mInternalOutputs[1],
+ mInternalOutputs[2],
+ mInternalOutputs[3],
+ mInternalOutputs[4],
+ mInternalOutputs[5],
+ mChances,
+ 20 * 1 * (tVoltageMultiplier / 10),
+ tVoltageMultiplier)) {
+ Logger.MATERIALS(
+ "[Centrifuge] Generated Centrifuge recipe for " + material.getDust(1)
+ .getDisplayName());
+ } else {
+ Logger.MATERIALS(
+ "[Centrifuge] Failed to generate Centrifuge recipe for " + material.getDust(1)
+ .getDisplayName());
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ } else if (componentMap.size() > 6 && componentMap.size() <= 9) {
+ Logger.MATERIALS(
+ "[Issue][Electrolyzer] " + material.getLocalizedName()
+ + " is composed of over 6 materials, so an electrolyzer recipe for processing cannot be generated. Trying to create one for the Dehydrator instead.");
+
+ ItemStack mInternalOutputs[] = new ItemStack[9];
+ int mChances[] = new int[9];
+ int mCellCount = 0;
+
+ int mTotalCount = 0;
+
+ int mCounter = 0;
+ for (Pair<Integer, Material> f : componentMap) {
+ if (f.getValue()
+ .getState() != MaterialState.SOLID) {
+ Logger.MATERIALS(
+ "[Dehydrator] Found Fluid Component, adding " + f.getKey()
+ + " cells of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getCell(f.getKey());
+ mCellCount += f.getKey();
+ mTotalCount += f.getKey();
+ Logger.MATERIALS(
+ "[Dehydrator] In total, adding " + mCellCount
+ + " cells for "
+ + material.getLocalizedName()
+ + " processing.");
+ } else {
+ Logger.MATERIALS(
+ "[Dehydrator] Found Solid Component, adding " + f.getKey()
+ + " dusts of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getDust(f.getKey());
+ mTotalCount += f.getKey();
+ }
+ }
+
+ // Build Output Array
+ for (int g = 0; g < mInternalOutputs.length; g++) {
+ Logger.MATERIALS(
+ "[Dehydrator] Is output[" + g
+ + "] valid with a chance? "
+ + (mInternalOutputs[g] != null ? 10000 : 0));
+ mChances[g] = (mInternalOutputs[g] != null ? 10000 : 0);
+ }
+
+ ItemStack emptyCell = null;
+ if (mCellCount > 0) {
+ emptyCell = CI.emptyCells(mCellCount);
+ Logger.MATERIALS("[Dehydrator] Recipe now requires " + mCellCount + " empty cells as input.");
+ }
+
+ ItemStack mainDust = material.getDust(material.smallestStackSizeWhenProcessing);
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Dehydrator] Recipe now requires " + material.smallestStackSizeWhenProcessing
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ mainDust = material.getDust(mTotalCount);
+ Logger.MATERIALS("[Dehydrator] Could not find valid input dust, trying alternative.");
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Dehydrator] Recipe now requires " + mTotalCount
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ Logger.MATERIALS("[Dehydrator] Could not find valid input dust, exiting.");
+ }
+ }
+
+ for (int j = 0; j < mInternalOutputs.length; j++) {
+ if (mInternalOutputs[j] == null) {
+ mInternalOutputs[j] = GT_Values.NI;
+ Logger.MATERIALS("[Dehydrator] Set slot " + j + " to null.");
+ } else {
+ Logger.MATERIALS(
+ "[Dehydrator] Set slot " + j + " to " + mInternalOutputs[j].getDisplayName() + ".");
+ }
+ }
+
+ try {
+
+ if (CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { mainDust, emptyCell },
+ null,
+ null,
+ mInternalOutputs,
+ mChances,
+ 20 * 1 * (tVoltageMultiplier / 10),
+ tVoltageMultiplier)) {
+ Logger.MATERIALS(
+ "[Dehydrator] Generated Dehydrator recipe for " + material.getDust(1)
+ .getDisplayName());
+ } else {
+ Logger.MATERIALS(
+ "[Dehydrator] Failed to generate Dehydrator recipe for " + material.getDust(1)
+ .getDisplayName());
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ }
+ }
+
+ @Deprecated
+ public static boolean addCentrifgeRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, ItemStack aOutput4,
+ ItemStack aOutput5, ItemStack aOutput6, int[] aChances, int aDuration, int aEUt) {
+ return GT_Values.RA.addCentrifugeRecipe(
+ aInput1,
+ aInput2,
+ aFluidInput,
+ aFluidOutput,
+ aOutput1,
+ aOutput2,
+ aOutput3,
+ aOutput4,
+ aOutput5,
+ aOutput6,
+ aChances,
+ aDuration,
+ aEUt);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MetalRecipe.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MetalRecipe.java
new file mode 100644
index 0000000000..f11b97cbda
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MetalRecipe.java
@@ -0,0 +1,112 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_MetalRecipe extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_MetalRecipe(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+
+ Logger.WARNING("Generating Metal recipes for " + material.getLocalizedName());
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getBlock(1)))
+ if (GT_ModHandler.addCompressionRecipe(material.getIngot(9), material.getBlock(1))) {
+ Logger.WARNING("Compress Block Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Compress Block Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1)) && ItemUtils.checkForInvalidItems(material.getRod(1)))
+ if (GT_Values.RA.addLatheRecipe(
+ material.getIngot(1),
+ material.getRod(1),
+ material.getSmallDust(2),
+ (int) Math.max(material.getMass() / 8L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Lathe Rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Lathe Rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (ItemUtils.checkForInvalidItems(material.getRod(1)) && ItemUtils.checkForInvalidItems(material.getBolt(1)))
+ if (GT_Values.RA.addCutterRecipe(
+ material.getRod(1),
+ material.getBolt(4),
+ null,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Cut Bolt Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Cut Bolt Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (ItemUtils.checkForInvalidItems(material.getIngot(1))
+ && ItemUtils.checkForInvalidItems(material.getHotIngot(1)))
+ if (CORE.RA.addVacuumFreezerRecipe(
+ material.getHotIngot(1),
+ material.getIngot(1),
+ (int) Math.max(material.getMass() * 3L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Cool Hot Ingot Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Cool Hot Ingot Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (ItemUtils.checkForInvalidItems(material.getRod(1))
+ && ItemUtils.checkForInvalidItems(material.getLongRod(1))) {
+ if (GT_Values.RA.addForgeHammerRecipe(
+ material.getRod(2),
+ material.getLongRod(1),
+ (int) Math.max(material.getMass(), 1L),
+ 16)) {
+ Logger.WARNING("Hammer Long Rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Hammer Long Rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ GT_Values.RA.addCutterRecipe(
+ material.getLongRod(1),
+ material.getRod(2),
+ null,
+ (int) Math.max(material.getMass(), 1L),
+ 4);
+ }
+
+ if (ItemUtils.checkForInvalidItems(material.getBolt(1)) && ItemUtils.checkForInvalidItems(material.getScrew(1)))
+ if (GT_Values.RA.addLatheRecipe(
+ material.getBolt(1),
+ material.getScrew(1),
+ null,
+ (int) Math.max(material.getMass() / 8L, 1L),
+ 4)) {
+ Logger.WARNING("Lathe Screw Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Lathe Screw Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MultisUsingFluidInsteadOfCells.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MultisUsingFluidInsteadOfCells.java
new file mode 100644
index 0000000000..208be14c8c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_MultisUsingFluidInsteadOfCells.java
@@ -0,0 +1,187 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.recipe.GT_RecipeUtils;
+
+public class RecipeGen_MultisUsingFluidInsteadOfCells {
+
+ private static ItemStack mEmptyCell;
+ private static final AutoMap<ItemStack> mItemsToIgnore = new AutoMap<>();
+ private static boolean mInit = false;
+
+ private static void init() {
+ if (!mInit) {
+ mInit = true;
+ mItemsToIgnore.add(
+ ItemUtils.simpleMetaStack(
+ CI.emptyCells(1)
+ .getItem(),
+ 8,
+ 1));
+ }
+ }
+
+ private static boolean doesItemMatchIgnoringStackSize(ItemStack a, ItemStack b) {
+ if (a == null || b == null) {
+ return false;
+ }
+ if (a.getItem() == b.getItem()) {
+ return a.getItemDamage() == b.getItemDamage();
+ }
+ return false;
+ }
+
+ private static boolean isEmptyCell(ItemStack aCell) {
+ if (aCell == null) {
+ return false;
+ }
+ if (mEmptyCell == null) {
+ mEmptyCell = CI.emptyCells(1);
+ }
+ if (mEmptyCell != null) {
+ ItemStack aTempStack = mEmptyCell.copy();
+ aTempStack.stackSize = aCell.stackSize;
+ return GT_Utility.areStacksEqual(aTempStack, aCell);
+ }
+ return false;
+ }
+
+ private static synchronized FluidStack getFluidFromItemStack(final ItemStack ingot) {
+ if (ingot == null) {
+ return null;
+ }
+ return GT_Utility.getFluidForFilledItem(ingot, true);
+ }
+
+ public static synchronized int generateRecipesNotUsingCells(RecipeMap<?> aInputs, RecipeMap<?> aOutputs) {
+ init();
+ int aRecipesHandled = 0;
+ int aInvalidRecipesToConvert = 0;
+ int aOriginalCount = aInputs.getAllRecipes()
+ .size();
+ ArrayList<GT_Recipe> deDuplicationInputArray = new ArrayList<>();
+
+ recipe: for (GT_Recipe x : aInputs.getAllRecipes()) {
+ if (x != null) {
+
+ ItemStack[] aInputItems = x.mInputs.clone();
+ ItemStack[] aOutputItems = x.mOutputs.clone();
+ FluidStack[] aInputFluids = x.mFluidInputs.clone();
+ FluidStack[] aOutputFluids = x.mFluidOutputs.clone();
+
+ AutoMap<ItemStack> aInputItemsMap = new AutoMap<>();
+ AutoMap<ItemStack> aOutputItemsMap = new AutoMap<>();
+ AutoMap<FluidStack> aInputFluidsMap = new AutoMap<>();
+ AutoMap<FluidStack> aOutputFluidsMap = new AutoMap<>();
+
+ // Iterate Inputs, Convert valid items into fluids
+ for (ItemStack aInputStack : aInputItems) {
+ FluidStack aFoundFluid = getFluidFromItemStack(aInputStack);
+ if (aFoundFluid == null) {
+ for (ItemStack aBadStack : mItemsToIgnore) {
+ if (doesItemMatchIgnoringStackSize(aInputStack, aBadStack)) {
+ continue recipe; // Skip this recipe entirely if we find an item we don't like
+ }
+ }
+ if (!isEmptyCell(aInputStack)) {
+ aInputItemsMap.add(aInputStack);
+ }
+ } else {
+ aFoundFluid.amount = aFoundFluid.amount * aInputStack.stackSize;
+ aInputFluidsMap.add(aFoundFluid);
+ }
+ }
+ // Iterate Outputs, Convert valid items into fluids
+ for (ItemStack aOutputStack : aOutputItems) {
+ FluidStack aFoundFluid = getFluidFromItemStack(aOutputStack);
+ if (aFoundFluid == null) {
+ for (ItemStack aBadStack : mItemsToIgnore) {
+ if (doesItemMatchIgnoringStackSize(aOutputStack, aBadStack)) {
+ continue recipe; // Skip this recipe entirely if we find an item we don't like
+ }
+ }
+ if (!isEmptyCell(aOutputStack)) {
+ aOutputItemsMap.add(aOutputStack);
+ }
+ } else {
+ aFoundFluid.amount = aFoundFluid.amount * aOutputStack.stackSize;
+ aOutputFluidsMap.add(aFoundFluid);
+ }
+ }
+ // Add Input fluids second
+ aInputFluidsMap.addAll(Arrays.asList(aInputFluids));
+ // Add Output fluids second
+ aOutputFluidsMap.addAll(Arrays.asList(aOutputFluids));
+
+ // Make some new Arrays
+ ItemStack[] aNewItemInputs = new ItemStack[aInputItemsMap.size()];
+ ItemStack[] aNewItemOutputs = new ItemStack[aOutputItemsMap.size()];
+ FluidStack[] aNewFluidInputs = new FluidStack[aInputFluidsMap.size()];
+ FluidStack[] aNewFluidOutputs = new FluidStack[aOutputFluidsMap.size()];
+
+ // Add AutoMap contents to Arrays
+ for (int i = 0; i < aInputItemsMap.size(); i++) {
+ aNewItemInputs[i] = aInputItemsMap.get(i);
+ }
+ for (int i = 0; i < aOutputItemsMap.size(); i++) {
+ aNewItemOutputs[i] = aOutputItemsMap.get(i);
+ }
+ for (int i = 0; i < aInputFluidsMap.size(); i++) {
+ aNewFluidInputs[i] = aInputFluidsMap.get(i);
+ }
+ for (int i = 0; i < aOutputFluidsMap.size(); i++) {
+ aNewFluidOutputs[i] = aOutputFluidsMap.get(i);
+ }
+
+ if (!ItemUtils.checkForInvalidItems(aNewItemInputs, aNewItemOutputs)) {
+ aInvalidRecipesToConvert++;
+ continue; // Skip this recipe entirely if we find an item we don't like
+ }
+ GT_Recipe aNewRecipe = new GT_Recipe(
+ false,
+ aNewItemInputs,
+ aNewItemOutputs,
+ x.mSpecialItems,
+ x.mChances,
+ aNewFluidInputs,
+ aNewFluidOutputs,
+ x.mDuration,
+ x.mEUt,
+ x.mSpecialValue);
+ aNewRecipe.owners = new ArrayList<>(x.owners);
+
+ // add all recipes to an intermediate array
+ deDuplicationInputArray.add(aNewRecipe);
+
+ aRecipesHandled++;
+ } else {
+ aInvalidRecipesToConvert++;
+ }
+ }
+ // cast arraylist of input to a regular array and pass it to a duplicate recipe remover.
+ List<GT_Recipe> deDuplicationOutputArray = GT_RecipeUtils
+ .removeDuplicates(deDuplicationInputArray, aOutputs.unlocalizedName);
+ // add each recipe from the above output to the intended recipe map
+ for (GT_Recipe recipe : deDuplicationOutputArray) {
+ aOutputs.add(recipe);
+ }
+ Logger.INFO("Generated Recipes for " + aOutputs.unlocalizedName);
+ Logger.INFO("Original Map contains " + aOriginalCount + " recipes.");
+ Logger.INFO("Output Map contains " + aRecipesHandled + " recipes.");
+ Logger.INFO("There were " + aInvalidRecipesToConvert + " invalid recipes.");
+ return aRecipesHandled;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Ore.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Ore.java
new file mode 100644
index 0000000000..32d6a1066b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Ore.java
@@ -0,0 +1,750 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+
+public class RecipeGen_Ore extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Ore(final Material M) {
+ this(M, false);
+ }
+
+ public RecipeGen_Ore(final Material M, final boolean O) {
+ this.toGenerate = M;
+ this.disableOptional = O;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate, this.disableOptional);
+ }
+
+ private static Material mStone;
+
+ private void generateRecipes(final Material material, final boolean disableOptional) {
+
+ if (mStone == null) {
+ mStone = MaterialUtils.generateMaterialFromGtENUM(Materials.Stone);
+ }
+
+ // if (material.getMaterialComposites().length > 1){
+ Logger.MATERIALS("[Recipe Generator Debug] [" + material.getLocalizedName() + "]");
+ int tVoltageMultiplier = MaterialUtils.getVoltageForTier(material.vTier);
+
+ final ItemStack dustStone = ItemUtils.getItemStackOfAmountFromOreDict("dustStone", 1);
+ Material bonusA = null; // Ni
+ Material bonusB = null; // Tin
+
+ if (material.getComposites()
+ .size() >= 1
+ && material.getComposites()
+ .get(0) != null) {
+ bonusA = material.getComposites()
+ .get(0)
+ .getStackMaterial();
+ } else {
+ bonusA = material;
+ }
+
+ boolean allFailed = false;
+
+ // Setup Bonuses
+ ArrayList<Material> aMatComp = new ArrayList<>();
+ for (Material j : MaterialUtils.getCompoundMaterialsRecursively(material)) {
+ aMatComp.add(j);
+ }
+
+ if (aMatComp.size() < 3) {
+ while (aMatComp.size() < 3) {
+ aMatComp.add(material);
+ }
+ }
+
+ AutoMap<Material> amJ = new AutoMap<>();
+ int aIndexCounter = 0;
+ for (Material g : aMatComp) {
+ if (g.hasSolidForm()) {
+ if (getDust(g) != null && getTinyDust(g) != null) {
+ amJ.put(g);
+ }
+ }
+ }
+
+ if (amJ.size() < 2) {
+ if (material.getComposites()
+ .size() >= 2
+ && material.getComposites()
+ .get(1) != null) {
+ bonusB = material.getComposites()
+ .get(1)
+ .getStackMaterial();
+ // If Secondary Output has no solid output, try the third (If it exists)
+ if (!bonusB.hasSolidForm() && material.getComposites()
+ .size() >= 3
+ && material.getComposites()
+ .get(2) != null) {
+ bonusB = material.getComposites()
+ .get(2)
+ .getStackMaterial();
+ // If Third Output has no solid output, try the Fourth (If it exists)
+ if (!bonusB.hasSolidForm() && material.getComposites()
+ .size() >= 4
+ && material.getComposites()
+ .get(3) != null) {
+ bonusB = material.getComposites()
+ .get(3)
+ .getStackMaterial();
+ // If Fourth Output has no solid output, try the Fifth (If it exists)
+ if (!bonusB.hasSolidForm() && material.getComposites()
+ .size() >= 5
+ && material.getComposites()
+ .get(4) != null) {
+ bonusB = material.getComposites()
+ .get(4)
+ .getStackMaterial();
+ // If Fifth Output has no solid output, default out to Stone dust.
+ if (!bonusB.hasSolidForm()) {
+ allFailed = true;
+ bonusB = mStone;
+ }
+ }
+ }
+ }
+ } else {
+ allFailed = true;
+ }
+ } else {
+ bonusA = amJ.get(0);
+ bonusB = amJ.get(1);
+ }
+
+ // Default out if it's made of fluids or some stuff.
+ if (bonusA == null) {
+ bonusA = tVoltageMultiplier > 100 ? material : mStone;
+ }
+ // Default out if it's made of fluids or some stuff.
+ if (allFailed || bonusB == null) {
+ bonusB = tVoltageMultiplier > 100 ? material : mStone;
+ }
+
+ AutoMap<Pair<Integer, Material>> componentMap = new AutoMap<>();
+ for (MaterialStack r : material.getComposites()) {
+ if (r != null) {
+ componentMap.put(new Pair<>(r.getPartsPerOneHundred(), r.getStackMaterial()));
+ }
+ }
+
+ // Need two valid outputs
+ if (bonusA == null || bonusB == null || !bonusA.hasSolidForm() || !bonusB.hasSolidForm()) {
+ if (bonusA == null) {
+ bonusA = mStone;
+ }
+ if (bonusB == null) {
+ bonusB = mStone;
+ }
+ if (!bonusA.hasSolidForm()) {
+ bonusA = mStone;
+ }
+ if (!bonusB.hasSolidForm()) {
+ bonusB = mStone;
+ }
+ }
+
+ ItemStack matDust = getDust(material);
+ ItemStack matDustA = getDust(bonusA);
+ ItemStack matDustB = getDust(bonusB);
+
+ /**
+ * Package
+ */
+ // Allow ore dusts to be packaged
+ if (ItemUtils.checkForInvalidItems(material.getSmallDust(1))
+ && ItemUtils.checkForInvalidItems(material.getTinyDust(1))) {
+ RecipeGen_DustGeneration.generatePackagerRecipes(material);
+ }
+
+ /**
+ * Macerate
+ */
+ // Macerate ore to Crushed
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getOre(1),
+ new ItemStack[] { material.getCrushed(2) },
+ new int[] { 10000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate ore to Crushed ore'");
+ }
+ // Macerate raw ore to Crushed
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getRawOre(1),
+ new ItemStack[] { material.getCrushed(2) },
+ new int[] { 10000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate raw ore to Crushed ore'");
+ }
+ // Macerate Crushed to Impure Dust
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getCrushed(1),
+ new ItemStack[] { material.getDustImpure(1), matDustA },
+ new int[] { 10000, 1000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate Crushed ore to Impure Dust'");
+ }
+ // Macerate Washed to Purified Dust
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getCrushedPurified(1),
+ new ItemStack[] { material.getDustPurified(1), matDustA },
+ new int[] { 10000, 1000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate Washed ore to Purified Dust'");
+ }
+ // Macerate Centrifuged to Pure Dust
+ if (GT_Values.RA.addPulveriserRecipe(
+ material.getCrushedCentrifuged(1),
+ new ItemStack[] { matDust, matDustA },
+ new int[] { 10000, 1000 },
+ 20 * 20,
+ tVoltageMultiplier / 2)) {
+ Logger.MATERIALS("[Macerator] Added Recipe: 'Macerate Centrifuged ore to Pure Dust'");
+ }
+
+ /**
+ * Wash
+ */
+ // Wash into Purified Crushed
+ /*
+ * if (GT_Values.RA.addOreWasherRecipe(material.getCrushed(1), material.getCrushedPurified(1),
+ * bonusA.getTinyDust(1), dustStone, FluidUtils.getWater(1000), 25*20, 16)){
+ * Logger.MATERIALS("[OreWasher] Added Recipe: 'Wash Crushed ore into Purified Crushed ore'"); }
+ */
+ // .08 compat method
+ if (GT_ModHandler.addOreWasherRecipe(
+ material.getCrushed(1),
+ new int[] { 10000, 1111, 10000 },
+ 1000,
+ material.getCrushedPurified(1),
+ matDustA,
+ dustStone)) {
+ Logger.MATERIALS("[OreWasher] Added Recipe: 'Wash Crushed ore into Purified Crushed ore'");
+ }
+
+ /**
+ * Thermal Centrifuge
+ */
+ /*
+ * //Crushed ore to Centrifuged Ore if (GT_Values.RA.addThermalCentrifugeRecipe(material.getCrushed(1),
+ * material.getCrushedCentrifuged(1), tinyDustB, dustStone, 25*20, 24)){
+ * Logger.MATERIALS("[ThermalCentrifuge] Added Recipe: 'Crushed ore to Centrifuged Ore'"); } //Washed ore to
+ * Centrifuged Ore if (GT_Values.RA.addThermalCentrifugeRecipe(material.getCrushedPurified(1),
+ * material.getCrushedCentrifuged(1), bonusA.getTinyDust(1), dustStone, 25*20, 24)){
+ * Logger.MATERIALS("[ThermalCentrifuge] Added Recipe: 'Washed ore to Centrifuged Ore'"); }
+ */
+
+ Logger.MATERIALS("material.getCrushed(1): " + (material.getCrushed(1) != null));
+ Logger.MATERIALS("material.getCrushedPurified(1): " + (material.getCrushedPurified(1) != null));
+
+ Logger.MATERIALS("material.getTinyDust(1): " + (ItemUtils.getItemName(bonusA.getCrushed(1))));
+ Logger.MATERIALS("material.getTinyDust(1): " + (ItemUtils.getItemName(bonusB.getCrushed(1))));
+
+ try {
+ // .08 compat
+ if (GT_ModHandler.addThermalCentrifugeRecipe(
+ material.getCrushed(1),
+ new int[] { 10000, 1111, 10000 },
+ (int) Math.min(5000L, Math.abs(material.getMass() * 20L)),
+ material.getCrushedCentrifuged(1),
+ matDustB,
+ dustStone)) {
+ Logger.MATERIALS(
+ "[ThermalCentrifuge] Added Recipe: 'Crushed ore to Centrifuged Ore' | Input: "
+ + material.getCrushed(1)
+ .getDisplayName()
+ + " | Outputs: "
+ + material.getCrushedCentrifuged(1)
+ .getDisplayName()
+ + ", "
+ + matDustB.getDisplayName()
+ + ", "
+ + dustStone.getDisplayName()
+ + ".");
+ }
+ } catch (Throwable t) {}
+ try {
+ if (GT_ModHandler.addThermalCentrifugeRecipe(
+ material.getCrushedPurified(1),
+ new int[] { 10000, 1111, 10000 },
+ (int) Math.min(5000L, Math.abs(material.getMass() * 20L)),
+ material.getCrushedCentrifuged(1),
+ matDustA,
+ dustStone)) {
+ Logger.MATERIALS(
+ "[ThermalCentrifuge] Added Recipe: 'Washed ore to Centrifuged Ore' | Input: "
+ + material.getCrushedPurified(1)
+ .getDisplayName()
+ + " | Outputs: "
+ + material.getCrushedCentrifuged(1)
+ .getDisplayName()
+ + ", "
+ + matDustA.getDisplayName()
+ + ", "
+ + dustStone.getDisplayName()
+ + ".");
+ }
+ } catch (Throwable t) {}
+
+ /**
+ * Forge Hammer
+ */
+ if (GT_Values.RA.addForgeHammerRecipe(material.getCrushedCentrifuged(1), matDust, 10, tVoltageMultiplier / 4)) {
+ Logger.MATERIALS("[ForgeHammer] Added Recipe: 'Crushed Centrifuged to Pure Dust'");
+ }
+ if (GT_Values.RA.addForgeHammerRecipe(
+ material.getCrushedPurified(1),
+ material.getDustPurified(1),
+ 10,
+ tVoltageMultiplier / 4)) {
+ Logger.MATERIALS("[ForgeHammer] Added Recipe: 'Crushed Purified to Purified Dust'");
+ }
+ if (GT_Values.RA.addForgeHammerRecipe(material.getOre(1), material.getCrushed(1), 10, tVoltageMultiplier / 4)) {
+ Logger.MATERIALS("[ForgeHammer] Added Recipe: 'Ore to Crushed'");
+ }
+
+ /**
+ * Centrifuge
+ */
+ // Purified Dust to Clean
+ if (GT_Values.RA.addCentrifugeRecipe(
+ material.getDustPurified(1),
+ null,
+ null, // In Fluid
+ null, // Out Fluid
+ matDust,
+ matDustA,
+ null,
+ null,
+ null,
+ null,
+ new int[] { 10000, 1111 }, // Chances
+ (int) Math.max(1L, material.getMass() * 8L), // Time
+ tVoltageMultiplier / 2)) { // Eu
+ Logger.MATERIALS("[Centrifuge] Added Recipe: Purified Dust to Clean Dust");
+ }
+
+ // Impure Dust to Clean
+ if (GT_Values.RA.addCentrifugeRecipe(
+ material.getDustImpure(1),
+ null,
+ null, // In Fluid
+ null, // Out Fluid
+ matDust,
+ matDustB,
+ null,
+ null,
+ null,
+ null,
+ new int[] { 10000, 1111 }, // Chances
+ (int) Math.max(1L, material.getMass() * 8L), // Time
+ tVoltageMultiplier / 2)) { // Eu
+ Logger.MATERIALS("[Centrifuge] Added Recipe: Inpure Dust to Clean Dust");
+ }
+
+ /**
+ * Electrolyzer
+ */
+ if (!disableOptional) {
+ // Process Dust
+ if (componentMap.size() > 0 && componentMap.size() <= 6) {
+
+ ItemStack mInternalOutputs[] = new ItemStack[6];
+ int mChances[] = new int[6];
+ int mCellCount = 0;
+
+ int mTotalCount = 0;
+
+ int mCounter = 0;
+ for (Pair<Integer, Material> f : componentMap) {
+ if (f.getValue()
+ .getState() != MaterialState.SOLID) {
+ Logger.MATERIALS(
+ "[Electrolyzer] Found Fluid Component, adding " + f.getKey()
+ + " cells of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getCell(f.getKey());
+ mCellCount += f.getKey();
+ mTotalCount += f.getKey();
+ Logger.MATERIALS(
+ "[Electrolyzer] In total, adding " + mCellCount
+ + " cells for "
+ + material.getLocalizedName()
+ + " processing.");
+ } else {
+ Logger.MATERIALS(
+ "[Electrolyzer] Found Solid Component, adding " + f.getKey()
+ + " dusts of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getDust(f.getKey());
+ mTotalCount += f.getKey();
+ }
+ }
+
+ // Build Output Array
+ for (int g = 0; g < mInternalOutputs.length; g++) {
+ Logger.MATERIALS(
+ "[Electrolyzer] Is output[" + g
+ + "] valid with a chance? "
+ + (mInternalOutputs[g] != null ? 10000 : 0));
+ mChances[g] = (mInternalOutputs[g] != null ? 10000 : 0);
+ }
+
+ ItemStack emptyCell = null;
+ if (mCellCount > 0) {
+ emptyCell = ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", mCellCount);
+ Logger.MATERIALS("[Electrolyzer] Recipe now requires " + mCellCount + " empty cells as input.");
+ }
+
+ ItemStack mainDust = material.getDust(material.smallestStackSizeWhenProcessing);
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Electrolyzer] Recipe now requires " + material.smallestStackSizeWhenProcessing
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ mainDust = material.getDust(mTotalCount);
+ Logger.MATERIALS("[Electrolyzer] Could not find valid input dust, trying alternative.");
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Electrolyzer] Recipe now requires " + mTotalCount
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ Logger.MATERIALS("[Electrolyzer] Could not find valid input dust, exiting.");
+ }
+ }
+
+ for (int j = 0; j < mInternalOutputs.length; j++) {
+ if (mInternalOutputs[j] == null) {
+ mInternalOutputs[j] = GT_Values.NI;
+ Logger.MATERIALS("[Electrolyzer] Set slot " + j + " to null.");
+ } else {
+ Logger.MATERIALS(
+ "[Electrolyzer] Set slot " + j + " to " + mInternalOutputs[j].getDisplayName() + ".");
+ }
+ }
+
+ try {
+ if (addElectrolyzerRecipe(
+ mainDust,
+ emptyCell, // input 2
+ null, // Input fluid 1
+ null, // Output fluid 1
+ mInternalOutputs[0],
+ mInternalOutputs[1],
+ mInternalOutputs[2],
+ mInternalOutputs[3],
+ mInternalOutputs[4],
+ mInternalOutputs[5],
+ mChances,
+ (int) Math.max(material.getMass() * 3L * 1, 1),
+ tVoltageMultiplier)) {
+ Logger
+ .MATERIALS("[Electrolyzer] Generated Electrolyzer recipe for " + matDust.getDisplayName());
+ } else {
+ Logger.MATERIALS(
+ "[Electrolyzer] Failed to generate Electrolyzer recipe for " + matDust.getDisplayName());
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ } else if (componentMap.size() > 6 && componentMap.size() <= 9) {
+ Logger.MATERIALS(
+ "[Issue][Electrolyzer] " + material.getLocalizedName()
+ + " is composed of over 6 materials, so an electrolyzer recipe for processing cannot be generated. Trying to create one for the Dehydrator instead.");
+
+ ItemStack mInternalOutputs[] = new ItemStack[9];
+ int mChances[] = new int[9];
+ int mCellCount = 0;
+
+ int mTotalCount = 0;
+
+ int mCounter = 0;
+ for (Pair<Integer, Material> f : componentMap) {
+ if (f.getValue()
+ .getState() != MaterialState.SOLID
+ && f.getValue()
+ .getState() != MaterialState.ORE) {
+ Logger.MATERIALS(
+ "[Dehydrator] Found Fluid Component, adding " + f.getKey()
+ + " cells of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getCell(f.getKey());
+ mCellCount += f.getKey();
+ mTotalCount += f.getKey();
+ Logger.MATERIALS(
+ "[Dehydrator] In total, adding " + mCellCount
+ + " cells for "
+ + material.getLocalizedName()
+ + " processing.");
+ } else {
+ Logger.MATERIALS(
+ "[Dehydrator] Found Solid Component, adding " + f.getKey()
+ + " dusts of "
+ + f.getValue()
+ .getLocalizedName()
+ + ".");
+ mInternalOutputs[mCounter++] = f.getValue()
+ .getDust(f.getKey());
+ mTotalCount += f.getKey();
+ }
+ }
+
+ // Build Output Array
+ for (int g = 0; g < mInternalOutputs.length; g++) {
+ Logger.MATERIALS(
+ "[Dehydrator] Is output[" + g
+ + "] valid with a chance? "
+ + (mInternalOutputs[g] != null ? 10000 : 0));
+ mChances[g] = (mInternalOutputs[g] != null ? 10000 : 0);
+ }
+
+ ItemStack emptyCell = null;
+ if (mCellCount > 0) {
+ emptyCell = ItemUtils.getItemStackOfAmountFromOreDict("cellEmpty", mCellCount);
+ Logger.MATERIALS("[Dehydrator] Recipe now requires " + mCellCount + " empty cells as input.");
+ }
+
+ ItemStack mainDust = material.getDust(material.smallestStackSizeWhenProcessing);
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Dehydrator] Recipe now requires " + material.smallestStackSizeWhenProcessing
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ mainDust = material.getDust(mTotalCount);
+ Logger.MATERIALS("[Dehydrator] Could not find valid input dust, trying alternative.");
+ if (mainDust != null) {
+ Logger.MATERIALS(
+ "[Dehydrator] Recipe now requires " + mTotalCount
+ + "x "
+ + mainDust.getDisplayName()
+ + " as input.");
+ } else {
+ Logger.MATERIALS("[Dehydrator] Could not find valid input dust, exiting.");
+ }
+ }
+
+ for (int j = 0; j < mInternalOutputs.length; j++) {
+ if (mInternalOutputs[j] == null) {
+ mInternalOutputs[j] = GT_Values.NI;
+ Logger.MATERIALS("[Dehydrator] Set slot " + j + " to null.");
+ } else {
+ Logger.MATERIALS(
+ "[Dehydrator] Set slot " + j + " to " + mInternalOutputs[j].getDisplayName() + ".");
+ }
+ }
+
+ try {
+ if (CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { mainDust, emptyCell },
+ null,
+ null,
+ mInternalOutputs,
+ mChances,
+ (int) Math.max(material.getMass() * 4L * 1, 1),
+ tVoltageMultiplier)) {
+ Logger.MATERIALS("[Dehydrator] Generated Dehydrator recipe for " + matDust.getDisplayName());
+ Logger.MATERIALS(
+ "Inputs: " + mainDust.getDisplayName()
+ + " x"
+ + mainDust.stackSize
+ + ", "
+ + (emptyCell == null ? "No Cells"
+ : "" + emptyCell.getDisplayName() + " x" + emptyCell.stackSize));
+ Logger.MATERIALS("Outputs " + ItemUtils.getArrayStackNames(mInternalOutputs));
+ Logger.MATERIALS("Time: " + ((int) Math.max(material.getMass() * 4L * 1, 1)));
+ Logger.MATERIALS("EU: " + tVoltageMultiplier);
+ } else {
+ Logger.MATERIALS(
+ "[Dehydrator] Failed to generate Dehydrator recipe for " + matDust.getDisplayName());
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * Shaped Crafting
+ */
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolHammer_Hard,
+ null,
+ null,
+ material.getCrushedPurified(1),
+ null,
+ null,
+ null,
+ null,
+ null,
+ material.getDustPurified(1));
+
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolHammer_Hard,
+ null,
+ null,
+ material.getCrushed(1),
+ null,
+ null,
+ null,
+ null,
+ null,
+ material.getDustImpure(1));
+
+ RecipeUtils.addShapedRecipe(
+ CI.craftingToolHammer_Hard,
+ null,
+ null,
+ material.getCrushedCentrifuged(1),
+ null,
+ null,
+ null,
+ null,
+ null,
+ matDust);
+
+ final ItemStack normalDust = matDust;
+ final ItemStack smallDust = material.getSmallDust(1);
+ final ItemStack tinyDust = material.getTinyDust(1);
+
+ if (RecipeUtils.addShapedRecipe(
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ tinyDust,
+ normalDust)) {
+ Logger.WARNING("9 Tiny dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("9 Tiny dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(normalDust, null, null, null, null, null, null, null, null, material.getTinyDust(9))) {
+ Logger.WARNING("9 Tiny dust from 1 Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("9 Tiny dust from 1 Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(smallDust, smallDust, null, smallDust, smallDust, null, null, null, null, normalDust)) {
+ Logger.WARNING("4 Small dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("4 Small dust to 1 Dust Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (RecipeUtils
+ .addShapedRecipe(null, normalDust, null, null, null, null, null, null, null, material.getSmallDust(4))) {
+ Logger.WARNING("4 Small dust from 1 Dust Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("4 Small dust from 1 Dust Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // }
+ }
+
+ public static boolean addElectrolyzerRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, ItemStack aOutput4,
+ ItemStack aOutput5, ItemStack aOutput6, int[] aChances, int aDuration, int aEUt) {
+ if (((aInput1 == null) && (aFluidInput == null)) || ((aOutput1 == null) && (aFluidOutput == null))) {
+ Logger.MATERIALS("[Electrolyzer] Either both inputs or outputs are null.");
+ return false;
+ }
+ if ((aInput1 != null) && (aDuration <= 0)) {
+ Logger.MATERIALS("[Electrolyzer] Fail 1.");
+ return false;
+ }
+ if ((aFluidInput != null) && (aDuration <= 0)) {
+ Logger.MATERIALS("[Electrolyzer] Fail 2.");
+ return false;
+ }
+ GT_Values.RA.addElectrolyzerRecipe(
+ aInput1,
+ aInput2,
+ aFluidInput,
+ aFluidOutput,
+ aOutput1,
+ aOutput2,
+ aOutput3,
+ aOutput4,
+ aOutput5,
+ aOutput6,
+ aChances,
+ aDuration,
+ aEUt);
+ Logger.MATERIALS("[Electrolyzer] Recipe added.");
+ return true;
+ }
+
+ public static ItemStack getTinyDust(Material m) {
+ ItemStack x = m.getTinyDust(1);
+ if (x == null) {
+ x = mStone.getDust(1);
+ }
+ return x;
+ }
+
+ public static ItemStack getDust(Material m) {
+ ItemStack x = m.getDust(1);
+ if (x == null) {
+ x = mStone.getDust(1);
+ }
+ return x;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plasma.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plasma.java
new file mode 100644
index 0000000000..01d6f9bb02
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plasma.java
@@ -0,0 +1,62 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_Plasma extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Plasma(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+ if (material.getPlasma() != null) {
+ // Cool Plasma
+ ItemStack aPlasmaCell = material.getPlasmaCell(1);
+ ItemStack aCell = material.getCell(1);
+ ItemStack aContainerItem = GT_Utility.getFluidForFilledItem(aPlasmaCell, true) == null
+ ? GT_Utility.getContainerItem(aPlasmaCell, true)
+ : CI.emptyCells(1);
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aPlasmaCell, aContainerItem })) {
+ switch (material.getUnlocalizedName()) {
+ case "Runite":
+ GT_Values.RA.addFuel(GT_Utility.copyAmount(1L, aPlasmaCell), aContainerItem, 350_000, 4);
+ case "CelestialTungsten":
+ GT_Values.RA.addFuel(GT_Utility.copyAmount(1L, aPlasmaCell), aContainerItem, 720_000, 4);
+ default:
+ GT_Values.RA.addFuel(
+ GT_Utility.copyAmount(1L, aPlasmaCell),
+ aContainerItem,
+ (int) Math.max(1024L, 1024L * material.getMass()),
+ 4);
+
+ }
+ }
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aCell, aPlasmaCell })) {
+ GT_Values.RA.addVacuumFreezerRecipe(aPlasmaCell, aCell, (int) Math.max(material.getMass() * 2L, 1L));
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plates.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plates.java
new file mode 100644
index 0000000000..7eebc16af7
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Plates.java
@@ -0,0 +1,225 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.recipe.RecipeMaps;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_Plates extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_Plates(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+
+ final int tVoltageMultiplier = material.getMeltingPointK() >= 2800 ? 60 : 15;
+ final ItemStack ingotStackOne = material.getIngot(1);
+ final ItemStack ingotStackTwo = material.getIngot(2);
+ final ItemStack ingotStackThree = material.getIngot(3);
+ final ItemStack ingotStackNine = material.getIngot(9);
+ final ItemStack shape_Mold = ItemList.Shape_Mold_Plate.get(0);
+ final ItemStack plate_Single = material.getPlate(1);
+ final ItemStack plate_SingleTwo = material.getPlate(2);
+ final ItemStack plate_SingleNine = material.getPlate(9);
+ final ItemStack plate_Double = material.getPlateDouble(1);
+ final ItemStack plate_Dense = material.getPlateDense(1);
+ final ItemStack foil_SingleFour = material.getFoil(4);
+ final ItemStack block = material.getBlock(1);
+
+ Logger.WARNING("Generating Plate recipes for " + material.getLocalizedName());
+
+ // Forge Hammer
+ if (ItemUtils.checkForInvalidItems(ingotStackTwo) && ItemUtils.checkForInvalidItems(plate_Single))
+ if (addForgeHammerRecipe(
+ ingotStackThree,
+ plate_SingleTwo,
+ (int) Math.max(material.getMass(), 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Forge Hammer Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Forge Hammer Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ // Bender
+ if (ItemUtils.checkForInvalidItems(ingotStackOne) && ItemUtils.checkForInvalidItems(plate_Single))
+ if (addBenderRecipe(
+ ingotStackOne,
+ plate_Single,
+ (int) Math.max(material.getMass() * 1L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ if (ItemUtils.checkForInvalidItems(ingotStackOne) && ItemUtils.checkForInvalidItems(foil_SingleFour))
+ if (addBenderRecipe(
+ ingotStackOne,
+ CI.getNumberedCircuit(10),
+ foil_SingleFour,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ // Alloy Smelter
+ if (ItemUtils.checkForInvalidItems(ingotStackTwo) && ItemUtils.checkForInvalidItems(plate_Single))
+ if (GT_Values.RA.addAlloySmelterRecipe(
+ ingotStackTwo,
+ shape_Mold,
+ plate_Single,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Alloy Smelter Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Alloy Smelter Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ // Cutting Machine
+ if (ItemUtils.checkForInvalidItems(block) && ItemUtils.checkForInvalidItems(plate_Single))
+ if (GT_Values.RA.addCutterRecipe(
+ block,
+ plate_SingleNine,
+ null,
+ (int) Math.max(material.getMass() * 10L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Cutting Machine Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Cutting Machine Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Making Double Plates
+ if (ItemUtils.checkForInvalidItems(ingotStackTwo) && ItemUtils.checkForInvalidItems(plate_Double))
+ if (addBenderRecipe(
+ ingotStackTwo,
+ plate_Double,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (ItemUtils.checkForInvalidItems(plate_SingleTwo) && ItemUtils.checkForInvalidItems(plate_Double))
+ if (addBenderRecipe(
+ plate_SingleTwo,
+ plate_Double,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Bender
+ if (ItemUtils.checkForInvalidItems(material.getPlate(1)) && ItemUtils.checkForInvalidItems(material.getFoil(1)))
+ if (addBenderRecipe(
+ material.getPlate(1),
+ material.getFoil(4),
+ (int) Math.max(material.getMass(), 1L),
+ material.vVoltageMultiplier)) {
+ GregTech_API.registerCover(
+ material.getFoil(1),
+ new GT_RenderedTexture(material.getTextureSet().mTextures[70], material.getRGBA(), false),
+ null);
+ Logger.WARNING("Bender Foil Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Foil Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Making Dense Plates
+ if (ItemUtils.checkForInvalidItems(ingotStackNine) && ItemUtils.checkForInvalidItems(plate_Dense))
+ if (addBenderRecipe(
+ ingotStackNine,
+ plate_Dense,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ if (ItemUtils.checkForInvalidItems(plate_SingleNine) && ItemUtils.checkForInvalidItems(plate_Dense))
+ if (addBenderRecipe(
+ plate_SingleNine,
+ plate_Dense,
+ (int) Math.max(material.getMass() * 2L, 1L),
+ material.vVoltageMultiplier)) {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bender Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ public static boolean addBenderRecipe(final ItemStack aInput1, final ItemStack aOutput1, int aDuration,
+ final int aEUt) {
+ return GT_Values.RA.addBenderRecipe(aInput1, aOutput1, aDuration, aEUt);
+ }
+
+ public static boolean addBenderRecipe(final ItemStack aInput1, final ItemStack aCircuit, final ItemStack aOutput1,
+ int aDuration, final int aEUt) {
+ return GT_Values.RA.addBenderRecipe(aInput1, aCircuit, aOutput1, aDuration, aEUt);
+ }
+
+ public static boolean addExtruderRecipe(final ItemStack aInput, final ItemStack aShape, final ItemStack aOutput,
+ int aDuration, final int aEUt) {
+ if ((aInput == null) || (aShape == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.extruderRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput, aShape },
+ new ItemStack[] { aOutput },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ public static boolean addForgeHammerRecipe(final ItemStack aInput1, final ItemStack aOutput1, final int aDuration,
+ final int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ RecipeMaps.hammerRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1 },
+ new ItemStack[] { aOutput1 },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Recycling.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Recycling.java
new file mode 100644
index 0000000000..044ce58c62
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_Recycling.java
@@ -0,0 +1,400 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import static gregtech.api.enums.GT_Values.L;
+import static gregtech.api.enums.GT_Values.M;
+
+import java.util.ArrayList;
+import java.util.Map;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.state.MaterialState;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class RecipeGen_Recycling implements Runnable {
+
+ public static AutoMap<Runnable> mQueuedRecyclingGenerators = new AutoMap<>();
+
+ public static void executeGenerators() {
+ if (mQueuedRecyclingGenerators.size() > 0) {
+ for (Runnable R : mQueuedRecyclingGenerators.values()) {
+ R.run();
+ }
+ }
+ }
+
+ final Material toGenerate;
+ public static Map<String, ItemStack> mNameMap;
+
+ public RecipeGen_Recycling(final Material M) {
+ this.toGenerate = M;
+ if (mNameMap == null) {
+ mNameMap = this.getNameMap();
+ }
+ mQueuedRecyclingGenerators.put(this);
+ }
+
+ @Override
+ public void run() {
+ if (mNameMap != null) {
+ generateRecipes(this.toGenerate);
+ }
+ }
+
+ public static void generateRecipes(final Material material) {
+
+ if (material != null) Logger.WARNING("Generating Recycling recipes for " + material.getLocalizedName());
+
+ final OrePrefixes[] mValidPrefixesAsString = { OrePrefixes.ingot, OrePrefixes.ingotHot, OrePrefixes.nugget,
+ OrePrefixes.plate, OrePrefixes.plateDense, OrePrefixes.plateDouble, OrePrefixes.plateTriple,
+ OrePrefixes.plateQuadruple, OrePrefixes.plateQuintuple, OrePrefixes.stick, OrePrefixes.stickLong,
+ OrePrefixes.bolt, OrePrefixes.screw, OrePrefixes.ring, OrePrefixes.rotor, OrePrefixes.gearGt,
+ OrePrefixes.gearGtSmall, OrePrefixes.gear, OrePrefixes.block, OrePrefixes.cableGt01, OrePrefixes.cableGt02,
+ OrePrefixes.cableGt04, OrePrefixes.cableGt08, OrePrefixes.cableGt12, OrePrefixes.wireFine,
+ OrePrefixes.wireGt01, OrePrefixes.wireGt02, OrePrefixes.wireGt04, OrePrefixes.wireGt08,
+ OrePrefixes.wireGt12, OrePrefixes.wireGt16, OrePrefixes.foil, OrePrefixes.frameGt, OrePrefixes.pipeHuge,
+ OrePrefixes.pipeLarge, OrePrefixes.pipeMedium, OrePrefixes.pipeSmall, OrePrefixes.pipeTiny, };
+
+ int mSlotIndex = 0;
+ Pair<OrePrefixes, ItemStack>[] mValidPairs = new Pair[mValidPrefixesAsString.length];
+
+ for (int r = 0; r < mValidPairs.length; r++) {
+ ItemStack temp = getItemStackOfAmountFromOreDictNoBroken(
+ mValidPrefixesAsString[r].name() + Utils.sanitizeString(material.getLocalizedName()),
+ 1);
+ if (temp != null) {
+ mValidPairs[mSlotIndex++] = new Pair<>(mValidPrefixesAsString[r], temp.copy());
+ }
+ }
+
+ if (mValidPairs.length > 0) {
+ int validCounter = 0;
+ Pair<OrePrefixes, ItemStack>[] temp = mValidPairs;
+ for (Pair<OrePrefixes, ItemStack> temp2 : mValidPairs) {
+ if (temp2 != null) {
+ Logger.WARNING(
+ "Valid: " + temp2.getValue()
+ .getDisplayName());
+ validCounter++;
+ }
+ }
+ Pair<OrePrefixes, ItemStack> temp3[] = new Pair[validCounter];
+ int temp4 = 0;
+ for (Pair<OrePrefixes, ItemStack> r : mValidPairs) {
+ if (r != null) {
+ temp3[temp4++] = r;
+ }
+ }
+ if (temp3.length > 0) {
+ mValidPairs = temp3.clone();
+ }
+ }
+
+ if (mValidPrefixesAsString.length >= 1) {
+ for (final Pair<OrePrefixes, ItemStack> validPrefix : mValidPairs) {
+ try {
+
+ if (material == null || validPrefix == null
+ || (material.getState() != MaterialState.SOLID && material.getState() != MaterialState.LIQUID)
+ || validPrefix.getKey() == OrePrefixes.ingotHot) {
+ continue;
+ }
+
+ final ItemStack tempStack = validPrefix.getValue();
+ final ItemStack mDust = getDust(material, validPrefix.getKey());
+ final Pair<OrePrefixes, ItemStack> mData = getDustData(material, validPrefix.getKey());
+ int mFluidAmount = (int) GT_Utility
+ .translateMaterialToFluidAmount(validPrefix.getKey().mMaterialAmount, true);
+
+ // Maceration
+ if (ItemUtils.checkForInvalidItems(tempStack)) {
+ // mValidItems[mSlotIndex++] = tempStack;
+ if ((mDust != null) && GT_ModHandler.addPulverisationRecipe(tempStack, mDust)) {
+ Logger.WARNING(
+ "Recycle Recipe: " + material.getLocalizedName()
+ + " - Success - Recycle "
+ + tempStack.getDisplayName()
+ + " and obtain "
+ + mDust.getDisplayName());
+ } else {
+ Logger.WARNING("Recycle Recipe: " + material.getLocalizedName() + " - Failed");
+ if (mDust == null) {
+ Logger.WARNING("Invalid Dust output.");
+ }
+ }
+ }
+
+ // Arc Furnace
+ if (ItemUtils.checkForInvalidItems(tempStack)) {}
+
+ // Fluid Extractor
+ if (ItemUtils.checkForInvalidItems(tempStack)) {
+ // mValidItems[mSlotIndex++] = tempStack;
+
+ int aFluidAmount = (int) ((L * validPrefix.getKey().mMaterialAmount)
+ / (M * tempStack.stackSize));
+ int aDuration = (int) Math.max(1, (24 * validPrefix.getKey().mMaterialAmount) / M);
+ boolean aGenFluidExtraction = CORE.RA.addFluidExtractionRecipe(
+ tempStack,
+ material.getFluidStack(aFluidAmount),
+ aDuration,
+ material.vVoltageMultiplier);
+ if (aGenFluidExtraction /*
+ * (mDust != null) && CORE.RA.addFluidExtractionRecipe(tempStack,
+ * material.getFluidStack(mFluidAmount), 30,
+ * material.vVoltageMultiplier)
+ */) {
+ Logger.WARNING(
+ "Fluid Recycle Recipe: " + material.getLocalizedName()
+ + " - Success - Recycle "
+ + tempStack.getDisplayName()
+ + " and obtain "
+ + aFluidAmount
+ + "mb of "
+ + material.getFluidStack(1)
+ .getLocalizedName()
+ + ". Time: "
+ + aDuration
+ + ", Voltage: "
+ + material.vVoltageMultiplier);
+ } else {
+ Logger.WARNING("Fluid Recycle Recipe: " + material.getLocalizedName() + " - Failed");
+ if (mDust == null) {
+ Logger.WARNING("Invalid Dust output.");
+ }
+ }
+ }
+
+ } catch (final Throwable t) {
+ t.printStackTrace();
+ // Utils.LOG_WARNING("Returning Null. Throwable Info:
+ // "+t.getMessage());
+ // Utils.LOG_WARNING("Throwable Info: "+t.toString());
+ // Utils.LOG_WARNING("Throwable Info:
+ // "+t.getCause().toString());
+ }
+ }
+ }
+ }
+
+ public static Pair<OrePrefixes, ItemStack> getDustData(final Material aMaterial, final OrePrefixes aPrefix) {
+ return getDustData(aMaterial, aPrefix.mMaterialAmount);
+ }
+
+ public static Pair<OrePrefixes, ItemStack> getDustData(final Material aMaterial, final long aMaterialAmount) {
+ ItemStack mDust = null;
+ OrePrefixes mPrefix = null;
+
+ if (aMaterial == null || aMaterialAmount <= 0) {
+ return null;
+ }
+ if ((((aMaterialAmount % M) == 0) || (aMaterialAmount >= (M * 16)))) {
+ mDust = get(OrePrefixes.dust, aMaterial, aMaterialAmount / M);
+ mPrefix = OrePrefixes.dust;
+ }
+ if ((mDust == null) && ((((aMaterialAmount * 4) % M) == 0) || (aMaterialAmount >= (M * 8)))) {
+ mDust = get(OrePrefixes.dustSmall, aMaterial, (aMaterialAmount * 4) / M);
+ mPrefix = OrePrefixes.dustSmall;
+ }
+ if ((mDust == null) && (((aMaterialAmount * 9) >= M))) {
+ mDust = get(OrePrefixes.dustTiny, aMaterial, (aMaterialAmount * 9) / M);
+ mPrefix = OrePrefixes.dustTiny;
+ }
+
+ if (mPrefix != null && mDust != null) {
+ Logger.WARNING("Built valid dust pair.");
+ return new Pair<>(mPrefix, mDust);
+ } else {
+ Logger.WARNING("mPrefix: " + (mPrefix != null));
+ Logger.WARNING("mDust: " + (mDust != null));
+ }
+ Logger.WARNING("Failed to build valid dust pair.");
+ return null;
+ }
+
+ public static ItemStack getDust(final Material aMaterial, final OrePrefixes aPrefix) {
+ return aMaterial == null ? null : getDust(aMaterial, aPrefix.mMaterialAmount);
+ }
+
+ public static ItemStack getDust(final Material aMaterial, final long aMaterialAmount) {
+ if (aMaterialAmount <= 0) {
+ return null;
+ }
+ ItemStack rStack = null;
+ if ((((aMaterialAmount % M) == 0) || (aMaterialAmount >= (M * 16)))) {
+ Logger.WARNING("Trying to get a Dust");
+ rStack = get(OrePrefixes.dust, aMaterial, aMaterialAmount / M);
+ }
+ if ((rStack == null) && ((((aMaterialAmount * 4) % M) == 0) || (aMaterialAmount >= (M * 8)))) {
+ Logger.WARNING("Trying to get a Small Dust");
+ rStack = get(OrePrefixes.dustSmall, aMaterial, (aMaterialAmount * 4) / M);
+ }
+ if ((rStack == null) && (((aMaterialAmount * 9) >= M))) {
+ Logger.WARNING("Trying to get a Tiny Dust");
+ rStack = get(OrePrefixes.dustTiny, aMaterial, (aMaterialAmount * 9) / M);
+ }
+ return rStack;
+ }
+
+ public static ItemStack get(final Object aName, final long aAmount) {
+ return get(aName, null, aAmount, true, true);
+ }
+
+ public static ItemStack get(final Object aName, final ItemStack aReplacement, final long aAmount) {
+ return get(aName, aReplacement, aAmount, true, true);
+ }
+
+ public static ItemStack get(final OrePrefixes aPrefix, final Material aMaterial, final long aAmount) {
+ return get(aPrefix, aMaterial, null, aAmount);
+ }
+
+ public static ItemStack get(final OrePrefixes aPrefix, final Material aMaterial, final ItemStack aReplacement,
+ final long aAmount) {
+ return get(
+ aPrefix.name() + Utils.sanitizeString(aMaterial.getLocalizedName()),
+ aReplacement,
+ aAmount,
+ false,
+ true);
+ }
+
+ public static ItemStack get(final Object aName, final ItemStack aReplacement, final long aAmount,
+ final boolean aMentionPossibleTypos, final boolean aNoInvalidAmounts) {
+ if (aNoInvalidAmounts && (aAmount < 1L)) {
+ Logger.WARNING("Returning Null. Method: " + ReflectionUtils.getMethodName(0));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(1));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(2));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(3));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(4));
+ return null;
+ }
+ if (!mNameMap.containsKey(aName.toString()) && aMentionPossibleTypos) {
+ Logger.WARNING("Unknown Key for Unification, Typo? " + aName);
+ }
+ return GT_Utility.copyAmount(
+ aAmount,
+ new Object[] { mNameMap.get(aName.toString()), getFirstOre(aName, aAmount), aReplacement });
+ }
+
+ public static ItemStack getFirstOre(final Object aName, final long aAmount) {
+ if (GT_Utility.isStringInvalid(aName)) {
+ Logger.WARNING("Returning Null. Method: " + ReflectionUtils.getMethodName(0));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(1));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(2));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(3));
+ Logger.WARNING("Called from method: " + ReflectionUtils.getMethodName(4));
+ return null;
+ }
+ final ItemStack tStack = mNameMap.get(aName.toString());
+ if (GT_Utility.isStackValid(tStack)) {
+ Logger.WARNING("Found valid stack.");
+ return GT_Utility.copyAmount(aAmount, new Object[] { tStack });
+ }
+ return GT_Utility.copyAmount(aAmount, getOres(aName).toArray());
+ }
+
+ public static ArrayList<ItemStack> getOres(final Object aOreName) {
+ final String aName = (aOreName == null) ? "" : aOreName.toString();
+ final ArrayList<ItemStack> rList = new ArrayList<>();
+ if (GT_Utility.isStringValid(aName)) {
+ Logger.WARNING("Making a list of all OreDict entries for " + aOreName + ".");
+ if (rList.addAll(OreDictionary.getOres(aName))) {
+ Logger.WARNING("Added " + rList.size() + " elements to list.");
+ } else {
+ Logger.WARNING("Failed to Add Collection from oreDictionary, forcing an entry.");
+ rList.add(ItemUtils.getItemStackOfAmountFromOreDict((String) aOreName, 1));
+ }
+ }
+ return rList;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Map<String, ItemStack> getNameMap() {
+ Map<String, ItemStack> tempMap;
+ try {
+ tempMap = (Map<String, ItemStack>) FieldUtils
+ .readStaticField(GT_OreDictUnificator.class, "sName2StackMap", true);
+ if (tempMap != null) {
+ Logger.WARNING("Found 'sName2StackMap' in GT_OreDictUnificator.class.");
+ return tempMap;
+ }
+ } catch (final IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ Logger.WARNING("Invalid map stored in GT_OreDictUnificator.class, unable to find sName2StackMap field.");
+ return null;
+ }
+
+ public static ItemStack getItemStackOfAmountFromOreDictNoBroken(String oredictName, final int amount) {
+
+ try {
+
+ if (oredictName.contains("-") || oredictName.contains("_")) {
+ oredictName = Utils.sanitizeString(oredictName, new char[] { '-', '_' });
+ } else {
+ oredictName = Utils.sanitizeString(oredictName);
+ }
+
+ // Adds a check to grab dusts using GT methodology if possible.
+ ItemStack returnValue = null;
+ if (oredictName.toLowerCase()
+ .contains("dust")) {
+ final String MaterialName = oredictName.toLowerCase()
+ .replace("dust", "");
+ final Materials m = Materials.get(MaterialName);
+ if (m != null && m != Materials._NULL) {
+ returnValue = ItemUtils.getGregtechDust(m, amount);
+ if (ItemUtils.checkForInvalidItems(returnValue)) {
+ return returnValue;
+ }
+ }
+ }
+ if (returnValue == null) {
+ returnValue = getItemStackOfAmountFromOreDict(oredictName, amount);
+ if (ItemUtils.checkForInvalidItems(returnValue)) {
+ return returnValue.copy();
+ }
+ }
+ return null;
+ } catch (final Throwable t) {
+ return null;
+ }
+ }
+
+ public static ItemStack getItemStackOfAmountFromOreDict(String oredictName, final int amount) {
+ String mTemp = oredictName;
+
+ // Banned Materials and replacements for GT5.8 compat.
+
+ if (oredictName.toLowerCase()
+ .contains("ingotclay")) {
+ return ItemUtils.getSimpleStack(Items.clay_ball, amount);
+ }
+
+ final ArrayList<ItemStack> oreDictList = OreDictionary.getOres(mTemp);
+ if (!oreDictList.isEmpty()) {
+ final ItemStack returnValue = oreDictList.get(0)
+ .copy();
+ returnValue.stackSize = amount;
+ return returnValue;
+ }
+ return null;
+ // return getItemStackOfAmountFromOreDictNoBroken(mTemp, amount);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_ShapedCrafting.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_ShapedCrafting.java
new file mode 100644
index 0000000000..3ef1740189
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/RecipeGen_ShapedCrafting.java
@@ -0,0 +1,222 @@
+package gtPlusPlus.xmod.gregtech.loaders;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.interfaces.RunnableWithInfo;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeGen_ShapedCrafting extends RecipeGen_Base {
+
+ public static final Set<RunnableWithInfo<Material>> mRecipeGenMap = new HashSet<>();
+
+ static {
+ MaterialGenerator.mRecipeMapsToGenerate.put(mRecipeGenMap);
+ }
+
+ public RecipeGen_ShapedCrafting(final Material M) {
+ this.toGenerate = M;
+ mRecipeGenMap.add(this);
+ }
+
+ @Override
+ public void run() {
+ generateRecipes(this.toGenerate);
+ }
+
+ private void generateRecipes(final Material material) {
+ Logger.WARNING("Generating Shaped Crafting recipes for " + material.getLocalizedName()); // TODO
+
+ // Single Plate Shaped/Shapeless
+ if (ItemUtils.checkForInvalidItems(material.getPlate(1))
+ && ItemUtils.checkForInvalidItems(material.getIngot(1)))
+ if (material.getPlate(1) != null && material.getIngot(1) != null) GT_ModHandler.addCraftingRecipe(
+ material.getPlate(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "h", "B", "I", Character.valueOf('I'), material.getIngot(1), Character.valueOf('B'),
+ material.getIngot(1) });
+
+ if (ItemUtils.checkForInvalidItems(material.getPlate(1))
+ && ItemUtils.checkForInvalidItems(material.getIngot(1)))
+ GT_ModHandler.addShapelessCraftingRecipe(
+ material.getPlate(1),
+ new Object[] { gregtech.api.enums.ToolDictNames.craftingToolForgeHammer, material.getIngot(1),
+ material.getIngot(1) });
+
+ // Double Plate Shaped/Shapeless
+ if (ItemUtils.checkForInvalidItems(material.getPlateDouble(1))
+ && ItemUtils.checkForInvalidItems(material.getPlate(1)))
+ GT_ModHandler.addCraftingRecipe(
+ material.getPlateDouble(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "I", "B", "h", Character.valueOf('I'), material.getPlate(1), Character.valueOf('B'),
+ material.getPlate(1) });
+
+ if (ItemUtils.checkForInvalidItems(material.getPlateDouble(1))
+ && ItemUtils.checkForInvalidItems(material.getPlate(1)))
+ GT_ModHandler.addShapelessCraftingRecipe(
+ material.getPlateDouble(1),
+ new Object[] { gregtech.api.enums.ToolDictNames.craftingToolForgeHammer, material.getPlate(1),
+ material.getPlate(1) });
+
+ // Ring Recipe
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getRing(1))
+ && ItemUtils.checkForInvalidItems(material.getRod(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getRing(1),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "h ", "fR", 'R', material.getRod(1) })) {
+ Logger.WARNING("GT:NH Ring Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("GT:NH Ring Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Framebox Recipe
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getFrameBox(1))
+ && ItemUtils.checkForInvalidItems(material.getRod(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getFrameBox(2),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "RRR", "RwR", "RRR", 'R', material.getRod(1) })) {
+ Logger.WARNING("Framebox Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Framebox Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Shaped Recipe - Bolts
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getBolt(1))
+ && ItemUtils.checkForInvalidItems(material.getRod(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getBolt(2),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "s ", " R", 'R', material.getRod(1) })) {
+ Logger.WARNING("Bolt Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Bolt Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Shaped Recipe - Fine Wire
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getFoil(1))
+ && ItemUtils.checkForInvalidItems(material.getFineWire(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getFineWire(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "Fx", 'F', material.getFoil(1) })) {
+ Logger.WARNING("Fine Wire Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Fine Wire Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Shaped Recipe - Foil
+ if (ItemUtils.checkForInvalidItems(material.getFoil(1))
+ && ItemUtils.checkForInvalidItems(material.getPlate(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getFoil(2),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "hP", 'P', material.getPlate(1) })) {
+ Logger.WARNING("Foil Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Foil Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Shaped Recipe - Ingot to Rod
+ if (ItemUtils.checkForInvalidItems(material.getRod(1)) && ItemUtils.checkForInvalidItems(material.getIngot(1)))
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getRod(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "f ", " I", 'I', material.getIngot(1) })) {
+ Logger.WARNING("Rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Shaped Recipe - Long Rod to two smalls
+ if (ItemUtils.checkForInvalidItems(material.getRod(1))
+ && ItemUtils.checkForInvalidItems(material.getLongRod(1)))
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getRod(2),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "s", "L", 'L', material.getLongRod(1) })) {
+ Logger.WARNING("Rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Two small to long rod
+ if (ItemUtils.checkForInvalidItems(material.getLongRod(1))
+ && ItemUtils.checkForInvalidItems(material.getRod(1)))
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getLongRod(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "RhR", 'R', material.getRod(1) })) {
+ Logger.WARNING("Long Rod Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Long Rod Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+
+ // Rotor Recipe
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getRotor(1))
+ && ItemUtils.checkForInvalidItems(material.getRing(1))
+ && !material.isRadioactive
+ && ItemUtils.checkForInvalidItems(material.getPlate(1))
+ && ItemUtils.checkForInvalidItems(material.getScrew(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getRotor(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PhP", "SRf", "PdP", 'P', material.getPlate(1), 'S', material.getScrew(1), 'R',
+ material.getRing(1), })) {
+ Logger.WARNING("Rotor Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Rotor Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Gear Recipe
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getGear(1))
+ && ItemUtils.checkForInvalidItems(material.getPlate(1))
+ && ItemUtils.checkForInvalidItems(material.getRod(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getGear(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "RPR", "PwP", "RPR", 'P', material.getPlate(1), 'R', material.getRod(1), })) {
+ Logger.WARNING("Gear Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Gear Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+
+ // Screws
+ if (!material.isRadioactive && ItemUtils.checkForInvalidItems(material.getScrew(1))
+ && ItemUtils.checkForInvalidItems(material.getBolt(1))) {
+ if (GT_ModHandler.addCraftingRecipe(
+ material.getScrew(1),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "fB", "B ", 'B', material.getBolt(1), })) {
+ Logger.WARNING("Screw Recipe: " + material.getLocalizedName() + " - Success");
+ } else {
+ Logger.WARNING("Screw Recipe: " + material.getLocalizedName() + " - Failed");
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/misc/AddCustomMachineToPA.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/misc/AddCustomMachineToPA.java
new file mode 100644
index 0000000000..aab24db6d3
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/misc/AddCustomMachineToPA.java
@@ -0,0 +1,13 @@
+package gtPlusPlus.xmod.gregtech.loaders.misc;
+
+import gregtech.api.util.GT_ProcessingArray_Manager;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+
+public class AddCustomMachineToPA {
+
+ public static void register() {
+
+ // Simple Washers
+ GT_ProcessingArray_Manager.addRecipeMapToPA("simplewasher.01", GTPPRecipeMaps.simpleWasherRecipes);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_AlgaeFarm.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_AlgaeFarm.java
new file mode 100644
index 0000000000..69d79cdc4b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_AlgaeFarm.java
@@ -0,0 +1,192 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import java.util.HashMap;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.WeightedCollection;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeLoader_AlgaeFarm {
+
+ private static final HashMap<Integer, AutoMap<GT_Recipe>> mRecipeCache = new HashMap<>();
+ private static final HashMap<Integer, AutoMap<GT_Recipe>> mRecipeCompostCache = new HashMap<>();
+
+ public static void generateRecipes() {
+ for (int i = 0; i < 10; i++) {
+ getTieredRecipeFromCache(i, false);
+ }
+ for (int i = 0; i < 10; i++) {
+ getTieredRecipeFromCache(i, true);
+ }
+ }
+
+ public static GT_Recipe getTieredRecipeFromCache(int aTier, boolean aCompost) {
+ HashMap<Integer, AutoMap<GT_Recipe>> aMap = aCompost ? mRecipeCompostCache : mRecipeCache;
+ String aComp = aCompost ? "(Compost)" : "";
+
+ AutoMap<GT_Recipe> aTemp = aMap.get(aTier);
+ if (aTemp == null || aTemp.isEmpty()) {
+ aTemp = new AutoMap<>();
+ aMap.put(aTier, aTemp);
+ Logger.INFO("Tier " + aTier + aComp + " had no recipes, initialising new map.");
+ }
+ if (aTemp.size() < 500) {
+ Logger
+ .INFO("Tier " + aTier + aComp + " has less than 500 recipes, generating " + (500 - aTemp.size()) + ".");
+ for (int i = aTemp.size(); i < 500; i++) {
+ aTemp.put(generateBaseRecipe(aCompost, aTier));
+ }
+ }
+ int aIndex = MathUtils.randInt(0, aTemp.isEmpty() ? 1 : aTemp.size());
+ Logger.INFO("Using recipe with index of " + aIndex + ". " + aComp);
+ return aTemp.get(aIndex);
+ }
+
+ public static int compostForTier(int aTier) {
+ return aTier > 1 ? (int) Math.min(64, Math.pow(2, aTier - 1)) : 1;
+ }
+
+ private static GT_Recipe generateBaseRecipe(boolean aUsingCompost, int aTier) {
+
+ // Type Safety
+ if (aTier < 0) {
+ return null;
+ }
+
+ WeightedCollection<Float> aOutputTimeMulti = new WeightedCollection<>();
+ for (int i = 100; i > 0; i--) {
+ float aValue = 0;
+ if (i < 10) {
+ aValue = 3f;
+ } else if (i < 20) {
+ aValue = 2f;
+ } else {
+ aValue = 1f;
+ }
+ aOutputTimeMulti.put(i, aValue);
+ }
+
+ final int[] aDurations = new int[] { 2000, 1800, 1600, 1400, 1200, 1000, 512, 256, 128, 64, 32, 16, 8, 4, 2,
+ 1 };
+
+ ItemStack[] aInputs = new ItemStack[] {};
+
+ if (aUsingCompost) {
+ // Make it use 4 compost per tier if we have some available
+ // Compost consumption maxes out at 1 stack per cycle
+ ItemStack aCompost = ItemUtils.getSimpleStack(AgriculturalChem.mCompost, compostForTier(aTier));
+ aInputs = new ItemStack[] { aCompost };
+ // Boost Tier by one if using compost so it gets a speed boost
+ aTier++;
+ }
+
+ // We set these elsewhere
+ ItemStack[] aOutputs = getOutputsForTier(aTier);
+
+ GT_Recipe tRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ (Object) null,
+ new int[] {},
+ new FluidStack[] { GT_Values.NF },
+ new FluidStack[] { GT_Values.NF },
+ (int) (aDurations[aTier] * aOutputTimeMulti.get() / 2), // Time
+ 0,
+ 0);
+
+ tRecipe.mSpecialValue = tRecipe.hashCode();
+
+ return tRecipe;
+ }
+
+ private static ItemStack[] getOutputsForTier(int aTier) {
+
+ // Create an Automap to dump contents into
+ AutoMap<ItemStack> aOutputMap = new AutoMap<>();
+
+ // Add loot relevant to tier and also add any from lower tiers.
+
+ if (aTier >= 0) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 2));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 4));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 2));
+ }
+ }
+
+ if (aTier >= 1) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mAlgaeBiosmass, 4));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 2));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 4));
+ }
+ }
+ if (aTier >= 2) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 2));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 3));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 8));
+ }
+ }
+ if (aTier >= 3) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, 4));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 1));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 4));
+ }
+ }
+ if (aTier >= 4) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 2));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 3));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 4));
+ }
+ }
+ if (aTier >= 5) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, 4));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 2));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 4));
+ }
+ }
+ // Tier 6 is Highest for outputs
+ if (aTier >= 6) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, 4));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 2));
+ if (MathUtils.randInt(0, 10) > 9) {
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, 8));
+ }
+ }
+
+ // Iterate a special loop at higher tiers to provide more Red/Gold Algae.
+ for (int i2 = 0; i2 < 20; i2++) {
+ if (aTier >= (6 + i2)) {
+ int aMulti = i2 + 1;
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGreenAlgaeBiosmass, aMulti * 4));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mBrownAlgaeBiosmass, aMulti * 3));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mGoldenBrownAlgaeBiosmass, aMulti * 2));
+ aOutputMap.put(ItemUtils.getSimpleStack(AgriculturalChem.mRedAlgaeBiosmass, aMulti));
+ } else {
+ i2 = 20;
+ }
+ }
+
+ // Map the AutoMap contents to an Itemstack Array.
+ ItemStack[] aOutputs = new ItemStack[aOutputMap.size()];
+ for (int i = 0; i < aOutputMap.size(); i++) {
+ aOutputs[i] = aOutputMap.get(i);
+ }
+
+ // Return filled ItemStack Array.
+ return aOutputs;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_ChemicalSkips.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_ChemicalSkips.java
new file mode 100644
index 0000000000..dfa6d9dea6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_ChemicalSkips.java
@@ -0,0 +1,661 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.EternalSingularity;
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.GoodGenerator;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader;
+import com.github.technus.tectech.recipe.TT_recipeAdder;
+import com.github.technus.tectech.thing.block.QuantumGlassBlock;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.items.CombType;
+import gregtech.loaders.misc.GT_Bees;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.Particle;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class RecipeLoader_ChemicalSkips {
+
+ public static void generate() {
+ createRecipes();
+ }
+
+ private static void createRecipes() {
+ quantumTransformerRecipes();
+ fusionReactorRecipes();
+ catalystRecipes();
+ tieredCasingRecipes();
+ }
+
+ // All the recipes that the QFT can do. Each recipe has a machine tier.
+ // -> Tier 1 is UEV (UEV circuits and 1 Eternal Singularity);
+ // -> Tier 2 needs new item from QFT, plus stacks of Infinity;
+ // -> Tier 3 needs new item from QFT, plus stacks of Transcendent Metal;
+ // -> Tier 4 needs new item from QFT, plus stacks of Spacetime;
+ // (Until they are created, the new items are represented by
+ // HSS-G for Tier 2, HSS-S for Tier 3 and HSS-E for Tier 4)
+
+ private static void quantumTransformerRecipes() {
+ ItemStack stemcells = GT_Utility.copyAmountUnsafe(64 * 32, ItemList.Circuit_Chip_Stemcell.get(1));
+ ItemStack biocells = GT_Utility.copyAmountUnsafe(64 * 32, ItemList.Circuit_Chip_Biocell.get(1));
+ // Platline
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { WerkstoffLoader.PTMetallicPowder.get(OrePrefixes.dust, 32),
+ ItemUtils.getSimpleStack(GenericChem.mPlatinumGroupCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ new ItemStack[] { Materials.Platinum.getDust(64), Materials.Palladium.getDust(64),
+ Materials.Iridium.getDust(64), Materials.Osmium.getDust(64),
+ WerkstoffLoader.Rhodium.get(OrePrefixes.dust, 64),
+ WerkstoffLoader.Ruthenium.get(OrePrefixes.dust, 64) },
+ new int[] { 1667, 1667, 1667, 1667, 1667, 1667 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UV,
+ 1);
+
+ // Early Plastics
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Carbon.getDust(64),
+ ItemUtils.getSimpleStack(GenericChem.mPlasticPolymerCatalyst, 0) },
+ new FluidStack[] { Materials.Oxygen.getGas(1000 * 16), Materials.Hydrogen.getGas(1000 * 16),
+ Materials.Chlorine.getGas(1000 * 16), Materials.Fluorine.getGas(1000 * 16) },
+ new FluidStack[] { Materials.Plastic.getMolten(144 * 256), Materials.PolyvinylChloride.getMolten(144 * 128),
+ Materials.Polystyrene.getMolten(144 * 64), Materials.Polytetrafluoroethylene.getMolten(144 * 128),
+ Materials.Epoxid.getMolten(144 * 64), Materials.Polybenzimidazole.getMolten(144 * 64) },
+ null,
+ new int[] { 2000, 2000, 2000, 2000, 2000, 2000 },
+ 20 * 20,
+ (int) TierEU.RECIPE_ZPM,
+ 1);
+
+ // Early Rubbers/Cable Materials
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Carbon.getDust(64),
+ ItemUtils.getSimpleStack(GenericChem.mRubberPolymerCatalyst, 0) },
+ new FluidStack[] { Materials.Oxygen.getGas(1000 * 16), Materials.Hydrogen.getGas(1000 * 16),
+ Materials.Chlorine.getGas(1000 * 16) },
+ new FluidStack[] { Materials.Silicone.getMolten(144 * 64),
+ Materials.StyreneButadieneRubber.getMolten(144 * 64),
+ Materials.PolyphenyleneSulfide.getMolten(144 * 128), Materials.Rubber.getMolten(144 * 256) },
+ null,
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_ZPM,
+ 1);
+
+ // Glues and Solders
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Carbon.getDust(32), Materials.Bismuth.getDust(32),
+ ItemUtils.getSimpleStack(GenericChem.mAdhesionPromoterCatalyst, 0) },
+ new FluidStack[] { Materials.Oxygen.getGas(10000), Materials.Hydrogen.getGas(10000) },
+ new FluidStack[] { MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(1000 * 32),
+ Materials.AdvancedGlue.getFluid(1000 * 16), ALLOY.INDALLOY_140.getFluidStack(144 * 64),
+ Materials.SolderingAlloy.getMolten(144 * 128) },
+ new ItemStack[] { ItemList.StableAdhesive.get(1) },
+ new int[] { 2000, 2000, 2000, 2000, 2000 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UV,
+ 1);
+
+ // Titanium, Tungsten, Indium
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Lead.getDust(16), Materials.Bauxite.getDust(32),
+ Materials.Tungstate.getDust(16), ItemUtils.getSimpleStack(GenericChem.mTitaTungstenIndiumCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ new ItemStack[] { Materials.Titanium.getDust(64), Materials.TungstenSteel.getDust(64),
+ Materials.TungstenCarbide.getDust(64), Materials.Indium.getDust(64) },
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UV,
+ 1);
+
+ // Thorium, Uranium, Plutonium
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Thorium.getDust(32), Materials.Uranium.getDust(32),
+ ItemUtils.getSimpleStack(GenericChem.mRadioactivityCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ new ItemStack[] { ELEMENT.getInstance().THORIUM232.getDust(64),
+ ELEMENT.getInstance().URANIUM233.getDust(64), Materials.Uranium235.getDust(64),
+ ELEMENT.getInstance().PLUTONIUM238.getDust(64), Materials.Plutonium.getDust(64),
+ Materials.Plutonium241.getDust(64) },
+ new int[] { 1667, 1667, 1667, 1667, 1667, 1667 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UV,
+ 1);
+
+ // Monaline
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Monazite.getDust(32),
+ ItemUtils.getSimpleStack(GenericChem.mRareEarthGroupCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ new ItemStack[] { Materials.Cerium.getDust(64), Materials.Gadolinium.getDust(64),
+ Materials.Samarium.getDust(64), getModItem(BartWorks.ID, "gt.bwMetaGenerateddust", 64L, 11002), // Hafnia
+ getModItem(BartWorks.ID, "gt.bwMetaGenerateddust", 64L, 11007), // Zirconium
+ ItemList.SuperconductorComposite.get(1) },
+ new int[] { 1667, 1667, 1667, 1667, 1667, 1667 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UHV,
+ 2);
+
+ // Bastline
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Bastnasite.getDust(32),
+ ItemUtils.getSimpleStack(GenericChem.mRareEarthGroupCatalyst, 0) },
+ null,
+ null,
+ new ItemStack[] { Materials.Holmium.getDust(64), Materials.Cerium.getDust(64),
+ Materials.Samarium.getDust(64), Materials.Gadolinium.getDust(64), Materials.Lanthanum.getDust(64) },
+ new int[] { 2000, 2000, 2000, 2000, 2000 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UHV,
+ 2);
+
+ // Early Waterline skip (first 4 tiers)
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GenericChem.mLimpidWaterCatalyst, 0) },
+ new FluidStack[] { Materials.Water.getFluid(40000L) },
+ new FluidStack[] { Materials.Grade1PurifiedWater.getFluid(20000L),
+ Materials.Grade2PurifiedWater.getFluid(10000L), Materials.Grade3PurifiedWater.getFluid(5000L),
+ Materials.Grade4PurifiedWater.getFluid(1000L) },
+ new ItemStack[] {},
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UHV,
+ 2);
+
+ // Stem Cells
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Calcium.getDust(32), Materials.MeatRaw.getDust(32),
+ getModItem(NewHorizonsCoreMod.ID, "GTNHBioItems", 32, 2),
+ ItemUtils.getSimpleStack(GenericChem.mRawIntelligenceCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] { Materials.GrowthMediumRaw.getFluid(1000 * 1024),
+ Materials.GrowthMediumSterilized.getFluid(1000 * 512) },
+ new ItemStack[] { stemcells },
+ new int[] { 3333, 3333, 3333 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UEV,
+ 3);
+
+ // Unknown Particles
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GenericChem.mParticleAccelerationCatalyst, 0) },
+ new FluidStack[] { Materials.Hydrogen.getGas(10000L), Materials.Deuterium.getGas(1000L) },
+ new FluidStack[] { FluidUtils.getFluidStack("plasma.hydrogen", 1000) },
+ new ItemStack[] { Particle.getBaseParticle(Particle.UNKNOWN), Particle.getBaseParticle(Particle.GRAVITON),
+ Particle.getBaseParticle(Particle.PROTON), Particle.getBaseParticle(Particle.ELECTRON) },
+ new int[] { 2000, 2000, 2000, 2000, 2000 },
+ 5 * 20,
+ (int) TierEU.RECIPE_UEV,
+ 3);
+
+ // Lategame Plastics (Missing Radox Polymer and Heavy Radox)
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { Materials.Carbon.getDust(64), Materials.Osmium.getDust(24),
+ ItemUtils.getSimpleStack(GenericChem.mUltimatePlasticCatalyst, 0) },
+ new FluidStack[] { Materials.Hydrogen.getGas(1000 * 16), Materials.Nitrogen.getGas(1000 * 16) },
+ new FluidStack[] { FluidUtils.getFluidStack("xenoxene", 1000 * 16),
+ FluidUtils.getFluidStack("molten.radoxpoly", 144 * 64),
+ FluidUtils.getFluidStack("heavyradox", 1000 * 16), MaterialsKevlar.Kevlar.getMolten(144 * 64) },
+ new ItemStack[] {},
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UIV,
+ 4);
+
+ // Lategame Kevlar using Kevlar bee comb
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { GT_Bees.combs.getStackForType(CombType.KEVLAR, 24), Materials.Carbon.getDust(64),
+ ItemUtils.getSimpleStack(GenericChem.mUltimatePlasticCatalyst, 0) },
+ new FluidStack[] { Materials.Nitrogen.getGas(1000 * 16), Materials.Hydrogen.getGas(1000 * 16) },
+ new FluidStack[] { MaterialsKevlar.PolyurethaneResin.getFluid(1000 * 32),
+ MaterialsKevlar.LiquidCrystalKevlar.getFluid(144 * 32), MaterialsKevlar.Kevlar.getMolten(144 * 64) },
+ new ItemStack[] {},
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UIV,
+ 4);
+ // Platline skip using Platline Combs (Palladium, Osmium, Iridium, Platinum)
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { GT_Bees.combs.getStackForType(CombType.PLATINUM, 32),
+ GT_Bees.combs.getStackForType(CombType.PALLADIUM, 32),
+ GT_Bees.combs.getStackForType(CombType.OSMIUM, 32), GT_Bees.combs.getStackForType(CombType.IRIDIUM, 32),
+ ItemUtils.getSimpleStack(GenericChem.mPlatinumGroupCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] { Materials.Osmium.getMolten(144 * 256), Materials.Palladium.getMolten(144 * 256),
+ Materials.Iridium.getMolten(144 * 256), Materials.Platinum.getMolten(144 * 256) },
+ new ItemStack[] {},
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UV,
+ 1);
+ // Bio Cells and Mutated Solder
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { ItemList.Circuit_Chip_Stemcell.get(16), Materials.InfinityCatalyst.getDust(4),
+ ItemUtils.getSimpleStack(GenericChem.mBiologicalIntelligenceCatalyst, 0) },
+ new FluidStack[] {},
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 128),
+ Materials.BioMediumSterilized.getFluid(1000 * 256), Materials.BioMediumRaw.getFluid(1000 * 512) },
+ new ItemStack[] { biocells },
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UIV,
+ 4);
+
+ // Advanced Waterline skip (last 4 tiers)
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GenericChem.mFlawlessWaterCatalyst, 0) },
+ new FluidStack[] { Materials.Water.getFluid(40000L) },
+ new FluidStack[] { Materials.Grade5PurifiedWater.getFluid(20000L),
+ Materials.Grade6PurifiedWater.getFluid(10000L), Materials.Grade7PurifiedWater.getFluid(5000L),
+ Materials.Grade8PurifiedWater.getFluid(1000L) },
+ new ItemStack[] {},
+ new int[] { 2500, 2500, 2500, 2500 },
+ 20 * 20,
+ (int) TierEU.RECIPE_UIV,
+ 4);
+
+ // Rare Particles
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { ItemUtils.getSimpleStack(GenericChem.mSynchrotronCapableCatalyst, 0),
+ GregtechItemList.Laser_Lens_Special.get(1) },
+ new FluidStack[] { FluidUtils.getFluidStack("plasma.hydrogen", 30000), Materials.Helium.getPlasma(30000L),
+ Materials.Americium.getPlasma(30000L),
+ new FluidStack(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getPlasma(), 30000) },
+ new FluidStack[] {},
+ new ItemStack[] { Particle.getBaseParticle(Particle.Z_BOSON), Particle.getBaseParticle(Particle.W_BOSON),
+ Particle.getBaseParticle(Particle.LAMBDA), Particle.getBaseParticle(Particle.OMEGA),
+ Particle.getBaseParticle(Particle.HIGGS_BOSON) },
+ new int[] { 2000, 2000, 2000, 2000, 2000 },
+ 200 * 20,
+ (int) TierEU.RECIPE_UIV,
+ 4);
+
+ if (GalaxySpace.isModLoaded()) {
+ // Seaweed
+ ItemStack seaweed = GT_Utility
+ .copyAmountUnsafe(64 * 32, getModItem(GalaxySpace.ID, "tcetiedandelions", 1, 4));
+ CORE.RA.addQuantumTransformerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get("cropSeaweed", 64), Materials.Mytryl.getDust(16),
+ ItemUtils.getSimpleStack(GenericChem.mAlgagenicGrowthPromoterCatalyst, 0) },
+ new FluidStack[] { FluidUtils.getFluidStack("unknowwater", 25_000) },
+ new FluidStack[] { FluidUtils.getFluidStack("seaweedbroth", 50_000),
+ FluidUtils.getFluidStack("iodine", 64_000) },
+ new ItemStack[] { seaweed, getModItem(NewHorizonsCoreMod.ID, "item.TCetiESeaweedExtract", 16) },
+ new int[] { 2_500, 2_500, 2_500, 2_500 },
+ 20 * SECONDS,
+ (int) TierEU.RECIPE_UIV,
+ 4);
+ }
+ }
+
+ private static void fusionReactorRecipes() {
+ GT_Values.RA.addFusionReactorRecipe(
+ new FluidStack[] { Materials.Radon.getPlasma(100), Materials.Nitrogen.getPlasma(100) },
+ new FluidStack[] { new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 100) },
+ 30 * 20,
+ (int) TierEU.RECIPE_UHV,
+ 1_000_000_000);
+
+ GT_Values.RA.addFusionReactorRecipe(
+ new FluidStack[] { Materials.Americium.getPlasma(100), Materials.Boron.getPlasma(100) },
+ new FluidStack[] { new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 100) },
+ 30 * 20,
+ (int) TierEU.RECIPE_UHV,
+ 1_000_000_000);
+
+ // MK5 versions
+ GT_Values.RA.addFusionReactorRecipe(
+ new FluidStack[] { new FluidStack(ELEMENT.getInstance().XENON.getPlasma(), 288),
+ Materials.Yttrium.getMolten(288) },
+ new FluidStack[] { new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 288) },
+ 1 * SECONDS + 12 * TICKS,
+ (int) TierEU.RECIPE_UEV,
+ 1_000_000_000);
+
+ GT_Values.RA.addFusionReactorRecipe(
+ new FluidStack[] { new FluidStack(ELEMENT.STANDALONE.FORCE.getPlasma(), 288),
+ Materials.Rubidium.getMolten(288) },
+ new FluidStack[] { new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 288) },
+ 1 * SECONDS + 12 * TICKS,
+ (int) TierEU.RECIPE_UEV,
+ 1_000_000_000);
+ }
+
+ private static void catalystRecipes() {
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ getModItem(BartWorks.ID, "gt.bwMetaGenerateddust", 64L, 88), Materials.Osmiridium.getDust(64),
+ Materials.Carbon.getNanite(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(360),
+ ItemUtils.getSimpleStack(GenericChem.mPlatinumGroupCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ Materials.Polybenzimidazole.getDust(64), Materials.Polytetrafluoroethylene.getDust(64),
+ Materials.Carbon.getNanite(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(360),
+ ItemUtils.getSimpleStack(GenericChem.mPlasticPolymerCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), Materials.Silicone.getDust(64),
+ Materials.StyreneButadieneRubber.getDust(64), Materials.Carbon.getNanite(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(360),
+ ItemUtils.getSimpleStack(GenericChem.mRubberPolymerCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), ALLOY.INDALLOY_140.getDust(64),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getCell(64), Materials.Carbon.getNanite(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(360),
+ ItemUtils.getSimpleStack(GenericChem.mAdhesionPromoterCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UHV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), Materials.TungstenSteel.getDust(64),
+ Materials.Indium.getDust(64), Materials.Carbon.getNanite(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(360),
+ ItemUtils.getSimpleStack(GenericChem.mTitaTungstenIndiumCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UHV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ ELEMENT.getInstance().URANIUM235.getDust(64), ELEMENT.getInstance().PLUTONIUM241.getDust(64),
+ Materials.Carbon.getNanite(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(360),
+ ItemUtils.getSimpleStack(GenericChem.mRadioactivityCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UHV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), Materials.Samarium.getDust(64),
+ Materials.Gadolinium.getDust(64), Materials.Silver.getNanite(1) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(9216),
+ ItemUtils.getSimpleStack(GenericChem.mRareEarthGroupCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ WerkstoffLoader.Hedenbergit.get(OrePrefixes.lens, 1),
+ GT_OreDictUnificator.get(OrePrefixes.nanite, Materials.Silver, 1, false),
+ ItemList.Circuit_Silicon_Wafer6.get(64) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(9216),
+ ItemUtils.getSimpleStack(GenericChem.mLimpidWaterCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), Materials.Naquadah.getDust(64),
+ Materials.Adamantium.getDust(64), Materials.Silver.getNanite(1) },
+ ELEMENT.STANDALONE.HYPOGEN.getFluidStack(9216),
+ ItemUtils.getSimpleStack(GenericChem.mSimpleNaquadahCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), Materials.Naquadria.getDust(64),
+ Materials.Trinium.getDust(64), Materials.Gold.getNanite(1) },
+ MaterialsUEVplus.SpaceTime.getMolten(9216L),
+ ItemUtils.getSimpleStack(GenericChem.mAdvancedNaquadahCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UIV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), ItemList.Circuit_Chip_Stemcell.get(64),
+ Materials.Gold.getNanite(1) },
+ MaterialsUEVplus.SpaceTime.getMolten(9216L),
+ ItemUtils.getSimpleStack(GenericChem.mRawIntelligenceCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UIV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ GregtechItemList.Laser_Lens_Special.get(64),
+ GT_ModHandler.getModItem(EternalSingularity.ID, "eternal_singularity", 10) },
+ MaterialsUEVplus.SpaceTime.getMolten(9216L),
+ ItemUtils.getSimpleStack(GenericChem.mParticleAccelerationCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UIV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), MaterialsKevlar.Kevlar.getDust(64),
+ MaterialsUEVplus.TranscendentMetal.getNanite(1) },
+ FluidUtils.getFluidStack("molten.shirabon", 92160),
+ ItemUtils.getSimpleStack(GenericChem.mUltimatePlasticCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1), ItemList.Circuit_Chip_Biocell.get(64),
+ MaterialsUEVplus.TranscendentMetal.getNanite(1) },
+ FluidUtils.getFluidStack("molten.shirabon", 92160),
+ ItemUtils.getSimpleStack(GenericChem.mBiologicalIntelligenceCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ WerkstoffLoader.Hedenbergit.get(OrePrefixes.lens, 64),
+ GT_OreDictUnificator.get(OrePrefixes.nanite, Materials.Silver, 64, false),
+ ItemList.Circuit_Silicon_Wafer6.get(64) },
+ FluidUtils.getFluidStack("molten.shirabon", 92160),
+ ItemUtils.getSimpleStack(GenericChem.mFlawlessWaterCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ Particle.getBaseParticle(Particle.HIGGS_BOSON), Particle.getIon("Helium", 0),
+ Particle.getIon("Hydrogen", 0), MaterialsUEVplus.Eternity.getNanite(16) },
+ FluidUtils.getFluidStack("molten.shirabon", 92160),
+ ItemUtils.getSimpleStack(GenericChem.mSynchrotronCapableCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(10), CI.getEmptyCatalyst(1),
+ GT_OreDictUnificator.get("blockShirabon", 16), MaterialsUEVplus.Universium.getNanite(1),
+ ItemList.Timepiece.get(1) },
+ Materials.DarkIron.getMolten(92160),
+ ItemUtils.getSimpleStack(GenericChem.TemporalHarmonyCatalyst, 1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UXV);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ CI.getNumberedCircuit(10),
+ CI.getEmptyCatalyst(1),
+ getModItem(NewHorizonsCoreMod.ID, "item.TCetiESeaweedExtract", 64),
+ GT_OreDictUnificator.get("dustIodine", 64),
+ MaterialsUEVplus.TranscendentMetal.getNanite(1))
+ .itemOutputs(ItemUtils.getSimpleStack(GenericChem.mAlgagenicGrowthPromoterCatalyst, 1))
+ .fluidInputs(FluidUtils.getFluidStack("molten.shirabon", 92_160))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void tieredCasingRecipes() {
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.ForceFieldGlass.get(1),
+ 1024 * 30 * 20,
+ 1024,
+ (int) TierEU.RECIPE_ZPM,
+ 32,
+ new ItemStack[] { GregtechItemList.ForceFieldGlass.get(1), Materials.Carbon.getNanite(4),
+ ItemList.Emitter_UV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUHV, 8),
+ GregtechItemList.Laser_Lens_Special.get(1),
+ getModItem(GoodGenerator.ID, "advancedRadiationProtectionPlate", 2) },
+ new FluidStack[] { Materials.Thulium.getMolten(144 * 10), MaterialsUEVplus.ExcitedDTCC.getFluid(5000),
+ new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 500),
+ new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 500) },
+ GregtechItemList.NeutronPulseManipulator.get(1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.NeutronPulseManipulator.get(1),
+ 2048 * 30 * 20,
+ 2048,
+ (int) TierEU.RECIPE_UV,
+ 32,
+ new ItemStack[] { GregtechItemList.ForceFieldGlass.get(2), Materials.Carbon.getNanite(8),
+ ItemList.Emitter_UEV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUEV, 8),
+ GregtechItemList.Laser_Lens_Special.get(1),
+ getModItem(GoodGenerator.ID, "advancedRadiationProtectionPlate", 4), ItemList.StableAdhesive.get(4) },
+ new FluidStack[] { Materials.Thulium.getMolten(144 * 12), MaterialsUEVplus.ExcitedDTPC.getFluid(5000),
+ new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 2500),
+ new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 2500) },
+ GregtechItemList.CosmicFabricManipulator.get(1),
+ 75 * 20,
+ (int) TierEU.RECIPE_UIV);
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.CosmicFabricManipulator.get(1),
+ 4096 * 30 * 20,
+ 4096,
+ (int) TierEU.RECIPE_ZPM,
+ 32,
+ new ItemStack[] { GregtechItemList.ForceFieldGlass.get(4), Materials.Carbon.getNanite(16),
+ ItemList.Emitter_UIV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUIV, 8),
+ GregtechItemList.Laser_Lens_Special.get(1),
+ getModItem(GoodGenerator.ID, "advancedRadiationProtectionPlate", 8),
+ ItemList.SuperconductorComposite.get(4) },
+ new FluidStack[] { Materials.Thulium.getMolten(144 * 15), MaterialsUEVplus.ExcitedDTRC.getFluid(5000),
+ new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 1000 * 10),
+ new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 1000 * 10) },
+ GregtechItemList.InfinityInfusedManipulator.get(1),
+ 90 * 20,
+ (int) TierEU.RECIPE_UMV);
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.InfinityInfusedManipulator.get(1),
+ 1024 * 30 * 20,
+ 1024,
+ (int) TierEU.RECIPE_ZPM,
+ 32,
+ new ItemStack[] { GregtechItemList.ForceFieldGlass.get(8), Materials.Carbon.getNanite(32),
+ ItemList.Emitter_UMV.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUMV, 8),
+ GregtechItemList.Laser_Lens_Special.get(1),
+ getModItem(GoodGenerator.ID, "advancedRadiationProtectionPlate", 16),
+ ItemList.NaquadriaSupersolid.get(4) },
+ new FluidStack[] { Materials.Thulium.getMolten(144 * 20), MaterialsUEVplus.ExcitedDTEC.getFluid(5000),
+ new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 2000 * 10),
+ new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 2000 * 10) },
+ GregtechItemList.SpaceTimeContinuumRipper.get(1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UXV);
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ ItemList.Casing_AdvancedRadiationProof.get(1),
+ 1024 * 30 * 20,
+ 1024,
+ (int) TierEU.RECIPE_ZPM,
+ 32,
+ new ItemStack[] { ALLOY.QUANTUM.getFrameBox(1),
+ GT_OreDictUnificator.get("plateDensePreciousMetalsAlloy", 4),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Neutronium, 16),
+ ItemList.Field_Generator_UV.get(1), ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getScrew(16) },
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 10), },
+ GregtechItemList.NeutronShieldingCore.get(1),
+ 60 * 20,
+ (int) TierEU.RECIPE_UEV);
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.NeutronShieldingCore.get(1),
+ 2048 * 30 * 20,
+ 2048,
+ (int) TierEU.RECIPE_UV,
+ 32,
+ new ItemStack[] { ALLOY.QUANTUM.getFrameBox(2),
+ GT_OreDictUnificator.get("plateDenseEnrichedNaquadahAlloy", 4),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Infinity, 16),
+ ItemList.Field_Generator_UEV.get(1),
+ // Radox polymer screw.
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.get("RadoxPoly"), 16),
+ ItemList.StableAdhesive.get(4) },
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 20), },
+ GregtechItemList.CosmicFabricShieldingCore.get(1),
+ 75 * 20,
+ (int) TierEU.RECIPE_UIV);
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.CosmicFabricShieldingCore.get(1),
+ 4096 * 30 * 20,
+ 4096,
+ (int) TierEU.RECIPE_UHV,
+ 32,
+ new ItemStack[] { ALLOY.QUANTUM.getFrameBox(4), ELEMENT.STANDALONE.HYPOGEN.getPlateDense(4),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.TranscendentMetal, 16),
+ ItemList.Field_Generator_UIV.get(1), GT_OreDictUnificator.get("screwMetastableOganesson", 16),
+ ItemList.SuperconductorComposite.get(4) },
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 40), },
+ GregtechItemList.InfinityInfusedShieldingCore.get(1),
+ 90 * 20,
+ (int) TierEU.RECIPE_UMV);
+
+ TT_recipeAdder.addResearchableAssemblylineRecipe(
+ GregtechItemList.InfinityInfusedShieldingCore.get(1),
+ 8192 * 30 * 20,
+ 8192,
+ (int) TierEU.RECIPE_UEV,
+ 32,
+ new ItemStack[] { ALLOY.QUANTUM.getFrameBox(8), GT_OreDictUnificator.get("plateDenseShirabon", 4),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.SpaceTime, 16),
+ ItemList.Field_Generator_UMV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Dilithium, 16),
+ ItemList.NaquadriaSupersolid.get(4) },
+ new FluidStack[] { MISC_MATERIALS.MUTATED_LIVING_SOLDER.getFluidStack(144 * 80), },
+ GregtechItemList.SpaceTimeBendingCore.get(1),
+ 120 * 20,
+ (int) TierEU.RECIPE_UXV);
+
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { new ItemStack(QuantumGlassBlock.INSTANCE, 1), ItemList.Field_Generator_ZPM.get(1),
+ ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getLongRod(6), ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getPlate(6) },
+ ALLOY.QUANTUM.getFluidStack(144 * 6),
+ GregtechItemList.ForceFieldGlass.get(1),
+ 10 * 20,
+ (int) TierEU.RECIPE_UEV);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GTNH.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GTNH.java
new file mode 100644
index 0000000000..4aa13a0072
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GTNH.java
@@ -0,0 +1,45 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gtPlusPlus.core.material.ELEMENT;
+
+public class RecipeLoader_GTNH {
+
+ public static void generate() {
+ GT_Values.RA.addFluidSolidifierRecipe(
+ ItemList.Shape_Mold_Ball.get(0L),
+ new FluidStack(FluidRegistry.getFluid("ender"), 250),
+ new ItemStack(Items.ender_pearl, 1, 0),
+ 100,
+ 30);
+ // MK4
+ GT_Values.RA.addFusionReactorRecipe(
+ Materials.Plutonium241.getMolten(144),
+ Materials.Helium.getGas(1000),
+ ELEMENT.getInstance().CURIUM.getFluidStack(144),
+ 96,
+ 98304,
+ 500000000);
+ GT_Values.RA.addFusionReactorRecipe(
+ ELEMENT.getInstance().CURIUM.getFluidStack(144),
+ Materials.Helium.getPlasma(144),
+ ELEMENT.getInstance().CALIFORNIUM.getFluidStack(144),
+ 128,
+ 196608,
+ 750000000);
+ GT_Values.RA.addFusionReactorRecipe(
+ Materials.Plutonium241.getMolten(144),
+ Materials.Calcium.getPlasma(144),
+ Materials.Flerovium.getMolten(144),
+ 160,
+ 196608,
+ 1000000000);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GlueLine.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GlueLine.java
new file mode 100644
index 0000000000..a954711fd2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_GlueLine.java
@@ -0,0 +1,395 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.GalacticraftCore;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.TecTech;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.chemistry.AgriculturalChem;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.plugin.agrichem.BioRecipes;
+
+public class RecipeLoader_GlueLine {
+
+ public static void generate() {
+ createRecipes();
+ }
+
+ private static void createRecipes() {
+ chemicalPlantRecipes();
+ chemicalReactorRecipes();
+ dehydratorRecipes();
+ distillationTowerRecipes();
+ fluidHeaterRecipes();
+ mixerRecipes();
+
+ glueUsageRecipes();
+ }
+
+ private static void chemicalPlantRecipes() {
+ // CO + C3H6O2 = C4H6O3
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17), ItemUtils.getSimpleStack(GenericChem.mBlueCatalyst, 0) },
+ new FluidStack[] { FluidUtils.getFluidStack("carbonmonoxide", 1000),
+ FluidUtils.getFluidStack("methylacetate", 1000), },
+ new ItemStack[] {},
+ new FluidStack[] { MISC_MATERIALS.ACETIC_ANHYDRIDE.getFluidStack(1000) },
+ 10 * 20,
+ 500,
+ 3);
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(18) },
+ new FluidStack[] { FluidUtils.getFluidStack("aceticacid", 1000), FluidUtils.getFluidStack("chlorine", 1000),
+ MISC_MATERIALS.ACETIC_ANHYDRIDE.getFluidStack(1000) },
+ new ItemStack[] {},
+ new FluidStack[] { MISC_MATERIALS.CHLOROACETIC_MIXTURE.getFluidStack(1000),
+ MISC_MATERIALS.ACETIC_ANHYDRIDE.getFluidStack(950) },
+ 150 * 20,
+ 1000,
+ 4);
+
+ // Na2CO3 + NaCN + C2H3O2Cl + 2HCl = C3H3NO2 + 3NaCl + CO2 + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(19), ItemUtils.getSimpleStack(AgriculturalChem.mSodiumCarbonate, 6),
+ MISC_MATERIALS.SODIUM_CYANIDE.getDust(3) },
+ new FluidStack[] { MISC_MATERIALS.CHLOROACETIC_ACID.getFluidStack(1000),
+ FluidUtils.getFluidStack("hydrochloricacid_gt5u", 2000) },
+ new ItemStack[] { MISC_MATERIALS.CYANOACETIC_ACID.getDust(9), Materials.Salt.getDust(6) },
+ new FluidStack[] { Materials.CarbonDioxide.getGas(1000), GT_ModHandler.getWater(1000) },
+ 20 * 20,
+ 1000,
+ 4);
+
+ // CuSO4 + 5C3H3NO2 + 5C2H6O = CuSO4·5(H2O) + 5C5H7NO2
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(20), ItemUtils.getSimpleStack(GenericChem.mSolidAcidCatalyst, 0),
+ MISC_MATERIALS.COPPER_SULFATE.getDust(6), MISC_MATERIALS.CYANOACETIC_ACID.getDust(45) },
+ new FluidStack[] { Materials.Ethanol.getFluid(5000) },
+ new ItemStack[] { MISC_MATERIALS.COPPER_SULFATE_HYDRATED.getDust(11) },
+ new FluidStack[] { MISC_MATERIALS.ETHYL_CYANOACETATE.getFluidStack(5000) },
+ 500 * 20,
+ 6000,
+ 5);
+
+ // C3H3NO2 + C2H6O = C5H7NO2 + H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(21), MISC_MATERIALS.CYANOACETIC_ACID.getDust(9) },
+ new FluidStack[] { Materials.Ethanol.getFluid(1000) },
+ new ItemStack[] {},
+ new FluidStack[] { MISC_MATERIALS.ETHYL_CYANOACETATE.getFluidStack(1000) },
+ 1000 * 20,
+ 6000,
+ 5);
+
+ BioRecipes.mFormaldehyde = FluidUtils.getFluidStack("fluid.formaldehyde", 1)
+ .getFluid();
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(22), ItemUtils.getSimpleStack(GenericChem.mSolidAcidCatalyst, 0) },
+ new FluidStack[] { MISC_MATERIALS.ETHYL_CYANOACETATE.getFluidStack(100),
+ FluidUtils.getFluidStack(BioRecipes.mFormaldehyde, 100) },
+ new ItemStack[] {},
+ new FluidStack[] { MISC_MATERIALS.CYANOACRYLATE_POLYMER.getFluidStack(100), FluidUtils.getWater(1000) },
+ 10 * 20,
+ 8000,
+ 5);
+
+ // CH4 + NH3 + 3O = HCN + 3H2O
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(23), ItemUtils.getSimpleStack(GenericChem.mPinkCatalyst, 0) },
+ new FluidStack[] { FluidUtils.getFluidStack("methane", 2000), FluidUtils.getFluidStack("ammonia", 2000),
+ FluidUtils.getFluidStack("oxygen", 6000) },
+ new ItemStack[] {},
+ new FluidStack[] { MISC_MATERIALS.HYDROGEN_CYANIDE.getFluidStack(2000), FluidUtils.getWater(6000) },
+ 10 * 20,
+ 500,
+ 3);
+ }
+
+ private static void chemicalReactorRecipes() {
+ // NaOH + HCN = NaCN + H2O
+ GT_Values.RA.addChemicalRecipe(
+ CI.getNumberedCircuit(17),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSodiumHydroxide", 3),
+ MISC_MATERIALS.HYDROGEN_CYANIDE.getFluidStack(1000),
+ FluidUtils.getWater(1000),
+ MISC_MATERIALS.SODIUM_CYANIDE.getDust(3),
+ 10 * 20);
+ // #addChemicalRecipe won't generate LCR recipe if config >= 10
+ GT_Values.RA.addMultiblockChemicalRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(17),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSodiumHydroxide", 3) },
+ new FluidStack[] { MISC_MATERIALS.HYDROGEN_CYANIDE.getFluidStack(1000) },
+ new FluidStack[] { FluidUtils.getWater(1000) },
+ new ItemStack[] { MISC_MATERIALS.SODIUM_CYANIDE.getDust(3) },
+ 10 * 20,
+ 30);
+
+ // CaCO3 + 2HCl = CaCl2 + CO2 + H2O
+ if (BartWorks.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(ModItems.dustCalciumCarbonate, 5),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemUtils.getItemStackFromFQRN("bartworks:gt.bwMetaGenerateddust:63", 3))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(2000L))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+ } else {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemUtils.getSimpleStack(ModItems.dustCalciumCarbonate, 5),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(MISC_MATERIALS.CALCIUM_CHLORIDE.getDust(3))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(2000L))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+ }
+
+ // Cu + 2H2SO4 = CuSO4 + SO2 + 2H2O
+ // SO2 + 2H2O -> diluted sulfuric acid
+ GT_Values.RA.addChemicalRecipe(
+ CI.getNumberedCircuit(19),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCopper", 1),
+ FluidUtils.getFluidStack("sulfuricacid", 2000),
+ FluidUtils.getFluidStack("dilutedsulfuricacid", 1000),
+ MISC_MATERIALS.COPPER_SULFATE.getDust(6),
+ 5 * 20);
+ // #addChemicalRecipe won't generate LCR recipe if config >= 10
+ GT_Values.RA.addMultiblockChemicalRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(19), ItemUtils.getItemStackOfAmountFromOreDict("dustCopper", 1) },
+ new FluidStack[] { FluidUtils.getFluidStack("sulfuricacid", 2000) },
+ new FluidStack[] { FluidUtils.getFluidStack("dilutedsulfuricacid", 1000) },
+ new ItemStack[] { MISC_MATERIALS.COPPER_SULFATE.getDust(6) },
+ 5 * 20,
+ 30);
+ }
+
+ private static void dehydratorRecipes() {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { MISC_MATERIALS.COPPER_SULFATE_HYDRATED.getDust(11), },
+ null,
+ GT_ModHandler.getWater(5000),
+ new ItemStack[] { MISC_MATERIALS.COPPER_SULFATE.getDust(6) },
+ new int[] { 10000, 10000, 10000 },
+ 300 * 20,
+ 10);
+ }
+
+ private static void distillationTowerRecipes() {
+ GT_Values.RA.addDistillationTowerRecipe(
+ MISC_MATERIALS.CHLOROACETIC_MIXTURE.getFluidStack(1000),
+ new FluidStack[] { MISC_MATERIALS.CHLOROACETIC_ACID.getFluidStack(100),
+ MISC_MATERIALS.DICHLOROACETIC_ACID.getFluidStack(450),
+ MISC_MATERIALS.TRICHLOROACETIC_ACID.getFluidStack(450) },
+ null,
+ 4 * 20,
+ MaterialUtils.getVoltageForTier(5));
+ }
+
+ private static void fluidHeaterRecipes() {
+
+ CORE.RA.addFluidHeaterRecipe(
+ CI.getNumberedCircuit(16),
+ MISC_MATERIALS.CYANOACRYLATE_POLYMER.getFluidStack(100),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(100),
+ 30 * 30,
+ 500);
+ }
+
+ private static void mixerRecipes() {
+ GT_Values.RA.addMixerRecipe(
+ CI.getNumberedCircuit(1),
+ MISC_MATERIALS.DICHLOROACETIC_ACID.getCell(1),
+ null,
+ null,
+ MISC_MATERIALS.TRICHLOROACETIC_ACID.getFluidStack(1000),
+ MISC_MATERIALS.CHLOROACETIC_MIXTURE.getFluidStack(2000),
+ CI.emptyCells(1),
+ 100,
+ 100);
+
+ GT_Values.RA.addMixerRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("cellSulfurTrioxide", 1),
+ CI.getNumberedCircuit(2),
+ null,
+ null,
+ FluidUtils.getFluidStack("sulfuricacid", 1000),
+ MISC_MATERIALS.SOLID_ACID_MIXTURE.getFluidStack(1000),
+ CI.emptyCells(1),
+ 100,
+ 40);
+ }
+
+ private static void glueUsageRecipes() {
+ // Braintech Tape recipe, PBI and superglue make 16 tape at once
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Polybenzimidazole, 1L),
+ GT_ModHandler.getIC2Item("carbonMesh", 1L), CI.getNumberedCircuit(10) },
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(100),
+ ItemList.Duct_Tape.get(16L),
+ 120,
+ 30);
+
+ // Maintenance Hatch recipe, using Braintech Tape
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hull_LV.get(1), ItemList.Duct_Tape.get(1), CI.getNumberedCircuit(1) },
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(100),
+ ItemList.Hatch_Maintenance.get(1),
+ 120,
+ 30);
+
+ // Graphene recipes from later wafer tiers, using superglue instead of the bronze age glue
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustGraphite", 64),
+ ItemList.Circuit_Silicon_Wafer4.get(2L), CI.getNumberedCircuit(2) },
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(500),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustGraphene", 64),
+ 400,
+ 30720);
+
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustGraphite", 64),
+ ItemList.Circuit_Silicon_Wafer5.get(1L), CI.getNumberedCircuit(2) },
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(250),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustGraphene", 64),
+ 80,
+ 122880);
+
+ GT_Values.RA.addMixerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4L),
+ GT_Values.NI,
+ GT_Values.NI,
+ GT_Utility.getIntegratedCircuit(1),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(100),
+ null,
+ ItemList.SFMixture.get(32),
+ 1600,
+ 16);
+
+ GT_Values.RA.addMixerRecipe(
+ ItemList.GelledToluene.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Polybenzimidazole, 1L),
+ GT_Values.NI,
+ GT_Values.NI,
+ GT_Utility.getIntegratedCircuit(1),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(100),
+ null,
+ ItemList.SFMixture.get(64),
+ 1600,
+ 16);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.PolyvinylChloride, 8),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 32),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(200),
+ new ItemStack(Items.book, 64, 0),
+ 32,
+ 8);
+
+ if (TecTech.isModLoaded()) {
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedSteel, 18),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(144),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32505", 1),
+ 300,
+ 7680);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.NaquadahAlloy, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Europium, 6),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(288),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32506", 1),
+ 200,
+ 30720);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.ElectrumFlux, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Americium, 18),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(576),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32507", 1),
+ 300,
+ 122880);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt02, Materials.ElectrumFlux, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Naquadah, 24),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(1152),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32561", 1),
+ 100,
+ 491520);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.ElectrumFlux, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahEnriched, 36),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(2304),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32562", 1),
+ 200,
+ 1966080);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt08, Materials.ElectrumFlux, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 48),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(4608),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32563", 1),
+ 300,
+ 1966080);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUHV, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 56),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(9216),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32564", 1),
+ 600,
+ 1966080);
+
+ GT_Values.RA.addAssemblerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUHV, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.DraconiumAwakened, 64),
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(18432),
+ ItemUtils.getItemStackFromFQRN("gregtech:gt.metaitem.01:32565", 1),
+ 1200,
+ 1966080);
+ }
+ if (NewHorizonsCoreMod.isModLoaded() && GalacticraftCore.isModLoaded()) {
+ GT_Values.RA.addAssemblerRecipe(
+ new ItemStack[] { ItemUtils.getItemStackFromFQRN("GalacticraftMars:item.itemBasicAsteroids:7", 1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Titanium, 8),
+ ItemUtils.getItemStackFromFQRN("dreamcraft:item.TungstenString", 8), CI.getNumberedCircuit(1) },
+ MISC_MATERIALS.ETHYL_CYANOACRYLATE.getFluidStack(576),
+ ItemUtils.getItemStackFromFQRN("GalaxySpace:item.ThermalClothT2", 1),
+ 600,
+ 1024);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_LFTR.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_LFTR.java
new file mode 100644
index 0000000000..81fde457ae
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_LFTR.java
@@ -0,0 +1,135 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GasSpargingRecipeMap;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.material.nuclear.NUCLIDE;
+
+public class RecipeLoader_LFTR {
+
+ private static AutoMap<Fluid> mNobleGases;
+ private static AutoMap<Fluid> mFluorideGases;
+ private static AutoMap<Fluid> mSpargeGases;
+
+ private static void configureSparging() {
+ if (mSpargeGases == null) {
+ mSpargeGases = new AutoMap<>();
+ mSpargeGases.add(
+ Materials.Helium.getGas(1)
+ .getFluid());
+ mSpargeGases.add(
+ Materials.Fluorine.getGas(1)
+ .getFluid());
+ }
+ if (mNobleGases == null) {
+ mNobleGases = new AutoMap<>();
+ mNobleGases.add(mSpargeGases.get(0));
+ mNobleGases.add(ELEMENT.getInstance().XENON.getFluid());
+ mNobleGases.add(ELEMENT.getInstance().NEON.getFluid());
+ mNobleGases.add(ELEMENT.getInstance().ARGON.getFluid());
+ mNobleGases.add(ELEMENT.getInstance().KRYPTON.getFluid());
+ mNobleGases.add(ELEMENT.getInstance().RADON.getFluid());
+ }
+ if (mFluorideGases == null) {
+ mFluorideGases = new AutoMap<>();
+ mFluorideGases.add(mSpargeGases.get(1));
+ mFluorideGases.add(FLUORIDES.LITHIUM_FLUORIDE.getFluid());
+ mFluorideGases.add(FLUORIDES.NEPTUNIUM_HEXAFLUORIDE.getFluid());
+ mFluorideGases.add(FLUORIDES.TECHNETIUM_HEXAFLUORIDE.getFluid());
+ mFluorideGases.add(FLUORIDES.SELENIUM_HEXAFLUORIDE.getFluid());
+ mFluorideGases.add(FLUORIDES.THORIUM_TETRAFLUORIDE.getFluid());
+ }
+ }
+
+ public static void generate() {
+ // Fli2BeF4 + Thorium TetraFluoride = Uranium233
+ // 72k Ticks/hr
+ // 1l/4t = 1000l/hr
+ // 1l/40t = 1000l/10hr (Probably better) LiFBeF2ThF4UF4
+ // 1l/20t= 1000l/2.5hr LiFBeF2ZrF4UF4
+ // 1l/10t= 1000l/2.5hr LiFBeF2ZrF4U235
+
+ configureSparging();
+ FluidStack Li2BeF4 = NUCLIDE.Li2BeF4.getFluidStack(200);
+
+ // LiFBeF2ThF4UF4 - T3
+ GTPPRecipeMaps.liquidFluorineThoriumReactorRecipes.addRecipe(
+ false,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] { 10000, 10000, 5000, 2500 },
+ new FluidStack[] { NUCLIDE.LiFBeF2ThF4UF4.getFluidStack(100), Li2BeF4 },
+ new FluidStack[] { NUCLIDE.LiFBeF2UF4FP.getFluidStack(100), NUCLIDE.LiFBeF2ThF4.getFluidStack(200),
+ FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(20), FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(10) },
+ 100 * 20, // time
+ 0, // cost
+ 32768 * 4 // fuel value
+ );
+
+ // LiFBeF2ZrF4UF4 - T2
+ GTPPRecipeMaps.liquidFluorineThoriumReactorRecipes.addRecipe(
+ false,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] { 10000, 10000, 2500, 1250 },
+ new FluidStack[] { NUCLIDE.LiFBeF2ZrF4UF4.getFluidStack(100), Li2BeF4 },
+ new FluidStack[] { NUCLIDE.LiFBeF2UF4FP.getFluidStack(50), NUCLIDE.LiFBeF2ThF4.getFluidStack(100),
+ FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(10), FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(5) },
+ 100 * 20, // time
+ 0, // cost
+ 8192 * 4 // fuel value
+ );
+
+ // LiFBeF2ZrF4U235 - T1
+ GTPPRecipeMaps.liquidFluorineThoriumReactorRecipes.addRecipe(
+ false,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] { 10000, 10000, 1000, 500 },
+ new FluidStack[] { NUCLIDE.LiFBeF2ZrF4U235.getFluidStack(100), Li2BeF4 },
+ new FluidStack[] { NUCLIDE.LiFBeF2UF4FP.getFluidStack(25), NUCLIDE.LiFThF4.getFluidStack(50),
+ FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(4), FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(2) },
+ 100 * 20, // time
+ 0, // cost
+ 8192 // fuel value
+ );
+
+ // Sparging NEI Recipes
+ GasSpargingRecipeMap.addRecipe(
+ new FluidStack(mSpargeGases.get(0), 1000),
+ NUCLIDE.LiFBeF2UF4FP.getFluidStack(50),
+ NUCLIDE.Sparged_LiFBeF2UF4FP.getFluidStack(50),
+ new FluidStack[] { new FluidStack(mNobleGases.get(1), 10), new FluidStack(mNobleGases.get(2), 10),
+ new FluidStack(mNobleGases.get(3), 10), new FluidStack(mNobleGases.get(4), 10),
+ new FluidStack(mNobleGases.get(5), 10) },
+ new int[] { 20000, 20000, 20000, 20000, 20000 });
+
+ GasSpargingRecipeMap.addRecipe(
+ new FluidStack(mSpargeGases.get(1), 100),
+ NUCLIDE.LiFThF4.getFluidStack(50),
+ NUCLIDE.Sparged_LiFThF4.getFluidStack(50),
+ new FluidStack[] { new FluidStack(mFluorideGases.get(1), 5), new FluidStack(mFluorideGases.get(2), 5),
+ new FluidStack(mFluorideGases.get(3), 5), new FluidStack(mFluorideGases.get(4), 5),
+ new FluidStack(mFluorideGases.get(5), 5) },
+ new int[] { 1000, 1000, 1000, 1000, 1000 });
+
+ GasSpargingRecipeMap.addRecipe(
+ new FluidStack(mSpargeGases.get(1), 100),
+ NUCLIDE.LiFBeF2ThF4.getFluidStack(50),
+ NUCLIDE.Sparged_LiFBeF2ThF4.getFluidStack(50),
+ new FluidStack[] { new FluidStack(mFluorideGases.get(1), 10), new FluidStack(mFluorideGases.get(2), 10),
+ new FluidStack(mFluorideGases.get(3), 10), new FluidStack(mFluorideGases.get(4), 10),
+ new FluidStack(mFluorideGases.get(5), 10) },
+ new int[] { 2000, 2000, 2000, 2000, 2000 });
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_MolecularTransformer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_MolecularTransformer.java
new file mode 100644
index 0000000000..cd576dbc8d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_MolecularTransformer.java
@@ -0,0 +1,78 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import static advsolar.utils.MTRecipeManager.transformerRecipes;
+import static gregtech.api.enums.Mods.AdvancedSolarPanel;
+import static gregtech.api.enums.Mods.GalaxySpace;
+
+import advsolar.utils.MTRecipeRecord;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.math.MathUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class RecipeLoader_MolecularTransformer {
+
+ public static void run() {
+
+ for (MTRecipeRecord aRecipe : transformerRecipes) {
+ int aEU = MaterialUtils.getVoltageForTier(5);
+ Logger.INFO("=======================");
+ Logger.INFO("Generating GT recipe for Molecular Transformer.");
+ Logger.INFO(
+ "Input: " + aRecipe.inputStack
+ .getDisplayName() + ", Output: " + aRecipe.outputStack.getDisplayName() + ", EU/t: " + aEU);
+ float aTicks = (float) aRecipe.energyPerOperation / (float) aEU;
+ Logger.INFO("Ticks: " + aTicks);
+ int aTicksRoundedUp = MathUtils.roundToClosestInt(Math.ceil(aTicks));
+ Logger.INFO("Ticks: " + aTicksRoundedUp);
+ Logger.INFO("Total EU equal or greater? " + ((aTicksRoundedUp * aEU) >= aRecipe.energyPerOperation));
+ CORE.RA.addMolecularTransformerRecipe(aRecipe.inputStack, aRecipe.outputStack, aTicksRoundedUp, aEU, 2);
+ Logger.INFO("=======================");
+ }
+
+ transformerRecipes.clear();
+ if (AdvancedSolarPanel.isModLoaded() && GalaxySpace.isModLoaded()) {
+
+ CORE.RA.addMolecularTransformerRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L),
+ GT_ModHandler.getModItem(AdvancedSolarPanel.ID, "asp_crafting_items", 1L, 9),
+ 600,
+ 1920,
+ 2);
+ CORE.RA.addMolecularTransformerRecipe(
+ GT_ModHandler.getModItem(GalaxySpace.ID, "item.GlowstoneDusts", 1L, 0),
+ GT_ModHandler.getModItem(AdvancedSolarPanel.ID, "asp_crafting_items", 1L, 9),
+ 150,
+ 7680,
+ 2);
+ CORE.RA.addMolecularTransformerRecipe(
+ GT_ModHandler.getModItem(GalaxySpace.ID, "item.GlowstoneDusts", 1L, 1),
+ GT_ModHandler.getModItem(AdvancedSolarPanel.ID, "asp_crafting_items", 1L, 9),
+ 38,
+ 30720,
+ 2);
+ CORE.RA.addMolecularTransformerRecipe(
+ GT_ModHandler.getModItem(GalaxySpace.ID, "item.GlowstoneDusts", 1L, 2),
+ GT_ModHandler.getModItem(AdvancedSolarPanel.ID, "asp_crafting_items", 1L, 9),
+ 10,
+ 122880,
+ 2);
+ CORE.RA.addMolecularTransformerRecipe(
+ GT_ModHandler.getModItem(GalaxySpace.ID, "item.GlowstoneDusts", 1L, 3),
+ GT_ModHandler.getModItem(AdvancedSolarPanel.ID, "asp_crafting_items", 1L, 9),
+ 3,
+ 491520,
+ 2);
+ CORE.RA.addMolecularTransformerRecipe(
+ GT_ModHandler.getModItem(GalaxySpace.ID, "item.GlowstoneDusts", 1L, 4),
+ GT_ModHandler.getModItem(AdvancedSolarPanel.ID, "asp_crafting_items", 1L, 9),
+ 1,
+ 1996080,
+ 2);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_Nuclear.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_Nuclear.java
new file mode 100644
index 0000000000..a25ed99dd2
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_Nuclear.java
@@ -0,0 +1,680 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.fusionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.FUSION_THRESHOLD;
+import static gtPlusPlus.api.recipe.GTPPRecipeMaps.chemicalDehydratorRecipes;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.item.chemistry.GenericChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.material.nuclear.NUCLIDE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class RecipeLoader_Nuclear {
+
+ public static void generate() {
+ createRecipes();
+ RecipeLoader_LFTR.generate();
+ RecipeLoader_NuclearFuelProcessing.generate();
+ }
+
+ private static void createRecipes() {
+ autoclave();
+ blastFurnace();
+ centrifugeRecipes();
+ chemicalBathRecipes();
+ chemicalReactorRecipes();
+ dehydratorRecipes();
+ electroMagneticSeperator();
+ fluidExtractorRecipes();
+ fluidHeater();
+ fusionChainRecipes();
+ macerator();
+ mixerRecipes();
+ sifter();
+ }
+
+ private static void autoclave() {
+
+ GT_Values.RA.addAutoclaveRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 9),
+ FluidUtils.getFluidStack("chlorine", 9 * 4 * 144),
+ ItemUtils.getItemStackOfAmountFromOreDict("pelletZirconium", 9),
+ 0,
+ 120 * 20,
+ 30);
+ }
+
+ private static void blastFurnace() {
+
+ GT_Values.RA.addBlastRecipe(
+ FLUORIDES.LITHIUM_FLUORIDE.getDust(2),
+ FLUORIDES.BERYLLIUM_FLUORIDE.getDust(1),
+ GT_Values.NF,
+ GT_Values.NF,
+ NUCLIDE.Li2BeF4.getDust(3),
+ null,
+ 60 * 20,
+ 2000,
+ 3000);
+
+ GT_Values.RA.addBlastRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZrCl4", 1),
+ null,
+ GT_Values.NF,
+ GT_Values.NF,
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCookedZrCl4", 1),
+ null,
+ 60 * 20,
+ 340,
+ 300);
+ }
+
+ private static void centrifugeRecipes() {
+
+ // Process Used Fuel Rods for Krypton
+
+ // Uranium
+ for (ItemStack depletedRod : new ItemStack[] {
+ ItemUtils.getItemStackFromFQRN("IC2:reactorUraniumSimpledepleted", 8),
+ ItemUtils.getItemStackFromFQRN("IC2:reactorUraniumDualdepleted", 4),
+ ItemUtils.getItemStackFromFQRN("IC2:reactorUraniumQuaddepleted", 2) }) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(depletedRod, GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(
+ ItemList.IC2_Fuel_Rod_Empty.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 2L),
+ ELEMENT.getInstance().URANIUM232.getSmallDust(1),
+ ELEMENT.getInstance().URANIUM233.getSmallDust(1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Uranium235, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium, 1L))
+ .outputChances(10000, 10000, 1000, 1000, 1000, 500)
+ .fluidOutputs(FluidUtils.getFluidStack("krypton", 60))
+ .duration(4 * MINUTES + 10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(centrifugeRecipes);
+ }
+
+ // Mox
+ for (ItemStack depletedRod : new ItemStack[] {
+ ItemUtils.getItemStackFromFQRN("IC2:reactorMOXSimpledepleted", 8),
+ ItemUtils.getItemStackFromFQRN("IC2:reactorMOXDualdepleted", 4),
+ ItemUtils.getItemStackFromFQRN("IC2:reactorMOXQuaddepleted", 2) }) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(depletedRod, GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(
+ ItemList.IC2_Fuel_Rod_Empty.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium241, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium, 1L),
+ ELEMENT.getInstance().PLUTONIUM238.getTinyDust(1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium, 1L))
+ .outputChances(10000, 10000, 500, 500, 500, 500)
+ .fluidOutputs(FluidUtils.getFluidStack("krypton", 90))
+ .duration(6 * MINUTES + 15 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(centrifugeRecipes);
+ }
+
+ // Thorium
+ for (ItemStack depletedRod : new ItemStack[] { ItemList.Depleted_Thorium_1.get(8),
+ ItemList.Depleted_Thorium_2.get(4), ItemList.Depleted_Thorium_4.get(2) }) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(depletedRod, GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(
+ ItemList.IC2_Fuel_Rod_Empty.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 2L),
+ ELEMENT.getInstance().THORIUM232.getDust(1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Lutetium, 1L),
+ ELEMENT.getInstance().POLONIUM.getSmallDust(1),
+ ELEMENT.getInstance().THALLIUM.getTinyDust(1))
+ .outputChances(10000, 10000, 5000, 5000, 5000, 2500)
+ .fluidOutputs(FluidUtils.getFluidStack("krypton", 30))
+ .duration(2 * MINUTES + 5 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(centrifugeRecipes);
+ }
+ }
+
+ private static void chemicalBathRecipes() {
+
+ int[] chances = { 9000, 6000, 3000 };
+ GT_Values.RA.addChemicalBathRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTin", 12),
+ FluidUtils.getFluidStack("chlorine", 2400),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 3),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 4),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 5),
+ chances,
+ 30 * 20,
+ 480);
+
+ chances = new int[] { 9000, 3000, 1000 };
+ GT_Values.RA.addChemicalBathRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRutile", 5),
+ FluidUtils.getFluidStack("chlorine", 4000),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 3),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTitanium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustHafnium", 1),
+ chances,
+ 30 * 20,
+ 1024);
+
+ GT_Values.RA.addChemicalBathRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumCarbonate", 10),
+ FluidUtils.getFluidStack("hydrofluoricacid", 10 * 144),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumFluoride", 10),
+ null,
+ null,
+ new int[] {},
+ 90 * 20,
+ 500);
+ }
+
+ private static void chemicalReactorRecipes() {
+
+ ItemStack aGtHydrofluoricAcid = ItemUtils
+ .getItemStackOfAmountFromOreDictNoBroken("cellHydrofluoricAcid_GT5U", 2);
+
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumCarbonate", 5), // Input
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCalciumHydroxide", 5), // Input
+ null, // Fluid Input
+ null, // Fluid Output
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLi2CO3CaOH2", 10),
+ 600 * 20);
+
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumHydroxide", 5), // Input
+ null, // Input Stack 2
+ FluidUtils.getFluidStack("hydrofluoricacid", 5 * 144),
+ FluidUtils.getFluidStack("water", 5 * 144), // Fluid Output
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumFluoride", 5),
+ 600 * 20);
+
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("cellOxygen", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithium7", 16),
+ FluidUtils.getFluidStack("water", 1000),
+ FluidUtils.getFluidStack("lithiumhydroxide", 2000 + 144 * 4),
+ CI.emptyCells(1),
+ 300 * 20);
+
+ // LFTR Fuel Related Compounds
+ // Hydroxide
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getGregtechCircuit(3),
+ ELEMENT.getInstance().OXYGEN.getCell(1),
+ ELEMENT.getInstance().HYDROGEN.getFluidStack(1000),
+ MISC_MATERIALS.HYDROXIDE.getFluidStack(1000),
+ CI.emptyCells(1),
+ GT_Values.NI,
+ 8 * 20,
+ 30);
+ // Beryllium Hydroxide
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getGregtechCircuit(3),
+ ELEMENT.getInstance().BERYLLIUM.getDust(7),
+ MISC_MATERIALS.HYDROXIDE.getFluidStack(1000),
+ FLUORIDES.BERYLLIUM_HYDROXIDE.getFluidStack(2000),
+ GT_Values.NI,
+ 8 * 20,
+ 30);
+ // Ammonium Bifluoride
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getGregtechCircuit(3),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellHydrofluoricAcid", 1),
+ MISC_MATERIALS.AMMONIUM.getFluidStack(1000),
+ FLUORIDES.AMMONIUM_BIFLUORIDE.getFluidStack(2000),
+ CI.emptyCells(1),
+ 20 * 20,
+ 30);
+ if (aGtHydrofluoricAcid != null) {
+ // Ammonium Bifluoride
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getGregtechCircuit(3),
+ aGtHydrofluoricAcid,
+ MISC_MATERIALS.AMMONIUM.getFluidStack(1000),
+ FLUORIDES.AMMONIUM_BIFLUORIDE.getFluidStack(2000),
+ CI.emptyCells(2),
+ 40 * 20,
+ 30);
+ }
+ // Ammonium
+ GT_Values.RA.addChemicalRecipe(
+ ItemUtils.getGregtechCircuit(3),
+ ELEMENT.getInstance().HYDROGEN.getCell(1),
+ MISC_MATERIALS.AMMONIA.getFluidStack(1000),
+ MISC_MATERIALS.AMMONIUM.getFluidStack(2000),
+ CI.emptyCells(1),
+ GT_Values.NI,
+ 20 * 20,
+ 30);
+
+ // Sodium Hydroxide
+ GT_Values.RA.addChemicalRecipe(
+ CI.getNumberedBioCircuit(15),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSodiumHydroxide", 1),
+ FluidUtils.getFluidStack("hydrofluoricacid", 500),
+ FluidUtils.getWater(1000),
+ FLUORIDES.SODIUM_FLUORIDE.getDust(1),
+ 60 * 20);
+
+ if (FluidUtils.doesFluidExist("hydrofluoricacid_gt5u")) {
+ GT_Values.RA.addChemicalRecipe(
+ CI.getNumberedBioCircuit(15),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSodiumHydroxide", 1),
+ FluidUtils.getFluidStack("hydrofluoricacid_gt5u", 1000),
+ FluidUtils.getWater(1000),
+ FLUORIDES.SODIUM_FLUORIDE.getDust(1),
+ 60 * 20);
+ }
+ }
+
+ private static void dehydratorRecipes() {
+
+ // Makes 7-Lithium
+ GT_Values.RA.stdBuilder()
+ .itemInputs(CI.getNumberedAdvancedCircuit(14))
+ .fluidInputs(FluidUtils.getFluidStack("sulfuriclithium", 1440))
+ .itemOutputs(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSulfur", 3),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCopper", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSodium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCarbon", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithium7", 4))
+ .duration(30 * SECONDS)
+ .eut(30)
+ .addTo(chemicalDehydratorRecipes);
+
+ // Makes Lithium Carbonate
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.emptyCells(12), ItemUtils.getItemStackOfAmountFromOreDict("dustLepidolite", 20) }, // Item
+ // input
+ // (Array,
+ // up
+ // to
+ // 2)
+ FluidUtils.getFluidStack("sulfuricacid", 10000),
+ FluidUtils.getFluidStack("sulfuriclithium", 10000),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustPotassium", 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellOxygen", 10),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellFluorine", 2),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumCarbonate", 3), // LithiumCarbonate
+ }, // Output Array of Items - Upto 9,
+ new int[] { 10000, 10000, 10000, 10000, 10000 },
+ 75 * 20, // Time in ticks
+ 1000); // EU
+
+ // Calcium Hydroxide
+ if (ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDict("dustQuicklime", 1))) {
+ // CaO + H2O = Ca(OH)2
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedBioCircuit(20),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustQuicklime", 2) },
+ FluidUtils.getFluidStack("water", 1000),
+ null, // Fluid output (slot 2)
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustCalciumHydroxide", 5) }, // Output
+ new int[] { 10000 },
+ 12 * 20, // Time in ticks
+ 120); // EU
+ } else {
+ Logger.INFO("[dustCalciumHydroxide] FAILED TO LOAD RECIPE");
+ if (!ItemUtils.checkForInvalidItems(ItemUtils.getItemStackOfAmountFromOreDict("dustQuicklime", 1))) {
+ Logger.INFO("Could not find dustQuicklime, cannot make dustCalciumHydroxide.");
+ }
+ }
+
+ // 2 LiOH + CaCO3
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(20),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLi2CO3CaOH2", 5) }, // Item
+ null, // Fluid input (slot 1)
+ null, // Fluid output (slot 2)
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumHydroxide", 2),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCalciumCarbonate", 3) }, // Output
+ new int[] { 10000, 10000 },
+ 120 * 20, // Time in ticks
+ 1000); // EU
+
+ // LiOH Liquid to Dust
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(22) },
+ FluidUtils.getFluidStack("lithiumhydroxide", 144),
+ null,
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumHydroxide", 1) },
+ new int[] { 10000 },
+ 1 * 20, // Time in ticks
+ 64); // EU
+
+ // Zirconium Chloride -> TetraFluoride
+ FluidStack aHydrogenChloride = new FluidStack(GenericChem.HydrochloricAcid, 9000);
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(11),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCookedZrCl4", 9), }, // Item
+ FluidUtils.getFluidStack("hydrofluoricacid", 9 * 144),
+ aHydrogenChloride,
+ new ItemStack[] { FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.getDust(9) },
+ new int[] { 10000 },
+ 120 * 20, // Time in ticks
+ 500); // EU
+
+ // Zirconium Chloride -> TetraFluoride
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(10),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCookedZrCl4", 9) },
+ FluidUtils.getFluidStack("hydrofluoricacid_gt5u", 18 * 144),
+ aHydrogenChloride,
+ new ItemStack[] { FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.getDust(9) },
+ new int[] { 10000 },
+ 240 * 20, // Time in ticks
+ 500); // EU
+
+ // Be(OH)2 + 2 (NH4)HF2 → (NH4)2BeF4 + 2 H2O
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(6), FLUORIDES.AMMONIUM_BIFLUORIDE.getCell(4) },
+ FLUORIDES.BERYLLIUM_HYDROXIDE.getFluidStack(2000), // Fluid input (slot 1)
+ FLUORIDES.AMMONIUM_TETRAFLUOROBERYLLATE.getFluidStack(6000),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("cellWater", 4) },
+ new int[] { 10000 },
+ 32 * 20, // Time in ticks
+ 64); // EU
+
+ // (NH4)2BeF4 → 2 NH3 + 2 HF + BeF2
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(17), CI.emptyCells(5) },
+ FLUORIDES.AMMONIUM_TETRAFLUOROBERYLLATE.getFluidStack(5000),
+ null,
+ new ItemStack[] { MISC_MATERIALS.AMMONIA.getCell(2),
+ ItemUtils.getItemStackOfAmountFromOreDict("cellHydrofluoricAcid", 2),
+ FLUORIDES.BERYLLIUM_FLUORIDE.getCell(1) },
+ new int[] { 10000, 10000, 10000 },
+ 5 * 60 * 20,
+ 120);
+ }
+
+ private static void electroMagneticSeperator() {
+
+ // Zirconium
+ GT_Values.RA.addElectromagneticSeparatorRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedBauxite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustBauxite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallRutile", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("nuggetZirconium", 1),
+ new int[] { 10000, 2500, 4000 },
+ 20 * 20,
+ 24);
+
+ // Zircon
+ GT_Values.RA.addElectromagneticSeparatorRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedMagnetite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustMagnetite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallZircon", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyZircon", 1),
+ new int[] { 10000, 1250, 2500 },
+ 20 * 20,
+ 24);
+ GT_Values.RA.addElectromagneticSeparatorRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedCassiterite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustCassiterite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustSmallZircon", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyZircon", 1),
+ new int[] { 10000, 1250, 2500 },
+ 20 * 20,
+ 24);
+ }
+
+ private static void fluidExtractorRecipes() {
+
+ // FLiBe fuel
+ CORE.RA.addFluidExtractionRecipe(NUCLIDE.Li2BeF4.getDust(1), NUCLIDE.Li2BeF4.getFluidStack(144), 100, 500);
+ // Lithium Fluoride
+ CORE.RA.addFluidExtractionRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLithiumFluoride", 1),
+ FLUORIDES.LITHIUM_FLUORIDE.getFluidStack(144),
+ 100,
+ 500);
+ // LFTR Fuel 1
+ CORE.RA.addFluidExtractionRecipe(
+ NUCLIDE.LiFBeF2ZrF4U235.getDust(1),
+ NUCLIDE.LiFBeF2ZrF4U235.getFluidStack(144),
+ 250,
+ 1000);
+ CORE.RA.addFluidExtractionRecipe(
+ NUCLIDE.LiFBeF2ZrF4UF4.getDust(1),
+ NUCLIDE.LiFBeF2ZrF4UF4.getFluidStack(144),
+ 150,
+ 1500);
+ CORE.RA.addFluidExtractionRecipe(
+ NUCLIDE.LiFBeF2ThF4UF4.getDust(1),
+ NUCLIDE.LiFBeF2ThF4UF4.getFluidStack(144),
+ 150,
+ 2000);
+
+ // ZIRCONIUM_TETRAFLUORIDE
+ CORE.RA.addFluidExtractionRecipe(
+ FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.getDust(1),
+ FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.getFluidStack(144),
+ 200,
+ 512 + 256);
+ }
+
+ private static void fusionChainRecipes() {
+ // Mk1
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Boron.getPlasma(144), Materials.Calcium.getPlasma(16))
+ .fluidOutputs(new FluidStack(ELEMENT.getInstance().NEON.getPlasma(), 1000))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(TierEU.RECIPE_LuV)
+ .metadata(FUSION_THRESHOLD, 100000000)
+ .addTo(fusionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ new FluidStack(ELEMENT.getInstance().NEON.getPlasma(), 144),
+ Materials.Bedrockium.getMolten(144))
+ .fluidOutputs(new FluidStack(ELEMENT.STANDALONE.FORCE.getPlasma(), 1000))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(TierEU.RECIPE_LuV)
+ .metadata(FUSION_THRESHOLD, 100000000)
+ .addTo(fusionRecipes);
+
+ // Mk2
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Niobium.getPlasma(144), Materials.Zinc.getPlasma(144))
+ .fluidOutputs(new FluidStack(ELEMENT.getInstance().KRYPTON.getPlasma(), 144))
+ .duration(32 * TICKS)
+ .eut(TierEU.RECIPE_ZPM)
+ .metadata(FUSION_THRESHOLD, 300000000)
+ .addTo(fusionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ new FluidStack(ELEMENT.getInstance().KRYPTON.getPlasma(), 144),
+ new FluidStack(ELEMENT.STANDALONE.FORCE.getPlasma(), 1000))
+ .fluidOutputs(new FluidStack(ELEMENT.STANDALONE.ASTRAL_TITANIUM.getPlasma(), 1000))
+ .duration(32 * TICKS)
+ .eut(TierEU.RECIPE_ZPM)
+ .metadata(FUSION_THRESHOLD, 300000000)
+ .addTo(fusionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ new FluidStack(ELEMENT.STANDALONE.ASTRAL_TITANIUM.getPlasma(), 144),
+ new FluidStack(ALLOY.TITANSTEEL.getFluid(), 8))
+ .fluidOutputs(new FluidStack(ELEMENT.STANDALONE.RUNITE.getPlasma(), 1000))
+ .duration(32 * TICKS)
+ .eut(TierEU.RECIPE_ZPM)
+ .metadata(FUSION_THRESHOLD, 300000000)
+ .addTo(fusionRecipes);
+
+ // Mk3
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(ELEMENT.getInstance().CURIUM.getFluidStack(144), Materials.Americium.getPlasma(144))
+ .fluidOutputs(new FluidStack(ELEMENT.getInstance().XENON.getPlasma(), 144))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_UV)
+ .metadata(FUSION_THRESHOLD, 500000000)
+ .addTo(fusionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ new FluidStack(ELEMENT.getInstance().XENON.getPlasma(), 144),
+ new FluidStack(ELEMENT.STANDALONE.RUNITE.getPlasma(), 1000))
+ .fluidOutputs(new FluidStack(ELEMENT.STANDALONE.ADVANCED_NITINOL.getPlasma(), 1000))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_UV)
+ .metadata(FUSION_THRESHOLD, 500000000)
+ .addTo(fusionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(
+ new FluidStack(ELEMENT.STANDALONE.ADVANCED_NITINOL.getPlasma(), 144),
+ Materials.Tartarite.getMolten(2))
+ .fluidOutputs(new FluidStack(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getPlasma(), 1000))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_UV)
+ .metadata(FUSION_THRESHOLD, 500000000)
+ .addTo(fusionRecipes);
+ }
+
+ private static void macerator() {
+
+ GT_ModHandler.addPulverisationRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("pelletZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZrCl4", 1));
+ }
+
+ private static void mixerRecipes() {
+
+ GT_Values.RA.addMixerRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustUranium233", 4),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustUranium235", 1),
+ null,
+ null,
+ FluidUtils.getFluidStack("hydrofluoricacid", 5000),
+ FLUORIDES.URANIUM_TETRAFLUORIDE.getFluidStack(5000),
+ null,
+ 3000,
+ 500);
+ }
+
+ private static void sifter() {
+
+ // Zirconium
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedIlmenite", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustIron", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustWroughtIron", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustHafnium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustHafnium", 1) },
+ new int[] { 5000, 278, 1000, 1000, 300, 300 },
+ 20 * 30,
+ 500);
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedTin", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustTin", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZinc", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1) },
+ new int[] { 10000, 556, 1500, 1000, 500, 500 },
+ 20 * 30,
+ 500);
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedCassiterite", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustCassiterite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTin", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustZirconium", 1) },
+ new int[] { 10000, 556, 1500, 1000, 500, 500 },
+ 20 * 30,
+ 500);
+
+ // Radium
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedThorium", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustThorium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLead", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1) },
+ new int[] { 10000, 500, 300, 200, 100, 100 },
+ 20 * 30,
+ 500);
+
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedUranium", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustUranium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLead", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1) },
+ new int[] { 10000, 556, 1000, 500, 500, 500 },
+ 20 * 30,
+ 500);
+
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedUraninite", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustUraninite", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustUranium", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1) },
+ new int[] { 10000, 556, 500, 250, 250, 250 },
+ 20 * 30,
+ 500);
+
+ GT_Values.RA.addSifterRecipe(
+ ItemUtils.getItemStackOfAmountFromOreDict("crushedPurifiedPitchblende", 1),
+ new ItemStack[] { ItemUtils.getItemStackOfAmountFromOreDict("dustPitchblende", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustLead", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustRadium226", 1) },
+ new int[] { 10000, 556, 500, 250, 250, 250 },
+ 20 * 30,
+ 500);
+ }
+
+ private static void fluidHeater() {
+
+ CORE.RA.addFluidHeaterRecipe(
+ FLUORIDES.SODIUM_FLUORIDE.getDust(1),
+ null,
+ FLUORIDES.SODIUM_FLUORIDE.getFluidStack(144),
+ 20 * 30,
+ 500);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_NuclearFuelProcessing.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_NuclearFuelProcessing.java
new file mode 100644
index 0000000000..dec6fd426a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_NuclearFuelProcessing.java
@@ -0,0 +1,258 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.recipe.RecipeMaps.distillationTowerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TierEU;
+import gtPlusPlus.core.item.chemistry.NuclearChem;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.nuclear.FLUORIDES;
+import gtPlusPlus.core.material.nuclear.NUCLIDE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+
+public class RecipeLoader_NuclearFuelProcessing {
+
+ public static void generate() {
+
+ // Create Fuels
+
+ final FluidStack aLithiumFluoride = FLUORIDES.LITHIUM_FLUORIDE.getFluidStack(100);
+ final FluidStack aBerylliumFluoride = FLUORIDES.BERYLLIUM_FLUORIDE.getFluidStack(100);
+ final FluidStack aThoriumFluoride = FLUORIDES.THORIUM_TETRAFLUORIDE.getFluidStack(100);
+ final FluidStack aZirconiumFluoride = FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.getFluidStack(100);
+ final FluidStack aUraniumTetraFluoride = FLUORIDES.URANIUM_TETRAFLUORIDE.getFluidStack(100);
+ final FluidStack aUranium235 = ELEMENT.getInstance().URANIUM235.getFluidStack(1000);
+ final FluidStack aLiFBeF2ZrF4U235 = NUCLIDE.LiFBeF2ZrF4U235.getFluidStack(100);
+ final FluidStack aLiFBeF2ZrF4UF4 = NUCLIDE.LiFBeF2ZrF4UF4.getFluidStack(100);
+ final FluidStack aLiFBeF2ThF4UF4 = NUCLIDE.LiFBeF2ThF4UF4.getFluidStack(100);
+
+ // 7LiF - BeF2 - ZrF4 - U235 - 590C
+ CORE.RA.addFissionFuel(
+ FluidUtils.getFluidStack(aLithiumFluoride, 550),
+ FluidUtils.getFluidStack(aBerylliumFluoride, 150),
+ FluidUtils.getFluidStack(aZirconiumFluoride, 60),
+ FluidUtils.getFluidStack(aUranium235, 240),
+ null,
+ null,
+ null,
+ null,
+ null, // Extra 5 inputs
+ FluidUtils.getFluidStack(aLiFBeF2ZrF4U235, 1000),
+ null,
+ 30 * 60 * 20, // Duration
+ MaterialUtils.getVoltageForTier(4));
+
+ // 7LiF - BeF2 - ZrF4 - UF4 - 650C
+ CORE.RA.addFissionFuel(
+ FluidUtils.getFluidStack(aLithiumFluoride, 600),
+ FluidUtils.getFluidStack(aBerylliumFluoride, 250),
+ FluidUtils.getFluidStack(aZirconiumFluoride, 80),
+ FluidUtils.getFluidStack(aUraniumTetraFluoride, 70),
+ null,
+ null,
+ null,
+ null,
+ null, // Extra 5 inputs
+ FluidUtils.getFluidStack(aLiFBeF2ZrF4UF4, 1000),
+ null,
+ 40 * 60 * 20,
+ MaterialUtils.getVoltageForTier(5));
+
+ // 7liF - BeF2 - ThF4 - UF4 - 566C
+ CORE.RA.addFissionFuel(
+ FluidUtils.getFluidStack(aLithiumFluoride, 580),
+ FluidUtils.getFluidStack(aBerylliumFluoride, 270),
+ FluidUtils.getFluidStack(aThoriumFluoride, 80),
+ FluidUtils.getFluidStack(aUraniumTetraFluoride, 70),
+ null,
+ null,
+ null,
+ null,
+ null, // Extra 5 inputs
+ FluidUtils.getFluidStack(aLiFBeF2ThF4UF4, 1000),
+ null,
+ 50 * 60 * 20, // Duration
+ MaterialUtils.getVoltageForTier(5));
+
+ // Reprocess Fuels
+
+ // Reactor Blanket step 1 - Fluorination
+ CORE.RA.addReactorProcessingUnitRecipe(
+ CI.getNumberedAdvancedCircuit(17),
+ ELEMENT.getInstance().FLUORINE.getCell(6),
+ NUCLIDE.LiFThF4.getFluidStack(10000),
+ new ItemStack[] { CI.emptyCells(5), FLUORIDES.LITHIUM_FLUORIDE.getCell(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1) },
+ new int[] { 10000, 10000, 500, 500, 500, 250, 250, 250 },
+ NUCLIDE.UF6F2.getFluidStack(1500),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(5));
+ CORE.RA.addReactorProcessingUnitRecipe(
+ CI.getNumberedAdvancedCircuit(18),
+ ELEMENT.getInstance().FLUORINE.getCell(6),
+ NUCLIDE.LiFBeF2ThF4.getFluidStack(10000),
+ new ItemStack[] { CI.emptyCells(4), FLUORIDES.LITHIUM_FLUORIDE.getCell(1),
+ FLUORIDES.BERYLLIUM_FLUORIDE.getCell(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1) },
+ new int[] { 10000, 10000, 10000, 1000, 1000, 1000, 500, 500, 500 },
+ NUCLIDE.UF6F2.getFluidStack(3000),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Reactor Blanket step 1 - Fluorination
+ CORE.RA.addReactorProcessingUnitRecipe(
+ CI.getNumberedAdvancedCircuit(7),
+ ELEMENT.getInstance().FLUORINE.getCell(6),
+ NUCLIDE.Sparged_LiFThF4.getFluidStack(10000),
+ new ItemStack[] { CI.emptyCells(4), FLUORIDES.LITHIUM_FLUORIDE.getCell(2),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1) },
+ new int[] { 10000, 10000, 1000, 1000, 1000, 1000, 1000, 1000 },
+ NUCLIDE.UF6F2.getFluidStack(3000),
+ 20 * 60 * 5,
+ MaterialUtils.getVoltageForTier(5));
+ CORE.RA.addReactorProcessingUnitRecipe(
+ CI.getNumberedAdvancedCircuit(8),
+ ELEMENT.getInstance().FLUORINE.getCell(6),
+ NUCLIDE.Sparged_LiFBeF2ThF4.getFluidStack(10000),
+ new ItemStack[] { CI.emptyCells(2), FLUORIDES.LITHIUM_FLUORIDE.getCell(2),
+ FLUORIDES.BERYLLIUM_FLUORIDE.getCell(2), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1), ELEMENT.getInstance().PROTACTINIUM.getDust(1),
+ ELEMENT.getInstance().PROTACTINIUM.getDust(1) },
+ new int[] { 10000, 10000, 10000, 2000, 2000, 2000, 2000, 2000, 2000 },
+ NUCLIDE.UF6F2.getFluidStack(6000),
+ 20 * 60 * 5,
+ MaterialUtils.getVoltageForTier(5));
+
+ // Reactor Blanket step 2 - Sorption + Cold Trap
+ CORE.RA.addColdTrapRecipe(
+ 8,
+ FLUORIDES.SODIUM_FLUORIDE.getCell(4),
+ NUCLIDE.UF6F2.getFluidStack(3000),
+ new ItemStack[] { ELEMENT.getInstance().FLUORINE.getCell(2), FLUORIDES.URANIUM_HEXAFLUORIDE.getCell(2),
+ ELEMENT.getInstance().URANIUM233.getDust(1), ELEMENT.getInstance().URANIUM233.getDust(1),
+ ELEMENT.getInstance().URANIUM233.getDust(1) },
+ new int[] { 10000, 10000, 3000, 2000, 1000 },
+ FLUORIDES.SODIUM_FLUORIDE.getFluidStack(2000),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(3));
+
+ // LiBeF2UF4FP + F2 = LiFBeF2 & UF6F2FP
+ // Reactor Core step 1 - Process Burnt Salt
+ CORE.RA.addReactorProcessingUnitRecipe(
+ CI.getNumberedAdvancedCircuit(1),
+ ELEMENT.getInstance().FLUORINE.getCell(1),
+ NUCLIDE.LiFBeF2UF4FP.getFluidStack(1000),
+ new ItemStack[] { NUCLIDE.UF6F2FP.getCell(1) },
+ new int[] { 10000 },
+ FluidUtils.getFluidStack(NuclearChem.Impure_LiFBeF2, 1000),
+ 20 * 60 * 120,
+ MaterialUtils.getVoltageForTier(3));
+
+ // LiBeF2UF4FP + F2 = LiFBeF2 & UF6F2FP
+ // Reactor Core step 1 - Process Burnt Salt
+ CORE.RA.addReactorProcessingUnitRecipe(
+ CI.getNumberedAdvancedCircuit(1),
+ ELEMENT.getInstance().FLUORINE.getCell(3),
+ NUCLIDE.Sparged_LiFBeF2UF4FP.getFluidStack(1000),
+ new ItemStack[] { CI.emptyCells(1), NUCLIDE.UF6F2FP.getCell(2) },
+ new int[] { 10000 },
+ FluidUtils.getFluidStack(NuclearChem.Impure_LiFBeF2, 2000),
+ 20 * 60 * 60,
+ MaterialUtils.getVoltageForTier(3));
+
+ // Reactor Core step 2A - Sorption + Cold Trap
+ CORE.RA.addColdTrapRecipe(
+ 8,
+ FLUORIDES.SODIUM_FLUORIDE.getCell(3),
+ NUCLIDE.UF6F2FP.getFluidStack(2000),
+ new ItemStack[] { ELEMENT.getInstance().FLUORINE.getCell(1), FLUORIDES.URANIUM_HEXAFLUORIDE.getCell(2),
+ ELEMENT.getInstance().PHOSPHORUS.getDust(1), ELEMENT.getInstance().PHOSPHORUS.getDust(1),
+ ELEMENT.getInstance().PHOSPHORUS.getDust(1), ELEMENT.getInstance().PHOSPHORUS.getDust(1),
+ ELEMENT.getInstance().PHOSPHORUS.getDust(1), ELEMENT.getInstance().PHOSPHORUS.getDust(1) },
+ new int[] { 10000, 10000, 5000, 5000, 5000, 5000, 5000, 5000 },
+ FLUORIDES.SODIUM_FLUORIDE.getFluidStack(2000),
+ 20 * 60 * 10,
+ MaterialUtils.getVoltageForTier(4));
+
+ // Reactor Core step 2B - Distillation
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(FluidUtils.getFluidStack(NuclearChem.Impure_LiFBeF2, 1000))
+ .fluidOutputs(NUCLIDE.LiFBeF2.getFluidStack(250))
+ .duration(7 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(distillationTowerRecipes);
+
+ // UF6 -> UF4 reduction
+ // UF6 + LiFBeF2 + H2 -> LiFBeF2UF4 + HF
+ GT_Values.RA.stdBuilder()
+ .itemInputs(FLUORIDES.URANIUM_HEXAFLUORIDE.getCell(1), NUCLIDE.LiFBeF2.getCell(1))
+ .fluidInputs(Materials.Hydrogen.getGas(2000L))
+ .itemOutputs(ItemUtils.getItemStackOfAmountFromOreDict("cellHydrofluoricAcid", 2))
+ .fluidOutputs(NUCLIDE.LiFBeF2UF4.getFluidStack(3000))
+ .duration(2 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .metadata(COIL_HEAT, 5400)
+ .addTo(blastFurnaceRecipes);
+ // Alternative recipe to the above, for chemplant, to not use cells
+
+ CORE.RA.addChemicalPlantRecipe(
+ new ItemStack[] {},
+ new FluidStack[] { FLUORIDES.URANIUM_HEXAFLUORIDE.getFluidStack(1000), NUCLIDE.LiFBeF2.getFluidStack(1000),
+ ELEMENT.getInstance().HYDROGEN.getFluidStack(2000) },
+ new ItemStack[] {},
+ new FluidStack[] { NUCLIDE.LiFBeF2UF4.getFluidStack(3000),
+ FluidUtils.getFluidStack("hydrofluoricacid", 2000) },
+ 300 * 10,
+ MaterialUtils.getVoltageForTier(5),
+ 4);
+
+ CORE.RA.addFissionFuel(
+ FLUORIDES.ZIRCONIUM_TETRAFLUORIDE.getFluidStack(100),
+ NUCLIDE.LiFBeF2UF4.getFluidStack(900),
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ NUCLIDE.LiFBeF2ZrF4UF4.getFluidStack(1000),
+ null,
+ 20 * 60 * 12, // Duration
+ MaterialUtils.getVoltageForTier(5));
+
+ CORE.RA.addFissionFuel(
+ FLUORIDES.THORIUM_TETRAFLUORIDE.getFluidStack(100),
+ NUCLIDE.LiFBeF2UF4.getFluidStack(900),
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ NUCLIDE.LiFBeF2ThF4UF4.getFluidStack(1000),
+ null,
+ 20 * 60 * 15, // Duration
+ MaterialUtils.getVoltageForTier(5));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_TreeFarm.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_TreeFarm.java
new file mode 100644
index 0000000000..28c8b2a337
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/loaders/recipe/RecipeLoader_TreeFarm.java
@@ -0,0 +1,719 @@
+package gtPlusPlus.xmod.gregtech.loaders.recipe;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import binnie.extratrees.genetics.ExtraTreeSpecies;
+import forestry.api.arboriculture.EnumGermlingType;
+import forestry.api.arboriculture.EnumWoodType;
+import forestry.api.arboriculture.ITree;
+import forestry.api.arboriculture.TreeManager;
+import forestry.arboriculture.genetics.TreeDefinition;
+import forestry.plugins.PluginArboriculture;
+import gregtech.api.enums.Mods;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntityTreeFarm;
+
+public class RecipeLoader_TreeFarm {
+
+ public static void generateRecipes() {
+ generateVanillaTrees();
+
+ if (Mods.IndustrialCraft2.isModLoaded()) generateIC2Trees();
+ if (Mods.TinkerConstruct.isModLoaded()) generateTinkersTrees();
+ if (Mods.GTPlusPlus.isModLoaded()) generateGTPPTrees();
+
+ if (Mods.TwilightForest.isModLoaded()) generateTwilightForestTrees();
+ if (Mods.GalaxySpace.isModLoaded()) generateGalaxySpaceTrees();
+ if (Mods.GalacticraftAmunRa.isModLoaded()) generateAmunRaTrees();
+
+ if (Mods.Thaumcraft.isModLoaded()) generateThaumcraftTrees();
+ if (Mods.ThaumicBases.isModLoaded()) generateThaumicBasesTrees();
+ if (Mods.TaintedMagic.isModLoaded()) generateTaintedMagicTrees();
+ if (Mods.ForbiddenMagic.isModLoaded()) generateForbiddenMagicTrees();
+ if (Mods.Witchery.isModLoaded()) generateWitcheryTrees();
+
+ if (Mods.Natura.isModLoaded()) generateNaturaTrees();
+ if (Mods.BiomesOPlenty.isModLoaded()) generateBOPTrees();
+ if (Mods.PamsHarvestCraft.isModLoaded()) generatePamsTrees();
+ if (Mods.PamsHarvestTheNether.isModLoaded()) generatePamsNetherTrees();
+
+ if (Mods.Forestry.isModLoaded()) generateForestryTrees();
+ if (Mods.ExtraTrees.isModLoaded()) generateExtraTreesTrees();
+ }
+
+ private static void generateVanillaTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Oak
+ new ItemStack(Blocks.sapling, 1, 0),
+ new ItemStack(Blocks.log, 1, 0),
+ new ItemStack(Blocks.leaves, 1, 0),
+ new ItemStack(Items.apple, 1, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Spruce
+ new ItemStack(Blocks.sapling, 1, 1),
+ new ItemStack(Blocks.log, 2, 1),
+ new ItemStack(Blocks.leaves, 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Birch
+ new ItemStack(Blocks.sapling, 1, 2),
+ new ItemStack(Blocks.log, 1, 2),
+ new ItemStack(Blocks.leaves, 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Jungle
+ new ItemStack(Blocks.sapling, 1, 3),
+ new ItemStack(Blocks.log, 2, 3),
+ new ItemStack(Blocks.leaves, 1, 3),
+ new ItemStack(Items.dye, 1, 3));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Acacia
+ new ItemStack(Blocks.sapling, 1, 4),
+ new ItemStack(Blocks.log2, 1, 0),
+ new ItemStack(Blocks.leaves2, 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Dark Oak
+ new ItemStack(Blocks.sapling, 1, 5),
+ new ItemStack(Blocks.log2, 1, 1),
+ new ItemStack(Blocks.leaves2, 1, 1),
+ new ItemStack(Items.apple, 1, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Brown Mushroom
+ new ItemStack(Blocks.brown_mushroom, 1, 0),
+ new ItemStack(Blocks.brown_mushroom_block, 1, 0),
+ null,
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Red Mushroom
+ new ItemStack(Blocks.red_mushroom, 1, 0),
+ new ItemStack(Blocks.red_mushroom_block, 1, 0),
+ null,
+ null);
+ }
+
+ private static void generateIC2Trees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Rubber Tree
+ GT_ModHandler.getModItem(Mods.IndustrialCraft2.ID, "blockRubSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.IndustrialCraft2.ID, "blockRubWood", 1, 0),
+ GT_ModHandler.getModItem(Mods.IndustrialCraft2.ID, "blockRubLeaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.IndustrialCraft2.ID, "itemHarz", 1, 0));
+ }
+
+ private static void generateTinkersTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Slimy
+ GT_ModHandler.getModItem(Mods.TinkerConstruct.ID, "slime.sapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.TinkerConstruct.ID, "slime.gel", 1, 1),
+ GT_ModHandler.getModItem(Mods.TinkerConstruct.ID, "slime.leaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.TinkerConstruct.ID, "strangeFood", 1, 0));
+ }
+
+ private static void generateGTPPTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Rainforest Oak
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "blockRainforestOakSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "blockRainforestOakLog", 3, 0),
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "blockRainforestOakLeaves", 1, 0),
+ new ItemStack(Items.apple, 1, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Pine
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "blockPineSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "blockPineLogLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "blockPineLeaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.GTPlusPlus.ID, "item.BasicAgrichemItem", 1, 24));
+ }
+
+ private static void generateTwilightForestTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Sickly Twilight Oak
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Canopy Tree
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 1),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLog", 1, 1),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Twilight Mangrove
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 2),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLog", 1, 2),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Darkwood
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 3),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLog", 1, 3),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.DarkLeaves", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Robust Twilight Oak
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 4),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLog", 4, 0),
+ // Does not drop more robust saplings normally:
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Tree of Time
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 5),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFMagicLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFMagicLeaves", 1, 0),
+ // No I am not making this drop clocks.
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Tree of Transformation
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 6),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFMagicLog", 1, 1),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFMagicLeaves", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Sorting Tree
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 8),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFMagicLog", 1, 3),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFMagicLeaves", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Rainbow Oak
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFSapling", 1, 9),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Thorns
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFThorns", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFThorns", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFThorns", 1, 1),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves3", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFThornRose", 1, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Magic Beans
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "item.magicBeans", 1, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.HugeStalk", 5, 0),
+ GT_ModHandler.getModItem(Mods.TwilightForest.ID, "tile.TFLeaves3", 1, 1),
+ null);
+ }
+
+ private static void generateGalaxySpaceTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Barnarda C
+ GT_ModHandler.getModItem(Mods.GalaxySpace.ID, "barnardaCsapling", 1, 1),
+ GT_ModHandler.getModItem(Mods.GalaxySpace.ID, "barnardaClog", 1, 0),
+ GT_ModHandler.getModItem(Mods.GalaxySpace.ID, "barnardaCleaves", 1, 0),
+ null);
+ }
+
+ private static void generateAmunRaTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Virilig
+ GT_ModHandler.getModItem(Mods.GalacticraftAmunRa.ID, "tile.saplings", 1, 0),
+ GT_ModHandler.getModItem(Mods.GalacticraftAmunRa.ID, "tile.log1", 1, 0),
+ GT_ModHandler.getModItem(Mods.GalacticraftAmunRa.ID, "tile.null", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Lumipod
+ GT_ModHandler.getModItem(Mods.GalacticraftAmunRa.ID, "tile.saplings", 1, 1),
+ GT_ModHandler.getModItem(Mods.GalacticraftAmunRa.ID, "tile.wood1", 1, 0),
+ null,
+ GT_ModHandler.getModItem(Mods.GalacticraftAmunRa.ID, "tile.wood1", 1, 1));
+ }
+
+ private static void generateNaturaTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Redwood
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "redwood", 5, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 2, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleaves", 2, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "redwood", 2, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Eucalyptus
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "tree", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleaves", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Hopseed
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 2),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "tree", 1, 3),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleaves", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Sakura
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 3),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "tree", 1, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleavesnocolor", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Ghostwood
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 4),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "tree", 1, 2),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleavesnocolor", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Blood
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 5),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "bloodwood", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleavesnocolor", 1, 2),
+ new ItemStack(Items.redstone, 1, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Darkwood
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 6),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Dark Tree", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Dark Leaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Natura.netherfood", 1, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Fusewood
+ GT_ModHandler.getModItem(Mods.Natura.ID, "florasapling", 1, 7),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Dark Tree", 1, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Dark Leaves", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Maple
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Sapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Tree", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Leaves", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Silverbell
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Sapling", 1, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Tree", 1, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Leaves", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Amaranth
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Sapling", 1, 2),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Tree", 1, 2),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Leaves", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Tigerwood
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Sapling", 1, 3),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Tree", 1, 3),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Leaves", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Willow
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Rare Sapling", 1, 4),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "willow", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "floraleavesnocolor", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Green Glowshroom
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Glowshroom", 1, 0),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "greenGlowshroom", 1, 0),
+ null,
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Purple Glowshroom
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Glowshroom", 1, 1),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "purpleGlowshroom", 1, 0),
+ null,
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Blue Glowshroom
+ GT_ModHandler.getModItem(Mods.Natura.ID, "Glowshroom", 1, 2),
+ GT_ModHandler.getModItem(Mods.Natura.ID, "blueGlowshroom", 1, 0),
+ null,
+ null);
+ }
+
+ private static void generateBOPTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Apple
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 0),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "appleLeaves", 1, 0),
+ new ItemStack(Items.apple, 2, 0));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Yellow Autumn
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 1),
+ new ItemStack(Blocks.log, 1, 2),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves1", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "food", 1, 8));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Bamboo
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 2),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "bamboo", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves1", 1, 9),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Magic
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs2", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves1", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Dark
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 4),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs1", 1, 2),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves1", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Dying
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 5),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves2", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "food", 1, 8));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Fir
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 6),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs1", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves2", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "misc", 1, 13));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Ethereal
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 7),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs2", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves2", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Orange Autumn
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 8),
+ new ItemStack(Blocks.log2, 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves2", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Origin
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 9),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves3", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "food", 1, 8));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Pink Cherry
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 10),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs1", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves3", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Maple
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 11),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves3", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // White Cherry
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 12),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs1", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves3", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Hellbark
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 13),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs4", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves4", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "food", 1, 8));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Jacaranda
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 14),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs4", 1, 2),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "leaves4", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Persimmon
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "saplings", 1, 15),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "persimmonLeaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "food", 2, 8));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Sacred Oak
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs1", 4, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 2, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves1", 2, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Mangrove
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs2", 1, 2),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves1", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Palm
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 2),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs2", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves1", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Redwood
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs3", 2, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves1", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Willow
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 4),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs3", 1, 1),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves2", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Pine
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 5),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs4", 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves2", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Mahogany
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 6),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs4", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves2", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Flowering Oak
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedSaplings", 1, 7),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "colorizedLeaves2", 1, 3),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Red Flower Stem
+ new ItemStack(Blocks.red_flower, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs3", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "petals", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Yellow Flower Stem
+ new ItemStack(Blocks.yellow_flower, 1, 0),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "logs3", 1, 3),
+ GT_ModHandler.getModItem(Mods.BiomesOPlenty.ID, "petals", 1, 1),
+ null);
+ }
+
+ private static void addPamTree(String name, int meta) {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts(
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pam" + name + "Sapling", 1, 0),
+ new ItemStack(Blocks.log, 1, meta),
+ new ItemStack(Blocks.leaves, 1, meta),
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, name + "Item", 2, 0));
+ }
+
+ private static void generatePamsTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Cinnamon
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pamappleSapling", 1, 0),
+ new ItemStack(Blocks.log, 1, 0),
+ new ItemStack(Blocks.leaves, 1, 0),
+ new ItemStack(Items.apple, 2, 0));
+
+ addPamTree("almond", 3);
+ addPamTree("apricot", 3);
+ addPamTree("avocado", 0);
+ addPamTree("banana", 3);
+ addPamTree("cashew", 3);
+ addPamTree("cherry", 0);
+ addPamTree("chestnut", 0);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Cinnamon
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pamcinnamonSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pamCinnamon", 1, 0),
+ new ItemStack(Blocks.leaves, 1, 3),
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "cinnamonItem", 2, 0));
+
+ addPamTree("coconut", 3);
+ addPamTree("date", 3);
+ addPamTree("dragonfruit", 3);
+ addPamTree("durian", 3);
+ addPamTree("fig", 3);
+ addPamTree("grapefruit", 3);
+ addPamTree("lemon", 3);
+ addPamTree("lime", 3);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Maple
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pammapleSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pamMaple", 1, 0),
+ new ItemStack(Blocks.leaves, 1, 1),
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "maplesyrupItem", 2, 0));
+
+ addPamTree("mango", 3);
+ addPamTree("nutmeg", 0);
+ addPamTree("olive", 0);
+ addPamTree("orange", 3);
+ addPamTree("papaya", 3);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Paperbark
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pampaperbarkSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.PamsHarvestCraft.ID, "pamPaperbark", 1, 0),
+ new ItemStack(Blocks.leaves, 1, 3),
+ new ItemStack(Items.paper, 1, 0));
+
+ addPamTree("peach", 3);
+ addPamTree("pear", 0);
+ addPamTree("pecan", 3);
+ addPamTree("peppercorn", 3);
+ addPamTree("persimmon", 3);
+ addPamTree("pistachio", 3);
+ addPamTree("plum", 0);
+ addPamTree("pomegranate", 3);
+ addPamTree("starfruit", 3);
+ addPamTree("vanillabean", 3);
+ addPamTree("walnut", 0);
+ addPamTree("gooseberry", 0);
+ }
+
+ private static void generatePamsNetherTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Ignis Fruit
+ GT_ModHandler.getModItem(Mods.PamsHarvestTheNether.ID, "netherSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.PamsHarvestTheNether.ID, "netherLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.PamsHarvestTheNether.ID, "netherLeaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.PamsHarvestTheNether.ID, "ignisfruitItem", 2, 0));
+ }
+
+ private static void generateThaumcraftTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Greatwood
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockCustomPlant", 1, 0),
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockMagicalLog", 2, 0),
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockMagicalLeaves", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Silverwood
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockCustomPlant", 1, 1),
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockMagicalLog", 1, 1),
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockMagicalLeaves", 1, 1),
+ null);
+ }
+
+ private static void generateThaumicBasesTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Golden Oak
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "goldenOakSapling", 1, 0),
+ new ItemStack(Blocks.log, 1, 0),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLeaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.Thaumcraft.ID, "blockMagicalLeaves", 1, 0),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Peaceful
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "goldenOakSapling", 1, 1),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLogs", 1, 0),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLeaves", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Nether
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "goldenOakSapling", 1, 2),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLogs", 1, 1),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLeaves", 1, 2),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Ender
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "goldenOakSapling", 1, 3),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLogs", 1, 2),
+ GT_ModHandler.getModItem(Mods.ThaumicBases.ID, "genLeaves", 1, 3),
+ null);
+ }
+
+ private static void generateTaintedMagicTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Warpwood
+ GT_ModHandler.getModItem(Mods.TaintedMagic.ID, "BlockWarpwoodSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.TaintedMagic.ID, "BlockWarpwoodLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.TaintedMagic.ID, "BlockWarpwoodLeaves", 1, 0),
+ null);
+ }
+
+ private static void generateForbiddenMagicTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Warpwood
+ GT_ModHandler.getModItem(Mods.ForbiddenMagic.ID, "TaintSapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.ForbiddenMagic.ID, "TaintLog", 1, 0),
+ GT_ModHandler.getModItem(Mods.ForbiddenMagic.ID, "TaintLeaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.ForbiddenMagic.ID, "TaintFruit", 1, 0));
+ }
+
+ private static void generateWitcheryTrees() {
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Rowan
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchsapling", 1, 0),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchlog", 1, 0),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchleaves", 1, 0),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "ingredient", 1, 63));
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Alder
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchsapling", 1, 1),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchlog", 1, 1),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchleaves", 1, 1),
+ null);
+
+ GregtechMetaTileEntityTreeFarm.registerTreeProducts( // Hawthorn
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchsapling", 1, 2),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchlog", 1, 2),
+ GT_ModHandler.getModItem(Mods.Witchery.ID, "witchleaves", 1, 2),
+ null);
+ }
+
+ /*
+ * Abdiel Kavash: I do not claim the code in the following two methods to be ideal, or to even completely understand
+ * all the details. Much of it has been copied from the previous version, available at
+ * https://github.com/GTNewHorizons/GTplusplus/blob/dca836fee368878cf64ca59e4c7ffc5875a3f489/src/main/java/
+ * gtPlusPlus/xmod/forestry/HANDLER_FR.java#L60. If anybody understands Forestry and/or Extra Trees internals better
+ * than I do, and knows a more straightforward way to retrieve the relevant ItemStacks here, please update this.
+ */
+
+ private static void generateForestryTrees() {
+ for (TreeDefinition tree : TreeDefinition.values()) {
+ String speciesUID = tree.getUID();
+
+ ItemStack sapling = tree.getMemberStack(EnumGermlingType.SAPLING);
+
+ ItemStack log;
+ EnumWoodType woodType = ReflectionUtils.getField(tree, "woodType");
+ if (woodType != null) {
+ log = TreeManager.woodItemAccess.getLog(woodType, false);
+ } else {
+ log = ReflectionUtils.getField(tree, "vanillaWood");
+ }
+
+ ItemStack leaves = new ItemStack(PluginArboriculture.blocks.leaves, 1, 0);
+ if (speciesUID != null) {
+ NBTTagCompound nbtTagCompound = new NBTTagCompound();
+ nbtTagCompound.setString("species", speciesUID);
+ leaves.setTagCompound(nbtTagCompound);
+ }
+
+ ItemStack fruit = null;
+ ITree individual = tree.getIndividual();
+ if (individual.canBearFruit()) {
+ ItemStack[] produceList = individual.getProduceList();
+ if (produceList != null && produceList.length > 0) {
+ fruit = individual.getProduceList()[0];
+ }
+ }
+
+ GregtechMetaTileEntityTreeFarm.registerForestryTree(
+ speciesUID,
+ sapling == null ? null : sapling.copy(),
+ log == null ? null : log.copy(),
+ leaves == null ? null : leaves.copy(),
+ fruit == null ? null : fruit.copy());
+ }
+ }
+
+ private static void generateExtraTreesTrees() {
+ for (ExtraTreeSpecies species : ExtraTreeSpecies.values()) {
+
+ String speciesUID = species.getUID();
+
+ ITree individual = TreeManager.treeRoot.templateAsIndividual(species.getTemplate());
+ ItemStack sapling = TreeManager.treeRoot.getMemberStack(individual, 0);
+
+ ItemStack log = null;
+ if (species.getLog() != null) {
+ log = species.getLog()
+ .getItemStack();
+ }
+
+ ItemStack leaves = new ItemStack(PluginArboriculture.blocks.leaves, 1, 0);
+ if (speciesUID != null) {
+ NBTTagCompound nbtTagCompound = new NBTTagCompound();
+ nbtTagCompound.setString("species", speciesUID);
+ leaves.setTagCompound(nbtTagCompound);
+ }
+
+ ItemStack fruit = null;
+ if (individual.canBearFruit()) {
+ ItemStack[] produceList = individual.getProduceList();
+ if (produceList != null && produceList.length > 0) {
+ fruit = individual.getProduceList()[0];
+ }
+ }
+
+ GregtechMetaTileEntityTreeFarm.registerForestryTree(
+ speciesUID,
+ sapling == null ? null : sapling.copy(),
+ log == null ? null : log.copy(),
+ leaves == null ? null : leaves.copy(),
+ fruit == null ? null : fruit.copy());
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/recipes/GregtechRecipeAdder.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/recipes/GregtechRecipeAdder.java
new file mode 100644
index 0000000000..6b4a02e984
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/recipes/GregtechRecipeAdder.java
@@ -0,0 +1,1220 @@
+package gtPlusPlus.xmod.gregtech.recipes;
+
+import static gregtech.api.enums.GT_Values.RA;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.SemiFluidFuelHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.data.ArrayUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.interfaces.internal.IGregtech_RecipeAdder;
+import gtPlusPlus.xmod.gregtech.common.helpers.FlotationRecipeHandler;
+
+public class GregtechRecipeAdder implements IGregtech_RecipeAdder {
+
+ @Override
+ public boolean addCokeOvenRecipe(final ItemStack aInput1, final ItemStack aInput2, final FluidStack aFluidInput,
+ final FluidStack aFluidOutput, final ItemStack aOutput, int aDuration, final int aEUt) {
+ if (aInput1 == null || (aOutput == null && aFluidOutput == null)) {
+ Logger.WARNING("Something was null, returning false");
+ return false;
+ }
+ if (aOutput != null && (aDuration <= 0)) {
+ Logger.WARNING("Something was null, returning false");
+ return false;
+ }
+ if (aFluidOutput != null && (aDuration <= 0)) {
+ Logger.WARNING("Something was null, returning false");
+ return false;
+ }
+
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ true,
+ new ItemStack[] { aInput1, aInput2 },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] {},
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ Math.max(1, aEUt),
+ 0);
+ GTPPRecipeMaps.cokeOvenRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addCokeOvenRecipe(int aCircuit, ItemStack aInput2, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int aDuration, int aEUt) {
+ return addCokeOvenRecipe(
+ aInput2,
+ CI.getNumberedCircuit(aCircuit),
+ aFluidInputs,
+ aFluidOutputs,
+ aOutputs,
+ aDuration,
+ aEUt);
+ }
+
+ @Override
+ public boolean addCokeOvenRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int aDuration, int aEUt) {
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ true,
+ new ItemStack[] { aInput1, aInput2 },
+ aOutputs,
+ null,
+ new int[] {},
+ aFluidInputs,
+ aFluidOutputs,
+ Math.max(1, aDuration),
+ Math.max(1, aEUt),
+ 0);
+ GTPPRecipeMaps.cokeOvenRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMatterFabricatorRecipe(final FluidStack aFluidInput, final FluidStack aFluidOutput,
+ final int aDuration, final int aEUt) {
+ if (aFluidOutput == null) {
+ Logger.WARNING("Something was null, returning false");
+ return false;
+ }
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ aFluidInput == null ? new FluidStack[] {} : new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ 0);
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.addRecipe(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addDehydratorRecipe(final ItemStack[] aInput, final FluidStack aFluidInput,
+ final FluidStack aFluidOutput, final ItemStack[] aOutputItems, final int[] aChances, int aDuration,
+ final int aEUt) throws IndexOutOfBoundsException {
+ if (((aInput == null || aInput.length == 0) && (aFluidInput == null))
+ || ((aOutputItems == null || aOutputItems.length == 0) && (aFluidOutput == null))) {
+ return false;
+ }
+
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ true,
+ aInput,
+ aOutputItems,
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ Math.max(1, aDuration),
+ Math.max(1, aEUt),
+ 0);
+ GTPPRecipeMaps.chemicalDehydratorRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(final ItemStack[] aInput, FluidStack aOutput, final int aChance, int aDuration,
+ final int aEUt) {
+ return addBlastSmelterRecipe(
+ aInput,
+ (FluidStack) null,
+ aOutput,
+ new ItemStack[] {},
+ new int[] { aChance },
+ aDuration,
+ aEUt,
+ 3700);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(final ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ final int aChance, int aDuration, final int aEUt) {
+ return addBlastSmelterRecipe(
+ aInput,
+ aInputFluid,
+ aOutput,
+ new ItemStack[] {},
+ new int[] { aChance },
+ aDuration,
+ aEUt,
+ 3700);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(final ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ final int aChance, int aDuration, final int aEUt) {
+ return addBlastSmelterRecipe(
+ aInput,
+ aInputFluid,
+ aOutput,
+ new ItemStack[] {},
+ new int[] { aChance },
+ aDuration,
+ aEUt,
+ 3700);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(final ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, final int[] aChance, int aDuration, final int aEUt) {
+ return addBlastSmelterRecipe(aInput, aInputFluid, aOutput, aOutputStack, aChance, aDuration, aEUt, 3700);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(final ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, final int[] aChance, int aDuration, final int aEUt) {
+ return addBlastSmelterRecipe(aInput, aInputFluid, aOutput, aOutputStack, aChance, aDuration, aEUt, 3700);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt, int aSpecialValue) {
+ return addBlastSmelterRecipe(
+ aInput,
+ aInputFluid,
+ aOutput,
+ new ItemStack[] {},
+ new int[] { aChance },
+ aDuration,
+ aEUt,
+ aSpecialValue);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt, int aSpecialValue) {
+ return addBlastSmelterRecipe(
+ aInput,
+ aInputFluid,
+ aOutput,
+ new ItemStack[] {},
+ new int[] { aChance },
+ aDuration,
+ aEUt,
+ aSpecialValue);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue) {
+ return addBlastSmelterRecipe(
+ aInput,
+ aInputFluid,
+ aOutput,
+ aOutputStack,
+ aChance,
+ aDuration,
+ aEUt,
+ aSpecialValue,
+ true);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue) {
+ return addBlastSmelterRecipe(
+ aInput,
+ aInputFluid,
+ aOutput,
+ aOutputStack,
+ aChance,
+ aDuration,
+ aEUt,
+ aSpecialValue,
+ true);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue, boolean aOptimizeRecipe) {
+ return addBlastSmelterRecipe(
+ aInput,
+ new FluidStack[] { aInputFluid },
+ aOutput,
+ aOutputStack,
+ aChance,
+ aDuration,
+ aEUt,
+ aSpecialValue,
+ aOptimizeRecipe);
+ }
+
+ @Override
+ public boolean addBlastSmelterRecipe(ItemStack[] aInput, FluidStack[] aInputFluid, FluidStack aOutput,
+ ItemStack[] aOutputStack, int[] aChance, int aDuration, int aEUt, int aSpecialValue, boolean aOptimizeRecipe) {
+ if ((aInput == null) || (aOutput == null)) {
+ Logger.WARNING("Fail - Input or Output was null.");
+ return false;
+ }
+
+ if (aOutput.isFluidEqual(Materials.PhasedGold.getMolten(1))) {
+ aOutput = Materials.VibrantAlloy.getMolten(aOutput.amount);
+ }
+ if (aOutput.isFluidEqual(Materials.PhasedIron.getMolten(1))) {
+ aOutput = Materials.PulsatingIron.getMolten(aOutput.amount);
+ }
+ if (aDuration <= 0) {
+ Logger.WARNING("Recipe did not register.");
+ return false;
+ }
+
+ aInput = ArrayUtils.removeNulls(aInput);
+ if (aInput.length <= 1) {
+ return false;
+ }
+
+ GTPPRecipeMaps.alloyBlastSmelterRecipes.addRecipe(
+ aOptimizeRecipe,
+ aInput,
+ aOutputStack,
+ null,
+ aChance,
+ aInputFluid,
+ new FluidStack[] { aOutput },
+ aDuration,
+ Math.max(1, aEUt),
+ aSpecialValue);
+ return true;
+ }
+
+ @Override
+ public boolean addQuantumTransformerRecipe(ItemStack[] aInput, FluidStack[] aFluidInput, FluidStack[] aFluidOutput,
+ ItemStack[] aOutputStack, int[] aChances, int aDuration, int aEUt, int aSpecialValue) {
+ if (aInput == null) {
+ aInput = new ItemStack[0];
+ }
+ if (aFluidInput == null) {
+ aFluidInput = new FluidStack[0];
+ }
+ if (aOutputStack == null) {
+ aOutputStack = new ItemStack[0];
+ }
+ if (aFluidOutput == null) {
+ aFluidOutput = new FluidStack[0];
+ }
+
+ GTPPRecipeMaps.quantumForceTransformerRecipes.add(
+ new GT_Recipe(
+ false,
+ aInput,
+ aOutputStack,
+ null,
+ aChances,
+ aFluidInput,
+ aFluidOutput,
+ aDuration,
+ aEUt,
+ aSpecialValue));
+ return true;
+ }
+
+ @Override
+ public boolean addFissionFuel(final FluidStack aInput1, final FluidStack aInput2, final FluidStack aInput3,
+ final FluidStack aInput4, final FluidStack aInput5, final FluidStack aInput6, final FluidStack aInput7,
+ final FluidStack aInput8, final FluidStack aInput9, final FluidStack aOutput1, final FluidStack aOutput2,
+ final int aDuration, final int aEUt) {
+ return addFissionFuel(
+ false,
+ aInput1,
+ aInput2,
+ aInput3,
+ aInput4,
+ aInput5,
+ aInput6,
+ aInput7,
+ aInput8,
+ aInput9,
+ aOutput1,
+ aOutput2,
+ aDuration,
+ aEUt);
+ }
+
+ @Override
+ public boolean addFissionFuel(final boolean aOptimise, final FluidStack aInput1, final FluidStack aInput2,
+ final FluidStack aInput3, final FluidStack aInput4, final FluidStack aInput5, final FluidStack aInput6,
+ final FluidStack aInput7, final FluidStack aInput8, final FluidStack aInput9, final FluidStack aOutput1,
+ final FluidStack aOutput2, final int aDuration, final int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null) || (aDuration < 1) || (aEUt < 1)) {
+ return false;
+ }
+ final FluidStack[] inputs = { aInput1, aInput2, aInput3, aInput4, aInput5, aInput6, aInput7, aInput8, aInput9 };
+ final FluidStack[] outputs = { aOutput1, aOutput2 };
+
+ GTPPRecipeMaps.fissionFuelProcessingRecipes.addRecipe(
+ aOptimise,
+ new ItemStack[] {},
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ inputs,
+ outputs,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ public boolean addCyclotronRecipe(ItemStack aInputs, FluidStack aFluidInput, ItemStack[] aOutputs,
+ FluidStack aFluidOutput, int[] aChances, int aDuration, int aEUt, int aSpecialValue) {
+ return addCyclotronRecipe(
+ new ItemStack[] { aInputs },
+ aFluidInput,
+ aOutputs,
+ aFluidOutput,
+ aChances,
+ aDuration,
+ aEUt,
+ aSpecialValue);
+ }
+
+ @Override
+ public boolean addCyclotronRecipe(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack[] aOutput,
+ FluidStack aFluidOutput, int[] aChances, int aDuration, int aEUt, int aSpecialValue) {
+ if (aOutput == null || aOutput.length < 1 || !ItemUtils.checkForInvalidItems(aOutput)) {
+ Logger.INFO("Bad output for Cyclotron Recipe.");
+ return false;
+ }
+
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ true,
+ aInputs,
+ aOutput,
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ Math.max(1, aDuration),
+ Math.max(1, aEUt),
+ aSpecialValue);
+ GTPPRecipeMaps.cyclotronRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMixerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ ItemStack aOutput4, int aDuration, int aEUt) {
+ if ((aInput1 == null && aFluidInput == null) || (aOutput1 == null && aFluidOutput == null)) {
+ return false;
+ }
+
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ true,
+ new ItemStack[] { aInput1, aInput2, aInput3, aInput4 },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3, aOutput4 },
+ null,
+ new int[] {},
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ Math.max(1, aDuration),
+ Math.max(1, aEUt),
+ 0);
+ RecipeMaps.mixerRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMultiblockCentrifugeRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial) {
+ if (areItemsAndFluidsBothNull(aInputs, aFluidInputs) || areItemsAndFluidsBothNull(aOutputs, aFluidOutputs)
+ || aEUtick <= 0) {
+ return false;
+ }
+
+ if (!ItemUtils.checkForInvalidItems(aInputs, aOutputs)) {
+ Logger.INFO("[Recipe] Error generating Large Centrifuge recipe.");
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aFluidInputs));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ return false;
+ }
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUtick,
+ aSpecial);
+ GTPPRecipeMaps.centrifugeNonCellRecipes.addRecipe(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMultiblockElectrolyzerRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial) {
+ if (areItemsAndFluidsBothNull(aInputs, aFluidInputs) || areItemsAndFluidsBothNull(aOutputs, aFluidOutputs)
+ || aEUtick <= 0) {
+ return false;
+ }
+ if (!ItemUtils.checkForInvalidItems(aInputs, aOutputs)) {
+ Logger.INFO("[Recipe] Error generating Large Electrolyzer recipe.");
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aFluidInputs));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ return false;
+ }
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUtick,
+ aSpecial);
+ GTPPRecipeMaps.electrolyzerNonCellRecipes.addRecipe(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addAdvancedFreezerRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs,
+ ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial) {
+ if (areItemsAndFluidsBothNull(aInputs, aFluidInputs) || areItemsAndFluidsBothNull(aOutputs, aFluidOutputs)
+ || aEUtick <= 0) {
+ return false;
+ }
+
+ if (!ItemUtils.checkForInvalidItems(aInputs, aOutputs)) {
+ Logger.INFO("[Recipe] Error generating Adv. Vac Freezer recipe.");
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aFluidInputs));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ return false;
+ }
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUtick,
+ aSpecial);
+ GTPPRecipeMaps.advancedFreezerRecipes.addRecipe(aRecipe);
+ return false;
+ }
+
+ public boolean addMultiblockMixerRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs,
+ ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial) {
+ if (areItemsAndFluidsBothNull(aInputs, aFluidInputs) || areItemsAndFluidsBothNull(aOutputs, aFluidOutputs)
+ || aEUtick <= 0) {
+ return false;
+ }
+ if (!ItemUtils.checkForInvalidItems(aInputs, aOutputs)) {
+ Logger.INFO("[Recipe] Error generating Large Mixer recipe.");
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aFluidInputs));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ return false;
+ }
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUtick,
+ aSpecial);
+ GTPPRecipeMaps.mixerNonCellRecipes.addRecipe(aRecipe);
+ return true;
+ }
+
+ public boolean addMultiblockChemicalDehydratorRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial) {
+ if (areItemsAndFluidsBothNull(aInputs, aFluidInputs) || areItemsAndFluidsBothNull(aOutputs, aFluidOutputs)
+ || aEUtick <= 0) {
+ return false;
+ }
+ if (!ItemUtils.checkForInvalidItems(aInputs, aOutputs)) {
+ Logger.INFO("[Recipe] Error generating Large Chemical Dehydrator recipe.");
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aFluidInputs));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ return false;
+ }
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUtick,
+ aSpecial);
+ GTPPRecipeMaps.chemicalDehydratorNonCellRecipes.addRecipe(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addSixSlotAssemblingRecipe(ItemStack[] aInputs, FluidStack aInputFluid, ItemStack aOutput1,
+ int aDuration, int aEUt) {
+ return RA.addAssemblerRecipe(aInputs, aInputFluid, aOutput1, aDuration, aEUt);
+ }
+
+ @Override
+ public boolean addAssemblylineRecipe(ItemStack aResearchItem, int aResearchTime, ItemStack[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt) {
+ return RA.addAssemblylineRecipe(aResearchItem, aResearchTime, aInputs, aFluidInputs, aOutput, aDuration, aEUt);
+ }
+
+ @Override
+ public boolean addAssemblylineRecipe(ItemStack aResearchItem, int aResearchTime, Object[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt) {
+ return RA.addAssemblylineRecipe(aResearchItem, aResearchTime, aInputs, aFluidInputs, aOutput, aDuration, aEUt);
+ }
+
+ @Override
+ public boolean addChemicalRecipe(ItemStack input1, ItemStack input2, FluidStack inputFluid, FluidStack outputFluid,
+ ItemStack output, int time, int eu) {
+ return addChemicalRecipe(input1, input2, inputFluid, outputFluid, output, null, time, eu);
+ }
+
+ @Override
+ public boolean addChemicalRecipe(ItemStack input1, ItemStack input2, FluidStack inputFluid, FluidStack outputFluid,
+ ItemStack output, Object object, int time, int eu) {
+ return RA.addChemicalRecipe(input1, input2, inputFluid, outputFluid, output, time, eu);
+ }
+
+ @Override
+ public boolean addChemicalRecipe(ItemStack input1, ItemStack input2, FluidStack inputFluid, FluidStack outputFluid,
+ ItemStack output, ItemStack output2, int time) {
+ return RA.addChemicalRecipe(input1, input2, inputFluid, outputFluid, output, output2, time);
+ }
+
+ @Override
+ public boolean addChemicalRecipe(ItemStack input1, ItemStack input2, int aCircuit, FluidStack inputFluid,
+ FluidStack outputFluid, ItemStack output, ItemStack output2, int time, int eu) {
+ if (aCircuit < 0 || aCircuit > 24) {
+ aCircuit = 22;
+ }
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { input1, input2 },
+ new ItemStack[] { output, output2 },
+ CI.getNumberedCircuit(aCircuit),
+ new int[] {},
+ new FluidStack[] { inputFluid },
+ new FluidStack[] { outputFluid },
+ time,
+ eu,
+ 0);
+ RecipeMaps.chemicalReactorRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMultiblockChemicalRecipe(ItemStack[] itemStacks, FluidStack[] fluidStacks,
+ FluidStack[] fluidStacks2, ItemStack[] outputs, int time, int eu) {
+ return RA.addMultiblockChemicalRecipe(itemStacks, fluidStacks, fluidStacks2, outputs, time, eu);
+ }
+
+ private boolean areItemsAndFluidsBothNull(final ItemStack[] items, final FluidStack[] fluids) {
+ boolean itemsNull = true;
+ if (items != null) {
+ for (final ItemStack itemStack : items) {
+ if (itemStack != null) {
+ itemsNull = false;
+ break;
+ }
+ }
+ }
+ boolean fluidsNull = true;
+ if (fluids != null) {
+ for (final FluidStack fluidStack : fluids) {
+ if (fluidStack != null) {
+ fluidsNull = false;
+ break;
+ }
+ }
+ }
+ return itemsNull && fluidsNull;
+ }
+
+ @Override
+ public boolean addCompressorRecipe(ItemStack aInput1, ItemStack aOutput1, int aDuration, int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.compressorRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1 },
+ new ItemStack[] { aOutput1 },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ public boolean addBrewingRecipe(int aCircuit, FluidStack aInput, FluidStack aOutput, int aTime, int aEu,
+ boolean aHidden) {
+ return addBrewingRecipe(CI.getNumberedCircuit(aCircuit), aInput, aOutput, aTime, aEu, aHidden);
+ }
+
+ @Override
+ public boolean addBrewingRecipe(ItemStack aIngredient, FluidStack aInput, FluidStack aOutput, int aTime, int aEu,
+ boolean aHidden) {
+ if (aIngredient == null || aInput == null || aOutput == null) {
+ return false;
+ }
+ GT_Recipe tRecipe = RecipeMaps.brewingRecipes.addRecipe(
+ false,
+ new ItemStack[] { aIngredient },
+ null,
+ null,
+ new FluidStack[] { aInput },
+ new FluidStack[] { aOutput },
+ aTime,
+ aEu,
+ 0);
+ if (aHidden && tRecipe != null) {
+ tRecipe.mHidden = true;
+ }
+ return true;
+ }
+
+ /**
+ * Lets me add recipes for GT 5.08 & 5.09, since someone broke the method headers.
+ */
+ @Override
+ public boolean addSmeltingAndAlloySmeltingRecipe(ItemStack aDust, ItemStack aOutput) {
+ return GT_ModHandler.addSmeltingAndAlloySmeltingRecipe(aDust, aOutput, true);
+ }
+
+ @Override
+ public boolean addFluidExtractionRecipe(ItemStack input, FluidStack output, int aTime, int aEu) {
+ return RA.addFluidSmelterRecipe(GT_Utility.copyAmount(1, input), null, output, 10000, aTime, aEu, false);
+ }
+
+ @Override
+ public boolean addFluidExtractionRecipe(ItemStack aEmpty, ItemStack aRemains, FluidStack aFluid, int aDuration,
+ int aEU) {
+ return RA
+ .addFluidSmelterRecipe(GT_Utility.copyAmount(1, aEmpty), aRemains, aFluid, 10000, aDuration, aEU, false);
+ }
+
+ @Override
+ public boolean addFluidCannerRecipe(ItemStack aContainer, ItemStack aFullContainer, FluidStack rFluidIn) {
+ return MaterialGenerator.addFluidCannerRecipe(aContainer, aFullContainer, rFluidIn, null);
+ }
+
+ @Override
+ public boolean addFluidCannerRecipe(ItemStack aContainer, ItemStack aFullContainer, FluidStack rFluidIn,
+ FluidStack rFluidOut) {
+ return MaterialGenerator.addFluidCannerRecipe(aContainer, aFullContainer, rFluidIn, rFluidOut);
+ }
+
+ @Override
+ public boolean addFluidCannerRecipe(ItemStack aFullContainer, ItemStack container, FluidStack rFluidIn,
+ FluidStack rFluidOut, int aTime, int aEu) {
+ return MaterialGenerator.addFluidCannerRecipe(container, aFullContainer, rFluidIn, rFluidOut, aTime, aEu);
+ }
+
+ @Override
+ public boolean addSemifluidFuel(ItemStack aFuelItem, int aFuelValue) {
+ return SemiFluidFuelHandler.addSemiFluidFuel(aFuelItem, aFuelValue);
+ }
+
+ @Override
+ public boolean addSemifluidFuel(FluidStack aFuelItem, int aFuelValue) {
+ return SemiFluidFuelHandler.addSemiFluidFuel(aFuelItem, aFuelValue);
+ }
+
+ @Override
+ public boolean addVacuumFurnaceRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, int aDuration, int aEUt, int aLevel) {
+ if (aInput1 != null && aOutput1 != null) {
+ return addVacuumFurnaceRecipe(
+ new ItemStack[] { aInput1, aInput2 },
+ new FluidStack[] { aFluidInput },
+ new ItemStack[] { aOutput1, aOutput2 },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ aLevel);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean addVacuumFurnaceRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aLevel) {
+ if (aInputs != null && aOutputs != null) {
+ GTPPRecipeMaps.vacuumFurnaceRecipes.addRecipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ new int[] {},
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUt,
+ aLevel);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean addUvLaserRecipe(ItemStack aInput1, ItemStack aOutput, int time, long eu) {
+ // Generate Special Laser Recipe
+ GT_Recipe u = new GT_Recipe(
+ false,
+ new ItemStack[] { aInput1, GregtechItemList.Laser_Lens_WoodsGlass.get(0), },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] { 10000 },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ time,
+ (int) eu,
+ 0);
+ RecipeMaps.laserEngraverRecipes.add(u);
+ return true;
+ }
+
+ @Override
+ public boolean addChemicalPlantRecipe(ItemStack[] aInputs, FluidStack[] aInputFluids, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int time, long eu, int aTier) {
+ return addChemicalPlantRecipe(aInputs, aInputFluids, aOutputs, aFluidOutputs, new int[] {}, time, eu, aTier);
+ }
+
+ @Override
+ public boolean addChemicalPlantRecipe(ItemStack[] aInputs, FluidStack[] aInputFluids, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int[] aChances, int time, long eu, int aTier) {
+ if (aInputs.length > 4 || aInputFluids.length > 4 || aOutputs.length > 6 || aFluidOutputs.length > 3) {
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aInputFluids));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ CORE.crash();
+ }
+
+ GTPPRecipeMaps.chemicalPlantRecipes
+ .addRecipe(false, aInputs, aOutputs, null, aChances, aInputFluids, aFluidOutputs, time, (int) eu, aTier);
+ return true;
+ }
+
+ @Override
+ public boolean addBlastRecipe(ItemStack[] aInputs, FluidStack[] aInputFluids, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int time, long eu, int aHeat) {
+ GT_Recipe aSpecialRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ new int[] {},
+ aInputFluids,
+ aFluidOutputs,
+ time,
+ (int) eu,
+ aHeat);
+
+ RecipeMaps.blastFurnaceRecipes.add(aSpecialRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addPyrolyseRecipe(ItemStack aInput, FluidStack aFluidInput, int intCircuit, ItemStack aOutput,
+ FluidStack aFluidOutput, int aDuration, int aEUt) {
+ return RA.addPyrolyseRecipe(aInput, aFluidInput, intCircuit, aOutput, aFluidOutput, aDuration, aEUt);
+ }
+
+ @Override
+ public boolean addDistilleryRecipe(ItemStack aCircuit, FluidStack aInput, FluidStack aOutput,
+ ItemStack aSolidOutput, int aDuration, int aEUt, boolean aHidden) {
+ if (aInput != null && aOutput != null) {
+ if (aDuration <= 0) {
+ return false;
+ } else {
+ GT_Recipe tRecipe = RecipeMaps.distilleryRecipes.addRecipe(
+ true,
+ new ItemStack[] { aCircuit },
+ new ItemStack[] { aSolidOutput },
+ null,
+ new FluidStack[] { aInput },
+ new FluidStack[] { aOutput },
+ aDuration,
+ aEUt,
+ 0);
+ if (aHidden && tRecipe != null) {
+ tRecipe.mHidden = true;
+ }
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean addExtractorRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt) {
+ return addExtractorRecipe(aInput, aOutput, 10000, aDuration, aEUt);
+ }
+
+ @Override
+ public boolean addExtractorRecipe(ItemStack aInput, ItemStack aOutput, int aChance, int aDuration, int aEUt) {
+ if (aInput != null && aOutput != null) {
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { aInput.copy() },
+ new ItemStack[] { aOutput.copy() },
+ null,
+ new int[] { aChance },
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ RecipeMaps.extractorRecipes.add(aRecipe);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean addPulverisationRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3) {
+ aOutput1 = GT_OreDictUnificator.get(true, aOutput1);
+ aOutput2 = GT_OreDictUnificator.get(true, aOutput2);
+ aOutput3 = GT_OreDictUnificator.get(true, aOutput3);
+ if (GT_Utility.isStackInvalid(aInput) || GT_Utility.isStackInvalid(aOutput1)) {
+ return false;
+ }
+ if (GT_Utility.getContainerItem(aInput, false) == null) {
+
+ GT_Utility.addSimpleIC2MachineRecipe(aInput, GT_ModHandler.getMaceratorRecipeList(), null, aOutput1);
+
+ GT_Values.RA.addPulveriserRecipe(
+ aInput,
+ new ItemStack[] { aOutput1, aOutput2, aOutput3 },
+ new int[] { 10000, 10000, 10000 },
+ 400,
+ 2);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean addMillingRecipe(Materials aMat, int aEU) {
+ return addMillingRecipe(MaterialUtils.generateMaterialFromGtENUM(aMat), aEU);
+ }
+
+ @Override
+ public boolean addMillingRecipe(Material aMat, int aEU) {
+
+ ItemStack aOreStack = aMat.getOre(16);
+ ItemStack aCrushedStack = aMat.getCrushed(16);
+
+ ItemStack aMilledStackOres1 = aMat.getMilled(64);
+ ItemStack aMilledStackCrushed1 = aMat.getMilled(32);
+ ItemStack aMilledStackOres2 = aMat.getMilled(48);
+ ItemStack aMilledStackCrushed2 = aMat.getMilled(16);
+
+ ItemStack aMillingBall_Alumina = GregtechItemList.Milling_Ball_Alumina.get(0);
+ ItemStack aMillingBall_Soapstone = GregtechItemList.Milling_Ball_Soapstone.get(0);
+
+ // Inputs
+ ItemStack[] aInputsOre1 = new ItemStack[] { CI.getNumberedCircuit(10), aOreStack, aMillingBall_Alumina };
+
+ ItemStack[] aInputsOre2 = new ItemStack[] { CI.getNumberedCircuit(11), aOreStack, aMillingBall_Soapstone };
+
+ ItemStack[] aInputsCrushed1 = new ItemStack[] { CI.getNumberedCircuit(10), aCrushedStack,
+ aMillingBall_Alumina };
+
+ ItemStack[] aInputsCrushed2 = new ItemStack[] { CI.getNumberedCircuit(11), aCrushedStack,
+ aMillingBall_Soapstone };
+
+ // Outputs
+ ItemStack[] aOutputsOre1 = new ItemStack[] { aMilledStackOres1 };
+
+ ItemStack[] aOutputsOre2 = new ItemStack[] { aMilledStackOres2 };
+
+ ItemStack[] aOutputsCrushed1 = new ItemStack[] { aMilledStackCrushed1 };
+
+ ItemStack[] aOutputsCrushed2 = new ItemStack[] { aMilledStackCrushed2 };
+
+ ItemStack[][] aInputArray = new ItemStack[][] { aInputsOre1, aInputsOre2, aInputsCrushed1, aInputsCrushed2 };
+ ItemStack[][] aOutputArray = new ItemStack[][] { aOutputsOre1, aOutputsOre2, aOutputsCrushed1,
+ aOutputsCrushed2 };
+ int[] aTime = new int[] { 2400, 3000, 1200, 1500 };
+
+ for (int i = 0; i < 4; i++) {
+ GT_Recipe aOreRecipe = new GT_Recipe(
+ false,
+ aInputArray[i],
+ aOutputArray[i],
+ null,
+ new int[] {},
+ null,
+ null,
+ aTime[i],
+ aEU,
+ 0);
+ GTPPRecipeMaps.millingRecipes.add(aOreRecipe);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean addFlotationRecipe(Materials aMat, ItemStack aXanthate, FluidStack[] aInputFluids,
+ FluidStack[] aOutputFluids, int aTime, int aEU) {
+ return addFlotationRecipe(
+ MaterialUtils.generateMaterialFromGtENUM(aMat),
+ aXanthate,
+ aInputFluids,
+ aOutputFluids,
+ aTime,
+ aEU);
+ }
+
+ @Override
+ public boolean addFlotationRecipe(Material aMat, ItemStack aXanthate, FluidStack[] aInputFluids,
+ FluidStack[] aOutputFluids, int aTime, int aEU) {
+
+ FlotationRecipeHandler.registerOreType(aMat);
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { ItemUtils.getSimpleStack(aXanthate, 32), aMat.getMilled(64), aMat.getMilled(64),
+ aMat.getMilled(64), aMat.getMilled(64), },
+ new ItemStack[] {},
+ null,
+ new int[] {},
+ aInputFluids,
+ aOutputFluids,
+ aTime,
+ aEU,
+ 0);
+ GTPPRecipeMaps.flotationCellRecipes.add(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addpackagerRecipe(ItemStack aRecipeType, ItemStack aSmallDust, ItemStack aTinyDust,
+ ItemStack aOutputStack1) {
+ AutoMap<Boolean> aResults = new AutoMap<>();
+ // Dust 1
+ aResults.put(
+ GT_Values.RA.addBoxingRecipe(GT_Utility.copyAmount(4L, aSmallDust), aRecipeType, aOutputStack1, 100, 4));
+ // Dust 2
+ aResults.put(
+ GT_Values.RA.addBoxingRecipe(GT_Utility.copyAmount(9L, aTinyDust), aRecipeType, aOutputStack1, 100, 4));
+ for (boolean b : aResults) {
+ if (!b) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean addFuelForRTG(ItemStack aFuelPellet, int aFuelDays, int aVoltage) {
+ GTPPRecipeMaps.rtgFuels.addRecipe(
+ true,
+ new ItemStack[] { aFuelPellet },
+ new ItemStack[] {},
+ null,
+ null,
+ null,
+ 0,
+ aVoltage,
+ aFuelDays);
+ return true;
+ }
+
+ @Override
+ public boolean addColdTrapRecipe(int aCircuit, ItemStack aInput, FluidStack aFluidInput, ItemStack[] aOutputs,
+ int[] aChances, FluidStack aFluidOutput, int aTime, int aEU) {
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(aCircuit), aInput },
+ aOutputs,
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aTime,
+ aEU,
+ 0);
+
+ GTPPRecipeMaps.coldTrapRecipes.add(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addReactorProcessingUnitRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ ItemStack[] aOutputs, int[] aChances, FluidStack aFluidOutput, int aTime, int aEU) {
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { aInput1, aInput2 },
+ aOutputs,
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aTime,
+ aEU,
+ 0);
+
+ GTPPRecipeMaps.reactorProcessingUnitRecipes.add(aRecipe);
+ return true;
+ }
+
+ public boolean addNuclearSaltProcessingPlantRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUtick, int aSpecial) {
+ if (areItemsAndFluidsBothNull(aInputs, aFluidInputs) || areItemsAndFluidsBothNull(aOutputs, aFluidOutputs)
+ || aEUtick <= 0) {
+ return false;
+ }
+ if (!ItemUtils.checkForInvalidItems(aInputs, aOutputs)) {
+ Logger.INFO("[Recipe] Error generating Salt Plant recipe.");
+ Logger.INFO("Inputs: " + ItemUtils.getArrayStackNames(aInputs));
+ Logger.INFO("Fluid Inputs: " + ItemUtils.getArrayStackNames(aFluidInputs));
+ Logger.INFO("Outputs: " + ItemUtils.getArrayStackNames(aOutputs));
+ Logger.INFO("Fluid Outputs: " + ItemUtils.getArrayStackNames(aFluidOutputs));
+ return false;
+ }
+
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUtick,
+ aSpecial);
+ GTPPRecipeMaps.nuclearSaltProcessingPlantRecipes.addRecipe(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addFluidHeaterRecipe(ItemStack aInput, FluidStack aFluidInput, FluidStack aOutput, int aDuration,
+ int aEUt) {
+ if ((aInput == null && aFluidInput == null) || aOutput == null) {
+ return false;
+ }
+ RecipeMaps.fluidHeaterRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ null,
+ null,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aOutput },
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ public boolean addVacuumFreezerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt) {
+ if (aInput == null || aOutput == null) {
+ return false;
+ }
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] { 10000 },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ aDuration,
+ aEUt,
+ 0);
+
+ RecipeMaps.vacuumFreezerRecipes.add(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMolecularTransformerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt) {
+ if (aInput == null || aOutput == null) {
+ return false;
+ }
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] { 10000 },
+ new FluidStack[] {},
+ new FluidStack[] {},
+ aDuration,
+ aEUt,
+ 0);
+
+ GTPPRecipeMaps.molecularTransformerRecipes.add(aRecipe);
+ return true;
+ }
+
+ @Override
+ public boolean addMolecularTransformerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt,
+ int aAmps) {
+ return addMolecularTransformerRecipe(aInput, aOutput, aDuration, aEUt);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/Gregtech4Content.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/Gregtech4Content.java
new file mode 100644
index 0000000000..d08b010e97
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/Gregtech4Content.java
@@ -0,0 +1,95 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.GregTech_API;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_ElectricAutoWorkbench;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_TesseractGenerator;
+import gtPlusPlus.xmod.gregtech.common.tileentities.automation.GT_MetaTileEntity_TesseractTerminal;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_CropHarvestor;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GT4Entity_AutoCrafter;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GT4Entity_ThermalBoiler;
+
+public class Gregtech4Content {
+
+ // ID Range 828, 829, 833 - 850
+
+ public static void run() {
+ Logger.INFO("Max MTE: " + GregTech_API.METATILEENTITIES.length + " | " + GregTech_API.MAXIMUM_METATILE_IDS);
+ thermalBoiler();
+ multiCrafter();
+ tesseracts();
+ basic();
+ automation();
+ }
+
+ private static void automation() {
+ Logger.INFO("Gregtech 4 Content | Registering Auto Workbenches.");
+ GregtechItemList.GT4_Electric_Auto_Workbench_LV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31091, 1, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_MV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31092, 2, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_HV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31093, 3, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_EV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31094, 4, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_IV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31095, 5, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_LuV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31096, 6, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_ZPM
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31097, 7, "Automatic crafting machine").getStackForm(1L));
+ GregtechItemList.GT4_Electric_Auto_Workbench_UV
+ .set(new GT_MetaTileEntity_ElectricAutoWorkbench(31098, 8, "Automatic crafting machine").getStackForm(1L));
+
+ }
+
+ private static void basic() {
+ Logger.INFO("Gregtech 4 Content | Registering Crop Managers.");
+ GregtechItemList.GT4_Crop_Harvester_LV.set(
+ new GT_MetaTileEntity_CropHarvestor(31111, 1, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_MV.set(
+ new GT_MetaTileEntity_CropHarvestor(31112, 2, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_HV.set(
+ new GT_MetaTileEntity_CropHarvestor(31113, 3, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_EV.set(
+ new GT_MetaTileEntity_CropHarvestor(31114, 4, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_IV.set(
+ new GT_MetaTileEntity_CropHarvestor(31115, 5, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_LuV.set(
+ new GT_MetaTileEntity_CropHarvestor(31116, 6, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_ZPM.set(
+ new GT_MetaTileEntity_CropHarvestor(31117, 7, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ GregtechItemList.GT4_Crop_Harvester_UV.set(
+ new GT_MetaTileEntity_CropHarvestor(31118, 8, "Harvests the Cropsticks in front of it").getStackForm(1L));
+ }
+
+ private static void tesseracts() {
+ // Gregtech 4 Tesseracts
+ Logger.INFO("Gregtech 4 Content | Registering Tesseracts.");
+ GregtechItemList.GT4_Tesseract_Generator.set(
+ new GT_MetaTileEntity_TesseractGenerator(833, "tesseract.generator", "Tesseract Generator", 4)
+ .getStackForm(1L));
+ GregtechItemList.GT4_Tesseract_Terminal.set(
+ new GT_MetaTileEntity_TesseractTerminal(834, "tesseract.terminal", "Tesseract Terminal", 4)
+ .getStackForm(1L));
+ }
+
+ private static void thermalBoiler() {
+ // Gregtech 4 Thermal Boiler
+ if (CORE.ConfigSwitches.enableMultiblock_ThermalBoiler) {
+ Logger.INFO("Gregtech 4 Content | Registering Thermal Boiler.");
+ GregtechItemList.GT4_Thermal_Boiler
+ .set(new GT4Entity_ThermalBoiler(875, "gtplusplus.thermal.boiler", "Thermal Boiler").getStackForm(1L));
+ }
+ }
+
+ private static void multiCrafter() {
+ // Gregtech 4 Multiblock Auto-Crafter
+ Logger.INFO("Gregtech 4 Content | Registering Multiblock Crafter.");
+ GregtechItemList.GT4_Multi_Crafter.set(
+ new GT4Entity_AutoCrafter(876, "gtplusplus.autocrafter.multi", "Large Scale Auto-Assembler v1.01")
+ .getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAdvancedBoilers.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAdvancedBoilers.java
new file mode 100644
index 0000000000..e77e2b1c54
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAdvancedBoilers.java
@@ -0,0 +1,109 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.recipe.RECIPES_MachineComponents;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GT_MetaTileEntity_Boiler_HV;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GT_MetaTileEntity_Boiler_LV;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GT_MetaTileEntity_Boiler_MV;
+
+public class GregtechAdvancedBoilers {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Advanced Boilers.");
+ run1();
+ }
+
+ private static void run1() {
+ // Boilers
+ GregtechItemList.Boiler_Advanced_LV
+ .set(new GT_MetaTileEntity_Boiler_LV(753, "Advanced Boiler [LV]", 1).getStackForm(1L));
+ GregtechItemList.Boiler_Advanced_MV
+ .set(new GT_MetaTileEntity_Boiler_MV(754, "Advanced Boiler [MV]", 2).getStackForm(1L));
+ GregtechItemList.Boiler_Advanced_HV
+ .set(new GT_MetaTileEntity_Boiler_HV(755, "Advanced Boiler [HV]", 3).getStackForm(1L));
+
+ ItemStack chassisT1 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemBoilerChassis", "Boiler_Chassis_T1", 0, 1);
+ ItemStack chassisT2 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemBoilerChassis", "Boiler_Chassis_T1", 1, 1);
+ ItemStack chassisT3 = ItemUtils
+ .getItemStackWithMeta(true, "miscutils:itemBoilerChassis", "Boiler_Chassis_T1", 2, 1);
+
+ // Make the Coil in each following recipe a hammer and a Screwdriver.
+
+ // Chassis Recipes
+ GT_ModHandler.addCraftingRecipe(
+ chassisT1,
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WCW", "GMG", "WPW", Character.valueOf('M'), ItemList.Hull_ULV, Character.valueOf('P'),
+ OrePrefixes.pipeLarge.get(Materials.Bronze), Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Primitive), Character.valueOf('W'),
+ OrePrefixes.plate.get(Materials.Lead), Character.valueOf('G'),
+ OrePrefixes.pipeSmall.get(Materials.Copper) });
+
+ GT_ModHandler.addCraftingRecipe(
+ chassisT2,
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WCW", "GMG", "WPW", Character.valueOf('M'), ItemList.Hull_LV, Character.valueOf('P'),
+ OrePrefixes.pipeLarge.get(Materials.Steel), Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Basic), Character.valueOf('W'),
+ OrePrefixes.plate.get(Materials.Steel), Character.valueOf('G'),
+ OrePrefixes.pipeSmall.get(Materials.Bronze) });
+
+ GT_ModHandler.addCraftingRecipe(
+ chassisT3,
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WCW", "GMG", "WPW", Character.valueOf('M'), ItemList.Hull_MV, Character.valueOf('P'),
+ OrePrefixes.pipeLarge.get(Materials.StainlessSteel), Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Good), Character.valueOf('W'),
+ OrePrefixes.plate.get(Materials.Aluminium), Character.valueOf('G'),
+ OrePrefixes.pipeSmall.get(Materials.Steel) });
+
+ ItemStack pipeTier1 = ItemUtils.getItemStackOfAmountFromOreDict(RECIPES_MachineComponents.pipeTier7, 1);
+ ItemStack pipeTier2 = ItemUtils.getItemStackOfAmountFromOreDict(RECIPES_MachineComponents.pipeTier8, 1);
+ ItemStack pipeTier3 = ItemUtils.getItemStackOfAmountFromOreDict(RECIPES_MachineComponents.pipeTier9, 1);
+
+ // Boiler Recipes
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Boiler_Advanced_LV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "dCw", "WMW", "GPG", Character.valueOf('M'), ItemList.Hull_LV, Character.valueOf('P'),
+ pipeTier1, Character.valueOf('C'), OrePrefixes.circuit.get(Materials.Basic), Character.valueOf('W'),
+ chassisT1, Character.valueOf('G'), OrePrefixes.gear.get(Materials.Steel) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Boiler_Advanced_MV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "dCw", "WMW", "GPG", Character.valueOf('M'), ItemList.Hull_MV, Character.valueOf('P'),
+ pipeTier2, Character.valueOf('C'), OrePrefixes.circuit.get(Materials.Good), Character.valueOf('W'),
+ chassisT2, Character.valueOf('G'), ALLOY.SILICON_CARBIDE.getGear(1) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Boiler_Advanced_HV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "dCw", "WMW", "GPG", Character.valueOf('M'), ItemList.Hull_HV, Character.valueOf('P'),
+ pipeTier3, Character.valueOf('C'), OrePrefixes.circuit.get(Materials.Advanced), Character.valueOf('W'),
+ chassisT3, Character.valueOf('G'), ALLOY.SILICON_CARBIDE.getGear(1) });
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAlgaeContent.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAlgaeContent.java
new file mode 100644
index 0000000000..3c244739f6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAlgaeContent.java
@@ -0,0 +1,50 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.GregTech_API;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.block.ModBlocks;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers.GT_MetaTileEntity_Hatch_Catalysts;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.algae.GregtechMTE_AlgaePondBase;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.chemplant.GregtechMTE_ChemicalPlant;
+
+public class GregtechAlgaeContent {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Algae Content.");
+ run1();
+ }
+
+ private static void run1() {
+
+ // Algae Pond
+ GregtechItemList.AlgaeFarm_Controller
+ .set(new GregtechMTE_AlgaePondBase(997, "algaefarm.controller.tier.single", "Algae Farm").getStackForm(1L));
+
+ // Chemical Plant
+ GregtechItemList.ChemicalPlant_Controller.set(
+ new GregtechMTE_ChemicalPlant(998, "chemicalplant.controller.tier.single", "ExxonMobil Chemical Plant")
+ .getStackForm(1L));
+
+ GregtechItemList.Bus_Catalysts.set(
+ (new GT_MetaTileEntity_Hatch_Catalysts(31030, "hatch.catalysts", "Catalyst Housing")).getStackForm(1L));
+
+ int aTier = 0;
+ // Bronze
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, ModBlocks.blockCustomMachineCasings, 0, 10);
+ // Steel
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, GregTech_API.sBlockCasings2, 0, 16);
+ // Aluminium
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, ModBlocks.blockCustomMachineCasings, 1, 17);
+ // Stainless
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, GregTech_API.sBlockCasings4, 1, 49);
+ // Titanium
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, GregTech_API.sBlockCasings4, 2, 50);
+ // Tungsten
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, GregTech_API.sBlockCasings4, 0, 48);
+ // Laurenium
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, ModBlocks.blockCustomMachineCasings, 2, 84);
+ // Botmium
+ GregtechMTE_ChemicalPlant.registerMachineCasingForTier(aTier++, ModBlocks.blockCustomMachineCasings, 3, 11);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAmazonWarehouse.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAmazonWarehouse.java
new file mode 100644
index 0000000000..8fc84177ca
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechAmazonWarehouse.java
@@ -0,0 +1,20 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.misc.GMTE_AmazonPackager;
+
+public class GregtechAmazonWarehouse {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Amazon Warehouse Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ // Amazon packager multiblock
+ GregtechItemList.Amazon_Warehouse_Controller.set(
+ new GMTE_AmazonPackager(942, "amazonprime.controller.tier.single", "Amazon Warehousing Depot.")
+ .getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechBufferDynamos.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechBufferDynamos.java
new file mode 100644
index 0000000000..20df726ebe
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechBufferDynamos.java
@@ -0,0 +1,133 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import static gtPlusPlus.core.recipe.common.CI.bitsd;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DynamoBuffer;
+
+public class GregtechBufferDynamos {
+
+ private static int mID = 899;
+
+ public static void run() {
+ run2();
+ }
+
+ private static void run2() {
+ GregtechItemList.Hatch_Buffer_Dynamo_ULV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.00",
+ "ULV Dynamo Hatch [Buffered]",
+ 0).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_LV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.01",
+ "LV Dynamo Hatch [Buffered]",
+ 1).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_MV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.02",
+ "MV Dynamo Hatch [Buffered]",
+ 2).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_HV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.03",
+ "HV Dynamo Hatch [Buffered]",
+ 3).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_EV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.04",
+ "EV Dynamo Hatch [Buffered]",
+ 4).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_IV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.05",
+ "IV Dynamo Hatch [Buffered]",
+ 5).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_LuV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.06",
+ "LuV Dynamo Hatch [Buffered]",
+ 6).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_ZPM.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.07",
+ "ZPM Dynamo Hatch [Buffered]",
+ 7).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_UV.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.08",
+ "UV Dynamo Hatch [Buffered]",
+ 8).getStackForm(1L));
+ GregtechItemList.Hatch_Buffer_Dynamo_MAX.set(
+ new GT_MetaTileEntity_Hatch_DynamoBuffer(
+ mID++,
+ "hatch.dynamo.buffer.tier.09",
+ "UHV Dynamo Hatch [Buffered]",
+ 9).getStackForm(1L));
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_ULV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_ULV, 'T', CI.getTieredCircuit(0), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.Lead) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_LV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_LV, 'T', CI.getTieredCircuit(1), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_MV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_MV, 'T', CI.getTieredCircuit(2), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_HV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_HV, 'T', CI.getTieredCircuit(3), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_EV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_EV, 'T', CI.getTieredCircuit(4), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_IV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_IV, 'T', CI.getTieredCircuit(5), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.Tungsten) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_LuV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_LuV, 'T', CI.getTieredCircuit(6), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.VanadiumGallium) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_ZPM.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_ZPM, 'T', CI.getTieredCircuit(7), 'C',
+ OrePrefixes.cableGt04.get((Object) Materials.Naquadah) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_UV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_UV, 'T', CI.getTieredCircuit(8), 'C',
+ OrePrefixes.wireGt12.get((Object) Materials.NaquadahAlloy) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Buffer_Dynamo_MAX.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "TMC", 'M', ItemList.Hatch_Dynamo_MAX, 'T', CI.getTieredCircuit(9), 'C',
+ OrePrefixes.wireGt04.get(Materials.SuperconductorUHV) });
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechConduits.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechConduits.java
new file mode 100644
index 0000000000..22d3cd9608
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechConduits.java
@@ -0,0 +1,1269 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import static gregtech.api.enums.Mods.EnderIO;
+import static gregtech.api.enums.Mods.Thaumcraft;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.ELEMENT;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GregtechMetaPipeEntityFluid;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GregtechMetaPipeEntity_Cable;
+
+public class GregtechConduits {
+
+ // 30000-30999
+
+ private static int BaseWireID = 30600;
+ private static int BasePipeID = 30700;
+ private static int BasePipeHexadecupleID = 30100;
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Custom Cables/Wires/Pipes.");
+ if (CORE.ConfigSwitches.enableCustom_Cables) {
+ run1();
+ }
+ if (CORE.ConfigSwitches.enableCustom_Pipes) {
+ run2();
+ run3();
+ }
+ }
+
+ private static void run3() {
+
+ try {
+ Class<GT_MetaPipeEntity_Fluid> aPipeEntity = GT_MetaPipeEntity_Fluid.class;
+ Constructor<GT_MetaPipeEntity_Fluid> constructor = aPipeEntity.getConstructor(
+ int.class,
+ String.class,
+ String.class,
+ float.class,
+ Materials.class,
+ int.class,
+ int.class,
+ boolean.class,
+ int.class);
+ if (constructor != null) {
+ Logger.INFO("Generating Hexadecuple pipes.");
+ generateFluidMultiPipes(
+ constructor,
+ Materials.Copper,
+ MaterialUtils.getMaterialName(Materials.Copper),
+ "Copper",
+ BasePipeHexadecupleID++,
+ 60,
+ 1000,
+ true);
+ generateFluidMultiPipes(
+ constructor,
+ Materials.Bronze,
+ MaterialUtils.getMaterialName(Materials.Bronze),
+ "Bronze",
+ BasePipeHexadecupleID++,
+ 120,
+ 2000,
+ true);
+ generateFluidMultiPipes(
+ constructor,
+ Materials.Steel,
+ MaterialUtils.getMaterialName(Materials.Steel),
+ "Steel",
+ BasePipeHexadecupleID++,
+ 240,
+ 2500,
+ true);
+ generateFluidMultiPipes(
+ constructor,
+ Materials.StainlessSteel,
+ MaterialUtils.getMaterialName(Materials.StainlessSteel),
+ "Stainless Steel",
+ BasePipeHexadecupleID++,
+ 360,
+ 3000,
+ true);
+ generateFluidMultiPipes(
+ constructor,
+ Materials.Titanium,
+ MaterialUtils.getMaterialName(Materials.Titanium),
+ "Titanium",
+ BasePipeHexadecupleID++,
+ 480,
+ 5000,
+ true);
+ generateFluidMultiPipes(
+ constructor,
+ Materials.TungstenSteel,
+ MaterialUtils.getMaterialName(Materials.TungstenSteel),
+ "Tungsten Steel",
+ BasePipeHexadecupleID++,
+ 600,
+ 7500,
+ true);
+ generateFluidMultiPipes(
+ constructor,
+ Materials.Plastic,
+ MaterialUtils.getMaterialName(Materials.Plastic),
+ "Plastic",
+ BasePipeHexadecupleID++,
+ 360,
+ 350,
+ true);
+
+ Materials aPTFE = Materials.get("Polytetrafluoroethylene");
+ if (aPTFE != null) {
+ generateFluidMultiPipes(
+ constructor,
+ aPTFE,
+ MaterialUtils.getMaterialName(aPTFE),
+ "PTFE",
+ BasePipeHexadecupleID++,
+ 480,
+ 600,
+ true);
+ }
+ } else {
+ Logger.INFO("Failed during Hexadecuple pipe generation.");
+ }
+
+ } catch (NoSuchMethodException | SecurityException e) {
+ Logger.INFO("Failed during Hexadecuple pipe generation. [Ecx]");
+ e.printStackTrace();
+ }
+
+ // Generate Heat Pipes
+ // GregtechItemList.HeatPipe_Tier_1.set(new GT_MetaPipeEntity_Heat(31021, "gtpp.pipe.heat.basic.01", "Lead Heat
+ // Pipe (500C)", Materials.Lead, 500).getStackForm(1L));
+ // GregtechItemList.HeatPipe_Tier_2.set(new GT_MetaPipeEntity_Heat(31022, "gtpp.pipe.heat.basic.02", "Iron Heat
+ // Pipe (500C)", Materials.Iron, 500).getStackForm(1L));
+ // GregtechItemList.HeatPipe_Tier_3.set(new GT_MetaPipeEntity_Heat(31023, "gtpp.pipe.heat.basic.03", "Silver
+ // Heat Pipe (1500C)", Materials.Silver, 1500).getStackForm(1L));
+
+ }
+
+ private static void generateFluidMultiPipes(Constructor<GT_MetaPipeEntity_Fluid> aClazz, Materials aMaterial,
+ String name, String displayName, int startID, int transferRatePerSec, int heatCapacity, boolean gasProof) {
+ GT_MetaPipeEntity_Fluid aPipe;
+ final int transferRatePerTick = transferRatePerSec / 20;
+ try {
+ aPipe = aClazz.newInstance(
+ startID,
+ "GT_Pipe_" + name + "_Hexadecuple",
+ "Hexadecuple " + displayName + " Fluid Pipe",
+ 1.0F,
+ aMaterial,
+ transferRatePerTick,
+ heatCapacity,
+ gasProof,
+ 16);
+ if (aPipe == null) {
+ Logger.INFO("Failed to Generate " + aMaterial + " Hexadecuple pipes.");
+ } else {
+ Logger.INFO("Generated " + aMaterial + " Hexadecuple pipes.");
+ GT_OreDictUnificator.registerOre("pipeHexadecuple" + aMaterial, aPipe.getStackForm(1L));
+ }
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException e) {
+ Logger.INFO("Failed to Generate " + aMaterial + " Hexadecuple pipes. [Ecx]");
+ e.printStackTrace();
+ }
+ }
+
+ private static void run1() {
+
+ wireFactory("RedstoneAlloy", 32, BaseWireID + 45, 0, 2, 1, new short[] { 178, 34, 34, 0 });
+
+ // need to go back id because fluid pipes already occupy
+ makeCustomWires(ELEMENT.STANDALONE.HYPOGEN, BaseWireID - 15, 0, 0, 8, GT_Values.V[11], false, true);
+
+ }
+
+ private static void run2() {
+ generateNonGTFluidPipes(GT_Materials.Staballoy, ALLOY.STABALLOY, BasePipeID, 12500, 7500, true);
+ generateNonGTFluidPipes(GT_Materials.Tantalloy60, ALLOY.TANTALLOY_60, BasePipeID + 5, 10000, 4250, true);
+ generateNonGTFluidPipes(GT_Materials.Tantalloy61, ALLOY.TANTALLOY_61, BasePipeID + 10, 12000, 5800, true);
+ if (Thaumcraft.isModLoaded()) {
+ generateNonGTFluidPipes(GT_Materials.Void, null, BasePipeID + 15, 1600, 25000, true);
+ }
+ generateGTFluidPipes(Materials.Europium, BasePipeID + 20, 12000, 7500, true);
+ generateNonGTFluidPipes(GT_Materials.Potin, ALLOY.POTIN, BasePipeID + 25, 500, 2000, true);
+ generateNonGTFluidPipes(GT_Materials.MaragingSteel300, ALLOY.MARAGING300, BasePipeID + 30, 14000, 2500, true);
+ generateNonGTFluidPipes(GT_Materials.MaragingSteel350, ALLOY.MARAGING350, BasePipeID + 35, 16000, 2500, true);
+ generateNonGTFluidPipes(GT_Materials.Inconel690, ALLOY.INCONEL_690, BasePipeID + 40, 15000, 4800, true);
+ generateNonGTFluidPipes(GT_Materials.Inconel792, ALLOY.INCONEL_792, BasePipeID + 45, 16000, 5500, true);
+ generateNonGTFluidPipes(GT_Materials.HastelloyX, ALLOY.HASTELLOY_X, BasePipeID + 50, 20000, 4200, true);
+
+ generateGTFluidPipes(Materials.Tungsten, BasePipeID + 55, 4320, 7200, true);
+ if (EnderIO.isModLoaded()) {
+ generateGTFluidPipes(Materials.DarkSteel, BasePipeID + 60, 2320, 2750, true);
+ }
+ generateGTFluidPipes(Materials.Clay, BasePipeID + 65, 100, 500, false);
+ generateGTFluidPipes(Materials.Lead, BasePipeID + 70, 350, 1200, true);
+
+ generateNonGTFluidPipes(
+ GT_Materials.TriniumNaquadahCarbonite,
+ ALLOY.TRINIUM_NAQUADAH_CARBON,
+ 30500,
+ 20,
+ 250000,
+ true);
+ }
+
+ private static void wireFactory(final String Material, final int Voltage, final int ID, final long insulatedLoss,
+ final long uninsulatedLoss, final long Amps, final short[] rgb) {
+ final Materials T = Materials.get(Material);
+ int V = GT_Utility.getTier(Voltage);
+ if (V == -1) {
+ Logger.ERROR("Failed to set voltage on " + Material + ". Invalid voltage of " + Voltage + "V set.");
+ Logger.ERROR(Material + " has defaulted to 8v.");
+ V = 0;
+ }
+ makeWires(T, ID, insulatedLoss, uninsulatedLoss, Amps, GT_Values.V[V], true, false, rgb);
+ }
+
+ private static void makeWires(final Materials aMaterial, final int aStartID, final long aLossInsulated,
+ final long aLoss, final long aAmperage, final long aVoltage, final boolean aInsulatable,
+ final boolean aAutoInsulated, final short[] aRGB) {
+ Logger.WARNING("Gregtech5u Content | Registered " + aMaterial.mName + " as a new material for Wire & Cable.");
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt01,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 0,
+ "wire." + aMaterial.mName.toLowerCase() + ".01",
+ "1x " + aMaterial.mDefaultLocalName + " Wire",
+ 0.125F,
+ aMaterial,
+ aLoss,
+ 1L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt02,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 1,
+ "wire." + aMaterial.mName.toLowerCase() + ".02",
+ "2x " + aMaterial.mDefaultLocalName + " Wire",
+ 0.25F,
+ aMaterial,
+ aLoss,
+ 2L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt04,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 2,
+ "wire." + aMaterial.mName.toLowerCase() + ".04",
+ "4x " + aMaterial.mDefaultLocalName + " Wire",
+ 0.375F,
+ aMaterial,
+ aLoss,
+ 4L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt08,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 3,
+ "wire." + aMaterial.mName.toLowerCase() + ".08",
+ "8x " + aMaterial.mDefaultLocalName + " Wire",
+ 0.50F,
+ aMaterial,
+ aLoss,
+ 8L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt12,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 4,
+ "wire." + aMaterial.mName.toLowerCase() + ".12",
+ "12x " + aMaterial.mDefaultLocalName + " Wire",
+ 0.625F,
+ aMaterial,
+ aLoss,
+ 12L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt16,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 5,
+ "wire." + aMaterial.mName.toLowerCase() + ".16",
+ "16x " + aMaterial.mDefaultLocalName + " Wire",
+ 0.75F,
+ aMaterial,
+ aLoss,
+ 16L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aRGB).getStackForm(1L));
+ if (aInsulatable) {
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt01,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 6,
+ "cable." + aMaterial.mName.toLowerCase() + ".01",
+ "1x " + aMaterial.mDefaultLocalName + " Cable",
+ 0.25F,
+ aMaterial,
+ aLossInsulated,
+ 1L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt02,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 7,
+ "cable." + aMaterial.mName.toLowerCase() + ".02",
+ "2x " + aMaterial.mDefaultLocalName + " Cable",
+ 0.375F,
+ aMaterial,
+ aLossInsulated,
+ 2L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt04,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 8,
+ "cable." + aMaterial.mName.toLowerCase() + ".04",
+ "4x " + aMaterial.mDefaultLocalName + " Cable",
+ 0.5F,
+ aMaterial,
+ aLossInsulated,
+ 4L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt08,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 9,
+ "cable." + aMaterial.mName.toLowerCase() + ".08",
+ "8x " + aMaterial.mDefaultLocalName + " Cable",
+ 0.625F,
+ aMaterial,
+ aLossInsulated,
+ 8L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt12,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 10,
+ "cable." + aMaterial.mName.toLowerCase() + ".12",
+ "12x " + aMaterial.mDefaultLocalName + " Cable",
+ 0.75F,
+ aMaterial,
+ aLossInsulated,
+ 12L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aRGB).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt16,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 11,
+ "cable." + aMaterial.mName.toLowerCase() + ".16",
+ "16x " + aMaterial.mDefaultLocalName + " Cable",
+ 0.875f,
+ aMaterial,
+ aLossInsulated,
+ 16L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aRGB).getStackForm(1L));
+ }
+ }
+
+ private static void customWireFactory(final Material Material, final int Voltage, final int ID,
+ final long insulatedLoss, final long uninsulatedLoss, final long Amps) {
+ int V = GT_Utility.getTier(Voltage);
+ if (V == -1) {
+ Logger.ERROR("Failed to set voltage on " + Material + ". Invalid voltage of " + Voltage + "V set.");
+ Logger.ERROR(Material + " has defaulted to 8v.");
+ V = 0;
+ }
+ makeCustomWires(Material, ID, insulatedLoss, uninsulatedLoss, Amps, GT_Values.V[V], true, false);
+ }
+
+ private static void makeCustomWires(final Material aMaterial, final int aStartID, final long aLossInsulated,
+ final long aLoss, final long aAmperage, final long aVoltage, final boolean aInsulatable,
+ final boolean aAutoInsulated) {
+ Logger.WARNING(
+ "Gregtech5u Content | Registered " + aMaterial.getLocalizedName() + " as a new material for Wire & Cable.");
+ registerOre(
+ OrePrefixes.wireGt01,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 0,
+ "wire." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".01",
+ "1x " + aMaterial.getLocalizedName() + " Wire",
+ 0.125F,
+ aLoss,
+ 1L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.wireGt02,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 1,
+ "wire." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".02",
+ "2x " + aMaterial.getLocalizedName() + " Wire",
+ 0.25F,
+ aLoss,
+ 2L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.wireGt04,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 2,
+ "wire." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".04",
+ "4x " + aMaterial.getLocalizedName() + " Wire",
+ 0.375F,
+ aLoss,
+ 4L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.wireGt08,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 3,
+ "wire." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".08",
+ "8x " + aMaterial.getLocalizedName() + " Wire",
+ 0.50F,
+ aLoss,
+ 8L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.wireGt12,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 4,
+ "wire." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".12",
+ "12x " + aMaterial.getLocalizedName() + " Wire",
+ 0.625F,
+ aLoss,
+ 12L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.wireGt16,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 5,
+ "wire." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".16",
+ "16x " + aMaterial.getLocalizedName() + " Wire",
+ 0.75F,
+ aLoss,
+ 16L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated,
+ aMaterial.getRGBA()).getStackForm(1L));
+ if (aInsulatable) {
+ registerOre(
+ OrePrefixes.cableGt01,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 6,
+ "cable." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".01",
+ "1x " + aMaterial.getLocalizedName() + " Cable",
+ 0.25F,
+ aLossInsulated,
+ 1L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.cableGt02,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 7,
+ "cable." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".02",
+ "2x " + aMaterial.getLocalizedName() + " Cable",
+ 0.375F,
+ aLossInsulated,
+ 2L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.cableGt04,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 8,
+ "cable." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".04",
+ "4x " + aMaterial.getLocalizedName() + " Cable",
+ 0.5F,
+ aLossInsulated,
+ 4L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.cableGt08,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 9,
+ "cable." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".08",
+ "8x " + aMaterial.getLocalizedName() + " Cable",
+ 0.625F,
+ aLossInsulated,
+ 8L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.cableGt12,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 10,
+ "cable." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".12",
+ "12x " + aMaterial.getLocalizedName() + " Cable",
+ 0.75F,
+ aLossInsulated,
+ 12L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aMaterial.getRGBA()).getStackForm(1L));
+ registerOre(
+ OrePrefixes.cableGt16,
+ aMaterial,
+ new GregtechMetaPipeEntity_Cable(
+ aStartID + 11,
+ "cable." + aMaterial.getLocalizedName()
+ .toLowerCase() + ".16",
+ "16x " + aMaterial.getLocalizedName() + " Cable",
+ 0.875f,
+ aLossInsulated,
+ 16L * aAmperage,
+ aVoltage,
+ true,
+ false,
+ aMaterial.getRGBA()).getStackForm(1L));
+ }
+ }
+
+ private static void superConductorFactory(final GT_Materials Material, final int Voltage, final int ID,
+ final long insulatedLoss, final long uninsulatedLoss, final long Amps) {
+ final GT_Materials T = Material;
+ int V = 0;
+ if (Voltage == 8) {
+ V = 0;
+ } else if (Voltage == 32) {
+ V = 1;
+ } else if (Voltage == 128) {
+ V = 2;
+ } else if (Voltage == 512) {
+ V = 3;
+ } else if (Voltage == 2048) {
+ V = 4;
+ } else if (Voltage == 8196) {
+ V = 5;
+ } else if (Voltage == 32768) {
+ V = 6;
+ } else if (Voltage == 131072) {
+ V = 7;
+ } else if (Voltage == 524288) {
+ V = 8;
+ } else if (Voltage == Integer.MAX_VALUE) {
+ V = 9;
+ } else {
+ Logger.ERROR("Failed to set voltage on " + Material.name() + ". Invalid voltage of " + Voltage + "V set.");
+ Logger.ERROR(Material.name() + " has defaulted to 8v.");
+ V = 0;
+ }
+ }
+
+ private static void generateGTFluidPipes(final Materials material, final int startID, final int transferRatePerSec,
+ final int heatResistance, final boolean isGasProof) {
+ final int transferRatePerTick = transferRatePerSec / 20;
+ final long mass = material.getMass();
+ final long voltage = material.mMeltingPoint >= 2800 ? 64 : 16;
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeTiny.get(material),
+ new GT_MetaPipeEntity_Fluid(
+ startID,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Tiny",
+ "Tiny " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.25F,
+ material,
+ transferRatePerTick * 2,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeSmall.get(material),
+ new GT_MetaPipeEntity_Fluid(
+ startID + 1,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Small",
+ "Small " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.375F,
+ material,
+ transferRatePerTick * 4,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeMedium.get(material),
+ new GT_MetaPipeEntity_Fluid(
+ startID + 2,
+ "GT_Pipe_" + material.mDefaultLocalName + "",
+ "" + material.mDefaultLocalName + " Fluid Pipe",
+ 0.5F,
+ material,
+ transferRatePerTick * 12,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeLarge.get(material),
+ new GT_MetaPipeEntity_Fluid(
+ startID + 3,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Large",
+ "Large " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.75F,
+ material,
+ transferRatePerTick * 24,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeHuge.get(material),
+ new GT_MetaPipeEntity_Fluid(
+ startID + 4,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Huge",
+ "Huge " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.875F,
+ material,
+ transferRatePerTick * 48,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ // generatePipeRecipes(material.mDefaultLocalName, mass, voltage);
+ }
+
+ private static void generateNonGTFluidPipes(final GT_Materials material, final Material myMaterial,
+ final int startID, final int transferRatePerSec, final int heatResistance, final boolean isGasProof) {
+ final int transferRatePerTick = transferRatePerSec / 20;
+ long mass;
+ if (myMaterial != null) {
+ mass = myMaterial.getMass();
+ } else {
+ mass = ELEMENT.getInstance().IRON.getMass();
+ }
+
+ int tVoltageMultiplier = (material.mBlastFurnaceTemp >= 2800) ? 64 : 16;
+
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeTiny.get(material),
+ new GregtechMetaPipeEntityFluid(
+ startID,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Tiny",
+ "Tiny " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.25F,
+ material,
+ transferRatePerTick * 2,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeSmall.get(material),
+ new GregtechMetaPipeEntityFluid(
+ startID + 1,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Small",
+ "Small " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.375F,
+ material,
+ transferRatePerTick * 4,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeMedium.get(material),
+ new GregtechMetaPipeEntityFluid(
+ startID + 2,
+ "GT_Pipe_" + material.mDefaultLocalName + "",
+ "" + material.mDefaultLocalName + " Fluid Pipe",
+ 0.5F,
+ material,
+ transferRatePerTick * 12,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeLarge.get(material),
+ new GregtechMetaPipeEntityFluid(
+ startID + 3,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Large",
+ "Large " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.75F,
+ material,
+ transferRatePerTick * 24,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeHuge.get(material),
+ new GregtechMetaPipeEntityFluid(
+ startID + 4,
+ "GT_Pipe_" + material.mDefaultLocalName + "_Huge",
+ "Huge " + material.mDefaultLocalName + " Fluid Pipe",
+ 0.875F,
+ material,
+ transferRatePerTick * 48,
+ heatResistance,
+ isGasProof).getStackForm(1L));
+ // generatePipeRecipes(material.mDefaultLocalName, mass, tVoltageMultiplier);
+
+ }
+
+ public static void generatePipeRecipes(final String materialName, final long Mass, final long vMulti) {
+
+ String output = materialName.substring(0, 1)
+ .toUpperCase() + materialName.substring(1);
+ output = Utils.sanitizeString(output);
+
+ if (output.equals("VoidMetal")) {
+ output = "Void";
+ }
+
+ Logger.INFO("Generating " + output + " pipes & respective recipes.");
+
+ ItemStack pipeIngot = ItemUtils.getItemStackOfAmountFromOreDict("ingot" + output, 1);
+ ItemStack pipePlate = ItemUtils.getItemStackOfAmountFromOreDict("plate" + output, 1);
+
+ if (pipeIngot == null) {
+ if (pipePlate != null) {
+ pipeIngot = pipePlate;
+ }
+ }
+
+ // Check all pipes are not null
+ Logger.WARNING(
+ "Generated pipeTiny from " + materialName
+ + "? "
+ + ((ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Tiny" + output, 1) != null) ? true : false));
+ Logger.WARNING(
+ "Generated pipeSmall from " + materialName
+ + "? "
+ + ((ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Small" + output, 1) != null) ? true : false));
+ Logger.WARNING(
+ "Generated pipeNormal from " + materialName
+ + "? "
+ + ((ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Medium" + output, 1) != null) ? true : false));
+ Logger.WARNING(
+ "Generated pipeLarge from " + materialName
+ + "? "
+ + ((ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Large" + output, 1) != null) ? true : false));
+ Logger.WARNING(
+ "Generated pipeHuge from " + materialName
+ + "? "
+ + ((ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Huge" + output, 1) != null) ? true : false));
+
+ int eut = 120;
+ eut = (int) (8 * vMulti);
+
+ // Add the Three Shaped Recipes First
+ RecipeUtils.addShapedRecipe(
+ pipePlate,
+ "craftingToolWrench",
+ pipePlate,
+ pipePlate,
+ null,
+ pipePlate,
+ pipePlate,
+ "craftingToolHardHammer",
+ pipePlate,
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Small" + output, 6));
+
+ RecipeUtils.addShapedRecipe(
+ pipePlate,
+ pipePlate,
+ pipePlate,
+ "craftingToolWrench",
+ null,
+ "craftingToolHardHammer",
+ pipePlate,
+ pipePlate,
+ pipePlate,
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Medium" + output, 2));
+
+ RecipeUtils.addShapedRecipe(
+ pipePlate,
+ "craftingToolHardHammer",
+ pipePlate,
+ pipePlate,
+ null,
+ pipePlate,
+ pipePlate,
+ "craftingToolWrench",
+ pipePlate,
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Large" + output, 1));
+
+ if (pipeIngot != null && ItemUtils.checkForInvalidItems(pipeIngot)) {
+ // 1 Clay Plate = 1 Clay Dust = 2 Clay Ball
+ int inputMultiplier = materialName.equals("Clay") ? 2 : 1;
+ GT_Values.RA.addExtruderRecipe(
+ ItemUtils.getSimpleStack(pipeIngot, 1 * inputMultiplier),
+ ItemList.Shape_Extruder_Pipe_Tiny.get(0),
+ ItemUtils.getItemStackOfAmountFromOreDictNoBroken("pipe" + "Tiny" + output, 2),
+ 5,
+ eut);
+
+ GT_Values.RA.addExtruderRecipe(
+ ItemUtils.getSimpleStack(pipeIngot, 1 * inputMultiplier),
+ ItemList.Shape_Extruder_Pipe_Small.get(0),
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Small" + output, 1),
+ 10,
+ eut);
+
+ GT_Values.RA.addExtruderRecipe(
+ ItemUtils.getSimpleStack(pipeIngot, 3 * inputMultiplier),
+ ItemList.Shape_Extruder_Pipe_Medium.get(0),
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Medium" + output, 1),
+ 1 * 20,
+ eut);
+
+ GT_Values.RA.addExtruderRecipe(
+ ItemUtils.getSimpleStack(pipeIngot, 6 * inputMultiplier),
+ ItemList.Shape_Extruder_Pipe_Large.get(0),
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Large" + output, 1),
+ 2 * 20,
+ eut);
+
+ GT_Values.RA.addExtruderRecipe(
+ ItemUtils.getSimpleStack(pipeIngot, 12 * inputMultiplier),
+ ItemList.Shape_Extruder_Pipe_Huge.get(0),
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Huge" + output, 1),
+ 4 * 20,
+ eut);
+ }
+
+ if ((eut < 512) && !output.equals("Void")) {
+ try {
+ final ItemStack pipePlateDouble = ItemUtils.getItemStackOfAmountFromOreDict("plateDouble" + output, 1)
+ .copy();
+ if (pipePlateDouble != null) {
+ RecipeUtils.addShapedRecipe(
+ pipePlateDouble,
+ "craftingToolHardHammer",
+ pipePlateDouble,
+ pipePlateDouble,
+ null,
+ pipePlateDouble,
+ pipePlateDouble,
+ "craftingToolWrench",
+ pipePlateDouble,
+ ItemUtils.getItemStackOfAmountFromOreDict("pipe" + "Huge" + output, 1));
+ } else {
+ Logger.INFO(
+ "Failed to add a recipe for " + materialName
+ + " Huge pipes. Double plates probably do not exist.");
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ }
+
+ public static boolean registerOre(OrePrefixes aPrefix, Material aMaterial, ItemStack aStack) {
+ return registerOre(aPrefix.get(Utils.sanitizeString(aMaterial.getLocalizedName())), aStack);
+ }
+
+ public static boolean registerOre(Object aName, ItemStack aStack) {
+ if ((aName == null) || (GT_Utility.isStackInvalid(aStack))) return false;
+ String tName = aName.toString();
+ if (GT_Utility.isStringInvalid(tName)) return false;
+ ArrayList<ItemStack> tList = GT_OreDictUnificator.getOres(tName);
+ for (ItemStack itemStack : tList)
+ if (GT_Utility.areStacksEqual((ItemStack) itemStack, aStack, true)) return false;
+ OreDictionary.registerOre(tName, GT_Utility.copyAmount(1L, new Object[] { aStack }));
+ return true;
+ }
+
+ public static boolean generateWireRecipes(Material aMaterial) {
+
+ ItemStack aPlate = aMaterial.getPlate(1);
+ ItemStack aIngot = aMaterial.getIngot(1);
+ ItemStack aRod = aMaterial.getRod(1);
+ ItemStack aWire01 = aMaterial.getWire01(1);
+ ItemStack aWire02 = aMaterial.getWire02(1);
+ ItemStack aWire04 = aMaterial.getWire04(1);
+ ItemStack aWire08 = aMaterial.getWire08(1);
+ ItemStack aWire12 = aMaterial.getWire12(1);
+ ItemStack aWire16 = aMaterial.getWire16(1);
+ ItemStack aCable01 = aMaterial.getCable01(1);
+ ItemStack aCable02 = aMaterial.getCable02(1);
+ ItemStack aCable04 = aMaterial.getCable04(1);
+ ItemStack aCable08 = aMaterial.getCable08(1);
+ ItemStack aCable12 = aMaterial.getCable12(1);
+ ItemStack aCable16 = aMaterial.getCable16(1);
+ ItemStack aFineWire = aMaterial.getFineWire(1);
+
+ // Adds manual crafting recipe
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aPlate, aWire01 })) {
+ RecipeUtils
+ .addShapedRecipe(aPlate, CI.craftingToolWireCutter, null, null, null, null, null, null, null, aWire01);
+ }
+
+ // Wire mill
+ if (ItemUtils
+ .checkForInvalidItems(new ItemStack[] { aIngot, aWire01, aWire02, aWire04, aWire08, aWire12, aWire16 })) {
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(1),
+ GT_Utility.getIntegratedCircuit(1),
+ aMaterial.getWire01(2),
+ 100,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(1),
+ GT_Utility.getIntegratedCircuit(2),
+ aMaterial.getWire02(1),
+ 150,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(2),
+ GT_Utility.getIntegratedCircuit(4),
+ aMaterial.getWire04(1),
+ 200,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(4),
+ GT_Utility.getIntegratedCircuit(8),
+ aMaterial.getWire08(1),
+ 250,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(6),
+ GT_Utility.getIntegratedCircuit(12),
+ aMaterial.getWire12(1),
+ 300,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(8),
+ GT_Utility.getIntegratedCircuit(16),
+ aMaterial.getWire16(1),
+ 350,
+ 4);
+ }
+
+ if (ItemUtils
+ .checkForInvalidItems(new ItemStack[] { aRod, aWire01, aWire02, aWire04, aWire08, aWire12, aWire16 })) {
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(1),
+ GT_Utility.getIntegratedCircuit(1),
+ aMaterial.getWire01(1),
+ 50,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(2),
+ GT_Utility.getIntegratedCircuit(2),
+ aMaterial.getWire02(1),
+ 100,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(4),
+ GT_Utility.getIntegratedCircuit(4),
+ aMaterial.getWire04(1),
+ 150,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(8),
+ GT_Utility.getIntegratedCircuit(8),
+ aMaterial.getWire08(1),
+ 200,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(12),
+ GT_Utility.getIntegratedCircuit(12),
+ aMaterial.getWire12(1),
+ 250,
+ 4);
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(16),
+ GT_Utility.getIntegratedCircuit(16),
+ aMaterial.getWire16(1),
+ 300,
+ 4);
+ }
+
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aIngot, aFineWire })) {
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getIngot(1),
+ GT_Utility.getIntegratedCircuit(3),
+ aMaterial.getFineWire(8),
+ 100,
+ 4);
+ }
+
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aRod, aFineWire })) {
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getRod(1),
+ GT_Utility.getIntegratedCircuit(3),
+ aMaterial.getFineWire(4),
+ 50,
+ 4);
+ }
+
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aFineWire })) {
+ GT_Values.RA.addWiremillRecipe(
+ aMaterial.getWire01(1),
+ GT_Utility.getIntegratedCircuit(1),
+ aMaterial.getFineWire(4),
+ 200,
+ 8);
+ }
+
+ // Extruder
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aIngot, aWire01 })) {
+ GT_Values.RA
+ .addExtruderRecipe(aIngot, ItemList.Shape_Extruder_Wire.get(0), aMaterial.getWire01(2), 196, 96);
+ }
+
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aCable01, aWire01 })) {
+ GT_Values.RA.addUnboxingRecipe(aCable01, aWire01, null, 100, 8);
+ }
+
+ // Shapeless Down-Crafting
+ // 2x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire02 }, aMaterial.getWire01(2));
+ }
+
+ // 4x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire04 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire04 }, aMaterial.getWire01(4));
+ }
+
+ // 8x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire08 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire08 }, aMaterial.getWire01(8));
+ }
+
+ // 12x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire12 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire12 }, aMaterial.getWire01(12));
+ }
+
+ // 16x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire16 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire16 }, aMaterial.getWire01(16));
+ }
+
+ // 1x -> 2x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire01, aWire01 }, aWire02);
+ }
+
+ // 2x -> 4x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire02, aWire04 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire02, aWire02 }, aWire04);
+ }
+
+ // 4x -> 8x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire04, aWire08 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire04, aWire04 }, aWire08);
+ }
+
+ // 8x -> 12x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire04, aWire08, aWire12 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire04, aWire08 }, aWire12);
+ }
+
+ // 12x -> 16x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire04, aWire12, aWire16 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire04, aWire12 }, aWire16);
+ }
+
+ // 8x -> 16x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire08, aWire16 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire08, aWire08 }, aWire16);
+ }
+
+ // 1x -> 4x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire04 })) {
+ RecipeUtils.addShapelessGregtechRecipe(new ItemStack[] { aWire01, aWire01, aWire01, aWire01 }, aWire04);
+ }
+
+ // 1x -> 8x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire08 })) {
+ RecipeUtils.addShapelessGregtechRecipe(
+ new ItemStack[] { aWire01, aWire01, aWire01, aWire01, aWire01, aWire01, aWire01, aWire01 },
+ aWire08);
+ }
+
+ // Wire to Cable
+ // 1x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aCable01 })) {
+ GT_Values.RA.addAssemblerRecipe(
+ aWire01,
+ CI.getNumberedCircuit(24),
+ FluidUtils.getFluidStack("molten.rubber", 144),
+ aCable01,
+ 100,
+ 8);
+ }
+
+ // 2x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire02, aCable02 })) {
+ GT_Values.RA.addAssemblerRecipe(
+ aWire02,
+ CI.getNumberedCircuit(24),
+ FluidUtils.getFluidStack("molten.rubber", 144),
+ aCable02,
+ 100,
+ 8);
+ }
+
+ // 4x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire04, aCable04 })) {
+ GT_Values.RA.addAssemblerRecipe(
+ aWire04,
+ CI.getNumberedCircuit(24),
+ FluidUtils.getFluidStack("molten.rubber", 288),
+ aCable04,
+ 100,
+ 8);
+ }
+
+ // 8x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire08, aCable08 })) {
+ GT_Values.RA.addAssemblerRecipe(
+ aWire08,
+ CI.getNumberedCircuit(24),
+ FluidUtils.getFluidStack("molten.rubber", 432),
+ aCable08,
+ 100,
+ 8);
+ }
+
+ // 12x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire12, aCable12 })) {
+ GT_Values.RA.addAssemblerRecipe(
+ aWire12,
+ CI.getNumberedCircuit(24),
+ FluidUtils.getFluidStack("molten.rubber", 576),
+ aCable12,
+ 100,
+ 8);
+ }
+
+ // 16x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire16, aCable16 })) {
+ GT_Values.RA.addAssemblerRecipe(
+ aWire16,
+ CI.getNumberedCircuit(24),
+ FluidUtils.getFluidStack("molten.rubber", 720),
+ aCable16,
+ 100,
+ 8);
+ }
+
+ // Assemble small wires into bigger wires
+
+ // 2x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ GT_Values.RA.addAssemblerRecipe(aMaterial.getWire01(2), CI.getNumberedCircuit(2), null, aWire02, 100, 8);
+ }
+
+ // 4x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ GT_Values.RA.addAssemblerRecipe(aMaterial.getWire01(4), CI.getNumberedCircuit(4), null, aWire04, 100, 8);
+ }
+
+ // 8x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ GT_Values.RA.addAssemblerRecipe(aMaterial.getWire01(8), CI.getNumberedCircuit(8), null, aWire08, 100, 8);
+ }
+
+ // 12x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ GT_Values.RA.addAssemblerRecipe(aMaterial.getWire01(12), CI.getNumberedCircuit(12), null, aWire12, 100, 8);
+ }
+
+ // 16x
+ if (ItemUtils.checkForInvalidItems(new ItemStack[] { aWire01, aWire02 })) {
+ GT_Values.RA.addAssemblerRecipe(aMaterial.getWire01(16), CI.getNumberedCircuit(16), null, aWire16, 100, 8);
+ }
+
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCustomHatches.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCustomHatches.java
new file mode 100644
index 0000000000..148ea9bc68
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCustomHatches.java
@@ -0,0 +1,278 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ChiselBus;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_AirIntake;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_AirIntake_Extreme;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler_Adv;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Naquadah;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Reservoir;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Solidifier;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_TurbineProvider;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_SuperBus_Input;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_SuperBus_Output;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GT_MetaTileEntity_Hatch_CustomFluidBase;
+
+public class GregtechCustomHatches {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Custom Fluid Hatches.");
+ run1();
+ if (PollutionUtils.isPollutionEnabled()) {
+ run2();
+ }
+ run3();
+ run4(); // Chisel buses
+ run6(); // Solidifier hatches
+ }
+
+ private static void run1() {
+
+ GregtechItemList.Hatch_Input_Cryotheum.set(
+ new GT_MetaTileEntity_Hatch_CustomFluidBase(
+ FluidUtils.getFluidStack("cryotheum", 1)
+ .getFluid(), // Fluid
+ // to
+ // resitrct
+ // hatch
+ // to
+ 128000, // Capacity
+ 967, // ID
+ "hatch.cryotheum.input.tier.00", // unlocal name
+ "Cryotheum Cooling Hatch" // Local name
+ ).getStackForm(1L));
+
+ GregtechItemList.Hatch_Input_Pyrotheum.set(
+ new GT_MetaTileEntity_Hatch_CustomFluidBase(
+ FluidUtils.getFluidStack("pyrotheum", 1)
+ .getFluid(), // Fluid
+ // to
+ // resitrct
+ // hatch
+ // to
+ 128000, // Capacity
+ 968, // ID
+ "hatch.pyrotheum.input.tier.00", // unlocal name
+ "Pyrotheum Heating Vent" // Local name
+ ).getStackForm(1L));
+
+ GregtechItemList.Hatch_Input_Naquadah.set(
+ new GT_MetaTileEntity_Hatch_Naquadah(
+ 969, // ID
+ "hatch.naquadah.input.tier.00", // unlocal name
+ "Naquadah Reactor Input hatch" // Local name
+ ).getStackForm(1L));
+
+ GregtechItemList.Hatch_Input_TurbineHousing.set(
+ new GT_MetaTileEntity_Hatch_TurbineProvider(
+ 31025, // ID
+ "hatch.turbine.input.tier.00", // unlocal name
+ "Turbine Housing", // Local name
+ 8).getStackForm(1L));
+
+ // Multiblock Air Intake Hatch
+ GregtechItemList.Hatch_Air_Intake.set(
+ new GT_MetaTileEntity_Hatch_AirIntake(861, "hatch.air.intake.tier.00", "Air Intake Hatch", 5)
+ .getStackForm(1L));
+ GregtechItemList.Hatch_Air_Intake_Extreme.set(
+ new GT_MetaTileEntity_Hatch_AirIntake_Extreme(
+ 31070,
+ "hatch.air.intake.tier.01",
+ "Extreme Air Intake Hatch",
+ 6).getStackForm(1L));
+
+ // Multiblock Reservoir Hatch
+ GregtechItemList.Hatch_Reservoir.set(
+ new GT_MetaTileEntity_Hatch_Reservoir(31071, "hatch.water.intake.tier.00", "Reservoir Hatch", 4)
+ .getStackForm(1L));
+
+ // Steam Hatch
+ GregtechItemList.Hatch_Input_Steam.set(
+ new GT_MetaTileEntity_Hatch_CustomFluidBase(
+ FluidUtils.getSteam(1)
+ .getFluid(), // Fluid
+ // to
+ // resitrct
+ // hatch
+ // to
+ 64000, // Capacity
+ 31040, // ID
+ "hatch.steam.input.tier.00", // unlocal name
+ "Steam Hatch" // Local name
+ ).getStackForm(1L));
+ }
+
+ private static void run2() {
+ GregtechItemList.Hatch_Muffler_Adv_LV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30001,
+ "hatch.muffler.adv.tier.01",
+ "Advanced Muffler Hatch (LV)",
+ 1)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_MV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30002,
+ "hatch.muffler.adv.tier.02",
+ "Advanced Muffler Hatch (MV)",
+ 2)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_HV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30003,
+ "hatch.muffler.adv.tier.03",
+ "Advanced Muffler Hatch (HV)",
+ 3)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_EV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30004,
+ "hatch.muffler.adv.tier.04",
+ "Advanced Muffler Hatch (EV)",
+ 4)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_IV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30005,
+ "hatch.muffler.adv.tier.05",
+ "Advanced Muffler Hatch (IV)",
+ 5)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_LuV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30006,
+ "hatch.muffler.adv.tier.06",
+ "Advanced Muffler Hatch (LuV)",
+ 6)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_ZPM.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30007,
+ "hatch.muffler.adv.tier.07",
+ "Advanced Muffler Hatch (ZPM)",
+ 7)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_UV.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30008,
+ "hatch.muffler.adv.tier.08",
+ "Advanced Muffler Hatch (UV)",
+ 8)).getStackForm(1L));
+ GregtechItemList.Hatch_Muffler_Adv_MAX.set(
+ (new GT_MetaTileEntity_Hatch_Muffler_Adv(
+ 30009,
+ "hatch.muffler.adv.tier.09",
+ "Advanced Muffler Hatch (UHV)",
+ 9)).getStackForm(1L));
+ }
+
+ private static void run3() {
+ /*
+ * Super Input Busses
+ */
+
+ int aStartID = 30022;
+
+ GregtechItemList.Hatch_SuperBus_Input_LV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.01", "Super Bus (I) (LV)", 1))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_MV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.02", "Super Bus (I) (MV)", 2))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_HV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.03", "Super Bus (I) (HV)", 3))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_EV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.04", "Super Bus (I) (EV)", 4))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_IV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.05", "Super Bus (I) (IV)", 5))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_LuV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.06", "Super Bus (I) (LuV)", 6))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_ZPM.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.07", "Super Bus (I) (ZPM)", 7))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_UV.set(
+ ((IMetaTileEntity) makeInputBus(aStartID++, "hatch.superbus.input.tier.08", "Super Bus (I) (UV)", 8))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Input_MAX.set(
+ ((IMetaTileEntity) makeInputBus(aStartID, "hatch.superbus.input.tier.09", "Super Bus (I) (UHV)", 9))
+ .getStackForm(1L));
+
+ /*
+ * Super Output Busses
+ */
+ aStartID = 30032;
+ GregtechItemList.Hatch_SuperBus_Output_LV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.01", "Super Bus (O) (LV)", 1))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_MV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.02", "Super Bus (O) (MV)", 2))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_HV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.03", "Super Bus (O) (HV)", 3))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_EV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.04", "Super Bus (O) (EV)", 4))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_IV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.05", "Super Bus (O) (IV)", 5))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_LuV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.06", "Super Bus (O) (LuV)", 6))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_ZPM.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.07", "Super Bus (O) (ZPM)", 7))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_UV.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID++, "hatch.superbus.output.tier.08", "Super Bus (O) (UV)", 8))
+ .getStackForm(1L));
+ GregtechItemList.Hatch_SuperBus_Output_MAX.set(
+ ((IMetaTileEntity) makeOutputBus(aStartID, "hatch.superbus.output.tier.09", "Super Bus (O) (UHV)", 9))
+ .getStackForm(1L));
+ }
+
+ private static GT_MetaTileEntity_SuperBus_Input makeInputBus(int id, String unlocalizedName, String localizedName,
+ int tier) {
+ return new GT_MetaTileEntity_SuperBus_Input(id, unlocalizedName, localizedName, tier);
+ }
+
+ private static GT_MetaTileEntity_SuperBus_Output makeOutputBus(int id, String unlocalizedName, String localizedName,
+ int tier) {
+ return new GT_MetaTileEntity_SuperBus_Output(id, unlocalizedName, localizedName, tier);
+ }
+
+ private static GT_MetaTileEntity_ChiselBus makeChiselBus(int id, String unlocalizedName, String localizedName,
+ int tier) {
+ return new GT_MetaTileEntity_ChiselBus(id, unlocalizedName, localizedName, tier);
+ }
+
+ private static void run4() {
+ int aID = 31778; // 31778 - 31780
+
+ GregtechItemList.GT_MetaTileEntity_ChiselBus_LV
+ .set((makeChiselBus(aID++, "hatch.chisel.tier.01", "Chisel Bus I", 1)).getStackForm(1L));
+ GregtechItemList.GT_MetaTileEntity_ChiselBus_MV
+ .set((makeChiselBus(aID++, "hatch.chisel.tier.02", "Chisel Bus II", 2)).getStackForm(1L));
+ GregtechItemList.GT_MetaTileEntity_ChiselBus_HV
+ .set((makeChiselBus(aID++, "hatch.chisel.tier.03", "Chisel Bus III", 3)).getStackForm(1L));
+
+ }
+
+ private static void run6() {
+ int aID = 31781; // 31781-31784
+
+ GregtechItemList.GT_MetaTileEntity_Solidifier_I.set(
+ new GT_MetaTileEntity_Hatch_Solidifier(aID++, "hatch.solidifier.tier.05", "Solidifier Hatch I", 5)
+ .getStackForm(1L));
+ GregtechItemList.GT_MetaTileEntity_Solidifier_II.set(
+ new GT_MetaTileEntity_Hatch_Solidifier(aID++, "hatch.solidifier.tier.06", "Solidifier Hatch II", 6)
+ .getStackForm(1L));
+ GregtechItemList.GT_MetaTileEntity_Solidifier_III.set(
+ new GT_MetaTileEntity_Hatch_Solidifier(aID++, "hatch.solidifier.tier.07", "Solidifier Hatch III", 7)
+ .getStackForm(1L));
+ GregtechItemList.GT_MetaTileEntity_Solidifier_IV.set(
+ new GT_MetaTileEntity_Hatch_Solidifier(aID, "hatch.solidifier.tier.08", "Solidifier Hatch IV", 8)
+ .getStackForm(1L));
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCyclotron.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCyclotron.java
new file mode 100644
index 0000000000..7a8c160feb
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechCyclotron.java
@@ -0,0 +1,19 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_Cyclotron;
+
+public class GregtechCyclotron {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering COMET Cyclotron.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.COMET_Cyclotron.set(
+ new GregtechMetaTileEntity_Cyclotron(828, "cyclotron.tier.single", "COMET - Compact Cyclotron", 6)
+ .getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechDehydrator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechDehydrator.java
new file mode 100644
index 0000000000..4fccef139e
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechDehydrator.java
@@ -0,0 +1,199 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import static gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT;
+import static gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL;
+import static gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TierEU;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialDehydrator;
+
+public class GregtechDehydrator {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Chemical Dehydrators.");
+ if (CORE.ConfigSwitches.enableMachine_Dehydrators) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ ItemStack coilT1 = new ItemStack(ModItems.itemDehydratorCoil, 1, 0);
+ ItemStack coilT2 = new ItemStack(ModItems.itemDehydratorCoil, 1, 1);
+ ItemStack coilT3 = new ItemStack(ModItems.itemDehydratorCoil, 1, 2);
+ ItemStack coilT4 = new ItemStack(ModItems.itemDehydratorCoil, 1, 3);
+
+ // Make some coils by wrapping wire around a spool.
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(ModItems.itemDehydratorCoilWire, 4, 0),
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Bronze, 1))
+ .itemOutputs(coilT1)
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(ModItems.itemDehydratorCoilWire, 4, 1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Steel, 1))
+ .itemOutputs(coilT2)
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(ModItems.itemDehydratorCoilWire, 4, 2),
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.StainlessSteel, 1))
+ .itemOutputs(coilT3)
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(ModItems.itemDehydratorCoilWire, 4, 3),
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Titanium, 1))
+ .itemOutputs(coilT4)
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_EV / 2)
+ .addTo(assemblerRecipes);
+
+ // Basic
+ GregtechItemList.GT_Dehydrator_MV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 911,
+ "machine.dehydrator.tier.00",
+ "Basic Dehydrator I",
+ 2,
+ new String[] { "This dehydrates your Grapes into Raisins.", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "DEHYDRATOR",
+ new Object[] { "ECE", "WMW", "GPG", 'M', HULL, 'P', ROBOT_ARM, 'E',
+ OrePrefixes.wireFine.get(Materials.RedAlloy), 'C', CIRCUIT, 'W',
+ OrePrefixes.cableGt04.get(Materials.Copper), 'G', OrePrefixes.gearGt.get(Materials.Steel) })
+ .setRecipeCatalystPriority(6)
+ .getStackForm(1L));
+
+ GregtechItemList.GT_Dehydrator_HV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 912,
+ "machine.dehydrator.tier.01",
+ "Basic Dehydrator II",
+ 3,
+ new String[] { "This dehydrates your Grapes into Raisins.", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "DEHYDRATOR",
+ new Object[] { "ECE", "WMW", "GPG", 'M', HULL, 'P', ROBOT_ARM, 'E',
+ OrePrefixes.wireFine.get(Materials.Electrum), 'C', CIRCUIT, 'W',
+ OrePrefixes.cableGt04.get(Materials.Silver), 'G', ALLOY.POTIN.getGear(1) })
+ .setRecipeCatalystPriority(5)
+ .getStackForm(1L));
+
+ // Chemical
+ GregtechItemList.GT_Dehydrator_EV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 813,
+ "advancedmachine.dehydrator.tier.01",
+ "Chemical Dehydrator I",
+ 4,
+ new String[] { "A hangover is the way your body reacts to dehydration.", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "DEHYDRATOR",
+ new Object[] { "ECE", "WMW", "GPG", 'M', HULL, 'P', ROBOT_ARM, 'E', coilT1, 'C', CIRCUIT, 'W',
+ OrePrefixes.cableGt04.get(Materials.Aluminium), 'G', ALLOY.TUMBAGA.getGear(1) })
+ .setRecipeCatalystPriority(4)
+ .getStackForm(1L));
+
+ GregtechItemList.GT_Dehydrator_IV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 814,
+ "advancedmachine.dehydrator.tier.02",
+ "Chemical Dehydrator II",
+ 5,
+ new String[] { "A hangover is the way your body reacts to dehydration.", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "DEHYDRATOR",
+ new Object[] { "ECE", "WMW", "GPG", 'M', HULL, 'P', ROBOT_ARM, 'E', coilT2, 'C', CIRCUIT, 'W',
+ OrePrefixes.cableGt04.get(Materials.Tungsten), 'G', ALLOY.INCONEL_690.getGear(1) })
+ .setRecipeCatalystPriority(3)
+ .getStackForm(1L));
+
+ GregtechItemList.GT_Dehydrator_LuV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 815,
+ "advancedmachine.dehydrator.tier.03",
+ "Chemical Dehydrator III",
+ 6,
+ new String[] { "You could probably make space icecream with this..", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "DEHYDRATOR",
+ new Object[] { "ECE", "WMW", "GPG", 'M', HULL, 'P', ROBOT_ARM, 'E', coilT3, 'C', CIRCUIT, 'W',
+ OrePrefixes.cableGt04.get(Materials.Naquadah), 'G', ALLOY.HASTELLOY_N.getGear(1) })
+ .setRecipeCatalystPriority(2)
+ .getStackForm(1L));
+
+ GregtechItemList.GT_Dehydrator_ZPM.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 816,
+ "advancedmachine.dehydrator.tier.04",
+ "Chemical Dehydrator IV",
+ 7,
+ new String[] { "You can definitely make space icecream with this..", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.chemicalDehydratorRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "DEHYDRATOR",
+ new Object[] { "ECE", "WMW", "GPG", 'M', HULL, 'P', ROBOT_ARM, 'E', coilT4, 'C', CIRCUIT, 'W',
+ OrePrefixes.cableGt04.get(Materials.Osmium), 'G', ALLOY.ZERON_100.getGear(1) })
+ .setRecipeCatalystPriority(1)
+ .getStackForm(1L));
+
+ // Advanced
+ GregtechItemList.Controller_Vacuum_Furnace.set(
+ new GregtechMetaTileEntity_IndustrialDehydrator(995, "multimachine.adv.vacuumfurnace", "Utupu-Tanuri")
+ .getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechEnergyBuffer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechEnergyBuffer.java
new file mode 100644
index 0000000000..4aebd8a7b5
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechEnergyBuffer.java
@@ -0,0 +1,149 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechOreDictNames;
+import gtPlusPlus.xmod.gregtech.common.tileentities.storage.GregtechMetaEnergyBuffer;
+
+public class GregtechEnergyBuffer {
+
+ // Misc Items
+ // public static Item itemBufferCore;
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Energy Buffer Blocks.");
+ run1();
+ }
+
+ private static void run1() {
+
+ // itemBufferCore = new
+ // Item().setUnlocalizedName("itemBufferCore").setCreativeTab(AddToCreativeTab.tabMisc).setTextureName(GTPlusPlus.ID
+ // + ":itemBufferCore");
+
+ // Registry
+ // GameRegistry.registerItem(itemBufferCore, "itemBufferCore");
+ // LanguageRegistry.addName(itemBufferCore, "Buffer Core");
+ // OreDictionary.registerOre("itemBufferCore", itemBufferCore);
+
+ // Energy Buffers
+ GregtechItemList.Energy_Buffer_1by1_ULV.set(
+ new GregtechMetaEnergyBuffer(770, "energybuffer.tier.00", "Ultra Low Voltage Energy Buffer", 0, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_LV.set(
+ new GregtechMetaEnergyBuffer(771, "energybuffer.tier.01", "Low Voltage Energy Buffer", 1, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_MV.set(
+ new GregtechMetaEnergyBuffer(772, "energybuffer.tier.02", "Medium Voltage Energy Buffer", 2, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_HV.set(
+ new GregtechMetaEnergyBuffer(773, "energybuffer.tier.03", "High Voltage Energy Buffer", 3, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_EV.set(
+ new GregtechMetaEnergyBuffer(774, "energybuffer.tier.04", "Extreme Voltage Energy Buffer", 4, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_IV.set(
+ new GregtechMetaEnergyBuffer(775, "energybuffer.tier.05", "Insane Voltage Energy Buffer", 5, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_LuV.set(
+ new GregtechMetaEnergyBuffer(776, "energybuffer.tier.06", "Ludicrous Voltage Energy Buffer", 6, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_ZPM.set(
+ new GregtechMetaEnergyBuffer(777, "energybuffer.tier.07", "ZPM Voltage Energy Buffer", 7, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_UV.set(
+ new GregtechMetaEnergyBuffer(778, "energybuffer.tier.08", "Ultimate Voltage Energy Buffer", 8, "", 1)
+ .getStackForm(1L));
+ GregtechItemList.Energy_Buffer_1by1_MAX.set(
+ new GregtechMetaEnergyBuffer(779, "energybuffer.tier.09", "MAX Voltage Energy Buffer", 9, "", 1)
+ .getStackForm(1L));
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_ULV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_ULV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Lead), Character.valueOf('T'), GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_LV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_LV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Tin), Character.valueOf('T'), GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_MV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_MV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.AnyCopper), Character.valueOf('T'),
+ GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_HV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_HV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Gold), Character.valueOf('T'), GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_EV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_EV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Aluminium), Character.valueOf('T'),
+ GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_IV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_IV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Tungsten), Character.valueOf('T'),
+ GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_LuV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_LuV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Osmium), Character.valueOf('T'), GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_ZPM.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_ZPM, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Osmium), Character.valueOf('T'), GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_UV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_UV, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.Osmium), Character.valueOf('T'), GregtechOreDictNames.buffer_core });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Energy_Buffer_1by1_MAX.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WTW", "WMW", Character.valueOf('M'), ItemList.Hull_MAX, Character.valueOf('W'),
+ OrePrefixes.wireGt08.get(Materials.SuperconductorUHV), Character.valueOf('T'),
+ GregtechOreDictNames.buffer_core });
+ /*
+ * GT_ModHandler.addCraftingRecipe( GregtechItemList.Energy_Buffer_1by1_MAX.get(1L, new Object[0]),
+ * GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE |
+ * GT_ModHandler.RecipeBits.REVERSIBLE | GT_ModHandler.RecipeBits.BUFFERED, new Object[] { "WTW", "WMW",
+ * Character.valueOf('M'), ItemList.Hull_MAX, Character.valueOf('W'),
+ * OrePrefixes.wireGt08.get(Materials.Superconductor), Character.valueOf('T'), GregtechOreDictNames.buffer_core
+ * });
+ */
+
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechFactoryGradeReplacementMultis.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechFactoryGradeReplacementMultis.java
new file mode 100644
index 0000000000..6117631244
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechFactoryGradeReplacementMultis.java
@@ -0,0 +1,44 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialVacuumFreezer;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced.GregtechMetaTileEntity_Adv_DistillationTower;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced.GregtechMetaTileEntity_Adv_EBF;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced.GregtechMetaTileEntity_Adv_Fusion_MK4;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced.GregtechMetaTileEntity_Adv_Fusion_MK5;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced.GregtechMetaTileEntity_Adv_Implosion;
+
+public class GregtechFactoryGradeReplacementMultis {
+
+ public static void run() {
+ run1();
+ }
+
+ private static void run1() {
+ Logger.INFO("Gregtech 5 Content | Registering Advanced GT Multiblock replacements.");
+ GregtechItemList.Machine_Adv_BlastFurnace
+ .set(new GregtechMetaTileEntity_Adv_EBF(963, "multimachine.adv.blastfurnace", "Volcanus").getStackForm(1L));
+ GregtechItemList.Machine_Adv_ImplosionCompressor.set(
+ new GregtechMetaTileEntity_Adv_Implosion(964, "multimachine.adv.implosioncompressor", "Density^2")
+ .getStackForm(1L));
+ GregtechItemList.Industrial_Cryogenic_Freezer.set(
+ new GregtechMetaTileEntity_IndustrialVacuumFreezer(
+ 910,
+ "multimachine.adv.industrialfreezer",
+ "Cryogenic Freezer").getStackForm(1L));
+ GregtechItemList.FusionComputer_UV2.set(
+ new GregtechMetaTileEntity_Adv_Fusion_MK4(965, "fusioncomputer.tier.09", "FusionTech MK IV")
+ .getStackForm(1L));
+ GregtechItemList.FusionComputer_UV3.set(
+ new GregtechMetaTileEntity_Adv_Fusion_MK5(975, "fusioncomputer.tier.10", "FusionTech MK V")
+ .getStackForm(1L));
+
+ // 31021
+ GregtechItemList.Machine_Adv_DistillationTower.set(
+ new GregtechMetaTileEntity_Adv_DistillationTower(
+ 31021,
+ "multimachine.adv.distillationtower",
+ "Dangote Distillus").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechGeothermalThermalGenerator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechGeothermalThermalGenerator.java
new file mode 100644
index 0000000000..2e012ee7f9
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechGeothermalThermalGenerator.java
@@ -0,0 +1,78 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GregtechMetaTileEntityGeothermalGenerator;
+
+public class GregtechGeothermalThermalGenerator {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Geothermal Engines.");
+ if (CORE.ConfigSwitches.enableMachine_GeothermalEngines) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Geothermal_Engine_EV.set(
+ new GregtechMetaTileEntityGeothermalGenerator(
+ 830,
+ "advancedgenerator.geothermalFuel.tier.01",
+ "Basic Geothermal Engine",
+ 4).getStackForm(1L));
+ GregtechItemList.Geothermal_Engine_IV.set(
+ new GregtechMetaTileEntityGeothermalGenerator(
+ 831,
+ "advancedgenerator.geothermalFuel.tier.02",
+ "Turbo Geothermal Engine",
+ 5).getStackForm(1L));
+ GregtechItemList.Geothermal_Engine_LuV.set(
+ new GregtechMetaTileEntityGeothermalGenerator(
+ 832,
+ "advancedgenerator.geothermalFuel.tier.03",
+ "Vulcan Geothermal Engine",
+ 6).getStackForm(1L));
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Geothermal_Engine_EV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "CEC", "GMG", "PWP", Character.valueOf('M'), ItemList.Hull_EV, Character.valueOf('P'),
+ ItemList.Electric_Piston_EV, Character.valueOf('E'), ItemList.Electric_Motor_EV, Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Ultimate), Character.valueOf('W'),
+ OrePrefixes.cableGt04.get(Materials.Aluminium), Character.valueOf('G'),
+ ALLOY.TANTALLOY_61.getGear(1) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Geothermal_Engine_IV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "CEC", "GMG", "PWP", Character.valueOf('M'), ItemList.Hull_IV, Character.valueOf('P'),
+ ItemList.Electric_Piston_IV, Character.valueOf('E'), ItemList.Electric_Motor_IV, Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.SuperconductorUHV), Character.valueOf('W'),
+ OrePrefixes.cableGt04.get(Materials.Platinum), Character.valueOf('G'), ALLOY.STELLITE.getGear(1) });
+
+ final ItemStack INGREDIENT_1 = CI.electricPiston_LuV;
+ final ItemStack INGREDIENT_2 = CI.electricMotor_LuV;
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Geothermal_Engine_LuV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "CEC", "GMG", "PWP", Character.valueOf('M'), ItemList.Hull_LuV, Character.valueOf('P'),
+ INGREDIENT_1, Character.valueOf('E'), INGREDIENT_2, Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Infinite), Character.valueOf('W'),
+ OrePrefixes.cableGt04.get(Materials.Tungsten), Character.valueOf('G'), ALLOY.ZERON_100.getGear(1) });
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechHiAmpTransformer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechHiAmpTransformer.java
new file mode 100644
index 0000000000..2587cb8524
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechHiAmpTransformer.java
@@ -0,0 +1,163 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMetaTransformerHiAmp;
+
+public class GregtechHiAmpTransformer {
+
+ public static void run() {
+
+ long bitsd = GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED;
+ int mID = 877;
+
+ String mHammerName = "Mallet";
+
+ GregtechItemList.Transformer_HA_LV_ULV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.00",
+ "ULV Hi-Amp Transformer",
+ 0,
+ "LV -> ULV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_MV_LV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.01",
+ "LV Hi-Amp Transformer",
+ 1,
+ "MV -> LV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_HV_MV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.02",
+ "MV Hi-Amp Transformer",
+ 2,
+ "HV -> MV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_EV_HV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.03",
+ "HV Hi-Amp Transformer",
+ 3,
+ "EV -> HV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_IV_EV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.04",
+ "EV Hi-Amp Transformer",
+ 4,
+ "IV -> EV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_LuV_IV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.05",
+ "IV Hi-Amp Transformer",
+ 5,
+ "LuV -> IV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_ZPM_LuV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.06",
+ "LuV Hi-Amp Transformer",
+ 6,
+ "ZPM -> LuV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_UV_ZPM.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.07",
+ "ZPM Hi-Amp Transformer",
+ 7,
+ "UV -> ZPM (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ GregtechItemList.Transformer_HA_MAX_UV.set(
+ new GregtechMetaTransformerHiAmp(
+ mID++,
+ "transformer.ha.tier.08",
+ "UV Hi-Amp Transformer",
+ 8,
+ "UHV -> UV (Use Soft " + mHammerName + " to invert)").getStackForm(1L));
+ ItemStack mItem_1;
+ ItemStack mItem_2;
+ ItemStack mItem_3;
+
+ mItem_1 = ItemUtils.simpleMetaStack(
+ ItemUtils.getSimpleStack(GregTech_API.sBlockCasings5)
+ .getItem(),
+ 3,
+ 1);
+ mItem_2 = ItemUtils.simpleMetaStack(
+ ItemUtils.getSimpleStack(GregTech_API.sBlockCasings5)
+ .getItem(),
+ 4,
+ 1);
+ mItem_3 = ItemUtils.simpleMetaStack(
+ ItemUtils.getSimpleStack(GregTech_API.sBlockCasings5)
+ .getItem(),
+ 9,
+ 1);
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_LV_ULV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { " BB", "CM ", " BB", Character.valueOf('M'), ItemList.Transformer_LV_ULV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.Tin), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.Lead) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_MV_LV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { " BB", "CM ", " BB", Character.valueOf('M'), ItemList.Transformer_MV_LV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.AnyCopper), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_HV_MV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { " BB", "CM ", " BB", Character.valueOf('M'), ItemList.Transformer_HV_MV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.Gold), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_EV_HV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", Character.valueOf('M'), ItemList.Transformer_EV_HV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.Aluminium), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.Gold), Character.valueOf('K'), ItemList.Casing_Coil_Cupronickel });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_IV_EV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", Character.valueOf('M'), ItemList.Transformer_IV_EV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.Tungsten), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.Aluminium), Character.valueOf('K'), ItemList.Casing_Coil_Kanthal });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_LuV_IV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", Character.valueOf('M'), ItemList.Transformer_LuV_IV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.VanadiumGallium), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.Tungsten), Character.valueOf('K'), ItemList.Casing_Coil_Nichrome });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_ZPM_LuV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", Character.valueOf('M'), ItemList.Transformer_ZPM_LuV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.Naquadah), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.VanadiumGallium), Character.valueOf('K'), mItem_1 });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_UV_ZPM.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", Character.valueOf('M'), ItemList.Transformer_UV_ZPM,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.NaquadahAlloy), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.Naquadah), Character.valueOf('K'), mItem_2 });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Transformer_HA_MAX_UV.get(1L, new Object[0]),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", Character.valueOf('M'), ItemList.Transformer_MAX_UV,
+ Character.valueOf('C'), OrePrefixes.wireGt04.get(Materials.Bedrockium), Character.valueOf('B'),
+ OrePrefixes.wireGt04.get(Materials.NaquadahAlloy), Character.valueOf('K'), mItem_3 });
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialAlloySmelter.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialAlloySmelter.java
new file mode 100644
index 0000000000..dc176e7356
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialAlloySmelter.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialAlloySmelter;
+
+public class GregtechIndustrialAlloySmelter {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Alloy Smelter Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_AlloySmelter.set(
+ new GregtechMetaTileEntity_IndustrialAlloySmelter(
+ 31023,
+ "industrialalloysmelter.controller.tier.single",
+ "Zyngen").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialArcFurnace.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialArcFurnace.java
new file mode 100644
index 0000000000..3de3da7f88
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialArcFurnace.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialArcFurnace;
+
+public class GregtechIndustrialArcFurnace {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Arc Furnace Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ // Industrial Arc Furnace Multiblock
+ GregtechItemList.Industrial_Arc_Furnace.set(
+ new GregtechMetaTileEntity_IndustrialArcFurnace(
+ 862,
+ "industrialarcfurnace.controller.tier.single",
+ "High Current Industrial Arc Furnace").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialBlastSmelter.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialBlastSmelter.java
new file mode 100644
index 0000000000..e457575391
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialBlastSmelter.java
@@ -0,0 +1,31 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_AlloyBlastSmelter;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.mega.GregTechMetaTileEntity_MegaAlloyBlastSmelter;
+
+public class GregtechIndustrialBlastSmelter {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Alloy Blast Smelter Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_AlloyBlastSmelter) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Alloy Blast Smelter Multiblock
+ GregtechItemList.Industrial_AlloyBlastSmelter.set(
+ new GregtechMetaTileEntity_AlloyBlastSmelter(
+ 810,
+ "industrialsalloyamelter.controller.tier.single",
+ "Alloy Blast Smelter").getStackForm(1L));
+ GregtechItemList.Mega_AlloyBlastSmelter.set(
+ new GregTechMetaTileEntity_MegaAlloyBlastSmelter(
+ 31150,
+ "industrialsalloyamelter.controller.tier.mega",
+ "Mega Alloy Blast Smelter").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCentrifuge.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCentrifuge.java
new file mode 100644
index 0000000000..bc51aaae51
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCentrifuge.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialCentrifuge;
+
+public class GregtechIndustrialCentrifuge {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Centrifuge Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCentrifuge) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Centrifuge Multiblock
+ GregtechItemList.Industrial_Centrifuge.set(
+ new GregtechMetaTileEntity_IndustrialCentrifuge(
+ 790,
+ "industrialcentrifuge.controller.tier.single",
+ "Industrial Centrifuge").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialChisel.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialChisel.java
new file mode 100644
index 0000000000..ae0e2483cf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialChisel.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaTileEntity_AutoChisel;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialChisel;
+
+public class GregtechIndustrialChisel {
+
+ public static void run() {
+ GregtechItemList.GT_Chisel_LV.set(
+ new GregtechMetaTileEntity_AutoChisel(31066, "chisel.tier.01", "Basic Auto-Chisel", 1).getStackForm(1L));
+ GregtechItemList.GT_Chisel_MV.set(
+ new GregtechMetaTileEntity_AutoChisel(31067, "chisel.tier.02", "Advanced Auto-Chisel", 2).getStackForm(1L));
+ GregtechItemList.GT_Chisel_HV.set(
+ new GregtechMetaTileEntity_AutoChisel(31068, "chisel.tier.03", "Precision Auto-Chisel", 3)
+ .getStackForm(1L));
+
+ GregtechItemList.Controller_IndustrialAutoChisel.set(
+ new GregtechMetaTileEntity_IndustrialChisel(
+ 31069,
+ "multimachine.adv.chisel",
+ "Industrial 3D Copying Machine").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCokeOven.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCokeOven.java
new file mode 100644
index 0000000000..af941e58db
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCokeOven.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialCokeOven;
+
+public class GregtechIndustrialCokeOven {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Coke Oven Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCokeOven) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Centrifuge Multiblock
+ GregtechItemList.Industrial_CokeOven.set(
+ new GregtechMetaTileEntity_IndustrialCokeOven(
+ 791,
+ "industrialcokeoven.controller.tier.single",
+ "Industrial Coke Oven").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCuttingFactory.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCuttingFactory.java
new file mode 100644
index 0000000000..c5ff4a9928
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialCuttingFactory.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialCuttingMachine;
+
+public class GregtechIndustrialCuttingFactory {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Cutting Factory Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialCuttingMachine) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Wire Factory Multiblock
+ GregtechItemList.Industrial_CuttingFactoryController.set(
+ new GregtechMetaTileEntity_IndustrialCuttingMachine(
+ 992,
+ "industrialcuttingmachine.controller.tier.01",
+ "Cutting Factory Controller").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElectrolyzer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElectrolyzer.java
new file mode 100644
index 0000000000..a114aaf3cd
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElectrolyzer.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialElectrolyzer;
+
+public class GregtechIndustrialElectrolyzer {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Electrolyzer Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialElectrolyzer) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Electrolyzer Multiblock
+ GregtechItemList.Industrial_Electrolyzer.set(
+ new GregtechMetaTileEntity_IndustrialElectrolyzer(
+ 796,
+ "industrialelectrolyzer.controller.tier.single",
+ "Industrial Electrolyzer").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElementDuplicator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElementDuplicator.java
new file mode 100644
index 0000000000..222a3e7689
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialElementDuplicator.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_ElementalDataOrbHolder;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMTE_ElementalDuplicator;
+
+public class GregtechIndustrialElementDuplicator {
+
+ public static void run() {
+
+ Logger.INFO("Gregtech5u Content | Registering Elemental Duplicator Multiblock.");
+
+ GregtechItemList.Controller_ElementalDuplicator.set(
+ new GregtechMTE_ElementalDuplicator(31050, "gtpp.multimachine.replicator", "Elemental Duplicator")
+ .getStackForm(1L));
+ GregtechItemList.Hatch_Input_Elemental_Duplicator.set(
+ new GT_MetaTileEntity_Hatch_ElementalDataOrbHolder(
+ 31051,
+ "hatch.input_bus.elementalorbholder",
+ "Data Orb Repository",
+ 7).getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialExtruder.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialExtruder.java
new file mode 100644
index 0000000000..817858a4a0
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialExtruder.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialExtruder;
+
+public class GregtechIndustrialExtruder {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Extrusion Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialExtrudingMachine) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Presser Multiblock
+ GregtechItemList.Industrial_Extruder.set(
+ new GregtechMetaTileEntity_IndustrialExtruder(
+ 859,
+ "industrialextruder.controller.tier.single",
+ "Industrial Extrusion Machine").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFishPond.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFishPond.java
new file mode 100644
index 0000000000..182662bfbc
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFishPond.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_IndustrialFishingPond;
+
+public class GregtechIndustrialFishPond {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Fishing Pond Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_FishingPond.set(
+ new GregtechMetaTileEntity_IndustrialFishingPond(
+ 829,
+ "industrial.fishpond.controller.tier.single",
+ "Zhuhai - Fishing Port").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFluidHeater.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFluidHeater.java
new file mode 100644
index 0000000000..e25ef2fcae
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFluidHeater.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialFluidHeater;
+
+public class GregtechIndustrialFluidHeater {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Thermal Centrifuge Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.Controller_IndustrialFluidHeater.set(
+ new GregtechMetaTileEntity_IndustrialFluidHeater(
+ 31077,
+ "industrialfluidheater.controller.tier.single",
+ "Thermic Heating Device").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialForgeHammer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialForgeHammer.java
new file mode 100644
index 0000000000..a73b9fd873
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialForgeHammer.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialForgeHammer;
+
+public class GregtechIndustrialForgeHammer {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Forge Hammer Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.Controller_IndustrialForgeHammer.set(
+ new GregtechMetaTileEntity_IndustrialForgeHammer(
+ 31075,
+ "industrialhammer.controller.tier.single",
+ "Industrial Sledgehammer").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFuelRefinery.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFuelRefinery.java
new file mode 100644
index 0000000000..e45f593c7a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialFuelRefinery.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_Refinery;
+
+public class GregtechIndustrialFuelRefinery {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Fuel Processing and Refinery Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_NuclearFuelRefinery) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Maceration Stack Multiblock
+ GregtechItemList.Industrial_FuelRefinery.set(
+ new GregtechMetaTileEntity_Refinery(
+ 835,
+ "industrialrefinery.controller.tier.single",
+ "Reactor Fuel Processing Plant").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMacerator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMacerator.java
new file mode 100644
index 0000000000..0912660cc1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMacerator.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialMacerator;
+
+public class GregtechIndustrialMacerator {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Maceration Stack Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialMacerationStack) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Maceration Stack Multiblock
+ GregtechItemList.Industrial_MacerationStack.set(
+ new GregtechMetaTileEntity_IndustrialMacerator(
+ 797,
+ "industrialmacerator.controller.tier.single",
+ "Maceration Stack Controller").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMassFabricator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMassFabricator.java
new file mode 100644
index 0000000000..92b7182426
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMassFabricator.java
@@ -0,0 +1,137 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_MassFabricator;
+
+public class GregtechIndustrialMassFabricator {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Matter Fabricator Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_MatterFabricator) {
+ generateRecipes();
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Matter Fabricator Multiblock
+ GregtechItemList.Industrial_MassFab.set(
+ new GregtechMetaTileEntity_MassFabricator(
+ 799,
+ "industrialmassfab.controller.tier.single",
+ "Matter Fabrication CPU").getStackForm(1L));
+ }
+
+ private static void generateRecipes() {
+
+ // Generate Scrap->UUA Recipes
+
+ // Basic UUA1
+ GT_Recipe UUA_From_Scrap = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(9), ItemUtils.getSimpleStack(getScrapPile(), 9) },
+ new ItemStack[] { GT_Values.NI },
+ null,
+ null,
+ new FluidStack[] { GT_Values.NF },
+ new FluidStack[] { Materials.UUAmplifier.getFluid(1) },
+ 9 * 20,
+ 32,
+ 0);
+ // Basic UUA2
+ GT_Recipe UUA_From_ScrapBoxes = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(19), ItemUtils.getSimpleStack(getScrapBox(), 1) },
+ new ItemStack[] { GT_Values.NI },
+ null,
+ null,
+ new FluidStack[] { GT_Values.NF },
+ new FluidStack[] { Materials.UUAmplifier.getFluid(1) },
+ 9 * 20,
+ 32,
+ 0);
+
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.add(UUA_From_Scrap);
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.add(UUA_From_ScrapBoxes);
+
+ // Basic UUM
+ GT_Recipe generateUUM_LV = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(1) },
+ new ItemStack[] { GT_Values.NI },
+ null,
+ null,
+ new FluidStack[] { GT_Values.NF },
+ new FluidStack[] { Materials.UUMatter.getFluid(16) },
+ 160 * 20,
+ 4096,
+ 0);
+
+ // Basic UUM
+ GT_Recipe generateUUMFromUUA_LV = new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(2) },
+ new ItemStack[] { GT_Values.NI },
+ null,
+ null,
+ new FluidStack[] { Materials.UUAmplifier.getFluid(16) },
+ new FluidStack[] { Materials.UUMatter.getFluid(16) },
+ 40 * 20,
+ 4096,
+ 0);
+
+ // Advanced UUM
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.add(
+ new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(3) },
+ new ItemStack[] { GT_Values.NI },
+ null,
+ null,
+ new FluidStack[] { GT_Values.NF },
+ new FluidStack[] { Materials.UUMatter.getFluid(256) },
+ 160 * 20,
+ 65536,
+ 0));
+
+ // Advanced UUM
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.add(
+ new GT_Recipe(
+ false,
+ new ItemStack[] { CI.getNumberedCircuit(4) },
+ new ItemStack[] { GT_Values.NI },
+ null,
+ null,
+ new FluidStack[] { Materials.UUAmplifier.getFluid(256) },
+ new FluidStack[] { Materials.UUMatter.getFluid(256) },
+ 40 * 20,
+ 65536,
+ 0));
+
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.add(generateUUM_LV);
+ GTPPRecipeMaps.multiblockMassFabricatorRecipes.add(generateUUMFromUUA_LV);
+
+ Logger.INFO(
+ "Generated " + GTPPRecipeMaps.multiblockMassFabricatorRecipes.getAllRecipes()
+ .size() + " Matter Fabricator recipes.");
+ }
+
+ public static ItemStack getScrapPile() {
+ return ItemUtils.getSimpleStack(ItemUtils.getItemFromFQRN("IC2:itemScrap"));
+ }
+
+ public static ItemStack getScrapBox() {
+ return ItemUtils.getSimpleStack(ItemUtils.getItemFromFQRN("IC2:itemScrapbox"));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMixer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMixer.java
new file mode 100644
index 0000000000..07d0432213
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMixer.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialMixer;
+
+public class GregtechIndustrialMixer {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Mixer Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialPlatePress) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Mixer Multiblock
+ GregtechItemList.Industrial_Mixer.set(
+ new GregtechMetaTileEntity_IndustrialMixer(
+ 811,
+ "industrialmixer.controller.tier.single",
+ "Industrial Mixing Machine").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMultiMachine.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMultiMachine.java
new file mode 100644
index 0000000000..9ba8810c55
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialMultiMachine.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialMultiMachine;
+
+public class GregtechIndustrialMultiMachine {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Multi-Machine Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialMultiMachine) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_MultiMachine.set(
+ new GregtechMetaTileEntity_IndustrialMultiMachine(
+ 860,
+ "industrialmultimachine.controller.tier.single",
+ "Large Processing Factory").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialPlatePress.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialPlatePress.java
new file mode 100644
index 0000000000..60d93e4cb7
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialPlatePress.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialPlatePress;
+
+public class GregtechIndustrialPlatePress {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Press Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialPlatePress) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Presser Multiblock
+ GregtechItemList.Industrial_PlatePress.set(
+ new GregtechMetaTileEntity_IndustrialPlatePress(
+ 792,
+ "industrialbender.controller.tier.single",
+ "Industrial Material Press").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialRockBreaker.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialRockBreaker.java
new file mode 100644
index 0000000000..3e9efb38cf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialRockBreaker.java
@@ -0,0 +1,15 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_IndustrialRockBreaker;
+
+public class GregtechIndustrialRockBreaker {
+
+ public static void run() {
+ GregtechItemList.Controller_IndustrialRockBreaker.set(
+ new GregtechMetaTileEntity_IndustrialRockBreaker(
+ 31065,
+ "industrialrockcrusher.controller.tier.single",
+ "Boldarnator").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialSifter.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialSifter.java
new file mode 100644
index 0000000000..87f8cc5e44
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialSifter.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialSifter;
+
+public class GregtechIndustrialSifter {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Sifter Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialSifter) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_Sifter.set(
+ new GregtechMetaTileEntity_IndustrialSifter(
+ 840,
+ "industrialsifter.controller.tier.single",
+ "Large Sifter Control Block").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialThermalCentrifuge.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialThermalCentrifuge.java
new file mode 100644
index 0000000000..cf8b585ae9
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialThermalCentrifuge.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialThermalCentrifuge;
+
+public class GregtechIndustrialThermalCentrifuge {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Thermal Centrifuge Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialThermalCentrifuge) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_ThermalCentrifuge.set(
+ new GregtechMetaTileEntity_IndustrialThermalCentrifuge(
+ 849,
+ "industrialthermalcentrifuge.controller.tier.single",
+ "Large Thermal Refinery").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialTreeFarm.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialTreeFarm.java
new file mode 100644
index 0000000000..82a0369516
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialTreeFarm.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntityTreeFarm;
+
+public class GregtechIndustrialTreeFarm {
+
+ public static void run() {
+ if (CORE.ConfigSwitches.enableMultiblock_TreeFarmer) {
+ Logger.INFO("Gregtech5u Content | Registering Tree Farm Multiblock.");
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_TreeFarm.set(
+ new GregtechMetaTileEntityTreeFarm(836, "treefarm.controller.tier.single", "Tree Growth Simulator")
+ .getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWashPlant.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWashPlant.java
new file mode 100644
index 0000000000..982695b02c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWashPlant.java
@@ -0,0 +1,24 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialWashPlant;
+
+public class GregtechIndustrialWashPlant {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Wash Plant Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialWashPlant) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Industrial_WashPlant.set(
+ new GregtechMetaTileEntity_IndustrialWashPlant(
+ 850,
+ "industrialwashplant.controller.tier.single",
+ "Ore Washing Plant").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWiremill.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWiremill.java
new file mode 100644
index 0000000000..853013834b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIndustrialWiremill.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialWireMill;
+
+public class GregtechIndustrialWiremill {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Wire Factory Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_IndustrialWireMill) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Industrial Wire Factory Multiblock
+ GregtechItemList.Industrial_WireFactory.set(
+ new GregtechMetaTileEntity_IndustrialWireMill(
+ 798,
+ "industrialwiremill.controller.tier.single",
+ "Wire Factory Controller").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIsaMill.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIsaMill.java
new file mode 100644
index 0000000000..d1719d4b74
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechIsaMill.java
@@ -0,0 +1,26 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.nbthandlers.GT_MetaTileEntity_Hatch_MillingBalls;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IsaMill;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMTE_FrothFlotationCell;
+
+public class GregtechIsaMill {
+
+ public static void run() {
+
+ Logger.INFO("Gregtech5u Content | Registering Milling Content.");
+
+ GregtechItemList.Controller_IsaMill.set(
+ new GregtechMetaTileEntity_IsaMill(31027, "gtpp.multimachine.isamill", "IsaMill Grinding Machine")
+ .getStackForm(1L));
+ GregtechItemList.Controller_Flotation_Cell.set(
+ new GregtechMTE_FrothFlotationCell(31028, "gtpp.multimachine.flotationcell", "Flotation Cell Regulator")
+ .getStackForm(1L));
+
+ // Milling Ball Bus
+ GregtechItemList.Bus_Milling_Balls
+ .set((new GT_MetaTileEntity_Hatch_MillingBalls(31029, "hatch.milling", "Ball Housing")).getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLFTR.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLFTR.java
new file mode 100644
index 0000000000..3a77c3f569
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLFTR.java
@@ -0,0 +1,93 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_SpargeTower;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMTE_NuclearReactor;
+
+public class GregtechLFTR {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Liquid Fluorine Thorium Reactor [LFTR].");
+ if (CORE.ConfigSwitches.enableMultiblock_LiquidFluorideThoriumReactor) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // LFTR
+ GregtechItemList.ThoriumReactor.set(
+ new GregtechMTE_NuclearReactor(751, "lftr.controller.single", "Thorium Reactor [LFTR]").getStackForm(1L));
+ // Reactor Processing Units
+ GregtechItemList.ReactorProcessingUnit_IV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 31031,
+ "rpu.tier.01",
+ "Reactor Processing Unit I",
+ 5,
+ new String[] { "Processes Nuclear things", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.reactorProcessingUnitRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "REACTOR_PROCESSING_UNIT",
+ null).getStackForm(1L));
+ GregtechItemList.ReactorProcessingUnit_ZPM.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 31032,
+ "rpu.tier.02",
+ "Reactor Processing Unit II",
+ 7,
+ new String[] { "Processes Nuclear things", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.reactorProcessingUnitRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "REACTOR_PROCESSING_UNIT",
+ null).getStackForm(1L));
+ // Cold Traps
+ GregtechItemList.ColdTrap_IV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 31033,
+ "coldtrap.tier.01",
+ "Cold Trap I",
+ 5,
+ new String[] { "Just like the Arctic", "Does not require ice cubes", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.coldTrapRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "COLD_TRAP",
+ null).getStackForm(1L));
+ GregtechItemList.ColdTrap_ZPM.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 31034,
+ "coldtrap.tier.02",
+ "Cold Trap II",
+ 7,
+ new String[] { "Just like the Arctic", "Does not require ice cubes", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.coldTrapRecipes,
+ 2,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "COLD_TRAP",
+ null).getStackForm(1L));
+ // Sparge Tower
+ GregtechItemList.Controller_Sparge_Tower.set(
+ new GregtechMetaTileEntity_SpargeTower(31035, "sparge.controller.single", "Sparge Tower Controller")
+ .getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLargeTurbinesAndHeatExchanger.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLargeTurbinesAndHeatExchanger.java
new file mode 100644
index 0000000000..b75573a9cf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechLargeTurbinesAndHeatExchanger.java
@@ -0,0 +1,48 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import static gregtech.api.enums.Mods.GoodGenerator;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Turbine;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.advanced.GregtechMetaTileEntity_Adv_HeatExchanger;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GT_MTE_LargeTurbine_Gas;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GT_MTE_LargeTurbine_Plasma;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GT_MTE_LargeTurbine_SCSteam;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GT_MTE_LargeTurbine_SHSteam;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.turbines.GT_MTE_LargeTurbine_Steam;
+
+public class GregtechLargeTurbinesAndHeatExchanger {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Larger Turbines & Extra Large Heat Exchanger.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.Large_Steam_Turbine.set(
+ new GT_MTE_LargeTurbine_Steam(865, "multimachine.largerturbine", "XL Turbo Steam Turbine")
+ .getStackForm(1L));
+ GregtechItemList.Large_HPSteam_Turbine.set(
+ new GT_MTE_LargeTurbine_SHSteam(866, "multimachine.largerhpturbine", "XL Turbo HP Steam Turbine")
+ .getStackForm(1L));
+ GregtechItemList.Large_Gas_Turbine.set(
+ new GT_MTE_LargeTurbine_Gas(31073, "multimachine.largergasturbine", "XL Turbo Gas Turbine")
+ .getStackForm(1L));
+ GregtechItemList.Large_Plasma_Turbine.set(
+ new GT_MTE_LargeTurbine_Plasma(31074, "multimachine.largerplasmaturbine", "XL Turbo Plasma Turbine")
+ .getStackForm(1L));
+ if (GoodGenerator.isModLoaded()) {
+ GregtechItemList.Large_SCSteam_Turbine.set(
+ new GT_MTE_LargeTurbine_SCSteam(31076, "multimachine.largerscturbine", "XL Turbo SC Steam Turbine")
+ .getStackForm(1L));
+ }
+ GregtechItemList.Hatch_Turbine_Rotor
+ .set(new GT_MetaTileEntity_Hatch_Turbine(30010, "hatch.turbine", "Rotor Assembly", 8).getStackForm(1L));
+ GregtechItemList.XL_HeatExchanger.set(
+ new GregtechMetaTileEntity_Adv_HeatExchanger(
+ 31079,
+ "multimachine.reallybigheatexchanger",
+ "Whakawhiti Wera XL").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechMolecularTransformer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechMolecularTransformer.java
new file mode 100644
index 0000000000..ebb0bde1cf
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechMolecularTransformer.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialMolecularTransformer;
+
+public class GregtechMolecularTransformer {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Molecular Transformer Multiblock.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.Controller_MolecularTransformer.set(
+ new GregtechMetaTileEntity_IndustrialMolecularTransformer(
+ 31072,
+ "moleculartransformer.controller.tier.single",
+ "Molecular Transformer").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechNuclearSaltProcessingPlant.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechNuclearSaltProcessingPlant.java
new file mode 100644
index 0000000000..0122f525c6
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechNuclearSaltProcessingPlant.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_NuclearSaltProcessingPlant;
+
+public class GregtechNuclearSaltProcessingPlant {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Nuclear Salt Processing Plant Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_NuclearSaltProcessingPlant) {
+ // Nuclear Salt Processing Plant Multiblock
+ GregtechItemList.Nuclear_Salt_Processing_Plant.set(
+ new GregtechMetaTileEntity_NuclearSaltProcessingPlant(
+ 749,
+ "nuclearsaltprocessingplant.controller.tier.single",
+ "Nuclear Salt Processing Plant").getStackForm(1L));
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPollutionDevices.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPollutionDevices.java
new file mode 100644
index 0000000000..fc62698789
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPollutionDevices.java
@@ -0,0 +1,93 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.gregtech.PollutionUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaAtmosphericReconditioner;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaPollutionCreator;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaPollutionDetector;
+
+public class GregtechPollutionDevices {
+
+ public static void run() {
+ if (PollutionUtils.isPollutionEnabled()) {
+ Logger.INFO("Gregtech5u Content | Registering Anti-Pollution Devices.");
+ run1();
+ }
+ }
+
+ private static void run1() {
+ if (CORE.ConfigSwitches.enableMachine_Pollution) {
+ // 759
+ GregtechItemList.Pollution_Detector.set(
+ new GregtechMetaPollutionDetector(
+ 756,
+ "pollutiondetector.01.tier.single",
+ "Pollution Detection Device",
+ 0,
+ "Tells you if you're living in Gwalior yet.",
+ 0).getStackForm(1L));
+ GregtechItemList.Pollution_Creator.set(
+ new GregtechMetaPollutionCreator(
+ 951,
+ "pollutioncreator.01.tier.single",
+ "Smog Device",
+ 4,
+ "Polluting the skies.",
+ 0).getStackForm(1L));
+
+ GregtechItemList.Pollution_Cleaner_LV.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 758,
+ "pollutioncleaner.02.tier.single",
+ "Upgraded Pollution Scrubber",
+ 1).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_MV.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 759,
+ "pollutioncleaner.03.tier.single",
+ "Advanced Pollution Scrubber",
+ 2).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_HV.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 760,
+ "pollutioncleaner.04.tier.single",
+ "Precision Pollution Scrubber",
+ 3).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_EV.set(
+ new GregtechMetaAtmosphericReconditioner(761, "pollutioncleaner.05.tier.single", "Air Recycler", 4)
+ .getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_IV.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 762,
+ "pollutioncleaner.06.tier.single",
+ "Upgraded Air Recycler",
+ 5).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_LuV.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 763,
+ "pollutioncleaner.07.tier.single",
+ "Advanced Air Recycler",
+ 6).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_ZPM.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 764,
+ "pollutioncleaner.08.tier.single",
+ "Precision Air Recycler",
+ 7).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_UV.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 765,
+ "pollutioncleaner.09.tier.single",
+ "Atmospheric Cleaner",
+ 8).getStackForm(1L));
+ GregtechItemList.Pollution_Cleaner_MAX.set(
+ new GregtechMetaAtmosphericReconditioner(
+ 766,
+ "pollutioncleaner.10.tier.single",
+ "Biosphere Cleanser",
+ 9).getStackForm(1L));
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPowerSubStation.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPowerSubStation.java
new file mode 100644
index 0000000000..3fd906b261
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechPowerSubStation.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBattery;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBattery;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.storage.GregtechMetaTileEntity_PowerSubStationController;
+
+public class GregtechPowerSubStation {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Power Substation Node.");
+ if (CORE.ConfigSwitches.enableMultiblock_PowerSubstation) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // Steam Condensors
+ GregtechItemList.PowerSubStation.set(
+ new GregtechMetaTileEntity_PowerSubStationController(
+ 812,
+ "substation.01.input.single",
+ "Power Station Control Node").getStackForm(1L));
+ int tID = 886;
+ GregtechItemList.Hatch_Input_Battery_MV.set(
+ new GT_MetaTileEntity_Hatch_InputBattery(tID++, "hatch.input_battery.tier.00", "Charging Bus (MV)", 2)
+ .getStackForm(1L));
+ GregtechItemList.Hatch_Input_Battery_EV.set(
+ new GT_MetaTileEntity_Hatch_InputBattery(tID++, "hatch.input_battery.tier.01", "Charging Bus (EV)", 4)
+ .getStackForm(1L));
+
+ GregtechItemList.Hatch_Output_Battery_MV.set(
+ new GT_MetaTileEntity_Hatch_OutputBattery(tID++, "hatch.output_battery.tier.00", "Discharging Bus (MV)", 2)
+ .getStackForm(1L));
+ GregtechItemList.Hatch_Output_Battery_EV.set(
+ new GT_MetaTileEntity_Hatch_OutputBattery(tID++, "hatch.output_battery.tier.01", "Discharging Bus (EV)", 4)
+ .getStackForm(1L));
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Input_Battery_MV.get(1L, new Object[0]),
+ CI.bitsd,
+ new Object[] { "C", "M", 'M', ItemList.Hull_MV, 'C', ItemList.Battery_Buffer_2by2_MV });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Input_Battery_EV.get(1L, new Object[0]),
+ CI.bitsd,
+ new Object[] { "C", "M", 'M', ItemList.Hull_EV, 'C', ItemList.Battery_Buffer_4by4_EV });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Output_Battery_MV.get(1L, new Object[0]),
+ CI.bitsd,
+ new Object[] { "M", "C", 'M', ItemList.Hull_MV, 'C', ItemList.Battery_Buffer_2by2_MV });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Hatch_Output_Battery_EV.get(1L, new Object[0]),
+ CI.bitsd,
+ new Object[] { "M", "C", 'M', ItemList.Hull_EV, 'C', ItemList.Battery_Buffer_4by4_EV });
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechQuantumForceTransformer.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechQuantumForceTransformer.java
new file mode 100644
index 0000000000..5943f3bd28
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechQuantumForceTransformer.java
@@ -0,0 +1,20 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_QuantumForceTransformer;
+
+public class GregtechQuantumForceTransformer {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Quantum Force Transformer Multiblock.");
+ if (CORE.ConfigSwitches.enableMultiblock_QuantumForceTransformer) {
+ GregtechItemList.QuantumForceTransformer.set(
+ new GregtechMetaTileEntity_QuantumForceTransformer(
+ 31151,
+ "quantumforcetransformer.controller.tier.single",
+ "Quantum Force Transformer").getStackForm(1L));
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRTG.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRTG.java
new file mode 100644
index 0000000000..5eb148a287
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRTG.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GregtechMetaTileEntity_RTG;
+
+public class GregtechRTG {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering RTG.");
+ run1();
+ }
+
+ private static void run1() {
+ GregtechItemList.RTG.set(
+ new GregtechMetaTileEntity_RTG(
+ 869,
+ "basicgenerator.rtg.tier.01",
+ "Radioisotope Thermoelectric Generator",
+ 3).getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRocketFuelGenerator.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRocketFuelGenerator.java
new file mode 100644
index 0000000000..b2f53d46ba
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechRocketFuelGenerator.java
@@ -0,0 +1,98 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GregtechMetaTileEntityRocketFuelGenerator;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_LargeRocketEngine;
+
+public class GregtechRocketFuelGenerator {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Industrial Rocket Engines.");
+ if (CORE.ConfigSwitches.enableMachine_RocketEngines) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.Controller_RocketEngine.set(
+ new GregtechMetaTileEntity_LargeRocketEngine(
+ 996,
+ "gtpp.multimachine.rocketengine",
+ "Rocketdyne F-1A Engine").getStackForm(1L));
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Controller_RocketEngine.get(1L),
+ CI.bitsd,
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Machine_Multi_DieselEngine.get(1), 'P',
+ ItemList.Electric_Piston_IV, 'E', ItemList.Field_Generator_EV, 'C',
+ OrePrefixes.circuit.get(Materials.Master), 'W', OrePrefixes.cableGt08.get(Materials.Platinum), 'G',
+ ALLOY.MARAGING350.getGear(1) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Casing_RocketEngine.get(1L),
+ CI.bitsd,
+ new Object[] { "PhP", "RFR", "PWP", 'R', OrePrefixes.pipeMedium.get(Materials.TungstenSteel), 'F',
+ ItemList.Casing_RobustTungstenSteel, 'P', ALLOY.NITINOL_60.getGear(1), 'W',
+ OrePrefixes.stickLong.get(Materials.TungstenSteel) });
+
+ GregtechItemList.Rocket_Engine_EV.set(
+ new GregtechMetaTileEntityRocketFuelGenerator(
+ 793,
+ "advancedgenerator.rocketFuel.tier.01",
+ "Basic Rocket Engine",
+ 4).getStackForm(1L));
+ GregtechItemList.Rocket_Engine_IV.set(
+ new GregtechMetaTileEntityRocketFuelGenerator(
+ 794,
+ "advancedgenerator.rocketFuel.tier.02",
+ "Advanced Rocket Engine",
+ 5).getStackForm(1L));
+ GregtechItemList.Rocket_Engine_LuV.set(
+ new GregtechMetaTileEntityRocketFuelGenerator(
+ 795,
+ "advancedgenerator.rocketFuel.tier.03",
+ "Turbo Rocket Engine",
+ 6).getStackForm(1L));
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Rocket_Engine_EV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PCP", "EME", "GWG", Character.valueOf('M'), ItemList.Hull_EV, Character.valueOf('P'),
+ ItemList.Electric_Piston_EV, Character.valueOf('E'), ItemList.Electric_Motor_EV, Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Elite), Character.valueOf('W'),
+ OrePrefixes.cableGt02.get(Materials.Aluminium), Character.valueOf('G'),
+ ALLOY.TANTALLOY_61.getGear(1) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Rocket_Engine_IV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PCP", "EME", "GWG", Character.valueOf('M'), ItemList.Hull_IV, Character.valueOf('P'),
+ ItemList.Electric_Piston_IV, Character.valueOf('E'), ItemList.Electric_Motor_IV, Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Master), Character.valueOf('W'),
+ OrePrefixes.cableGt02.get(Materials.Platinum), Character.valueOf('G'), ALLOY.STELLITE.getGear(1) });
+ final ItemStack INGREDIENT_1 = CI.electricPiston_LuV;
+ final ItemStack INGREDIENT_2 = CI.electricMotor_LuV;
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Rocket_Engine_LuV.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PCP", "EME", "GWG", Character.valueOf('M'), ItemList.Hull_LuV, Character.valueOf('P'),
+ INGREDIENT_1, Character.valueOf('E'), INGREDIENT_2, Character.valueOf('C'),
+ OrePrefixes.circuit.get(Materials.Ultimate), Character.valueOf('W'),
+ OrePrefixes.cableGt02.get(Materials.Tungsten), Character.valueOf('G'), ALLOY.ZERON_100.getGear(1) });
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSemiFluidgenerators.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSemiFluidgenerators.java
new file mode 100644
index 0000000000..be349d2a81
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSemiFluidgenerators.java
@@ -0,0 +1,46 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.generators.GT_MetaTileEntity_SemiFluidGenerator;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_LargeSemifluidGenerator;
+
+public class GregtechSemiFluidgenerators {
+
+ public static void run() {
+ GregtechItemList.Generator_SemiFluid_LV.set(
+ new GT_MetaTileEntity_SemiFluidGenerator(
+ 837,
+ "basicgenerator.semifluid.tier.01",
+ "Basic Semi-Fluid Generator",
+ 1).getStackForm(1L));
+ GregtechItemList.Generator_SemiFluid_MV.set(
+ new GT_MetaTileEntity_SemiFluidGenerator(
+ 838,
+ "basicgenerator.semifluid.tier.02",
+ "Advanced Semi-Fluid Generator",
+ 2).getStackForm(1L));
+ GregtechItemList.Generator_SemiFluid_HV.set(
+ new GT_MetaTileEntity_SemiFluidGenerator(
+ 839,
+ "basicgenerator.semifluid.tier.03",
+ "Turbo Semi-Fluid Generator",
+ 3).getStackForm(1L));
+ GregtechItemList.Generator_SemiFluid_EV.set(
+ new GT_MetaTileEntity_SemiFluidGenerator(
+ 993,
+ "basicgenerator.semifluid.tier.04",
+ "Turbo Semi-Fluid Generator II",
+ 4).getStackForm(1L));
+ GregtechItemList.Generator_SemiFluid_IV.set(
+ new GT_MetaTileEntity_SemiFluidGenerator(
+ 994,
+ "basicgenerator.semifluid.tier.05",
+ "Turbo Semi-Fluid Generator III",
+ 5).getStackForm(1L));
+ GregtechItemList.Controller_LargeSemifluidGenerator.set(
+ new GregtechMetaTileEntity_LargeSemifluidGenerator(
+ 31026,
+ "gtpp.multimachine.semifluidgenerator",
+ "Large Semifluid Burner").getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSimpleWasher.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSimpleWasher.java
new file mode 100644
index 0000000000..15d54a7c6d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSimpleWasher.java
@@ -0,0 +1,166 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
+import com.google.common.collect.ImmutableList;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gtPlusPlus.api.objects.data.Quad;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+
+public class GregtechSimpleWasher {
+
+ public static void run() {
+ if (CORE.ConfigSwitches.enableMachine_SimpleWasher) {
+ generateDirtyDustRecipes();
+ generateDirtyCrushedRecipes();
+ // Register the Simple Washer Entity.
+
+ // The unlocalized names here have inconsistent numbering because there only used to be a simple washer
+ // every other tier, and they were numbered numerically. In order to maintain backwards compatibility,
+ // the tier numbers need to stay as they were.
+ List<Quad<GregtechItemList, Integer, String, String>> washers = ImmutableList.of(
+ new Quad<>(GregtechItemList.SimpleDustWasher_LV, 31790, "simplewasher.01.tier.06", "Simple Washer I"),
+ new Quad<>(GregtechItemList.SimpleDustWasher_MV, 31017, "simplewasher.01.tier.02", "Simple Washer II"),
+ new Quad<>(GregtechItemList.SimpleDustWasher_HV, 31791, "simplewasher.01.tier.07", "Simple Washer III"),
+ new Quad<>(GregtechItemList.SimpleDustWasher_EV, 31018, "simplewasher.01.tier.03", "Simple Washer IV"),
+ new Quad<>(GregtechItemList.SimpleDustWasher_IV, 31792, "simplewasher.01.tier.08", "Simple Washer V"),
+ new Quad<>(GregtechItemList.SimpleDustWasher_LuV, 31019, "simplewasher.01.tier.04", "Simple Washer VI"),
+ new Quad<>(
+ GregtechItemList.SimpleDustWasher_ZPM,
+ 31793,
+ "simplewasher.01.tier.09",
+ "Simple Washer VII"),
+ new Quad<>(
+ GregtechItemList.SimpleDustWasher_UV,
+ 31020,
+ "simplewasher.01.tier.05",
+ "Simple Washer VIII"));
+
+ GregtechItemList.SimpleDustWasher_ULV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 767,
+ "simplewasher.01.tier.01",
+ "Deprecated ULV Simple Washer",
+ 0,
+ new String[] { "It's like an automatic Cauldron for washing dusts.",
+ "§cDEPRECATED: No recipe.§r Make a Simple Washer I.", CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.simpleWasherRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SIMPLE_WASHER",
+ null).setRecipeCatalystPriority(-11)
+ .getStackForm(1L));
+
+ for (int i = 0; i < washers.size(); i++) {
+ Quad<GregtechItemList, Integer, String, String> washer = washers.get(i);
+ int tier = i + 1;
+ washer.getKey()
+ .set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ washer.getValue_1(),
+ washer.getValue_2(),
+ washer.getValue_3(),
+ tier,
+ new String[] { "It's like an automatic Cauldron for washing dusts.",
+ CORE.GT_Tooltip.get() },
+ GTPPRecipeMaps.simpleWasherRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SIMPLE_WASHER",
+ null).setRecipeCatalystPriority(-tier)
+ .getStackForm(1L));
+ }
+ }
+ }
+
+ private static boolean generateDirtyDustRecipes() {
+ int mRecipeCount = 0;
+ // Generate Recipe Map for the Dust Washer.
+ ItemStack dustClean;
+ ItemStack dustDirty;
+ ItemStack dustPure;
+ for (Materials v : Materials.values()) {
+ if (v == Materials.Platinum || v == Materials.Osmium
+ || v == Materials.Iridium
+ || v == Materials.Palladium) {
+ continue;
+ }
+
+ dustClean = GT_OreDictUnificator.get(OrePrefixes.dust, v, 1L);
+ dustDirty = GT_OreDictUnificator.get(OrePrefixes.dustImpure, v, 1L);
+ dustPure = GT_OreDictUnificator.get(OrePrefixes.dustPure, v, 1L);
+ addSimpleWashRecipe(dustDirty, dustClean);
+ addSimpleWashRecipe(dustPure, dustClean);
+ }
+
+ for (Werkstoff v : Werkstoff.werkstoffHashSet) {
+ dustClean = v.hasItemType(OrePrefixes.dust) ? v.get(OrePrefixes.dust) : null;
+ dustDirty = v.hasItemType(OrePrefixes.dustImpure) ? v.get(OrePrefixes.dustImpure) : null;
+ dustPure = v.hasItemType(OrePrefixes.dustPure) ? v.get(OrePrefixes.dustPure) : null;
+ addSimpleWashRecipe(dustDirty, dustClean);
+ addSimpleWashRecipe(dustPure, dustClean);
+ }
+
+ return GTPPRecipeMaps.simpleWasherRecipes.getAllRecipes()
+ .size() > mRecipeCount;
+ }
+
+ private static boolean generateDirtyCrushedRecipes() {
+ int mRecipeCount = GTPPRecipeMaps.simpleWasherRecipes.getAllRecipes()
+ .size();
+ // Generate Recipe Map for the Dust Washer.
+ ItemStack crushedClean;
+ ItemStack crushedDirty;
+ for (Materials v : Materials.values()) {
+ crushedClean = GT_OreDictUnificator.get(OrePrefixes.crushedPurified, v, 1L);
+ crushedDirty = GT_OreDictUnificator.get(OrePrefixes.crushed, v, 1L);
+ addSimpleWashRecipe(crushedDirty, crushedClean);
+ }
+
+ for (Werkstoff v : Werkstoff.werkstoffHashSet) {
+ crushedClean = v.hasItemType(OrePrefixes.crushedPurified) ? v.get(OrePrefixes.crushedPurified) : null;
+ crushedDirty = v.hasItemType(OrePrefixes.crushed) ? v.get(OrePrefixes.crushed) : null;
+ addSimpleWashRecipe(crushedDirty, crushedClean);
+ }
+
+ return GTPPRecipeMaps.simpleWasherRecipes.getAllRecipes()
+ .size() > mRecipeCount;
+ }
+
+ private static void addSimpleWashRecipe(ItemStack aInput, ItemStack aOutput) {
+ if (aInput != null && aOutput != null) {
+ GT_Recipe aRecipe = new GT_Recipe(
+ false,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] {},
+ new FluidStack[] { FluidUtils.getFluidStack("water", 100) },
+ new FluidStack[] {},
+ 5,
+ 8,
+ 0);
+ GTPPRecipeMaps.simpleWasherRecipes.addRecipe(aRecipe);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSolarTower.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSolarTower.java
new file mode 100644
index 0000000000..466e56181b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSolarTower.java
@@ -0,0 +1,46 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import net.minecraftforge.fluids.FluidStack;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.recipe.GTPPRecipeMaps;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.production.GregtechMetaTileEntity_SolarTower;
+import gtPlusPlus.xmod.gregtech.common.tileentities.misc.TileEntitySolarHeater;
+
+public class GregtechSolarTower {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Solar Tower.");
+ run1();
+ }
+
+ private static void run1() {
+ // Solar Tower
+ GregtechItemList.Industrial_Solar_Tower.set(
+ new GregtechMetaTileEntity_SolarTower(863, "solartower.controller.tier.single", "Solar Tower")
+ .getStackForm(1L));
+ GregtechItemList.Solar_Tower_Reflector.set(
+ new TileEntitySolarHeater(
+ 864,
+ "solarreflector.simple.single",
+ "Solar Reflector",
+ 8,
+ "Part of the Clean Green energy movement",
+ 0).getStackForm(1L));
+
+ // NEI recipe
+ GTPPRecipeMaps.solarTowerRecipes.addRecipe(
+ false,
+ null,
+ null,
+ null,
+ null,
+ new FluidStack[] { MISC_MATERIALS.SOLAR_SALT_COLD.getFluidStack(1000) },
+ new FluidStack[] { MISC_MATERIALS.SOLAR_SALT_HOT.getFluidStack(1000) },
+ 0,
+ 0,
+ 0);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSteamMultis.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSteamMultis.java
new file mode 100644
index 0000000000..9c3a73092b
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSteamMultis.java
@@ -0,0 +1,30 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Steam_BusInput;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Steam_BusOutput;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.steam.GregtechMetaTileEntity_SteamCompressor;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.steam.GregtechMetaTileEntity_SteamMacerator;
+
+public class GregtechSteamMultis {
+
+ public static void run() {
+
+ Logger.INFO("Gregtech5u Content | Registering Steam Multiblocks.");
+
+ GregtechItemList.Controller_SteamMaceratorMulti.set(
+ new GregtechMetaTileEntity_SteamMacerator(31041, "gtpp.multimachine.steam.macerator", "Steam Grinder")
+ .getStackForm(1L));
+ GregtechItemList.Controller_SteamCompressorMulti.set(
+ new GregtechMetaTileEntity_SteamCompressor(31078, "gtpp.multimachine.steam.compressor", "Steam Squasher")
+ .getStackForm(1L));
+
+ GregtechItemList.Hatch_Input_Bus_Steam.set(
+ new GT_MetaTileEntity_Hatch_Steam_BusInput(31046, "hatch.input_bus.tier.steam", "Input Bus (Steam)", 0)
+ .getStackForm(1L));
+ GregtechItemList.Hatch_Output_Bus_Steam.set(
+ new GT_MetaTileEntity_Hatch_Steam_BusOutput(31047, "hatch.output_bus.tier.steam", "Output Bus (Steam)", 0)
+ .getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSuperChests.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSuperChests.java
new file mode 100644
index 0000000000..51ff8c879c
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechSuperChests.java
@@ -0,0 +1,30 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.storage.GT_MetaTileEntity_TieredChest;
+
+public class GregtechSuperChests {
+
+ public static void run() {
+ int mId = 946;
+
+ String aSuffix = " [Disabled]";
+
+ GregtechItemList.Super_Chest_LV.set(
+ (new GT_MetaTileEntity_TieredChest(mId++, "super.chest.gtpp.tier.01", "Super Chest I" + aSuffix, 1))
+ .getStackForm(1L));
+ GregtechItemList.Super_Chest_MV.set(
+ (new GT_MetaTileEntity_TieredChest(mId++, "super.chest.gtpp.tier.02", "Super Chest II" + aSuffix, 2))
+ .getStackForm(1L));
+ GregtechItemList.Super_Chest_HV.set(
+ (new GT_MetaTileEntity_TieredChest(mId++, "super.chest.gtpp.tier.03", "Super Chest III" + aSuffix, 3))
+ .getStackForm(1L));
+ GregtechItemList.Super_Chest_EV.set(
+ (new GT_MetaTileEntity_TieredChest(mId++, "super.chest.gtpp.tier.04", "Super Chest IV" + aSuffix, 4))
+ .getStackForm(1L));
+ GregtechItemList.Super_Chest_IV.set(
+ (new GT_MetaTileEntity_TieredChest(mId++, "super.chest.gtpp.tier.05", "Super Chest V" + aSuffix, 5))
+ .getStackForm(1L));
+
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThaumcraftDevices.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThaumcraftDevices.java
new file mode 100644
index 0000000000..a8c8a8fa6d
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThaumcraftDevices.java
@@ -0,0 +1,29 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import static gregtech.api.enums.Mods.Thaumcraft;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaPollutionCreator;
+
+public class GregtechThaumcraftDevices {
+
+ public static void run() {
+ if (Thaumcraft.isModLoaded()) {
+ Logger.INFO("Gregtech5u Content | Registering Thaumcraft content.");
+ run1();
+ }
+ }
+
+ private static void run1() {
+ // 956-960
+ GregtechItemList.Thaumcraft_Researcher.set(
+ new GregtechMetaPollutionCreator(
+ 956,
+ "thaumcraft.gtpp.machine.01",
+ "Arcane Researcher",
+ 5,
+ "Thinking for you.",
+ 0).getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThreadedBuffers.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThreadedBuffers.java
new file mode 100644
index 0000000000..695ae84b38
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechThreadedBuffers.java
@@ -0,0 +1,13 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.storage.creative.GT_MetaTileEntity_InfiniteItemHolder;
+
+public class GregtechThreadedBuffers {
+
+ public static void run() {
+ GregtechItemList.Infinite_Item_Chest.set(
+ (new GT_MetaTileEntity_InfiniteItemHolder(31010, "infinite.chest.tier.01", "Infinite Item Chest", 1))
+ .getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTieredFluidTanks.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTieredFluidTanks.java
new file mode 100644
index 0000000000..b5db00d058
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTieredFluidTanks.java
@@ -0,0 +1,31 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.tileentities.storage.GT_MetaTileEntity_TieredTank;
+
+public class GregtechTieredFluidTanks {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Portable Fluid Tanks.");
+ if (CORE.ConfigSwitches.enableMachine_FluidTanks) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ int ID = 817;
+ Logger.INFO("Only loading ULV-IV tier tanks for New Horizons Modpack.");
+ GregtechItemList.GT_FluidTank_ULV.set(
+ new GT_MetaTileEntity_TieredTank(ID++, "fluidtank.tier.00", "Ultra Low Voltage Fluid Tank", 0)
+ .getStackForm(1L));
+ GregtechItemList.GT_FluidTank_LV.set(
+ new GT_MetaTileEntity_TieredTank(ID++, "fluidtank.tier.01", "Low Voltage Fluid Tank", 1).getStackForm(1L));
+ GregtechItemList.GT_FluidTank_MV.set(
+ new GT_MetaTileEntity_TieredTank(ID++, "fluidtank.tier.02", "Medium Voltage Fluid Tank", 2)
+ .getStackForm(1L));
+ GregtechItemList.GT_FluidTank_HV.set(
+ new GT_MetaTileEntity_TieredTank(ID++, "fluidtank.tier.03", "High Voltage Fluid Tank", 3).getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTreeFarmerTE.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTreeFarmerTE.java
new file mode 100644
index 0000000000..8b1d4be6ee
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechTreeFarmerTE.java
@@ -0,0 +1,21 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.GregtechMetaTreeFarmerStructural;
+
+public class GregtechTreeFarmerTE {
+
+ public static void run() {
+ Logger.INFO("Gregtech5u Content | Registering Tree Farmer Structural Block.");
+ if (CORE.ConfigSwitches.enableMultiblock_TreeFarmer) {
+ run1();
+ }
+ }
+
+ private static void run1() {
+ GregtechItemList.TreeFarmer_Structural
+ .set(new GregtechMetaTreeFarmerStructural(752, "treefarmer.structural", "Farm Keeper", 0).getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechWirelessChargers.java b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechWirelessChargers.java
new file mode 100644
index 0000000000..452c9117ed
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechWirelessChargers.java
@@ -0,0 +1,96 @@
+package gtPlusPlus.xmod.gregtech.registration.gregtech;
+
+import gregtech.api.util.GT_ModHandler;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.gregtech.common.helpers.ChargingHelper;
+import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaWirelessCharger;
+
+public class GregtechWirelessChargers {
+
+ public static void run() {
+
+ Logger.INFO("Gregtech5u Content | Registering Wireless Chargers.");
+
+ long bitsd = GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED;
+ int mID = 890;
+
+ Utils.registerEvent(new ChargingHelper());
+
+ GregtechItemList.Charger_LV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.01.tier.single",
+ "Wireless Charger MK I",
+ 1,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_MV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.02.tier.single",
+ "Wireless Charger MK II",
+ 2,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_HV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.03.tier.single",
+ "Wireless Charger MK III",
+ 3,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_EV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.04.tier.single",
+ "Wireless Charger MK IV",
+ 4,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_IV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.05.tier.single",
+ "Wireless Charger MK V",
+ 5,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_LuV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.06.tier.single",
+ "Wireless Charger MK VI",
+ 6,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_ZPM.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.07.tier.single",
+ "Wireless Charger MK VII",
+ 7,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_UV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.08.tier.single",
+ "Wireless Charger MK VIII",
+ 8,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ GregtechItemList.Charger_UHV.set(
+ new GregtechMetaWirelessCharger(
+ mID++,
+ "wificharger.09.tier.single",
+ "Wireless Charger MK IX",
+ 9,
+ "Hopefully won't give you cancer.",
+ 0).getStackForm(1L));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/ic2/CustomInternalName.java b/gtpp/src/main/java/gtPlusPlus/xmod/ic2/CustomInternalName.java
new file mode 100644
index 0000000000..4d7c19792f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/ic2/CustomInternalName.java
@@ -0,0 +1,23 @@
+package gtPlusPlus.xmod.ic2;
+
+import net.minecraftforge.common.util.EnumHelper;
+
+import ic2.core.init.InternalName;
+
+public class CustomInternalName {
+
+ public static InternalName aHazmatHelmetEx;
+ public static InternalName aHazmatChestEx;
+ public static InternalName aHazmatLegsEx;
+ public static InternalName aHazmatBootsEx;
+
+ public static void init() {
+ aHazmatHelmetEx = EnumHelper
+ .addEnum(InternalName.class, "itemArmorHazmatHelmetEx", new Class[] {}, new Object[] {});
+ aHazmatChestEx = EnumHelper
+ .addEnum(InternalName.class, "itemArmorHazmatChestplateEx", new Class[] {}, new Object[] {});
+ aHazmatLegsEx = EnumHelper
+ .addEnum(InternalName.class, "itemArmorHazmatLeggingsEx", new Class[] {}, new Object[] {});
+ aHazmatBootsEx = EnumHelper.addEnum(InternalName.class, "itemArmorRubBootsEx", new Class[] {}, new Object[] {});
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/ic2/HANDLER_IC2.java b/gtpp/src/main/java/gtPlusPlus/xmod/ic2/HANDLER_IC2.java
new file mode 100644
index 0000000000..475d8d5feb
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/ic2/HANDLER_IC2.java
@@ -0,0 +1,15 @@
+package gtPlusPlus.xmod.ic2;
+
+import gtPlusPlus.xmod.ic2.item.IC2_Items;
+import gtPlusPlus.xmod.ic2.recipe.RECIPE_IC2;
+
+public class HANDLER_IC2 {
+
+ public static void preInit() {
+ IC2_Items.register();
+ }
+
+ public static void postInit() {
+ RECIPE_IC2.initRecipes();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/ic2/item/CustomKineticRotor.java b/gtpp/src/main/java/gtPlusPlus/xmod/ic2/item/CustomKineticRotor.java
new file mode 100644
index 0000000000..82daf41c90
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/ic2/item/CustomKineticRotor.java
@@ -0,0 +1,244 @@
+package gtPlusPlus.xmod.ic2.item;
+
+import static gregtech.api.enums.Mods.EnderIO;
+
+import java.util.List;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.StatCollector;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import ic2.api.item.IKineticRotor;
+import ic2.core.IC2;
+import ic2.core.block.kineticgenerator.gui.GuiWaterKineticGenerator;
+import ic2.core.block.kineticgenerator.gui.GuiWindKineticGenerator;
+
+public class CustomKineticRotor extends Item implements IKineticRotor {
+
+ private final int mTier;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon[] mTextures;
+
+ private static final String[] mRegistrationNames = new String[] { "itemwoodrotor", "itemironrotor",
+ "itemsteelrotor", "itemwcarbonrotor" };
+
+ private static final String[] mUnlocalNames = new String[] { "itemEnergeticRotor", "itemTungstenSteelRotor",
+ "itemVibrantRotor", "itemIridiumRotor", "itemMagnaliumRotor", "itemUltimetRotor", };
+ private static final int[] mMaxDurability = new int[] { 512000, 809600, 1600000, 3200000 };
+ private static final int[] mRadius = new int[] { 9, 11, 13, 15 };
+ private static final float[] mEfficiency = new float[] { 0.9f, 1.0f, 1.2f, 1.5f };
+ private static final int[] mMinWindStrength = new int[] { 12, 14, 16, 18 };
+ private static final int[] mMaxWindStrength = new int[] { 80, 120, 160, 320 };
+
+ private static final ResourceLocation[] mResourceLocations = new ResourceLocation[] {
+ new ResourceLocation(IC2.textureDomain, "textures/items/rotors/rotorEnergeticModel.png"),
+ new ResourceLocation(IC2.textureDomain, "textures/items/rotors/rotorTungstenSteelModel.png"),
+ new ResourceLocation(IC2.textureDomain, "textures/items/rotors/rotorVibrantModel.png"),
+ new ResourceLocation(IC2.textureDomain, "textures/items/rotors/rotorIridiumModel.png"),
+ new ResourceLocation(IC2.textureDomain, "textures/items/rotors/rotorMagnaliumModel.png"),
+ new ResourceLocation(IC2.textureDomain, "textures/items/rotors/rotorUltimetModel.png"), };
+
+ private final int maxWindStrength;
+ private final int minWindStrength;
+ private final int radius;
+ private final float efficiency;
+ private final ResourceLocation renderTexture;
+
+ public CustomKineticRotor(int aTier) {
+ mTier = aTier;
+ this.setMaxStackSize(1);
+ // Handle Differences if EIO is not loaded
+ if (!EnderIO.isModLoaded() && (aTier == 0 || aTier == 2)) {
+ this.renderTexture = mResourceLocations[(aTier == 0 ? 4 : 5)];
+ this.setUnlocalizedName(mUnlocalNames[(aTier == 0 ? 4 : 5)]);
+ } else {
+ this.renderTexture = mResourceLocations[aTier];
+ this.setUnlocalizedName(mUnlocalNames[aTier]);
+ }
+ this.setMaxDamage(mMaxDurability[aTier]);
+ this.radius = mRadius[aTier];
+ this.efficiency = mEfficiency[aTier];
+ this.minWindStrength = mMinWindStrength[aTier];
+ this.maxWindStrength = mMaxWindStrength[aTier];
+ this.setNoRepair();
+ this.setCreativeTab(IC2.tabIC2);
+ GameRegistry.registerItem(this, mRegistrationNames[aTier]);
+ }
+
+ @Override
+ public void setDamage(final ItemStack stack, final int damage) {
+ if (mTier < 3) {
+ super.setDamage(stack, damage);
+ }
+ }
+
+ @Override
+ public void addInformation(final ItemStack itemStack, final EntityPlayer player, final List info, final boolean b) {
+
+ info.add(
+ StatCollector.translateToLocalFormatted(
+ "ic2.itemrotor.wind.info",
+ new Object[] { this.minWindStrength, this.maxWindStrength }));
+
+ GearboxType type = null;
+ if (Minecraft.getMinecraft().currentScreen != null
+ && Minecraft.getMinecraft().currentScreen instanceof GuiWaterKineticGenerator) {
+ type = GearboxType.WATER;
+ } else if (Minecraft.getMinecraft().currentScreen != null
+ && Minecraft.getMinecraft().currentScreen instanceof GuiWindKineticGenerator) {
+ type = GearboxType.WIND;
+ }
+
+ if (type != null) {
+ info.add(StatCollector.translateToLocal("ic2.itemrotor.fitsin." + this.isAcceptedType(itemStack, type)));
+ }
+ }
+
+ @Override
+ public int getDiameter(final ItemStack stack) {
+ return this.radius;
+ }
+
+ @Override
+ public ResourceLocation getRotorRenderTexture(final ItemStack stack) {
+ return this.renderTexture;
+ }
+
+ @Override
+ public float getEfficiency(final ItemStack stack) {
+ return this.efficiency;
+ }
+
+ @Override
+ public int getMinWindStrength(final ItemStack stack) {
+ return this.minWindStrength;
+ }
+
+ @Override
+ public int getMaxWindStrength(final ItemStack stack) {
+ return this.maxWindStrength;
+ }
+
+ @Override
+ public boolean isAcceptedType(final ItemStack stack, final IKineticRotor.GearboxType type) {
+ return (type == IKineticRotor.GearboxType.WIND) || (type == IKineticRotor.GearboxType.WATER);
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return "ic2." + super.getUnlocalizedName().substring(5);
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack itemStack) {
+ return this.getUnlocalizedName();
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack itemStack) {
+ return StatCollector.translateToLocal(this.getUnlocalizedName(itemStack));
+ }
+
+ @Override
+ public boolean showDurabilityBar(ItemStack stack) {
+ return mTier < 3;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIconFromDamage(int meta) {
+ if (!EnderIO.isModLoaded() && (mTier == 0 || mTier == 2)) {
+ if (mTier == 0) {
+ return mTextures[4];
+ } else {
+ return mTextures[5];
+ }
+ } else {
+ return mTextures[mTier];
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIconIndex(ItemStack aIndex) {
+ if (!EnderIO.isModLoaded() && (mTier == 0 || mTier == 2)) {
+ if (mTier == 0) {
+ return mTextures[4];
+ } else {
+ return mTextures[5];
+ }
+ } else {
+ return mTextures[mTier];
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIconFromDamageForRenderPass(int aDmg, int aPass) {
+ if (!EnderIO.isModLoaded() && (mTier == 0 || mTier == 2)) {
+ if (mTier == 0) {
+ return mTextures[4];
+ } else {
+ return mTextures[5];
+ }
+ } else {
+ return mTextures[mTier];
+ }
+ }
+
+ @Override
+ protected String getIconString() {
+ return super.getIconString();
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ return super.getDurabilityForDisplay(stack);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
+ if (!EnderIO.isModLoaded() && (mTier == 0 || mTier == 2)) {
+ if (mTier == 0) {
+ return mTextures[4];
+ } else {
+ return mTextures[5];
+ }
+ } else {
+ return mTextures[mTier];
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(ItemStack stack, int pass) {
+ if (!EnderIO.isModLoaded() && (mTier == 0 || mTier == 2)) {
+ if (mTier == 0) {
+ return mTextures[4];
+ } else {
+ return mTextures[5];
+ }
+ } else {
+ return mTextures[mTier];
+ }
+ }
+
+ @Override
+ public void registerIcons(IIconRegister iconRegister) {
+ int aIndex = 0;
+ mTextures = new IIcon[6];
+ for (String y : mUnlocalNames) {
+ mTextures[aIndex++] = iconRegister.registerIcon(IC2.textureDomain + ":" + "rotors/" + y);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/ic2/item/IC2_Items.java b/gtpp/src/main/java/gtPlusPlus/xmod/ic2/item/IC2_Items.java
new file mode 100644
index 0000000000..3dacc657de
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/ic2/item/IC2_Items.java
@@ -0,0 +1,77 @@
+package gtPlusPlus.xmod.ic2.item;
+
+import static gregtech.api.enums.Mods.EnderIO;
+
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.item.base.CoreItem;
+import gtPlusPlus.core.item.wearable.hazmat.ItemArmorHazmatEx;
+
+public class IC2_Items {
+
+ public static ItemStack rotor_Material_1; // Energetic Alloy
+ public static ItemStack rotor_Material_2; // TungstenSteel
+ public static ItemStack rotor_Material_3; // Vibrant Alloy
+ public static ItemStack rotor_Material_4; // Iridium
+
+ public static ItemStack rotor_Blade_Material_1;
+ public static ItemStack rotor_Blade_Material_2;
+ public static ItemStack rotor_Blade_Material_3;
+ public static ItemStack rotor_Blade_Material_4;
+
+ public static ItemStack shaft_Material_1; // Energetic Alloy
+ public static ItemStack shaft_Material_2; // TungstenSteel
+ public static ItemStack shaft_Material_3; // Vibrant Alloy
+ public static ItemStack shaft_Material_4; // Iridium
+
+ private static final String[] mData1 = new String[] { "itemEnergeticRotorBlade", "itemMagnaliumRotorBlade" };
+ private static final String[] mData2 = new String[] { "itemEnergeticShaft", "itemMagnaliumShaft" };
+ private static final String[] mData3 = new String[] { "itemVibrantRotorBlade", "itemUltimetRotorBlade" };
+ private static final String[] mData4 = new String[] { "itemVibrantShaft", "itemUltimetShaft" };
+
+ public static void register() {
+
+ int aIndexEIO = (EnderIO.isModLoaded() ? 0 : 1);
+
+ // Rotor Blades
+ rotor_Blade_Material_1 = new ItemStack(
+ new CoreItem(mData1[aIndexEIO], AddToCreativeTab.tabMachines, 16, "A part for an advanced Kinetic Rotor"));
+ rotor_Blade_Material_2 = new ItemStack(
+ new CoreItem(
+ "itemTungstenSteelRotorBlade",
+ AddToCreativeTab.tabMachines,
+ 16,
+ "A part for an advanced Kinetic Rotor"));
+ rotor_Blade_Material_3 = new ItemStack(
+ new CoreItem(mData3[aIndexEIO], AddToCreativeTab.tabMachines, 16, "A part for an advanced Kinetic Rotor"));
+ rotor_Blade_Material_4 = new ItemStack(
+ new CoreItem(
+ "itemIridiumRotorBlade",
+ AddToCreativeTab.tabMachines,
+ 16,
+ "A part for an advanced Kinetic Rotor"));
+
+ // Rotor Shafts
+ shaft_Material_1 = new ItemStack(
+ new CoreItem(mData2[aIndexEIO], AddToCreativeTab.tabMachines, 16, "A part for an advanced Kinetic Rotor"));
+ shaft_Material_2 = new ItemStack(
+ new CoreItem(
+ "itemTungstenSteelShaft",
+ AddToCreativeTab.tabMachines,
+ 16,
+ "A part for an advanced Kinetic Rotor"));
+ shaft_Material_3 = new ItemStack(
+ new CoreItem(mData4[aIndexEIO], AddToCreativeTab.tabMachines, 16, "A part for an advanced Kinetic Rotor"));
+ shaft_Material_4 = new ItemStack(
+ new CoreItem("itemIridiumShaft", AddToCreativeTab.tabMachines, 16, "A part for an advanced Kinetic Rotor"));
+
+ // Rotors
+ rotor_Material_1 = new ItemStack(new CustomKineticRotor(0));
+ rotor_Material_2 = new ItemStack(new CustomKineticRotor(1));
+ rotor_Material_3 = new ItemStack(new CustomKineticRotor(2));
+ rotor_Material_4 = new ItemStack(new CustomKineticRotor(3));
+
+ ItemArmorHazmatEx.init();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/ic2/recipe/RECIPE_IC2.java b/gtpp/src/main/java/gtPlusPlus/xmod/ic2/recipe/RECIPE_IC2.java
new file mode 100644
index 0000000000..47ec1afe0f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/ic2/recipe/RECIPE_IC2.java
@@ -0,0 +1,365 @@
+package gtPlusPlus.xmod.ic2.recipe;
+
+import static gregtech.api.enums.Mods.EnderIO;
+import static gtPlusPlus.core.recipe.RECIPES_Tools.craftingToolHardHammer;
+import static gtPlusPlus.core.recipe.RECIPES_Tools.craftingToolWrench;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.ALLOY;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.minecraft.MaterialUtils;
+import gtPlusPlus.core.util.minecraft.RecipeUtils;
+import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList;
+import gtPlusPlus.xmod.ic2.item.IC2_Items;
+import ic2.core.Ic2Items;
+
+public class RECIPE_IC2 {
+
+ public static String plate_T1 = "plateEnergeticAlloy";
+ public static String plate_T2 = "plateTungstenSteel";
+ public static String plate_T3 = "plateVibrantAlloy";
+ public static String plate_T4 = "plateAlloyIridium";
+
+ public static ItemStack block_T1 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.EnergeticAlloy, 1L);
+ public static ItemStack block_T2 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 1L);
+ public static ItemStack block_T3 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.VibrantAlloy, 1L);
+ public static ItemStack block_T4 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iridium, 1L);
+
+ public static ItemStack shaft_block_T1 = GT_OreDictUnificator.get(OrePrefixes.block, Materials.EnergeticAlloy, 1L);
+ public static ItemStack shaft_block_T2 = GT_OreDictUnificator.get(OrePrefixes.block, Materials.TungstenSteel, 1L);
+ public static ItemStack shaft_block_T3 = GT_OreDictUnificator.get(OrePrefixes.block, Materials.VibrantAlloy, 1L);
+ public static ItemStack shaft_block_T4 = GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iridium, 1L);
+
+ public static String ingot_T1 = "ingotEnergeticAlloy";
+ public static String ingot_T2 = "ingotTungstenSteel";
+ public static String ingot_T3 = "ingotVibrantAlloy";
+ public static String ingot_T4 = "ingotIridium";
+
+ public static String ring_T1 = "ringStainlessSteel";
+ public static String ring_T2 = "ringTungstenSteel";
+ public static String ring_T3 = "ringChrome";
+ public static String ring_T4 = "ringOsmiridium";
+
+ private static ItemStack rotor_blade_T1 = ItemUtils.getSimpleStack(IC2_Items.rotor_Blade_Material_1.getItem());
+ private static ItemStack rotor_blade_T2 = ItemUtils.getSimpleStack(IC2_Items.rotor_Blade_Material_2.getItem());
+ private static ItemStack rotor_blade_T3 = ItemUtils.getSimpleStack(IC2_Items.rotor_Blade_Material_3.getItem());
+ private static ItemStack rotor_blade_T4 = ItemUtils.getSimpleStack(IC2_Items.rotor_Blade_Material_4.getItem());
+
+ private static ItemStack shaft_T1 = ItemUtils.getSimpleStack(IC2_Items.shaft_Material_1.getItem());
+ private static ItemStack shaft_T2 = ItemUtils.getSimpleStack(IC2_Items.shaft_Material_2.getItem());
+ private static ItemStack shaft_T3 = ItemUtils.getSimpleStack(IC2_Items.shaft_Material_3.getItem());
+ private static ItemStack shaft_T4 = ItemUtils.getSimpleStack(IC2_Items.shaft_Material_4.getItem());
+
+ private static ItemStack rotor_T1 = ItemUtils.getSimpleStack(IC2_Items.rotor_Material_1.getItem());
+ private static ItemStack rotor_T2 = ItemUtils.getSimpleStack(IC2_Items.rotor_Material_2.getItem());
+ private static ItemStack rotor_T3 = ItemUtils.getSimpleStack(IC2_Items.rotor_Material_3.getItem());
+ private static ItemStack rotor_T4 = ItemUtils.getSimpleStack(IC2_Items.rotor_Material_4.getItem());
+
+ private static boolean checkForEnderIO() {
+ if (!EnderIO.isModLoaded()) {
+ plate_T1 = "plateMagnalium";
+ plate_T2 = "plateTungstenSteel";
+ plate_T3 = "plateUltimet";
+ plate_T4 = "plateAlloyIridium";
+
+ block_T1 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Magnalium, 1L);
+ block_T2 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 1L);
+ block_T3 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Ultimet, 1L);
+ block_T4 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iridium, 1L);
+
+ ingot_T1 = "ingotMagnalium";
+ ingot_T2 = "ingotTungstenSteel";
+ ingot_T3 = "ingotUltimet";
+ ingot_T4 = "ingotIridium";
+ return true;
+ }
+ return false;
+ }
+
+ public static void initRecipes() {
+
+ checkForEnderIO();
+ addAdvancedHazmat();
+
+ RecipeUtils.addShapedRecipe(
+ plate_T1,
+ plate_T1,
+ plate_T1,
+ plate_T1,
+ ring_T1,
+ plate_T1,
+ plate_T1,
+ plate_T1,
+ plate_T1,
+ rotor_blade_T1);
+
+ RecipeUtils.addShapedRecipe(
+ plate_T2,
+ plate_T2,
+ plate_T2,
+ plate_T2,
+ ring_T2,
+ plate_T2,
+ plate_T2,
+ plate_T2,
+ plate_T2,
+ rotor_blade_T2);
+
+ RecipeUtils.addShapedRecipe(
+ plate_T3,
+ plate_T3,
+ plate_T3,
+ plate_T3,
+ ring_T3,
+ plate_T3,
+ plate_T3,
+ plate_T3,
+ plate_T3,
+ rotor_blade_T3);
+
+ RecipeUtils.addShapedRecipe(
+ plate_T4,
+ plate_T4,
+ plate_T4,
+ plate_T4,
+ ring_T4,
+ plate_T4,
+ plate_T4,
+ plate_T4,
+ plate_T4,
+ rotor_blade_T4);
+
+ // Shaft Extruder Recipe
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "hXS", "XPX", "fXd", Character.valueOf('P'), ItemList.Shape_Extruder_Rod,
+ Character.valueOf('X'), OrePrefixes.plate.get(Materials.DarkSteel), Character.valueOf('S'),
+ OrePrefixes.screw.get(Materials.DarkSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "hXS", "XPX", "fXd", Character.valueOf('P'), ItemList.Shape_Extruder_Rod,
+ Character.valueOf('X'), OrePrefixes.plate.get(Materials.TungstenSteel), Character.valueOf('S'),
+ OrePrefixes.screw.get(Materials.TungstenSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(1L, new Object[0]),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "hXS", "XPX", "fXd", Character.valueOf('P'), ItemList.Shape_Extruder_Rod,
+ Character.valueOf('X'), OrePrefixes.plate.get(Materials.Molybdenum), Character.valueOf('S'),
+ OrePrefixes.screw.get(Materials.Molybdenum) });
+ Logger.INFO("Added recipe item for GT5 Extruder: Shaft Shape");
+
+ // Custm Recipes for Iron and Steel
+ ItemStack mShaftIron = ItemList.IC2_ShaftIron.get(1);
+ ItemStack mShaftSteel = ItemList.IC2_ShaftSteel.get(1);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L)),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ mShaftIron,
+ 32 * 20,
+ 120);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L)),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ mShaftIron,
+ 32 * 20,
+ 120);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.WroughtIron, 1L)),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ mShaftIron,
+ 32 * 20,
+ 120);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, GT_OreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L)),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ mShaftIron,
+ 32 * 20,
+ 120);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L)),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ mShaftSteel,
+ 64 * 20,
+ 120);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, GT_OreDictUnificator.get(OrePrefixes.block, Materials.Steel, 1L)),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ mShaftSteel,
+ 64 * 20,
+ 120);
+
+ // Shaft Recipes
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, block_T1),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T1,
+ 2560,
+ 250);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, shaft_block_T1),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T1,
+ 2560,
+ 250);
+ Logger.INFO("Added recipe for GT5 Extruder: Windmill Shaft [Energetic]");
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, block_T2),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T2,
+ 5120,
+ 500);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, shaft_block_T2),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T2,
+ 5120,
+ 500);
+
+ Logger.INFO("Added recipe for GT5 Extruder: Windmill Shaft [TungstenSteel]");
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, block_T3),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T3,
+ 10240,
+ 2000);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, shaft_block_T3),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T3,
+ 10240,
+ 2000);
+ Logger.INFO("Added recipe for GT5 Extruder: Windmill Shaft [Vibrant]");
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(9L, block_T4),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T4,
+ 20480,
+ 4000);
+ GT_Values.RA.addExtruderRecipe(
+ GT_Utility.copyAmount(1L, shaft_block_T4),
+ GregtechItemList.Shape_Extruder_WindmillShaft.get(0L, new Object[0]),
+ shaft_T4,
+ 20480,
+ 4000);
+ Logger.INFO("Added recipe for GT5 Extruder: Windmill Shaft [Iridium]");
+
+ RecipeUtils.addShapedRecipe(
+ shaft_T1,
+ rotor_blade_T1,
+ craftingToolHardHammer,
+ rotor_blade_T1,
+ ring_T1,
+ rotor_blade_T1,
+ craftingToolWrench,
+ rotor_blade_T1,
+ shaft_T1,
+ rotor_T1);
+
+ RecipeUtils.addShapedRecipe(
+ shaft_T2,
+ rotor_blade_T2,
+ craftingToolHardHammer,
+ rotor_blade_T2,
+ ring_T2,
+ rotor_blade_T2,
+ craftingToolWrench,
+ rotor_blade_T2,
+ shaft_T2,
+ rotor_T2);
+
+ RecipeUtils.addShapedRecipe(
+ shaft_T3,
+ rotor_blade_T3,
+ craftingToolHardHammer,
+ rotor_blade_T3,
+ ring_T3,
+ rotor_blade_T3,
+ craftingToolWrench,
+ rotor_blade_T3,
+ shaft_T3,
+ rotor_T3);
+
+ RecipeUtils.addShapedRecipe(
+ shaft_T4,
+ rotor_blade_T4,
+ craftingToolHardHammer,
+ rotor_blade_T4,
+ ring_T4,
+ rotor_blade_T4,
+ craftingToolWrench,
+ rotor_blade_T4,
+ shaft_T4,
+ rotor_T4);
+ }
+
+ private static void addAdvancedHazmat() {
+
+ ItemStack[] aBasicHazmatPieces = new ItemStack[] { Ic2Items.hazmatHelmet.copy(),
+ Ic2Items.hazmatChestplate.copy(), Ic2Items.hazmatLeggings.copy(), Ic2Items.hazmatBoots.copy() };
+
+ Material aRubber = MaterialUtils.generateMaterialFromGtENUM(Materials.Rubber);
+ ItemStack aYellowWool = ItemUtils.getSimpleStack(Blocks.wool, 4, 1);
+ ItemStack aBlackWool = ItemUtils.getSimpleStack(Blocks.wool, 15, 1);
+ ItemStack aCoilIC2 = Ic2Items.coil;
+ ItemStack aPlateCobalt = CI.getTieredComponentOfMaterial(Materials.Cobalt, OrePrefixes.plate, 1);
+ ItemStack aGearSmallSteel = CI.getTieredComponentOfMaterial(Materials.Steel, OrePrefixes.gearGtSmall, 1);
+ ItemStack aGearSmallAluminium = CI
+ .getTieredComponentOfMaterial(Materials.Aluminium, OrePrefixes.gearGtSmall, 1);
+ ItemStack aGearPotin = ALLOY.TUMBAGA.getGear(1);
+ ItemStack aGearSiliconCarbide = ALLOY.SILICON_CARBIDE.getGear(1);
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(2), aBasicHazmatPieces[0],
+ ItemUtils.getSimpleStack(aYellowWool, 16), ItemUtils.getSimpleStack(aPlateCobalt, 4),
+ ItemUtils.getSimpleStack(aCoilIC2, 8), ItemUtils.getSimpleStack(aGearSmallAluminium, 4), },
+ aRubber.getFluidStack(144 * 4),
+ GregtechItemList.Armour_Hazmat_Advanced_Helmet.get(1),
+ 30 * 20,
+ MaterialUtils.getVoltageForTier(2));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(2), aBasicHazmatPieces[1],
+ ItemUtils.getSimpleStack(aYellowWool, 64), ItemUtils.getSimpleStack(aCoilIC2, 32),
+ ItemUtils.getSimpleStack(aPlateCobalt, 16), ItemUtils.getSimpleStack(aGearSiliconCarbide, 8), },
+ aRubber.getFluidStack(144 * 10),
+ GregtechItemList.Armour_Hazmat_Advanced_Chest.get(1),
+ 90 * 20,
+ MaterialUtils.getVoltageForTier(2));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(2), aBasicHazmatPieces[2],
+ ItemUtils.getSimpleStack(aYellowWool, 32), ItemUtils.getSimpleStack(aCoilIC2, 16),
+ ItemUtils.getSimpleStack(aPlateCobalt, 8), ItemUtils.getSimpleStack(aGearSiliconCarbide, 4), },
+ aRubber.getFluidStack(144 * 8),
+ GregtechItemList.Armour_Hazmat_Advanced_Legs.get(1),
+ 75 * 20,
+ MaterialUtils.getVoltageForTier(2));
+
+ CORE.RA.addSixSlotAssemblingRecipe(
+ new ItemStack[] { CI.getNumberedAdvancedCircuit(2), aBasicHazmatPieces[3],
+ ItemUtils.getSimpleStack(aBlackWool, 16), ItemUtils.getSimpleStack(aCoilIC2, 6),
+ ItemUtils.getSimpleStack(aGearSmallSteel, 8), ItemUtils.getSimpleStack(aGearPotin, 4), },
+ aRubber.getFluidStack(144 * 6),
+ GregtechItemList.Armour_Hazmat_Advanced_Boots.get(1),
+ 45 * 20,
+ MaterialUtils.getVoltageForTier(2));
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/pamsharvest/fishtrap/FishTrapHandler.java b/gtpp/src/main/java/gtPlusPlus/xmod/pamsharvest/fishtrap/FishTrapHandler.java
new file mode 100644
index 0000000000..ee51f28eaa
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/pamsharvest/fishtrap/FishTrapHandler.java
@@ -0,0 +1,73 @@
+package gtPlusPlus.xmod.pamsharvest.fishtrap;
+
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+
+public class FishTrapHandler {
+
+ static final String prefix = "food";
+ static final String suffix = "raw";
+ static final String greenheartFish = "foodGreenheartfish";
+ private static final String[] harvestcraftFish = { "Anchovy", "Bass", "Calamari", "Carp", "Catfish", "Charr",
+ "Clam", "Crab", "Crayfish", "Eel", "Frog", "Grouper", "Herring", "Jellyfish", "Mudfish", "Octopus", "Perch",
+ "Scallop", "Shrimp", "Snail", "Snapper", "Tilapia", "Trout", "Tuna", "Turtle", "Walley" };
+
+ public static void pamsHarvestCraftCompat() {
+ for (String fish : harvestcraftFish) {
+ final String itemName = prefix + fish + suffix;
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken(itemName, 1) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict(itemName, 1))
+ .itemOutputs(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustMeatRaw", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyBone", 1))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict(itemName, 1))
+ .fluidOutputs(FluidUtils.getFluidStack("methane", 48))
+ .duration(19 * SECONDS + 4 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict(itemName, 1))
+ .fluidOutputs(FluidUtils.getFluidStack("fishoil", 50))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+ }
+ }
+ if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken(greenheartFish, 1) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict(greenheartFish, 1))
+ .itemOutputs(
+ ItemUtils.getItemStackOfAmountFromOreDict("dustMeatRaw", 1),
+ ItemUtils.getItemStackOfAmountFromOreDict("dustTinyBone", 1))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict(greenheartFish, 1))
+ .fluidOutputs(FluidUtils.getFluidStack("methane", 48))
+ .duration(19 * SECONDS + 4 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemUtils.getItemStackOfAmountFromOreDict(greenheartFish, 1))
+ .fluidOutputs(FluidUtils.getFluidStack("fishoil", 50))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/railcraft/HANDLER_Railcraft.java b/gtpp/src/main/java/gtPlusPlus/xmod/railcraft/HANDLER_Railcraft.java
new file mode 100644
index 0000000000..4efa85992a
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/railcraft/HANDLER_Railcraft.java
@@ -0,0 +1,217 @@
+package gtPlusPlus.xmod.railcraft;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+import static gtPlusPlus.core.creative.AddToCreativeTab.tabMisc;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gtPlusPlus.core.item.ModItems;
+import gtPlusPlus.core.item.base.BaseItemBurnable;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.railcraft.utils.RailcraftUtils;
+
+public class HANDLER_Railcraft {
+
+ public static void preInit() {
+ // Register Custom Coal Coke
+ ModItems.itemCoalCoke = new BaseItemBurnable(
+ "itemCoalCoke",
+ "Coking Coal",
+ tabMisc,
+ 64,
+ 0,
+ "Used for metallurgy.",
+ "fuelCoke",
+ 3200,
+ 0).setTextureName(GTPlusPlus.ID + ":burnables/itemCoalCoke");
+
+ // Add in things that once existed in 1.5.2
+ ModItems.itemCactusCharcoal = new BaseItemBurnable(
+ "itemCactusCharcoal",
+ "Cactus Charcoal",
+ tabMisc,
+ 64,
+ 0,
+ "Used for smelting.",
+ "fuelCactusCharcoal",
+ 400,
+ 0).setTextureName(GTPlusPlus.ID + ":burnables/itemCactusCharcoal");
+ ModItems.itemSugarCharcoal = new BaseItemBurnable(
+ "itemSugarCharcoal",
+ "Sugar Charcoal",
+ tabMisc,
+ 64,
+ 0,
+ "Used for smelting.",
+ "fuelSugarCharcoal",
+ 400,
+ 0).setTextureName(GTPlusPlus.ID + ":burnables/itemSugarCharcoal");
+ ModItems.itemCactusCoke = new BaseItemBurnable(
+ "itemCactusCoke",
+ "Cactus Coke",
+ tabMisc,
+ 64,
+ 0,
+ "Used for smelting.",
+ "fuelCactusCoke",
+ 800,
+ 0).setTextureName(GTPlusPlus.ID + ":burnables/itemCactusCoke");
+ ModItems.itemSugarCoke = new BaseItemBurnable(
+ "itemSugarCoke",
+ "Sugar Coke",
+ tabMisc,
+ 64,
+ 0,
+ "Used for smelting.",
+ "fuelSugarCoke",
+ 800,
+ 0).setTextureName(GTPlusPlus.ID + ":burnables/itemSugarCoke");
+
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(ModItems.itemCactusCharcoal), "itemCharcoalCactus");
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(ModItems.itemCactusCoke), "itemCokeCactus");
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(ModItems.itemSugarCharcoal), "itemCharcoalSugar");
+ ItemUtils.addItemToOreDictionary(ItemUtils.getSimpleStack(ModItems.itemSugarCoke), "itemCokeSugar");
+ }
+
+ public static void postInit() {
+ generateCokeOvenRecipes();
+ }
+
+ private static void generateCokeOvenRecipes() {
+ ItemStack[] aInputs1 = new ItemStack[] { ItemUtils.getSimpleStack(Blocks.cactus),
+ ItemUtils.getSimpleStack(Items.reeds) };
+ ItemStack[] aInputs2 = new ItemStack[] { ItemUtils.getSimpleStack(ModItems.itemCactusCharcoal),
+ ItemUtils.getSimpleStack(ModItems.itemSugarCharcoal) };
+ ItemStack[] aOutputs = new ItemStack[] { ItemUtils.getSimpleStack(ModItems.itemCactusCoke),
+ ItemUtils.getSimpleStack(ModItems.itemSugarCoke) };
+ for (int i = 0; i < aOutputs.length; i++) {
+ // Recipes for the Charcoals and Cokes, outputting either Creosote or Charcoal Byproducts depending on the
+ // fluid input
+ CORE.RA.addCokeOvenRecipe(
+ aInputs1[i],
+ CI.getNumberedCircuit(3),
+ null,
+ FluidUtils.getFluidStack("creosote", 100),
+ aInputs2[i],
+ 20,
+ 16);
+ CORE.RA.addCokeOvenRecipe(
+ aInputs1[i],
+ CI.getNumberedCircuit(4),
+ FluidUtils.getFluidStack("nitrogen", 100),
+ FluidUtils.getFluidStack("charcoal_byproducts", 200),
+ aInputs2[i],
+ 10,
+ 16);
+ CORE.RA.addCokeOvenRecipe(
+ aInputs2[i],
+ CI.getNumberedCircuit(3),
+ null,
+ FluidUtils.getFluidStack("creosote", 200),
+ aOutputs[i],
+ 40,
+ 16);
+ CORE.RA.addCokeOvenRecipe(
+ aInputs2[i],
+ CI.getNumberedCircuit(4),
+ FluidUtils.getFluidStack("nitrogen", 50),
+ FluidUtils.getFluidStack("charcoal_byproducts", 100),
+ aOutputs[i],
+ 20,
+ 16);
+
+ // Generate Wood Tar and Wood Gas from these Cokes
+ CORE.RA.addCokeOvenRecipe(
+ aOutputs[i],
+ CI.getNumberedCircuit(5),
+ FluidUtils.getFluidStack("steam", 100),
+ Materials.WoodTar.getFluid(200),
+ Materials.Ash.getDustSmall(1),
+ 60,
+ 240);
+ CORE.RA.addCokeOvenRecipe(
+ aOutputs[i],
+ CI.getNumberedCircuit(6),
+ FluidUtils.getFluidStack("steam", 100),
+ Materials.WoodGas.getFluid(300),
+ Materials.Ash.getDustSmall(1),
+ 60,
+ 240);
+
+ // Fluid Extracting the Charcoals for Wood Tar
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aInputs2[i])
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 1L))
+ .outputChances(1000)
+ .fluidOutputs(Materials.WoodTar.getFluid(50L))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(fluidExtractionRecipes);
+
+ // Processing the Charcoals with Oxygen to get CO and CO2
+ // C + O = CO
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aInputs2[i], GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Ash.getDustTiny(1))
+ .fluidInputs(Materials.Oxygen.getGas(500))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(500))
+ .duration(4 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+ // C + 2O = CO2
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aInputs2[i], GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Ash.getDustTiny(1))
+ .fluidInputs(Materials.Oxygen.getGas(2000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(2 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+ }
+ if (Railcraft.isModLoaded()) {
+ for (int i = 0; i < aOutputs.length; i++) {
+ RailcraftUtils.addCokeOvenRecipe(
+ aInputs1[i],
+ true,
+ true,
+ aInputs2[i],
+ FluidUtils.getFluidStack("creosote", 30),
+ 500);
+ }
+ for (int i = 0; i < aOutputs.length; i++) {
+ RailcraftUtils.addCokeOvenRecipe(
+ aInputs2[i],
+ true,
+ true,
+ aOutputs[i],
+ FluidUtils.getFluidStack("creosote", 30),
+ 500);
+ }
+
+ if (NewHorizonsCoreMod.isModLoaded()) {
+ for (int i = 0; i < aOutputs.length; i++) {
+ RailcraftUtils.addAdvancedCokeOvenRecipe(aInputs1[i], true, true, aInputs2[i], 20);
+ }
+ for (int i = 0; i < aOutputs.length; i++) {
+ RailcraftUtils.addAdvancedCokeOvenRecipe(aInputs2[i], true, true, aOutputs[i], 20);
+ }
+ }
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/railcraft/utils/RailcraftUtils.java b/gtpp/src/main/java/gtPlusPlus/xmod/railcraft/utils/RailcraftUtils.java
new file mode 100644
index 0000000000..f2f538ab38
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/railcraft/utils/RailcraftUtils.java
@@ -0,0 +1,22 @@
+package gtPlusPlus.xmod.railcraft.utils;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import mods.railcraft.common.util.crafting.BlastFurnaceCraftingManager;
+import mods.railcraft.common.util.crafting.CokeOvenCraftingManager;
+
+public class RailcraftUtils {
+
+ public static void addCokeOvenRecipe(ItemStack input, boolean matchDamage, boolean matchNBT, ItemStack output,
+ FluidStack fluidOutput, int cookTime) {
+ CokeOvenCraftingManager.getInstance()
+ .addRecipe(input, matchDamage, matchNBT, output, fluidOutput, cookTime);
+ }
+
+ public static void addAdvancedCokeOvenRecipe(ItemStack input, boolean matchDamage, boolean matchNBT,
+ ItemStack output, int cookTime) {
+ BlastFurnaceCraftingManager.getInstance()
+ .addRecipe(input, matchDamage, matchNBT, cookTime, output);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/thaumcraft/commands/CommandDumpAspects.java b/gtpp/src/main/java/gtPlusPlus/xmod/thaumcraft/commands/CommandDumpAspects.java
new file mode 100644
index 0000000000..5dcc27e592
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/thaumcraft/commands/CommandDumpAspects.java
@@ -0,0 +1,92 @@
+package gtPlusPlus.xmod.thaumcraft.commands;
+
+import static gtPlusPlus.core.util.minecraft.PlayerUtils.messagePlayer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.command.ICommand;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.commands.CommandUtils;
+import gtPlusPlus.core.util.minecraft.PlayerUtils;
+import gtPlusPlus.xmod.thaumcraft.objects.ThreadAspectScanner;
+
+public class CommandDumpAspects implements ICommand {
+
+ private final List<String> aliases;
+ public static long mLastScanTime = System.currentTimeMillis();
+
+ public CommandDumpAspects() {
+ this.aliases = new ArrayList<>();
+ this.aliases.add("DA");
+ this.aliases.add("da");
+ this.aliases.add("dumpaspects");
+ this.aliases.add("dumptc");
+ Logger.INFO("Registered Aspect Dump Command.");
+ }
+
+ @Override
+ public int compareTo(final Object o) {
+ return 0;
+ }
+
+ @Override
+ public String getCommandName() {
+ return "DumpAspects";
+ }
+
+ @Override
+ public String getCommandUsage(final ICommandSender var1) {
+ return "/DumpAspects";
+ }
+
+ @Override
+ public List<String> getCommandAliases() {
+ return this.aliases;
+ }
+
+ @Override
+ public void processCommand(final ICommandSender S, final String[] argString) {
+ final EntityPlayer P = CommandUtils.getPlayer(S);
+ final long T = System.currentTimeMillis();
+ final long D = T - mLastScanTime;
+ final int Z = (int) (D / 1000);
+ if (Z >= 30) {
+ // Lets process this in the Background on a new Thread.
+ Thread t = createNewThread();
+ messagePlayer(P, "Beginning to dump information about all items/blocks & their aspects to file.");
+ messagePlayer(
+ P,
+ "Please do not close your game during this process, you will be notified upon completion.");
+ t.start();
+ } else {
+ messagePlayer(
+ P,
+ "Your last run of DA was less than 30 seconds ago, please wait " + (30 - Z)
+ + " seconds before trying again.");
+ }
+ }
+
+ @Override
+ public boolean canCommandSenderUseCommand(final ICommandSender var1) {
+ final EntityPlayer P = CommandUtils.getPlayer(var1);
+ return P != null && PlayerUtils.isPlayerOP(P);
+ }
+
+ @Override
+ public List<?> addTabCompletionOptions(final ICommandSender var1, final String[] var2) {
+ return null;
+ }
+
+ @Override
+ public boolean isUsernameIndex(final String[] var1, final int var2) {
+ return false;
+ }
+
+ private static Thread createNewThread() {
+ return new ThreadAspectScanner();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/thaumcraft/objects/ThreadAspectScanner.java b/gtpp/src/main/java/gtPlusPlus/xmod/thaumcraft/objects/ThreadAspectScanner.java
new file mode 100644
index 0000000000..1f053220ab
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/thaumcraft/objects/ThreadAspectScanner.java
@@ -0,0 +1,165 @@
+package gtPlusPlus.xmod.thaumcraft.objects;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.api.objects.data.Pair;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.data.FileUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.xmod.thaumcraft.commands.CommandDumpAspects;
+
+public class ThreadAspectScanner extends Thread {
+
+ public static boolean mDoWeScan = false;
+ private static final Map<String, AutoMap<ItemStack>> mAllGameContent = new HashMap<>();
+ public final File mAspectCacheFile;
+
+ public ThreadAspectScanner() {
+ mAspectCacheFile = FileUtils.getFile("config/GTplusplus", "AspectInfo", "txt");
+ mDoWeScan = true;
+ }
+
+ private void tryCacheObject(ItemStack aStack) {
+ if (aStack == null) {
+ return;
+ }
+ String nameKey;
+ try {
+ nameKey = ItemUtils.getUnlocalizedItemName(aStack);
+ } catch (NullPointerException n) {
+ try {
+ nameKey = Utils.sanitizeString(
+ aStack.getDisplayName()
+ .toLowerCase());
+ } catch (NullPointerException n2) {
+ try {
+ nameKey = aStack.getItem()
+ .getUnlocalizedName();
+ } catch (NullPointerException n3) {
+ nameKey = "BadItemsGalore";
+ }
+ }
+ }
+ AutoMap<ItemStack> m = new AutoMap<>();
+ if (mAllGameContent.containsKey(nameKey)) {
+ m = mAllGameContent.get(nameKey);
+ }
+ m.put(aStack);
+ mAllGameContent.put(nameKey, m);
+ }
+
+ @SuppressWarnings({ "rawtypes" })
+ @Override
+ public void run() {
+ if (mDoWeScan) {
+ Iterator iterator;
+ Logger.INFO("Finding Blocks and Items to scan for Aspect data.");
+ long mBlocksCounter = 0;
+ long mItemsCounter = 0;
+
+ // First, find blocks
+ iterator = Block.blockRegistry.getKeys()
+ .iterator();
+ while (iterator.hasNext()) {
+ String s = (String) iterator.next();
+ Block block = (Block) Block.blockRegistry.getObject(s);
+ if (block != null) {
+ tryCacheObject(ItemUtils.getSimpleStack(block));
+ mBlocksCounter++;
+ }
+ }
+ Logger.INFO("Completed Block Scan. Counted " + mBlocksCounter);
+
+ // Second Find items, Skipping things that exist.
+ iterator = Item.itemRegistry.getKeys()
+ .iterator();
+ while (iterator.hasNext()) {
+ String s = (String) iterator.next();
+ Item item = (Item) Item.itemRegistry.getObject(s);
+ if (item != null) {
+ if (item.getHasSubtypes()) {
+ List q1 = new ArrayList();
+ item.getSubItems(item, item.getCreativeTab(), q1);
+ if (q1 != null && q1.size() > 0) {
+ for (int e = 0; e < q1.size(); e++) {
+ ItemStack check = ItemUtils.simpleMetaStack(item, e, 1);
+ if (check != null) {
+ tryCacheObject(check);
+ mItemsCounter++;
+ }
+ }
+ } else {
+ tryCacheObject(ItemUtils.getSimpleStack(item));
+ mItemsCounter++;
+ }
+ } else {
+ tryCacheObject(ItemUtils.getSimpleStack(item));
+ mItemsCounter++;
+ }
+ }
+ }
+ Logger.INFO("Completed Item Scan. Counted " + mItemsCounter);
+
+ Set<String> y = mAllGameContent.keySet();
+ Logger.INFO("Beginning iteration of " + y.size() + " itemstacks for aspect information.");
+
+ for (String key : y) {
+ // Logger.INFO("Looking for key: "+key);
+ if (mAllGameContent.containsKey(key)) {
+ AutoMap<ItemStack> group = mAllGameContent.get(key);
+ if (group == null || group.size() <= 0) {
+ continue;
+ }
+ for (ItemStack stack : group) {
+ thaumcraft.api.aspects.AspectList a = thaumcraft.common.lib.crafting.ThaumcraftCraftingManager
+ .getObjectTags(stack);
+ if (a == null) {
+ continue;
+ } else {
+ AutoMap<Pair<String, Integer>> aspectPairs = new AutoMap<>();
+ for (thaumcraft.api.aspects.Aspect c : a.getAspectsSortedAmount()) {
+ if (c != null) {
+ aspectPairs.put(new Pair<>(c.getName(), a.getAmount(c)));
+ }
+ }
+ try {
+ List<String> mList = new ArrayList<>();
+ mList.add(
+ stack.getDisplayName() + " | Meta: "
+ + stack.getItemDamage()
+ + " | Unlocal: "
+ + stack.getUnlocalizedName());
+ for (Pair<String, Integer> r : aspectPairs) {
+ if (r != null) {
+ mList.add(r.getKey() + " x" + r.getValue());
+ }
+ }
+ mList.add("");
+ if (mAspectCacheFile != null && mList.size() >= 3) {
+ FileUtils.appendListToFile(mAspectCacheFile, mList);
+ }
+ } catch (Throwable t) {
+ Logger.INFO("Error while iterating one item. " + t);
+ }
+ }
+ }
+ }
+ }
+ Logger.INFO(
+ "Completed Aspect Iteration. AspectInfo.txt is now available to process in the GTplusplus configuration folder.");
+ CommandDumpAspects.mLastScanTime = System.currentTimeMillis();
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/HANDLER_TF.java b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/HANDLER_TF.java
new file mode 100644
index 0000000000..460a5e9fbe
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/HANDLER_TF.java
@@ -0,0 +1,36 @@
+package gtPlusPlus.xmod.thermalfoundation;
+
+import static gregtech.api.enums.Mods.COFHCore;
+
+import gtPlusPlus.xmod.thermalfoundation.block.TF_Blocks;
+import gtPlusPlus.xmod.thermalfoundation.fluid.TF_Fluids;
+import gtPlusPlus.xmod.thermalfoundation.item.TF_Items;
+import gtPlusPlus.xmod.thermalfoundation.recipe.TF_Gregtech_Recipes;
+
+public class HANDLER_TF {
+
+ public static void preInit() {
+ if (COFHCore.isModLoaded()) {
+ TF_Fluids.preInit();
+ TF_Items.preInit();
+ TF_Blocks.preInit();
+ }
+ }
+
+ public static void init() {
+ if (COFHCore.isModLoaded()) {
+ TF_Fluids.init();
+ TF_Blocks.init();
+ TF_Items.init();
+ }
+ }
+
+ public static void postInit() {
+ if (COFHCore.isModLoaded()) {
+ TF_Fluids.postInit();
+ TF_Items.postInit();
+ TF_Blocks.postInit();
+ TF_Gregtech_Recipes.run();
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Cryotheum.java b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Cryotheum.java
new file mode 100644
index 0000000000..b48be445e5
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Cryotheum.java
@@ -0,0 +1,178 @@
+package gtPlusPlus.xmod.thermalfoundation.block;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.MapColor;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.material.MaterialLiquid;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityBlaze;
+import net.minecraft.entity.monster.EntityCreeper;
+import net.minecraft.entity.monster.EntitySnowman;
+import net.minecraft.entity.monster.EntityZombie;
+import net.minecraft.init.Blocks;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cofh.core.fluid.BlockFluidInteractive;
+import cofh.lib.util.BlockWrapper;
+import cofh.lib.util.helpers.DamageHelper;
+import cofh.lib.util.helpers.ServerHelper;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.xmod.thermalfoundation.fluid.TF_Fluids;
+
+public class TF_Block_Fluid_Cryotheum extends BlockFluidInteractive {
+
+ public static final Material materialFluidCryotheum = new MaterialLiquid(MapColor.iceColor);
+ private static boolean enableSourceFall = true;
+ private static boolean effect = true;
+
+ public TF_Block_Fluid_Cryotheum() {
+ super(GTPlusPlus.ID, TF_Fluids.fluidCryotheum, materialFluidCryotheum, "cryotheum");
+ this.setQuantaPerBlock(5);
+ this.setTickRate(15);
+
+ this.setHardness(1000.0F);
+ this.setLightOpacity(1);
+ this.setParticleColor(0.15F, 0.7F, 1.0F);
+ }
+
+ @Override
+ public boolean preInit() {
+ GameRegistry.registerBlock(this, "FluidCryotheum");
+
+ this.addInteraction(Blocks.grass, Blocks.dirt);
+ this.addInteraction(Blocks.water, 0, Blocks.ice);
+ this.addInteraction(Blocks.water, Blocks.snow);
+ this.addInteraction(Blocks.flowing_water, 0, Blocks.ice);
+ this.addInteraction(Blocks.flowing_water, Blocks.snow);
+ this.addInteraction(Blocks.lava, 0, Blocks.obsidian);
+ this.addInteraction(Blocks.lava, Blocks.stone);
+ this.addInteraction(Blocks.flowing_lava, 0, Blocks.obsidian);
+ this.addInteraction(Blocks.flowing_lava, Blocks.stone);
+ this.addInteraction(Blocks.leaves, Blocks.air);
+ this.addInteraction(Blocks.tallgrass, Blocks.air);
+ this.addInteraction(Blocks.fire, Blocks.air);
+
+ effect = true;
+ enableSourceFall = true;
+
+ return true;
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3, final Entity paramEntity) {
+ paramEntity.extinguish();
+ if (!effect) {
+ return;
+ }
+ if ((paramEntity.motionY < -0.05D) || (paramEntity.motionY > 0.05D)) {
+ paramEntity.motionY *= 0.05D;
+ }
+ if ((paramEntity.motionZ < -0.05D) || (paramEntity.motionZ > 0.05D)) {
+ paramEntity.motionZ *= 0.05D;
+ }
+ if ((paramEntity.motionX < -0.05D) || (paramEntity.motionX > 0.05D)) {
+ paramEntity.motionX *= 0.05D;
+ }
+ if (ServerHelper.isClientWorld(paramWorld)) {
+ return;
+ }
+ if ((paramWorld.getTotalWorldTime() % 8L) != 0L) {
+ return;
+ }
+ if (((paramEntity instanceof EntityZombie)) || ((paramEntity instanceof EntityCreeper))) {
+ final EntitySnowman localEntitySnowman = new EntitySnowman(paramWorld);
+ localEntitySnowman.setLocationAndAngles(
+ paramEntity.posX,
+ paramEntity.posY,
+ paramEntity.posZ,
+ paramEntity.rotationYaw,
+ paramEntity.rotationPitch);
+ paramWorld.spawnEntityInWorld(localEntitySnowman);
+
+ paramEntity.setDead();
+ } else if (
+ /* ((paramEntity instanceof EntityBlizz)) || */ ((paramEntity instanceof EntitySnowman))) {
+ ((EntityLivingBase) paramEntity).addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 120, 0));
+ ((EntityLivingBase) paramEntity).addPotionEffect(new PotionEffect(Potion.regeneration.id, 120, 0));
+ } else if ((paramEntity instanceof EntityBlaze)) {
+ paramEntity.attackEntityFrom(DamageHelper.cryotheum, 10.0F);
+ } else {
+ final boolean bool = paramEntity.velocityChanged;
+ paramEntity.attackEntityFrom(DamageHelper.cryotheum, 2.0F);
+ paramEntity.velocityChanged = bool;
+ }
+ }
+
+ @Override
+ public int getLightValue(final IBlockAccess paramIBlockAccess, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ return TF_Fluids.fluidCryotheum.getLuminosity();
+ }
+
+ @Override
+ public void updateTick(final World paramWorld, final int paramInt1, final int paramInt2, final int paramInt3,
+ final Random paramRandom) {
+ if (effect) {
+ this.checkForInteraction(paramWorld, paramInt1, paramInt2, paramInt3);
+ }
+ if ((enableSourceFall) && (paramWorld.getBlockMetadata(paramInt1, paramInt2, paramInt3) == 0)) {
+ final Block localBlock = paramWorld.getBlock(paramInt1, paramInt2 + this.densityDir, paramInt3);
+ final int i = paramWorld.getBlockMetadata(paramInt1, paramInt2 + this.densityDir, paramInt3);
+ if ((localBlock == this) && (i != 0)) {
+ paramWorld.setBlock(paramInt1, paramInt2 + this.densityDir, paramInt3, this, 0, 3);
+ paramWorld.setBlockToAir(paramInt1, paramInt2, paramInt3);
+ return;
+ }
+ }
+ super.updateTick(paramWorld, paramInt1, paramInt2, paramInt3, paramRandom);
+ }
+
+ protected void checkForInteraction(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ if (paramWorld.getBlock(paramInt1, paramInt2, paramInt3) != this) {
+ return;
+ }
+ int i = paramInt1;
+ int j = paramInt2;
+ int k = paramInt3;
+ for (int m = 0; m < 6; m++) {
+ i = paramInt1 + cofh.lib.util.helpers.BlockHelper.SIDE_COORD_MOD[m][0];
+ j = paramInt2 + cofh.lib.util.helpers.BlockHelper.SIDE_COORD_MOD[m][1];
+ k = paramInt3 + cofh.lib.util.helpers.BlockHelper.SIDE_COORD_MOD[m][2];
+
+ this.interactWithBlock(paramWorld, i, j, k);
+ }
+ this.interactWithBlock(paramWorld, paramInt1 - 1, paramInt2, paramInt3 - 1);
+ this.interactWithBlock(paramWorld, paramInt1 - 1, paramInt2, paramInt3 + 1);
+ this.interactWithBlock(paramWorld, paramInt1 + 1, paramInt2, paramInt3 - 1);
+ this.interactWithBlock(paramWorld, paramInt1 + 1, paramInt2, paramInt3 + 1);
+ }
+
+ protected void interactWithBlock(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ final Block localBlock = paramWorld.getBlock(paramInt1, paramInt2, paramInt3);
+ if ((localBlock == Blocks.air) || (localBlock == this)) {
+ return;
+ }
+ final int i = paramWorld.getBlockMetadata(paramInt1, paramInt2, paramInt3);
+ if (this.hasInteraction(localBlock, i)) {
+ final BlockWrapper localBlockWrapper = this.getInteraction(localBlock, i);
+ paramWorld
+ .setBlock(paramInt1, paramInt2, paramInt3, localBlockWrapper.block, localBlockWrapper.metadata, 3);
+ } else if ((paramWorld.isSideSolid(paramInt1, paramInt2, paramInt3, ForgeDirection.UP))
+ && (paramWorld.isAirBlock(paramInt1, paramInt2 + 1, paramInt3))) {
+ paramWorld.setBlock(paramInt1, paramInt2 + 1, paramInt3, Blocks.snow_layer, 0, 3);
+ }
+ }
+
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Ender.java b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Ender.java
new file mode 100644
index 0000000000..9f89d01250
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Ender.java
@@ -0,0 +1,61 @@
+package gtPlusPlus.xmod.thermalfoundation.block;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import net.minecraft.block.material.MapColor;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.material.MaterialLiquid;
+import net.minecraft.entity.Entity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cofh.core.fluid.BlockFluidCoFHBase;
+import cofh.core.util.CoreUtils;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.xmod.thermalfoundation.fluid.TF_Fluids;
+
+public class TF_Block_Fluid_Ender extends BlockFluidCoFHBase {
+
+ public static final Material materialFluidEnder = new MaterialLiquid(MapColor.greenColor);
+ private static boolean effect = true;
+
+ public TF_Block_Fluid_Ender() {
+ super(GTPlusPlus.ID, TF_Fluids.fluidEnder, materialFluidEnder, "ender");
+ setQuantaPerBlock(4);
+ setTickRate(20);
+
+ setHardness(2000.0F);
+ setLightOpacity(7);
+ setParticleColor(0.05F, 0.2F, 0.2F);
+ }
+
+ @Override
+ public boolean preInit() {
+ GameRegistry.registerBlock(this, "FluidEnder");
+
+ return true;
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(World paramWorld, int paramInt1, int paramInt2, int paramInt3,
+ Entity paramEntity) {
+ if ((!effect) || (paramWorld.isRemote)) {
+ return;
+ }
+ if (paramWorld.getTotalWorldTime() % 8L == 0L) {
+ int i = paramInt1 - 8 + paramWorld.rand.nextInt(17);
+ int j = paramInt2 + paramWorld.rand.nextInt(8);
+ int k = paramInt3 - 8 + paramWorld.rand.nextInt(17);
+ if (!paramWorld.getBlock(i, j, k)
+ .getMaterial()
+ .isSolid()) {
+ CoreUtils.teleportEntityTo(paramEntity, i, j, k);
+ }
+ }
+ }
+
+ @Override
+ public int getLightValue(IBlockAccess paramIBlockAccess, int paramInt1, int paramInt2, int paramInt3) {
+ return TF_Fluids.fluidEnder.getLuminosity();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Pyrotheum.java b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Pyrotheum.java
new file mode 100644
index 0000000000..90c8be8bf7
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Block_Fluid_Pyrotheum.java
@@ -0,0 +1,192 @@
+package gtPlusPlus.xmod.thermalfoundation.block;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.monster.EntityCreeper;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cofh.core.fluid.BlockFluidInteractive;
+import cofh.lib.util.BlockWrapper;
+import cofh.lib.util.helpers.ServerHelper;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gtPlusPlus.xmod.thermalfoundation.fluid.TF_Fluids;
+
+public class TF_Block_Fluid_Pyrotheum extends BlockFluidInteractive {
+
+ Random random = new Random();
+ private static boolean effect = true;
+ private static boolean enableSourceFall = true;
+
+ public TF_Block_Fluid_Pyrotheum() {
+ super(GTPlusPlus.ID, TF_Fluids.fluidPyrotheum, Material.lava, "pyrotheum");
+ this.setQuantaPerBlock(5);
+ this.setTickRate(10);
+
+ this.setHardness(1000.0F);
+ this.setLightOpacity(1);
+ this.setParticleColor(1.0F, 0.7F, 0.15F);
+ }
+
+ @Override
+ public boolean preInit() {
+ GameRegistry.registerBlock(this, "FluidPyrotheum");
+
+ this.addInteraction(Blocks.cobblestone, Blocks.stone);
+ this.addInteraction(Blocks.grass, Blocks.dirt);
+ this.addInteraction(Blocks.sand, Blocks.glass);
+ this.addInteraction(Blocks.water, Blocks.stone);
+ this.addInteraction(Blocks.flowing_water, Blocks.stone);
+ this.addInteraction(Blocks.clay, Blocks.hardened_clay);
+ this.addInteraction(Blocks.ice, Blocks.stone);
+ this.addInteraction(Blocks.snow, Blocks.air);
+ this.addInteraction(Blocks.snow_layer, Blocks.air);
+ for (int i = 0; i < 8; i++) {
+ this.addInteraction(Blocks.stone_stairs, i, Blocks.stone_brick_stairs, i);
+ }
+ final String str1 = "Fluid.Pyrotheum";
+ String str2 = "Enable this for Fluid Pyrotheum to be worse than lava.";
+ effect = true;
+
+ str2 = "Enable this for Fluid Pyrotheum Source blocks to gradually fall downwards.";
+ enableSourceFall = true;
+
+ return true;
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3, final Entity paramEntity) {
+ if (!effect) {
+ return;
+ }
+ if (ServerHelper.isClientWorld(paramWorld)) {
+ return;
+ }
+ if (!(paramEntity instanceof EntityPlayer)) {
+ if ((paramEntity instanceof EntityCreeper)) {
+ paramWorld.createExplosion(
+ paramEntity,
+ paramEntity.posX,
+ paramEntity.posY,
+ paramEntity.posZ,
+ 6.0F,
+ paramEntity.worldObj.getGameRules()
+ .getGameRuleBooleanValue("mobGriefing"));
+ paramEntity.setDead();
+ }
+ }
+ }
+
+ @Override
+ public int getLightValue(final IBlockAccess paramIBlockAccess, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ return TF_Fluids.fluidPyrotheum.getLuminosity();
+ }
+
+ @Override
+ public int getFireSpreadSpeed(final IBlockAccess paramIBlockAccess, final int paramInt1, final int paramInt2,
+ final int paramInt3, final ForgeDirection paramForgeDirection) {
+ return effect ? 800 : 0;
+ }
+
+ @Override
+ public int getFlammability(final IBlockAccess paramIBlockAccess, final int paramInt1, final int paramInt2,
+ final int paramInt3, final ForgeDirection paramForgeDirection) {
+ return 0;
+ }
+
+ @Override
+ public boolean isFlammable(final IBlockAccess paramIBlockAccess, final int paramInt1, final int paramInt2,
+ final int paramInt3, final ForgeDirection paramForgeDirection) {
+ return (effect) && (paramForgeDirection.ordinal() > ForgeDirection.UP.ordinal())
+ && (paramIBlockAccess.getBlock(paramInt1, paramInt2 - 1, paramInt3) != this);
+ }
+
+ @Override
+ public boolean isFireSource(final World paramWorld, final int paramInt1, final int paramInt2, final int paramInt3,
+ final ForgeDirection paramForgeDirection) {
+ return effect;
+ }
+
+ @Override
+ public void updateTick(final World paramWorld, final int paramInt1, final int paramInt2, final int paramInt3,
+ final Random paramRandom) {
+ if (effect) {
+ this.checkForInteraction(paramWorld, paramInt1, paramInt2, paramInt3);
+ }
+ if ((enableSourceFall) && (paramWorld.getBlockMetadata(paramInt1, paramInt2, paramInt3) == 0)) {
+ final Block localBlock = paramWorld.getBlock(paramInt1, paramInt2 + this.densityDir, paramInt3);
+ final int i = paramWorld.getBlockMetadata(paramInt1, paramInt2 + this.densityDir, paramInt3);
+ if (((localBlock == this) && (i != 0)) || (localBlock
+ .isFlammable(paramWorld, paramInt1, paramInt2 + this.densityDir, paramInt3, ForgeDirection.UP))) {
+ paramWorld.setBlock(paramInt1, paramInt2 + this.densityDir, paramInt3, this, 0, 3);
+ paramWorld.setBlockToAir(paramInt1, paramInt2, paramInt3);
+ return;
+ }
+ }
+ super.updateTick(paramWorld, paramInt1, paramInt2, paramInt3, paramRandom);
+ }
+
+ protected void checkForInteraction(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ if (paramWorld.getBlock(paramInt1, paramInt2, paramInt3) != this) {
+ return;
+ }
+ int i = paramInt1;
+ int j = paramInt2;
+ int k = paramInt3;
+ for (int m = 0; m < 6; m++) {
+ i = paramInt1 + cofh.lib.util.helpers.BlockHelper.SIDE_COORD_MOD[m][0];
+ j = paramInt2 + cofh.lib.util.helpers.BlockHelper.SIDE_COORD_MOD[m][1];
+ k = paramInt3 + cofh.lib.util.helpers.BlockHelper.SIDE_COORD_MOD[m][2];
+
+ this.interactWithBlock(paramWorld, i, j, k);
+ }
+ this.interactWithBlock(paramWorld, paramInt1 - 1, paramInt2, paramInt3 - 1);
+ this.interactWithBlock(paramWorld, paramInt1 - 1, paramInt2, paramInt3 + 1);
+ this.interactWithBlock(paramWorld, paramInt1 + 1, paramInt2, paramInt3 - 1);
+ this.interactWithBlock(paramWorld, paramInt1 + 1, paramInt2, paramInt3 + 1);
+ }
+
+ protected void interactWithBlock(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ final Block localBlock = paramWorld.getBlock(paramInt1, paramInt2, paramInt3);
+ if ((localBlock == Blocks.air) || (localBlock == this)) {
+ return;
+ }
+ final int i = paramWorld.getBlockMetadata(paramInt1, paramInt2, paramInt3);
+ if (this.hasInteraction(localBlock, i)) {
+ final BlockWrapper localBlockWrapper = this.getInteraction(localBlock, i);
+ paramWorld
+ .setBlock(paramInt1, paramInt2, paramInt3, localBlockWrapper.block, localBlockWrapper.metadata, 3);
+ this.triggerInteractionEffects(paramWorld, paramInt1, paramInt2, paramInt3);
+ } else if (localBlock.isFlammable(paramWorld, paramInt1, paramInt2, paramInt3, ForgeDirection.UP)) {
+ paramWorld.setBlock(paramInt1, paramInt2, paramInt3, Blocks.fire);
+ } else if ((paramWorld.isSideSolid(paramInt1, paramInt2, paramInt3, ForgeDirection.UP))
+ && (paramWorld.isAirBlock(paramInt1, paramInt2 + 1, paramInt3))) {
+ paramWorld.setBlock(paramInt1, paramInt2 + 1, paramInt3, Blocks.fire, 0, 3);
+ }
+ }
+
+ protected void triggerInteractionEffects(final World paramWorld, final int paramInt1, final int paramInt2,
+ final int paramInt3) {
+ if (this.random.nextInt(16) == 0) {
+ paramWorld.playSoundEffect(
+ paramInt1 + 0.5F,
+ paramInt2 + 0.5F,
+ paramInt3 + 0.5F,
+ "random.fizz",
+ 0.5F,
+ 2.2F + ((paramWorld.rand.nextFloat() - paramWorld.rand.nextFloat()) * 0.8F));
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Blocks.java b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Blocks.java
new file mode 100644
index 0000000000..38fed4c137
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/block/TF_Blocks.java
@@ -0,0 +1,23 @@
+package gtPlusPlus.xmod.thermalfoundation.block;
+
+import cofh.core.fluid.BlockFluidCoFHBase;
+
+public class TF_Blocks {
+
+ public static BlockFluidCoFHBase blockFluidPyrotheum;
+ public static BlockFluidCoFHBase blockFluidCryotheum;
+ public static BlockFluidCoFHBase blockFluidEnder;
+
+ public static void preInit() {
+ blockFluidPyrotheum = new TF_Block_Fluid_Pyrotheum();
+ blockFluidCryotheum = new TF_Block_Fluid_Cryotheum();
+ blockFluidEnder = new TF_Block_Fluid_Ender();
+ blockFluidPyrotheum.preInit();
+ blockFluidCryotheum.preInit();
+ blockFluidEnder.preInit();
+ }
+
+ public static void init() {}
+
+ public static void postInit() {}
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/fluid/TF_Fluids.java b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/fluid/TF_Fluids.java
new file mode 100644
index 0000000000..27a0c8e080
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/fluid/TF_Fluids.java
@@ -0,0 +1,69 @@
+package gtPlusPlus.xmod.thermalfoundation.fluid;
+
+import net.minecraft.item.EnumRarity;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gtPlusPlus.api.objects.Logger;
+
+public class TF_Fluids {
+
+ public static Fluid fluidPyrotheum;
+ public static Fluid fluidCryotheum;
+ public static Fluid fluidEnder;
+
+ public static void preInit() {
+ Logger.INFO("Adding in our own versions of Thermal Foundation Fluids - Non-GT");
+ final Fluid pyrotheum = FluidRegistry.getFluid("pyrotheum");
+ final Fluid cryotheum = FluidRegistry.getFluid("cryotheum");
+ final Fluid ender = FluidRegistry.getFluid("ender");
+
+ if (pyrotheum == null) {
+ Logger.INFO("Registering Blazing Pyrotheum as it does not exist.");
+ fluidPyrotheum = new Fluid("pyrotheum").setLuminosity(15)
+ .setDensity(2000)
+ .setViscosity(1200)
+ .setTemperature(4000)
+ .setRarity(EnumRarity.rare);
+ registerFluid(fluidPyrotheum, "pyrotheum");
+ } else {
+ Logger.INFO("Registering Blazing Pyrotheum as it is an already existing Fluid.");
+ fluidPyrotheum = pyrotheum;
+ }
+ if (cryotheum == null) {
+ Logger.INFO("Registering Gelid Cryotheum as it does not exist.");
+ fluidCryotheum = new Fluid("cryotheum").setLuminosity(0)
+ .setDensity(4000)
+ .setViscosity(3000)
+ .setTemperature(50)
+ .setRarity(EnumRarity.rare);
+ registerFluid(fluidCryotheum, "cryotheum");
+ } else {
+ Logger.INFO("Registering Gelid Cryotheum as it is an already existing Fluid.");
+ fluidCryotheum = cryotheum;
+ }
+
+ if (ender == null) {
+ Logger.INFO("Registering Resonant Ender as it does not exist.");
+ fluidEnder = new Fluid("ender").setLuminosity(3)
+ .setDensity(4000)
+ .setViscosity(3000)
+ .setTemperature(300)
+ .setRarity(EnumRarity.uncommon);
+ registerFluid(fluidEnder, "ender");
+ } else {
+ Logger.INFO("Registering Resonant Ender as it is an already existing Fluid.");
+ fluidEnder = ender;
+ }
+ }
+
+ public static void init() {}
+
+ public static void postInit() {}
+
+ public static void registerFluid(final Fluid paramFluid, final String paramString) {
+ if (!FluidRegistry.isFluidRegistered(paramString)) {
+ FluidRegistry.registerFluid(paramFluid);
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/item/TF_Items.java b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/item/TF_Items.java
new file mode 100644
index 0000000000..d2ea7ea2d1
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/item/TF_Items.java
@@ -0,0 +1,75 @@
+package gtPlusPlus.xmod.thermalfoundation.item;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+
+import cofh.core.item.ItemBase;
+import cofh.core.item.ItemBucket;
+import cofh.core.util.energy.FurnaceFuelHandler;
+import cofh.core.util.fluid.BucketHandler;
+import gtPlusPlus.core.creative.AddToCreativeTab;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import gtPlusPlus.xmod.thermalfoundation.block.TF_Blocks;
+import gtPlusPlus.xmod.thermalfoundation.fluid.TF_Fluids;
+
+public class TF_Items {
+
+ public static ItemBase itemMaterial;
+ public static ItemStack rodBlizz;
+ public static ItemStack dustBlizz;
+ public static ItemStack dustPyrotheum;
+ public static ItemStack dustCryotheum;
+ public static ItemBucket itemBucket;
+ public static ItemStack bucketPyrotheum;
+ public static ItemStack bucketCryotheum;
+ public static ItemStack bucketEnder;
+
+ public static ItemStack itemDustBlizz;
+ public static ItemStack itemDustPyrotheum;
+ public static ItemStack itemDustCryotheum;
+ public static ItemStack itemRodBlizz;
+
+ public static void preInit() {
+
+ itemBucket = (ItemBucket) new ItemBucket("MiscUtils").setUnlocalizedName("bucket")
+ .setCreativeTab(AddToCreativeTab.tabMisc);
+ itemMaterial = (ItemBase) new ItemBase("MiscUtils").setUnlocalizedName("material")
+ .setCreativeTab(AddToCreativeTab.tabMisc);
+
+ bucketPyrotheum = itemBucket.addOreDictItem(1, "bucketPyrotheum");
+ bucketCryotheum = itemBucket.addOreDictItem(2, "bucketCryotheum");
+ bucketEnder = itemBucket.addOreDictItem(3, "bucketEnder", 1);
+ rodBlizz = itemMaterial.addOreDictItem(1, "rodBlizz");
+ dustBlizz = itemMaterial.addOreDictItem(2, "dustBlizz");
+ dustPyrotheum = itemMaterial.addOreDictItem(3, "dustPyrotheum");
+ dustCryotheum = itemMaterial.addOreDictItem(4, "dustCryotheum");
+
+ if (ReflectionUtils.doesClassExist("cofh.core.util.energy.FurnaceFuelHandler")) {
+ FurnaceFuelHandler.registerFuel(dustPyrotheum, 2400); // cofh.core.util.energy.FurnaceFuelHandler.registerFuel(ItemStack,
+ // int)
+ }
+
+ ItemUtils.addItemToOreDictionary(rodBlizz, "stickBlizz");
+
+ itemRodBlizz = ItemUtils.simpleMetaStack(itemMaterial, 1, 1);
+ itemDustBlizz = ItemUtils.simpleMetaStack(itemMaterial, 2, 1);
+ itemDustPyrotheum = ItemUtils.simpleMetaStack(itemMaterial, 3, 1);
+ itemDustCryotheum = ItemUtils.simpleMetaStack(itemMaterial, 4, 1);
+ }
+
+ public static void init() {
+
+ BucketHandler.registerBucket(TF_Blocks.blockFluidPyrotheum, 0, bucketPyrotheum);
+ BucketHandler.registerBucket(TF_Blocks.blockFluidCryotheum, 0, bucketCryotheum);
+ BucketHandler.registerBucket(TF_Blocks.blockFluidEnder, 0, bucketEnder);
+ FluidContainerRegistry
+ .registerFluidContainer(TF_Fluids.fluidPyrotheum, bucketPyrotheum, FluidContainerRegistry.EMPTY_BUCKET);
+ FluidContainerRegistry
+ .registerFluidContainer(TF_Fluids.fluidCryotheum, bucketCryotheum, FluidContainerRegistry.EMPTY_BUCKET);
+ FluidContainerRegistry
+ .registerFluidContainer(TF_Fluids.fluidEnder, bucketEnder, FluidContainerRegistry.EMPTY_BUCKET);
+ }
+
+ public static void postInit() {}
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/recipe/TF_Gregtech_Recipes.java b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/recipe/TF_Gregtech_Recipes.java
new file mode 100644
index 0000000000..cd48964d37
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/thermalfoundation/recipe/TF_Gregtech_Recipes.java
@@ -0,0 +1,93 @@
+package gtPlusPlus.xmod.thermalfoundation.recipe;
+
+import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.recipe.RecipeMaps.vacuumFreezerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+
+public class TF_Gregtech_Recipes {
+
+ public static void run() {
+ start();
+ }
+
+ private static void start() {
+
+ final FluidStack moltenBlaze = getFluidStack("molten.blaze", 1440);
+
+ // Gelid Cryotheum
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ore, Materials.Cinnabar, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cinnabar, 3L))
+ .fluidInputs(getFluidStack("cryotheum", 144))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(chemicalBathRecipes);
+
+ // Blizz Powder
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.snowball, 4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blizz, 1L))
+ .fluidInputs(moltenBlaze)
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(chemicalBathRecipes);
+
+ // Blizz Rod
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.blaze_rod))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Blizz, 1L))
+ .duration(((int) Math.max((Materials.Blaze.getMass() * 4) * 3L, 1L)) * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Pyrotheum, 1L))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Snow, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blizz, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cryotheum, 1L))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Niter, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Snow, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blizz, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cryotheum, 1L))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+ }
+
+ private static FluidStack getFluidStack(final String fluidName, final int amount) {
+ return FluidUtils.getFluidStack(fluidName, amount);
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/tinkers/HANDLER_Tinkers.java b/gtpp/src/main/java/gtPlusPlus/xmod/tinkers/HANDLER_Tinkers.java
new file mode 100644
index 0000000000..1023d0325f
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/tinkers/HANDLER_Tinkers.java
@@ -0,0 +1,30 @@
+package gtPlusPlus.xmod.tinkers;
+
+import static gregtech.api.enums.Mods.TinkerConstruct;
+
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.xmod.tinkers.material.BaseTinkersMaterial;
+import gtPlusPlus.xmod.tinkers.util.TinkersDryingRecipe;
+import gtPlusPlus.xmod.tinkers.util.TinkersUtils;
+
+public class HANDLER_Tinkers {
+
+ public static AutoMap<BaseTinkersMaterial> mTinkerMaterials = new AutoMap<>();
+
+ public static void postInit() {
+ if (TinkerConstruct.isModLoaded()) {
+
+ Fluid pyrotheumFluid = FluidRegistry.getFluid("pyrotheum");
+ if (pyrotheumFluid != null) {
+ // Enable Pyrotheum as Fuel for the Smeltery
+ TinkersUtils.addSmelteryFuel(pyrotheumFluid, 5000, 70); // pyrotheum lasts 3.5 seconds per 15 mb
+ }
+
+ // Generate Drying Rack recipes
+ TinkersDryingRecipe.generateAllDryingRecipes();
+ }
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/tinkers/material/BaseTinkersMaterial.java b/gtpp/src/main/java/gtPlusPlus/xmod/tinkers/material/BaseTinkersMaterial.java
new file mode 100644
index 0000000000..f57aa64263
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/tinkers/material/BaseTinkersMaterial.java
@@ -0,0 +1,200 @@
+package gtPlusPlus.xmod.tinkers.material;
+
+import static gregtech.api.enums.Mods.TinkerConstruct;
+import static gtPlusPlus.core.util.math.MathUtils.safeCast_LongToInt;
+
+import java.util.HashMap;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.fluids.Fluid;
+
+import cpw.mods.fml.common.event.FMLInterModComms;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.xmod.tinkers.HANDLER_Tinkers;
+import gtPlusPlus.xmod.tinkers.util.TinkersUtils;
+
+public class BaseTinkersMaterial {
+
+ private static HashMap<String, Integer> aInternalMaterialIdMap = new HashMap<>();
+ private static int aNextFreeID;
+
+ public final String mLocalName;
+
+ private final String mUnlocalName;
+ private final int mID;
+ private final Material mMaterial;
+
+ static {
+ aNextFreeID = (Short.MAX_VALUE / 2) + 420;
+ }
+
+ public BaseTinkersMaterial(Material aMaterial) {
+ mLocalName = aMaterial.getLocalizedName();
+ mUnlocalName = "material.gtpp." + Utils.sanitizeString(mLocalName);
+ mMaterial = aMaterial;
+ mID = aNextFreeID++;
+ Logger.INFO("[TiCon] Assigning ID " + mID + " to " + mLocalName + ".");
+ aInternalMaterialIdMap.put(mUnlocalName, mID);
+ HANDLER_Tinkers.mTinkerMaterials.put(this);
+ }
+
+ public String getUnlocalName() {
+ return mUnlocalName;
+ }
+
+ private static int calcDurability(Material aMaterial) {
+ return safeCast_LongToInt(aMaterial.vDurability);
+ }
+
+ private static int calcMiningSpeed(Material aMaterial) {
+ return (aMaterial.vHarvestLevel * 2) + aMaterial.vTier;
+ }
+
+ private static int calcHarvestLevel(Material aMaterial) {
+ return aMaterial.vHarvestLevel;
+ }
+
+ private static int calcAttack(Material aMaterial) {
+ return aMaterial.vHarvestLevel + aMaterial.vTier + aMaterial.vRadiationLevel;
+ }
+
+ private static float calcHandleModifier(Material aMaterial) {
+ return 1f;
+ }
+
+ private static int calcReinforced(Material aMaterial) {
+ return aMaterial.getMeltingPointC() / 3600;
+ }
+
+ private static int calcBowProjectileSpeed(Material aMaterial) {
+ return aMaterial.vHarvestLevel + 2;
+ }
+
+ private static int calcBowDrawSpeed(Material aMaterial) {
+ return aMaterial.vHarvestLevel + 8;
+ }
+
+ private static float calcProjectileMass(Material aMaterial) {
+ return (aMaterial.getMeltingPointC() / 1800) * 0.1f;
+ }
+
+ private static float calcProjectileFragility(Material aMaterial) {
+ return 0f;
+ }
+
+ private static String calcStyle(Material aMaterial) {
+ String aReturn;
+ int aTemp = aMaterial.getMeltingPointC();
+ if (aTemp < 3600) {
+ aReturn = "" + EnumChatFormatting.WHITE;
+ } else if (aTemp >= 3600) {
+ aReturn = "" + EnumChatFormatting.YELLOW;
+ } else if (aTemp >= (3600 * 2)) {
+ aReturn = "" + EnumChatFormatting.GREEN;
+ } else if (aTemp >= (3600 * 3)) {
+ aReturn = "" + EnumChatFormatting.RED;
+ } else if (aTemp >= (3600 * 4)) {
+ aReturn = "" + EnumChatFormatting.DARK_RED;
+ } else {
+ aReturn = "" + EnumChatFormatting.GOLD;
+ }
+ return aReturn;
+ }
+
+ private static int calcColour(Material aMaterial) {
+ return aMaterial.getRgbAsHex();
+ }
+
+ public void generate() {
+
+ Logger.INFO("[TiCon] Trying to generate Material: " + mLocalName);
+ int id = mID;
+ if (id > 0) {
+
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setInteger("Id", id);
+ tag.setString("Name", mUnlocalName);
+ tag.setString("localizationString", mLocalName);
+ tag.setInteger("Durability", calcDurability(mMaterial)); // 97
+ tag.setInteger("MiningSpeed", calcMiningSpeed(mMaterial)); // 150
+ tag.setInteger("HarvestLevel", calcHarvestLevel(mMaterial)); // 1
+ tag.setInteger("Attack", calcAttack(mMaterial)); // 0
+ tag.setFloat("HandleModifier", calcHandleModifier(mMaterial)); // 1.0f
+ tag.setInteger("Reinforced", calcReinforced(mMaterial)); // 0
+ tag.setFloat("Bow_ProjectileSpeed", calcBowProjectileSpeed(mMaterial)); // 3.0f
+ tag.setInteger("Bow_DrawSpeed", calcBowDrawSpeed(mMaterial)); // 18
+ tag.setFloat("Projectile_Mass", calcProjectileMass(mMaterial)); // 0.69f
+ tag.setFloat("Projectile_Fragility", calcProjectileFragility(mMaterial)); // 0.2f
+ tag.setString("Style", calcStyle(mMaterial));
+ tag.setInteger("Color", calcColour(mMaterial));
+
+ boolean generate = generateRecipes(mMaterial, id);
+
+ if (generate) {
+ Logger.INFO("[TiCon] Sending IMC: addMaterial - " + mLocalName + ".");
+ FMLInterModComms.sendMessage(TinkerConstruct.ID, "addMaterial", tag);
+
+ ItemStack itemstack = mMaterial.getIngot(1);
+ tag = new NBTTagCompound();
+ tag.setInteger("MaterialId", id);
+ NBTTagCompound item = new NBTTagCompound();
+ itemstack.writeToNBT(item);
+ tag.setTag("Item", item);
+ tag.setInteger("Value", 2); // What is value for?
+
+ Logger.INFO("[TiCon] Sending IMC: addPartBuilderMaterial - " + mLocalName + ".");
+ FMLInterModComms.sendMessage(TinkerConstruct.ID, "addPartBuilderMaterial", tag);
+
+ tag = new NBTTagCompound();
+ tag.setInteger("MaterialId", id);
+ tag.setInteger("Value", 2); // What is value for?
+ item = new NBTTagCompound();
+ itemstack.writeToNBT(item);
+ tag.setTag("Item", item);
+
+ Logger.INFO("[TiCon] Sending IMC: addMaterialItem - " + mLocalName + ".");
+ FMLInterModComms.sendMessage(TinkerConstruct.ID, "addMaterialItem", tag);
+ }
+ }
+ }
+
+ private boolean generateRecipes(Material aMaterial, int aID) {
+
+ Block aMatBlock;
+ Integer aMelt;
+ Fluid aFluid;
+
+ try {
+ aMatBlock = aMaterial.getBlock();
+ aMelt = aMaterial.getMeltingPointC();
+ aFluid = aMaterial.getFluidStack(0)
+ .getFluid();
+ } catch (Throwable t) {
+ return false;
+ }
+
+ if (aMatBlock == null || aMelt == null || aFluid == null) {
+ return false;
+ }
+
+ TinkersUtils.registerFluidType(mLocalName, aMatBlock, 0, aMelt, aFluid, true);
+ TinkersUtils.addMelting(aMaterial.getBlock(1), aMatBlock, 0, aMelt, aMaterial.getFluidStack(144 * 9));
+ TinkersUtils.addMelting(aMaterial.getIngot(1), aMatBlock, 0, aMelt, aMaterial.getFluidStack(144));
+ if (aMelt <= 3600) {
+ ItemStack ingotcast = TinkersUtils.getPattern(1);
+ TinkersUtils
+ .addBasinRecipe(aMaterial.getBlock(1), aMaterial.getFluidStack(144 * 9), (ItemStack) null, true, 100);
+ TinkersUtils
+ .addCastingTableRecipe(aMaterial.getIngot(1), aMaterial.getFluidStack(144), ingotcast, false, 50);
+ }
+
+ TinkersUtils.generateCastingRecipes(aMaterial, aID);
+
+ return true;
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersDryingRecipe.java b/gtpp/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersDryingRecipe.java
new file mode 100644
index 0000000000..33dad51510
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersDryingRecipe.java
@@ -0,0 +1,129 @@
+package gtPlusPlus.xmod.tinkers.util;
+
+import static gregtech.api.enums.Mods.TinkerConstruct;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.GT_Values;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.recipe.common.CI;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class TinkersDryingRecipe {
+
+ public static AutoMap<TinkersDryingRecipe> recipes = new AutoMap<>();
+
+ public final int time;
+ public final ItemStack input;
+ public final ItemStack result;
+
+ public static void generateAllDryingRecipes() {
+ List<?> aRecipes = TinkersUtils.getDryingRecipes();
+ if (aRecipes != null && aRecipes.size() > 0) {
+ for (Object o : aRecipes) {
+ Logger.INFO(
+ "Trying to generate recipe using object of type " + o.getClass()
+ .getSimpleName());
+ generateFromTinkersRecipeObject(o);
+ }
+ } else {
+ Logger.INFO(
+ "Error generating Drying recipes, map was either null or empty. Null? " + (aRecipes != null)
+ + ", Size: "
+ + aRecipes.size());
+ }
+ if (!recipes.isEmpty()) {
+ Logger.INFO("Adding " + recipes.size() + " drying rack recipes to the dehydrator.");
+ for (TinkersDryingRecipe r : recipes) {
+ CORE.RA.addDehydratorRecipe(
+ new ItemStack[] { CI.getNumberedCircuit(16), r.input },
+ GT_Values.NF,
+ GT_Values.NF,
+ new ItemStack[] { r.result },
+ new int[] {},
+ r.time / 10,
+ 30);
+ }
+ }
+ }
+
+ public static TinkersDryingRecipe generateFromTinkersRecipeObject(Object o) {
+ Field aTime;
+ Field aInput;
+ Field aOutput;
+ Class aTinkerClass = ReflectionUtils.getClass("tconstruct.library.crafting.DryingRackRecipes.DryingRecipe"); // o.getClass();
+ if (aTinkerClass == null || TinkerConstruct.isModLoaded()) {
+ Logger.INFO(
+ "Error generating Drying Recipe, could not find class. Exists? "
+ + ReflectionUtils.doesClassExist("tconstruct.library.crafting.DryingRackRecipes.DryingRecipe"));
+ Class clazz = ReflectionUtils.getClass("tconstruct.library.crafting.DryingRackRecipes");
+ Class[] y = clazz.getDeclaredClasses();
+ if (y == null || y.length <= 0) {
+ Logger.INFO("No hidden inner classes.");
+ return null;
+ } else {
+ boolean found = false;
+ for (Class h : y) {
+ Logger.INFO("Found hidden inner class: " + h.getCanonicalName());
+ if (h.getSimpleName()
+ .toLowerCase()
+ .equals("dryingrecipe")) {
+ Logger.INFO("Found correct recipe. Caching at correct location.");
+ ReflectionUtils.mCachedClasses
+ .put("tconstruct.library.crafting.DryingRackRecipes.DryingRecipe", h);
+ aTinkerClass = h;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ return null;
+ }
+ }
+ }
+ aTime = ReflectionUtils.getField(aTinkerClass, "time");
+ aInput = ReflectionUtils.getField(aTinkerClass, "input");
+ aOutput = ReflectionUtils.getField(aTinkerClass, "result");
+ try {
+ int time_internal = aTime.getInt(o);
+ ItemStack input_internal = (ItemStack) aInput.get(o);
+ ItemStack result_internal = (ItemStack) aOutput.get(o);
+ return new TinkersDryingRecipe(input_internal, time_internal, result_internal);
+ } catch (Throwable b) {
+ b.printStackTrace();
+ }
+ return null;
+ }
+
+ public TinkersDryingRecipe(final ItemStack input, final int time, final ItemStack result) {
+ this.time = time;
+ this.input = input;
+ this.result = result;
+ Logger.INFO(
+ "Generating Drying Recipe. Input: " + input.getDisplayName() + ", Output: " + result.getDisplayName());
+ recipes.add(this);
+ }
+
+ public boolean matches(ItemStack input) {
+ if (input.hasTagCompound()) {
+ input = input.copy();
+ input.getTagCompound()
+ .removeTag("frypanKill");
+ if (input.getTagCompound()
+ .hasNoTags()) {
+ input.setTagCompound((NBTTagCompound) null);
+ }
+ }
+ return ItemStack.areItemStacksEqual(this.input, input);
+ }
+
+ public ItemStack getResult() {
+ return this.result.copy();
+ }
+}
diff --git a/gtpp/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersUtils.java b/gtpp/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersUtils.java
new file mode 100644
index 0000000000..8b173d5b62
--- /dev/null
+++ b/gtpp/src/main/java/gtPlusPlus/xmod/tinkers/util/TinkersUtils.java
@@ -0,0 +1,377 @@
+package gtPlusPlus.xmod.tinkers.util;
+
+import static gregtech.api.enums.Mods.TinkerConstruct;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Materials;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class TinkersUtils {
+
+ private static final Class<?> mClass_Smeltery;
+ private static final Class<?> mClass_TConstructRegistry;
+ private static final Class<?> mClass_ToolMaterial;
+ private static final Class<?> mClass_IPattern;
+ private static final Class<?> mClass_DynamicToolPart;
+ private static final Class<?> mClass_FluidType;
+ private static final Class<?> mClass_CastingRecipe;
+ private static final Class<?> mClass_TinkerSmeltery;
+
+ private static final Field mField_MoltenIronFluid;
+
+ private static final Method mMethod_getFluidType;
+ private static final Method mMethod_getCastingRecipes;
+
+ private static Object mSmelteryInstance;
+ private static Object mTinkersRegistryInstance;
+
+ private static final HashMap<String, Method> mMethodCache = new LinkedHashMap<>();
+
+ static {
+ mClass_Smeltery = ReflectionUtils.getClass("tconstruct.library.crafting.Smeltery");
+ mClass_TConstructRegistry = ReflectionUtils.getClass("tconstruct.library.TConstructRegistry");
+
+ mClass_ToolMaterial = ReflectionUtils.getClass("tconstruct.library.tools.ToolMaterial");
+ mClass_IPattern = ReflectionUtils.getClass("tconstruct.library.util.IPattern");
+ mClass_DynamicToolPart = ReflectionUtils.getClass("tconstruct.library.tools.DynamicToolPart");
+ mClass_FluidType = ReflectionUtils.getClass("tconstruct.library.crafting.FluidType");
+ mClass_CastingRecipe = ReflectionUtils.getClass("tconstruct.library.crafting.CastingRecipe");
+ mClass_TinkerSmeltery = ReflectionUtils.getClass("tconstruct.smeltery.TinkerSmeltery");
+
+ mField_MoltenIronFluid = ReflectionUtils.getField(mClass_TinkerSmeltery, "moltenIronFluid");
+
+ mMethod_getFluidType = ReflectionUtils.getMethod(mClass_FluidType, "getFluidType", String.class);
+ mMethod_getCastingRecipes = ReflectionUtils
+ .getMethod(getCastingInstance(0), "getCastingRecipes", new Class[] {});
+ }
+
+ private static void setTiConDataInstance() {
+ if (!TinkerConstruct.isModLoaded()) {
+ return;
+ }
+
+ if (mSmelteryInstance == null) {
+ if (mClass_Smeltery != null) {
+ try {
+ mSmelteryInstance = ReflectionUtils.getField(mClass_Smeltery, "instance")
+ .get(null);
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {}
+ }
+ }
+ if (mTinkersRegistryInstance == null) {
+ if (mClass_TConstructRegistry != null) {
+ try {
+ mTinkersRegistryInstance = ReflectionUtils.getField(mClass_TConstructRegistry, "instance")
+ .get(null);
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {}
+ }
+ }
+ }
+
+ /**
+ * Add a new fluid as a valid Smeltery fuel.
+ *
+ * @param fluid The fluid.
+ * @param power The temperature of the fluid. This also influences the melting speed. Lava is 1000.
+ * @param duration How long one "portion" of liquid fuels the smeltery. Lava is 10.
+ */
+ public static void addSmelteryFuel(Fluid fluid, int power, int duration) {
+ setTiConDataInstance();
+ ReflectionUtils.invokeVoid(
+ mSmelteryInstance,
+ "addSmelteryFuel",
+ new Class[] { Fluid.class, int.class, int.class },
+ new Object[] { fluid, power, duration });
+ }
+
+ public static boolean registerFluidType(String name, Block block, int meta, int baseTemperature, Fluid fluid,
+ boolean isToolpart) {
+ if (mMethodCache.get("registerFluidType") == null) {
+ Method m = ReflectionUtils.getMethod(
+ ReflectionUtils.getClass("tconstruct.library.crafting.FluidType"),
+ "registerFluidType",
+ String.class,
+ Block.class,
+ int.class,
+ int.class,
+ Fluid.class,
+ boolean.class);
+ mMethodCache.put("registerFluidType", m);
+ }
+ try {
+ mMethodCache.get("registerFluidType")
+ .invoke(null, name, block, meta, baseTemperature, fluid, isToolpart);
+ return true;
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ return false;
+ }
+ }
+
+ public static void addMelting(ItemStack input, Block block, int metadata, int temperature, FluidStack liquid) {
+ if (mMethodCache.get("addMelting") == null) {
+ Method m = ReflectionUtils.getMethod(
+ mClass_Smeltery,
+ "addMelting",
+ ItemStack.class,
+ Block.class,
+ int.class,
+ int.class,
+ FluidStack.class);
+ mMethodCache.put("addMelting", m);
+ }
+ try {
+ mMethodCache.get("addMelting")
+ .invoke(null, input, block, metadata, temperature, liquid);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ignored) {}
+ }
+
+ public static void addMelting(Object type, ItemStack input, int temperatureDifference, int fluidAmount) {
+ if (mMethodCache.get("addMelting") == null) {
+ Method m = ReflectionUtils
+ .getMethod(mClass_Smeltery, "addMelting", mClass_FluidType, ItemStack.class, int.class, int.class);
+ mMethodCache.put("addMelting", m);
+ }
+ try {
+ mMethodCache.get("addMelting")
+ .invoke(null, type, input, temperatureDifference, fluidAmount);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ignored) {}
+ }
+
+ public static void addBasinRecipe(ItemStack output, FluidStack metal, ItemStack cast, boolean consume, int delay) {
+ if (mMethodCache.get("addBasinRecipe") == null) {
+ Method m = ReflectionUtils.getMethod(
+ ReflectionUtils.getClass("tconstruct.library.crafting.LiquidCasting"),
+ "addCastingRecipe",
+ ItemStack.class,
+ FluidStack.class,
+ ItemStack.class,
+ boolean.class,
+ int.class);
+ mMethodCache.put("addBasinRecipe", m);
+ }
+ try {
+ mMethodCache.get("addBasinRecipe")
+ .invoke(getCastingInstance(0), output, metal, cast, consume, delay);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ignored) {}
+ }
+
+ public static void addCastingTableRecipe(ItemStack output, FluidStack metal, ItemStack cast, boolean consume,
+ int delay) {
+ if (mMethodCache.get("addCastingTableRecipe") == null) {
+ Method m = ReflectionUtils.getMethod(
+ ReflectionUtils.getClass("tconstruct.library.crafting.LiquidCasting"),
+ "addCastingRecipe",
+ ItemStack.class,
+ FluidStack.class,
+ ItemStack.class,
+ boolean.class,
+ int.class);
+ mMethodCache.put("addCastingTableRecipe", m);
+ }
+ try {
+ mMethodCache.get("addCastingTableRecipe")
+ .invoke(getCastingInstance(1), output, metal, cast, consume, delay);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ignored) {}
+ }
+
+ /**
+ * 0 For Table, 1 For Basin.
+ *
+ * @param aType - Casting Type
+ * @return - The casting instance.
+ */
+ public static Object getCastingInstance(int aType) {
+
+ setTiConDataInstance();
+
+ Method m = null;
+ if (aType == 0) {
+ m = ReflectionUtils.getMethod(mTinkersRegistryInstance, "getTableCasting", new Class[] {});
+ } else if (aType == 1) {
+ m = ReflectionUtils.getMethod(mTinkersRegistryInstance, "getBasinCasting", new Class[] {});
+ } // return null;
+
+ if (m != null) {
+ try {
+ return m.invoke(mTinkersRegistryInstance, new Object[] {});
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ private static Item mTinkerMetalPattern;
+
+ public static ItemStack getPattern(int aType) {
+ if (mTinkerMetalPattern == null) {
+ Field m = ReflectionUtils.getField(mClass_TinkerSmeltery, "metalPattern");
+ if (m != null) {
+ try {
+ mTinkerMetalPattern = (Item) m.get(null);
+ } catch (IllegalArgumentException | IllegalAccessException ignored) {}
+ }
+ }
+ if (mTinkerMetalPattern != null) {
+ return new ItemStack(mTinkerMetalPattern, aType, 0);
+ }
+ return ItemUtils.getErrorStack(1, "Bad Tinkers Pattern");
+ }
+
+ private static AutoMap<?> mDryingRackRecipes;
+
+ public static List<?> getDryingRecipes() {
+ if (mDryingRackRecipes != null) {
+ return mDryingRackRecipes;
+ }
+ AutoMap<Object> aData = new AutoMap<>();
+ int aCount = 0;
+ try {
+ ArrayList<?> recipes = (ArrayList<?>) ReflectionUtils
+ .getField(ReflectionUtils.getClass("tconstruct.library.crafting.DryingRackRecipes"), "recipes")
+ .get(null);
+ if (recipes != null) {
+ for (Object o : recipes) {
+ aData.put(o);
+ aCount++;
+ }
+ Logger.INFO("Found " + aCount + " Tinkers drying rack recipes.");
+ } else {
+ Logger.INFO("Failed to find any Tinkers drying rack recipes.");
+ }
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ Logger.INFO("Failed to find any Tinkers drying rack recipes.");
+ }
+ mDryingRackRecipes = aData;
+ return aData;
+ }
+
+ public static List<?> getTableCastingRecipes() {
+ Object aCastingTableHandlerInstance = getCastingInstance(0);
+ List<?> aTemp;
+ try {
+ aTemp = (List<?>) mMethod_getCastingRecipes.invoke(aCastingTableHandlerInstance, new Object[] {});
+ return aTemp;
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ return new ArrayList<>();
+ }
+
+ public static void generateCastingRecipes(Material aMaterial, int aID) {
+
+ List<CastingRecipeHandler> newRecipies = new LinkedList<>();
+
+ Iterator<?> iterator1 = getTableCastingRecipes().iterator();
+ Fluid aMoltenIron = null;
+ if (aMoltenIron == null) {
+ try {
+ aMoltenIron = (Fluid) mField_MoltenIronFluid.get(null);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ e.printStackTrace();
+ aMoltenIron = Materials.Iron.getMolten(0)
+ .getFluid();
+ }
+ }
+ while (iterator1.hasNext()) {
+ CastingRecipeHandler recipe = new CastingRecipeHandler(iterator1.next());
+ if (recipe == null || !recipe.valid) {
+ continue;
+ }
+ try {
+ if (recipe.castingMetal.getFluid() == aMoltenIron && recipe.cast != null
+ && mClass_IPattern.isInstance(recipe.cast.getItem())
+ && mClass_DynamicToolPart.isInstance(
+ recipe.getResult()
+ .getItem())) {
+ newRecipies.add(recipe);
+ }
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ return;
+ }
+ }
+
+ Object ft;
+ try {
+ ft = mMethod_getFluidType.invoke(null, aMaterial.getLocalizedName());
+ for (CastingRecipeHandler newRecipy : newRecipies) {
+ CastingRecipeHandler recipe = new CastingRecipeHandler(newRecipy);
+ if (!recipe.valid) {
+ continue;
+ }
+ // CastingRecipe recipe = (CastingRecipe) i$.next();
+ ItemStack output = recipe.getResult()
+ .copy();
+ output.setItemDamage(aID);
+ FluidStack liquid2 = new FluidStack(
+ aMaterial.getFluidStack(0)
+ .getFluid(),
+ recipe.castingMetal.amount);
+ addCastingTableRecipe(output, liquid2, recipe.cast, recipe.consumeCast, recipe.coolTime);
+ addMelting(ft, output, 0, liquid2.amount / 2);
+ }
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ private static class CastingRecipeHandler {
+
+ public ItemStack output;
+ public FluidStack castingMetal;
+ public ItemStack cast;
+ public boolean consumeCast;
+ public int coolTime;
+
+ public boolean valid;
+
+ public CastingRecipeHandler(Object aCastingRecipe) {
+ if (mClass_CastingRecipe.isInstance(aCastingRecipe)) {
+ try {
+ Field aF_output = ReflectionUtils.getField(mClass_CastingRecipe, "output");
+ Field aF_castingMetal = ReflectionUtils.getField(mClass_CastingRecipe, "castingMetal");
+ Field aF_cast = ReflectionUtils.getField(mClass_CastingRecipe, "cast");
+ Field aF_consumeCast = ReflectionUtils.getField(mClass_CastingRecipe, "consumeCast");
+ Field aF_coolTime = ReflectionUtils.getField(mClass_CastingRecipe, "coolTime");
+
+ output = (ItemStack) aF_output.get(aCastingRecipe);
+ castingMetal = (FluidStack) aF_castingMetal.get(aCastingRecipe);
+ cast = (ItemStack) aF_cast.get(aCastingRecipe);
+ consumeCast = (boolean) aF_consumeCast.get(aCastingRecipe);
+ coolTime = (int) aF_coolTime.get(aCastingRecipe);
+ valid = true;
+ } catch (Throwable t) {
+ t.printStackTrace();
+ valid = false;
+ }
+ } else {
+ valid = false;
+ }
+ }
+
+ public ItemStack getResult() {
+ return this.output.copy();
+ }
+ }
+}
diff --git a/gtpp/src/main/resources/assets/forestry/AlvearyFrame.png b/gtpp/src/main/resources/assets/forestry/AlvearyFrame.png
new file mode 100644
index 0000000000..c69ead8dd0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/forestry/AlvearyFrame.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/forestry/AlvearyMutator.png b/gtpp/src/main/resources/assets/forestry/AlvearyMutator.png
new file mode 100644
index 0000000000..2225f2748f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/forestry/AlvearyMutator.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.off.png b/gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.off.png
new file mode 100644
index 0000000000..f21e59ec96
--- /dev/null
+++ b/gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.off.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.on.png b/gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.on.png
new file mode 100644
index 0000000000..f21e59ec96
--- /dev/null
+++ b/gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.framehousing.on.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.off.png b/gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.off.png
new file mode 100644
index 0000000000..51336c00b9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.off.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.on.png b/gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.on.png
new file mode 100644
index 0000000000..51336c00b9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/forestry/textures/blocks/apiculture/alveary.mutator.on.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/lang/en_US.lang b/gtpp/src/main/resources/assets/gregtech/lang/en_US.lang
new file mode 100644
index 0000000000..bec1ad152c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/lang/en_US.lang
@@ -0,0 +1,283 @@
+
+//Shit I stole from GTNH~
+
+GT5U.gui.text.no_water=§7Missing water
+GT5U.gui.text.no_lava=§7Missing lava
+GT5U.gui.text.no_air=§7Missing air
+GT5U.gui.text.no_co2=§7Missing CO2
+GT5U.gui.text.no_li2bef4=§7Missing Li2BeF4
+GT5U.gui.text.no_saw=§7Missing saw
+GT5U.gui.text.no_sapling=§7Missing sapling
+GT5U.gui.text.no_oxygen=§7Missing oxygen
+GT5U.gui.text.fuel_blacklisted=§7Fuel blacklisted
+GT5U.gui.text.no_catalyst=§7No valid catalyst found
+GT5U.gui.text.no_milling_ball=§7No milling ball found
+GT5U.gui.text.growing_trees=§aGrowing trees
+GT5U.gui.text.managing_power=§aManaging power
+GT5U.gui.text.no_scrap=§aInput too low quality
+GT5U.gui.text.warm_up=§aWarming up
+GT5U.gui.text.machine_locked_to_different_recipe=§7Machine is already locked to a different recipe
+GT5U.gui.text.no_output_for_sapling=§7This sapling yields no outputs
+GT5U.gui.text.no_tools=§7Missing applicable tools
+
+GTPP.EBF.heat=Heat capacity
+
+GTPP.machines.tier=Tier
+GTPP.machines.input=Input
+GTPP.machines.output=Output
+
+GTPP.multiblock.pollutionreduced=Pollution reduced to
+GTPP.multiblock.pollution=Pollution
+GTPP.multiblock.energy=Stored Energy
+GTPP.multiblock.progress=Progress
+GTPP.multiblock.efficiency=Efficiency
+GTPP.multiblock.problems=Problems
+GTPP.multiblock.mei=Max Energy Income
+GTPP.multiblock.usage=Probably uses
+GTPP.multiblock.generation=Probably generates
+GTPP.multiblock.specialvalue=Special Value
+GTPP.multiblock.duration=Duration
+GTPP.multiblock.multimachine.metal=Metal Mode. Does compressor (circuit 20), lathe (circuit 21) and electromagnetic polarizer (circuit 22).
+GTPP.multiblock.multimachine.fluid=Fluid Mode. Does fermenter (circuit 20), fluid extractor (circuit 21) and extractor (circuit 22).
+GTPP.multiblock.multimachine.misc=Misc. Mode. Does precision laser engraver (circuit 20), autoclave (circuit 21) and fluid solidifier (circuit 22).
+
+
+GTPP.waila.steam.use=Probably uses: §e%s§r L/t Steam
+
+GTPP.CC.machinetier=Control Core Tier
+GTPP.CC.discount=EU Discount
+GTPP.CC.parallel=Maximum Parallel
+
+//Tooltips for the Charger Packs
+GTPP.battpack.tooltip.1=Worn as a Belt within Baubles
+GTPP.battpack.tooltip.2=Drains
+GTPP.battpack.tooltip.3=to charge worn armour
+GTPP.battpack.tooltip.4=Also charges items on the hotbar
+
+//Tooltips for the Personal Healing Bauble
+GTPP.nanohealer.tooltip.1=Worn as a Necklace within Baubles
+GTPP.nanohealer.tooltip.2=Drains
+GTPP.nanohealer.tooltip.3= EU per operation.
+GTPP.nanohealer.tooltip.4=Can restore HP, Hunger and Saturation.
+GTPP.nanohealer.tooltip.5=Will not prevent death.
+GTPP.nanohealer.tooltip.6=Shift+RMB to toggle notifications.
+GTPP.nanohealer.hidden=Hiding Info?
+
+//10/4/19
+//Tooltips for the Mob Killing Baubles
+GTPP.monsterkiller.tooltip.1=Worn as an Amulet within Baubles
+GTPP.monsterkiller.tooltip.2=Drains
+GTPP.monsterkiller.tooltip.3=per each kill
+GTPP.monsterkiller.tooltip.4=Target Type:
+
+//17/08/19
+GTPP.container.decaychest.name=Decayables
+
+
+
+
+
+
+
+
+
+
+
+
+//NEI INFORMATION
+GTPP.nei.info=Information
+GTPP.nei.eutick=Eu/t
+GTPP.nei.timetaken=Time Taken
+GTPP.nei.output=Output
+GTPP.nei.input=Input
+GTPP.nei.result=Result
+GTPP.nei.radioation=Radiation Level
+
+//Some Generic Words
+GTPP.info.eu=EU
+GTPP.info.euInfo=EU Information
+GTPP.info.inputLimit=Input Limit
+GTPP.info.currentPower=Current Power
+GTPP.info.hidden=Hidden
+
+//Some Time Words
+GTPP.time.ticks=Ticks
+GTPP.time.seconds=Seconds
+GTPP.time.minutes=Minutes
+GTPP.time.hours=Hours
+GTPP.time.days=Days
+GTPP.time.weeks=Weeks
+GTPP.time.months=Months
+
+//Steam MultiBlock Tooltips
+GTPP.MBTT.SteamHatch=Steam Hatch
+GTPP.MBTT.SteamInputBus=Input Bus (Steam)
+GTPP.MBTT.SteamOutputBus=Output Bus (Steam)
+
+
+
+
+
+
+
+
+//Achievements
+
+//4/2/19
+achievement.gt.blockmachines.fusioncomputer.tier.09=Fusion Computer Mark IV
+achievement.gtplusplus.blockcasings.3.12=Fusion Casing MK III
+achievement.gtplusplus.blockcasings.3.13=Advanced Magnetic Containment!
+achievement.gtplusplus.blockcasings.3.15=Quantum Containment!
+achievement.gt.blockmachines.fusioncomputer.tier.09.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.3.12.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.3.13.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.3.15.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.gtplusplus.fusion.single=Alternative Fusion
+achievement.gt.blockmachines.gtplusplus.tank.plasma=Plasma Storage
+achievement.gt.blockmachines.gtplusplus.fusion.single.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.gtplusplus.tank.plasma.desc=[AL] Pickup this item to see the recipe in NEI
+
+
+//5/2/19
+achievement.MU-metaitem.01.32106=Junior Physicist
+achievement.MU-metaitem.01.32107=Graduate Physicist
+achievement.MU-metaitem.01.32108=Scholarly Physicist
+achievement.MU-metaitem.01.32109=Master Physicist
+achievement.MU-metaitem.01.32106.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32107.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32108.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32109.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32066=Proton Containment
+achievement.MU-metaitem.01.32068=Electron Containment
+achievement.MU-metaitem.01.32070=Quark Containment
+achievement.MU-metaitem.01.32110=Graviton Containment
+achievement.MU-metaitem.01.32066.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32068.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32070.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.MU-metaitem.01.32110.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.item.personalHealingDevice=Food is for chumps
+achievement.item.personalHealingDevice.desc=[AL] You have upgraded to the nano, the future is yours
+achievement.item.GTPP.BattPack.06.name=Charge Pack Mk I
+achievement.item.GTPP.BattPack.07.name=Charge Pack Mk II
+achievement.item.GTPP.BattPack.08.name=Charge Pack Mk III
+achievement.item.GTPP.BattPack.09.name=Charge Pack Mk IV
+achievement.item.GTPP.BattPack.06.name.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.item.GTPP.BattPack.07.name.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.item.GTPP.BattPack.08.name.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.item.GTPP.BattPack.09.name.desc=[AL] Pickup this item to see the recipe in NEI
+
+
+
+//14/2/19
+achievement.gtpp.start=Gregtech++
+achievement.gtpp.start.desc=So, think you've got what it takes?
+achievement.hatch.control=This is where you put the Control Core
+achievement.hatch.control.desc=A special hatch required by all GT++ Multiblocks.
+achievement.hatch.dynamo.buffered=Buffered Dynamo Hatch
+achievement.hatch.dynamo.buffered.desc=More energy from the same multi!
+achievement.multi.abs=Alloy Blast Smelter [ABS]
+achievement.multi.abs.desc=Used to create most late game alloys.
+achievement.dust.potin=Potin!
+achievement.dust.potin.desc=Well, you gotta start somewhere...
+achievement.dust.eglin=Eglin Steel!
+achievement.dust.eglin.desc=Progress, albeit slow...
+achievement.dust.staballoy=Staballoy!
+achievement.dust.staballoy.desc=Now we're talking...
+achievement.dust.quantum=Quantum!
+achievement.dust.quantum.desc=Raw Matter.
+achievement.dust.hypogen=Hypogen!
+achievement.dust.hypogen.desc=What even is this material?
+achievement.block.fishtrap=Free Fish
+achievement.block.fishtrap.desc=Better than HarvestCraft.
+achievement.block.withercage=Jail
+achievement.block.withercage.desc=Trap a Wither/Dragon with this.
+achievement.rtg=Radioisotope Thermoelectric Generation!
+achievement.rtg.desc=Probably stolen from Russia, use with care.
+achievement.dehydrate=Dehydration
+achievement.dehydrate.desc=Drink some water.
+achievement.semifluid=It's like a fluid, but it's not
+achievement.semifluid.desc=Semifluids are confusing.
+achievement.earlywasher=Simple Ore Washer
+achievement.earlywasher.desc=Runs on ULV only.
+achievement.advancedsteam=Alternative Steam options
+achievement.advancedsteam.desc=Smart fuel consumption
+achievement.pollutionremoval=Pollution, no more!
+achievement.pollutionremoval.desc=POLLUTION IS BAD
+achievement.hiampxform=High Amp Transformers
+achievement.hiampxform.desc=Advanced power transformation
+achievement.multi.pss=Power Sub-Station [PSS]
+achievement.multi.pss.desc=Grid Power Storage.
+achievement.multi.cyclo=Cyclotron
+achievement.multi.cyclo.desc=Advanced Science
+achievement.multi.sifter=Industrial Sifter
+achievement.multi.sifter.desc=Faster than a turtle.
+achievement.multi.cokeoven=Industrial Coke Oven [ICO]
+achievement.multi.cokeoven.desc=Better than a Pyrolyse
+achievement.multi.boiler.thermal=Thermal Boiler
+achievement.multi.boiler.thermal.desc=Pahoehoe works too!
+achievement.multi.zhuhai=Zhuhai, Fishing Port
+achievement.multi.zhuhai.desc=Actually exists
+achievement.casing.abs=Slow Progress
+achievement.casing.abs.desc=Eventually, you will have your ABS.
+achievement.casing.cyclotron.coil=Slower Progress
+achievement.casing.cyclotron.coil.desc=Consider why you're even doing this..
+achievement.casing.multiuse=I'm going to make lots of these
+achievement.casing.multiuse.desc=Don't start counting.
+achievement.casing.containment=What's this for?
+achievement.casing.containment.desc=I should probably try find out.
+achievement.decay.neptunium238=Neptunium 238
+achievement.decay.neptunium238.desc=Cyclotron Product
+achievement.decay.radium226=Radium 226
+achievement.decay.radium226.desc=Cyclotron Product
+achievement.decay.molybdenum99=Molybdenum 99
+achievement.decay.molybdenum99.desc=Cyclotron Product
+achievement.decay.technetium99m=Technetium 99M
+achievement.decay.technetium99m.desc=Cyclotron Product
+achievement.decay.technetium99=Technetium 99
+achievement.decay.technetium99.desc=Cyclotron Product
+
+//24/11/19
+achievement.gt.blockmachines.hatch.turbine.input.tier.00=Turbine Housing
+achievement.gt.blockmachines.hatch.turbine.input.tier.00.desc=[AL] Pickup this item to see the recipe in NEI
+
+//Added 6/12/21
+achievement.gt.blockmachines.gtpp.multimachine.flotationcell=Flotation Cell
+achievement.gt.blockmachines.gtpp.multimachine.flotationcell.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.gtpp.multimachine.isamill=IsaMill
+achievement.gt.blockmachines.gtpp.multimachine.isamill.desc=[AL] Pickup this item to see the recipe in NEI
+
+//2023-1-13
+achievement.gt.blockmachines.industrialalloysmelter.controller.tier.mega=Fast Pikachu-Alloy at last
+
+//2023-4-8
+tooltip.flotationCell.lockedTo=Locked to:
+tooltip.large_macerator.tier=Tier: §6%s
+tooltip.large_distill_tower.upgraded=§6Upgraded
+
+//2023-7-12
+achievement.gtplusplus.blockcasings.5.3=Elemental Confinement Shell
+achievement.gtplusplus.blockcasings.5.3.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.7=Neutron Pulse Manipulator
+achievement.gtplusplus.blockcasings.5.7.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.8=Cosmic Fabric Manipulator
+achievement.gtplusplus.blockcasings.5.8.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.9=Infinity Infused Manipulator
+achievement.gtplusplus.blockcasings.5.9.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.10=SpaceTime Continuum Manipulator
+achievement.gtplusplus.blockcasings.5.10.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.11=Neutron Shielding Core
+achievement.gtplusplus.blockcasings.5.11.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.12=Cosmic Fabric Shielding Core
+achievement.gtplusplus.blockcasings.5.12.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.13=Infinity Infused Shielding Core
+achievement.gtplusplus.blockcasings.5.13.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gtplusplus.blockcasings.5.14=SpaceTime Bending Core
+achievement.gtplusplus.blockcasings.5.14.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.sparge.controller.single=Sparge Tower
+achievement.gt.blockmachines.sparge.controller.single.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.industrialsalloyamelter.controller.tier.mega=Mega Alloy Blast Smelter
+achievement.gt.blockmachines.industrialsalloyamelter.controller.tier.mega.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.moleculartransformer.controller.tier.single=Molecular Transformer
+achievement.gt.blockmachines.moleculartransformer.controller.tier.single.desc=[AL] Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.gtpp.multimachine.replicator=Elemental Duplicator
+achievement.gt.blockmachines.gtpp.multimachine.replicator.desc=[AL] Pickup this item to see the recipe in NEI
diff --git a/gtpp/src/main/resources/assets/gregtech/lang/zh_CN.lang b/gtpp/src/main/resources/assets/gregtech/lang/zh_CN.lang
new file mode 100644
index 0000000000..652691fd25
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/lang/zh_CN.lang
@@ -0,0 +1,223 @@
+
+//Shit I stole from GTNH~
+
+GTPP.EBF.heat=热容
+
+GTPP.machines.tier=等级
+GTPP.machines.input=输入
+GTPP.machines.output=输出
+
+GTPP.multiblock.pollutionreduced=减少污染至
+GTPP.multiblock.pollution=污染
+GTPP.multiblock.energy=能量存储
+GTPP.multiblock.progress=进程
+GTPP.multiblock.efficiency=效率
+GTPP.multiblock.problems=维护问题
+GTPP.multiblock.mei=最大能量输入
+GTPP.multiblock.usage=NEI功率
+GTPP.multiblock.generation=可能生成
+GTPP.multiblock.specialvalue=特殊值
+GTPP.multiblock.duration=NEI时间
+
+
+
+GTPP.CC.machinetier=控制核心等级
+GTPP.CC.discount=EU损耗
+GTPP.CC.parallel=最大并行
+
+//Tooltips for the Charger Packs
+GTPP.battpack.tooltip.1=在Baubles的腰带栏内使用
+GTPP.battpack.tooltip.2=消耗
+GTPP.battpack.tooltip.3=给穿着的盔甲充能
+GTPP.battpack.tooltip.4=同样给快捷栏内的物品充能
+
+//Tooltips for the Personal Healing Bauble
+GTPP.nanohealer.tooltip.1=在Baubles的项链栏内使用
+GTPP.nanohealer.tooltip.2=每次操作消耗1638400EU
+GTPP.nanohealer.tooltip.3=可以恢复血量,饥饿和饱和度
+GTPP.nanohealer.tooltip.4=不会阻止死亡
+GTPP.nanohealer.tooltip.5=Shift+右键来切换信息
+GTPP.nanohealer.hidden=隐藏信息?
+
+//10/4/19
+//Tooltips for the Mob Killing Baubles
+GTPP.monsterkiller.tooltip.1=在Baubles的护身符栏内使用
+GTPP.monsterkiller.tooltip.2=产生
+GTPP.monsterkiller.tooltip.3=每击杀一个指定怪物
+GTPP.monsterkiller.tooltip.4=目标类型:
+
+//17/08/19
+GTPP.container.decaychest.name=可衰变
+
+
+
+
+
+
+
+
+
+
+
+
+//NEI INFORMATION
+GTPP.nei.info=信息
+GTPP.nei.eutick=Eu/t
+GTPP.nei.timetaken=耗时
+GTPP.nei.output=输出
+GTPP.nei.input=输入
+GTPP.nei.result=产物
+GTPP.nei.radioation=辐射等级
+
+//Some Generic Words
+GTPP.info.eu=EU
+GTPP.info.euInfo=EU信息
+GTPP.info.inputLimit=输入限制
+GTPP.info.currentPower=当前能量
+GTPP.info.hidden=隐藏
+
+//Some Time Words
+GTPP.time.ticks=t
+GTPP.time.seconds=秒
+GTPP.time.minutes=分
+GTPP.time.hours=小时
+GTPP.time.days=天
+GTPP.time.weeks=周
+GTPP.time.months=月
+
+//Steam MultiBlock Tooltips
+GTPP.MBTT.SteamHatch=蒸汽仓
+GTPP.MBTT.SteamInputBus=输入总线(蒸汽)
+GTPP.MBTT.SteamOutputBus=输出总线(蒸汽)
+
+
+
+
+
+
+
+
+//Achievements
+
+//4/2/19
+achievement.gt.blockmachines.fusioncomputer.tier.09=聚变计算机MK IV
+achievement.gtplusplus.blockcasings.3.12=聚变框架MK III
+achievement.gtplusplus.blockcasings.3.13=进阶磁力遏制!
+achievement.gtplusplus.blockcasings.3.15=量子遏制!
+achievement.gt.blockmachines.fusioncomputer.tier.09.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.gtplusplus.blockcasings.3.12.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.gtplusplus.blockcasings.3.13.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.gtplusplus.blockcasings.3.15.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.gtplusplus.fusion.single=可控聚变
+achievement.gt.blockmachines.gtplusplus.tank.plasma=等离子存储
+achievement.gt.blockmachines.gtplusplus.fusion.single.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.gtplusplus.tank.plasma.desc=[AL]捡起此物品以在NEI内解锁该合成表
+
+
+//5/2/19
+achievement.MU-metaitem.01.32106=初级物理学家
+achievement.MU-metaitem.01.32107=研究生物理学家
+achievement.MU-metaitem.01.32108=学术物理学家
+achievement.MU-metaitem.01.32109=物理学硕士
+achievement.MU-metaitem.01.32106.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32107.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32108.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32109.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32066=质子遏制
+achievement.MU-metaitem.01.32068=电子遏制
+achievement.MU-metaitem.01.32070=夸克遏制
+achievement.MU-metaitem.01.32110=引力遏制
+achievement.MU-metaitem.01.32066.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32068.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32070.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.MU-metaitem.01.32110.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.item.personalHealingDevice=食物是为了笨蛋
+achievement.item.personalHealingDevice.desc=[AL]你已经升级到纳米,未来就是你的
+achievement.item.GTPP.BattPack.06.name=充电工具包Mk I
+achievement.item.GTPP.BattPack.07.name=充电工具包Mk II
+achievement.item.GTPP.BattPack.08.name=充电工具包Mk III
+achievement.item.GTPP.BattPack.09.name=充电工具包Mk IV
+achievement.item.GTPP.BattPack.06.name.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.item.GTPP.BattPack.07.name.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.item.GTPP.BattPack.08.name.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.item.GTPP.BattPack.09.name.desc=[AL]捡起此物品以在NEI内解锁该合成表
+
+
+
+//14/2/19
+achievement.gtpp.start=Gregtech++
+achievement.gtpp.start.desc=所以,你认为你已经得到了它?
+achievement.hatch.control=这是你放置控制核心的地方
+achievement.hatch.control.desc=所有GT++的多方块都需要特殊的填充.
+achievement.hatch.dynamo.buffered=缓冲后的发电机动力仓
+achievement.hatch.dynamo.buffered.desc=可以在大型涡轮机上使用这些.
+achievement.multi.abs=合金冶炼炉[ABS]
+achievement.multi.abs.desc=用于制造大多数后期合金.
+achievement.dust.potin=铜锌锡合金!
+achievement.dust.potin.desc=好吧,你得从某个地方开始...
+achievement.dust.eglin=埃格林钢铁!
+achievement.dust.eglin.desc=进展虽然缓慢...
+achievement.dust.staballoy=贫铀合金!
+achievement.dust.staballoy.desc=现在我们正在讨论...
+achievement.dust.quantum=量子!
+achievement.dust.quantum.desc=原料.
+achievement.dust.hypogen=海珀珍!
+achievement.dust.hypogen.desc=这甚至是什么材料?
+achievement.block.fishtrap=免费的鱼
+achievement.block.fishtrap.desc=比潘马斯农场好.
+achievement.block.withercage=监狱
+achievement.block.withercage.desc=用此捕捉凋灵/末影龙.
+achievement.rtg=放射性同位素热电发电!
+achievement.rtg.desc=可能盗于俄罗斯,小心使用.
+achievement.dehydrate=脱水
+achievement.dehydrate.desc=喝些水.
+achievement.semifluid=它像是液体,但它不是
+achievement.semifluid.desc=半流体令人困惑.
+achievement.earlywasher=简单的洗矿场
+achievement.earlywasher.desc=只在ULV下工作.
+achievement.advancedsteam=替代蒸汽选项
+achievement.advancedsteam.desc=智能油耗
+achievement.pollutionremoval=污染,没了!
+achievement.pollutionremoval.desc=污染不好
+achievement.hiampxform=高放大变压器
+achievement.hiampxform.desc=进阶电力转换
+achievement.multi.pss=能源站[PSS]
+achievement.multi.pss.desc=电力网络存储.
+achievement.multi.cyclo=回旋加速器
+achievement.multi.cyclo.desc=高级科学
+achievement.multi.sifter=工业筛选机
+achievement.multi.sifter.desc=比乌龟快.
+achievement.multi.cokeoven=工业焦炉[ICO]
+achievement.multi.cokeoven.desc=比热解炉更好
+achievement.multi.boiler.thermal=地热锅炉
+achievement.multi.boiler.thermal.desc=熔岩也有效!
+achievement.multi.zhuhai=珠海,渔场
+achievement.multi.zhuhai.desc=实际存在
+achievement.casing.abs=进展缓慢
+achievement.casing.abs.desc=最终,你将拥有你的合金冶炼炉.
+achievement.casing.cyclotron.coil=进展缓慢
+achievement.casing.cyclotron.coil.desc=考虑为什么你甚至这样做..
+achievement.casing.multiuse=我要做很多这些
+achievement.casing.multiuse.desc=不要开始计数.
+achievement.casing.containment=这个是干什么的?
+achievement.casing.containment.desc=我应该试着找出来.
+achievement.decay.neptunium238=镎238
+achievement.decay.neptunium238.desc=回旋加速器产品
+achievement.decay.radium226=镭226
+achievement.decay.radium226.desc=回旋加速器产品
+achievement.decay.molybdenum99=钼99
+achievement.decay.molybdenum99.desc=回旋加速器产品
+achievement.decay.technetium99m=锝99M
+achievement.decay.technetium99m.desc=回旋加速器产品
+achievement.decay.technetium99=锝99
+achievement.decay.technetium99.desc=回旋加速器产品
+
+//24/11/19
+achievement.gt.blockmachines.hatch.turbine.input.tier.00=涡轮仓
+achievement.gt.blockmachines.hatch.turbine.input.tier.00.desc=[AL]捡起此物品以在NEI内解锁该合成表
+
+//Added 6/12/21
+achievement.gt.blockmachines.gtpp.multimachine.flotationcell=工业浮选机
+achievement.gt.blockmachines.gtpp.multimachine.flotationcell.desc=[AL]捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.gtpp.multimachine.isamill=艾萨研磨机
+achievement.gt.blockmachines.gtpp.multimachine.isamill.desc=[AL]捡起此物品以在NEI内解锁该合成表 \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..e9b20bd486
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..4469a809e9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..012c63a088
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..30856a6284
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..d577f0cbb3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..e41790f90f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png.mcmeta b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..f4cce85820
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":5,
+ "frames": [0, 1, 2, 3, 2, 1]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP.png
new file mode 100644
index 0000000000..e9b20bd486
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..4469a809e9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cold_trap/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..f090fc04ac
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..b18cca86b6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..590a0e1606
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..f9b78615ea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a87d309908
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..11d8fffb7c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP.png
new file mode 100644
index 0000000000..9afeaf4395
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..d997a986df
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/dehydrator/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a9ab34e963
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..8a5c131623
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..b7a77be826
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..8a47157d2b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png.mcmeta b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..1367b80758
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 3, 2, 2, 1, 1, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..671bbd7d97
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..ae63da7746
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png.mcmeta b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..8447c98f9a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a9ab34e963
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..8a5c131623
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/reactor_processing_unit/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..72f22b8b00
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..99039b2493
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..72f22b8b00
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..99039b2493
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_GLOW.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/basicmachines/simple_washer/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.png
new file mode 100644
index 0000000000..e29ce83f82
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.png
new file mode 100644
index 0000000000..4569cb8af3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.png.mcmeta b/gtpp/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.png.mcmeta
new file mode 100644
index 0000000000..0df7234a79
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel_old.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":2
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block1.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block1.png
new file mode 100644
index 0000000000..ad51b6f35f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block2.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block2.png
new file mode 100644
index 0000000000..9544681ea6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block3.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block3.png
new file mode 100644
index 0000000000..161d37faf8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block4.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block4.png
new file mode 100644
index 0000000000..7d3a6d1e29
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block5.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block5.png
new file mode 100644
index 0000000000..a8a4b0e1f2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block6.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block6.png
new file mode 100644
index 0000000000..ad51b6f35f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/block6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/foil.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/foil.png
new file mode 100644
index 0000000000..2edad5a448
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/foil.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/frameGt.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/frameGt.png
new file mode 100644
index 0000000000..2041e4d562
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/frameGt.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore.png
new file mode 100644
index 0000000000..6e4e79b4fa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/oreSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/oreSmall.png
new file mode 100644
index 0000000000..0a7e9d6e9e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/oreSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png
new file mode 100644
index 0000000000..0032fdd6e5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png.mcmeta b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png.mcmeta
new file mode 100644
index 0000000000..676faf4fb4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/ore_animated.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 4, 3, 3, 2, 2, 1, 1]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeHuge.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeHuge.png
new file mode 100644
index 0000000000..7985626666
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeHuge.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeLarge.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeLarge.png
new file mode 100644
index 0000000000..f1daedc2c9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeLarge.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeMedium.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeMedium.png
new file mode 100644
index 0000000000..9927fa293e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeMedium.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSide.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSide.png
new file mode 100644
index 0000000000..aec8883d6a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSide.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSmall.png
new file mode 100644
index 0000000000..6c29b067f3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeTiny.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeTiny.png
new file mode 100644
index 0000000000..c1ef295198
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/pipeTiny.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/void.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/void.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/wire.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/wire.png
new file mode 100644
index 0000000000..455335e5c2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/ENRICHED/wire.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block1.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block1.png
new file mode 100644
index 0000000000..161d37faf8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block2.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block2.png
new file mode 100644
index 0000000000..9544681ea6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block3.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block3.png
new file mode 100644
index 0000000000..161d37faf8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block4.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block4.png
new file mode 100644
index 0000000000..7d3a6d1e29
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block5.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block5.png
new file mode 100644
index 0000000000..a8a4b0e1f2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block6.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block6.png
new file mode 100644
index 0000000000..ad51b6f35f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/block6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/foil.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/foil.png
new file mode 100644
index 0000000000..2edad5a448
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/foil.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/frameGt.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/frameGt.png
new file mode 100644
index 0000000000..2041e4d562
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/frameGt.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/ore.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/ore.png
new file mode 100644
index 0000000000..ed3f2f1581
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/ore.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/oreSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/oreSmall.png
new file mode 100644
index 0000000000..0a7e9d6e9e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/oreSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeHuge.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeHuge.png
new file mode 100644
index 0000000000..7985626666
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeHuge.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeLarge.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeLarge.png
new file mode 100644
index 0000000000..f1daedc2c9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeLarge.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeMedium.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeMedium.png
new file mode 100644
index 0000000000..9927fa293e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeMedium.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSide.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSide.png
new file mode 100644
index 0000000000..aec8883d6a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSide.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSmall.png
new file mode 100644
index 0000000000..6c29b067f3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeTiny.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeTiny.png
new file mode 100644
index 0000000000..c1ef295198
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/pipeTiny.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/void.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/void.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/wire.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/wire.png
new file mode 100644
index 0000000000..455335e5c2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_A/wire.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block1.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block1.png
new file mode 100644
index 0000000000..ad51b6f35f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block2.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block2.png
new file mode 100644
index 0000000000..9544681ea6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block3.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block3.png
new file mode 100644
index 0000000000..161d37faf8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block4.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block4.png
new file mode 100644
index 0000000000..7d3a6d1e29
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block5.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block5.png
new file mode 100644
index 0000000000..a8a4b0e1f2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block6.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block6.png
new file mode 100644
index 0000000000..ad51b6f35f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/block6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/foil.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/foil.png
new file mode 100644
index 0000000000..2edad5a448
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/foil.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/frameGt.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/frameGt.png
new file mode 100644
index 0000000000..2041e4d562
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/frameGt.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png
new file mode 100644
index 0000000000..919d9bb70a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png.mcmeta b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png.mcmeta
new file mode 100644
index 0000000000..d2c3416c73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/ore.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/oreSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/oreSmall.png
new file mode 100644
index 0000000000..0a7e9d6e9e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/oreSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeHuge.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeHuge.png
new file mode 100644
index 0000000000..7985626666
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeHuge.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeLarge.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeLarge.png
new file mode 100644
index 0000000000..f1daedc2c9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeLarge.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeMedium.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeMedium.png
new file mode 100644
index 0000000000..9927fa293e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeMedium.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSide.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSide.png
new file mode 100644
index 0000000000..aec8883d6a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSide.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSmall.png
new file mode 100644
index 0000000000..6c29b067f3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeTiny.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeTiny.png
new file mode 100644
index 0000000000..c1ef295198
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/pipeTiny.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/void.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/void.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/wire.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/wire.png
new file mode 100644
index 0000000000..455335e5c2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/NUCLEAR/wire.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block1.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block1.png
new file mode 100644
index 0000000000..3e33d0feec
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block2.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block2.png
new file mode 100644
index 0000000000..9544681ea6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block3.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block3.png
new file mode 100644
index 0000000000..161d37faf8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block4.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block4.png
new file mode 100644
index 0000000000..7d3a6d1e29
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block5.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block5.png
new file mode 100644
index 0000000000..a8a4b0e1f2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block6.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block6.png
new file mode 100644
index 0000000000..ad51b6f35f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/block6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/foil.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/foil.png
new file mode 100644
index 0000000000..2edad5a448
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/foil.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/frameGt.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/frameGt.png
new file mode 100644
index 0000000000..2041e4d562
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/frameGt.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/ore.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/ore.png
new file mode 100644
index 0000000000..9cb38f3f8e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/ore.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/oreSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/oreSmall.png
new file mode 100644
index 0000000000..0a7e9d6e9e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/oreSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeHuge.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeHuge.png
new file mode 100644
index 0000000000..4feeed528c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeHuge.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeLarge.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeLarge.png
new file mode 100644
index 0000000000..055c104f1c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeLarge.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeMedium.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeMedium.png
new file mode 100644
index 0000000000..0bb50256c5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeMedium.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSide.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSide.png
new file mode 100644
index 0000000000..d229926034
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSide.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSmall.png
new file mode 100644
index 0000000000..1684ec116b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeTiny.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeTiny.png
new file mode 100644
index 0000000000..f9838c8829
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/pipeTiny.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/void.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/void.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/wire.png b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/wire.png
new file mode 100644
index 0000000000..455335e5c2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/blocks/materialicons/REFINED/wire.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/gui/basicmachines/FissionFuel.png b/gtpp/src/main/resources/assets/gregtech/textures/gui/basicmachines/FissionFuel.png
new file mode 100644
index 0000000000..e95be5c31a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/gui/basicmachines/FissionFuel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.png b/gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.png
new file mode 100644
index 0000000000..13b37c999d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.window.png b/gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.window.png
new file mode 100644
index 0000000000..3fd5382926
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_32k.window.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.png b/gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.png
new file mode 100644
index 0000000000..ffd9d4893b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.window.png b/gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.window.png
new file mode 100644
index 0000000000..a08018f561
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask_8k.window.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE.png
new file mode 100644
index 0000000000..59611725f8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic.png
new file mode 100644
index 0000000000..6b17748ece
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..7cb996d669
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood.png
new file mode 100644
index 0000000000..172506c26c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..f9f1162ce6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt_OVERLAY.png
new file mode 100644
index 0000000000..9c310b5b09
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/bolt_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell.png
new file mode 100644
index 0000000000..27d4df7081
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma.png
new file mode 100644
index 0000000000..ce3c6377c7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..1c93293744
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell_OVERLAY.png
new file mode 100644
index 0000000000..f02365b9ff
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/cell_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust.png
new file mode 100644
index 0000000000..fad582745d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..64d56b48ea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem.png
new file mode 100644
index 0000000000..a4418db9e1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot.png
new file mode 100644
index 0000000000..85e42b0cd2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2f0577d65f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate.png
new file mode 100644
index 0000000000..8b48da35d2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..ae6d73b7a6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed.png
new file mode 100644
index 0000000000..8a240a574d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged.png
new file mode 100644
index 0000000000..f74931d42a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3741866149
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified.png
new file mode 100644
index 0000000000..17859801da
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..1918a7fa45
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed_OVERLAY.png
new file mode 100644
index 0000000000..7cdf09b174
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/crushed_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust.png
new file mode 100644
index 0000000000..d1282f4248
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..0d8c321826
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustImpure_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..79216e0918
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustPure_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall.png
new file mode 100644
index 0000000000..f29479bf55
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..a35dccba2b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny.png
new file mode 100644
index 0000000000..859cd70116
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..03c07f2760
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dustTiny_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust_OVERLAY.png
new file mode 100644
index 0000000000..cbc30cc68e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/dust_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil.png
new file mode 100644
index 0000000000..cdce151f9a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil_OVERLAY.png
new file mode 100644
index 0000000000..f6fa0b94cc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/foil_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt.png
new file mode 100644
index 0000000000..a7bc0f90f1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall.png
new file mode 100644
index 0000000000..0fe97b84fd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..dddb4764ce
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..d8471aed5f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gearGt_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem.png
new file mode 100644
index 0000000000..b63f9c3b35
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped.png
new file mode 100644
index 0000000000..6b7fc73d7a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..c5abe856a0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemChipped_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite.png
new file mode 100644
index 0000000000..fbbe56cb1c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..50d407491e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed.png
new file mode 100644
index 0000000000..499bf464b3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3561f91a07
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless.png
new file mode 100644
index 0000000000..925e5f7eea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..82f557e199
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem_OVERLAY.png
new file mode 100644
index 0000000000..55468929e9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/gem_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet.png
new file mode 100644
index 0000000000..85f543676f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/handleMallet_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot.png
new file mode 100644
index 0000000000..92bc131a2f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble.png
new file mode 100644
index 0000000000..678c35518b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..c844854d37
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot.png
new file mode 100644
index 0000000000..6fc93f933b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..ebf9b80323
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotHot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple.png
new file mode 100644
index 0000000000..b62d361f19
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..2a63953e92
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple.png
new file mode 100644
index 0000000000..e3ab084563
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..896be7f08e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple.png
new file mode 100644
index 0000000000..b8853a770e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..c086bca2bb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot_OVERLAY.png
new file mode 100644
index 0000000000..c59ef7b1bb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ingot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens.png
new file mode 100644
index 0000000000..4b29fca4c1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens_OVERLAY.png
new file mode 100644
index 0000000000..f3bcc922b2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/lens_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget.png
new file mode 100644
index 0000000000..b1636ee569
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget_OVERLAY.png
new file mode 100644
index 0000000000..2af89ec304
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/nugget_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..1ebeb9fc43
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/oreRaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate.png
new file mode 100644
index 0000000000..d31178c3c6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense.png
new file mode 100644
index 0000000000..4666dd5902
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..037d829395
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDense_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble.png
new file mode 100644
index 0000000000..edb7970730
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..cd358f9d96
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateDouble_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple.png
new file mode 100644
index 0000000000..6840fd312a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..de8ae5af6f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple.png
new file mode 100644
index 0000000000..8a71537dee
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..2d7a80f45e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple.png
new file mode 100644
index 0000000000..6e5d95061c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..f73c531239
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plateTriple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate_OVERLAY.png
new file mode 100644
index 0000000000..f52c654ee5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/plate_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring_OVERLAY.png
new file mode 100644
index 0000000000..5879963ad2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/ring_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor.png
new file mode 100644
index 0000000000..4eefbcd6e3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor_OVERLAY.png
new file mode 100644
index 0000000000..f0d87d27df
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/rotor_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round.png
new file mode 100644
index 0000000000..98480bf685
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round_OVERLAY.png
new file mode 100644
index 0000000000..0916369702
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/round_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw.png
new file mode 100644
index 0000000000..faca2c6e3d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw_OVERLAY.png
new file mode 100644
index 0000000000..c540788917
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/screw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring.png
new file mode 100644
index 0000000000..df442ed454
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall.png
new file mode 100644
index 0000000000..54b3afb24e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..a8170f57d6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/springSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring_OVERLAY.png
new file mode 100644
index 0000000000..fdb0756839
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/spring_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick.png
new file mode 100644
index 0000000000..d999179b3c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong.png
new file mode 100644
index 0000000000..1580b911f0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..54b47c2224
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stickLong_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick_OVERLAY.png
new file mode 100644
index 0000000000..04634628ac
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/stick_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow.png
new file mode 100644
index 0000000000..8cdc9f196f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..09af435c20
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe.png
new file mode 100644
index 0000000000..b09c2128da
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..7f05e61552
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..4a19f4c251
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..778916b614
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw.png
new file mode 100644
index 0000000000..3ab90f5b05
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..318ea2af2d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill.png
new file mode 100644
index 0000000000..0c5f99482c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3dbeb7da6e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile.png
new file mode 100644
index 0000000000..e52d0a01fa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..7890213e56
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer.png
new file mode 100644
index 0000000000..747f647e7e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..b36140bea2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe.png
new file mode 100644
index 0000000000..d0dcfd1e5d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..225d5d1907
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet.png
new file mode 100644
index 0000000000..28d51f02af
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe.png
new file mode 100644
index 0000000000..d10fab88aa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..9374970a7f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow.png
new file mode 100644
index 0000000000..c15a8cdbfa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..520f1bb48c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw.png
new file mode 100644
index 0000000000..eede998107
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..27b69fc23a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..6b0517b879
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..2aea2f961d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..fe6d646dd8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel.png
new file mode 100644
index 0000000000..89fa86a4ce
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..fa0da0ce2a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering.png
new file mode 100644
index 0000000000..5665e03aee
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword.png
new file mode 100644
index 0000000000..36e515be25
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..b9a16a484a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..2f162be760
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..c95bf030b4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench.png
new file mode 100644
index 0000000000..cde1376f59
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..9d0db6f7fb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade.png
new file mode 100644
index 0000000000..59611725f8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/void_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine.png
new file mode 100644
index 0000000000..06f24ab18b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..d5ce76b80f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/ENRICHED/wireFine_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE.png
new file mode 100644
index 0000000000..c78a1d5570
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic.png
new file mode 100644
index 0000000000..d34a721d96
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..3ffb9e31e0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood.png
new file mode 100644
index 0000000000..20de92b986
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..948953f827
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/bolt_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell.png
new file mode 100644
index 0000000000..27d4df7081
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma.png
new file mode 100644
index 0000000000..ce3c6377c7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..1c93293744
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell_OVERLAY.png
new file mode 100644
index 0000000000..f02365b9ff
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/cell_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust.png
new file mode 100644
index 0000000000..fad582745d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..64d56b48ea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem.png
new file mode 100644
index 0000000000..a4418db9e1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot.png
new file mode 100644
index 0000000000..85e42b0cd2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2f0577d65f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate.png
new file mode 100644
index 0000000000..8b48da35d2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..ae6d73b7a6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed.png
new file mode 100644
index 0000000000..8a240a574d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged.png
new file mode 100644
index 0000000000..f74931d42a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified.png
new file mode 100644
index 0000000000..17859801da
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed_OVERLAY.png
new file mode 100644
index 0000000000..b546c4eeec
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/crushed_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust.png
new file mode 100644
index 0000000000..d1282f4248
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..e60e7b6d18
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustImpure_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..496dd33d5b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustPure_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall.png
new file mode 100644
index 0000000000..f29479bf55
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..ebaf1512a8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny.png
new file mode 100644
index 0000000000..859cd70116
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3fad40a7e4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dustTiny_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust_OVERLAY.png
new file mode 100644
index 0000000000..8529b87f57
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/dust_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil.png
new file mode 100644
index 0000000000..cdce151f9a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/foil_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt.png
new file mode 100644
index 0000000000..a7bc0f90f1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall.png
new file mode 100644
index 0000000000..0fe97b84fd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..47ab97c308
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..97d42fe104
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gearGt_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem.png
new file mode 100644
index 0000000000..235bdd740b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped.png
new file mode 100644
index 0000000000..6b7fc73d7a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemChipped_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite.png
new file mode 100644
index 0000000000..fbbe56cb1c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed.png
new file mode 100644
index 0000000000..499bf464b3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless.png
new file mode 100644
index 0000000000..925e5f7eea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/gem_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet.png
new file mode 100644
index 0000000000..9021949091
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/handleMallet_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot.png
new file mode 100644
index 0000000000..92bc131a2f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble.png
new file mode 100644
index 0000000000..678c35518b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot.png
new file mode 100644
index 0000000000..6fc93f933b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..ebf9b80323
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotHot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple.png
new file mode 100644
index 0000000000..b62d361f19
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple.png
new file mode 100644
index 0000000000..e3ab084563
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple.png
new file mode 100644
index 0000000000..b8853a770e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot_OVERLAY.png
new file mode 100644
index 0000000000..fdd7cd358a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ingot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens.png
new file mode 100644
index 0000000000..4b29fca4c1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens_OVERLAY.png
new file mode 100644
index 0000000000..20436f976e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/lens_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget.png
new file mode 100644
index 0000000000..b1636ee569
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget_OVERLAY.png
new file mode 100644
index 0000000000..e8e1fef899
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/nugget_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw.png
new file mode 100644
index 0000000000..9934452754
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..a8a3153147
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/oreRaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate.png
new file mode 100644
index 0000000000..d31178c3c6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense.png
new file mode 100644
index 0000000000..4666dd5902
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDense_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble.png
new file mode 100644
index 0000000000..edb7970730
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateDouble_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple.png
new file mode 100644
index 0000000000..6840fd312a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple.png
new file mode 100644
index 0000000000..8a71537dee
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple.png
new file mode 100644
index 0000000000..6e5d95061c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plateTriple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate_OVERLAY.png
new file mode 100644
index 0000000000..4b5c1998f0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/plate_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring_OVERLAY.png
new file mode 100644
index 0000000000..d5a0c95c2e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/ring_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor.png
new file mode 100644
index 0000000000..14b62252ae
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/rotor_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round.png
new file mode 100644
index 0000000000..98480bf685
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/round_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw.png
new file mode 100644
index 0000000000..faca2c6e3d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/screw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring.png
new file mode 100644
index 0000000000..df442ed454
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall.png
new file mode 100644
index 0000000000..54b3afb24e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/springSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/spring_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick.png
new file mode 100644
index 0000000000..d999179b3c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong.png
new file mode 100644
index 0000000000..1580b911f0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stickLong_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick_OVERLAY.png
new file mode 100644
index 0000000000..f18ad52a73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/stick_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow.png
new file mode 100644
index 0000000000..0f220d5406
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..244fde8251
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe.png
new file mode 100644
index 0000000000..b09c2128da
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..4a19f4c251
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw.png
new file mode 100644
index 0000000000..3ab90f5b05
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill.png
new file mode 100644
index 0000000000..0c5f99482c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile.png
new file mode 100644
index 0000000000..e52d0a01fa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer.png
new file mode 100644
index 0000000000..747f647e7e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe.png
new file mode 100644
index 0000000000..d0dcfd1e5d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet.png
new file mode 100644
index 0000000000..5ca5a9b6ed
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe.png
new file mode 100644
index 0000000000..d10fab88aa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow.png
new file mode 100644
index 0000000000..c15a8cdbfa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw.png
new file mode 100644
index 0000000000..eede998107
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..6b0517b879
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel.png
new file mode 100644
index 0000000000..89fa86a4ce
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering.png
new file mode 100644
index 0000000000..fa9e379c16
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword.png
new file mode 100644
index 0000000000..36e515be25
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..2f162be760
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench.png
new file mode 100644
index 0000000000..cde1376f59
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade.png
new file mode 100644
index 0000000000..c78a1d5570
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/void_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine.png
new file mode 100644
index 0000000000..06f24ab18b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..5e9e05d5b0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_A/wireFine_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell.png
new file mode 100644
index 0000000000..27d4df7081
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma.png
new file mode 100644
index 0000000000..ce3c6377c7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..1c93293744
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell_OVERLAY.png
new file mode 100644
index 0000000000..f02365b9ff
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/cell_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust.png
new file mode 100644
index 0000000000..fad582745d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..64d56b48ea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem.png
new file mode 100644
index 0000000000..a4418db9e1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot.png
new file mode 100644
index 0000000000..85e42b0cd2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2f0577d65f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate.png
new file mode 100644
index 0000000000..8b48da35d2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..ae6d73b7a6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedCentrifuged_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3741866149
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedPurified_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..1918a7fa45
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushed_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushed_OVERLAY.png
new file mode 100644
index 0000000000..7cdf09b174
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/crushed_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dustTiny_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..03c07f2760
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dustTiny_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dust_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dust_OVERLAY.png
new file mode 100644
index 0000000000..cbc30cc68e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/dust_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/foil_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/foil_OVERLAY.png
new file mode 100644
index 0000000000..f6fa0b94cc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/foil_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGtSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..dddb4764ce
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGt_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..d8471aed5f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gearGt_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemChipped_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..c5abe856a0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemChipped_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemExquisite_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..50d407491e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawed_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3561f91a07
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawless_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..82f557e199
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gem_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gem_OVERLAY.png
new file mode 100644
index 0000000000..55468929e9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/gem_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotDouble_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..c844854d37
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotHot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..ebf9b80323
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotHot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuadruple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..2a63953e92
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuintuple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..896be7f08e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotTriple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..c086bca2bb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingot_OVERLAY.png
new file mode 100644
index 0000000000..c59ef7b1bb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ingot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens.png
new file mode 100644
index 0000000000..4b29fca4c1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens_OVERLAY.png
new file mode 100644
index 0000000000..f3bcc922b2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/lens_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/nugget_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/nugget_OVERLAY.png
new file mode 100644
index 0000000000..2af89ec304
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/nugget_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDense_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..037d829395
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDense_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDouble_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..cd358f9d96
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateDouble_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuadruple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..de8ae5af6f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuintuple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..2d7a80f45e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateTriple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..f73c531239
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plateTriple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plate_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plate_OVERLAY.png
new file mode 100644
index 0000000000..f52c654ee5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/plate_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ring_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ring_OVERLAY.png
new file mode 100644
index 0000000000..5879963ad2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/ring_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/rotor_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/rotor_OVERLAY.png
new file mode 100644
index 0000000000..f0d87d27df
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/rotor_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/round_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/round_OVERLAY.png
new file mode 100644
index 0000000000..0916369702
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/round_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/screw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/screw_OVERLAY.png
new file mode 100644
index 0000000000..c540788917
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/screw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/springSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..a8170f57d6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/springSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/spring_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/spring_OVERLAY.png
new file mode 100644
index 0000000000..fdb0756839
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/spring_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stickLong_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..54b47c2224
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stickLong_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stick_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stick_OVERLAY.png
new file mode 100644
index 0000000000..04634628ac
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/stick_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine.png
new file mode 100644
index 0000000000..06f24ab18b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..d5ce76b80f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/Fiery/wireFine_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE.png
new file mode 100644
index 0000000000..4523be43b9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic.png
new file mode 100644
index 0000000000..d34a721d96
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..3ffb9e31e0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood.png
new file mode 100644
index 0000000000..20de92b986
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..948953f827
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/bolt_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell.png
new file mode 100644
index 0000000000..27d4df7081
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma.png
new file mode 100644
index 0000000000..ce3c6377c7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..1c93293744
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell_OVERLAY.png
new file mode 100644
index 0000000000..f02365b9ff
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/cell_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust.png
new file mode 100644
index 0000000000..fad582745d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..64d56b48ea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem.png
new file mode 100644
index 0000000000..a4418db9e1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot.png
new file mode 100644
index 0000000000..85e42b0cd2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2f0577d65f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate.png
new file mode 100644
index 0000000000..8b48da35d2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..ae6d73b7a6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed.png
new file mode 100644
index 0000000000..7f49597676
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged.png
new file mode 100644
index 0000000000..f74931d42a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..819f43c6f6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified.png
new file mode 100644
index 0000000000..e2edcad772
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..75b134d3ef
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed_OVERLAY.png
new file mode 100644
index 0000000000..9ee7575a02
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/crushed_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust.png
new file mode 100644
index 0000000000..d1282f4248
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..e60e7b6d18
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustImpure_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..496dd33d5b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustPure_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall.png
new file mode 100644
index 0000000000..f29479bf55
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..9758a35399
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny.png
new file mode 100644
index 0000000000..859cd70116
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..9ab216d5d2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dustTiny_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust_OVERLAY.png
new file mode 100644
index 0000000000..4d00229736
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/dust_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil.png
new file mode 100644
index 0000000000..cdce151f9a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil_OVERLAY.png
new file mode 100644
index 0000000000..5c94fdce69
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/foil_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt.png
new file mode 100644
index 0000000000..a7bc0f90f1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall.png
new file mode 100644
index 0000000000..0fe97b84fd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..47ab97c308
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..97d42fe104
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gearGt_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem.png
new file mode 100644
index 0000000000..13a798cdc3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped.png
new file mode 100644
index 0000000000..6b7fc73d7a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..9608d2d182
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemChipped_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite.png
new file mode 100644
index 0000000000..fbbe56cb1c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..10d9d54e65
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed.png
new file mode 100644
index 0000000000..499bf464b3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..df8b7b9a75
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless.png
new file mode 100644
index 0000000000..925e5f7eea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..d5845995cc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem_OVERLAY.png
new file mode 100644
index 0000000000..e1fe9bed43
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/gem_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet.png
new file mode 100644
index 0000000000..9021949091
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/handleMallet_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot.png
new file mode 100644
index 0000000000..92bc131a2f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble.png
new file mode 100644
index 0000000000..678c35518b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot.png
new file mode 100644
index 0000000000..6fc93f933b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..ebf9b80323
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotHot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple.png
new file mode 100644
index 0000000000..b62d361f19
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple.png
new file mode 100644
index 0000000000..e3ab084563
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple.png
new file mode 100644
index 0000000000..b8853a770e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot_OVERLAY.png
new file mode 100644
index 0000000000..e0a49831b5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ingot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens.png
new file mode 100644
index 0000000000..4b29fca4c1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens_OVERLAY.png
new file mode 100644
index 0000000000..20436f976e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/lens_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget.png
new file mode 100644
index 0000000000..b1636ee569
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget_OVERLAY.png
new file mode 100644
index 0000000000..78caf2a7ee
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/nugget_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..88fa0ebcc5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/oreRaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate.png
new file mode 100644
index 0000000000..d31178c3c6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense.png
new file mode 100644
index 0000000000..4666dd5902
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..b3441fbf19
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDense_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble.png
new file mode 100644
index 0000000000..edb7970730
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..4253929300
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateDouble_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple.png
new file mode 100644
index 0000000000..6840fd312a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple.png
new file mode 100644
index 0000000000..8a71537dee
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple.png
new file mode 100644
index 0000000000..6e5d95061c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plateTriple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate_OVERLAY.png
new file mode 100644
index 0000000000..574c36552c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/plate_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring_OVERLAY.png
new file mode 100644
index 0000000000..d5a0c95c2e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/ring_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor.png
new file mode 100644
index 0000000000..14b62252ae
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/rotor_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round.png
new file mode 100644
index 0000000000..98480bf685
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/round_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw.png
new file mode 100644
index 0000000000..faca2c6e3d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/screw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring.png
new file mode 100644
index 0000000000..df442ed454
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall.png
new file mode 100644
index 0000000000..54b3afb24e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/springSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/spring_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick.png
new file mode 100644
index 0000000000..d999179b3c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong.png
new file mode 100644
index 0000000000..1580b911f0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..99a3fb2e2b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stickLong_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick_OVERLAY.png
new file mode 100644
index 0000000000..3de14933fa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/stick_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow.png
new file mode 100644
index 0000000000..0f220d5406
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..244fde8251
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe.png
new file mode 100644
index 0000000000..b09c2128da
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..4a19f4c251
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw.png
new file mode 100644
index 0000000000..3ab90f5b05
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill.png
new file mode 100644
index 0000000000..0c5f99482c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile.png
new file mode 100644
index 0000000000..e52d0a01fa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer.png
new file mode 100644
index 0000000000..747f647e7e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe.png
new file mode 100644
index 0000000000..d0dcfd1e5d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet.png
new file mode 100644
index 0000000000..5ca5a9b6ed
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe.png
new file mode 100644
index 0000000000..d10fab88aa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow.png
new file mode 100644
index 0000000000..c15a8cdbfa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw.png
new file mode 100644
index 0000000000..eede998107
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..6b0517b879
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel.png
new file mode 100644
index 0000000000..89fa86a4ce
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering.png
new file mode 100644
index 0000000000..fa9e379c16
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword.png
new file mode 100644
index 0000000000..36e515be25
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..2f162be760
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench.png
new file mode 100644
index 0000000000..cde1376f59
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade.png
new file mode 100644
index 0000000000..4523be43b9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/void_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine.png
new file mode 100644
index 0000000000..06f24ab18b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..5e9e05d5b0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/NUCLEAR/wireFine_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE.png
new file mode 100644
index 0000000000..4523be43b9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic.png
new file mode 100644
index 0000000000..d34a721d96
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..3ffb9e31e0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood.png
new file mode 100644
index 0000000000..20de92b986
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..948953f827
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/bolt_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell.png
new file mode 100644
index 0000000000..27d4df7081
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma.png
new file mode 100644
index 0000000000..ce3c6377c7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..1c93293744
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell_OVERLAY.png
new file mode 100644
index 0000000000..f02365b9ff
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/cell_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust.png
new file mode 100644
index 0000000000..fad582745d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..64d56b48ea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem.png
new file mode 100644
index 0000000000..a4418db9e1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot.png
new file mode 100644
index 0000000000..85e42b0cd2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2f0577d65f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate.png
new file mode 100644
index 0000000000..8b48da35d2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..ae6d73b7a6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed.png
new file mode 100644
index 0000000000..6f893e05b7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged.png
new file mode 100644
index 0000000000..f74931d42a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified.png
new file mode 100644
index 0000000000..12a99bfde1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed_OVERLAY.png
new file mode 100644
index 0000000000..2a7b9e6d6c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/crushed_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust.png
new file mode 100644
index 0000000000..d1282f4248
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..e60e7b6d18
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustImpure_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure.png
new file mode 100644
index 0000000000..8918e54459
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..496dd33d5b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustPure_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall.png
new file mode 100644
index 0000000000..f29479bf55
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..ebaf1512a8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny.png
new file mode 100644
index 0000000000..859cd70116
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3fad40a7e4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dustTiny_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust_OVERLAY.png
new file mode 100644
index 0000000000..8529b87f57
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/dust_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil.png
new file mode 100644
index 0000000000..cdce151f9a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/foil_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt.png
new file mode 100644
index 0000000000..a7bc0f90f1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall.png
new file mode 100644
index 0000000000..0fe97b84fd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..47ab97c308
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..97d42fe104
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gearGt_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem.png
new file mode 100644
index 0000000000..721d19529e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped.png
new file mode 100644
index 0000000000..6b7fc73d7a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemChipped_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite.png
new file mode 100644
index 0000000000..fbbe56cb1c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed.png
new file mode 100644
index 0000000000..499bf464b3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless.png
new file mode 100644
index 0000000000..925e5f7eea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/gem_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet.png
new file mode 100644
index 0000000000..38a7fc65c9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/handleMallet_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot.png
new file mode 100644
index 0000000000..92bc131a2f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble.png
new file mode 100644
index 0000000000..678c35518b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot.png
new file mode 100644
index 0000000000..6fc93f933b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..ebf9b80323
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotHot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple.png
new file mode 100644
index 0000000000..b62d361f19
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple.png
new file mode 100644
index 0000000000..e3ab084563
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple.png
new file mode 100644
index 0000000000..b8853a770e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot_OVERLAY.png
new file mode 100644
index 0000000000..fdd7cd358a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ingot_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens.png
new file mode 100644
index 0000000000..4b29fca4c1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens_OVERLAY.png
new file mode 100644
index 0000000000..23b3ac8f76
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/lens_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget.png
new file mode 100644
index 0000000000..b1636ee569
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget_OVERLAY.png
new file mode 100644
index 0000000000..e8e1fef899
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/nugget_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/oreRaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate.png
new file mode 100644
index 0000000000..d31178c3c6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense.png
new file mode 100644
index 0000000000..4666dd5902
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDense_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble.png
new file mode 100644
index 0000000000..edb7970730
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateDouble_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple.png
new file mode 100644
index 0000000000..6840fd312a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple.png
new file mode 100644
index 0000000000..8a71537dee
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple.png
new file mode 100644
index 0000000000..6e5d95061c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plateTriple_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate_OVERLAY.png
new file mode 100644
index 0000000000..4b5c1998f0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/plate_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring_OVERLAY.png
new file mode 100644
index 0000000000..d5a0c95c2e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/ring_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor.png
new file mode 100644
index 0000000000..751111417a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/rotor_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round.png
new file mode 100644
index 0000000000..98480bf685
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/round_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw.png
new file mode 100644
index 0000000000..faca2c6e3d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/screw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring.png
new file mode 100644
index 0000000000..df442ed454
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall.png
new file mode 100644
index 0000000000..54b3afb24e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/springSmall_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/spring_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick.png
new file mode 100644
index 0000000000..d999179b3c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong.png
new file mode 100644
index 0000000000..1580b911f0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stickLong_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick_OVERLAY.png
new file mode 100644
index 0000000000..f18ad52a73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/stick_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow.png
new file mode 100644
index 0000000000..0f220d5406
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..244fde8251
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe.png
new file mode 100644
index 0000000000..b09c2128da
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..4a19f4c251
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw.png
new file mode 100644
index 0000000000..3ab90f5b05
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill.png
new file mode 100644
index 0000000000..0c5f99482c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile.png
new file mode 100644
index 0000000000..e52d0a01fa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer.png
new file mode 100644
index 0000000000..747f647e7e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe.png
new file mode 100644
index 0000000000..d0dcfd1e5d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet.png
new file mode 100644
index 0000000000..29bd613285
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe.png
new file mode 100644
index 0000000000..d10fab88aa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow.png
new file mode 100644
index 0000000000..c15a8cdbfa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw.png
new file mode 100644
index 0000000000..eede998107
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..6b0517b879
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel.png
new file mode 100644
index 0000000000..89fa86a4ce
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering.png
new file mode 100644
index 0000000000..242dbd14fc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword.png
new file mode 100644
index 0000000000..36e515be25
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..2f162be760
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench.png
new file mode 100644
index 0000000000..cde1376f59
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade.png
new file mode 100644
index 0000000000..4523be43b9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/void_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine.png
new file mode 100644
index 0000000000..06f24ab18b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine_OVERLAY.png b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..5e9e05d5b0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/gregtech/textures/items/materialicons/REFINED/wireFine_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/lang/de_DE.lang b/gtpp/src/main/resources/assets/ic2/lang/de_DE.lang
new file mode 100644
index 0000000000..2d562c59e7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/lang/de_DE.lang
@@ -0,0 +1,29 @@
+ic2.itemEnergeticRotor=Kinetischer Getriebe-Rotor (Energische Legierung)
+ic2.itemTungstenSteelRotor=Kinetischer Getriebe-Rotor (Wolframstahl)
+ic2.itemVibrantRotor=Kinetischer Getriebe-Rotor (Schwingende Legierung)
+ic2.itemIridiumRotor=Kinetischer Getriebe-Rotor (Iridium)
+
+ic2.itemMagnaliumRotor=Kinetischer Getriebe-Rotor (Magnalium)
+ic2.itemUltimetRotor=Kinetischer Getriebe-Rotor (Ultimet)
+
+ic2.blockGenerator=RTG ENERGIE
+ic2.blockGenerator.0=RTG ENERGIE
+ic2.blockGenerator.1=KINETISCHE ENERGIE
+ic2.blockGenerator.2=FEHLER ENERGIE
+ic2.blockGenerator.3=MEHR FEHLER ENERGIE
+
+ic2.blockRTGenerator2=RTG ENERGIE 2
+ic2.blockKineticGenerator2=KINETISCHE ENERGIE 2
+
+ic2.HydrofluoricAcid=Zelle mit industriell verstärkter Flusssäure
+ic2.SulfurDioxide=Zelle mit Schwefeldioxid
+ic2.SulfuricApatite=Zelle mit schwefligem Apatit
+ic2.SulfurousAcid=Zelle mit Schwefelsäure
+
+ic2.HydrogenChloride=Zelle mit industriell verstärkter Salzsäure
+ic2.LithiumHydroxide=Zelle mit Lithiumhydroxid
+ic2.SulfuricLithium=Zelle mit schwefeligem Lithium
+
+ic2.UraniumHexaFluoride=Zelle mit Uran-Hexafluorid
+ic2.ThoriumTetraFluoride=Zelle mit Thorium-Tetrafluorid
+ic2.UraniumTetraFluoride=Zelle mit Uran-Tetrafluorid
diff --git a/gtpp/src/main/resources/assets/ic2/lang/en_US.lang b/gtpp/src/main/resources/assets/ic2/lang/en_US.lang
new file mode 100644
index 0000000000..9b44f2d14e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/lang/en_US.lang
@@ -0,0 +1,35 @@
+ic2.itemEnergeticRotor=Kinetic Gearbox Rotor (Energetic Alloy)
+ic2.itemTungstenSteelRotor=Kinetic Gearbox Rotor (TungstenSteel)
+ic2.itemVibrantRotor=Kinetic Gearbox Rotor (Vibrant Alloy)
+ic2.itemIridiumRotor=Kinetic Gearbox Rotor (Iridium)
+
+ic2.itemMagnaliumRotor=Kinetic Gearbox Rotor (Magnalium)
+ic2.itemUltimetRotor=Kinetic Gearbox Rotor (Ultimet)
+
+ic2.blockGenerator=RTG POWARZ
+ic2.blockGenerator.0=RTG POWA
+ic2.blockGenerator.1=KINETIC POWA
+ic2.blockGenerator.2=ERROR POWA
+ic2.blockGenerator.3=MOAR ERROR POWA
+
+ic2.blockRTGenerator2=RTG POWARZ 2
+ic2.blockKineticGenerator2=KINETIC POWA 2
+
+ic2.HydrofluoricAcid=Industrial Strength Hydrofluoric Acid Cell
+ic2.SulfurDioxide=Sulfur Dioxide Cell
+ic2.SulfuricApatite=Sulfuric Apatite Cell
+ic2.SulfurousAcid=Sulfurous Acid Cell
+
+ic2.HydrogenChloride=Industrial Strength Hydrogen Chloride Cell
+ic2.LithiumHydroxide=Lithium Hydroxide Cell
+ic2.SulfuricLithium=Sulfuric Lithium Cell
+
+ic2.UraniumHexaFluoride=Uranium Hexafluoride Cell
+ic2.ThoriumTetraFluoride=Thorium Tetrafluoride Cell
+ic2.UraniumTetraFluoride=Uranium Tetrafluoride Cell
+
+
+ic2.itemArmorHazmatHelmetEx=Advanced Hazmat Helmet
+ic2.itemArmorHazmatChestplateEx=Advanced Hazmat Suit
+ic2.itemArmorHazmatLeggingsEx=Advanced Hazmat Leggings
+ic2.itemArmorRubBootsEx=Advanced Hazmat Boots \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/ic2/lang/zh_CN.lang b/gtpp/src/main/resources/assets/ic2/lang/zh_CN.lang
new file mode 100644
index 0000000000..384e45f1ff
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/lang/zh_CN.lang
@@ -0,0 +1,35 @@
+ic2.itemEnergeticRotor=动力齿轮转子(充能合金)
+ic2.itemTungstenSteelRotor=动力齿轮转子(钨钢)
+ic2.itemVibrantRotor=动力齿轮转子(脉冲合金)
+ic2.itemIridiumRotor=动力齿轮转子(铱)
+
+ic2.itemMagnaliumRotor=动力齿轮转子(镁铝合金)
+ic2.itemUltimetRotor=动力齿轮转子(哈氏合金)
+
+ic2.blockGenerator=RTG POWARZ
+ic2.blockGenerator.0=RTG POWA
+ic2.blockGenerator.1=KINETIC POWA
+ic2.blockGenerator.2=ERROR POWA
+ic2.blockGenerator.3=MOAR ERROR POWA
+
+ic2.blockRTGenerator2=RTG POWARZ 2
+ic2.blockKineticGenerator2=KINETIC POWA 2
+
+ic2.HydrofluoricAcid=工业强化氢氟酸单元
+ic2.SulfurDioxide=二氧化硫单元
+ic2.SulfuricApatite=硫酸磷灰石单元
+ic2.SulfurousAcid=亚硫酸单元
+
+ic2.HydrogenChloride=工业强化氯化氢单元
+ic2.LithiumHydroxide=氢氧化锂单元
+ic2.SulfuricLithium=硫酸锂单元
+
+ic2.UraniumHexaFluoride=六氟化铀单元
+ic2.ThoriumTetraFluoride=四氟化钍单元
+ic2.UraniumTetraFluoride=四氟化铀单元
+
+
+ic2.itemArmorHazmatHelmetEx=高级防化头盔
+ic2.itemArmorHazmatChestplateEx=高级防化服
+ic2.itemArmorHazmatLeggingsEx=高级防化护腿
+ic2.itemArmorRubBootsEx=高级防化靴子 \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/ic2/textures/armor/hazmatEx_1.png b/gtpp/src/main/resources/assets/ic2/textures/armor/hazmatEx_1.png
new file mode 100644
index 0000000000..2275007fbe
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/armor/hazmatEx_1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/armor/hazmatEx_2.png b/gtpp/src/main/resources/assets/ic2/textures/armor/hazmatEx_2.png
new file mode 100644
index 0000000000..758adafdf2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/armor/hazmatEx_2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/cell/HydrofluoricAcid.png b/gtpp/src/main/resources/assets/ic2/textures/items/cell/HydrofluoricAcid.png
new file mode 100644
index 0000000000..ed907728d4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/cell/HydrofluoricAcid.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/cell/HydrogenChloride.png b/gtpp/src/main/resources/assets/ic2/textures/items/cell/HydrogenChloride.png
new file mode 100644
index 0000000000..135d293637
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/cell/HydrogenChloride.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/cell/LithiumHydroxide.png b/gtpp/src/main/resources/assets/ic2/textures/items/cell/LithiumHydroxide.png
new file mode 100644
index 0000000000..7fefe04c5e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/cell/LithiumHydroxide.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfurDioxide.png b/gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfurDioxide.png
new file mode 100644
index 0000000000..f8bf8329b5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfurDioxide.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfuricApatite.png b/gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfuricApatite.png
new file mode 100644
index 0000000000..5c62c379ab
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfuricApatite.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfuricLithium.png b/gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfuricLithium.png
new file mode 100644
index 0000000000..b8d02729ba
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfuricLithium.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfurousAcid.png b/gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfurousAcid.png
new file mode 100644
index 0000000000..53f8604e13
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/cell/SulfurousAcid.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/cell/ThoriumTetraFluoride.png b/gtpp/src/main/resources/assets/ic2/textures/items/cell/ThoriumTetraFluoride.png
new file mode 100644
index 0000000000..413179e396
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/cell/ThoriumTetraFluoride.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/cell/UraniumHexaFluoride.png b/gtpp/src/main/resources/assets/ic2/textures/items/cell/UraniumHexaFluoride.png
new file mode 100644
index 0000000000..2fe0c893fe
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/cell/UraniumHexaFluoride.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/cell/UraniumTetraFluoride.png b/gtpp/src/main/resources/assets/ic2/textures/items/cell/UraniumTetraFluoride.png
new file mode 100644
index 0000000000..ba2d239308
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/cell/UraniumTetraFluoride.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/itemArmorHazmatChestplateEx.png b/gtpp/src/main/resources/assets/ic2/textures/items/itemArmorHazmatChestplateEx.png
new file mode 100644
index 0000000000..742d1d7035
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/itemArmorHazmatChestplateEx.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/itemArmorHazmatHelmetEx.png b/gtpp/src/main/resources/assets/ic2/textures/items/itemArmorHazmatHelmetEx.png
new file mode 100644
index 0000000000..5340375595
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/itemArmorHazmatHelmetEx.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/itemArmorHazmatLeggingsEx.png b/gtpp/src/main/resources/assets/ic2/textures/items/itemArmorHazmatLeggingsEx.png
new file mode 100644
index 0000000000..80cdca9b23
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/itemArmorHazmatLeggingsEx.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/itemArmorRubBootsEx.png b/gtpp/src/main/resources/assets/ic2/textures/items/itemArmorRubBootsEx.png
new file mode 100644
index 0000000000..901a8fbc35
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/itemArmorRubBootsEx.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemEnergeticRotor.png b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemEnergeticRotor.png
new file mode 100644
index 0000000000..9fef2ec178
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemEnergeticRotor.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemIridiumRotor.png b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemIridiumRotor.png
new file mode 100644
index 0000000000..1f1770ff1c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemIridiumRotor.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemMagnaliumRotor.png b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemMagnaliumRotor.png
new file mode 100644
index 0000000000..d1e2970117
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemMagnaliumRotor.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemTungstenSteelRotor.png b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemTungstenSteelRotor.png
new file mode 100644
index 0000000000..aec47b7c6b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemTungstenSteelRotor.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemUltimetRotor.png b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemUltimetRotor.png
new file mode 100644
index 0000000000..03704d5d12
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemUltimetRotor.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemVibrantRotor.png b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemVibrantRotor.png
new file mode 100644
index 0000000000..34949af9a6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/itemVibrantRotor.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorEnergeticModel.png b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorEnergeticModel.png
new file mode 100644
index 0000000000..045470a2b1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorEnergeticModel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorIridiumModel.png b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorIridiumModel.png
new file mode 100644
index 0000000000..b967b4f1dd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorIridiumModel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorMagnaliumModel.png b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorMagnaliumModel.png
new file mode 100644
index 0000000000..a638c0389f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorMagnaliumModel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorTungstenSteelModel.png b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorTungstenSteelModel.png
new file mode 100644
index 0000000000..7dd2e69f7e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorTungstenSteelModel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorUltimetModel.png b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorUltimetModel.png
new file mode 100644
index 0000000000..b6c3f36716
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorUltimetModel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorVibrantModel.png b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorVibrantModel.png
new file mode 100644
index 0000000000..321de66ff9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/ic2/textures/items/rotors/rotorVibrantModel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/death.ogg b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/death.ogg
new file mode 100644
index 0000000000..412fe5c591
--- /dev/null
+++ b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/death.ogg
Binary files differ
diff --git a/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit1.ogg b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit1.ogg
new file mode 100644
index 0000000000..91ec4976b9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit1.ogg
Binary files differ
diff --git a/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit2.ogg b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit2.ogg
new file mode 100644
index 0000000000..0bdc21aa52
--- /dev/null
+++ b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit2.ogg
Binary files differ
diff --git a/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit3.ogg b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit3.ogg
new file mode 100644
index 0000000000..b7d4429989
--- /dev/null
+++ b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit3.ogg
Binary files differ
diff --git a/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit4.ogg b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit4.ogg
new file mode 100644
index 0000000000..c810364be4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/hit4.ogg
Binary files differ
diff --git a/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/idle1.ogg b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/idle1.ogg
new file mode 100644
index 0000000000..4596d850c1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/idle1.ogg
Binary files differ
diff --git a/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/idle2.ogg b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/idle2.ogg
new file mode 100644
index 0000000000..9d60d58843
--- /dev/null
+++ b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/idle2.ogg
Binary files differ
diff --git a/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/idle3.ogg b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/idle3.ogg
new file mode 100644
index 0000000000..b5134e84d9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/minecraft/sounds/mob/witch/idle3.ogg
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/lang/de_DE.lang b/gtpp/src/main/resources/assets/miscutils/lang/de_DE.lang
new file mode 100644
index 0000000000..e9e5be9332
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/lang/de_DE.lang
@@ -0,0 +1,1899 @@
+//GT++ Items
+
+
+//Creative Tabs
+itemGroup.MiscUtilBlockTab=[GT++] Blöcke
+itemGroup.MiscUtilMiscTab=[GT++] Gegenstände
+itemGroup.MiscUtilCombatTab=[GT++] Kampf
+itemGroup.MiscUtilToolsTab=[GT++] Werkzeuge
+itemGroup.MiscUtilMachineTab=[GT++] Maschinen
+itemGroup.MiscUtilOtherTab=[GT++] Gegenstände II
+itemGroup.MiscUtilBOP=[GT++] Biomes O'Plenty Gegenstände
+
+//Debug
+item.AAA_Broken.name=[Nicht implementierter Gegenstand] Bitte melde dieses Rezept auf Github.
+item.itemBedLocator_Base.name=Bett-Lokalisierer [NBT Test]
+item.itemBaseItemWithCharge.name=Aufladbarer Basisgegenstand
+item.miscutils_itemDebugShapeSpawner.name=[Debug] Formen
+
+//Fluids
+tile.fluidSludge.name=Stehendes Abwasser
+tile.fluidSludge.0.name=Stehendes Abwasser
+
+//Death Messages
+death.attack.plasmabolt=%s wurde durch brennend heißes Plasma getötet.
+death.attack.plasmabolt.player=%1$s wurde von %2$s mit Hilfe von Plasma getötet.
+
+//Alternative Materials
+item.itemPlateBatteryAlloy.name=Platte aus Batterie-Legierung
+item.itemIngotBatteryAlloy.name=Barren aus Batterie-Legierung
+item.itemStickyRubber.name=Gumlet aus klebrigem Gummi
+
+//Unused Fuel rods
+item.itemFuelRod_Empty.name=Leeres Brennelement
+item.itemFuelRod_Thorium.name=Thorium-Brennelement
+item.itemFuelRod_Uranium.name=Uran-Brennelement
+item.itemFuelRod_Plutonium.name=Plutonium-Brennelement
+
+//Entities
+entity.constructStaballoy.name=Stablegierungskonstrukt
+entity.sickBlaze.name=Infizierter Fanatiker
+
+//Tile Entities
+tile.blockToolBuilder.name=GregTech Werkzeug-Konstrukteur
+
+//Tools
+item.itemBufferCore.name=Pufferkern
+item.itemStaballoyPickaxe.name=Tunnelgräber
+item.itemStaballoyAxe.name=Baumfäller
+item.itemSandstoneHammer.name=Bruchsteinbrecher
+
+//Thermal Foundation Stuff
+item.MiscUtils.bucket.bucketPyrotheum.name=Eimer mit flammendem Pyrotheum
+item.MiscUtils.bucket.bucketCryotheum.name=Eimer mit gelenem Kryotheum
+item.MiscUtils.bucket.bucketEnder.name=Eimer mit resonantem Ender
+item.MiscUtils.material.dustPyrotheum.name=Pyrotheumstaub
+item.MiscUtils.material.dustCryotheum.name=Kryotheumstaub
+item.MiscUtils.material.rodBlizz.name=Blizzrute
+item.MiscUtils.material.dustBlizz.name=Blizzstaub
+tile.MiscUtils.fluid.pyrotheum.name=Flammendes Pyrotheum
+tile.MiscUtils.fluid.cryotheum.name=Gelenes Kryotheum
+tile.miscutils.fluid.ender.name=Resonantes Ender
+
+//Forestry Stuff
+item.frameAccelerated.name=Beschleunigter Rahmen
+item.frameVoid.name=Nichts-Rahmen
+item.frameMutagenic.name=Erbgutverändernder Rahmen
+item.frameBusy.name=Arbeitender Rahmen
+item.frameChocolate.name=Schokoladiger Rahmen
+item.frameRestraint.name=Zurückhaltender Rahmen
+item.frameSoul.name=Seelen-Rahmen
+item.frameHealing.name=Heilender Rahmen
+item.frameNova.name=Nova-Rahmen
+item.frameArborists.name=Försters Rahmen
+item.frameDecaying.name=Zersetzender Rahmen
+item.frameSlowing.name=Lähmender Rahmen
+item.frameStabilizing.name=Stabilisierender Rahmen
+item.frameUseless.name=Nutzloser Ramen
+
+//IC2 stuff
+item.itemEnergeticRotorBlade.name=Rotorblatt aus energischer Legierung
+item.itemTungstenSteelRotorBlade.name=Rotorblatt aus Wolframstahl
+item.itemVibrantRotorBlade.name=Rotorblatt aus schwingender Legierung
+item.itemIridiumRotorBlade.name=Rotorblatt aus Iridium
+item.itemEnergeticShaft.name=Welle aus energischer Legierung
+item.itemTungstenSteelShaft.name=Welle aus Wolframstahl
+item.itemVibrantShaft.name=Welle aus schwingender Legierung
+item.itemIridiumShaft.name=Welle aus Iridium
+item.itemMagnaliumRotorBlade.name=Rotorblatt aus Magnalium
+item.itemUltimetRotorBlade.name=Rotorblatt aus Ultimet
+item.itemMagnaliumShaft.name=Welle aus Magnalium
+item.itemUltimetShaft.name=Welle aus Ultimet
+
+
+//Misc Items
+item.itemPLACEHOLDER_Circuit.name=Quark-Manipulator (UV)
+item.itemPlateEnrichedSoularium.name=Platte aus angereichertem Soularium
+item.itemHeliumBlob.name=Geheimnisvolle Wasserstoffsubstanz
+item.itemAlkalusDisk.name=Alkalus-Schallplatte
+
+//Misc Blocks
+tile.blockCompressedObsidian.0.name=Komprimierter Obsidian (9)
+tile.blockCompressedObsidian.1.name=Doppelt-Komprimierter Obsidian (81)
+tile.blockCompressedObsidian.2.name=Dreifach-Komprimierter Obsidian (729)
+tile.blockCompressedObsidian.3.name=Vierfach-Komprimierter Obsidian (6561)
+tile.blockCompressedObsidian.4.name=Fünffach-Komprimierter Obsidian (59049)
+tile.blockCompressedObsidian.5.name=Umgekehrter Obsidian
+tile.blockNet.name=Netz
+
+
+
+//Meta Tool
+MU-metaitem.01.0.name=MU-metaitem.01.0.name
+
+//Cells
+item.SulfurDioxide.name=Hochwertige Schwefeldioxidzelle
+item.Fertiliser.name=Düngemittelzelle
+item.UN32Fertiliser.name=UN-32 Düngemittelzelle
+item.UN18Fertiliser.name=UN-18 Düngemittelzelle
+item.RaisinJuice.name=Rosinensaftzelle
+
+//Resources
+item.itemStickyRubber.name=Gumlet aus klebrigem Gummi
+item.itemCoalCoke.name=Verkokste Kohle
+item.itemHydrogenBlob.name=Mysteriöses Wasserstofftröpfchen
+item.itemHeliumBlob.name=Mysteriöse Wasserstoffsubstanz
+
+//Normal Items
+item.itemAlkalusDisk.name=Alkalus-Schallplatte
+item.itemSimpleFiremaker.name=Einfache Zündhilfe
+item.itemFiber.name=Pflanzenfaser
+item.itemRope.name=Tau
+item.BackpackRed.name=Roter Rucksack
+item.BackpackGreen.name=Grüner Rucksack
+item.BackpackBlue.name=Blauer Rucksack
+item.BackpackYellow.name=Gelber Rucksack
+item.BackpackPurple.name=Lila Rucksack
+item.BackpackCyan.name=Cyaner Rucksack
+item.BackpackMaroon.name=Kastanienbrauner Rucksack
+item.BackpackOlive.name=Olivengrüner Rucksack
+item.BackpackDarkGreen.name=Dunkelgrüner Rucksack
+item.BackpackDarkPurple.name=Dunkellila Rucksack
+item.BackpackTeal.name=Blaugrüner Rucksack
+item.BackpackNavy.name=Navy Rucksack
+item.BackpackSilver.name=Silberner Rucksack
+item.BackpackGray.name=Grauer Rucksack
+item.BackpackBlack.name=Schwarzer Rucksack
+item.BackpackWhite.name=Weißer Rucksack
+item.itemBlueprint.name=Blaupause [Ich bin nutzlos]
+item.itemGemShards.name=Diamantscherbe
+item.itemHalfCompleteCasings.name=Halb-fertige Hülle I
+item.itemSulfuricPotion.name=Werfbare Phiole mit Schwefelsäure
+item.itemHydrofluoricPotion.name=Werfbare Phiole mit Flusssäure
+
+
+
+//Material Items
+item.itemDustGadolinium.name=Gadolinium-Staub
+item.itemDustSmallGadolinium.name=Kleines Häufchen Gadolinium-Staub
+item.itemDustTinyGadolinium.name=Winziges Häufchen Gadolinium-Staub
+item.itemDustYtterbium.name=Ytterbium-Staub
+item.itemDustSmallYtterbium.name=Kleines Häufchen Ytterbium-Staub
+item.itemDustTinyYtterbium.name=Winziges Häufchen Ytterbium-Staub
+item.itemDustSamarium.name=Samarium-Staub
+item.itemDustSmallSamarium.name=Kleines Häufchen Samarium-Staub
+item.itemDustTinySamarium.name=Winziges Häufchen Samarium-Staub
+item.itemDustLanthanum.name=Lanthan-Staub
+item.itemDustSmallLanthanum.name=Kleines Häufchen Lanthan-Staub
+item.itemDustTinyLanthanum.name=Winziges Häufchen Lanthan-Staub
+item.itemCellNeon.name=Neon-Zelle
+item.itemCellGermanium.name=Germanium-Zelle
+item.itemCellSelenium.name=Selen-Zelle
+item.itemCellBromine.name=Brom-Zelle
+item.itemCellKrypton.name=Krypton-Zelle
+item.itemCellZirconium.name=Zirkonium-Zelle
+item.itemCellTechnetium.name=Technetium-Zelle
+item.itemCellRuthenium.name=Ruthenium-Zelle
+item.itemCellRhodium.name=Rhodium-Zelle
+item.itemCellIodine.name=Iod-Zelle
+item.itemCellXenon.name=Xenon-Zelle
+item.itemCellHafnium.name=Hafnium-Zelle
+item.itemCellRhenium.name=Rhenium-Zelle
+item.itemCellThallium.name=Thallium-Zelle
+item.itemCellPolonium.name=Polonium-Zelle
+item.itemCellAstatine.name=Astat-Zelle
+item.itemCellFrancium.name=Francium-Zelle
+item.itemCellRadium.name=Radium-Zelle
+item.itemCellActinium.name=Actinium-Zelle
+item.itemCellProtactinium.name=Protactinium-Zelle
+item.itemCellNeptunium.name=Neptunium-Zelle
+item.itemCellCurium.name=Curium-Zelle
+item.itemCellBerkelium.name=Berkelium-Zelle
+item.itemCellCalifornium.name=Californium-Zelle
+item.itemCellEinsteinium.name=Einsteinium-Zelle
+item.itemCellFermium.name=Fermium-Zelle
+item.itemCellRefinedTrinium.name=Raffinierte Trinium-Zelle
+item.itemIngotSelenium.name=Selen-Barren
+item.itemDustSelenium.name=Selen-Staub
+item.itemDustTinySelenium.name=Winziges Häufchen Selen-Staub
+item.itemDustSmallSelenium.name=Kleines Häufchen Selen-Staub
+item.itemNuggetSelenium.name=Selen-Nugget
+item.itemPlateSelenium.name=Selen-Platte
+item.itemPlateDoubleSelenium.name=Doppelte Selen-Platte
+item.itemBoltSelenium.name=Selen-Bolzen
+item.itemRodSelenium.name=Selen-Stange
+item.itemRodLongSelenium.name=Lange Selen-Stange
+item.itemRingSelenium.name=Selen-Ring
+item.itemScrewSelenium.name=Selen-Schraube
+item.itemRotorSelenium.name=Selen-Rotor
+item.itemGearSelenium.name=Selen-Zahnrad
+item.itemCellUranium232.name=Uran-232-Zelle
+item.itemCellUranium233.name=Uran-233-Zelle
+item.itemCellThoriumTetrafluoride.name=Thorium-Tetrafluorid-Zelle
+item.itemCellThoriumHexafluoride.name=Thorium-Hexafluorid-Zelle
+item.itemCellUraniumTetrafluoride.name=Uran-Tetrafluorid-Zelle
+item.itemCellUraniumHexafluoride.name=Uran-Hexafluorid-Zelle
+item.itemCellZirconiumTetrafluoride.name=Zirkonium-Tetrafluorid-Zelle
+item.itemCellBerylliumFluoride.name=Beryllium-Fluorid-Zelle
+item.itemCellLithiumFluoride.name=Lithium-Fluorid-Zelle
+item.itemCellHydroxide.name=Hydroxid-Zelle
+item.itemCellAmmonium.name=Ammonium-Zelle
+item.itemCellAmmoniumBifluoride.name=Ammonium-Bifluorid-Zelle
+item.itemCellBerylliumHydroxide.name=Beryllium-Hydroxid-Zelle
+item.itemCellAmmoniumTetrafluoroberyllate.name=Ammonium-Tetrafluoroberyllat-Zelle
+item.itemCellNeptuniumHexafluoride.name=Neptunium-Hexafluorid-Zelle
+item.itemCellTechnetiumHexafluoride.name=Technetium-Hexafluorid-Zelle
+item.itemCellSeleniumHexafluoride.name=Selen-Hexafluorid-Zelle
+item.itemCellEnergyCrystal.name=Energiekristall-Zelle
+item.itemCellBloodSteel.name=Blutstahl-Zelle
+item.itemCellStaballoy.name=Staballoy-Zelle
+item.itemCellTantalloy60.name=Tantalloy-60-Zelle
+item.itemCellTantalloy61.name=Tantalloy-61-Zelle
+item.itemCellTumbaga.name=Tumbaga-Zelle
+item.itemCellPotin.name=Potin-Zelle
+item.itemCellInconel625.name=Inconel-625-Zelle
+item.itemCellInconel690.name=Inconel-690-Zelle
+item.itemCellInconel792.name=Inconel-792-Zelle
+item.itemCellZeron100.name=Zeron-100-Zelle
+item.itemCellMaragingSteel250.name=Maraging-Stahl-250-Zelle
+item.itemCellMaragingSteel300.name=Maraging-Stahl-300-Zelle
+item.itemCellMaragingSteel350.name=Maraging-Stahl-350-Zelle
+item.itemCellStellite.name=Stellite-Zelle
+item.itemCellTalonite.name=Talonite-Zelle
+item.itemCellHastelloyW.name=Hastelloy-W-Zelle
+item.itemCellHastelloyX.name=Hastelloy-X-Zelle
+item.itemCellHastelloyN.name=Hastelloy-N-Zelle
+item.itemCellHastelloyC276.name=Hastelloy-C276-Zelle
+item.itemCellIncoloy020.name=Incoloy-020-Zelle
+item.itemCellIncoloyDS.name=Incoloy-DS-Zelle
+item.itemCellIncoloyMA956.name=Incoloy-MA956-Zelle
+item.itemCellTungstenCarbide.name=Wolframcarbid-Zelle
+item.itemCellSiliconCarbide.name=Siliziumcarbid-Zelle
+item.itemCellTantalumCarbide.name=Tantalcarbid-Zelle
+item.itemCellZirconiumCarbide.name=Zirkoniumcarbid-Zelle
+item.itemCellNiobiumCarbide.name=Niobcarbid-Zelle
+item.itemCellGrisium.name=Grisium-Zelle
+item.itemCellEglinSteelBaseCompound.name=Eglin-Stahl Base Compound-Zelle
+item.itemCellEglinSteel.name=Eglin-Stahl-Zelle
+item.itemCellHG1223.name=HG-1223-Zelle
+item.itemCellTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Zelle
+item.itemCellTriniumNaquadahAlloy.name=Trinium-Naquadah-Legierung-Zelle
+item.itemCellTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Zelle
+item.itemCellQuantum.name=Quanten-Zelle
+item.itemIngotBromine.name=Brom-Barren
+item.itemDustBromine.name=Brom-Staub
+item.itemDustTinyBromine.name=Winziges Häufchen Brom-Staub
+item.itemDustSmallBromine.name=Kleines Häufchen Brom-Staub
+item.itemNuggetBromine.name=Brom-Nugget
+item.itemPlateBromine.name=Brom-Platte
+item.itemPlateDoubleBromine.name=Doppelte Brom-Platte
+item.itemIngotStrontium.name=Strontium-Barren
+item.itemDustStrontium.name=Strontium-Staub
+item.itemDustTinyStrontium.name=Winziges Häufchen Strontium-Staub
+item.itemDustSmallStrontium.name=Kleines Häufchen Strontium-Staub
+item.itemNuggetStrontium.name=Strontium-Nugget
+item.itemPlateStrontium.name=Strontium-Platte
+item.itemPlateDoubleStrontium.name=Doppelte Strontium-Platte
+item.itemBoltStrontium.name=Strontium-Bolzen
+item.itemRodStrontium.name=Strontium-Stange
+item.itemRodLongStrontium.name=Lange Strontium-Stange
+item.itemRingStrontium.name=Strontium-Ring
+item.itemScrewStrontium.name=Strontium-Schraube
+item.itemRotorStrontium.name=Strontium-Rotor
+item.itemGearStrontium.name=Strontium-Zahnrad
+item.itemIngotZirconium.name=Zirkonium-Barren
+item.itemDustZirconium.name=Zirkonium-Staub
+item.itemDustTinyZirconium.name=Winziges Häufchen Zirkonium-Staub
+item.itemDustSmallZirconium.name=Kleines Häufchen Zirkonium-Staub
+item.itemNuggetZirconium.name=Zirkonium-Nugget
+item.itemPlateZirconium.name=Zirkonium-Platte
+item.itemPlateDoubleZirconium.name=Doppelte Zirkonium-Platte
+item.itemBoltZirconium.name=Zirkonium-Bolzen
+item.itemRodZirconium.name=Zirkonium-Stange
+item.itemRodLongZirconium.name=Lange Zirkonium-Stange
+item.itemRingZirconium.name=Zirkonium-Ring
+item.itemScrewZirconium.name=Zirkonium-Schraube
+item.itemRotorZirconium.name=Zirkonium-Rotor
+item.itemGearZirconium.name=Zirkonium-Zahnrad
+item.itemIngotRuthenium.name=Ruthenium-Barren
+item.itemDustRuthenium.name=Ruthenium-Staub
+item.itemDustTinyRuthenium.name=Winziges Häufchen Ruthenium-Staub
+item.itemDustSmallRuthenium.name=Kleines Häufchen Ruthenium-Staub
+item.itemNuggetRuthenium.name=Ruthenium-Nugget
+item.itemPlateRuthenium.name=Ruthenium-Platte
+item.itemPlateDoubleRuthenium.name=Doppelte Ruthenium-Platte
+item.itemBoltRuthenium.name=Ruthenium-Bolzen
+item.itemRodRuthenium.name=Ruthenium-Stange
+item.itemRodLongRuthenium.name=Lange Ruthenium-Stange
+item.itemRingRuthenium.name=Ruthenium-Ring
+item.itemScrewRuthenium.name=Ruthenium-Schraube
+item.itemRotorRuthenium.name=Ruthenium-Rotor
+item.itemGearRuthenium.name=Ruthenium-Zahnrad
+item.itemIngotIodine.name=Iod-Barren
+item.itemDustIodine.name=Iod-Staub
+item.itemDustTinyIodine.name=Winziges Häufchen Iod-Staub
+item.itemDustSmallIodine.name=Kleines Häufchen Iod-Staub
+item.itemNuggetIodine.name=Iod-Nugget
+item.itemPlateIodine.name=Iod-Platte
+item.itemPlateDoubleIodine.name=Doppelte Iod-Platte
+item.itemBoltIodine.name=Iod-Bolzen
+item.itemRodIodine.name=Iod-Stange
+item.itemRodLongIodine.name=Lange Iod-Stange
+item.itemRingIodine.name=Iod-Ring
+item.itemScrewIodine.name=Iod-Schraube
+item.itemRotorIodine.name=Iod-Rotor
+item.itemGearIodine.name=Iod-Zahnrad
+item.itemIngotHafnium.name=Hafnium-Barren
+item.itemDustHafnium.name=Hafnium-Staub
+item.itemDustTinyHafnium.name=Winziges Häufchen Hafnium-Staub
+item.itemDustSmallHafnium.name=Kleines Häufchen Hafnium-Staub
+item.itemNuggetHafnium.name=Hafnium-Nugget
+item.itemPlateHafnium.name=Hafnium-Platte
+item.itemPlateDoubleHafnium.name=Doppelte Hafnium-Platte
+item.itemBoltHafnium.name=Hafnium-Bolzen
+item.itemRodHafnium.name=Hafnium-Stange
+item.itemRodLongHafnium.name=Lange Hafnium-Stange
+item.itemRingHafnium.name=Hafnium-Ring
+item.itemScrewHafnium.name=Hafnium-Schraube
+item.itemRotorHafnium.name=Hafnium-Rotor
+item.itemGearHafnium.name=Hafnium-Zahnrad
+item.itemIngotDysprosium.name=Dysprosium-Barren
+item.itemDustDysprosium.name=Dysprosium-Staub
+item.itemDustTinyDysprosium.name=Winziges Häufchen Dysprosium-Staub
+item.itemDustSmallDysprosium.name=Kleines Häufchen Dysprosium-Staub
+item.itemNuggetDysprosium.name=Dysprosium-Nugget
+item.itemPlateDysprosium.name=Dysprosium-Platte
+item.itemPlateDoubleDysprosium.name=Doppelte Dysprosium-Platte
+item.itemBoltDysprosium.name=Dysprosium-Bolzen
+item.itemRodDysprosium.name=Dysprosium-Stange
+item.itemRodLongDysprosium.name=Lange Dysprosium-Stange
+item.itemRingDysprosium.name=Dysprosium-Ring
+item.itemScrewDysprosium.name=Dysprosium-Schraube
+item.itemRotorDysprosium.name=Dysprosium-Rotor
+item.itemGearDysprosium.name=Dysprosium-Zahnrad
+item.itemIngotTellurium.name=Tellurium-Barren
+item.itemDustTellurium.name=Tellurium-Staub
+item.itemDustTinyTellurium.name=Winziges Häufchen Tellurium-Staub
+item.itemDustSmallTellurium.name=Kleines Häufchen Tellurium-Staub
+item.itemNuggetTellurium.name=Tellurium-Nugget
+item.itemPlateTellurium.name=Tellurium-Platte
+item.itemPlateDoubleTellurium.name=Doppelte Tellurium-Platte
+item.itemBoltTellurium.name=Tellurium-Bolzen
+item.itemRodTellurium.name=Tellurium-Stange
+item.itemRodLongTellurium.name=Lange Tellurium-Stange
+item.itemRingTellurium.name=Tellurium-Ring
+item.itemScrewTellurium.name=Tellurium-Schraube
+item.itemRotorTellurium.name=Tellurium-Rotor
+item.itemGearTellurium.name=Tellurium-Zahnrad
+item.itemIngotRhodium.name=Rhodium-Barren
+item.itemDustRhodium.name=Rhodium-Staub
+item.itemDustTinyRhodium.name=Winziges Häufchen Rhodium-Staub
+item.itemDustSmallRhodium.name=Kleines Häufchen Rhodium-Staub
+item.itemNuggetRhodium.name=Rhodium-Nugget
+item.itemPlateRhodium.name=Rhodium-Platte
+item.itemPlateDoubleRhodium.name=Doppelte Rhodium-Platte
+item.itemBoltRhodium.name=Rhodium-Bolzen
+item.itemRodRhodium.name=Rhodium-Stange
+item.itemRodLongRhodium.name=Lange Rhodium-Stange
+item.itemRingRhodium.name=Rhodium-Ring
+item.itemScrewRhodium.name=Rhodium-Schraube
+item.itemRotorRhodium.name=Rhodium-Rotor
+item.itemGearRhodium.name=Rhodium-Zahnrad
+item.itemIngotRhenium.name=Rhenium-Barren
+item.itemDustRhenium.name=Rhenium-Staub
+item.itemDustTinyRhenium.name=Winziges Häufchen Rhenium-Staub
+item.itemDustSmallRhenium.name=Kleines Häufchen Rhenium-Staub
+item.itemNuggetRhenium.name=Rhenium-Nugget
+item.itemPlateRhenium.name=Rhenium-Platte
+item.itemPlateDoubleRhenium.name=Doppelte Rhenium-Platte
+item.itemBoltRhenium.name=Rhenium-Bolzen
+item.itemRodRhenium.name=Rhenium-Stange
+item.itemRodLongRhenium.name=Lange Rhenium-Stange
+item.itemRingRhenium.name=Rhenium-Ring
+item.itemScrewRhenium.name=Rhenium-Schraube
+item.itemRotorRhenium.name=Rhenium-Rotor
+item.itemGearRhenium.name=Rhenium-Zahnrad
+item.itemIngotThallium.name=Thallium-Barren
+item.itemDustThallium.name=Thallium-Staub
+item.itemDustTinyThallium.name=Winziges Häufchen Thallium-Staub
+item.itemDustSmallThallium.name=Kleines Häufchen Thallium-Staub
+item.itemNuggetThallium.name=Thallium-Nugget
+item.itemPlateThallium.name=Thallium-Platte
+item.itemPlateDoubleThallium.name=Doppelte Thallium-Platte
+item.itemBoltThallium.name=Thallium-Bolzen
+item.itemRodThallium.name=Thallium-Stange
+item.itemRodLongThallium.name=Lange Thallium-Stange
+item.itemRingThallium.name=Thallium-Ring
+item.itemScrewThallium.name=Thallium-Schraube
+item.itemRotorThallium.name=Thallium-Rotor
+item.itemGearThallium.name=Thallium-Zahnrad
+item.itemIngotTechnetium.name=Technetium-Barren
+item.itemDustTechnetium.name=Technetium-Staub
+item.itemDustTinyTechnetium.name=Winziges Häufchen Technetium-Staub
+item.itemDustSmallTechnetium.name=Kleines Häufchen Technetium-Staub
+item.itemNuggetTechnetium.name=Technetium-Nugget
+item.itemPlateTechnetium.name=Technetium-Platte
+item.itemPlateDoubleTechnetium.name=Doppelte Technetium-Platte
+item.itemIngotPolonium.name=Polonium-Barren
+item.itemDustPolonium.name=Polonium-Staub
+item.itemDustTinyPolonium.name=Winziges Häufchen Polonium-Staub
+item.itemDustSmallPolonium.name=Kleines Häufchen Polonium-Staub
+item.itemNuggetPolonium.name=Polonium-Nugget
+item.itemPlatePolonium.name=Polonium-Platte
+item.itemPlateDoublePolonium.name=Doppelte Polonium-Platte
+item.itemIngotAstatine.name=Astat-Barren
+item.itemDustAstatine.name=Astat-Staub
+item.itemDustTinyAstatine.name=Winziges Häufchen Astat-Staub
+item.itemDustSmallAstatine.name=Kleines Häufchen Astat-Staub
+item.itemNuggetAstatine.name=Astat-Nugget
+item.itemPlateAstatine.name=Astat-Platte
+item.itemPlateDoubleAstatine.name=Doppelte Astat-Platte
+item.itemIngotFrancium.name=Francium-Barren
+item.itemDustFrancium.name=Francium-Staub
+item.itemDustTinyFrancium.name=Winziges Häufchen Francium-Staub
+item.itemDustSmallFrancium.name=Kleines Häufchen Francium-Staub
+item.itemNuggetFrancium.name=Francium-Nugget
+item.itemPlateFrancium.name=Francium-Platte
+item.itemPlateDoubleFrancium.name=Doppelte Francium-Platte
+item.itemIngotRadium.name=Radium-Barren
+item.itemDustRadium.name=Radium-Staub
+item.itemDustTinyRadium.name=Winziges Häufchen Radium-Staub
+item.itemDustSmallRadium.name=Kleines Häufchen Radium-Staub
+item.itemNuggetRadium.name=Radium-Nugget
+item.itemPlateRadium.name=Radium-Platte
+item.itemPlateDoubleRadium.name=Doppelte Radium-Platte
+item.itemIngotActinium.name=Actinium-Barren
+item.itemDustActinium.name=Actinium-Staub
+item.itemDustTinyActinium.name=Winziges Häufchen Actinium-Staub
+item.itemDustSmallActinium.name=Kleines Häufchen Actinium-Staub
+item.itemNuggetActinium.name=Actinium-Nugget
+item.itemPlateActinium.name=Actinium-Platte
+item.itemPlateDoubleActinium.name=Doppelte Actinium-Platte
+item.itemIngotProtactinium.name=Protactinium-Barren
+item.itemDustProtactinium.name=Protactinium-Staub
+item.itemDustTinyProtactinium.name=Winziges Häufchen Protactinium-Staub
+item.itemDustSmallProtactinium.name=Kleines Häufchen Protactinium-Staub
+item.itemNuggetProtactinium.name=Protactinium-Nugget
+item.itemPlateProtactinium.name=Protactinium-Platte
+item.itemPlateDoubleProtactinium.name=Doppelte Protactinium-Platte
+item.itemIngotNeptunium.name=Neptunium-Barren
+item.itemDustNeptunium.name=Neptunium-Staub
+item.itemDustTinyNeptunium.name=Winziges Häufchen Neptunium-Staub
+item.itemDustSmallNeptunium.name=Kleines Häufchen Neptunium-Staub
+item.itemNuggetNeptunium.name=Neptunium-Nugget
+item.itemPlateNeptunium.name=Neptunium-Platte
+item.itemPlateDoubleNeptunium.name=Doppelte Neptunium-Platte
+item.itemIngotCurium.name=Curium-Barren
+item.itemDustCurium.name=Curium-Staub
+item.itemDustTinyCurium.name=Winziges Häufchen Curium-Staub
+item.itemDustSmallCurium.name=Kleines Häufchen Curium-Staub
+item.itemNuggetCurium.name=Curium-Nugget
+item.itemPlateCurium.name=Curium-Platte
+item.itemPlateDoubleCurium.name=Doppelte Curium-Platte
+item.itemIngotBerkelium.name=Berkelium-Barren
+item.itemDustBerkelium.name=Berkelium-Staub
+item.itemDustTinyBerkelium.name=Winziges Häufchen Berkelium-Staub
+item.itemDustSmallBerkelium.name=Kleines Häufchen Berkelium-Staub
+item.itemNuggetBerkelium.name=Berkelium-Nugget
+item.itemPlateBerkelium.name=Berkelium-Platte
+item.itemPlateDoubleBerkelium.name=Doppelte Berkelium-Platte
+item.itemIngotCalifornium.name=Californium-Barren
+item.itemDustCalifornium.name=Californium-Staub
+item.itemDustTinyCalifornium.name=Winziges Häufchen Californium-Staub
+item.itemDustSmallCalifornium.name=Kleines Häufchen Californium-Staub
+item.itemNuggetCalifornium.name=Californium-Nugget
+item.itemPlateCalifornium.name=Californium-Platte
+item.itemPlateDoubleCalifornium.name=Doppelte Californium-Platte
+item.itemIngotEinsteinium.name=Einsteinium-Barren
+item.itemDustEinsteinium.name=Einsteinium-Staub
+item.itemDustTinyEinsteinium.name=Winziges Häufchen Einsteinium-Staub
+item.itemDustSmallEinsteinium.name=Kleines Häufchen Einsteinium-Staub
+item.itemNuggetEinsteinium.name=Einsteinium-Nugget
+item.itemPlateEinsteinium.name=Einsteinium-Platte
+item.itemPlateDoubleEinsteinium.name=Doppelte Einsteinium-Platte
+item.itemIngotFermium.name=Fermium-Barren
+item.itemDustFermium.name=Fermium-Staub
+item.itemDustTinyFermium.name=Winziges Häufchen Fermium-Staub
+item.itemDustSmallFermium.name=Kleines Häufchen Fermium-Staub
+item.itemNuggetFermium.name=Fermium-Nugget
+item.itemPlateFermium.name=Fermium-Platte
+item.itemPlateDoubleFermium.name=Doppelte Fermium-Platte
+item.itemIngotLithium7.name=Lithium-7-Barren
+item.itemDustLithium7.name=Lithium-7-Staub
+item.itemDustTinyLithium7.name=Winziges Häufchen Lithium-7-Staub
+item.itemDustSmallLithium7.name=Kleines Häufchen Lithium-7-Staub
+item.itemNuggetLithium7.name=Lithium-7-Nugget
+item.itemPlateLithium7.name=Lithium-7-Platte
+item.itemPlateDoubleLithium7.name=Doppelte Lithium-7-Platte
+item.itemIngotThorium232.name=Thorium-232-Barren
+item.itemDustThorium232.name=Thorium-232-Staub
+item.itemDustTinyThorium232.name=Winziges Häufchen Thorium-232-Staub
+item.itemDustSmallThorium232.name=Kleines Häufchen Thorium-232-Staub
+item.itemNuggetThorium232.name=Thorium-232-Nugget
+item.itemPlateThorium232.name=Thorium-232-Platte
+item.itemPlateDoubleThorium232.name=Doppelte Thorium-232-Platte
+item.itemIngotUranium232.name=Uran-232-Barren
+item.itemDustUranium232.name=Uran-232-Staub
+item.itemDustTinyUranium232.name=Winziges Häufchen Uran-232-Staub
+item.itemDustSmallUranium232.name=Kleines Häufchen Uran-232-Staub
+item.itemNuggetUranium232.name=Uran-232-Nugget
+item.itemPlateUranium232.name=Uran-232-Platte
+item.itemRodUranium232.name=Uran-232-Stange
+item.itemRodLongUranium232.name=Lange Uran-232-Stange
+item.itemIngotUranium233.name=Uran-233-Barren
+item.itemDustUranium233.name=Uran-233-Staub
+item.itemDustTinyUranium233.name=Winziges Häufchen Uran-233-Staub
+item.itemDustSmallUranium233.name=Kleines Häufchen Uran-233-Staub
+item.itemNuggetUranium233.name=Uran-233-Nugget
+item.itemPlateUranium233.name=Uran-233-Platte
+item.itemRodUranium233.name=Uran-233-Stange
+item.itemRodLongUranium233.name=Lange Uran-233-Stange
+item.itemIngotPlutonium238.name=Plutonium-238-Barren
+item.itemDustPlutonium238.name=Plutonium-238-Staub
+item.itemDustTinyPlutonium238.name=Winziges Häufchen Plutonium-238-Staub
+item.itemDustSmallPlutonium238.name=Kleines Häufchen Plutonium-238-Staub
+item.itemNuggetPlutonium238.name=Plutonium-238-Nugget
+item.itemPlatePlutonium238.name=Plutonium-238-Platte
+item.itemPlateDoublePlutonium238.name=Doppelte Plutonium-238-Platte
+item.itemIngotStrontium90.name=Strontium-90-Barren
+item.itemDustStrontium90.name=Strontium-90-Staub
+item.itemDustTinyStrontium90.name=Winziges Häufchen Strontium-90-Staub
+item.itemDustSmallStrontium90.name=Kleines Häufchen Strontium-90-Staub
+item.itemNuggetStrontium90.name=Strontium-90-Nugget
+item.itemPlateStrontium90.name=Strontium-90-Platte
+item.itemPlateDoubleStrontium90.name=Doppelte Strontium-90-Platte
+item.itemIngotPolonium210.name=Polonium-210-Barren
+item.itemDustPolonium210.name=Polonium-210-Staub
+item.itemDustTinyPolonium210.name=Winziges Häufchen Polonium-210-Staub
+item.itemDustSmallPolonium210.name=Kleines Häufchen Polonium-210-Staub
+item.itemNuggetPolonium210.name=Polonium-210-Nugget
+item.itemPlatePolonium210.name=Polonium-210-Platte
+item.itemPlateDoublePolonium210.name=Doppelte Polonium-210-Platte
+item.itemIngotAmericium241.name=Americium-241-Barren
+item.itemDustAmericium241.name=Americium-241-Staub
+item.itemDustTinyAmericium241.name=Winziges Häufchen Americium-241-Staub
+item.itemDustSmallAmericium241.name=Kleines Häufchen Americium-241-Staub
+item.itemNuggetAmericium241.name=Americium-241-Nugget
+item.itemPlateAmericium241.name=Americium-241-Platte
+item.itemPlateDoubleAmericium241.name=Doppelte Americium-241-Platte
+item.itemIngotSiliconCarbide.name=Siliziumcarbid-Barren
+item.itemDustSiliconCarbide.name=Siliziumcarbid-Staub
+item.itemDustTinySiliconCarbide.name=Winziges Häufchen Siliziumcarbid-Staub
+item.itemDustSmallSiliconCarbide.name=Kleines Häufchen Siliziumcarbid-Staub
+item.itemNuggetSiliconCarbide.name=Siliziumcarbid-Nugget
+item.itemPlateSiliconCarbide.name=Siliziumcarbid-Platte
+item.itemPlateDoubleSiliconCarbide.name=Doppelte Siliziumcarbid-Platte
+item.itemBoltSiliconCarbide.name=Siliziumcarbid-Bolzen
+item.itemRodSiliconCarbide.name=Siliziumcarbid-Stange
+item.itemRodLongSiliconCarbide.name=Lange Siliziumcarbid-Stange
+item.itemRingSiliconCarbide.name=Siliziumcarbid-Ring
+item.itemScrewSiliconCarbide.name=Siliziumcarbid-Schraube
+item.itemRotorSiliconCarbide.name=Siliziumcarbid-Rotor
+item.itemGearSiliconCarbide.name=Siliziumcarbid-Zahnrad
+item.itemIngotZirconiumCarbide.name=Zirkoniumcarbid-Barren
+item.itemHotIngotZirconiumCarbide.name=Hot Zirkoniumcarbid-Barren
+item.itemDustZirconiumCarbide.name=Zirkoniumcarbid-Staub
+item.itemDustTinyZirconiumCarbide.name=Winziges Häufchen Zirkoniumcarbid-Staub
+item.itemDustSmallZirconiumCarbide.name=Kleines Häufchen Zirkoniumcarbid-Staub
+item.itemNuggetZirconiumCarbide.name=Zirkoniumcarbid-Nugget
+item.itemPlateZirconiumCarbide.name=Zirkoniumcarbid-Platte
+item.itemPlateDoubleZirconiumCarbide.name=Doppelte Zirkoniumcarbid-Platte
+item.itemBoltZirconiumCarbide.name=Zirkoniumcarbid-Bolzen
+item.itemRodZirconiumCarbide.name=Zirkoniumcarbid-Stange
+item.itemRodLongZirconiumCarbide.name=Lange Zirkoniumcarbid-Stange
+item.itemRingZirconiumCarbide.name=Zirkoniumcarbid-Ring
+item.itemScrewZirconiumCarbide.name=Zirkoniumcarbid-Schraube
+item.itemRotorZirconiumCarbide.name=Zirkoniumcarbid-Rotor
+item.itemGearZirconiumCarbide.name=Zirkoniumcarbid-Zahnrad
+item.itemIngotTantalumCarbide.name=Tantalcarbid-Barren
+item.itemHotIngotTantalumCarbide.name=Hot Tantalcarbid-Barren
+item.itemDustTantalumCarbide.name=Tantalcarbid-Staub
+item.itemDustTinyTantalumCarbide.name=Winziges Häufchen Tantalcarbid-Staub
+item.itemDustSmallTantalumCarbide.name=Kleines Häufchen Tantalcarbid-Staub
+item.itemNuggetTantalumCarbide.name=Tantalcarbid-Nugget
+item.itemPlateTantalumCarbide.name=Tantalcarbid-Platte
+item.itemPlateDoubleTantalumCarbide.name=Doppelte Tantalcarbid-Platte
+item.itemBoltTantalumCarbide.name=Tantalcarbid-Bolzen
+item.itemRodTantalumCarbide.name=Tantalcarbid-Stange
+item.itemRodLongTantalumCarbide.name=Lange Tantalcarbid-Stange
+item.itemRingTantalumCarbide.name=Tantalcarbid-Ring
+item.itemScrewTantalumCarbide.name=Tantalcarbid-Schraube
+item.itemRotorTantalumCarbide.name=Tantalcarbid-Rotor
+item.itemGearTantalumCarbide.name=Tantalcarbid-Zahnrad
+item.itemIngotNiobiumCarbide.name=Niobcarbid-Barren
+item.itemHotIngotNiobiumCarbide.name=Hot Niobcarbid-Barren
+item.itemDustNiobiumCarbide.name=Niobcarbid-Staub
+item.itemDustTinyNiobiumCarbide.name=Winziges Häufchen Niobcarbid-Staub
+item.itemDustSmallNiobiumCarbide.name=Kleines Häufchen Niobcarbid-Staub
+item.itemNuggetNiobiumCarbide.name=Niobcarbid-Nugget
+item.itemPlateNiobiumCarbide.name=Niobcarbid-Platte
+item.itemPlateDoubleNiobiumCarbide.name=Doppelte Niobcarbid-Platte
+item.itemBoltNiobiumCarbide.name=Niobcarbid-Bolzen
+item.itemRodNiobiumCarbide.name=Niobcarbid-Stange
+item.itemRodLongNiobiumCarbide.name=Lange Niobcarbid-Stange
+item.itemRingNiobiumCarbide.name=Niobcarbid-Ring
+item.itemScrewNiobiumCarbide.name=Niobcarbid-Schraube
+item.itemRotorNiobiumCarbide.name=Niobcarbid-Rotor
+item.itemGearNiobiumCarbide.name=Niobcarbid-Zahnrad
+item.itemIngotBerylliumFluoride.name=Beryllium-Fluorid-Barren
+item.itemDustBerylliumFluoride.name=Beryllium-Fluorid-Staub
+item.itemDustTinyBerylliumFluoride.name=Winziges Häufchen Beryllium-Fluorid-Staub
+item.itemDustSmallBerylliumFluoride.name=Kleines Häufchen Beryllium-Fluorid-Staub
+item.itemNuggetBerylliumFluoride.name=Beryllium-Fluorid-Nugget
+item.itemPlateBerylliumFluoride.name=Beryllium-Fluorid-Platte
+item.itemPlateDoubleBerylliumFluoride.name=Doppelte Beryllium-Fluorid-Platte
+item.itemIngotLithiumFluoride.name=Lithium-Fluorid-Barren
+item.itemDustLithiumFluoride.name=Lithium-Fluorid-Staub
+item.itemDustTinyLithiumFluoride.name=Winziges Häufchen Lithium-Fluorid-Staub
+item.itemDustSmallLithiumFluoride.name=Kleines Häufchen Lithium-Fluorid-Staub
+item.itemNuggetLithiumFluoride.name=Lithium-Fluorid-Nugget
+item.itemPlateLithiumFluoride.name=Lithium-Fluorid-Platte
+item.itemPlateDoubleLithiumFluoride.name=Doppelte Lithium-Fluorid-Platte
+item.itemIngotThoriumTetrafluoride.name=Thorium-Tetrafluorid-Barren
+item.itemDustThoriumTetrafluoride.name=Thorium-Tetrafluorid-Staub
+item.itemDustTinyThoriumTetrafluoride.name=Winziges Häufchen Thorium-Tetrafluorid-Staub
+item.itemDustSmallThoriumTetrafluoride.name=Kleines Häufchen Thorium-Tetrafluorid-Staub
+item.itemNuggetThoriumTetrafluoride.name=Thorium-Tetrafluorid-Nugget
+item.itemPlateThoriumTetrafluoride.name=Thorium-Tetrafluorid-Platte
+item.itemPlateDoubleThoriumTetrafluoride.name=Doppelte Thorium-Tetrafluorid-Platte
+item.itemIngotThoriumHexafluoride.name=Thorium-Hexafluorid-Barren
+item.itemDustThoriumHexafluoride.name=Thorium-Hexafluorid-Staub
+item.itemDustTinyThoriumHexafluoride.name=Winziges Häufchen Thorium-Hexafluorid-Staub
+item.itemDustSmallThoriumHexafluoride.name=Kleines Häufchen Thorium-Hexafluorid-Staub
+item.itemNuggetThoriumHexafluoride.name=Thorium-Hexafluorid-Nugget
+item.itemPlateThoriumHexafluoride.name=Thorium-Hexafluorid-Platte
+item.itemPlateDoubleThoriumHexafluoride.name=Doppelte Thorium-Hexafluorid-Platte
+item.itemIngotUraniumTetrafluoride.name=Uran-Tetrafluorid-Barren
+item.itemDustUraniumTetrafluoride.name=Uran-Tetrafluorid-Staub
+item.itemDustTinyUraniumTetrafluoride.name=Winziges Häufchen Uran-Tetrafluorid-Staub
+item.itemDustSmallUraniumTetrafluoride.name=Kleines Häufchen Uran-Tetrafluorid-Staub
+item.itemNuggetUraniumTetrafluoride.name=Uran-Tetrafluorid-Nugget
+item.itemPlateUraniumTetrafluoride.name=Uran-Tetrafluorid-Platte
+item.itemPlateDoubleUraniumTetrafluoride.name=Doppelte Uran-Tetrafluorid-Platte
+item.itemIngotUraniumHexafluoride.name=Uran-Hexafluorid-Barren
+item.itemDustUraniumHexafluoride.name=Uran-Hexafluorid-Staub
+item.itemDustTinyUraniumHexafluoride.name=Winziges Häufchen Uran-Hexafluorid-Staub
+item.itemDustSmallUraniumHexafluoride.name=Kleines Häufchen Uran-Hexafluorid-Staub
+item.itemNuggetUraniumHexafluoride.name=Uran-Hexafluorid-Nugget
+item.itemPlateUraniumHexafluoride.name=Uran-Hexafluorid-Platte
+item.itemPlateDoubleUraniumHexafluoride.name=Doppelte Uran-Hexafluorid-Platte
+item.itemIngotZirconiumTetrafluoride.name=Zirkonium-Tetrafluorid-Barren
+item.itemDustZirconiumTetrafluoride.name=Zirkonium-Tetrafluorid-Staub
+item.itemDustTinyZirconiumTetrafluoride.name=Winziges Häufchen Zirkonium-Tetrafluorid-Staub
+item.itemDustSmallZirconiumTetrafluoride.name=Kleines Häufchen Zirkonium-Tetrafluorid-Staub
+item.itemNuggetZirconiumTetrafluoride.name=Zirkonium-Tetrafluorid-Nugget
+item.itemPlateZirconiumTetrafluoride.name=Zirkonium-Tetrafluorid-Platte
+item.itemPlateDoubleZirconiumTetrafluoride.name=Doppelte Zirkonium-Tetrafluorid-Platte
+item.itemIngotNeptuniumHexafluoride.name=Neptunium-Hexafluorid-Barren
+item.itemDustNeptuniumHexafluoride.name=Neptunium-Hexafluorid-Staub
+item.itemDustTinyNeptuniumHexafluoride.name=Winziges Häufchen Neptunium-Hexafluorid-Staub
+item.itemDustSmallNeptuniumHexafluoride.name=Kleines Häufchen Neptunium-Hexafluorid-Staub
+item.itemNuggetNeptuniumHexafluoride.name=Neptunium-Hexafluorid-Nugget
+item.itemPlateNeptuniumHexafluoride.name=Neptunium-Hexafluorid-Platte
+item.itemPlateDoubleNeptuniumHexafluoride.name=Doppelte Neptunium-Hexafluorid-Platte
+item.itemIngotTechnetiumHexafluoride.name=Technetium-Hexafluorid-Barren
+item.itemDustTechnetiumHexafluoride.name=Technetium-Hexafluorid-Staub
+item.itemDustTinyTechnetiumHexafluoride.name=Winziges Häufchen Technetium-Hexafluorid-Staub
+item.itemDustSmallTechnetiumHexafluoride.name=Kleines Häufchen Technetium-Hexafluorid-Staub
+item.itemNuggetTechnetiumHexafluoride.name=Technetium-Hexafluorid-Nugget
+item.itemPlateTechnetiumHexafluoride.name=Technetium-Hexafluorid-Platte
+item.itemPlateDoubleTechnetiumHexafluoride.name=Doppelte Technetium-Hexafluorid-Platte
+item.itemIngotSeleniumHexafluoride.name=Selen-Hexafluorid-Barren
+item.itemDustSeleniumHexafluoride.name=Selen-Hexafluorid-Staub
+item.itemDustTinySeleniumHexafluoride.name=Winziges Häufchen Selen-Hexafluorid-Staub
+item.itemDustSmallSeleniumHexafluoride.name=Kleines Häufchen Selen-Hexafluorid-Staub
+item.itemNuggetSeleniumHexafluoride.name=Selen-Hexafluorid-Nugget
+item.itemPlateSeleniumHexafluoride.name=Selen-Hexafluorid-Platte
+item.itemPlateDoubleSeleniumHexafluoride.name=Doppelte Selen-Hexafluorid-Platte
+item.itemIngotLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235-Barren
+item.itemDustLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235-Staub
+item.itemDustTinyLiFBeF2ZrF4U235.name=Winziges Häufchen LiFBeF2ZrF4U235-Staub
+item.itemDustSmallLiFBeF2ZrF4U235.name=Kleines Häufchen LiFBeF2ZrF4U235-Staub
+item.itemNuggetLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235-Nugget
+item.itemPlateLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235-Platte
+item.itemPlateDoubleLiFBeF2ZrF4U235.name=Doppelte LiFBeF2ZrF4U235-Platte
+item.itemIngotLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4-Barren
+item.itemDustLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4-Staub
+item.itemDustTinyLiFBeF2ZrF4UF4.name=Winziges Häufchen LiFBeF2ZrF4UF4-Staub
+item.itemDustSmallLiFBeF2ZrF4UF4.name=Kleines Häufchen LiFBeF2ZrF4UF4-Staub
+item.itemNuggetLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4-Nugget
+item.itemPlateLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4-Platte
+item.itemPlateDoubleLiFBeF2ZrF4UF4.name=Doppelte LiFBeF2ZrF4UF4-Platte
+item.itemIngotLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4-Barren
+item.itemDustLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4-Staub
+item.itemDustTinyLiFBeF2ThF4UF4.name=Winziges Häufchen LiFBeF2ThF4UF4-Staub
+item.itemDustSmallLiFBeF2ThF4UF4.name=Kleines Häufchen LiFBeF2ThF4UF4-Staub
+item.itemNuggetLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4-Nugget
+item.itemPlateLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4-Platte
+item.itemPlateDoubleLiFBeF2ThF4UF4.name=Doppelte LiFBeF2ThF4UF4-Platte
+item.itemIngotEnergyCrystal.name=Energy Crystal-Barren
+item.itemHotIngotEnergyCrystal.name=Hot Energy Crystal-Barren
+item.itemDustEnergyCrystal.name=Energy Crystal-Staub
+item.itemDustTinyEnergyCrystal.name=Winziges Häufchen Energy Crystal-Staub
+item.itemDustSmallEnergyCrystal.name=Kleines Häufchen Energy Crystal-Staub
+item.itemNuggetEnergyCrystal.name=Energy Crystal-Nugget
+item.itemPlateEnergyCrystal.name=Energy Crystal-Platte
+item.itemPlateDoubleEnergyCrystal.name=Doppelte Energy Crystal-Platte
+item.itemBoltEnergyCrystal.name=Energy Crystal-Bolzen
+item.itemRodEnergyCrystal.name=Energy Crystal-Stange
+item.itemRodLongEnergyCrystal.name=Lange Energy Crystal-Stange
+item.itemRingEnergyCrystal.name=Energy Crystal-Ring
+item.itemScrewEnergyCrystal.name=Energy Crystal-Schraube
+item.itemRotorEnergyCrystal.name=Energy Crystal-Rotor
+item.itemGearEnergyCrystal.name=Energy Crystal-Zahnrad
+item.itemIngotBloodSteel.name=Blutstahl-Barren
+item.itemDustBloodSteel.name=Blutstahl-Staub
+item.itemDustTinyBloodSteel.name=Winziges Häufchen Blutstahl-Staub
+item.itemDustSmallBloodSteel.name=Kleines Häufchen Blutstahl-Staub
+item.itemNuggetBloodSteel.name=Blutstahl-Nugget
+item.itemPlateBloodSteel.name=Blutstahl-Platte
+item.itemPlateDoubleBloodSteel.name=Doppelte Blutstahl-Platte
+item.itemBoltBloodSteel.name=Blutstahl-Bolzen
+item.itemRodBloodSteel.name=Blutstahl-Stange
+item.itemRodLongBloodSteel.name=Lange Blutstahl-Stange
+item.itemRingBloodSteel.name=Blutstahl-Ring
+item.itemScrewBloodSteel.name=Blutstahl-Schraube
+item.itemRotorBloodSteel.name=Blutstahl-Rotor
+item.itemGearBloodSteel.name=Blutstahl-Zahnrad
+item.itemIngotZeron100.name=Zeron-100-Barren
+item.itemHotIngotZeron100.name=Hot Zeron-100-Barren
+item.itemDustZeron100.name=Zeron-100-Staub
+item.itemDustTinyZeron100.name=Winziges Häufchen Zeron-100-Staub
+item.itemDustSmallZeron100.name=Kleines Häufchen Zeron-100-Staub
+item.itemNuggetZeron100.name=Zeron-100-Nugget
+item.itemPlateZeron100.name=Zeron-100-Platte
+item.itemPlateDoubleZeron100.name=Doppelte Zeron-100-Platte
+item.itemBoltZeron100.name=Zeron-100-Bolzen
+item.itemRodZeron100.name=Zeron-100-Stange
+item.itemRodLongZeron100.name=Lange Zeron-100-Stange
+item.itemRingZeron100.name=Zeron-100-Ring
+item.itemScrewZeron100.name=Zeron-100-Schraube
+item.itemRotorZeron100.name=Zeron-100-Rotor
+item.itemGearZeron100.name=Zeron-100-Zahnrad
+item.itemIngotTumbaga.name=Tumbaga-Barren
+item.itemDustTumbaga.name=Tumbaga-Staub
+item.itemDustTinyTumbaga.name=Winziges Häufchen Tumbaga-Staub
+item.itemDustSmallTumbaga.name=Kleines Häufchen Tumbaga-Staub
+item.itemNuggetTumbaga.name=Tumbaga-Nugget
+item.itemPlateTumbaga.name=Tumbaga-Platte
+item.itemPlateDoubleTumbaga.name=Doppelte Tumbaga-Platte
+item.itemBoltTumbaga.name=Tumbaga-Bolzen
+item.itemRodTumbaga.name=Tumbaga-Stange
+item.itemRodLongTumbaga.name=Lange Tumbaga-Stange
+item.itemRingTumbaga.name=Tumbaga-Ring
+item.itemScrewTumbaga.name=Tumbaga-Schraube
+item.itemRotorTumbaga.name=Tumbaga-Rotor
+item.itemGearTumbaga.name=Tumbaga-Zahnrad
+item.itemIngotPotin.name=Potin-Barren
+item.itemDustPotin.name=Potin-Staub
+item.itemDustTinyPotin.name=Winziges Häufchen Potin-Staub
+item.itemDustSmallPotin.name=Kleines Häufchen Potin-Staub
+item.itemNuggetPotin.name=Potin-Nugget
+item.itemPlatePotin.name=Potin-Platte
+item.itemPlateDoublePotin.name=Doppelte Potin-Platte
+item.itemBoltPotin.name=Potin-Bolzen
+item.itemRodPotin.name=Potin-Stange
+item.itemRodLongPotin.name=Lange Potin-Stange
+item.itemRingPotin.name=Potin-Ring
+item.itemScrewPotin.name=Potin-Schraube
+item.itemRotorPotin.name=Potin-Rotor
+item.itemGearPotin.name=Potin-Zahnrad
+item.itemIngotStaballoy.name=Staballoy-Barren
+item.itemHotIngotStaballoy.name=Hot Staballoy-Barren
+item.itemDustStaballoy.name=Staballoy-Staub
+item.itemDustTinyStaballoy.name=Winziges Häufchen Staballoy-Staub
+item.itemDustSmallStaballoy.name=Kleines Häufchen Staballoy-Staub
+item.itemNuggetStaballoy.name=Staballoy-Nugget
+item.itemPlateStaballoy.name=Staballoy-Platte
+item.itemPlateDoubleStaballoy.name=Doppelte Staballoy-Platte
+item.itemBoltStaballoy.name=Staballoy-Bolzen
+item.itemRodStaballoy.name=Staballoy-Stange
+item.itemRodLongStaballoy.name=Lange Staballoy-Stange
+item.itemRingStaballoy.name=Staballoy-Ring
+item.itemScrewStaballoy.name=Staballoy-Schraube
+item.itemRotorStaballoy.name=Staballoy-Rotor
+item.itemGearStaballoy.name=Staballoy-Zahnrad
+item.itemIngotTantalloy60.name=Tantalloy-60-Barren
+item.itemHotIngotTantalloy60.name=Hot Tantalloy-60-Barren
+item.itemDustTantalloy60.name=Tantalloy-60-Staub
+item.itemDustTinyTantalloy60.name=Winziges Häufchen Tantalloy-60-Staub
+item.itemDustSmallTantalloy60.name=Kleines Häufchen Tantalloy-60-Staub
+item.itemNuggetTantalloy60.name=Tantalloy-60-Nugget
+item.itemPlateTantalloy60.name=Tantalloy-60-Platte
+item.itemPlateDoubleTantalloy60.name=Doppelte Tantalloy-60-Platte
+item.itemBoltTantalloy60.name=Tantalloy-60-Bolzen
+item.itemRodTantalloy60.name=Tantalloy-60-Stange
+item.itemRodLongTantalloy60.name=Lange Tantalloy-60-Stange
+item.itemRingTantalloy60.name=Tantalloy-60-Ring
+item.itemScrewTantalloy60.name=Tantalloy-60-Schraube
+item.itemRotorTantalloy60.name=Tantalloy-60-Rotor
+item.itemGearTantalloy60.name=Tantalloy-60-Zahnrad
+item.itemIngotTantalloy61.name=Tantalloy-61-Barren
+item.itemHotIngotTantalloy61.name=Hot Tantalloy-61-Barren
+item.itemDustTantalloy61.name=Tantalloy-61-Staub
+item.itemDustTinyTantalloy61.name=Winziges Häufchen Tantalloy-61-Staub
+item.itemDustSmallTantalloy61.name=Kleines Häufchen Tantalloy-61-Staub
+item.itemNuggetTantalloy61.name=Tantalloy-61-Nugget
+item.itemPlateTantalloy61.name=Tantalloy-61-Platte
+item.itemPlateDoubleTantalloy61.name=Doppelte Tantalloy-61-Platte
+item.itemBoltTantalloy61.name=Tantalloy-61-Bolzen
+item.itemRodTantalloy61.name=Tantalloy-61-Stange
+item.itemRodLongTantalloy61.name=Lange Tantalloy-61-Stange
+item.itemRingTantalloy61.name=Tantalloy-61-Ring
+item.itemScrewTantalloy61.name=Tantalloy-61-Schraube
+item.itemRotorTantalloy61.name=Tantalloy-61-Rotor
+item.itemGearTantalloy61.name=Tantalloy-61-Zahnrad
+item.itemIngotInconel625.name=Inconel-625-Barren
+item.itemHotIngotInconel625.name=Hot Inconel-625-Barren
+item.itemDustInconel625.name=Inconel-625-Staub
+item.itemDustTinyInconel625.name=Winziges Häufchen Inconel-625-Staub
+item.itemDustSmallInconel625.name=Kleines Häufchen Inconel-625-Staub
+item.itemNuggetInconel625.name=Inconel-625-Nugget
+item.itemPlateInconel625.name=Inconel-625-Platte
+item.itemPlateDoubleInconel625.name=Doppelte Inconel-625-Platte
+item.itemBoltInconel625.name=Inconel-625-Bolzen
+item.itemRodInconel625.name=Inconel-625-Stange
+item.itemRodLongInconel625.name=Lange Inconel-625-Stange
+item.itemRingInconel625.name=Inconel-625-Ring
+item.itemScrewInconel625.name=Inconel-625-Schraube
+item.itemRotorInconel625.name=Inconel-625-Rotor
+item.itemGearInconel625.name=Inconel-625-Zahnrad
+item.itemIngotInconel690.name=Inconel-690-Barren
+item.itemHotIngotInconel690.name=Hot Inconel-690-Barren
+item.itemDustInconel690.name=Inconel-690-Staub
+item.itemDustTinyInconel690.name=Winziges Häufchen Inconel-690-Staub
+item.itemDustSmallInconel690.name=Kleines Häufchen Inconel-690-Staub
+item.itemNuggetInconel690.name=Inconel-690-Nugget
+item.itemPlateInconel690.name=Inconel-690-Platte
+item.itemPlateDoubleInconel690.name=Doppelte Inconel-690-Platte
+item.itemBoltInconel690.name=Inconel-690-Bolzen
+item.itemRodInconel690.name=Inconel-690-Stange
+item.itemRodLongInconel690.name=Lange Inconel-690-Stange
+item.itemRingInconel690.name=Inconel-690-Ring
+item.itemScrewInconel690.name=Inconel-690-Schraube
+item.itemRotorInconel690.name=Inconel-690-Rotor
+item.itemGearInconel690.name=Inconel-690-Zahnrad
+item.itemIngotInconel792.name=Inconel-792-Barren
+item.itemHotIngotInconel792.name=Hot Inconel-792-Barren
+item.itemDustInconel792.name=Inconel-792-Staub
+item.itemDustTinyInconel792.name=Winziges Häufchen Inconel-792-Staub
+item.itemDustSmallInconel792.name=Kleines Häufchen Inconel-792-Staub
+item.itemNuggetInconel792.name=Inconel-792-Nugget
+item.itemPlateInconel792.name=Inconel-792-Platte
+item.itemPlateDoubleInconel792.name=Doppelte Inconel-792-Platte
+item.itemBoltInconel792.name=Inconel-792-Bolzen
+item.itemRodInconel792.name=Inconel-792-Stange
+item.itemRodLongInconel792.name=Lange Inconel-792-Stange
+item.itemRingInconel792.name=Inconel-792-Ring
+item.itemScrewInconel792.name=Inconel-792-Schraube
+item.itemRotorInconel792.name=Inconel-792-Rotor
+item.itemGearInconel792.name=Inconel-792-Zahnrad
+item.itemDustEglinSteelBaseCompound.name=Eglin-Stahl Base Compound-Staub
+item.itemDustTinyEglinSteelBaseCompound.name=Winziges Häufchen Eglin-Stahl Base Compound-Staub
+item.itemDustSmallEglinSteelBaseCompound.name=Kleines Häufchen Eglin-Stahl Base Compound-Staub
+item.itemIngotEglinSteel.name=Eglin-Stahl-Barren
+item.itemDustEglinSteel.name=Eglin-Stahl-Staub
+item.itemDustTinyEglinSteel.name=Winziges Häufchen Eglin-Stahl-Staub
+item.itemDustSmallEglinSteel.name=Kleines Häufchen Eglin-Stahl-Staub
+item.itemNuggetEglinSteel.name=Eglin-Stahl-Nugget
+item.itemPlateEglinSteel.name=Eglin-Stahl-Platte
+item.itemPlateDoubleEglinSteel.name=Doppelte Eglin-Stahl-Platte
+item.itemBoltEglinSteel.name=Eglin-Stahl-Bolzen
+item.itemRodEglinSteel.name=Eglin-Stahl-Stange
+item.itemRodLongEglinSteel.name=Lange Eglin-Stahl-Stange
+item.itemRingEglinSteel.name=Eglin-Stahl-Ring
+item.itemScrewEglinSteel.name=Eglin-Stahl-Schraube
+item.itemRotorEglinSteel.name=Eglin-Stahl-Rotor
+item.itemGearEglinSteel.name=Eglin-Stahl-Zahnrad
+item.itemIngotMaragingSteel250.name=Maraging-Stahl-250-Barren
+item.itemHotIngotMaragingSteel250.name=Hot Maraging-Stahl-250-Barren
+item.itemDustMaragingSteel250.name=Maraging-Stahl-250-Staub
+item.itemDustTinyMaragingSteel250.name=Winziges Häufchen Maraging-Stahl-250-Staub
+item.itemDustSmallMaragingSteel250.name=Kleines Häufchen Maraging-Stahl-250-Staub
+item.itemNuggetMaragingSteel250.name=Maraging-Stahl-250-Nugget
+item.itemPlateMaragingSteel250.name=Maraging-Stahl-250-Platte
+item.itemPlateDoubleMaragingSteel250.name=Doppelte Maraging-Stahl-250-Platte
+item.itemBoltMaragingSteel250.name=Maraging-Stahl-250-Bolzen
+item.itemRodMaragingSteel250.name=Maraging-Stahl-250-Stange
+item.itemRodLongMaragingSteel250.name=Lange Maraging-Stahl-250-Stange
+item.itemRingMaragingSteel250.name=Maraging-Stahl-250-Ring
+item.itemScrewMaragingSteel250.name=Maraging-Stahl-250-Schraube
+item.itemRotorMaragingSteel250.name=Maraging-Stahl-250-Rotor
+item.itemGearMaragingSteel250.name=Maraging-Stahl-250-Zahnrad
+item.itemIngotMaragingSteel300.name=Maraging-Stahl-300-Barren
+item.itemHotIngotMaragingSteel300.name=Hot Maraging-Stahl-300-Barren
+item.itemDustMaragingSteel300.name=Maraging-Stahl-300-Staub
+item.itemDustTinyMaragingSteel300.name=Winziges Häufchen Maraging-Stahl-300-Staub
+item.itemDustSmallMaragingSteel300.name=Kleines Häufchen Maraging-Stahl-300-Staub
+item.itemNuggetMaragingSteel300.name=Maraging-Stahl-300-Nugget
+item.itemPlateMaragingSteel300.name=Maraging-Stahl-300-Platte
+item.itemPlateDoubleMaragingSteel300.name=Doppelte Maraging-Stahl-300-Platte
+item.itemBoltMaragingSteel300.name=Maraging-Stahl-300-Bolzen
+item.itemRodMaragingSteel300.name=Maraging-Stahl-300-Stange
+item.itemRodLongMaragingSteel300.name=Lange Maraging-Stahl-300-Stange
+item.itemRingMaragingSteel300.name=Maraging-Stahl-300-Ring
+item.itemScrewMaragingSteel300.name=Maraging-Stahl-300-Schraube
+item.itemRotorMaragingSteel300.name=Maraging-Stahl-300-Rotor
+item.itemGearMaragingSteel300.name=Maraging-Stahl-300-Zahnrad
+item.itemIngotMaragingSteel350.name=Maraging-Stahl-350-Barren
+item.itemHotIngotMaragingSteel350.name=Hot Maraging-Stahl-350-Barren
+item.itemDustMaragingSteel350.name=Maraging-Stahl-350-Staub
+item.itemDustTinyMaragingSteel350.name=Winziges Häufchen Maraging-Stahl-350-Staub
+item.itemDustSmallMaragingSteel350.name=Kleines Häufchen Maraging-Stahl-350-Staub
+item.itemNuggetMaragingSteel350.name=Maraging-Stahl-350-Nugget
+item.itemPlateMaragingSteel350.name=Maraging-Stahl-350-Platte
+item.itemPlateDoubleMaragingSteel350.name=Doppelte Maraging-Stahl-350-Platte
+item.itemBoltMaragingSteel350.name=Maraging-Stahl-350-Bolzen
+item.itemRodMaragingSteel350.name=Maraging-Stahl-350-Stange
+item.itemRodLongMaragingSteel350.name=Lange Maraging-Stahl-350-Stange
+item.itemRingMaragingSteel350.name=Maraging-Stahl-350-Ring
+item.itemScrewMaragingSteel350.name=Maraging-Stahl-350-Schraube
+item.itemRotorMaragingSteel350.name=Maraging-Stahl-350-Rotor
+item.itemGearMaragingSteel350.name=Maraging-Stahl-350-Zahnrad
+item.itemIngotStellite.name=Stellite-Barren
+item.itemHotIngotStellite.name=Hot Stellite-Barren
+item.itemDustStellite.name=Stellite-Staub
+item.itemDustTinyStellite.name=Winziges Häufchen Stellite-Staub
+item.itemDustSmallStellite.name=Kleines Häufchen Stellite-Staub
+item.itemNuggetStellite.name=Stellite-Nugget
+item.itemPlateStellite.name=Stellite-Platte
+item.itemPlateDoubleStellite.name=Doppelte Stellite-Platte
+item.itemBoltStellite.name=Stellite-Bolzen
+item.itemRodStellite.name=Stellite-Stange
+item.itemRodLongStellite.name=Lange Stellite-Stange
+item.itemRingStellite.name=Stellite-Ring
+item.itemScrewStellite.name=Stellite-Schraube
+item.itemRotorStellite.name=Stellite-Rotor
+item.itemGearStellite.name=Stellite-Zahnrad
+item.itemIngotTalonite.name=Talonite-Barren
+item.itemDustTalonite.name=Talonite-Staub
+item.itemDustTinyTalonite.name=Winziges Häufchen Talonite-Staub
+item.itemDustSmallTalonite.name=Kleines Häufchen Talonite-Staub
+item.itemNuggetTalonite.name=Talonite-Nugget
+item.itemPlateTalonite.name=Talonite-Platte
+item.itemPlateDoubleTalonite.name=Doppelte Talonite-Platte
+item.itemBoltTalonite.name=Talonite-Bolzen
+item.itemRodTalonite.name=Talonite-Stange
+item.itemRodLongTalonite.name=Lange Talonite-Stange
+item.itemRingTalonite.name=Talonite-Ring
+item.itemScrewTalonite.name=Talonite-Schraube
+item.itemRotorTalonite.name=Talonite-Rotor
+item.itemGearTalonite.name=Talonite-Zahnrad
+item.itemIngotHastelloyW.name=Hastelloy-W-Barren
+item.itemDustHastelloyW.name=Hastelloy-W-Staub
+item.itemDustTinyHastelloyW.name=Winziges Häufchen Hastelloy-W-Staub
+item.itemDustSmallHastelloyW.name=Kleines Häufchen Hastelloy-W-Staub
+item.itemNuggetHastelloyW.name=Hastelloy-W-Nugget
+item.itemPlateHastelloyW.name=Hastelloy-W-Platte
+item.itemPlateDoubleHastelloyW.name=Doppelte Hastelloy-W-Platte
+item.itemBoltHastelloyW.name=Hastelloy-W-Bolzen
+item.itemRodHastelloyW.name=Hastelloy-W-Stange
+item.itemRodLongHastelloyW.name=Lange Hastelloy-W-Stange
+item.itemRingHastelloyW.name=Hastelloy-W-Ring
+item.itemScrewHastelloyW.name=Hastelloy-W-Schraube
+item.itemRotorHastelloyW.name=Hastelloy-W-Rotor
+item.itemGearHastelloyW.name=Hastelloy-W-Zahnrad
+item.itemIngotHastelloyX.name=Hastelloy-X-Barren
+item.itemDustHastelloyX.name=Hastelloy-X-Staub
+item.itemDustTinyHastelloyX.name=Winziges Häufchen Hastelloy-X-Staub
+item.itemDustSmallHastelloyX.name=Kleines Häufchen Hastelloy-X-Staub
+item.itemNuggetHastelloyX.name=Hastelloy-X-Nugget
+item.itemPlateHastelloyX.name=Hastelloy-X-Platte
+item.itemPlateDoubleHastelloyX.name=Doppelte Hastelloy-X-Platte
+item.itemBoltHastelloyX.name=Hastelloy-X-Bolzen
+item.itemRodHastelloyX.name=Hastelloy-X-Stange
+item.itemRodLongHastelloyX.name=Lange Hastelloy-X-Stange
+item.itemRingHastelloyX.name=Hastelloy-X-Ring
+item.itemScrewHastelloyX.name=Hastelloy-X-Schraube
+item.itemRotorHastelloyX.name=Hastelloy-X-Rotor
+item.itemGearHastelloyX.name=Hastelloy-X-Zahnrad
+item.itemIngotHastelloyC276.name=Hastelloy-C276-Barren
+item.itemHotIngotHastelloyC276.name=Hot Hastelloy-C276-Barren
+item.itemDustHastelloyC276.name=Hastelloy-C276-Staub
+item.itemDustTinyHastelloyC276.name=Winziges Häufchen Hastelloy-C276-Staub
+item.itemDustSmallHastelloyC276.name=Kleines Häufchen Hastelloy-C276-Staub
+item.itemNuggetHastelloyC276.name=Hastelloy-C276-Nugget
+item.itemPlateHastelloyC276.name=Hastelloy-C276-Platte
+item.itemPlateDoubleHastelloyC276.name=Doppelte Hastelloy-C276-Platte
+item.itemBoltHastelloyC276.name=Hastelloy-C276-Bolzen
+item.itemRodHastelloyC276.name=Hastelloy-C276-Stange
+item.itemRodLongHastelloyC276.name=Lange Hastelloy-C276-Stange
+item.itemRingHastelloyC276.name=Hastelloy-C276-Ring
+item.itemScrewHastelloyC276.name=Hastelloy-C276-Schraube
+item.itemRotorHastelloyC276.name=Hastelloy-C276-Rotor
+item.itemGearHastelloyC276.name=Hastelloy-C276-Zahnrad
+item.itemIngotHastelloyN.name=Hastelloy-N-Barren
+item.itemHotIngotHastelloyN.name=Hot Hastelloy-N-Barren
+item.itemDustHastelloyN.name=Hastelloy-N-Staub
+item.itemDustTinyHastelloyN.name=Winziges Häufchen Hastelloy-N-Staub
+item.itemDustSmallHastelloyN.name=Kleines Häufchen Hastelloy-N-Staub
+item.itemNuggetHastelloyN.name=Hastelloy-N-Nugget
+item.itemPlateHastelloyN.name=Hastelloy-N-Platte
+item.itemPlateDoubleHastelloyN.name=Doppelte Hastelloy-N-Platte
+item.itemBoltHastelloyN.name=Hastelloy-N-Bolzen
+item.itemRodHastelloyN.name=Hastelloy-N-Stange
+item.itemRodLongHastelloyN.name=Lange Hastelloy-N-Stange
+item.itemRingHastelloyN.name=Hastelloy-N-Ring
+item.itemScrewHastelloyN.name=Hastelloy-N-Schraube
+item.itemRotorHastelloyN.name=Hastelloy-N-Rotor
+item.itemGearHastelloyN.name=Hastelloy-N-Zahnrad
+item.itemIngotIncoloy020.name=Incoloy-020-Barren
+item.itemDustIncoloy020.name=Incoloy-020-Staub
+item.itemDustTinyIncoloy020.name=Winziges Häufchen Incoloy-020-Staub
+item.itemDustSmallIncoloy020.name=Kleines Häufchen Incoloy-020-Staub
+item.itemNuggetIncoloy020.name=Incoloy-020-Nugget
+item.itemPlateIncoloy020.name=Incoloy-020-Platte
+item.itemPlateDoubleIncoloy020.name=Doppelte Incoloy-020-Platte
+item.itemBoltIncoloy020.name=Incoloy-020-Bolzen
+item.itemRodIncoloy020.name=Incoloy-020-Stange
+item.itemRodLongIncoloy020.name=Lange Incoloy-020-Stange
+item.itemRingIncoloy020.name=Incoloy-020-Ring
+item.itemScrewIncoloy020.name=Incoloy-020-Schraube
+item.itemRotorIncoloy020.name=Incoloy-020-Rotor
+item.itemGearIncoloy020.name=Incoloy-020-Zahnrad
+item.itemIngotIncoloyDS.name=Incoloy-DS-Barren
+item.itemDustIncoloyDS.name=Incoloy-DS-Staub
+item.itemDustTinyIncoloyDS.name=Winziges Häufchen Incoloy-DS-Staub
+item.itemDustSmallIncoloyDS.name=Kleines Häufchen Incoloy-DS-Staub
+item.itemNuggetIncoloyDS.name=Incoloy-DS-Nugget
+item.itemPlateIncoloyDS.name=Incoloy-DS-Platte
+item.itemPlateDoubleIncoloyDS.name=Doppelte Incoloy-DS-Platte
+item.itemBoltIncoloyDS.name=Incoloy-DS-Bolzen
+item.itemRodIncoloyDS.name=Incoloy-DS-Stange
+item.itemRodLongIncoloyDS.name=Lange Incoloy-DS-Stange
+item.itemRingIncoloyDS.name=Incoloy-DS-Ring
+item.itemScrewIncoloyDS.name=Incoloy-DS-Schraube
+item.itemRotorIncoloyDS.name=Incoloy-DS-Rotor
+item.itemGearIncoloyDS.name=Incoloy-DS-Zahnrad
+item.itemIngotIncoloyMA956.name=Incoloy-MA956-Barren
+item.itemHotIngotIncoloyMA956.name=Hot Incoloy-MA956-Barren
+item.itemDustIncoloyMA956.name=Incoloy-MA956-Staub
+item.itemDustTinyIncoloyMA956.name=Winziges Häufchen Incoloy-MA956-Staub
+item.itemDustSmallIncoloyMA956.name=Kleines Häufchen Incoloy-MA956-Staub
+item.itemNuggetIncoloyMA956.name=Incoloy-MA956-Nugget
+item.itemPlateIncoloyMA956.name=Incoloy-MA956-Platte
+item.itemPlateDoubleIncoloyMA956.name=Doppelte Incoloy-MA956-Platte
+item.itemBoltIncoloyMA956.name=Incoloy-MA956-Bolzen
+item.itemRodIncoloyMA956.name=Incoloy-MA956-Stange
+item.itemRodLongIncoloyMA956.name=Lange Incoloy-MA956-Stange
+item.itemRingIncoloyMA956.name=Incoloy-MA956-Ring
+item.itemScrewIncoloyMA956.name=Incoloy-MA956-Schraube
+item.itemRotorIncoloyMA956.name=Incoloy-MA956-Rotor
+item.itemGearIncoloyMA956.name=Incoloy-MA956-Zahnrad
+item.itemIngotGrisium.name=Grisium-Barren
+item.itemHotIngotGrisium.name=Hot Grisium-Barren
+item.itemDustGrisium.name=Grisium-Staub
+item.itemDustTinyGrisium.name=Winziges Häufchen Grisium-Staub
+item.itemDustSmallGrisium.name=Kleines Häufchen Grisium-Staub
+item.itemNuggetGrisium.name=Grisium-Nugget
+item.itemPlateGrisium.name=Grisium-Platte
+item.itemPlateDoubleGrisium.name=Doppelte Grisium-Platte
+item.itemBoltGrisium.name=Grisium-Bolzen
+item.itemRodGrisium.name=Grisium-Stange
+item.itemRodLongGrisium.name=Lange Grisium-Stange
+item.itemRingGrisium.name=Grisium-Ring
+item.itemScrewGrisium.name=Grisium-Schraube
+item.itemRotorGrisium.name=Grisium-Rotor
+item.itemGearGrisium.name=Grisium-Zahnrad
+item.itemIngotHG1223.name=HG-1223-Barren
+item.itemDustHG1223.name=HG-1223-Staub
+item.itemDustTinyHG1223.name=Winziges Häufchen HG-1223-Staub
+item.itemDustSmallHG1223.name=Kleines Häufchen HG-1223-Staub
+item.itemNuggetHG1223.name=HG-1223-Nugget
+item.itemPlateHG1223.name=HG-1223-Platte
+item.itemPlateDoubleHG1223.name=Doppelte HG-1223-Platte
+item.itemIngotTrinium.name=Trinium-Barren
+item.itemDustTrinium.name=Trinium-Staub
+item.itemDustTinyTrinium.name=Winziges Häufchen Trinium-Staub
+item.itemDustSmallTrinium.name=Kleines Häufchen Trinium-Staub
+item.itemNuggetTrinium.name=Trinium-Nugget
+item.itemPlateTrinium.name=Trinium-Platte
+item.itemPlateDoubleTrinium.name=Doppelte Trinium-Platte
+item.itemIngotRefinedTrinium.name=Raffinierter Trinium-Barren
+item.itemDustRefinedTrinium.name=Raffinierter Trinium-Staub
+item.itemDustTinyRefinedTrinium.name=Winziges Häufchen raffinierter Trinium-Staub
+item.itemDustSmallRefinedTrinium.name=Kleines Häufchen raffinierter Trinium-Staub
+item.itemNuggetRefinedTrinium.name=Raffinierter Trinium-Nugget
+item.itemPlateRefinedTrinium.name=Raffinierte Trinium-Platte
+item.itemPlateDoubleRefinedTrinium.name=Doppelte raffinierte Trinium-Platte
+item.itemIngotTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Barren
+item.itemHotIngotTriniumTitaniumAlloy.name=Hot Trinium-Titanium-Legierung-Barren
+item.itemDustTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Staub
+item.itemDustTinyTriniumTitaniumAlloy.name=Winziges Häufchen Trinium-Titanium-Legierung-Staub
+item.itemDustSmallTriniumTitaniumAlloy.name=Kleines Häufchen Trinium-Titanium-Legierung-Staub
+item.itemNuggetTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Nugget
+item.itemPlateTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Platte
+item.itemPlateDoubleTriniumTitaniumAlloy.name=Doppelte Trinium-Titanium-Legierung-Platte
+item.itemBoltTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Bolzen
+item.itemRodTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Stange
+item.itemRodLongTriniumTitaniumAlloy.name=Lange Trinium-Titanium-Legierung-Stange
+item.itemRingTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Ring
+item.itemScrewTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Schraube
+item.itemRotorTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Rotor
+item.itemGearTriniumTitaniumAlloy.name=Trinium-Titanium-Legierung-Zahnrad
+item.itemIngotTriniumNaquadahAlloy.name=Trinium-Naquadah-Legierung-Barren
+item.itemDustTriniumNaquadahAlloy.name=Trinium-Naquadah-Legierung-Staub
+item.itemDustTinyTriniumNaquadahAlloy.name=Winziges Häufchen Trinium-Naquadah-Legierung-Staub
+item.itemDustSmallTriniumNaquadahAlloy.name=Kleines Häufchen Trinium-Naquadah-Legierung-Staub
+item.itemNuggetTriniumNaquadahAlloy.name=Trinium-Naquadah-Legierung-Nugget
+item.itemPlateTriniumNaquadahAlloy.name=Trinium-Naquadah-Legierung-Platte
+item.itemPlateDoubleTriniumNaquadahAlloy.name=Doppelte Trinium-Naquadah-Legierung-Platte
+item.itemIngotTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Barren
+item.itemHotIngotTriniumNaquadahCarbonite.name=Hot Trinium-Naquadah-Carbonit-Barren
+item.itemDustTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Staub
+item.itemDustTinyTriniumNaquadahCarbonite.name=Winziges Häufchen Trinium-Naquadah-Carbonit-Staub
+item.itemDustSmallTriniumNaquadahCarbonite.name=Kleines Häufchen Trinium-Naquadah-Carbonit-Staub
+item.itemNuggetTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Nugget
+item.itemPlateTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Platte
+item.itemPlateDoubleTriniumNaquadahCarbonite.name=Doppelte Trinium-Naquadah-Carbonit-Platte
+item.itemBoltTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Bolzen
+item.itemRodTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Stange
+item.itemRodLongTriniumNaquadahCarbonite.name=Lange Trinium-Naquadah-Carbonit-Stange
+item.itemRingTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Ring
+item.itemScrewTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Schraube
+item.itemRotorTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Rotor
+item.itemGearTriniumNaquadahCarbonite.name=Trinium-Naquadah-Carbonit-Zahnrad
+item.itemIngotQuantum.name=Quanten-Barren
+item.itemHotIngotQuantum.name=Hot Quanten-Barren
+item.itemDustQuantum.name=Quanten-Staub
+item.itemDustTinyQuantum.name=Winziges Häufchen Quanten-Staub
+item.itemDustSmallQuantum.name=Kleines Häufchen Quanten-Staub
+item.itemNuggetQuantum.name=Quanten-Nugget
+item.itemPlateQuantum.name=Quanten-Platte
+item.itemPlateDoubleQuantum.name=Doppelte Quanten-Platte
+item.itemBoltQuantum.name=Quanten-Bolzen
+item.itemRodQuantum.name=Quanten-Stange
+item.itemRodLongQuantum.name=Lange Quanten-Stange
+item.itemRingQuantum.name=Quanten-Ring
+item.itemScrewQuantum.name=Quanten-Schraube
+item.itemRotorQuantum.name=Quanten-Rotor
+item.itemGearQuantum.name=Quanten-Zahnrad
+item.itemDustFluorite.name=Fluorit-Staub
+item.itemDustTinyFluorite.name=Winziges Häufchen Fluorit-Staub
+item.itemDustSmallFluorite.name=Kleines Häufchen Fluorit-Staub
+item.crushedFluorite.name=Zerkleinertes Fluorit-Erz
+item.crushedCentrifugedFluorite.name=Zentrifugiertes zerkleinertes Fluorit-Erz
+item.crushedPurifiedFluorite.name=Gereinigtes zerkleinertes Fluorit-Erz
+item.dustImpureFluorite.name=Ungereinigtes Fluorit-Staub
+item.dustPureFluorite.name=Gereinigtes Fluorit-Staub
+item.itemDustCrocoite.name=Crocoit-Staub
+item.itemDustTinyCrocoite.name=Winziges Häufchen Crocoit-Staub
+item.itemDustSmallCrocoite.name=Kleines Häufchen Crocoit-Staub
+item.crushedCrocoite.name=Zerkleinertes Crocoit-Erz
+item.crushedCentrifugedCrocoite.name=Zentrifugiertes zerkleinertes Crocoit-Erz
+item.crushedPurifiedCrocoite.name=Gereinigtes zerkleinertes Crocoit-Erz
+item.dustImpureCrocoite.name=Ungereinigtes Crocoit-Staub
+item.dustPureCrocoite.name=Gereinigtes Crocoit-Staub
+item.itemDustGeikielite.name=Geikielite-Staub
+item.itemDustTinyGeikielite.name=Winziges Häufchen Geikielite-Staub
+item.itemDustSmallGeikielite.name=Kleines Häufchen Geikielite-Staub
+item.crushedGeikielite.name=Zerkleinertes Geikielite-Erz
+item.crushedCentrifugedGeikielite.name=Zentrifugiertes zerkleinertes Geikielite-Erz
+item.crushedPurifiedGeikielite.name=Gereinigtes zerkleinertes Geikielite-Erz
+item.dustImpureGeikielite.name=Ungereinigtes Geikielite-Staub
+item.dustPureGeikielite.name=Gereinigtes Geikielite-Staub
+item.itemDustNichromite.name=Nichromit-Staub
+item.itemDustTinyNichromite.name=Winziges Häufchen Nichromit-Staub
+item.itemDustSmallNichromite.name=Kleines Häufchen Nichromit-Staub
+item.crushedNichromite.name=Zerkleinertes Nichromit-Erz
+item.crushedCentrifugedNichromite.name=Zentrifugiertes zerkleinertes Nichromit-Erz
+item.crushedPurifiedNichromite.name=Gereinigtes zerkleinertes Nichromit-Erz
+item.dustImpureNichromite.name=Ungereinigtes Nichromit-Staub
+item.dustPureNichromite.name=Gereinigtes Nichromit-Staub
+item.itemDustTitanite.name=Titanit-Staub
+item.itemDustTinyTitanite.name=Winziges Häufchen Titanit-Staub
+item.itemDustSmallTitanite.name=Kleines Häufchen Titanit-Staub
+item.crushedTitanite.name=Zerkleinertes Titanit-Erz
+item.crushedCentrifugedTitanite.name=Zentrifugiertes zerkleinertes Titanit-Erz
+item.crushedPurifiedTitanite.name=Gereinigtes zerkleinertes Titanit-Erz
+item.dustImpureTitanite.name=Ungereinigtes Titanit-Staub
+item.dustPureTitanite.name=Gereinigtes Titanit-Staub
+item.itemDustZimbabweite.name=Zimbabweit-Staub
+item.itemDustTinyZimbabweite.name=Winziges Häufchen Zimbabweit-Staub
+item.itemDustSmallZimbabweite.name=Kleines Häufchen Zimbabweit-Staub
+item.crushedZimbabweite.name=Zerkleinertes Zimbabweit-Erz
+item.crushedCentrifugedZimbabweite.name=Zentrifugiertes zerkleinertes Zimbabweit-Erz
+item.crushedPurifiedZimbabweite.name=Gereinigtes zerkleinertes Zimbabweit-Erz
+item.dustImpureZimbabweite.name=Ungereinigtes Zimbabweit-Staub
+item.dustPureZimbabweite.name=Gereinigtes Zimbabweit-Staub
+item.itemDustZirconolite.name=Zirkonolit-Staub
+item.itemDustTinyZirconolite.name=Winziges Häufchen Zirkonolit-Staub
+item.itemDustSmallZirconolite.name=Kleines Häufchen Zirkonolit-Staub
+item.crushedZirconolite.name=Zerkleinertes Zirkonolit-Erz
+item.crushedCentrifugedZirconolite.name=Zentrifugiertes zerkleinertes Zirkonolit-Erz
+item.crushedPurifiedZirconolite.name=Gereinigtes zerkleinertes Zirkonolit-Erz
+item.dustImpureZirconolite.name=Ungereinigter Zirkonolit-Staub
+item.dustPureZirconolite.name=Gereinigter Zirkonolit-Staub
+item.itemDustGadoliniteCe.name=Gadolinit(Ce)-Staub
+item.itemDustTinyGadoliniteCe.name=Winziges Häufchen Gadolinit(Ce)-Staub
+item.itemDustSmallGadoliniteCe.name=Kleines Häufchen Gadolinit(Ce)-Staub
+item.crushedGadoliniteCe.name=Zerkleinertes Gadolinit(Ce)-Erz
+item.crushedCentrifugedGadoliniteCe.name=Zentrifugiertes zerkleinertes Gadolinit(Ce)-Erz
+item.crushedPurifiedGadoliniteCe.name=Gereinigtes zerkleinertes Gadolinit(Ce)-Erz
+item.dustImpureGadoliniteCe.name=Ungereinigter Gadolinit(Ce)-Staub
+item.dustPureGadoliniteCe.name=Gereinigter Gadolinit(Ce)-Staub
+item.itemDustGadoliniteY.name=Gadolinit(Y)-Staub
+item.itemDustTinyGadoliniteY.name=Winziges Häufchen Gadolinit(Y)-Staub
+item.itemDustSmallGadoliniteY.name=Kleines Häufchen Gadolinit(Y)-Staub
+item.crushedGadoliniteY.name=Zerkleinertes Gadolinit(Y)-Erz
+item.crushedCentrifugedGadoliniteY.name=Zentrifugiertes zerkleinertes Gadolinit(Y)-Erz
+item.crushedPurifiedGadoliniteY.name=Gereinigtes zerkleinertes Gadolinit(Y)-Erz
+item.dustImpureGadoliniteY.name=Ungereinigter Gadolinit(Y)-Staub
+item.dustPureGadoliniteY.name=Gereinigter Gadolinit(Y)-Staub
+item.itemDustLepersonnite.name=Lepersonnit-Staub
+item.itemDustTinyLepersonnite.name=Winziges Häufchen Lepersonnite-Staub
+item.itemDustSmallLepersonnite.name=Kleines Häufchen Lepersonnite-Staub
+item.crushedLepersonnite.name=Zerkleinertes Lepersonnite-Erz
+item.crushedCentrifugedLepersonnite.name=Zentrifugiertes zerkleinertes Lepersonnite-Erz
+item.crushedPurifiedLepersonnite.name=Gereinigtes zerkleinertes Lepersonnite-Erz
+item.dustImpureLepersonnite.name=Ungereinigter Lepersonnite-Staub
+item.dustPureLepersonnite.name=Gereinigter Lepersonnite-Staub
+item.itemDustSamarskiteY.name=Samarsikt(Y)-Staub
+item.itemDustTinySamarskiteY.name=Winziges Häufchen Samarsikt(Y)-Staub
+item.itemDustSmallSamarskiteY.name=Kleines Häufchen Samarsikt(Y)-Staub
+item.crushedSamarskiteY.name=Zerkleinertes Samarsikt(Y)-Erz
+item.crushedCentrifugedSamarskiteY.name=Zentrifugiertes zerkleinertes Samarsikt(Y)-Erz
+item.crushedPurifiedSamarskiteY.name=Gereinigtes zerkleinertes Samarsikt(Y)-Erz
+item.dustImpureSamarskiteY.name=Ungereinigter Samarsikt(Y)-Staub
+item.dustPureSamarskiteY.name=Gereinigter Samarsikt(Y)-Staub
+item.itemDustSamarskiteYb.name=Samarsikt(Yb)-Staub
+item.itemDustTinySamarskiteYb.name=Winziges Häufchen Samarsikt(Yb)-Staub
+item.itemDustSmallSamarskiteYb.name=Kleines Häufchen Samarsikt(Yb)-Staub
+item.crushedSamarskiteYb.name=Zerkleinertes Samarsikt(Yb)-Erz
+item.crushedCentrifugedSamarskiteYb.name=Zentrifugiertes zerkleinertes Samarsikt(Yb)-Erz
+item.crushedPurifiedSamarskiteYb.name=Gereinigtes zerkleinertes Samarsikt(Yb)-Erz
+item.dustImpureSamarskiteYb.name=Ungereinigter Samarsikt(Yb)-Staub
+item.dustPureSamarskiteYb.name=Gereinigter Samarsikt(Yb)-Staub
+item.itemDustXenotime.name=Xenotime-Staub
+item.itemDustTinyXenotime.name=Winziges Häufchen Xenotime-Staub
+item.itemDustSmallXenotime.name=Kleines Häufchen Xenotime-Staub
+item.crushedXenotime.name=Zerkleinertes Xenotime-Erz
+item.crushedCentrifugedXenotime.name=Zentrifugiertes zerkleinertes Xenotime-Erz
+item.crushedPurifiedXenotime.name=Gereinigtes zerkleinertes Xenotime-Erz
+item.dustImpureXenotime.name=Ungereinigter Xenotime-Staub
+item.dustPureXenotime.name=Gereinigter Xenotime-Staub
+item.itemDustYttriaite.name=Yttriait-Staub
+item.itemDustTinyYttriaite.name=Winziges Häufchen Yttriait-Staub
+item.itemDustSmallYttriaite.name=Kleines Häufchen Yttriait-Staub
+item.crushedYttriaite.name=Zerkleinertes Yttriait-Erz
+item.crushedCentrifugedYttriaite.name=Zentrifugiertes zerkleinertes Yttriait-Erz
+item.crushedPurifiedYttriaite.name=Gereinigtes zerkleinertes Yttriait-Erz
+item.dustImpureYttriaite.name=Ungereinigter Yttriait-Staub
+item.dustPureYttriaite.name=Gereinigter Yttriait-Staub
+item.itemDustYttrialite.name=Yttrialit-Staub
+item.itemDustTinyYttrialite.name=Winziges Häufchen Yttrialit-Staub
+item.itemDustSmallYttrialite.name=Kleines Häufchen Yttrialit-Staub
+item.crushedYttrialite.name=Zerkleinertes Yttrialit-Erz
+item.crushedCentrifugedYttrialite.name=Zentrifugiertes zerkleinertes Yttrialit-Erz
+item.crushedPurifiedYttrialite.name=Gereinigtes zerkleinertes Yttrialit-Erz
+item.dustImpureYttrialite.name=Ungereinigter Yttrialit-Staub
+item.dustPureYttrialite.name=Gereinigter Yttrialit-Staub
+item.itemDustYttrocerite.name=Yttrocerite-Staub
+item.itemDustTinyYttrocerite.name=Winziges Häufchen Yttrocerite-Staub
+item.itemDustSmallYttrocerite.name=Kleines Häufchen Yttrocerite-Staub
+item.crushedYttrocerite.name=Zerkleinertes Yttrocerite-Erz
+item.crushedCentrifugedYttrocerite.name=Zentrifugiertes zerkleinertes Yttrocerite-Erz
+item.crushedPurifiedYttrocerite.name=Gereinigtes zerkleinertes Yttrocerite-Erz
+item.dustImpureYttrocerite.name=Ungereinigter Yttrocerite-Staub
+item.dustPureYttrocerite.name=Gereinigter Yttrocerite-Staub
+item.itemDustZircon.name=Zirkon-Staub
+item.itemDustTinyZircon.name=Winziges Häufchen Zirkon-Staub
+item.itemDustSmallZircon.name=Kleines Häufchen Zirkon-Staub
+item.crushedZircon.name=Zerkleinertes Zirkon-Erz
+item.crushedCentrifugedZircon.name=Zentrifugiertes zerkleinertes Zirkon-Erz
+item.crushedPurifiedZircon.name=Gereinigtes zerkleinertes Zirkon-Erz
+item.dustImpureZircon.name=Ungereinigter Zirkon-Staub
+item.dustPureZircon.name=Gereinigter Zirkon-Staub
+item.itemDustPolycrase.name=Polycrase-Staub
+item.itemDustTinyPolycrase.name=Winziges Häufchen Polycrase-Staub
+item.itemDustSmallPolycrase.name=Kleines Häufchen Polycrase-Staub
+item.crushedPolycrase.name=Zerkleinertes Polycrase-Erz
+item.crushedCentrifugedPolycrase.name=Zentrifugiertes zerkleinertes Polycrase-Erz
+item.crushedPurifiedPolycrase.name=Gereinigtes zerkleinertes Polycrase-Erz
+item.dustImpurePolycrase.name=Ungereinigter Polycrase-Staub
+item.dustPurePolycrase.name=Gereinigter Polycrase-Staub
+item.itemDustZircophyllite.name=Zirkophyllit-Staub
+item.itemDustTinyZircophyllite.name=Winziges Häufchen Zirkophyllit-Staub
+item.itemDustSmallZircophyllite.name=Kleines Häufchen Zirkophyllit-Staub
+item.crushedZircophyllite.name=Zerkleinertes Zirkophyllit-Erz
+item.crushedCentrifugedZircophyllite.name=Zentrifugiertes zerkleinertes Zirkophyllit-Erz
+item.crushedPurifiedZircophyllite.name=Gereinigtes zerkleinertes Zirkophyllit-Erz
+item.dustImpureZircophyllite.name=Ungereinigter Zirkophyllit-Staub
+item.dustPureZircophyllite.name=Gereinigter Zirkophyllit-Staub
+item.itemDustZirkelite.name=Zirkelit-Staub
+item.itemDustTinyZirkelite.name=Winziges Häufchen Zirkelit-Staub
+item.itemDustSmallZirkelite.name=Kleines Häufchen Zirkelit-Staub
+item.crushedZirkelite.name=Zerkleinertes Zirkelit-Erz
+item.crushedCentrifugedZirkelite.name=Zentrifugiertes zerkleinertes Zirkelit-Erz
+item.crushedPurifiedZirkelite.name=Gereinigtes zerkleinertes Zirkelit-Erz
+item.dustImpureZirkelite.name=Ungereinigter Zirkelit-Staub
+item.dustPureZirkelite.name=Gereinigter Zirkelit-Staub
+item.itemDustLanthaniteLa.name=Lanthanit(La)-Staub
+item.itemDustTinyLanthaniteLa.name=Winziges Häufchen Lanthanit(La)-Staub
+item.itemDustSmallLanthaniteLa.name=Kleines Häufchen Lanthanit(La)-Staub
+item.crushedLanthaniteLa.name=Zerkleinertes Lanthanit(La)-Erz
+item.crushedCentrifugedLanthaniteLa.name=Zentrifugiertes zerkleinertes Lanthanit(La)-Erz
+item.crushedPurifiedLanthaniteLa.name=Gereinigtes zerkleinertes Lanthanit(La)-Erz
+item.dustImpureLanthaniteLa.name=Ungereinigter Lanthanit(La)-Staub
+item.dustPureLanthaniteLa.name=Gereinigter Lanthanit(La)-Staub
+item.itemDustLanthaniteCe.name=Lanthanit(Ce)-Staub
+item.itemDustTinyLanthaniteCe.name=Winziges Häufchen Lanthanit(Ce)-Staub
+item.itemDustSmallLanthaniteCe.name=Kleines Häufchen Lanthanit(Ce)-Staub
+item.crushedLanthaniteCe.name=Zerkleinertes Lanthanit(Ce)-Erz
+item.crushedCentrifugedLanthaniteCe.name=Zentrifugiertes zerkleinertes Lanthanit(Ce)-Erz
+item.crushedPurifiedLanthaniteCe.name=Gereinigtes zerkleinertes Lanthanit(Ce)-Erz
+item.dustImpureLanthaniteCe.name=Ungereinigter Lanthanit(Ce)-Staub
+item.dustPureLanthaniteCe.name=Gereinigter Lanthanit(Ce)-Staub
+item.itemDustLanthaniteNd.name=Lanthanit(Nd)-Staub
+item.itemDustTinyLanthaniteNd.name=Winziges Häufchen Lanthanit(Nd)-Staub
+item.itemDustSmallLanthaniteNd.name=Kleines Häufchen Lanthanit(Nd)-Staub
+item.crushedLanthaniteNd.name=Zerkleinertes Lanthanit(Nd)-Erz
+item.crushedCentrifugedLanthaniteNd.name=Zentrifugiertes zerkleinertes Lanthanit(Nd)-Erz
+item.crushedPurifiedLanthaniteNd.name=Gereinigtes zerkleinertes Lanthanit(Nd)-Erz
+item.dustImpureLanthaniteNd.name=Ungereinigter Lanthanit(Nd)-Staub
+item.dustPureLanthaniteNd.name=Gereinigter Lanthanit(Nd)-Staub
+item.itemDustAgarditeY.name=Agardit(Y)-Staub
+item.itemDustTinyAgarditeY.name=Winziges Häufchen Agardit(Y)-Staub
+item.itemDustSmallAgarditeY.name=Kleines Häufchen Agardit(Y)-Staub
+item.crushedAgarditeY.name=Zerkleinertes Agardit(Y)-Erz
+item.crushedCentrifugedAgarditeY.name=Zentrifugiertes zerkleinertes Agardit(Y)-Erz
+item.crushedPurifiedAgarditeY.name=Gereinigtes zerkleinertes Agardit(Y)-Erz
+item.dustImpureAgarditeY.name=Ungereinigter Agardit(Y)-Staub
+item.dustPureAgarditeY.name=Gereinigter Agardit(Y)-Staub
+item.itemDustAgarditeCd.name=Agardit(Cd)-Staub
+item.itemDustTinyAgarditeCd.name=Winziges Häufchen Agardit(Cd)-Staub
+item.itemDustSmallAgarditeCd.name=Kleines Häufchen Agardit(Cd)-Staub
+item.crushedAgarditeCd.name=Zerkleinertes Agardit(Cd)-Erz
+item.crushedCentrifugedAgarditeCd.name=Zentrifugiertes zerkleinertes Agardit(Cd)-Erz
+item.crushedPurifiedAgarditeCd.name=Gereinigtes zerkleinertes Agardit(Cd)-Erz
+item.dustImpureAgarditeCd.name=Ungereinigter Agardit(Cd)-Staub
+item.dustPureAgarditeCd.name=Gereinigter Agardit(Cd)-Staub
+item.itemDustAgarditeLa.name=Agardit(La)-Staub
+item.itemDustTinyAgarditeLa.name=Winziges Häufchen Agardit(La)-Staub
+item.itemDustSmallAgarditeLa.name=Kleines Häufchen Agardit(La)-Staub
+item.crushedAgarditeLa.name=Zerkleinertes Agardit(La)-Erz
+item.crushedCentrifugedAgarditeLa.name=Zentrifugiertes zerkleinertes Agardit(La)-Erz
+item.crushedPurifiedAgarditeLa.name=Gereinigtes zerkleinertes Agardit(La)-Erz
+item.dustImpureAgarditeLa.name=Ungereinigter Agardit(La)-Staub
+item.dustPureAgarditeLa.name=Gereinigter Agardit(La)-Staub
+item.itemDustAgarditeNd.name=Agardit(Nd)-Staub
+item.itemDustTinyAgarditeNd.name=Winziges Häufchen Agardit(Nd)-Staub
+item.itemDustSmallAgarditeNd.name=Kleines Häufchen Agardit(Nd)-Staub
+item.crushedAgarditeNd.name=Zerkleinertes Agardit(Nd)-Erz
+item.crushedCentrifugedAgarditeNd.name=Zentrifugiertes zerkleinertes Agardit(Nd)-Erz
+item.crushedPurifiedAgarditeNd.name=Gereinigtes zerkleinertes Agardit(Nd)-Erz
+item.dustImpureAgarditeNd.name=Ungereinigter Agardit(Nd)-Staub
+item.dustPureAgarditeNd.name=Gereinigter Agardit(Nd)-Staub
+item.itemDustHibonite.name=Hibonit-Staub
+item.itemDustTinyHibonite.name=Winziges Häufchen Hibonit-Staub
+item.itemDustSmallHibonite.name=Kleines Häufchen Hibonit-Staub
+item.crushedHibonite.name=Zerkleinertes Hibonit-Erz
+item.crushedCentrifugedHibonite.name=Zentrifugiertes zerkleinertes Hibonit-Erz
+item.crushedPurifiedHibonite.name=Gereinigtes zerkleinertes Hibonit-Erz
+item.dustImpureHibonite.name=Ungereinigter Hibonit-Staub
+item.dustPureHibonite.name=Gereinigter Hibonit-Staub
+item.itemDustCerite.name=Cerit-Staub
+item.itemDustTinyCerite.name=Winziges Häufchen Cerit-Staub
+item.itemDustSmallCerite.name=Kleines Häufchen Cerit-Staub
+item.crushedCerite.name=Zerkleinertes Cerit-Erz
+item.crushedCentrifugedCerite.name=Zentrifugiertes zerkleinertes Cerit-Erz
+item.crushedPurifiedCerite.name=Gereinigtes zerkleinertes Cerit-Erz
+item.dustImpureCerite.name=Ungereinigter Cerit-Staub
+item.dustPureCerite.name=Gereinigter Cerit-Staub
+item.itemDustFluorcaphite.name=Fluorcaphit-Staub
+item.itemDustTinyFluorcaphite.name=Winziges Häufchen Fluorcaphit-Staub
+item.itemDustSmallFluorcaphite.name=Kleines Häufchen Fluorcaphit-Staub
+item.crushedFluorcaphite.name=Zerkleinertes Fluorcaphit-Erz
+item.crushedCentrifugedFluorcaphite.name=Zentrifugiertes zerkleinertes Fluorcaphit-Erz
+item.crushedPurifiedFluorcaphite.name=Gereinigtes zerkleinertes Fluorcaphit-Erz
+item.dustImpureFluorcaphite.name=Ungereinigter Fluorcaphit-Staub
+item.dustPureFluorcaphite.name=Gereinigter Fluorcaphit-Staub
+item.itemDustFlorencite.name=Florencit-Staub
+item.itemDustTinyFlorencite.name=Winziges Häufchen Florencit-Staub
+item.itemDustSmallFlorencite.name=Kleines Häufchen Florencit-Staub
+item.crushedFlorencite.name=Zerkleinertes Florencit-Erz
+item.crushedCentrifugedFlorencite.name=Zentrifugiertes zerkleinertes Florencit-Erz
+item.crushedPurifiedFlorencite.name=Gereinigtes zerkleinertes Florencit-Erz
+item.dustImpureFlorencite.name=Ungereinigter Florencit-Staub
+item.dustPureFlorencite.name=Gereinigter Florencit-Staub
+item.itemDustCryolite.name=Cryolit-Staub
+item.itemDustTinyCryolite.name=Winziges Häufchen Cryolit-Staub
+item.itemDustSmallCryolite.name=Kleines Häufchen Cryolit-Staub
+item.crushedCryolite.name=Zerkleinertes Cryolit-Erz
+item.crushedCentrifugedCryolite.name=Zentrifugiertes zerkleinertes Cryolit-Erz
+item.crushedPurifiedCryolite.name=Gereinigtes zerkleinertes Cryolit-Erz
+item.dustImpureCryolite.name=Ungereinigter Cryolit-Staub
+item.dustPureCryolite.name=Gereinigter Cryolit-Staub
+
+//Shards
+item.itemDrained.name=Erschöpfte Scherbe
+item.itemDustInfusedAir.name=Infundierter Luftstaub
+item.itemDustInfusedFire.name=Infundierter Feuerstaub
+item.itemDustInfusedEarth.name=Infundierter Erdstaub
+item.itemDustInfusedWater.name=Infundierter Wasserstaub
+
+
+//Misc Material Items
+item.itemDustLithiumCarbonate.name=Lithium-Karbonat-Staub
+item.itemDustSmallLithiumCarbonate.name=Kleines Häufchen Lithium-Karbonat-Staub
+item.itemDustTinyLithiumCarbonate.name=Winziges Häufchen Lithium-Karbonat-Staub
+item.itemDustLithiumPeroxide.name=Lithium-Peroxid-Staub
+item.itemDustSmallLithiumPeroxide.name=Kleines Häufchen Lithium-Peroxid-Staub
+item.itemDustTinyLithiumPeroxide.name=Winziges Häufchen Lithium-Peroxid-Staub
+item.itemDustLithiumHydroxide.name=Lithium-Hydroxid-Staub
+item.itemDustSmallLithiumHydroxide.name=Kleines Häufchen Lithium-Hydroxid-Staub
+item.itemDustTinyLithiumHydroxide.name=Winziges Häufchen Lithium-Hydroxid-Staub
+item.itemDustCalciumHydroxide.name=Kalkhydrat-Staub
+item.itemDustSmallCalciumHydroxide.name=Kleines Häufchen Kalkhydrat-Staub
+item.itemDustTinyCalciumHydroxide.name=Winziges Häufchen Kalkhydrat-Staub
+item.itemDustCalciumCarbonate.name=Calcium-Karbonat-Staub
+item.itemDustSmallCalciumCarbonate.name=Kleines Häufchen Calcium-Karbonat-Staub
+item.itemDustTinyCalciumCarbonate.name=Winziges Häufchen Calcium-Karbonat-Staub
+item.itemDustGypsum.name=Calcium-Sulfat(Gypsum)-Staub
+item.itemDustSmallGypsum.name=Kleines Häufchen Calcium-Sulfat(Gypsum)-Staub
+item.itemDustTinyGypsum.name=Winziges Häufchen Calcium-Sulfat(Gypsum)-Staub
+item.itemDustLi2CO3CaOH2.name=Li2CO3 + Ca(OH)2 Komposit-Staub
+item.itemDustSmallLi2CO3CaOH2.name=Kleines Häufchen Li2CO3 + Ca(OH)2 Komposit-Staub
+item.itemDustTinyLi2CO3CaOH2.name=Winziges Häufchen Li2CO3 + Ca(OH)2 Komposit-Staub
+item.itemDustLi2BeF4.name=Li2BeF4 Treibstoff-Komposit-Staub
+item.itemDustSmallLi2BeF4.name=Kleines Häufchen Li2BeF4 Treibstoff-Komposit-Staub
+item.itemDustTinyLi2BeF4.name=Winziges Häufchen Li2BeF4 Treibstoff-Komposit-Staub
+item.Li2BeF4.name=Li2BeF4-Zelle
+item.itemCircuitLFTR.name=§aThorium Reaktorkontrollschaltung
+item.itemZirconiumPellet.name=Zirkonium-Pellet [ZrCl₄]
+item.itemDustZrCl4.name=ZrCl4-Staub
+item.itemDustSmallZrCl4.name=Kleines Häufchen ZrCl4-Staub
+item.itemDustTinyZrCl4.name=Winziges Häufchen ZrCl4-Staub
+item.itemDustCookedZrCl4.name=gebrannter ZrCl4-Staub
+item.itemDustSmallCookedZrCl4.name=Kleines Häufchen gebrannter ZrCl4-Staub
+item.itemDustTinyCookedZrCl4.name=Winziges Häufchen gebrannter ZrCl4-Staub
+item.itemDustUN18Fertiliser.name=UN-18 Dünger-Staub
+item.itemDustSmallUN18Fertiliser.name=Kleines Häufchen UN-18 Dünger-Staub
+item.itemDustTinyUN18Fertiliser.name=Winziges Häufchen UN-18 Dünger-Staub
+item.itemDustUN32Fertiliser.name=UN-32 Dünger-Staub
+item.itemDustSmallUN32Fertiliser.name=Kleines Häufchen UN-32 Dünger-Staub
+item.itemDustTinyUN32Fertiliser.name=Winziges Häufchen UN-32 Dünger-Staub
+
+//Multitools
+item.AluminiumMultipick.name=Aluminium-Multi-Spitzhacke
+item.AluminiumMultispade.name=Aluminium-Multi-Schaufel
+item.BerylliumMultispade.name=Beryllium-Multi-Schaufel
+item.BismuthMultispade.name=Bismuth-Multi-Schaufel
+item.CarbonMultispade.name=Karbon-Multi-Schaufel
+item.ChromeMultipick.name=Chrom-Multi-Spitzhacke
+item.ChromeMultispade.name=Chrom-Multi-Schaufel
+item.CobaltMultipick.name=Kobalt-Multi-Spitzhacke
+item.CobaltMultispade.name=Kobalt-Multi-Schaufel
+item.GoldMultispade.name=Gold-Multi-Schaufel
+item.IridiumMultipick.name=Iridium-Multi-Spitzhacke
+item.IridiumMultispade.name=Iridium-Multi-Schaufel
+item.IronMultipick.name=Eisen-Multi-Spitzhacke
+item.IronMultispade.name=Eisen-Multi-Schaufel
+item.LeadMultispade.name=Blei-Multi-Schaufel
+item.ManganeseMultipick.name=Mangan-Multi-Spitzhacke
+item.ManganeseMultispade.name=Mangan-Multi-Schaufel
+item.MolybdenumMultipick.name=Molybdän-Multi-Spitzhacke
+item.MolybdenumMultispade.name=Molybdän-Multi-Schaufel
+item.NeodymiumMultipick.name=Neodym-Multi-Spitzhacke
+item.NeodymiumMultispade.name=Neodym-Multi-Schaufel
+item.NeutroniumMultipick.name=Neutronium-Multi-Spitzhacke
+item.NeutroniumMultispade.name=Neutronium-Multi-Schaufel
+item.NickelMultispade.name=Nickel-Multi-Schaufel
+item.OsmiumMultipick.name=Osmium-Multi-Spitzhacke
+item.OsmiumMultispade.name=Osmium-Multi-Schaufel
+item.PalladiumMultipick.name=Palladium-Multi-Spitzhacke
+item.PalladiumMultispade.name=Palladium-Multi-Schaufel
+item.PlatinumMultispade.name=Platin-Multi-Schaufel
+item.Plutonium241Multipick.name=Plutonium-241-Multi-Spitzhacke
+item.Plutonium241Multispade.name=Plutonium-241-Multi-Schaufel
+item.SilverMultispade.name=Silber-Multi-Schaufel
+item.ThoriumMultipick.name=Thorium-Multi-Spitzhacke
+item.ThoriumMultispade.name=Thorium-Multi-Schaufel
+item.TitaniumMultipick.name=Titan-Multi-Spitzhacke
+item.TitaniumMultispade.name=Titan-Multi-Schaufel
+item.TungstenMultipick.name=Wolfram-Multi-Spitzhacke
+item.TungstenMultispade.name=Wolfram-Multi-Schaufel
+item.Uranium235Multipick.name=Uran-235-Multi-Spitzhacke
+item.Uranium235Multispade.name=Uran-235-Multi-Schaufel
+item.DarkSteelMultipick.name=Dunkelstahl-Multi-Spitzhacke
+item.DarkSteelMultispade.name=Dunkelstahl-Multi-Schaufel
+item.DuraniumMultipick.name=Duranium-Multi-Spitzhacke
+item.DuraniumMultispade.name=Duranium-Multi-Schaufel
+item.InfusedGoldMultispade.name=Infundiertes-Gold-Multi-Schaufel
+item.NaquadahMultipick.name=Naquadah-Multi-Spitzhacke
+item.NaquadahMultispade.name=Naquadah-Multi-Schaufel
+item.NaquadahAlloyMultipick.name=Naquadah-Legierung-Multi-Spitzhacke
+item.NaquadahAlloyMultispade.name=Naquadah-Legierung-Multi-Schaufel
+item.NaquadriaMultipick.name=Naquadria-Multi-Spitzhacke
+item.NaquadriaMultispade.name=Naquadria-Multi-Schaufel
+item.TritaniumMultipick.name=Tritanium-Multi-Spitzhacke
+item.TritaniumMultispade.name=Tritanium-Multi-Schaufel
+item.OsmiridiumMultipick.name=Osmiridium-Multi-Spitzhacke
+item.OsmiridiumMultispade.name=Osmiridium-Multi-Schaufel
+item.BrassMultispade.name=Messing-Multi-Schaufel
+item.BronzeMultipick.name=Bronze-Multi-Spitzhacke
+item.BronzeMultispade.name=Bronze-Multi-Schaufel
+item.CupronickelMultispade.name=Cupronickel-Multi-Schaufel
+item.ElectrumMultispade.name=Electrum-Multi-Schaufel
+item.InvarMultipick.name=Invar-Multi-Spitzhacke
+item.InvarMultispade.name=Invar-Multi-Schaufel
+item.KanthalMultispade.name=Kanthal-Multi-Schaufel
+item.MagnaliumMultipick.name=Magnalium-Multi-Spitzhacke
+item.MagnaliumMultispade.name=Magnalium-Multi-Schaufel
+item.NichromeMultispade.name=Nichrom-Multi-Schaufel
+item.PigIronMultipick.name=Schweineisen-Multi-Spitzhacke
+item.PigIronMultispade.name=Schweineisen-Multi-Schaufel
+item.PolycaprolactamMultispade.name=Polycaprolactam-Multi-Schaufel
+item.PolytetrafluoroethyleneMultispade.name=Polytetrafluoroethylene-Multi-Schaufel
+item.NickelZincFerriteMultispade.name=Nickel-Zink-Ferrit-Multi-Schaufel
+item.PolyphenyleneSulfideMultispade.name=Polyphenylene-Sulfit-Multi-Schaufel
+item.StainlessSteelMultipick.name=Edelstahl-Multi-Spitzhacke
+item.StainlessSteelMultispade.name=Edelstahl-Multi-Schaufel
+item.SteelMultipick.name=Stahl-Multi-Spitzhacke
+item.SteelMultispade.name=Stahl-Multi-Schaufel
+item.TinAlloyMultispade.name=Zinnlegierung-Multi-Schaufel
+item.UltimetMultipick.name=Ultimet-Multi-Spitzhacke
+item.UltimetMultispade.name=Ultimet-Multi-Schaufel
+item.WroughtIronMultipick.name=Schmiedeisen-Multi-Spitzhacke
+item.WroughtIronMultispade.name=Schmiedeisen-Multi-Schaufel
+item.SterlingSilverMultipick.name=Sterlingsilber-Multi-Spitzhacke
+item.SterlingSilverMultispade.name=Sterlingsilber-Multi-Schaufel
+item.RoseGoldMultipick.name=Rosegold-Multi-Spitzhacke
+item.RoseGoldMultispade.name=Rosegold-Multi-Schaufel
+item.BlackBronzeMultipick.name=Schwarzbronze-Multi-Spitzhacke
+item.BlackBronzeMultispade.name=Schwarzbronze-Multi-Schaufel
+item.BismuthBronzeMultipick.name=Bismuth-Bronze-Multi-Spitzhacke
+item.BismuthBronzeMultispade.name=Bismuth-Bronze-Multi-Schaufel
+item.BlackSteelMultipick.name=Schwarzstahl-Multi-Spitzhacke
+item.BlackSteelMultispade.name=Schwarzstahl-Multi-Schaufel
+item.RedSteelMultipick.name=Rotstahl-Multi-Spitzhacke
+item.RedSteelMultispade.name=Rotstahl-Multi-Schaufel
+item.BlueSteelMultipick.name=Blaustahl-Multi-Spitzhacke
+item.BlueSteelMultispade.name=Blaustahl-Multi-Schaufel
+item.DamascusSteelMultipick.name=Damaskusstahl-Multi-Spitzhacke
+item.DamascusSteelMultispade.name=Damaskusstahl-Multi-Schaufel
+item.MithrilMultispade.name=Mithril-Multi-Schaufel
+item.CobaltBrassMultipick.name=Kobaltmessing-Multi-Spitzhacke
+item.CobaltBrassMultispade.name=Kobaltmessing-Multi-Schaufel
+item.ThaumiumMultipick.name=Thaumium-Multi-Spitzhacke
+item.ThaumiumMultispade.name=Thaumium-Multi-Schaufel
+item.HSSGMultipick.name=HSS-G-Multi-Spitzhacke
+item.HSSGMultispade.name=HSS-G-Multi-Schaufel
+item.HSSEMultipick.name=HSS-E-Multi-Spitzhacke
+item.HSSEMultispade.name=HSS-E-Multi-Schaufel
+item.HSSSMultipick.name=HSS-S-Multi-Spitzhacke
+item.HSSSMultispade.name=HSS-S-Multi-Schaufel
+item.HastelloyC276Multipick.name=Hastelloy-C276-Multi-Spitzhacke
+item.HastelloyC276Multispade.name=Hastelloy-C276-Multi-Schaufel
+item.HastelloyNMultipick.name=Hastelloy-N-Multi-Spitzhacke
+item.HastelloyNMultispade.name=Hastelloy-N-Multi-Schaufel
+item.HastelloyWMultipick.name=Hastelloy-W-Multi-Spitzhacke
+item.HastelloyWMultispade.name=Hastelloy-W-Multi-Schaufel
+item.HastelloyXMultipick.name=Hastelloy-X-Multi-Spitzhacke
+item.HastelloyXMultispade.name=Hastelloy-X-Multi-Schaufel
+item.Incoloy020Multipick.name=Incoloy-020-Multi-Spitzhacke
+item.Incoloy020Multispade.name=Incoloy-020-Multi-Schaufel
+item.IncoloyDSMultipick.name=Incoloy-DS-Multi-Spitzhacke
+item.IncoloyDSMultispade.name=Incoloy-DS-Multi-Schaufel
+item.IncoloyMA956Multipick.name=Incoloy-MA956-Multi-Spitzhacke
+item.IncoloyMA956Multispade.name=Incoloy-MA956-Multi-Schaufel
+item.Inconel625Multipick.name=Inconel-625-Multi-Spitzhacke
+item.Inconel625Multispade.name=Inconel-625-Multi-Schaufel
+item.Inconel690Multipick.name=Inconel-690-Multi-Spitzhacke
+item.Inconel690Multispade.name=Inconel-690-Multi-Schaufel
+item.Inconel792Multipick.name=Inconel-792-Multi-Spitzhacke
+item.Inconel792Multispade.name=Inconel-792-Multi-Schaufel
+item.GrisiumMultipick.name=Grisium-Multi-Spitzhacke
+item.GrisiumMultispade.name=Grisium-Multi-Schaufel
+item.Tantalloy60Multipick.name=Tantalloy-60-Multi-Spitzhacke
+item.Tantalloy60Multispade.name=Tantalloy-60-Multi-Schaufel
+item.Tantalloy61Multipick.name=Tantalloy-61-Multi-Spitzhacke
+item.Tantalloy61Multispade.name=Tantalloy-61-Multi-Schaufel
+item.StaballoyMultipick.name=Staballoy-Multi-Spitzhacke
+item.StaballoyMultispade.name=Staballoy-Multi-Schaufel
+item.QuantumMultipick.name=Quanten-Multi-Spitzhacke
+item.QuantumMultispade.name=Quanten-Multi-Schaufel
+item.PotinMultipick.name=Potin-Multi-Spitzhacke
+item.PotinMultispade.name=Potin-Multi-Schaufel
+item.TumbagaMultipick.name=Tumbaga-Multi-Spitzhacke
+item.TumbagaMultispade.name=Tumbaga-Multi-Schaufel
+item.TaloniteMultipick.name=Talonite-Multi-Spitzhacke
+item.TaloniteMultispade.name=Talonite-Multi-Schaufel
+item.StelliteMultipick.name=Stellite-Multi-Spitzhacke
+item.StelliteMultispade.name=Stellite-Multi-Schaufel
+item.TungstenCarbideMultipick.name=Wolframcarbid-Multi-Spitzhacke
+item.TungstenCarbideMultispade.name=Wolframcarbid-Multi-Schaufel
+item.TantalumCarbideMultipick.name=Tantalcarbid-Multi-Spitzhacke
+item.TantalumCarbideMultispade.name=Tantalcarbid-Multi-Schaufel
+
+item.mobessence.name=Mobessenz-Zell
+item.itemPlateClay.name=Lehm-Platte
+item.itemPlateDoubleClay.name=Doppelte Lehm-Platte
+item.itemSmallGearWroughtIron.name=Kleines Schmiedeisen-Zahnrad
+item.itemPlateLithium.name=Lithium-Platte
+item.itemPlateDoubleEuropium.name=Doppelte Europium-Platte
+item.itemBoilerChassis_0.name=Fortgeschrittenes Boiler-Chassis [Stufe 1]
+item.itemDehydratorCoilWire_0.name=Spulendraht [EV]
+item.itemDehydratorCoil_0.name=Dehydratorspule [EV]
+item.itemAirFilter_0.name=Luftfilter [Stufe 1]
+item.itemLavaFilter.name=Lavafilter
+item.itemGrindleTablet.name=Git
+item.itemDragonJar.name=Drachenfangbehälter
+item.CoalGas.name=Kohlegas-Zelle
+item.Ethylbenzene.name=Ethylbenzin-Zelle
+item.Anthracene.name=Anthracen-Zelle
+item.Toluene.name=Toluol-Zelle
+item.CoalTar.name=Kohl-Teer-Zelle
+item.CoalTarOil.name=Kohl-Teeröl-Zelle
+item.SulfuricCoalTarOil.name=Schweflige Kohl-Teeröl-Zelle
+item.Naphthalene.name=Naphthalin-Zelle
+item.itemDustPhthalicAnhydride.name=Phthalsäureanhydrid-Staub
+item.itemDustSmallPhthalicAnhydride.name=Kleines Häufchen Phthalsäureanhydrid-Staub
+item.itemDustTinyPhthalicAnhydride.name=Winziges Häufchen Phthalsäureanhydrid-Staub
+item.2Ethylanthraquinone.name=2-Ethylanthrachinon-Zelle
+item.2Ethylanthrahydroquinone.name=2-Ethylanthrachinon-Zelle
+item.HydrogenPeroxide.name=Wasserstoffperoxid-Zelle
+item.itemDustLithiumHydroperoxide.name=Lithium-Wasserstoffperoxid-Staub
+item.itemDustSmallLithiumHydroperoxide.name=Kleines Häufchen Lithium-Wasserstoffperoxid-Staub
+item.itemDustTinyLithiumHydroperoxide.name=Winziges Häufchen Lithium-Wasserstoffperoxid-Staub
+item.LithiumPeroxide.name=Lithium-Peroxid-Zelle
+item.itemPotionChilly.name=Frostiger Trank
+item.itemKeyBig4000DC's.name=4000DC's großer Schlüssel
+item.itemGemDull.name=Stumpfer Edelstein
+item.itemMushroomForest.name=Waldpilz
+item.itemPlateVanadium.name=Vanadium-Platte
+item.thekeytothecity.name=Der Schlüssel zur Stadt
+item.modularbauble.name=Modular Bauble
+item.itemDustSoularium.name=Soularium-Staub
+item.itemDustSmallSoularium.name=Kleines Häufchen Soularium-Staub
+item.itemDustTinySoularium.name=Winziges Häufchen Soularium-Staub
+item.itemDustRedstoneAlloy.name=Redstone-Legierung-Staub
+item.itemDustSmallRedstoneAlloy.name=Kleines Häufchen Redstone-Legierung-Staub
+item.itemDustTinyRedstoneAlloy.name=Winziges Häufchen Redstone-Legierung-Staub
+item.itemDustElectricalSteel.name=Elektrisches-Stahl-Staub
+item.itemDustSmallElectricalSteel.name=Kleines Häufchen Elektrisches-Stahl-Staub
+item.itemDustTinyElectricalSteel.name=Winziges Häufchen Elektrisches-Stahl-Staub
+item.itemDustPulsatingIron.name=Pulsierendes-Eisen-Staub
+item.itemDustSmallPulsatingIron.name=Kleines Häufchen Pulsierendes-Eisen-Staub
+item.itemDustTinyPulsatingIron.name=Winziges Häufchen Pulsierendes-Eisen-Staub
+item.itemDustEnergeticAlloy.name=Energetische-Legierung-Staub
+item.itemDustSmallEnergeticAlloy.name=Kleines Häufchen Energetische-Legierung-Staub
+item.itemDustTinyEnergeticAlloy.name=Winziges Häufchen Energetische-Legierung-Staub
+item.itemDustVibrantAlloy.name=Dynamische-Legierung-Staub
+item.itemDustSmallVibrantAlloy.name=Kleines Häufchen Dynamische-Legierung-Staub
+item.itemDustTinyVibrantAlloy.name=Winziges Häufchen Dynamische-Legierung-Staub
+item.itemDustConductiveIron.name=Leitendes-Iron-Staub
+item.itemDustSmallConductiveIron.name=Kleines Häufchen Leitendes-Iron-Staub
+item.itemDustTinyConductiveIron.name=Winziges Häufchen Leitendes-Iron-Staub
+item.itemPlateSoularium.name=Soularium-Plate
+item.itemPlateRedstoneAlloy.name=Redstone-Legierung-Platte
+item.itemPlateElectricalSteel.name=Elektrisches-Stahl-Platte
+item.itemPlatePhasedIron.name=Pulsierende-Eisen-Platte
+item.itemPlateEnergeticAlloy.name=Energetische-Legierung-Platte
+item.itemPlateVibrantAlloy.name=Vibrant Alloy plate
+item.itemPlateConductiveIron.name=Conductive Iron plate
+item.itemPlateBlutonium.name=Blutonium-Platte
+item.itemPlateCyanite.name=Cyanit-Platte
+item.itemPlateLudicrite.name=Ludikrit-Platte
+item.itemPlateVoid.name="Nichts"-Platte
+item.itemPlateDimensionShard.name=Dimensionsscherben-Platte
+item.rfEUBattery.name=Universelle Ladbare Batterie
+item.personalCloakingDevice.name=§9Persönliches Drapiergerät§7
+item.personalHealingDevice.name=§9Persönliche Helungsnanobooster§r
+item.SlowBuildingRing.name=§eLangsamer Bau-Ring§7
+item.itemStaballoyPickaxe.name=Tunnelgräber
+item.itemStaballoyAxe.name=Baumfäller
+item.itemSandstoneHammer.name=Bruchsteinbrecher
+item.itemBufferCore.name=Pufferkern [ULV].
+item.itemBufferCore.name=Pufferkern [LV].
+item.itemBufferCore.name=Pufferkern [MV].
+item.itemBufferCore.name=Pufferkern [HV].
+item.itemBufferCore.name=Pufferkern [EV].
+item.itemBufferCore.name=Pufferkern [IV].
+item.itemBufferCore.name=Pufferkern [LuV].
+item.itemBufferCore.name=Pufferkern [ZPM].
+item.itemBufferCore.name=Pufferkern [UV].
+item.itemBufferCore.name=Pufferkern [MAX].
+item.itemPLACEHOLDER_Circuit.name=Quarks Manipulator (UV)
+item.itembookgt.name=§oThermal-Boiler-Anleitung
+
+// Everglade Items
+item.everglades.trigger.name=§6Alkalus Schallplatte [§cAktiviert§6]
+
+
+
+
+
+
+
+//Blocks
+tile.blockRainforestOakLog.name=Regenwaldeiche
+tile.blockRainforestOakLeaves.name=Eichenblatt
+tile.blockRainforestOakSapling.name=Regenwaldeichensetzling
+
+//TC Stuff
+tile.blockFastAlchemyFurnace.0.name=Kaputt
+tile.blockFastArcaneAlembic.1.name=Kaputt
+
+//Frame Boxes
+tile.Block of Selenium.name=Block aus Selen
+tile.Selenium Frame Box.name=Selen-Rahmen-Box
+tile.Block of Bromine.name=Block aus Bromine
+tile.Block of Strontium.name=Block aus Strontium
+tile.Strontium Frame Box.name=Strontium-Rahmen-Box
+tile.Block of Zirconium.name=Block aus Zirconium
+tile.Zirconium Frame Box.name=Zirkonium-Rahmen-Box
+tile.Block of Ruthenium.name=Block aus Ruthenium
+tile.Ruthenium Frame Box.name=Ruthenium-Rahmen-Box
+tile.Block of Iodine.name=Block aus Iod
+tile.Iodine Frame Box.name=Iod-Rahmen-Box
+tile.Block of Hafnium.name=Block aus Hafnium
+tile.Hafnium Frame Box.name=Hafnium-Rahmen-Box
+tile.Block of Dysprosium.name=Block aus Dysprosium
+tile.Dysprosium Frame Box.name=Dysprosium-Rahmen-Box
+tile.Block of Tellurium.name=Block aus Tellur
+tile.Tellurium Frame Box.name=Tellur-Rahmen-Box
+tile.Block of Rhodium.name=Block aus Rhodium
+tile.Rhodium Frame Box.name=Rhodium-Rahmen-Box
+tile.Block of Rhenium.name=Block aus Rhenium
+tile.Rhenium Frame Box.name=Rhenium-Rahmen-Box
+tile.Block of Thallium.name=Block aus Thallium
+tile.Thallium Frame Box.name=Thallium-Rahmen-Box
+tile.Block of Technetium.name=Block aus Technetium
+tile.Block of Polonium.name=Block aus Polonium
+tile.Block of Astatine.name=Block aus Astata
+tile.Block of Francium.name=Block aus Francium
+tile.Block of Radium.name=Block aus Radium
+tile.Block of Actinium.name=Block aus Actinium
+tile.Block of Protactinium.name=Block aus Protactinium
+tile.Block of Neptunium.name=Block aus Neptunium
+tile.Block of Curium.name=Block aus Curium
+tile.Block of Berkelium.name=Block aus Berkelium
+tile.Block of Californium.name=Block aus Californium
+tile.Block of Einsteinium.name=Block aus Einsteinium
+tile.Block of Fermium.name=Block aus Fermium
+tile.Block of Thorium 232.name=Block aus Thorium-232
+tile.Block of Uranium 232.name=Block aus Uran-232
+tile.Block of Uranium 233.name=Block aus Uran-233
+tile.Block of Plutonium-238.name=Block aus Plutonium-238
+tile.Block of Strontium-90.name=Block aus Strontium-90
+tile.Block of Polonium-210.name=Block aus Polonium-210
+tile.Block of Americium-241.name=Block aus Americium-241
+tile.Block of Silicon Carbide.name=Block aus Siliconcarbid
+tile.Silicon Carbide Frame Box.name=Siliconcarbid-Rahmen-Box
+tile.Block of Zirconium Carbide.name=Block aus Zirkoniumcarbid
+tile.Zirconium Carbide Frame Box.name=Zirkoniumcarbide-Rahmen-Box
+tile.Block of Tantalum Carbide.name=Block aus Tantalcarbid
+tile.Tantalum Carbide Frame Box.name=Tantalcarbide-Rahmen-Box
+tile.Block of Niobium Carbide.name=Block aus Niobcarbid
+tile.Niobium Carbide Frame Box.name=Niobium Carbide-Rahmen-Box
+tile.Block of Beryllium Fluoride.name=Block aus Beryllium-Fluorid
+tile.Block of Lithium Fluoride.name=Block aus Lithium-Fluorid
+tile.Block of Thorium Tetrafluoride.name=Block aus Thorium-Tetrafluorid
+tile.Block of Thorium Hexafluoride.name=Block aus Thorium-Hexafluorid
+tile.Block of Uranium Tetrafluoride.name=Block aus Uran-Tetrafluorid
+tile.Block of Uranium Hexafluoride.name=Block aus Uran-Hexafluorid
+tile.Block of Zirconium Tetrafluoride.name=Block aus Zirkonium-Tetrafluorid
+tile.Block of Neptunium Hexafluoride.name=Block aus Neptunium-Hexafluorid
+tile.Block of Technetium Hexafluoride.name=Block aus Technetium-Hexafluorid
+tile.Block of Selenium Hexafluoride.name=Block aus Selen-Hexafluorid
+tile.Block of LiFBeF2ZrF4U235.name=Block aus LiFBeF2ZrF4U235
+tile.Block of LiFBeF2ZrF4UF4.name=Block aus LiFBeF2ZrF4UF4
+tile.Block of LiFBeF2ThF4UF4.name=Block aus LiFBeF2ThF4UF4
+tile.Block of Energy Crystal.name=Block aus Energiekristall
+tile.Energy Crystal Frame Box.name=Energiekristall-Rahmen-Box
+tile.Block of Blood Steel.name=Block aus Blutstahl
+tile.Blutstahl Frame Box.name=Blutstahl-Rahmen-Box
+tile.Block of Zeron-100.name=Block aus Zeron-100
+tile.Zeron-100 Frame Box.name=Zeron-100-Rahmen-Box
+tile.Block of Tumbaga.name=Block aus Tumbaga
+tile.Tumbaga Frame Box.name=Tumbaga-Rahmen-Box
+tile.Block of Potin.name=Block aus Potin
+tile.Potin Frame Box.name=Potin-Rahmen-Box
+tile.Block of Staballoy.name=Block aus Staballoy
+tile.Staballoy Frame Box.name=Staballoy-Rahmen-Box
+tile.Block of Tantalloy-60.name=Block aus Tantalloy-60
+tile.Tantalloy-60 Frame Box.name=Tantalloy-60-Rahmen-Box
+tile.Block of Tantalloy-61.name=Block aus Tantalloy-61
+tile.Tantalloy-61 Frame Box.name=Tantalloy-61-Rahmen-Box
+tile.Block of Inconel-625.name=Block aus Inconel-625
+tile.Inconel-625 Frame Box.name=Inconel-625-Rahmen-Box
+tile.Block of Inconel-690.name=Block aus Inconel-690
+tile.Inconel-690 Frame Box.name=Inconel-690-Rahmen-Box
+tile.Block of Inconel-792.name=Block aus Inconel-792
+tile.Inconel-792 Frame Box.name=Inconel-792-Rahmen-Box
+tile.Block of Eglin Steel.name=Block aus Eglin Steel
+tile.Eglin Steel Frame Box.name=Eglin Steel-Rahmen-Box
+tile.Block of Maraging Steel 250.name=Block aus Maraging-Stahl 250
+tile.Maraging Steel 250 Frame Box.name=Maraging-Stahl 250-Rahmen-Box
+tile.Block of Maraging Steel 300.name=Block aus Maraging-Stahl 300
+tile.Maraging Steel 300 Frame Box.name=Maraging-Stahl 300-Rahmen-Box
+tile.Block of Maraging Steel 350.name=Block aus Maraging-Stahl 350
+tile.Maraging Steel 350 Frame Box.name=Maraging-Stahl 350-Rahmen-Box
+tile.Block of Stellite.name=Block aus Stellite
+tile.Stellite Frame Box.name=Stellite-Rahmen-Box
+tile.Block of Talonite.name=Block aus Talonite
+tile.Talonite Frame Box.name=Talonite-Rahmen-Box
+tile.Block of Hastelloy-W.name=Block aus Hastelloy-W
+tile.Hastelloy-W Frame Box.name=Hastelloy-W-Rahmen-Box
+tile.Block of Hastelloy-X.name=Block aus Hastelloy-X
+tile.Hastelloy-X Frame Box.name=Hastelloy-X-Rahmen-Box
+tile.Block of Hastelloy-C276.name=Block aus Hastelloy-C276
+tile.Hastelloy-C276 Frame Box.name=Hastelloy-C276-Rahmen-Box
+tile.Block of Hastelloy-N.name=Block aus Hastelloy-N
+tile.Hastelloy-N Frame Box.name=Hastelloy-N-Rahmen-Box
+tile.Block of Incoloy-020.name=Block aus Incoloy-020
+tile.Incoloy-020 Frame Box.name=Incoloy-020-Rahmen-Box
+tile.Block of Incoloy-DS.name=Block aus Incoloy-DS
+tile.Incoloy-DS Frame Box.name=Incoloy-DS-Rahmen-Box
+tile.Block of Incoloy-MA956.name=Block aus Incoloy-MA956
+tile.Incoloy-MA956 Frame Box.name=Incoloy-MA956-Rahmen-Box
+tile.Block of Grisium.name=Block aus Grisium
+tile.Grisium Frame Box.name=Grisium-Rahmen-Box
+tile.Block of Trinium.name=Block aus Trinium
+tile.Block of Refined Trinium.name=Block aus raffiniertem Trinium
+tile.Block of Trinium Titanium Alloy.name=Block aus Trinium-Titanium-Legierung
+tile.Trinium Titanium Alloy Frame Box.name=Trinium-Titanium-Legierung-Rahmen-Box
+tile.Block of Trinium Naquadah Alloy.name=Block aus Trinium-Naquadah-Legierung
+tile.Block of Trinium Naquadah Carbonite.name=Block aus Trinium-Naquadah-Carbonit
+tile.Trinium Naquadah Carbonite Frame Box.name=Trinium-Naquadah-Carbonit-Rahmen-Box
+tile.Block of Quantum.name=Block aus Quanten
+tile.Quantum Frame Box.name=Quanten-Rahmenbox
+
+//Ores
+tile.OreFluorite.name=Fluoriterz
+tile.OreCrocoite.name=Crocoiterz
+tile.OreGeikielite.name=Geikielieerz
+tile.OreNichromite.name=Nichromiterz
+tile.OreTitanite.name=Titaniterz
+tile.OreZimbabweite.name=Zimbabweiterz
+tile.OreZirconolite.name=Zirconoliterz
+tile.OreGadoliniteCe.name=Gadoliniterz(Ce)
+tile.OreGadoliniteY.name=Gadoliniterz(Y)
+tile.OreLepersonnite.name=Lepersonniterz
+tile.OreSamarskiteY.name=Samarskiterz(Y)
+tile.OreSamarskiteYb.name=Samarskiterz(Yb)
+tile.OreXenotime.name=Xenotimerz
+tile.OreYttriaite.name=Yttriaiterz
+tile.OreYttrialite.name=Yttrialiterz
+tile.OreYttrocerite.name=Yttroceriterz
+tile.OreZircon.name=Zirconerz
+tile.OrePolycrase.name=Polycraserz
+tile.OreZircophyllite.name=Zircophylliterz
+tile.OreZirkelite.name=Zirkeliterz
+tile.OreLanthaniteLa.name=Lanthaniterz(La)
+tile.OreLanthaniteCe.name=Lanthaniterz(Ce)
+tile.OreLanthaniteNd.name=Lanthaniterz(Nd)
+tile.OreAgarditeY.name=Agarditerz(Y)
+tile.OreAgarditeCd.name=Agarditerz(Cd)
+tile.OreAgarditeLa.name=Agarditerz(La)
+tile.OreAgarditeNd.name=Agarditerz(Nd)
+tile.OreHibonite.name=Hiboniterz
+tile.OreCerite.name=Ceriterz
+tile.OreFluorcaphite.name=Fluorcaphiterz
+tile.OreFlerzncite.name=Flerznciterz
+tile.OreCryolite.name=Cryoliterz
+
+//Misc
+tile.blockMFEffect.name=Spezial
+tile.fluidBlockSludge.name=Brühe
+tile.blockWorkbenchGT.name=Werkbank
+tile.blockWorkbenchGTAdvanced.name=Fortgeschrittene Werkbank
+tile.blockHeliumGenerator.name=Helium Generator
+tile.blockFirePit.name=Feuerstelle
+tile.blockFishTrap.name=Fischfalle
+tile.blockInfiniteFluidTank.name=Unendlicher Tank
+tile.blockMiningExplosives.name=Minensprengstoff
+tile.blockHellFire.name=Höllenfeuer
+tile.blockProjectBench.name=Projektplanungstisch
+tile.blockTradeBench.name=Handelstisch
+tile.blockModularity.name=Modulare Werkbank
+tile.blockBlackGate.name=Witherkäfig
+tile.blockTankXpConverter.name=Erfahrungswandler(XP)
+
+//Everglades Blocks
+tile.fluidSludge.0.name=Stehendes Abwasser
+tile.blockDarkWorldPortal.name=Portalstein für die Dunkle Welt
+tile.blockDarkWorldGround.name=Grundstein der Dunklen Welt
+tile.blockDarkWorldGround2.name=Grundstein der Dunklen Welt
+tile.blockDarkWorldPortalFrame.name=Portalrahmen für die Dunkle Welt
diff --git a/gtpp/src/main/resources/assets/miscutils/lang/en_US.lang b/gtpp/src/main/resources/assets/miscutils/lang/en_US.lang
new file mode 100644
index 0000000000..6fe80a2360
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/lang/en_US.lang
@@ -0,0 +1,3572 @@
+//Creative Tabs
+itemGroup.MiscUtilBlockTab=[GT++] Blocks
+itemGroup.MiscUtilMiscTab=[GT++] Items
+itemGroup.MiscUtilCombatTab=[GT++] Combat
+itemGroup.MiscUtilToolsTab=[GT++] Tools
+itemGroup.MiscUtilMachineTab=[GT++] Machines
+itemGroup.MiscUtilOtherTab=[GT++] Items II
+itemGroup.MiscUtilBOP=[GT++] Biomes O'Plenty Additions
+
+//Debug
+item.AAA_Broken.name=[Non-existent Item] Report This Recipe On Github, Please.
+item.itemBedLocator_Base.name=Bed Locator [NBT Test]
+item.itemBaseItemWithCharge.name=Base Chargeable Item
+item.miscutils_itemDebugShapeSpawner.name=[Debug] Shapes
+
+//Fluids
+tile.fluidSludge.name=Stagnant Waste Water
+tile.fluidSludge.0.name=Stagnant Waste Water
+
+//Death Messages
+death.attack.plasmabolt=%s died by burning hot plasma.
+death.attack.plasmabolt.player=%1$s was killed by %2$s using plasma.
+death.attack.gtpp.grinder=%s was ground into nothingness by an IsaMill.
+
+//Batch mode chat message
+misc.BatchModeTextOn=Batch recipes (ME output bus recommended, will void excess outputs!)
+misc.BatchModeTextOff=Don't batch recipes
+
+//Alternative Materials
+item.itemPlateBatteryAlloy.name=Plate of Battery Alloy
+item.itemIngotBatteryAlloy.name=Ingot of Battery Alloy
+item.itemStickyRubber.name=Gumlet of Sticky Rubber
+
+//Unused Fuel rods
+item.itemFuelRod_Empty.name=Empty Fuel Rod
+item.itemFuelRod_Thorium.name=Thorium Fuel Rod
+item.itemFuelRod_Uranium.name=Uranium Fuel Rod
+item.itemFuelRod_Plutonium.name=Plutonium Fuel Rod
+
+//Entities
+entity.constructStaballoy.name=Staballoy Construct
+entity.sickBlaze.name=Infected Zealot
+
+//Tile Entities
+tile.blockToolBuilder.name=GregTech Tool Constructor
+tile.blockEggBox.name=Egg Box
+tile.blockCircuitProgrammer.name=Circuit Programmer
+tile.blockDecayablesChest.name=Lead Lined Box
+tile.blockVolumetricFlaskSetter.name=Volumetric Flask Configurator
+tile.blockSuperLight.name=Shining Star
+tile.blockPestKiller.name=Pest Killer
+tile.blockSuperJukebox.name=Sir Mixalot [Jukebox]
+
+//Tools
+item.itemBufferCore.name=Energy Core
+item.itemStaballoyPickaxe.name=Tunnel Digger
+item.itemStaballoyAxe.name=Tree Feller
+item.itemSandstoneHammer.name=Cobblestone Breaker
+
+# Tooltips
+GTPP.machines.chisel_slot.tooltip=Target Slot
+GTPP.machines.chisel_slot.tooltip.1=§7Put chiseled item to specify output
+GTPP.core.GT_Tooltip=Added by: §2Alkalus §7- §c[GT++]
+GTPP.core.GT_Tooltip_Builder=§2Alkalus §7- §c[GT++]
+GTPP.core.GT_Tooltip_Radioactive=§7Warning: §aRadioactive! §6 Avoid direct handling without hazmat protection.
+
+# RecipeMaps
+gtpp.recipe.cokeoven=Coke Oven
+gtpp.recipe.matterfab2=Matter Fabricator
+gtpp.recipe.rocketenginefuel=Rocket Engine Fuel
+gtpp.recipe.quantumforcesmelter=Quantum Force Transformer
+gtpp.recipe.chemicaldehydrator=Dehydrator
+gtpp.recipe.vacfurnace=Vacuum Furnace
+gtpp.recipe.alloyblastsmelter=Alloy Blast Smelter
+gtpp.recipe.lftr=Liquid Fluoride Thorium Reactor
+gtpp.recipe.nuclearsaltprocessingplant=Nuclear Salt Processing Plant
+gtpp.recipe.oremill=Milling
+gtpp.recipe.fissionfuel=Nuclear Fuel Processing
+gtpp.recipe.coldtrap=Cold Trap
+gtpp.recipe.reactorprocessingunit=Reactor Processing Unit
+gtpp.recipe.simplewasher=Simple Dust Washer
+gtpp.recipe.moleculartransformer=Molecular Transformer
+gtpp.recipe.fluidchemicaleactor=Chemical Plant
+gtpp.recipe.RTGgenerators=RTG
+gtpp.recipe.thermalgeneratorfuel=Thermal Boiler
+gtpp.recipe.solartower=Solar Tower
+gtpp.recipe.cyclotron=COMET - Compact Cyclotron
+gtpp.recipe.fishpond=Zhuhai - Fishing Port
+gtpp.recipe.cryogenicfreezer=Cryogenic Freezer
+gtpp.recipe.multicentrifuge=Multiblock Centrifuge
+gtpp.recipe.multielectro=Multiblock Electrolyzer
+gtpp.recipe.multimixer=Multiblock Mixer
+gtpp.recipe.multidehydrator=Multiblock Dehydrator
+gtpp.recipe.semifluidgeneratorfuels=Semifluid Generator Fuels
+gtpp.recipe.flotationcell=Flotation Cell
+gtpp.recipe.treefarm=Tree Growth Simulator
+
+# Recipe categories
+gtpp.recipe.category.abs_non_alloy_recipes=ABS Non-Alloy Recipes
+
+# NEI
+gtpp.nei.lftr.power=Power: %s EU/t per Dynamo
+gtpp.nei.lftr.dynamo=Dynamo: %s EU
+gtpp.nei.lftr.total=Total: %s EU
+gtpp.nei.milling.not_consumed=Does not always get consumed in the process
+gtpp.nei.chemplant.tier.1=Bronze
+gtpp.nei.chemplant.tier.2=Steel
+gtpp.nei.chemplant.tier.3=Aluminium
+gtpp.nei.chemplant.tier.4=Stainless Steel
+gtpp.nei.chemplant.tier.5=Titanium
+gtpp.nei.chemplant.tier.6=Tungsten Steel
+gtpp.nei.chemplant.tier.7=Laurenium
+gtpp.nei.chemplant.tier.8=Botmium
+gtpp.nei.rtg.days=Fuel Value: %s Minecraft Days
+gtpp.nei.solar_tower.1=Solar Heater rings boost tier
+gtpp.nei.solar_tower.2=R1:T1, R2:T2, R3:T4, R4:T8, R5:T16
+gtpp.nei.solar_tower.3=Input Amount = 1000 x T
+gtpp.nei.tgs.1=The sapling is not consumed.
+gtpp.nei.tgs.2=If %s is provided,
+gtpp.nei.tgs.3=Saplings are made instead.
+gtpp.nei.tgs.sapling=Outputted if %s is provided
+
+gtpp.nei.tgs.tooltip.sapling=Place in machine controller slot
+gtpp.nei.tgs.tooltip.saw=Place in an input bus to harvest logs
+gtpp.nei.tgs.tooltip.needsSaw=Requires a Saw to harvest
+gtpp.nei.tgs.tooltip.cutter=Place in an input bus to harvest saplings
+gtpp.nei.tgs.tooltip.needsCutter=Requires a Branch Cutter to harvest
+gtpp.nei.tgs.tooltip.shears=Place in an input bus to harvest leaves
+gtpp.nei.tgs.tooltip.needsShears=Requires Shears to harvest
+gtpp.nei.tgs.tooltip.knife=Place in an input bus to harvest fruit
+gtpp.nei.tgs.tooltip.needsKnife=Requires a Knife to harvest
+gtpp.nei.tgs.tooltip.multiplier=Output multiplier:
+gtpp.nei.tgs.info-1=Output is further boosted
+gtpp.nei.tgs.info-2=by machine energy tier
+gtpp.nei.tgs.info-3=and tool type
+
+
+//Thermal Foundation Stuff
+item.MiscUtils.bucket.bucketPyrotheum.name=Blazing Pyrotheum Bucket
+item.MiscUtils.bucket.bucketCryotheum.name=Gelid Cryotheum Bucket
+item.MiscUtils.bucket.bucketEnder.name=Resonant Ender Bucket
+item.MiscUtils.material.dustPyrotheum.name=Pyrotheum Dust
+item.MiscUtils.material.dustCryotheum.name=Cryotheum Dust
+item.MiscUtils.material.rodBlizz.name=Blizz Rod
+item.MiscUtils.material.dustBlizz.name=Blizz Powder
+
+//------------- 'miscutils' is Case Sensitive Here, unsure why
+tile.miscutils.fluid.pyrotheum.name=Blazing Pyrotheum
+tile.miscutils.fluid.cryotheum.name=Gelid Cryotheum
+tile.miscutils.fluid.ender.name=Resonant Ender
+//--------------
+
+//Forestry Stuff
+item.frameAccelerated.name=Accelerated Frame
+item.frameVoid.name=Void Frame
+item.frameMutagenic.name=Mutagenic Frame
+item.frameBusy.name=Working Frame
+item.frameChocolate.name=Chocolate Frame
+item.frameRestraint.name=Restraining Frame
+item.frameSoul.name=Soul Frame
+item.frameHealing.name=Healing Frame
+item.frameNova.name=Nova Frame
+item.frameArborists.name=Arborist Frame
+item.frameDecaying.name=Decaying Frame
+item.frameSlowing.name=Slowing Frame
+item.frameStabilizing.name=Stabilizing Frame
+item.frameUseless.name=Useless Frame
+
+//IC2 stuff
+item.itemEnergeticRotorBlade.name=Energetic Alloy Rotor Blade
+item.itemTungstenSteelRotorBlade.name=TungstenSteel Rotor Blade
+item.itemVibrantRotorBlade.name=Vibrant Alloy Rotor Blade
+item.itemIridiumRotorBlade.name=Iridium Rotor Blade
+item.itemEnergeticShaft.name=Energetic Alloy Shaft
+item.itemTungstenSteelShaft.name=TungstenSteel Shaft
+item.itemVibrantShaft.name=Vibrant Alloy Shaft
+item.itemIridiumShaft.name=Iridium Shaft
+item.itemMagnaliumRotorBlade.name=Magnalium Rotor Blade
+item.itemUltimetRotorBlade.name=Ultimet Blade
+item.itemMagnaliumShaft.name=Magnalium Shaft
+item.itemUltimetShaft.name=Ultimet Shaft
+
+
+//Misc Items
+item.itemPLACEHOLDER_Circuit.name=Quark Manipulator (UV)
+item.itemPlateEnrichedSoularium.name=Enriched Soularium Plate
+item.itemHeliumBlob.name=Mysterious Hydrogen Substance
+item.itemAlkalusDisk.name=Alkalus Disk
+
+//Misc Blocks
+tile.blockCompressedObsidian.0.name=Compressed Obsidian (9)
+tile.blockCompressedObsidian.1.name=Double Compressed Obsidian (81)
+tile.blockCompressedObsidian.2.name=Triple Compressed Obsidian (729)
+tile.blockCompressedObsidian.3.name=Quadruple Compressed Obsidian (6561)
+tile.blockCompressedObsidian.4.name=Quintuple Compressed Obsidian (59049)
+tile.blockCompressedObsidian.5.name=Inverted Obsidian
+tile.blockCompressedObsidian.6.name=Compressed Glowstone (9)
+tile.blockCompressedObsidian.7.name=Double Compressed Glowstone (81)
+tile.blockCompressedObsidian.8.name=Triple Compressed Glowstone (729)
+tile.blockCompressedObsidian.9.name=Quadruple Compressed Glowstone (6561)
+tile.blockCompressedObsidian.10.name=Quintuple Compressed Glowstone (59049)
+tile.blockNet.name=Net
+
+
+//GT++ Items
+
+//Meta Tool
+MU-metaitem.01.0.name=MU-metaitem.01.0.name
+
+//Cells
+item.SulfurDioxide.name=High Quality Sulfur Dioxide Cell
+item.mobessence.name=Mob Essence Cell
+item.Fertiliser.name=Fertiliser Cell
+item.UN32Fertiliser.name=UN-32 Fertiliser Cell
+item.UN18Fertiliser.name=UN-18 Fertiliser Cell
+item.RaisinJuice.name=Raisin Juice Cell
+item.BerylliumHydroxide.name=Beryllium Hydroxide Cell
+item.AmmoniumBifluoride.name=Ammonium Bifluoride Cell
+item.Hydroxide.name=Hydroxide Cell
+item.Ammonium.name=Ammonium Cell
+item.AmmoniumTetrafluoroberyllate.name=Ammonium Tetrafluoroberyllate Cell
+
+//Resources
+item.itemCoalCoke.name=Coking Coal
+item.itemHydrogenBlob.name=Mysterious Hydrogen Blob
+
+//Normal Items
+item.itemSimpleFiremaker.name=Basic Firemaker
+item.itemFiber.name=Plant Fiber
+item.itemRope.name=Rope
+item.backpackRed.name=Red Backpack
+item.backpackGreen.name=Green Backpack
+item.backpackBlue.name=Blue Backpack
+item.backpackYellow.name=Yellow Backpack
+item.backpackPurple.name=Purple Backpack
+item.backpackCyan.name=Cyan Backpack
+item.backpackMaroon.name=Maroon Backpack
+item.backpackOlive.name=Olive Backpack
+item.backpackDarkGreen.name=Dark Green Backpack
+item.backpackDarkPurple.name=Dark Purple Backpack
+item.backpackTeal.name=Teal Backpack
+item.backpackNavy.name=Navy Backpack
+item.backpackSilver.name=Silver Backpack
+item.backpackGray.name=Gray Backpack
+item.backpackBlack.name=Black Backpack
+item.backpackWhite.name=White Backpack
+item.itemBlueprint.name=Blueprint [I am useless]
+item.itemBlueprint.tooltip.0=Technical Document No. %d
+item.itemBlueprint.tooltip.1=Currently holding a blueprint for %s
+item.itemBlueprint.tooltip.2=Currently not holding a blueprint for anything.
+item.itemGemShards.0.name=Diamond Shards
+item.itemGemShards.1.name=Emerald Shards
+item.itemGemShards.2.name=Ruby Shards
+item.itemGemShards.3.name=Sapphire Shards
+item.itemGemShards.tooltip=Diamond Shards
+item.itemHalfCompleteCasings.name=Half Complete Casing
+item.itemSulfuricPotion.name=Throwable Vial of Sulfuric Acid
+item.itemHydrofluoricPotion.name=Throwable Vial of Hydrofluoric Acid
+item.itemBaseItemHotFood.tooltip.0=§7Warning: §cVery hot!§7 Avoid direct handling..
+item.itemBaseItemHotFood.tooltip.1=This food has %d seconds left, until it is cool.
+item.itemBoilerChassis.name=Advanced Boiler Chassis [Tier %d]
+item.itemDehydratorCoilWire.name=Coil Wire [%s]
+item.itemDehydratorCoil.name=Dehydrator Coil [%s]
+item.itemLavaFilter.name=Lava Filter
+item.itemLavaFilter.tooltip=Filters Lava within a Thermal Boiler.
+item.itemGrindleTablet.name=Grindle
+item.itemGrindleTablet.tooltip=Used to read data from DataSticks & DataOrbs.
+item.itemDragonJar.0.name=Dragon Capture Jar
+item.itemDragonJar.0.tooltip=Does not contain anything.
+item.itemDragonJar.1.name=Captured Dragon Jar
+item.itemDragonJar.1.tooltip=Contains a %s.
+item.itemControlCore.name=Control Core [%s]
+item.itemControlCore.tooltip.0=Allows a Multiblock to function upto %s
+item.itemControlCore.tooltip.1=Required Tier is determined by the sum of the eu/t of all Energy Inputs
+item.itemControlCore.tooltip.2=Lower tiers may be used to underclock, which is useful in some situations
+item.thekeytothecity.tooltip.0=You feel like you're on top of the world.
+item.thekeytothecity.tooltip.1=Wear it around your neck like an amulet.
+
+//Conversion Dusts
+item.dustNeptunium238.name=Neptunium 238 Dust
+item.dustRadium226.name=Radium 226 Dust
+item.itemDustDecayedRadium226.name=Decayed Radium 226 Dust
+item.itemDustSmallDecayedRadium226.name=Small Decayed Radium 226 Dust
+item.itemDustTinyDecayedRadium226.name=Tiny Decayed Radium 226 Dust
+
+//Material Items
+item.itemDustGadolinium.name=Gadolinium Dust
+item.itemDustSmallGadolinium.name=Small Pile of Gadolinium Dust
+item.itemDustTinyGadolinium.name=Tiny Pile of Gadolinium Dust
+item.itemDustYtterbium.name=Ytterbium Dust
+item.itemDustSmallYtterbium.name=Small Pile of Ytterbium Dust
+item.itemDustTinyYtterbium.name=Tiny Pile of Ytterbium Dust
+item.itemDustSamarium.name=Samarium Dust
+item.itemDustSmallSamarium.name=Small Pile of Samarium Dust
+item.itemDustTinySamarium.name=Tiny Pile of Samarium Dust
+item.itemDustLanthanum.name=Lanthanum Dust
+item.itemDustSmallLanthanum.name=Small Pile of Lanthanum Dust
+item.itemDustTinyLanthanum.name=Tiny Pile of Lanthanum Dust
+item.itemCellNeon.name=Neon Cell
+item.itemCellGermanium.name=Germanium Cell
+item.itemCellSelenium.name=Selenium Cell
+item.itemCellBromine.name=Bromine Cell
+item.itemCellKrypton.name=Krypton Cell
+item.itemCellZirconium.name=Zirconium Cell
+item.itemCellTechnetium.name=Technetium Cell
+item.itemCellRuthenium.name=Ruthenium Cell
+item.itemCellRhodium.name=Rhodium Cell
+item.itemCellIodine.name=Iodine Cell
+item.itemCellXenon.name=Xenon Cell
+item.itemCellHafnium.name=Hafnium Cell
+item.itemCellRhenium.name=Rhenium Cell
+item.itemCellThallium.name=Thallium Cell
+item.itemCellPolonium.name=Polonium Cell
+item.itemCellAstatine.name=Astatine Cell
+item.itemCellFrancium.name=Francium Cell
+item.itemCellRadium.name=Radium Cell
+item.itemCellActinium.name=Actinium Cell
+item.itemCellProtactinium.name=Protactinium Cell
+item.itemCellNeptunium.name=Neptunium Cell
+item.itemCellCurium.name=Curium Cell
+item.itemCellBerkelium.name=Berkelium Cell
+item.itemCellCalifornium.name=Californium Cell
+item.itemCellEinsteinium.name=Einsteinium Cell
+item.itemCellFermium.name=Fermium Cell
+item.itemCellRefinedTrinium.name=Refined Trinium Cell
+item.itemIngotSelenium.name=Selenium Ingot
+item.itemDustSelenium.name=Selenium Dust
+item.itemDustTinySelenium.name=Tiny Pile of Selenium Dust
+item.itemDustSmallSelenium.name=Small Pile of Selenium Dust
+item.itemNuggetSelenium.name=Selenium Nugget
+item.itemPlateSelenium.name=Selenium Plate
+item.itemPlateDoubleSelenium.name=Double Selenium Plate
+item.itemBoltSelenium.name=Selenium Bolt
+item.itemRodSelenium.name=Selenium Rod
+item.itemRodLongSelenium.name=Long Selenium Rod
+item.itemRingSelenium.name=Selenium Ring
+item.itemScrewSelenium.name=Selenium Screw
+item.itemRotorSelenium.name=Selenium Rotor
+item.itemGearSelenium.name=Selenium Gear
+item.itemCellUranium232.name=Uranium 232 Cell
+item.itemCellUranium233.name=Uranium 233 Cell
+item.itemCellThoriumTetrafluoride.name=Thorium Tetrafluoride Cell
+item.itemCellThoriumHexafluoride.name=Thorium Hexafluoride Cell
+item.itemCellUraniumTetrafluoride.name=Uranium Tetrafluoride Cell
+item.itemCellUraniumHexafluoride.name=Uranium Hexafluoride Cell
+item.itemCellZirconiumTetrafluoride.name=Zirconium Tetrafluoride Cell
+item.itemCellBerylliumFluoride.name=Beryllium Fluoride Cell
+item.itemCellLithiumFluoride.name=Lithium Fluoride Cell
+item.itemCellHydroxide.name=Hydroxide Cell
+item.itemCellAmmonium.name=Ammonium Cell
+item.itemCellAmmoniumBifluoride.name=Ammonium Bifluoride Cell
+item.itemCellBerylliumHydroxide.name=Beryllium Hydroxide Cell
+item.itemCellAmmoniumTetrafluoroberyllate.name=Ammonium Tetrafluoroberyllate Cell
+item.itemCellNeptuniumHexafluoride.name=Neptunium Hexafluoride Cell
+item.itemCellTechnetiumHexafluoride.name=Technetium Hexafluoride Cell
+item.itemCellSeleniumHexafluoride.name=Selenium Hexafluoride Cell
+item.itemCellEnergyCrystal.name=Energy Crystal Cell
+item.itemCellBloodSteel.name=Blood Steel Cell
+item.itemCellStaballoy.name=Staballoy Cell
+item.itemCellTantalloy60.name=Tantalloy-60 Cell
+item.itemCellTantalloy61.name=Tantalloy-61 Cell
+item.itemCellTumbaga.name=Tumbaga Cell
+item.itemCellPotin.name=Potin Cell
+item.itemCellInconel625.name=Inconel-625 Cell
+item.itemCellInconel690.name=Inconel-690 Cell
+item.itemCellInconel792.name=Inconel-792 Cell
+item.itemCellZeron100.name=Zeron-100 Cell
+item.itemCellMaragingSteel250.name=Maraging Steel 250 Cell
+item.itemCellMaragingSteel300.name=Maraging Steel 300 Cell
+item.itemCellMaragingSteel350.name=Maraging Steel 350 Cell
+item.itemCellStellite.name=Stellite Cell
+item.itemCellTalonite.name=Talonite Cell
+item.itemCellHastelloyW.name=Hastelloy-W Cell
+item.itemCellHastelloyX.name=Hastelloy-X Cell
+item.itemCellHastelloyN.name=Hastelloy-N Cell
+item.itemCellHastelloyC276.name=Hastelloy-C276 Cell
+item.itemCellIncoloy020.name=Incoloy-020 Cell
+item.itemCellIncoloyDS.name=Incoloy-DS Cell
+item.itemCellIncoloyMA956.name=Incoloy-MA956 Cell
+item.itemCellTungstenCarbide.name=Tungsten Carbide Cell
+item.itemCellSiliconCarbide.name=Silicon Carbide Cell
+item.itemCellTantalumCarbide.name=Tantalum Carbide Cell
+item.itemCellZirconiumCarbide.name=Zirconium Carbide Cell
+item.itemCellNiobiumCarbide.name=Niobium Carbide Cell
+item.itemCellGrisium.name=Grisium Cell
+item.itemCellEglinSteelBaseCompound.name=Eglin Steel Base Compound Cell
+item.itemCellEglinSteel.name=Eglin Steel Cell
+item.itemCellHG1223.name=HG-1223 Cell
+item.itemCellTriniumTitaniumAlloy.name=Trinium Titanium Alloy Cell
+item.itemCellTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Cell
+item.itemCellTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Cell
+item.itemCellQuantum.name=Quantum Cell
+item.itemIngotBromine.name=Bromine Ingot
+item.itemDustBromine.name=Bromine Dust
+item.itemDustTinyBromine.name=Tiny Pile of Bromine Dust
+item.itemDustSmallBromine.name=Small Pile of Bromine Dust
+item.itemNuggetBromine.name=Bromine Nugget
+item.itemPlateBromine.name=Bromine Plate
+item.itemPlateDoubleBromine.name=Double Bromine Plate
+item.itemIngotStrontium.name=Strontium Ingot
+item.itemDustStrontium.name=Strontium Dust
+item.itemDustTinyStrontium.name=Tiny Pile of Strontium Dust
+item.itemDustSmallStrontium.name=Small Pile of Strontium Dust
+item.itemNuggetStrontium.name=Strontium Nugget
+item.itemPlateStrontium.name=Strontium Plate
+item.itemPlateDoubleStrontium.name=Double Strontium Plate
+item.itemBoltStrontium.name=Strontium Bolt
+item.itemRodStrontium.name=Strontium Rod
+item.itemRodLongStrontium.name=Long Strontium Rod
+item.itemRingStrontium.name=Strontium Ring
+item.itemScrewStrontium.name=Strontium Screw
+item.itemRotorStrontium.name=Strontium Rotor
+item.itemGearStrontium.name=Strontium Gear
+item.itemIngotZirconium.name=Zirconium Ingot
+item.itemDustZirconium.name=Zirconium Dust
+item.itemDustTinyZirconium.name=Tiny Pile of Zirconium Dust
+item.itemDustSmallZirconium.name=Small Pile of Zirconium Dust
+item.itemNuggetZirconium.name=Zirconium Nugget
+item.itemPlateZirconium.name=Zirconium Plate
+item.itemPlateDoubleZirconium.name=Double Zirconium Plate
+item.itemBoltZirconium.name=Zirconium Bolt
+item.itemRodZirconium.name=Zirconium Rod
+item.itemRodLongZirconium.name=Long Zirconium Rod
+item.itemRingZirconium.name=Zirconium Ring
+item.itemScrewZirconium.name=Zirconium Screw
+item.itemRotorZirconium.name=Zirconium Rotor
+item.itemGearZirconium.name=Zirconium Gear
+item.itemIngotRuthenium.name=Ruthenium Ingot
+item.itemDustRuthenium.name=Ruthenium Dust
+item.itemDustTinyRuthenium.name=Tiny Pile of Ruthenium Dust
+item.itemDustSmallRuthenium.name=Small Pile of Ruthenium Dust
+item.itemNuggetRuthenium.name=Ruthenium Nugget
+item.itemPlateRuthenium.name=Ruthenium Plate
+item.itemPlateDoubleRuthenium.name=Double Ruthenium Plate
+item.itemBoltRuthenium.name=Ruthenium Bolt
+item.itemRodRuthenium.name=Ruthenium Rod
+item.itemRodLongRuthenium.name=Long Ruthenium Rod
+item.itemRingRuthenium.name=Ruthenium Ring
+item.itemScrewRuthenium.name=Ruthenium Screw
+item.itemRotorRuthenium.name=Ruthenium Rotor
+item.itemGearRuthenium.name=Ruthenium Gear
+item.itemIngotIodine.name=Iodine Ingot
+item.itemDustIodine.name=Iodine Dust
+item.itemDustTinyIodine.name=Tiny Pile of Iodine Dust
+item.itemDustSmallIodine.name=Small Pile of Iodine Dust
+item.itemNuggetIodine.name=Iodine Nugget
+item.itemPlateIodine.name=Iodine Plate
+item.itemPlateDoubleIodine.name=Double Iodine Plate
+item.itemBoltIodine.name=Iodine Bolt
+item.itemRodIodine.name=Iodine Rod
+item.itemRodLongIodine.name=Long Iodine Rod
+item.itemRingIodine.name=Iodine Ring
+item.itemScrewIodine.name=Iodine Screw
+item.itemRotorIodine.name=Iodine Rotor
+item.itemGearIodine.name=Iodine Gear
+item.itemIngotHafnium.name=Hafnium Ingot
+item.itemDustHafnium.name=Hafnium Dust
+item.itemDustTinyHafnium.name=Tiny Pile of Hafnium Dust
+item.itemDustSmallHafnium.name=Small Pile of Hafnium Dust
+item.itemNuggetHafnium.name=Hafnium Nugget
+item.itemPlateHafnium.name=Hafnium Plate
+item.itemPlateDoubleHafnium.name=Double Hafnium Plate
+item.itemBoltHafnium.name=Hafnium Bolt
+item.itemRodHafnium.name=Hafnium Rod
+item.itemRodLongHafnium.name=Long Hafnium Rod
+item.itemRingHafnium.name=Hafnium Ring
+item.itemScrewHafnium.name=Hafnium Screw
+item.itemRotorHafnium.name=Hafnium Rotor
+item.itemGearHafnium.name=Hafnium Gear
+item.itemIngotDysprosium.name=Dysprosium Ingot
+item.itemDustDysprosium.name=Dysprosium Dust
+item.itemDustTinyDysprosium.name=Tiny Pile of Dysprosium Dust
+item.itemDustSmallDysprosium.name=Small Pile of Dysprosium Dust
+item.itemNuggetDysprosium.name=Dysprosium Nugget
+item.itemPlateDysprosium.name=Dysprosium Plate
+item.itemPlateDoubleDysprosium.name=Double Dysprosium Plate
+item.itemBoltDysprosium.name=Dysprosium Bolt
+item.itemRodDysprosium.name=Dysprosium Rod
+item.itemRodLongDysprosium.name=Long Dysprosium Rod
+item.itemRingDysprosium.name=Dysprosium Ring
+item.itemScrewDysprosium.name=Dysprosium Screw
+item.itemRotorDysprosium.name=Dysprosium Rotor
+item.itemGearDysprosium.name=Dysprosium Gear
+item.itemIngotTellurium.name=Tellurium Ingot
+item.itemDustTellurium.name=Tellurium Dust
+item.itemDustTinyTellurium.name=Tiny Pile of Tellurium Dust
+item.itemDustSmallTellurium.name=Small Pile of Tellurium Dust
+item.itemNuggetTellurium.name=Tellurium Nugget
+item.itemPlateTellurium.name=Tellurium Plate
+item.itemPlateDoubleTellurium.name=Double Tellurium Plate
+item.itemBoltTellurium.name=Tellurium Bolt
+item.itemRodTellurium.name=Tellurium Rod
+item.itemRodLongTellurium.name=Long Tellurium Rod
+item.itemRingTellurium.name=Tellurium Ring
+item.itemScrewTellurium.name=Tellurium Screw
+item.itemRotorTellurium.name=Tellurium Rotor
+item.itemGearTellurium.name=Tellurium Gear
+item.itemIngotRhodium.name=Rhodium Ingot
+item.itemDustRhodium.name=Rhodium Dust
+item.itemDustTinyRhodium.name=Tiny Pile of Rhodium Dust
+item.itemDustSmallRhodium.name=Small Pile of Rhodium Dust
+item.itemNuggetRhodium.name=Rhodium Nugget
+item.itemPlateRhodium.name=Rhodium Plate
+item.itemPlateDoubleRhodium.name=Double Rhodium Plate
+item.itemBoltRhodium.name=Rhodium Bolt
+item.itemRodRhodium.name=Rhodium Rod
+item.itemRodLongRhodium.name=Long Rhodium Rod
+item.itemRingRhodium.name=Rhodium Ring
+item.itemScrewRhodium.name=Rhodium Screw
+item.itemRotorRhodium.name=Rhodium Rotor
+item.itemGearRhodium.name=Rhodium Gear
+item.itemIngotRhenium.name=Rhenium Ingot
+item.itemDustRhenium.name=Rhenium Dust
+item.itemDustTinyRhenium.name=Tiny Pile of Rhenium Dust
+item.itemDustSmallRhenium.name=Small Pile of Rhenium Dust
+item.itemNuggetRhenium.name=Rhenium Nugget
+item.itemPlateRhenium.name=Rhenium Plate
+item.itemPlateDoubleRhenium.name=Double Rhenium Plate
+item.itemBoltRhenium.name=Rhenium Bolt
+item.itemRodRhenium.name=Rhenium Rod
+item.itemRodLongRhenium.name=Long Rhenium Rod
+item.itemRingRhenium.name=Rhenium Ring
+item.itemScrewRhenium.name=Rhenium Screw
+item.itemRotorRhenium.name=Rhenium Rotor
+item.itemGearRhenium.name=Rhenium Gear
+item.itemIngotThallium.name=Thallium Ingot
+item.itemDustThallium.name=Thallium Dust
+item.itemDustTinyThallium.name=Tiny Pile of Thallium Dust
+item.itemDustSmallThallium.name=Small Pile of Thallium Dust
+item.itemNuggetThallium.name=Thallium Nugget
+item.itemPlateThallium.name=Thallium Plate
+item.itemPlateDoubleThallium.name=Double Thallium Plate
+item.itemBoltThallium.name=Thallium Bolt
+item.itemRodThallium.name=Thallium Rod
+item.itemRodLongThallium.name=Long Thallium Rod
+item.itemRingThallium.name=Thallium Ring
+item.itemScrewThallium.name=Thallium Screw
+item.itemRotorThallium.name=Thallium Rotor
+item.itemGearThallium.name=Thallium Gear
+item.itemIngotTechnetium.name=Technetium Ingot
+item.itemDustTechnetium.name=Technetium Dust
+item.itemDustTinyTechnetium.name=Tiny Pile of Technetium Dust
+item.itemDustSmallTechnetium.name=Small Pile of Technetium Dust
+item.itemNuggetTechnetium.name=Technetium Nugget
+item.itemPlateTechnetium.name=Technetium Plate
+item.itemPlateDoubleTechnetium.name=Double Technetium Plate
+item.itemIngotPolonium.name=Polonium Ingot
+item.itemDustPolonium.name=Polonium Dust
+item.itemDustTinyPolonium.name=Tiny Pile of Polonium Dust
+item.itemDustSmallPolonium.name=Small Pile of Polonium Dust
+item.itemNuggetPolonium.name=Polonium Nugget
+item.itemPlatePolonium.name=Polonium Plate
+item.itemPlateDoublePolonium.name=Double Polonium Plate
+item.itemIngotAstatine.name=Astatine Ingot
+item.itemDustAstatine.name=Astatine Dust
+item.itemDustTinyAstatine.name=Tiny Pile of Astatine Dust
+item.itemDustSmallAstatine.name=Small Pile of Astatine Dust
+item.itemNuggetAstatine.name=Astatine Nugget
+item.itemPlateAstatine.name=Astatine Plate
+item.itemPlateDoubleAstatine.name=Double Astatine Plate
+item.itemIngotFrancium.name=Francium Ingot
+item.itemDustFrancium.name=Francium Dust
+item.itemDustTinyFrancium.name=Tiny Pile of Francium Dust
+item.itemDustSmallFrancium.name=Small Pile of Francium Dust
+item.itemNuggetFrancium.name=Francium Nugget
+item.itemPlateFrancium.name=Francium Plate
+item.itemPlateDoubleFrancium.name=Double Francium Plate
+item.itemIngotRadium.name=Radium Ingot
+item.itemDustRadium.name=Radium Dust
+item.itemDustTinyRadium.name=Tiny Pile of Radium Dust
+item.itemDustSmallRadium.name=Small Pile of Radium Dust
+item.itemNuggetRadium.name=Radium Nugget
+item.itemPlateRadium.name=Radium Plate
+item.itemPlateDoubleRadium.name=Double Radium Plate
+item.itemIngotActinium.name=Actinium Ingot
+item.itemDustActinium.name=Actinium Dust
+item.itemDustTinyActinium.name=Tiny Pile of Actinium Dust
+item.itemDustSmallActinium.name=Small Pile of Actinium Dust
+item.itemNuggetActinium.name=Actinium Nugget
+item.itemPlateActinium.name=Actinium Plate
+item.itemPlateDoubleActinium.name=Double Actinium Plate
+item.itemIngotProtactinium.name=Protactinium Ingot
+item.itemDustProtactinium.name=Protactinium Dust
+item.itemDustTinyProtactinium.name=Tiny Pile of Protactinium Dust
+item.itemDustSmallProtactinium.name=Small Pile of Protactinium Dust
+item.itemNuggetProtactinium.name=Protactinium Nugget
+item.itemPlateProtactinium.name=Protactinium Plate
+item.itemPlateDoubleProtactinium.name=Double Protactinium Plate
+item.itemIngotNeptunium.name=Neptunium Ingot
+item.itemDustNeptunium.name=Neptunium Dust
+item.itemDustTinyNeptunium.name=Tiny Pile of Neptunium Dust
+item.itemDustSmallNeptunium.name=Small Pile of Neptunium Dust
+item.itemNuggetNeptunium.name=Neptunium Nugget
+item.itemPlateNeptunium.name=Neptunium Plate
+item.itemPlateDoubleNeptunium.name=Double Neptunium Plate
+item.itemIngotCurium.name=Curium Ingot
+item.itemDustCurium.name=Curium Dust
+item.itemDustTinyCurium.name=Tiny Pile of Curium Dust
+item.itemDustSmallCurium.name=Small Pile of Curium Dust
+item.itemNuggetCurium.name=Curium Nugget
+item.itemPlateCurium.name=Curium Plate
+item.itemPlateDoubleCurium.name=Double Curium Plate
+item.itemIngotBerkelium.name=Berkelium Ingot
+item.itemDustBerkelium.name=Berkelium Dust
+item.itemDustTinyBerkelium.name=Tiny Pile of Berkelium Dust
+item.itemDustSmallBerkelium.name=Small Pile of Berkelium Dust
+item.itemNuggetBerkelium.name=Berkelium Nugget
+item.itemPlateBerkelium.name=Berkelium Plate
+item.itemPlateDoubleBerkelium.name=Double Berkelium Plate
+item.itemIngotCalifornium.name=Californium Ingot
+item.itemDustCalifornium.name=Californium Dust
+item.itemDustTinyCalifornium.name=Tiny Pile of Californium Dust
+item.itemDustSmallCalifornium.name=Small Pile of Californium Dust
+item.itemNuggetCalifornium.name=Californium Nugget
+item.itemPlateCalifornium.name=Californium Plate
+item.itemPlateDoubleCalifornium.name=Double Californium Plate
+item.itemDustEinsteinium.name=Einsteinium Dust
+item.itemDustTinyEinsteinium.name=Tiny Pile of Einsteinium Dust
+item.itemDustSmallEinsteinium.name=Small Pile of Einsteinium Dust
+item.itemNuggetEinsteinium.name=Einsteinium Nugget
+item.itemPlateEinsteinium.name=Einsteinium Plate
+item.itemPlateDoubleEinsteinium.name=Double Einsteinium Plate
+item.itemIngotFermium.name=Fermium Ingot
+item.itemDustFermium.name=Fermium Dust
+item.itemDustTinyFermium.name=Tiny Pile of Fermium Dust
+item.itemDustSmallFermium.name=Small Pile of Fermium Dust
+item.itemNuggetFermium.name=Fermium Nugget
+item.itemPlateFermium.name=Fermium Plate
+item.itemPlateDoubleFermium.name=Double Fermium Plate
+item.itemIngotLithium7.name=Lithium 7 Ingot
+item.itemDustLithium7.name=Lithium 7 Dust
+item.itemDustTinyLithium7.name=Tiny Pile of Lithium 7 Dust
+item.itemDustSmallLithium7.name=Small Pile of Lithium 7 Dust
+item.itemNuggetLithium7.name=Lithium 7 Nugget
+item.itemPlateLithium7.name=Lithium 7 Plate
+item.itemPlateDoubleLithium7.name=Double Lithium 7 Plate
+item.itemIngotThorium232.name=Thorium 232 Ingot
+item.itemDustThorium232.name=Thorium 232 Dust
+item.itemDustTinyThorium232.name=Tiny Pile of Thorium 232 Dust
+item.itemDustSmallThorium232.name=Small Pile of Thorium 232 Dust
+item.itemNuggetThorium232.name=Thorium 232 Nugget
+item.itemPlateThorium232.name=Thorium 232 Plate
+item.itemPlateDoubleThorium232.name=Double Thorium 232 Plate
+item.itemIngotUranium232.name=Uranium 232 Ingot
+item.itemDustUranium232.name=Uranium 232 Dust
+item.itemDustTinyUranium232.name=Tiny Pile of Uranium 232 Dust
+item.itemDustSmallUranium232.name=Small Pile of Uranium 232 Dust
+item.itemNuggetUranium232.name=Uranium 232 Nugget
+item.itemPlateUranium232.name=Uranium 232 Plate
+item.itemRodUranium232.name=Uranium 232 Rod
+item.itemRodLongUranium232.name=Long Uranium 232 Rod
+item.itemIngotUranium233.name=Uranium 233 Ingot
+item.itemDustUranium233.name=Uranium 233 Dust
+item.itemDustTinyUranium233.name=Tiny Pile of Uranium 233 Dust
+item.itemDustSmallUranium233.name=Small Pile of Uranium 233 Dust
+item.itemNuggetUranium233.name=Uranium 233 Nugget
+item.itemPlateUranium233.name=Uranium 233 Plate
+item.itemRodUranium233.name=Uranium 233 Rod
+item.itemRodLongUranium233.name=Long Uranium 233 Rod
+item.itemIngotPlutonium238.name=Plutonium 238 Ingot
+item.itemDustPlutonium238.name=Plutonium 238 Dust
+item.itemDustTinyPlutonium238.name=Tiny Pile of Plutonium 238 Dust
+item.itemDustSmallPlutonium238.name=Small Pile of Plutonium 238 Dust
+item.itemNuggetPlutonium238.name=Plutonium 238 Nugget
+item.itemPlatePlutonium238.name=Plutonium 238 Plate
+item.itemPlateDoublePlutonium238.name=Double Plutonium 238 Plate
+item.itemIngotStrontium90.name=Strontium 90 Ingot
+item.itemDustStrontium90.name=Strontium 90 Dust
+item.itemDustTinyStrontium90.name=Tiny Pile of Strontium 90 Dust
+item.itemDustSmallStrontium90.name=Small Pile of Strontium 90 Dust
+item.itemNuggetStrontium90.name=Strontium 90 Nugget
+item.itemPlateStrontium90.name=Strontium 90 Plate
+item.itemPlateDoubleStrontium90.name=Double Strontium 90 Plate
+item.itemIngotPolonium210.name=Polonium 210 Ingot
+item.itemDustPolonium210.name=Polonium 210 Dust
+item.itemDustTinyPolonium210.name=Tiny Pile of Polonium 210 Dust
+item.itemDustSmallPolonium210.name=Small Pile of Polonium 210 Dust
+item.itemNuggetPolonium210.name=Polonium 210 Nugget
+item.itemPlatePolonium210.name=Polonium 210 Plate
+item.itemPlateDoublePolonium210.name=Double Polonium 210 Plate
+item.itemIngotAmericium241.name=Americium 241 Ingot
+item.itemDustAmericium241.name=Americium 241 Dust
+item.itemDustTinyAmericium241.name=Tiny Pile of Americium 241 Dust
+item.itemDustSmallAmericium241.name=Small Pile of Americium 241 Dust
+item.itemNuggetAmericium241.name=Americium 241 Nugget
+item.itemPlateAmericium241.name=Americium 241 Plate
+item.itemPlateDoubleAmericium241.name=Double Americium 241 Plate
+item.itemIngotSiliconCarbide.name=Silicon Carbide Ingot
+item.itemDustSiliconCarbide.name=Silicon Carbide Dust
+item.itemDustTinySiliconCarbide.name=Tiny Pile of Silicon Carbide Dust
+item.itemDustSmallSiliconCarbide.name=Small Pile of Silicon Carbide Dust
+item.itemNuggetSiliconCarbide.name=Silicon Carbide Nugget
+item.itemPlateSiliconCarbide.name=Silicon Carbide Plate
+item.itemPlateDoubleSiliconCarbide.name=Double Silicon Carbide Plate
+item.itemBoltSiliconCarbide.name=Silicon Carbide Bolt
+item.itemRodSiliconCarbide.name=Silicon Carbide Rod
+item.itemRodLongSiliconCarbide.name=Long Silicon Carbide Rod
+item.itemRingSiliconCarbide.name=Silicon Carbide Ring
+item.itemScrewSiliconCarbide.name=Silicon Carbide Screw
+item.itemRotorSiliconCarbide.name=Silicon Carbide Rotor
+item.itemGearSiliconCarbide.name=Silicon Carbide Gear
+item.itemIngotZirconiumCarbide.name=Zirconium Carbide Ingot
+item.itemHotIngotZirconiumCarbide.name=Hot Zirconium Carbide Ingot
+item.itemDustZirconiumCarbide.name=Zirconium Carbide Dust
+item.itemDustTinyZirconiumCarbide.name=Tiny Pile of Zirconium Carbide Dust
+item.itemDustSmallZirconiumCarbide.name=Small Pile of Zirconium Carbide Dust
+item.itemNuggetZirconiumCarbide.name=Zirconium Carbide Nugget
+item.itemPlateZirconiumCarbide.name=Zirconium Carbide Plate
+item.itemPlateDoubleZirconiumCarbide.name=Double Zirconium Carbide Plate
+item.itemBoltZirconiumCarbide.name=Zirconium Carbide Bolt
+item.itemRodZirconiumCarbide.name=Zirconium Carbide Rod
+item.itemRodLongZirconiumCarbide.name=Long Zirconium Carbide Rod
+item.itemRingZirconiumCarbide.name=Zirconium Carbide Ring
+item.itemScrewZirconiumCarbide.name=Zirconium Carbide Screw
+item.itemRotorZirconiumCarbide.name=Zirconium Carbide Rotor
+item.itemGearZirconiumCarbide.name=Zirconium Carbide Gear
+item.itemIngotTantalumCarbide.name=Tantalum Carbide Ingot
+item.itemHotIngotTantalumCarbide.name=Hot Tantalum Carbide Ingot
+item.itemDustTantalumCarbide.name=Tantalum Carbide Dust
+item.itemDustTinyTantalumCarbide.name=Tiny Pile of Tantalum Carbide Dust
+item.itemDustSmallTantalumCarbide.name=Small Pile of Tantalum Carbide Dust
+item.itemNuggetTantalumCarbide.name=Tantalum Carbide Nugget
+item.itemPlateTantalumCarbide.name=Tantalum Carbide Plate
+item.itemPlateDoubleTantalumCarbide.name=Double Tantalum Carbide Plate
+item.itemBoltTantalumCarbide.name=Tantalum Carbide Bolt
+item.itemRodTantalumCarbide.name=Tantalum Carbide Rod
+item.itemRodLongTantalumCarbide.name=Long Tantalum Carbide Rod
+item.itemRingTantalumCarbide.name=Tantalum Carbide Ring
+item.itemScrewTantalumCarbide.name=Tantalum Carbide Screw
+item.itemRotorTantalumCarbide.name=Tantalum Carbide Rotor
+item.itemGearTantalumCarbide.name=Tantalum Carbide Gear
+item.itemIngotNiobiumCarbide.name=Niobium Carbide Ingot
+item.itemHotIngotNiobiumCarbide.name=Hot Niobium Carbide Ingot
+item.itemDustNiobiumCarbide.name=Niobium Carbide Dust
+item.itemDustTinyNiobiumCarbide.name=Tiny Pile of Niobium Carbide Dust
+item.itemDustSmallNiobiumCarbide.name=Small Pile of Niobium Carbide Dust
+item.itemNuggetNiobiumCarbide.name=Niobium Carbide Nugget
+item.itemPlateNiobiumCarbide.name=Niobium Carbide Plate
+item.itemPlateDoubleNiobiumCarbide.name=Double Niobium Carbide Plate
+item.itemBoltNiobiumCarbide.name=Niobium Carbide Bolt
+item.itemRodNiobiumCarbide.name=Niobium Carbide Rod
+item.itemRodLongNiobiumCarbide.name=Long Niobium Carbide Rod
+item.itemRingNiobiumCarbide.name=Niobium Carbide Ring
+item.itemScrewNiobiumCarbide.name=Niobium Carbide Screw
+item.itemRotorNiobiumCarbide.name=Niobium Carbide Rotor
+item.itemGearNiobiumCarbide.name=Niobium Carbide Gear
+item.itemIngotBerylliumFluoride.name=Beryllium Fluoride Ingot
+item.itemDustBerylliumFluoride.name=Beryllium Fluoride Dust
+item.itemDustTinyBerylliumFluoride.name=Tiny Pile of Beryllium Fluoride Dust
+item.itemDustSmallBerylliumFluoride.name=Small Pile of Beryllium Fluoride Dust
+item.itemNuggetBerylliumFluoride.name=Beryllium Fluoride Nugget
+item.itemPlateBerylliumFluoride.name=Beryllium Fluoride Plate
+item.itemPlateDoubleBerylliumFluoride.name=Double Beryllium Fluoride Plate
+item.itemIngotLithiumFluoride.name=Lithium Fluoride Ingot
+item.itemDustLithiumFluoride.name=Lithium Fluoride Dust
+item.itemDustTinyLithiumFluoride.name=Tiny Pile of Lithium Fluoride Dust
+item.itemDustSmallLithiumFluoride.name=Small Pile of Lithium Fluoride Dust
+item.itemNuggetLithiumFluoride.name=Lithium Fluoride Nugget
+item.itemPlateLithiumFluoride.name=Lithium Fluoride Plate
+item.itemPlateDoubleLithiumFluoride.name=Double Lithium Fluoride Plate
+item.itemIngotThoriumTetrafluoride.name=Thorium Tetrafluoride Ingot
+item.itemDustThoriumTetrafluoride.name=Thorium Tetrafluoride Dust
+item.itemDustTinyThoriumTetrafluoride.name=Tiny Pile of Thorium Tetrafluoride Dust
+item.itemDustSmallThoriumTetrafluoride.name=Small Pile of Thorium Tetrafluoride Dust
+item.itemNuggetThoriumTetrafluoride.name=Thorium Tetrafluoride Nugget
+item.itemPlateThoriumTetrafluoride.name=Thorium Tetrafluoride Plate
+item.itemPlateDoubleThoriumTetrafluoride.name=Double Thorium Tetrafluoride Plate
+item.itemIngotThoriumHexafluoride.name=Thorium Hexafluoride Ingot
+item.itemDustThoriumHexafluoride.name=Thorium Hexafluoride Dust
+item.itemDustTinyThoriumHexafluoride.name=Tiny Pile of Thorium Hexafluoride Dust
+item.itemDustSmallThoriumHexafluoride.name=Small Pile of Thorium Hexafluoride Dust
+item.itemNuggetThoriumHexafluoride.name=Thorium Hexafluoride Nugget
+item.itemPlateThoriumHexafluoride.name=Thorium Hexafluoride Plate
+item.itemPlateDoubleThoriumHexafluoride.name=Double Thorium Hexafluoride Plate
+item.itemIngotUraniumTetrafluoride.name=Uranium Tetrafluoride Ingot
+item.itemDustUraniumTetrafluoride.name=Uranium Tetrafluoride Dust
+item.itemDustTinyUraniumTetrafluoride.name=Tiny Pile of Uranium Tetrafluoride Dust
+item.itemDustSmallUraniumTetrafluoride.name=Small Pile of Uranium Tetrafluoride Dust
+item.itemNuggetUraniumTetrafluoride.name=Uranium Tetrafluoride Nugget
+item.itemPlateUraniumTetrafluoride.name=Uranium Tetrafluoride Plate
+item.itemPlateDoubleUraniumTetrafluoride.name=Double Uranium Tetrafluoride Plate
+item.itemIngotUraniumHexafluoride.name=Uranium Hexafluoride Ingot
+item.itemDustUraniumHexafluoride.name=Uranium Hexafluoride Dust
+item.itemDustTinyUraniumHexafluoride.name=Tiny Pile of Uranium Hexafluoride Dust
+item.itemDustSmallUraniumHexafluoride.name=Small Pile of Uranium Hexafluoride Dust
+item.itemNuggetUraniumHexafluoride.name=Uranium Hexafluoride Nugget
+item.itemPlateUraniumHexafluoride.name=Uranium Hexafluoride Plate
+item.itemPlateDoubleUraniumHexafluoride.name=Double Uranium Hexafluoride Plate
+item.itemIngotZirconiumTetrafluoride.name=Zirconium Tetrafluoride Ingot
+item.itemDustZirconiumTetrafluoride.name=Zirconium Tetrafluoride Dust
+item.itemDustTinyZirconiumTetrafluoride.name=Tiny Pile of Zirconium Tetrafluoride Dust
+item.itemDustSmallZirconiumTetrafluoride.name=Small Pile of Zirconium Tetrafluoride Dust
+item.itemNuggetZirconiumTetrafluoride.name=Zirconium Tetrafluoride Nugget
+item.itemPlateZirconiumTetrafluoride.name=Zirconium Tetrafluoride Plate
+item.itemPlateDoubleZirconiumTetrafluoride.name=Double Zirconium Tetrafluoride Plate
+item.itemIngotNeptuniumHexafluoride.name=Neptunium Hexafluoride Ingot
+item.itemDustNeptuniumHexafluoride.name=Neptunium Hexafluoride Dust
+item.itemDustTinyNeptuniumHexafluoride.name=Tiny Pile of Neptunium Hexafluoride Dust
+item.itemDustSmallNeptuniumHexafluoride.name=Small Pile of Neptunium Hexafluoride Dust
+item.itemNuggetNeptuniumHexafluoride.name=Neptunium Hexafluoride Nugget
+item.itemPlateNeptuniumHexafluoride.name=Neptunium Hexafluoride Plate
+item.itemPlateDoubleNeptuniumHexafluoride.name=Double Neptunium Hexafluoride Plate
+item.itemIngotTechnetiumHexafluoride.name=Technetium Hexafluoride Ingot
+item.itemDustTechnetiumHexafluoride.name=Technetium Hexafluoride Dust
+item.itemDustTinyTechnetiumHexafluoride.name=Tiny Pile of Technetium Hexafluoride Dust
+item.itemDustSmallTechnetiumHexafluoride.name=Small Pile of Technetium Hexafluoride Dust
+item.itemNuggetTechnetiumHexafluoride.name=Technetium Hexafluoride Nugget
+item.itemPlateTechnetiumHexafluoride.name=Technetium Hexafluoride Plate
+item.itemPlateDoubleTechnetiumHexafluoride.name=Double Technetium Hexafluoride Plate
+item.itemIngotSeleniumHexafluoride.name=Selenium Hexafluoride Ingot
+item.itemDustSeleniumHexafluoride.name=Selenium Hexafluoride Dust
+item.itemDustTinySeleniumHexafluoride.name=Tiny Pile of Selenium Hexafluoride Dust
+item.itemDustSmallSeleniumHexafluoride.name=Small Pile of Selenium Hexafluoride Dust
+item.itemNuggetSeleniumHexafluoride.name=Selenium Hexafluoride Nugget
+item.itemPlateSeleniumHexafluoride.name=Selenium Hexafluoride Plate
+item.itemPlateDoubleSeleniumHexafluoride.name=Double Selenium Hexafluoride Plate
+item.itemIngotLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Ingot
+item.itemDustLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Dust
+item.itemDustTinyLiFBeF2ZrF4U235.name=Tiny Pile of LiFBeF2ZrF4U235 Dust
+item.itemDustSmallLiFBeF2ZrF4U235.name=Small Pile of LiFBeF2ZrF4U235 Dust
+item.itemNuggetLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Nugget
+item.itemPlateLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Plate
+item.itemPlateDoubleLiFBeF2ZrF4U235.name=Double LiFBeF2ZrF4U235 Plate
+item.itemIngotLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Ingot
+item.itemDustLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Dust
+item.itemDustTinyLiFBeF2ZrF4UF4.name=Tiny Pile of LiFBeF2ZrF4UF4 Dust
+item.itemDustSmallLiFBeF2ZrF4UF4.name=Small Pile of LiFBeF2ZrF4UF4 Dust
+item.itemNuggetLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Nugget
+item.itemPlateLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Plate
+item.itemPlateDoubleLiFBeF2ZrF4UF4.name=Double LiFBeF2ZrF4UF4 Plate
+item.itemIngotLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Ingot
+item.itemDustLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Dust
+item.itemDustTinyLiFBeF2ThF4UF4.name=Tiny Pile of LiFBeF2ThF4UF4 Dust
+item.itemDustSmallLiFBeF2ThF4UF4.name=Small Pile of LiFBeF2ThF4UF4 Dust
+item.itemNuggetLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Nugget
+item.itemPlateLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Plate
+item.itemPlateDoubleLiFBeF2ThF4UF4.name=Double LiFBeF2ThF4UF4 Plate
+item.itemIngotEnergyCrystal.name=Energy Crystal Ingot
+item.itemHotIngotEnergyCrystal.name=Hot Energy Crystal Ingot
+item.itemDustEnergyCrystal.name=Energy Crystal Dust
+item.itemDustTinyEnergyCrystal.name=Tiny Pile of Energy Crystal Dust
+item.itemDustSmallEnergyCrystal.name=Small Pile of Energy Crystal Dust
+item.itemNuggetEnergyCrystal.name=Energy Crystal Nugget
+item.itemPlateEnergyCrystal.name=Energy Crystal Plate
+item.itemPlateDoubleEnergyCrystal.name=Double Energy Crystal Plate
+item.itemBoltEnergyCrystal.name=Energy Crystal Bolt
+item.itemRodEnergyCrystal.name=Energy Crystal Rod
+item.itemRodLongEnergyCrystal.name=Long Energy Crystal Rod
+item.itemRingEnergyCrystal.name=Energy Crystal Ring
+item.itemScrewEnergyCrystal.name=Energy Crystal Screw
+item.itemRotorEnergyCrystal.name=Energy Crystal Rotor
+item.itemGearEnergyCrystal.name=Energy Crystal Gear
+item.itemIngotBloodSteel.name=Blood Steel Ingot
+item.itemDustBloodSteel.name=Blood Steel Dust
+item.itemDustTinyBloodSteel.name=Tiny Pile of Blood Steel Dust
+item.itemDustSmallBloodSteel.name=Small Pile of Blood Steel Dust
+item.itemNuggetBloodSteel.name=Blood Steel Nugget
+item.itemPlateBloodSteel.name=Blood Steel Plate
+item.itemPlateDoubleBloodSteel.name=Double Blood Steel Plate
+item.itemBoltBloodSteel.name=Blood Steel Bolt
+item.itemRodBloodSteel.name=Blood Steel Rod
+item.itemRodLongBloodSteel.name=Long Blood Steel Rod
+item.itemRingBloodSteel.name=Blood Steel Ring
+item.itemScrewBloodSteel.name=Blood Steel Screw
+item.itemRotorBloodSteel.name=Blood Steel Rotor
+item.itemGearBloodSteel.name=Blood Steel Gear
+item.itemIngotZeron100.name=Zeron-100 Ingot
+item.itemHotIngotZeron100.name=Hot Zeron-100 Ingot
+item.itemDustZeron100.name=Zeron-100 Dust
+item.itemDustTinyZeron100.name=Tiny Pile of Zeron-100 Dust
+item.itemDustSmallZeron100.name=Small Pile of Zeron-100 Dust
+item.itemNuggetZeron100.name=Zeron-100 Nugget
+item.itemPlateZeron100.name=Zeron-100 Plate
+item.itemPlateDoubleZeron100.name=Double Zeron-100 Plate
+item.itemBoltZeron100.name=Zeron-100 Bolt
+item.itemRodZeron100.name=Zeron-100 Rod
+item.itemRodLongZeron100.name=Long Zeron-100 Rod
+item.itemRingZeron100.name=Zeron-100 Ring
+item.itemScrewZeron100.name=Zeron-100 Screw
+item.itemRotorZeron100.name=Zeron-100 Rotor
+item.itemGearZeron100.name=Zeron-100 Gear
+item.itemIngotTumbaga.name=Tumbaga Ingot
+item.itemDustTumbaga.name=Tumbaga Dust
+item.itemDustTinyTumbaga.name=Tiny Pile of Tumbaga Dust
+item.itemDustSmallTumbaga.name=Small Pile of Tumbaga Dust
+item.itemNuggetTumbaga.name=Tumbaga Nugget
+item.itemPlateTumbaga.name=Tumbaga Plate
+item.itemPlateDoubleTumbaga.name=Double Tumbaga Plate
+item.itemBoltTumbaga.name=Tumbaga Bolt
+item.itemRodTumbaga.name=Tumbaga Rod
+item.itemRodLongTumbaga.name=Long Tumbaga Rod
+item.itemRingTumbaga.name=Tumbaga Ring
+item.itemScrewTumbaga.name=Tumbaga Screw
+item.itemRotorTumbaga.name=Tumbaga Rotor
+item.itemGearTumbaga.name=Tumbaga Gear
+item.itemIngotPotin.name=Potin Ingot
+item.itemDustPotin.name=Potin Dust
+item.itemDustTinyPotin.name=Tiny Pile of Potin Dust
+item.itemDustSmallPotin.name=Small Pile of Potin Dust
+item.itemNuggetPotin.name=Potin Nugget
+item.itemPlatePotin.name=Potin Plate
+item.itemPlateDoublePotin.name=Double Potin Plate
+item.itemBoltPotin.name=Potin Bolt
+item.itemRodPotin.name=Potin Rod
+item.itemRodLongPotin.name=Long Potin Rod
+item.itemRingPotin.name=Potin Ring
+item.itemScrewPotin.name=Potin Screw
+item.itemRotorPotin.name=Potin Rotor
+item.itemGearPotin.name=Potin Gear
+item.itemIngotStaballoy.name=Staballoy Ingot
+item.itemHotIngotStaballoy.name=Hot Staballoy Ingot
+item.itemDustStaballoy.name=Staballoy Dust
+item.itemDustTinyStaballoy.name=Tiny Pile of Staballoy Dust
+item.itemDustSmallStaballoy.name=Small Pile of Staballoy Dust
+item.itemNuggetStaballoy.name=Staballoy Nugget
+item.itemPlateStaballoy.name=Staballoy Plate
+item.itemPlateDoubleStaballoy.name=Double Staballoy Plate
+item.itemBoltStaballoy.name=Staballoy Bolt
+item.itemRodStaballoy.name=Staballoy Rod
+item.itemRodLongStaballoy.name=Long Staballoy Rod
+item.itemRingStaballoy.name=Staballoy Ring
+item.itemScrewStaballoy.name=Staballoy Screw
+item.itemRotorStaballoy.name=Staballoy Rotor
+item.itemGearStaballoy.name=Staballoy Gear
+item.itemIngotTantalloy60.name=Tantalloy-60 Ingot
+item.itemHotIngotTantalloy60.name=Hot Tantalloy-60 Ingot
+item.itemDustTantalloy60.name=Tantalloy-60 Dust
+item.itemDustTinyTantalloy60.name=Tiny Pile of Tantalloy-60 Dust
+item.itemDustSmallTantalloy60.name=Small Pile of Tantalloy-60 Dust
+item.itemNuggetTantalloy60.name=Tantalloy-60 Nugget
+item.itemPlateTantalloy60.name=Tantalloy-60 Plate
+item.itemPlateDoubleTantalloy60.name=Double Tantalloy-60 Plate
+item.itemBoltTantalloy60.name=Tantalloy-60 Bolt
+item.itemRodTantalloy60.name=Tantalloy-60 Rod
+item.itemRodLongTantalloy60.name=Long Tantalloy-60 Rod
+item.itemRingTantalloy60.name=Tantalloy-60 Ring
+item.itemScrewTantalloy60.name=Tantalloy-60 Screw
+item.itemRotorTantalloy60.name=Tantalloy-60 Rotor
+item.itemGearTantalloy60.name=Tantalloy-60 Gear
+item.itemIngotTantalloy61.name=Tantalloy-61 Ingot
+item.itemHotIngotTantalloy61.name=Hot Tantalloy-61 Ingot
+item.itemDustTantalloy61.name=Tantalloy-61 Dust
+item.itemDustTinyTantalloy61.name=Tiny Pile of Tantalloy-61 Dust
+item.itemDustSmallTantalloy61.name=Small Pile of Tantalloy-61 Dust
+item.itemNuggetTantalloy61.name=Tantalloy-61 Nugget
+item.itemPlateTantalloy61.name=Tantalloy-61 Plate
+item.itemPlateDoubleTantalloy61.name=Double Tantalloy-61 Plate
+item.itemBoltTantalloy61.name=Tantalloy-61 Bolt
+item.itemRodTantalloy61.name=Tantalloy-61 Rod
+item.itemRodLongTantalloy61.name=Long Tantalloy-61 Rod
+item.itemRingTantalloy61.name=Tantalloy-61 Ring
+item.itemScrewTantalloy61.name=Tantalloy-61 Screw
+item.itemRotorTantalloy61.name=Tantalloy-61 Rotor
+item.itemGearTantalloy61.name=Tantalloy-61 Gear
+item.itemIngotInconel625.name=Inconel-625 Ingot
+item.itemHotIngotInconel625.name=Hot Inconel-625 Ingot
+item.itemDustInconel625.name=Inconel-625 Dust
+item.itemDustTinyInconel625.name=Tiny Pile of Inconel-625 Dust
+item.itemDustSmallInconel625.name=Small Pile of Inconel-625 Dust
+item.itemNuggetInconel625.name=Inconel-625 Nugget
+item.itemPlateInconel625.name=Inconel-625 Plate
+item.itemPlateDoubleInconel625.name=Double Inconel-625 Plate
+item.itemBoltInconel625.name=Inconel-625 Bolt
+item.itemRodInconel625.name=Inconel-625 Rod
+item.itemRodLongInconel625.name=Long Inconel-625 Rod
+item.itemRingInconel625.name=Inconel-625 Ring
+item.itemScrewInconel625.name=Inconel-625 Screw
+item.itemRotorInconel625.name=Inconel-625 Rotor
+item.itemGearInconel625.name=Inconel-625 Gear
+item.itemIngotInconel690.name=Inconel-690 Ingot
+item.itemHotIngotInconel690.name=Hot Inconel-690 Ingot
+item.itemDustInconel690.name=Inconel-690 Dust
+item.itemDustTinyInconel690.name=Tiny Pile of Inconel-690 Dust
+item.itemDustSmallInconel690.name=Small Pile of Inconel-690 Dust
+item.itemNuggetInconel690.name=Inconel-690 Nugget
+item.itemPlateInconel690.name=Inconel-690 Plate
+item.itemPlateDoubleInconel690.name=Double Inconel-690 Plate
+item.itemBoltInconel690.name=Inconel-690 Bolt
+item.itemRodInconel690.name=Inconel-690 Rod
+item.itemRodLongInconel690.name=Long Inconel-690 Rod
+item.itemRingInconel690.name=Inconel-690 Ring
+item.itemScrewInconel690.name=Inconel-690 Screw
+item.itemRotorInconel690.name=Inconel-690 Rotor
+item.itemGearInconel690.name=Inconel-690 Gear
+item.itemIngotInconel792.name=Inconel-792 Ingot
+item.itemHotIngotInconel792.name=Hot Inconel-792 Ingot
+item.itemDustInconel792.name=Inconel-792 Dust
+item.itemDustTinyInconel792.name=Tiny Pile of Inconel-792 Dust
+item.itemDustSmallInconel792.name=Small Pile of Inconel-792 Dust
+item.itemNuggetInconel792.name=Inconel-792 Nugget
+item.itemPlateInconel792.name=Inconel-792 Plate
+item.itemPlateDoubleInconel792.name=Double Inconel-792 Plate
+item.itemBoltInconel792.name=Inconel-792 Bolt
+item.itemRodInconel792.name=Inconel-792 Rod
+item.itemRodLongInconel792.name=Long Inconel-792 Rod
+item.itemRingInconel792.name=Inconel-792 Ring
+item.itemScrewInconel792.name=Inconel-792 Screw
+item.itemRotorInconel792.name=Inconel-792 Rotor
+item.itemGearInconel792.name=Inconel-792 Gear
+item.itemDustEglinSteelBaseCompound.name=Eglin Steel Base Compound Dust
+item.itemDustTinyEglinSteelBaseCompound.name=Tiny Pile of Eglin Steel Base Compound Dust
+item.itemDustSmallEglinSteelBaseCompound.name=Small Pile of Eglin Steel Base Compound Dust
+item.itemIngotEglinSteel.name=Eglin Steel Ingot
+item.itemDustEglinSteel.name=Eglin Steel Dust
+item.itemDustTinyEglinSteel.name=Tiny Pile of Eglin Steel Dust
+item.itemDustSmallEglinSteel.name=Small Pile of Eglin Steel Dust
+item.itemNuggetEglinSteel.name=Eglin Steel Nugget
+item.itemPlateEglinSteel.name=Eglin Steel Plate
+item.itemPlateDoubleEglinSteel.name=Double Eglin Steel Plate
+item.itemBoltEglinSteel.name=Eglin Steel Bolt
+item.itemRodEglinSteel.name=Eglin Steel Rod
+item.itemRodLongEglinSteel.name=Long Eglin Steel Rod
+item.itemRingEglinSteel.name=Eglin Steel Ring
+item.itemScrewEglinSteel.name=Eglin Steel Screw
+item.itemRotorEglinSteel.name=Eglin Steel Rotor
+item.itemGearEglinSteel.name=Eglin Steel Gear
+item.itemIngotMaragingSteel250.name=Maraging Steel 250 Ingot
+item.itemHotIngotMaragingSteel250.name=Hot Maraging Steel 250 Ingot
+item.itemDustMaragingSteel250.name=Maraging Steel 250 Dust
+item.itemDustTinyMaragingSteel250.name=Tiny Pile of Maraging Steel 250 Dust
+item.itemDustSmallMaragingSteel250.name=Small Pile of Maraging Steel 250 Dust
+item.itemNuggetMaragingSteel250.name=Maraging Steel 250 Nugget
+item.itemPlateMaragingSteel250.name=Maraging Steel 250 Plate
+item.itemPlateDoubleMaragingSteel250.name=Double Maraging Steel 250 Plate
+item.itemBoltMaragingSteel250.name=Maraging Steel 250 Bolt
+item.itemRodMaragingSteel250.name=Maraging Steel 250 Rod
+item.itemRodLongMaragingSteel250.name=Long Maraging Steel 250 Rod
+item.itemRingMaragingSteel250.name=Maraging Steel 250 Ring
+item.itemScrewMaragingSteel250.name=Maraging Steel 250 Screw
+item.itemRotorMaragingSteel250.name=Maraging Steel 250 Rotor
+item.itemGearMaragingSteel250.name=Maraging Steel 250 Gear
+item.itemIngotMaragingSteel300.name=Maraging Steel 300 Ingot
+item.itemHotIngotMaragingSteel300.name=Hot Maraging Steel 300 Ingot
+item.itemDustMaragingSteel300.name=Maraging Steel 300 Dust
+item.itemDustTinyMaragingSteel300.name=Tiny Pile of Maraging Steel 300 Dust
+item.itemDustSmallMaragingSteel300.name=Small Pile of Maraging Steel 300 Dust
+item.itemNuggetMaragingSteel300.name=Maraging Steel 300 Nugget
+item.itemPlateMaragingSteel300.name=Maraging Steel 300 Plate
+item.itemPlateDoubleMaragingSteel300.name=Double Maraging Steel 300 Plate
+item.itemBoltMaragingSteel300.name=Maraging Steel 300 Bolt
+item.itemRodMaragingSteel300.name=Maraging Steel 300 Rod
+item.itemRodLongMaragingSteel300.name=Long Maraging Steel 300 Rod
+item.itemRingMaragingSteel300.name=Maraging Steel 300 Ring
+item.itemScrewMaragingSteel300.name=Maraging Steel 300 Screw
+item.itemRotorMaragingSteel300.name=Maraging Steel 300 Rotor
+item.itemGearMaragingSteel300.name=Maraging Steel 300 Gear
+item.itemIngotMaragingSteel350.name=Maraging Steel 350 Ingot
+item.itemHotIngotMaragingSteel350.name=Hot Maraging Steel 350 Ingot
+item.itemDustMaragingSteel350.name=Maraging Steel 350 Dust
+item.itemDustTinyMaragingSteel350.name=Tiny Pile of Maraging Steel 350 Dust
+item.itemDustSmallMaragingSteel350.name=Small Pile of Maraging Steel 350 Dust
+item.itemNuggetMaragingSteel350.name=Maraging Steel 350 Nugget
+item.itemPlateMaragingSteel350.name=Maraging Steel 350 Plate
+item.itemPlateDoubleMaragingSteel350.name=Double Maraging Steel 350 Plate
+item.itemBoltMaragingSteel350.name=Maraging Steel 350 Bolt
+item.itemRodMaragingSteel350.name=Maraging Steel 350 Rod
+item.itemRodLongMaragingSteel350.name=Long Maraging Steel 350 Rod
+item.itemRingMaragingSteel350.name=Maraging Steel 350 Ring
+item.itemScrewMaragingSteel350.name=Maraging Steel 350 Screw
+item.itemRotorMaragingSteel350.name=Maraging Steel 350 Rotor
+item.itemGearMaragingSteel350.name=Maraging Steel 350 Gear
+item.itemIngotStellite.name=Stellite Ingot
+item.itemHotIngotStellite.name=Hot Stellite Ingot
+item.itemDustStellite.name=Stellite Dust
+item.itemDustTinyStellite.name=Tiny Pile of Stellite Dust
+item.itemDustSmallStellite.name=Small Pile of Stellite Dust
+item.itemNuggetStellite.name=Stellite Nugget
+item.itemPlateStellite.name=Stellite Plate
+item.itemPlateDoubleStellite.name=Double Stellite Plate
+item.itemBoltStellite.name=Stellite Bolt
+item.itemRodStellite.name=Stellite Rod
+item.itemRodLongStellite.name=Long Stellite Rod
+item.itemRingStellite.name=Stellite Ring
+item.itemScrewStellite.name=Stellite Screw
+item.itemRotorStellite.name=Stellite Rotor
+item.itemGearStellite.name=Stellite Gear
+item.itemIngotTalonite.name=Talonite Ingot
+item.itemDustTalonite.name=Talonite Dust
+item.itemDustTinyTalonite.name=Tiny Pile of Talonite Dust
+item.itemDustSmallTalonite.name=Small Pile of Talonite Dust
+item.itemNuggetTalonite.name=Talonite Nugget
+item.itemPlateTalonite.name=Talonite Plate
+item.itemPlateDoubleTalonite.name=Double Talonite Plate
+item.itemBoltTalonite.name=Talonite Bolt
+item.itemRodTalonite.name=Talonite Rod
+item.itemRodLongTalonite.name=Long Talonite Rod
+item.itemRingTalonite.name=Talonite Ring
+item.itemScrewTalonite.name=Talonite Screw
+item.itemRotorTalonite.name=Talonite Rotor
+item.itemGearTalonite.name=Talonite Gear
+item.itemIngotHastelloyW.name=Hastelloy-W Ingot
+item.itemDustHastelloyW.name=Hastelloy-W Dust
+item.itemDustTinyHastelloyW.name=Tiny Pile of Hastelloy-W Dust
+item.itemDustSmallHastelloyW.name=Small Pile of Hastelloy-W Dust
+item.itemNuggetHastelloyW.name=Hastelloy-W Nugget
+item.itemPlateHastelloyW.name=Hastelloy-W Plate
+item.itemPlateDoubleHastelloyW.name=Double Hastelloy-W Plate
+item.itemBoltHastelloyW.name=Hastelloy-W Bolt
+item.itemRodHastelloyW.name=Hastelloy-W Rod
+item.itemRodLongHastelloyW.name=Long Hastelloy-W Rod
+item.itemRingHastelloyW.name=Hastelloy-W Ring
+item.itemScrewHastelloyW.name=Hastelloy-W Screw
+item.itemRotorHastelloyW.name=Hastelloy-W Rotor
+item.itemGearHastelloyW.name=Hastelloy-W Gear
+item.itemIngotHastelloyX.name=Hastelloy-X Ingot
+item.itemDustHastelloyX.name=Hastelloy-X Dust
+item.itemDustTinyHastelloyX.name=Tiny Pile of Hastelloy-X Dust
+item.itemDustSmallHastelloyX.name=Small Pile of Hastelloy-X Dust
+item.itemNuggetHastelloyX.name=Hastelloy-X Nugget
+item.itemPlateHastelloyX.name=Hastelloy-X Plate
+item.itemPlateDoubleHastelloyX.name=Double Hastelloy-X Plate
+item.itemBoltHastelloyX.name=Hastelloy-X Bolt
+item.itemRodHastelloyX.name=Hastelloy-X Rod
+item.itemRodLongHastelloyX.name=Long Hastelloy-X Rod
+item.itemRingHastelloyX.name=Hastelloy-X Ring
+item.itemScrewHastelloyX.name=Hastelloy-X Screw
+item.itemRotorHastelloyX.name=Hastelloy-X Rotor
+item.itemGearHastelloyX.name=Hastelloy-X Gear
+item.itemIngotHastelloyC276.name=Hastelloy-C276 Ingot
+item.itemHotIngotHastelloyC276.name=Hot Hastelloy-C276 Ingot
+item.itemDustHastelloyC276.name=Hastelloy-C276 Dust
+item.itemDustTinyHastelloyC276.name=Tiny Pile of Hastelloy-C276 Dust
+item.itemDustSmallHastelloyC276.name=Small Pile of Hastelloy-C276 Dust
+item.itemNuggetHastelloyC276.name=Hastelloy-C276 Nugget
+item.itemPlateHastelloyC276.name=Hastelloy-C276 Plate
+item.itemPlateDoubleHastelloyC276.name=Double Hastelloy-C276 Plate
+item.itemBoltHastelloyC276.name=Hastelloy-C276 Bolt
+item.itemRodHastelloyC276.name=Hastelloy-C276 Rod
+item.itemRodLongHastelloyC276.name=Long Hastelloy-C276 Rod
+item.itemRingHastelloyC276.name=Hastelloy-C276 Ring
+item.itemScrewHastelloyC276.name=Hastelloy-C276 Screw
+item.itemRotorHastelloyC276.name=Hastelloy-C276 Rotor
+item.itemGearHastelloyC276.name=Hastelloy-C276 Gear
+item.itemIngotHastelloyN.name=Hastelloy-N Ingot
+item.itemHotIngotHastelloyN.name=Hot Hastelloy-N Ingot
+item.itemDustHastelloyN.name=Hastelloy-N Dust
+item.itemDustTinyHastelloyN.name=Tiny Pile of Hastelloy-N Dust
+item.itemDustSmallHastelloyN.name=Small Pile of Hastelloy-N Dust
+item.itemNuggetHastelloyN.name=Hastelloy-N Nugget
+item.itemPlateHastelloyN.name=Hastelloy-N Plate
+item.itemPlateDoubleHastelloyN.name=Double Hastelloy-N Plate
+item.itemBoltHastelloyN.name=Hastelloy-N Bolt
+item.itemRodHastelloyN.name=Hastelloy-N Rod
+item.itemRodLongHastelloyN.name=Long Hastelloy-N Rod
+item.itemRingHastelloyN.name=Hastelloy-N Ring
+item.itemScrewHastelloyN.name=Hastelloy-N Screw
+item.itemRotorHastelloyN.name=Hastelloy-N Rotor
+item.itemGearHastelloyN.name=Hastelloy-N Gear
+item.itemIngotIncoloy020.name=Incoloy-020 Ingot
+item.itemDustIncoloy020.name=Incoloy-020 Dust
+item.itemDustTinyIncoloy020.name=Tiny Pile of Incoloy-020 Dust
+item.itemDustSmallIncoloy020.name=Small Pile of Incoloy-020 Dust
+item.itemNuggetIncoloy020.name=Incoloy-020 Nugget
+item.itemPlateIncoloy020.name=Incoloy-020 Plate
+item.itemPlateDoubleIncoloy020.name=Double Incoloy-020 Plate
+item.itemBoltIncoloy020.name=Incoloy-020 Bolt
+item.itemRodIncoloy020.name=Incoloy-020 Rod
+item.itemRodLongIncoloy020.name=Long Incoloy-020 Rod
+item.itemRingIncoloy020.name=Incoloy-020 Ring
+item.itemScrewIncoloy020.name=Incoloy-020 Screw
+item.itemRotorIncoloy020.name=Incoloy-020 Rotor
+item.itemGearIncoloy020.name=Incoloy-020 Gear
+item.itemIngotIncoloyDS.name=Incoloy-DS Ingot
+item.itemDustIncoloyDS.name=Incoloy-DS Dust
+item.itemDustTinyIncoloyDS.name=Tiny Pile of Incoloy-DS Dust
+item.itemDustSmallIncoloyDS.name=Small Pile of Incoloy-DS Dust
+item.itemNuggetIncoloyDS.name=Incoloy-DS Nugget
+item.itemPlateIncoloyDS.name=Incoloy-DS Plate
+item.itemPlateDoubleIncoloyDS.name=Double Incoloy-DS Plate
+item.itemBoltIncoloyDS.name=Incoloy-DS Bolt
+item.itemRodIncoloyDS.name=Incoloy-DS Rod
+item.itemRodLongIncoloyDS.name=Long Incoloy-DS Rod
+item.itemRingIncoloyDS.name=Incoloy-DS Ring
+item.itemScrewIncoloyDS.name=Incoloy-DS Screw
+item.itemRotorIncoloyDS.name=Incoloy-DS Rotor
+item.itemGearIncoloyDS.name=Incoloy-DS Gear
+item.itemIngotIncoloyMA956.name=Incoloy-MA956 Ingot
+item.itemHotIngotIncoloyMA956.name=Hot Incoloy-MA956 Ingot
+item.itemDustIncoloyMA956.name=Incoloy-MA956 Dust
+item.itemDustTinyIncoloyMA956.name=Tiny Pile of Incoloy-MA956 Dust
+item.itemDustSmallIncoloyMA956.name=Small Pile of Incoloy-MA956 Dust
+item.itemNuggetIncoloyMA956.name=Incoloy-MA956 Nugget
+item.itemPlateIncoloyMA956.name=Incoloy-MA956 Plate
+item.itemPlateDoubleIncoloyMA956.name=Double Incoloy-MA956 Plate
+item.itemBoltIncoloyMA956.name=Incoloy-MA956 Bolt
+item.itemRodIncoloyMA956.name=Incoloy-MA956 Rod
+item.itemRodLongIncoloyMA956.name=Long Incoloy-MA956 Rod
+item.itemRingIncoloyMA956.name=Incoloy-MA956 Ring
+item.itemScrewIncoloyMA956.name=Incoloy-MA956 Screw
+item.itemRotorIncoloyMA956.name=Incoloy-MA956 Rotor
+item.itemGearIncoloyMA956.name=Incoloy-MA956 Gear
+item.itemIngotGrisium.name=Grisium Ingot
+item.itemHotIngotGrisium.name=Hot Grisium Ingot
+item.itemDustGrisium.name=Grisium Dust
+item.itemDustTinyGrisium.name=Tiny Pile of Grisium Dust
+item.itemDustSmallGrisium.name=Small Pile of Grisium Dust
+item.itemNuggetGrisium.name=Grisium Nugget
+item.itemPlateGrisium.name=Grisium Plate
+item.itemPlateDoubleGrisium.name=Double Grisium Plate
+item.itemBoltGrisium.name=Grisium Bolt
+item.itemRodGrisium.name=Grisium Rod
+item.itemRodLongGrisium.name=Long Grisium Rod
+item.itemRingGrisium.name=Grisium Ring
+item.itemScrewGrisium.name=Grisium Screw
+item.itemRotorGrisium.name=Grisium Rotor
+item.itemGearGrisium.name=Grisium Gear
+item.itemIngotHG1223.name=HG-1223 Ingot
+item.itemDustHG1223.name=HG-1223 Dust
+item.itemDustTinyHG1223.name=Tiny Pile of HG-1223 Dust
+item.itemDustSmallHG1223.name=Small Pile of HG-1223 Dust
+item.itemNuggetHG1223.name=HG-1223 Nugget
+item.itemPlateHG1223.name=HG-1223 Plate
+item.itemPlateDoubleHG1223.name=Double HG-1223 Plate
+item.itemIngotTrinium.name=Trinium Ingot
+item.itemDustTrinium.name=Trinium Dust
+item.itemDustTinyTrinium.name=Tiny Pile of Trinium Dust
+item.itemDustSmallTrinium.name=Small Pile of Trinium Dust
+item.itemNuggetTrinium.name=Trinium Nugget
+item.itemPlateTrinium.name=Trinium Plate
+item.itemPlateDoubleTrinium.name=Double Trinium Plate
+item.itemIngotRefinedTrinium.name=Refined Trinium Ingot
+item.itemDustRefinedTrinium.name=Refined Trinium Dust
+item.itemDustTinyRefinedTrinium.name=Tiny Pile of Refined Trinium Dust
+item.itemDustSmallRefinedTrinium.name=Small Pile of Refined Trinium Dust
+item.itemNuggetRefinedTrinium.name=Refined Trinium Nugget
+item.itemPlateRefinedTrinium.name=Refined Trinium Plate
+item.itemPlateDoubleRefinedTrinium.name=Double Refined Trinium Plate
+item.itemIngotTriniumTitaniumAlloy.name=Trinium Titanium Alloy Ingot
+item.itemHotIngotTriniumTitaniumAlloy.name=Hot Trinium Titanium Alloy Ingot
+item.itemDustTriniumTitaniumAlloy.name=Trinium Titanium Alloy Dust
+item.itemDustTinyTriniumTitaniumAlloy.name=Tiny Pile of Trinium Titanium Alloy Dust
+item.itemDustSmallTriniumTitaniumAlloy.name=Small Pile of Trinium Titanium Alloy Dust
+item.itemNuggetTriniumTitaniumAlloy.name=Trinium Titanium Alloy Nugget
+item.itemPlateTriniumTitaniumAlloy.name=Trinium Titanium Alloy Plate
+item.itemPlateDoubleTriniumTitaniumAlloy.name=Double Trinium Titanium Alloy Plate
+item.itemBoltTriniumTitaniumAlloy.name=Trinium Titanium Alloy Bolt
+item.itemRodTriniumTitaniumAlloy.name=Trinium Titanium Alloy Rod
+item.itemRodLongTriniumTitaniumAlloy.name=Long Trinium Titanium Alloy Rod
+item.itemRingTriniumTitaniumAlloy.name=Trinium Titanium Alloy Ring
+item.itemScrewTriniumTitaniumAlloy.name=Trinium Titanium Alloy Screw
+item.itemRotorTriniumTitaniumAlloy.name=Trinium Titanium Alloy Rotor
+item.itemGearTriniumTitaniumAlloy.name=Trinium Titanium Alloy Gear
+item.itemIngotTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Ingot
+item.itemDustTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Dust
+item.itemDustTinyTriniumNaquadahAlloy.name=Tiny Pile of Trinium Naquadah Alloy Dust
+item.itemDustSmallTriniumNaquadahAlloy.name=Small Pile of Trinium Naquadah Alloy Dust
+item.itemNuggetTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Nugget
+item.itemPlateTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Plate
+item.itemPlateDoubleTriniumNaquadahAlloy.name=Double Trinium Naquadah Alloy Plate
+item.itemIngotTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Ingot
+item.itemHotIngotTriniumNaquadahCarbonite.name=Hot Trinium Naquadah Carbonite Ingot
+item.itemDustTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Dust
+item.itemDustTinyTriniumNaquadahCarbonite.name=Tiny Pile of Trinium Naquadah Carbonite Dust
+item.itemDustSmallTriniumNaquadahCarbonite.name=Small Pile of Trinium Naquadah Carbonite Dust
+item.itemNuggetTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Nugget
+item.itemPlateTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Plate
+item.itemPlateDoubleTriniumNaquadahCarbonite.name=Double Trinium Naquadah Carbonite Plate
+item.itemBoltTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Bolt
+item.itemRodTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Rod
+item.itemRodLongTriniumNaquadahCarbonite.name=Long Trinium Naquadah Carbonite Rod
+item.itemRingTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Ring
+item.itemScrewTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Screw
+item.itemRotorTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Rotor
+item.itemGearTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Gear
+item.itemIngotQuantum.name=Quantum Ingot
+item.itemHotIngotQuantum.name=Hot Quantum Ingot
+item.itemDustQuantum.name=Quantum Dust
+item.itemDustTinyQuantum.name=Tiny Pile of Quantum Dust
+item.itemDustSmallQuantum.name=Small Pile of Quantum Dust
+item.itemNuggetQuantum.name=Quantum Nugget
+item.itemPlateQuantum.name=Quantum Plate
+item.itemPlateDoubleQuantum.name=Double Quantum Plate
+item.itemBoltQuantum.name=Quantum Bolt
+item.itemRodQuantum.name=Quantum Rod
+item.itemRodLongQuantum.name=Long Quantum Rod
+item.itemRingQuantum.name=Quantum Ring
+item.itemScrewQuantum.name=Quantum Screw
+item.itemRotorQuantum.name=Quantum Rotor
+item.itemGearQuantum.name=Quantum Gear
+item.itemDustFluoriteF.name=Fluorite (F) Dust
+item.itemDustTinyFluoriteF.name=Tiny Pile of Fluorite (F) Dust
+item.itemDustSmallFluoriteF.name=Small Pile of Fluorite (F) Dust
+item.crushedFluoriteF.name=Crushed Fluorite (F) Ore
+item.oreRawFluoriteF.name=Raw Fluorite (F) Ore
+item.crushedCentrifugedFluoriteF.name=Centrifuged Crushed Fluorite (F) Ore
+item.crushedPurifiedFluoriteF.name=Purified Crushed Fluorite (F) Ore
+item.dustImpureFluoriteF.name=Impure Fluorite (F) Dust
+item.dustPureFluoriteF.name=Purified Fluorite (F) Dust
+item.itemDustCrocoite.name=Crocoite Dust
+item.itemDustTinyCrocoite.name=Tiny Pile of Crocoite Dust
+item.itemDustSmallCrocoite.name=Small Pile of Crocoite Dust
+item.crushedCrocoite.name=Crushed Crocoite Ore
+item.oreRawCrocoite.name=Raw Crocoite Ore
+item.crushedCentrifugedCrocoite.name=Centrifuged Crushed Crocoite Ore
+item.crushedPurifiedCrocoite.name=Purified Crushed Crocoite Ore
+item.dustImpureCrocoite.name=Impure Crocoite Dust
+item.dustPureCrocoite.name=Purified Crocoite Dust
+item.itemDustGeikielite.name=Geikielite Dust
+item.itemDustTinyGeikielite.name=Tiny Pile of Geikielite Dust
+item.itemDustSmallGeikielite.name=Small Pile of Geikielite Dust
+item.crushedGeikielite.name=Crushed Geikielite Ore
+item.oreRawGeikielite.name=Raw Geikielite Ore
+item.crushedCentrifugedGeikielite.name=Centrifuged Crushed Geikielite Ore
+item.crushedPurifiedGeikielite.name=Purified Crushed Geikielite Ore
+item.dustImpureGeikielite.name=Impure Geikielite Dust
+item.dustPureGeikielite.name=Purified Geikielite Dust
+item.itemDustNichromite.name=Nichromite Dust
+item.itemDustTinyNichromite.name=Tiny Pile of Nichromite Dust
+item.itemDustSmallNichromite.name=Small Pile of Nichromite Dust
+item.crushedNichromite.name=Crushed Nichromite Ore
+item.oreRawNichromite.name=Raw Nichromite Ore
+item.crushedCentrifugedNichromite.name=Centrifuged Crushed Nichromite Ore
+item.crushedPurifiedNichromite.name=Purified Crushed Nichromite Ore
+item.dustImpureNichromite.name=Impure Nichromite Dust
+item.dustPureNichromite.name=Purified Nichromite Dust
+item.itemDustTitanite.name=Titanite Dust
+item.itemDustTinyTitanite.name=Tiny Pile of Titanite Dust
+item.itemDustSmallTitanite.name=Small Pile of Titanite Dust
+item.crushedTitanite.name=Crushed Titanite Ore
+item.oreRawTitanite.name=Raw Titanite Ore
+item.crushedCentrifugedTitanite.name=Centrifuged Crushed Titanite Ore
+item.crushedPurifiedTitanite.name=Purified Crushed Titanite Ore
+item.dustImpureTitanite.name=Impure Titanite Dust
+item.dustPureTitanite.name=Purified Titanite Dust
+item.itemDustZimbabweite.name=Zimbabweite Dust
+item.itemDustTinyZimbabweite.name=Tiny Pile of Zimbabweite Dust
+item.itemDustSmallZimbabweite.name=Small Pile of Zimbabweite Dust
+item.crushedZimbabweite.name=Crushed Zimbabweite Ore
+item.oreRawZimbabweite.name=Raw Zimbabweite Ore
+item.crushedCentrifugedZimbabweite.name=Centrifuged Crushed Zimbabweite Ore
+item.crushedPurifiedZimbabweite.name=Purified Crushed Zimbabweite Ore
+item.dustImpureZimbabweite.name=Impure Zimbabweite Dust
+item.dustPureZimbabweite.name=Purified Zimbabweite Dust
+item.itemDustZirconolite.name=Zirconolite Dust
+item.itemDustTinyZirconolite.name=Tiny Pile of Zirconolite Dust
+item.itemDustSmallZirconolite.name=Small Pile of Zirconolite Dust
+item.crushedZirconolite.name=Crushed Zirconolite Ore
+item.oreRawZirconolite.name=Raw Zirconolite Ore
+item.crushedCentrifugedZirconolite.name=Centrifuged Crushed Zirconolite Ore
+item.crushedPurifiedZirconolite.name=Purified Crushed Zirconolite Ore
+item.dustImpureZirconolite.name=Impure Zirconolite Dust
+item.dustPureZirconolite.name=Purified Zirconolite Dust
+item.itemDustGadoliniteCe.name=Gadolinite (Ce) Dust
+item.itemDustTinyGadoliniteCe.name=Tiny Pile of Gadolinite (Ce) Dust
+item.itemDustSmallGadoliniteCe.name=Small Pile of Gadolinite (Ce) Dust
+item.crushedGadoliniteCe.name=Crushed Gadolinite (Ce) Ore
+item.oreRawGadoliniteCe.name=Raw Gadolinite (Ce) Ore
+item.crushedCentrifugedGadoliniteCe.name=Centrifuged Crushed Gadolinite (Ce) Ore
+item.crushedPurifiedGadoliniteCe.name=Purified Crushed Gadolinite (Ce) Ore
+item.dustImpureGadoliniteCe.name=Impure Gadolinite (Ce) Dust
+item.dustPureGadoliniteCe.name=Purified Gadolinite (Ce) Dust
+item.itemDustGadoliniteY.name=Gadolinite (Y) Dust
+item.itemDustTinyGadoliniteY.name=Tiny Pile of Gadolinite (Y) Dust
+item.itemDustSmallGadoliniteY.name=Small Pile of Gadolinite (Y) Dust
+item.crushedGadoliniteY.name=Crushed Gadolinite (Y) Ore
+item.oreRawGadoliniteY.name=Raw Gadolinite (Y) Ore
+item.crushedCentrifugedGadoliniteY.name=Centrifuged Crushed Gadolinite (Y) Ore
+item.crushedPurifiedGadoliniteY.name=Purified Crushed Gadolinite (Y) Ore
+item.dustImpureGadoliniteY.name=Impure Gadolinite (Y) Dust
+item.dustPureGadoliniteY.name=Purified Gadolinite (Y) Dust
+item.itemDustLepersonnite.name=Lepersonnite Dust
+item.itemDustTinyLepersonnite.name=Tiny Pile of Lepersonnite Dust
+item.itemDustSmallLepersonnite.name=Small Pile of Lepersonnite Dust
+item.crushedLepersonnite.name=Crushed Lepersonnite Ore
+item.oreRawLepersonnite.name=Raw Lepersonnite Ore
+item.crushedCentrifugedLepersonnite.name=Centrifuged Crushed Lepersonnite Ore
+item.crushedPurifiedLepersonnite.name=Purified Crushed Lepersonnite Ore
+item.dustImpureLepersonnite.name=Impure Lepersonnite Dust
+item.dustPureLepersonnite.name=Purified Lepersonnite Dust
+item.itemDustSamarskiteY.name=Samarskite (Y) Dust
+item.itemDustTinySamarskiteY.name=Tiny Pile of Samarskite (Y) Dust
+item.itemDustSmallSamarskiteY.name=Small Pile of Samarskite (Y) Dust
+item.crushedSamarskiteY.name=Crushed Samarskite (Y) Ore
+item.oreRawSamarskiteY.name=Raw Samarskite (Y) Ore
+item.crushedCentrifugedSamarskiteY.name=Centrifuged Crushed Samarskite (Y) Ore
+item.crushedPurifiedSamarskiteY.name=Purified Crushed Samarskite (Y) Ore
+item.dustImpureSamarskiteY.name=Impure Samarskite (Y) Dust
+item.dustPureSamarskiteY.name=Purified Samarskite (Y) Dust
+item.itemDustSamarskiteYb.name=Samarskite (Yb) Dust
+item.itemDustTinySamarskiteYb.name=Tiny Pile of Samarskite (Yb) Dust
+item.itemDustSmallSamarskiteYb.name=Small Pile of Samarskite (Yb) Dust
+item.crushedSamarskiteYb.name=Crushed Samarskite (Yb) Ore
+item.oreRawSamarskiteYb.name=Raw Samarskite (Yb) Ore
+item.crushedCentrifugedSamarskiteYb.name=Centrifuged Crushed Samarskite (Yb) Ore
+item.crushedPurifiedSamarskiteYb.name=Purified Crushed Samarskite (Yb) Ore
+item.dustImpureSamarskiteYb.name=Impure Samarskite (Yb) Dust
+item.dustPureSamarskiteYb.name=Purified Samarskite (Yb) Dust
+item.itemDustXenotime.name=Xenotime Dust
+item.itemDustTinyXenotime.name=Tiny Pile of Xenotime Dust
+item.itemDustSmallXenotime.name=Small Pile of Xenotime Dust
+item.crushedXenotime.name=Crushed Xenotime Ore
+item.oreRawXenotime.name=Raw Xenotime Ore
+item.crushedCentrifugedXenotime.name=Centrifuged Crushed Xenotime Ore
+item.crushedPurifiedXenotime.name=Purified Crushed Xenotime Ore
+item.dustImpureXenotime.name=Impure Xenotime Dust
+item.dustPureXenotime.name=Purified Xenotime Dust
+item.itemDustYttriaite.name=Yttriaite Dust
+item.itemDustTinyYttriaite.name=Tiny Pile of Yttriaite Dust
+item.itemDustSmallYttriaite.name=Small Pile of Yttriaite Dust
+item.crushedYttriaite.name=Crushed Yttriaite Ore
+item.oreRawYttriaite.name=Raw Yttriaite Ore
+item.crushedCentrifugedYttriaite.name=Centrifuged Crushed Yttriaite Ore
+item.crushedPurifiedYttriaite.name=Purified Crushed Yttriaite Ore
+item.dustImpureYttriaite.name=Impure Yttriaite Dust
+item.dustPureYttriaite.name=Purified Yttriaite Dust
+item.itemDustYttrialite.name=Yttrialite Dust
+item.itemDustTinyYttrialite.name=Tiny Pile of Yttrialite Dust
+item.itemDustSmallYttrialite.name=Small Pile of Yttrialite Dust
+item.crushedYttrialite.name=Crushed Yttrialite Ore
+item.oreRawYttrialite.name=Raw Yttrialite Ore
+item.crushedCentrifugedYttrialite.name=Centrifuged Crushed Yttrialite Ore
+item.crushedPurifiedYttrialite.name=Purified Crushed Yttrialite Ore
+item.dustImpureYttrialite.name=Impure Yttrialite Dust
+item.dustPureYttrialite.name=Purified Yttrialite Dust
+item.itemDustYttrocerite.name=Yttrocerite Dust
+item.itemDustTinyYttrocerite.name=Tiny Pile of Yttrocerite Dust
+item.itemDustSmallYttrocerite.name=Small Pile of Yttrocerite Dust
+item.crushedYttrocerite.name=Crushed Yttrocerite Ore
+item.oreRawYttrocerite.name=Raw Yttrocerite Ore
+item.crushedCentrifugedYttrocerite.name=Centrifuged Crushed Yttrocerite Ore
+item.crushedPurifiedYttrocerite.name=Purified Crushed Yttrocerite Ore
+item.dustImpureYttrocerite.name=Impure Yttrocerite Dust
+item.dustPureYttrocerite.name=Purified Yttrocerite Dust
+item.itemDustZircon.name=Zircon Dust
+item.itemDustTinyZircon.name=Tiny Pile of Zircon Dust
+item.itemDustSmallZircon.name=Small Pile of Zircon Dust
+item.crushedZircon.name=Crushed Zircon Ore
+item.oreRawZircon.name=Raw Zircon Ore
+item.crushedCentrifugedZircon.name=Centrifuged Crushed Zircon Ore
+item.crushedPurifiedZircon.name=Purified Crushed Zircon Ore
+item.dustImpureZircon.name=Impure Zircon Dust
+item.dustPureZircon.name=Purified Zircon Dust
+item.itemDustPolycrase.name=Polycrase Dust
+item.itemDustTinyPolycrase.name=Tiny Pile of Polycrase Dust
+item.itemDustSmallPolycrase.name=Small Pile of Polycrase Dust
+item.crushedPolycrase.name=Crushed Polycrase Ore
+item.oreRawPolycrase.name=Raw Polycrase Ore
+item.crushedCentrifugedPolycrase.name=Centrifuged Crushed Polycrase Ore
+item.crushedPurifiedPolycrase.name=Purified Crushed Polycrase Ore
+item.dustImpurePolycrase.name=Impure Polycrase Dust
+item.dustPurePolycrase.name=Purified Polycrase Dust
+item.itemDustZircophyllite.name=Zircophyllite Dust
+item.itemDustTinyZircophyllite.name=Tiny Pile of Zircophyllite Dust
+item.itemDustSmallZircophyllite.name=Small Pile of Zircophyllite Dust
+item.crushedZircophyllite.name=Crushed Zircophyllite Ore
+item.oreRawZircophyllite.name=Raw Zircophyllite Ore
+item.crushedCentrifugedZircophyllite.name=Centrifuged Crushed Zircophyllite Ore
+item.crushedPurifiedZircophyllite.name=Purified Crushed Zircophyllite Ore
+item.dustImpureZircophyllite.name=Impure Zircophyllite Dust
+item.dustPureZircophyllite.name=Purified Zircophyllite Dust
+item.itemDustZirkelite.name=Zirkelite Dust
+item.itemDustTinyZirkelite.name=Tiny Pile of Zirkelite Dust
+item.itemDustSmallZirkelite.name=Small Pile of Zirkelite Dust
+item.crushedZirkelite.name=Crushed Zirkelite Ore
+item.oreRawZirkelite.name=Raw Zirkelite Ore
+item.crushedCentrifugedZirkelite.name=Centrifuged Crushed Zirkelite Ore
+item.crushedPurifiedZirkelite.name=Purified Crushed Zirkelite Ore
+item.dustImpureZirkelite.name=Impure Zirkelite Dust
+item.dustPureZirkelite.name=Purified Zirkelite Dust
+item.itemDustLanthaniteLa.name=Lanthanite (La) Dust
+item.itemDustTinyLanthaniteLa.name=Tiny Pile of Lanthanite (La) Dust
+item.itemDustSmallLanthaniteLa.name=Small Pile of Lanthanite (La) Dust
+item.crushedLanthaniteLa.name=Crushed Lanthanite (La) Ore
+item.oreRawLanthaniteLa.name=Raw Lanthanite (La) Ore
+item.crushedCentrifugedLanthaniteLa.name=Centrifuged Crushed Lanthanite (La) Ore
+item.crushedPurifiedLanthaniteLa.name=Purified Crushed Lanthanite (La) Ore
+item.dustImpureLanthaniteLa.name=Impure Lanthanite (La) Dust
+item.dustPureLanthaniteLa.name=Purified Lanthanite (La) Dust
+item.itemDustLanthaniteCe.name=Lanthanite (Ce) Dust
+item.itemDustTinyLanthaniteCe.name=Tiny Pile of Lanthanite (Ce) Dust
+item.itemDustSmallLanthaniteCe.name=Small Pile of Lanthanite (Ce) Dust
+item.crushedLanthaniteCe.name=Crushed Lanthanite (Ce) Ore
+item.oreRawLanthaniteCe.name=Raw Lanthanite (Ce) Ore
+item.crushedCentrifugedLanthaniteCe.name=Centrifuged Crushed Lanthanite (Ce) Ore
+item.crushedPurifiedLanthaniteCe.name=Purified Crushed Lanthanite (Ce) Ore
+item.dustImpureLanthaniteCe.name=Impure Lanthanite (Ce) Dust
+item.dustPureLanthaniteCe.name=Purified Lanthanite (Ce) Dust
+item.itemDustLanthaniteNd.name=Lanthanite (Nd) Dust
+item.itemDustTinyLanthaniteNd.name=Tiny Pile of Lanthanite (Nd) Dust
+item.itemDustSmallLanthaniteNd.name=Small Pile of Lanthanite (Nd) Dust
+item.crushedLanthaniteNd.name=Crushed Lanthanite (Nd) Ore
+item.oreRawLanthaniteNd.name=Raw Lanthanite (Nd) Ore
+item.crushedCentrifugedLanthaniteNd.name=Centrifuged Crushed Lanthanite (Nd) Ore
+item.crushedPurifiedLanthaniteNd.name=Purified Crushed Lanthanite (Nd) Ore
+item.dustImpureLanthaniteNd.name=Impure Lanthanite (Nd) Dust
+item.dustPureLanthaniteNd.name=Purified Lanthanite (Nd) Dust
+item.itemDustAgarditeY.name=Agardite (Y) Dust
+item.itemDustTinyAgarditeY.name=Tiny Pile of Agardite (Y) Dust
+item.itemDustSmallAgarditeY.name=Small Pile of Agardite (Y) Dust
+item.crushedAgarditeY.name=Crushed Agardite (Y) Ore
+item.oreRawAgarditeY.name=Raw Agardite (Y) Ore
+item.crushedCentrifugedAgarditeY.name=Centrifuged Crushed Agardite (Y) Ore
+item.crushedPurifiedAgarditeY.name=Purified Crushed Agardite (Y) Ore
+item.dustImpureAgarditeY.name=Impure Agardite (Y) Dust
+item.dustPureAgarditeY.name=Purified Agardite (Y) Dust
+item.itemDustAgarditeCd.name=Agardite (Cd) Dust
+item.itemDustTinyAgarditeCd.name=Tiny Pile of Agardite (Cd) Dust
+item.itemDustSmallAgarditeCd.name=Small Pile of Agardite (Cd) Dust
+item.crushedAgarditeCd.name=Crushed Agardite (Cd) Ore
+item.oreRawAgarditeCd.name=Raw Agardite (Cd) Ore
+item.crushedCentrifugedAgarditeCd.name=Centrifuged Crushed Agardite (Cd) Ore
+item.crushedPurifiedAgarditeCd.name=Purified Crushed Agardite (Cd) Ore
+item.dustImpureAgarditeCd.name=Impure Agardite (Cd) Dust
+item.dustPureAgarditeCd.name=Purified Agardite (Cd) Dust
+item.itemDustAgarditeLa.name=Agardite (La) Dust
+item.itemDustTinyAgarditeLa.name=Tiny Pile of Agardite (La) Dust
+item.itemDustSmallAgarditeLa.name=Small Pile of Agardite (La) Dust
+item.crushedAgarditeLa.name=Crushed Agardite (La) Ore
+item.oreRawAgarditeLa.name=Raw Agardite (La) Ore
+item.crushedCentrifugedAgarditeLa.name=Centrifuged Crushed Agardite (La) Ore
+item.crushedPurifiedAgarditeLa.name=Purified Crushed Agardite (La) Ore
+item.dustImpureAgarditeLa.name=Impure Agardite (La) Dust
+item.dustPureAgarditeLa.name=Purified Agardite (La) Dust
+item.itemDustAgarditeNd.name=Agardite (Nd) Dust
+item.itemDustTinyAgarditeNd.name=Tiny Pile of Agardite (Nd) Dust
+item.itemDustSmallAgarditeNd.name=Small Pile of Agardite (Nd) Dust
+item.crushedAgarditeNd.name=Crushed Agardite (Nd) Ore
+item.oreRawAgarditeNd.name=Raw Agardite (Nd) Ore
+item.crushedCentrifugedAgarditeNd.name=Centrifuged Crushed Agardite (Nd) Ore
+item.crushedPurifiedAgarditeNd.name=Purified Crushed Agardite (Nd) Ore
+item.dustImpureAgarditeNd.name=Impure Agardite (Nd) Dust
+item.dustPureAgarditeNd.name=Purified Agardite (Nd) Dust
+item.itemDustHibonite.name=Hibonite Dust
+item.itemDustTinyHibonite.name=Tiny Pile of Hibonite Dust
+item.itemDustSmallHibonite.name=Small Pile of Hibonite Dust
+item.crushedHibonite.name=Crushed Hibonite Ore
+item.oreRawHibonite.name=Raw Hibonite Ore
+item.crushedCentrifugedHibonite.name=Centrifuged Crushed Hibonite Ore
+item.crushedPurifiedHibonite.name=Purified Crushed Hibonite Ore
+item.dustImpureHibonite.name=Impure Hibonite Dust
+item.dustPureHibonite.name=Purified Hibonite Dust
+item.itemDustCerite.name=Cerite Dust
+item.itemDustTinyCerite.name=Tiny Pile of Cerite Dust
+item.itemDustSmallCerite.name=Small Pile of Cerite Dust
+item.crushedCerite.name=Crushed Cerite Ore
+item.oreRawCerite.name=Raw Cerite Ore
+item.crushedCentrifugedCerite.name=Centrifuged Crushed Cerite Ore
+item.crushedPurifiedCerite.name=Purified Crushed Cerite Ore
+item.dustImpureCerite.name=Impure Cerite Dust
+item.dustPureCerite.name=Purified Cerite Dust
+item.itemDustFluorcaphite.name=Fluorcaphite Dust
+item.itemDustTinyFluorcaphite.name=Tiny Pile of Fluorcaphite Dust
+item.itemDustSmallFluorcaphite.name=Small Pile of Fluorcaphite Dust
+item.crushedFluorcaphite.name=Crushed Fluorcaphite Ore
+item.oreRawFluorcaphite.name=Raw Fluorcaphite Ore
+item.crushedCentrifugedFluorcaphite.name=Centrifuged Crushed Fluorcaphite Ore
+item.crushedPurifiedFluorcaphite.name=Purified Crushed Fluorcaphite Ore
+item.dustImpureFluorcaphite.name=Impure Fluorcaphite Dust
+item.dustPureFluorcaphite.name=Purified Fluorcaphite Dust
+item.itemDustFlorencite.name=Florencite Dust
+item.itemDustTinyFlorencite.name=Tiny Pile of Florencite Dust
+item.itemDustSmallFlorencite.name=Small Pile of Florencite Dust
+item.crushedFlorencite.name=Crushed Florencite Ore
+item.oreRawFlorencite.name=Raw Florencite Ore
+item.crushedCentrifugedFlorencite.name=Centrifuged Crushed Florencite Ore
+item.crushedPurifiedFlorencite.name=Purified Crushed Florencite Ore
+item.dustImpureFlorencite.name=Impure Florencite Dust
+item.dustPureFlorencite.name=Purified Florencite Dust
+item.itemDustCryoliteF.name=Cryolite (F) Dust
+item.itemDustTinyCryoliteF.name=Tiny Pile of Cryolite (F) Dust
+item.itemDustSmallCryoliteF.name=Small Pile of Cryolite (F) Dust
+item.crushedCryoliteF.name=Crushed Cryolite (F) Ore
+item.oreRawCryoliteF.name=Raw Cryolite (F) Ore
+item.crushedCentrifugedCryoliteF.name=Centrifuged Crushed Cryolite (F) Ore
+item.crushedPurifiedCryoliteF.name=Purified Crushed Cryolite (F) Ore
+item.dustImpureCryoliteF.name=Impure Cryolite (F) Dust
+item.dustPureCryoliteF.name=Purified Cryolite (F) Dust
+item.itemDustTinyYellorium.name=Tiny Pile of Yellorium Dust
+item.itemDustSmallYellorium.name=Small Pile of Yellorium Dust
+item.crushedYellorium.name=Crushed Yellorium Ore
+item.oreRawYellorium.name=Raw Yellorium Ore
+item.crushedCentrifugedYellorium.name=Centrifuged Crushed Yellorium Ore
+item.crushedPurifiedYellorium.name=Purified Crushed Yellorium Ore
+item.dustImpureYellorium.name=Impure Yellorium Dust
+item.dustPureYellorium.name=Purified Yellorium Dust
+
+//Shards
+item.itemDrained.name=Drained Shard
+item.itemAer.name=Aer Shard
+item.itemIgnis.name=Ignis Shard
+item.itemTerra.name=Terra Shard
+item.itemAqua.name=Aqua Shard
+item.itemDustInfusedAir.name=Infused Air Dust
+item.itemDustInfusedFire.name=Infused Fire Dust
+item.itemDustInfusedEarth.name=Infused Earth Dust
+item.itemDustInfusedWater.name=Infused Water Dust
+
+
+//Misc Material Items
+item.itemDustLithiumCarbonate.name=Lithium Carbonate Dust
+item.itemDustSmallLithiumCarbonate.name=Small Pile of Lithium Carbonate Dust
+item.itemDustTinyLithiumCarbonate.name=Tiny Pile of Lithium Carbonate Dust
+item.itemDustLithiumPeroxide.name=Lithium Peroxide Dust
+item.itemDustSmallLithiumPeroxide.name=Small Pile of Lithium Peroxide Dust
+item.itemDustTinyLithiumPeroxide.name=Tiny Pile of Lithium Peroxide Dust
+item.itemDustLithiumHydroxide.name=Lithium Hydroxide Dust
+item.itemDustSmallLithiumHydroxide.name=Small Pile of Lithium Hydroxide Dust
+item.itemDustTinyLithiumHydroxide.name=Tiny Pile of Lithium Hydroxide Dust
+item.itemDustCalciumHydroxide.name=Hydrated Lime Dust
+item.itemDustSmallCalciumHydroxide.name=Small Pile of Hydrated Lime Dust
+item.itemDustTinyCalciumHydroxide.name=Tiny Pile of Hydrated Lime Dust
+item.itemDustCalciumCarbonate.name=Calcium Carbonate Dust
+item.itemDustSmallCalciumCarbonate.name=Small Pile of Calcium Carbonate Dust
+item.itemDustTinyCalciumCarbonate.name=Tiny Pile of Calcium Carbonate Dust
+item.itemDustGypsum.name=Calcium Sulfate (Gypsum) Dust
+item.itemDustSmallGypsum.name=Small Pile of Calcium Sulfate (Gypsum) Dust
+item.itemDustTinyGypsum.name=Tiny Pile of Calcium Sulfate (Gypsum) Dust
+item.itemDustLi2CO3CaOH2.name=Li2CO3 + Ca(OH)2 Compound Dust
+item.itemDustSmallLi2CO3CaOH2.name=Small Pile of Li2CO3 + Ca(OH)2 Compound Dust
+item.itemDustTinyLi2CO3CaOH2.name=Tiny Pile of Li2CO3 + Ca(OH)2 Compound Dust
+item.itemDustLi2BeF4.name=Li2BeF4 Fuel Compound Dust
+item.itemDustSmallLi2BeF4.name=Small Pile of Li2BeF4 Fuel Compound Dust
+item.itemDustTinyLi2BeF4.name=Tiny Pile of Li2BeF4 Fuel Compound Dust
+item.Li2BeF4.name=Li2BeF4 Cell
+item.itemCircuitLFTR.name=§aControl Circuit
+item.itemZirconiumPellet.name=Zirconium Pellet [ZrCl₄]
+item.itemDustZrCl4.name=ZrCl4 Dust
+item.itemDustSmallZrCl4.name=Small Pile of ZrCl4 Dust
+item.itemDustTinyZrCl4.name=Tiny Pile of ZrCl4 Dust
+item.itemDustCookedZrCl4.name=Cooked ZrCl4 Dust
+item.itemDustSmallCookedZrCl4.name=Small Pile of Cooked ZrCl4 Dust
+item.itemDustTinyCookedZrCl4.name=Tiny Pile of Cooked ZrCl4 Dust
+item.itemDustUN18Fertiliser.name=UN-18 Fertiliser Dust
+item.itemDustSmallUN18Fertiliser.name=Small Pile of UN-18 Fertiliser Dust
+item.itemDustTinyUN18Fertiliser.name=Tiny Pile of UN-18 Fertiliser Dust
+item.itemDustUN32Fertiliser.name=UN-32 Fertiliser Dust
+item.itemDustSmallUN32Fertiliser.name=Small Pile of UN-32 Fertiliser Dust
+item.itemDustTinyUN32Fertiliser.name=Tiny Pile of UN-32 Fertiliser Dust
+item.itemCustomMetaCover.miscutils.GtMachineCasings=%s Machine Plate Cover
+item.itemGregtechPump.tooltip.0=Cannot drain any other standard fluid container block
+item.itemGregtechPump.tooltip.1=Cannot be emptied via RMB, use inside a tank with GUI
+item.itemGregtechPump.tooltip.2=This is technically just a fancy fluid cell
+item.itemGregtechPump.tooltip.3=No Fluids Contained
+item.itemBaseEuItem.tooltip.0=§eElectric
+item.itemBaseEuItem.tooltip.1=Contains %d EU Tier: %d
+item.itemBaseEuItem.tooltip.2=Empty. You should recycle it properly.
+item.itemBaseEuItem.tooltip.3=%d / %d EU - Voltage: %d
+item.itemDebugClearing.name=Debug Square [%d]
+item.itemDebugClearing.0.tooltip=Mode: Clear
+item.itemDebugClearing.1.tooltip=Mode: Fill
+
+//Multitools
+item.AluminiumMultipick.name=Aluminium Multipick
+item.AluminiumMultispade.name=Aluminium Multispade
+item.BerylliumMultispade.name=Beryllium Multispade
+item.BismuthMultispade.name=Bismuth Multispade
+item.CarbonMultispade.name=Carbon Multispade
+item.ChromeMultipick.name=Chrome Multipick
+item.ChromeMultispade.name=Chrome Multispade
+item.CobaltMultipick.name=Cobalt Multipick
+item.CobaltMultispade.name=Cobalt Multispade
+item.GoldMultispade.name=Gold Multispade
+item.IridiumMultipick.name=Iridium Multipick
+item.IridiumMultispade.name=Iridium Multispade
+item.IronMultipick.name=Iron Multipick
+item.IronMultispade.name=Iron Multispade
+item.LeadMultispade.name=Lead Multispade
+item.ManganeseMultipick.name=Manganese Multipick
+item.ManganeseMultispade.name=Manganese Multispade
+item.MolybdenumMultipick.name=Molybdenum Multipick
+item.MolybdenumMultispade.name=Molybdenum Multispade
+item.NeodymiumMultipick.name=Neodymium Multipick
+item.NeodymiumMultispade.name=Neodymium Multispade
+item.NeutroniumMultipick.name=Neutronium Multipick
+item.NeutroniumMultispade.name=Neutronium Multispade
+item.NickelMultispade.name=Nickel Multispade
+item.OsmiumMultipick.name=Osmium Multipick
+item.OsmiumMultispade.name=Osmium Multispade
+item.PalladiumMultipick.name=Palladium Multipick
+item.PalladiumMultispade.name=Palladium Multispade
+item.PlatinumMultispade.name=Platinum Multispade
+item.Plutonium241Multipick.name=Plutonium 241 Multipick
+item.Plutonium241Multispade.name=Plutonium 241 Multispade
+item.SilverMultispade.name=Silver Multispade
+item.ThoriumMultipick.name=Thorium Multipick
+item.ThoriumMultispade.name=Thorium Multispade
+item.TitaniumMultipick.name=Titanium Multipick
+item.TitaniumMultispade.name=Titanium Multispade
+item.TungstenMultipick.name=Tungsten Multipick
+item.TungstenMultispade.name=Tungsten Multispade
+item.Uranium235Multipick.name=Uranium 235 Multipick
+item.Uranium235Multispade.name=Uranium 235 Multispade
+item.DarkSteelMultipick.name=Dark Steel Multipick
+item.DarkSteelMultispade.name=Dark Steel Multispade
+item.DuraniumMultipick.name=Duranium Multipick
+item.DuraniumMultispade.name=Duranium Multispade
+item.InfusedGoldMultispade.name=Infused Gold Multispade
+item.NaquadahMultipick.name=Naquadah Multipick
+item.NaquadahMultispade.name=Naquadah Multispade
+item.NaquadahAlloyMultipick.name=Naquadah Alloy Multipick
+item.NaquadahAlloyMultispade.name=Naquadah Alloy Multispade
+item.NaquadriaMultipick.name=Naquadria Multipick
+item.NaquadriaMultispade.name=Naquadria Multispade
+item.TritaniumMultipick.name=Tritanium Multipick
+item.TritaniumMultispade.name=Tritanium Multispade
+item.OsmiridiumMultipick.name=Osmiridium Multipick
+item.OsmiridiumMultispade.name=Osmiridium Multispade
+item.BrassMultispade.name=Brass Multispade
+item.BronzeMultipick.name=Bronze Multipick
+item.BronzeMultispade.name=Bronze Multispade
+item.CupronickelMultispade.name=Cupronickel Multispade
+item.ElectrumMultispade.name=Electrum Multispade
+item.InvarMultipick.name=Invar Multipick
+item.InvarMultispade.name=Invar Multispade
+item.KanthalMultispade.name=Kanthal Multispade
+item.MagnaliumMultipick.name=Magnalium Multipick
+item.MagnaliumMultispade.name=Magnalium Multispade
+item.NichromeMultispade.name=Nichrome Multispade
+item.PigIronMultipick.name=Pig Iron Multipick
+item.PigIronMultispade.name=Pig Iron Multispade
+item.PolycaprolactamMultispade.name=Polycaprolactam Multispade
+item.PolytetrafluoroethyleneMultispade.name=Polytetrafluoroethylene Multispade
+item.NickelZincFerriteMultispade.name=Nickel-Zinc Ferrite Multispade
+item.PolyphenyleneSulfideMultispade.name=Polyphenylene Sulfide Multispade
+item.StainlessSteelMultipick.name=Stainless Steel Multipick
+item.StainlessSteelMultispade.name=Stainless Steel Multispade
+item.SteelMultipick.name=Steel Multipick
+item.SteelMultispade.name=Steel Multispade
+item.TinAlloyMultispade.name=Tin Alloy Multispade
+item.UltimetMultipick.name=Ultimet Multipick
+item.UltimetMultispade.name=Ultimet Multispade
+item.WroughtIronMultipick.name=Wrought Iron Multipick
+item.WroughtIronMultispade.name=Wrought Iron Multispade
+item.SterlingSilverMultipick.name=Sterling Silver Multipick
+item.SterlingSilverMultispade.name=Sterling Silver Multispade
+item.RoseGoldMultipick.name=Rose Gold Multipick
+item.RoseGoldMultispade.name=Rose Gold Multispade
+item.BlackBronzeMultipick.name=Black Bronze Multipick
+item.BlackBronzeMultispade.name=Black Bronze Multispade
+item.BismuthBronzeMultipick.name=Bismuth Bronze Multipick
+item.BismuthBronzeMultispade.name=Bismuth Bronze Multispade
+item.BlackSteelMultipick.name=Black Steel Multipick
+item.BlackSteelMultispade.name=Black Steel Multispade
+item.RedSteelMultipick.name=Red Steel Multipick
+item.RedSteelMultispade.name=Red Steel Multispade
+item.BlueSteelMultipick.name=Blue Steel Multipick
+item.BlueSteelMultispade.name=Blue Steel Multispade
+item.DamascusSteelMultipick.name=Damascus Steel Multipick
+item.DamascusSteelMultispade.name=Damascus Steel Multispade
+item.MithrilMultispade.name=Mithril Multispade
+item.CobaltBrassMultipick.name=Cobalt Brass Multipick
+item.CobaltBrassMultispade.name=Cobalt Brass Multispade
+item.ThaumiumMultipick.name=Thaumium Multipick
+item.ThaumiumMultispade.name=Thaumium Multispade
+item.HSSGMultipick.name=HSS-G Multipick
+item.HSSGMultispade.name=HSS-G Multispade
+item.HSSEMultipick.name=HSS-E Multipick
+item.HSSEMultispade.name=HSS-E Multispade
+item.HSSSMultipick.name=HSS-S Multipick
+item.HSSSMultispade.name=HSS-S Multispade
+item.HastelloyC276Multipick.name=Hastelloy-C276 Multipick
+item.HastelloyC276Multispade.name=Hastelloy-C276 Multispade
+item.HastelloyNMultipick.name=Hastelloy-N Multipick
+item.HastelloyNMultispade.name=Hastelloy-N Multispade
+item.HastelloyWMultipick.name=Hastelloy-W Multipick
+item.HastelloyWMultispade.name=Hastelloy-W Multispade
+item.HastelloyXMultipick.name=Hastelloy-X Multipick
+item.HastelloyXMultispade.name=Hastelloy-X Multispade
+item.Incoloy020Multipick.name=Incoloy-020 Multipick
+item.Incoloy020Multispade.name=Incoloy-020 Multispade
+item.IncoloyDSMultipick.name=Incoloy-DS Multipick
+item.IncoloyDSMultispade.name=Incoloy-DS Multispade
+item.IncoloyMA956Multipick.name=Incoloy-MA956 Multipick
+item.IncoloyMA956Multispade.name=Incoloy-MA956 Multispade
+item.Inconel625Multipick.name=Inconel-625 Multipick
+item.Inconel625Multispade.name=Inconel-625 Multispade
+item.Inconel690Multipick.name=Inconel-690 Multipick
+item.Inconel690Multispade.name=Inconel-690 Multispade
+item.Inconel792Multipick.name=Inconel-792 Multipick
+item.Inconel792Multispade.name=Inconel-792 Multispade
+item.GrisiumMultipick.name=Grisium Multipick
+item.GrisiumMultispade.name=Grisium Multispade
+item.Tantalloy60Multipick.name=Tantalloy-60 Multipick
+item.Tantalloy60Multispade.name=Tantalloy-60 Multispade
+item.Tantalloy61Multipick.name=Tantalloy-61 Multipick
+item.Tantalloy61Multispade.name=Tantalloy-61 Multispade
+item.StaballoyMultipick.name=Staballoy Multipick
+item.StaballoyMultispade.name=Staballoy Multispade
+item.QuantumMultipick.name=Quantum Multipick
+item.QuantumMultispade.name=Quantum Multispade
+item.PotinMultipick.name=Potin Multipick
+item.PotinMultispade.name=Potin Multispade
+item.TumbagaMultipick.name=Tumbaga Multipick
+item.TumbagaMultispade.name=Tumbaga Multispade
+item.TaloniteMultipick.name=Talonite Multipick
+item.TaloniteMultispade.name=Talonite Multispade
+item.StelliteMultipick.name=Stellite Multipick
+item.StelliteMultispade.name=Stellite Multispade
+item.TungstenCarbideMultipick.name=Tungsten Carbide Multipick
+item.TungstenCarbideMultispade.name=Tungsten Carbide Multispade
+item.TantalumCarbideMultipick.name=Tantalum Carbide Multipick
+item.TantalumCarbideMultispade.name=Tantalum Carbide Multispade
+
+
+//Items that Don't fit into another category
+
+//Plates
+item.itemPlateClay.name=Clay Plate
+item.itemPlateDoubleClay.name=Double Clay Plate
+item.itemPlateLithium.name=Lithium Plate
+item.itemPlateDoubleEuropium.name=Double Europium Plate
+
+//Gears
+item.itemSmallGearWroughtIron.name=Small Wrought Iron Gear
+
+//Misc
+item.itemFoilUranium235.name=Uranium 235 Foil
+
+item.itemBoilerChassis_0.name=Advanced Boiler Chassis [Tier 1]
+item.itemDehydratorCoilWire_0.name=Coil Wire [EV]
+item.itemDehydratorCoil_0.name=Dehydrator Coil [EV]
+item.itemAirFilter_0.name=Air Filter
+item.itemAirFilter_1.name=Air Filter
+item.itemDragonJar.name=Dragon Capture Jar
+item.CoalGas.name=Coal Gas Cell
+item.Ethylbenzene.name=Ethylbenzene Cell
+item.Anthracene.name=Anthracene Cell
+item.Toluene.name=Toluene Cell
+item.CoalTar.name=Coal Tar Cell
+item.CoalTarOil.name=Coal Tar Oil Cell
+item.SulfuricCoalTarOil.name=Sulfuric Coal Tar Oil Cell
+item.Naphthalene.name=Naphthalene Cell
+item.itemDustPhthalicAnhydride.name=Phthalic Anhydride Dust
+item.itemDustSmallPhthalicAnhydride.name=Small Pile of Phthalic Anhydride Dust
+item.itemDustTinyPhthalicAnhydride.name=Tiny Pile of Phthalic Anhydride Dust
+item.2Ethylanthraquinone.name=2-Ethylanthraquinone Cell
+item.2Ethylanthrahydroquinone.name=2-Ethylanthrahydroquinone Cell
+item.HydrogenPeroxide.name=Hydrogen Peroxide Cell
+item.itemDustLithiumHydroperoxide.name=Lithium Hydroperoxide Dust
+item.itemDustSmallLithiumHydroperoxide.name=Small Pile of Lithium Hydroperoxide Dust
+item.itemDustTinyLithiumHydroperoxide.name=Tiny Pile of Lithium Hydroperoxide Dust
+item.LithiumPeroxide.name=Lithium Peroxide Cell
+item.itemPotionChilly.name=Chilly Potion
+item.itemKeyBig4000DC's.name=4000DC's Big Key
+item.itemGemDull.name=Dull Gemstone
+item.itemMushroomForest.name=Forest Mushroom
+item.itemPlateVanadium.name=Vanadium Plate
+item.thekeytothecity.name=The Key to the City
+item.modularbauble.name=Modular Bauble
+item.itemDustSoularium.name=Soularium Dust
+item.itemDustSmallSoularium.name=Small Pile of Soularium Dust
+item.itemDustTinySoularium.name=Tiny Pile of Soularium Dust
+item.itemDustRedstoneAlloy.name=Redstone Alloy Dust
+item.itemDustSmallRedstoneAlloy.name=Small Pile of Redstone Alloy Dust
+item.itemDustTinyRedstoneAlloy.name=Tiny Pile of Redstone Alloy Dust
+item.itemDustElectricalSteel.name=Electrical Steel Dust
+item.itemDustSmallElectricalSteel.name=Small Pile of Electrical Steel Dust
+item.itemDustTinyElectricalSteel.name=Tiny Pile of Electrical Steel Dust
+item.itemDustPulsatingIron.name=Pulsating Iron Dust
+item.itemDustSmallPulsatingIron.name=Small Pile of Pulsating Iron Dust
+item.itemDustTinyPulsatingIron.name=Tiny Pile of Pulsating Iron Dust
+item.itemDustEnergeticAlloy.name=Energetic Alloy Dust
+item.itemDustSmallEnergeticAlloy.name=Small Pile of Energetic Alloy Dust
+item.itemDustTinyEnergeticAlloy.name=Tiny Pile of Energetic Alloy Dust
+item.itemDustVibrantAlloy.name=Vibrant Alloy Dust
+item.itemDustSmallVibrantAlloy.name=Small Pile of Vibrant Alloy Dust
+item.itemDustTinyVibrantAlloy.name=Tiny Pile of Vibrant Alloy Dust
+item.itemDustConductiveIron.name=Conductive Iron Dust
+item.itemDustSmallConductiveIron.name=Small Pile of Conductive Iron Dust
+item.itemDustTinyConductiveIron.name=Tiny Pile of Conductive Iron Dust
+item.itemPlateSoularium.name=Soularium plate
+item.itemPlateRedstoneAlloy.name=Redstone Alloy plate
+item.itemPlateElectricalSteel.name=Electrical Steel plate
+item.itemPlatePhasedIron.name=Phased Iron plate
+item.itemPlateEnergeticAlloy.name=Energetic Alloy plate
+item.itemPlateVibrantAlloy.name=Vibrant Alloy plate
+item.itemPlateConductiveIron.name=Conductive Iron plate
+item.itemPlateBlutonium.name=Blutonium plate
+item.itemPlateCyanite.name=Cyanite plate
+item.itemPlateLudicrite.name=Ludicrite plate
+item.itemPlateVoid.name=Void plate
+item.itemPlateDimensionShard.name=Dimensional Shard plate
+item.rfEUBattery.name=Universally Chargeable Battery
+item.rfEUBattery.tooltip.0=§eIC2/EU Information§7);
+item.rfEUBattery.tooltip.1=§7Tier: [§e%d§7] Current Power: [§e%d§7/EU]
+item.rfEUBattery.tooltip.2=§7Transfer Limit: [§e%d§7Eu/t] Burn Time: [§e%d§7s]
+item.rfEUBattery.tooltip.3=§cRF Information§7
+item.rfEUBattery.tooltip.4=§7Extraction Rate: [§%d§7Rf/t] Insert Rate: [§c%d§7Rf/t]
+item.rfEUBattery.tooltip.5=§7Current Charge: [§c%d§7Rf / %dRf] §c%.2f%%§7
+item.personalCloakingDevice.name=§9Personal Cloaking Device§7
+item.personalCloakingDevice.tooltip.0=§aWorn as a Belt within Baubles.§7
+item.personalCloakingDevice.tooltip.1=§aDrains 10,000EU/t to provide invisibility.§7
+item.personalCloakingDevice.tooltip.2=§6IC2/EU Information§7
+item.personalCloakingDevice.tooltip.3=§7Tier: [§e%d§7] Input Limit: [§e%d§7EU/t]
+item.personalCloakingDevice.tooltip.4=§7Current Power: [§e%d§7EU] [§e%.2f%%§7]
+item.personalCloakingDevice.tooltip.5=§7Time Remaining: [§e%d§7 seconds]
+item.personalHealingDevice.name=§9Personal Healing NanoBooster§r
+item.SlowBuildingRing.name=§eSlow Building Ring§7
+item.SlowBuildingRing.tooltip.0=§aWorn as a Ring within Baubles. Prevents you from sprinting.§7
+item.SlowBuildingRing.tooltip.1=§aMovement speed reduced to crouch speed.§7
+item.SlowBuildingRing.tooltip.2=§aPress shift while worn to toggle crouch on/off.§7
+item.itemBufferCore1.name=Energy Core [ULV].
+item.itemBufferCore2.name=Energy Core [LV].
+item.itemBufferCore3.name=Energy Core [MV].
+item.itemBufferCore4.name=Energy Core [HV].
+item.itemBufferCore5.name=Energy Core [EV].
+item.itemBufferCore6.name=Energy Core [IV].
+item.itemBufferCore7.name=Energy Core [LuV].
+item.itemBufferCore8.name=Energy Core [ZPM].
+item.itemBufferCore9.name=Energy Core [UV].
+item.itemBufferCore10.name=Energy Core [MAX].
+item.itembookgt.name=§oThermal Boiler Manual
+
+// Everglade Items
+item.everglades.trigger.name=§6Alkalus Disk [§cActivated§6]
+
+
+
+
+
+
+
+//Blocks
+tile.blockRainforestOakLog.name=Rainforest Oak
+tile.blockRainforestOakLeaves.name=Oak Leaves
+tile.blockRainforestOakSapling.name=Rainforest Oak Sapling
+tile.blockPineLogLog.name=Pine Log
+tile.blockPineLeaves.name=Pine Leaves
+tile.blockPineSapling.name=Pine Sapling
+
+//TC Stuff
+tile.blockFastAlchemyFurnace.0.name=Broken
+tile.blockFastArcaneAlembic.1.name=Broken
+
+//Frame Boxes
+tile.Block of Selenium.name=Block of Selenium
+tile.Selenium Frame Box.name=Selenium Frame Box
+tile.Block of Bromine.name=Block of Bromine
+tile.Block of Strontium.name=Block of Strontium
+tile.Strontium Frame Box.name=Strontium Frame Box
+tile.Block of Zirconium.name=Block of Zirconium
+tile.Zirconium Frame Box.name=Zirconium Frame Box
+tile.Block of Ruthenium.name=Block of Ruthenium
+tile.Ruthenium Frame Box.name=Ruthenium Frame Box
+tile.Block of Iodine.name=Block of Iodine
+tile.Iodine Frame Box.name=Iodine Frame Box
+tile.Block of Hafnium.name=Block of Hafnium
+tile.Hafnium Frame Box.name=Hafnium Frame Box
+tile.Block of Dysprosium.name=Block of Dysprosium
+tile.Dysprosium Frame Box.name=Dysprosium Frame Box
+tile.Block of Tellurium.name=Block of Tellurium
+tile.Tellurium Frame Box.name=Tellurium Frame Box
+tile.Block of Rhodium.name=Block of Rhodium
+tile.Rhodium Frame Box.name=Rhodium Frame Box
+tile.Block of Rhenium.name=Block of Rhenium
+tile.Rhenium Frame Box.name=Rhenium Frame Box
+tile.Block of Thallium.name=Block of Thallium
+tile.Thallium Frame Box.name=Thallium Frame Box
+tile.Block of Technetium.name=Block of Technetium
+tile.Block of Polonium.name=Block of Polonium
+tile.Block of Astatine.name=Block of Astatine
+tile.Block of Francium.name=Block of Francium
+tile.Block of Radium.name=Block of Radium
+tile.Block of Actinium.name=Block of Actinium
+tile.Block of Protactinium.name=Block of Protactinium
+tile.Block of Neptunium.name=Block of Neptunium
+tile.Block of Curium.name=Block of Curium
+tile.Block of Berkelium.name=Block of Berkelium
+tile.Block of Californium.name=Block of Californium
+tile.Block of Einsteinium.name=Block of Einsteinium
+tile.Block of Fermium.name=Block of Fermium
+tile.Block of Thorium 232.name=Block of Thorium 232
+tile.Block of Uranium 232.name=Block of Uranium 232
+tile.Block of Uranium 233.name=Block of Uranium 233
+tile.Block of Plutonium-238.name=Block of Plutonium 238
+tile.Block of Strontium-90.name=Block of Strontium 90
+tile.Block of Polonium-210.name=Block of Polonium 210
+tile.Block of Americium-241.name=Block of Americium 241
+tile.Block of Silicon Carbide.name=Block of Silicon Carbide
+tile.Silicon Carbide Frame Box.name=Silicon Carbide Frame Box
+tile.Block of Zirconium Carbide.name=Block of Zirconium Carbide
+tile.Zirconium Carbide Frame Box.name=Zirconium Carbide Frame Box
+tile.Block of Tantalum Carbide.name=Block of Tantalum Carbide
+tile.Tantalum Carbide Frame Box.name=Tantalum Carbide Frame Box
+tile.Block of Niobium Carbide.name=Block of Niobium Carbide
+tile.Niobium Carbide Frame Box.name=Niobium Carbide Frame Box
+tile.Block of Beryllium Fluoride.name=Block of Beryllium Fluoride
+tile.Block of Lithium Fluoride.name=Block of Lithium Fluoride
+tile.Block of Thorium Tetrafluoride.name=Block of Thorium Tetrafluoride
+tile.Block of Thorium Hexafluoride.name=Block of Thorium Hexafluoride
+tile.Block of Uranium Tetrafluoride.name=Block of Uranium Tetrafluoride
+tile.Block of Uranium Hexafluoride.name=Block of Uranium Hexafluoride
+tile.Block of Zirconium Tetrafluoride.name=Block of Zirconium Tetrafluoride
+tile.Block of Neptunium Hexafluoride.name=Block of Neptunium Hexafluoride
+tile.Block of Technetium Hexafluoride.name=Block of Technetium Hexafluoride
+tile.Block of Selenium Hexafluoride.name=Block of Selenium Hexafluoride
+tile.Block of LiFBeF2ZrF4U235.name=Block of LiFBeF2ZrF4U235
+tile.Block of LiFBeF2ZrF4UF4.name=Block of LiFBeF2ZrF4UF4
+tile.Block of LiFBeF2ThF4UF4.name=Block of LiFBeF2ThF4UF4
+tile.Block of Energy Crystal.name=Block of Energy Crystal
+tile.Energy Crystal Frame Box.name=Energy Crystal Frame Box
+tile.Block of Blood Steel.name=Block of Blood Steel
+tile.Blood Steel Frame Box.name=Blood Steel Frame Box
+tile.Block of Zeron-100.name=Block of Zeron-100
+tile.Zeron-100 Frame Box.name=Zeron-100 Frame Box
+tile.Block of Tumbaga.name=Block of Tumbaga
+tile.Tumbaga Frame Box.name=Tumbaga Frame Box
+tile.Block of Potin.name=Block of Potin
+tile.Potin Frame Box.name=Potin Frame Box
+tile.Block of Staballoy.name=Block of Staballoy
+tile.Staballoy Frame Box.name=Staballoy Frame Box
+tile.Block of Tantalloy-60.name=Block of Tantalloy-60
+tile.Tantalloy-60 Frame Box.name=Tantalloy-60 Frame Box
+tile.Block of Tantalloy-61.name=Block of Tantalloy-61
+tile.Tantalloy-61 Frame Box.name=Tantalloy-61 Frame Box
+tile.Block of Inconel-625.name=Block of Inconel-625
+tile.Inconel-625 Frame Box.name=Inconel-625 Frame Box
+tile.Block of Inconel-690.name=Block of Inconel-690
+tile.Inconel-690 Frame Box.name=Inconel-690 Frame Box
+tile.Block of Inconel-792.name=Block of Inconel-792
+tile.Inconel-792 Frame Box.name=Inconel-792 Frame Box
+tile.Block of Eglin Steel.name=Block of Eglin Steel
+tile.Eglin Steel Frame Box.name=Eglin Steel Frame Box
+tile.Block of Maraging Steel 250.name=Block of Maraging Steel 250
+tile.Maraging Steel 250 Frame Box.name=Maraging Steel 250 Frame Box
+tile.Block of Maraging Steel 300.name=Block of Maraging Steel 300
+tile.Maraging Steel 300 Frame Box.name=Maraging Steel 300 Frame Box
+tile.Block of Maraging Steel 350.name=Block of Maraging Steel 350
+tile.Maraging Steel 350 Frame Box.name=Maraging Steel 350 Frame Box
+tile.Block of Stellite.name=Block of Stellite
+tile.Stellite Frame Box.name=Stellite Frame Box
+tile.Block of Talonite.name=Block of Talonite
+tile.Talonite Frame Box.name=Talonite Frame Box
+tile.Block of Hastelloy-W.name=Block of Hastelloy-W
+tile.Hastelloy-W Frame Box.name=Hastelloy-W Frame Box
+tile.Block of Hastelloy-X.name=Block of Hastelloy-X
+tile.Hastelloy-X Frame Box.name=Hastelloy-X Frame Box
+tile.Block of Hastelloy-C276.name=Block of Hastelloy-C276
+tile.Hastelloy-C276 Frame Box.name=Hastelloy-C276 Frame Box
+tile.Block of Hastelloy-N.name=Block of Hastelloy-N
+tile.Hastelloy-N Frame Box.name=Hastelloy-N Frame Box
+tile.Block of Incoloy-020.name=Block of Incoloy-020
+tile.Incoloy-020 Frame Box.name=Incoloy-020 Frame Box
+tile.Block of Incoloy-DS.name=Block of Incoloy-DS
+tile.Incoloy-DS Frame Box.name=Incoloy-DS Frame Box
+tile.Block of Incoloy-MA956.name=Block of Incoloy-MA956
+tile.Incoloy-MA956 Frame Box.name=Incoloy-MA956 Frame Box
+tile.Block of Grisium.name=Block of Grisium
+tile.Grisium Frame Box.name=Grisium Frame Box
+tile.Block of Trinium.name=Block of Trinium
+tile.Block of Refined Trinium.name=Block of Refined Trinium
+tile.Block of Trinium Titanium Alloy.name=Block of Trinium Titanium Alloy
+tile.Trinium Titanium Alloy Frame Box.name=Trinium Titanium Alloy Frame Box
+tile.Block of Trinium Naquadah Alloy.name=Block of Trinium Naquadah Alloy
+tile.Block of Trinium Naquadah Carbonite.name=Block of Trinium Naquadah Carbonite
+tile.Trinium Naquadah Carbonite Frame Box.name=Trinium Naquadah Carbonite Frame Box
+tile.Block of Quantum.name=Block of Quantum
+tile.Quantum Frame Box.name=Quantum Frame Box
+
+//Ores
+tile.OreFluoriteF.name=Fluorite (F) Ore
+tile.OreCrocoite.name=Crocoite Ore
+tile.OreGeikielite.name=Geikielite Ore
+tile.OreNichromite.name=Nichromite Ore
+tile.OreTitanite.name=Titanite Ore
+tile.OreZimbabweite.name=Zimbabweite Ore
+tile.OreZirconolite.name=Zirconolite Ore
+tile.OreGadoliniteCe.name=Gadolinite (Ce) Ore
+tile.OreGadoliniteY.name=Gadolinite (Y) Ore
+tile.OreLepersonnite.name=Lepersonnite Ore
+tile.OreSamarskiteY.name=Samarskite (Y) Ore
+tile.OreSamarskiteYb.name=Samarskite (Yb) Ore
+tile.OreXenotime.name=Xenotime Ore
+tile.OreYttriaite.name=Yttriaite Ore
+tile.OreYttrialite.name=Yttrialite Ore
+tile.OreYttrocerite.name=Yttrocerite Ore
+tile.OreZircon.name=Zircon Ore
+tile.OrePolycrase.name=Polycrase Ore
+tile.OreZircophyllite.name=Zircophyllite Ore
+tile.OreZirkelite.name=Zirkelite Ore
+tile.OreLanthaniteLa.name=Lanthanite (La) Ore
+tile.OreLanthaniteCe.name=Lanthanite (Ce) Ore
+tile.OreLanthaniteNd.name=Lanthanite (Nd) Ore
+tile.OreAgarditeY.name=Agardite (Y) Ore
+tile.OreAgarditeCd.name=Agardite (Cd) Ore
+tile.OreAgarditeLa.name=Agardite (La) Ore
+tile.OreAgarditeNd.name=Agardite (Nd) Ore
+tile.OreHibonite.name=Hibonite Ore
+tile.OreCerite.name=Cerite Ore
+tile.OreFluorcaphite.name=Fluorcaphite Ore
+tile.OreFlorencite.name=Florencite Ore
+tile.OreCryoliteF.name=Cryolite (F) Ore
+
+//Misc
+tile.blockMFEffect.name=Special
+tile.fluidBlockSludge.name=Sludge
+tile.blockWorkbenchGT.name=Workbench
+tile.blockWorkbenchGTAdvanced.name=Advanced Workbench
+tile.blockHeliumGenerator.name=Helium Generator
+tile.blockFirePit.name=Fire Pit
+tile.blockFishTrap.name=Fish Catcher
+tile.blockInfiniteFluidTank.name=Infinite Fluid Tank
+tile.blockMiningExplosives.name=Mining Explosives
+tile.blockHellFire.name=Hellish Fire
+tile.blockProjectBench.name=Project Table
+tile.blockTradeBench.name=Trade Bench
+tile.blockModularity.name=Modularity Bench
+tile.blockBlackGate.name=Wither Cage
+tile.blockTankXpConverter.name=Experience Converter
+
+//Everglades Blocks
+tile.blockDarkWorldPortal.name=A Glimpse of the Future
+tile.blockDarkWorldGround.name=Unstable Earth
+tile.blockDarkWorldGround2.name=Polluted Soil
+tile.blockDarkWorldGround2.2.name=Highly Polluted Soil
+tile.blockDarkWorldPortalFrame.name=Containment Frame
+
+
+//Added 1/4/18
+tile.blockMiningPipeFake.name=Strengthened Mining Pipe
+tile.blockMiningHeadFake.name=Bedrock Drill
+item.itemPlateMeatRaw.name=Fleshy Panel
+tile.Block of MeatRaw.name=Block of Raw Meat
+
+//Added 26/5/18
+item.BurntLiFBeF2ThF4UF4.name=Cell of Used Reactor Fuel [LiFBeF2ThF4UF4]
+item.BurntLiFBeF2ZrF4UF4.name=Cell of Used Reactor Fuel [LiFBeF2ZrF4UF4]
+item.BurntLiFBeF2ZrF4U235.name=Cell of Used Reactor Fuel [LiFBeF2ZrF4U235]
+item.itemBigEgg.name= ounce Chicken Egg
+item.itemPlateSodium.name=Sodium Plate
+
+item.itemNuggetPromethium.name=Promethium Nugget
+item.itemIngotPromethium.name=Promethium Ingot
+item.itemDustSmallPromethium.name=Small Pile of Promethium
+item.itemDustTinyPromethium.name=Tiny Pile of Promethium
+item.itemDustPromethium.name=Promethium Dust
+tile.Block of Promethium.name=Block of Promethium
+
+item.itemCellAmericium241.name=Americium 241 Cell
+item.itemCellPolonium210.name=Polonium 210 Cell
+item.itemCellStrontium90.name=Strontium 90 Cell
+item.itemCellPlutonium238.name=Plutonium 238 Cell
+
+entity.MiningCharge.name=Mining Charge
+entity.throwablePotionSulfuric.name=Flask of Sulfuric Acid
+entity.throwablePotionHydrofluoric.name=Flask of Hydrofluoric Acid
+entity.toxinBall.name=Toxin globule
+entity.plasmaBolt.name=Plasma
+entity.bigChickenFriendly.name=Giant Chicken
+
+//Added 26/6/18
+tile.OreTrinium.name=Trinium Ore
+item.crushedTrinium.name=Crushed Trinium Ore
+item.crushedCentrifugedTrinium.name=Centrifuged Crushed Trinium Ore
+item.crushedPurifiedTrinium.name=Purified Crushed Trinium Ore
+item.dustImpureTrinium.name=Impure Trinium Dust
+item.dustPureTrinium.name=Purified Trinium Dust
+
+//Added 1/7/18
+entity.WiseVillager.name=Wise Villager
+tile.blockMobSpawnerEx.0.name=Monster Spawner
+tile.blockMobSpawnerEx.1.name=Monster Spawner
+tile.blockMobSpawnerEx.2.name=Monster Spawner
+tile.blockMobSpawnerEx.3.name=Monster Spawner
+tile.blockMobSpawnerEx.4.name=Monster Spawner
+tile.blockMobSpawnerEx.5.name=Monster Spawner
+tile.blockMobSpawnerEx.6.name=Monster Spawner
+tile.blockMobSpawnerEx.7.name=Monster Spawner
+tile.blockMobSpawnerEx.8.name=Monster Spawner
+tile.blockMobSpawnerEx.9.name=Monster Spawner
+tile.blockMobSpawnerEx.10.name=Monster Spawner
+tile.blockMobSpawnerEx.11.name=Monster Spawner
+tile.blockMobSpawnerEx.12.name=Monster Spawner
+tile.blockMobSpawnerEx.13.name=Monster Spawner
+tile.blockMobSpawnerEx.14.name=Monster Spawner
+tile.blockMobSpawnerEx.15.name=Monster Spawner
+description.villager.profession.miscutils.banker=Banker
+description.villager.profession.miscutils.technician=GT Technician
+description.villager.profession.miscutils.trader=Ore Trader
+description.villager.profession.miscutils.aboriginal=Native Australian
+
+//Added 23/8/18
+item.itemHatTinFoil.name=Tin Foil Hat
+
+//Added 13/9/18
+entity.Aboriginal.name=Native
+entity.miscutils.constructStaballoy.name=Staballoy Construct
+entity.miscutils.sickBlaze.name=Infected Zealot
+
+//Added 15/9/18
+item.ZirconiumTetrafluoride.name=Zirconium Tetrafluoride Cell
+item.Formaldehyde.name=Formaldehyde Cell
+item.RocketFuelMixA.name=H8N4C2O4 Rocket Fuel Cell
+item.RocketFuelMixB.name=RP-1 Rocket Fuel Cell
+item.RocketFuelMixC.name=CN3H7O3 Rocket Fuel Cell
+item.RocketFuelMixD.name=Dense Hydrazine Rocket Fuel Cell
+item.RP1Fuel.name=RP-1 Fuel Cell
+item.Monomethylhydrazine.name=Monomethylhydrazine Cell
+item.Hydrazine.name=Hydrazine Cell
+item.NitrogenTetroxide.name=Nitrogen Tetroxide Cell
+item.NitrousOxide.name=Nitrous Oxide Cell
+item.AmmoniumNitrateSlurry.name=Ammonium Nitrate Slurry Cell
+item.Kerosene.name=Kerosene Cell
+item.LiquidOxygen.name=Liquid Oxygen Cell [LOX]
+
+//Added 8/1/19
+
+//Ores
+
+tile.OreIrarsite.name=Irarsite Ore
+item.crushedIrarsite.name=Crushed Irarsite Ore
+item.oreRawIrarsite.name=Raw Irarsite Ore
+item.crushedCentrifugedIrarsite.name=Centrifuged Crushed Irarsite Ore
+item.crushedPurifiedIrarsite.name=Purified Crushed Irarsite Ore
+item.dustImpureIrarsite.name=Impure Irarsite Dust
+item.dustPureIrarsite.name=Purified Irarsite Dust
+item.itemDustIrarsite.name=Irarsite Dust
+item.itemDustTinyIrarsite.name=Tiny Pile of Irarsite Dust
+item.itemDustSmallIrarsite.name=Small Pile of Irarsite Dust
+
+tile.OreMiessiite.name=Miessiite Ore
+item.crushedMiessiite.name=Crushed Miessiite Ore
+item.oreRawMiessiite.name=Raw Miessiite Ore
+item.crushedCentrifugedMiessiite.name=Centrifuged Crushed Miessiite Ore
+item.crushedPurifiedMiessiite.name=Purified Crushed Miessiite Ore
+item.dustImpureMiessiite.name=Impure Miessiite Dust
+item.dustPureMiessiite.name=Purified Miessiite Dust
+item.itemDustMiessiite.name=Miessiite Dust
+item.itemDustTinyMiessiite.name=Tiny Pile of Miessiite Dust
+item.itemDustSmallMiessiite.name=Small Pile of Miessiite Dust
+
+tile.OreComancheite.name=Comancheite Ore
+item.crushedComancheite.name=Crushed Comancheite Ore
+item.oreRawComancheite.name=Raw Comancheite Ore
+item.crushedCentrifugedComancheite.name=Centrifuged Crushed Comancheite Ore
+item.crushedPurifiedComancheite.name=Purified Crushed Comancheite Ore
+item.dustImpureComancheite.name=Impure Comancheite Dust
+item.dustPureComancheite.name=Purified Comancheite Dust
+item.itemDustComancheite.name=Comancheite Dust
+item.itemDustTinyComancheite.name=Tiny Pile of Comancheite Dust
+item.itemDustSmallComancheite.name=Small Pile of Comancheite Dust
+
+tile.OreKoboldite.name=Koboldite Ore
+item.crushedKoboldite.name=Crushed Koboldite Ore
+item.oreRawKoboldite.name=Raw Koboldite Ore
+item.crushedCentrifugedKoboldite.name=Centrifuged Crushed Koboldite Ore
+item.crushedPurifiedKoboldite.name=Purified Crushed Koboldite Ore
+item.dustImpureKoboldite.name=Impure Koboldite Dust
+item.dustPureKoboldite.name=Purified Koboldite Dust
+item.itemDustKoboldite.name=Koboldite Dust
+item.itemDustTinyKoboldite.name=Tiny Pile of Koboldite Dust
+item.itemDustSmallKoboldite.name=Small Pile of Koboldite Dust
+
+tile.OrePerroudite.name=Perroudite Ore
+item.crushedPerroudite.name=Crushed Perroudite Ore
+item.oreRawPerroudite.name=Raw Perroudite Ore
+item.crushedCentrifugedPerroudite.name=Centrifuged Crushed Perroudite Ore
+item.crushedPurifiedPerroudite.name=Purified Crushed Perroudite Ore
+item.dustImpurePerroudite.name=Impure Perroudite Dust
+item.dustPurePerroudite.name=Purified Perroudite Dust
+item.itemDustPerroudite.name=Perroudite Dust
+item.itemDustTinyPerroudite.name=Tiny Pile of Perroudite Dust
+item.itemDustSmallPerroudite.name=Small Pile of Perroudite Dust
+
+tile.OreDemicheleite.name=Demicheleite Ore
+item.crushedDemicheleite.name=Crushed Demicheleite Ore
+item.oreRawDemicheleite.name=Raw Demicheleite Ore
+item.crushedCentrifugedDemicheleite.name=Centrifuged Crushed Demicheleite Ore
+item.crushedPurifiedDemicheleite.name=Purified Crushed Demicheleite Ore
+item.dustImpureDemicheleite.name=Impure Demicheleite Dust
+item.dustPureDemicheleite.name=Purified Demicheleite Dust
+item.itemDustDemicheleite.name=Demicheleite Dust
+item.itemDustTinyDemicheleite.name=Tiny Pile of Demicheleite Dust
+item.itemDustSmallDemicheleite.name=Small Pile of Demicheleite Dust
+
+tile.OreAlburnite.name=Alburnite Ore
+item.crushedAlburnite.name=Crushed Alburnite Ore
+item.oreRawAlburnite.name=Raw Alburnite Ore
+item.crushedCentrifugedAlburnite.name=Centrifuged Crushed Alburnite Ore
+item.crushedPurifiedAlburnite.name=Purified Crushed Alburnite Ore
+item.dustImpureAlburnite.name=Impure Alburnite Dust
+item.dustPureAlburnite.name=Purified Alburnite Dust
+item.itemDustAlburnite.name=Alburnite Dust
+item.itemDustTinyAlburnite.name=Tiny Pile of Alburnite Dust
+item.itemDustSmallAlburnite.name=Small Pile of Alburnite Dust
+
+tile.OreLautarite.name=Lautarite Ore
+item.crushedLautarite.name=Crushed Lautarite Ore
+item.oreRawLautarite.name=Raw Lautarite Ore
+item.crushedCentrifugedLautarite.name=Centrifuged Crushed Lautarite Ore
+item.crushedPurifiedLautarite.name=Purified Crushed Lautarite Ore
+item.dustImpureLautarite.name=Impure Lautarite Dust
+item.dustPureLautarite.name=Purified Lautarite Dust
+item.itemDustLautarite.name=Lautarite Dust
+item.itemDustTinyLautarite.name=Tiny Pile of Lautarite Dust
+item.itemDustSmallLautarite.name=Small Pile of Lautarite Dust
+
+tile.OreBariteRd.name=Barite (Rd) Ore
+item.crushedBariteRd.name=Crushed Barite (Rd) Ore
+item.oreRawBariteRd.name=Raw Barite (Rd) Ore
+item.crushedCentrifugedBariteRd.name=Centrifuged Crushed Barite (Rd) Ore
+item.crushedPurifiedBariteRd.name=Purified Crushed Barite (Rd) Ore
+item.dustImpureBariteRd.name=Impure Barite (Rd) Dust
+item.dustPureBariteRd.name=Purified Barite (Rd) Dust
+item.itemDustBariteRd.name=Barite (Rd) Dust
+item.itemDustTinyBariteRd.name=Tiny Pile of Barite (Rd) Dust
+item.itemDustSmallBariteRd.name=Small Pile of Barite (Rd) Dust
+
+tile.OreHoneaite.name=Honeaite Ore
+item.crushedHoneaite.name=Crushed Honeaite Ore
+item.oreRawHoneaite.name=Raw Honeaite Ore
+item.crushedCentrifugedHoneaite.name=Centrifuged Crushed Honeaite Ore
+item.crushedPurifiedHoneaite.name=Purified Crushed Honeaite Ore
+item.dustImpureHoneaite.name=Impure Honeaite Dust
+item.dustPureHoneaite.name=Purified Honeaite Dust
+item.itemDustHoneaite.name=Honeaite Dust
+item.itemDustTinyHoneaite.name=Tiny Pile of Honeaite Dust
+item.itemDustSmallHoneaite.name=Small Pile of Honeaite Dust
+
+tile.OreLafossaite.name=Lafossaite Ore
+item.crushedLafossaite.name=Crushed Lafossaite Ore
+item.oreRawLafossaite.name=Raw Lafossaite Ore
+item.crushedCentrifugedLafossaite.name=Centrifuged Crushed Lafossaite Ore
+item.crushedPurifiedLafossaite.name=Purified Crushed Lafossaite Ore
+item.dustImpureLafossaite.name=Impure Lafossaite Dust
+item.dustPureLafossaite.name=Purified Lafossaite Dust
+item.itemDustLafossaite.name=Lafossaite Dust
+item.itemDustTinyLafossaite.name=Tiny Pile of Lafossaite Dust
+item.itemDustSmallLafossaite.name=Small Pile of Lafossaite Dust
+
+tile.OreKashinite.name=Kashinite Ore
+item.crushedKashinite.name=Crushed Kashinite Ore
+item.oreRawKashinite.name=Raw Kashinite Ore
+item.crushedCentrifugedKashinite.name=Centrifuged Crushed Kashinite Ore
+item.crushedPurifiedKashinite.name=Purified Crushed Kashinite Ore
+item.dustImpureKashinite.name=Impure Kashinite Dust
+item.dustPureKashinite.name=Purified Kashinite Dust
+item.itemDustKashinite.name=Kashinite Dust
+item.itemDustTinyKashinite.name=Tiny Pile of Kashinite Dust
+item.itemDustSmallKashinite.name=Small Pile of Kashinite Dust
+
+tile.OreRadioactiveMineralMix.name=Strange Ore
+item.crushedRadioactiveMineralMix.name=Crushed Strange Ore
+item.oreRawRadioactiveMineralMix.name=Raw Strange Ore
+item.crushedCentrifugedRadioactiveMineralMix.name=Centrifuged Crushed Strange Ore
+item.crushedPurifiedRadioactiveMineralMix.name=Purified Crushed Strange Ore
+item.dustImpureRadioactiveMineralMix.name=Impure Strange Dust
+item.dustPureRadioactiveMineralMix.name=Purified Strange Dust
+item.itemDustRadioactiveMineralMix.name=Strange Dust
+item.itemDustTinyRadioactiveMineralMix.name=Tiny Pile of Strange Dust
+item.itemDustSmallRadioactiveMineralMix.name=Small Pile of Strange Dust
+
+tile.OreDemicheleiteBr.name=Demicheleite (Br) Ore
+item.crushedDemicheleiteBr.name=Crushed Demicheleite (Br) Ore
+item.oreRawDemicheleiteBr.name=Raw Demicheleite (Br) Ore
+item.crushedCentrifugedDemicheleiteBr.name=Centrifuged Crushed Demicheleite (Br) Ore
+item.crushedPurifiedDemicheleiteBr.name=Purified Crushed Demicheleite (Br) Ore
+item.dustImpureDemicheleiteBr.name=Impure Demicheleite (Br) Dust
+item.dustPureDemicheleiteBr.name=Purified Demicheleite (Br) Dust
+item.itemDustDemicheleiteBr.name=Demicheleite (Br) Dust
+
+
+//Materials
+
+item.itemIngotTitansteel.name=Titansteel Ingot
+item.itemHotIngotTitansteel.name=Hot Titansteel Ingot
+item.itemDustTitansteel.name=Titansteel Dust
+item.itemDustTinyTitansteel.name=Tiny Pile of Titansteel Dust
+item.itemDustSmallTitansteel.name=Small Pile of Titansteel Dust
+item.itemNuggetTitansteel.name=Titansteel Nugget
+item.itemPlateTitansteel.name=Titansteel Plate
+item.itemPlateDoubleTitansteel.name=Double Titansteel Plate
+item.itemBoltTitansteel.name=Titansteel Bolt
+item.itemRodTitansteel.name=Titansteel Rod
+item.itemRodLongTitansteel.name=Long Titansteel Rod
+item.itemRingTitansteel.name=Titansteel Ring
+item.itemScrewTitansteel.name=Titansteel Screw
+item.itemRotorTitansteel.name=Titansteel Rotor
+item.itemGearTitansteel.name=Titansteel Gear
+item.itemCellTitansteel.name=Titansteel Cell
+tile.Block of Titansteel.name=Block of Titansteel
+tile.Titansteel Frame Box.name=Titansteel Frame Box
+
+item.itemIngotOctiron.name=Octiron Ingot
+item.itemHotIngotOctiron.name=Hot Octiron Ingot
+item.itemDustOctiron.name=Octiron Dust
+item.itemDustTinyOctiron.name=Tiny Pile of Octiron Dust
+item.itemDustSmallOctiron.name=Small Pile of Octiron Dust
+item.itemNuggetOctiron.name=Octiron Nugget
+item.itemPlateOctiron.name=Octiron Plate
+item.itemPlateDoubleOctiron.name=Double Octiron Plate
+item.itemBoltOctiron.name=Octiron Bolt
+item.itemRodOctiron.name=Octiron Rod
+item.itemRodLongOctiron.name=Long Octiron Rod
+item.itemRingOctiron.name=Octiron Ring
+item.itemScrewOctiron.name=Octiron Screw
+item.itemRotorOctiron.name=Octiron Rotor
+item.itemGearOctiron.name=Octiron Gear
+item.itemCellOctiron.name=Octiron Cell
+tile.Block of Octiron.name=Block of Octiron
+tile.Octiron Frame Box.name=Octiron Frame Box
+
+item.itemIngotWatertightSteel.name=Watertight Steel Ingot
+item.itemHotIngotWatertightSteel.name=Hot Watertight Steel Ingot
+item.itemDustWatertightSteel.name=Watertight Steel Dust
+item.itemDustTinyWatertightSteel.name=Tiny Pile of Watertight Steel Dust
+item.itemDustSmallWatertightSteel.name=Small Pile of Watertight Steel Dust
+item.itemNuggetWatertightSteel.name=Watertight Steel Nugget
+item.itemPlateWatertightSteel.name=Watertight Steel Plate
+item.itemPlateDoubleWatertightSteel.name=Double Watertight Steel Plate
+item.itemBoltWatertightSteel.name=Watertight Steel Bolt
+item.itemRodWatertightSteel.name=Watertight Steel Rod
+item.itemRodLongWatertightSteel.name=Long Watertight Steel Rod
+item.itemRingWatertightSteel.name=Watertight Steel Ring
+item.itemScrewWatertightSteel.name=Watertight Steel Screw
+item.itemRotorWatertightSteel.name=Watertight Steel Rotor
+item.itemGearWatertightSteel.name=Watertight Steel Gear
+item.itemCellWatertightSteel.name=Watertight Steel Cell
+tile.Block of Watertight Steel.name=Block of Watertight Steel
+tile.Watertight Steel Frame Box.name=Watertight Steel Frame Box
+
+item.itemIngotCelestialTungsten.name=Celestial Tungsten Ingot
+item.itemHotIngotCelestialTungsten.name=Hot Celestial Tungsten Ingot
+item.itemDustCelestialTungsten.name=Celestial Tungsten Dust
+item.itemDustTinyCelestialTungsten.name=Tiny Pile of Celestial Tungsten Dust
+item.itemDustSmallCelestialTungsten.name=Small Pile of Celestial Tungsten Dust
+item.itemNuggetCelestialTungsten.name=Celestial Tungsten Nugget
+item.itemPlateCelestialTungsten.name=Celestial Tungsten Plate
+item.itemPlateDoubleCelestialTungsten.name=Double Celestial Tungsten Plate
+item.itemBoltCelestialTungsten.name=Celestial Tungsten Bolt
+item.itemRodCelestialTungsten.name=Celestial Tungsten Rod
+item.itemRodLongCelestialTungsten.name=Long Celestial Tungsten Rod
+item.itemRingCelestialTungsten.name=Celestial Tungsten Ring
+item.itemScrewCelestialTungsten.name=Celestial Tungsten Screw
+item.itemRotorCelestialTungsten.name=Celestial Tungsten Rotor
+item.itemGearCelestialTungsten.name=Celestial Tungsten Gear
+item.itemCellCelestialTungsten.name=Celestial Tungsten Cell
+tile.Block of Celestial Tungsten.name=Block of Celestial Tungsten
+tile.Celestial Tungsten Frame Box.name=Celestial Tungsten Frame Box
+
+item.itemIngotHypogen.name=Hypogen Ingot
+item.itemHotIngotHypogen.name=Hot Hypogen Ingot
+item.itemDustHypogen.name=Hypogen Dust
+item.itemDustTinyHypogen.name=Tiny Pile of Hypogen Dust
+item.itemDustSmallHypogen.name=Small Pile of Hypogen Dust
+item.itemNuggetHypogen.name=Hypogen Nugget
+item.itemPlateHypogen.name=Hypogen Plate
+item.itemPlateDoubleHypogen.name=Double Hypogen Plate
+item.itemBoltHypogen.name=Hypogen Bolt
+item.itemRodHypogen.name=Hypogen Rod
+item.itemRodLongHypogen.name=Long Hypogen Rod
+item.itemRingHypogen.name=Hypogen Ring
+item.itemScrewHypogen.name=Hypogen Screw
+item.itemRotorHypogen.name=Hypogen Rotor
+item.itemGearHypogen.name=Hypogen Gear
+item.itemCellHypogen.name=Hypogen Cell
+tile.Block of Hypogen.name=Block of Hypogen
+tile.Hypogen Frame Box.name=Hypogen Frame Box
+
+item.itemIngotArceusAlloy2B.name=Arceus Alloy 2B Ingot
+item.itemHotIngotArceusAlloy2B.name=Hot Arceus Alloy 2B Ingot
+item.itemDustArceusAlloy2B.name=Arceus Alloy 2B Dust
+item.itemDustTinyArceusAlloy2B.name=Tiny Pile of Arceus Alloy 2B Dust
+item.itemDustSmallArceusAlloy2B.name=Small Pile of Arceus Alloy 2B Dust
+item.itemNuggetArceusAlloy2B.name=Arceus Alloy 2B Nugget
+item.itemPlateArceusAlloy2B.name=Arceus Alloy 2B Plate
+item.itemPlateDoubleArceusAlloy2B.name=Double Arceus Alloy 2B Plate
+item.itemBoltArceusAlloy2B.name=Arceus Alloy 2B Bolt
+item.itemRodArceusAlloy2B.name=Arceus Alloy 2B Rod
+item.itemRodLongArceusAlloy2B.name=Long Arceus Alloy 2B Rod
+item.itemRingArceusAlloy2B.name=Arceus Alloy 2B Ring
+item.itemScrewArceusAlloy2B.name=Arceus Alloy 2B Screw
+item.itemRotorArceusAlloy2B.name=Arceus Alloy 2B Rotor
+item.itemGearArceusAlloy2B.name=Arceus Alloy 2B Gear
+item.itemCellArceusAlloy2B.name=Arceus Alloy 2B Cell
+tile.Block of Arceus Alloy 2B.name=Block of Arceus Alloy 2B
+tile.Arceus Alloy 2B Frame Box.name=Arceus Alloy 2B Frame Box
+
+item.itemIngotChromaticGlass.name=Chromatic Glass Ingot
+item.itemHotIngotChromaticGlass.name=Hot Chromatic Glass Ingot
+item.itemDustChromaticGlass.name=Chromatic Glass Dust
+item.itemDustTinyChromaticGlass.name=Tiny Pile of Chromatic Glass Dust
+item.itemDustSmallChromaticGlass.name=Small Pile of Chromatic Glass Dust
+item.itemNuggetChromaticGlass.name=Chromatic Glass Nugget
+item.itemPlateChromaticGlass.name=Chromatic Glass Plate
+item.itemPlateDoubleChromaticGlass.name=Double Chromatic Glass Plate
+item.itemBoltChromaticGlass.name=Chromatic Glass Bolt
+item.itemRodChromaticGlass.name=Chromatic Glass Rod
+item.itemRodLongChromaticGlass.name=Long Chromatic Glass Rod
+item.itemRingChromaticGlass.name=Chromatic Glass Ring
+item.itemScrewChromaticGlass.name=Chromatic Glass Screw
+item.itemRotorChromaticGlass.name=Chromatic Glass Rotor
+item.itemGearChromaticGlass.name=Chromatic Glass Gear
+item.itemCellChromaticGlass.name=Chromatic Glass Cell
+tile.Block of Chromatic Glass.name=Block of Chromatic Glass
+tile.Chromatic Glass Frame Box.name=Chromatic Glass Frame Box
+
+item.itemIngotAstralTitanium.name=Astral Titanium Ingot
+item.itemHotIngotAstralTitanium.name=Hot Astral Titanium Ingot
+item.itemDustAstralTitanium.name=Astral Titanium Dust
+item.itemDustTinyAstralTitanium.name=Tiny Pile of Astral Titanium Dust
+item.itemDustSmallAstralTitanium.name=Small Pile of Astral Titanium Dust
+item.itemNuggetAstralTitanium.name=Astral Titanium Nugget
+item.itemPlateAstralTitanium.name=Astral Titanium Plate
+item.itemPlateDoubleAstralTitanium.name=Double Astral Titanium Plate
+item.itemBoltAstralTitanium.name=Astral Titanium Bolt
+item.itemRodAstralTitanium.name=Astral Titanium Rod
+item.itemRodLongAstralTitanium.name=Long Astral Titanium Rod
+item.itemRingAstralTitanium.name=Astral Titanium Ring
+item.itemScrewAstralTitanium.name=Astral Titanium Screw
+item.itemRotorAstralTitanium.name=Astral Titanium Rotor
+item.itemGearAstralTitanium.name=Astral Titanium Gear
+item.itemCellAstralTitanium.name=Astral Titanium Cell
+tile.Block of Astral Titanium.name=Block of Astral Titanium
+tile.Astral Titanium Frame Box.name=Astral Titanium Frame Box
+
+item.itemIngotTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Ingot
+item.itemHotIngotTungstenTitaniumCarbide.name=Hot Tungsten Titanium Carbide Ingot
+item.itemDustTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Dust
+item.itemDustTinyTungstenTitaniumCarbide.name=Tiny Pile of Tungsten Titanium Carbide Dust
+item.itemDustSmallTungstenTitaniumCarbide.name=Small Pile of Tungsten Titanium Carbide Dust
+item.itemNuggetTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Nugget
+item.itemPlateTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Plate
+item.itemPlateDoubleTungstenTitaniumCarbide.name=Double Tungsten Titanium Carbide Plate
+item.itemBoltTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Bolt
+item.itemRodTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Rod
+item.itemRodLongTungstenTitaniumCarbide.name=Long Tungsten Titanium Carbide Rod
+item.itemRingTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Ring
+item.itemScrewTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Screw
+item.itemRotorTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Rotor
+item.itemGearTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Gear
+item.itemCellTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Cell
+tile.Block of Tungsten Titanium Carbide.name=Block of Tungsten Titanium Carbide
+tile.Tungsten Titanium Carbide Frame Box.name=Tungsten Titanium Carbide Frame Box
+
+item.itemIngotNitinol60.name=Nitinol 60 Ingot
+item.itemHotIngotNitinol60.name=Hot Nitinol 60 Ingot
+item.itemDustNitinol60.name=Nitinol 60 Dust
+item.itemDustTinyNitinol60.name=Tiny Pile of Nitinol 60 Dust
+item.itemDustSmallNitinol60.name=Small Pile of Nitinol 60 Dust
+item.itemNuggetNitinol60.name=Nitinol 60 Nugget
+item.itemPlateNitinol60.name=Nitinol 60 Plate
+item.itemPlateDoubleNitinol60.name=Double Nitinol 60 Plate
+item.itemBoltNitinol60.name=Nitinol 60 Bolt
+item.itemRodNitinol60.name=Nitinol 60 Rod
+item.itemRodLongNitinol60.name=Long Nitinol 60 Rod
+item.itemRingNitinol60.name=Nitinol 60 Ring
+item.itemScrewNitinol60.name=Nitinol 60 Screw
+item.itemRotorNitinol60.name=Nitinol 60 Rotor
+item.itemGearNitinol60.name=Nitinol 60 Gear
+item.itemCellNitinol60.name=Nitinol 60 Cell
+tile.Block of Nitinol 60.name=Block of Nitinol 60
+tile.Nitinol 60 Frame Box.name=Nitinol 60 Frame Box
+
+item.itemIngotAdvancedNitinol.name=Advanced Nitinol Ingot
+item.itemHotIngotAdvancedNitinol.name=Hot Advanced Nitinol Ingot
+item.itemDustAdvancedNitinol.name=Advanced Nitinol Dust
+item.itemDustTinyAdvancedNitinol.name=Tiny Pile of Advanced Nitinol Dust
+item.itemDustSmallAdvancedNitinol.name=Small Pile of Advanced Nitinol Dust
+item.itemNuggetAdvancedNitinol.name=Advanced Nitinol Nugget
+item.itemPlateAdvancedNitinol.name=Advanced Nitinol Plate
+item.itemPlateDoubleAdvancedNitinol.name=Double Advanced Nitinol Plate
+item.itemBoltAdvancedNitinol.name=Advanced Nitinol Bolt
+item.itemRodAdvancedNitinol.name=Advanced Nitinol Rod
+item.itemRodLongAdvancedNitinol.name=Long Advanced Nitinol Rod
+item.itemRingAdvancedNitinol.name=Advanced Nitinol Ring
+item.itemScrewAdvancedNitinol.name=Advanced Nitinol Screw
+item.itemRotorAdvancedNitinol.name=Advanced Nitinol Rotor
+item.itemGearAdvancedNitinol.name=Advanced Nitinol Gear
+item.itemCellAdvancedNitinol.name=Advanced Nitinol Cell
+tile.Block of Advanced Nitinol.name=Block of Advanced Nitinol
+tile.Advanced Nitinol Frame Box.name=Advanced Nitinol Frame Box
+
+item.itemIngotArcanite.name=Arcanite Ingot
+item.itemHotIngotArcanite.name=Hot Arcanite Ingot
+item.itemDustArcanite.name=Arcanite Dust
+item.itemDustTinyArcanite.name=Tiny Pile of Arcanite Dust
+item.itemDustSmallArcanite.name=Small Pile of Arcanite Dust
+item.itemNuggetArcanite.name=Arcanite Nugget
+item.itemPlateArcanite.name=Arcanite Plate
+item.itemPlateDoubleArcanite.name=Double Arcanite Plate
+item.itemBoltArcanite.name=Arcanite Bolt
+item.itemRodArcanite.name=Arcanite Rod
+item.itemRodLongArcanite.name=Long Arcanite Rod
+item.itemRingArcanite.name=Arcanite Ring
+item.itemScrewArcanite.name=Arcanite Screw
+item.itemRotorArcanite.name=Arcanite Rotor
+item.itemGearArcanite.name=Arcanite Gear
+item.itemCellArcanite.name=Arcanite Cell
+tile.Block of Arcanite.name=Block of Arcanite
+tile.Arcanite Frame Box.name=Arcanite Frame Box
+
+item.itemIngotPikyonium64B.name=Pikyonium 64B Ingot
+item.itemHotIngotPikyonium64B.name=Hot Pikyonium 64B Ingot
+item.itemDustPikyonium64B.name=Pikyonium 64B Dust
+item.itemDustTinyPikyonium64B.name=Tiny Pile of Pikyonium 64B Dust
+item.itemDustSmallPikyonium64B.name=Small Pile of Pikyonium 64B Dust
+item.itemNuggetPikyonium64B.name=Pikyonium 64B Nugget
+item.itemPlatePikyonium64B.name=Pikyonium 64B Plate
+item.itemPlateDoublePikyonium64B.name=Double Pikyonium 64B Plate
+item.itemBoltPikyonium64B.name=Pikyonium 64B Bolt
+item.itemRodPikyonium64B.name=Pikyonium 64B Rod
+item.itemRodLongPikyonium64B.name=Long Pikyonium 64B Rod
+item.itemRingPikyonium64B.name=Pikyonium 64B Ring
+item.itemScrewPikyonium64B.name=Pikyonium 64B Screw
+item.itemRotorPikyonium64B.name=Pikyonium 64B Rotor
+item.itemGearPikyonium64B.name=Pikyonium 64B Gear
+item.itemCellPikyonium64B.name=Pikyonium 64B Cell
+tile.Block of Pikyonium 64B.name=Block of Pikyonium 64B
+tile.Pikyonium 64B Frame Box.name=Pikyonium 64B Frame Box
+
+item.itemIngotCinobiteA243.name=Cinobite A243 Ingot
+item.itemHotIngotCinobiteA243.name=Hot Cinobite A243 Ingot
+item.itemDustCinobiteA243.name=Cinobite A243 Dust
+item.itemDustTinyCinobiteA243.name=Tiny Pile of Cinobite A243 Dust
+item.itemDustSmallCinobiteA243.name=Small Pile of Cinobite A243 Dust
+item.itemNuggetCinobiteA243.name=Cinobite A243 Nugget
+item.itemPlateCinobiteA243.name=Cinobite A243 Plate
+item.itemPlateDoubleCinobiteA243.name=Double Cinobite A243 Plate
+item.itemBoltCinobiteA243.name=Cinobite A243 Bolt
+item.itemRodCinobiteA243.name=Cinobite A243 Rod
+item.itemRodLongCinobiteA243.name=Long Cinobite A243 Rod
+item.itemRingCinobiteA243.name=Cinobite A243 Ring
+item.itemScrewCinobiteA243.name=Cinobite A243 Screw
+item.itemRotorCinobiteA243.name=Cinobite A243 Rotor
+item.itemGearCinobiteA243.name=Cinobite A243 Gear
+item.itemCellCinobiteA243.name=Cinobite A243 Cell
+tile.Block of Cinobite A243.name=Block of Cinobite A243
+tile.Cinobite A243 Frame Box.name=Cinobite A243 Frame Box
+
+item.itemIngotLafiumCompound.name=Lafium Compound Ingot
+item.itemHotIngotLafiumCompound.name=Hot Lafium Compound Ingot
+item.itemDustLafiumCompound.name=Lafium Compound Dust
+item.itemDustTinyLafiumCompound.name=Tiny Pile of Lafium Compound Dust
+item.itemDustSmallLafiumCompound.name=Small Pile of Lafium Compound Dust
+item.itemNuggetLafiumCompound.name=Lafium Compound Nugget
+item.itemPlateLafiumCompound.name=Lafium Compound Plate
+item.itemPlateDoubleLafiumCompound.name=Double Lafium Compound Plate
+item.itemBoltLafiumCompound.name=Lafium Compound Bolt
+item.itemRodLafiumCompound.name=Lafium Compound Rod
+item.itemRodLongLafiumCompound.name=Long Lafium Compound Rod
+item.itemRingLafiumCompound.name=Lafium Compound Ring
+item.itemScrewLafiumCompound.name=Lafium Compound Screw
+item.itemRotorLafiumCompound.name=Lafium Compound Rotor
+item.itemGearLafiumCompound.name=Lafium Compound Gear
+item.itemCellLafiumCompound.name=Lafium Compound Cell
+tile.Block of Lafium Compound.name=Block of Lafium Compound
+tile.Lafium Compound Frame Box.name=Lafium Compound Frame Box
+
+item.itemIngotKoboldite.name=Koboldite Ingot
+item.itemHotIngotKoboldite.name=Hot Koboldite Ingot
+item.itemNuggetKoboldite.name=Koboldite Nugget
+item.itemPlateKoboldite.name=Koboldite Plate
+item.itemPlateDoubleKoboldite.name=Double Koboldite Plate
+item.itemBoltKoboldite.name=Koboldite Bolt
+item.itemRodKoboldite.name=Koboldite Rod
+item.itemRodLongKoboldite.name=Long Koboldite Rod
+item.itemRingKoboldite.name=Koboldite Ring
+item.itemScrewKoboldite.name=Koboldite Screw
+item.itemRotorKoboldite.name=Koboldite Rotor
+item.itemGearKoboldite.name=Koboldite Gear
+item.itemCellKoboldite.name=Koboldite Cell
+tile.Block of Koboldite.name=Block of Koboldite
+tile.Koboldite Frame Box.name=Koboldite Frame Box
+
+item.itemIngotAbyssalAlloy.name=Abyssal Alloy Ingot
+item.itemHotIngotAbyssalAlloy.name=Hot Abyssal Alloy Ingot
+item.itemDustAbyssalAlloy.name=Abyssal Alloy Dust
+item.itemDustTinyAbyssalAlloy.name=Tiny Pile of Abyssal Alloy Dust
+item.itemDustSmallAbyssalAlloy.name=Small Pile of Abyssal Alloy Dust
+item.itemNuggetAbyssalAlloy.name=Abyssal Alloy Nugget
+item.itemPlateAbyssalAlloy.name=Abyssal Alloy Plate
+item.itemPlateDoubleAbyssalAlloy.name=Double Abyssal Alloy Plate
+item.itemBoltAbyssalAlloy.name=Abyssal Alloy Bolt
+item.itemRodAbyssalAlloy.name=Abyssal Alloy Rod
+item.itemRodLongAbyssalAlloy.name=Long Abyssal Alloy Rod
+item.itemRingAbyssalAlloy.name=Abyssal Alloy Ring
+item.itemScrewAbyssalAlloy.name=Abyssal Alloy Screw
+item.itemRotorAbyssalAlloy.name=Abyssal Alloy Rotor
+item.itemGearAbyssalAlloy.name=Abyssal Alloy Gear
+item.itemCellAbyssalAlloy.name=Abyssal Alloy Cell
+tile.Block of Abyssal Alloy.name=Block of Abyssal Alloy
+tile.Abyssal Alloy Frame Box.name=Abyssal Alloy Frame Box
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//Radioactive
+item.dustTechnetium99M.name=Technetium 99M Dust
+item.dustTechnetium99.name=Technetium 99 Dust
+item.dustMolybdenum99.name=Molybdenum 99 Dust
+
+//Bags
+item.item.MysticBag.name=Mystic Pouch
+item.item.Eatotron9000.name=Eatotronic 9000
+item.item.ToolBox.name=Workers Toolbox
+
+//Cells
+item.Bromine.name=Bromine Cell
+item.Krypton.name=Krypton Cell
+item.cryotheum.name=Cryotheum Cell
+item.pyrotheum.name=Pyrotheum Cell
+item.GeneticMutagen.name=Mutagen Cell
+
+//Ingots
+item.itemHotIngotIncoloy020.name=Hot Incoloy-020 Ingot
+item.itemHotIngotIncoloyDS.name=Hot Incoloy-DS Ingot
+item.itemHotIngotTalonite.name=Hot Talonite Ingot
+item.itemHotIngotHastelloyX.name=Hot Hastelloy-X Ingot
+item.itemHotIngotHastelloyW.name=Hot Hastelloy-W Carbide Ingot
+
+//Railcraft Fix
+item.railcraft.part.plate.lead.name=Lead Plate
+
+//Ions
+item.particle.ion.Hydrogen.name=Hydrogen Ion
+item.particle.ion.Helium.name=Helium Ion
+item.particle.ion.Lithium.name=Lithium Ion
+item.particle.ion.Beryllium.name=Beryllium Ion
+item.particle.ion.Boron.name=Boron Ion
+item.particle.ion.Carbon.name=Carbon Ion
+item.particle.ion.Nitrogen.name=Nitrogen Ion
+item.particle.ion.Oxygen.name=Oxygen Ion
+item.particle.ion.Fluorine.name=Fluorine Ion
+item.particle.ion.Neon.name=Neon Ion
+item.particle.ion.Sodium.name=Sodium Ion
+item.particle.ion.Magnesium.name=Magnesium Ion
+item.particle.ion.Aluminum.name=Aluminum Ion
+item.particle.ion.Silicon.name=Silicon Ion
+item.particle.ion.Phosphorus.name=Phosphorus Ion
+item.particle.ion.Sulfur.name=Sulfur Ion
+item.particle.ion.Chlorine.name=Chlorine Ion
+item.particle.ion.Argon.name=Argon Ion
+item.particle.ion.Potassium.name=Potassium Ion
+item.particle.ion.Calcium.name=Calcium Ion
+item.particle.ion.Scandium.name=Scandium Ion
+item.particle.ion.Titanium.name=Titanium Ion
+item.particle.ion.Vanadium.name=Vanadium Ion
+item.particle.ion.Chromium.name=Chromium Ion
+item.particle.ion.Manganese.name=Manganese Ion
+item.particle.ion.Iron.name=Iron Ion
+item.particle.ion.Cobalt.name=Cobalt Ion
+item.particle.ion.Nickel.name=Nickel Ion
+item.particle.ion.Copper.name=Copper Ion
+item.particle.ion.Zinc.name=Zinc Ion
+item.particle.ion.Gallium.name=Gallium Ion
+item.particle.ion.Germanium.name=Germanium Ion
+item.particle.ion.Arsenic.name=Arsenic Ion
+item.particle.ion.Selenium.name=Selenium Ion
+item.particle.ion.Bromine.name=Bromine Ion
+item.particle.ion.Krypton.name=Krypton Ion
+item.particle.ion.Rubidium.name=Rubidium Ion
+item.particle.ion.Strontium.name=Strontium Ion
+item.particle.ion.Yttrium.name=Yttrium Ion
+item.particle.ion.Zirconium.name=Zirconium Ion
+item.particle.ion.Niobium.name=Niobium Ion
+item.particle.ion.Molybdenum.name=Molybdenum Ion
+item.particle.ion.Technetium.name=Technetium Ion
+item.particle.ion.Ruthenium.name=Ruthenium Ion
+item.particle.ion.Rhodium.name=Rhodium Ion
+item.particle.ion.Palladium.name=Palladium Ion
+item.particle.ion.Silver.name=Silver Ion
+item.particle.ion.Cadmium.name=Cadmium Ion
+item.particle.ion.Indium.name=Indium Ion
+item.particle.ion.Tin.name=Tin Ion
+item.particle.ion.Antimony.name=Antimony Ion
+item.particle.ion.Tellurium.name=Tellurium Ion
+item.particle.ion.Iodine.name=Iodine Ion
+item.particle.ion.Xenon.name=Xenon Ion
+item.particle.ion.Cesium.name=Caesium Ion
+item.particle.ion.Barium.name=Barium Ion
+item.particle.ion.Lanthanum.name=Lanthanum Ion
+item.particle.ion.Cerium.name=Cerium Ion
+item.particle.ion.Praseodymium.name=Praseodymium Ion
+item.particle.ion.Neodymium.name=Neodymium Ion
+item.particle.ion.Promethium.name=Promethium Ion
+item.particle.ion.Samarium.name=Samarium Ion
+item.particle.ion.Europium.name=Europium Ion
+item.particle.ion.Gadolinium.name=Gadolinium Ion
+item.particle.ion.Terbium.name=Terbium Ion
+item.particle.ion.Dysprosium.name=Dysprosium Ion
+item.particle.ion.Holmium.name=Holmium Ion
+item.particle.ion.Erbium.name=Erbium Ion
+item.particle.ion.Thulium.name=Thulium Ion
+item.particle.ion.Ytterbium.name=Ytterbium Ion
+item.particle.ion.Lutetium.name=Lutetium Ion
+item.particle.ion.Hafnium.name=Hafnium Ion
+item.particle.ion.Tantalum.name=Tantalum Ion
+item.particle.ion.Tungsten.name=Tungsten Ion
+item.particle.ion.Rhenium.name=Rhenium Ion
+item.particle.ion.Osmium.name=Osmium Ion
+item.particle.ion.Iridium.name=Iridium Ion
+item.particle.ion.Platinum.name=Platinum Ion
+item.particle.ion.Gold.name=Gold Ion
+item.particle.ion.Mercury.name=Mercury Ion
+item.particle.ion.Thallium.name=Thallium Ion
+item.particle.ion.Lead.name=Lead Ion
+item.particle.ion.Bismuth.name=Bismuth Ion
+item.particle.ion.Polonium.name=Polonium Ion
+item.particle.ion.Astatine.name=Astatine Ion
+item.particle.ion.Radon.name=Radon Ion
+item.particle.ion.Francium.name=Francium Ion
+item.particle.ion.Radium.name=Radium Ion
+item.particle.ion.Actinium.name=Actinium Ion
+item.particle.ion.Thorium.name=Thorium Ion
+item.particle.ion.Protactinium.name=Protactinium Ion
+item.particle.ion.Uranium.name=Uranium Ion
+item.particle.ion.Neptunium.name=Neptunium Ion
+item.particle.ion.Plutonium.name=Plutonium Ion
+item.particle.ion.Americium.name=Americium Ion
+item.particle.ion.Curium.name=Curium Ion
+item.particle.ion.Berkelium.name=Berkelium Ion
+item.particle.ion.Californium.name=Californium Ion
+item.particle.ion.Einsteinium.name=Einsteinium Ion
+item.particle.ion.Fermium.name=Fermium Ion
+item.particle.ion.Mendelevium.name=Mendelevium Ion
+item.particle.ion.Nobelium.name=Nobelium Ion
+item.particle.ion.Lawrencium.name=Lawrencium Ion
+item.particle.ion.Rutherfordium.name=Rutherfordium Ion
+item.particle.ion.Dubnium.name=Dubnium Ion
+item.particle.ion.Seaborgium.name=Seaborgium Ion
+item.particle.ion.Bohrium.name=Bohrium Ion
+item.particle.ion.Hassium.name=Hassium Ion
+item.particle.ion.Meitnerium.name=Meitnerium Ion
+item.particle.ion.Darmstadtium.name=Darmstadtium Ion
+item.particle.ion.Roentgenium.name=Roentgenium Ion
+item.particle.ion.Copernicium.name=Copernicium Ion
+item.particle.ion.Nihonium.name=Nihonium Ion
+item.particle.ion.Flerovium.name=Flerovium Ion
+item.particle.ion.Moscovium.name=Moscovium Ion
+item.particle.ion.Livermorium.name=Livermorium Ion
+item.particle.ion.Tennessine.name=Tennessine Ion
+item.particle.ion.Oganesson.name=Oganesson Ion
+
+
+item.particle.base.Graviton.name=Graviton
+item.particle.base.Up.name=Up Quark
+item.particle.base.Down.name=Down Quark
+item.particle.base.Charm.name=Charm Quark
+item.particle.base.Strange.name=Strange Quark
+item.particle.base.Top.name=Top Quark
+item.particle.base.Bottom.name=Bottom Quark
+item.particle.base.Electron.name=Electron
+item.particle.base.Electron Neutrino.name=Electron Neutrino
+item.particle.base.Muon.name=Muon
+item.particle.base.Muon Neutrino.name=Muon Neutrino
+item.particle.base.Tau.name=Tau
+item.particle.base.Tau Neutrino.name=Tau Neutrino
+item.particle.base.Gluon.name=Gluon
+item.particle.base.Photon.name=Photon
+item.particle.base.Z Boson.name=Z Boson
+item.particle.base.W Boson.name=W Boson
+item.particle.base.Higgs Boson.name=Higgs Boson
+item.particle.base.Proton.name=Proton
+item.particle.base.Neutron.name=Neutron
+item.particle.base.Lambda.name=Lambda
+item.particle.base.Omega.name=Omega
+item.particle.base.Pion.name=Pion
+item.particle.base.ETA Meson.name=ETA Meson
+item.particle.base.Unknown.name=Unknown Particle
+
+//Added 12/1/19
+
+tile.playerDoorGlass.name=Glass Auto-Door
+tile.playerDoorCactus.name=Cactus Auto-Door
+tile.playerDoorIce.name=Ice Auto-Door
+tile.playerDoorIron.name=Iron Auto-Door
+tile.playerDoorWood.name=Wooden Auto-Door
+
+//Added 4/2/19
+
+item.GTPP.BattPack.06.name=Charge Pack [LuV]
+item.GTPP.BattPack.07.name=Charge Pack [ZPM]
+item.GTPP.BattPack.08.name=Charge Pack [UV]
+item.GTPP.BattPack.09.name=Charge Pack [MAX]
+
+
+//Added 13/3/19
+item.gtpp.debug.scanner.name=GT++ Debug Scanner
+item.RawWaste.name=Cell of Animal Waste
+item.ManureSlurry.name=Cell of Manure Slurry
+item.FertileManureSlurry.name=Cell of Fertile Slurry
+item.itemDustTinyDemicheleiteBr.name=Tiny Pile of Demicheleite (Br)
+item.itemDustSmallDemicheleiteBr.name=Small Pile of Demicheleite (Br)
+tile.blockPooCollector.name=Agricultural Sewer
+tile.Block of Lithium 7.name=Block of Lithium 7
+
+//Added 14/3/19
+item.blood.name=Cell of Blood
+item.aniline.name=Aniline Cell
+item.cadaverine.name=Cadaverine Cell
+item.polyurethane.name=Polyurethane Cell
+item.putrescine.name=Putrescine Cell
+item.cyclohexane.name=Cyclohexane Cell
+item.cyclohexanone.name=Cyclohexanone Cell
+item.nitrobenzene.name=Nitrobenzene Cell
+item.ender.name=Cell of Liquid Ender
+item.xpjuice.name=Cell of Liquid Xp
+item.itemBombUnf.name=Throwable Bomb (unf)
+item.itemBombCasing.name=Bomb Casing
+item.gtpp.throwable.bomb.name=Throwable Bomb
+item.itemDetCable.name=Bomb Fuse
+tile.blockPooCollector.0.name=Agricultural Sewer
+tile.blockPooCollector.8.name=Biocomposite Collector
+item.itemIngotBakelite.name=Bakelite Ingot
+item.itemDustBakelite.name=Bakelite Dust
+item.itemDustTinyBakelite.name=Tiny Pile of Bakelite Dust
+item.itemDustSmallBakelite.name=Small Pile of Bakelite Dust
+item.itemNuggetBakelite.name=Bakelite Nugget
+item.itemPlateBakelite.name=Bakelite Plate
+item.itemPlateDoubleBakelite.name=Double Bakelite Plate
+item.itemCellBakelite.name=Bakelite Cell
+tile.Block of Bakelite.name=Block of Bakelite
+item.itemIngotNylon.name=Nylon Ingot
+item.itemDustNylon.name=Nylon Dust
+item.itemDustTinyNylon.name=Tiny Pile of Nylon Dust
+item.itemDustSmallNylon.name=Small Pile of Nylon Dust
+item.itemNuggetNylon.name=Nylon Nugget
+item.itemPlateNylon.name=Nylon Plate
+item.itemPlateDoubleNylon.name=Double Nylon Plate
+item.itemCellNylon.name=Nylon Cell
+tile.Block of Nylon.name=Block of Nylon
+item.itemIngotTeflon.name=Teflon Ingot
+item.itemDustTeflon.name=Teflon Dust
+item.itemDustTinyTeflon.name=Tiny Pile of Teflon Dust
+item.itemDustSmallTeflon.name=Small Pile of Teflon Dust
+item.itemNuggetTeflon.name=Teflon Nugget
+item.itemPlateTeflon.name=Teflon Plate
+item.itemPlateDoubleTeflon.name=Double Teflon Plate
+item.itemCellTeflon.name=Teflon Cell
+tile.Block of Teflon.name=Block of Teflon
+
+//Added 17/4/19
+//Spelling Corrections
+item.particle.ion.Aluminium.name=Aluminium Ion
+item.particle.ion.Caesium.name=Caesium Ion
+
+item.GTPP.MonsterKiller.Enderman.name=Enderman Killer
+item.GTPP.MonsterKiller.Spider.name=Spider Killer
+item.GTPP.MonsterKiller.Skeleton.name=Skeleton Killer
+item.GTPP.MonsterKiller.Creeper.name=Creeper Killer
+item.GTPP.MonsterKiller.Zombie.name=Zombie Killer
+item.GTPP.MonsterKiller.Hellish.name=Nether Mob Killer
+
+item.itemIngotRunite.name=Runite Ingot
+item.itemDustRunite.name=Runite Dust
+item.itemDustTinyRunite.name=Tiny Pile of Runite Dust
+item.itemDustSmallRunite.name=Small Pile of Runite Dust
+item.itemNuggetRunite.name=Runite Nugget
+item.itemPlateRunite.name=Runite Plate
+item.itemPlateDoubleRunite.name=Double Runite Plate
+item.itemCellRunite.name=Runite Cell
+tile.Block of Runite.name=Block of Runite
+
+item.itemIngotDragonblood.name=Dragon Metal Ingot
+item.itemDustDragonblood.name=Dragon Metal Dust
+item.itemDustTinyDragonblood.name=Tiny Pile of Dragon Metal Dust
+item.itemDustSmallDragonblood.name=Small Pile of Dragon Metal Dust
+item.itemNuggetDragonblood.name=Shard of Dragonblood
+item.itemPlateDragonblood.name=Dragon Metal Plate
+item.itemPlateDoubleDragonblood.name=Double Dragon Metal Plate
+item.itemCellDragonblood.name=Dragonblood Cell
+tile.Block of Dragonblood.name=Block of Dragon Metal
+
+item.itemIngotBlackTitanium.name=Black Titanium Ingot
+item.itemDustBlackTitanium.name=Black Titanium Dust
+item.itemDustTinyBlackTitanium.name=Tiny Pile of Black Titanium Dust
+item.itemDustSmallBlackTitanium.name=Small Pile of Black Titanium Dust
+item.itemNuggetBlackTitanium.name=Black Titanium Nugget
+item.itemPlateBlackTitanium.name=Black Titanium Plate
+item.itemPlateDoubleBlackTitanium.name=Double Black Titanium Plate
+item.itemCellBlackTitanium.name=Black Titanium Cell
+tile.Block of Black Titanium.name=Block of Black Titanium
+
+item.itemIngotAncientGranite.name=Ancient Granite Ingot
+item.itemHotIngotAncientGranite.name=Hot Ancient Granite Ingot
+item.itemDustAncientGranite.name=Ancient Granite Dust
+item.itemDustTinyAncientGranite.name=Tiny Pile of Ancient Granite Dust
+item.itemDustSmallAncientGranite.name=Small Pile of Ancient Granite Dust
+item.itemNuggetAncientGranite.name=Ancient Granite Nugget
+item.itemPlateAncientGranite.name=Ancient Granite Plate
+item.itemPlateDoubleAncientGranite.name=Double Ancient Granite Plate
+tile.Block of Ancient Granite.name=Block of Ancient Granite
+
+item.itemIngotBabbitAlloy.name=Babbit Alloy Ingot
+item.itemHotIngotBabbitAlloy.name=Hot Babbit Alloy Ingot
+item.itemDustBabbitAlloy.name=Babbit Alloy Dust
+item.itemDustTinyBabbitAlloy.name=Tiny Pile of Babbit Alloy Dust
+item.itemDustSmallBabbitAlloy.name=Small Pile of Babbit Alloy Dust
+item.itemNuggetBabbitAlloy.name=Babbit Alloy Nugget
+item.itemPlateBabbitAlloy.name=Babbit Alloy Plate
+item.itemPlateDoubleBabbitAlloy.name=Double Babbit Alloy Plate
+item.itemCellBabbitAlloy.name=Babbit Alloy Cell
+tile.Block of Babbit Alloy.name=Block of Babbit Alloy
+
+item.itemIngotBlackMetal.name=Black Metal Ingot
+item.itemHotIngotBlackMetal.name=Hot Black Metal Ingot
+item.itemDustBlackMetal.name=Black Metal Dust
+item.itemDustTinyBlackMetal.name=Tiny Pile of Black Metal Dust
+item.itemDustSmallBlackMetal.name=Small Pile of Black Metal Dust
+item.itemNuggetBlackMetal.name=Black Metal Nugget
+item.itemPlateBlackMetal.name=Black Metal Plate
+item.itemPlateDoubleBlackMetal.name=Double Black Metal Plate
+item.itemBoltBlackMetal.name=Black Metal Bolt
+item.itemRodBlackMetal.name=Black Metal Rod
+item.itemRodLongBlackMetal.name=Long Black Metal Rod
+item.itemRingBlackMetal.name=Black Metal Ring
+item.itemScrewBlackMetal.name=Black Metal Screw
+item.itemRotorBlackMetal.name=Black Metal Rotor
+item.itemGearBlackMetal.name=Black Metal Gear
+item.itemCellBlackMetal.name=Black Metal Cell
+tile.Block of Black Metal.name=Block of Black Metal
+tile.Black Metal Frame Box.name=Black Metal Frame Box
+
+item.itemIngotWhiteMetal.name=White Metal Ingot
+item.itemHotIngotWhiteMetal.name=Hot White Metal Ingot
+item.itemDustWhiteMetal.name=White Metal Dust
+item.itemDustTinyWhiteMetal.name=Tiny Pile of White Metal Dust
+item.itemDustSmallWhiteMetal.name=Small Pile of White Metal Dust
+item.itemNuggetWhiteMetal.name=White Metal Nugget
+item.itemPlateWhiteMetal.name=White Metal Plate
+item.itemPlateDoubleWhiteMetal.name=Double White Metal Plate
+item.itemBoltWhiteMetal.name=White Metal Bolt
+item.itemRodWhiteMetal.name=White Metal Rod
+item.itemRodLongWhiteMetal.name=Long White Metal Rod
+item.itemRingWhiteMetal.name=White Metal Ring
+item.itemScrewWhiteMetal.name=White Metal Screw
+item.itemRotorWhiteMetal.name=White Metal Rotor
+item.itemGearWhiteMetal.name=White Metal Gear
+item.itemCellWhiteMetal.name=White Metal Cell
+tile.Block of White Metal.name=Block of White Metal
+tile.White Metal Frame Box.name=White Metal Frame Box
+
+//Added 29/04/2019
+tile.OreRunite.name=Runite Ore
+item.crushedRunite.name=Crushed Runite Ore
+item.oreRawRunite.name=Raw Runite Ore
+item.crushedCentrifugedRunite.name=Centrifuged Crushed Runite Ore
+item.crushedPurifiedRunite.name=Purified Crushed Runite Ore
+item.dustImpureRunite.name=Impure Runite Dust
+item.dustPureRunite.name=Purified Runite Dust
+
+tile.OreAncientGranite.name=Ancient Granite Ore
+item.crushedAncientGranite.name=Crushed Ancient Granite Ore
+item.oreRawAncientGranite.name=Raw Ancient Granite Ore
+item.crushedCentrifugedAncientGranite.name=Centrifuged Crushed Ancient Granite Ore
+item.crushedPurifiedAncientGranite.name=Purified Crushed Ancient Granite Ore
+item.dustImpureAncientGranite.name=Impure Ancient Granite Dust
+item.dustPureAncientGranite.name=Purified Ancient Granite Dust
+
+item.itemIngotRhugnor.name=Rhugnor Ingot
+item.itemDustRhugnor.name=Rhugnor Dust
+item.itemDustTinyRhugnor.name=Tiny Pile of Rhugnor Dust
+item.itemDustSmallRhugnor.name=Small Pile of Rhugnor Dust
+item.itemNuggetRhugnor.name=Rhugnor Nugget
+item.itemPlateRhugnor.name=Rhugnor Plate
+item.itemPlateDoubleRhugnor.name=Double Rhugnor Plate
+item.itemCellRhugnor.name=Rhugnor Cell
+tile.Block of Rhugnor.name=Block of Rhugnor
+
+
+
+
+//Added 13/5/19
+
+item.GTPP.BattPack.01.name=Charge Pack [LV]
+item.GTPP.BattPack.02.name=Charge Pack [MV]
+item.GTPP.BattPack.03.name=Charge Pack [HV]
+item.GTPP.BattPack.04.name=Charge Pack [EV]
+item.GTPP.BattPack.05.name=Charge Pack [IV]
+item.IndustrialDiamondExquisite.name=Exquisite Industrial Diamond
+
+item.itemSpringCelestialTungsten.name=Celestial Tungsten Spring
+item.itemSpringWhiteMetal.name=White Metal Spring
+item.itemSpringNitinol60.name=Nitinol 60 Spring
+item.itemSpringWatertightSteel.name=Watertight Steel Spring
+item.itemSpringEglinSteel.name=Eglin Steel Spring
+
+item.itemSmallSpringMaragingSteel250.name=Small Maraging Steel 250 Spring
+item.itemSmallSpringNichrome.name=Small Nichrome Spring
+item.itemSmallSpringStaballoy.name=Small Staballoy Spring
+item.itemSmallSpringBlackSteel.name=Small Black Steel Spring
+item.itemSmallSpringBlackTitanium.name=Small Black Titanium Spring
+
+item.itemFineWireWhiteMetal.name=Fine White Metal Wire
+item.itemFineWirePalladium.name=Fine Palladium Wire
+item.itemFineWireZirconium.name=Fine Zirconium Wire
+item.itemFineWireGrisium.name=Fine Grisium Wire
+item.itemFineWireBabbitAlloy.name=Fine Babbit Alloy Wire
+item.itemFineWireKoboldite.name=Fine Koboldite Wire
+item.itemFineWireHG1223.name=Fine HG-1223 Wire
+item.itemFineWireQuantum.name=Fine Quantum Wire
+
+item.itemHeavyPlatePotin.name=Heavy Potin Plate
+item.itemHeavyPlateWatertightSteel.name=Heavy Watertight Steel Plate
+item.itemHeavyPlateBronze.name=Heavy Bronze Plate
+item.itemHeavyPlateOsmiridium.name=Heavy Osmiridium Plate
+item.itemHeavyPlateQuantum.name=Heavy Quantum Plate
+item.itemHeavyPlateBlackSteel.name=Heavy Black Steel Plate
+item.itemHeavyPlateStainlessSteel.name=Heavy Stainless Steel Plate
+item.itemHeavyPlateEglinSteel.name=Heavy Eglin Steel Plate
+item.itemHeavyPlateMaragingSteel300.name=Heavy Maraging Steel 300 Plate
+item.itemHeavyPlateTalonite.name=Heavy Talonite Plate
+item.itemHeavyPlateHypogen.name=Heavy Hypogen Plate
+item.itemHeavyPlateRhugnor.name=Heavy Rhugnor Plate
+item.itemHeavyPlateAdvancedNitinol.name=Heavy Advanced Nitinol Plate
+item.itemHeavyPlateAstralTitanium.name=Heavy Astral Titanium Plate
+item.itemHeavyPlateCelestialTungsten.name=Heavy Celestial Tungsten Plate
+item.itemHeavyPlateWhiteMetal.name=Heavy White Metal Plate
+item.itemHeavyPlateBlackMetal.name=Heavy Black Metal Plate
+item.itemHeavyPlateAncientGranite.name=Heavy Ancient Granite Plate
+
+item.GTPP.bauble.fireprotection.0.name=Supreme Pizza Gloves
+
+
+//Added 16/5/19
+item.itemCellSeleniumDioxide.name=Selenium Dioxide Cell
+item.itemCellSeleniousAcid.name=Selenious Acid Cell
+
+//Added 25/7/19
+container.pestkiller=Pest Killer
+
+//Added 15/8/19
+gtpp.nei.decayables=Decayables Chest
+entity.batKing.name=Bat King
+item.itemCellCarbyne.name=Carbyne Cell
+item.itemCellHydrogenCyanide.name=Cell of Hydrogen Cyanide
+item.itemCactusCharcoal.name=Cactus Charcoal
+item.itemCactusCoke.name=Cactus Coke
+item.itemSugarCharcoal.name=Sugar Charcoal
+item.itemSugarCoke.name=Sugar Coke
+item.LiquidHydrogen.name=Liquid Hydrogen Cell [LOH]
+
+
+
+//Added 24/8/19
+//Debug Labels
+tile.blockDoorAlloy.name=Reinforced Door
+tile.blockInhibitorObelisk.name=Inhibitor Obelisk
+tile.Battlesign.name=Battlesign
+tile.blockMagicBox.name=Magic Box
+tile.blockManaPod.name=Mana Pod Stem
+tile.buildToolBlock.name=Tool Block
+tile.blockRedPlasma.name=Red Plasma Block
+tile.pipeBlock.name=Pipe
+item.null.name=Null Item report it on github
+
+
+//Added 24/8/19
+tile.OreGreenockite.name=Greenockite Ore
+item.crushedGreenockite.name=Crushed Greenockite Ore
+item.oreRawGreenockite.name=Raw Greenockite Ore
+item.crushedCentrifugedGreenockite.name=Centrifuged Crushed Greenockite Ore
+item.crushedPurifiedGreenockite.name=Purified Crushed Greenockite Ore
+item.dustImpureGreenockite.name=Impure Greenockite Dust
+item.dustPureGreenockite.name=Purified Greenockite Dust
+item.itemDustGreenockite.name=Greenockite Dust
+item.itemDustTinyGreenockite.name=Tiny Pile of Greenockite Dust
+item.itemDustSmallGreenockite.name=Small Pile of Greenockite Dust
+
+tile.OreRareEarthI.name=Rare Earth (I) Ore
+item.crushedRareEarthI.name=Crushed Rare Earth (I) Ore
+item.oreRawRareEarthI.name=Raw Rare Earth (I) Ore
+item.crushedCentrifugedRareEarthI.name=Centrifuged Crushed Rare Earth (I) Ore
+item.crushedPurifiedRareEarthI.name=Purified Crushed Rare Earth (I) Ore
+item.dustImpureRareEarthI.name=Impure Rare Earth (I) Dust
+item.dustPureRareEarthI.name=Purified Rare Earth (I) Dust
+item.itemDustRareEarthI.name=Rare Earth (I) Dust
+item.itemDustTinyRareEarthI.name=Tiny Pile of Rare Earth (I) Dust
+item.itemDustSmallRareEarthI.name=Small Pile of Rare Earth (I) Dust
+
+tile.OreRareEarthII.name=Rare Earth (II) Ore
+item.crushedRareEarthII.name=Crushed Rare Earth (II) Ore
+item.oreRawRareEarthII.name=Raw Rare Earth (II) Ore
+item.crushedCentrifugedRareEarthII.name=Centrifuged Crushed Rare Earth (II) Ore
+item.crushedPurifiedRareEarthII.name=Purified Crushed Rare Earth (II) Ore
+item.dustImpureRareEarthII.name=Impure Rare Earth (II) Dust
+item.dustPureRareEarthII.name=Purified Rare Earth (II) Dust
+item.itemDustRareEarthII.name=Rare Earth (II) Dust
+item.itemDustTinyRareEarthII.name=Tiny Pile of Rare Earth (II) Dust
+item.itemDustSmallRareEarthII.name=Small Pile of Rare Earth (II) Dust
+
+tile.OreRareEarthIII.name=Rare Earth (III) Ore
+item.crushedRareEarthIII.name=Crushed Rare Earth (III) Ore
+item.oreRawRareEarthIII.name=Raw Rare Earth (III) Ore
+item.crushedCentrifugedRareEarthIII.name=Centrifuged Crushed Rare Earth (III) Ore
+item.crushedPurifiedRareEarthIII.name=Purified Crushed Rare Earth (III) Ore
+item.dustImpureRareEarthIII.name=Impure Rare Earth (III) Dust
+item.dustPureRareEarthIII.name=Purified Rare Earth (III) Dust
+item.itemDustRareEarthIII.name=Rare Earth (III) Dust
+item.itemDustTinyRareEarthIII.name=Tiny Pile of Rare Earth (III) Dust
+item.itemDustSmallRareEarthIII.name=Small Pile of Rare Earth (III) Dust
+
+//Added 16/10/19
+item.BioRecipeSelector.name=Programmed Bio Circuit
+item.FermentationBase.name=Cell of Fermentation Base
+item.ureamix.name=Cell of Urea Mix
+item.liquidresin.name=Cell of Liquid Resin
+item.propionicacid.name=Propionic Acid Cell
+item.aceticacid.name=Acetic Acid Cell
+item.BasicAgrichemItem.0.name=Algae Biomass
+item.BasicAgrichemItem.1.name=Green Algae Biomass
+item.BasicAgrichemItem.2.name=Brown Algae Biomass
+item.BasicAgrichemItem.3.name=Golden-Brown Algae Biomass
+item.BasicAgrichemItem.4.name=Red Algae Biomass
+item.BasicAgrichemItem.5.name=Cellulose Fiber
+item.BasicAgrichemItem.6.name=Golden-Brown Cellulose Fiber
+item.BasicAgrichemItem.7.name=Red Cellulose Fiber
+item.BasicAgrichemItem.8.name=Compost
+item.BasicAgrichemItem.9.name=Wood Pellet
+item.BasicAgrichemItem.10.name=Wood Brick
+item.BasicAgrichemItem.11.name=Cellulose Pulp
+item.BasicAgrichemItem.12.name=Raw Bio Resin
+item.BasicAgrichemItem.13.name=Catalyst Carrier
+item.BasicAgrichemItem.14.name=Green Metal Catalyst
+item.BasicAgrichemItem.15.name=Alginic Acid
+item.BasicAgrichemItem.16.name=Alumina
+item.BasicAgrichemItem.17.name=Aluminium Pellet
+item.BasicAgrichemItem.18.name=Sodium Aluminate
+item.BasicAgrichemItem.19.name=Sodium Hydroxide
+item.BasicAgrichemItem.20.name=Sodium Carbonate
+item.BasicAgrichemItem.21.name=Lithium Chloride
+
+//Added 24/10/19
+item.butanol.name=Butanol Cell
+
+//Try Fix IC2 Garbage vv
+fluidHotWater=Heated Water
+fluidHotWater.name=Heated Water
+//Try Fix IC2 Garbage ^^
+
+
+//Added 11/12/19
+item.itemHotIngotTitanium.name=Hot Titanium Ingot
+item.OilHeavy.name=Heavy Oil Cell
+item.UnsymmetricalDimethylhydrazine.name=Unsymmetrical Dimethylhydrazine Cell
+item.benzene.name=Benzene Cell
+item.Benzene.name=Benzene Cell
+item.phenol.name=Phenol Cell
+item.CarbonDioxide.name=Carbon Dioxide Cell
+item.itemCellCarbonDioxide.name=Carbon Dioxide Cell
+item.CarbonMonoxide.name=Carbon Monoxide Cell
+item.itemCellCarbonMonoxide.name=Carbon Monoxide Cell
+item.acetone.name=Acetone Cell
+item.saltwater.name=Salt Water Cell
+item.BasicAgrichemItem.22.name=Mold (Pellet)
+item.BasicAgrichemItem.23.name=Clean Aluminium Mix
+
+//Added 12/12/19
+
+item.BasicGenericChemItem.0.name=Red Metal Catalyst
+item.BasicGenericChemItem.1.name=Yellow Metal Catalyst
+item.BasicGenericChemItem.2.name=Blue Metal Catalyst
+item.BasicGenericChemItem.3.name=Orange Metal Catalyst
+item.BasicGenericChemItem.4.name=Purple Metal Catalyst
+item.BasicGenericChemItem.5.name=Brown Metal Catalyst
+item.MudRedSlurry.name=Cell of Red Mud Slurry
+item.liquid_toluene.name=Toluene Cell
+
+//Added 17/01/20
+item.BasicGenericChemItem.6.name=Pink Metal Catalyst
+
+//Added 23/03/20
+item.BasicMetaFood.0.name=Raw Human Meat
+item.BasicMetaFood.1.name=Cooked Human Meat
+item.BasicMetaFood.2.name=Raw Horse Meat
+item.BasicMetaFood.3.name=Cooked Horse Meat
+item.BasicMetaFood.4.name=Raw Wolf Meat
+item.BasicMetaFood.5.name=Cooked Wolf Meat
+item.BasicMetaFood.6.name=Raw Ocelot Meat
+item.BasicMetaFood.7.name=Cooked Ocelot Meat
+item.BasicMetaFood.8.name=Blaze Flesh
+
+item.itemCellNaquadahFuel.name=Naquadah Fuel Cell
+item.itemCellEnrichedNaquadahFuel.name=Enriched Naquadah Fuel Cell
+item.itemCellNaquadriaFuel.name=Naquadria Fuel Cell
+item.boricacid.name=Boric Acid Cell
+item.hydrochloricacid.name=Hydrochloric Acid Cell
+
+item.BasicAlgaeItem.name=Breedable Algae
+item.BasicAlgaeItem.0.name=Breedable Algae
+item.BasicAlgaeItem.1.name=Breedable Algae
+item.BasicAlgaeItem.2.name=Breedable Algae
+item.BasicAlgaeItem.3.name=Breedable Algae
+item.BasicAlgaeItem.4.name=Breedable Algae
+item.BasicAlgaeItem.5.name=Breedable Algae
+item.BasicAlgaeItem.6.name=Breedable Algae
+
+//Added 30/03/20
+item.milledChalcopyrite.name=Milled Chalcopyrite
+item.milledSphalerite.name=Milled Sphalerite
+item.milledNickel.name=Milled Nickel
+item.milledPlatinum.name=Milled Platinum
+item.milledPentlandite.name=Milled Pentlandite
+item.FrothZincflotation.name=Sphalerite Flotation Froth Cell
+item.FrothCopperflotation.name=Chalcopyrite Flotation Froth Cell
+item.FrothNickelflotation.name=Nickel Flotation Froth Cell
+item.FrothPlatinumflotation.name=Platinum Flotation Froth Cell
+item.FrothPentlanditeflotation.name=Pentlandite Flotation Froth Cell
+item.BasicGenericChemItem.7.name=Alumina Milling Ball
+item.BasicGenericChemItem.8.name=Soapstone Milling Ball
+
+//Added 31/03/20
+item.BasicGenericChemItem.9.name=Sodium Ethoxide Dust
+item.BasicGenericChemItem.10.name=Sodium Ethyl Xanthate Dust
+item.BasicGenericChemItem.11.name=Potassium Ethyl Xanthate Dust
+item.BasicGenericChemItem.12.name=Potassium Hydroxide Dust
+item.CarbonDisulfide.name=Carbon Disulfide Cell
+item.HydrogenSulfide.name=Hydrogen Sulfide Cell
+item.BasicAgrichemItem.24.name=Pinecone
+item.BasicAgrichemItem.25.name=Crushed Pine Materials
+item.pineoil.name=Pine Oil Cell
+
+//Added 11/4/20
+item.milledRedstone.name=Milled Redstone
+item.milledSpessartine.name=Milled Spessartine
+item.milledGrossular.name=Milled Grossular
+item.milledAlmandine.name=Milled Almandine
+item.milledPyrope.name=Milled Pyrope
+item.FrothRedstoneflotation.name=Redstone Flotation Froth Cell
+item.FrothSpessartineflotation.name=Spessartine Flotation Froth Cell
+item.FrothGrossularflotation.name=Grossular Flotation Froth Cell
+item.FrothAlmandineflotation.name=Almandine Flotation Froth Cell
+item.FrothPyropeflotation.name=Pyrope Flotation Froth Cell
+
+//Added 13/04/20
+item.T3RecipeSelector.name=Programmed Breakthrough Circuit
+
+//Added 03/05/20
+entity.miscutils.batKing.name=Spectral Bat
+entity.miscutils.bigChickenFriendly.name=Giant Chicken
+entity.miscutils.AusDingo.name=Dingo
+entity.miscutils.AusBoar.name=Wild Boar
+entity.miscutils.AusSpider.name=Forest Spider
+entity.miscutils.AusOctopus.name=Octopus
+container.EggBox=Egg Hatching Box
+
+//Added 24/05/20
+container.VolumetricFlaskSetter=Volumetric Flask Configurator
+
+//Added 26/05/20
+item.itemIngotLaurenium.name=Laurenium Ingot
+item.itemHotIngotLaurenium.name=Hot Laurenium Ingot
+item.itemDustLaurenium.name=Laurenium Dust
+item.itemDustTinyLaurenium.name=Tiny Pile of Laurenium Dust
+item.itemDustSmallLaurenium.name=Small Pile of Laurenium Dust
+item.itemNuggetLaurenium.name=Laurenium Nugget
+item.itemPlateLaurenium.name=Laurenium Plate
+item.itemPlateDoubleLaurenium.name=Double Laurenium Plate
+item.itemBoltLaurenium.name=Laurenium Bolt
+item.itemRodLaurenium.name=Laurenium Rod
+item.itemRodLongLaurenium.name=Long Laurenium Rod
+item.itemRingLaurenium.name=Laurenium Ring
+item.itemScrewLaurenium.name=Laurenium Screw
+item.itemRotorLaurenium.name=Laurenium Rotor
+item.itemGearLaurenium.name=Laurenium Gear
+item.itemCellLaurenium.name=Laurenium Cell
+tile.Block of Laurenium.name=Block of Laurenium
+tile.Laurenium Frame Box.name=Laurenium Frame Box
+item.itemIngotBotmium.name=Botmium Ingot
+item.itemHotIngotBotmium.name=Hot Botmium Ingot
+item.itemDustBotmium.name=Botmium Dust
+item.itemDustTinyBotmium.name=Tiny Pile of Botmium Dust
+item.itemDustSmallBotmium.name=Small Pile of Botmium Dust
+item.itemNuggetBotmium.name=Botmium Nugget
+item.itemPlateBotmium.name=Botmium Plate
+item.itemPlateDoubleBotmium.name=Double Botmium Plate
+item.itemBoltBotmium.name=Botmium Bolt
+item.itemRodBotmium.name=Botmium Rod
+item.itemRodLongBotmium.name=Long Botmium Rod
+item.itemRingBotmium.name=Botmium Ring
+item.itemScrewBotmium.name=Botmium Screw
+item.itemRotorBotmium.name=Botmium Rotor
+item.itemGearBotmium.name=Botmium Gear
+item.itemCellBotmium.name=Botmium Cell
+tile.Block of Botmium.name=Block of Botmium
+tile.Botmium Frame Box.name=Botmium Frame Box
+
+//Added 29/05/20
+item.itemBasicTurbine.name=Basic Turbine
+item.itemBasicTurbine_0.name=Basic Iron Turbine
+item.itemBasicTurbine_1.name=Basic Bronze Turbine
+item.itemBasicTurbine_2.name=Basic Steel Turbine
+
+interaction.voidexcess.enabled=Void Excess Enabled
+interaction.voidexcess.disabled=Void Excess Disabled
+
+interaction.separateBusses.enabled=Input busses are separated
+interaction.separateBusses.disabled=Input busses are not separated
+
+//Added 29/11/21
+
+item.BasicNuclearChemItem.0.name=Uranium Residue Mix
+item.BasicNuclearChemItem.1.name=Plutonium Residue Mix
+item.BasicNuclearChemItem.2.name=Fluoride Residue Mix
+item.BasicNuclearChemItem.3.name=Noble Residue Mix
+item.BasicNuclearChemItem.4.name=Red Algae Biomass
+item.BasicNuclearChemItem.5.name=Cellulose Fiber
+item.BasicNuclearChemItem.6.name=Golden-Brown Cellulose Fiber
+item.BasicNuclearChemItem.7.name=Red Cellulose Fiber
+
+item.itemCellLiFBeF2ZrF4U235.name=LFTR Fuel I Cell
+item.itemCellLiFBeF2ZrF4UF4.name=LFTR Fuel II Cell
+item.itemCellLiFBeF2ThF4UF4.name=LFTR Fuel III Cell
+item.Li2BeF2UF4.name=Burnt Li2BeF2UF4 Cell
+
+//Added 6/12/21
+item.itemCellLiFBeF2UF4FP.name=LiFBeF2UF4FP Cell
+item.itemCellUF6F2.name=UF6F2 Cell
+item.itemCellLiFBeF2ThF4.name=LiFBeF2ThF4 Cell
+item.itemCellUF6F2FP.name=UF6F2FP Cell
+item.dustProtactinium233.name=Protactinium-233 Dust
+item.itemCellLiFThF4.name=LiFThF4 Cell
+item.NuclearWaste.name=Nuclear Waste Cell
+item.itemCellLiFBeF2UF4.name=LiFBeF2UF4 Cell
+item.itemCellSodiumFluoride.name=Sodium Fluoride Cell
+item.itemCellLiFBeF2.name=LiFBeF2 Cell
+
+//Added 7/12/21
+item.itemCellDysprosium.name=Dysprosium Cell
+item.itemCellThorium.name=Thorium Cell
+item.itemCellTellurium.name=Tellurium Cell
+item.itemCellThorium232.name=Thorium-232 Cell
+item.itemCellLithiumTetrafluoroberyllate.name=Lithium Tetrafluoroberyllate Cell
+item.itemCellBurntReactorFuelI.name=Spent LFTR Fuel I Cell
+item.itemCellBurntReactorFuelII.name=Spent LFTR Fuel II Cell
+item.itemDustTinyIndium.name=Tiny Indium Dust
+item.itemDustSmallIndium.name=Small Indium Dust
+item.itemDustIndium.name=Indium Dust
+item.itemDustTinyBerylliumHydroxide.name=Tiny Beryllium Hydroxide Dust
+item.itemDustSmallBerylliumHydroxide.name=Small Beryllium Hydroxide Dust
+item.itemDustBerylliumHydroxide.name=Beryllium Hydroxide Dust
+item.itemDustTinyAmmoniumBifluoride.name=Tiny Ammonium Bifluoride Dust
+item.itemDustSmallAmmoniumBifluoride.name=Small Ammonium Bifluoride Dust
+item.itemDustAmmoniumBifluoride.name=Ammonium Bifluoride Dust
+item.itemDustTinyAmmoniumTetrafluoroberyllate.name=Tiny Ammonium Tetrafluoroberyllate Dust
+item.itemDustSmallAmmoniumTetrafluoroberyllate.name=Small Ammonium Tetrafluoroberyllate Dust
+item.itemDustAmmoniumTetrafluoroberyllate.name=Ammonium Tetrafluoroberyllate Dust
+
+//Added 10/12/21
+item.ImpureLiFBeF2.name=Impure LiFBeF2 Cell
+item.itemCellHeliumSpargedLiFBeF2UF4FP.name=Helium Sparged LiFBeF2UF4FP Cell
+item.itemCellFluorineSpargedLiFThF4.name=Fluorine Sparged LiFThF4 Cell
+item.itemCellFluorineSpargedLiFBeF2ThF4.name=Fluorine Sparged LiFBeF2ThF4 Cell
+item.itemIngotHS188A.name=HS-188A Ingot
+item.itemHotIngotHS188A.name=Hot HS-188A Ingot
+item.itemDustHS188A.name=HS-188A Dust
+item.itemDustTinyHS188A.name=Tiny Pile of HS-188A Dust
+item.itemDustSmallHS188A.name=Small Pile of HS-188A Dust
+item.itemNuggetHS188A.name=HS-188A Nugget
+item.itemPlateHS188A.name=HS-188A Plate
+item.itemPlateDoubleHS188A.name=Double HS-188A Plate
+item.itemBoltHS188A.name=HS-188A Bolt
+item.itemRodHS188A.name=HS-188A Rod
+item.itemRodLongHS188A.name=Long HS-188A Rod
+item.itemRingHS188A.name=HS-188A Ring
+item.itemScrewHS188A.name=HS-188A Screw
+item.itemRotorHS188A.name=HS-188A Rotor
+item.itemGearHS188A.name=HS-188A Gear
+item.itemCellHS188A.name=HS-188A Cell
+
+//Added 12/12/21
+item.itemIngotErbium.name=Erbium Ingot
+item.itemHotIngotErbium.name=Hot Erbium Ingot
+item.itemDustErbium.name=Erbium Dust
+item.itemDustTinyErbium.name=Tiny Pile of Erbium Dust
+item.itemDustSmallErbium.name=Small Pile of Erbium Dust
+item.itemNuggetErbium.name=Erbium Nugget
+item.itemPlateErbium.name=Erbium Plate
+item.itemPlateDoubleErbium.name=Double Erbium Plate
+item.itemBoltErbium.name=Erbium Bolt
+item.itemRodErbium.name=Erbium Rod
+item.itemRodLongErbium.name=Long Erbium Rod
+item.itemRingErbium.name=Erbium Ring
+item.itemScrewErbium.name=Erbium Screw
+item.itemRotorErbium.name=Erbium Rotor
+item.itemGearErbium.name=Erbium Gear
+item.itemCellErbium.name=Erbium Cell
+item.itemIngotHeLiCoPtEr.name=HeLiCoPtEr Ingot
+item.itemHotIngotHeLiCoPtEr.name=Hot HeLiCoPtEr Ingot
+item.itemDustHeLiCoPtEr.name=HeLiCoPtEr Dust
+item.itemDustTinyHeLiCoPtEr.name=Tiny Pile of HeLiCoPtEr Dust
+item.itemDustSmallHeLiCoPtEr.name=Small Pile of HeLiCoPtEr Dust
+item.itemNuggetHeLiCoPtEr.name=HeLiCoPtEr Nugget
+item.itemPlateHeLiCoPtEr.name=HeLiCoPtEr Plate
+item.itemPlateDoubleHeLiCoPtEr.name=Double HeLiCoPtEr Plate
+item.itemBoltHeLiCoPtEr.name=HeLiCoPtEr Bolt
+item.itemRodHeLiCoPtEr.name=HeLiCoPtEr Rod
+item.itemRodLongHeLiCoPtEr.name=Long HeLiCoPtEr Rod
+item.itemRingHeLiCoPtEr.name=HeLiCoPtEr Ring
+item.itemScrewHeLiCoPtEr.name=HeLiCoPtEr Screw
+item.itemRotorHeLiCoPtEr.name=HeLiCoPtEr Rotor
+item.itemGearHeLiCoPtEr.name=HeLiCoPtEr Gear
+item.itemCellHeLiCoPtEr.name=HeLiCoPtEr Cell
+item.itemIngotPraseodymium.name=Praseodymium Ingot
+item.itemHotIngotPraseodymium.name=Hot Praseodymium Ingot
+item.itemDustPraseodymium.name=Praseodymium Dust
+item.itemDustTinyPraseodymium.name=Tiny Pile of Praseodymium Dust
+item.itemDustSmallPraseodymium.name=Small Pile of Praseodymium Dust
+item.itemNuggetPraseodymium.name=Praseodymium Nugget
+item.itemPlatePraseodymium.name=Praseodymium Plate
+item.itemPlateDoublePraseodymium.name=Double Praseodymium Plate
+item.itemBoltPraseodymium.name=Praseodymium Bolt
+item.itemRodPraseodymium.name=Praseodymium Rod
+item.itemRodLongPraseodymium.name=Long Praseodymium Rod
+item.itemRingPraseodymium.name=Praseodymium Ring
+item.itemScrewPraseodymium.name=Praseodymium Screw
+item.itemRotorPraseodymium.name=Praseodymium Rotor
+item.itemGearPraseodymium.name=Praseodymium Gear
+item.itemCellPraseodymium.name=Praseodymium Cell
+item.milledMonazite.name=Milled Monazite
+item.FrothMonaziteflotation.name=Monazite Flotation Froth Cell
+
+//Added 18/12/21
+item.BasicGenericChemItem.13.name=Formaldehyde Catalyst
+item.hydrogenchloridemix.name=Hydrogen Chlorine Mix
+
+//Added 19/01/22
+item.SunnariumBit.name=Sunnarium Bit
+
+//Added 29/01/22
+sleep.event.okay=You slept well and now feel a little better.
+sleep.event.good=You slept well and now feel much better.
+sleep.event.wellrested=You feel really well rested.
+sleep.event.downsides=The downsides of life no longer effect you.
+item.miscutils:magicfeather.name=Magical Feather
+
+//Added 10/02/22
+item.BasicGenericChemItem.14.name=Solid-Acid Catalyst
+
+//Added 30/05/22
+item.BasicGenericChemItem.15.name=Infinite Mutation Catalyst
+
+//Added 23/10/22
+miscutils.machines.QFTFluidMode=Quantum Force Transformer Fluid Output Mode
+
+//Added 16/11/22
+item.BasicGenericChemItem.16.name=Platinum Group Catalyst
+item.BasicGenericChemItem.17.name=Plastic Polymer Catalyst
+item.BasicGenericChemItem.18.name=Rubber Polymer Catalyst
+item.BasicGenericChemItem.19.name=Adhesion Promoter Catalyst
+item.BasicGenericChemItem.20.name=Tita-Tungsten Indium Catalyst
+item.BasicGenericChemItem.21.name=Radioactivity Catalyst
+item.BasicGenericChemItem.22.name=Rare-Earth Group Catalyst
+item.BasicGenericChemItem.23.name=Simple Naquadah Catalyst
+item.BasicGenericChemItem.24.name=Advanced Naquadah Catalyst
+item.BasicGenericChemItem.25.name=Raw Intelligence Catalyst
+item.BasicGenericChemItem.26.name=Ultimate Plasticizer Catalyst
+item.BasicGenericChemItem.27.name=Biological Intelligence Catalyst
+item.BasicGenericChemItem.28.name=Temporal Harmonizer Catalyst
+
+item.ItemCustomSpawnEgg.name=Spawn %s
+item.itemSimpleFiremaker.message.0=You light the fire pit.
+item.itemSimpleFiremaker.message.1=You somehow managed to set yourself on fire...
+item.itemSimpleFiremaker.message.2=You created a fire!
+item.itemSimpleFiremaker.message.3=Your attemp does nothing.
+
+//Added 17/07/23
+item.BasicGenericChemItem.29.name=Limpid Water Catalyst
+item.BasicGenericChemItem.30.name=Flawless Water Catalyst
+
+//Added 18/07/23
+item.BasicGenericChemItem.31.name=Particle Acceleration Catalyst
+item.BasicGenericChemItem.32.name=Synchrotron-Capable Catalyst
+
+//Added 19/09/23
+item.BasicGenericChemItem.33.name=Algagenic Growth Promoter Catalyst
diff --git a/gtpp/src/main/resources/assets/miscutils/lang/ru_RU.lang b/gtpp/src/main/resources/assets/miscutils/lang/ru_RU.lang
new file mode 100644
index 0000000000..807de0ef72
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/lang/ru_RU.lang
@@ -0,0 +1,3351 @@
+//Creative Tabs
+itemGroup.MiscUtilBlockTab=[GT++] Блоки
+itemGroup.MiscUtilMiscTab=[GT++] Предметы
+itemGroup.MiscUtilCombatTab=[GT++] Бой
+itemGroup.MiscUtilToolsTab=[GT++] Инструменты
+itemGroup.MiscUtilMachineTab=[GT++] Машины
+itemGroup.MiscUtilOtherTab=[GT++] Предметы II
+itemGroup.MiscUtilBOP=[GT++] Biomes O'Plenty Additions
+
+//Debug
+item.AAA_Broken.name=[Несуществующий элемент] Сообщите об этом рецепте на Github, пожалуйста.
+item.itemBedLocator_Base.name=Локатор кровати [NBT Test]
+item.itemBaseItemWithCharge.name=Base Chargeable Item
+item.miscutils_itemDebugShapeSpawner.name=[Debug] Shapes
+
+//Fluids
+tile.fluidSludge.name=Застоявшиеся сточные воды
+tile.fluidSludge.0.name=Застоявшиеся сточные воды
+
+//Death Messages
+death.attack.plasmabolt=%s died by burning hot plasma.
+death.attack.plasmabolt.player=%1$s was killed by %2$s using plasma.
+death.attack.gtpp.grinder=%s was ground into nothingness by an IsaMill.
+
+//Alternative Materials
+item.itemPlateBatteryAlloy.name=Plate of Battery Alloy
+item.itemIngotBatteryAlloy.name=Ingot of Battery Alloy
+item.itemStickyRubber.name=Gumlet of Sticky Rubber
+
+//Unused Fuel rods
+item.itemFuelRod_Empty.name=Empty Fuel Rod
+item.itemFuelRod_Thorium.name=Thorium Fuel Rod
+item.itemFuelRod_Uranium.name=Uranium Fuel Rod
+item.itemFuelRod_Plutonium.name=Plutonium Fuel Rod
+
+//Entities
+entity.constructStaballoy.name=Staballoy Construct
+entity.sickBlaze.name=Infected Zealot
+
+//Tile Entities
+tile.blockToolBuilder.name=GregTech Tool Constructor
+
+//Tools
+item.itemBufferCore.name=Энергетическое ядро
+item.itemStaballoyPickaxe.name=Туннелекопатель
+item.itemStaballoyAxe.name=Лесоруб
+item.itemSandstoneHammer.name=Дробилка булыжников
+
+//Thermal Foundation Stuff
+item.MiscUtils.bucket.bucketPyrotheum.name=Blazing Pyrotheum Bucket
+item.MiscUtils.bucket.bucketCryotheum.name=Gelid Cryotheum Bucket
+item.MiscUtils.bucket.bucketEnder.name=Resonant Ender Bucket
+item.MiscUtils.material.dustPyrotheum.name=Pyrotheum Dust
+item.MiscUtils.material.dustCryotheum.name=Cryotheum Dust
+item.MiscUtils.material.rodBlizz.name=Blizz Rod
+item.MiscUtils.material.dustBlizz.name=Blizz Powder
+
+//------------- 'miscutils' is Case Sensitive Here, unsure why
+tile.miscutils.fluid.pyrotheum.name=Жидкий Пиротеум
+tile.miscutils.fluid.cryotheum.name=Жидкий Криотеум
+tile.miscutils.fluid.ender.name=Жидкий Эндер
+//--------------
+
+//Forestry Stuff
+item.frameAccelerated.name=Accelerated Frame
+item.frameVoid.name=Void Frame
+item.frameMutagenic.name=Mutagenic Frame
+item.frameBusy.name=Working Frame
+item.frameChocolate.name=Chocolate Frame
+item.frameRestraint.name=Restraining Frame
+item.frameSoul.name=Soul Frame
+item.frameHealing.name=Healing Frame
+item.frameNova.name=Nova Frame
+item.frameArborists.name=Arborist Frame
+item.frameDecaying.name=Decaying Frame
+item.frameSlowing.name=Slowing Frame
+item.frameStabilizing.name=Stabilizing Frame
+item.frameUseless.name=Useless Frame
+
+//IC2 stuff
+item.itemEnergeticRotorBlade.name=Energetic Alloy Rotor Blade
+item.itemTungstenSteelRotorBlade.name=TungstenSteel Rotor Blade
+item.itemVibrantRotorBlade.name=Vibrant Alloy Rotor Blade
+item.itemIridiumRotorBlade.name=Iridium Rotor Blade
+item.itemEnergeticShaft.name=Energetic Alloy Shaft
+item.itemTungstenSteelShaft.name=TungstenSteel Shaft
+item.itemVibrantShaft.name=Vibrant Alloy Shaft
+item.itemIridiumShaft.name=Iridium Shaft
+item.itemMagnaliumRotorBlade.name=Magnalium Rotor Blade
+item.itemUltimetRotorBlade.name=Ultimet Blade
+item.itemMagnaliumShaft.name=Magnalium Shaft
+item.itemUltimetShaft.name=Ultimet Shaft
+
+
+//Misc Items
+item.itemPLACEHOLDER_Circuit.name=Quark Manipulator (UV)
+item.itemPlateEnrichedSoularium.name=Enriched Soularium Plate
+item.itemHeliumBlob.name=Mysterious Hydrogen Substance
+item.itemAlkalusDisk.name=Alkalus Disk
+
+//Misc Blocks
+tile.blockCompressedObsidian.0.name=Компрессированный Обсидиан (9)
+tile.blockCompressedObsidian.1.name=Double Compressed Obsidian (81)
+tile.blockCompressedObsidian.2.name=Triple Compressed Obsidian (729)
+tile.blockCompressedObsidian.3.name=Quadruple Compressed Obsidian (6561)
+tile.blockCompressedObsidian.4.name=Quintuple Compressed Obsidian (59049)
+tile.blockCompressedObsidian.5.name=Inverted Obsidian
+tile.blockCompressedObsidian.6.name=Compressed Glowstone (9)
+tile.blockCompressedObsidian.7.name=Double Compressed Glowstone (81)
+tile.blockCompressedObsidian.8.name=Triple Compressed Glowstone (729)
+tile.blockCompressedObsidian.9.name=Quadruple Compressed Glowstone (6561)
+tile.blockCompressedObsidian.10.name=Quintuple Compressed Glowstone (59049)
+tile.blockNet.name=сети
+
+
+//GT++ Items
+
+//Meta Tool
+MU-metaitem.01.0.name=MU-metaitem.01.0.name
+
+//Cells
+item.SulfurDioxide.name=High Quality Sulfur Dioxide Cell
+item.mobessence.name=Mob Essence Cell
+item.Fertiliser.name=Fertiliser Cell
+item.UN32Fertiliser.name=UN-32 Fertiliser Cell
+item.UN18Fertiliser.name=UN-18 Fertiliser Cell
+item.RaisinJuice.name=Raisin Juice Cell
+item.BerylliumHydroxide.name=Beryllium Hydroxide Cell
+item.AmmoniumBifluoride.name=Ammonium Bifluoride Cell
+item.Hydroxide.name=Hydroxide Cell
+item.Ammonium.name=Ammonium Cell
+item.AmmoniumTetrafluoroberyllate.name=Ammonium Tetrafluoroberyllate Cell
+
+//Resources
+item.itemStickyRubber.name=Gumlet of Sticky Rubber
+item.itemCoalCoke.name=Coking Coal
+item.itemHydrogenBlob.name=Mysterious Hydrogen Blob
+item.itemHeliumBlob.name=Mysterious Hydrogen Substance
+
+//Normal Items
+item.itemAlkalusDisk.name=Alkalus Disk
+item.itemSimpleFiremaker.name=Basic Firemaker
+item.itemFiber.name=Plant Fiber
+item.itemRope.name=Rope
+item.backpackRed.name=Red Backpack
+item.backpackGreen.name=Green Backpack
+item.backpackBlue.name=Blue Backpack
+item.backpackYellow.name=Yellow Backpack
+item.backpackPurple.name=Purple Backpack
+item.backpackCyan.name=Cyan Backpack
+item.backpackMaroon.name=Maroon Backpack
+item.backpackOlive.name=Olive Backpack
+item.backpackDarkGreen.name=Dark Green Backpack
+item.backpackDarkPurple.name=Dark Purple Backpack
+item.backpackTeal.name=Teal Backpack
+item.backpackNavy.name=Navy Backpack
+item.backpackSilver.name=Silver Backpack
+item.backpackGray.name=Gray Backpack
+item.backpackBlack.name=Black Backpack
+item.backpackWhite.name=White Backpack
+item.itemBlueprint.name=Blueprint [I am useless]
+item.itemGemShards.name=Diamond Shards
+item.itemHalfCompleteCasings.name=Half Complete Casing
+item.itemSulfuricPotion.name=Throwable Vial of Sulfuric Acid
+item.itemHydrofluoricPotion.name=Throwable Vial of Hydrofluoric Acid
+
+
+//Conversion Dusts
+item.dustNeptunium238.name=Neptunium 238 Dust
+item.dustRadium226.name=Radium 226 Dust
+item.itemDustDecayedRadium226.name=Decayed Radium 226 Dust
+item.itemDustSmallDecayedRadium226.name=Small Decayed Radium 226 Dust
+item.itemDustTinyDecayedRadium226.name=Tiny Decayed Radium 226 Dust
+
+//Material Items
+item.itemDustGadolinium.name=Gadolinium Dust
+item.itemDustSmallGadolinium.name=Small Pile of Gadolinium Dust
+item.itemDustTinyGadolinium.name=Tiny Pile of Gadolinium Dust
+item.itemDustYtterbium.name=Ytterbium Dust
+item.itemDustSmallYtterbium.name=Small Pile of Ytterbium Dust
+item.itemDustTinyYtterbium.name=Tiny Pile of Ytterbium Dust
+item.itemDustSamarium.name=Samarium Dust
+item.itemDustSmallSamarium.name=Small Pile of Samarium Dust
+item.itemDustTinySamarium.name=Tiny Pile of Samarium Dust
+item.itemDustLanthanum.name=Lanthanum Dust
+item.itemDustSmallLanthanum.name=Small Pile of Lanthanum Dust
+item.itemDustTinyLanthanum.name=Tiny Pile of Lanthanum Dust
+item.itemCellNeon.name=Neon Cell
+item.itemCellGermanium.name=Germanium Cell
+item.itemCellSelenium.name=Selenium Cell
+item.itemCellBromine.name=Bromine Cell
+item.itemCellKrypton.name=Krypton Cell
+item.itemCellZirconium.name=Zirconium Cell
+item.itemCellTechnetium.name=Technetium Cell
+item.itemCellRuthenium.name=Ruthenium Cell
+item.itemCellRhodium.name=Rhodium Cell
+item.itemCellIodine.name=Iodine Cell
+item.itemCellXenon.name=Xenon Cell
+item.itemCellHafnium.name=Hafnium Cell
+item.itemCellRhenium.name=Rhenium Cell
+item.itemCellThallium.name=Thallium Cell
+item.itemCellPolonium.name=Polonium Cell
+item.itemCellAstatine.name=Astatine Cell
+item.itemCellFrancium.name=Francium Cell
+item.itemCellRadium.name=Radium Cell
+item.itemCellActinium.name=Actinium Cell
+item.itemCellProtactinium.name=Protactinium Cell
+item.itemCellNeptunium.name=Neptunium Cell
+item.itemCellCurium.name=Curium Cell
+item.itemCellBerkelium.name=Berkelium Cell
+item.itemCellCalifornium.name=Californium Cell
+item.itemCellEinsteinium.name=Einsteinium Cell
+item.itemCellFermium.name=Fermium Cell
+item.itemCellRefinedTrinium.name=Refined Trinium Cell
+item.itemIngotSelenium.name=Selenium Ingot
+item.itemDustSelenium.name=Пыль Селена
+item.itemDustTinySelenium.name=Tiny Pile of Selenium Dust
+item.itemDustSmallSelenium.name=Small Pile of Selenium Dust
+item.itemNuggetSelenium.name=Selenium Nugget
+item.itemPlateSelenium.name=Selenium Plate
+item.itemPlateDoubleSelenium.name=Double Selenium Plate
+item.itemBoltSelenium.name=Selenium Bolt
+item.itemRodSelenium.name=Selenium Rod
+item.itemRodLongSelenium.name=Long Selenium Rod
+item.itemRingSelenium.name=Selenium Ring
+item.itemScrewSelenium.name=Selenium Screw
+item.itemRotorSelenium.name=Selenium Rotor
+item.itemGearSelenium.name=Selenium Gear
+item.itemCellUranium232.name=Uranium 232 Cell
+item.itemCellUranium233.name=Uranium 233 Cell
+item.itemCellThoriumTetrafluoride.name=Thorium Tetrafluoride Cell
+item.itemCellThoriumHexafluoride.name=Thorium Hexafluoride Cell
+item.itemCellUraniumTetrafluoride.name=Uranium Tetrafluoride Cell
+item.itemCellUraniumHexafluoride.name=Uranium Hexafluoride Cell
+item.itemCellZirconiumTetrafluoride.name=Zirconium Tetrafluoride Cell
+item.itemCellBerylliumFluoride.name=Beryllium Fluoride Cell
+item.itemCellLithiumFluoride.name=Lithium Fluoride Cell
+item.itemCellHydroxide.name=Hydroxide Cell
+item.itemCellAmmonium.name=Ammonium Cell
+item.itemCellAmmoniumBifluoride.name=Ammonium Bifluoride Cell
+item.itemCellBerylliumHydroxide.name=Beryllium Hydroxide Cell
+item.itemCellAmmoniumTetrafluoroberyllate.name=Ammonium Tetrafluoroberyllate Cell
+item.itemCellNeptuniumHexafluoride.name=Neptunium Hexafluoride Cell
+item.itemCellTechnetiumHexafluoride.name=Technetium Hexafluoride Cell
+item.itemCellSeleniumHexafluoride.name=Selenium Hexafluoride Cell
+item.itemCellEnergyCrystal.name=Energy Crystal Cell
+item.itemCellBloodSteel.name=Blood Steel Cell
+item.itemCellStaballoy.name=Staballoy Cell
+item.itemCellTantalloy60.name=Tantalloy-60 Cell
+item.itemCellTantalloy61.name=Tantalloy-61 Cell
+item.itemCellTumbaga.name=Tumbaga Cell
+item.itemCellPotin.name=Potin Cell
+item.itemCellInconel625.name=Inconel-625 Cell
+item.itemCellInconel690.name=Inconel-690 Cell
+item.itemCellInconel792.name=Inconel-792 Cell
+item.itemCellZeron100.name=Zeron-100 Cell
+item.itemCellMaragingSteel250.name=Maraging Steel 250 Cell
+item.itemCellMaragingSteel300.name=Maraging Steel 300 Cell
+item.itemCellMaragingSteel350.name=Maraging Steel 350 Cell
+item.itemCellStellite.name=Stellite Cell
+item.itemCellTalonite.name=Talonite Cell
+item.itemCellHastelloyW.name=Hastelloy-W Cell
+item.itemCellHastelloyX.name=Hastelloy-X Cell
+item.itemCellHastelloyN.name=Hastelloy-N Cell
+item.itemCellHastelloyC276.name=Hastelloy-C276 Cell
+item.itemCellIncoloy020.name=Incoloy-020 Cell
+item.itemCellIncoloyDS.name=Incoloy-DS Cell
+item.itemCellIncoloyMA956.name=Incoloy-MA956 Cell
+item.itemCellTungstenCarbide.name=Tungsten Carbide Cell
+item.itemCellSiliconCarbide.name=Silicon Carbide Cell
+item.itemCellTantalumCarbide.name=Tantalum Carbide Cell
+item.itemCellZirconiumCarbide.name=Zirconium Carbide Cell
+item.itemCellNiobiumCarbide.name=Niobium Carbide Cell
+item.itemCellGrisium.name=Grisium Cell
+item.itemCellEglinSteelBaseCompound.name=Eglin Steel Base Compound Cell
+item.itemCellEglinSteel.name=Eglin Steel Cell
+item.itemCellHG1223.name=HG-1223 Cell
+item.itemCellTriniumTitaniumAlloy.name=Trinium Titanium Alloy Cell
+item.itemCellTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Cell
+item.itemCellTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Cell
+item.itemCellQuantum.name=Quantum Cell
+item.itemIngotBromine.name=Bromine Ingot
+item.itemDustBromine.name=Пыль Брома
+item.itemDustTinyBromine.name=Tiny Pile of Bromine Dust
+item.itemDustSmallBromine.name=Small Pile of Bromine Dust
+item.itemNuggetBromine.name=Bromine Nugget
+item.itemPlateBromine.name=Bromine Plate
+item.itemPlateDoubleBromine.name=Double Bromine Plate
+item.itemIngotStrontium.name=Strontium Ingot
+item.itemDustStrontium.name=Пыль Стронция
+item.itemDustTinyStrontium.name=Tiny Pile of Strontium Dust
+item.itemDustSmallStrontium.name=Small Pile of Strontium Dust
+item.itemNuggetStrontium.name=Strontium Nugget
+item.itemPlateStrontium.name=Strontium Plate
+item.itemPlateDoubleStrontium.name=Double Strontium Plate
+item.itemBoltStrontium.name=Strontium Bolt
+item.itemRodStrontium.name=Strontium Rod
+item.itemRodLongStrontium.name=Long Strontium Rod
+item.itemRingStrontium.name=Strontium Ring
+item.itemScrewStrontium.name=Strontium Screw
+item.itemRotorStrontium.name=Strontium Rotor
+item.itemGearStrontium.name=Strontium Gear
+item.itemIngotZirconium.name=Zirconium Ingot
+item.itemDustZirconium.name=Пыль Циркония
+item.itemDustTinyZirconium.name=Tiny Pile of Zirconium Dust
+item.itemDustSmallZirconium.name=Small Pile of Zirconium Dust
+item.itemNuggetZirconium.name=Zirconium Nugget
+item.itemPlateZirconium.name=Zirconium Plate
+item.itemPlateDoubleZirconium.name=Double Zirconium Plate
+item.itemBoltZirconium.name=Zirconium Bolt
+item.itemRodZirconium.name=Zirconium Rod
+item.itemRodLongZirconium.name=Long Zirconium Rod
+item.itemRingZirconium.name=Zirconium Ring
+item.itemScrewZirconium.name=Zirconium Screw
+item.itemRotorZirconium.name=Zirconium Rotor
+item.itemGearZirconium.name=Zirconium Gear
+item.itemIngotRuthenium.name=Ruthenium Ingot
+item.itemDustRuthenium.name=Пыль Рутения
+item.itemDustTinyRuthenium.name=Tiny Pile of Ruthenium Dust
+item.itemDustSmallRuthenium.name=Small Pile of Ruthenium Dust
+item.itemNuggetRuthenium.name=Ruthenium Nugget
+item.itemPlateRuthenium.name=Ruthenium Plate
+item.itemPlateDoubleRuthenium.name=Double Ruthenium Plate
+item.itemBoltRuthenium.name=Ruthenium Bolt
+item.itemRodRuthenium.name=Ruthenium Rod
+item.itemRodLongRuthenium.name=Long Ruthenium Rod
+item.itemRingRuthenium.name=Ruthenium Ring
+item.itemScrewRuthenium.name=Ruthenium Screw
+item.itemRotorRuthenium.name=Ruthenium Rotor
+item.itemGearRuthenium.name=Ruthenium Gear
+item.itemIngotIodine.name=Iodine Ingot
+item.itemDustIodine.name=Пыль Йода
+item.itemDustTinyIodine.name=Tiny Pile of Iodine Dust
+item.itemDustSmallIodine.name=Small Pile of Iodine Dust
+item.itemNuggetIodine.name=Iodine Nugget
+item.itemPlateIodine.name=Iodine Plate
+item.itemPlateDoubleIodine.name=Double Iodine Plate
+item.itemBoltIodine.name=Iodine Bolt
+item.itemRodIodine.name=Iodine Rod
+item.itemRodLongIodine.name=Long Iodine Rod
+item.itemRingIodine.name=Iodine Ring
+item.itemScrewIodine.name=Iodine Screw
+item.itemRotorIodine.name=Iodine Rotor
+item.itemGearIodine.name=Iodine Gear
+item.itemIngotHafnium.name=Hafnium Ingot
+item.itemDustHafnium.name=Пыль Гафния
+item.itemDustTinyHafnium.name=Tiny Pile of Hafnium Dust
+item.itemDustSmallHafnium.name=Small Pile of Hafnium Dust
+item.itemNuggetHafnium.name=Hafnium Nugget
+item.itemPlateHafnium.name=Hafnium Plate
+item.itemPlateDoubleHafnium.name=Double Hafnium Plate
+item.itemBoltHafnium.name=Hafnium Bolt
+item.itemRodHafnium.name=Hafnium Rod
+item.itemRodLongHafnium.name=Long Hafnium Rod
+item.itemRingHafnium.name=Hafnium Ring
+item.itemScrewHafnium.name=Hafnium Screw
+item.itemRotorHafnium.name=Hafnium Rotor
+item.itemGearHafnium.name=Hafnium Gear
+item.itemIngotDysprosium.name=Dysprosium Ingot
+item.itemDustDysprosium.name=Dysprosium Dust
+item.itemDustTinyDysprosium.name=Tiny Pile of Dysprosium Dust
+item.itemDustSmallDysprosium.name=Small Pile of Dysprosium Dust
+item.itemNuggetDysprosium.name=Dysprosium Nugget
+item.itemPlateDysprosium.name=Dysprosium Plate
+item.itemPlateDoubleDysprosium.name=Double Dysprosium Plate
+item.itemBoltDysprosium.name=Dysprosium Bolt
+item.itemRodDysprosium.name=Dysprosium Rod
+item.itemRodLongDysprosium.name=Long Dysprosium Rod
+item.itemRingDysprosium.name=Dysprosium Ring
+item.itemScrewDysprosium.name=Dysprosium Screw
+item.itemRotorDysprosium.name=Dysprosium Rotor
+item.itemGearDysprosium.name=Dysprosium Gear
+item.itemIngotTellurium.name=Tellurium Ingot
+item.itemDustTellurium.name=Tellurium Dust
+item.itemDustTinyTellurium.name=Tiny Pile of Tellurium Dust
+item.itemDustSmallTellurium.name=Small Pile of Tellurium Dust
+item.itemNuggetTellurium.name=Tellurium Nugget
+item.itemPlateTellurium.name=Tellurium Plate
+item.itemPlateDoubleTellurium.name=Double Tellurium Plate
+item.itemBoltTellurium.name=Tellurium Bolt
+item.itemRodTellurium.name=Tellurium Rod
+item.itemRodLongTellurium.name=Long Tellurium Rod
+item.itemRingTellurium.name=Tellurium Ring
+item.itemScrewTellurium.name=Tellurium Screw
+item.itemRotorTellurium.name=Tellurium Rotor
+item.itemGearTellurium.name=Tellurium Gear
+item.itemIngotRhodium.name=Rhodium Ingot
+item.itemDustRhodium.name=Пыль Родия
+item.itemDustTinyRhodium.name=Tiny Pile of Rhodium Dust
+item.itemDustSmallRhodium.name=Small Pile of Rhodium Dust
+item.itemNuggetRhodium.name=Rhodium Nugget
+item.itemPlateRhodium.name=Rhodium Plate
+item.itemPlateDoubleRhodium.name=Double Rhodium Plate
+item.itemBoltRhodium.name=Rhodium Bolt
+item.itemRodRhodium.name=Rhodium Rod
+item.itemRodLongRhodium.name=Long Rhodium Rod
+item.itemRingRhodium.name=Rhodium Ring
+item.itemScrewRhodium.name=Rhodium Screw
+item.itemRotorRhodium.name=Rhodium Rotor
+item.itemGearRhodium.name=Rhodium Gear
+item.itemIngotRhenium.name=Rhenium Ingot
+item.itemDustRhenium.name=Пыль Рения
+item.itemDustTinyRhenium.name=Tiny Pile of Rhenium Dust
+item.itemDustSmallRhenium.name=Small Pile of Rhenium Dust
+item.itemNuggetRhenium.name=Rhenium Nugget
+item.itemPlateRhenium.name=Rhenium Plate
+item.itemPlateDoubleRhenium.name=Double Rhenium Plate
+item.itemBoltRhenium.name=Rhenium Bolt
+item.itemRodRhenium.name=Rhenium Rod
+item.itemRodLongRhenium.name=Long Rhenium Rod
+item.itemRingRhenium.name=Rhenium Ring
+item.itemScrewRhenium.name=Rhenium Screw
+item.itemRotorRhenium.name=Rhenium Rotor
+item.itemGearRhenium.name=Rhenium Gear
+item.itemIngotThallium.name=Thallium Ingot
+item.itemDustThallium.name=Пыль Таллия
+item.itemDustTinyThallium.name=Tiny Pile of Thallium Dust
+item.itemDustSmallThallium.name=Small Pile of Thallium Dust
+item.itemNuggetThallium.name=Thallium Nugget
+item.itemPlateThallium.name=Thallium Plate
+item.itemPlateDoubleThallium.name=Double Thallium Plate
+item.itemBoltThallium.name=Thallium Bolt
+item.itemRodThallium.name=Thallium Rod
+item.itemRodLongThallium.name=Long Thallium Rod
+item.itemRingThallium.name=Thallium Ring
+item.itemScrewThallium.name=Thallium Screw
+item.itemRotorThallium.name=Thallium Rotor
+item.itemGearThallium.name=Thallium Gear
+item.itemIngotTechnetium.name=Technetium Ingot
+item.itemDustTechnetium.name=Пыль Технеция
+item.itemDustTinyTechnetium.name=Tiny Pile of Technetium Dust
+item.itemDustSmallTechnetium.name=Small Pile of Technetium Dust
+item.itemNuggetTechnetium.name=Technetium Nugget
+item.itemPlateTechnetium.name=Technetium Plate
+item.itemPlateDoubleTechnetium.name=Double Technetium Plate
+item.itemIngotPolonium.name=Polonium Ingot
+item.itemDustPolonium.name=Пыль Полония
+item.itemDustTinyPolonium.name=Tiny Pile of Polonium Dust
+item.itemDustSmallPolonium.name=Small Pile of Polonium Dust
+item.itemNuggetPolonium.name=Polonium Nugget
+item.itemPlatePolonium.name=Polonium Plate
+item.itemPlateDoublePolonium.name=Double Polonium Plate
+item.itemIngotAstatine.name=Astatine Ingot
+item.itemDustAstatine.name=Пыль Астатина
+item.itemDustTinyAstatine.name=Tiny Pile of Astatine Dust
+item.itemDustSmallAstatine.name=Small Pile of Astatine Dust
+item.itemNuggetAstatine.name=Astatine Nugget
+item.itemPlateAstatine.name=Astatine Plate
+item.itemPlateDoubleAstatine.name=Double Astatine Plate
+item.itemIngotFrancium.name=Francium Ingot
+item.itemDustFrancium.name=Пыль Франция
+item.itemDustTinyFrancium.name=Tiny Pile of Francium Dust
+item.itemDustSmallFrancium.name=Small Pile of Francium Dust
+item.itemNuggetFrancium.name=Francium Nugget
+item.itemPlateFrancium.name=Francium Plate
+item.itemPlateDoubleFrancium.name=Double Francium Plate
+item.itemIngotRadium.name=Radium Ingot
+item.itemDustRadium.name=Пыль Радия
+item.itemDustTinyRadium.name=Tiny Pile of Radium Dust
+item.itemDustSmallRadium.name=Small Pile of Radium Dust
+item.itemNuggetRadium.name=Radium Nugget
+item.itemPlateRadium.name=Radium Plate
+item.itemPlateDoubleRadium.name=Double Radium Plate
+item.itemIngotActinium.name=Actinium Ingot
+item.itemDustActinium.name=Пыль Актиния
+item.itemDustTinyActinium.name=Tiny Pile of Actinium Dust
+item.itemDustSmallActinium.name=Small Pile of Actinium Dust
+item.itemNuggetActinium.name=Actinium Nugget
+item.itemPlateActinium.name=Actinium Plate
+item.itemPlateDoubleActinium.name=Double Actinium Plate
+item.itemIngotProtactinium.name=Protactinium Ingot
+item.itemDustProtactinium.name=Пыль Протактиния
+item.itemDustTinyProtactinium.name=Tiny Pile of Protactinium Dust
+item.itemDustSmallProtactinium.name=Small Pile of Protactinium Dust
+item.itemNuggetProtactinium.name=Protactinium Nugget
+item.itemPlateProtactinium.name=Protactinium Plate
+item.itemPlateDoubleProtactinium.name=Double Protactinium Plate
+item.itemIngotNeptunium.name=Neptunium Ingot
+item.itemDustNeptunium.name=Пыль Нептуния
+item.itemDustTinyNeptunium.name=Tiny Pile of Neptunium Dust
+item.itemDustSmallNeptunium.name=Small Pile of Neptunium Dust
+item.itemNuggetNeptunium.name=Neptunium Nugget
+item.itemPlateNeptunium.name=Neptunium Plate
+item.itemPlateDoubleNeptunium.name=Double Neptunium Plate
+item.itemIngotCurium.name=Curium Ingot
+item.itemDustCurium.name=Пыль Кюрия
+item.itemDustTinyCurium.name=Tiny Pile of Curium Dust
+item.itemDustSmallCurium.name=Small Pile of Curium Dust
+item.itemNuggetCurium.name=Curium Nugget
+item.itemPlateCurium.name=Curium Plate
+item.itemPlateDoubleCurium.name=Double Curium Plate
+item.itemIngotBerkelium.name=Berkelium Ingot
+item.itemDustBerkelium.name=Пыль Беркелия
+item.itemDustTinyBerkelium.name=Tiny Pile of Berkelium Dust
+item.itemDustSmallBerkelium.name=Small Pile of Berkelium Dust
+item.itemNuggetBerkelium.name=Berkelium Nugget
+item.itemPlateBerkelium.name=Berkelium Plate
+item.itemPlateDoubleBerkelium.name=Double Berkelium Plate
+item.itemIngotCalifornium.name=Californium Ingot
+item.itemDustCalifornium.name=Пыль Калифорния
+item.itemDustTinyCalifornium.name=Tiny Pile of Californium Dust
+item.itemDustSmallCalifornium.name=Small Pile of Californium Dust
+item.itemNuggetCalifornium.name=Californium Nugget
+item.itemPlateCalifornium.name=Californium Plate
+item.itemPlateDoubleCalifornium.name=Double Californium Plate
+item.itemDustEinsteinium.name=Пыль Эйнштейния
+item.itemDustTinyEinsteinium.name=Tiny Pile of Einsteinium Dust
+item.itemDustSmallEinsteinium.name=Small Pile of Einsteinium Dust
+item.itemNuggetEinsteinium.name=Einsteinium Nugget
+item.itemPlateEinsteinium.name=Einsteinium Plate
+item.itemPlateDoubleEinsteinium.name=Double Einsteinium Plate
+item.itemIngotFermium.name=Fermium Ingot
+item.itemDustFermium.name=Пыль Фермия
+item.itemDustTinyFermium.name=Tiny Pile of Fermium Dust
+item.itemDustSmallFermium.name=Small Pile of Fermium Dust
+item.itemNuggetFermium.name=Fermium Nugget
+item.itemPlateFermium.name=Fermium Plate
+item.itemPlateDoubleFermium.name=Double Fermium Plate
+item.itemIngotLithium7.name=Lithium 7 Ingot
+item.itemDustLithium7.name=Пыль Лития 7
+item.itemDustTinyLithium7.name=Tiny Pile of Lithium 7 Dust
+item.itemDustSmallLithium7.name=Small Pile of Lithium 7 Dust
+item.itemNuggetLithium7.name=Lithium 7 Nugget
+item.itemPlateLithium7.name=Lithium 7 Plate
+item.itemPlateDoubleLithium7.name=Double Lithium 7 Plate
+item.itemIngotThorium232.name=Thorium 232 Ingot
+item.itemDustThorium232.name=Пыль Тория 232
+item.itemDustTinyThorium232.name=Tiny Pile of Thorium 232 Dust
+item.itemDustSmallThorium232.name=Small Pile of Thorium 232 Dust
+item.itemNuggetThorium232.name=Thorium 232 Nugget
+item.itemPlateThorium232.name=Thorium 232 Plate
+item.itemPlateDoubleThorium232.name=Double Thorium 232 Plate
+item.itemIngotUranium232.name=Uranium 232 Ingot
+item.itemDustUranium232.name=Пыль Урана 232
+item.itemDustTinyUranium232.name=Tiny Pile of Uranium 232 Dust
+item.itemDustSmallUranium232.name=Small Pile of Uranium 232 Dust
+item.itemNuggetUranium232.name=Uranium 232 Nugget
+item.itemPlateUranium232.name=Uranium 232 Plate
+item.itemRodUranium232.name=Uranium 232 Rod
+item.itemRodLongUranium232.name=Long Uranium 232 Rod
+item.itemIngotUranium233.name=Uranium 233 Ingot
+item.itemDustUranium233.name=Пыль Урана 233
+item.itemDustTinyUranium233.name=Tiny Pile of Uranium 233 Dust
+item.itemDustSmallUranium233.name=Small Pile of Uranium 233 Dust
+item.itemNuggetUranium233.name=Uranium 233 Nugget
+item.itemPlateUranium233.name=Uranium 233 Plate
+item.itemRodUranium233.name=Uranium 233 Rod
+item.itemRodLongUranium233.name=Long Uranium 233 Rod
+item.itemIngotPlutonium238.name=Plutonium 238 Ingot
+item.itemDustPlutonium238.name=Пыль Плутония 238
+item.itemDustTinyPlutonium238.name=Tiny Pile of Plutonium 238 Dust
+item.itemDustSmallPlutonium238.name=Small Pile of Plutonium 238 Dust
+item.itemNuggetPlutonium238.name=Plutonium 238 Nugget
+item.itemPlatePlutonium238.name=Plutonium 238 Plate
+item.itemPlateDoublePlutonium238.name=Double Plutonium 238 Plate
+item.itemIngotStrontium90.name=Strontium 90 Ingot
+item.itemDustStrontium90.name=Пыль Стронция 90
+item.itemDustTinyStrontium90.name=Tiny Pile of Strontium 90 Dust
+item.itemDustSmallStrontium90.name=Small Pile of Strontium 90 Dust
+item.itemNuggetStrontium90.name=Strontium 90 Nugget
+item.itemPlateStrontium90.name=Strontium 90 Plate
+item.itemPlateDoubleStrontium90.name=Double Strontium 90 Plate
+item.itemIngotPolonium210.name=Polonium 210 Ingot
+item.itemDustPolonium210.name=Пыль Полония 210
+item.itemDustTinyPolonium210.name=Tiny Pile of Polonium 210 Dust
+item.itemDustSmallPolonium210.name=Small Pile of Polonium 210 Dust
+item.itemNuggetPolonium210.name=Polonium 210 Nugget
+item.itemPlatePolonium210.name=Polonium 210 Plate
+item.itemPlateDoublePolonium210.name=Double Polonium 210 Plate
+item.itemIngotAmericium241.name=Americium 241 Ingot
+item.itemDustAmericium241.name=Пыль Америция 241
+item.itemDustTinyAmericium241.name=Tiny Pile of Americium 241 Dust
+item.itemDustSmallAmericium241.name=Small Pile of Americium 241 Dust
+item.itemNuggetAmericium241.name=Americium 241 Nugget
+item.itemPlateAmericium241.name=Americium 241 Plate
+item.itemPlateDoubleAmericium241.name=Double Americium 241 Plate
+item.itemIngotSiliconCarbide.name=Silicon Carbide Ingot
+item.itemDustSiliconCarbide.name=Пыль Силиконового Карбида
+item.itemDustTinySiliconCarbide.name=Tiny Pile of Silicon Carbide Dust
+item.itemDustSmallSiliconCarbide.name=Small Pile of Silicon Carbide Dust
+item.itemNuggetSiliconCarbide.name=Silicon Carbide Nugget
+item.itemPlateSiliconCarbide.name=Silicon Carbide Plate
+item.itemPlateDoubleSiliconCarbide.name=Double Silicon Carbide Plate
+item.itemBoltSiliconCarbide.name=Silicon Carbide Bolt
+item.itemRodSiliconCarbide.name=Silicon Carbide Rod
+item.itemRodLongSiliconCarbide.name=Long Silicon Carbide Rod
+item.itemRingSiliconCarbide.name=Silicon Carbide Ring
+item.itemScrewSiliconCarbide.name=Silicon Carbide Screw
+item.itemRotorSiliconCarbide.name=Silicon Carbide Rotor
+item.itemGearSiliconCarbide.name=Silicon Carbide Gear
+item.itemIngotZirconiumCarbide.name=Zirconium Carbide Ingot
+item.itemHotIngotZirconiumCarbide.name=Hot Zirconium Carbide Ingot
+item.itemDustZirconiumCarbide.name=Пыль Циркониевого Карбида
+item.itemDustTinyZirconiumCarbide.name=Tiny Pile of Zirconium Carbide Dust
+item.itemDustSmallZirconiumCarbide.name=Small Pile of Zirconium Carbide Dust
+item.itemNuggetZirconiumCarbide.name=Zirconium Carbide Nugget
+item.itemPlateZirconiumCarbide.name=Zirconium Carbide Plate
+item.itemPlateDoubleZirconiumCarbide.name=Double Zirconium Carbide Plate
+item.itemBoltZirconiumCarbide.name=Zirconium Carbide Bolt
+item.itemRodZirconiumCarbide.name=Zirconium Carbide Rod
+item.itemRodLongZirconiumCarbide.name=Long Zirconium Carbide Rod
+item.itemRingZirconiumCarbide.name=Zirconium Carbide Ring
+item.itemScrewZirconiumCarbide.name=Zirconium Carbide Screw
+item.itemRotorZirconiumCarbide.name=Zirconium Carbide Rotor
+item.itemGearZirconiumCarbide.name=Zirconium Carbide Gear
+item.itemIngotTantalumCarbide.name=Tantalum Carbide Ingot
+item.itemHotIngotTantalumCarbide.name=Hot Tantalum Carbide Ingot
+item.itemDustTantalumCarbide.name=Пыль Танталового Карбида
+item.itemDustTinyTantalumCarbide.name=Tiny Pile of Tantalum Carbide Dust
+item.itemDustSmallTantalumCarbide.name=Small Pile of Tantalum Carbide Dust
+item.itemNuggetTantalumCarbide.name=Tantalum Carbide Nugget
+item.itemPlateTantalumCarbide.name=Tantalum Carbide Plate
+item.itemPlateDoubleTantalumCarbide.name=Double Tantalum Carbide Plate
+item.itemBoltTantalumCarbide.name=Tantalum Carbide Bolt
+item.itemRodTantalumCarbide.name=Tantalum Carbide Rod
+item.itemRodLongTantalumCarbide.name=Long Tantalum Carbide Rod
+item.itemRingTantalumCarbide.name=Tantalum Carbide Ring
+item.itemScrewTantalumCarbide.name=Tantalum Carbide Screw
+item.itemRotorTantalumCarbide.name=Tantalum Carbide Rotor
+item.itemGearTantalumCarbide.name=Tantalum Carbide Gear
+item.itemIngotNiobiumCarbide.name=Niobium Carbide Ingot
+item.itemHotIngotNiobiumCarbide.name=Hot Niobium Carbide Ingot
+item.itemDustNiobiumCarbide.name=Пыль Ниобиевого Карбида
+item.itemDustTinyNiobiumCarbide.name=Tiny Pile of Niobium Carbide Dust
+item.itemDustSmallNiobiumCarbide.name=Small Pile of Niobium Carbide Dust
+item.itemNuggetNiobiumCarbide.name=Niobium Carbide Nugget
+item.itemPlateNiobiumCarbide.name=Niobium Carbide Plate
+item.itemPlateDoubleNiobiumCarbide.name=Double Niobium Carbide Plate
+item.itemBoltNiobiumCarbide.name=Niobium Carbide Bolt
+item.itemRodNiobiumCarbide.name=Niobium Carbide Rod
+item.itemRodLongNiobiumCarbide.name=Long Niobium Carbide Rod
+item.itemRingNiobiumCarbide.name=Niobium Carbide Ring
+item.itemScrewNiobiumCarbide.name=Niobium Carbide Screw
+item.itemRotorNiobiumCarbide.name=Niobium Carbide Rotor
+item.itemGearNiobiumCarbide.name=Niobium Carbide Gear
+item.itemIngotBerylliumFluoride.name=Beryllium Fluoride Ingot
+item.itemDustBerylliumFluoride.name=Пыль Бериллиевого Фторида
+item.itemDustTinyBerylliumFluoride.name=Tiny Pile of Beryllium Fluoride Dust
+item.itemDustSmallBerylliumFluoride.name=Small Pile of Beryllium Fluoride Dust
+item.itemNuggetBerylliumFluoride.name=Beryllium Fluoride Nugget
+item.itemPlateBerylliumFluoride.name=Beryllium Fluoride Plate
+item.itemPlateDoubleBerylliumFluoride.name=Double Beryllium Fluoride Plate
+item.itemIngotLithiumFluoride.name=Lithium Fluoride Ingot
+item.itemDustLithiumFluoride.name=Пыль Литиевого Фторида
+item.itemDustTinyLithiumFluoride.name=Tiny Pile of Lithium Fluoride Dust
+item.itemDustSmallLithiumFluoride.name=Small Pile of Lithium Fluoride Dust
+item.itemNuggetLithiumFluoride.name=Lithium Fluoride Nugget
+item.itemPlateLithiumFluoride.name=Lithium Fluoride Plate
+item.itemPlateDoubleLithiumFluoride.name=Double Lithium Fluoride Plate
+item.itemIngotThoriumTetrafluoride.name=Thorium Tetrafluoride Ingot
+item.itemDustThoriumTetrafluoride.name=Пыль Ториевого Тетрафторида
+item.itemDustTinyThoriumTetrafluoride.name=Tiny Pile of Thorium Tetrafluoride Dust
+item.itemDustSmallThoriumTetrafluoride.name=Small Pile of Thorium Tetrafluoride Dust
+item.itemNuggetThoriumTetrafluoride.name=Thorium Tetrafluoride Nugget
+item.itemPlateThoriumTetrafluoride.name=Thorium Tetrafluoride Plate
+item.itemPlateDoubleThoriumTetrafluoride.name=Double Thorium Tetrafluoride Plate
+item.itemIngotThoriumHexafluoride.name=Thorium Hexafluoride Ingot
+item.itemDustThoriumHexafluoride.name=Пыль Ториевого Гексафторида
+item.itemDustTinyThoriumHexafluoride.name=Tiny Pile of Thorium Hexafluoride Dust
+item.itemDustSmallThoriumHexafluoride.name=Small Pile of Thorium Hexafluoride Dust
+item.itemNuggetThoriumHexafluoride.name=Thorium Hexafluoride Nugget
+item.itemPlateThoriumHexafluoride.name=Thorium Hexafluoride Plate
+item.itemPlateDoubleThoriumHexafluoride.name=Double Thorium Hexafluoride Plate
+item.itemIngotUraniumTetrafluoride.name=Uranium Tetrafluoride Ingot
+item.itemDustUraniumTetrafluoride.name=Пыль Ураниевого Тетрафторида
+item.itemDustTinyUraniumTetrafluoride.name=Tiny Pile of Uranium Tetrafluoride Dust
+item.itemDustSmallUraniumTetrafluoride.name=Small Pile of Uranium Tetrafluoride Dust
+item.itemNuggetUraniumTetrafluoride.name=Uranium Tetrafluoride Nugget
+item.itemPlateUraniumTetrafluoride.name=Uranium Tetrafluoride Plate
+item.itemPlateDoubleUraniumTetrafluoride.name=Double Uranium Tetrafluoride Plate
+item.itemIngotUraniumHexafluoride.name=Uranium Hexafluoride Ingot
+item.itemDustUraniumHexafluoride.name=Пыль Ураниевого Гексафторида
+item.itemDustTinyUraniumHexafluoride.name=Tiny Pile of Uranium Hexafluoride Dust
+item.itemDustSmallUraniumHexafluoride.name=Small Pile of Uranium Hexafluoride Dust
+item.itemNuggetUraniumHexafluoride.name=Uranium Hexafluoride Nugget
+item.itemPlateUraniumHexafluoride.name=Uranium Hexafluoride Plate
+item.itemPlateDoubleUraniumHexafluoride.name=Double Uranium Hexafluoride Plate
+item.itemIngotZirconiumTetrafluoride.name=Zirconium Tetrafluoride Ingot
+item.itemDustZirconiumTetrafluoride.name=Пыль Циркониевого Тетрафторида
+item.itemDustTinyZirconiumTetrafluoride.name=Tiny Pile of Zirconium Tetrafluoride Dust
+item.itemDustSmallZirconiumTetrafluoride.name=Small Pile of Zirconium Tetrafluoride Dust
+item.itemNuggetZirconiumTetrafluoride.name=Zirconium Tetrafluoride Nugget
+item.itemPlateZirconiumTetrafluoride.name=Zirconium Tetrafluoride Plate
+item.itemPlateDoubleZirconiumTetrafluoride.name=Double Zirconium Tetrafluoride Plate
+item.itemIngotNeptuniumHexafluoride.name=Neptunium Hexafluoride Ingot
+item.itemDustNeptuniumHexafluoride.name=Пыль Нептуниевого Гексафторида
+item.itemDustTinyNeptuniumHexafluoride.name=Tiny Pile of Neptunium Hexafluoride Dust
+item.itemDustSmallNeptuniumHexafluoride.name=Small Pile of Neptunium Hexafluoride Dust
+item.itemNuggetNeptuniumHexafluoride.name=Neptunium Hexafluoride Nugget
+item.itemPlateNeptuniumHexafluoride.name=Neptunium Hexafluoride Plate
+item.itemPlateDoubleNeptuniumHexafluoride.name=Double Neptunium Hexafluoride Plate
+item.itemIngotTechnetiumHexafluoride.name=Technetium Hexafluoride Ingot
+item.itemDustTechnetiumHexafluoride.name=Пыль Технециевого Гексафторида
+item.itemDustTinyTechnetiumHexafluoride.name=Tiny Pile of Technetium Hexafluoride Dust
+item.itemDustSmallTechnetiumHexafluoride.name=Small Pile of Technetium Hexafluoride Dust
+item.itemNuggetTechnetiumHexafluoride.name=Technetium Hexafluoride Nugget
+item.itemPlateTechnetiumHexafluoride.name=Technetium Hexafluoride Plate
+item.itemPlateDoubleTechnetiumHexafluoride.name=Double Technetium Hexafluoride Plate
+item.itemIngotSeleniumHexafluoride.name=Selenium Hexafluoride Ingot
+item.itemDustSeleniumHexafluoride.name=Пыль Гексафторида Селена
+item.itemDustTinySeleniumHexafluoride.name=Tiny Pile of Selenium Hexafluoride Dust
+item.itemDustSmallSeleniumHexafluoride.name=Small Pile of Selenium Hexafluoride Dust
+item.itemNuggetSeleniumHexafluoride.name=Selenium Hexafluoride Nugget
+item.itemPlateSeleniumHexafluoride.name=Selenium Hexafluoride Plate
+item.itemPlateDoubleSeleniumHexafluoride.name=Double Selenium Hexafluoride Plate
+item.itemIngotLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Ingot
+item.itemDustLiFBeF2ZrF4U235.name=Пыль Железорана 235
+item.itemDustTinyLiFBeF2ZrF4U235.name=Tiny Pile of LiFBeF2ZrF4U235 Dust
+item.itemDustSmallLiFBeF2ZrF4U235.name=Small Pile of LiFBeF2ZrF4U235 Dust
+item.itemNuggetLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Nugget
+item.itemPlateLiFBeF2ZrF4U235.name=LiFBeF2ZrF4U235 Plate
+item.itemPlateDoubleLiFBeF2ZrF4U235.name=Double LiFBeF2ZrF4U235 Plate
+item.itemIngotLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Ingot
+item.itemDustLiFBeF2ZrF4UF4.name=Пыль Циркониевого Железорана
+item.itemDustTinyLiFBeF2ZrF4UF4.name=Tiny Pile of LiFBeF2ZrF4UF4 Dust
+item.itemDustSmallLiFBeF2ZrF4UF4.name=Small Pile of LiFBeF2ZrF4UF4 Dust
+item.itemNuggetLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Nugget
+item.itemPlateLiFBeF2ZrF4UF4.name=LiFBeF2ZrF4UF4 Plate
+item.itemPlateDoubleLiFBeF2ZrF4UF4.name=Double LiFBeF2ZrF4UF4 Plate
+item.itemIngotLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Ingot
+item.itemDustLiFBeF2ThF4UF4.name=Пыль Ториевого Железорана
+item.itemDustTinyLiFBeF2ThF4UF4.name=Tiny Pile of LiFBeF2ThF4UF4 Dust
+item.itemDustSmallLiFBeF2ThF4UF4.name=Small Pile of LiFBeF2ThF4UF4 Dust
+item.itemNuggetLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Nugget
+item.itemPlateLiFBeF2ThF4UF4.name=LiFBeF2ThF4UF4 Plate
+item.itemPlateDoubleLiFBeF2ThF4UF4.name=Double LiFBeF2ThF4UF4 Plate
+item.itemIngotEnergyCrystal.name=Energy Crystal Ingot
+item.itemHotIngotEnergyCrystal.name=Hot Energy Crystal Ingot
+item.itemDustEnergyCrystal.name=Пыль Энергетического Кристалла
+item.itemDustTinyEnergyCrystal.name=Tiny Pile of Energy Crystal Dust
+item.itemDustSmallEnergyCrystal.name=Small Pile of Energy Crystal Dust
+item.itemNuggetEnergyCrystal.name=Energy Crystal Nugget
+item.itemPlateEnergyCrystal.name=Energy Crystal Plate
+item.itemPlateDoubleEnergyCrystal.name=Double Energy Crystal Plate
+item.itemBoltEnergyCrystal.name=Energy Crystal Bolt
+item.itemRodEnergyCrystal.name=Energy Crystal Rod
+item.itemRodLongEnergyCrystal.name=Long Energy Crystal Rod
+item.itemRingEnergyCrystal.name=Energy Crystal Ring
+item.itemScrewEnergyCrystal.name=Energy Crystal Screw
+item.itemRotorEnergyCrystal.name=Energy Crystal Rotor
+item.itemGearEnergyCrystal.name=Energy Crystal Gear
+item.itemIngotBloodSteel.name=Blood Steel Ingot
+item.itemDustBloodSteel.name=Пыль Кровавой Стали
+item.itemDustTinyBloodSteel.name=Tiny Pile of Blood Steel Dust
+item.itemDustSmallBloodSteel.name=Small Pile of Blood Steel Dust
+item.itemNuggetBloodSteel.name=Blood Steel Nugget
+item.itemPlateBloodSteel.name=Blood Steel Plate
+item.itemPlateDoubleBloodSteel.name=Double Blood Steel Plate
+item.itemBoltBloodSteel.name=Blood Steel Bolt
+item.itemRodBloodSteel.name=Blood Steel Rod
+item.itemRodLongBloodSteel.name=Long Blood Steel Rod
+item.itemRingBloodSteel.name=Blood Steel Ring
+item.itemScrewBloodSteel.name=Blood Steel Screw
+item.itemRotorBloodSteel.name=Blood Steel Rotor
+item.itemGearBloodSteel.name=Blood Steel Gear
+item.itemIngotZeron100.name=Zeron-100 Ingot
+item.itemHotIngotZeron100.name=Hot Zeron-100 Ingot
+item.itemDustZeron100.name=Пыль Церона 100
+item.itemDustTinyZeron100.name=Tiny Pile of Zeron-100 Dust
+item.itemDustSmallZeron100.name=Small Pile of Zeron-100 Dust
+item.itemNuggetZeron100.name=Zeron-100 Nugget
+item.itemPlateZeron100.name=Zeron-100 Plate
+item.itemPlateDoubleZeron100.name=Double Zeron-100 Plate
+item.itemBoltZeron100.name=Zeron-100 Bolt
+item.itemRodZeron100.name=Zeron-100 Rod
+item.itemRodLongZeron100.name=Long Zeron-100 Rod
+item.itemRingZeron100.name=Zeron-100 Ring
+item.itemScrewZeron100.name=Zeron-100 Screw
+item.itemRotorZeron100.name=Zeron-100 Rotor
+item.itemGearZeron100.name=Zeron-100 Gear
+item.itemIngotTumbaga.name=Tumbaga Ingot
+item.itemDustTumbaga.name=Пыль Тумбага
+item.itemDustTinyTumbaga.name=Tiny Pile of Tumbaga Dust
+item.itemDustSmallTumbaga.name=Small Pile of Tumbaga Dust
+item.itemNuggetTumbaga.name=Tumbaga Nugget
+item.itemPlateTumbaga.name=Tumbaga Plate
+item.itemPlateDoubleTumbaga.name=Double Tumbaga Plate
+item.itemBoltTumbaga.name=Tumbaga Bolt
+item.itemRodTumbaga.name=Tumbaga Rod
+item.itemRodLongTumbaga.name=Long Tumbaga Rod
+item.itemRingTumbaga.name=Tumbaga Ring
+item.itemScrewTumbaga.name=Tumbaga Screw
+item.itemRotorTumbaga.name=Tumbaga Rotor
+item.itemGearTumbaga.name=Tumbaga Gear
+item.itemIngotPotin.name=Potin Ingot
+item.itemDustPotin.name=Пыль Потина
+item.itemDustTinyPotin.name=Tiny Pile of Potin Dust
+item.itemDustSmallPotin.name=Small Pile of Potin Dust
+item.itemNuggetPotin.name=Potin Nugget
+item.itemPlatePotin.name=Potin Plate
+item.itemPlateDoublePotin.name=Double Potin Plate
+item.itemBoltPotin.name=Potin Bolt
+item.itemRodPotin.name=Potin Rod
+item.itemRodLongPotin.name=Long Potin Rod
+item.itemRingPotin.name=Potin Ring
+item.itemScrewPotin.name=Potin Screw
+item.itemRotorPotin.name=Potin Rotor
+item.itemGearPotin.name=Potin Gear
+item.itemIngotStaballoy.name=Staballoy Ingot
+item.itemHotIngotStaballoy.name=Hot Staballoy Ingot
+item.itemDustStaballoy.name=Пыль Стального Сплава
+item.itemDustTinyStaballoy.name=Tiny Pile of Staballoy Dust
+item.itemDustSmallStaballoy.name=Small Pile of Staballoy Dust
+item.itemNuggetStaballoy.name=Staballoy Nugget
+item.itemPlateStaballoy.name=Staballoy Plate
+item.itemPlateDoubleStaballoy.name=Double Staballoy Plate
+item.itemBoltStaballoy.name=Staballoy Bolt
+item.itemRodStaballoy.name=Staballoy Rod
+item.itemRodLongStaballoy.name=Long Staballoy Rod
+item.itemRingStaballoy.name=Staballoy Ring
+item.itemScrewStaballoy.name=Staballoy Screw
+item.itemRotorStaballoy.name=Staballoy Rotor
+item.itemGearStaballoy.name=Staballoy Gear
+item.itemIngotTantalloy60.name=Tantalloy-60 Ingot
+item.itemHotIngotTantalloy60.name=Hot Tantalloy-60 Ingot
+item.itemDustTantalloy60.name=Пыль Сплава Тантала 60
+item.itemDustTinyTantalloy60.name=Tiny Pile of Tantalloy-60 Dust
+item.itemDustSmallTantalloy60.name=Small Pile of Tantalloy-60 Dust
+item.itemNuggetTantalloy60.name=Tantalloy-60 Nugget
+item.itemPlateTantalloy60.name=Tantalloy-60 Plate
+item.itemPlateDoubleTantalloy60.name=Double Tantalloy-60 Plate
+item.itemBoltTantalloy60.name=Tantalloy-60 Bolt
+item.itemRodTantalloy60.name=Tantalloy-60 Rod
+item.itemRodLongTantalloy60.name=Long Tantalloy-60 Rod
+item.itemRingTantalloy60.name=Tantalloy-60 Ring
+item.itemScrewTantalloy60.name=Tantalloy-60 Screw
+item.itemRotorTantalloy60.name=Tantalloy-60 Rotor
+item.itemGearTantalloy60.name=Tantalloy-60 Gear
+item.itemIngotTantalloy61.name=Tantalloy-61 Ingot
+item.itemHotIngotTantalloy61.name=Hot Tantalloy-61 Ingot
+item.itemDustTantalloy61.name=Пыль Сплава Тантала 61
+item.itemDustTinyTantalloy61.name=Tiny Pile of Tantalloy-61 Dust
+item.itemDustSmallTantalloy61.name=Small Pile of Tantalloy-61 Dust
+item.itemNuggetTantalloy61.name=Tantalloy-61 Nugget
+item.itemPlateTantalloy61.name=Tantalloy-61 Plate
+item.itemPlateDoubleTantalloy61.name=Double Tantalloy-61 Plate
+item.itemBoltTantalloy61.name=Tantalloy-61 Bolt
+item.itemRodTantalloy61.name=Tantalloy-61 Rod
+item.itemRodLongTantalloy61.name=Long Tantalloy-61 Rod
+item.itemRingTantalloy61.name=Tantalloy-61 Ring
+item.itemScrewTantalloy61.name=Tantalloy-61 Screw
+item.itemRotorTantalloy61.name=Tantalloy-61 Rotor
+item.itemGearTantalloy61.name=Tantalloy-61 Gear
+item.itemIngotInconel625.name=Inconel-625 Ingot
+item.itemHotIngotInconel625.name=Hot Inconel-625 Ingot
+item.itemDustInconel625.name=Пыль Инконеля 625
+item.itemDustTinyInconel625.name=Tiny Pile of Inconel-625 Dust
+item.itemDustSmallInconel625.name=Small Pile of Inconel-625 Dust
+item.itemNuggetInconel625.name=Inconel-625 Nugget
+item.itemPlateInconel625.name=Inconel-625 Plate
+item.itemPlateDoubleInconel625.name=Double Inconel-625 Plate
+item.itemBoltInconel625.name=Inconel-625 Bolt
+item.itemRodInconel625.name=Inconel-625 Rod
+item.itemRodLongInconel625.name=Long Inconel-625 Rod
+item.itemRingInconel625.name=Inconel-625 Ring
+item.itemScrewInconel625.name=Inconel-625 Screw
+item.itemRotorInconel625.name=Inconel-625 Rotor
+item.itemGearInconel625.name=Inconel-625 Gear
+item.itemIngotInconel690.name=Inconel-690 Ingot
+item.itemHotIngotInconel690.name=Hot Inconel-690 Ingot
+item.itemDustInconel690.name=Пыль Инконеля 690
+item.itemDustTinyInconel690.name=Tiny Pile of Inconel-690 Dust
+item.itemDustSmallInconel690.name=Small Pile of Inconel-690 Dust
+item.itemNuggetInconel690.name=Inconel-690 Nugget
+item.itemPlateInconel690.name=Inconel-690 Plate
+item.itemPlateDoubleInconel690.name=Double Inconel-690 Plate
+item.itemBoltInconel690.name=Inconel-690 Bolt
+item.itemRodInconel690.name=Inconel-690 Rod
+item.itemRodLongInconel690.name=Long Inconel-690 Rod
+item.itemRingInconel690.name=Inconel-690 Ring
+item.itemScrewInconel690.name=Inconel-690 Screw
+item.itemRotorInconel690.name=Inconel-690 Rotor
+item.itemGearInconel690.name=Inconel-690 Gear
+item.itemIngotInconel792.name=Inconel-792 Ingot
+item.itemHotIngotInconel792.name=Hot Inconel-792 Ingot
+item.itemDustInconel792.name=Пыль Инконеля 792
+item.itemDustTinyInconel792.name=Tiny Pile of Inconel-792 Dust
+item.itemDustSmallInconel792.name=Small Pile of Inconel-792 Dust
+item.itemNuggetInconel792.name=Inconel-792 Nugget
+item.itemPlateInconel792.name=Inconel-792 Plate
+item.itemPlateDoubleInconel792.name=Double Inconel-792 Plate
+item.itemBoltInconel792.name=Inconel-792 Bolt
+item.itemRodInconel792.name=Inconel-792 Rod
+item.itemRodLongInconel792.name=Long Inconel-792 Rod
+item.itemRingInconel792.name=Inconel-792 Ring
+item.itemScrewInconel792.name=Inconel-792 Screw
+item.itemRotorInconel792.name=Inconel-792 Rotor
+item.itemGearInconel792.name=Inconel-792 Gear
+item.itemDustEglinSteelBaseCompound.name=Пыль Эглинового Стального Базового Соединения
+item.itemDustTinyEglinSteelBaseCompound.name=Tiny Pile of Eglin Steel Base Compound Dust
+item.itemDustSmallEglinSteelBaseCompound.name=Small Pile of Eglin Steel Base Compound Dust
+item.itemIngotEglinSteel.name=Eglin Steel Ingot
+item.itemDustEglinSteel.name=Пыль Эглиновой Стали
+item.itemDustTinyEglinSteel.name=Tiny Pile of Eglin Steel Dust
+item.itemDustSmallEglinSteel.name=Small Pile of Eglin Steel Dust
+item.itemNuggetEglinSteel.name=Eglin Steel Nugget
+item.itemPlateEglinSteel.name=Eglin Steel Plate
+item.itemPlateDoubleEglinSteel.name=Double Eglin Steel Plate
+item.itemBoltEglinSteel.name=Eglin Steel Bolt
+item.itemRodEglinSteel.name=Eglin Steel Rod
+item.itemRodLongEglinSteel.name=Long Eglin Steel Rod
+item.itemRingEglinSteel.name=Eglin Steel Ring
+item.itemScrewEglinSteel.name=Eglin Steel Screw
+item.itemRotorEglinSteel.name=Eglin Steel Rotor
+item.itemGearEglinSteel.name=Eglin Steel Gear
+item.itemIngotMaragingSteel250.name=Maraging Steel 250 Ingot
+item.itemHotIngotMaragingSteel250.name=Hot Maraging Steel 250 Ingot
+item.itemDustMaragingSteel250.name=Пыль Марагинской Стали 250
+item.itemDustTinyMaragingSteel250.name=Tiny Pile of Maraging Steel 250 Dust
+item.itemDustSmallMaragingSteel250.name=Small Pile of Maraging Steel 250 Dust
+item.itemNuggetMaragingSteel250.name=Maraging Steel 250 Nugget
+item.itemPlateMaragingSteel250.name=Maraging Steel 250 Plate
+item.itemPlateDoubleMaragingSteel250.name=Double Maraging Steel 250 Plate
+item.itemBoltMaragingSteel250.name=Maraging Steel 250 Bolt
+item.itemRodMaragingSteel250.name=Maraging Steel 250 Rod
+item.itemRodLongMaragingSteel250.name=Long Maraging Steel 250 Rod
+item.itemRingMaragingSteel250.name=Maraging Steel 250 Ring
+item.itemScrewMaragingSteel250.name=Maraging Steel 250 Screw
+item.itemRotorMaragingSteel250.name=Maraging Steel 250 Rotor
+item.itemGearMaragingSteel250.name=Maraging Steel 250 Gear
+item.itemIngotMaragingSteel300.name=Maraging Steel 300 Ingot
+item.itemHotIngotMaragingSteel300.name=Hot Maraging Steel 300 Ingot
+item.itemDustMaragingSteel300.name=Пыль Марагинской Стали 300
+item.itemDustTinyMaragingSteel300.name=Tiny Pile of Maraging Steel 300 Dust
+item.itemDustSmallMaragingSteel300.name=Small Pile of Maraging Steel 300 Dust
+item.itemNuggetMaragingSteel300.name=Maraging Steel 300 Nugget
+item.itemPlateMaragingSteel300.name=Maraging Steel 300 Plate
+item.itemPlateDoubleMaragingSteel300.name=Double Maraging Steel 300 Plate
+item.itemBoltMaragingSteel300.name=Maraging Steel 300 Bolt
+item.itemRodMaragingSteel300.name=Maraging Steel 300 Rod
+item.itemRodLongMaragingSteel300.name=Long Maraging Steel 300 Rod
+item.itemRingMaragingSteel300.name=Maraging Steel 300 Ring
+item.itemScrewMaragingSteel300.name=Maraging Steel 300 Screw
+item.itemRotorMaragingSteel300.name=Maraging Steel 300 Rotor
+item.itemGearMaragingSteel300.name=Maraging Steel 300 Gear
+item.itemIngotMaragingSteel350.name=Maraging Steel 350 Ingot
+item.itemHotIngotMaragingSteel350.name=Hot Maraging Steel 350 Ingot
+item.itemDustMaragingSteel350.name=Пыль Марагинской Стали 350
+item.itemDustTinyMaragingSteel350.name=Tiny Pile of Maraging Steel 350 Dust
+item.itemDustSmallMaragingSteel350.name=Small Pile of Maraging Steel 350 Dust
+item.itemNuggetMaragingSteel350.name=Maraging Steel 350 Nugget
+item.itemPlateMaragingSteel350.name=Maraging Steel 350 Plate
+item.itemPlateDoubleMaragingSteel350.name=Double Maraging Steel 350 Plate
+item.itemBoltMaragingSteel350.name=Maraging Steel 350 Bolt
+item.itemRodMaragingSteel350.name=Maraging Steel 350 Rod
+item.itemRodLongMaragingSteel350.name=Long Maraging Steel 350 Rod
+item.itemRingMaragingSteel350.name=Maraging Steel 350 Ring
+item.itemScrewMaragingSteel350.name=Maraging Steel 350 Screw
+item.itemRotorMaragingSteel350.name=Maraging Steel 350 Rotor
+item.itemGearMaragingSteel350.name=Maraging Steel 350 Gear
+item.itemIngotStellite.name=Stellite Ingot
+item.itemHotIngotStellite.name=Hot Stellite Ingot
+item.itemDustStellite.name=Пыль Стеллита
+item.itemDustTinyStellite.name=Tiny Pile of Stellite Dust
+item.itemDustSmallStellite.name=Small Pile of Stellite Dust
+item.itemNuggetStellite.name=Stellite Nugget
+item.itemPlateStellite.name=Stellite Plate
+item.itemPlateDoubleStellite.name=Double Stellite Plate
+item.itemBoltStellite.name=Stellite Bolt
+item.itemRodStellite.name=Stellite Rod
+item.itemRodLongStellite.name=Long Stellite Rod
+item.itemRingStellite.name=Stellite Ring
+item.itemScrewStellite.name=Stellite Screw
+item.itemRotorStellite.name=Stellite Rotor
+item.itemGearStellite.name=Stellite Gear
+item.itemIngotTalonite.name=Talonite Ingot
+item.itemDustTalonite.name=пыль Талонита
+item.itemDustTinyTalonite.name=Tiny Pile of Talonite Dust
+item.itemDustSmallTalonite.name=Small Pile of Talonite Dust
+item.itemNuggetTalonite.name=Talonite Nugget
+item.itemPlateTalonite.name=Talonite Plate
+item.itemPlateDoubleTalonite.name=Double Talonite Plate
+item.itemBoltTalonite.name=Talonite Bolt
+item.itemRodTalonite.name=Talonite Rod
+item.itemRodLongTalonite.name=Long Talonite Rod
+item.itemRingTalonite.name=Talonite Ring
+item.itemScrewTalonite.name=Talonite Screw
+item.itemRotorTalonite.name=Talonite Rotor
+item.itemGearTalonite.name=Talonite Gear
+item.itemIngotHastelloyW.name=Hastelloy-W Ingot
+item.itemDustHastelloyW.name=Пыль Хастеллоя W
+item.itemDustTinyHastelloyW.name=Tiny Pile of Hastelloy-W Dust
+item.itemDustSmallHastelloyW.name=Small Pile of Hastelloy-W Dust
+item.itemNuggetHastelloyW.name=Hastelloy-W Nugget
+item.itemPlateHastelloyW.name=Hastelloy-W Plate
+item.itemPlateDoubleHastelloyW.name=Double Hastelloy-W Plate
+item.itemBoltHastelloyW.name=Hastelloy-W Bolt
+item.itemRodHastelloyW.name=Hastelloy-W Rod
+item.itemRodLongHastelloyW.name=Long Hastelloy-W Rod
+item.itemRingHastelloyW.name=Hastelloy-W Ring
+item.itemScrewHastelloyW.name=Hastelloy-W Screw
+item.itemRotorHastelloyW.name=Hastelloy-W Rotor
+item.itemGearHastelloyW.name=Hastelloy-W Gear
+item.itemIngotHastelloyX.name=Hastelloy-X Ingot
+item.itemDustHastelloyX.name=Пыль Хастеллоя X
+item.itemDustTinyHastelloyX.name=Tiny Pile of Hastelloy-X Dust
+item.itemDustSmallHastelloyX.name=Small Pile of Hastelloy-X Dust
+item.itemNuggetHastelloyX.name=Hastelloy-X Nugget
+item.itemPlateHastelloyX.name=Hastelloy-X Plate
+item.itemPlateDoubleHastelloyX.name=Double Hastelloy-X Plate
+item.itemBoltHastelloyX.name=Hastelloy-X Bolt
+item.itemRodHastelloyX.name=Hastelloy-X Rod
+item.itemRodLongHastelloyX.name=Long Hastelloy-X Rod
+item.itemRingHastelloyX.name=Hastelloy-X Ring
+item.itemScrewHastelloyX.name=Hastelloy-X Screw
+item.itemRotorHastelloyX.name=Hastelloy-X Rotor
+item.itemGearHastelloyX.name=Hastelloy-X Gear
+item.itemIngotHastelloyC276.name=Hastelloy-C276 Ingot
+item.itemHotIngotHastelloyC276.name=Hot Hastelloy-C276 Ingot
+item.itemDustHastelloyC276.name=Пыль Хастеллоя C276
+item.itemDustTinyHastelloyC276.name=Tiny Pile of Hastelloy-C276 Dust
+item.itemDustSmallHastelloyC276.name=Small Pile of Hastelloy-C276 Dust
+item.itemNuggetHastelloyC276.name=Hastelloy-C276 Nugget
+item.itemPlateHastelloyC276.name=Hastelloy-C276 Plate
+item.itemPlateDoubleHastelloyC276.name=Double Hastelloy-C276 Plate
+item.itemBoltHastelloyC276.name=Hastelloy-C276 Bolt
+item.itemRodHastelloyC276.name=Hastelloy-C276 Rod
+item.itemRodLongHastelloyC276.name=Long Hastelloy-C276 Rod
+item.itemRingHastelloyC276.name=Hastelloy-C276 Ring
+item.itemScrewHastelloyC276.name=Hastelloy-C276 Screw
+item.itemRotorHastelloyC276.name=Hastelloy-C276 Rotor
+item.itemGearHastelloyC276.name=Hastelloy-C276 Gear
+item.itemIngotHastelloyN.name=Hastelloy-N Ingot
+item.itemHotIngotHastelloyN.name=Hot Hastelloy-N Ingot
+item.itemDustHastelloyN.name=Пыль Хастеллоя N
+item.itemDustTinyHastelloyN.name=Tiny Pile of Hastelloy-N Dust
+item.itemDustSmallHastelloyN.name=Small Pile of Hastelloy-N Dust
+item.itemNuggetHastelloyN.name=Hastelloy-N Nugget
+item.itemPlateHastelloyN.name=Hastelloy-N Plate
+item.itemPlateDoubleHastelloyN.name=Double Hastelloy-N Plate
+item.itemBoltHastelloyN.name=Hastelloy-N Bolt
+item.itemRodHastelloyN.name=Hastelloy-N Rod
+item.itemRodLongHastelloyN.name=Long Hastelloy-N Rod
+item.itemRingHastelloyN.name=Hastelloy-N Ring
+item.itemScrewHastelloyN.name=Hastelloy-N Screw
+item.itemRotorHastelloyN.name=Hastelloy-N Rotor
+item.itemGearHastelloyN.name=Hastelloy-N Gear
+item.itemIngotIncoloy020.name=Incoloy-020 Ingot
+item.itemDustIncoloy020.name=Пыль Инколоя 020
+item.itemDustTinyIncoloy020.name=Tiny Pile of Incoloy-020 Dust
+item.itemDustSmallIncoloy020.name=Small Pile of Incoloy-020 Dust
+item.itemNuggetIncoloy020.name=Incoloy-020 Nugget
+item.itemPlateIncoloy020.name=Incoloy-020 Plate
+item.itemPlateDoubleIncoloy020.name=Double Incoloy-020 Plate
+item.itemBoltIncoloy020.name=Incoloy-020 Bolt
+item.itemRodIncoloy020.name=Incoloy-020 Rod
+item.itemRodLongIncoloy020.name=Long Incoloy-020 Rod
+item.itemRingIncoloy020.name=Incoloy-020 Ring
+item.itemScrewIncoloy020.name=Incoloy-020 Screw
+item.itemRotorIncoloy020.name=Incoloy-020 Rotor
+item.itemGearIncoloy020.name=Incoloy-020 Gear
+item.itemIngotIncoloyDS.name=Incoloy-DS Ingot
+item.itemDustIncoloyDS.name=Пыль Инколоя DS
+item.itemDustTinyIncoloyDS.name=Tiny Pile of Incoloy-DS Dust
+item.itemDustSmallIncoloyDS.name=Small Pile of Incoloy-DS Dust
+item.itemNuggetIncoloyDS.name=Incoloy-DS Nugget
+item.itemPlateIncoloyDS.name=Incoloy-DS Plate
+item.itemPlateDoubleIncoloyDS.name=Double Incoloy-DS Plate
+item.itemBoltIncoloyDS.name=Incoloy-DS Bolt
+item.itemRodIncoloyDS.name=Incoloy-DS Rod
+item.itemRodLongIncoloyDS.name=Long Incoloy-DS Rod
+item.itemRingIncoloyDS.name=Incoloy-DS Ring
+item.itemScrewIncoloyDS.name=Incoloy-DS Screw
+item.itemRotorIncoloyDS.name=Incoloy-DS Rotor
+item.itemGearIncoloyDS.name=Incoloy-DS Gear
+item.itemIngotIncoloyMA956.name=Incoloy-MA956 Ingot
+item.itemHotIngotIncoloyMA956.name=Hot Incoloy-MA956 Ingot
+item.itemDustIncoloyMA956.name=Пыль Инколоя MA956
+item.itemDustTinyIncoloyMA956.name=Tiny Pile of Incoloy-MA956 Dust
+item.itemDustSmallIncoloyMA956.name=Small Pile of Incoloy-MA956 Dust
+item.itemNuggetIncoloyMA956.name=Incoloy-MA956 Nugget
+item.itemPlateIncoloyMA956.name=Incoloy-MA956 Plate
+item.itemPlateDoubleIncoloyMA956.name=Double Incoloy-MA956 Plate
+item.itemBoltIncoloyMA956.name=Incoloy-MA956 Bolt
+item.itemRodIncoloyMA956.name=Incoloy-MA956 Rod
+item.itemRodLongIncoloyMA956.name=Long Incoloy-MA956 Rod
+item.itemRingIncoloyMA956.name=Incoloy-MA956 Ring
+item.itemScrewIncoloyMA956.name=Incoloy-MA956 Screw
+item.itemRotorIncoloyMA956.name=Incoloy-MA956 Rotor
+item.itemGearIncoloyMA956.name=Incoloy-MA956 Gear
+item.itemIngotGrisium.name=Grisium Ingot
+item.itemHotIngotGrisium.name=Hot Grisium Ingot
+item.itemDustGrisium.name=Пыль Грисиума
+item.itemDustTinyGrisium.name=Tiny Pile of Grisium Dust
+item.itemDustSmallGrisium.name=Small Pile of Grisium Dust
+item.itemNuggetGrisium.name=Grisium Nugget
+item.itemPlateGrisium.name=Grisium Plate
+item.itemPlateDoubleGrisium.name=Double Grisium Plate
+item.itemBoltGrisium.name=Grisium Bolt
+item.itemRodGrisium.name=Grisium Rod
+item.itemRodLongGrisium.name=Long Grisium Rod
+item.itemRingGrisium.name=Grisium Ring
+item.itemScrewGrisium.name=Grisium Screw
+item.itemRotorGrisium.name=Grisium Rotor
+item.itemGearGrisium.name=Grisium Gear
+item.itemIngotHG1223.name=HG-1223 Ingot
+item.itemDustHG1223.name=Пыль HG1223
+item.itemDustTinyHG1223.name=Tiny Pile of HG-1223 Dust
+item.itemDustSmallHG1223.name=Small Pile of HG-1223 Dust
+item.itemNuggetHG1223.name=HG-1223 Nugget
+item.itemPlateHG1223.name=HG-1223 Plate
+item.itemPlateDoubleHG1223.name=Double HG-1223 Plate
+item.itemIngotTrinium.name=Trinium Ingot
+item.itemDustTrinium.name=Trinium Dust
+item.itemDustTinyTrinium.name=Tiny Pile of Trinium Dust
+item.itemDustSmallTrinium.name=Small Pile of Trinium Dust
+item.itemNuggetTrinium.name=Trinium Nugget
+item.itemPlateTrinium.name=Trinium Plate
+item.itemPlateDoubleTrinium.name=Double Trinium Plate
+item.itemIngotRefinedTrinium.name=Refined Trinium Ingot
+item.itemDustRefinedTrinium.name=Refined Trinium Dust
+item.itemDustTinyRefinedTrinium.name=Tiny Pile of Refined Trinium Dust
+item.itemDustSmallRefinedTrinium.name=Small Pile of Refined Trinium Dust
+item.itemNuggetRefinedTrinium.name=Refined Trinium Nugget
+item.itemPlateRefinedTrinium.name=Refined Trinium Plate
+item.itemPlateDoubleRefinedTrinium.name=Double Refined Trinium Plate
+item.itemIngotTriniumTitaniumAlloy.name=Trinium Titanium Alloy Ingot
+item.itemHotIngotTriniumTitaniumAlloy.name=Hot Trinium Titanium Alloy Ingot
+item.itemDustTriniumTitaniumAlloy.name=Пыль Сплава Тритий Титана
+item.itemDustTinyTriniumTitaniumAlloy.name=Tiny Pile of Trinium Titanium Alloy Dust
+item.itemDustSmallTriniumTitaniumAlloy.name=Small Pile of Trinium Titanium Alloy Dust
+item.itemNuggetTriniumTitaniumAlloy.name=Trinium Titanium Alloy Nugget
+item.itemPlateTriniumTitaniumAlloy.name=Trinium Titanium Alloy Plate
+item.itemPlateDoubleTriniumTitaniumAlloy.name=Double Trinium Titanium Alloy Plate
+item.itemBoltTriniumTitaniumAlloy.name=Trinium Titanium Alloy Bolt
+item.itemRodTriniumTitaniumAlloy.name=Trinium Titanium Alloy Rod
+item.itemRodLongTriniumTitaniumAlloy.name=Long Trinium Titanium Alloy Rod
+item.itemRingTriniumTitaniumAlloy.name=Trinium Titanium Alloy Ring
+item.itemScrewTriniumTitaniumAlloy.name=Trinium Titanium Alloy Screw
+item.itemRotorTriniumTitaniumAlloy.name=Trinium Titanium Alloy Rotor
+item.itemGearTriniumTitaniumAlloy.name=Trinium Titanium Alloy Gear
+item.itemIngotTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Ingot
+item.itemDustTriniumNaquadahAlloy.name=Пыль Сплава Тритий Наквадаха
+item.itemDustTinyTriniumNaquadahAlloy.name=Tiny Pile of Trinium Naquadah Alloy Dust
+item.itemDustSmallTriniumNaquadahAlloy.name=Small Pile of Trinium Naquadah Alloy Dust
+item.itemNuggetTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Nugget
+item.itemPlateTriniumNaquadahAlloy.name=Trinium Naquadah Alloy Plate
+item.itemPlateDoubleTriniumNaquadahAlloy.name=Double Trinium Naquadah Alloy Plate
+item.itemIngotTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Ingot
+item.itemHotIngotTriniumNaquadahCarbonite.name=Hot Trinium Naquadah Carbonite Ingot
+item.itemDustTriniumNaquadahCarbonite.name=Пыль Карбонита Тритий Наквадаха
+item.itemDustTinyTriniumNaquadahCarbonite.name=Tiny Pile of Trinium Naquadah Carbonite Dust
+item.itemDustSmallTriniumNaquadahCarbonite.name=Small Pile of Trinium Naquadah Carbonite Dust
+item.itemNuggetTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Nugget
+item.itemPlateTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Plate
+item.itemPlateDoubleTriniumNaquadahCarbonite.name=Double Trinium Naquadah Carbonite Plate
+item.itemBoltTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Bolt
+item.itemRodTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Rod
+item.itemRodLongTriniumNaquadahCarbonite.name=Long Trinium Naquadah Carbonite Rod
+item.itemRingTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Ring
+item.itemScrewTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Screw
+item.itemRotorTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Rotor
+item.itemGearTriniumNaquadahCarbonite.name=Trinium Naquadah Carbonite Gear
+item.itemIngotQuantum.name=Quantum Ingot
+item.itemHotIngotQuantum.name=Hot Quantum Ingot
+item.itemDustQuantum.name=Пыль Кванта
+item.itemDustTinyQuantum.name=Tiny Pile of Quantum Dust
+item.itemDustSmallQuantum.name=Small Pile of Quantum Dust
+item.itemNuggetQuantum.name=Quantum Nugget
+item.itemPlateQuantum.name=Quantum Plate
+item.itemPlateDoubleQuantum.name=Double Quantum Plate
+item.itemBoltQuantum.name=Quantum Bolt
+item.itemRodQuantum.name=Quantum Rod
+item.itemRodLongQuantum.name=Long Quantum Rod
+item.itemRingQuantum.name=Quantum Ring
+item.itemScrewQuantum.name=Quantum Screw
+item.itemRotorQuantum.name=Quantum Rotor
+item.itemGearQuantum.name=Quantum Gear
+item.itemDustFluoriteF.name=Fluorite (F) Dust
+item.itemDustTinyFluoriteF.name=Tiny Pile of Fluorite (F) Dust
+item.itemDustSmallFluoriteF.name=Small Pile of Fluorite (F) Dust
+item.crushedFluoriteF.name=Crushed Fluorite (F) Ore
+item.crushedCentrifugedFluoriteF.name=Centrifuged Crushed Fluorite (F) Ore
+item.crushedPurifiedFluoriteF.name=Purified Crushed Fluorite (F) Ore
+item.dustImpureFluoriteF.name=Impure Fluorite (F) Dust
+item.dustPureFluoriteF.name=Purified Fluorite (F) Dust
+item.itemDustCrocoite.name=Пыль Крокоита
+item.itemDustTinyCrocoite.name=Tiny Pile of Crocoite Dust
+item.itemDustSmallCrocoite.name=Small Pile of Crocoite Dust
+item.crushedCrocoite.name=Crushed Crocoite Ore
+item.crushedCentrifugedCrocoite.name=Centrifuged Crushed Crocoite Ore
+item.crushedPurifiedCrocoite.name=Purified Crushed Crocoite Ore
+item.dustImpureCrocoite.name=Impure Crocoite Dust
+item.dustPureCrocoite.name=Purified Crocoite Dust
+item.itemDustGeikielite.name=Пыль Гейкелита
+item.itemDustTinyGeikielite.name=Tiny Pile of Geikielite Dust
+item.itemDustSmallGeikielite.name=Small Pile of Geikielite Dust
+item.crushedGeikielite.name=Crushed Geikielite Ore
+item.crushedCentrifugedGeikielite.name=Centrifuged Crushed Geikielite Ore
+item.crushedPurifiedGeikielite.name=Purified Crushed Geikielite Ore
+item.dustImpureGeikielite.name=Impure Geikielite Dust
+item.dustPureGeikielite.name=Purified Geikielite Dust
+item.itemDustNichromite.name=Пыль Нихромата
+item.itemDustTinyNichromite.name=Tiny Pile of Nichromite Dust
+item.itemDustSmallNichromite.name=Small Pile of Nichromite Dust
+item.crushedNichromite.name=Crushed Nichromite Ore
+item.crushedCentrifugedNichromite.name=Centrifuged Crushed Nichromite Ore
+item.crushedPurifiedNichromite.name=Purified Crushed Nichromite Ore
+item.dustImpureNichromite.name=Impure Nichromite Dust
+item.dustPureNichromite.name=Purified Nichromite Dust
+item.itemDustTitanite.name=Пыль Титанита
+item.itemDustTinyTitanite.name=Tiny Pile of Titanite Dust
+item.itemDustSmallTitanite.name=Small Pile of Titanite Dust
+item.crushedTitanite.name=Crushed Titanite Ore
+item.crushedCentrifugedTitanite.name=Centrifuged Crushed Titanite Ore
+item.crushedPurifiedTitanite.name=Purified Crushed Titanite Ore
+item.dustImpureTitanite.name=Impure Titanite Dust
+item.dustPureTitanite.name=Purified Titanite Dust
+item.itemDustZimbabweite.name=Пыль Зимбабвайта
+item.itemDustTinyZimbabweite.name=Tiny Pile of Zimbabweite Dust
+item.itemDustSmallZimbabweite.name=Small Pile of Zimbabweite Dust
+item.crushedZimbabweite.name=Crushed Zimbabweite Ore
+item.crushedCentrifugedZimbabweite.name=Centrifuged Crushed Zimbabweite Ore
+item.crushedPurifiedZimbabweite.name=Purified Crushed Zimbabweite Ore
+item.dustImpureZimbabweite.name=Impure Zimbabweite Dust
+item.dustPureZimbabweite.name=Purified Zimbabweite Dust
+item.itemDustZirconolite.name=Пыль Цирконолита
+item.itemDustTinyZirconolite.name=Tiny Pile of Zirconolite Dust
+item.itemDustSmallZirconolite.name=Small Pile of Zirconolite Dust
+item.crushedZirconolite.name=Crushed Zirconolite Ore
+item.crushedCentrifugedZirconolite.name=Centrifuged Crushed Zirconolite Ore
+item.crushedPurifiedZirconolite.name=Purified Crushed Zirconolite Ore
+item.dustImpureZirconolite.name=Impure Zirconolite Dust
+item.dustPureZirconolite.name=Purified Zirconolite Dust
+item.itemDustGadoliniteCe.name=Пыль Пыль Гадолинита Ce
+item.itemDustTinyGadoliniteCe.name=Tiny Pile of Gadolinite (Ce) Dust
+item.itemDustSmallGadoliniteCe.name=Small Pile of Gadolinite (Ce) Dust
+item.crushedGadoliniteCe.name=Crushed Gadolinite (Ce) Ore
+item.crushedCentrifugedGadoliniteCe.name=Centrifuged Crushed Gadolinite (Ce) Ore
+item.crushedPurifiedGadoliniteCe.name=Purified Crushed Gadolinite (Ce) Ore
+item.dustImpureGadoliniteCe.name=Impure Gadolinite (Ce) Dust
+item.dustPureGadoliniteCe.name=Purified Gadolinite (Ce) Dust
+item.itemDustGadoliniteY.name=Пыль Гадолинита Y
+item.itemDustTinyGadoliniteY.name=Tiny Pile of Gadolinite (Y) Dust
+item.itemDustSmallGadoliniteY.name=Small Pile of Gadolinite (Y) Dust
+item.crushedGadoliniteY.name=Crushed Gadolinite (Y) Ore
+item.crushedCentrifugedGadoliniteY.name=Centrifuged Crushed Gadolinite (Y) Ore
+item.crushedPurifiedGadoliniteY.name=Purified Crushed Gadolinite (Y) Ore
+item.dustImpureGadoliniteY.name=Impure Gadolinite (Y) Dust
+item.dustPureGadoliniteY.name=Purified Gadolinite (Y) Dust
+item.itemDustLepersonnite.name=Пыль Леперсоннита
+item.itemDustTinyLepersonnite.name=Tiny Pile of Lepersonnite Dust
+item.itemDustSmallLepersonnite.name=Small Pile of Lepersonnite Dust
+item.crushedLepersonnite.name=Crushed Lepersonnite Ore
+item.crushedCentrifugedLepersonnite.name=Centrifuged Crushed Lepersonnite Ore
+item.crushedPurifiedLepersonnite.name=Purified Crushed Lepersonnite Ore
+item.dustImpureLepersonnite.name=Impure Lepersonnite Dust
+item.dustPureLepersonnite.name=Purified Lepersonnite Dust
+item.itemDustSamarskiteY.name=Пыль Самарскита Y
+item.itemDustTinySamarskiteY.name=Tiny Pile of Samarskite (Y) Dust
+item.itemDustSmallSamarskiteY.name=Small Pile of Samarskite (Y) Dust
+item.crushedSamarskiteY.name=Crushed Samarskite (Y) Ore
+item.crushedCentrifugedSamarskiteY.name=Centrifuged Crushed Samarskite (Y) Ore
+item.crushedPurifiedSamarskiteY.name=Purified Crushed Samarskite (Y) Ore
+item.dustImpureSamarskiteY.name=Impure Samarskite (Y) Dust
+item.dustPureSamarskiteY.name=Purified Samarskite (Y) Dust
+item.itemDustSamarskiteYb.name=Пыль Самарскита Yb
+item.itemDustTinySamarskiteYb.name=Tiny Pile of Samarskite (Yb) Dust
+item.itemDustSmallSamarskiteYb.name=Small Pile of Samarskite (Yb) Dust
+item.crushedSamarskiteYb.name=Crushed Samarskite (Yb) Ore
+item.crushedCentrifugedSamarskiteYb.name=Centrifuged Crushed Samarskite (Yb) Ore
+item.crushedPurifiedSamarskiteYb.name=Purified Crushed Samarskite (Yb) Ore
+item.dustImpureSamarskiteYb.name=Impure Samarskite (Yb) Dust
+item.dustPureSamarskiteYb.name=Purified Samarskite (Yb) Dust
+item.itemDustXenotime.name=Пыль Ксенотима
+item.itemDustTinyXenotime.name=Tiny Pile of Xenotime Dust
+item.itemDustSmallXenotime.name=Small Pile of Xenotime Dust
+item.crushedXenotime.name=Crushed Xenotime Ore
+item.crushedCentrifugedXenotime.name=Centrifuged Crushed Xenotime Ore
+item.crushedPurifiedXenotime.name=Purified Crushed Xenotime Ore
+item.dustImpureXenotime.name=Impure Xenotime Dust
+item.dustPureXenotime.name=Purified Xenotime Dust
+item.itemDustYttriaite.name=Yttriaite Dust
+item.itemDustTinyYttriaite.name=Tiny Pile of Yttriaite Dust
+item.itemDustSmallYttriaite.name=Small Pile of Yttriaite Dust
+item.crushedYttriaite.name=Crushed Yttriaite Ore
+item.crushedCentrifugedYttriaite.name=Centrifuged Crushed Yttriaite Ore
+item.crushedPurifiedYttriaite.name=Purified Crushed Yttriaite Ore
+item.dustImpureYttriaite.name=Impure Yttriaite Dust
+item.dustPureYttriaite.name=Purified Yttriaite Dust
+item.itemDustYttrialite.name=Пыль Иттриалита
+item.itemDustTinyYttrialite.name=Tiny Pile of Yttrialite Dust
+item.itemDustSmallYttrialite.name=Small Pile of Yttrialite Dust
+item.crushedYttrialite.name=Crushed Yttrialite Ore
+item.crushedCentrifugedYttrialite.name=Centrifuged Crushed Yttrialite Ore
+item.crushedPurifiedYttrialite.name=Purified Crushed Yttrialite Ore
+item.dustImpureYttrialite.name=Impure Yttrialite Dust
+item.dustPureYttrialite.name=Purified Yttrialite Dust
+item.itemDustYttrocerite.name=Пыль Иттроцерита
+item.itemDustTinyYttrocerite.name=Tiny Pile of Yttrocerite Dust
+item.itemDustSmallYttrocerite.name=Small Pile of Yttrocerite Dust
+item.crushedYttrocerite.name=Crushed Yttrocerite Ore
+item.crushedCentrifugedYttrocerite.name=Centrifuged Crushed Yttrocerite Ore
+item.crushedPurifiedYttrocerite.name=Purified Crushed Yttrocerite Ore
+item.dustImpureYttrocerite.name=Impure Yttrocerite Dust
+item.dustPureYttrocerite.name=Purified Yttrocerite Dust
+item.itemDustZircon.name=Пыль Циркона
+item.itemDustTinyZircon.name=Tiny Pile of Zircon Dust
+item.itemDustSmallZircon.name=Small Pile of Zircon Dust
+item.crushedZircon.name=Crushed Zircon Ore
+item.crushedCentrifugedZircon.name=Centrifuged Crushed Zircon Ore
+item.crushedPurifiedZircon.name=Purified Crushed Zircon Ore
+item.dustImpureZircon.name=Impure Zircon Dust
+item.dustPureZircon.name=Purified Zircon Dust
+item.itemDustPolycrase.name=Пыль Поликраса
+item.itemDustTinyPolycrase.name=Tiny Pile of Polycrase Dust
+item.itemDustSmallPolycrase.name=Small Pile of Polycrase Dust
+item.crushedPolycrase.name=Crushed Polycrase Ore
+item.crushedCentrifugedPolycrase.name=Centrifuged Crushed Polycrase Ore
+item.crushedPurifiedPolycrase.name=Purified Crushed Polycrase Ore
+item.dustImpurePolycrase.name=Impure Polycrase Dust
+item.dustPurePolycrase.name=Purified Polycrase Dust
+item.itemDustZircophyllite.name=Пыль Циркофиллита
+item.itemDustTinyZircophyllite.name=Tiny Pile of Zircophyllite Dust
+item.itemDustSmallZircophyllite.name=Small Pile of Zircophyllite Dust
+item.crushedZircophyllite.name=Crushed Zircophyllite Ore
+item.crushedCentrifugedZircophyllite.name=Centrifuged Crushed Zircophyllite Ore
+item.crushedPurifiedZircophyllite.name=Purified Crushed Zircophyllite Ore
+item.dustImpureZircophyllite.name=Impure Zircophyllite Dust
+item.dustPureZircophyllite.name=Purified Zircophyllite Dust
+item.itemDustZirkelite.name=Пыль Циркелита
+item.itemDustTinyZirkelite.name=Tiny Pile of Zirkelite Dust
+item.itemDustSmallZirkelite.name=Small Pile of Zirkelite Dust
+item.crushedZirkelite.name=Crushed Zirkelite Ore
+item.crushedCentrifugedZirkelite.name=Centrifuged Crushed Zirkelite Ore
+item.crushedPurifiedZirkelite.name=Purified Crushed Zirkelite Ore
+item.dustImpureZirkelite.name=Impure Zirkelite Dust
+item.dustPureZirkelite.name=Purified Zirkelite Dust
+item.itemDustLanthaniteLa.name=Пыль Лантанита La
+item.itemDustTinyLanthaniteLa.name=Tiny Pile of Lanthanite (La) Dust
+item.itemDustSmallLanthaniteLa.name=Small Pile of Lanthanite (La) Dust
+item.crushedLanthaniteLa.name=Crushed Lanthanite (La) Ore
+item.crushedCentrifugedLanthaniteLa.name=Centrifuged Crushed Lanthanite (La) Ore
+item.crushedPurifiedLanthaniteLa.name=Purified Crushed Lanthanite (La) Ore
+item.dustImpureLanthaniteLa.name=Impure Lanthanite (La) Dust
+item.dustPureLanthaniteLa.name=Purified Lanthanite (La) Dust
+item.itemDustLanthaniteCe.name=Пыль Лантанита Ce
+item.itemDustTinyLanthaniteCe.name=Tiny Pile of Lanthanite (Ce) Dust
+item.itemDustSmallLanthaniteCe.name=Small Pile of Lanthanite (Ce) Dust
+item.crushedLanthaniteCe.name=Crushed Lanthanite (Ce) Ore
+item.crushedCentrifugedLanthaniteCe.name=Centrifuged Crushed Lanthanite (Ce) Ore
+item.crushedPurifiedLanthaniteCe.name=Purified Crushed Lanthanite (Ce) Ore
+item.dustImpureLanthaniteCe.name=Impure Lanthanite (Ce) Dust
+item.dustPureLanthaniteCe.name=Purified Lanthanite (Ce) Dust
+item.itemDustLanthaniteNd.name=Пыль Лантанита Nd
+item.itemDustTinyLanthaniteNd.name=Tiny Pile of Lanthanite (Nd) Dust
+item.itemDustSmallLanthaniteNd.name=Small Pile of Lanthanite (Nd) Dust
+item.crushedLanthaniteNd.name=Crushed Lanthanite (Nd) Ore
+item.crushedCentrifugedLanthaniteNd.name=Centrifuged Crushed Lanthanite (Nd) Ore
+item.crushedPurifiedLanthaniteNd.name=Purified Crushed Lanthanite (Nd) Ore
+item.dustImpureLanthaniteNd.name=Impure Lanthanite (Nd) Dust
+item.dustPureLanthaniteNd.name=Purified Lanthanite (Nd) Dust
+item.itemDustAgarditeY.name=Пыль Агардита Y
+item.itemDustTinyAgarditeY.name=Tiny Pile of Agardite (Y) Dust
+item.itemDustSmallAgarditeY.name=Small Pile of Agardite (Y) Dust
+item.crushedAgarditeY.name=Crushed Agardite (Y) Ore
+item.crushedCentrifugedAgarditeY.name=Centrifuged Crushed Agardite (Y) Ore
+item.crushedPurifiedAgarditeY.name=Purified Crushed Agardite (Y) Ore
+item.dustImpureAgarditeY.name=Impure Agardite (Y) Dust
+item.dustPureAgarditeY.name=Purified Agardite (Y) Dust
+item.itemDustAgarditeCd.name=Пыль Агардита Cd
+item.itemDustTinyAgarditeCd.name=Tiny Pile of Agardite (Cd) Dust
+item.itemDustSmallAgarditeCd.name=Small Pile of Agardite (Cd) Dust
+item.crushedAgarditeCd.name=Crushed Agardite (Cd) Ore
+item.crushedCentrifugedAgarditeCd.name=Centrifuged Crushed Agardite (Cd) Ore
+item.crushedPurifiedAgarditeCd.name=Purified Crushed Agardite (Cd) Ore
+item.dustImpureAgarditeCd.name=Impure Agardite (Cd) Dust
+item.dustPureAgarditeCd.name=Purified Agardite (Cd) Dust
+item.itemDustAgarditeLa.name=Пыль Агардита La
+item.itemDustTinyAgarditeLa.name=Tiny Pile of Agardite (La) Dust
+item.itemDustSmallAgarditeLa.name=Small Pile of Agardite (La) Dust
+item.crushedAgarditeLa.name=Crushed Agardite (La) Ore
+item.crushedCentrifugedAgarditeLa.name=Centrifuged Crushed Agardite (La) Ore
+item.crushedPurifiedAgarditeLa.name=Purified Crushed Agardite (La) Ore
+item.dustImpureAgarditeLa.name=Impure Agardite (La) Dust
+item.dustPureAgarditeLa.name=Purified Agardite (La) Dust
+item.itemDustAgarditeNd.name=Пыль Агардита Nd
+item.itemDustTinyAgarditeNd.name=Tiny Pile of Agardite (Nd) Dust
+item.itemDustSmallAgarditeNd.name=Small Pile of Agardite (Nd) Dust
+item.crushedAgarditeNd.name=Crushed Agardite (Nd) Ore
+item.crushedCentrifugedAgarditeNd.name=Centrifuged Crushed Agardite (Nd) Ore
+item.crushedPurifiedAgarditeNd.name=Purified Crushed Agardite (Nd) Ore
+item.dustImpureAgarditeNd.name=Impure Agardite (Nd) Dust
+item.dustPureAgarditeNd.name=Purified Agardite (Nd) Dust
+item.itemDustHibonite.name=Пыль Гибонита
+item.itemDustTinyHibonite.name=Tiny Pile of Hibonite Dust
+item.itemDustSmallHibonite.name=Small Pile of Hibonite Dust
+item.crushedHibonite.name=Crushed Hibonite Ore
+item.crushedCentrifugedHibonite.name=Centrifuged Crushed Hibonite Ore
+item.crushedPurifiedHibonite.name=Purified Crushed Hibonite Ore
+item.dustImpureHibonite.name=Impure Hibonite Dust
+item.dustPureHibonite.name=Purified Hibonite Dust
+item.itemDustCerite.name=Пыль Церита
+item.itemDustTinyCerite.name=Tiny Pile of Cerite Dust
+item.itemDustSmallCerite.name=Small Pile of Cerite Dust
+item.crushedCerite.name=Crushed Cerite Ore
+item.crushedCentrifugedCerite.name=Centrifuged Crushed Cerite Ore
+item.crushedPurifiedCerite.name=Purified Crushed Cerite Ore
+item.dustImpureCerite.name=Impure Cerite Dust
+item.dustPureCerite.name=Purified Cerite Dust
+item.itemDustFluorcaphite.name=Пыль Фторокафита
+item.itemDustTinyFluorcaphite.name=Tiny Pile of Fluorcaphite Dust
+item.itemDustSmallFluorcaphite.name=Small Pile of Fluorcaphite Dust
+item.crushedFluorcaphite.name=Crushed Fluorcaphite Ore
+item.crushedCentrifugedFluorcaphite.name=Centrifuged Crushed Fluorcaphite Ore
+item.crushedPurifiedFluorcaphite.name=Purified Crushed Fluorcaphite Ore
+item.dustImpureFluorcaphite.name=Impure Fluorcaphite Dust
+item.dustPureFluorcaphite.name=Purified Fluorcaphite Dust
+item.itemDustFlorencite.name=Пыль Флоренцита
+item.itemDustTinyFlorencite.name=Tiny Pile of Florencite Dust
+item.itemDustSmallFlorencite.name=Small Pile of Florencite Dust
+item.crushedFlorencite.name=Crushed Florencite Ore
+item.crushedCentrifugedFlorencite.name=Centrifuged Crushed Florencite Ore
+item.crushedPurifiedFlorencite.name=Purified Crushed Florencite Ore
+item.dustImpureFlorencite.name=Impure Florencite Dust
+item.dustPureFlorencite.name=Purified Florencite Dust
+item.itemDustCryoliteF.name=Cryolite (F) Dust
+item.itemDustTinyCryoliteF.name=Tiny Pile of Cryolite (F) Dust
+item.itemDustSmallCryoliteF.name=Small Pile of Cryolite (F) Dust
+item.crushedCryoliteF.name=Crushed Cryolite (F) Ore
+item.crushedCentrifugedCryoliteF.name=Centrifuged Crushed Cryolite (F) Ore
+item.crushedPurifiedCryoliteF.name=Purified Crushed Cryolite (F) Ore
+item.dustImpureCryoliteF.name=Impure Cryolite (F) Dust
+item.dustPureCryoliteF.name=Purified Cryolite (F) Dust
+item.itemDustTinyYellorium.name=Tiny Pile of Yellorium Dust
+item.itemDustSmallYellorium.name=Small Pile of Yellorium Dust
+item.crushedYellorium.name=Crushed Yellorium Ore
+item.crushedCentrifugedYellorium.name=Centrifuged Crushed Yellorium Ore
+item.crushedPurifiedYellorium.name=Purified Crushed Yellorium Ore
+item.dustImpureYellorium.name=Impure Yellorium Dust
+item.dustPureYellorium.name=Purified Yellorium Dust
+
+//Shards
+item.itemDrained.name=Drained Shard
+item.itemDustInfusedAir.name=Infused Air Dust
+item.itemDustInfusedFire.name=Infused Fire Dust
+item.itemDustInfusedEarth.name=Infused Earth Dust
+item.itemDustInfusedWater.name=Infused Water Dust
+
+
+//Misc Material Items
+item.itemDustLithiumCarbonate.name=Lithium Carbonate Dust
+item.itemDustSmallLithiumCarbonate.name=Small Pile of Lithium Carbonate Dust
+item.itemDustTinyLithiumCarbonate.name=Tiny Pile of Lithium Carbonate Dust
+item.itemDustLithiumPeroxide.name=Lithium Peroxide Dust
+item.itemDustSmallLithiumPeroxide.name=Small Pile of Lithium Peroxide Dust
+item.itemDustTinyLithiumPeroxide.name=Tiny Pile of Lithium Peroxide Dust
+item.itemDustLithiumHydroxide.name=Lithium Hydroxide Dust
+item.itemDustSmallLithiumHydroxide.name=Small Pile of Lithium Hydroxide Dust
+item.itemDustTinyLithiumHydroxide.name=Tiny Pile of Lithium Hydroxide Dust
+item.itemDustCalciumHydroxide.name=Hydrated Lime Dust
+item.itemDustSmallCalciumHydroxide.name=Small Pile of Hydrated Lime Dust
+item.itemDustTinyCalciumHydroxide.name=Tiny Pile of Hydrated Lime Dust
+item.itemDustCalciumCarbonate.name=Calcium Carbonate Dust
+item.itemDustSmallCalciumCarbonate.name=Small Pile of Calcium Carbonate Dust
+item.itemDustTinyCalciumCarbonate.name=Tiny Pile of Calcium Carbonate Dust
+item.itemDustGypsum.name=Calcium Sulfate (Gypsum) Dust
+item.itemDustSmallGypsum.name=Small Pile of Calcium Sulfate (Gypsum) Dust
+item.itemDustTinyGypsum.name=Tiny Pile of Calcium Sulfate (Gypsum) Dust
+item.itemDustLi2CO3CaOH2.name=Li2CO3 + Ca(OH)2 Compound Dust
+item.itemDustSmallLi2CO3CaOH2.name=Small Pile of Li2CO3 + Ca(OH)2 Compound Dust
+item.itemDustTinyLi2CO3CaOH2.name=Tiny Pile of Li2CO3 + Ca(OH)2 Compound Dust
+item.itemDustLi2BeF4.name=Li2BeF4 Fuel Compound Dust
+item.itemDustSmallLi2BeF4.name=Small Pile of Li2BeF4 Fuel Compound Dust
+item.itemDustTinyLi2BeF4.name=Tiny Pile of Li2BeF4 Fuel Compound Dust
+item.Li2BeF4.name=Li2BeF4 Cell
+item.itemCircuitLFTR.name=§aControl Circuit
+item.itemZirconiumPellet.name=Zirconium Pellet [ZrCl₄]
+item.itemDustZrCl4.name=ZrCl4 Dust
+item.itemDustSmallZrCl4.name=Small Pile of ZrCl4 Dust
+item.itemDustTinyZrCl4.name=Tiny Pile of ZrCl4 Dust
+item.itemDustCookedZrCl4.name=Cooked ZrCl4 Dust
+item.itemDustSmallCookedZrCl4.name=Small Pile of Cooked ZrCl4 Dust
+item.itemDustTinyCookedZrCl4.name=Tiny Pile of Cooked ZrCl4 Dust
+item.itemDustUN18Fertiliser.name=UN-18 Fertiliser Dust
+item.itemDustSmallUN18Fertiliser.name=Small Pile of UN-18 Fertiliser Dust
+item.itemDustTinyUN18Fertiliser.name=Tiny Pile of UN-18 Fertiliser Dust
+item.itemDustUN32Fertiliser.name=UN-32 Fertiliser Dust
+item.itemDustSmallUN32Fertiliser.name=Small Pile of UN-32 Fertiliser Dust
+item.itemDustTinyUN32Fertiliser.name=Tiny Pile of UN-32 Fertiliser Dust
+
+
+//Multitools
+item.AluminiumMultipick.name=Aluminium Multipick
+item.AluminiumMultispade.name=Aluminium Multispade
+item.BerylliumMultispade.name=Beryllium Multispade
+item.BismuthMultispade.name=Bismuth Multispade
+item.CarbonMultispade.name=Carbon Multispade
+item.ChromeMultipick.name=Chrome Multipick
+item.ChromeMultispade.name=Chrome Multispade
+item.CobaltMultipick.name=Cobalt Multipick
+item.CobaltMultispade.name=Cobalt Multispade
+item.GoldMultispade.name=Gold Multispade
+item.IridiumMultipick.name=Iridium Multipick
+item.IridiumMultispade.name=Iridium Multispade
+item.IronMultipick.name=Iron Multipick
+item.IronMultispade.name=Iron Multispade
+item.LeadMultispade.name=Lead Multispade
+item.ManganeseMultipick.name=Manganese Multipick
+item.ManganeseMultispade.name=Manganese Multispade
+item.MolybdenumMultipick.name=Molybdenum Multipick
+item.MolybdenumMultispade.name=Molybdenum Multispade
+item.NeodymiumMultipick.name=Neodymium Multipick
+item.NeodymiumMultispade.name=Neodymium Multispade
+item.NeutroniumMultipick.name=Neutronium Multipick
+item.NeutroniumMultispade.name=Neutronium Multispade
+item.NickelMultispade.name=Nickel Multispade
+item.OsmiumMultipick.name=Osmium Multipick
+item.OsmiumMultispade.name=Osmium Multispade
+item.PalladiumMultipick.name=Palladium Multipick
+item.PalladiumMultispade.name=Palladium Multispade
+item.PlatinumMultispade.name=Platinum Multispade
+item.Plutonium241Multipick.name=Plutonium 241 Multipick
+item.Plutonium241Multispade.name=Plutonium 241 Multispade
+item.SilverMultispade.name=Silver Multispade
+item.ThoriumMultipick.name=Thorium Multipick
+item.ThoriumMultispade.name=Thorium Multispade
+item.TitaniumMultipick.name=Titanium Multipick
+item.TitaniumMultispade.name=Titanium Multispade
+item.TungstenMultipick.name=Tungsten Multipick
+item.TungstenMultispade.name=Tungsten Multispade
+item.Uranium235Multipick.name=Uranium 235 Multipick
+item.Uranium235Multispade.name=Uranium 235 Multispade
+item.DarkSteelMultipick.name=Dark Steel Multipick
+item.DarkSteelMultispade.name=Dark Steel Multispade
+item.DuraniumMultipick.name=Duranium Multipick
+item.DuraniumMultispade.name=Duranium Multispade
+item.InfusedGoldMultispade.name=Infused Gold Multispade
+item.NaquadahMultipick.name=Naquadah Multipick
+item.NaquadahMultispade.name=Naquadah Multispade
+item.NaquadahAlloyMultipick.name=Naquadah Alloy Multipick
+item.NaquadahAlloyMultispade.name=Naquadah Alloy Multispade
+item.NaquadriaMultipick.name=Naquadria Multipick
+item.NaquadriaMultispade.name=Naquadria Multispade
+item.TritaniumMultipick.name=Tritanium Multipick
+item.TritaniumMultispade.name=Tritanium Multispade
+item.OsmiridiumMultipick.name=Osmiridium Multipick
+item.OsmiridiumMultispade.name=Osmiridium Multispade
+item.BrassMultispade.name=Brass Multispade
+item.BronzeMultipick.name=Bronze Multipick
+item.BronzeMultispade.name=Bronze Multispade
+item.CupronickelMultispade.name=Cupronickel Multispade
+item.ElectrumMultispade.name=Electrum Multispade
+item.InvarMultipick.name=Invar Multipick
+item.InvarMultispade.name=Invar Multispade
+item.KanthalMultispade.name=Kanthal Multispade
+item.MagnaliumMultipick.name=Magnalium Multipick
+item.MagnaliumMultispade.name=Magnalium Multispade
+item.NichromeMultispade.name=Nichrome Multispade
+item.PigIronMultipick.name=Pig Iron Multipick
+item.PigIronMultispade.name=Pig Iron Multispade
+item.PolycaprolactamMultispade.name=Polycaprolactam Multispade
+item.PolytetrafluoroethyleneMultispade.name=Polytetrafluoroethylene Multispade
+item.NickelZincFerriteMultispade.name=Nickel-Zinc Ferrite Multispade
+item.PolyphenyleneSulfideMultispade.name=Polyphenylene Sulfide Multispade
+item.StainlessSteelMultipick.name=Stainless Steel Multipick
+item.StainlessSteelMultispade.name=Stainless Steel Multispade
+item.SteelMultipick.name=Steel Multipick
+item.SteelMultispade.name=Steel Multispade
+item.TinAlloyMultispade.name=Tin Alloy Multispade
+item.UltimetMultipick.name=Ultimet Multipick
+item.UltimetMultispade.name=Ultimet Multispade
+item.WroughtIronMultipick.name=Wrought Iron Multipick
+item.WroughtIronMultispade.name=Wrought Iron Multispade
+item.SterlingSilverMultipick.name=Sterling Silver Multipick
+item.SterlingSilverMultispade.name=Sterling Silver Multispade
+item.RoseGoldMultipick.name=Rose Gold Multipick
+item.RoseGoldMultispade.name=Rose Gold Multispade
+item.BlackBronzeMultipick.name=Black Bronze Multipick
+item.BlackBronzeMultispade.name=Black Bronze Multispade
+item.BismuthBronzeMultipick.name=Bismuth Bronze Multipick
+item.BismuthBronzeMultispade.name=Bismuth Bronze Multispade
+item.BlackSteelMultipick.name=Black Steel Multipick
+item.BlackSteelMultispade.name=Black Steel Multispade
+item.RedSteelMultipick.name=Red Steel Multipick
+item.RedSteelMultispade.name=Red Steel Multispade
+item.BlueSteelMultipick.name=Blue Steel Multipick
+item.BlueSteelMultispade.name=Blue Steel Multispade
+item.DamascusSteelMultipick.name=Damascus Steel Multipick
+item.DamascusSteelMultispade.name=Damascus Steel Multispade
+item.MithrilMultispade.name=Mithril Multispade
+item.CobaltBrassMultipick.name=Cobalt Brass Multipick
+item.CobaltBrassMultispade.name=Cobalt Brass Multispade
+item.ThaumiumMultipick.name=Thaumium Multipick
+item.ThaumiumMultispade.name=Thaumium Multispade
+item.HSSGMultipick.name=HSS-G Multipick
+item.HSSGMultispade.name=HSS-G Multispade
+item.HSSEMultipick.name=HSS-E Multipick
+item.HSSEMultispade.name=HSS-E Multispade
+item.HSSSMultipick.name=HSS-S Multipick
+item.HSSSMultispade.name=HSS-S Multispade
+item.HastelloyC276Multipick.name=Hastelloy-C276 Multipick
+item.HastelloyC276Multispade.name=Hastelloy-C276 Multispade
+item.HastelloyNMultipick.name=Hastelloy-N Multipick
+item.HastelloyNMultispade.name=Hastelloy-N Multispade
+item.HastelloyWMultipick.name=Hastelloy-W Multipick
+item.HastelloyWMultispade.name=Hastelloy-W Multispade
+item.HastelloyXMultipick.name=Hastelloy-X Multipick
+item.HastelloyXMultispade.name=Hastelloy-X Multispade
+item.Incoloy020Multipick.name=Incoloy-020 Multipick
+item.Incoloy020Multispade.name=Incoloy-020 Multispade
+item.IncoloyDSMultipick.name=Incoloy-DS Multipick
+item.IncoloyDSMultispade.name=Incoloy-DS Multispade
+item.IncoloyMA956Multipick.name=Incoloy-MA956 Multipick
+item.IncoloyMA956Multispade.name=Incoloy-MA956 Multispade
+item.Inconel625Multipick.name=Inconel-625 Multipick
+item.Inconel625Multispade.name=Inconel-625 Multispade
+item.Inconel690Multipick.name=Inconel-690 Multipick
+item.Inconel690Multispade.name=Inconel-690 Multispade
+item.Inconel792Multipick.name=Inconel-792 Multipick
+item.Inconel792Multispade.name=Inconel-792 Multispade
+item.GrisiumMultipick.name=Grisium Multipick
+item.GrisiumMultispade.name=Grisium Multispade
+item.Tantalloy60Multipick.name=Tantalloy-60 Multipick
+item.Tantalloy60Multispade.name=Tantalloy-60 Multispade
+item.Tantalloy61Multipick.name=Tantalloy-61 Multipick
+item.Tantalloy61Multispade.name=Tantalloy-61 Multispade
+item.StaballoyMultipick.name=Staballoy Multipick
+item.StaballoyMultispade.name=Staballoy Multispade
+item.QuantumMultipick.name=Quantum Multipick
+item.QuantumMultispade.name=Quantum Multispade
+item.PotinMultipick.name=Potin Multipick
+item.PotinMultispade.name=Potin Multispade
+item.TumbagaMultipick.name=Tumbaga Multipick
+item.TumbagaMultispade.name=Tumbaga Multispade
+item.TaloniteMultipick.name=Talonite Multipick
+item.TaloniteMultispade.name=Talonite Multispade
+item.StelliteMultipick.name=Stellite Multipick
+item.StelliteMultispade.name=Stellite Multispade
+item.TungstenCarbideMultipick.name=Tungsten Carbide Multipick
+item.TungstenCarbideMultispade.name=Tungsten Carbide Multispade
+item.TantalumCarbideMultipick.name=Tantalum Carbide Multipick
+item.TantalumCarbideMultispade.name=Tantalum Carbide Multispade
+
+
+//Items that Don't fit into another category
+
+//Plates
+item.itemPlateClay.name=Clay Plate
+item.itemPlateDoubleClay.name=Double Clay Plate
+item.itemPlateLithium.name=Lithium Plate
+item.itemPlateDoubleEuropium.name=Double Europium Plate
+
+//Gears
+item.itemSmallGearWroughtIron.name=Small Wrought Iron Gear
+
+//Misc
+item.itemFoilUranium235.name=Uranium 235 Foil
+
+item.itemBoilerChassis_0.name=Advanced Boiler Chassis [Tier 1]
+item.itemDehydratorCoilWire_0.name=Coil Wire [EV]
+item.itemDehydratorCoil_0.name=Dehydrator Coil [EV]
+item.itemAirFilter_0.name=Air Filter
+item.itemAirFilter_1.name=Air Filter
+item.itemLavaFilter.name=Lava Filter
+item.itemGrindleTablet.name=Git
+item.itemDragonJar.name=Dragon Capture Jar
+item.CoalGas.name=Coal Gas Cell
+item.Ethylbenzene.name=Ethylbenzene Cell
+item.Anthracene.name=Anthracene Cell
+item.Toluene.name=Toluene Cell
+item.CoalTar.name=Coal Tar Cell
+item.CoalTarOil.name=Coal Tar Oil Cell
+item.SulfuricCoalTarOil.name=Sulfuric Coal Tar Oil Cell
+item.Naphthalene.name=Naphthalene Cell
+item.itemDustPhthalicAnhydride.name=Phthalic Anhydride Dust
+item.itemDustSmallPhthalicAnhydride.name=Small Pile of Phthalic Anhydride Dust
+item.itemDustTinyPhthalicAnhydride.name=Tiny Pile of Phthalic Anhydride Dust
+item.2Ethylanthraquinone.name=2-Ethylanthraquinone Cell
+item.2Ethylanthrahydroquinone.name=2-Ethylanthrahydroquinone Cell
+item.HydrogenPeroxide.name=Hydrogen Peroxide Cell
+item.itemDustLithiumHydroperoxide.name=Lithium Hydroperoxide Dust
+item.itemDustSmallLithiumHydroperoxide.name=Small Pile of Lithium Hydroperoxide Dust
+item.itemDustTinyLithiumHydroperoxide.name=Tiny Pile of Lithium Hydroperoxide Dust
+item.LithiumPeroxide.name=Lithium Peroxide Cell
+item.itemPotionChilly.name=Chilly Potion
+item.itemKeyBig4000DC's.name=4000DC's Big Key
+item.itemGemDull.name=Dull Gemstone
+item.itemMushroomForest.name=Forest Mushroom
+item.itemPlateVanadium.name=Vanadium Plate
+item.thekeytothecity.name=The Key to the City
+item.modularbauble.name=Modular Bauble
+item.itemDustSoularium.name=Soularium Dust
+item.itemDustSmallSoularium.name=Small Pile of Soularium Dust
+item.itemDustTinySoularium.name=Tiny Pile of Soularium Dust
+item.itemDustRedstoneAlloy.name=Redstone Alloy Dust
+item.itemDustSmallRedstoneAlloy.name=Small Pile of Redstone Alloy Dust
+item.itemDustTinyRedstoneAlloy.name=Tiny Pile of Redstone Alloy Dust
+item.itemDustElectricalSteel.name=Electrical Steel Dust
+item.itemDustSmallElectricalSteel.name=Small Pile of Electrical Steel Dust
+item.itemDustTinyElectricalSteel.name=Tiny Pile of Electrical Steel Dust
+item.itemDustPulsatingIron.name=Pulsating Iron Dust
+item.itemDustSmallPulsatingIron.name=Small Pile of Pulsating Iron Dust
+item.itemDustTinyPulsatingIron.name=Tiny Pile of Pulsating Iron Dust
+item.itemDustEnergeticAlloy.name=Energetic Alloy Dust
+item.itemDustSmallEnergeticAlloy.name=Small Pile of Energetic Alloy Dust
+item.itemDustTinyEnergeticAlloy.name=Tiny Pile of Energetic Alloy Dust
+item.itemDustVibrantAlloy.name=Vibrant Alloy Dust
+item.itemDustSmallVibrantAlloy.name=Small Pile of Vibrant Alloy Dust
+item.itemDustTinyVibrantAlloy.name=Tiny Pile of Vibrant Alloy Dust
+item.itemDustConductiveIron.name=Conductive Iron Dust
+item.itemDustSmallConductiveIron.name=Small Pile of Conductive Iron Dust
+item.itemDustTinyConductiveIron.name=Tiny Pile of Conductive Iron Dust
+item.itemPlateSoularium.name=Soularium plate
+item.itemPlateRedstoneAlloy.name=Redstone Alloy plate
+item.itemPlateElectricalSteel.name=Electrical Steel plate
+item.itemPlatePhasedIron.name=Phased Iron plate
+item.itemPlateEnergeticAlloy.name=Energetic Alloy plate
+item.itemPlateVibrantAlloy.name=Vibrant Alloy plate
+item.itemPlateConductiveIron.name=Conductive Iron plate
+item.itemPlateBlutonium.name=Blutonium plate
+item.itemPlateCyanite.name=Cyanite plate
+item.itemPlateLudicrite.name=Ludicrite plate
+item.itemPlateVoid.name=Void plate
+item.itemPlateDimensionShard.name=Dimensional Shard plate
+item.rfEUBattery.name=Universally Chargeable Battery
+item.personalCloakingDevice.name=§9Personal Cloaking Device§7
+item.personalHealingDevice.name=§9Personal Healing NanoBooster§r
+item.SlowBuildingRing.name=§eSlow Building Ring§7
+item.itemStaballoyPickaxe.name=Туннелекопатель
+item.itemStaballoyAxe.name=Лесоруб
+item.itemSandstoneHammer.name=Дробилка булыжников
+item.itemBufferCore1.name=Энергетическое ядро [ULV].
+item.itemBufferCore2.name=Энергетическое ядро [LV].
+item.itemBufferCore3.name=Энергетическое ядро [MV].
+item.itemBufferCore4.name=Энергетическое ядро [HV].
+item.itemBufferCore5.name=Энергетическое ядро [EV].
+item.itemBufferCore6.name=Энергетическое ядро [IV].
+item.itemBufferCore7.name=Энергетическое ядро [LuV].
+item.itemBufferCore8.name=Энергетическое ядро [ZPM].
+item.itemBufferCore9.name=Энергетическое ядро [UV].
+item.itemBufferCore10.name=Энергетическое ядро [MAX].
+item.itemPLACEHOLDER_Circuit.name=Quark Manipulator (UV)
+item.itembookgt.name=§oThermal Boiler Manual
+
+// Everglade Items
+item.everglades.trigger.name=§6Alkalus Disk [§cActivated§6]
+
+
+
+
+
+
+
+//Blocks
+tile.blockRainforestOakLog.name=Тропическое дерево
+tile.blockRainforestOakLeaves.name=Тропические листва
+tile.blockRainforestOakSapling.name=Тропические саженцы
+
+//TC Stuff
+tile.blockFastAlchemyFurnace.0.name=Broken
+tile.blockFastArcaneAlembic.1.name=Broken
+
+//Frame Boxes
+tile.Block of Selenium.name=Блок Селена
+tile.Selenium Frame Box.name=Каркас Из Селена
+tile.Block of Bromine.name=Блок Брома
+tile.Block of Strontium.name=Блок Стронция
+tile.Strontium Frame Box.name=Каркас Из Стронция
+tile.Block of Zirconium.name=Блок Циркония
+tile.Zirconium Frame Box.name=Каркас Из Циркония
+tile.Block of Ruthenium.name=Блок Рутения
+tile.Ruthenium Frame Box.name=Каркас Из Рутения
+tile.Block of Iodine.name=Блок Йода
+tile.Iodine Frame Box.name=Каркас Из Йода
+tile.Block of Hafnium.name=Блок Гафния
+tile.Hafnium Frame Box.name=Каркас Из Гафния
+tile.Block of Dysprosium.name=Блок Диспрозия
+tile.Dysprosium Frame Box.name=Каркас Из Дипрозия
+tile.Block of Tellurium.name=Блок Теллура
+tile.Tellurium Frame Box.name=Каркас Из Теллура
+tile.Block of Rhodium.name=Блок Родия
+tile.Rhodium Frame Box.name=Каркас Из Родия
+tile.Block of Rhenium.name=Блок Рения
+tile.Rhenium Frame Box.name=Каркас Из Рения
+tile.Block of Thallium.name=Блок Таллия
+tile.Thallium Frame Box.name=Каркас Из Таллия
+tile.Block of Technetium.name=Блок Технеция
+tile.Block of Polonium.name=Блок Полония
+tile.Block of Astatine.name=Блок Астатина
+tile.Block of Francium.name=Блок Франция
+tile.Block of Radium.name=Блок Радия
+tile.Block of Actinium.name=Блок Актиния
+tile.Block of Protactinium.name=Блок Протактиния
+tile.Block of Neptunium.name=Блок Нептуния
+tile.Block of Curium.name=Блок Кюрия
+tile.Block of Berkelium.name=Блок Беркилия
+tile.Block of Californium.name=Блок Калифорния
+tile.Block of Einsteinium.name=Блок Эйнштейния
+tile.Block of Fermium.name=Блок Фермия
+tile.Block of Thorium 232.name=Блок Тория 232
+tile.Block of Uranium 232.name=Блок Урана 232
+tile.Block of Uranium 233.name=Блок Урана 233
+tile.Block of Plutonium-238.name=Блок Плутона 238
+tile.Block of Strontium-90.name=Блок Стронция 90
+tile.Block of Polonium-210.name=Блок Полония 210
+tile.Block of Americium-241.name=Блок Америция 241
+tile.Block of Silicon Carbide.name=Блок Силиконового Карбида
+tile.Silicon Carbide Frame Box.name=Каркас Из Силиконового Карбида
+tile.Block of Zirconium Carbide.name=Блок Циркониевого Карбида
+tile.Zirconium Carbide Frame Box.name=Каркас Из Циркониевого Карбида
+tile.Block of Tantalum Carbide.name=Блок Карбида Тантала
+tile.Tantalum Carbide Frame Box.name=Каркас Из Карбида Тантала
+tile.Block of Niobium Carbide.name=Блок Ниобиевого Карбида
+tile.Niobium Carbide Frame Box.name=Каркас Из Ниобиевого Карбида
+tile.Block of Beryllium Fluoride.name=Блок Бериллиевого Фторида
+tile.Block of Lithium Fluoride.name=Блок Литиевого Фторида
+tile.Block of Thorium Tetrafluoride.name=Блок Ториевого Тетрафторида
+tile.Block of Thorium Hexafluoride.name=Блок Ториевого Гексафторида
+tile.Block of Uranium Tetrafluoride.name=Блок Ураниевого Тетрафторида
+tile.Block of Uranium Hexafluoride.name=Блок Ураниевого Гексафторида
+tile.Block of Zirconium Tetrafluoride.name=Блок Циркониевого Тетрафторида
+tile.Block of Neptunium Hexafluoride.name=Блок Нептуниевого Гексафторида
+tile.Block of Technetium Hexafluoride.name=Блок Технециевого Гексафторида
+tile.Block of Selenium Hexafluoride.name=Блок Гексафторида Селена
+tile.Block of LiFBeF2ZrF4U235.name=Блок Железорана 235
+tile.Block of LiFBeF2ZrF4UF4.name=Блок Циркониевого Железорана
+tile.Block of LiFBeF2ThF4UF4.name=Блок Ториевого Железорана
+tile.Block of Energy Crystal.name=Блок Энергетического Кристалла
+tile.Energy Crystal Frame Box.name=Каркас Из Энергетического Кристалла
+tile.Block of Blood Steel.name=Блок Кровавой Стали
+tile.Blood Steel Frame Box.name=Каркас Из Кровавой Стали
+tile.Block of Zeron-100.name=Блок Церона 100
+tile.Zeron-100 Frame Box.name=Каркас Из Церона 100
+tile.Block of Tumbaga.name=Блок Из Тумбага
+tile.Tumbaga Frame Box.name=Каркас Из Тумбага
+tile.Block of Potin.name=Блок Потина
+tile.Potin Frame Box.name=Каркас Из Потина
+tile.Block of Staballoy.name=Блок Стального Сплава
+tile.Staballoy Frame Box.name=Каркас Из Стального Сплава
+tile.Block of Tantalloy-60.name=Блок Сплава Тантала 60
+tile.Tantalloy-60 Frame Box.name=Каркас Из Сплава Тантала 60
+tile.Block of Tantalloy-61.name=Блок Сплава Тантала 61
+tile.Tantalloy-61 Frame Box.name=Каркас Из Сплава Тантала 61
+tile.Block of Inconel-625.name=Блок Инконеля 625
+tile.Inconel-625 Frame Box.name=Каркас Из Инконеля 625
+tile.Block of Inconel-690.name=Блок Инконеля 690
+tile.Inconel-690 Frame Box.name=Каркас Из Инконеля 690
+tile.Block of Inconel-792.name=Блок Инконеля 792
+tile.Inconel-792 Frame Box.name=Каркас Из Инконеля 792
+tile.Block of Eglin Steel.name=Блок Эглиновой Стали
+tile.Eglin Steel Frame Box.name=Каркас Из Эглиновой Стали
+tile.Block of Maraging Steel 250.name=Блок Марагинской Стали 250
+tile.Maraging Steel 250 Frame Box.name=Каркас Из Марагинской Стали 250
+tile.Block of Maraging Steel 300.name=Блок Марагинской Стали 300
+tile.Maraging Steel 300 Frame Box.name=Каркас Из Марагинской Стали 300
+tile.Block of Maraging Steel 350.name=Блок Марагинской Стали 350
+tile.Maraging Steel 350 Frame Box.name=Каркас Из Марагинской Стали 350
+tile.Block of Stellite.name=Блок Стеллита
+tile.Stellite Frame Box.name=Каркас Из Стеллита
+tile.Block of Talonite.name=Блок Талонита
+tile.Talonite Frame Box.name=Каркас Из Талонита
+tile.Block of Hastelloy-W.name=Блок Хастеллоя W
+tile.Hastelloy-W Frame Box.name=Каркас Из Хастеллоя W
+tile.Block of Hastelloy-X.name=Блок Хастеллоя X
+tile.Hastelloy-X Frame Box.name=Каркас Из Хастеллоя X
+tile.Block of Hastelloy-C276.name=Блок Хастеллоя C276
+tile.Hastelloy-C276 Frame Box.name=Каркас Из Хастеллоя C276
+tile.Block of Hastelloy-N.name=Блок Хастеллоя N
+tile.Hastelloy-N Frame Box.name=Каркас Из Хастеллоя N
+tile.Block of Incoloy-020.name=Блок Инколоя 020
+tile.Incoloy-020 Frame Box.name=Каркас Из Инколоя 020
+tile.Block of Incoloy-DS.name=Блок Инколоя DS
+tile.Incoloy-DS Frame Box.name=Каркас Из Инколоя DS
+tile.Block of Incoloy-MA956.name=Блок Инколоя MA956
+tile.Incoloy-MA956 Frame Box.name=Каркас Из Инколоя MA956
+tile.Block of Grisium.name=Блок Грисиума
+tile.Grisium Frame Box.name=Каркас Из Грисиума
+tile.Block of Trinium.name=Block of Trinium
+tile.Block of Refined Trinium.name=Block of Refined Trinium
+tile.Block of Trinium Titanium Alloy.name=Блок Сплава Тритий Титана
+tile.Trinium Titanium Alloy Frame Box.name=Каркас Из Сплава Тритий Титана
+tile.Block of Trinium Naquadah Alloy.name=Блок Сплава Тритий Наквадаха
+tile.Block of Trinium Naquadah Carbonite.name=Блок Карбонита Тритий Наквадаха
+tile.Trinium Naquadah Carbonite Frame Box.name=Каркас Из Карбонита Тритий Наквадаха
+tile.Block of Quantum.name=Блок Кванта
+tile.Quantum Frame Box.name=Каркас Из Кванта
+
+//Ores
+tile.OreFluoriteF.name=Fluorite (F) Ore
+tile.OreCrocoite.name=Руда Крокоита
+tile.OreGeikielite.name=Руда Гейкелита
+tile.OreNichromite.name=Руда Нихромата
+tile.OreTitanite.name=Руда Титанита
+tile.OreZimbabweite.name=Руда Зимбабвайта
+tile.OreZirconolite.name=Руда Цирконолита
+tile.OreGadoliniteCe.name=Руда Гадолинита Ce
+tile.OreGadoliniteY.name=Руда Гадолинита Y
+tile.OreLepersonnite.name=Руда Леперсоннита
+tile.OreSamarskiteY.name=Руда Самарскита Y
+tile.OreSamarskiteYb.name=Руда Самарскита Yb
+tile.OreXenotime.name=Руда Ксенотима
+tile.OreYttriaite.name=Руда Иттриайта
+tile.OreYttrialite.name=Руда Иттриалита
+tile.OreYttrocerite.name=Руда Иттроцерита
+tile.OreZircon.name=Руда Циркона
+tile.OrePolycrase.name=Руда Поликраса
+tile.OreZircophyllite.name=Руда Циркофиллита
+tile.OreZirkelite.name=Руда Циркелита
+tile.OreLanthaniteLa.name=Руда Лантанита La
+tile.OreLanthaniteCe.name=Руда Лантанита Ce
+tile.OreLanthaniteNd.name=Руда Лантанита Nd
+tile.OreAgarditeY.name=Руда Агардита Y
+tile.OreAgarditeCd.name=Руда Агардита Cd
+tile.OreAgarditeLa.name=Руда Агардита La
+tile.OreAgarditeNd.name=Руда Агардита Nd
+tile.OreHibonite.name=Руда Гибонита
+tile.OreCerite.name=Руда Церита
+tile.OreFluorcaphite.name=Руда Фторокафита
+tile.OreFlorencite.name=Руда Флоренцита
+tile.OreCryoliteF.name=Cryolite (F) Ore
+
+//Misc
+tile.blockMFEffect.name=Эффект MF
+tile.fluidBlockSludge.name=Жидкий Блок Грязи
+tile.blockWorkbenchGT.name=Верстак
+tile.blockWorkbenchGTAdvanced.name=Улучшенный Верстак
+tile.blockHeliumGenerator.name=Гелиевый Генератор
+tile.blockFirePit.name=Огненная Яма
+tile.blockFishTrap.name=Рыбная Ловушка
+tile.blockInfiniteFluidTank.name=Бесконечный Жидкостный Резервуар
+tile.blockMiningExplosives.name=Взрывчатые Вещества
+tile.blockHellFire.name=Адский огонь
+tile.blockProjectBench.name=Проектный стол
+tile.blockTradeBench.name=Торговая лавка
+tile.blockModularity.name=Модульность
+tile.blockBlackGate.name=Черные Ворота
+tile.blockTankXpConverter.name=Резервуар Конвертора Опыта
+
+//Everglades Blocks
+tile.fluidSludge.0.name=Stagnant Waste Water
+tile.blockDarkWorldPortal.name=A Glimpse of the Future
+tile.blockDarkWorldGround.name=Unstable Earth
+tile.blockDarkWorldGround2.name=Polluted Soil
+tile.blockDarkWorldGround2.2.name=Highly Polluted Soil
+tile.blockDarkWorldPortalFrame.name=Containment Frame
+
+
+//Added 1/4/18
+tile.blockMiningPipeFake.name=Strengthened Mining Pipe
+tile.blockMiningHeadFake.name=Bedrock Drill
+item.itemPlateMeatRaw.name=Fleshy Panel
+tile.Block of MeatRaw.name=Block of Raw Meat
+
+//Added 26/5/18
+item.BurntLiFBeF2ThF4UF4.name=Cell of Used Reactor Fuel [LiFBeF2ThF4UF4]
+item.BurntLiFBeF2ZrF4UF4.name=Cell of Used Reactor Fuel [LiFBeF2ZrF4UF4]
+item.BurntLiFBeF2ZrF4U235.name=Cell of Used Reactor Fuel [LiFBeF2ZrF4U235]
+item.itemBigEgg.name= ounce Chicken Egg
+item.itemPlateSodium.name=Sodium Plate
+
+item.itemNuggetPromethium.name=Promethium Nugget
+item.itemIngotPromethium.name=Promethium Ingot
+item.itemDustSmallPromethium.name=Small Pile of Promethium
+item.itemDustTinyPromethium.name=Tiny Pile of Promethium
+item.itemDustPromethium.name=Promethium Dust
+tile.Block of Promethium.name=Блок Прометия
+
+item.itemCellAmericium241.name=Americium 241 Cell
+item.itemCellPolonium210.name=Polonium 210 Cell
+item.itemCellStrontium90.name=Strontium 90 Cell
+item.itemCellPlutonium238.name=Plutonium 238 Cell
+
+entity.MiningCharge.name=Mining Charge
+entity.throwablePotionSulfuric.name=Flask of Sulfuric Acid
+entity.throwablePotionHydrofluoric.name=Flask of Hydrofluoric Acid
+entity.toxinBall.name=Toxin globule
+entity.plasmaBolt.name=Plasma
+entity.bigChickenFriendly.name=Giant Chicken
+
+//Added 26/6/18
+tile.OreTrinium.name=Trinium Ore
+item.crushedTrinium.name=Crushed Trinium Ore
+item.crushedCentrifugedTrinium.name=Centrifuged Crushed Trinium Ore
+item.crushedPurifiedTrinium.name=Purified Crushed Trinium Ore
+item.dustImpureTrinium.name=Impure Trinium Dust
+item.dustPureTrinium.name=Purified Trinium Dust
+
+//Added 1/7/18
+entity.WiseVillager.name=Wise Villager
+tile.blockMobSpawnerEx.0.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.1.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.2.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.3.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.4.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.5.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.6.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.7.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.8.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.9.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.10.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.11.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.12.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.13.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.14.name=Спавнер Монстров Ex
+tile.blockMobSpawnerEx.15.name=Спавнер Монстров Ex
+description.villager.profession.miscutils.banker=Banker
+description.villager.profession.miscutils.technician=GT Technician
+description.villager.profession.miscutils.trader=Ore Trader
+description.villager.profession.miscutils.aboriginal=Native Australian
+
+//Added 23/8/18
+item.itemHatTinFoil.name=Tin Foil Hat
+
+//Added 13/9/18
+entity.WiseVillager.name=Wise Villager
+entity.Aboriginal.name=Native
+entity.miscutils.constructStaballoy.name=Staballoy Construct
+entity.miscutils.sickBlaze.name=Infected Zealot
+
+//Added 15/9/18
+item.ZirconiumTetrafluoride.name=Zirconium Tetrafluoride Cell
+item.Formaldehyde.name=Formaldehyde Cell
+item.RocketFuelMixA.name=H8N4C2O4 Rocket Fuel Cell
+item.RocketFuelMixB.name=RP-1 Rocket Fuel Cell
+item.RocketFuelMixC.name=CN3H7O3 Rocket Fuel Cell
+item.RocketFuelMixD.name=Dense Hydrazine Rocket Fuel Cell
+item.RP1Fuel.name=RP-1 Fuel Cell
+item.Monomethylhydrazine.name=Monomethylhydrazine Cell
+item.Hydrazine.name=Hydrazine Cell
+item.NitrogenTetroxide.name=Nitrogen Tetroxide Cell
+item.NitrousOxide.name=Nitrous Oxide Cell
+item.AmmoniumNitrateSlurry.name=Ammonium Nitrate Slurry Cell
+item.Kerosene.name=Kerosene Cell
+item.LiquidOxygen.name=Liquid Oxygen Cell [LOX]
+
+//Added 8/1/19
+
+//Ores
+
+tile.OreIrarsite.name=Irarsite Ore
+item.crushedIrarsite.name=Crushed Irarsite Ore
+item.crushedCentrifugedIrarsite.name=Centrifuged Crushed Irarsite Ore
+item.crushedPurifiedIrarsite.name=Purified Crushed Irarsite Ore
+item.dustImpureIrarsite.name=Impure Irarsite Dust
+item.dustPureIrarsite.name=Purified Irarsite Dust
+item.itemDustIrarsite.name=Irarsite Dust
+item.itemDustTinyIrarsite.name=Tiny Pile of Irarsite Dust
+item.itemDustSmallIrarsite.name=Small Pile of Irarsite Dust
+
+tile.OreMiessiite.name=Miessiite Ore
+item.crushedMiessiite.name=Crushed Miessiite Ore
+item.crushedCentrifugedMiessiite.name=Centrifuged Crushed Miessiite Ore
+item.crushedPurifiedMiessiite.name=Purified Crushed Miessiite Ore
+item.dustImpureMiessiite.name=Impure Miessiite Dust
+item.dustPureMiessiite.name=Purified Miessiite Dust
+item.itemDustMiessiite.name=Miessiite Dust
+item.itemDustTinyMiessiite.name=Tiny Pile of Miessiite Dust
+item.itemDustSmallMiessiite.name=Small Pile of Miessiite Dust
+
+tile.OreComancheite.name=Comancheite Ore
+item.crushedComancheite.name=Crushed Comancheite Ore
+item.crushedCentrifugedComancheite.name=Centrifuged Crushed Comancheite Ore
+item.crushedPurifiedComancheite.name=Purified Crushed Comancheite Ore
+item.dustImpureComancheite.name=Impure Comancheite Dust
+item.dustPureComancheite.name=Purified Comancheite Dust
+item.itemDustComancheite.name=Comancheite Dust
+item.itemDustTinyComancheite.name=Tiny Pile of Comancheite Dust
+item.itemDustSmallComancheite.name=Small Pile of Comancheite Dust
+
+tile.OreKoboldite.name=Koboldite Ore
+item.crushedKoboldite.name=Crushed Koboldite Ore
+item.crushedCentrifugedKoboldite.name=Centrifuged Crushed Koboldite Ore
+item.crushedPurifiedKoboldite.name=Purified Crushed Koboldite Ore
+item.dustImpureKoboldite.name=Impure Koboldite Dust
+item.dustPureKoboldite.name=Purified Koboldite Dust
+item.itemDustKoboldite.name=Koboldite Dust
+item.itemDustTinyKoboldite.name=Tiny Pile of Koboldite Dust
+item.itemDustSmallKoboldite.name=Small Pile of Koboldite Dust
+
+tile.OrePerroudite.name=Perroudite Ore
+item.crushedPerroudite.name=Crushed Perroudite Ore
+item.crushedCentrifugedPerroudite.name=Centrifuged Crushed Perroudite Ore
+item.crushedPurifiedPerroudite.name=Purified Crushed Perroudite Ore
+item.dustImpurePerroudite.name=Impure Perroudite Dust
+item.dustPurePerroudite.name=Purified Perroudite Dust
+item.itemDustPerroudite.name=Perroudite Dust
+item.itemDustTinyPerroudite.name=Tiny Pile of Perroudite Dust
+item.itemDustSmallPerroudite.name=Small Pile of Perroudite Dust
+
+tile.OreDemicheleite.name=Demicheleite Ore
+item.crushedDemicheleite.name=Crushed Demicheleite Ore
+item.crushedCentrifugedDemicheleite.name=Centrifuged Crushed Demicheleite Ore
+item.crushedPurifiedDemicheleite.name=Purified Crushed Demicheleite Ore
+item.dustImpureDemicheleite.name=Impure Demicheleite Dust
+item.dustPureDemicheleite.name=Purified Demicheleite Dust
+item.itemDustDemicheleite.name=Demicheleite Dust
+item.itemDustTinyDemicheleite.name=Tiny Pile of Demicheleite Dust
+item.itemDustSmallDemicheleite.name=Small Pile of Demicheleite Dust
+
+tile.OreAlburnite.name=Alburnite Ore
+item.crushedAlburnite.name=Crushed Alburnite Ore
+item.crushedCentrifugedAlburnite.name=Centrifuged Crushed Alburnite Ore
+item.crushedPurifiedAlburnite.name=Purified Crushed Alburnite Ore
+item.dustImpureAlburnite.name=Impure Alburnite Dust
+item.dustPureAlburnite.name=Purified Alburnite Dust
+item.itemDustAlburnite.name=Alburnite Dust
+item.itemDustTinyAlburnite.name=Tiny Pile of Alburnite Dust
+item.itemDustSmallAlburnite.name=Small Pile of Alburnite Dust
+
+tile.OreLautarite.name=Lautarite Ore
+item.crushedLautarite.name=Crushed Lautarite Ore
+item.crushedCentrifugedLautarite.name=Centrifuged Crushed Lautarite Ore
+item.crushedPurifiedLautarite.name=Purified Crushed Lautarite Ore
+item.dustImpureLautarite.name=Impure Lautarite Dust
+item.dustPureLautarite.name=Purified Lautarite Dust
+item.itemDustLautarite.name=Lautarite Dust
+item.itemDustTinyLautarite.name=Tiny Pile of Lautarite Dust
+item.itemDustSmallLautarite.name=Small Pile of Lautarite Dust
+
+tile.OreBariteRd.name=Barite (Rd) Ore
+item.crushedBariteRd.name=Crushed Barite (Rd) Ore
+item.crushedCentrifugedBariteRd.name=Centrifuged Crushed Barite (Rd) Ore
+item.crushedPurifiedBariteRd.name=Purified Crushed Barite (Rd) Ore
+item.dustImpureBariteRd.name=Impure Barite (Rd) Dust
+item.dustPureBariteRd.name=Purified Barite (Rd) Dust
+item.itemDustBariteRd.name=Barite (Rd) Dust
+item.itemDustTinyBariteRd.name=Tiny Pile of Barite (Rd) Dust
+item.itemDustSmallBariteRd.name=Small Pile of Barite (Rd) Dust
+
+tile.OreHoneaite.name=Honeaite Ore
+item.crushedHoneaite.name=Crushed Honeaite Ore
+item.crushedCentrifugedHoneaite.name=Centrifuged Crushed Honeaite Ore
+item.crushedPurifiedHoneaite.name=Purified Crushed Honeaite Ore
+item.dustImpureHoneaite.name=Impure Honeaite Dust
+item.dustPureHoneaite.name=Purified Honeaite Dust
+item.itemDustHoneaite.name=Honeaite Dust
+item.itemDustTinyHoneaite.name=Tiny Pile of Honeaite Dust
+item.itemDustSmallHoneaite.name=Small Pile of Honeaite Dust
+
+tile.OreLafossaite.name=Lafossaite Ore
+item.crushedLafossaite.name=Crushed Lafossaite Ore
+item.crushedCentrifugedLafossaite.name=Centrifuged Crushed Lafossaite Ore
+item.crushedPurifiedLafossaite.name=Purified Crushed Lafossaite Ore
+item.dustImpureLafossaite.name=Impure Lafossaite Dust
+item.dustPureLafossaite.name=Purified Lafossaite Dust
+item.itemDustLafossaite.name=Lafossaite Dust
+item.itemDustTinyLafossaite.name=Tiny Pile of Lafossaite Dust
+item.itemDustSmallLafossaite.name=Small Pile of Lafossaite Dust
+
+tile.OreKashinite.name=Kashinite Ore
+item.crushedKashinite.name=Crushed Kashinite Ore
+item.crushedCentrifugedKashinite.name=Centrifuged Crushed Kashinite Ore
+item.crushedPurifiedKashinite.name=Purified Crushed Kashinite Ore
+item.dustImpureKashinite.name=Impure Kashinite Dust
+item.dustPureKashinite.name=Purified Kashinite Dust
+item.itemDustKashinite.name=Kashinite Dust
+item.itemDustTinyKashinite.name=Tiny Pile of Kashinite Dust
+item.itemDustSmallKashinite.name=Small Pile of Kashinite Dust
+
+tile.OreRadioactiveMineralMix.name=Strange Ore
+item.crushedRadioactiveMineralMix.name=Crushed Strange Ore
+item.crushedCentrifugedRadioactiveMineralMix.name=Centrifuged Crushed Strange Ore
+item.crushedPurifiedRadioactiveMineralMix.name=Purified Crushed Strange Ore
+item.dustImpureRadioactiveMineralMix.name=Impure Strange Dust
+item.dustPureRadioactiveMineralMix.name=Purified Strange Dust
+item.itemDustRadioactiveMineralMix.name=Strange Dust
+item.itemDustTinyRadioactiveMineralMix.name=Tiny Pile of Strange Dust
+item.itemDustSmallRadioactiveMineralMix.name=Small Pile of Strange Dust
+
+tile.OreDemicheleiteBr.name=Demicheleite (Br) Ore
+item.crushedDemicheleiteBr.name=Crushed Demicheleite (Br) Ore
+item.crushedCentrifugedDemicheleiteBr.name=Centrifuged Crushed Demicheleite (Br) Ore
+item.crushedPurifiedDemicheleiteBr.name=Purified Crushed Demicheleite (Br) Ore
+item.dustImpureDemicheleiteBr.name=Impure Demicheleite (Br) Dust
+item.dustPureDemicheleiteBr.name=Purified Demicheleite (Br) Dust
+item.itemDustDemicheleiteBr.name=Demicheleite (Br) Dust
+
+
+//Materials
+
+item.itemIngotTitansteel.name=Titansteel Ingot
+item.itemHotIngotTitansteel.name=Hot Titansteel Ingot
+item.itemDustTitansteel.name=Titansteel Dust
+item.itemDustTinyTitansteel.name=Tiny Pile of Titansteel Dust
+item.itemDustSmallTitansteel.name=Small Pile of Titansteel Dust
+item.itemNuggetTitansteel.name=Titansteel Nugget
+item.itemPlateTitansteel.name=Titansteel Plate
+item.itemPlateDoubleTitansteel.name=Double Titansteel Plate
+item.itemBoltTitansteel.name=Titansteel Bolt
+item.itemRodTitansteel.name=Titansteel Rod
+item.itemRodLongTitansteel.name=Long Titansteel Rod
+item.itemRingTitansteel.name=Titansteel Ring
+item.itemScrewTitansteel.name=Titansteel Screw
+item.itemRotorTitansteel.name=Titansteel Rotor
+item.itemGearTitansteel.name=Titansteel Gear
+item.itemCellTitansteel.name=Titansteel Cell
+tile.Block of Titansteel.name=Block of Titansteel
+tile.Titansteel Frame Box.name=Titansteel Frame Box
+
+item.itemIngotOctiron.name=Octiron Ingot
+item.itemHotIngotOctiron.name=Hot Octiron Ingot
+item.itemDustOctiron.name=Octiron Dust
+item.itemDustTinyOctiron.name=Tiny Pile of Octiron Dust
+item.itemDustSmallOctiron.name=Small Pile of Octiron Dust
+item.itemNuggetOctiron.name=Octiron Nugget
+item.itemPlateOctiron.name=Octiron Plate
+item.itemPlateDoubleOctiron.name=Double Octiron Plate
+item.itemBoltOctiron.name=Octiron Bolt
+item.itemRodOctiron.name=Octiron Rod
+item.itemRodLongOctiron.name=Long Octiron Rod
+item.itemRingOctiron.name=Octiron Ring
+item.itemScrewOctiron.name=Octiron Screw
+item.itemRotorOctiron.name=Octiron Rotor
+item.itemGearOctiron.name=Octiron Gear
+item.itemCellOctiron.name=Octiron Cell
+tile.Block of Octiron.name=Block of Octiron
+tile.Octiron Frame Box.name=Octiron Frame Box
+
+item.itemIngotWatertightSteel.name=Watertight Steel Ingot
+item.itemHotIngotWatertightSteel.name=Hot Watertight Steel Ingot
+item.itemDustWatertightSteel.name=Watertight Steel Dust
+item.itemDustTinyWatertightSteel.name=Tiny Pile of Watertight Steel Dust
+item.itemDustSmallWatertightSteel.name=Small Pile of Watertight Steel Dust
+item.itemNuggetWatertightSteel.name=Watertight Steel Nugget
+item.itemPlateWatertightSteel.name=Watertight Steel Plate
+item.itemPlateDoubleWatertightSteel.name=Double Watertight Steel Plate
+item.itemBoltWatertightSteel.name=Watertight Steel Bolt
+item.itemRodWatertightSteel.name=Watertight Steel Rod
+item.itemRodLongWatertightSteel.name=Long Watertight Steel Rod
+item.itemRingWatertightSteel.name=Watertight Steel Ring
+item.itemScrewWatertightSteel.name=Watertight Steel Screw
+item.itemRotorWatertightSteel.name=Watertight Steel Rotor
+item.itemGearWatertightSteel.name=Watertight Steel Gear
+item.itemCellWatertightSteel.name=Watertight Steel Cell
+tile.Block of Watertight Steel.name=Block of Watertight Steel
+tile.Watertight Steel Frame Box.name=Watertight Steel Frame Box
+
+item.itemIngotCelestialTungsten.name=Celestial Tungsten Ingot
+item.itemHotIngotCelestialTungsten.name=Hot Celestial Tungsten Ingot
+item.itemDustCelestialTungsten.name=Celestial Tungsten Dust
+item.itemDustTinyCelestialTungsten.name=Tiny Pile of Celestial Tungsten Dust
+item.itemDustSmallCelestialTungsten.name=Small Pile of Celestial Tungsten Dust
+item.itemNuggetCelestialTungsten.name=Celestial Tungsten Nugget
+item.itemPlateCelestialTungsten.name=Celestial Tungsten Plate
+item.itemPlateDoubleCelestialTungsten.name=Double Celestial Tungsten Plate
+item.itemBoltCelestialTungsten.name=Celestial Tungsten Bolt
+item.itemRodCelestialTungsten.name=Celestial Tungsten Rod
+item.itemRodLongCelestialTungsten.name=Long Celestial Tungsten Rod
+item.itemRingCelestialTungsten.name=Celestial Tungsten Ring
+item.itemScrewCelestialTungsten.name=Celestial Tungsten Screw
+item.itemRotorCelestialTungsten.name=Celestial Tungsten Rotor
+item.itemGearCelestialTungsten.name=Celestial Tungsten Gear
+item.itemCellCelestialTungsten.name=Celestial Tungsten Cell
+tile.Block of Celestial Tungsten.name=Block of Celestial Tungsten
+tile.Celestial Tungsten Frame Box.name=Celestial Tungsten Frame Box
+
+item.itemIngotHypogen.name=Hypogen Ingot
+item.itemHotIngotHypogen.name=Hot Hypogen Ingot
+item.itemDustHypogen.name=Hypogen Dust
+item.itemDustTinyHypogen.name=Tiny Pile of Hypogen Dust
+item.itemDustSmallHypogen.name=Small Pile of Hypogen Dust
+item.itemNuggetHypogen.name=Hypogen Nugget
+item.itemPlateHypogen.name=Hypogen Plate
+item.itemPlateDoubleHypogen.name=Double Hypogen Plate
+item.itemBoltHypogen.name=Hypogen Bolt
+item.itemRodHypogen.name=Hypogen Rod
+item.itemRodLongHypogen.name=Long Hypogen Rod
+item.itemRingHypogen.name=Hypogen Ring
+item.itemScrewHypogen.name=Hypogen Screw
+item.itemRotorHypogen.name=Hypogen Rotor
+item.itemGearHypogen.name=Hypogen Gear
+item.itemCellHypogen.name=Hypogen Cell
+tile.Block of Hypogen.name=Block of Hypogen
+tile.Hypogen Frame Box.name=Hypogen Frame Box
+
+item.itemIngotArceusAlloy2B.name=Arceus Alloy 2B Ingot
+item.itemHotIngotArceusAlloy2B.name=Hot Arceus Alloy 2B Ingot
+item.itemDustArceusAlloy2B.name=Arceus Alloy 2B Dust
+item.itemDustTinyArceusAlloy2B.name=Tiny Pile of Arceus Alloy 2B Dust
+item.itemDustSmallArceusAlloy2B.name=Small Pile of Arceus Alloy 2B Dust
+item.itemNuggetArceusAlloy2B.name=Arceus Alloy 2B Nugget
+item.itemPlateArceusAlloy2B.name=Arceus Alloy 2B Plate
+item.itemPlateDoubleArceusAlloy2B.name=Double Arceus Alloy 2B Plate
+item.itemBoltArceusAlloy2B.name=Arceus Alloy 2B Bolt
+item.itemRodArceusAlloy2B.name=Arceus Alloy 2B Rod
+item.itemRodLongArceusAlloy2B.name=Long Arceus Alloy 2B Rod
+item.itemRingArceusAlloy2B.name=Arceus Alloy 2B Ring
+item.itemScrewArceusAlloy2B.name=Arceus Alloy 2B Screw
+item.itemRotorArceusAlloy2B.name=Arceus Alloy 2B Rotor
+item.itemGearArceusAlloy2B.name=Arceus Alloy 2B Gear
+item.itemCellArceusAlloy2B.name=Arceus Alloy 2B Cell
+tile.Block of Arceus Alloy 2B.name=Block of Arceus Alloy 2B
+tile.Arceus Alloy 2B Frame Box.name=Arceus Alloy 2B Frame Box
+
+item.itemIngotChromaticGlass.name=Chromatic Glass Ingot
+item.itemHotIngotChromaticGlass.name=Hot Chromatic Glass Ingot
+item.itemDustChromaticGlass.name=Chromatic Glass Dust
+item.itemDustTinyChromaticGlass.name=Tiny Pile of Chromatic Glass Dust
+item.itemDustSmallChromaticGlass.name=Small Pile of Chromatic Glass Dust
+item.itemNuggetChromaticGlass.name=Chromatic Glass Nugget
+item.itemPlateChromaticGlass.name=Chromatic Glass Plate
+item.itemPlateDoubleChromaticGlass.name=Double Chromatic Glass Plate
+item.itemBoltChromaticGlass.name=Chromatic Glass Bolt
+item.itemRodChromaticGlass.name=Chromatic Glass Rod
+item.itemRodLongChromaticGlass.name=Long Chromatic Glass Rod
+item.itemRingChromaticGlass.name=Chromatic Glass Ring
+item.itemScrewChromaticGlass.name=Chromatic Glass Screw
+item.itemRotorChromaticGlass.name=Chromatic Glass Rotor
+item.itemGearChromaticGlass.name=Chromatic Glass Gear
+item.itemCellChromaticGlass.name=Chromatic Glass Cell
+tile.Block of Chromatic Glass.name=Block of Chromatic Glass
+tile.Chromatic Glass Frame Box.name=Chromatic Glass Frame Box
+
+item.itemIngotAstralTitanium.name=Astral Titanium Ingot
+item.itemHotIngotAstralTitanium.name=Hot Astral Titanium Ingot
+item.itemDustAstralTitanium.name=Astral Titanium Dust
+item.itemDustTinyAstralTitanium.name=Tiny Pile of Astral Titanium Dust
+item.itemDustSmallAstralTitanium.name=Small Pile of Astral Titanium Dust
+item.itemNuggetAstralTitanium.name=Astral Titanium Nugget
+item.itemPlateAstralTitanium.name=Astral Titanium Plate
+item.itemPlateDoubleAstralTitanium.name=Double Astral Titanium Plate
+item.itemBoltAstralTitanium.name=Astral Titanium Bolt
+item.itemRodAstralTitanium.name=Astral Titanium Rod
+item.itemRodLongAstralTitanium.name=Long Astral Titanium Rod
+item.itemRingAstralTitanium.name=Astral Titanium Ring
+item.itemScrewAstralTitanium.name=Astral Titanium Screw
+item.itemRotorAstralTitanium.name=Astral Titanium Rotor
+item.itemGearAstralTitanium.name=Astral Titanium Gear
+item.itemCellAstralTitanium.name=Astral Titanium Cell
+tile.Block of Astral Titanium.name=Block of Astral Titanium
+tile.Astral Titanium Frame Box.name=Astral Titanium Frame Box
+
+item.itemIngotTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Ingot
+item.itemHotIngotTungstenTitaniumCarbide.name=Hot Tungsten Titanium Carbide Ingot
+item.itemDustTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Dust
+item.itemDustTinyTungstenTitaniumCarbide.name=Tiny Pile of Tungsten Titanium Carbide Dust
+item.itemDustSmallTungstenTitaniumCarbide.name=Small Pile of Tungsten Titanium Carbide Dust
+item.itemNuggetTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Nugget
+item.itemPlateTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Plate
+item.itemPlateDoubleTungstenTitaniumCarbide.name=Double Tungsten Titanium Carbide Plate
+item.itemBoltTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Bolt
+item.itemRodTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Rod
+item.itemRodLongTungstenTitaniumCarbide.name=Long Tungsten Titanium Carbide Rod
+item.itemRingTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Ring
+item.itemScrewTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Screw
+item.itemRotorTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Rotor
+item.itemGearTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Gear
+item.itemCellTungstenTitaniumCarbide.name=Tungsten Titanium Carbide Cell
+tile.Block of Tungsten Titanium Carbide.name=Block of Tungsten Titanium Carbide
+tile.Tungsten Titanium Carbide Frame Box.name=Tungsten Titanium Carbide Frame Box
+
+item.itemIngotNitinol60.name=Nitinol 60 Ingot
+item.itemHotIngotNitinol60.name=Hot Nitinol 60 Ingot
+item.itemDustNitinol60.name=Nitinol 60 Dust
+item.itemDustTinyNitinol60.name=Tiny Pile of Nitinol 60 Dust
+item.itemDustSmallNitinol60.name=Small Pile of Nitinol 60 Dust
+item.itemNuggetNitinol60.name=Nitinol 60 Nugget
+item.itemPlateNitinol60.name=Nitinol 60 Plate
+item.itemPlateDoubleNitinol60.name=Double Nitinol 60 Plate
+item.itemBoltNitinol60.name=Nitinol 60 Bolt
+item.itemRodNitinol60.name=Nitinol 60 Rod
+item.itemRodLongNitinol60.name=Long Nitinol 60 Rod
+item.itemRingNitinol60.name=Nitinol 60 Ring
+item.itemScrewNitinol60.name=Nitinol 60 Screw
+item.itemRotorNitinol60.name=Nitinol 60 Rotor
+item.itemGearNitinol60.name=Nitinol 60 Gear
+item.itemCellNitinol60.name=Nitinol 60 Cell
+tile.Block of Nitinol 60.name=Block of Nitinol 60
+tile.Nitinol 60 Frame Box.name=Nitinol 60 Frame Box
+
+item.itemIngotAdvancedNitinol.name=Advanced Nitinol Ingot
+item.itemHotIngotAdvancedNitinol.name=Hot Advanced Nitinol Ingot
+item.itemDustAdvancedNitinol.name=Advanced Nitinol Dust
+item.itemDustTinyAdvancedNitinol.name=Tiny Pile of Advanced Nitinol Dust
+item.itemDustSmallAdvancedNitinol.name=Small Pile of Advanced Nitinol Dust
+item.itemNuggetAdvancedNitinol.name=Advanced Nitinol Nugget
+item.itemPlateAdvancedNitinol.name=Advanced Nitinol Plate
+item.itemPlateDoubleAdvancedNitinol.name=Double Advanced Nitinol Plate
+item.itemBoltAdvancedNitinol.name=Advanced Nitinol Bolt
+item.itemRodAdvancedNitinol.name=Advanced Nitinol Rod
+item.itemRodLongAdvancedNitinol.name=Long Advanced Nitinol Rod
+item.itemRingAdvancedNitinol.name=Advanced Nitinol Ring
+item.itemScrewAdvancedNitinol.name=Advanced Nitinol Screw
+item.itemRotorAdvancedNitinol.name=Advanced Nitinol Rotor
+item.itemGearAdvancedNitinol.name=Advanced Nitinol Gear
+item.itemCellAdvancedNitinol.name=Advanced Nitinol Cell
+tile.Block of Advanced Nitinol.name=Block of Advanced Nitinol
+tile.Advanced Nitinol Frame Box.name=Advanced Nitinol Frame Box
+
+item.itemIngotArcanite.name=Arcanite Ingot
+item.itemHotIngotArcanite.name=Hot Arcanite Ingot
+item.itemDustArcanite.name=Arcanite Dust
+item.itemDustTinyArcanite.name=Tiny Pile of Arcanite Dust
+item.itemDustSmallArcanite.name=Small Pile of Arcanite Dust
+item.itemNuggetArcanite.name=Arcanite Nugget
+item.itemPlateArcanite.name=Arcanite Plate
+item.itemPlateDoubleArcanite.name=Double Arcanite Plate
+item.itemBoltArcanite.name=Arcanite Bolt
+item.itemRodArcanite.name=Arcanite Rod
+item.itemRodLongArcanite.name=Long Arcanite Rod
+item.itemRingArcanite.name=Arcanite Ring
+item.itemScrewArcanite.name=Arcanite Screw
+item.itemRotorArcanite.name=Arcanite Rotor
+item.itemGearArcanite.name=Arcanite Gear
+item.itemCellArcanite.name=Arcanite Cell
+tile.Block of Arcanite.name=Block of Arcanite
+tile.Arcanite Frame Box.name=Arcanite Frame Box
+
+item.itemIngotPikyonium64B.name=Pikyonium 64B Ingot
+item.itemHotIngotPikyonium64B.name=Hot Pikyonium 64B Ingot
+item.itemDustPikyonium64B.name=Pikyonium 64B Dust
+item.itemDustTinyPikyonium64B.name=Tiny Pile of Pikyonium 64B Dust
+item.itemDustSmallPikyonium64B.name=Small Pile of Pikyonium 64B Dust
+item.itemNuggetPikyonium64B.name=Pikyonium 64B Nugget
+item.itemPlatePikyonium64B.name=Pikyonium 64B Plate
+item.itemPlateDoublePikyonium64B.name=Double Pikyonium 64B Plate
+item.itemBoltPikyonium64B.name=Pikyonium 64B Bolt
+item.itemRodPikyonium64B.name=Pikyonium 64B Rod
+item.itemRodLongPikyonium64B.name=Long Pikyonium 64B Rod
+item.itemRingPikyonium64B.name=Pikyonium 64B Ring
+item.itemScrewPikyonium64B.name=Pikyonium 64B Screw
+item.itemRotorPikyonium64B.name=Pikyonium 64B Rotor
+item.itemGearPikyonium64B.name=Pikyonium 64B Gear
+item.itemCellPikyonium64B.name=Pikyonium 64B Cell
+tile.Block of Pikyonium 64B.name=Block of Pikyonium 64B
+tile.Pikyonium 64B Frame Box.name=Pikyonium 64B Frame Box
+
+item.itemIngotCinobiteA243.name=Cinobite A243 Ingot
+item.itemHotIngotCinobiteA243.name=Hot Cinobite A243 Ingot
+item.itemDustCinobiteA243.name=Cinobite A243 Dust
+item.itemDustTinyCinobiteA243.name=Tiny Pile of Cinobite A243 Dust
+item.itemDustSmallCinobiteA243.name=Small Pile of Cinobite A243 Dust
+item.itemNuggetCinobiteA243.name=Cinobite A243 Nugget
+item.itemPlateCinobiteA243.name=Cinobite A243 Plate
+item.itemPlateDoubleCinobiteA243.name=Double Cinobite A243 Plate
+item.itemBoltCinobiteA243.name=Cinobite A243 Bolt
+item.itemRodCinobiteA243.name=Cinobite A243 Rod
+item.itemRodLongCinobiteA243.name=Long Cinobite A243 Rod
+item.itemRingCinobiteA243.name=Cinobite A243 Ring
+item.itemScrewCinobiteA243.name=Cinobite A243 Screw
+item.itemRotorCinobiteA243.name=Cinobite A243 Rotor
+item.itemGearCinobiteA243.name=Cinobite A243 Gear
+item.itemCellCinobiteA243.name=Cinobite A243 Cell
+tile.Block of Cinobite A243.name=Block of Cinobite A243
+tile.Cinobite A243 Frame Box.name=Cinobite A243 Frame Box
+
+item.itemIngotLafiumCompound.name=Lafium Compound Ingot
+item.itemHotIngotLafiumCompound.name=Hot Lafium Compound Ingot
+item.itemDustLafiumCompound.name=Lafium Compound Dust
+item.itemDustTinyLafiumCompound.name=Tiny Pile of Lafium Compound Dust
+item.itemDustSmallLafiumCompound.name=Small Pile of Lafium Compound Dust
+item.itemNuggetLafiumCompound.name=Lafium Compound Nugget
+item.itemPlateLafiumCompound.name=Lafium Compound Plate
+item.itemPlateDoubleLafiumCompound.name=Double Lafium Compound Plate
+item.itemBoltLafiumCompound.name=Lafium Compound Bolt
+item.itemRodLafiumCompound.name=Lafium Compound Rod
+item.itemRodLongLafiumCompound.name=Long Lafium Compound Rod
+item.itemRingLafiumCompound.name=Lafium Compound Ring
+item.itemScrewLafiumCompound.name=Lafium Compound Screw
+item.itemRotorLafiumCompound.name=Lafium Compound Rotor
+item.itemGearLafiumCompound.name=Lafium Compound Gear
+item.itemCellLafiumCompound.name=Lafium Compound Cell
+tile.Block of Lafium Compound.name=Block of Lafium Compound
+tile.Lafium Compound Frame Box.name=Lafium Compound Frame Box
+
+item.itemIngotKoboldite.name=Koboldite Ingot
+item.itemHotIngotKoboldite.name=Hot Koboldite Ingot
+item.itemDustKoboldite.name=Koboldite Dust
+item.itemDustTinyKoboldite.name=Tiny Pile of Koboldite Dust
+item.itemDustSmallKoboldite.name=Small Pile of Koboldite Dust
+item.itemNuggetKoboldite.name=Koboldite Nugget
+item.itemPlateKoboldite.name=Koboldite Plate
+item.itemPlateDoubleKoboldite.name=Double Koboldite Plate
+item.itemBoltKoboldite.name=Koboldite Bolt
+item.itemRodKoboldite.name=Koboldite Rod
+item.itemRodLongKoboldite.name=Long Koboldite Rod
+item.itemRingKoboldite.name=Koboldite Ring
+item.itemScrewKoboldite.name=Koboldite Screw
+item.itemRotorKoboldite.name=Koboldite Rotor
+item.itemGearKoboldite.name=Koboldite Gear
+item.itemCellKoboldite.name=Koboldite Cell
+tile.Block of Koboldite.name=Block of Koboldite
+tile.Koboldite Frame Box.name=Koboldite Frame Box
+
+item.itemIngotAbyssalAlloy.name=Abyssal Alloy Ingot
+item.itemHotIngotAbyssalAlloy.name=Hot Abyssal Alloy Ingot
+item.itemDustAbyssalAlloy.name=Abyssal Alloy Dust
+item.itemDustTinyAbyssalAlloy.name=Tiny Pile of Abyssal Alloy Dust
+item.itemDustSmallAbyssalAlloy.name=Small Pile of Abyssal Alloy Dust
+item.itemNuggetAbyssalAlloy.name=Abyssal Alloy Nugget
+item.itemPlateAbyssalAlloy.name=Abyssal Alloy Plate
+item.itemPlateDoubleAbyssalAlloy.name=Double Abyssal Alloy Plate
+item.itemBoltAbyssalAlloy.name=Abyssal Alloy Bolt
+item.itemRodAbyssalAlloy.name=Abyssal Alloy Rod
+item.itemRodLongAbyssalAlloy.name=Long Abyssal Alloy Rod
+item.itemRingAbyssalAlloy.name=Abyssal Alloy Ring
+item.itemScrewAbyssalAlloy.name=Abyssal Alloy Screw
+item.itemRotorAbyssalAlloy.name=Abyssal Alloy Rotor
+item.itemGearAbyssalAlloy.name=Abyssal Alloy Gear
+item.itemCellAbyssalAlloy.name=Abyssal Alloy Cell
+tile.Block of Abyssal Alloy.name=Block of Abyssal Alloy
+tile.Abyssal Alloy Frame Box.name=Abyssal Alloy Frame Box
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//Radioactive
+item.dustTechnetium99M.name=Technetium 99M Dust
+item.dustTechnetium99.name=Technetium 99 Dust
+item.dustMolybdenum99.name=Molybdenum 99 Dust
+
+//Bags
+item.item.MysticBag.name=Mystic Pouch
+item.item.Eatotron9000.name=Eatotronic 9000
+item.item.ToolBox.name=Workers Toolbox
+
+//Cells
+item.Bromine.name=Bromine Cell
+item.Krypton.name=Krypton Cell
+item.cryotheum.name=Cryotheum Cell
+item.pyrotheum.name=Pyrotheum Cell
+item.GeneticMutagen.name=Mutagen Cell
+
+//Ingots
+item.itemHotIngotIncoloy020.name=Hot Incoloy-020 Ingot
+item.itemHotIngotIncoloyDS.name=Hot Incoloy-DS Ingot
+item.itemHotIngotTalonite.name=Hot Talonite Ingot
+item.itemHotIngotHastelloyX.name=Hot Hastelloy-X Ingot
+item.itemHotIngotHastelloyW.name=Hot Hastelloy-W Carbide Ingot
+
+//Railcraft Fix
+item.railcraft.part.plate.lead.name=Lead Plate
+
+//Ions
+item.particle.ion.Hydrogen.name=Hydrogen Ion
+item.particle.ion.Helium.name=Helium Ion
+item.particle.ion.Lithium.name=Lithium Ion
+item.particle.ion.Beryllium.name=Beryllium Ion
+item.particle.ion.Boron.name=Boron Ion
+item.particle.ion.Carbon.name=Carbon Ion
+item.particle.ion.Nitrogen.name=Nitrogen Ion
+item.particle.ion.Oxygen.name=Oxygen Ion
+item.particle.ion.Fluorine.name=Fluorine Ion
+item.particle.ion.Neon.name=Neon Ion
+item.particle.ion.Sodium.name=Sodium Ion
+item.particle.ion.Magnesium.name=Magnesium Ion
+item.particle.ion.Aluminum.name=Aluminum Ion
+item.particle.ion.Silicon.name=Silicon Ion
+item.particle.ion.Phosphorus.name=Phosphorus Ion
+item.particle.ion.Sulfur.name=Sulfur Ion
+item.particle.ion.Chlorine.name=Chlorine Ion
+item.particle.ion.Argon.name=Argon Ion
+item.particle.ion.Potassium.name=Potassium Ion
+item.particle.ion.Calcium.name=Calcium Ion
+item.particle.ion.Scandium.name=Scandium Ion
+item.particle.ion.Titanium.name=Titanium Ion
+item.particle.ion.Vanadium.name=Vanadium Ion
+item.particle.ion.Chromium.name=Chromium Ion
+item.particle.ion.Manganese.name=Manganese Ion
+item.particle.ion.Iron.name=Iron Ion
+item.particle.ion.Cobalt.name=Cobalt Ion
+item.particle.ion.Nickel.name=Nickel Ion
+item.particle.ion.Copper.name=Copper Ion
+item.particle.ion.Zinc.name=Zinc Ion
+item.particle.ion.Gallium.name=Gallium Ion
+item.particle.ion.Germanium.name=Germanium Ion
+item.particle.ion.Arsenic.name=Arsenic Ion
+item.particle.ion.Selenium.name=Selenium Ion
+item.particle.ion.Bromine.name=Bromine Ion
+item.particle.ion.Krypton.name=Krypton Ion
+item.particle.ion.Rubidium.name=Rubidium Ion
+item.particle.ion.Strontium.name=Strontium Ion
+item.particle.ion.Yttrium.name=Yttrium Ion
+item.particle.ion.Zirconium.name=Zirconium Ion
+item.particle.ion.Niobium.name=Niobium Ion
+item.particle.ion.Molybdenum.name=Molybdenum Ion
+item.particle.ion.Technetium.name=Technetium Ion
+item.particle.ion.Ruthenium.name=Ruthenium Ion
+item.particle.ion.Rhodium.name=Rhodium Ion
+item.particle.ion.Palladium.name=Palladium Ion
+item.particle.ion.Silver.name=Silver Ion
+item.particle.ion.Cadmium.name=Cadmium Ion
+item.particle.ion.Indium.name=Indium Ion
+item.particle.ion.Tin.name=Tin Ion
+item.particle.ion.Antimony.name=Antimony Ion
+item.particle.ion.Tellurium.name=Tellurium Ion
+item.particle.ion.Iodine.name=Iodine Ion
+item.particle.ion.Xenon.name=Xenon Ion
+item.particle.ion.Cesium.name=Caesium Ion
+item.particle.ion.Barium.name=Barium Ion
+item.particle.ion.Lanthanum.name=Lanthanum Ion
+item.particle.ion.Cerium.name=Cerium Ion
+item.particle.ion.Praseodymium.name=Praseodymium Ion
+item.particle.ion.Neodymium.name=Neodymium Ion
+item.particle.ion.Promethium.name=Promethium Ion
+item.particle.ion.Samarium.name=Samarium Ion
+item.particle.ion.Europium.name=Europium Ion
+item.particle.ion.Gadolinium.name=Gadolinium Ion
+item.particle.ion.Terbium.name=Terbium Ion
+item.particle.ion.Dysprosium.name=Dysprosium Ion
+item.particle.ion.Holmium.name=Holmium Ion
+item.particle.ion.Erbium.name=Erbium Ion
+item.particle.ion.Thulium.name=Thulium Ion
+item.particle.ion.Ytterbium.name=Ytterbium Ion
+item.particle.ion.Lutetium.name=Lutetium Ion
+item.particle.ion.Hafnium.name=Hafnium Ion
+item.particle.ion.Tantalum.name=Tantalum Ion
+item.particle.ion.Tungsten.name=Tungsten Ion
+item.particle.ion.Rhenium.name=Rhenium Ion
+item.particle.ion.Osmium.name=Osmium Ion
+item.particle.ion.Iridium.name=Iridium Ion
+item.particle.ion.Platinum.name=Platinum Ion
+item.particle.ion.Gold.name=Gold Ion
+item.particle.ion.Mercury.name=Mercury Ion
+item.particle.ion.Thallium.name=Thallium Ion
+item.particle.ion.Lead.name=Lead Ion
+item.particle.ion.Bismuth.name=Bismuth Ion
+item.particle.ion.Polonium.name=Polonium Ion
+item.particle.ion.Astatine.name=Astatine Ion
+item.particle.ion.Radon.name=Radon Ion
+item.particle.ion.Francium.name=Francium Ion
+item.particle.ion.Radium.name=Radium Ion
+item.particle.ion.Actinium.name=Actinium Ion
+item.particle.ion.Thorium.name=Thorium Ion
+item.particle.ion.Protactinium.name=Protactinium Ion
+item.particle.ion.Uranium.name=Uranium Ion
+item.particle.ion.Neptunium.name=Neptunium Ion
+item.particle.ion.Plutonium.name=Plutonium Ion
+item.particle.ion.Americium.name=Americium Ion
+item.particle.ion.Curium.name=Curium Ion
+item.particle.ion.Berkelium.name=Berkelium Ion
+item.particle.ion.Californium.name=Californium Ion
+item.particle.ion.Einsteinium.name=Einsteinium Ion
+item.particle.ion.Fermium.name=Fermium Ion
+item.particle.ion.Mendelevium.name=Mendelevium Ion
+item.particle.ion.Nobelium.name=Nobelium Ion
+item.particle.ion.Lawrencium.name=Lawrencium Ion
+item.particle.ion.Rutherfordium.name=Rutherfordium Ion
+item.particle.ion.Dubnium.name=Dubnium Ion
+item.particle.ion.Seaborgium.name=Seaborgium Ion
+item.particle.ion.Bohrium.name=Bohrium Ion
+item.particle.ion.Hassium.name=Hassium Ion
+item.particle.ion.Meitnerium.name=Meitnerium Ion
+item.particle.ion.Darmstadtium.name=Darmstadtium Ion
+item.particle.ion.Roentgenium.name=Roentgenium Ion
+item.particle.ion.Copernicium.name=Copernicium Ion
+item.particle.ion.Nihonium.name=Nihonium Ion
+item.particle.ion.Flerovium.name=Flerovium Ion
+item.particle.ion.Moscovium.name=Moscovium Ion
+item.particle.ion.Livermorium.name=Livermorium Ion
+item.particle.ion.Tennessine.name=Tennessine Ion
+item.particle.ion.Oganesson.name=Oganesson Ion
+
+
+item.particle.base.Graviton.name=Graviton
+item.particle.base.Up.name=Up Quark
+item.particle.base.Down.name=Down Quark
+item.particle.base.Charm.name=Charm Quark
+item.particle.base.Strange.name=Strange Quark
+item.particle.base.Top.name=Top Quark
+item.particle.base.Bottom.name=Bottom Quark
+item.particle.base.Electron.name=Electron
+item.particle.base.Electron Neutrino.name=Electron Neutrino
+item.particle.base.Muon.name=Muon
+item.particle.base.Muon Neutrino.name=Muon Neutrino
+item.particle.base.Tau.name=Tau
+item.particle.base.Tau Neutrino.name=Tau Neutrino
+item.particle.base.Gluon.name=Gluon
+item.particle.base.Photon.name=Photon
+item.particle.base.Z Boson.name=Z Boson
+item.particle.base.W Boson.name=W Boson
+item.particle.base.Higgs Boson.name=Higgs Boson
+item.particle.base.Proton.name=Proton
+item.particle.base.Neutron.name=Neutron
+item.particle.base.Lambda.name=Lambda
+item.particle.base.Omega.name=Omega
+item.particle.base.Pion.name=Pion
+item.particle.base.ETA Meson.name=ETA Meson
+item.particle.base.Unknown.name=Unknown Particle
+
+//Added 12/1/19
+
+tile.playerDoorGlass.name=Glass Auto-Door
+tile.playerDoorCactus.name=Cactus Auto-Door
+tile.playerDoorIce.name=Ice Auto-Door
+tile.playerDoorIron.name=Iron Auto-Door
+tile.playerDoorWood.name=Wooden Auto-Door
+
+//Added 4/2/19
+
+item.GTPP.BattPack.06.name=Charge Pack [LuV]
+item.GTPP.BattPack.07.name=Charge Pack [ZPM]
+item.GTPP.BattPack.08.name=Charge Pack [UV]
+item.GTPP.BattPack.09.name=Charge Pack [MAX]
+
+
+//Added 13/3/19
+item.gtpp.debug.scanner.name=GT++ Debug Scanner
+item.RawWaste.name=Cell of Animal Waste
+item.ManureSlurry.name=Cell of Manure Slurry
+item.FertileManureSlurry.name=Cell of Fertile Slurry
+item.itemDustTinyDemicheleiteBr.name=Tiny Pile of Demicheleite (Br)
+item.itemDustSmallDemicheleiteBr.name=Small Pile of Demicheleite (Br)
+tile.blockPooCollector.name=Agricultural Sewer
+tile.Block of Lithium 7.name=Block of Lithium 7
+
+//Added 14/3/19
+item.blood.name=Cell of Blood
+item.aniline.name=Aniline Cell
+item.cadaverine.name=Cadaverine Cell
+item.polyurethane.name=Polyurethane Cell
+item.putrescine.name=Putrescine Cell
+item.cyclohexane.name=Cyclohexane Cell
+item.cyclohexanone.name=Cyclohexanone Cell
+item.nitrobenzene.name=Nitrobenzene Cell
+item.ender.name=Cell of Liquid Ender
+item.xpjuice.name=Cell of Liquid Xp
+item.itemBombUnf.name=Throwable Bomb (unf)
+item.itemBombCasing.name=Bomb Casing
+item.gtpp.throwable.bomb.name=Throwable Bomb
+item.itemDetCable.name=Bomb Fuse
+tile.blockPooCollector.0.name=Agricultural Sewer
+tile.blockPooCollector.8.name=Biocomposite Collector
+item.itemIngotBakelite.name=Bakelite Ingot
+item.itemDustBakelite.name=Bakelite Dust
+item.itemDustTinyBakelite.name=Tiny Pile of Bakelite Dust
+item.itemDustSmallBakelite.name=Small Pile of Bakelite Dust
+item.itemNuggetBakelite.name=Bakelite Nugget
+item.itemPlateBakelite.name=Bakelite Plate
+item.itemPlateDoubleBakelite.name=Double Bakelite Plate
+item.itemCellBakelite.name=Bakelite Cell
+tile.Block of Bakelite.name=Block of Bakelite
+item.itemIngotNylon.name=Nylon Ingot
+item.itemDustNylon.name=Nylon Dust
+item.itemDustTinyNylon.name=Tiny Pile of Nylon Dust
+item.itemDustSmallNylon.name=Small Pile of Nylon Dust
+item.itemNuggetNylon.name=Nylon Nugget
+item.itemPlateNylon.name=Nylon Plate
+item.itemPlateDoubleNylon.name=Double Nylon Plate
+item.itemCellNylon.name=Nylon Cell
+tile.Block of Nylon.name=Block of Nylon
+item.itemIngotTeflon.name=Teflon Ingot
+item.itemDustTeflon.name=Teflon Dust
+item.itemDustTinyTeflon.name=Tiny Pile of Teflon Dust
+item.itemDustSmallTeflon.name=Small Pile of Teflon Dust
+item.itemNuggetTeflon.name=Teflon Nugget
+item.itemPlateTeflon.name=Teflon Plate
+item.itemPlateDoubleTeflon.name=Double Teflon Plate
+item.itemCellTeflon.name=Teflon Cell
+tile.Block of Teflon.name=Block of Teflon
+
+//Added 17/4/19
+//Spelling Corrections
+item.particle.ion.Aluminium.name=Aluminium Ion
+item.particle.ion.Caesium.name=Caesium Ion
+
+item.GTPP.MonsterKiller.Enderman.name=Enderman Killer
+item.GTPP.MonsterKiller.Spider.name=Spider Killer
+item.GTPP.MonsterKiller.Skeleton.name=Skeleton Killer
+item.GTPP.MonsterKiller.Creeper.name=Creeper Killer
+item.GTPP.MonsterKiller.Zombie.name=Zombie Killer
+item.GTPP.MonsterKiller.Hellish.name=Nether Mob Killer
+
+item.itemIngotRunite.name=Runite Ingot
+item.itemDustRunite.name=Runite Dust
+item.itemDustTinyRunite.name=Tiny Pile of Runite Dust
+item.itemDustSmallRunite.name=Small Pile of Runite Dust
+item.itemNuggetRunite.name=Runite Nugget
+item.itemPlateRunite.name=Runite Plate
+item.itemPlateDoubleRunite.name=Double Runite Plate
+item.itemCellRunite.name=Runite Cell
+tile.Block of Runite.name=Block of Runite
+
+item.itemIngotDragonblood.name=Dragon Metal Ingot
+item.itemDustDragonblood.name=Dragon Metal Dust
+item.itemDustTinyDragonblood.name=Tiny Pile of Dragon Metal Dust
+item.itemDustSmallDragonblood.name=Small Pile of Dragon Metal Dust
+item.itemNuggetDragonblood.name=Shard of Dragonblood
+item.itemPlateDragonblood.name=Dragon Metal Plate
+item.itemPlateDoubleDragonblood.name=Double Dragon Metal Plate
+item.itemCellDragonblood.name=Dragonblood Cell
+tile.Block of Dragonblood.name=Block of Dragon Metal
+
+item.itemIngotBlackTitanium.name=Black Titanium Ingot
+item.itemDustBlackTitanium.name=Black Titanium Dust
+item.itemDustTinyBlackTitanium.name=Tiny Pile of Black Titanium Dust
+item.itemDustSmallBlackTitanium.name=Small Pile of Black Titanium Dust
+item.itemNuggetBlackTitanium.name=Black Titanium Nugget
+item.itemPlateBlackTitanium.name=Black Titanium Plate
+item.itemPlateDoubleBlackTitanium.name=Double Black Titanium Plate
+item.itemCellBlackTitanium.name=Black Titanium Cell
+tile.Block of Black Titanium.name=Block of Black Titanium
+
+item.itemIngotAncientGranite.name=Ancient Granite Ingot
+item.itemHotIngotAncientGranite.name=Hot Ancient Granite Ingot
+item.itemDustAncientGranite.name=Ancient Granite Dust
+item.itemDustTinyAncientGranite.name=Tiny Pile of Ancient Granite Dust
+item.itemDustSmallAncientGranite.name=Small Pile of Ancient Granite Dust
+item.itemNuggetAncientGranite.name=Ancient Granite Nugget
+item.itemPlateAncientGranite.name=Ancient Granite Plate
+item.itemPlateDoubleAncientGranite.name=Double Ancient Granite Plate
+tile.Block of Ancient Granite.name=Block of Ancient Granite
+
+item.itemIngotBabbitAlloy.name=Babbit Alloy Ingot
+item.itemHotIngotBabbitAlloy.name=Hot Babbit Alloy Ingot
+item.itemDustBabbitAlloy.name=Babbit Alloy Dust
+item.itemDustTinyBabbitAlloy.name=Tiny Pile of Babbit Alloy Dust
+item.itemDustSmallBabbitAlloy.name=Small Pile of Babbit Alloy Dust
+item.itemNuggetBabbitAlloy.name=Babbit Alloy Nugget
+item.itemPlateBabbitAlloy.name=Babbit Alloy Plate
+item.itemPlateDoubleBabbitAlloy.name=Double Babbit Alloy Plate
+item.itemCellBabbitAlloy.name=Babbit Alloy Cell
+tile.Block of Babbit Alloy.name=Block of Babbit Alloy
+
+item.itemIngotBlackMetal.name=Black Metal Ingot
+item.itemHotIngotBlackMetal.name=Hot Black Metal Ingot
+item.itemDustBlackMetal.name=Black Metal Dust
+item.itemDustTinyBlackMetal.name=Tiny Pile of Black Metal Dust
+item.itemDustSmallBlackMetal.name=Small Pile of Black Metal Dust
+item.itemNuggetBlackMetal.name=Black Metal Nugget
+item.itemPlateBlackMetal.name=Black Metal Plate
+item.itemPlateDoubleBlackMetal.name=Double Black Metal Plate
+item.itemBoltBlackMetal.name=Black Metal Bolt
+item.itemRodBlackMetal.name=Black Metal Rod
+item.itemRodLongBlackMetal.name=Long Black Metal Rod
+item.itemRingBlackMetal.name=Black Metal Ring
+item.itemScrewBlackMetal.name=Black Metal Screw
+item.itemRotorBlackMetal.name=Black Metal Rotor
+item.itemGearBlackMetal.name=Black Metal Gear
+item.itemCellBlackMetal.name=Black Metal Cell
+tile.Block of Black Metal.name=Block of Black Metal
+tile.Black Metal Frame Box.name=Black Metal Frame Box
+
+item.itemIngotWhiteMetal.name=White Metal Ingot
+item.itemHotIngotWhiteMetal.name=Hot White Metal Ingot
+item.itemDustWhiteMetal.name=White Metal Dust
+item.itemDustTinyWhiteMetal.name=Tiny Pile of White Metal Dust
+item.itemDustSmallWhiteMetal.name=Small Pile of White Metal Dust
+item.itemNuggetWhiteMetal.name=White Metal Nugget
+item.itemPlateWhiteMetal.name=White Metal Plate
+item.itemPlateDoubleWhiteMetal.name=Double White Metal Plate
+item.itemBoltWhiteMetal.name=White Metal Bolt
+item.itemRodWhiteMetal.name=White Metal Rod
+item.itemRodLongWhiteMetal.name=Long White Metal Rod
+item.itemRingWhiteMetal.name=White Metal Ring
+item.itemScrewWhiteMetal.name=White Metal Screw
+item.itemRotorWhiteMetal.name=White Metal Rotor
+item.itemGearWhiteMetal.name=White Metal Gear
+item.itemCellWhiteMetal.name=White Metal Cell
+tile.Block of White Metal.name=Block of White Metal
+tile.White Metal Frame Box.name=White Metal Frame Box
+
+//Added 29/04/2019
+tile.OreRunite.name=Runite Ore
+item.crushedRunite.name=Crushed Runite Ore
+item.crushedCentrifugedRunite.name=Centrifuged Crushed Runite Ore
+item.crushedPurifiedRunite.name=Purified Crushed Runite Ore
+item.dustImpureRunite.name=Impure Runite Dust
+item.dustPureRunite.name=Purified Runite Dust
+
+tile.OreAncientGranite.name=Ancient Granite Ore
+item.crushedAncientGranite.name=Crushed Ancient Granite Ore
+item.crushedCentrifugedAncientGranite.name=Centrifuged Crushed Ancient Granite Ore
+item.crushedPurifiedAncientGranite.name=Purified Crushed Ancient Granite Ore
+item.dustImpureAncientGranite.name=Impure Ancient Granite Dust
+item.dustPureAncientGranite.name=Purified Ancient Granite Dust
+
+item.itemIngotRhugnor.name=Rhugnor Ingot
+item.itemDustRhugnor.name=Rhugnor Dust
+item.itemDustTinyRhugnor.name=Tiny Pile of Rhugnor Dust
+item.itemDustSmallRhugnor.name=Small Pile of Rhugnor Dust
+item.itemNuggetRhugnor.name=Rhugnor Nugget
+item.itemPlateRhugnor.name=Rhugnor Plate
+item.itemPlateDoubleRhugnor.name=Double Rhugnor Plate
+item.itemCellRhugnor.name=Rhugnor Cell
+tile.Block of Rhugnor.name=Block of Rhugnor
+
+
+
+
+//Added 13/5/19
+
+item.GTPP.BattPack.01.name=Charge Pack [LV]
+item.GTPP.BattPack.02.name=Charge Pack [MV]
+item.GTPP.BattPack.03.name=Charge Pack [HV]
+item.GTPP.BattPack.04.name=Charge Pack [EV]
+item.GTPP.BattPack.05.name=Charge Pack [IV]
+item.IndustrialDiamondExquisite.name=Exquisite Industrial Diamond
+
+item.itemSpringCelestialTungsten.name=Celestial Tungsten Spring
+item.itemSpringWhiteMetal.name=White Metal Spring
+item.itemSpringNitinol60.name=Nitinol 60 Spring
+item.itemSpringWatertightSteel.name=Watertight Steel Spring
+item.itemSpringEglinSteel.name=Eglin Steel Spring
+
+item.itemSmallSpringMaragingSteel250.name=Small Maraging Steel 250 Spring
+item.itemSmallSpringNichrome.name=Small Nichrome Spring
+item.itemSmallSpringStaballoy.name=Small Staballoy Spring
+item.itemSmallSpringBlackSteel.name=Small Black Steel Spring
+item.itemSmallSpringBlackTitanium.name=Small Black Titanium Spring
+
+item.itemFineWireWhiteMetal.name=Fine White Metal Wire
+item.itemFineWirePalladium.name=Fine Palladium Wire
+item.itemFineWireZirconium.name=Fine Zirconium Wire
+item.itemFineWireGrisium.name=Fine Grisium Wire
+item.itemFineWireBabbitAlloy.name=Fine Babbit Alloy Wire
+item.itemFineWireKoboldite.name=Fine Koboldite Wire
+item.itemFineWireHG1223.name=Fine HG-1223 Wire
+item.itemFineWireQuantum.name=Fine Quantum Wire
+
+item.itemHeavyPlatePotin.name=Heavy Potin Plate
+item.itemHeavyPlateWatertightSteel.name=Heavy Watertight Steel Plate
+item.itemHeavyPlateBronze.name=Heavy Bronze Plate
+item.itemHeavyPlateOsmiridium.name=Heavy Osmiridium Plate
+item.itemHeavyPlateQuantum.name=Heavy Quantum Plate
+item.itemHeavyPlateBlackSteel.name=Heavy Black Steel Plate
+item.itemHeavyPlateStainlessSteel.name=Heavy Stainless Steel Plate
+item.itemHeavyPlateEglinSteel.name=Heavy Eglin Steel Plate
+item.itemHeavyPlateMaragingSteel300.name=Heavy Maraging Steel 300 Plate
+item.itemHeavyPlateTalonite.name=Heavy Talonite Plate
+item.itemHeavyPlateHypogen.name=Heavy Hypogen Plate
+item.itemHeavyPlateRhugnor.name=Heavy Rhugnor Plate
+item.itemHeavyPlateAdvancedNitinol.name=Heavy Advanced Nitinol Plate
+item.itemHeavyPlateAstralTitanium.name=Heavy Astral Titanium Plate
+item.itemHeavyPlateCelestialTungsten.name=Heavy Celestial Tungsten Plate
+item.itemHeavyPlateWhiteMetal.name=Heavy White Metal Plate
+item.itemHeavyPlateBlackMetal.name=Heavy Black Metal Plate
+item.itemHeavyPlateAncientGranite.name=Heavy Ancient Granite Plate
+
+item.GTPP.bauble.fireprotection.0.name=Supreme Pizza Gloves
+
+
+//Added 16/5/19
+item.itemCellSeleniumDioxide.name=Selenium Dioxide Cell
+item.itemCellSeleniousAcid.name=Selenious Acid Cell
+
+//Added 25/7/19
+container.pestkiller=Pest Killer
+
+//Added 15/8/19
+gtpp.nei.decayables=Decayables Chest
+entity.batKing.name=Bat King
+item.itemCellCarbyne.name=Carbyne Cell
+item.itemCellHydrogenCyanide.name=Cell of Hydrogen Cyanide
+item.itemCactusCharcoal.name=Cactus Charcoal
+item.itemCactusCoke.name=Cactus Coke
+item.itemSugarCharcoal.name=Sugar Charcoal
+item.itemSugarCoke.name=Sugar Coke
+item.LiquidHydrogen.name=Liquid Hydrogen Cell [LOH]
+
+
+
+//Added 24/8/19
+//Debug Labels
+tile.blockDoorAlloy.name=Reinforced Door
+tile.blockInhibitorObelisk.name=Inhibitor Obelisk
+tile.Battlesign.name=Battlesign
+tile.blockMagicBox.name=Magic Box
+tile.blockManaPod.name=Mana Pod Stem
+tile.buildToolBlock.name=Tool Block
+tile.blockRedPlasma.name=Red Plasma Block
+tile.pipeBlock.name=Pipe
+item.null.name=Null Item report it on github
+
+
+//Added 24/8/19
+tile.OreGreenockite.name=Greenockite Ore
+item.crushedGreenockite.name=Crushed Greenockite Ore
+item.crushedCentrifugedGreenockite.name=Centrifuged Crushed Greenockite Ore
+item.crushedPurifiedGreenockite.name=Purified Crushed Greenockite Ore
+item.dustImpureGreenockite.name=Impure Greenockite Dust
+item.dustPureGreenockite.name=Purified Greenockite Dust
+item.itemDustGreenockite.name=Greenockite Dust
+item.itemDustTinyGreenockite.name=Tiny Pile of Greenockite Dust
+item.itemDustSmallGreenockite.name=Small Pile of Greenockite Dust
+
+tile.OreRareEarthI.name=Rare Earth (I) Ore
+item.crushedRareEarthI.name=Crushed Rare Earth (I) Ore
+item.crushedCentrifugedRareEarthI.name=Centrifuged Crushed Rare Earth (I) Ore
+item.crushedPurifiedRareEarthI.name=Purified Crushed Rare Earth (I) Ore
+item.dustImpureRareEarthI.name=Impure Rare Earth (I) Dust
+item.dustPureRareEarthI.name=Purified Rare Earth (I) Dust
+item.itemDustRareEarthI.name=Rare Earth (I) Dust
+item.itemDustTinyRareEarthI.name=Tiny Pile of Rare Earth (I) Dust
+item.itemDustSmallRareEarthI.name=Small Pile of Rare Earth (I) Dust
+
+tile.OreRareEarthII.name=Rare Earth (II) Ore
+item.crushedRareEarthII.name=Crushed Rare Earth (II) Ore
+item.crushedCentrifugedRareEarthII.name=Centrifuged Crushed Rare Earth (II) Ore
+item.crushedPurifiedRareEarthII.name=Purified Crushed Rare Earth (II) Ore
+item.dustImpureRareEarthII.name=Impure Rare Earth (II) Dust
+item.dustPureRareEarthII.name=Purified Rare Earth (II) Dust
+item.itemDustRareEarthII.name=Rare Earth (II) Dust
+item.itemDustTinyRareEarthII.name=Tiny Pile of Rare Earth (II) Dust
+item.itemDustSmallRareEarthII.name=Small Pile of Rare Earth (II) Dust
+
+tile.OreRareEarthIII.name=Rare Earth (III) Ore
+item.crushedRareEarthIII.name=Crushed Rare Earth (III) Ore
+item.crushedCentrifugedRareEarthIII.name=Centrifuged Crushed Rare Earth (III) Ore
+item.crushedPurifiedRareEarthIII.name=Purified Crushed Rare Earth (III) Ore
+item.dustImpureRareEarthIII.name=Impure Rare Earth (III) Dust
+item.dustPureRareEarthIII.name=Purified Rare Earth (III) Dust
+item.itemDustRareEarthIII.name=Rare Earth (III) Dust
+item.itemDustTinyRareEarthIII.name=Tiny Pile of Rare Earth (III) Dust
+item.itemDustSmallRareEarthIII.name=Small Pile of Rare Earth (III) Dust
+
+//Added 16/10/19
+item.BioRecipeSelector.name=Programmed Bio Circuit
+item.FermentationBase.name=Cell of Fermentation Base
+item.ureamix.name=Cell of Urea Mix
+item.liquidresin.name=Cell of Liquid Resin
+item.propionicacid.name=Propionic Acid Cell
+item.aceticacid.name=Acetic Acid Cell
+item.BasicAgrichemItem.0.name=Algae Biomass
+item.BasicAgrichemItem.1.name=Green Algae Biomass
+item.BasicAgrichemItem.2.name=Brown Algae Biomass
+item.BasicAgrichemItem.3.name=Golden-Brown Algae Biomass
+item.BasicAgrichemItem.4.name=Red Algae Biomass
+item.BasicAgrichemItem.5.name=Cellulose Fiber
+item.BasicAgrichemItem.6.name=Golden-Brown Cellulose Fiber
+item.BasicAgrichemItem.7.name=Red Cellulose Fiber
+item.BasicAgrichemItem.8.name=Compost
+item.BasicAgrichemItem.9.name=Wood Pellet
+item.BasicAgrichemItem.10.name=Wood Brick
+item.BasicAgrichemItem.11.name=Cellulose Pulp
+item.BasicAgrichemItem.12.name=Raw Bio Resin
+item.BasicAgrichemItem.13.name=Catalyst Carrier
+item.BasicAgrichemItem.14.name=Green Metal Catalyst
+item.BasicAgrichemItem.15.name=Alginic Acid
+item.BasicAgrichemItem.16.name=Alumina
+item.BasicAgrichemItem.17.name=Aluminium Pellet
+item.BasicAgrichemItem.18.name=Sodium Aluminate
+item.BasicAgrichemItem.19.name=Sodium Hydroxide
+item.BasicAgrichemItem.20.name=Sodium Carbonate
+item.BasicAgrichemItem.21.name=Lithium Chloride
+
+//Added 24/10/19
+item.butanol.name=Butanol Cell
+
+//Try Fix IC2 Garbage vv
+fluidHotWater=Heated Water
+fluidHotWater.name=Heated Water
+//Try Fix IC2 Garbage ^^
+
+
+//Added 11/12/19
+item.itemHotIngotTitanium.name=Hot Titanium Ingot
+item.OilHeavy.name=Heavy Oil Cell
+item.UnsymmetricalDimethylhydrazine.name=Unsymmetrical Dimethylhydrazine Cell
+item.benzene.name=Benzene Cell
+item.Benzene.name=Benzene Cell
+item.phenol.name=Phenol Cell
+item.CarbonDioxide.name=Carbon Dioxide Cell
+item.itemCellCarbonDioxide.name=Carbon Dioxide Cell
+item.CarbonMonoxide.name=Carbon Monoxide Cell
+item.itemCellCarbonMonoxide.name=Carbon Monoxide Cell
+item.acetone.name=Acetone Cell
+item.saltwater.name=Salt Water Cell
+item.BasicAgrichemItem.22.name=Mold (Pellet)
+item.BasicAgrichemItem.23.name=Clean Aluminium Mix
+
+//Added 12/12/19
+
+item.BasicGenericChemItem.0.name=Red Metal Catalyst
+item.BasicGenericChemItem.1.name=Yellow Metal Catalyst
+item.BasicGenericChemItem.2.name=Blue Metal Catalyst
+item.BasicGenericChemItem.3.name=Orange Metal Catalyst
+item.BasicGenericChemItem.4.name=Purple Metal Catalyst
+item.BasicGenericChemItem.5.name=Brown Metal Catalyst
+item.MudRedSlurry.name=Cell of Red Mud Slurry
+item.liquid_toluene.name=Toluene Cell
+
+//Added 17/01/20
+item.BasicGenericChemItem.6.name=Pink Metal Catalyst
+
+//Added 23/03/20
+item.BasicMetaFood.0.name=Raw Human Meat
+item.BasicMetaFood.1.name=Cooked Human Meat
+item.BasicMetaFood.2.name=Raw Horse Meat
+item.BasicMetaFood.3.name=Cooked Horse Meat
+item.BasicMetaFood.4.name=Raw Wolf Meat
+item.BasicMetaFood.5.name=Cooked Wolf Meat
+item.BasicMetaFood.6.name=Raw Ocelot Meat
+item.BasicMetaFood.7.name=Cooked Ocelot Meat
+item.BasicMetaFood.8.name=Blaze Flesh
+
+item.itemCellNaquadahFuel.name=Naquadah Fuel Cell
+item.itemCellEnrichedNaquadahFuel.name=Enriched Naquadah Fuel Cell
+item.itemCellNaquadriaFuel.name=Naquadria Fuel Cell
+item.boricacid.name=Boric Acid Cell
+item.hydrochloricacid.name=Hydrochloric Acid Cell
+
+item.BasicAlgaeItem.name=Breedable Algae
+item.BasicAlgaeItem.0.name=Breedable Algae
+item.BasicAlgaeItem.1.name=Breedable Algae
+item.BasicAlgaeItem.2.name=Breedable Algae
+item.BasicAlgaeItem.3.name=Breedable Algae
+item.BasicAlgaeItem.4.name=Breedable Algae
+item.BasicAlgaeItem.5.name=Breedable Algae
+item.BasicAlgaeItem.6.name=Breedable Algae
+
+//Added 30/03/20
+item.milledChalcopyrite.name=Milled Chalcopyrite
+item.milledSphalerite.name=Milled Sphalerite
+item.milledNickel.name=Milled Nickel
+item.milledPlatinum.name=Milled Platinum
+item.milledPentlandite.name=Milled Pentlandite
+item.FrothZincflotation.name=Sphalerite Flotation Froth Cell
+item.FrothCopperflotation.name=Chalcopyrite Flotation Froth Cell
+item.FrothNickelflotation.name=Nickel Flotation Froth Cell
+item.FrothPlatinumflotation.name=Platinum Flotation Froth Cell
+item.FrothPentlanditeflotation.name=Pentlandite Flotation Froth Cell
+item.BasicGenericChemItem.7.name=Alumina Milling Ball
+item.BasicGenericChemItem.8.name=Soapstone Milling Ball
+
+//Added 31/03/20
+item.BasicGenericChemItem.9.name=Sodium Ethoxide Dust
+item.BasicGenericChemItem.10.name=Sodium Ethyl Xanthate Dust
+item.BasicGenericChemItem.11.name=Potassium Ethyl Xanthate Dust
+item.BasicGenericChemItem.12.name=Potassium Hydroxide Dust
+item.CarbonDisulfide.name=Carbon Disulfide Cell
+item.HydrogenSulfide.name=Hydrogen Sulfide Cell
+item.BasicAgrichemItem.24.name=Pinecone
+item.BasicAgrichemItem.25.name=Crushed Pine Materials
+item.pineoil.name=Pine Oil Cell
+
+//Added 11/4/20
+item.milledRedstone.name=Milled Redstone
+item.milledSpessartine.name=Milled Spessartine
+item.milledGrossular.name=Milled Grossular
+item.milledAlmandine.name=Milled Almandine
+item.milledPyrope.name=Milled Pyrope
+item.FrothRedstoneflotation.name=Redstone Flotation Froth Cell
+item.FrothSpessartineflotation.name=Spessartine Flotation Froth Cell
+item.FrothGrossularflotation.name=Grossular Flotation Froth Cell
+item.FrothAlmandineflotation.name=Almandine Flotation Froth Cell
+item.FrothPyropeflotation.name=Pyrope Flotation Froth Cell
+
+//Added 13/04/20
+item.T3RecipeSelector.name=Programmed Breakthrough Circuit
+
+//Added 03/05/20
+entity.miscutils.batKing.name=Spectral Bat
+entity.miscutils.bigChickenFriendly.name=Giant Chicken
+entity.miscutils.AusDingo.name=Dingo
+entity.miscutils.AusBoar.name=Wild Boar
+entity.miscutils.AusSpider.name=Forest Spider
+entity.miscutils.AusOctopus.name=Octopus
+container.EggBox=Egg Hatching Box
+
+//Added 24/05/20
+container.VolumetricFlaskSetter=Volumetric Flask Configurator
+
+//Added 26/05/20
+item.itemIngotLaurenium.name=Laurenium Ingot
+item.itemHotIngotLaurenium.name=Hot Laurenium Ingot
+item.itemDustLaurenium.name=Laurenium Dust
+item.itemDustTinyLaurenium.name=Tiny Pile of Laurenium Dust
+item.itemDustSmallLaurenium.name=Small Pile of Laurenium Dust
+item.itemNuggetLaurenium.name=Laurenium Nugget
+item.itemPlateLaurenium.name=Laurenium Plate
+item.itemPlateDoubleLaurenium.name=Double Laurenium Plate
+item.itemBoltLaurenium.name=Laurenium Bolt
+item.itemRodLaurenium.name=Laurenium Rod
+item.itemRodLongLaurenium.name=Long Laurenium Rod
+item.itemRingLaurenium.name=Laurenium Ring
+item.itemScrewLaurenium.name=Laurenium Screw
+item.itemRotorLaurenium.name=Laurenium Rotor
+item.itemGearLaurenium.name=Laurenium Gear
+item.itemCellLaurenium.name=Laurenium Cell
+tile.Block of Laurenium.name=Block of Laurenium
+tile.Laurenium Frame Box.name=Laurenium Frame Box
+item.itemIngotBotmium.name=Botmium Ingot
+item.itemHotIngotBotmium.name=Hot Botmium Ingot
+item.itemDustBotmium.name=Botmium Dust
+item.itemDustTinyBotmium.name=Tiny Pile of Botmium Dust
+item.itemDustSmallBotmium.name=Small Pile of Botmium Dust
+item.itemNuggetBotmium.name=Botmium Nugget
+item.itemPlateBotmium.name=Botmium Plate
+item.itemPlateDoubleBotmium.name=Double Botmium Plate
+item.itemBoltBotmium.name=Botmium Bolt
+item.itemRodBotmium.name=Botmium Rod
+item.itemRodLongBotmium.name=Long Botmium Rod
+item.itemRingBotmium.name=Botmium Ring
+item.itemScrewBotmium.name=Botmium Screw
+item.itemRotorBotmium.name=Botmium Rotor
+item.itemGearBotmium.name=Botmium Gear
+item.itemCellBotmium.name=Botmium Cell
+tile.Block of Botmium.name=Block of Botmium
+tile.Botmium Frame Box.name=Botmium Frame Box
+
+//Added 29/05/20
+item.itemBasicTurbine.name=Basic Turbine
+item.itemBasicTurbine_0.name=Basic Iron Turbine
+item.itemBasicTurbine_1.name=Basic Bronze Turbine
+item.itemBasicTurbine_2.name=Basic Steel Turbine
+
+interaction.voidexcess.enabled=Void Excess Enabled
+interaction.voidexcess.disabled=Void Excess Disabled
+
+interaction.separateBusses.enabled=Input busses are separated
+interaction.separateBusses.disabled=Input busses are not separated
+
+//Added 29/11/21
+
+item.BasicNuclearChemItem.0.name=Uranium Residue Mix
+item.BasicNuclearChemItem.1.name=Plutonium Residue Mix
+item.BasicNuclearChemItem.2.name=Fluoride Residue Mix
+item.BasicNuclearChemItem.3.name=Noble Residue Mix
+item.BasicNuclearChemItem.4.name=Red Algae Biomass
+item.BasicNuclearChemItem.5.name=Cellulose Fiber
+item.BasicNuclearChemItem.6.name=Golden-Brown Cellulose Fiber
+item.BasicNuclearChemItem.7.name=Red Cellulose Fiber
+
+item.itemCellLiFBeF2ZrF4U235.name=LFTR Fuel I Cell
+item.itemCellLiFBeF2ZrF4UF4.name=LFTR Fuel II Cell
+item.itemCellLiFBeF2ThF4UF4.name=LFTR Fuel III Cell
+item.Li2BeF2UF4.name=Burnt Li2BeF2UF4 Cell
+
+//Added 6/12/21
+item.itemCellLiFBeF2UF4FP.name=LiFBeF2UF4FP Cell
+item.itemCellUF6F2.name=UF6F2 Cell
+item.itemCellLiFBeF2ThF4.name=LiFBeF2ThF4 Cell
+item.itemCellUF6F2FP.name=UF6F2FP Cell
+item.dustProtactinium233.name=Protactinium-233 Dust
+item.itemCellLiFThF4.name=LiFThF4 Cell
+item.NuclearWaste.name=Nuclear Waste Cell
+item.itemCellLiFBeF2UF4.name=LiFBeF2UF4 Cell
+item.itemCellSodiumFluoride.name=Sodium Fluoride Cell
+item.itemCellLiFBeF2.name=LiFBeF2 Cell
+
+//Added 7/12/21
+item.itemCellDysprosium.name=Dysprosium Cell
+item.itemCellThorium.name=Thorium Cell
+item.itemCellTellurium.name=Tellurium Cell
+item.itemCellThorium232.name=Thorium-232 Cell
+item.itemCellLithiumTetrafluoroberyllate.name=Lithium Tetrafluoroberyllate Cell
+item.itemCellBurntReactorFuelI.name=Spent LFTR Fuel I Cell
+item.itemCellBurntReactorFuelII.name=Spent LFTR Fuel II Cell
+item.itemDustTinyIndium.name=Tiny Indium Dust
+item.itemDustSmallIndium.name=Small Indium Dust
+item.itemDustIndium.name=Indium Dust
+item.itemDustTinyBerylliumHydroxide.name=Tiny Beryllium Hydroxide Dust
+item.itemDustSmallBerylliumHydroxide.name=Small Beryllium Hydroxide Dust
+item.itemDustBerylliumHydroxide.name=Beryllium Hydroxide Dust
+item.itemDustTinyAmmoniumBifluoride.name=Tiny Ammonium Bifluoride Dust
+item.itemDustSmallAmmoniumBifluoride.name=Small Ammonium Bifluoride Dust
+item.itemDustAmmoniumBifluoride.name=Ammonium Bifluoride Dust
+item.itemDustTinyAmmoniumTetrafluoroberyllate.name=Tiny Ammonium Tetrafluoroberyllate Dust
+item.itemDustSmallAmmoniumTetrafluoroberyllate.name=Small Ammonium Tetrafluoroberyllate Dust
+item.itemDustAmmoniumTetrafluoroberyllate.name=Ammonium Tetrafluoroberyllate Dust
+
+//Added 10/12/21
+item.ImpureLiFBeF2.name=Impure LiFBeF2 Cell
+item.itemCellHeliumSpargedLiFBeF2UF4FP.name=Helium Sparged LiFBeF2UF4FP Cell
+item.itemCellFluorineSpargedLiFThF4.name=Fluorine Sparged LiFThF4 Cell
+item.itemCellFluorineSpargedLiFBeF2ThF4.name=Fluorine Sparged LiFBeF2ThF4 Cell
+item.itemIngotHS188A.name=HS-188A Ingot
+item.itemHotIngotHS188A.name=Hot HS-188A Ingot
+item.itemDustHS188A.name=HS-188A Dust
+item.itemDustTinyHS188A.name=Tiny Pile of HS-188A Dust
+item.itemDustSmallHS188A.name=Small Pile of HS-188A Dust
+item.itemNuggetHS188A.name=HS-188A Nugget
+item.itemPlateHS188A.name=HS-188A Plate
+item.itemPlateDoubleHS188A.name=Double HS-188A Plate
+item.itemBoltHS188A.name=HS-188A Bolt
+item.itemRodHS188A.name=HS-188A Rod
+item.itemRodLongHS188A.name=Long HS-188A Rod
+item.itemRingHS188A.name=HS-188A Ring
+item.itemScrewHS188A.name=HS-188A Screw
+item.itemRotorHS188A.name=HS-188A Rotor
+item.itemGearHS188A.name=HS-188A Gear
+item.itemCellHS188A.name=HS-188A Cell
+
+//Added 12/12/21
+item.itemIngotErbium.name=Erbium Ingot
+item.itemHotIngotErbium.name=Hot Erbium Ingot
+item.itemDustErbium.name=Erbium Dust
+item.itemDustTinyErbium.name=Tiny Pile of Erbium Dust
+item.itemDustSmallErbium.name=Small Pile of Erbium Dust
+item.itemNuggetErbium.name=Erbium Nugget
+item.itemPlateErbium.name=Erbium Plate
+item.itemPlateDoubleErbium.name=Double Erbium Plate
+item.itemBoltErbium.name=Erbium Bolt
+item.itemRodErbium.name=Erbium Rod
+item.itemRodLongErbium.name=Long Erbium Rod
+item.itemRingErbium.name=Erbium Ring
+item.itemScrewErbium.name=Erbium Screw
+item.itemRotorErbium.name=Erbium Rotor
+item.itemGearErbium.name=Erbium Gear
+item.itemCellErbium.name=Erbium Cell
+item.itemIngotHeLiCoPtEr.name=HeLiCoPtEr Ingot
+item.itemHotIngotHeLiCoPtEr.name=Hot HeLiCoPtEr Ingot
+item.itemDustHeLiCoPtEr.name=HeLiCoPtEr Dust
+item.itemDustTinyHeLiCoPtEr.name=Tiny Pile of HeLiCoPtEr Dust
+item.itemDustSmallHeLiCoPtEr.name=Small Pile of HeLiCoPtEr Dust
+item.itemNuggetHeLiCoPtEr.name=HeLiCoPtEr Nugget
+item.itemPlateHeLiCoPtEr.name=HeLiCoPtEr Plate
+item.itemPlateDoubleHeLiCoPtEr.name=Double HeLiCoPtEr Plate
+item.itemBoltHeLiCoPtEr.name=HeLiCoPtEr Bolt
+item.itemRodHeLiCoPtEr.name=HeLiCoPtEr Rod
+item.itemRodLongHeLiCoPtEr.name=Long HeLiCoPtEr Rod
+item.itemRingHeLiCoPtEr.name=HeLiCoPtEr Ring
+item.itemScrewHeLiCoPtEr.name=HeLiCoPtEr Screw
+item.itemRotorHeLiCoPtEr.name=HeLiCoPtEr Rotor
+item.itemGearHeLiCoPtEr.name=HeLiCoPtEr Gear
+item.itemCellHeLiCoPtEr.name=HeLiCoPtEr Cell
+item.itemIngotPraseodymium.name=Praseodymium Ingot
+item.itemHotIngotPraseodymium.name=Hot Praseodymium Ingot
+item.itemDustPraseodymium.name=Praseodymium Dust
+item.itemDustTinyPraseodymium.name=Tiny Pile of Praseodymium Dust
+item.itemDustSmallPraseodymium.name=Small Pile of Praseodymium Dust
+item.itemNuggetPraseodymium.name=Praseodymium Nugget
+item.itemPlatePraseodymium.name=Praseodymium Plate
+item.itemPlateDoublePraseodymium.name=Double Praseodymium Plate
+item.itemBoltPraseodymium.name=Praseodymium Bolt
+item.itemRodPraseodymium.name=Praseodymium Rod
+item.itemRodLongPraseodymium.name=Long Praseodymium Rod
+item.itemRingPraseodymium.name=Praseodymium Ring
+item.itemScrewPraseodymium.name=Praseodymium Screw
+item.itemRotorPraseodymium.name=Praseodymium Rotor
+item.itemGearPraseodymium.name=Praseodymium Gear
+item.itemCellPraseodymium.name=Praseodymium Cell
+item.milledMonazite.name=Milled Monazite
+item.FrothMonaziteflotation.name=Monazite Flotation Froth Cell
+
+//Added 18/12/21
+item.BasicGenericChemItem.13.name=Formaldehyde Catalyst
+item.hydrogenchloridemix.name=Hydrogen Chlorine Mix
+
+//Added 19/01/22
+item.SunnariumBit.name=Sunnarium Bit
+
+//Added 29/01/22
+sleep.event.okay=Вы хорошо выспались и теперь чувствуете себя немного лучше.
+sleep.event.good=Вы хорошо выспались и теперь чувствуете себя намного лучше.
+sleep.event.wellrested=Вы чувствуете себя хорошо отдохнувшим.
+sleep.event.downsides=Слабое здоровье больше не беспокоит вас.
+item.miscutils:magicfeather.name=Magical Feather
+
+//Added 10/02/22
+item.BasicGenericChemItem.14.name=Solid-Acid Catalyst
+
+//Added 30/05/22
+item.BasicGenericChemItem.15.name=Infinite Mutation Catalyst \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/lang/zh_CN.lang b/gtpp/src/main/resources/assets/miscutils/lang/zh_CN.lang
new file mode 100644
index 0000000000..83304b8697
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/lang/zh_CN.lang
@@ -0,0 +1,3351 @@
+//Creative Tabs
+itemGroup.MiscUtilBlockTab=[GT++] 方块
+itemGroup.MiscUtilMiscTab=[GT++] 物品
+itemGroup.MiscUtilCombatTab=[GT++] 战斗
+itemGroup.MiscUtilToolsTab=[GT++] 工具
+itemGroup.MiscUtilMachineTab=[GT++] 机器
+itemGroup.MiscUtilOtherTab=[GT++] 物品 II
+itemGroup.MiscUtilBOP=[GT++]超多生物群系附属
+
+//Debug
+item.AAA_Broken.name=[不存在的物品]请在Github上反馈这个合成
+item.itemBedLocator_Base.name=床定位器[NBT测试]
+item.itemBaseItemWithCharge.name=基础可充电物品
+item.miscutils_itemDebugShapeSpawner.name=[调试用]塑形
+
+//Fluids
+tile.fluidSludge.name=不流动的废水
+tile.fluidSludge.0.name=不流动的废水
+
+//Death Messages
+death.attack.plasmabolt=%s 死于滚烫的等离子体.
+death.attack.plasmabolt.player=%1$s 被 %2$s 使用等离子体击杀.
+death.attack.gtpp.grinder=%s 被艾萨研磨机磨成了渣渣.
+
+//Alternative Materials
+item.itemPlateBatteryAlloy.name=电池合金板
+item.itemIngotBatteryAlloy.name=电池合金锭
+item.itemStickyRubber.name=粘性橡胶团
+
+//Unused Fuel rods
+item.itemFuelRod_Empty.name=空燃料棒
+item.itemFuelRod_Thorium.name=钍燃料棒
+item.itemFuelRod_Uranium.name=铀燃料棒
+item.itemFuelRod_Plutonium.name=钚燃料棒
+
+//Entities
+entity.constructStaballoy.name=贫铀合金结构
+entity.sickBlaze.name=被感染的狂热者
+
+//Tile Entities
+tile.blockToolBuilder.name=格雷工具组装台
+
+//Tools
+item.itemBufferCore.name=能量核心
+item.itemStaballoyPickaxe.name=隧道挖掘者
+item.itemStaballoyAxe.name=树林砍伐者
+item.itemSandstoneHammer.name=圆石粉碎者
+
+//Thermal Foundation Stuff
+item.MiscUtils.bucket.bucketPyrotheum.name=烈焰之炽焱桶
+item.MiscUtils.bucket.bucketCryotheum.name=极寒之凛冰桶
+item.MiscUtils.bucket.bucketEnder.name=谐振熔融末影珍珠桶
+item.MiscUtils.material.dustPyrotheum.name=炽焱之尘
+item.MiscUtils.material.dustCryotheum.name=凛冰之尘
+item.MiscUtils.material.rodBlizz.name=暴雪棒
+item.MiscUtils.material.dustBlizz.name=暴雪粉
+
+//------------- 'miscutils' is Case Sensitive Here, unsure why
+tile.miscutils.fluid.pyrotheum.name=烈焰之炽焱
+tile.miscutils.fluid.cryotheum.name=极寒之凛冰
+tile.miscutils.fluid.ender.name=谐振熔融末影珍珠
+//--------------
+
+//Forestry Stuff
+item.frameAccelerated.name=加速框架
+item.frameVoid.name=虚空框架
+item.frameMutagenic.name=诱变框架
+item.frameBusy.name=工作框架
+item.frameChocolate.name=巧克力框架
+item.frameRestraint.name=约束框架
+item.frameSoul.name=灵魂框架
+item.frameHealing.name=治愈框架
+item.frameNova.name=新星框架
+item.frameArborists.name=树艺框架
+item.frameDecaying.name=腐烂框架
+item.frameSlowing.name=减速框架
+item.frameStabilizing.name=稳定框架
+item.frameUseless.name=无用框架
+
+//IC2 stuff
+item.itemEnergeticRotorBlade.name=充能合金扇叶
+item.itemTungstenSteelRotorBlade.name=钨钢扇叶
+item.itemVibrantRotorBlade.name=脉冲合金扇叶
+item.itemIridiumRotorBlade.name=铱扇叶
+item.itemEnergeticShaft.name=充能合金轴
+item.itemTungstenSteelShaft.name=钨钢轴
+item.itemVibrantShaft.name=脉冲合金轴
+item.itemIridiumShaft.name=铱轴
+item.itemMagnaliumRotorBlade.name=镁铝合金扇叶
+item.itemUltimetRotorBlade.name=哈氏合金扇叶
+item.itemMagnaliumShaft.name=镁铝合金轴
+item.itemUltimetShaft.name=哈氏合金轴
+
+
+//Misc Items
+item.itemPLACEHOLDER_Circuit.name=夸克操纵者 (UV)
+item.itemPlateEnrichedSoularium.name=富集阳光合金板
+item.itemHeliumBlob.name=神秘氢气物质
+item.itemAlkalusDisk.name=Alkalus圆盘
+
+//Misc Blocks
+tile.blockCompressedObsidian.0.name=压缩黑曜石(9)
+tile.blockCompressedObsidian.1.name=二重压缩黑曜石(81)
+tile.blockCompressedObsidian.2.name=三重压缩黑曜石(729)
+tile.blockCompressedObsidian.3.name=四重压缩黑曜石(6561)
+tile.blockCompressedObsidian.4.name=五重压缩黑曜石(59049)
+tile.blockCompressedObsidian.5.name=反转黑曜石
+tile.blockCompressedObsidian.6.name=压缩萤石(9)
+tile.blockCompressedObsidian.7.name=二重压缩萤石(81)
+tile.blockCompressedObsidian.8.name=三重压缩萤石(729)
+tile.blockCompressedObsidian.9.name=四重压缩萤石(6561)
+tile.blockCompressedObsidian.10.name=五重压缩萤石(59049)
+tile.blockNet.name=网
+
+
+//GT++ Items
+
+//Meta Tool
+MU-metaitem.01.0.name=MU-metaitem.01.0.name
+
+//Cells
+item.SulfurDioxide.name=优质二氧化硫单元
+item.mobessence.name=怪物精华液单元
+item.Fertiliser.name=流体肥料单元
+item.UN32Fertiliser.name=UN-32肥料单元
+item.UN18Fertiliser.name=UN-18肥料单元
+item.RaisinJuice.name=葡萄汁单元
+item.BerylliumHydroxide.name=氢氧化铍单元
+item.AmmoniumBifluoride.name=氟化氢铵单元
+item.Hydroxide.name=氢氧化物单元
+item.Ammonium.name=铵单元
+item.AmmoniumTetrafluoroberyllate.name=四氟硼酸铵单元
+
+//Resources
+item.itemStickyRubber.name=粘性橡胶团
+item.itemCoalCoke.name=焦煤
+item.itemHydrogenBlob.name=神秘氢气团
+item.itemHeliumBlob.name=神秘氢气物质
+
+//Normal Items
+item.itemAlkalusDisk.name=Alkalus圆盘
+item.itemSimpleFiremaker.name=基础起火器
+item.itemFiber.name=植物纤维
+item.itemRope.name=绳索
+item.backpackRed.name=红色背包
+item.backpackGreen.name=绿色背包
+item.backpackBlue.name=蓝色背包
+item.backpackYellow.name=黄色背包
+item.backpackPurple.name=紫色背包
+item.backpackCyan.name=青色背包
+item.backpackMaroon.name=棕色背包
+item.backpackOlive.name=橄榄绿色背包
+item.backpackDarkGreen.name=深绿色背包
+item.backpackDarkPurple.name=深紫色背包
+item.backpackTeal.name=蓝绿色背包
+item.backpackNavy.name=深蓝色背包
+item.backpackSilver.name=银色背包
+item.backpackGray.name=灰色背包
+item.backpackBlack.name=黑色背包
+item.backpackWhite.name=白色背包
+item.itemBlueprint.name=蓝图[无用]
+item.itemGemShards.name=钻石碎片
+item.itemHalfCompleteCasings.name=半成品机械方块
+item.itemSulfuricPotion.name=喷溅型 硫酸
+item.itemHydrofluoricPotion.name=喷溅型 氢氟酸
+
+
+//Conversion Dusts
+item.dustNeptunium238.name=镎-238粉
+item.dustRadium226.name=镭-226粉
+item.itemDustDecayedRadium226.name=衰变镭-226粉
+item.itemDustSmallDecayedRadium226.name=小堆衰变镭-226粉
+item.itemDustTinyDecayedRadium226.name=小撮衰变镭-226粉
+
+//Material Items
+item.itemDustGadolinium.name=钆粉
+item.itemDustSmallGadolinium.name=小堆钆粉
+item.itemDustTinyGadolinium.name=小撮钆粉
+item.itemDustYtterbium.name=镱粉
+item.itemDustSmallYtterbium.name=小堆镱粉
+item.itemDustTinyYtterbium.name=小撮镱粉
+item.itemDustSamarium.name=钐粉
+item.itemDustSmallSamarium.name=小堆钐粉
+item.itemDustTinySamarium.name=小撮钐粉
+item.itemDustLanthanum.name=镧粉
+item.itemDustSmallLanthanum.name=小堆镧粉
+item.itemDustTinyLanthanum.name=小撮镧粉
+item.itemCellNeon.name=氖单元
+item.itemCellGermanium.name=锗单元
+item.itemCellSelenium.name=硒单元
+item.itemCellBromine.name=溴单元
+item.itemCellKrypton.name=氪单元
+item.itemCellZirconium.name=锆单元
+item.itemCellTechnetium.name=锝单元
+item.itemCellRuthenium.name=钌单元
+item.itemCellRhodium.name=铑单元
+item.itemCellIodine.name=碘单元
+item.itemCellXenon.name=氙单元
+item.itemCellHafnium.name=铪单元
+item.itemCellRhenium.name=铼单元
+item.itemCellThallium.name=铊单元
+item.itemCellPolonium.name=钋单元
+item.itemCellAstatine.name=砹单元
+item.itemCellFrancium.name=钫单元
+item.itemCellRadium.name=镭单元
+item.itemCellActinium.name=锕单元
+item.itemCellProtactinium.name=镤单元
+item.itemCellNeptunium.name=镎单元
+item.itemCellCurium.name=锔单元
+item.itemCellBerkelium.name=锫单元
+item.itemCellCalifornium.name=锎单元
+item.itemCellEinsteinium.name=锿单元
+item.itemCellFermium.name=镄单元
+item.itemCellRefinedTrinium.name=精制三元金属单元
+item.itemIngotSelenium.name=硒锭
+item.itemDustSelenium.name=硒粉
+item.itemDustTinySelenium.name=小撮硒粉
+item.itemDustSmallSelenium.name=小堆硒粉
+item.itemNuggetSelenium.name=硒粒
+item.itemPlateSelenium.name=硒板
+item.itemPlateDoubleSelenium.name=双重硒板
+item.itemBoltSelenium.name=硒螺栓
+item.itemRodSelenium.name=硒杆
+item.itemRodLongSelenium.name=长硒杆
+item.itemRingSelenium.name=硒环
+item.itemScrewSelenium.name=硒螺丝
+item.itemRotorSelenium.name=硒转子
+item.itemGearSelenium.name=硒齿轮
+item.itemCellUranium232.name=铀-232单元
+item.itemCellUranium233.name=铀-233单元
+item.itemCellThoriumTetrafluoride.name=四氟化钍单元
+item.itemCellThoriumHexafluoride.name=六氟化钍单元
+item.itemCellUraniumTetrafluoride.name=四氟化铀单元
+item.itemCellUraniumHexafluoride.name=六氟化铀单元
+item.itemCellZirconiumTetrafluoride.name=四氟化锆单元
+item.itemCellBerylliumFluoride.name=氟化铍单元
+item.itemCellLithiumFluoride.name=氟化锂单元
+item.itemCellHydroxide.name=氢氧化物单元
+item.itemCellAmmonium.name=铵单元
+item.itemCellAmmoniumBifluoride.name=氟化氢铵单元
+item.itemCellBerylliumHydroxide.name=氢氧化铍单元
+item.itemCellAmmoniumTetrafluoroberyllate.name=氟铍酸铵单元
+item.itemCellNeptuniumHexafluoride.name=六氟化铀单元
+item.itemCellTechnetiumHexafluoride.name=六氟化锝单元
+item.itemCellSeleniumHexafluoride.name=六氟化硒单元
+item.itemCellEnergyCrystal.name=能量水晶单元
+item.itemCellBloodSteel.name=血钢单元
+item.itemCellStaballoy.name=贫铀合金单元
+item.itemCellTantalloy60.name=钽钨合金-60单元
+item.itemCellTantalloy61.name=钽钨合金-61单元
+item.itemCellTumbaga.name=铜金合金单元
+item.itemCellPotin.name=粗青铜合金单元
+item.itemCellInconel625.name=镍铬基合金-625单元
+item.itemCellInconel690.name=镍铬基合金-690单元
+item.itemCellInconel792.name=镍铬基合金-792单元
+item.itemCellZeron100.name=塞龙-100单元
+item.itemCellMaragingSteel250.name=马氏体时效钢250单元
+item.itemCellMaragingSteel300.name=马氏体时效钢300单元
+item.itemCellMaragingSteel350.name=马氏体时效钢350单元
+item.itemCellStellite.name=铬钴锰钛合金单元
+item.itemCellTalonite.name=铬钴磷酸盐合金单元
+item.itemCellHastelloyW.name=哈斯特洛依合金-W单元
+item.itemCellHastelloyX.name=哈斯特洛依合金-X单元
+item.itemCellHastelloyN.name=哈斯特洛依合金-N单元
+item.itemCellHastelloyC276.name=哈斯特洛依合金-C276单元
+item.itemCellIncoloy020.name=耐热铬铁合金-020单元
+item.itemCellIncoloyDS.name=耐热铬铁合金-DS单元
+item.itemCellIncoloyMA956.name=耐热铬铁合金-MA956单元
+item.itemCellTungstenCarbide.name=碳化钨单元
+item.itemCellSiliconCarbide.name=碳化硅单元
+item.itemCellTantalumCarbide.name=碳化钽单元
+item.itemCellZirconiumCarbide.name=碳化锆单元
+item.itemCellNiobiumCarbide.name=碳化铌单元
+item.itemCellGrisium.name=灰钛合金单元
+item.itemCellEglinSteelBaseCompound.name=埃格林钢单元
+item.itemCellEglinSteel.name=埃格林钢单元
+item.itemCellHG1223.name=HG-1223单元
+item.itemCellTriniumTitaniumAlloy.name=三元钛合金单元
+item.itemCellTriniumNaquadahAlloy.name=三元硅岩合金单元
+item.itemCellTriniumNaquadahCarbonite.name=碳化三元硅岩合金单元
+item.itemCellQuantum.name=量子合金单元
+item.itemIngotBromine.name=溴锭
+item.itemDustBromine.name=溴粉
+item.itemDustTinyBromine.name=小撮溴粉
+item.itemDustSmallBromine.name=小堆溴粉
+item.itemNuggetBromine.name=溴粒
+item.itemPlateBromine.name=溴板
+item.itemPlateDoubleBromine.name=双重溴板
+item.itemIngotStrontium.name=锶锭
+item.itemDustStrontium.name=锶粉
+item.itemDustTinyStrontium.name=小撮锶粉
+item.itemDustSmallStrontium.name=小堆锶粉
+item.itemNuggetStrontium.name=锶粒
+item.itemPlateStrontium.name=锶板
+item.itemPlateDoubleStrontium.name=双重锶板
+item.itemBoltStrontium.name=锶螺栓
+item.itemRodStrontium.name=锶杆
+item.itemRodLongStrontium.name=长锶杆
+item.itemRingStrontium.name=锶环
+item.itemScrewStrontium.name=锶螺丝
+item.itemRotorStrontium.name=锶转子
+item.itemGearStrontium.name=锶齿轮
+item.itemIngotZirconium.name=锆锭
+item.itemDustZirconium.name=锆粉
+item.itemDustTinyZirconium.name=小撮锆粉
+item.itemDustSmallZirconium.name=小堆锆粉
+item.itemNuggetZirconium.name=锆粒
+item.itemPlateZirconium.name=锆板
+item.itemPlateDoubleZirconium.name=双重锆板
+item.itemBoltZirconium.name=锆螺栓
+item.itemRodZirconium.name=锆杆
+item.itemRodLongZirconium.name=长锆杆
+item.itemRingZirconium.name=锆环
+item.itemScrewZirconium.name=锆螺丝
+item.itemRotorZirconium.name=锆转子
+item.itemGearZirconium.name=锆齿轮
+item.itemIngotRuthenium.name=钌锭
+item.itemDustRuthenium.name=钌粉
+item.itemDustTinyRuthenium.name=小撮钌粉
+item.itemDustSmallRuthenium.name=小堆钌粉
+item.itemNuggetRuthenium.name=钌粒
+item.itemPlateRuthenium.name=钌板
+item.itemPlateDoubleRuthenium.name=双重钌板
+item.itemBoltRuthenium.name=钌螺栓
+item.itemRodRuthenium.name=钌杆
+item.itemRodLongRuthenium.name=长钌杆
+item.itemRingRuthenium.name=钌环
+item.itemScrewRuthenium.name=钌螺丝
+item.itemRotorRuthenium.name=钌转子
+item.itemGearRuthenium.name=钌齿轮
+item.itemIngotIodine.name=碘锭
+item.itemDustIodine.name=碘粉
+item.itemDustTinyIodine.name=小撮碘粉
+item.itemDustSmallIodine.name=小堆碘粉
+item.itemNuggetIodine.name=碘粒
+item.itemPlateIodine.name=碘板
+item.itemPlateDoubleIodine.name=双重碘板
+item.itemBoltIodine.name=碘螺栓
+item.itemRodIodine.name=碘杆
+item.itemRodLongIodine.name=长碘杆
+item.itemRingIodine.name=碘环
+item.itemScrewIodine.name=碘螺丝
+item.itemRotorIodine.name=碘转子
+item.itemGearIodine.name=碘齿轮
+item.itemIngotHafnium.name=铪锭
+item.itemDustHafnium.name=铪粉
+item.itemDustTinyHafnium.name=小撮铪粉
+item.itemDustSmallHafnium.name=小堆铪粉
+item.itemNuggetHafnium.name=铪粒
+item.itemPlateHafnium.name=铪板
+item.itemPlateDoubleHafnium.name=双重铪板
+item.itemBoltHafnium.name=铪螺栓
+item.itemRodHafnium.name=铪杆
+item.itemRodLongHafnium.name=长铪杆
+item.itemRingHafnium.name=铪环
+item.itemScrewHafnium.name=铪螺丝
+item.itemRotorHafnium.name=铪转子
+item.itemGearHafnium.name=铪齿轮
+item.itemIngotDysprosium.name=镝锭
+item.itemDustDysprosium.name=镝粉
+item.itemDustTinyDysprosium.name=小撮镝粉
+item.itemDustSmallDysprosium.name=小堆镝粉
+item.itemNuggetDysprosium.name=镝粒
+item.itemPlateDysprosium.name=镝板
+item.itemPlateDoubleDysprosium.name=双重镝板
+item.itemBoltDysprosium.name=镝螺栓
+item.itemRodDysprosium.name=镝杆
+item.itemRodLongDysprosium.name=长镝杆
+item.itemRingDysprosium.name=镝环
+item.itemScrewDysprosium.name=镝螺丝
+item.itemRotorDysprosium.name=镝转子
+item.itemGearDysprosium.name=镝齿轮
+item.itemIngotTellurium.name=碲锭
+item.itemDustTellurium.name=碲粉
+item.itemDustTinyTellurium.name=小撮碲粉
+item.itemDustSmallTellurium.name=小堆碲粉
+item.itemNuggetTellurium.name=碲粒
+item.itemPlateTellurium.name=碲板
+item.itemPlateDoubleTellurium.name=双重碲板
+item.itemBoltTellurium.name=碲螺栓
+item.itemRodTellurium.name=碲杆
+item.itemRodLongTellurium.name=长碲杆
+item.itemRingTellurium.name=碲环
+item.itemScrewTellurium.name=碲螺丝
+item.itemRotorTellurium.name=碲转子
+item.itemGearTellurium.name=碲齿轮
+item.itemIngotRhodium.name=铑锭
+item.itemDustRhodium.name=铑粉
+item.itemDustTinyRhodium.name=小撮铑粉
+item.itemDustSmallRhodium.name=小堆铑粉
+item.itemNuggetRhodium.name=铑粒
+item.itemPlateRhodium.name=铑板
+item.itemPlateDoubleRhodium.name=双重铑板
+item.itemBoltRhodium.name=铑螺栓
+item.itemRodRhodium.name=铑杆
+item.itemRodLongRhodium.name=长铑杆
+item.itemRingRhodium.name=铑环
+item.itemScrewRhodium.name=铑螺丝
+item.itemRotorRhodium.name=铑转子
+item.itemGearRhodium.name=铑齿轮
+item.itemIngotRhenium.name=铼锭
+item.itemDustRhenium.name=铼粉
+item.itemDustTinyRhenium.name=小撮铼粉
+item.itemDustSmallRhenium.name=小堆铼粉
+item.itemNuggetRhenium.name=铼粒
+item.itemPlateRhenium.name=铼板
+item.itemPlateDoubleRhenium.name=双重铼板
+item.itemBoltRhenium.name=铼螺栓
+item.itemRodRhenium.name=铼杆
+item.itemRodLongRhenium.name=长铼杆
+item.itemRingRhenium.name=铼环
+item.itemScrewRhenium.name=铼螺丝
+item.itemRotorRhenium.name=铼转子
+item.itemGearRhenium.name=铼齿轮
+item.itemIngotThallium.name=铊锭
+item.itemDustThallium.name=铊粉
+item.itemDustTinyThallium.name=小撮铊粉
+item.itemDustSmallThallium.name=小堆铊粉
+item.itemNuggetThallium.name=铊粒
+item.itemPlateThallium.name=铊板
+item.itemPlateDoubleThallium.name=双重铊板
+item.itemBoltThallium.name=铊螺栓
+item.itemRodThallium.name=铊杆
+item.itemRodLongThallium.name=长铊杆
+item.itemRingThallium.name=铊环
+item.itemScrewThallium.name=铊螺丝
+item.itemRotorThallium.name=铊转子
+item.itemGearThallium.name=铊齿轮
+item.itemIngotTechnetium.name=锝锭
+item.itemDustTechnetium.name=锝粉
+item.itemDustTinyTechnetium.name=小撮锝粉
+item.itemDustSmallTechnetium.name=小堆锝粉
+item.itemNuggetTechnetium.name=锝粒
+item.itemPlateTechnetium.name=锝板
+item.itemPlateDoubleTechnetium.name=双重锝板
+item.itemIngotPolonium.name=钋锭
+item.itemDustPolonium.name=钋粉
+item.itemDustTinyPolonium.name=小撮钋粉
+item.itemDustSmallPolonium.name=小堆钋粉
+item.itemNuggetPolonium.name=钋粒
+item.itemPlatePolonium.name=钋板
+item.itemPlateDoublePolonium.name=双重钋板
+item.itemIngotAstatine.name=砹锭
+item.itemDustAstatine.name=砹粉
+item.itemDustTinyAstatine.name=小撮砹粉
+item.itemDustSmallAstatine.name=小堆砹粉
+item.itemNuggetAstatine.name=砹粒
+item.itemPlateAstatine.name=砹板
+item.itemPlateDoubleAstatine.name=双重砹板
+item.itemIngotFrancium.name=钫锭
+item.itemDustFrancium.name=钫粉
+item.itemDustTinyFrancium.name=小撮钫粉
+item.itemDustSmallFrancium.name=小堆钫粉
+item.itemNuggetFrancium.name=钫粒
+item.itemPlateFrancium.name=钫板
+item.itemPlateDoubleFrancium.name=双重钫板
+item.itemIngotRadium.name=镭锭
+item.itemDustRadium.name=镭粉
+item.itemDustTinyRadium.name=小撮镭粉
+item.itemDustSmallRadium.name=小堆镭粉
+item.itemNuggetRadium.name=镭粒
+item.itemPlateRadium.name=镭板
+item.itemPlateDoubleRadium.name=双重镭板
+item.itemIngotActinium.name=锕锭
+item.itemDustActinium.name=锕粉
+item.itemDustTinyActinium.name=小撮锕粉
+item.itemDustSmallActinium.name=小堆锕粉
+item.itemNuggetActinium.name=锕粒
+item.itemPlateActinium.name=锕板
+item.itemPlateDoubleActinium.name=双重锕板
+item.itemIngotProtactinium.name=镤锭
+item.itemDustProtactinium.name=镤粉
+item.itemDustTinyProtactinium.name=小撮镤粉
+item.itemDustSmallProtactinium.name=小堆镤粉
+item.itemNuggetProtactinium.name=镤粒
+item.itemPlateProtactinium.name=镤板
+item.itemPlateDoubleProtactinium.name=双重镤板
+item.itemIngotNeptunium.name=镎锭
+item.itemDustNeptunium.name=镎粉
+item.itemDustTinyNeptunium.name=小撮镎粉
+item.itemDustSmallNeptunium.name=小堆镎粉
+item.itemNuggetNeptunium.name=镎粒
+item.itemPlateNeptunium.name=镎板
+item.itemPlateDoubleNeptunium.name=双重镎板
+item.itemIngotCurium.name=锔锭
+item.itemDustCurium.name=锔粉
+item.itemDustTinyCurium.name=小撮锔粉
+item.itemDustSmallCurium.name=小堆锔粉
+item.itemNuggetCurium.name=锔粒
+item.itemPlateCurium.name=锔板
+item.itemPlateDoubleCurium.name=双重锔板
+item.itemIngotBerkelium.name=锫锭
+item.itemDustBerkelium.name=锫粉
+item.itemDustTinyBerkelium.name=小撮锫粉
+item.itemDustSmallBerkelium.name=小堆锫粉
+item.itemNuggetBerkelium.name=锫粒
+item.itemPlateBerkelium.name=锫板
+item.itemPlateDoubleBerkelium.name=双重锫板
+item.itemIngotCalifornium.name=锎锭
+item.itemDustCalifornium.name=锎粉
+item.itemDustTinyCalifornium.name=小撮锎粉
+item.itemDustSmallCalifornium.name=小堆锎粉
+item.itemNuggetCalifornium.name=锎粒
+item.itemPlateCalifornium.name=锎板
+item.itemPlateDoubleCalifornium.name=双重锎板
+item.itemDustEinsteinium.name=锿粉
+item.itemDustTinyEinsteinium.name=小撮锿粉
+item.itemDustSmallEinsteinium.name=小堆锿粉
+item.itemNuggetEinsteinium.name=锿粒
+item.itemPlateEinsteinium.name=锿板
+item.itemPlateDoubleEinsteinium.name=双重锿板
+item.itemIngotFermium.name=镄锭
+item.itemDustFermium.name=镄粉
+item.itemDustTinyFermium.name=小撮镄粉
+item.itemDustSmallFermium.name=小堆镄粉
+item.itemNuggetFermium.name=镄粒
+item.itemPlateFermium.name=镄板
+item.itemPlateDoubleFermium.name=双重镄板
+item.itemIngotLithium7.name=锂 7锭
+item.itemDustLithium7.name=锂 7粉
+item.itemDustTinyLithium7.name=小撮锂 7粉
+item.itemDustSmallLithium7.name=小堆锂 7粉
+item.itemNuggetLithium7.name=锂 7粒
+item.itemPlateLithium7.name=锂 7板
+item.itemPlateDoubleLithium7.name=双重锂 7板
+item.itemIngotThorium232.name=钍-232锭
+item.itemDustThorium232.name=钍-232粉
+item.itemDustTinyThorium232.name=小撮钍-232粉
+item.itemDustSmallThorium232.name=小堆钍-232粉
+item.itemNuggetThorium232.name=钍-232粒
+item.itemPlateThorium232.name=钍-232板
+item.itemPlateDoubleThorium232.name=双重钍-232板
+item.itemIngotUranium232.name=铀-232锭
+item.itemDustUranium232.name=铀-232粉
+item.itemDustTinyUranium232.name=小撮铀-232粉
+item.itemDustSmallUranium232.name=小堆铀-232粉
+item.itemNuggetUranium232.name=铀-232粒
+item.itemPlateUranium232.name=铀-232板
+item.itemRodUranium232.name=铀-232杆
+item.itemRodLongUranium232.name=长铀-232杆
+item.itemIngotUranium233.name=铀-233锭
+item.itemDustUranium233.name=铀-233粉
+item.itemDustTinyUranium233.name=小撮铀-233粉
+item.itemDustSmallUranium233.name=小堆铀-233粉
+item.itemNuggetUranium233.name=铀-233粒
+item.itemPlateUranium233.name=铀-233板
+item.itemRodUranium233.name=铀-233杆
+item.itemRodLongUranium233.name=长铀-233杆
+item.itemIngotPlutonium238.name=钚-238锭
+item.itemDustPlutonium238.name=钚-238粉
+item.itemDustTinyPlutonium238.name=小撮钚-238粉
+item.itemDustSmallPlutonium238.name=小堆钚-238粉
+item.itemNuggetPlutonium238.name=钚-238粒
+item.itemPlatePlutonium238.name=钚-238板
+item.itemPlateDoublePlutonium238.name=双重钚-238板
+item.itemIngotStrontium90.name=锶-90锭
+item.itemDustStrontium90.name=锶-90粉
+item.itemDustTinyStrontium90.name=小撮锶-90粉
+item.itemDustSmallStrontium90.name=小堆锶-90粉
+item.itemNuggetStrontium90.name=锶-90粒
+item.itemPlateStrontium90.name=锶-90板
+item.itemPlateDoubleStrontium90.name=双重锶-90板
+item.itemIngotPolonium210.name=钋-210锭
+item.itemDustPolonium210.name=钋-210粉
+item.itemDustTinyPolonium210.name=小撮钋-210粉
+item.itemDustSmallPolonium210.name=小堆钋-210粉
+item.itemNuggetPolonium210.name=钋-210粒
+item.itemPlatePolonium210.name=钋-210板
+item.itemPlateDoublePolonium210.name=双重钋-210板
+item.itemIngotAmericium241.name=镅-241锭
+item.itemDustAmericium241.name=镅-241粉
+item.itemDustTinyAmericium241.name=小撮镅-241粉
+item.itemDustSmallAmericium241.name=小堆镅-241粉
+item.itemNuggetAmericium241.name=镅-241粒
+item.itemPlateAmericium241.name=镅-241板
+item.itemPlateDoubleAmericium241.name=双重镅-241板
+item.itemIngotSiliconCarbide.name=碳化硅锭
+item.itemDustSiliconCarbide.name=碳化硅粉
+item.itemDustTinySiliconCarbide.name=小撮碳化硅粉
+item.itemDustSmallSiliconCarbide.name=小堆碳化硅粉
+item.itemNuggetSiliconCarbide.name=碳化硅粒
+item.itemPlateSiliconCarbide.name=碳化硅板
+item.itemPlateDoubleSiliconCarbide.name=双重碳化硅板
+item.itemBoltSiliconCarbide.name=碳化硅螺栓
+item.itemRodSiliconCarbide.name=碳化硅杆
+item.itemRodLongSiliconCarbide.name=长碳化硅杆
+item.itemRingSiliconCarbide.name=碳化硅环
+item.itemScrewSiliconCarbide.name=碳化硅螺丝
+item.itemRotorSiliconCarbide.name=碳化硅转子
+item.itemGearSiliconCarbide.name=碳化硅齿轮
+item.itemIngotZirconiumCarbide.name=碳化锆锭
+item.itemHotIngotZirconiumCarbide.name=热碳化锆锭
+item.itemDustZirconiumCarbide.name=碳化锆粉
+item.itemDustTinyZirconiumCarbide.name=小撮碳化锆粉
+item.itemDustSmallZirconiumCarbide.name=小堆碳化锆粉
+item.itemNuggetZirconiumCarbide.name=碳化锆粒
+item.itemPlateZirconiumCarbide.name=碳化锆板
+item.itemPlateDoubleZirconiumCarbide.name=双重碳化锆板
+item.itemBoltZirconiumCarbide.name=碳化锆螺栓
+item.itemRodZirconiumCarbide.name=碳化锆杆
+item.itemRodLongZirconiumCarbide.name=长碳化锆杆
+item.itemRingZirconiumCarbide.name=碳化锆环
+item.itemScrewZirconiumCarbide.name=碳化锆螺丝
+item.itemRotorZirconiumCarbide.name=碳化锆转子
+item.itemGearZirconiumCarbide.name=碳化锆齿轮
+item.itemIngotTantalumCarbide.name=碳化钽锭
+item.itemHotIngotTantalumCarbide.name=热碳化钽锭
+item.itemDustTantalumCarbide.name=碳化钽粉
+item.itemDustTinyTantalumCarbide.name=小撮碳化钽粉
+item.itemDustSmallTantalumCarbide.name=小堆碳化钽粉
+item.itemNuggetTantalumCarbide.name=碳化钽粒
+item.itemPlateTantalumCarbide.name=碳化钽板
+item.itemPlateDoubleTantalumCarbide.name=双重碳化钽板
+item.itemBoltTantalumCarbide.name=碳化钽螺栓
+item.itemRodTantalumCarbide.name=碳化钽杆
+item.itemRodLongTantalumCarbide.name=长碳化钽杆
+item.itemRingTantalumCarbide.name=碳化钽环
+item.itemScrewTantalumCarbide.name=碳化钽螺丝
+item.itemRotorTantalumCarbide.name=碳化钽转子
+item.itemGearTantalumCarbide.name=碳化钽齿轮
+item.itemIngotNiobiumCarbide.name=碳化铌锭
+item.itemHotIngotNiobiumCarbide.name=热碳化铌锭
+item.itemDustNiobiumCarbide.name=碳化铌粉
+item.itemDustTinyNiobiumCarbide.name=小撮碳化铌粉
+item.itemDustSmallNiobiumCarbide.name=小堆碳化铌粉
+item.itemNuggetNiobiumCarbide.name=碳化铌粒
+item.itemPlateNiobiumCarbide.name=碳化铌板
+item.itemPlateDoubleNiobiumCarbide.name=双重碳化铌板
+item.itemBoltNiobiumCarbide.name=碳化铌螺栓
+item.itemRodNiobiumCarbide.name=碳化铌杆
+item.itemRodLongNiobiumCarbide.name=长碳化铌杆
+item.itemRingNiobiumCarbide.name=碳化铌环
+item.itemScrewNiobiumCarbide.name=碳化铌螺丝
+item.itemRotorNiobiumCarbide.name=碳化铌转子
+item.itemGearNiobiumCarbide.name=碳化铌齿轮
+item.itemIngotBerylliumFluoride.name=氟化铍锭
+item.itemDustBerylliumFluoride.name=氟化铍粉
+item.itemDustTinyBerylliumFluoride.name=小撮氟化铍粉
+item.itemDustSmallBerylliumFluoride.name=小堆氟化铍粉
+item.itemNuggetBerylliumFluoride.name=氟化铍粒
+item.itemPlateBerylliumFluoride.name=氟化铍板
+item.itemPlateDoubleBerylliumFluoride.name=双重氟化铍板
+item.itemIngotLithiumFluoride.name=氟化锂锭
+item.itemDustLithiumFluoride.name=氟化锂粉
+item.itemDustTinyLithiumFluoride.name=小撮氟化锂粉
+item.itemDustSmallLithiumFluoride.name=小堆氟化锂粉
+item.itemNuggetLithiumFluoride.name=氟化锂粒
+item.itemPlateLithiumFluoride.name=氟化锂板
+item.itemPlateDoubleLithiumFluoride.name=双重氟化锂板
+item.itemIngotThoriumTetrafluoride.name=四氟化钍锭
+item.itemDustThoriumTetrafluoride.name=四氟化钍粉
+item.itemDustTinyThoriumTetrafluoride.name=小撮四氟化钍粉
+item.itemDustSmallThoriumTetrafluoride.name=小堆四氟化钍粉
+item.itemNuggetThoriumTetrafluoride.name=四氟化钍粒
+item.itemPlateThoriumTetrafluoride.name=四氟化钍板
+item.itemPlateDoubleThoriumTetrafluoride.name=双重四氟化钍板
+item.itemIngotThoriumHexafluoride.name=六氟化钍锭
+item.itemDustThoriumHexafluoride.name=六氟化钍粉
+item.itemDustTinyThoriumHexafluoride.name=小撮六氟化钍粉
+item.itemDustSmallThoriumHexafluoride.name=小堆六氟化钍粉
+item.itemNuggetThoriumHexafluoride.name=六氟化钍粒
+item.itemPlateThoriumHexafluoride.name=六氟化钍板
+item.itemPlateDoubleThoriumHexafluoride.name=双重六氟化钍板
+item.itemIngotUraniumTetrafluoride.name=四氟化铀锭
+item.itemDustUraniumTetrafluoride.name=四氟化铀粉
+item.itemDustTinyUraniumTetrafluoride.name=小撮四氟化铀粉
+item.itemDustSmallUraniumTetrafluoride.name=小堆四氟化铀粉
+item.itemNuggetUraniumTetrafluoride.name=四氟化铀粒
+item.itemPlateUraniumTetrafluoride.name=四氟化铀板
+item.itemPlateDoubleUraniumTetrafluoride.name=双重四氟化铀板
+item.itemIngotUraniumHexafluoride.name=六氟化铀锭
+item.itemDustUraniumHexafluoride.name=六氟化铀粉
+item.itemDustTinyUraniumHexafluoride.name=小撮六氟化铀粉
+item.itemDustSmallUraniumHexafluoride.name=小堆六氟化铀粉
+item.itemNuggetUraniumHexafluoride.name=六氟化铀粒
+item.itemPlateUraniumHexafluoride.name=六氟化铀板
+item.itemPlateDoubleUraniumHexafluoride.name=双重六氟化铀板
+item.itemIngotZirconiumTetrafluoride.name=四氟化锆锭
+item.itemDustZirconiumTetrafluoride.name=四氟化锆粉
+item.itemDustTinyZirconiumTetrafluoride.name=小撮四氟化锆粉
+item.itemDustSmallZirconiumTetrafluoride.name=小堆四氟化锆粉
+item.itemNuggetZirconiumTetrafluoride.name=四氟化锆粒
+item.itemPlateZirconiumTetrafluoride.name=四氟化锆板
+item.itemPlateDoubleZirconiumTetrafluoride.name=双重四氟化锆板
+item.itemIngotNeptuniumHexafluoride.name=六氟化镎锭
+item.itemDustNeptuniumHexafluoride.name=六氟化镎粉
+item.itemDustTinyNeptuniumHexafluoride.name=小撮六氟化镎粉
+item.itemDustSmallNeptuniumHexafluoride.name=小堆六氟化镎粉
+item.itemNuggetNeptuniumHexafluoride.name=六氟化镎粒
+item.itemPlateNeptuniumHexafluoride.name=六氟化镎板
+item.itemPlateDoubleNeptuniumHexafluoride.name=双重六氟化镎板
+item.itemIngotTechnetiumHexafluoride.name=六氟化锝锭
+item.itemDustTechnetiumHexafluoride.name=六氟化锝粉
+item.itemDustTinyTechnetiumHexafluoride.name=小撮六氟化锝粉
+item.itemDustSmallTechnetiumHexafluoride.name=小堆六氟化锝粉
+item.itemNuggetTechnetiumHexafluoride.name=六氟化锝粒
+item.itemPlateTechnetiumHexafluoride.name=六氟化锝板
+item.itemPlateDoubleTechnetiumHexafluoride.name=双重六氟化锝板
+item.itemIngotSeleniumHexafluoride.name=六氟化硒锭
+item.itemDustSeleniumHexafluoride.name=六氟化硒粉
+item.itemDustTinySeleniumHexafluoride.name=小撮六氟化硒粉
+item.itemDustSmallSeleniumHexafluoride.name=小堆六氟化硒粉
+item.itemNuggetSeleniumHexafluoride.name=六氟化硒粒
+item.itemPlateSeleniumHexafluoride.name=六氟化硒板
+item.itemPlateDoubleSeleniumHexafluoride.name=双重六氟化硒板
+item.itemIngotLiFBeF2ZrF4U235.name=铀235复合氟化物锭
+item.itemDustLiFBeF2ZrF4U235.name=铀235复合氟化物粉
+item.itemDustTinyLiFBeF2ZrF4U235.name=小撮铀235复合氟化物粉
+item.itemDustSmallLiFBeF2ZrF4U235.name=小堆铀235复合氟化物粉
+item.itemNuggetLiFBeF2ZrF4U235.name=铀235复合氟化物粒
+item.itemPlateLiFBeF2ZrF4U235.name=铀235复合氟化物板
+item.itemPlateDoubleLiFBeF2ZrF4U235.name=双重铀235复合氟化物板
+item.itemIngotLiFBeF2ZrF4UF4.name=铀锆复合氟化物锭
+item.itemDustLiFBeF2ZrF4UF4.name=铀锆复合氟化物粉
+item.itemDustTinyLiFBeF2ZrF4UF4.name=小撮铀锆复合氟化物粉
+item.itemDustSmallLiFBeF2ZrF4UF4.name=小堆铀锆复合氟化物粉
+item.itemNuggetLiFBeF2ZrF4UF4.name=铀锆复合氟化物粒
+item.itemPlateLiFBeF2ZrF4UF4.name=铀锆复合氟化物板
+item.itemPlateDoubleLiFBeF2ZrF4UF4.name=双重铀锆复合氟化物板
+item.itemIngotLiFBeF2ThF4UF4.name=铀钍复合氟化物锭
+item.itemDustLiFBeF2ThF4UF4.name=铀钍复合氟化物粉
+item.itemDustTinyLiFBeF2ThF4UF4.name=小撮铀钍复合氟化物粉
+item.itemDustSmallLiFBeF2ThF4UF4.name=小堆铀钍复合氟化物粉
+item.itemNuggetLiFBeF2ThF4UF4.name=铀钍复合氟化物粒
+item.itemPlateLiFBeF2ThF4UF4.name=铀钍复合氟化物板
+item.itemPlateDoubleLiFBeF2ThF4UF4.name=双重铀钍复合氟化物板
+item.itemIngotEnergyCrystal.name=能量水晶锭
+item.itemHotIngotEnergyCrystal.name=热能量水晶锭
+item.itemDustEnergyCrystal.name=能量水晶粉
+item.itemDustTinyEnergyCrystal.name=小撮能量水晶粉
+item.itemDustSmallEnergyCrystal.name=小堆能量水晶粉
+item.itemNuggetEnergyCrystal.name=能量水晶粒
+item.itemPlateEnergyCrystal.name=能量水晶板
+item.itemPlateDoubleEnergyCrystal.name=双重能量水晶板
+item.itemBoltEnergyCrystal.name=能量水晶螺栓
+item.itemRodEnergyCrystal.name=能量水晶杆
+item.itemRodLongEnergyCrystal.name=长能量水晶杆
+item.itemRingEnergyCrystal.name=能量水晶环
+item.itemScrewEnergyCrystal.name=能量水晶螺丝
+item.itemRotorEnergyCrystal.name=能量水晶转子
+item.itemGearEnergyCrystal.name=能量水晶齿轮
+item.itemIngotBloodSteel.name=血钢锭
+item.itemDustBloodSteel.name=血钢粉
+item.itemDustTinyBloodSteel.name=小撮血钢粉
+item.itemDustSmallBloodSteel.name=小堆血钢粉
+item.itemNuggetBloodSteel.name=血钢粒
+item.itemPlateBloodSteel.name=血钢板
+item.itemPlateDoubleBloodSteel.name=双重血钢板
+item.itemBoltBloodSteel.name=血钢螺栓
+item.itemRodBloodSteel.name=血钢杆
+item.itemRodLongBloodSteel.name=长血钢杆
+item.itemRingBloodSteel.name=血钢环
+item.itemScrewBloodSteel.name=血钢螺丝
+item.itemRotorBloodSteel.name=血钢转子
+item.itemGearBloodSteel.name=血钢齿轮
+item.itemIngotZeron100.name=塞龙-100锭
+item.itemHotIngotZeron100.name=热塞龙-100锭
+item.itemDustZeron100.name=塞龙-100粉
+item.itemDustTinyZeron100.name=小撮塞龙-100粉
+item.itemDustSmallZeron100.name=小堆塞龙-100粉
+item.itemNuggetZeron100.name=塞龙-100粒
+item.itemPlateZeron100.name=塞龙-100板
+item.itemPlateDoubleZeron100.name=双重塞龙-100板
+item.itemBoltZeron100.name=塞龙-100螺栓
+item.itemRodZeron100.name=塞龙-100杆
+item.itemRodLongZeron100.name=长塞龙100杆
+item.itemRingZeron100.name=塞龙-100环
+item.itemScrewZeron100.name=塞龙-100螺丝
+item.itemRotorZeron100.name=塞龙-100转子
+item.itemGearZeron100.name=塞龙-100齿轮
+item.itemIngotTumbaga.name=铜金合金锭
+item.itemDustTumbaga.name=铜金合金粉
+item.itemDustTinyTumbaga.name=小撮铜金合金粉
+item.itemDustSmallTumbaga.name=小堆铜金合金粉
+item.itemNuggetTumbaga.name=铜金合金粒
+item.itemPlateTumbaga.name=铜金合金板
+item.itemPlateDoubleTumbaga.name=双重铜金合金板
+item.itemBoltTumbaga.name=铜金合金螺栓
+item.itemRodTumbaga.name=铜金合金杆
+item.itemRodLongTumbaga.name=长铜金合金杆
+item.itemRingTumbaga.name=铜金合金环
+item.itemScrewTumbaga.name=铜金合金螺丝
+item.itemRotorTumbaga.name=铜金合金转子
+item.itemGearTumbaga.name=铜金合金齿轮
+item.itemIngotPotin.name=粗青铜合金锭
+item.itemDustPotin.name=粗青铜合金粉
+item.itemDustTinyPotin.name=小撮粗青铜合金粉
+item.itemDustSmallPotin.name=小堆粗青铜合金粉
+item.itemNuggetPotin.name=粗青铜合金粒
+item.itemPlatePotin.name=粗青铜合金板
+item.itemPlateDoublePotin.name=双重粗青铜合金板
+item.itemBoltPotin.name=粗青铜合金螺栓
+item.itemRodPotin.name=粗青铜合金杆
+item.itemRodLongPotin.name=长粗青铜合金杆
+item.itemRingPotin.name=粗青铜合金环
+item.itemScrewPotin.name=粗青铜合金螺丝
+item.itemRotorPotin.name=粗青铜合金转子
+item.itemGearPotin.name=粗青铜合金齿轮
+item.itemIngotStaballoy.name=贫铀合金锭
+item.itemHotIngotStaballoy.name=热贫铀合金锭
+item.itemDustStaballoy.name=贫铀合金粉
+item.itemDustTinyStaballoy.name=小撮贫铀合金粉
+item.itemDustSmallStaballoy.name=小堆贫铀合金粉
+item.itemNuggetStaballoy.name=贫铀合金粒
+item.itemPlateStaballoy.name=贫铀合金板
+item.itemPlateDoubleStaballoy.name=双重贫铀合金板
+item.itemBoltStaballoy.name=贫铀合金螺栓
+item.itemRodStaballoy.name=贫铀合金杆
+item.itemRodLongStaballoy.name=长贫铀合金杆
+item.itemRingStaballoy.name=贫铀合金环
+item.itemScrewStaballoy.name=贫铀合金螺丝
+item.itemRotorStaballoy.name=贫铀合金转子
+item.itemGearStaballoy.name=贫铀合金齿轮
+item.itemIngotTantalloy60.name=钽钨合金-60锭
+item.itemHotIngotTantalloy60.name=热钽钨合金-60锭
+item.itemDustTantalloy60.name=钽钨合金-60粉
+item.itemDustTinyTantalloy60.name=小撮钽钨合金-60粉
+item.itemDustSmallTantalloy60.name=小堆钽钨合金-60粉
+item.itemNuggetTantalloy60.name=钽钨合金-60粒
+item.itemPlateTantalloy60.name=钽钨合金-60板
+item.itemPlateDoubleTantalloy60.name=双重钽钨合金-60板
+item.itemBoltTantalloy60.name=钽钨合金-60螺栓
+item.itemRodTantalloy60.name=钽钨合金-60杆
+item.itemRodLongTantalloy60.name=长钽钨合金-60杆
+item.itemRingTantalloy60.name=钽钨合金-60环
+item.itemScrewTantalloy60.name=钽钨合金-60螺丝
+item.itemRotorTantalloy60.name=钽钨合金-60转子
+item.itemGearTantalloy60.name=钽钨合金-60齿轮
+item.itemIngotTantalloy61.name=钽钨合金-61锭
+item.itemHotIngotTantalloy61.name=热钽钨合金-61锭
+item.itemDustTantalloy61.name=钽钨合金-61粉
+item.itemDustTinyTantalloy61.name=小撮钽钨合金-61粉
+item.itemDustSmallTantalloy61.name=小堆钽钨合金-61粉
+item.itemNuggetTantalloy61.name=钽钨合金-61粒
+item.itemPlateTantalloy61.name=钽钨合金-61板
+item.itemPlateDoubleTantalloy61.name=双重钽钨合金-61板
+item.itemBoltTantalloy61.name=钽钨合金-61螺栓
+item.itemRodTantalloy61.name=钽钨合金-61杆
+item.itemRodLongTantalloy61.name=长钽钨合金-61杆
+item.itemRingTantalloy61.name=钽钨合金-61环
+item.itemScrewTantalloy61.name=钽钨合金-61螺丝
+item.itemRotorTantalloy61.name=钽钨合金-61转子
+item.itemGearTantalloy61.name=钽钨合金-61齿轮
+item.itemIngotInconel625.name=镍铬基合金-625锭
+item.itemHotIngotInconel625.name=热镍铬基合金-625锭
+item.itemDustInconel625.name=镍铬基合金-625粉
+item.itemDustTinyInconel625.name=小撮镍铬基合金-625粉
+item.itemDustSmallInconel625.name=小堆镍铬基合金-625粉
+item.itemNuggetInconel625.name=镍铬基合金-625粒
+item.itemPlateInconel625.name=镍铬基合金-625板
+item.itemPlateDoubleInconel625.name=双重镍铬基合金-625板
+item.itemBoltInconel625.name=镍铬基合金-625螺栓
+item.itemRodInconel625.name=镍铬基合金-625杆
+item.itemRodLongInconel625.name=长镍铬基合金-625杆
+item.itemRingInconel625.name=镍铬基合金-625环
+item.itemScrewInconel625.name=镍铬基合金-625螺丝
+item.itemRotorInconel625.name=镍铬基合金-625转子
+item.itemGearInconel625.name=镍铬基合金-625齿轮
+item.itemIngotInconel690.name=镍铬基合金-690锭
+item.itemHotIngotInconel690.name=热镍铬基合金-690锭
+item.itemDustInconel690.name=镍铬基合金-690粉
+item.itemDustTinyInconel690.name=小撮镍铬基合金-690粉
+item.itemDustSmallInconel690.name=小堆镍铬基合金-690粉
+item.itemNuggetInconel690.name=镍铬基合金-690粒
+item.itemPlateInconel690.name=镍铬基合金-690板
+item.itemPlateDoubleInconel690.name=双重镍铬基合金-690板
+item.itemBoltInconel690.name=镍铬基合金-690螺栓
+item.itemRodInconel690.name=镍铬基合金-690杆
+item.itemRodLongInconel690.name=长镍铬基合金-690杆
+item.itemRingInconel690.name=镍铬基合金-690环
+item.itemScrewInconel690.name=镍铬基合金-690螺丝
+item.itemRotorInconel690.name=镍铬基合金-690转子
+item.itemGearInconel690.name=镍铬基合金-690齿轮
+item.itemIngotInconel792.name=镍铬基合金-792锭
+item.itemHotIngotInconel792.name=热镍铬基合金-792锭
+item.itemDustInconel792.name=镍铬基合金-792粉
+item.itemDustTinyInconel792.name=小撮镍铬基合金-792粉
+item.itemDustSmallInconel792.name=小堆镍铬基合金-792粉
+item.itemNuggetInconel792.name=镍铬基合金-792粒
+item.itemPlateInconel792.name=镍铬基合金-792板
+item.itemPlateDoubleInconel792.name=双重镍铬基合金-792板
+item.itemBoltInconel792.name=镍铬基合金-792螺栓
+item.itemRodInconel792.name=镍铬基合金-792杆
+item.itemRodLongInconel792.name=长镍铬基合金-792杆
+item.itemRingInconel792.name=镍铬基合金-792环
+item.itemScrewInconel792.name=镍铬基合金-792螺丝
+item.itemRotorInconel792.name=镍铬基合金-792转子
+item.itemGearInconel792.name=镍铬基合金-792齿轮
+item.itemDustEglinSteelBaseCompound.name=埃格林钢基础化合物粉
+item.itemDustTinyEglinSteelBaseCompound.name=小撮埃格林钢基础化合物粉
+item.itemDustSmallEglinSteelBaseCompound.name=小堆埃格林钢基础化合物粉
+item.itemIngotEglinSteel.name=埃格林钢锭
+item.itemDustEglinSteel.name=埃格林钢粉
+item.itemDustTinyEglinSteel.name=小撮埃格林钢粉
+item.itemDustSmallEglinSteel.name=小堆埃格林钢粉
+item.itemNuggetEglinSteel.name=埃格林钢粒
+item.itemPlateEglinSteel.name=埃格林钢板
+item.itemPlateDoubleEglinSteel.name=双重埃格林钢板
+item.itemBoltEglinSteel.name=埃格林钢螺栓
+item.itemRodEglinSteel.name=埃格林钢杆
+item.itemRodLongEglinSteel.name=长埃格林钢杆
+item.itemRingEglinSteel.name=埃格林钢环
+item.itemScrewEglinSteel.name=埃格林钢螺丝
+item.itemRotorEglinSteel.name=埃格林钢转子
+item.itemGearEglinSteel.name=埃格林钢齿轮
+item.itemIngotMaragingSteel250.name=马氏体时效钢250锭
+item.itemHotIngotMaragingSteel250.name=热马氏体时效钢250锭
+item.itemDustMaragingSteel250.name=马氏体时效钢250粉
+item.itemDustTinyMaragingSteel250.name=小撮马氏体时效钢250粉
+item.itemDustSmallMaragingSteel250.name=小堆马氏体时效钢250粉
+item.itemNuggetMaragingSteel250.name=马氏体时效钢250粒
+item.itemPlateMaragingSteel250.name=马氏体时效钢250板
+item.itemPlateDoubleMaragingSteel250.name=双重马氏体时效钢250板
+item.itemBoltMaragingSteel250.name=马氏体时效钢250螺栓
+item.itemRodMaragingSteel250.name=马氏体时效钢250杆
+item.itemRodLongMaragingSteel250.name=长马氏体时效钢250杆
+item.itemRingMaragingSteel250.name=马氏体时效钢250环
+item.itemScrewMaragingSteel250.name=马氏体时效钢250螺丝
+item.itemRotorMaragingSteel250.name=马氏体时效钢250转子
+item.itemGearMaragingSteel250.name=马氏体时效钢250齿轮
+item.itemIngotMaragingSteel300.name=马氏体时效钢300锭
+item.itemHotIngotMaragingSteel300.name=热马氏体时效钢300锭
+item.itemDustMaragingSteel300.name=马氏体时效钢300粉
+item.itemDustTinyMaragingSteel300.name=小撮马氏体时效钢300粉
+item.itemDustSmallMaragingSteel300.name=小堆马氏体时效钢300粉
+item.itemNuggetMaragingSteel300.name=马氏体时效钢300粒
+item.itemPlateMaragingSteel300.name=马氏体时效钢300板
+item.itemPlateDoubleMaragingSteel300.name=双重马氏体时效钢300板
+item.itemBoltMaragingSteel300.name=马氏体时效钢300螺栓
+item.itemRodMaragingSteel300.name=马氏体时效钢300杆
+item.itemRodLongMaragingSteel300.name=长马氏体时效钢300杆
+item.itemRingMaragingSteel300.name=马氏体时效钢300环
+item.itemScrewMaragingSteel300.name=马氏体时效钢300螺丝
+item.itemRotorMaragingSteel300.name=马氏体时效钢300转子
+item.itemGearMaragingSteel300.name=马氏体时效钢300齿轮
+item.itemIngotMaragingSteel350.name=马氏体时效钢350锭
+item.itemHotIngotMaragingSteel350.name=热马氏体时效钢350锭
+item.itemDustMaragingSteel350.name=马氏体时效钢350粉
+item.itemDustTinyMaragingSteel350.name=小撮马氏体时效钢350粉
+item.itemDustSmallMaragingSteel350.name=小堆马氏体时效钢350粉
+item.itemNuggetMaragingSteel350.name=马氏体时效钢350粒
+item.itemPlateMaragingSteel350.name=马氏体时效钢350板
+item.itemPlateDoubleMaragingSteel350.name=双重马氏体时效钢350板
+item.itemBoltMaragingSteel350.name=马氏体时效钢350螺栓
+item.itemRodMaragingSteel350.name=马氏体时效钢350杆
+item.itemRodLongMaragingSteel350.name=长马氏体时效钢350杆
+item.itemRingMaragingSteel350.name=马氏体时效钢350环
+item.itemScrewMaragingSteel350.name=马氏体时效钢350螺丝
+item.itemRotorMaragingSteel350.name=马氏体时效钢350转子
+item.itemGearMaragingSteel350.name=马氏体时效钢350齿轮
+item.itemIngotStellite.name=铬钴锰钛合金锭
+item.itemHotIngotStellite.name=热铬钴锰钛合金锭
+item.itemDustStellite.name=铬钴锰钛合金粉
+item.itemDustTinyStellite.name=小撮铬钴锰钛合金粉
+item.itemDustSmallStellite.name=小堆铬钴锰钛合金粉
+item.itemNuggetStellite.name=铬钴锰钛合金粒
+item.itemPlateStellite.name=铬钴锰钛合金板
+item.itemPlateDoubleStellite.name=双重铬钴锰钛合金板
+item.itemBoltStellite.name=铬钴锰钛合金螺栓
+item.itemRodStellite.name=铬钴锰钛合金杆
+item.itemRodLongStellite.name=长铬钴锰钛合金杆
+item.itemRingStellite.name=铬钴锰钛合金环
+item.itemScrewStellite.name=铬钴锰钛合金螺丝
+item.itemRotorStellite.name=铬钴锰钛合金转子
+item.itemGearStellite.name=铬钴锰钛合金齿轮
+item.itemIngotTalonite.name=铬钴磷酸盐合金锭
+item.itemDustTalonite.name=铬钴磷酸盐合金粉
+item.itemDustTinyTalonite.name=小撮铬钴磷酸盐合金粉
+item.itemDustSmallTalonite.name=小堆铬钴磷酸盐合金粉
+item.itemNuggetTalonite.name=铬钴磷酸盐合金粒
+item.itemPlateTalonite.name=铬钴磷酸盐合金板
+item.itemPlateDoubleTalonite.name=双重铬钴磷酸盐合金板
+item.itemBoltTalonite.name=铬钴磷酸盐合金螺栓
+item.itemRodTalonite.name=铬钴磷酸盐合金杆
+item.itemRodLongTalonite.name=长铬钴磷酸盐合金杆
+item.itemRingTalonite.name=铬钴磷酸盐合金环
+item.itemScrewTalonite.name=铬钴磷酸盐合金螺丝
+item.itemRotorTalonite.name=铬钴磷酸盐合金转子
+item.itemGearTalonite.name=铬钴磷酸盐合金齿轮
+item.itemIngotHastelloyW.name=哈斯特洛依合金-W锭
+item.itemDustHastelloyW.name=哈斯特洛依合金-W粉
+item.itemDustTinyHastelloyW.name=小撮哈斯特洛依合金-W粉
+item.itemDustSmallHastelloyW.name=小堆哈斯特洛依合金-W粉
+item.itemNuggetHastelloyW.name=哈斯特洛依合金-W粒
+item.itemPlateHastelloyW.name=哈斯特洛依合金-W板
+item.itemPlateDoubleHastelloyW.name=双重哈斯特洛依合金-W板
+item.itemBoltHastelloyW.name=哈斯特洛依合金-W螺栓
+item.itemRodHastelloyW.name=哈斯特洛依合金-W杆
+item.itemRodLongHastelloyW.name=长哈斯特洛依合金-W杆
+item.itemRingHastelloyW.name=哈斯特洛依合金-W环
+item.itemScrewHastelloyW.name=哈斯特洛依合金-W螺丝
+item.itemRotorHastelloyW.name=哈斯特洛依合金-W转子
+item.itemGearHastelloyW.name=哈斯特洛依合金-W齿轮
+item.itemIngotHastelloyX.name=哈斯特洛依合金-X锭
+item.itemDustHastelloyX.name=哈斯特洛依合金-X粉
+item.itemDustTinyHastelloyX.name=小撮哈斯特洛依合金-X粉
+item.itemDustSmallHastelloyX.name=小堆哈斯特洛依合金-X粉
+item.itemNuggetHastelloyX.name=哈斯特洛依合金-X粒
+item.itemPlateHastelloyX.name=哈斯特洛依合金-X板
+item.itemPlateDoubleHastelloyX.name=双重哈斯特洛依合金-X板
+item.itemBoltHastelloyX.name=哈斯特洛依合金-X螺栓
+item.itemRodHastelloyX.name=哈斯特洛依合金-X杆
+item.itemRodLongHastelloyX.name=长哈斯特洛依合金-X杆
+item.itemRingHastelloyX.name=哈斯特洛依合金-X环
+item.itemScrewHastelloyX.name=哈斯特洛依合金-X螺丝
+item.itemRotorHastelloyX.name=哈斯特洛依合金-X转子
+item.itemGearHastelloyX.name=哈斯特洛依合金-X齿轮
+item.itemIngotHastelloyC276.name=哈斯特洛依合金-C276锭
+item.itemHotIngotHastelloyC276.name=热哈斯特洛依合金-C276锭
+item.itemDustHastelloyC276.name=哈斯特洛依合金-C276粉
+item.itemDustTinyHastelloyC276.name=小撮哈斯特洛依合金-C276粉
+item.itemDustSmallHastelloyC276.name=小堆哈斯特洛依合金-C276粉
+item.itemNuggetHastelloyC276.name=哈斯特洛依合金-C276粒
+item.itemPlateHastelloyC276.name=哈斯特洛依合金-C276板
+item.itemPlateDoubleHastelloyC276.name=双重哈斯特洛依合金-C276板
+item.itemBoltHastelloyC276.name=哈斯特洛依合金-C276螺栓
+item.itemRodHastelloyC276.name=哈斯特洛依合金-C276杆
+item.itemRodLongHastelloyC276.name=长哈斯特洛依合金-C276杆
+item.itemRingHastelloyC276.name=哈斯特洛依合金-C276环
+item.itemScrewHastelloyC276.name=哈斯特洛依合金-C276螺丝
+item.itemRotorHastelloyC276.name=哈斯特洛依合金-C276转子
+item.itemGearHastelloyC276.name=哈斯特洛依合金-C276齿轮
+item.itemIngotHastelloyN.name=哈斯特洛依合金-N锭
+item.itemHotIngotHastelloyN.name=热哈斯特洛依合金-N锭
+item.itemDustHastelloyN.name=哈斯特洛依合金-N粉
+item.itemDustTinyHastelloyN.name=小撮哈斯特洛依合金-N粉
+item.itemDustSmallHastelloyN.name=小堆哈斯特洛依合金-N粉
+item.itemNuggetHastelloyN.name=哈斯特洛依合金-N粒
+item.itemPlateHastelloyN.name=哈斯特洛依合金-N板
+item.itemPlateDoubleHastelloyN.name=双重哈斯特洛依合金-N板
+item.itemBoltHastelloyN.name=哈斯特洛依合金-N螺栓
+item.itemRodHastelloyN.name=哈斯特洛依合金-N杆
+item.itemRodLongHastelloyN.name=长哈斯特洛依合金-N杆
+item.itemRingHastelloyN.name=哈斯特洛依合金-N环
+item.itemScrewHastelloyN.name=哈斯特洛依合金-N螺丝
+item.itemRotorHastelloyN.name=哈斯特洛依合金-N转子
+item.itemGearHastelloyN.name=哈斯特洛依合金-N齿轮
+item.itemIngotIncoloy020.name=耐热铬铁合金-020锭
+item.itemDustIncoloy020.name=耐热铬铁合金-020粉
+item.itemDustTinyIncoloy020.name=小撮耐热铬铁合金-020粉
+item.itemDustSmallIncoloy020.name=小堆耐热铬铁合金-020粉
+item.itemNuggetIncoloy020.name=耐热铬铁合金-020粒
+item.itemPlateIncoloy020.name=耐热铬铁合金-020板
+item.itemPlateDoubleIncoloy020.name=双重耐热铬铁合金-020板
+item.itemBoltIncoloy020.name=耐热铬铁合金-020螺栓
+item.itemRodIncoloy020.name=耐热铬铁合金-020杆
+item.itemRodLongIncoloy020.name=长耐热铬铁合金-020杆
+item.itemRingIncoloy020.name=耐热铬铁合金-020环
+item.itemScrewIncoloy020.name=耐热铬铁合金-020螺丝
+item.itemRotorIncoloy020.name=耐热铬铁合金-020转子
+item.itemGearIncoloy020.name=耐热铬铁合金-020齿轮
+item.itemIngotIncoloyDS.name=耐热铬铁合金-DS锭
+item.itemDustIncoloyDS.name=耐热铬铁合金-DS粉
+item.itemDustTinyIncoloyDS.name=小撮耐热铬铁合金-DS粉
+item.itemDustSmallIncoloyDS.name=小堆耐热铬铁合金-DS粉
+item.itemNuggetIncoloyDS.name=耐热铬铁合金-DS粒
+item.itemPlateIncoloyDS.name=耐热铬铁合金-DS板
+item.itemPlateDoubleIncoloyDS.name=双重耐热铬铁合金-DS板
+item.itemBoltIncoloyDS.name=耐热铬铁合金-DS螺栓
+item.itemRodIncoloyDS.name=耐热铬铁合金-DS杆
+item.itemRodLongIncoloyDS.name=长耐热铬铁合金-DS杆
+item.itemRingIncoloyDS.name=耐热铬铁合金-DS环
+item.itemScrewIncoloyDS.name=耐热铬铁合金-DS螺丝
+item.itemRotorIncoloyDS.name=耐热铬铁合金-DS转子
+item.itemGearIncoloyDS.name=耐热铬铁合金-DS齿轮
+item.itemIngotIncoloyMA956.name=耐热铬铁合金-MA956锭
+item.itemHotIngotIncoloyMA956.name=热耐热铬铁合金-MA956锭
+item.itemDustIncoloyMA956.name=耐热铬铁合金-MA956粉
+item.itemDustTinyIncoloyMA956.name=小撮耐热铬铁合金-MA956粉
+item.itemDustSmallIncoloyMA956.name=小堆耐热铬铁合金-MA956粉
+item.itemNuggetIncoloyMA956.name=耐热铬铁合金-MA956粒
+item.itemPlateIncoloyMA956.name=耐热铬铁合金-MA956板
+item.itemPlateDoubleIncoloyMA956.name=双重耐热铬铁合金-MA956板
+item.itemBoltIncoloyMA956.name=耐热铬铁合金-MA956螺栓
+item.itemRodIncoloyMA956.name=耐热铬铁合金-MA956杆
+item.itemRodLongIncoloyMA956.name=长耐热铬铁合金-MA956杆
+item.itemRingIncoloyMA956.name=耐热铬铁合金-MA956环
+item.itemScrewIncoloyMA956.name=耐热铬铁合金-MA956螺丝
+item.itemRotorIncoloyMA956.name=耐热铬铁合金-MA956转子
+item.itemGearIncoloyMA956.name=耐热铬铁合金-MA956齿轮
+item.itemIngotGrisium.name=灰钛合金锭
+item.itemHotIngotGrisium.name=热灰钛合金锭
+item.itemDustGrisium.name=灰钛合金粉
+item.itemDustTinyGrisium.name=小撮灰钛合金粉
+item.itemDustSmallGrisium.name=小堆灰钛合金粉
+item.itemNuggetGrisium.name=灰钛合金粒
+item.itemPlateGrisium.name=灰钛合金板
+item.itemPlateDoubleGrisium.name=双重灰钛合金板
+item.itemBoltGrisium.name=灰钛合金螺栓
+item.itemRodGrisium.name=灰钛合金杆
+item.itemRodLongGrisium.name=长灰钛合金杆
+item.itemRingGrisium.name=灰钛合金环
+item.itemScrewGrisium.name=灰钛合金螺丝
+item.itemRotorGrisium.name=灰钛合金转子
+item.itemGearGrisium.name=灰钛合金齿轮
+item.itemIngotHG1223.name=HG-1223锭
+item.itemDustHG1223.name=HG-1223粉
+item.itemDustTinyHG1223.name=小撮HG-1223粉
+item.itemDustSmallHG1223.name=小堆HG-1223粉
+item.itemNuggetHG1223.name=HG-1223粒
+item.itemPlateHG1223.name=HG-1223板
+item.itemPlateDoubleHG1223.name=双重HG-1223板
+item.itemIngotTrinium.name=三元金属锭
+item.itemDustTrinium.name=三元金属粉
+item.itemDustTinyTrinium.name=小撮三元金属粉
+item.itemDustSmallTrinium.name=小堆三元金属粉
+item.itemNuggetTrinium.name=三元金属粒
+item.itemPlateTrinium.name=三元金属板
+item.itemPlateDoubleTrinium.name=双重三元金属板
+item.itemIngotRefinedTrinium.name=精制三元金属锭
+item.itemDustRefinedTrinium.name=精制三元金属粉
+item.itemDustTinyRefinedTrinium.name=小撮精制三元金属粉
+item.itemDustSmallRefinedTrinium.name=小堆精制三元金属粉
+item.itemNuggetRefinedTrinium.name=精制三元金属粒
+item.itemPlateRefinedTrinium.name=精制三元金属板
+item.itemPlateDoubleRefinedTrinium.name=双重精制三元金属板
+item.itemIngotTriniumTitaniumAlloy.name=三元钛合金锭
+item.itemHotIngotTriniumTitaniumAlloy.name=热三元钛合金锭
+item.itemDustTriniumTitaniumAlloy.name=三元钛合金粉
+item.itemDustTinyTriniumTitaniumAlloy.name=小撮三元钛合金粉
+item.itemDustSmallTriniumTitaniumAlloy.name=小堆三元钛合金粉
+item.itemNuggetTriniumTitaniumAlloy.name=三元钛合金粒
+item.itemPlateTriniumTitaniumAlloy.name=三元钛合金板
+item.itemPlateDoubleTriniumTitaniumAlloy.name=双重三元钛合金板
+item.itemBoltTriniumTitaniumAlloy.name=三元钛合金螺栓
+item.itemRodTriniumTitaniumAlloy.name=三元钛合金杆
+item.itemRodLongTriniumTitaniumAlloy.name=长三元钛合金杆
+item.itemRingTriniumTitaniumAlloy.name=三元钛合金环
+item.itemScrewTriniumTitaniumAlloy.name=三元钛合金螺丝
+item.itemRotorTriniumTitaniumAlloy.name=三元钛合金转子
+item.itemGearTriniumTitaniumAlloy.name=三元钛合金齿轮
+item.itemIngotTriniumNaquadahAlloy.name=三元硅岩合金锭
+item.itemDustTriniumNaquadahAlloy.name=三元硅岩合金粉
+item.itemDustTinyTriniumNaquadahAlloy.name=小撮三元硅岩合金粉
+item.itemDustSmallTriniumNaquadahAlloy.name=小堆三元硅岩合金粉
+item.itemNuggetTriniumNaquadahAlloy.name=三元硅岩合金粒
+item.itemPlateTriniumNaquadahAlloy.name=三元硅岩合金板
+item.itemPlateDoubleTriniumNaquadahAlloy.name=双重三元硅岩合金板
+item.itemIngotTriniumNaquadahCarbonite.name=碳化三元硅岩合金锭
+item.itemHotIngotTriniumNaquadahCarbonite.name=热碳化三元硅岩合金锭
+item.itemDustTriniumNaquadahCarbonite.name=碳化三元硅岩合金粉
+item.itemDustTinyTriniumNaquadahCarbonite.name=小撮碳化三元硅岩合金粉
+item.itemDustSmallTriniumNaquadahCarbonite.name=小堆碳化三元硅岩合金粉
+item.itemNuggetTriniumNaquadahCarbonite.name=碳化三元硅岩合金粒
+item.itemPlateTriniumNaquadahCarbonite.name=碳化三元硅岩合金板
+item.itemPlateDoubleTriniumNaquadahCarbonite.name=双重碳化三元硅岩合金板
+item.itemBoltTriniumNaquadahCarbonite.name=碳化三元硅岩合金螺栓
+item.itemRodTriniumNaquadahCarbonite.name=碳化三元硅岩合金杆
+item.itemRodLongTriniumNaquadahCarbonite.name=长碳化三元硅岩合金杆
+item.itemRingTriniumNaquadahCarbonite.name=碳化三元硅岩合金环
+item.itemScrewTriniumNaquadahCarbonite.name=碳化三元硅岩合金螺丝
+item.itemRotorTriniumNaquadahCarbonite.name=碳化三元硅岩合金转子
+item.itemGearTriniumNaquadahCarbonite.name=碳化三元硅岩合金齿轮
+item.itemIngotQuantum.name=量子合金锭
+item.itemHotIngotQuantum.name=热量子合金锭
+item.itemDustQuantum.name=量子合金粉
+item.itemDustTinyQuantum.name=小撮量子合金粉
+item.itemDustSmallQuantum.name=小堆量子合金粉
+item.itemNuggetQuantum.name=量子合金粒
+item.itemPlateQuantum.name=量子合金板
+item.itemPlateDoubleQuantum.name=双重量子合金板
+item.itemBoltQuantum.name=量子合金螺栓
+item.itemRodQuantum.name=量子合金杆
+item.itemRodLongQuantum.name=长量子合金杆
+item.itemRingQuantum.name=量子合金环
+item.itemScrewQuantum.name=量子合金螺丝
+item.itemRotorQuantum.name=量子合金转子
+item.itemGearQuantum.name=量子合金齿轮
+item.itemDustFluoriteF.name=氟石(F)粉
+item.itemDustTinyFluoriteF.name=小撮氟石(F)粉
+item.itemDustSmallFluoriteF.name=小堆氟石(F)粉
+item.crushedFluoriteF.name=粉碎的氟石(F)矿石
+item.crushedCentrifugedFluoriteF.name=离心氟石(F)矿石
+item.crushedPurifiedFluoriteF.name=洗净的氟石(F)矿石
+item.dustImpureFluoriteF.name=含杂氟石(F)粉
+item.dustPureFluoriteF.name=洁净氟石(F)粉
+item.itemDustCrocoite.name=赤铅矿粉
+item.itemDustTinyCrocoite.name=小撮赤铅矿粉
+item.itemDustSmallCrocoite.name=小堆赤铅矿粉
+item.crushedCrocoite.name=粉碎的赤铅矿矿石
+item.crushedCentrifugedCrocoite.name=离心赤铅矿矿石
+item.crushedPurifiedCrocoite.name=洗净的赤铅矿矿石
+item.dustImpureCrocoite.name=含杂赤铅矿粉
+item.dustPureCrocoite.name=洁净赤铅矿粉
+item.itemDustGeikielite.name=镁钛矿粉
+item.itemDustTinyGeikielite.name=小撮镁钛矿粉
+item.itemDustSmallGeikielite.name=小堆镁钛矿粉
+item.crushedGeikielite.name=粉碎的镁钛矿矿石
+item.crushedCentrifugedGeikielite.name=离心镁钛矿矿石
+item.crushedPurifiedGeikielite.name=洗净的镁钛矿矿石
+item.dustImpureGeikielite.name=含杂镁钛矿粉
+item.dustPureGeikielite.name=洁净镁钛矿粉
+item.itemDustNichromite.name=镍铬矿粉
+item.itemDustTinyNichromite.name=小撮镍铬矿粉
+item.itemDustSmallNichromite.name=小堆镍铬矿粉
+item.crushedNichromite.name=粉碎的镍铬矿矿石
+item.crushedCentrifugedNichromite.name=离心镍铬矿矿石
+item.crushedPurifiedNichromite.name=洗净的镍铬矿矿石
+item.dustImpureNichromite.name=含杂镍铬矿粉
+item.dustPureNichromite.name=洁净镍铬矿粉
+item.itemDustTitanite.name=榍石粉
+item.itemDustTinyTitanite.name=小撮榍石粉
+item.itemDustSmallTitanite.name=小堆榍石粉
+item.crushedTitanite.name=粉碎的榍石矿石
+item.crushedCentrifugedTitanite.name=离心榍石矿石
+item.crushedPurifiedTitanite.name=洗净的榍石矿石
+item.dustImpureTitanite.name=含杂榍石粉
+item.dustPureTitanite.name=洁净榍石粉
+item.itemDustZimbabweite.name=钛铌铅钠石粉
+item.itemDustTinyZimbabweite.name=小撮钛铌铅钠石粉
+item.itemDustSmallZimbabweite.name=小堆钛铌铅钠石粉
+item.crushedZimbabweite.name=粉碎的钛铌铅钠石矿石
+item.crushedCentrifugedZimbabweite.name=离心钛铌铅钠石矿石
+item.crushedPurifiedZimbabweite.name=洗净的钛铌铅钠石矿石
+item.dustImpureZimbabweite.name=含杂钛铌铅钠石粉
+item.dustPureZimbabweite.name=洁净钛铌铅钠石粉
+item.itemDustZirconolite.name=钛锆钍矿粉
+item.itemDustTinyZirconolite.name=小撮钛锆钍矿粉
+item.itemDustSmallZirconolite.name=小堆钛锆钍矿粉
+item.crushedZirconolite.name=粉碎的钛锆钍矿矿石
+item.crushedCentrifugedZirconolite.name=离心钛锆钍矿矿石
+item.crushedPurifiedZirconolite.name=洗净的钛锆钍矿矿石
+item.dustImpureZirconolite.name=含杂钛锆钍矿粉
+item.dustPureZirconolite.name=洁净钛锆钍矿粉
+item.itemDustGadoliniteCe.name=硅铍钇矿(Ce)粉
+item.itemDustTinyGadoliniteCe.name=小撮硅铍钇矿(Ce)粉
+item.itemDustSmallGadoliniteCe.name=小堆硅铍钇矿(Ce)粉
+item.crushedGadoliniteCe.name=粉碎的硅铍钇矿(Ce)矿石
+item.crushedCentrifugedGadoliniteCe.name=离心硅铍钇矿(Ce)矿石
+item.crushedPurifiedGadoliniteCe.name=洗净的硅铍钇矿(Ce)矿石
+item.dustImpureGadoliniteCe.name=含杂硅铍钇矿(Ce)粉
+item.dustPureGadoliniteCe.name=洁净硅铍钇矿(Ce)粉
+item.itemDustGadoliniteY.name=硅铍钇矿(Y)粉
+item.itemDustTinyGadoliniteY.name=小撮硅铍钇矿(Y)粉
+item.itemDustSmallGadoliniteY.name=小堆硅铍钇矿(Y)粉
+item.crushedGadoliniteY.name=粉碎的硅铍钇矿(Y)矿石
+item.crushedCentrifugedGadoliniteY.name=离心硅铍钇矿(Y)矿石
+item.crushedPurifiedGadoliniteY.name=洗净的硅铍钇矿(Y)矿石
+item.dustImpureGadoliniteY.name=含杂硅铍钇矿(Y)粉
+item.dustPureGadoliniteY.name=洁净硅铍钇矿(Y)粉
+item.itemDustLepersonnite.name=绿泥石粉
+item.itemDustTinyLepersonnite.name=小撮绿泥石粉
+item.itemDustSmallLepersonnite.name=小堆绿泥石粉
+item.crushedLepersonnite.name=粉碎的绿泥石矿石
+item.crushedCentrifugedLepersonnite.name=离心绿泥石矿石
+item.crushedPurifiedLepersonnite.name=洗净的绿泥石矿石
+item.dustImpureLepersonnite.name=含杂绿泥石粉
+item.dustPureLepersonnite.name=洁净绿泥石粉
+item.itemDustSamarskiteY.name=铌钇矿(Y)粉
+item.itemDustTinySamarskiteY.name=小撮铌钇矿(Y)粉
+item.itemDustSmallSamarskiteY.name=小堆铌钇矿(Y)粉
+item.crushedSamarskiteY.name=粉碎的铌钇矿(Y)矿石
+item.crushedCentrifugedSamarskiteY.name=离心铌钇矿(Y)矿石
+item.crushedPurifiedSamarskiteY.name=洗净的铌钇矿(Y)矿石
+item.dustImpureSamarskiteY.name=含杂铌钇矿(Y)粉
+item.dustPureSamarskiteY.name=洁净铌钇矿(Y)粉
+item.itemDustSamarskiteYb.name=铌钇矿(Yb)粉
+item.itemDustTinySamarskiteYb.name=小撮铌钇矿(Yb)粉
+item.itemDustSmallSamarskiteYb.name=小堆铌钇矿(Yb)粉
+item.crushedSamarskiteYb.name=粉碎的铌钇矿(Yb)矿石
+item.crushedCentrifugedSamarskiteYb.name=离心铌钇矿(Yb)矿石
+item.crushedPurifiedSamarskiteYb.name=洗净的铌钇矿(Yb)矿石
+item.dustImpureSamarskiteYb.name=含杂铌钇矿(Yb)粉
+item.dustPureSamarskiteYb.name=洁净铌钇矿(Yb)粉
+item.itemDustXenotime.name=磷钇矿粉
+item.itemDustTinyXenotime.name=小撮磷钇矿粉
+item.itemDustSmallXenotime.name=小堆磷钇矿粉
+item.crushedXenotime.name=粉碎的磷钇矿矿石
+item.crushedCentrifugedXenotime.name=离心磷钇矿矿石
+item.crushedPurifiedXenotime.name=洗净的磷钇矿矿石
+item.dustImpureXenotime.name=含杂磷钇矿粉
+item.dustPureXenotime.name=洁净磷钇矿粉
+item.itemDustYttriaite.name=钇矿粉
+item.itemDustTinyYttriaite.name=小撮钇矿粉
+item.itemDustSmallYttriaite.name=小堆钇矿粉
+item.crushedYttriaite.name=粉碎的钇矿矿石
+item.crushedCentrifugedYttriaite.name=离心钇矿矿石
+item.crushedPurifiedYttriaite.name=洗净的钇矿矿石
+item.dustImpureYttriaite.name=含杂钇矿粉
+item.dustPureYttriaite.name=洁净钇矿粉
+item.itemDustYttrialite.name=硅钍钇矿粉
+item.itemDustTinyYttrialite.name=小撮硅钍钇矿粉
+item.itemDustSmallYttrialite.name=小堆硅钍钇矿粉
+item.crushedYttrialite.name=粉碎的硅钍钇矿矿石
+item.crushedCentrifugedYttrialite.name=离心硅钍钇矿矿石
+item.crushedPurifiedYttrialite.name=洗净的硅钍钇矿矿石
+item.dustImpureYttrialite.name=含杂硅钍钇矿粉
+item.dustPureYttrialite.name=洁净硅钍钇矿粉
+item.itemDustYttrocerite.name=铈钇矿粉
+item.itemDustTinyYttrocerite.name=小撮铈钇矿粉
+item.itemDustSmallYttrocerite.name=小堆铈钇矿粉
+item.crushedYttrocerite.name=粉碎的铈钇矿矿石
+item.crushedCentrifugedYttrocerite.name=离心铈钇矿矿石
+item.crushedPurifiedYttrocerite.name=洗净的铈钇矿矿石
+item.dustImpureYttrocerite.name=含杂铈钇矿粉
+item.dustPureYttrocerite.name=洁净铈钇矿粉
+item.itemDustZircon.name=锆石粉
+item.itemDustTinyZircon.name=小撮锆石粉
+item.itemDustSmallZircon.name=小堆锆石粉
+item.crushedZircon.name=粉碎的锆石矿石
+item.crushedCentrifugedZircon.name=离心锆石矿石
+item.crushedPurifiedZircon.name=洗净的锆石矿石
+item.dustImpureZircon.name=含杂锆石粉
+item.dustPureZircon.name=洁净锆石粉
+item.itemDustPolycrase.name=锗铀钇矿粉
+item.itemDustTinyPolycrase.name=小撮锗铀钇矿粉
+item.itemDustSmallPolycrase.name=小堆锗铀钇矿粉
+item.crushedPolycrase.name=粉碎的锗铀钇矿矿石
+item.crushedCentrifugedPolycrase.name=离心锗铀钇矿矿石
+item.crushedPurifiedPolycrase.name=洗净的锗铀钇矿矿石
+item.dustImpurePolycrase.name=含杂锗铀钇矿粉
+item.dustPurePolycrase.name=洁净锗铀钇矿粉
+item.itemDustZircophyllite.name=锆星叶石粉
+item.itemDustTinyZircophyllite.name=小撮锆星叶石粉
+item.itemDustSmallZircophyllite.name=小堆锆星叶石粉
+item.crushedZircophyllite.name=粉碎的锆星叶石矿石
+item.crushedCentrifugedZircophyllite.name=离心锆星叶石矿石
+item.crushedPurifiedZircophyllite.name=洗净的锆星叶石矿石
+item.dustImpureZircophyllite.name=含杂锆星叶石粉
+item.dustPureZircophyllite.name=洁净锆星叶石粉
+item.itemDustZirkelite.name=锆英石粉
+item.itemDustTinyZirkelite.name=小撮锆英石粉
+item.itemDustSmallZirkelite.name=小堆锆英石粉
+item.crushedZirkelite.name=粉碎的锆英石矿石
+item.crushedCentrifugedZirkelite.name=离心锆英石矿石
+item.crushedPurifiedZirkelite.name=洗净的锆英石矿石
+item.dustImpureZirkelite.name=含杂锆英石粉
+item.dustPureZirkelite.name=洁净锆英石粉
+item.itemDustLanthaniteLa.name=镧石(La)粉
+item.itemDustTinyLanthaniteLa.name=小撮镧石(La)粉
+item.itemDustSmallLanthaniteLa.name=小堆镧石(La)粉
+item.crushedLanthaniteLa.name=粉碎的镧石(La)矿石
+item.crushedCentrifugedLanthaniteLa.name=离心镧石(La)矿石
+item.crushedPurifiedLanthaniteLa.name=洗净的镧石(La)矿石
+item.dustImpureLanthaniteLa.name=含杂镧石(La)粉
+item.dustPureLanthaniteLa.name=洁净镧石(La)粉
+item.itemDustLanthaniteCe.name=镧石(Ce)粉
+item.itemDustTinyLanthaniteCe.name=小撮镧石(Ce)粉
+item.itemDustSmallLanthaniteCe.name=小堆镧石(Ce)粉
+item.crushedLanthaniteCe.name=粉碎的镧石(Ce)矿石
+item.crushedCentrifugedLanthaniteCe.name=离心镧石(Ce)矿石
+item.crushedPurifiedLanthaniteCe.name=洗净的镧石(Ce)矿石
+item.dustImpureLanthaniteCe.name=含杂镧石(Ce)粉
+item.dustPureLanthaniteCe.name=洁净镧石(Ce)粉
+item.itemDustLanthaniteNd.name=镧石(Nd)粉
+item.itemDustTinyLanthaniteNd.name=小撮镧石(Nd)粉
+item.itemDustSmallLanthaniteNd.name=小堆镧石(Nd)粉
+item.crushedLanthaniteNd.name=粉碎的镧石(Nd)矿石
+item.crushedCentrifugedLanthaniteNd.name=离心镧石(Nd)矿石
+item.crushedPurifiedLanthaniteNd.name=洗净的镧石(Nd)矿石
+item.dustImpureLanthaniteNd.name=含杂镧石(Nd)粉
+item.dustPureLanthaniteNd.name=洁净镧石(Nd)粉
+item.itemDustAgarditeY.name=菱铁矿(Y)粉
+item.itemDustTinyAgarditeY.name=小撮菱铁矿(Y)粉
+item.itemDustSmallAgarditeY.name=小堆菱铁矿(Y)粉
+item.crushedAgarditeY.name=粉碎的菱铁矿(Y)矿石
+item.crushedCentrifugedAgarditeY.name=离心菱铁矿(Y)矿石
+item.crushedPurifiedAgarditeY.name=洗净的菱铁矿(Y)矿石
+item.dustImpureAgarditeY.name=含杂菱铁矿(Y)粉
+item.dustPureAgarditeY.name=洁净菱铁矿(Y)粉
+item.itemDustAgarditeCd.name=菱铁矿(Cd)粉
+item.itemDustTinyAgarditeCd.name=小撮菱铁矿(Cd)粉
+item.itemDustSmallAgarditeCd.name=小堆菱铁矿(Cd)粉
+item.crushedAgarditeCd.name=粉碎的菱铁矿(Cd)矿石
+item.crushedCentrifugedAgarditeCd.name=离心菱铁矿(Cd)矿石
+item.crushedPurifiedAgarditeCd.name=洗净的菱铁矿(Cd)矿石
+item.dustImpureAgarditeCd.name=含杂菱铁矿(Cd)粉
+item.dustPureAgarditeCd.name=洁净菱铁矿(Cd)粉
+item.itemDustAgarditeLa.name=菱铁矿(La)粉
+item.itemDustTinyAgarditeLa.name=小撮菱铁矿(La)粉
+item.itemDustSmallAgarditeLa.name=小堆菱铁矿(La)粉
+item.crushedAgarditeLa.name=粉碎的菱铁矿(La)矿石
+item.crushedCentrifugedAgarditeLa.name=离心菱铁矿(La)矿石
+item.crushedPurifiedAgarditeLa.name=洗净的菱铁矿(La)矿石
+item.dustImpureAgarditeLa.name=含杂菱铁矿(La)粉
+item.dustPureAgarditeLa.name=洁净菱铁矿(La)粉
+item.itemDustAgarditeNd.name=菱铁矿(Nd)粉
+item.itemDustTinyAgarditeNd.name=小撮菱铁矿(Nd)粉
+item.itemDustSmallAgarditeNd.name=小堆菱铁矿(Nd)粉
+item.crushedAgarditeNd.name=粉碎的菱铁矿(Nd)矿石
+item.crushedCentrifugedAgarditeNd.name=离心菱铁矿(Nd)矿石
+item.crushedPurifiedAgarditeNd.name=洗净的菱铁矿(Nd)矿石
+item.dustImpureAgarditeNd.name=含杂菱铁矿(Nd)粉
+item.dustPureAgarditeNd.name=洁净菱铁矿(Nd)粉
+item.itemDustHibonite.name=黑铝钙石粉
+item.itemDustTinyHibonite.name=小撮黑铝钙石粉
+item.itemDustSmallHibonite.name=小堆黑铝钙石粉
+item.crushedHibonite.name=粉碎的黑铝钙石矿石
+item.crushedCentrifugedHibonite.name=离心黑铝钙石矿石
+item.crushedPurifiedHibonite.name=洗净的黑铝钙石矿石
+item.dustImpureHibonite.name=含杂黑铝钙石粉
+item.dustPureHibonite.name=洁净黑铝钙石粉
+item.itemDustCerite.name=铈硅石粉
+item.itemDustTinyCerite.name=小撮铈硅石粉
+item.itemDustSmallCerite.name=小堆铈硅石粉
+item.crushedCerite.name=粉碎的铈硅石矿石
+item.crushedCentrifugedCerite.name=离心铈硅石矿石
+item.crushedPurifiedCerite.name=洗净的铈硅石矿石
+item.dustImpureCerite.name=含杂铈硅石粉
+item.dustPureCerite.name=洁净铈硅石粉
+item.itemDustFluorcaphite.name=氟碳铈矿粉
+item.itemDustTinyFluorcaphite.name=小撮氟碳铈矿粉
+item.itemDustSmallFluorcaphite.name=小堆氟碳铈矿粉
+item.crushedFluorcaphite.name=粉碎的氟碳铈矿矿石
+item.crushedCentrifugedFluorcaphite.name=离心氟碳铈矿矿石
+item.crushedPurifiedFluorcaphite.name=洗净的氟碳铈矿矿石
+item.dustImpureFluorcaphite.name=含杂氟碳铈矿粉
+item.dustPureFluorcaphite.name=洁净氟碳铈矿粉
+item.itemDustFlorencite.name=磷铝铈矿粉
+item.itemDustTinyFlorencite.name=小撮磷铝铈矿粉
+item.itemDustSmallFlorencite.name=小堆磷铝铈矿粉
+item.crushedFlorencite.name=粉碎的磷铝铈矿矿石
+item.crushedCentrifugedFlorencite.name=离心磷铝铈矿矿石
+item.crushedPurifiedFlorencite.name=洗净的磷铝铈矿矿石
+item.dustImpureFlorencite.name=含杂磷铝铈矿粉
+item.dustPureFlorencite.name=洁净磷铝铈矿粉
+item.itemDustCryoliteF.name=冰晶石(F)粉
+item.itemDustTinyCryoliteF.name=小撮冰晶石(F)粉
+item.itemDustSmallCryoliteF.name=小堆冰晶石(F)粉
+item.crushedCryoliteF.name=粉碎的冰晶石(F)矿石
+item.crushedCentrifugedCryoliteF.name=离心冰晶石(F)矿石
+item.crushedPurifiedCryoliteF.name=洗净的冰晶石(F)矿石
+item.dustImpureCryoliteF.name=含杂冰晶石(F)粉
+item.dustPureCryoliteF.name=洁净冰晶石(F)粉
+item.itemDustTinyYellorium.name=小撮黄铀矿粉
+item.itemDustSmallYellorium.name=小堆黄铀矿粉
+item.crushedYellorium.name=粉碎的黄铀矿矿石
+item.crushedCentrifugedYellorium.name=离心黄铀矿矿石
+item.crushedPurifiedYellorium.name=洗净的黄铀矿矿石
+item.dustImpureYellorium.name=含杂黄铀矿粉
+item.dustPureYellorium.name=洁净黄铀矿粉
+
+//Shards
+item.itemDrained.name=枯竭碎片
+item.itemDustInfusedAir.name=风之魔晶粉
+item.itemDustInfusedFire.name=火之魔晶粉
+item.itemDustInfusedEarth.name=地之魔晶粉
+item.itemDustInfusedWater.name=水之魔晶粉
+
+
+//Misc Material Items
+item.itemDustLithiumCarbonate.name=碳酸锂粉
+item.itemDustSmallLithiumCarbonate.name=小堆碳酸锂粉
+item.itemDustTinyLithiumCarbonate.name=小撮碳酸锂粉
+item.itemDustLithiumPeroxide.name=过氧化锂粉
+item.itemDustSmallLithiumPeroxide.name=小堆过氧化锂粉
+item.itemDustTinyLithiumPeroxide.name=小撮过氧化锂粉
+item.itemDustLithiumHydroxide.name=氢氧化锂粉
+item.itemDustSmallLithiumHydroxide.name=小堆氢氧化锂粉
+item.itemDustTinyLithiumHydroxide.name=小撮氢氧化锂粉
+item.itemDustCalciumHydroxide.name=氢氧化钙粉
+item.itemDustSmallCalciumHydroxide.name=小堆氢氧化钙粉
+item.itemDustTinyCalciumHydroxide.name=小撮氢氧化钙粉
+item.itemDustCalciumCarbonate.name=碳酸钙粉
+item.itemDustSmallCalciumCarbonate.name=小堆碳酸钙粉
+item.itemDustTinyCalciumCarbonate.name=小撮碳酸钙粉
+item.itemDustGypsum.name=硫酸钙(石膏)粉
+item.itemDustSmallGypsum.name=小堆硫酸钙(石膏)粉
+item.itemDustTinyGypsum.name=小撮硫酸钙(石膏)粉
+item.itemDustLi2CO3CaOH2.name=碳酸锂+氢氧化钙复合物粉
+item.itemDustSmallLi2CO3CaOH2.name=小堆碳酸锂+氢氧化钙复合物粉
+item.itemDustTinyLi2CO3CaOH2.name=小撮碳酸锂+氢氧化钙复合物粉
+item.itemDustLi2BeF4.name=Li2BeF4 燃料复合物粉
+item.itemDustSmallLi2BeF4.name=小堆Li2BeF4燃料复合物粉
+item.itemDustTinyLi2BeF4.name=小撮Li2BeF4燃料复合物粉
+item.Li2BeF4.name=Li2BeF4单元
+item.itemCircuitLFTR.name=§a§a控制电路
+item.itemZirconiumPellet.name=锆颗粒[氯化锆]
+item.itemDustZrCl4.name=氯化锆粉
+item.itemDustSmallZrCl4.name=小堆氯化锆粉
+item.itemDustTinyZrCl4.name=小撮氯化锆粉
+item.itemDustCookedZrCl4.name=焙烧过的氯化锆粉
+item.itemDustSmallCookedZrCl4.name=小堆焙烧过的氯化锆粉
+item.itemDustTinyCookedZrCl4.name=小撮焙烧过的氯化锆粉
+item.itemDustUN18Fertiliser.name=流体肥料UN-18粉
+item.itemDustSmallUN18Fertiliser.name=小堆流体肥料UN-18粉
+item.itemDustTinyUN18Fertiliser.name=小撮流体肥料un-18粉
+item.itemDustUN32Fertiliser.name=流体肥料UN-32粉
+item.itemDustSmallUN32Fertiliser.name=小堆流体肥料UN-32粉
+item.itemDustTinyUN32Fertiliser.name=小撮流体肥料UN-32粉
+
+
+//Multitools
+item.AluminiumMultipick.name=铝复合稿
+item.AluminiumMultispade.name=铝复合铲
+item.BerylliumMultispade.name=铍复合铲
+item.BismuthMultispade.name=铋复合铲
+item.CarbonMultispade.name=碳复合铲
+item.ChromeMultipick.name=铬复合稿
+item.ChromeMultispade.name=铬复合铲
+item.CobaltMultipick.name=钴复合稿
+item.CobaltMultispade.name=钴复合铲
+item.GoldMultispade.name=金复合铲
+item.IridiumMultipick.name=铱复合稿
+item.IridiumMultispade.name=铱复合铲
+item.IronMultipick.name=铁复合稿
+item.IronMultispade.name=铁复合铲
+item.LeadMultispade.name=铅复合铲
+item.ManganeseMultipick.name=锰复合稿
+item.ManganeseMultispade.name=锰复合铲
+item.MolybdenumMultipick.name=钼复合稿
+item.MolybdenumMultispade.name=钼复合铲
+item.NeodymiumMultipick.name=钕复合镐
+item.NeodymiumMultispade.name=钕复合铲
+item.NeutroniumMultipick.name=中子素复合镐
+item.NeutroniumMultispade.name=中子素复合铲
+item.NickelMultispade.name=镍复合铲
+item.OsmiumMultipick.name=锇复合镐
+item.OsmiumMultispade.name=锇复合铲
+item.PalladiumMultipick.name=钯复合镐
+item.PalladiumMultispade.name=钯复合铲
+item.PlatinumMultispade.name=铂复合铲
+item.Plutonium241Multipick.name=钚-241复合镐
+item.Plutonium241Multispade.name=钚-241复合铲
+item.SilverMultispade.name=银复合铲
+item.ThoriumMultipick.name=钍复合镐
+item.ThoriumMultispade.name=钍复合铲
+item.TitaniumMultipick.name=钛复合镐
+item.TitaniumMultispade.name=钛复合铲
+item.TungstenMultipick.name=钨复合镐
+item.TungstenMultispade.name=钨复合铲
+item.Uranium235Multipick.name=铀-235复合镐
+item.Uranium235Multispade.name=铀-235复合铲
+item.DarkSteelMultipick.name=玄钢复合镐
+item.DarkSteelMultispade.name=玄钢复合铲
+item.DuraniumMultipick.name=铿铀复合镐
+item.DuraniumMultispade.name=铿铀复合铲
+item.InfusedGoldMultispade.name=注魔金复合铲
+item.NaquadahMultipick.name=硅岩复合镐
+item.NaquadahMultispade.name=硅岩复合铲
+item.NaquadahAlloyMultipick.name=硅岩合金复合镐
+item.NaquadahAlloyMultispade.name=硅岩合金复合铲
+item.NaquadriaMultipick.name=超能硅岩复合镐
+item.NaquadriaMultispade.name=超能硅岩复合铲
+item.TritaniumMultipick.name=三钛复合镐
+item.TritaniumMultispade.name=三钛复合铲
+item.OsmiridiumMultipick.name=铱锇合金复合镐
+item.OsmiridiumMultispade.name=铱锇合金复合铲
+item.BrassMultispade.name=黄铜复合铲
+item.BronzeMultipick.name=青铜复合镐
+item.BronzeMultispade.name=青铜复合铲
+item.CupronickelMultispade.name=白铜复合铲
+item.ElectrumMultispade.name=琥珀金复合铲
+item.InvarMultipick.name=殷钢复合镐
+item.InvarMultispade.name=殷钢复合铲
+item.KanthalMultispade.name=坎塔尔合金复合铲
+item.MagnaliumMultipick.name=镁铝合金复合镐
+item.MagnaliumMultispade.name=镁铝合金复合铲
+item.NichromeMultispade.name=镍铬合金复合铲
+item.PigIronMultipick.name=生铁复合镐
+item.PigIronMultispade.name=生铁复合铲
+item.PolycaprolactamMultispade.name=聚己内酰胺复合铲
+item.PolytetrafluoroethyleneMultispade.name=聚四氟乙烯复合铲
+item.NickelZincFerriteMultispade.name=镍锌铁氧体复合铲
+item.PolyphenyleneSulfideMultispade.name=聚苯硫醚复合铲
+item.StainlessSteelMultipick.name=不锈钢复合镐
+item.StainlessSteelMultispade.name=不锈钢复合铲
+item.SteelMultipick.name=钢复合镐
+item.SteelMultispade.name=钢复合铲
+item.TinAlloyMultispade.name=锡铁合金复合铲
+item.UltimetMultipick.name=哈氏合金复合镐
+item.UltimetMultispade.name=哈氏合金复合铲
+item.WroughtIronMultipick.name=锻铁复合镐
+item.WroughtIronMultispade.name=锻铁复合铲
+item.SterlingSilverMultipick.name=标准纯银复合镐
+item.SterlingSilverMultispade.name=标准纯银复合铲
+item.RoseGoldMultipick.name=玫瑰金复合镐
+item.RoseGoldMultispade.name=玫瑰金复合铲
+item.BlackBronzeMultipick.name=黑青铜复合镐
+item.BlackBronzeMultispade.name=黑青铜复合铲
+item.BismuthBronzeMultipick.name=铋青铜复合镐
+item.BismuthBronzeMultispade.name=铋青铜复合铲
+item.BlackSteelMultipick.name=黑钢复合镐
+item.BlackSteelMultispade.name=黑钢复合铲
+item.RedSteelMultipick.name=红钢复合镐
+item.RedSteelMultispade.name=红钢复合铲
+item.BlueSteelMultipick.name=蓝钢复合镐
+item.BlueSteelMultispade.name=蓝钢复合铲
+item.DamascusSteelMultipick.name=大马士革钢复合镐
+item.DamascusSteelMultispade.name=大马士革钢复合铲
+item.MithrilMultispade.name=秘银复合铲
+item.CobaltBrassMultipick.name=钴黄铜复合镐
+item.CobaltBrassMultispade.name=钴黄铜复合铲
+item.ThaumiumMultipick.name=神秘锭复合镐
+item.ThaumiumMultispade.name=神秘锭复合铲
+item.HSSGMultipick.name=高速钢-G复合镐
+item.HSSGMultispade.name=高速钢-G复合铲
+item.HSSEMultipick.name=高速钢-E复合镐
+item.HSSEMultispade.name=高速钢-E复合铲
+item.HSSSMultipick.name=高速钢-S复合镐
+item.HSSSMultispade.name=高速钢-S复合铲
+item.HastelloyC276Multipick.name=哈斯特洛依合金-C276复合镐
+item.HastelloyC276Multispade.name=哈斯特洛依合金-C276复合铲
+item.HastelloyNMultipick.name=哈斯特洛依合金-N复合镐
+item.HastelloyNMultispade.name=哈斯特洛依合金-N复合铲
+item.HastelloyWMultipick.name=哈斯特洛依合金-W复合镐
+item.HastelloyWMultispade.name=哈斯特洛依合金-W复合铲
+item.HastelloyXMultipick.name=哈斯特洛依合金-X复合镐
+item.HastelloyXMultispade.name=哈斯特洛依合金-X复合铲
+item.Incoloy020Multipick.name=耐热铬铁合金-020复合镐
+item.Incoloy020Multispade.name=耐热铬铁合金-020复合铲
+item.IncoloyDSMultipick.name=耐热铬铁合金-DS复合镐
+item.IncoloyDSMultispade.name=耐热铬铁合金-DS复合铲
+item.IncoloyMA956Multipick.name=耐热铬铁合金-MA956复合镐
+item.IncoloyMA956Multispade.name=耐热铬铁合金-MA956复合铲
+item.Inconel625Multipick.name=镍铬基合金-625复合镐
+item.Inconel625Multispade.name=镍铬基合金-625复合铲
+item.Inconel690Multipick.name=镍铬基合金-690复合镐
+item.Inconel690Multispade.name=镍铬基合金-690复合铲
+item.Inconel792Multipick.name=镍铬基合金-792复合镐
+item.Inconel792Multispade.name=镍铬基合金-792复合铲
+item.GrisiumMultipick.name=灰钛合金复合镐
+item.GrisiumMultispade.name=灰钛合金复合铲
+item.Tantalloy60Multipick.name=钽钨合金-60复合镐
+item.Tantalloy60Multispade.name=钽钨合金-60复合铲
+item.Tantalloy61Multipick.name=钽钨合金-61复合镐
+item.Tantalloy61Multispade.name=钽钨合金-61复合铲
+item.StaballoyMultipick.name=贫铀合金复合镐
+item.StaballoyMultispade.name=贫铀合金复合铲
+item.QuantumMultipick.name=量子合金复合镐
+item.QuantumMultispade.name=量子合金复合铲
+item.PotinMultipick.name=粗青铜合金复合镐
+item.PotinMultispade.name=粗青铜合金复合铲
+item.TumbagaMultipick.name=铜金合金复合镐
+item.TumbagaMultispade.name=铜金合金复合铲
+item.TaloniteMultipick.name=铬钴磷酸盐合金复合镐
+item.TaloniteMultispade.name=铬钴磷酸盐合金复合铲
+item.StelliteMultipick.name=铬钴锰钛合金复合镐
+item.StelliteMultispade.name=铬钴锰钛合金复合铲
+item.TungstenCarbideMultipick.name=碳化钨复合镐
+item.TungstenCarbideMultispade.name=碳化钨复合铲
+item.TantalumCarbideMultipick.name=碳化钽复合镐
+item.TantalumCarbideMultispade.name=碳化钽复合铲
+
+
+//Items that Don't fit into another category
+
+//Plates
+item.itemPlateClay.name=粘土板
+item.itemPlateDoubleClay.name=双重粘土板
+item.itemPlateLithium.name=锂板
+item.itemPlateDoubleEuropium.name=双重铕板
+
+//Gears
+item.itemSmallGearWroughtIron.name=小型锻铁齿轮
+
+//Misc
+item.itemFoilUranium235.name=铀235箔
+
+item.itemBoilerChassis_0.name=高级锅炉外壳[1级]
+item.itemDehydratorCoilWire_0.name=缠绕导线 [EV]
+item.itemDehydratorCoil_0.name=脱水线圈 [EV]
+item.itemAirFilter_0.name=空气过滤器
+item.itemAirFilter_1.name=空气过滤器
+item.itemLavaFilter.name=岩浆过滤器
+item.itemGrindleTablet.name=Git
+item.itemDragonJar.name=龙捕获之壶
+item.CoalGas.name=煤气单元
+item.Ethylbenzene.name=乙苯单元
+item.Anthracene.name=蒽单元
+item.Toluene.name=甲苯单元
+item.CoalTar.name=煤焦油单元
+item.CoalTarOil.name=煤焦油单元
+item.SulfuricCoalTarOil.name=硫酸煤焦油单元
+item.Naphthalene.name=萘单元
+item.itemDustPhthalicAnhydride.name=邻苯二甲酸酐粉
+item.itemDustSmallPhthalicAnhydride.name=小堆邻苯二甲酸酐粉
+item.itemDustTinyPhthalicAnhydride.name=小撮邻苯二甲酸酐粉
+item.2Ethylanthraquinone.name=2-乙基蒽醌单元
+item.2Ethylanthrahydroquinone.name=2-乙基氢蒽醌单元
+item.HydrogenPeroxide.name=过氧化氢单元
+item.itemDustLithiumHydroperoxide.name=过氧化氢锂粉
+item.itemDustSmallLithiumHydroperoxide.name=小堆过氧化氢锂粉
+item.itemDustTinyLithiumHydroperoxide.name=小撮过氧化氢锂粉
+item.LithiumPeroxide.name=过氧化锂单元
+item.itemPotionChilly.name=冰凉药水
+item.itemKeyBig4000DC's.name=4000DC的大钥匙
+item.itemGemDull.name=沉闷宝石
+item.itemMushroomForest.name=森林蘑菇
+item.itemPlateVanadium.name=钒钢板
+item.thekeytothecity.name=通往城市的钥匙
+item.modularbauble.name=模块化饰品
+item.itemDustSoularium.name=魂金粉
+item.itemDustSmallSoularium.name=小堆魂金粉
+item.itemDustTinySoularium.name=小撮魂金粉
+item.itemDustRedstoneAlloy.name=红石合金粉
+item.itemDustSmallRedstoneAlloy.name=小堆红石合金粉
+item.itemDustTinyRedstoneAlloy.name=小撮红石合金粉
+item.itemDustElectricalSteel.name=磁钢粉
+item.itemDustSmallElectricalSteel.name=小堆磁钢粉
+item.itemDustTinyElectricalSteel.name=小撮磁钢粉
+item.itemDustPulsatingIron.name=脉冲铁粉
+item.itemDustSmallPulsatingIron.name=小堆脉冲铁粉
+item.itemDustTinyPulsatingIron.name=小撮脉冲铁粉
+item.itemDustEnergeticAlloy.name=充能合金粉
+item.itemDustSmallEnergeticAlloy.name=小堆充能合金粉
+item.itemDustTinyEnergeticAlloy.name=小撮充能合金粉
+item.itemDustVibrantAlloy.name=脉冲合金粉
+item.itemDustSmallVibrantAlloy.name=小堆脉冲合金粉
+item.itemDustTinyVibrantAlloy.name=小撮脉冲合金粉
+item.itemDustConductiveIron.name=导电铁粉
+item.itemDustSmallConductiveIron.name=小堆导电铁粉
+item.itemDustTinyConductiveIron.name=小撮导电铁粉
+item.itemPlateSoularium.name=魂金板
+item.itemPlateRedstoneAlloy.name=红石合金板
+item.itemPlateElectricalSteel.name=磁钢板
+item.itemPlatePhasedIron.name=脉冲铁板
+item.itemPlateEnergeticAlloy.name=充能合金板
+item.itemPlateVibrantAlloy.name=脉冲合金板
+item.itemPlateConductiveIron.name=导电铁板
+item.itemPlateBlutonium.name=蓝钚板
+item.itemPlateCyanite.name=蓝晶石板
+item.itemPlateLudicrite.name=纯镥板
+item.itemPlateVoid.name=虚空板
+item.itemPlateDimensionShard.name=维度碎片板
+item.rfEUBattery.name=通用充电电池
+item.personalCloakingDevice.name=§9§9个人隐形装置§7
+item.personalHealingDevice.name=§9§9个人纳米治疗加速器§r
+item.SlowBuildingRing.name=§e§e缓建指环§7
+item.itemStaballoyPickaxe.name=隧道挖掘者
+item.itemStaballoyAxe.name=树林砍伐者
+item.itemSandstoneHammer.name=圆石粉碎者
+item.itemBufferCore1.name=能量核心 [ULV]
+item.itemBufferCore2.name=能量核心 [LV]
+item.itemBufferCore3.name=能量核心 [MV]
+item.itemBufferCore4.name=能量核心 [HV]
+item.itemBufferCore5.name=能量核心 [EV]
+item.itemBufferCore6.name=能量核心 [IV]
+item.itemBufferCore7.name=能量核心 [LuV]
+item.itemBufferCore8.name=能量核心 [ZPM]
+item.itemBufferCore9.name=能量核心 [UV]
+item.itemBufferCore10.name=能量核心 [MAX]
+item.itemPLACEHOLDER_Circuit.name=夸克操纵者 (UV)
+item.itembookgt.name=§o§o热力锅炉手册
+
+// Everglade Items
+item.everglades.trigger.name=§6§6Alkalus圆盘[§c激活§6]
+
+
+
+
+
+
+
+//Blocks
+tile.blockRainforestOakLog.name=雨林橡木
+tile.blockRainforestOakLeaves.name=橡树树叶
+tile.blockRainforestOakSapling.name=雨林橡树树苗
+
+//TC Stuff
+tile.blockFastAlchemyFurnace.0.name=损坏
+tile.blockFastArcaneAlembic.1.name=损坏
+
+//Frame Boxes
+tile.Block of Selenium.name=硒块
+tile.Selenium Frame Box.name=硒框架
+tile.Block of Bromine.name=溴块
+tile.Block of Strontium.name=锶块
+tile.Strontium Frame Box.name=锶框架
+tile.Block of Zirconium.name=锆块
+tile.Zirconium Frame Box.name=锆框架
+tile.Block of Ruthenium.name=钌块
+tile.Ruthenium Frame Box.name=钌框架
+tile.Block of Iodine.name=碘块
+tile.Iodine Frame Box.name=碘框架
+tile.Block of Hafnium.name=铪块
+tile.Hafnium Frame Box.name=铪框架
+tile.Block of Dysprosium.name=镝块
+tile.Dysprosium Frame Box.name=镝框架
+tile.Block of Tellurium.name=碲块
+tile.Tellurium Frame Box.name=碲框架
+tile.Block of Rhodium.name=铑块
+tile.Rhodium Frame Box.name=铑框架
+tile.Block of Rhenium.name=铼块
+tile.Rhenium Frame Box.name=铼框架
+tile.Block of Thallium.name=铊块
+tile.Thallium Frame Box.name=铊框架
+tile.Block of Technetium.name=锝块
+tile.Block of Polonium.name=钋块
+tile.Block of Astatine.name=砹块
+tile.Block of Francium.name=钫块
+tile.Block of Radium.name=镭块
+tile.Block of Actinium.name=锕块
+tile.Block of Protactinium.name=镤块
+tile.Block of Neptunium.name=镎块
+tile.Block of Curium.name=锔块
+tile.Block of Berkelium.name=锫块
+tile.Block of Californium.name=锎块
+tile.Block of Einsteinium.name=锿块
+tile.Block of Fermium.name=镄块
+tile.Block of Thorium 232.name=钍-232块
+tile.Block of Uranium 232.name=铀-232块
+tile.Block of Uranium 233.name=铀-233块
+tile.Block of Plutonium-238.name=钚-238块
+tile.Block of Strontium-90.name=锶-90块
+tile.Block of Polonium-210.name=钋-210块
+tile.Block of Americium-241.name=镅-241块
+tile.Block of Silicon Carbide.name=碳化硅块
+tile.Silicon Carbide Frame Box.name=碳化硅框架
+tile.Block of Zirconium Carbide.name=碳化锆块
+tile.Zirconium Carbide Frame Box.name=碳化锆框架
+tile.Block of Tantalum Carbide.name=碳化钽块
+tile.Tantalum Carbide Frame Box.name=碳化钽框架
+tile.Block of Niobium Carbide.name=碳化铌块
+tile.Niobium Carbide Frame Box.name=碳化铌框架
+tile.Block of Beryllium Fluoride.name=氟化铍块
+tile.Block of Lithium Fluoride.name=氟化锂块
+tile.Block of Thorium Tetrafluoride.name=四氟化钍块
+tile.Block of Thorium Hexafluoride.name=六氟化钍块
+tile.Block of Uranium Tetrafluoride.name=四氟化铀块
+tile.Block of Uranium Hexafluoride.name=六氟化铀块
+tile.Block of Zirconium Tetrafluoride.name=四氟化锆块
+tile.Block of Neptunium Hexafluoride.name=六氟化镎块
+tile.Block of Technetium Hexafluoride.name=六氟化锝块
+tile.Block of Selenium Hexafluoride.name=六氟化硒块
+tile.Block of LiFBeF2ZrF4U235.name=铀235复合氟化物块
+tile.Block of LiFBeF2ZrF4UF4.name=铀锆复合氟化物块
+tile.Block of LiFBeF2ThF4UF4.name=铀钍复合氟化物块
+tile.Block of Energy Crystal.name=能量水晶块
+tile.Energy Crystal Frame Box.name=能量水晶框架
+tile.Block of Blood Steel.name=血钢块
+tile.Blood Steel Frame Box.name=血钢框架
+tile.Block of Zeron-100.name=塞龙-100块
+tile.Zeron-100 Frame Box.name=塞龙-100框架
+tile.Block of Tumbaga.name=铜金合金块
+tile.Tumbaga Frame Box.name=铜金合金框架
+tile.Block of Potin.name=粗青铜合金块
+tile.Potin Frame Box.name=粗青铜合金框架
+tile.Block of Staballoy.name=贫铀合金块
+tile.Staballoy Frame Box.name=贫铀合金框架
+tile.Block of Tantalloy-60.name=钽钨合金-60块
+tile.Tantalloy-60 Frame Box.name=钽钨合金-60框架
+tile.Block of Tantalloy-61.name=钽钨合金-61块
+tile.Tantalloy-61 Frame Box.name=钽钨合金-61框架
+tile.Block of Inconel-625.name=镍铬基合金-625块
+tile.Inconel-625 Frame Box.name=镍铬基合金-625框架
+tile.Block of Inconel-690.name=镍铬基合金-690块
+tile.Inconel-690 Frame Box.name=镍铬基合金-690框架
+tile.Block of Inconel-792.name=镍铬基合金-792块
+tile.Inconel-792 Frame Box.name=镍铬基合金-792框架
+tile.Block of Eglin Steel.name=埃格林钢块
+tile.Eglin Steel Frame Box.name=埃格林钢框架
+tile.Block of Maraging Steel 250.name=马氏体时效钢250块
+tile.Maraging Steel 250 Frame Box.name=马氏体时效钢250框架
+tile.Block of Maraging Steel 300.name=马氏体时效钢300块
+tile.Maraging Steel 300 Frame Box.name=马氏体时效钢300框架
+tile.Block of Maraging Steel 350.name=马氏体时效钢350块
+tile.Maraging Steel 350 Frame Box.name=马氏体时效钢350框架
+tile.Block of Stellite.name=铬钴锰钛合金块
+tile.Stellite Frame Box.name=铬钴锰钛合金框架
+tile.Block of Talonite.name=铬钴磷酸盐合金块
+tile.Talonite Frame Box.name=铬钴磷酸盐合金框架
+tile.Block of Hastelloy-W.name=哈斯特洛依合金-W块
+tile.Hastelloy-W Frame Box.name=哈斯特洛依合金-W框架
+tile.Block of Hastelloy-X.name=哈斯特洛依合金-X块
+tile.Hastelloy-X Frame Box.name=哈斯特洛依合金-X框架
+tile.Block of Hastelloy-C276.name=哈斯特洛依合金-C276块
+tile.Hastelloy-C276 Frame Box.name=哈斯特洛依合金-C276框架
+tile.Block of Hastelloy-N.name=哈斯特洛依合金-N块
+tile.Hastelloy-N Frame Box.name=哈斯特洛依合金-N框架
+tile.Block of Incoloy-020.name=耐热铬铁合金-020块
+tile.Incoloy-020 Frame Box.name=耐热铬铁合金-020框架
+tile.Block of Incoloy-DS.name=耐热铬铁合金-DS块
+tile.Incoloy-DS Frame Box.name=耐热铬铁合金-DS框架
+tile.Block of Incoloy-MA956.name=耐热铬铁合金-MA956块
+tile.Incoloy-MA956 Frame Box.name=耐热铬铁合金-MA956框架
+tile.Block of Grisium.name=灰钛合金块
+tile.Grisium Frame Box.name=灰钛合金框架
+tile.Block of Trinium.name=三元金属块
+tile.Block of Refined Trinium.name=精制三元金属块
+tile.Block of Trinium Titanium Alloy.name=三元钛合金块
+tile.Trinium Titanium Alloy Frame Box.name=三元钛合金框架
+tile.Block of Trinium Naquadah Alloy.name=三元硅岩合金块
+tile.Block of Trinium Naquadah Carbonite.name=碳化三元硅岩合金块
+tile.Trinium Naquadah Carbonite Frame Box.name=碳化三元硅岩合金框架
+tile.Block of Quantum.name=量子合金块
+tile.Quantum Frame Box.name=量子合金框架
+
+//Ores
+tile.OreFluoriteF.name=氟石(F)矿石
+tile.OreCrocoite.name=赤铅矿矿石
+tile.OreGeikielite.name=镁钛矿矿石
+tile.OreNichromite.name=镍铬矿矿石
+tile.OreTitanite.name=榍石矿石
+tile.OreZimbabweite.name=钛铌铅钠石矿石
+tile.OreZirconolite.name=钛锆钍矿矿石
+tile.OreGadoliniteCe.name=硅铍钇矿(Ce)矿石
+tile.OreGadoliniteY.name=硅铍钇矿(Y)矿石
+tile.OreLepersonnite.name=绿泥石矿石
+tile.OreSamarskiteY.name=铌钇矿(Y)矿石
+tile.OreSamarskiteYb.name=铌钇矿(Yb)矿石
+tile.OreXenotime.name=磷钇矿矿石
+tile.OreYttriaite.name=钇矿矿石
+tile.OreYttrialite.name=硅钍钇矿矿石
+tile.OreYttrocerite.name=铈钇矿矿石
+tile.OreZircon.name=锆石矿石
+tile.OrePolycrase.name=锗铀钇矿矿石
+tile.OreZircophyllite.name=锆星叶石矿石
+tile.OreZirkelite.name=锆英石矿石
+tile.OreLanthaniteLa.name=镧石(La)矿石
+tile.OreLanthaniteCe.name=镧石(Ce)矿石
+tile.OreLanthaniteNd.name=镧石(Nd)矿石
+tile.OreAgarditeY.name=菱铁矿(Y)矿石
+tile.OreAgarditeCd.name=菱铁矿(Cd)矿石
+tile.OreAgarditeLa.name=菱铁矿(La)矿石
+tile.OreAgarditeNd.name=菱铁矿(Nd)矿石
+tile.OreHibonite.name=黑铝钙石矿石
+tile.OreCerite.name=铈硅石矿石
+tile.OreFluorcaphite.name=氟碳铈矿矿石
+tile.OreFlorencite.name=磷铝铈矿矿石
+tile.OreCryoliteF.name=冰晶石(F)矿石
+
+//Misc
+tile.blockMFEffect.name=特殊
+tile.fluidBlockSludge.name=污泥
+tile.blockWorkbenchGT.name=工作台
+tile.blockWorkbenchGTAdvanced.name=高级工作台
+tile.blockHeliumGenerator.name=氦发生器
+tile.blockFirePit.name=火坑
+tile.blockFishTrap.name=捕鱼者
+tile.blockInfiniteFluidTank.name=无限流体储罐
+tile.blockMiningExplosives.name=矿用炸药
+tile.blockHellFire.name=地狱之火
+tile.blockProjectBench.name=工程台
+tile.blockTradeBench.name=贸易台
+tile.blockModularity.name=模块化工作台
+tile.blockBlackGate.name=凋灵笼子
+tile.blockTankXpConverter.name=经验转换器
+
+//Everglades Blocks
+tile.fluidSludge.0.name=不流动的废水
+tile.blockDarkWorldPortal.name=未来的掠影
+tile.blockDarkWorldGround.name=不稳定的土壤
+tile.blockDarkWorldGround2.name=污染的土壤
+tile.blockDarkWorldGround2.2.name=高度污染的土壤
+tile.blockDarkWorldPortalFrame.name=遏制框架
+
+
+//Added 1/4/18
+tile.blockMiningPipeFake.name=强化钢筋挖掘管道
+tile.blockMiningHeadFake.name=基岩钻头
+item.itemPlateMeatRaw.name=生肉板
+tile.Block of MeatRaw.name=生肉块
+
+//Added 26/5/18
+item.BurntLiFBeF2ThF4UF4.name=枯竭熔盐单元[铀钍复合氟化物]
+item.BurntLiFBeF2ZrF4UF4.name=枯竭熔盐单元[铀锆复合氟化物]
+item.BurntLiFBeF2ZrF4U235.name=枯竭熔盐单元[铀235复合氟化物]
+item.itemBigEgg.name= 盎司的大鸡蛋
+item.itemPlateSodium.name=钠板
+
+item.itemNuggetPromethium.name=钷粒
+item.itemIngotPromethium.name=钷锭
+item.itemDustSmallPromethium.name=小堆钷粉
+item.itemDustTinyPromethium.name=小撮钷粉
+item.itemDustPromethium.name=钷粉
+tile.Block of Promethium.name=钷块
+
+item.itemCellAmericium241.name=镅-241单元
+item.itemCellPolonium210.name=钋-210单元
+item.itemCellStrontium90.name=锶-90单元
+item.itemCellPlutonium238.name=钚-238单元
+
+entity.MiningCharge.name=采矿费用
+entity.throwablePotionSulfuric.name=硫酸烧瓶
+entity.throwablePotionHydrofluoric.name=氢氟酸烧瓶
+entity.toxinBall.name=毒素小球
+entity.plasmaBolt.name=等离子体
+entity.bigChickenFriendly.name=巨大的鸡
+
+//Added 26/6/18
+tile.OreTrinium.name=三元金属矿石
+item.crushedTrinium.name=粉碎三元金属矿石
+item.crushedCentrifugedTrinium.name=离心三元金属矿石
+item.crushedPurifiedTrinium.name=洗净的三元金属矿石
+item.dustImpureTrinium.name=含杂三元金属粉
+item.dustPureTrinium.name=洗净的三元金属粉
+
+//Added 1/7/18
+entity.WiseVillager.name=聪明的村民
+tile.blockMobSpawnerEx.0.name=刷怪笼
+tile.blockMobSpawnerEx.1.name=刷怪笼
+tile.blockMobSpawnerEx.2.name=刷怪笼
+tile.blockMobSpawnerEx.3.name=刷怪笼
+tile.blockMobSpawnerEx.4.name=刷怪笼
+tile.blockMobSpawnerEx.5.name=刷怪笼
+tile.blockMobSpawnerEx.6.name=刷怪笼
+tile.blockMobSpawnerEx.7.name=刷怪笼
+tile.blockMobSpawnerEx.8.name=刷怪笼
+tile.blockMobSpawnerEx.9.name=刷怪笼
+tile.blockMobSpawnerEx.10.name=刷怪笼
+tile.blockMobSpawnerEx.11.name=刷怪笼
+tile.blockMobSpawnerEx.12.name=刷怪笼
+tile.blockMobSpawnerEx.13.name=刷怪笼
+tile.blockMobSpawnerEx.14.name=刷怪笼
+tile.blockMobSpawnerEx.15.name=刷怪笼
+description.villager.profession.miscutils.banker=银行家
+description.villager.profession.miscutils.technician=GT技术员
+description.villager.profession.miscutils.trader=矿石交易员
+description.villager.profession.miscutils.aboriginal=澳大利亚土著
+
+//Added 23/8/18
+item.itemHatTinFoil.name=锡薄帽
+
+//Added 13/9/18
+entity.WiseVillager.name=聪明的村民
+entity.Aboriginal.name=澳大利亚土著
+entity.miscutils.constructStaballoy.name=贫铀合金结构
+entity.miscutils.sickBlaze.name=被感染的狂热者
+
+//Added 15/9/18
+item.ZirconiumTetrafluoride.name=四氟化锆单元
+item.Formaldehyde.name=甲醛单元
+item.RocketFuelMixA.name=H8N4C2O4火箭燃料单元
+item.RocketFuelMixB.name=RP-1火箭燃料单元
+item.RocketFuelMixC.name=CN3H7O3火箭燃料单元
+item.RocketFuelMixD.name=密集肼火箭燃料单元
+item.RP1Fuel.name=RP-1燃料单元
+item.Monomethylhydrazine.name=甲基肼单元
+item.Hydrazine.name=肼单元
+item.NitrogenTetroxide.name=四氧化二氮单元
+item.NitrousOxide.name=一氧化二氮单元
+item.AmmoniumNitrateSlurry.name=硝酸铵浆液单元
+item.Kerosene.name=煤油单元
+item.LiquidOxygen.name=液化氧单元[LOX]
+
+//Added 8/1/19
+
+//Ores
+
+tile.OreIrarsite.name=硫砷铱矿石
+item.crushedIrarsite.name=粉碎硫砷铱矿石
+item.crushedCentrifugedIrarsite.name=离心粉碎硫砷铱矿石
+item.crushedPurifiedIrarsite.name=纯净粉碎硫砷铱矿石
+item.dustImpureIrarsite.name=含杂硫砷铱粉
+item.dustPureIrarsite.name=纯净硫砷铱粉
+item.itemDustIrarsite.name=硫砷铱粉
+item.itemDustTinyIrarsite.name=小撮硫砷铱粉
+item.itemDustSmallIrarsite.name=小堆硫砷铱粉
+
+tile.OreMiessiite.name=硅灰石矿石
+item.crushedMiessiite.name=粉碎硅灰石矿石
+item.crushedCentrifugedMiessiite.name=离心粉碎硅灰石矿石
+item.crushedPurifiedMiessiite.name=纯净硅灰石矿石
+item.dustImpureMiessiite.name=含杂硅灰石粉
+item.dustPureMiessiite.name=纯净硅灰石粉
+item.itemDustMiessiite.name=硅灰石粉
+item.itemDustTinyMiessiite.name=小撮硅灰石粉
+item.itemDustSmallMiessiite.name=小堆硅灰石粉
+
+tile.OreComancheite.name=溴汞石矿石
+item.crushedComancheite.name=粉碎溴汞石矿石
+item.crushedCentrifugedComancheite.name=离心粉碎溴汞石矿石
+item.crushedPurifiedComancheite.name=纯净粉碎溴汞石矿石
+item.dustImpureComancheite.name=含杂溴汞石矿石
+item.dustPureComancheite.name=纯净溴汞石粉
+item.itemDustComancheite.name=溴汞石粉
+item.itemDustTinyComancheite.name=小撮溴汞石粉
+item.itemDustSmallComancheite.name=小堆溴汞石粉
+
+tile.OreKoboldite.name=妖金矿石
+item.crushedKoboldite.name=粉碎妖金矿石
+item.crushedCentrifugedKoboldite.name=离心粉碎妖金矿石
+item.crushedPurifiedKoboldite.name=纯净粉碎妖金矿石
+item.dustImpureKoboldite.name=含杂妖金粉
+item.dustPureKoboldite.name=纯净妖金粉
+item.itemDustKoboldite.name=妖金粉
+item.itemDustTinyKoboldite.name=小撮妖金粉
+item.itemDustSmallKoboldite.name=小堆妖金粉
+
+tile.OrePerroudite.name=溴硫银汞矿石
+item.crushedPerroudite.name=粉碎溴硫银汞矿石
+item.crushedCentrifugedPerroudite.name=离心溴硫银汞矿石
+item.crushedPurifiedPerroudite.name=纯净溴硫银汞矿石
+item.dustImpurePerroudite.name=含杂溴硫银汞粉
+item.dustPurePerroudite.name=纯净溴硫银汞粉
+item.itemDustPerroudite.name=溴硫银汞粉
+item.itemDustTinyPerroudite.name=小撮溴硫银汞粉
+item.itemDustSmallPerroudite.name=小堆溴硫银汞粉
+
+tile.OreDemicheleite.name=重闪石矿石
+item.crushedDemicheleite.name=粉碎重闪石矿石
+item.crushedCentrifugedDemicheleite.name=离心粉碎重闪石矿石
+item.crushedPurifiedDemicheleite.name=纯净粉碎重闪石矿石
+item.dustImpureDemicheleite.name=含杂重闪石粉
+item.dustPureDemicheleite.name=纯净重闪石粉
+item.itemDustDemicheleite.name=重闪石粉
+item.itemDustTinyDemicheleite.name=小撮重闪石粉
+item.itemDustSmallDemicheleite.name=小堆重闪石粉
+
+tile.OreAlburnite.name=铝尖晶石矿石
+item.crushedAlburnite.name=粉碎铝尖晶石矿石
+item.crushedCentrifugedAlburnite.name=离心粉碎铝尖晶石矿石
+item.crushedPurifiedAlburnite.name=纯净粉碎铝尖晶石矿石
+item.dustImpureAlburnite.name=含杂铝尖晶石粉
+item.dustPureAlburnite.name=纯净铝尖晶石粉
+item.itemDustAlburnite.name=铝尖晶石粉
+item.itemDustTinyAlburnite.name=小撮铝尖晶石粉
+item.itemDustSmallAlburnite.name=小堆铝尖晶石粉
+
+tile.OreLautarite.name=碘钙石矿石
+item.crushedLautarite.name=粉碎碘钙石矿石
+item.crushedCentrifugedLautarite.name=离心粉碎碘钙石矿石
+item.crushedPurifiedLautarite.name=纯净粉碎碘钙石矿石
+item.dustImpureLautarite.name=含杂碘钙石粉
+item.dustPureLautarite.name=纯净碘钙石粉
+item.itemDustLautarite.name=碘钙石粉
+item.itemDustTinyLautarite.name=小撮碘钙石粉
+item.itemDustSmallLautarite.name=小堆碘钙石粉
+
+tile.OreBariteRd.name=重晶石(Rd)矿石
+item.crushedBariteRd.name=粉碎重晶石(Rd)矿石
+item.crushedCentrifugedBariteRd.name=离心粉碎 重晶石(Rd)矿石
+item.crushedPurifiedBariteRd.name=纯净粉碎重晶石(Rd)矿石
+item.dustImpureBariteRd.name=含杂 重晶石(Rd)粉
+item.dustPureBariteRd.name=纯净 重晶石(Rd)粉
+item.itemDustBariteRd.name=重晶石(Rd)粉
+item.itemDustTinyBariteRd.name=小撮重晶石(Rd)粉
+item.itemDustSmallBariteRd.name=小堆重晶石(Rd)粉
+
+tile.OreHoneaite.name=碲化金铊矿石
+item.crushedHoneaite.name=粉碎碲化金铊矿石
+item.crushedCentrifugedHoneaite.name=离心粉碎碲化金铊矿石
+item.crushedPurifiedHoneaite.name=纯净粉碎碲化金铊矿石
+item.dustImpureHoneaite.name=含杂碲化金铊粉
+item.dustPureHoneaite.name=纯净碲化金铊粉
+item.itemDustHoneaite.name=碲化金铊粉
+item.itemDustTinyHoneaite.name=小撮碲化金铊粉
+item.itemDustSmallHoneaite.name=小堆碲化金铊粉
+
+tile.OreLafossaite.name=铊盐矿石
+item.crushedLafossaite.name=粉碎铊盐矿石
+item.crushedCentrifugedLafossaite.name=离心粉碎铊盐矿石
+item.crushedPurifiedLafossaite.name=纯净粉碎铊盐矿石
+item.dustImpureLafossaite.name=含杂铊盐粉
+item.dustPureLafossaite.name=纯净铊盐粉
+item.itemDustLafossaite.name=铊盐粉
+item.itemDustTinyLafossaite.name=小撮铊盐粉
+item.itemDustSmallLafossaite.name=小堆铊盐粉
+
+tile.OreKashinite.name=硫铑钛铜矿石
+item.crushedKashinite.name=粉碎硫铑钛铜矿石
+item.crushedCentrifugedKashinite.name=离心粉碎硫铑钛铜矿石
+item.crushedPurifiedKashinite.name=纯净粉碎硫铑钛铜矿石
+item.dustImpureKashinite.name=含杂硫铑钛铜粉
+item.dustPureKashinite.name=纯净硫铑钛铜粉
+item.itemDustKashinite.name=硫铑钛铜粉
+item.itemDustTinyKashinite.name=小撮硫铑钛铜粉
+item.itemDustSmallKashinite.name=小堆硫铑钛铜粉
+
+tile.OreRadioactiveMineralMix.name=奇异矿石
+item.crushedRadioactiveMineralMix.name=粉碎奇异矿石
+item.crushedCentrifugedRadioactiveMineralMix.name=离心粉碎奇异矿石
+item.crushedPurifiedRadioactiveMineralMix.name=纯净粉碎奇异矿石
+item.dustImpureRadioactiveMineralMix.name=含杂奇异粉
+item.dustPureRadioactiveMineralMix.name=纯净奇异粉
+item.itemDustRadioactiveMineralMix.name=奇异粉
+item.itemDustTinyRadioactiveMineralMix.name=小撮奇异粉
+item.itemDustSmallRadioactiveMineralMix.name=小堆奇异粉
+
+tile.OreDemicheleiteBr.name=重闪石(Br)矿石
+item.crushedDemicheleiteBr.name=粉碎重闪石(Br)矿石
+item.crushedCentrifugedDemicheleiteBr.name=离心粉碎重闪石(Br)矿石
+item.crushedPurifiedDemicheleiteBr.name=纯净粉碎重闪石(Br)矿石
+item.dustImpureDemicheleiteBr.name=含杂重闪石(Br)粉
+item.dustPureDemicheleiteBr.name=纯净重闪石(Br)粉
+item.itemDustDemicheleiteBr.name=重闪石(Br)粉
+
+
+//Materials
+
+item.itemIngotTitansteel.name=泰坦精钢
+item.itemHotIngotTitansteel.name=热泰坦精钢
+item.itemDustTitansteel.name=泰坦精钢粉
+item.itemDustTinyTitansteel.name=小撮泰坦精钢粉
+item.itemDustSmallTitansteel.name=小堆泰坦精钢粉
+item.itemNuggetTitansteel.name=泰坦精钢粒
+item.itemPlateTitansteel.name=泰坦精钢板
+item.itemPlateDoubleTitansteel.name=双重泰坦精钢板
+item.itemBoltTitansteel.name=泰坦精钢螺栓
+item.itemRodTitansteel.name=泰坦精钢杆
+item.itemRodLongTitansteel.name=长泰坦精钢杆
+item.itemRingTitansteel.name=泰坦精钢环
+item.itemScrewTitansteel.name=泰坦精钢螺丝
+item.itemRotorTitansteel.name=泰坦精钢转子
+item.itemGearTitansteel.name=泰坦精钢齿轮
+item.itemCellTitansteel.name=泰坦精钢单元
+tile.Block of Titansteel.name=泰坦精钢块
+tile.Titansteel Frame Box.name=泰坦精钢框架
+
+item.itemIngotOctiron.name=八角铁锭
+item.itemHotIngotOctiron.name=热八角铁锭
+item.itemDustOctiron.name=八角铁粉
+item.itemDustTinyOctiron.name=小撮八角铁粉
+item.itemDustSmallOctiron.name=小堆八角铁粉
+item.itemNuggetOctiron.name=八角铁粒
+item.itemPlateOctiron.name=八角铁板
+item.itemPlateDoubleOctiron.name=双重八角铁板
+item.itemBoltOctiron.name=八角铁螺栓
+item.itemRodOctiron.name=八角铁杆
+item.itemRodLongOctiron.name=长八角铁杆
+item.itemRingOctiron.name=八角铁环
+item.itemScrewOctiron.name=八角铁螺丝
+item.itemRotorOctiron.name=八角铁转子
+item.itemGearOctiron.name=八角铁齿轮
+item.itemCellOctiron.name=八角铁单元
+tile.Block of Octiron.name=八角铁块
+tile.Octiron Frame Box.name=八角铁框架
+
+item.itemIngotWatertightSteel.name=防水钢锭
+item.itemHotIngotWatertightSteel.name=热防水钢锭
+item.itemDustWatertightSteel.name=防水钢粉
+item.itemDustTinyWatertightSteel.name=小撮防水钢粉
+item.itemDustSmallWatertightSteel.name=小堆防水钢粉
+item.itemNuggetWatertightSteel.name=防水钢粒
+item.itemPlateWatertightSteel.name=防水钢板
+item.itemPlateDoubleWatertightSteel.name=双重防水钢板
+item.itemBoltWatertightSteel.name=防水钢螺栓
+item.itemRodWatertightSteel.name=防水钢杆
+item.itemRodLongWatertightSteel.name=长防水钢杆
+item.itemRingWatertightSteel.name=防水钢环
+item.itemScrewWatertightSteel.name=防水钢螺丝
+item.itemRotorWatertightSteel.name=防水钢转子
+item.itemGearWatertightSteel.name=防水钢齿轮
+item.itemCellWatertightSteel.name=防水钢单元
+tile.Block of Watertight Steel.name=防水钢块
+tile.Watertight Steel Frame Box.name=防水钢框架
+
+item.itemIngotCelestialTungsten.name=天体钨锭
+item.itemHotIngotCelestialTungsten.name=热天体钨锭
+item.itemDustCelestialTungsten.name=天体钨粉
+item.itemDustTinyCelestialTungsten.name=小撮天体钨粉
+item.itemDustSmallCelestialTungsten.name=小堆天体钨粉
+item.itemNuggetCelestialTungsten.name=天体钨粒
+item.itemPlateCelestialTungsten.name=天体钨板
+item.itemPlateDoubleCelestialTungsten.name=双重天体钨板
+item.itemBoltCelestialTungsten.name=天体钨螺栓
+item.itemRodCelestialTungsten.name=天体钨杆
+item.itemRodLongCelestialTungsten.name=长天体钨杆
+item.itemRingCelestialTungsten.name=天体钨环
+item.itemScrewCelestialTungsten.name=天体钨螺丝
+item.itemRotorCelestialTungsten.name=天体钨转子
+item.itemGearCelestialTungsten.name=天体钨齿轮
+item.itemCellCelestialTungsten.name=天体钨单元
+tile.Block of Celestial Tungsten.name=天体钨块
+tile.Celestial Tungsten Frame Box.name=天体钨框架
+
+item.itemIngotHypogen.name=海珀珍锭
+item.itemHotIngotHypogen.name=热海珀珍锭
+item.itemDustHypogen.name=海珀珍粉
+item.itemDustTinyHypogen.name=小撮海珀珍粉
+item.itemDustSmallHypogen.name=小堆海珀珍粉
+item.itemNuggetHypogen.name=海珀珍粒
+item.itemPlateHypogen.name=海珀珍板
+item.itemPlateDoubleHypogen.name=双重海珀珍板
+item.itemBoltHypogen.name=海珀珍螺栓
+item.itemRodHypogen.name=海珀珍杆
+item.itemRodLongHypogen.name=长海珀珍杆
+item.itemRingHypogen.name=海珀珍环
+item.itemScrewHypogen.name=海珀珍螺丝
+item.itemRotorHypogen.name=海珀珍转子
+item.itemGearHypogen.name=海珀珍齿轮
+item.itemCellHypogen.name=海珀珍单元
+tile.Block of Hypogen.name=海珀珍块
+tile.Hypogen Frame Box.name=海珀珍框架
+
+item.itemIngotArceusAlloy2B.name=阿尔宙斯合金2B锭
+item.itemHotIngotArceusAlloy2B.name=热阿尔宙斯合金2B锭
+item.itemDustArceusAlloy2B.name=阿尔宙斯合金2B粉
+item.itemDustTinyArceusAlloy2B.name=小撮阿尔宙斯合金2B粉
+item.itemDustSmallArceusAlloy2B.name=小堆阿尔宙斯合金2B粉
+item.itemNuggetArceusAlloy2B.name=阿尔宙斯合金2B粒
+item.itemPlateArceusAlloy2B.name=阿尔宙斯合金2B板
+item.itemPlateDoubleArceusAlloy2B.name=双重阿尔宙斯合金2B板
+item.itemBoltArceusAlloy2B.name=阿尔宙斯合金2B螺栓
+item.itemRodArceusAlloy2B.name=阿尔宙斯合金2B杆
+item.itemRodLongArceusAlloy2B.name=长阿尔宙斯合金2B杆
+item.itemRingArceusAlloy2B.name=阿尔宙斯合金2B环
+item.itemScrewArceusAlloy2B.name=阿尔宙斯合金2B螺丝
+item.itemRotorArceusAlloy2B.name=阿尔宙斯合金2B转子
+item.itemGearArceusAlloy2B.name=阿尔宙斯合金2B齿轮
+item.itemCellArceusAlloy2B.name=阿尔宙斯合金2B单元
+tile.Block of Arceus Alloy 2B.name=阿尔宙斯合金2B块
+tile.Arceus Alloy 2B Frame Box.name=阿尔宙斯合金2B框架
+
+item.itemIngotChromaticGlass.name=彩色玻璃锭
+item.itemHotIngotChromaticGlass.name=热彩色玻璃锭
+item.itemDustChromaticGlass.name=彩色玻璃粉
+item.itemDustTinyChromaticGlass.name=小撮彩色玻璃粉
+item.itemDustSmallChromaticGlass.name=小堆彩色玻璃粉
+item.itemNuggetChromaticGlass.name=彩色玻璃粒
+item.itemPlateChromaticGlass.name=彩色玻璃板
+item.itemPlateDoubleChromaticGlass.name=双重彩色玻璃板
+item.itemBoltChromaticGlass.name=彩色玻璃螺栓
+item.itemRodChromaticGlass.name=彩色玻璃杆
+item.itemRodLongChromaticGlass.name=长彩色玻璃杆
+item.itemRingChromaticGlass.name=彩色玻璃环
+item.itemScrewChromaticGlass.name=彩色玻璃螺丝
+item.itemRotorChromaticGlass.name=彩色玻璃转子
+item.itemGearChromaticGlass.name=彩色玻璃齿轮
+item.itemCellChromaticGlass.name=彩色玻璃单元
+tile.Block of Chromatic Glass.name=彩色玻璃块
+tile.Chromatic Glass Frame Box.name=彩色玻璃框架
+
+item.itemIngotAstralTitanium.name=星体钛锭
+item.itemHotIngotAstralTitanium.name=热星体钛锭
+item.itemDustAstralTitanium.name=星体钛粉
+item.itemDustTinyAstralTitanium.name=小撮星体钛粉
+item.itemDustSmallAstralTitanium.name=小堆星体钛粉
+item.itemNuggetAstralTitanium.name=星体钛粒
+item.itemPlateAstralTitanium.name=星体钛板
+item.itemPlateDoubleAstralTitanium.name=双重星体钛板
+item.itemBoltAstralTitanium.name=星体钛螺栓
+item.itemRodAstralTitanium.name=星体钛杆
+item.itemRodLongAstralTitanium.name=长星体钛杆
+item.itemRingAstralTitanium.name=星体钛环
+item.itemScrewAstralTitanium.name=星体钛螺丝
+item.itemRotorAstralTitanium.name=星体钛转子
+item.itemGearAstralTitanium.name=星体钛齿轮
+item.itemCellAstralTitanium.name=星体钛单元
+tile.Block of Astral Titanium.name=星体钛块
+tile.Astral Titanium Frame Box.name=星体钛框架
+
+item.itemIngotTungstenTitaniumCarbide.name=碳化钨钛合金锭
+item.itemHotIngotTungstenTitaniumCarbide.name=热碳化钨钛合金锭
+item.itemDustTungstenTitaniumCarbide.name=碳化钨钛合金粉
+item.itemDustTinyTungstenTitaniumCarbide.name=小撮碳化钨钛合金粉
+item.itemDustSmallTungstenTitaniumCarbide.name=小堆碳化钨钛合金粉
+item.itemNuggetTungstenTitaniumCarbide.name=碳化钨钛合金粒
+item.itemPlateTungstenTitaniumCarbide.name=碳化钨钛合金板
+item.itemPlateDoubleTungstenTitaniumCarbide.name=双重碳化钨钛合金板
+item.itemBoltTungstenTitaniumCarbide.name=碳化钨钛合金螺栓
+item.itemRodTungstenTitaniumCarbide.name=碳化钨钛合金杆
+item.itemRodLongTungstenTitaniumCarbide.name=长碳化钨钛合金杆
+item.itemRingTungstenTitaniumCarbide.name=碳化钨钛合金环
+item.itemScrewTungstenTitaniumCarbide.name=碳化钨钛合金螺丝
+item.itemRotorTungstenTitaniumCarbide.name=碳化钨钛合金转子
+item.itemGearTungstenTitaniumCarbide.name=碳化钨钛合金齿轮
+item.itemCellTungstenTitaniumCarbide.name=碳化钨钛合金单元
+tile.Block of Tungsten Titanium Carbide.name=碳化钨钛合金块
+tile.Tungsten Titanium Carbide Frame Box.name=碳化钨钛合金框架
+
+item.itemIngotNitinol60.name=镍钛诺60锭
+item.itemHotIngotNitinol60.name=热镍钛诺60锭
+item.itemDustNitinol60.name=镍钛诺60粉
+item.itemDustTinyNitinol60.name=小撮镍钛诺60粉
+item.itemDustSmallNitinol60.name=小堆镍钛诺60粉
+item.itemNuggetNitinol60.name=镍钛诺60粒
+item.itemPlateNitinol60.name=镍钛诺60板
+item.itemPlateDoubleNitinol60.name=双重镍钛诺60板
+item.itemBoltNitinol60.name=镍钛诺60螺栓
+item.itemRodNitinol60.name=镍钛诺60杆
+item.itemRodLongNitinol60.name=长镍钛诺60杆
+item.itemRingNitinol60.name=镍钛诺60环
+item.itemScrewNitinol60.name=镍钛诺60螺丝
+item.itemRotorNitinol60.name=镍钛诺60转子
+item.itemGearNitinol60.name=镍钛诺60齿轮
+item.itemCellNitinol60.name=镍钛诺60单元
+tile.Block of Nitinol 60.name=镍钛诺60块
+tile.Nitinol 60 Frame Box.name=镍钛诺60框架
+
+item.itemIngotAdvancedNitinol.name=高级镍钛诺锭
+item.itemHotIngotAdvancedNitinol.name=热高级镍钛诺锭
+item.itemDustAdvancedNitinol.name=高级镍钛诺粉
+item.itemDustTinyAdvancedNitinol.name=小撮高级镍钛诺粉
+item.itemDustSmallAdvancedNitinol.name=小堆高级镍钛诺粉
+item.itemNuggetAdvancedNitinol.name=高级镍钛诺粒
+item.itemPlateAdvancedNitinol.name=高级镍钛诺板
+item.itemPlateDoubleAdvancedNitinol.name=双重高级镍钛诺板
+item.itemBoltAdvancedNitinol.name=高级镍钛诺螺栓
+item.itemRodAdvancedNitinol.name=高级镍钛诺杆
+item.itemRodLongAdvancedNitinol.name=长高级镍钛诺杆
+item.itemRingAdvancedNitinol.name=高级镍钛诺环
+item.itemScrewAdvancedNitinol.name=高级镍钛诺螺丝
+item.itemRotorAdvancedNitinol.name=高级镍钛诺转子
+item.itemGearAdvancedNitinol.name=高级镍钛诺齿轮
+item.itemCellAdvancedNitinol.name=高级镍钛诺单元
+tile.Block of Advanced Nitinol.name=高级镍钛诺块
+tile.Advanced Nitinol Frame Box.name=高级镍钛诺框架
+
+item.itemIngotArcanite.name=奥金锭
+item.itemHotIngotArcanite.name=热奥金锭
+item.itemDustArcanite.name=奥金粉
+item.itemDustTinyArcanite.name=小撮奥金粉
+item.itemDustSmallArcanite.name=小堆奥金粉
+item.itemNuggetArcanite.name=奥金粒
+item.itemPlateArcanite.name=奥金板
+item.itemPlateDoubleArcanite.name=双重奥金板
+item.itemBoltArcanite.name=奥金螺栓
+item.itemRodArcanite.name=奥金杆
+item.itemRodLongArcanite.name=长奥金杆
+item.itemRingArcanite.name=奥金环
+item.itemScrewArcanite.name=奥金螺丝
+item.itemRotorArcanite.name=奥金转子
+item.itemGearArcanite.name=奥金齿轮
+item.itemCellArcanite.name=奥金单元
+tile.Block of Arcanite.name=奥金块
+tile.Arcanite Frame Box.name=奥金框架
+
+item.itemIngotPikyonium64B.name=皮卡优合金64B锭
+item.itemHotIngotPikyonium64B.name=热皮卡优合金64B锭
+item.itemDustPikyonium64B.name=皮卡优合金64B粉
+item.itemDustTinyPikyonium64B.name=小撮皮卡优合金64B粉
+item.itemDustSmallPikyonium64B.name=小堆皮卡优合金64B粉
+item.itemNuggetPikyonium64B.name=皮卡优合金64B粒
+item.itemPlatePikyonium64B.name=皮卡优合金64B板
+item.itemPlateDoublePikyonium64B.name=双重皮卡优合金64B板
+item.itemBoltPikyonium64B.name=皮卡优合金64B螺栓
+item.itemRodPikyonium64B.name=皮卡优合金64B杆
+item.itemRodLongPikyonium64B.name=长皮卡优合金64B杆
+item.itemRingPikyonium64B.name=皮卡优合金64B环
+item.itemScrewPikyonium64B.name=皮卡优合金64B螺丝
+item.itemRotorPikyonium64B.name=皮卡优合金64B转子
+item.itemGearPikyonium64B.name=皮卡优合金64B齿轮
+item.itemCellPikyonium64B.name=皮卡优合金64B单元
+tile.Block of Pikyonium 64B.name=皮卡优合金64B块
+tile.Pikyonium 64B Frame Box.name=皮卡优合金64B框架
+
+item.itemIngotCinobiteA243.name=西诺柏A243锭
+item.itemHotIngotCinobiteA243.name=热西诺柏A243锭
+item.itemDustCinobiteA243.name=西诺柏A243粉
+item.itemDustTinyCinobiteA243.name=小撮西诺柏A243粉
+item.itemDustSmallCinobiteA243.name=小堆西诺柏A243粉
+item.itemNuggetCinobiteA243.name=西诺柏A243粒
+item.itemPlateCinobiteA243.name=西诺柏A243板
+item.itemPlateDoubleCinobiteA243.name=双重西诺柏A243板
+item.itemBoltCinobiteA243.name=西诺柏A243螺栓
+item.itemRodCinobiteA243.name=西诺柏A243杆
+item.itemRodLongCinobiteA243.name=长西诺柏A243杆
+item.itemRingCinobiteA243.name=西诺柏A243环
+item.itemScrewCinobiteA243.name=西诺柏A243螺丝
+item.itemRotorCinobiteA243.name=西诺柏A243转子
+item.itemGearCinobiteA243.name=西诺柏A243齿轮
+item.itemCellCinobiteA243.name=西诺柏A243单元
+tile.Block of Cinobite A243.name=西诺柏A243块
+tile.Cinobite A243 Frame Box.name=西诺柏A243框架
+
+item.itemIngotLafiumCompound.name=路菲恩化合物锭
+item.itemHotIngotLafiumCompound.name=热路菲恩化合物锭
+item.itemDustLafiumCompound.name=路菲恩化合物粉
+item.itemDustTinyLafiumCompound.name=小撮路菲恩化合物粉
+item.itemDustSmallLafiumCompound.name=小堆路菲恩化合物粉
+item.itemNuggetLafiumCompound.name=路菲恩化合物粒
+item.itemPlateLafiumCompound.name=路菲恩化合物板
+item.itemPlateDoubleLafiumCompound.name=双重路菲恩化合物板
+item.itemBoltLafiumCompound.name=路菲恩化合物螺栓
+item.itemRodLafiumCompound.name=路菲恩化合物杆
+item.itemRodLongLafiumCompound.name=长路菲恩化合物杆
+item.itemRingLafiumCompound.name=路菲恩化合物环
+item.itemScrewLafiumCompound.name=路菲恩化合物螺丝
+item.itemRotorLafiumCompound.name=路菲恩化合物转子
+item.itemGearLafiumCompound.name=路菲恩化合物齿轮
+item.itemCellLafiumCompound.name=路菲恩化合物单元
+tile.Block of Lafium Compound.name=路菲恩化合物块
+tile.Lafium Compound Frame Box.name=路菲恩化合物框架
+
+item.itemIngotKoboldite.name=妖金锭
+item.itemHotIngotKoboldite.name=热妖金锭
+item.itemDustKoboldite.name=妖金粉
+item.itemDustTinyKoboldite.name=小撮妖金粉
+item.itemDustSmallKoboldite.name=小堆妖金粉
+item.itemNuggetKoboldite.name=妖金粒
+item.itemPlateKoboldite.name=妖金板
+item.itemPlateDoubleKoboldite.name=双重妖金板
+item.itemBoltKoboldite.name=妖金螺栓
+item.itemRodKoboldite.name=妖金杆
+item.itemRodLongKoboldite.name=长妖金杆
+item.itemRingKoboldite.name=妖金环
+item.itemScrewKoboldite.name=妖金螺丝
+item.itemRotorKoboldite.name=妖金转子
+item.itemGearKoboldite.name=妖金齿轮
+item.itemCellKoboldite.name=妖金单元
+tile.Block of Koboldite.name=妖金块
+tile.Koboldite Frame Box.name=妖金框架
+
+item.itemIngotAbyssalAlloy.name=深渊合金锭
+item.itemHotIngotAbyssalAlloy.name=热深渊合金锭
+item.itemDustAbyssalAlloy.name=深渊合金粉
+item.itemDustTinyAbyssalAlloy.name=小撮深渊合金粉
+item.itemDustSmallAbyssalAlloy.name=小堆深渊合金粉
+item.itemNuggetAbyssalAlloy.name=深渊合金粒
+item.itemPlateAbyssalAlloy.name=深渊合金板
+item.itemPlateDoubleAbyssalAlloy.name=双重深渊合金板
+item.itemBoltAbyssalAlloy.name=深渊合金螺栓
+item.itemRodAbyssalAlloy.name=深渊合金杆
+item.itemRodLongAbyssalAlloy.name=长深渊合金杆
+item.itemRingAbyssalAlloy.name=深渊合金环
+item.itemScrewAbyssalAlloy.name=深渊合金螺丝
+item.itemRotorAbyssalAlloy.name=深渊合金转子
+item.itemGearAbyssalAlloy.name=深渊合金齿轮
+item.itemCellAbyssalAlloy.name=深渊合金单元
+tile.Block of Abyssal Alloy.name=深渊合金块
+tile.Abyssal Alloy Frame Box.name=深渊合金框架
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//Radioactive
+item.dustTechnetium99M.name=锝99M粉
+item.dustTechnetium99.name=锝99粉
+item.dustMolybdenum99.name=钼99粉
+
+//Bags
+item.item.MysticBag.name=神秘袋
+item.item.Eatotron9000.name=埃托特洛尼克9000型
+item.item.ToolBox.name=工人的工具箱
+
+//Cells
+item.Bromine.name=溴单元
+item.Krypton.name=氪单元
+item.cryotheum.name=极寒之凛冰单元
+item.pyrotheum.name=烈焰之炽焱单元
+item.GeneticMutagen.name=诱变剂单元
+
+//Ingots
+item.itemHotIngotIncoloy020.name=热耐热铬铁合金-020锭
+item.itemHotIngotIncoloyDS.name=热耐热铬铁合金-DS锭
+item.itemHotIngotTalonite.name=热铬钴磷酸盐合金锭
+item.itemHotIngotHastelloyX.name=热哈斯特洛依合金-X锭
+item.itemHotIngotHastelloyW.name=热哈斯特洛依合金-W碳化物锭
+
+//Railcraft Fix
+item.railcraft.part.plate.lead.name=铅板
+
+//Ions
+item.particle.ion.Hydrogen.name=氢离子
+item.particle.ion.Helium.name=氦离子
+item.particle.ion.Lithium.name=锂离子
+item.particle.ion.Beryllium.name=铍离子
+item.particle.ion.Boron.name=硼离子
+item.particle.ion.Carbon.name=碳离子
+item.particle.ion.Nitrogen.name=氮离子
+item.particle.ion.Oxygen.name=氧离子
+item.particle.ion.Fluorine.name=氟离子
+item.particle.ion.Neon.name=氖离子
+item.particle.ion.Sodium.name=钠离子
+item.particle.ion.Magnesium.name=镁离子
+item.particle.ion.Aluminum.name=铝离子
+item.particle.ion.Silicon.name=硅离子
+item.particle.ion.Phosphorus.name=磷离子
+item.particle.ion.Sulfur.name=硫离子
+item.particle.ion.Chlorine.name=氯离子
+item.particle.ion.Argon.name=氩离子
+item.particle.ion.Potassium.name=钾离子
+item.particle.ion.Calcium.name=钙离子
+item.particle.ion.Scandium.name=钪离子
+item.particle.ion.Titanium.name=钛离子
+item.particle.ion.Vanadium.name=钒离子
+item.particle.ion.Chromium.name=铬离子
+item.particle.ion.Manganese.name=锰离子
+item.particle.ion.Iron.name=铁离子
+item.particle.ion.Cobalt.name=钴离子
+item.particle.ion.Nickel.name=镍离子
+item.particle.ion.Copper.name=铜离子
+item.particle.ion.Zinc.name=锌离子
+item.particle.ion.Gallium.name=镓离子
+item.particle.ion.Germanium.name=锗离子
+item.particle.ion.Arsenic.name=砷离子
+item.particle.ion.Selenium.name=硒离子
+item.particle.ion.Bromine.name=溴离子
+item.particle.ion.Krypton.name=氪离子
+item.particle.ion.Rubidium.name=铷离子
+item.particle.ion.Strontium.name=锶离子
+item.particle.ion.Yttrium.name=钇离子
+item.particle.ion.Zirconium.name=锆离子
+item.particle.ion.Niobium.name=铌离子
+item.particle.ion.Molybdenum.name=钼离子
+item.particle.ion.Technetium.name=锝离子
+item.particle.ion.Ruthenium.name=钌离子
+item.particle.ion.Rhodium.name=铑离子
+item.particle.ion.Palladium.name=钯离子
+item.particle.ion.Silver.name=银离子
+item.particle.ion.Cadmium.name=镉离子
+item.particle.ion.Indium.name=铟离子
+item.particle.ion.Tin.name=锡离子
+item.particle.ion.Antimony.name=锑离子
+item.particle.ion.Tellurium.name=碲离子
+item.particle.ion.Iodine.name=碘离子
+item.particle.ion.Xenon.name=氙离子
+item.particle.ion.Cesium.name=铯离子
+item.particle.ion.Barium.name=钡离子
+item.particle.ion.Lanthanum.name=镧离子
+item.particle.ion.Cerium.name=铈离子
+item.particle.ion.Praseodymium.name=镨离子
+item.particle.ion.Neodymium.name=钕离子
+item.particle.ion.Promethium.name=钷离子
+item.particle.ion.Samarium.name=钐离子
+item.particle.ion.Europium.name=铕离子
+item.particle.ion.Gadolinium.name=钆离子
+item.particle.ion.Terbium.name=铽离子
+item.particle.ion.Dysprosium.name=镝离子
+item.particle.ion.Holmium.name=钬离子
+item.particle.ion.Erbium.name=铒离子
+item.particle.ion.Thulium.name=铥离子
+item.particle.ion.Ytterbium.name=镱离子
+item.particle.ion.Lutetium.name=镏离子
+item.particle.ion.Hafnium.name=铪离子
+item.particle.ion.Tantalum.name=钽离子
+item.particle.ion.Tungsten.name=钨离子
+item.particle.ion.Rhenium.name=铼离子
+item.particle.ion.Osmium.name=锇离子
+item.particle.ion.Iridium.name=铱离子
+item.particle.ion.Platinum.name=铂离子
+item.particle.ion.Gold.name=金离子
+item.particle.ion.Mercury.name=汞离子
+item.particle.ion.Thallium.name=铊离子
+item.particle.ion.Lead.name=铅离子
+item.particle.ion.Bismuth.name=铋离子
+item.particle.ion.Polonium.name=钋离子
+item.particle.ion.Astatine.name=砹离子
+item.particle.ion.Radon.name=氡离子
+item.particle.ion.Francium.name=钫离子
+item.particle.ion.Radium.name=镭离子
+item.particle.ion.Actinium.name=锕离子
+item.particle.ion.Thorium.name=钍离子
+item.particle.ion.Protactinium.name=镤离子
+item.particle.ion.Uranium.name=铀离子
+item.particle.ion.Neptunium.name=镎离子
+item.particle.ion.Plutonium.name=钚离子
+item.particle.ion.Americium.name=镅离子
+item.particle.ion.Curium.name=锔离子
+item.particle.ion.Berkelium.name=锫离子
+item.particle.ion.Californium.name=锎离子
+item.particle.ion.Einsteinium.name=锿离子
+item.particle.ion.Fermium.name=镄离子
+item.particle.ion.Mendelevium.name=钔离子
+item.particle.ion.Nobelium.name=锘离子
+item.particle.ion.Lawrencium.name=铹离子
+item.particle.ion.Rutherfordium.name=离子
+item.particle.ion.Dubnium.name=离子
+item.particle.ion.Seaborgium.name=离子
+item.particle.ion.Bohrium.name=离子
+item.particle.ion.Hassium.name=离子
+item.particle.ion.Meitnerium.name=鿏离子
+item.particle.ion.Darmstadtium.name=离子
+item.particle.ion.Roentgenium.name=离子
+item.particle.ion.Copernicium.name=鿔离子
+item.particle.ion.Nihonium.name=鿭离子
+item.particle.ion.Flerovium.name=离子
+item.particle.ion.Moscovium.name=镆离子
+item.particle.ion.Livermorium.name=离子
+item.particle.ion.Tennessine.name=鿬离子
+item.particle.ion.Oganesson.name=鿫离子
+
+
+item.particle.base.Graviton.name=引力子
+item.particle.base.Up.name=上(u)夸克
+item.particle.base.Down.name=下(d)夸克
+item.particle.base.Charm.name=粲(c)夸克
+item.particle.base.Strange.name=奇(s)夸克
+item.particle.base.Top.name=顶(t)夸克
+item.particle.base.Bottom.name=底(b)夸克
+item.particle.base.Electron.name=电子
+item.particle.base.Electron Neutrino.name=电子中微子
+item.particle.base.Muon.name=μ子
+item.particle.base.Muon Neutrino.name=μ子中微子
+item.particle.base.Tau.name=τ子
+item.particle.base.Tau Neutrino.name=τ子中微子
+item.particle.base.Gluon.name=胶子
+item.particle.base.Photon.name=光子
+item.particle.base.Z Boson.name=Z玻色子
+item.particle.base.W Boson.name=W玻色子
+item.particle.base.Higgs Boson.name=希格斯玻色子
+item.particle.base.Proton.name=质子
+item.particle.base.Neutron.name=中子
+item.particle.base.Lambda.name=λ粒子
+item.particle.base.Omega.name=Ω粒子
+item.particle.base.Pion.name=介子
+item.particle.base.ETA Meson.name=η介子
+item.particle.base.Unknown.name=未知粒子
+
+//Added 12/1/19
+
+tile.playerDoorGlass.name=玻璃自动门
+tile.playerDoorCactus.name=仙人掌自动门
+tile.playerDoorIce.name=冰自动门
+tile.playerDoorIron.name=铁自动门
+tile.playerDoorWood.name=木自动门
+
+//Added 4/2/19
+
+item.GTPP.BattPack.06.name=充电工具包[LuV]
+item.GTPP.BattPack.07.name=充电工具包[ZPM]
+item.GTPP.BattPack.08.name=充电工具包[UV]
+item.GTPP.BattPack.09.name=充电工具包[MAX]
+
+
+//Added 13/3/19
+item.gtpp.debug.scanner.name=GT++Debug扫描器
+item.RawWaste.name=动物粪便单元
+item.ManureSlurry.name=粪浆单元
+item.FertileManureSlurry.name=肥沃的粪浆单元
+item.itemDustTinyDemicheleiteBr.name=小撮重闪石(Br)
+item.itemDustSmallDemicheleiteBr.name=小堆重闪石(Br)
+tile.blockPooCollector.name=农业下水道
+tile.Block of Lithium 7.name=锂7块
+
+//Added 14/3/19
+item.blood.name=血单元
+item.aniline.name=苯胺单元
+item.cadaverine.name=尸胺单元
+item.polyurethane.name=聚氨酯单元
+item.putrescine.name=腐胺单元
+item.cyclohexane.name=环己胺单元
+item.cyclohexanone.name=环己酮单元
+item.nitrobenzene.name=硝基苯单元
+item.ender.name=液体末影单元
+item.xpjuice.name=液体经验单元
+item.itemBombUnf.name=可投掷炸弹(未完成)
+item.itemBombCasing.name=炸弹框架
+item.gtpp.throwable.bomb.name=可投掷炸弹
+item.itemDetCable.name=炸弹保险丝
+tile.blockPooCollector.0.name=农业下水道
+tile.blockPooCollector.8.name=生物复合收集器
+item.itemIngotBakelite.name=电木锭
+item.itemDustBakelite.name=电木粉
+item.itemDustTinyBakelite.name=小撮电木粉
+item.itemDustSmallBakelite.name=小堆电木粉
+item.itemNuggetBakelite.name=电木粒
+item.itemPlateBakelite.name=电木板
+item.itemPlateDoubleBakelite.name=双重电木板
+item.itemCellBakelite.name=电木单元
+tile.Block of Bakelite.name=电木块
+item.itemIngotNylon.name=尼龙锭
+item.itemDustNylon.name=尼龙粉
+item.itemDustTinyNylon.name=小撮尼龙粉
+item.itemDustSmallNylon.name=小堆尼龙粉
+item.itemNuggetNylon.name=尼龙粒
+item.itemPlateNylon.name=尼龙板
+item.itemPlateDoubleNylon.name=双重尼龙板
+item.itemCellNylon.name=尼龙单元
+tile.Block of Nylon.name=尼龙块
+item.itemIngotTeflon.name=特氟龙锭
+item.itemDustTeflon.name=特氟龙粉
+item.itemDustTinyTeflon.name=小撮特氟龙粉
+item.itemDustSmallTeflon.name=小堆特氟龙粉
+item.itemNuggetTeflon.name=特氟龙粒
+item.itemPlateTeflon.name=特氟龙板
+item.itemPlateDoubleTeflon.name=双重特氟龙板
+item.itemCellTeflon.name=特氟龙单元
+tile.Block of Teflon.name=特氟龙块
+
+//Added 17/4/19
+//Spelling Corrections
+item.particle.ion.Aluminium.name=铝离子
+item.particle.ion.Caesium.name=铯离子
+
+item.GTPP.MonsterKiller.Enderman.name=末影人杀手
+item.GTPP.MonsterKiller.Spider.name=蜘蛛杀手
+item.GTPP.MonsterKiller.Skeleton.name=骷髅杀手
+item.GTPP.MonsterKiller.Creeper.name=爬行者杀手
+item.GTPP.MonsterKiller.Zombie.name=僵尸杀手
+item.GTPP.MonsterKiller.Hellish.name=下界生物杀手
+
+item.itemIngotRunite.name=虚恩锭
+item.itemDustRunite.name=虚恩粉
+item.itemDustTinyRunite.name=小撮虚恩粉
+item.itemDustSmallRunite.name=小堆虚恩粉
+item.itemNuggetRunite.name=虚恩锭
+item.itemPlateRunite.name=虚恩板
+item.itemPlateDoubleRunite.name=双重虚恩板
+item.itemCellRunite.name=虚恩单元
+tile.Block of Runite.name=虚恩块
+
+item.itemIngotDragonblood.name=龙血锭
+item.itemDustDragonblood.name=龙血粉
+item.itemDustTinyDragonblood.name=小撮龙血粉
+item.itemDustSmallDragonblood.name=小堆龙血粉
+item.itemNuggetDragonblood.name=龙血粒
+item.itemPlateDragonblood.name=龙血板
+item.itemPlateDoubleDragonblood.name=双重龙血板
+item.itemCellDragonblood.name=龙血单元
+tile.Block of Dragonblood.name=龙血块
+
+item.itemIngotBlackTitanium.name=黑钛锭
+item.itemDustBlackTitanium.name=黑钛粉
+item.itemDustTinyBlackTitanium.name=小撮黑钛粉
+item.itemDustSmallBlackTitanium.name=小堆黑钛粉
+item.itemNuggetBlackTitanium.name=黑钛粒
+item.itemPlateBlackTitanium.name=黑钛板
+item.itemPlateDoubleBlackTitanium.name=双重黑钛板
+item.itemCellBlackTitanium.name=黑钛单元
+tile.Block of Black Titanium.name=黑钛块
+
+item.itemIngotAncientGranite.name=古花岗岩锭
+item.itemHotIngotAncientGranite.name=热古花岗岩锭
+item.itemDustAncientGranite.name=古花岗岩粉
+item.itemDustTinyAncientGranite.name=小撮古花岗岩粉
+item.itemDustSmallAncientGranite.name=小堆古花岗岩粉
+item.itemNuggetAncientGranite.name=古花岗岩粒
+item.itemPlateAncientGranite.name=古花岗岩板
+item.itemPlateDoubleAncientGranite.name=双重古花岗岩板
+tile.Block of Ancient Granite.name=古花岗岩块
+
+item.itemIngotBabbitAlloy.name=巴氏合金锭
+item.itemHotIngotBabbitAlloy.name=热巴氏合金锭
+item.itemDustBabbitAlloy.name=巴氏合金粉
+item.itemDustTinyBabbitAlloy.name=小撮巴氏合金粉
+item.itemDustSmallBabbitAlloy.name=小堆巴氏合金粉
+item.itemNuggetBabbitAlloy.name=巴氏合金粒
+item.itemPlateBabbitAlloy.name=巴氏合金板
+item.itemPlateDoubleBabbitAlloy.name=双重巴氏合金板
+item.itemCellBabbitAlloy.name=巴氏合金单元
+tile.Block of Babbit Alloy.name=巴氏合金块
+
+item.itemIngotBlackMetal.name=黑物质锭
+item.itemHotIngotBlackMetal.name=热黑物质锭
+item.itemDustBlackMetal.name=黑物质粉
+item.itemDustTinyBlackMetal.name=小撮黑物质粉
+item.itemDustSmallBlackMetal.name=小堆黑物质粉
+item.itemNuggetBlackMetal.name=黑物质粒
+item.itemPlateBlackMetal.name=黑物质板
+item.itemPlateDoubleBlackMetal.name=双重黑物质板
+item.itemBoltBlackMetal.name=黑物质螺栓
+item.itemRodBlackMetal.name=黑物质杆
+item.itemRodLongBlackMetal.name=长黑物质杆
+item.itemRingBlackMetal.name=黑物质环
+item.itemScrewBlackMetal.name=黑物质螺丝
+item.itemRotorBlackMetal.name=黑物质转子
+item.itemGearBlackMetal.name=黑物质齿轮
+item.itemCellBlackMetal.name=黑物质单元
+tile.Block of Black Metal.name=黑物质块
+tile.Black Metal Frame Box.name=黑物质框架
+
+item.itemIngotWhiteMetal.name=白物质锭
+item.itemHotIngotWhiteMetal.name=热白物质锭
+item.itemDustWhiteMetal.name=白物质粉
+item.itemDustTinyWhiteMetal.name=小撮白物质粉
+item.itemDustSmallWhiteMetal.name=小堆白物质粉
+item.itemNuggetWhiteMetal.name=白物质粒
+item.itemPlateWhiteMetal.name=白物质板
+item.itemPlateDoubleWhiteMetal.name=双重白物质板
+item.itemBoltWhiteMetal.name=白物质螺栓
+item.itemRodWhiteMetal.name=白物质杆
+item.itemRodLongWhiteMetal.name=长白物质杆
+item.itemRingWhiteMetal.name=白物质环
+item.itemScrewWhiteMetal.name=白物质螺丝
+item.itemRotorWhiteMetal.name=白物质转子
+item.itemGearWhiteMetal.name=白物质齿轮
+item.itemCellWhiteMetal.name=白物质单元
+tile.Block of White Metal.name=白物质块
+tile.White Metal Frame Box.name=白物质框架
+
+//Added 29/04/2019
+tile.OreRunite.name=虚恩矿
+item.crushedRunite.name=粉碎的虚恩矿
+item.crushedCentrifugedRunite.name=离心的粉碎虚恩矿
+item.crushedPurifiedRunite.name=洗净的的粉碎虚恩矿
+item.dustImpureRunite.name=含杂虚恩粉
+item.dustPureRunite.name=洗净虚恩粉
+
+tile.OreAncientGranite.name=古花岗岩矿
+item.crushedAncientGranite.name=粉碎的古花岗岩矿
+item.crushedCentrifugedAncientGranite.name=离心的粉碎古花岗岩矿
+item.crushedPurifiedAncientGranite.name=洗净的粉碎古花岗岩矿
+item.dustImpureAncientGranite.name=含杂古花岗岩粉
+item.dustPureAncientGranite.name=洗净古花岗岩粉
+
+item.itemIngotRhugnor.name=鲁格诺锭
+item.itemDustRhugnor.name=鲁格诺粉
+item.itemDustTinyRhugnor.name=小撮鲁格诺粉
+item.itemDustSmallRhugnor.name=小堆鲁格诺粉
+item.itemNuggetRhugnor.name=鲁格诺粒
+item.itemPlateRhugnor.name=鲁格诺板
+item.itemPlateDoubleRhugnor.name=双重鲁格诺板
+item.itemCellRhugnor.name=鲁格诺单元
+tile.Block of Rhugnor.name=鲁格诺块
+
+
+
+
+//Added 13/5/19
+
+item.GTPP.BattPack.01.name=充电工具包[LV]
+item.GTPP.BattPack.02.name=充电工具包[MV]
+item.GTPP.BattPack.03.name=充电工具包[HV]
+item.GTPP.BattPack.04.name=充电工具包[EV]
+item.GTPP.BattPack.05.name=充电工具包[IV]
+item.IndustrialDiamondExquisite.name=精致的工业钻石
+
+item.itemSpringCelestialTungsten.name=天体钨弹簧
+item.itemSpringWhiteMetal.name=白物质弹簧
+item.itemSpringNitinol60.name=镍钛诺60弹簧
+item.itemSpringWatertightSteel.name=防水钢弹簧
+item.itemSpringEglinSteel.name=埃格林钢弹簧
+
+item.itemSmallSpringMaragingSteel250.name=小型马氏体时效钢250弹簧
+item.itemSmallSpringNichrome.name=小型镍铬合金弹簧
+item.itemSmallSpringStaballoy.name=小型贫铀合金弹簧
+item.itemSmallSpringBlackSteel.name=小型黑钢弹簧
+item.itemSmallSpringBlackTitanium.name=小型黑钛弹簧
+
+item.itemFineWireWhiteMetal.name=精致白物质导线
+item.itemFineWirePalladium.name=精致钯导线
+item.itemFineWireZirconium.name=精致锆导线
+item.itemFineWireGrisium.name=精致灰钛合金导线
+item.itemFineWireBabbitAlloy.name=精致巴氏合金导线
+item.itemFineWireKoboldite.name=精致妖金导线
+item.itemFineWireHG1223.name=精致HG-1223导线
+item.itemFineWireQuantum.name=精致量子导线
+
+item.itemHeavyPlatePotin.name=重型粗青铜板
+item.itemHeavyPlateWatertightSteel.name=重型防水钢板
+item.itemHeavyPlateBronze.name=重型青铜板
+item.itemHeavyPlateOsmiridium.name=重型铱锇合金板
+item.itemHeavyPlateQuantum.name=重型量子板
+item.itemHeavyPlateBlackSteel.name=重型黑钢板
+item.itemHeavyPlateStainlessSteel.name=重型不锈钢板
+item.itemHeavyPlateEglinSteel.name=重型埃格林钢板
+item.itemHeavyPlateMaragingSteel300.name=重型马氏体时效钢300板
+item.itemHeavyPlateTalonite.name=铬钴磷酸盐合金板
+item.itemHeavyPlateHypogen.name=重型海珀珍板
+item.itemHeavyPlateRhugnor.name=重型鲁格诺板
+item.itemHeavyPlateAdvancedNitinol.name=重型高级镍钛诺板
+item.itemHeavyPlateAstralTitanium.name=重型星体钛板
+item.itemHeavyPlateCelestialTungsten.name=重型天体钨板
+item.itemHeavyPlateWhiteMetal.name=重型白物质板
+item.itemHeavyPlateBlackMetal.name=重型黑物质板
+item.itemHeavyPlateAncientGranite.name=重型古花岗岩板
+
+item.GTPP.bauble.fireprotection.0.name=超级披萨手套
+
+
+//Added 16/5/19
+item.itemCellSeleniumDioxide.name=二氧化硒单元
+item.itemCellSeleniousAcid.name=亚硒酸单元
+
+//Added 25/7/19
+container.pestkiller=害虫杀手
+
+//Added 15/8/19
+gtpp.nei.decayables=可衰变箱子(铅封盒)
+entity.batKing.name=蝙蝠之王
+item.itemCellCarbyne.name=直链乙炔碳单元
+item.itemCellHydrogenCyanide.name=氢氰酸单元
+item.itemCactusCharcoal.name=仙人掌炭
+item.itemCactusCoke.name=仙人掌焦炭
+item.itemSugarCharcoal.name=糖炭
+item.itemSugarCoke.name=糖焦炭
+item.LiquidHydrogen.name=液氢单元[LOH]
+
+
+
+//Added 24/8/19
+//Debug Labels
+tile.blockDoorAlloy.name=防爆门
+tile.blockInhibitorObelisk.name=传送抑制方尖碑
+tile.Battlesign.name=战斗牌子
+tile.blockMagicBox.name=奥法之盒
+tile.blockManaPod.name=法力荚茎
+tile.buildToolBlock.name=工具方块
+tile.blockRedPlasma.name=红色等离子体方块
+tile.pipeBlock.name=管道
+item.null.name=Null Item report it on github
+
+
+//Added 24/8/19
+tile.OreGreenockite.name=硫镉矿石
+item.crushedGreenockite.name=粉碎的硫镉矿石
+item.crushedCentrifugedGreenockite.name=离心硫镉矿石
+item.crushedPurifiedGreenockite.name=洗净的硫镉矿石
+item.dustImpureGreenockite.name=含杂硫镉矿粉
+item.dustPureGreenockite.name=洁净硫镉矿粉
+item.itemDustGreenockite.name=硫镉矿粉
+item.itemDustTinyGreenockite.name=小撮硫镉矿粉
+item.itemDustSmallGreenockite.name=小堆硫镉矿粉
+
+tile.OreRareEarthI.name=稀土(I)矿石
+item.crushedRareEarthI.name=粉碎的稀土(I)矿石
+item.crushedCentrifugedRareEarthI.name=离心稀土(I)矿石
+item.crushedPurifiedRareEarthI.name=洗净的稀土(I)矿石
+item.dustImpureRareEarthI.name=含杂稀土(I)粉
+item.dustPureRareEarthI.name=洁净稀土(I)粉
+item.itemDustRareEarthI.name=稀土(I)粉
+item.itemDustTinyRareEarthI.name=小撮稀土(I)粉
+item.itemDustSmallRareEarthI.name=小堆稀土(I)粉
+
+tile.OreRareEarthII.name=稀土(II)矿石
+item.crushedRareEarthII.name=粉碎的稀土(II)矿石
+item.crushedCentrifugedRareEarthII.name=离心稀土(II)矿石
+item.crushedPurifiedRareEarthII.name=洗净的稀土(II)矿石
+item.dustImpureRareEarthII.name=含杂稀土(II)粉
+item.dustPureRareEarthII.name=洁净稀土(II)粉
+item.itemDustRareEarthII.name=稀土(II)粉
+item.itemDustTinyRareEarthII.name=小撮稀土(II)粉
+item.itemDustSmallRareEarthII.name=小堆稀土(II)粉
+
+tile.OreRareEarthIII.name=稀土(III)矿石
+item.crushedRareEarthIII.name=粉碎的稀土(III)矿石
+item.crushedCentrifugedRareEarthIII.name=离心稀土(III)矿石
+item.crushedPurifiedRareEarthIII.name=洗净的稀土(III)矿石
+item.dustImpureRareEarthIII.name=含杂稀土(III)粉
+item.dustPureRareEarthIII.name=洁净稀土(III)粉
+item.itemDustRareEarthIII.name=稀土(III)粉
+item.itemDustTinyRareEarthIII.name=小撮稀土(III)粉
+item.itemDustSmallRareEarthIII.name=小堆稀土(III)粉
+
+//Added 16/10/19
+item.BioRecipeSelector.name=编程生物电路
+item.FermentationBase.name=发酵基单元
+item.ureamix.name=尿素混合物单元
+item.liquidresin.name=液态树脂单元
+item.propionicacid.name=丙酸单元
+item.aceticacid.name=乙酸单元
+item.BasicAgrichemItem.0.name=藻类生物质
+item.BasicAgrichemItem.1.name=绿藻生物质
+item.BasicAgrichemItem.2.name=褐藻生物质
+item.BasicAgrichemItem.3.name=金褐藻生物质
+item.BasicAgrichemItem.4.name=红藻生物质
+item.BasicAgrichemItem.5.name=纤维素纤维
+item.BasicAgrichemItem.6.name=金褐纤维素纤维
+item.BasicAgrichemItem.7.name=红色纤维素纤维
+item.BasicAgrichemItem.8.name=堆肥
+item.BasicAgrichemItem.9.name=木颗粒
+item.BasicAgrichemItem.10.name=木砖
+item.BasicAgrichemItem.11.name=纤维素浆
+item.BasicAgrichemItem.12.name=粗制生物树脂
+item.BasicAgrichemItem.13.name=催化剂载体
+item.BasicAgrichemItem.14.name=绿色金属催化剂
+item.BasicAgrichemItem.15.name=藻酸
+item.BasicAgrichemItem.16.name=氧化铝
+item.BasicAgrichemItem.17.name=铝颗粒
+item.BasicAgrichemItem.18.name=铝酸钠
+item.BasicAgrichemItem.19.name=氢氧化钠
+item.BasicAgrichemItem.20.name=碳酸钠
+item.BasicAgrichemItem.21.name=氯化锂
+
+//Added 24/10/19
+item.butanol.name=丁醇单元
+
+//Try Fix IC2 Garbage vv
+fluidHotWater=热水
+fluidHotWater.name=热水
+//Try Fix IC2 Garbage ^^
+
+
+//Added 11/12/19
+item.itemHotIngotTitanium.name=热钛锭
+item.OilHeavy.name=重油单元
+item.UnsymmetricalDimethylhydrazine.name=偏二甲肼单元
+item.benzene.name=苯单元
+item.Benzene.name=苯单元
+item.phenol.name=苯酚单元
+item.CarbonDioxide.name=二氧化碳单元
+item.itemCellCarbonDioxide.name=二氧化碳单元
+item.CarbonMonoxide.name=一氧化碳单元
+item.itemCellCarbonMonoxide.name=一氧化碳单元
+item.acetone.name=丙酮单元
+item.saltwater.name=盐水单元
+item.BasicAgrichemItem.22.name=模具(颗粒)
+item.BasicAgrichemItem.23.name=洁净铝混合物
+
+//Added 12/12/19
+
+item.BasicGenericChemItem.0.name=红色金属催化剂
+item.BasicGenericChemItem.1.name=黄色金属催化剂
+item.BasicGenericChemItem.2.name=蓝色金属催化剂
+item.BasicGenericChemItem.3.name=橙色金属催化剂
+item.BasicGenericChemItem.4.name=紫色金属催化剂
+item.BasicGenericChemItem.5.name=棕色金属催化剂
+item.MudRedSlurry.name=红色泥浆单元
+item.liquid_toluene.name=甲苯单元
+
+//Added 17/01/20
+item.BasicGenericChemItem.6.name=粉色金属催化剂
+
+//Added 23/03/20
+item.BasicMetaFood.0.name=生人肉
+item.BasicMetaFood.1.name=熟人肉
+item.BasicMetaFood.2.name=生马肉
+item.BasicMetaFood.3.name=熟马肉
+item.BasicMetaFood.4.name=生狼肉
+item.BasicMetaFood.5.name=熟狼肉
+item.BasicMetaFood.6.name=生猫肉
+item.BasicMetaFood.7.name=熟猫肉
+item.BasicMetaFood.8.name=烈焰人肉
+
+item.itemCellNaquadahFuel.name=硅岩燃料单元
+item.itemCellEnrichedNaquadahFuel.name=富集硅岩燃料单元
+item.itemCellNaquadriaFuel.name=超能硅岩燃料单元
+item.boricacid.name=硼酸单元
+item.hydrochloricacid.name=盐酸单元
+
+item.BasicAlgaeItem.name=可培植藻类
+item.BasicAlgaeItem.0.name=可培植藻类(I)
+item.BasicAlgaeItem.1.name=可培植藻类(II)
+item.BasicAlgaeItem.2.name=可培植藻类(III)
+item.BasicAlgaeItem.3.name=可培植藻类(IV)
+item.BasicAlgaeItem.4.name=可培植藻类(V)
+item.BasicAlgaeItem.5.name=可培植藻类(VI)
+item.BasicAlgaeItem.6.name=可培植藻类(VII)
+
+//Added 30/03/20
+item.milledChalcopyrite.name=研磨黄铜矿
+item.milledSphalerite.name=研磨闪锌矿
+item.milledNickel.name=研磨镍矿
+item.milledPlatinum.name=研磨铂矿
+item.milledPentlandite.name=研磨镍黄铁矿
+item.FrothZincflotation.name=闪锌矿浮选泡沫单元
+item.FrothCopperflotation.name=黄铜矿浮选泡沫单元
+item.FrothNickelflotation.name=镍矿浮选泡沫单元
+item.FrothPlatinumflotation.name=铂矿浮选泡沫单元
+item.FrothPentlanditeflotation.name=镍黄铁矿浮选泡沫单元
+item.BasicGenericChemItem.7.name=铝研磨球
+item.BasicGenericChemItem.8.name=皂石研磨球
+
+//Added 31/03/20
+item.BasicGenericChemItem.9.name=乙醇钠粉
+item.BasicGenericChemItem.10.name=乙基黄原酸钠粉
+item.BasicGenericChemItem.11.name=乙基黄原酸钾粉
+item.BasicGenericChemItem.12.name=氢氧化钾粉
+item.CarbonDisulfide.name=二硫化碳单元
+item.HydrogenSulfide.name=硫化氢单元
+item.BasicAgrichemItem.24.name=松果
+item.BasicAgrichemItem.25.name=松树碎料
+item.pineoil.name=松油单元
+
+//Added 11/4/20
+item.milledRedstone.name=研磨红石矿
+item.milledSpessartine.name=研磨锰铝榴石
+item.milledGrossular.name=研磨钙铝榴石
+item.milledAlmandine.name=研磨铁铝榴石
+item.milledPyrope.name=研磨镁铝榴石
+item.FrothRedstoneflotation.name=红石矿浮选泡沫单元
+item.FrothSpessartineflotation.name=锰铝榴石浮选泡沫单元
+item.FrothGrossularflotation.name=钙铝榴石浮选泡沫单元
+item.FrothAlmandineflotation.name=铁铝榴石浮选泡沫单元
+item.FrothPyropeflotation.name=镁铝榴石浮选泡沫单元
+
+//Added 13/04/20
+item.T3RecipeSelector.name=突破编程电路
+
+//Added 03/05/20
+entity.miscutils.batKing.name=幽灵蝙蝠
+entity.miscutils.bigChickenFriendly.name=巨大的鸡
+entity.miscutils.AusDingo.name=澳洲野狗
+entity.miscutils.AusBoar.name=澳洲野猪
+entity.miscutils.AusSpider.name=森林蜘蛛
+entity.miscutils.AusOctopus.name=澳洲章鱼
+container.EggBox=鸡蛋孵化盒
+
+//Added 24/05/20
+container.VolumetricFlaskSetter=容量瓶配置器
+
+//Added 26/05/20
+item.itemIngotLaurenium.name=劳伦姆合金锭
+item.itemHotIngotLaurenium.name=热劳伦姆合金锭
+item.itemDustLaurenium.name=劳伦姆合金粉
+item.itemDustTinyLaurenium.name=小撮劳伦姆合金粉
+item.itemDustSmallLaurenium.name=小堆劳伦姆合金粉
+item.itemNuggetLaurenium.name=劳伦姆合金粒
+item.itemPlateLaurenium.name=劳伦姆合金板
+item.itemPlateDoubleLaurenium.name=双重劳伦姆合金板
+item.itemBoltLaurenium.name=劳伦姆合金螺栓
+item.itemRodLaurenium.name=劳伦姆合金杆
+item.itemRodLongLaurenium.name=长劳伦姆合金杆
+item.itemRingLaurenium.name=劳伦姆合金环
+item.itemScrewLaurenium.name=劳伦姆合金螺丝
+item.itemRotorLaurenium.name=劳伦姆合金转子
+item.itemGearLaurenium.name=劳伦姆合金齿轮
+item.itemCellLaurenium.name=劳伦姆合金单元
+tile.Block of Laurenium.name=劳伦姆合金块
+tile.Laurenium Frame Box.name=劳伦姆合金框架
+item.itemIngotBotmium.name=博特姆合金锭
+item.itemHotIngotBotmium.name=热博特姆合金锭
+item.itemDustBotmium.name=博特姆合金粉
+item.itemDustTinyBotmium.name=小撮博特姆合金粉
+item.itemDustSmallBotmium.name=小堆博特姆合金粉
+item.itemNuggetBotmium.name=博特姆合金粒
+item.itemPlateBotmium.name=博特姆合金板
+item.itemPlateDoubleBotmium.name=双重博特姆合金板
+item.itemBoltBotmium.name=博特姆合金螺栓
+item.itemRodBotmium.name=博特姆合金杆
+item.itemRodLongBotmium.name=长博特姆合金杆
+item.itemRingBotmium.name=博特姆合金环
+item.itemScrewBotmium.name=博特姆合金螺丝
+item.itemRotorBotmium.name=博特姆合金转子
+item.itemGearBotmium.name=博特姆合金齿轮
+item.itemCellBotmium.name=博特姆合金单元
+tile.Block of Botmium.name=博特姆合金块
+tile.Botmium Frame Box.name=博特姆合金框架
+
+//Added 29/05/20
+item.itemBasicTurbine.name=基础涡轮
+item.itemBasicTurbine_0.name=基础铁涡轮
+item.itemBasicTurbine_1.name=基础青铜涡轮
+item.itemBasicTurbine_2.name=基础钢涡轮
+
+interaction.voidexcess.enabled=启用过量销毁
+interaction.voidexcess.disabled=禁用过量销毁
+
+interaction.separateBusses.enabled=独立输入总线
+interaction.separateBusses.disabled=联合输入总线
+
+//Added 29/11/21
+
+item.BasicNuclearChemItem.0.name=铀渣混合物
+item.BasicNuclearChemItem.1.name=钚渣混合物
+item.BasicNuclearChemItem.2.name=氟盐渣混合物
+item.BasicNuclearChemItem.3.name=稀有渣混合物
+item.BasicNuclearChemItem.4.name=红藻生物质
+item.BasicNuclearChemItem.5.name=纤维素纤维
+item.BasicNuclearChemItem.6.name=金褐纤维素纤维
+item.BasicNuclearChemItem.7.name=红色纤维素纤维
+
+item.itemCellLiFBeF2ZrF4U235.name=熔盐单元[铀235复合氟化物]
+item.itemCellLiFBeF2ZrF4UF4.name=熔盐单元[铀锆复合氟化物]
+item.itemCellLiFBeF2ThF4UF4.name=熔盐单元[铀钍复合氟化物]
+item.Li2BeF2UF4.name=枯竭熔盐单元[Li2BeF2UF4]
+
+//Added 6/12/21
+item.itemCellLiFBeF2UF4FP.name=LiFBeF2UF4FP单元
+item.itemCellUF6F2.name=UF6F2单元
+item.itemCellLiFBeF2ThF4.name=LiFBeF2ThF4单元
+item.itemCellUF6F2FP.name=UF6F2FP单元
+item.dustProtactinium233.name=镤-233粉
+item.itemCellLiFThF4.name=LiFThF4单元
+item.NuclearWaste.name=核废水单元
+item.itemCellLiFBeF2UF4.name=LiFBeF2UF4单元
+item.itemCellSodiumFluoride.name=氟化钠单元
+item.itemCellLiFBeF2.name=LiFBeF2单元
+
+//Added 7/12/21
+item.itemCellDysprosium.name=镝单元
+item.itemCellThorium.name=钍单元
+item.itemCellTellurium.name=碲单元
+item.itemCellThorium232.name=钍-232单元
+item.itemCellLithiumTetrafluoroberyllate.name=四氟铍酸锂单元
+item.itemCellBurntReactorFuelI.name=枯竭熔盐单元[铀235复合氟化物]
+item.itemCellBurntReactorFuelII.name=枯竭熔盐单元[铀锆复合氟化物]
+item.itemDustTinyIndium.name=小撮铟粉
+item.itemDustSmallIndium.name=小堆铟粉
+item.itemDustIndium.name=铟粉
+item.itemDustTinyBerylliumHydroxide.name=小撮氢氧化铍粉
+item.itemDustSmallBerylliumHydroxide.name=小堆氢氧化铍粉
+item.itemDustBerylliumHydroxide.name=氢氧化铍粉
+item.itemDustTinyAmmoniumBifluoride.name=小撮氟化氢铵粉
+item.itemDustSmallAmmoniumBifluoride.name=小堆氟化氢铵粉
+item.itemDustAmmoniumBifluoride.name=氟化氢铵粉
+item.itemDustTinyAmmoniumTetrafluoroberyllate.name=小撮氟铍酸铵粉
+item.itemDustSmallAmmoniumTetrafluoroberyllate.name=小堆氟铍酸铵粉
+item.itemDustAmmoniumTetrafluoroberyllate.name=氟铍酸铵粉
+
+//Added 10/12/21
+item.ImpureLiFBeF2.name=含杂LiFBeF2单元
+item.itemCellHeliumSpargedLiFBeF2UF4FP.name=氦涤LiFBeF2UF4FP单元
+item.itemCellFluorineSpargedLiFThF4.name=氟涤LiFThF4单元
+item.itemCellFluorineSpargedLiFBeF2ThF4.name=氟涤LiFBeF2ThF4单元
+item.itemIngotHS188A.name=HS-188A锭
+item.itemHotIngotHS188A.name=热HS-188A锭
+item.itemDustHS188A.name=HS-188A粉
+item.itemDustTinyHS188A.name=小撮HS-188A粉
+item.itemDustSmallHS188A.name=小堆HS-188A粉
+item.itemNuggetHS188A.name=HS-188A粒
+item.itemPlateHS188A.name=HS-188A板
+item.itemPlateDoubleHS188A.name=双重HS-188A板
+item.itemBoltHS188A.name=HS-188A螺栓
+item.itemRodHS188A.name=HS-188A杆
+item.itemRodLongHS188A.name=长HS-188A杆
+item.itemRingHS188A.name=HS-188A环
+item.itemScrewHS188A.name=HS-188A螺丝
+item.itemRotorHS188A.name=HS-188A转子
+item.itemGearHS188A.name=HS-188A齿轮
+item.itemCellHS188A.name=HS-188A单元
+
+//Added 12/12/21
+item.itemIngotErbium.name=铒锭
+item.itemHotIngotErbium.name=热铒锭
+item.itemDustErbium.name=铒粉
+item.itemDustTinyErbium.name=小撮铒粉
+item.itemDustSmallErbium.name=小堆铒粉
+item.itemNuggetErbium.name=铒粒
+item.itemPlateErbium.name=铒板
+item.itemPlateDoubleErbium.name=双重铒板
+item.itemBoltErbium.name=铒螺栓
+item.itemRodErbium.name=铒杆
+item.itemRodLongErbium.name=长铒杆
+item.itemRingErbium.name=铒环
+item.itemScrewErbium.name=铒螺丝
+item.itemRotorErbium.name=铒转子
+item.itemGearErbium.name=铒齿轮
+item.itemCellErbium.name=铒单元
+item.itemIngotHeLiCoPtEr.name=HeLiCoPtEr锭
+item.itemHotIngotHeLiCoPtEr.name=热HeLiCoPtEr锭
+item.itemDustHeLiCoPtEr.name=HeLiCoPtEr粉
+item.itemDustTinyHeLiCoPtEr.name=小撮HeLiCoPtEr粉
+item.itemDustSmallHeLiCoPtEr.name=小堆HeLiCoPtEr粉
+item.itemNuggetHeLiCoPtEr.name=HeLiCoPtEr粒
+item.itemPlateHeLiCoPtEr.name=HeLiCoPtEr板
+item.itemPlateDoubleHeLiCoPtEr.name=双重HeLiCoPtEr板
+item.itemBoltHeLiCoPtEr.name=HeLiCoPtEr螺栓
+item.itemRodHeLiCoPtEr.name=HeLiCoPtEr杆
+item.itemRodLongHeLiCoPtEr.name=长HeLiCoPtEr杆
+item.itemRingHeLiCoPtEr.name=HeLiCoPtEr环
+item.itemScrewHeLiCoPtEr.name=HeLiCoPtEr螺丝
+item.itemRotorHeLiCoPtEr.name=HeLiCoPtEr转子
+item.itemGearHeLiCoPtEr.name=HeLiCoPtEr齿轮
+item.itemCellHeLiCoPtEr.name=HeLiCoPtEr单元
+item.itemIngotPraseodymium.name=镨锭
+item.itemHotIngotPraseodymium.name=热镨锭
+item.itemDustPraseodymium.name=镨粉
+item.itemDustTinyPraseodymium.name=小撮镨粉
+item.itemDustSmallPraseodymium.name=小堆镨粉
+item.itemNuggetPraseodymium.name=镨粒
+item.itemPlatePraseodymium.name=镨板
+item.itemPlateDoublePraseodymium.name=双重镨板
+item.itemBoltPraseodymium.name=镨螺栓
+item.itemRodPraseodymium.name=镨杆
+item.itemRodLongPraseodymium.name=长镨杆
+item.itemRingPraseodymium.name=镨环
+item.itemScrewPraseodymium.name=镨螺丝
+item.itemRotorPraseodymium.name=镨转子
+item.itemGearPraseodymium.name=镨齿轮
+item.itemCellPraseodymium.name=镨单元
+item.milledMonazite.name=研磨独居石
+item.FrothMonaziteflotation.name=独居石浮选泡沫单元
+
+//Added 18/12/21
+item.BasicGenericChemItem.13.name=甲醛催化剂
+item.hydrogenchloridemix.name=氢氯混合物
+
+//Added 19/01/22
+item.SunnariumBit.name=阳光化合物粒
+
+//Added 29/01/22
+sleep.event.okay=你睡得很香,现在感觉不错.
+sleep.event.good=你睡得很香,现在感觉好极了.
+sleep.event.wellrested=你得到了充分的休息.
+sleep.event.downsides=debuff不再困扰着你.
+item.miscutils:magicfeather.name=魔法羽毛
+
+//Added 10/02/22
+item.BasicGenericChemItem.14.name=固体酸催化剂
+
+//Added 30/05/22
+item.BasicGenericChemItem.15.name=无尽突变催化剂 \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/DevCapeHD.png b/gtpp/src/main/resources/assets/miscutils/textures/DevCapeHD.png
new file mode 100644
index 0000000000..f74bd8c9e3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/DevCapeHD.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/FancyCapeHD.png b/gtpp/src/main/resources/assets/miscutils/textures/FancyCapeHD.png
new file mode 100644
index 0000000000..d8da3ba76d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/FancyCapeHD.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/Orange.png b/gtpp/src/main/resources/assets/miscutils/textures/Orange.png
new file mode 100644
index 0000000000..9de164d437
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/Orange.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/OrangeHD.png b/gtpp/src/main/resources/assets/miscutils/textures/OrangeHD.png
new file mode 100644
index 0000000000..ea5e8af8cf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/OrangeHD.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/PatreonCapeHD.png b/gtpp/src/main/resources/assets/miscutils/textures/PatreonCapeHD.png
new file mode 100644
index 0000000000..c4ebef82b2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/PatreonCapeHD.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/TesterCapeHD.png b/gtpp/src/main/resources/assets/miscutils/textures/TesterCapeHD.png
new file mode 100644
index 0000000000..da3ee2e50f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/TesterCapeHD.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/Blank.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/Blank.png
new file mode 100644
index 0000000000..4d7beb8065
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/Blank.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png
new file mode 100644
index 0000000000..6514089c64
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png.mcmeta
new file mode 100644
index 0000000000..cba1c43271
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulator.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0,1,2,3,4,5,6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulatorStatic.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulatorStatic.png
new file mode 100644
index 0000000000..29b3a74f34
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricManipulatorStatic.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png
new file mode 100644
index 0000000000..14b5e673d0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png.mcmeta
new file mode 100644
index 0000000000..10cf8c6afd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCore.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCoreStatic.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCoreStatic.png
new file mode 100644
index 0000000000..53e0e51c06
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/CosmicFabricShieldingCoreStatic.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/FirePit/Firepit.tcn b/gtpp/src/main/resources/assets/miscutils/textures/blocks/FirePit/Firepit.tcn
new file mode 100644
index 0000000000..453b7325c8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/FirePit/Firepit.tcn
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/ForceFieldGlass.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/ForceFieldGlass.png
new file mode 100644
index 0000000000..ad6502026e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/ForceFieldGlass.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png
new file mode 100644
index 0000000000..c5d7fe80b2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png.mcmeta
new file mode 100644
index 0000000000..b0c531fa79
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulator.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulatorStatic.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulatorStatic.png
new file mode 100644
index 0000000000..40d9b8f31b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedManipulatorStatic.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png
new file mode 100644
index 0000000000..4e2e761fa8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png.mcmeta
new file mode 100644
index 0000000000..9720a23866
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCore.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCoreStatic.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCoreStatic.png
new file mode 100644
index 0000000000..c822112126
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/InfinityInfusedShieldingCoreStatic.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/Manipulator_Top.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/Manipulator_Top.png
new file mode 100644
index 0000000000..2a5b8aec95
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/Manipulator_Top.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png
new file mode 100644
index 0000000000..97c32e5988
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png.mcmeta
new file mode 100644
index 0000000000..cba1c43271
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulator.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0,1,2,3,4,5,6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulatorStatic.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulatorStatic.png
new file mode 100644
index 0000000000..29b3a74f34
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronPulseManipulatorStatic.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png
new file mode 100644
index 0000000000..9c14ae0abf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png.mcmeta
new file mode 100644
index 0000000000..163c81b6a1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCore.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCoreStatic.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCoreStatic.png
new file mode 100644
index 0000000000..d4cd1c1dee
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/NeutronShieldingCoreStatic.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png
new file mode 100644
index 0000000000..bb8bee0ce7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png.mcmeta
new file mode 100644
index 0000000000..163c81b6a1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCore.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCoreStatic.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCoreStatic.png
new file mode 100644
index 0000000000..ca38aad14f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeBendingCoreStatic.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png
new file mode 100644
index 0000000000..bb21d8af98
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png.mcmeta
new file mode 100644
index 0000000000..c8988534a9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipper.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0,1,2,3,4,5,6,7]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipperStatic.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipperStatic.png
new file mode 100644
index 0000000000..c54c56daaf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SpaceTimeContinuumRipperStatic.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/SwirlBigBlue.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SwirlBigBlue.png
new file mode 100644
index 0000000000..42202d8fae
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/SwirlBigBlue.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/CASING_AMAZON.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/CASING_AMAZON.png
new file mode 100644
index 0000000000..88d5cb9c72
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/CASING_AMAZON.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_bottom.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_bottom.png
new file mode 100644
index 0000000000..d1a5b4f1b0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_bottom.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_full.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_full.png
new file mode 100644
index 0000000000..b0c62a7b3d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_full.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_side.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_side.png
new file mode 100644
index 0000000000..b61a42b935
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_side.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_top.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_top.png
new file mode 100644
index 0000000000..0647c2105f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/DecayablesChest_top.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/Generic_Creative_Texture.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/Generic_Creative_Texture.png
new file mode 100644
index 0000000000..a9bed9ce0c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/Generic_Creative_Texture.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_CRYOGENIC.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_CRYOGENIC.png
new file mode 100644
index 0000000000..7222ca77d7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_CRYOGENIC.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_VOLCANUS.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_VOLCANUS.png
new file mode 100644
index 0000000000..eb7affaa01
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ADVANCED_VOLCANUS.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_CENTRIFUGE.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_CENTRIFUGE.png
new file mode 100644
index 0000000000..a650d73983
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_CENTRIFUGE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FARM_MANAGER_STRUCTURAL.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FARM_MANAGER_STRUCTURAL.png
new file mode 100644
index 0000000000..8a0391538b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FARM_MANAGER_STRUCTURAL.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FIREBOX_STABALLOY.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FIREBOX_STABALLOY.png
new file mode 100644
index 0000000000..22c7cd7978
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FIREBOX_STABALLOY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLOTATION.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLOTATION.png
new file mode 100644
index 0000000000..5965bfce89
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLOTATION.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLUID_INCOLOY_DS.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLUID_INCOLOY_DS.png
new file mode 100644
index 0000000000..eb8020f1c9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_FLUID_INCOLOY_DS.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GEARBOX_T1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GEARBOX_T1.png
new file mode 100644
index 0000000000..df4e3a1a41
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GEARBOX_T1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GRINDING_FACTORY.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GRINDING_FACTORY.png
new file mode 100644
index 0000000000..b807fc0465
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_GRINDING_FACTORY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_LAURENIUM.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_LAURENIUM.png
new file mode 100644
index 0000000000..02bd653538
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_LAURENIUM.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_PIPE_T1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_PIPE_T1.png
new file mode 100644
index 0000000000..1b942edfc9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_PIPE_T1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png
new file mode 100644
index 0000000000..bb27184e51
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png.mcmeta
new file mode 100644
index 0000000000..699d8280c3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_QFT_COIL.png.mcmeta
@@ -0,0 +1,39 @@
+{
+ "animation": {
+ "frametime": 2,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31
+ ]
+ }
+}
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ROCKETDYNE.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ROCKETDYNE.png
new file mode 100644
index 0000000000..89fed025b4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_ROCKETDYNE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_GRISIUM.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_GRISIUM.png
new file mode 100644
index 0000000000..4a8cbd634c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_GRISIUM.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_N.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_N.png
new file mode 100644
index 0000000000..fc2b8c5c89
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_N.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_X.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_X.png
new file mode 100644
index 0000000000..7753c1920a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_HASTELLOY_X.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_MARAGINGSTEEL.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_MARAGINGSTEEL.png
new file mode 100644
index 0000000000..75f21218d9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_MARAGINGSTEEL.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_POTIN.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_POTIN.png
new file mode 100644
index 0000000000..05f1cc1d42
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_POTIN.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_RED_STEEL.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_RED_STEEL.png
new file mode 100644
index 0000000000..066a926278
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_RED_STEEL.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_STELLITE.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_STELLITE.png
new file mode 100644
index 0000000000..9ba5c0e255
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_STELLITE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TALONITE.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TALONITE.png
new file mode 100644
index 0000000000..4b707d2ca2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TALONITE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TANTALLOY61.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TANTALLOY61.png
new file mode 100644
index 0000000000..64b28d0233
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TANTALLOY61.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_NAQUADAH_VENT.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_NAQUADAH_VENT.png
new file mode 100644
index 0000000000..6a5dba4448
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_NAQUADAH_VENT.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_TITANIUM.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_TITANIUM.png
new file mode 100644
index 0000000000..651c539c5b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TRINIUM_TITANIUM.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TUMBAGA.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TUMBAGA.png
new file mode 100644
index 0000000000..1d71c95ea4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_TUMBAGA.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZERON100.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZERON100.png
new file mode 100644
index 0000000000..d6cb89d67d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZERON100.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZIRCONIUM_CARBIDE.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZIRCONIUM_CARBIDE.png
new file mode 100644
index 0000000000..6c45ff313f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_CASING_STABLE_ZIRCONIUM_CARBIDE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_PESTKILLER_TOP.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_PESTKILLER_TOP.png
new file mode 100644
index 0000000000..2602f44af3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/MACHINE_PESTKILLER_TOP.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/STEAM_TURBINE_SIDE_ACTIVE.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/STEAM_TURBINE_SIDE_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/STEAM_TURBINE_SIDE_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/_PlaceHolder.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/_PlaceHolder.png
new file mode 100644
index 0000000000..9dc63e146e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/_PlaceHolder.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png
new file mode 100644
index 0000000000..d391da4eaf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_blue.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_blue.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_blue.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png
new file mode 100644
index 0000000000..9d454b17d4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_dimensional_cover_orange.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_lesu.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_lesu.png
new file mode 100644
index 0000000000..d5f23d447f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_lesu.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab.png
new file mode 100644
index 0000000000..5a4f23d3ea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active.png
new file mode 100644
index 0000000000..d40c95f3aa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png
new file mode 100644
index 0000000000..69330145ba
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png.mcmeta
new file mode 100644
index 0000000000..49e988e8bb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_active_animated.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png
new file mode 100644
index 0000000000..2af5057b3d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png.mcmeta
new file mode 100644
index 0000000000..49e988e8bb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_matterfab_animated.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_frequency.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_frequency.png
new file mode 100644
index 0000000000..fc9c6e5d8a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_frequency.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png
new file mode 100644
index 0000000000..695451fafc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png.mcmeta
new file mode 100644
index 0000000000..19b79a1e22
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_logo.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames":[{"index":0,"time":100},{"index":1,"time":3},{"index":2,"time":2},{"index":3,"time":3},0,1,2,3]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png
new file mode 100644
index 0000000000..7157b7541d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random1.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png
new file mode 100644
index 0000000000..7157b7541d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random2.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":2
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png
new file mode 100644
index 0000000000..7157b7541d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_screen_random3.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_uum.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_uum.png
new file mode 100644
index 0000000000..6a1894756d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_uum.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png
new file mode 100644
index 0000000000..c9663bf711
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_vent_rotating.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_water.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_water.png
new file mode 100644
index 0000000000..3351f5d0a6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/adv_machine_water.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/audio_out_active.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/audio_out_active.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/audio_out_active.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_charger.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_charger.png
new file mode 100644
index 0000000000..386f3c8e67
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_charger.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_crafting.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_crafting.png
new file mode 100644
index 0000000000..a61413240b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_crafting.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_discharge.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_discharge.png
new file mode 100644
index 0000000000..26b3b1e4c1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_discharge.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_conductor.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_conductor.png
new file mode 100644
index 0000000000..72e8c12c07
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_conductor.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_emitter.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_emitter.png
new file mode 100644
index 0000000000..148d5e4955
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/cover_redstone_emitter.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/dirt_podzol_top.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/dirt_podzol_top.png
new file mode 100644
index 0000000000..ebeda86aa0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/dirt_podzol_top.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/fishtrap.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/fishtrap.png
new file mode 100644
index 0000000000..a0767f7836
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/fishtrap.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_BOXES.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_BOXES.png
new file mode 100644
index 0000000000..553c674b58
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_BOXES.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_CROP.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_CROP.png
new file mode 100644
index 0000000000..f6dec1fccf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/OVERLAY_CROP.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_bottom.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_bottom.png
new file mode 100644
index 0000000000..ba45c43891
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_bottom.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top.png
new file mode 100644
index 0000000000..815ad92daf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top_crafting.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top_crafting.png
new file mode 100644
index 0000000000..a8b157975c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/machine_top_crafting.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/0.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/0.png
new file mode 100644
index 0000000000..10d882e13f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/1.png
new file mode 100644
index 0000000000..b4cf1ad1c5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/10.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/10.png
new file mode 100644
index 0000000000..5be386c991
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/10.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/11.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/11.png
new file mode 100644
index 0000000000..4d2770d6ea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/11.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/12.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/12.png
new file mode 100644
index 0000000000..dda5b9f70c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/12.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/13.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/13.png
new file mode 100644
index 0000000000..08083ce68d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/13.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/14.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/14.png
new file mode 100644
index 0000000000..d368a109ba
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/14.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/15.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/15.png
new file mode 100644
index 0000000000..974026d8c1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/15.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/16.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/16.png
new file mode 100644
index 0000000000..64797504ea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/16.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/17.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/17.png
new file mode 100644
index 0000000000..ed3ba22f03
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/17.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/18.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/18.png
new file mode 100644
index 0000000000..0822a9ff9e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/18.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/19.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/19.png
new file mode 100644
index 0000000000..d17c80290e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/19.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/2.png
new file mode 100644
index 0000000000..02b703dd72
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/20.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/20.png
new file mode 100644
index 0000000000..4d789dcd34
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/20.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/21.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/21.png
new file mode 100644
index 0000000000..1a86034ee6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/21.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/22.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/22.png
new file mode 100644
index 0000000000..5b614c2b75
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/22.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/23.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/23.png
new file mode 100644
index 0000000000..e5c64819ce
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/23.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/24.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/24.png
new file mode 100644
index 0000000000..9cd772a7bc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/24.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/25.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/25.png
new file mode 100644
index 0000000000..758f3a5925
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/25.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/26.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/26.png
new file mode 100644
index 0000000000..582a7226ea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/26.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/27.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/27.png
new file mode 100644
index 0000000000..bf8bee95fd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/27.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/28.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/28.png
new file mode 100644
index 0000000000..59ec6fc494
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/28.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/29.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/29.png
new file mode 100644
index 0000000000..0ebf3022a1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/29.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/3.png
new file mode 100644
index 0000000000..726b97e140
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/30.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/30.png
new file mode 100644
index 0000000000..a5b703fcd6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/30.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/31.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/31.png
new file mode 100644
index 0000000000..49b84b97a4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/31.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/32.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/32.png
new file mode 100644
index 0000000000..c6fd476b1a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/32.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/33.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/33.png
new file mode 100644
index 0000000000..0300e86059
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/33.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/34.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/34.png
new file mode 100644
index 0000000000..5ef3e61175
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/34.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/35.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/35.png
new file mode 100644
index 0000000000..8e077d1d7d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/35.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/36.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/36.png
new file mode 100644
index 0000000000..5aff3c93de
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/36.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/37.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/37.png
new file mode 100644
index 0000000000..c3cad83294
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/37.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/38.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/38.png
new file mode 100644
index 0000000000..87b3fb5225
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/38.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/39.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/39.png
new file mode 100644
index 0000000000..10798b86d8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/39.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/4.png
new file mode 100644
index 0000000000..ad834b3576
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/40.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/40.png
new file mode 100644
index 0000000000..ce6321458d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/40.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/41.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/41.png
new file mode 100644
index 0000000000..d5a2428eb1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/41.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/42.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/42.png
new file mode 100644
index 0000000000..70317dd7a7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/42.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/43.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/43.png
new file mode 100644
index 0000000000..3c61345b63
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/43.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/44.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/44.png
new file mode 100644
index 0000000000..764853abfa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/44.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/45.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/45.png
new file mode 100644
index 0000000000..7c7c30d998
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/45.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/46.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/46.png
new file mode 100644
index 0000000000..367a85067b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/46.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/47.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/47.png
new file mode 100644
index 0000000000..52de50d2b2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/47.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/48.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/48.png
new file mode 100644
index 0000000000..f283ec79b2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/48.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/49.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/49.png
new file mode 100644
index 0000000000..426c42b558
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/49.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/5.png
new file mode 100644
index 0000000000..011bee76c3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/50.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/50.png
new file mode 100644
index 0000000000..7b23d35271
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/50.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/51.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/51.png
new file mode 100644
index 0000000000..b930b49af3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/51.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/52.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/52.png
new file mode 100644
index 0000000000..6e73111695
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/52.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/53.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/53.png
new file mode 100644
index 0000000000..98d2cdb4c5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/53.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/54.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/54.png
new file mode 100644
index 0000000000..5db3a982ea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/54.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/55.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/55.png
new file mode 100644
index 0000000000..00b697cdf7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/55.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/56.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/56.png
new file mode 100644
index 0000000000..0464a70a58
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/56.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/57.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/57.png
new file mode 100644
index 0000000000..e70c013912
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/57.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/58.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/58.png
new file mode 100644
index 0000000000..e9938feff2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/58.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/59.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/59.png
new file mode 100644
index 0000000000..890f09f231
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/59.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/6.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/6.png
new file mode 100644
index 0000000000..42eeda7b4e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/60.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/60.png
new file mode 100644
index 0000000000..94db5b9946
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/60.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/61.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/61.png
new file mode 100644
index 0000000000..6efa02daf2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/61.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/62.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/62.png
new file mode 100644
index 0000000000..3983966fda
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/62.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/63.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/63.png
new file mode 100644
index 0000000000..7f14006fe7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/63.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/7.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/7.png
new file mode 100644
index 0000000000..edd4a94aee
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/8.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/8.png
new file mode 100644
index 0000000000..1a63ac762c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/9.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/9.png
new file mode 100644
index 0000000000..9964ac7486
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/ButtonPanel/9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/0.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/0.png
new file mode 100644
index 0000000000..aac94f4d6c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/1.png
new file mode 100644
index 0000000000..4571bca877
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/10.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/10.png
new file mode 100644
index 0000000000..2391919c11
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/10.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/100.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/100.png
new file mode 100644
index 0000000000..644ed36a90
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/100.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/101.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/101.png
new file mode 100644
index 0000000000..b67da08aed
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/101.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/102.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/102.png
new file mode 100644
index 0000000000..1d8c4e2490
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/102.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/103.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/103.png
new file mode 100644
index 0000000000..eace1e1e7e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/103.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/104.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/104.png
new file mode 100644
index 0000000000..e63d77edad
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/104.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/105.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/105.png
new file mode 100644
index 0000000000..63f45d2287
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/105.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/106.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/106.png
new file mode 100644
index 0000000000..6c571f8e58
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/106.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/107.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/107.png
new file mode 100644
index 0000000000..204a0aa231
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/107.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/108.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/108.png
new file mode 100644
index 0000000000..4c927a85f2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/108.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/109.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/109.png
new file mode 100644
index 0000000000..9fa6010d04
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/109.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/11.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/11.png
new file mode 100644
index 0000000000..ee82155436
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/11.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/110.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/110.png
new file mode 100644
index 0000000000..7bd92aaa6e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/110.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/111.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/111.png
new file mode 100644
index 0000000000..70a75f9600
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/111.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/112.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/112.png
new file mode 100644
index 0000000000..22220a9ba6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/112.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/113.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/113.png
new file mode 100644
index 0000000000..0d40f42170
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/113.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/114.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/114.png
new file mode 100644
index 0000000000..e4ea8065da
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/114.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/115.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/115.png
new file mode 100644
index 0000000000..43541eeeb2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/115.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/116.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/116.png
new file mode 100644
index 0000000000..c8d30df85a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/116.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/117.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/117.png
new file mode 100644
index 0000000000..349f3114af
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/117.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/118.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/118.png
new file mode 100644
index 0000000000..8f07eb15cc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/118.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/119.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/119.png
new file mode 100644
index 0000000000..bb75cda218
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/119.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/12.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/12.png
new file mode 100644
index 0000000000..907c77700e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/12.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/120.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/120.png
new file mode 100644
index 0000000000..7ca146e829
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/120.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/121.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/121.png
new file mode 100644
index 0000000000..52019a127f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/121.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/122.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/122.png
new file mode 100644
index 0000000000..0021064944
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/122.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/123.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/123.png
new file mode 100644
index 0000000000..16a2322abb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/123.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/124.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/124.png
new file mode 100644
index 0000000000..3728d698e5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/124.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/125.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/125.png
new file mode 100644
index 0000000000..338086ea34
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/125.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/126.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/126.png
new file mode 100644
index 0000000000..cf92e50fe1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/126.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/127.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/127.png
new file mode 100644
index 0000000000..44f46489f4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/127.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/128.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/128.png
new file mode 100644
index 0000000000..cd3d00ed5d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/128.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/129.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/129.png
new file mode 100644
index 0000000000..e15af0cd81
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/129.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/13.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/13.png
new file mode 100644
index 0000000000..16a9298fa0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/13.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/130.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/130.png
new file mode 100644
index 0000000000..236b4b80b9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/130.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/131.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/131.png
new file mode 100644
index 0000000000..2146a21dcb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/131.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/132.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/132.png
new file mode 100644
index 0000000000..8e6c4b7fab
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/132.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/133.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/133.png
new file mode 100644
index 0000000000..968baf1add
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/133.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/134.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/134.png
new file mode 100644
index 0000000000..5a9274232f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/134.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/135.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/135.png
new file mode 100644
index 0000000000..0fd7625761
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/135.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/136.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/136.png
new file mode 100644
index 0000000000..9f16c39367
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/136.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/137.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/137.png
new file mode 100644
index 0000000000..15eb15c7e0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/137.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/138.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/138.png
new file mode 100644
index 0000000000..4e86dfaf93
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/138.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/139.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/139.png
new file mode 100644
index 0000000000..790c0d4a74
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/139.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/14.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/14.png
new file mode 100644
index 0000000000..5c2827b117
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/14.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/140.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/140.png
new file mode 100644
index 0000000000..0a2f07d9fe
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/140.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/141.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/141.png
new file mode 100644
index 0000000000..6ad3543609
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/141.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/142.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/142.png
new file mode 100644
index 0000000000..65942b572f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/142.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/143.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/143.png
new file mode 100644
index 0000000000..7ee3b4c91d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/143.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/15.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/15.png
new file mode 100644
index 0000000000..8291c9a39c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/15.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/16.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/16.png
new file mode 100644
index 0000000000..2a8779fb61
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/16.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/17.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/17.png
new file mode 100644
index 0000000000..1ddd1f6ad5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/17.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/18.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/18.png
new file mode 100644
index 0000000000..ac0dcc3f76
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/18.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/19.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/19.png
new file mode 100644
index 0000000000..1d2101a43a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/19.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/2.png
new file mode 100644
index 0000000000..e412953793
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/20.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/20.png
new file mode 100644
index 0000000000..e5d71c3965
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/20.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/21.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/21.png
new file mode 100644
index 0000000000..ad8cb864ba
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/21.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/22.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/22.png
new file mode 100644
index 0000000000..751662e049
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/22.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/23.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/23.png
new file mode 100644
index 0000000000..142c713efe
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/23.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/24.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/24.png
new file mode 100644
index 0000000000..5e1097bf80
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/24.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/25.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/25.png
new file mode 100644
index 0000000000..391d12d2cd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/25.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/26.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/26.png
new file mode 100644
index 0000000000..5dc9635b3a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/26.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/27.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/27.png
new file mode 100644
index 0000000000..03fcb8285b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/27.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/28.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/28.png
new file mode 100644
index 0000000000..01d8912612
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/28.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/29.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/29.png
new file mode 100644
index 0000000000..7755b75e4a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/29.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/3.png
new file mode 100644
index 0000000000..cf3107aecd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/30.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/30.png
new file mode 100644
index 0000000000..fb1e7714cf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/30.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/31.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/31.png
new file mode 100644
index 0000000000..38e66ff784
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/31.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/32.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/32.png
new file mode 100644
index 0000000000..20083e41ae
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/32.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/33.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/33.png
new file mode 100644
index 0000000000..bbcd289595
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/33.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/34.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/34.png
new file mode 100644
index 0000000000..cb5c142713
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/34.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/35.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/35.png
new file mode 100644
index 0000000000..50e459ac1e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/35.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/36.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/36.png
new file mode 100644
index 0000000000..741ca3ac20
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/36.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/37.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/37.png
new file mode 100644
index 0000000000..64af38a224
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/37.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/38.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/38.png
new file mode 100644
index 0000000000..de2abc3646
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/38.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/39.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/39.png
new file mode 100644
index 0000000000..ff782c55c4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/39.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/4.png
new file mode 100644
index 0000000000..10de7d0317
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/40.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/40.png
new file mode 100644
index 0000000000..b35c8b37e3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/40.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/41.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/41.png
new file mode 100644
index 0000000000..1da7e74566
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/41.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/42.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/42.png
new file mode 100644
index 0000000000..aaab388552
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/42.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/43.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/43.png
new file mode 100644
index 0000000000..3581670fb5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/43.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/44.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/44.png
new file mode 100644
index 0000000000..d4422e227b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/44.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/45.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/45.png
new file mode 100644
index 0000000000..f24d8c84e3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/45.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/46.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/46.png
new file mode 100644
index 0000000000..7a32bac3cb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/46.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/47.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/47.png
new file mode 100644
index 0000000000..19667bb6be
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/47.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/48.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/48.png
new file mode 100644
index 0000000000..13d8bd9307
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/48.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/49.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/49.png
new file mode 100644
index 0000000000..5874834cf1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/49.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/5.png
new file mode 100644
index 0000000000..0a1c52ad33
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/50.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/50.png
new file mode 100644
index 0000000000..7d30aba7b6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/50.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/51.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/51.png
new file mode 100644
index 0000000000..63991ec562
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/51.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/52.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/52.png
new file mode 100644
index 0000000000..07824b69dc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/52.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/53.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/53.png
new file mode 100644
index 0000000000..e01ce3cb2e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/53.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/54.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/54.png
new file mode 100644
index 0000000000..0cc8baaf9a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/54.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/55.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/55.png
new file mode 100644
index 0000000000..dd20f55350
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/55.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/56.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/56.png
new file mode 100644
index 0000000000..8e5d6fc552
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/56.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/57.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/57.png
new file mode 100644
index 0000000000..cf867dbb2f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/57.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/58.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/58.png
new file mode 100644
index 0000000000..2986bea8f6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/58.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/59.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/59.png
new file mode 100644
index 0000000000..52f08e5a5b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/59.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/6.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/6.png
new file mode 100644
index 0000000000..2768d1935f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/60.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/60.png
new file mode 100644
index 0000000000..d27ed3ed00
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/60.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/61.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/61.png
new file mode 100644
index 0000000000..55f19a1f1b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/61.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/62.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/62.png
new file mode 100644
index 0000000000..588c573775
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/62.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/63.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/63.png
new file mode 100644
index 0000000000..761953786f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/63.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/64.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/64.png
new file mode 100644
index 0000000000..f863c2635e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/64.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/65.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/65.png
new file mode 100644
index 0000000000..a9052658b6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/65.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/66.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/66.png
new file mode 100644
index 0000000000..4b7af976a5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/66.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/67.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/67.png
new file mode 100644
index 0000000000..ac293cd370
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/67.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/68.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/68.png
new file mode 100644
index 0000000000..5ead585025
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/68.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/69.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/69.png
new file mode 100644
index 0000000000..74e2a6b31b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/69.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/7.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/7.png
new file mode 100644
index 0000000000..5fd2f744a9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/70.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/70.png
new file mode 100644
index 0000000000..b571a65158
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/70.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/71.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/71.png
new file mode 100644
index 0000000000..88a39782ac
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/71.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/72.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/72.png
new file mode 100644
index 0000000000..23752aea81
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/72.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/73.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/73.png
new file mode 100644
index 0000000000..8d74fb171f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/73.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/74.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/74.png
new file mode 100644
index 0000000000..946544c42d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/74.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/75.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/75.png
new file mode 100644
index 0000000000..f457d249da
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/75.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/76.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/76.png
new file mode 100644
index 0000000000..5fd30ed50f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/76.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/77.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/77.png
new file mode 100644
index 0000000000..c846c18e86
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/77.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/78.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/78.png
new file mode 100644
index 0000000000..91d8c1e291
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/78.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/79.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/79.png
new file mode 100644
index 0000000000..7f3bb56a09
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/79.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/8.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/8.png
new file mode 100644
index 0000000000..9f408b7dbf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/80.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/80.png
new file mode 100644
index 0000000000..60c0c9041e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/80.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/81.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/81.png
new file mode 100644
index 0000000000..62fde6b46c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/81.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/82.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/82.png
new file mode 100644
index 0000000000..b4885d28ed
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/82.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/83.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/83.png
new file mode 100644
index 0000000000..3e00f22271
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/83.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/84.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/84.png
new file mode 100644
index 0000000000..5350e00ac0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/84.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/85.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/85.png
new file mode 100644
index 0000000000..aab39c408c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/85.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/86.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/86.png
new file mode 100644
index 0000000000..6150482d1f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/86.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/87.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/87.png
new file mode 100644
index 0000000000..8f9a554135
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/87.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/88.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/88.png
new file mode 100644
index 0000000000..e8ef3944be
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/88.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/89.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/89.png
new file mode 100644
index 0000000000..0129fd6b32
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/89.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/9.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/9.png
new file mode 100644
index 0000000000..166abf574e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/90.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/90.png
new file mode 100644
index 0000000000..b7146ab582
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/90.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/91.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/91.png
new file mode 100644
index 0000000000..fd663e0718
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/91.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/92.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/92.png
new file mode 100644
index 0000000000..ff071f2eaa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/92.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/93.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/93.png
new file mode 100644
index 0000000000..bed5021da3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/93.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/94.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/94.png
new file mode 100644
index 0000000000..997fc2835f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/94.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/95.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/95.png
new file mode 100644
index 0000000000..78900cf455
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/95.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/96.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/96.png
new file mode 100644
index 0000000000..82cf7f8776
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/96.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/97.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/97.png
new file mode 100644
index 0000000000..8e1754bea8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/97.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/98.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/98.png
new file mode 100644
index 0000000000..e88435698c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/98.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/99.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/99.png
new file mode 100644
index 0000000000..77314ce820
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Display/99.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/off.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/off.png
new file mode 100644
index 0000000000..e24f9ff199
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/off.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/on.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/on.png
new file mode 100644
index 0000000000..6f4745f516
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Lamp/on.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/0.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/0.png
new file mode 100644
index 0000000000..99e41e3fbf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/1.png
new file mode 100644
index 0000000000..c1bf500e05
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/10.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/10.png
new file mode 100644
index 0000000000..5a196e3a1f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/10.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/11.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/11.png
new file mode 100644
index 0000000000..974338f8b9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/11.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/12.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/12.png
new file mode 100644
index 0000000000..ffb2619f16
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/12.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/13.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/13.png
new file mode 100644
index 0000000000..18889c5d4f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/13.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/14.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/14.png
new file mode 100644
index 0000000000..f2babfe8ef
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/14.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/15.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/15.png
new file mode 100644
index 0000000000..b6a47cab6c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/15.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/16.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/16.png
new file mode 100644
index 0000000000..fb19d35e39
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/16.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/17.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/17.png
new file mode 100644
index 0000000000..1f26a011ff
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/17.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/18.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/18.png
new file mode 100644
index 0000000000..38c8494bcb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/18.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/19.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/19.png
new file mode 100644
index 0000000000..f0a57c9542
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/19.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/2.png
new file mode 100644
index 0000000000..af2372797c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/20.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/20.png
new file mode 100644
index 0000000000..99bb2485b5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/20.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/21.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/21.png
new file mode 100644
index 0000000000..90c66a8a1e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/21.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/22.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/22.png
new file mode 100644
index 0000000000..43236b0090
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/22.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/23.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/23.png
new file mode 100644
index 0000000000..e7a9e84fc0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/23.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/24.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/24.png
new file mode 100644
index 0000000000..f15026ec0f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/24.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/25.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/25.png
new file mode 100644
index 0000000000..a1fd4d6c12
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/25.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/26.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/26.png
new file mode 100644
index 0000000000..650e2a28ea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/26.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/27.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/27.png
new file mode 100644
index 0000000000..a9a833c72a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/27.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/28.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/28.png
new file mode 100644
index 0000000000..297c509211
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/28.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/29.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/29.png
new file mode 100644
index 0000000000..bfa0569cb0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/29.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/3.png
new file mode 100644
index 0000000000..9238c4d418
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/30.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/30.png
new file mode 100644
index 0000000000..dac28502eb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/30.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/31.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/31.png
new file mode 100644
index 0000000000..c92456a0b9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/31.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/4.png
new file mode 100644
index 0000000000..4483223ff3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/5.png
new file mode 100644
index 0000000000..4bd0c30028
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/6.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/6.png
new file mode 100644
index 0000000000..af066c32cf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/7.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/7.png
new file mode 100644
index 0000000000..06742246f9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/8.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/8.png
new file mode 100644
index 0000000000..793f5b8b82
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/9.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/9.png
new file mode 100644
index 0000000000..53a53221cd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/gt4/redstone/Scale/9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine.png
new file mode 100644
index 0000000000..c594b58add
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine_dimensional.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine_dimensional.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/high_adv_machine_dimensional.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/log_acacia_top.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/log_acacia_top.png
new file mode 100644
index 0000000000..68b4e3e9c2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/log_acacia_top.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_bottom.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_bottom.png
new file mode 100644
index 0000000000..ba45c43891
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_bottom.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top.png
new file mode 100644
index 0000000000..bf6624a0b1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor.png
new file mode 100644
index 0000000000..3bd3092cc0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2.png
new file mode 100644
index 0000000000..e402d9b6d0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png
new file mode 100644
index 0000000000..975f4aed86
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor2_active.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":2
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png
new file mode 100644
index 0000000000..bf1cb0e6a5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_dieselmotor_active.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":2
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png
new file mode 100644
index 0000000000..3256b41734
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png
new file mode 100644
index 0000000000..3256b41734
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/machine_top_vent_rotating_fast.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png
new file mode 100644
index 0000000000..4878de8680
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png.mcmeta
new file mode 100644
index 0000000000..5e86a7cd5f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/overlay_rainbowscreen.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":8
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_sides.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_sides.png
new file mode 100644
index 0000000000..a8e497ec01
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_sides.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_top.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_top.png
new file mode 100644
index 0000000000..34d35b44e3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_adv_top.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_sides.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_sides.png
new file mode 100644
index 0000000000..1754172689
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_sides.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_top.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_top.png
new file mode 100644
index 0000000000..4835240aee
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/TileEntities/sewer_top.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockBlock.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockBlock.png
new file mode 100644
index 0000000000..1276f5fa24
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockBlock.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockFrameGt.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockFrameGt.png
new file mode 100644
index 0000000000..56a56cf752
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockFrameGt.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockMFEffect.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockMFEffect.png
new file mode 100644
index 0000000000..8e48e12070
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockMFEffect.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockStaballoy.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockStaballoy.png
new file mode 100644
index 0000000000..84a6b68e0e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockStaballoy.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockStone.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockStone.png
new file mode 100644
index 0000000000..87e19ff46b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/blockStone.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/CyberPanel.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/CyberPanel.png
new file mode 100644
index 0000000000..6761aa4773
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/CyberPanel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalFunnel.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalFunnel.png
new file mode 100644
index 0000000000..e52a1b11dc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalFunnel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalGrate.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalGrate.png
new file mode 100644
index 0000000000..b24e8657f8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalGrate.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalPanel.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalPanel.png
new file mode 100644
index 0000000000..2c56924c8b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalPanel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet.png
new file mode 100644
index 0000000000..223ae1cad3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet2.png
new file mode 100644
index 0000000000..951871ce12
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet8.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet8.png
new file mode 100644
index 0000000000..5307adb9f5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet9.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet9.png
new file mode 100644
index 0000000000..4862094cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/chrono/MetalSheet9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone1.png
new file mode 100644
index 0000000000..17010ff1a3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone2.png
new file mode 100644
index 0000000000..72befd9bfd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone3.png
new file mode 100644
index 0000000000..8af7fb854c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone4.png
new file mode 100644
index 0000000000..3def965ce9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone5.png
new file mode 100644
index 0000000000..b97c9add06
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/glowstone5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian1.png
new file mode 100644
index 0000000000..0970b27745
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian2.png
new file mode 100644
index 0000000000..6cf79c75c4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian3.png
new file mode 100644
index 0000000000..0cf85541e4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian4.png
new file mode 100644
index 0000000000..4d9c3d2f67
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian5.png
new file mode 100644
index 0000000000..149ae598d0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian_invert.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian_invert.png
new file mode 100644
index 0000000000..8c55fdddd3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/compressed/obsidian_invert.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.1.png
new file mode 100644
index 0000000000..8c5f1ec338
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.2.png
new file mode 100644
index 0000000000..75ff7b2558
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.3.png
new file mode 100644
index 0000000000..edcfc53edd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.4.png
new file mode 100644
index 0000000000..8176e98807
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.5.png
new file mode 100644
index 0000000000..0737748bb9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/crop/blockCrop.Hemp.5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png
new file mode 100644
index 0000000000..6ea5b4c515
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png.mcmeta
new file mode 100644
index 0000000000..70cc4d313c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Flow.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 6
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png
new file mode 100644
index 0000000000..7f1f2aa712
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png.mcmeta
new file mode 100644
index 0000000000..aa41c3d5c8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Cryotheum_Still.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 8,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png
new file mode 100644
index 0000000000..b24939367a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png.mcmeta
new file mode 100644
index 0000000000..7e77c64858
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Flow.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png
new file mode 100644
index 0000000000..3fb18d9c00
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png.mcmeta
new file mode 100644
index 0000000000..4fadce8aff
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Ender_Still.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 4,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png
new file mode 100644
index 0000000000..fa4fa813bf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png.mcmeta
new file mode 100644
index 0000000000..70cc4d313c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Flow.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 6
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png
new file mode 100644
index 0000000000..00355135df
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png.mcmeta
new file mode 100644
index 0000000000..aa41c3d5c8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Pyrotheum_Still.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 8,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png
new file mode 100644
index 0000000000..50414d57db
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png.mcmeta
new file mode 100644
index 0000000000..7e77c64858
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Flow.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png
new file mode 100644
index 0000000000..edf0166265
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png.mcmeta
new file mode 100644
index 0000000000..4fadce8aff
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluid/Fluid_Sludge_Still.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 4,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png
new file mode 100644
index 0000000000..b51346219b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png.mcmeta
new file mode 100644
index 0000000000..aa41c3d5c8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.cryotheum.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 8,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png
new file mode 100644
index 0000000000..3fb18d9c00
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png.mcmeta
new file mode 100644
index 0000000000..4fadce8aff
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.ender.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 4,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png
new file mode 100644
index 0000000000..003d1597a6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png.mcmeta
new file mode 100644
index 0000000000..4f0718ac96
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.flowing.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png
new file mode 100644
index 0000000000..512df7ce04
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png.mcmeta
new file mode 100644
index 0000000000..b8533e5109
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.still.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.still.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.fluid.autogenerated.still.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrofluoricacid.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrofluoricacid.png.mcmeta
new file mode 100644
index 0000000000..70cc4d313c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrofluoricacid.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 6
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrogenchloride.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrogenchloride.png.mcmeta
new file mode 100644
index 0000000000..7e77c64858
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.hydrogenchloride.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png
new file mode 100644
index 0000000000..a752755254
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png.mcmeta
new file mode 100644
index 0000000000..0df7234a79
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.jackdaniels.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":2
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.lithiumhydroxide.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.lithiumhydroxide.png.mcmeta
new file mode 100644
index 0000000000..eb608948b6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.lithiumhydroxide.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 16
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png
new file mode 100644
index 0000000000..ee40545a46
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png.mcmeta
new file mode 100644
index 0000000000..7ceb363941
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.molten.autogenerated.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 2,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png
new file mode 100644
index 0000000000..f0265d8ad2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png.mcmeta
new file mode 100644
index 0000000000..87c542d295
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.plasma.autogenerated.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.pyrotheum.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.pyrotheum.png.mcmeta
new file mode 100644
index 0000000000..aa41c3d5c8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.pyrotheum.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 8,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurdioxide.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurdioxide.png.mcmeta
new file mode 100644
index 0000000000..3fc1338d74
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurdioxide.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 12
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuricapatite.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuricapatite.png.mcmeta
new file mode 100644
index 0000000000..7e77c64858
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuricapatite.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuriclithium.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuriclithium.png.mcmeta
new file mode 100644
index 0000000000..eb608948b6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfuriclithium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 16
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurousacid.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurousacid.png.mcmeta
new file mode 100644
index 0000000000..70cc4d313c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.sulfurousacid.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 6
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.thoriumtetrafluoride.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.thoriumtetrafluoride.png.mcmeta
new file mode 100644
index 0000000000..f6730e30a9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.thoriumtetrafluoride.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumhexafluoride.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumhexafluoride.png.mcmeta
new file mode 100644
index 0000000000..f6730e30a9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumhexafluoride.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumtetrafluoride.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumtetrafluoride.png.mcmeta
new file mode 100644
index 0000000000..5169aabdc2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/fluids/fluid.uraniumtetrafluoride.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png
new file mode 100644
index 0000000000..d4e45d6adf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png.mcmeta
new file mode 100644
index 0000000000..76446714d8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_0.png.mcmeta
@@ -0,0 +1,38 @@
+{
+ "animation": {
+ "frames": [
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15
+ ]
+ }
+}
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png
new file mode 100644
index 0000000000..739abd1090
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png.mcmeta
new file mode 100644
index 0000000000..4f0718ac96
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/hellfire/blockHellFire_layer_1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_1.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_1.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_1.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_2.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_2.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_2.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_3.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_3.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_3.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_4.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_4.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_4.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_5.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_5.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_5.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_6.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_6.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_6.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_7.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_7.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_7.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_8.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_8.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_8.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_9.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_9.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_HP_ACTIVE_9.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_1.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_1.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_1.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_2.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_2.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_2.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_3.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_3.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_3.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_4.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_4.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_4.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_5.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_5.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_5.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_6.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_6.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_6.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_7.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_7.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_7.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_8.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_8.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_8.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_9.PNG.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_9.PNG.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/BigTurbine/LARGE_TURBINE_LP_ACTIVE_9.PNG.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_1.png
new file mode 100644
index 0000000000..9b82677382
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_10.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_10.png
new file mode 100644
index 0000000000..bb8649fabc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_10.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_11.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_11.png
new file mode 100644
index 0000000000..60ac4bce02
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_11.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_12.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_12.png
new file mode 100644
index 0000000000..f7e479652f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_12.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_2.png
new file mode 100644
index 0000000000..8d1e3f14e2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_3.png
new file mode 100644
index 0000000000..9f997cedf8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_4.png
new file mode 100644
index 0000000000..ff2c73964a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_5.png
new file mode 100644
index 0000000000..107d539765
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_6.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_6.png
new file mode 100644
index 0000000000..5dd516f5e2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_7.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_7.png
new file mode 100644
index 0000000000..eb8cd5882d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_8.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_8.png
new file mode 100644
index 0000000000..fa3e6027a7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_9.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_9.png
new file mode 100644
index 0000000000..ce258e3c13
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIII_9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png
new file mode 100644
index 0000000000..5102d575b8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_1.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png
new file mode 100644
index 0000000000..d65eb131f9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_10.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png
new file mode 100644
index 0000000000..675922fbdd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_11.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png
new file mode 100644
index 0000000000..e7e4a14d89
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_12.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png
new file mode 100644
index 0000000000..c561f4dafb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_2.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png
new file mode 100644
index 0000000000..4e40d05bb2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_3.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png
new file mode 100644
index 0000000000..ee33f024c5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_4.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png
new file mode 100644
index 0000000000..f7e843b7a3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_5.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png
new file mode 100644
index 0000000000..631a0c94c6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_6.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png
new file mode 100644
index 0000000000..64b1d5d8c8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_7.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png
new file mode 100644
index 0000000000..f51c6422b9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_8.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png
new file mode 100644
index 0000000000..7980eed80c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/FUSIONIV_9.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER1.png
new file mode 100644
index 0000000000..ce1c2ef3d8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER2.png
new file mode 100644
index 0000000000..84e1ac6350
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER3.png
new file mode 100644
index 0000000000..4f716e4c61
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER4.png
new file mode 100644
index 0000000000..fa9e98a6f5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER5.png
new file mode 100644
index 0000000000..6c05b315b6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER6.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER6.png
new file mode 100644
index 0000000000..d4a3888fe5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER7.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER7.png
new file mode 100644
index 0000000000..8346cccf41
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER8.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER8.png
new file mode 100644
index 0000000000..31bbffb4d4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER9.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER9.png
new file mode 100644
index 0000000000..0858b2d399
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png
new file mode 100644
index 0000000000..1bc399315d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png
new file mode 100644
index 0000000000..32ea4edd45
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE2.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png
new file mode 100644
index 0000000000..eb530ffb75
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE3.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.pdn b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.pdn
new file mode 100644
index 0000000000..3c8bbeb696
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.pdn
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png
new file mode 100644
index 0000000000..1050d78b01
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE4.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png
new file mode 100644
index 0000000000..b59c940f5e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE5.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png
new file mode 100644
index 0000000000..8bde3ca423
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE6.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png
new file mode 100644
index 0000000000..1b1b12db3b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE7.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png
new file mode 100644
index 0000000000..da672b0e24
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE8.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png
new file mode 100644
index 0000000000..f082c94c55
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/Grinder/GRINDER_ACTIVE9.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE1.png
new file mode 100644
index 0000000000..020ed28da8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE2.png
new file mode 100644
index 0000000000..12e321b7e9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE3.png
new file mode 100644
index 0000000000..c6d7715356
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE4.png
new file mode 100644
index 0000000000..7f21c841aa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE5.png
new file mode 100644
index 0000000000..3466822e04
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE6.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE6.png
new file mode 100644
index 0000000000..c1ae3ca1af
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE7.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE7.png
new file mode 100644
index 0000000000..a0263e4341
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE8.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE8.png
new file mode 100644
index 0000000000..26956df456
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE9.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE9.png
new file mode 100644
index 0000000000..f30b34fe4a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png
new file mode 100644
index 0000000000..288df82736
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png
new file mode 100644
index 0000000000..b8c344736e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE2.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png
new file mode 100644
index 0000000000..0ef17da006
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE3.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png
new file mode 100644
index 0000000000..07dd921123
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE4.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png
new file mode 100644
index 0000000000..49e957bc1f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE5.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png
new file mode 100644
index 0000000000..2dd6ca5a8e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE6.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png
new file mode 100644
index 0000000000..16091f0e18
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE7.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png
new file mode 100644
index 0000000000..698d96bf11
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE8.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png
new file mode 100644
index 0000000000..963d8b1a22
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png.mcmeta
new file mode 100644
index 0000000000..d746756cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/LARGECENTRIFUGE_ACTIVE9.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation":{}
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_3.png
new file mode 100644
index 0000000000..b0aa8bf5e5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png
new file mode 100644
index 0000000000..148b3e32c1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_4.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_II.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_II.png
new file mode 100644
index 0000000000..6322205460
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_II.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png
new file mode 100644
index 0000000000..722c9cbe39
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png.mcmeta
new file mode 100644
index 0000000000..a166f3972c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL_III.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":3,
+ "frames": [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_HYPER.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_HYPER.png
new file mode 100644
index 0000000000..cac33bb1f0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_HYPER.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_ULTRA.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_ULTRA.png
new file mode 100644
index 0000000000..0c9e529514
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_ULTRA.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_GENERIC.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_GENERIC.png
new file mode 100644
index 0000000000..8b3142daf4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_GENERIC.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_PIPE_GENERIC.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_PIPE_GENERIC.png
new file mode 100644
index 0000000000..6d8c956606
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/MACHINE_CASING_PIPE_GENERIC.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png
new file mode 100644
index 0000000000..110e9ee38f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_CATALYSTS.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_DATA_ORB.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_DATA_ORB.png
new file mode 100644
index 0000000000..f2bdf0ad4a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_DATA_ORB.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_MULTI_BUFFER.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_MULTI_BUFFER.png
new file mode 100644
index 0000000000..56b02d1914
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_MULTI_BUFFER.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png
new file mode 100644
index 0000000000..1fd61ede58
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png
new file mode 100644
index 0000000000..5433ee1ff2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..97596ba817
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ADVANCED_MULTIBLOCK_ANIMATED_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":2
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png
new file mode 100644
index 0000000000..b7b2bed6de
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png
new file mode 100644
index 0000000000..8c93e83d2d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..24f863c95e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ANIMATED_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":3
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png
new file mode 100644
index 0000000000..c7b22a7ef8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png.mcmeta
new file mode 100644
index 0000000000..5d86d73ad2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MILLING_BALL_BUS.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":5
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MUFFLER_ADV.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MUFFLER_ADV.png
new file mode 100644
index 0000000000..ce88198867
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_MUFFLER_ADV.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png
new file mode 100644
index 0000000000..edd4efbba9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png.mcmeta
new file mode 100644
index 0000000000..330653c04d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/OVERLAY_OVERFLOW_VALVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [3, 2, 1, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE.png
new file mode 100644
index 0000000000..c654bbe779
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png
new file mode 100644
index 0000000000..e9b05f8181
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png
new file mode 100644
index 0000000000..07b795be97
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE2.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png
new file mode 100644
index 0000000000..e1ad601839
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE3.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png
new file mode 100644
index 0000000000..f69d8cb0ec
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE4.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png
new file mode 100644
index 0000000000..f863ec49e6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE5.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png
new file mode 100644
index 0000000000..a61511d4c2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE6.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png
new file mode 100644
index 0000000000..73a0abe065
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE7.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png
new file mode 100644
index 0000000000..269ab80e3b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE8.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png
new file mode 100644
index 0000000000..54ac28edc8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE9.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL1.png
new file mode 100644
index 0000000000..34991094fd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL2.png
new file mode 100644
index 0000000000..50ce1abd9c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL3.png
new file mode 100644
index 0000000000..c4a02dcd25
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL4.png
new file mode 100644
index 0000000000..5955b40f1e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL5.png
new file mode 100644
index 0000000000..7fee9a77ad
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL6.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL6.png
new file mode 100644
index 0000000000..ff418776b6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL7.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL7.png
new file mode 100644
index 0000000000..59217da11f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL8.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL8.png
new file mode 100644
index 0000000000..3af9794005
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL9.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL9.png
new file mode 100644
index 0000000000..d121090176
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/SC_TURBINE_IDEL9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_EV.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_EV.png
new file mode 100644
index 0000000000..d70927f140
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_EV.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_HV.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_HV.png
new file mode 100644
index 0000000000..13310d6f57
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_HV.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_IV.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_IV.png
new file mode 100644
index 0000000000..7ef41870d4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_IV.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LV.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LV.png
new file mode 100644
index 0000000000..e42acc5c01
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LV.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LuV.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LuV.png
new file mode 100644
index 0000000000..440c987d6e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_LuV.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MAX.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MAX.png
new file mode 100644
index 0000000000..453cc94662
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MAX.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MV.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MV.png
new file mode 100644
index 0000000000..b1f29058ec
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_MV.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ULV.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ULV.png
new file mode 100644
index 0000000000..747adeb2e5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ULV.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_UV.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_UV.png
new file mode 100644
index 0000000000..23cc2c60c2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_UV.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ZPM.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ZPM.png
new file mode 100644
index 0000000000..230e78fe96
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/iconsets/TieredHulls/CASING_ZPM.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png
new file mode 100644
index 0000000000..1f53895490
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png.mcmeta
new file mode 100644
index 0000000000..0285ac2f3b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_A.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2,
+ "frames": [0, 2, 3, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png
new file mode 100644
index 0000000000..265d18b0f7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png.mcmeta
new file mode 100644
index 0000000000..d0b9e70fe5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_MAGIC_B.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":4,
+ "frames": [0, 2, 3, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_A.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_A.png
new file mode 100644
index 0000000000..8eeb0179d7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_A.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_B.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_B.png
new file mode 100644
index 0000000000..ffac706bbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_B.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_C.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_C.png
new file mode 100644
index 0000000000..87c6017569
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_C.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_D.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_D.png
new file mode 100644
index 0000000000..61d1f49a12
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_D.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_F.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_F.png
new file mode 100644
index 0000000000..548c0ec283
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_F.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_G.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_G.png
new file mode 100644
index 0000000000..172fab4657
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_G.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_H.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_H.png
new file mode 100644
index 0000000000..68ab46a03d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_H.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_I.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_I.png
new file mode 100644
index 0000000000..4443dc8024
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_METAL_PANEL_I.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png
new file mode 100644
index 0000000000..ed8ad55ba2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png.mcmeta
new file mode 100644
index 0000000000..ba9119c7ad
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_ORGANIC_PANEL_A_GLOWING.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":1,
+ "frames": [0, 2, 3, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_A.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_A.png
new file mode 100644
index 0000000000..eb3257c754
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_A.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_B.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_B.png
new file mode 100644
index 0000000000..3a1b683837
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_STONE_RED_B.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_A.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_A.png
new file mode 100644
index 0000000000..5bc352238f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_A.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_B.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_B.png
new file mode 100644
index 0000000000..32b6735a0d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_B.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_C.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_C.png
new file mode 100644
index 0000000000..946559cf4e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_C.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_A.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_A.png
new file mode 100644
index 0000000000..196600afdb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_A.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_B.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_B.png
new file mode 100644
index 0000000000..1bcd1ec78f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_B.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_C.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_C.png
new file mode 100644
index 0000000000..54381fcf21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_C.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_D.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_D.png
new file mode 100644
index 0000000000..0cf3f40762
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_D.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_H.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_H.png
new file mode 100644
index 0000000000..b4bc37fbda
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/metro/TEXTURE_TECH_PANEL_H.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox1.png
new file mode 100644
index 0000000000..05b752e0e7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox2.png
new file mode 100644
index 0000000000..231b6b17af
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox3.png
new file mode 100644
index 0000000000..88cb664c41
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox4.png
new file mode 100644
index 0000000000..a627b64eef
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox5.png
new file mode 100644
index 0000000000..9564596329
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox6.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox6.png
new file mode 100644
index 0000000000..1023b718cc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redox/redox6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/redstone/redstone_meter/top.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redstone/redstone_meter/top.png
new file mode 100644
index 0000000000..ba45c43891
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/redstone/redstone_meter/top.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/rendering/ForceField.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/rendering/ForceField.png
new file mode 100644
index 0000000000..32254623d1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/rendering/ForceField.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_1.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_1.png
new file mode 100644
index 0000000000..2d497c1f81
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_2.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_2.png
new file mode 100644
index 0000000000..efec483a20
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_3.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_3.png
new file mode 100644
index 0000000000..c6376014e2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_4.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_4.png
new file mode 100644
index 0000000000..55c42584ba
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_5.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_5.png
new file mode 100644
index 0000000000..6b2c6a77b1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_6.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_6.png
new file mode 100644
index 0000000000..446478f1de
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_7.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_7.png
new file mode 100644
index 0000000000..a8f51c0b68
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_8.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_8.png
new file mode 100644
index 0000000000..08afad396a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/special/block_8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine.png
new file mode 100644
index 0000000000..68949e5f47
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine_opaque.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine_opaque.png
new file mode 100644
index 0000000000..c7c0d6492f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_pine_opaque.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest.png
new file mode 100644
index 0000000000..ddccb0e4fa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest_opaque.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest_opaque.png
new file mode 100644
index 0000000000..96e756c22c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/leaves/leaves_rainforest_opaque.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine.png
new file mode 100644
index 0000000000..ae77894258
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine_top.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine_top.png
new file mode 100644
index 0000000000..146b0a99b6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_pine_top.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest.png
new file mode 100644
index 0000000000..3ff2ee2021
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest_top.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest_top.png
new file mode 100644
index 0000000000..99137b6f26
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/logs/log_rainforest_top.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_pine.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_pine.png
new file mode 100644
index 0000000000..f4c3ca84ac
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_pine.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_rainforest.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_rainforest.png
new file mode 100644
index 0000000000..93d414d695
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/trees/saplings/sapling_rainforest.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/blocks/workbench.png b/gtpp/src/main/resources/assets/miscutils/textures/blocks/workbench.png
new file mode 100644
index 0000000000..b40ad65c71
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/blocks/workbench.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/entity/golemStaballoy.png b/gtpp/src/main/resources/assets/miscutils/textures/entity/golemStaballoy.png
new file mode 100644
index 0000000000..307a25bd3f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/entity/golemStaballoy.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/entity/sickBlaze.png b/gtpp/src/main/resources/assets/miscutils/textures/entity/sickBlaze.png
new file mode 100644
index 0000000000..d2b36d633d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/entity/sickBlaze.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/enviroment/snow.png b/gtpp/src/main/resources/assets/miscutils/textures/enviroment/snow.png
new file mode 100644
index 0000000000..a91935ee0e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/enviroment/snow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/CircuitProgrammer.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/CircuitProgrammer.png
new file mode 100644
index 0000000000..8f77124bbb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/CircuitProgrammer.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/FishTrap.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/FishTrap.png
new file mode 100644
index 0000000000..35423fffb9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/FishTrap.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/PestKiller.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/PestKiller.png
new file mode 100644
index 0000000000..d1978ae04a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/PestKiller.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/ProjectTable.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/ProjectTable.png
new file mode 100644
index 0000000000..e8f65a6752
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/ProjectTable.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/SuperJukebox.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/SuperJukebox.png
new file mode 100644
index 0000000000..c50c0da4a5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/SuperJukebox.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/VolumetricFlaskSetter.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/VolumetricFlaskSetter.png
new file mode 100644
index 0000000000..08f9761233
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/VolumetricFlaskSetter.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/background/yellow.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/background/yellow.png
new file mode 100644
index 0000000000..a8139371ef
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/background/yellow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/button/standard_bronze.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/button/standard_bronze.png
new file mode 100644
index 0000000000..588f192622
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/button/standard_bronze.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/nei/decayables.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/nei/decayables.png
new file mode 100644
index 0000000000..d1827433a0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/nei/decayables.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/nei/widgets.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/nei/widgets.png
new file mode 100644
index 0000000000..0dc26c43e4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/nei/widgets.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/active_state.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/active_state.png
new file mode 100644
index 0000000000..c6d124f31d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/active_state.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/automation.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/automation.png
new file mode 100644
index 0000000000..409f62e59d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/automation.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom.png
new file mode 100644
index 0000000000..c3e0407f36
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom_gray.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom_gray.png
new file mode 100644
index 0000000000..67bfa33912
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/bottom_gray.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/change_mode.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/change_mode.png
new file mode 100644
index 0000000000..b3bd898ed6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/change_mode.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/east.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/east.png
new file mode 100644
index 0000000000..30beb06808
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/east.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/east_gray.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/east_gray.png
new file mode 100644
index 0000000000..7b59b1be61
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/east_gray.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush.png
new file mode 100644
index 0000000000..31b610f3b0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush_bronze.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush_bronze.png
new file mode 100644
index 0000000000..60c44a3257
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/flush_bronze.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_mode.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_mode.png
new file mode 100644
index 0000000000..d50a5d1ea6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_mode.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_toggle.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_toggle.png
new file mode 100644
index 0000000000..d69ecd279d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/harvester_toggle.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/lock.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/lock.png
new file mode 100644
index 0000000000..06bada79fb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/lock.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/north.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/north.png
new file mode 100644
index 0000000000..9fd2931c21
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/north.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/north_gray.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/north_gray.png
new file mode 100644
index 0000000000..70e87d7982
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/north_gray.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/plus_minus.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/plus_minus.png
new file mode 100644
index 0000000000..5b30875a90
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/plus_minus.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/south.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/south.png
new file mode 100644
index 0000000000..f8987686fa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/south.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/south_gray.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/south_gray.png
new file mode 100644
index 0000000000..923877cccb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/south_gray.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_green.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_green.png
new file mode 100644
index 0000000000..8b40306e54
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_green.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_red.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_red.png
new file mode 100644
index 0000000000..64779478ce
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/tip_red.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/top.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/top.png
new file mode 100644
index 0000000000..15fb9996ba
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/top.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/top_gray.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/top_gray.png
new file mode 100644
index 0000000000..c33ee088e0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/top_gray.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/west.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/west.png
new file mode 100644
index 0000000000..882c2452b9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/west.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/west_gray.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/west_gray.png
new file mode 100644
index 0000000000..5c2f9c4e1b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_button/west_gray.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow.png
new file mode 100644
index 0000000000..3e07d39df6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_4.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_4.png
new file mode 100644
index 0000000000..713dc41d35
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_blue.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_blue.png
new file mode 100644
index 0000000000..f6a005c782
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_blue.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_bronze.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_bronze.png
new file mode 100644
index 0000000000..77be0116af
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_bronze.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_cyan.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_cyan.png
new file mode 100644
index 0000000000..c896015c52
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_cyan.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_green.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_green.png
new file mode 100644
index 0000000000..c7ea4a206f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_green.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_magenta.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_magenta.png
new file mode 100644
index 0000000000..f83ff85b9e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_magenta.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_red.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_red.png
new file mode 100644
index 0000000000..f36fa57f59
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_red.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_yellow.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_yellow.png
new file mode 100644
index 0000000000..e12646f993
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/arrow_yellow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/blue.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/blue.png
new file mode 100644
index 0000000000..5074a409b9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/blue.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/canister_dark.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/canister_dark.png
new file mode 100644
index 0000000000..427e2983a9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/canister_dark.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/chest.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/chest.png
new file mode 100644
index 0000000000..021cb84f7a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/chest.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/coal.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/coal.png
new file mode 100644
index 0000000000..7beff5733a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/coal.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output.png
new file mode 100644
index 0000000000..c1b5418bf0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output_bronze.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output_bronze.png
new file mode 100644
index 0000000000..bb54e31684
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/craft_output_bronze.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/cyan.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/cyan.png
new file mode 100644
index 0000000000..6209845602
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/cyan.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/electric_tool.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/electric_tool.png
new file mode 100644
index 0000000000..b635a5439c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/electric_tool.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/fertilizer.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/fertilizer.png
new file mode 100644
index 0000000000..dcaa33eea6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/fertilizer.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/green.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/green.png
new file mode 100644
index 0000000000..b7f053ab7e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/green.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/ingot.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/ingot.png
new file mode 100644
index 0000000000..12b52fd10c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/ingot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/magenta.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/magenta.png
new file mode 100644
index 0000000000..92dde402e7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/magenta.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/page_printed_bronze.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/page_printed_bronze.png
new file mode 100644
index 0000000000..1fae314bd6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/page_printed_bronze.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park.png
new file mode 100644
index 0000000000..3485956d7d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park_bronze.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park_bronze.png
new file mode 100644
index 0000000000..cea3edeb4f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/park_bronze.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/red.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/red.png
new file mode 100644
index 0000000000..eee95dd0da
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/red.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/turbine.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/turbine.png
new file mode 100644
index 0000000000..e19f99076e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/turbine.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/weed_ex.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/weed_ex.png
new file mode 100644
index 0000000000..29cb47974f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/weed_ex.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/yellow.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/yellow.png
new file mode 100644
index 0000000000..f240ceac4f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/overlay_slot/yellow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/abs_non_alloy_recipes.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/abs_non_alloy_recipes.png
new file mode 100644
index 0000000000..74065e8cbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/abs_non_alloy_recipes.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/arrow_white_down.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/arrow_white_down.png
new file mode 100644
index 0000000000..68e6ea72b7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/arrow_white_down.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/electricity_error.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/electricity_error.png
new file mode 100644
index 0000000000..78a1a26bba
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/electricity_error.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/electricity_fine.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/electricity_fine.png
new file mode 100644
index 0000000000..786a49f565
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/electricity_fine.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/energy_frame.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/energy_frame.png
new file mode 100644
index 0000000000..2e52af075c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/energy_frame.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/redstone_circuit_screen.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/redstone_circuit_screen.png
new file mode 100644
index 0000000000..cde8dce299
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/redstone_circuit_screen.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/workbench_circle.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/workbench_circle.png
new file mode 100644
index 0000000000..cca05c1e75
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/picture/workbench_circle.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/arrow_2.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/arrow_2.png
new file mode 100644
index 0000000000..5dab4e96a7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/arrow_2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/boiler_empty.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/boiler_empty.png
new file mode 100644
index 0000000000..6d7ef52c9a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/boiler_empty.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/fluid_reactor.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/fluid_reactor.png
new file mode 100644
index 0000000000..0db40a1fd1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/fluid_reactor.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/fuel.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/fuel.png
new file mode 100644
index 0000000000..247db50690
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/fuel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/pss_energy.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/pss_energy.png
new file mode 100644
index 0000000000..0e6fbe1722
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/progressbar/pss_energy.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/blue.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/blue.png
new file mode 100644
index 0000000000..74ef43ecf0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/blue.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/cyan.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/cyan.png
new file mode 100644
index 0000000000..35c18aefff
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/cyan.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/green.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/green.png
new file mode 100644
index 0000000000..051dda9b2b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/green.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/item_yellow.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/item_yellow.png
new file mode 100644
index 0000000000..319c925232
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/item_yellow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/magenta.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/magenta.png
new file mode 100644
index 0000000000..91da1181fb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/magenta.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/red.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/red.png
new file mode 100644
index 0000000000..82c4511c43
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/red.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/yellow.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/yellow.png
new file mode 100644
index 0000000000..b77f186c5b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/slot/yellow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/tab/title_angular_yellow.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/tab/title_angular_yellow.png
new file mode 100644
index 0000000000..fd373e2c85
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/tab/title_angular_yellow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/tab/title_dark_yellow.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/tab/title_dark_yellow.png
new file mode 100644
index 0000000000..08c27f65e4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/tab/title_dark_yellow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/gui/tab/title_yellow.png b/gtpp/src/main/resources/assets/miscutils/textures/gui/tab/title_yellow.png
new file mode 100644
index 0000000000..e0c53c75ae
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/gui/tab/title_yellow.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/0.png
new file mode 100644
index 0000000000..4a7c1ce427
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/1.png
new file mode 100644
index 0000000000..4a7c1ce427
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/10.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/10.png
new file mode 100644
index 0000000000..bf81a1b4b2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/10.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/100.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/100.png
new file mode 100644
index 0000000000..cedee004e4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/100.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png
new file mode 100644
index 0000000000..c23772f461
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/105.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/106.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/106.png
new file mode 100644
index 0000000000..b3b257e59c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/106.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/107.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/107.png
new file mode 100644
index 0000000000..3d47ce434c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/107.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/108.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/108.png
new file mode 100644
index 0000000000..2b99670ea1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/108.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/109.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/109.png
new file mode 100644
index 0000000000..e516903d26
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/109.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/11.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/11.png
new file mode 100644
index 0000000000..bf81a1b4b2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/11.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/110.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/110.png
new file mode 100644
index 0000000000..97767a73c6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/110.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/111.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/111.png
new file mode 100644
index 0000000000..3147037815
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/111.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/112.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/112.png
new file mode 100644
index 0000000000..dce530370f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/112.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/113.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/113.png
new file mode 100644
index 0000000000..0c85939327
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/113.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/114.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/114.png
new file mode 100644
index 0000000000..b3c3716abb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/114.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/115.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/115.png
new file mode 100644
index 0000000000..a9a9c6fcee
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/115.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/12.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/12.png
new file mode 100644
index 0000000000..051b45e6bc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/12.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/13.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/13.png
new file mode 100644
index 0000000000..051b45e6bc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/13.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/14.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/14.png
new file mode 100644
index 0000000000..051b45e6bc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/14.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/140.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/140.png
new file mode 100644
index 0000000000..8b38dcd9ce
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/140.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/141.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/141.png
new file mode 100644
index 0000000000..53682976a8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/141.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/142.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/142.png
new file mode 100644
index 0000000000..8a21902982
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/142.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/143.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/143.png
new file mode 100644
index 0000000000..81f418e1a8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/143.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/144.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/144.png
new file mode 100644
index 0000000000..2e66f92a2c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/144.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/145.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/145.png
new file mode 100644
index 0000000000..61a783176e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/145.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/146.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/146.png
new file mode 100644
index 0000000000..16a79d6896
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/146.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/147.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/147.png
new file mode 100644
index 0000000000..4b39623750
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/147.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/148.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/148.png
new file mode 100644
index 0000000000..fbe1b9ac82
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/148.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/149.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/149.png
new file mode 100644
index 0000000000..5979772ace
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/149.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/15.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/15.png
new file mode 100644
index 0000000000..051b45e6bc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/15.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/150.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/150.png
new file mode 100644
index 0000000000..254680aff4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/150.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/151.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/151.png
new file mode 100644
index 0000000000..29ba464570
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/151.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/152.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/152.png
new file mode 100644
index 0000000000..f26db362f0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/152.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/16.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/16.png
new file mode 100644
index 0000000000..5ddb32de79
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/16.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/160.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/160.png
new file mode 100644
index 0000000000..fa7f814d3a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/160.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/161.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/161.png
new file mode 100644
index 0000000000..673c6e011b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/161.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/17.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/17.png
new file mode 100644
index 0000000000..5ddb32de79
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/17.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/18.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/18.png
new file mode 100644
index 0000000000..5ddb32de79
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/18.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/19.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/19.png
new file mode 100644
index 0000000000..5ddb32de79
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/19.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/2.png
new file mode 100644
index 0000000000..4a7c1ce427
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/20.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/20.png
new file mode 100644
index 0000000000..38f7ec8756
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/20.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/200.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/200.png
new file mode 100644
index 0000000000..e10815677a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/200.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/201.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/201.png
new file mode 100644
index 0000000000..661cd14817
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/201.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/202.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/202.png
new file mode 100644
index 0000000000..6c64b90877
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/202.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/203.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/203.png
new file mode 100644
index 0000000000..ec3c0358a1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/203.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/204.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/204.png
new file mode 100644
index 0000000000..daace0f92a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/204.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/205.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/205.png
new file mode 100644
index 0000000000..f5d5a1bc39
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/205.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/206.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/206.png
new file mode 100644
index 0000000000..d6ff394c66
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/206.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/207.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/207.png
new file mode 100644
index 0000000000..9f03d572b7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/207.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/208.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/208.png
new file mode 100644
index 0000000000..548784db2a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/208.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/21.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/21.png
new file mode 100644
index 0000000000..38f7ec8756
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/21.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/210.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/210.png
new file mode 100644
index 0000000000..6f403c14f5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/210.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/211.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/211.png
new file mode 100644
index 0000000000..6614c152a6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/211.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/213.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/213.png
new file mode 100644
index 0000000000..7da7ab1e69
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/213.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/214.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/214.png
new file mode 100644
index 0000000000..56da7e8d0d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/214.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/215.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/215.png
new file mode 100644
index 0000000000..cffad53f13
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/215.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/216.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/216.png
new file mode 100644
index 0000000000..6c9c006044
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/216.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/217.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/217.png
new file mode 100644
index 0000000000..ee1c87e1b1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/217.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/218.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/218.png
new file mode 100644
index 0000000000..5d6a74cd72
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/218.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/219.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/219.png
new file mode 100644
index 0000000000..881bdaa78a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/219.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/22.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/22.png
new file mode 100644
index 0000000000..38f7ec8756
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/22.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/220.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/220.png
new file mode 100644
index 0000000000..00900203dc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/220.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/221.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/221.png
new file mode 100644
index 0000000000..ccf9edc4a4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/221.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/23.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/23.png
new file mode 100644
index 0000000000..38f7ec8756
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/23.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/24.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/24.png
new file mode 100644
index 0000000000..a1c2183ee8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/24.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/25.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/25.png
new file mode 100644
index 0000000000..a1c2183ee8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/25.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/26.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/26.png
new file mode 100644
index 0000000000..a1c2183ee8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/26.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/27.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/27.png
new file mode 100644
index 0000000000..a1c2183ee8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/27.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/28.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/28.png
new file mode 100644
index 0000000000..5e4886b0f8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/28.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/29.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/29.png
new file mode 100644
index 0000000000..5e4886b0f8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/29.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/3.png
new file mode 100644
index 0000000000..4a7c1ce427
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/30.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/30.png
new file mode 100644
index 0000000000..5e4886b0f8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/30.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/31.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/31.png
new file mode 100644
index 0000000000..5e4886b0f8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/31.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/32.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/32.png
new file mode 100644
index 0000000000..4a7c1ce427
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/32.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/33.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/33.png
new file mode 100644
index 0000000000..1a3acd9e94
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/33.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/34.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/34.png
new file mode 100644
index 0000000000..bf81a1b4b2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/34.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/35.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/35.png
new file mode 100644
index 0000000000..051b45e6bc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/35.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/36.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/36.png
new file mode 100644
index 0000000000..5ddb32de79
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/36.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/37.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/37.png
new file mode 100644
index 0000000000..38f7ec8756
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/37.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/38.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/38.png
new file mode 100644
index 0000000000..a1c2183ee8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/38.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/39.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/39.png
new file mode 100644
index 0000000000..5e4886b0f8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/39.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/4.png
new file mode 100644
index 0000000000..1a3acd9e94
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/40.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/40.png
new file mode 100644
index 0000000000..a1b063620a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/40.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/41.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/41.png
new file mode 100644
index 0000000000..9b9c314475
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/41.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/42.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/42.png
new file mode 100644
index 0000000000..b3f174ebd4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/42.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/43.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/43.png
new file mode 100644
index 0000000000..0939c7eb87
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/43.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/44.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/44.png
new file mode 100644
index 0000000000..23cc1deb66
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/44.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/5.png
new file mode 100644
index 0000000000..1a3acd9e94
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50.png
new file mode 100644
index 0000000000..52d46cb62c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/1.png
new file mode 100644
index 0000000000..6660384d76
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/2.png
new file mode 100644
index 0000000000..0b4e7d6583
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/3.png
new file mode 100644
index 0000000000..554a7d8e52
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/4.png
new file mode 100644
index 0000000000..b567a0cd15
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/5.png
new file mode 100644
index 0000000000..891608d308
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/6.png
new file mode 100644
index 0000000000..246319069a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/7.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/7.png
new file mode 100644
index 0000000000..296c9b6c97
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/8.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/8.png
new file mode 100644
index 0000000000..fe22c02056
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/50/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52.png
new file mode 100644
index 0000000000..52d46cb62c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/1.png
new file mode 100644
index 0000000000..6660384d76
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/2.png
new file mode 100644
index 0000000000..0b4e7d6583
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/3.png
new file mode 100644
index 0000000000..554a7d8e52
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/4.png
new file mode 100644
index 0000000000..b567a0cd15
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/5.png
new file mode 100644
index 0000000000..891608d308
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/6.png
new file mode 100644
index 0000000000..246319069a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/7.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/7.png
new file mode 100644
index 0000000000..296c9b6c97
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/8.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/8.png
new file mode 100644
index 0000000000..fe22c02056
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/52/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54.png
new file mode 100644
index 0000000000..52d46cb62c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/1.png
new file mode 100644
index 0000000000..6660384d76
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/2.png
new file mode 100644
index 0000000000..0b4e7d6583
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/3.png
new file mode 100644
index 0000000000..554a7d8e52
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/4.png
new file mode 100644
index 0000000000..b567a0cd15
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/5.png
new file mode 100644
index 0000000000..891608d308
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/6.png
new file mode 100644
index 0000000000..246319069a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/7.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/7.png
new file mode 100644
index 0000000000..296c9b6c97
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/8.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/8.png
new file mode 100644
index 0000000000..fe22c02056
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/54/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/55.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/55.png
new file mode 100644
index 0000000000..23e0a10e06
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/55.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/6.png
new file mode 100644
index 0000000000..1a3acd9e94
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/61.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/61.png
new file mode 100644
index 0000000000..f1756e78ba
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/61.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/62.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/62.png
new file mode 100644
index 0000000000..9190330469
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/62.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/63.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/63.png
new file mode 100644
index 0000000000..f1756e78ba
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/63.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/64.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/64.png
new file mode 100644
index 0000000000..032a256989
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/64.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/66.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/66.png
new file mode 100644
index 0000000000..d96558c8f5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/66.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/68.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/68.png
new file mode 100644
index 0000000000..4d8f366b9c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/68.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/7.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/7.png
new file mode 100644
index 0000000000..1a3acd9e94
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/70.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/70.png
new file mode 100644
index 0000000000..e914a7c788
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/70.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/700.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/700.png
new file mode 100644
index 0000000000..af05b249b2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/700.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/71.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/71.png
new file mode 100644
index 0000000000..bd629f0ee4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/71.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/72.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/72.png
new file mode 100644
index 0000000000..e1ea94bac6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/72.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/720.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/720.png
new file mode 100644
index 0000000000..6b6d885084
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/720.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/73.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/73.png
new file mode 100644
index 0000000000..68de2aba73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/73.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/74.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/74.png
new file mode 100644
index 0000000000..c0d974240c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/74.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/75.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/75.png
new file mode 100644
index 0000000000..e1f8be799b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/75.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/751.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/751.png
new file mode 100644
index 0000000000..ee106b029f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/751.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/752.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/752.png
new file mode 100644
index 0000000000..3aed0ef200
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/752.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/753.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/753.png
new file mode 100644
index 0000000000..03d271872e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/753.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/754.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/754.png
new file mode 100644
index 0000000000..dd87199ae2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/754.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/755.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/755.png
new file mode 100644
index 0000000000..5b9053e1f4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/755.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/756.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/756.png
new file mode 100644
index 0000000000..23c87b8a2d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/756.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/758.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/758.png
new file mode 100644
index 0000000000..d8d2012c51
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/758.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/759.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/759.png
new file mode 100644
index 0000000000..1e538bce45
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/759.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/76.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/76.png
new file mode 100644
index 0000000000..ed806126fb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/76.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/77.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/77.png
new file mode 100644
index 0000000000..a7452f94ee
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/77.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/78.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/78.png
new file mode 100644
index 0000000000..e371af02f9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/78.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/79.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/79.png
new file mode 100644
index 0000000000..e911b80d03
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/79.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/8.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/8.png
new file mode 100644
index 0000000000..bf81a1b4b2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/9.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/9.png
new file mode 100644
index 0000000000..bf81a1b4b2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metaitem.01/9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/0.png
new file mode 100644
index 0000000000..3bcbace856
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/1.png
new file mode 100644
index 0000000000..eb6baf34ae
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/2.png
new file mode 100644
index 0000000000..3b72cb69b6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/3.png
new file mode 100644
index 0000000000..ca0ad43c3b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/MU-metatool.01/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/baubles/itemFireProtectGlovesBetter.png b/gtpp/src/main/resources/assets/miscutils/textures/items/baubles/itemFireProtectGlovesBetter.png
new file mode 100644
index 0000000000..8576ae1b7a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/baubles/itemFireProtectGlovesBetter.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae.png
new file mode 100644
index 0000000000..efa1a6e0ca
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae_Overlay.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae_Overlay.png
new file mode 100644
index 0000000000..aaea7803b5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BasicAlgae_Overlay.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/0.png
new file mode 100644
index 0000000000..4143a1eb39
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/1.png
new file mode 100644
index 0000000000..f39df3b01d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/10.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/10.png
new file mode 100644
index 0000000000..10af629bb7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/10.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/11.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/11.png
new file mode 100644
index 0000000000..b674e687f5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/11.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/12.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/12.png
new file mode 100644
index 0000000000..a9040b5f80
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/12.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/13.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/13.png
new file mode 100644
index 0000000000..4be42c2631
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/13.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/14.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/14.png
new file mode 100644
index 0000000000..5ce86b105c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/14.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/15.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/15.png
new file mode 100644
index 0000000000..ac7e30177f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/15.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/16.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/16.png
new file mode 100644
index 0000000000..37867c28e4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/16.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/17.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/17.png
new file mode 100644
index 0000000000..f1b2d9578c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/17.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/18.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/18.png
new file mode 100644
index 0000000000..89b5cf0d67
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/18.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/19.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/19.png
new file mode 100644
index 0000000000..e0d4ecdd46
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/19.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/2.png
new file mode 100644
index 0000000000..b49d729143
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/20.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/20.png
new file mode 100644
index 0000000000..9147fb942b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/20.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/21.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/21.png
new file mode 100644
index 0000000000..43a02b8eaf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/21.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/22.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/22.png
new file mode 100644
index 0000000000..b58efee183
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/22.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/23.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/23.png
new file mode 100644
index 0000000000..7f6067e83e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/23.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/24.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/24.png
new file mode 100644
index 0000000000..a0590c188c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/24.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/3.png
new file mode 100644
index 0000000000..9439d51b25
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/4.png
new file mode 100644
index 0000000000..fe06094f2d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/5.png
new file mode 100644
index 0000000000..f4bd2f6df2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/6.png
new file mode 100644
index 0000000000..abf0b77778
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/7.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/7.png
new file mode 100644
index 0000000000..338a39d5f6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/8.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/8.png
new file mode 100644
index 0000000000..73c2408ce8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/9.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/9.png
new file mode 100644
index 0000000000..b5ab13cb1f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/BioCircuit/9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/0.png
new file mode 100644
index 0000000000..57d77be16a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/1.png
new file mode 100644
index 0000000000..51bb4587d9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/10.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/10.png
new file mode 100644
index 0000000000..e81bae4aae
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/10.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/11.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/11.png
new file mode 100644
index 0000000000..0cc273996e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/11.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/12.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/12.png
new file mode 100644
index 0000000000..dca743acd3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/12.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/13.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/13.png
new file mode 100644
index 0000000000..15257d9efd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/13.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/14.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/14.png
new file mode 100644
index 0000000000..f81fc43aff
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/14.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/15.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/15.png
new file mode 100644
index 0000000000..31951671cd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/15.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/16.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/16.png
new file mode 100644
index 0000000000..2c6e0b8cb6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/16.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/17.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/17.png
new file mode 100644
index 0000000000..4309f3a975
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/17.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/18.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/18.png
new file mode 100644
index 0000000000..e82660e9f8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/18.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/19.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/19.png
new file mode 100644
index 0000000000..dc2070e635
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/19.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/2.png
new file mode 100644
index 0000000000..2cdf37adad
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/20.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/20.png
new file mode 100644
index 0000000000..9b536f84d0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/20.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/21.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/21.png
new file mode 100644
index 0000000000..1a04c2415c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/21.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/22.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/22.png
new file mode 100644
index 0000000000..77be3ef6a8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/22.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/23.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/23.png
new file mode 100644
index 0000000000..110cd7f8e8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/23.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/24.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/24.png
new file mode 100644
index 0000000000..0c065db4ce
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/24.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/25.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/25.png
new file mode 100644
index 0000000000..168b15adb3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/25.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/3.png
new file mode 100644
index 0000000000..c98e2d6319
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/4.png
new file mode 100644
index 0000000000..af0bcc7064
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/5.png
new file mode 100644
index 0000000000..1b60b7f555
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/6.png
new file mode 100644
index 0000000000..7f6f045430
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/7.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/7.png
new file mode 100644
index 0000000000..8a2cd2891b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/8.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/8.png
new file mode 100644
index 0000000000..c8c6299d7b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/9.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/9.png
new file mode 100644
index 0000000000..df99f3f5e8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bioscience/MetaItem1/9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png
new file mode 100644
index 0000000000..f6c9a9f131
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png.mcmeta
new file mode 100644
index 0000000000..70cc4d313c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketCryotheum.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 6
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png
new file mode 100644
index 0000000000..6a00cf1509
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png.mcmeta
new file mode 100644
index 0000000000..f6730e30a9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketEnder.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png b/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png
new file mode 100644
index 0000000000..82f1bb4b84
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png.mcmeta
new file mode 100644
index 0000000000..ddc2f9fb7a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/bucket/BucketPyrotheum.png.mcmeta
@@ -0,0 +1,23 @@
+{
+ "animation": {
+ "frametime": 2,
+ "frames": [
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1,
+ 0
+ ]
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCharcoal.png b/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCharcoal.png
new file mode 100644
index 0000000000..3cb0ac7097
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCharcoal.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCoke.png b/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCoke.png
new file mode 100644
index 0000000000..9dc98ba18d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemCactusCoke.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemCoalCoke.png b/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemCoalCoke.png
new file mode 100644
index 0000000000..4f8fd406d4
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemCoalCoke.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCharcoal.png b/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCharcoal.png
new file mode 100644
index 0000000000..f66a217c78
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCharcoal.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCoke.png b/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCoke.png
new file mode 100644
index 0000000000..055655ebe1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/burnables/itemSugarCoke.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/1.png
new file mode 100644
index 0000000000..9039d443c3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/2.png
new file mode 100644
index 0000000000..7023e7ce82
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/3.png
new file mode 100644
index 0000000000..4d787e7aa8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/4.png
new file mode 100644
index 0000000000..9320de0611
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/5.png
new file mode 100644
index 0000000000..ab8771c89c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/6.png
new file mode 100644
index 0000000000..a01f435e72
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/7.png b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/7.png
new file mode 100644
index 0000000000..fb5a5fba43
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/8.png b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/8.png
new file mode 100644
index 0000000000..aff1ec693f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/9.png b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/9.png
new file mode 100644
index 0000000000..0b9cf4d18e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/chargepack/9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/0.png
new file mode 100644
index 0000000000..1938287f27
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/1.png
new file mode 100644
index 0000000000..327e530f1b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/10.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/10.png
new file mode 100644
index 0000000000..9e48f50335
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/10.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/11.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/11.png
new file mode 100644
index 0000000000..32ffcb8008
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/11.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/12.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/12.png
new file mode 100644
index 0000000000..48b1eadf93
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/12.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/13.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/13.png
new file mode 100644
index 0000000000..7f6a13cb82
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/13.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/14.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/14.png
new file mode 100644
index 0000000000..9f59404337
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/14.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/15.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/15.png
new file mode 100644
index 0000000000..ed0f49bd0f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/15.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/2.png
new file mode 100644
index 0000000000..635be463af
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/3.png
new file mode 100644
index 0000000000..24afa30c17
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/4.png
new file mode 100644
index 0000000000..847e54ef60
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/5.png
new file mode 100644
index 0000000000..ddd9cb7a2f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/6.png
new file mode 100644
index 0000000000..e21c4fb78c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/7.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/7.png
new file mode 100644
index 0000000000..29e270f862
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/8.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/8.png
new file mode 100644
index 0000000000..87a48050fd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/covers/9.png b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/9.png
new file mode 100644
index 0000000000..3836414587
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/covers/9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_0.png
new file mode 100644
index 0000000000..652f68aeb7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_1.png
new file mode 100644
index 0000000000..7a14abccbd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_2.png
new file mode 100644
index 0000000000..cc0a5fe94d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_3.png
new file mode 100644
index 0000000000..ce0dbab306
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoilWire_3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_0.png
new file mode 100644
index 0000000000..2b2f615676
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_1.png
new file mode 100644
index 0000000000..f01ba96be9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_2.png
new file mode 100644
index 0000000000..f57bb1308b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_3.png
new file mode 100644
index 0000000000..77a416a3a6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/dehydrator/itemDehydratorCoil_3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/dust.png b/gtpp/src/main/resources/assets/miscutils/textures/items/dust.png
new file mode 100644
index 0000000000..4c8e6485ec
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/dust.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/dustSmall.png b/gtpp/src/main/resources/assets/miscutils/textures/items/dustSmall.png
new file mode 100644
index 0000000000..c432a032c2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/dustSmall.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/dustTiny.png b/gtpp/src/main/resources/assets/miscutils/textures/items/dustTiny.png
new file mode 100644
index 0000000000..8f597c61e0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/dustTiny.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/0.png
new file mode 100644
index 0000000000..944ab47126
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/1.png
new file mode 100644
index 0000000000..2d235ca65d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/2.png
new file mode 100644
index 0000000000..ec81acba2c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/3.png
new file mode 100644
index 0000000000..1fc103297a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/4.png
new file mode 100644
index 0000000000..db5ddf0063
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/5.png
new file mode 100644
index 0000000000..2497c88e2d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/6.png
new file mode 100644
index 0000000000..083db84ef1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/7.png b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/7.png
new file mode 100644
index 0000000000..27927d0db6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/8.png b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/8.png
new file mode 100644
index 0000000000..7013c41d6b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/food/MetaItem1/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/frameAccelerated.png b/gtpp/src/main/resources/assets/miscutils/textures/items/frameAccelerated.png
new file mode 100644
index 0000000000..e02bd78586
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/frameAccelerated.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/frameArborists.png b/gtpp/src/main/resources/assets/miscutils/textures/items/frameArborists.png
new file mode 100644
index 0000000000..b55d3a92e6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/frameArborists.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/frameBusy.png b/gtpp/src/main/resources/assets/miscutils/textures/items/frameBusy.png
new file mode 100644
index 0000000000..ea20d3d046
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/frameBusy.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/frameDecaying.png b/gtpp/src/main/resources/assets/miscutils/textures/items/frameDecaying.png
new file mode 100644
index 0000000000..3e6feb1a3c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/frameDecaying.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/frameMutagenic.png b/gtpp/src/main/resources/assets/miscutils/textures/items/frameMutagenic.png
new file mode 100644
index 0000000000..0a24289776
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/frameMutagenic.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/frameSlowing.png b/gtpp/src/main/resources/assets/miscutils/textures/items/frameSlowing.png
new file mode 100644
index 0000000000..8d07fdd47b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/frameSlowing.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/frameStabilizing.png b/gtpp/src/main/resources/assets/miscutils/textures/items/frameStabilizing.png
new file mode 100644
index 0000000000..1fed360bf7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/frameStabilizing.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/frameUseless.png b/gtpp/src/main/resources/assets/miscutils/textures/items/frameUseless.png
new file mode 100644
index 0000000000..e316e0a5d6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/frameUseless.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER.png b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER.png
new file mode 100644
index 0000000000..3030cbe6aa
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER_OVERLAY.png b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ANGLE_GRINDER_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_BUTCHER_KNIFE.png b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_BUTCHER_KNIFE.png
new file mode 100644
index 0000000000..5114f2c9a8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_BUTCHER_KNIFE.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_LIGHTER.png b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_LIGHTER.png
new file mode 100644
index 0000000000..1c6257f336
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_LIGHTER.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS.png b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS.png
new file mode 100644
index 0000000000..8ccd7f3c1a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS_OVERLAY.png b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/ELECTRIC_SNIPS_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/RENDERING_ERROR.png b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/RENDERING_ERROR.png
new file mode 100644
index 0000000000..ae13305b96
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/RENDERING_ERROR.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/VOID.png b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/VOID.png
new file mode 100644
index 0000000000..db16e741fe
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/iconsets/VOID.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/ion/0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/ion/0.png
new file mode 100644
index 0000000000..c56a04238f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/ion/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/ion/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/ion/1.png
new file mode 100644
index 0000000000..174d2ad950
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/ion/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/ion/IonBase.png b/gtpp/src/main/resources/assets/miscutils/textures/items/ion/IonBase.png
new file mode 100644
index 0000000000..fd342f7db2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/ion/IonBase.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/item.empty.png b/gtpp/src/main/resources/assets/miscutils/textures/items/item.empty.png
new file mode 100644
index 0000000000..c054d35cce
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/item.empty.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemAirFilter.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemAirFilter.png
new file mode 100644
index 0000000000..da4b975517
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemAirFilter.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemAlkalusDisk.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemAlkalusDisk.png
new file mode 100644
index 0000000000..8553a13cfb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemAlkalusDisk.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemBasicTurbine.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemBasicTurbine.png
new file mode 100644
index 0000000000..62de905fb9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemBasicTurbine.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemBlueprint.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemBlueprint.png
new file mode 100644
index 0000000000..593ba0ac17
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemBlueprint.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemBoilerChassis.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemBoilerChassis.png
new file mode 100644
index 0000000000..1ac3bff818
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemBoilerChassis.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemBook.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemBook.png
new file mode 100644
index 0000000000..f6cdf72bda
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemBook.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemBufferCore.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemBufferCore.png
new file mode 100644
index 0000000000..3e41cfaa1c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemBufferCore.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemCell.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemCell.png
new file mode 100644
index 0000000000..023291b957
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemCell.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemCellPlasma.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemCellPlasma.png
new file mode 100644
index 0000000000..1c93293744
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemCellPlasma.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemCellPlasma_Overlay.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemCellPlasma_Overlay.png
new file mode 100644
index 0000000000..ce3c6377c7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemCellPlasma_Overlay.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemCell_Overlay.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemCell_Overlay.png
new file mode 100644
index 0000000000..35c124ab0c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemCell_Overlay.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemCircuitLFTR.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemCircuitLFTR.png
new file mode 100644
index 0000000000..723f62e278
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemCircuitLFTR.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoil.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoil.png
new file mode 100644
index 0000000000..c7a849556f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoil.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoilWire.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoilWire.png
new file mode 100644
index 0000000000..8687d1c8ca
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemDehydratorCoilWire.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemEnergeticRotorBlade.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemEnergeticRotorBlade.png
new file mode 100644
index 0000000000..7c03ca0ada
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemEnergeticRotorBlade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemEnergeticShaft.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemEnergeticShaft.png
new file mode 100644
index 0000000000..bf9ab22ce2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemEnergeticShaft.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemGear.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemGear.png
new file mode 100644
index 0000000000..6d0cf3be50
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemGear.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemHatTinFoil.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemHatTinFoil.png
new file mode 100644
index 0000000000..91f1cad62e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemHatTinFoil.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemIngot.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemIngot.png
new file mode 100644
index 0000000000..a904365fba
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemIngot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemIngotBatteryAlloy.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemIngotBatteryAlloy.png
new file mode 100644
index 0000000000..edaac2807f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemIngotBatteryAlloy.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemIngotHot.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemIngotHot.png
new file mode 100644
index 0000000000..d0f73e2868
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemIngotHot.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemIridiumRotorBlade.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemIridiumRotorBlade.png
new file mode 100644
index 0000000000..73c2cbe026
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemIridiumRotorBlade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemIridiumShaft.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemIridiumShaft.png
new file mode 100644
index 0000000000..585b862d12
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemIridiumShaft.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemLavaFilter.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemLavaFilter.png
new file mode 100644
index 0000000000..92a06a3a9a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemLavaFilter.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemMagnaliumRotorBlade.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemMagnaliumRotorBlade.png
new file mode 100644
index 0000000000..d10128babd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemMagnaliumRotorBlade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemMagnaliumShaft.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemMagnaliumShaft.png
new file mode 100644
index 0000000000..b93430f732
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemMagnaliumShaft.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemPlate.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemPlate.png
new file mode 100644
index 0000000000..b5a9ab5214
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemPlate.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemShard.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemShard.png
new file mode 100644
index 0000000000..104a59d2b3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemShard.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemShovel.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemShovel.png
new file mode 100644
index 0000000000..8e1c0c2826
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemShovel.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelRotorBlade.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelRotorBlade.png
new file mode 100644
index 0000000000..cd376cb5cb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelRotorBlade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelShaft.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelShaft.png
new file mode 100644
index 0000000000..f08ba26585
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemTungstenSteelShaft.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemUltimetRotorBlade.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemUltimetRotorBlade.png
new file mode 100644
index 0000000000..89f7b9474a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemUltimetRotorBlade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemUltimetShaft.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemUltimetShaft.png
new file mode 100644
index 0000000000..df6c9b9c49
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemUltimetShaft.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemVibrantRotorBlade.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemVibrantRotorBlade.png
new file mode 100644
index 0000000000..5dea2ec1e5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemVibrantRotorBlade.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/itemVibrantShaft.png b/gtpp/src/main/resources/assets/miscutils/textures/items/itemVibrantShaft.png
new file mode 100644
index 0000000000..3a1fe64176
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/itemVibrantShaft.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/magicfeather.png b/gtpp/src/main/resources/assets/miscutils/textures/items/magicfeather.png
new file mode 100644
index 0000000000..634529b925
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/magicfeather.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png b/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png
new file mode 100644
index 0000000000..e253eea6de
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png.mcmeta
new file mode 100644
index 0000000000..c5d457f93d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustBlizz.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png b/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png
new file mode 100644
index 0000000000..960b304439
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png.mcmeta
new file mode 100644
index 0000000000..c5d457f93d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustCryotheum.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png b/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png
new file mode 100644
index 0000000000..eaf605e762
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png.mcmeta b/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png.mcmeta
new file mode 100644
index 0000000000..c5d457f93d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/material/DustPyrotheum.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+} \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/material/RodBlizz.png b/gtpp/src/main/resources/assets/miscutils/textures/items/material/RodBlizz.png
new file mode 100644
index 0000000000..d813e6b746
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/material/RodBlizz.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/0.png
new file mode 100644
index 0000000000..a0a32d4508
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/1.png
new file mode 100644
index 0000000000..4eddfa1727
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/10.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/10.png
new file mode 100644
index 0000000000..09eee049a9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/10.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/11.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/11.png
new file mode 100644
index 0000000000..7f636919b6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/11.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/12.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/12.png
new file mode 100644
index 0000000000..4e9504b03f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/12.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/13.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/13.png
new file mode 100644
index 0000000000..d929480c16
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/13.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/14.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/14.png
new file mode 100644
index 0000000000..7338066c1a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/14.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/15.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/15.png
new file mode 100644
index 0000000000..189a3127d9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/15.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/16.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/16.png
new file mode 100644
index 0000000000..8824201ff3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/16.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/17.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/17.png
new file mode 100644
index 0000000000..edea5115c0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/17.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/18.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/18.png
new file mode 100644
index 0000000000..d3e63562d7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/18.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/19.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/19.png
new file mode 100644
index 0000000000..43f9278b2c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/19.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/2.png
new file mode 100644
index 0000000000..292207ae7e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/20.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/20.png
new file mode 100644
index 0000000000..0e2ce23565
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/20.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/21.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/21.png
new file mode 100644
index 0000000000..758fa46941
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/21.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/22.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/22.png
new file mode 100644
index 0000000000..08bda97b66
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/22.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/23.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/23.png
new file mode 100644
index 0000000000..9ba21b22eb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/23.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/24.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/24.png
new file mode 100644
index 0000000000..bc6aec8854
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/24.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/3.png
new file mode 100644
index 0000000000..d085b86507
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/4.png
new file mode 100644
index 0000000000..faf8db0576
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/5.png
new file mode 100644
index 0000000000..3a30274238
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/6.png
new file mode 100644
index 0000000000..8930ce52ef
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/7.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/7.png
new file mode 100644
index 0000000000..0581d47446
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/8.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/8.png
new file mode 100644
index 0000000000..6bd3c2c682
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/9.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/9.png
new file mode 100644
index 0000000000..430f1aed3d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/0.png
new file mode 100644
index 0000000000..3fe49c3a57
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/1.png
new file mode 100644
index 0000000000..39ffa85711
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/10.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/10.png
new file mode 100644
index 0000000000..18ded814cf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/10.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/11.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/11.png
new file mode 100644
index 0000000000..b7e191c79f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/11.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/12.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/12.png
new file mode 100644
index 0000000000..49feb199e0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/12.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/13.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/13.png
new file mode 100644
index 0000000000..b70178d315
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/13.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/14.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/14.png
new file mode 100644
index 0000000000..77741644ed
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/14.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/15.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/15.png
new file mode 100644
index 0000000000..d48096c85c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/15.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/16.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/16.png
new file mode 100644
index 0000000000..cef33d17fd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/16.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/17.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/17.png
new file mode 100644
index 0000000000..4b752e7a9a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/17.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/18.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/18.png
new file mode 100644
index 0000000000..23fdb190c7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/18.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/19.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/19.png
new file mode 100644
index 0000000000..94e2a856c9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/19.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/2.png
new file mode 100644
index 0000000000..d86b5b357d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/20.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/20.png
new file mode 100644
index 0000000000..d7cbdb8f45
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/20.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/21.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/21.png
new file mode 100644
index 0000000000..2531eaff52
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/21.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/22.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/22.png
new file mode 100644
index 0000000000..d594dc4be8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/22.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/23.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/23.png
new file mode 100644
index 0000000000..d96dd2b000
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/23.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/24.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/24.png
new file mode 100644
index 0000000000..56067466ad
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/24.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/3.png
new file mode 100644
index 0000000000..43438c4ce5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/4.png
new file mode 100644
index 0000000000..8f0db073cd
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/5.png
new file mode 100644
index 0000000000..40ec84db70
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/6.png
new file mode 100644
index 0000000000..c63ad0ba19
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/7.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/7.png
new file mode 100644
index 0000000000..aad8c7ca62
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/8.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/8.png
new file mode 100644
index 0000000000..c9b908ec61
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/9.png b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/9.png
new file mode 100644
index 0000000000..b8e02c82ea
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/particle/new/9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/personalCloakingDevice.png b/gtpp/src/main/resources/assets/miscutils/textures/items/personalCloakingDevice.png
new file mode 100644
index 0000000000..2d196cb9ed
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/personalCloakingDevice.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled.png b/gtpp/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled.png
new file mode 100644
index 0000000000..2c56204a7e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled_OVERLAY.png b/gtpp/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled_OVERLAY.png
new file mode 100644
index 0000000000..cfec0f5d8e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/processing/MilledOre/milled_OVERLAY.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/research/note.png b/gtpp/src/main/resources/assets/miscutils/textures/items/research/note.png
new file mode 100644
index 0000000000..795eaeb193
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/research/note.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/0.png
new file mode 100644
index 0000000000..0ae88d993d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/1.png
new file mode 100644
index 0000000000..fdc81d8566
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/10.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/10.png
new file mode 100644
index 0000000000..2a8e28155c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/10.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/11.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/11.png
new file mode 100644
index 0000000000..fc33c3a20e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/11.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/12.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/12.png
new file mode 100644
index 0000000000..d79ccb6457
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/12.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/13.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/13.png
new file mode 100644
index 0000000000..0b1a12cf05
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/13.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/14.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/14.png
new file mode 100644
index 0000000000..3182d9cb04
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/14.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/15.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/15.png
new file mode 100644
index 0000000000..eeecdbd59a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/15.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/16.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/16.png
new file mode 100644
index 0000000000..3d5f296660
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/16.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/17.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/17.png
new file mode 100644
index 0000000000..440fd477d9
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/17.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/18.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/18.png
new file mode 100644
index 0000000000..463c0ccce0
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/18.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/19.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/19.png
new file mode 100644
index 0000000000..982eca6df8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/19.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/2.png
new file mode 100644
index 0000000000..36afb07e7b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/20.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/20.png
new file mode 100644
index 0000000000..bba4b04331
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/20.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/21.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/21.png
new file mode 100644
index 0000000000..d391055ad7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/21.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/22.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/22.png
new file mode 100644
index 0000000000..acbf53c53c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/22.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/23.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/23.png
new file mode 100644
index 0000000000..4e01f007da
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/23.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/24.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/24.png
new file mode 100644
index 0000000000..b80dca122e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/24.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/3.png
new file mode 100644
index 0000000000..370e0f84d2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/4.png
new file mode 100644
index 0000000000..3f1cfe4081
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/5.png
new file mode 100644
index 0000000000..d789444710
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/6.png
new file mode 100644
index 0000000000..40ab646c04
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/7.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/7.png
new file mode 100644
index 0000000000..091f63b0c1
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/8.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/8.png
new file mode 100644
index 0000000000..3262bf8f9f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/9.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/9.png
new file mode 100644
index 0000000000..ce8104263e
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/AdvancedCircuit/9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/0.png
new file mode 100644
index 0000000000..f4ba0a2f0a
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/1.png
new file mode 100644
index 0000000000..db59db96e3
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/10.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/10.png
new file mode 100644
index 0000000000..b50c781c6d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/10.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/11.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/11.png
new file mode 100644
index 0000000000..0656c10957
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/11.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/12.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/12.png
new file mode 100644
index 0000000000..3a32ed06fc
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/12.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/13.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/13.png
new file mode 100644
index 0000000000..475f8dadfb
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/13.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/14.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/14.png
new file mode 100644
index 0000000000..568414660d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/14.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/15.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/15.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/15.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/16.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/16.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/16.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/17.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/17.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/17.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/18.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/18.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/18.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/19.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/19.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/19.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/2.png
new file mode 100644
index 0000000000..4649393bb2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/20.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/20.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/20.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/21.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/21.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/21.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/22.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/22.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/22.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/23.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/23.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/23.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/24.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/24.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/24.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/25.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/25.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/25.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/26.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/26.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/26.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/27.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/27.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/27.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/28.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/28.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/28.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/29.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/29.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/29.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/3.png
new file mode 100644
index 0000000000..5b47d172be
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/30.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/30.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/30.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/31.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/31.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/31.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/32.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/32.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/32.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/33.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/33.png
new file mode 100644
index 0000000000..22f0a4ff73
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/33.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/4.png
new file mode 100644
index 0000000000..995b19953c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/5.png
new file mode 100644
index 0000000000..3ec2502da2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/6.png
new file mode 100644
index 0000000000..aa65838418
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/7.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/7.png
new file mode 100644
index 0000000000..985954250c
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/7.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/8.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/8.png
new file mode 100644
index 0000000000..9b857a9277
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/8.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/9.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/9.png
new file mode 100644
index 0000000000..0c165f3e59
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/general/MetaItem1/9.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/0.png
new file mode 100644
index 0000000000..7adcc6adcf
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/1.png
new file mode 100644
index 0000000000..2064052fa5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/2.png
new file mode 100644
index 0000000000..a974943866
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/3.png
new file mode 100644
index 0000000000..97a796c871
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/4.png
new file mode 100644
index 0000000000..b50c781c6d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/5.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/5.png
new file mode 100644
index 0000000000..b50c781c6d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/5.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/6.png b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/6.png
new file mode 100644
index 0000000000..b50c781c6d
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/science/nuclear/MetaItem1/6.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/spawn_egg.png b/gtpp/src/main/resources/assets/miscutils/textures/items/spawn_egg.png
new file mode 100644
index 0000000000..23259c71f5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/spawn_egg.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/spawn_egg_overlay.png b/gtpp/src/main/resources/assets/miscutils/textures/items/spawn_egg_overlay.png
new file mode 100644
index 0000000000..83ec78f172
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/spawn_egg_overlay.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/token/0.png b/gtpp/src/main/resources/assets/miscutils/textures/items/token/0.png
new file mode 100644
index 0000000000..7947f30bb6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/token/0.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/token/1.png b/gtpp/src/main/resources/assets/miscutils/textures/items/token/1.png
new file mode 100644
index 0000000000..850acc3e71
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/token/1.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/token/2.png b/gtpp/src/main/resources/assets/miscutils/textures/items/token/2.png
new file mode 100644
index 0000000000..fa619dd1ed
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/token/2.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/token/3.png b/gtpp/src/main/resources/assets/miscutils/textures/items/token/3.png
new file mode 100644
index 0000000000..3ba45ed7af
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/token/3.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/items/token/4.png b/gtpp/src/main/resources/assets/miscutils/textures/items/token/4.png
new file mode 100644
index 0000000000..81af6a91c8
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/items/token/4.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/models/TinFoil.png b/gtpp/src/main/resources/assets/miscutils/textures/models/TinFoil.png
new file mode 100644
index 0000000000..6c8e967db5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/models/TinFoil.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/A.png b/gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/A.png
new file mode 100644
index 0000000000..b3499184b5
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/A.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/B.png b/gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/B.png
new file mode 100644
index 0000000000..659aacbba7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/B.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/C.png b/gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/C.png
new file mode 100644
index 0000000000..659aacbba7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/C.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/D.png b/gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/D.png
new file mode 100644
index 0000000000..61e5d6b520
--- /dev/null
+++ b/gtpp/src/main/resources/assets/miscutils/textures/space/hd10180/D.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/spiceoflife/lang/de_DE.lang b/gtpp/src/main/resources/assets/spiceoflife/lang/de_DE.lang
new file mode 100644
index 0000000000..63ad1e2a98
--- /dev/null
+++ b/gtpp/src/main/resources/assets/spiceoflife/lang/de_DE.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=Voedselkrat \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/spiceoflife/lang/en_US.lang b/gtpp/src/main/resources/assets/spiceoflife/lang/en_US.lang
new file mode 100644
index 0000000000..bf16f4dc93
--- /dev/null
+++ b/gtpp/src/main/resources/assets/spiceoflife/lang/en_US.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=Food Crate \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/spiceoflife/lang/es_ES.lang b/gtpp/src/main/resources/assets/spiceoflife/lang/es_ES.lang
new file mode 100644
index 0000000000..02fe4c8806
--- /dev/null
+++ b/gtpp/src/main/resources/assets/spiceoflife/lang/es_ES.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=Caja de comida \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/spiceoflife/lang/fr_FR.lang b/gtpp/src/main/resources/assets/spiceoflife/lang/fr_FR.lang
new file mode 100644
index 0000000000..418c2b7053
--- /dev/null
+++ b/gtpp/src/main/resources/assets/spiceoflife/lang/fr_FR.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=Caisse alimentaire \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/spiceoflife/lang/it_IT.lang b/gtpp/src/main/resources/assets/spiceoflife/lang/it_IT.lang
new file mode 100644
index 0000000000..841b97c63f
--- /dev/null
+++ b/gtpp/src/main/resources/assets/spiceoflife/lang/it_IT.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=Cassa Alimentare \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/spiceoflife/lang/ko_KR.lang b/gtpp/src/main/resources/assets/spiceoflife/lang/ko_KR.lang
new file mode 100644
index 0000000000..7e9973e936
--- /dev/null
+++ b/gtpp/src/main/resources/assets/spiceoflife/lang/ko_KR.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=음식 상자 \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/spiceoflife/lang/ru_RU.lang b/gtpp/src/main/resources/assets/spiceoflife/lang/ru_RU.lang
new file mode 100644
index 0000000000..e167a0ae03
--- /dev/null
+++ b/gtpp/src/main/resources/assets/spiceoflife/lang/ru_RU.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=Продовольственный ящик \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/spiceoflife/lang/zh_CN.lang b/gtpp/src/main/resources/assets/spiceoflife/lang/zh_CN.lang
new file mode 100644
index 0000000000..76ba9db55b
--- /dev/null
+++ b/gtpp/src/main/resources/assets/spiceoflife/lang/zh_CN.lang
@@ -0,0 +1,2 @@
+# Items
+item.spiceoflife.foodcrate.name=装箱食物 \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/spiceoflife/textures/items/foodcrate.png b/gtpp/src/main/resources/assets/spiceoflife/textures/items/foodcrate.png
new file mode 100644
index 0000000000..b717dd0318
--- /dev/null
+++ b/gtpp/src/main/resources/assets/spiceoflife/textures/items/foodcrate.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_empty.png b/gtpp/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_empty.png
new file mode 100644
index 0000000000..4dbfd54ea7
--- /dev/null
+++ b/gtpp/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_empty.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_full.png b/gtpp/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_full.png
new file mode 100644
index 0000000000..0284bd29ad
--- /dev/null
+++ b/gtpp/src/main/resources/assets/spiceoflife/textures/items/foodcrate_open_full.png
Binary files differ
diff --git a/gtpp/src/main/resources/assets/stevescarts/lang/en_US.lang b/gtpp/src/main/resources/assets/stevescarts/lang/en_US.lang
new file mode 100644
index 0000000000..56dc8390a6
--- /dev/null
+++ b/gtpp/src/main/resources/assets/stevescarts/lang/en_US.lang
@@ -0,0 +1 @@
+item.SC2:crop_exotic_seeds.name=Exotic Seed Module [GT++] \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/stevescarts/lang/zh_CN.lang b/gtpp/src/main/resources/assets/stevescarts/lang/zh_CN.lang
new file mode 100644
index 0000000000..0b35e447e2
--- /dev/null
+++ b/gtpp/src/main/resources/assets/stevescarts/lang/zh_CN.lang
@@ -0,0 +1 @@
+item.SC2:crop_exotic_seeds.name=异域种子模块[GT++] \ No newline at end of file
diff --git a/gtpp/src/main/resources/assets/stevescarts/textures/items/crop_exotic_seeds_icon.png b/gtpp/src/main/resources/assets/stevescarts/textures/items/crop_exotic_seeds_icon.png
new file mode 100644
index 0000000000..63e0593119
--- /dev/null
+++ b/gtpp/src/main/resources/assets/stevescarts/textures/items/crop_exotic_seeds_icon.png
Binary files differ
diff --git a/gtpp/src/main/resources/mcmod.info b/gtpp/src/main/resources/mcmod.info
new file mode 100644
index 0000000000..499d5fcf7f
--- /dev/null
+++ b/gtpp/src/main/resources/mcmod.info
@@ -0,0 +1,37 @@
+{
+ "modListVersion": 2,
+ "modList": [{
+ "modid": "${modId}",
+ "name": "${modName}",
+ "description": "Adds over 100 new Multiblocks, Machines, etc to Gregtech.",
+ "credits": "",
+ "logoFile": "",
+ "version": "${modVersion}",
+ "mcversion": "${minecraftVersion}",
+ "url": "https://github.com/draknyte1/GTplusplus/wiki",
+ "updateUrl": "https://github.com/draknyte1/GTplusplus/releases/latest",
+ "authorList": ["Alkalus/Draknyte1"],
+ "screenshots": [""],
+ "requiredMods": ["Forge"],
+ "dependencies": [
+ "Forge", "TConstruct", "PlayerAPI", "dreamcraft", "IC2", "ihl", "psychedelicraft", "gregtech", "Forestry", "MagicBees", "CoFHCore", "Growthcraft", "Railcraft", "CompactWindmills",
+ "ForbiddenMagic", "MorePlanet", "PneumaticCraft", "ExtraUtilities", "Thaumcraft", "rftools", "simplyjetpacks", "BigReactors", "EnderIO", "tectech", "GTRedtech", "beyondrealitycore",
+ "OpenBlocks", "IC2NuclearControl", "TGregworks", "StevesCarts", "xreliquary"
+ ]
+ }, {
+ "modid": "ToxicEverglades",
+ "name": "${modName} ToxicEverglades",
+ "description": "Everglades, but toxic.",
+ "credits": "",
+ "logoFile": "",
+ "version": "${modVersion}",
+ "mcversion": "${minecraftVersion}",
+ "url": "https://github.com/draknyte1/GTplusplus/wiki",
+ "updateUrl": "https://github.com/draknyte1/GTplusplus/releases/latest",
+ "authorList": ["Alkalus/Draknyte1"],
+ "screenshots": [""],
+ "parent": "miscutils",
+ "requiredMods": [],
+ "dependencies": []
+ }]
+}
diff --git a/gtpp/wip/1.png b/gtpp/wip/1.png
new file mode 100644
index 0000000000..9cc599d929
--- /dev/null
+++ b/gtpp/wip/1.png
Binary files differ
diff --git a/gtpp/wip/10.png b/gtpp/wip/10.png
new file mode 100644
index 0000000000..28621050ce
--- /dev/null
+++ b/gtpp/wip/10.png
Binary files differ
diff --git a/gtpp/wip/11.png b/gtpp/wip/11.png
new file mode 100644
index 0000000000..b0252c6aaf
--- /dev/null
+++ b/gtpp/wip/11.png
Binary files differ
diff --git a/gtpp/wip/12.png b/gtpp/wip/12.png
new file mode 100644
index 0000000000..e222c0a5db
--- /dev/null
+++ b/gtpp/wip/12.png
Binary files differ
diff --git a/gtpp/wip/13.png b/gtpp/wip/13.png
new file mode 100644
index 0000000000..fd1b9dde50
--- /dev/null
+++ b/gtpp/wip/13.png
Binary files differ
diff --git a/gtpp/wip/14.png b/gtpp/wip/14.png
new file mode 100644
index 0000000000..7cafa36d20
--- /dev/null
+++ b/gtpp/wip/14.png
Binary files differ
diff --git a/gtpp/wip/15.png b/gtpp/wip/15.png
new file mode 100644
index 0000000000..df8a0c3b47
--- /dev/null
+++ b/gtpp/wip/15.png
Binary files differ
diff --git a/gtpp/wip/16.png b/gtpp/wip/16.png
new file mode 100644
index 0000000000..a2019f80f4
--- /dev/null
+++ b/gtpp/wip/16.png
Binary files differ
diff --git a/gtpp/wip/17.png b/gtpp/wip/17.png
new file mode 100644
index 0000000000..9b81d5b216
--- /dev/null
+++ b/gtpp/wip/17.png
Binary files differ
diff --git a/gtpp/wip/18.png b/gtpp/wip/18.png
new file mode 100644
index 0000000000..fb4b26ab9d
--- /dev/null
+++ b/gtpp/wip/18.png
Binary files differ
diff --git a/gtpp/wip/19.png b/gtpp/wip/19.png
new file mode 100644
index 0000000000..5ee1c6e68f
--- /dev/null
+++ b/gtpp/wip/19.png
Binary files differ
diff --git a/gtpp/wip/2.png b/gtpp/wip/2.png
new file mode 100644
index 0000000000..74dc5dc47a
--- /dev/null
+++ b/gtpp/wip/2.png
Binary files differ
diff --git a/gtpp/wip/20.png b/gtpp/wip/20.png
new file mode 100644
index 0000000000..51e3403d55
--- /dev/null
+++ b/gtpp/wip/20.png
Binary files differ
diff --git a/gtpp/wip/21.png b/gtpp/wip/21.png
new file mode 100644
index 0000000000..e880295bd9
--- /dev/null
+++ b/gtpp/wip/21.png
Binary files differ
diff --git a/gtpp/wip/22.png b/gtpp/wip/22.png
new file mode 100644
index 0000000000..6e7d05a508
--- /dev/null
+++ b/gtpp/wip/22.png
Binary files differ
diff --git a/gtpp/wip/23.png b/gtpp/wip/23.png
new file mode 100644
index 0000000000..c6200e584c
--- /dev/null
+++ b/gtpp/wip/23.png
Binary files differ
diff --git a/gtpp/wip/24.png b/gtpp/wip/24.png
new file mode 100644
index 0000000000..9351b847d5
--- /dev/null
+++ b/gtpp/wip/24.png
Binary files differ
diff --git a/gtpp/wip/25.png b/gtpp/wip/25.png
new file mode 100644
index 0000000000..bcc34ad1e7
--- /dev/null
+++ b/gtpp/wip/25.png
Binary files differ
diff --git a/gtpp/wip/26_off.png b/gtpp/wip/26_off.png
new file mode 100644
index 0000000000..9105e410bc
--- /dev/null
+++ b/gtpp/wip/26_off.png
Binary files differ
diff --git a/gtpp/wip/26_on.png b/gtpp/wip/26_on.png
new file mode 100644
index 0000000000..772e514cbb
--- /dev/null
+++ b/gtpp/wip/26_on.png
Binary files differ
diff --git a/gtpp/wip/27_off.png b/gtpp/wip/27_off.png
new file mode 100644
index 0000000000..a6b70919f3
--- /dev/null
+++ b/gtpp/wip/27_off.png
Binary files differ
diff --git a/gtpp/wip/27_on.png b/gtpp/wip/27_on.png
new file mode 100644
index 0000000000..858d64afdd
--- /dev/null
+++ b/gtpp/wip/27_on.png
Binary files differ
diff --git a/gtpp/wip/28_off.png b/gtpp/wip/28_off.png
new file mode 100644
index 0000000000..df71eb8524
--- /dev/null
+++ b/gtpp/wip/28_off.png
Binary files differ
diff --git a/gtpp/wip/28_on.png b/gtpp/wip/28_on.png
new file mode 100644
index 0000000000..169120fb99
--- /dev/null
+++ b/gtpp/wip/28_on.png
Binary files differ
diff --git a/gtpp/wip/29_off.png b/gtpp/wip/29_off.png
new file mode 100644
index 0000000000..c2759c6ac8
--- /dev/null
+++ b/gtpp/wip/29_off.png
Binary files differ
diff --git a/gtpp/wip/29_on.png b/gtpp/wip/29_on.png
new file mode 100644
index 0000000000..96cc9d5ba2
--- /dev/null
+++ b/gtpp/wip/29_on.png
Binary files differ
diff --git a/gtpp/wip/3.png b/gtpp/wip/3.png
new file mode 100644
index 0000000000..fdc76e9fcb
--- /dev/null
+++ b/gtpp/wip/3.png
Binary files differ
diff --git a/gtpp/wip/4.png b/gtpp/wip/4.png
new file mode 100644
index 0000000000..f2029146a9
--- /dev/null
+++ b/gtpp/wip/4.png
Binary files differ
diff --git a/gtpp/wip/5.png b/gtpp/wip/5.png
new file mode 100644
index 0000000000..a6116c4616
--- /dev/null
+++ b/gtpp/wip/5.png
Binary files differ
diff --git a/gtpp/wip/6.png b/gtpp/wip/6.png
new file mode 100644
index 0000000000..0d24ec3248
--- /dev/null
+++ b/gtpp/wip/6.png
Binary files differ
diff --git a/gtpp/wip/7.png b/gtpp/wip/7.png
new file mode 100644
index 0000000000..36c7ed703e
--- /dev/null
+++ b/gtpp/wip/7.png
Binary files differ
diff --git a/gtpp/wip/8.png b/gtpp/wip/8.png
new file mode 100644
index 0000000000..0f39bd84a9
--- /dev/null
+++ b/gtpp/wip/8.png
Binary files differ
diff --git a/gtpp/wip/9.png b/gtpp/wip/9.png
new file mode 100644
index 0000000000..3a11db434f
--- /dev/null
+++ b/gtpp/wip/9.png
Binary files differ
diff --git a/gtpp/wip/switch_1.png b/gtpp/wip/switch_1.png
new file mode 100644
index 0000000000..b454c0586c
--- /dev/null
+++ b/gtpp/wip/switch_1.png
Binary files differ
diff --git a/gtpp/wip/switch_2.png b/gtpp/wip/switch_2.png
new file mode 100644
index 0000000000..f6258403a9
--- /dev/null
+++ b/gtpp/wip/switch_2.png
Binary files differ
diff --git a/gtpp/wip/switch_3.png b/gtpp/wip/switch_3.png
new file mode 100644
index 0000000000..62ae25851b
--- /dev/null
+++ b/gtpp/wip/switch_3.png
Binary files differ
diff --git a/gtpp/wip/switch_4.png b/gtpp/wip/switch_4.png
new file mode 100644
index 0000000000..91e9078cd8
--- /dev/null
+++ b/gtpp/wip/switch_4.png
Binary files differ
diff --git a/misc/find_trans.sh b/misc/find_trans.sh
new file mode 100755
index 0000000000..3c75b09043
--- /dev/null
+++ b/misc/find_trans.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+cd $(dirname $0)/../src/main
+git grep -horE 'trans\( *\"[^"]*\" *\, *\"[^"]*\" *\)' -- *.java | sort -u \ No newline at end of file
diff --git a/misc/vector/MACHINE_CASING_PIPE_POLYTETRAFLUOROETHYLENE.png b/misc/vector/MACHINE_CASING_PIPE_POLYTETRAFLUOROETHYLENE.png
new file mode 100644
index 0000000000..18006024c9
--- /dev/null
+++ b/misc/vector/MACHINE_CASING_PIPE_POLYTETRAFLUOROETHYLENE.png
Binary files differ
diff --git a/misc/vector/bricked_blast_furnace_active.svg b/misc/vector/bricked_blast_furnace_active.svg
new file mode 100644
index 0000000000..4c5b0f77b7
--- /dev/null
+++ b/misc/vector/bricked_blast_furnace_active.svg
@@ -0,0 +1,1290 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="320"
+ height="320"
+ viewBox="0 0 84.666664 84.666664"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r15371"
+ sodipodi:docname="bricked_blast_furnace_active.svg"
+ inkscape:export-filename="C:\Users\Johannes\git\GT5-Unofficial\misc\vector\MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE.png"
+ inkscape:export-xdpi="4.8000002"
+ inkscape:export-ydpi="4.8000002">
+ <defs
+ id="defs2">
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter323"
+ inkscape:label="filter0">
+ <feColorMatrix
+ id="feColorMatrix327"
+ values="1.5 0 0 0 0 0 1.24 0 0 0 0 0 0.94 0 0 0 0 0 1 0 " />
+ <feColorMatrix
+ id="feColorMatrix28"
+ values="0.8 0 0 0 0 0 0.8 0 0 0 0 0 0.8 0 0 0 0 0 1 0 " />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter323-2"
+ inkscape:label="filter0">
+ <feColorMatrix
+ id="feColorMatrix327-2"
+ values="1.69 0 0 0 0 0 1 0 0 0 0 0 0.41 0 0 0 0 0 1 0 " />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Greyscale"
+ id="filter973">
+ <feColorMatrix
+ values="0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0 0 0 1 0 "
+ id="feColorMatrix971"
+ result="fbSourceGraphic" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter1066"
+ inkscape:label="filter3">
+ <feColorMatrix
+ id="feColorMatrix1068"
+ values="1.5 0 0 0 0 0 1.5 0 0 0 0 0 1.5 0 0 0 0 0 1 0 " />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4"
+ inkscape:cx="-17.988467"
+ inkscape:cy="273.04763"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ units="px">
+ <inkscape:grid
+ type="xygrid"
+ id="grid4851" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-212.33337)">
+ <image
+ y="261.77823"
+ x="137.37654"
+ id="image18"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ style="filter:url(#filter323);image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="84.666664"
+ width="84.666664" />
+ <image
+ y="215.91263"
+ x="253.26675"
+ id="image18-7"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ style="filter:url(#filter323-2);image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="84.666664"
+ width="84.666664" />
+ <rect
+ style="opacity:0.98000004;fill:#d78034;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect340"
+ width="45.168549"
+ height="24.856066"
+ x="171.85431"
+ y="197.57578" />
+ <g
+ id="g4863"
+ style="filter:url(#filter323)"
+ transform="translate(10.583331,121.70833)">
+ <image
+ y="212.33337"
+ x="1.2715658e-006"
+ id="image4849"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ style="image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="42.333332"
+ width="42.333332" />
+ <image
+ width="42.333332"
+ height="42.333332"
+ preserveAspectRatio="none"
+ style="image-rendering:optimizeSpeed"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ id="image4853"
+ x="42.333336"
+ y="212.33337" />
+ <image
+ y="254.6667"
+ x="42.333336"
+ id="image4855"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ style="image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="42.333332"
+ width="42.333332" />
+ <image
+ width="42.333332"
+ height="42.333332"
+ preserveAspectRatio="none"
+ style="image-rendering:optimizeSpeed"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ id="image4857"
+ x="-7.1054274e-015"
+ y="254.6667" />
+ </g>
+ <g
+ id="g751">
+ <image
+ width="84.666664"
+ height="84.666664"
+ preserveAspectRatio="none"
+ style="image-rendering:optimizeSpeed"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz AAAAvQAAAL0BHVrG+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADxSURB VDiN7dLNSsNAFMXxf+JN+hFLGKGgUBBBRF/AvW/l0/gqPowIRdI0sZl8zEwSV4aCON2Ld/tb3XNO 8PryPAYE7IqKxTzCuR6A1lgIAtZqhc8lLzTvHzkqTciKA8e3zUrObjdel0hCAPalRqXJhHVjWC5i Trm0xjKMI1Xd8albZrFgXY9zA7NYOOUyjyPuri+JROisRa2W6NbgXE/TWiIJvS6lbtiXGgDXD9zf XPG2zQHojEWlidfDb1RpQnGop5Q7Y6fffS5ZUQGwKzUXaULVdNStQTcdxroptN9cnh4ffvR8vll7 d3Ds/zv4Ezv4AptmhMVYeNf6AAAAAElFTkSuQmCC "
+ id="image40"
+ x="0"
+ y="212.33337" />
+ <rect
+ y="291.70837"
+ x="58.208332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect43"
+ style="opacity:0.98000004;fill:#7f6950;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="249.37505"
+ x="58.208332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect43-8"
+ style="opacity:0.98000004;fill:#7f6950;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="286.41672"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect60"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08339"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect60-0"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="249.37505"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect43-8-2"
+ style="opacity:0.98000004;fill:#7f6950;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="286.41672"
+ x="10.583331"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect60-0-9"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="291.70837"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect43-3"
+ style="opacity:0.98000004;fill:#7f6950;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="254.6667"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect122"
+ style="opacity:0.98000004;fill:#b69672;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08337"
+ x="10.583334"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect124"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="238.7917"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect126"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="281.12503"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect128"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="212.33337"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect130"
+ style="opacity:0.98000004;fill:#c09e79;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="212.33337"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect132"
+ style="opacity:0.98000004;fill:#c09e79;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08337"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect156"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08337"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect158"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="281.12503"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect160"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="286.41672"
+ x="37.041668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect162"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08337"
+ x="5.2916665"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect164"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="238.7917"
+ x="37.041668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect166"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="291.70837"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="249.37505"
+ x="79.375"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339-9"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="259.95837"
+ x="79.375"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339-3"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="217.62505"
+ x="37.041668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339-1"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="249.37503"
+ x="-8.8817842e-016"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339-4"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="270.54172"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect681"
+ style="opacity:0.98000004;fill:#846d53;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="259.95837"
+ x="5.2916665"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect683"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="222.9167"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect685"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="217.62503"
+ x="5.2916665"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect689"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="222.9167"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect691"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="265.25003"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect693"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="265.25003"
+ x="5.2916665"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect695"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="265.25003"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect697"
+ style="opacity:0.98000004;fill:#997e60;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <image
+ y="127.66671"
+ x="-92.604164"
+ id="image707"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI
+WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYJDBYkPynFtwAAAYdJREFUKM+FktFKlHEQxX/f14dY
+SHoh7aqgvUAi9Cg+QdQDBL1N9Aw+THdCa1vuUppEpi60M+dMF//Fq7C5GAbmnDnMnOmmx1sARdjp
+SjtUaadKrpTTTleoskgxAAd7O6kKO+1Qo1U2mivklFUOcTa77KHC/nQ+bwqT82+pe7QnX+dpyzU5
+v0w5xdCGnV7dnF7dAMD0empYCgNw+eU7sDTPbJkh5LSB/SccPR/1Hy74V7x/SbhC9E3hV/BwZJGq
+NH1bdyE+Xj9EWJq0c6Xg+v0/has/pCtMH7ZUrv8Qho6UZXrLaS+9arw76t6+6O5xbw66V3vdagdX
+mCFcYQOHmwCLO5S83u+USCxuSXG80Q1dhZsPqlQttBq5uEWioZWkUFK1upLM0Pxf6zmZczK/GD0F
+WOtXl7mvgbTTzWn7cIPd0Xban2c/x+Ot9nwpn83udsbrKU9ny3zcfChS3htvpx2unfFmyu2XwrU7
+WpdLrvHoUdphhhCT2Y80EiFk0oTIIoREmmy5qOIvirycu2t8lJoAAAAASUVORK5CYII=
+"
+ style="image-rendering:optimizeSpeed;filter:url(#filter973)"
+ preserveAspectRatio="none"
+ height="84.666664"
+ width="84.666664" />
+ <image
+ y="212.33337"
+ x="-92.604164"
+ id="image1078"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI
+WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYJDBYMCpxtTQAAAchJREFUKM9dkj1uU3EQxH9+PIUY
+ERGkCDuJEKJHVLRUHICCM3AAOjroaenoOAM34AQUKLaIg5M4AZsoysd7juLdnaX4mxQ0qyl2dnZm
+tzN+tQ6QmORKlyzSJY8MpYdccqVFeuJBDTza3vRIk1yyKLT0QlNayEORsmBvMqsgTdo9PCoKo8Nf
+HjfdGh0cuRTK0eHMQx7UZdjw5HJ4cgkA4/OxYBEIgNn+b2AhHkghagu5BLx88RwgBXDdkgngizLl
+09cdU9qNwpnB1QUfvgH5utf5OKUh3/Y6b6Y0/HiHJx7poi525wHnMxpoaE6mawNoWZxObw+g5fM+
+wEPdeFBeGJnqDKDlzFgbwiXHVzweQgOw1cWVJmqTIlIJ13MG0KCkgHnADrTFBR4KUSvk0kJ0/Jqy
+iZYEgH8Kx1fcv5MmKlOatMxnCAMahwEMgCV4dh/Alh4iPXIehPuX46X6QRe6VC27TwCqTlkpQ9Tl
+/isV779TDgSsVP9jwCXXMiU9vctWb8Oln5PTfn+9PJ+H9ibtZn/VQ+PJwrvpovLEQ9v9DZdMudm/
+56HyS6bc6q2GMpT93i2XTNQWjCZ/XERgQQgXFnhiQQQuvNQkk78HIMZSVfQymQAAAABJRU5ErkJg
+gg==
+"
+ style="image-rendering:optimizeSpeed;"
+ preserveAspectRatio="none"
+ height="84.666664"
+ width="84.666664" />
+ <g
+ id="g2197"
+ transform="translate(-2.5431315e-6,-4.0234376e-6)">
+ <rect
+ y="238.7917"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect787"
+ style="opacity:0.98000004;fill:#ffff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#fff300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect793"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="244.08336" />
+ <rect
+ y="249.37503"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect799"
+ style="opacity:0.98000004;fill:#ffcb00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#ffa300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect805"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="254.6667" />
+ <rect
+ y="259.95837"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect811"
+ style="opacity:0.98000004;fill:#ff7b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#ff5400;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect817"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="265.25006" />
+ <rect
+ y="265.25006"
+ x="26.458334"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect839"
+ style="opacity:0.98000004;fill:#ff4800;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="265.25006"
+ x="37.041664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect851"
+ style="opacity:0.98000004;fill:#ff3100;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#ff2500;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect857"
+ width="5.2916665"
+ height="5.2916665"
+ x="42.333332"
+ y="265.25006" />
+ <rect
+ style="opacity:0.98000004;fill:#ff0e00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect869"
+ width="5.2916665"
+ height="5.2916665"
+ x="52.916664"
+ y="265.25006" />
+ <rect
+ y="265.25006"
+ x="58.208332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect887"
+ style="opacity:0.98000004;fill:#ff0200;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#ff7000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1166"
+ width="5.2916665"
+ height="5.2916665"
+ x="26.458334"
+ y="259.95837" />
+ <rect
+ style="opacity:0.98000004;fill:#ff5900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1170"
+ width="5.2916665"
+ height="5.2916665"
+ x="37.041664"
+ y="259.95837" />
+ <rect
+ y="259.95837"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1172"
+ style="opacity:0.98000004;fill:#ff4d00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="259.95837"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1176"
+ style="opacity:0.98000004;fill:#ff3600;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#ff2a00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1178"
+ width="5.2916665"
+ height="5.2916665"
+ x="58.208332"
+ y="259.95837" />
+ <rect
+ y="254.6667"
+ x="26.458336"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1182"
+ style="opacity:0.98000004;fill:#ff9700;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="254.6667"
+ x="37.041668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1186"
+ style="opacity:0.98000004;fill:#ff8100;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#ff7500;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1188"
+ width="5.2916665"
+ height="5.2916665"
+ x="42.333336"
+ y="254.6667" />
+ <rect
+ style="opacity:0.98000004;fill:#ff5d00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1192"
+ width="5.2916665"
+ height="5.2916665"
+ x="52.916668"
+ y="254.6667" />
+ <rect
+ y="254.6667"
+ x="58.208336"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1194"
+ style="opacity:0.98000004;fill:#ff5200;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#ffc000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1198"
+ width="5.2916665"
+ height="5.2916665"
+ x="26.45833"
+ y="249.37503" />
+ <rect
+ style="opacity:0.98000004;fill:#ffa900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1202"
+ width="5.2916665"
+ height="5.2916665"
+ x="37.041664"
+ y="249.37503" />
+ <rect
+ y="249.37503"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1204"
+ style="opacity:0.98000004;fill:#ff9c00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="249.37503"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1208"
+ style="opacity:0.98000004;fill:#ff8600;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#ff7a00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1210"
+ width="5.2916665"
+ height="5.2916665"
+ x="58.208332"
+ y="249.37503" />
+ <rect
+ y="244.08337"
+ x="26.458332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1214"
+ style="opacity:0.98000004;fill:#ffe700;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08337"
+ x="37.041668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1218"
+ style="opacity:0.98000004;fill:#ffd000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#ffc500;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1220"
+ width="5.2916665"
+ height="5.2916665"
+ x="42.333336"
+ y="244.08337" />
+ <rect
+ style="opacity:0.98000004;fill:#ffad00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1224"
+ width="5.2916665"
+ height="5.2916665"
+ x="52.916668"
+ y="244.08337" />
+ <rect
+ y="244.08337"
+ x="58.208336"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1226"
+ style="opacity:0.98000004;fill:#ffa200;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#ffff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1230"
+ width="5.2916665"
+ height="5.2916665"
+ x="26.458326"
+ y="238.7917" />
+ <rect
+ style="opacity:0.98000004;fill:#fff800;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1234"
+ width="5.2916665"
+ height="5.2916665"
+ x="37.041664"
+ y="238.7917" />
+ <rect
+ y="238.7917"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1236"
+ style="opacity:0.98000004;fill:#ffec00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="238.7917"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1240"
+ style="opacity:0.98000004;fill:#ffd500;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#ffc900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1242"
+ width="5.2916665"
+ height="5.2916665"
+ x="58.208332"
+ y="238.7917" />
+ </g>
+ <g
+ id="g2519">
+ <rect
+ y="228.20837"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect753"
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="228.20837"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect755"
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="228.20837"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect757"
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="228.20837"
+ x="26.458332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect759"
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="228.20837"
+ x="31.75"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect761"
+ style="opacity:0.98000004;fill:#4a4a4a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="228.20837"
+ x="37.041668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect763"
+ style="opacity:0.98000004;fill:#4a4a4a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#474747;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect765"
+ width="5.2916665"
+ height="5.2916665"
+ x="42.333332"
+ y="228.20836" />
+ <rect
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect767"
+ width="5.2916665"
+ height="5.2916665"
+ x="47.624996"
+ y="228.20836" />
+ <rect
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect769"
+ width="5.2916665"
+ height="5.2916665"
+ x="58.208328"
+ y="228.20836" />
+ <rect
+ style="opacity:0.98000004;fill:#444444;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect771"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791664"
+ y="228.20836" />
+ <rect
+ y="228.20836"
+ x="63.5"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect773"
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect775"
+ width="5.2916665"
+ height="5.2916665"
+ x="52.916668"
+ y="228.20836" />
+ <rect
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect777"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="233.50003" />
+ <rect
+ style="opacity:0.98000004;fill:#919191;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect779"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="233.50003" />
+ <rect
+ style="opacity:0.98000004;fill:#919191;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect781"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="233.50003" />
+ <rect
+ y="238.7917"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect783"
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="238.7917"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect785"
+ style="opacity:0.98000004;fill:#8a8a8a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#424242;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect789"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="244.08336" />
+ <rect
+ style="opacity:0.98000004;fill:#7e7e7e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect791"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="244.08336" />
+ <rect
+ y="249.37503"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect795"
+ style="opacity:0.98000004;fill:#3c3c3c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="249.37503"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect797"
+ style="opacity:0.98000004;fill:#7c7c7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#3b3b3b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect801"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="254.6667" />
+ <rect
+ style="opacity:0.98000004;fill:#777777;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect803"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="254.6667" />
+ <rect
+ y="259.95837"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect807"
+ style="opacity:0.98000004;fill:#383838;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="259.95837"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect809"
+ style="opacity:0.98000004;fill:#646464;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#383838;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect813"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="265.25006" />
+ <rect
+ style="opacity:0.98000004;fill:#636363;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect815"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="265.25006" />
+ <rect
+ y="270.54172"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect819"
+ style="opacity:0.98000004;fill:#343434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="270.54172"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect821"
+ style="opacity:0.98000004;fill:#585858;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="270.54172"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect823"
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect825"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="275.83337" />
+ <rect
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect827"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="275.83337" />
+ <rect
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect829"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="275.83337" />
+ <rect
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect841"
+ width="5.2916665"
+ height="5.2916665"
+ x="26.458334"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="26.458334"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect843"
+ style="opacity:0.98000004;fill:#343434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect845"
+ width="5.2916665"
+ height="5.2916665"
+ x="31.75"
+ y="265.25006" />
+ <rect
+ y="270.54172"
+ x="31.75"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect847"
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#343434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect849"
+ width="5.2916665"
+ height="5.2916665"
+ x="31.75"
+ y="275.83337" />
+ <rect
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect853"
+ width="5.2916665"
+ height="5.2916665"
+ x="37.041664"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="37.041664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect855"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="270.54172"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect859"
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect861"
+ width="5.2916665"
+ height="5.2916665"
+ x="42.333332"
+ y="275.83337" />
+ <rect
+ y="265.25006"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect863"
+ style="opacity:0.98000004;fill:#5d5d5d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#4e4e4e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect865"
+ width="5.2916665"
+ height="5.2916665"
+ x="47.625"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect867"
+ style="opacity:0.98000004;fill:#343434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="270.54172"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect871"
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#343434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect873"
+ width="5.2916665"
+ height="5.2916665"
+ x="52.916664"
+ y="275.83337" />
+ <rect
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect889"
+ width="5.2916665"
+ height="5.2916665"
+ x="58.208332"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="58.208332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect891"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect893"
+ width="5.2916665"
+ height="5.2916665"
+ x="63.5"
+ y="265.25006" />
+ <rect
+ y="270.54172"
+ x="63.5"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect895"
+ style="opacity:0.98000004;fill:#4e4e4e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect897"
+ width="5.2916665"
+ height="5.2916665"
+ x="63.5"
+ y="275.83337" />
+ <rect
+ y="265.25006"
+ x="68.791672"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect899"
+ style="opacity:0.98000004;fill:#383838;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#383838;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect901"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="68.791672"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect903"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#424242;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect905"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="249.37506" />
+ <rect
+ y="254.66672"
+ x="68.791672"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect907"
+ style="opacity:0.98000004;fill:#424242;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect909"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="259.95837" />
+ <rect
+ y="233.50003"
+ x="68.791672"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect911"
+ style="opacity:0.98000004;fill:#444444;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#424242;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect913"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="238.79169" />
+ <rect
+ y="244.08334"
+ x="68.791672"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect915"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="259.95837"
+ x="31.75"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1168"
+ style="opacity:0.98000004;fill:#606060;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#5d5d5d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect1174"
+ width="5.2916665"
+ height="5.2916665"
+ x="47.625"
+ y="259.95837" />
+ <rect
+ y="259.95837"
+ x="63.5"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1180"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#626262;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect1184"
+ width="5.2916665"
+ height="5.2916665"
+ x="31.750002"
+ y="254.6667" />
+ <rect
+ y="254.6667"
+ x="47.625004"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1190"
+ style="opacity:0.98000004;fill:#616161;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect1196"
+ width="5.2916665"
+ height="5.2916665"
+ x="63.500004"
+ y="254.6667" />
+ <rect
+ y="249.37503"
+ x="31.749996"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1200"
+ style="opacity:0.98000004;fill:#636363;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#616161;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect1206"
+ width="5.2916665"
+ height="5.2916665"
+ x="47.625"
+ y="249.37503" />
+ <rect
+ y="249.37503"
+ x="63.5"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1212"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#6a6a6a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect1216"
+ width="5.2916665"
+ height="5.2916665"
+ x="31.749998"
+ y="244.08337" />
+ <rect
+ y="244.08337"
+ x="47.625004"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1222"
+ style="opacity:0.98000004;fill:#6d6d6d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect1228"
+ width="5.2916665"
+ height="5.2916665"
+ x="63.500004"
+ y="244.08337" />
+ <rect
+ y="238.7917"
+ x="31.749992"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1232"
+ style="opacity:0.98000004;fill:#7c7c7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#7c7c7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect1238"
+ width="5.2916665"
+ height="5.2916665"
+ x="47.625"
+ y="238.7917" />
+ <rect
+ y="238.7917"
+ x="63.5"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1244"
+ style="opacity:0.98000004;fill:#606060;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="233.50003"
+ x="26.458328"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1246"
+ style="opacity:0.98000004;fill:#909090;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#909090;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect1248"
+ width="5.2916665"
+ height="5.2916665"
+ x="31.749994"
+ y="233.50003" />
+ <rect
+ y="233.50003"
+ x="37.041668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1250"
+ style="opacity:0.98000004;fill:#8a8a8a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#8a8a8a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect1252"
+ width="5.2916665"
+ height="5.2916665"
+ x="42.333336"
+ y="233.50003" />
+ <rect
+ y="233.50003"
+ x="47.625004"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1254"
+ style="opacity:0.98000004;fill:#8a8a8a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#7c7c7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect1256"
+ width="5.2916665"
+ height="5.2916665"
+ x="52.916668"
+ y="233.50003" />
+ <rect
+ y="233.50003"
+ x="58.208336"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect1258"
+ style="opacity:0.98000004;fill:#747474;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#6d6d6d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect1260"
+ width="5.2916665"
+ height="5.2916665"
+ x="63.500004"
+ y="233.50003" />
+ </g>
+ </g>
+</svg>
diff --git a/misc/vector/bricked_blast_furnace_gui.svg b/misc/vector/bricked_blast_furnace_gui.svg
new file mode 100644
index 0000000000..cf9cd5d9dc
--- /dev/null
+++ b/misc/vector/bricked_blast_furnace_gui.svg
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="5120"
+ height="5120"
+ viewBox="0 0 1354.6666 1354.6666"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r15371"
+ sodipodi:docname="bricked_blast_furnace_gui.svg"
+ inkscape:export-filename="./BrickedBlastFurnace.png"
+ inkscape:export-xdpi="4.8000002"
+ inkscape:export-ydpi="4.8000002">
+ <defs
+ id="defs2">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4538">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 0,-179.24998 h 931.33329 v -820.20829 h 105.83331 v -58.20833 H 0 Z"
+ id="path4540"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Greyscale"
+ id="filter4593">
+ <feColorMatrix
+ values="0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0 0 0 1 0 "
+ id="feColorMatrix4591" />
+ <feColorMatrix
+ id="feColorMatrix5285"
+ values="1.04 0 0 0 0 0 0.86 0 0 0 0 0 0.65 0 0 0 0 0 1 0 " />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter5279"
+ inkscape:label="filter1">
+ <feColorMatrix
+ id="feColorMatrix5281"
+ values="1.169 0 0 0 0 0 0.96 0 0 0 0 0 0.73 0 0 0 0 0 1 0 " />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.125"
+ inkscape:cx="3319.3975"
+ inkscape:cy="2461.6361"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ units="px"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid4485" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,1057.6666)">
+ <image
+ y="-1057.6666"
+ x="1.1368684e-013"
+ id="image4506"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI
+WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QYQFAQzDgZvBgAACLZJREFUeNrt3TFOI8kaB/BmNSIk
+IuMGI+0JSBysSByQ+l1gLjDRJAQkaIO5AAfYJd2AZKSVJoELPGkvsJpsIkInvGCmeU3jbrerqtvV
+rt9PWgkMLlYe19/fV10uHz0/fn6uYI7++hR+38ubjfc/+n1d1EP4i2cRc538v/0ROVkvb4p/GAUA
+ZU5+IVBVVVW9S1ZSwUReTf4UE7ijHVABQCkKrQQEAPz0/nYtAKDIyb/8WP3z4bjwNQCY4cQN8c/9
+5+InvwBg9mInbsmTXwuAsr/gyS8AMPkLpwVg1mK27pa27Tc6AGIvk1ydnVar5ZNnLcy1Arg6Ow3+
+Y6vbT3YbgjUAYNZrAHUpf3d/0vn1VK2F9gImDoDUYloL7QVMHADNV/iur4EDXQNYLZ82ltxdt6cy
+9vigAsjMqwn/822bq+qTagNyaAGG3J5i0r9yeSMEYF8BkPIqwOBJLwTgMFuAl8k/ZOK3VvutCcAe
+W4BkVwHqs9k2hUBz0rd/7vIfzLsC2BgCfZM+Y6k2Nl1/+57VOCotATB9CMxUio1N18uPWY2j0hIA
++Wg8Ge/uT6rVpX9MmCwAUl8FuLs/qVbVllf91qQ/BDFXTeCgKoCNIbDnSf/+dp385JhUG5tShYcQ
+EgBBk3Xb11Eh8HPy7/tJeXV2Wr2//R4dAqk3NjXHWy2fgh+nVONQcAuQ+tUktydhaAiMtbGp6z0Y
+oRVE7DhoAbIXemnu6iwsBMba2PQmVBr33WXyphoHLUD0q/fV2emPy0wjv4pPXgkk3tj0Jhg2/N6Q
+yZtqHLQASa4CXH/7Xl0HfsLLqxBZTtMOVJc7XBNPtLGpsyrY8Mm2fZM31ThoAbJ6hZ5qo0rQ30m5
+sak9UduhsmswxY6DFmAOJwKFthh3H26mCZmhG5v6/v4u/2+pxkEFMAvBT+qToMmfemNTs73a9krd
+N1aqcRAA071673mjSugrf+qNTW8mb+CkTTUOAmCyyV9/PfUTM7bsT72xqb5/+1U8JExSjEOhATDG
+iUB9k39vIZCgHx7j/zfVmCZ82bL9ZKC+XXTelw57rgDGvAow940qqTY25TYOAmBjC9D0n//+OH3m
+z19P00z+ZhUwk40qq+VTktZhtayyGgctwHT6tsfO+KQgOLgWoCn0lf8NG1Ug3wqg+RFdXV8nC5aO
+V3wr2HCALcCbiW2jCuTbAozxXgAbVSDjANhbNQAcdgsAFFQB2KgCMwuAUk8EAgEwUhUQw0dXwYQB
+MLcTgYC3stsI1Gwvur7vug2YKADG1hcCJj8ccAuw8dy6nr8PHHALoAqAwloAr/ZQaAswtCIADqwC
+2GWyCwaYsAKYcstu17sB65+Z/DBxAKQ6626ry5tqVTXO0P95IEj9MV2r5ZPPr4NDbAH61hCcDXBY
+7u5PXv5DAPyY5HWLUR8D1jwOrHWbdxDOd6K3J337Z4IhwxZgkifLh5ve77tuYz5hEPIzCgkAytFs
+6Ux+LQAFTPT6+6G3UUAF4ESgcsNg159zgAEw2eVFsuv7EQAUMvlDL+OqCqwBAAIA0AIwG82PcG+/
+h6OrtO9rG1ABMMMQmPJ+CAAytW3hzxUDAcCBT/pN+/y7bsMaAIVWA6gAOMD1gL5DX/X9KgAOcNJv
+uq1rtV8ICAAKDQa0AIAAAPbaAry/XUf/gauz0+r623fjGCd4HK3CHtcArs5O4/q820/V9fKjcYwT
+PI63imsBAAEACABAAAACABAAgAAABAAgAAABAAgAQAAAAgAEgIcABABQoN7zAK7OTn+8HzuScYxD
+no6eHz8/v3zXOnjBiUDGyWGc9olAv/3x/+fl3/+axKNVAPU/QAwn3hgndhwnAlkDAAQAIAAAAQAI
+AEAAAAIAEACAAAAEACAAAAEACAAQAB4CEABAgZwIZJzsx2E8TgQyTvbjOBFoTxVA/Q8Qw4k3xokd
+x4lA1gAAAQAIAEAAAAIAEACAAAAEACAAAAEACABAAAACAASAhwAEAFAgJwIZJ/txGE/viUCQIycC
+aQEAAQAIACBI7yKgU4GNk8M47VOBmSgA6n+AGE69NU7sOBantQCAAAAEACAAAAEACABAAAACABAA
+gAAABAAgAAABAALAQwACACiQU4GNk/04jMepwMyOU4G1AIAAAAQAEORds/9v9lZAKRWAyQ+FBoDJ
+D8U6qqrq2cMAJbcAgAAABAAgAAABAAgAQAAAAgAQAIAAAAQAIAAAAQAIAEAAAAIAEACAAAAEACAA
+AAEACABAAAACABAAgAAABAAgAAABAAgAQAAAAgAQAIAAAAQAIAAAAQACABAAgAAABAAgAAABAAgA
+QAAAAgAQAIAAAAQAIAAAAQAIAEAAAAIAEACAAAAEACAAgKm88xDAfj0+Pgbd7+Hh4eXr8/NzFQAg
+AICBjqqqevYwQD4tQF3abyrrm2V/l777tX8mACCjAGhP8HrCDpn4XUHQNWZVWQSErIVM/F3uqwKA
+TFuA0DJ/l/sJAMgsALom8y6X+obe31UAmIFdr/O3f7/r/ioAyLwFCN3kM4QKAA7olV8AwIzFrPoL
+AGAn9gHATMv/FG8GEgAQoeudfOv1uvr69evL94vFojo+Pk5W9rfvE9o6CACI9OXLl5evLy4uqqqq
+Xk3++vv6Z5t+P6ZKiFk3EAAwUhjs8rNQsYuGAgBGslgsXlUAQ3r9oRO6/coful5gIxAkWANol/Xr
+9frV79X9/7byf4xNQN4NCBPZ1tM3q4L1et25MDgV+wAgwnq93tjbb5rY7apgWzswhvb4KgCI0L7U
+15zkfX3/0Krh4eEhKhS2rSmoACAz7QkfutI/ZD1BAMAM7BoCQ3/fVQCIbAGapX6znE91JWDoWkHI
+/awBQITj4+Pq4uIiaJNP6OSPbQuaIaAFgIS2BcGuQXF+fh68CDjkvloASNgCNA3ZCdhXBfhcAMjc
+4+Nj1B7/mDcD+WxAyMzFxUXnpF4sFtHv/ktNBQCRFcCQfr9uB1Ju/U1RAfwP0sAvmQVES+YAAAAA
+SUVORK5CYII=
+"
+ style="image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="1354.6666"
+ width="1354.6666" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 0,-179.24998 h 931.33329 v -820.20829 h 105.83331 v -58.20833 H 0 Z"
+ id="path4536"
+ inkscape:connector-curvature="0" />
+ <image
+ y="-1057.6666"
+ x="1.1368684e-013"
+ id="image4506-6"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QYQFAQzDgZvBgAACLZJREFUeNrt3TFOI8kaB/BmNSIk IuMGI+0JSBysSByQ+l1gLjDRJAQkaIO5AAfYJd2AZKSVJoELPGkvsJpsIkInvGCmeU3jbrerqtvV rt9PWgkMLlYe19/fV10uHz0/fn6uYI7++hR+38ubjfc/+n1d1EP4i2cRc538v/0ROVkvb4p/GAUA ZU5+IVBVVVW9S1ZSwUReTf4UE7ijHVABQCkKrQQEAPz0/nYtAKDIyb/8WP3z4bjwNQCY4cQN8c/9 5+InvwBg9mInbsmTXwuAsr/gyS8AMPkLpwVg1mK27pa27Tc6AGIvk1ydnVar5ZNnLcy1Arg6Ow3+ Y6vbT3YbgjUAYNZrAHUpf3d/0vn1VK2F9gImDoDUYloL7QVMHADNV/iur4EDXQNYLZ82ltxdt6cy 9vigAsjMqwn/822bq+qTagNyaAGG3J5i0r9yeSMEYF8BkPIqwOBJLwTgMFuAl8k/ZOK3VvutCcAe W4BkVwHqs9k2hUBz0rd/7vIfzLsC2BgCfZM+Y6k2Nl1/+57VOCotATB9CMxUio1N18uPWY2j0hIA +Wg8Ge/uT6rVpX9MmCwAUl8FuLs/qVbVllf91qQ/BDFXTeCgKoCNIbDnSf/+dp385JhUG5tShYcQ EgBBk3Xb11Eh8HPy7/tJeXV2Wr2//R4dAqk3NjXHWy2fgh+nVONQcAuQ+tUktydhaAiMtbGp6z0Y oRVE7DhoAbIXemnu6iwsBMba2PQmVBr33WXyphoHLUD0q/fV2emPy0wjv4pPXgkk3tj0Jhg2/N6Q yZtqHLQASa4CXH/7Xl0HfsLLqxBZTtMOVJc7XBNPtLGpsyrY8Mm2fZM31ThoAbJ6hZ5qo0rQ30m5 sak9UduhsmswxY6DFmAOJwKFthh3H26mCZmhG5v6/v4u/2+pxkEFMAvBT+qToMmfemNTs73a9krd N1aqcRAA071673mjSugrf+qNTW8mb+CkTTUOAmCyyV9/PfUTM7bsT72xqb5/+1U8JExSjEOhATDG iUB9k39vIZCgHx7j/zfVmCZ82bL9ZKC+XXTelw57rgDGvAow940qqTY25TYOAmBjC9D0n//+OH3m z19P00z+ZhUwk40qq+VTktZhtayyGgctwHT6tsfO+KQgOLgWoCn0lf8NG1Ug3wqg+RFdXV8nC5aO V3wr2HCALcCbiW2jCuTbAozxXgAbVSDjANhbNQAcdgsAFFQB2KgCMwuAUk8EAgEwUhUQw0dXwYQB MLcTgYC3stsI1Gwvur7vug2YKADG1hcCJj8ccAuw8dy6nr8PHHALoAqAwloAr/ZQaAswtCIADqwC 2GWyCwaYsAKYcstu17sB65+Z/DBxAKQ6626ry5tqVTXO0P95IEj9MV2r5ZPPr4NDbAH61hCcDXBY 7u5PXv5DAPyY5HWLUR8D1jwOrHWbdxDOd6K3J337Z4IhwxZgkifLh5ve77tuYz5hEPIzCgkAytFs 6Ux+LQAFTPT6+6G3UUAF4ESgcsNg159zgAEw2eVFsuv7EQAUMvlDL+OqCqwBAAIA0AIwG82PcG+/ h6OrtO9rG1ABMMMQmPJ+CAAytW3hzxUDAcCBT/pN+/y7bsMaAIVWA6gAOMD1gL5DX/X9KgAOcNJv uq1rtV8ICAAKDQa0AIAAAPbaAry/XUf/gauz0+r623fjGCd4HK3CHtcArs5O4/q820/V9fKjcYwT PI63imsBAAEACABAAAACABAAgAAABAAgAAABAAgAQAAAAgAEgIcABABQoN7zAK7OTn+8HzuScYxD no6eHz8/v3zXOnjBiUDGyWGc9olAv/3x/+fl3/+axKNVAPU/QAwn3hgndhwnAlkDAAQAIAAAAQAI AEAAAAIAEACAAAAEACAAAAEACAAQAB4CEABAgZwIZJzsx2E8TgQyTvbjOBFoTxVA/Q8Qw4k3xokd x4lA1gAAAQAIAEAAAAIAEACAAAAEACAAAAEACABAAAACAASAhwAEAFAgJwIZJ/txGE/viUCQIycC aQEAAQAIACBI7yKgU4GNk8M47VOBmSgA6n+AGE69NU7sOBantQCAAAAEACAAAAEACABAAAACABAA gAAABAAgAAABAALAQwACACiQU4GNk/04jMepwMyOU4G1AIAAAAQAEORds/9v9lZAKRWAyQ+FBoDJ D8U6qqrq2cMAJbcAgAAABAAgAAABAAgAQAAAAgAQAIAAAAQAIAAAAQAIAEAAAAIAEACAAAAEACAA AAEACABAAAACABAAgAAABAAgAAABAAgAQAAAAgAQAIAAAAQAIAAAAQACABAAgAAABAAgAAABAAgA QAAAAgAQAIAAAAQAIAAAAQAIAEAAAAIAEACAAAAEACAAgKm88xDAfj0+Pgbd7+Hh4eXr8/NzFQAg AICBjqqqevYwQD4tQF3abyrrm2V/l777tX8mACCjAGhP8HrCDpn4XUHQNWZVWQSErIVM/F3uqwKA TFuA0DJ/l/sJAMgsALom8y6X+obe31UAmIFdr/O3f7/r/ioAyLwFCN3kM4QKAA7olV8AwIzFrPoL AGAn9gHATMv/FG8GEgAQoeudfOv1uvr69evL94vFojo+Pk5W9rfvE9o6CACI9OXLl5evLy4uqqqq Xk3++vv6Z5t+P6ZKiFk3EAAwUhjs8rNQsYuGAgBGslgsXlUAQ3r9oRO6/coful5gIxAkWANol/Xr 9frV79X9/7byf4xNQN4NCBPZ1tM3q4L1et25MDgV+wAgwnq93tjbb5rY7apgWzswhvb4KgCI0L7U 15zkfX3/0Krh4eEhKhS2rSmoACAz7QkfutI/ZD1BAMAM7BoCQ3/fVQCIbAGapX6znE91JWDoWkHI /awBQITj4+Pq4uIiaJNP6OSPbQuaIaAFgIS2BcGuQXF+fh68CDjkvloASNgCNA3ZCdhXBfhcAMjc 4+Nj1B7/mDcD+WxAyMzFxUXnpF4sFtHv/ktNBQCRFcCQfr9uB1Ju/U1RAfwP0sAvmQVES+YAAAAA SUVORK5CYII= "
+ style="image-rendering:optimizeSpeed;filter:url(#filter4593)"
+ preserveAspectRatio="none"
+ height="1354.6666"
+ width="1354.6666"
+ clip-path="url(#clipPath4538)" />
+ <rect
+ style="opacity:0.98000004;fill:#7d7d7d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32291663;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5283"
+ width="359.83331"
+ height="338.66666"
+ x="-783.16663"
+ y="-1057.6666" />
+ <rect
+ style="opacity:0.98000004;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32291663;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5287"
+ width="10.583333"
+ height="10.583333"
+ x="105.83333"
+ y="-835.41663" />
+ </g>
+</svg>
diff --git a/misc/vector/bricked_blast_furnace_inactive.svg b/misc/vector/bricked_blast_furnace_inactive.svg
new file mode 100644
index 0000000000..de6f23d0eb
--- /dev/null
+++ b/misc/vector/bricked_blast_furnace_inactive.svg
@@ -0,0 +1,953 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="320"
+ height="320"
+ viewBox="0 0 84.666664 84.666664"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r15371"
+ sodipodi:docname="bricked_blast_furnace_inactive.svg"
+ inkscape:export-filename="C:\Users\Johannes\git\GT5-Unofficial\misc\vector\MACHINE_CASING_BRICKEDBLASTFURNACE_INACTIVE.png"
+ inkscape:export-xdpi="4.8000002"
+ inkscape:export-ydpi="4.8000002">
+ <defs
+ id="defs2">
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter323"
+ inkscape:label="filter0">
+ <feColorMatrix
+ id="feColorMatrix327"
+ values="1.5 0 0 0 0 0 1.24 0 0 0 0 0 0.94 0 0 0 0 0 1 0 " />
+ <feColorMatrix
+ id="feColorMatrix28"
+ values="0.8 0 0 0 0 0 0.8 0 0 0 0 0 0.8 0 0 0 0 0 1 0 " />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter323-2"
+ inkscape:label="filter0">
+ <feColorMatrix
+ id="feColorMatrix327-2"
+ values="1.69 0 0 0 0 0 1 0 0 0 0 0 0.41 0 0 0 0 0 1 0 " />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Greyscale"
+ id="filter973">
+ <feColorMatrix
+ values="0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0 0 0 1 0 "
+ id="feColorMatrix971"
+ result="fbSourceGraphic" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter1066"
+ inkscape:label="filter3">
+ <feColorMatrix
+ id="feColorMatrix1068"
+ values="1.5 0 0 0 0 0 1.5 0 0 0 0 0 1.5 0 0 0 0 0 1 0 " />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4"
+ inkscape:cx="-133.24238"
+ inkscape:cy="185.64421"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ units="px">
+ <inkscape:grid
+ type="xygrid"
+ id="grid4851" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-212.33337)">
+ <image
+ y="261.77823"
+ x="137.37654"
+ id="image18"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ style="filter:url(#filter323);image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="84.666664"
+ width="84.666664" />
+ <image
+ y="215.91263"
+ x="253.26675"
+ id="image18-7"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ style="filter:url(#filter323-2);image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="84.666664"
+ width="84.666664" />
+ <rect
+ style="opacity:0.98000004;fill:#d78034;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect340"
+ width="45.168549"
+ height="24.856066"
+ x="171.85431"
+ y="197.57578" />
+ <g
+ id="g4863"
+ style="filter:url(#filter323)"
+ transform="translate(10.583331,121.70833)">
+ <image
+ y="212.33337"
+ x="1.2715658e-006"
+ id="image4849"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ style="image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="42.333332"
+ width="42.333332" />
+ <image
+ width="42.333332"
+ height="42.333332"
+ preserveAspectRatio="none"
+ style="image-rendering:optimizeSpeed"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ id="image4853"
+ x="42.333336"
+ y="212.33337" />
+ <image
+ y="254.6667"
+ x="42.333336"
+ id="image4855"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ style="image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="42.333332"
+ width="42.333332" />
+ <image
+ width="42.333332"
+ height="42.333332"
+ preserveAspectRatio="none"
+ style="image-rendering:optimizeSpeed"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ id="image4857"
+ x="-7.1054274e-015"
+ y="254.6667" />
+ </g>
+ <g
+ id="g751">
+ <image
+ width="84.666664"
+ height="84.666664"
+ preserveAspectRatio="none"
+ style="image-rendering:optimizeSpeed"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz AAAAvQAAAL0BHVrG+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADxSURB VDiN7dLNSsNAFMXxf+JN+hFLGKGgUBBBRF/AvW/l0/gqPowIRdI0sZl8zEwSV4aCON2Ld/tb3XNO 8PryPAYE7IqKxTzCuR6A1lgIAtZqhc8lLzTvHzkqTciKA8e3zUrObjdel0hCAPalRqXJhHVjWC5i Trm0xjKMI1Xd8albZrFgXY9zA7NYOOUyjyPuri+JROisRa2W6NbgXE/TWiIJvS6lbtiXGgDXD9zf XPG2zQHojEWlidfDb1RpQnGop5Q7Y6fffS5ZUQGwKzUXaULVdNStQTcdxroptN9cnh4ffvR8vll7 d3Ds/zv4Ezv4AptmhMVYeNf6AAAAAElFTkSuQmCC "
+ id="image40"
+ x="0"
+ y="212.33337" />
+ <rect
+ y="291.70837"
+ x="58.208332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect43"
+ style="opacity:0.98000004;fill:#7f6950;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="249.37505"
+ x="58.208332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect43-8"
+ style="opacity:0.98000004;fill:#7f6950;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="286.41672"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect60"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08339"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect60-0"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="249.37505"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect43-8-2"
+ style="opacity:0.98000004;fill:#7f6950;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="286.41672"
+ x="10.583331"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect60-0-9"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="291.70837"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect43-3"
+ style="opacity:0.98000004;fill:#7f6950;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="254.6667"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect122"
+ style="opacity:0.98000004;fill:#b69672;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08337"
+ x="10.583334"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect124"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="238.7917"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect126"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="281.12503"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect128"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="212.33337"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect130"
+ style="opacity:0.98000004;fill:#c09e79;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="212.33337"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect132"
+ style="opacity:0.98000004;fill:#c09e79;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08337"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect156"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08337"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect158"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="281.12503"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect160"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="286.41672"
+ x="37.041668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect162"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08337"
+ x="5.2916665"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect164"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="238.7917"
+ x="37.041668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect166"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="291.70837"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="249.37505"
+ x="79.375"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339-9"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="259.95837"
+ x="79.375"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339-3"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="217.62505"
+ x="37.041668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339-1"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="249.37503"
+ x="-8.8817842e-016"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339-4"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="270.54172"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect681"
+ style="opacity:0.98000004;fill:#846d53;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="259.95837"
+ x="5.2916665"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect683"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="222.9167"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect685"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="217.62503"
+ x="5.2916665"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect689"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="222.9167"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect691"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="265.25003"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect693"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="265.25003"
+ x="5.2916665"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect695"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="265.25003"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect697"
+ style="opacity:0.98000004;fill:#997e60;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <image
+ y="212.71135"
+ x="-115.8497"
+ id="image707"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYJDBYkPynFtwAAAYdJREFUKM+FktFKlHEQxX/f14dY SHoh7aqgvUAi9Cg+QdQDBL1N9Aw+THdCa1vuUppEpi60M+dMF//Fq7C5GAbmnDnMnOmmx1sARdjp SjtUaadKrpTTTleoskgxAAd7O6kKO+1Qo1U2mivklFUOcTa77KHC/nQ+bwqT82+pe7QnX+dpyzU5 v0w5xdCGnV7dnF7dAMD0empYCgNw+eU7sDTPbJkh5LSB/SccPR/1Hy74V7x/SbhC9E3hV/BwZJGq NH1bdyE+Xj9EWJq0c6Xg+v0/has/pCtMH7ZUrv8Qho6UZXrLaS+9arw76t6+6O5xbw66V3vdagdX mCFcYQOHmwCLO5S83u+USCxuSXG80Q1dhZsPqlQttBq5uEWioZWkUFK1upLM0Pxf6zmZczK/GD0F WOtXl7mvgbTTzWn7cIPd0Xban2c/x+Ot9nwpn83udsbrKU9ny3zcfChS3htvpx2unfFmyu2XwrU7 WpdLrvHoUdphhhCT2Y80EiFk0oTIIoREmmy5qOIvirycu2t8lJoAAAAASUVORK5CYII= "
+ style="filter:url(#filter973);image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="84.666664"
+ width="84.666664" />
+ <rect
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect753"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="228.20837" />
+ <rect
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect755"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="228.20837" />
+ <rect
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect757"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="228.20837" />
+ <rect
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect759"
+ width="5.2916665"
+ height="5.2916665"
+ x="26.458332"
+ y="228.20837" />
+ <rect
+ style="opacity:0.98000004;fill:#4a4a4a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect761"
+ width="5.2916665"
+ height="5.2916665"
+ x="31.75"
+ y="228.20837" />
+ <rect
+ style="opacity:0.98000004;fill:#4a4a4a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect763"
+ width="5.2916665"
+ height="5.2916665"
+ x="37.041668"
+ y="228.20837" />
+ <rect
+ y="228.20836"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect765"
+ style="opacity:0.98000004;fill:#474747;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="228.20836"
+ x="47.624996"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect767"
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="228.20836"
+ x="58.208328"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect769"
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="228.20836"
+ x="68.791664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect771"
+ style="opacity:0.98000004;fill:#444444;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect773"
+ width="5.2916665"
+ height="5.2916665"
+ x="63.5"
+ y="228.20836" />
+ <rect
+ y="228.20836"
+ x="52.916668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect775"
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="233.50003"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect777"
+ style="opacity:0.98000004;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="233.50003"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect779"
+ style="opacity:0.98000004;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="233.50003"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect781"
+ style="opacity:0.98000004;fill:#7c7c7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect783"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="238.7917" />
+ <rect
+ style="opacity:0.98000004;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect785"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="238.7917" />
+ <rect
+ style="opacity:0.98000004;fill:#7c7c7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect787"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="238.7917" />
+ <rect
+ y="244.08336"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect789"
+ style="opacity:0.98000004;fill:#424242;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="244.08336"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect791"
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="244.08336"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect793"
+ style="opacity:0.98000004;fill:#7c7c7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#3c3c3c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect795"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="249.37503" />
+ <rect
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect797"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="249.37503" />
+ <rect
+ style="opacity:0.98000004;fill:#7c7c7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect799"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="249.37503" />
+ <rect
+ y="254.6667"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect801"
+ style="opacity:0.98000004;fill:#3b3b3b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="254.6667"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect803"
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="254.6667"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect805"
+ style="opacity:0.98000004;fill:#7c7c7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#383838;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect807"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="259.95837" />
+ <rect
+ style="opacity:0.98000004;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect809"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="259.95837" />
+ <rect
+ style="opacity:0.98000004;fill:#7c7c7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect811"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="259.95837" />
+ <rect
+ y="265.25006"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect813"
+ style="opacity:0.98000004;fill:#383838;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="265.25006"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect815"
+ style="opacity:0.98000004;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="265.25006"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect817"
+ style="opacity:0.98000004;fill:#7c7c7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#343434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect819"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="270.54172" />
+ <rect
+ style="opacity:0.98000004;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect821"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="270.54172" />
+ <rect
+ style="opacity:0.98000004;fill:#7c7c7c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect823"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect825"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="275.83337"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect827"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ y="275.83337"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect829"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#2f2f2f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect839"
+ width="5.2916665"
+ height="5.2916665"
+ x="26.458334"
+ y="265.25006" />
+ <rect
+ y="270.54172"
+ x="26.458334"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect841"
+ style="opacity:0.98000004;fill:#282828;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#343434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect843"
+ width="5.2916665"
+ height="5.2916665"
+ x="26.458334"
+ y="275.83337" />
+ <rect
+ y="265.25006"
+ x="31.75"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect845"
+ style="opacity:0.98000004;fill:#2d2d2d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#262626;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect847"
+ width="5.2916665"
+ height="5.2916665"
+ x="31.75"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="31.75"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect849"
+ style="opacity:0.98000004;fill:#343434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#2b2b2b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect851"
+ width="5.2916665"
+ height="5.2916665"
+ x="37.041664"
+ y="265.25006" />
+ <rect
+ y="270.54172"
+ x="37.041664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect853"
+ style="opacity:0.98000004;fill:#242424;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect855"
+ width="5.2916665"
+ height="5.2916665"
+ x="37.041664"
+ y="275.83337" />
+ <rect
+ y="265.25006"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect857"
+ style="opacity:0.98000004;fill:#292929;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#222222;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect859"
+ width="5.2916665"
+ height="5.2916665"
+ x="42.333332"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect861"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#272727;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect863"
+ width="5.2916665"
+ height="5.2916665"
+ x="47.625"
+ y="265.25006" />
+ <rect
+ y="270.54172"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect865"
+ style="opacity:0.98000004;fill:#1f1f1f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#343434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect867"
+ width="5.2916665"
+ height="5.2916665"
+ x="47.625"
+ y="275.83337" />
+ <rect
+ y="265.25006"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect869"
+ style="opacity:0.98000004;fill:#242424;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#1d1d1d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect871"
+ width="5.2916665"
+ height="5.2916665"
+ x="52.916664"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect873"
+ style="opacity:0.98000004;fill:#343434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#222222;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect887"
+ width="5.2916665"
+ height="5.2916665"
+ x="58.208332"
+ y="265.25006" />
+ <rect
+ y="270.54172"
+ x="58.208332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect889"
+ style="opacity:0.98000004;fill:#1b1b1b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect891"
+ width="5.2916665"
+ height="5.2916665"
+ x="58.208332"
+ y="275.83337" />
+ <rect
+ y="265.25006"
+ x="63.5"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect893"
+ style="opacity:0.98000004;fill:#202020;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect895"
+ width="5.2916665"
+ height="5.2916665"
+ x="63.5"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="63.5"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect897"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#383838;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect899"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="265.25006" />
+ <rect
+ y="270.54172"
+ x="68.791672"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect901"
+ style="opacity:0.98000004;fill:#383838;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect903"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="275.83337" />
+ <rect
+ y="249.37506"
+ x="68.791672"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect905"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#383838;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect907"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="254.66672" />
+ <rect
+ y="259.95837"
+ x="68.791672"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect909"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#444444;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect911"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="233.50003" />
+ <rect
+ y="238.79169"
+ x="68.791672"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect913"
+ style="opacity:0.98000004;fill:#424242;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#3f3f3f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect915"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="244.08334" />
+ <rect
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect917"
+ width="42.333332"
+ height="31.75"
+ x="26.458332"
+ y="233.50003" />
+ <rect
+ y="259.95837"
+ x="58.208332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect919"
+ style="opacity:0.98000004;fill:#292929;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#2b2b2b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect921"
+ width="5.2916665"
+ height="5.2916665"
+ x="52.916668"
+ y="259.95837" />
+ <rect
+ y="259.95837"
+ x="26.458334"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect923"
+ style="opacity:0.98000004;fill:#363636;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)" />
+ <rect
+ style="opacity:0.98000004;fill:#343434;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1066)"
+ id="rect925"
+ width="5.2916665"
+ height="5.2916665"
+ x="31.75"
+ y="259.95837" />
+ </g>
+</svg>
diff --git a/misc/vector/casing.chemically_inert.svg b/misc/vector/casing.chemically_inert.svg
new file mode 100644
index 0000000000..81eb01986b
--- /dev/null
+++ b/misc/vector/casing.chemically_inert.svg
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="320"
+ height="320"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="casing.inert.svg"
+ inkscape:export-filename="C:\Users\Johannes\git\GT5-Unofficial\misc\vector\casing.inert.png"
+ inkscape:export-xdpi="4.5"
+ inkscape:export-ydpi="4.5">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3779">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3781" />
+ <stop
+ id="stop3787"
+ offset="0.5"
+ style="stop-color:#505050;stop-opacity:1;" />
+ <stop
+ style="stop-color:#a0a0a0;stop-opacity:1;"
+ offset="1"
+ id="stop3783" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3769">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3771" />
+ <stop
+ id="stop3777"
+ offset="0.5"
+ style="stop-color:#3c3c3c;stop-opacity:1;" />
+ <stop
+ style="stop-color:#787878;stop-opacity:1;"
+ offset="1"
+ id="stop3773" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3769"
+ id="linearGradient3775"
+ x1="480"
+ y1="480"
+ x2="-160"
+ y2="-160"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3779"
+ id="linearGradient3785"
+ x1="400"
+ y1="400"
+ x2="-80"
+ y2="-80"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,-2.6171874e-6)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3779"
+ id="linearGradient3880"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,732.36218)"
+ x1="480"
+ y1="480"
+ x2="-160"
+ y2="-160" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.98994949"
+ inkscape:cx="-107.66562"
+ inkscape:cy="146.71867"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2982" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-732.36218)">
+ <rect
+ style="opacity:0.98000003999999996;fill:#b6b6b6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect2995"
+ width="235.71428"
+ height="238.57143"
+ x="411.42856"
+ y="-152.85715"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:url(#linearGradient3775);fill-opacity:1.0;fill-rule:nonzero;stroke:none"
+ id="rect3765"
+ width="320"
+ height="320"
+ x="0"
+ y="0"
+ transform="translate(0,732.36218)" />
+ <path
+ style="opacity:0.98000003999999996;fill:url(#linearGradient3880);fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 20,752.36218 0,280.00002 280,0 0,-280.00002 -280,0 z m 20,20 20,0 0,20 -20,0 0,-20 z m 60,0 20,0 0,20 -20,0 0,-20 z m 100,0 20,0 0,20 -20,0 0,-20 z m 60,0 20,0 0,20 -20,0 0,-20 z m -220,60 20,0 0,20 -20,0 0,-20 z m 220,0 20,0 0,20 -20,0 0,-20 z m -220,100 20,0 0,20 -20,0 0,-20 z m 220,0 20,0 0,20 -20,0 0,-20 z m -220,60 20,0 0,20.00002 -20,0 0,-20.00002 z m 60,0 20,0 0,20.00002 -20,0 0,-20.00002 z m 100,0 20,0 0,20.00002 -20,0 0,-20.00002 z m 60,0 20,0 0,20.00002 -20,0 0,-20.00002 z"
+ id="rect3767"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/misc/vector/casing.pipe_polytetrafluoroethylene.svg b/misc/vector/casing.pipe_polytetrafluoroethylene.svg
new file mode 100644
index 0000000000..80d1cf7079
--- /dev/null
+++ b/misc/vector/casing.pipe_polytetrafluoroethylene.svg
@@ -0,0 +1,538 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="320"
+ height="320"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="casing.pipe_polytetrafluoroethylene.svg"
+ inkscape:export-filename="C:\Users\Johannes\git\GT5-Unofficial\misc\vector\casing.inert.png"
+ inkscape:export-xdpi="4.5"
+ inkscape:export-ydpi="4.5">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3992">
+ <stop
+ id="stop3994"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3996" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3976">
+ <stop
+ id="stop3978"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop3982"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3779">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3781" />
+ <stop
+ id="stop3787"
+ offset="0.5"
+ style="stop-color:#505050;stop-opacity:1;" />
+ <stop
+ style="stop-color:#a0a0a0;stop-opacity:1;"
+ offset="1"
+ id="stop3783" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3769">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3771" />
+ <stop
+ id="stop3777"
+ offset="0.5"
+ style="stop-color:#3c3c3c;stop-opacity:1;" />
+ <stop
+ style="stop-color:#787878;stop-opacity:1;"
+ offset="1"
+ id="stop3773" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3769"
+ id="linearGradient3775"
+ x1="480"
+ y1="480"
+ x2="-160"
+ y2="-160"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3779"
+ id="linearGradient3880"
+ gradientUnits="userSpaceOnUse"
+ x1="480"
+ y1="480"
+ x2="-160"
+ y2="-160" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3992"
+ id="linearGradient4014"
+ x1="240"
+ y1="110"
+ x2="-310"
+ y2="110"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3992"
+ id="linearGradient4022"
+ x1="300"
+ y1="90"
+ x2="-250"
+ y2="90"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3992-8"
+ id="linearGradient4022-3"
+ x1="300"
+ y1="90"
+ x2="-250"
+ y2="90"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3992-8">
+ <stop
+ id="stop3994-6"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3996-9" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0,712.36218)"
+ y2="90"
+ x2="-190"
+ y1="90"
+ x1="360"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4039"
+ xlink:href="#linearGradient3992-8"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(0,712.36218)"
+ y2="90"
+ x2="-190"
+ y1="90"
+ x1="360"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4039-6"
+ xlink:href="#linearGradient3992-8-6"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3992-8-6">
+ <stop
+ id="stop3994-6-2"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3996-9-3" />
+ </linearGradient>
+ <linearGradient
+ y2="90"
+ x2="-130"
+ y1="90"
+ x1="420"
+ gradientTransform="translate(0,692.36218)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4073"
+ xlink:href="#linearGradient3992-8-6"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3992-6"
+ id="linearGradient4022-2"
+ x1="300"
+ y1="90"
+ x2="-250"
+ y2="90"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3992-6">
+ <stop
+ id="stop3994-2"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3996-7" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3992-6"
+ id="linearGradient4014-5"
+ x1="240"
+ y1="110"
+ x2="-310"
+ y2="110"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient4113">
+ <stop
+ id="stop4115"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop4117" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0,712.36218)"
+ y2="90"
+ x2="-190"
+ y1="90"
+ x1="360"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4039-7"
+ xlink:href="#linearGradient3992-8-8"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3992-8-8">
+ <stop
+ id="stop3994-6-27"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3996-9-8" />
+ </linearGradient>
+ <linearGradient
+ y2="90"
+ x2="-130"
+ y1="90"
+ x1="420"
+ gradientTransform="translate(0,692.36218)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4073-0"
+ xlink:href="#linearGradient3992-8-6-2"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3992-8-6-2">
+ <stop
+ id="stop3994-6-2-0"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3996-9-3-8" />
+ </linearGradient>
+ <linearGradient
+ y2="90"
+ x2="-130"
+ y1="90"
+ x1="420"
+ gradientTransform="translate(0,692.36218)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4132"
+ xlink:href="#linearGradient3992-8-6-2"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3992-5"
+ id="linearGradient4022-5"
+ x1="300"
+ y1="90"
+ x2="-250"
+ y2="90"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3992-5">
+ <stop
+ id="stop3994-27"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3996-6" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3992-5"
+ id="linearGradient4014-7"
+ x1="240"
+ y1="110"
+ x2="-310"
+ y2="110"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient4113-8">
+ <stop
+ id="stop4115-7"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop4117-8" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0,712.36218)"
+ y2="90"
+ x2="-190"
+ y1="90"
+ x1="360"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4039-1"
+ xlink:href="#linearGradient3992-8-60"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3992-8-60">
+ <stop
+ id="stop3994-6-9"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3996-9-5" />
+ </linearGradient>
+ <linearGradient
+ y2="90"
+ x2="-130"
+ y1="90"
+ x1="420"
+ gradientTransform="translate(0,692.36218)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4073-8"
+ xlink:href="#linearGradient3992-8-6-9"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3992-8-6-9">
+ <stop
+ id="stop3994-6-2-00"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3996-9-3-0" />
+ </linearGradient>
+ <linearGradient
+ y2="90"
+ x2="-130"
+ y1="90"
+ x1="420"
+ gradientTransform="translate(0,692.36218)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4132-7"
+ xlink:href="#linearGradient3992-8-6-9"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4"
+ inkscape:cx="-50.445229"
+ inkscape:cy="258.44101"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2982" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-732.36218)">
+ <rect
+ style="opacity:0.98000003999999996;fill:#b6b6b6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect2995"
+ width="235.71428"
+ height="238.57143"
+ x="411.42856"
+ y="-152.85715"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:url(#linearGradient3775);fill-opacity:1.0;fill-rule:nonzero;stroke:none"
+ id="rect3765"
+ width="320"
+ height="320"
+ x="0"
+ y="0"
+ transform="translate(0,732.36218)" />
+ <path
+ style="opacity:0.98000004;fill:url(#linearGradient3880);fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 20,20 0,280 280,0 0,-280 z m 20,20 20,0 0,20 -20,0 z m 220,0 20,0 0,20 -20,0 z m -220,60 20,0 0,20 -20,0 z m 220,0 20,0 0,20 -20,0 z m -220,100 20,0 0,20 -20,0 z m 220,0 20,0 0,20 -20,0 z m -220,60 20,0 0,20 -20,0 z m 220,0 20,0 0,20 -20,0 z"
+ transform="translate(0,732.36218)"
+ id="rect3767"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccc" />
+ <image
+ y="732.36218"
+ x="-320"
+ id="image3890"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAahJREFU
+OI2Nk02OEzEUhAup12hWdLrzA0NmYA4QCRBwgEg5xHC/rLMdLjFImTh0Vvm7QNuvyoKF3SFsoiye
+3LLs6qrP771aLBZ/JIEiaIJESAKNUCRIgSTIvN99R0EkCkkYvR2lCySMgmQwErJOmGllJ2gQBecc
+CjIdWC6XGA6H2G638N7/q5DW4AO897i//wDnHOq6BqUsIGI0HOH51/PpYtu28CEgeI/gPXxIAk2z
+wbfvX6HsuEh5U7bdbvf/332AD1ngrDouJmYHNLy8rDCZTDCfz+HbZD2ELNK58i0eH39g7RyqqkoO
+OrXBoA9KmE6nFxnQDHVVwZSiF1IiKwrH4+EqBg8PH0EJslOEFONaBnd37yEKRp0LELfvbvH08+ki
+g9lslnrFDFHKr0Bi5RwG/foKBsTvpkFV9mDMEUTDoN9HjBH7/f4ig7b1qHo9mFmGmO2bhOPhcBWD
+m5vXEIlIobDc/+u1Q1VX2Gw2Fxl8+fQZTdOgLMvUSIoRYn5bE8bjMc7BnipPq8lQvikTSBKFjFit
+HSIjLB+O8Wxs8xgbCVGgBMrSPoW/jrSg7n9cfd4AAAAASUVORK5CYII=
+"
+ height="320"
+ width="320" />
+ <g
+ id="g4092">
+ <rect
+ transform="translate(0,732.36218)"
+ y="80"
+ x="60"
+ height="20"
+ width="200"
+ id="rect3964"
+ style="opacity:0.98000003999999996;fill:url(#linearGradient4022);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,732.36218)"
+ y="100"
+ x="80"
+ height="20"
+ width="160"
+ id="rect3966"
+ style="opacity:0.98000003999999996;fill:url(#linearGradient4014);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-opacity:1" />
+ <rect
+ y="792.36218"
+ x="60"
+ height="20"
+ width="200"
+ id="rect3964-8"
+ style="opacity:0.98000003999999996;fill:url(#linearGradient4039);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="772.36218"
+ x="80"
+ height="20.000004"
+ width="160.00002"
+ id="rect3964-8-8"
+ style="opacity:0.98000004;fill:url(#linearGradient4073);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ transform="translate(0,79.999994)"
+ id="g4092-9">
+ <rect
+ transform="translate(0,732.36218)"
+ y="80"
+ x="60"
+ height="20"
+ width="200"
+ id="rect3964-2"
+ style="opacity:0.98000004;fill:url(#linearGradient4022-2);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,732.36218)"
+ y="100"
+ x="80"
+ height="20"
+ width="160"
+ id="rect3966-8"
+ style="opacity:0.98000004;fill:url(#linearGradient4014-5);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="792.36218"
+ x="60"
+ height="20"
+ width="200"
+ id="rect3964-8-2"
+ style="opacity:0.98000004;fill:url(#linearGradient4039-7);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="772.36218"
+ x="80"
+ height="20.000004"
+ width="160.00002"
+ id="rect3964-8-8-0"
+ style="opacity:0.98000004;fill:url(#linearGradient4132);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ transform="translate(0,159.99999)"
+ id="g4092-2">
+ <rect
+ transform="translate(0,732.36218)"
+ y="80"
+ x="60"
+ height="20"
+ width="200"
+ id="rect3964-5"
+ style="opacity:0.98000004;fill:url(#linearGradient4022-5);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,732.36218)"
+ y="100"
+ x="80"
+ height="20"
+ width="160"
+ id="rect3966-5"
+ style="opacity:0.98000004;fill:url(#linearGradient4014-7);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="792.36218"
+ x="60"
+ height="20"
+ width="200"
+ id="rect3964-8-21"
+ style="opacity:0.98000004;fill:url(#linearGradient4039-1);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="772.36218"
+ x="80"
+ height="20.000004"
+ width="160.00002"
+ id="rect3964-8-8-4"
+ style="opacity:0.98000004;fill:url(#linearGradient4132-7);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ </g>
+</svg>
diff --git a/misc/vector/chemistry.acids.svg b/misc/vector/chemistry.acids.svg
new file mode 100644
index 0000000000..7d477fd45c
--- /dev/null
+++ b/misc/vector/chemistry.acids.svg
@@ -0,0 +1,3459 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1360"
+ height="680"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="chemistry.acids.svg"
+ inkscape:export-filename="C:\Users\Johannes\git\GT5-Unofficial\misc\Plastics.png"
+ inkscape:export-xdpi="216"
+ inkscape:export-ydpi="216">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="SquareL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="SquareL"
+ style="overflow:visible">
+ <path
+ id="path7208"
+ d="M -5,-5 -5,5 5,5 5,-5 -5,-5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="scale(0.8,0.8)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondL"
+ style="overflow:visible">
+ <path
+ id="path7244"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="scale(0.8,0.8)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path7138"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotL"
+ style="overflow:visible">
+ <path
+ id="path7199"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(0.8,0,0,0.8,5.92,0.8)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DiamondL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DiamondL"
+ style="overflow:visible">
+ <path
+ id="path3921"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="scale(0.8,0.8)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path3845"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DiamondL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DiamondL-7"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3921-1"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="scale(0.8,0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-9"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-0"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-9-2"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-0-2"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4083"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4085"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-9-23"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-0-3"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4160"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4162"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-6"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-5"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4234"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4236"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-0"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-2"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4234-4"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4236-8"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DiamondL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DiamondL-7-9"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3921-1-0"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="scale(0.8,0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4234-4-1"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4236-8-3"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4234-4-1-5"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4236-8-3-5"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker3541"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3543"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker3541-1"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3543-1"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.70710678"
+ inkscape:cx="627.22545"
+ inkscape:cy="417.39596"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3755"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-372.3622)">
+ <rect
+ style="opacity:0.98000003999999996;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect6424"
+ width="1360"
+ height="680"
+ x="0"
+ y="0"
+ transform="translate(0,372.3622)" />
+ <rect
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.1655612;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3757"
+ width="340"
+ height="160"
+ x="1000"
+ y="392.36218" />
+ <text
+ xml:space="preserve"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.98000004;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ x="1080"
+ y="427.36218"
+ id="text3759"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3761"
+ x="1080"
+ y="427.36218">Normal Reaction</tspan></text>
+ <g
+ id="g3773"
+ transform="translate(1020,-400)">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771"
+ style="fill:#ff8000;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767"
+ sodipodi:role="line">Sulfuric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(1740,-920)"
+ id="g3773-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7"
+ style="fill:#e1e1e1;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-0"
+ sodipodi:role="line">Ethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(2080,-920)"
+ id="g3773-1-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4"
+ style="fill:#c8c8c8;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832">Polyethylene</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:0.89442724;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DiamondL)"
+ d="m 2040,82.36218 80,0"
+ id="path3836"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+ d="m 1020,417.36218 40,0"
+ id="path4282"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.98000004;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ x="1080"
+ y="462.36218"
+ id="text3759-5"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3761-5"
+ x="1080"
+ y="462.36218">Polymerization</tspan></text>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:0.93541437;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#DiamondL)"
+ d="m 1020,452.36218 35,0"
+ id="path4282-1"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(2540,-880)"
+ id="g3773-1-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="17.5"
+ ry="20"
+ y="972.36218"
+ x="-80"
+ height="60.000694"
+ width="260.00009"
+ id="rect3771-7-5"
+ style="fill:#e1e1e1;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2"
+ y="1012.3622"
+ x="50"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="50"
+ id="tspan3767-0-7"
+ sodipodi:role="line">Ethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-800)"
+ id="g3773-1-9-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend-2)"
+ d="m 2720,132.36218 80,0"
+ id="path3836-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(2550,-800)"
+ id="g3773-1-1-2"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-880)"
+ id="g3773-1-9-6-8"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5"
+ style="fill:#e1f0f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-6">Vinyl Chloride</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,202.36218 20,0 0,-70"
+ id="path5174"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2)"
+ d="m 2780,132.36218 0,70 20,0"
+ id="path5176"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <g
+ transform="translate(3100,-880)"
+ id="g3773-1-9-6-8-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8"
+ style="fill:#d7e6e6;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771">Polyvinyl Chloride</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DiamondL-7)"
+ d="m 3060,122.36218 80,0"
+ id="path5554"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(3100,-660)"
+ id="g3773-1-9-6-8-1-7"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9"
+ style="fill:#dcdcdc;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5"
+ y="1010.3622"
+ x="170"
+ style="font-size:22.5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4">Polydimethylsiloxane</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-660)"
+ id="g3773-1-9-6-8-1-7-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1"
+ style="fill:#dcdcdc;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2"
+ y="1010.3622"
+ x="170"
+ style="font-size:21px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3"
+ style="font-size:21px;text-align:center;text-anchor:middle">Dimethyldichlorosilane</tspan></text>
+ </g>
+ <g
+ transform="translate(3100,-580)"
+ id="g3773-1-9-6-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1">Hydrochloric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-580)"
+ id="g3773-1-9-6-3-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-580)"
+ id="g3773-1-9-6-8-1-7-3-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7"
+ style="fill:#3c3c50;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#ffffff">Silicon</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-660)"
+ id="g3773-1-9-6-8-1-7-3-2-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7-1"
+ style="fill:#c82ca0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9-8"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#000000">Chloromethane</tspan></text>
+ </g>
+ <g
+ transform="translate(1740,-660)"
+ id="g3773-1-9-6-8-1-7-3-2-3-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7-1-5"
+ style="fill:#ff0078;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7-9-0"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9-8-2"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#000000">Methane</tspan></text>
+ </g>
+ <g
+ transform="translate(1870,-580)"
+ id="g3773-1-1-2-8"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend-2)"
+ d="m 2720,112.36218 80,0"
+ id="path3836-3-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(2420,-960)"
+ id="g3773-1-9-6-3-3-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8">Oxygen</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-960)"
+ id="g3773-1-9-6-3-3-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-3"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-4"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-4">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-1040)"
+ id="g3773-1-9-6-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-0"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-61">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,-37.63782 20,0 0,150"
+ id="path6124"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,42.36218 20,0"
+ id="path6126"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 2780,112.36218 0,-70 20,0"
+ id="path6128"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 3060,342.36218 80,0"
+ id="path6320"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 3120,342.36218 0,80 20,0"
+ id="path6322"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 3060,422.36218 20,0 0,-80"
+ id="path6324"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 2720,342.36218 80,0"
+ id="path6706"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,422.36218 20,0 0,-80"
+ id="path6708"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2040,422.36218 20,0 0,-80"
+ id="path7092"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 2040,342.36218 420,0"
+ id="path7094"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 2250,342.36218 0,50"
+ id="path7096"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(2080,-580)"
+ id="g3773-1-9-6-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-7"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-0">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1740,492.36218 1700,0"
+ id="path3934"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(3100,-440)"
+ id="g3773-1-9-6-8-1-7-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-4"
+ style="fill:#646464;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-8"
+ y="1010.3622"
+ x="170"
+ style="font-size:22.5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-8"
+ style="font-size:21px;fill:#ffffff">Polytetrafluoroethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-440)"
+ id="g3773-1-9-6-8-1-7-9-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-4-4"
+ style="fill:#7d7d7d;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-8-5"
+ y="1010.3622"
+ x="170"
+ style="font-size:22.5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-8-5"
+ style="font-size:22.5px;fill:#ffffff">Tetrafluoroethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-360)"
+ id="g3773-1-9-6-3-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1">Hydrochloric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-360)"
+ id="g3773-1-9-6-3-1-5"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-2"
+ style="fill:#0088aa;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-6">Hydrofluoric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-440)"
+ id="g3773-1-9-6-8-1-7-3-2-3-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7-1-4"
+ style="fill:#892ca0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7-9-2"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9-8-3"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#000000">Chloroform</tspan></text>
+ </g>
+ <g
+ transform="translate(1740,-440)"
+ id="g3773-1-9-6-8-1-7-3-2-3-6-4"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7-1-5-1"
+ style="fill:#ff0078;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7-9-0-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9-8-2-3"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#000000">Methane</tspan></text>
+ </g>
+ <g
+ transform="translate(1870,-360)"
+ id="g3773-1-1-2-8-8"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6-7"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0-4"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2-2"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2040,642.36217 20,0 0,-79.99999"
+ id="path7092-7"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 2040,562.36218 420,0"
+ id="path7094-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 2250,562.36218 0,50"
+ id="path7096-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(2080,-360)"
+ id="g3773-1-9-6-1-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-7-1"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-4-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-0-8">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend-2)"
+ d="m 2720,562.36218 80,0"
+ id="path3836-3-02"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,632.36218 20,0 0,-70"
+ id="path5174-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2)"
+ d="m 2780,562.36218 0,70 20,0"
+ id="path5176-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DiamondL-7)"
+ d="m 3060,562.36218 80,0"
+ id="path5554-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1740,272.36218 1700,0"
+ id="path3934-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2420,-107.63782 0,380"
+ id="path4321"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(3100,20)"
+ id="g3773-1-9-6-3-1-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3"
+ style="fill:#c88c14;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9">Epoxy Resin</tspan></text>
+ </g>
+ <g
+ transform="translate(3100,100)"
+ id="g3773-1-9-6-3-1-1-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-4"
+ style="fill:#0000c8;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-6">Salt Water</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 3440,712.36218 -1700,0"
+ id="path4377"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(2760,20)"
+ id="g3773-1-9-6-3-1-1-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-6"
+ style="fill:#501d05;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-1">Epichlorohydrin</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-140)"
+ id="g3773-1-9-6-3-1-1-8"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49"
+ style="fill:#003380;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63"
+ y="1012.3622"
+ x="170"
+ style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7">Sodium Hydroxide</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,180)"
+ id="g3773-1-9-6-3-1-1-88"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-2"
+ style="fill:#d4aa00;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-13">Bisphenol A</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-140)"
+ id="g3773-1-9-6-3-1-1-8-5"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49-9"
+ style="fill:#003380;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7-4">Sodium Hydroxide</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-60)"
+ id="g3773-1-9-6-3-1-1-8-5-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49-9-7"
+ style="fill:#6f8a91;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63-8-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7-4-3">Hypochlorous Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,20)"
+ id="g3773-1-9-6-3-1-1-8-5-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49-9-1"
+ style="fill:#87deaa;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63-8-5"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7-4-4">Allyl Chloride</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,180)"
+ id="g3773-1-9-6-3-1-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0"
+ style="fill:#784421;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7">Phenol</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,260)"
+ id="g3773-1-9-6-3-1-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7"
+ style="fill:#afafaf;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60">Acetone</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 3060,1022.3622 80,0"
+ id="path4563"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 3120,1022.3622 0,80 20,0"
+ id="path4565"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 3060,862.36218 20,0 0,160.00002 0,160 -20,0"
+ id="path4775"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2740,1262.3622 0,-160 -20,0"
+ id="path4985"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2720,1182.3622 80,0"
+ id="path4987"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2720,1022.3622 80,0"
+ id="path5197"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,862.36218 20,0 0,160.00002"
+ id="path5407"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,942.36218 20,0"
+ id="path5409"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,1262.3622 20,0"
+ id="path5411"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(2080,180)"
+ id="g3773-1-9-6-3-1-2-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2"
+ style="fill:#552200;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7-0">Cumene</tspan></text>
+ </g>
+ <g
+ transform="translate(2080,260)"
+ id="g3773-1-9-6-3-3-6-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0">Oxygen</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2380,1182.3622 80,0"
+ id="path5467"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2440,1182.3622 0,80 20,0"
+ id="path5677"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2380,1262.3622 20,0 0,-80"
+ id="path5887"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(1740,180)"
+ id="g3773-1-9-6-3-1-2-1-7"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2-1"
+ style="fill:#e1dd55;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7-0-7">Propene</tspan></text>
+ </g>
+ <g
+ transform="translate(1740,260)"
+ id="g3773-1-9-6-3-1-2-1-77"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2-3"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0-3"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5942">Benzene</tspan></text>
+ </g>
+ <g
+ transform="translate(1740,100)"
+ id="g3773-1-9-6-3-1-2-1-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2-9"
+ style="fill:#dcdc00;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7-0-1">Phosphoric Acid</tspan></text>
+ </g>
+ <rect
+ style="fill:#aa8800;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect5946"
+ width="220"
+ height="160"
+ x="-340"
+ y="352.36218"
+ rx="20"
+ ry="20" />
+ <g
+ transform="translate(2080,20)"
+ id="g3773-1-9-6-3-1-2-1-7-8"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2-1-2"
+ style="fill:#e1dd55;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0-7-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7-0-7-6">Propene</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,100)"
+ id="g3773-1-9-6-3-1-16-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-5-3"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-75-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-4-0">Hydrochloric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(2210,100)"
+ id="g3773-1-1-2-8-8-1"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6-7-2"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0-4-5"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2-2-0"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2040,1182.3622 80,0"
+ id="path6029"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2040,1102.3622 20,0 0,160 -20,0"
+ id="path6239"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2380,1022.3622 80,0"
+ id="path6241"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2380,1102.3622 20,0 0,-80"
+ id="path6451"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2440,1022.3622 0,80 20,0"
+ id="path6453"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(2209.9999,-220)"
+ id="g3773-1-1-2-8-8-1-9"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6-7-2-4"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0-4-5-7"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2-2-0-8"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <g
+ transform="translate(2080,-140)"
+ id="g3773-1-9-6-3-3-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(2080,-60)"
+ id="g3773-1-9-6-3-3-3-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-1"
+ style="fill:#ffdcdc;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-6"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-4">Mercury</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2380,942.36218 80,0"
+ id="path6758"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2380,782.36218 20,0 0,160"
+ id="path6968"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2380,862.36218 20,0"
+ id="path6970"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(-140,670)"
+ id="g3773-1-9-6-3-1-1-06">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1"
+ style="fill:#f9c887;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9">Glue</tspan></text>
+ </g>
+ <g
+ transform="translate(-480,590)"
+ id="g3773-1-9-6-3-1-3-8">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7-4"
+ style="fill:#afafaf;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60-4">Acetone</tspan></text>
+ </g>
+ <g
+ transform="translate(-480,670)"
+ id="g3773-1-9-6-3-1-3-3">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7-9"
+ style="fill:#ff9955;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60-8">Polyvinyl Acetate</tspan></text>
+ </g>
+ <g
+ transform="translate(-480,750)"
+ id="g3773-1-9-6-3-1-3-3-0">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7-9-8"
+ style="fill:#eec6af;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2-8-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60-8-7">Methyl Acetate</tspan></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.98000004;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ x="1080"
+ y="497.36218"
+ id="text3759-5-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3761-5-3"
+ x="1080"
+ y="497.36218">Distillation</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.98000004;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ x="1080"
+ y="532.36218"
+ id="text3759-5-8-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3761-5-3-0"
+ x="1080"
+ y="532.36218">Mixer</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DotL)"
+ d="m 1020,487.36218 35,0"
+ id="path7130"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#SquareL)"
+ d="m 1020,522.36218 35,0"
+ id="path7132"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -180,1592.3622 20,0 0,70"
+ id="path3302"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#SquareL)"
+ d="m -180,1662.3622 80,0"
+ id="path3304"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#SquareL)"
+ d="m -180,1682.3622 80,0"
+ id="path3306"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -180,1752.3622 20,0 0,-70"
+ id="path3308"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(-820,670)"
+ id="g3773-1-9-6-3-1-3-3-1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7-9-7"
+ style="fill:#ffb380;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2-8-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60-8-0">Vinyl Acetate</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DiamondL-7-9)"
+ d="m -520,1672.3622 80,0"
+ id="path4861"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(-1160,590)"
+ id="g3773-1-9-6-3-3-6-1-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8">Oxygen</tspan></text>
+ </g>
+ <g
+ transform="translate(-1500,670)"
+ id="g3773-1-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-45"
+ style="fill:#e1e1e1;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-5"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-0-1"
+ sodipodi:role="line">Ethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(-1500,590)"
+ id="g3773-1-2-7"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-45-1"
+ style="fill:#c8b4a0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-5-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-0-1-5"
+ sodipodi:role="line">Acetic Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(-820,750)"
+ id="g3773-1-2-7-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-45-1-7"
+ style="fill:#c8b4a0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-5-1-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-0-1-5-1"
+ sodipodi:role="line">Acetic Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(-820,830)"
+ id="g3773-1-2-7-2-4"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-45-1-7-2"
+ style="fill:#aa8800;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-5-1-6-3"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-0-1-5-1-2"
+ sodipodi:role="line">Methanol</tspan></text>
+ </g>
+ <g
+ transform="translate(-140,210)"
+ id="g3773-1-9-6-3-1-1-06-2">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1"
+ style="fill:#e6e2ab;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8">Rocket Fuel</tspan></text>
+ </g>
+ <g
+ transform="translate(-480,210)"
+ id="g3773-1-9-6-3-1-1-06-2-5">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-7"
+ style="fill:#e6e2ab;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-1">Dimethylhydrazine</tspan></text>
+ </g>
+ <g
+ transform="translate(-480,370)"
+ id="g3773-1-9-6-3-1-1-06-2-9">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-5"
+ style="fill:#004184;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-4"
+ y="1010.3622"
+ x="170"
+ style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-3">Dinitrogen Tetroxide</tspan></text>
+ </g>
+ <g
+ transform="translate(-480,130)"
+ id="g3773-1-9-6-3-3-6-1-9-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3">Oxygen</tspan></text>
+ </g>
+ <g
+ transform="translate(-820,370)"
+ id="g3773-1-9-6-3-1-1-06-2-9-4">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-5-1"
+ style="fill:#64afff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-4-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-3-3">Nitrogen Dioxide</tspan></text>
+ </g>
+ <g
+ transform="translate(-1160,370)"
+ id="g3773-1-9-6-3-1-1-06-2-9-4-8">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-5-1-7"
+ style="fill:#647dc8;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-4-1-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-3-3-2">Nitric Oxide</tspan></text>
+ </g>
+ <g
+ transform="translate(-1500,370)"
+ id="g3773-1-9-6-3-1-1-06-2-9-4-8-7">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-5-1-7-7"
+ style="fill:#3f3480;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-4-1-4-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-3-3-2-3">Ammonia</tspan></text>
+ </g>
+ <g
+ transform="translate(-1500,450)"
+ id="g3773-1-9-6-3-3-6-1-9-1-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2-9"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3-6">Oxygen</tspan></text>
+ </g>
+ <g
+ transform="translate(-1160,450)"
+ id="g3773-1-9-6-3-3-3-5"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-0"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-2"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-8">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(-1160,290)"
+ id="g3773-1-9-6-3-3-6-1-9-1-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2-0"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3-2"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3-4">Oxygen</tspan></text>
+ </g>
+ <g
+ transform="translate(-820,210)"
+ id="g3773-1-9-6-3-3-6-1-9-1-8"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2-6"
+ style="fill:#554469;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3-5"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3-0">Dimethylamine</tspan></text>
+ </g>
+ <g
+ transform="translate(-819.9999,50)"
+ id="g3773-1-9-6-3-3-6-1-9-1-8-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2-6-0"
+ style="fill:#3f9f80;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3-5-0"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3-0-6">Chloramine</tspan></text>
+ </g>
+ <g
+ transform="translate(-1159.9999,50)"
+ id="g3773-1-9-6-3-1-1-8-5-0-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49-9-7-0"
+ style="fill:#6f8a91;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63-8-6-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7-4-3-6">Hypochlorous Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(-1370.0001,130)"
+ id="g3773-1-1-2-8-8-1-9-8"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6-7-2-4-4"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0-4-5-7-9"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2-2-0-8-6"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <g
+ transform="translate(-1500,50)"
+ id="g3773-1-9-6-3-3-3-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-7"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-8"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-82">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(-1499.9999,-30)"
+ id="g3773-1-9-6-3-3-3-0-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-1-1"
+ style="fill:#ffdcdc;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-6-3"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-4-5">Mercury</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m -1199.9999,1052.3622 80,0"
+ id="path6758-9"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -1200,1132.3622 20,0 0,-160.00002 -19.9999,0"
+ id="path6968-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <g
+ transform="translate(-1160,130)"
+ id="g3773-1-9-6-3-1-1-06-2-9-4-8-7-0">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-5-1-7-7-7"
+ style="fill:#3f3480;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-4-1-4-9-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-3-3-2-3-3">Ammonia</tspan></text>
+ </g>
+ <g
+ transform="translate(670,-1520)"
+ id="g3773-1-9-6-1-3-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-7-1-1"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-4-9-5"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-0-8-4">Hydrochloric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(-820,130)"
+ id="g3773-1-9-6-3-3-3-3-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-7-0"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-8-9"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-82-7">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(-1160,210)"
+ id="g3773-1-2-7-2-4-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-45-1-7-2-7"
+ style="fill:#aa8800;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-5-1-6-3-2"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-0-1-5-1-2-6"
+ sodipodi:role="line">Methanol</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -1200,1452.3622 20,0 0,-80"
+ id="path5738"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m -1200,1372.3622 80,0"
+ id="path5740"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m -1140,1372.3622 0,80 20,0"
+ id="path5960"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m -860,1372.3622 80,0"
+ id="path6182"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m -520,1372.3622 80,0"
+ id="path6402"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -180,1372.3622 20,0 0,-150"
+ id="path6622"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#SquareL)"
+ d="m -180,1222.3622 80,0"
+ id="path6624"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#SquareL)"
+ d="m -180,1202.3622 80,0"
+ id="path6844"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -180,1132.3622 20,0 0,70"
+ id="path7064"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m -520,1212.3622 80,0"
+ id="path7066"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(-480,50)"
+ id="g3773-1-9-6-1-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-7-16"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-4-5"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-0-7">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m -460,1212.3622 0,-160 20,0"
+ id="path7749"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -520,1052.3622 20,0 0,160"
+ id="path7969"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m -860,1212.3622 80,0"
+ id="path7971"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m -800,1212.3622 0,-70 20,0"
+ id="path8191"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -860,1122.3622 20,0 0,-70"
+ id="path8411"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m -860,1052.3622 80,0"
+ id="path8413"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m -800,1052.3622 0,70 20,0"
+ id="path8633"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:none"
+ d="m -860,1142.3622 20,0 0,70"
+ id="path8853"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -860,1292.3622 20,0 0,80"
+ id="path9291"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m -1200,1672.3622 420,0"
+ id="path9293"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -990,1622.3622 0,50"
+ id="path9513"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -1200,1592.3622 20,0 0,80"
+ id="path9515"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m -520,1752.3622 80,0"
+ id="path9517"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -520,1832.3622 20,0 0,-80"
+ id="path9519"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -1500,1522.3622 1700,0"
+ id="path9739"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g3773-17"
+ transform="translate(680,-400)">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-4"
+ style="fill:#a0a014;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-0"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-9"
+ sodipodi:role="line">Sulfur Trioxide</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-320)"
+ id="g3773-1-9-6-3-3-3-3-2-4"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-7-0-8"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-8-9-8"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-82-7-2">Water</tspan></text>
+ </g>
+ <g
+ id="g3773-17-4"
+ transform="translate(340,-400)">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-4-5"
+ style="fill:#c8c819;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-0-5"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-9-1"
+ sodipodi:role="line">Sulfur Dioxide</tspan></text>
+ </g>
+ <g
+ id="g3773-17-2"
+ transform="translate(0,-320)">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-4-7"
+ style="fill:#ffff00;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-0-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-9-14"
+ sodipodi:role="line">Sulfur</tspan></text>
+ </g>
+ <g
+ transform="translate(0,-400)"
+ id="g3773-1-9-6-3-3-6-1-9-1-85"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2-7"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3-1">Oxygen</tspan></text>
+ </g>
+ <g
+ id="g3773-8"
+ transform="translate(0,-480)">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-9"
+ style="fill:#ff8000;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-2"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-7"
+ sodipodi:role="line">Hydrogen Sulfide</tspan></text>
+ </g>
+ <g
+ transform="translate(340,-480)"
+ id="g3773-1-9-6-3-3-3-3-2-4-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-7-0-8-5"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-8-9-8-4"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-82-7-2-3">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(340,-320)"
+ id="g3773-1-9-6-3-3-6-1-9-1-85-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2-7-2"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3-6-3"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3-1-3">Oxygen</tspan></text>
+ </g>
+ <g
+ id="g3773-17-4-4"
+ transform="translate(0,-560)">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-4-5-1"
+ style="fill:#c8c819;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-0-5-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-9-1-3"
+ sodipodi:role="line">Sulfur Dioxide</tspan></text>
+ </g>
+ <g
+ id="g3773-17-2-8"
+ transform="translate(340,-560)">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-4-7-7"
+ style="fill:#ffff00;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-0-6-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-9-14-2"
+ sodipodi:role="line">Sulfur</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-100)"
+ id="g3773-1-9-6-3-1-1-06-2-1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-74"
+ style="fill:#e6e2ab;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-0"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-9">Nitric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-100)"
+ id="g3773-1-9-6-3-1-1-06-2-9-4-4">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-5-1-8"
+ style="fill:#64afff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-4-1-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-3-3-24">Nitrogen Dioxide</tspan></text>
+ </g>
+ <g
+ transform="translate(340,-100)"
+ id="g3773-1-9-6-3-1-1-06-2-9-4-8-1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-5-1-7-71"
+ style="fill:#647dc8;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-4-1-4-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-3-3-2-5">Nitric Oxide</tspan></text>
+ </g>
+ <g
+ transform="translate(0,-100)"
+ id="g3773-1-9-6-3-1-1-06-2-9-4-8-7-2">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-5-1-7-7-76"
+ style="fill:#3f3480;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-4-1-4-9-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-3-3-2-3-4">Ammonia</tspan></text>
+ </g>
+ <g
+ transform="translate(0,-20)"
+ id="g3773-1-9-6-3-3-6-1-9-1-1-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2-9-3"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3-8-2"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3-6-2">Oxygen</tspan></text>
+ </g>
+ <g
+ transform="translate(340,-20)"
+ id="g3773-1-9-6-3-3-3-5-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-0-6"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-2-8"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-8-5">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(340,-180)"
+ id="g3773-1-9-6-3-3-6-1-9-1-6-7"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2-0-6"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3-2-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3-4-8">Oxygen</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 300,982.3622 20,0 0,-80"
+ id="path5738-9"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 300,902.3622 80,0"
+ id="path5740-2"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 360,902.3622 0,80 20,0"
+ id="path5960-7"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 640,822.36219 20,0 0,80.00001"
+ id="path9291-9"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3541)"
+ d="m 640,902.36218 80,0"
+ id="path3630"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(680,-180)"
+ id="g3773-1-9-6-3-3-3-3-2-4-5"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-7-0-8-4"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-8-9-8-3"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-82-7-2-1">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-20)"
+ id="g3773-1-9-6-3-3-6-1-9-1-6-7-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2-0-6-3"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3-2-1-3"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3-4-8-4">Oxygen</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3541)"
+ d="m 980,902.36218 80,0"
+ id="path3630-3"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 980,822.36218 20,0 0,160 -20,0"
+ id="path4828"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 0,752.36218 1360,0"
+ id="path4830"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 980,310 20,0 0,-80"
+ id="path4832"
+ inkscape:connector-curvature="0"
+ transform="translate(0,372.3622)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3541-1)"
+ d="m 980,230 80,0"
+ id="path4834"
+ inkscape:connector-curvature="0"
+ transform="translate(0,372.3622)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3541-1)"
+ d="m 640,230 80,0"
+ id="path5060"
+ inkscape:connector-curvature="0"
+ transform="translate(0,372.3622)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 640,310 20,0 0,-80"
+ id="path5062"
+ inkscape:connector-curvature="0"
+ transform="translate(0,372.3622)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 300,160 20,0 0,60"
+ id="path5288"
+ inkscape:connector-curvature="0"
+ transform="translate(0,372.3622)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3541-1)"
+ d="m 300,220 80,0"
+ id="path5290"
+ inkscape:connector-curvature="0"
+ transform="translate(0,372.3622)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3541-1)"
+ d="m 360,220 0,-60 20,0"
+ id="path5292"
+ inkscape:connector-curvature="0"
+ transform="translate(0,372.3622)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3541-1)"
+ d="m 300,240 80,0"
+ id="path5294"
+ inkscape:connector-curvature="0"
+ transform="translate(0,372.3622)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 300,310 20,0 0,-70"
+ id="path5296"
+ inkscape:connector-curvature="0"
+ transform="translate(0,372.3622)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3541-1)"
+ d="m 300,140 80,0"
+ id="path5298"
+ inkscape:connector-curvature="0"
+ transform="translate(0,372.3622)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 300,70 20,0 0,70"
+ id="path5300"
+ inkscape:connector-curvature="0"
+ transform="translate(0,372.3622)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3541-1)"
+ d="m 360,140 0,-70 20,0"
+ id="path5302"
+ inkscape:connector-curvature="0"
+ transform="translate(0,372.3622)" />
+ </g>
+</svg>
diff --git a/misc/vector/chemistry.misc.svg b/misc/vector/chemistry.misc.svg
new file mode 100644
index 0000000000..2a8c74552d
--- /dev/null
+++ b/misc/vector/chemistry.misc.svg
@@ -0,0 +1,2838 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1700"
+ height="1000"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="chemistry.misc.svg"
+ inkscape:export-filename="C:\Users\Johannes\git\GT5-Unofficial\misc\Plastics.png"
+ inkscape:export-xdpi="216"
+ inkscape:export-ydpi="216">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="SquareL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="SquareL"
+ style="overflow:visible">
+ <path
+ id="path7208"
+ d="M -5,-5 -5,5 5,5 5,-5 -5,-5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="scale(0.8,0.8)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondL"
+ style="overflow:visible">
+ <path
+ id="path7244"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="scale(0.8,0.8)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path7138"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotL"
+ style="overflow:visible">
+ <path
+ id="path7199"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(0.8,0,0,0.8,5.92,0.8)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DiamondL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DiamondL"
+ style="overflow:visible">
+ <path
+ id="path3921"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="scale(0.8,0.8)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path3845"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DiamondL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DiamondL-7"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3921-1"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="scale(0.8,0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-9"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-0"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-9-2"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-0-2"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4083"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4085"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-9-23"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-0-3"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4160"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4162"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-6"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-5"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4234"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4236"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-0"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-2"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4234-4"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4236-8"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DiamondL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DiamondL-7-9"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3921-1-0"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="scale(0.8,0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4234-4-1"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4236-8-3"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.5"
+ inkscape:cx="332.41727"
+ inkscape:cy="368.79319"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3755"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-52.36218)">
+ <rect
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect8470"
+ width="1700"
+ height="1000"
+ x="0"
+ y="52.362179" />
+ <rect
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.1655612;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3757"
+ width="340"
+ height="160"
+ x="1340"
+ y="72.362183" />
+ <text
+ xml:space="preserve"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.98000004;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ x="1420"
+ y="107.36218"
+ id="text3759"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3761"
+ x="1420"
+ y="107.36218">Normal Reaction</tspan></text>
+ <g
+ id="g3773"
+ transform="translate(-410,-320)">
+ <rect
+ rx="23.75"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="190"
+ id="rect3771"
+ style="fill:#ff8000;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765"
+ y="1012.3622"
+ x="50"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="50"
+ id="tspan3767"
+ sodipodi:role="line">Sulfuric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(1740,-920)"
+ id="g3773-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7"
+ style="fill:#e1e1e1;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-0"
+ sodipodi:role="line">Ethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(2080,-920)"
+ id="g3773-1-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4"
+ style="fill:#c8c8c8;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832">Polyethylene</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:0.89442724;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DiamondL)"
+ d="m 2040,82.36218 80,0"
+ id="path3836"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+ d="m 1360,97.36218 40,0"
+ id="path4282"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.98000004;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ x="1420"
+ y="142.36218"
+ id="text3759-5"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3761-5"
+ x="1420"
+ y="142.36218">Polymerization</tspan></text>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:0.93541437;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#DiamondL)"
+ d="m 1360,132.36218 35,0"
+ id="path4282-1"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(2540,-880)"
+ id="g3773-1-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="17.5"
+ ry="20"
+ y="972.36218"
+ x="-80"
+ height="60.000694"
+ width="260.00009"
+ id="rect3771-7-5"
+ style="fill:#e1e1e1;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2"
+ y="1012.3622"
+ x="50"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="50"
+ id="tspan3767-0-7"
+ sodipodi:role="line">Ethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-800)"
+ id="g3773-1-9-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend-2)"
+ d="m 2720,132.36218 80,0"
+ id="path3836-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(2550,-800)"
+ id="g3773-1-1-2"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-880)"
+ id="g3773-1-9-6-8"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5"
+ style="fill:#e1f0f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-6">Vinyl Chloride</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,202.36218 20,0 0,-70"
+ id="path5174"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2)"
+ d="m 2780,132.36218 0,70 20,0"
+ id="path5176"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <g
+ transform="translate(3100,-880)"
+ id="g3773-1-9-6-8-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8"
+ style="fill:#d7e6e6;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771">Polyvinyl Chloride</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DiamondL-7)"
+ d="m 3060,122.36218 80,0"
+ id="path5554"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(3100,-660)"
+ id="g3773-1-9-6-8-1-7"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9"
+ style="fill:#dcdcdc;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5"
+ y="1010.3622"
+ x="170"
+ style="font-size:22.5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4">Polydimethylsiloxane</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-660)"
+ id="g3773-1-9-6-8-1-7-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1"
+ style="fill:#dcdcdc;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2"
+ y="1010.3622"
+ x="170"
+ style="font-size:21px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3"
+ style="font-size:21px;text-align:center;text-anchor:middle">Dimethyldichlorosilane</tspan></text>
+ </g>
+ <g
+ transform="translate(3100,-580)"
+ id="g3773-1-9-6-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1">Hydrochloric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-580)"
+ id="g3773-1-9-6-3-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-580)"
+ id="g3773-1-9-6-8-1-7-3-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7"
+ style="fill:#3c3c50;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#ffffff">Silicon</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-660)"
+ id="g3773-1-9-6-8-1-7-3-2-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7-1"
+ style="fill:#c82ca0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9-8"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#000000">Chloromethane</tspan></text>
+ </g>
+ <g
+ transform="translate(1740,-660)"
+ id="g3773-1-9-6-8-1-7-3-2-3-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7-1-5"
+ style="fill:#ff0078;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7-9-0"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9-8-2"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#000000">Methane</tspan></text>
+ </g>
+ <g
+ transform="translate(1870,-580)"
+ id="g3773-1-1-2-8"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend-2)"
+ d="m 2720,112.36218 80,0"
+ id="path3836-3-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(2420,-960)"
+ id="g3773-1-9-6-3-3-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8">Oxygen</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-960)"
+ id="g3773-1-9-6-3-3-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-3"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-4"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-4">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-1040)"
+ id="g3773-1-9-6-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-0"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-61">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,-37.63782 20,0 0,150"
+ id="path6124"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,42.36218 20,0"
+ id="path6126"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 2780,112.36218 0,-70 20,0"
+ id="path6128"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 3060,342.36218 80,0"
+ id="path6320"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 3120,342.36218 0,80 20,0"
+ id="path6322"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 3060,422.36218 20,0 0,-80"
+ id="path6324"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 2720,342.36218 80,0"
+ id="path6706"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,422.36218 20,0 0,-80"
+ id="path6708"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2040,422.36218 20,0 0,-80"
+ id="path7092"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 2040,342.36218 420,0"
+ id="path7094"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 2250,342.36218 0,50"
+ id="path7096"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(2080,-580)"
+ id="g3773-1-9-6-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-7"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-0">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1740,492.36218 1700,0"
+ id="path3934"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(3100,-440)"
+ id="g3773-1-9-6-8-1-7-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-4"
+ style="fill:#646464;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-8"
+ y="1010.3622"
+ x="170"
+ style="font-size:22.5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-8"
+ style="font-size:21px;fill:#ffffff">Polytetrafluoroethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-440)"
+ id="g3773-1-9-6-8-1-7-9-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-4-4"
+ style="fill:#7d7d7d;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-8-5"
+ y="1010.3622"
+ x="170"
+ style="font-size:22.5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-8-5"
+ style="font-size:22.5px;fill:#ffffff">Tetrafluoroethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-360)"
+ id="g3773-1-9-6-3-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1">Hydrochloric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-360)"
+ id="g3773-1-9-6-3-1-5"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-2"
+ style="fill:#0088aa;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-6">Hydrofluoric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-440)"
+ id="g3773-1-9-6-8-1-7-3-2-3-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7-1-4"
+ style="fill:#892ca0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7-9-2"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9-8-3"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#000000">Chloroform</tspan></text>
+ </g>
+ <g
+ transform="translate(1740,-440)"
+ id="g3773-1-9-6-8-1-7-3-2-3-6-4"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7-1-5-1"
+ style="fill:#ff0078;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7-9-0-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9-8-2-3"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#000000">Methane</tspan></text>
+ </g>
+ <g
+ transform="translate(1870,-360)"
+ id="g3773-1-1-2-8-8"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6-7"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0-4"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2-2"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2040,642.36217 20,0 0,-79.99999"
+ id="path7092-7"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 2040,562.36218 420,0"
+ id="path7094-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 2250,562.36218 0,50"
+ id="path7096-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(2080,-360)"
+ id="g3773-1-9-6-1-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-7-1"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-4-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-0-8">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend-2)"
+ d="m 2720,562.36218 80,0"
+ id="path3836-3-02"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,632.36218 20,0 0,-70"
+ id="path5174-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2)"
+ d="m 2780,562.36218 0,70 20,0"
+ id="path5176-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DiamondL-7)"
+ d="m 3060,562.36218 80,0"
+ id="path5554-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1740,272.36218 1700,0"
+ id="path3934-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2420,-107.63782 0,380"
+ id="path4321"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(3100,20)"
+ id="g3773-1-9-6-3-1-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3"
+ style="fill:#c88c14;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9">Epoxy Resin</tspan></text>
+ </g>
+ <g
+ transform="translate(3100,100)"
+ id="g3773-1-9-6-3-1-1-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-4"
+ style="fill:#0000c8;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-6">Salt Water</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 3440,712.36218 -1700,0"
+ id="path4377"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(2760,20)"
+ id="g3773-1-9-6-3-1-1-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-6"
+ style="fill:#501d05;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-1">Epichlorohydrin</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,-140)"
+ id="g3773-1-9-6-3-1-1-8"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49"
+ style="fill:#003380;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63"
+ y="1012.3622"
+ x="170"
+ style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7">Sodium Hydroxide</tspan></text>
+ </g>
+ <g
+ transform="translate(2760,180)"
+ id="g3773-1-9-6-3-1-1-88"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-2"
+ style="fill:#d4aa00;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-13">Bisphenol A</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-140)"
+ id="g3773-1-9-6-3-1-1-8-5"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49-9"
+ style="fill:#003380;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7-4">Sodium Hydroxide</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,-60)"
+ id="g3773-1-9-6-3-1-1-8-5-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49-9-7"
+ style="fill:#6f8a91;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63-8-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7-4-3">Hypochlorous Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,20)"
+ id="g3773-1-9-6-3-1-1-8-5-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49-9-1"
+ style="fill:#87deaa;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63-8-5"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7-4-4">Allyl Chloride</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,180)"
+ id="g3773-1-9-6-3-1-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0"
+ style="fill:#784421;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7">Phenol</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,260)"
+ id="g3773-1-9-6-3-1-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7"
+ style="fill:#afafaf;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60">Acetone</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 3060,1022.3622 80,0"
+ id="path4563"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 3120,1022.3622 0,80 20,0"
+ id="path4565"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 3060,862.36218 20,0 0,160.00002 0,160 -20,0"
+ id="path4775"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2740,1262.3622 0,-160 -20,0"
+ id="path4985"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2720,1182.3622 80,0"
+ id="path4987"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2720,1022.3622 80,0"
+ id="path5197"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,862.36218 20,0 0,160.00002"
+ id="path5407"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,942.36218 20,0"
+ id="path5409"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2720,1262.3622 20,0"
+ id="path5411"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(2080,180)"
+ id="g3773-1-9-6-3-1-2-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2"
+ style="fill:#552200;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7-0">Cumene</tspan></text>
+ </g>
+ <g
+ transform="translate(2080,260)"
+ id="g3773-1-9-6-3-3-6-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0">Oxygen</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2380,1182.3622 80,0"
+ id="path5467"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2440,1182.3622 0,80 20,0"
+ id="path5677"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2380,1262.3622 20,0 0,-80"
+ id="path5887"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(1740,180)"
+ id="g3773-1-9-6-3-1-2-1-7"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2-1"
+ style="fill:#e1dd55;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7-0-7">Propene</tspan></text>
+ </g>
+ <g
+ transform="translate(1740,260)"
+ id="g3773-1-9-6-3-1-2-1-77"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2-3"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0-3"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5942">Benzene</tspan></text>
+ </g>
+ <g
+ transform="translate(1740,100)"
+ id="g3773-1-9-6-3-1-2-1-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2-9"
+ style="fill:#dcdc00;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7-0-1">Phosphoric Acid</tspan></text>
+ </g>
+ <rect
+ style="fill:#aa8800;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect5946"
+ width="220"
+ height="160"
+ x="-340"
+ y="352.36218"
+ rx="20"
+ ry="20" />
+ <g
+ transform="translate(2080,20)"
+ id="g3773-1-9-6-3-1-2-1-7-8"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2-1-2"
+ style="fill:#e1dd55;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0-7-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7-0-7-6">Propene</tspan></text>
+ </g>
+ <g
+ transform="translate(2420,100)"
+ id="g3773-1-9-6-3-1-16-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-5-3"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-75-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-4-0">Hydrochloric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(2210,100)"
+ id="g3773-1-1-2-8-8-1"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6-7-2"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0-4-5"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2-2-0"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2040,1182.3622 80,0"
+ id="path6029"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2040,1102.3622 20,0 0,160 -20,0"
+ id="path6239"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2380,1022.3622 80,0"
+ id="path6241"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2380,1102.3622 20,0 0,-80"
+ id="path6451"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2440,1022.3622 0,80 20,0"
+ id="path6453"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(2209.9999,-220)"
+ id="g3773-1-1-2-8-8-1-9"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6-7-2-4"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0-4-5-7"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2-2-0-8"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <g
+ transform="translate(2080,-140)"
+ id="g3773-1-9-6-3-3-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(2080,-60)"
+ id="g3773-1-9-6-3-3-3-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-1"
+ style="fill:#ffdcdc;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-6"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-4">Mercury</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 2380,942.36218 80,0"
+ id="path6758"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2380,782.36218 20,0 0,160"
+ id="path6968"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 2380,862.36218 20,0"
+ id="path6970"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(1360,-180)"
+ id="g3773-1-9-6-3-1-1-06">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1"
+ style="fill:#f9c887;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9">Glue</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-260)"
+ id="g3773-1-9-6-3-1-3-8">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7-4"
+ style="fill:#afafaf;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60-4">Acetone</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-180)"
+ id="g3773-1-9-6-3-1-3-3">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7-9"
+ style="fill:#ff9955;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60-8">Polyvinyl Acetate</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-100)"
+ id="g3773-1-9-6-3-1-3-3-0">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7-9-8"
+ style="fill:#eec6af;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2-8-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60-8-7">Methyl Acetate</tspan></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.98000004;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ x="1420"
+ y="177.36218"
+ id="text3759-5-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3761-5-3"
+ x="1420"
+ y="177.36218">Distillation</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.98000004;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ x="1420"
+ y="212.36218"
+ id="text3759-5-8-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3761-5-3-0"
+ x="1420"
+ y="212.36218">Mixer</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DotL)"
+ d="m 1360,167.36218 35,0"
+ id="path7130"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#SquareL)"
+ d="m 1360,202.36218 35,0"
+ id="path7132"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1320,742.36218 20,0 0,70"
+ id="path3302"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#SquareL)"
+ d="m 1320,812.36218 80,0"
+ id="path3304"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#SquareL)"
+ d="m 1320,832.36218 80,0"
+ id="path3306"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1320,902.36217 20,0 0,-69.99999"
+ id="path3308"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(680,-180)"
+ id="g3773-1-9-6-3-1-3-3-1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7-9-7"
+ style="fill:#ffb380;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2-8-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60-8-0">Vinyl Acetate</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DiamondL-7-9)"
+ d="m 980,822.36218 80,0"
+ id="path4861"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(340,-260)"
+ id="g3773-1-9-6-3-3-6-1-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8">Oxygen</tspan></text>
+ </g>
+ <g
+ transform="translate(0,-180)"
+ id="g3773-1-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-45"
+ style="fill:#e1e1e1;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-5"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-0-1"
+ sodipodi:role="line">Ethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(0,-260)"
+ id="g3773-1-2-7"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-45-1"
+ style="fill:#c8b4a0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-5-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-0-1-5"
+ sodipodi:role="line">Acetic Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-100)"
+ id="g3773-1-2-7-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-45-1-7"
+ style="fill:#c8b4a0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-5-1-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-0-1-5-1"
+ sodipodi:role="line">Acetic Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-20)"
+ id="g3773-1-2-7-2-4"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-45-1-7-2"
+ style="fill:#aa8800;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-5-1-6-3"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-0-1-5-1-2"
+ sodipodi:role="line">Methanol</tspan></text>
+ </g>
+ <g
+ transform="translate(1360,-640)"
+ id="g3773-1-9-6-3-1-1-06-2">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1"
+ style="fill:#e6e2ab;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8">Rocket Fuel</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-640)"
+ id="g3773-1-9-6-3-1-1-06-2-5">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-7"
+ style="fill:#e6e2ab;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-1">Dimethylhydrazine</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-480)"
+ id="g3773-1-9-6-3-1-1-06-2-9">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-5"
+ style="fill:#004184;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-4"
+ y="1010.3622"
+ x="170"
+ style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-3">Dinitrogen Tetroxide</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-720)"
+ id="g3773-1-9-6-3-3-6-1-9-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3">Oxygen</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-480)"
+ id="g3773-1-9-6-3-1-1-06-2-9-4">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-5-1"
+ style="fill:#64afff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-4-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-3-3">Nitrogen Dioxide</tspan></text>
+ </g>
+ <g
+ transform="translate(340,-480)"
+ id="g3773-1-9-6-3-1-1-06-2-9-4-8">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-5-1-7"
+ style="fill:#647dc8;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-4-1-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-3-3-2">Nitric Oxide</tspan></text>
+ </g>
+ <g
+ transform="translate(0,-480)"
+ id="g3773-1-9-6-3-1-1-06-2-9-4-8-7">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-5-1-7-7"
+ style="fill:#3f3480;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-4-1-4-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-3-3-2-3">Ammonia</tspan></text>
+ </g>
+ <g
+ transform="translate(0,-400)"
+ id="g3773-1-9-6-3-3-6-1-9-1-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2-9"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3-6">Oxygen</tspan></text>
+ </g>
+ <g
+ transform="translate(340,-400)"
+ id="g3773-1-9-6-3-3-3-5"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-0"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-2"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-8">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(340,-560)"
+ id="g3773-1-9-6-3-3-6-1-9-1-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2-0"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3-2"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3-4">Oxygen</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-640)"
+ id="g3773-1-9-6-3-3-6-1-9-1-8"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2-6"
+ style="fill:#554469;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3-5"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3-0">Dimethylamine</tspan></text>
+ </g>
+ <g
+ transform="translate(680.0001,-800)"
+ id="g3773-1-9-6-3-3-6-1-9-1-8-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4-4-2-6-0"
+ style="fill:#3f9f80;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6-8-3-5-0"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0-8-3-0-6">Chloramine</tspan></text>
+ </g>
+ <g
+ transform="translate(340.0001,-800)"
+ id="g3773-1-9-6-3-1-1-8-5-0-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49-9-7-0"
+ style="fill:#6f8a91;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63-8-6-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7-4-3-6">Hypochlorous Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(129.99988,-720)"
+ id="g3773-1-1-2-8-8-1-9-8"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6-7-2-4-4"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0-4-5-7-9"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2-2-0-8-6"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <g
+ transform="translate(0,-800)"
+ id="g3773-1-9-6-3-3-3-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-7"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-8"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-82">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(1e-4,-880)"
+ id="g3773-1-9-6-3-3-3-0-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-1-1"
+ style="fill:#ffdcdc;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-6-3"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-4-5">Mercury</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 300.0001,202.36218 80,0"
+ id="path6758-9"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 300,282.36218 20,0 0,-160 -19.9999,0"
+ id="path6968-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <g
+ transform="translate(340,-720)"
+ id="g3773-1-9-6-3-1-1-06-2-9-4-8-7-0">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1-1-5-1-7-7-7"
+ style="fill:#3f3480;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8-6-4-1-4-9-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9-8-3-3-2-3-3">Ammonia</tspan></text>
+ </g>
+ <g
+ transform="translate(670,-1520)"
+ id="g3773-1-9-6-1-3-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-7-1-1"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-4-9-5"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-0-8-4">Hydrochloric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-720)"
+ id="g3773-1-9-6-3-3-3-3-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-7-0"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-8-9"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-82-7">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(340,-640)"
+ id="g3773-1-2-7-2-4-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-45-1-7-2-7"
+ style="fill:#aa8800;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-5-1-6-3-2"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-0-1-5-1-2-6"
+ sodipodi:role="line">Methanol</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 300,602.36218 20,0 0,-80"
+ id="path5738"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 300,522.36218 80,0"
+ id="path5740"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 360,522.36218 0,80 20,0"
+ id="path5960"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 640,522.36218 80,0"
+ id="path6182"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 980,522.36218 80,0"
+ id="path6402"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1320,522.36218 20,0 0,-150"
+ id="path6622"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#SquareL)"
+ d="m 1320,372.36218 80,0"
+ id="path6624"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#SquareL)"
+ d="m 1320,352.36218 80,0"
+ id="path6844"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1320,282.36218 20,0 0,70"
+ id="path7064"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 980,362.36218 80,0"
+ id="path7066"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(1020,-800)"
+ id="g3773-1-9-6-1-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-7-16"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-4-5"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-0-7">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 1040,362.36218 0,-160 20,0"
+ id="path7749"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 980,202.36218 20,0 0,160"
+ id="path7969"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 640,362.36218 80,0"
+ id="path7971"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 700,362.36218 0,-70 20,0"
+ id="path8191"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 640,272.36218 20,0 0,-70"
+ id="path8411"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 640,202.36218 80,0"
+ id="path8413"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 700,202.36218 0,70 20,0"
+ id="path8633"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:none"
+ d="m 640,292.36218 20,0 0,70"
+ id="path8853"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 640,442.36218 20,0 0,80"
+ id="path9291"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 300,822.36218 420,0"
+ id="path9293"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 510,772.36218 0,50"
+ id="path9513"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 300,742.36218 20,0 0,80"
+ id="path9515"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4-1)"
+ d="m 980,902.36218 80,0"
+ id="path9517"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 980,982.3622 20,0 0,-80.00002"
+ id="path9519"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 0,672.36218 1700,0"
+ id="path9739"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/misc/vector/chemistry.plastics.svg b/misc/vector/chemistry.plastics.svg
new file mode 100644
index 0000000000..0f3f29b1be
--- /dev/null
+++ b/misc/vector/chemistry.plastics.svg
@@ -0,0 +1,2070 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1700"
+ height="1440"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="chemistry.plastics.svg"
+ inkscape:export-filename="C:\Users\Johannes\git\GT5-Unofficial\misc\Plastics.png"
+ inkscape:export-xdpi="216"
+ inkscape:export-ydpi="216">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="SquareL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="SquareL"
+ style="overflow:visible">
+ <path
+ id="path7208"
+ d="M -5.0,-5.0 L -5.0,5.0 L 5.0,5.0 L 5.0,-5.0 L -5.0,-5.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="EmptyDiamondL"
+ style="overflow:visible">
+ <path
+ id="path7244"
+ d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z "
+ style="fill-rule:evenodd;fill:#FFFFFF;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path7138"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible">
+ <path
+ id="path7199"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="DiamondL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DiamondL"
+ style="overflow:visible">
+ <path
+ id="path3921"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="scale(0.8,0.8)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path3845"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DiamondL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DiamondL-7"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3921-1"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="scale(0.8,0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-9"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-0"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-9-2"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-0-2"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4083"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4085"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-9-23"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-0-3"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4160"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4162"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-6"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-5"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4234"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4236"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2-0"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3845-4-2"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4234-4"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4236-8"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DiamondL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DiamondL-7-9"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3921-1-0"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="scale(0.8,0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4234-4-4"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4236-8-8"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.70710678"
+ inkscape:cx="1099.5668"
+ inkscape:cy="393.88883"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3755"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,387.63782)">
+ <rect
+ style="opacity:0.98000003999999996;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect8470"
+ width="1700"
+ height="1440"
+ x="0"
+ y="0"
+ transform="translate(0,-387.63782)" />
+ <rect
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.1655612;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3757"
+ width="340"
+ height="160"
+ x="1340"
+ y="-367.63782" />
+ <text
+ xml:space="preserve"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.98000004;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ x="1420"
+ y="-332.63782"
+ id="text3759"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3761"
+ x="1420"
+ y="-332.63782">Normal Reaction</tspan></text>
+ <g
+ id="g3773"
+ transform="translate(-410,-320)">
+ <rect
+ rx="23.75"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="190"
+ id="rect3771"
+ style="fill:#ff8000;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765"
+ y="1012.3622"
+ x="50"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="50"
+ id="tspan3767"
+ sodipodi:role="line">Sulfuric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(0,-1200)"
+ id="g3773-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7"
+ style="fill:#e1e1e1;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ id="tspan3767-0"
+ sodipodi:role="line">Ethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(340,-1200)"
+ id="g3773-1-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4"
+ style="fill:#c8c8c8;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832">Polyethylene</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:0.89442724;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DiamondL)"
+ d="m 300,-197.63782 80,0"
+ id="path3836"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+ d="m 1360,-342.63782 40,0"
+ id="path4282"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.98000004;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ x="1420"
+ y="-297.63782"
+ id="text3759-5"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3761-5"
+ x="1420"
+ y="-297.63782">Polymerization</tspan></text>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:0.93541437;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#DiamondL)"
+ d="m 1360,-307.63782 35,0"
+ id="path4282-1"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(800,-1160)"
+ id="g3773-1-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="17.5"
+ ry="20"
+ y="972.36218"
+ x="-80"
+ height="60.000694"
+ width="260.00009"
+ id="rect3771-7-5"
+ style="fill:#e1e1e1;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2"
+ y="1012.3622"
+ x="50"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="50"
+ id="tspan3767-0-7"
+ sodipodi:role="line">Ethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-1080)"
+ id="g3773-1-9-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend-2)"
+ d="m 980,-147.63782 80,0"
+ id="path3836-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(810,-1080)"
+ id="g3773-1-1-2"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-1160)"
+ id="g3773-1-9-6-8"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5"
+ style="fill:#e1f0f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-6">Vinyl Chloride</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 980,-77.63782 20,0 0,-70"
+ id="path5174"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2)"
+ d="m 1040,-147.63782 0,70 20,0"
+ id="path5176"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <g
+ transform="translate(1360,-1160)"
+ id="g3773-1-9-6-8-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8"
+ style="fill:#d7e6e6;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771">Polyvinyl Chloride</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DiamondL-7)"
+ d="m 1320,-157.63782 80,0"
+ id="path5554"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(1360,-940)"
+ id="g3773-1-9-6-8-1-7"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9"
+ style="fill:#dcdcdc;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5"
+ y="1010.3622"
+ x="170"
+ style="font-size:22.5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4">Polydimethylsiloxane</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-940)"
+ id="g3773-1-9-6-8-1-7-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1"
+ style="fill:#dcdcdc;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2"
+ y="1010.3622"
+ x="170"
+ style="font-size:21px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3"
+ style="font-size:21px;text-align:center;text-anchor:middle">Dimethyldichlorosilane</tspan></text>
+ </g>
+ <g
+ transform="translate(1360,-860)"
+ id="g3773-1-9-6-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1">Hydrochloric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-860)"
+ id="g3773-1-9-6-3-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-860)"
+ id="g3773-1-9-6-8-1-7-3-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7"
+ style="fill:#3c3c50;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#ffffff">Silicon</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-940)"
+ id="g3773-1-9-6-8-1-7-3-2-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7-1"
+ style="fill:#c82ca0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9-8"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#000000">Chloromethane</tspan></text>
+ </g>
+ <g
+ transform="translate(0,-940)"
+ id="g3773-1-9-6-8-1-7-3-2-3-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7-1-5"
+ style="fill:#ff0078;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7-9-0"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9-8-2"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#000000">Methane</tspan></text>
+ </g>
+ <g
+ transform="translate(130,-860)"
+ id="g3773-1-1-2-8"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend-2)"
+ d="m 980,-167.63782 80,0"
+ id="path3836-3-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(680,-1240)"
+ id="g3773-1-9-6-3-3-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8">Oxygen</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-1240)"
+ id="g3773-1-9-6-3-3-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-3"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-4"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-4">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-1320)"
+ id="g3773-1-9-6-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-0"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-61">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 980,-317.63782 20,0 0,150"
+ id="path6124"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 980,-237.63782 20,0"
+ id="path6126"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 1040,-167.63782 0,-70 20,0"
+ id="path6128"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 1320,62.36218 80,0"
+ id="path6320"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 1380,62.36218 0,80 20,0"
+ id="path6322"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1320,142.36218 20,0 0,-80"
+ id="path6324"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 980,62.36218 80,0"
+ id="path6706"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 980,142.36218 20,0 0,-80"
+ id="path6708"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 300,142.36218 20,0 0,-80"
+ id="path7092"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 300,62.36218 420,0"
+ id="path7094"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 510,62.36218 0,50"
+ id="path7096"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(340,-860)"
+ id="g3773-1-9-6-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-7"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-0">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 0,212.36218 1700,0"
+ id="path3934"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(1360,-720)"
+ id="g3773-1-9-6-8-1-7-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-4"
+ style="fill:#646464;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-8"
+ y="1010.3622"
+ x="170"
+ style="font-size:22.5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-8"
+ style="font-size:21px;fill:#ffffff">Polytetrafluoroethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-720)"
+ id="g3773-1-9-6-8-1-7-9-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-4-4"
+ style="fill:#7d7d7d;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-8-5"
+ y="1010.3622"
+ x="170"
+ style="font-size:22.5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1010.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-8-5"
+ style="font-size:22.5px;fill:#ffffff">Tetrafluoroethylene</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-640)"
+ id="g3773-1-9-6-3-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1">Hydrochloric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-640)"
+ id="g3773-1-9-6-3-1-5"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-2"
+ style="fill:#0088aa;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-6">Hydrofluoric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-720)"
+ id="g3773-1-9-6-8-1-7-3-2-3-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7-1-4"
+ style="fill:#892ca0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7-9-2"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9-8-3"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#000000">Chloroform</tspan></text>
+ </g>
+ <g
+ transform="translate(0,-720)"
+ id="g3773-1-9-6-8-1-7-3-2-3-6-4"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-5-8-9-1-7-1-5-1"
+ style="fill:#ff0078;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-7-9-5-2-7-9-0-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5771-4-3-9-8-2-3"
+ style="font-size:27px;text-align:center;text-anchor:middle;fill:#000000">Methane</tspan></text>
+ </g>
+ <g
+ transform="translate(130,-640)"
+ id="g3773-1-1-2-8-8"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6-7"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0-4"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2-2"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 300,362.36217 20,0 0,-79.99999"
+ id="path7092-7"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 300,282.36218 420,0"
+ id="path7094-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2-9)"
+ d="m 510,282.36218 0,50"
+ id="path7096-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(340,-640)"
+ id="g3773-1-9-6-1-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-7-1"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-4-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-0-8">Hydrochloric Acid</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend-2)"
+ d="m 980,282.36218 80,0"
+ id="path3836-3-02"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 980,352.36218 20,0 0,-70"
+ id="path5174-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-2)"
+ d="m 1040,282.36218 0,70 20,0"
+ id="path5176-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DiamondL-7)"
+ d="m 1320,282.36218 80,0"
+ id="path5554-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 0,-7.63782 1700,0"
+ id="path3934-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 680,-387.63782 0,380"
+ id="path4321"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(1360,-260)"
+ id="g3773-1-9-6-3-1-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3"
+ style="fill:#c88c14;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9">Epoxy Resin</tspan></text>
+ </g>
+ <g
+ transform="translate(1360,-340)"
+ id="g3773-1-9-6-3-1-1-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-4"
+ style="fill:#0000c8;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-6">Salt Water</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1700,432.36218 -1700,0"
+ id="path4377"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(1020,-260)"
+ id="g3773-1-9-6-3-1-1-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-6"
+ style="fill:#501d05;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-1">Epichlorohydrin</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-420)"
+ id="g3773-1-9-6-3-1-1-8"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49"
+ style="fill:#003380;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63"
+ y="1012.3622"
+ x="170"
+ style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7">Sodium Hydroxide</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,-100)"
+ id="g3773-1-9-6-3-1-1-88"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-2"
+ style="fill:#d4aa00;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-13">Bisphenol A</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-420)"
+ id="g3773-1-9-6-3-1-1-8-5"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49-9"
+ style="fill:#003380;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7-4">Sodium Hydroxide</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-340)"
+ id="g3773-1-9-6-3-1-1-8-5-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49-9-7"
+ style="fill:#6f8a91;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63-8-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7-4-3">Hypochlorous Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-260)"
+ id="g3773-1-9-6-3-1-1-8-5-6"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-49-9-1"
+ style="fill:#87deaa;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-63-8-5"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-7-4-4">Allyl Chloride</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-100)"
+ id="g3773-1-9-6-3-1-2"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0"
+ style="fill:#784421;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7">Phenol</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-20)"
+ id="g3773-1-9-6-3-1-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7"
+ style="fill:#afafaf;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60">Acetone</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 1320,742.36218 80,0"
+ id="path4563"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 1380,742.36218 0,-80 20,0"
+ id="path4565"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1320,582.36218 20,0 0,160 0,160 -20,0"
+ id="path4775"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 1000,982.36218 0,-160 -20,0"
+ id="path4985"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 980,902.36218 80,0"
+ id="path4987"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 980,742.36218 80,0"
+ id="path5197"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 980,582.36218 20,0 0,160"
+ id="path5407"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 980,662.36218 20,0"
+ id="path5409"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 980,982.36218 20,0"
+ id="path5411"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(340,-100)"
+ id="g3773-1-9-6-3-1-2-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2"
+ style="fill:#552200;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7-0">Cumene</tspan></text>
+ </g>
+ <g
+ transform="translate(340,-20)"
+ id="g3773-1-9-6-3-3-6-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-1-4"
+ style="fill:#64c8f0;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-3-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-8-0">Oxygen</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 640,902.36218 80,0"
+ id="path5467"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 700,902.36218 0,80 20,0"
+ id="path5677"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 640,982.36218 20,0 0,-80"
+ id="path5887"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(0,-100)"
+ id="g3773-1-9-6-3-1-2-1-7"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2-1"
+ style="fill:#e1dd55;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7-0-7">Propene</tspan></text>
+ </g>
+ <g
+ transform="translate(0,-20)"
+ id="g3773-1-9-6-3-1-2-1-77"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2-3"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0-3"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan5942">Benzene</tspan></text>
+ </g>
+ <g
+ transform="translate(0,-180)"
+ id="g3773-1-9-6-3-1-2-1-9"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2-9"
+ style="fill:#dcdc00;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7-0-1">Phosphoric Acid</tspan></text>
+ </g>
+ <rect
+ style="fill:#a0892c;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect5946"
+ width="220"
+ height="160"
+ x="-340"
+ y="352.36218"
+ rx="20"
+ ry="20" />
+ <g
+ transform="translate(340,-260)"
+ id="g3773-1-9-6-3-1-2-1-7-8"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-0-2-1-2"
+ style="fill:#e1dd55;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-9-0-7-6"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-7-0-7-6">Propene</tspan></text>
+ </g>
+ <g
+ transform="translate(680,-180)"
+ id="g3773-1-9-6-3-1-16-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-5-3"
+ style="fill:#b7c8c4;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-75-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-4-0">Hydrochloric Acid</tspan></text>
+ </g>
+ <g
+ transform="translate(470,-180)"
+ id="g3773-1-1-2-8-8-1"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6-7-2"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0-4-5"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2-2-0"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 300,902.36218 80,0"
+ id="path6029"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 300,822.36218 20,0 0,160 -20,0"
+ id="path6239"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 640,742.36218 80,0"
+ id="path6241"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 640,822.36218 20,0 0,-80"
+ id="path6451"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 700,742.36218 0,80 20,0"
+ id="path6453"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(469.99988,-500)"
+ id="g3773-1-1-2-8-8-1-9"
+ style="opacity:0.98000004;fill:#179a9a;fill-opacity:1">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="-90"
+ height="59.999672"
+ width="260.00012"
+ id="rect3771-7-5-2-6-7-2-4"
+ style="fill:#179a9a;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-2-1-0-4-5-7"
+ y="1012.3622"
+ x="39.711914"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="39.711914"
+ id="tspan3767-0-7-6-2-2-0-8"
+ sodipodi:role="line">Chlorine</tspan></text>
+ </g>
+ <g
+ transform="translate(340,-420)"
+ id="g3773-1-9-6-3-3-3"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2">Water</tspan></text>
+ </g>
+ <g
+ transform="translate(340,-340)"
+ id="g3773-1-9-6-3-3-3-0"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-5-1"
+ style="fill:#ffdcdc;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-1-6"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-2-4">Mercury</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 640,662.36218 80,0"
+ id="path6758"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 640,502.36218 20,0 0,160"
+ id="path6968"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 640,582.36218 20,0"
+ id="path6970"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(1360,200)"
+ id="g3773-1-9-6-3-1-1-06">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-1"
+ style="fill:#f9c887;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-9">Glue</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,120)"
+ id="g3773-1-9-6-3-1-3-8">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7-4"
+ style="fill:#afafaf;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2-1"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60-4">Acetone</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,200)"
+ id="g3773-1-9-6-3-1-3-3">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7-9"
+ style="fill:#ff9955;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2-8"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60-8">Polyvinyl Acetate</tspan></text>
+ </g>
+ <g
+ transform="translate(1020,280)"
+ id="g3773-1-9-6-3-1-3-3-0">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-7-9-8"
+ style="fill:#eec6af;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-2-8-7"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-60-8-7">Methyl Acetate</tspan></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.98000004;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ x="1420"
+ y="-262.63782"
+ id="text3759-5-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3761-5-3"
+ x="1420"
+ y="-262.63782">Distillation</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.98000004;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ x="1420"
+ y="-227.63782"
+ id="text3759-5-8-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3761-5-3-0"
+ x="1420"
+ y="-227.63782">Mixer</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DotL)"
+ d="m 1360,115 35,0"
+ id="path7130"
+ inkscape:connector-curvature="0"
+ transform="translate(0,-387.63782)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#SquareL)"
+ d="m 1360,150 35,0"
+ id="path7132"
+ inkscape:connector-curvature="0"
+ transform="translate(0,-387.63782)" />
+ <g
+ transform="translate(1020,-20.000003)"
+ id="g3773-1-9-6-3-3-1"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-8-7"
+ style="fill:#3232ff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-7-40"
+ y="1012.3622"
+ x="170.32861"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170.32861"
+ sodipodi:role="line"
+ id="tspan3832-2-1-4-9">Water</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 1040,1290 0,80 20,0"
+ id="path4105"
+ inkscape:connector-curvature="0"
+ transform="translate(0,-387.63782)" />
+ <g
+ transform="translate(1020,-340)"
+ id="g3773-1-9-6-3-1-1-3-8"
+ style="opacity:0.98000004">
+ <rect
+ rx="20"
+ ry="20"
+ y="972.36218"
+ x="40"
+ height="60"
+ width="260"
+ id="rect3771-7-4-1-4-7-3-4-2"
+ style="fill:#0000c8;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3765-4-8-4-1-1-8-4-4"
+ y="1012.3622"
+ x="170"
+ style="font-size:27px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ xml:space="preserve"><tspan
+ y="1012.3622"
+ x="170"
+ sodipodi:role="line"
+ id="tspan3832-2-1-1-9-6-5">Salt Water</tspan></text>
+ </g>
+ <path
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4234-4)"
+ d="m 1040,742.36218 0,-80 20,0"
+ id="path4565-5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/misc/vector/crop_drop.rape.svg b/misc/vector/crop_drop.rape.svg
new file mode 100644
index 0000000000..35db917110
--- /dev/null
+++ b/misc/vector/crop_drop.rape.svg
@@ -0,0 +1,933 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="320"
+ height="320"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="crop_drop.rape.svg"
+ inkscape:export-filename="C:\Users\Johannes\git\GT5-Unofficial\misc\vector\crop_drop.rape.png"
+ inkscape:export-xdpi="4.5"
+ inkscape:export-ydpi="4.5">
+ <defs
+ id="defs4">
+ <filter
+ id="filter22272"
+ inkscape:label="B-&gt;RG">
+ <feColorMatrix
+ id="feColorMatrix22280"
+ values="0 0 1 0 0 0 0 1 0 0 0.5 0.5 0 0 0 0 0 0 1 0 " />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2"
+ inkscape:cx="18.251567"
+ inkscape:cy="195.61271"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3766"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-732.36218)">
+ <image
+ y="732.36218"
+ x="-320"
+ id="image3763"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAdtJREFU
+OI2lkr9rU1EYhp+Tpmltcm9zJdhoUmiuNU1qaay2SqUBt67+AeImuupUEZwcRFDoKlRHJzdxcyrq
+ZIglhVBtTNtcITa0V8VIepN+DsWEeBN/4Lt9L+95D99zjhIR4T/k7WSqYB7YBxyQGigvYp/++wLY
+IxKJEdACOA6Uy9uo4Cpin3QlPe03ZwEQexJzxCIRr5GI1xiNWc3DPzOugt7QWwL6KBOzB4Hz5yqc
+nbE5lSqRXZ4CIDmzAp4Iyii6C+oNjWhkAPO4ycXLy9y9Pcfzp9sE/F8BuHTtHeGjY4SHNJDP7QUq
+mEH1RNG1fdJzDdLpYa5cXeX+PRP13cviozUmJnX0oGAYvSBOB4iNLNVvPj6Va1jvh7h1c5zEmELT
+4ly/kWF8egtnL4ZSUVB9LQjSRUuPS1LcEHmw6MjCnRdNPxzPCcGN5qx+/UjTF14zP+9jwA+FnEHy
+zBeKmzrFQplnT2a7P6MKruANWYhnivxakmpVsfTQxCpVqFZDiEoxkirhO7LVVtBioHQa9R3WC4cR
+6eOj1Q8L8PKVTv+hOpUdP5slDWmsA8PdGTCYEYxdCURyTc9/7INg2MLgGxcrF4ODdfJAD2KfaM3K
+h+yaLgYdC/5Fnj9Hfq8fRib+9AQpwZcAAAAASUVORK5CYII=
+"
+ height="320"
+ width="320" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3786"
+ width="20"
+ height="20"
+ x="60"
+ y="60"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0413d0;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3790"
+ width="20"
+ height="20"
+ x="40"
+ y="80"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0c1df3;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3792"
+ width="20"
+ height="20"
+ x="60"
+ y="80"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#2b38cf;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3794"
+ width="20"
+ height="20"
+ x="80"
+ y="80"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0010dd;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3796"
+ width="20"
+ height="20"
+ x="40"
+ y="100"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#2838fd;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3798"
+ width="20"
+ height="20"
+ x="60"
+ y="100"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#4d5bf1;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3800"
+ width="20"
+ height="20"
+ x="80"
+ y="100"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#4f5dc2;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3802"
+ width="20"
+ height="20"
+ x="100"
+ y="100"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fcd;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3804"
+ width="20"
+ height="20"
+ x="20"
+ y="120"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fcd;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3806"
+ width="20"
+ height="20"
+ x="20"
+ y="140"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0113f9;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3808"
+ width="20"
+ height="20"
+ x="40"
+ y="120"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0110c9;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3810"
+ width="20"
+ height="20"
+ x="40"
+ y="140"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fd1;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3812"
+ width="20"
+ height="20"
+ x="40"
+ y="200"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0010df;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3814"
+ width="20"
+ height="20"
+ x="40"
+ y="220"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0313e4;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3816"
+ width="20"
+ height="20"
+ x="60"
+ y="200"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#3645fb;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3818"
+ width="20"
+ height="20"
+ x="60"
+ y="120"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#2c3acf;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3820"
+ width="20"
+ height="20"
+ x="60"
+ y="140"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fd2;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3822"
+ width="20"
+ height="20"
+ x="60"
+ y="220"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#333fc6;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3824"
+ width="20"
+ height="20"
+ x="80"
+ y="180"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#3241f7;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3826"
+ width="20"
+ height="20"
+ x="80"
+ y="200"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0f1ff6;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3828"
+ width="20"
+ height="20"
+ x="80"
+ y="220"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fce;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3830"
+ width="20"
+ height="20"
+ x="80"
+ y="240"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fd7;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3832"
+ width="20"
+ height="20"
+ x="100"
+ y="260"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fda;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3834"
+ width="20"
+ height="20"
+ x="120"
+ y="260"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0011ef;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3836"
+ width="20"
+ height="20"
+ x="100"
+ y="240"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#3140fc;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3838"
+ width="20"
+ height="20"
+ x="100"
+ y="220"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#5260f5;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3840"
+ width="20"
+ height="20"
+ x="100"
+ y="200"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#7a86cc;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3842"
+ width="20"
+ height="20"
+ x="100"
+ y="180"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#8a97ee;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3844"
+ width="20"
+ height="20"
+ x="80"
+ y="120"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#8c9adf;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3846"
+ width="20"
+ height="20"
+ x="100"
+ y="120"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#7480c8;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3848"
+ width="20"
+ height="20"
+ x="80"
+ y="140"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#595cdf;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3850"
+ width="20"
+ height="20"
+ x="100"
+ y="140"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fd7;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3852"
+ width="20"
+ height="20"
+ x="100"
+ y="20"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fd5;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3854"
+ width="20"
+ height="20"
+ x="120"
+ y="20"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fd0;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3856"
+ width="20"
+ height="20"
+ x="140"
+ y="20"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000ec9;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3858"
+ width="20"
+ height="20"
+ x="160"
+ y="20"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fcd;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3860"
+ width="20"
+ height="20"
+ x="180"
+ y="20"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fd1;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3862"
+ width="20"
+ height="20"
+ x="100"
+ y="40"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fd4;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3864"
+ width="20"
+ height="20"
+ x="200"
+ y="40"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0b1be9;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3866"
+ width="20"
+ height="20"
+ x="180"
+ y="40"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#2232fe;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3868"
+ width="20"
+ height="20"
+ x="160"
+ y="40"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#2737fe;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3870"
+ width="20"
+ height="20"
+ x="140"
+ y="40"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#1b2af2;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3872"
+ width="20"
+ height="20"
+ x="120"
+ y="40"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#2f3cce;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3874"
+ width="20"
+ height="20"
+ x="180"
+ y="60"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#4a58f7;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3876"
+ width="20"
+ height="20"
+ x="160"
+ y="60"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#4f5df7;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3878"
+ width="20"
+ height="20"
+ x="140"
+ y="60"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#3d4ad7;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3880"
+ width="20"
+ height="20"
+ x="120"
+ y="60"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#7781c3;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3882"
+ width="20"
+ height="20"
+ x="120"
+ y="80"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#8592e7;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3884"
+ width="20"
+ height="20"
+ x="140"
+ y="80"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#7a87db;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3886"
+ width="20"
+ height="20"
+ x="160"
+ y="80"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#3b3fd2;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3888"
+ width="20"
+ height="20"
+ x="140"
+ y="100"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#8692ce;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3890"
+ width="20"
+ height="20"
+ x="160"
+ y="100"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#6466d4;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3892"
+ width="20"
+ height="20"
+ x="120"
+ y="120"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#d4d5fe;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3894"
+ width="20"
+ height="20"
+ x="120"
+ y="140"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#9d9fe4;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3896"
+ width="20"
+ height="20"
+ x="120"
+ y="160"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#8491cc;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3898"
+ width="20"
+ height="20"
+ x="120"
+ y="180"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#7a87cd;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3900"
+ width="20"
+ height="20"
+ x="120"
+ y="200"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#3845d5;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3902"
+ width="20"
+ height="20"
+ x="120"
+ y="220"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0c1bd4;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3904"
+ width="20"
+ height="20"
+ x="120"
+ y="240"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#c8c9f4;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3906"
+ width="20"
+ height="20"
+ x="140"
+ y="120"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#fcfcff;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3908"
+ width="20"
+ height="20"
+ x="140"
+ y="140"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#e0e1ff;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3910"
+ width="20"
+ height="20"
+ x="140"
+ y="160"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#6265dd;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3912"
+ width="20"
+ height="20"
+ x="140"
+ y="180"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#8789d2;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3914"
+ width="20"
+ height="20"
+ x="160"
+ y="120"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#d5d6f8;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3916"
+ width="20"
+ height="20"
+ x="160"
+ y="140"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#8e91fb;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3918"
+ width="20"
+ height="20"
+ x="160"
+ y="160"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#8b98cf;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3920"
+ width="20"
+ height="20"
+ x="160"
+ y="180"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#707cbb;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3922"
+ width="20"
+ height="20"
+ x="160"
+ y="200"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#3542c9;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3924"
+ width="20"
+ height="20"
+ x="160"
+ y="220"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#909dd9;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3926"
+ width="20"
+ height="20"
+ x="180"
+ y="120"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#5b67da;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3928"
+ width="20"
+ height="20"
+ x="200"
+ y="100"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#2834d1;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3930"
+ width="20"
+ height="20"
+ x="220"
+ y="80"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3932"
+ width="20"
+ height="20"
+ x="240"
+ y="60"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0011ea;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3934"
+ width="20"
+ height="20"
+ x="240"
+ y="80"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#404df8;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3936"
+ width="20"
+ height="20"
+ x="220"
+ y="100"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0010df;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3938"
+ width="20"
+ height="20"
+ x="260"
+ y="80"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#1828f7;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3940"
+ width="20"
+ height="20"
+ x="240"
+ y="100"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#8795e8;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3942"
+ width="20"
+ height="20"
+ x="200"
+ y="120"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#4648c6;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3944"
+ width="20"
+ height="20"
+ x="180"
+ y="140"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#4e5df7;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3946"
+ width="20"
+ height="20"
+ x="220"
+ y="120"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fd0;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3948"
+ width="20"
+ height="20"
+ x="260"
+ y="100"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#2939fc;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3950"
+ width="20"
+ height="20"
+ x="240"
+ y="120"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000ecb;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3952"
+ width="20"
+ height="20"
+ x="260"
+ y="120"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#707cbc;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3954"
+ width="20"
+ height="20"
+ x="200"
+ y="140"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#7884bd;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3956"
+ width="20"
+ height="20"
+ x="180"
+ y="160"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#4957dd;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3958"
+ width="20"
+ height="20"
+ x="220"
+ y="140"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#6b7add;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3960"
+ width="20"
+ height="20"
+ x="180"
+ y="180"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#2a3af9;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3962"
+ width="20"
+ height="20"
+ x="240"
+ y="140"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#6170f1;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3964"
+ width="20"
+ height="20"
+ x="180"
+ y="200"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#3d4bed;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3966"
+ width="20"
+ height="20"
+ x="180"
+ y="220"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0b1adf;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3968"
+ width="20"
+ height="20"
+ x="180"
+ y="240"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fd7;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3970"
+ width="20"
+ height="20"
+ x="180"
+ y="260"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fd2;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3972"
+ width="20"
+ height="20"
+ x="260"
+ y="140"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#1826d4;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3974"
+ width="20"
+ height="20"
+ x="240"
+ y="160"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0010e1;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3976"
+ width="20"
+ height="20"
+ x="260"
+ y="160"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#4b58c6;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3978"
+ width="20"
+ height="20"
+ x="200"
+ y="180"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#4a59f5;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3980"
+ width="20"
+ height="20"
+ x="200"
+ y="200"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#2939fc;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3982"
+ width="20"
+ height="20"
+ x="200"
+ y="220"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0011f0;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3984"
+ width="20"
+ height="20"
+ x="200"
+ y="240"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0010dd;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3986"
+ width="20"
+ height="20"
+ x="200"
+ y="260"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#1f2ee3;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3988"
+ width="20"
+ height="20"
+ x="220"
+ y="200"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0515e2;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3990"
+ width="20"
+ height="20"
+ x="240"
+ y="200"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#0112f0;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3992"
+ width="20"
+ height="20"
+ x="220"
+ y="220"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fcd;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3994"
+ width="20"
+ height="20"
+ x="220"
+ y="240"
+ transform="translate(0,732.36218)" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#000fcd;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter22272)"
+ id="rect3996"
+ width="20"
+ height="20"
+ x="240"
+ y="220"
+ transform="translate(0,732.36218)" />
+ </g>
+</svg>
diff --git a/misc/vector/dense_bricks.svg b/misc/vector/dense_bricks.svg
new file mode 100644
index 0000000000..08889aa25c
--- /dev/null
+++ b/misc/vector/dense_bricks.svg
@@ -0,0 +1,1001 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="320"
+ height="320"
+ viewBox="0 0 84.666664 84.666664"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r15371"
+ sodipodi:docname="dense_bricks.svg"
+ inkscape:export-filename="C:\Users\Johannes\git\GT5-Unofficial\misc\vector\MACHINE_CASING_DENSEBRICKS.png"
+ inkscape:export-xdpi="4.8000002"
+ inkscape:export-ydpi="4.8000002">
+ <defs
+ id="defs2">
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter323"
+ inkscape:label="filter0">
+ <feColorMatrix
+ id="feColorMatrix327"
+ values="1.5 0 0 0 0 0 1.24 0 0 0 0 0 0.94 0 0 0 0 0 1 0 " />
+ <feColorMatrix
+ id="feColorMatrix28"
+ values="0.8 0 0 0 0 0 0.8 0 0 0 0 0 0.8 0 0 0 0 0 1 0 " />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter323-2"
+ inkscape:label="filter0">
+ <feColorMatrix
+ id="feColorMatrix327-2"
+ values="1.69 0 0 0 0 0 1 0 0 0 0 0 0.41 0 0 0 0 0 1 0 " />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4"
+ inkscape:cx="-47.579129"
+ inkscape:cy="140.30032"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ units="px">
+ <inkscape:grid
+ type="xygrid"
+ id="grid4851" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-212.33337)">
+ <image
+ y="261.77823"
+ x="137.37654"
+ id="image18"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ style="filter:url(#filter323);image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="84.666664"
+ width="84.666664" />
+ <image
+ y="215.91263"
+ x="253.26675"
+ id="image18-7"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ style="filter:url(#filter323-2);image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="84.666664"
+ width="84.666664" />
+ <rect
+ style="opacity:0.98000004;fill:#d78034;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect340"
+ width="45.168549"
+ height="24.856066"
+ x="171.85431"
+ y="197.57578" />
+ <g
+ id="g4863"
+ style="filter:url(#filter323)"
+ transform="translate(10.583331,121.70833)">
+ <image
+ y="212.33337"
+ x="1.2715658e-006"
+ id="image4849"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ style="image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="42.333332"
+ width="42.333332" />
+ <image
+ width="42.333332"
+ height="42.333332"
+ preserveAspectRatio="none"
+ style="image-rendering:optimizeSpeed"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ id="image4853"
+ x="42.333336"
+ y="212.33337" />
+ <image
+ y="254.6667"
+ x="42.333336"
+ id="image4855"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ style="image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="42.333332"
+ width="42.333332" />
+ <image
+ width="42.333332"
+ height="42.333332"
+ preserveAspectRatio="none"
+ style="image-rendering:optimizeSpeed"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVR42n1TS8uCUBC9/zMsFVxo UqGSRou2IqRCkWJFLvyf83EmRibza3HwPuaeeZyjeb1e1LYt9X1Pj8eD6rrmb9M0dL1eP9B1HZ3P Z6qqisqyJNu2ySA4z/MRh8PhYx/HMZ1OJwbuZH08HslxHDLIiAuBkEgggDO9B+l6vSbLssigVMmi AzWpQBNuNhtarVZk0NtcsG5j2g7WSZK8K7hcLl9Zpn0Dcib7IAjeM8BUoyiiLMuYFaVp4AzY7Xbk eR6FYch7vGEClPELi8WCvwh2XZelA9A/t4AZYJACyArcbjcOGoaBns8n3e939gA8o/1i/ut9u91y BiT4pY7RBgKBKLDf77lUVKU9ICqMBNMLySY6i1NBriuUasyc9lj7vj+2oE301cLcBTKBAJOHT3Rl +n9BnEGgAGXDINAZvoBsRVGw9mmasvbiD3ljtK4a2gvL5XL0wPTuD25VbTdjHernAAAAAElFTkSu QmCC "
+ id="image4857"
+ x="-7.1054274e-015"
+ y="254.6667" />
+ </g>
+ <g
+ id="g751">
+ <image
+ width="84.666664"
+ height="84.666664"
+ preserveAspectRatio="none"
+ style="image-rendering:optimizeSpeed"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz AAAAvQAAAL0BHVrG+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADxSURB VDiN7dLNSsNAFMXxf+JN+hFLGKGgUBBBRF/AvW/l0/gqPowIRdI0sZl8zEwSV4aCON2Ld/tb3XNO 8PryPAYE7IqKxTzCuR6A1lgIAtZqhc8lLzTvHzkqTciKA8e3zUrObjdel0hCAPalRqXJhHVjWC5i Trm0xjKMI1Xd8albZrFgXY9zA7NYOOUyjyPuri+JROisRa2W6NbgXE/TWiIJvS6lbtiXGgDXD9zf XPG2zQHojEWlidfDb1RpQnGop5Q7Y6fffS5ZUQGwKzUXaULVdNStQTcdxroptN9cnh4ffvR8vll7 d3Ds/zv4Ezv4AptmhMVYeNf6AAAAAElFTkSuQmCC "
+ id="image40"
+ x="0"
+ y="212.33337" />
+ <rect
+ y="291.70837"
+ x="58.208332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect43"
+ style="opacity:0.98000004;fill:#7f6950;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="249.37505"
+ x="58.208332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect43-8"
+ style="opacity:0.98000004;fill:#7f6950;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="286.41672"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect60"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08339"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect60-0"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="249.37505"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect43-8-2"
+ style="opacity:0.98000004;fill:#7f6950;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="286.41672"
+ x="10.583331"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect60-0-9"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="291.70837"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect43-3"
+ style="opacity:0.98000004;fill:#7f6950;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="254.6667"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect122"
+ style="opacity:0.98000004;fill:#b69672;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08337"
+ x="10.583334"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect124"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="238.7917"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect126"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="281.12503"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect128"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="212.33337"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect130"
+ style="opacity:0.98000004;fill:#c09e79;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="212.33337"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect132"
+ style="opacity:0.98000004;fill:#c09e79;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08337"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect156"
+ style="opacity:0.98000004;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08337"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect158"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="281.12503"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect160"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="286.41672"
+ x="37.041668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect162"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08337"
+ x="5.2916665"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect164"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="238.7917"
+ x="37.041668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect166"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="291.70837"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="249.37505"
+ x="79.375"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339-9"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="259.95837"
+ x="79.375"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339-3"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="217.62505"
+ x="37.041668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339-1"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="249.37503"
+ x="-8.8817842e-016"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect339-4"
+ style="opacity:0.98000004;fill:#8a7256;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="270.54172"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect681"
+ style="opacity:0.98000004;fill:#846d53;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="259.95837"
+ x="5.2916665"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect683"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="222.9167"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect685"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="217.62503"
+ x="5.2916665"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect689"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="222.9167"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect691"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="265.25003"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect693"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="265.25003"
+ x="5.2916665"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect695"
+ style="opacity:0.98000004;fill:#a38766;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="265.25003"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect697"
+ style="opacity:0.98000004;fill:#997e60;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <image
+ y="212.33337"
+ x="-92.604164"
+ id="image707"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI
+WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYJDBYkPynFtwAAAYdJREFUKM+FktFKlHEQxX/f14dY
+SHoh7aqgvUAi9Cg+QdQDBL1N9Aw+THdCa1vuUppEpi60M+dMF//Fq7C5GAbmnDnMnOmmx1sARdjp
+SjtUaadKrpTTTleoskgxAAd7O6kKO+1Qo1U2mivklFUOcTa77KHC/nQ+bwqT82+pe7QnX+dpyzU5
+v0w5xdCGnV7dnF7dAMD0empYCgNw+eU7sDTPbJkh5LSB/SccPR/1Hy74V7x/SbhC9E3hV/BwZJGq
+NH1bdyE+Xj9EWJq0c6Xg+v0/has/pCtMH7ZUrv8Qho6UZXrLaS+9arw76t6+6O5xbw66V3vdagdX
+mCFcYQOHmwCLO5S83u+USCxuSXG80Q1dhZsPqlQttBq5uEWioZWkUFK1upLM0Pxf6zmZczK/GD0F
+WOtXl7mvgbTTzWn7cIPd0Xban2c/x+Ot9nwpn83udsbrKU9ny3zcfChS3htvpx2unfFmyu2XwrU7
+WpdLrvHoUdphhhCT2Y80EiFk0oTIIoREmmy5qOIvirycu2t8lJoAAAAASUVORK5CYII=
+"
+ style="image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="84.666664"
+ width="84.666664" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect710"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583336"
+ y="222.9167" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect712"
+ width="5.2916665"
+ height="5.2916665"
+ x="26.458334"
+ y="222.9167" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect714"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791664"
+ y="222.9167" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect716"
+ width="5.2916665"
+ height="5.2916665"
+ x="52.916668"
+ y="222.9167" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect753"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="228.20837" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect755"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="228.20837" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect757"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="228.20837" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect759"
+ width="5.2916665"
+ height="5.2916665"
+ x="26.458332"
+ y="228.20837" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect761"
+ width="5.2916665"
+ height="5.2916665"
+ x="31.75"
+ y="228.20837" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect763"
+ width="5.2916665"
+ height="5.2916665"
+ x="37.041668"
+ y="228.20837" />
+ <rect
+ y="228.20836"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect765"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="228.20836"
+ x="47.624996"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect767"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="228.20836"
+ x="58.208328"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect769"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="228.20836"
+ x="68.791664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect771"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect773"
+ width="5.2916665"
+ height="5.2916665"
+ x="63.5"
+ y="228.20836" />
+ <rect
+ y="228.20836"
+ x="52.916668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect775"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="233.50003"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect777"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="233.50003"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect779"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="233.50003"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect781"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect783"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="238.7917" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect785"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="238.7917" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect787"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="238.7917" />
+ <rect
+ y="244.08336"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect789"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08336"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect791"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="244.08336"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect793"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect795"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="249.37503" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect797"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="249.37503" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect799"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="249.37503" />
+ <rect
+ y="254.6667"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect801"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="254.6667"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect803"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="254.6667"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect805"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect807"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="259.95837" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect809"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="259.95837" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect811"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="259.95837" />
+ <rect
+ y="265.25006"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect813"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="265.25006"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect815"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="265.25006"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect817"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect819"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="270.54172" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect821"
+ width="5.2916665"
+ height="5.2916665"
+ x="15.875"
+ y="270.54172" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect823"
+ width="5.2916665"
+ height="5.2916665"
+ x="21.166666"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="10.583333"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect825"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="275.83337"
+ x="15.875"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect827"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ y="275.83337"
+ x="21.166666"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect829"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect831"
+ width="5.2916665"
+ height="5.2916665"
+ x="10.583333"
+ y="281.12506" />
+ <rect
+ y="281.12503"
+ x="26.458332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect833"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect835"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791664"
+ y="281.12503" />
+ <rect
+ y="281.12506"
+ x="52.916668"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect837"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect839"
+ width="5.2916665"
+ height="5.2916665"
+ x="26.458334"
+ y="265.25006" />
+ <rect
+ y="270.54172"
+ x="26.458334"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect841"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect843"
+ width="5.2916665"
+ height="5.2916665"
+ x="26.458334"
+ y="275.83337" />
+ <rect
+ y="265.25006"
+ x="31.75"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect845"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect847"
+ width="5.2916665"
+ height="5.2916665"
+ x="31.75"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="31.75"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect849"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect851"
+ width="5.2916665"
+ height="5.2916665"
+ x="37.041664"
+ y="265.25006" />
+ <rect
+ y="270.54172"
+ x="37.041664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect853"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect855"
+ width="5.2916665"
+ height="5.2916665"
+ x="37.041664"
+ y="275.83337" />
+ <rect
+ y="265.25006"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect857"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect859"
+ width="5.2916665"
+ height="5.2916665"
+ x="42.333332"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="42.333332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect861"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect863"
+ width="5.2916665"
+ height="5.2916665"
+ x="47.625"
+ y="265.25006" />
+ <rect
+ y="270.54172"
+ x="47.625"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect865"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect867"
+ width="5.2916665"
+ height="5.2916665"
+ x="47.625"
+ y="275.83337" />
+ <rect
+ y="265.25006"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect869"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect871"
+ width="5.2916665"
+ height="5.2916665"
+ x="52.916664"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="52.916664"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect873"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect887"
+ width="5.2916665"
+ height="5.2916665"
+ x="58.208332"
+ y="265.25006" />
+ <rect
+ y="270.54172"
+ x="58.208332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect889"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect891"
+ width="5.2916665"
+ height="5.2916665"
+ x="58.208332"
+ y="275.83337" />
+ <rect
+ y="265.25006"
+ x="63.5"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect893"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect895"
+ width="5.2916665"
+ height="5.2916665"
+ x="63.5"
+ y="270.54172" />
+ <rect
+ y="275.83337"
+ x="63.5"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect897"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect899"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="265.25006" />
+ <rect
+ y="270.54172"
+ x="68.791672"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect901"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect903"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="275.83337" />
+ <rect
+ y="249.37506"
+ x="68.791672"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect905"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect907"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="254.66672" />
+ <rect
+ y="259.95837"
+ x="68.791672"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect909"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect911"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="233.50003" />
+ <rect
+ y="238.79169"
+ x="68.791672"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect913"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect915"
+ width="5.2916665"
+ height="5.2916665"
+ x="68.791672"
+ y="244.08334" />
+ <rect
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect917"
+ width="42.333332"
+ height="31.75"
+ x="26.458332"
+ y="233.50003" />
+ <rect
+ y="259.95837"
+ x="58.208332"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect919"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect921"
+ width="5.2916665"
+ height="5.2916665"
+ x="52.916668"
+ y="259.95837" />
+ <rect
+ y="259.95837"
+ x="26.458334"
+ height="5.2916665"
+ width="5.2916665"
+ id="rect923"
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:0.98000004;fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.13229166;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect925"
+ width="5.2916665"
+ height="5.2916665"
+ x="31.75"
+ y="259.95837" />
+ </g>
+</svg>
diff --git a/misc/vector/firebrick.svg b/misc/vector/firebrick.svg
new file mode 100644
index 0000000000..df46e0e558
--- /dev/null
+++ b/misc/vector/firebrick.svg
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="320"
+ height="320"
+ viewBox="0 0 84.666665 84.666669"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r15371"
+ sodipodi:docname="firebrick.svg"
+ inkscape:export-filename="./111.png"
+ inkscape:export-xdpi="4.8000002"
+ inkscape:export-ydpi="4.8000002">
+ <defs
+ id="defs2">
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ id="filter4533"
+ inkscape:label="Greyscale">
+ <feColorMatrix
+ id="feColorMatrix4539"
+ values="0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0 0 0 1 0 " />
+ <feColorMatrix
+ id="feColorMatrix4535"
+ values="1.35 0 0 0 0 0 1.08 0 0 0 0 0 0.81 0 0 0 0 0 1 0 "
+ result="fbSourceGraphic" />
+ </filter>
+ <filter
+ inkscape:label="Greyscale"
+ id="filter4547"
+ style="color-interpolation-filters:sRGB;">
+ <feColorMatrix
+ values="0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0 0 0 1 0 "
+ id="feColorMatrix4543" />
+ <feColorMatrix
+ result="fbSourceGraphic"
+ values="1.35 0 0 0 0 0 1.08 0 0 0 0 0 0.81 0 0 0 0 0 1 0 "
+ id="feColorMatrix4545" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.5"
+ inkscape:cx="-240.33364"
+ inkscape:cy="479.33862"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-212.33332)">
+ <rect
+ style="opacity:1;fill:#c8c8dc;fill-opacity:0.50196078;fill-rule:nonzero;stroke:none;stroke-width:1.32300007;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4487"
+ width="191.25594"
+ height="236.61308"
+ x="-316.74405"
+ y="182.09525" />
+ <rect
+ style="opacity:1;fill:#ada09b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32300007;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4489"
+ width="125.48809"
+ height="112.6369"
+ x="-405.19049"
+ y="46.023808" />
+ <image
+ y="212.33333"
+ x="-2.8421709e-014"
+ id="image4499"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAg0lEQVR42mNgGDLASkbkPwiTpQmE +9wM/2+PciBsCDZN6BjDEGI04TQExKi30yFKU4S2PArWFRP4zwCzFZchyBpyTFXB6mAYxQBkQ/Bp wmsACIM04NMEw4n6SggDQALIBuDSBPM3DKPEAswQdANgNmFowhb/IA0gA4jWhM0QkjUNOAAAcv/w xmRw4pYAAAAASUVORK5CYII= "
+ style="image-rendering:optimizeSpeed;filter:url(#filter4533)"
+ preserveAspectRatio="none"
+ height="84.666664"
+ width="84.666664" />
+ <rect
+ style="opacity:1;fill:#9b5643;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32300007;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4502"
+ width="109.58051"
+ height="101.02789"
+ x="145.6619"
+ y="172.45239" />
+ <image
+ y="303.18347"
+ x="189.78285"
+ id="image5194"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwUlEQVR42mVTa0tCQRC9f6eiJ5Sa mmWYKBpR9IDAwIigqC9BEERFpllZ0dP31bAIehv0+HfTPVOzrdcPh9md2Tt3ztmzRnFqmM7HBgjx KX/JsTwdoNMxH93NBnn/EAvT8aiXXstZ3kseMDYDfQSkwv30dVehejzK+1VvFy262nm97u+hRMil GmyPODi/ZYEbZKIeWvZ0Nh1Y83WT/ABAfTfk5Omwx1RG9SRNlcw+lQ73qF7Jk2lFQTGd4FjNpDh+ 1MoNtdrZERkHEbfiIxBN8EfwBSozgaZzL4VrMrDAOIVJP8cldwfHjeFeRUmns+LtVJQwMTeIO1op Heln4VBYcLRx/Lgp0n0syHmICDF1TV6K1gQ6Z+hQPkgqzromoocOnkDnhpGzE0O8rlm83+dHyV6X NWrqGgXP+Su6HB9sGBP+gNDQ5DF3wR+DrtT5FrBA8rNmKtHmels4wh+4e+ZsqS51NOYGwief3G7y gV2f92rhVyPLO6KJAd+DJ/xu98Jj9oIpga/kRSN8931r/vsAHHXu8AMaoG6vQbydoJNF5QY4LJx0 vJVyirNA9FANzL+7z6V2yPy7f1PzgXjC/i4APP8fbrNMhjhcdKQAAAAASUVORK5CYII= "
+ style="image-rendering:optimizeSpeed;"
+ preserveAspectRatio="none"
+ height="84.666664"
+ width="84.666664" />
+ <rect
+ y="172.45239"
+ x="241.87892"
+ height="101.02789"
+ width="109.58051"
+ id="rect5197"
+ style="opacity:1;fill:#7c4536;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32300007;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32300007;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4519"
+ width="105.30417"
+ height="103.71667"
+ x="54.504162"
+ y="-6.7416778" />
+ <rect
+ style="opacity:1;fill:#92785b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32300007;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4485"
+ width="232.83333"
+ height="213.17857"
+ x="-218.16788"
+ y="-35.392273" />
+ <image
+ width="84.666664"
+ height="84.666664"
+ preserveAspectRatio="none"
+ style="filter:url(#filter4533);image-rendering:optimizeSpeed"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAg0lEQVR42mNgGDLASkbkPwiTpQmE +9wM/2+PciBsCDZN6BjDEGI04TQExKi30yFKU4S2PArWFRP4zwCzFZchyBpyTFXB6mAYxQBkQ/Bp wmsACIM04NMEw4n6SggDQALIBuDSBPM3DKPEAswQdANgNmFowhb/IA0gA4jWhM0QkjUNOAAAcv/w xmRw4pYAAAAASUVORK5CYII= "
+ id="image4541"
+ x="203.2"
+ y="62.579163" />
+ </g>
+</svg>
diff --git a/misc/vector/item_distributor.svg b/misc/vector/item_distributor.svg
new file mode 100644
index 0000000000..a8aeac2efd
--- /dev/null
+++ b/misc/vector/item_distributor.svg
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="640"
+ height="640"
+ viewBox="0 0 169.33333 169.33334"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r15371"
+ sodipodi:docname="item_distributor.svg"
+ inkscape:export-filename="./AUTOMATION_ITEMDISTRIBUTOR.png"
+ inkscape:export-xdpi="2.4000001"
+ inkscape:export-ydpi="2.4000001">
+ <defs
+ id="defs2">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4567">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop4563" />
+ <stop
+ id="stop4571"
+ offset="0.5"
+ style="stop-color:#a05a2c;stop-opacity:1" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop4565" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4567"
+ id="linearGradient4569"
+ x1="-169.33333"
+ y1="-41.666683"
+ x2="338.66666"
+ y2="466.33331"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.7"
+ inkscape:cx="-296.2953"
+ inkscape:cy="383.54174"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid4485" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-127.66665)">
+ <image
+ y="117.08331"
+ x="-243.41666"
+ id="image4495"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsSAAALEgHS3X78AAAAB3RJTUUH3gQWES0RM2zKJgAAAJ1JREFUOMvtk1EKglAURMdoV9ra UnIptoFoc84ZsA+NVCKFPvrpwuU9Lsy5wzxeMQyDvqmDvqzfA47rQddda7Bsy1iY8W7LRm17qT8C jHW/3c6ASJREgEJUnspm00FskaWYIIhstjPobcFSHKIEgbczAGbiKM4EQfQ7ALYnyLiZ2WnY4cBP B1PnBbH3OMCqqlODe/WrZ+RNiMX/L+gBEUbAGtDL/toAAAAASUVORK5CYII= "
+ style="image-rendering:optimizeSpeed"
+ preserveAspectRatio="none"
+ height="169.33333"
+ width="169.33333" />
+ <g
+ id="g4596"
+ style="stroke:none;fill-opacity:1;fill:url(#linearGradient4569)">
+ <rect
+ y="138.24998"
+ x="10.583333"
+ height="10.583333"
+ width="148.16667"
+ id="rect4498"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)"
+ id="rect4500"
+ width="148.16667"
+ height="10.583333"
+ x="10.583333"
+ y="275.83331" />
+ <rect
+ y="148.83331"
+ x="148.16667"
+ height="127"
+ width="10.583333"
+ id="rect4502"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="148.83331"
+ x="10.583333"
+ height="127"
+ width="10.583333"
+ id="rect4504"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="159.41666"
+ x="95.25"
+ height="21.166666"
+ width="10.583333"
+ id="rect4506"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="148.83331"
+ x="105.83333"
+ height="21.166666"
+ width="10.583333"
+ id="rect4508"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="148.83331"
+ x="63.499996"
+ height="31.75"
+ width="10.583333"
+ id="rect4510"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="180.58331"
+ x="21.166666"
+ height="10.583333"
+ width="31.75"
+ id="rect4512"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="191.16666"
+ x="42.333332"
+ height="10.583333"
+ width="10.583333"
+ id="rect4514"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="212.33331"
+ x="31.75"
+ height="10.583333"
+ width="21.166666"
+ id="rect4518"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="244.08331"
+ x="95.25"
+ height="31.75"
+ width="10.583333"
+ id="rect4520"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="191.16666"
+ x="116.41666"
+ height="10.583333"
+ width="21.166666"
+ id="rect4526"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="180.58331"
+ x="127"
+ height="10.583333"
+ width="21.166666"
+ id="rect4528"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="222.91664"
+ x="21.166666"
+ height="10.583333"
+ width="21.166666"
+ id="rect4568"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="244.08333"
+ x="63.5"
+ height="21.166666"
+ width="10.583333"
+ id="rect4570"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="254.66666"
+ x="52.916664"
+ height="21.166666"
+ width="10.583333"
+ id="rect4572"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="222.91664"
+ x="116.41666"
+ height="10.583333"
+ width="21.166666"
+ id="rect4574"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ <rect
+ y="233.49998"
+ x="127"
+ height="10.583333"
+ width="21.166666"
+ id="rect4576"
+ style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749988, 1.58749988000000000;stroke-dashoffset:0;stroke-opacity:1;fill:url(#linearGradient4569)" />
+ </g>
+ </g>
+</svg>
diff --git a/misc/vector/recipe.distillation_tower.svg b/misc/vector/recipe.distillation_tower.svg
new file mode 100644
index 0000000000..013bf2ee7c
--- /dev/null
+++ b/misc/vector/recipe.distillation_tower.svg
@@ -0,0 +1,1259 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="5120"
+ height="5120"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="recipe.distillation_tower.svg"
+ inkscape:export-filename="C:\Users\Johannes\git\GT5-Unofficial\misc\vector\recipe.distillation_tower.png"
+ inkscape:export-xdpi="4.5"
+ inkscape:export-ydpi="4.5">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.34375"
+ inkscape:cx="2316.8576"
+ inkscape:cy="4187.8954"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2991"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,4067.6378)">
+ <image
+ y="-4067.6377"
+ x="0"
+ id="image2993"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABHNCSVQICAgIfAhkiAAACQRJREFU eJzt3bty20gWBuCWy1aytfM6KooJI864NkWyiXKHrKLTsSfeQKH9Bg7MdGp2FTER+UST0AE30FAD UeANFwLg+b5IF7IFyT4/TjfA5tV6vV4n6KHlcln7mLe3t7WP2WVv2j4AKGO5XKb7+/uTnzcYDBo4 mv4SAPRO2eLfEAJ/e5v/pImWCupWpfg3BoOB/+9JB0BgOgEBQHDRQ0AAEF7kEHh7+CHQXXUVb9Q1 AR0A/CViJyAA4C8fPnxo+xDOzhSAXju1aL98+bJznLu7u/T169c6Dqs3BAC9dnd3V3mMTfFHZApA aJGLPyUBQGDRiz8lAUBQiv9J5TWAyWRSx3F0SpZlaTgctn0YL/g710fx/62WRcAsy+oYpjOm02kn bwrxd65O8b9kCkAoiv8llwHptTqmRlmWpY8fP9ZwNP0jAOi9qlOj6XQqAOASzGazkx5/aesqpxIA Ff348SO9e/eu7cMgPRX/sbsFXeJVlTIEQEWKvxs2Z/5jC/v+/l4IJAHABXH2P53LgFy0/D7/g8Eg 5Gv+9xEAZ+Ks055NCCyXy07e4NUmAXBGQqA9t7e3OoAC1gDOKMuyNJlMatnXnmL73trr6uoqLRaL Mx5N9+kAzmwTAtAFOoAW6ASas32Gz3cE3gf3NR1AS3QC57VYLCwCFtABlFTXi1B0As3bdAUWAF8T ABXUcR95lmXpv3/8kX55/76GI2JbfkqQP/tPJpPwrwNISQCU9vN4nKbT6dGP//Trr+mfP/306utd 3Xykj07pyhT/EwFQ0i/v359UuP97eHj1n07x10dBlyMAWqL465Fl2UmdGC8JgBYo/vrMZrOT9wDY Frl7EABnpvjrZ0eg8gTAGSn+5v35+2mF/I9//aehI+kHAXAmP4/Hir9hf/7+MX0ajY567G/zeaPH 0hcC4Exc52/W5sx/bGF/Go2EQBIAXBBn/9N5LQAX7erzvO1D6DQBwMUTArsJAEIQAsWsAXBR9hX6 1ed5Wn8ene1Y+kAHAIHpALgo22f4fEfg7P+aDoAQFH8xAcDFU/y7VZ4CeDnmefg7l7Or+H+bz8O/ DiClGgJgOBy6x/0M/J0PO+UOP8X/xCIgF0FBlyMA6DVTo2oEAL1malSNqwAQmA6AizHIvQ3Y0puA HkUHAIEJAAhMAEBgAgACswhIGBYJX7u4ALjN/SOXdXNz07m37L7U34t2XVwApPT0H72Krr5V1KX9 XoPBv58/Xi6/NfuznP0LXWQA0C1FhZ7/2ubzou/VHQyK/yUBwFltF/6x36v0M3Nnf53ASwKA1uTP 7nUU/66Czn99EwCK/4kAoHHL5beDbX0d7f+hs7vif00AcFaHirrpxUDF/5IbgWhcU3P7k47h9lbx F9AB0Kh9Lf2xwXBsV7CvwBV/MR0ABKYDoNfquEMyMgFAo/JXAPI3+2y+V+ScdwhGZwpA48oWseJv ngDgrA4t/HXhikEkAoDGFd33f+zXaJY1AFqjwNunA+CslstvO+f2+75HMy6uA7i5uenc697r0Off a9e9/7tW+4XA+Vyt1+v15hPvsEIf5Hc1+v79e4tH0n+mABCYAIDA9q4BTCaTyj8gy7I0m82MY5zS 4wyHw8rjUOzgImDVhafpdJpms5lxjFN6HGtTzTEFgMAEAAQmACAwAQCBCQAITABAYAIAAhMAEJgA gMAEAAQmACAwAQCBCQAITABAYAIAAtu7H0CWZWk6nVb+IcYxDt20d1NQOwIZpwvjbO8IZFPQ+tgR yDidH8eOQM2xBgCBCQAITABAYAIAAhMAEJgAgMAEAAQmACAwAQCBCQAITABAYAIAAhMAEJgAgMAE AARmRyDjdH4cmmNHION0fhw7AjXHjkDG6fw4dgRqjjUACEwAQGACAAITABCYAIDABAAEJgAgMAEA gQkACEwAQGACAAITABCYAIDABAAEJgAgMDsCGafz49CcvTsCQRfZEag+pgAQmACAwAQABLZ3EdCu wMbpwjjbuwJTH7sCG6fz41icbo4pAAQmACAwAQCBCQAITABAYAIAAhMAEJgAgMAEAAQmACAwAQCB CQAITABAYAIAAhMAEJhdgY3T+XFojl2B6R27AtfHFAACEwAQmACAwJ4XAZfL5Yu5FXD53qSk+CGq N4of4rpKKa0PPgq4SBYBITABAIEJAAhMAEBgAgACEwAQmACAwAQABCYAIDABAIEJAAhMAEBgAgAC EwAQmACAwAQABCYAIDABAIEJAAhMAEBgAgACEwAQmACAwAQABCYAIDABAIEJAAhMAEBgAgACEwAQ mACAwAQABCYAIDABAIEJAAhMAEBgAgACEwAQmACAwAQABCYAIDABAIEJAAhMAEBgAgACEwAQmACA wAQABCYAIDABAIEJAAhMAEBgAgACEwAQmACAwAQABCYAIDABAIG9bfsAILrFYlHqeY+Pj88fD4fD UmPoACAwAQCBXaWU1m0fBES2PQXYtPZFbX2+7d9l3/O2vycAoGX5ANgu8E3BHlP423Y9Nx8CFgGh w8oU/inP1QFAy3ZNAfapa3ogAKBlRZcBi4r5lEt9xz7fVQDogVOv828/ftfzdQDQskNTgLI3+RxD BwAd1mTxpyQAoFOqrPqXIQAgMPcBQEcdav/reDGQAIAKdr2Sb7Vapfl8/vz5aDRK19fXhY8t0/Zv P6fs1EEAQEUPDw/PH4/H45RSelH8m8833yt6fFnD4bDSuoEAgBrli/uU75VVddFQAEBDRqPR88fb HUFefv5+bEFvn/nLrhe4EQgq2KwBbLf1q9XqxeM28/9D7X8TNwF5NSCcyaE5fb4rWK1WOxcGz8V9 AFDBarUqnNsXFfZ2V1Ck6Tv/tsfXAUAF25f68kW+b96ft69reHx8rBQKh9YUdADQMdsFX3al/5j1 BAEAPXBqCBz7eFcBoIL5fP6i1c+383VdCShS145A1gCgguvr6zQej0vd5FO2+E95XNHz8iFgCgA1 OhQEpwbFcDgsvQh4zHNNAaCC7SlA3jF3Au7rArwvAHTcYrGodI9/lRcDeW9A6JjxeLyzqEejUeVX /9VNBwAV7Htn33xnsJkO1Hnrbx0dwP8B6Ugr0gbiJ/kAAAAASUVORK5CYII= "
+ height="5120"
+ width="5120" />
+ <rect
+ style="opacity:0.98000004;fill:#c6c6c6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect3782"
+ width="360"
+ height="420"
+ x="3040"
+ y="-2867.6377" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#c6c6c6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect3400"
+ width="1140"
+ height="1500"
+ x="2080"
+ y="140"
+ transform="translate(0,-4067.6378)" />
+ <g
+ id="g3811"
+ transform="translate(1260,-1500)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1660"
+ x="860"
+ height="360"
+ width="360"
+ id="rect3033"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-2407.6377"
+ x="860"
+ height="20"
+ width="340"
+ id="rect3035"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="860"
+ height="320"
+ width="20"
+ id="rect3037"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="1200"
+ height="340"
+ width="20"
+ id="rect3039"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="2000"
+ x="880"
+ height="20"
+ width="320"
+ id="rect3041"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3811-1"
+ transform="translate(1620,-1500)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1660"
+ x="860"
+ height="360"
+ width="360"
+ id="rect3033-7"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-2407.6377"
+ x="860"
+ height="20"
+ width="340"
+ id="rect3035-4"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="860"
+ height="320"
+ width="20"
+ id="rect3037-0"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="1200"
+ height="340"
+ width="20"
+ id="rect3039-9"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="2000"
+ x="880"
+ height="20"
+ width="320"
+ id="rect3041-4"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3811-8"
+ transform="translate(1980,-1500)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1660"
+ x="860"
+ height="360"
+ width="360"
+ id="rect3033-8"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-2407.6377"
+ x="860"
+ height="20"
+ width="340"
+ id="rect3035-2"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="860"
+ height="320"
+ width="20"
+ id="rect3037-4"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="1200"
+ height="340"
+ width="20"
+ id="rect3039-5"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="2000"
+ x="880"
+ height="20"
+ width="320"
+ id="rect3041-5"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3811-17"
+ transform="translate(1260,-1140)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1660"
+ x="860"
+ height="360"
+ width="360"
+ id="rect3033-1"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-2407.6377"
+ x="860"
+ height="20"
+ width="340"
+ id="rect3035-1"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="860"
+ height="320"
+ width="20"
+ id="rect3037-5"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="1200"
+ height="340"
+ width="20"
+ id="rect3039-2"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="2000"
+ x="880"
+ height="20"
+ width="320"
+ id="rect3041-7"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3811-6"
+ transform="translate(1620,-1140)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1660"
+ x="860"
+ height="360"
+ width="360"
+ id="rect3033-14"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-2407.6377"
+ x="860"
+ height="20"
+ width="340"
+ id="rect3035-23"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="860"
+ height="320"
+ width="20"
+ id="rect3037-2"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="1200"
+ height="340"
+ width="20"
+ id="rect3039-21"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="2000"
+ x="880"
+ height="20"
+ width="320"
+ id="rect3041-6"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3811-85"
+ transform="translate(1980,-1140)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1660"
+ x="860"
+ height="360"
+ width="360"
+ id="rect3033-76"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-2407.6377"
+ x="860"
+ height="20"
+ width="340"
+ id="rect3035-18"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="860"
+ height="320"
+ width="20"
+ id="rect3037-9"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="1200"
+ height="340"
+ width="20"
+ id="rect3039-27"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="2000"
+ x="880"
+ height="20"
+ width="320"
+ id="rect3041-9"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3811-5"
+ transform="translate(1260,-780)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1660"
+ x="860"
+ height="360"
+ width="360"
+ id="rect3033-4"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-2407.6377"
+ x="860"
+ height="20"
+ width="340"
+ id="rect3035-3"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="860"
+ height="320"
+ width="20"
+ id="rect3037-1"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="1200"
+ height="340"
+ width="20"
+ id="rect3039-23"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="2000"
+ x="880"
+ height="20"
+ width="320"
+ id="rect3041-3"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3811-4"
+ transform="translate(1620,-780)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1660"
+ x="860"
+ height="360"
+ width="360"
+ id="rect3033-11"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-2407.6377"
+ x="860"
+ height="20"
+ width="340"
+ id="rect3035-38"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="860"
+ height="320"
+ width="20"
+ id="rect3037-7"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="1200"
+ height="340"
+ width="20"
+ id="rect3039-4"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="2000"
+ x="880"
+ height="20"
+ width="320"
+ id="rect3041-2"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3811-7"
+ transform="translate(1980,-780)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1660"
+ x="860"
+ height="360"
+ width="360"
+ id="rect3033-79"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-2407.6377"
+ x="860"
+ height="20"
+ width="340"
+ id="rect3035-31"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="860"
+ height="320"
+ width="20"
+ id="rect3037-98"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="1200"
+ height="340"
+ width="20"
+ id="rect3039-6"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="2000"
+ x="880"
+ height="20"
+ width="320"
+ id="rect3041-50"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3811-2"
+ transform="translate(1260,-420.0001)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1660"
+ x="860"
+ height="360"
+ width="360"
+ id="rect3033-86"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-2407.6377"
+ x="860"
+ height="20"
+ width="340"
+ id="rect3035-0"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="860"
+ height="320"
+ width="20"
+ id="rect3037-24"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="1200"
+ height="340"
+ width="20"
+ id="rect3039-8"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="2000"
+ x="880"
+ height="20"
+ width="320"
+ id="rect3041-65"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3811-0"
+ transform="translate(1620,-420.0001)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1660"
+ x="860"
+ height="360"
+ width="360"
+ id="rect3033-9"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-2407.6377"
+ x="860"
+ height="20"
+ width="340"
+ id="rect3035-00"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="860"
+ height="320"
+ width="20"
+ id="rect3037-6"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="1200"
+ height="340"
+ width="20"
+ id="rect3039-1"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="2000"
+ x="880"
+ height="20"
+ width="320"
+ id="rect3041-38"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3811-9"
+ transform="translate(1980,-420)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1660"
+ x="860"
+ height="360"
+ width="360"
+ id="rect3033-3"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-2407.6377"
+ x="860"
+ height="20"
+ width="340"
+ id="rect3035-44"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="860"
+ height="320"
+ width="20"
+ id="rect3037-60"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1680"
+ x="1200"
+ height="340"
+ width="20"
+ id="rect3039-66"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="2000"
+ x="880"
+ height="20"
+ width="320"
+ id="rect3041-1"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3148">
+ <rect
+ y="-2787.6384"
+ x="2360"
+ height="20.000628"
+ width="60"
+ id="rect3134"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1300"
+ x="2420"
+ height="100"
+ width="20"
+ id="rect3136"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1400"
+ x="2360"
+ height="20"
+ width="60"
+ id="rect3138"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1300"
+ x="2340"
+ height="100"
+ width="20"
+ id="rect3140"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1320"
+ x="2400"
+ height="20"
+ width="20"
+ id="rect3142"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1340"
+ x="2380"
+ height="20"
+ width="20"
+ id="rect3144"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1360"
+ x="2360"
+ height="20"
+ width="20"
+ id="rect3146"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3163"
+ transform="translate(100,0)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1400"
+ x="2600"
+ height="20"
+ width="100"
+ id="rect3157"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1280"
+ x="2640"
+ height="120"
+ width="20"
+ id="rect3159"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1300"
+ x="2620"
+ height="20"
+ width="20"
+ id="rect3161"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3182"
+ transform="translate(120,0)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1280"
+ x="2960"
+ height="20"
+ width="60"
+ id="rect3168"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1300"
+ x="2940"
+ height="20"
+ width="20"
+ id="rect3170"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1300"
+ x="3020"
+ height="40"
+ width="20"
+ id="rect3172"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1340"
+ x="2980"
+ height="20"
+ width="40"
+ id="rect3174"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1360"
+ x="2960"
+ height="20"
+ width="20"
+ id="rect3176"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1380"
+ x="2940"
+ height="20"
+ width="20"
+ id="rect3178"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1400"
+ x="2940"
+ height="20"
+ width="100"
+ id="rect3180"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3203"
+ transform="translate(120,0)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="920"
+ x="2940"
+ height="20.000154"
+ width="99.999977"
+ id="rect3191"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="940"
+ x="2940"
+ height="40"
+ width="20"
+ id="rect3193"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="960"
+ x="2960"
+ height="20"
+ width="60"
+ id="rect3195"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="980"
+ x="3020"
+ height="60"
+ width="20"
+ id="rect3197"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1040"
+ x="2960"
+ height="20"
+ width="60"
+ id="rect3199"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1020"
+ x="2940"
+ height="20"
+ width="20"
+ id="rect3201"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3223"
+ transform="translate(120,0)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="920"
+ x="2660"
+ height="140"
+ width="20"
+ id="rect3211"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="920"
+ x="2640"
+ height="20"
+ width="20"
+ id="rect3213"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="940"
+ x="2620"
+ height="20"
+ width="20"
+ id="rect3215"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="960"
+ x="2600"
+ height="20"
+ width="20"
+ id="rect3217"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="980"
+ x="2580"
+ height="40"
+ width="20"
+ id="rect3219"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1000"
+ x="2600"
+ height="20"
+ width="60"
+ id="rect3221"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3245">
+ <rect
+ y="-3147.6377"
+ x="2360"
+ height="20"
+ width="60"
+ id="rect3231"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="940"
+ x="2340"
+ height="20"
+ width="20"
+ id="rect3233"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="940"
+ x="2420"
+ height="40"
+ width="20"
+ id="rect3235"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="980"
+ x="2380"
+ height="20"
+ width="40"
+ id="rect3237"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1000"
+ x="2420"
+ height="40"
+ width="20"
+ id="rect3239"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1040"
+ x="2360"
+ height="20"
+ width="60"
+ id="rect3241"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1020"
+ x="2340"
+ height="20"
+ width="20"
+ id="rect3243"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3266"
+ transform="translate(-20,0)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="580"
+ x="2400"
+ height="20"
+ width="40"
+ id="rect3254"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="600"
+ x="2380"
+ height="20"
+ width="20"
+ id="rect3256"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="620"
+ x="2360"
+ height="80"
+ width="20"
+ id="rect3258"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-3427.6377"
+ x="2380"
+ height="20"
+ width="60"
+ id="rect3260"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-3407.6377"
+ x="2440"
+ height="40"
+ width="20"
+ id="rect3262"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-3367.6377"
+ x="2380"
+ height="20"
+ width="60"
+ id="rect3264"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3286">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="240"
+ x="2420"
+ height="80"
+ width="20"
+ id="rect3274"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="320"
+ x="2400"
+ height="20"
+ width="20"
+ id="rect3276"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="340"
+ x="2360"
+ height="20"
+ width="40"
+ id="rect3278"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="220"
+ x="2360"
+ height="20"
+ width="60"
+ id="rect3280"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="240"
+ x="2340"
+ height="40"
+ width="20"
+ id="rect3282"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="280"
+ x="2360"
+ height="20"
+ width="60"
+ id="rect3284"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ transform="translate(360,-1059.9994)"
+ id="g3148-4">
+ <rect
+ y="-2787.6384"
+ x="2360"
+ height="20.000628"
+ width="60"
+ id="rect3134-0"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1300"
+ x="2420"
+ height="100"
+ width="20"
+ id="rect3136-9"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1400"
+ x="2360"
+ height="20"
+ width="60"
+ id="rect3138-4"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1300"
+ x="2340"
+ height="100"
+ width="20"
+ id="rect3140-8"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1320"
+ x="2400"
+ height="20"
+ width="20"
+ id="rect3142-8"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1340"
+ x="2380"
+ height="20"
+ width="20"
+ id="rect3144-2"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1360"
+ x="2360"
+ height="20"
+ width="20"
+ id="rect3146-4"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3163-5"
+ transform="translate(-20,-1060)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1400"
+ x="2600"
+ height="20"
+ width="100"
+ id="rect3157-5"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1280"
+ x="2640"
+ height="120"
+ width="20"
+ id="rect3159-1"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1300"
+ x="2620"
+ height="20"
+ width="20"
+ id="rect3161-7"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3163-1"
+ transform="translate(460,-1060)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1400"
+ x="2600"
+ height="20"
+ width="100"
+ id="rect3157-1"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1280"
+ x="2640"
+ height="120"
+ width="20"
+ id="rect3159-5"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1300"
+ x="2620"
+ height="20"
+ width="20"
+ id="rect3161-2"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3163-7"
+ transform="translate(340,-1060)">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1400"
+ x="2600"
+ height="20"
+ width="100"
+ id="rect3157-6"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1280"
+ x="2640"
+ height="120"
+ width="20"
+ id="rect3159-14"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1300"
+ x="2620"
+ height="20"
+ width="20"
+ id="rect3161-23"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3412">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="580"
+ x="2700"
+ height="20"
+ width="100"
+ id="rect3402"
+ style="opacity:0.98000003999999996;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="600"
+ x="2700"
+ height="20"
+ width="20"
+ id="rect3404"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="600"
+ x="2780"
+ height="40"
+ width="20"
+ id="rect3406"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="640"
+ x="2760"
+ height="20"
+ width="20"
+ id="rect3408"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="660"
+ x="2740"
+ height="60"
+ width="20"
+ id="rect3410"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="g3433">
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="580"
+ x="3080"
+ height="20"
+ width="60"
+ id="rect3419"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="600"
+ x="3140"
+ height="40"
+ width="20"
+ id="rect3421"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="660"
+ x="3140"
+ height="40"
+ width="20"
+ id="rect3423"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="700"
+ x="3080"
+ height="20"
+ width="60"
+ id="rect3425"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="640"
+ x="3080"
+ height="20"
+ width="60"
+ id="rect3427"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="600"
+ x="3060"
+ height="40"
+ width="20"
+ id="rect3429"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="660"
+ x="3060"
+ height="40"
+ width="20"
+ id="rect3431"
+ style="opacity:0.98000004;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ </g>
+</svg>
diff --git a/misc/vector/recipe.nine_x_nine.svg b/misc/vector/recipe.nine_x_nine.svg
new file mode 100644
index 0000000000..e26c941f74
--- /dev/null
+++ b/misc/vector/recipe.nine_x_nine.svg
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="5120"
+ height="5120"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="recipe.nine_x_nine.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.24748738"
+ inkscape:cx="1765.9367"
+ inkscape:cy="4071.4343"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2991" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,4067.6378)">
+ <image
+ y="-4067.6377"
+ x="0"
+ id="image2993"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABHNCSVQICAgIfAhkiAAACQRJREFU eJzt3bty20gWBuCWy1aytfM6KooJI864NkWyiXKHrKLTsSfeQKH9Bg7MdGp2FTER+UST0AE30FAD UeANFwLg+b5IF7IFyT4/TjfA5tV6vV4n6KHlcln7mLe3t7WP2WVv2j4AKGO5XKb7+/uTnzcYDBo4 mv4SAPRO2eLfEAJ/e5v/pImWCupWpfg3BoOB/+9JB0BgOgEBQHDRQ0AAEF7kEHh7+CHQXXUVb9Q1 AR0A/CViJyAA4C8fPnxo+xDOzhSAXju1aL98+bJznLu7u/T169c6Dqs3BAC9dnd3V3mMTfFHZApA aJGLPyUBQGDRiz8lAUBQiv9J5TWAyWRSx3F0SpZlaTgctn0YL/g710fx/62WRcAsy+oYpjOm02kn bwrxd65O8b9kCkAoiv8llwHptTqmRlmWpY8fP9ZwNP0jAOi9qlOj6XQqAOASzGazkx5/aesqpxIA Ff348SO9e/eu7cMgPRX/sbsFXeJVlTIEQEWKvxs2Z/5jC/v+/l4IJAHABXH2P53LgFy0/D7/g8Eg 5Gv+9xEAZ+Ks055NCCyXy07e4NUmAXBGQqA9t7e3OoAC1gDOKMuyNJlMatnXnmL73trr6uoqLRaL Mx5N9+kAzmwTAtAFOoAW6ASas32Gz3cE3gf3NR1AS3QC57VYLCwCFtABlFTXi1B0As3bdAUWAF8T ABXUcR95lmXpv3/8kX55/76GI2JbfkqQP/tPJpPwrwNISQCU9vN4nKbT6dGP//Trr+mfP/306utd 3Xykj07pyhT/EwFQ0i/v359UuP97eHj1n07x10dBlyMAWqL465Fl2UmdGC8JgBYo/vrMZrOT9wDY Frl7EABnpvjrZ0eg8gTAGSn+5v35+2mF/I9//aehI+kHAXAmP4/Hir9hf/7+MX0ajY567G/zeaPH 0hcC4Exc52/W5sx/bGF/Go2EQBIAXBBn/9N5LQAX7erzvO1D6DQBwMUTArsJAEIQAsWsAXBR9hX6 1ed5Wn8ene1Y+kAHAIHpALgo22f4fEfg7P+aDoAQFH8xAcDFU/y7VZ4CeDnmefg7l7Or+H+bz8O/ DiClGgJgOBy6x/0M/J0PO+UOP8X/xCIgF0FBlyMA6DVTo2oEAL1malSNqwAQmA6AizHIvQ3Y0puA HkUHAIEJAAhMAEBgAgACswhIGBYJX7u4ALjN/SOXdXNz07m37L7U34t2XVwApPT0H72Krr5V1KX9 XoPBv58/Xi6/NfuznP0LXWQA0C1FhZ7/2ubzou/VHQyK/yUBwFltF/6x36v0M3Nnf53ASwKA1uTP 7nUU/66Czn99EwCK/4kAoHHL5beDbX0d7f+hs7vif00AcFaHirrpxUDF/5IbgWhcU3P7k47h9lbx F9AB0Kh9Lf2xwXBsV7CvwBV/MR0ABKYDoNfquEMyMgFAo/JXAPI3+2y+V+ScdwhGZwpA48oWseJv ngDgrA4t/HXhikEkAoDGFd33f+zXaJY1AFqjwNunA+CslstvO+f2+75HMy6uA7i5uenc697r0Off a9e9/7tW+4XA+Vyt1+v15hPvsEIf5Hc1+v79e4tH0n+mABCYAIDA9q4BTCaTyj8gy7I0m82MY5zS 4wyHw8rjUOzgImDVhafpdJpms5lxjFN6HGtTzTEFgMAEAAQmACAwAQCBCQAITABAYAIAAhMAEJgA gMAEAAQmACAwAQCBCQAITABAYAIAAtu7H0CWZWk6nVb+IcYxDt20d1NQOwIZpwvjbO8IZFPQ+tgR yDidH8eOQM2xBgCBCQAITABAYAIAAhMAEJgAgMAEAAQmACAwAQCBCQAITABAYAIAAhMAEJgAgMAE AARmRyDjdH4cmmNHION0fhw7AjXHjkDG6fw4dgRqjjUACEwAQGACAAITABCYAIDABAAEJgAgMAEA gQkACEwAQGACAAITABCYAIDABAAEJgAgMDsCGafz49CcvTsCQRfZEag+pgAQmACAwAQABLZ3EdCu wMbpwjjbuwJTH7sCG6fz41icbo4pAAQmACAwAQCBCQAITABAYAIAAhMAEJgAgMAEAAQmACAwAQCB CQAITABAYAIAAhMAEJhdgY3T+XFojl2B6R27AtfHFAACEwAQmACAwJ4XAZfL5Yu5FXD53qSk+CGq N4of4rpKKa0PPgq4SBYBITABAIEJAAhMAEBgAgACEwAQmACAwAQABCYAIDABAIEJAAhMAEBgAgAC EwAQmACAwAQABCYAIDABAIEJAAhMAEBgAgACEwAQmACAwAQABCYAIDABAIEJAAhMAEBgAgACEwAQ mACAwAQABCYAIDABAIEJAAhMAEBgAgACEwAQmACAwAQABCYAIDABAIEJAAhMAEBgAgACEwAQmACA wAQABCYAIDABAIEJAAhMAEBgAgACEwAQmACAwAQABCYAIDABAIG9bfsAILrFYlHqeY+Pj88fD4fD UmPoACAwAQCBXaWU1m0fBES2PQXYtPZFbX2+7d9l3/O2vycAoGX5ANgu8E3BHlP423Y9Nx8CFgGh w8oU/inP1QFAy3ZNAfapa3ogAKBlRZcBi4r5lEt9xz7fVQDogVOv828/ftfzdQDQskNTgLI3+RxD BwAd1mTxpyQAoFOqrPqXIQAgMPcBQEcdav/reDGQAIAKdr2Sb7Vapfl8/vz5aDRK19fXhY8t0/Zv P6fs1EEAQEUPDw/PH4/H45RSelH8m8833yt6fFnD4bDSuoEAgBrli/uU75VVddFQAEBDRqPR88fb HUFefv5+bEFvn/nLrhe4EQgq2KwBbLf1q9XqxeM28/9D7X8TNwF5NSCcyaE5fb4rWK1WOxcGz8V9 AFDBarUqnNsXFfZ2V1Ck6Tv/tsfXAUAF25f68kW+b96ft69reHx8rBQKh9YUdADQMdsFX3al/5j1 BAEAPXBqCBz7eFcBoIL5fP6i1c+383VdCShS145A1gCgguvr6zQej0vd5FO2+E95XNHz8iFgCgA1 OhQEpwbFcDgsvQh4zHNNAaCC7SlA3jF3Au7rArwvAHTcYrGodI9/lRcDeW9A6JjxeLyzqEejUeVX /9VNBwAV7Htn33xnsJkO1Hnrbx0dwP8B6Ugr0gbiJ/kAAAAASUVORK5CYII= "
+ height="5120"
+ width="5120" />
+ <g
+ id="g3003">
+ <rect
+ y="-3747.6377"
+ x="2140"
+ height="1040"
+ width="1040"
+ id="rect2993"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1020"
+ x="3180"
+ height="360"
+ width="20"
+ id="rect2995"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1000"
+ x="2120"
+ height="360"
+ width="20"
+ id="rect2997"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1360"
+ x="2120"
+ height="20"
+ width="20"
+ id="rect2999"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1360"
+ x="2140"
+ height="20"
+ width="1040"
+ id="rect3001"
+ style="opacity:0.98000004;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <rect
+ style="opacity:0.98000004;fill:#c6c6c6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect3778"
+ width="400"
+ height="239.99989"
+ x="2100"
+ y="-2687.6377" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#c6c6c6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect3782"
+ width="200"
+ height="420"
+ x="3200"
+ y="1200"
+ transform="translate(0,-4067.6378)" />
+ <rect
+ style="opacity:0.98000004;fill:#c6c6c6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect3784"
+ width="220"
+ height="240"
+ x="3020"
+ y="1380"
+ transform="translate(0,-4067.6378)" />
+ <g
+ transform="translate(-1800,0)"
+ id="g3003-1">
+ <rect
+ y="-3747.6377"
+ x="2140"
+ height="1040"
+ width="1040"
+ id="rect2993-7"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1020"
+ x="3180"
+ height="360"
+ width="20"
+ id="rect2995-4"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1000"
+ x="2120"
+ height="360"
+ width="20"
+ id="rect2997-0"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1360"
+ x="2120"
+ height="20"
+ width="20"
+ id="rect2999-9"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1360"
+ x="2140"
+ height="20"
+ width="1040"
+ id="rect3001-4"
+ style="opacity:0.98000004;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <rect
+ style="opacity:0.98000004;fill:#c6c6c6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect3819"
+ width="400"
+ height="240"
+ x="1020"
+ y="1380"
+ transform="translate(0,-4067.6378)" />
+ <path
+ style="fill:#ffff1f;fill-opacity:1;stroke:none"
+ d="m 3426.7059,-2647.2849 -39.8824,0 0,13.2941 -26.5882,0 0,-13.2941 -13.2941,0 0,-13.2941 -39.8824,0 0,13.2941 -13.2941,0 0,13.2941 -26.5882,0 0,-13.2941 -39.8824,0 0,39.8824 13.2941,0 0,26.5882 -13.2941,0 0,13.2941 -13.2941,0 0,39.8824 13.2941,0 0,13.2941 13.2941,0 0,26.5882 -13.2941,0 0,39.8824 39.8824,0 0,-13.2941 26.5882,0 0,13.2941 13.2941,0 0,13.2941 39.8824,0 0,-13.2941 13.2941,0 0,-13.2941 26.5882,0 0,13.2941 39.8824,0 0,-39.8824 -13.2941,0 0,-26.5882 13.2941,0 0,-13.2941 13.2941,0 0,-39.8824 -132.9412,0 0,39.8824 79.7647,0 0,26.5882 -13.2941,0 0,13.2941 -26.5882,0 0,13.2941 -39.8824,0 0,-13.2941 -26.5882,0 0,-13.2941 -13.2941,0 0,-26.5882 -13.2941,0 0,-39.8824 13.2941,0 0,-26.5882 13.2941,0 0,-13.2941 26.5882,0 0,-13.2941 39.8824,0 0,13.2941 26.5882,0 0,13.2941 39.8824,0 0,-13.2941 13.2941,0 0,-39.8824 z"
+ id="path3780"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/misc/vector/recipe.twelve_x_twelve.svg b/misc/vector/recipe.twelve_x_twelve.svg
new file mode 100644
index 0000000000..83bfafa326
--- /dev/null
+++ b/misc/vector/recipe.twelve_x_twelve.svg
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="5120"
+ height="5120"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="recipe.nine_x_nine.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.24748738"
+ inkscape:cx="2146.7434"
+ inkscape:cy="3761.5254"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1017"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2991" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,4067.6378)">
+ <image
+ y="-4067.6377"
+ x="0"
+ id="image2993"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABHNCSVQICAgIfAhkiAAACQRJREFU eJzt3bty20gWBuCWy1aytfM6KooJI864NkWyiXKHrKLTsSfeQKH9Bg7MdGp2FTER+UST0AE30FAD UeANFwLg+b5IF7IFyT4/TjfA5tV6vV4n6KHlcln7mLe3t7WP2WVv2j4AKGO5XKb7+/uTnzcYDBo4 mv4SAPRO2eLfEAJ/e5v/pImWCupWpfg3BoOB/+9JB0BgOgEBQHDRQ0AAEF7kEHh7+CHQXXUVb9Q1 AR0A/CViJyAA4C8fPnxo+xDOzhSAXju1aL98+bJznLu7u/T169c6Dqs3BAC9dnd3V3mMTfFHZApA aJGLPyUBQGDRiz8lAUBQiv9J5TWAyWRSx3F0SpZlaTgctn0YL/g710fx/62WRcAsy+oYpjOm02kn bwrxd65O8b9kCkAoiv8llwHptTqmRlmWpY8fP9ZwNP0jAOi9qlOj6XQqAOASzGazkx5/aesqpxIA Ff348SO9e/eu7cMgPRX/sbsFXeJVlTIEQEWKvxs2Z/5jC/v+/l4IJAHABXH2P53LgFy0/D7/g8Eg 5Gv+9xEAZ+Ks055NCCyXy07e4NUmAXBGQqA9t7e3OoAC1gDOKMuyNJlMatnXnmL73trr6uoqLRaL Mx5N9+kAzmwTAtAFOoAW6ASas32Gz3cE3gf3NR1AS3QC57VYLCwCFtABlFTXi1B0As3bdAUWAF8T ABXUcR95lmXpv3/8kX55/76GI2JbfkqQP/tPJpPwrwNISQCU9vN4nKbT6dGP//Trr+mfP/306utd 3Xykj07pyhT/EwFQ0i/v359UuP97eHj1n07x10dBlyMAWqL465Fl2UmdGC8JgBYo/vrMZrOT9wDY Frl7EABnpvjrZ0eg8gTAGSn+5v35+2mF/I9//aehI+kHAXAmP4/Hir9hf/7+MX0ajY567G/zeaPH 0hcC4Exc52/W5sx/bGF/Go2EQBIAXBBn/9N5LQAX7erzvO1D6DQBwMUTArsJAEIQAsWsAXBR9hX6 1ed5Wn8ene1Y+kAHAIHpALgo22f4fEfg7P+aDoAQFH8xAcDFU/y7VZ4CeDnmefg7l7Or+H+bz8O/ DiClGgJgOBy6x/0M/J0PO+UOP8X/xCIgF0FBlyMA6DVTo2oEAL1malSNqwAQmA6AizHIvQ3Y0puA HkUHAIEJAAhMAEBgAgACswhIGBYJX7u4ALjN/SOXdXNz07m37L7U34t2XVwApPT0H72Krr5V1KX9 XoPBv58/Xi6/NfuznP0LXWQA0C1FhZ7/2ubzou/VHQyK/yUBwFltF/6x36v0M3Nnf53ASwKA1uTP 7nUU/66Czn99EwCK/4kAoHHL5beDbX0d7f+hs7vif00AcFaHirrpxUDF/5IbgWhcU3P7k47h9lbx F9AB0Kh9Lf2xwXBsV7CvwBV/MR0ABKYDoNfquEMyMgFAo/JXAPI3+2y+V+ScdwhGZwpA48oWseJv ngDgrA4t/HXhikEkAoDGFd33f+zXaJY1AFqjwNunA+CslstvO+f2+75HMy6uA7i5uenc697r0Off a9e9/7tW+4XA+Vyt1+v15hPvsEIf5Hc1+v79e4tH0n+mABCYAIDA9q4BTCaTyj8gy7I0m82MY5zS 4wyHw8rjUOzgImDVhafpdJpms5lxjFN6HGtTzTEFgMAEAAQmACAwAQCBCQAITABAYAIAAhMAEJgA gMAEAAQmACAwAQCBCQAITABAYAIAAtu7H0CWZWk6nVb+IcYxDt20d1NQOwIZpwvjbO8IZFPQ+tgR yDidH8eOQM2xBgCBCQAITABAYAIAAhMAEJgAgMAEAAQmACAwAQCBCQAITABAYAIAAhMAEJgAgMAE AARmRyDjdH4cmmNHION0fhw7AjXHjkDG6fw4dgRqjjUACEwAQGACAAITABCYAIDABAAEJgAgMAEA gQkACEwAQGACAAITABCYAIDABAAEJgAgMDsCGafz49CcvTsCQRfZEag+pgAQmACAwAQABLZ3EdCu wMbpwjjbuwJTH7sCG6fz41icbo4pAAQmACAwAQCBCQAITABAYAIAAhMAEJgAgMAEAAQmACAwAQCB CQAITABAYAIAAhMAEJhdgY3T+XFojl2B6R27AtfHFAACEwAQmACAwJ4XAZfL5Yu5FXD53qSk+CGq N4of4rpKKa0PPgq4SBYBITABAIEJAAhMAEBgAgACEwAQmACAwAQABCYAIDABAIEJAAhMAEBgAgAC EwAQmACAwAQABCYAIDABAIEJAAhMAEBgAgACEwAQmACAwAQABCYAIDABAIEJAAhMAEBgAgACEwAQ mACAwAQABCYAIDABAIEJAAhMAEBgAgACEwAQmACAwAQABCYAIDABAIEJAAhMAEBgAgACEwAQmACA wAQABCYAIDABAIEJAAhMAEBgAgACEwAQmACAwAQABCYAIDABAIG9bfsAILrFYlHqeY+Pj88fD4fD UmPoACAwAQCBXaWU1m0fBES2PQXYtPZFbX2+7d9l3/O2vycAoGX5ANgu8E3BHlP423Y9Nx8CFgGh w8oU/inP1QFAy3ZNAfapa3ogAKBlRZcBi4r5lEt9xz7fVQDogVOv828/ftfzdQDQskNTgLI3+RxD BwAd1mTxpyQAoFOqrPqXIQAgMPcBQEcdav/reDGQAIAKdr2Sb7Vapfl8/vz5aDRK19fXhY8t0/Zv P6fs1EEAQEUPDw/PH4/H45RSelH8m8833yt6fFnD4bDSuoEAgBrli/uU75VVddFQAEBDRqPR88fb HUFefv5+bEFvn/nLrhe4EQgq2KwBbLf1q9XqxeM28/9D7X8TNwF5NSCcyaE5fb4rWK1WOxcGz8V9 AFDBarUqnNsXFfZ2V1Ck6Tv/tsfXAUAF25f68kW+b96ft69reHx8rBQKh9YUdADQMdsFX3al/5j1 BAEAPXBqCBz7eFcBoIL5fP6i1c+383VdCShS145A1gCgguvr6zQej0vd5FO2+E95XNHz8iFgCgA1 OhQEpwbFcDgsvQh4zHNNAaCC7SlA3jF3Au7rArwvAHTcYrGodI9/lRcDeW9A6JjxeLyzqEejUeVX /9VNBwAV7Htn33xnsJkO1Hnrbx0dwP8B6Ugr0gbiJ/kAAAAASUVORK5CYII= "
+ height="5120"
+ width="5120" />
+ <rect
+ style="opacity:0.98000004;fill:#c6c6c6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect3778"
+ width="400"
+ height="239.99989"
+ x="2100"
+ y="-2687.6377" />
+ <rect
+ style="opacity:0.98000003999999996;fill:#c6c6c6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect3782"
+ width="200"
+ height="420"
+ x="3200"
+ y="1200"
+ transform="translate(0,-4067.6378)" />
+ <rect
+ style="opacity:0.98000004;fill:#c6c6c6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect3784"
+ width="220"
+ height="240"
+ x="3020"
+ y="1380"
+ transform="translate(0,-4067.6378)" />
+ <rect
+ style="opacity:0.98000004;fill:#c6c6c6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="rect3819"
+ width="400"
+ height="240"
+ x="1020"
+ y="1380"
+ transform="translate(0,-4067.6378)" />
+ <path
+ style="fill:#ffff1f;fill-opacity:1;stroke:none"
+ d="m 3426.7059,-2647.2849 -39.8824,0 0,13.2941 -26.5882,0 0,-13.2941 -13.2941,0 0,-13.2941 -39.8824,0 0,13.2941 -13.2941,0 0,13.2941 -26.5882,0 0,-13.2941 -39.8824,0 0,39.8824 13.2941,0 0,26.5882 -13.2941,0 0,13.2941 -13.2941,0 0,39.8824 13.2941,0 0,13.2941 13.2941,0 0,26.5882 -13.2941,0 0,39.8824 39.8824,0 0,-13.2941 26.5882,0 0,13.2941 13.2941,0 0,13.2941 39.8824,0 0,-13.2941 13.2941,0 0,-13.2941 26.5882,0 0,13.2941 39.8824,0 0,-39.8824 -13.2941,0 0,-26.5882 13.2941,0 0,-13.2941 13.2941,0 0,-39.8824 -132.9412,0 0,39.8824 79.7647,0 0,26.5882 -13.2941,0 0,13.2941 -26.5882,0 0,13.2941 -39.8824,0 0,-13.2941 -26.5882,0 0,-13.2941 -13.2941,0 0,-26.5882 -13.2941,0 0,-39.8824 13.2941,0 0,-26.5882 13.2941,0 0,-13.2941 26.5882,0 0,-13.2941 39.8824,0 0,13.2941 26.5882,0 0,13.2941 39.8824,0 0,-13.2941 13.2941,0 0,-39.8824 z"
+ id="path3780"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g3003"
+ transform="translate(0,179.9999)">
+ <rect
+ y="-3927.6377"
+ x="2140"
+ height="1220"
+ width="1040"
+ id="rect2993"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-3227.6377"
+ x="3180"
+ height="539.99988"
+ width="20"
+ id="rect2995"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-3247.6377"
+ x="2120"
+ height="539.99988"
+ width="20"
+ id="rect2997"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1360"
+ x="2120"
+ height="20"
+ width="20"
+ id="rect2999"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1360"
+ x="2140"
+ height="20"
+ width="1040"
+ id="rect3001"
+ style="opacity:0.98000004;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ transform="translate(-1800,180)"
+ id="g3003-1">
+ <rect
+ y="-3747.6377"
+ x="2140"
+ height="1040"
+ width="1040"
+ id="rect2993-7"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-3227.6377"
+ x="3180"
+ height="540"
+ width="20"
+ id="rect2995-4"
+ style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ y="-3247.6377"
+ x="2120"
+ height="540"
+ width="20"
+ id="rect2997-0"
+ style="opacity:0.98000004;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1360"
+ x="2120"
+ height="20"
+ width="20"
+ id="rect2999-9"
+ style="opacity:0.98000004;fill:#8b8b8b;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ transform="translate(0,-4067.6378)"
+ y="1360"
+ x="2140"
+ height="20"
+ width="1040"
+ id="rect3001-4"
+ style="opacity:0.98000004;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ </g>
+</svg>
diff --git a/repositories.gradle b/repositories.gradle
index 40118b1677..c227b16ec2 100644
--- a/repositories.gradle
+++ b/repositories.gradle
@@ -1,16 +1,4 @@
// Add any additional repositories for your dependencies here
repositories {
- ivy {
- url 'https://files.vexatos.com/'
- patternLayout {
- artifact "[module]/[artifact]-[revision](-[classifier])(.[ext])"
- }
- content {
- includeGroup("TGregworks")
- }
- metadataSources {
- artifact()
- }
- }
}
diff --git a/src/functionalTest/java/gregtech/test/GT5TestMod.java b/src/functionalTest/java/gregtech/test/GT5TestMod.java
new file mode 100644
index 0000000000..88029f641d
--- /dev/null
+++ b/src/functionalTest/java/gregtech/test/GT5TestMod.java
@@ -0,0 +1,86 @@
+package gregtech.test;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.util.ChatComponentText;
+
+import org.apache.commons.io.output.CloseShieldOutputStream;
+import org.junit.platform.engine.discovery.DiscoverySelectors;
+import org.junit.platform.launcher.Launcher;
+import org.junit.platform.launcher.LauncherDiscoveryRequest;
+import org.junit.platform.launcher.LauncherSession;
+import org.junit.platform.launcher.TestPlan;
+import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
+import org.junit.platform.launcher.core.LauncherFactory;
+import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
+import org.junit.platform.launcher.listeners.TestExecutionSummary;
+import org.junit.platform.reporting.legacy.xml.LegacyXmlReportGeneratingListener;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.event.FMLServerStartedEvent;
+
+@Mod(modid = "gt5-tests", name = "GT5 Dev Tests", version = "1.0", dependencies = "required-after:gregtech")
+public class GT5TestMod {
+
+ @Mod.EventHandler
+ public void onServerStarted(FMLServerStartedEvent event) {
+ MinecraftServer.getServer()
+ .addChatMessage(new ChatComponentText("Running GT5 unit tests..."));
+ runTests();
+ MinecraftServer.getServer()
+ .addChatMessage(new ChatComponentText("Running GT5 unit tests finished"));
+ }
+
+ private void runTests() {
+ // https://junit.org/junit5/docs/current/user-guide/#launcher-api
+ System.setProperty("junit.platform.reporting.open.xml.enabled", "false");
+ final Path testsXmlOutDir = FileSystems.getDefault()
+ .getPath("./junit-out/")
+ .toAbsolutePath();
+ final File testsXmlOutDirFile = testsXmlOutDir.toFile();
+ testsXmlOutDirFile.mkdirs();
+ {
+ File[] fileList = testsXmlOutDirFile.listFiles();
+ if (fileList != null) {
+ for (File child : fileList) {
+ if (child.isFile() && child.getName()
+ .endsWith(".xml")) {
+ child.delete();
+ }
+ }
+ }
+ }
+ final LauncherDiscoveryRequest discovery = LauncherDiscoveryRequestBuilder.request()
+ .selectors(DiscoverySelectors.selectPackage("gregtech.test"))
+ .build();
+ final SummaryGeneratingListener summaryGenerator = new SummaryGeneratingListener();
+ final TestExecutionSummary summary;
+ try (PrintWriter stderrWriter = new PrintWriter(new CloseShieldOutputStream(System.err), true)) {
+ final LegacyXmlReportGeneratingListener xmlGenerator = new LegacyXmlReportGeneratingListener(
+ testsXmlOutDir,
+ stderrWriter);
+ try (LauncherSession session = LauncherFactory.openSession()) {
+ final Launcher launcher = session.getLauncher();
+ final TestPlan plan = launcher.discover(discovery);
+ launcher.registerTestExecutionListeners(summaryGenerator, xmlGenerator);
+ launcher.execute(plan);
+ }
+ summary = summaryGenerator.getSummary();
+
+ summary.printFailuresTo(stderrWriter, 32);
+ summary.printTo(stderrWriter);
+ stderrWriter.flush();
+ }
+ // Throw an exception if running via `runServer`
+ if (summary.getTotalFailureCount() > 0 && FMLCommonHandler.instance()
+ .getSide()
+ .isServer()) {
+ throw new RuntimeException("Some of the unit tests failed to execute, check the log for details");
+ }
+ }
+}
diff --git a/src/functionalTest/java/gregtech/test/GTParallelHelperTest.java b/src/functionalTest/java/gregtech/test/GTParallelHelperTest.java
new file mode 100644
index 0000000000..67abe8a5bd
--- /dev/null
+++ b/src/functionalTest/java/gregtech/test/GTParallelHelperTest.java
@@ -0,0 +1,122 @@
+package gregtech.test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.test.mock.MockIVoidableMachine;
+
+public class GTParallelHelperTest {
+
+ static GT_Recipe rubberRecipe;
+ static ItemStack[] inputItems;
+ static MockIVoidableMachine machine;
+
+ @BeforeAll
+ static void setup() {
+ machine = new MockIVoidableMachine();
+ ItemStack rubberDust = Materials.RawRubber.getDust(1);
+ ItemStack sulfurDust = Materials.Sulfur.getDust(1);
+ rubberRecipe = new GT_Recipe(
+ new ItemStack[] { rubberDust.copy(), sulfurDust.copy() },
+ new ItemStack[] { Materials.Rubber.getDust(1), Materials.Rubber.getDustTiny(1) },
+ null,
+ new int[] { 10000, 6667 },
+ null,
+ new FluidStack[] { Materials.Rubber.getMolten(1000) },
+ 1,
+ 1,
+ 0);
+
+ inputItems = new ItemStack[] { GT_Utility.copyAmountUnsafe(Integer.MAX_VALUE, rubberDust),
+ GT_Utility.copyAmountUnsafe(Integer.MAX_VALUE, rubberDust),
+ GT_Utility.copyAmountUnsafe(Integer.MAX_VALUE, sulfurDust),
+ GT_Utility.copyAmountUnsafe(Integer.MAX_VALUE, sulfurDust) };
+ }
+
+ @Test
+ void OutputsIntegerOverflow() {
+ GT_ParallelHelper helper = new GT_ParallelHelper().setRecipe(rubberRecipe)
+ .setMachine(machine, false, false)
+ .setItemInputs(inputItems)
+ .setMaxParallel(4_000_000)
+ .setAvailableEUt(4_000_000)
+ .setOutputCalculation(true)
+ .setConsumption(false);
+ helper.build();
+ FluidStack[] fluidStacks = helper.getFluidOutputs();
+
+ assertEquals(2, fluidStacks.length);
+ assertEquals(Integer.MAX_VALUE, fluidStacks[0].amount);
+ assertEquals(4_000_000L * 1000 - Integer.MAX_VALUE, fluidStacks[1].amount);
+ }
+
+ @Test
+ void parallelIntegerOverflow() {
+ // Without batch mode
+ GT_ParallelHelper helperWithoutBatchMode = new GT_ParallelHelper().setRecipe(rubberRecipe)
+ .setMachine(machine, false, false)
+ .setItemInputs(inputItems)
+ .setMaxParallel(Integer.MAX_VALUE)
+ .setAvailableEUt(TierEU.MAX * 16)
+ .setConsumption(false)
+ .build();
+ assertEquals(Integer.MAX_VALUE, helperWithoutBatchMode.getCurrentParallel());
+
+ // With batch mode
+ GT_ParallelHelper helperWithBatchMode = new GT_ParallelHelper().setRecipe(rubberRecipe)
+ .setMachine(machine, false, false)
+ .setItemInputs(inputItems)
+ .setMaxParallel(Integer.MAX_VALUE / 50)
+ .setAvailableEUt(TierEU.MAX * 16)
+ .enableBatchMode(128)
+ .setConsumption(false)
+ .build();
+ assertEquals(Integer.MAX_VALUE, helperWithBatchMode.getCurrentParallel());
+ }
+
+ @Test
+ void chanceMultiplier() {
+ GT_ParallelHelper helper = new GT_ParallelHelper().setRecipe(rubberRecipe)
+ .setMachine(machine, false, false)
+ .setItemInputs(inputItems)
+ .setMaxParallel(10)
+ .setAvailableEUt(10)
+ .setConsumption(false)
+ .setOutputCalculation(true)
+ .setChanceMultiplier(10)
+ .build();
+
+ int rubberDustAmount = helper.getItemOutputs()[0].stackSize;
+ int rubberDustTinyAmount = helper.getItemOutputs()[1].stackSize;
+
+ assertEquals(100, rubberDustAmount);
+ assertTrue(rubberDustTinyAmount >= 60 && rubberDustTinyAmount <= 70);
+ }
+
+ @Test
+ void outputMultiplier() {
+ GT_ParallelHelper helper = new GT_ParallelHelper().setRecipe(rubberRecipe)
+ .setMachine(machine, false, false)
+ .setItemInputs(inputItems)
+ .setMaxParallel(1)
+ .setAvailableEUt(1)
+ .setConsumption(false)
+ .setOutputCalculation(true)
+ .setOutputMultiplier(2)
+ .build();
+
+ assertEquals(2000, helper.getFluidOutputs()[0].amount);
+ assertEquals(2, helper.getItemOutputs()[0].stackSize);
+ }
+}
diff --git a/src/functionalTest/java/gregtech/test/GTRecipeTest.java b/src/functionalTest/java/gregtech/test/GTRecipeTest.java
new file mode 100644
index 0000000000..c54fb0a7c8
--- /dev/null
+++ b/src/functionalTest/java/gregtech/test/GTRecipeTest.java
@@ -0,0 +1,264 @@
+package gregtech.test;
+
+import static gregtech.api.enums.GT_Values.RA;
+import static gregtech.api.enums.ItemList.Circuit_Advanced;
+import static gregtech.api.enums.ItemList.Circuit_Nanoprocessor;
+import static gregtech.api.enums.ItemList.Circuit_Parts_Crystal_Chip_Master;
+import static gregtech.api.enums.ItemList.IC2_LapotronCrystal;
+import static gregtech.api.enums.Materials.Advanced;
+import static gregtech.api.enums.Materials.BlueTopaz;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.OrePrefixes.circuit;
+import static gregtech.api.enums.OrePrefixes.lens;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_OreDictUnificator.get;
+import static gregtech.api.util.GT_OreDictUnificator.isItemStackInstanceOf;
+import static gregtech.api.util.GT_Utility.copyAmount;
+import static net.minecraft.init.Blocks.chest;
+import static net.minecraft.init.Blocks.iron_ore;
+import static net.minecraft.init.Blocks.lapis_block;
+import static net.minecraft.init.Blocks.log;
+import static net.minecraft.init.Blocks.planks;
+import static net.minecraft.init.Blocks.stone;
+import static net.minecraft.init.Blocks.stone_slab;
+import static net.minecraft.init.Items.glass_bottle;
+import static net.minecraft.init.Items.iron_ingot;
+import static net.minecraftforge.oredict.OreDictionary.WILDCARD_VALUE;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMapBuilder;
+import gregtech.api.util.GT_Recipe;
+
+class GTRecipeTest {
+
+ static RecipeMap<?> recipeMap;
+ static GT_Recipe lapotronChipRecipe;
+
+ @BeforeAll
+ static void setup() {
+ recipeMap = RecipeMapBuilder.of("__test__")
+ .maxIO(9, 1, 1, 0)
+ .build();
+
+ RA.stdBuilder()
+ .itemInputs(new ItemStack(log, 2, WILDCARD_VALUE), new ItemStack(planks, 2, WILDCARD_VALUE))
+ .itemOutputs(new ItemStack(chest, 1))
+ .duration(0)
+ .eut(0)
+ .addTo(recipeMap);
+
+ RA.stdBuilder()
+ .itemInputs(new ItemStack(lapis_block, 1), get(circuit, Advanced, 1))
+ .itemOutputs(IC2_LapotronCrystal.get(1))
+ .duration(0)
+ .eut(0)
+ .addTo(recipeMap);
+
+ lapotronChipRecipe = RA.stdBuilder()
+ .itemInputs(IC2_LapotronCrystal.getWildcard(1), copyAmount(0, get(lens, BlueTopaz, 1)))
+ .itemOutputs(Circuit_Parts_Crystal_Chip_Master.get(3))
+ .duration(0)
+ .eut(0)
+ .addTo(recipeMap)
+ .toArray(new GT_Recipe[0])[0];
+
+ RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.blockores", 1, 32))
+ .itemOutputs(new ItemStack(iron_ingot, 1))
+ .duration(0)
+ .eut(0)
+ .addTo(recipeMap);
+
+ RA.stdBuilder()
+ .itemInputs(new ItemStack(stone_slab, 64), new ItemStack(stone_slab, 64))
+ .itemOutputs(new ItemStack(stone, 2))
+ .duration(0)
+ .eut(0)
+ .addTo(recipeMap);
+
+ ItemStack dataStick = ItemList.Tool_DataStick.get(0);
+ NBTTagCompound dataStickTag = new NBTTagCompound();
+ dataStickTag.setInteger("integer", 123456);
+ dataStick.setTagCompound(dataStickTag);
+ RA.stdBuilder()
+ .itemInputs(dataStick)
+ .itemOutputs(new ItemStack(chest, 1))
+ .duration(0)
+ .eut(0)
+ .addTo(recipeMap);
+
+ ItemStack glass = new ItemStack(glass_bottle, 2);
+ NBTTagCompound glassTag = new NBTTagCompound();
+ glassTag.setInteger("integer", 123456);
+ glass.setTagCompound(glassTag);
+ RA.stdBuilder()
+ .itemInputs(glass)
+ .itemOutputs(new ItemStack(chest, 1))
+ .duration(0)
+ .eut(0)
+ .nbtSensitive()
+ .addTo(recipeMap);
+ }
+
+ @Test
+ void ensureRecipesAdded() {
+ assertEquals(
+ recipeMap.getAllRecipes()
+ .size(),
+ 7);
+ }
+
+ @Test
+ void findWithExactSameInputs() {
+ GT_Recipe recipe = recipeMap.findRecipeQuery()
+ .items(new ItemStack(lapis_block, 1), get(circuit, Advanced, 1))
+ .find();
+ assertNotNull(recipe);
+
+ GT_Recipe stoneRecipe = recipeMap.findRecipeQuery()
+ .items(new ItemStack(stone_slab, 128))
+ .find();
+ assertNotNull(stoneRecipe);
+ }
+
+ @Test
+ void findWildcardWithExactSameInputs() {
+ GT_Recipe chestRecipe = recipeMap.findRecipeQuery()
+ .items(new ItemStack(log, 2, WILDCARD_VALUE), new ItemStack(planks, 2, WILDCARD_VALUE))
+ .find();
+ assertNotNull(chestRecipe);
+
+ GT_Recipe lapotronChipRecipe = recipeMap.findRecipeQuery()
+ .items(IC2_LapotronCrystal.getWildcard(1), copyAmount(0, get(lens, BlueTopaz, 1)))
+ .find();
+ assertNotNull(lapotronChipRecipe);
+ }
+
+ @Test
+ void findWildcardWithDifferentMeta() {
+ // https://github.com/GTNewHorizons/GT5-Unofficial/pull/2364/commits/e7112fce5f24431f3a4ad19288d662b93cbb91f2
+ GT_Recipe recipe = recipeMap.findRecipeQuery()
+ .items(new ItemStack(log, 2, 0), new ItemStack(planks, 2, 1))
+ .find();
+ assertNotNull(recipe);
+ }
+
+ @Test
+ void findWithNBT() {
+ // https://github.com/GTNewHorizons/GT5-Unofficial/pull/2364/commits/844a38662b05494b42a4439bbc0e6d4d7df1a683
+ ItemStack lapisBlock = new ItemStack(lapis_block, 1);
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setFloat("charge", 123456);
+ lapisBlock.stackTagCompound = tag;
+ GT_Recipe recipe = recipeMap.findRecipeQuery()
+ .items(lapisBlock, get(circuit, Advanced, 1))
+ .find();
+ assertNotNull(recipe);
+
+ // For NBT sensitive recipes
+ ItemStack glass = new ItemStack(glass_bottle, 2);
+ NBTTagCompound glassTag = new NBTTagCompound();
+ glassTag.setInteger("integer", 123456);
+ glass.setTagCompound(glassTag);
+ GT_Recipe nbtSensitiveRecipe = recipeMap.findRecipeQuery()
+ .items(glass)
+ .find();
+ assertNotNull(nbtSensitiveRecipe);
+
+ // For items that need to check NBT, e.g. data sticks
+ ItemStack dataStick = ItemList.Tool_DataStick.get(0);
+ NBTTagCompound dataStickTag = new NBTTagCompound();
+ dataStickTag.setInteger("integer", 123456);
+ dataStick.setTagCompound(dataStickTag);
+ GT_Recipe checkNBTRecipe = recipeMap.findRecipeQuery()
+ .items(dataStick)
+ .find();
+ assertNotNull(checkNBTRecipe);
+ }
+
+ @Test
+ void rejectWithInsufficientAmount() {
+ GT_Recipe recipe = recipeMap.findRecipeQuery()
+ .items(new ItemStack(log, 1, 0), new ItemStack(planks, 1, 0))
+ .find();
+ assertNull(recipe);
+
+ GT_Recipe stoneRecipe = recipeMap.findRecipeQuery()
+ .items(new ItemStack(stone_slab, 127))
+ .find();
+ assertNull(stoneRecipe);
+ }
+
+ @Test
+ void rejectWithoutNonConsumable() {
+ // https://github.com/GTNewHorizons/GT5-Unofficial/pull/2364/commits/bfc93bff7ed34616021e8c5b6dbdc50dd7096af5
+ GT_Recipe recipe = recipeMap.findRecipeQuery()
+ .items(IC2_LapotronCrystal.get(1))
+ .cachedRecipe(lapotronChipRecipe)
+ .find();
+ assertNull(recipe);
+ }
+
+ @Test
+ void rejectWithoutCorrectNBT() {
+ // For NBT sensitive recipes
+ GT_Recipe nbtSensitiveRecipe = recipeMap.findRecipeQuery()
+ .items(new ItemStack(glass_bottle, 2))
+ .find();
+ assertNull(nbtSensitiveRecipe);
+
+ // For items that need to check NBT, e.g. data sticks
+ GT_Recipe checkNBTRecipe = recipeMap.findRecipeQuery()
+ .items(ItemList.Tool_DataStick.get(0))
+ .find();
+ assertNull(checkNBTRecipe);
+ }
+
+ @Test
+ void findOredicted() {
+ // https://github.com/GTNewHorizons/GT5-Unofficial/pull/2373
+ assertTrue(
+ isItemStackInstanceOf(Circuit_Nanoprocessor.get(1), "circuitAdvanced"),
+ "Nanoprocessor is not registered as HV circuit");
+ GT_Recipe recipeByNanoProcessor = recipeMap.findRecipeQuery()
+ .items(new ItemStack(lapis_block, 1), Circuit_Nanoprocessor.get(1))
+ .find();
+ assertNotNull(recipeByNanoProcessor);
+
+ assertTrue(
+ isItemStackInstanceOf(Circuit_Advanced.get(1), "circuitAdvanced"),
+ "Processor Assembly is not registered as HV circuit");
+ GT_Recipe recipeByCircuitAssembly = recipeMap.findRecipeQuery()
+ .items(new ItemStack(lapis_block, 1), Circuit_Advanced.get(1))
+ .find();
+ assertNotNull(recipeByCircuitAssembly);
+ }
+
+ @Test
+ void findWithSpecificOreDictionary() {
+ // https://github.com/GTNewHorizons/GT5-Unofficial/pull/2379
+ // We cannot use circuit assembling recipe like the issue mentioned above,
+ // as mUnificationTarget is not set for circuits in GT5.
+ // But it works in the same way; specific circuit -> GT ore block, unificated circuit -> vanilla ore block
+ GT_Recipe recipeCorrectOre = recipeMap.findRecipeQuery()
+ .items(getModItem(GregTech.ID, "gt.blockores", 1, 32))
+ .find();
+ assertNotNull(recipeCorrectOre);
+
+ GT_Recipe recipeWrongOre = recipeMap.findRecipeQuery()
+ .items(new ItemStack(iron_ore, 1))
+ .find();
+ assertNull(recipeWrongOre);
+ }
+}
diff --git a/src/functionalTest/java/gregtech/test/mock/MockIVoidableMachine.java b/src/functionalTest/java/gregtech/test/mock/MockIVoidableMachine.java
new file mode 100644
index 0000000000..4796d1d3ee
--- /dev/null
+++ b/src/functionalTest/java/gregtech/test/mock/MockIVoidableMachine.java
@@ -0,0 +1,55 @@
+package gregtech.test.mock;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.interfaces.tileentity.IVoidable;
+
+public class MockIVoidableMachine implements IVoidable {
+
+ protected VoidingMode voidingMode = getDefaultVoidingMode();
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public VoidingMode getVoidingMode() {
+ return voidingMode;
+ }
+
+ @Override
+ public void setVoidingMode(VoidingMode mode) {
+ voidingMode = mode;
+ }
+
+ @Override
+ public List<ItemStack> getItemOutputSlots(ItemStack[] toOutput) {
+ return null;
+ }
+
+ @Override
+ public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
+ return null;
+ }
+
+ @Override
+ public boolean canDumpItemToME() {
+ return false;
+ }
+
+ @Override
+ public boolean canDumpFluidToME() {
+ return false;
+ }
+
+ @Override
+ public VoidingMode getDefaultVoidingMode() {
+ return VoidingMode.VOID_ALL;
+ }
+}
diff --git a/src/functionalTest/resources/mcmod.info b/src/functionalTest/resources/mcmod.info
new file mode 100644
index 0000000000..393d6459cf
--- /dev/null
+++ b/src/functionalTest/resources/mcmod.info
@@ -0,0 +1,15 @@
+[
+ {
+ "modid":"GT5-tests",
+ "name":"GT5 Dev Tests",
+ "description":"GT5 Tests to run in the development environment",
+ "version":"1.0",
+ "mcversion":"1.7.10",
+ "url":"https://github.com/GTNewHorizons/GT5-Unofficial",
+ "updateUrl":"",
+ "authorList":[],
+ "credits":"",
+ "logoFile":"",
+ "screenshots":[]
+ }
+]
diff --git a/src/main/java/gregtech/GT_Mod.java b/src/main/java/gregtech/GT_Mod.java
new file mode 100644
index 0000000000..2569ff3b53
--- /dev/null
+++ b/src/main/java/gregtech/GT_Mod.java
@@ -0,0 +1,846 @@
+package gregtech;
+
+import static gregtech.GT_Version.VERSION_MAJOR;
+import static gregtech.GT_Version.VERSION_MINOR;
+import static gregtech.GT_Version.VERSION_PATCH;
+import static gregtech.api.GregTech_API.registerCircuitProgrammer;
+import static gregtech.api.enums.Mods.Forestry;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.Map;
+import java.util.function.Predicate;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
+import net.minecraft.item.crafting.FurnaceRecipes;
+import net.minecraft.item.crafting.IRecipe;
+import net.minecraft.util.WeightedRandomChestContent;
+import net.minecraft.world.World;
+import net.minecraftforge.common.ChestGenHooks;
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.google.common.base.Stopwatch;
+import com.google.common.collect.SetMultimap;
+
+import appeng.api.AEApi;
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.SidedProxy;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import cpw.mods.fml.common.event.FMLModIdMappingEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import cpw.mods.fml.common.event.FMLServerAboutToStartEvent;
+import cpw.mods.fml.common.event.FMLServerStartedEvent;
+import cpw.mods.fml.common.event.FMLServerStartingEvent;
+import cpw.mods.fml.common.event.FMLServerStoppingEvent;
+import cpw.mods.fml.common.registry.EntityRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enchants.Enchantment_EnderDamage;
+import gregtech.api.enchants.Enchantment_Hazmat;
+import gregtech.api.enchants.Enchantment_Radioactivity;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Mods;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.internal.IGT_Mod;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.objects.ItemData;
+import gregtech.api.objects.XSTR;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.threads.GT_Runnable_MachineBlockUpdate;
+import gregtech.api.util.GT_Assemblyline_Server;
+import gregtech.api.util.GT_Forestry_Compat;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeRegistrator;
+import gregtech.api.util.GT_SpawnEventHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.item.ItemHolder;
+import gregtech.common.GT_DummyWorld;
+import gregtech.common.GT_Network;
+import gregtech.common.GT_Proxy;
+import gregtech.common.GT_RecipeAdder;
+import gregtech.common.covers.GT_Cover_FacadeAE;
+import gregtech.common.entities.GT_Entity_Arrow;
+import gregtech.common.entities.GT_Entity_Arrow_Potion;
+import gregtech.common.misc.GT_Command;
+import gregtech.common.misc.spaceprojects.commands.SPM_Command;
+import gregtech.common.misc.spaceprojects.commands.SP_Command;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_CraftingInput_ME;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalChestBase;
+import gregtech.crossmod.holoinventory.HoloInventory;
+import gregtech.crossmod.waila.Waila;
+import gregtech.loaders.load.GT_CoverBehaviorLoader;
+import gregtech.loaders.load.GT_FuelLoader;
+import gregtech.loaders.load.GT_ItemIterator;
+import gregtech.loaders.load.GT_Loader_MetaTileEntities_Recipes;
+import gregtech.loaders.load.GT_SonictronLoader;
+import gregtech.loaders.misc.GT_Achievements;
+import gregtech.loaders.misc.GT_Bees;
+import gregtech.loaders.misc.GT_CoverLoader;
+import gregtech.loaders.postload.GT_BlockResistanceLoader;
+import gregtech.loaders.postload.GT_BookAndLootLoader;
+import gregtech.loaders.postload.GT_CraftingRecipeLoader;
+import gregtech.loaders.postload.GT_CropLoader;
+import gregtech.loaders.postload.GT_FakeRecipeLoader;
+import gregtech.loaders.postload.GT_ItemMaxStacksizeLoader;
+import gregtech.loaders.postload.GT_MachineRecipeLoader;
+import gregtech.loaders.postload.GT_MachineTooltipsLoader;
+import gregtech.loaders.postload.GT_MinableRegistrator;
+import gregtech.loaders.postload.GT_PostLoad;
+import gregtech.loaders.postload.GT_RecyclerBlacklistLoader;
+import gregtech.loaders.postload.GT_ScrapboxDropLoader;
+import gregtech.loaders.postload.GT_Worldgenloader;
+import gregtech.loaders.preload.GT_Loader_CircuitBehaviors;
+import gregtech.loaders.preload.GT_Loader_ItemData;
+import gregtech.loaders.preload.GT_Loader_Item_Block_And_Fluid;
+import gregtech.loaders.preload.GT_Loader_MetaTileEntities;
+import gregtech.loaders.preload.GT_Loader_MultiTileEntities;
+import gregtech.loaders.preload.GT_Loader_OreDictionary;
+import gregtech.loaders.preload.GT_Loader_OreProcessing;
+import gregtech.loaders.preload.GT_PreLoad;
+import ic2.api.recipe.IRecipeInput;
+import ic2.api.recipe.RecipeOutput;
+
+@Mod(
+ modid = Mods.Names.GREG_TECH,
+ name = "GregTech",
+ version = "MC1710",
+ guiFactory = "gregtech.client.GT_GuiFactory",
+ dependencies = " required-after:IC2;" + " required-after:structurelib;"
+ + " required-after:gtnhlib@[0.2.1,);"
+ + " required-after:modularui@[1.1.12,);"
+ + " required-after:appliedenergistics2@[rv3-beta-258,);"
+ + " after:dreamcraft;"
+ + " after:Forestry;"
+ + " after:PFAAGeologica;"
+ + " after:Thaumcraft;"
+ + " after:Railcraft;"
+ + " after:ThermalExpansion;"
+ + " after:TwilightForest;"
+ + " after:harvestcraft;"
+ + " after:magicalcrops;"
+ + " after:Botania;"
+ + " after:BuildCraft|Transport;"
+ + " after:BuildCraft|Silicon;"
+ + " after:BuildCraft|Factory;"
+ + " after:BuildCraft|Energy;"
+ + " after:BuildCraft|Core;"
+ + " after:BuildCraft|Builders;"
+ + " after:GalacticraftCore;"
+ + " after:GalacticraftMars;"
+ + " after:GalacticraftPlanets;"
+ + " after:ThermalExpansion|Transport;"
+ + " after:ThermalExpansion|Energy;"
+ + " after:ThermalExpansion|Factory;"
+ + " after:RedPowerCore;"
+ + " after:RedPowerBase;"
+ + " after:RedPowerMachine;"
+ + " after:RedPowerCompat;"
+ + " after:RedPowerWiring;"
+ + " after:RedPowerLogic;"
+ + " after:RedPowerLighting;"
+ + " after:RedPowerWorld;"
+ + " after:RedPowerControl;"
+ + " after:UndergroundBiomes;"
+ + " after:TConstruct;"
+ + " after:Translocator;"
+ + " after:gendustry;")
+public class GT_Mod implements IGT_Mod {
+
+ @Deprecated // Keep for use in BaseMetaTileEntity
+ public static final int VERSION = VERSION_MAJOR, SUBVERSION = VERSION_MINOR;
+
+ @Deprecated
+ public static final int TOTAL_VERSION = calculateTotalGTVersion(VERSION, SUBVERSION);
+ public static final int NBT_VERSION = calculateTotalGTVersion(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
+
+ @Deprecated
+ public static final int REQUIRED_IC2 = 624;
+
+ @Mod.Instance(Mods.Names.GREG_TECH)
+ public static GT_Mod instance;
+
+ @SidedProxy(
+ modId = Mods.Names.GREG_TECH,
+ clientSide = "gregtech.common.GT_Client",
+ serverSide = "gregtech.common.GT_Server")
+ public static GT_Proxy gregtechproxy;
+
+ public static int MAX_IC2 = 2147483647;
+ public static GT_Achievements achievements;
+ public static final String aTextGeneral = "general";
+ public static final String aTextIC2 = "ic2_";
+ public static final Logger GT_FML_LOGGER = LogManager.getLogger("GregTech GTNH");
+
+ @SuppressWarnings("deprecation")
+ public GT_Mod() {
+ GT_Values.GT = this;
+ GT_Values.DW = new GT_DummyWorld();
+ GT_Values.NW = new GT_Network();
+ GT_Values.RA = new GT_RecipeAdder();
+
+ for (int i = 0; i < 4; i++) {
+ GregTech_API.registerTileEntityConstructor(i, i2 -> GregTech_API.constructBaseMetaTileEntity());
+ }
+ for (int i = 4; i < 12; i++) {
+ GregTech_API.registerTileEntityConstructor(i, i2 -> new BaseMetaPipeEntity());
+ }
+
+ // noinspection deprecation// Need run-time initialization
+ GregTech_API.sRecipeAdder = GT_Values.RA;
+
+ // noinspection ResultOfMethodCallIgnored// Suspicious likely pointless
+ Textures.BlockIcons.VOID.name();
+ // noinspection ResultOfMethodCallIgnored// Suspicious likely pointless
+ Textures.ItemIcons.VOID.name();
+ }
+
+ @SuppressWarnings("unused") // TODO: Delete this method
+ public static int calculateTotalGTVersion(int minorVersion) {
+ return calculateTotalGTVersion(VERSION, minorVersion);
+ }
+
+ public static int calculateTotalGTVersion(int majorVersion, int minorVersion) {
+ return calculateTotalGTVersion(majorVersion, minorVersion, 0);
+ }
+
+ public static int calculateTotalGTVersion(int majorVersion, int minorVersion, int patchVersion) {
+ return majorVersion * 1000000 + minorVersion * 1000 + patchVersion;
+ }
+
+ @Mod.EventHandler
+ public void onPreLoad(FMLPreInitializationEvent aEvent) {
+ Locale.setDefault(Locale.ENGLISH);
+ if (GregTech_API.sPreloadStarted) {
+ return;
+ }
+
+ for (Runnable tRunnable : GregTech_API.sBeforeGTPreload) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ Configuration tMainConfig = GT_PreLoad.getConfiguration(aEvent.getModConfigurationDirectory());
+ GT_PreLoad.initCompat();
+ GT_PreLoad.createLogFiles(
+ aEvent.getModConfigurationDirectory()
+ .getParentFile(),
+ tMainConfig);
+
+ gregtechproxy.onPreLoad();
+
+ GT_Log.out.println("GT_Mod: Setting Configs");
+
+ GT_PreLoad.loadConfig(tMainConfig);
+
+ new Enchantment_Hazmat();
+ new Enchantment_EnderDamage();
+ new Enchantment_Radioactivity();
+
+ Materials.init();
+
+ GT_Log.out.println("GT_Mod: Saving Main Config");
+ tMainConfig.save();
+
+ GT_PreLoad.initLocalization(
+ aEvent.getModConfigurationDirectory()
+ .getParentFile());
+ GT_PreLoad.adjustScrap();
+
+ EntityRegistry.registerModEntity(GT_Entity_Arrow.class, "GT_Entity_Arrow", 1, GT_Values.GT, 160, 1, true);
+ EntityRegistry
+ .registerModEntity(GT_Entity_Arrow_Potion.class, "GT_Entity_Arrow_Potion", 2, GT_Values.GT, 160, 1, true);
+ AEApi.instance()
+ .registries()
+ .interfaceTerminal()
+ .register(GT_MetaTileEntity_Hatch_CraftingInput_ME.class);
+
+ GT_PreLoad.runMineTweakerCompat();
+
+ new GT_Loader_OreProcessing().run();
+ new GT_Loader_OreDictionary().run();
+ new GT_Loader_ItemData().run();
+ new GT_Loader_Item_Block_And_Fluid().run();
+ new GT_Loader_MetaTileEntities().run();
+ if (GT_Values.enableMultiTileEntities) {
+ new GT_Loader_MultiTileEntities().run();
+ }
+
+ new GT_Loader_CircuitBehaviors().run();
+ new GT_CoverBehaviorLoader().run();
+ new GT_SonictronLoader().run();
+ new GT_SpawnEventHandler();
+
+ GT_PreLoad.sortToTheEnd();
+ GregTech_API.sPreloadFinished = true;
+ GT_Log.out.println("GT_Mod: Preload-Phase finished!");
+ GT_Log.ore.println("GT_Mod: Preload-Phase finished!");
+
+ GT_UIInfos.init();
+
+ for (Runnable tRunnable : GregTech_API.sAfterGTPreload) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ if (FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isServer()) GT_Assemblyline_Server.fillMap(aEvent);
+ }
+
+ @Mod.EventHandler
+ public void onLoad(FMLInitializationEvent aEvent) {
+ if (GregTech_API.sLoadStarted) {
+ return;
+ }
+
+ for (Runnable tRunnable : GregTech_API.sBeforeGTLoad) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ if (Forestry.isModLoaded())
+ // noinspection InstantiationOfUtilityClass//TODO: Refactor GT_Bees with proper state handling
+ new GT_Bees();
+
+ // Disable Low Grav regardless of config if Cleanroom is disabled.
+ if (!gregtechproxy.mEnableCleanroom) {
+ gregtechproxy.mLowGravProcessing = false;
+ }
+
+ gregtechproxy.onLoad();
+
+ registerCircuitProgrammer(new Predicate<>() {
+
+ private final int screwdriverOreId = OreDictionary.getOreID("craftingToolScrewdriver");
+
+ @Override
+ public boolean test(ItemStack stack) {
+ for (int i : OreDictionary.getOreIDs(stack)) if (i == screwdriverOreId) return true;
+ return false;
+ }
+ }, true);
+
+ new GT_Loader_MetaTileEntities_Recipes().run();
+
+ if (gregtechproxy.mSortToTheEnd) {
+ new GT_ItemIterator().run();
+ gregtechproxy.registerUnificationEntries();
+ new GT_FuelLoader().run();
+ }
+ if (Mods.Waila.isModLoaded()) {
+ Waila.init();
+ }
+ if (Mods.HoloInventory.isModLoaded()) {
+ HoloInventory.init();
+ }
+ GregTech_API.sLoadFinished = true;
+ GT_Log.out.println("GT_Mod: Load-Phase finished!");
+ GT_Log.ore.println("GT_Mod: Load-Phase finished!");
+
+ for (Runnable tRunnable : GregTech_API.sAfterGTLoad) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+
+ @Mod.EventHandler
+ public void onPostLoad(FMLPostInitializationEvent aEvent) {
+ if (GregTech_API.sPostloadStarted) {
+ return;
+ }
+
+ for (Runnable tRunnable : GregTech_API.sBeforeGTPostload) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ gregtechproxy.onPostLoad();
+
+ final int bound = GregTech_API.METATILEENTITIES.length;
+ for (int i1 = 1; i1 < bound; i1++) {
+ if (GregTech_API.METATILEENTITIES[i1] != null) {
+ GT_Log.out.printf("META %d %s\n", i1, GregTech_API.METATILEENTITIES[i1].getMetaName());
+ }
+ }
+
+ if (gregtechproxy.mSortToTheEnd) {
+ gregtechproxy.registerUnificationEntries();
+ } else {
+ new GT_ItemIterator().run();
+ gregtechproxy.registerUnificationEntries();
+ new GT_FuelLoader().run();
+ }
+ new GT_BookAndLootLoader().run();
+ new GT_ItemMaxStacksizeLoader().run();
+ new GT_BlockResistanceLoader().run();
+ new GT_RecyclerBlacklistLoader().run();
+ new GT_MinableRegistrator().run();
+ new GT_FakeRecipeLoader().run();
+ new GT_MachineRecipeLoader().run();
+ new GT_ScrapboxDropLoader().run();
+ new GT_CropLoader().run();
+ new GT_Worldgenloader().run();
+ new GT_CoverLoader().run();
+
+ GT_RecipeRegistrator.registerUsagesForMaterials(
+ null,
+ false,
+ new ItemStack(Blocks.planks, 1),
+ new ItemStack(Blocks.cobblestone, 1),
+ new ItemStack(Blocks.stone, 1),
+ new ItemStack(Items.leather, 1));
+
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getRecipeOutput(
+ null,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L),
+ null,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L),
+ null,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L),
+ null,
+ null,
+ null),
+ new ItemData(Materials.Tin, 10886400L));
+ GT_ModHandler.removeRecipe(
+ new ItemStack(Items.glowstone_dust, 1),
+ new ItemStack(Items.glowstone_dust, 1),
+ null,
+ new ItemStack(Items.glowstone_dust, 1),
+ new ItemStack(Items.glowstone_dust, 1));
+ GT_ModHandler.removeRecipeDelayed(
+ new ItemStack(Blocks.wooden_slab, 1, 0),
+ new ItemStack(Blocks.wooden_slab, 1, 1),
+ new ItemStack(Blocks.wooden_slab, 1, 2));
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.wooden_slab, 6, 0),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WWW", 'W', new ItemStack(Blocks.planks, 1, 0) });
+
+ // Save a copy of these list before activateOreDictHandler(), then loop over them.
+ Map<IRecipeInput, RecipeOutput> aMaceratorRecipeList = GT_ModHandler.getMaceratorRecipeList();
+ Map<IRecipeInput, RecipeOutput> aCompressorRecipeList = GT_ModHandler.getCompressorRecipeList();
+ Map<IRecipeInput, RecipeOutput> aExtractorRecipeList = GT_ModHandler.getExtractorRecipeList();
+ Map<IRecipeInput, RecipeOutput> aOreWashingRecipeList = GT_ModHandler.getOreWashingRecipeList();
+ Map<IRecipeInput, RecipeOutput> aThermalCentrifugeRecipeList = GT_ModHandler.getThermalCentrifugeRecipeList();
+
+ GT_Log.out.println(
+ "GT_Mod: Activating OreDictionary Handler, this can take some time, as it scans the whole OreDictionary");
+ GT_FML_LOGGER.info(
+ "If your Log stops here, you were too impatient. Wait a bit more next time, before killing Minecraft with the Task Manager.");
+
+ GT_PostLoad.activateOreDictHandler();
+ GT_PostLoad.replaceVanillaMaterials();
+ GT_PostLoad.removeIc2Recipes(
+ aMaceratorRecipeList,
+ aCompressorRecipeList,
+ aExtractorRecipeList,
+ aOreWashingRecipeList,
+ aThermalCentrifugeRecipeList);
+
+ if (GT_Values.D1) {
+ GT_ModHandler.sSingleNonBlockDamagableRecipeList.forEach(
+ iRecipe -> GT_Log.out.println(
+ "=> " + iRecipe.getRecipeOutput()
+ .getDisplayName()));
+ }
+ new GT_CraftingRecipeLoader().run();
+ GT_ModHandler.removeRecipeByOutput(ItemList.IC2_ForgeHammer.getWildcard(1L));
+ GT_ModHandler.removeRecipeByOutput(GT_ModHandler.getIC2Item("machine", 1L));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("machine", 1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "RRR", "RwR", "RRR", 'R', OrePrefixes.plate.get(Materials.Iron) });
+
+ GT_PostLoad.registerFluidCannerRecipes();
+
+ if (Forestry.isModLoaded()) {
+ GT_Forestry_Compat.transferCentrifugeRecipes();
+ GT_Forestry_Compat.transferSqueezerRecipes();
+ }
+ GT_MetaTileEntity_DigitalChestBase.registerAEIntegration();
+ ItemStack facade = AEApi.instance()
+ .definitions()
+ .items()
+ .facade()
+ .maybeItem()
+ .transform(i -> new ItemStack(i, 1, GT_Values.W))
+ .orNull();
+ if (facade != null) {
+ GregTech_API.registerCover(facade, null, new GT_Cover_FacadeAE());
+ }
+
+ Arrays
+ .stream(
+ new String[] { "blastfurnace", "blockcutter", "inductionFurnace", "generator", "windMill", "waterMill",
+ "solarPanel", "centrifuge", "electrolyzer", "compressor", "electroFurnace", "extractor",
+ "macerator", "recycler", "metalformer", "orewashingplant", "massFabricator", "replicator", })
+ .map(tName -> GT_ModHandler.getIC2Item(tName, 1L))
+ .forEach(GT_ModHandler::removeRecipeByOutputDelayed);
+
+ GT_PostLoad.nerfVanillaTools();
+
+ /*
+ * Until this point most crafting recipe additions, and removals, have been buffered. Go through, execute the
+ * removals in bulk, and then any deferred additions. The bulk removals in particular significantly speed up the
+ * recipe list modifications.
+ */
+
+ @SuppressWarnings("UnstableApiUsage") // Stable enough for this project
+ Stopwatch stopwatch = Stopwatch.createStarted();
+ GT_Log.out.println("GT_Mod: Adding buffered Recipes.");
+ GT_ModHandler.stopBufferingCraftingRecipes();
+ // noinspection UnstableApiUsage// Stable enough for this project
+ GT_FML_LOGGER.info("Executed delayed Crafting Recipes (" + stopwatch.stop() + "). Have a Cake.");
+
+ GT_Log.out.println("GT_Mod: Saving Lang File.");
+ new GT_MachineTooltipsLoader().run();
+ GT_LanguageManager.sEnglishFile.save();
+ GregTech_API.sPostloadFinished = true;
+ GT_Log.out.println("GT_Mod: PostLoad-Phase finished!");
+ GT_Log.ore.println("GT_Mod: PostLoad-Phase finished!");
+ for (Runnable tRunnable : GregTech_API.sAfterGTPostload) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ GT_PostLoad.addFakeRecipes();
+
+ if (GregTech_API.mOutputRF || GregTech_API.mInputRF) {
+ GT_Utility.checkAvailabilities();
+ if (!GT_Utility.RF_CHECK) {
+ GregTech_API.mOutputRF = false;
+ GregTech_API.mInputRF = false;
+ }
+ }
+
+ GT_PostLoad.addSolidFakeLargeBoilerFuels();
+ GT_PostLoad.identifyAnySteam();
+
+ achievements = new GT_Achievements();
+
+ GT_Recipe.GTppRecipeHelper = true;
+ GT_Log.out.println("GT_Mod: Loading finished, de-allocating temporary Init Variables.");
+ GregTech_API.sBeforeGTPreload = null;
+ GregTech_API.sAfterGTPreload = null;
+ GregTech_API.sBeforeGTLoad = null;
+ GregTech_API.sAfterGTLoad = null;
+ GregTech_API.sBeforeGTPostload = null;
+ GregTech_API.sAfterGTPostload = null;
+
+ GT_PostLoad.createGTtoolsCreativeTab();
+ }
+
+ @Mod.EventHandler
+ public void onLoadComplete(FMLLoadCompleteEvent aEvent) {
+ gregtechproxy.onLoadComplete();
+ for (Runnable tRunnable : GregTech_API.sGTCompleteLoad) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ GregTech_API.sGTCompleteLoad = null;
+ }
+
+ @Mod.EventHandler
+ public void onServerStarted(FMLServerStartedEvent aEvent) {
+ gregtechproxy.onServerStarted();
+ }
+
+ @Mod.EventHandler
+ public void onServerAboutToStart(FMLServerAboutToStartEvent aEvent) {
+ gregtechproxy.onServerAboutToStart();
+ }
+
+ @Mod.EventHandler
+ public void onServerStarting(FMLServerStartingEvent aEvent) {
+
+ for (Runnable tRunnable : GregTech_API.sBeforeGTServerstart) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ gregtechproxy.onServerStarting();
+ // Check for more IC2 recipes on ServerStart to also catch MineTweaker additions
+ GT_ModHandler
+ .addIC2RecipesToGT(GT_ModHandler.getMaceratorRecipeList(), RecipeMaps.maceratorRecipes, true, true, true);
+ GT_ModHandler
+ .addIC2RecipesToGT(GT_ModHandler.getCompressorRecipeList(), RecipeMaps.compressorRecipes, true, true, true);
+ GT_ModHandler
+ .addIC2RecipesToGT(GT_ModHandler.getExtractorRecipeList(), RecipeMaps.extractorRecipes, true, true, true);
+ GT_ModHandler
+ .addIC2RecipesToGT(GT_ModHandler.getOreWashingRecipeList(), RecipeMaps.oreWasherRecipes, false, true, true);
+ GT_ModHandler.addIC2RecipesToGT(
+ GT_ModHandler.getThermalCentrifugeRecipeList(),
+ RecipeMaps.thermalCentrifugeRecipes,
+ true,
+ true,
+ true);
+ GT_Log.out.println("GT_Mod: Unificating outputs of all known Recipe Types.");
+ ArrayList<ItemStack> tStacks = new ArrayList<>(10000);
+ GT_Log.out.println("GT_Mod: IC2 Machines");
+
+ ic2.api.recipe.Recipes.cannerBottle.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.centrifuge.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.compressor.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.extractor.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.macerator.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.metalformerCutting.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.metalformerExtruding.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.metalformerRolling.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.matterAmplifier.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.oreWashing.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+
+ GT_Log.out.println("GT_Mod: Dungeon Loot");
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("dungeonChest")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("bonusChest")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("villageBlacksmith")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("strongholdCrossing")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("strongholdLibrary")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("strongholdCorridor")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("pyramidJungleDispenser")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("pyramidJungleChest")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("pyramidDesertyChest")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("mineshaftCorridor")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ GT_Log.out.println("GT_Mod: Smelting");
+
+ // Deal with legacy Minecraft raw types
+ tStacks.addAll(
+ FurnaceRecipes.smelting()
+ .getSmeltingList()
+ .values());
+
+ if (gregtechproxy.mCraftingUnification) {
+ GT_Log.out.println("GT_Mod: Crafting Recipes");
+ for (IRecipe tRecipe : CraftingManager.getInstance()
+ .getRecipeList()) {
+ if ((tRecipe instanceof IRecipe)) {
+ tStacks.add(tRecipe.getRecipeOutput());
+ }
+ }
+ }
+ for (ItemStack tOutput : tStacks) {
+ if (!gregtechproxy.mRegisteredOres.contains(tOutput)) {
+ GT_OreDictUnificator.setStack(tOutput);
+ } else {
+ logMultilineError(GT_FML_LOGGER, generateGTErr01Message(tOutput));
+ tOutput.setStackDisplayName("ERROR! PLEASE CHECK YOUR LOG FOR 'GT-ERR-01'!");
+ }
+ }
+ GregTech_API.mServerStarted = true;
+ GT_Log.out.println("GT_Mod: ServerStarting-Phase finished!");
+ GT_Log.ore.println("GT_Mod: ServerStarting-Phase finished!");
+
+ for (Runnable tRunnable : GregTech_API.sAfterGTServerstart) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ aEvent.registerServerCommand(new GT_Command());
+ aEvent.registerServerCommand(new SP_Command());
+ aEvent.registerServerCommand(new SPM_Command());
+ // Sets a new Machine Block Update Thread everytime a world is loaded
+ GT_Runnable_MachineBlockUpdate.initExecutorService();
+ }
+
+ public boolean isServerSide() {
+ return gregtechproxy.isServerSide();
+ }
+
+ public boolean isClientSide() {
+ return gregtechproxy.isClientSide();
+ }
+
+ public boolean isBukkitSide() {
+ return gregtechproxy.isBukkitSide();
+ }
+
+ public EntityPlayer getThePlayer() {
+ return gregtechproxy.getThePlayer();
+ }
+
+ public int addArmor(String aArmorPrefix) {
+ return gregtechproxy.addArmor(aArmorPrefix);
+ }
+
+ public void doSonictronSound(ItemStack aStack, World aWorld, double aX, double aY, double aZ) {
+ gregtechproxy.doSonictronSound(aStack, aWorld, aX, aY, aZ);
+ }
+
+ @Mod.EventHandler
+ public void onIDChangingEvent(FMLModIdMappingEvent aEvent) {
+ GT_Utility.reInit();
+ GT_Recipe.reInit();
+ try {
+ for (Map<?, ?> gt_itemStackMap : GregTech_API.sItemStackMappings) {
+ GT_Utility.reMap(gt_itemStackMap);
+ }
+ for (SetMultimap<? extends ItemHolder, ?> gt_itemStackMap : GregTech_API.itemStackMultiMaps) {
+ GT_Utility.reMap(gt_itemStackMap);
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Mod.EventHandler
+ public void onServerStopping(FMLServerStoppingEvent aEvent) {
+ for (Runnable tRunnable : GregTech_API.sBeforeGTServerstop) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ gregtechproxy.onServerStopping();
+
+ for (Runnable tRunnable : GregTech_API.sAfterGTServerstop) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ // Interrupt IDLE Threads to close down cleanly
+ GT_Runnable_MachineBlockUpdate.shutdownExecutorService();
+ }
+
+ public static void logStackTrace(Throwable t) {
+ final StringWriter sw = new StringWriter();
+ t.printStackTrace(new PrintWriter(sw));
+ GT_FML_LOGGER.error(sw);
+ }
+
+ private static String[] generateGTErr01Message(ItemStack stack) {
+ // The message is presented on a per-line basis to make possible formatting in the future easier.
+ return new String[] { "GT-ERR-01 at " + stack.getUnlocalizedName() + " " + stack.getDisplayName(),
+ "A recipe used an OreDict item as output directly, without copying the item before that. This is a typical CallByReference/CallByValue error.",
+ "The said item will be renamed to make the invalid recipe visible.",
+ "Please check all recipes that output this item, and report them to the mod that introduced the recipes.", };
+ }
+
+ @SuppressWarnings("SameParameterValue") // The method is used with one logger, but that might change in the future.
+ private static void logMultilineError(Logger logger, String[] errorMessageLines) {
+ for (String errorMessage : errorMessageLines) {
+ logger.error(errorMessage);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java
new file mode 100644
index 0000000000..e80bc7345b
--- /dev/null
+++ b/src/main/java/gregtech/api/GregTech_API.java
@@ -0,0 +1,1082 @@
+package gregtech.api;
+
+import static gregtech.api.enums.GT_Values.B;
+import static gregtech.api.enums.GT_Values.L;
+import static gregtech.api.enums.GT_Values.M;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.BiFunction;
+import java.util.function.IntFunction;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
+import com.google.common.collect.SetMultimap;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IDamagableItem;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.internal.IGT_RecipeAdder;
+import gregtech.api.interfaces.internal.IThaumcraftCompat;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable;
+import gregtech.api.items.GT_CoolantCellIC_Item;
+import gregtech.api.items.GT_CoolantCell_Item;
+import gregtech.api.items.GT_Tool_Item;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.objects.GT_Cover_Default;
+import gregtech.api.objects.GT_Cover_None;
+import gregtech.api.objects.GT_HashSet;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.threads.GT_Runnable_Cable_Update;
+import gregtech.api.threads.GT_Runnable_MachineBlockUpdate;
+import gregtech.api.util.GT_CircuitryBehavior;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_CreativeTab;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.item.ItemHolder;
+import gregtech.api.world.GT_Worldgen;
+import gregtech.common.GT_DummyWorld;
+import gregtech.common.items.GT_IntegratedCircuit_Item;
+
+/**
+ * Please do not include this File in your Mod-download as it ruins compatibility, like with the IC2-API You may just
+ * copy those Functions into your Code, or better call them via reflection.
+ * <p/>
+ * The whole API is the basic construct of my Mod. Everything is dependent on it. I change things quite often so please
+ * don't include any File inside your Mod, even if it is an Interface. Since some Authors were stupid enough to break
+ * this simple Rule, I added Version checks to enforce it.
+ * <p/>
+ * In these Folders are many useful Functions. You can use them via reflection if you want. I know not everything is
+ * compilable due to APIs of other Mods, but these are easy to fix in your Setup.
+ * <p/>
+ * You can use this to learn about Modding, but I would recommend simpler Mods. You may even copy-paste Code from these
+ * API-Files into your Mod, as I have nothing against that, but you should look exactly at what you are copying.
+ *
+ * @author Gregorius Techneticies
+ */
+@SuppressWarnings("unused") // API class has legitimately unused methods and members
+public class GregTech_API {
+
+ /**
+ * @deprecated Use {@link GT_Values#M}
+ */
+ @Deprecated
+ public static final long MATERIAL_UNIT = M;
+ /**
+ * @deprecated Use {@link GT_Values#L}
+ */
+ @Deprecated
+ public static final long FLUID_MATERIAL_UNIT = L;
+ /**
+ * Fixes the HashMap Mappings for ItemStacks once the Server started
+ * <br>
+ * <br>
+ * NOTE: We use wildcards generics for the key because it could be for example {@link ItemStack} or
+ * {@link GT_ItemStack}
+ */
+ public static final Collection<Map<?, ?>> sItemStackMappings = new ArrayList<>();
+ public static final Collection<SetMultimap<? extends ItemHolder, ?>> itemStackMultiMaps = new ArrayList<>();
+
+ /**
+ * The MetaTileEntity-ID-List-Length
+ */
+ public static final short MAXIMUM_METATILE_IDS = Short.MAX_VALUE - 1;
+ /**
+ * My Creative Tab
+ */
+ public static final CreativeTabs TAB_GREGTECH = new GT_CreativeTab("Main", "Main"),
+ TAB_GREGTECH_MATERIALS = new GT_CreativeTab("Materials", "Materials"),
+ TAB_GREGTECH_ORES = new GT_CreativeTab("Ores", "Ores");
+ /**
+ * A List of all registered MetaTileEntities
+ * <p/>
+ * 0 - 749 are used by GregTech.
+ * 750 - 999 are reserved for Alkalus.
+ * 1000 - 2047 are used by GregTech.
+ * 2048 - 2559 are reserved for OvermindDL.
+ * 2560 - 3071 are reserved for Immibis.
+ * 3072 - 3583 are reserved for LinusPhoenix.
+ * 3584 - 4095 are reserved for BloodyAsp.
+ * 4096 - 5095 are used for GregTech Frames.
+ * 5096 - 6099 are used for GregTech Pipes.
+ * 6100 - 8191 are used for GregTech Decoration Blocks.
+ * 8192 - 8703 are reserved for ZL123.
+ * 8704 - 9215 are reserved for Mr10Movie.
+ * 9216 - 9727 are used for GregTech Automation Machines.
+ * 9728 - 10239 are reserved for 28Smiles.
+ * 10240 - 10751 are reserved for VirMan.
+ * 10752 - 11263 are reserved for Briareos81.
+ * 11264 - 12000 are reserved for Quantum64.
+ * 12001 - 12500 are reserved for RedMage17.
+ * 12501 - 13000 are reserved for bartimaeusnek.
+ * 13001 - 13100 are reserved for Techlone.
+ * 13101 - 13500 are reserved for kekzdealer.
+ * 13501 - 14000 are reserved for glee8e.
+ * 14001 - 14100 are reserved for glowredman.
+ * 14101 - 14200 are reserved for MuXiu1997.
+ * 14201 - 14300 are reserved for kuba6000.
+ * 14301 - 14999 are currently free.
+ * 15000 - 16999 are reserved for TecTech.
+ * 17000 - 29999 are currently free.
+ * 30000 - 31999 are reserved for Alkalus.
+ * 32001 - 32766 are reserved for Glod.
+ * <p/>
+ * Contact me if you need a free ID-Range, which doesn't conflict with other Addons. You could make an ID-Config,
+ * but we all know what "stupid" customers think about conflicting ID's
+ */
+ public static final IMetaTileEntity[] METATILEENTITIES = new IMetaTileEntity[MAXIMUM_METATILE_IDS];
+ /**
+ * The Icon List for Covers
+ */
+ public static final Map<GT_ItemStack, ITexture> sCovers = new ConcurrentHashMap<>();
+ /**
+ * The List of Cover Behaviors for the Covers
+ */
+ public static final Map<GT_ItemStack, GT_CoverBehaviorBase<?>> sCoverBehaviors = new ConcurrentHashMap<>();
+ /**
+ * The List of Circuit Behaviors for the Redstone Circuit Block
+ */
+ public static final Map<Integer, GT_CircuitryBehavior> sCircuitryBehaviors = new ConcurrentHashMap<>();
+ /**
+ * The List of Blocks, which can conduct Machine Block Updates
+ */
+ public static final Map<Block, Integer> sMachineIDs = new ConcurrentHashMap<>();
+ /**
+ * The Redstone Frequencies
+ */
+ public static final Map<Integer, Byte> sWirelessRedstone = new ConcurrentHashMap<>();
+ /**
+ * The Advanced Redstone Frequencies
+ */
+ public static final Map<String, Map<Integer, Map<Long, Byte>>> sAdvancedWirelessRedstone = new ConcurrentHashMap<>();
+
+ /**
+ * The IDSU Frequencies
+ */
+ public static final Map<Integer, Integer> sIDSUList = new ConcurrentHashMap<>();
+ /**
+ * A List of all Books, which were created using @GT_Utility.getWrittenBook the original Title is the Key Value
+ */
+ public static final Map<String, ItemStack> sBookList = new ConcurrentHashMap<>();
+ /**
+ * The List of all Sounds used in GT, indices are in the static Block at the bottom
+ *
+ * @deprecated Use {@link SoundResource}
+ */
+ @Deprecated
+ public static final Map<Integer, String> sSoundList = SoundResource.asSoundList();
+ /**
+ * The List of Tools, which can be used. Accepts regular damageable Items and Electric Items
+ */
+ public static final GT_HashSet<GT_ItemStack> sToolList = new GT_HashSet<>(), sCrowbarList = new GT_HashSet<>(),
+ sScrewdriverList = new GT_HashSet<>(), sWrenchList = new GT_HashSet<>(), sSoftHammerList = new GT_HashSet<>(),
+ sHardHammerList = new GT_HashSet<>(), sWireCutterList = new GT_HashSet<>(),
+ sSolderingToolList = new GT_HashSet<>(), sSolderingMetalList = new GT_HashSet<>(),
+ sJackhammerList = new GT_HashSet<>();
+ /**
+ * The List of Hazmat Armors
+ */
+ public static final GT_HashSet<GT_ItemStack> sGasHazmatList = new GT_HashSet<>(),
+ sBioHazmatList = new GT_HashSet<>(), sFrostHazmatList = new GT_HashSet<>(),
+ sHeatHazmatList = new GT_HashSet<>(), sRadioHazmatList = new GT_HashSet<>(),
+ sElectroHazmatList = new GT_HashSet<>();
+
+ private static final Multimap<Integer, ItemStack> sRealConfigurationList = Multimaps
+ .newListMultimap(new TreeMap<>(), ArrayList::new);
+ private static final Map<Integer, List<ItemStack>> sConfigurationLists = new ConcurrentHashMap<>();
+ private static final Map<Predicate<ItemStack>, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> sRealCircuitProgrammerList = new LinkedHashMap<>();
+ public static final Map<Predicate<ItemStack>, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> sCircuitProgrammerList = Collections
+ .unmodifiableMap(sRealCircuitProgrammerList);
+
+ /**
+ * The List of Dimensions, which are Whitelisted for the Teleporter. This list should not contain other Planets.
+ * Mystcraft Dimensions and other Dimensional Things should be allowed. Mystcraft and Twilight Forest are
+ * automatically considered a Dimension, without being in this List.
+ */
+ public static final Collection<Integer> sDimensionalList = new HashSet<>();
+ /**
+ * Lists of all the active World generation Features, these are getting Initialized in Postload!
+ */
+ public static final List<GT_Worldgen> sWorldgenList = new ArrayList<>();
+ /**
+ * A List containing all the Materials, which are somehow in use by GT and therefor receive a specific Set of Items.
+ */
+ public static final Materials[] sGeneratedMaterials = new Materials[1000];
+ /**
+ * This is the generic Cover behavior. Used for the default Covers, which have no Behavior.
+ */
+ public static final GT_CoverBehavior sDefaultBehavior = new GT_Cover_Default(), sNoBehavior = new GT_Cover_None();
+ /**
+ * For the API Version check
+ */
+ public static volatile int VERSION = 509;
+
+ /**
+ * @deprecated Use {@link GT_Values#RA}
+ */
+ @SuppressWarnings("DeprecatedIsStillUsed") // Still need be initialized for backward compat
+ @Deprecated
+ public static IGT_RecipeAdder sRecipeAdder;
+ /**
+ * Registers Aspects to Thaumcraft. This Object might be {@code null} if Thaumcraft isn't installed.
+ */
+ public static IThaumcraftCompat sThaumcraftCompat;
+ /**
+ * The Lists below are executed at their respective timings. Useful to do things at a particular moment in time.
+ * The Lists are not Threaded - a native Java interface is used for their execution.
+ * Add your "commands" in the constructor or in the static-code-block of your mod's Main class.
+ * Implement the method {@code run()}, and everything should work.
+ */
+ public static List<Runnable> sBeforeGTPreload = new ArrayList<>(), sAfterGTPreload = new ArrayList<>(),
+ sBeforeGTLoad = new ArrayList<>(), sAfterGTLoad = new ArrayList<>(), sBeforeGTPostload = new ArrayList<>(),
+ sAfterGTPostload = new ArrayList<>(), sFirstWorldTick = new ArrayList<>(),
+ sBeforeGTServerstart = new ArrayList<>(), sAfterGTServerstart = new ArrayList<>(),
+ sBeforeGTServerstop = new ArrayList<>(), sAfterGTServerstop = new ArrayList<>(),
+ sGTBlockIconload = new ArrayList<>(), sGTItemIconload = new ArrayList<>(), sGTCompleteLoad = new ArrayList<>();
+ /**
+ * The Icon Registers from Blocks and Items. They will get set right before the corresponding Icon Load Phase as
+ * executed in the Runnable List above.
+ */
+ @SideOnly(Side.CLIENT)
+ public static IIconRegister sBlockIcons, sItemIcons;
+ /**
+ * The Configuration Objects
+ */
+ public static GT_Config sMachineFile = null, sWorldgenFile = null, sMaterialProperties = null, sUnification = null,
+ sSpecialFile = null, sClientDataFile, sOPStuff = null;
+
+ public static int TICKS_FOR_LAG_AVERAGING = 25, MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING = 100;
+ /**
+ * Initialized by the Block creation.
+ */
+ public static Block sBlockMachines;
+
+ public static Block sBlockOres1, sBlockOresUb1, sBlockOresUb2, sBlockOresUb3,
+ /* sBlockGem, */
+ sBlockMetal1, sBlockMetal2, sBlockMetal3, sBlockMetal4, sBlockMetal5, sBlockMetal6, sBlockMetal7, sBlockMetal8,
+ sBlockMetal9, sBlockGem1, sBlockGem2, sBlockGem3, sBlockReinforced;
+ public static Block sBlockGranites, sBlockConcretes, sBlockStones;
+ public static Block sBlockCasings1, sBlockCasings2, sBlockCasings3, sBlockCasings4, sBlockCasings5, sBlockCasings6,
+ sBlockCasings8, sBlockCasings9, sSolenoidCoilCasings;
+ public static Block sBlockLongDistancePipes;
+ public static Block sDroneRender;
+ /**
+ * Getting assigned by the Config
+ */
+ public static boolean sTimber = true, sDrinksAlwaysDrinkable = false, sMultiThreadedSounds = false,
+ sDoShowAllItemsInCreative = false, sColoredGUI = true, sMachineMetalGUI = false, sConstantEnergy = true,
+ sMachineExplosions = true, sMachineFlammable = true, sMachineNonWrenchExplosions = true,
+ sMachineRainExplosions = true, sMachineThunderExplosions = true, sMachineFireExplosions = true,
+ sMachineWireFire = true, mOutputRF = false, mInputRF = false, meIOLoaded = false, mRFExplosions = false,
+ mServerStarted = false;
+
+ @Deprecated
+ public static boolean mIC2Classic = false, mMagneticraft = false, mImmersiveEngineering = false,
+ mGTPlusPlus = false, mTranslocator = false, mTConstruct = false, mGalacticraft = false, mHodgepodge = false,
+ mAvaritia = false;
+ /**
+ * This is always set to true
+ */
+ @Deprecated
+ public boolean mAE2 = true;
+
+ public static int mEUtoRF = 360, mRFtoEU = 20;
+
+ /**
+ * Option to not use MACHINE_METAL mixing into colors
+ */
+ public static boolean sUseMachineMetal = false;
+
+ public static boolean mUseOnlyGoodSolderingMaterials = false;
+
+ private static final String aTextIC2Lower = IndustrialCraft2.ID.toLowerCase(Locale.ENGLISH);
+ /**
+ * Getting assigned by the Mod loading
+ */
+ public static boolean sUnificationEntriesRegistered = false, sPreloadStarted = false, sPreloadFinished = false,
+ sLoadStarted = false, sLoadFinished = false, sPostloadStarted = false, sPostloadFinished = false;
+
+ private static Class<BaseMetaTileEntity> sBaseMetaTileEntityClass = null;
+
+ @SuppressWarnings("unchecked")
+ private static final IntFunction<TileEntity>[] teCreators = new IntFunction[16];
+
+ private static final Set<Class<?>> dummyWorlds = new HashSet<>();
+
+ static {
+ sItemStackMappings.add(sCovers);
+ sItemStackMappings.add(sCoverBehaviors);
+
+ dummyWorlds.add(GT_DummyWorld.class);
+ tryAddDummyWorld("blockrenderer6343.client.world.DummyWorld");
+ }
+
+ private static void tryAddDummyWorld(String className) {
+ ClassLoader cl = GregTech_API.class.getClassLoader();
+ Class<?> clazz;
+ try {
+ clazz = Class.forName(className, false, cl);
+ } catch (ReflectiveOperationException ex) {
+ return;
+ }
+ dummyWorlds.add(clazz);
+ }
+
+ public static void addDummyWorld(Class<?> clazz) {
+ dummyWorlds.add(clazz);
+ }
+
+ public static boolean isDummyWorld(@Nonnull World w) {
+ return dummyWorlds.contains(w.getClass());
+ }
+
+ /**
+ * You want OreDict-Unification for YOUR Mod/Addon, when GregTech is installed? This Function is especially for YOU.
+ * Call this Function after the load-Phase, as I register the most of the Unification at that Phase (Redpowers
+ * Storageblocks are registered at postload). A recommended use of this Function is inside your Recipe-System itself
+ * (if you have one), as the unification then makes 100% sure, that every added non-unificated Output gets
+ * automatically unificated.
+ * <p/>
+ * I will personally make sure, that only common prefixes of Ores get registered at the Unificator, as of now there
+ * are: pulp, dust, dustSmall, ingot, nugget, gem, ore and block If another Mod-Author messes these up, then it's
+ * not my fault, and it's especially not your fault. As these are commonly used prefixes.
+ * <p/>
+ * This Unificator-API-Function uses the same Functions I use, for unificating Items. So if there is something
+ * messed up (very unlikely), then everything is messed up.
+ * <p/>
+ * You shouldn't use this to unificate the Inputs of your Recipes, this is only meant for the Outputs.
+ *
+ * @param aOreStack the Stack you want to get unificated. It is stackSize Sensitive.
+ * @return Either an unificated Stack or the stack you toss in, but it should never be null, unless you throw a
+ * Null-Pointer into it.
+ */
+ public static ItemStack getUnificatedOreDictStack(ItemStack aOreStack) {
+ if (!GregTech_API.sPreloadFinished) GT_Log.err.println(
+ "GregTech_API ERROR: " + aOreStack.getItem()
+ + "."
+ + aOreStack.getItemDamage()
+ + " - OreDict Unification Entries are not registered now, please call it in the postload phase.");
+ return GT_OreDictUnificator.get(true, aOreStack);
+ }
+
+ /**
+ * Causes a Machineblock Update This update will cause surrounding MultiBlock Machines to update their
+ * Configuration. You should call this Function in @Block.breakBlock and in @Block.onBlockAdded of your Machine.
+ *
+ * @param aWorld is being the World
+ * @param aX is the X-Coord of the update causing Block
+ * @param aY is the Y-Coord of the update causing Block
+ * @param aZ is the Z-Coord of the update causing Block
+ */
+ public static boolean causeMachineUpdate(World aWorld, int aX, int aY, int aZ) {
+ if (aWorld != null && !aWorld.isRemote && !isDummyWorld(aWorld)) { // World might be null during World-gen
+ GT_Runnable_MachineBlockUpdate.setMachineUpdateValues(aWorld, aX, aY, aZ);
+ return true;
+ }
+ return false;
+ }
+
+ @SuppressWarnings("UnusedReturnValue") // Retains API method signature
+ public static boolean causeCableUpdate(World aWorld, int aX, int aY, int aZ) {
+ if (aWorld == null || aWorld.isRemote || isDummyWorld(aWorld)) {
+ return false;
+ } // World might be null during World-gen
+ GT_Runnable_Cable_Update.setCableUpdateValues(aWorld, aX, aY, aZ);
+ return true;
+ }
+
+ /**
+ * Adds a Multi-Machine Block, like my Machine Casings for example. You should call @causeMachineUpdate
+ * in @Block.breakBlock and in {@link Block#onBlockAdded} of your registered Block. You don't need to register
+ * TileEntities which implement {@link IMachineBlockUpdateable}
+ *
+ * @param aBlock the Block
+ * @param aMeta the Metadata of the Blocks as Bitmask! -1 or ~0 for all Meta-values
+ */
+ @SuppressWarnings("UnusedReturnValue") // Retains API method signature
+ public static boolean registerMachineBlock(Block aBlock, int aMeta) {
+ if (aBlock == null) return false;
+ if (GregTech_API.sThaumcraftCompat != null)
+ GregTech_API.sThaumcraftCompat.registerPortholeBlacklistedBlock(aBlock);
+ sMachineIDs.put(aBlock, aMeta);
+ return true;
+ }
+
+ /**
+ * Like above but with boolean Parameters instead of a BitMask
+ */
+ public static boolean registerMachineBlock(Block aBlock, boolean... aMeta) {
+ if (aBlock == null || aMeta == null || aMeta.length == 0) return false;
+ if (GregTech_API.sThaumcraftCompat != null)
+ GregTech_API.sThaumcraftCompat.registerPortholeBlacklistedBlock(aBlock);
+ int rMeta = 0;
+ for (byte i = 0; i < aMeta.length && i < 16; i++) if (aMeta[i]) rMeta |= B[i];
+ sMachineIDs.put(aBlock, rMeta);
+ return true;
+ }
+
+ /**
+ * if this Block is a Machine Update Conducting Block
+ */
+ public static boolean isMachineBlock(Block aBlock, int aMeta) {
+ if (aBlock != null) {
+ Integer id = sMachineIDs.get(aBlock);
+ return id != null && (id & B[aMeta]) != 0;
+ }
+ return false;
+ }
+
+ /**
+ * Creates a new Coolant Cell Item for your Nuclear Reactor
+ */
+ public static Item constructCoolantCellItem(String aUnlocalized, String aEnglish, int aMaxStore) {
+ try {
+ return new GT_CoolantCellIC_Item(aUnlocalized, aEnglish, aMaxStore);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ try {
+ return new GT_CoolantCell_Item(aUnlocalized, aEnglish, aMaxStore);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return new gregtech.api.items.GT_Generic_Item(
+ aUnlocalized,
+ aEnglish,
+ "Doesn't work as intended, this is a Bug");
+ }
+
+ /**
+ * Creates a new Energy Armor Item
+ */
+ public static Item constructElectricArmorItem(String aUnlocalized, String aEnglish, int aCharge, int aTransfer,
+ int aTier, int aDamageEnergyCost, int aSpecials, double aArmorAbsorbtionPercentage, boolean aChargeProvider,
+ int aType, int aArmorIndex) {
+ try {
+ return (Item) Class.forName("gregtechmod.api.items.GT_EnergyArmorIC_Item")
+ .getConstructors()[0].newInstance(
+ aUnlocalized,
+ aEnglish,
+ aCharge,
+ aTransfer,
+ aTier,
+ aDamageEnergyCost,
+ aSpecials,
+ aArmorAbsorbtionPercentage,
+ aChargeProvider,
+ aType,
+ aArmorIndex);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ try {
+ return (Item) Class.forName("gregtechmod.api.items.GT_EnergyArmor_Item")
+ .getConstructors()[0].newInstance(
+ aUnlocalized,
+ aEnglish,
+ aCharge,
+ aTransfer,
+ aTier,
+ aDamageEnergyCost,
+ aSpecials,
+ aArmorAbsorbtionPercentage,
+ aChargeProvider,
+ aType,
+ aArmorIndex);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return new gregtech.api.items.GT_Generic_Item(
+ aUnlocalized,
+ aEnglish,
+ "Doesn't work as intended, this is a Bug");
+ }
+
+ /**
+ * Creates a new Energy Battery Item
+ */
+ public static Item constructElectricEnergyStorageItem(String aUnlocalized, String aEnglish, int aCharge,
+ int aTransfer, int aTier, int aEmptyID, int aFullID) {
+ try {
+ return (Item) Class.forName("gregtechmod.api.items.GT_EnergyStoreIC_Item")
+ .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aCharge, aTransfer, aTier, aEmptyID, aFullID);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ try {
+ return (Item) Class.forName("gregtechmod.api.items.GT_EnergyStore_Item")
+ .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aCharge, aTransfer, aTier, aEmptyID, aFullID);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return new gregtech.api.items.GT_Generic_Item(
+ aUnlocalized,
+ aEnglish,
+ "Doesn't work as intended, this is a Bug");
+ }
+
+ /**
+ * Creates a new Hard Hammer Item
+ */
+ public static GT_Tool_Item constructHardHammerItem(String aUnlocalized, String aEnglish, int aMaxDamage,
+ int aEntityDamage) {
+ try {
+ return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_HardHammer_Item")
+ .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return new gregtech.api.items.GT_Tool_Item(
+ aUnlocalized,
+ aEnglish,
+ "Doesn't work as intended, this is a Bug",
+ aMaxDamage,
+ aEntityDamage,
+ false);
+ }
+
+ /**
+ * Creates a new Crowbar Item
+ */
+ public static GT_Tool_Item constructCrowbarItem(String aUnlocalized, String aEnglish, int aMaxDamage,
+ int aEntityDamage) {
+ try {
+ return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_CrowbarRC_Item")
+ .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ try {
+ return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_Crowbar_Item")
+ .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return new gregtech.api.items.GT_Tool_Item(
+ aUnlocalized,
+ aEnglish,
+ "Doesn't work as intended, this is a Bug",
+ aMaxDamage,
+ aEntityDamage,
+ false);
+ }
+
+ /**
+ * Creates a new Wrench Item
+ */
+ public static GT_Tool_Item constructWrenchItem(String aUnlocalized, String aEnglish, int aMaxDamage,
+ int aEntityDamage, int aDisChargedGTID) {
+ try {
+ return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_Wrench_Item")
+ .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage, aDisChargedGTID);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return new gregtech.api.items.GT_Tool_Item(
+ aUnlocalized,
+ aEnglish,
+ "Doesn't work as intended, this is a Bug",
+ aMaxDamage,
+ aEntityDamage,
+ false);
+ }
+
+ /**
+ * Creates a new electric Screwdriver Item
+ */
+ public static GT_Tool_Item constructElectricScrewdriverItem(String aUnlocalized, String aEnglish, int aMaxDamage,
+ int aEntityDamage, int aDisChargedGTID) {
+ try {
+ return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_ScrewdriverIC_Item")
+ .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage, aDisChargedGTID);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return new gregtech.api.items.GT_Tool_Item(
+ aUnlocalized,
+ aEnglish,
+ "Doesn't work as intended, this is a Bug",
+ aMaxDamage,
+ aEntityDamage,
+ false);
+ }
+
+ /**
+ * Creates a new electric Wrench Item
+ */
+ public static GT_Tool_Item constructElectricWrenchItem(String aUnlocalized, String aEnglish, int aMaxDamage,
+ int aEntityDamage, int aDisChargedGTID) {
+ try {
+ return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_WrenchIC_Item")
+ .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage, aDisChargedGTID);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return new gregtech.api.items.GT_Tool_Item(
+ aUnlocalized,
+ aEnglish,
+ "Doesn't work as intended, this is a Bug",
+ aMaxDamage,
+ aEntityDamage,
+ false);
+ }
+
+ /**
+ * Creates a new electric Saw Item
+ */
+ public static GT_Tool_Item constructElectricSawItem(String aUnlocalized, String aEnglish, int aMaxDamage,
+ int aEntityDamage, int aToolQuality, float aToolStrength, int aEnergyConsumptionPerBlockBreak,
+ int aDisChargedGTID) {
+ try {
+ return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_SawIC_Item")
+ .getConstructors()[0].newInstance(
+ aUnlocalized,
+ aEnglish,
+ aMaxDamage,
+ aEntityDamage,
+ aToolQuality,
+ aToolStrength,
+ aEnergyConsumptionPerBlockBreak,
+ aDisChargedGTID);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return new gregtech.api.items.GT_Tool_Item(
+ aUnlocalized,
+ aEnglish,
+ "Doesn't work as intended, this is a Bug",
+ aMaxDamage,
+ aEntityDamage,
+ false);
+ }
+
+ /**
+ * Creates a new electric Drill Item
+ */
+ public static GT_Tool_Item constructElectricDrillItem(String aUnlocalized, String aEnglish, int aMaxDamage,
+ int aEntityDamage, int aToolQuality, float aToolStrength, int aEnergyConsumptionPerBlockBreak,
+ int aDisChargedGTID) {
+ try {
+ return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_DrillIC_Item")
+ .getConstructors()[0].newInstance(
+ aUnlocalized,
+ aEnglish,
+ aMaxDamage,
+ aEntityDamage,
+ aToolQuality,
+ aToolStrength,
+ aEnergyConsumptionPerBlockBreak,
+ aDisChargedGTID);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return new gregtech.api.items.GT_Tool_Item(
+ aUnlocalized,
+ aEnglish,
+ "Doesn't work as intended, this is a Bug",
+ aMaxDamage,
+ aEntityDamage,
+ false);
+ }
+
+ /**
+ * Creates a new electric Soldering Tool
+ */
+ public static GT_Tool_Item constructElectricSolderingToolItem(String aUnlocalized, String aEnglish, int aMaxDamage,
+ int aEntityDamage, int aDisChargedGTID) {
+ try {
+ return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_SolderingToolIC_Item")
+ .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aEntityDamage, aDisChargedGTID);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return new gregtech.api.items.GT_Tool_Item(
+ aUnlocalized,
+ aEnglish,
+ "Doesn't work as intended, this is a Bug",
+ aMaxDamage,
+ aEntityDamage,
+ false);
+ }
+
+ /**
+ * Creates a new empty electric Tool
+ */
+ public static GT_Tool_Item constructEmptyElectricToolItem(String aUnlocalized, String aEnglish, int aMaxDamage,
+ int aChargedGTID) {
+ try {
+ return (GT_Tool_Item) Class.forName("gregtechmod.api.items.GT_EmptyToolIC_Item")
+ .getConstructors()[0].newInstance(aUnlocalized, aEnglish, aMaxDamage, aChargedGTID);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return new gregtech.api.items.GT_Tool_Item(
+ aUnlocalized,
+ aEnglish,
+ "Doesn't work as intended, this is a Bug",
+ aMaxDamage,
+ 0,
+ false);
+ }
+
+ /**
+ * Provides a new BaseMetaTileEntity. Because some interfaces are not always loaded (Buildcraft, Universal
+ * Electricity) we have to use invocation at the constructor of the BaseMetaTileEntity.
+ */
+ public static BaseMetaTileEntity constructBaseMetaTileEntity() {
+ if (sBaseMetaTileEntityClass == null) {
+ try {
+ return (sBaseMetaTileEntityClass = BaseMetaTileEntity.class).getDeclaredConstructor()
+ .newInstance();
+ } catch (Throwable ignored) {}
+ }
+
+ try {
+ return sBaseMetaTileEntityClass.getDeclaredConstructor()
+ .newInstance();
+ } catch (Throwable e) {
+ GT_Log.err.println("GT_Mod: Fatal Error occurred while initializing TileEntities, crashing Minecraft.");
+ e.printStackTrace(GT_Log.err);
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Register a new ItemStack as configuration circuits. Duplicates or invalid stacks will be silently ignored.
+ */
+ public static void registerConfigurationCircuit(ItemStack aStack) {
+ registerConfigurationCircuit(aStack, 0);
+ }
+
+ /**
+ * Register a new ItemStack as configuration circuits. Duplicates or invalid stacks will be silently ignored.
+ *
+ * @param minTier the minimal tier this circuit can be offered for free, e.g. normal configuration circuit is
+ * available in LV+ single blocks, GT++ breakthrough circuit is offered in HV+ single blocks
+ */
+ public static void registerConfigurationCircuit(ItemStack aStack, int minTier) {
+ if (GT_Utility.isStackInvalid(aStack)) return;
+ for (ItemStack tRegistered : sRealConfigurationList.values())
+ if (GT_Utility.areStacksEqual(tRegistered, aStack)) return;
+ ItemStack stack = GT_Utility.copyAmount(0, aStack);
+ sRealConfigurationList.put(minTier, stack);
+ for (Map.Entry<Integer, List<ItemStack>> e : sConfigurationLists.entrySet()) {
+ if (e.getKey() >= minTier) {
+ e.getValue()
+ .add(stack);
+ e.getValue()
+ .sort(getConfigurationCircuitsComparator());
+ }
+ }
+ }
+
+ /**
+ * Get a list of Configuration circuits. These stacks will have a stack size of 0. Use
+ * {@link #registerConfigurationCircuit(ItemStack, int)} or its overload to add to this list.
+ *
+ * @param machineTier The voltage tier where this list will be used. use Integer.MAX_VALUE to get all circuits
+ * @return An unmodifiable view of actual list. DO NOT MODIFY THE ItemStacks!
+ */
+ public static List<ItemStack> getConfigurationCircuitList(int machineTier) {
+ return Collections.unmodifiableList(
+ sConfigurationLists.computeIfAbsent(
+ machineTier,
+ (t) -> sRealConfigurationList.entries()
+ .stream()
+ .filter(e -> e.getKey() <= machineTier)
+ .map(Map.Entry::getValue)
+ .sorted(getConfigurationCircuitsComparator())
+ .collect(Collectors.toList())));
+ }
+
+ public static Comparator<ItemStack> getConfigurationCircuitsComparator() {
+ return Comparator.comparingInt((ItemStack is) -> {
+ // By default, the Programmed Circuit should be the earliest configuration circuit to which the
+ // player is exposed
+ if (GT_Mod.gregtechproxy.mCircuitsOrder.isEmpty())
+ return is.getItem() instanceof GT_IntegratedCircuit_Item ? 0 : 1;
+ return GT_Mod.gregtechproxy.mCircuitsOrder
+ .getOrDefault(String.valueOf(GameRegistry.findUniqueIdentifierFor(is.getItem())), Integer.MAX_VALUE);
+ })
+ .thenComparing(ItemStack::getUnlocalizedName)
+ .thenComparing(ItemStack::getItemDamage);
+ }
+
+ public static void registerCircuitProgrammer(ItemStack stack, boolean ignoreNBT, boolean useContainer) {
+ registerCircuitProgrammer(rhs -> GT_Utility.areStacksEqual(stack, rhs, ignoreNBT), useContainer);
+ }
+
+ public static void registerCircuitProgrammer(Predicate<ItemStack> predicate, boolean useContainer) {
+ sRealCircuitProgrammerList.put(
+ predicate,
+ useContainer ? (s, p) -> s.getItem()
+ .getContainerItem(s) : (s, p) -> s);
+ }
+
+ public static void registerCircuitProgrammer(Predicate<ItemStack> predicate,
+ BiFunction<ItemStack, EntityPlayerMP, ItemStack> doDamage) {
+ sRealCircuitProgrammerList.put(predicate, doDamage);
+ }
+
+ public static void registerCover(ItemStack aStack, ITexture aCover, GT_CoverBehavior aBehavior) {
+ registerCover(aStack, aCover, (GT_CoverBehaviorBase<?>) aBehavior);
+ }
+
+ public static void registerCover(ItemStack aStack, ITexture aCover, GT_CoverBehaviorBase<?> aBehavior) {
+ if (!sCovers.containsKey(new GT_ItemStack(aStack))) sCovers.put(
+ new GT_ItemStack(aStack),
+ aCover == null || !aCover.isValidTexture() ? Textures.BlockIcons.ERROR_RENDERING[0] : aCover);
+ if (aBehavior != null) sCoverBehaviors.put(new GT_ItemStack(aStack), aBehavior);
+ }
+
+ public static void registerCoverBehavior(ItemStack aStack, GT_CoverBehavior aBehavior) {
+ registerCoverBehavior(aStack, (GT_CoverBehaviorBase<?>) aBehavior);
+ }
+
+ public static void registerCoverBehavior(ItemStack aStack, GT_CoverBehaviorBase<?> aBehavior) {
+ sCoverBehaviors.put(new GT_ItemStack(aStack), aBehavior == null ? sDefaultBehavior : aBehavior);
+ }
+
+ /**
+ * Registers multiple Cover Items. I use that for the OreDict Functionality.
+ *
+ * @param aBehavior can be null
+ */
+ public static void registerCover(Collection<ItemStack> aStackList, ITexture aCover, GT_CoverBehavior aBehavior) {
+ registerCover(aStackList, aCover, (GT_CoverBehaviorBase<?>) aBehavior);
+ }
+
+ /**
+ * Registers multiple Cover Items. I use that for the OreDict Functionality.
+ *
+ * @param aBehavior can be null
+ */
+ public static void registerCover(Collection<ItemStack> aStackList, ITexture aCover,
+ GT_CoverBehaviorBase<?> aBehavior) {
+ if (aCover.isValidTexture())
+ aStackList.forEach(tStack -> GregTech_API.registerCover(tStack, aCover, aBehavior));
+ }
+
+ /**
+ * returns a Cover behavior, guaranteed to not return null after preload
+ */
+ @Deprecated
+ public static GT_CoverBehavior getCoverBehavior(ItemStack aStack) {
+ if (aStack == null || aStack.getItem() == null) return sNoBehavior;
+ GT_CoverBehaviorBase<?> rCover = sCoverBehaviors.get(new GT_ItemStack(aStack));
+ if (!(rCover instanceof GT_CoverBehavior)) return sDefaultBehavior;
+ return (GT_CoverBehavior) rCover;
+ }
+
+ /**
+ * returns a Cover behavior, guaranteed to not return null after preload
+ *
+ * @return The Cover behavior
+ */
+ public static GT_CoverBehaviorBase<?> getCoverBehaviorNew(ItemStack aStack) {
+ if (aStack == null || aStack.getItem() == null) return sNoBehavior;
+ GT_CoverBehaviorBase<?> rCover = sCoverBehaviors.get(new GT_ItemStack(aStack));
+ if (rCover != null) return rCover;
+ rCover = sCoverBehaviors.get(new GT_ItemStack(aStack, true));
+ if (rCover != null) return rCover;
+ return sDefaultBehavior;
+ }
+
+ /**
+ * returns a Cover behavior, guaranteed to not return null
+ */
+ @Deprecated
+ public static GT_CoverBehavior getCoverBehavior(int aStack) {
+ if (aStack == 0) return sNoBehavior;
+ return getCoverBehavior(GT_Utility.intToStack(aStack));
+ }
+
+ /**
+ * returns a Cover behavior, guaranteed to not return null
+ */
+ public static GT_CoverBehaviorBase<?> getCoverBehaviorNew(int aStack) {
+ if (aStack == 0) return sNoBehavior;
+ return getCoverBehaviorNew(GT_Utility.intToStack(aStack));
+ }
+
+ /**
+ * Register a Wrench to be usable on GregTech Machines. The Wrench MUST have some kind of Durability unlike certain
+ * Buildcraft Wrenches.
+ * <p/>
+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in
+ * certain Cases during postload (When IToolWrench or similar Interfaces are implemented).
+ * <p/>
+ * -----
+ * <p/>
+ * Returning true at isDamageable was a great Idea, KingLemming. Well played. Since the OmniWrench is just a
+ * Single-Item-Mod, people can choose if they want your infinite durability or not. So that's not really a Problem.
+ * I even have a new Config to auto-disable most infinite BC Wrenches (but that one is turned off).
+ * <p/>
+ * One last Bug for you to fix: My Auto-registration detects Railcraft's Crowbars, Buildcraft's Wrenches and alike,
+ * due to their Interfaces. Guess what now became a Crowbar by accident. Try registering the Wrench at the load
+ * phase to prevent things like that from happening. Yes, I know that "You need to register Tools in the Load
+ * Phase"-Part wasn't there before this. Sorry about that.
+ */
+ public static boolean registerWrench(ItemStack aTool) {
+ return registerTool(aTool, sWrenchList);
+ }
+
+ /**
+ * Register a Crowbar to extract Covers from Machines Crowbars are NOT Wrenches btw.
+ * <p/>
+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in
+ * certain Cases during postload (When IToolWrench or similar Interfaces are implemented).
+ */
+ public static boolean registerCrowbar(ItemStack aTool) {
+ return registerTool(aTool, sCrowbarList);
+ }
+
+ /**
+ * Register a Screwdriver to interact directly with Machines and Covers Did I mention, that it is intentionally not
+ * possible to make a Multi-tool, which doesn't switch ItemID (like a Mode) all the time?
+ * <p/>
+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in
+ * certain Cases during postload (When IToolWrench or similar Interfaces are implemented).
+ */
+ @SuppressWarnings("UnusedReturnValue") // Retains API method signature
+ public static boolean registerScrewdriver(ItemStack aTool) {
+ return registerTool(aTool, sScrewdriverList);
+ }
+
+ /**
+ * Register a Soft Hammer to interact with Machines
+ * <p/>
+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in
+ * certain Cases during postload (When IToolWrench or similar Interfaces are implemented).
+ */
+ public static boolean registerSoftHammer(ItemStack aTool) {
+ return registerTool(aTool, sSoftHammerList);
+ }
+
+ /**
+ * Register a Hard Hammer to interact with Machines
+ * <p/>
+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in
+ * certain Cases during postload (When IToolWrench or similar Interfaces are implemented).
+ */
+ public static boolean registerHardHammer(ItemStack aTool) {
+ return registerTool(aTool, sHardHammerList);
+ }
+
+ /**
+ * Register a Wire Cutter to interact with Machines
+ * <p/>
+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in
+ * certain Cases during postload (When IToolWrench or similar Interfaces are implemented).
+ */
+ public static boolean registerWireCutter(ItemStack aTool) {
+ return registerTool(aTool, sWireCutterList);
+ }
+
+ /**
+ * Register a Soldering Tool to interact with Machines
+ * <p/>
+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in
+ * certain Cases during postload (When IToolWrench or similar Interfaces are implemented).
+ */
+ @SuppressWarnings("UnusedReturnValue") // Retains API method signature
+ public static boolean registerSolderingTool(ItemStack aTool) {
+ return registerTool(aTool, sSolderingToolList);
+ }
+
+ /**
+ * Register a Soldering Tin to interact with Soldering Tools
+ * <p/>
+ * You need to register Tools in the Load Phase, because otherwise the Auto-detection will assign a Tool Type in
+ * certain Cases during postload (When IToolWrench or similar Interfaces are implemented).
+ */
+ @SuppressWarnings("UnusedReturnValue") // Retains API method signature
+ public static boolean registerSolderingMetal(ItemStack aTool) {
+ return registerTool(aTool, sSolderingMetalList);
+ }
+
+ /**
+ * Generic Function to add Tools to the Lists. Contains all sanity Checks for Tools, like preventing one Tool from
+ * being registered for multiple purposes as controls would override each other.
+ */
+ public static boolean registerTool(ItemStack aTool, Collection<GT_ItemStack> aToolList) {
+ if (aTool == null || GT_Utility.isStackInList(aTool, sToolList)
+ || (!aTool.getItem()
+ .isDamageable() && !GT_ModHandler.isElectricItem(aTool)
+ && !(aTool.getItem() instanceof IDamagableItem)))
+ return false;
+ aToolList.add(new GT_ItemStack(GT_Utility.copyAmount(1, aTool)));
+ sToolList.add(new GT_ItemStack(GT_Utility.copyAmount(1, aTool)));
+ return true;
+ }
+
+ /**
+ * Sets the {@link IIconRegister} for Block Icons
+ *
+ * @param aIconRegister The {@link IIconRegister} Icon Register
+ */
+ @SideOnly(Side.CLIENT)
+ public static void setBlockIconRegister(IIconRegister aIconRegister) {
+ sBlockIcons = aIconRegister;
+ }
+
+ /**
+ * Sets the {@link IIconRegister} for Items Icons
+ *
+ * @param aIconRegister The {@link IIconRegister} Icon Register
+ */
+ @SideOnly(Side.CLIENT)
+ public static void setItemIconRegister(IIconRegister aIconRegister) {
+ GregTech_API.sItemIcons = aIconRegister;
+ }
+
+ public static void registerTileEntityConstructor(int meta, IntFunction<TileEntity> constructor) {
+ if (meta < 0 || meta > 15 || constructor == null) throw new IllegalArgumentException();
+ if (teCreators[meta] != null) throw new IllegalStateException(
+ "previous constructor: " + teCreators[meta] + " new constructor: " + constructor + " meta:" + meta);
+ teCreators[meta] = constructor;
+ }
+
+ public static TileEntity createTileEntity(int meta) {
+ meta = GT_Utility.clamp(meta, 0, 15);
+ if (teCreators[meta] == null) return null;
+ return teCreators[meta].apply(meta);
+ }
+}
diff --git a/src/main/java/gregtech/api/damagesources/GT_DamageSources.java b/src/main/java/gregtech/api/damagesources/GT_DamageSources.java
new file mode 100644
index 0000000000..65a2519001
--- /dev/null
+++ b/src/main/java/gregtech/api/damagesources/GT_DamageSources.java
@@ -0,0 +1,119 @@
+package gregtech.api.damagesources;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.EntityDamageSource;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+public class GT_DamageSources {
+
+ public static DamageSource getElectricDamage() {
+ return ic2.api.info.Info.DMG_ELECTRIC;
+ }
+
+ public static DamageSource getRadioactiveDamage() {
+ return ic2.api.info.Info.DMG_RADIATION;
+ }
+
+ public static DamageSource getNukeExplosionDamage() {
+ return ic2.api.info.Info.DMG_NUKE_EXPLOSION;
+ }
+
+ public static DamageSource getExplodingDamage() {
+ return new DamageSourceExploding();
+ }
+
+ public static DamageSource getCombatDamage(String aType, EntityLivingBase aPlayer, IChatComponent aDeathMessage) {
+ return new DamageSourceCombat(aType, aPlayer, aDeathMessage);
+ }
+
+ public static DamageSource getHeatDamage() {
+ return new DamageSourceHeat();
+ }
+
+ public static DamageSource getFrostDamage() {
+ return new DamageSourceFrost();
+ }
+
+ private static class DamageSourceCombat extends EntityDamageSource {
+
+ private final IChatComponent mDeathMessage;
+
+ public DamageSourceCombat(String aType, EntityLivingBase aPlayer, IChatComponent aDeathMessage) {
+ super(aType, aPlayer);
+ mDeathMessage = aDeathMessage;
+ }
+
+ @Override
+ public IChatComponent func_151519_b(EntityLivingBase aTarget) {
+ return mDeathMessage == null ? super.func_151519_b(aTarget) : mDeathMessage;
+ }
+ }
+
+ private static class DamageSourceFrost extends DamageSource {
+
+ public DamageSourceFrost() {
+ super("frost");
+ setDifficultyScaled();
+ }
+
+ @Override
+ public IChatComponent func_151519_b(EntityLivingBase aTarget) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aTarget.getCommandSenderName() + EnumChatFormatting.WHITE + " got frozen");
+ }
+ }
+
+ private static class DamageSourceHeat extends DamageSource {
+
+ public DamageSourceHeat() {
+ super("steam");
+ setFireDamage();
+ setDifficultyScaled();
+ }
+
+ @Override
+ public IChatComponent func_151519_b(EntityLivingBase aTarget) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aTarget.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " was boiled alive");
+ }
+ }
+
+ public static class DamageSourceHotItem extends DamageSourceHeat {
+
+ @Nullable
+ private final ItemStack stack;
+
+ public DamageSourceHotItem(@Nullable ItemStack cause) {
+ this.stack = cause;
+ }
+
+ @Nullable
+ public ItemStack getDamagingStack() {
+ return stack;
+ }
+ }
+
+ public static class DamageSourceExploding extends DamageSource {
+
+ public DamageSourceExploding() {
+ super("exploded");
+ setDamageAllowedInCreativeMode();
+ setDamageBypassesArmor();
+ setDamageIsAbsolute();
+ }
+
+ @Override
+ public IChatComponent func_151519_b(EntityLivingBase aTarget) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aTarget.getCommandSenderName() + EnumChatFormatting.WHITE + " exploded");
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/enchants/Enchantment_EnderDamage.java b/src/main/java/gregtech/api/enchants/Enchantment_EnderDamage.java
new file mode 100644
index 0000000000..07c13b3509
--- /dev/null
+++ b/src/main/java/gregtech/api/enchants/Enchantment_EnderDamage.java
@@ -0,0 +1,72 @@
+package gregtech.api.enchants;
+
+import net.minecraft.enchantment.EnchantmentDamage;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.boss.EntityDragon;
+import net.minecraft.entity.monster.EntityEnderman;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_LanguageManager;
+
+public class Enchantment_EnderDamage extends EnchantmentDamage {
+
+ public static Enchantment_EnderDamage INSTANCE;
+
+ public Enchantment_EnderDamage() {
+ super(GT_Config.addIDConfig(ConfigCategories.IDs.enchantments, "Disjunction", 15), 2, -1);
+ GT_LanguageManager.addStringLocalization(getName(), "Disjunction");
+ Materials.Silver.setEnchantmentForTools(this, 2);
+ Materials.Mercury.setEnchantmentForTools(this, 3);
+ Materials.Electrum.setEnchantmentForTools(this, 3);
+ Materials.SterlingSilver.setEnchantmentForTools(this, 4);
+ Materials.AstralSilver.setEnchantmentForTools(this, 5);
+ INSTANCE = this;
+ }
+
+ @Override
+ public int getMinEnchantability(int aLevel) {
+ return 5 + (aLevel - 1) * 8;
+ }
+
+ @Override
+ public int getMaxEnchantability(int aLevel) {
+ return this.getMinEnchantability(aLevel) + 20;
+ }
+
+ @Override
+ public int getMaxLevel() {
+ return 5;
+ }
+
+ @Override
+ public void func_151367_b(EntityLivingBase aHurtEntity, Entity aDamagingEntity, int aLevel) {
+ if ((aHurtEntity instanceof EntityEnderman || aHurtEntity instanceof EntityDragon
+ || (aHurtEntity.getClass()
+ .getName()
+ .contains(".")
+ && aHurtEntity.getClass()
+ .getName()
+ .substring(
+ aHurtEntity.getClass()
+ .getName()
+ .lastIndexOf("."))
+ .contains("Ender")))) {
+ // Weakness causes Endermen to not be able to teleport with GT being installed.
+ aHurtEntity
+ .addPotionEffect(new PotionEffect(Potion.weakness.id, aLevel * 200, Math.max(1, (5 * aLevel) / 7)));
+ // They also get Poisoned. If you have this Enchant on an Arrow, you can kill the Ender Dragon easier.
+ aHurtEntity
+ .addPotionEffect(new PotionEffect(Potion.poison.id, aLevel * 200, Math.max(1, (5 * aLevel) / 7)));
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "enchantment.damage.endermen";
+ }
+}
diff --git a/src/main/java/gregtech/api/enchants/Enchantment_Hazmat.java b/src/main/java/gregtech/api/enchants/Enchantment_Hazmat.java
new file mode 100644
index 0000000000..ecbe654698
--- /dev/null
+++ b/src/main/java/gregtech/api/enchants/Enchantment_Hazmat.java
@@ -0,0 +1,56 @@
+package gregtech.api.enchants;
+
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnumEnchantmentType;
+import net.minecraft.item.ItemArmor;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_LanguageManager;
+
+public class Enchantment_Hazmat extends Enchantment {
+
+ public static Enchantment_Hazmat INSTANCE;
+
+ public Enchantment_Hazmat() {
+ super(GT_Config.addIDConfig(ConfigCategories.IDs.enchantments, "Hazmat", 13), 0, EnumEnchantmentType.armor);
+ GT_LanguageManager.addStringLocalization(getName(), "Hazmat");
+ INSTANCE = this;
+ }
+
+ @Override
+ public int getMinEnchantability(int aLevel) {
+ return 50;
+ }
+
+ @Override
+ public int getMaxEnchantability(int aLevel) {
+ return 100;
+ }
+
+ @Override
+ public int getMaxLevel() {
+ return 1;
+ }
+
+ @Override
+ public boolean canApply(ItemStack aStack) {
+ return aStack != null && (aStack.getItem() instanceof ItemArmor);
+ }
+
+ @Override
+ public boolean canApplyAtEnchantingTable(ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public boolean isAllowedOnBooks() {
+ return false;
+ }
+
+ @Override
+ public String getName() {
+ return "enchantment.protection.hazmat";
+ }
+}
diff --git a/src/main/java/gregtech/api/enchants/Enchantment_Radioactivity.java b/src/main/java/gregtech/api/enchants/Enchantment_Radioactivity.java
new file mode 100644
index 0000000000..e68e55cd6a
--- /dev/null
+++ b/src/main/java/gregtech/api/enchants/Enchantment_Radioactivity.java
@@ -0,0 +1,68 @@
+package gregtech.api.enchants;
+
+import net.minecraft.enchantment.EnchantmentDamage;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+
+public class Enchantment_Radioactivity extends EnchantmentDamage {
+
+ public static Enchantment_Radioactivity INSTANCE;
+
+ public Enchantment_Radioactivity() {
+ super(GT_Config.addIDConfig(ConfigCategories.IDs.enchantments, "Radioactivity", 14), 0, -1);
+ GT_LanguageManager.addStringLocalization(getName(), "Radioactivity");
+ Materials.Plutonium.setEnchantmentForTools(this, 1)
+ .setEnchantmentForArmors(this, 1);
+ Materials.Uranium235.setEnchantmentForTools(this, 2)
+ .setEnchantmentForArmors(this, 2);
+ Materials.Plutonium241.setEnchantmentForTools(this, 3)
+ .setEnchantmentForArmors(this, 3);
+ Materials.NaquadahEnriched.setEnchantmentForTools(this, 4)
+ .setEnchantmentForArmors(this, 4);
+ Materials.Naquadria.setEnchantmentForTools(this, 5)
+ .setEnchantmentForArmors(this, 5);
+ INSTANCE = this;
+ }
+
+ @Override
+ public int getMinEnchantability(int aLevel) {
+ return Integer.MAX_VALUE;
+ }
+
+ @Override
+ public int getMaxEnchantability(int aLevel) {
+ return 0;
+ }
+
+ @Override
+ public int getMaxLevel() {
+ return 5;
+ }
+
+ @Override
+ public boolean canApply(ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public boolean isAllowedOnBooks() {
+ return false;
+ }
+
+ @Override
+ public void func_151367_b(EntityLivingBase aHurtEntity, Entity aDamagingEntity, int aLevel) {
+ GT_Utility.applyRadioactivity(aHurtEntity, aLevel, 1);
+ }
+
+ @Override
+ public String getName() {
+ return "enchantment.damage.radioactivity";
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/ConfigCategories.java b/src/main/java/gregtech/api/enums/ConfigCategories.java
new file mode 100644
index 0000000000..83deec4f58
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/ConfigCategories.java
@@ -0,0 +1,65 @@
+package gregtech.api.enums;
+
+public enum ConfigCategories {
+
+ news,
+ general,
+ machineconfig,
+ specialunificationtargets;
+
+ public enum IDs {
+ crops,
+ enchantments
+ }
+
+ public enum Materials {
+ heatdamage,
+ oreprocessingoutputmultiplier,
+ blastfurnacerequirements,
+ blastinductionsmelter,
+ }
+
+ public enum Recipes {
+ harderrecipes,
+ gregtechrecipes,
+ disabledrecipes,
+ recipereplacements,
+ storageblockcrafting,
+ storageblockdecrafting
+ }
+
+ public enum Machines {
+ smelting,
+ squeezer,
+ liquidtransposer,
+ liquidtransposerfilling,
+ liquidtransposeremptying,
+ extractor,
+ sawmill,
+ compression,
+ thermalcentrifuge,
+ orewashing,
+ inductionsmelter,
+ rcblastfurnace,
+ scrapboxdrops,
+ massfabamplifier,
+ maceration,
+ rockcrushing,
+ pulverization
+ }
+
+ public enum Fuels {
+ boilerfuels
+ }
+
+ public enum Tools {
+ mortar,
+ hammerplating,
+ hammermultiingot,
+ hammerdoubleplate,
+ hammertripleplate,
+ hammerquadrupleplate,
+ hammerquintupleplate,
+ scoop
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/Dyes.java b/src/main/java/gregtech/api/enums/Dyes.java
new file mode 100644
index 0000000000..3f1bc31c21
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/Dyes.java
@@ -0,0 +1,126 @@
+package gregtech.api.enums;
+
+import java.util.ArrayList;
+
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.interfaces.IColorModulationContainer;
+import gregtech.api.objects.GT_ArrayList;
+import gregtech.api.util.GT_Utility;
+
+public enum Dyes implements IColorModulationContainer {
+
+ /**
+ * The valid Colors, see VALUES Array below
+ */
+ dyeBlack(0, 32, 32, 32, "Black", EnumChatFormatting.BLACK),
+ dyeRed(1, 255, 0, 0, "Red", EnumChatFormatting.RED),
+ dyeGreen(2, 0, 255, 0, "Green", EnumChatFormatting.DARK_GREEN),
+ dyeBrown(3, 96, 64, 0, "Brown", EnumChatFormatting.GOLD),
+ dyeBlue(4, 0, 32, 255, "Blue", EnumChatFormatting.DARK_BLUE),
+ dyePurple(5, 128, 0, 128, "Purple", EnumChatFormatting.DARK_PURPLE),
+ dyeCyan(6, 0, 255, 255, "Cyan", EnumChatFormatting.DARK_AQUA),
+ dyeLightGray(7, 192, 192, 192, "Light Gray", EnumChatFormatting.GRAY),
+ dyeGray(8, 128, 128, 128, "Gray", EnumChatFormatting.DARK_GRAY),
+ dyePink(9, 255, 192, 192, "Pink", EnumChatFormatting.LIGHT_PURPLE),
+ dyeLime(10, 128, 255, 128, "Lime", EnumChatFormatting.GREEN),
+ dyeYellow(11, 255, 255, 0, "Yellow", EnumChatFormatting.YELLOW),
+ dyeLightBlue(12, 96, 128, 255, "Light Blue", EnumChatFormatting.AQUA),
+ dyeMagenta(13, 255, 0, 255, "Magenta", EnumChatFormatting.LIGHT_PURPLE),
+ dyeOrange(14, 255, 128, 0, "Orange", EnumChatFormatting.GOLD),
+ dyeWhite(15, 255, 255, 255, "White", EnumChatFormatting.WHITE),
+ /**
+ * The NULL Color
+ */
+ _NULL(-1, 255, 255, 255, "INVALID COLOR"),
+ /**
+ * Additional Colors only used for direct Color referencing
+ */
+ CABLE_INSULATION(-1, 64, 64, 64, "Cable Insulation"),
+ CONSTRUCTION_FOAM(-1, 64, 64, 64, "Construction Foam"),
+ MACHINE_METAL(-1, 210, 220, 255, "Machine Metal");
+
+ public static final Dyes[] VALUES = { dyeBlack, dyeRed, dyeGreen, dyeBrown, dyeBlue, dyePurple, dyeCyan,
+ dyeLightGray, dyeGray, dyePink, dyeLime, dyeYellow, dyeLightBlue, dyeMagenta, dyeOrange, dyeWhite };
+
+ public final byte mIndex;
+ public final String mName;
+ public final short[] mRGBa;
+ public final short[] mOriginalRGBa;
+ public final EnumChatFormatting formatting;
+ private final ArrayList<Fluid> mFluidDyes = new GT_ArrayList<>(false, 1);
+
+ Dyes(int aIndex, int aR, int aG, int aB, String aName) {
+ this(aIndex, aR, aG, aB, aName, EnumChatFormatting.GRAY);
+ }
+
+ Dyes(int aIndex, int aR, int aG, int aB, String aName, EnumChatFormatting formatting) {
+ mIndex = (byte) aIndex;
+ mName = aName;
+ mRGBa = new short[] { (short) aR, (short) aG, (short) aB, 0 };
+ mOriginalRGBa = mRGBa.clone();
+ this.formatting = formatting;
+ }
+
+ public static Dyes get(int aColor) {
+ if (aColor >= 0 && aColor < 16) return VALUES[aColor];
+ return _NULL;
+ }
+
+ public static short[] getModulation(int aColor, short[] aDefaultModulation) {
+ if (aColor >= 0 && aColor < 16) return VALUES[aColor].mRGBa;
+ return aDefaultModulation;
+ }
+
+ public static Dyes get(String aColor) {
+ Object tObject = GT_Utility.getFieldContent(Dyes.class, aColor, false, false);
+ if (tObject instanceof Dyes) return (Dyes) tObject;
+ return _NULL;
+ }
+
+ public static boolean isAnyFluidDye(FluidStack aFluid) {
+ return aFluid != null && isAnyFluidDye(aFluid.getFluid());
+ }
+
+ public static boolean isAnyFluidDye(Fluid aFluid) {
+ if (aFluid != null) for (Dyes tDye : VALUES) if (tDye.isFluidDye(aFluid)) return true;
+ return false;
+ }
+
+ public boolean isFluidDye(FluidStack aFluid) {
+ return aFluid != null && isFluidDye(aFluid.getFluid());
+ }
+
+ public boolean isFluidDye(Fluid aFluid) {
+ return aFluid != null && mFluidDyes.contains(aFluid);
+ }
+
+ public boolean addFluidDye(Fluid aDye) {
+ if (aDye == null || mFluidDyes.contains(aDye)) return false;
+ mFluidDyes.add(aDye);
+ return true;
+ }
+
+ public int getSizeOfFluidList() {
+ return mFluidDyes.size();
+ }
+
+ /**
+ * @param aAmount 1 Fluid Material Unit (144) = 1 Dye Item
+ */
+ public FluidStack getFluidDye(int aIndex, long aAmount) {
+ if (aIndex >= mFluidDyes.size() || aIndex < 0) return null;
+ return new FluidStack(mFluidDyes.get(aIndex), (int) aAmount);
+ }
+
+ @Override
+ public short[] getRGBA() {
+ return mRGBa;
+ }
+
+ public static Dyes getDyeFromIndex(short index) {
+ return index != -1 ? Dyes.get(index) : Dyes.MACHINE_METAL;
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/Element.java b/src/main/java/gregtech/api/enums/Element.java
new file mode 100644
index 0000000000..0931663b0b
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/Element.java
@@ -0,0 +1,341 @@
+package gregtech.api.enums;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+/**
+ * This is some kind of Periodic Table, which I use to determine Properties of the Materials.
+ */
+public enum Element {
+
+ _NULL(0, 0, 0, -1, null, "", false),
+ H(1, 0, 0, -1, null, "Hydrogen", false),
+ D(1, 1, 0, -1, "H", "Deuterium", true),
+ T(1, 2, 0, -1, "D", "Tritium", true),
+ He(2, 2, 0, -1, null, "Helium", false),
+ He_3(2, 1, 0, -1, "H&D", "Helium-3", true),
+ Li(3, 4, 0, -1, null, "Lithium", false),
+ Be(4, 5, 0, -1, null, "Beryllium", false),
+ B(5, 5, 0, -1, null, "Boron", false),
+ C(6, 6, 0, -1, null, "Carbon", false),
+ N(7, 7, 0, -1, null, "Nitrogen", false),
+ O(8, 8, 0, -1, null, "Oxygen", false),
+ F(9, 9, 0, -1, null, "Fluorine", false),
+ Ne(10, 10, 0, -1, null, "Neon", false),
+ Na(11, 11, 0, -1, null, "Sodium", false),
+ Mg(12, 12, 0, -1, null, "Magnesium", false),
+ Al(13, 13, 0, -1, null, "Aluminium", false),
+ Si(14, 14, 0, -1, null, "Silicon", false),
+ P(15, 15, 0, -1, null, "Phosphorus", false),
+ S(16, 16, 0, -1, null, "Sulfur", false),
+ Cl(17, 18, 0, -1, null, "Chlorine", false),
+ Ar(18, 22, 0, -1, null, "Argon", false),
+ K(19, 20, 0, -1, null, "Potassium", false),
+ Ca(20, 20, 0, -1, null, "Calcium", false),
+ Sc(21, 24, 0, -1, null, "Scandium", false),
+ Ti(22, 26, 0, -1, null, "Titanium", false),
+ V(23, 28, 0, -1, null, "Vanadium", false),
+ Cr(24, 28, 0, -1, null, "Chrome", false),
+ Mn(25, 30, 0, -1, null, "Manganese", false),
+ Fe(26, 30, 0, -1, null, "Iron", false),
+ Co(27, 32, 0, -1, null, "Cobalt", false),
+ Ni(28, 30, 0, -1, null, "Nickel", false),
+ Cu(29, 34, 0, -1, null, "Copper", false),
+ Zn(30, 35, 0, -1, null, "Zinc", false),
+ Ga(31, 39, 0, -1, null, "Gallium", false),
+ Ge(32, 40, 0, -1, null, "Germanium", false),
+ As(33, 42, 0, -1, null, "Arsenic", false),
+ Se(34, 45, 0, -1, null, "Selenium", false),
+ Br(35, 44, 0, -1, null, "Bromine", false),
+ Kr(36, 48, 0, -1, null, "Krypton", false),
+ Rb(37, 48, 0, -1, null, "Rubidium", false),
+ Sr(38, 49, 0, -1, null, "Strontium", false),
+ Y(39, 50, 0, -1, null, "Yttrium", false),
+ Zr(40, 51, 0, -1, null, "Zirconium", false),
+ Nb(41, 53, 0, -1, null, "Niobium", false),
+ Mo(42, 53, 0, -1, null, "Molybdenum", false),
+ Tc(43, 55, 0, -1, null, "Technetium", false),
+ Ru(44, 57, 0, -1, null, "Ruthenium", false),
+ Rh(45, 58, 0, -1, null, "Rhodium", false),
+ Pd(46, 60, 0, -1, null, "Palladium", false),
+ Ag(47, 60, 0, -1, null, "Silver", false),
+ Cd(48, 64, 0, -1, null, "Cadmium", false),
+ In(49, 65, 0, -1, null, "Indium", false),
+ Sn(50, 68, 0, -1, null, "Tin", false),
+ Sb(51, 70, 0, -1, null, "Antimony", false),
+ Te(52, 75, 0, -1, null, "Tellurium", false),
+ I(53, 74, 0, -1, null, "Iodine", false),
+ Xe(54, 77, 0, -1, null, "Xenon", false),
+ Cs(55, 77, 0, -1, null, "Caesium", false),
+ Ba(56, 81, 0, -1, null, "Barium", false),
+ La(57, 81, 0, -1, null, "Lantanium", false),
+ Ce(58, 82, 0, -1, null, "Cerium", false),
+ Pr(59, 81, 0, -1, null, "Praseodymium", false),
+ Nd(60, 84, 0, -1, null, "Neodymium", false),
+ Pm(61, 83, 0, -1, null, "Promethium", false),
+ Sm(62, 88, 0, -1, null, "Samarium", false),
+ Eu(63, 88, 0, -1, null, "Europium", false),
+ Gd(64, 93, 0, -1, null, "Gadolinium", false),
+ Tb(65, 93, 0, -1, null, "Terbium", false),
+ Dy(66, 96, 0, -1, null, "Dysprosium", false),
+ Ho(67, 97, 0, -1, null, "Holmium", false),
+ Er(68, 99, 0, -1, null, "Erbium", false),
+ Tm(69, 99, 0, -1, null, "Thulium", false),
+ Yb(70, 103, 0, -1, null, "Ytterbium", false),
+ Lu(71, 103, 0, -1, null, "Lutetium", false),
+ Hf(72, 106, 0, -1, null, "Hafnium", false),
+ Ta(73, 107, 0, -1, null, "Tantalum", false),
+ W(74, 109, 0, -1, null, "Wolframium", false),
+ Re(75, 111, 0, -1, null, "Rhenium", false),
+ Os(76, 114, 0, -1, null, "Osmium", false),
+ Ir(77, 115, 0, -1, null, "Iridium", false),
+ Pt(78, 117, 0, -1, null, "Platinum", false),
+ Au(79, 117, 0, -1, null, "Gold", false),
+ Hg(80, 120, 0, -1, null, "Mercury", false),
+ Tl(81, 123, 0, -1, null, "Thallium", false),
+ Pb(82, 125, 0, -1, null, "Lead", false),
+ Bi(83, 125, 0, -1, null, "Bismuth", false),
+ Po(84, 124, 0, -1, null, "Polonium", false),
+ At(85, 124, 0, -1, null, "Astatine", false),
+ Rn(86, 134, 0, -1, null, "Radon", false),
+ Fr(87, 134, 0, -1, null, "Francium", false),
+ Ra(88, 136, 0, -1, null, "Radium", false),
+ Ac(89, 136, 0, -1, null, "Actinium", false),
+ Th(90, 140, 0, -1, null, "Thorium", false),
+ Pa(91, 138, 0, -1, null, "Protactinium", false),
+ U(92, 146, 0, -1, null, "Uranium", false),
+ U_235(92, 143, 0, -1, null, "Uranium-235", true),
+ Np(93, 144, 0, -1, null, "Neptunium", false),
+ Pu(94, 152, 0, -1, null, "Plutonium", false),
+ Pu_241(94, 149, 0, -1, null, "Plutonium-241", true),
+ Am(95, 150, 0, -1, null, "Americium", false),
+ Cm(96, 153, 0, -1, null, "Curium", false),
+ Bk(97, 152, 0, -1, null, "Berkelium", false),
+ Cf(98, 153, 0, -1, null, "Californium", false),
+ Es(99, 153, 0, -1, null, "Einsteinium", false),
+ Fm(100, 157, 0, -1, null, "Fermium", false),
+ Md(101, 157, 0, -1, null, "Mendelevium", false),
+ No(102, 157, 0, -1, null, "Nobelium", false),
+ Lr(103, 159, 0, -1, null, "Lawrencium", false),
+ Rf(104, 161, 0, -1, null, "Rutherfordium", false),
+ Db(105, 163, 0, -1, null, "Dubnium", false),
+ Sg(106, 165, 0, -1, null, "Seaborgium", false),
+ Bh(107, 163, 0, -1, null, "Bohrium", false),
+ Hs(108, 169, 0, -1, null, "Hassium", false),
+ Mt(109, 167, 0, -1, null, "Meitnerium", false),
+ Ds(110, 171, 0, -1, null, "Darmstadtium", false),
+ Rg(111, 169, 0, -1, null, "Roentgenium", false),
+ Cn(112, 173, 0, -1, null, "Copernicium", false),
+ Nh(113, 171, 0, -1, null, "Nihonium", false),
+ Fl(114, 175, 0, -1, null, "Flerovium", false),
+ Mc(115, 173, 0, -1, null, "Moscovium", false),
+ Lv(116, 177, 0, -1, null, "Livermorium", false),
+ Ts(117, 177, 0, -1, null, "Teness", false),
+ Og(118, 176, 0, -1, null, "Oganesson", false),
+ Tn(125, 198, 0, -1, null, "Tritanium", false),
+
+ SpFe(26, 42, 0, -1, null, "Meteoric Iron", false),
+ De(22, 27, 0, -1, null, "Desh", false),
+ Oh(76, 125, 0, -1, null, "Oriharukon", false),
+ Di(500, 500, 0, -1, null, "Dimensionally Transcendent Matter", false),
+
+ Ma(0, 0, 100, -1, null, "Magic", false),
+ Nq(130, 200, 0, -1, null, "Naquadah", false),
+ Nt(0, 100, 0, -1, null, "Neutronium", false),
+
+ $H(-1, -0, 0, -1, null, "Anti-Hydrogen", false),
+ $D(-1, -1, 0, -1, "H", "Anti-Deuterium", true),
+ $T(-1, -2, 0, -1, "D", "Anti-Tritium", true),
+ $He(-2, -2, 0, -1, null, "Anti-Helium", false),
+ $He_3(-2, -1, 0, -1, "H&D", "Anti-Helium-3", true),
+ $Li(-3, -4, 0, -1, null, "Anti-Lithium", false),
+ $Be(-4, -5, 0, -1, null, "Anti-Beryllium", false),
+ $B(-5, -5, 0, -1, null, "Anti-Boron", false),
+ $C(-6, -6, 0, -1, null, "Anti-Carbon", false),
+ $N(-7, -7, 0, -1, null, "Anti-Nitrogen", false),
+ $O(-8, -8, 0, -1, null, "Anti-Oxygen", false),
+ $F(-9, -9, 0, -1, null, "Anti-Fluorine", false),
+ $Ne(-10, -10, 0, -1, null, "Anti-Neon", false),
+ $Na(-11, -11, 0, -1, null, "Anti-Sodium", false),
+ $Mg(-12, -12, 0, -1, null, "Anti-Magnesium", false),
+ $Al(-13, -13, 0, -1, null, "Anti-Aluminium", false),
+ $Si(-14, -14, 0, -1, null, "Anti-Silicon", false),
+ $P(-15, -15, 0, -1, null, "Anti-Phosphorus", false),
+ $S(-16, -16, 0, -1, null, "Anti-Sulfur", false),
+ $Cl(-17, -18, 0, -1, null, "Anti-Chlorine", false),
+ $Ar(-18, -22, 0, -1, null, "Anti-Argon", false),
+ $K(-19, -20, 0, -1, null, "Anti-Potassium", false),
+ $Ca(-20, -20, 0, -1, null, "Anti-Calcium", false),
+ $Sc(-21, -24, 0, -1, null, "Anti-Scandium", false),
+ $Ti(-22, -26, 0, -1, null, "Anti-Titanium", false),
+ $V(-23, -28, 0, -1, null, "Anti-Vanadium", false),
+ $Cr(-24, -28, 0, -1, null, "Anti-Chrome", false),
+ $Mn(-25, -30, 0, -1, null, "Anti-Manganese", false),
+ $Fe(-26, -30, 0, -1, null, "Anti-Iron", false),
+ $Co(-27, -32, 0, -1, null, "Anti-Cobalt", false),
+ $Ni(-28, -30, 0, -1, null, "Anti-Nickel", false),
+ $Cu(-29, -34, 0, -1, null, "Anti-Copper", false),
+ $Zn(-30, -35, 0, -1, null, "Anti-Zinc", false),
+ $Ga(-31, -39, 0, -1, null, "Anti-Gallium", false),
+ $Ge(-32, -40, 0, -1, null, "Anti-Germanium", false),
+ $As(-33, -42, 0, -1, null, "Anti-Arsenic", false),
+ $Se(-34, -45, 0, -1, null, "Anti-Selenium", false),
+ $Br(-35, -44, 0, -1, null, "Anti-Bromine", false),
+ $Kr(-36, -48, 0, -1, null, "Anti-Krypton", false),
+ $Rb(-37, -48, 0, -1, null, "Anti-Rubidium", false),
+ $Sr(-38, -49, 0, -1, null, "Anti-Strontium", false),
+ $Y(-39, -50, 0, -1, null, "Anti-Yttrium", false),
+ $Zr(-40, -51, 0, -1, null, "Anti-Zirconium", false),
+ $Nb(-41, -53, 0, -1, null, "Anti-Niobium", false),
+ $Mo(-42, -53, 0, -1, null, "Anti-Molybdenum", false),
+ $Tc(-43, -55, 0, -1, null, "Anti-Technetium", false),
+ $Ru(-44, -57, 0, -1, null, "Anti-Ruthenium", false),
+ $Rh(-45, -58, 0, -1, null, "Anti-Rhodium", false),
+ $Pd(-46, -60, 0, -1, null, "Anti-Palladium", false),
+ $Ag(-47, -60, 0, -1, null, "Anti-Silver", false),
+ $Cd(-48, -64, 0, -1, null, "Anti-Cadmium", false),
+ $In(-49, -65, 0, -1, null, "Anti-Indium", false),
+ $Sn(-50, -68, 0, -1, null, "Anti-Tin", false),
+ $Sb(-51, -70, 0, -1, null, "Anti-Antimony", false),
+ $Te(-52, -75, 0, -1, null, "Anti-Tellurium", false),
+ $I(-53, -74, 0, -1, null, "Anti-Iodine", false),
+ $Xe(-54, -77, 0, -1, null, "Anti-Xenon", false),
+ $Cs(-55, -77, 0, -1, null, "Anti-Caesium", false),
+ $Ba(-56, -81, 0, -1, null, "Anti-Barium", false),
+ $La(-57, -81, 0, -1, null, "Anti-Lantanium", false),
+ $Ce(-58, -82, 0, -1, null, "Anti-Cerium", false),
+ $Pr(-59, -81, 0, -1, null, "Anti-Praseodymium", false),
+ $Nd(-60, -84, 0, -1, null, "Anti-Neidymium", false),
+ $Pm(-61, -83, 0, -1, null, "Anti-Promethium", false),
+ $Sm(-62, -88, 0, -1, null, "Anti-Samarium", false),
+ $Eu(-63, -88, 0, -1, null, "Anti-Europium", false),
+ $Gd(-64, -93, 0, -1, null, "Anti-Gadolinium", false),
+ $Tb(-65, -93, 0, -1, null, "Anti-Terbium", false),
+ $Dy(-66, -96, 0, -1, null, "Anti-Dysprosium", false),
+ $Ho(-67, -97, 0, -1, null, "Anti-Holmium", false),
+ $Er(-68, -99, 0, -1, null, "Anti-Erbium", false),
+ $Tm(-69, -99, 0, -1, null, "Anti-Thulium", false),
+ $Yb(-70, -103, 0, -1, null, "Anti-Ytterbium", false),
+ $Lu(-71, -103, 0, -1, null, "Anti-Lutetium", false),
+ $Hf(-72, -106, 0, -1, null, "Anti-Hafnium", false),
+ $Ta(-73, -107, 0, -1, null, "Anti-Tantalum", false),
+ $W(-74, -109, 0, -1, null, "Anti-Wolframium", false),
+ $Re(-75, -111, 0, -1, null, "Anti-Rhenium", false),
+ $Os(-76, -114, 0, -1, null, "Anti-Osmium", false),
+ $Ir(-77, -115, 0, -1, null, "Anti-Iridium", false),
+ $Pt(-78, -117, 0, -1, null, "Anti-Platinum", false),
+ $Au(-79, -117, 0, -1, null, "Anti-Gold", false),
+ $Hg(-80, -120, 0, -1, null, "Anti-Mercury", false),
+ $Tl(-81, -123, 0, -1, null, "Anti-Thallium", false),
+ $Pb(-82, -125, 0, -1, null, "Anti-Lead", false),
+ $Bi(-83, -125, 0, -1, null, "Anti-Bismuth", false),
+ $Po(-84, -124, 0, -1, null, "Anti-Polonium", false),
+ $At(-85, -124, 0, -1, null, "Anti-Astatine", false),
+ $Rn(-86, -134, 0, -1, null, "Anti-Radon", false),
+ $Fr(-87, -134, 0, -1, null, "Anti-Francium", false),
+ $Ra(-88, -136, 0, -1, null, "Anti-Radium", false),
+ $Ac(-89, -136, 0, -1, null, "Anti-Actinium", false),
+ $Th(-90, -140, 0, -1, null, "Anti-Thorium", false),
+ $Pa(-91, -138, 0, -1, null, "Anti-Protactinium", false),
+ $U(-92, -146, 0, -1, null, "Anti-Uranium", false),
+ $U_235(-92, -143, 0, -1, null, "Anti-Uranium-235", true),
+ $Np(-93, -144, 0, -1, null, "Anti-Neptunium", false),
+ $Pu(-94, -152, 0, -1, null, "Anti-Plutonium", false),
+ $Pu_241(-94, -149, 0, -1, null, "Anti-Plutonium-241", true),
+ $Am(-95, -150, 0, -1, null, "Anti-Americium", false),
+ $Cm(-96, -153, 0, -1, null, "Anti-Curium", false),
+ $Bk(-97, -152, 0, -1, null, "Anti-Berkelium", false),
+ $Cf(-98, -153, 0, -1, null, "Anti-Californium", false),
+ $Es(-99, -153, 0, -1, null, "Anti-Einsteinium", false),
+ $Fm(-100, -157, 0, -1, null, "Anti-Fermium", false),
+ $Md(-101, -157, 0, -1, null, "Anti-Mendelevium", false),
+ $No(-102, -157, 0, -1, null, "Anti-Nobelium", false),
+ $Lr(-103, -159, 0, -1, null, "Anti-Lawrencium", false),
+ $Rf(-104, -161, 0, -1, null, "Anti-Rutherfordium", false),
+ $Db(-105, -163, 0, -1, null, "Anti-Dubnium", false),
+ $Sg(-106, -165, 0, -1, null, "Anti-Seaborgium", false),
+ $Bh(-107, -163, 0, -1, null, "Anti-Bohrium", false),
+ $Hs(-108, -169, 0, -1, null, "Anti-Hassium", false),
+ $Mt(-109, -167, 0, -1, null, "Anti-Meitnerium", false),
+ $Ds(-110, -171, 0, -1, null, "Anti-Darmstadtium", false),
+ $Rg(-111, -169, 0, -1, null, "Anti-Roentgenium", false),
+ $Cn(-112, -173, 0, -1, null, "Anti-Copernicium", false),
+ $Nh(-113, -171, 0, -1, null, "Anti-Nihonium", false),
+ $Fl(-114, -175, 0, -1, null, "Anti-Flerovium", false),
+ $Mc(-115, -173, 0, -1, null, "Anti-Moscovium", false),
+ $Lv(-116, -177, 0, -1, null, "Anti-Livermorium", false),
+ $Ts(-117, -177, 0, -1, null, "Anti-Tenness", false),
+ $Og(-118, -176, 0, -1, null, "Anti-Oganesson", false),
+ $Tn(-125, -198, 0, -1, null, "Anti-Tritanium", false),
+
+ $SpFe(-26, -42, 0, -1, null, "Anti-Meteoric Iron", true),
+ $De(-22, -27, 0, -1, null, "Anti-Desh", true),
+ $Oh(-76, -125, 0, -1, null, "Anti-Oriharukon", true),
+
+ $Ma(0, 0, -100, -1, null, "Anti-Magic", false),
+ $Nq(-130, -200, 0, -1, null, "Anti-Naquadah", false),
+ $Nt(0, -10000, 0, -1, null, "Anti-Neutronium", false);
+
+ public final long mProtons, mNeutrons, mAdditionalMass, mHalfLifeSeconds;
+ public final String mName, mDecayTo;
+ public final boolean mIsIsotope;
+
+ /**
+ * Links to every pure Material containing just this Element.
+ */
+ // bartworks.system.material.werkstoff_loaders.registration.BridgeMaterialsLoader reassigns it, so no final here
+ @SuppressWarnings("NonFinalFieldInEnum")
+ public ArrayList<Materials> mLinkedMaterials = new ArrayList<>();
+
+ /**
+ * @param aProtons Amount of Protons. Antiprotons if negative.
+ * @param aNeutrons Amount of Neutrons. Antineutrons if negative. (I could have made mistakes with the
+ * Neutron amount calculation, please tell me if I did something wrong)
+ * @param aHalfLifeSeconds Amount of Half Life this Material has in Seconds. -1 for stable Materials.
+ * @param aDecayTo String representing the Elements it decays to. Separated by an '&' Character.
+ * @param aName Name of the Element
+ */
+ Element(long aProtons, long aNeutrons, long aAdditionalMass, long aHalfLifeSeconds, String aDecayTo, String aName,
+ boolean aIsIsotope) {
+ mProtons = aProtons;
+ mNeutrons = aNeutrons;
+ mAdditionalMass = aAdditionalMass;
+ mHalfLifeSeconds = aHalfLifeSeconds;
+ mDecayTo = aDecayTo;
+ mName = aName;
+ mIsIsotope = aIsIsotope;
+ Companion.VALUES.put(name(), this);
+ }
+
+ @Nonnull
+ public static Element get(String aMaterialName) {
+ return Companion.VALUES.getOrDefault(aMaterialName, _NULL);
+ }
+
+ public long getProtons() {
+ return mProtons;
+ }
+
+ public long getNeutrons() {
+ return mNeutrons;
+ }
+
+ public long getMass() {
+ return mProtons + mNeutrons + mAdditionalMass;
+ }
+
+ /**
+ * A companion object to workaround java limitations
+ */
+ private static final class Companion {
+
+ /**
+ * Why is this a separate map and populated by enum constructor instead of a Map prepoluated with values()?
+ * Because apparently there are people hacking into this enum via EnumHelper.
+ */
+ private static final Map<String, Element> VALUES = new HashMap<>();
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/FluidState.java b/src/main/java/gregtech/api/enums/FluidState.java
new file mode 100644
index 0000000000..5f6f8824f5
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/FluidState.java
@@ -0,0 +1,17 @@
+package gregtech.api.enums;
+
+public enum FluidState {
+
+ GAS,
+ LIQUID,
+ MOLTEN,
+ PLASMA,
+ SLURRY;
+
+ public static final FluidState[] VALID_STATES = new FluidState[] { SLURRY, LIQUID, GAS, PLASMA, MOLTEN };
+
+ public static FluidState fromValue(int stateValue) {
+ return stateValue >= 0 && stateValue < FluidState.VALID_STATES.length ? FluidState.VALID_STATES[stateValue]
+ : FluidState.LIQUID;
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/GTNH_ExtraMaterials.java b/src/main/java/gregtech/api/enums/GTNH_ExtraMaterials.java
new file mode 100644
index 0000000000..b65ac53499
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/GTNH_ExtraMaterials.java
@@ -0,0 +1,626 @@
+package gregtech.api.enums;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+
+import gregtech.api.interfaces.IMaterialHandler;
+
+public class GTNH_ExtraMaterials implements IMaterialHandler {
+
+ public GTNH_ExtraMaterials() {
+ GT_FML_LOGGER.info("Registering GTNH-Materials (post Java 64kb limit)");
+ Materials.add(this);
+ }
+
+ /**
+ * This Class is for adding new Materials since Java has a Limiation of 64kb per Method / Class header
+ */
+ public static Materials Signalum = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 1 | 2,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Signalum",
+ "Signalum",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+
+ public static Materials Lumium = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 1 | 2,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Lumium",
+ "Lumium",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials EnrichedCopper = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 1 | 2,
+ 255,
+ 255,
+ 255,
+ 0,
+ "EnrichedCopper",
+ "Enriched Copper",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials DiamondCopper = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 1 | 2,
+ 255,
+ 255,
+ 255,
+ 0,
+ "DiamondCopper",
+ "Diamond Copper",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials TarPitch = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 1 | 2,
+ 255,
+ 255,
+ 255,
+ 0,
+ "TarPitch",
+ "Tar Pitch",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials LimePure = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 0,
+ 0,
+ 255,
+ 255,
+ 255,
+ 0,
+ "LimePure",
+ "Pure Lime",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeLime);
+ public static Materials Wimalite = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 8,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Wimalite",
+ "Wimalite",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes.dyeYellow);
+ public static Materials Yellorite = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 8,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Yellorite",
+ "Yellorite",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes.dyeYellow);
+ public static Materials Quantum = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 0,
+ 0,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Quantum",
+ "Quantum",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeWhite);
+ public static Materials Turquoise = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 1,
+ 1,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Turquoise",
+ "Turquoise",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials Tapazite = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 1,
+ 1,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Tapazite",
+ "Tapazite",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes.dyeGreen);
+ public static Materials Thyrium = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 1,
+ 1 | 2 | 8,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Thyrium",
+ "Thyrium",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials Tourmaline = new Materials(
+ -1,
+ TextureSet.SET_RUBY,
+ 1.0F,
+ 0,
+ 1,
+ 1,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Tourmaline",
+ "Tourmaline",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials Spinel = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 1,
+ 0,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Spinel",
+ "Spinel",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials Starconium = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 1,
+ 1 | 2 | 8,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Starconium",
+ "Starconium",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials Sugilite = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 1,
+ 1,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Sugilite",
+ "Sugilite",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials Prismarine = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 1 | 4,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Prismarine",
+ "Prismarine",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials GraveyardDirt = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 1,
+ 255,
+ 255,
+ 255,
+ 0,
+ "GraveyardDirt",
+ "Graveyard Dirt",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials Tennantite = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 1,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Tennantite",
+ "Tennantite",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials Fairy = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 1 | 2,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Fairy",
+ "Fairy",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials Ludicrite = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 1 | 2,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Ludicrite",
+ "Ludicrite",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials AquaRegia = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 0,
+ 255,
+ 255,
+ 255,
+ 0,
+ "AquaRegia",
+ "Aqua Regia",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials SolutionBlueVitriol = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 0,
+ 255,
+ 255,
+ 255,
+ 0,
+ "SolutionBlueVitriol",
+ "Blue Vitriol Solution",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials SolutionNickelSulfate = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 2,
+ 0,
+ 255,
+ 255,
+ 255,
+ 0,
+ "SolutionNickelSulfate",
+ "Nickel Sulfate Solution",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials Lodestone = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 1,
+ 1 | 8,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Lodestone",
+ "Lodestone",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 1,
+ 1,
+ 1,
+ Dyes._NULL);
+ public static Materials Luminite = new Materials(
+ -1,
+ TextureSet.SET_NONE,
+ 1.0F,
+ 0,
+ 1,
+ 1 | 8,
+ 250,
+ 250,
+ 250,
+ 0,
+ "Luminite",
+ "Luminite",
+ 0,
+ 0,
+ -1,
+ 0,
+ false,
+ false,
+ 3,
+ 1,
+ 1,
+ Dyes.dyeWhite);
+
+ private static void initSubTags() {
+ SubTag.METAL.addTo(Signalum, Lumium, EnrichedCopper, DiamondCopper);
+ SubTag.NO_SMASHING.addTo(TarPitch);
+ }
+
+ @Override
+ public void onMaterialsInit() {
+ initSubTags();
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/GTVoltageIndex.java b/src/main/java/gregtech/api/enums/GTVoltageIndex.java
new file mode 100644
index 0000000000..c5c2c215b0
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/GTVoltageIndex.java
@@ -0,0 +1,22 @@
+package gregtech.api.enums;
+
+public class GTVoltageIndex {
+
+ public final static int ULV = 0;
+ public final static int LV = 1;
+ public final static int MV = 2;
+ public final static int HV = 3;
+ public final static int EV = 4;
+ public final static int IV = 5;
+ public final static int LuV = 6;
+ public final static int ZPM = 7;
+ public final static int UV = 8;
+ public final static int UHV = 9;
+ public final static int UEV = 10;
+ public final static int UIV = 11;
+ public final static int UMV = 12;
+ public final static int UXV = 13;
+ public final static int MAX = 14;
+
+ private GTVoltageIndex() {}
+}
diff --git a/src/main/java/gregtech/api/enums/GT_HatchElement.java b/src/main/java/gregtech/api/enums/GT_HatchElement.java
new file mode 100644
index 0000000000..3a21d5a2eb
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/GT_HatchElement.java
@@ -0,0 +1,112 @@
+package gregtech.api.enums;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.util.GT_ExoticEnergyInputHelper;
+import gregtech.api.util.IGT_HatchAdder;
+
+public enum GT_HatchElement implements IHatchElement<GT_MetaTileEntity_MultiBlockBase> {
+
+ Muffler(GT_MetaTileEntity_MultiBlockBase::addMufflerToMachineList, GT_MetaTileEntity_Hatch_Muffler.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiBlockBase t) {
+ return t.mMufflerHatches.size();
+ }
+ },
+ Maintenance(GT_MetaTileEntity_MultiBlockBase::addMaintenanceToMachineList,
+ GT_MetaTileEntity_Hatch_Maintenance.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiBlockBase t) {
+ return t.mMaintenanceHatches.size();
+ }
+ },
+ InputHatch(GT_MetaTileEntity_MultiBlockBase::addInputHatchToMachineList, GT_MetaTileEntity_Hatch_Input.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiBlockBase t) {
+ return t.mInputHatches.size();
+ }
+ },
+ InputBus(GT_MetaTileEntity_MultiBlockBase::addInputBusToMachineList, GT_MetaTileEntity_Hatch_InputBus.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiBlockBase t) {
+ return t.mInputBusses.size();
+ }
+ },
+ OutputHatch(GT_MetaTileEntity_MultiBlockBase::addOutputHatchToMachineList, GT_MetaTileEntity_Hatch_Output.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiBlockBase t) {
+ return t.mOutputHatches.size();
+ }
+ },
+ OutputBus(GT_MetaTileEntity_MultiBlockBase::addOutputBusToMachineList, GT_MetaTileEntity_Hatch_OutputBus.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiBlockBase t) {
+ return t.mOutputBusses.size();
+ }
+ },
+ Energy(GT_MetaTileEntity_MultiBlockBase::addEnergyInputToMachineList, GT_MetaTileEntity_Hatch_Energy.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiBlockBase t) {
+ return t.mEnergyHatches.size();
+ }
+ },
+ Dynamo(GT_MetaTileEntity_MultiBlockBase::addDynamoToMachineList, GT_MetaTileEntity_Hatch_Dynamo.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiBlockBase t) {
+ return t.mDynamoHatches.size();
+ }
+ },
+ ExoticEnergy(GT_MetaTileEntity_MultiBlockBase::addExoticEnergyInputToMachineList) {
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return GT_ExoticEnergyInputHelper.getAllClasses();
+ }
+
+ @Override
+ public long count(GT_MetaTileEntity_MultiBlockBase t) {
+ return t.getExoticEnergyHatches()
+ .size();
+ }
+ },;
+
+ private final List<Class<? extends IMetaTileEntity>> mteClasses;
+ private final IGT_HatchAdder<GT_MetaTileEntity_MultiBlockBase> adder;
+
+ @SafeVarargs
+ GT_HatchElement(IGT_HatchAdder<GT_MetaTileEntity_MultiBlockBase> adder,
+ Class<? extends IMetaTileEntity>... mteClasses) {
+ this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses));
+ this.adder = adder;
+ }
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return mteClasses;
+ }
+
+ public IGT_HatchAdder<? super GT_MetaTileEntity_MultiBlockBase> adder() {
+ return adder;
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/GT_Values.java b/src/main/java/gregtech/api/enums/GT_Values.java
new file mode 100644
index 0000000000..64e1907507
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/GT_Values.java
@@ -0,0 +1,658 @@
+package gregtech.api.enums;
+
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidTank;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.fluid.FluidTankGT;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.internal.IGT_Mod;
+import gregtech.api.interfaces.internal.IGT_RecipeAdder;
+import gregtech.api.net.IGT_NetworkHandler;
+
+/**
+ * Made for static imports, this Class is just a Helper.
+ * <p/>
+ * I am doing this to have a better Table alike view on my Code, so I can change things faster using the Block Selection
+ * Mode of eclipse.
+ * <p/>
+ * Go to "Window > Preferences > Java > Editor > Content Assist > Favorites" to set static importable Constant Classes
+ * such as this one as AutoCompleteable.
+ */
+@SuppressWarnings("unused") // API Legitimately has unused fields and methods
+public class GT_Values {
+ // unused: A, C, D, G, H, I, J, K, N, O, Q, R, S, T
+
+ // TODO: Rename Material Units to 'U'
+ // TODO: Rename OrePrefixes Class to 'P'
+ // TODO: Rename Materials Class to 'M'
+
+ /**
+ * Empty String for an easier Call Hierarchy
+ */
+ public static final String E = "";
+
+ /**
+ * The first 32 Bits
+ */
+ @SuppressWarnings("PointlessBitwiseExpression") // Nicer source layout this way
+ public static final int[] B = new int[] { 1 << 0, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7, 1 << 8,
+ 1 << 9, 1 << 10, 1 << 11, 1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16, 1 << 17, 1 << 18, 1 << 19, 1 << 20,
+ 1 << 21, 1 << 22, 1 << 23, 1 << 24, 1 << 25, 1 << 26, 1 << 27, 1 << 28, 1 << 29, 1 << 30, 1 << 31 };
+
+ /**
+ * Renamed from "MATERIAL_UNIT" to just "M"
+ * <p/>
+ * This is worth exactly one normal Item. This Constant can be divided by many commonly used Numbers such as 1, 2,
+ * 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, ... 64 or 81 without losing precision and is for that
+ * reason used as Unit of Amount. But it is also small enough to be multiplied with larger Numbers.
+ * <p/>
+ * This is used to determine the amount of Material contained inside a prefixed Ore. For example Nugget = M / 9 as
+ * it contains out of 1/9 of an Ingot.
+ */
+ public static final long M = 3628800;
+
+ /**
+ * Renamed from "FLUID_MATERIAL_UNIT" to just "L"
+ * <p/>
+ * Fluid per Material Unit (Prime Factors: 3 * 3 * 2 * 2 * 2 * 2)
+ */
+ public static final long L = 144;
+
+ /**
+ * The Item WildCard Tag. Even shorter than the "-1" of the past
+ */
+ public static final short W = OreDictionary.WILDCARD_VALUE;
+
+ /**
+ * The Voltage Tiers. Use this Array instead of the old named Voltage Variables
+ */
+ public static final long[] V = new long[] { 8L, 32L, 128L, 512L, 2048L, 8192L, 32_768L, 131_072L, 524_288L,
+ 2_097_152L, 8_388_608L, 33_554_432L, 134_217_728L, 536_870_912L, Integer.MAX_VALUE - 7,
+ // Error tier to prevent out of bounds errors. Not really a real tier (for now).
+ 8_589_934_592L };
+
+ /**
+ * The Voltage Practical. These are recipe voltage you should use if you expect the recipe to use a full amp of that
+ * tier. These leave a bit of headroom for cable and transformer losses, but not enough to make it a great gain.
+ */
+ // this will correctly map ULV to 7.
+ public static final long[] VP = Arrays.stream(V)
+ .map(
+ i -> BigInteger.valueOf(i)
+ .multiply(BigInteger.valueOf(30))
+ .divide(BigInteger.valueOf(32))
+ .longValueExact())
+ .toArray();
+ // TODO:Adding that in coremod!!!
+ // TODO:tier 14,15 wires and transformers only (not even cables !!!)
+ // TODO:tier 12,13 the above + batteries, battery buffers, (maybe cables,12 also works for machines)
+ // TODO:tier 10,11 the above + chargers and other machines, (cables would be nice)
+ // TODO:tier 9 machines and batteries
+
+ // TODO:AND ALL THE MATERIALS... for that
+ // TODO:LIST OF MACHINES WITH POINTLESS TIERS (unless you implement some other tiering mechanism like reducing eu
+ // cost if time=1tick)
+ // Macerator/Compressor/Furnace... and for cheap recipes any
+
+ /**
+ * Array of Maximum Amperes at given Tier index
+ * <p>
+ * keeping Voltage*Amps < Integer.MAX_VALUE-7 for machines (and tier logic 4x EUt 2/ time)
+ * </p>
+ * <p>
+ * AMV[4]= max amps at tier 4
+ * </p>
+ */
+ public static final long[] AatV = new long[] { 268435455, 67108863, 16777215, 4194303, 1048575, 262143, 65535,
+ 16383, 4095, 1023, 255, 63, 15, 3, 1, 1 };
+ /**
+ * The short Names for the Voltages
+ */
+ public static final String[] VN = new String[] { "ULV", // 0
+ "LV", // 1
+ "MV", // 2
+ "HV", // 3
+ "EV", // 4
+ "IV", // 5
+ "LuV", // 6
+ "ZPM", // 7
+ "UV", // 8
+ "UHV", // 9
+ "UEV", // 10
+ "UIV", // 11
+ "UMV", // 12
+ "UXV", // 13
+ "MAX", // 14
+ "MAX+" // 15
+ };
+
+ /**
+ * The long Names for the Voltages
+ */
+ public static final String[] VOLTAGE_NAMES = new String[] { "Ultra Low Voltage", // 0
+ "Low Voltage", // 1
+ "Medium Voltage", // 2
+ "High Voltage", // 3
+ "Extreme Voltage", // 4
+ "Insane Voltage", // 5
+ "Ludicrous Voltage", // 6
+ "ZPM Voltage", // 7
+ "Ultimate Voltage", // 8
+ "Ultimate High Voltage", // 9
+ "Ultimate Extreme Voltage", // 10
+ "Ultimate Insane Voltage", // 11
+ "Ultimate Mega Voltage", // 12
+ "Ultimate Extended Mega Voltage", // 13
+ "Maximum Voltage", // 14
+ "Error Voltage, report this" // 15
+ };
+
+ public static final String[] TIER_COLORS = new String[] { EnumChatFormatting.RED.toString(), // ULV, 0
+ EnumChatFormatting.GRAY.toString(), // LV, 1
+ EnumChatFormatting.GOLD.toString(), // MV, 2
+ EnumChatFormatting.YELLOW.toString(), // HV, 3
+ EnumChatFormatting.DARK_GRAY.toString(), // EV, 4
+ EnumChatFormatting.GREEN.toString(), // IV, 5
+ EnumChatFormatting.LIGHT_PURPLE.toString(), // LuV, 6
+ EnumChatFormatting.AQUA.toString(), // ZPM, 7
+ EnumChatFormatting.DARK_GREEN.toString(), // UV, 8
+ EnumChatFormatting.DARK_RED.toString(), // UHV, 9
+ EnumChatFormatting.DARK_PURPLE.toString(), // UEV, 10
+ EnumChatFormatting.DARK_BLUE.toString() + EnumChatFormatting.BOLD, // UIV, 11
+ EnumChatFormatting.RED.toString() + EnumChatFormatting.BOLD + EnumChatFormatting.UNDERLINE, // UMV, 12
+ EnumChatFormatting.DARK_RED.toString() + EnumChatFormatting.BOLD + EnumChatFormatting.UNDERLINE, // UXV, 13
+ EnumChatFormatting.WHITE.toString() + EnumChatFormatting.BOLD + EnumChatFormatting.UNDERLINE, // MAX, 14
+ EnumChatFormatting.WHITE.toString() + EnumChatFormatting.BOLD
+ + EnumChatFormatting.UNDERLINE
+ + EnumChatFormatting.ITALIC, // MAX+, 15
+ };
+
+ /**
+ * This way it is possible to have a Call Hierarchy of NullPointers in ItemStack based Functions, and also because
+ * most of the time I don't know what kind of Data Type the "null" stands for
+ */
+ public static final ItemStack NI = null;
+ /**
+ * This way it is possible to have a Call Hierarchy of NullPointers in FluidStack based Functions, and also because
+ * most of the time I don't know what kind of Data Type the "null" stands for
+ */
+ public static final FluidStack NF = null;
+ /**
+ * MOD ID Strings, since they are very common Parameters.
+ */
+ @Deprecated
+ public static final String MOD_ID = "gregtech";
+ @Deprecated
+ public static final String MOD_ID_IC2 = "IC2";
+ @Deprecated
+ public static final String MOD_ID_NC = "IC2NuclearControl";
+ @Deprecated
+ public static final String MOD_ID_TC = "Thaumcraft";
+ @Deprecated
+ public static final String MOD_ID_TF = "TwilightForest";
+ @Deprecated
+ public static final String MOD_ID_RC = "Railcraft";
+ @Deprecated
+ public static final String MOD_ID_TE = "ThermalExpansion";
+ @Deprecated
+ public static final String MOD_ID_AE = "appliedenergistics2";
+ @Deprecated
+ public static final String MOD_ID_TFC = "terrafirmacraft";
+ @Deprecated
+ public static final String MOD_ID_PFAA = "PFAAGeologica";
+ @Deprecated
+ public static final String MOD_ID_FR = "Forestry";
+ @Deprecated
+ public static final String MOD_ID_HaC = "harvestcraft";
+ @Deprecated
+ public static final String MOD_ID_APC = "AppleCore";
+ @Deprecated
+ public static final String MOD_ID_MaCr = "magicalcrops";
+ @Deprecated
+ public static final String MOD_ID_GaEn = "ganysend";
+ @Deprecated
+ public static final String MOD_ID_GaSu = "ganyssurface";
+ @Deprecated
+ public static final String MOD_ID_GaNe = "ganysnether";
+ @Deprecated
+ public static final String MOD_ID_BC_SILICON = "BuildCraft|Silicon";
+ @Deprecated
+ public static final String MOD_ID_BC_TRANSPORT = "BuildCraft|Transport";
+ @Deprecated
+ public static final String MOD_ID_BC_FACTORY = "BuildCraft|Factory";
+ @Deprecated
+ public static final String MOD_ID_BC_ENERGY = "BuildCraft|Energy";
+ @Deprecated
+ public static final String MOD_ID_BC_BUILDERS = "BuildCraft|Builders";
+ @Deprecated
+ public static final String MOD_ID_BC_CORE = "BuildCraft|Core";
+ @Deprecated
+ public static final String MOD_ID_GC_CORE = "GalacticraftCore";
+ @Deprecated
+ public static final String MOD_ID_GC_MARS = "GalacticraftMars";
+ @Deprecated
+ public static final String MOD_ID_GC_PLANETS = "GalacticraftPlanets";
+ @Deprecated
+ public static final String MOD_ID_DC = "dreamcraft";
+ @Deprecated
+ public static final String MOD_ID_GTPP = "miscutils";
+ /**
+ * File Paths and Resource Paths
+ */
+ @Deprecated
+ public static final String TEX_DIR = "textures/";
+ @Deprecated
+ public static final String TEX_DIR_GUI = TEX_DIR + "gui/";
+ @Deprecated
+ public static final String TEX_DIR_ITEM = TEX_DIR + "items/";
+ @Deprecated
+ public static final String TEX_DIR_BLOCK = TEX_DIR + "blocks/";
+ @Deprecated
+ public static final String TEX_DIR_ENTITY = TEX_DIR + "entity/";
+ @Deprecated
+ public static final String TEX_DIR_ASPECTS = TEX_DIR + "aspects/";
+ @Deprecated
+ public static final String RES_PATH = GregTech.getResourcePath(TEX_DIR);
+ @Deprecated
+ public static final String RES_PATH_GUI = GregTech.getResourcePath("textures", "gui/");
+ @Deprecated
+ public static final String RES_PATH_ITEM = GregTech.getResourcePath();
+ @Deprecated
+ public static final String RES_PATH_BLOCK = GregTech.getResourcePath();
+ @Deprecated
+ public static final String RES_PATH_ENTITY = GregTech.getResourcePath("textures", "entity/");
+ @Deprecated
+ public static final String RES_PATH_ASPECTS = GregTech.getResourcePath("textures", "aspects/");
+ @Deprecated
+ public static final String RES_PATH_MODEL = GregTech.getResourcePath("textures", "models/");
+ @Deprecated
+ public static final String RES_PATH_IC2 = IndustrialCraft2.getResourcePath();
+
+ /**
+ * NBT String Keys
+ */
+ public static final class NBT {
+
+ public static final String COLOR = "gt.color", // Integer
+ COVERS = "gt.covers", // String
+ CUSTOM_NAME = "name", // String
+ DISPLAY = "gt.display", // String
+ TIER = "gt.tier", // Number
+ FACING = "gt.facing", // Byte
+ LOCK_UPGRADE = "gt.locked", // Boolean
+ MATERIAL = "gt.material", // String containing the Material Name.
+ MODE = "gt.mode", // Number
+ ALLOWED_MODES = "gt.amode", // Number
+ MTE_ID = "gt.mte.id", // Containing the MTE ID
+ MTE_REG = "gt.mte.reg", // Containing the MTE Registry ID
+ OWNER = "gt.owner", // String
+ OWNER_UUID = "gt.ownerUuid", // UUID (String)
+
+ // Machines
+ ACTIVE = "gt.active", // Boolean
+ FLUID_OUT = "gt.fluidout", // Output Fluid
+ ITEM_OUT = "gt.itemout", // Output Item
+ PARALLEL = "gt.parallel", // Number
+ TANK_CAPACITY = "gt.tankcap", // Number
+ TANK_IN = "gt.tank.in.", // FluidStack
+ TANK_OUT = "gt.tank.out.", // FluidStack
+ TEXTURE_FOLDER = "gt.texture.folder", // String
+ INV_INPUT_SIZE = "gt.invsize.in", // Number
+ INV_OUTPUT_SIZE = "gt.invsize.out", // Number
+ INV_INPUT_LIST = "gt.invlist.in", // NBT List
+ INV_OUTPUT_LIST = "gt.invlist.out", // NBT List
+ VOLTAGE = "gt.voltage", // Number
+ AMPERAGE = "gt.amperage", // Number
+ STORED_ENERGY = "gt.stored.energy", // Number
+ MAXIMUM_ENERGY = "gt.maximum.energy", // Number
+ EUT_CONSUMPTION = "gt.eut.consumption", // Number
+ BURN_TIME_LEFT = "gt.burn.time.left", // Number
+ TOTAL_BURN_TIME = "gt.total.burn.time", // Number
+ ALLOWED_WORK = "gt.allowed.work", // Boolean
+ TASKS = "gt.tasks", // Compound
+
+ // MultiBlock
+ STRUCTURE_OK = "gt.structure.ok", ROTATION = "gt.eRotation", FLIP = "gt.eFlip", TARGET = "gt.target", // Boolean
+ TARGET_X = "gt.target.x", // Number
+ TARGET_Y = "gt.target.y", // Number
+ TARGET_Z = "gt.target.z", // Number
+ LOCKED_FLUID = "gt.locked.fluid", // String
+ LOCKED_INVENTORY = "gt.locked.inv", // String
+ LOCKED_INVENTORY_INDEX = "gt.locked.inv.index", // Number
+ UPGRADE_INVENTORY_SIZE = "gt.invsize.upg", // String
+ UPGRADE_INVENTORY_UUID = "gt.invuuid.upg", // String
+ UPGRADE_INVENTORY_NAME = "gt.invname.upg", // String
+ UPGRADE_INVENTORIES_INPUT = "gt.invlist.upg.in", // NBT List
+ UPGRADE_INVENTORIES_OUTPUT = "gt.invlist.upg.out", // NBT List
+ UPGRADE_TANK_CAPACITY = "gt.tank.cap.upg", // Long
+ UPGRADE_TANK_COUNT = "gt.tank.ct.upg", // Int
+ UPGRADE_TANK_CAPACITY_MULTIPLIER = "gt.tank.cap.mult.upg", // Long
+ UPGRADE_TANK_UUID = "gt.tankuuid.upg", // String
+ UPGRADE_TANK_NAME = "gt.tankname.upg", // String
+ UPGRADE_TANKS_INPUT = "gt.tanklist.upg.in", // NBT List
+ UPGRADE_TANKS_OUTPUT = "gt.tanklist.upg.out", // NBT List
+ UPGRADE_TANKS_PREFIX = "gt.tank.upg", // NBT Tag
+ UPGRADE_AMPERAGE = "gt.amp.upg", // Long
+ SEPARATE_INPUTS = "gt.separate.inputs", // Boolean
+ VOIDING_MODE = "gt.voiding.mode", // String
+ BATCH_MODE = "gt.batch.mode", // Boolean
+ RECIPE_LOCK = "gt.recipe.lock", // Boolean
+
+ // Logic
+ POWER_LOGIC = "gt.pow.logic", // NBT Tag
+ POWER_LOGIC_STORED_ENERGY = "gt.pow.energy", // Number
+ POWER_LOGIC_ENERGY_CAPACITY = "gt.pow.energy.cap", // Number
+ POWER_LOGIC_VOLTAGE = "gt.pow.volt", // Number
+ POWER_LOGIC_AMPERAGE = "gt.pow.amp", // Number
+ POWER_LOGIC_TYPE = "gt.pow.type", // Number
+ empty_ = "";
+ }
+
+ /** The Color White as RGB Short Array. */
+ public static final short[] UNCOLORED_RGBA = { 255, 255, 255, 255 };
+ /** The Color White as simple Integer (0x00ffffff). */
+ public static final int UNCOLORED = 0x00ffffff;
+
+ /**
+ * Sides
+ */
+ public static final byte SIDE_BOTTOM = 0, SIDE_DOWN = 0, SIDE_TOP = 1, SIDE_UP = 1, SIDE_NORTH = 2, // Also a Side
+ // with a
+ // stupidly
+ // mirrored
+ // Texture
+ SIDE_SOUTH = 3, SIDE_WEST = 4, SIDE_EAST = 5, // Also a Side with a stupidly mirrored Texture
+ SIDE_ANY = 6, SIDE_UNKNOWN = 6, SIDE_INVALID = 6, SIDE_INSIDE = 6, SIDE_UNDEFINED = 6;
+
+ /** Compass alike Array for the proper ordering of North, East, South and West. */
+ public static final byte[] COMPASS_DIRECTIONS = { SIDE_NORTH, SIDE_EAST, SIDE_SOUTH, SIDE_WEST };
+
+ /**
+ * An Array containing all Sides which follow the Condition, in order to iterate over them for example.
+ */
+ public static final byte[] ALL_SIDES = { 0, 1, 2, 3, 4, 5, 6 }, ALL_VALID_SIDES = { 0, 1, 2, 3, 4, 5 };
+
+ /**
+ * For Facing Checks.
+ */
+ public static final boolean[] INVALID_SIDES = { false, false, false, false, false, false, true },
+ VALID_SIDES = { true, true, true, true, true, true, false };
+
+ /**
+ * Side->Offset Mappings.
+ */
+ public static final byte[] OFFX = { 0, 0, 0, 0, -1, +1, 0 }, OFFY = { -1, +1, 0, 0, 0, 0, 0 },
+ OFFZ = { 0, 0, -1, +1, 0, 0, 0 };
+
+ /**
+ * Side->Opposite Mappings.
+ **/
+ public static final byte[] OPOS = { 1, 0, 3, 2, 5, 4, 6 };
+
+ /**
+ * [Facing,Side]->Side Mappings for Blocks, which don't face up- and downwards. 0 = bottom, 1 = top, 2 = left, 3 =
+ * front, 4 = right, 5 = back, 6 = undefined.
+ */
+ public static final byte[][] FACING_ROTATIONS = { { 0, 1, 2, 3, 4, 5, 6 }, { 0, 1, 2, 3, 4, 5, 6 },
+ { 0, 1, 3, 5, 4, 2, 6 }, { 0, 1, 5, 3, 2, 4, 6 }, { 0, 1, 2, 4, 3, 5, 6 }, { 0, 1, 4, 2, 5, 3, 6 },
+ { 0, 1, 2, 3, 4, 5, 6 } };
+
+ /**
+ * The Mod Object itself. That is the GT_Mod-Object. It's needed to open GUI's and similar.
+ */
+ public static IGT_Mod GT;
+ /**
+ * Use this Object to add Recipes. (Recipe Adder)
+ */
+ public static IGT_RecipeAdder RA;
+ /**
+ * For Internal Usage (Network)
+ */
+ public static IGT_NetworkHandler NW;
+ /**
+ * Control percentage of filled 3x3 chunks. Lower number means less oreveins spawn
+ */
+ public static int oreveinPercentage;
+ /**
+ * Control number of attempts to find a valid orevein. Generally this maximum limit isn't hit, selecting a vein is
+ * cheap
+ */
+ public static int oreveinAttempts;
+ /**
+ * Control number of attempts to place a valid ore vein.
+ * <p>
+ * If a vein wasn't placed due to height restrictions, completely in the water, etc, another attempt is tried.
+ * </p>
+ */
+ public static int oreveinMaxPlacementAttempts;
+ /**
+ * Whether to place small ores as placer ores for an orevein
+ */
+ public static boolean oreveinPlacerOres;
+ /**
+ * Multiplier to control how many placer ores get generated.
+ */
+ public static int oreveinPlacerOresMultiplier;
+ /**
+ * Not really Constants, but they set using the Config and therefore should be constant (those are for the Debug
+ * Mode)
+ */
+ public static boolean D1 = false, D2 = false;
+ /**
+ * Debug parameter for cleanroom testing.
+ */
+ public static boolean debugCleanroom = false;
+ /**
+ * Debug parameter for driller testing.
+ */
+ public static boolean debugDriller = false;
+ /**
+ * Debug parameter for world generation. Tracks chunks added/removed from run queue.
+ */
+ public static boolean debugWorldGen = false;
+ /**
+ * Debug parameter for orevein generation.
+ */
+ public static boolean debugOrevein = false;
+ /**
+ * Debug parameter for small ore generation.
+ */
+ public static boolean debugSmallOres = false;
+ /**
+ * Debug parameter for stones generation.
+ */
+ public static boolean debugStones = false;
+ /**
+ * Debug parameter for single block pump
+ */
+ public static boolean debugBlockPump = false;
+ /**
+ * Debug parameter for single block miner
+ */
+ public static boolean debugBlockMiner = false;
+ /**
+ * Debug parameter for entity cramming reduction
+ */
+ public static boolean debugEntityCramming = false;
+ /**
+ * Debug parameter for {@link gregtech.api.util.GT_ChunkAssociatedData}
+ */
+ public static boolean debugWorldData = false;
+ /**
+ * Parameter if multi tile entities (MuTEs) should be enabled in the pack. Turned off by default until
+ * implementation is done.
+ */
+ public static boolean enableMultiTileEntities = false;
+ /**
+ * Number of ticks between sending sound packets to clients for electric machines. Default is 1.5 seconds. Trying to
+ * mitigate lag and FPS drops.
+ */
+ public static int ticksBetweenSounds = 30;
+ /**
+ * If you have to give something a World Parameter but there is no World... (Dummy World)
+ */
+ public static World DW;
+
+ /**
+ * This will prevent NEI from crashing but spams the Log.
+ */
+ public static boolean allow_broken_recipemap = false;
+ /**
+ * This will set the percentage how much ReinforcedGlass is Allowed in Cleanroom Walls.
+ */
+ public static float cleanroomGlass = 5.0f;
+ /**
+ * This will let machines such as drills and pumps chunkload their work area.
+ */
+ public static boolean enableChunkloaders = true;
+ /**
+ * This will make all chunkloading machines act as World Anchors (true) or Passive Anchors (false)
+ */
+ public static boolean alwaysReloadChunkloaders = false;
+
+ public static boolean debugChunkloaders = false;
+ public static boolean cls_enabled;
+ public static final Set<String> mCTMEnabledBlock = new HashSet<>();
+ public static final Set<String> mCTMDisabledBlock = new HashSet<>();
+
+ public static final int STEAM_PER_WATER = 160;
+ /**
+ * If true, then digital chest with AE2 storage bus will be accessible only through AE2
+ */
+ public static boolean disableDigitalChestsExternalAccess = false;
+
+ public static boolean lateConfigSave = true;
+ public static boolean worldTickHappened = false;
+
+ public static final int[] emptyIntArray = new int[0];
+
+ public static final IFluidTank[] emptyFluidTank = new IFluidTank[0];
+ public static final FluidTankGT[] emptyFluidTankGT = new FluidTankGT[0];
+ public static final FluidTankInfo[] emptyFluidTankInfo = new FluidTankInfo[0];
+ public static final FluidStack[] emptyFluidStack = new FluidStack[0];
+ public static final ItemStack[] emptyItemStackArray = new ItemStack[0];
+ public static final IIconContainer[] emptyIconContainerArray = new IIconContainer[3];
+
+ /**
+ * Pretty formatting for author names.
+ */
+ public static final String Colen = "" + EnumChatFormatting.DARK_RED
+ + EnumChatFormatting.BOLD
+ + EnumChatFormatting.ITALIC
+ + EnumChatFormatting.UNDERLINE
+ + "C"
+ + EnumChatFormatting.GOLD
+ + EnumChatFormatting.BOLD
+ + EnumChatFormatting.ITALIC
+ + EnumChatFormatting.UNDERLINE
+ + "o"
+ + EnumChatFormatting.GREEN
+ + EnumChatFormatting.BOLD
+ + EnumChatFormatting.ITALIC
+ + EnumChatFormatting.UNDERLINE
+ + "l"
+ + EnumChatFormatting.DARK_AQUA
+ + EnumChatFormatting.BOLD
+ + EnumChatFormatting.ITALIC
+ + EnumChatFormatting.UNDERLINE
+ + "e"
+ + EnumChatFormatting.DARK_PURPLE
+ + EnumChatFormatting.BOLD
+ + EnumChatFormatting.ITALIC
+ + EnumChatFormatting.UNDERLINE
+ + "n";
+
+ public static final String AuthorColen = "Author: " + Colen;
+ public static final String AuthorKuba = "Author: " + EnumChatFormatting.DARK_RED
+ + EnumChatFormatting.BOLD
+ + "k"
+ + EnumChatFormatting.RED
+ + EnumChatFormatting.BOLD
+ + "u"
+ + EnumChatFormatting.GOLD
+ + EnumChatFormatting.BOLD
+ + "b"
+ + EnumChatFormatting.YELLOW
+ + EnumChatFormatting.BOLD
+ + "a"
+ + EnumChatFormatting.DARK_GREEN
+ + EnumChatFormatting.BOLD
+ + "6"
+ + EnumChatFormatting.GREEN
+ + EnumChatFormatting.BOLD
+ + "0"
+ + EnumChatFormatting.AQUA
+ + EnumChatFormatting.BOLD
+ + "0"
+ + EnumChatFormatting.DARK_AQUA
+ + EnumChatFormatting.BOLD
+ + "0";
+
+ public static final String AuthorBlueWeabo = "Author: " + EnumChatFormatting.BLUE
+ + EnumChatFormatting.BOLD
+ + "Blue"
+ + EnumChatFormatting.AQUA
+ + EnumChatFormatting.BOLD
+ + "Weabo";
+
+ public static final String Authorminecraft7771 = "Author: " + EnumChatFormatting.BLUE
+ + EnumChatFormatting.LIGHT_PURPLE
+ + "minecraft7771";
+
+ public static final String AuthorQuerns = "Author: " + EnumChatFormatting.RED + "Querns";
+ public static final String AuthorSilverMoon = "Author: " + EnumChatFormatting.AQUA + "SilverMoon";
+ public static final String AuthorTheEpicGamer274 = "Author: " + "TheEpicGamer274";
+
+ // 7.5F comes from GT_Tool_Turbine_Large#getBaseDamage() given huge turbines are the most efficient now.
+ public static double getMaxPlasmaTurbineEfficiencyFromMaterial(Materials material) {
+ return (5F + (7.5F + material.mToolQuality)) / 10.0;
+ }
+
+ // Called once in GT_Client on world load, has to be called late so that Materials is populated.
+ public static void calculateMaxPlasmaTurbineEfficiency() {
+
+ ArrayList<Double> effArray = new ArrayList<>();
+
+ // Iteration seems to work but need to check turbine as all items appear null.
+ for (Materials material : Materials.values()) {
+ effArray.add(getMaxPlasmaTurbineEfficiencyFromMaterial(material));
+ }
+
+ maxPlasmaTurbineEfficiency = Collections.max(effArray);
+ }
+
+ private static double maxPlasmaTurbineEfficiency;
+
+ public static double getMaxPlasmaTurbineEfficiency() {
+ return maxPlasmaTurbineEfficiency;
+ }
+
+ private static final long[] EXPLOSION_LOOKUP_V = new long[] { V[0], V[1], V[2], V[3], V[4], V[4] * 2, V[5], V[6],
+ V[7], V[8], V[8] * 2, V[9], V[10], V[11], V[12], V[12] * 2, V[13], V[14], V[15] };
+ private static final float[] EXPLOSION_LOOKUP_POWER = new float[] { 1.0F, 2.0F, 3.0F, 4.0F, 5.0F, 6.0F, 7.0F, 8.0F,
+ 9.0F, 10.0F, 11.0F, 12.0F, 13.0F, 14.0F, 15.0F, 16.0F, 17.0F, 18.0F, 19.0F, 20.0F };
+
+ public static float getExplosionPowerForVoltage(long voltage) {
+ for (int i = 0; i < EXPLOSION_LOOKUP_V.length; i++) {
+ if (voltage < EXPLOSION_LOOKUP_V[i]) {
+ return EXPLOSION_LOOKUP_POWER[i];
+ }
+ }
+ return EXPLOSION_LOOKUP_POWER[EXPLOSION_LOOKUP_POWER.length - 1];
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/HeatingCoilLevel.java b/src/main/java/gregtech/api/enums/HeatingCoilLevel.java
new file mode 100644
index 0000000000..f281695d5a
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/HeatingCoilLevel.java
@@ -0,0 +1,101 @@
+package gregtech.api.enums;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.util.StatCollector;
+
+public enum HeatingCoilLevel {
+
+ None, // 0
+ ULV, // Not implemented 901
+ LV, // Cupronickel 1801
+ MV, // KANTHAL 2701
+ HV, // NICHROME 3601
+ EV, // TPVALLOY 4501
+ IV, // HSSG 5401
+ LuV, // HSSS 6301
+ ZPM, // NAQUADAH 7201
+ UV, // NAQUADAHALLOY 8101
+ UHV, // TRINIUM 9001
+ UEV, // ELECTRUMFLUX 9901
+ UIV, // AWAKENEDDRACONIUM 10801
+ UMV, // INFINITY 11701
+ UXV, // HYPOGEN 12601
+ MAX, // ETERNAL 13501
+ ;
+
+ private static final HeatingCoilLevel[] VALUES = values();
+
+ /**
+ * @return the coil heat, used for recipes in the Electronic Blast Furnace for example.
+ */
+ public long getHeat() {
+ return this == None ? 0 : 1L + (900L * this.ordinal());
+ }
+
+ /**
+ * @return the coil tier, used for discount in the Pyrolyse Oven for example. LV == 0
+ */
+ public byte getTier() {
+ return (byte) (this.ordinal() - 2);
+ }
+
+ /**
+ * @return the coil Level, used for Parallels in the Multi Furnace for example.
+ */
+ public byte getLevel() {
+ return (byte) (1 << Math.min(Math.max(0, this.ordinal() - 2), 4));
+ }
+
+ /**
+ * @return the coil Discount, used for discount in the Multi Furnace for example
+ */
+ public int getCostDiscount() {
+ return 1 << Math.max(0, this.ordinal() - 5);
+ }
+
+ /**
+ * @return Translated name of this coil
+ */
+ public String getName() {
+ return StatCollector.translateToLocal("GT5U.coil." + this);
+ }
+
+ @Nonnull
+ public static HeatingCoilLevel getFromTier(byte tier) {
+ if (tier < 0 || tier > getMaxTier()) return HeatingCoilLevel.None;
+
+ return VALUES[tier + 2];
+ }
+
+ /**
+ * @param applyColor Whether to apply tiered color
+ * @return Translated coil name. Heat exceeding MAX is represented as "Eternal+".
+ */
+ @Nonnull
+ public static String getDisplayNameFromHeat(int heat, boolean applyColor) {
+ for (HeatingCoilLevel heatLevel : VALUES) {
+ if (heatLevel == HeatingCoilLevel.None || heatLevel == HeatingCoilLevel.ULV) continue;
+ if (heatLevel.getHeat() >= heat) {
+ String name = heatLevel.getName();
+ if (applyColor) {
+ name = GT_Values.TIER_COLORS[heatLevel.getTier() + 1] + name;
+ }
+ return name;
+ }
+ }
+ String name = HeatingCoilLevel.MAX.getName() + "+";
+ if (applyColor) {
+ name = GT_Values.TIER_COLORS[HeatingCoilLevel.MAX.getTier() + 1] + name;
+ }
+ return name;
+ }
+
+ public static int size() {
+ return VALUES.length;
+ }
+
+ public static int getMaxTier() {
+ return VALUES.length - 1 - 2;
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/InventoryType.java b/src/main/java/gregtech/api/enums/InventoryType.java
new file mode 100644
index 0000000000..f8e3c47741
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/InventoryType.java
@@ -0,0 +1,7 @@
+package gregtech.api.enums;
+
+public enum InventoryType {
+ Input,
+ Output,
+ Both;
+}
diff --git a/src/main/java/gregtech/api/enums/ItemList.java b/src/main/java/gregtech/api/enums/ItemList.java
new file mode 100644
index 0000000000..0773afa693
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/ItemList.java
@@ -0,0 +1,2238 @@
+package gregtech.api.enums;
+
+import static gregtech.api.enums.GT_Values.NI;
+import static gregtech.api.enums.GT_Values.W;
+
+import java.util.Locale;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.interfaces.IItemContainer;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * Class containing all non-OreDict Items of GregTech.
+ */
+public enum ItemList implements IItemContainer {
+
+ Display_ITS_FREE,
+ Display_Fluid,
+ FR_Lemon,
+ FR_Mulch,
+ FR_Fertilizer,
+ FR_Compost,
+ FR_Silk,
+ FR_Wax,
+ FR_RefractoryWax,
+ FR_WaxCapsule,
+ FR_RefractoryCapsule,
+ FR_Stick,
+ FR_Casing_Impregnated,
+ FR_Casing_Sturdy,
+ FR_Casing_Hardened,
+ FR_Bee_Drone,
+ FR_Bee_Princess,
+ FR_Bee_Queen,
+ FR_Tree_Sapling,
+ FR_Butterfly,
+ FR_Larvae,
+ FR_Serum,
+ FR_Caterpillar,
+ FR_PollenFertile,
+ TF_LiveRoot,
+ TF_Vial_FieryBlood,
+ TF_Vial_FieryTears,
+ RC_ShuntingWire,
+ RC_ShuntingWireFrame,
+ RC_Rail_Reinforced,
+ RC_Rail_Electric,
+ RC_Rail_Standard,
+ RC_Rail_Wooden,
+ RC_Rail_Adv,
+ RC_Rail_HS,
+ RC_Tie_Wood,
+ RC_Tie_Stone,
+ RC_Bed_Wood,
+ RC_Bed_Stone,
+ RC_Rebar,
+ TC_Thaumometer,
+ IC2_Item_Casing_Tin,
+ IC2_Item_Casing_Copper,
+ IC2_Item_Casing_Iron,
+ IC2_Item_Casing_Steel,
+ IC2_Item_Casing_Lead,
+ IC2_Item_Casing_Bronze,
+ IC2_Item_Casing_Gold,
+ IC2_Spray_WeedEx,
+ IC2_Scrap,
+ IC2_Scrapbox,
+ IC2_Fertilizer,
+ IC2_Mixed_Metal_Ingot,
+ IC2_Hops,
+ IC2_Resin,
+ IC2_Plantball,
+ IC2_PlantballCompressed,
+ IC2_CoffeeBeans,
+ IC2_CoffeePowder,
+ IC2_Crop_Seeds,
+ IC2_Grin_Powder,
+ IC2_Energium_Dust,
+ IC2_Compressed_Coal_Ball,
+ IC2_Compressed_Coal_Chunk,
+ IC2_Fuel_Rod_Empty,
+ IC2_Food_Can_Empty,
+ IC2_Food_Can_Filled,
+ IC2_Food_Can_Spoiled,
+ IC2_ShaftIron,
+ IC2_ShaftSteel,
+ IC2_Industrial_Diamond,
+ IC2_ForgeHammer,
+ IC2_WireCutter,
+ IC2_SuBattery,
+ IC2_ReBattery,
+ IC2_AdvBattery,
+ IC2_EnergyCrystal,
+ IC2_LapotronCrystal,
+ Arrow_Head_Glass_Emtpy,
+ Arrow_Head_Glass_Poison,
+ Arrow_Head_Glass_Poison_Long,
+ Arrow_Head_Glass_Poison_Strong,
+ Arrow_Head_Glass_Slowness,
+ Arrow_Head_Glass_Slowness_Long,
+ Arrow_Head_Glass_Weakness,
+ Arrow_Head_Glass_Weakness_Long,
+ Arrow_Head_Glass_Holy_Water,
+ Arrow_Wooden_Glass_Emtpy,
+ Arrow_Wooden_Glass_Poison,
+ Arrow_Wooden_Glass_Poison_Long,
+ Arrow_Wooden_Glass_Poison_Strong,
+ Arrow_Wooden_Glass_Slowness,
+ Arrow_Wooden_Glass_Slowness_Long,
+ Arrow_Wooden_Glass_Weakness,
+ Arrow_Wooden_Glass_Weakness_Long,
+ Arrow_Wooden_Glass_Holy_Water,
+ Arrow_Plastic_Glass_Emtpy,
+ Arrow_Plastic_Glass_Poison,
+ Arrow_Plastic_Glass_Poison_Long,
+ Arrow_Plastic_Glass_Poison_Strong,
+ Arrow_Plastic_Glass_Slowness,
+ Arrow_Plastic_Glass_Slowness_Long,
+ Arrow_Plastic_Glass_Weakness,
+ Arrow_Plastic_Glass_Weakness_Long,
+ Arrow_Plastic_Glass_Holy_Water,
+ Shape_Empty,
+
+ Shape_Mold_Bottle,
+ Shape_Mold_Plate,
+ Shape_Mold_Ingot,
+ Shape_Mold_Casing,
+ Shape_Mold_Gear,
+ Shape_Mold_Gear_Small,
+ Shape_Mold_Credit,
+ Shape_Mold_Nugget,
+ Shape_Mold_Block,
+ Shape_Mold_Ball,
+ Shape_Mold_Bun,
+ Shape_Mold_Bread,
+ Shape_Mold_Baguette,
+ Shape_Mold_Cylinder,
+ Shape_Mold_Anvil,
+ Shape_Mold_Arrow,
+ Shape_Mold_Name,
+ Shape_Mold_Rod,
+ Shape_Mold_Bolt,
+ Shape_Mold_Round,
+ Shape_Mold_Screw,
+ Shape_Mold_Ring,
+ Shape_Mold_Rod_Long,
+ Shape_Mold_Rotor,
+ Shape_Mold_Turbine_Blade,
+ Shape_Mold_Pipe_Tiny,
+ Shape_Mold_Pipe_Small,
+ Shape_Mold_Pipe_Medium,
+ Shape_Mold_Pipe_Large,
+ Shape_Mold_Pipe_Huge,
+ Shape_Mold_ToolHeadDrill,
+ Shape_Slicer_Flat,
+ Shape_Slicer_Stripes,
+ Shape_Extruder_Bottle,
+ Shape_Extruder_Plate,
+ Shape_Extruder_Cell,
+ Shape_Extruder_Ring,
+ Shape_Extruder_Rod,
+ Shape_Extruder_Bolt,
+ Shape_Extruder_Ingot,
+ Shape_Extruder_Wire,
+ Shape_Extruder_Casing,
+ Shape_Extruder_Pipe_Tiny,
+ Shape_Extruder_Pipe_Small,
+ Shape_Extruder_Pipe_Medium,
+ Shape_Extruder_Pipe_Large,
+ Shape_Extruder_Pipe_Huge,
+ Shape_Extruder_Block,
+ Shape_Extruder_Sword,
+ Shape_Extruder_Pickaxe,
+ Shape_Extruder_Shovel,
+ Shape_Extruder_Axe,
+ Shape_Extruder_Hoe,
+ Shape_Extruder_Hammer,
+ Shape_Extruder_File,
+ Shape_Extruder_Saw,
+ Shape_Extruder_Gear,
+ Shape_Extruder_Rotor,
+ Shape_Extruder_Turbine_Blade,
+ Shape_Extruder_Small_Gear,
+ Shape_Extruder_ToolHeadDrill,
+
+ White_Dwarf_Shape_Extruder_Bottle,
+ White_Dwarf_Shape_Extruder_Plate,
+ White_Dwarf_Shape_Extruder_Cell,
+ White_Dwarf_Shape_Extruder_Ring,
+ White_Dwarf_Shape_Extruder_Rod,
+ White_Dwarf_Shape_Extruder_Bolt,
+ White_Dwarf_Shape_Extruder_Ingot,
+ White_Dwarf_Shape_Extruder_Wire,
+ White_Dwarf_Shape_Extruder_Casing,
+ White_Dwarf_Shape_Extruder_Pipe_Tiny,
+ White_Dwarf_Shape_Extruder_Pipe_Small,
+ White_Dwarf_Shape_Extruder_Pipe_Medium,
+ White_Dwarf_Shape_Extruder_Pipe_Large,
+ White_Dwarf_Shape_Extruder_Pipe_Huge,
+ White_Dwarf_Shape_Extruder_Block,
+ White_Dwarf_Shape_Extruder_Sword,
+ White_Dwarf_Shape_Extruder_Pickaxe,
+ White_Dwarf_Shape_Extruder_Shovel,
+ White_Dwarf_Shape_Extruder_Axe,
+ White_Dwarf_Shape_Extruder_Hoe,
+ White_Dwarf_Shape_Extruder_Hammer,
+ White_Dwarf_Shape_Extruder_File,
+ White_Dwarf_Shape_Extruder_Saw,
+ White_Dwarf_Shape_Extruder_Gear,
+ White_Dwarf_Shape_Extruder_Rotor,
+ White_Dwarf_Shape_Extruder_Turbine_Blade,
+ White_Dwarf_Shape_Extruder_Small_Gear,
+ White_Dwarf_Shape_Extruder_ToolHeadDrill,
+
+ Crate_Empty,
+ Credit_Copper,
+ Credit_Iron,
+ Credit_Silver,
+ Credit_Gold,
+ Credit_Platinum,
+ Credit_Osmium,
+ Credit_Greg_Copper,
+ Credit_Greg_Cupronickel,
+ Credit_Greg_Silver,
+ Credit_Greg_Gold,
+ Credit_Greg_Platinum,
+ Credit_Greg_Osmium,
+ Credit_Greg_Naquadah,
+ Credit_Greg_Neutronium,
+ Coin_Gold_Ancient,
+ Coin_Doge,
+ Coin_Chocolate,
+ Cell_Universal_Fluid,
+ Cell_Empty,
+ Cell_Water,
+ Cell_Lava,
+ Cell_Air,
+ Large_Fluid_Cell_Steel,
+ Large_Fluid_Cell_TungstenSteel,
+ Large_Fluid_Cell_Aluminium,
+ Large_Fluid_Cell_StainlessSteel,
+ Large_Fluid_Cell_Titanium,
+ Large_Fluid_Cell_Chrome,
+ Large_Fluid_Cell_Iridium,
+ Large_Fluid_Cell_Osmium,
+ Large_Fluid_Cell_Neutronium,
+ ThermosCan_Empty,
+ ThermosCan_Dark_Coffee,
+ ThermosCan_Dark_Cafe_au_lait,
+ ThermosCan_Coffee,
+ ThermosCan_Cafe_au_lait,
+ ThermosCan_Lait_au_cafe,
+ ThermosCan_Dark_Chocolate_Milk,
+ ThermosCan_Chocolate_Milk,
+ ThermosCan_Tea,
+ ThermosCan_Sweet_Tea,
+ ThermosCan_Ice_Tea,
+ Bottle_Empty,
+ Bottle_Milk,
+ Bottle_Holy_Water,
+ Bottle_Purple_Drink,
+ Bottle_Grape_Juice,
+ Bottle_Wine,
+ Bottle_Vinegar,
+ Bottle_Potato_Juice,
+ Bottle_Vodka,
+ Bottle_Leninade,
+ Bottle_Mineral_Water,
+ Bottle_Salty_Water,
+ Bottle_Reed_Water,
+ Bottle_Rum,
+ Bottle_Pirate_Brew,
+ Bottle_Hops_Juice,
+ Bottle_Dark_Beer,
+ Bottle_Dragon_Blood,
+ Bottle_Wheaty_Juice,
+ Bottle_Scotch,
+ Bottle_Glen_McKenner,
+ Bottle_Wheaty_Hops_Juice,
+ Bottle_Beer,
+ Bottle_Chilly_Sauce,
+ Bottle_Hot_Sauce,
+ Bottle_Diabolo_Sauce,
+ Bottle_Diablo_Sauce,
+ Bottle_Snitches_Glitch_Sauce,
+ Bottle_Apple_Juice,
+ Bottle_Cider,
+ Bottle_Golden_Apple_Juice,
+ Bottle_Golden_Cider,
+ Bottle_Iduns_Apple_Juice,
+ Bottle_Notches_Brew,
+ Bottle_Lemon_Juice,
+ Bottle_Limoncello,
+ Bottle_Lemonade,
+ Bottle_Alcopops,
+ Bottle_Cave_Johnsons_Grenade_Juice,
+ Food_Potato_On_Stick,
+ Food_Potato_On_Stick_Roasted,
+ Food_Fries,
+ Food_ChiliChips,
+ Food_PotatoChips,
+ Food_Baked_Potato,
+ Food_Poisonous_Potato,
+ Food_Cheese,
+ Food_Chum,
+ Food_Chum_On_Stick,
+ Food_Dough,
+ Food_Dough_Sugar,
+ Food_Dough_Chocolate,
+ Food_Raw_Cookie,
+ Food_Flat_Dough,
+ Food_Burger_Veggie,
+ Food_Burger_Cheese,
+ Food_Burger_Meat,
+ Food_Burger_Chum,
+ Food_Sandwich_Veggie,
+ Food_Sandwich_Cheese,
+ Food_Sandwich_Bacon,
+ Food_Sandwich_Steak,
+ Food_Large_Sandwich_Veggie,
+ Food_Large_Sandwich_Cheese,
+ Food_Large_Sandwich_Bacon,
+ Food_Large_Sandwich_Steak,
+ Food_Sliced_Lemon,
+ Food_Sliced_Tomato,
+ Food_Sliced_Onion,
+ Food_Sliced_Cucumber,
+ Food_Sliced_Cheese,
+ Food_Sliced_Bread,
+ Food_Sliced_Bun,
+ Food_Sliced_Baguette,
+ Food_Sliced_Breads,
+ Food_Sliced_Buns,
+ Food_Sliced_Baguettes,
+ Food_Packaged_Fries,
+ Food_Packaged_PotatoChips,
+ Food_Packaged_ChiliChips,
+ Food_Raw_Potato,
+ Food_Raw_Fries,
+ Food_Raw_PotatoChips,
+ Food_Raw_Bread,
+ Food_Raw_Bun,
+ Food_Raw_Baguette,
+ Food_Raw_Cake,
+ Food_Raw_Pizza_Veggie,
+ Food_Raw_Pizza_Cheese,
+ Food_Raw_Pizza_Meat,
+ Food_Baked_Bread,
+ Food_Baked_Bun,
+ Food_Baked_Baguette,
+ Food_Baked_Cake,
+ Food_Baked_Pizza_Veggie,
+ Food_Baked_Pizza_Cheese,
+ Food_Baked_Pizza_Meat,
+ Crop_Drop_Argentia,
+ Crop_Drop_Plumbilia,
+ Crop_Drop_Indigo,
+ Crop_Drop_Ferru,
+ Crop_Drop_Aurelia,
+ Crop_Drop_OilBerry,
+ Crop_Drop_MilkWart,
+ Crop_Drop_BobsYerUncleRanks,
+ Crop_Drop_Coppon,
+ Crop_Drop_Tine,
+ Crop_Drop_Chilly,
+ Crop_Drop_Lemon,
+ Crop_Drop_Onion,
+ Crop_Drop_Tomato,
+ Crop_Drop_MTomato,
+ Crop_Drop_Grapes,
+ Crop_Drop_TeaLeaf,
+ Crop_Drop_Cucumber,
+ Crop_Drop_Rape,
+ Schematic,
+ Schematic_Crafting,
+ Schematic_1by1,
+ Schematic_2by2,
+ Schematic_3by3,
+ Schematic_Dust,
+
+ GigaChad,
+
+ Circuit_Integrated,
+ Circuit_Board_Basic,
+ Circuit_Board_Advanced,
+ Circuit_Board_Elite,
+ Circuit_Parts_Advanced,
+ Circuit_Parts_Wiring_Basic,
+ Circuit_Parts_Wiring_Advanced,
+ Circuit_Parts_Wiring_Elite,
+ Circuit_Parts_Crystal_Chip_Elite,
+ Circuit_Parts_Crystal_Chip_Master,
+ Circuit_Parts_Crystal_Chip_Wetware,
+ Circuit_Primitive,
+ Circuit_Basic,
+ Circuit_Good,
+ Circuit_Advanced,
+ Circuit_Data,
+ Circuit_Elite,
+ Circuit_Master,
+ Circuit_Ultimate,
+ Circuit_Biowarecomputer,
+ Circuit_Biowaresupercomputer,
+
+ Rotor_LV, // these aren't actually used
+ Rotor_MV,
+ Rotor_HV,
+ Rotor_EV,
+ Rotor_IV,
+
+ Electric_Motor_LV,
+ Electric_Motor_MV,
+ Electric_Motor_HV,
+ Electric_Motor_EV,
+ Electric_Motor_IV,
+ Electric_Motor_LuV,
+ Electric_Motor_ZPM,
+ Electric_Motor_UV,
+ Electric_Motor_UHV,
+ Electric_Motor_UEV,
+ Electric_Motor_UIV,
+ Electric_Motor_UMV,
+ Electric_Motor_UXV,
+ Electric_Motor_MAX,
+
+ Electric_Pump_LV,
+ Electric_Pump_MV,
+ Electric_Pump_HV,
+ Electric_Pump_EV,
+ Electric_Pump_IV,
+ Electric_Pump_LuV,
+ Electric_Pump_ZPM,
+ Electric_Pump_UV,
+ Electric_Pump_UHV,
+ Electric_Pump_UEV,
+ Electric_Pump_UIV,
+ Electric_Pump_UMV,
+ Electric_Pump_UXV,
+ Electric_Pump_MAX,
+
+ Tesseract,
+ EnergisedTesseract,
+ Timepiece,
+
+ Steam_Valve_LV,
+ Steam_Valve_MV,
+ Steam_Valve_HV,
+ Steam_Valve_EV,
+ Steam_Valve_IV,
+
+ Steam_Regulator_LV,
+ Steam_Regulator_MV,
+ Steam_Regulator_HV,
+ Steam_Regulator_EV,
+ Steam_Regulator_IV,
+
+ FluidRegulator_LV,
+ FluidRegulator_MV,
+ FluidRegulator_HV,
+ FluidRegulator_EV,
+ FluidRegulator_IV,
+ FluidRegulator_LuV,
+ FluidRegulator_ZPM,
+ FluidRegulator_UV,
+
+ Conveyor_Module_LV,
+ Conveyor_Module_MV,
+ Conveyor_Module_HV,
+ Conveyor_Module_EV,
+ Conveyor_Module_IV,
+ Conveyor_Module_LuV,
+ Conveyor_Module_ZPM,
+ Conveyor_Module_UV,
+ Conveyor_Module_UHV,
+ Conveyor_Module_UEV,
+ Conveyor_Module_UIV,
+ Conveyor_Module_UMV,
+ Conveyor_Module_UXV,
+ Conveyor_Module_MAX,
+
+ Electric_Piston_LV,
+ Electric_Piston_MV,
+ Electric_Piston_HV,
+ Electric_Piston_EV,
+ Electric_Piston_IV,
+ Electric_Piston_LuV,
+ Electric_Piston_ZPM,
+ Electric_Piston_UV,
+ Electric_Piston_UHV,
+ Electric_Piston_UEV,
+ Electric_Piston_UIV,
+ Electric_Piston_UMV,
+ Electric_Piston_UXV,
+ Electric_Piston_MAX,
+
+ Robot_Arm_LV,
+ Robot_Arm_MV,
+ Robot_Arm_HV,
+ Robot_Arm_EV,
+ Robot_Arm_IV,
+ Robot_Arm_LuV,
+ Robot_Arm_ZPM,
+ Robot_Arm_UV,
+ Robot_Arm_UHV,
+ Robot_Arm_UEV,
+ Robot_Arm_UIV,
+ Robot_Arm_UMV,
+ Robot_Arm_UXV,
+ Robot_Arm_MAX,
+
+ Emitter_LV,
+ Emitter_MV,
+ Emitter_HV,
+ Emitter_EV,
+ Emitter_IV,
+ Emitter_LuV,
+ Emitter_ZPM,
+ Emitter_UV,
+ Emitter_UHV,
+ Emitter_UEV,
+ Emitter_UIV,
+ Emitter_UMV,
+ Emitter_UXV,
+ Emitter_MAX,
+
+ Sensor_LV,
+ Sensor_MV,
+ Sensor_HV,
+ Sensor_EV,
+ Sensor_IV,
+ Sensor_LuV,
+ Sensor_ZPM,
+ Sensor_UV,
+ Sensor_UHV,
+ Sensor_UEV,
+ Sensor_UIV,
+ Sensor_UMV,
+ Sensor_UXV,
+ Sensor_MAX,
+
+ Field_Generator_LV,
+ Field_Generator_MV,
+ Field_Generator_HV,
+ Field_Generator_EV,
+ Field_Generator_IV,
+ Field_Generator_LuV,
+ Field_Generator_ZPM,
+ Field_Generator_UV,
+ Field_Generator_UHV,
+ Field_Generator_UEV,
+ Field_Generator_UIV,
+ Field_Generator_UMV,
+ Field_Generator_UXV,
+ Field_Generator_MAX,
+
+ StableAdhesive,
+ SuperconductorComposite,
+ NaquadriaSupersolid,
+
+ Battery_Hull_LV,
+ Battery_Hull_MV,
+ Battery_Hull_HV,
+
+ Battery_SU_LV_SulfuricAcid,
+ Battery_SU_LV_Mercury,
+ Battery_SU_MV_SulfuricAcid,
+ Battery_SU_MV_Mercury,
+ Battery_SU_HV_SulfuricAcid,
+ Battery_SU_HV_Mercury,
+ Battery_RE_ULV_Tantalum,
+ Battery_RE_LV_Cadmium,
+ Battery_RE_LV_Lithium,
+ Battery_RE_LV_Sodium,
+ Battery_RE_MV_Cadmium,
+ Battery_RE_MV_Lithium,
+ Battery_RE_MV_Sodium,
+ Battery_RE_HV_Cadmium,
+ Battery_RE_HV_Lithium,
+ Battery_RE_HV_Sodium,
+ ZPM,
+ Fuel_Can_Plastic_Empty,
+ Fuel_Can_Plastic_Filled,
+ Upgrade_Battery,
+ Upgrade_Overclocker,
+ Upgrade_Muffler,
+ Upgrade_SteamEngine,
+ Upgrade_Lock,
+ Cover_FluidLimiter,
+ Cover_Controller,
+ Cover_ActivityDetector,
+ Cover_FluidDetector,
+ Cover_ItemDetector,
+ Cover_EnergyDetector,
+ Cover_FluidStorageMonitor,
+ Cover_Drain,
+ Cover_Shutter,
+ Cover_Crafting,
+ Cover_Screen,
+ Cover_SolarPanel,
+ Cover_SolarPanel_8V,
+ Cover_SolarPanel_LV,
+ Cover_SolarPanel_MV,
+ Cover_SolarPanel_HV,
+ Cover_SolarPanel_EV,
+ Cover_SolarPanel_IV,
+ Cover_SolarPanel_LuV,
+ Cover_SolarPanel_ZPM,
+ Cover_SolarPanel_UV,
+ Cover_SolarPanel_UHV,
+ Cover_SolarPanel_UEV,
+ Cover_SolarPanel_UIV,
+ Ingot_IridiumAlloy,
+ Plank_Oak,
+ Plank_Spruce,
+ Plank_Birch,
+ Plank_Jungle,
+ Plank_Acacia,
+ Plank_DarkOak,
+ Plank_Larch,
+ Plank_Teak,
+ Plank_Acacia_Green,
+ Plank_Lime,
+ Plank_Chestnut,
+ Plank_Wenge,
+ Plank_Baobab,
+ Plank_Sequoia,
+ Plank_Kapok,
+ Plank_Ebony,
+ Plank_Mahagony,
+ Plank_Balsa,
+ Plank_Willow,
+ Plank_Walnut,
+ Plank_Greenheart,
+ Plank_Cherry,
+ Plank_Mahoe,
+ Plank_Poplar,
+ Plank_Palm,
+ Plank_Papaya,
+ Plank_Pine,
+ Plank_Plum,
+ Plank_Maple,
+ Plank_Citrus,
+ Dye_Indigo,
+ Dye_SquidInk,
+ Dye_Bonemeal,
+ Dye_Cocoa,
+ Duct_Tape,
+ Book_Written_00,
+ Book_Written_01,
+ Book_Written_02,
+ Book_Written_03,
+ Paper_Printed_Pages,
+ Paper_Magic_Empty,
+ Paper_Magic_Page,
+ Paper_Magic_Pages,
+ Paper_Punch_Card_Empty,
+ Paper_Punch_Card_Encoded,
+ McGuffium_239,
+ Tool_Cover_Copy_Paste,
+ NC_SensorCard,
+ NC_SensorKit,
+ Tool_Matches,
+ Tool_MatchBox_Used,
+ Tool_MatchBox_Full,
+ Tool_Lighter_Invar_Empty,
+ Tool_Lighter_Invar_Used,
+ Tool_Lighter_Invar_Full,
+ Tool_Lighter_Platinum_Empty,
+ Tool_Lighter_Platinum_Used,
+ Tool_Lighter_Platinum_Full,
+ Tool_Cheat,
+ Tool_Scanner,
+ Tool_DataOrb,
+ Tool_DataStick,
+ Tool_Sonictron,
+ Tool_Sword_Bronze,
+ Tool_Pickaxe_Bronze,
+ Tool_Shovel_Bronze,
+ Tool_Axe_Bronze,
+ Tool_Hoe_Bronze,
+ Tool_Sword_Steel,
+ Tool_Pickaxe_Steel,
+ Tool_Shovel_Steel,
+ Tool_Axe_Steel,
+ Tool_Hoe_Steel,
+
+ Spray_Empty,
+ Spray_Bug,
+ Spray_Ice,
+ Spray_Hardener,
+ Spray_CFoam,
+ Spray_Pepper,
+ Spray_Hydration,
+
+ Color_00,
+ Color_01,
+ Color_02,
+ Color_03,
+ Color_04,
+ Color_05,
+ Color_06,
+ Color_07,
+ Color_08,
+ Color_09,
+ Color_10,
+ Color_11,
+ Color_12,
+ Color_13,
+ Color_14,
+ Color_15,
+
+ Spray_Color_00,
+ Spray_Color_01,
+ Spray_Color_02,
+ Spray_Color_03,
+ Spray_Color_04,
+ Spray_Color_05,
+ Spray_Color_06,
+ Spray_Color_07,
+ Spray_Color_08,
+ Spray_Color_09,
+ Spray_Color_10,
+ Spray_Color_11,
+ Spray_Color_12,
+ Spray_Color_13,
+ Spray_Color_14,
+ Spray_Color_15,
+ Spray_Color_Remover,
+
+ Spray_Color_Used_00,
+ Spray_Color_Used_01,
+ Spray_Color_Used_02,
+ Spray_Color_Used_03,
+ Spray_Color_Used_04,
+ Spray_Color_Used_05,
+ Spray_Color_Used_06,
+ Spray_Color_Used_07,
+ Spray_Color_Used_08,
+ Spray_Color_Used_09,
+ Spray_Color_Used_10,
+ Spray_Color_Used_11,
+ Spray_Color_Used_12,
+ Spray_Color_Used_13,
+ Spray_Color_Used_14,
+ Spray_Color_Used_15,
+ Spray_Color_Used_Remover,
+
+ Spray_Color_Remover_Empty,
+
+ Armor_Cheat,
+ Armor_Cloaking,
+ Armor_Lamp,
+ Armor_LithiumPack,
+ Armor_LapotronicPack,
+ Armor_ForceField,
+ Energy_LapotronicOrb,
+ Reactor_NeutronReflector,
+ Component_Turbine_Bronze,
+ Component_Turbine_Steel,
+ Component_Turbine_Magnalium,
+ Component_Turbine_TungstenSteel,
+ Component_Turbine_Carbon,
+ Component_LavaFilter,
+ Component_Sawblade_Diamond,
+ Component_Grinder_Diamond,
+ Component_Grinder_Tungsten,
+ Component_Filter,
+ Component_Minecart_Wheels_Iron,
+ Component_Minecart_Wheels_Steel,
+
+ Generator_Diesel_LV,
+ Generator_Diesel_MV,
+ Generator_Diesel_HV,
+ Generator_Gas_Turbine_LV,
+ Generator_Gas_Turbine_MV,
+ Generator_Gas_Turbine_HV,
+ Generator_Gas_Turbine_EV,
+ Generator_Gas_Turbine_IV,
+ Generator_Steam_Turbine_LV,
+ Generator_Steam_Turbine_MV,
+ Generator_Steam_Turbine_HV,
+ Generator_Naquadah_Mark_I,
+ Generator_Naquadah_Mark_II,
+ Generator_Naquadah_Mark_III,
+ Generator_Naquadah_Mark_IV,
+ Generator_Naquadah_Mark_V,
+ // Generator_Naquadah_Mark_VI,
+ Machine_Bronze_Boiler,
+ Machine_Bronze_Boiler_Solar,
+ Machine_HP_Solar,
+ Machine_Bronze_CraftingTable,
+ Machine_Bronze_Furnace,
+ Machine_Bronze_Macerator,
+ Machine_Bronze_Extractor,
+ Machine_Bronze_Hammer,
+ Machine_Bronze_Compressor,
+ Machine_Bronze_AlloySmelter,
+ Machine_Bricked_BlastFurnace,
+ Machine_Steel_Boiler_Lava,
+ Machine_Steel_Boiler,
+ Machine_HP_Furnace,
+ Machine_HP_Macerator,
+ Machine_HP_Extractor,
+ Machine_HP_Hammer,
+ Machine_HP_Compressor,
+ Machine_HP_AlloySmelter,
+
+ Hull_Bronze,
+ Hull_HP,
+ Hull_Bronze_Bricks,
+ Hull_HP_Bricks,
+
+ Transformer_LV_ULV,
+ Transformer_MV_LV,
+ Transformer_HV_MV,
+ Transformer_EV_HV,
+ Transformer_IV_EV,
+ Transformer_LuV_IV,
+ Transformer_ZPM_LuV,
+ Transformer_UV_ZPM,
+ Transformer_MAX_UV,
+
+ Casing_ULV,
+ Casing_LV,
+ Casing_MV,
+ Casing_HV,
+ Casing_EV,
+ Casing_IV,
+ Casing_LuV,
+ Casing_ZPM,
+ Casing_UV,
+ Casing_MAX,
+ Casing_BronzePlatedBricks,
+ Casing_HeatProof,
+ Casing_Dim_Trans,
+ Casing_Dim_Injector,
+ Casing_Dim_Bridge,
+ Casing_Coil_Superconductor,
+
+ Casing_SolidSteel,
+ Casing_FrostProof,
+ Casing_Gearbox_Bronze,
+ Casing_Gearbox_Steel,
+ Casing_Gearbox_Titanium,
+ Casing_Gearbox_TungstenSteel,
+ Casing_Processor,
+ Casing_DataDrive,
+ Casing_ContainmentField,
+ Casing_Assembler,
+ Casing_Pump,
+ Casing_Motor,
+ Casing_Pipe_Bronze,
+ Casing_Pipe_Steel,
+ Casing_Pipe_Titanium,
+ Casing_Pipe_TungstenSteel,
+ Casing_Pipe_Polytetrafluoroethylene,
+ Casing_Pipe_Polybenzimidazole,
+
+ Casing_Stripes_A,
+ Casing_Stripes_B,
+ Casing_RadioactiveHazard,
+ Casing_BioHazard,
+ Casing_ExplosionHazard,
+ Casing_FireHazard,
+ Casing_AcidHazard,
+ Casing_MagicHazard,
+ Casing_FrostHazard,
+ Casing_NoiseHazard,
+ Casing_Grate,
+ Casing_Vent,
+ Casing_Vent_T2,
+ Casing_RadiationProof,
+ Casing_AdvancedRadiationProof,
+ Casing_Firebox_Bronze,
+ Casing_Firebox_Steel,
+ Casing_Firebox_TungstenSteel,
+ Casing_Chemically_Inert,
+
+ Casing_MiningOsmiridium,
+ Casing_RobustTungstenSteel,
+ Casing_CleanStainlessSteel,
+ Casing_StableTitanium,
+ Casing_Firebox_Titanium,
+ Casing_MiningNeutronium,
+ Casing_MiningBlackPlutonium,
+ Casing_Advanced_Rhodium_Palladium,
+ Casing_Advanced_Iridium,
+ Casing_Magical,
+
+ Hull_ULV,
+ Hull_LV,
+ Hull_MV,
+ Hull_HV,
+ Hull_EV,
+ Hull_IV,
+ Hull_LuV,
+ Hull_ZPM,
+ Hull_UV,
+ Hull_MAX,
+
+ CompressedFireclay,
+ Firebrick,
+ Casing_Firebricks,
+
+ Automation_Filter_ULV,
+ Automation_Filter_LV,
+ Automation_Filter_MV,
+ Automation_Filter_HV,
+ Automation_Filter_EV,
+ Automation_Filter_IV,
+ Automation_Filter_LuV,
+ Automation_Filter_ZPM,
+ Automation_Filter_UV,
+ Automation_Filter_MAX,
+
+ Automation_TypeFilter_ULV,
+ Automation_TypeFilter_LV,
+ Automation_TypeFilter_MV,
+ Automation_TypeFilter_HV,
+ Automation_TypeFilter_EV,
+ Automation_TypeFilter_IV,
+ Automation_TypeFilter_LuV,
+ Automation_TypeFilter_ZPM,
+ Automation_TypeFilter_UV,
+ Automation_TypeFilter_MAX,
+
+ Automation_ChestBuffer_ULV,
+ Automation_ChestBuffer_LV,
+ Automation_ChestBuffer_MV,
+ Automation_ChestBuffer_HV,
+ Automation_ChestBuffer_EV,
+ Automation_ChestBuffer_IV,
+ Automation_ChestBuffer_LuV,
+ Automation_ChestBuffer_ZPM,
+ Automation_ChestBuffer_UV,
+ Automation_ChestBuffer_MAX,
+
+ Automation_SuperBuffer_ULV,
+ Automation_SuperBuffer_LV,
+ Automation_SuperBuffer_MV,
+ Automation_SuperBuffer_HV,
+ Automation_SuperBuffer_EV,
+ Automation_SuperBuffer_IV,
+ Automation_SuperBuffer_LuV,
+ Automation_SuperBuffer_ZPM,
+ Automation_SuperBuffer_UV,
+ Automation_SuperBuffer_MAX,
+
+ Automation_Regulator_ULV,
+ Automation_Regulator_LV,
+ Automation_Regulator_MV,
+ Automation_Regulator_HV,
+ Automation_Regulator_EV,
+ Automation_Regulator_IV,
+ Automation_Regulator_LuV,
+ Automation_Regulator_ZPM,
+ Automation_Regulator_UV,
+ Automation_Regulator_MAX,
+
+ Automation_ItemDistributor_ULV,
+ Automation_ItemDistributor_LV,
+ Automation_ItemDistributor_MV,
+ Automation_ItemDistributor_HV,
+ Automation_ItemDistributor_EV,
+ Automation_ItemDistributor_IV,
+ Automation_ItemDistributor_LuV,
+ Automation_ItemDistributor_ZPM,
+ Automation_ItemDistributor_UV,
+ Automation_ItemDistributor_MAX,
+
+ Automation_RecipeFilter_ULV,
+ Automation_RecipeFilter_LV,
+ Automation_RecipeFilter_MV,
+ Automation_RecipeFilter_HV,
+ Automation_RecipeFilter_EV,
+ Automation_RecipeFilter_IV,
+ Automation_RecipeFilter_LuV,
+ Automation_RecipeFilter_ZPM,
+ Automation_RecipeFilter_UV,
+ Automation_RecipeFilter_MAX,
+
+ Hatch_Dynamo_ULV,
+ Hatch_Dynamo_LV,
+ Hatch_Dynamo_MV,
+ Hatch_Dynamo_HV,
+ Hatch_Dynamo_EV,
+ Hatch_Dynamo_IV,
+ Hatch_Dynamo_LuV,
+ Hatch_Dynamo_ZPM,
+ Hatch_Dynamo_UV,
+ Hatch_Dynamo_MAX,
+
+ Hatch_Energy_ULV,
+ Hatch_Energy_LV,
+ Hatch_Energy_MV,
+ Hatch_Energy_HV,
+ Hatch_Energy_EV,
+ Hatch_Energy_IV,
+ Hatch_Energy_LuV,
+ Hatch_Energy_ZPM,
+ Hatch_Energy_UV,
+ Hatch_Energy_MAX,
+
+ Wireless_Hatch_Energy_ULV,
+ Wireless_Hatch_Energy_LV,
+ Wireless_Hatch_Energy_MV,
+ Wireless_Hatch_Energy_HV,
+ Wireless_Hatch_Energy_EV,
+ Wireless_Hatch_Energy_IV,
+ Wireless_Hatch_Energy_LuV,
+ Wireless_Hatch_Energy_ZPM,
+ Wireless_Hatch_Energy_UV,
+ Wireless_Hatch_Energy_UHV,
+ Wireless_Hatch_Energy_UEV,
+ Wireless_Hatch_Energy_UIV,
+ Wireless_Hatch_Energy_UMV,
+ Wireless_Hatch_Energy_UXV,
+ Wireless_Hatch_Energy_MAX,
+
+ Wireless_Dynamo_Energy_ULV,
+ Wireless_Dynamo_Energy_LV,
+ Wireless_Dynamo_Energy_MV,
+ Wireless_Dynamo_Energy_HV,
+ Wireless_Dynamo_Energy_EV,
+ Wireless_Dynamo_Energy_IV,
+ Wireless_Dynamo_Energy_LuV,
+ Wireless_Dynamo_Energy_ZPM,
+ Wireless_Dynamo_Energy_UV,
+ Wireless_Dynamo_Energy_UHV,
+ Wireless_Dynamo_Energy_UEV,
+ Wireless_Dynamo_Energy_UIV,
+ Wireless_Dynamo_Energy_UMV,
+ Wireless_Dynamo_Energy_UXV,
+ Wireless_Dynamo_Energy_MAX,
+
+ Hatch_Input_ULV,
+ Hatch_Input_LV,
+ Hatch_Input_MV,
+ Hatch_Input_HV,
+ Hatch_Input_EV,
+ Hatch_Input_IV,
+ Hatch_Input_LuV,
+ Hatch_Input_ZPM,
+ Hatch_Input_UV,
+ Hatch_Input_MAX,
+
+ Hatch_Input_Multi_2x2_EV,
+ Hatch_Input_Multi_2x2_IV,
+ Hatch_Input_Multi_2x2_LuV,
+ Hatch_Input_Multi_2x2_ZPM,
+ Hatch_Input_Multi_2x2_UV,
+ Hatch_Input_Multi_2x2_UHV,
+ Hatch_Input_Multi_2x2_UEV,
+ Hatch_Input_Multi_2x2_UIV,
+ Hatch_Input_Multi_2x2_UMV,
+ Hatch_Input_Multi_2x2_UXV,
+ Hatch_Input_Multi_2x2_Humongous,
+
+ Hatch_Input_Bus_ULV,
+ Hatch_Input_Bus_LV,
+ Hatch_Input_Bus_MV,
+ Hatch_Input_Bus_HV,
+ Hatch_Input_Bus_EV,
+ Hatch_Input_Bus_IV,
+ Hatch_Input_Bus_LuV,
+ Hatch_Input_Bus_ZPM,
+ Hatch_Input_Bus_UV,
+ Hatch_Input_Bus_MAX,
+
+ Hatch_Output_ULV,
+ Hatch_Output_LV,
+ Hatch_Output_MV,
+ Hatch_Output_HV,
+ Hatch_Output_EV,
+ Hatch_Output_IV,
+ Hatch_Output_LuV,
+ Hatch_Output_ZPM,
+ Hatch_Output_UV,
+ Hatch_Output_MAX,
+
+ Hatch_Output_Bus_ULV,
+ Hatch_Output_Bus_LV,
+ Hatch_Output_Bus_MV,
+ Hatch_Output_Bus_HV,
+ Hatch_Output_Bus_EV,
+ Hatch_Output_Bus_IV,
+ Hatch_Output_Bus_LuV,
+ Hatch_Output_Bus_ZPM,
+ Hatch_Output_Bus_UV,
+ Hatch_Output_Bus_MAX,
+
+ Hatch_Muffler_LV,
+ Hatch_Muffler_MV,
+ Hatch_Muffler_HV,
+ Hatch_Muffler_EV,
+ Hatch_Muffler_IV,
+ Hatch_Muffler_LuV,
+ Hatch_Muffler_ZPM,
+ Hatch_Muffler_UV,
+ Hatch_Muffler_MAX,
+
+ Hatch_Maintenance,
+ Hatch_DataAccess_EV,
+ Hatch_DataAccess_LuV,
+ Hatch_DataAccess_UV,
+
+ Battery_Buffer_1by1_ULV,
+ Battery_Buffer_1by1_LV,
+ Battery_Buffer_1by1_MV,
+ Battery_Buffer_1by1_HV,
+ Battery_Buffer_1by1_EV,
+ Battery_Buffer_1by1_IV,
+ Battery_Buffer_1by1_LuV,
+ Battery_Buffer_1by1_ZPM,
+ Battery_Buffer_1by1_UV,
+ Battery_Buffer_1by1_MAX,
+
+ Battery_Buffer_2by2_ULV,
+ Battery_Buffer_2by2_LV,
+ Battery_Buffer_2by2_MV,
+ Battery_Buffer_2by2_HV,
+ Battery_Buffer_2by2_EV,
+ Battery_Buffer_2by2_IV,
+ Battery_Buffer_2by2_LuV,
+ Battery_Buffer_2by2_ZPM,
+ Battery_Buffer_2by2_UV,
+ Battery_Buffer_2by2_MAX,
+
+ Battery_Buffer_3by3_ULV,
+ Battery_Buffer_3by3_LV,
+ Battery_Buffer_3by3_MV,
+ Battery_Buffer_3by3_HV,
+ Battery_Buffer_3by3_EV,
+ Battery_Buffer_3by3_IV,
+ Battery_Buffer_3by3_LuV,
+ Battery_Buffer_3by3_ZPM,
+ Battery_Buffer_3by3_UV,
+ Battery_Buffer_3by3_MAX,
+
+ Battery_Buffer_4by4_ULV,
+ Battery_Buffer_4by4_LV,
+ Battery_Buffer_4by4_MV,
+ Battery_Buffer_4by4_HV,
+ Battery_Buffer_4by4_EV,
+ Battery_Buffer_4by4_IV,
+ Battery_Buffer_4by4_LuV,
+ Battery_Buffer_4by4_ZPM,
+ Battery_Buffer_4by4_UV,
+ Battery_Buffer_4by4_MAX,
+
+ Locker_ULV,
+ Locker_LV,
+ Locker_MV,
+ Locker_HV,
+ Locker_EV,
+ Locker_IV,
+ Locker_LuV,
+ Locker_ZPM,
+ Locker_UV,
+ Locker_MAX,
+
+ Machine_Multi_LargeBoiler_Bronze,
+ Machine_Multi_LargeBoiler_Steel,
+ Machine_Multi_LargeBoiler_Titanium,
+ Machine_Multi_LargeBoiler_TungstenSteel,
+ Machine_Multi_BlastFurnace,
+ Machine_Multi_PlasmaForge,
+ Machine_Multi_ImplosionCompressor,
+ Machine_Multi_VacuumFreezer,
+ Machine_Multi_Furnace,
+
+ Machine_LV_AlloySmelter,
+ Machine_MV_AlloySmelter,
+ Machine_HV_AlloySmelter,
+ Machine_EV_AlloySmelter,
+ Machine_IV_AlloySmelter,
+
+ Machine_LV_Assembler,
+ Machine_MV_Assembler,
+ Machine_HV_Assembler,
+ Machine_EV_Assembler,
+ Machine_IV_Assembler,
+
+ Machine_LV_Bender,
+ Machine_MV_Bender,
+ Machine_HV_Bender,
+ Machine_EV_Bender,
+ Machine_IV_Bender,
+
+ Machine_LV_Canner,
+ Machine_MV_Canner,
+ Machine_HV_Canner,
+ Machine_EV_Canner,
+ Machine_IV_Canner,
+
+ Machine_LV_Compressor,
+ Machine_MV_Compressor,
+ Machine_HV_Compressor,
+ Machine_EV_Compressor,
+ Machine_IV_Compressor,
+
+ Machine_LV_Cutter,
+ Machine_MV_Cutter,
+ Machine_HV_Cutter,
+ Machine_EV_Cutter,
+ Machine_IV_Cutter,
+
+ Machine_LV_Slicer,
+ Machine_MV_Slicer,
+ Machine_HV_Slicer,
+ Machine_EV_Slicer,
+ Machine_IV_Slicer,
+
+ Machine_LV_Sifter,
+ Machine_MV_Sifter,
+ Machine_HV_Sifter,
+ Machine_EV_Sifter,
+ Machine_IV_Sifter,
+
+ Machine_LV_ArcFurnace,
+ Machine_MV_ArcFurnace,
+ Machine_HV_ArcFurnace,
+ Machine_EV_ArcFurnace,
+ Machine_IV_ArcFurnace,
+
+ Machine_LV_PlasmaArcFurnace,
+ Machine_MV_PlasmaArcFurnace,
+ Machine_HV_PlasmaArcFurnace,
+ Machine_EV_PlasmaArcFurnace,
+ Machine_IV_PlasmaArcFurnace,
+
+ Machine_LV_Oven,
+ Machine_MV_Oven,
+ Machine_HV_Oven,
+ Machine_EV_Oven,
+ Machine_IV_Oven,
+
+ Machine_LV_E_Furnace,
+ Machine_MV_E_Furnace,
+ Machine_HV_E_Furnace,
+ Machine_EV_E_Furnace,
+ Machine_IV_E_Furnace,
+
+ Machine_LV_Extractor,
+ Machine_MV_Extractor,
+ Machine_HV_Extractor,
+ Machine_EV_Extractor,
+ Machine_IV_Extractor,
+
+ Machine_LV_Extruder,
+ Machine_MV_Extruder,
+ Machine_HV_Extruder,
+ Machine_EV_Extruder,
+ Machine_IV_Extruder,
+
+ Machine_LV_Lathe,
+ Machine_MV_Lathe,
+ Machine_HV_Lathe,
+ Machine_EV_Lathe,
+ Machine_IV_Lathe,
+
+ Machine_LV_Macerator,
+ Machine_MV_Macerator,
+ Machine_HV_Macerator,
+ Machine_EV_Macerator,
+ Machine_IV_Macerator,
+
+ Machine_LV_Microwave,
+ Machine_MV_Microwave,
+ Machine_HV_Microwave,
+ Machine_EV_Microwave,
+ Machine_IV_Microwave,
+
+ Machine_LV_Printer,
+ Machine_MV_Printer,
+ Machine_HV_Printer,
+ Machine_EV_Printer,
+ Machine_IV_Printer,
+ Machine_LuV_Printer,
+ Machine_ZPM_Printer,
+ Machine_UV_Printer,
+
+ Machine_LV_Recycler,
+ Machine_MV_Recycler,
+ Machine_HV_Recycler,
+ Machine_EV_Recycler,
+ Machine_IV_Recycler,
+
+ Machine_LV_Scanner,
+ Machine_MV_Scanner,
+ Machine_HV_Scanner,
+ Machine_EV_Scanner,
+ Machine_IV_Scanner,
+
+ Machine_LV_Wiremill,
+ Machine_MV_Wiremill,
+ Machine_HV_Wiremill,
+ Machine_EV_Wiremill,
+ Machine_IV_Wiremill,
+
+ Machine_LV_Electrolyzer,
+ Machine_MV_Electrolyzer,
+ Machine_HV_Electrolyzer,
+ Machine_EV_Electrolyzer,
+ Machine_IV_Electrolyzer,
+
+ Machine_LV_Centrifuge,
+ Machine_MV_Centrifuge,
+ Machine_HV_Centrifuge,
+ Machine_EV_Centrifuge,
+ Machine_IV_Centrifuge,
+
+ Machine_LV_ThermalCentrifuge,
+ Machine_MV_ThermalCentrifuge,
+ Machine_HV_ThermalCentrifuge,
+ Machine_EV_ThermalCentrifuge,
+ Machine_IV_ThermalCentrifuge,
+
+ Machine_LV_OreWasher,
+ Machine_MV_OreWasher,
+ Machine_HV_OreWasher,
+ Machine_EV_OreWasher,
+ Machine_IV_OreWasher,
+
+ Machine_LV_RockBreaker,
+ Machine_MV_RockBreaker,
+ Machine_HV_RockBreaker,
+ Machine_EV_RockBreaker,
+ Machine_IV_RockBreaker,
+
+ Machine_LV_Boxinator,
+ Machine_MV_Boxinator,
+ Machine_HV_Boxinator,
+ Machine_EV_Boxinator,
+ Machine_IV_Boxinator,
+ Machine_LuV_Boxinator,
+ Machine_ZPM_Boxinator,
+ Machine_UV_Boxinator,
+
+ Machine_LV_Unboxinator,
+ Machine_MV_Unboxinator,
+ Machine_HV_Unboxinator,
+ Machine_EV_Unboxinator,
+ Machine_IV_Unboxinator,
+ Machine_LuV_Unboxinator,
+ Machine_ZPM_Unboxinator,
+ Machine_UV_Unboxinator,
+
+ Machine_LV_ChemicalReactor,
+ Machine_MV_ChemicalReactor,
+ Machine_HV_ChemicalReactor,
+ Machine_EV_ChemicalReactor,
+ Machine_IV_ChemicalReactor,
+
+ Machine_LV_FluidCanner,
+ Machine_MV_FluidCanner,
+ Machine_HV_FluidCanner,
+ Machine_EV_FluidCanner,
+ Machine_IV_FluidCanner,
+
+ Machine_LV_Bundler,
+ Machine_MV_Bundler,
+ Machine_HV_Bundler,
+ Machine_EV_Bundler,
+ Machine_IV_Bundler,
+
+ Machine_LV_Massfab,
+ Machine_MV_Massfab,
+ Machine_HV_Massfab,
+ Machine_EV_Massfab,
+ Machine_IV_Massfab,
+
+ Machine_LV_Amplifab,
+ Machine_MV_Amplifab,
+ Machine_HV_Amplifab,
+ Machine_EV_Amplifab,
+ Machine_IV_Amplifab,
+
+ Machine_LV_Replicator,
+ Machine_MV_Replicator,
+ Machine_HV_Replicator,
+ Machine_EV_Replicator,
+ Machine_IV_Replicator,
+
+ Machine_LV_Brewery,
+ Machine_MV_Brewery,
+ Machine_HV_Brewery,
+ Machine_EV_Brewery,
+ Machine_IV_Brewery,
+
+ Machine_LV_Fermenter,
+ Machine_MV_Fermenter,
+ Machine_HV_Fermenter,
+ Machine_EV_Fermenter,
+ Machine_IV_Fermenter,
+
+ Machine_LV_FluidExtractor,
+ Machine_MV_FluidExtractor,
+ Machine_HV_FluidExtractor,
+ Machine_EV_FluidExtractor,
+ Machine_IV_FluidExtractor,
+
+ Machine_LV_FluidSolidifier,
+ Machine_MV_FluidSolidifier,
+ Machine_HV_FluidSolidifier,
+ Machine_EV_FluidSolidifier,
+ Machine_IV_FluidSolidifier,
+
+ Machine_LV_Distillery,
+ Machine_MV_Distillery,
+ Machine_HV_Distillery,
+ Machine_EV_Distillery,
+ Machine_IV_Distillery,
+
+ Machine_LV_ChemicalBath,
+ Machine_MV_ChemicalBath,
+ Machine_HV_ChemicalBath,
+ Machine_EV_ChemicalBath,
+ Machine_IV_ChemicalBath,
+
+ Machine_LV_Polarizer,
+ Machine_MV_Polarizer,
+ Machine_HV_Polarizer,
+ Machine_EV_Polarizer,
+ Machine_IV_Polarizer,
+
+ Machine_LV_ElectromagneticSeparator,
+ Machine_MV_ElectromagneticSeparator,
+ Machine_HV_ElectromagneticSeparator,
+ Machine_EV_ElectromagneticSeparator,
+ Machine_IV_ElectromagneticSeparator,
+
+ Machine_LV_Autoclave,
+ Machine_MV_Autoclave,
+ Machine_HV_Autoclave,
+ Machine_EV_Autoclave,
+ Machine_IV_Autoclave,
+
+ Machine_LV_Mixer,
+ Machine_MV_Mixer,
+ Machine_HV_Mixer,
+ Machine_EV_Mixer,
+ Machine_IV_Mixer,
+
+ Machine_LV_LaserEngraver,
+ Machine_MV_LaserEngraver,
+ Machine_HV_LaserEngraver,
+ Machine_EV_LaserEngraver,
+ Machine_IV_LaserEngraver,
+
+ Machine_LV_Press,
+ Machine_MV_Press,
+ Machine_HV_Press,
+ Machine_EV_Press,
+ Machine_IV_Press,
+
+ Machine_LV_Hammer,
+ Machine_MV_Hammer,
+ Machine_HV_Hammer,
+ Machine_EV_Hammer,
+ Machine_IV_Hammer,
+
+ Machine_LV_FluidHeater,
+ Machine_MV_FluidHeater,
+ Machine_HV_FluidHeater,
+ Machine_EV_FluidHeater,
+ Machine_IV_FluidHeater,
+
+ Machine_Multi_LargeChemicalReactor,
+
+ Machine_LV_Miner,
+ Machine_MV_Miner,
+ Machine_HV_Miner,
+
+ Machine_IndustrialApiary,
+ IndustrialApiary_Upgrade_Frame,
+ IndustrialApiary_Upgrade_Acceleration_1,
+ IndustrialApiary_Upgrade_Acceleration_2,
+ IndustrialApiary_Upgrade_Acceleration_3,
+ IndustrialApiary_Upgrade_Acceleration_4,
+ IndustrialApiary_Upgrade_Acceleration_5,
+ IndustrialApiary_Upgrade_Acceleration_6,
+ IndustrialApiary_Upgrade_Acceleration_7,
+ IndustrialApiary_Upgrade_Acceleration_8,
+ IndustrialApiary_Upgrade_Acceleration_8_Upgraded,
+ IndustrialApiary_Upgrade_PRODUCTION,
+ IndustrialApiary_Upgrade_PLAINS,
+ IndustrialApiary_Upgrade_LIGHT,
+ IndustrialApiary_Upgrade_FLOWERING,
+ IndustrialApiary_Upgrade_WINTER,
+ IndustrialApiary_Upgrade_DRYER,
+ IndustrialApiary_Upgrade_AUTOMATION,
+ IndustrialApiary_Upgrade_HUMIDIFIER,
+ IndustrialApiary_Upgrade_HELL,
+ IndustrialApiary_Upgrade_POLLEN,
+ IndustrialApiary_Upgrade_DESERT,
+ IndustrialApiary_Upgrade_COOLER,
+ IndustrialApiary_Upgrade_LIFESPAN,
+ IndustrialApiary_Upgrade_SEAL,
+ IndustrialApiary_Upgrade_STABILIZER,
+ IndustrialApiary_Upgrade_JUNGLE,
+ IndustrialApiary_Upgrade_TERRITORY,
+ IndustrialApiary_Upgrade_OCEAN,
+ IndustrialApiary_Upgrade_SKY,
+ IndustrialApiary_Upgrade_HEATER,
+ IndustrialApiary_Upgrade_SIEVE,
+ IndustrialApiary_Upgrade_UNLIGHT,
+
+ Neutron_Reflector,
+
+ Reactor_Coolant_He_1,
+ Reactor_Coolant_He_3,
+ Reactor_Coolant_He_6,
+ Reactor_Coolant_NaK_1,
+ Reactor_Coolant_NaK_3,
+ Reactor_Coolant_NaK_6,
+ neutroniumHeatCapacitor,
+
+ GlowstoneCell,
+ SunnariumCell,
+
+ ThoriumCell_1,
+ ThoriumCell_2,
+ ThoriumCell_4,
+
+ Reactor_Coolant_Sp_1,
+ Reactor_Coolant_Sp_2,
+ Reactor_Coolant_Sp_3,
+ Reactor_Coolant_Sp_6,
+
+ FusionComputer_LuV,
+ FusionComputer_ZPMV,
+ FusionComputer_UV,
+
+ Casing_Fusion_Coil,
+ Casing_Fusion,
+ Casing_Fusion2,
+
+ Generator_Plasma_IV,
+ Generator_Plasma_LuV,
+ Generator_Plasma_ZPMV,
+
+ MagicEnergyConverter_LV,
+ MagicEnergyConverter_MV,
+ MagicEnergyConverter_HV,
+
+ MagicEnergyAbsorber_LV,
+ MagicEnergyAbsorber_MV,
+ MagicEnergyAbsorber_HV,
+ MagicEnergyAbsorber_EV,
+
+ Depleted_Thorium_1,
+ Depleted_Thorium_2,
+ Depleted_Thorium_4,
+
+ Processing_Array,
+ Distillation_Tower,
+ Energy_LapotronicOrb2,
+ Ore_Processor,
+ ZPM6,
+ ZPM5,
+ ZPM4,
+ ZPM3,
+ ZPM2,
+ Energy_Module,
+ Energy_Cluster,
+
+ Quantum_Tank_LV,
+ Quantum_Tank_MV,
+ Quantum_Tank_HV,
+ Quantum_Tank_EV,
+ Quantum_Tank_IV,
+ Quantum_Chest_LV,
+ Quantum_Chest_MV,
+ Quantum_Chest_HV,
+ Quantum_Chest_EV,
+ Quantum_Chest_IV,
+
+ Super_Tank_LV,
+ Super_Tank_MV,
+ Super_Tank_HV,
+ Super_Tank_EV,
+ Super_Tank_IV,
+ Super_Chest_LV,
+ Super_Chest_MV,
+ Super_Chest_HV,
+ Super_Chest_EV,
+ Super_Chest_IV,
+
+ Long_Distance_Pipeline_Fluid,
+ Long_Distance_Pipeline_Item,
+
+ Long_Distance_Pipeline_Fluid_Pipe,
+ Long_Distance_Pipeline_Item_Pipe,
+
+ Hatch_Output_Bus_ME,
+ Hatch_Output_ME,
+
+ NULL,
+ Cover_AdvancedRedstoneTransmitterExternal,
+ Cover_AdvancedRedstoneTransmitterInternal,
+ Cover_AdvancedRedstoneReceiverExternal,
+ Cover_AdvancedRedstoneReceiverInternal,
+
+ Cover_WirelessFluidDetector,
+ Cover_WirelessItemDetector,
+ Cover_WirelessNeedsMaintainance,
+ Cover_WirelessActivityDetector,
+
+ Cover_RedstoneTransmitterExternal,
+ Cover_RedstoneTransmitterInternal,
+ Cover_RedstoneReceiverExternal,
+ Cover_RedstoneReceiverInternal,
+
+ LargeSteamTurbine,
+ LargeGasTurbine,
+ LargeHPSteamTurbine,
+ LargeAdvancedGasTurbine,
+ LargePlasmaTurbine,
+
+ Ingot_Heavy1,
+ Ingot_Heavy2,
+ Ingot_Heavy3,
+
+ Pump_LV,
+ Pump_MV,
+ Pump_HV,
+ Pump_EV,
+ Pump_IV,
+ Pump_LuV,
+ Pump_ZPM,
+ Pump_UV,
+
+ Teleporter,
+ Cover_NeedsMaintainance,
+ Casing_Turbine,
+ Casing_Turbine1,
+ Casing_Turbine2,
+ Casing_Turbine3,
+ Casing_EngineIntake,
+ Casing_ExtremeEngineIntake,
+ Casing_TurbineGasAdvanced,
+
+ Casing_Coil_Cupronickel,
+ Casing_Coil_Kanthal,
+ Casing_Coil_Nichrome,
+ Casing_Coil_TungstenSteel,
+ Casing_Coil_HSSG,
+ Casing_Coil_HSSS,
+ Casing_Coil_Naquadah,
+ Casing_Coil_Trinium,
+ Casing_Coil_NaquadahAlloy,
+ Casing_Coil_ElectrumFlux,
+ Casing_Coil_AwakenedDraconium,
+ Casing_Coil_CosmicNeutronium,
+ Casing_Coil_Infinity,
+ Casing_Coil_Hypogen,
+ Casing_Coil_Eternal,
+
+ Casing_Tank_1,
+ Casing_Tank_2,
+ Casing_Tank_3,
+ Casing_Tank_4,
+ Casing_Tank_5,
+ Casing_Tank_6,
+ Casing_Tank_7,
+ Casing_Tank_8,
+ Casing_Tank_9,
+ Casing_Tank_10,
+ Casing_Tank_11,
+ Casing_Tank_12,
+ Casing_Tank_13,
+ Casing_Tank_14,
+ Casing_Tank_15,
+ Casing_Tank_0,
+
+ MobRep_LV,
+ MobRep_MV,
+ MobRep_HV,
+ MobRep_EV,
+ MobRep_IV,
+ MobRep_LuV,
+ MobRep_ZPM,
+ MobRep_UV,
+ Cover_PlayerDetector,
+ Machine_Multi_HeatExchanger,
+
+ Block_BronzePlate,
+ Block_SteelPlate,
+ Block_TitaniumPlate,
+ Block_IridiumTungstensteel,
+ Block_Plascrete,
+ Block_TungstenSteelReinforced,
+ Block_NaquadahPlate,
+ Block_NeutroniumPlate,
+ Block_BedrockiumCompressed,
+
+ Honeycomb,
+ Charcoal_Pile,
+ Block_BrittleCharcoal,
+ Seismic_Prospector_Adv_LV,
+ Seismic_Prospector_Adv_MV,
+ Seismic_Prospector_Adv_HV,
+ Seismic_Prospector_Adv_EV,
+ OilDrill1,
+ OilDrill2,
+ OilDrill3,
+
+ OilDrill4,
+ OilDrillInfinite,
+ ConcreteBackfiller1,
+ ConcreteBackfiller2,
+ OreDrill1,
+ OreDrill2,
+ OreDrill3,
+ OreDrill4,
+ PyrolyseOven,
+ OilCracker,
+ NanoForge,
+ Crop_Drop_UUMBerry,
+ Crop_Drop_UUABerry,
+ Empty_Board_Basic,
+ Empty_Board_Elite,
+
+ Battery_Charger_4by4_ULV,
+ Battery_Charger_4by4_LV,
+ Battery_Charger_4by4_MV,
+ Battery_Charger_4by4_HV,
+ Battery_Charger_4by4_EV,
+ Battery_Charger_4by4_IV,
+ Battery_Charger_4by4_LuV,
+ Battery_Charger_4by4_ZPM,
+ Battery_Charger_4by4_UV,
+ Battery_Charger_4by4_MAX,
+
+ MicroTransmitter_HV,
+ MicroTransmitter_EV,
+ MicroTransmitter_IV,
+ MicroTransmitter_LUV,
+ MicroTransmitter_ZPM,
+ MicroTransmitter_UV,
+
+ Crop_Drop_Bauxite,
+ Crop_Drop_Ilmenite,
+ Crop_Drop_Pitchblende,
+ Crop_Drop_Uraninite,
+ Crop_Drop_Thorium,
+ Crop_Drop_Nickel,
+ Crop_Drop_Zinc,
+ Crop_Drop_Manganese,
+ Crop_Drop_Scheelite,
+ Crop_Drop_Platinum,
+ Crop_Drop_Iridium,
+ Crop_Drop_Osmium,
+ Crop_Drop_Naquadah,
+ Crop_Drop_Mica,
+ Uraniumcell_1,
+ Uraniumcell_2,
+ Uraniumcell_4,
+ Moxcell_1,
+ Moxcell_2,
+ Moxcell_4,
+
+ Block_Powderbarrel,
+ GelledToluene,
+
+ FluidFilter,
+ ItemFilter_Export,
+ ItemFilter_Import,
+ CuringOven,
+ Machine_Multi_Assemblyline,
+ Machine_Multi_DieselEngine,
+ Machine_Multi_ExtremeDieselEngine,
+ QuantumEye,
+ QuantumStar,
+ Gravistar,
+ NuclearStar,
+ Block_SSFUEL,
+ Block_MSSFUEL,
+ SFMixture,
+ MSFMixture,
+
+ Depleted_Naquadah_1,
+ Depleted_Naquadah_2,
+ Depleted_Naquadah_4,
+ NaquadahCell_1,
+ NaquadahCell_2,
+ NaquadahCell_4,
+ Depleted_MNq_1,
+ Depleted_MNq_2,
+ Depleted_MNq_4,
+ MNqCell_1,
+ MNqCell_2,
+ MNqCell_4,
+
+ Hatch_AutoMaintenance,
+ Machine_Multi_Cleanroom,
+
+ Circuit_Board_Coated,
+ Circuit_Board_Coated_Basic,
+ Circuit_Board_Phenolic,
+ Circuit_Board_Phenolic_Good,
+ Circuit_Board_Epoxy,
+ Circuit_Board_Epoxy_Advanced,
+ Circuit_Board_Fiberglass,
+ Circuit_Board_Fiberglass_Advanced,
+ Circuit_Board_Multifiberglass_Elite,
+ Circuit_Board_Multifiberglass,
+ Circuit_Board_Wetware,
+ Circuit_Board_Wetware_Extreme,
+ Circuit_Board_Plastic,
+ Circuit_Board_Plastic_Advanced,
+ Circuit_Board_Bio,
+ Circuit_Board_Bio_Ultra,
+ Circuit_Board_Optical,
+
+ Circuit_Parts_Resistor,
+ Circuit_Parts_ResistorSMD,
+ Circuit_Parts_Glass_Tube,
+ Circuit_Parts_Reinforced_Glass_Tube,
+ Circuit_Parts_Vacuum_Tube,
+ NandChip,
+ Circuit_Parts_Coil,
+ Circuit_Parts_Diode,
+ Circuit_Parts_DiodeSMD,
+ Circuit_Parts_Transistor,
+ Circuit_Parts_TransistorSMD,
+ Circuit_Parts_Capacitor,
+ Circuit_Parts_CapacitorSMD,
+ Circuit_Parts_GlassFiber,
+ Circuit_Parts_PetriDish,
+
+ Circuit_Parts_ResistorASMD,
+ Circuit_Parts_DiodeASMD,
+ Circuit_Parts_TransistorASMD,
+ Circuit_Parts_CapacitorASMD,
+
+ Circuit_Silicon_Ingot,
+ Circuit_Silicon_Ingot2,
+ Circuit_Silicon_Ingot3,
+ Circuit_Silicon_Ingot4,
+ Circuit_Silicon_Ingot5,
+ Circuit_Silicon_Ingot6,
+ Circuit_Silicon_Wafer,
+ Circuit_Silicon_Wafer2,
+ Circuit_Silicon_Wafer3,
+ Circuit_Silicon_Wafer4,
+ Circuit_Silicon_Wafer5,
+ Circuit_Silicon_Wafer6,
+ Circuit_Silicon_Wafer7,
+ Circuit_Wafer_ILC,
+ Circuit_Chip_ILC,
+ Circuit_Wafer_Ram,
+ Circuit_Chip_Ram,
+
+ Circuit_Wafer_NAND,
+ Circuit_Chip_NAND,
+ Circuit_Wafer_NOR,
+ Circuit_Chip_NOR,
+ Circuit_Wafer_CPU,
+ Circuit_Chip_CPU,
+ Circuit_Wafer_SoC,
+ Circuit_Chip_SoC,
+ Circuit_Wafer_SoC2,
+ Circuit_Chip_SoC2,
+ Circuit_Wafer_PIC,
+ Circuit_Chip_PIC,
+ Circuit_Wafer_Simple_SoC,
+ Circuit_Chip_Simple_SoC,
+
+ Circuit_Wafer_HPIC,
+ Circuit_Wafer_UHPIC,
+ Circuit_Chip_HPIC,
+ Circuit_Chip_UHPIC,
+ Circuit_Chip_ULPIC,
+ Circuit_Chip_LPIC,
+ Circuit_Chip_NPIC,
+ Circuit_Chip_PPIC,
+ Circuit_Chip_QPIC,
+ Circuit_Wafer_ULPIC,
+ Circuit_Wafer_NPIC,
+ Circuit_Wafer_PPIC,
+ Circuit_Wafer_QPIC,
+ Circuit_Wafer_LPIC,
+ Circuit_Wafer_NanoCPU,
+ Circuit_Chip_NanoCPU,
+ Circuit_Wafer_QuantumCPU,
+ Circuit_Chip_QuantumCPU,
+ Circuit_Wafer_Bioware,
+
+ Circuit_Chip_CrystalCPU,
+ Circuit_Chip_CrystalSoC,
+ Circuit_Chip_CrystalSoC2,
+ Circuit_Chip_NeuroCPU,
+ Circuit_Chip_BioCPU,
+ Circuit_Chip_Stemcell,
+ Circuit_Parts_RawCrystalParts,
+ Circuit_Chip_Biocell,
+ Circuit_Chip_Optical,
+ Circuit_Parts_Chip_Bioware,
+
+ Tube_Wires,
+ KevlarFiber,
+ WovenKevlar,
+ Spinneret,
+ GalliumArsenideCrystal,
+ GalliumArsenideCrystalSmallPart,
+
+ Circuit_Microprocessor,
+ Circuit_Processor,
+ Circuit_Computer,
+ Circuit_Nanoprocessor,
+ Circuit_Nanocomputer,
+ Circuit_Elitenanocomputer,
+ Circuit_Quantumprocessor,
+ Circuit_Quantumcomputer,
+ Circuit_Masterquantumcomputer,
+
+ Circuit_Quantummainframe,
+ Circuit_Crystalprocessor,
+ Circuit_Crystalcomputer,
+ Circuit_Ultimatecrystalcomputer,
+ Circuit_Crystalmainframe,
+ Circuit_Neuroprocessor,
+ Circuit_Wetwarecomputer,
+ Circuit_Wetwaresupercomputer,
+ Circuit_Wetwaremainframe,
+ Circuit_Parts_RawCrystalChip,
+ Circuit_Bioprocessor,
+ Circuit_Biomainframe,
+
+ Circuit_OpticalProcessor,
+ Circuit_OpticalAssembly,
+ Circuit_OpticalComputer,
+ Circuit_OpticalMainframe,
+ Optical_Cpu_Containment_Housing,
+ Optically_Perfected_CPU,
+ Optically_Compatible_Memory,
+
+ Circuit_ExoticProcessor,
+ Circuit_ExoticAssembly,
+ Circuit_ExoticComputer,
+ Circuit_ExoticMainframe,
+
+ Circuit_CosmicProcessor,
+ Circuit_CosmicAssembly,
+ Circuit_CosmicComputer,
+ Circuit_CosmicMainframe,
+
+ Circuit_TranscendentProcessor,
+ Circuit_TranscendentAssembly,
+ Circuit_TranscendentComputer,
+ Circuit_TranscendentMainframe,
+
+ Machine_LV_CircuitAssembler,
+ Machine_MV_CircuitAssembler,
+ Machine_HV_CircuitAssembler,
+ Machine_EV_CircuitAssembler,
+ Machine_IV_CircuitAssembler,
+ Machine_LuV_CircuitAssembler,
+ Machine_ZPM_CircuitAssembler,
+ Machine_UV_CircuitAssembler,
+
+ Circuit_Integrated_Good,
+ Machine_IV_LightningRod,
+ Machine_HV_LightningRod,
+ Machine_EV_LightningRod,
+
+ ULV_Coil,
+ LV_Coil,
+ MV_Coil,
+ HV_Coil,
+ EV_Coil,
+ IV_Coil,
+ LuV_Coil,
+ ZPM_Coil,
+ UV_Coil,
+ UHV_Coil,
+
+ Circuit_Parts_ResistorXSMD,
+ Circuit_Parts_DiodeXSMD,
+ Circuit_Parts_TransistorXSMD,
+ Circuit_Parts_CapacitorXSMD,
+
+ Circuit_Parts_InductorSMD,
+ Circuit_Parts_InductorASMD,
+ Circuit_Parts_InductorXSMD,
+
+ VOLUMETRIC_FLASK,
+
+ Hatch_Input_Bus_ME,
+ Hatch_Input_Bus_ME_Advanced,
+ Hatch_Input_ME,
+ Hatch_Input_ME_Advanced,
+ Hatch_CraftingInput_Bus_ME,
+ Hatch_CraftingInput_Bus_ME_ItemOnly,
+ Hatch_CraftingInput_Bus_Slave,
+ AdvDebugStructureWriter,
+
+ Superconducting_Magnet_Solenoid_MV,
+ Superconducting_Magnet_Solenoid_HV,
+ Superconducting_Magnet_Solenoid_EV,
+ Superconducting_Magnet_Solenoid_IV,
+ Superconducting_Magnet_Solenoid_LuV,
+ Superconducting_Magnet_Solenoid_ZPM,
+ Superconducting_Magnet_Solenoid_UV,
+ Superconducting_Magnet_Solenoid_UHV,
+ Superconducting_Magnet_Solenoid_UEV,
+ Superconducting_Magnet_Solenoid_UIV,
+ Superconducting_Magnet_Solenoid_UMV,
+ RadiantNaquadahAlloyCasing,
+ PCBFactory,
+ BasicPhotolithographicFrameworkCasing,
+ ReinforcedPhotolithographicFrameworkCasing,
+ RadiationProofPhotolithographicFrameworkCasing,
+ InfinityCooledCasing,
+ Machine_Multi_TranscendentPlasmaMixer,
+ Cover_Metrics_Transmitter,
+ NC_AdvancedSensorCard,
+ Machine_Multi_DroneCentre,
+ TierdDrone0,
+ TierdDrone1,
+ TierdDrone2,
+ Hatch_DroneDownLink;
+
+ public static final ItemList[] DYE_ONLY_ITEMS = { Color_00, Color_01, Color_02, Color_03, Color_04, Color_05,
+ Color_06, Color_07, Color_08, Color_09, Color_10, Color_11, Color_12, Color_13, Color_14, Color_15 },
+ SPRAY_CAN_DYES = { Spray_Color_00, Spray_Color_01, Spray_Color_02, Spray_Color_03, Spray_Color_04,
+ Spray_Color_05, Spray_Color_06, Spray_Color_07, Spray_Color_08, Spray_Color_09, Spray_Color_10,
+ Spray_Color_11, Spray_Color_12, Spray_Color_13, Spray_Color_14, Spray_Color_15 },
+ SPRAY_CAN_DYES_USED = { Spray_Color_Used_00, Spray_Color_Used_01, Spray_Color_Used_02, Spray_Color_Used_03,
+ Spray_Color_Used_04, Spray_Color_Used_05, Spray_Color_Used_06, Spray_Color_Used_07, Spray_Color_Used_08,
+ Spray_Color_Used_09, Spray_Color_Used_10, Spray_Color_Used_11, Spray_Color_Used_12, Spray_Color_Used_13,
+ Spray_Color_Used_14, Spray_Color_Used_15 },
+ TRANSFORMERS = { Transformer_LV_ULV, Transformer_MV_LV, Transformer_HV_MV, Transformer_EV_HV, Transformer_IV_EV,
+ Transformer_LuV_IV, Transformer_ZPM_LuV, Transformer_UV_ZPM, Transformer_MAX_UV },
+ MACHINE_HULLS = { Hull_ULV, Hull_LV, Hull_MV, Hull_HV, Hull_EV, Hull_IV, Hull_LuV, Hull_ZPM, Hull_UV,
+ Hull_MAX },
+ HATCHES_DYNAMO = { Hatch_Dynamo_ULV, Hatch_Dynamo_LV, Hatch_Dynamo_MV, Hatch_Dynamo_HV, Hatch_Dynamo_EV,
+ Hatch_Dynamo_IV, Hatch_Dynamo_LuV, Hatch_Dynamo_ZPM, Hatch_Dynamo_UV, Hatch_Dynamo_MAX },
+ HATCHES_ENERGY = { Hatch_Energy_ULV, Hatch_Energy_LV, Hatch_Energy_MV, Hatch_Energy_HV, Hatch_Energy_EV,
+ Hatch_Energy_IV, Hatch_Energy_LuV, Hatch_Energy_ZPM, Hatch_Energy_UV, Hatch_Energy_MAX },
+ HATCHES_INPUT = { Hatch_Input_ULV, Hatch_Input_LV, Hatch_Input_MV, Hatch_Input_HV, Hatch_Input_EV,
+ Hatch_Input_IV, Hatch_Input_LuV, Hatch_Input_ZPM, Hatch_Input_UV, Hatch_Input_MAX },
+ HATCHES_INPUT_BUS = { Hatch_Input_Bus_ULV, Hatch_Input_Bus_LV, Hatch_Input_Bus_MV, Hatch_Input_Bus_HV,
+ Hatch_Input_Bus_EV, Hatch_Input_Bus_IV, Hatch_Input_Bus_LuV, Hatch_Input_Bus_ZPM, Hatch_Input_Bus_UV,
+ Hatch_Input_Bus_MAX },
+ HATCHES_OUTPUT = { Hatch_Output_ULV, Hatch_Output_LV, Hatch_Output_MV, Hatch_Output_HV, Hatch_Output_EV,
+ Hatch_Output_IV, Hatch_Output_LuV, Hatch_Output_ZPM, Hatch_Output_UV, Hatch_Output_MAX },
+ HATCHES_OUTPUT_BUS = { Hatch_Output_Bus_ULV, Hatch_Output_Bus_LV, Hatch_Output_Bus_MV, Hatch_Output_Bus_HV,
+ Hatch_Output_Bus_EV, Hatch_Output_Bus_IV, Hatch_Output_Bus_LuV, Hatch_Output_Bus_ZPM, Hatch_Output_Bus_UV,
+ Hatch_Output_Bus_MAX },
+ HATCHES_MUFFLER = { Hatch_Muffler_LV, Hatch_Muffler_LV, Hatch_Muffler_MV, Hatch_Muffler_HV, Hatch_Muffler_EV,
+ Hatch_Muffler_IV, Hatch_Muffler_LuV, Hatch_Muffler_ZPM, Hatch_Muffler_UV, Hatch_Muffler_MAX };
+ public static Fluid sOilExtraHeavy, sEpichlorhydrin, sDrillingFluid, sBlueVitriol, sNickelSulfate, sGreenVitriol,
+ sToluene, sNitrationMixture, sRocketFuel, sHydricSulfur, sIndiumConcentrate, sLeadZincSolution,
+ sHydrochloricAcid;
+ private ItemStack mStack;
+ private boolean mHasNotBeenSet;
+ private boolean mDeprecated;
+ private boolean mWarned;
+
+ ItemList() {
+ mHasNotBeenSet = true;
+ }
+
+ ItemList(boolean aDeprecated) {
+ if (aDeprecated) {
+ mDeprecated = true;
+ mHasNotBeenSet = true;
+ }
+ }
+
+ @Override
+ public IItemContainer set(Item aItem) {
+ mHasNotBeenSet = false;
+ if (aItem == null) return this;
+ ItemStack aStack = new ItemStack(aItem, 1, 0);
+ mStack = GT_Utility.copyAmount(1, aStack);
+ return this;
+ }
+
+ @Override
+ public IItemContainer set(ItemStack aStack) {
+ mHasNotBeenSet = false;
+ mStack = GT_Utility.copyAmount(1, aStack);
+ return this;
+ }
+
+ @Override
+ public Item getItem() {
+ sanityCheck();
+ if (GT_Utility.isStackInvalid(mStack)) return null;
+ return mStack.getItem();
+ }
+
+ @Override
+ public Block getBlock() {
+ sanityCheck();
+ return GT_Utility.getBlockFromItem(getItem());
+ }
+
+ @Override
+ public final boolean hasBeenSet() {
+ return !mHasNotBeenSet;
+ }
+
+ @Override
+ public boolean isStackEqual(Object aStack) {
+ return isStackEqual(aStack, false, false);
+ }
+
+ @Override
+ public boolean isStackEqual(Object aStack, boolean aWildcard, boolean aIgnoreNBT) {
+ if (mDeprecated && !mWarned) {
+ new Exception(this + " is now deprecated").printStackTrace(GT_Log.err);
+ // warn only once
+ mWarned = true;
+ }
+ if (GT_Utility.isStackInvalid(aStack)) return false;
+ return GT_Utility.areUnificationsEqual((ItemStack) aStack, aWildcard ? getWildcard(1) : get(1), aIgnoreNBT);
+ }
+
+ @Override
+ public ItemStack get(long aAmount, Object... aReplacements) {
+ sanityCheck();
+ if (GT_Utility.isStackInvalid(mStack)) {
+ GT_Log.out.println("Object in the ItemList is null at:");
+ new NullPointerException().printStackTrace(GT_Log.out);
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmount(aAmount, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getWildcard(long aAmount, Object... aReplacements) {
+ sanityCheck();
+ if (GT_Utility.isStackInvalid(mStack)) return GT_Utility.copyAmount(aAmount, aReplacements);
+ return GT_Utility.copyAmountAndMetaData(aAmount, W, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getUndamaged(long aAmount, Object... aReplacements) {
+ sanityCheck();
+ if (GT_Utility.isStackInvalid(mStack)) return GT_Utility.copyAmount(aAmount, aReplacements);
+ return GT_Utility.copyAmountAndMetaData(aAmount, 0, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getAlmostBroken(long aAmount, Object... aReplacements) {
+ sanityCheck();
+ if (GT_Utility.isStackInvalid(mStack)) return GT_Utility.copyAmount(aAmount, aReplacements);
+ return GT_Utility.copyAmountAndMetaData(aAmount, mStack.getMaxDamage() - 1, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getWithName(long aAmount, String aDisplayName, Object... aReplacements) {
+ ItemStack rStack = get(1, aReplacements);
+ if (GT_Utility.isStackInvalid(rStack)) return NI;
+
+ // CamelCase alphanumeric words from aDisplayName
+ StringBuilder tCamelCasedDisplayNameBuilder = new StringBuilder();
+ final String[] tDisplayNameWords = aDisplayName.split("\\W");
+ for (String tWord : tDisplayNameWords) {
+ if (tWord.length() > 0) tCamelCasedDisplayNameBuilder.append(
+ tWord.substring(0, 1)
+ .toUpperCase(Locale.US));
+ if (tWord.length() > 1) tCamelCasedDisplayNameBuilder.append(
+ tWord.substring(1)
+ .toLowerCase(Locale.US));
+ }
+ if (tCamelCasedDisplayNameBuilder.length() == 0) {
+ // CamelCased DisplayName is empty, so use hash of aDisplayName
+ tCamelCasedDisplayNameBuilder.append(((Long) (long) aDisplayName.hashCode()));
+ }
+
+ // Construct a translation key from UnlocalizedName and CamelCased DisplayName
+ final String tKey = rStack.getUnlocalizedName() + ".with." + tCamelCasedDisplayNameBuilder + ".name";
+
+ rStack.setStackDisplayName(GT_LanguageManager.addStringLocalization(tKey, aDisplayName));
+ return GT_Utility.copyAmount(aAmount, rStack);
+ }
+
+ @Override
+ public ItemStack getWithCharge(long aAmount, int aEnergy, Object... aReplacements) {
+ ItemStack rStack = get(1, aReplacements);
+ if (GT_Utility.isStackInvalid(rStack)) return null;
+ GT_ModHandler.chargeElectricItem(rStack, aEnergy, Integer.MAX_VALUE, true, false);
+ return GT_Utility.copyAmount(aAmount, rStack);
+ }
+
+ @Override
+ public ItemStack getWithDamage(long aAmount, long aMetaValue, Object... aReplacements) {
+ sanityCheck();
+ if (GT_Utility.isStackInvalid(mStack)) return GT_Utility.copyAmount(aAmount, aReplacements);
+ return GT_Utility.copyAmountAndMetaData(aAmount, aMetaValue, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public IItemContainer registerOre(Object... aOreNames) {
+ sanityCheck();
+ for (Object tOreName : aOreNames) GT_OreDictUnificator.registerOre(tOreName, get(1));
+ return this;
+ }
+
+ @Override
+ public IItemContainer registerWildcardAsOre(Object... aOreNames) {
+ sanityCheck();
+ for (Object tOreName : aOreNames) GT_OreDictUnificator.registerOre(tOreName, getWildcard(1));
+ return this;
+ }
+
+ /**
+ * Returns the internal stack. This method is unsafe. It's here only for quick operations. DON'T CHANGE THE RETURNED
+ * VALUE!
+ */
+ public ItemStack getInternalStack_unsafe() {
+ return mStack;
+ }
+
+ private void sanityCheck() {
+ if (mHasNotBeenSet)
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ if (mDeprecated && !mWarned) {
+ new Exception(this + " is now deprecated").printStackTrace(GT_Log.err);
+ // warn only once
+ mWarned = true;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/MachineType.java b/src/main/java/gregtech/api/enums/MachineType.java
new file mode 100644
index 0000000000..14e1781350
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/MachineType.java
@@ -0,0 +1,136 @@
+package gregtech.api.enums;
+
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+
+public enum MachineType {
+
+ ALLOY_SMELTER(FunnyTexts.ALLOY_SMELTER, "gt.recipe.alloysmelter"),
+ ARC_FURNACE(FunnyTexts.ARC_FURNACE, "gt.recipe.arcfurnace"),
+ ASSEMBLER(FunnyTexts.ASSEMBLER, "gt.recipe.assembler"),
+ AUTOCLAVE(FunnyTexts.AUTOCLAVE, "gt.recipe.autoclave"),
+ BENDING_MACHINE(FunnyTexts.BENDING_MACHINE, "gt.recipe.metalbender"),
+ BREWERY(FunnyTexts.BREWERY, "gt.recipe.brewer"),
+ CANNER(FunnyTexts.CANNER, "gt.recipe.canner"),
+ CENTRIFUGE(FunnyTexts.CENTRIFUGE, "gt.recipe.centrifuge"),
+ CHEMICAL_BATH(FunnyTexts.CHEMICAL_BATH, "gt.recipe.chemicalbath"),
+ CHEMICAL_REACTOR(FunnyTexts.CHEMICAL_REACTOR, "gt.recipe.chemicalreactor"),
+ CIRCUIT_ASSEMBLER(FunnyTexts.CIRCUIT_ASSEMBLER, "gt.recipe.circuitassembler"),
+ COMPRESSOR(FunnyTexts.COMPRESSOR, "gt.recipe.compressor"),
+ CUTTING_MACHINE(FunnyTexts.CUTTING_MACHINE, "gt.recipe.cuttingsaw"),
+ DISTILLERY(FunnyTexts.DISTILLERY, "gt.recipe.distillery"),
+ ELECTRIC_FURNACE(FunnyTexts.ELECTRIC_FURNACE, "gt.recipe.furnace"),
+ ELECTROLYZER(FunnyTexts.ELECTROLYZER, "gt.recipe.electrolyzer"),
+ ELECTROMAGNETIC_SEPARATOR(FunnyTexts.ELECTROMAGNETIC_SEPARATOR, "gt.recipe.electromagneticseparator"),
+ EXTRACTOR(FunnyTexts.EXTRACTOR, "gt.recipe.extractor"),
+ EXTRUDER(FunnyTexts.EXTRUDER, "gt.recipe.extruder"),
+ FERMENTER(FunnyTexts.FERMENTER, "gt.recipe.fermenter"),
+ FLUID_CANNER(FunnyTexts.FLUID_CANNER, "gt.recipe.fluidcanner"),
+ FLUID_EXTRACTOR(FunnyTexts.FLUID_EXTRACTOR, "gt.recipe.fluidextractor"),
+ FLUID_SOLIDIFIER(FunnyTexts.FLUID_SOLIDIFIER, "gt.recipe.fluidsolidifier"),
+ FORGE_HAMMER(FunnyTexts.FORGE_HAMMER, "gt.recipe.hammer"),
+ FORMING_PRESS(FunnyTexts.FORMING_PRESS, "gt.recipe.press"),
+ FLUID_HEATER(FunnyTexts.FLUID_HEATER, "gt.recipe.fluidheater"),
+ LASER_ENGRAVER(FunnyTexts.LASER_ENGRAVER, "gt.recipe.laserengraver"),
+ LATHE(FunnyTexts.LATHE, "gt.recipe.lathe"),
+ MACERATOR(FunnyTexts.MACERATOR, "gt.recipe.macerator"),
+ MACERATOR_PULVERIZER(FunnyTexts.MACERATOR_PULVERIZER, "gt.recipe.macerator_pulverizer"),
+ MATTER_AMPLIFIER(FunnyTexts.MATTER_AMPLIFIER, "gt.recipe.uuamplifier"),
+ MATTER_FABRICATOR(FunnyTexts.MATTER_FABRICATOR, "gt.recipe.massfab"),
+ MICROWAVE(FunnyTexts.MICROWAVE, "gt.recipe.microwave"),
+ MIXER(FunnyTexts.MIXER, "gt.recipe.mixer"),
+ ORE_WASHER(FunnyTexts.ORE_WASHER, "gt.recipe.orewasher"),
+ OVEN(FunnyTexts.OVEN, "gt.recipe.oven"),
+ PACKAGER(FunnyTexts.PACKAGER, "gt.recipe.packager"),
+ PLASMA_ARC_FURNACE(FunnyTexts.PLASMA_ARC_FURNACE, "gt.recipe.plasmaarcfurnace"),
+ POLARIZER(FunnyTexts.POLARIZER, "gt.recipe.polarizer"),
+ PRINTER(FunnyTexts.PRINTER, "gt.recipe.printer"),
+ RECYCLER(FunnyTexts.RECYCLER, "ic.recipe.recycler"),
+ REPLICATOR(FunnyTexts.REPLICATOR, "gt.recipe.replicator"),
+ SCANNER(FunnyTexts.SCANNER, "gt.recipe.scanner"),
+ ROCKBREAKER(FunnyTexts.ROCKBREAKER, "gt.recipe.rockbreaker"),
+ SIFTER(FunnyTexts.SIFTER, "gt.recipe.sifter"),
+ SLICER(FunnyTexts.SLICER, "gt.recipe.slicer"),
+ THERMAL_CENTRIFUGE(FunnyTexts.THERMAL_CENTRIFUGE, "gt.recipe.thermalcentrifuge"),
+ UNPACKAGER(FunnyTexts.UNPACKAGER, "gt.recipe.unpackager"),
+ WIREMILL(FunnyTexts.WIREMILL, "gt.recipe.wiremill");
+
+ private static class FunnyTexts {
+
+ static final String ALLOY_SMELTER = "gt.recipe.alloysmelter.description";
+ static final String ARC_FURNACE = "gt.recipe.arcfurnace.description";
+ static final String ASSEMBLER = "gt.recipe.assembler.description";
+ static final String AUTOCLAVE = "gt.recipe.autoclave.description";
+ static final String BENDING_MACHINE = "gt.recipe.metalbender.description";
+ static final String BREWERY = "gt.recipe.brewer.description";
+ static final String CANNER = "gt.recipe.canner.description";
+ static final String CENTRIFUGE = "gt.recipe.centrifuge.description";
+ static final String CHEMICAL_BATH = "gt.recipe.chemicalbath.description";
+ static final String CHEMICAL_REACTOR = "gt.recipe.chemicalreactor.description";
+ static final String CIRCUIT_ASSEMBLER = "gt.recipe.circuitassembler.description";
+ static final String COMPRESSOR = "gt.recipe.compressor.description";
+ static final String CUTTING_MACHINE = "gt.recipe.cuttingsaw.description";
+ static final String DISTILLERY = "gt.recipe.distillery.description";
+ static final String ELECTRIC_FURNACE = "gt.recipe.furnace.description";
+ static final String ELECTROLYZER = "gt.recipe.electrolyzer.description";
+ static final String ELECTROMAGNETIC_SEPARATOR = "gt.recipe.electromagneticseparator.description";
+ static final String EXTRACTOR = "gt.recipe.extractor.description";
+ static final String EXTRUDER = "gt.recipe.extruder.description";
+ static final String FERMENTER = "gt.recipe.fermenter.description";
+ static final String FLUID_CANNER = "gt.recipe.fluidcanner.description";
+ static final String FLUID_EXTRACTOR = "gt.recipe.fluidextractor.description";
+ static final String FLUID_HEATER = "gt.recipe.fluidheater.description";
+ static final String FLUID_SOLIDIFIER = "gt.recipe.fluidsolidifier.description";
+ static final String FORGE_HAMMER = "gt.recipe.hammer.description";
+ static final String FORMING_PRESS = "gt.recipe.press.description";
+ static final String LASER_ENGRAVER = "gt.recipe.laserengraver.description";
+ static final String LATHE = "gt.recipe.lathe.description";
+ static final String MACERATOR = "gt.recipe.macerator.description";
+ static final String MACERATOR_PULVERIZER = "gt.recipe.macerator_pulverizer.description";
+ static final String MATTER_AMPLIFIER = "gt.recipe.uuamplifier.description";
+ static final String MATTER_FABRICATOR = "gt.recipe.massfab.description";
+ static final String MICROWAVE = "gt.recipe.microwave.description";
+ static final String MIXER = "gt.recipe.mixer.description";
+ static final String ORE_WASHER = "gt.recipe.orewasher.description";
+ static final String OVEN = "gt.recipe.oven.description";
+ static final String PACKAGER = "gt.recipe.packager.description";
+ static final String PLASMA_ARC_FURNACE = "gt.recipe.plasmaarcfurnace.description";
+ static final String POLARIZER = "gt.recipe.polarizer.description";
+ static final String PRINTER = "gt.recipe.printer.description";
+ static final String RECYCLER = "ic.recipe.recycler.description";
+ static final String REPLICATOR = "gt.recipe.replicator.description";
+ static final String ROCKBREAKER = "gt.recipe.rockbreaker.description";
+ static final String SIFTER = "gt.recipe.sifter.description";
+ static final String SCANNER = "gt.recipe.scanner.description";
+ static final String SLICER = "gt.recipe.slicer.description";
+ static final String THERMAL_CENTRIFUGE = "gt.recipe.thermalcentrifuge.description";
+ static final String UNPACKAGER = "gt.recipe.unpackager.description";
+ static final String WIREMILL = "gt.recipe.wiremill.description";
+ }
+
+ private static final String TT_machineType = "GT5U.MBTT.MachineType";
+
+ private final String name;
+ private final String description;
+
+ MachineType(String machineDescription, String machineType) {
+ this.description = machineDescription;
+ this.name = machineType;
+ }
+
+ public String type() {
+ return StatCollector.translateToLocal(this.name);
+ }
+
+ public String description() {
+ return StatCollector.translateToLocal(this.description);
+ }
+
+ public String[] tooltipDescription() {
+ return new String[] { description(),
+ StatCollector.translateToLocal(TT_machineType) + ": "
+ + EnumChatFormatting.YELLOW
+ + type()
+ + EnumChatFormatting.RESET };
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/MaterialBuilder.java b/src/main/java/gregtech/api/enums/MaterialBuilder.java
new file mode 100644
index 0000000000..98ed5fa3f7
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/MaterialBuilder.java
@@ -0,0 +1,276 @@
+package gregtech.api.enums;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import gregtech.api.objects.MaterialStack;
+
+public class MaterialBuilder {
+
+ public static final int DIESEL = 0, GAS = 1, THERMAL = 2, SEMIFLUID = 3, PLASMA = 4, MAGIC = 5;
+
+ private final int metaItemSubID;
+ private final TextureSet iconSet;
+ private float toolSpeed = 1.0f;
+ private int durability = 0;
+ private int toolQuality = 0;
+ private int types = 0;
+ private int r = 255, g = 255, b = 255, a = 0;
+ private String name;
+ private final String defaultLocalName;
+ private int fuelType = 0;
+ private int fuelPower = 0;
+ private int meltingPoint = 0;
+ private int blastFurnaceTemp = 0;
+ private boolean blastFurnaceRequired = false;
+ private boolean transparent = false;
+ private int oreValue = 1;
+ private int densityMultiplier = 1;
+ private int densityDivider = 1;
+ private Dyes color = Dyes._NULL;
+ private int extraData = 0;
+ private List<MaterialStack> materialList = new ArrayList<>();
+ private List<TC_Aspects.TC_AspectStack> aspects = new ArrayList<>();
+ private boolean hasCorrespondingFluid = false;
+ private boolean hasCorrespondingGas = false;
+ private boolean canBeCracked = false;
+ private int liquidTemperature = 300;
+ private int gasTemperature = 300;
+
+ public MaterialBuilder(int metaItemSubID, TextureSet iconSet, String defaultLocalName) {
+ this.metaItemSubID = metaItemSubID;
+ this.iconSet = iconSet;
+ this.name = defaultLocalName.replace(" ", "")
+ .replace("-", "");
+ this.defaultLocalName = defaultLocalName;
+ }
+
+ public Materials constructMaterial() {
+ return new Materials(
+ metaItemSubID,
+ iconSet,
+ toolSpeed,
+ durability,
+ toolQuality,
+ types,
+ r,
+ g,
+ b,
+ a,
+ name,
+ defaultLocalName,
+ fuelType,
+ fuelPower,
+ meltingPoint,
+ blastFurnaceTemp,
+ blastFurnaceRequired,
+ transparent,
+ oreValue,
+ densityMultiplier,
+ densityDivider,
+ color,
+ extraData,
+ materialList,
+ aspects).setHasCorrespondingFluid(hasCorrespondingFluid)
+ .setHasCorrespondingGas(hasCorrespondingGas)
+ .setCanBeCracked(canBeCracked);
+ }
+
+ public MaterialBuilder setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public MaterialBuilder setTypes(int types) {
+ this.types = types;
+ return this;
+ }
+
+ public MaterialBuilder addDustItems() {
+ types = types | 1;
+ return this;
+ }
+
+ public MaterialBuilder addMetalItems() {
+ types = types | 2;
+ return this;
+ }
+
+ public MaterialBuilder addGemItems() {
+ types = types | 4;
+ return this;
+ }
+
+ public MaterialBuilder addOreItems() {
+ types = types | 8;
+ return this;
+ }
+
+ public MaterialBuilder addCell() {
+ types = types | 16;
+ return this;
+ }
+
+ public MaterialBuilder addPlasma() {
+ types = types | 32;
+ return this;
+ }
+
+ public MaterialBuilder addToolHeadItems() {
+ types = types | 64;
+ return this;
+ }
+
+ public MaterialBuilder addGearItems() {
+ types = types | 128;
+ return this;
+ }
+
+ public MaterialBuilder addFluid() {
+ this.hasCorrespondingFluid = true;
+ return this;
+ }
+
+ public MaterialBuilder addGas() {
+ this.hasCorrespondingGas = true;
+ return this;
+ }
+
+ public MaterialBuilder setRGBA(int r, int g, int b, int a) {
+ this.r = r;
+ this.g = g;
+ this.b = b;
+ this.a = a;
+ return this;
+ }
+
+ public MaterialBuilder setRGB(int r, int g, int b) {
+ this.r = r;
+ this.g = g;
+ this.b = b;
+ return this;
+ }
+
+ public MaterialBuilder setTransparent(boolean transparent) {
+ this.transparent = transparent;
+ return this;
+ }
+
+ public MaterialBuilder setColor(Dyes color) {
+ this.color = color;
+ return this;
+ }
+
+ public MaterialBuilder setToolSpeed(float toolSpeed) {
+ this.toolSpeed = toolSpeed;
+ return this;
+ }
+
+ public MaterialBuilder setDurability(int durability) {
+ this.durability = durability;
+ return this;
+ }
+
+ public MaterialBuilder setToolQuality(int toolQuality) {
+ this.toolQuality = toolQuality;
+ return this;
+ }
+
+ public MaterialBuilder setFuelType(int fuelType) {
+ this.fuelType = fuelType;
+ return this;
+ }
+
+ public MaterialBuilder setFuelPower(int fuelPower) {
+ this.fuelPower = fuelPower;
+ return this;
+ }
+
+ public MaterialBuilder setMeltingPoint(int meltingPoint) {
+ this.meltingPoint = meltingPoint;
+ return this;
+ }
+
+ public MaterialBuilder setBlastFurnaceTemp(int blastFurnaceTemp) {
+ this.blastFurnaceTemp = blastFurnaceTemp;
+ return this;
+ }
+
+ public MaterialBuilder setBlastFurnaceRequired(boolean blastFurnaceRequired) {
+ this.blastFurnaceRequired = blastFurnaceRequired;
+ return this;
+ }
+
+ public MaterialBuilder setOreValue(int oreValue) {
+ this.oreValue = oreValue;
+ return this;
+ }
+
+ public MaterialBuilder setDensityMultiplier(int densityMultiplier) {
+ this.densityMultiplier = densityMultiplier;
+ return this;
+ }
+
+ public MaterialBuilder setDensityDivider(int densityDivider) {
+ this.densityDivider = densityDivider;
+ return this;
+ }
+
+ public MaterialBuilder setExtraData(int extraData) {
+ this.extraData = extraData;
+ return this;
+ }
+
+ public MaterialBuilder addElectrolyzerRecipe() {
+ extraData = extraData | 1;
+ return this;
+ }
+
+ public MaterialBuilder addCentrifugeRecipe() {
+ extraData = extraData | 2;
+ return this;
+ }
+
+ public MaterialBuilder setMaterialList(List<MaterialStack> materialList) {
+ this.materialList = materialList;
+ return this;
+ }
+
+ public MaterialBuilder setMaterialList(MaterialStack... materials) {
+ this.materialList = Arrays.asList(materials);
+ return this;
+ }
+
+ public MaterialBuilder setAspects(List<TC_Aspects.TC_AspectStack> aspects) {
+ this.aspects = aspects;
+ return this;
+ }
+
+ public int getLiquidTemperature() {
+ return liquidTemperature;
+ }
+
+ public MaterialBuilder setLiquidTemperature(int liquidTemperature) {
+ this.liquidTemperature = liquidTemperature;
+ return this;
+ }
+
+ public int getGasTemperature() {
+ return gasTemperature;
+ }
+
+ public MaterialBuilder setGasTemperature(int gasTemperature) {
+ this.gasTemperature = gasTemperature;
+ return this;
+ }
+
+ public boolean canBeCracked() {
+ return canBeCracked;
+ }
+
+ public MaterialBuilder setCanBeCracked(boolean canBeCracked) {
+ this.canBeCracked = canBeCracked;
+ return this;
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/Materials.java b/src/main/java/gregtech/api/enums/Materials.java
new file mode 100644
index 0000000000..0bede04846
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/Materials.java
@@ -0,0 +1,3307 @@
+package gregtech.api.enums;
+
+import static gregtech.api.enums.FluidState.GAS;
+import static gregtech.api.enums.GT_Values.M;
+import static gregtech.api.enums.Mods.Thaumcraft;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+import gregtech.api.fluid.GT_FluidFactory;
+import gregtech.api.interfaces.IColorModulationContainer;
+import gregtech.api.interfaces.IMaterialHandler;
+import gregtech.api.interfaces.ISubTagContainer;
+import gregtech.api.objects.MaterialStack;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.render.items.CosmicNeutroniumRenderer;
+import gregtech.common.render.items.GT_GeneratedMaterial_Renderer;
+import gregtech.common.render.items.GaiaSpiritRenderer;
+import gregtech.common.render.items.InfinityRenderer;
+import gregtech.common.render.items.TranscendentMetalRenderer;
+import gregtech.common.render.items.UniversiumRenderer;
+import gregtech.loaders.materialprocessing.ProcessingConfig;
+import gregtech.loaders.materialprocessing.ProcessingModSupport;
+
+@SuppressWarnings("unused") // API Legitimately has unused Members and Methods
+public class Materials implements IColorModulationContainer, ISubTagContainer {
+
+ public static final List<IMaterialHandler> mMaterialHandlers = new ArrayList<>();
+ private static final Map<String, Materials> MATERIALS_MAP = new LinkedHashMap<>();
+
+ public static final Map<Fluid, Materials> FLUID_MAP = new LinkedHashMap<>();
+
+ /**
+ * This is for keeping compatibility with addons mods (Such as TinkersGregworks etc.) that looped over the old
+ * materials enum
+ */
+ @Deprecated
+ public static Collection<Materials> VALUES = new LinkedHashSet<>();
+ /**
+ * This is the Default Material returned in case no Material has been found or a NullPointer has been inserted at a
+ * location where it shouldn't happen.
+ */
+
+ // Spotless breaks the table below into many, many lines
+ // spotless:off
+ public static Materials _NULL = new Materials(-1, TextureSet.SET_NONE, 1.0F, 0, 0, 0, 255, 255, 255, 0, "NULL", "NULL", 0, 0, 0, 0, false, false, 1, 1, 1, Dyes._NULL, Element._NULL, Collections.singletonList(new TC_AspectStack(TC_Aspects.VACUOS, 1)));
+ /**
+ * Direct Elements
+ */
+ public static Materials Aluminium = new Materials( 19, TextureSet.SET_DULL , 10.0F, 128, 2, 1|2 |8 |32|64|128 , 128, 200, 240, 0, "Aluminium" , "Aluminium" , 0, 0, 933, 1700, true, false, 3, 1, 1, Dyes.dyeLightBlue , Element.Al , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.VOLATUS, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials Americium = new Materials( 103, TextureSet.SET_METALLIC , 1.0F, 0, 3, 1|2 |8 |32 , 200, 200, 200, 0, "Americium" , "Americium" , 0, 0, 1449, 0, false, false, 3, 1, 1, Dyes.dyeLightGray , Element.Am , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Antimony = new Materials( 58, TextureSet.SET_SHINY , 1.0F, 0, 2, 1|2 |8 |32 , 220, 220, 240, 0, "Antimony" , "Antimony" , 0, 0, 903, 0, false, false, 2, 1, 1, Dyes.dyeLightGray , Element.Sb , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.AQUA, 1)));
+ public static Materials Argon = new Materials( 24, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 0, 255, 0, 240, "Argon" , "Argon" , 0, 0, 83, 0, false, true, 5, 1, 1, Dyes.dyeGreen , Element.Ar , Collections.singletonList(new TC_AspectStack(TC_Aspects.AER, 2)));
+ public static Materials Arsenic = new Materials( 39, TextureSet.SET_DULL , 1.0F, 0, 2, 1|2 |8|16|32 , 255, 255, 255, 0, "Arsenic" , "Arsenic" , 0, 0, 1090, 0, false, false, 3, 1, 1, Dyes.dyeOrange , Element.As , Collections.singletonList(new TC_AspectStack(TC_Aspects.VENENUM, 3)));
+ public static Materials Barium = new Materials( 63, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 255, 255, 255, 0, "Barium" , "Barium" , 0, 0, 1000, 0, false, false, 1, 1, 1, Dyes._NULL , Element.Ba , Collections.singletonList(new TC_AspectStack(TC_Aspects.VINCULUM, 3)));
+ public static Materials Beryllium = new Materials( 8, TextureSet.SET_METALLIC , 14.0F, 64, 2, 1|2 |8 |32|64 , 100, 180, 100, 0, "Beryllium" , "Beryllium" , 0, 0, 1560, 0, false, false, 6, 1, 1, Dyes.dyeGreen , Element.Be , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.LUCRUM, 1)));
+ public static Materials Bismuth = new Materials( 90, TextureSet.SET_METALLIC , 6.0F, 64, 1, 1|2 |8 |32|64|128 , 100, 160, 160, 0, "Bismuth" , "Bismuth" , 0, 0, 544, 0, false, false, 2, 1, 1, Dyes.dyeCyan , Element.Bi , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1)));
+ public static Materials Boron = new Materials( 9, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |32 , 210, 250, 210, 0, "Boron" , "Boron" , 0, 0, 2349, 0, false, false, 1, 1, 1, Dyes.dyeWhite , Element.B , Collections.singletonList(new TC_AspectStack(TC_Aspects.VITREUS, 3)));
+ public static Materials Caesium = new Materials( 62, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 176, 196, 222, 0, "Caesium" , "Caesium" , 0, 0, 301, 0, false, false, 4, 1, 1, Dyes._NULL , Element.Cs , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Calcium = new Materials( 26, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |32 , 255, 245, 245, 0, "Calcium" , "Calcium" , 0, 0, 1115, 1115, true, false, 4, 1, 1, Dyes.dyePink , Element.Ca , Arrays.asList(new TC_AspectStack(TC_Aspects.SANO, 1), new TC_AspectStack(TC_Aspects.TUTAMEN, 1)));
+ public static Materials Carbon = new Materials( 10, TextureSet.SET_DULL , 1.0F, 64, 2, 1|2 |16|32|64|128 , 20, 20, 20, 0, "Carbon" , "Carbon" , 0, 0, 3800, 0, false, false, 2, 1, 1, Dyes.dyeBlack , Element.C , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_AspectStack(TC_Aspects.IGNIS, 1)));
+ public static Materials Cadmium = new Materials( 55, TextureSet.SET_SHINY , 1.0F, 0, 2, 1 |8 |32 , 50, 50, 60, 0, "Cadmium" , "Cadmium" , 0, 0, 594, 0, false, false, 3, 1, 1, Dyes.dyeGray , Element.Cd , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 1), new TC_AspectStack(TC_Aspects.POTENTIA, 1), new TC_AspectStack(TC_Aspects.VENENUM, 1)));
+ public static Materials Cerium = new Materials( 65, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 123, 212, 144, 0, "Cerium" , "Cerium" , 0, 0, 1068, 1068, true, false, 4, 1, 1, Dyes._NULL , Element.Ce , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Chlorine = new Materials( 23, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 255, 255, 255, 0, "Chlorine" , "Chlorine" , 0, 0, 171, 0, false, false, 2, 1, 1, Dyes.dyeCyan , Element.Cl , Arrays.asList(new TC_AspectStack(TC_Aspects.AQUA, 2), new TC_AspectStack(TC_Aspects.PANNUS, 1)));
+ public static Materials Chrome = new Materials( 30, TextureSet.SET_SHINY , 11.0F, 256, 3, 1|2 |8 |32|64|128 , 255, 230, 230, 0, "Chrome" , "Chrome" , 0, 0, 2180, 1700, true, false, 5, 1, 1, Dyes.dyePink , Element.Cr , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.MACHINA, 1)));
+ public static Materials Cobalt = new Materials( 33, TextureSet.SET_METALLIC , 8.0F, 512, 3, 1|2 |8 |32|64|128 , 80, 80, 250, 0, "Cobalt" , "Cobalt" , 0, 0, 1768, 1700, true, false, 3, 1, 1, Dyes.dyeBlue , Element.Co , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials Copper = new Materials( 35, TextureSet.SET_DULL , 1.0F, 0, 1, 1|2 |8 |32 |128 , 255, 100, 0, 0, "Copper" , "Copper" , 0, 0, 1357, 0, false, false, 3, 1, 1, Dyes.dyeOrange , Element.Cu , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.PERMUTATIO, 1)));
+ public static Materials Deuterium = new Materials( 2, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 255, 255, 0, 240, "Deuterium" , "Deuterium" , 0, 0, 14, 0, false, true, 10, 1, 1, Dyes.dyeYellow , Element.D , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 3)));
+ public static Materials Dysprosium = new Materials( 73, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 105, 209, 80, 0, "Dysprosium" , "Dysprosium" , 0, 0, 1680, 1680, true, false, 4, 1, 1, Dyes._NULL , Element.Dy , Collections.singletonList(new TC_AspectStack(TC_Aspects.METALLUM, 3)));
+ public static Materials Empty = new Materials( 0, TextureSet.SET_NONE , 1.0F, 0, 2, 256/*Only when needed*/ , 255, 255, 255, 255, "Empty" , "Empty" , 0, 0, -1, 0, false, true, 1, 1, 1, Dyes._NULL , Element._NULL , Collections.singletonList(new TC_AspectStack(TC_Aspects.VACUOS, 2)));
+ public static Materials Erbium = new Materials( 75, TextureSet.SET_SHINY , 1.0F, 0, 2, 1|2 |8 |32 , 176, 152, 81, 0, "Erbium" , "Erbium" , 0, 0, 1802, 1802, true, false, 4, 1, 1, Dyes._NULL , Element.Er , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Europium = new Materials( 70, TextureSet.SET_SHINY , 1.0F, 0, 2, 1|2 |8 |32 , 246, 181, 255, 0, "Europium" , "Europium" , 0, 0, 1099, 1099, true, false, 4, 1, 1, Dyes._NULL , Element.Eu , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Fluorine = new Materials( 14, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 255, 255, 255, 127, "Fluorine" , "Fluorine" , 0, 0, 53, 0, false, true, 2, 1, 1, Dyes.dyeGreen , Element.F , Collections.singletonList(new TC_AspectStack(TC_Aspects.PERDITIO, 2)));
+ public static Materials Gadolinium = new Materials( 71, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 59, 186, 28, 0, "Gadolinium" , "Gadolinium" , 0, 0, 1585, 1585, true, false, 4, 1, 1, Dyes._NULL , Element.Gd , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Gallium = new Materials( 37, TextureSet.SET_SHINY , 1.0F, 64, 2, 1|2 |8 |32 , 220, 220, 255, 0, "Gallium" , "Gallium" , 0, 0, 302, 0, false, false, 5, 1, 1, Dyes.dyeLightGray , Element.Ga , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.ELECTRUM, 1)));
+ public static Materials Gold = new Materials( 86, TextureSet.SET_SHINY , 12.0F, 64, 2, 1|2 |8 |32|64|128 , 255, 255, 30, 0, "Gold" , "Gold" , 0, 0, 1337, 0, false, false, 4, 1, 1, Dyes.dyeYellow , Element.Au , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.LUCRUM, 2)));
+ public static Materials Holmium = new Materials( 74, TextureSet.SET_SHINY , 1.0F, 0, 2, 1|2 |8 |32 , 22, 8, 166, 0, "Holmium" , "Holmium" , 0, 0, 1734, 1734, true, false, 4, 1, 1, Dyes._NULL , Element.Ho , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Hydrogen = new Materials( 1, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 0, 0, 255, 240, "Hydrogen" , "Hydrogen" , 1, 20, 14, 0, false, true, 2, 1, 1, Dyes.dyeBlue , Element.H , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1)));
+ public static Materials Helium = new Materials( 4, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 255, 255, 0, 240, "Helium" , "Helium" , 0, 0, 1, 0, false, true, 5, 1, 1, Dyes.dyeYellow , Element.He , Collections.singletonList(new TC_AspectStack(TC_Aspects.AER, 2)));
+ public static Materials Helium_3 = new Materials( 5, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 255, 255, 0, 240, "Helium_3" , "Helium-3" , 0, 0, 1, 0, false, true, 10, 1, 1, Dyes.dyeYellow , Element.He_3 , Collections.singletonList(new TC_AspectStack(TC_Aspects.AER, 3)));
+ public static Materials Indium = new Materials( 56, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 64, 0, 128, 0, "Indium" , "Indium" , 0, 0, 429, 0, false, false, 4, 1, 1, Dyes.dyeGray , Element.In , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Iridium = new Materials( 84, TextureSet.SET_DULL , 6.0F, 2560, 3, 1|2 |8 |32|64|128 , 240, 240, 245, 0, "Iridium" , "Iridium" , 0, 0, 2719, 4500, true, false, 10, 1, 1, Dyes.dyeWhite , Element.Ir , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.MACHINA, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Iron = new Materials( 32, TextureSet.SET_METALLIC , 6.0F, 256, 2, 1|2 |8 |32|64|128 , 200, 200, 200, 0, "Iron" , "Iron" , 0, 0, 1811, 0, false, false, 3, 1, 1, Dyes.dyeLightGray , Element.Fe , Collections.singletonList(new TC_AspectStack(TC_Aspects.METALLUM, 3)));
+ public static Materials Lanthanum = new Materials( 64, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 138, 138, 138, 0, "Lanthanum" , "Lanthanum" , 0, 0, 1193, 1193, true, false, 4, 1, 1, Dyes._NULL , Element.La , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Lead = new Materials( 89, TextureSet.SET_DULL , 8.0F, 64, 1, 1|2 |8 |32|64|128 , 140, 100, 140, 0, "Lead" , "Lead" , 0, 0, 600, 0, false, false, 3, 1, 1, Dyes.dyePurple , Element.Pb , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.ORDO, 1)));
+ public static Materials Lithium = new Materials( 6, TextureSet.SET_DULL , 1.0F, 0, 2, 1|2 |8 |32 , 225, 220, 255, 0, "Lithium" , "Lithium" , 0, 0, 454, 0, false, false, 4, 1, 1, Dyes.dyeLightBlue , Element.Li , Arrays.asList(new TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_AspectStack(TC_Aspects.POTENTIA, 2)));
+ public static Materials Lutetium = new Materials( 78, TextureSet.SET_SHINY , 1.0F, 0, 2, 1|2 |8 |32 , 188, 62, 199, 0, "Lutetium" , "Lutetium" , 0, 0, 1925, 1925, true, false, 4, 1, 1, Dyes._NULL , Element.Lu , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Magic = new Materials(-128, TextureSet.SET_SHINY , 8.0F, 5120, 5, 1|2|4|8|16|32|64|128 , 100, 0, 200, 0, "Magic" , "Magic" , 5, 32, 5000, 0, false, false, 7, 1, 1, Dyes.dyePurple , Element.Ma , Collections.singletonList(new TC_AspectStack(TC_Aspects.PRAECANTATIO, 4)));
+ public static Materials Magnesium = new Materials( 18, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 255, 200, 200, 0, "Magnesium" , "Magnesium" , 0, 0, 923, 0, false, false, 3, 1, 1, Dyes.dyePink , Element.Mg , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.SANO, 1)));
+ public static Materials Manganese = new Materials( 31, TextureSet.SET_DULL , 7.0F, 512, 2, 1|2 |8 |32|64 , 250, 250, 250, 0, "Manganese" , "Manganese" , 0, 0, 1519, 0, false, false, 3, 1, 1, Dyes.dyeWhite , Element.Mn , Collections.singletonList(new TC_AspectStack(TC_Aspects.METALLUM, 3)));
+ public static Materials Mercury = new Materials( 87, TextureSet.SET_SHINY , 1.0F, 0, 0, 16|32 , 255, 220, 220, 0, "Mercury" , "Mercury" , 5, 32, 234, 0, false, false, 3, 1, 1, Dyes.dyeLightGray , Element.Hg , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 1), new TC_AspectStack(TC_Aspects.AQUA, 1), new TC_AspectStack(TC_Aspects.VENENUM, 1)));
+ public static Materials Molybdenum = new Materials( 48, TextureSet.SET_SHINY , 7.0F, 512, 2, 1|2 |8 |32|64 , 180, 180, 220, 0, "Molybdenum" , "Molybdenum" , 0, 0, 2896, 0, false, false, 1, 1, 1, Dyes.dyeBlue , Element.Mo , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1)));
+ public static Materials Neodymium = new Materials( 67, TextureSet.SET_METALLIC , 7.0F, 512, 2, 1|2 |8 |32|64|128 , 100, 100, 100, 0, "Neodymium" , "Neodymium" , 0, 0, 1297, 1297, true, false, 4, 1, 1, Dyes._NULL , Element.Nd , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.MAGNETO, 2)));
+ public static Materials Neutronium = new Materials( 129, TextureSet.SET_DULL , 24.0F, 655360, 6, 1|2 |8 |32|64|128 , 250, 250, 250, 0, "Neutronium" , "Neutronium" , 0, 0, 10000, 10000, true, false, 20, 1, 1, Dyes.dyeWhite , Element.Nt , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 4), new TC_AspectStack(TC_Aspects.VITREUS, 3), new TC_AspectStack(TC_Aspects.ALIENIS, 2))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe().setProcessingMaterialTierEU(TierEU.RECIPE_LuV);
+ public static Materials Nickel = new Materials( 34, TextureSet.SET_METALLIC , 6.0F, 64, 2, 1|2 |8 |32|64|128 , 200, 200, 250, 0, "Nickel" , "Nickel" , 0, 0, 1728, 0, false, false, 4, 1, 1, Dyes.dyeLightBlue , Element.Ni , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.IGNIS, 1)));
+ public static Materials Niobium = new Materials( 47, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 190, 180, 200, 0, "Niobium" , "Niobium" , 0, 0, 2750, 2750, true, false, 5, 1, 1, Dyes._NULL , Element.Nb , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.ELECTRUM, 1)));
+ public static Materials Nitrogen = new Materials( 12, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 0, 150, 200, 240, "Nitrogen" , "Nitrogen" , 0, 0, 63, 0, false, true, 2, 1, 1, Dyes.dyeCyan , Element.N , Collections.singletonList(new TC_AspectStack(TC_Aspects.AER, 2)));
+ public static Materials Osmium = new Materials( 83, TextureSet.SET_METALLIC , 16.0F, 1280, 4, 1|2 |8 |32|64|128 , 50, 50, 255, 0, "Osmium" , "Osmium" , 0, 0, 3306, 4500, true, false, 10, 1, 1, Dyes.dyeBlue , Element.Os , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.MACHINA, 1), new TC_AspectStack(TC_Aspects.NEBRISUM, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Oxygen = new Materials( 13, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 0, 100, 200, 240, "Oxygen" , "Oxygen" , 0, 0, 54, 0, false, true, 1, 1, 1, Dyes.dyeWhite , Element.O , Collections.singletonList(new TC_AspectStack(TC_Aspects.AER, 1)));
+ public static Materials Palladium = new Materials( 52, TextureSet.SET_SHINY , 8.0F, 512, 4, 1|2 |8 |32|64|128 , 128, 128, 128, 0, "Palladium" , "Palladium" , 0, 0, 1828, 1828, true, false, 4, 1, 1, Dyes.dyeGray , Element.Pd , Collections.singletonList(new TC_AspectStack(TC_Aspects.METALLUM, 3))).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Phosphorus = new Materials( 21, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |32 , 255, 255, 0, 0, "Phosphorus" , "Phosphorus" , 0, 0, 317, 0, false, false, 2, 1, 1, Dyes.dyeYellow , Element.P , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2), new TC_AspectStack(TC_Aspects.POTENTIA, 1)));
+ public static Materials Platinum = new Materials( 85, TextureSet.SET_SHINY , 12.0F, 64, 4, 1|2 |8 |32|64|128 , 255, 255, 200, 0, "Platinum" , "Platinum" , 0, 0, 2041, 0, false, false, 6, 1, 1, Dyes.dyeOrange , Element.Pt , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.NEBRISUM, 1)));
+ public static Materials Plutonium = new Materials( 100, TextureSet.SET_METALLIC , 6.0F, 512, 3, 1|2 |8 |32|64 , 240, 50, 50, 0, "Plutonium" , "Plutonium 239" , 0, 0, 912, 0, false, false, 6, 1, 1, Dyes.dyeLime , Element.Pu , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 2)));
+ public static Materials Plutonium241 = new Materials( 101, TextureSet.SET_SHINY , 6.0F, 512, 3, 1|2 |8 |32|64 , 250, 70, 70, 0, "Plutonium241" , "Plutonium 241" , 0, 0, 912, 0, false, false, 6, 1, 1, Dyes.dyeLime , Element.Pu_241 , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 3)));
+ public static Materials Potassium = new Materials( 25, TextureSet.SET_METALLIC , 1.0F, 0, 1, 1|2 |32 , 154, 172, 223, 0, "Potassium" , "Potassium" , 0, 0, 336, 0, false, false, 2, 1, 1, Dyes.dyeWhite , Element.K , Arrays.asList(new TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_AspectStack(TC_Aspects.POTENTIA, 1)));
+ public static Materials Praseodymium = new Materials( 66, TextureSet.SET_DULL , 1.0F, 0, 2, 1|2 |8 |32 , 117, 214, 129, 0, "Praseodymium" , "Praseodymium" , 0, 0, 1208, 1208, true, false, 4, 1, 1, Dyes._NULL , Element.Pr , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Promethium = new Materials( 68, TextureSet.SET_SHINY , 1.0F, 0, 2, 1|2 |8 |32 , 36, 181, 53, 0, "Promethium" , "Promethium" , 0, 0, 1315, 1315, true, false, 4, 1, 1, Dyes._NULL , Element.Pm , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Radon = new Materials( 93, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 255, 0, 255, 240, "Radon" , "Radon" , 0, 0, 202, 0, false, true, 5, 1, 1, Dyes.dyePurple , Element.Rn , Arrays.asList(new TC_AspectStack(TC_Aspects.AER, 1), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Rubidium = new Materials( 43, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 240, 30, 30, 0, "Rubidium" , "Rubidium" , 0, 0, 312, 0, false, false, 4, 1, 1, Dyes.dyeRed , Element.Rb , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.VITREUS, 1)));
+ public static Materials Samarium = new Materials( 69, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 255, 255, 204, 0, "Samarium" , "Samarium" , 0, 0, 1345, 1345, true, false, 4, 1, 1, Dyes.dyeWhite , Element.Sm , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1), new TC_AspectStack(TC_Aspects.MAGNETO,10)));
+ public static Materials Scandium = new Materials( 27, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 204, 204, 204, 0, "Scandium" , "Scandium" , 0, 0, 1814, 1814, true, false, 2, 1, 1, Dyes.dyeYellow , Element.Sc , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Silicon = new Materials( 20, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 60, 60, 80, 0, "Silicon" , "Raw Silicon" , 0, 0, 2273, 2273, true, false, 1, 1, 1, Dyes.dyeBlack , Element.Si , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.TENEBRAE, 1)));
+ public static Materials Silver = new Materials( 54, TextureSet.SET_SHINY , 10.0F, 64, 2, 1|2 |8 |32|64|128 , 220, 220, 255, 0, "Silver" , "Silver" , 0, 0, 1234, 0, false, false, 3, 1, 1, Dyes.dyeLightGray , Element.Ag , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.LUCRUM, 1)));
+ public static Materials Sodium = new Materials( 17, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |16|32 , 0, 0, 150, 0, "Sodium" , "Sodium" , 0, 0, 370, 0, false, false, 1, 1, 1, Dyes.dyeBlue , Element.Na , Arrays.asList(new TC_AspectStack(TC_Aspects.VITREUS, 2), new TC_AspectStack(TC_Aspects.LUX, 1)));
+ public static Materials Strontium = new Materials( 44, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |8 |32 , 200, 200, 200, 0, "Strontium" , "Strontium" , 0, 0, 1050, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Element.Sr , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.STRONTIO, 1)));
+ public static Materials Sulfur = new Materials( 22, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 |32 , 200, 200, 0, 0, "Sulfur" , "Sulfur" , 0, 0, 388, 0, false, false, 2, 1, 1, Dyes.dyeYellow , Element.S , Collections.singletonList(new TC_AspectStack(TC_Aspects.IGNIS, 1)));
+ public static Materials Tantalum = new Materials( 80, TextureSet.SET_SHINY , 6.0F, 2560, 3, 1|2 |8 |32 , 105, 183, 255, 0, "Tantalum" , "Tantalum" , 0, 0, 3290, 3290, true, false, 4, 1, 1, Dyes._NULL , Element.Ta , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.VINCULUM, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Tellurium = new Materials( 59, TextureSet.SET_DULL , 1.0F, 0, 2, 1|2 |8 |32 , 206, 277, 86, 0, "Tellurium" , "Tellurium" , 0, 0, 722, 0, false, false, 4, 1, 1, Dyes.dyeGray , Element.Te , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Terbium = new Materials( 72, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 255, 255, 255, 0, "Terbium" , "Terbium" , 0, 0, 1629, 1629, true, false, 4, 1, 1, Dyes._NULL , Element.Tb , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Thorium = new Materials( 96, TextureSet.SET_SHINY , 6.0F, 512, 2, 1|2 |8 |32|64 , 0, 30, 0, 0, "Thorium" , "Thorium" , 0, 0, 2115, 0, false, false, 4, 1, 1, Dyes.dyeBlack , Element.Th , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Thulium = new Materials( 76, TextureSet.SET_SHINY , 1.0F, 0, 2, 1|2 |8 |32 , 89, 107, 194, 0, "Thulium" , "Thulium" , 0, 0, 1818, 1818, true, false, 4, 1, 1, Dyes._NULL , Element.Tm , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Tin = new Materials( 57, TextureSet.SET_DULL , 1.0F, 0, 3, 1|2 |8 |32 |128 , 220, 220, 220, 0, "Tin" , "Tin" , 0, 0, 505, 505, false, false, 3, 1, 1, Dyes.dyeWhite , Element.Sn , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.VITREUS, 1)));
+ public static Materials Titanium = new Materials( 28, TextureSet.SET_METALLIC , 7.0F, 1600, 3, 1|2 |8 |32|64|128 , 220, 160, 240, 0, "Titanium" , "Titanium" , 0, 0, 1941, 1940, true, false, 5, 1, 1, Dyes.dyePurple , Element.Ti , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.TUTAMEN, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Tritanium = new Materials( 329, TextureSet.SET_METALLIC , 20.0F,1435392, 6, 1|2 |8 |32|64 , 96, 0, 0, 0, "Tritanium" , "Tritanium" , 0, 0, 9900, 9900, true, false, 1, 1, 1, Dyes.dyeWhite , Element.Tn ,Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.ORDO, 2))).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Tritium = new Materials( 3, TextureSet.SET_METALLIC , 1.0F, 0, 2, 16|32 , 255, 0, 0, 240, "Tritium" , "Tritium" , 0, 0, 14, 0, false, true, 10, 1, 1, Dyes.dyeRed , Element.T , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 4)));
+ public static Materials Tungsten = new Materials( 81, TextureSet.SET_METALLIC , 7.0F, 2560, 3, 1|2 |8 |32|64|128 , 50, 50, 50, 0, "Tungsten" , "Tungsten" , 0, 0, 3695, 3000, true, false, 4, 1, 1, Dyes.dyeBlack , Element.W , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 3), new TC_AspectStack(TC_Aspects.TUTAMEN, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Uranium = new Materials( 98, TextureSet.SET_METALLIC , 6.0F, 512, 3, 1|2 |8 |32|64 , 50, 240, 50, 0, "Uranium" , "Uranium 238" , 0, 0, 1405, 0, false, false, 4, 1, 1, Dyes.dyeGreen , Element.U , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Uranium235 = new Materials( 97, TextureSet.SET_SHINY , 6.0F, 512, 3, 1|2 |8 |32|64 , 70, 250, 70, 0, "Uranium235" , "Uranium 235" , 0, 0, 1405, 0, false, false, 4, 1, 1, Dyes.dyeGreen , Element.U_235 , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 2)));
+ public static Materials Vanadium = new Materials( 29, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 50, 50, 50, 0, "Vanadium" , "Vanadium" , 0, 0, 2183, 2183, true, false, 2, 1, 1, Dyes.dyeBlack , Element.V , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Ytterbium = new Materials( 77, TextureSet.SET_SHINY , 1.0F, 0, 2, 1|2 |8 |32 , 44, 199, 80, 0, "Ytterbium" , "Ytterbium" , 0, 0, 1097, 1097, true, false, 4, 1, 1, Dyes._NULL , Element.Yb , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Yttrium = new Materials( 45, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 220, 250, 220, 0, "Yttrium" , "Yttrium" , 0, 0, 1799, 1799, true, false, 4, 1, 1, Dyes._NULL , Element.Y , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1)));
+ public static Materials Zinc = new Materials( 36, TextureSet.SET_METALLIC , 1.0F, 0, 1, 1|2 |8 |32 , 250, 240, 240, 0, "Zinc" , "Zinc" , 0, 0, 692, 0, false, false, 2, 1, 1, Dyes.dyeWhite , Element.Zn , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.SANO, 1)));
+ public static Materials Grade1PurifiedWater = new Materials( 554, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 0, 0, 255, 0, "Grade1PurifiedWater" , "Grade 1 Purified Water" , 0, 0, 273, 0, false, true, 2, 1, 1, Dyes.dyeBlue , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
+ public static Materials Grade2PurifiedWater = new Materials( 555, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 0, 0, 250, 0, "Grade2PurifiedWater" , "Grade 2 Purified Water" , 0, 0, 273, 0, false, true, 2, 1, 1, Dyes.dyeBlue , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
+ public static Materials Grade3PurifiedWater = new Materials( 556, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 0, 0, 245, 0, "Grade3PurifiedWater" , "Grade 3 Purified Water" , 0, 0, 273, 0, false, true, 2, 1, 1, Dyes.dyeBlue , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
+ public static Materials Grade4PurifiedWater = new Materials( 557, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 0, 0, 240, 0, "Grade4PurifiedWater" , "Grade 4 Purified Water" , 0, 0, 273, 0, false, true, 2, 1, 1, Dyes.dyeBlue , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
+ public static Materials Grade5PurifiedWater = new Materials( 558, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 0, 0, 235, 0, "Grade5PurifiedWater" , "Grade 5 Purified Water" , 0, 0, 273, 0, false, true, 2, 1, 1, Dyes.dyeBlue , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
+ public static Materials Grade6PurifiedWater = new Materials( 559, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 0, 0, 230, 0, "Grade6PurifiedWater" , "Grade 6 Purified Water" , 0, 0, 273, 0, false, true, 2, 1, 1, Dyes.dyeBlue , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
+ public static Materials Grade7PurifiedWater = new Materials( 560, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 0, 0, 225, 0, "Grade7PurifiedWater" , "Grade 7 Purified Water" , 0, 0, 273, 0, false, true, 2, 1, 1, Dyes.dyeBlue , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
+ public static Materials Grade8PurifiedWater = new Materials( 561, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 0, 0, 220, 0, "Grade8PurifiedWater" , "Grade 8 Purified Water" , 0, 0, 273, 0, false, true, 2, 1, 1, Dyes.dyeBlue , Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1))).setHasCorrespondingFluid(true);
+
+ //GT++ materials
+
+ public static Materials Flerovium = new Materials( 984, TextureSet.SET_SHINY , 1.0F, 0, 0, 1|2 |8 |32|64|128 , 255,255, 255, 0, "Flerovium_GT5U" , "Flerovium" , 0, 0, 0, 0, false, false, 1 , 1, 1, Dyes.dyeWhite , Element.Fl , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 3))).disableAutoGeneratedBlastFurnaceRecipes();
+
+ /**
+ * The "Random Material" ones.
+ */
+ public static Materials Organic = new Materials( -1, TextureSet.SET_LEAF , 1.0F, 0, 1, false, "Organic" , "Organic" );
+ public static Materials AnyCopper = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 3, false, "AnyCopper" , "AnyCopper" );
+ public static Materials AnyBronze = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 3, false, "AnyBronze" , "AnyBronze" );
+ public static Materials AnyIron = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 3, false, "AnyIron" , "AnyIron" );
+ public static Materials AnyRubber = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 3, false, "AnyRubber" , "AnyRubber" );
+ public static Materials AnySyntheticRubber = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 3, false, "AnySyntheticRubber" , "AnySyntheticRubber" );
+ public static Materials Crystal = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 3, false, "Crystal" , "Crystal" );
+ public static Materials Quartz = new Materials( -1, TextureSet.SET_QUARTZ , 1.0F, 0, 2, false, "Quartz" , "Quartz" );
+ public static Materials Metal = new Materials( -1, TextureSet.SET_METALLIC , 1.0F, 0, 2, false, "Metal" , "Metal" );
+ public static Materials Unknown = new Materials( -1, TextureSet.SET_DULL , 1.0F, 0, 2, false, "Unknown" , "Unknown" );
+ public static Materials Cobblestone = new Materials( -1, TextureSet.SET_DULL , 1.0F, 0, 1, false, "Cobblestone" , "Cobblestone" );
+ public static Materials BrickNether = new Materials( -1, TextureSet.SET_DULL , 1.0F, 0, 1, false, "BrickNether" , "BrickNether" );
+
+ /**
+ * The "I don't care" Section, everything I don't want to do anything with right now, is right here. Just to make the Material Finder shut up about them.
+ * But I do see potential uses in some of these Materials.
+ */
+ public static Materials Serpentine = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1|2 |8 , 255, 255, 255, 0, "Serpentine" , "Serpentine" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Flux = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Flux" , "Flux" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials OsmiumTetroxide = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "OsmiumTetroxide" , "Osmium Tetroxide" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials RubberTreeSap = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 0 , 255, 255, 255, 0, "RubberTreeSap" , "Rubber Tree Sap" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials PhasedIron = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1|2 , 255, 255, 255, 0, "PhasedIron" , "Phased Iron" , 0, 0, 3300, 3300, true, false, 3, 1, 1, Dyes._NULL );
+ public static Materials PhasedGold = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1|2 , 255, 255, 255, 0, "PhasedGold" , "Phased Gold" , 0, 0, -1, 1800, true, false, 3, 1, 1, Dyes._NULL );
+ public static Materials HeeEndium = new Materials( 770, TextureSet.SET_DULL , 16.0F, 1024, 4, 1|2 |8 |64|128 , 165, 220, 250, 0, "HeeEndium" , "Endium" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeLightBlue );
+ public static Materials Teslatite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 60, 180, 200, 0, "Teslatite" , "Teslatite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Fluix = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 |4 , 255, 255, 255, 0, "Fluix" , "Fluix" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials DarkThaumium = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1|2 , 255, 255, 255, 0, "DarkThaumium" , "Dark Thaumium" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Alfium = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Alfium" , "Alfium" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Mutation = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Mutation" , "Mutation" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Aquamarine = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 |4 , 255, 255, 255, 0, "Aquamarine" , "Aquamarine" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Ender = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Ender" , "Ender" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials SodiumPeroxide = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "SodiumPeroxide" , "Sodium Peroxide" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials IridiumSodiumOxide = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "IridiumSodiumOxide" , "Iridium Sodium Oxide" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials PlatinumGroupSludge = new Materials( 241, TextureSet.SET_POWDER , 1.0F, 0, 2, 1 , 0, 30, 0, 0, "PlatinumGroupSludge" , "Platinum Group Sludge" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Draconium = new Materials( 975, TextureSet.SET_SHINY , 20.0F, 32768, 7, 1|2| 8| 32|64|128 , 122, 68, 176, 0, "Draconium" , "Draconium" , 0, 0, 5000, 7200, true, false, 3, 1, 1, Dyes.dyePink ).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe().setHasCorrespondingPlasma(true);
+ public static Materials DraconiumAwakened = new Materials( 976, TextureSet.SET_SHINY , 40.0F, 65536, 9, 1|2| 8| 32|64|128 , 244, 78, 0, 0, "DraconiumAwakened" , "Awakened Draconium" , 0, 0, 9900, 9900, true, false, 3, 1, 1, Dyes.dyeOrange ).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe().setHasCorrespondingPlasma(true);
+ public static Materials PurpleAlloy = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 0 , 100, 180, 255, 0, "PurpleAlloy" , "Purple Alloy" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials InfusedTeslatite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 0 , 100, 180, 255, 0, "InfusedTeslatite" , "Infused Teslatite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+
+ /**
+ * Unknown Material Components. Dead End Section.
+ */
+ public static Materials Adamantium = new Materials( 319, TextureSet.SET_SHINY , 32.0F, 8192, 10, 1|2 |8 |64|128 , 255, 255, 255, 0, "Adamantium" , "Adamantium" , 0, 0, 7200, 7200, true, false, 1, 1, 1, Dyes.dyeLightGray ).setTurbineMultipliers(1, 5, 1).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Adamite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 3, 1 |8 , 255, 255, 255, 0, "Adamite" , "Adamite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray );
+ public static Materials Adluorite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1|2 |8 |64|128 , 255, 255, 255, 0, "Adluorite" , "Adluorite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightBlue );
+ public static Materials Agate = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Agate" , "Agate" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Alduorite = new Materials( 485, TextureSet.SET_SHINY , 32.0F, 8192, 1, 1|2 |8 |64|128 , 159, 180, 180, 0, "Alduorite" , "Alduorite" , 0, 0, 6600, 6600, true, false, 1, 1, 1, Dyes._NULL ).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(6, 1, 1);
+ public static Materials Amber = new Materials( 514, TextureSet.SET_RUBY , 4.0F, 128, 2, 1 |4|8 |64 , 255, 128, 0, 127, "Amber" , "Amber" , 5, 3, -1, 0, false, true, 1, 1, 1, Dyes.dyeOrange ,1, Arrays.asList(new MaterialStack(Carbon, 10), new MaterialStack(Hydrogen, 10), new MaterialStack(Oxygen, 16)), Arrays.asList(new TC_AspectStack(TC_Aspects.VINCULUM, 2), new TC_AspectStack(TC_Aspects.VITREUS, 1)));
+ public static Materials Ammonium = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Ammonium" , "Ammonium" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Amordrine = new Materials( -1, TextureSet.SET_NONE , 6.0F, 64, 2, 1|2 |8 |64 , 255, 255, 255, 0, "Amordrine" , "Amordrine" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Andesite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 |8 , 255, 255, 255, 0, "Andesite" , "Andesite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Angmallen = new Materials( 958, TextureSet.SET_METALLIC , 10.0F, 128, 2, 1|2 |8 |64 , 215, 225, 138, 0, "Angmallen" , "Angmallen" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Ardite = new Materials( 382, TextureSet.SET_METALLIC , 18.0F, 1024, 4, 1|2 |8 |32|64|128 , 250, 129, 0, 0, "Ardite" , "Ardite" , 0, 0, 1600, 1600, true, false, 1, 1, 1, Dyes.dyeRed ).disableAutoGeneratedBlastFurnaceRecipes().setHasCorrespondingPlasma(true);
+ public static Materials Aredrite = new Materials( -1, TextureSet.SET_NONE , 6.0F, 64, 2, 1|2 |8 |64 , 255, 0, 0, 0, "Aredrite" , "Aredrite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow );
+ public static Materials Atlarus = new Materials( 965, TextureSet.SET_METALLIC , 6.0F, 64, 2, 1|2 |8 |64 , 255, 255, 255, 0, "Atlarus" , "Atlarus" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Bitumen = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 |8 , 255, 255, 255, 0, "Bitumen" , "Bitumen" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Black = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 0 , 0, 0, 0, 0, "Black" , "Black" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeBlack );
+ public static Materials Blizz = new Materials( 851, TextureSet.SET_SHINY , 1.0F, 0, 2, 1 , 220, 233, 255, 0, "Blizz" , "Blizz" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Blueschist = new Materials( 852, TextureSet.SET_DULL , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Blueschist" , "Blueschist" , 0, 0, -1, 0, false, false, 0, 1, 1, Dyes.dyeLightBlue );
+ public static Materials Bluestone = new Materials( 813, TextureSet.SET_DULL , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Bluestone" , "Bluestone" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlue );
+ public static Materials Bloodstone = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Bloodstone" , "Bloodstone" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeRed );
+ public static Materials Blutonium = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 2, 1|2 |8 , 0, 0, 255, 0, "Blutonium" , "Blutonium" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeBlue );
+ public static Materials Carmot = new Materials( 962, TextureSet.SET_METALLIC , 16.0F, 128, 1, 1|2 |8 |64 , 217, 205, 140, 0, "Carmot" , "Carmot" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Celenegil = new Materials( 964, TextureSet.SET_METALLIC , 10.0F, 4096, 2, 1|2 |8 |64 , 148, 204, 72, 0, "Celenegil" , "Celenegil" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials CertusQuartz = new Materials( 516, TextureSet.SET_QUARTZ , 5.0F, 32, 1, 1 |4|8 |64 , 210, 210, 230, 0, "CertusQuartz" , "Certus Quartz" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeLightGray , Arrays.asList(new TC_AspectStack(TC_Aspects.POTENTIA, 1), new TC_AspectStack(TC_Aspects.VITREUS, 1)));
+ public static Materials CertusQuartzCharged = new Materials( 517, TextureSet.SET_QUARTZ , 5.0F, 32, 1, 8 , 221, 221, 236, 0, "ChargedCertusQuartz" , "Charged Certus Quartz" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeLightGray , Arrays.asList(new TC_AspectStack(TC_Aspects.POTENTIA, 1), new TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_AspectStack(TC_Aspects.ELECTRUM, 1)));
+ public static Materials Ceruclase = new Materials( 952, TextureSet.SET_METALLIC , 32.0F, 1280, 2, 1|2 |8 |64|128 , 140, 189, 208, 0, "Ceruclase" , "Ceruclase" , 0, 0, 6600, 6600, true, false, 1, 1, 1, Dyes.dyeBlue ).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(1, 22, 1);
+ public static Materials Citrine = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Citrine" , "Citrine" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials CobaltHexahydrate = new Materials( 853, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |16 , 80, 80, 250, 0, "CobaltHexahydrate" , "Cobalt Hexahydrate" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlue );
+ public static Materials ConstructionFoam = new Materials( 854, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |16 |64|128 , 128, 128, 128, 0, "ConstructionFoam" , "Construction Foam" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeGray );
+ public static Materials Chert = new Materials( 857, TextureSet.SET_DULL , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Chert" , "Chert" , 0, 0, -1, 0, false, false, 0, 1, 1, Dyes._NULL );
+ public static Materials Chimerite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Chimerite" , "Chimerite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Coral = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 1 , 255, 128, 255, 0, "Coral" , "Coral" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials CrudeOil = new Materials( 858, TextureSet.SET_DULL , 1.0F, 0, 2, 1 , 10, 10, 10, 0, "CrudeOil" , "Crude Oil" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack );
+ public static Materials Chrysocolla = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Chrysocolla" , "Chrysocolla" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials CrystalFlux = new Materials( -1, TextureSet.SET_QUARTZ , 1.0F, 0, 3, 1 |4 , 100, 50, 100, 0, "CrystalFlux" , "Flux Crystal" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Cyanite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Cyanite" , "Cyanite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeCyan );
+ public static Materials Dacite = new Materials( 859, TextureSet.SET_DULL , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Dacite" , "Dacite" , 0, 0, -1, 0, false, false, 0, 1, 1, Dyes.dyeLightGray );
+ public static Materials DarkIron = new Materials( 342, TextureSet.SET_DULL , 7.0F, 384, 3, 1|2 |8 |64 , 55, 40, 60, 0, "DarkIron" , "Dark Iron" , 0, 0, -1, 0, false, false, 5, 1, 1, Dyes.dyePurple );
+ public static Materials DarkStone = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "DarkStone" , "Dark Stone" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeBlack );
+ public static Materials Demonite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Demonite" , "Demonite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeRed );
+ public static Materials Desh = new Materials( 884, TextureSet.SET_DULL , 20.0F, 1280, 4, 1|2 |8 |32|64|128 , 40, 40, 40, 0, "Desh" , "Desh" , 0, 0, 2500, 2500, true, false, 1, 1, 1, Dyes.dyeBlack ,Element.De, Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.ALIENIS, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Desichalkos = new Materials( -1, TextureSet.SET_NONE , 6.0F, 1280, 3, 1|2 |8 |64 , 255, 255, 255, 0, "Desichalkos" , "Desichalkos" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Dilithium = new Materials( 515, TextureSet.SET_DIAMOND , 1.0F, 0, 1, 1 |4|8|16 , 255, 250, 250, 127, "Dilithium" , "Dilithium" , 0, 0, -1, 0, false, true, 1, 1, 1, Dyes.dyeWhite );
+ public static Materials Draconic = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Draconic" , "Draconic" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeRed );
+ public static Materials Drulloy = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1|16 , 255, 255, 255, 0, "Drulloy" , "Drulloy" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeRed );
+ public static Materials Duranium = new Materials( 328, TextureSet.SET_METALLIC , 32.0F, 40960, 11, 1|2 |64 , 255, 255, 255, 0, "Duranium" , "Duranium" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray ).setTurbineMultipliers(16, 16, 1);
+ public static Materials Eclogite = new Materials( 860, TextureSet.SET_DULL , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Eclogite" , "Eclogite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials ElectrumFlux = new Materials( 320, TextureSet.SET_SHINY , 16.0F, 512, 3, 1|2 |8 |64|128 , 255, 255, 120, 0, "ElectrumFlux" , "Fluxed Electrum" , 0, 0, 9000, 9000, true, false, 1, 1, 1, Dyes.dyeYellow ).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Emery = new Materials( 861, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 255, 255, 255, 0, "Emery" , "Emery" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials EnderiumBase = new Materials( 380, TextureSet.SET_DULL , 16.0F, 768, 4, 1|2 |64|128 , 72, 119, 153, 0, "EnderiumBase" , "Enderium Base" , 0, 0, 3600, 3600, true, false, 1, 1, 1, Dyes.dyeGreen , 1, Arrays.asList(new MaterialStack(Tin, 2), new MaterialStack(Silver, 1), new MaterialStack(Platinum, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.ALIENIS, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Energized = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 0 , 255, 255, 255, 0, "Energized" , "Energized" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Epidote = new Materials( 862, TextureSet.SET_DULL , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Epidote" , "Epidote" , 0, 0, -1, 0, false, false, 0, 1, 1, Dyes._NULL );
+ public static Materials Eximite = new Materials( 959, TextureSet.SET_METALLIC , 5.0F, 2560, 3, 1|2 |8 |64 , 124, 90, 150, 0, "Eximite" , "Eximite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials FierySteel = new Materials( 346, TextureSet.SET_FIERY , 8.0F, 256, 3, 1|2 |64|128 , 64, 0, 0, 0, "FierySteel" , "Fiery Steel" , 5, 2048, 1811, 1800, true, false, 1, 1, 1, Dyes.dyeRed , Arrays.asList(new TC_AspectStack(TC_Aspects.PRAECANTATIO, 3), new TC_AspectStack(TC_Aspects.IGNIS, 3), new TC_AspectStack(TC_Aspects.CORPUS, 3))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials Firestone = new Materials( 347, TextureSet.SET_QUARTZ , 6.0F, 1280, 3, 1 |4|8 |64 , 200, 20, 0, 0, "Firestone" , "Firestone" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeRed );
+ public static Materials Fluorite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 |8 , 255, 255, 255, 0, "Fluorite" , "Fluorite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeGreen );
+ public static Materials FoolsRuby = new Materials( 512, TextureSet.SET_RUBY , 1.0F, 0, 2, 1 |4|8 , 255, 100, 100, 127, "FoolsRuby" , "Spinel" , 0, 0, -1, 0, false, true, 3, 1, 1, Dyes.dyeRed , 1, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 4)), Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 2), new TC_AspectStack(TC_Aspects.VITREUS, 2)));
+ public static Materials Force = new Materials( 521, TextureSet.SET_DIAMOND , 10.0F, 128, 3, 1|2|4|8 |64|128 , 255, 255, 0, 0, "Force" , "Force" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeYellow , Collections.singletonList(new TC_AspectStack(TC_Aspects.POTENTIA, 5)));
+ public static Materials Forcicium = new Materials( 518, TextureSet.SET_DIAMOND , 1.0F, 0, 1, 1 |4|8|16 , 50, 50, 70, 0, "Forcicium" , "Forcicium" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeGreen , Collections.singletonList(new TC_AspectStack(TC_Aspects.POTENTIA, 2)));
+ public static Materials Forcillium = new Materials( 519, TextureSet.SET_DIAMOND , 1.0F, 0, 1, 1 |4|8|16 , 50, 50, 70, 0, "Forcillium" , "Forcillium" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeGreen , Collections.singletonList(new TC_AspectStack(TC_Aspects.POTENTIA, 2)));
+ public static Materials Gabbro = new Materials( 863, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 255, 255, 255, 0, "Gabbro" , "Gabbro" , 0, 0, -1, 0, false, false, 0, 1, 1, Dyes._NULL );
+ public static Materials Glowstone = new Materials( 811, TextureSet.SET_SHINY , 1.0F, 0, 1, 1 |16 , 255, 255, 0, 0, "Glowstone" , "Glowstone" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow , Arrays.asList(new TC_AspectStack(TC_Aspects.LUX, 2), new TC_AspectStack(TC_Aspects.SENSUS, 1)));
+ public static Materials Gneiss = new Materials( 864, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 255, 255, 255, 0, "Gneiss" , "Gneiss" , 0, 0, -1, 0, false, false, 0, 1, 1, Dyes._NULL );
+ public static Materials Graphite = new Materials( 865, TextureSet.SET_DULL , 5.0F, 32, 2, 1 |8|16 |64 , 128, 128, 128, 0, "Graphite" , "Graphite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeGray , 0, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.VITREUS, 2), new TC_AspectStack(TC_Aspects.IGNIS, 1)));
+ public static Materials Graphene = new Materials( 819, TextureSet.SET_DULL , 6.0F, 32, 1, 1 |64 , 128, 128, 128, 0, "Graphene" , "Graphene" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeGray , 0, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.VITREUS, 2), new TC_AspectStack(TC_Aspects.ELECTRUM, 1)));
+ public static Materials Greenschist = new Materials( 866, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 255, 255, 255, 0, "Greenschist" , "Green Schist" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeGreen );
+ public static Materials Greenstone = new Materials( 867, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 255, 255, 255, 0, "Greenstone" , "Greenstone" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeGreen );
+ public static Materials Greywacke = new Materials( 897, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 255, 255, 255, 0, "Greywacke" , "Greywacke" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeGray );
+ public static Materials Haderoth = new Materials( 963, TextureSet.SET_METALLIC , 10.0F, 3200, 3, 1|2 |8 |64 , 119, 52, 30, 0, "Haderoth" , "Haderoth" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Hematite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1|2 |8 , 255, 255, 255, 0, "Hematite" , "Hematite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Hepatizon = new Materials( 957, TextureSet.SET_METALLIC , 12.0F, 128, 2, 1|2 |8 |64 , 117, 94, 117, 0, "Hepatizon" , "Hepatizon" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials HSLA = new Materials( 322, TextureSet.SET_METALLIC , 6.0F, 500, 3, 1|2 |64|128 , 128, 128, 128, 0, "HSLA" , "HSLA Steel" , 0, 0, 1811, 1000, true, false, 3, 1, 1, Dyes._NULL , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 1), new TC_AspectStack(TC_Aspects.ORDO, 1)));
+ public static Materials Ignatius = new Materials( 950, TextureSet.SET_METALLIC , 12.0F, 512, 2, 1|2 , 255, 169, 83, 0, "Ignatius" , "Ignatius" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Infernal = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 0 , 255, 255, 255, 0, "Infernal" , "Infernal" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Infuscolium = new Materials( 490, TextureSet.SET_METALLIC , 6.0F, 64, 2, 1|2 |8 |64 , 146, 33, 86, 0, "Infuscolium" , "Infuscolium" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials InfusedGold = new Materials( 323, TextureSet.SET_SHINY , 12.0F, 64, 3, 1|2 |8 |64|128 , 255, 200, 60, 0, "InfusedGold" , "Infused Gold" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeYellow );
+ public static Materials InfusedAir = new Materials( 540, TextureSet.SET_SHARDS , 8.0F, 64, 3, 1 |4|8 |64|128 , 255, 255, 0, 0, "InfusedAir" , "Aer" , 5, 160, -1, 0, false, true, 3, 1, 1, Dyes.dyeYellow , Arrays.asList(new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_AspectStack(TC_Aspects.AER, 2)));
+ public static Materials InfusedFire = new Materials( 541, TextureSet.SET_SHARDS , 8.0F, 64, 3, 1 |4|8 |64|128 , 255, 0, 0, 0, "InfusedFire" , "Ignis" , 5, 320, -1, 0, false, true, 3, 1, 1, Dyes.dyeRed , Arrays.asList(new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_AspectStack(TC_Aspects.IGNIS, 2)));
+ public static Materials InfusedEarth = new Materials( 542, TextureSet.SET_SHARDS , 8.0F, 256, 3, 1 |4|8 |64|128 , 0, 255, 0, 0, "InfusedEarth" , "Terra" , 5, 160, -1, 0, false, true, 3, 1, 1, Dyes.dyeGreen , Arrays.asList(new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_AspectStack(TC_Aspects.TERRA, 2)));
+ public static Materials InfusedWater = new Materials( 543, TextureSet.SET_SHARDS , 8.0F, 64, 3, 1 |4|8 |64|128 , 0, 0, 255, 0, "InfusedWater" , "Aqua" , 5, 160, -1, 0, false, true, 3, 1, 1, Dyes.dyeBlue , Arrays.asList(new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_AspectStack(TC_Aspects.AQUA, 2)));
+ public static Materials InfusedEntropy = new Materials( 544, TextureSet.SET_SHARDS , 32.0F, 64, 4, 1 |4|8 |64|128 , 62, 62, 62, 0, "InfusedEntropy" , "Perditio" , 5, 320, -1, 0, false, true, 3, 1, 1, Dyes.dyeBlack , Arrays.asList(new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_AspectStack(TC_Aspects.PERDITIO, 2)));
+ public static Materials InfusedOrder = new Materials( 545, TextureSet.SET_SHARDS , 8.0F, 64, 3, 1 |4|8 |64|128 , 252, 252, 252, 0, "InfusedOrder" , "Ordo" , 5, 240, -1, 0, false, true, 3, 1, 1, Dyes.dyeWhite , Arrays.asList(new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_AspectStack(TC_Aspects.ORDO, 2)));
+ public static Materials InfusedVis = new Materials( -1, TextureSet.SET_SHARDS , 8.0F, 64, 3, 1 |4|8 |64|128 , 255, 0, 255, 0, "InfusedVis" , "Auram" , 5, 240, -1, 0, false, true, 3, 1, 1, Dyes.dyePurple , Arrays.asList(new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_AspectStack(TC_Aspects.AURAM, 2)));
+ public static Materials InfusedDull = new Materials( -1, TextureSet.SET_SHARDS , 32.0F, 64, 3, 1 |4|8 |64|128 , 100, 100, 100, 0, "InfusedDull" , "Vacuus" , 5, 160, -1, 0, false, true, 3, 1, 1, Dyes.dyeLightGray , Arrays.asList(new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1), new TC_AspectStack(TC_Aspects.VACUOS, 2)));
+ public static Materials Inolashite = new Materials( 954, TextureSet.SET_NONE , 8.0F, 2304, 3, 1|2 |8 |64 , 148, 216, 187, 0, "Inolashite" , "Inolashite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeGreen );
+ public static Materials Invisium = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1 , 255, 255, 255, 0, "Invisium" , "Invisium" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Jade = new Materials( 537, TextureSet.SET_SHINY , 1.0F, 16, 2, 1 |4|8 |64 , 0, 100, 0, 0, "Jade" , "Jade" , 0, 0, -1, 0, false, false, 5, 1, 1, Dyes.dyeGreen ,0, Arrays.asList(new MaterialStack(Sodium, 1), new MaterialStack(Aluminium, 1), new MaterialStack(Silicon, 2), new MaterialStack(Oxygen, 6)), Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 6), new TC_AspectStack(TC_Aspects.VITREUS, 3)));
+ public static Materials Kalendrite = new Materials( 953, TextureSet.SET_METALLIC , 5.0F, 2560, 3, 1|2 , 170, 91, 189, 0, "Kalendrite" , "Kalendrite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Komatiite = new Materials( 869, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 255, 255, 255, 0, "Komatiite" , "Komatiite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow );
+ public static Materials Lava = new Materials( 700, TextureSet.SET_FLUID , 1.0F, 0, 1, 16 , 255, 64, 0, 0, "Lava" , "Lava" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange );
+ public static Materials Lemurite = new Materials( 486, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 , 219, 219, 219, 0, "Lemurite" , "Lemurite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Limestone = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 1 , 255, 255, 255, 0, "Limestone" , "Limestone" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Magma = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 0 , 255, 64, 0, 0, "Magma" , "Magma" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange );
+ public static Materials Mawsitsit = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 1 , 255, 255, 255, 0, "Mawsitsit" , "Mawsitsit" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Mercassium = new Materials( -1, TextureSet.SET_NONE , 6.0F, 64, 1, 1|2 |8 |64 , 255, 255, 255, 0, "Mercassium" , "Mercassium" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials MeteoricIron = new Materials( 340, TextureSet.SET_METALLIC , 6.0F, 384, 3, 1|2 |8 |32|64 , 100, 50, 80, 0, "MeteoricIron" , "Meteoric Iron" , 0, 0, 1811, 1000, true, false, 1, 1, 1, Dyes.dyeGray ,Element.SpFe, Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.MAGNETO, 1)));
+ public static Materials MeteoricSteel = new Materials( 341, TextureSet.SET_METALLIC , 6.0F, 768, 4, 1|2 |64 , 50, 25, 40, 0, "MeteoricSteel" , "Meteoric Steel" , 0, 0, 1811, 1000, true, false, 4, 51, 50, Dyes.dyeGray , 1, Arrays.asList(new MaterialStack(MeteoricIron, 50), new MaterialStack(Carbon, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.MAGNETO, 1), new TC_AspectStack(TC_Aspects.ORDO, 1)));
+ public static Materials Meteorite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 1 |8 , 80, 35, 60, 0, "Meteorite" , "Meteorite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyePurple );
+ public static Materials Meutoite = new Materials( 487, TextureSet.SET_METALLIC , 1.0F, 0, 1, 1 |8 , 95, 82, 105, 0, "Meutoite" , "Meutoite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Migmatite = new Materials( 872, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 255, 255, 255, 0, "Migmatite" , "Migmatite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Mimichite = new Materials( -1, TextureSet.SET_GEM_VERTICAL , 1.0F, 0, 1, 1 |4|8 , 255, 255, 255, 0, "Mimichite" , "Mimichite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Moonstone = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 1 |8 , 255, 255, 255, 0, "Moonstone" , "Moonstone" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeWhite , Arrays.asList(new TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_AspectStack(TC_Aspects.ALIENIS, 1)));
+ public static Materials Naquadah = new Materials( 324, TextureSet.SET_METALLIC , 6.0F, 1280, 4, 1|2 |8 |32|64|128 , 50, 50, 50, 0, "Naquadah" , "Naquadah" , 0, 0, 5400, 5400, true, false, 10, 1, 1, Dyes.dyeBlack , Element.Nq, Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 3), new TC_AspectStack(TC_Aspects.RADIO, 1), new TC_AspectStack(TC_Aspects.NEBRISUM, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials NaquadahAlloy = new Materials( 325, TextureSet.SET_METALLIC , 8.0F, 5120, 5, 1|2 |64|128 , 40, 40, 40, 0, "NaquadahAlloy" , "Naquadah Alloy" , 0, 0, 7200, 7200, true, false, 10, 1, 1, Dyes.dyeBlack , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 4), new TC_AspectStack(TC_Aspects.NEBRISUM, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials NaquadahEnriched = new Materials( 326, TextureSet.SET_METALLIC , 6.0F, 1280, 4, 1|2 |8 |64 , 50, 50, 50, 0, "NaquadahEnriched" , "Enriched Naquadah" , 0, 0, 4500, 4500, true, false, 15, 1, 1, Dyes.dyeBlack , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 3), new TC_AspectStack(TC_Aspects.RADIO, 2), new TC_AspectStack(TC_Aspects.NEBRISUM, 2))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Naquadria = new Materials( 327, TextureSet.SET_SHINY , 1.0F, 512, 4, 1|2 |8 |64 , 30, 30, 30, 0, "Naquadria" , "Naquadria" , 0, 0, 9000, 9000, true, false, 20, 1, 1, Dyes.dyeBlack , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 4), new TC_AspectStack(TC_Aspects.RADIO, 3), new TC_AspectStack(TC_Aspects.NEBRISUM, 3))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Nether = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 0 , 255, 255, 255, 0, "Nether" , "Nether" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials NetherBrick = new Materials( 814, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 100, 0, 0, 0, "NetherBrick" , "Nether Brick" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeRed , Collections.singletonList(new TC_AspectStack(TC_Aspects.IGNIS, 1)));
+ public static Materials NetherQuartz = new Materials( 522, TextureSet.SET_QUARTZ , 1.0F, 32, 1, 1 |4|8 |64 , 230, 210, 210, 0, "NetherQuartz" , "Nether Quartz" , 0, 0, -1, 0, false, false, 2, 1, 1, Dyes.dyeWhite , Arrays.asList(new TC_AspectStack(TC_Aspects.POTENTIA, 1), new TC_AspectStack(TC_Aspects.VITREUS, 1)));
+ public static Materials NetherStar = new Materials( 506, TextureSet.SET_NETHERSTAR , 6.0F, 5120, 4, 1| 4|8 |64 , 255, 255, 255, 0, "NetherStar" , "Nether Star" , 5, 50000, -1, 0, false, false, 15, 1, 1, Dyes.dyeWhite );
+ public static Materials ObsidianFlux = new Materials( -1, TextureSet.SET_DULL , 1.0F, 0, 1, 1|2 , 80, 50, 100, 0, "ObsidianFlux" , "Fluxed Obsidian" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyePurple );
+ public static Materials Oilsands = new Materials( 878, TextureSet.SET_NONE , 1.0F, 0, 1, 1 |8 , 10, 10, 10, 0, "Oilsands" , "Oilsands" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Onyx = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 1 , 255, 255, 255, 0, "Onyx" , "Onyx" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Orichalcum = new Materials( 966, TextureSet.SET_METALLIC , 32.0F, 20480, 1, 1|2 |8 |64|128 , 84, 122, 56, 0, "Orichalcum" , "Orichalcum" , 0, 0, 6000, 6000, true, false, 1, 1, 1, Dyes._NULL ).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(1, 6, 1);
+ public static Materials Osmonium = new Materials( -1, TextureSet.SET_NONE , 6.0F, 64, 1, 1|2 |8 |64 , 255, 255, 255, 0, "Osmonium" , "Osmonium" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeBlue );
+ public static Materials Oureclase = new Materials( 961, TextureSet.SET_METALLIC , 6.0F, 1920, 3, 1|2 |8 |64 , 183, 98, 21, 0, "Oureclase" , "Oureclase" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Painite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 0 , 255, 255, 255, 0, "Painite" , "Painite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Peanutwood = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 0 , 255, 255, 255, 0, "Peanutwood" , "Peanut Wood" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Petroleum = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 1 |8 , 255, 255, 255, 0, "Petroleum" , "Petroleum" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Pewter = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 0 , 255, 255, 255, 0, "Pewter" , "Pewter" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Phoenixite = new Materials( -1, TextureSet.SET_NONE , 6.0F, 64, 1, 1|2 |8 |64 , 255, 255, 255, 0, "Phoenixite" , "Phoenixite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes._NULL );
+ public static Materials Prometheum = new Materials( 960, TextureSet.SET_METALLIC , 8.0F, 512, 1, 1|2 |8 |64 , 90, 129, 86, 0, "Prometheum" , "Prometheum" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Quartzite = new Materials( 523, TextureSet.SET_QUARTZ , 1.0F, 0, 1, 1 |4|8 , 210, 230, 210, 0, "Quartzite" , "Quartzite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeWhite );
+ public static Materials Randomite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 1 |8 , 255, 255, 255, 0, "Randomite" , "Randomite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Rhyolite = new Materials( 875, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 255, 255, 255, 0, "Rhyolite" , "Rhyolite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Rubracium = new Materials( 488, TextureSet.SET_METALLIC , 1.0F, 128, 1, 1|2 |8 |64|128 , 151, 45, 45, 0, "Rubracium" , "Rubracium" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeRed );
+ public static Materials Sand = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 0 , 255, 255, 255, 0, "Sand" , "Sand" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow );
+ public static Materials Sanguinite = new Materials( 955, TextureSet.SET_METALLIC , 3.0F, 4480, 4, 1|2 |8 , 185, 0, 0, 0, "Sanguinite" , "Sanguinite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Siltstone = new Materials( 876, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 255, 255, 255, 0, "Siltstone" , "Siltstone" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL );
+ public static Materials Sunstone = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 1 |8 , 255, 255, 255, 0, "Sunstone" , "Sunstone" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeYellow , Arrays.asList(new TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_AspectStack(TC_Aspects.ALIENIS, 1)));
+ public static Materials Tar = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 0 , 10, 10, 10, 0, "Tar" , "Tar" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack );
+ public static Materials Tartarite = new Materials( 956, TextureSet.SET_METALLIC , 32.0F, 20480, 3, 1|2 |8 , 255, 118, 60, 0, "Tartarite" , "Tartarite" , 0, 0, 10400, 10400, true, false, 1, 1, 1, Dyes._NULL ).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(1120, 1120, 1);
+ public static Materials UUAmplifier = new Materials( 721, TextureSet.SET_FLUID , 1.0F, 0, 1, 16 , 96, 0, 128, 0, "UUAmplifier" , "UU-Amplifier" , 0, 0, -1, 0, false, false, 10, 1, 1, Dyes.dyePink );
+ public static Materials UUMatter = new Materials( 703, TextureSet.SET_FLUID , 1.0F, 0, 1, 16 , 128, 0, 196, 0, "UUMatter" , "UU-Matter" , 0, 0, -1, 0, false, false, 10, 1, 1, Dyes.dyePink );
+ public static Materials Void = new Materials( 970, TextureSet.SET_METALLIC , 32.0F, 512, 4, 1|2 |64|128 , 28, 6, 57, 0, "Void" , "Void" , 5, 1500, -1, 0, false, true, 5, 2, 1, Dyes.dyeBlack , Collections.singletonList(new TC_AspectStack(TC_Aspects.VACUOS, 1)));
+ public static Materials Voidstone = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 1, 0 , 255, 255, 255, 200, "Voidstone" , "Voidstone" , 0, 0, -1, 0, false, true, 1, 1, 1, Dyes._NULL , Arrays.asList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_AspectStack(TC_Aspects.VACUOS, 1)));
+ public static Materials Vulcanite = new Materials( 489, TextureSet.SET_METALLIC , 32.0F, 20480, 2, 1|2 |8 |64|128 , 255, 132, 72, 0, "Vulcanite" , "Vulcanite" , 0, 0, 8400, 8400, true, false, 1, 1, 1, Dyes._NULL ).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(40, 1, 1);
+ public static Materials Vyroxeres = new Materials( 951, TextureSet.SET_METALLIC , 32.0F, 7680, 1, 1|2 |8 |64 , 85, 224, 1, 0, "Vyroxeres" , "Vyroxeres" , 0, 0, 5400, 5400, true, false, 1, 1, 1, Dyes._NULL ).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(1, 3, 1);
+ public static Materials Yellorium = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1|2 , 255, 255, 255, 0, "Yellorium" , "Yellorium" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeYellow );
+ public static Materials Zectium = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 2, 1|2 |8 , 255, 255, 255, 0, "Zectium" , "Zectium" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeBlack );
+
+ /**
+ * Circuitry, Batteries and other Technical things
+ */
+ public static Materials Primitive = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Primitive" , "Primitive" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 1)));
+ public static Materials Basic = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Basic" , "Basic" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 2)));
+ public static Materials Good = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Good" , "Good" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 3)));
+ public static Materials Advanced = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Advanced" , "Advanced" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 4)));
+ public static Materials Data = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Data" , "Data" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 5)));
+ public static Materials Elite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Elite" , "Elite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 6)));
+ public static Materials Master = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Master" , "Master" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 7)));
+ public static Materials Ultimate = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Ultimate" , "Ultimate" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 8)));
+ public static Materials Infinite = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Infinite" , "Infinite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 9)));
+ public static Materials Bio = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Bio" , "Bio" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 10)));
+ public static Materials Nano = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Nano" , "Bio" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 11)));
+ public static Materials Piko = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Piko" , "Bio" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 12)));
+ public static Materials Quantum = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Quantum" , "Bio" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 13)));
+ public static Materials Optical = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Optical" , "Optical" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 13)));
+ public static Materials Exotic = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Exotic" , "Exotic" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 14)));
+ public static Materials Cosmic = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Cosmic" , "Cosmic" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 15)));
+ public static Materials Transcendent = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Transcendent" , "Transcendent" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 16)));
+ public static Materials Resistor = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Resistor" , "Resistor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 1)));
+ public static Materials Diode = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Diode" , "Diode" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 1)));
+ public static Materials Transistor = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Transistor" , "Transistor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 1)));
+ public static Materials Capacitor = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Capacitor" , "Capacitor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 1)));
+ public static Materials Inductor = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Inductor" , "Inductor" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 1)));
+
+ /**
+ * Not possible to determine exact Components
+ */
+ public static Materials Antimatter = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Antimatter" , "Antimatter" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyePink , Arrays.asList(new TC_AspectStack(TC_Aspects.POTENTIA, 9), new TC_AspectStack(TC_Aspects.PERFODIO, 8)));
+ public static Materials AdvancedGlue = new MaterialBuilder(567, TextureSet.SET_FLUID , "Advanced Glue").setName("AdvancedGlue").addCell().addFluid().setRGB(255, 255, 185).setColor(Dyes.dyeYellow).setAspects(Collections.singletonList(new TC_AspectStack(TC_Aspects.LIMUS, 5))).constructMaterial();
+ public static Materials BioFuel = new Materials( 705, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 255, 128, 0, 0, "BioFuel" , "Biofuel" , 0, 6, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange );
+ public static Materials Biomass = new Materials( 704, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 0, 255, 0, 0, "Biomass" , "Forestry Biomass" , 3, 8, -1, 0, false, false, 1, 1, 1, Dyes.dyeGreen );
+ public static Materials CharcoalByproducts = new MaterialBuilder(675, TextureSet.SET_FLUID , "Charcoal Byproducts").addCell().setRGB(120, 68, 33).setColor(Dyes.dyeBrown).constructMaterial();
+ public static Materials Cheese = new Materials( 894, TextureSet.SET_FINE , 1.0F, 0, 0, 1 |8 , 255, 255, 0, 0, "Cheese" , "Cheese" , 0, 0, 320, 0, false, false, 1, 1, 1, Dyes.dyeYellow );
+ public static Materials Chili = new Materials( 895, TextureSet.SET_FINE , 1.0F, 0, 0, 1 , 200, 0, 0, 0, "Chili" , "Chili" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeRed );
+ public static Materials Chocolate = new Materials( 886, TextureSet.SET_FINE , 1.0F, 0, 0, 1 , 190, 95, 0, 0, "Chocolate" , "Chocolate" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBrown );
+ public static Materials Cluster = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 127, "Cluster" , "Cluster" , 0, 0, -1, 0, false, true, 1, 1, 1, Dyes.dyeWhite );
+ public static Materials CoalFuel = new Materials( 710, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 50, 50, 70, 0, "CoalFuel" , "Coalfuel" , 0, 16, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack );
+ public static Materials Cocoa = new Materials( 887, TextureSet.SET_FINE , 1.0F, 0, 0, 1 , 190, 95, 0, 0, "Cocoa" , "Cocoa" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBrown );
+ public static Materials Coffee = new Materials( 888, TextureSet.SET_FINE , 1.0F, 0, 0, 1 , 150, 75, 0, 0, "Coffee" , "Coffee" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBrown );
+ public static Materials Creosote = new Materials( 712, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 128, 64, 0, 0, "Creosote" , "Creosote" , 3, 8, -1, 0, false, false, 1, 1, 1, Dyes.dyeBrown );
+ public static Materials Ethanol = new Materials( 706, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 255, 128, 0, 0, "Ethanol" , "Ethanol" , 0, 192, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange , 1, Arrays.asList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.VENENUM, 1), new TC_AspectStack(TC_Aspects.AQUA, 1)));
+ public static Materials FishOil = new Materials( 711, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 255, 196, 0, 0, "FishOil" , "Fish Oil" , 3, 2, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow , Collections.singletonList(new TC_AspectStack(TC_Aspects.CORPUS, 2)));
+ public static Materials FermentedBiomass = new MaterialBuilder(691, TextureSet.SET_FLUID , "Fermented Biomass").addCell().addFluid().setRGB(68, 85, 0).setColor(Dyes.dyeBrown).constructMaterial();
+ public static Materials Fuel = new Materials( 708, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 255, 255, 0, 0, "Fuel" , "Diesel" , 0, 480, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow );
+ public static Materials Glue = new Materials( 726, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 200, 196, 0, 0, "Glue" , "Refined Glue" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange , Collections.singletonList(new TC_AspectStack(TC_Aspects.LIMUS, 2)));
+ public static Materials Gunpowder = new Materials( 800, TextureSet.SET_DULL , 1.0F, 0, 0, 1 , 128, 128, 128, 0, "Gunpowder" , "Gunpowder" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeGray , Arrays.asList(new TC_AspectStack(TC_Aspects.PERDITIO, 3), new TC_AspectStack(TC_Aspects.IGNIS, 4)));
+ public static Materials FryingOilHot = new Materials( 727, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 200, 196, 0, 0, "FryingOilHot" , "Hot Frying Oil" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange , Arrays.asList(new TC_AspectStack(TC_Aspects.AQUA, 1), new TC_AspectStack(TC_Aspects.IGNIS, 1)));
+ public static Materials Honey = new Materials( 725, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 210, 200, 0, 0, "Honey" , "Honey" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow );
+ public static Materials Leather = new Materials( -1, TextureSet.SET_ROUGH , 1.0F, 0, 0, 1 , 150, 150, 80, 127, "Leather" , "Leather" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange );
+ public static Materials Lubricant = new Materials( 724, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 255, 196, 0, 0, "Lubricant" , "Lubricant" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange , Arrays.asList(new TC_AspectStack(TC_Aspects.AQUA, 2), new TC_AspectStack(TC_Aspects.MACHINA, 1)));
+ public static Materials McGuffium239 = new Materials( 999, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 200, 50, 150, 0, "McGuffium239" , "Mc Guffium 239" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyePink , Arrays.asList(new TC_AspectStack(TC_Aspects.ALIENIS, 8), new TC_AspectStack(TC_Aspects.PERMUTATIO, 8), new TC_AspectStack(TC_Aspects.SPIRITUS, 8), new TC_AspectStack(TC_Aspects.AURAM, 8), new TC_AspectStack(TC_Aspects.VITIUM, 8), new TC_AspectStack(TC_Aspects.RADIO, 8), new TC_AspectStack(TC_Aspects.MAGNETO, 8), new TC_AspectStack(TC_Aspects.ELECTRUM, 8), new TC_AspectStack(TC_Aspects.NEBRISUM, 8), new TC_AspectStack(TC_Aspects.STRONTIO, 8)));
+ public static Materials MeatRaw = new Materials( 892, TextureSet.SET_FINE , 1.0F, 0, 0, 1 , 255, 100, 100, 0, "MeatRaw" , "Raw Meat" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyePink );
+ public static Materials MeatCooked = new Materials( 893, TextureSet.SET_FINE , 1.0F, 0, 0, 1 , 150, 60, 20, 0, "MeatCooked" , "Cooked Meat" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyePink );
+ public static Materials Milk = new Materials( 885, TextureSet.SET_FINE , 1.0F, 0, 0, 1 |16 , 254, 254, 254, 0, "Milk" , "Milk" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeWhite , Collections.singletonList(new TC_AspectStack(TC_Aspects.SANO, 2)));
+ public static Materials Mud = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Mud" , "Mud" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBrown );
+ public static Materials Oil = new Materials( 707, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 10, 10, 10, 0, "Oil" , "Oil" , 3, 20, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack );
+ public static Materials Paper = new Materials( 879, TextureSet.SET_PAPER , 1.0F, 0, 0, 1 , 250, 250, 250, 0, "Paper" , "Paper" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeWhite , Collections.singletonList(new TC_AspectStack(TC_Aspects.COGNITIO, 1)));
+ public static Materials Peat = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "Peat" , "Peat" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBrown , Arrays.asList(new TC_AspectStack(TC_Aspects.POTENTIA, 2), new TC_AspectStack(TC_Aspects.IGNIS, 2)));
+ public static Materials RareEarth = new Materials( 891, TextureSet.SET_FINE , 1.0F, 0, 0, 1 , 128, 128, 100, 0, "RareEarth" , "Rare Earth" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeGray , Arrays.asList(new TC_AspectStack(TC_Aspects.VITREUS, 1), new TC_AspectStack(TC_Aspects.LUCRUM, 1)));
+ public static Materials Red = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 0, 0, 0, "Red" , "Red" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeRed );
+ public static Materials Reinforced = new Materials( 383, TextureSet.SET_METALLIC , 7.0F, 480, 4, 1|2 |64|128 , 105, 141, 165, 0, "Reinforced" , "Reinforced" , 0, 0, -1, 1700, true, false, 1, 1, 1, Dyes.dyeBlue ).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials SeedOil = new Materials( 713, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 196, 255, 0, 0, "SeedOil" , "Seed Oil" , 3, 2, -1, 0, false, false, 1, 1, 1, Dyes.dyeLime , Collections.singletonList(new TC_AspectStack(TC_Aspects.GRANUM, 2)));
+ public static Materials SeedOilHemp = new Materials( 722, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 196, 255, 0, 0, "SeedOilHemp" , "Hemp Seed Oil" , 3, 2, -1, 0, false, false, 1, 1, 1, Dyes.dyeLime , Collections.singletonList(new TC_AspectStack(TC_Aspects.GRANUM, 2)));
+ public static Materials SeedOilLin = new Materials( 723, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 196, 255, 0, 0, "SeedOilLin" , "Lin Seed Oil" , 3, 2, -1, 0, false, false, 1, 1, 1, Dyes.dyeLime , Collections.singletonList(new TC_AspectStack(TC_Aspects.GRANUM, 2)));
+ public static Materials Stone = new Materials( 299, TextureSet.SET_ROUGH , 4.0F, 32, 1, 1 |64|128 , 205, 205, 205, 0, "Stone" , "Stone" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.TERRA, 1)));
+ public static Materials TNT = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 0, 0 , 255, 255, 255, 0, "TNT" , "TNT" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeRed , Arrays.asList(new TC_AspectStack(TC_Aspects.PERDITIO, 7), new TC_AspectStack(TC_Aspects.IGNIS, 4)));
+ public static Materials Unstable = new Materials( 396, TextureSet.SET_SHINY , 1.0F, 0, 4, 1 , 220, 220, 220, 127, "Unstable" , "Unstable" , 0, 0, -1, 0, false, true, 1, 1, 1, Dyes.dyeWhite , Collections.singletonList(new TC_AspectStack(TC_Aspects.PERDITIO, 4)));
+ public static Materials Unstableingot = new Materials( -1, TextureSet.SET_NONE , 1.0F, 0, 4, 0 , 255, 255, 255, 127, "Unstableingot" , "Unstable" , 0, 0, -1, 0, false, true, 1, 1, 1, Dyes.dyeWhite , Collections.singletonList(new TC_AspectStack(TC_Aspects.PERDITIO, 4)));
+ public static Materials Vinegar = new MaterialBuilder(690, TextureSet.SET_FLUID , "Vinegar").setColor(Dyes.dyeBrown).constructMaterial();
+ public static Materials Wheat = new Materials( 881, TextureSet.SET_POWDER , 1.0F, 0, 0, 1 , 255, 255, 196, 0, "Wheat" , "Wheat" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow , Collections.singletonList(new TC_AspectStack(TC_Aspects.MESSIS, 2)));
+ public static Materials WoodGas = new MaterialBuilder(660, TextureSet.SET_FLUID , "Wood Gas").addCell().addGas().setRGB(222, 205, 135).setColor(Dyes.dyeBrown).setFuelType(MaterialBuilder.GAS).setFuelPower(24).constructMaterial();
+ public static Materials WoodTar = new MaterialBuilder(662, TextureSet.SET_FLUID , "Wood Tar").addCell().addFluid().setRGB(40, 23, 11).setColor(Dyes.dyeBrown).constructMaterial();
+ public static Materials WoodVinegar = new MaterialBuilder(661, TextureSet.SET_FLUID , "Wood Vinegar").addCell().addFluid().setRGB(212, 85, 0).setColor(Dyes.dyeBrown).constructMaterial();
+ public static Materials WeedEX9000 = new MaterialBuilder(242, TextureSet.SET_FLUID , "Weed-EX 9000").addFluid().setRGB(64, 224, 86).setColor(Dyes.dyeGreen).constructMaterial();
+
+ /**
+ * TODO: This
+ */
+ public static Materials AluminiumBrass = new Materials( -1, TextureSet.SET_METALLIC , 6.0F, 64, 2, 1|2 |64 , 255, 255, 255, 0, "AluminiumBrass" , "Aluminium Brass" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow );
+ public static Materials Osmiridium = new Materials( 317, TextureSet.SET_METALLIC , 7.0F, 1600, 3, 1|2 |64|128 , 100, 100, 255, 0, "Osmiridium" , "Osmiridium" , 0, 0, 3500, 4500, true, false, 1, 1, 1, Dyes.dyeLightBlue , 1, Arrays.asList(new MaterialStack(Iridium, 3), new MaterialStack(Osmium, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Sunnarium = new Materials( 318, TextureSet.SET_SHINY , 1.0F, 0, 1, 1|2 |64|128 , 255, 255, 0, 0, "Sunnarium" , "Sunnarium" , 0, 0, 4200, 4200, true, false, 1, 1, 1, Dyes.dyeYellow ).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials Endstone = new Materials( 808, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 255, 255, 255, 0, "Endstone" , "Endstone" , 0, 0, -1, 0, false, false, 0, 1, 1, Dyes.dyeYellow );
+ public static Materials Netherrack = new Materials( 807, TextureSet.SET_DULL , 1.0F, 0, 0, 1 , 200, 0, 0, 0, "Netherrack" , "Netherrack" , 0, 0, -1, 0, false, false, 0, 1, 1, Dyes.dyeRed );
+ public static Materials SoulSand = new Materials( -1, TextureSet.SET_DULL , 1.0F, 0, 0, 1 , 255, 255, 255, 0, "SoulSand" , "Soulsand" , 0, 0, -1, 0, false, false, 0, 1, 1, Dyes.dyeBrown );
+ /**
+ * First Degree Compounds
+ */
+ public static Materials Methane = new Materials( 715, TextureSet.SET_FLUID , 1.0F, 0, 1, 16 , 255, 255, 255, 0, "Methane" , "Methane" , 1, 104, -1, 0, false, false, 3, 1, 1, Dyes.dyeMagenta , 1, Arrays.asList(new MaterialStack(Carbon, 1), new MaterialStack(Hydrogen, 4)));
+ public static Materials CarbonDioxide = new Materials( 497, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 169, 208, 245, 240, "CarbonDioxide" , "Carbon Dioxide" , 0, 0, 25, 1, false, true, 1, 1, 1, Dyes.dyeLightBlue , 0, Arrays.asList(new MaterialStack(Carbon, 1), new MaterialStack(Oxygen, 2))).setHasCorrespondingGas(true);
+ public static Materials NobleGases = new Materials( 496, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 169, 208, 245, 240, "NobleGases" , "Noble Gases" , 0, 0, 4, 0, false, true, 1, 1, 1, Dyes.dyeLightBlue , 2, Arrays.asList(new MaterialStack(CarbonDioxide,21),new MaterialStack(Helium, 9), new MaterialStack(Methane, 3), new MaterialStack(Deuterium, 1))).setHasCorrespondingGas(true);
+ public static Materials Air = new Materials( -1, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 169, 208, 245, 240, "Air" , "Air" , 0, 0, -1, 0, false, true, 1, 1, 1, Dyes.dyeLightBlue , 0, Arrays.asList(new MaterialStack(Nitrogen, 40), new MaterialStack(Oxygen, 11), new MaterialStack(Argon, 1),new MaterialStack(NobleGases,1)));
+ public static Materials LiquidAir = new Materials( 495, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 169, 208, 245, 240, "LiquidAir" , "Liquid Air" , 0, 0, 4, 0, false, true, 1, 1, 1, Dyes.dyeLightBlue , 2, Arrays.asList(new MaterialStack(Nitrogen, 40), new MaterialStack(Oxygen, 11), new MaterialStack(Argon, 1),new MaterialStack(NobleGases,1)));
+ public static Materials LiquidNitrogen = new Materials( 494, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 169, 208, 245, 240, "LiquidNitrogen" , "Liquid Nitrogen" , 0, 0, 4, 0, false, true, 1, 1, 1, Dyes.dyeLightBlue , 1, Collections.singletonList(new MaterialStack(Nitrogen, 1)));
+ public static Materials LiquidOxygen = new Materials( 493, TextureSet.SET_FLUID , 1.0F, 0, 2, 16|32 , 169, 208, 245, 240, "LiquidOxygen" , "Liquid Oxygen" , 0, 0, 4, 0, false, true, 1, 1, 1, Dyes.dyeLightBlue , 1, Collections.singletonList(new MaterialStack(Oxygen, 1)));
+ public static Materials SiliconDioxide = new MaterialBuilder(837, TextureSet.SET_QUARTZ, "Silicon Dioxide").setToolSpeed(1.0F).setDurability(0).setToolQuality(1).addDustItems().setRGB(255, 255, 255).setColor(Dyes.dyeLightGray).setOreValue(1).setExtraData(0).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Oxygen, 2)).constructMaterial();
+ public static Materials Jasper = new Materials( 511, TextureSet.SET_EMERALD , 1.0F, 0, 2, 1 |4|8 |64 , 200, 80, 80, 100, "Jasper" , "Jasper" , 0, 0, -1, 0, false, true, 3, 1, 1, Dyes.dyeRed , 1, Collections.singletonList(new MaterialStack(SiliconDioxide, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 4), new TC_AspectStack(TC_Aspects.VITREUS, 2)));
+ public static Materials Almandine = new Materials( 820, TextureSet.SET_ROUGH , 1.0F, 0, 1, 1 |8 , 255, 0, 0, 0, "Almandine" , "Almandine" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeRed , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Iron, 3), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 12)));
+ public static Materials Andradite = new Materials( 821, TextureSet.SET_ROUGH , 1.0F, 0, 1, 1 |8 , 150, 120, 0, 0, "Andradite" , "Andradite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeYellow , 1, Arrays.asList(new MaterialStack(Calcium, 3), new MaterialStack(Iron, 2), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 12)));
+ public static Materials AnnealedCopper = new Materials( 345, TextureSet.SET_SHINY , 1.0F, 0, 2, 1|2 |128 , 255, 120, 20, 0, "AnnealedCopper" , "Annealed Copper" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeOrange , 2, Collections.singletonList(new MaterialStack(Copper, 1)));
+ public static Materials Asbestos = new Materials( 946, TextureSet.SET_DULL , 1.0F, 0, 1, 1 |8 , 230, 230, 230, 0, "Asbestos" , "Asbestos" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 1, Arrays.asList(new MaterialStack(Magnesium, 3), new MaterialStack(Silicon, 2), new MaterialStack(Hydrogen, 4), new MaterialStack(Oxygen, 9))); // Mg3Si2O5(OH)4
+ public static Materials Ash = new Materials( 815, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 150, 150, 150, 0, "Ash" , "Ashes" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , 2, Collections.singletonList(new MaterialStack(Carbon, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.PERDITIO, 1)));
+ public static Materials BandedIron = new Materials( 917, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 145, 90, 90, 0, "BandedIron" , "Banded Iron" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBrown , 1, Arrays.asList(new MaterialStack(Iron, 2), new MaterialStack(Oxygen, 3)));
+ public static Materials BatteryAlloy = new Materials( 315, TextureSet.SET_DULL , 1.0F, 0, 1, 1|2 , 156, 124, 160, 0, "BatteryAlloy" , "Battery Alloy" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyePurple , 2, Arrays.asList(new MaterialStack(Lead, 4), new MaterialStack(Antimony, 1)));
+ public static Materials BlueTopaz = new Materials( 513, TextureSet.SET_GEM_HORIZONTAL , 7.0F, 256, 3, 1 |4|8 |64 , 0, 0, 255, 127, "BlueTopaz" , "Blue Topaz" , 0, 0, -1, 0, false, true, 3, 1, 1, Dyes.dyeBlue , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 1), new MaterialStack(Fluorine, 2), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 6)), Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 6), new TC_AspectStack(TC_Aspects.VITREUS, 4)));
+ public static Materials Bone = new Materials( 806, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 250, 250, 250, 0, "Bone" , "Bone" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 0, Collections.singletonList(new MaterialStack(Calcium, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.MORTUUS, 2), new TC_AspectStack(TC_Aspects.CORPUS, 1)));
+ public static Materials Brass = new Materials( 301, TextureSet.SET_METALLIC , 7.0F, 96, 1, 1|2 |64|128 , 255, 180, 0, 0, "Brass" , "Brass" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow , 2, Arrays.asList(new MaterialStack(Zinc, 1), new MaterialStack(Copper, 3)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1)));
+ public static Materials Bronze = new Materials( 300, TextureSet.SET_METALLIC , 6.0F, 192, 2, 1|2 |64|128 , 255, 128, 0, 0, "Bronze" , "Bronze" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange , 2, Arrays.asList(new MaterialStack(Tin, 1), new MaterialStack(Copper, 3)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1)));
+ public static Materials BrownLimonite = new Materials( 930, TextureSet.SET_METALLIC , 1.0F, 0, 1, 1 |8 , 200, 100, 0, 0, "BrownLimonite" , "Brown Limonite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBrown , 2, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Hydrogen, 1), new MaterialStack(Oxygen, 2))); // FeO(OH)
+ public static Materials Calcite = new Materials( 823, TextureSet.SET_DULL , 1.0F, 0, 1, 1 |8 , 250, 230, 220, 0, "Calcite" , "Calcite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange , 1, Arrays.asList(new MaterialStack(Calcium, 1), new MaterialStack(Carbon, 1), new MaterialStack(Oxygen, 3)));
+ public static Materials Cassiterite = new Materials( 824, TextureSet.SET_METALLIC , 1.0F, 0, 3, 1 |8 , 220, 220, 220, 0, "Cassiterite" , "Cassiterite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 1, Arrays.asList(new MaterialStack(Tin, 1), new MaterialStack(Oxygen, 2)));
+ public static Materials CassiteriteSand = new Materials( 937, TextureSet.SET_SAND , 1.0F, 0, 1, 1 |8 , 220, 220, 220, 0, "CassiteriteSand" , "Cassiterite Sand" , 0, 0, -1, 0, false, false, 4, 1, 1, Dyes.dyeWhite , 1, Arrays.asList(new MaterialStack(Tin, 1), new MaterialStack(Oxygen, 2)));
+ public static Materials Chalcopyrite = new Materials( 855, TextureSet.SET_DULL , 1.0F, 0, 1, 1 |8 , 160, 120, 40, 0, "Chalcopyrite" , "Chalcopyrite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow , 1, Arrays.asList(new MaterialStack(Copper, 1), new MaterialStack(Iron, 1), new MaterialStack(Sulfur, 2)));
+ public static Materials Charcoal = new Materials( 536, TextureSet.SET_FINE , 1.0F, 0, 1, 1 |4 , 100, 70, 70, 0, "Charcoal" , "Charcoal" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack , 1, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.POTENTIA, 2), new TC_AspectStack(TC_Aspects.IGNIS, 2)));
+ public static Materials Chromite = new Materials( 825, TextureSet.SET_METALLIC , 1.0F, 0, 1, 1 |8 , 35, 20, 15, 0, "Chromite" , "Chromite" , 0, 0, 1700, 1700, true, false, 6, 1, 1, Dyes.dyePink , 1, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Chrome, 2), new MaterialStack(Oxygen, 4)));
+ public static Materials ChromiumDioxide = new Materials( 361, TextureSet.SET_DULL , 11.0F, 256, 3, 1|2 , 230, 200, 200, 0, "ChromiumDioxide" , "Chromium Dioxide" , 0, 0, 650, 650, false, false, 5, 1, 1, Dyes.dyePink , 1, Arrays.asList(new MaterialStack(Chrome, 1), new MaterialStack(Oxygen, 2)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.MACHINA, 1)));
+ public static Materials Cinnabar = new Materials( 826, TextureSet.SET_ROUGH , 1.0F, 0, 1, 1 |8 , 150, 0, 0, 0, "Cinnabar" , "Cinnabar" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeBrown , 2, Arrays.asList(new MaterialStack(Mercury, 1), new MaterialStack(Sulfur, 1)));
+ public static Materials Water = new Materials( 701, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 0, 0, 255, 0, "Water" , "Water" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlue , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 2)));
+ public static Materials Clay = new Materials( 805, TextureSet.SET_ROUGH , 1.0F, 0, 1, 1 , 200, 200, 220, 0, "Clay" , "Clay" , 0, 0, -1, 0, false, false, 5, 1, 1, Dyes.dyeLightBlue , 0, Arrays.asList(new MaterialStack(Sodium, 2), new MaterialStack(Lithium, 1), new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 2),new MaterialStack(Oxygen,7),new MaterialStack(Water,2)));
+ public static Materials Coal = new Materials( 535, TextureSet.SET_ROUGH , 1.0F, 0, 1, 1 |4|8 , 70, 70, 70, 0, "Coal" , "Coal" , 0, 0, -1, 0, false, false, 2, 2, 1, Dyes.dyeBlack , 1, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.POTENTIA, 2), new TC_AspectStack(TC_Aspects.IGNIS, 2)));
+ public static Materials Cobaltite = new Materials( 827, TextureSet.SET_METALLIC , 1.0F, 0, 1, 1 |8 , 80, 80, 250, 0, "Cobaltite" , "Cobaltite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeBlue , 1, Arrays.asList(new MaterialStack(Cobalt, 1), new MaterialStack(Arsenic, 1), new MaterialStack(Sulfur, 1)));
+ public static Materials Cooperite = new Materials( 828, TextureSet.SET_METALLIC , 1.0F, 0, 1, 1 |8 , 255, 255, 200, 0, "Cooperite" , "Sheldonite" , 0, 0, -1, 0, false, false, 5, 1, 1, Dyes.dyeYellow , 2, Arrays.asList(new MaterialStack(Platinum, 3), new MaterialStack(Nickel, 1), new MaterialStack(Sulfur, 1), new MaterialStack(Palladium, 1)));
+ public static Materials Cupronickel = new Materials( 310, TextureSet.SET_METALLIC , 6.0F, 64, 1, 1|2 |64 , 227, 150, 128, 0, "Cupronickel" , "Cupronickel" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange , 2, Arrays.asList(new MaterialStack(Copper, 1), new MaterialStack(Nickel, 1)));
+ public static Materials DarkAsh = new Materials( 816, TextureSet.SET_DULL , 1.0F, 0, 1, 1 , 50, 50, 50, 0, "DarkAsh" , "Dark Ashes" , 0, 0, -1, 0, false, false, 1, 2, 1, Dyes.dyeGray , 1, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.IGNIS, 1), new TC_AspectStack(TC_Aspects.PERDITIO, 1)));
+ public static Materials DeepIron = new Materials( 829, TextureSet.SET_METALLIC , 6.0F, 384, 2, 1|2 |8 |64 , 150, 140, 140, 0, "DeepIron" , "Deep Iron" , 0, 0, 7500, 7500, true, false, 3, 1, 1, Dyes.dyePink , 2, Collections.singletonList(new MaterialStack(Iron, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.MAGNETO, 1))).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Diamond = new Materials( 500, TextureSet.SET_DIAMOND , 8.0F, 1280, 4, 1 |4|8 |64|128 , 200, 255, 255, 127, "Diamond" , "Diamond" , 0, 0, -1, 0, false, true, 5, 64, 1, Dyes.dyeWhite , 1, Collections.singletonList(new MaterialStack(Carbon, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.VITREUS, 3), new TC_AspectStack(TC_Aspects.LUCRUM, 4)));
+ public static Materials Electrum = new Materials( 303, TextureSet.SET_SHINY , 12.0F, 64, 2, 1|2 |8 |64|128 , 255, 255, 100, 0, "Electrum" , "Electrum" , 0, 0, -1, 0, false, false, 4, 1, 1, Dyes.dyeYellow , 2, Arrays.asList(new MaterialStack(Silver, 1), new MaterialStack(Gold, 1)));
+ public static Materials Emerald = new Materials( 501, TextureSet.SET_EMERALD , 7.0F, 256, 4, 1 |4|8 |64 , 80, 255, 80, 127, "Emerald" , "Emerald" , 0, 0, -1, 0, false, true, 5, 1, 1, Dyes.dyeGreen , 0, Arrays.asList(new MaterialStack(Beryllium, 3), new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 6), new MaterialStack(Oxygen, 18)), Arrays.asList(new TC_AspectStack(TC_Aspects.VITREUS, 3), new TC_AspectStack(TC_Aspects.LUCRUM, 5)));
+ public static Materials FreshWater = new Materials( -1, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 0, 0, 255, 0, "FreshWater" , "Fresh Water" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlue , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 2)));
+ public static Materials Galena = new Materials( 830, TextureSet.SET_DULL , 1.0F, 0, 3, 1 |8 , 100, 60, 100, 0, "Galena" , "Galena" , 0, 0, -1, 0, false, false, 4, 1, 1, Dyes.dyePurple , 1, Arrays.asList(new MaterialStack(Lead, 1), new MaterialStack(Sulfur, 1)));
+ public static Materials Garnierite = new Materials( 906, TextureSet.SET_METALLIC , 1.0F, 0, 3, 1 |8 , 50, 200, 70, 0, "Garnierite" , "Garnierite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightBlue , 1, Arrays.asList(new MaterialStack(Nickel, 1), new MaterialStack(Oxygen, 1)));
+ public static Materials Glyceryl = new Materials( 714, TextureSet.SET_FLUID , 1.0F, 0, 1, 16 , 0, 150, 150, 0, "Glyceryl" , "Glyceryl Trinitrate" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeCyan , 1, Arrays.asList(new MaterialStack(Carbon, 3), new MaterialStack(Hydrogen, 5), new MaterialStack(Nitrogen, 3), new MaterialStack(Oxygen, 9)));
+ public static Materials GreenSapphire = new MaterialBuilder(504, TextureSet.SET_GEM_HORIZONTAL, "Green Sapphire").setToolSpeed(7.0F).setDurability(256).setToolQuality(2).addDustItems().addGemItems().setTransparent(true).addOreItems().addToolHeadItems().setRGBA(100, 200, 130, 127).setColor(Dyes.dyeCyan).setOreValue(5).setExtraData(0).setMaterialList(new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 3)).setAspects(Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 5), new TC_AspectStack(TC_Aspects.VITREUS, 3))).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials Grossular = new Materials( 831, TextureSet.SET_ROUGH , 1.0F, 0, 1, 1 |8 , 200, 100, 0, 0, "Grossular" , "Grossular" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeOrange , 0, Arrays.asList(new MaterialStack(Calcium, 3), new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 12)));
+ public static Materials HolyWater = new Materials( 729, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 0, 0, 255, 0, "HolyWater" , "Holy Water" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlue , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.AQUA, 2), new TC_AspectStack(TC_Aspects.AURAM, 1)));
+ public static Materials Ice = new Materials( 702, TextureSet.SET_SHINY , 1.0F, 0, 0, 1| 16 , 200, 200, 255, 0, "Ice" , "Ice" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlue , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.GELUM, 2)));
+ public static Materials Ilmenite = new Materials( 918, TextureSet.SET_METALLIC , 1.0F, 0, 3, 1 |8 , 70, 55, 50, 0, "Ilmenite" , "Ilmenite" , 0, 0, -1, 0, false, false, 1, 2, 1, Dyes.dyePurple , 0, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Titanium, 1), new MaterialStack(Oxygen, 3)));
+ public static Materials Rutile = new Materials( 375, TextureSet.SET_GEM_HORIZONTAL , 1.0F, 0, 2, 1 |8 , 212, 13, 92, 0, "Rutile" , "Rutile" , 0, 0, -1, 0, false, false, 1, 2, 1, Dyes.dyeRed , 0, Arrays.asList(new MaterialStack(Titanium, 1), new MaterialStack(Oxygen, 2)));
+ public static Materials Bauxite = new Materials( 822, TextureSet.SET_DULL , 1.0F, 0, 1, 1 |8 , 200, 100, 0, 0, "Bauxite" , "Bauxite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeBrown , 1, Arrays.asList(new MaterialStack(Rutile, 2), new MaterialStack(Aluminium, 16), new MaterialStack(Hydrogen, 10), new MaterialStack(Oxygen, 11)));
+ public static Materials Titaniumtetrachloride = new Materials( 376, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 212, 13, 92, 0, "Titaniumtetrachloride" , "Titaniumtetrachloride" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeRed , 0, Arrays.asList(new MaterialStack(Titanium, 1), new MaterialStack(Chlorine, 4)));
+ public static Materials Magnesiumchloride = new Materials( 377, TextureSet.SET_DULL , 1.0F, 0, 2, 1|16 , 212, 13, 92, 0, "Magnesiumchloride" , "Magnesiumchloride" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeRed , 0, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Chlorine, 2)));
+ public static Materials Invar = new Materials( 302, TextureSet.SET_METALLIC , 6.0F, 256, 2, 1|2 |64|128 , 180, 180, 120, 0, "Invar" , "Invar" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBrown , 2, Arrays.asList(new MaterialStack(Iron, 2), new MaterialStack(Nickel, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.GELUM, 1)));
+ public static Materials Kanthal = new Materials( 312, TextureSet.SET_METALLIC , 6.0F, 64, 2, 1|2 |64 , 194, 210, 223, 0, "Kanthal" , "Kanthal" , 0, 0, 1800, 1800, true, false, 1, 1, 1, Dyes.dyeYellow , 2, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Aluminium, 1), new MaterialStack(Chrome, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials Lazurite = new Materials( 524, TextureSet.SET_LAPIS , 1.0F, 0, 1, 1 |4|8 , 100, 120, 255, 0, "Lazurite" , "Lazurite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeCyan , 1, Arrays.asList(new MaterialStack(Aluminium, 6), new MaterialStack(Silicon, 6), new MaterialStack(Calcium, 8), new MaterialStack(Sodium, 8)));
+ public static Materials Magnalium = new Materials( 313, TextureSet.SET_DULL , 6.0F, 256, 2, 1|2 |64|128 , 200, 190, 255, 0, "Magnalium" , "Magnalium" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightBlue , 2, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Aluminium, 2)));
+ public static Materials Magnesite = new Materials( 908, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |8 , 250, 250, 180, 0, "Magnesite" , "Magnesite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyePink , 1, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Carbon, 1), new MaterialStack(Oxygen, 3)));
+ public static Materials Magnetite = new Materials( 870, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |8 , 30, 30, 30, 0, "Magnetite" , "Magnetite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeGray , 1, Arrays.asList(new MaterialStack(Iron, 3), new MaterialStack(Oxygen, 4)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.MAGNETO, 1)));
+ public static Materials Molybdenite = new Materials( 942, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |8 , 25, 25, 25, 0, "Molybdenite" , "Molybdenite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlue , 1, Arrays.asList(new MaterialStack(Molybdenum, 1), new MaterialStack(Sulfur, 2))); // MoS2 (also source of Re)
+ public static Materials Nichrome = new Materials( 311, TextureSet.SET_METALLIC , 6.0F, 64, 2, 1|2 |64 , 205, 206, 246, 0, "Nichrome" , "Nichrome" , 0, 0, 2700, 2700, true, false, 1, 1, 1, Dyes.dyeRed , 2, Arrays.asList(new MaterialStack(Nickel, 4), new MaterialStack(Chrome, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials NiobiumNitride = new Materials( 359, TextureSet.SET_DULL , 1.0F, 0, 2, 1|2 , 29, 41, 29, 0, "NiobiumNitride" , "Niobium Nitride" , 0, 0, 2573, 2573, true, false, 1, 1, 1, Dyes.dyeBlack , 1, Arrays.asList(new MaterialStack(Niobium, 1), new MaterialStack(Nitrogen, 1))); // Anti-Reflective Material
+ public static Materials NiobiumTitanium = new Materials( 360, TextureSet.SET_DULL , 1.0F, 0, 2, 1|2 , 29, 29, 41, 0, "NiobiumTitanium" , "Niobium-Titanium" , 0, 0, 4500, 4500, true, false, 1, 1, 1, Dyes.dyeBlack , 2, Arrays.asList(new MaterialStack(Niobium, 1), new MaterialStack(Titanium, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials NitroCarbon = new Materials( 716, TextureSet.SET_FLUID , 1.0F, 0, 1, 16 , 0, 75, 100, 0, "NitroCarbon" , "Nitro-Carbon" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeCyan , 1, Arrays.asList(new MaterialStack(Nitrogen, 1), new MaterialStack(Carbon, 1)));
+ public static Materials NitrogenDioxide = new Materials( 717, TextureSet.SET_FLUID , 1.0F, 0, 1, 16 , 100, 175, 255, 0, "NitrogenDioxide" , "Nitrogen Dioxide" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeCyan , 1, Arrays.asList(new MaterialStack(Nitrogen, 1), new MaterialStack(Oxygen, 2)));
+ public static Materials Obsidian = new Materials( 804, TextureSet.SET_DULL , 1.0F, 0, 3, 1|2 , 80, 50, 100, 0, "Obsidian" , "Obsidian" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack , 1, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Iron, 1), new MaterialStack(Silicon, 2), new MaterialStack(Oxygen, 8)));
+ public static Materials Phosphate = new Materials( 833, TextureSet.SET_DULL , 1.0F, 0, 1, 1 |8|16 , 255, 255, 0, 0, "Phosphate" , "Phosphate" , 0, 0, -1, 0, false, false, 2, 1, 1, Dyes.dyeYellow , 1, Arrays.asList(new MaterialStack(Phosphorus, 1), new MaterialStack(Oxygen, 4)));
+ public static Materials PigIron = new Materials( 307, TextureSet.SET_METALLIC , 6.0F, 384, 2, 1|2 |8 |64 , 200, 180, 180, 0, "PigIron" , "Pig Iron" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyePink , 2, Collections.singletonList(new MaterialStack(Iron, 1)));
+ public static Materials Plastic = new Materials( 874, TextureSet.SET_DULL , 3.0F, 32, 1, 1|2 |64|128 , 200, 200, 200, 0, "Plastic" , "Polyethylene" , 0, 0, 400, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 0, Arrays.asList(new MaterialStack(Carbon, 1), new MaterialStack(Hydrogen, 2)), Collections.singletonList(new TC_AspectStack(TC_Aspects.MOTUS, 2)));
+ public static Materials Epoxid = new Materials( 470, TextureSet.SET_DULL , 3.0F, 32, 1, 1|2 |64|128 , 200, 140, 20, 0, "Epoxid" , "Epoxid" , 0, 0, 400, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 0, Arrays.asList(new MaterialStack(Carbon, 21), new MaterialStack(Hydrogen, 24), new MaterialStack(Oxygen, 4)), Collections.singletonList(new TC_AspectStack(TC_Aspects.MOTUS, 2)));
+ public static Materials Polydimethylsiloxane = new MaterialBuilder(633, TextureSet.SET_FLUID , "Polydimethylsiloxane").addDustItems().setRGB(245, 245, 245).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 1), new MaterialStack(Silicon, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Silicone = new Materials( 471, TextureSet.SET_DULL , 3.0F, 128, 1, 1|2 |64|128 , 220, 220, 220, 0, "Silicone" , "Silicone Rubber" , 0, 0, 900, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 0, Arrays.asList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 1), new MaterialStack(Silicon, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.MOTUS, 2)));
+ public static Materials Polycaprolactam = new Materials( 472, TextureSet.SET_DULL , 3.0F, 32, 1, 1|2 |64|128 , 50, 50, 50, 0, "Polycaprolactam" , "Polycaprolactam" , 0, 0, 500, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 0, Arrays.asList(new MaterialStack(Carbon, 6), new MaterialStack(Hydrogen, 11), new MaterialStack(Nitrogen, 1), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.MOTUS, 2)));
+ public static Materials Polytetrafluoroethylene = new Materials( 473, TextureSet.SET_DULL , 3.0F, 32, 1, 1|2 |64|128 , 100, 100, 100, 0, "Polytetrafluoroethylene" , "Polytetrafluoroethylene" , 0, 0, 1400, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 0, Arrays.asList(new MaterialStack(Carbon, 2), new MaterialStack(Fluorine, 4)), Collections.singletonList(new TC_AspectStack(TC_Aspects.MOTUS, 2)));
+ public static Materials Powellite = new Materials( 883, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 255, 255, 0, 0, "Powellite" , "Powellite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow , 2, Arrays.asList(new MaterialStack(Calcium, 1), new MaterialStack(Molybdenum, 1), new MaterialStack(Oxygen, 4)));
+ public static Materials Pumice = new Materials( 926, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 230, 185, 185, 0, "Pumice" , "Pumice" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeGray , 2, Collections.singletonList(new MaterialStack(Stone, 1)));
+ public static Materials Pyrite = new Materials( 834, TextureSet.SET_ROUGH , 1.0F, 0, 1, 1 |8 , 150, 120, 40, 0, "Pyrite" , "Pyrite" , 0, 0, -1, 0, false, false, 2, 1, 1, Dyes.dyeOrange , 1, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Sulfur, 2)));
+ public static Materials Pyrolusite = new Materials( 943, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 150, 150, 170, 0, "Pyrolusite" , "Pyrolusite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , 1, Arrays.asList(new MaterialStack(Manganese, 1), new MaterialStack(Oxygen, 2)));
+ public static Materials Pyrope = new Materials( 835, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |8 , 120, 50, 100, 0, "Pyrope" , "Pyrope" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyePurple , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Magnesium, 3), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 12)));
+ public static Materials RockSalt = new Materials( 944, TextureSet.SET_FINE , 1.0F, 0, 1, 1 |8 , 240, 200, 200, 0, "RockSalt" , "Rock Salt" , 0, 0, -1, 0, false, false, 2, 1, 1, Dyes.dyeWhite , 1, Arrays.asList(new MaterialStack(Potassium, 1), new MaterialStack(Chlorine, 1)));
+ public static Materials Rubber = new Materials( 880, TextureSet.SET_SHINY , 1.5F, 32, 0, 1|2 |64|128 , 0, 0, 0, 0, "Rubber" , "Rubber" , 0, 0, 400, 0, false, false, 1, 1, 1, Dyes.dyeBlack , 0, Arrays.asList(new MaterialStack(Carbon, 5), new MaterialStack(Hydrogen, 8)), Collections.singletonList(new TC_AspectStack(TC_Aspects.MOTUS, 2)));
+ public static Materials RawRubber = new Materials( 896, TextureSet.SET_DULL , 1.0F, 0, 0, 1 , 204, 199, 137, 0, "RawRubber" , "Raw Rubber" , 0, 0, 400, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 0, Arrays.asList(new MaterialStack(Carbon, 5), new MaterialStack(Hydrogen, 8)), Collections.singletonList(new TC_AspectStack(TC_Aspects.MOTUS, 2)));
+ public static Materials Ruby = new Materials( 502, TextureSet.SET_RUBY , 7.0F, 256, 2, 1 |4|8 |64 , 255, 100, 100, 127, "Ruby" , "Ruby" , 0, 0, -1, 0, false, true, 5, 1, 1, Dyes.dyeRed , 0, Arrays.asList(new MaterialStack(Chrome, 1), new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 3)), Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 6), new TC_AspectStack(TC_Aspects.VITREUS, 4))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials Salt = new Materials( 817, TextureSet.SET_FINE , 1.0F, 0, 1, 1 |8 , 250, 250, 250, 0, "Salt" , "Salt" , 0, 0, -1, 0, false, false, 2, 1, 1, Dyes.dyeWhite , 0, Arrays.asList(new MaterialStack(Sodium, 1), new MaterialStack(Chlorine, 1)));
+ public static Materials Saltpeter = new Materials( 836, TextureSet.SET_FINE , 1.0F, 0, 1, 1 |8 , 230, 230, 230, 0, "Saltpeter" , "Saltpeter" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeWhite , 1, Arrays.asList(new MaterialStack(Potassium, 1), new MaterialStack(Nitrogen, 1), new MaterialStack(Oxygen, 3)));
+ public static Materials Sapphire = new MaterialBuilder(503, TextureSet.SET_GEM_VERTICAL, "Sapphire").setToolSpeed(7.0F).setDurability(256).setToolQuality(2).addDustItems().addGemItems().setTransparent(true).addOreItems().addToolHeadItems().setRGBA(100, 100, 200, 127).setColor(Dyes.dyeBlue).setOreValue(5).setExtraData(0).setMaterialList(new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 3)).setAspects(Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 5), new TC_AspectStack(TC_Aspects.VITREUS, 3))).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
+ //public static Materials Sapphire = new Materials( 503, TextureSet.SET_GEM_VERTICAL , 7.0F, 256, 2, 1 |4|8 |64 , 100, 100, 200, 127, "Sapphire" , "Sapphire" , 0, 0, -1, 0, false, true, 5, 1, 1, Dyes.dyeBlue , 1, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 3)), Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 5), new TC_AspectStack(TC_Aspects.VITREUS, 3)));
+ public static Materials Scheelite = new Materials( 910, TextureSet.SET_DULL , 1.0F, 0, 3, 1 |8 , 200, 140, 20, 0, "Scheelite" , "Scheelite" , 0, 0, 2500, 2500, false, false, 4, 1, 1, Dyes.dyeBlack , 0, Arrays.asList(new MaterialStack(Tungsten, 1), new MaterialStack(Calcium, 1), new MaterialStack(Oxygen, 4)));
+ public static Materials Snow = new Materials( 728, TextureSet.SET_FINE , 1.0F, 0, 0, 1| 16 , 250, 250, 250, 0, "Snow" , "Snow" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 0, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.GELUM, 1)));
+ public static Materials Sodalite = new Materials( 525, TextureSet.SET_LAPIS , 1.0F, 0, 1, 1 |4|8 , 20, 20, 255, 0, "Sodalite" , "Sodalite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeBlue , 1, Arrays.asList(new MaterialStack(Aluminium, 3), new MaterialStack(Silicon, 3), new MaterialStack(Sodium, 4), new MaterialStack(Chlorine, 1)));
+ public static Materials SodiumPersulfate = new Materials( 718, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 255, 255, 255, 0, "SodiumPersulfate" , "Sodium Persulfate" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange , 1, Arrays.asList(new MaterialStack(Sodium, 2), new MaterialStack(Sulfur, 2), new MaterialStack(Oxygen, 8)));
+ public static Materials SodiumSulfide = new Materials( 719, TextureSet.SET_FLUID , 1.0F, 0, 2, 1 , 255, 230, 128, 0, "SodiumSulfide" , "Sodium Sulfide" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange , 1, Arrays.asList(new MaterialStack(Sodium, 2), new MaterialStack(Sulfur, 1)));
+ public static Materials HydricSulfide = new Materials( 460, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 255, 255, 255, 0, "HydricSulfide" , "Hydrogen Sulfide" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange , 1, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Sulfur, 1)));
+
+ public static Materials OilHeavy = new Materials( 730, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 10, 10, 10, 0, "OilHeavy" , "Heavy Oil" , 3, 40, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack );
+ public static Materials OilMedium = new Materials( 731, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 10, 10, 10, 0, "OilMedium" , "Raw Oil" , 3, 30, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack );
+ public static Materials OilLight = new Materials( 732, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 10, 10, 10, 0, "OilLight" , "Light Oil" , 3, 20, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack );
+
+ public static Materials NatruralGas = new Materials( 733, TextureSet.SET_FLUID , 1.0F, 0, 1, 16 , 255, 255, 255, 0, "NatruralGas" , "Natural Gas" , 1, 20, -1, 0, false, false, 3, 1, 1, Dyes.dyeWhite );
+ public static Materials SulfuricGas = new Materials( 734, TextureSet.SET_FLUID , 1.0F, 0, 1, 16 , 255, 255, 255, 0, "SulfuricGas" , "Sulfuric Gas" , 1, 25, -1, 0, false, false, 3, 1, 1, Dyes.dyeWhite );
+ public static Materials Gas = new Materials( 735, TextureSet.SET_FLUID , 1.0F, 0, 1, 16 , 255, 255, 255, 0, "Gas" , "Refinery Gas" , 1, 160, -1, 0, false, false, 3, 1, 1, Dyes.dyeWhite).setCanBeCracked(true);
+ public static Materials SulfuricNaphtha = new Materials( 736, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 255, 255, 0, 0, "SulfuricNaphtha" , "Sulfuric Naphtha" , 1, 40, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow );
+ public static Materials SulfuricLightFuel = new Materials( 737, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 255, 255, 0, 0, "SulfuricLightFuel" , "Sulfuric Light Fuel" , 0, 40, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow );
+ public static Materials SulfuricHeavyFuel = new Materials( 738, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 255, 255, 0, 0, "SulfuricHeavyFuel" , "Sulfuric Heavy Fuel" , 3, 40, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack );
+ public static Materials Naphtha = new Materials( 739, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 255, 255, 0, 0, "Naphtha" , "Naphtha" , 1, 320, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow).setCanBeCracked(true);
+ public static Materials LightFuel = new Materials( 740, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 255, 255, 0, 0, "LightFuel" , "Light Fuel" , 0, 305, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow).setCanBeCracked(true);
+ public static Materials HeavyFuel = new Materials( 741, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 255, 255, 0, 0, "HeavyFuel" , "Heavy Fuel" , 3, 240, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack).setCanBeCracked(true);
+ public static Materials LPG = new Materials( 742, TextureSet.SET_FLUID , 1.0F, 0, 0, 16 , 255, 255, 0, 0, "LPG" , "LPG" , 1, 320, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow );
+
+ public static Materials FluidNaquadahFuel = new MaterialBuilder(600, TextureSet.SET_FLUID , "Naquadah Fuel").setName("FluidNaqudahFuel").addCell().addFluid().setRGB(62, 62, 62).setColor(Dyes.dyeBlack).constructMaterial();
+ public static Materials EnrichedNaquadria = new MaterialBuilder(601, TextureSet.SET_FLUID , "Enriched Naquadria").setName("EnrichedNaquadria").addCell().addFluid().setRGB(52, 52, 52).setColor(Dyes.dyeBlack).constructMaterial();
+
+ public static Materials ReinforceGlass = new MaterialBuilder(602, TextureSet.SET_FLUID , "Reinforced Glass").setName("ReinforcedGlass").setRGB(192, 245, 254).setColor(Dyes.dyeWhite).setMeltingPoint(2000).constructMaterial().disableAutoGeneratedRecycleRecipes();
+ public static Materials BioMediumRaw = new MaterialBuilder(603, TextureSet.SET_FLUID , "Raw Bio Catalyst Medium").setName("BioMediumRaw").addCell().addFluid().setRGB(97, 147, 46).setColor(Dyes.dyeLime).constructMaterial();
+ public static Materials BioMediumSterilized = new MaterialBuilder(604, TextureSet.SET_FLUID , "Sterilized Bio Catalyst Medium").setName("BiohMediumSterilized").addCell().addFluid().setRGB(162, 253, 53).setColor(Dyes.dyeLime).constructMaterial();
+
+ public static Materials Chlorobenzene = new MaterialBuilder(605, TextureSet.SET_FLUID , "Chlorobenzene").addCell().addFluid().setRGB(0, 50, 65).setColor(Dyes.dyeGray).setMaterialList(new MaterialStack(Carbon, 6), new MaterialStack(Hydrogen, 5), new MaterialStack(Chlorine, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials DilutedHydrochloricAcid = new MaterialBuilder(606, TextureSet.SET_FLUID , "Diluted Hydrochloric Acid").setName("DilutedHydrochloricAcid_GT5U").addCell().addFluid().setRGB(153, 167, 163).setColor(Dyes.dyeLightGray).setMaterialList(new MaterialStack(Hydrogen, 1), new MaterialStack(Chlorine, 1)).constructMaterial();
+ public static Materials Pyrochlore = new MaterialBuilder(607, TextureSet.SET_METALLIC , "Pyrochlore").addDustItems().addOreItems().setRGB(43, 17, 0).setColor(Dyes.dyeBlack).setMaterialList(new MaterialStack(Calcium, 2), new MaterialStack(Niobium, 2), new MaterialStack(Oxygen, 7)).addElectrolyzerRecipe().constructMaterial();
+
+ public static Materials GrowthMediumRaw = new MaterialBuilder(608, TextureSet.SET_FLUID , "Raw Growth Catalyst Medium").setName("GrowthMediumRaw").addCell().addFluid().setRGB(211, 141, 95).setColor(Dyes.dyeOrange).constructMaterial();
+ public static Materials GrowthMediumSterilized = new MaterialBuilder(609, TextureSet.SET_FLUID , "Growth Catalyst Medium").setName("GrowthMediumSterilized").addCell().addFluid().setRGB(222, 170, 135).setColor(Dyes.dyeOrange).constructMaterial();
+
+ public static Materials FerriteMixture = new MaterialBuilder(612, TextureSet.SET_METALLIC , "Ferrite Mixture").addDustItems().setRGB(180, 180, 180).setColor(Dyes.dyeGray).setMaterialList(new MaterialStack(Nickel, 1), new MaterialStack(Zinc, 1), new MaterialStack(Iron, 4)).constructMaterial();
+ public static Materials NickelZincFerrite = new MaterialBuilder(613, TextureSet.SET_ROUGH , "Nickel-Zinc Ferrite").addDustItems().addMetalItems().addToolHeadItems().addGearItems().setToolSpeed(3.0f).setDurability(32).setRGB(60, 60, 60).setColor(Dyes.dyeBlack).setBlastFurnaceRequired(true).setBlastFurnaceTemp(1500).setMaterialList(new MaterialStack(Nickel, 1), new MaterialStack(Zinc, 1), new MaterialStack(Iron, 4), new MaterialStack(Oxygen, 8)).constructMaterial();
+
+ public static Materials Massicot = new MaterialBuilder(614, TextureSet.SET_DULL , "Massicot").addDustItems().setRGB(255, 221, 85).setColor(Dyes.dyeYellow).setMaterialList(new MaterialStack(Lead, 1), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials ArsenicTrioxide = new MaterialBuilder(615, TextureSet.SET_SHINY , "Arsenic Trioxide").addDustItems().setRGB(255, 255, 255).setColor(Dyes.dyeGreen).setMaterialList(new MaterialStack(Arsenic, 2), new MaterialStack(Oxygen, 3)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials CobaltOxide = new MaterialBuilder(616, TextureSet.SET_DULL , "Cobalt Oxide").addDustItems().setRGB(102, 128, 0).setColor(Dyes.dyeGreen).setMaterialList(new MaterialStack(Cobalt, 1), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Zincite = new MaterialBuilder(617, TextureSet.SET_DULL , "Zincite").addDustItems().setRGB(255, 255, 245).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Zinc, 1), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials AntimonyTrioxide = new MaterialBuilder(618, TextureSet.SET_DULL , "Antimony Trioxide").addDustItems().setRGB(230, 230, 240).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Antimony, 2), new MaterialStack(Oxygen, 3)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials CupricOxide = new MaterialBuilder(619, TextureSet.SET_DULL , "Cupric Oxide").addDustItems().setRGB(15, 15, 15).setColor(Dyes.dyeBlack).setMeltingPoint(1599).setMaterialList(new MaterialStack(Copper, 1), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Ferrosilite = new MaterialBuilder(620, TextureSet.SET_DULL , "Ferrosilite").addDustItems().setRGB(151, 99, 42).setColor(Dyes.dyeBrown).setMaterialList(new MaterialStack(Iron, 1), new MaterialStack(Silicon, 1), new MaterialStack(Oxygen, 3)).addElectrolyzerRecipe().constructMaterial();
+
+ public static Materials Magnesia = new MaterialBuilder(621, TextureSet.SET_DULL , "Magnesia").addDustItems().setRGB(255, 225, 225).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Magnesium, 1), new MaterialStack(Oxygen, 1)).constructMaterial();
+ public static Materials Quicklime = new MaterialBuilder(622, TextureSet.SET_DULL , "Quicklime").addDustItems().setRGB(240, 240, 240).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Calcium, 1), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Potash = new MaterialBuilder(623, TextureSet.SET_DULL , "Potash").addDustItems().setRGB(120, 66, 55).setColor(Dyes.dyeBrown).setMaterialList(new MaterialStack(Potassium, 2), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials SodaAsh = new MaterialBuilder(624, TextureSet.SET_DULL , "Soda Ash").addDustItems().setRGB(220, 220, 255).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Sodium, 2), new MaterialStack(Carbon, 1), new MaterialStack(Oxygen, 3)).addElectrolyzerRecipe().constructMaterial();
+
+ public static Materials BioDiesel = new MaterialBuilder(627, TextureSet.SET_FLUID , "Bio Diesel").addCell().addFluid().setRGB(255, 128, 0).setColor(Dyes.dyeOrange).setFuelType(MaterialBuilder.DIESEL).setFuelPower(320).constructMaterial();
+ public static Materials NitrationMixture = new MaterialBuilder(628, TextureSet.SET_FLUID , "Nitration Mixture").addCell().setRGB(230, 226, 171).setColor(Dyes.dyeBrown).constructMaterial();
+ public static Materials Glycerol = new MaterialBuilder(629, TextureSet.SET_FLUID , "Glycerol").addCell().addFluid().setRGB(135, 222, 135).setColor(Dyes.dyeLime).setFuelType(MaterialBuilder.SEMIFLUID).setFuelPower(164).setMaterialList(new MaterialStack(Carbon, 3), new MaterialStack(Hydrogen, 8), new MaterialStack(Oxygen, 3)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials SodiumBisulfate = new MaterialBuilder(630, TextureSet.SET_FLUID , "Sodium Bisulfate").addDustItems().setRGB(0, 68, 85).setColor(Dyes.dyeBlue).setMaterialList(new MaterialStack(Sodium, 1), new MaterialStack(Hydrogen, 1), new MaterialStack(Sulfur, 1), new MaterialStack(Oxygen, 4)).constructMaterial();
+ public static Materials PolyphenyleneSulfide = new MaterialBuilder(631, TextureSet.SET_DULL , "Polyphenylene Sulfide").addDustItems().addMetalItems().addToolHeadItems().addGearItems().setToolSpeed(3.0f).setDurability(32).setToolQuality(1).setRGB(170, 136, 0).setColor(Dyes.dyeBrown).setMaterialList(new MaterialStack(Carbon, 6), new MaterialStack(Hydrogen, 4), new MaterialStack(Sulfur, 1)).constructMaterial();
+ public static Materials Dichlorobenzene = new MaterialBuilder(632, TextureSet.SET_FLUID , "Dichlorobenzene").addCell().addFluid().setRGB(0, 68, 85).setColor(Dyes.dyeBlue).setMaterialList(new MaterialStack(Carbon, 6), new MaterialStack(Hydrogen, 4), new MaterialStack(Chlorine, 2)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Polystyrene = new MaterialBuilder(636, TextureSet.SET_DULL , "Polystyrene").addDustItems().addMetalItems().addToolHeadItems().addGearItems().setToolSpeed(3.0f).setDurability(32).setToolQuality(1).setRGB(190, 180, 170).setColor(Dyes.dyeLightGray).setMaterialList(new MaterialStack(Carbon, 8), new MaterialStack(Hydrogen, 8)).constructMaterial();
+ public static Materials Styrene = new MaterialBuilder(637, TextureSet.SET_FLUID , "Styrene").addCell().addFluid().setRGB(210, 200, 190).setColor(Dyes.dyeBlack).setMaterialList(new MaterialStack(Carbon, 8), new MaterialStack(Hydrogen, 8)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Isoprene = new MaterialBuilder(638, TextureSet.SET_FLUID , "Isoprene").addCell().addFluid().setRGB(20, 20, 20).setColor(Dyes.dyeBlack).setMaterialList(new MaterialStack(Carbon, 5), new MaterialStack(Hydrogen, 8)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Tetranitromethane = new MaterialBuilder(639, TextureSet.SET_FLUID , "Tetranitromethane").addCell().addFluid().setRGB(15, 40, 40).setColor(Dyes.dyeBlack).setMaterialList(new MaterialStack(Carbon, 1), new MaterialStack(Nitrogen, 4), new MaterialStack(Oxygen, 8)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Ethenone = new MaterialBuilder(641, TextureSet.SET_FLUID , "Ethenone").addCell().addGas().setRGB(20, 20, 70).setColor(Dyes.dyeBlack).setMaterialList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Ethane = new MaterialBuilder(642, TextureSet.SET_FLUID , "Ethane").addCell().addGas().setRGB(200, 200, 255).setColor(Dyes.dyeLightBlue).setFuelType(MaterialBuilder.GAS).setFuelPower(168).setMaterialList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 6)).addElectrolyzerRecipe().setCanBeCracked(true).constructMaterial();
+ public static Materials Propane = new MaterialBuilder(643, TextureSet.SET_FLUID , "Propane").addCell().addGas().setRGB(250, 226, 80).setColor(Dyes.dyeYellow).setFuelType(MaterialBuilder.GAS).setFuelPower(232).setMaterialList(new MaterialStack(Carbon, 3), new MaterialStack(Hydrogen, 8)).addElectrolyzerRecipe().setCanBeCracked(true).constructMaterial();
+ public static Materials Butane = new MaterialBuilder(644, TextureSet.SET_FLUID , "Butane").addCell().addGas().setRGB(182, 55, 30).setColor(Dyes.dyeOrange).setFuelType(MaterialBuilder.GAS).setFuelPower(296).setMaterialList(new MaterialStack(Carbon, 4), new MaterialStack(Hydrogen, 10)).addElectrolyzerRecipe().setCanBeCracked(true).constructMaterial();
+ public static Materials Butene = new MaterialBuilder(645, TextureSet.SET_FLUID , "Butene").addCell().addGas().setRGB(207, 80, 5).setColor(Dyes.dyeOrange).setFuelType(MaterialBuilder.GAS).setFuelPower(256).setMaterialList(new MaterialStack(Carbon, 4), new MaterialStack(Hydrogen, 8)).addElectrolyzerRecipe().setCanBeCracked(true).constructMaterial();
+ public static Materials Butadiene = new MaterialBuilder(646, TextureSet.SET_FLUID , "Butadiene").addCell().addGas().setRGB(232, 105, 0).setColor(Dyes.dyeOrange).setFuelType(MaterialBuilder.GAS).setFuelPower(206).setMaterialList(new MaterialStack(Carbon, 4), new MaterialStack(Hydrogen, 6)).addElectrolyzerRecipe().setCanBeCracked(true).constructMaterial();
+ public static Materials RawStyreneButadieneRubber = new MaterialBuilder(634, TextureSet.SET_SHINY , "Raw Styrene-Butadiene Rubber").addDustItems().setRGB(84, 64, 61).setColor(Dyes.dyeGray).setMaterialList(new MaterialStack(Styrene, 1), new MaterialStack(Butadiene, 3)).constructMaterial();
+ public static Materials StyreneButadieneRubber = new MaterialBuilder(635, TextureSet.SET_SHINY , "Styrene-Butadiene Rubber").addDustItems().addMetalItems().addToolHeadItems().addGearItems().setToolSpeed(3.0f).setDurability(128).setToolQuality(1).setRGB(33, 26, 24).setColor(Dyes.dyeBlack).setMaterialList(new MaterialStack(Styrene, 1), new MaterialStack(Butadiene, 3)).constructMaterial();
+ public static Materials Toluene = new MaterialBuilder(647, TextureSet.SET_FLUID , "Toluene").addCell().setRGB(80, 29, 5).setColor(Dyes.dyeBrown).setFuelType(MaterialBuilder.GAS).setFuelPower(328).setMaterialList(new MaterialStack(Carbon, 7), new MaterialStack(Hydrogen, 8)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Epichlorohydrin = new MaterialBuilder(648, TextureSet.SET_FLUID , "Epichlorohydrin").addCell().setRGB(80, 29, 5).setColor(Dyes.dyeBrown).setMaterialList(new MaterialStack(Carbon, 3), new MaterialStack(Hydrogen, 5), new MaterialStack(Chlorine, 1), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials PolyvinylChloride = new MaterialBuilder(649, TextureSet.SET_DULL , "Polyvinyl Chloride").addDustItems().addMetalItems().addToolHeadItems().addGearItems().setToolSpeed(3.0f).setDurability(32).setToolQuality(1).setRGB(215, 230, 230).setColor(Dyes.dyeLightGray).setMaterialList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 3), new MaterialStack(Chlorine, 1)).constructMaterial();
+ public static Materials VinylChloride = new MaterialBuilder(650, TextureSet.SET_FLUID , "Vinyl Chloride").addCell().addGas().setRGB(225, 240, 240).setColor(Dyes.dyeLightGray).setMaterialList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 3), new MaterialStack(Chlorine, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials SulfurDioxide = new MaterialBuilder(651, TextureSet.SET_FLUID , "Sulfur Dioxide").addCell().addGas().setRGB(200, 200, 25).setColor(Dyes.dyeYellow).setMaterialList(new MaterialStack(Sulfur, 1), new MaterialStack(Oxygen, 2)).constructMaterial();
+ public static Materials SulfurTrioxide = new MaterialBuilder(652, TextureSet.SET_FLUID , "Sulfur Trioxide").addCell().addGas().setGasTemperature(344).setRGB(160, 160, 20).setColor(Dyes.dyeYellow).setMaterialList(new MaterialStack(Sulfur, 1), new MaterialStack(Oxygen, 3)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials NitricAcid = new MaterialBuilder(653, TextureSet.SET_FLUID , "Nitric Acid").addCell().addFluid().setRGB(230, 226, 171).setMaterialList(new MaterialStack(Hydrogen, 1), new MaterialStack(Nitrogen, 1), new MaterialStack(Oxygen, 3)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Dimethylhydrazine = new MaterialBuilder(654, TextureSet.SET_FLUID , "1,1-Dimethylhydrazine").addCell().addFluid().setRGB(0, 0, 85).setColor(Dyes.dyeBlue).setMaterialList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 8), new MaterialStack(Nitrogen, 2)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Chloramine = new MaterialBuilder(655, TextureSet.SET_FLUID , "Chloramine").addCell().addFluid().setRGB(63, 159, 128).setColor(Dyes.dyeCyan).setMaterialList(new MaterialStack(Nitrogen, 1), new MaterialStack(Hydrogen, 2), new MaterialStack(Chlorine, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Dimethylamine = new MaterialBuilder(656, TextureSet.SET_FLUID , "Dimethylamine").addCell().addGas().setRGB(85, 68, 105).setColor(Dyes.dyeGray).setMaterialList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 7), new MaterialStack(Nitrogen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials DinitrogenTetroxide = new MaterialBuilder(657, TextureSet.SET_FLUID , "Dinitrogen Tetroxide").addCell().addGas().setRGB(0, 65, 132).setColor(Dyes.dyeBlue).setMaterialList(new MaterialStack(Nitrogen, 2), new MaterialStack(Oxygen, 4)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials NitricOxide = new MaterialBuilder(658, TextureSet.SET_FLUID , "Nitric Oxide").addCell().addGas().setRGB(125, 200, 240).setColor(Dyes.dyeCyan).setMaterialList(new MaterialStack(Nitrogen, 1), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Ammonia = new MaterialBuilder(659, TextureSet.SET_FLUID , "Ammonia").addCell().addGas().setRGB(63, 52, 128).setColor(Dyes.dyeBlue).setMaterialList(new MaterialStack(Nitrogen, 1), new MaterialStack(Hydrogen, 3)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Dimethyldichlorosilane = new MaterialBuilder(663, TextureSet.SET_FLUID , "Dimethyldichlorosilane").addCell().addFluid().setRGB(68, 22, 80).setColor(Dyes.dyePurple).setMaterialList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 6), new MaterialStack(Chlorine, 2), new MaterialStack(Silicon, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Chloromethane = new MaterialBuilder(664, TextureSet.SET_FLUID , "Chloromethane").addCell().addGas().setRGB(200, 44, 160).setColor(Dyes.dyeMagenta).setMaterialList(new MaterialStack(Carbon, 1), new MaterialStack(Hydrogen, 3), new MaterialStack(Chlorine, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials PhosphorousPentoxide = new MaterialBuilder(665, TextureSet.SET_FLUID , "Phosphorous Pentoxide").addCell().addDustItems().setRGB(220, 220, 0).setColor(Dyes.dyeYellow).setMaterialList(new MaterialStack(Phosphorus, 4), new MaterialStack(Oxygen, 10)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Tetrafluoroethylene = new MaterialBuilder(666, TextureSet.SET_FLUID , "Tetrafluoroethylene").addCell().addGas().setRGB(125, 125, 125).setColor(Dyes.dyeGray).setMaterialList(new MaterialStack(Carbon, 2), new MaterialStack(Fluorine, 4)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials HydrofluoricAcid = new MaterialBuilder(667, TextureSet.SET_FLUID , "Hydrofluoric Acid").setName("HydrofluoricAcid_GT5U").addCell().addFluid().setRGB(0, 136, 170).setColor(Dyes.dyeLightBlue).setMaterialList(new MaterialStack(Hydrogen, 1), new MaterialStack(Fluorine, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Chloroform = new MaterialBuilder(668, TextureSet.SET_FLUID , "Chloroform").addCell().addFluid().setRGB(137, 44, 160).setColor(Dyes.dyePurple).setMaterialList(new MaterialStack(Carbon, 1), new MaterialStack(Hydrogen, 1), new MaterialStack(Chlorine, 3)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials BisphenolA = new MaterialBuilder(669, TextureSet.SET_FLUID , "Bisphenol A").addCell().setRGB(212, 170, 0).setColor(Dyes.dyeBrown).setMaterialList(new MaterialStack(Carbon, 15), new MaterialStack(Hydrogen, 16), new MaterialStack(Oxygen, 2)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials AceticAcid = new MaterialBuilder(670, TextureSet.SET_FLUID , "Acetic Acid").addCell().addFluid().setRGB(200, 180, 160).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 4), new MaterialStack(Oxygen, 2)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials CalciumAcetateSolution = new MaterialBuilder(671, TextureSet.SET_RUBY , "Calcium Acetate Solution").addCell().addFluid().setRGB(220, 200, 180).setColor(Dyes.dyeCyan).setMaterialList(new MaterialStack(Calcium, 1), new MaterialStack(Carbon, 4), new MaterialStack(Oxygen, 4), new MaterialStack(Hydrogen, 6)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Acetone = new MaterialBuilder(672, TextureSet.SET_FLUID , "Acetone").addCell().addFluid().setRGB(175, 175, 175).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Carbon, 3), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Methanol = new MaterialBuilder(673, TextureSet.SET_FLUID , "Methanol").addCell().addFluid().setRGB(170, 136, 0).setColor(Dyes.dyeBrown).setFuelPower(84).setMaterialList(new MaterialStack(Carbon, 1), new MaterialStack(Hydrogen, 4), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials CarbonMonoxide = new MaterialBuilder(674, TextureSet.SET_FLUID , "Carbon Monoxide").addCell().addGas().setRGB(14, 72, 128).setColor(Dyes.dyeBrown).setFuelType(MaterialBuilder.GAS).setFuelPower(24).setMaterialList(new MaterialStack(Carbon, 1), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials MetalMixture = new MaterialBuilder(676, TextureSet.SET_METALLIC , "Metal Mixture").addDustItems().setRGB(80, 45, 22).setColor(Dyes.dyeBrown).constructMaterial();
+ public static Materials Ethylene = new MaterialBuilder(677, TextureSet.SET_FLUID , "Ethylene").addCell().addGas().setRGB(225, 225, 225).setColor(Dyes.dyeWhite).setFuelType(MaterialBuilder.GAS).setFuelPower(128).setMaterialList(new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 4)).addElectrolyzerRecipe().setCanBeCracked(true).constructMaterial();
+ public static Materials Propene = new MaterialBuilder(678, TextureSet.SET_FLUID , "Propene").addCell().addGas().setRGB(255, 221, 85).setColor(Dyes.dyeYellow).setFuelType(MaterialBuilder.GAS).setFuelPower(192).setMaterialList(new MaterialStack(Carbon, 3), new MaterialStack(Hydrogen, 6)).addElectrolyzerRecipe().setCanBeCracked(true).constructMaterial();
+ public static Materials VinylAcetate = new MaterialBuilder(679, TextureSet.SET_FLUID , "Vinyl Acetate").addCell().addFluid().setRGB(255, 179, 128).setColor(Dyes.dyeOrange).setMaterialList(new MaterialStack(Carbon, 4), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 2)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials PolyvinylAcetate = new MaterialBuilder(680, TextureSet.SET_FLUID , "Polyvinyl Acetate").addCell().addFluid().setRGB(255, 153, 85).setColor(Dyes.dyeOrange).setMaterialList(new MaterialStack(Carbon, 4), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 2)).constructMaterial();
+ public static Materials MethylAcetate = new MaterialBuilder(681, TextureSet.SET_FLUID , "Methyl Acetate").addCell().addFluid().setRGB(238, 198, 175).setColor(Dyes.dyeOrange).setMaterialList(new MaterialStack(Carbon, 3), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 2)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials AllylChloride = new MaterialBuilder(682, TextureSet.SET_FLUID , "Allyl Chloride").addCell().addFluid().setRGB(135, 222, 170).setColor(Dyes.dyeCyan).setMaterialList(new MaterialStack(Carbon, 3), new MaterialStack(Hydrogen, 5), new MaterialStack(Chlorine, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials HydrochloricAcid = new MaterialBuilder(683, TextureSet.SET_FLUID , "Hydrochloric Acid").setName("HydrochloricAcid_GT5U").addCell().addFluid().setRGB(183, 200, 196).setColor(Dyes.dyeLightGray).setMaterialList(new MaterialStack(Hydrogen, 1), new MaterialStack(Chlorine, 1)).constructMaterial();
+ public static Materials HypochlorousAcid = new MaterialBuilder(684, TextureSet.SET_FLUID , "Hypochlorous Acid").addCell().addFluid().setRGB(111, 138, 145).setColor(Dyes.dyeGray).setMaterialList(new MaterialStack(Hydrogen, 1), new MaterialStack(Chlorine, 1), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials SodiumOxide = new MaterialBuilder(744, TextureSet.SET_DULL , "Sodium Oxide").setName("SodiumOxide").addDustItems().setRGB(255, 255, 235).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Sodium, 2), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials SodiumHydroxide = new MaterialBuilder(685, TextureSet.SET_DULL , "Sodium Hydroxide").setName("SodiumHydroxide_GT5U").addDustItems().setRGB(0, 51, 128).setColor(Dyes.dyeBlue).setMaterialList(new MaterialStack(Sodium, 1), new MaterialStack(Oxygen, 1), new MaterialStack(Hydrogen, 1)).constructMaterial();
+ public static Materials Benzene = new MaterialBuilder(686, TextureSet.SET_FLUID , "Benzene").addCell().addFluid().setRGB(26, 26, 26).setColor(Dyes.dyeGray).setFuelType(MaterialBuilder.GAS).setFuelPower(360).setMaterialList(new MaterialStack(Carbon, 6), new MaterialStack(Hydrogen, 6)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Phenol = new MaterialBuilder(687, TextureSet.SET_FLUID , "Phenol").addCell().addFluid().setRGB(120, 68, 33).setColor(Dyes.dyeBrown).setFuelType(MaterialBuilder.GAS).setFuelPower(288).setMaterialList(new MaterialStack(Carbon, 6), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Cumene = new MaterialBuilder(688, TextureSet.SET_FLUID , "Isopropylbenzene").addCell().addFluid().setRGB(85, 34, 0).setColor(Dyes.dyeBrown).setMaterialList(new MaterialStack(Carbon, 9), new MaterialStack(Hydrogen, 12)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials PhosphoricAcid = new MaterialBuilder(689, TextureSet.SET_FLUID , "Phosphoric Acid").setName("PhosphoricAcid_GT5U").addCell().addFluid().setRGB(220, 220, 0).setColor(Dyes.dyeYellow).setMaterialList(new MaterialStack(Hydrogen, 3), new MaterialStack(Phosphorus, 1), new MaterialStack(Oxygen, 4)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials SaltWater = new MaterialBuilder(692, TextureSet.SET_FLUID , "Salt Water").addCell().addFluid().setRGB(0, 0, 200).setColor(Dyes.dyeBlue).constructMaterial();
+ public static Materials IronIIIChloride = new MaterialBuilder(693, TextureSet.SET_FLUID , "Iron III Chloride").setName("IronIIIChloride").addCell().addFluid().setRGB(22, 21, 14).setColor(Dyes.dyeBlack).setMaterialList(new MaterialStack(Chlorine, 3), new MaterialStack(Iron, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials LifeEssence = new MaterialBuilder(694, TextureSet.SET_FLUID , "Life").setName("lifeessence").addCell().addFluid().setFuelPower(100).setFuelType(5).setRGB(110, 3, 3).setColor(Dyes.dyeRed).setMaterialList().constructMaterial();
+
+ //Roasted Ore Dust
+ public static Materials RoastedCopper = new MaterialBuilder(546, TextureSet.SET_DULL , "Roasted Copper").setName("RoastedCopper").addDustItems().setRGB(77, 18, 18).constructMaterial();
+ public static Materials RoastedAntimony = new MaterialBuilder(547, TextureSet.SET_DULL , "Roasted Antimony").setName("RoastedAntimony").addDustItems().setRGB(196, 178, 194).constructMaterial();
+ public static Materials RoastedIron = new MaterialBuilder(548, TextureSet.SET_DULL , "Roasted Iron").setName("RoastedIron").addDustItems().setRGB(148, 98, 98).addOreItems().constructMaterial();
+ public static Materials RoastedNickel = new MaterialBuilder(549, TextureSet.SET_METALLIC, "Roasted Nickel").setName("RoastedNickel").addDustItems().setRGB(70, 140, 45).addOreItems().constructMaterial();
+ public static Materials RoastedZinc = new MaterialBuilder(550, TextureSet.SET_DULL , "Roasted Zinc").setName("RoastedZinc").addDustItems().setRGB(209, 209, 209).constructMaterial();
+ public static Materials RoastedCobalt = new MaterialBuilder(551, TextureSet.SET_METALLIC, "Roasted Cobalt").setName("RoastedCobalt").addDustItems().setRGB(8, 64, 9).constructMaterial();
+ public static Materials RoastedArsenic = new MaterialBuilder(552, TextureSet.SET_SHINY , "Roasted Arsenic").setName("RoastedArsenic").addDustItems().setRGB(240, 240, 240).constructMaterial();
+ public static Materials RoastedLead = new MaterialBuilder(553, TextureSet.SET_SHINY , "Roasted Lead").setName("RoastedLead").addDustItems().setRGB(168, 149, 43).constructMaterial();
+
+ //Silicon Line
+ public static Materials SiliconSG = new Materials( 856, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 |8 |32 , 80, 80, 100, 0, "SiliconSolarGrade" , "Silicon Solar Grade (Poly SI)" , 0, 0, 2273, 2273, true, false, 1, 1, 1, Dyes.dyeBlack , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 4), new TC_AspectStack(TC_Aspects.TENEBRAE, 2))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials CalciumDisilicide = new Materials( 971, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |8 , 180, 180, 180, 0, "CalciumDisilicide" , "Calcium Disilicide" , 0, 0, 1313, -1, false, false, 1, 1, 1, Dyes.dyeGray ,1 , Arrays.asList(new MaterialStack(Calcium, 1), new MaterialStack(Silicon, 2)), Arrays.asList(new TC_AspectStack(TC_Aspects.TERRA, 1), new TC_AspectStack(TC_Aspects.ORDO, 1)));//CaSi2
+ public static Materials SiliconTetrafluoride = new MaterialBuilder( 967, TextureSet.SET_FLUID , "Silicon Tetrafluoride" ).setName("SiliconTetrafluoride").addCell().addGas().setTransparent(true).setRGB(200, 200, 200).setColor(Dyes.dyeWhite).setMeltingPoint(178).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Fluorine, 4)).setAspects(Arrays.asList(new TC_AspectStack(TC_Aspects.AQUA, 1), new TC_AspectStack(TC_Aspects.VENENUM, 1))).constructMaterial();//SIF4
+ public static Materials SiliconTetrachloride = new MaterialBuilder( 968, TextureSet.SET_FLUID , "Silicon Tetrachloride").setName("SiliconTetrachloride").addCell().addFluid().setRGB(220, 220, 220).setColor(Dyes.dyeWhite).setMeltingPoint(204).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Chlorine, 4)).setAspects(Arrays.asList(new TC_AspectStack(TC_Aspects.AQUA, 1), new TC_AspectStack(TC_Aspects.VENENUM, 1))).constructMaterial();//SICL4
+ public static Materials Trichlorosilane = new MaterialBuilder( 972, TextureSet.SET_FLUID , "Trichlorosilane" ).setName("Trichlorosilane" ).addCell().addFluid().setRGB( 255, 255, 255).setColor(Dyes.dyeWhite).setMeltingPoint(139).setMaterialList(new MaterialStack(Hydrogen, 1), new MaterialStack(Silicon, 1), new MaterialStack(Chlorine, 3)).setAspects(Arrays.asList(new TC_AspectStack(TC_Aspects.AQUA, 1), new TC_AspectStack(TC_Aspects.VENENUM, 1))).constructMaterial();//HSICL3
+ public static Materials Hexachlorodisilane = new MaterialBuilder( 973, TextureSet.SET_FLUID , "Hexachlorodisilane").setName("Hexachlorodisilane" ).addCell().addFluid().setRGB( 255, 255, 255).setColor(Dyes.dyeWhite).setMeltingPoint(272).setExtraData(1).setMaterialList(new MaterialStack(Silicon, 2), new MaterialStack(Chlorine, 6)).setAspects(Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1))).constructMaterial();//SI2CL6
+ public static Materials Dichlorosilane = new MaterialBuilder( 799, TextureSet.SET_FLUID , "Dichlorosilane").setName("Dichlorosilane").addCell().addGas().setTransparent(true).setRGB( 255, 255, 255).setColor(Dyes.dyeWhite).setMeltingPoint(151).setExtraData(1).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Hydrogen, 2), new MaterialStack(Chlorine, 2)).setAspects(Arrays.asList(new TC_AspectStack(TC_Aspects.AQUA, 1), new TC_AspectStack(TC_Aspects.VENENUM, 1))).constructMaterial();//SIH2CL2
+ public static Materials Silane = new MaterialBuilder( 798, TextureSet.SET_FLUID , "Silane").setName( "Silane").addCell().addGas().setRGB( 255, 255, 255).setColor(Dyes.dyeWhite).setMeltingPoint(88).setMaterialList(new MaterialStack(Silicon, 1), new MaterialStack(Hydrogen, 4)).setAspects(Collections.singletonList(new TC_AspectStack(TC_Aspects.AQUA, 1))).constructMaterial();//SIH4
+ public static Materials Calciumhydride = new Materials( 797, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |8 , 220, 220, 220, 0, "CalciumHydride" , "Calcium Hydride" , 0, 0, 1089, -1, false, false, 1, 1, 1, Dyes.dyeGray ,1 , Arrays.asList(new MaterialStack(Calcium, 1), new MaterialStack(Hydrogen, 2)), Arrays.asList(new TC_AspectStack(TC_Aspects.TERRA, 1), new TC_AspectStack(TC_Aspects.ORDO, 1)));//CaH2
+ public static Materials AluminiumFluoride = new Materials( 969, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |8 , 255, 255, 255, 0, "Aluminiumfluoride" , "Aluminium Fluoride" , 0, 0, 1533, -1, false, false, 1, 1, 1, Dyes.dyeWhite ,1 , Arrays.asList(new MaterialStack(Aluminium, 1), new MaterialStack(Fluorine, 3)), Arrays.asList(new TC_AspectStack(TC_Aspects.TERRA, 1), new TC_AspectStack(TC_Aspects.ORDO, 1)));//ALF3
+
+ public static Materials SolderingAlloy = new Materials( 314, TextureSet.SET_DULL , 1.0F, 0, 1, 1|2 , 220, 220, 230, 0, "SolderingAlloy" , "Soldering Alloy" , 0, 0, 400, 400, false, false, 1, 1, 1, Dyes.dyeWhite , 2, Arrays.asList(new MaterialStack(Tin, 9), new MaterialStack(Antimony, 1)));
+ public static Materials GalliumArsenide = new Materials( 980, TextureSet.SET_DULL , 1.0F, 0, 1, 1|2 , 160, 160, 160, 0, "GalliumArsenide" , "Gallium Arsenide" , 0, 0, -1, 1200, true, false, 1, 1, 1, Dyes.dyeGray , 2, Arrays.asList(new MaterialStack(Arsenic, 1), new MaterialStack(Gallium, 1)));
+ public static Materials IndiumGalliumPhosphide = new Materials( 981, TextureSet.SET_DULL , 1.0F, 0, 1, 1|2 , 160, 140, 190, 0, "IndiumGalliumPhosphide" , "Indium Gallium Phosphide" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , 2, Arrays.asList(new MaterialStack(Indium, 1), new MaterialStack(Gallium, 1), new MaterialStack(Phosphorus, 1)));
+ public static Materials Spessartine = new Materials( 838, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 255, 100, 100, 0, "Spessartine" , "Spessartine" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeRed , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Manganese, 3), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 12)));
+ public static Materials Sphalerite = new Materials( 839, TextureSet.SET_DULL , 1.0F, 0, 1, 1 |8 , 255, 255, 255, 0, "Sphalerite" , "Sphalerite" , 0, 0, -1, 0, false, false, 2, 1, 1, Dyes.dyeYellow , 1, Arrays.asList(new MaterialStack(Zinc, 1), new MaterialStack(Sulfur, 1)));
+ public static Materials StainlessSteel = new Materials( 306, TextureSet.SET_SHINY , 7.0F, 480, 4, 1|2 |64|128 , 200, 200, 220, 0, "StainlessSteel" , "Stainless Steel" , 0, 0, -1, 1700, true, false, 1, 1, 1, Dyes.dyeWhite , 1, Arrays.asList(new MaterialStack(Iron, 6), new MaterialStack(Chrome, 1), new MaterialStack(Manganese, 1), new MaterialStack(Nickel, 1)));
+ public static Materials Steel = new Materials( 305, TextureSet.SET_METALLIC , 6.0F, 512, 3, 1|2 |64|128 , 128, 128, 128, 0, "Steel" , "Steel" , 0, 0, 1811, 1000, true, false, 4, 51, 50, Dyes.dyeGray , 1, Arrays.asList(new MaterialStack(Iron, 50), new MaterialStack(Carbon, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.ORDO, 1)));
+ public static Materials Stibnite = new Materials( 945, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |8 , 70, 70, 70, 0, "Stibnite" , "Stibnite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 2, Arrays.asList(new MaterialStack(Antimony, 2), new MaterialStack(Sulfur, 3)));
+ public static Materials SulfuricAcid = new Materials( 720, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 255, 128, 0, 0, "SulfuricAcid" , "Sulfuric Acid" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange , 1, Arrays.asList(new MaterialStack(Hydrogen, 2), new MaterialStack(Sulfur, 1), new MaterialStack(Oxygen, 4)));
+ public static Materials Tanzanite = new Materials( 508, TextureSet.SET_GEM_VERTICAL , 7.0F, 256, 2, 1 |4|8 |64 , 64, 0, 200, 127, "Tanzanite" , "Tanzanite" , 0, 0, -1, 0, false, true, 5, 1, 1, Dyes.dyePurple , 0, Arrays.asList(new MaterialStack(Calcium, 2), new MaterialStack(Aluminium, 3), new MaterialStack(Silicon, 3), new MaterialStack(Hydrogen, 1), new MaterialStack(Oxygen, 13)), Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 5), new TC_AspectStack(TC_Aspects.VITREUS, 3)));
+ public static Materials Tetrahedrite = new Materials( 840, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 200, 32, 0, 0, "Tetrahedrite" , "Tetrahedrite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeRed , 2, Arrays.asList(new MaterialStack(Copper, 3), new MaterialStack(Antimony, 1), new MaterialStack(Sulfur, 3), new MaterialStack(Iron, 1))); //Cu3SbS3 + x(Fe,Zn)6Sb2S9
+ public static Materials TinAlloy = new Materials( 363, TextureSet.SET_METALLIC , 6.5F, 96, 2, 1|2 |64|128 , 200, 200, 200, 0, "TinAlloy" , "Tin Alloy" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 2, Arrays.asList(new MaterialStack(Tin, 1), new MaterialStack(Iron, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1)));
+ public static Materials Topaz = new Materials( 507, TextureSet.SET_GEM_HORIZONTAL , 7.0F, 256, 3, 1 |4|8 |64 , 255, 128, 0, 127, "Topaz" , "Topaz" , 0, 0, -1, 0, false, true, 5, 1, 1, Dyes.dyeOrange , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 1), new MaterialStack(Fluorine, 2), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 6)), Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 6), new TC_AspectStack(TC_Aspects.VITREUS, 4)));
+ public static Materials Tungstate = new Materials( 841, TextureSet.SET_DULL , 1.0F, 0, 3, 1 |8 , 55, 50, 35, 0, "Tungstate" , "Tungstate" , 0, 0, 2500, 2500, true, false, 4, 1, 1, Dyes.dyeBlack , 0, Arrays.asList(new MaterialStack(Tungsten, 1), new MaterialStack(Lithium, 2), new MaterialStack(Oxygen, 4)));
+ public static Materials Ultimet = new Materials( 344, TextureSet.SET_SHINY , 9.0F, 2048, 4, 1|2 |64|128 , 180, 180, 230, 0, "Ultimet" , "Ultimet" , 0, 0, 2700, 2700, true, false, 1, 1, 1, Dyes.dyeLightBlue , 1, Arrays.asList(new MaterialStack(Cobalt, 5), new MaterialStack(Chrome, 2), new MaterialStack(Nickel, 1), new MaterialStack(Molybdenum, 1))); // 54% Cobalt, 26% Chromium, 9% Nickel, 5% Molybdenum, 3% Iron, 2% Tungsten, 0.8% Manganese, 0.3% Silicon, 0.08% Nitrogen and 0.06% Carbon
+ public static Materials Uraninite = new Materials( 922, TextureSet.SET_METALLIC , 1.0F, 0, 3, 1 |8 , 35, 35, 35, 0, "Uraninite" , "Uraninite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLime , 2, Arrays.asList(new MaterialStack(Uranium, 1), new MaterialStack(Oxygen, 2)));
+ public static Materials Uvarovite = new Materials( 842, TextureSet.SET_DIAMOND , 1.0F, 0, 2, 1 |8 , 180, 255, 180, 0, "Uvarovite" , "Uvarovite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeGreen , 1, Arrays.asList(new MaterialStack(Calcium, 3), new MaterialStack(Chrome, 2), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 12)));
+ public static Materials VanadiumGallium = new Materials( 357, TextureSet.SET_SHINY , 1.0F, 0, 2, 1|2 |128 , 128, 128, 140, 0, "VanadiumGallium" , "Vanadium-Gallium" , 0, 0, 4500, 4500, true, false, 1, 1, 1, Dyes.dyeGray , 2, Arrays.asList(new MaterialStack(Vanadium, 3), new MaterialStack(Gallium, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Wood = new Materials( 809, TextureSet.SET_WOOD , 2.0F, 16, 0, 1|2 |64|128 , 100, 50, 0, 0, "Wood" , "Wood" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBrown , 0, Arrays.asList(new MaterialStack(Carbon, 1), new MaterialStack(Oxygen, 1), new MaterialStack(Hydrogen, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.ARBOR, 2)));
+ public static Materials WroughtIron = new Materials( 304, TextureSet.SET_METALLIC , 6.0F, 384, 2, 1|2 |64|128 , 200, 180, 180, 0, "WroughtIron" , "Wrought Iron" , 0, 0, 1811, 0, false, false, 3, 1, 1, Dyes.dyeLightGray , 2, Collections.singletonList(new MaterialStack(Iron, 1)));
+ public static Materials Wulfenite = new Materials( 882, TextureSet.SET_DULL , 1.0F, 0, 3, 1 |8 , 255, 128, 0, 0, "Wulfenite" , "Wulfenite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange , 2, Arrays.asList(new MaterialStack(Lead, 1), new MaterialStack(Molybdenum, 1), new MaterialStack(Oxygen, 4)));
+ public static Materials YellowLimonite = new Materials( 931, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |8 , 200, 200, 0, 0, "YellowLimonite" , "Yellow Limonite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeYellow , 2, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Hydrogen, 1), new MaterialStack(Oxygen, 2))); // FeO(OH) + a bit of Ni and Co
+ public static Materials YttriumBariumCuprate = new Materials( 358, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1|2 , 80, 64, 70, 0, "YttriumBariumCuprate" , "Yttrium Barium Cuprate" , 0, 0, 4500, 4500, true, false, 1, 1, 1, Dyes.dyeGray , 0, Arrays.asList(new MaterialStack(Yttrium, 1), new MaterialStack(Barium, 2), new MaterialStack(Copper, 3), new MaterialStack(Oxygen, 7))).disableAutoGeneratedVacuumFreezerRecipe();
+
+ /**
+ * Second Degree Compounds
+ */
+ public static Materials WoodSealed = new Materials( 889, TextureSet.SET_WOOD , 3.0F, 24, 0, 1|2 |64|128 , 80, 40, 0, 0, "WoodSealed" , "Sealed Wood" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBrown , 0, Collections.singletonList(new MaterialStack(Wood, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.ARBOR, 2), new TC_AspectStack(TC_Aspects.FABRICO, 1)));
+ public static Materials LiveRoot = new Materials( 832, TextureSet.SET_WOOD , 1.0F, 0, 1, 1 , 220, 200, 0, 0, "LiveRoot" , "Liveroot" , 5, 16, -1, 0, false, false, 2, 4, 3, Dyes.dyeBrown , 2, Arrays.asList(new MaterialStack(Wood, 3), new MaterialStack(Magic, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.ARBOR, 2), new TC_AspectStack(TC_Aspects.VICTUS, 2), new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)));
+ public static Materials IronWood = new Materials( 338, TextureSet.SET_WOOD , 6.0F, 384, 2, 1|2 |64|128 , 150, 140, 110, 0, "IronWood" , "Ironwood" , 5, 8, -1, 0, false, false, 2, 19, 18, Dyes.dyeBrown , 2, Arrays.asList(new MaterialStack(Iron, 9), new MaterialStack(LiveRoot, 9), new MaterialStack(Gold, 1)));
+ public static Materials Glass = new Materials( 890, TextureSet.SET_GLASS , 1.0F, 4, 0, 1 |4 , 250, 250, 250, 220, "Glass" , "Glass" , 0, 0, 1500, 0, false, true, 1, 1, 1, Dyes.dyeWhite , 2, Collections.singletonList(new MaterialStack(SiliconDioxide, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.VITREUS, 2)));
+ public static Materials BorosilicateGlass = new MaterialBuilder(611, TextureSet.SET_GLASS , "Borosilicate Glass").addDustItems().addMetalItems().setRGB(230, 243, 230).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Boron, 1), new MaterialStack(Glass, 7)).addCentrifugeRecipe().constructMaterial();
+ public static Materials Perlite = new Materials( 925, TextureSet.SET_DULL , 1.0F, 0, 1, 1 |8 , 30, 20, 30, 0, "Perlite" , "Perlite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack , 2, Arrays.asList(new MaterialStack(Obsidian, 2), new MaterialStack(Water, 1)));
+ public static Materials Borax = new Materials( 941, TextureSet.SET_FINE , 1.0F, 0, 1, 1 |8 , 250, 250, 250, 0, "Borax" , "Borax" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 1, Arrays.asList(new MaterialStack(Sodium, 2), new MaterialStack(Boron, 4), new MaterialStack(Oxygen, 7), new MaterialStack(Water, 10)));
+ public static Materials Lignite = new Materials( 538, TextureSet.SET_LIGNITE , 1.0F, 0, 0, 1 |4|8 , 100, 70, 70, 0, "Lignite" , "Lignite Coal" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack , 1, Arrays.asList(new MaterialStack(Carbon, 3), new MaterialStack(Water, 1)));
+ public static Materials Olivine = new Materials( 505, TextureSet.SET_RUBY , 7.0F, 256, 2, 1 |4|8 |64 , 150, 255, 150, 127, "Olivine" , "Olivine" , 0, 0, -1, 0, false, true, 5, 1, 1, Dyes.dyeLime , 1, Arrays.asList(new MaterialStack(Magnesium, 2), new MaterialStack(Iron, 1), new MaterialStack(SiliconDioxide, 2)), Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 4), new TC_AspectStack(TC_Aspects.VITREUS, 2)));
+ public static Materials Opal = new Materials( 510, TextureSet.SET_OPAL , 7.0F, 256, 2, 1 |4|8 |64 , 0, 0, 255, 0, "Opal" , "Opal" , 0, 0, -1, 0, false, true, 3, 1, 1, Dyes.dyeBlue , 1, Collections.singletonList(new MaterialStack(SiliconDioxide, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 5), new TC_AspectStack(TC_Aspects.VITREUS, 3)));
+ public static Materials Amethyst = new Materials( 509, TextureSet.SET_FLINT , 7.0F, 256, 3, 1 |4|8 |64 , 210, 50, 210, 127, "Amethyst" , "Amethyst" , 0, 0, -1, 0, false, true, 3, 1, 1, Dyes.dyePink , 1, Arrays.asList(new MaterialStack(SiliconDioxide, 4), new MaterialStack(Iron, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 6), new TC_AspectStack(TC_Aspects.VITREUS, 4)));
+ public static Materials Redstone = new Materials( 810, TextureSet.SET_ROUGH , 1.0F, 0, 2, 1 |8 , 200, 0, 0, 0, "Redstone" , "Redstone" , 0, 0, 500, 0, false, false, 3, 1, 1, Dyes.dyeRed , 2, Arrays.asList(new MaterialStack(Silicon, 1), new MaterialStack(Pyrite, 5), new MaterialStack(Ruby, 1), new MaterialStack(Mercury, 3)), Arrays.asList(new TC_AspectStack(TC_Aspects.MACHINA, 1), new TC_AspectStack(TC_Aspects.POTENTIA, 2)));
+ public static Materials Lapis = new Materials( 526, TextureSet.SET_LAPIS , 1.0F, 0, 1, 1 |4|8 , 70, 70, 220, 0, "Lapis" , "Lapis" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeBlue , 2, Arrays.asList(new MaterialStack(Lazurite, 12), new MaterialStack(Sodalite, 2), new MaterialStack(Pyrite, 1), new MaterialStack(Calcite, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.SENSUS, 1)));
+ public static Materials Blaze = new Materials( 801, TextureSet.SET_POWDER , 2.0F, 16, 1, 1 |64 , 255, 200, 0, 0, "Blaze" , "Blaze" , 0, 0, 6400, 0, false, false, 2, 3, 2, Dyes.dyeYellow , 2, Arrays.asList(new MaterialStack(DarkAsh, 1), new MaterialStack(Sulfur, 1), new MaterialStack(Magic, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.PRAECANTATIO, 2), new TC_AspectStack(TC_Aspects.IGNIS, 4)));
+ public static Materials EnderPearl = new Materials( 532, TextureSet.SET_SHINY , 1.0F, 16, 1, 1 |4 , 108, 220, 200, 0, "EnderPearl" , "Enderpearl" , 0, 0, -1, 0, false, false, 1, 16, 10, Dyes.dyeGreen , 1, Arrays.asList(new MaterialStack(Beryllium, 1), new MaterialStack(Potassium, 4), new MaterialStack(Nitrogen, 5), new MaterialStack(Magic, 6)), Arrays.asList(new TC_AspectStack(TC_Aspects.ALIENIS, 4), new TC_AspectStack(TC_Aspects.ITER, 4), new TC_AspectStack(TC_Aspects.PRAECANTATIO, 2)));
+ public static Materials EnderEye = new Materials( 533, TextureSet.SET_SHINY , 1.0F, 16, 1, 1 |4 , 160, 250, 230, 0, "EnderEye" , "Endereye" , 5, 10, -1, 0, false, false, 1, 2, 1, Dyes.dyeGreen , 2, Arrays.asList(new MaterialStack(EnderPearl, 1), new MaterialStack(Blaze, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.SENSUS, 4), new TC_AspectStack(TC_Aspects.ALIENIS, 4), new TC_AspectStack(TC_Aspects.ITER, 4), new TC_AspectStack(TC_Aspects.PRAECANTATIO, 3), new TC_AspectStack(TC_Aspects.IGNIS, 2)));
+ public static Materials Flint = new Materials( 802, TextureSet.SET_FLINT , 2.5F, 128, 1, 1 |64 , 0, 32, 64, 0, "Flint" , "Flint" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeGray , 2, Collections.singletonList(new MaterialStack(SiliconDioxide, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.TERRA, 1), new TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1)));
+ public static Materials Diatomite = new Materials( 948, TextureSet.SET_DULL , 1.0F, 0, 1, 1 |8 , 225, 225, 225, 0, "Diatomite" , "Diatomite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeGray , 2, Arrays.asList(new MaterialStack(Flint, 8), new MaterialStack(BandedIron, 1), new MaterialStack(Sapphire, 1)));
+ public static Materials VolcanicAsh = new Materials( 940, TextureSet.SET_FLINT , 1.0F, 0, 0, 1 , 60, 50, 50, 0, "VolcanicAsh" , "Volcanic Ashes" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack , 2, Arrays.asList(new MaterialStack(Flint, 6), new MaterialStack(Iron, 1), new MaterialStack(Magnesium, 1)));
+ public static Materials Niter = new Materials( 531, TextureSet.SET_FLINT , 1.0F, 0, 1, 1 |4|8 , 255, 200, 200, 0, "Niter" , "Niter" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyePink , 2, Collections.singletonList(new MaterialStack(Saltpeter, 1)));
+ public static Materials Pyrotheum = new Materials( 843, TextureSet.SET_FIERY , 1.0F, 0, 1, 1 , 255, 128, 0, 0, "Pyrotheum" , "Pyrotheum" , 2, 62, -1, 0, false, false, 2, 3, 1, Dyes.dyeYellow , 2, Arrays.asList(new MaterialStack(Coal, 1), new MaterialStack(Redstone, 1), new MaterialStack(Blaze, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.PRAECANTATIO, 2), new TC_AspectStack(TC_Aspects.IGNIS, 1)));
+ public static Materials Cryotheum = new Materials( 898, TextureSet.SET_SHINY , 1.0F, 0, 1, 1 , 0, 148, 203, 0, "Cryotheum" , "Cryotheum" , 2, 62, -1, 0, false, false, 2, 3, 1, Dyes.dyeLightBlue , 2, Arrays.asList(new MaterialStack(Saltpeter, 1), new MaterialStack(Redstone, 1), new MaterialStack(Snow, 1), new MaterialStack(Blizz, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.PRAECANTATIO, 2), new TC_AspectStack(TC_Aspects.ELECTRUM, 1), new TC_AspectStack(TC_Aspects.GELUM, 1)));
+ public static Materials HydratedCoal = new Materials( 818, TextureSet.SET_ROUGH , 1.0F, 0, 1, 1 , 70, 70, 100, 0, "HydratedCoal" , "Hydrated Coal" , 0, 0, -1, 0, false, false, 1, 9, 8, Dyes.dyeBlack , 2, Arrays.asList(new MaterialStack(Coal, 8), new MaterialStack(Water, 1)));
+ public static Materials Apatite = new Materials( 530, TextureSet.SET_DIAMOND , 1.0F, 0, 1, 1 |4|8 , 200, 200, 255, 0, "Apatite" , "Apatite" , 0, 0, -1, 0, false, false, 2, 1, 1, Dyes.dyeCyan , 1, Arrays.asList(new MaterialStack(Calcium, 5), new MaterialStack(Phosphate, 3), new MaterialStack(Chlorine, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.MESSIS, 2)));
+ public static Materials Alumite = new Materials( 400, TextureSet.SET_METALLIC , 5.0F, 768, 2, 1|2 |64|128 , 255, 105, 180, 0, "Alumite" , "Alumite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyePink , 2, Arrays.asList(new MaterialStack(Aluminium, 5), new MaterialStack(Steel, 2), new MaterialStack(Obsidian, 2)), Collections.singletonList(new TC_AspectStack(TC_Aspects.STRONTIO, 2)));
+ public static Materials Manyullyn = new Materials( 386, TextureSet.SET_SHINY , 25.0F, 2048, 5, 1|2 |8 |64|128 , 154, 76, 185, 0, "Manyullyn" , "Manyullyn" , 0, 0, 3600, 3600, true, false, 1, 1, 1, Dyes.dyePurple , 2, Arrays.asList(new MaterialStack(Cobalt, 1), new MaterialStack(Ardite, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.STRONTIO, 2))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials Steeleaf = new Materials( 339, TextureSet.SET_LEAF , 8.0F, 768, 3, 1|2 |64|128 , 50, 127, 50, 0, "Steeleaf" , "Steeleaf" , 5, 24, -1, 0, false, false, 4, 1, 1, Dyes.dyeGreen , 2, Arrays.asList(new MaterialStack(Steel, 1), new MaterialStack(Magic, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.HERBA, 2), new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)));
+ public static Materials Knightmetal = new Materials( 362, TextureSet.SET_METALLIC , 8.0F, 1024, 3, 1|2 |64|128 , 210, 240, 200, 0, "Knightmetal" , "Knightmetal" , 5, 24, -1, 0, false, false, 4, 1, 1, Dyes.dyeLime , 2, Arrays.asList(new MaterialStack(Steel, 2), new MaterialStack(Magic, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.LUCRUM, 1), new TC_AspectStack(TC_Aspects.METALLUM, 2)));
+ public static Materials SterlingSilver = new Materials( 350, TextureSet.SET_SHINY , 13.0F, 128, 2, 1|2 |64|128 , 250, 220, 225, 0, "SterlingSilver" , "Sterling Silver" , 0, 0, -1, 1700, true, false, 4, 1, 1, Dyes.dyeWhite , 2, Arrays.asList(new MaterialStack(Copper, 1), new MaterialStack(Silver, 4)));
+ public static Materials RoseGold = new Materials( 351, TextureSet.SET_SHINY , 14.0F, 128, 2, 1|2 |64|128 , 255, 230, 30, 0, "RoseGold" , "Rose Gold" , 0, 0, -1, 1600, true, false, 4, 1, 1, Dyes.dyeOrange , 2, Arrays.asList(new MaterialStack(Copper, 1), new MaterialStack(Gold, 4)));
+ public static Materials BlackBronze = new Materials( 352, TextureSet.SET_DULL , 12.0F, 256, 2, 1|2 |64|128 , 100, 50, 125, 0, "BlackBronze" , "Black Bronze" , 0, 0, -1, 2000, true, false, 4, 1, 1, Dyes.dyePurple , 2, Arrays.asList(new MaterialStack(Gold, 1), new MaterialStack(Silver, 1), new MaterialStack(Copper, 3)));
+ public static Materials BismuthBronze = new Materials( 353, TextureSet.SET_DULL , 8.0F, 256, 2, 1|2 |64|128 , 100, 125, 125, 0, "BismuthBronze" , "Bismuth Bronze" , 0, 0, -1, 1100, true, false, 4, 1, 1, Dyes.dyeCyan , 2, Arrays.asList(new MaterialStack(Bismuth, 1), new MaterialStack(Zinc, 1), new MaterialStack(Copper, 3)));
+ public static Materials BlackSteel = new Materials( 334, TextureSet.SET_METALLIC , 6.5F, 768, 3, 1|2 |64|128 , 100, 100, 100, 0, "BlackSteel" , "Black Steel" , 0, 0, -1, 1200, true, false, 4, 1, 1, Dyes.dyeBlack , 2, Arrays.asList(new MaterialStack(Nickel, 1), new MaterialStack(BlackBronze, 1), new MaterialStack(Steel, 3))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials RedSteel = new Materials( 348, TextureSet.SET_METALLIC , 7.0F, 896, 4, 1|2 |64|128 , 140, 100, 100, 0, "RedSteel" , "Red Steel" , 0, 0, -1, 1300, true, false, 4, 1, 1, Dyes.dyeRed , 2, Arrays.asList(new MaterialStack(SterlingSilver, 1), new MaterialStack(BismuthBronze, 1), new MaterialStack(Steel, 2), new MaterialStack(BlackSteel, 4)));
+ public static Materials BlueSteel = new Materials( 349, TextureSet.SET_METALLIC , 7.5F, 1024, 4, 1|2 |64|128 , 100, 100, 140, 0, "BlueSteel" , "Blue Steel" , 0, 0, -1, 1400, true, false, 4, 1, 1, Dyes.dyeBlue , 2, Arrays.asList(new MaterialStack(RoseGold, 1), new MaterialStack(Brass, 1), new MaterialStack(Steel, 2), new MaterialStack(BlackSteel, 4)));
+ public static Materials DamascusSteel = new Materials( 335, TextureSet.SET_METALLIC , 8.0F, 1280, 3, 1|2 |64|128 , 110, 110, 110, 0, "DamascusSteel" , "Damascus Steel" , 0, 0, 2000, 1500, true, false, 4, 1, 1, Dyes.dyeGray , 2, Collections.singletonList(new MaterialStack(Steel, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials TungstenSteel = new Materials( 316, TextureSet.SET_METALLIC , 8.0F, 2560, 4, 1|2 |64|128 , 100, 100, 160, 0, "TungstenSteel" , "Tungstensteel" , 0, 0, 4000, 4000, true, false, 4, 1, 1, Dyes.dyeBlue , 2, Arrays.asList(new MaterialStack(Steel, 1), new MaterialStack(Tungsten, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials NitroCoalFuel = new Materials( -1, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 50, 70, 50, 0, "NitroCoalFuel" , "Nitro-Coalfuel" , 0, 48, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack , 0, Arrays.asList(new MaterialStack(Glyceryl, 1), new MaterialStack(CoalFuel, 4)));
+ public static Materials NitroFuel = new Materials( 709, TextureSet.SET_FLUID , 1.0F, 0, 2, 16 , 200, 255, 0, 0, "NitroFuel" , "Cetane-Boosted Diesel" , 0, 1000, -1, 0, false, false, 1, 1, 1, Dyes.dyeLime );
+ public static Materials RedAlloy = new Materials( 308, TextureSet.SET_DULL , 1.0F, 0, 0, 1|2 , 200, 0, 0, 0, "RedAlloy" , "Red Alloy" , 0, 0, 500, 0, false, false, 3, 5, 1, Dyes.dyeRed , 2, Arrays.asList(new MaterialStack(Copper, 1), new MaterialStack(Redstone, 4)), Collections.singletonList(new TC_AspectStack(TC_Aspects.MACHINA, 3)));
+ public static Materials CobaltBrass = new Materials( 343, TextureSet.SET_METALLIC , 8.0F, 256, 2, 1|2 |64|128 , 180, 180, 160, 0, "CobaltBrass" , "Cobalt Brass" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeOrange , 2, Arrays.asList(new MaterialStack(Brass, 7), new MaterialStack(Aluminium, 1), new MaterialStack(Cobalt, 1)));
+ public static Materials TricalciumPhosphate = new Materials( 534, TextureSet.SET_FLINT , 1.0F, 0, 2, 1|4|8|16 , 255, 255, 0, 0, "TricalciumPhosphate" , "Tricalcium Phosphate" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeYellow , 2, Arrays.asList(new MaterialStack(Calcium, 3), new MaterialStack(Phosphate, 2)));
+ public static Materials Basalt = new Materials( 844, TextureSet.SET_ROUGH , 1.0F, 64, 1, 1 |64|128 , 30, 20, 20, 0, "Basalt" , "Basalt" , 0, 0, -1, 0, false, false, 2, 1, 1, Dyes.dyeBlack , 2, Arrays.asList(new MaterialStack(Olivine, 1), new MaterialStack(Calcite, 3), new MaterialStack(Flint, 8), new MaterialStack(DarkAsh, 4)), Collections.singletonList(new TC_AspectStack(TC_Aspects.TENEBRAE, 1))).disableAutoGeneratedRecycleRecipes();
+ public static Materials GarnetRed = new Materials( 527, TextureSet.SET_RUBY , 7.0F, 128, 2, 1 |4|8 |64 , 200, 80, 80, 127, "GarnetRed" , "Red Garnet" , 0, 0, -1, 0, false, true, 4, 1, 1, Dyes.dyeRed , 2, Arrays.asList(new MaterialStack(Pyrope, 3), new MaterialStack(Almandine, 5), new MaterialStack(Spessartine, 8)), Collections.singletonList(new TC_AspectStack(TC_Aspects.VITREUS, 3)));
+ public static Materials GarnetYellow = new Materials( 528, TextureSet.SET_RUBY , 7.0F, 128, 2, 1 |4|8 |64 , 200, 200, 80, 127, "GarnetYellow" , "Yellow Garnet" , 0, 0, -1, 0, false, true, 4, 1, 1, Dyes.dyeYellow , 2, Arrays.asList(new MaterialStack(Andradite, 5), new MaterialStack(Grossular, 8), new MaterialStack(Uvarovite, 3)), Collections.singletonList(new TC_AspectStack(TC_Aspects.VITREUS, 3)));
+ public static Materials Marble = new Materials( 845, TextureSet.SET_FINE , 1.0F, 16, 1, 1 |64|128 , 200, 200, 200, 0, "Marble" , "Marble" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 2, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Calcite, 7)), Collections.singletonList(new TC_AspectStack(TC_Aspects.PERFODIO, 1)));
+ public static Materials Sugar = new Materials( 803, TextureSet.SET_FINE , 1.0F, 0, 1, 1 , 250, 250, 250, 0, "Sugar" , "Sugar" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 1, Arrays.asList(new MaterialStack(Carbon, 2), new MaterialStack(Water, 5), new MaterialStack(Oxygen, 25)), Arrays.asList(new TC_AspectStack(TC_Aspects.HERBA, 1), new TC_AspectStack(TC_Aspects.AQUA, 1), new TC_AspectStack(TC_Aspects.AER, 1)));
+ public static Materials Thaumium = new Materials( 330, TextureSet.SET_METALLIC , 12.0F, 256, 3, 1|2 |64|128 , 150, 100, 200, 0, "Thaumium" , "Thaumium" , 0, 0, -1, 0, false, false, 5, 2, 1, Dyes.dyePurple , 0, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Magic, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)));
+ public static Materials Vinteum = new Materials( 529, TextureSet.SET_METALLIC , 10.0F, 128, 3, 1|2|4|8 |64|128 , 100, 200, 255, 0, "Vinteum" , "Vinteum" , 5, 32, -1, 0, false, false, 4, 1, 1, Dyes.dyeLightBlue , 2, Collections.singletonList(new MaterialStack(Thaumium, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.VITREUS, 2), new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)));
+ public static Materials Vis = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 3, 0 , 128, 0, 255, 0, "Vis" , "Vis" , 5, 32, -1, 0, false, false, 1, 1, 1, Dyes.dyePurple , 2, Collections.singletonList(new MaterialStack(Magic, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.AURAM, 2), new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)));
+ public static Materials Redrock = new Materials( 846, TextureSet.SET_ROUGH , 1.0F, 0, 1, 1 , 255, 80, 50, 0, "Redrock" , "Redrock" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeRed , 2, Arrays.asList(new MaterialStack(Calcite, 2), new MaterialStack(Flint, 1), new MaterialStack(Clay, 1)));
+ public static Materials PotassiumFeldspar = new Materials( 847, TextureSet.SET_FINE , 1.0F, 0, 1, 1 , 120, 40, 40, 0, "PotassiumFeldspar" , "Potassium Feldspar" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyePink , 0, Arrays.asList(new MaterialStack(Potassium, 1), new MaterialStack(Aluminium, 1), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 8)));
+ public static Materials Biotite = new Materials( 848, TextureSet.SET_METALLIC , 1.0F, 0, 1, 1 , 20, 30, 20, 0, "Biotite" , "Biotite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeGray , 0, Arrays.asList(new MaterialStack(Potassium, 1), new MaterialStack(Magnesium, 3), new MaterialStack(Aluminium, 3), new MaterialStack(Fluorine, 2), new MaterialStack(Silicon, 3), new MaterialStack(Oxygen, 10)));
+ public static Materials GraniteBlack = new Materials( 849, TextureSet.SET_ROUGH , 4.0F, 64, 3, 1 |64|128 , 10, 10, 10, 0, "GraniteBlack" , "Black Granite" , 0, 0, -1, 0, false, false, 0, 1, 1, Dyes.dyeBlack , 2, Arrays.asList(new MaterialStack(SiliconDioxide, 4), new MaterialStack(Biotite, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.TUTAMEN, 1)));
+ public static Materials GraniteRed = new Materials( 850, TextureSet.SET_ROUGH , 4.0F, 64, 3, 1 |64|128 , 255, 0, 128, 0, "GraniteRed" , "Red Granite" , 0, 0, -1, 0, false, false, 0, 1, 1, Dyes.dyeMagenta , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(PotassiumFeldspar, 1), new MaterialStack(Oxygen, 3)), Collections.singletonList(new TC_AspectStack(TC_Aspects.TUTAMEN, 1)));
+ public static Materials Chrysotile = new Materials( 912, TextureSet.SET_DULL , 32.0F, 10240, 3, 1|2 |8 |64|128 , 110, 140, 110, 0, "Chrysotile" , "Chrysotile" , 0, 0, 9400, 9400, true, false, 1, 1, 1, Dyes.dyeWhite , 2, Collections.singletonList(new MaterialStack(Asbestos, 1))).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(280, 280, 1);
+ public static Materials Realgar = new Materials( 913, TextureSet.SET_DULL , 1.0F, 32, 1, 1|2 |8 |64|128 , 140, 100, 100, 0, "Realgar" , "Realgar" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 2, Arrays.asList(new MaterialStack(Arsenic, 4), new MaterialStack(Sulfur,4)));
+ public static Materials VanadiumMagnetite = new Materials( 923, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |8 , 35, 35, 60, 0, "VanadiumMagnetite" , "Vanadium Magnetite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack , 2, Arrays.asList(new MaterialStack(Magnetite, 1), new MaterialStack(Vanadium, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.MAGNETO, 1))); // Mixture of Fe3O4 and V2O5
+ public static Materials BasalticMineralSand = new Materials( 935, TextureSet.SET_SAND , 1.0F, 0, 1, 1 |8 , 40, 50, 40, 0, "BasalticMineralSand" , "Basaltic Mineral Sand" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack , 2, Arrays.asList(new MaterialStack(Magnetite, 1), new MaterialStack(Basalt, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.MAGNETO, 1)));
+ public static Materials GraniticMineralSand = new Materials( 936, TextureSet.SET_SAND , 1.0F, 0, 1, 1 |8 , 40, 60, 60, 0, "GraniticMineralSand" , "Granitic Mineral Sand" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeBlack , 2, Arrays.asList(new MaterialStack(Magnetite, 1), new MaterialStack(GraniteBlack, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.MAGNETO, 1)));
+ public static Materials GarnetSand = new Materials( 938, TextureSet.SET_SAND , 1.0F, 0, 1, 1 |8 , 200, 100, 0, 0, "GarnetSand" , "Garnet Sand" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeOrange , 2, Arrays.asList(new MaterialStack(GarnetRed, 1), new MaterialStack(GarnetYellow, 1)));
+ public static Materials QuartzSand = new Materials( 939, TextureSet.SET_SAND , 1.0F, 0, 1, 1 |8 , 194, 178, 128, 0, "QuartzSand" , "Quartz Sand" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeWhite , 2, Arrays.asList(new MaterialStack(CertusQuartz, 1), new MaterialStack(Quartzite, 1)));
+ public static Materials Bastnasite = new Materials( 905, TextureSet.SET_FINE , 1.0F, 0, 2, 1 |8 , 200, 110, 45, 0, "Bastnasite" , "Bastnasite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 1, Arrays.asList(new MaterialStack(Cerium, 1), new MaterialStack(Carbon, 1), new MaterialStack(Fluorine, 1), new MaterialStack(Oxygen, 3))); // (Ce, La, Y)CO3F
+ public static Materials Pentlandite = new Materials( 909, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 165, 150, 5, 0, "Pentlandite" , "Pentlandite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 1, Arrays.asList(new MaterialStack(Nickel, 9), new MaterialStack(Sulfur, 8))); // (Fe,Ni)9S8
+ public static Materials Spodumene = new Materials( 920, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 190, 170, 170, 0, "Spodumene" , "Spodumene" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 0, Arrays.asList(new MaterialStack(Lithium, 1), new MaterialStack(Aluminium, 1), new MaterialStack(Silicon, 2), new MaterialStack(Oxygen, 6))); // LiAl(SiO3)2
+ public static Materials Pollucite = new Materials( 919, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 240, 210, 210, 0, "Pollucite" , "Pollucite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 0, Arrays.asList(new MaterialStack(Caesium, 2), new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 4), new MaterialStack(Water, 2), new MaterialStack(Oxygen, 12))); // (Cs,Na)2Al2Si4O12 2H2O (also a source of Rb)
+ public static Materials Tantalite = new Materials( 921, TextureSet.SET_METALLIC , 1.0F, 0, 3, 1 |8 , 145, 80, 40, 0, "Tantalite" , "Tantalite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 1, Arrays.asList(new MaterialStack(Manganese, 1), new MaterialStack(Tantalum, 2), new MaterialStack(Oxygen, 6))); // (Fe, Mn)Ta2O6 (also source of Nb)
+ public static Materials Lepidolite = new Materials( 907, TextureSet.SET_FINE , 1.0F, 0, 2, 1 |8 , 240, 50, 140, 0, "Lepidolite" , "Lepidolite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 0, Arrays.asList(new MaterialStack(Potassium, 1), new MaterialStack(Lithium, 3), new MaterialStack(Aluminium, 4), new MaterialStack(Fluorine, 2), new MaterialStack(Oxygen, 10))); // K(Li,Al,Rb)3(Al,Si)4O10(F,OH)2
+ public static Materials Glauconite = new Materials( 933, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 130, 180, 60, 0, "Glauconite" , "Glauconite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 0, Arrays.asList(new MaterialStack(Potassium, 1), new MaterialStack(Magnesium, 2), new MaterialStack(Aluminium, 4), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 12))); // (K,Na)(Fe3+,Al,Mg)2(Si,Al)4O10(OH)2
+ public static Materials GlauconiteSand = new Materials( 949, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 130, 180, 60, 0, "GlauconiteSand" , "Glauconite Sand" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 0, Arrays.asList(new MaterialStack(Potassium, 1), new MaterialStack(Magnesium, 2), new MaterialStack(Aluminium, 4), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 12))); // (K,Na)(Fe3+,Al,Mg)2(Si,Al)4O10(OH)2
+ public static Materials Vermiculite = new Materials( 932, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |8 , 200, 180, 15, 0, "Vermiculite" , "Vermiculite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 0, Arrays.asList(new MaterialStack(Iron, 3), new MaterialStack(Aluminium, 4), new MaterialStack(Silicon, 4), new MaterialStack(Hydrogen, 2), new MaterialStack(Water, 4), new MaterialStack(Oxygen, 12))); // (Mg+2, Fe+2, Fe+3)3 [(AlSi)4O10] (OH)2 4H2O)
+ public static Materials Bentonite = new Materials( 927, TextureSet.SET_ROUGH , 1.0F, 0, 2, 1 |8 , 245, 215, 210, 0, "Bentonite" , "Bentonite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 1, Arrays.asList(new MaterialStack(Sodium, 1), new MaterialStack(Magnesium, 6), new MaterialStack(Silicon, 12), new MaterialStack(Hydrogen, 6), new MaterialStack(Water, 5), new MaterialStack(Oxygen, 36))); // (Na,Ca)0.33(Al,Mg)2(Si4O10)(OH)2 nH2O
+ public static Materials FullersEarth = new Materials( 928, TextureSet.SET_FINE , 1.0F, 0, 2, 1 |8 , 160, 160, 120, 0, "FullersEarth" , "Fullers Earth" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 1, Arrays.asList(new MaterialStack(Magnesium, 1), new MaterialStack(Silicon, 4), new MaterialStack(Hydrogen, 1), new MaterialStack(Water, 4), new MaterialStack(Oxygen, 11))); // (Mg,Al)2Si4O10(OH) 4(H2O)
+ public static Materials Pitchblende = new Materials( 873, TextureSet.SET_DULL , 1.0F, 0, 3, 1 |8 , 200, 210, 0, 0, "Pitchblende" , "Pitchblende" , 0, 0, -1, 0, false, false, 5, 1, 1, Dyes.dyeYellow , 2, Arrays.asList(new MaterialStack(Uraninite, 3), new MaterialStack(Thorium, 1), new MaterialStack(Lead, 1)));
+ public static Materials Monazite = new Materials( 520, TextureSet.SET_DIAMOND , 1.0F, 0, 1, 1 |4|8 , 50, 70, 50, 0, "Monazite" , "Monazite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeGreen , 1, Arrays.asList(new MaterialStack(RareEarth, 1), new MaterialStack(Phosphate, 1))); // Wikipedia: (Ce, La, Nd, Th, Sm, Gd)PO4 Monazite also smelt-extract to Helium, it is brown like the rare earth Item Monazite sand deposits are inevitably of the monazite-(Ce) composition. Typically, the lanthanides in such monazites contain about 45.8% cerium, about 24% lanthanum, about 17% neodymium, about 5% praseodymium, and minor quantities of samarium, gadolinium, and yttrium. Europium concentrations tend to be low, about 0.05% Thorium content of monazite is variable.
+ public static Materials Malachite = new Materials( 871, TextureSet.SET_DULL , 1.0F, 0, 1, 1 |8 , 5, 95, 5, 0, "Malachite" , "Malachite" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeGreen , 1, Arrays.asList(new MaterialStack(Copper, 2), new MaterialStack(Carbon, 1), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 5))); // Cu2CO3(OH)2
+ public static Materials Mirabilite = new Materials( 900, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 240, 250, 210, 0, "Mirabilite" , "Mirabilite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 1, Arrays.asList(new MaterialStack(Sodium, 2), new MaterialStack(Sulfur, 1), new MaterialStack(Water, 10), new MaterialStack(Oxygen, 4))); // Na2SO4 10H2O
+ public static Materials Mica = new Materials( 901, TextureSet.SET_FINE , 1.0F, 0, 1, 1 |8 , 195, 195, 205, 0, "Mica" , "Mica" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 0, Arrays.asList(new MaterialStack(Potassium, 1), new MaterialStack(Aluminium, 3), new MaterialStack(Silicon, 3), new MaterialStack(Fluorine, 2), new MaterialStack(Oxygen, 10))); // KAl2(AlSi3O10)(F,OH)2
+ public static Materials Trona = new Materials( 903, TextureSet.SET_METALLIC , 1.0F, 0, 1, 1 |8 , 135, 135, 95, 0, "Trona" , "Trona" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 1, Arrays.asList(new MaterialStack(Sodium, 3), new MaterialStack(Carbon, 2), new MaterialStack(Hydrogen, 1), new MaterialStack(Water, 2), new MaterialStack(Oxygen, 6))); // Na3(CO3)(HCO3) 2H2O
+ public static Materials Barite = new Materials( 904, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 230, 235, 255, 0, "Barite" , "Barite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 1, Arrays.asList(new MaterialStack(Barium, 1), new MaterialStack(Sulfur, 1), new MaterialStack(Oxygen, 4)));
+ public static Materials Gypsum = new Materials( 934, TextureSet.SET_DULL , 1.0F, 0, 1, 1 |8 , 230, 230, 250, 0, "Gypsum" , "Gypsum" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 1, Arrays.asList(new MaterialStack(Calcium, 1), new MaterialStack(Sulfur, 1), new MaterialStack(Oxygen, 4), new MaterialStack(Water, 2))); // CaSO4 2H2O
+ public static Materials Alunite = new Materials( 911, TextureSet.SET_METALLIC , 1.0F, 0, 2, 1 |8 , 225, 180, 65, 0, "Alunite" , "Alunite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 0, Arrays.asList(new MaterialStack(Potassium, 1), new MaterialStack(Aluminium, 3), new MaterialStack(Silicon, 2), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 14))); // KAl3(SO4)2(OH)6
+ public static Materials Dolomite = new Materials( 914, TextureSet.SET_FLINT , 1.0F, 0, 1, 1 |8 , 225, 205, 205, 0, "Dolomite" , "Dolomite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 1, Arrays.asList(new MaterialStack(Calcium, 1), new MaterialStack(Magnesium, 1), new MaterialStack(Carbon, 2), new MaterialStack(Oxygen, 6))); // CaMg(CO3)2
+ public static Materials Wollastonite = new Materials( 915, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 240, 240, 240, 0, "Wollastonite" , "Wollastonite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 1, Arrays.asList(new MaterialStack(Calcium, 1), new MaterialStack(Silicon, 1), new MaterialStack(Oxygen, 3))); // CaSiO3
+ public static Materials Zeolite = new Materials( 916, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 240, 230, 230, 0, "Zeolite" , "Zeolite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 0, Arrays.asList(new MaterialStack(Sodium, 1), new MaterialStack(Calcium, 4), new MaterialStack(Silicon, 27), new MaterialStack(Aluminium, 9), new MaterialStack(Oxygen, 72))); // NaCa4(Si27Al9)O72
+ public static Materials Kyanite = new Materials( 924, TextureSet.SET_FLINT , 1.0F, 0, 2, 1 |8 , 110, 110, 250, 0, "Kyanite" , "Kyanite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 1), new MaterialStack(Oxygen, 5))); // Al2SiO5
+ public static Materials Kaolinite = new Materials( 929, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 245, 235, 235, 0, "Kaolinite" , "Kaolinite" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 0, Arrays.asList(new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 2), new MaterialStack(Hydrogen, 4), new MaterialStack(Oxygen, 9))); // Al2Si2O5(OH)4
+ public static Materials Talc = new Materials( 902, TextureSet.SET_DULL , 1.0F, 0, 2, 1 |8 , 90, 180, 90, 0, "Talc" , "Talc" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 1, Arrays.asList(new MaterialStack(Magnesium, 3), new MaterialStack(Silicon, 4), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 12))); // H2Mg3(SiO3)4
+ public static Materials Soapstone = new Materials( 877, TextureSet.SET_DULL , 1.0F, 0, 1, 1 |8 , 95, 145, 95, 0, "Soapstone" , "Soapstone" , 0, 0, -1, 0, false, false, 1, 1, 1, Dyes._NULL , 1, Arrays.asList(new MaterialStack(Magnesium, 3), new MaterialStack(Silicon, 4), new MaterialStack(Hydrogen, 2), new MaterialStack(Oxygen, 12))); // H2Mg3(SiO3)4
+ public static Materials Concrete = new Materials( 947, TextureSet.SET_ROUGH , 1.0F, 0, 1, 1 , 100, 100, 100, 0, "Concrete" , "Concrete" , 0, 0, 300, 0, false, false, 0, 1, 1, Dyes.dyeGray , 0, Collections.singletonList(new MaterialStack(Stone, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.TERRA, 1)));
+ public static Materials IronMagnetic = new Materials( 354, TextureSet.SET_MAGNETIC , 6.0F, 256, 2, 1|2 |64|128 , 200, 200, 200, 0, "IronMagnetic" , "Magnetic Iron" , 0, 0, -1, 0, false, false, 4, 51, 50, Dyes.dyeGray , 1, Collections.singletonList(new MaterialStack(Iron, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.MAGNETO, 1)));
+ public static Materials SteelMagnetic = new Materials( 355, TextureSet.SET_MAGNETIC , 6.0F, 512, 3, 1|2 |64|128 , 128, 128, 128, 0, "SteelMagnetic" , "Magnetic Steel" , 0, 0, 1000, 1000, true, false, 4, 51, 50, Dyes.dyeGray , 1, Collections.singletonList(new MaterialStack(Steel, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 1), new TC_AspectStack(TC_Aspects.ORDO, 1), new TC_AspectStack(TC_Aspects.MAGNETO, 1)));
+ public static Materials NeodymiumMagnetic = new Materials( 356, TextureSet.SET_MAGNETIC , 7.0F, 512, 2, 1|2 |64|128 , 100, 100, 100, 0, "NeodymiumMagnetic" , "Magnetic Neodymium" , 0, 0, 1297, 1297, true, false, 4, 51, 50, Dyes.dyeGray , 1, Collections.singletonList(new MaterialStack(Neodymium, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 1), new TC_AspectStack(TC_Aspects.MAGNETO, 3)));
+ public static Materials SamariumMagnetic = new Materials( 399, TextureSet.SET_MAGNETIC , 1.0F, 0, 2, 1|2 |64|128 , 255, 255, 204, 0, "SamariumMagnetic" , "Magnetic Samarium" , 0, 0, 1345, 1345, true, false, 4, 1, 1, Dyes.dyeWhite , 1, Collections.singletonList(new MaterialStack(Samarium, 1)),Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.RADIO, 1), new TC_AspectStack(TC_Aspects.MAGNETO,10)));
+ public static Materials TungstenCarbide = new Materials( 370, TextureSet.SET_METALLIC , 14.0F, 1280, 4, 1|2 |64|128 , 51, 0, 102, 0, "TungstenCarbide" , "Tungstencarbide" , 0, 0, 2460, 2460, true, false, 4, 1, 1, Dyes.dyeBlack , 2, Arrays.asList(new MaterialStack(Tungsten, 1), new MaterialStack(Carbon, 1))).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials VanadiumSteel = new Materials( 371, TextureSet.SET_METALLIC , 3.0F, 1920, 3, 1|2 |64|128 , 192, 192, 192, 0, "VanadiumSteel" , "Vanadiumsteel" , 0, 0, 1453, 1453, true, false, 4, 1, 1, Dyes.dyeWhite , 2, Arrays.asList(new MaterialStack(Vanadium, 1), new MaterialStack(Chrome, 1), new MaterialStack(Steel, 7))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials HSSG = new Materials( 372, TextureSet.SET_METALLIC , 10.0F, 4000, 3, 1|2 |64|128 , 153, 153, 0, 0, "HSSG" , "HSS-G" , 0, 0, 4500, 4500, true, false, 4, 1, 1, Dyes.dyeYellow , 2, Arrays.asList(new MaterialStack(TungstenSteel, 5), new MaterialStack(Chrome, 1), new MaterialStack(Molybdenum, 2), new MaterialStack(Vanadium, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials HSSE = new Materials( 373, TextureSet.SET_METALLIC , 32.0F, 10240, 7, 1|2 |64|128 , 51, 102, 0, 0, "HSSE" , "HSS-E" , 0, 0, 5400, 5400, true, false, 4, 1, 1, Dyes.dyeGreen , 2, Arrays.asList(new MaterialStack(HSSG, 6), new MaterialStack(Cobalt, 1),new MaterialStack(Manganese, 1), new MaterialStack(Silicon, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials HSSS = new Materials( 374, TextureSet.SET_METALLIC , 32.0F, 10240, 8, 1|2 |64|128 , 102, 0, 51, 0, "HSSS" , "HSS-S" , 0, 0, 5400, 5400, true, false, 4, 1, 1, Dyes.dyeRed , 2, Arrays.asList(new MaterialStack(HSSG, 6), new MaterialStack(Iridium, 2), new MaterialStack(Osmium, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials TPV = new Materials( 576, TextureSet.SET_METALLIC , 16.0F, 4000, 5, 1|2 |64|128 , 250, 170,250, 0, "TPVAlloy" , "TPV-Alloy" , 0, 0, 3000, 3000, true, false, 4, 1, 1, Dyes.dyeRed , 2, Arrays.asList(new MaterialStack(Titanium, 3), new MaterialStack(Platinum, 3), new MaterialStack(Vanadium, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials DilutedSulfuricAcid = new MaterialBuilder(640, TextureSet.SET_FLUID , "Diluted Sulfuric Acid").addCell().addFluid().setRGB(192, 120, 32).setColor(Dyes.dyeOrange).setMaterialList(new MaterialStack(SulfuricAcid, 1)).constructMaterial();
+ public static Materials EpoxidFiberReinforced = new Materials( 610, TextureSet.SET_DULL ,3.0F, 64, 1, 1|2 |64|128 , 160, 112, 16, 0, "EpoxidFiberReinforced" , "Fiber-Reinforced Epoxy Resin" , 0, 0, 400, 0, false, false, 1, 1, 1, Dyes.dyeBrown , 2, Collections.singletonList(new MaterialStack(Epoxid, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.MOTUS, 2)));
+ public static Materials SodiumCarbonate = new MaterialBuilder(695, TextureSet.SET_QUARTZ, "Sodium Carbonate").setToolSpeed(1.0F).setDurability(64).setToolQuality(1).addDustItems().setRGB(255, 255, 235).setColor(Dyes.dyeWhite).setBlastFurnaceTemp(851 ).setMeltingPoint(851 ).setBlastFurnaceRequired(false).setOreValue(1).setExtraData(1).setMaterialList(new MaterialStack(Sodium, 2), new MaterialStack(Carbon, 1), new MaterialStack(Oxygen, 3)).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials SodiumAluminate = new MaterialBuilder(696, TextureSet.SET_QUARTZ, "Sodium Aluminate").setToolSpeed(1.0F).setDurability(64).setToolQuality(1).addDustItems().setRGB(255, 235, 255).setColor(Dyes.dyeWhite).setBlastFurnaceTemp(1800).setMeltingPoint(1800).setBlastFurnaceRequired(false).setOreValue(1).setExtraData(0).setMaterialList(new MaterialStack(Sodium, 1), new MaterialStack(Aluminium, 1), new MaterialStack(Oxygen, 2)).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials Aluminiumoxide = new MaterialBuilder(697, TextureSet.SET_QUARTZ, "Alumina").setToolSpeed(1.0F).setDurability(64).setToolQuality(1).addDustItems().setRGB(235, 255, 255).setColor(Dyes.dyeWhite).setBlastFurnaceTemp(2054).setMeltingPoint(2054).setBlastFurnaceRequired(true).setOreValue(1).setExtraData(0).setMaterialList(new MaterialStack(Aluminium, 2), new MaterialStack(Oxygen, 3)).setAspects(Collections.singletonList(new TC_AspectStack(TC_Aspects.GELUM, 2))).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials Aluminiumhydroxide = new MaterialBuilder(698, TextureSet.SET_QUARTZ, "Aluminium Hydroxide").setToolSpeed(1.0F).setDurability(64).setToolQuality(1).addDustItems().setRGB(235, 235, 255).setColor(Dyes.dyeWhite).setBlastFurnaceTemp(1200).setMeltingPoint(1200).setBlastFurnaceRequired(true).setOreValue(1).setExtraData(0).setMaterialList(new MaterialStack(Aluminium, 1), new MaterialStack(Oxygen, 3), new MaterialStack(Hydrogen, 3)).setAspects(Collections.singletonList(new TC_AspectStack(TC_Aspects.GELUM, 2))).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials Cryolite = new MaterialBuilder(699, TextureSet.SET_QUARTZ, "Cryolite").setToolSpeed(1.0F).setDurability(64).setToolQuality(1).addOreItems().setRGB(191, 239, 255).setColor(Dyes.dyeLightBlue).setMeltingPoint(1012).setBlastFurnaceTemp(1012).setExtraData(0).setMaterialList(new MaterialStack(Sodium, 3), new MaterialStack(Aluminium, 1), new MaterialStack(Fluorine, 6)).constructMaterial().disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials RedMud = new MaterialBuilder(743, TextureSet.SET_FLUID, "Red Mud").addCell().addFluid().setRGB(140, 22, 22).setColor(Dyes.dyeRed).constructMaterial();
+
+ public static Materials Brick = new MaterialBuilder(625, TextureSet.SET_ROUGH , "Brick").addDustItems().setRGB(155, 86, 67).setColor(Dyes.dyeBrown).setExtraData(0).setMaterialList(new MaterialStack(Aluminium, 2), new MaterialStack(Silicon, 4), new MaterialStack(Oxygen, 11)).constructMaterial();
+ public static Materials Fireclay = new MaterialBuilder(626, TextureSet.SET_ROUGH , "Fireclay").addDustItems().setRGB(173, 160, 155).setExtraData(2).setColor(Dyes.dyeBrown).setMaterialList(new MaterialStack(Brick, 1)).constructMaterial();
+
+ // Polybenzimidazole stuff
+ public static Materials PotassiumNitrade = new MaterialBuilder(590, TextureSet.SET_DULL , "Potassium Nitrate").setName("PotassiumNitrate").addDustItems().setRGB(129, 34, 141).setColor(Dyes.dyePurple).setMaterialList(new MaterialStack(Potassium, 1), new MaterialStack(Nitrogen, 1), new MaterialStack(Oxygen, 3)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials ChromiumTrioxide = new MaterialBuilder(591, TextureSet.SET_DULL , "Chromium Trioxide").setName("Chromiumtrioxide").addDustItems().setRGB(255, 228, 225).setColor(Dyes.dyePink).setMaterialList(new MaterialStack(Chrome, 1), new MaterialStack(Oxygen, 3)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Nitrochlorobenzene = new MaterialBuilder(592, TextureSet.SET_FLUID , "2-Nitrochlorobenzene").addCell().addFluid().setRGB(143, 181, 26).setColor(Dyes.dyeLime).setMaterialList(new MaterialStack(Carbon, 6), new MaterialStack(Hydrogen, 4), new MaterialStack(Chlorine, 1), new MaterialStack(Nitrogen, 1), new MaterialStack(Oxygen, 2)).constructMaterial();
+ public static Materials Dimethylbenzene = new MaterialBuilder(593, TextureSet.SET_FLUID , "1,2-Dimethylbenzene").setName("Dimethylbenzene").addCell().addFluid().setRGB(102, 156, 64).setColor(Dyes.dyeLime).setMeltingPoint(248).setMaterialList(new MaterialStack(Carbon, 8), new MaterialStack(Hydrogen, 10)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials Potassiumdichromate = new MaterialBuilder(594, TextureSet.SET_DULL , "Potassium Dichromate").setName("PotassiumDichromate").addDustItems().setRGB(255, 8, 127).setColor(Dyes.dyePink).setMaterialList(new MaterialStack(Potassium, 2), new MaterialStack(Chrome, 2), new MaterialStack(Oxygen, 7)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials PhthalicAcid = new MaterialBuilder(595, TextureSet.SET_FLUID , "Phthalic Acid").setName("phtalicacid").addCell().addFluid().setRGB(54, 133, 71).setColor(Dyes.dyeOrange).setMaterialList(new MaterialStack(Carbon, 8), new MaterialStack(Hydrogen, 6), new MaterialStack(Oxygen, 4)).constructMaterial();
+ public static Materials Dichlorobenzidine = new MaterialBuilder(596, TextureSet.SET_FLUID , "3,3-Dichlorobenzidine").addCell().addFluid().setRGB(161, 222, 166).setColor(Dyes.dyeOrange).setMaterialList(new MaterialStack(Carbon, 12),new MaterialStack(Hydrogen, 10), new MaterialStack(Nitrogen, 2), new MaterialStack(Chlorine, 2)).constructMaterial();
+ public static Materials Diaminobenzidin = new MaterialBuilder(597, TextureSet.SET_FLUID , "3,3-Diaminobenzidine").addCell().addFluid().setRGB(51, 125, 89).setColor(Dyes.dyeOrange).setMaterialList(new MaterialStack(Carbon, 12),new MaterialStack(Hydrogen, 14),new MaterialStack(Nitrogen, 4)).constructMaterial();
+ public static Materials Diphenylisophthalate = new MaterialBuilder(598, TextureSet.SET_FLUID , "Diphenyl Isophtalate").addCell().addFluid().setRGB(36, 110, 87).setColor(Dyes.dyeOrange).setMaterialList(new MaterialStack(Carbon, 20),new MaterialStack(Hydrogen, 14),new MaterialStack(Oxygen, 4)).constructMaterial();
+ public static Materials Polybenzimidazole = new Materials(599, TextureSet.SET_DULL ,3.0F, 64, 1, 1|2 |64|128 , 45, 45, 45, 0, "Polybenzimidazole" , "Polybenzimidazole" , 0, 0, 1450, 0, false, false, 1, 1, 1, Dyes.dyeBlack , 0, Arrays.asList(new MaterialStack(Carbon, 20), new MaterialStack(Nitrogen, 4), new MaterialStack(Hydrogen, 12)), Arrays.asList(new TC_AspectStack(TC_Aspects.ORDO, 2),new TC_AspectStack(TC_Aspects.VOLATUS, 1)));
+
+ //Gasoline
+ public static Materials MTBEMixture = new MaterialBuilder(983, TextureSet.SET_FLUID , "MTBE Reaction Mixture").addCell().addGas().setRGB(255, 255, 255).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Carbon, 5), new MaterialStack(Hydrogen, 12), new MaterialStack(Oxygen, 1)).constructMaterial();
+ public static Materials NitrousOxide = new MaterialBuilder(993, TextureSet.SET_FLUID , "Nitrous Oxide").addCell().addGas().setRGB(125, 200, 255).setColor(Dyes.dyeBlue).setMaterialList(new MaterialStack(Nitrogen, 2), new MaterialStack(Oxygen, 1)).addElectrolyzerRecipe().constructMaterial();
+ public static Materials AntiKnock = new MaterialBuilder(994, TextureSet.SET_FLUID , "Anti-Knock Agent").setName("EthylTertButylEther").addCell().addFluid().setRGB(255, 255, 255).setColor(Dyes.dyeWhite).setMaterialList(new MaterialStack(Carbon, 6), new MaterialStack(Hydrogen, 14), new MaterialStack(Oxygen, 1)).constructMaterial();
+ public static Materials Octane = new MaterialBuilder(995, TextureSet.SET_FLUID , "Octane").addCell().addFluid().setRGB(255, 255, 255).setColor(Dyes.dyeWhite).setFuelType(MaterialBuilder.DIESEL).setFuelPower(80).setMaterialList(new MaterialStack(Carbon, 8), new MaterialStack(Hydrogen, 18)).constructMaterial();
+ public static Materials GasolineRaw = new MaterialBuilder(996, TextureSet.SET_FLUID , "Raw Gasoline").addCell().addFluid().setRGB(255,100,0).setColor(Dyes.dyeOrange).constructMaterial();
+ public static Materials GasolineRegular = new MaterialBuilder(997, TextureSet.SET_FLUID , "Gasoline").addCell().addFluid().setRGB(255,165,0).setColor(Dyes.dyeOrange).setFuelType(MaterialBuilder.DIESEL).setFuelPower(576).constructMaterial();
+ public static Materials GasolinePremium = new MaterialBuilder(998, TextureSet.SET_FLUID , "High Octane Gasoline").addCell().addFluid().setRGB(255,165,0).setColor(Dyes.dyeOrange).setFuelType(MaterialBuilder.DIESEL).setFuelPower(2500).constructMaterial();
+
+ //ADDED
+ public static Materials Electrotine = new Materials( 812, TextureSet.SET_SHINY , 1.0F, 0, 1, 1 |8 , 60, 180, 200, 0, "Electrotine" , "Electrotine" , 0, 0, -1, 0, false, false, 3, 1, 1, Dyes.dyeCyan , 0, Arrays.asList(new MaterialStack(Redstone, 1), new MaterialStack(Electrum, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 2)));
+ public static Materials Galgadorian = new Materials( 384, TextureSet.SET_METALLIC , 16.0F, 3600, 3, 1|2 |64|128 , 154, 105, 119, 0, "Galgadorian" , "Galgadorian" , 0, 0, 3000, 3000, true, false, 1, 1, 1, Dyes.dyePink ).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials EnhancedGalgadorian = new Materials( 385, TextureSet.SET_METALLIC , 32.0F, 7200, 5, 1|2| 64|128 , 152, 93, 133, 0, "EnhancedGalgadorian" , "Enhanced Galgadorian" , 0, 0, 4500, 4500, true, false, 1, 1, 1, Dyes.dyePink ).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials BloodInfusedIron = new Materials( 977, TextureSet.SET_METALLIC , 10.0F, 384, 2, 1|2 |64|128 , 69, 9, 10, 0, "BloodInfusedIron" , "Blood Infused Iron" , 0, 0, 2400, 0, false, false, 3, 1, 1, Dyes.dyeRed , Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 3), new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)));
+ public static Materials Shadow = new Materials( 368, TextureSet.SET_METALLIC , 32.0F, 8192, 4, 1|2 |8 |64|128 , 16, 3, 66, 0, "Shadow" , "Shadow Metal" , 0, 0, 1800, 1800, true, false, 3, 4, 3, Dyes.dyeBlue );
+
+ /**
+ * Galaxy Space 1.10 compat from Version 2.6
+ */
+ public static Materials Ledox = new Materials( 390, TextureSet.SET_SHINY , 15.0F, 1024, 4, 1|2 |8 |64|128 , 0, 116, 255, 0, "Ledox" , "Ledox" , 0, 0, -1, 0, false, false, 4, 1, 1, Dyes.dyeBlue );
+ public static Materials Quantium = new Materials( 391, TextureSet.SET_SHINY , 18.0F, 2048, 4, 1|2 |8 |64|128 , 0, 209, 11, 0, "Quantium" , "Quantium" , 0, 0, 9900, 9900, true, false, 4, 1, 1, Dyes.dyeLime ).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Mytryl = new Materials( 387, TextureSet.SET_SHINY , 8.0F, 512, 4, 1|2 |8 |64|128 , 242, 100, 4, 0, "Mytryl" , "Mytryl" , 0, 0, 3600, 3600, true, false, 4, 1, 1, Dyes.dyeOrange );
+ public static Materials BlackPlutonium = new Materials( 388, TextureSet.SET_DULL , 36.0F, 8192, 8, 1|2 |8 |64|128 , 50, 50, 50, 0, "BlackPlutonium" , "Black Plutonium" , 0, 0, 9000, 9000, true, false, 4, 1, 1, Dyes.dyeBlack ).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials CallistoIce = new Materials( 389, TextureSet.SET_SHINY , 9.0F, 1024, 4, 1|2 |8 |64|128 , 30, 177, 255, 0, "CallistoIce" , "Callisto Ice" , 0, 0, -1, 0, false, false, 4, 1, 1, Dyes.dyeLightBlue );
+ public static Materials Duralumin = new Materials( 392, TextureSet.SET_SHINY , 16.0F, 512, 3, 1|2 |8 |64|128 , 235, 209, 160, 0, "Duralumin" , "Duralumin" , 0, 0, 1600, 1600, true, false, 4, 1, 1, Dyes.dyeOrange , 2, Arrays.asList(new MaterialStack(Aluminium, 6), new MaterialStack(Copper, 1), new MaterialStack(Manganese, 1), new MaterialStack(Magnesium, 1)));
+ public static Materials Oriharukon = new Materials( 393, TextureSet.SET_SHINY , 32.0F, 10240, 5, 1|2 |8 |32|64|128 , 103, 125, 104, 0, "Oriharukon" , "Oriharukon" , 0, 0, 5400, 5400, true, false, 4, 1, 1, Dyes.dyeLime , Element.Oh, Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2),new TC_AspectStack(TC_Aspects.LUCRUM, 2), new TC_AspectStack(TC_Aspects.ALIENIS, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials MysteriousCrystal = new Materials( 398, TextureSet.SET_SHINY , 8.0F, 256, 6, 1|2 |8 |64|128 , 22, 133, 108, 0, "MysteriousCrystal" , "Mysterious Crystal" , 0, 0, 7200, 7200, true, false, 4, 1, 1, Dyes.dyeCyan ).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+
+ //\/HAD TO MOVE DOWN SECTION
+ public static Materials RedstoneAlloy = new Materials( 381, TextureSet.SET_METALLIC , 3.0F, 128, 2, 1|2 |64|128 , 181, 51, 51, 0, "RedstoneAlloy" , "Redstone Alloy" , 0, 0, 671, 1000, true, false, 1, 1, 1, Dyes.dyeRed , 1, Arrays.asList(new MaterialStack(Redstone, 1), new MaterialStack(Silicon, 1), new MaterialStack(Coal, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials Soularium = new Materials( 379, TextureSet.SET_METALLIC , 8.0F, 256, 2, 1|2 |64|128 , 65, 46, 29, 0, "Soularium" , "Soularium" , 0, 0, 800, 1000, true, false, 3, 1, 1, Dyes.dyeBrown , 1, Arrays.asList(new MaterialStack(SoulSand, 1), new MaterialStack(Gold, 1), new MaterialStack(Ash, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials ConductiveIron = new Materials( 369, TextureSet.SET_METALLIC , 6.0F, 256, 3, 1|2 |64|128 , 217, 178, 171, 0, "ConductiveIron" , "Conductive Iron" , 0, 0, -1, 1200, true, false, 4, 1, 1, Dyes.dyeRed , 1, Arrays.asList(new MaterialStack(RedstoneAlloy, 1), new MaterialStack(Iron, 1), new MaterialStack(Silver, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials ElectricalSteel = new Materials( 365, TextureSet.SET_METALLIC , 6.0F, 512, 2, 1|2 |64|128 , 185, 185, 185, 0, "ElectricalSteel" , "Electrical Steel" , 0, 0, 1811, 1000, true, false, 4, 1, 1, Dyes.dyeGray , 1, Arrays.asList(new MaterialStack(Steel, 1), new MaterialStack(Coal, 1), new MaterialStack(Silicon, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials EnergeticAlloy = new Materials( 366, TextureSet.SET_METALLIC , 12.0F, 1024, 3, 1|2 |64|128 , 255, 170, 81, 0, "EnergeticAlloy" , "Energetic Alloy" , 0, 0, -1, 2200, true, false, 3, 1, 1, Dyes.dyeOrange , 1, Arrays.asList(new MaterialStack(ConductiveIron, 1), new MaterialStack(Gold, 1), new MaterialStack(BlackSteel, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials VibrantAlloy = new Materials( 367, TextureSet.SET_METALLIC , 18.0F, 4048, 4, 1|2 |64|128 , 157, 188, 53, 0, "VibrantAlloy" , "Vibrant Alloy" , 0, 0, 3300, 3300, true, false, 4, 1, 1, Dyes.dyeLime , 1, Arrays.asList(new MaterialStack(EnergeticAlloy, 1), new MaterialStack(EnderEye, 1), new MaterialStack(Chrome, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials PulsatingIron = new Materials( 378, TextureSet.SET_METALLIC , 6.0F, 256, 3, 1|2 |64|128 , 128, 246, 155, 0, "PulsatingIron" , "Pulsating Iron" , 0, 0, -1, 1800, true, false, 4, 1, 1, Dyes.dyeLime , 1, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(EnderPearl, 1), new MaterialStack(RedstoneAlloy, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials DarkSteel = new Materials( 364, TextureSet.SET_METALLIC , 8.0F, 512, 3, 1|2 |64|128 , 80, 70, 80, 0, "DarkSteel" , "Dark Steel" , 0, 0, -1, 1800, true, false, 3, 1, 1, Dyes.dyePurple , 1, Arrays.asList(new MaterialStack(ElectricalSteel, 1), new MaterialStack(Coal, 1), new MaterialStack(Obsidian, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials EndSteel = new Materials( 401, TextureSet.SET_METALLIC , 12.0F, 2000, 4, 1|2 |64|128 , 223, 217, 165, 0, "EndSteel" , "End Steel" , 0, 0, 940, 3600, true, false, 3, 1, 1, Dyes.dyeYellow , 1, Arrays.asList(new MaterialStack(DarkSteel, 1), new MaterialStack(Tungsten, 1), new MaterialStack(Endstone, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials CrudeSteel = new Materials( 402, TextureSet.SET_METALLIC , 2.0F, 64, 2, 1|2 |64|128 , 163, 158, 154, 0, "CrudeSteel" , "Clay Compound" , 0, 0, -1, 1000, false, false, 4, 1, 1, Dyes.dyeGray , 1, Arrays.asList(new MaterialStack(Stone, 1), new MaterialStack(Clay, 1), new MaterialStack(Flint, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials CrystallineAlloy = new Materials( 403, TextureSet.SET_METALLIC , 18.0F, 768, 4, 1|2 |64|128 , 114, 197, 197, 0, "CrystallineAlloy" , "Crystalline Alloy" , 0, 0, 4500, 4500, true, false, 4, 1, 1, Dyes.dyeCyan , 1, Arrays.asList(new MaterialStack(Gold, 1), new MaterialStack(Diamond, 1), new MaterialStack(PulsatingIron, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials MelodicAlloy = new Materials( 404, TextureSet.SET_METALLIC , 24.0F, 1024, 5, 1|2 |64|128 , 136, 98, 136, 0, "MelodicAlloy" , "Melodic Alloy" , 0, 0, 5400, 5400, true, false, 4, 1, 1, Dyes.dyeMagenta , 1, Arrays.asList(new MaterialStack(EndSteel, 1), new MaterialStack(EnderEye, 1), new MaterialStack(Oriharukon, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials StellarAlloy = new Materials( 405, TextureSet.SET_METALLIC , 96.0F, 10240, 7, 1|2 |64|128 , 217, 220, 203, 0, "StellarAlloy" , "Stellar Alloy" , 0, 0, 7200, 7200, true, false, 4, 1, 1, Dyes.dyeWhite , 1, Arrays.asList(new MaterialStack(NetherStar, 1), new MaterialStack(MelodicAlloy, 1), new MaterialStack(Naquadah, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials CrystallinePinkSlime = new Materials( 406, TextureSet.SET_METALLIC , 6.0F, 128, 3, 1|2 |64|128 , 231, 158, 219, 0, "CrystallinePinkSlime" , "Crystalline Pink Slime" , 0, 0, 5000, 5000, true, false, 4, 1, 1, Dyes.dyePink , 1, Arrays.asList(new MaterialStack(CrystallineAlloy, 1), new MaterialStack(Diamond, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials EnergeticSilver = new Materials( 407, TextureSet.SET_METALLIC , 8.0F, 512, 3, 1|2 |64|128 , 149, 183, 205, 0, "EnergeticSilver" , "Energetic Silver" , 0, 0, -1, 2200, true, false, 4, 1, 1, Dyes.dyeLightBlue , 1, Arrays.asList(new MaterialStack(Silver, 1), new MaterialStack(ConductiveIron, 1), new MaterialStack(BlackSteel, 1))).disableAutoGeneratedBlastFurnaceRecipes();
+ public static Materials VividAlloy = new Materials( 408, TextureSet.SET_METALLIC , 12.0F, 768, 4, 1|2 |64|128 , 70, 188, 219, 0, "VividAlloy" , "Vivid Alloy" , 0, 0, 3300, 3300, true, false, 4, 1, 1, Dyes.dyeBlue , 1, Arrays.asList(new MaterialStack(EnergeticSilver, 1), new MaterialStack(EnderEye, 1), new MaterialStack(Chrome, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Enderium = new Materials( 321, TextureSet.SET_DULL , 8.0F, 1500, 3, 1|2 |64|128 , 89, 145, 135, 0, "Enderium" , "Enderium" , 0, 0, 4500, 4500, true, false, 1, 1, 1, Dyes.dyeGreen , 1, Arrays.asList(new MaterialStack(EnderiumBase, 2), new MaterialStack(Thaumium, 1), new MaterialStack(EnderPearl, 1)), Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 2), new TC_AspectStack(TC_Aspects.ALIENIS, 1))).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Mithril = new Materials( 331, TextureSet.SET_SHINY , 32.0F, 64, 2, 1|2 |8 |64 , 255, 255, 210, 0, "Mithril" , "Mithril" , 0, 0, 6600, 6600, true, false, 4, 3, 2, Dyes.dyeLightBlue , 2, Arrays.asList(new MaterialStack(Platinum, 2), new MaterialStack(Thaumium, 1))).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(22, 1, 1);
+ public static Materials BlueAlloy = new Materials( 309, TextureSet.SET_DULL , 1.0F, 0, 0, 1|2 , 100, 180, 255, 0, "BlueAlloy" , "Blue Alloy" , 0, 0, -1, 0, false, false, 3, 5, 1, Dyes.dyeLightBlue , 2, Arrays.asList(new MaterialStack(Silver, 1), new MaterialStack(Electrotine, 4)), Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 3)));
+ public static Materials ShadowIron = new Materials( 336, TextureSet.SET_METALLIC , 32.0F, 10240, 2, 1|2 |8 |64 , 120, 120, 120, 0, "ShadowIron" , "Shadow Iron" , 0, 0, 8400, 8400, true, false, 3, 4, 3, Dyes.dyeBlack , 2, Arrays.asList(new MaterialStack(Iron, 1), new MaterialStack(Thaumium, 3))).disableAutoGeneratedBlastFurnaceRecipes().setTurbineMultipliers(1, 76, 1);
+ public static Materials ShadowSteel = new Materials( 337, TextureSet.SET_METALLIC , 6.0F, 768, 4, 1|2 |64 , 90, 90, 90, 0, "ShadowSteel" , "Shadow Steel" , 0, 0, -1, 1700, true, false, 4, 4, 3, Dyes.dyeBlack , 2, Arrays.asList(new MaterialStack(Steel, 1), new MaterialStack(Thaumium, 3)));
+ public static Materials AstralSilver = new Materials( 333, TextureSet.SET_SHINY , 10.0F, 64, 2, 1|2 |64 , 230, 230, 255, 0, "AstralSilver" , "Astral Silver" , 0, 0, -1, 0, false, false, 4, 3, 2, Dyes.dyeWhite , 2, Arrays.asList(new MaterialStack(Silver, 2), new MaterialStack(Thaumium, 1)));
+
+ /**
+ * Op materials (draconic evolution above)
+ */
+ public static Materials InfinityCatalyst = new Materials( 394, TextureSet.SET_SHINY , 64.0F,1310720, 10, 1|2 |8 |64|128 , 255, 255, 255, 0, "InfinityCatalyst" , "Infinity Catalyst" , 5, 500000, 10800, 10800, true, false, 20, 1, 1, Dyes.dyeLightGray ).setProcessingMaterialTierEU(TierEU.RECIPE_UV).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Infinity = new Materials( 397, new TextureSet("infinity", true), 256.0F,2621440, 17, 1|2 |64|128 , 255, 255, 255, 0, "Infinity" , "Infinity" , 5, 5000000, 10800, 10800, true, false, 40, 1, 1, Dyes.dyeLightGray ).setProcessingMaterialTierEU(TierEU.RECIPE_UV).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Bedrockium = new MaterialBuilder(395,TextureSet.SET_DULL, "Bedrockium").addOreItems().addDustItems().addMetalItems().setDurability(327680).setToolSpeed(8f).setToolQuality(9).setRGB(50,50,50).setName("Bedrockium").setBlastFurnaceRequired(true).setBlastFurnaceTemp(9900).setMeltingPoint(9900).setColor(Dyes.dyeBlack).setOreValue(4).setDensityDivider(1).setDensityMultiplier(1).constructMaterial().setProcessingMaterialTierEU(TierEU.RECIPE_EV).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Trinium = new Materials( 868, TextureSet.SET_SHINY , 128.0F, 51200, 8, 1|2 |8 |64|128 , 200, 200, 210, 0, "Trinium" , "Trinium" , 0, 0, 7200, 7200, true, false, 4, 1, 1, Dyes.dyeLightGray ).disableAutoGeneratedBlastFurnaceRecipes().disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Ichorium = new Materials( 978, TextureSet.SET_SHINY , 32.0F, 850000, 12, 1|2 |8 |32|64|128 , 211, 120, 6, 0, "Ichorium" , "Ichorium" , 5, 250000, 9000, 9000, true, false, 4, 1, 1, Dyes.dyeOrange ).setTurbineMultipliers(30, 30, 3).setHasCorrespondingPlasma(true);
+ public static Materials CosmicNeutronium = new Materials( 982, TextureSet.SET_SHINY , 96.0F, 163840, 12, 1|2 |8 |32|64|128 , 50, 50, 50, 0, "CosmicNeutronium" , "Cosmic Neutronium" , 0, 0, 9900, 9900, true, false, 4, 1, 1, Dyes.dyeBlack ).setProcessingMaterialTierEU(TierEU.RECIPE_ZPM).disableAutoGeneratedVacuumFreezerRecipe().setHasCorrespondingPlasma(true);
+
+ // Superconductor base.
+ public static Materials Pentacadmiummagnesiumhexaoxid = new Materials( 987, TextureSet.SET_SHINY , 1.0F, 0, 3, 1|2 , 85, 85, 85, 0, "Pentacadmiummagnesiumhexaoxid" , "Superconductor Base MV" , 0, 0, 2500, 2500, true, false, 1, 1, 1, Dyes.dyeGray , 1, Arrays.asList(new MaterialStack(Cadmium, 5), new MaterialStack(Magnesium, 1), new MaterialStack(Oxygen, 6)), Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 3))).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Titaniumonabariumdecacoppereikosaoxid = new Materials( 988, TextureSet.SET_METALLIC , 1.0F, 0, 3, 1|2 , 51, 25, 0, 0, "Titaniumonabariumdecacoppereikosaoxid" , "Superconductor Base HV" , 0, 0, 3300, 3300, true, false, 1, 1, 1, Dyes.dyeBrown , 1, Arrays.asList(new MaterialStack(Titanium, 1), new MaterialStack(Barium, 9), new MaterialStack(Copper, 10), new MaterialStack(Oxygen, 20)), Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 6))).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Uraniumtriplatinid = new Materials( 989, TextureSet.SET_SHINY , 1.0F, 0, 3, 1|2 , 0,135, 0, 0, "Uraniumtriplatinid" , "Superconductor Base EV" , 0, 0, 4400, 4400, true, false, 1, 1, 1, Dyes.dyeLime , 1, Arrays.asList(new MaterialStack(Uranium, 1), new MaterialStack(Platinum, 3)), Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 9))).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Vanadiumtriindinid = new Materials( 990, TextureSet.SET_SHINY , 1.0F, 0, 3, 1|2 , 51, 0, 51, 0, "Vanadiumtriindinid" , "Superconductor Base IV" , 0, 0, 5200, 5200, true, false, 1, 1, 1, Dyes.dyeMagenta , 1, Arrays.asList(new MaterialStack(Vanadium , 1), new MaterialStack(Indium, 3)), Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 12))).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid = new Materials( 991, TextureSet.SET_METALLIC , 1.0F, 0, 3, 1|2 , 153, 76, 0, 0, "Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid" , "Superconductor Base LuV" , 0, 0, 6000, 6000, true, false, 1, 1, 1, Dyes.dyeBrown , 1, Arrays.asList(new MaterialStack(Indium, 4), new MaterialStack(Tin, 2), new MaterialStack(Barium, 2), new MaterialStack(Titanium, 1), new MaterialStack(Copper, 7), new MaterialStack(Oxygen, 14)), Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 15))).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Tetranaquadahdiindiumhexaplatiumosminid = new Materials( 992, TextureSet.SET_METALLIC , 1.0F, 0, 3, 1|2 , 10, 10, 10, 0, "Tetranaquadahdiindiumhexaplatiumosminid" , "Superconductor Base ZPM" , 0, 0, 9000, 9000, true, false, 1, 1, 1, Dyes.dyeBlack , 1, Arrays.asList(new MaterialStack(Naquadah, 4), new MaterialStack(Indium, 2), new MaterialStack(Palladium, 6), new MaterialStack(Osmium, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 18))).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Longasssuperconductornameforuvwire = new Materials( 986, TextureSet.SET_METALLIC , 1.0F, 0, 3, 1|2 , 224,210, 7, 0, "Longasssuperconductornameforuvwire" , "Superconductor Base UV" , 0, 0, 9900, 9900, true, false, 1, 1, 1, Dyes.dyeYellow , 1, Arrays.asList(new MaterialStack(Naquadria, 4), new MaterialStack(Osmiridium, 3), new MaterialStack(Europium, 1), new MaterialStack(Samarium, 1)), Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 21))).setProcessingMaterialTierEU(TierEU.RECIPE_LuV).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials Longasssuperconductornameforuhvwire = new Materials( 985, TextureSet.SET_SHINY , 1.0F, 0, 3, 1|2 , 38,129, 189, 0, "Longasssuperconductornameforuhvwire" , "Superconductor Base UHV" , 0, 0, 10800, 10800, true, false, 1, 1, 1, Dyes.dyeWhite , 1, Arrays.asList(new MaterialStack(Draconium, 6), new MaterialStack(CosmicNeutronium, 7), new MaterialStack(Tritanium, 5), new MaterialStack(Americium, 6)), Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 24))).setProcessingMaterialTierEU(TierEU.RECIPE_ZPM).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials SuperconductorUEVBase = new Materials( 974, TextureSet.SET_SHINY , 1.0F, 0, 3, 1|2 , 174, 8, 8, 0, "SuperconductorUEVBase" , "Superconductor Base UEV" , 0, 0, 11700, 11800, true, false, 1, 1, 1, Dyes.dyeWhite, Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 27))).setProcessingMaterialTierEU(TierEU.RECIPE_UV).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials SuperconductorUIVBase = new Materials( 131, TextureSet.SET_SHINY , 1.0F, 0, 3, 1|2 , 229, 88, 177, 0, "SuperconductorUIVBase" , "Superconductor Base UIV" , 0, 0, 12700, 12700, true, false, 1, 1, 1, Dyes.dyeWhite, Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 34))).setProcessingMaterialTierEU(TierEU.RECIPE_UHV).disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials SuperconductorUMVBase = new Materials( 134, TextureSet.SET_SHINY , 1.0F, 0, 3, 1|2 , 181, 38, 205, 0, "SuperconductorUMVBase" , "Superconductor Base UMV" , 0, 0, 13600, 13600, true, false, 1, 1, 1, Dyes.dyeWhite, Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 40))).setProcessingMaterialTierEU(TierEU.RECIPE_UEV).disableAutoGeneratedVacuumFreezerRecipe();
+
+ // Superconductors.
+ public static Materials SuperconductorMV = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 0, 0 , 85, 85, 85, 0, "SuperconductorMV" , "Superconductor MV" , 0, 0, -1, -1, false, false, 1, 1, 1, Dyes.dyeGray , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 6)));
+ public static Materials SuperconductorHV = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 0, 0 , 51, 25, 0, 0, "SuperconductorHV" , "Superconductor HV" , 0, 0, -1, -1, false, false, 1, 1, 1, Dyes.dyeBrown , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 12)));
+ public static Materials SuperconductorEV = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 0, 0 , 0,135, 0, 0, "SuperconductorEV" , "Superconductor EV" , 0, 0, -1, -1, false, false, 1, 1, 1, Dyes.dyeLime , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 18)));
+ public static Materials SuperconductorIV = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 0, 0 , 51, 0, 51, 0, "SuperconductorIV" , "Superconductor IV" , 0, 0, -1, -1, false, false, 1, 1, 1, Dyes.dyeMagenta , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 24)));
+ public static Materials SuperconductorLuV = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 0, 0 , 153, 76, 0, 0, "SuperconductorLuV" , "Superconductor LuV" , 0, 0, -1, -1, false, false, 1, 1, 1, Dyes.dyeBrown , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 30)));
+ public static Materials SuperconductorZPM = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 0, 0 , 10, 10, 10, 0, "SuperconductorZPM" , "Superconductor ZPM" , 0, 0, -1, -1, false, false, 1, 1, 1, Dyes.dyeBlack , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 36)));
+ public static Materials SuperconductorUV = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 0, 0 , 224,210, 7, 0, "SuperconductorUV" , "Superconductor UV" , 0, 0, -1, -1, false, false, 1, 1, 1, Dyes.dyeYellow , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 42)));
+ public static Materials SuperconductorUHV = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 0, 0 , 38,129, 189, 0, "Superconductor" , "Superconductor UHV" , 0, 0, -1, -1, false, false, 1, 1, 1, Dyes.dyeWhite , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 48)));
+ public static Materials SuperconductorUEV = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 0, 0 , 174, 8, 8, 0, "SuperconductorUEV" , "Superconductor UEV" , 0, 0, -1, -1, false, false, 1, 1, 1, Dyes.dyeWhite , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 54)));
+ public static Materials SuperconductorUIV = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 0, 0 , 229, 88, 177, 0, "SuperconductorUIV" , "Superconductor UIV" , 0, 0, -1, -1, false, false, 1, 1, 1, Dyes.dyeWhite , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 60)));
+ public static Materials SuperconductorUMV = new Materials( -1, TextureSet.SET_SHINY , 1.0F, 0, 0, 0 , 181, 38, 205, 0, "SuperconductorUMV" , "Superconductor UMV" , 0, 0, -1, -1, false, false, 1, 1, 1, Dyes.dyeWhite , Collections.singletonList(new TC_AspectStack(TC_Aspects.ELECTRUM, 66)));
+
+ public static Materials SuperCoolant = new MaterialBuilder( 140, TextureSet.SET_DULL,"Super Coolant").setRGB(2, 91, 111).addCell().addFluid().constructMaterial().setLiquidTemperature(1);
+
+ public static Materials EnrichedHolmium = new Materials(582, TextureSet.SET_METALLIC , 1.0F, 0, 2, 2 , 18, 100, 255, 0, "EnrichedHolmium" , "Enriched Holmium" , -1, -1, 0, 3000, true, false,200, 1, 1, Dyes.dyePurple);
+
+ public static Materials TengamPurified = new MaterialBuilder(111, TextureSet.SET_METALLIC, "Purified Tengam").addDustItems().addGearItems().addMetalItems().addToolHeadItems().setAspects(Arrays.asList(new TC_AspectStack(TC_Aspects.MAGNETO, 2), new TC_AspectStack(TC_Aspects.ELECTRUM, 2))).setColor(Dyes.dyeLime).setName("TengamPurified").setRGB(186, 223, 112).constructMaterial().setProcessingMaterialTierEU(TierEU.RECIPE_UV);
+ public static Materials TengamAttuned = new MaterialBuilder(112, TextureSet.SET_MAGNETIC, "Attuned Tengam") .addDustItems().addGearItems().addMetalItems().addToolHeadItems().setAspects(Arrays.asList(new TC_AspectStack(TC_Aspects.MAGNETO, 4), new TC_AspectStack(TC_Aspects.ELECTRUM, 1))).setColor(Dyes.dyeLime).setName("TengamAttuned") .setRGB(213, 255, 128).constructMaterial().setProcessingMaterialTierEU(TierEU.RECIPE_UV);
+ public static Materials TengamRaw = new MaterialBuilder(110, TextureSet.SET_ROUGH, "Raw Tengam") .addOreItems() .setAspects(Arrays.asList(new TC_AspectStack(TC_Aspects.MAGNETO, 1), new TC_AspectStack(TC_Aspects.ELECTRUM, 4))).setColor(Dyes.dyeLime).setName("TengamRaw") .setRGB(160, 191, 96).constructMaterial().setProcessingMaterialTierEU(TierEU.RECIPE_UV);
+
+ // spotless:on
+
+ static {
+ MaterialsBotania.init();
+ }
+
+ static {
+ MaterialsKevlar.init();
+ }
+
+ static {
+ MaterialsOreAlum.init();
+ }
+
+ static {
+ MaterialsUEVplus.init();
+ }
+
+ /**
+ * Superconductor re-routed for mod compatibility. Circuits are re-routed into SuperconductorUHV as well.
+ * <p>
+ * Internal name is now Superconductor while translated name is SuperconductorUHV.
+ * </p>
+ *
+ * @deprecated Use {@link #SuperconductorUHV} instead
+ */
+ @Deprecated
+ public static Materials Superconductor = new Materials(SuperconductorUHV, true); // new Materials( -1,
+ // TextureSet.SET_NONE , 1.0F, 0,
+ // 0, 0
+ // , 255, 255, 255, 0, "Superconductor" , "Superconductor" , 0,
+ // 0, -1, 0, false, false, 1, 1, 1, Dyes.dyeLightGray , Arrays.asList(new
+ // TC_AspectStack(TC_Aspects.ELECTRUM, 9)));
+
+ @Deprecated
+ public static Materials Nikolite = new Materials(Electrotine, false);
+
+ @Deprecated
+ public static Materials Phosphor = new Materials(Phosphorus, false);
+
+ private static Materials[] MATERIALS_ARRAY = new Materials[] {};
+
+ static {
+ initSubTags();
+
+ setReRegistration();
+ setMaceratingInto();
+ setSmeltingInto();
+ setDirectSmelting();
+ setOthers();
+ setMultipliers();
+ setEnchantments();
+ setHeatDamage();
+ setByProducts();
+ setColors();
+
+ overrideChemicalFormulars();
+ }
+
+ public final short[] mRGBa = new short[] { 255, 255, 255, 0 }, mMoltenRGBa = new short[] { 255, 255, 255, 0 };
+ public TextureSet mIconSet;
+ public GT_GeneratedMaterial_Renderer renderer;
+ public List<MaterialStack> mMaterialList = new ArrayList<>();
+ public List<Materials> mOreByProducts = new ArrayList<>(), mOreReRegistrations = new ArrayList<>();
+ public List<TC_Aspects.TC_AspectStack> mAspects = new ArrayList<>();
+ public ArrayList<ItemStack> mMaterialItems = new ArrayList<>();
+ public Collection<SubTag> mSubTags = new LinkedHashSet<>();
+ public Enchantment mEnchantmentTools = null, mEnchantmentArmors = null;
+ public boolean mUnificatable, mBlastFurnaceRequired = false, mAutoGenerateBlastFurnaceRecipes = true,
+ mAutoGenerateVacuumFreezerRecipes = true, mAutoGenerateRecycleRecipes = true, mTransparent = false,
+ mHasParentMod = true, mHasPlasma = false, mHasGas = false, mCustomOre = false;
+ public byte mEnchantmentToolsLevel = 0, mEnchantmentArmorsLevel = 0, mToolQuality = 0;
+ public short mBlastFurnaceTemp = 0;
+ public int mMeltingPoint = 0;
+ public int mGasTemp = 0;
+ public int mMetaItemSubID;
+ public int mTypes = 0;
+ public int mDurability = 16;
+ public int mFuelPower = 0;
+ public int mFuelType = 0;
+ public int mExtraData = 0;
+ public int mOreValue = 0;
+ public int mOreMultiplier = 1;
+ public int mByProductMultiplier = 1;
+ public int mSmeltingMultiplier = 1;
+ public int mDensityMultiplier = 1;
+ public int mDensityDivider = 1;
+
+ public int getProcessingMaterialTierEU() {
+ return processingMaterialTierEU;
+ }
+
+ public Materials setProcessingMaterialTierEU(final long processingMaterialTierEU) {
+ this.processingMaterialTierEU = (int) processingMaterialTierEU;
+ return this;
+ }
+
+ public int processingMaterialTierEU = 0;
+ public long mDensity = M;
+ public float mToolSpeed = 1.0F, mHeatDamage = 0.0F, mSteamMultiplier = 1.0F, mGasMultiplier = 1.0F,
+ mPlasmaMultiplier = 1.0F;
+ public String mChemicalFormula = "?", mName, mDefaultLocalName, mCustomID = "null", mConfigSection = "null",
+ mLocalizedName = "null";
+ public Dyes mColor = Dyes._NULL;
+ public Element mElement = null;
+ public Materials mDirectSmelting = this, mOreReplacement = this, mMacerateInto = this, mSmeltInto = this,
+ mArcSmeltInto = this, mHandleMaterial = this, mMaterialInto;
+ public Fluid mSolid = null, mFluid = null, mGas = null, mPlasma = null;
+ /**
+ * This Fluid is used as standard Unit for Molten Materials. 1296 is a Molten Block, that means 144 is one Material
+ * Unit worth of fluid.
+ */
+ public Fluid mStandardMoltenFluid = null;
+
+ private boolean hasCorrespondingFluid = false, hasCorrespondingGas = false, canBeCracked = false;
+ private Fluid[] hydroCrackedFluids = new Fluid[3], steamCrackedFluids = new Fluid[3];
+
+ public Materials(int aMetaItemSubID, TextureSet aIconSet, float aToolSpeed, int aDurability, int aToolQuality,
+ boolean aUnificatable, String aName, String aDefaultLocalName) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aDurability,
+ aToolQuality,
+ aUnificatable,
+ aName,
+ aDefaultLocalName,
+ "ore",
+ false,
+ "null");
+ }
+
+ public Materials(int aMetaItemSubID, TextureSet aIconSet, float aToolSpeed, int aDurability, int aToolQuality,
+ boolean aUnificatable, String aName, String aDefaultLocalName, String aConfigSection, boolean aCustomOre,
+ String aCustomID) {
+ mMetaItemSubID = aMetaItemSubID;
+ mDefaultLocalName = aDefaultLocalName;
+ mName = aName;
+ MATERIALS_MAP.put(mName, this);
+ mCustomOre = aCustomOre;
+ mCustomID = aCustomID;
+ mConfigSection = aConfigSection;
+ mUnificatable = aUnificatable;
+ mDurability = aDurability;
+ mToolSpeed = aToolSpeed;
+ mToolQuality = (byte) aToolQuality;
+ mMaterialInto = this;
+ mIconSet = aIconSet;
+ }
+
+ public Materials(Materials aMaterialInto, boolean aReRegisterIntoThis) {
+ mUnificatable = false;
+ mDefaultLocalName = aMaterialInto.mDefaultLocalName;
+ mName = aMaterialInto.mName;
+ mMaterialInto = aMaterialInto.mMaterialInto;
+ if (aReRegisterIntoThis) mMaterialInto.mOreReRegistrations.add(this);
+ mChemicalFormula = aMaterialInto.mChemicalFormula;
+ mMetaItemSubID = -1;
+ mIconSet = TextureSet.SET_NONE;
+ }
+
+ public Materials(int aMetaItemSubID, TextureSet aIconSet, float aToolSpeed, int aDurability, int aToolQuality,
+ int aTypes, int aR, int aG, int aB, int aA, String aName, String aDefaultLocalName, int aFuelType,
+ int aFuelPower, int aMeltingPoint, int aBlastFurnaceTemp, boolean aBlastFurnaceRequired, boolean aTransparent,
+ int aOreValue, int aDensityMultiplier, int aDensityDivider, Dyes aColor) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aName,
+ aDefaultLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor,
+ "ore",
+ false,
+ "null");
+ }
+
+ public Materials(int aMetaItemSubID, TextureSet aIconSet, float aToolSpeed, int aDurability, int aToolQuality,
+ int aTypes, int aR, int aG, int aB, int aA, String aName, String aDefaultLocalName, int aFuelType,
+ int aFuelPower, int aMeltingPoint, int aBlastFurnaceTemp, boolean aBlastFurnaceRequired, boolean aTransparent,
+ int aOreValue, int aDensityMultiplier, int aDensityDivider, Dyes aColor, String aConfigSection) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aName,
+ aDefaultLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor,
+ aConfigSection,
+ false,
+ "null");
+ }
+
+ /**
+ * @param aMetaItemSubID the Sub-ID used in my own MetaItems. Range 0-1000. -1 for no Material
+ * @param aTypes which kind of Items should be generated. Bitmask as follows: 1 = Dusts of all kinds.
+ * 2 = Dusts, Ingots, Plates, Rods/Sticks, Machine Components and other Metal specific
+ * things. 4 = Dusts, Gems, Plates, Lenses (if transparent). 8 = Dusts, Impure Dusts,
+ * crushed Ores, purified Ores, centrifuged Ores etc. 16 = Cells 32 = Plasma Cells 64 =
+ * Tool Heads 128 = Gears 256 = Designates something as empty (only used for the Empty
+ * material)
+ * @param aR, aG, aB Color of the Material 0-255 each.
+ * @param aA transparency of the Material Texture. 0 = fully visible, 255 = Invisible.
+ * @param aName The Name used as Default for localization.
+ * @param aFuelType Type of Generator to get Energy from this Material.
+ * @param aFuelPower EU generated. Will be multiplied by 1000, also additionally multiplied by 2 for
+ * Gems.
+ * @param aMeltingPoint Used to determine the smelting Costs in furnace. >>>>**ADD 20000 to remove EBF
+ * recipes to add them MANUALLY ! :D**<<<<
+ * @param aBlastFurnaceTemp Used to determine the needed Heat capacity Costs in Blast Furnace.
+ * @param aBlastFurnaceRequired If this requires a Blast Furnace.
+ * @param aColor Vanilla MC Wool Color which comes the closest to this.
+ */
+ public Materials(int aMetaItemSubID, TextureSet aIconSet, float aToolSpeed, int aDurability, int aToolQuality,
+ int aTypes, int aR, int aG, int aB, int aA, String aName, String aDefaultLocalName, int aFuelType,
+ int aFuelPower, int aMeltingPoint, int aBlastFurnaceTemp, boolean aBlastFurnaceRequired, boolean aTransparent,
+ int aOreValue, int aDensityMultiplier, int aDensityDivider, Dyes aColor, String aConfigSection,
+ boolean aCustomOre, String aCustomID) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aDurability,
+ aToolQuality,
+ true,
+ aName,
+ aDefaultLocalName,
+ aConfigSection,
+ aCustomOre,
+ aCustomID);
+ mMeltingPoint = aMeltingPoint;
+ mBlastFurnaceRequired = aBlastFurnaceRequired;
+ mBlastFurnaceTemp = (short) aBlastFurnaceTemp;
+ mTransparent = aTransparent;
+ mFuelPower = aFuelPower;
+ mFuelType = aFuelType;
+ mOreValue = aOreValue;
+ mDensityMultiplier = aDensityMultiplier;
+ mDensityDivider = aDensityDivider;
+ mDensity = (M * aDensityMultiplier) / aDensityDivider;
+ mColor = aColor;
+ mRGBa[0] = mMoltenRGBa[0] = (short) aR;
+ mRGBa[1] = mMoltenRGBa[1] = (short) aG;
+ mRGBa[2] = mMoltenRGBa[2] = (short) aB;
+ mRGBa[3] = mMoltenRGBa[3] = (short) aA;
+ mTypes = aTypes;
+ if (mColor != null) add(SubTag.HAS_COLOR);
+ if (mTransparent) add(SubTag.TRANSPARENT);
+ if ((mTypes & 2) != 0) add(SubTag.SMELTING_TO_FLUID);
+ }
+
+ public Materials(int aMetaItemSubID, TextureSet aIconSet, float aToolSpeed, int aDurability, int aToolQuality,
+ int aTypes, int aR, int aG, int aB, int aA, String aName, String aDefaultLocalName, int aFuelType,
+ int aFuelPower, int aMeltingPoint, int aBlastFurnaceTemp, boolean aBlastFurnaceRequired, boolean aTransparent,
+ int aOreValue, int aDensityMultiplier, int aDensityDivider, Dyes aColor,
+ List<TC_Aspects.TC_AspectStack> aAspects) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aName,
+ aDefaultLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor);
+ mAspects.addAll(aAspects);
+ }
+
+ public Materials(int aMetaItemSubID, TextureSet aIconSet, float aToolSpeed, int aDurability, int aToolQuality,
+ int aTypes, int aR, int aG, int aB, int aA, String aName, String aDefaultLocalName, int aFuelType,
+ int aFuelPower, int aMeltingPoint, int aBlastFurnaceTemp, boolean aBlastFurnaceRequired, boolean aTransparent,
+ int aOreValue, int aDensityMultiplier, int aDensityDivider, Dyes aColor, Element aElement,
+ List<TC_Aspects.TC_AspectStack> aAspects) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aName,
+ aDefaultLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor);
+ mElement = aElement;
+ mElement.mLinkedMaterials.add(this);
+ if (aElement == Element._NULL) {
+ mChemicalFormula = "Empty";
+ } else {
+ mChemicalFormula = aElement.toString();
+ mChemicalFormula = mChemicalFormula.replaceAll("_", "-");
+ }
+ mAspects.addAll(aAspects);
+ }
+
+ public Materials(int aMetaItemSubID, TextureSet aIconSet, float aToolSpeed, int aDurability, int aToolQuality,
+ int aTypes, int aR, int aG, int aB, int aA, String aName, String aDefaultLocalName, int aFuelType,
+ int aFuelPower, int aMeltingPoint, int aBlastFurnaceTemp, boolean aBlastFurnaceRequired, boolean aTransparent,
+ int aOreValue, int aDensityMultiplier, int aDensityDivider, Dyes aColor, int aExtraData,
+ List<MaterialStack> aMaterialList) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aName,
+ aDefaultLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor,
+ aExtraData,
+ aMaterialList,
+ null);
+ }
+
+ public Materials(int aMetaItemSubID, TextureSet aIconSet, float aToolSpeed, int aDurability, int aToolQuality,
+ int aTypes, int aR, int aG, int aB, int aA, String aName, String aDefaultLocalName, int aFuelType,
+ int aFuelPower, int aMeltingPoint, int aBlastFurnaceTemp, boolean aBlastFurnaceRequired, boolean aTransparent,
+ int aOreValue, int aDensityMultiplier, int aDensityDivider, Dyes aColor, int aExtraData,
+ List<MaterialStack> aMaterialList, List<TC_Aspects.TC_AspectStack> aAspects) {
+ this(
+ aMetaItemSubID,
+ aIconSet,
+ aToolSpeed,
+ aDurability,
+ aToolQuality,
+ aTypes,
+ aR,
+ aG,
+ aB,
+ aA,
+ aName,
+ aDefaultLocalName,
+ aFuelType,
+ aFuelPower,
+ aMeltingPoint,
+ aBlastFurnaceTemp,
+ aBlastFurnaceRequired,
+ aTransparent,
+ aOreValue,
+ aDensityMultiplier,
+ aDensityDivider,
+ aColor);
+ mExtraData = aExtraData;
+ mMaterialList.addAll(aMaterialList);
+ if (mMaterialList.size() == 1) mChemicalFormula = mMaterialList.get(0)
+ .toString(true);
+ else mChemicalFormula = mMaterialList.stream()
+ .map(MaterialStack::toString)
+ .collect(Collectors.joining())
+ .replaceAll("_", "-");
+
+ int tAmountOfComponents = 0, tMeltingPoint = 0;
+ for (MaterialStack tMaterial : mMaterialList) {
+ tAmountOfComponents += tMaterial.mAmount;
+ if (tMaterial.mMaterial.mMeltingPoint > 0)
+ tMeltingPoint += tMaterial.mMaterial.mMeltingPoint * tMaterial.mAmount;
+ if (aAspects == null) for (TC_Aspects.TC_AspectStack tAspect : tMaterial.mMaterial.mAspects)
+ tAspect.addToAspectList(mAspects);
+ }
+
+ if (mMeltingPoint < 0) mMeltingPoint = (short) (tMeltingPoint / tAmountOfComponents);
+
+ tAmountOfComponents *= aDensityMultiplier;
+ tAmountOfComponents /= aDensityDivider;
+ if (aAspects == null) for (TC_Aspects.TC_AspectStack tAspect : mAspects)
+ tAspect.mAmount = Math.max(1, tAspect.mAmount / Math.max(1, tAmountOfComponents));
+ else mAspects.addAll(aAspects);
+ }
+
+ private static void setSmeltingInto() {
+ SamariumMagnetic.setSmeltingInto(Samarium)
+ .setMaceratingInto(Samarium)
+ .setArcSmeltingInto(Samarium);
+ NeodymiumMagnetic.setSmeltingInto(Neodymium)
+ .setMaceratingInto(Neodymium)
+ .setArcSmeltingInto(Neodymium);
+ SteelMagnetic.setSmeltingInto(Steel)
+ .setMaceratingInto(Steel)
+ .setArcSmeltingInto(Steel);
+ Iron.setSmeltingInto(Iron)
+ .setMaceratingInto(Iron)
+ .setArcSmeltingInto(WroughtIron);
+ AnyIron.setSmeltingInto(Iron)
+ .setMaceratingInto(Iron)
+ .setArcSmeltingInto(WroughtIron);
+ PigIron.setSmeltingInto(Iron)
+ .setMaceratingInto(Iron)
+ .setArcSmeltingInto(WroughtIron);
+ WroughtIron.setSmeltingInto(WroughtIron)
+ .setMaceratingInto(WroughtIron)
+ .setArcSmeltingInto(WroughtIron);
+ IronMagnetic.setSmeltingInto(Iron)
+ .setMaceratingInto(Iron)
+ .setArcSmeltingInto(WroughtIron);
+ Copper.setSmeltingInto(Copper)
+ .setMaceratingInto(Copper)
+ .setArcSmeltingInto(AnnealedCopper);
+ AnyCopper.setSmeltingInto(Copper)
+ .setMaceratingInto(Copper)
+ .setArcSmeltingInto(AnnealedCopper);
+ AnnealedCopper.setSmeltingInto(AnnealedCopper)
+ .setMaceratingInto(AnnealedCopper)
+ .setArcSmeltingInto(AnnealedCopper);
+ Netherrack.setSmeltingInto(NetherBrick);
+ MeatRaw.setSmeltingInto(MeatCooked);
+ Sand.setSmeltingInto(Glass);
+ Ice.setSmeltingInto(Water);
+ Snow.setSmeltingInto(Water);
+ TengamAttuned.setSmeltingInto(TengamPurified)
+ .setMaceratingInto(TengamPurified)
+ .setArcSmeltingInto(TengamPurified);
+ }
+
+ private static void setOthers() {
+ Mercury.add(SubTag.SMELTING_TO_GEM);
+ BandedIron.setOreReplacement(RoastedIron);
+ Garnierite.setOreReplacement(RoastedNickel);
+ }
+
+ private static void setDirectSmelting() {
+ Cinnabar.setDirectSmelting(Mercury)
+ .add(SubTag.INDUCTIONSMELTING_LOW_OUTPUT)
+ .add(SubTag.SMELTING_TO_GEM);
+ Tetrahedrite.setDirectSmelting(Copper)
+ .add(SubTag.INDUCTIONSMELTING_LOW_OUTPUT)
+ .add(SubTag.DONT_ADD_DEFAULT_BBF_RECIPE);
+ Chalcopyrite.setDirectSmelting(Copper)
+ .add(SubTag.INDUCTIONSMELTING_LOW_OUTPUT)
+ .add(SubTag.DONT_ADD_DEFAULT_BBF_RECIPE);
+ Malachite.setDirectSmelting(Copper)
+ .add(SubTag.INDUCTIONSMELTING_LOW_OUTPUT);
+ Pentlandite.setDirectSmelting(Nickel)
+ .add(SubTag.INDUCTIONSMELTING_LOW_OUTPUT);
+ Sphalerite.setDirectSmelting(Zinc)
+ .add(SubTag.INDUCTIONSMELTING_LOW_OUTPUT);
+ Pyrite.setDirectSmelting(Iron)
+ .add(SubTag.INDUCTIONSMELTING_LOW_OUTPUT);
+ BasalticMineralSand.setDirectSmelting(Iron)
+ .add(SubTag.INDUCTIONSMELTING_LOW_OUTPUT);
+ GraniticMineralSand.setDirectSmelting(Iron)
+ .add(SubTag.INDUCTIONSMELTING_LOW_OUTPUT);
+ YellowLimonite.setDirectSmelting(Iron)
+ .add(SubTag.INDUCTIONSMELTING_LOW_OUTPUT);
+ BrownLimonite.setDirectSmelting(Iron);
+ BandedIron.setDirectSmelting(Iron);
+ Magnetite.setDirectSmelting(Iron);
+ Cassiterite.setDirectSmelting(Tin);
+ CassiteriteSand.setDirectSmelting(Tin);
+ Chromite.setDirectSmelting(Chrome);
+ Garnierite.setDirectSmelting(Nickel);
+ Cobaltite.setDirectSmelting(Cobalt);
+ Stibnite.setDirectSmelting(Antimony);
+ Cooperite.setDirectSmelting(Platinum)
+ .add(SubTag.DONT_ADD_DEFAULT_BBF_RECIPE);
+ Molybdenite.setDirectSmelting(Molybdenum)
+ .add(SubTag.DONT_ADD_DEFAULT_BBF_RECIPE);
+ Galena.setDirectSmelting(Lead);
+ RoastedIron.setDirectSmelting(Iron);
+ RoastedAntimony.setDirectSmelting(Antimony);
+ RoastedLead.setDirectSmelting(Lead);
+ RoastedArsenic.setDirectSmelting(Arsenic);
+ RoastedCobalt.setDirectSmelting(Cobalt);
+ RoastedZinc.setDirectSmelting(Zinc);
+ RoastedNickel.setDirectSmelting(Nickel);
+ RoastedCopper.setDirectSmelting(Copper);
+ }
+
+ private static void setMultipliers() {
+ Amber.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ InfusedAir.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ InfusedFire.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ InfusedEarth.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ InfusedWater.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ InfusedEntropy.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ InfusedOrder.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ InfusedVis.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ InfusedDull.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ Salt.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ RockSalt.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ Scheelite.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ Tungstate.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ Cassiterite.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ CassiteriteSand.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ NetherQuartz.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ CertusQuartz.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ CertusQuartzCharged.setOreMultiplier(2)
+ .setSmeltingMultiplier(2);
+ TricalciumPhosphate.setOreMultiplier(3)
+ .setSmeltingMultiplier(3);
+ Saltpeter.setOreMultiplier(4)
+ .setSmeltingMultiplier(4);
+ Apatite.setOreMultiplier(4)
+ .setSmeltingMultiplier(4)
+ .setByProductMultiplier(2);
+ Electrotine.setOreMultiplier(5)
+ .setSmeltingMultiplier(5);
+ Teslatite.setOreMultiplier(5)
+ .setSmeltingMultiplier(5);
+ Redstone.setOreMultiplier(5)
+ .setSmeltingMultiplier(5);
+ Glowstone.setOreMultiplier(5)
+ .setSmeltingMultiplier(5);
+ Lapis.setOreMultiplier(6)
+ .setSmeltingMultiplier(6)
+ .setByProductMultiplier(4);
+ Sodalite.setOreMultiplier(6)
+ .setSmeltingMultiplier(6)
+ .setByProductMultiplier(4);
+ Lazurite.setOreMultiplier(6)
+ .setSmeltingMultiplier(6)
+ .setByProductMultiplier(4);
+ Monazite.setOreMultiplier(8)
+ .setSmeltingMultiplier(8)
+ .setByProductMultiplier(2);
+ Cryolite.setOreMultiplier(4)
+ .setByProductMultiplier(4);
+ }
+
+ private static void setEnchantmentKnockbackTools() {
+ Plastic.setEnchantmentForTools(Enchantment.knockback, 1);
+ PolyvinylChloride.setEnchantmentForTools(Enchantment.knockback, 1);
+ Polystyrene.setEnchantmentForTools(Enchantment.knockback, 1);
+ Rubber.setEnchantmentForTools(Enchantment.knockback, 2);
+ StyreneButadieneRubber.setEnchantmentForTools(Enchantment.knockback, 2);
+ InfusedAir.setEnchantmentForTools(Enchantment.knockback, 2);
+ }
+
+ private static void setEnchantmentFortuneTools() {
+ IronWood.setEnchantmentForTools(Enchantment.fortune, 1);
+ Steeleaf.setEnchantmentForTools(Enchantment.fortune, 2);
+ Mithril.setEnchantmentForTools(Enchantment.fortune, 3);
+ Vinteum.setEnchantmentForTools(Enchantment.fortune, 1);
+ Thaumium.setEnchantmentForTools(Enchantment.fortune, 2);
+ InfusedWater.setEnchantmentForTools(Enchantment.fortune, 3);
+ }
+
+ private static void setEnchantmentFireAspectTools() {
+ Flint.setEnchantmentForTools(Enchantment.fireAspect, 1);
+ DarkIron.setEnchantmentForTools(Enchantment.fireAspect, 2);
+ Firestone.setEnchantmentForTools(Enchantment.fireAspect, 3);
+ FierySteel.setEnchantmentForTools(Enchantment.fireAspect, 3);
+ Pyrotheum.setEnchantmentForTools(Enchantment.fireAspect, 3);
+ Blaze.setEnchantmentForTools(Enchantment.fireAspect, 3);
+ InfusedFire.setEnchantmentForTools(Enchantment.fireAspect, 3);
+ }
+
+ private static void setEnchantmentSilkTouchTools() {
+ Force.setEnchantmentForTools(Enchantment.silkTouch, 1);
+ Amber.setEnchantmentForTools(Enchantment.silkTouch, 1);
+ EnderPearl.setEnchantmentForTools(Enchantment.silkTouch, 1);
+ Enderium.setEnchantmentForTools(Enchantment.silkTouch, 1);
+ NetherStar.setEnchantmentForTools(Enchantment.silkTouch, 1);
+ InfusedOrder.setEnchantmentForTools(Enchantment.silkTouch, 1);
+ }
+
+ private static void setEnchantmentSmiteTools() {
+ BlackBronze.setEnchantmentForTools(Enchantment.smite, 2);
+ Gold.setEnchantmentForTools(Enchantment.smite, 3);
+ RoseGold.setEnchantmentForTools(Enchantment.smite, 4);
+ Platinum.setEnchantmentForTools(Enchantment.smite, 5);
+ InfusedVis.setEnchantmentForTools(Enchantment.smite, 5);
+ Ichorium.setEnchantmentForTools(Enchantment.smite, 8);
+ }
+
+ private static void setEnchantmentBaneOfArthropodsTools() {
+ Lead.setEnchantmentForTools(Enchantment.baneOfArthropods, 2);
+ Nickel.setEnchantmentForTools(Enchantment.baneOfArthropods, 2);
+ Invar.setEnchantmentForTools(Enchantment.baneOfArthropods, 3);
+ Antimony.setEnchantmentForTools(Enchantment.baneOfArthropods, 3);
+ BatteryAlloy.setEnchantmentForTools(Enchantment.baneOfArthropods, 4);
+ Bismuth.setEnchantmentForTools(Enchantment.baneOfArthropods, 4);
+ BismuthBronze.setEnchantmentForTools(Enchantment.baneOfArthropods, 5);
+ InfusedEarth.setEnchantmentForTools(Enchantment.baneOfArthropods, 5);
+ }
+
+ private static void setEnchantmentSharpnessTools() {
+ Iron.setEnchantmentForTools(Enchantment.sharpness, 1);
+ Bronze.setEnchantmentForTools(Enchantment.sharpness, 1);
+ Brass.setEnchantmentForTools(Enchantment.sharpness, 2);
+ HSLA.setEnchantmentForTools(Enchantment.sharpness, 2);
+ Steel.setEnchantmentForTools(Enchantment.sharpness, 2);
+ WroughtIron.setEnchantmentForTools(Enchantment.sharpness, 2);
+ StainlessSteel.setEnchantmentForTools(Enchantment.sharpness, 3);
+ Knightmetal.setEnchantmentForTools(Enchantment.sharpness, 3);
+ ShadowIron.setEnchantmentForTools(Enchantment.sharpness, 3);
+ ShadowSteel.setEnchantmentForTools(Enchantment.sharpness, 4);
+ BlackSteel.setEnchantmentForTools(Enchantment.sharpness, 4);
+ RedSteel.setEnchantmentForTools(Enchantment.sharpness, 4);
+ BlueSteel.setEnchantmentForTools(Enchantment.sharpness, 5);
+ DamascusSteel.setEnchantmentForTools(Enchantment.sharpness, 5);
+ InfusedEntropy.setEnchantmentForTools(Enchantment.sharpness, 5);
+ TungstenCarbide.setEnchantmentForTools(Enchantment.sharpness, 5);
+ HSSE.setEnchantmentForTools(Enchantment.sharpness, 5);
+ HSSG.setEnchantmentForTools(Enchantment.sharpness, 4);
+ HSSS.setEnchantmentForTools(Enchantment.sharpness, 5);
+ }
+
+ /**
+ * DO NOT ADD MORE THAN 1 TOOL AND ARMOR ENCHANTMENT PER MATERIAL! It will get overwritten!
+ */
+ private static void setEnchantments() {
+ setToolEnchantments();
+ setArmorEnchantments();
+ }
+
+ private static void setToolEnchantments() {
+ setEnchantmentKnockbackTools();
+ setEnchantmentFortuneTools();
+ setEnchantmentFireAspectTools();
+ setEnchantmentSilkTouchTools();
+ setEnchantmentSmiteTools();
+ setEnchantmentBaneOfArthropodsTools();
+ setEnchantmentSharpnessTools();
+ }
+
+ private static void setArmorEnchantments() {
+ InfusedAir.setEnchantmentForArmors(Enchantment.respiration, 3);
+
+ InfusedFire.setEnchantmentForArmors(Enchantment.featherFalling, 4);
+
+ Steeleaf.setEnchantmentForArmors(Enchantment.protection, 2);
+ Knightmetal.setEnchantmentForArmors(Enchantment.protection, 1);
+ InfusedEarth.setEnchantmentForArmors(Enchantment.protection, 4);
+
+ InfusedEntropy.setEnchantmentForArmors(Enchantment.thorns, 3);
+
+ InfusedWater.setEnchantmentForArmors(Enchantment.aquaAffinity, 1);
+ IronWood.setEnchantmentForArmors(Enchantment.aquaAffinity, 1);
+
+ InfusedOrder.setEnchantmentForArmors(Enchantment.projectileProtection, 4);
+
+ InfusedDull.setEnchantmentForArmors(Enchantment.blastProtection, 4);
+
+ InfusedVis.setEnchantmentForArmors(Enchantment.protection, 4);
+ }
+
+ private static void setMaceratingInto() {
+ Peanutwood.setMaceratingInto(Wood);
+ WoodSealed.setMaceratingInto(Wood);
+ NetherBrick.setMaceratingInto(Netherrack);
+ AnyRubber.setMaceratingInto(Rubber);
+ }
+
+ private static void setReRegistration() {
+ Iron.mOreReRegistrations.add(AnyIron);
+ PigIron.mOreReRegistrations.add(AnyIron);
+ WroughtIron.mOreReRegistrations.add(AnyIron);
+ Copper.mOreReRegistrations.add(AnyCopper);
+ AnnealedCopper.mOreReRegistrations.add(AnyCopper);
+ Bronze.mOreReRegistrations.add(AnyBronze);
+ Rubber.mOreReRegistrations.add(AnyRubber);
+ StyreneButadieneRubber.mOreReRegistrations.add(AnyRubber);
+ Silicone.mOreReRegistrations.add(AnyRubber);
+ StyreneButadieneRubber.mOreReRegistrations.add(AnySyntheticRubber);
+ Silicone.mOreReRegistrations.add(AnySyntheticRubber);
+ }
+
+ private static void setHeatDamage() {
+ FryingOilHot.setHeatDamage(1.0F);
+ Lava.setHeatDamage(3.0F);
+ Firestone.setHeatDamage(5.0F);
+ Pyrotheum.setHeatDamage(5.0F);
+ }
+
+ private static void setByProducts() {
+ Mytryl.addOreByProducts(Samarium, Samarium, Zinc, Zinc);
+ Rubracium.addOreByProducts(Samarium, Samarium, Samarium, Samarium);
+ Chalcopyrite.addOreByProducts(Pyrite, Cobalt, Cadmium, Gold);
+ Sphalerite.addOreByProducts(GarnetYellow, Cadmium, Gallium, Zinc);
+ MeteoricIron.addOreByProducts(Iron, Nickel, Iridium, Platinum);
+ GlauconiteSand.addOreByProducts(Sodium, Aluminiumoxide, Iron);
+ Glauconite.addOreByProducts(Sodium, Aluminiumoxide, Iron);
+ Vermiculite.addOreByProducts(Iron, Aluminiumoxide, Magnesium);
+ FullersEarth.addOreByProducts(Aluminiumoxide, SiliconDioxide, Magnesium);
+ Bentonite.addOreByProducts(Aluminiumoxide, Calcium, Magnesium);
+ Uraninite.addOreByProducts(Uranium, Thorium, Uranium235);
+ Pitchblende.addOreByProducts(Thorium, Uranium, Lead);
+ Galena.addOreByProducts(Sulfur, Silver, Lead);
+ Lapis.addOreByProducts(Lazurite, Sodalite, Pyrite);
+ Pyrite.addOreByProducts(Sulfur, TricalciumPhosphate, Iron);
+ Copper.addOreByProducts(Cobalt, Gold, Nickel);
+ Nickel.addOreByProducts(Cobalt, Platinum, Iron);
+ GarnetRed.addOreByProducts(Spessartine, Pyrope, Almandine);
+ GarnetYellow.addOreByProducts(Andradite, Grossular, Uvarovite);
+ Cooperite.addOreByProducts(Palladium, Nickel, Iridium);
+ Cinnabar.addOreByProducts(Redstone, Sulfur, Glowstone);
+ Tantalite.addOreByProducts(Manganese, Niobium, Tantalum);
+ Pollucite.addOreByProducts(Caesium, Aluminiumoxide, Rubidium);
+ Chrysotile.addOreByProducts(Asbestos, SiliconDioxide, Magnesium);
+ Asbestos.addOreByProducts(Asbestos, SiliconDioxide, Magnesium);
+ Pentlandite.addOreByProducts(Iron, Sulfur, Cobalt);
+ Uranium.addOreByProducts(Lead, Uranium235, Thorium);
+ Scheelite.addOreByProducts(Manganese, Molybdenum, Calcium);
+ Tungstate.addOreByProducts(Manganese, Silver, Lithium);
+ Bauxite.addOreByProducts(Grossular, Rutile, Gallium);
+ QuartzSand.addOreByProducts(CertusQuartz, Quartzite, Barite);
+ Redstone.addOreByProducts(Cinnabar, RareEarth, Glowstone);
+ Monazite.addOreByProducts(Thorium, Neodymium, RareEarth);
+ Forcicium.addOreByProducts(Thorium, Neodymium, RareEarth);
+ Forcillium.addOreByProducts(Thorium, Neodymium, RareEarth);
+ Malachite.addOreByProducts(Copper, BrownLimonite, Calcite);
+ YellowLimonite.addOreByProducts(Nickel, BrownLimonite, Cobalt);
+ Lepidolite.addOreByProducts(Lithium, Caesium);
+ Andradite.addOreByProducts(GarnetYellow, Iron);
+ Pyrolusite.addOreByProducts(Manganese, Tantalite, Niobium)
+ .add(SubTag.DONT_ADD_DEFAULT_BBF_RECIPE);
+ TricalciumPhosphate.addOreByProducts(Apatite, Phosphate, Pyrochlore);
+ Apatite.addOreByProducts(TricalciumPhosphate, Phosphate, Pyrochlore);
+ Pyrochlore.addOreByProducts(Apatite, Calcite, Niobium);
+ Quartzite.addOreByProducts(CertusQuartz, Barite);
+ CertusQuartz.addOreByProducts(Quartzite, Barite);
+ CertusQuartzCharged.addOreByProducts(CertusQuartz, Quartzite, Barite);
+ BrownLimonite.addOreByProducts(Malachite, YellowLimonite);
+ Neodymium.addOreByProducts(Monazite, RareEarth);
+ Bastnasite.addOreByProducts(Neodymium, RareEarth);
+ Glowstone.addOreByProducts(Redstone, Gold);
+ Zinc.addOreByProducts(Tin, Gallium);
+ Tungsten.addOreByProducts(Manganese, Molybdenum);
+ Diatomite.addOreByProducts(BandedIron, Sapphire);
+ Iron.addOreByProducts(Nickel, Tin);
+ Gold.addOreByProducts(Copper, Nickel);
+ Tin.addOreByProducts(Iron, Zinc);
+ Antimony.addOreByProducts(Zinc, Iron);
+ Silver.addOreByProducts(Lead, Sulfur);
+ Lead.addOreByProducts(Silver, Sulfur);
+ Thorium.addOreByProducts(Uranium, Lead);
+ Plutonium.addOreByProducts(Uranium, Lead);
+ Electrum.addOreByProducts(Gold, Silver);
+ Electrotine.addOreByProducts(Redstone, Electrum);
+ Bronze.addOreByProducts(Copper, Tin);
+ Brass.addOreByProducts(Copper, Zinc);
+ Coal.addOreByProducts(Lignite, Thorium);
+ Ilmenite.addOreByProducts(Iron, Rutile);
+ Manganese.addOreByProducts(Chrome, Iron);
+ Sapphire.addOreByProducts(Aluminiumoxide, GreenSapphire);
+ GreenSapphire.addOreByProducts(Aluminiumoxide, Sapphire);
+ Platinum.addOreByProducts(Nickel, Iridium);
+ Emerald.addOreByProducts(Beryllium, Aluminiumoxide);
+ Olivine.addOreByProducts(Pyrope, Magnesium);
+ Chrome.addOreByProducts(Iron, Magnesium);
+ Chromite.addOreByProducts(Iron, Magnesium);
+ Tetrahedrite.addOreByProducts(Antimony, Zinc);
+ GarnetSand.addOreByProducts(GarnetRed, GarnetYellow);
+ Magnetite.addOreByProducts(Iron, Gold);
+ GraniticMineralSand.addOreByProducts(GraniteBlack, Magnetite);
+ BasalticMineralSand.addOreByProducts(Basalt, Magnetite);
+ Basalt.addOreByProducts(Olivine, DarkAsh);
+ VanadiumMagnetite.addOreByProducts(Magnetite, Vanadium);
+ Lazurite.addOreByProducts(Sodalite, Lapis);
+ Sodalite.addOreByProducts(Lazurite, Lapis);
+ Spodumene.addOreByProducts(Aluminiumoxide, Lithium);
+ Ruby.addOreByProducts(Chrome, GarnetRed);
+ Iridium.addOreByProducts(Platinum, Osmium);
+ Pyrope.addOreByProducts(GarnetRed, Magnesium);
+ Almandine.addOreByProducts(GarnetRed, Aluminiumoxide);
+ Spessartine.addOreByProducts(GarnetRed, Manganese);
+ Grossular.addOreByProducts(GarnetYellow, Calcium);
+ Uvarovite.addOreByProducts(GarnetYellow, Chrome);
+ Calcite.addOreByProducts(Andradite, Malachite);
+ NaquadahEnriched.addOreByProducts(Naquadah, Naquadria);
+ Salt.addOreByProducts(RockSalt, Borax);
+ RockSalt.addOreByProducts(Salt, Borax);
+ Naquadah.addOreByProducts(NaquadahEnriched);
+ Molybdenite.addOreByProducts(Molybdenum);
+ Stibnite.addOreByProducts(Antimony);
+ Garnierite.addOreByProducts(Nickel);
+ Lignite.addOreByProducts(Coal);
+ Diamond.addOreByProducts(Graphite);
+ Beryllium.addOreByProducts(Emerald);
+ Electrotine.addOreByProducts(Diamond);
+ Teslatite.addOreByProducts(Diamond);
+ Magnesite.addOreByProducts(Magnesium);
+ NetherQuartz.addOreByProducts(Netherrack);
+ PigIron.addOreByProducts(Iron);
+ DeepIron.addOreByProducts(Trinium, Iron, Trinium);
+ ShadowIron.addOreByProducts(Iron);
+ DarkIron.addOreByProducts(Iron);
+ MeteoricIron.addOreByProducts(Iron);
+ Steel.addOreByProducts(Iron);
+ HSLA.addOreByProducts(Iron);
+ Mithril.addOreByProducts(Platinum);
+ AstralSilver.addOreByProducts(Silver);
+ Graphite.addOreByProducts(Carbon);
+ Netherrack.addOreByProducts(Sulfur);
+ Flint.addOreByProducts(Obsidian);
+ Cobaltite.addOreByProducts(Cobalt);
+ Cobalt.addOreByProducts(Cobaltite);
+ Sulfur.addOreByProducts(Sulfur);
+ Saltpeter.addOreByProducts(Saltpeter);
+ Endstone.addOreByProducts(Helium_3);
+ Osmium.addOreByProducts(Iridium);
+ Magnesium.addOreByProducts(Olivine);
+ Aluminium.addOreByProducts(Bauxite);
+ Titanium.addOreByProducts(Almandine);
+ Obsidian.addOreByProducts(Olivine);
+ Ash.addOreByProducts(Carbon);
+ DarkAsh.addOreByProducts(Carbon);
+ Redrock.addOreByProducts(Clay);
+ Marble.addOreByProducts(Calcite);
+ Clay.addOreByProducts(Clay);
+ Cassiterite.addOreByProducts(Tin);
+ CassiteriteSand.addOreByProducts(Tin);
+ GraniteBlack.addOreByProducts(Biotite);
+ GraniteRed.addOreByProducts(PotassiumFeldspar);
+ Phosphate.addOreByProducts(Phosphorus);
+ Phosphorus.addOreByProducts(Phosphate);
+ Tanzanite.addOreByProducts(Opal);
+ Opal.addOreByProducts(Tanzanite);
+ Amethyst.addOreByProducts(Amethyst);
+ FoolsRuby.addOreByProducts(Jasper);
+ Amber.addOreByProducts(Amber);
+ Topaz.addOreByProducts(BlueTopaz);
+ BlueTopaz.addOreByProducts(Topaz);
+ Niter.addOreByProducts(Saltpeter);
+ Vinteum.addOreByProducts(Vinteum);
+ Force.addOreByProducts(Force);
+ Dilithium.addOreByProducts(Dilithium);
+ Neutronium.addOreByProducts(Neutronium);
+ Lithium.addOreByProducts(Lithium);
+ Silicon.addOreByProducts(SiliconDioxide);
+ InfusedGold.addOreByProduct(Gold);
+ Cryolite.addOreByProducts(Aluminiumoxide, Sodium);
+ Naquadria.addOreByProduct(Naquadria);
+ RoastedNickel.addOreByProduct(Nickel);
+ TengamRaw.addOreByProducts(NeodymiumMagnetic, SamariumMagnetic);
+ }
+
+ private static void setColors() {
+ Naquadah.mMoltenRGBa[0] = 0;
+ Naquadah.mMoltenRGBa[1] = 255;
+ Naquadah.mMoltenRGBa[2] = 0;
+ Naquadah.mMoltenRGBa[3] = 0;
+ NaquadahEnriched.mMoltenRGBa[0] = 64;
+ NaquadahEnriched.mMoltenRGBa[1] = 255;
+ NaquadahEnriched.mMoltenRGBa[2] = 64;
+ NaquadahEnriched.mMoltenRGBa[3] = 0;
+ Naquadria.mMoltenRGBa[0] = 128;
+ Naquadria.mMoltenRGBa[1] = 255;
+ Naquadria.mMoltenRGBa[2] = 128;
+ Naquadria.mMoltenRGBa[3] = 0;
+ }
+
+ private static void overrideChemicalFormulars() {
+ Glue.mChemicalFormula = "No Horses were harmed for the Production";
+ AdvancedGlue.mChemicalFormula = "A chemically approved glue!";
+ UUAmplifier.mChemicalFormula = "Accelerates the Mass Fabricator";
+ LiveRoot.mChemicalFormula = "";
+ WoodSealed.mChemicalFormula = "";
+ Wood.mChemicalFormula = "";
+ Electrotine.mChemicalFormula = "Rp";
+ Trinium.mChemicalFormula = "Ke";
+ Naquadah.mChemicalFormula = "Nq";
+ NaquadahEnriched.mChemicalFormula = "Nq+";
+ Naquadria.mChemicalFormula = "Nq*";
+ NaquadahAlloy.mChemicalFormula = "Nq\u2082KeC";
+ Sunnarium.mChemicalFormula = "Su";
+ Adamantium.mChemicalFormula = "Ad";
+ InfusedGold.mChemicalFormula = "AuMa*";
+ MeteoricIron.mChemicalFormula = "SpFe";
+ MeteoricSteel.mChemicalFormula = "SpFe\u2085\u2080C";
+ Duranium.mChemicalFormula = "Du";
+ Tritanium.mChemicalFormula = "Tn";
+ Ardite.mChemicalFormula = "Ai";
+ Manyullyn.mChemicalFormula = "AiCo";
+ Mytryl.mChemicalFormula = "SpPt\u2082FeMa";
+ BlackPlutonium.mChemicalFormula = "SpPu";
+ Ledox.mChemicalFormula = "SpPb";
+ CallistoIce.mChemicalFormula = "SpH\u2082O";
+ Quantium.mChemicalFormula = "Qt";
+ Desh.mChemicalFormula = "De";
+ Oriharukon.mChemicalFormula = "Oh";
+ Draconium.mChemicalFormula = "D";
+ DraconiumAwakened.mChemicalFormula = "D*";
+ BlueAlloy.mChemicalFormula = "AgRp\u2084";
+ RedAlloy.mChemicalFormula = "Cu(" + Redstone.mChemicalFormula + ")\u2084";
+ AnyIron.mChemicalFormula = "Fe";
+ AnyCopper.mChemicalFormula = "Cu";
+ ElectrumFlux.mChemicalFormula = "The formula is too long...";
+ DeepIron.mChemicalFormula = "Sp\u2082Fe";
+ Ichorium.mChemicalFormula = "IcMa";
+ Infinity.mChemicalFormula = "If*";
+ InfinityCatalyst.mChemicalFormula = "If";
+ CosmicNeutronium.mChemicalFormula = "SpNt";
+ Aluminiumhydroxide.mChemicalFormula = "Al\u0028OH\u0029\u2083";
+ MaterialsKevlar.LiquidCrystalKevlar.mChemicalFormula = "[-CO-C\u2086H\u2084-CO-NH-C\u2086H\u2084-NH-]n";
+ MaterialsKevlar.RhodiumChloride.mChemicalFormula = "RhCl\u2083";
+ MaterialsKevlar.OrganorhodiumCatalyst.mChemicalFormula = "RhHCO(P(C\u2086H\u2085)\u2083)\u2083";
+ MaterialsKevlar.CobaltIINitrate.mChemicalFormula = "Co(NO\u2083)\u2082";
+ MaterialsKevlar.CobaltIIHydroxide.mChemicalFormula = "Co(OH)\u2082";
+ SiliconSG.mChemicalFormula = "Si*";
+ NetherQuartz.mChemicalFormula = "SiO\u2082";
+ Quartzite.mChemicalFormula = "SiO\u2082";
+ CertusQuartz.mChemicalFormula = "SiO\u2082";
+ CertusQuartzCharged.mChemicalFormula = "SiO\u2082";
+ MaterialsUEVplus.SpaceTime.mChemicalFormula = "Reality itself distilled into physical form";
+ MaterialsUEVplus.Universium.mChemicalFormula = "A tear into the space beyond space";
+ MaterialsUEVplus.Eternity.mChemicalFormula = "En\u29BC";
+ MaterialsUEVplus.MagMatter.mChemicalFormula = "M\u238B";
+ Longasssuperconductornameforuvwire.mChemicalFormula = "Nq*\u2084(Ir\u2083Os)\u2083EuSm";
+ Longasssuperconductornameforuhvwire.mChemicalFormula = "D\u2086(SpNt)\u2087Tn\u2085Am\u2086";
+ SuperconductorUEVBase.mChemicalFormula = "D*\u2085If*\u2085(\u2726\u25C6\u2726)(\u26B7\u2699\u26B7 Ni4Ti6)";
+ SuperconductorUIVBase.mChemicalFormula = "(C\u2081\u2084Os\u2081\u2081O\u2087Ag\u2083SpH\u2082O)\u2084?\u2081\u2080(Fs\u26B6)\u2086(\u2318\u262F\u262F\u2318)\u2085";
+ SuperconductorUMVBase.mChemicalFormula = "?\u2086Or\u2083(Hy\u26B6)\u2081\u2081(((CW)\u2087Ti\u2083)\u2083???)\u2085\u06DE\u2082";
+ Diatomite.mChemicalFormula = "(SiO\u2082)\u2088Fe\u2082O\u2083(Al\u2082O\u2083)";
+ EnrichedHolmium.mChemicalFormula = "Nq+\u2088Ho\u2082";
+ Grade1PurifiedWater.mChemicalFormula = "H\u2082O";
+ Grade2PurifiedWater.mChemicalFormula = "H\u2082O";
+ Grade3PurifiedWater.mChemicalFormula = "H\u2082O";
+ Grade4PurifiedWater.mChemicalFormula = "H\u2082O";
+ Grade5PurifiedWater.mChemicalFormula = "H\u2082O";
+ Grade6PurifiedWater.mChemicalFormula = "H\u2082O";
+ Grade7PurifiedWater.mChemicalFormula = "H\u2082O";
+ Grade8PurifiedWater.mChemicalFormula = "H\u2082O";
+ TengamRaw.mChemicalFormula = "";
+ TengamPurified.mChemicalFormula = "M";
+ TengamAttuned.mChemicalFormula = "M";
+ MaterialsUEVplus.ExcitedDTSC.mChemicalFormula = "[-Stellar-Stellar-]";
+ MaterialsUEVplus.DimensionallyTranscendentStellarCatalyst.mChemicalFormula = "Stellar";
+ }
+
+ private static void initSubTags() {
+ SubTag.ELECTROMAGNETIC_SEPERATION_NEODYMIUM.addTo(Bastnasite, Monazite, Forcicium, Forcillium);
+
+ SubTag.ELECTROMAGNETIC_SEPERATION_GOLD
+ .addTo(Magnetite, VanadiumMagnetite, BasalticMineralSand, GraniticMineralSand);
+
+ SubTag.NO_RECIPES.addTo(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+
+ SubTag.ELECTROMAGNETIC_SEPERATION_IRON.addTo(
+ YellowLimonite,
+ BrownLimonite,
+ Pyrite,
+ BandedIron,
+ Nickel,
+ Vermiculite,
+ Glauconite,
+ GlauconiteSand,
+ Pentlandite,
+ Tin,
+ Antimony,
+ Ilmenite,
+ Manganese,
+ Chrome,
+ Chromite,
+ Andradite);
+
+ SubTag.BLASTFURNACE_CALCITE_DOUBLE
+ .addTo(Pyrite, BrownLimonite, YellowLimonite, BasalticMineralSand, GraniticMineralSand, Magnetite);
+
+ SubTag.BLASTFURNACE_CALCITE_TRIPLE.addTo(Iron, PigIron, DeepIron, ShadowIron, WroughtIron, MeteoricIron);
+
+ SubTag.WASHING_MERCURY.addTo(Gold, Osmium, Mithril, Platinum, Cooperite, AstralSilver);
+
+ SubTag.WASHING_MERCURY_99_PERCENT.addTo(Silver);
+
+ SubTag.WASHING_SODIUMPERSULFATE.addTo(Zinc, Nickel, Copper, Cobalt, Cobaltite, Tetrahedrite);
+ SubTag.METAL.addTo(
+ AnyIron,
+ AnyCopper,
+ AnyBronze,
+ Metal,
+ Aluminium,
+ Americium,
+ Antimony,
+ Beryllium,
+ Bismuth,
+ Caesium,
+ Cerium,
+ Chrome,
+ Cobalt,
+ Copper,
+ Dysprosium,
+ Erbium,
+ Europium,
+ Gadolinium,
+ Gallium,
+ Gold,
+ Holmium,
+ Indium,
+ Iridium,
+ Iron,
+ Lanthanum,
+ Lead,
+ Lutetium,
+ Magnesium,
+ Manganese,
+ Mercury,
+ Niobium,
+ Molybdenum,
+ Neodymium,
+ Neutronium,
+ Nickel,
+ Osmium,
+ Palladium,
+ Platinum,
+ Plutonium,
+ Plutonium241,
+ Praseodymium,
+ Promethium,
+ Rubidium,
+ Samarium,
+ Scandium,
+ Silicon,
+ Silver,
+ Tantalum,
+ Tellurium,
+ Terbium,
+ Thorium,
+ Thulium,
+ Tin,
+ Titanium,
+ Tungsten,
+ Uranium,
+ Uranium235,
+ Vanadium,
+ Ytterbium,
+ Yttrium,
+ Zinc,
+ Flerovium,
+ PhasedIron,
+ PhasedGold,
+ DarkSteel,
+ TinAlloy,
+ ConductiveIron,
+ ElectricalSteel,
+ EnergeticAlloy,
+ VibrantAlloy,
+ MelodicAlloy,
+ StellarAlloy,
+ VividAlloy,
+ EnergeticSilver,
+ CrystallinePinkSlime,
+ CrystallineAlloy,
+ CrudeSteel,
+ EndSteel,
+ PulsatingIron,
+ DarkThaumium,
+ Adamantium,
+ Amordrine,
+ Angmallen,
+ Ardite,
+ Aredrite,
+ Atlarus,
+ Carmot,
+ Celenegil,
+ Ceruclase,
+ DarkIron,
+ Desh,
+ Desichalkos,
+ Duranium,
+ ElectrumFlux,
+ Enderium,
+ EnderiumBase,
+ Eximite,
+ FierySteel,
+ Force,
+ Haderoth,
+ Hematite,
+ Hepatizon,
+ HSLA,
+ Infuscolium,
+ InfusedGold,
+ Inolashite,
+ Mercassium,
+ MeteoricIron,
+ BloodInfusedIron,
+ MaterialsUEVplus.Universium,
+ MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter,
+ MeteoricSteel,
+ Naquadah,
+ NaquadahAlloy,
+ NaquadahEnriched,
+ Naquadria,
+ ObsidianFlux,
+ Orichalcum,
+ Osmonium,
+ Oureclase,
+ Phoenixite,
+ Prometheum,
+ Sanguinite,
+ CosmicNeutronium,
+ Tartarite,
+ Ichorium,
+ Tritanium,
+ Vulcanite,
+ Vyroxeres,
+ Yellorium,
+ Zectium,
+ AluminiumBrass,
+ Osmiridium,
+ Sunnarium,
+ AnnealedCopper,
+ BatteryAlloy,
+ Brass,
+ Bronze,
+ ChromiumDioxide,
+ Cupronickel,
+ DeepIron,
+ Electrum,
+ Invar,
+ Kanthal,
+ Magnalium,
+ Nichrome,
+ NiobiumNitride,
+ NiobiumTitanium,
+ PigIron,
+ SolderingAlloy,
+ StainlessSteel,
+ Steel,
+ Ultimet,
+ VanadiumGallium,
+ WroughtIron,
+ YttriumBariumCuprate,
+ IronWood,
+ Alumite,
+ Manyullyn,
+ ShadowIron,
+ Shadow,
+ ShadowSteel,
+ Steeleaf,
+ SterlingSilver,
+ RoseGold,
+ BlackBronze,
+ BismuthBronze,
+ BlackSteel,
+ RedSteel,
+ BlueSteel,
+ DamascusSteel,
+ TungstenSteel,
+ TPV,
+ AstralSilver,
+ Mithril,
+ BlueAlloy,
+ RedAlloy,
+ CobaltBrass,
+ Thaumium,
+ Void,
+ IronMagnetic,
+ SteelMagnetic,
+ NeodymiumMagnetic,
+ SamariumMagnetic,
+ Knightmetal,
+ HSSG,
+ HSSE,
+ HSSS,
+ TungstenCarbide,
+ HeeEndium,
+ VanadiumSteel,
+ Kalendrite,
+ Ignatius,
+ Trinium,
+ Infinity,
+ InfinityCatalyst,
+ Realgar,
+ Chrysotile,
+ BlackPlutonium,
+ Alduorite,
+ Adluorite,
+ Vinteum,
+ Rubracium,
+ Draconium,
+ DraconiumAwakened,
+ Pentacadmiummagnesiumhexaoxid,
+ Titaniumonabariumdecacoppereikosaoxid,
+ Uraniumtriplatinid,
+ Vanadiumtriindinid,
+ Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid,
+ Tetranaquadahdiindiumhexaplatiumosminid,
+ Longasssuperconductornameforuvwire,
+ Longasssuperconductornameforuhvwire,
+ SuperconductorUEVBase,
+ SuperconductorUIVBase,
+ SuperconductorUMVBase,
+ Quantium,
+ RedstoneAlloy,
+ Bedrockium,
+ EnrichedHolmium,
+ TengamPurified,
+ TengamAttuned,
+ MaterialsUEVplus.Eternity,
+ MaterialsUEVplus.MagMatter);
+
+ SubTag.FOOD.addTo(
+ MeatRaw,
+ MeatCooked,
+ Ice,
+ Water,
+ Salt,
+ Chili,
+ Cocoa,
+ Cheese,
+ Coffee,
+ Chocolate,
+ Milk,
+ Honey,
+ FryingOilHot,
+ FishOil,
+ SeedOil,
+ SeedOilLin,
+ SeedOilHemp,
+ Wheat,
+ Sugar,
+ FreshWater);
+
+ Wood.add(SubTag.WOOD, SubTag.FLAMMABLE, SubTag.NO_SMELTING, SubTag.NO_SMASHING);
+ WoodSealed.add(SubTag.WOOD, SubTag.FLAMMABLE, SubTag.NO_SMELTING, SubTag.NO_SMASHING, SubTag.NO_WORKING);
+ Peanutwood.add(SubTag.WOOD, SubTag.FLAMMABLE, SubTag.NO_SMELTING, SubTag.NO_SMASHING);
+ LiveRoot.add(
+ SubTag.WOOD,
+ SubTag.FLAMMABLE,
+ SubTag.NO_SMELTING,
+ SubTag.NO_SMASHING,
+ SubTag.MAGICAL,
+ SubTag.MORTAR_GRINDABLE);
+ IronWood.add(SubTag.WOOD, SubTag.FLAMMABLE, SubTag.MAGICAL, SubTag.MORTAR_GRINDABLE);
+ Steeleaf.add(SubTag.WOOD, SubTag.FLAMMABLE, SubTag.MAGICAL, SubTag.MORTAR_GRINDABLE, SubTag.NO_SMELTING);
+
+ MeatRaw.add(SubTag.NO_SMASHING);
+ MeatCooked.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Snow.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.NO_RECYCLING);
+ Ice.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.NO_RECYCLING);
+ Water.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.NO_RECYCLING);
+ Sulfur.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.FLAMMABLE);
+ Saltpeter.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.FLAMMABLE);
+ Graphite.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.FLAMMABLE, SubTag.NO_SMELTING);
+
+ Wheat.add(SubTag.FLAMMABLE, SubTag.MORTAR_GRINDABLE);
+ Paper.add(SubTag.FLAMMABLE, SubTag.NO_SMELTING, SubTag.NO_SMASHING, SubTag.MORTAR_GRINDABLE, SubTag.PAPER);
+ Coal.add(SubTag.FLAMMABLE, SubTag.NO_SMELTING, SubTag.NO_SMASHING, SubTag.MORTAR_GRINDABLE);
+ Charcoal.add(SubTag.FLAMMABLE, SubTag.NO_SMELTING, SubTag.NO_SMASHING, SubTag.MORTAR_GRINDABLE);
+ Lignite.add(SubTag.FLAMMABLE, SubTag.NO_SMELTING, SubTag.NO_SMASHING, SubTag.MORTAR_GRINDABLE);
+
+ Rubber.add(SubTag.FLAMMABLE, SubTag.NO_SMASHING, SubTag.BOUNCY, SubTag.STRETCHY);
+ StyreneButadieneRubber.add(SubTag.FLAMMABLE, SubTag.NO_SMASHING, SubTag.BOUNCY, SubTag.STRETCHY);
+ Plastic.add(SubTag.FLAMMABLE, SubTag.NO_SMASHING, SubTag.BOUNCY, SubTag.STRETCHY);
+ PolyvinylChloride.add(SubTag.FLAMMABLE, SubTag.NO_SMASHING, SubTag.BOUNCY, SubTag.STRETCHY);
+ Polystyrene.add(SubTag.FLAMMABLE, SubTag.NO_SMASHING, SubTag.BOUNCY, SubTag.STRETCHY);
+ Silicone.add(SubTag.FLAMMABLE, SubTag.NO_SMASHING, SubTag.BOUNCY, SubTag.STRETCHY);
+ Polytetrafluoroethylene.add(SubTag.FLAMMABLE, SubTag.NO_SMASHING, SubTag.STRETCHY);
+ Polybenzimidazole.add(SubTag.FLAMMABLE, SubTag.NO_SMASHING, SubTag.STRETCHY);
+ PolyphenyleneSulfide.add(SubTag.FLAMMABLE, SubTag.NO_SMASHING, SubTag.STRETCHY);
+ MaterialsKevlar.Kevlar.add(SubTag.FLAMMABLE, SubTag.NO_SMASHING, SubTag.STRETCHY);
+
+ TNT.add(SubTag.FLAMMABLE, SubTag.EXPLOSIVE, SubTag.NO_SMELTING, SubTag.NO_SMASHING);
+ Gunpowder.add(SubTag.FLAMMABLE, SubTag.EXPLOSIVE, SubTag.NO_SMELTING, SubTag.NO_SMASHING);
+ Glyceryl.add(SubTag.FLAMMABLE, SubTag.EXPLOSIVE, SubTag.NO_SMELTING, SubTag.NO_SMASHING);
+ NitroCoalFuel.add(SubTag.FLAMMABLE, SubTag.EXPLOSIVE, SubTag.NO_SMELTING, SubTag.NO_SMASHING);
+ NitroFuel.add(SubTag.FLAMMABLE, SubTag.EXPLOSIVE, SubTag.NO_SMELTING, SubTag.NO_SMASHING);
+ NitroCarbon.add(SubTag.FLAMMABLE, SubTag.EXPLOSIVE, SubTag.NO_SMELTING, SubTag.NO_SMASHING);
+
+ Lead.add(SubTag.MORTAR_GRINDABLE, SubTag.SOLDERING_MATERIAL, SubTag.SOLDERING_MATERIAL_BAD);
+ Tin.add(SubTag.MORTAR_GRINDABLE, SubTag.SOLDERING_MATERIAL);
+ SolderingAlloy.add(SubTag.MORTAR_GRINDABLE, SubTag.SOLDERING_MATERIAL, SubTag.SOLDERING_MATERIAL_GOOD);
+
+ Cheese.add(SubTag.SMELTING_TO_FLUID);
+ Sugar.add(SubTag.SMELTING_TO_FLUID);
+
+ Concrete.add(SubTag.STONE, SubTag.NO_SMASHING, SubTag.SMELTING_TO_FLUID);
+ ConstructionFoam.add(SubTag.STONE, SubTag.NO_SMASHING, SubTag.EXPLOSIVE, SubTag.NO_SMELTING);
+ ReinforceGlass.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.SMELTING_TO_FLUID);
+ Redstone.add(
+ SubTag.STONE,
+ SubTag.NO_SMASHING,
+ SubTag.UNBURNABLE,
+ SubTag.SMELTING_TO_FLUID,
+ SubTag.PULVERIZING_CINNABAR);
+ Glowstone.add(SubTag.STONE, SubTag.NO_SMASHING, SubTag.UNBURNABLE, SubTag.SMELTING_TO_FLUID);
+ Electrotine.add(SubTag.STONE, SubTag.NO_SMASHING, SubTag.UNBURNABLE, SubTag.SMELTING_TO_FLUID);
+ Teslatite.add(SubTag.STONE, SubTag.NO_SMASHING, SubTag.UNBURNABLE, SubTag.SMELTING_TO_FLUID);
+ Netherrack.add(SubTag.STONE, SubTag.NO_SMASHING, SubTag.UNBURNABLE, SubTag.FLAMMABLE);
+ Stone.add(SubTag.STONE, SubTag.NO_SMASHING, SubTag.NO_RECYCLING);
+ Brick.add(SubTag.STONE, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ NetherBrick.add(SubTag.STONE, SubTag.NO_SMASHING);
+ Endstone.add(SubTag.STONE, SubTag.NO_SMASHING);
+ Marble.add(SubTag.STONE, SubTag.NO_SMASHING);
+ Basalt.add(SubTag.STONE, SubTag.NO_SMASHING);
+ Redrock.add(SubTag.STONE, SubTag.NO_SMASHING);
+ Obsidian.add(SubTag.STONE, SubTag.NO_SMASHING);
+ Flint.add(SubTag.STONE, SubTag.NO_SMASHING, SubTag.MORTAR_GRINDABLE);
+ GraniteRed.add(SubTag.STONE, SubTag.NO_SMASHING);
+ GraniteBlack.add(SubTag.STONE, SubTag.NO_SMASHING);
+ Salt.add(SubTag.STONE, SubTag.NO_SMASHING);
+ RockSalt.add(SubTag.STONE, SubTag.NO_SMASHING);
+
+ Sand.add(SubTag.NO_RECYCLING);
+
+ Gold.add(SubTag.MORTAR_GRINDABLE);
+ Silver.add(SubTag.MORTAR_GRINDABLE);
+ Iron.add(SubTag.MORTAR_GRINDABLE);
+ IronMagnetic.add(SubTag.MORTAR_GRINDABLE);
+ HSLA.add(SubTag.MORTAR_GRINDABLE);
+ Steel.add(SubTag.MORTAR_GRINDABLE);
+ SteelMagnetic.add(SubTag.MORTAR_GRINDABLE);
+ Zinc.add(SubTag.MORTAR_GRINDABLE);
+ Antimony.add(SubTag.MORTAR_GRINDABLE);
+ Copper.add(SubTag.MORTAR_GRINDABLE);
+ AnnealedCopper.add(SubTag.MORTAR_GRINDABLE);
+ Bronze.add(SubTag.MORTAR_GRINDABLE);
+ Nickel.add(SubTag.MORTAR_GRINDABLE);
+ Invar.add(SubTag.MORTAR_GRINDABLE);
+ Brass.add(SubTag.MORTAR_GRINDABLE);
+ WroughtIron.add(SubTag.MORTAR_GRINDABLE);
+ Electrum.add(SubTag.MORTAR_GRINDABLE);
+ Clay.add(SubTag.MORTAR_GRINDABLE);
+
+ Glass.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_RECYCLING, SubTag.SMELTING_TO_FLUID);
+ Diamond.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.FLAMMABLE);
+ Emerald.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Amethyst.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Tanzanite.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Topaz.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ BlueTopaz.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Amber.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ GreenSapphire.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Sapphire.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Ruby.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ FoolsRuby.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Opal.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Olivine.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Jasper.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ GarnetRed.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ GarnetYellow.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Mimichite.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ CrystalFlux.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Crystal.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Niter.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Apatite.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE);
+ Lapis.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE);
+ Sodalite.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE);
+ Lazurite.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE);
+ Monazite.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE);
+ Quartzite.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE, SubTag.QUARTZ);
+ Quartz.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE, SubTag.QUARTZ);
+ SiliconDioxide
+ .add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE, SubTag.QUARTZ);
+ Dilithium.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE, SubTag.QUARTZ);
+ NetherQuartz.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE, SubTag.QUARTZ);
+ CertusQuartz.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE, SubTag.QUARTZ);
+ CertusQuartzCharged
+ .add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE, SubTag.QUARTZ);
+ Fluix.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE, SubTag.QUARTZ);
+ TricalciumPhosphate
+ .add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.FLAMMABLE, SubTag.EXPLOSIVE);
+ Phosphate.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.FLAMMABLE, SubTag.EXPLOSIVE);
+ InfusedAir.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.MAGICAL, SubTag.UNBURNABLE);
+ InfusedFire.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.MAGICAL, SubTag.UNBURNABLE);
+ InfusedEarth.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.MAGICAL, SubTag.UNBURNABLE);
+ InfusedWater.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.MAGICAL, SubTag.UNBURNABLE);
+ InfusedEntropy.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.MAGICAL, SubTag.UNBURNABLE);
+ InfusedOrder.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.MAGICAL, SubTag.UNBURNABLE);
+ InfusedVis.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.MAGICAL, SubTag.UNBURNABLE);
+ InfusedDull.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.MAGICAL, SubTag.UNBURNABLE);
+ NetherStar.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.MAGICAL, SubTag.UNBURNABLE);
+ EnderPearl.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.MAGICAL, SubTag.PEARL);
+ EnderEye.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.MAGICAL, SubTag.PEARL);
+ Firestone.add(
+ SubTag.CRYSTAL,
+ SubTag.NO_SMASHING,
+ SubTag.NO_SMELTING,
+ SubTag.CRYSTALLISABLE,
+ SubTag.MAGICAL,
+ SubTag.QUARTZ,
+ SubTag.UNBURNABLE,
+ SubTag.BURNING);
+ Forcicium.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE, SubTag.MAGICAL);
+ Forcillium.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING, SubTag.CRYSTALLISABLE, SubTag.MAGICAL);
+ Force.add(SubTag.CRYSTAL, SubTag.MAGICAL, SubTag.UNBURNABLE);
+ Magic.add(SubTag.CRYSTAL, SubTag.MAGICAL, SubTag.UNBURNABLE);
+
+ Primitive.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Basic.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Good.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Advanced.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Data.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Elite.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Master.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Ultimate.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Superconductor.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING); // Todo: remove this once it will be fully
+ // deprecated
+ Infinite.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Bio.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ SuperconductorMV.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ SuperconductorHV.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ SuperconductorEV.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ SuperconductorIV.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ SuperconductorLuV.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ SuperconductorZPM.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ // SuperconductorUV .add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ SuperconductorUHV.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+
+ Blaze.add(SubTag.MAGICAL, SubTag.SMELTING_TO_FLUID, SubTag.MORTAR_GRINDABLE, SubTag.UNBURNABLE, SubTag.BURNING);
+ FierySteel.add(SubTag.MAGICAL, SubTag.UNBURNABLE, SubTag.BURNING);
+ DarkThaumium.add(SubTag.MAGICAL);
+ Thaumium.add(SubTag.MAGICAL);
+ Void.add(SubTag.MAGICAL);
+ Enderium.add(SubTag.MAGICAL);
+ AstralSilver.add(SubTag.MAGICAL);
+ Mithril.add(SubTag.MAGICAL);
+
+ Carbon.add(SubTag.NO_SMELTING);
+ Boron.add(SubTag.SMELTING_TO_FLUID);
+ }
+
+ public static void init() {
+ new ProcessingConfig();
+ if (!GT_Mod.gregtechproxy.mEnableAllMaterials) new ProcessingModSupport();
+ mMaterialHandlers.forEach(IMaterialHandler::onMaterialsInit); // This is where addon mods can add/manipulate
+ // materials
+ initMaterialProperties(); // No more material addition or manipulation should be done past this point!
+ MATERIALS_ARRAY = MATERIALS_MAP.values()
+ .toArray(new Materials[0]); // Generate standard object array. This is a
+ // lot faster to loop over.
+ VALUES = Arrays.asList(MATERIALS_ARRAY);
+
+ disableUnusedHotIngots();
+ fillGeneratedMaterialsMap();
+ }
+
+ private static void disableUnusedHotIngots() {
+ OrePrefixes.ingotHot.mDisabledItems.addAll(
+ Arrays.stream(Materials.values())
+ .parallel()
+ .filter(OrePrefixes.ingotHot::doGenerateItem)
+ .filter(m -> m.mBlastFurnaceTemp < 1750 && m.mAutoGenerateBlastFurnaceRecipes)
+ .collect(Collectors.toSet()));
+ OrePrefixes.ingotHot.disableComponent(Materials.Reinforced);
+ OrePrefixes.ingotHot.disableComponent(Materials.ConductiveIron);
+ OrePrefixes.ingotHot.disableComponent(Materials.FierySteel);
+ OrePrefixes.ingotHot.disableComponent(Materials.ElectricalSteel);
+ OrePrefixes.ingotHot.disableComponent(Materials.EndSteel);
+ OrePrefixes.ingotHot.disableComponent(Materials.Soularium);
+ OrePrefixes.ingotHot.disableComponent(Materials.EnergeticSilver);
+ OrePrefixes.ingotHot.disableComponent(Materials.Cheese);
+ OrePrefixes.ingotHot.disableComponent(Materials.Calcium);
+ OrePrefixes.ingotHot.disableComponent(Materials.Flerovium);
+ OrePrefixes.ingotHot.disableComponent(Materials.Cobalt);
+ OrePrefixes.ingotHot.disableComponent(Materials.RedstoneAlloy);
+ OrePrefixes.ingotHot.disableComponent(Materials.Ardite);
+ OrePrefixes.ingotHot.disableComponent(Materials.DarkSteel);
+ OrePrefixes.ingotHot.disableComponent(Materials.BlackSteel);
+ OrePrefixes.ingotHot.disableComponent(Materials.EnergeticAlloy);
+ OrePrefixes.ingotHot.disableComponent(Materials.PulsatingIron);
+ OrePrefixes.ingotHot.disableComponent(Materials.CrudeSteel);
+ }
+
+ /**
+ * Init rendering properties. Will be called at pre init by GT client proxy.
+ */
+ public static void initClient() {
+ MaterialsUEVplus.TranscendentMetal.renderer = new TranscendentMetalRenderer();
+ MaterialsBotania.GaiaSpirit.renderer = new GaiaSpiritRenderer();
+ Infinity.renderer = new InfinityRenderer();
+ CosmicNeutronium.renderer = new CosmicNeutroniumRenderer();
+ MaterialsUEVplus.Universium.renderer = new UniversiumRenderer();
+ MaterialsUEVplus.Eternity.renderer = new InfinityRenderer();
+ MaterialsUEVplus.MagMatter.renderer = new InfinityRenderer();
+ }
+
+ private static void fillGeneratedMaterialsMap() {
+ for (Materials aMaterial : MATERIALS_ARRAY) {
+ if (aMaterial.mMetaItemSubID >= 0) {
+ if (aMaterial.mMetaItemSubID < 1000) {
+ if (aMaterial.mHasParentMod) {
+ if (GregTech_API.sGeneratedMaterials[aMaterial.mMetaItemSubID] == null) {
+ GregTech_API.sGeneratedMaterials[aMaterial.mMetaItemSubID] = aMaterial;
+ } else throw new IllegalArgumentException(
+ "The Material Index " + aMaterial.mMetaItemSubID
+ + " for "
+ + aMaterial.mName
+ + " is already used!");
+ }
+ } else throw new IllegalArgumentException(
+ "The Material Index " + aMaterial.mMetaItemSubID
+ + " for "
+ + aMaterial.mName
+ + " is/over the maximum of 1000");
+ }
+ }
+ }
+
+ private static void addFuelValues(Materials aMaterial, String aConfigPath) {
+ aMaterial.mFuelPower = GregTech_API.sMaterialProperties.get(aConfigPath, "FuelPower", aMaterial.mFuelPower);
+ aMaterial.mFuelType = GregTech_API.sMaterialProperties.get(aConfigPath, "FuelType", aMaterial.mFuelType);
+ }
+
+ private static void addTemperatureValues(Materials aMaterial, String aConfigPath) {
+ aMaterial.mMeltingPoint = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "MeltingPoint", aMaterial.mMeltingPoint);
+ aMaterial.mBlastFurnaceRequired = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "BlastFurnaceRequired", aMaterial.mBlastFurnaceRequired);
+ aMaterial.mBlastFurnaceTemp = (short) GregTech_API.sMaterialProperties
+ .get(aConfigPath, "BlastFurnaceTemp", aMaterial.mBlastFurnaceTemp);
+ aMaterial.mGasTemp = GregTech_API.sMaterialProperties.get(aConfigPath, "GasTemp", aMaterial.mGasTemp);
+ aMaterial.setHeatDamage(
+ (float) GregTech_API.sMaterialProperties.get(aConfigPath, "HeatDamage", aMaterial.mHeatDamage));
+ }
+
+ private static void addDensityValues(Materials aMaterial, String aConfigPath) {
+ aMaterial.mDensityMultiplier = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "DensityMultiplier", aMaterial.mDensityMultiplier);
+ aMaterial.mDensityDivider = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "DensityDivider", aMaterial.mDensityDivider);
+ aMaterial.mDensity = (long) GregTech_API.sMaterialProperties.get(
+ aConfigPath,
+ "Density",
+ ((double) M * aMaterial.mDensityMultiplier)
+ / (aMaterial.mDensityDivider != 0 ? aMaterial.mDensityDivider : 1));
+ }
+
+ private static void addColorValues(Materials aMaterial, String aConfigPath) {
+ aMaterial.mTransparent = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "Transparent", aMaterial.mTransparent);
+ String aColor = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "DyeColor", aMaterial.mColor == Dyes._NULL ? "None" : aMaterial.mColor.toString());
+ aMaterial.mColor = aColor.equals("None") ? Dyes._NULL : Dyes.get(aColor);
+ String[] aRGBA = GregTech_API.sMaterialProperties.get(
+ aConfigPath,
+ "MatRGBA",
+ aMaterial.mRGBa[0] + "," + aMaterial.mRGBa[1] + "," + aMaterial.mRGBa[2] + "," + aMaterial.mRGBa[3] + ",")
+ .split(",");
+ aMaterial.mRGBa[0] = Short.parseShort(aRGBA[0]);
+ aMaterial.mRGBa[1] = Short.parseShort(aRGBA[1]);
+ aMaterial.mRGBa[2] = Short.parseShort(aRGBA[2]);
+ aMaterial.mRGBa[3] = Short.parseShort(aRGBA[3]);
+ }
+
+ private static void addToolValues(Materials aMaterial, String aConfigPath) {
+ aMaterial.mDurability = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "ToolDurability", aMaterial.mDurability);
+ aMaterial.mToolSpeed = (float) GregTech_API.sMaterialProperties
+ .get(aConfigPath, "ToolSpeed", aMaterial.mToolSpeed);
+ aMaterial.mToolQuality = (byte) GregTech_API.sMaterialProperties
+ .get(aConfigPath, "ToolQuality", aMaterial.mToolQuality);
+ // Moved from GT_Proxy? (Not sure)
+ aMaterial.mHandleMaterial = (aMaterial == Desh ? aMaterial.mHandleMaterial
+ : aMaterial == Diamond || aMaterial == Thaumium ? Wood
+ : aMaterial.contains(SubTag.BURNING) ? Blaze
+ : aMaterial.contains(SubTag.MAGICAL) && aMaterial.contains(SubTag.CRYSTAL)
+ && Thaumcraft.isModLoaded() ? Thaumium
+ : aMaterial.getMass() > Element.Tc.getMass() * 2 ? TungstenSteel
+ : aMaterial.getMass() > Element.Tc.getMass() ? Steel : Wood);
+
+ if (aMaterial == MaterialsUEVplus.SpaceTime) {
+ aMaterial.mHandleMaterial = Materials.Infinity;
+ }
+
+ if (aMaterial == MaterialsUEVplus.TranscendentMetal) {
+ aMaterial.mHandleMaterial = Materials.DraconiumAwakened;
+ }
+
+ if (aMaterial == MaterialsUEVplus.Eternity) {
+ aMaterial.mHandleMaterial = MaterialsUEVplus.SpaceTime;
+ }
+
+ if (aMaterial == MaterialsUEVplus.MagMatter) {
+ aMaterial.mHandleMaterial = MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter;
+ }
+ }
+
+ private static void addEnchantmentValues(Materials aMaterial, String aConfigPath) {
+ aMaterial.mEnchantmentToolsLevel = (byte) GregTech_API.sMaterialProperties
+ .get(aConfigPath, "EnchantmentLevel", aMaterial.mEnchantmentToolsLevel);
+ String aEnchantmentName = GregTech_API.sMaterialProperties.get(
+ aConfigPath,
+ "Enchantment",
+ aMaterial.mEnchantmentTools != null ? aMaterial.mEnchantmentTools.getName() : "");
+ if (aMaterial.mEnchantmentTools != null && !aEnchantmentName.equals(aMaterial.mEnchantmentTools.getName()))
+ IntStream.range(0, Enchantment.enchantmentsList.length)
+ .filter(i -> aEnchantmentName.equals(Enchantment.enchantmentsList[i].getName()))
+ .forEach(i -> aMaterial.mEnchantmentTools = Enchantment.enchantmentsList[i]);
+ }
+
+ private static void addProcessingIntoValues(Materials aMaterial, String aConfigPath) {
+ aMaterial.mSmeltInto = MATERIALS_MAP
+ .get(GregTech_API.sMaterialProperties.get(aConfigPath, "MaterialSmeltInto", aMaterial.mSmeltInto.mName));
+ aMaterial.mMacerateInto = MATERIALS_MAP.get(
+ GregTech_API.sMaterialProperties.get(aConfigPath, "MaterialMacerateInto", aMaterial.mMacerateInto.mName));
+ aMaterial.mArcSmeltInto = MATERIALS_MAP.get(
+ GregTech_API.sMaterialProperties.get(aConfigPath, "MaterialArcSmeltInto", aMaterial.mArcSmeltInto.mName));
+ aMaterial.mDirectSmelting = MATERIALS_MAP.get(
+ GregTech_API.sMaterialProperties
+ .get(aConfigPath, "MaterialDirectSmeltInto", aMaterial.mDirectSmelting.mName));
+ aMaterial.mAutoGenerateBlastFurnaceRecipes = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "AutoGenerateBlastFurnaceRecipes", aMaterial.mAutoGenerateBlastFurnaceRecipes);
+ }
+
+ private static void addMultiplierValues(Materials aMaterial, String aConfigPath) {
+ aMaterial.mOreValue = GregTech_API.sMaterialProperties.get(aConfigPath, "OreValue", aMaterial.mOreValue);
+ aMaterial.setOreMultiplier(
+ GregTech_API.sMaterialProperties.get(aConfigPath, "OreMultiplier", aMaterial.mOreMultiplier));
+ aMaterial.setSmeltingMultiplier(
+ GregTech_API.sMaterialProperties.get(aConfigPath, "OreSmeltingMultiplier", aMaterial.mSmeltingMultiplier));
+ aMaterial.setByProductMultiplier(
+ GregTech_API.sMaterialProperties
+ .get(aConfigPath, "OreByProductMultiplier", aMaterial.mByProductMultiplier));
+ }
+
+ private static void addHasGasFluid(Materials aMaterial, String aConfigPath) {
+
+ if (!aMaterial.mIconSet.is_custom) {
+ aMaterial.mHasPlasma = GregTech_API.sMaterialProperties.get(aConfigPath, "AddPlasma", aMaterial.mHasPlasma);
+ if (aMaterial.mHasPlasma) {
+ GT_Mod.gregtechproxy.addAutogeneratedPlasmaFluid(aMaterial);
+ }
+ aMaterial.mHasGas = GregTech_API.sMaterialProperties.get(aConfigPath, "AddGas", aMaterial.mHasGas);
+ if (aMaterial.mHasGas) {
+ GT_FluidFactory
+ .of(aMaterial.mName.toLowerCase(), aMaterial.mDefaultLocalName, aMaterial, GAS, aMaterial.mGasTemp);
+ }
+ }
+ }
+
+ private static void addInternalStuff(Materials aMaterial, String aConfigPath) {
+ aMaterial.mMetaItemSubID = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "MaterialID", aMaterial.mCustomOre ? -1 : aMaterial.mMetaItemSubID);
+ aMaterial.mTypes = GregTech_API.sMaterialProperties.get(
+ aConfigPath,
+ "MaterialTypes",
+ aMaterial.mCustomOre ? 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 : aMaterial.mTypes);
+ aMaterial.mUnificatable = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "Unificatable", aMaterial.mUnificatable);
+ aMaterial.mHasParentMod = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "HasParentMod", aMaterial.mHasParentMod);
+ }
+
+ private static void addLocalisation(Materials aMaterial, String aConfigPath) {
+ aMaterial.mDefaultLocalName = GregTech_API.sMaterialProperties.get(
+ aConfigPath,
+ "MaterialName",
+ aMaterial.mCustomOre ? "CustomOre" + aMaterial.mCustomID : aMaterial.mDefaultLocalName);
+ aMaterial.mChemicalFormula = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "ChemicalFormula", aMaterial.mChemicalFormula);
+ }
+
+ private static String getConfigPath(Materials aMaterial) {
+ String cOre = aMaterial.mCustomOre ? aMaterial.mCustomID : aMaterial.mName;
+ return "materials." + aMaterial.mConfigSection + "." + cOre;
+ }
+
+ private static void addHarvestLevelNerfs(Materials aMaterial, String aConfigPath) {
+ /* Moved the harvest level changes from GT_Mod to have fewer things iterating over MATERIALS_ARRAY */
+ if (GT_Mod.gregtechproxy.mChangeHarvestLevels && aMaterial.mToolQuality > 0
+ && aMaterial.mMetaItemSubID < GT_Mod.gregtechproxy.mHarvestLevel.length
+ && aMaterial.mMetaItemSubID >= 0) {
+ GT_Mod.gregtechproxy.mHarvestLevel[aMaterial.mMetaItemSubID] = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "HarvestLevel", aMaterial.mToolQuality);
+ }
+ }
+
+ private static void addHarvestLevels() {
+ GT_Mod.gregtechproxy.mChangeHarvestLevels = GregTech_API.sMaterialProperties
+ .get("harvestlevel", "ActivateHarvestLevelChange", false);
+ GT_Mod.gregtechproxy.mMaxHarvestLevel = Math
+ .min(15, GregTech_API.sMaterialProperties.get("harvestlevel", "MaxHarvestLevel", 7));
+ GT_Mod.gregtechproxy.mGraniteHavestLevel = GregTech_API.sMaterialProperties
+ .get("harvestlevel", "GraniteHarvestLevel", 3);
+ }
+
+ public static void initMaterialProperties() {
+ addHarvestLevels();
+ for (Materials aMaterial : MATERIALS_MAP.values()) {
+ if (aMaterial != null && aMaterial != Materials._NULL && aMaterial != Materials.Empty) {
+
+ String aConfigPath = getConfigPath(aMaterial);
+
+ addFuelValues(aMaterial, aConfigPath);
+ addTemperatureValues(aMaterial, aConfigPath);
+ addDensityValues(aMaterial, aConfigPath);
+ addColorValues(aMaterial, aConfigPath);
+ addToolValues(aMaterial, aConfigPath);
+ addEnchantmentValues(aMaterial, aConfigPath);
+ addProcessingIntoValues(aMaterial, aConfigPath);
+ addMultiplierValues(aMaterial, aConfigPath);
+ addHasGasFluid(aMaterial, aConfigPath);
+ addInternalStuff(aMaterial, aConfigPath);
+ addLocalisation(aMaterial, aConfigPath);
+ SubTagCalculation(aMaterial, aConfigPath);
+ OreByProductsCalculation(aMaterial, aConfigPath);
+ OreReRegistrationsCalculation(aMaterial, aConfigPath);
+ aspectCalculation(aMaterial, aConfigPath);
+ addHarvestLevelNerfs(aMaterial, aConfigPath);
+ }
+ }
+ }
+
+ private static void aspectCalculation(Materials aMaterial, String aConfigPath) {
+
+ String aDefaultAspectString = aMaterial.mAspects.stream()
+ .map(aAspectStack -> aAspectStack.mAspect.toString())
+ .collect(Collectors.joining(",", ",", ""));
+ String aDefaultAspectAmountString = aMaterial.mAspects.stream()
+ .map(aAspectStack -> String.valueOf(aAspectStack.mAmount))
+ .collect(Collectors.joining(",", ",", ""));
+
+ String aConfigAspectString = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "ListTCAspects", aDefaultAspectString);
+ String aConfigAspectAmountString = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "ListTCAspectAmounts", aDefaultAspectAmountString);
+
+ if (!aConfigAspectString.equals(aDefaultAspectString)
+ || !aConfigAspectAmountString.equals(aDefaultAspectAmountString)) {
+ aMaterial.mAspects.clear();
+ if (aConfigAspectString.length() > 0) {
+ String[] aAspects = aConfigAspectString.split(",");
+ String[] aAspectAmounts = aConfigAspectAmountString.split(",");
+ for (int i = 0; i < aAspects.length; i++) {
+ String aAspectString = aAspects[i];
+ long aAspectAmount = Long.parseLong(aAspectAmounts[i]);
+ TC_AspectStack aAspectStack = new TC_AspectStack(TC_Aspects.valueOf(aAspectString), aAspectAmount);
+ aMaterial.mAspects.add(aAspectStack);
+ }
+ }
+ }
+ }
+
+ private static void OreReRegistrationsCalculation(Materials aMaterial, String aConfigPath) {
+ String aDefaultMatReRegString = aMaterial.mOreReRegistrations.stream()
+ .map(aTag -> aTag.mName)
+ .collect(Collectors.joining(",", ",", ""));
+ String aConfigMatMatReRegString = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "ListMaterialReRegistrations", aDefaultMatReRegString);
+ if (!aConfigMatMatReRegString.equals(aDefaultMatReRegString)) {
+ aMaterial.mOreReRegistrations.clear();
+ if (aConfigMatMatReRegString.length() > 0) {
+ Arrays.stream(aConfigMatMatReRegString.split(","))
+ .map(MATERIALS_MAP::get)
+ .filter(Objects::nonNull)
+ .forEach(aMat -> aMaterial.mOreReRegistrations.add(aMat));
+ }
+ }
+ }
+
+ private static void OreByProductsCalculation(Materials aMaterial, String aConfigPath) {
+ String aDefaultMatByProString = aMaterial.mOreByProducts.stream()
+ .map(aTag -> aTag.mName)
+ .collect(Collectors.joining(",", ",", ""));
+ String aConfigMatByProString = GregTech_API.sMaterialProperties
+ .get(aConfigPath, "ListMaterialByProducts", aDefaultMatByProString);
+ if (!aConfigMatByProString.equals(aDefaultMatByProString)) {
+ aMaterial.mOreByProducts.clear();
+ if (aConfigMatByProString.length() > 0) {
+ Arrays.stream(aConfigMatByProString.split(","))
+ .map(MATERIALS_MAP::get)
+ .filter(Objects::nonNull)
+ .forEach(aMat -> aMaterial.mOreByProducts.add(aMat));
+ }
+ }
+ }
+
+ /**
+ * Converts the pre-defined list of SubTags from a material into a list of SubTag names for setting/getting to/from
+ * the config. It is then converted to a String[] and finally to a singular String for insertion into the config If
+ * the config string is different from the default, we then want to clear the Materials SubTags and insert new ones
+ * from the config string.
+ */
+ private static void SubTagCalculation(Materials aMaterial, String aConfigPath) {
+ String aDefaultTagString = aMaterial.mSubTags.stream()
+ .map(aTag -> aTag.mName)
+ .collect(Collectors.joining(",", ",", ""));
+ String aConfigTagString = GregTech_API.sMaterialProperties.get(aConfigPath, "ListSubTags", aDefaultTagString);
+ if (!aConfigTagString.equals(aDefaultTagString)) {
+ aMaterial.mSubTags.clear();
+ if (aConfigTagString.length() > 0) {
+ Arrays.stream(aConfigTagString.split(","))
+ .map(SubTag.sSubTags::get)
+ .filter(Objects::nonNull)
+ .forEach(aTag -> aMaterial.mSubTags.add(aTag));
+ }
+ }
+ }
+
+ /**
+ * This is for keeping compatibility with addons mods (Such as TinkersGregworks etc.) that looped over the old
+ * materials enum
+ */
+ @Deprecated
+ public static Materials valueOf(String aMaterialName) {
+ return getMaterialsMap().get(aMaterialName);
+ }
+
+ /**
+ * This is for keeping compatibility with addons mods (Such as TinkersGregworks etc.) that looped over the old
+ * materials enum
+ */
+ public static Materials[] values() {
+ return MATERIALS_ARRAY;
+ }
+
+ /**
+ * This should only be used for getting a Material by its name as a String. Do not loop over this map, use values().
+ */
+ public static Map<String, Materials> getMaterialsMap() {
+ return MATERIALS_MAP;
+ }
+
+ @Nonnull
+ public static Materials get(String aMaterialName) {
+ return getWithFallback(aMaterialName, Materials._NULL);
+ }
+
+ @Nonnull
+ public static Materials getWithFallback(String name, @Nonnull Materials fallback) {
+ Materials material = getMaterialsMap().get(name);
+ if (material != null) {
+ return material;
+ }
+ return fallback;
+ }
+
+ public static Materials getRealMaterial(String aMaterialName) {
+ return get(aMaterialName).mMaterialInto;
+ }
+
+ /**
+ * Adds a Class implementing IMaterialRegistrator to the master list
+ */
+ public static boolean add(IMaterialHandler aRegistrator) {
+ if (aRegistrator == null) return false;
+ return mMaterialHandlers.add(aRegistrator);
+ }
+
+ public static String getLocalizedNameForItem(String aFormat, int aMaterialID) {
+ if (aMaterialID >= 0 && aMaterialID < 1000) {
+ Materials aMaterial = GregTech_API.sGeneratedMaterials[aMaterialID];
+ if (aMaterial != null) return aMaterial.getLocalizedNameForItem(aFormat);
+ }
+ return aFormat;
+ }
+
+ public static Collection<Materials> getAll() {
+ return MATERIALS_MAP.values();
+ }
+
+ public Materials disableAutoGeneratedBlastFurnaceRecipes() {
+ mAutoGenerateBlastFurnaceRecipes = false;
+ return this;
+ }
+
+ public Materials disableAutoGeneratedVacuumFreezerRecipe() {
+ mAutoGenerateVacuumFreezerRecipes = false;
+ return this;
+ }
+
+ public Materials setTurbineMultipliers(float steamMultiplier, float gasMultiplier, float plasmaMultiplier) {
+ mSteamMultiplier = steamMultiplier;
+ mGasMultiplier = gasMultiplier;
+ mPlasmaMultiplier = plasmaMultiplier;
+ return this;
+ }
+
+ public Materials disableAutoGeneratedRecycleRecipes() {
+ mAutoGenerateRecycleRecipes = false;
+ return this;
+ }
+
+ /**
+ * This is for keeping compatibility with addons mods (Such as TinkersGregworks etc.) that looped over the old
+ * materials enum
+ */
+ @Deprecated
+ public String name() {
+ return mName;
+ }
+
+ public boolean isRadioactive() {
+ if (mElement != null) return mElement.mHalfLifeSeconds >= 0;
+
+ return mMaterialList.stream()
+ .map(stack -> stack.mMaterial)
+ .anyMatch(Materials::isRadioactive);
+ }
+
+ public long getProtons() {
+ if (mElement != null) return mElement.getProtons();
+ if (mMaterialList.size() == 0) return Element.Tc.getProtons();
+ long rAmount = 0, tAmount = 0;
+ for (MaterialStack tMaterial : mMaterialList) {
+ tAmount += tMaterial.mAmount;
+ rAmount += tMaterial.mAmount * tMaterial.mMaterial.getProtons();
+ }
+ return (getDensity() * rAmount) / (tAmount * M);
+ }
+
+ public long getNeutrons() {
+ if (mElement != null) return mElement.getNeutrons();
+ if (mMaterialList.size() == 0) return Element.Tc.getNeutrons();
+ long rAmount = 0, tAmount = 0;
+ for (MaterialStack tMaterial : mMaterialList) {
+ tAmount += tMaterial.mAmount;
+ rAmount += tMaterial.mAmount * tMaterial.mMaterial.getNeutrons();
+ }
+ return (getDensity() * rAmount) / (tAmount * M);
+ }
+
+ public long getMass() {
+ if (mElement != null) return mElement.getMass();
+ if (mMaterialList.size() == 0) return Element.Tc.getMass();
+ long rAmount = 0, tAmount = 0;
+ for (MaterialStack tMaterial : mMaterialList) {
+ tAmount += tMaterial.mAmount;
+ rAmount += tMaterial.mAmount * tMaterial.mMaterial.getMass();
+ }
+ return (getDensity() * rAmount) / (tAmount * M);
+ }
+
+ public long getDensity() {
+ return mDensity;
+ }
+
+ public String getToolTip() {
+ return getToolTip(1, false);
+ }
+
+ public String getToolTip(boolean aShowQuestionMarks) {
+ return getToolTip(1, aShowQuestionMarks);
+ }
+
+ public String getToolTip(long aMultiplier) {
+ return getToolTip(aMultiplier, false);
+ }
+
+ public String getToolTip(long aMultiplier, boolean aShowQuestionMarks) {
+ if (!aShowQuestionMarks && mChemicalFormula.equals("?")) return "";
+ if (aMultiplier >= M * 2 && !mMaterialList.isEmpty()) {
+ return ((mElement != null || (mMaterialList.size() < 2 && mMaterialList.get(0).mAmount == 1))
+ ? mChemicalFormula
+ : "(" + mChemicalFormula + ")") + aMultiplier;
+ }
+ return mChemicalFormula;
+ }
+
+ /**
+ * Adds an ItemStack to this Material.
+ */
+ public Materials add(ItemStack aStack) {
+ if (aStack != null && !contains(aStack)) mMaterialItems.add(aStack);
+ return this;
+ }
+
+ /**
+ * This is used to determine if any of the ItemStacks belongs to this Material.
+ */
+ public boolean contains(ItemStack... aStacks) {
+ if (aStacks == null || aStacks.length == 0) return false;
+ return mMaterialItems.stream()
+ .anyMatch(
+ tStack -> Arrays.stream(aStacks)
+ .anyMatch(aStack -> GT_Utility.areStacksEqual(aStack, tStack, !tStack.hasTagCompound())));
+ }
+
+ /**
+ * This is used to determine if an ItemStack belongs to this Material.
+ */
+ public boolean remove(ItemStack aStack) {
+ if (aStack == null) return false;
+ boolean temp = false;
+ int mMaterialItems_sS = mMaterialItems.size();
+ for (int i = 0; i < mMaterialItems_sS; i++) if (GT_Utility.areStacksEqual(aStack, mMaterialItems.get(i))) {
+ mMaterialItems.remove(i--);
+ temp = true;
+ }
+ return temp;
+ }
+
+ /**
+ * Adds a SubTag to this Material
+ */
+ @Override
+ public ISubTagContainer add(SubTag... aTags) {
+ if (aTags != null) for (SubTag aTag : aTags) if (aTag != null && !contains(aTag)) {
+ aTag.addContainerToList(this);
+ mSubTags.add(aTag);
+ }
+ return this;
+ }
+
+ /**
+ * If this Material has this exact SubTag
+ */
+ @Override
+ public boolean contains(SubTag aTag) {
+ return mSubTags.contains(aTag);
+ }
+
+ /**
+ * Removes a SubTag from this Material
+ */
+ @Override
+ public boolean remove(SubTag aTag) {
+ return mSubTags.remove(aTag);
+ }
+
+ /**
+ * Sets the Heat Damage for this Material (negative = frost)
+ */
+ @SuppressWarnings("UnusedReturnValue") // Maintains signature
+ public Materials setHeatDamage(float aHeatDamage) {
+ mHeatDamage = aHeatDamage;
+ return this;
+ }
+
+ /**
+ * Adds a Material to the List of Byproducts when grinding this Ore. Is used for more precise Ore grinding, so that
+ * it is possible to choose between certain kinds of Materials.
+ */
+ @SuppressWarnings("UnusedReturnValue") // Maintains signature
+ public Materials addOreByProduct(Materials aMaterial) {
+ if (!mOreByProducts.contains(aMaterial.mMaterialInto)) mOreByProducts.add(aMaterial.mMaterialInto);
+ return this;
+ }
+
+ /**
+ * Adds multiple Materials to the List of Byproducts when grinding this Ore. Is used for more precise Ore grinding,
+ * so that it is possible to choose between certain kinds of Materials.
+ */
+ public Materials addOreByProducts(Materials... aMaterials) {
+ for (Materials tMaterial : aMaterials) if (tMaterial != null) addOreByProduct(tMaterial);
+ return this;
+ }
+
+ /**
+ * If this Ore gives multiple drops of its Main Material. Lapis Ore for example gives about 6 drops.
+ */
+ public Materials setOreMultiplier(int aOreMultiplier) {
+ if (aOreMultiplier > 0) mOreMultiplier = aOreMultiplier;
+ return this;
+ }
+
+ /**
+ * If this Ore gives multiple drops of its Byproduct Material.
+ */
+ @SuppressWarnings("UnusedReturnValue") // Maintains signature
+ public Materials setByProductMultiplier(int aByProductMultiplier) {
+ if (aByProductMultiplier > 0) mByProductMultiplier = aByProductMultiplier;
+ return this;
+ }
+
+ /**
+ * If this Ore gives multiple drops of its Main Material. Lapis Ore for example gives about 6 drops.
+ */
+ public Materials setSmeltingMultiplier(int aSmeltingMultiplier) {
+ if (aSmeltingMultiplier > 0) mSmeltingMultiplier = aSmeltingMultiplier;
+ return this;
+ }
+
+ /**
+ * This Ore should be molten directly into an Ingot of this Material instead of an Ingot of itself.
+ */
+ public Materials setDirectSmelting(Materials aMaterial) {
+ if (aMaterial != null) mDirectSmelting = aMaterial.mMaterialInto.mDirectSmelting;
+ return this;
+ }
+
+ /**
+ * This Material should be the Main Material this Ore gets ground into. Example, Chromite giving Chrome or Tungstate
+ * giving Tungsten.
+ */
+ @SuppressWarnings("UnusedReturnValue") // Maintains signature
+ public Materials setOreReplacement(Materials aMaterial) {
+ if (aMaterial != null) mOreReplacement = aMaterial.mMaterialInto.mOreReplacement;
+ return this;
+ }
+
+ /**
+ * This Material smelts always into an instance of aMaterial. Used for Magnets.
+ */
+ public Materials setSmeltingInto(Materials aMaterial) {
+ if (aMaterial != null) mSmeltInto = aMaterial.mMaterialInto.mSmeltInto;
+ return this;
+ }
+
+ /**
+ * This Material arc smelts always into an instance of aMaterial. Used for Wrought Iron.
+ */
+ @SuppressWarnings("UnusedReturnValue") // Maintains signature
+ public Materials setArcSmeltingInto(Materials aMaterial) {
+ if (aMaterial != null) mArcSmeltInto = aMaterial.mMaterialInto.mArcSmeltInto;
+ return this;
+ }
+
+ /**
+ * This Material macerates always into an instance of aMaterial.
+ */
+ public Materials setMaceratingInto(Materials aMaterial) {
+ if (aMaterial != null) mMacerateInto = aMaterial.mMaterialInto.mMacerateInto;
+ return this;
+ }
+
+ public Materials setEnchantmentForTools(Enchantment aEnchantment, int aEnchantmentLevel) {
+ mEnchantmentTools = aEnchantment;
+ mEnchantmentToolsLevel = (byte) aEnchantmentLevel;
+ return this;
+ }
+
+ @SuppressWarnings("UnusedReturnValue") // Maintains signature
+ public Materials setEnchantmentForArmors(Enchantment aEnchantment, int aEnchantmentLevel) {
+ mEnchantmentArmors = aEnchantment;
+ mEnchantmentArmorsLevel = (byte) aEnchantmentLevel;
+ return this;
+ }
+
+ public FluidStack getSolid(long aAmount) {
+ if (mSolid == null) return null;
+ return new FluidStack(mSolid, (int) aAmount);
+ }
+
+ public FluidStack getFluid(long aAmount) {
+ if (mFluid == null) return null;
+ return new FluidStack(mFluid, (int) aAmount);
+ }
+
+ public FluidStack getGas(long aAmount) {
+ if (mGas == null) return null;
+ return new FluidStack(mGas, (int) aAmount);
+ }
+
+ public FluidStack getPlasma(long aAmount) {
+ if (mPlasma == null) return null;
+ return new FluidStack(mPlasma, (int) aAmount);
+ }
+
+ public FluidStack getMolten(long aAmount) {
+ if (mStandardMoltenFluid == null) return null;
+ return new FluidStack(mStandardMoltenFluid, (int) aAmount);
+ }
+
+ @Override
+ public short[] getRGBA() {
+ return mRGBa;
+ }
+
+ @Override
+ public String toString() {
+ return this.mName;
+ }
+
+ public String getDefaultLocalizedNameForItem(String aFormat) {
+ return String.format(
+ aFormat.replace("%s", "%temp")
+ .replace("%material", "%s"),
+ this.mDefaultLocalName)
+ .replace("%temp", "%s");
+ }
+
+ public String getLocalizedNameForItem(String aFormat) {
+ return String.format(
+ aFormat.replace("%s", "%temp")
+ .replace("%material", "%s"),
+ this.mLocalizedName)
+ .replace("%temp", "%s");
+ }
+
+ public boolean hasCorrespondingFluid() {
+ return hasCorrespondingFluid;
+ }
+
+ public Materials setHasCorrespondingFluid(boolean hasCorrespondingFluid) {
+ this.hasCorrespondingFluid = hasCorrespondingFluid;
+ return this;
+ }
+
+ public boolean hasCorrespondingGas() {
+ return hasCorrespondingGas;
+ }
+
+ public Materials setHasCorrespondingGas(boolean hasCorrespondingGas) {
+ this.hasCorrespondingGas = hasCorrespondingGas;
+ return this;
+ }
+
+ public Materials setHasCorrespondingPlasma(boolean hasCorrespondingPlasma) {
+ this.mHasPlasma = hasCorrespondingPlasma;
+ return this;
+ }
+
+ public boolean canBeCracked() {
+ return canBeCracked;
+ }
+
+ public Materials setCanBeCracked(boolean canBeCracked) {
+ this.canBeCracked = canBeCracked;
+ return this;
+ }
+
+ public int getLiquidTemperature() {
+ return mMeltingPoint == 0 ? 295 : mMeltingPoint;
+ }
+
+ public Materials setLiquidTemperature(int liquidTemperature) {
+ this.mMeltingPoint = liquidTemperature;
+ return this;
+ }
+
+ public int getGasTemperature() {
+ return mGasTemp == 0 ? 295 : mMeltingPoint;
+ }
+
+ public Materials setGasTemperature(int gasTemperature) {
+ this.mGasTemp = gasTemperature;
+ return this;
+ }
+
+ public Materials setHydroCrackedFluids(Fluid[] hydroCrackedFluids) {
+ this.hydroCrackedFluids = hydroCrackedFluids;
+ return this;
+ }
+
+ public FluidStack getLightlyHydroCracked(int amount) {
+ if (hydroCrackedFluids[0] == null) {
+ return null;
+ }
+ return new FluidStack(hydroCrackedFluids[0], amount);
+ }
+
+ public FluidStack getModeratelyHydroCracked(int amount) {
+ if (hydroCrackedFluids[0] == null) {
+ return null;
+ }
+ return new FluidStack(hydroCrackedFluids[1], amount);
+ }
+
+ public FluidStack getSeverelyHydroCracked(int amount) {
+ if (hydroCrackedFluids[0] == null) {
+ return null;
+ }
+ return new FluidStack(hydroCrackedFluids[2], amount);
+ }
+
+ public Materials setSteamCrackedFluids(Fluid[] steamCrackedFluids) {
+ this.steamCrackedFluids = steamCrackedFluids;
+ return this;
+ }
+
+ public FluidStack getLightlySteamCracked(int amount) {
+ if (hydroCrackedFluids[0] == null) {
+ return null;
+ }
+ return new FluidStack(steamCrackedFluids[0], amount);
+ }
+
+ public FluidStack getModeratelySteamCracked(int amount) {
+ if (hydroCrackedFluids[0] == null) {
+ return null;
+ }
+ return new FluidStack(steamCrackedFluids[1], amount);
+ }
+
+ public FluidStack getSeverelySteamCracked(int amount) {
+ if (hydroCrackedFluids[0] == null) {
+ return null;
+ }
+ return new FluidStack(steamCrackedFluids[2], amount);
+ }
+
+ /**
+ * Check that the material is a proper soldering fluid
+ **
+ * @return true if Materials is a proper soldering fluid
+ */
+ public boolean isProperSolderingFluid() {
+ return mStandardMoltenFluid != null && contains(SubTag.SOLDERING_MATERIAL)
+ && !(GregTech_API.mUseOnlyGoodSolderingMaterials && !contains(SubTag.SOLDERING_MATERIAL_GOOD));
+ }
+
+ public ItemStack getCells(int amount) {
+ return GT_OreDictUnificator.get(OrePrefixes.cell, this, amount);
+ }
+
+ public ItemStack getDust(int amount) {
+ return GT_OreDictUnificator.get(OrePrefixes.dust, this, amount);
+ }
+
+ public ItemStack getDustSmall(int amount) {
+ return GT_OreDictUnificator.get(OrePrefixes.dustSmall, this, amount);
+ }
+
+ public ItemStack getDustTiny(int amount) {
+ return GT_OreDictUnificator.get(OrePrefixes.dustTiny, this, amount);
+ }
+
+ public ItemStack getGems(int amount) {
+ return GT_OreDictUnificator.get(OrePrefixes.gem, this, amount);
+ }
+
+ public ItemStack getIngots(int amount) {
+ return GT_OreDictUnificator.get(OrePrefixes.ingot, this, amount);
+ }
+
+ public ItemStack getNuggets(int amount) {
+ return GT_OreDictUnificator.get(OrePrefixes.nugget, this, amount);
+ }
+
+ public ItemStack getBlocks(int amount) {
+ return GT_OreDictUnificator.get(OrePrefixes.block, this, amount);
+ }
+
+ public ItemStack getPlates(int amount) {
+ return GT_OreDictUnificator.get(OrePrefixes.plate, this, amount);
+ }
+
+ public static Materials getGtMaterialFromFluid(Fluid fluid) {
+ return FLUID_MAP.get(fluid);
+ }
+
+ public ItemStack getNanite(int amount) {
+ return GT_OreDictUnificator.get(OrePrefixes.nanite, this, amount);
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/MaterialsBotania.java b/src/main/java/gregtech/api/enums/MaterialsBotania.java
new file mode 100644
index 0000000000..6fe538a0bc
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/MaterialsBotania.java
@@ -0,0 +1,238 @@
+package gregtech.api.enums;
+
+import static gregtech.api.enums.OrePrefixes.gem;
+import static gregtech.api.enums.OrePrefixes.ingot;
+import static gregtech.api.enums.OrePrefixes.nugget;
+import static gregtech.api.enums.OrePrefixes.plate;
+import static gregtech.api.enums.OrePrefixes.rod;
+import static gregtech.api.enums.OrePrefixes.rotor;
+
+import java.util.Arrays;
+
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+
+public class MaterialsBotania {
+
+ // Botania materials.
+ public static Materials Manasteel = new MaterialBuilder(201, TextureSet.SET_METALLIC, "Manasteel")
+ .setName("Manasteel")
+ .setRGBA(150, 219, 252, 255)
+ .addDustItems()
+ .addMetalItems()
+ .addToolHeadItems()
+ .addGearItems()
+ .setToolSpeed(8.0F)
+ .setDurability(5120)
+ .setToolQuality(4)
+ .setMeltingPoint(1500)
+ .setBlastFurnaceTemp(1500)
+ .setBlastFurnaceRequired(true)
+ .setAspects(
+ Arrays.asList(new TC_AspectStack(TC_Aspects.METALLUM, 3), new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)))
+ .constructMaterial();
+ public static Materials Terrasteel = new MaterialBuilder(202, TextureSet.SET_METALLIC, "Terrasteel")
+ .setName("Terrasteel")
+ .setRGBA(76, 191, 38, 255)
+ .addDustItems()
+ .addMetalItems()
+ .addToolHeadItems()
+ .addGearItems()
+ .setToolSpeed(32.0F)
+ .setDurability(10240)
+ .setToolQuality(5)
+ .setMeltingPoint(5400)
+ .setBlastFurnaceTemp(5400)
+ .setBlastFurnaceRequired(true)
+ .setAspects(
+ Arrays.asList(
+ new TC_AspectStack(TC_Aspects.METALLUM, 2),
+ new TC_AspectStack(TC_Aspects.TERRA, 1),
+ new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)))
+ .constructMaterial();
+ public static Materials ElvenElementium = new MaterialBuilder(203, TextureSet.SET_METALLIC, "Elven Elementium")
+ .setName("ElvenElementium")
+ .setRGBA(219, 37, 205, 255)
+ .addDustItems()
+ .addMetalItems()
+ .addToolHeadItems()
+ .addGearItems()
+ .setToolSpeed(20.0F)
+ .setDurability(32768)
+ .setToolQuality(7)
+ .setMeltingPoint(7200)
+ .setBlastFurnaceTemp(7200)
+ .setBlastFurnaceRequired(true)
+ .setAspects(
+ Arrays.asList(
+ new TC_AspectStack(TC_Aspects.METALLUM, 3),
+ new TC_AspectStack(TC_Aspects.PRAECANTATIO, 2),
+ new TC_AspectStack(TC_Aspects.AURAM, 1)))
+ .constructMaterial();
+ public static Materials Livingrock = new MaterialBuilder(204, new TextureSet("Livingrock", true), "Livingrock")
+ .setName("Livingrock")
+ .addDustItems()
+ .addToolHeadItems()
+ .addGearItems()
+ .setToolSpeed(1.0F)
+ .setDurability(0)
+ .setToolQuality(3)
+ .setOreValue(3)
+ .setDensityMultiplier(1)
+ .setDensityDivider(1)
+ .setAspects(Arrays.asList(new TC_AspectStack(TC_Aspects.TERRA, 2), new TC_AspectStack(TC_Aspects.VICTUS, 2)))
+ .constructMaterial();
+ public static Materials GaiaSpirit = new Materials(
+ 205,
+ TextureSet.SET_METALLIC.withBlockTextures("GaiaSpirit"),
+ 32.0F,
+ 850000,
+ 12,
+ 1 | 2 | 64 | 128,
+ 255,
+ 255,
+ 255,
+ 0,
+ "GaiaSpirit",
+ "Gaia Spirit",
+ -1,
+ -1,
+ 0,
+ 0,
+ false,
+ true,
+ 2,
+ 1,
+ 1,
+ Dyes._NULL,
+ Arrays.asList(
+ new TC_AspectStack(TC_Aspects.PRAECANTATIO, 27),
+ new TC_AspectStack(TC_Aspects.AURAM, 24),
+ new TC_AspectStack(TC_Aspects.VICTUS, 24),
+ new TC_AspectStack(TC_Aspects.METALLUM, 1)));
+ public static Materials Livingwood = new MaterialBuilder(206, new TextureSet("Livingwood", true), "Livingwood")
+ .setName("Livingwood")
+ .addDustItems()
+ .addMetalItems()
+ .addToolHeadItems()
+ .addGearItems()
+ .setToolSpeed(1.0F)
+ .setDurability(0)
+ .setToolQuality(3)
+ .setOreValue(3)
+ .setDensityMultiplier(1)
+ .setDensityDivider(1)
+ .setAspects(Arrays.asList(new TC_AspectStack(TC_Aspects.ARBOR, 4), new TC_AspectStack(TC_Aspects.VICTUS, 2)))
+ .constructMaterial();
+ public static Materials Dreamwood = new MaterialBuilder(207, new TextureSet("Dreamwood", true), "Dreamwood")
+ .setName("Dreamwood")
+ .addDustItems()
+ .addMetalItems()
+ .addToolHeadItems()
+ .addGearItems()
+ .setToolSpeed(1.0F)
+ .setDurability(0)
+ .setToolQuality(3)
+ .setOreValue(3)
+ .setDensityMultiplier(1)
+ .setDensityDivider(1)
+ .setAspects(
+ Arrays.asList(
+ new TC_AspectStack(TC_Aspects.ARBOR, 4),
+ new TC_AspectStack(TC_Aspects.AURAM, 2),
+ new TC_AspectStack(TC_Aspects.PRAECANTATIO, 1)))
+ .constructMaterial();
+ public static Materials ManaDiamond = new Materials(
+ 208,
+ TextureSet.SET_DIAMOND,
+ 16.0F,
+ 2560,
+ 8,
+ 1 | 4,
+ 38,
+ 237,
+ 224,
+ 255,
+ "ManaDiamond",
+ "Mana Diamond",
+ -1,
+ -1,
+ 0,
+ 0,
+ false,
+ true,
+ 2,
+ 1,
+ 1,
+ Dyes._NULL,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 4),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 4)));
+ public static Materials BotaniaDragonstone = new Materials(
+ 209,
+ TextureSet.SET_DIAMOND,
+ 24.0F,
+ 3840,
+ 12,
+ 1 | 4,
+ 242,
+ 44,
+ 239,
+ 255,
+ "BotaniaDragonstone",
+ "Dragonstone",
+ -1,
+ -1,
+ 0,
+ 0,
+ false,
+ true,
+ 2,
+ 1,
+ 1,
+ Dyes._NULL,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 6),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 6),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AURAM, 4)));
+
+ public static void init() {
+ GaiaSpirit.mChemicalFormula = "Gs";
+ Manasteel.mChemicalFormula = "Ms";
+ Livingwood.mChemicalFormula = "Lw";
+ Dreamwood.mChemicalFormula = "Dw";
+ BotaniaDragonstone.mChemicalFormula = "Dg";
+ Livingrock.mChemicalFormula = "Lv";
+ Terrasteel.mChemicalFormula = "Tr";
+ ElvenElementium.mChemicalFormula = "Ef";
+
+ Livingrock.add(SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ Livingwood.add(SubTag.WOOD, SubTag.FLAMMABLE, SubTag.NO_SMELTING, SubTag.NO_SMASHING);
+ Dreamwood.add(SubTag.WOOD, SubTag.FLAMMABLE, SubTag.NO_SMELTING, SubTag.NO_SMASHING);
+ ManaDiamond.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ BotaniaDragonstone.add(SubTag.CRYSTAL, SubTag.NO_SMASHING, SubTag.NO_SMELTING);
+ GaiaSpirit.add(SubTag.SOFT);
+
+ // Botania native items
+ ingot.mNotGeneratedItems.add(Manasteel);
+ ingot.mNotGeneratedItems.add(Terrasteel);
+ ingot.mNotGeneratedItems.add(ElvenElementium);
+ ingot.mNotGeneratedItems.add(GaiaSpirit);
+ nugget.mNotGeneratedItems.add(Manasteel);
+ nugget.mNotGeneratedItems.add(Terrasteel);
+ nugget.mNotGeneratedItems.add(ElvenElementium);
+ gem.mNotGeneratedItems.add(ManaDiamond);
+ gem.mNotGeneratedItems.add(BotaniaDragonstone);
+
+ // other stuff we don't want
+ ingot.mNotGeneratedItems.add(Livingwood);
+ ingot.mNotGeneratedItems.add(Dreamwood);
+ nugget.mNotGeneratedItems.add(Livingwood);
+ nugget.mNotGeneratedItems.add(Dreamwood);
+ rotor.mNotGeneratedItems.add(Livingrock);
+
+ // stuff we want
+ plate.mGeneratedItems.add(Livingrock);
+ rod.mGeneratedItems.add(Livingrock); // this is not working
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/MaterialsKevlar.java b/src/main/java/gregtech/api/enums/MaterialsKevlar.java
new file mode 100644
index 0000000000..6612bc8b65
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/MaterialsKevlar.java
@@ -0,0 +1,604 @@
+package gregtech.api.enums;
+
+import java.util.Arrays;
+
+import gregtech.api.objects.MaterialStack;
+
+public class MaterialsKevlar {
+
+ public static Materials DiphenylmethaneDiisocyanate = new MaterialBuilder(
+ 796,
+ TextureSet.SET_DULL,
+ "4,4'-Diphenylmethane Diisocyanate").setName("DiphenylmethaneDiisocyanate")
+ .addDustItems()
+ .setRGB(255, 230, 50)
+ .setColor(Dyes.dyeYellow)
+ .setMeltingPoint(310)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 15),
+ new MaterialStack(Materials.Hydrogen, 10),
+ new MaterialStack(Materials.Nitrogen, 2),
+ new MaterialStack(Materials.Oxygen, 2))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1)))
+ .constructMaterial(); // C15H10N2O2
+ public static Materials DiaminodiphenylmethanMixture = new MaterialBuilder(
+ 795,
+ TextureSet.SET_FLUID,
+ "Diaminodiphenylmethane Mixture").setName("DiaminodiphenylmethanMixture")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 243, 122)
+ .setColor(Dyes.dyeYellow)
+ .setMeltingPoint(365)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 13),
+ new MaterialStack(Materials.Hydrogen, 14),
+ new MaterialStack(Materials.Nitrogen, 2))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1)))
+ .constructMaterial(); // C13H14N2
+ public static Materials DiphenylmethaneDiisocyanateMixture = new MaterialBuilder(
+ 794,
+ TextureSet.SET_FLUID,
+ "Diphenylmethane Diisocyanate Mixture").setName("DiphenylmethaneDiisocyanateMixture")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 230, 50)
+ .setColor(Dyes.dyeYellow)
+ .setMeltingPoint(310)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 15),
+ new MaterialStack(Materials.Hydrogen, 10),
+ new MaterialStack(Materials.Nitrogen, 2),
+ new MaterialStack(Materials.Oxygen, 2))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1)))
+ .constructMaterial(); // C15H10N2O2
+ public static Materials Butyraldehyde = new MaterialBuilder(793, TextureSet.SET_FLUID, "Butyraldehyde")
+ .setName("Butyraldehyde")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(176)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 4),
+ new MaterialStack(Materials.Hydrogen, 8),
+ new MaterialStack(Materials.Oxygen, 1))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1)))
+ .constructMaterial(); // C4H8O
+ public static Materials Isobutyraldehyde = new MaterialBuilder(792, TextureSet.SET_FLUID, "Isobutyraldehyde")
+ .setName("Isobutyraldehyde")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(208)
+ .setExtraData(1)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 4),
+ new MaterialStack(Materials.Hydrogen, 8),
+ new MaterialStack(Materials.Oxygen, 1))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1)))
+ .constructMaterial(); // C4H8O
+ public static Materials NickelTetracarbonyl = new MaterialBuilder(791, TextureSet.SET_FLUID, "Nickel Tetracarbonyl")
+ .setName("NickelTetracarbonyl")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(256)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 4),
+ new MaterialStack(Materials.Nickel, 1),
+ new MaterialStack(Materials.Oxygen, 4))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1)))
+ .constructMaterial(); // C4NiO4
+ public static Materials KevlarCatalyst = new MaterialBuilder(790, TextureSet.SET_DULL, "Polyurethane Catalyst A")
+ .setName("PolyurethaneCatalystADust")
+ .addDustItems()
+ .setRGB(50, 50, 50)
+ .setColor(Dyes.dyeBlack)
+ .setMeltingPoint(300)
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1)))
+ .constructMaterial();
+ public static Materials EthyleneOxide = new MaterialBuilder(789, TextureSet.SET_FLUID, "Ethylene Oxide")
+ .setName("EthyleneOxide")
+ .addCell()
+ .addGas()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(160)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 2),
+ new MaterialStack(Materials.Hydrogen, 4),
+ new MaterialStack(Materials.Oxygen, 1))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1)))
+ .constructMaterial(); // C2H4O
+ public static Materials SiliconOil = new MaterialBuilder(788, TextureSet.SET_FLUID, "Silicon Oil")
+ .setName("SiliconOil")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(473)
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1)))
+ .constructMaterial();
+ public static Materials Ethyleneglycol = new MaterialBuilder(787, TextureSet.SET_FLUID, "Ethylene Glycol")
+ .setName("EthyleneGlycol")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(260)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 2),
+ new MaterialStack(Materials.Hydrogen, 6),
+ new MaterialStack(Materials.Oxygen, 2))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1)))
+ .constructMaterial(); // C2H6O2
+ public static Materials Acetaldehyde = new MaterialBuilder(786, TextureSet.SET_FLUID, "Acetaldehyde")
+ .setName("Acetaldehyde")
+ .addCell()
+ .addGas()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(150)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 2),
+ new MaterialStack(Materials.Hydrogen, 4),
+ new MaterialStack(Materials.Oxygen, 1))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1)))
+ .constructMaterial(); // C2H4O
+ public static Materials Pentaerythritol = new MaterialBuilder(785, TextureSet.SET_DULL, "Pentaerythritol")
+ .setName("Pentaerythritol")
+ .addDustItems()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(533)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 5),
+ new MaterialStack(Materials.Hydrogen, 12),
+ new MaterialStack(Materials.Oxygen, 4))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1)))
+ .constructMaterial(); // C5H12O4
+ public static Materials PolyurethaneResin = new MaterialBuilder(784, TextureSet.SET_FLUID, "Polyurethane Resin")
+ .setName("PolyurethaneResin")
+ .addCell()
+ .addFluid()
+ .setRGB(230, 230, 120)
+ .setColor(Dyes.dyeYellow)
+ .constructMaterial();
+ public static Materials NMethylIIPyrrolidone = new MaterialBuilder(
+ 783,
+ TextureSet.SET_FLUID,
+ "N-Methyl-2-pyrrolidone").setName("NMethylpyrolidone")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(249)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 5),
+ new MaterialStack(Materials.Hydrogen, 9),
+ new MaterialStack(Materials.Nitrogen, 1),
+ new MaterialStack(Materials.Oxygen, 1))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1)))
+ .constructMaterial(); // C5H9NO
+ public static Materials TerephthaloylChloride = new MaterialBuilder(
+ 782,
+ TextureSet.SET_POWDER,
+ "Terephthaloyl Chloride").setName("TerephthaloylChloride")
+ .addDustItems()
+ .setRGB(0, 255, 12)
+ .setColor(Dyes.dyeGreen)
+ .setMeltingPoint(355)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 8),
+ new MaterialStack(Materials.Hydrogen, 4),
+ new MaterialStack(Materials.Chlorine, 2),
+ new MaterialStack(Materials.Oxygen, 2))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1)))
+ .constructMaterial(); // C8H4Cl2O2
+ public static Materials Acetylene = new MaterialBuilder(781, TextureSet.SET_FLUID, "Acetylene").setName("Acetylene")
+ .addCell()
+ .addGas()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(192)
+ .setMaterialList(new MaterialStack(Materials.Carbon, 2), new MaterialStack(Materials.Hydrogen, 2))
+ .constructMaterial(); // C2H2
+ // TODO
+ // Add
+ // to
+ // JUPITER
+ // Athmosphere
+ // and
+ // Enceladus
+ // and
+ // to
+ // moon
+ // of
+ // Saturn
+ public static Materials IVNitroaniline = new MaterialBuilder(780, TextureSet.SET_FLUID, "4-Nitroaniline")
+ .setName("4Nitroaniline")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 135, 51)
+ .setColor(Dyes.dyeOrange)
+ .setMeltingPoint(420)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 6),
+ new MaterialStack(Materials.Hydrogen, 6),
+ new MaterialStack(Materials.Nitrogen, 2),
+ new MaterialStack(Materials.Oxygen, 2))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1)))
+ .constructMaterial(); // C6H6N2O2
+ public static Materials ParaPhenylenediamine = new MaterialBuilder(
+ 779,
+ TextureSet.SET_POWDER,
+ "para-Phenylenediamine").setName("pPhenylenediamine")
+ .addDustItems()
+ .setRGB(251, 236, 93)
+ .setColor(Dyes.dyeYellow)
+ .setMeltingPoint(293)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 6),
+ new MaterialStack(Materials.Hydrogen, 8),
+ new MaterialStack(Materials.Nitrogen, 2))
+ .setAspects(
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1)))
+ .constructMaterial(); // C6H6N2
+ public static Materials Methylamine = new MaterialBuilder(778, TextureSet.SET_FLUID, "Methylamine")
+ .setName("Methylamine")
+ .addCell()
+ .addGas()
+ .setRGB(65, 68, 105)
+ .setColor(Dyes.dyeGray)
+ .setMeltingPoint(180)
+ .setExtraData(1)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 1),
+ new MaterialStack(Materials.Hydrogen, 5),
+ new MaterialStack(Materials.Nitrogen, 1))
+ .constructMaterial(); // CH5N
+ public static Materials Trimethylamine = new MaterialBuilder(777, TextureSet.SET_FLUID, "Trimethylamine")
+ .setName("Trimethylamine")
+ .addCell()
+ .addGas()
+ .setRGB(105, 68, 105)
+ .setColor(Dyes.dyeGray)
+ .setMeltingPoint(156)
+ .setExtraData(1)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 3),
+ new MaterialStack(Materials.Hydrogen, 9),
+ new MaterialStack(Materials.Nitrogen, 1))
+ .constructMaterial(); // C3H9N
+ public static Materials GammaButyrolactone = new MaterialBuilder(776, TextureSet.SET_FLUID, "gamma-Butyrolactone")
+ .setName("GammaButyrolactone")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 255, 151)
+ .setColor(Dyes.dyeYellow)
+ .setMeltingPoint(229)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 4),
+ new MaterialStack(Materials.Hydrogen, 6),
+ new MaterialStack(Materials.Oxygen, 2))
+ .constructMaterial(); // C4H6O2
+ public static Materials CalciumCarbide = new MaterialBuilder(775, TextureSet.SET_DULL, "Calcium Carbide")
+ .setName("CacliumCarbide")
+ .addDustItems()
+ .setRGB(235, 235, 235)
+ .setColor(Dyes.dyeGray)
+ .setMeltingPoint(2430)
+ .setMaterialList(new MaterialStack(Materials.Calcium, 1), new MaterialStack(Materials.Carbon, 2))
+ .constructMaterial(); // CaC2
+ public static Materials LiquidCrystalKevlar = new MaterialBuilder(
+ 774,
+ TextureSet.SET_FLUID,
+ "Liquid Crystal Kevlar").setName("LiquidCrystalKevlar")
+ .addCell()
+ .addFluid()
+ .setRGB(240, 240, 120)
+ .setColor(Dyes.dyeYellow)
+ .constructMaterial(); // [-CO-C6H4-CO-NH-C6H4-NH-]n
+ public static Materials IIButinIIVdiol = new MaterialBuilder(773, TextureSet.SET_POWDER, "2-Butin-1,4-diol")
+ .setName("2Butin14diol")
+ .addDustItems()
+ .setRGB(247, 247, 180)
+ .setColor(Dyes.dyeYellow)
+ .setMeltingPoint(331)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 4),
+ new MaterialStack(Materials.Hydrogen, 6),
+ new MaterialStack(Materials.Oxygen, 2))
+ .constructMaterial(); // C4H6O2
+ public static Materials NickelAluminide = new MaterialBuilder(772, TextureSet.SET_METALLIC, "Nickel Aluminide")
+ .setName("NickelAluminide")
+ .addDustItems()
+ .addMetalItems()
+ .setRGB(230, 230, 230)
+ .setColor(Dyes.dyeGray)
+ .setMeltingPoint(1668)
+ .setBlastFurnaceTemp(1668)
+ .setBlastFurnaceRequired(true)
+ .setMaterialList(new MaterialStack(Materials.Nickel, 1), new MaterialStack(Materials.Aluminium, 3))
+ .constructMaterial()
+ .disableAutoGeneratedBlastFurnaceRecipes(); // NiAl3
+ public static Materials RaneyNickelActivated = new MaterialBuilder(771, TextureSet.SET_POWDER, "Raney Nickel")
+ .setName("RaneyNickelActivated")
+ .addDustItems()
+ .setRGB(230, 230, 230)
+ .setColor(Dyes.dyeGray)
+ .setMeltingPoint(1955)
+ .setMaterialList(new MaterialStack(Materials.Nickel, 1), new MaterialStack(Materials.Aluminium, 1))
+ .constructMaterial(); // NiAl
+ public static Materials BismuthIIIOxide = new MaterialBuilder(769, TextureSet.SET_POWDER, "Bismuth Oxide")
+ .setName("BismuthIIIOxide")
+ .addDustItems()
+ .setRGB(50, 50, 50)
+ .setColor(Dyes.dyeBlack)
+ .setMeltingPoint(1090)
+ .setMaterialList(new MaterialStack(Materials.Bismuth, 2), new MaterialStack(Materials.Oxygen, 3))
+ .constructMaterial(); // Bi2O3
+ public static Materials ThionylChloride = new MaterialBuilder(768, TextureSet.SET_FLUID, "Thionyl Chloride")
+ .setName("ThionylChloride")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .constructMaterial(); // SOCl2
+ public static Materials SulfurDichloride = new MaterialBuilder(767, TextureSet.SET_FLUID, "Sulfur Dichloride")
+ .setName("SulfurDichloride")
+ .addCell()
+ .addFluid()
+ .setRGB(200, 0, 0)
+ .setColor(Dyes.dyeRed)
+ .constructMaterial(); // SCl2
+ public static Materials DimethylTerephthalate = new MaterialBuilder(
+ 766,
+ TextureSet.SET_FLUID,
+ "Dimethyl Terephthalate").setName("DimethylTerephthalate")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(415)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 10),
+ new MaterialStack(Materials.Hydrogen, 10),
+ new MaterialStack(Materials.Oxygen, 4))
+ .constructMaterial(); // C10H10O4
+ public static Materials Kevlar = new MaterialBuilder(765, TextureSet.SET_DULL, "Kevlar").setName("Kevlar")
+ .addDustItems()
+ .addMetalItems()
+ .addGearItems()
+ .setRGB(240, 240, 120)
+ .setColor(Dyes.dyeYellow)
+ .constructMaterial();
+ public static Materials TerephthalicAcid = new MaterialBuilder(764, TextureSet.SET_FLUID, "Terephthalic Acid")
+ .setName("TerephthalicAcid")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(480)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 8L),
+ new MaterialStack(Materials.Hydrogen, 6),
+ new MaterialStack(Materials.Oxygen, 4))
+ .constructMaterial(); // C9H6O6
+ public static Materials IIIDimethylbenzene = new MaterialBuilder(763, TextureSet.SET_FLUID, "1,3-Dimethylbenzene")
+ .addCell()
+ .addFluid()
+ .setRGB(112, 146, 74)
+ .setColor(Dyes.dyeLime)
+ .setMeltingPoint(225)
+ .setMaterialList(new MaterialStack(Materials.Carbon, 8), new MaterialStack(Materials.Hydrogen, 10))
+ .addElectrolyzerRecipe()
+ .constructMaterial(); // C8H10
+ public static Materials IVDimethylbenzene = new MaterialBuilder(762, TextureSet.SET_FLUID, "1,4-Dimethylbenzene")
+ .addCell()
+ .addFluid()
+ .setRGB(122, 136, 84)
+ .setColor(Dyes.dyeLime)
+ .setMeltingPoint(286)
+ .setMaterialList(new MaterialStack(Materials.Carbon, 8), new MaterialStack(Materials.Hydrogen, 10))
+ .addElectrolyzerRecipe()
+ .constructMaterial(); // C8H10
+ public static Materials CobaltIINaphthenate = new MaterialBuilder(761, TextureSet.SET_DULL, "Cobalt II Naphthenate")
+ .setName("Cobalt(II)Naphthenate")
+ .addDustItems()
+ .setRGB(143, 95, 39)
+ .setColor(Dyes.dyeBrown)
+ .setMeltingPoint(413)
+ .setMaterialList(
+ new MaterialStack(Materials.Cobalt, 1),
+ new MaterialStack(Materials.Carbon, 22),
+ new MaterialStack(Materials.Hydrogen, 14),
+ new MaterialStack(Materials.Oxygen, 4))
+ .constructMaterial(); // CoC22H14O4
+ public static Materials NaphthenicAcid = new MaterialBuilder(760, TextureSet.SET_FLUID, "Naphthenic Acid")
+ .setName("NaphthenicAcid")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setFuelType(MaterialBuilder.SEMIFLUID)
+ .setFuelPower(80)
+ .constructMaterial();
+ public static Materials CobaltIIHydroxide = new MaterialBuilder(759, TextureSet.SET_POWDER, "Cobalt II Hydroxide")
+ .setName("CobaltIIHydroxide")
+ .addDustItems()
+ .setRGB(229, 140, 239)
+ .setColor(Dyes.dyePurple)
+ .setMeltingPoint(441)
+ .setMaterialList(
+ new MaterialStack(Materials.Cobalt, 1),
+ new MaterialStack(Materials.Hydrogen, 2),
+ new MaterialStack(Materials.Oxygen, 2))
+ .constructMaterial(); // CoH2O2
+ public static Materials CobaltIIAcetate = new MaterialBuilder(758, TextureSet.SET_POWDER, "Cobalt II Acetate")
+ .setName("Cobalt(II)Acetate")
+ .addDustItems()
+ .setRGB(219, 162, 229)
+ .setColor(Dyes.dyePurple)
+ .setMeltingPoint(413)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 4L),
+ new MaterialStack(Materials.Hydrogen, 6),
+ new MaterialStack(Materials.Cobalt, 1),
+ new MaterialStack(Materials.Oxygen, 4))
+ .constructMaterial(); // C4H6CoO4
+ public static Materials CobaltIINitrate = new MaterialBuilder(757, TextureSet.SET_POWDER, "Cobalt II Nitrate")
+ .setName("Cobalt(II)Nitrate")
+ .addDustItems()
+ .setRGB(170, 0, 0)
+ .setColor(Dyes.dyeRed)
+ .setMeltingPoint(373)
+ .setMaterialList(
+ new MaterialStack(Materials.Cobalt, 1),
+ new MaterialStack(Materials.Nitrogen, 2),
+ new MaterialStack(Materials.Oxygen, 6))
+ .constructMaterial(); // Co(NO3)2
+ public static Materials OrganorhodiumCatalyst = new MaterialBuilder(
+ 756,
+ TextureSet.SET_POWDER,
+ "Organorhodium Catalyst").setName("OrganorhodiumCatalyst")
+ .addDustItems()
+ .setRGB(170, 0, 0)
+ .setColor(Dyes.dyeRed)
+ .setMeltingPoint(373)
+ .setMaterialList(new MaterialStack(Materials.Cobalt, 1), new MaterialStack(Materials.NitricAcid, 2))
+ .constructMaterial(); // RhHCO(P(C6H5)3)3
+ public static Materials SodiumBorohydride = new MaterialBuilder(755, TextureSet.SET_POWDER, "Sodium Borohydride")
+ .setName("SodiumBorohydride")
+ .addDustItems()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(673)
+ .setMaterialList(
+ new MaterialStack(Materials.Sodium, 1),
+ new MaterialStack(Materials.Boron, 1),
+ new MaterialStack(Materials.Hydrogen, 4))
+ .constructMaterial(); // NaBH4
+ public static Materials RhodiumChloride = new MaterialBuilder(754, TextureSet.SET_POWDER, "Rhodium Chloride")
+ .setName("RhodiumChloride")
+ .addDustItems()
+ .setRGB(128, 0, 0)
+ .setColor(Dyes.dyeRed)
+ .setMeltingPoint(723)
+ .constructMaterial(); // RHCL3
+ public static Materials Triphenylphosphene = new MaterialBuilder(753, TextureSet.SET_POWDER, "Triphenylphosphine")
+ .setName("Triphenylphosphene")
+ .addDustItems()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(353)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 18L),
+ new MaterialStack(Materials.Hydrogen, 15L),
+ new MaterialStack(Materials.Phosphorus, 1L))
+ .constructMaterial(); // C18H15P
+ public static Materials PhosphorusTrichloride = new MaterialBuilder(
+ 752,
+ TextureSet.SET_FLUID,
+ "Phosphorus Trichloride").setName("PhosphorusTrichloride")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(179)
+ .setMaterialList(new MaterialStack(Materials.Phosphorus, 1L), new MaterialStack(Materials.Chlorine, 3L))
+ .constructMaterial(); // PCL3
+ public static Materials SodiumHydride = new MaterialBuilder(751, TextureSet.SET_POWDER, "Sodium Hydride")
+ .setName("SodiumHydride")
+ .addDustItems()
+ .setRGB(192, 192, 192)
+ .setColor(Dyes.dyeLightGray)
+ .setMeltingPoint(911)
+ .setMaterialList(new MaterialStack(Materials.Sodium, 1L), new MaterialStack(Materials.Hydrogen, 1L))
+ .constructMaterial(); // NaH
+ public static Materials TrimethylBorate = new MaterialBuilder(750, TextureSet.SET_FLUID, "Trimethyl Borate")
+ .setName("TrimethylBorate")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(239)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 3L),
+ new MaterialStack(Materials.Hydrogen, 9L),
+ new MaterialStack(Materials.Boron, 1L),
+ new MaterialStack(Materials.Oxygen, 3L))
+ .constructMaterial(); // C3H9BO3
+ public static Materials SodiumMethoxide = new MaterialBuilder(749, TextureSet.SET_POWDER, "Sodium Methoxide")
+ .setName("SodiumMethoxide")
+ .addDustItems()
+ .setRGB(255, 255, 255)
+ .setColor(Dyes.dyeWhite)
+ .setMeltingPoint(400)
+ .setMaterialList(
+ new MaterialStack(Materials.Carbon, 1L),
+ new MaterialStack(Materials.Hydrogen, 3L),
+ new MaterialStack(Materials.Oxygen, 1L),
+ new MaterialStack(Materials.Sodium, 1L))
+ .constructMaterial(); // CH3NaO
+
+ // H3RhCl6
+
+ /**
+ * This method is called by Materials. It can be safely called multiple times.
+ * It exists to allow Materials ensure this class is initialized.
+ */
+ public static void init() {
+ // no-op. all work is done by <clinit>
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/MaterialsOreAlum.java b/src/main/java/gregtech/api/enums/MaterialsOreAlum.java
new file mode 100644
index 0000000000..270d794f94
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/MaterialsOreAlum.java
@@ -0,0 +1,80 @@
+package gregtech.api.enums;
+
+public class MaterialsOreAlum {
+
+ public static Materials BauxiteSlurry = new MaterialBuilder(409, TextureSet.SET_FLUID, "Bauxite Slurry")
+ .setName("BauxiteSlurry")
+ .addCell()
+ .addFluid()
+ .setRGB(37, 67, 168)
+ .setMeltingPoint(295)
+ .setColor(Dyes.dyeBlue)
+ .constructMaterial();
+ public static Materials HeatedBauxiteSlurry = new MaterialBuilder(
+ 410,
+ TextureSet.SET_FLUID,
+ "Heated Bauxite Slurry").setName("HeadedBauxiteSlurry")
+ .addCell()
+ .addFluid()
+ .setRGB(55, 92, 212)
+ .setLiquidTemperature(533)
+ .setMeltingPoint(295)
+ .setColor(Dyes.dyeBlue)
+ .constructMaterial();
+ public static Materials SluiceJuice = new MaterialBuilder(411, TextureSet.SET_FLUID, "Sluice Juice")
+ .setName("SluiceJuice")
+ .addCell()
+ .addFluid()
+ .setRGB(92, 60, 36)
+ .setLiquidTemperature(295)
+ .setMeltingPoint(295)
+ .setColor(Dyes.dyeGray)
+ .constructMaterial();
+ public static Materials SluiceSand = new MaterialBuilder(412, TextureSet.SET_FINE, "Sluice Sand")
+ .setName("SluiceSand")
+ .addDustItems()
+ .setRGB(165, 165, 120)
+ .setColor(Dyes.dyeGray)
+ .constructMaterial();
+ public static Materials BauxiteSlag = new MaterialBuilder(413, TextureSet.SET_FINE, "Bauxite Slag")
+ .setName("BauxiteSlag")
+ .addDustItems()
+ .setRGB(110, 31, 31)
+ .setColor(Dyes.dyeRed)
+ .constructMaterial();
+ public static Materials IlmeniteSlag = new MaterialBuilder(414, TextureSet.SET_FINE, "Ilmenite Slag")
+ .setName("IlmeniteSlag")
+ .addDustItems()
+ .setRGB(163, 38, 38)
+ .setColor(Dyes.dyeBrown)
+ .constructMaterial();
+ public static Materials GreenSapphireJuice = new MaterialBuilder(415, TextureSet.SET_FLUID, "Green Sapphire Juice")
+ .setName("GreenSapphireJuice")
+ .addCell()
+ .addFluid()
+ .setRGB(100, 200, 130)
+ .setColor(Dyes.dyeGreen)
+ .constructMaterial();
+ public static Materials SapphireJuice = new MaterialBuilder(416, TextureSet.SET_FLUID, "Sapphire Juice")
+ .setName("SapphireJuice")
+ .addCell()
+ .addFluid()
+ .setRGB(100, 100, 200)
+ .setColor(Dyes.dyeBlue)
+ .constructMaterial();
+ public static Materials RubyJuice = new MaterialBuilder(417, TextureSet.SET_FLUID, "Ruby Juice")
+ .setName("RubyJuice")
+ .addCell()
+ .addFluid()
+ .setRGB(255, 100, 100)
+ .setColor(Dyes.dyeRed)
+ .constructMaterial();
+
+ /**
+ * called by Materials. Can be safely called multiple times. exists to allow Materials ensure this class is
+ * initialized
+ */
+ public static void init() {
+ // no-op. all work is done by <clinit>
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/MaterialsUEVplus.java b/src/main/java/gregtech/api/enums/MaterialsUEVplus.java
new file mode 100644
index 0000000000..1ff8cc2fb0
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/MaterialsUEVplus.java
@@ -0,0 +1,600 @@
+package gregtech.api.enums;
+
+import java.util.Collections;
+
+public class MaterialsUEVplus {
+
+ public static Materials DimensionallyTranscendentCrudeCatalyst = new Materials(
+ 748,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 10,
+ 20,
+ 20,
+ 1,
+ "DimensionallyTranscendentCrudeCatalyst",
+ "Dimensionally Transcendent Crude Catalyst",
+ 0,
+ 0,
+ 25_000_000,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeCyan).setHasCorrespondingFluid(true);
+ public static Materials DimensionallyTranscendentProsaicCatalyst = new Materials(
+ 747,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 10,
+ 20,
+ 20,
+ 1,
+ "DimensionallyTranscendentProsaicCatalyst",
+ "Dimensionally Transcendent Prosaic Catalyst",
+ 0,
+ 0,
+ 50_000_000,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeGreen).setHasCorrespondingFluid(true);
+ public static Materials DimensionallyTranscendentResplendentCatalyst = new Materials(
+ 746,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 10,
+ 20,
+ 20,
+ 1,
+ "DimensionallyTranscendentResplendentCatalyst",
+ "Dimensionally Transcendent Resplendent Catalyst",
+ 0,
+ 0,
+ 75_000_000,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeLime).setHasCorrespondingFluid(true);
+ public static Materials DimensionallyTranscendentExoticCatalyst = new Materials(
+ 745,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 10,
+ 20,
+ 20,
+ 1,
+ "DimensionallyTranscendentExoticCatalyst",
+ "Dimensionally Transcendent Exotic Catalyst",
+ 0,
+ 0,
+ 100_000_000,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeMagenta).setHasCorrespondingFluid(true);
+ public static Materials DimensionallyTranscendentStellarCatalyst = new Materials(
+ 130,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 10,
+ 20,
+ 20,
+ 1,
+ "DimensionallyTranscendentStellarCatalyst",
+ "Dimensionally Transcendent Stellar Catalyst",
+ 0,
+ 0,
+ 100_000_000,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeOrange).setHasCorrespondingFluid(true);
+
+ public static Materials ExcitedDTCC = new Materials(
+ 109,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 10,
+ 20,
+ 20,
+ 1,
+ "ExcitedDTCC",
+ "Excited Dimensionally Transcendent Crude Catalyst",
+ -1,
+ -1,
+ 500000000,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeCyan);
+ public static Materials ExcitedDTPC = new Materials(
+ 113,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 35,
+ 59,
+ 41,
+ 1,
+ "ExcitedDTPC",
+ "Excited Dimensionally Transcendent Prosaic Catalyst",
+ -1,
+ -1,
+ 500000000,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeGreen);
+ public static Materials ExcitedDTRC = new Materials(
+ 121,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 38,
+ 20,
+ 56,
+ 1,
+ "ExcitedDTRC",
+ "Excited Dimensionally Transcendent Resplendent Catalyst",
+ -1,
+ -1,
+ 500000000,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeLime);
+ public static Materials ExcitedDTEC = new Materials(
+ 126,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 240,
+ 240,
+ 41,
+ 1,
+ "ExcitedDTEC",
+ "Excited Dimensionally Transcendent Exotic Catalyst",
+ -1,
+ -1,
+ 500000000,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeMagenta);
+ public static Materials ExcitedDTSC = new Materials(
+ 127,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 126,
+ 75,
+ 11,
+ 1,
+ "ExcitedDTSC",
+ "Excited Dimensionally Transcendent Stellar Catalyst",
+ -1,
+ -1,
+ 500000000,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeOrange);
+
+ public static Materials DimensionallyTranscendentResidue = new Materials(
+ 589,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 0,
+ 0,
+ 0,
+ 1,
+ "DimensionallyTranscendentResidue",
+ "Dimensionally Transcendent Residue",
+ -1,
+ -1,
+ 25,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeBlack);
+
+ public static Materials SpaceTime = new Materials(
+ 588,
+ new TextureSet("spacetime", true),
+ 320.0F,
+ 4 * 2621440,
+ 25,
+ 1 | 2 | 64 | 128,
+ 255,
+ 255,
+ 255,
+ 0,
+ "SpaceTime",
+ "SpaceTime",
+ -1,
+ -1,
+ 0,
+ 0,
+ false,
+ true,
+ 2,
+ 1,
+ 1,
+ Dyes._NULL,
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1)))
+ .setProcessingMaterialTierEU(TierEU.RECIPE_UEV)
+ .disableAutoGeneratedBlastFurnaceRecipes()
+ .disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials TranscendentMetal = new Materials(
+ 581,
+ TextureSet.SET_METALLIC,
+ 290.0F,
+ 3 * 2621440,
+ 22,
+ 1 | 2 | 64 | 128,
+ 50,
+ 50,
+ 50,
+ 0,
+ "TranscendentMetal",
+ "Transcendent Metal",
+ -1,
+ -1,
+ 0,
+ 3000,
+ true,
+ true,
+ 200,
+ 1000,
+ 1000,
+ Dyes.dyeBlack,
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1)))
+ .disableAutoGeneratedBlastFurnaceRecipes()
+ .disableAutoGeneratedVacuumFreezerRecipe()
+ .setProcessingMaterialTierEU(TierEU.RECIPE_UHV);
+ public static Materials MagnetohydrodynamicallyConstrainedStarMatter = new Materials(
+ 583,
+ new TextureSet("MagnetohydrodynamicallyConstrainedStarMatter", true),
+ 320.0F,
+ 4 * 2621440,
+ 25,
+ 1 | 2 | 64 | 128,
+ 255,
+ 255,
+ 255,
+ 0,
+ "MagnetohydrodynamicallyConstrainedStarMatter",
+ "Magnetohydrodynamically Constrained Star Matter",
+ -1,
+ -1,
+ 0,
+ 0,
+ false,
+ true,
+ 2,
+ 1,
+ 1,
+ Dyes._NULL,
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1)))
+ .setProcessingMaterialTierEU(TierEU.RECIPE_UIV);
+ public static Materials RawStarMatter = new Materials(
+ 584,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16 | 32,
+ 100,
+ 1,
+ 255,
+ 255,
+ "RawStarMatter",
+ "Condensed Raw Stellar Plasma Mixture",
+ -1,
+ -1,
+ 0,
+ 0,
+ false,
+ false,
+ 200,
+ 1,
+ 1,
+ Dyes.dyePurple);
+ public static Materials WhiteDwarfMatter = new Materials(
+ 585,
+ new TextureSet("WhiteDwarfMatter", true),
+ 1.0F,
+ 0,
+ 2,
+ 1 | 2 | 64 | 128,
+ 255,
+ 255,
+ 255,
+ 0,
+ "WhiteDwarfMatter",
+ "White Dwarf Matter",
+ -1,
+ -1,
+ 0,
+ 0,
+ false,
+ false,
+ 200,
+ 1,
+ 1,
+ Dyes.dyePurple).setHasCorrespondingFluid(true)
+ .setProcessingMaterialTierEU(TierEU.RECIPE_UEV)
+ .disableAutoGeneratedBlastFurnaceRecipes()
+ .disableAutoGeneratedVacuumFreezerRecipe();
+ public static Materials BlackDwarfMatter = new Materials(
+ 586,
+ TextureSet.SET_METALLIC,
+ 1.0F,
+ 0,
+ 2,
+ 1 | 2 | 64 | 128,
+ 0,
+ 0,
+ 0,
+ 255,
+ "BlackDwarfMatter",
+ "Black Dwarf Matter",
+ -1,
+ -1,
+ 0,
+ 0,
+ false,
+ false,
+ 200,
+ 1,
+ 1,
+ Dyes.dyePurple).setHasCorrespondingFluid(true)
+ .setProcessingMaterialTierEU(TierEU.RECIPE_UEV)
+ .disableAutoGeneratedBlastFurnaceRecipes()
+ .disableAutoGeneratedVacuumFreezerRecipe();
+
+ public static Materials Time = new Materials(
+ 587,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16 | 32,
+ 100,
+ 1,
+ 255,
+ 255,
+ "temporalFluid",
+ "Tachyon Rich Temporal Fluid",
+ -1,
+ -1,
+ 0,
+ 0,
+ false,
+ false,
+ 200,
+ 1,
+ 1,
+ Dyes.dyePurple);
+ public static Materials Space = new Materials(
+ 106,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16 | 32,
+ 100,
+ 1,
+ 255,
+ 255,
+ "spatialFluid",
+ "Spatially Enlarged Fluid",
+ -1,
+ -1,
+ 0,
+ 0,
+ false,
+ false,
+ 200,
+ 1,
+ 1,
+ Dyes.dyePurple);
+
+ public static Materials Universium = new Materials(
+ 139,
+ new TextureSet("universium", true),
+ 1.0F,
+ 4 * 2621440,
+ 25,
+ 1 | 2 | 64 | 128,
+ 38,
+ 49,
+ 69,
+ 255,
+ "Universium",
+ "Universium",
+ -1,
+ -1,
+ 0,
+ 0,
+ false,
+ true,
+ 2,
+ 1,
+ 1,
+ Dyes._NULL,
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1)))
+ .setProcessingMaterialTierEU(TierEU.RECIPE_UMV);
+
+ public static Materials Eternity = new Materials(
+ 141,
+ new TextureSet("eternity", true),
+ 1.0F,
+ 8 * 2621440,
+ 26,
+ 1 | 2 | 64 | 128,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Eternity",
+ "Eternity",
+ -1,
+ -1,
+ 0,
+ 14000,
+ true,
+ false,
+ 2,
+ 1,
+ 1,
+ Dyes._NULL,
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1)))
+ .disableAutoGeneratedBlastFurnaceRecipes()
+ .disableAutoGeneratedVacuumFreezerRecipe()
+ .setProcessingMaterialTierEU(TierEU.RECIPE_UMV);
+
+ public static Materials PrimordialMatter = new Materials(
+ 142,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 255,
+ 255,
+ 255,
+ 0,
+ "PrimordialMatter",
+ "Liquid Primordial Matter",
+ -1,
+ -1,
+ 2_000_000_000,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes.dyeBlue);
+
+ public static Materials MagMatter = new Materials(
+ 143,
+ new TextureSet("magmatter", true),
+ 1.0F,
+ 64 * 2621440,
+ 26,
+ 1 | 2 | 64 | 128,
+ 255,
+ 255,
+ 255,
+ 0,
+ "Magmatter",
+ "Magmatter",
+ -1,
+ -1,
+ 0,
+ 25000,
+ true,
+ false,
+ 2,
+ 1,
+ 1,
+ Dyes._NULL,
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1)))
+ .setProcessingMaterialTierEU(TierEU.RECIPE_UMV);
+
+ public static Materials QuarkGluonPlasma = new Materials(
+ 144,
+ TextureSet.SET_FLUID,
+ 1.0F,
+ 0,
+ 2,
+ 16,
+ 255,
+ 255,
+ 255,
+ 0,
+ "QuarkGluonPlasma",
+ "Degenerate Quark Gluon Plasma",
+ -1,
+ -1,
+ 2_000_000_000,
+ 1,
+ false,
+ true,
+ 1,
+ 1,
+ 1,
+ Dyes._NULL);
+
+ /**
+ * called by Materials. Can be safely called multiple times. exists to allow Materials ensure this class is
+ * initialized
+ */
+ public static void init() {
+ // no-op. all work is done by <clinit>
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java b/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java
new file mode 100644
index 0000000000..d32cb781e2
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java
@@ -0,0 +1,688 @@
+package gregtech.api.enums;
+
+/*
+ * No more magic numbers about TE's IDs. Yay!!!
+ * The entries are sorted by ID, so if you need to take one,
+ * please, pretty please, insert it at the correct place.
+ */
+public enum MetaTileEntityIDs {
+
+ HULL_BRONZE(1),
+ HULL_BRICKED_BRONZE(2),
+ HULL_STEEL(3),
+ HULL_WROUGHT_IRON(4),
+ HULL_ULV(10),
+ HULL_LV(11),
+ HULL_MV(12),
+ HULL_HV(13),
+ HULL_EV(14),
+ HULL_IV(15),
+ HULL_LuV(16),
+ HULL_ZPM(17),
+ HULL_UV(18),
+ HULL_UHV(19),
+ transformer_LV_ULV(20),
+ transformer_MV_LV(21),
+ transformer_HV_MV(22),
+ transformer_EV_HV(23),
+ transformer_IV_EV(24),
+ transformer_LuV_IV(25),
+ transformer_ZPM_LuV(26),
+ transformer_UV_ZPM(27),
+ transformer_UHV_UV(28),
+ DYNAMO_HATCH_ULV(30),
+ DYNAMO_HATCH_LV(31),
+ DYNAMO_HATCH_MV(32),
+ DYNAMO_HATCH_HV(33),
+ DYNAMO_HATCH_EV(34),
+ DYNAMO_HATCH_IV(35),
+ DYNAMO_HATCH_LuV(36),
+ DYNAMO_HATCH_ZPM(37),
+ DYNAMO_HATCH_UV(38),
+ DYNAMO_HATCH_UHV(39),
+ ENERGY_HATCH_ULV(40),
+ ENERGY_HATCH_LV(41),
+ ENERGY_HATCH_MV(42),
+ ENERGY_HATCH_HV(43),
+ ENERGY_HATCH_EV(44),
+ ENERGY_HATCH_IV(45),
+ ENERGY_HATCH_LuV(46),
+ ENERGY_HATCH_ZPM(47),
+ ENERGY_HATCH_UV(48),
+ ENERGY_HATCH_UHV(49),
+ INPUT_HATCH_ULV(50),
+ INPUT_HATCH_LV(51),
+ INPUT_HATCH_MV(52),
+ INPUT_HATCH_HV(53),
+ INPUT_HATCH_EV(54),
+ INPUT_HATCH_IV(55),
+ INPUT_HATCH_LuV(56),
+ INPUT_HATCH_ZPM(57),
+ INPUT_HATCH_UV(58),
+ INPUT_HATCH_UHV(59),
+ OUTPUT_HATCH_ULV(60),
+ OUTPUT_HATCH_LV(61),
+ OUTPUT_HATCH_MV(62),
+ OUTPUT_HATCH_HV(63),
+ OUTPUT_HATCH_EV(64),
+ OUTPUT_HATCH_IV(65),
+ OUTPUT_HATCH_LuV(66),
+ OUTPUT_HATCH_ZPM(67),
+ OUTPUT_HATCH_UV(68),
+ OUTPUT_HATCH_UHV(69),
+ INPUT_BUS_ULV(70),
+ INPUT_BUS_LV(71),
+ INPUT_BUS_MV(72),
+ INPUT_BUS_HV(73),
+ INPUT_BUS_EV(74),
+ INPUT_BUS_IV(75),
+ INPUT_BUS_LuV(76),
+ INPUT_BUS_ZPM(77),
+ INPUT_BUS_UV(78),
+ INPUT_BUS_UHV(79),
+ OUTPUT_BUS_ULV(80),
+ OUTPUT_BUS_LV(81),
+ OUTPUT_BUS_MV(82),
+ OUTPUT_BUS_HV(83),
+ OUTPUT_BUS_EV(84),
+ OUTPUT_BUS_IV(85),
+ OUTPUT_BUS_LuV(86),
+ OUTPUT_BUS_ZPM(87),
+ OUTPUT_BUS_UV(88),
+ OUTPUT_BUS_UHV(89),
+ MAINTENANCE_HATCH(90),
+ MUFFLER_HATCH_LV(91),
+ MUFFLER_HATCH_MV(92),
+ MUFFLER_HATCH_HV(93),
+ MUFFLER_HATCH_EV(94),
+ MUFFLER_HATCH_IV(95),
+ MUFFLER_HATCH_LuV(96),
+ MUFFLER_HATCH_ZPM(97),
+ MUFFLER_HATCH_UV(98),
+ MUFFLER_HATCH_UHV(99),
+ SMALL_COAL_BOILER(100),
+ HIGH_PRESSURE_COAL_BOILER(101),
+ HIGH_PRESSURE_LAVA_BOILER(102),
+ STEAM_FURNACE(103),
+ HP_STEAM_FURNACE(104),
+ SIMPLE_SOLAR_BOILER(105),
+ STEAM_MACERATOR(106),
+ HP_STEAM_MACERATOR(107),
+ STEAM_EXTRACTOR(109),
+ HP_STEAM_EXTRACTOR(110),
+ AUTO_MAINTENANCE_HATCH(111),
+ STEAM_FORGE_HAMMER(112),
+ HP_STEAM_FORGE_HAMMER(113),
+ HIGH_PRESSURE_SOLAR_BOILER(114),
+ STEAM_COMPRESSOR(115),
+ HP_STEAM_COMPRESSOR(116),
+ STEAM_ALLOY_SMELTER(118),
+ HP_STEAM_ALLOY_SMELTER(119),
+ QUANTUM_TANK_LV(120),
+ QUANTUM_TANK_MV(121),
+ QUANTUM_TANK_HV(122),
+ QUANTUM_TANK_EV(123),
+ QUANTUM_TANK_IV(124),
+ QUANTUM_CHEST_LV(125),
+ QUANTUM_CHEST_MV(126),
+ QUANTUM_CHEST_HV(127),
+ QUANTUM_CHEST_EV(128),
+ QUANTUM_CHEST_IV(129),
+ SUPER_TANK_LV(130),
+ SUPER_TANK_MV(131),
+ SUPER_TANK_HV(132),
+ SUPER_TANK_EV(133),
+ SUPER_TANK_IV(134),
+ SUPER_CHEST_LV(135),
+ SUPER_CHEST_MV(136),
+ SUPER_CHEST_HV(137),
+ SUPER_CHEST_EV(138),
+ SUPER_CHEST_IV(139),
+ BRICKED_BLAST_FURNACE_CONTROLLER(140),
+ MULTILOCK_PUMP_MKII_CONTROLLER(141),
+ MULTILOCK_PUMP_MKIII_CONTROLLER(142),
+ CONCRETE_BACKFILLER_I_CONTROLLER(143),
+ CONCRETE_BACKFILLER_II_CONTROLLER(144),
+ DATA_ACCESS_HATCH(145),
+ ADVANCED_DATA_ACCESS_HATCH(146),
+ AUTOMATABLE_DATA_ACCESS_HATCH(147),
+ MULTIBLOCK_PUMP_INFINITE_CONTROLLER(148),
+ MULTILOCK_PUMP_MKIV_CONTROLLER(149),
+ LOCKER_ULV(150),
+ LOCKER_LV(151),
+ LOCKER_MV(152),
+ LOCKER_HV(153),
+ LOCKER_EV(154),
+ LOCKER_IV(155),
+ LOCKER_LuV(156),
+ LOCKER_ZPM(157),
+ LOCKER_UV(158),
+ LOCKER_UHV(159),
+ BATTERY_BUFFER_1_BY_1_ULV(160),
+ BATTERY_BUFFER_1_BY_1_LV(161),
+ BATTERY_BUFFER_1_BY_1_MV(162),
+ BATTERY_BUFFER_1_BY_1_HV(163),
+ BATTERY_BUFFER_1_BY_1_EV(164),
+ BATTERY_BUFFER_1_BY_1_IV(165),
+ BATTERY_BUFFER_1_BY_1_LuV(166),
+ BATTERY_BUFFER_1_BY_1_ZPM(167),
+ BATTERY_BUFFER_1_BY_1_UV(168),
+ BATTERY_BUFFER_1_BY_1_UHV(169),
+ BATTERY_BUFFER_2_BY_2_ULV(170),
+ BATTERY_BUFFER_2_BY_2_LV(171),
+ BATTERY_BUFFER_2_BY_2_MV(172),
+ BATTERY_BUFFER_2_BY_2_HV(173),
+ BATTERY_BUFFER_2_BY_2_EV(174),
+ BATTERY_BUFFER_2_BY_2_IV(175),
+ BATTERY_BUFFER_2_BY_2_LuV(176),
+ BATTERY_BUFFER_2_BY_2_ZPM(177),
+ BATTERY_BUFFER_2_BY_2_UV(178),
+ BATTERY_BUFFER_2_BY_2_UHV(179),
+ BATTERY_BUFFER_3_BY_3_ULV(180),
+ BATTERY_BUFFER_3_BY_3_LV(181),
+ BATTERY_BUFFER_3_BY_3_MV(182),
+ BATTERY_BUFFER_3_BY_3_HV(183),
+ BATTERY_BUFFER_3_BY_3_EV(184),
+ BATTERY_BUFFER_3_BY_3_IV(185),
+ BATTERY_BUFFER_3_BY_3_LuV(186),
+ BATTERY_BUFFER_3_BY_3_ZPM(187),
+ BATTERY_BUFFER_3_BY_3_UV(188),
+ BATTERY_BUFFER_3_BY_3_UHV(189),
+ BATTERY_BUFFER_4_BY_4_ULV(190),
+ BATTERY_BUFFER_4_BY_4_LV(191),
+ BATTERY_BUFFER_4_BY_4_MV(192),
+ BATTERY_BUFFER_4_BY_4_HV(193),
+ BATTERY_BUFFER_4_BY_4_EV(194),
+ BATTERY_BUFFER_4_BY_4_IV(195),
+ BATTERY_BUFFER_4_BY_4_LuV(196),
+ BATTERY_BUFFER_4_BY_4_ZPM(197),
+ BATTERY_BUFFER_4_BY_4_UV(198),
+ BATTERY_BUFFER_4_BY_4_UHV(199),
+ QUADRUPLE_INPUT_HATCHES_EV(200),
+ ALLOY_SMELTER_LV(201),
+ ALLOY_SMELTER_MV(202),
+ ALLOY_SMELTER_HV(203),
+ ALLOY_SMELTER_EV(204),
+ ALLOY_SMELTER_IV(205),
+ WIRELESS_HATCH_ENERGY_ULV(206),
+ WIRELESS_HATCH_ENERGY_LV(207),
+ WIRELESS_HATCH_ENERGY_MV(208),
+ WIRELESS_HATCH_ENERGY_HV(209),
+ ASSEMBLER_LV(211),
+ ASSEMBLER_MV(212),
+ ASSEMBLER_HV(213),
+ ASSEMBLER_EV(214),
+ ASSEMBLER_IV(215),
+ WIRELESS_HATCH_ENERGY_EV(216),
+ WIRELESS_HATCH_ENERGY_IV(217),
+ WIRELESS_HATCH_ENERGY_LuV(218),
+ WIRELESS_HATCH_ENERGY_ZPM(219),
+ BENDING_MACHINE_LV(221),
+ BENDING_MACHINE_MV(222),
+ BENDING_MACHINE_HV(223),
+ BENDING_MACHINE_EV(224),
+ BENDING_MACHINE_IV(225),
+ WIRELESS_HATCH_ENERGY_UV(227),
+ WIRELESS_HATCH_ENERGY_UHV(229),
+ CANNER_LV(231),
+ CANNER_MV(232),
+ CANNER_HV(233),
+ CANNER_EV(234),
+ CANNER_IV(235),
+ COMPRESSOR_LV(241),
+ COMPRESSOR_MV(242),
+ COMPRESSOR_HV(243),
+ COMPRESSOR_EV(244),
+ COMPRESSOR_IV(245),
+ CUTTING_MACHINE_LV(251),
+ CUTTING_MACHINE_MV(252),
+ CUTTING_MACHINE_HV(253),
+ CUTTING_MACHINE_EV(254),
+ CUTTING_MACHINE_IV(255),
+ ELECTRIC_FURNACE_LV(261),
+ ELECTRIC_FURNACE_MV(262),
+ ELECTRIC_FURNACE_HV(263),
+ ELECTRIC_FURNACE_EV(264),
+ ELECTRIC_FURNACE_IV(265),
+ WIRELESS_HATCH_ENERGY_UEV(266),
+ WIRELESS_HATCH_ENERGY_UIV(267),
+ WIRELESS_HATCH_ENERGY_UMV(268),
+ WIRELESS_HATCH_ENERGY_UXV(269),
+ EXTRACTOR_LV(271),
+ EXTRACTOR_MV(272),
+ EXTRACTOR_HV(273),
+ EXTRACTOR_EV(274),
+ EXTRACTOR_IV(275),
+ EXTRUDER_LV(281),
+ EXTRUDER_MV(282),
+ EXTRUDER_HV(283),
+ EXTRUDER_EV(284),
+ EXTRUDER_IV(285),
+ WIRELESS_HATCH_ENERGY_MAX(286),
+ WIRELESS_DYNAMO_ENERGY_HATCH_ULV(287),
+ WIRELESS_DYNAMO_ENERGY_HATCH_LV(288),
+ WIRELESS_DYNAMO_ENERGY_HATCH_MV(289),
+ LATHE_LV(291),
+ LATHE_MV(292),
+ LATHE_HV(293),
+ LATHE_EV(294),
+ LATHE_IV(295),
+ WIRELESS_DYNAMO_ENERGY_HATCH_HV(296),
+ WIRELESS_DYNAMO_ENERGY_HATCH_EV(297),
+ WIRELESS_DYNAMO_ENERGY_HATCH_IV(298),
+ WIRELESS_DYNAMO_ENERGY_HATCH_LuV(299),
+ MACERATOR_LV(301),
+ MACERATOR_MV(302),
+ MACERATOR_HV(303),
+ MACERATOR_EV(304),
+ MACERATOR_IV(305),
+ WIRELESS_DYNAMO_ENERGY_HATCH_ZPM(310),
+ MICROWAVE_OVEN_LV(311),
+ MICROWAVE_OVEN_MV(312),
+ MICROWAVE_OVEN_HV(313),
+ MICROWAVE_OVEN_EV(314),
+ MICROWAVE_OVEN_IV(315),
+ WIRELESS_DYNAMO_ENERGY_HATCH_UV(316),
+ WIRELESS_DYNAMO_ENERGY_HATCH_UHV(317),
+ WIRELESS_DYNAMO_ENERGY_HATCH_UEV(318),
+ WIRELESS_DYNAMO_ENERGY_HATCH_UIV(319),
+ PRINTER_LV(321),
+ PRINTER_MV(322),
+ PRINTER_HV(323),
+ PRINTER_EV(324),
+ PRINTER_IV(325),
+ PRINTER_LuV(326),
+ PRINTER_ZPM(327),
+ PRINTER_UV(328),
+ RECYCLER_LV(331),
+ RECYCLER_MV(332),
+ RECYCLER_HV(333),
+ RECYCLER_EV(334),
+ RECYCLER_IV(335),
+ SCANNER_LV(341),
+ SCANNER_MV(342),
+ SCANNER_HV(343),
+ SCANNER_EV(344),
+ SCANNER_IV(345),
+ WIRELESS_DYNAMO_ENERGY_HATCH_UMV(346),
+ WIRELESS_DYNAMO_ENERGY_HATCH_UXV(347),
+ WIRELESS_DYNAMO_ENERGY_HATCH_MAX(348),
+ ADVANCED_DEBUG_STRUCTURE_WRITTER(349),
+ WIREMILL_LV(351),
+ WIREMILL_MV(352),
+ WIREMILL_HV(353),
+ WIREMILL_EV(354),
+ WIREMILL_IV(355),
+ PCB_FACTORY_CONTROLLER(356),
+ NANO_FORGE_CONTROLLER(357),
+ CENTRIFUGE_LV(361),
+ CENTRIFUGE_MV(362),
+ CENTRIFUGE_HV(363),
+ CENTRIFUGE_EV(364),
+ CENTRIFUGE_IV(365),
+ ELECTROLYSER_LV(371),
+ ELECTROLYSER_MV(372),
+ ELECTROLYSER_HV(373),
+ ELECTROLYSER_EV(374),
+ ELECTROLYSER_IV(375),
+ THERMAL_CENTRIFUGE_LV(381),
+ THERMAL_CENTRIFUGE_MV(382),
+ THERMAL_CENTRIFUGE_HV(383),
+ THERMAL_CENTRIFUGE_EV(384),
+ THERMAL_CENTRIFUGE_IV(385),
+ ORE_WASHER_LV(391),
+ ORE_WASHER_MV(392),
+ ORE_WASHER_HV(393),
+ ORE_WASHER_EV(394),
+ ORE_WASHER_IV(395),
+ PACKAGER_LV(401),
+ PACKAGER_MV(402),
+ PACKAGER_HV(403),
+ PACKAGER_EV(404),
+ PACKAGER_IV(405),
+ PACKAGER_LuV(406),
+ PACKAGER_ZPM(407),
+ PACKAGER_UV(408),
+ UNPACKAGER_LV(411),
+ UNPACKAGER_MV(412),
+ UNPACKAGER_HV(413),
+ UNPACKAGER_EV(414),
+ UNPACKAGER_IV(415),
+ UNPACKAGER_LuV(416),
+ UNPACKAGER_ZPM(417),
+ UNPACKAGER_UV(418),
+ CHEMICAL_REACTOR_LV(421),
+ CHEMICAL_REACTOR_MV(422),
+ CHEMICAL_REACTOR_HV(423),
+ CHEMICAL_REACTOR_EV(424),
+ CHEMICAL_REACTOR_IV(425),
+ FLUID_CANNER_LV(431),
+ FLUID_CANNER_MV(432),
+ FLUID_CANNER_HV(433),
+ FLUID_CANNER_EV(434),
+ FLUID_CANNER_IV(435),
+ ROCK_BREAKER_LV(441),
+ ROCK_BREAKER_MV(442),
+ ROCK_BREAKER_HV(443),
+ ROCK_BREAKER_EV(444),
+ ROCK_BREAKER_IV(445),
+ MASS_FABRICATOR_LV(461),
+ MASS_FABRICATOR_MV(462),
+ MASS_FABRICATOR_HV(463),
+ MASS_FABRICATOR_EV(464),
+ MASS_FABRICATOR_IV(465),
+ MATTER_AMPLIFIER_LV(471),
+ MATTER_AMPLIFIER_MV(472),
+ MATTER_AMPLIFIER_HV(473),
+ MATTER_AMPLIFIER_EV(474),
+ MATTER_AMPLIFIER_IV(475),
+ REPLICATOR_LV(481),
+ REPLICATOR_MV(482),
+ REPLICATOR_HV(483),
+ REPLICATOR_EV(484),
+ REPLICATOR_IV(485),
+ BREWERY_LV(491),
+ BREWERY_MV(492),
+ BREWERY_HV(493),
+ BREWERY_EV(494),
+ BREWERY_IV(495),
+ FERMENTER_LV(501),
+ FERMENTER_MV(502),
+ FERMENTER_HV(503),
+ FERMENTER_EV(504),
+ FERMENTER_IV(505),
+ FLUID_EXTRACTOR_LV(511),
+ FLUID_EXTRACTOR_MV(512),
+ FLUID_EXTRACTOR_HV(513),
+ FLUID_EXTRACTOR_EV(514),
+ FLUID_EXTRACTOR_IV(515),
+ FLUID_SOLIDIFIER_LV(521),
+ FLUID_SOLIDIFIER_MV(522),
+ FLUID_SOLIDIFIER_HV(523),
+ FLUID_SOLIDIFIER_EV(524),
+ FLUID_SOLIDIFIER_IV(525),
+ DISTILLERY_LV(531),
+ DISTILLERY_MV(532),
+ DISTILLERY_HV(533),
+ DISTILLERY_EV(534),
+ DISTILLERY_IV(535),
+ CHEMICAL_BATH_LV(541),
+ CHEMICAL_BATH_MV(542),
+ CHEMICAL_BATH_HV(543),
+ CHEMICAL_BATH_EV(544),
+ CHEMICAL_BATH_IV(545),
+ POLARIZER_LV(551),
+ POLARIZER_MV(552),
+ POLARIZER_HV(553),
+ POLARIZER_EV(554),
+ POLARIZER_IV(555),
+ ELECTROMAGNETIC_SEPARATOR_LV(561),
+ ELECTROMAGNETIC_SEPARATOR_MV(562),
+ ELECTROMAGNETIC_SEPARATOR_HV(563),
+ ELECTROMAGNETIC_SEPARATOR_EV(564),
+ ELECTROMAGNETIC_SEPARATOR_IV(565),
+ AUTOCLAVE_LV(571),
+ AUTOCLAVE_MV(572),
+ AUTOCLAVE_HV(573),
+ AUTOCLAVE_EV(574),
+ AUTOCLAVE_IV(575),
+ MIXER_LV(581),
+ MIXER_MV(582),
+ MIXER_HV(583),
+ MIXER_EV(584),
+ MIXER_IV(585),
+ LASER_ENGRAVER_LV(591),
+ LASER_ENGRAVER_MV(592),
+ LASER_ENGRAVER_HV(593),
+ LASER_ENGRAVER_EV(594),
+ LASER_ENGRAVER_IV(595),
+ FORMING_PRESS_LV(601),
+ FORMING_PRESS_MV(602),
+ FORMING_PRESS_HV(603),
+ FORMING_PRESS_EV(604),
+ FORMING_PRESS_IV(605),
+ FORGE_HAMMER_LV(611),
+ FORGE_HAMMER_MV(612),
+ FORGE_HAMMER_HV(613),
+ FORGE_HAMMER_EV(614),
+ FORGE_HAMMER_IV(615),
+ FLUID_HEATER_LV(621),
+ FLUID_HEATER_MV(622),
+ FLUID_HEATER_HV(623),
+ FLUID_HEATER_EV(624),
+ FLUID_HEATER_IV(625),
+ SLICER_LV(631),
+ SLICER_MV(632),
+ SLICER_HV(633),
+ SLICER_EV(634),
+ SLICER_IV(635),
+ SIFTER_LV(641),
+ SIFTER_MV(642),
+ SIFTER_HV(643),
+ SIFTER_EV(644),
+ SIFTER_IV(645),
+ ARC_FURNACE_LV(651),
+ ARC_FURNACE_MV(652),
+ ARC_FURNACE_HV(653),
+ ARC_FURNACE_EV(654),
+ ARC_FURNACE_IV(655),
+ PLASMA_ARC_FURNACE_LV(661),
+ PLASMA_ARC_FURNACE_MV(662),
+ PLASMA_ARC_FURNACE_HV(663),
+ PLASMA_ARC_FURNACE_EV(664),
+ PLASMA_ARC_FURNACE_IV(665),
+ OVEN_LV(671),
+ OVEN_MV(672),
+ OVEN_HV(673),
+ OVEN_EV(674),
+ OVEN_IV(675),
+ MINER_LV(679),
+ MINER_MV(680),
+ MINER_HV(681),
+ BATTERY_CHARGER_4_BY_4_ULV(690),
+ BATTERY_CHARGER_4_BY_4_LV(691),
+ BATTERY_CHARGER_4_BY_4_MV(692),
+ BATTERY_CHARGER_4_BY_4_HV(693),
+ BATTERY_CHARGER_4_BY_4_EV(694),
+ BATTERY_CHARGER_4_BY_4_IV(695),
+ BATTERY_CHARGER_4_BY_4_LuV(696),
+ BATTERY_CHARGER_4_BY_4_ZPM(697),
+ BATTERY_CHARGER_4_BY_4_UV(698),
+ BATTERY_CHARGER_4_BY_4_UHV(699),
+ QUADRUPLE_INPUT_HATCHES_IV(710),
+ QUADRUPLE_INPUT_HATCHES_LuV(711),
+ QUADRUPLE_INPUT_HATCHES_ZPM(712),
+ QUADRUPLE_INPUT_HATCHES_UV(713),
+ QUADRUPLE_INPUT_HATCHES_UHV(714),
+ QUADRUPLE_INPUT_HATCHES_UEV(715),
+ QUADRUPLE_INPUT_HATCHES_UIV(716),
+ QUADRUPLE_INPUT_HATCHES_UMV(717),
+ QUADRUPLE_INPUT_HATCHES_UXV(718),
+ QUADRUPLE_INPUT_HATCHES_MAX(719),
+ EBF_CONTROLLER(1000),
+ IMPLOSION_COMPRESSOR_CONTROLLER(1001),
+ VACUUM_FREEZER_CONTROLLER(1002),
+ MULTI_SMELTER_CONTROLLER(1003),
+ DTPF_CONTROLLER(1004),
+ LARGE_ADVANCED_GAS_TURBINE_CONTROLLER(1005),
+ TRANSCENDENT_PLASMA_MIXER_CONTROLLER(1006),
+ LARGE_BRONZE_BOILER_CONTROLLER(1020),
+ LARGE_STEEL_BOILER_CONTROLLER(1021),
+ LARGE_TITANIUM_BOILER_CONTROLLER(1022),
+ LARGE_TUNGSTENSTEEL_BOILER_CONTROLLER(1023),
+ COMBUSTION_GENERATOR_LV(1110),
+ COMBUSTION_GENERATOR_MV(1111),
+ COMBUSTION_GENERATOR_HV(1112),
+ GAS_TURBINE_LV(1115),
+ GAS_TURBINE_MV(1116),
+ GAS_TURBINE_HV(1117),
+ GAS_TURBINE_EV(1118),
+ GAS_TURBINE_IV(1119),
+ STEAM_TURBINE_LV(1120),
+ STEAM_TURBINE_MV(1121),
+ STEAM_TURBINE_HV(1122),
+ MAGIC_ENERGY_CONVERTER_LV(1123),
+ MAGIC_ENERGY_CONVERTER_MV(1124),
+ MAGIC_ENERGY_CONVERTER_HV(1125),
+ DISTILLATION_TOWER_CONTROLLER(1126),
+ MAGIC_ENERGY_ABSORBER_LV(1127),
+ MAGIC_ENERGY_ABSORBER_MV(1128),
+ MAGIC_ENERGY_ABSORBER_HV(1129),
+ MAGIC_ENERGY_ABSORBER_EV(1130),
+ LARGE_STEAM_TURBINE_CONTROLLER(1131),
+ INTEGRATED_ORE_FACTORY_CONTROLLER(1132),
+ MONSTER_REPELLATOR_LuV(1135),
+ MONSTER_REPELLATOR_ZPM(1136),
+ MONSTER_REPELLATOR_UV(1137),
+ PUMP_LV(1140),
+ PUMP_MV(1141),
+ PUMP_HV(1142),
+ PUMP_EV(1143),
+ PUMP_IV(1144),
+ TELEPORTER(1145),
+ MONSTER_REPELLATOR_LV(1146),
+ MONSTER_REPELLATOR_MV(1147),
+ MONSTER_REPELLATOR_HV(1148),
+ MONSTER_REPELLATOR_EV(1149),
+ MONSTER_REPELLATOR_IV(1150),
+ LARGE_GAS_TURBINE_CONTROLLER(1151),
+ LARGE_HP_STEAM_TURBINE_CONTROLLER(1152),
+ LARGE_PLASMA_TURBINE_CONTROLLER(1153),
+ LARGE_HEAT_EXCHANGER_CONTROLLER(1154),
+ CHARCOAL_PILE_IGNITER_CONTROLLER(1155),
+ MULTIBLOCK_PUMP_MKI_CONTROLLER(1157),
+ ORE_DRILL_MKI_CONTROLLER(1158),
+ PYROLYSE_OVEN_CONTROLLER(1159),
+ OIL_CRACKER_CONTROLLER(1160),
+ MICROWAVE_ENERGY_TRANSMITTER_HV(1161),
+ MICROWAVE_ENERGY_TRANSMITTER_EV(1162),
+ MICROWAVE_ENERGY_TRANSMITTER_IV(1163),
+ MICROWAVE_ENERGY_TRANSMITTER_LuV(1164),
+ MICROWAVE_ENERGY_TRANSMITTER_ZPM(1165),
+ MICROWAVE_ENERGY_TRANSMITTER_UV(1166),
+ LCR_CONTROLLER(1169),
+ ASSEMBLING_LINE_CONTROLLER(1170),
+ COMBUSTION_ENGINE_CONTROLLER(1171),
+ CLEANROOM_CONTROLLER(1172),
+ ADVANCED_SEISMIC_PROSPECTOR_EV(1173),
+ LIGHTNING_ROD_HV(1174),
+ LIGHTNING_ROD_EV(1175),
+ LIGHTNING_ROD_IV(1176),
+ ORE_DRILL_MKII_CONTROLLER(1177),
+ ORE_DRILL_MKIII_CONTROLLER(1178),
+ ORE_DRILL_MKIV_CONTROLLER(1179),
+ CIRCUIT_ASSEMBLER_LV(1180),
+ CIRCUIT_ASSEMBLER_MV(1181),
+ CIRCUIT_ASSEMBLER_HV(1182),
+ CIRCUIT_ASSEMBLER_EV(1183),
+ CIRCUIT_ASSEMBLER_IV(1184),
+ CIRCUIT_ASSEMBLER_LuV(1185),
+ CIRCUIT_ASSEMBLER_ZPM(1186),
+ CIRCUIT_ASSEMBLER_UV(1187),
+ NAQUADAH_REACTOR_ZPM(1188),
+ NAQUADAH_REACTOR_UV(1189),
+ NAQUADAH_REACTOR_EV(1190),
+ NAQUADAH_REACTOR_IV(1191),
+ NAQUADAH_REACTOR_LuV(1192),
+ FUSION_CONTROLLER_MKI(1193),
+ FUSION_CONTROLLER_MKII(1194),
+ FUSION_CONTROLLER_MKIII(1195),
+ PLASMA_GENERATOR_IV(1196),
+ PLASMA_GENERATOR_LuV(1197),
+ PLASMA_GENERATOR_ZPM(1198),
+ PROCESSING_ARRAY_CONTROLLER(1199),
+ ADVANCED_SEISMIC_PROSPECTOR_LV(2102),
+ ADVANCED_SEISMIC_PROSPECTOR_MV(2103),
+ ADVANCED_SEISMIC_PROSPECTOR_HV(2104),
+ EXTREME_COMBUSTION_ENGINE_CONTROLLER(2105),
+ LONG_DISTANCE_PIPELINE_FLUID(2700),
+ LONG_DISTANCE_PIPELINE_ITEM(2701),
+ OUTPUT_BUS_ME(2710),
+ INPUT_BUS_ME_ADVANCED(2711),
+ INPUT_HATCH_ME_ADVANCED(2712),
+ OUTPUT_HATCH_ME(2713),
+ CRAFTING_INPUT_ME(2714),
+ CRAFTING_INPUT_ME_BUS(2715),
+ CRAFTING_INPUT_SLAVE(2716),
+ INPUT_HATCH_ME(2717),
+ INPUT_BUS_ME(2718),
+ CHEST_BUFFER_ULV(9230),
+ CHEST_BUFFER_LV(9231),
+ CHEST_BUFFER_MV(9232),
+ CHEST_BUFFER_HV(9233),
+ CHEST_BUFFER_EV(9234),
+ CHEST_BUFFER_IV(9235),
+ CHEST_BUFFER_LuV(9236),
+ CHEST_BUFFER_ZPM(9237),
+ CHEST_BUFFER_UV(9238),
+ CHEST_BUFFER_UHV(9239),
+ ITEM_FILTER_ULV(9240),
+ ITEM_FILTER_LV(9241),
+ ITEM_FILTER_MV(9242),
+ ITEM_FILTER_HV(9243),
+ ITEM_FILTER_EV(9244),
+ ITEM_FILTER_IV(9245),
+ ITEM_FILTER_LuV(9246),
+ ITEM_FILTER_ZPM(9247),
+ ITEM_FILTER_UV(9248),
+ ITEM_FILTER_UHV(9249),
+ TYPE_FILTER_ULV(9250),
+ TYPE_FILTER_LV(9251),
+ TYPE_FILTER_MV(9252),
+ TYPE_FILTER_HV(9253),
+ TYPE_FILTER_EV(9254),
+ TYPE_FILTER_IV(9255),
+ TYPE_FILTER_LuV(9256),
+ TYPE_FILTER_ZPM(9257),
+ TYPE_FILTER_UV(9258),
+ TYPE_FILTER_UHV(9259),
+ VOLTAGE_REGULATOR_ULV(9270),
+ VOLTAGE_REGULATOR_LV(9271),
+ VOLTAGE_REGULATOR_MV(9272),
+ VOLTAGE_REGULATOR_HV(9273),
+ VOLTAGE_REGULATOR_EV(9274),
+ VOLTAGE_REGULATOR_IV(9275),
+ VOLTAGE_REGULATOR_LuV(9276),
+ VOLTAGE_REGULATOR_ZPM(9277),
+ VOLTAGE_REGULATOR_UV(9278),
+ VOLTAGE_REGULATOR_UHV(9279),
+ SUPER_BUFFER_ULV(9300),
+ SUPER_BUFFER_LV(9301),
+ SUPER_BUFFER_MV(9302),
+ SUPER_BUFFER_HV(9303),
+ SUPER_BUFFER_EV(9304),
+ SUPER_BUFFER_IV(9305),
+ SUPER_BUFFER_LuV(9306),
+ SUPER_BUFFER_ZPM(9307),
+ SUPER_BUFFER_UV(9308),
+ SUPER_BUFFER_UHV(9309),
+ ITEM_DISTRIBUTOR_ULV(9320),
+ ITEM_DISTRIBUTOR_LV(9321),
+ ITEM_DISTRIBUTOR_MV(9322),
+ ITEM_DISTRIBUTOR_HV(9323),
+ ITEM_DISTRIBUTOR_EV(9324),
+ ITEM_DISTRIBUTOR_IV(9325),
+ ITEM_DISTRIBUTOR_LuV(9326),
+ ITEM_DISTRIBUTOR_ZPM(9327),
+ ITEM_DISTRIBUTOR_UV(9328),
+ ITEM_DISTRIBUTOR_UHV(9329),
+ RECIPE_FILTER_ULV(9330),
+ RECIPE_FILTER_LV(9331),
+ RECIPE_FILTER_MV(9332),
+ RECIPE_FILTER_HV(9333),
+ RECIPE_FILTER_EV(9334),
+ RECIPE_FILTER_IV(9335),
+ RECIPE_FILTER_LuV(9336),
+ RECIPE_FILTER_ZPM(9337),
+ RECIPE_FILTER_UV(9338),
+ RECIPE_FILTER_UHV(9339),
+ INDUSTRIAL_APIARY(9399),
+ Drone_Centre(9400),
+ DroneDownLink(9401);
+
+ public final int ID;
+
+ private MetaTileEntityIDs(int ID) {
+ this.ID = ID;
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/Mods.java b/src/main/java/gregtech/api/enums/Mods.java
new file mode 100644
index 0000000000..ee95a98874
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/Mods.java
@@ -0,0 +1,387 @@
+package gregtech.api.enums;
+
+import java.util.Locale;
+
+import net.minecraft.util.ResourceLocation;
+
+import cpw.mods.fml.common.Loader;
+
+public enum Mods {
+
+ AE2FluidCraft(Names.A_E2_FLUID_CRAFT),
+ AE2Stuff(Names.AE2STUFF),
+ AE2WCT(Names.AE2WCT),
+ AFSU(Names.A_F_S_U),
+ AdvancedSolarPanel(Names.ADVANCED_SOLAR_PANEL),
+ AdventureBackpack(Names.ADVENTURE_BACKPACK),
+ AppleCore(Names.APPLE_CORE),
+ AppliedEnergistics2(Names.APPLIED_ENERGISTICS2),
+ ArchitectureCraft(Names.ARCHITECTURE_CRAFT),
+ Aroma1997Core(Names.AROMA1997_CORE),
+ Automagy(Names.AUTOMAGY),
+ Avaritia(Names.AVARITIA),
+ AvaritiaAddons(Names.AVARITIA_ADDONS),
+ Backpack(Names.BACKPACK),
+ BartWorks(Names.BART_WORKS),
+ Baubles(Names.BAUBLES),
+ BetterBuildersWands(Names.BETTER_BUILDERS_WANDS),
+ BetterLoadingScreen(Names.BETTER_LOADING_SCREEN),
+ BetterQuesting(Names.BETTER_QUESTING),
+ BiblioCraft(Names.BIBLIO_CRAFT),
+ BiblioWoodsBoPEdition(Names.BIBLIO_WOODS_BO_P_EDITION),
+ BiblioWoodsForestryEdition(Names.BIBLIO_WOODS_FORESTRY_EDITION),
+ BiblioWoodsNaturaEdition(Names.BIBLIO_WOODS_NATURA_EDITION),
+ BinnieCore(Names.BINNIE_CORE),
+ BiomesOPlenty(Names.BIOMES_O_PLENTY),
+ BloodArsenal(Names.BLOOD_ARSENAL),
+ BloodMagic(Names.BLOOD_MAGIC),
+ Botania(Names.BOTANIA),
+ Botany(Names.BOTANY),
+ BuildCraftBuilders(Names.BUILD_CRAFT_BUILDERS),
+ BuildCraftCompat(Names.BUILD_CRAFT_COMPAT),
+ BuildCraftCore(Names.BUILD_CRAFT_CORE),
+ BuildCraftFactory(Names.BUILD_CRAFT_FACTORY),
+ BuildCraftRobotics(Names.BUILD_CRAFT_ROBOTICS),
+ BuildCraftSilicon(Names.BUILD_CRAFT_SILICON),
+ BuildCraftTransport(Names.BUILD_CRAFT_TRANSPORT),
+ COFHCore(Names.C_O_F_H_CORE),
+ CarpentersBlocks(Names.CARPENTERS_BLOCKS),
+ CatWalks(Names.CAT_WALKS),
+ Chisel(Names.CHISEL),
+ CompactKineticGenerators(Names.COMPACT_KINETIC_GENERATORS),
+ Computronics(Names.COMPUTRONICS),
+ CraftTweaker(Names.CRAFT_TWEAKER),
+ CropLoadCore(Names.CROP_LOAD_CORE),
+ CropsPlusPlus(Names.CROPS_PLUS_PLUS),
+ DraconicEvolution(Names.DRACONIC_EVOLUTION),
+ ElectroMagicTools(Names.ELECTRO_MAGIC_TOOLS),
+ EnderIO(Names.ENDER_I_O),
+ EnderStorage(Names.ENDER_STORAGE),
+ EnderZoo(Names.ENDER_ZOO),
+ EnhancedLootBags(Names.ENHANCED_LOOT_BAGS),
+ EternalSingularity(Names.ETERNAL_SINGULARITY),
+ ExtraBees(Names.EXTRA_BEES),
+ ExtraCells2(Names.EXTRA_CELLS2),
+ ExtraTrees(Names.EXTRA_TREES),
+ ExtraUtilities(Names.EXTRA_UTILITIES),
+ FloodLights(Names.FLOOD_LIGHTS),
+ ForbiddenMagic(Names.FORBIDDEN_MAGIC),
+ Forestry(Names.FORESTRY),
+ ForgeMicroblocks(Names.FORGE_MICROBLOCKS),
+ ForgeRelocation(Names.FORGE_RELOCATION),
+ GTNHIntergalactic(Names.G_T_N_H_INTERGALACTIC),
+ GTNHLanthanides(Names.G_T_N_H_LANTHANIDES),
+ GTPlusPlus(Names.G_T_PLUS_PLUS),
+ GTPlusPlusEverglades(Names.G_T_PLUS_PLUS_EVERGLADES),
+ Gadomancy(Names.GADOMANCY),
+ GalactiGreg(Names.GALACTI_GREG),
+ GalacticraftAmunRa(Names.GALACTICRAFT_AMUN_RA),
+ GalacticraftCore(Names.GALACTICRAFT_CORE),
+ GalacticraftMars(Names.GALACTICRAFT_MARS),
+ GalaxySpace(Names.GALAXY_SPACE),
+ Gendustry(Names.GENDUSTRY),
+ Genetics(Names.GENETICS),
+ GoodGenerator(Names.GOOD_GENERATOR),
+ GraviSuite(Names.GRAVI_SUITE),
+ GraviSuiteNEO(Names.GRAVI_SUITE_NEO),
+ GregTech(Names.GREG_TECH),
+ HardcoreEnderExpansion(Names.HARDCORE_ENDER_EXPANSION),
+ HodgePodge(Names.HODGE_PODGE),
+ HoloInventory(Names.HOLO_INVENTORY),
+ IC2CropPlugin(Names.I_C2_CROP_PLUGIN),
+ IC2NuclearControl(Names.I_C2_NUCLEAR_CONTROL),
+ IguanaTweaksTinkerConstruct(Names.IGUANA_TWEAKS_TINKER_CONSTRUCT),
+ IndustrialCraft2(Names.INDUSTRIAL_CRAFT2),
+ IronChests(Names.IRON_CHESTS),
+ IronChestsMinecarts(Names.IRON_CHESTS_MINECARTS),
+ IronTanks(Names.IRON_TANKS),
+ JABBA(Names.J_A_B_B_A),
+ KekzTech(Names.KEKZ_TECH),
+ KubaTech(Names.KUBA_TECH),
+ LogisticsPipes(Names.LOGISTICS_PIPES),
+ MCFrames(Names.MC_FRAMES),
+ MagicBees(Names.MAGIC_BEES),
+ MalisisDoors(Names.MALISIS_DOORS),
+ Mantle(Names.MANTLE),
+ MineAndBladeBattleGear2(Names.MINE_AND_BLADE_BATTLE_GEAR2),
+ Minecraft(Names.MINECRAFT),
+ NEICustomDiagrams(Names.N_E_I_CUSTOM_DIAGRAMS),
+ NEIOrePlugin(Names.N_E_I_ORE_PLUGIN),
+ Natura(Names.NATURA),
+ NaturesCompass(Names.NATURES_COMPASS),
+ NewHorizonsCoreMod(Names.NEW_HORIZONS_CORE_MOD),
+ NotEnoughItems(Names.NOT_ENOUGH_ITEMS),
+ OpenBlocks(Names.OPEN_BLOCKS),
+ OpenComputers(Names.OPEN_COMPUTERS),
+ OpenGlasses(Names.OPEN_GLASSES),
+ OpenModularTurrets(Names.OPEN_MODULAR_TURRETS),
+ OpenPrinters(Names.OPEN_PRINTERS),
+ OpenSecurity(Names.OPEN_SECURITY),
+ PamsHarvestCraft(Names.PAMS_HARVEST_CRAFT),
+ PamsHarvestTheNether(Names.PAMS_HARVEST_THE_NETHER),
+ PlayerAPI(Names.PLAYER_API),
+ ProjectBlue(Names.PROJECT_BLUE),
+ ProjectRedCore(Names.PROJECT_RED_CORE),
+ ProjectRedExpansion(Names.PROJECT_RED_EXPANSION),
+ ProjectRedExploration(Names.PROJECT_RED_EXPLORATION),
+ ProjectRedFabrication(Names.PROJECT_RED_FABRICATION),
+ ProjectRedIllumination(Names.PROJECT_RED_ILLUMINATION),
+ ProjectRedIntegration(Names.PROJECT_RED_INTEGRATION),
+ ProjectRedTransmission(Names.PROJECT_RED_TRANSMISSION),
+ ProjectRedTransportation(Names.PROJECT_RED_TRANSPORTATION),
+ QuestBook(Names.QUEST_BOOK),
+ RWG(Names.RWG),
+ Railcraft(Names.RAILCRAFT),
+ RandomThings(Names.RANDOM_THINGS),
+ RemoteIO(Names.REMOTE_IO),
+ SGCraft(Names.S_G_CRAFT),
+ SleepingBags(Names.SLEEPING_BAGS),
+ SpiceOfLife(Names.SPICE_OF_LIFE),
+ StevesAddons(Names.STEVES_ADDONS),
+ StevesCarts2(Names.STEVES_CARTS2),
+ StevesFactoryManager(Names.STEVES_FACTORY_MANAGER),
+ StorageDrawers(Names.STORAGE_DRAWERS),
+ StructureLib(Names.STRUCTURE_LIB),
+ SuperSolarPanels(Names.SUPER_SOLAR_PANELS),
+ TaintedMagic(Names.TAINTED_MAGIC),
+ TecTech(Names.TECTECH),
+ Thaumcraft(Names.THAUMCRAFT),
+ ThaumicBases(Names.THAUMIC_BASES),
+ ThaumicBoots(Names.THAUMIC_BOOTS),
+ ThaumicEnergistics(Names.THAUMIC_ENERGISTICS),
+ ThaumicExploration(Names.THAUMIC_EXPLORATION),
+ ThaumicHorizons(Names.THAUMIC_HORIZONS),
+ ThaumicMachina(Names.THAUMIC_MACHINA),
+ ThaumicTinkerer(Names.THAUMIC_TINKERER),
+ TinkerConstruct(Names.TINKER_CONSTRUCT),
+ TinkersDefence(Names.TINKERS_DEFENCE),
+ TinkersGregworks(Names.TINKERS_GREGWORKS),
+ TinkersMechworks(Names.TINKERS_MECHWORKS),
+ Translocator(Names.TRANSLOCATOR),
+ TravellersGear(Names.TRAVELLERS_GEAR),
+ TwilightForest(Names.TWILIGHT_FOREST),
+ UniversalSingularities(Names.UNIVERSAL_SINGULARITIES),
+ Waila(Names.WAILA),
+ WarpTheory(Names.WARP_THEORY),
+ WirelessRedstoneCBEAddons(Names.WIRELESS_REDSTONE_CBE_ADDONS),
+ WirelessRedstoneCBECore(Names.WIRELESS_REDSTONE_CBE_CORE),
+ WirelessRedstoneCBELogic(Names.WIRELESS_REDSTONE_CBE_LOGIC),
+ Witchery(Names.WITCHERY),
+ WitchingGadgets(Names.WITCHING_GADGETS),
+ ZTones(Names.Z_TONES),
+
+ // Do we keep compat of those?
+ ArsMagica2(Names.ARS_MAGICA2),
+ GanysSurface(Names.GANYS_SURFACE),
+ IndustrialCraft2Classic(Names.INDUSTRIAL_CRAFT2_CLASSIC),
+ MagicalCrops(Names.MAGICAL_CROPS),
+ Metallurgy(Names.METALLURGY),
+ RotaryCraft(Names.ROTARY_CRAFT),
+ ThermalExpansion(Names.THERMAL_EXPANSION),
+ ThermalFondation(Names.THERMAL_FONDATION),
+ UndergroundBiomes(Names.UNDERGROUND_BIOMES),
+
+ ;
+
+ public static class Names {
+
+ public static final String A_E2_FLUID_CRAFT = "ae2fc";
+ public static final String AE2STUFF = "ae2stuff";
+ public static final String AE2WCT = "ae2wct";
+ public static final String A_F_S_U = "AFSU";
+ public static final String ADVANCED_SOLAR_PANEL = "AdvancedSolarPanel";
+ public static final String ADVENTURE_BACKPACK = "adventurebackpack";
+ public static final String APPLE_CORE = "AppleCore";
+ public static final String APPLIED_ENERGISTICS2 = "appliedenergistics2";
+ public static final String ARCHITECTURE_CRAFT = "ArchitectureCraft";
+ public static final String AROMA1997_CORE = "Aroma1997Core";
+ public static final String AUTOMAGY = "Automagy";
+ public static final String AVARITIA = "Avaritia";
+ public static final String AVARITIA_ADDONS = "avaritiaddons";
+ public static final String BACKPACK = "Backpack";
+ public static final String BART_WORKS = "bartworks";
+ public static final String BAUBLES = "Baubles";
+ public static final String BETTER_BUILDERS_WANDS = "betterbuilderswands";
+ public static final String BETTER_LOADING_SCREEN = "betterloadingscreen";
+ public static final String BETTER_QUESTING = "betterquesting";
+ public static final String BIBLIO_CRAFT = "BiblioCraft";
+ public static final String BIBLIO_WOODS_BO_P_EDITION = "BiblioWoodsBoP";
+ public static final String BIBLIO_WOODS_FORESTRY_EDITION = "BiblioWoodsForestry";
+ public static final String BIBLIO_WOODS_NATURA_EDITION = "BiblioWoodsNatura";
+ public static final String BINNIE_CORE = "BinnieCore";
+ public static final String BIOMES_O_PLENTY = "BiomesOPlenty";
+ public static final String BLOOD_ARSENAL = "BloodArsenal";
+ public static final String BLOOD_MAGIC = "AWWayofTime";
+ public static final String BOTANIA = "Botania";
+ public static final String BOTANY = "Botany";
+ public static final String BUILD_CRAFT_BUILDERS = "BuildCraft|Builders";
+ public static final String BUILD_CRAFT_COMPAT = "BuildCraft|Compat";
+ public static final String BUILD_CRAFT_CORE = "BuildCraft|Core";
+ public static final String BUILD_CRAFT_FACTORY = "BuildCraft|Factory";
+ public static final String BUILD_CRAFT_ROBOTICS = "BuildCraft|Robotics";
+ public static final String BUILD_CRAFT_SILICON = "BuildCraft|Silicon";
+ public static final String BUILD_CRAFT_TRANSPORT = "BuildCraft|Transport";
+ public static final String C_O_F_H_CORE = "CoFHCore";
+ public static final String CARPENTERS_BLOCKS = "CarpentersBlocks";
+ public static final String CAT_WALKS = "catwalks";
+ public static final String CHISEL = "chisel";
+ public static final String COMPACT_KINETIC_GENERATORS = "compactkineticgenerators";
+ public static final String COMPUTRONICS = "computronics";
+ public static final String CRAFT_TWEAKER = "MineTweaker3";
+ public static final String CROP_LOAD_CORE = "croploadcore";
+ public static final String CROPS_PLUS_PLUS = "berriespp";
+ public static final String DRACONIC_EVOLUTION = "DraconicEvolution";
+ public static final String ELECTRO_MAGIC_TOOLS = "EMT";
+ public static final String ENDER_I_O = "EnderIO";
+ public static final String ENDER_STORAGE = "EnderStorage";
+ public static final String ENDER_ZOO = "EnderZoo";
+ public static final String ENHANCED_LOOT_BAGS = "enhancedlootbags";
+ public static final String ETERNAL_SINGULARITY = "eternalsingularity";
+ public static final String EXTRA_BEES = "ExtraBees";
+ public static final String EXTRA_CELLS2 = "extracells";
+ public static final String EXTRA_TREES = "ExtraTrees";
+ public static final String EXTRA_UTILITIES = "ExtraUtilities";
+ public static final String FLOOD_LIGHTS = "FloodLights";
+ public static final String FORBIDDEN_MAGIC = "ForbiddenMagic";
+ public static final String FORESTRY = "Forestry";
+ public static final String FORGE_MICROBLOCKS = "ForgeMicroblock";
+ public static final String FORGE_RELOCATION = "ForgeRelocation";
+ public static final String G_T_N_H_INTERGALACTIC = "gtnhintergalactic";
+ public static final String G_T_N_H_LANTHANIDES = "gtnhlanth";
+ public static final String G_T_PLUS_PLUS = "miscutils";
+ public static final String G_T_PLUS_PLUS_EVERGLADES = "ToxicEverglades";
+ public static final String GADOMANCY = "gadomancy";
+ public static final String GALACTI_GREG = "galacticgreg";
+ public static final String GALACTICRAFT_AMUN_RA = "GalacticraftAmunRa";
+ public static final String GALACTICRAFT_CORE = "GalacticraftCore";
+ public static final String GALACTICRAFT_MARS = "GalacticraftMars";
+ public static final String GALAXY_SPACE = "GalaxySpace";
+ public static final String GENDUSTRY = "gendustry";
+ public static final String GENETICS = "Genetics";
+ public static final String GOOD_GENERATOR = "GoodGenerator";
+ public static final String GRAVI_SUITE = "GraviSuite";
+ public static final String GRAVI_SUITE_NEO = "gravisuiteneo";
+ public static final String GREG_TECH = "gregtech";
+ public static final String HARDCORE_ENDER_EXPANSION = "HardcoreEnderExpansion";
+ public static final String HODGE_PODGE = "hodgepodge";
+ public static final String HOLO_INVENTORY = "holoinventory";
+ public static final String I_C2_CROP_PLUGIN = "Ic2Nei";
+ public static final String I_C2_NUCLEAR_CONTROL = "IC2NuclearControl";
+ public static final String IGUANA_TWEAKS_TINKER_CONSTRUCT = "IguanaTweaksTConstruct";
+ public static final String INDUSTRIAL_CRAFT2 = "IC2";
+ public static final String IRON_CHESTS = "IronChest";
+ public static final String IRON_CHESTS_MINECARTS = "ironchestminecarts";
+ public static final String IRON_TANKS = "irontank";
+ public static final String J_A_B_B_A = "JABBA";
+ public static final String KEKZ_TECH = "kekztech";
+ public static final String KUBA_TECH = "kubatech";
+ public static final String LOGISTICS_PIPES = "LogisticsPipes";
+ public static final String MC_FRAMES = "MCFrames";
+ public static final String MAGIC_BEES = "MagicBees";
+ public static final String MALISIS_DOORS = "malisisdoors";
+ public static final String MANTLE = "Mantle";
+ public static final String MINE_AND_BLADE_BATTLE_GEAR2 = "battlegear2";
+ public static final String MINECRAFT = "minecraft";
+ public static final String N_E_I_CUSTOM_DIAGRAMS = "neicustomdiagram";
+ public static final String N_E_I_ORE_PLUGIN = "gtneioreplugin";
+ public static final String NATURA = "Natura";
+ public static final String NATURES_COMPASS = "naturescompass";
+ public static final String NEW_HORIZONS_CORE_MOD = "dreamcraft";
+ public static final String NOT_ENOUGH_ITEMS = "NotEnoughItems";
+ public static final String OPEN_BLOCKS = "OpenBlocks";
+ public static final String OPEN_COMPUTERS = "OpenComputers";
+ public static final String OPEN_GLASSES = "openglasses";
+ public static final String OPEN_MODULAR_TURRETS = "openmodularturrets";
+ public static final String OPEN_PRINTERS = "openprinter";
+ public static final String OPEN_SECURITY = "opensecurity";
+ public static final String PAMS_HARVEST_CRAFT = "harvestcraft";
+ public static final String PAMS_HARVEST_THE_NETHER = "harvestthenether";
+ public static final String PLAYER_API = "PlayerAPI";
+ public static final String PROJECT_BLUE = "ProjectBlue";
+ public static final String PROJECT_RED_CORE = "ProjRed|Core";
+ public static final String PROJECT_RED_EXPANSION = "ProjRed|Expansion";
+ public static final String PROJECT_RED_EXPLORATION = "ProjRed|Exploration";
+ public static final String PROJECT_RED_FABRICATION = "ProjRed|Fabrication";
+ public static final String PROJECT_RED_ILLUMINATION = "ProjRed|Illumination";
+ public static final String PROJECT_RED_INTEGRATION = "ProjRed|Integration";
+ public static final String PROJECT_RED_TRANSMISSION = "ProjRed|Transmission";
+ public static final String PROJECT_RED_TRANSPORTATION = "ProjRed|Transportation";
+ public static final String QUEST_BOOK = "questbook";
+ public static final String RWG = "RWG";
+ public static final String RAILCRAFT = "Railcraft";
+ public static final String RANDOM_THINGS = "RandomThings";
+ public static final String REMOTE_IO = "RIO";
+ public static final String S_G_CRAFT = "SGCraft";
+ public static final String SLEEPING_BAGS = "sleepingbag";
+ public static final String SPICE_OF_LIFE = "SpiceOfLife";
+ public static final String STEVES_ADDONS = "StevesAddons";
+ public static final String STEVES_CARTS2 = "StevesCarts";
+ public static final String STEVES_FACTORY_MANAGER = "StevesFactoryManager";
+ public static final String STRUCTURE_LIB = "structurelib";
+ public static final String STORAGE_DRAWERS = "StorageDrawers";
+ public static final String SUPER_SOLAR_PANELS = "supersolarpanel";
+ public static final String TAINTED_MAGIC = "TaintedMagic";
+ public static final String TECTECH = "tectech";
+ public static final String THAUMCRAFT = "Thaumcraft";
+ public static final String THAUMIC_BASES = "thaumicbases";
+ public static final String THAUMIC_ENERGISTICS = "thaumicenergistics";
+ public static final String THAUMIC_EXPLORATION = "ThaumicExploration";
+ public static final String THAUMIC_HORIZONS = "ThaumicHorizons";
+ public static final String THAUMIC_BOOTS = "thaumicboots";
+ public static final String THAUMIC_MACHINA = "ThaumicMachina";
+ public static final String THAUMIC_TINKERER = "ThaumicTinkerer";
+ public static final String TINKER_CONSTRUCT = "TConstruct";
+ public static final String TINKERS_DEFENCE = "tinkersdefense";
+ public static final String TINKERS_GREGWORKS = "TGregworks";
+ public static final String TINKERS_MECHWORKS = "TMechworks";
+ public static final String TRANSLOCATOR = "Translocator";
+ public static final String TRAVELLERS_GEAR = "TravellersGear";
+ public static final String TWILIGHT_FOREST = "TwilightForest";
+ public static final String UNIVERSAL_SINGULARITIES = "universalsingularities";
+ public static final String WAILA = "Waila";
+ public static final String WARP_THEORY = "WarpTheory";
+ public static final String WIRELESS_REDSTONE_CBE_ADDONS = "WR-CBE|Addons";
+ public static final String WIRELESS_REDSTONE_CBE_CORE = "WR-CBE|Core";
+ public static final String WIRELESS_REDSTONE_CBE_LOGIC = "WR-CBE|Logic";
+ public static final String WITCHERY = "witchery";
+ public static final String WITCHING_GADGETS = "WitchingGadgets";
+ public static final String Z_TONES = "Ztones";
+
+ // Do we keep compat of those mods?
+ public static final String ARS_MAGICA2 = "arsmagica2";
+ public static final String GANYS_SURFACE = "ganyssurface";
+ public static final String INDUSTRIAL_CRAFT2_CLASSIC = "IC2-Classic-Spmod";
+ public static final String MAGICAL_CROPS = "magicalcrops";
+ public static final String METALLURGY = "Metallurgy";
+ public static final String ROTARY_CRAFT = "RotaryCraft";
+ public static final String THERMAL_EXPANSION = "ThermalExpansion";
+ public static final String THERMAL_FONDATION = "ThermalFoundation";
+ public static final String UNDERGROUND_BIOMES = "UndergroundBiomes";
+
+ }
+
+ public final String ID;
+ public final String resourceDomain;
+ private Boolean modLoaded;
+
+ Mods(String ID) {
+ this.ID = ID;
+ this.resourceDomain = ID.toLowerCase(Locale.ENGLISH);
+ }
+
+ public boolean isModLoaded() {
+ if (this.modLoaded == null) {
+ this.modLoaded = Loader.isModLoaded(ID);
+ }
+ return this.modLoaded;
+ }
+
+ public String getResourcePath(String... path) {
+ return this.getResourceLocation(path)
+ .toString();
+ }
+
+ public ResourceLocation getResourceLocation(String... path) {
+ return new ResourceLocation(this.resourceDomain, String.join("/", path));
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/OreDictNames.java b/src/main/java/gregtech/api/enums/OreDictNames.java
new file mode 100644
index 0000000000..8bb86b5249
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/OreDictNames.java
@@ -0,0 +1,77 @@
+package gregtech.api.enums;
+
+public enum OreDictNames {
+ craftingAnvil,
+ craftingBook,
+ craftingCentrifuge,
+ craftingChest,
+ craftingCompressor,
+ craftingConveyor,
+ craftingDiamondBlade,
+ craftingDrain,
+ craftingDuctTape,
+ craftingElectricFurnace,
+ craftingElectromagnet,
+ enderChest, // Vanilla OreDict Name
+ craftingEnergyCellUpgrade,
+ craftingEnergyMeter,
+ craftingExtractor,
+ craftingFeather,
+ craftingFurnace,
+ craftingFilter,
+ craftingGenerator,
+ craftingGeothermalGenerator,
+ craftingGrinder,
+ craftingInductionFurnace,
+ craftingIndustrialDiamond,
+ craftingIronFurnace,
+ craftingLensBlack,
+ craftingLensBlue,
+ craftingLensBrown,
+ craftingLensCyan,
+ craftingLensGray,
+ craftingLensGreen,
+ craftingLensLightBlue,
+ craftingLensLightGray,
+ craftingLensLime,
+ craftingLensMagenta,
+ craftingLensOrange,
+ craftingLensPink,
+ craftingLensPurple,
+ craftingLensRed,
+ craftingLensWhite,
+ craftingLensYellow,
+ craftingMacerator,
+ craftingMetalformer,
+ craftingPiston,
+ craftingPump,
+ craftingQuantumChestUpgrade,
+ craftingQuartz,
+ craftingRawMachineTier00,
+ craftingRawMachineTier01,
+ craftingRawMachineTier02,
+ craftingRawMachineTier03,
+ craftingRawMachineTier04,
+ craftingRecycler,
+ craftingRedstoneReceiver,
+ craftingRedstoneTorch,
+ craftingRedstoneTranceiver,
+ craftingRedstoneTransmitter,
+ craftingSafe,
+ craftingSteamTank,
+ craftingSteamUpgrade,
+ craftingSuperconductor,
+ craftingTank,
+ craftingTeleporter,
+ craftingThermalCentrifuge,
+ craftingTurbineBladeBronze,
+ craftingTurbineBladeCarbon,
+ craftingTurbineBladeMagnalium,
+ craftingTurbineBladeSteel,
+ craftingTurbineBladeTungstenSteel,
+ craftingWireCopper,
+ craftingWireGold,
+ craftingWireIron,
+ craftingWireTin,
+ craftingWorkBench,
+}
diff --git a/src/main/java/gregtech/api/enums/OrePrefixes.java b/src/main/java/gregtech/api/enums/OrePrefixes.java
new file mode 100644
index 0000000000..bd30f03c3e
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/OrePrefixes.java
@@ -0,0 +1,1417 @@
+package gregtech.api.enums;
+
+import static gregtech.api.enums.GT_Values.B;
+import static gregtech.api.enums.GT_Values.D2;
+import static gregtech.api.enums.GT_Values.M;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+
+import com.google.common.collect.ImmutableList;
+
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+import gregtech.api.interfaces.ICondition;
+import gregtech.api.interfaces.IOreRecipeRegistrator;
+import gregtech.api.interfaces.ISubTagContainer;
+import gregtech.api.objects.GT_ArrayList;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.ItemData;
+import gregtech.api.objects.MaterialStack;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+import gregtech.loaders.materialprocessing.ProcessingModSupport;
+import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet;
+import it.unimi.dsi.fastutil.objects.ObjectSet;
+
+public enum OrePrefixes {
+
+ @Deprecated
+ pulp("Pulps", "", "", false, false, false, false, false, false, false, false, false, false,
+ B[0] | B[1] | B[2] | B[3], -1, 64, -1),
+ @Deprecated
+ leaves("Leaves", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ @Deprecated
+ sapling("Saplings", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ @Deprecated
+ itemDust("Dusts", "", "", false, false, false, false, false, false, false, false, false, false,
+ B[0] | B[1] | B[2] | B[3], -1, 64, -1),
+ /** In case of an End-Ores Mod. Ore -> Material is a Oneway Operation! */
+ oreBlackgranite("Black Granite Ores", "Granite ", " Ore", true, true, false, false, false, true, false, false,
+ false, true, B[3], -1, 64, -1),
+ /** In case of an End-Ores Mod. Ore -> Material is a Oneway Operation! */
+ oreRedgranite("Red Granite Ores", "Granite ", " Ore", true, true, false, false, false, true, false, false, false,
+ true, B[3], -1, 64, -1),
+ /** In case of an End-Ores Mod. Ore -> Material is a Oneway Operation! */
+ oreMarble("Marble Ores", "Marble ", " Ore", true, true, false, false, false, true, false, false, false, true, B[3],
+ -1, 64, -1),
+ /** In case of an End-Ores Mod. Ore -> Material is a Oneway Operation! */
+ oreBasalt("Basalt Ores", "Basalt ", " Ore", true, true, false, false, false, true, false, false, false, true, B[3],
+ -1, 64, -1),
+ /** Prefix of the Nether-Ores Mod. Causes Ores to double. Ore -> Material is a Oneway Operation! */
+ oreNetherrack("Netherrack Ores", "Nether ", " Ore", true, true, false, false, false, true, false, false, false,
+ true, B[3], -1, 64, -1),
+ /** Prefix of the Nether-Ores Mod. Causes Ores to double. Ore -> Material is a Oneway Operation! */
+ oreNether("Nether Ores", "Nether ", " Ore", true, true, false, false, false, true, false, false, false, true, B[3],
+ -1, 64, -1),
+ @Deprecated
+ denseore("Dense Ores", "", "", false, false, false, false, false, true, false, false, false, true, B[3], -1, 64,
+ -1),
+ /** Prefix of the Dense-Ores Mod. Causes Ores to double. Ore -> Material is a Oneway Operation! */
+ oreDense("Dense Ores", "Dense ", " Ore", true, true, false, false, false, true, false, false, false, true, B[3], -1,
+ 64, -1),
+ /** Prefix of TFC */
+ oreRich("Rich Ores", "Rich ", " Ore", true, true, false, false, false, true, false, false, false, true, B[3], -1,
+ 64, -1),
+ /** Prefix of TFC */
+ oreNormal("Normal Ores", "Normal ", " Ore", true, true, false, false, false, true, false, false, false, true, B[3],
+ -1, 64, -1),
+ /** Prefix of Railcraft. */
+ oreSmall("Small Ores", "Small ", " Ore", true, true, false, false, false, true, false, false, false, true, B[3], -1,
+ 64, 67),
+ /** Prefix of Railcraft. */
+ orePoor("Poor Ores", "Poor ", " Ore", true, true, false, false, false, true, false, false, false, true, B[3], -1,
+ 64, -1),
+ /** In case of an End-Ores Mod. Ore -> Material is a Oneway Operation! */
+ oreEndstone("Endstone Ores", "End ", " Ore", true, true, false, false, false, true, false, false, false, true, B[3],
+ -1, 64, -1),
+ /** In case of an End-Ores Mod. Ore -> Material is a Oneway Operation! */
+ oreEnd("End Ores", "End ", " Ore", true, true, false, false, false, true, false, false, false, true, B[3], -1, 64,
+ -1),
+ @Deprecated
+ oreGem("Ores", "", "", false, false, false, false, false, true, false, false, false, true, B[3], -1, 64, -1),
+ /** Regular Ore Prefix. Ore -> Material is a Oneway Operation! Introduced by Eloraam */
+ ore("Ores", "", " Ore", true, true, false, false, false, true, false, false, false, true, B[3], -1, 64, 68),
+ crushedCentrifuged("Centrifuged Ores", "Centrifuged ", " Ore", true, true, false, false, false, false, false, true,
+ false, true, B[3], -1, 64, 7),
+ crushedPurified("Purified Ores", "Purified ", " Ore", true, true, false, false, false, false, false, true, false,
+ true, B[3], -1, 64, 6),
+ crushed("Crushed Ores", "Crushed ", " Ore", true, true, false, false, false, false, false, true, false, true, B[3],
+ -1, 64, 5),
+ rawOre("Raw Ore", "Raw ", " Ore", true, true, false, false, false, false, false, false, false, true, B[3], -1, 64,
+ 64),
+
+ /** Introduced by Mekanism */
+ shard("Crystallised Shards", "", "", true, true, false, false, false, false, false, false, false, true, B[3], -1,
+ 64, -1),
+ clump("Clumps", "", "", true, true, false, false, false, false, false, false, false, true, B[3], -1, 64, -1),
+ reduced("Reduced Gravels", "", "", true, true, false, false, false, false, false, false, false, true, B[3], -1, 64,
+ -1),
+ crystalline("Crystallised Metals", "", "", true, true, false, false, false, false, false, false, false, true, B[3],
+ -1, 64, -1),
+ cleanGravel("Clean Gravels", "", "", true, true, false, false, false, false, false, false, false, true, B[3], -1,
+ 64, -1),
+ dirtyGravel("Dirty Gravels", "", "", true, true, false, false, false, false, false, false, false, true, B[3], -1,
+ 64, -1),
+ /** A quintuple Ingot. */
+ ingotQuintuple("5x Ingots", "Quintuple ", " Ingot", true, true, false, false, false, false, true, true, false,
+ false, B[1], M * 5, 64, 16),
+ /** A quadruple Ingot. */
+ ingotQuadruple("4x Ingots", "Quadruple ", " Ingot", true, true, false, false, false, false, true, true, false,
+ false, B[1], M * 4, 64, 15),
+ @Deprecated
+ ingotQuad("4x Ingots", "Quadruple ", " Ingot", false, false, false, false, false, false, false, false, false, false,
+ B[1], -1, 64, 15),
+ /** A triple Ingot. */
+ ingotTriple("3x Ingots", "Triple ", " Ingot", true, true, false, false, false, false, true, false, false, false,
+ B[1], M * 3, 64, 14),
+ /** A double Ingot. Introduced by TerraFirmaCraft */
+ ingotDouble("2x Ingots", "Double ", " Ingot", true, true, false, false, false, false, true, true, false, false,
+ B[1], M * 2, 64, 13),
+ /** A hot Ingot, which has to be cooled down by a Vacuum Freezer. */
+ ingotHot("Hot Ingots", "Hot ", " Ingot", true, true, false, false, false, false, false, true, false, false, B[1],
+ M * 1, 64, 12),
+ /** A regular Ingot. Introduced by Eloraam */
+ ingot("Ingots", "", " Ingot", true, true, false, false, false, false, false, true, false, false, B[1], M * 1, 64,
+ 11),
+ /** A regular Gem worth one small Dust. Introduced by TerraFirmaCraft */
+ gemChipped("Chipped Gemstones", "Chipped ", "", true, true, true, false, false, false, true, true, false, false,
+ B[2], M / 4, 64, 59),
+ /** A regular Gem worth two small Dusts. Introduced by TerraFirmaCraft */
+ gemFlawed("Flawed Gemstones", "Flawed ", "", true, true, true, false, false, false, true, true, false, false, B[2],
+ M / 2, 64, 60),
+ /** A regular Gem worth two Dusts. Introduced by TerraFirmaCraft */
+ gemFlawless("Flawless Gemstones", "Flawless ", "", true, true, true, false, false, false, true, true, false, false,
+ B[2], M * 2, 64, 61),
+ /** A regular Gem worth four Dusts. Introduced by TerraFirmaCraft */
+ gemExquisite("Exquisite Gemstones", "Exquisite ", "", true, true, true, false, false, false, true, true, false,
+ false, B[2], M * 4, 64, 62),
+ /** A regular Gem worth one Dust. Introduced by Eloraam */
+ gem("Gemstones", "", "", true, true, true, false, false, false, true, true, false, false, B[2], M * 1, 64, 8),
+ @Deprecated
+ dustDirty("Impure Dusts", "", "", false, false, false, false, false, false, false, false, false, true, B[3], -1, 64,
+ 3),
+ /** 1/9th of a Dust. */
+ dustTiny("Tiny Dusts", "Tiny Pile of ", " Dust", true, true, false, false, false, false, false, true, false, false,
+ B[0] | B[1] | B[2] | B[3], M / 9, 64, 0),
+ /** 1/4th of a Dust. */
+ dustSmall("Small Dusts", "Small Pile of ", " Dust", true, true, false, false, false, false, false, true, false,
+ false, B[0] | B[1] | B[2] | B[3], M / 4, 64, 1),
+ /** Dust with impurities. 1 Unit of Main Material and 1/9 - 1/4 Unit of secondary Material */
+ dustImpure("Impure Dusts", "Impure Pile of ", " Dust", true, true, false, false, false, false, false, true, false,
+ true, B[3], M * 1, 64, 3),
+ dustRefined("Refined Dusts", "Refined Pile of ", " Dust", true, true, false, false, false, false, false, true,
+ false, true, B[3], M * 1, 64, 2),
+ dustPure("Purified Dusts", "Purified Pile of ", " Dust", true, true, false, false, false, false, false, true, false,
+ true, B[3], M * 1, 64, 4),
+ /** Pure Dust worth of one Ingot or Gem. Introduced by Alblaka. */
+ dust("Dusts", "", " Dust", true, true, false, false, false, false, false, true, false, false,
+ B[0] | B[1] | B[2] | B[3], M * 1, 64, 2),
+ /** A Nugget. Introduced by Eloraam */
+ nugget("Nuggets", "", " Nugget", true, true, false, false, false, false, false, true, false, false, B[1], M / 9, 64,
+ 9),
+ /** Special Alloys have this prefix. */
+ plateAlloy("Alloy Plates", "", "", true, false, false, false, false, false, false, false, false, false, B[1], -1,
+ 64, 17),
+ plateSteamcraft("Steamcraft Plates", "", "", false, false, false, false, false, false, false, false, false, false,
+ B[1], -1, 64, 17),
+ /** 9 Plates combined in one Item. */
+ plateDense("Dense Plates", "Dense ", " Plate", true, true, false, false, false, false, true, true, false, false,
+ B[1], M * 9, 64, 22),
+ plateQuintuple("5x Plates", "Quintuple ", " Plate", true, true, false, false, false, false, true, true, false,
+ false, B[1], M * 5, 64, 21),
+ plateQuadruple("4x Plates", "Quadruple ", " Plate", true, true, false, false, false, false, true, true, false,
+ false, B[1], M * 4, 64, 20),
+ @Deprecated
+ plateQuad("4x Plates", "", "", false, false, false, false, false, false, false, false, false, false, B[1], -1, 64,
+ 20),
+ plateTriple("3x Plates", "Triple ", " Plate", true, true, false, false, false, false, true, true, false, false,
+ B[1], M * 3, 64, 19),
+ plateDouble("2x Plates", "Double ", " Plate", true, true, false, false, false, false, true, true, false, false,
+ B[1], M * 2, 64, 18),
+ plate("Plates", "", " Plate", true, true, false, false, false, false, true, true, false, false, B[1] | B[2], M * 1,
+ 64, 17),
+ /** Casing made of 1/2 Ingot/Dust */
+ itemCasing("Casings", "", " Casing", true, true, false, false, false, false, true, true, false, false, B[1] | B[2],
+ M / 2, 64, 10),
+ /** Foil made of 1/4 Ingot/Dust. */
+ foil("Foils", "", " Foil", true, true, false, false, false, false, true, true, false, false, B[1], M / 4, 64, 29),
+ /** Stick made of an Ingot. */
+ stickLong("Long Sticks/Rods", "Long ", " Rod", true, true, false, false, false, false, true, true, false, false,
+ B[1] | B[2], M * 1, 64, 54),
+ /** Stick made of half an Ingot. Introduced by Eloraam */
+ stick("Sticks/Rods", "", " Rod", true, true, false, false, false, false, true, true, false, false, B[1] | B[2],
+ M / 2, 64, 23),
+ /** consisting out of one Nugget. */
+ round("Rounds", "", " Round", true, true, false, false, false, false, true, true, false, false, B[1], M / 9, 64,
+ 25),
+ /** consisting out of 1/8 Ingot or 1/4 Stick. */
+ bolt("Bolts", "", " Bolt", true, true, false, false, false, false, true, true, false, false, B[1] | B[2], M / 8, 64,
+ 26),
+ /** contain dusts */
+ comb("Combs", "", " Comb", false, false, false, false, false, false, false, true, false, false, B[1] | B[2], M, 64,
+ 101),
+ /** consisting out of a Bolt. */
+ screw("Screws", "", " Screw", true, true, false, false, false, false, true, true, false, false, B[1] | B[2], M / 9,
+ 64, 27),
+ /** consisting out of 1/2 Stick. */
+ ring("Rings", "", " Ring", true, true, false, false, false, false, true, true, false, false, B[1], M / 4, 64, 28),
+ /** consisting out of 1 Fine Wire. */
+ springSmall("Small Springs", "Small ", " Spring", true, true, false, false, false, false, true, true, false, false,
+ B[1], M / 4, 64, 55),
+ /** consisting out of 2 Sticks. */
+ spring("Springs", "", " Spring", true, true, false, false, false, false, true, true, false, false, B[1], M * 1, 64,
+ 56),
+ /** consisting out of 1/8 Ingot or 1/4 Wire. */
+ wireFine("Fine Wires", "Fine ", " Wire", true, true, false, false, false, false, true, true, false, false, B[1],
+ M / 8, 64, 51),
+ /** consisting out of 4 Plates, 1 Ring and 1 Screw. */
+ rotor("Rotors", "", " Rotor", true, true, false, false, false, false, true, true, false, false, B[7], M * 4 + M / 4,
+ 64, 53),
+ gearGtSmall("Small Gears", "Small ", " Gear", true, true, false, false, false, false, true, true, false, false,
+ B[7], M * 1, 64, 52),
+ /** Introduced by me because BuildCraft has ruined the gear Prefix... */
+ gearGt("Gears", "", " Gear", true, true, false, false, false, false, true, true, false, false, B[7], M * 4, 16, 63),
+ /** 3/4 of a Plate or Gem used to shape a Lense. Normally only used on Transparent Materials. */
+ lens("Lenses", "", " Lens", true, true, false, false, false, false, true, true, false, false, B[2], (M * 3) / 4, 64,
+ 24),
+ /** consisting out of 16 Dusts. */
+ crateGtDust("Crates of Dust", "Crate of ", " Dust", true, true, false, true, false, false, false, true, false,
+ false, B[0] | B[1] | B[2] | B[3], -1, 64, 96),
+ /** consisting out of 16 Plates. */
+ crateGtPlate("Crates of Plates", "Crate of ", " Plate", true, true, false, true, false, false, false, true, false,
+ false, B[1] | B[2], -1, 64, 99),
+ /** consisting out of 16 Ingots. */
+ crateGtIngot("Crates of Ingots", "Crate of ", " Ingot", true, true, false, true, false, false, false, true, false,
+ false, B[1], -1, 64, 97),
+ /** consisting out of 16 Gems. */
+ crateGtGem("Crates of Gems", "Crate of ", " Gem", true, true, false, true, false, false, false, true, false, false,
+ B[2], -1, 64, 98),
+ /** Hot Cell full of Plasma, which can be used in the Plasma Generator. */
+ cellPlasma("Cells of Plasma", "", " Plasma Cell", true, true, true, true, false, false, false, true, false, false,
+ B[5], M * 1, 64, 31),
+ /** Hot Cell full of molten stuff, which can be used in the Plasma Generator. */
+ cellMolten("Cells of Molten stuff", "Molten ", " Cell", true, true, true, true, false, false, false, true, false,
+ false, 0, M * 1, 64, 31),
+ cell("Cells", "", " Cell", true, true, true, true, false, false, true, true, false, false, B[4] | B[8], M * 1, 64,
+ 30),
+ /** A vanilla Iron Bucket filled with the Material. */
+ bucket("Buckets", "", " Bucket", true, true, true, true, false, false, true, false, false, false, B[4] | B[8],
+ M * 1, 64, -1),
+ /** An Iguana Tweaks Clay Bucket filled with the Material. */
+ bucketClay("Clay Buckets", "", " Clay Bucket", true, true, true, true, false, false, true, false, false, false,
+ B[4] | B[8], M * 1, 64, -1),
+ /** Glass Bottle containing a Fluid. */
+ bottle("Bottles", "", " Bottle", true, true, true, true, false, false, false, false, false, false, B[4] | B[8], -1,
+ 64, -1),
+ capsule("Capsules", "", " Capsule", false, true, true, true, false, false, false, false, false, false, B[4] | B[8],
+ M * 1, 64, -1),
+ crystal("Crystals", "", " Crystal", false, true, false, false, false, false, true, false, false, false, B[2], M * 1,
+ 64, -1),
+ bulletGtSmall("Small Bullets", "Small ", " Bullet", true, true, false, false, true, false, true, false, true, false,
+ B[6] | B[8], M / 9, 64, -1),
+ bulletGtMedium("Medium Bullets", "Medium ", " Bullet", true, true, false, false, true, false, true, false, true,
+ false, B[6] | B[8], M / 6, 64, -1),
+ bulletGtLarge("Large Bullets", "Large ", " Bullet", true, true, false, false, true, false, true, false, true, false,
+ B[6] | B[8], M / 3, 64, -1),
+ /** Arrow made of 1/4 Ingot/Dust + Wooden Stick. */
+ arrowGtWood("Regular Arrows", "", " Arrow", true, true, false, false, true, false, true, false, true, false, B[6],
+ M / 4, 64, 57),
+ /** Arrow made of 1/4 Ingot/Dust + Plastic Stick. */
+ arrowGtPlastic("Light Arrows", "Light ", " Arrow", true, true, false, false, true, false, true, false, true, false,
+ B[6], M / 4, 64, 58),
+ arrow("Arrows", "", "", false, false, true, false, false, false, false, false, true, false, B[6], -1, 64, 57),
+ /** consisting out of 1/4 Ingot. */
+ toolHeadArrow("Arrow Heads", "", " Arrow Head", true, true, false, false, false, false, true, true, false, false,
+ B[6], M / 4, 64, 46),
+ /** consisting out of 2 Ingots. */
+ toolHeadSword("Sword Blades", "", " Sword Blade", true, true, false, false, false, false, true, true, false, false,
+ B[6], M * 2, 64, 32),
+ /** consisting out of 3 Ingots. */
+ toolHeadPickaxe("Pickaxe Heads", "", " Pickaxe Head", true, true, false, false, false, false, true, true, false,
+ false, B[6], M * 3, 64, 33),
+ /** consisting out of 1 Ingots. */
+ toolHeadShovel("Shovel Heads", "", " Shovel Head", true, true, false, false, false, false, true, true, false, false,
+ B[6], M * 1, 64, 34),
+ /** consisting out of 1 Ingots. */
+ toolHeadUniversalSpade("Universal Spade Heads", "", " Universal Spade Head", true, true, false, false, false, false,
+ true, true, false, false, B[6], M * 1, 64, 43),
+ /** consisting out of 3 Ingots. */
+ toolHeadAxe("Axe Heads", "", " Axe Head", true, true, false, false, false, false, true, true, false, false, B[6],
+ M * 3, 64, 35),
+ /** consisting out of 2 Ingots. */
+ toolHeadHoe("Hoe Heads", "", " Hoe Head", true, true, false, false, false, false, true, true, false, false, B[6],
+ M * 2, 64, 36),
+ /** consisting out of 3 Ingots. */
+ toolHeadSense("Sense Blades", "", " Sense Blade", true, true, false, false, false, false, true, true, false, false,
+ B[6], M * 3, 64, 44),
+ /** consisting out of 2 Ingots. */
+ toolHeadFile("File Heads", "", " File Head", true, true, false, false, false, false, true, true, false, false, B[6],
+ M * 2, 64, 38),
+ /** consisting out of 6 Ingots. */
+ toolHeadHammer("Hammer Heads", "", " Hammer Head", true, true, false, false, false, false, true, true, false, false,
+ B[6], M * 6, 64, 37),
+ /** consisting out of 4 Ingots. */
+ toolHeadPlow("Plow Heads", "", " Plow Head", true, true, false, false, false, false, true, true, false, false, B[6],
+ M * 4, 64, 45),
+ /** consisting out of 2 Ingots. */
+ toolHeadSaw("Saw Blades", "", " Saw Blade", true, true, false, false, false, false, true, true, false, false, B[6],
+ M * 2, 64, 39),
+ /** consisting out of 4 Ingots. */
+ toolHeadBuzzSaw("Buzzsaw Blades", "", " Buzzsaw Blade", true, true, false, false, false, false, true, true, false,
+ false, B[6], M * 4, 64, 48),
+ /** consisting out of 1 Ingots. */
+ toolHeadScrewdriver("Screwdriver Tips", "", " Screwdriver Tip", true, true, false, false, false, false, true, false,
+ false, false, B[6], M * 1, 64, 47),
+ /** consisting out of 4 Ingots. */
+ toolHeadDrill("Drill Tips", "", " Drill Tip", true, true, false, false, false, false, true, true, false, false,
+ B[6], M * 4, 64, 40),
+ /** consisting out of 2 Ingots. */
+ toolHeadChainsaw("Chainsaw Tips", "", " Chainsaw Tip", true, true, false, false, false, false, true, true, false,
+ false, B[6], M * 2, 64, 41),
+ /** consisting out of 4 Ingots. */
+ toolHeadWrench("Wrench Tips", "", " Wrench Tip", true, true, false, false, false, false, true, true, false, false,
+ B[6], M * 4, 64, 42),
+ /** consisting out of 6 Ingots. */
+ turbineBlade("Turbine Blades", "", " Turbine Blade", true, true, false, false, false, false, true, true, false,
+ false, B[6], M * 6, 64, 100),
+ /** vanilly Sword */
+ toolSword("Swords", "", "", false, true, false, false, false, false, true, false, true, false, B[6], M * 2, 1, -1),
+ /** vanilly Pickaxe */
+ toolPickaxe("Pickaxes", "", "", false, true, false, false, false, false, true, false, true, false, B[6], M * 3, 1,
+ -1),
+ /** vanilly Shovel */
+ toolShovel("Shovels", "", "", false, true, false, false, false, false, true, false, true, false, B[6], M * 1, 1,
+ -1),
+ /** vanilly Axe */
+ toolAxe("Axes", "", "", false, true, false, false, false, false, true, false, true, false, B[6], M * 3, 1, -1),
+ /** vanilly Hoe */
+ toolHoe("Hoes", "", "", false, true, false, false, false, false, true, false, true, false, B[6], M * 2, 1, -1),
+ /** vanilly Shears */
+ toolShears("Shears", "", "", false, true, false, false, false, false, true, false, true, false, B[6], M * 2, 1, -1),
+ /**
+ * toolPot, toolSkillet, toolSaucepan, toolBakeware, toolCuttingboard, toolMortarandpestle, toolMixingbowl,
+ * toolJuicer
+ */
+ tool("Tools", "", "", false, false, false, false, false, false, false, false, true, false, B[6], -1, 1, -1),
+ compressedCobblestone("9^X Compressed Cobblestones", "", "", false, false, false, false, false, false, false, false,
+ false, false, 0, -1, 64, -1),
+ compressedStone("9^X Compressed Stones", "", "", false, false, false, false, false, false, false, false, false,
+ false, 0, -1, 64, -1),
+ compressedDirt("9^X Compressed Dirt", "", "", false, false, false, false, false, false, false, false, false, false,
+ 0, -1, 64, -1),
+ compressedGravel("9^X Compressed Gravel", "", "", false, false, false, false, false, false, false, false, false,
+ false, 0, -1, 64, -1),
+ compressedSand("9^X Compressed Sand", "", "", false, false, false, false, false, false, false, false, false, false,
+ 0, -1, 64, -1),
+ /** Compressed Material, worth 1 Unit. Introduced by Galacticraft */
+ compressed("Compressed Materials", "Compressed ", "", true, true, false, false, false, false, true, false, false,
+ false, 0, M * 3, 64, -1),
+ glass("Glasses", "", "", false, false, true, false, true, false, false, false, false, false, 0, -1, 64, -1),
+ paneGlass("Glass Panes", "", "", false, false, true, false, false, true, false, false, false, false, 0, -1, 64, -1),
+ blockGlass("Glass Blocks", "", "", false, false, true, false, false, true, false, false, false, false, 0, -1, 64,
+ -1),
+ blockWool("Wool Blocks", "", "", false, false, true, false, false, true, false, false, false, false, 0, -1, 64, -1),
+ /** IGNORE */
+ block_("Random Blocks", "", "", false, false, false, false, false, true, false, false, false, false, 0, -1, 64, -1),
+ /** Storage Block consisting out of 9 Ingots/Gems/Dusts. Introduced by CovertJaguar */
+ block("Storage Blocks", "Block of ", "", true, true, false, false, false, true, true, false, false, false, 0, M * 9,
+ 64, 71),
+ /** Special Prefix used mainly for the Crafting Handler. */
+ craftingTool("Crafting Tools", "", "", false, false, false, false, false, false, false, false, true, false, 0, -1,
+ 64, -1),
+ /** Special Prefix used mainly for the Crafting Handler. */
+ crafting("Crafting Ingredients", "", "", false, false, false, false, false, false, false, false, false, false, 0,
+ -1, 64, -1),
+ /** Special Prefix used mainly for the Crafting Handler. */
+ craft("Crafting Stuff?", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64,
+ -1),
+ /** Prefix used for Logs. Usually as "logWood". Introduced by Eloraam */
+ log("Logs", "", "", false, false, false, false, false, true, false, false, false, false, 0, -1, 64, -1),
+ /** Prefix used for Slabs. Usually as "slabWood" or "slabStone". Introduced by SirSengir */
+ slab("Slabs", "", "", false, false, false, false, false, true, false, false, false, false, 0, -1, 64, -1),
+ /** Prefix used for Stairs. Usually as "stairWood" or "stairStone". Introduced by SirSengir */
+ stair("Stairs", "", "", false, false, false, false, false, true, false, false, false, false, 0, -1, 64, -1),
+ /** Prefix used for Fences. Usually as "fenceWood". Introduced by Forge */
+ fence("Fences", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ /** Prefix for Planks. Usually "plankWood". Introduced by Eloraam */
+ plank("Planks", "", "", false, false, false, false, false, true, false, false, false, false, 0, -1, 64, -1),
+ /** Prefix for Saplings. */
+ treeSapling("Saplings", "", "", false, false, true, false, false, true, false, false, false, false, 0, -1, 64, -1),
+ /** Prefix for Leaves. */
+ treeLeaves("Leaves", "", "", false, false, true, false, false, true, false, false, false, false, 0, -1, 64, -1),
+ /** Prefix for Tree Parts. */
+ tree("Tree Parts", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ /** Cobblestone Prefix for all Cobblestones. */
+ stoneCobble("Cobblestones", "", "", false, false, true, false, false, true, false, false, false, false, 0, -1, 64,
+ -1),
+ /** Smoothstone Prefix. */
+ stoneSmooth("Smoothstones", "", "", false, false, true, false, false, true, false, false, false, false, 0, -1, 64,
+ -1),
+ /** Mossy Stone Bricks. */
+ stoneMossyBricks("mossy Stone Bricks", "", "", false, false, true, false, false, true, false, false, false, false,
+ 0, -1, 64, -1),
+ /** Mossy Cobble. */
+ stoneMossy("Mossy Stones", "", "", false, false, true, false, false, true, false, false, false, false, 0, -1, 64,
+ -1),
+ @Deprecated
+ stoneBricksMossy("Mossy Stone Bricks", "", "", false, false, false, false, false, true, false, false, false, false,
+ 0, -1, 64, -1),
+ /** Stone Bricks. */
+ stoneBricks("Stone Bricks", "", "", false, false, true, false, false, true, false, false, false, false, 0, -1, 64,
+ -1),
+ @Deprecated
+ stoneBrick("Stone Bricks", "", "", false, false, false, false, false, true, false, false, false, false, 0, -1, 64,
+ -1),
+ /** Cracked Bricks. */
+ stoneCracked("Cracked Stones", "", "", false, false, true, false, false, true, false, false, false, false, 0, -1,
+ 64, -1),
+ /** Chiseled Stone. */
+ stoneChiseled("Chiseled Stones", "", "", false, false, true, false, false, true, false, false, false, false, 0, -1,
+ 64, -1),
+ /** Prefix to determine which kind of Rock this is. */
+ stone("Stones", "", "", false, true, true, false, true, true, false, false, false, false, 0, -1, 64, -1),
+ cobblestone("Cobblestones", "", "", false, true, true, false, false, true, false, false, false, false, 0, -1, 64,
+ -1),
+ /** Prefix to determine which kind of Rock this is. */
+ rock("Rocks", "", "", false, true, true, false, true, true, false, false, false, false, 0, -1, 64, -1),
+ record("Records", "", "", false, false, true, false, false, false, false, false, false, false, 0, -1, 1, -1),
+ rubble("Rubbles", "", "", true, true, true, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ scraps("Scraps", "", "", true, true, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ scrap("Scraps", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ /** IGNORE */
+ item_("Items", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ /** Random Item. Introduced by Alblaka */
+ item("Items", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ /** Used for Books of any kind. */
+ book("Books", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ /** Used for Papers of any kind. */
+ paper("Papers", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ /** Used for the 16 dyes. Introduced by Eloraam */
+ dye("Dyes", "", "", false, false, true, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ /** Used for the 16 colors of Stained Clay. Introduced by Forge */
+ stainedClay("Stained Clays", "", "", false, false, true, false, false, true, false, false, false, false, 0, -1, 64,
+ -1),
+ /** vanilly Helmet */
+ armorHelmet("Helmets", "", "", false, true, false, false, false, false, true, false, true, false, B[6], M * 5, 1,
+ -1),
+ /** vanilly Chestplate */
+ armorChestplate("Chestplates", "", "", false, true, false, false, false, false, true, false, true, false, B[6],
+ M * 8, 1, -1),
+ /** vanilly Pants */
+ armorLeggings("Leggings", "", "", false, true, false, false, false, false, true, false, true, false, B[6], M * 7, 1,
+ -1),
+ /** vanilly Boots */
+ armorBoots("Boots", "", "", false, true, false, false, false, false, true, false, true, false, B[6], M * 4, 1, -1),
+ armor("Armor Parts", "", "", false, false, false, false, false, false, false, false, true, false, B[6], -1, 1, -1),
+ frameGt("Frame Boxes", "", "", true, true, false, false, true, false, true, false, false, false, 0, M * 2, 64, 83),
+ pipeTiny("Tiny Pipes", "Tiny ", " Pipe", true, true, false, false, true, false, true, false, false, false, 0, M / 2,
+ 64, 78),
+ pipeSmall("Small Pipes", "Small ", " Pipe", true, true, false, false, true, false, true, false, false, false, 0,
+ M * 1, 64, 79),
+ pipeMedium("Medium Pipes", "Medium ", " Pipe", true, true, false, false, true, false, true, false, false, false, 0,
+ M * 3, 64, 80),
+ pipeLarge("Large pipes", "Large ", " Pipe", true, true, false, false, true, false, true, false, false, false, 0,
+ M * 6, 64, 81),
+ pipeHuge("Huge Pipes", "Huge ", " Pipe", true, true, false, false, true, false, true, false, false, false, 0,
+ M * 12, 64, 82),
+ pipeQuadruple("Quadruple Pipes", "Quadruple ", " Pipe", true, true, false, false, true, false, true, false, false,
+ false, 0, M * 12, 64, 84),
+ pipeNonuple("Nonuple Pipes", "Nonuple ", " Pipe", true, true, false, false, true, false, true, false, false, false,
+ 0, M * 9, 64, 85),
+ pipeRestrictiveTiny("Tiny Restrictive Pipes", "Tiny Restrictive ", " Pipe", true, true, false, false, true, false,
+ true, false, false, false, 0, M / 2, 64, 78),
+ pipeRestrictiveSmall("Small Restrictive Pipes", "Small Restrictive ", " Pipe", true, true, false, false, true,
+ false, true, false, false, false, 0, M * 1, 64, 79),
+ pipeRestrictiveMedium("Medium Restrictive Pipes", "Medium Restrictive ", " Pipe", true, true, false, false, true,
+ false, true, false, false, false, 0, M * 3, 64, 80),
+ pipeRestrictiveLarge("Large Restrictive Pipes", "Large Restrictive ", " Pipe", true, true, false, false, true,
+ false, true, false, false, false, 0, M * 6, 64, 81),
+ pipeRestrictiveHuge("Huge Restrictive Pipes", "Huge Restrictive ", " Pipe", true, true, false, false, true, false,
+ true, false, false, false, 0, M * 12, 64, 82),
+ pipe("Pipes", "", " Pipe", true, false, false, false, false, false, false, false, false, false, 0, -1, 64, 77),
+ wireGt16("16x Wires", "16x ", " Wire", true, true, false, false, false, false, true, false, false, false, 0, M * 8,
+ 64, -1),
+ wireGt12("12x Wires", "12x ", " Wire", true, true, false, false, false, false, true, false, false, false, 0, M * 6,
+ 64, -1),
+ wireGt08("8x Wires", "8x ", " Wire", true, true, false, false, false, false, true, false, false, false, 0, M * 4,
+ 64, -1),
+ wireGt04("4x Wires", "4x ", " Wire", true, true, false, false, false, false, true, false, false, false, 0, M * 2,
+ 64, -1),
+ wireGt02("2x Wires", "2x ", " Wire", true, true, false, false, false, false, true, false, false, false, 0, M * 1,
+ 64, -1),
+ wireGt01("1x Wires", "1x ", " Wire", true, true, false, false, false, false, true, false, false, false, 0, M / 2,
+ 64, -1),
+ cableGt16("16x Cables", "16x ", " Cable", true, true, false, false, false, false, true, false, false, false, 0,
+ M * 8, 64, -1),
+ cableGt12("12x Cables", "12x ", " Cable", true, true, false, false, false, false, true, false, false, false, 0,
+ M * 6, 64, -1),
+ cableGt08("8x Cables", "8x ", " Cable", true, true, false, false, false, false, true, false, false, false, 0, M * 4,
+ 64, -1),
+ cableGt04("4x Cables", "4x ", " Cable", true, true, false, false, false, false, true, false, false, false, 0, M * 2,
+ 64, -1),
+ cableGt02("2x Cables", "2x ", " Cable", true, true, false, false, false, false, true, false, false, false, 0, M * 1,
+ 64, -1),
+ cableGt01("1x Cables", "1x ", " Cable", true, true, false, false, false, false, true, false, false, false, 0, M / 2,
+ 64, -1),
+
+ /*
+ * Electric Components. usual Materials for this are: Primitive (Tier 1) Basic (Tier 2) as used by UE as well : IC2
+ * Circuit and RE-Battery Good (Tier 3) Advanced (Tier 4) as used by UE as well : Advanced Circuit, Advanced Battery
+ * and Lithium Battery Data (Tier 5) : Data Storage Circuit Elite (Tier 6) as used by UE as well : Energy Crystal
+ * and Data Control Circuit Master (Tier 7) : Energy Flow Circuit and Lapotron Crystal Ultimate (Tier 8) : Data Orb
+ * and Lapotronic Energy Orb Infinite (Cheaty)
+ */
+ batterySingleuse("Single Use Batteries", "", "", false, true, false, false, false, false, false, false, false,
+ false, 0, -1, 64, -1),
+ battery("Reusable Batteries", "", "", false, true, false, false, false, false, false, false, false, false, 0, -1,
+ 64, -1),
+ circuit("Circuits", "", "", true, true, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ /** Introduced by Buildcraft */
+ chipset("Chipsets", "", "", true, true, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ /** A whole Computer. "computerMaster" = ComputerCube */
+ computer("Computers", "", "", true, true, false, false, true, false, false, false, false, false, 0, -1, 64, -1),
+
+ // random known prefixes without special abilities.
+ skull("Skulls", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ plating("Platings", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ dinosaur("Dinosaurs", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ travelgear("Travel Gear", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64,
+ -1),
+ bauble("Baubles", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ cluster("Clusters", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ grafter("Grafters", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ scoop("Scoops", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ frame("Frames", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ tome("Tomes", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ junk("Junk", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ bee("Bees", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ rod("Rods", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ dirt("Dirts", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ sand("Sands", "", "", false, false, true, false, false, true, false, false, false, false, 0, -1, 64, -1),
+ grass("Grasses", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ gravel("Gravels", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ mushroom("Mushrooms", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ /** Introduced by Eloraam */
+ wood("Woods", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ drop("Drops", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ fuel("Fuels", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ panel("Panels", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ brick("Bricks", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ chunk("Chunks", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ wire("Wires", "", "", false, false, false, false, true, false, false, false, false, false, 0, -1, 64, -1),
+ seed("Seeds", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ reed("Reeds", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ sheetDouble("2x Sheets", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64,
+ -1),
+ sheet("Sheets", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ crop("Crops", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ plant("Plants", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ coin("Coins", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ lumar("Lumars", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ ground("Grounded Stuff", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64,
+ -1),
+ cable("Cables", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ component("Components", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64,
+ -1),
+ wax("Waxes", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ wall("Walls", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ tube("Tubes", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ list("Lists", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ food("Foods", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ /** Introduced by SirSengir */
+ gear("Gears", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ coral("Corals", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ flower("Flowers", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ storage("Storages", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ material("Materials", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ plasma("Plasmas", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ element("Elements", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ molecule("Molecules", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ wafer("Wafers", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ orb("Orbs", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ handle("Handles", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ blade("Blades", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ head("Heads", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ motor("Motors", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ bit("Bits", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ shears("Shears", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ turbine("Turbines", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ fertilizer("Fertilizers", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64,
+ -1),
+ chest("Chests", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ raw("Raw Things", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ stainedGlass("Stained Glasses", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1,
+ 64, -1),
+ mystic("Mystic Stuff", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ mana("Mana Stuff", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ rune("Runes", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ petal("Petals", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ pearl("Pearls", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ powder("Powders", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ soulsand("Soulsands", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ obsidian("Obsidians", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ glowstone("Glowstones", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64,
+ -1),
+ beans("Beans", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ br("br", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ essence("Essences", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ alloy("Alloys", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ cooking("Cooked Things", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64,
+ -1),
+ elven("Elven Stuff", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ reactor("Reactors", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ mffs("MFFS", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ projred("Project Red", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ ganys("Ganys Stuff", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ liquid("Liquids", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ bars("Bars", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ bar("Bars", "", "", false, false, false, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ /** Reverse Head consisting out of 6 Ingots. */
+ toolHeadMallet("Mallet Heads", "", " Mallet Head", true, true, false, false, false, false, true, true, false, false,
+ B[6], M * 6, 64, 127),
+ /** Reverse Stick made of half an Ingot. Introduced by Eloraam */
+ handleMallet("Mallet Handle", "", " Handle", true, true, false, false, false, false, true, true, false, false,
+ B[1] | B[2], M / 2, 64, 126),
+
+ // Cracked fluids
+ cellHydroCracked1("Cells", "Lightly Hydro-Cracked ", " Cell", true, true, true, true, false, false, false, true,
+ false, false, 0, M * 1, 64, 30),
+ cellHydroCracked2("Cells", "Moderately Hydro-Cracked ", " Cell", true, true, true, true, false, false, false, true,
+ false, false, 0, M * 1, 64, 30),
+ cellHydroCracked3("Cells", "Severely Hydro-Cracked ", " Cell", true, true, true, true, false, false, false, true,
+ false, false, 0, M * 1, 64, 30),
+ cellSteamCracked1("Cells", "Lightly Steam-Cracked ", " Cell", true, true, true, true, false, false, false, true,
+ false, false, 0, M * 1, 64, 30),
+ cellSteamCracked2("Cells", "Moderately Steam-Cracked ", " Cell", true, true, true, true, false, false, false, true,
+ false, false, 0, M * 1, 64, 30),
+ cellSteamCracked3("Cells", "Severely Steam-Cracked ", " Cell", true, true, true, true, false, false, false, true,
+ false, false, 0, M * 1, 64, 30),
+
+ componentCircuit("Circuit Parts", "", "", true, true, false, false, false, false, false, false, false, false, 0, -1,
+ 64, -1),
+
+ apiaryUpgrade("Industrial Apiary Upgrade", "", "", false, false, true, false, false, false, false, false, false,
+ false, 0, -1, 64, -1),
+ beeComb("Bee Combs", "", "", true, false, true, false, false, false, false, false, false, false, 0, -1, 64, -1),
+ nanite("Nanites", "", " Nanites", true, true, true, false, false, false, false, false, false, false, 0, -1, 64, 50),
+ // migrated from GT++
+ milled("Milled Ores", "Milled ", " Ore", true, true, false, false, false, false, false, false, false, true, B[3],
+ -1, 64, -1),
+ // migrated from bartworks
+ blockCasing("A Casing block for a Multiblock-Machine", "Bolted ", " Casing", true, true, true, true, false, true,
+ false, true, false, false, 0, M * 9, 64, -1),
+ blockCasingAdvanced("An Advanced Casing block for a Multiblock-Machine", "Rebolted ", " Casing", true, true, true,
+ true, false, true, false, true, false, false, 0, M * 9, 64, -1),
+ capsuleMolten("Capsule of Molten stuff", "Molten ", " Capsule", true, true, true, true, false, false, false, true,
+ false, false, 0, M * 1, 64, -1);
+
+ public static final ImmutableList<OrePrefixes> CELL_TYPES = ImmutableList.of(
+ cell,
+ cellMolten,
+ cellPlasma,
+ cellHydroCracked1,
+ cellHydroCracked2,
+ cellHydroCracked3,
+ cellSteamCracked1,
+ cellSteamCracked2,
+ cellSteamCracked3);
+
+ static {
+ pulp.mPrefixInto = dust;
+ oreGem.mPrefixInto = ore;
+ leaves.mPrefixInto = treeLeaves;
+ sapling.mPrefixInto = treeSapling;
+ itemDust.mPrefixInto = dust;
+ dustDirty.mPrefixInto = dustImpure;
+ denseore.mPrefixInto = oreDense;
+ ingotQuad.mPrefixInto = ingotQuadruple;
+ plateQuad.mPrefixInto = plateQuadruple;
+ stoneBrick.mPrefixInto = stoneBricks;
+ stoneBricksMossy.mPrefixInto = stoneMossyBricks;
+
+ ingotHot.mHeatDamage = 3.0F;
+ cellMolten.mHeatDamage = 3;
+ cellPlasma.mHeatDamage = 6.0F;
+
+ block.ignoreMaterials(
+ Materials.Ice,
+ Materials.Snow,
+ Materials.Concrete,
+ Materials.Glass,
+ Materials.Glowstone,
+ Materials.DarkIron,
+ Materials.Marble,
+ Materials.Quartz,
+ Materials.CertusQuartz,
+ Materials.Limestone);
+ ingot.ignoreMaterials(Materials.Brick, Materials.NetherBrick);
+
+ dust.addFamiliarPrefix(dustTiny);
+ dust.addFamiliarPrefix(dustSmall);
+ dustTiny.addFamiliarPrefix(dust);
+ dustTiny.addFamiliarPrefix(dustSmall);
+ dustSmall.addFamiliarPrefix(dust);
+ dustSmall.addFamiliarPrefix(dustTiny);
+
+ ingot.addFamiliarPrefix(nugget);
+ nugget.addFamiliarPrefix(ingot);
+
+ for (OrePrefixes tPrefix1 : values()) if (tPrefix1.name()
+ .startsWith("ore"))
+ for (OrePrefixes tPrefix2 : values()) if (tPrefix2.name()
+ .startsWith("ore")) tPrefix1.addFamiliarPrefix(tPrefix2);
+
+ // These are only the important ones.
+ gem.mNotGeneratedItems.add(Materials.Coal);
+ gem.mNotGeneratedItems.add(Materials.Charcoal);
+ gem.mNotGeneratedItems.add(Materials.NetherStar);
+ gem.mNotGeneratedItems.add(Materials.Diamond);
+ gem.mNotGeneratedItems.add(Materials.Emerald);
+ gem.mNotGeneratedItems.add(Materials.NetherQuartz);
+ gem.mNotGeneratedItems.add(Materials.EnderPearl);
+ gem.mNotGeneratedItems.add(Materials.EnderEye);
+ gem.mNotGeneratedItems.add(Materials.Flint);
+ gem.mNotGeneratedItems.add(Materials.Lapis);
+ dust.mNotGeneratedItems.add(Materials.Bone);
+ dust.mNotGeneratedItems.add(Materials.Redstone);
+ dust.mNotGeneratedItems.add(Materials.Glowstone);
+ dust.mNotGeneratedItems.add(Materials.Gunpowder);
+ dust.mNotGeneratedItems.add(Materials.Sugar);
+ dust.mNotGeneratedItems.add(Materials.Blaze);
+ stick.mNotGeneratedItems.add(Materials.Wood);
+ stick.mNotGeneratedItems.add(Materials.Bone);
+ stick.mNotGeneratedItems.add(Materials.Blaze);
+ ingot.mNotGeneratedItems.add(Materials.Iron);
+ ingot.mNotGeneratedItems.add(Materials.Gold);
+ ingot.mNotGeneratedItems.add(Materials.Brick);
+ ingot.mNotGeneratedItems.add(Materials.BrickNether);
+ ingot.mNotGeneratedItems.add(Materials.WoodSealed);
+ ingot.mNotGeneratedItems.add(Materials.Wood);
+
+ frame.mNotGeneratedItems.add(MaterialsUEVplus.Universium);
+ frameGt.mNotGeneratedItems.add(MaterialsUEVplus.Universium);
+
+ plateDouble.mNotGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ plateTriple.mNotGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ plateQuadruple.mNotGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ plateQuintuple.mNotGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ cell.mNotGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ ingotDouble.mNotGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ ingotTriple.mNotGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ ingotQuadruple.mNotGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ ingotQuintuple.mNotGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ turbineBlade.mNotGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ dust.mNotGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ dustSmall.mNotGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ dustTiny.mNotGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+
+ // ingot.mNotGeneratedItems.add(Materials.Ichorium);
+ nugget.mNotGeneratedItems.add(Materials.Gold);
+ plate.mNotGeneratedItems.add(Materials.Paper);
+ cell.mNotGeneratedItems.add(Materials.Empty);
+ cell.mNotGeneratedItems.add(Materials.Water);
+ cell.mNotGeneratedItems.add(Materials.Lava);
+ cell.mNotGeneratedItems.add(Materials.ConstructionFoam);
+ cell.mNotGeneratedItems.add(Materials.UUMatter);
+ cell.mNotGeneratedItems.add(Materials.CoalFuel);
+ bucket.mNotGeneratedItems.add(Materials.Empty);
+ bucket.mNotGeneratedItems.add(Materials.Lava);
+ bucket.mNotGeneratedItems.add(Materials.Milk);
+ bucket.mNotGeneratedItems.add(Materials.Water);
+ bucketClay.mNotGeneratedItems.add(Materials.Empty);
+ bucketClay.mNotGeneratedItems.add(Materials.Lava);
+ bucketClay.mNotGeneratedItems.add(Materials.Milk);
+ bucketClay.mNotGeneratedItems.add(Materials.Water);
+ bottle.mNotGeneratedItems.add(Materials.Empty);
+ bottle.mNotGeneratedItems.add(Materials.Water);
+ bottle.mNotGeneratedItems.add(Materials.Milk);
+ block.mNotGeneratedItems.add(Materials.Iron);
+ block.mNotGeneratedItems.add(Materials.Gold);
+ block.mNotGeneratedItems.add(Materials.Lapis);
+ block.mNotGeneratedItems.add(Materials.Emerald);
+ block.mNotGeneratedItems.add(Materials.Redstone);
+ block.mNotGeneratedItems.add(Materials.Diamond);
+ block.mNotGeneratedItems.add(Materials.Coal);
+ toolHeadArrow.mNotGeneratedItems.add(Materials.Glass);
+ toolHeadArrow.mNotGeneratedItems.add(MaterialsUEVplus.TranscendentMetal);
+ arrowGtPlastic.mNotGeneratedItems.add(MaterialsUEVplus.TranscendentMetal);
+ arrow.mNotGeneratedItems.add(MaterialsUEVplus.TranscendentMetal);
+ arrowGtWood.mNotGeneratedItems.add(MaterialsUEVplus.TranscendentMetal);
+ stickLong.mNotGeneratedItems.add(Materials.Obsidian);
+ dust.mNotGeneratedItems.add(Materials.CertusQuartzCharged);
+
+ // -----
+
+ dustImpure.mGeneratedItems.add(Materials.GraniteRed);
+ dustImpure.mGeneratedItems.add(Materials.GraniteBlack);
+ dustImpure.mGeneratedItems.add(Materials.Quartzite);
+ dustImpure.mGeneratedItems.add(Materials.Flint);
+ dustImpure.mGeneratedItems.add(Materials.Redrock);
+ dustImpure.mGeneratedItems.add(Materials.Basalt);
+ dustImpure.mGeneratedItems.add(Materials.Marble);
+ dustImpure.mGeneratedItems.add(Materials.Netherrack);
+ dustImpure.mGeneratedItems.add(Materials.Endstone);
+ dustImpure.mGeneratedItems.add(Materials.Stone);
+
+ plate.mGeneratedItems.add(Materials.Redstone);
+ plate.mGeneratedItems.add(Materials.Concrete);
+ plate.mGeneratedItems.add(Materials.GraniteRed);
+ plate.mGeneratedItems.add(Materials.GraniteBlack);
+ plate.mGeneratedItems.add(Materials.Basalt);
+ plate.mGeneratedItems.add(Materials.Marble);
+ plate.mGeneratedItems.add(Materials.Glowstone);
+ plate.mGeneratedItems.add(Materials.Electrotine);
+ plate.mGeneratedItems.add(Materials.Obsidian);
+
+ ingotHot.mGeneratedItems.add(MaterialsUEVplus.TranscendentMetal);
+
+ plate.mGeneratedItems.add(Materials.Paper);
+ plateDouble.mGeneratedItems.add(Materials.Paper);
+ plateTriple.mGeneratedItems.add(Materials.Paper);
+ plateQuadruple.mGeneratedItems.add(Materials.Paper);
+ plateQuintuple.mGeneratedItems.add(Materials.Paper);
+ ring.mGeneratedItems.add(Materials.Paper);
+
+ lens.mGeneratedItems.add(Materials.EnderPearl);
+ lens.mGeneratedItems.add(Materials.EnderEye);
+
+ stickLong.mGeneratedItems.add(Materials.Blaze);
+
+ nanite.mGeneratedItems.add(Materials.Carbon);
+ nanite.mGeneratedItems.add(Materials.Gold);
+ nanite.mGeneratedItems.add(Materials.Iron);
+ nanite.mGeneratedItems.add(Materials.Copper);
+ nanite.mGeneratedItems.add(Materials.Silver);
+ nanite.mGeneratedItems.add(MaterialsUEVplus.TranscendentMetal);
+ nanite.mGeneratedItems.add(Materials.Neutronium);
+ nanite.mGeneratedItems.add(MaterialsUEVplus.Universium);
+ nanite.mGeneratedItems.add(MaterialsUEVplus.WhiteDwarfMatter);
+ nanite.mGeneratedItems.add(MaterialsUEVplus.BlackDwarfMatter);
+ nanite.mGeneratedItems.add(Materials.Glowstone);
+ nanite.mGeneratedItems.add(MaterialsUEVplus.Eternity);
+ // -----
+
+ gear.mGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ ingot.mGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ toolHeadHammer.mGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ frame.mGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+ frameGt.mGeneratedItems.add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter);
+
+ dust.mGeneratedItems.addAll(dustPure.mGeneratedItems);
+ dust.mGeneratedItems.addAll(dustImpure.mGeneratedItems);
+ dust.mGeneratedItems.addAll(dustRefined.mGeneratedItems);
+ dustTiny.mGeneratedItems.addAll(dust.mGeneratedItems);
+ dustSmall.mGeneratedItems.addAll(dust.mGeneratedItems);
+ crateGtDust.mGeneratedItems.addAll(dust.mGeneratedItems);
+ crateGtIngot.mGeneratedItems.addAll(ingot.mGeneratedItems);
+ crateGtGem.mGeneratedItems.addAll(gem.mGeneratedItems);
+ crateGtPlate.mGeneratedItems.addAll(plate.mGeneratedItems);
+ // -----
+
+ toolHeadFile.mCondition = new ICondition.And<>(
+ new ICondition.Not<>(SubTag.NO_SMASHING),
+ new ICondition.Not<>(SubTag.BOUNCY));
+ toolHeadSaw.mCondition = new ICondition.And<>(
+ new ICondition.Not<>(SubTag.NO_SMASHING),
+ new ICondition.Not<>(SubTag.BOUNCY));
+ toolHeadDrill.mCondition = new ICondition.And<>(
+ new ICondition.Not<>(SubTag.NO_SMASHING),
+ new ICondition.Not<>(SubTag.BOUNCY));
+ toolHeadChainsaw.mCondition = new ICondition.And<>(
+ new ICondition.Not<>(SubTag.NO_SMASHING),
+ new ICondition.Not<>(SubTag.BOUNCY));
+ toolHeadWrench.mCondition = new ICondition.And<>(
+ new ICondition.Not<>(SubTag.NO_SMASHING),
+ new ICondition.Not<>(SubTag.BOUNCY));
+ toolHeadBuzzSaw.mCondition = new ICondition.And<>(
+ new ICondition.Not<>(SubTag.NO_SMASHING),
+ new ICondition.Not<>(SubTag.BOUNCY));
+ turbineBlade.mCondition = new ICondition.And<>(
+ new ICondition.Not<>(SubTag.NO_SMASHING),
+ new ICondition.Not<>(SubTag.BOUNCY));
+
+ rotor.mCondition = new ICondition.Nor<>(SubTag.CRYSTAL, SubTag.STONE, SubTag.BOUNCY);
+
+ spring.mCondition = new ICondition.Or<>(
+ SubTag.STRETCHY,
+ SubTag.BOUNCY,
+ new ICondition.Not<>(SubTag.NO_SMASHING));
+ springSmall.mCondition = new ICondition.Or<>(
+ SubTag.STRETCHY,
+ SubTag.BOUNCY,
+ new ICondition.Not<>(SubTag.NO_SMASHING));
+
+ gemChipped.mCondition = new ICondition.And<>(
+ SubTag.TRANSPARENT,
+ SubTag.CRYSTAL,
+ new ICondition.Not<>(SubTag.QUARTZ),
+ new ICondition.Not<>(SubTag.PEARL),
+ new ICondition.Not<>(SubTag.MAGICAL));
+ gemFlawed.mCondition = new ICondition.And<>(
+ SubTag.TRANSPARENT,
+ SubTag.CRYSTAL,
+ new ICondition.Not<>(SubTag.QUARTZ),
+ new ICondition.Not<>(SubTag.PEARL),
+ new ICondition.Not<>(SubTag.MAGICAL));
+ gemFlawless.mCondition = new ICondition.And<>(
+ SubTag.TRANSPARENT,
+ SubTag.CRYSTAL,
+ new ICondition.Not<>(SubTag.QUARTZ),
+ new ICondition.Not<>(SubTag.PEARL),
+ new ICondition.Not<>(SubTag.MAGICAL));
+ gemExquisite.mCondition = new ICondition.And<>(
+ SubTag.TRANSPARENT,
+ SubTag.CRYSTAL,
+ new ICondition.Not<>(SubTag.QUARTZ),
+ new ICondition.Not<>(SubTag.PEARL),
+ new ICondition.Not<>(SubTag.MAGICAL));
+
+ lens.mCondition = new ICondition.Or<>(
+ SubTag.MAGICAL,
+ new ICondition.And<>(SubTag.TRANSPARENT, SubTag.HAS_COLOR));
+
+ plateDouble.mCondition = new ICondition.Or<>(
+ SubTag.PAPER,
+ new ICondition.Not<>(SubTag.NO_SMASHING),
+ SubTag.STRETCHY);
+ plateTriple.mCondition = new ICondition.Or<>(
+ SubTag.PAPER,
+ new ICondition.Not<>(SubTag.NO_SMASHING),
+ SubTag.STRETCHY);
+ plateQuadruple.mCondition = new ICondition.Or<>(
+ SubTag.PAPER,
+ new ICondition.Not<>(SubTag.NO_SMASHING),
+ SubTag.STRETCHY);
+ plateQuintuple.mCondition = new ICondition.Or<>(
+ SubTag.PAPER,
+ new ICondition.Not<>(SubTag.NO_SMASHING),
+ SubTag.STRETCHY);
+
+ plateDense.mCondition = new ICondition.Or<>(new ICondition.Not<>(SubTag.NO_SMASHING), SubTag.STRETCHY);
+
+ ingotDouble.mCondition = new ICondition.Or<>(new ICondition.Not<>(SubTag.NO_SMASHING), SubTag.STRETCHY);
+ ingotTriple.mCondition = new ICondition.Or<>(new ICondition.Not<>(SubTag.NO_SMASHING), SubTag.STRETCHY);
+ ingotQuadruple.mCondition = new ICondition.Or<>(new ICondition.Not<>(SubTag.NO_SMASHING), SubTag.STRETCHY);
+ ingotQuintuple.mCondition = new ICondition.Or<>(new ICondition.Not<>(SubTag.NO_SMASHING), SubTag.STRETCHY);
+
+ wireFine.mCondition = SubTag.METAL;
+
+ // -----
+
+ pipeRestrictiveTiny.mSecondaryMaterial = new MaterialStack(Materials.Steel, ring.mMaterialAmount);
+ pipeRestrictiveSmall.mSecondaryMaterial = new MaterialStack(Materials.Steel, ring.mMaterialAmount * 2);
+ pipeRestrictiveMedium.mSecondaryMaterial = new MaterialStack(Materials.Steel, ring.mMaterialAmount * 3);
+ pipeRestrictiveLarge.mSecondaryMaterial = new MaterialStack(Materials.Steel, ring.mMaterialAmount * 4);
+ pipeRestrictiveHuge.mSecondaryMaterial = new MaterialStack(Materials.Steel, ring.mMaterialAmount * 5);
+ cableGt16.mSecondaryMaterial = new MaterialStack(Materials.Rubber, plate.mMaterialAmount * 5);
+ cableGt12.mSecondaryMaterial = new MaterialStack(Materials.Rubber, plate.mMaterialAmount * 4);
+ cableGt08.mSecondaryMaterial = new MaterialStack(Materials.Rubber, plate.mMaterialAmount * 3);
+ cableGt04.mSecondaryMaterial = new MaterialStack(Materials.Rubber, plate.mMaterialAmount * 2);
+ cableGt02.mSecondaryMaterial = new MaterialStack(Materials.Rubber, plate.mMaterialAmount);
+ cableGt01.mSecondaryMaterial = new MaterialStack(Materials.Rubber, plate.mMaterialAmount);
+ bucket.mSecondaryMaterial = new MaterialStack(Materials.Iron, ingot.mMaterialAmount * 3);
+ bucketClay.mSecondaryMaterial = new MaterialStack(Materials.Clay, dust.mMaterialAmount * 5);
+ CELL_TYPES
+ .forEach(prefix -> prefix.mSecondaryMaterial = new MaterialStack(Materials.Tin, plate.mMaterialAmount * 2));
+ oreRedgranite.mSecondaryMaterial = new MaterialStack(Materials.GraniteRed, dust.mMaterialAmount);
+ oreBlackgranite.mSecondaryMaterial = new MaterialStack(Materials.GraniteBlack, dust.mMaterialAmount);
+ oreNetherrack.mSecondaryMaterial = new MaterialStack(Materials.Netherrack, dust.mMaterialAmount);
+ oreNether.mSecondaryMaterial = new MaterialStack(Materials.Netherrack, dust.mMaterialAmount);
+ oreEndstone.mSecondaryMaterial = new MaterialStack(Materials.Endstone, dust.mMaterialAmount);
+ oreEnd.mSecondaryMaterial = new MaterialStack(Materials.Endstone, dust.mMaterialAmount);
+ oreMarble.mSecondaryMaterial = new MaterialStack(Materials.Marble, dust.mMaterialAmount);
+ oreBasalt.mSecondaryMaterial = new MaterialStack(Materials.Basalt, dust.mMaterialAmount);
+ oreDense.mSecondaryMaterial = new MaterialStack(Materials.Stone, dust.mMaterialAmount);
+ orePoor.mSecondaryMaterial = new MaterialStack(Materials.Stone, dust.mMaterialAmount * 2);
+ oreSmall.mSecondaryMaterial = new MaterialStack(Materials.Stone, dust.mMaterialAmount * 2);
+ oreNormal.mSecondaryMaterial = new MaterialStack(Materials.Stone, dust.mMaterialAmount * 2);
+ rawOre.mSecondaryMaterial = new MaterialStack(Materials.Stone, dust.mMaterialAmount);
+ oreRich.mSecondaryMaterial = new MaterialStack(Materials.Stone, dust.mMaterialAmount * 2);
+ ore.mSecondaryMaterial = new MaterialStack(Materials.Stone, dust.mMaterialAmount);
+ crushed.mSecondaryMaterial = new MaterialStack(Materials.Stone, dust.mMaterialAmount);
+ toolHeadChainsaw.mSecondaryMaterial = new MaterialStack(
+ Materials.Steel,
+ plate.mMaterialAmount * 4 + ring.mMaterialAmount * 2);
+ toolHeadWrench.mSecondaryMaterial = new MaterialStack(
+ Materials.Steel,
+ ring.mMaterialAmount + screw.mMaterialAmount * 2);
+ arrowGtWood.mSecondaryMaterial = new MaterialStack(Materials.Wood, stick.mMaterialAmount);
+ arrowGtPlastic.mSecondaryMaterial = new MaterialStack(Materials.Plastic, stick.mMaterialAmount);
+ bulletGtSmall.mSecondaryMaterial = new MaterialStack(Materials.Brass, ingot.mMaterialAmount / 9);
+ bulletGtMedium.mSecondaryMaterial = new MaterialStack(Materials.Brass, ingot.mMaterialAmount / 6);
+ bulletGtLarge.mSecondaryMaterial = new MaterialStack(Materials.Brass, ingot.mMaterialAmount / 3);
+ }
+
+ public final ArrayList<ItemStack> mPrefixedItems = new GT_ArrayList<>(false, 16);
+ public final short mTextureIndex;
+ public final String mRegularLocalName, mLocalizedMaterialPre, mLocalizedMaterialPost;
+ public final boolean mIsUsedForOreProcessing, mIsEnchantable, mIsUnificatable, mIsMaterialBased, mIsSelfReferencing,
+ mIsContainer, mDontUnificateActively, mIsUsedForBlocks, mAllowNormalRecycling, mGenerateDefaultItem;
+ public final List<TC_AspectStack> mAspects = new ArrayList<>();
+ public final Collection<OrePrefixes> mFamiliarPrefixes = new HashSet<>();
+ /**
+ * Used to determine the amount of Material this Prefix contains. Multiply or Divide GregTech_API.MATERIAL_UNIT to
+ * get the Amounts in comparision to one Ingot. 0 = Null Negative = Undefined Amount
+ */
+ public final long mMaterialAmount;
+
+ public final Collection<Materials> mDisabledItems = new HashSet<>(), mNotGeneratedItems = new HashSet<>(),
+ mIgnoredMaterials = new HashSet<>(), mGeneratedItems = new HashSet<>();
+ private final ArrayList<IOreRecipeRegistrator> mOreProcessing = new ArrayList<>();
+ public ItemStack mContainerItem = null;
+ public ICondition<ISubTagContainer> mCondition = null;
+ public byte mDefaultStackSize = 64;
+ public MaterialStack mSecondaryMaterial = null;
+ public OrePrefixes mPrefixInto = this;
+ public float mHeatDamage = 0.0F; // Negative for Frost Damage
+ private final ObjectSet<ItemStack> mContainsTestCache = new ObjectOpenCustomHashSet<>(
+ 512,
+ 0.5f,
+ GT_ItemStack.ITEMSTACK_HASH_STRATEGY2);
+ public static final List<OrePrefixes> mPreventableComponents = new LinkedList<>(
+ Arrays.asList(
+ OrePrefixes.gem,
+ OrePrefixes.ingotHot,
+ OrePrefixes.ingotDouble,
+ OrePrefixes.ingotTriple,
+ OrePrefixes.ingotQuadruple,
+ OrePrefixes.ingotQuintuple,
+ OrePrefixes.plate,
+ OrePrefixes.plateDouble,
+ OrePrefixes.plateTriple,
+ OrePrefixes.plateQuadruple,
+ OrePrefixes.plateQuintuple,
+ OrePrefixes.plateDense,
+ OrePrefixes.stick,
+ OrePrefixes.round,
+ OrePrefixes.bolt,
+ OrePrefixes.screw,
+ OrePrefixes.ring,
+ OrePrefixes.foil,
+ OrePrefixes.toolHeadSword,
+ OrePrefixes.toolHeadPickaxe,
+ OrePrefixes.toolHeadShovel,
+ OrePrefixes.toolHeadAxe,
+ OrePrefixes.toolHeadHoe,
+ OrePrefixes.toolHeadHammer,
+ OrePrefixes.toolHeadFile,
+ OrePrefixes.toolHeadSaw,
+ OrePrefixes.toolHeadDrill,
+ OrePrefixes.toolHeadChainsaw,
+ OrePrefixes.toolHeadWrench,
+ OrePrefixes.toolHeadUniversalSpade,
+ OrePrefixes.toolHeadSense,
+ OrePrefixes.toolHeadPlow,
+ OrePrefixes.toolHeadArrow,
+ OrePrefixes.toolHeadBuzzSaw,
+ OrePrefixes.turbineBlade,
+ OrePrefixes.wireFine,
+ OrePrefixes.gearGtSmall,
+ OrePrefixes.rotor,
+ OrePrefixes.stickLong,
+ OrePrefixes.springSmall,
+ OrePrefixes.spring,
+ OrePrefixes.arrowGtWood,
+ OrePrefixes.arrowGtPlastic,
+ OrePrefixes.gemChipped,
+ OrePrefixes.gemFlawed,
+ OrePrefixes.gemFlawless,
+ OrePrefixes.gemExquisite,
+ OrePrefixes.gearGt,
+ OrePrefixes.crateGtDust,
+ OrePrefixes.crateGtIngot,
+ OrePrefixes.crateGtGem,
+ OrePrefixes.crateGtPlate,
+ OrePrefixes.itemCasing,
+ OrePrefixes.nanite));
+ /**
+ * Yes this Value can be changed to add Bits for the MetaGenerated-Item-Check.
+ */
+ public int mMaterialGenerationBits = 0;
+
+ OrePrefixes(String aRegularLocalName, String aLocalizedMaterialPre, String aLocalizedMaterialPost,
+ boolean aIsUnificatable, boolean aIsMaterialBased, boolean aIsSelfReferencing, boolean aIsContainer,
+ boolean aDontUnificateActively, boolean aIsUsedForBlocks, boolean aAllowNormalRecycling,
+ boolean aGenerateDefaultItem, boolean aIsEnchantable, boolean aIsUsedForOreProcessing,
+ int aMaterialGenerationBits, long aMaterialAmount, int aDefaultStackSize, int aTextureindex) {
+ mIsUnificatable = aIsUnificatable;
+ mIsMaterialBased = aIsMaterialBased;
+ mIsSelfReferencing = aIsSelfReferencing;
+ mIsContainer = aIsContainer;
+ mDontUnificateActively = aDontUnificateActively;
+ mIsUsedForBlocks = aIsUsedForBlocks;
+ mAllowNormalRecycling = aAllowNormalRecycling;
+ mGenerateDefaultItem = aGenerateDefaultItem;
+ mIsEnchantable = aIsEnchantable;
+ mIsUsedForOreProcessing = aIsUsedForOreProcessing;
+ mMaterialGenerationBits = aMaterialGenerationBits;
+ mMaterialAmount = aMaterialAmount;
+ mRegularLocalName = aRegularLocalName;
+ mLocalizedMaterialPre = aLocalizedMaterialPre;
+ mLocalizedMaterialPost = aLocalizedMaterialPost;
+ mDefaultStackSize = (byte) aDefaultStackSize;
+ mTextureIndex = (short) aTextureindex;
+
+ if (name().startsWith("ore")) {
+ new TC_AspectStack(TC_Aspects.TERRA, 1).addToAspectList(mAspects);
+ } else if (name().startsWith("wire") || name().startsWith("cable")) {
+ new TC_AspectStack(TC_Aspects.ELECTRUM, 1).addToAspectList(mAspects);
+ } else if (name().startsWith("dust")) {
+ new TC_AspectStack(TC_Aspects.PERDITIO, 1).addToAspectList(mAspects);
+ } else if (name().startsWith("crushed")) {
+ new TC_AspectStack(TC_Aspects.PERFODIO, 1).addToAspectList(mAspects);
+ } else if (name().startsWith("ingot") || name().startsWith("nugget")) {
+ new TC_AspectStack(TC_Aspects.METALLUM, 1).addToAspectList(mAspects);
+ } else if (name().startsWith("armor")) {
+ new TC_AspectStack(TC_Aspects.TUTAMEN, 1).addToAspectList(mAspects);
+ } else if (name().startsWith("stone")) {
+ new TC_AspectStack(TC_Aspects.TERRA, 1).addToAspectList(mAspects);
+ } else if (name().startsWith("pipe")) {
+ new TC_AspectStack(TC_Aspects.ITER, 1).addToAspectList(mAspects);
+ } else if (name().startsWith("gear")) {
+ new TC_AspectStack(TC_Aspects.MOTUS, 1).addToAspectList(mAspects);
+ new TC_AspectStack(TC_Aspects.MACHINA, 1).addToAspectList(mAspects);
+ } else if (name().startsWith("frame") || name().startsWith("plate")) {
+ new TC_AspectStack(TC_Aspects.FABRICO, 1).addToAspectList(mAspects);
+ } else if (name().startsWith("tool")) {
+ new TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2).addToAspectList(mAspects);
+ } else if (name().startsWith("gem") || name().startsWith("crystal") || name().startsWith("lens")) {
+ new TC_AspectStack(TC_Aspects.VITREUS, 1).addToAspectList(mAspects);
+ } else if (name().startsWith("crate")) {
+ new TC_AspectStack(TC_Aspects.ITER, 2).addToAspectList(mAspects);
+ } else if (name().startsWith("circuit")) {
+ new TC_AspectStack(TC_Aspects.COGNITIO, 1).addToAspectList(mAspects);
+ } else if (name().startsWith("computer")) {
+ new TC_AspectStack(TC_Aspects.COGNITIO, 4).addToAspectList(mAspects);
+ } else if (name().startsWith("battery")) {
+ new TC_AspectStack(TC_Aspects.ELECTRUM, 1).addToAspectList(mAspects);
+ }
+ }
+
+ public static boolean isInstanceOf(String aName, OrePrefixes aPrefix) {
+ return aName != null && aName.startsWith(aPrefix.toString());
+ }
+
+ public void disableComponent(Materials aMaterial) {
+ if (!this.mDisabledItems.contains(aMaterial)) this.mDisabledItems.add(aMaterial);
+ }
+
+ public static OrePrefixes getOrePrefix(String aOre) {
+ for (OrePrefixes tPrefix : values()) if (aOre.startsWith(tPrefix.toString())) {
+ if (tPrefix == oreNether && aOre.equals("oreNetherQuartz")) return ore;
+ if (tPrefix == oreNether && aOre.equals("oreNetherStar")) return ore;
+ if (tPrefix == oreBasalt && aOre.equals("oreBasalticMineralSand")) return ore;
+ if (tPrefix == stickLong && aOre.equals("stickLongasssuperconductornameforuvwire")) return stick;
+ if (tPrefix == stickLong && aOre.equals("stickLongasssuperconductornameforuhvwire")) return stick;
+ return tPrefix;
+ }
+ return null;
+ }
+
+ public static String stripPrefix(String aOre) {
+ for (OrePrefixes tPrefix : values()) {
+ if (aOre.startsWith(tPrefix.toString())) {
+ return aOre.replaceFirst(tPrefix.toString(), "");
+ }
+ }
+ return aOre;
+ }
+
+ public static String replacePrefix(String aOre, OrePrefixes aPrefix) {
+ for (OrePrefixes tPrefix : values()) {
+ if (aOre.startsWith(tPrefix.toString())) {
+ return aOre.replaceFirst(tPrefix.toString(), aPrefix.toString());
+ }
+ }
+ return "";
+ }
+
+ public static OrePrefixes getPrefix(String aPrefixName) {
+ return getPrefix(aPrefixName, null);
+ }
+
+ public static OrePrefixes getPrefix(String aPrefixName, OrePrefixes aReplacement) {
+ Object tObject = GT_Utility.getFieldContent(OrePrefixes.class, aPrefixName, false, false);
+ if (tObject instanceof OrePrefixes) return (OrePrefixes) tObject;
+ return aReplacement;
+ }
+
+ public static Materials getMaterial(String aOre) {
+ return Materials.get(stripPrefix(aOre));
+ }
+
+ public static Materials getMaterial(String aOre, OrePrefixes aPrefix) {
+ return Materials.get(aOre.replaceFirst(aPrefix.toString(), ""));
+ }
+
+ public static Materials getRealMaterial(String aOre, OrePrefixes aPrefix) {
+ return Materials.getRealMaterial(aOre.replaceFirst(aPrefix.toString(), ""));
+ }
+
+ public void enableComponent(Materials aMaterial) {
+ this.mDisabledItems.remove(aMaterial);
+ }
+
+ public boolean add(ItemStack aStack) {
+ if (aStack == null) return false;
+ if (!contains(aStack)) {
+ mPrefixedItems.add(aStack);
+ // It's now in there... so update the cache
+ mContainsTestCache.add(aStack);
+ }
+ return true;
+ }
+
+ public boolean contains(ItemStack aStack) {
+ return !GT_Utility.isStackInvalid(aStack) && mContainsTestCache.contains(aStack);
+ }
+
+ public boolean containsUnCached(ItemStack aStack) {
+ // In case someone needs this
+ for (ItemStack tStack : mPrefixedItems) {
+ if (GT_Utility.areStacksEqual(aStack, tStack, !tStack.hasTagCompound())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean doGenerateItem(Materials aMaterial) {
+ return aMaterial != null && aMaterial != Materials._NULL
+ && ((aMaterial.mTypes & mMaterialGenerationBits) != 0 || mGeneratedItems.contains(aMaterial))
+ && !mNotGeneratedItems.contains(aMaterial)
+ && !mDisabledItems.contains(aMaterial)
+ && (mCondition == null || mCondition.isTrue(aMaterial));
+ }
+
+ public boolean ignoreMaterials(Materials... aMaterials) {
+ for (Materials tMaterial : aMaterials) if (tMaterial != null) mIgnoredMaterials.add(tMaterial);
+ return true;
+ }
+
+ public boolean isIgnored(Materials aMaterial) {
+ if (aMaterial != null && (!aMaterial.mUnificatable || aMaterial != aMaterial.mMaterialInto)) return true;
+ return mIgnoredMaterials.contains(aMaterial);
+ }
+
+ public boolean addFamiliarPrefix(OrePrefixes aPrefix) {
+ if (aPrefix == null || mFamiliarPrefixes.contains(aPrefix) || aPrefix == this) return false;
+ return mFamiliarPrefixes.add(aPrefix);
+ }
+
+ public boolean add(IOreRecipeRegistrator aRegistrator) {
+ if (aRegistrator == null) return false;
+ return mOreProcessing.add(aRegistrator);
+ }
+
+ public void processOre(Materials aMaterial, String aOreDictName, String aModName, ItemStack aStack) {
+
+ if (aMaterial == null) {
+ return;
+ }
+
+ if (aMaterial.contains(SubTag.NO_RECIPES)) {
+ return;
+ }
+
+ if ((aMaterial != Materials._NULL || mIsSelfReferencing || !mIsMaterialBased)
+ && GT_Utility.isStackValid(aStack)) {
+ // if (Materials.mPreventableComponents.contains(this) && !this.mDynamicItems.contains(aMaterial)) return;
+ for (IOreRecipeRegistrator tRegistrator : mOreProcessing) {
+ if (D2) GT_Log.ore.println(
+ "Processing '" + aOreDictName
+ + "' with the Prefix '"
+ + name()
+ + "' and the Material '"
+ + aMaterial.mName
+ + "' at "
+ + GT_Utility.getClassName(tRegistrator));
+ tRegistrator.registerOre(this, aMaterial, aOreDictName, aModName, GT_Utility.copyAmount(1, aStack));
+ }
+ }
+ }
+
+ public Object get(Object aMaterial) {
+ if (aMaterial instanceof Materials) return new ItemData(this, (Materials) aMaterial);
+ return name() + aMaterial;
+ }
+
+ public String getDefaultLocalNameForItem(Materials aMaterial) {
+ return aMaterial.getDefaultLocalizedNameForItem(getDefaultLocalNameFormatForItem(aMaterial));
+ }
+
+ @SuppressWarnings("incomplete-switch")
+ public String getDefaultLocalNameFormatForItem(Materials aMaterial) {
+ // Certain Materials have slightly different Localizations.
+ switch (this) {
+ case crateGtDust -> {
+ return mLocalizedMaterialPre + OrePrefixes.dust.getDefaultLocalNameFormatForItem(aMaterial);
+ }
+ case crateGtIngot -> {
+ return mLocalizedMaterialPre + OrePrefixes.ingot.getDefaultLocalNameFormatForItem(aMaterial);
+ }
+ case crateGtGem -> {
+ return mLocalizedMaterialPre + OrePrefixes.gem.getDefaultLocalNameFormatForItem(aMaterial);
+ }
+ case crateGtPlate -> {
+ return mLocalizedMaterialPre + OrePrefixes.plate.getDefaultLocalNameFormatForItem(aMaterial);
+ }
+ }
+ switch (aMaterial.mName) {
+ case "Glass", "BorosilicateGlass" -> {
+ if (name().startsWith("gem")) return mLocalizedMaterialPre + "%material" + " Crystal";
+ if (name().startsWith("plate")) return mLocalizedMaterialPre + "%material" + " Pane";
+ if (name().startsWith("ingot")) return mLocalizedMaterialPre + "%material" + " Bar";
+ if (name().startsWith("nugget")) return mLocalizedMaterialPre + "%material" + " Chip";
+ }
+ case "Wheat" -> {
+ if (name().startsWith("dust")) return mLocalizedMaterialPre + "Flour";
+ }
+ case "Ice" -> {
+ if (name().startsWith("dust")) return mLocalizedMaterialPre + "Crushed Ice";
+ }
+ case "Wood", "WoodSealed" -> {
+ if (name().startsWith("bolt")) return "Short " + "%material" + " Stick";
+ if (name().startsWith("stick")) return mLocalizedMaterialPre + "%material" + " Stick";
+ if (name().startsWith("dust")) return mLocalizedMaterialPre + "%material" + " Pulp";
+ if (name().startsWith("nugget")) return mLocalizedMaterialPre + "%material" + " Chip";
+ if (name().startsWith("plate")) return mLocalizedMaterialPre + "%material" + " Plank";
+ }
+ case "Plastic", "Rubber", "Polyethylene", "Epoxid", "EpoxidFiberReinforced", "Polydimethylsiloxane", "Silicone", "Polysiloxane", "Polycaprolactam", "Polytetrafluoroethylene", "PolyvinylChloride", "Polystyrene", "StyreneButadieneRubber" -> {
+ if (name().startsWith("dust")) return mLocalizedMaterialPre + "%material" + " Pulp";
+ if (name().startsWith("plate")) return mLocalizedMaterialPre + "%material" + " Sheet";
+ if (name().startsWith("ingot")) return mLocalizedMaterialPre + "%material" + " Bar";
+ if (name().startsWith("nugget")) return mLocalizedMaterialPre + "%material" + " Chip";
+ if (name().startsWith("foil")) return "Thin " + "%material" + " Sheet";
+ }
+ case "FierySteel" -> {
+ if (mIsContainer) return mLocalizedMaterialPre + "Fiery Blood" + mLocalizedMaterialPost;
+ }
+ case "Steeleaf" -> {
+ if (name().startsWith("ingot")) return mLocalizedMaterialPre + "%material";
+ }
+ case "Bone" -> {
+ if (name().startsWith("dust")) return mLocalizedMaterialPre + "Bone Meal";
+ }
+ case "Blaze", "Milk", "Cocoa", "Chocolate", "Coffee", "Chili", "Cheese", "Snow" -> {
+ if (name().startsWith("dust")) return mLocalizedMaterialPre + "%material" + " Powder";
+ }
+ case "Paper" -> {
+ if (name().startsWith("dust")) return mLocalizedMaterialPre + "Chad";
+ switch (this) {
+ case plate -> {
+ return "Sheet of Paper";
+ }
+ case plateDouble -> {
+ return "Paperboard";
+ }
+ case plateTriple -> {
+ return "Carton";
+ }
+ case plateQuadruple -> {
+ return "Cardboard";
+ }
+ case plateQuintuple -> {
+ return "Thick Cardboard";
+ }
+ case plateDense -> {
+ return "Strong Cardboard";
+ }
+ }
+ }
+ case "MeatRaw" -> {
+ if (name().startsWith("dust")) return mLocalizedMaterialPre + "Mince Meat";
+ }
+ case "MeatCooked" -> {
+ if (name().startsWith("dust")) return mLocalizedMaterialPre + "Cooked Mince Meat";
+ }
+ case "Ash", "DarkAsh", "Gunpowder", "Sugar", "Salt", "RockSalt", "VolcanicAsh", "RareEarth" -> {
+ if (name().startsWith("dust")) return mLocalizedMaterialPre + "%material";
+ }
+ case "Vermiculite", "Bentonite", "Kaolinite", "Talc", "BasalticMineralSand", "GraniticMineralSand", "GlauconiteSand", "CassiteriteSand", "GarnetSand", "QuartzSand", "Pitchblende", "FullersEarth" -> {
+ if (name().startsWith("dust")) return mLocalizedMaterialPre + "%material";
+ switch (this) {
+ case crushedCentrifuged, crushedPurified -> {
+ return mLocalizedMaterialPre + "%material";
+ }
+ case crushed -> {
+ return "Ground " + "%material";
+ }
+ }
+ }
+ }
+ if (ProcessingModSupport.aEnableThaumcraftMats) {
+ switch (aMaterial.mName) {
+ case "InfusedAir", "InfusedDull", "InfusedEarth", "InfusedEntropy", "InfusedFire", "InfusedOrder", "InfusedVis", "InfusedWater" -> {
+ if (name().startsWith("gem")) return mLocalizedMaterialPre + "Shard of " + "%material";
+ if (name().startsWith("crystal")) return mLocalizedMaterialPre + "Shard of " + "%material";
+ if (name().startsWith("plate")) return mLocalizedMaterialPre + "%material" + " Crystal Plate";
+ if (name().startsWith("dust")) return mLocalizedMaterialPre + "%material" + " Crystal Powder";
+ switch (this) {
+ case crushedCentrifuged, crushedPurified, crushed -> {
+ return mLocalizedMaterialPre + "%material" + " Crystals";
+ }
+ }
+ }
+ }
+ }
+ // Use Standard Localization
+ return mLocalizedMaterialPre + "%material" + mLocalizedMaterialPost;
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/ParticleFX.java b/src/main/java/gregtech/api/enums/ParticleFX.java
new file mode 100644
index 0000000000..c692598b89
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/ParticleFX.java
@@ -0,0 +1,53 @@
+package gregtech.api.enums;
+
+/**
+ * Enumerates known EntityFX particles
+ */
+public enum ParticleFX {
+
+ HUGE_EXPLOSION("hugeexplosion"),
+ LARGE_EXPLODE("largeexplode"),
+ FIREWORKS_SPARK("fireworksSpark"),
+ BUBBLE("bubble"),
+ SUSPENDED("suspended"),
+ DEPTH_SUSPEND("depthsuspend"),
+ TOWN_AURA("townaura"),
+ CRIT("crit"),
+ MAGIC_CRIT("magicCrit"),
+ SMOKE("smoke"),
+ MOB_SPELL("mobSpell"),
+ MOB_SPELL_AMBIENT("mobSpellAmbient"),
+ SPELL("spell"),
+ INSTANT_SPELL("instantSpell"),
+ WITCH_MAGIC("witchMagic"),
+ NOTE("note"),
+ PORTAL("portal"),
+ ENCHANTMENT_TABLE("enchantmenttable"),
+ EXPLODE("explode"),
+ FLAME("flame"),
+ LAVA("lava"),
+ FOOTSTEP("footstep"),
+ SPLASH("splash"),
+ WAKE("wake"),
+ LARGE_SMOKE("largesmoke"),
+ CLOUD("cloud"),
+ RED_DUST("reddust"),
+ SNOWBALL_POOF("snowballpoof"),
+ DRIP_WATER("dripWater"),
+ DRIP_LAVA("dripLava"),
+ SNOW_SHOVEL("snowshovel"),
+ SLIME("slime"),
+ HEART("heart"),
+ ANGRY_VILLAGER("angryVillager"),
+ HAPPY_VILLAGER("happyVillager");
+
+ private final String identifier;
+
+ ParticleFX(String name) {
+ this.identifier = name;
+ }
+
+ public String toString() {
+ return this.identifier;
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/SoundResource.java b/src/main/java/gregtech/api/enums/SoundResource.java
new file mode 100644
index 0000000000..23887aebbf
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/SoundResource.java
@@ -0,0 +1,373 @@
+package gregtech.api.enums;
+
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+
+import java.util.EnumSet;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.util.ResourceLocation;
+
+import com.google.common.collect.Maps;
+
+/**
+ * Enumerates known sounds with id and resource-location
+ *
+ * <p>
+ * Note that the id serve no specific purpose, if for legacy compatibility of a plausible yet unimplemented network
+ * packet weight optimization.
+ * </p>
+ */
+public enum SoundResource {
+
+ RANDOM_BREAK(0, "random.break"),
+ RANDOM_ANVIL_USE(1, "random.anvil_use"),
+ RANDOM_ANVIL_BREAK(2, "random.anvil_break"),
+ RANDOM_CLICK(3, "random.click"),
+ RANDOM_FIZZ(4, "random.fizz"),
+ RANDOM_EXPLODE(5, "random.explode"),
+ FIRE_IGNITE(6, "fire.ignite"),
+
+ IC2_TOOLS_WRENCH(100, IndustrialCraft2.ID, "tools.Wrench"),
+ IC2_TOOLS_RUBBER_TRAMPOLINE(101, IndustrialCraft2.ID, "tools.RubberTrampoline"),
+ IC2_TOOLS_PAINTER(102, IndustrialCraft2.ID, "tools.Painter"),
+ IC2_TOOLS_BATTERY_USE(103, IndustrialCraft2.ID, "tools.BatteryUse"),
+ IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE(104, IndustrialCraft2.ID, "tools.chainsaw.ChainsawUseOne"),
+ IC2_TOOLS_CHAINSAW_CHAINSAW_USE_TWO(105, IndustrialCraft2.ID, "tools.chainsaw.ChainsawUseTwo"),
+ IC2_TOOLS_DRILL_DRILL_SOFT(106, IndustrialCraft2.ID, "tools.drill.DrillSoft"),
+ IC2_TOOLS_DRILL_DRILL_HARD(107, IndustrialCraft2.ID, "tools.drill.DrillHard"),
+ IC2_TOOLS_OD_SCANNER(108, IndustrialCraft2.ID, "tools.ODScanner"),
+ IC2_TOOLS_INSULATION_CUTTERS(109, IndustrialCraft2.ID, "tools.InsulationCutters"),
+
+ IC2_MACHINES_EXTRACTOR_OP(200, IndustrialCraft2.ID, "machines.ExtractorOp"),
+ IC2_MACHINES_MACERATOR_OP(201, IndustrialCraft2.ID, "machines.MaceratorOp"),
+ IC2_MACHINES_INDUCTION_LOOP(202, IndustrialCraft2.ID, "machines.InductionLoop"),
+ IC2_MACHINES_COMPRESSOR_OP(203, IndustrialCraft2.ID, "machines.CompressorOp"),
+ IC2_MACHINES_RECYCLER_OP(204, IndustrialCraft2.ID, "machines.RecyclerOp"),
+ IC2_MACHINES_MINER_OP(205, IndustrialCraft2.ID, "machines.MinerOp"),
+ IC2_MACHINES_PUMP_OP(206, IndustrialCraft2.ID, "machines.PumpOp"),
+ IC2_MACHINES_ELECTROFURNACE_LOOP(207, IndustrialCraft2.ID, "machines.ElectroFurnaceLoop"),
+ @Deprecated
+ DEPRECATED_DUPE_OF_IC2_MACHINES_INDUCTION_LOOP(208, IndustrialCraft2.ID, "machines.InductionLoop"),
+ IC2_MACHINES_MACHINE_OVERLOAD(209, IndustrialCraft2.ID, "machines.MachineOverload"),
+ IC2_MACHINES_INTERRUPT_ONE(210, IndustrialCraft2.ID, "machines.InterruptOne"),
+ IC2_MACHINES_KA_CHING(211, IndustrialCraft2.ID, "machines.KaChing"),
+ IC2_MACHINES_MAGNETIZER_LOOP(212, IndustrialCraft2.ID, "machines.MagnetizerLoop"),
+
+ GT_MACHINES_FUSION_LOOP(230, GregTech.ID, "machines.FusionLoop"),
+ GT_MACHINES_DISTILLERY_LOOP(231, GregTech.ID, "machines.DistilleryLoop"),
+ GT_MACHINES_PLASMAFORGE_LOOP(232, GregTech.ID, "machines.PlasmaForgeLoop"),
+
+ GUI_BUTTON_DOWN(-1, GregTech.ID, "gui.buttonDown"),
+ GUI_BUTTON_UP(-1, GregTech.ID, "gui.buttonUp"),
+
+ /*
+ * Other Minecraft Sounds that were missing
+ */
+ AMBIENT_CAVE_CAVE(-1, "ambient.cave.cave"),
+ AMBIENT_WEATHER_RAIN(-1, "ambient.weather.rain"),
+ AMBIENT_WEATHER_THUNDER(-1, "ambient.weather.thunder"),
+ DAMAGE_FALLBIG(-1, "damage.fallbig"),
+ DAMAGE_FALLSMALL(-1, "damage.fallsmall"),
+ DAMAGE_HIT(-1, "damage.hit"),
+ DAMAGE_HURTFLESH(-1, "damage.hurtflesh"),
+ DIG_CLOTH(-1, "dig.cloth"),
+ DIG_GRASS(-1, "dig.grass"),
+ DIG_GRAVEL(-1, "dig.gravel"),
+ DIG_SAND(-1, "dig.sand"),
+ DIG_SNOW(-1, "dig.snow"),
+ DIG_STONE(-1, "dig.stone"),
+ DIG_WOOD(-1, "dig.wood"),
+ FIRE_FIRE(-1, "fire.fire"),
+ FIREWORKS_BLAST(-1, "fireworks.blast"),
+ FIREWORKS_BLAST_FAR(-1, "fireworks.blast_far"),
+ FIREWORKS_LARGEBLAST(-1, "fireworks.largeBlast"),
+ FIREWORKS_LARGEBLAST_FAR(-1, "fireworks.largeBlast_far"),
+ FIREWORKS_LAUNCH(-1, "fireworks.launch"),
+ FIREWORKS_TWINKLE(-1, "fireworks.twinkle"),
+ FIREWORKS_TWINKLE_FAR(-1, "fireworks.twinkle_far"),
+ GAME_NEUTRAL_SWIM(-1, "game.neutral.swim"),
+ GAME_TNT_PRIMED(-1, "game.tnt.primed"),
+ LIQUID_LAVA(-1, "liquid.lava"),
+ LIQUID_LAVAPOP(-1, "liquid.lavapop"),
+ LIQUID_SPLASH(-1, "liquid.splash"),
+ LIQUID_SWIM(-1, "liquid.swim"),
+ LIQUID_WATER(-1, "liquid.water"),
+ MINECART_BASE(-1, "minecart.base"),
+ MINECART_INSIDE(-1, "minecart.inside"),
+ MOB_BAT_DEATH(-1, "mob.bat.death"),
+ MOB_BAT_HURT(-1, "mob.bat.hurt"),
+ MOB_BAT_IDLE(-1, "mob.bat.idle"),
+ MOB_BAT_LOOP(-1, "mob.bat.loop"),
+ MOB_BAT_TAKEOFF(-1, "mob.bat.takeoff"),
+ MOB_BLAZE_BREATHE(-1, "mob.blaze.breathe"),
+ MOB_BLAZE_DEATH(-1, "mob.blaze.death"),
+ MOB_BLAZE_HIT(-1, "mob.blaze.hit"),
+ MOB_CAT_HISS(-1, "mob.cat.hiss"),
+ MOB_CAT_HITT(-1, "mob.cat.hitt"),
+ MOB_CAT_MEOW(-1, "mob.cat.meow"),
+ MOB_CAT_PURR(-1, "mob.cat.purr"),
+ MOB_CAT_PURREOW(-1, "mob.cat.purreow"),
+ MOB_CHICKEN(-1, "mob.chicken"),
+ MOB_CHICKEN_HURT(-1, "mob.chicken.hurt"),
+ MOB_CHICKEN_PLOP(-1, "mob.chicken.plop"),
+ MOB_CHICKEN_SAY(-1, "mob.chicken.say"),
+ MOB_CHICKEN_STEP(-1, "mob.chicken.step"),
+ MOB_COW(-1, "mob.cow"),
+ MOB_COW_HURT(-1, "mob.cow.hurt"),
+ MOB_COW_SAY(-1, "mob.cow.say"),
+ MOB_COW_STEP(-1, "mob.cow.step"),
+ MOB_CREEPER(-1, "mob.creeper"),
+ MOB_CREEPER_DEATH(-1, "mob.creeper.death"),
+ MOB_CREEPER_SAY(-1, "mob.creeper.say"),
+ MOB_ENDERDRAGON_END(-1, "mob.enderdragon.end"),
+ MOB_ENDERDRAGON_GROWL(-1, "mob.enderdragon.growl"),
+ MOB_ENDERDRAGON_HIT(-1, "mob.enderdragon.hit"),
+ MOB_ENDERDRAGON_WINGS(-1, "mob.enderdragon.wings"),
+ MOB_ENDERMEN_DEATH(-1, "mob.endermen.death"),
+ MOB_ENDERMEN_HIT(-1, "mob.endermen.hit"),
+ MOB_ENDERMEN_IDLE(-1, "mob.endermen.idle"),
+ MOB_ENDERMEN_PORTAL(-1, "mob.endermen.portal"),
+ MOB_ENDERMEN_SCREAM(-1, "mob.endermen.scream"),
+ MOB_ENDERMEN_STARE(-1, "mob.endermen.stare"),
+ MOB_GHAST_AFFECTIONATE_SCREAM(-1, "mob.ghast.affectionate_scream"),
+ MOB_GHAST_CHARGE(-1, "mob.ghast.charge"),
+ MOB_GHAST_DEATH(-1, "mob.ghast.death"),
+ MOB_GHAST_FIREBALL(-1, "mob.ghast.fireball"),
+ MOB_GHAST_MOAN(-1, "mob.ghast.moan"),
+ MOB_GHAST_SCREAM(-1, "mob.ghast.scream"),
+ MOB_HORSE_ANGRY(-1, "mob.horse.angry"),
+ MOB_HORSE_ARMOR(-1, "mob.horse.armor"),
+ MOB_HORSE_BREATHE(-1, "mob.horse.breathe"),
+ MOB_HORSE_DEATH(-1, "mob.horse.death"),
+ MOB_HORSE_DONKEY_ANGRY(-1, "mob.horse.donkey.angry"),
+ MOB_HORSE_DONKEY_DEATH(-1, "mob.horse.donkey.death"),
+ MOB_HORSE_DONKEY_HIT(-1, "mob.horse.donkey.hit"),
+ MOB_HORSE_DONKEY_IDLE(-1, "mob.horse.donkey.idle"),
+ MOB_HORSE_GALLOP(-1, "mob.horse.gallop"),
+ MOB_HORSE_HIT(-1, "mob.horse.hit"),
+ MOB_HORSE_IDLE(-1, "mob.horse.idle"),
+ MOB_HORSE_JUMP(-1, "mob.horse.jump"),
+ MOB_HORSE_LAND(-1, "mob.horse.land"),
+ MOB_HORSE_LEATHER(-1, "mob.horse.leather"),
+ MOB_HORSE_SKELETON_DEATH(-1, "mob.horse.skeleton.death"),
+ MOB_HORSE_SKELETON_HIT(-1, "mob.horse.skeleton.hit"),
+ MOB_HORSE_SKELETON_IDLE(-1, "mob.horse.skeleton.idle"),
+ MOB_HORSE_SOFT(-1, "mob.horse.soft"),
+ MOB_HORSE_WOOD(-1, "mob.horse.wood"),
+ MOB_HORSE_ZOMBIE_DEATH(-1, "mob.horse.zombie.death"),
+ MOB_HORSE_ZOMBIE_HIT(-1, "mob.horse.zombie.hit"),
+ MOB_HORSE_ZOMBIE_IDLE(-1, "mob.horse.zombie.idle"),
+ MOB_IRONGOLEM_DEATH(-1, "mob.irongolem.death"),
+ MOB_IRONGOLEM_HIT(-1, "mob.irongolem.hit"),
+ MOB_IRONGOLEM_THROW(-1, "mob.irongolem.throw"),
+ MOB_IRONGOLEM_WALK(-1, "mob.irongolem.walk"),
+ MOB_MAGMACUBE_BIG(-1, "mob.magmacube.big"),
+ MOB_MAGMACUBE_JUMP(-1, "mob.magmacube.jump"),
+ MOB_MAGMACUBE_SMALL(-1, "mob.magmacube.small"),
+ MOB_PIG(-1, "mob.pig"),
+ MOB_PIG_DEATH(-1, "mob.pig.death"),
+ MOB_PIG_SAY(-1, "mob.pig.say"),
+ MOB_PIG_STEP(-1, "mob.pig.step"),
+ MOB_SHEEP(-1, "mob.sheep"),
+ MOB_SHEEP_SAY(-1, "mob.sheep.say"),
+ MOB_SHEEP_SHEAR(-1, "mob.sheep.shear"),
+ MOB_SHEEP_STEP(-1, "mob.sheep.step"),
+ MOB_SILVERFISH_HIT(-1, "mob.silverfish.hit"),
+ MOB_SILVERFISH_KILL(-1, "mob.silverfish.kill"),
+ MOB_SILVERFISH_SAY(-1, "mob.silverfish.say"),
+ MOB_SILVERFISH_STEP(-1, "mob.silverfish.step"),
+ MOB_SKELETON(-1, "mob.skeleton"),
+ MOB_SKELETON_DEATH(-1, "mob.skeleton.death"),
+ MOB_SKELETON_HURT(-1, "mob.skeleton.hurt"),
+ MOB_SKELETON_SAY(-1, "mob.skeleton.say"),
+ MOB_SKELETON_STEP(-1, "mob.skeleton.step"),
+ MOB_SLIME(-1, "mob.slime"),
+ MOB_SLIME_ATTACK(-1, "mob.slime.attack"),
+ MOB_SLIME_BIG(-1, "mob.slime.big"),
+ MOB_SLIME_SMALL(-1, "mob.slime.small"),
+ MOB_SPIDER(-1, "mob.spider"),
+ MOB_SPIDER_DEATH(-1, "mob.spider.death"),
+ MOB_SPIDER_SAY(-1, "mob.spider.say"),
+ MOB_SPIDER_STEP(-1, "mob.spider.step"),
+ MOB_VILLAGER_DEATH(-1, "mob.villager.death"),
+ MOB_VILLAGER_HAGGLE(-1, "mob.villager.haggle"),
+ MOB_VILLAGER_HIT(-1, "mob.villager.hit"),
+ MOB_VILLAGER_IDLE(-1, "mob.villager.idle"),
+ MOB_VILLAGER_NO(-1, "mob.villager.no"),
+ MOB_VILLAGER_YES(-1, "mob.villager.yes"),
+ MOB_WITHER_DEATH(-1, "mob.wither.death"),
+ MOB_WITHER_HURT(-1, "mob.wither.hurt"),
+ MOB_WITHER_IDLE(-1, "mob.wither.idle"),
+ MOB_WITHER_SHOOT(-1, "mob.wither.shoot"),
+ MOB_WITHER_SPAWN(-1, "mob.wither.spawn"),
+ MOB_WOLF_BARK(-1, "mob.wolf.bark"),
+ MOB_WOLF_DEATH(-1, "mob.wolf.death"),
+ MOB_WOLF_GROWL(-1, "mob.wolf.growl"),
+ MOB_WOLF_HOWL(-1, "mob.wolf.howl"),
+ MOB_WOLF_HURT(-1, "mob.wolf.hurt"),
+ MOB_WOLF_PANTING(-1, "mob.wolf.panting"),
+ MOB_WOLF_SHAKE(-1, "mob.wolf.shake"),
+ MOB_WOLF_STEP(-1, "mob.wolf.step"),
+ MOB_WOLF_WHINE(-1, "mob.wolf.whine"),
+ MOB_ZOMBIE(-1, "mob.zombie"),
+ MOB_ZOMBIE_DEATH(-1, "mob.zombie.death"),
+ MOB_ZOMBIE_HURT(-1, "mob.zombie.hurt"),
+ MOB_ZOMBIE_INFECT(-1, "mob.zombie.infect"),
+ MOB_ZOMBIE_METAL(-1, "mob.zombie.metal"),
+ MOB_ZOMBIE_REMEDY(-1, "mob.zombie.remedy"),
+ MOB_ZOMBIE_SAY(-1, "mob.zombie.say"),
+ MOB_ZOMBIE_STEP(-1, "mob.zombie.step"),
+ MOB_ZOMBIE_UNFECT(-1, "mob.zombie.unfect"),
+ MOB_ZOMBIE_WOOD(-1, "mob.zombie.wood"),
+ MOB_ZOMBIE_WOODBREAK(-1, "mob.zombie.woodbreak"),
+ MOB_ZOMBIEPIG_ZPIG(-1, "mob.zombiepig.zpig"),
+ MOB_ZOMBIEPIG_ZPIGANGRY(-1, "mob.zombiepig.zpigangry"),
+ MOB_ZOMBIEPIG_ZPIGDEATH(-1, "mob.zombiepig.zpigdeath"),
+ MOB_ZOMBIEPIG_ZPIGHURT(-1, "mob.zombiepig.zpighurt"),
+ MUSIC_GAME_CALM(-1, "music.game.calm"),
+ MUSIC_GAME_CREATIVE_CREATIVE(-1, "music.game.creative.creative"),
+ MUSIC_GAME_END_BOSS(-1, "music.game.end.boss"),
+ MUSIC_GAME_END_CREDITS(-1, "music.game.end.credits"),
+ MUSIC_GAME_END_END(-1, "music.game.end.end"),
+ MUSIC_GAME_HAL(-1, "music.game.hal"),
+ MUSIC_GAME_NETHER_NETHER(-1, "music.game.nether.nether"),
+ MUSIC_GAME_NUANCE(-1, "music.game.nuance"),
+ MUSIC_GAME_PIANO(-1, "music.game.piano"),
+ MUSIC_MENU_MENU(-1, "music.menu.menu"),
+ NOTE_BASS(-1, "note.bass"),
+ NOTE_BASSATTACK(-1, "note.bassattack"),
+ NOTE_BD(-1, "note.bd"),
+ NOTE_HARP(-1, "note.harp"),
+ NOTE_HAT(-1, "note.hat"),
+ NOTE_PLING(-1, "note.pling"),
+ NOTE_SNARE(-1, "note.snare"),
+ PORTAL_PORTAL(-1, "portal.portal"),
+ PORTAL_TRAVEL(-1, "portal.travel"),
+ PORTAL_TRIGGER(-1, "portal.trigger"),
+ RANDOM_ANVIL_LAND(-1, "random.anvil_land"),
+ RANDOM_BOW(-1, "random.bow"),
+ RANDOM_BOWHIT(-1, "random.bowhit"),
+ RANDOM_BREATH(-1, "random.breath"),
+ RANDOM_BURP(-1, "random.burp"),
+ RANDOM_CHESTCLOSED(-1, "random.chestclosed"),
+ RANDOM_CHESTOPEN(-1, "random.chestopen"),
+ RANDOM_CLASSIC_HURT(-1, "random.classic_hurt"),
+ RANDOM_DOOR_CLOSE(-1, "random.door_close"),
+ RANDOM_DOOR_OPEN(-1, "random.door_open"),
+ RANDOM_DRINK(-1, "random.drink"),
+ RANDOM_DRR(-1, "random.drr"),
+ RANDOM_EAT(-1, "random.eat"),
+ RANDOM_FUSE(-1, "random.fuse"),
+ RANDOM_GLASS(-1, "random.glass"),
+ RANDOM_HURT(-1, "random.hurt"),
+ RANDOM_LEVELUP(-1, "random.levelup"),
+ RANDOM_ORB(-1, "random.orb"),
+ RANDOM_POP(-1, "random.pop"),
+ RANDOM_SPLASH(-1, "random.splash"),
+ RANDOM_SUCCESSFUL_HIT(-1, "random.successful_hit"),
+ RANDOM_WOOD_CLICK(-1, "random.wood_click"),
+ RECORDS_11(-1, "records.11"),
+ RECORDS_13(-1, "records.13"),
+ RECORDS_BLOCKS(-1, "records.blocks"),
+ RECORDS_CAT(-1, "records.cat"),
+ RECORDS_CHIRP(-1, "records.chirp"),
+ RECORDS_FAR(-1, "records.far"),
+ RECORDS_MALL(-1, "records.mall"),
+ RECORDS_MELLOHI(-1, "records.mellohi"),
+ RECORDS_STAL(-1, "records.stal"),
+ RECORDS_STRAD(-1, "records.strad"),
+ RECORDS_WAIT(-1, "records.wait"),
+ RECORDS_WARD(-1, "records.ward"),
+ STEP_CLOTH(-1, "step.cloth"),
+ STEP_GRASS(-1, "step.grass"),
+ STEP_GRAVEL(-1, "step.gravel"),
+ STEP_LADDER(-1, "step.ladder"),
+ STEP_SAND(-1, "step.sand"),
+ STEP_SNOW(-1, "step.snow"),
+ STEP_STONE(-1, "step.stone"),
+ STEP_WOOD(-1, "step.wood"),
+ TILE_PISTON_IN(-1, "tile.piston.in"),
+ TILE_PISTON_OUT(-1, "tile.piston.out"),
+
+ NONE(-1, "");
+
+ /**
+ * Internal mapping by {@code int} id
+ */
+ private static final Map<Integer, SoundResource> ID_SOUND_MAP = new ConcurrentHashMap<>();
+ /**
+ * Internal mapping by {@code String} ResourceLocation
+ */
+ private static final Map<String, SoundResource> RESOURCE_STR_SOUND_MAP = new ConcurrentHashMap<>();
+
+ static {
+ EnumSet.allOf(SoundResource.class)
+ .forEach(sound -> { if (sound.id >= 0) ID_SOUND_MAP.put(sound.id, sound); });
+ EnumSet.allOf(SoundResource.class)
+ .forEach(sound -> RESOURCE_STR_SOUND_MAP.put(sound.resourceLocation.toString(), sound));
+ }
+
+ /**
+ * This Sound's identifier
+ */
+ public final int id;
+
+ /**
+ * The {@link ResourceLocation} of this {@link SoundResource}
+ */
+ public final ResourceLocation resourceLocation;
+
+ SoundResource(final int id, final ResourceLocation resourceLocation) {
+ this.id = id;
+ this.resourceLocation = resourceLocation;
+ }
+
+ SoundResource(final int id, final String resourcePath) {
+ this(id, new ResourceLocation(resourcePath));
+ }
+
+ SoundResource(final int id, final String resourceDomain, final String resourcePath) {
+ this(id, new ResourceLocation(resourceDomain.toLowerCase(Locale.ENGLISH), resourcePath));
+ }
+
+ /**
+ * @param id The Sounds identifier
+ * @return The {@link SoundResource}
+ */
+ public static SoundResource get(int id) {
+ return ID_SOUND_MAP.get(id);
+ }
+
+ /**
+ * @param resourceStr The {@link ResourceLocation}'s String of the {@link SoundResource}
+ * @return The {@link SoundResource}
+ */
+ public static SoundResource get(String resourceStr) {
+ return RESOURCE_STR_SOUND_MAP.get(resourceStr);
+ }
+
+ /**
+ * Provides a backward-compatible Sounds {@code Map<Integer, String>} sound list
+ *
+ * @return The map for the deprecated {@link gregtech.api.GregTech_API#sSoundList}
+ * @deprecated This method is planned for removal.
+ * <p>
+ * Use this {@link SoundResource} enum instead.
+ * </p>
+ */
+ @Deprecated
+ public static Map<Integer, String> asSoundList() {
+ return Maps.transformValues(ID_SOUND_MAP, SoundResource::toString);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public String toString() {
+ return this.resourceLocation.toString();
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/SteamVariant.java b/src/main/java/gregtech/api/enums/SteamVariant.java
new file mode 100644
index 0000000000..941b0d7231
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/SteamVariant.java
@@ -0,0 +1,16 @@
+package gregtech.api.enums;
+
+import java.util.Locale;
+
+public enum SteamVariant {
+
+ BRONZE,
+ STEEL,
+ PRIMITIVE,
+ NONE;
+
+ @Override
+ public String toString() {
+ return super.toString().toLowerCase(Locale.ENGLISH);
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/SubTag.java b/src/main/java/gregtech/api/enums/SubTag.java
new file mode 100644
index 0000000000..e62e5437f8
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/SubTag.java
@@ -0,0 +1,274 @@
+package gregtech.api.enums;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import gregtech.api.interfaces.ICondition;
+import gregtech.api.interfaces.ISubTagContainer;
+
+/**
+ * Just a simple Class to be able to add special Tags for Materials.
+ * <p/>
+ * The Tags should be added in preload and before I do my own preload to the Materials. In order to make yourself a new
+ * SubTag, just create one new instance of SubTag using getNewSubTag and use that one instance on all Materials you want
+ * to add those Tags to.
+ * <p/>
+ * You should look at this File whenever you update, maybe there are some new Tags you could use.
+ * <p/>
+ * -------------------------------------------------------------------------------------------------
+ * <p/>
+ * Some SubTags are used for other things than Materials too. It is useful when I need an easy way to declare Stuff in
+ * Items.
+ */
+public final class SubTag implements ICondition<ISubTagContainer> {
+
+ public static final HashMap<String, SubTag> sSubTags = new HashMap<>();
+ private static long sSubtagID = 0;
+ public final long mSubtagID;
+ public final String mName;
+ /**
+ * Add this to your Material if you want to have its Ore Calcite heated in a Blast Furnace for more output. Already
+ * listed are: Iron, Pyrite, PigIron, DeepIron, ShadowIron, WroughtIron and MeteoricIron.
+ */
+ public static final SubTag BLASTFURNACE_CALCITE_DOUBLE = getNewSubTag("BLASTFURNACE_CALCITE_DOUBLE"),
+ BLASTFURNACE_CALCITE_TRIPLE = getNewSubTag("BLASTFURNACE_CALCITE_TRIPLE");
+
+ /**
+ * Add this to a material with Direct Smelting to prevent the automatic generation of a Bricked/Bronze Blast Furnace
+ * recipe. Already listed are: Chalcopyrite, Tetrahedrite
+ */
+ public static final SubTag DONT_ADD_DEFAULT_BBF_RECIPE = getNewSubTag("DONT_ADD_DEFAULT_BBF_RECIPE");
+
+ /**
+ * Materials which are outputting less in an Induction Smelter. Already listed are: Pyrite, Tetrahedrite,
+ * Sphalerite, Cinnabar
+ */
+ public static final SubTag INDUCTIONSMELTING_LOW_OUTPUT = getNewSubTag("INDUCTIONSMELTING_LOW_OUTPUT");
+ /**
+ * Add this to your Material if you want to have its Ore Sodium Persulfate washed. Already listed are: Zinc, Nickel,
+ * Copper, Cobalt, Cobaltite and Tetrahedrite.
+ */
+ public static final SubTag WASHING_SODIUMPERSULFATE = getNewSubTag("WASHING_SODIUMPERSULFATE");
+ /**
+ * Add this to your Material if you want to have its Ore Mercury washed. Already listed are: Gold, Osmium, Mithril,
+ * Platinum, Midasium, Cooperite and AstralSilver.
+ */
+ public static final SubTag WASHING_MERCURY = getNewSubTag("WASHING_MERCURY");
+ /**
+ * Add this to your Material if you want to have its Ore Mercury washed with 99% output chance. Already listed are:
+ * Silver
+ */
+ public static final SubTag WASHING_MERCURY_99_PERCENT = getNewSubTag("WASHING_MERCURY_99_PERCENT");
+ /**
+ * Add this to your Material if you want to have its Ore electromagnetically separated to give Gold.
+ */
+ public static final SubTag ELECTROMAGNETIC_SEPERATION_GOLD = getNewSubTag("ELECTROMAGNETIC_SEPERATION_GOLD");
+ /**
+ * Add this to your Material if you want to have its Ore electromagnetically separated to give Iron.
+ */
+ public static final SubTag ELECTROMAGNETIC_SEPERATION_IRON = getNewSubTag("ELECTROMAGNETIC_SEPERATION_IRON");
+ /**
+ * Add this to your Material if you want to have its Ore electromagnetically separated to give Neodymium.
+ */
+ public static final SubTag ELECTROMAGNETIC_SEPERATION_NEODYMIUM = getNewSubTag(
+ "ELECTROMAGNETIC_SEPERATION_NEODYMIUM");
+ /**
+ * Add this to your Material if you want to have its Ore giving Cinnabar Crystals on Pulverization. Already listed
+ * are: Redstone
+ */
+ public static final SubTag PULVERIZING_CINNABAR = getNewSubTag("PULVERIZING_CINNABAR");
+ /**
+ * This Material cannot be worked by any other means, than smashing or smelting. This is used for coated Materials.
+ */
+ public static final SubTag NO_WORKING = getNewSubTag("NO_WORKING");
+ /**
+ * This Material cannot be used for regular Metal working techniques. Already
+ * listed are: Rubber, Plastic, Paper, Wood, Stone
+ */
+ public static final SubTag NO_SMASHING = getNewSubTag("NO_SMASHING");
+ /**
+ * This Material will have no associated recipes in any format.
+ */
+ public static final SubTag NO_RECIPES = getNewSubTag("NO_RECIPES");
+ /**
+ * This Material cannot be unificated
+ */
+ public static final SubTag NO_UNIFICATION = getNewSubTag("NO_UNIFICATION");
+ /**
+ * This Material cannot be used in any Recycler. Already listed are: Stone, Glass, Water
+ */
+ public static final SubTag NO_RECYCLING = getNewSubTag("NO_RECYCLING");
+ /**
+ * This Material cannot be used in any Furnace alike Structure. Already listed are: Paper, Wood, Gunpowder, Stone
+ */
+ public static final SubTag NO_SMELTING = getNewSubTag("NO_SMELTING");
+ /**
+ * This Material can be molten into a Fluid
+ */
+ public static final SubTag SMELTING_TO_FLUID = getNewSubTag("SMELTING_TO_FLUID");
+ /**
+ * This Ore should be molten directly into a Gem of this Material, if the Ingot is missing. Already listed are:
+ * Cinnabar
+ */
+ public static final SubTag SMELTING_TO_GEM = getNewSubTag("SMELTING_TO_GEM");
+ /**
+ * If this Material is some kind of Wood
+ */
+ public static final SubTag WOOD = getNewSubTag("WOOD");
+ /**
+ * If this Material is some kind of Food (or edible at all)
+ */
+ public static final SubTag FOOD = getNewSubTag("FOOD");
+ /**
+ * If this Material is some kind of Stone
+ */
+ public static final SubTag STONE = getNewSubTag("STONE");
+ /**
+ * If this Material is some kind of Pearl
+ */
+ public static final SubTag PEARL = getNewSubTag("PEARL");
+ /**
+ * If this Material is some kind of Quartz
+ */
+ public static final SubTag QUARTZ = getNewSubTag("QUARTZ");
+ /**
+ * If this Material is Crystallisable
+ */
+ public static final SubTag CRYSTALLISABLE = getNewSubTag("CRYSTALLISABLE");
+ /**
+ * If this Material is some kind of Crystal
+ */
+ public static final SubTag CRYSTAL = getNewSubTag("CRYSTAL");
+ /**
+ * If this Material is some kind of Magical
+ */
+ public static final SubTag MAGICAL = getNewSubTag("MAGICAL");
+ /**
+ * If this Material is some kind of Metal
+ */
+ public static final SubTag METAL = getNewSubTag("METAL");
+ /**
+ * If this Material is some kind of Paper
+ */
+ public static final SubTag PAPER = getNewSubTag("PAPER");
+ /**
+ * If this Material is having a constantly burning Aura
+ */
+ public static final SubTag BURNING = getNewSubTag("BURNING");
+ /**
+ * If this Material is some kind of flammable
+ */
+ public static final SubTag FLAMMABLE = getNewSubTag("FLAMMABLE");
+ /**
+ * If this Material is not burnable at all
+ */
+ public static final SubTag UNBURNABLE = getNewSubTag("UNBURNABLE");
+ /**
+ * If this Material is some kind of explosive
+ */
+ public static final SubTag EXPLOSIVE = getNewSubTag("EXPLOSIVE");
+ /**
+ * If this Material is bouncy
+ */
+ public static final SubTag BOUNCY = getNewSubTag("BOUNCY");
+ /**
+ * If this Material is invisible
+ */
+ public static final SubTag INVISIBLE = getNewSubTag("INVISIBLE");
+ /**
+ * If this Material is transparent
+ */
+ public static final SubTag TRANSPARENT = getNewSubTag("TRANSPARENT");
+ /**
+ * If this Material has a Color
+ */
+ public static final SubTag HAS_COLOR = getNewSubTag("HAS_COLOR");
+ /**
+ * If this Material is stretchable
+ */
+ public static final SubTag STRETCHY = getNewSubTag("STRETCHY");
+ /**
+ * If this Material is soft (and can be made into a Soft Mallet even if it's not wooden or bouncy)
+ */
+ public static final SubTag SOFT = getNewSubTag("SOFT");
+ /**
+ * If this Material is grindable with a simple Mortar
+ */
+ public static final SubTag MORTAR_GRINDABLE = getNewSubTag("MORTAR_GRINDABLE");
+ /**
+ * If this Material is usable for Soldering
+ */
+ public static final SubTag SOLDERING_MATERIAL = getNewSubTag("SOLDERING_MATERIAL");
+ /**
+ * If this Material is has extra Costs for Soldering, requires the Tag "SOLDERING_MATERIAL" too
+ */
+ public static final SubTag SOLDERING_MATERIAL_BAD = getNewSubTag("SOLDERING_MATERIAL_BAD");
+ /**
+ * If this Material is has a discount for Soldering, requires the Tag "SOLDERING_MATERIAL" too
+ */
+ public static final SubTag SOLDERING_MATERIAL_GOOD = getNewSubTag("SOLDERING_MATERIAL_GOOD");
+ /**
+ * Energy Tag for Electricity Primary = Voltage Secondary = Amperage
+ */
+ public static final SubTag ENERGY_ELECTRICITY = getNewSubTag("ENERGY_ELECTRICITY");
+ /**
+ * Energy Tag for Rotating Power Primary = Speed Secondary = Power
+ */
+ public static final SubTag ENERGY_ROTATIONAL = getNewSubTag("ENERGY_ROTATIONAL");
+ /**
+ * Energy Tag for Steam Power Primary = Steam per Tick Secondary = unused (always 1)
+ */
+ public static final SubTag ENERGY_STEAM = getNewSubTag("ENERGY_STEAM");
+ /**
+ * Energy Tag for Air Pressure Power Primary = Pressure Secondary = unused (always 1)
+ */
+ public static final SubTag ENERGY_AIR = getNewSubTag("ENERGY_AIR");
+ /**
+ * Energy Tag for Heat Primary = Temperature Secondary = unused (always 1)
+ */
+ public static final SubTag ENERGY_HEAT = getNewSubTag("ENERGY_HEAT");
+ /**
+ * Energy Tag for RedstoneFlux Primary = unused (always 1) Secondary = RF
+ */
+ public static final SubTag ENERGY_REDSTONE_FLUX = getNewSubTag("ENERGY_REDSTONE_FLUX");
+ /**
+ * Projectile Tag for Arrows
+ */
+ public static final SubTag PROJECTILE_ARROW = getNewSubTag("PROJECTILE_ARROW");
+
+ public final Collection<ISubTagContainer> mRelevantTaggedItems = new HashSet<>(1);
+
+ private SubTag(String aName) {
+ mSubtagID = sSubtagID++;
+ mName = aName;
+ sSubTags.put(aName, this);
+ }
+
+ public static SubTag getNewSubTag(String aName) {
+ for (SubTag tSubTag : sSubTags.values()) if (tSubTag.mName.equals(aName)) return tSubTag;
+ return new SubTag(aName);
+ }
+
+ @Override
+ public String toString() {
+ return mName;
+ }
+
+ public SubTag addContainerToList(ISubTagContainer... aContainers) {
+ if (aContainers != null) for (ISubTagContainer aContainer : aContainers)
+ if (aContainer != null && !mRelevantTaggedItems.contains(aContainer)) mRelevantTaggedItems.add(aContainer);
+ return this;
+ }
+
+ public SubTag addTo(ISubTagContainer... aContainers) {
+ if (aContainers != null)
+ for (ISubTagContainer aContainer : aContainers) if (aContainer != null) aContainer.add(this);
+ return this;
+ }
+
+ @Override
+ public boolean isTrue(ISubTagContainer aObject) {
+ return aObject.contains(this);
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/TC_Aspects.java b/src/main/java/gregtech/api/enums/TC_Aspects.java
new file mode 100644
index 0000000000..24d19b0b73
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/TC_Aspects.java
@@ -0,0 +1,112 @@
+package gregtech.api.enums;
+
+import java.util.List;
+
+public enum TC_Aspects {
+
+ AER(1),
+ ALIENIS(20),
+ AQUA(3),
+ ARBOR(1),
+ AURAM(16),
+ BESTIA(6),
+ COGNITIO(2),
+ CORPUS(2),
+ ELECTRUM(24),
+ EXANIMIS(32),
+ FABRICO(2),
+ FAMES(2),
+ GELUM(1),
+ GRANUM(4),
+ HERBA(2),
+ HUMANUS(8),
+ IGNIS(4),
+ INSTRUMENTUM(4),
+ ITER(6),
+ LIMUS(3),
+ LUCRUM(32),
+ LUX(4),
+ MACHINA(16),
+ MAGNETO(24),
+ MESSIS(3),
+ METALLUM(8),
+ METO(2),
+ MORTUUS(16),
+ MOTUS(4),
+ NEBRISUM(48),
+ ORDO(8),
+ PANNUS(6),
+ PERDITIO(2),
+ PERFODIO(4),
+ PERMUTATIO(12),
+ POTENTIA(16),
+ PRAECANTATIO(16),
+ RADIO(48),
+ SANO(24),
+ SENSUS(4),
+ SPIRITUS(24),
+ STRONTIO(64),
+ TELUM(6),
+ TERRA(1),
+ TEMPESTAS(64),
+ TENEBRAE(24),
+ TUTAMEN(12),
+ VACUOS(6),
+ VENENUM(16),
+ VICTUS(4),
+ VINCULUM(16),
+ VITIUM(48),
+ VITREUS(3),
+ VOLATUS(12);
+
+ /**
+ * The Thaumcraft Aspect Object of the Mod itself.
+ */
+ public Object mAspect;
+
+ public final int mValue;
+
+ TC_Aspects(int aValue) {
+ mValue = aValue;
+ }
+
+ public static class TC_AspectStack {
+
+ public TC_Aspects mAspect;
+ public long mAmount;
+
+ public TC_AspectStack(TC_Aspects aAspect, long aAmount) {
+ mAspect = aAspect;
+ mAmount = aAmount;
+ }
+
+ public TC_AspectStack copy() {
+ return new TC_AspectStack(mAspect, mAmount);
+ }
+
+ public TC_AspectStack copy(long aAmount) {
+ return new TC_AspectStack(mAspect, aAmount);
+ }
+
+ public List<TC_AspectStack> addToAspectList(List<TC_AspectStack> aList) {
+ if (mAmount == 0) return aList;
+ for (TC_AspectStack tAspect : aList) if (tAspect.mAspect == mAspect) {
+ tAspect.mAmount += mAmount;
+ return aList;
+ }
+ aList.add(copy());
+ return aList;
+ }
+
+ public boolean removeFromAspectList(List<TC_AspectStack> aList) {
+ for (TC_AspectStack tAspect : aList) if (tAspect.mAspect == mAspect) {
+ if (tAspect.mAmount >= mAmount) {
+ tAspect.mAmount -= mAmount;
+ if (tAspect.mAmount == 0) aList.remove(tAspect);
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/TextureSet.java b/src/main/java/gregtech/api/enums/TextureSet.java
new file mode 100644
index 0000000000..9e9b182c39
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/TextureSet.java
@@ -0,0 +1,132 @@
+package gregtech.api.enums;
+
+import gregtech.api.interfaces.IIconContainer;
+
+public class TextureSet {
+
+ private static final String aTextMatIconDir = "materialicons/";
+ private static final String aTextVoidDir = "/void";
+
+ private static final TextureType[] IS_BLOCK_TEXTURE = new TextureType[] { TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK,
+ TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK,
+ TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK,
+ TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK,
+ TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK,
+ TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK,
+ TextureType.BLOCK, TextureType.BLOCK, TextureType.BLOCK, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM,
+ TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, TextureType.ITEM, };
+ private static final String[] SUFFIXES = new String[] { "/dustTiny", "/dustSmall", "/dust", "/dustImpure",
+ "/dustPure", "/crushed", "/crushedPurified", "/crushedCentrifuged", "/gem", "/nugget", "/casingSmall", "/ingot",
+ "/ingotHot", "/ingotDouble", "/ingotTriple", "/ingotQuadruple", "/ingotQuintuple", "/plate", "/plateDouble",
+ "/plateTriple", "/plateQuadruple", "/plateQuintuple", "/plateDense", "/stick", "/lens", "/round", "/bolt",
+ "/screw", "/ring", "/foil", "/cell", "/cellPlasma", "/toolHeadSword", "/toolHeadPickaxe", "/toolHeadShovel",
+ "/toolHeadAxe", "/toolHeadHoe", "/toolHeadHammer", "/toolHeadFile", "/toolHeadSaw", "/toolHeadDrill",
+ "/toolHeadChainsaw", "/toolHeadWrench", "/toolHeadUniversalSpade", "/toolHeadSense", "/toolHeadPlow",
+ "/toolHeadArrow", "/toolHeadScrewdriver", "/toolHeadBuzzSaw", "/toolHeadSoldering", "/nanites", "/wireFine",
+ "/gearGtSmall", "/rotor", "/stickLong", "/springSmall", "/spring", "/arrowGtWood", "/arrowGtPlastic",
+ "/gemChipped", "/gemFlawed", "/gemFlawless", "/gemExquisite", "/gearGt", "/oreRaw", aTextVoidDir, aTextVoidDir,
+ "/oreSmall", "/ore", "/wire", "/foil", "/block1", "/block2", "/block3", "/block4", "/block5", "/block6",
+ "/pipeSide", "/pipeTiny", "/pipeSmall", "/pipeMedium", "/pipeLarge", "/pipeHuge", "/frameGt", "/pipeQuadruple",
+ "/pipeNonuple", aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir,
+ aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir, "/crateGtDust", "/crateGtIngot", "/crateGtGem",
+ "/crateGtPlate", "/turbineBlade", aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir,
+ aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir,
+ aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir,
+ aTextVoidDir, aTextVoidDir, aTextVoidDir, aTextVoidDir, "/handleMallet", "/toolHeadMallet", };
+
+ public boolean is_custom = false;
+
+ public static final TextureSet SET_NONE = new TextureSet("NONE"), SET_DULL = new TextureSet("DULL"),
+ SET_RUBY = new TextureSet("RUBY"), SET_OPAL = new TextureSet("OPAL"), SET_LEAF = new TextureSet("LEAF"),
+ SET_WOOD = new TextureSet("WOOD"), SET_SAND = new TextureSet("SAND"), SET_FINE = new TextureSet("FINE"),
+ SET_FIERY = new TextureSet("FIERY"), SET_FLUID = new TextureSet("FLUID"), SET_ROUGH = new TextureSet("ROUGH"),
+ SET_PAPER = new TextureSet("PAPER"), SET_GLASS = new TextureSet("GLASS"), SET_FLINT = new TextureSet("FLINT"),
+ SET_LAPIS = new TextureSet("LAPIS"), SET_SHINY = new TextureSet("SHINY"), SET_SHARDS = new TextureSet("SHARDS"),
+ SET_POWDER = new TextureSet("POWDER"), SET_QUARTZ = new TextureSet("QUARTZ"),
+ SET_EMERALD = new TextureSet("EMERALD"), SET_DIAMOND = new TextureSet("DIAMOND"),
+ SET_LIGNITE = new TextureSet("LIGNITE"), SET_MAGNETIC = new TextureSet("MAGNETIC"),
+ SET_METALLIC = new TextureSet("METALLIC"), SET_NETHERSTAR = new TextureSet("NETHERSTAR"),
+ SET_GEM_VERTICAL = new TextureSet("GEM_VERTICAL"), SET_GEM_HORIZONTAL = new TextureSet("GEM_HORIZONTAL");
+
+ /**
+ * For the Indices of OrePrefixes you need to look into the OrePrefix Enum.
+ */
+ public static final short INDEX_wire = 69, INDEX_foil = 70, INDEX_block1 = 71, INDEX_block2 = 72, INDEX_block3 = 73,
+ INDEX_block4 = 74, INDEX_block5 = 75, INDEX_block6 = 76;
+
+ public final IIconContainer[] mTextures = new IIconContainer[128];
+ public final String mSetName;
+
+ public TextureSet(String aSetName) {
+ mSetName = aSetName;
+ for (int i = 0; i < 128; i++) {
+ if (IS_BLOCK_TEXTURE[i] == TextureType.BLOCK) {
+ mTextures[i] = new Textures.BlockIcons.CustomIcon(aTextMatIconDir + aSetName + SUFFIXES[i]);
+ } else {
+ // Check nanites folder for nanites texture to avoid copy pasting large file multiple times.
+ // Exemption for CUSTOM textures so they can be overriden as normal by placing nanite image in
+ // their respective folder.
+ if (SUFFIXES[i].equals("/nanites") && (!aSetName.contains("CUSTOM"))) {
+ mTextures[i] = new Textures.ItemIcons.CustomIcon(aTextMatIconDir + "NANITES" + SUFFIXES[i]);
+ } else {
+ mTextures[i] = new Textures.ItemIcons.CustomIcon(aTextMatIconDir + aSetName + SUFFIXES[i]);
+ }
+ }
+ }
+ }
+
+ public TextureSet(String aSetName, boolean isCustom) {
+ this("CUSTOM/" + aSetName);
+ this.is_custom = isCustom;
+ }
+
+ /**
+ * Construct a TextureSet that will delegate some of its textures to the origin TextureSet.
+ * <p>
+ * This assumes you want to construct a custom texture set.
+ */
+ private TextureSet(String aSetName, TextureSet origin, boolean overrideBlock, boolean overrideItem) {
+ mSetName = "CUSTOM/" + aSetName;
+ this.is_custom = true;
+
+ for (int i = 0; i < 128; i++) {
+ if (IS_BLOCK_TEXTURE[i] == TextureType.BLOCK) {
+ if (overrideBlock) {
+ mTextures[i] = new Textures.BlockIcons.CustomIcon(aTextMatIconDir + mSetName + SUFFIXES[i]);
+ } else {
+ mTextures[i] = origin.mTextures[i];
+ }
+ } else {
+ if (overrideItem) {
+ mTextures[i] = new Textures.ItemIcons.CustomIcon(aTextMatIconDir + aSetName + SUFFIXES[i]);
+ } else {
+ mTextures[i] = origin.mTextures[i];
+ }
+ }
+ }
+ }
+
+ public TextureSet withBlockTextures(String aNewSetName) {
+ return new TextureSet(aNewSetName, this, true, false);
+ }
+
+ private enum TextureType {
+ BLOCK,
+ ITEM,
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/Textures.java b/src/main/java/gregtech/api/enums/Textures.java
new file mode 100644
index 0000000000..4faaddce38
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/Textures.java
@@ -0,0 +1,1895 @@
+package gregtech.api.enums;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class Textures {
+
+ public enum BlockIcons implements IIconContainer, Runnable {
+
+ // ADDED
+ MACHINE_UEV_SIDE,
+ MACHINE_UIV_SIDE,
+
+ MACHINE_UMV_SIDE,
+ MACHINE_UXV_SIDE,
+
+ MACHINE_MAXV_SIDE,
+
+ MACHINE_UEV_TOP,
+ MACHINE_UIV_TOP,
+
+ MACHINE_UMV_TOP,
+ MACHINE_UXV_TOP,
+
+ MACHINE_MAXV_TOP,
+
+ MACHINE_UEV_BOTTOM,
+ MACHINE_UIV_BOTTOM,
+
+ MACHINE_UMV_BOTTOM,
+ MACHINE_UXV_BOTTOM,
+
+ MACHINE_MAXV_BOTTOM,
+
+ OVERLAY_SCHEST,
+ OVERLAY_SCHEST_GLOW,
+ OVERLAY_STANK,
+ OVERLAY_STANK_GLOW,
+
+ OVERLAY_PIPELINE_FLUID_BACK,
+ OVERLAY_PIPELINE_FLUID_FRONT,
+ OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT,
+ OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT_GLOW,
+ OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN,
+ OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN_GLOW,
+
+ OVERLAY_PIPELINE_ITEM_BACK,
+ OVERLAY_PIPELINE_ITEM_FRONT,
+ OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT,
+ OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT_GLOW,
+ OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN,
+ OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN_GLOW,
+
+ LONG_DISTANCE_PIPE_FLUID,
+ LONG_DISTANCE_PIPE_ITEM,
+
+ HIDDEN_FACE,
+
+ MACHINE_CASING_TANK_1,
+ MACHINE_CASING_TANK_2,
+ MACHINE_CASING_TANK_3,
+ MACHINE_CASING_TANK_4,
+
+ MACHINE_CASING_TANK_5,
+ MACHINE_CASING_TANK_6,
+ MACHINE_CASING_TANK_7,
+ MACHINE_CASING_TANK_8,
+
+ MACHINE_CASING_TANK_9,
+ MACHINE_CASING_TANK_10,
+ MACHINE_CASING_TANK_11,
+ MACHINE_CASING_TANK_12,
+
+ MACHINE_CASING_TANK_13,
+ MACHINE_CASING_TANK_14,
+ MACHINE_CASING_TANK_0,
+
+ BLOCK_STEELEAF,
+ BLOCK_ICHORIUM,
+ BLOCK_FIRESTONE,
+ BLOCK_SHADOW,
+
+ OVERLAY_ENERGY_IN_POWER,
+ OVERLAY_ENERGY_OUT_POWER,
+ OVERLAY_AUTOMAINTENANCE,
+ OVERLAY_AUTOMAINTENANCE_GLOW,
+ OVERLAY_AUTOMAINTENANCE_IDLE,
+ OVERLAY_AUTOMAINTENANCE_IDLE_GLOW,
+
+ //
+ VOID // The Empty Texture
+ ,
+ RENDERING_ERROR,
+ PIPE_RESTRICTOR,
+ INSULATION_FULL,
+ INSULATION_TINY,
+ INSULATION_SMALL,
+ INSULATION_MEDIUM,
+ INSULATION_MEDIUM_PLUS,
+ INSULATION_LARGE,
+ INSULATION_HUGE,
+ CFOAM_FRESH,
+
+ CFOAM_HARDENED,
+ SOLARPANEL,
+ SOLARPANEL_8V,
+ SOLARPANEL_LV,
+ SOLARPANEL_MV,
+ SOLARPANEL_HV,
+ SOLARPANEL_EV,
+ SOLARPANEL_IV,
+ SOLARPANEL_LuV,
+ SOLARPANEL_ZPM,
+
+ SOLARPANEL_UV,
+ SOLARPANEL_UHV,
+ SOLARPANEL_UEV,
+ SOLARPANEL_UIV,
+ VENT_NORMAL,
+ VENT_ADVANCED,
+ COVER_WOOD_PLATE,
+ ARROW_UP,
+ ARROW_UP_GLOW,
+ ARROW_DOWN,
+ ARROW_DOWN_GLOW,
+ ARROW_LEFT,
+ ARROW_LEFT_GLOW,
+ ARROW_RIGHT,
+ ARROW_RIGHT_GLOW,
+ AUTOMATION_FILTER,
+ AUTOMATION_FILTER_GLOW,
+ AUTOMATION_TYPEFILTER,
+ AUTOMATION_TYPEFILTER_GLOW,
+ AUTOMATION_RECIPEFILTER,
+ AUTOMATION_RECIPEFILTER_GLOW,
+
+ AUTOMATION_CHESTBUFFER,
+ AUTOMATION_CHESTBUFFER_GLOW,
+ AUTOMATION_SUPERBUFFER,
+ AUTOMATION_SUPERBUFFER_GLOW,
+ AUTOMATION_REGULATOR,
+ AUTOMATION_REGULATOR_GLOW,
+ AUTOMATION_ITEMDISTRIBUTOR,
+ AUTOMATION_ITEMDISTRIBUTOR_GLOW,
+ CONCRETE_LIGHT_STONE,
+ CONCRETE_LIGHT_COBBLE,
+ CONCRETE_LIGHT_COBBLE_MOSSY,
+
+ CONCRETE_LIGHT_BRICKS,
+ CONCRETE_LIGHT_BRICKS_CRACKED,
+ CONCRETE_LIGHT_BRICKS_MOSSY,
+ CONCRETE_LIGHT_BRICKS_CHISELED,
+ CONCRETE_LIGHT_SMOOTH,
+ CONCRETE_DARK_STONE,
+
+ CONCRETE_DARK_COBBLE,
+ CONCRETE_DARK_COBBLE_MOSSY,
+ CONCRETE_DARK_BRICKS,
+ CONCRETE_DARK_BRICKS_CRACKED,
+ CONCRETE_DARK_BRICKS_MOSSY,
+ CONCRETE_DARK_BRICKS_CHISELED,
+
+ CONCRETE_DARK_SMOOTH,
+ GRANITE_BLACK_STONE,
+ GRANITE_BLACK_COBBLE,
+ GRANITE_BLACK_COBBLE_MOSSY,
+ GRANITE_BLACK_BRICKS,
+ GRANITE_BLACK_BRICKS_CRACKED,
+ GRANITE_BLACK_BRICKS_MOSSY,
+
+ GRANITE_BLACK_BRICKS_CHISELED,
+ GRANITE_BLACK_SMOOTH,
+ GRANITE_RED_STONE,
+ GRANITE_RED_COBBLE,
+ GRANITE_RED_COBBLE_MOSSY,
+ GRANITE_RED_BRICKS,
+ GRANITE_RED_BRICKS_CRACKED,
+
+ GRANITE_RED_BRICKS_MOSSY,
+ GRANITE_RED_BRICKS_CHISELED,
+ GRANITE_RED_SMOOTH,
+ MACHINE_BRONZEBRICKS_TOP,
+ MACHINE_BRONZEBRICKS_SIDE,
+ MACHINE_BRONZEBRICKS_BOTTOM,
+
+ MACHINE_STEELBRICKS_TOP,
+ MACHINE_STEELBRICKS_SIDE,
+ MACHINE_STEELBRICKS_BOTTOM,
+ MACHINE_BRONZE_TOP,
+ MACHINE_BRONZE_SIDE,
+ MACHINE_BRONZE_BOTTOM,
+ MACHINE_STEEL_TOP,
+
+ MACHINE_STEEL_SIDE,
+ MACHINE_STEEL_BOTTOM,
+ MACHINE_8V_TOP,
+ MACHINE_8V_SIDE,
+ MACHINE_8V_BOTTOM,
+ MACHINE_LV_TOP,
+ MACHINE_LV_SIDE,
+ MACHINE_LV_BOTTOM,
+ MACHINE_MV_TOP,
+
+ MACHINE_MV_SIDE,
+ MACHINE_MV_BOTTOM,
+ MACHINE_HV_TOP,
+ MACHINE_HV_SIDE,
+ MACHINE_HV_BOTTOM,
+ MACHINE_EV_TOP,
+ MACHINE_EV_SIDE,
+ MACHINE_EV_BOTTOM,
+ MACHINE_IV_TOP,
+
+ MACHINE_IV_SIDE,
+ MACHINE_IV_BOTTOM,
+ MACHINE_LuV_TOP,
+ MACHINE_LuV_SIDE,
+ MACHINE_LuV_BOTTOM,
+ MACHINE_ZPM_TOP,
+ MACHINE_ZPM_SIDE,
+ MACHINE_ZPM_BOTTOM,
+ MACHINE_UV_TOP,
+
+ MACHINE_UV_SIDE,
+ MACHINE_UV_BOTTOM,
+ MACHINE_MAX_TOP,
+ MACHINE_MAX_SIDE,
+ MACHINE_MAX_BOTTOM,
+ MACHINE_BRONZEPLATEDBRICKS,
+ MACHINE_HEATPROOFCASING,
+ MACHINE_DIM_TRANS_CASING,
+ MACHINE_DIM_INJECTOR,
+ MACHINE_DIM_BRIDGE,
+ MACHINE_COIL_SUPERCONDUCTOR,
+
+ MACHINE_BRONZEBLASTFURNACE,
+ MACHINE_BRONZEBLASTFURNACE_ACTIVE,
+ MACHINE_BRONZEBLASTFURNACE_ACTIVE_GLOW,
+ MACHINE_CASING_ROBUST_TUNGSTENSTEEL,
+ MACHINE_CASING_CLEAN_STAINLESSSTEEL,
+ MACHINE_CASING_STABLE_TITANIUM,
+ MACHINE_CASING_MINING_OSMIRIDIUM,
+ MACHINE_CASING_MINING_NEUTRONIUM,
+ MACHINE_CASING_MINING_BLACKPLUTONIUM,
+ MACHINE_CASING_RHODIUM_PALLADIUM,
+ MACHINE_CASING_IRIDIUM,
+ MACHINE_CASING_MAGICAL,
+ MACHINE_CASING_RADIANT_NAQUADAH_ALLOY,
+
+ MACHINE_CASING_FIREBOX_TITANIUM,
+ MACHINE_CASING_FUSION_COIL,
+ MACHINE_CASING_FUSION,
+ MACHINE_CASING_FUSION_GLASS,
+ MACHINE_CASING_FUSION_GLASS_YELLOW,
+ MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW,
+ MACHINE_CASING_FUSION_2,
+
+ MACHINE_CASING_MAGIC,
+ MACHINE_CASING_MAGIC_GLOW,
+ MACHINE_CASING_MAGIC_ACTIVE,
+ MACHINE_CASING_MAGIC_ACTIVE_GLOW,
+ MACHINE_CASING_MAGIC_FRONT,
+ MACHINE_CASING_MAGIC_FRONT_GLOW,
+ MACHINE_CASING_MAGIC_FRONT_ACTIVE,
+ MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW,
+ MACHINE_CASING_DRAGONEGG,
+ MACHINE_CASING_DRAGONEGG_GLOW,
+ MACHINE_CASING_SOLID_STEEL,
+
+ MACHINE_CASING_FROST_PROOF,
+ MACHINE_CASING_PUMP,
+ MACHINE_CASING_MOTOR,
+ MACHINE_CASING_PIPE_BRONZE,
+ MACHINE_CASING_PIPE_STEEL,
+ MACHINE_CASING_PIPE_TITANIUM,
+ MACHINE_CASING_PIPE_TUNGSTENSTEEL,
+ MACHINE_CASING_PIPE_POLYTETRAFLUOROETHYLENE,
+ MACHINE_CASING_PIPE_POLYBENZIMIDAZOLE,
+
+ MACHINE_CASING_GEARBOX_BRONZE,
+ MACHINE_CASING_GEARBOX_STEEL,
+ MACHINE_CASING_GEARBOX_TITANIUM,
+ MACHINE_CASING_GEARBOX_TUNGSTENSTEEL,
+ MACHINE_CASING_DATA_DRIVE,
+ MACHINE_CASING_CONTAINMENT_FIELD,
+
+ MACHINE_CASING_ASSEMBLER,
+ MACHINE_CASING_PROCESSOR,
+ MACHINE_CASING_STRIPES_A,
+ MACHINE_CASING_STRIPES_B,
+ MACHINE_CASING_RADIOACTIVEHAZARD,
+ MACHINE_CASING_BIOHAZARD,
+ MACHINE_CASING_EXPLOSIONHAZARD,
+
+ MACHINE_CASING_FIREHAZARD,
+ MACHINE_CASING_ACIDHAZARD,
+ MACHINE_CASING_MAGICHAZARD,
+ MACHINE_CASING_FROSTHAZARD,
+ MACHINE_CASING_NOISEHAZARD,
+ MACHINE_CASING_GRATE,
+ MACHINE_CASING_VENT,
+ MACHINE_CASING_VENT_T2,
+
+ MACHINE_CASING_RADIATIONPROOF,
+ MACHINE_CASING_ADVANCEDRADIATIONPROOF,
+ MACHINE_CASING_FIREBOX_BRONZE,
+ MACHINE_CASING_FIREBOX_STEEL,
+ MACHINE_CASING_FIREBOX_TUNGSTENSTEEL,
+ MACHINE_CASING_ENGINE_INTAKE,
+ MACHINE_CASING_EXTREME_ENGINE_INTAKE, // changed color in a terrible way
+ MACHINE_CASING_CHEMICALLY_INERT,
+ MACHINE_COIL_CUPRONICKEL,
+
+ MACHINE_CASING_DENSEBRICKS,
+ MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE,
+ MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE_GLOW,
+ MACHINE_CASING_BRICKEDBLASTFURNACE_INACTIVE,
+
+ MACHINE_COIL_KANTHAL,
+ MACHINE_COIL_NICHROME,
+ MACHINE_COIL_TUNGSTENSTEEL,
+ MACHINE_COIL_HSSG,
+ MACHINE_COIL_NAQUADAH,
+ MACHINE_COIL_NAQUADAHALLOY,
+ MACHINE_COIL_ELECTRUMFLUX,
+ MACHINE_COIL_AWAKENEDDRACONIUM,
+ MACHINE_COIL_HSSS,
+ MACHINE_COIL_TRINIUM,
+ MACHINE_COIL_INFINITY,
+ MACHINE_COIL_HYPOGEN,
+ MACHINE_COIL_ETERNAL,
+ BOILER_SOLAR,
+ BOILER_FRONT,
+ BOILER_FRONT_GLOW,
+
+ BOILER_FRONT_ACTIVE,
+ BOILER_FRONT_ACTIVE_GLOW,
+ BOILER_LAVA_FRONT,
+ BOILER_LAVA_FRONT_GLOW,
+ BOILER_LAVA_FRONT_ACTIVE,
+ BOILER_LAVA_FRONT_ACTIVE_GLOW,
+
+ NAQUADAH_REACTOR_SOLID_BACK,
+ NAQUADAH_REACTOR_SOLID_BACK_GLOW,
+ NAQUADAH_REACTOR_SOLID_FRONT,
+ NAQUADAH_REACTOR_SOLID_FRONT_GLOW,
+ NAQUADAH_REACTOR_SOLID_SIDE,
+ NAQUADAH_REACTOR_SOLID_SIDE_GLOW,
+ NAQUADAH_REACTOR_SOLID_BOTTOM,
+ NAQUADAH_REACTOR_SOLID_BOTTOM_GLOW,
+ NAQUADAH_REACTOR_SOLID_TOP,
+ NAQUADAH_REACTOR_SOLID_TOP_GLOW,
+ NAQUADAH_REACTOR_SOLID_BACK_ACTIVE,
+ NAQUADAH_REACTOR_SOLID_BACK_ACTIVE_GLOW,
+ NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE,
+ NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE_GLOW,
+ NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE,
+ NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE_GLOW,
+ NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE,
+ NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE_GLOW,
+ NAQUADAH_REACTOR_SOLID_TOP_ACTIVE,
+ NAQUADAH_REACTOR_SOLID_TOP_ACTIVE_GLOW,
+
+ NAQUADAH_REACTOR_FLUID_BACK,
+ NAQUADAH_REACTOR_FLUID_BACK_GLOW,
+ NAQUADAH_REACTOR_FLUID_FRONT,
+ NAQUADAH_REACTOR_FLUID_FRONT_GLOW,
+ NAQUADAH_REACTOR_FLUID_SIDE,
+ NAQUADAH_REACTOR_FLUID_SIDE_GLOW,
+ NAQUADAH_REACTOR_FLUID_BOTTOM,
+ NAQUADAH_REACTOR_FLUID_BOTTOM_GLOW,
+ NAQUADAH_REACTOR_FLUID_TOP,
+ NAQUADAH_REACTOR_FLUID_TOP_GLOW,
+ NAQUADAH_REACTOR_FLUID_BACK_ACTIVE,
+ NAQUADAH_REACTOR_FLUID_BACK_ACTIVE_GLOW,
+ NAQUADAH_REACTOR_FLUID_FRONT_ACTIVE,
+ NAQUADAH_REACTOR_FLUID_FRONT_ACTIVE_GLOW,
+ NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE,
+ NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE_GLOW,
+ NAQUADAH_REACTOR_FLUID_BOTTOM_ACTIVE,
+ NAQUADAH_REACTOR_FLUID_BOTTOM_ACTIVE_GLOW,
+ NAQUADAH_REACTOR_FLUID_TOP_ACTIVE,
+ NAQUADAH_REACTOR_FLUID_TOP_ACTIVE_GLOW,
+
+ DIESEL_GENERATOR_BACK,
+ DIESEL_GENERATOR_BACK_GLOW,
+ DIESEL_GENERATOR_FRONT,
+ DIESEL_GENERATOR_FRONT_GLOW,
+ DIESEL_GENERATOR_SIDE,
+ DIESEL_GENERATOR_SIDE_GLOW,
+ DIESEL_GENERATOR_BOTTOM,
+ DIESEL_GENERATOR_BOTTOM_GLOW,
+ DIESEL_GENERATOR_TOP,
+ DIESEL_GENERATOR_TOP_GLOW,
+ DIESEL_GENERATOR_BACK_ACTIVE,
+ DIESEL_GENERATOR_BACK_ACTIVE_GLOW,
+ DIESEL_GENERATOR_FRONT_ACTIVE,
+ DIESEL_GENERATOR_FRONT_ACTIVE_GLOW,
+ DIESEL_GENERATOR_SIDE_ACTIVE,
+ DIESEL_GENERATOR_SIDE_ACTIVE_GLOW,
+ DIESEL_GENERATOR_BOTTOM_ACTIVE,
+ DIESEL_GENERATOR_BOTTOM_ACTIVE_GLOW,
+ DIESEL_GENERATOR_TOP_ACTIVE,
+ DIESEL_GENERATOR_TOP_ACTIVE_GLOW,
+
+ GAS_TURBINE_BACK,
+ GAS_TURBINE_BACK_GLOW,
+ GAS_TURBINE_FRONT,
+ GAS_TURBINE_FRONT_GLOW,
+ GAS_TURBINE_SIDE,
+ GAS_TURBINE_SIDE_GLOW,
+ GAS_TURBINE_BOTTOM,
+ GAS_TURBINE_BOTTOM_GLOW,
+ GAS_TURBINE_TOP,
+ GAS_TURBINE_TOP_GLOW,
+ GAS_TURBINE_BACK_ACTIVE,
+ GAS_TURBINE_BACK_ACTIVE_GLOW,
+ GAS_TURBINE_FRONT_ACTIVE,
+ GAS_TURBINE_FRONT_ACTIVE_GLOW,
+ GAS_TURBINE_SIDE_ACTIVE,
+ GAS_TURBINE_SIDE_ACTIVE_GLOW,
+ GAS_TURBINE_BOTTOM_ACTIVE,
+ GAS_TURBINE_BOTTOM_ACTIVE_GLOW,
+ GAS_TURBINE_TOP_ACTIVE,
+ GAS_TURBINE_TOP_ACTIVE_GLOW,
+
+ STEAM_TURBINE_BACK,
+ STEAM_TURBINE_BACK_GLOW,
+ STEAM_TURBINE_FRONT,
+ STEAM_TURBINE_FRONT_GLOW,
+ STEAM_TURBINE_SIDE,
+ STEAM_TURBINE_SIDE_GLOW,
+ STEAM_TURBINE_BOTTOM,
+ STEAM_TURBINE_BOTTOM_GLOW,
+ STEAM_TURBINE_TOP,
+ STEAM_TURBINE_TOP_GLOW,
+ STEAM_TURBINE_BACK_ACTIVE,
+ STEAM_TURBINE_BACK_ACTIVE_GLOW,
+ STEAM_TURBINE_FRONT_ACTIVE,
+ STEAM_TURBINE_FRONT_ACTIVE_GLOW,
+ STEAM_TURBINE_SIDE_ACTIVE,
+ STEAM_TURBINE_SIDE_ACTIVE_GLOW,
+ STEAM_TURBINE_BOTTOM_ACTIVE,
+ STEAM_TURBINE_BOTTOM_ACTIVE_GLOW,
+ STEAM_TURBINE_TOP_ACTIVE,
+ STEAM_TURBINE_TOP_ACTIVE_GLOW,
+
+ BLOCK_BRONZEPREIN,
+ BLOCK_STEELPREIN,
+ BLOCK_TITANIUMPREIN,
+ BLOCK_NAQUADAHPREIN,
+ BLOCK_NEUTRONIUMPREIN,
+ BLOCK_DEEP_DARK_RAW,
+ BLOCK_IRREIN,
+ BLOCK_PLASCRETE,
+ BLOCK_TSREIN,
+
+ OVERLAY_LOCKER,
+ OVERLAY_LOCKER_000,
+ OVERLAY_LOCKER_001,
+ OVERLAY_LOCKER_002,
+ OVERLAY_LOCKER_003,
+ OVERLAY_LOCKER_004,
+ OVERLAY_LOCKER_005,
+ OVERLAY_LOCKER_006,
+ OVERLAY_LOCKER_007,
+ OVERLAY_LOCKER_008,
+ OVERLAY_LOCKER_009,
+ OVERLAY_LOCKER_010,
+ OVERLAY_LOCKER_011,
+ OVERLAY_LOCKER_012,
+ OVERLAY_LOCKER_013,
+
+ OVERLAY_LENS,
+ OVERLAY_PIPE,
+ OVERLAY_PIPE_IN,
+ OVERLAY_PIPE_OUT,
+ OVERLAY_INPUT_HATCH_2x2,
+ FLUID_OUT_SIGN,
+ FLUID_IN_SIGN,
+ ITEM_IN_SIGN,
+ ITEM_OUT_SIGN,
+ OVERLAY_MUFFLER,
+
+ OVERLAY_CONTROLLER,
+ OVERLAY_ACTIVITYDETECTOR,
+ OVERLAY_ACTIVITYDETECTOR_GLOW,
+ OVERLAY_ENERGYDETECTOR,
+ OVERLAY_FLUIDDETECTOR,
+ OVERLAY_ITEMDETECTOR,
+
+ OVERLAY_REDSTONE_TRANSMITTER,
+ OVERLAY_REDSTONE_RECEIVER,
+ OVERLAY_MAINTENANCE_DETECTOR,
+
+ OVERLAY_ADVANCED_REDSTONE_TRANSMITTER,
+ OVERLAY_ADVANCED_REDSTONE_RECEIVER,
+ OVERLAY_WIRELESS_ITEM_DETECTOR,
+ OVERLAY_WIRELESS_FLUID_DETECTOR,
+ OVERLAY_WIRELESS_MAINTENANCE_DETECTOR,
+ OVERLAY_WIRELESS_ACTIVITYDETECTOR,
+ OVERLAY_METRICS_TRANSMITTER,
+
+ OVERLAY_FLUID_STORAGE_MONITOR0,
+ OVERLAY_FLUID_STORAGE_MONITOR1,
+ OVERLAY_FLUID_STORAGE_MONITOR2,
+ OVERLAY_FLUID_STORAGE_MONITOR3,
+ OVERLAY_FLUID_STORAGE_MONITOR4,
+ OVERLAY_FLUID_STORAGE_MONITOR5,
+ OVERLAY_FLUID_STORAGE_MONITOR6,
+ OVERLAY_FLUID_STORAGE_MONITOR7,
+ OVERLAY_FLUID_STORAGE_MONITOR8,
+ OVERLAY_FLUID_STORAGE_MONITOR9,
+ OVERLAY_FLUID_STORAGE_MONITOR10,
+ OVERLAY_FLUID_STORAGE_MONITOR11,
+ OVERLAY_FLUID_STORAGE_MONITOR12,
+ OVERLAY_FLUID_STORAGE_MONITOR13,
+ OVERLAY_FLUID_STORAGE_MONITOR14,
+
+ OVERLAY_DTPF_OFF,
+ OVERLAY_DTPF_ON,
+ OVERLAY_FUSION1,
+ OVERLAY_FUSION1_GLOW,
+ OVERLAY_FUSION2,
+ OVERLAY_FUSION2_GLOW,
+ OVERLAY_FUSION3,
+ OVERLAY_FUSION3_GLOW,
+ OVERLAY_SCREEN,
+ OVERLAY_SCREEN_GLOW,
+ OVERLAY_QTANK,
+ OVERLAY_QTANK_GLOW,
+ OVERLAY_QCHEST,
+ OVERLAY_QCHEST_GLOW,
+ OVERLAY_SHUTTER,
+
+ OVERLAY_CLOSET,
+ OVERLAY_DUCTTAPE,
+ OVERLAY_MAINTENANCE,
+ OVERLAY_DATA_ACCESS,
+ OVERLAY_CONVEYOR,
+ OVERLAY_PUMP,
+ OVERLAY_VALVE,
+ OVERLAY_ARM,
+ OVERLAY_DRAIN,
+ OVERLAY_CRAFTING,
+ OVERLAY_ENERGY_IN,
+ OVERLAY_ENERGY_OUT,
+
+ OVERLAY_ENERGY_IN_MULTI,
+ OVERLAY_ENERGY_OUT_MULTI,
+ OVERLAY_FRONT_LARGE_BOILER,
+ OVERLAY_FRONT_LARGE_BOILER_GLOW,
+ OVERLAY_FRONT_LARGE_BOILER_ACTIVE,
+ OVERLAY_FRONT_LARGE_BOILER_ACTIVE_GLOW,
+ OVERLAY_FRONT_VACUUM_FREEZER,
+ OVERLAY_FRONT_VACUUM_FREEZER_GLOW,
+ OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE,
+ OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE_GLOW,
+ OVERLAY_ENERGY_ON_WIRELESS,
+ OVERLAY_ENERGY_OFF_WIRELESS,
+
+ OVERLAY_FRONT_MULTI_SMELTER,
+ OVERLAY_FRONT_MULTI_SMELTER_GLOW,
+ OVERLAY_FRONT_MULTI_SMELTER_ACTIVE,
+ OVERLAY_FRONT_MULTI_SMELTER_ACTIVE_GLOW,
+ OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE,
+ OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_GLOW,
+ OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE,
+ OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE_GLOW,
+ OVERLAY_FRONT_IMPLOSION_COMPRESSOR,
+ OVERLAY_FRONT_IMPLOSION_COMPRESSOR_GLOW,
+ OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE,
+ OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE_GLOW,
+ OVERLAY_FRONT_RESEARCH_COMPLETER,
+ OVERLAY_FRONT_RESEARCH_COMPLETER_GLOW,
+ OVERLAY_FRONT_RESEARCH_COMPLETER_ACTIVE,
+ OVERLAY_FRONT_RESEARCH_COMPLETER_ACTIVE_GLOW,
+
+ OVERLAY_TOP_POTIONBREWER,
+ OVERLAY_TOP_POTIONBREWER_GLOW,
+ OVERLAY_TOP_REPLICATOR,
+ OVERLAY_TOP_REPLICATOR_GLOW,
+ OVERLAY_TOP_MASSFAB,
+ OVERLAY_TOP_MASSFAB_GLOW,
+ OVERLAY_TOP_STEAM_HAMMER,
+ OVERLAY_TOP_STEAM_HAMMER_GLOW,
+ OVERLAY_TOP_STEAM_FURNACE,
+ OVERLAY_TOP_STEAM_FURNACE_GLOW,
+ OVERLAY_TOP_STEAM_ALLOY_SMELTER,
+ OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW,
+
+ OVERLAY_TOP_STEAM_MACERATOR,
+ OVERLAY_TOP_STEAM_MACERATOR_GLOW,
+ OVERLAY_TOP_STEAM_COMPRESSOR,
+ OVERLAY_TOP_STEAM_COMPRESSOR_GLOW,
+ OVERLAY_TOP_STEAM_EXTRACTOR,
+ OVERLAY_TOP_STEAM_EXTRACTOR_GLOW,
+ OVERLAY_TOP_DISASSEMBLER,
+ OVERLAY_TOP_DISASSEMBLER_GLOW,
+ OVERLAY_TOP_BOXINATOR,
+ OVERLAY_TOP_BOXINATOR_GLOW,
+ OVERLAY_TOP_ROCK_BREAKER,
+ OVERLAY_TOP_ROCK_BREAKER_GLOW,
+ OVERLAY_TOP_SCANNER,
+ OVERLAY_TOP_SCANNER_GLOW,
+ OVERLAY_TOP_INDUSTRIAL_APIARY,
+ OVERLAY_TOP_INDUSTRIAL_APIARY_GLOW,
+
+ OVERLAY_FRONT_POTIONBREWER,
+ OVERLAY_FRONT_POTIONBREWER_GLOW,
+ OVERLAY_FRONT_REPLICATOR,
+ OVERLAY_FRONT_REPLICATOR_GLOW,
+ OVERLAY_FRONT_MASSFAB,
+ OVERLAY_FRONT_MASSFAB_GLOW,
+ OVERLAY_FRONT_STEAM_HAMMER,
+ OVERLAY_FRONT_STEAM_HAMMER_GLOW,
+ OVERLAY_FRONT_STEAM_HAMMER_ACTIVE,
+ OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW,
+ OVERLAY_FRONT_STEAM_FURNACE,
+ OVERLAY_FRONT_STEAM_FURNACE_GLOW,
+ OVERLAY_FRONT_STEAM_ALLOY_SMELTER,
+ OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW,
+
+ OVERLAY_FRONT_STEAM_MACERATOR,
+ OVERLAY_FRONT_STEAM_MACERATOR_GLOW,
+ OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE,
+ OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW,
+ OVERLAY_FRONT_STEAM_COMPRESSOR,
+ OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW,
+ OVERLAY_FRONT_STEAM_EXTRACTOR,
+ OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW,
+ OVERLAY_FRONT_DISASSEMBLER,
+ OVERLAY_FRONT_DISASSEMBLER_GLOW,
+ OVERLAY_FRONT_DISASSEMBLER_ACTIVE,
+ OVERLAY_FRONT_DISASSEMBLER_ACTIVE_GLOW,
+ OVERLAY_FRONT_BOXINATOR,
+ OVERLAY_FRONT_BOXINATOR_GLOW,
+ OVERLAY_FRONT_ROCK_BREAKER,
+ OVERLAY_FRONT_ROCK_BREAKER_GLOW,
+ OVERLAY_FRONT_SCANNER,
+ OVERLAY_FRONT_SCANNER_GLOW,
+ OVERLAY_FRONT_INDUSTRIAL_APIARY,
+ OVERLAY_FRONT_INDUSTRIAL_APIARY_GLOW,
+
+ OVERLAY_BOTTOM_POTIONBREWER,
+ OVERLAY_BOTTOM_POTIONBREWER_GLOW,
+ OVERLAY_BOTTOM_REPLICATOR,
+ OVERLAY_BOTTOM_REPLICATOR_GLOW,
+ OVERLAY_BOTTOM_MASSFAB,
+ OVERLAY_BOTTOM_MASSFAB_GLOW,
+ OVERLAY_BOTTOM_STEAM_HAMMER,
+ OVERLAY_BOTTOM_STEAM_HAMMER_GLOW,
+ OVERLAY_BOTTOM_STEAM_FURNACE,
+ OVERLAY_BOTTOM_STEAM_FURNACE_GLOW,
+
+ OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER,
+ OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW,
+ OVERLAY_BOTTOM_STEAM_MACERATOR,
+ OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW,
+ OVERLAY_BOTTOM_STEAM_COMPRESSOR,
+ OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW,
+ OVERLAY_BOTTOM_STEAM_EXTRACTOR,
+ OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW,
+ OVERLAY_BOTTOM_DISASSEMBLER,
+ OVERLAY_BOTTOM_DISASSEMBLER_GLOW,
+ OVERLAY_BOTTOM_BOXINATOR,
+ OVERLAY_BOTTOM_BOXINATOR_GLOW,
+ OVERLAY_BOTTOM_ROCK_BREAKER,
+ OVERLAY_BOTTOM_ROCK_BREAKER_GLOW,
+ OVERLAY_BOTTOM_SCANNER,
+ OVERLAY_BOTTOM_SCANNER_GLOW,
+ OVERLAY_BOTTOM_INDUSTRIAL_APIARY,
+ OVERLAY_BOTTOM_INDUSTRIAL_APIARY_GLOW,
+
+ OVERLAY_SIDE_POTIONBREWER,
+ OVERLAY_SIDE_POTIONBREWER_GLOW,
+ OVERLAY_SIDE_REPLICATOR,
+ OVERLAY_SIDE_REPLICATOR_GLOW,
+ OVERLAY_SIDE_MASSFAB,
+ OVERLAY_SIDE_MASSFAB_GLOW,
+ OVERLAY_SIDE_STEAM_HAMMER,
+ OVERLAY_SIDE_STEAM_HAMMER_GLOW,
+ OVERLAY_SIDE_STEAM_FURNACE,
+ OVERLAY_SIDE_STEAM_FURNACE_GLOW,
+ OVERLAY_SIDE_STEAM_ALLOY_SMELTER,
+ OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW,
+ OVERLAY_SIDE_STEAM_MACERATOR,
+ OVERLAY_SIDE_STEAM_MACERATOR_GLOW,
+ OVERLAY_SIDE_STEAM_COMPRESSOR,
+ OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW,
+ OVERLAY_SIDE_STEAM_EXTRACTOR,
+ OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW,
+ OVERLAY_SIDE_DISASSEMBLER,
+ OVERLAY_SIDE_DISASSEMBLER_GLOW,
+ OVERLAY_SIDE_BOXINATOR,
+ OVERLAY_SIDE_BOXINATOR_GLOW,
+ OVERLAY_SIDE_ROCK_BREAKER,
+ OVERLAY_SIDE_ROCK_BREAKER_GLOW,
+ OVERLAY_SIDE_SCANNER,
+ OVERLAY_SIDE_SCANNER_GLOW,
+ OVERLAY_SIDE_INDUSTRIAL_APIARY,
+ OVERLAY_SIDE_INDUSTRIAL_APIARY_GLOW,
+
+ OVERLAY_TOP_POTIONBREWER_ACTIVE,
+ OVERLAY_TOP_POTIONBREWER_ACTIVE_GLOW,
+ OVERLAY_TOP_REPLICATOR_ACTIVE,
+ OVERLAY_TOP_REPLICATOR_ACTIVE_GLOW,
+ OVERLAY_TOP_MASSFAB_ACTIVE,
+ OVERLAY_TOP_MASSFAB_ACTIVE_GLOW,
+
+ OVERLAY_TOP_STEAM_HAMMER_ACTIVE,
+ OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW,
+ OVERLAY_TOP_STEAM_FURNACE_ACTIVE,
+ OVERLAY_TOP_STEAM_FURNACE_ACTIVE_GLOW,
+ OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE,
+ OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW,
+ OVERLAY_TOP_STEAM_MACERATOR_ACTIVE,
+ OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW,
+ OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE,
+ OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW,
+
+ OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE,
+ OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW,
+ OVERLAY_TOP_DISASSEMBLER_ACTIVE,
+ OVERLAY_TOP_DISASSEMBLER_ACTIVE_GLOW,
+ OVERLAY_TOP_BOXINATOR_ACTIVE,
+ OVERLAY_TOP_BOXINATOR_ACTIVE_GLOW,
+ OVERLAY_TOP_ROCK_BREAKER_ACTIVE,
+ OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW,
+ OVERLAY_TOP_SCANNER_ACTIVE,
+ OVERLAY_TOP_SCANNER_ACTIVE_GLOW,
+ OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE,
+ OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW,
+
+ OVERLAY_FRONT_POTIONBREWER_ACTIVE,
+ OVERLAY_FRONT_POTIONBREWER_ACTIVE_GLOW,
+ OVERLAY_FRONT_REPLICATOR_ACTIVE,
+ OVERLAY_FRONT_REPLICATOR_ACTIVE_GLOW,
+ OVERLAY_FRONT_MASSFAB_ACTIVE,
+ OVERLAY_FRONT_MASSFAB_ACTIVE_GLOW,
+ OVERLAY_FRONT_STEAM_FURNACE_ACTIVE,
+ OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW,
+ OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE,
+ OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW,
+
+ OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE,
+ OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW,
+ OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE,
+ OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW,
+ OVERLAY_FRONT_BOXINATOR_ACTIVE,
+ OVERLAY_FRONT_BOXINATOR_ACTIVE_GLOW,
+ OVERLAY_FRONT_ROCK_BREAKER_ACTIVE,
+ OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW,
+ OVERLAY_FRONT_SCANNER_ACTIVE,
+ OVERLAY_FRONT_SCANNER_ACTIVE_GLOW,
+ OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE,
+ OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW,
+
+ OVERLAY_BOTTOM_POTIONBREWER_ACTIVE,
+ OVERLAY_BOTTOM_POTIONBREWER_ACTIVE_GLOW,
+ OVERLAY_BOTTOM_REPLICATOR_ACTIVE,
+ OVERLAY_BOTTOM_REPLICATOR_ACTIVE_GLOW,
+ OVERLAY_BOTTOM_MASSFAB_ACTIVE,
+ OVERLAY_BOTTOM_MASSFAB_ACTIVE_GLOW,
+ OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE,
+ OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW,
+ OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE,
+ OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW,
+ OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE,
+ OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW,
+ OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE,
+ OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW,
+ OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE,
+ OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW,
+
+ OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE,
+ OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW,
+ OVERLAY_BOTTOM_DISASSEMBLER_ACTIVE,
+ OVERLAY_BOTTOM_DISASSEMBLER_ACTIVE_GLOW,
+ OVERLAY_BOTTOM_BOXINATOR_ACTIVE,
+ OVERLAY_BOTTOM_BOXINATOR_ACTIVE_GLOW,
+ OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE,
+ OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW,
+ OVERLAY_BOTTOM_SCANNER_ACTIVE,
+ OVERLAY_BOTTOM_SCANNER_ACTIVE_GLOW,
+ OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE,
+ OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE_GLOW,
+
+ OVERLAY_SIDE_POTIONBREWER_ACTIVE,
+ OVERLAY_SIDE_POTIONBREWER_ACTIVE_GLOW,
+ OVERLAY_SIDE_REPLICATOR_ACTIVE,
+ OVERLAY_SIDE_REPLICATOR_ACTIVE_GLOW,
+ OVERLAY_SIDE_MASSFAB_ACTIVE,
+ OVERLAY_SIDE_MASSFAB_ACTIVE_GLOW,
+ OVERLAY_SIDE_STEAM_HAMMER_ACTIVE,
+ OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW,
+ OVERLAY_SIDE_STEAM_FURNACE_ACTIVE,
+ OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW,
+ OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE,
+ OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW,
+
+ OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE,
+ OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW,
+ OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE,
+ OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW,
+ OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE,
+ OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW,
+ OVERLAY_SIDE_DISASSEMBLER_ACTIVE,
+ OVERLAY_SIDE_DISASSEMBLER_ACTIVE_GLOW,
+ OVERLAY_SIDE_BOXINATOR_ACTIVE,
+ OVERLAY_SIDE_BOXINATOR_ACTIVE_GLOW,
+ OVERLAY_SIDE_ROCK_BREAKER_ACTIVE,
+ OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW,
+ OVERLAY_SIDE_SCANNER_ACTIVE,
+ OVERLAY_SIDE_SCANNER_ACTIVE_GLOW,
+ OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE,
+ OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW,
+
+ OVERLAY_ADV_PUMP,
+ OVERLAY_TELEPORTER,
+ OVERLAY_TELEPORTER_GLOW,
+ OVERLAY_TELEPORTER_ACTIVE,
+ OVERLAY_TELEPORTER_ACTIVE_GLOW,
+ OVERLAY_TELEPORTER_SIDES,
+ OVERLAY_TELEPORTER_SIDES_GLOW,
+ FUSIONI_1,
+ FUSIONI_2,
+ FUSIONI_3,
+ FUSIONI_4,
+ FUSIONI_5,
+
+ FUSIONI_6,
+ FUSIONI_7,
+ FUSIONI_8,
+ FUSIONI_9,
+ FUSIONI_10,
+ FUSIONI_11,
+ FUSIONI_12,
+ FUSIONII_1,
+ FUSIONII_2,
+ FUSIONII_3,
+ FUSIONII_4,
+ FUSIONII_5,
+ FUSIONII_6,
+ FUSIONII_7,
+ FUSIONII_8,
+ FUSIONII_9,
+
+ FUSIONII_10,
+ FUSIONII_11,
+ FUSIONII_12,
+ LARGETURBINE_ST1,
+ LARGETURBINE_ST2,
+ LARGETURBINE_ST3,
+ LARGETURBINE_ST4,
+ LARGETURBINE_ST5,
+ LARGETURBINE_ST6,
+ LARGETURBINE_ST7,
+ LARGETURBINE_ST8,
+ LARGETURBINE_ST9,
+ LARGETURBINE_ST_ACTIVE1,
+ LARGETURBINE_ST_ACTIVE2,
+ LARGETURBINE_ST_ACTIVE3,
+ LARGETURBINE_ST_ACTIVE4,
+ LARGETURBINE_ST_ACTIVE5,
+ LARGETURBINE_ST_ACTIVE6,
+ LARGETURBINE_ST_ACTIVE7,
+ LARGETURBINE_ST_ACTIVE8,
+ LARGETURBINE_ST_ACTIVE9,
+
+ LARGETURBINE_SS1,
+ LARGETURBINE_SS2,
+ LARGETURBINE_SS3,
+ LARGETURBINE_SS4,
+ LARGETURBINE_SS5,
+ LARGETURBINE_SS6,
+ LARGETURBINE_SS7,
+ LARGETURBINE_SS8,
+ LARGETURBINE_SS9,
+ LARGETURBINE_SS_ACTIVE1,
+ LARGETURBINE_SS_ACTIVE2,
+ LARGETURBINE_SS_ACTIVE3,
+ LARGETURBINE_SS_ACTIVE4,
+ LARGETURBINE_SS_ACTIVE5,
+ LARGETURBINE_SS_ACTIVE6,
+ LARGETURBINE_SS_ACTIVE7,
+ LARGETURBINE_SS_ACTIVE8,
+ LARGETURBINE_SS_ACTIVE9,
+
+ LARGETURBINE_TI1,
+ LARGETURBINE_TI2,
+ LARGETURBINE_TI3,
+ LARGETURBINE_TI4,
+ LARGETURBINE_TI5,
+ LARGETURBINE_TI6,
+ LARGETURBINE_TI7,
+ LARGETURBINE_TI8,
+ LARGETURBINE_TI9,
+ LARGETURBINE_TI_ACTIVE1,
+ LARGETURBINE_TI_ACTIVE2,
+ LARGETURBINE_TI_ACTIVE3,
+ LARGETURBINE_TI_ACTIVE4,
+ LARGETURBINE_TI_ACTIVE5,
+ LARGETURBINE_TI_ACTIVE6,
+ LARGETURBINE_TI_ACTIVE7,
+ LARGETURBINE_TI_ACTIVE8,
+ LARGETURBINE_TI_ACTIVE9,
+
+ LARGETURBINE_TU1,
+ LARGETURBINE_TU2,
+ LARGETURBINE_TU3,
+ LARGETURBINE_TU4,
+ LARGETURBINE_TU5,
+ LARGETURBINE_TU6,
+ LARGETURBINE_TU7,
+ LARGETURBINE_TU8,
+ LARGETURBINE_TU9,
+ LARGETURBINE_TU_ACTIVE1,
+ LARGETURBINE_TU_ACTIVE2,
+ LARGETURBINE_TU_ACTIVE3,
+ LARGETURBINE_TU_ACTIVE4,
+ LARGETURBINE_TU_ACTIVE5,
+ LARGETURBINE_TU_ACTIVE6,
+ LARGETURBINE_TU_ACTIVE7,
+ LARGETURBINE_TU_ACTIVE8,
+ LARGETURBINE_TU_ACTIVE9,
+
+ MACHINE_CASING_TURBINE,
+ MACHINE_CASING_ADVANCEDGAS,
+ BLOCK_ADAMANTIUM,
+ BLOCK_ALUMINIUM,
+ BLOCK_AMERICIUM,
+
+ BLOCK_ANNEALEDCOPPER,
+ BLOCK_ANTIMONY,
+ BLOCK_ARSENIC,
+ BLOCK_ASTRALSILVER,
+ BLOCK_BATTERYALLOY,
+ BLOCK_BERYLLIUM,
+ BLOCK_BISMUTH,
+ BLOCK_BISMUTHBRONZE,
+ BLOCK_BLACKBRONZE,
+ BLOCK_BLACKSTEEL,
+
+ BLOCK_BLUEALLOY,
+ BLOCK_BLUESTEEL,
+ BLOCK_BRASS,
+ BLOCK_BRONZE,
+ BLOCK_CAESIUM,
+ BLOCK_CERIUM,
+ BLOCK_CHROME,
+ BLOCK_CHROMIUMDIOXIDE,
+ BLOCK_COBALT,
+ BLOCK_COBALTBRASS,
+ BLOCK_COPPER,
+
+ BLOCK_CUPRONICKEL,
+ BLOCK_DAMASCUSSTEEL,
+ BLOCK_DARKIRON,
+ BLOCK_DEEPIRON,
+ BLOCK_DESH,
+ BLOCK_DURANIUM,
+ BLOCK_DYSPROSIUM,
+ BLOCK_ELECTRUM,
+ BLOCK_ELECTRUMFLUX,
+ BLOCK_ENDERIUM,
+
+ BLOCK_ERBIUM,
+ BLOCK_EUROPIUM,
+ BLOCK_FIERYSTEEL,
+ BLOCK_GADOLINIUM,
+ BLOCK_GALLIUM,
+ BLOCK_HOLMIUM,
+ BLOCK_HSLA,
+ BLOCK_INDIUM,
+ BLOCK_INFUSEDGOLD,
+ BLOCK_INVAR,
+ BLOCK_IRIDIUM,
+
+ BLOCK_IRONMAGNETIC,
+ BLOCK_IRONWOOD,
+ BLOCK_KANTHAL,
+ BLOCK_KNIGHTMETAL,
+ BLOCK_LANTHANUM,
+ BLOCK_LEAD,
+ BLOCK_LUTETIUM,
+ BLOCK_MAGNALIUM,
+ BLOCK_MAGNESIUM,
+ BLOCK_MANGANESE,
+ BLOCK_METEORICIRON,
+
+ BLOCK_METEORICSTEEL,
+ BLOCK_MIDASIUM,
+ BLOCK_TRINIUM,
+ BLOCK_MITHRIL,
+ BLOCK_MOLYBDENUM,
+ BLOCK_NAQUADAH,
+ BLOCK_NAQUADAHALLOY,
+ BLOCK_NAQUADAHENRICHED,
+ BLOCK_NAQUADRIA,
+ BLOCK_NEODYMIUM,
+ BLOCK_NEODYMIUMMAGNETIC,
+
+ BLOCK_NEUTRONIUM,
+ BLOCK_NICHROME,
+ BLOCK_NICKEL,
+ BLOCK_NIOBIUM,
+ BLOCK_NIOBIUMNITRIDE,
+ BLOCK_NIOBIUMTITANIUM,
+ BLOCK_OSMIRIDIUM,
+ BLOCK_OSMIUM,
+ BLOCK_PALLADIUM,
+ BLOCK_PIGIRON,
+ BLOCK_PLATINUM,
+
+ BLOCK_PLUTONIUM,
+ BLOCK_PLUTONIUM241,
+ BLOCK_PRASEODYMIUM,
+ BLOCK_PROMETHIUM,
+ BLOCK_REDALLOY,
+ BLOCK_REDSTEEL,
+ BLOCK_ROSEGOLD,
+ BLOCK_RUBIDIUM,
+ BLOCK_SAMARIUM,
+ BLOCK_SCANDIUM,
+ BLOCK_SHADOWIRON,
+
+ BLOCK_SHADOWSTEEL,
+ BLOCK_SILICON,
+ BLOCK_SILVER,
+ BLOCK_SOLDERINGALLOY,
+ BLOCK_STAINLESSSTEEL,
+ BLOCK_STEEL,
+ BLOCK_STEELMAGNETIC,
+ BLOCK_STERLINGSILVER,
+ BLOCK_SUNNARIUM,
+ BLOCK_TANTALUM,
+
+ BLOCK_TELLURIUM,
+ BLOCK_TERBIUM,
+ BLOCK_THAUMIUM,
+ BLOCK_THORIUM,
+ BLOCK_THULIUM,
+ BLOCK_TIN,
+ BLOCK_TINALLOY,
+ BLOCK_TITANIUM,
+ BLOCK_TRITANIUM,
+ BLOCK_TUNGSTEN,
+ BLOCK_TUNGSTENSTEEL,
+ BLOCK_ULTIMET,
+ BLOCK_SPACETIME,
+
+ BLOCK_URANIUM,
+ BLOCK_URANIUM235,
+ BLOCK_VANADIUM,
+ BLOCK_VANADIUMGALLIUM,
+ BLOCK_WROUGHTIRON,
+ BLOCK_YTTRBIUM,
+ BLOCK_YTTRIUM,
+ BLOCK_YTTRIUMBARIUMCUPRATE,
+ BLOCK_ZINC,
+ BLOCK_TUNGSTENCARBIDE,
+
+ BLOCK_VANADIUMSTEEL,
+ BLOCK_HSSG,
+ BLOCK_HSSE,
+ BLOCK_HSSS,
+ BLOCK_AERCRYSTAL,
+ BLOCK_AMBER,
+ BLOCK_AMETHYST,
+ BLOCK_AQUACRYSTAL,
+ BLOCK_BLUETOPAZ,
+ BLOCK_CERTUSQUARTZ,
+ BLOCK_DILITHIUM,
+
+ BLOCK_ENDEREYE,
+ BLOCK_ENDERPEARL,
+ BLOCK_FOOLSRUBY,
+ BLOCK_FORCE,
+ BLOCK_FORCICIUM,
+ BLOCK_FORCILLIUM,
+ BLOCK_GREENSAPPHIRE,
+ BLOCK_IGNISCRYSTAL,
+ BLOCK_JASPER,
+ BLOCK_LAZURITE,
+
+ BLOCK_LIGNITE,
+ BLOCK_MONAZITE,
+ BLOCK_NITER,
+ BLOCK_OLIVINE,
+ BLOCK_OPAL,
+ BLOCK_ORDOCRYSTAL,
+ BLOCK_PERDITIOCRYSTAL,
+ BLOCK_PHOSPHORUS,
+ BLOCK_QUARTZITE,
+ BLOCK_REDGARNET,
+ BLOCK_RUBY,
+
+ BLOCK_SAPPHIRE,
+ BLOCK_SODALITE,
+ BLOCK_TANZANITE,
+ BLOCK_TERRACRYSTAL,
+ BLOCK_TOPAZ,
+ BLOCK_VINTEUM,
+ BLOCK_YELLOWGARNET,
+ BLOCK_NETHERSTAR,
+ BLOCK_CHARCOAL,
+ BLOCK_BLAZE,
+ BLOCK_CRYOLITE,
+ MARBLE_STONE,
+ MARBLE_COBBLE,
+ BLOCK_NICKELALUMINIUM,
+ BLOCK_SILICONSG,
+ BLOCK_TRANSCENDENTMETAL,
+ BLOCK_UNIVERSIUM,
+ BLOCK_ETERNITY,
+ BLOCK_MAGMATTER,
+
+ BLOCK_ORIHARUKON,
+
+ BLOCK_WHITEDWARFMATTER,
+
+ BLOCK_BLACKDWARFMATTER,
+
+ MARBLE_COBBLE_MOSSY,
+ MARBLE_BRICKS,
+ MARBLE_BRICKS_CRACKED,
+ MARBLE_BRICKS_MOSSY,
+ MARBLE_BRICKS_CHISELED,
+ MARBLE_SMOOTH,
+ BASALT_STONE,
+ BASALT_COBBLE,
+ BASALT_COBBLE_MOSSY,
+ BASALT_BRICKS,
+
+ BASALT_BRICKS_CRACKED,
+ BASALT_BRICKS_MOSSY,
+ BASALT_BRICKS_CHISELED,
+ BASALT_SMOOTH,
+ OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE,
+ OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE_GLOW,
+ OVERLAY_FRONT_HEAT_EXCHANGER,
+ OVERLAY_FRONT_HEAT_EXCHANGER_GLOW,
+ OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE,
+ OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW,
+
+ OVERLAY_FRONT_PROCESSING_ARRAY,
+ OVERLAY_FRONT_PROCESSING_ARRAY_GLOW,
+ OVERLAY_FRONT_OIL_DRILL_ACTIVE,
+ OVERLAY_FRONT_OIL_DRILL_ACTIVE_GLOW,
+ OVERLAY_FRONT_OIL_DRILL,
+ OVERLAY_FRONT_OIL_DRILL_GLOW,
+ OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE,
+ OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE_GLOW,
+ OVERLAY_FRONT_DIESEL_ENGINE,
+ OVERLAY_FRONT_DIESEL_ENGINE_GLOW,
+ OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE,
+ OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE_GLOW,
+ OVERLAY_FRONT_EXTREME_DIESEL_ENGINE,
+ OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_GLOW,
+ OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE,
+ OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE_GLOW,
+
+ OVERLAY_FRONT_PYROLYSE_OVEN,
+ OVERLAY_FRONT_PYROLYSE_OVEN_GLOW,
+ OVERLAY_FRONT_OIL_CRACKER_ACTIVE,
+ OVERLAY_FRONT_OIL_CRACKER_ACTIVE_GLOW,
+ OVERLAY_FRONT_OIL_CRACKER,
+ OVERLAY_FRONT_OIL_CRACKER_GLOW,
+ OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE,
+ OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW,
+ OVERLAY_FRONT_DISTILLATION_TOWER,
+ OVERLAY_FRONT_DISTILLATION_TOWER_GLOW,
+
+ OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE,
+ OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW,
+ OVERLAY_FRONT_ASSEMBLY_LINE,
+ OVERLAY_FRONT_ASSEMBLY_LINE_GLOW,
+ OVERLAY_FRONT_ORE_DRILL_ACTIVE,
+ OVERLAY_FRONT_ORE_DRILL_ACTIVE_GLOW,
+ OVERLAY_FRONT_ORE_DRILL,
+ OVERLAY_FRONT_ORE_DRILL_GLOW,
+ OVERLAY_TOP_CLEANROOM_ACTIVE,
+ OVERLAY_TOP_CLEANROOM_ACTIVE_GLOW,
+ OVERLAY_TOP_CLEANROOM,
+ OVERLAY_TOP_CLEANROOM_GLOW,
+
+ OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR,
+ OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW,
+ OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE,
+ OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW,
+
+ PIPE_RESTRICTOR_UP,
+ PIPE_RESTRICTOR_DOWN,
+ PIPE_RESTRICTOR_LEFT,
+ PIPE_RESTRICTOR_RIGHT,
+ PIPE_RESTRICTOR_NU,
+ PIPE_RESTRICTOR_ND,
+ PIPE_RESTRICTOR_NL,
+ PIPE_RESTRICTOR_NR,
+
+ PIPE_RESTRICTOR_UD,
+ PIPE_RESTRICTOR_UL,
+ PIPE_RESTRICTOR_UR,
+ PIPE_RESTRICTOR_DL,
+ PIPE_RESTRICTOR_DR,
+ PIPE_RESTRICTOR_LR,
+
+ LARGETURBINE_ST_EMPTY1,
+ LARGETURBINE_ST_EMPTY2,
+ LARGETURBINE_ST_EMPTY3,
+ LARGETURBINE_ST_EMPTY4,
+ LARGETURBINE_ST_EMPTY5,
+ LARGETURBINE_ST_EMPTY6,
+ LARGETURBINE_ST_EMPTY7,
+ LARGETURBINE_ST_EMPTY8,
+ LARGETURBINE_ST_EMPTY9,
+
+ LARGETURBINE_SS_EMPTY1,
+ LARGETURBINE_SS_EMPTY2,
+ LARGETURBINE_SS_EMPTY3,
+ LARGETURBINE_SS_EMPTY4,
+ LARGETURBINE_SS_EMPTY5,
+ LARGETURBINE_SS_EMPTY6,
+ LARGETURBINE_SS_EMPTY7,
+ LARGETURBINE_SS_EMPTY8,
+ LARGETURBINE_SS_EMPTY9,
+
+ LARGETURBINE_TI_EMPTY1,
+ LARGETURBINE_TI_EMPTY2,
+ LARGETURBINE_TI_EMPTY3,
+ LARGETURBINE_TI_EMPTY4,
+ LARGETURBINE_TI_EMPTY5,
+ LARGETURBINE_TI_EMPTY6,
+ LARGETURBINE_TI_EMPTY7,
+ LARGETURBINE_TI_EMPTY8,
+ LARGETURBINE_TI_EMPTY9,
+
+ LARGETURBINE_TU_EMPTY1,
+ LARGETURBINE_TU_EMPTY2,
+ LARGETURBINE_TU_EMPTY3,
+ LARGETURBINE_TU_EMPTY4,
+ LARGETURBINE_TU_EMPTY5,
+ LARGETURBINE_TU_EMPTY6,
+ LARGETURBINE_TU_EMPTY7,
+ LARGETURBINE_TU_EMPTY8,
+ LARGETURBINE_TU_EMPTY9,
+
+ LARGETURBINE_ADVGAS1,
+ LARGETURBINE_ADVGAS2,
+ LARGETURBINE_ADVGAS3,
+ LARGETURBINE_ADVGAS4,
+ LARGETURBINE_ADVGAS5,
+ LARGETURBINE_ADVGAS6,
+ LARGETURBINE_ADVGAS7,
+ LARGETURBINE_ADVGAS8,
+ LARGETURBINE_ADVGAS9,
+
+ LARGETURBINE_ADVGAS_ACTIVE1,
+ LARGETURBINE_ADVGAS_ACTIVE2,
+ LARGETURBINE_ADVGAS_ACTIVE3,
+ LARGETURBINE_ADVGAS_ACTIVE4,
+ LARGETURBINE_ADVGAS_ACTIVE5,
+ LARGETURBINE_ADVGAS_ACTIVE6,
+ LARGETURBINE_ADVGAS_ACTIVE7,
+ LARGETURBINE_ADVGAS_ACTIVE8,
+ LARGETURBINE_ADVGAS_ACTIVE9,
+
+ LARGETURBINE_ADVGAS_EMPTY1,
+ LARGETURBINE_ADVGAS_EMPTY2,
+ LARGETURBINE_ADVGAS_EMPTY3,
+ LARGETURBINE_ADVGAS_EMPTY4,
+ LARGETURBINE_ADVGAS_EMPTY5,
+ LARGETURBINE_ADVGAS_EMPTY6,
+ LARGETURBINE_ADVGAS_EMPTY7,
+ LARGETURBINE_ADVGAS_EMPTY8,
+ LARGETURBINE_ADVGAS_EMPTY9,
+
+ OVERLAY_ME_HATCH,
+ OVERLAY_ME_HATCH_ACTIVE,
+ OVERLAY_ME_INPUT_HATCH,
+ OVERLAY_ME_INPUT_HATCH_ACTIVE,
+ OVERLAY_ME_INPUT_FLUID_HATCH,
+ OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE,
+ OVERLAY_ME_CRAFTING_INPUT_BUFFER,
+ OVERLAY_ME_CRAFTING_INPUT_BUS,
+ OVERLAY_ME_CRAFTING_INPUT_SLAVE,
+ OVERLAY_ME_CRAFTING_HATCH,
+ OVERLAY_ME_CRAFTING_HATCH_ACTIVE,
+ OVERLAY_ME_FLUID_HATCH,
+ OVERLAY_ME_FLUID_HATCH_ACTIVE,
+
+ STRUCTURE_MARK,
+
+ MV_TOP_CYCLOTRON_SOLENOID,
+ MV_SIDE_CYCLOTRON_SOLENOID,
+ EV_TOP_CYCLOTRON_SOLENOID,
+ EV_SIDE_CYCLOTRON_SOLENOID,
+ IV_TOP_CYCLOTRON_SOLENOID,
+ IV_SIDE_CYCLOTRON_SOLENOID,
+ HV_TOP_CYCLOTRON_SOLENOID,
+ HV_SIDE_CYCLOTRON_SOLENOID,
+ LuV_TOP_CYCLOTRON_SOLENOID,
+ LuV_SIDE_CYCLOTRON_SOLENOID,
+ UMV_TOP_CYCLOTRON_SOLENOID,
+ UIV_TOP_CYCLOTRON_SOLENOID,
+ UEV_TOP_CYCLOTRON_SOLENOID,
+ UHV_TOP_CYCLOTRON_SOLENOID,
+ UV_TOP_CYCLOTRON_SOLENOID,
+ UV_SIDE_CYCLOTRON_SOLENOID,
+ UHV_SIDE_CYCLOTRON_SOLENOID,
+ UEV_SIDE_CYCLOTRON_SOLENOID,
+ UIV_SIDE_CYCLOTRON_SOLENOID,
+ UMV_SIDE_CYCLOTRON_SOLENOID,
+ ZPM_TOP_CYCLOTRON_SOLENOID,
+ ZPM_SIDE_CYCLOTRON_SOLENOID,
+ MACHINE_CASING_PCB_TIER_1,
+ MACHINE_CASING_PCB_TIER_2,
+ MACHINE_CASING_PCB_TIER_3,
+ INFINITY_COOLED_CASING,
+
+ LARGETURBINE_NEW1,
+ LARGETURBINE_NEW2,
+ LARGETURBINE_NEW3,
+ LARGETURBINE_NEW4,
+ LARGETURBINE_NEW5,
+ LARGETURBINE_NEW6,
+ LARGETURBINE_NEW7,
+ LARGETURBINE_NEW8,
+ LARGETURBINE_NEW9,
+ LARGETURBINE_NEW_ACTIVE1,
+ LARGETURBINE_NEW_ACTIVE2,
+ LARGETURBINE_NEW_ACTIVE3,
+ LARGETURBINE_NEW_ACTIVE4,
+ LARGETURBINE_NEW_ACTIVE5,
+ LARGETURBINE_NEW_ACTIVE6,
+ LARGETURBINE_NEW_ACTIVE7,
+ LARGETURBINE_NEW_ACTIVE8,
+ LARGETURBINE_NEW_ACTIVE9,
+ LARGETURBINE_NEW_EMPTY1,
+ LARGETURBINE_NEW_EMPTY2,
+ LARGETURBINE_NEW_EMPTY3,
+ LARGETURBINE_NEW_EMPTY4,
+ LARGETURBINE_NEW_EMPTY5,
+ LARGETURBINE_NEW_EMPTY6,
+ LARGETURBINE_NEW_EMPTY7,
+ LARGETURBINE_NEW_EMPTY8,
+ LARGETURBINE_NEW_EMPTY9,;
+
+ /**
+ * Icon for Fresh CFoam
+ */
+ public static final ITexture[] FRESHFOAM = { TextureFactory.of(CFOAM_FRESH) };
+ /**
+ * Icons for Hardened CFoam 0 = No Color 1 - 16 = Colors
+ */
+ public static final ITexture[][] HARDENEDFOAMS = {
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.CONSTRUCTION_FOAM.mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[0].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[1].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[2].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[3].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[4].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[5].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[6].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[7].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[8].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[9].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[10].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[11].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[12].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[13].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[14].mRGBa) },
+ new ITexture[] { TextureFactory.of(CFOAM_HARDENED, Dyes.VALUES[15].mRGBa) } };
+ /**
+ * Machine Casings by Tier 0 = 8V, 1 = LV, 2 = MV, 3 = HV, 4 = EV, 5 = IV, 6 = IV, 7 = IV, 8 = IV, 9 = IV
+ */
+ public static final IIconContainer[] MACHINECASINGS_SIDE = { MACHINE_8V_SIDE, MACHINE_LV_SIDE, MACHINE_MV_SIDE,
+ MACHINE_HV_SIDE, MACHINE_EV_SIDE, MACHINE_IV_SIDE, MACHINE_LuV_SIDE, MACHINE_ZPM_SIDE, MACHINE_UV_SIDE,
+ MACHINE_MAX_SIDE, MACHINE_UEV_SIDE, MACHINE_UIV_SIDE, MACHINE_UMV_SIDE, MACHINE_UXV_SIDE,
+ MACHINE_MAXV_SIDE, },
+ MACHINECASINGS_TOP = { MACHINE_8V_TOP, MACHINE_LV_TOP, MACHINE_MV_TOP, MACHINE_HV_TOP, MACHINE_EV_TOP,
+ MACHINE_IV_TOP, MACHINE_LuV_TOP, MACHINE_ZPM_TOP, MACHINE_UV_TOP, MACHINE_MAX_TOP, MACHINE_UEV_TOP,
+ MACHINE_UIV_TOP, MACHINE_UMV_TOP, MACHINE_UXV_TOP, MACHINE_MAXV_TOP, },
+ MACHINECASINGS_BOTTOM = { MACHINE_8V_BOTTOM, MACHINE_LV_BOTTOM, MACHINE_MV_BOTTOM, MACHINE_HV_BOTTOM,
+ MACHINE_EV_BOTTOM, MACHINE_IV_BOTTOM, MACHINE_LuV_BOTTOM, MACHINE_ZPM_BOTTOM, MACHINE_UV_BOTTOM,
+ MACHINE_MAX_BOTTOM, MACHINE_UEV_BOTTOM, MACHINE_UIV_BOTTOM, MACHINE_UMV_BOTTOM, MACHINE_UXV_BOTTOM,
+ MACHINE_MAXV_BOTTOM, },
+ GRANITES = { GRANITE_BLACK_STONE, GRANITE_BLACK_COBBLE, GRANITE_BLACK_COBBLE_MOSSY, GRANITE_BLACK_BRICKS,
+ GRANITE_BLACK_BRICKS_CRACKED, GRANITE_BLACK_BRICKS_MOSSY, GRANITE_BLACK_BRICKS_CHISELED,
+ GRANITE_BLACK_SMOOTH, GRANITE_RED_STONE, GRANITE_RED_COBBLE, GRANITE_RED_COBBLE_MOSSY,
+ GRANITE_RED_BRICKS, GRANITE_RED_BRICKS_CRACKED, GRANITE_RED_BRICKS_MOSSY, GRANITE_RED_BRICKS_CHISELED,
+ GRANITE_RED_SMOOTH, },
+ CONCRETES = { CONCRETE_DARK_STONE, CONCRETE_DARK_COBBLE, CONCRETE_DARK_COBBLE_MOSSY, CONCRETE_DARK_BRICKS,
+ CONCRETE_DARK_BRICKS_CRACKED, CONCRETE_DARK_BRICKS_MOSSY, CONCRETE_DARK_BRICKS_CHISELED,
+ CONCRETE_DARK_SMOOTH, CONCRETE_LIGHT_STONE, CONCRETE_LIGHT_COBBLE, CONCRETE_LIGHT_COBBLE_MOSSY,
+ CONCRETE_LIGHT_BRICKS, CONCRETE_LIGHT_BRICKS_CRACKED, CONCRETE_LIGHT_BRICKS_MOSSY,
+ CONCRETE_LIGHT_BRICKS_CHISELED, CONCRETE_LIGHT_SMOOTH, },
+ STONES = { MARBLE_STONE, MARBLE_COBBLE, MARBLE_COBBLE_MOSSY, MARBLE_BRICKS, MARBLE_BRICKS_CRACKED,
+ MARBLE_BRICKS_MOSSY, MARBLE_BRICKS_CHISELED, MARBLE_SMOOTH, BASALT_STONE, BASALT_COBBLE,
+ BASALT_COBBLE_MOSSY, BASALT_BRICKS, BASALT_BRICKS_CRACKED, BASALT_BRICKS_MOSSY, BASALT_BRICKS_CHISELED,
+ BASALT_SMOOTH, },
+ TURBINE = { LARGETURBINE_ST1, LARGETURBINE_ST2, LARGETURBINE_ST3, LARGETURBINE_ST4, LARGETURBINE_ST5,
+ LARGETURBINE_ST6, LARGETURBINE_ST7, LARGETURBINE_ST8, LARGETURBINE_ST9 },
+ TURBINE_ACTIVE = { LARGETURBINE_ST_ACTIVE1, LARGETURBINE_ST_ACTIVE2, LARGETURBINE_ST_ACTIVE3,
+ LARGETURBINE_ST_ACTIVE4, LARGETURBINE_ST_ACTIVE5, LARGETURBINE_ST_ACTIVE6, LARGETURBINE_ST_ACTIVE7,
+ LARGETURBINE_ST_ACTIVE8, LARGETURBINE_ST_ACTIVE9 },
+ TURBINE_EMPTY = { LARGETURBINE_ST_EMPTY1, LARGETURBINE_ST_EMPTY2, LARGETURBINE_ST_EMPTY3,
+ LARGETURBINE_ST_EMPTY4, LARGETURBINE_ST_EMPTY5, LARGETURBINE_ST_EMPTY6, LARGETURBINE_ST_EMPTY7,
+ LARGETURBINE_ST_EMPTY8, LARGETURBINE_ST_EMPTY9 },
+ TURBINE_NEW = { LARGETURBINE_NEW1, LARGETURBINE_NEW2, LARGETURBINE_NEW3, LARGETURBINE_NEW4,
+ LARGETURBINE_NEW5, LARGETURBINE_NEW6, LARGETURBINE_NEW7, LARGETURBINE_NEW8, LARGETURBINE_NEW9 },
+ TURBINE_NEW_ACTIVE = { LARGETURBINE_NEW_ACTIVE1, LARGETURBINE_NEW_ACTIVE2, LARGETURBINE_NEW_ACTIVE3,
+ LARGETURBINE_NEW_ACTIVE4, LARGETURBINE_NEW_ACTIVE5, LARGETURBINE_NEW_ACTIVE6, LARGETURBINE_NEW_ACTIVE7,
+ LARGETURBINE_NEW_ACTIVE8, LARGETURBINE_NEW_ACTIVE9 },
+ TURBINE_NEW_EMPTY = { LARGETURBINE_NEW_EMPTY1, LARGETURBINE_NEW_EMPTY2, LARGETURBINE_NEW_EMPTY3,
+ LARGETURBINE_NEW_EMPTY4, LARGETURBINE_NEW_EMPTY5, LARGETURBINE_NEW_EMPTY6, LARGETURBINE_NEW_EMPTY7,
+ LARGETURBINE_NEW_EMPTY8, LARGETURBINE_NEW_EMPTY9 },
+ TURBINE1 = { LARGETURBINE_SS1, LARGETURBINE_SS2, LARGETURBINE_SS3, LARGETURBINE_SS4, LARGETURBINE_SS5,
+ LARGETURBINE_SS6, LARGETURBINE_SS7, LARGETURBINE_SS8, LARGETURBINE_SS9 },
+ TURBINE_ACTIVE1 = { LARGETURBINE_SS_ACTIVE1, LARGETURBINE_SS_ACTIVE2, LARGETURBINE_SS_ACTIVE3,
+ LARGETURBINE_SS_ACTIVE4, LARGETURBINE_SS_ACTIVE5, LARGETURBINE_SS_ACTIVE6, LARGETURBINE_SS_ACTIVE7,
+ LARGETURBINE_SS_ACTIVE8, LARGETURBINE_SS_ACTIVE9 },
+ TURBINE_EMPTY1 = { LARGETURBINE_SS_EMPTY1, LARGETURBINE_SS_EMPTY2, LARGETURBINE_SS_EMPTY3,
+ LARGETURBINE_SS_EMPTY4, LARGETURBINE_SS_EMPTY5, LARGETURBINE_SS_EMPTY6, LARGETURBINE_SS_EMPTY7,
+ LARGETURBINE_SS_EMPTY8, LARGETURBINE_SS_EMPTY9 },
+ TURBINE2 = { LARGETURBINE_TI1, LARGETURBINE_TI2, LARGETURBINE_TI3, LARGETURBINE_TI4, LARGETURBINE_TI5,
+ LARGETURBINE_TI6, LARGETURBINE_TI7, LARGETURBINE_TI8, LARGETURBINE_TI9 },
+ TURBINE_ACTIVE2 = { LARGETURBINE_TI_ACTIVE1, LARGETURBINE_TI_ACTIVE2, LARGETURBINE_TI_ACTIVE3,
+ LARGETURBINE_TI_ACTIVE4, LARGETURBINE_TI_ACTIVE5, LARGETURBINE_TI_ACTIVE6, LARGETURBINE_TI_ACTIVE7,
+ LARGETURBINE_TI_ACTIVE8, LARGETURBINE_TI_ACTIVE9 },
+ TURBINE_EMPTY2 = { LARGETURBINE_TI_EMPTY1, LARGETURBINE_TI_EMPTY2, LARGETURBINE_TI_EMPTY3,
+ LARGETURBINE_TI_EMPTY4, LARGETURBINE_TI_EMPTY5, LARGETURBINE_TI_EMPTY6, LARGETURBINE_TI_EMPTY7,
+ LARGETURBINE_TI_EMPTY8, LARGETURBINE_TI_EMPTY9 },
+ TURBINE3 = { LARGETURBINE_TU1, LARGETURBINE_TU2, LARGETURBINE_TU3, LARGETURBINE_TU4, LARGETURBINE_TU5,
+ LARGETURBINE_TU6, LARGETURBINE_TU7, LARGETURBINE_TU8, LARGETURBINE_TU9 },
+ TURBINE_ACTIVE3 = { LARGETURBINE_TU_ACTIVE1, LARGETURBINE_TU_ACTIVE2, LARGETURBINE_TU_ACTIVE3,
+ LARGETURBINE_TU_ACTIVE4, LARGETURBINE_TU_ACTIVE5, LARGETURBINE_TU_ACTIVE6, LARGETURBINE_TU_ACTIVE7,
+ LARGETURBINE_TU_ACTIVE8, LARGETURBINE_TU_ACTIVE9 },
+ TURBINE_EMPTY3 = { LARGETURBINE_TU_EMPTY1, LARGETURBINE_TU_EMPTY2, LARGETURBINE_TU_EMPTY3,
+ LARGETURBINE_TU_EMPTY4, LARGETURBINE_TU_EMPTY5, LARGETURBINE_TU_EMPTY6, LARGETURBINE_TU_EMPTY7,
+ LARGETURBINE_TU_EMPTY8, LARGETURBINE_TU_EMPTY9 },
+ TURBINEADVGAS = { LARGETURBINE_ADVGAS1, LARGETURBINE_ADVGAS2, LARGETURBINE_ADVGAS3, LARGETURBINE_ADVGAS4,
+ LARGETURBINE_ADVGAS5, LARGETURBINE_ADVGAS6, LARGETURBINE_ADVGAS7, LARGETURBINE_ADVGAS8,
+ LARGETURBINE_ADVGAS9 },
+ TURBINE_ADVGASACTIVE = { LARGETURBINE_ADVGAS_ACTIVE1, LARGETURBINE_ADVGAS_ACTIVE2,
+ LARGETURBINE_ADVGAS_ACTIVE3, LARGETURBINE_ADVGAS_ACTIVE4, LARGETURBINE_ADVGAS_ACTIVE5,
+ LARGETURBINE_ADVGAS_ACTIVE6, LARGETURBINE_ADVGAS_ACTIVE7, LARGETURBINE_ADVGAS_ACTIVE8,
+ LARGETURBINE_ADVGAS_ACTIVE9 },
+ TURBINE_ADVGASEMPTY = { LARGETURBINE_ADVGAS_EMPTY1, LARGETURBINE_ADVGAS_EMPTY2, LARGETURBINE_ADVGAS_EMPTY3,
+ LARGETURBINE_ADVGAS_EMPTY4, LARGETURBINE_ADVGAS_EMPTY5, LARGETURBINE_ADVGAS_EMPTY6,
+ LARGETURBINE_ADVGAS_EMPTY7, LARGETURBINE_ADVGAS_EMPTY8, LARGETURBINE_ADVGAS_EMPTY9 },
+ CONNECTED_HULLS = { CONCRETE_DARK_STONE, FUSIONI_1, FUSIONI_2, FUSIONI_3, FUSIONI_4, FUSIONI_5, FUSIONI_6,
+ FUSIONI_7, FUSIONI_8, FUSIONI_9, FUSIONI_10, FUSIONI_11, FUSIONI_12, FUSIONII_1, FUSIONII_2, FUSIONII_3,
+ FUSIONII_4, FUSIONII_5, FUSIONII_6, FUSIONII_7, FUSIONII_8, FUSIONII_9, FUSIONII_10, FUSIONII_11,
+ FUSIONII_12, },
+ STORAGE_BLOCKS1 = { BLOCK_ADAMANTIUM, BLOCK_ALUMINIUM, BLOCK_AMERICIUM, BLOCK_ANNEALEDCOPPER,
+ BLOCK_ANTIMONY, BLOCK_ARSENIC, BLOCK_ASTRALSILVER, BLOCK_BATTERYALLOY, BLOCK_BERYLLIUM, BLOCK_BISMUTH,
+ BLOCK_BISMUTHBRONZE, BLOCK_BLACKBRONZE, BLOCK_BLACKSTEEL, BLOCK_BLUEALLOY, BLOCK_BLUESTEEL,
+ BLOCK_BRASS },
+ STORAGE_BLOCKS2 = { BLOCK_BRONZE, BLOCK_CAESIUM, BLOCK_CERIUM, BLOCK_CHROME, BLOCK_CHROMIUMDIOXIDE,
+ BLOCK_COBALT, BLOCK_COBALTBRASS, BLOCK_COPPER, BLOCK_CUPRONICKEL, BLOCK_DAMASCUSSTEEL, BLOCK_DARKIRON,
+ BLOCK_DEEPIRON, BLOCK_DESH, BLOCK_DURANIUM, BLOCK_DYSPROSIUM, BLOCK_ELECTRUM },
+ STORAGE_BLOCKS3 = { BLOCK_ELECTRUMFLUX, BLOCK_ENDERIUM, BLOCK_ERBIUM, BLOCK_EUROPIUM, BLOCK_FIERYSTEEL,
+ BLOCK_GADOLINIUM, BLOCK_GALLIUM, BLOCK_HOLMIUM, BLOCK_HSLA, BLOCK_INDIUM, BLOCK_INFUSEDGOLD,
+ BLOCK_INVAR, BLOCK_IRIDIUM, BLOCK_IRONMAGNETIC, BLOCK_IRONWOOD, BLOCK_KANTHAL },
+ STORAGE_BLOCKS4 = { BLOCK_KNIGHTMETAL, BLOCK_LANTHANUM, BLOCK_LEAD, BLOCK_LUTETIUM, BLOCK_MAGNALIUM,
+ BLOCK_MAGNESIUM, BLOCK_MANGANESE, BLOCK_METEORICIRON, BLOCK_METEORICSTEEL, BLOCK_TRINIUM, BLOCK_MITHRIL,
+ BLOCK_MOLYBDENUM, BLOCK_NAQUADAH, BLOCK_NAQUADAHALLOY, BLOCK_NAQUADAHENRICHED, BLOCK_NAQUADRIA },
+ STORAGE_BLOCKS5 = { BLOCK_NEODYMIUM, BLOCK_NEODYMIUMMAGNETIC, BLOCK_NEUTRONIUM, BLOCK_NICHROME,
+ BLOCK_NICKEL, BLOCK_NIOBIUM, BLOCK_NIOBIUMNITRIDE, BLOCK_NIOBIUMTITANIUM, BLOCK_OSMIRIDIUM,
+ BLOCK_OSMIUM, BLOCK_PALLADIUM, BLOCK_PIGIRON, BLOCK_PLATINUM, BLOCK_PLUTONIUM, BLOCK_PLUTONIUM241,
+ BLOCK_PRASEODYMIUM },
+ STORAGE_BLOCKS6 = { BLOCK_PROMETHIUM, BLOCK_REDALLOY, BLOCK_REDSTEEL, BLOCK_ROSEGOLD, BLOCK_RUBIDIUM,
+ BLOCK_SAMARIUM, BLOCK_SCANDIUM, BLOCK_SHADOWIRON, BLOCK_SHADOWSTEEL, BLOCK_SILICON, BLOCK_SILVER,
+ BLOCK_SOLDERINGALLOY, BLOCK_STAINLESSSTEEL, BLOCK_STEEL, BLOCK_STEELMAGNETIC, BLOCK_STERLINGSILVER },
+ STORAGE_BLOCKS7 = { BLOCK_SUNNARIUM, BLOCK_TANTALUM, BLOCK_TELLURIUM, BLOCK_TERBIUM, BLOCK_THAUMIUM,
+ BLOCK_THORIUM, BLOCK_THULIUM, BLOCK_TIN, BLOCK_TINALLOY, BLOCK_TITANIUM, BLOCK_TRITANIUM,
+ BLOCK_TUNGSTEN, BLOCK_TUNGSTENSTEEL, BLOCK_ULTIMET, BLOCK_URANIUM, BLOCK_URANIUM235 },
+ STORAGE_BLOCKS8 = { BLOCK_VANADIUM, BLOCK_VANADIUMGALLIUM, BLOCK_WROUGHTIRON, BLOCK_YTTRBIUM, BLOCK_YTTRIUM,
+ BLOCK_YTTRIUMBARIUMCUPRATE, BLOCK_ZINC, BLOCK_TUNGSTENCARBIDE, BLOCK_VANADIUMSTEEL, BLOCK_HSSG,
+ BLOCK_HSSE, BLOCK_HSSS, BLOCK_STEELEAF, BLOCK_ICHORIUM, BLOCK_FIRESTONE, BLOCK_SHADOW },
+ STORAGE_BLOCKS9 = { BLOCK_AERCRYSTAL, BLOCK_AMBER, BLOCK_AMETHYST, BLOCK_AQUACRYSTAL, BLOCK_BLUETOPAZ,
+ BLOCK_CERTUSQUARTZ, BLOCK_DILITHIUM, BLOCK_ENDEREYE, BLOCK_ENDERPEARL, BLOCK_FOOLSRUBY, BLOCK_FORCE,
+ BLOCK_FORCICIUM, BLOCK_FORCILLIUM, BLOCK_GREENSAPPHIRE, BLOCK_IGNISCRYSTAL, BLOCK_JASPER },
+ STORAGE_BLOCKS10 = { BLOCK_LAZURITE, BLOCK_LIGNITE, BLOCK_MONAZITE, BLOCK_NITER, BLOCK_OLIVINE, BLOCK_OPAL,
+ BLOCK_ORDOCRYSTAL, BLOCK_PERDITIOCRYSTAL, BLOCK_PHOSPHORUS, BLOCK_QUARTZITE, BLOCK_REDGARNET,
+ BLOCK_RUBY, BLOCK_SAPPHIRE, BLOCK_SODALITE, BLOCK_TANZANITE, BLOCK_TERRACRYSTAL },
+ STORAGE_BLOCKS11 = { BLOCK_TOPAZ, BLOCK_VINTEUM, BLOCK_YELLOWGARNET, BLOCK_NETHERSTAR, BLOCK_CHARCOAL,
+ BLOCK_BLAZE },
+ STORAGE_BLOCKS12 = { BLOCK_CRYOLITE, BLOCK_SILICONSG, BLOCK_NICKELALUMINIUM, BLOCK_SPACETIME,
+ BLOCK_TRANSCENDENTMETAL, BLOCK_ORIHARUKON, BLOCK_WHITEDWARFMATTER, BLOCK_BLACKDWARFMATTER,
+ BLOCK_UNIVERSIUM, BLOCK_ETERNITY, BLOCK_MAGMATTER };
+
+ public static final ITexture[] HIDDEN_TEXTURE = { TextureFactory.builder()
+ .addIcon(HIDDEN_FACE)
+ .stdOrient()
+ .build() };
+ public static final ITexture[] ERROR_RENDERING = { TextureFactory.of(RENDERING_ERROR) };
+ public static final ITexture[] OVERLAYS_ENERGY_IN = {
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 180, 180, 180, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 220, 220, 220, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 255, 100, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 255, 255, 30, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 128, 128, 128, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 240, 240, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 220, 220, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 200, 200, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 180, 180, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 160, 160, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 140, 140, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 120, 120, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 100, 100, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 80, 80, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 60, 60, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN, new short[] { 40, 40, 245, 0 }), };
+ public static ITexture[] OVERLAYS_ENERGY_OUT = {
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 180, 180, 180, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 220, 220, 220, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 255, 100, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 255, 255, 30, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 128, 128, 128, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 240, 240, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 220, 220, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 200, 200, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 180, 180, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 160, 160, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 140, 140, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 120, 120, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 100, 100, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 80, 80, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 60, 60, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT, new short[] { 40, 40, 245, 0 }), };
+ public static final ITexture[] OVERLAYS_ENERGY_IN_MULTI = {
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 180, 180, 180, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 220, 220, 220, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 255, 100, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 255, 255, 30, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 128, 128, 128, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 240, 240, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 220, 220, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 200, 200, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 180, 180, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 160, 160, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 140, 140, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 120, 120, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 100, 100, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 80, 80, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 60, 60, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_MULTI, new short[] { 40, 40, 245, 0 }), };
+
+ public static final ITexture[] OVERLAYS_ENERGY_IN_MULTI_WIRELESS_ON = {
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 255, 255, 255, 0 }), };
+
+ public static final ITexture[] OVERLAYS_ENERGY_IN_MULTI_WIRELESS_OFF = {
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OFF_WIRELESS, new short[] { 0, 0, 0, 0 }), };
+
+ public static final ITexture[] OVERLAYS_ENERGY_OUT_MULTI = {
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 180, 180, 180, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 220, 220, 220, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 255, 100, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 255, 255, 30, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 128, 128, 128, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 240, 240, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 220, 220, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 200, 200, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 180, 180, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 160, 160, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 140, 140, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 120, 120, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 100, 100, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 80, 80, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 60, 60, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI, new short[] { 40, 40, 245, 0 }), };
+ public static final ITexture[] OVERLAYS_ENERGY_IN_POWER = {
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 180, 180, 180, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 220, 220, 220, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 255, 100, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 255, 255, 30, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 128, 128, 128, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 240, 240, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 220, 220, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 200, 200, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 180, 180, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 160, 160, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 140, 140, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 120, 120, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 100, 100, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 80, 80, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 60, 60, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_IN_POWER, new short[] { 40, 40, 245, 0 }), };
+ public static final ITexture[] OVERLAYS_ENERGY_OUT_POWER = {
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 180, 180, 180, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 220, 220, 220, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 255, 100, 0, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 255, 255, 30, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 128, 128, 128, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 240, 240, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 220, 220, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 200, 200, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 180, 180, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 160, 160, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 140, 140, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 120, 120, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 100, 100, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 80, 80, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 60, 60, 245, 0 }),
+ TextureFactory.of(OVERLAY_ENERGY_OUT_POWER, new short[] { 40, 40, 245, 0 }), };
+ public static final ITexture[] LOCKERS = { TextureFactory.of(OVERLAY_LOCKER_000),
+ TextureFactory.of(OVERLAY_LOCKER_001), TextureFactory.of(OVERLAY_LOCKER_002),
+ TextureFactory.of(OVERLAY_LOCKER_003), TextureFactory.of(OVERLAY_LOCKER_004),
+ TextureFactory.of(OVERLAY_LOCKER_005), TextureFactory.of(OVERLAY_LOCKER_006),
+ TextureFactory.of(OVERLAY_LOCKER_007), TextureFactory.of(OVERLAY_LOCKER_008),
+ TextureFactory.of(OVERLAY_LOCKER_009), TextureFactory.of(OVERLAY_LOCKER_010),
+ TextureFactory.of(OVERLAY_LOCKER_011), TextureFactory.of(OVERLAY_LOCKER_012),
+ TextureFactory.of(OVERLAY_LOCKER_013), };
+ /**
+ * USE casingTexturePages[page] instead of CASING_BLOCKS since it is casingTexturePages[0]
+ */
+ @Deprecated
+ public static final ITexture[] CASING_BLOCKS = new ITexture[128]; // original variable still limited to 128
+
+ public static ITexture[][] MACHINE_CASINGS = new ITexture[15][17];
+ /**
+ * by Default pages are null page 0: 0-63 GT casing 1-4, 64-127 GT++ page 1: 0-15 GT casing 5, 22-26 GS dyson
+ * swarm, 48-57 GT casing 8, 63 EMT, 80-95 GT reinforced blocks, 96 casing 2 meta 6, 97 error casing page 8:
+ * 0-111 TecTech, 112-127 GT casing 6 page 12: 0-127 GlodBlock page 42: 0-126 glee8e, 127 KekzTech LSC base
+ */
+ public static ITexture[][] casingTexturePages = new ITexture[128][]; // page holder so we don't make an short
+ // long array
+
+ public static final int ERROR_TEXTURE_INDEX = (1 << 7) + 97;
+ private static final Map<ITexture, Integer> reverseMap = new HashMap<>();
+
+ static {
+ for (byte i = 0; i < MACHINE_CASINGS.length; i++)
+ for (byte j = 0; j < MACHINE_CASINGS[i].length; j++) MACHINE_CASINGS[i][j] = TextureFactory.of(
+ MACHINECASINGS_BOTTOM[i],
+ MACHINECASINGS_TOP[i],
+ MACHINECASINGS_SIDE[i],
+ Dyes.getModulation(j - 1, Dyes.MACHINE_METAL.mRGBa));
+ casingTexturePages[0] = new ITexture[128];
+ // adds some known pages, modders also can do it...
+ GT_Utility.addTexturePage((byte) 1);
+ GT_Utility.addTexturePage((byte) 8);
+ setCasingTextureForId(ERROR_TEXTURE_INDEX, ERROR_RENDERING[0]);
+ }
+
+ IIcon mIcon;
+
+ BlockIcons() {
+ GregTech_API.sGTBlockIconload.add(this);
+ }
+
+ public static ITexture getCasingTextureForId(int id) {
+ final ITexture[] page = casingTexturePages[(id >> 7) & 0x7f];
+ if (page == null) return null;
+ return page[id & 0x7f];
+ }
+
+ public static void setCasingTextureForId(int id, ITexture iTexture) {
+ casingTexturePages[(byte) ((id >> 7) & 0x7f)][(byte) (id & 0x7f)] = iTexture;
+ reverseMap.put(iTexture, id);
+ }
+
+ public static void setCasingTexture(byte page, byte index, ITexture iTexture) {
+ casingTexturePages[page][index] = iTexture;
+ reverseMap.put(iTexture, (page << 7) + index);
+ }
+
+ public static int getTextureIndex(ITexture texture) {
+ Integer id = reverseMap.get(texture);
+ return id == null ? ERROR_TEXTURE_INDEX : id;
+ }
+
+ @Override
+ public IIcon getIcon() {
+ return mIcon;
+ }
+
+ @Override
+ public IIcon getOverlayIcon() {
+ return null;
+ }
+
+ @Override
+ public ResourceLocation getTextureFile() {
+ return TextureMap.locationBlocksTexture;
+ }
+
+ @Override
+ public void run() {
+ mIcon = GregTech_API.sBlockIcons.registerIcon(GregTech.getResourcePath("iconsets", this.toString()));
+ }
+
+ public static class CustomIcon implements IIconContainer, Runnable {
+
+ protected IIcon mIcon;
+ protected String mIconName;
+
+ public CustomIcon(String aIconName) {
+ mIconName = !aIconName.contains(":") ? GregTech.getResourcePath(aIconName) : aIconName;
+ GregTech_API.sGTBlockIconload.add(this);
+ }
+
+ @Override
+ public void run() {
+ mIcon = GregTech_API.sBlockIcons.registerIcon(mIconName);
+ }
+
+ @Override
+ public IIcon getIcon() {
+ return mIcon;
+ }
+
+ @Override
+ public IIcon getOverlayIcon() {
+ return null;
+ }
+
+ @Override
+ public ResourceLocation getTextureFile() {
+ return TextureMap.locationBlocksTexture;
+ }
+ }
+ }
+
+ public enum ItemIcons implements IIconContainer, Runnable {
+
+ VOID, // The Empty Texture
+ RENDERING_ERROR,
+ WRENCH,
+ MORTAR,
+ CROWBAR,
+ JACKHAMMER,
+ WIRE_CUTTER,
+ KNIFE,
+ BUTCHERYKNIFE,
+ SICKLE,
+ SCOOP,
+ GRAFTER,
+ PLUNGER,
+ ROLLING_PIN,
+ HANDLE_SWORD,
+ HANDLE_FILE,
+ HANDLE_SAW,
+ HANDLE_SCREWDRIVER,
+ HANDLE_BUZZSAW,
+ HANDLE_ELECTRIC_SCREWDRIVER,
+ HANDLE_SOLDERING,
+ POWER_UNIT_LV,
+ POWER_UNIT_MV,
+ POWER_UNIT_HV,
+ DURABILITY_BAR_0,
+ DURABILITY_BAR_1,
+ DURABILITY_BAR_2,
+ DURABILITY_BAR_3,
+ DURABILITY_BAR_4,
+ DURABILITY_BAR_5,
+ DURABILITY_BAR_6,
+ DURABILITY_BAR_7,
+ DURABILITY_BAR_8,
+ ENERGY_BAR_0,
+ ENERGY_BAR_1,
+ ENERGY_BAR_2,
+ ENERGY_BAR_3,
+ ENERGY_BAR_4,
+ ENERGY_BAR_5,
+ ENERGY_BAR_6,
+ ENERGY_BAR_7,
+ ENERGY_BAR_8,
+ TURBINE,
+ TURBINE_SMALL,
+ TURBINE_LARGE,
+ TURBINE_HUGE,
+ POCKET_MULTITOOL_CLOSED,
+ POCKET_MULTITOOL_BRANCHCUTTER,
+ POCKET_MULTITOOL_FILE,
+ POCKET_MULTITOOL_KNIFE,
+ POCKET_MULTITOOL_SAW,
+ POCKET_MULTITOOL_SCREWDRIVER,
+ POCKET_MULTITOOL_WIRECUTTER,
+ HALO,
+ HALO_FUZZY;
+
+ public static final IIconContainer[] DURABILITY_BAR = { DURABILITY_BAR_0, DURABILITY_BAR_1, DURABILITY_BAR_2,
+ DURABILITY_BAR_3, DURABILITY_BAR_4, DURABILITY_BAR_5, DURABILITY_BAR_6, DURABILITY_BAR_7,
+ DURABILITY_BAR_8, },
+ ENERGY_BAR = { ENERGY_BAR_0, ENERGY_BAR_1, ENERGY_BAR_2, ENERGY_BAR_3, ENERGY_BAR_4, ENERGY_BAR_5,
+ ENERGY_BAR_6, ENERGY_BAR_7, ENERGY_BAR_8, };
+
+ public static final ITexture[] ERROR_RENDERING = { TextureFactory.of(RENDERING_ERROR) };
+
+ IIcon mIcon, mOverlay;
+
+ ItemIcons() {
+ GregTech_API.sGTItemIconload.add(this);
+ }
+
+ @Override
+ public IIcon getIcon() {
+ return mIcon;
+ }
+
+ @Override
+ public IIcon getOverlayIcon() {
+ return mOverlay;
+ }
+
+ @Override
+ public ResourceLocation getTextureFile() {
+ return TextureMap.locationItemsTexture;
+ }
+
+ @Override
+ public void run() {
+ mIcon = GregTech_API.sItemIcons.registerIcon(GregTech.getResourcePath("iconsets", this.toString()));
+ mOverlay = GregTech_API.sItemIcons.registerIcon(GregTech.getResourcePath("iconsets", this + "_OVERLAY"));
+ }
+
+ public static class CustomIcon implements IIconContainer, Runnable {
+
+ protected IIcon mIcon, mOverlay;
+ protected String mIconName;
+
+ public CustomIcon(String aIconName) {
+ mIconName = aIconName;
+ GregTech_API.sGTItemIconload.add(this);
+ }
+
+ @Override
+ public IIcon getIcon() {
+ return mIcon;
+ }
+
+ @Override
+ public IIcon getOverlayIcon() {
+ return mOverlay;
+ }
+
+ @Override
+ public ResourceLocation getTextureFile() {
+ return TextureMap.locationItemsTexture;
+ }
+
+ @Override
+ public void run() {
+ mIcon = GregTech_API.sItemIcons.registerIcon(GregTech.getResourcePath(mIconName));
+ mOverlay = GregTech_API.sItemIcons.registerIcon(GregTech.getResourcePath(mIconName + "_OVERLAY"));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/TickTime.java b/src/main/java/gregtech/api/enums/TickTime.java
new file mode 100644
index 0000000000..28c68e172f
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/TickTime.java
@@ -0,0 +1,10 @@
+package gregtech.api.enums;
+
+public class TickTime {
+
+ public static final int TICK = 1;
+ public static final int SECOND = TICK * 20;
+ public static final int MINUTE = SECOND * 60;
+ public static final int HOUR = MINUTE * 60;
+ public static final int DAY = HOUR * 24;
+}
diff --git a/src/main/java/gregtech/api/enums/Tier.java b/src/main/java/gregtech/api/enums/Tier.java
new file mode 100644
index 0000000000..84e8344334
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/Tier.java
@@ -0,0 +1,500 @@
+package gregtech.api.enums;
+
+import static gregtech.api.enums.GT_Values.V;
+
+/**
+ * Experimental Class for later
+ */
+public class Tier {
+
+ public static final Tier[] ELECTRIC = new Tier[] {
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 0,
+ V[0],
+ 1,
+ 1,
+ 1,
+ Materials.WroughtIron,
+ ItemList.Hull_ULV,
+ OrePrefixes.cableGt01.get(Materials.Lead),
+ OrePrefixes.cableGt04.get(Materials.Lead),
+ OrePrefixes.circuit.get(Materials.Primitive),
+ OrePrefixes.circuit.get(Materials.Basic)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 1,
+ V[1],
+ 1,
+ 1,
+ 1,
+ Materials.Steel,
+ ItemList.Hull_LV,
+ OrePrefixes.cableGt01.get(Materials.Tin),
+ OrePrefixes.cableGt04.get(Materials.Tin),
+ OrePrefixes.circuit.get(Materials.Basic),
+ OrePrefixes.circuit.get(Materials.Good)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 2,
+ V[2],
+ 1,
+ 1,
+ 1,
+ Materials.Aluminium,
+ ItemList.Hull_MV,
+ OrePrefixes.cableGt01.get(Materials.AnyCopper),
+ OrePrefixes.cableGt04.get(Materials.AnyCopper),
+ OrePrefixes.circuit.get(Materials.Good),
+ OrePrefixes.circuit.get(Materials.Advanced)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 3,
+ V[3],
+ 1,
+ 1,
+ 1,
+ Materials.StainlessSteel,
+ ItemList.Hull_HV,
+ OrePrefixes.cableGt01.get(Materials.Gold),
+ OrePrefixes.cableGt04.get(Materials.Gold),
+ OrePrefixes.circuit.get(Materials.Advanced),
+ OrePrefixes.circuit.get(Materials.Data)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 4,
+ V[4],
+ 1,
+ 1,
+ 1,
+ Materials.Titanium,
+ ItemList.Hull_EV,
+ OrePrefixes.cableGt01.get(Materials.Aluminium),
+ OrePrefixes.cableGt04.get(Materials.Aluminium),
+ OrePrefixes.circuit.get(Materials.Data),
+ OrePrefixes.circuit.get(Materials.Elite)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 5,
+ V[5],
+ 1,
+ 1,
+ 1,
+ Materials.TungstenSteel,
+ ItemList.Hull_IV,
+ OrePrefixes.cableGt01.get(Materials.Platinum),
+ OrePrefixes.cableGt04.get(Materials.Platinum),
+ OrePrefixes.circuit.get(Materials.Elite),
+ OrePrefixes.circuit.get(Materials.Master)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 6,
+ V[6],
+ 1,
+ 1,
+ 1,
+ Materials.Chrome,
+ ItemList.Hull_LuV,
+ OrePrefixes.cableGt01.get(Materials.NiobiumTitanium),
+ OrePrefixes.cableGt04.get(Materials.NiobiumTitanium),
+ OrePrefixes.circuit.get(Materials.Master),
+ OrePrefixes.circuit.get(Materials.Ultimate)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 7,
+ V[7],
+ 1,
+ 1,
+ 1,
+ Materials.Iridium,
+ ItemList.Hull_ZPM,
+ OrePrefixes.cableGt01.get(Materials.Naquadah),
+ OrePrefixes.cableGt04.get(Materials.Naquadah),
+ OrePrefixes.circuit.get(Materials.Ultimate),
+ OrePrefixes.circuit.get(Materials.SuperconductorUHV)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 8,
+ V[8],
+ 1,
+ 1,
+ 1,
+ Materials.Osmium,
+ ItemList.Hull_UV,
+ OrePrefixes.cableGt04.get(Materials.NaquadahAlloy),
+ OrePrefixes.wireGt01.get(Materials.SuperconductorUHV),
+ OrePrefixes.circuit.get(Materials.SuperconductorUHV),
+ OrePrefixes.circuit.get(Materials.Infinite)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 9,
+ V[9],
+ 1,
+ 1,
+ 1,
+ Materials.Neutronium,
+ ItemList.Hull_MAX,
+ OrePrefixes.wireGt01.get(Materials.SuperconductorUHV),
+ OrePrefixes.wireGt04.get(Materials.SuperconductorUHV),
+ OrePrefixes.circuit.get(Materials.Infinite),
+ OrePrefixes.circuit.get(Materials.Infinite)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 10,
+ V[10],
+ 1,
+ 1,
+ 1,
+ Materials.Neutronium,
+ ItemList.Hull_MAX,
+ OrePrefixes.wireGt01.get(Materials.SuperconductorUHV),
+ OrePrefixes.wireGt04.get(Materials.SuperconductorUHV),
+ OrePrefixes.circuit.get(Materials.Infinite),
+ OrePrefixes.circuit.get(Materials.Infinite)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 11,
+ V[11],
+ 1,
+ 1,
+ 1,
+ Materials.Neutronium,
+ ItemList.Hull_MAX,
+ OrePrefixes.wireGt01.get(Materials.SuperconductorUHV),
+ OrePrefixes.wireGt04.get(Materials.SuperconductorUHV),
+ OrePrefixes.circuit.get(Materials.Infinite),
+ OrePrefixes.circuit.get(Materials.Infinite)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 12,
+ V[12],
+ 1,
+ 1,
+ 1,
+ Materials.Neutronium,
+ ItemList.Hull_MAX,
+ OrePrefixes.wireGt01.get(Materials.SuperconductorUHV),
+ OrePrefixes.wireGt04.get(Materials.SuperconductorUHV),
+ OrePrefixes.circuit.get(Materials.Infinite),
+ OrePrefixes.circuit.get(Materials.Infinite)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 13,
+ V[13],
+ 1,
+ 1,
+ 1,
+ Materials.Neutronium,
+ ItemList.Hull_MAX,
+ OrePrefixes.wireGt01.get(Materials.SuperconductorUHV),
+ OrePrefixes.wireGt04.get(Materials.SuperconductorUHV),
+ OrePrefixes.circuit.get(Materials.Infinite),
+ OrePrefixes.circuit.get(Materials.Infinite)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 14,
+ V[14],
+ 1,
+ 1,
+ 1,
+ Materials.Neutronium,
+ ItemList.Hull_MAX,
+ OrePrefixes.wireGt01.get(Materials.SuperconductorUHV),
+ OrePrefixes.wireGt04.get(Materials.SuperconductorUHV),
+ OrePrefixes.circuit.get(Materials.Infinite),
+ OrePrefixes.circuit.get(Materials.Infinite)),
+ new Tier(
+ SubTag.ENERGY_ELECTRICITY,
+ 15,
+ V[15],
+ 1,
+ 1,
+ 1,
+ Materials.Neutronium,
+ ItemList.Hull_MAX,
+ OrePrefixes.wireGt01.get(Materials.SuperconductorUHV),
+ OrePrefixes.wireGt04.get(Materials.SuperconductorUHV),
+ OrePrefixes.circuit.get(Materials.Infinite),
+ OrePrefixes.circuit.get(Materials.Infinite)),
+
+ // READ GT_VALUES CLASS BEFORE YOU START ADDING STUFF TO TIERS 8+ - and probably dont do it in
+ // GT but in GTNH core mod - that way we shouldnt need to set the tier class
+ }, ROTATIONAL = new Tier[] {
+ new Tier(
+ SubTag.ENERGY_ROTATIONAL,
+ 1,
+ 32,
+ 1,
+ 1,
+ 1,
+ Materials.Wood,
+ OrePrefixes.frameGt.get(Materials.Wood),
+ OrePrefixes.stick.get(Materials.Wood),
+ OrePrefixes.ingot.get(Materials.Wood),
+ OrePrefixes.gearGt.get(Materials.Wood),
+ OrePrefixes.gearGt.get(Materials.Stone)),
+ new Tier(
+ SubTag.ENERGY_ROTATIONAL,
+ 1,
+ 32,
+ 1,
+ 2,
+ 2,
+ Materials.WoodSealed,
+ OrePrefixes.frameGt.get(Materials.WoodSealed),
+ OrePrefixes.stick.get(Materials.WoodSealed),
+ OrePrefixes.ingot.get(Materials.WoodSealed),
+ OrePrefixes.gearGt.get(Materials.WoodSealed),
+ OrePrefixes.gearGt.get(Materials.Stone)),
+ new Tier(
+ SubTag.ENERGY_ROTATIONAL,
+ 2,
+ 128,
+ 1,
+ 1,
+ 1,
+ Materials.Stone,
+ OrePrefixes.frameGt.get(Materials.Stone),
+ OrePrefixes.stick.get(Materials.Stone),
+ OrePrefixes.ingot.get(Materials.Stone),
+ OrePrefixes.gearGt.get(Materials.Stone),
+ OrePrefixes.gearGt.get(Materials.Bronze)),
+ new Tier(
+ SubTag.ENERGY_ROTATIONAL,
+ 2,
+ 128,
+ 1,
+ 2,
+ 2,
+ Materials.IronWood,
+ OrePrefixes.frameGt.get(Materials.IronWood),
+ OrePrefixes.stick.get(Materials.IronWood),
+ OrePrefixes.ingot.get(Materials.IronWood),
+ OrePrefixes.gearGt.get(Materials.IronWood),
+ OrePrefixes.gearGt.get(Materials.Bronze)),
+ new Tier(
+ SubTag.ENERGY_ROTATIONAL,
+ 3,
+ 512,
+ 1,
+ 1,
+ 1,
+ Materials.Bronze,
+ OrePrefixes.frameGt.get(Materials.Bronze),
+ OrePrefixes.stick.get(Materials.Bronze),
+ OrePrefixes.ingot.get(Materials.Bronze),
+ OrePrefixes.gearGt.get(Materials.Bronze),
+ OrePrefixes.gearGt.get(Materials.Steel)),
+ new Tier(
+ SubTag.ENERGY_ROTATIONAL,
+ 3,
+ 512,
+ 1,
+ 2,
+ 2,
+ Materials.Brass,
+ OrePrefixes.frameGt.get(Materials.Brass),
+ OrePrefixes.stick.get(Materials.Brass),
+ OrePrefixes.ingot.get(Materials.Brass),
+ OrePrefixes.gearGt.get(Materials.Brass),
+ OrePrefixes.gearGt.get(Materials.Steel)),
+ new Tier(
+ SubTag.ENERGY_ROTATIONAL,
+ 4,
+ 2048,
+ 1,
+ 1,
+ 1,
+ Materials.Steel,
+ OrePrefixes.frameGt.get(Materials.Steel),
+ OrePrefixes.stick.get(Materials.Steel),
+ OrePrefixes.ingot.get(Materials.Steel),
+ OrePrefixes.gearGt.get(Materials.Steel),
+ OrePrefixes.gearGt.get(Materials.TungstenSteel)),
+ new Tier(
+ SubTag.ENERGY_ROTATIONAL,
+ 4,
+ 2048,
+ 1,
+ 2,
+ 2,
+ Materials.Titanium,
+ OrePrefixes.frameGt.get(Materials.Titanium),
+ OrePrefixes.stick.get(Materials.Titanium),
+ OrePrefixes.ingot.get(Materials.Titanium),
+ OrePrefixes.gearGt.get(Materials.Titanium),
+ OrePrefixes.gearGt.get(Materials.TungstenSteel)),
+ new Tier(
+ SubTag.ENERGY_ROTATIONAL,
+ 5,
+ 8192,
+ 1,
+ 1,
+ 1,
+ Materials.TungstenSteel,
+ OrePrefixes.frameGt.get(Materials.TungstenSteel),
+ OrePrefixes.stick.get(Materials.TungstenSteel),
+ OrePrefixes.ingot.get(Materials.TungstenSteel),
+ OrePrefixes.gearGt.get(Materials.TungstenSteel),
+ OrePrefixes.gearGt.get(Materials.Iridium)),
+ new Tier(
+ SubTag.ENERGY_ROTATIONAL,
+ 6,
+ 32768,
+ 1,
+ 1,
+ 1,
+ Materials.Iridium,
+ OrePrefixes.frameGt.get(Materials.Iridium),
+ OrePrefixes.stick.get(Materials.Iridium),
+ OrePrefixes.ingot.get(Materials.Iridium),
+ OrePrefixes.gearGt.get(Materials.Iridium),
+ OrePrefixes.gearGt.get(Materials.Neutronium)),
+ new Tier(
+ SubTag.ENERGY_ROTATIONAL,
+ 9,
+ Integer.MAX_VALUE - 7,
+ 1,
+ 1,
+ 1,
+ Materials.Neutronium,
+ OrePrefixes.frameGt.get(Materials.Neutronium),
+ OrePrefixes.stick.get(Materials.Neutronium),
+ OrePrefixes.ingot.get(Materials.Neutronium),
+ OrePrefixes.gearGt.get(Materials.Neutronium),
+ OrePrefixes.gearGt.get(Materials.Neutronium)), },
+ STEAM = new Tier[] {
+ new Tier(
+ SubTag.ENERGY_STEAM,
+ 1,
+ 32,
+ 1,
+ 1,
+ 1,
+ Materials.Bronze,
+ OrePrefixes.frameGt.get(Materials.Bronze),
+ OrePrefixes.pipeMedium.get(Materials.Bronze),
+ OrePrefixes.pipeHuge.get(Materials.Bronze),
+ OrePrefixes.pipeMedium.get(Materials.Bronze),
+ OrePrefixes.pipeLarge.get(Materials.Bronze)),
+ new Tier(
+ SubTag.ENERGY_STEAM,
+ 2,
+ 128,
+ 1,
+ 1,
+ 1,
+ Materials.Steel,
+ OrePrefixes.frameGt.get(Materials.Steel),
+ OrePrefixes.pipeMedium.get(Materials.Steel),
+ OrePrefixes.pipeHuge.get(Materials.Steel),
+ OrePrefixes.pipeMedium.get(Materials.Steel),
+ OrePrefixes.pipeLarge.get(Materials.Steel)),
+ new Tier(
+ SubTag.ENERGY_STEAM,
+ 3,
+ 512,
+ 1,
+ 1,
+ 1,
+ Materials.Titanium,
+ OrePrefixes.frameGt.get(Materials.Titanium),
+ OrePrefixes.pipeMedium.get(Materials.Titanium),
+ OrePrefixes.pipeHuge.get(Materials.Titanium),
+ OrePrefixes.pipeMedium.get(Materials.Titanium),
+ OrePrefixes.pipeLarge.get(Materials.Titanium)),
+ new Tier(
+ SubTag.ENERGY_STEAM,
+ 4,
+ 2048,
+ 1,
+ 1,
+ 1,
+ Materials.TungstenSteel,
+ OrePrefixes.frameGt.get(Materials.TungstenSteel),
+ OrePrefixes.pipeMedium.get(Materials.TungstenSteel),
+ OrePrefixes.pipeHuge.get(Materials.TungstenSteel),
+ OrePrefixes.pipeMedium.get(Materials.TungstenSteel),
+ OrePrefixes.pipeLarge.get(Materials.TungstenSteel)),
+ new Tier(
+ SubTag.ENERGY_STEAM,
+ 5,
+ 8192,
+ 1,
+ 1,
+ 1,
+ Materials.Iridium,
+ OrePrefixes.frameGt.get(Materials.Iridium),
+ OrePrefixes.pipeMedium.get(Materials.Iridium),
+ OrePrefixes.pipeHuge.get(Materials.Iridium),
+ OrePrefixes.pipeMedium.get(Materials.Iridium),
+ OrePrefixes.pipeLarge.get(Materials.Iridium)),
+ new Tier(
+ SubTag.ENERGY_STEAM,
+ 9,
+ Integer.MAX_VALUE - 7,
+ 1,
+ 1,
+ 1,
+ Materials.Neutronium,
+ OrePrefixes.frameGt.get(Materials.Neutronium),
+ OrePrefixes.pipeMedium.get(Materials.Neutronium),
+ OrePrefixes.pipeHuge.get(Materials.Neutronium),
+ OrePrefixes.pipeMedium.get(Materials.Neutronium),
+ OrePrefixes.pipeLarge.get(Materials.Neutronium)), };
+ /**
+ * Used for Crafting Recipes
+ */
+ public final Object mHullObject, mConductingObject, mLargerConductingObject, mManagingObject, mBetterManagingObject;
+
+ private final SubTag mType;
+ private final byte mRank;
+ private final long mPrimaryValue, mSecondaryValue, mSpeedMultiplier, mEnergyCostMultiplier;
+ private final Materials mMaterial;
+
+ public Tier(SubTag aType, int aRank, long aPrimaryValue, long aSecondaryValue, long aSpeedMultiplier,
+ long aEnergyCostMultiplier, Materials aMaterial, Object aHullObject, Object aConductingObject,
+ Object aLargerConductingObject, Object aManagingObject, Object aBetterManagingObject) {
+ mType = aType;
+ mRank = (byte) aRank;
+ mPrimaryValue = aPrimaryValue;
+ mSecondaryValue = aSecondaryValue;
+ mSpeedMultiplier = aSpeedMultiplier;
+ mEnergyCostMultiplier = Math.max(mSpeedMultiplier, aEnergyCostMultiplier);
+ mMaterial = aMaterial;
+
+ mHullObject = aHullObject;
+ mConductingObject = aConductingObject;
+ mManagingObject = aManagingObject;
+ mBetterManagingObject = aBetterManagingObject;
+ mLargerConductingObject = aLargerConductingObject;
+ }
+
+ public byte getRank() {
+ return mRank;
+ }
+
+ public SubTag getEnergyType() {
+ return mType;
+ }
+
+ public long getEnergyPrimary() {
+ return mPrimaryValue;
+ }
+
+ public long getEnergySecondary() {
+ return mSecondaryValue;
+ }
+
+ public long getSpeedMultiplier() {
+ return mSpeedMultiplier;
+ }
+
+ public long getEnergyCostMultiplier() {
+ return mEnergyCostMultiplier;
+ }
+
+ public Materials getMaterial() {
+ return mMaterial;
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/TierEU.java b/src/main/java/gregtech/api/enums/TierEU.java
new file mode 100644
index 0000000000..26b6393115
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/TierEU.java
@@ -0,0 +1,40 @@
+package gregtech.api.enums;
+
+import static gregtech.api.enums.GT_Values.V;
+
+public class TierEU {
+
+ // Do NOT use these for crafting recipes as they are exactly 1A! Use RECIPE_ULV etc.
+ public static final long ULV = V[GTVoltageIndex.ULV];
+ public static final long LV = V[GTVoltageIndex.LV];
+ public static final long MV = V[GTVoltageIndex.MV];
+ public static final long HV = V[GTVoltageIndex.HV];
+ public static final long EV = V[GTVoltageIndex.EV];
+ public static final long IV = V[GTVoltageIndex.IV];
+ public static final long LuV = V[GTVoltageIndex.LuV];
+ public static final long ZPM = V[GTVoltageIndex.ZPM];
+ public static final long UV = V[GTVoltageIndex.UV];
+ public static final long UHV = V[GTVoltageIndex.UHV];
+ public static final long UEV = V[GTVoltageIndex.UEV];
+ public static final long UIV = V[GTVoltageIndex.UIV];
+ public static final long UMV = V[GTVoltageIndex.UMV];
+ public static final long UXV = V[GTVoltageIndex.UXV];
+ public static final long MAX = V[GTVoltageIndex.MAX];
+
+ // Use me for recipes.
+ public static final long RECIPE_ULV = GT_Values.VP[GTVoltageIndex.ULV];
+ public static final long RECIPE_LV = GT_Values.VP[GTVoltageIndex.LV];
+ public static final long RECIPE_MV = GT_Values.VP[GTVoltageIndex.MV];
+ public static final long RECIPE_HV = GT_Values.VP[GTVoltageIndex.HV];
+ public static final long RECIPE_EV = GT_Values.VP[GTVoltageIndex.EV];
+ public static final long RECIPE_IV = GT_Values.VP[GTVoltageIndex.IV];
+ public static final long RECIPE_LuV = GT_Values.VP[GTVoltageIndex.LuV];
+ public static final long RECIPE_ZPM = GT_Values.VP[GTVoltageIndex.ZPM];
+ public static final long RECIPE_UV = GT_Values.VP[GTVoltageIndex.UV];
+ public static final long RECIPE_UHV = GT_Values.VP[GTVoltageIndex.UHV];
+ public static final long RECIPE_UEV = GT_Values.VP[GTVoltageIndex.UEV];
+ public static final long RECIPE_UIV = GT_Values.VP[GTVoltageIndex.UIV];
+ public static final long RECIPE_UMV = GT_Values.VP[GTVoltageIndex.UMV];
+ public static final long RECIPE_UXV = GT_Values.VP[GTVoltageIndex.UXV];
+ public static final long RECIPE_MAX = GT_Values.VP[GTVoltageIndex.MAX];
+}
diff --git a/src/main/java/gregtech/api/enums/ToolDictNames.java b/src/main/java/gregtech/api/enums/ToolDictNames.java
new file mode 100644
index 0000000000..e4a8ee8444
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/ToolDictNames.java
@@ -0,0 +1,44 @@
+package gregtech.api.enums;
+
+public enum ToolDictNames {
+
+ craftingToolSaw,
+ craftingToolHoe,
+ craftingToolAxe,
+ craftingToolFile,
+ craftingToolPlow,
+ craftingToolDrill,
+ craftingToolSword,
+ craftingToolScoop,
+ craftingToolKnife,
+ craftingToolBlade,
+ craftingToolMortar,
+ craftingToolShovel,
+ craftingToolWrench,
+ craftingToolPlunger,
+ craftingToolCrowbar,
+ craftingToolPickaxe,
+ craftingToolDrawplate,
+ craftingToolRollingPin,
+ craftingToolWireCutter,
+ craftingToolBranchCutter,
+ craftingToolHardHammer,
+ craftingToolSoftHammer,
+ craftingToolJackHammer,
+ craftingToolMiningDrill,
+ craftingToolForgeHammer,
+ craftingToolScrewdriver,
+ craftingToolSolderingIron,
+ craftingToolSolderingMetal;
+
+ public static boolean contains(String aName) {
+ if (!aName.startsWith("craftingTool")) return false;
+ for (ToolDictNames tool : ToolDictNames.values()) {
+ if (tool.toString()
+ .equals(aName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/enums/ToolModes.java b/src/main/java/gregtech/api/enums/ToolModes.java
new file mode 100644
index 0000000000..2f849279a4
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/ToolModes.java
@@ -0,0 +1,18 @@
+package gregtech.api.enums;
+
+public enum ToolModes {
+
+ REGULAR(0),
+ WRENCH_LINE(1);
+
+ private final byte modeValue;
+
+ ToolModes(int modeValue) {
+ this.modeValue = (byte) modeValue;
+ }
+
+ public byte get() {
+ return modeValue;
+ }
+
+}
diff --git a/src/main/java/gregtech/api/enums/VoidingMode.java b/src/main/java/gregtech/api/enums/VoidingMode.java
new file mode 100644
index 0000000000..8ae9dda57d
--- /dev/null
+++ b/src/main/java/gregtech/api/enums/VoidingMode.java
@@ -0,0 +1,112 @@
+package gregtech.api.enums;
+
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+
+public enum VoidingMode {
+
+ /**
+ * Voids nothing, protects both item and fluid
+ */
+ VOID_NONE(true, true, GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_NONE, "none"),
+ /**
+ * Voids item, protects fluid
+ */
+ VOID_ITEM(false, true, GT_UITextures.BUTTON_STANDARD_PRESSED, GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_ITEM,
+ "item"),
+ /**
+ * Voids fluid, protects item
+ */
+ VOID_FLUID(true, false, GT_UITextures.BUTTON_STANDARD_PRESSED, GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_FLUID,
+ "fluid"),
+ /**
+ * Voids all, protects nothing
+ */
+ VOID_ALL(false, false, GT_UITextures.BUTTON_STANDARD_PRESSED, GT_UITextures.OVERLAY_BUTTON_VOID_EXCESS_ALL, "all");
+
+ /**
+ * Default set of voiding mode you will probably support.
+ */
+ public static final Set<VoidingMode> ALL_OPTIONS = EnumSet.allOf(VoidingMode.class);
+ /**
+ * Set of voiding mode you will probably support if your machine has no item output
+ */
+ public static final Set<VoidingMode> FLUID_ONLY_MODES = EnumSet.of(VOID_FLUID, VOID_NONE);
+ /**
+ * Set of voiding mode you will probably support if your machine has no fluid output
+ */
+ public static final Set<VoidingMode> ITEM_ONLY_MODES = EnumSet.of(VOID_ITEM, VOID_NONE);
+ public final boolean protectItem;
+ public final boolean protectFluid;
+ public final UITexture buttonTexture;
+ public final UITexture buttonOverlay;
+ public final String name;
+
+ VoidingMode(boolean protectItem, boolean protectFluid, UITexture buttonTexture, UITexture buttonOverlay,
+ String name) {
+ this.protectItem = protectItem;
+ this.protectFluid = protectFluid;
+ this.buttonTexture = buttonTexture;
+ this.buttonOverlay = buttonOverlay;
+ this.name = name;
+ }
+
+ public String getTransKey() {
+ return "GT5U.gui.button.voiding_mode_" + name;
+ }
+
+ public VoidingMode next() {
+ return values()[(ordinal() + 1) % values().length];
+ }
+
+ public VoidingMode previous() {
+ return values()[(ordinal() + values().length - 1) % values().length];
+ }
+
+ public VoidingMode nextInCollection(Collection<VoidingMode> allowed) {
+ if (allowed.isEmpty()) throw new IllegalArgumentException("nothing allowed");
+ VoidingMode ret = this;
+ do {
+ ret = ret.next();
+ } while (!allowed.contains(ret));
+ return ret;
+ }
+
+ public VoidingMode previousInCollection(Collection<VoidingMode> allowed) {
+ if (allowed.isEmpty()) throw new IllegalArgumentException("nothing allowed");
+ VoidingMode ret = this;
+ do {
+ ret = ret.previous();
+ } while (!allowed.contains(ret));
+ return ret;
+ }
+
+ /**
+ * Do not use this for loading mode from TEs, to prevent mode being shifted when new mode is added.
+ */
+ @Nonnull
+ public static VoidingMode fromOrdinal(int ordinal) {
+ if (ordinal >= 0 && ordinal < values().length) {
+ return values()[ordinal];
+ }
+ return VOID_NONE;
+ }
+
+ @Nonnull
+ public static VoidingMode fromName(String name) {
+ for (VoidingMode mode : values()) {
+ if (mode.name.equals(name)) {
+ return mode;
+ }
+ }
+ return VOID_NONE;
+ }
+
+}
diff --git a/src/main/java/gregtech/api/events/BlockScanningEvent.java b/src/main/java/gregtech/api/events/BlockScanningEvent.java
new file mode 100644
index 0000000000..bc2a33bcea
--- /dev/null
+++ b/src/main/java/gregtech/api/events/BlockScanningEvent.java
@@ -0,0 +1,47 @@
+package gregtech.api.events;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.event.world.WorldEvent;
+
+import cpw.mods.fml.common.eventhandler.Cancelable;
+
+@Cancelable
+public class BlockScanningEvent extends WorldEvent {
+
+ public final EntityPlayer mPlayer;
+ public final int mX, mY, mZ, mScanLevel;
+ public final ArrayList<String> mList;
+ public final ForgeDirection mSide;
+ public final float mClickX, mClickY, mClickZ;
+ public final TileEntity mTileEntity;
+ public final Block mBlock;
+
+ /**
+ * used to determine the amount of Energy this Scan is costing.
+ */
+ public int mEUCost = 0;
+
+ public BlockScanningEvent(World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ, ForgeDirection side,
+ int aScanLevel, Block aBlock, TileEntity aTileEntity, ArrayList<String> aList, float aClickX, float aClickY,
+ float aClickZ) {
+ super(aWorld);
+ mPlayer = aPlayer;
+ mScanLevel = aScanLevel;
+ mTileEntity = aTileEntity;
+ mBlock = aBlock;
+ mList = aList;
+ mSide = side;
+ mX = aX;
+ mY = aY;
+ mZ = aZ;
+ mClickX = aClickX;
+ mClickY = aClickY;
+ mClickZ = aClickZ;
+ }
+}
diff --git a/src/main/java/gregtech/api/fluid/FluidTankGT.java b/src/main/java/gregtech/api/fluid/FluidTankGT.java
new file mode 100644
index 0000000000..0c224985e6
--- /dev/null
+++ b/src/main/java/gregtech/api/fluid/FluidTankGT.java
@@ -0,0 +1,485 @@
+package gregtech.api.fluid;
+
+import static com.google.common.primitives.Ints.saturatedCast;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidTank;
+
+import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.util.GT_Utility;
+
+public class FluidTankGT implements IFluidTank, IFluidStore {
+
+ public final FluidTankGT[] AS_ARRAY = new FluidTankGT[] { this };
+ private FluidStack mFluid;
+ private long mCapacity = 0, mAmount = 0;
+ private boolean mPreventDraining = false, mVoidExcess = false, mChangedFluids = false;
+ /** HashMap of adjustable Tank Sizes based on Fluids if needed. */
+ private Map<String, Long> mAdjustableCapacity = null;
+
+ private long mAdjustableMultiplier = 1;
+ /** Gives you a Tank Index in case there is multiple Tanks on a TileEntity that cares. */
+ public int mIndex = 0;
+
+ public FluidTankGT() {
+ mCapacity = Long.MAX_VALUE;
+ }
+
+ public FluidTankGT(long aCapacity) {
+ mCapacity = aCapacity;
+ }
+
+ public FluidTankGT(FluidStack aFluid) {
+ mFluid = aFluid;
+ if (aFluid != null) {
+ mCapacity = aFluid.amount;
+ mAmount = aFluid.amount;
+ }
+ }
+
+ public FluidTankGT(FluidStack aFluid, long aCapacity) {
+ mFluid = aFluid;
+ mCapacity = aCapacity;
+ mAmount = (aFluid == null ? 0 : aFluid.amount);
+ }
+
+ public FluidTankGT(FluidStack aFluid, long aAmount, long aCapacity) {
+ mFluid = aFluid;
+ mCapacity = aCapacity;
+ mAmount = (aFluid == null ? 0 : aAmount);
+ }
+
+ public FluidTankGT(Fluid aFluid, long aAmount) {
+ this(new FluidStack(aFluid, saturatedCast(aAmount)));
+ mAmount = aAmount;
+ }
+
+ public FluidTankGT(Fluid aFluid, long aAmount, long aCapacity) {
+ this(new FluidStack(aFluid, saturatedCast(aAmount)), aCapacity);
+ mAmount = aAmount;
+ }
+
+ public FluidTankGT(NBTTagCompound aNBT, String aKey, long aCapacity) {
+ this(aNBT.hasKey(aKey) ? aNBT.getCompoundTag(aKey) : null, aCapacity);
+ }
+
+ public FluidTankGT(NBTTagCompound aNBT, long aCapacity) {
+ mCapacity = aCapacity;
+ if (aNBT != null && !aNBT.hasNoTags()) {
+ mFluid = FluidStack.loadFluidStackFromNBT(aNBT);
+ mAmount = (isEmpty() ? 0 : aNBT.hasKey("LAmount") ? aNBT.getLong("LAmount") : mFluid.amount);
+ }
+ }
+
+ public FluidTankGT readFromNBT(NBTTagCompound aNBT, String aKey) {
+ if (aNBT.hasKey(aKey)) {
+ aNBT = aNBT.getCompoundTag(aKey);
+ if (aNBT != null && !aNBT.hasNoTags()) {
+ mFluid = FluidStack.loadFluidStackFromNBT(aNBT);
+ mAmount = (isEmpty() ? 0 : aNBT.hasKey("LAmount") ? aNBT.getLong("LAmount") : mFluid.amount);
+ }
+ }
+ return this;
+ }
+
+ public NBTTagCompound writeToNBT(NBTTagCompound aNBT, String aKey) {
+ if (mFluid != null && (mPreventDraining || mAmount > 0)) {
+ final NBTTagCompound tNBT = new NBTTagCompound();
+ mFluid.amount = (int) mAmount;
+ aNBT.setTag(aKey, mFluid.writeToNBT(tNBT));
+ if (mAmount > Integer.MAX_VALUE) tNBT.setLong("LAmount", mAmount);
+ } else {
+ aNBT.removeTag(aKey);
+ }
+ return aNBT;
+ }
+
+ public FluidStack drain(int aDrained) {
+ return drain(aDrained, true);
+ }
+
+ @Override
+ public FluidStack drain(int aDrained, boolean aDoDrain) {
+ if (isEmpty() || aDrained <= 0) return null;
+ if (mAmount < aDrained) aDrained = (int) mAmount;
+ final FluidStack rFluid = new FluidStack(mFluid, aDrained);
+ if (aDoDrain) {
+ mAmount -= aDrained;
+ if (mAmount <= 0) {
+ if (mPreventDraining) {
+ mAmount = 0;
+ } else {
+ setEmpty();
+ }
+ }
+ }
+ return rFluid;
+ }
+
+ public boolean drainAll(long aDrained) {
+ if (isEmpty() || mAmount < aDrained) return false;
+ mAmount -= aDrained;
+ if (mAmount <= 0) {
+ if (mPreventDraining) {
+ mAmount = 0;
+ } else {
+ setEmpty();
+ }
+ }
+ return true;
+ }
+
+ public long remove(long aDrained) {
+ if (isEmpty() || mAmount <= 0 || aDrained <= 0) return 0;
+ if (mAmount < aDrained) aDrained = mAmount;
+ mAmount -= aDrained;
+ if (mAmount <= 0) {
+ if (mPreventDraining) {
+ mAmount = 0;
+ } else {
+ setEmpty();
+ }
+ }
+ return aDrained;
+ }
+
+ public long add(long aFilled) {
+ if (isEmpty() || aFilled <= 0) return 0;
+ final long tCapacity = capacity();
+ if (mAmount + aFilled > tCapacity) {
+ if (!mVoidExcess) aFilled = tCapacity - mAmount;
+ mAmount = tCapacity;
+ return aFilled;
+ }
+ mAmount += aFilled;
+ return aFilled;
+ }
+
+ public long add(long aFilled, FluidStack aFluid) {
+ if (aFluid == null || aFilled <= 0) return 0;
+ if (isEmpty()) {
+ mFluid = aFluid.copy();
+ mChangedFluids = true;
+ mAmount = Math.min(capacity(aFluid), aFilled);
+ return mVoidExcess ? aFilled : mAmount;
+ }
+ return contains(aFluid) ? add(aFilled) : 0;
+ }
+
+ public int fill(FluidStack aFluid) {
+ return fill(aFluid, true);
+ }
+
+ @Override
+ public int fill(FluidStack aFluid, boolean aDoFill) {
+ if (aFluid == null) return 0;
+ if (aDoFill) {
+ if (isEmpty()) {
+ mFluid = aFluid.copy();
+ mChangedFluids = true;
+ mAmount = Math.min(capacity(aFluid), aFluid.amount);
+ return mVoidExcess ? aFluid.amount : (int) mAmount;
+ }
+ if (!contains(aFluid)) return 0;
+ final long tCapacity = capacity(aFluid);
+ long tFilled = tCapacity - mAmount;
+ if (aFluid.amount < tFilled) {
+ mAmount += aFluid.amount;
+ tFilled = aFluid.amount;
+ } else mAmount = tCapacity;
+ return mVoidExcess ? aFluid.amount : (int) tFilled;
+ }
+ return saturatedCast(
+ isEmpty() ? mVoidExcess ? aFluid.amount : Math.min(capacity(aFluid), aFluid.amount)
+ : contains(aFluid) ? mVoidExcess ? aFluid.amount : Math.min(capacity(aFluid) - mAmount, aFluid.amount)
+ : 0);
+ }
+
+ public boolean canFillAll(FluidStack aFluid) {
+ return aFluid == null || aFluid.amount <= 0
+ || (isEmpty() ? mVoidExcess || aFluid.amount <= capacity(aFluid)
+ : contains(aFluid) && (mVoidExcess || mAmount + aFluid.amount <= capacity(aFluid)));
+ }
+
+ public boolean canFillAll(long aAmount) {
+ return aAmount <= 0 || mVoidExcess || mAmount + aAmount <= capacity();
+ }
+
+ public boolean fillAll(FluidStack aFluid) {
+ if (aFluid == null || aFluid.amount <= 0) return true;
+ if (isEmpty()) {
+ final long tCapacity = capacity(aFluid);
+ if (aFluid.amount <= tCapacity || mVoidExcess) {
+ mFluid = aFluid.copy();
+ mChangedFluids = true;
+ mAmount = aFluid.amount;
+ if (mAmount > tCapacity) mAmount = tCapacity;
+ return true;
+ }
+ return false;
+ }
+ if (contains(aFluid)) {
+ if (mAmount + aFluid.amount <= capacity()) {
+ mAmount += aFluid.amount;
+ return true;
+ }
+ if (mVoidExcess) {
+ mAmount = capacity();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean fillAll(FluidStack aFluid, long aMultiplier) {
+ if (aMultiplier <= 0) return true;
+ if (aMultiplier == 1) return fillAll(aFluid);
+ if (aFluid == null || aFluid.amount <= 0) return true;
+ if (isEmpty()) {
+ final long tCapacity = capacity(aFluid);
+ if (aFluid.amount * aMultiplier <= tCapacity || mVoidExcess) {
+ mFluid = aFluid.copy();
+ mChangedFluids = true;
+ mAmount = aFluid.amount * aMultiplier;
+ if (mAmount > tCapacity) mAmount = tCapacity;
+ return true;
+ }
+ return false;
+ }
+ if (contains(aFluid)) {
+ if (mAmount + aFluid.amount * aMultiplier <= capacity()) {
+ mAmount += aFluid.amount * aMultiplier;
+ return true;
+ }
+ if (mVoidExcess) {
+ mAmount = capacity();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /** Resets Tank Contents entirely */
+ public FluidTankGT setEmpty() {
+ mFluid = null;
+ mChangedFluids = true;
+ mAmount = 0;
+ return this;
+ }
+
+ /** Sets Fluid Content, taking Amount from the Fluid Parameter */
+ public FluidTankGT setFluid(FluidStack aFluid) {
+ mFluid = aFluid;
+ mChangedFluids = true;
+ mAmount = (aFluid == null ? 0 : aFluid.amount);
+ return this;
+ }
+
+ /** Sets Fluid Content and Amount */
+ public FluidTankGT setFluid(FluidStack aFluid, long aAmount) {
+ mFluid = aFluid;
+ mChangedFluids = true;
+ mAmount = (aFluid == null ? 0 : aAmount);
+ return this;
+ }
+
+ /** Sets Fluid Content, taking Amount from the Tank Parameter */
+ public FluidTankGT setFluid(FluidTankGT aTank) {
+ mFluid = new FluidStack(aTank.mFluid, saturatedCast(aTank.mAmount));
+ mChangedFluids = true;
+ mAmount = aTank.mAmount;
+ return this;
+ }
+
+ /** Sets the Tank Index for easier Reverse Mapping. */
+ public FluidTankGT setIndex(int aIndex) {
+ mIndex = aIndex;
+ return this;
+ }
+
+ /** Sets the Capacity */
+ public FluidTankGT setCapacity(long aCapacity) {
+ if (aCapacity >= 0) mCapacity = aCapacity;
+ return this;
+ }
+
+ /** Sets the Capacity Multiplier */
+ public FluidTankGT setCapacityMultiplier(long aCapacityMultiplier) {
+ if (aCapacityMultiplier >= 0) mAdjustableMultiplier = aCapacityMultiplier;
+ return this;
+ }
+
+ /** Sets Tank capacity Map, should it be needed. */
+ public FluidTankGT setCapacity(Map<String, Long> aMap, long aCapacityMultiplier) {
+ mAdjustableCapacity = aMap;
+ mAdjustableMultiplier = aCapacityMultiplier;
+ return this;
+ }
+
+ /** Always keeps at least 0 Liters of Fluid instead of setting it to null */
+ public FluidTankGT setPreventDraining() {
+ return setPreventDraining(true);
+ }
+
+ /** Always keeps at least 0 Liters of Fluid instead of setting it to null */
+ public FluidTankGT setPreventDraining(boolean aPrevent) {
+ mPreventDraining = aPrevent;
+ return this;
+ }
+
+ /** Voids any Overlow */
+ public FluidTankGT setVoidExcess() {
+ return setVoidExcess(true);
+ }
+
+ /** Voids any Overlow */
+ public FluidTankGT setVoidExcess(boolean aVoidExcess) {
+ mVoidExcess = aVoidExcess;
+ return this;
+ }
+
+ public boolean isFull() {
+ return mFluid != null && mAmount >= capacity();
+ }
+
+ public long capacity() {
+ return capacity(mFluid);
+ }
+
+ public long capacity(FluidStack aFluid) {
+ if (mAdjustableCapacity == null || aFluid == null) return mCapacity;
+ return capacity(aFluid.getFluid());
+ }
+
+ public long capacity(Fluid aFluid) {
+ if (mAdjustableCapacity == null || aFluid == null) return mCapacity;
+ return capacity(aFluid.getName());
+ }
+
+ public long capacity(String aFluid) {
+ if (mAdjustableCapacity == null || aFluid == null) return mCapacity;
+
+ final Long tSize = mAdjustableCapacity.get(aFluid);
+ return tSize == null ? Math.max(mAmount, mCapacity)
+ : Math.max(tSize * mAdjustableMultiplier, Math.max(mAmount, mCapacity));
+ }
+
+ public boolean isHalf() {
+ return mFluid != null && mAmount * 2 >= capacity();
+ }
+
+ public boolean contains(Fluid aFluid) {
+ return mFluid != null && mFluid.getFluid() == aFluid;
+ }
+
+ public boolean contains(FluidStack aFluid) {
+ return GT_Utility.areFluidsEqual(mFluid, aFluid);
+ }
+
+ public boolean has(long aAmount) {
+ return mAmount >= aAmount;
+ }
+
+ public boolean has() {
+ return mAmount > 0;
+ }
+
+ public boolean check() {
+ if (mChangedFluids) {
+ mChangedFluids = false;
+ return true;
+ }
+ return false;
+ }
+
+ public boolean update() {
+ return mChangedFluids = true;
+ }
+
+ public boolean changed() {
+ return mChangedFluids;
+ }
+
+ public long amount() {
+ return isEmpty() ? 0 : mAmount;
+ }
+
+ public boolean isEmpty() {
+ return mFluid == null;
+ }
+
+ public long amount(long aMax) {
+ return isEmpty() || aMax <= 0 ? 0 : Math.min(mAmount, aMax);
+ }
+
+ public String name() {
+ return mFluid == null ? null
+ : mFluid.getFluid()
+ .getName();
+ }
+
+ public FluidStack get() {
+ return mFluid;
+ }
+
+ public FluidStack get(long aMax) {
+ return isEmpty() || aMax <= 0 ? null : new FluidStack(mFluid, saturatedCast(Math.min(mAmount, aMax)));
+ }
+
+ @Override
+ public FluidStack getFluid() {
+ if (mFluid != null) mFluid.amount = saturatedCast(mAmount);
+ return mFluid;
+ }
+
+ @Override
+ public int getFluidAmount() {
+ return saturatedCast(mAmount);
+ }
+
+ @Override
+ public int getCapacity() {
+ return saturatedCast(capacity());
+ }
+
+ public long getCapacityMultiplier() {
+ return mAdjustableMultiplier;
+ }
+
+ @Override
+ public FluidTankInfo getInfo() {
+ return new FluidTankInfo(isEmpty() ? null : mFluid.copy(), saturatedCast(capacity()));
+ }
+
+ public static FluidStack[] getFluidsFromTanks(FluidTankGT[] tanks) {
+ if (tanks == null) {
+ return null;
+ }
+ List<FluidStack> fluidStacks = new ArrayList<>();
+ for (FluidTankGT tank : tanks) {
+ if (tank.getFluid() != null) {
+ fluidStacks.add(tank.getFluid());
+ }
+ }
+ return fluidStacks.toArray(new FluidStack[0]);
+ }
+
+ @Override
+ public boolean isEmptyAndAcceptsAnyFluid() {
+ return getFluidAmount() == 0;
+ }
+
+ @Override
+ public boolean canStoreFluid(@Nonnull FluidStack fluidStack) {
+ return GT_Utility.areFluidsEqual(mFluid, fluidStack);
+ }
+}
diff --git a/src/main/java/gregtech/api/fluid/GT_FluidFactory.java b/src/main/java/gregtech/api/fluid/GT_FluidFactory.java
new file mode 100644
index 0000000000..7c65956c69
--- /dev/null
+++ b/src/main/java/gregtech/api/fluid/GT_FluidFactory.java
@@ -0,0 +1,90 @@
+package gregtech.api.fluid;
+
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gregtech.api.enums.FluidState;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.fluid.IGT_Fluid;
+import gregtech.api.interfaces.fluid.IGT_FluidBuilder;
+import gregtech.common.fluid.GT_FluidBuilder;
+
+/**
+ * <p>
+ * This class contains helpers factory methods to:
+ * </p>
+ * <ol>
+ * <li>
+ * <p>
+ * Build {@link IGT_Fluid} instances.
+ * </p>
+ * </li>
+ * <li>
+ * <p>
+ * Register the corresponding {@link Fluid}, built from an {@link IGT_Fluid}, to the {@link FluidRegistry}:
+ * </p>
+ * <ul>
+ * <li>
+ * <p>
+ * Register the optionally associated containers to the {@link FluidContainerRegistry}.
+ * </p>
+ * </li>
+ * <li>
+ * <p>
+ * Add the needed Fluid Canner recipes.
+ * </p>
+ * </li>
+ * </ul>
+ * </li>
+ * </ol>
+ */
+@SuppressWarnings("unused") // API might legitimately expose unused methods within this local project's scope
+public class GT_FluidFactory {
+
+ /**
+ * Helper for quick fluid creation and registration
+ *
+ * @param fluidName The name key of the {@link Fluid} to register in the {@link FluidRegistry}
+ * @param localizedName The localized name of this {@link IGT_Fluid}
+ * @param material The {@link Materials} of this {@link IGT_Fluid}
+ * @param state The {@link FluidState} of this {@link IGT_Fluid}
+ * @param temperature The fluid temperature in Kelvin
+ * @return the registered {@link Fluid}
+ */
+ public static Fluid of(final String fluidName, final String localizedName, final Materials material,
+ final FluidState state, final int temperature) {
+ return builder(fluidName).withLocalizedName(localizedName)
+ .withStateAndTemperature(state, temperature)
+ .buildAndRegister()
+ .configureMaterials(material)
+ .asFluid();
+ }
+
+ /**
+ * Helper for quick fluid creation and registration
+ *
+ * @param fluidName The name key of the {@link Fluid} to register in the {@link FluidRegistry}
+ * @param localizedName The localized name of this {@link IGT_Fluid}
+ * @param state The {@link FluidState} of this {@link IGT_Fluid}
+ * @param temperature The fluid temperature in Kelvin
+ * @return the registered {@link Fluid}
+ */
+ public static Fluid of(final String fluidName, final String localizedName, final FluidState state,
+ final int temperature) {
+ return builder(fluidName).withLocalizedName(localizedName)
+ .withStateAndTemperature(state, temperature)
+ .buildAndRegister()
+ .asFluid();
+ }
+
+ /**
+ * Gets an {@link IGT_Fluid} builder instance
+ *
+ * @param fluidName The name key of the {@link Fluid} to register in the {@link FluidRegistry}
+ * @return the {@link IGT_FluidBuilder} instance
+ */
+ public static IGT_FluidBuilder builder(final String fluidName) {
+ return new GT_FluidBuilder(fluidName);
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/GenerateNodeMap.java b/src/main/java/gregtech/api/graphs/GenerateNodeMap.java
new file mode 100644
index 0000000000..7289f0faad
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/GenerateNodeMap.java
@@ -0,0 +1,202 @@
+package gregtech.api.graphs;
+
+import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.graphs.consumers.ConsumerNode;
+import gregtech.api.graphs.paths.NodePath;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+
+// generates the node map
+public abstract class GenerateNodeMap {
+
+ // clearing the node map to make sure it is gone on reset
+ public static void clearNodeMap(Node aNode, int aReturnNodeValue) {
+ if (aNode.mTileEntity instanceof BaseMetaPipeEntity tPipe) {
+ tPipe.setNode(null);
+ tPipe.setNodePath(null);
+ if (aNode.mSelfPath != null) {
+ aNode.mSelfPath.clearPath();
+ aNode.mSelfPath = null;
+ }
+ }
+ for (byte side : ALL_VALID_SIDES) {
+ final NodePath tPath = aNode.mNodePaths[side];
+ if (tPath != null) {
+ tPath.clearPath();
+ aNode.mNodePaths[side] = null;
+ }
+ final Node tNextNode = aNode.mNeighbourNodes[side];
+ if (tNextNode == null) continue;
+ if (tNextNode.mNodeValue != aReturnNodeValue) clearNodeMap(tNextNode, aNode.mNodeValue);
+ aNode.mNeighbourNodes[side] = null;
+ }
+ }
+
+ // get how many connections the pipe have
+ private static int getNumberOfConnections(MetaPipeEntity aPipe) {
+ int tCons = 0;
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (aPipe.isConnectedAtSide(side)) tCons++;
+ }
+ return tCons;
+ }
+
+ // gets the next node
+ protected void generateNextNode(BaseMetaPipeEntity aPipe, Node aPipeNode, ForgeDirection aInvalidSide,
+ int aNextNodeValue, ArrayList<ConsumerNode> tConsumers, HashSet<Node> tNodeMap) {
+ final MetaPipeEntity tMetaPipe = (MetaPipeEntity) aPipe.getMetaTileEntity();
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (side == aInvalidSide) {
+ continue;
+ }
+ final TileEntity tNextTileEntity = aPipe.getTileEntityAtSide(side);
+ if (tNextTileEntity == null || (tMetaPipe != null && !tMetaPipe.isConnectedAtSide(side))) continue;
+ final ArrayList<MetaPipeEntity> tNewPipes = new ArrayList<>();
+ final Pair nextTileEntity = getNextValidTileEntity(tNextTileEntity, tNewPipes, side, tNodeMap);
+ if (nextTileEntity != null) {
+ final Node tNextNode = generateNode(
+ nextTileEntity.mTileEntity,
+ aPipeNode,
+ aNextNodeValue + 1,
+ tNewPipes,
+ nextTileEntity.mSide,
+ tConsumers,
+ tNodeMap);
+ if (tNextNode != null) {
+ final int i = side.ordinal();
+ aNextNodeValue = tNextNode.mHighestNodeValue;
+ aPipeNode.mHighestNodeValue = tNextNode.mHighestNodeValue;
+ aPipeNode.mNeighbourNodes[i] = tNextNode;
+ aPipeNode.mNodePaths[i] = aPipeNode.returnValues.mReturnPath;
+ aPipeNode.locks[i] = aPipeNode.returnValues.returnLock;
+ aPipeNode.mNodePaths[i].reloadLocks();
+ }
+ }
+ }
+ aPipe.reloadLocks();
+ }
+
+ // on a valid tile entity create a new node
+ protected Node generateNode(TileEntity aTileEntity, Node aPreviousNode, int aNextNodeValue,
+ ArrayList<MetaPipeEntity> aPipes, ForgeDirection side, ArrayList<ConsumerNode> aConsumers,
+ HashSet<Node> aNodeMap) {
+ if (aTileEntity.isInvalid()) return null;
+ final ForgeDirection oppositeSide = side.getOpposite();
+ final ForgeDirection tInvalidSide = aPreviousNode == null ? ForgeDirection.UNKNOWN : oppositeSide;
+ Node tThisNode = null;
+ if (isPipe(aTileEntity)) {
+ final BaseMetaPipeEntity tPipe = (BaseMetaPipeEntity) aTileEntity;
+ final MetaPipeEntity tMetaPipe = (MetaPipeEntity) tPipe.getMetaTileEntity();
+ final int tConnections = getNumberOfConnections(tMetaPipe);
+ final Node tPipeNode;
+ if (tConnections == 1) {
+ tPipeNode = getEmptyNode(aNextNodeValue, oppositeSide, aTileEntity, aConsumers);
+ if (tPipeNode == null) return null;
+ } else {
+ tPipeNode = getPipeNode(aNextNodeValue, oppositeSide, aTileEntity, aConsumers);
+ }
+ tPipe.setNode(tPipeNode);
+ aNodeMap.add(tPipeNode);
+ tPipeNode.mSelfPath = getNewPath(new MetaPipeEntity[] { tMetaPipe });
+ tThisNode = tPipeNode;
+ if (tInvalidSide != ForgeDirection.UNKNOWN) {
+ final int iInvalid = tInvalidSide.ordinal();
+ tPipeNode.mNeighbourNodes[iInvalid] = aPreviousNode;
+ tPipeNode.mNodePaths[iInvalid] = getNewPath(aPipes.toArray(new MetaPipeEntity[0]));
+ final Lock lock = new Lock();
+ tPipeNode.mNodePaths[oppositeSide.ordinal()].lock = lock;
+ tPipeNode.locks[iInvalid] = lock;
+ aPreviousNode.returnValues.mReturnPath = tPipeNode.mNodePaths[iInvalid];
+ aPreviousNode.returnValues.returnLock = lock;
+ }
+ if (tConnections > 1)
+ generateNextNode(tPipe, tPipeNode, tInvalidSide, aNextNodeValue, aConsumers, aNodeMap);
+ } else if (addConsumer(aTileEntity, oppositeSide, aNextNodeValue, aConsumers)) {
+ final int oppositeSideOrdinal = oppositeSide.ordinal();
+ final ConsumerNode tConsumeNode = aConsumers.get(aConsumers.size() - 1);
+ tConsumeNode.mNeighbourNodes[oppositeSideOrdinal] = aPreviousNode;
+ tConsumeNode.mNodePaths[oppositeSideOrdinal] = getNewPath(aPipes.toArray(new MetaPipeEntity[0]));
+ final Lock lock = new Lock();
+ tConsumeNode.mNodePaths[oppositeSideOrdinal].lock = lock;
+ aPreviousNode.returnValues.mReturnPath = tConsumeNode.mNodePaths[oppositeSideOrdinal];
+ aPreviousNode.returnValues.returnLock = lock;
+ tThisNode = tConsumeNode;
+ }
+ return tThisNode;
+ }
+
+ // go over the pipes until we see a valid tile entity that needs a node
+ protected Pair getNextValidTileEntity(TileEntity aTileEntity, ArrayList<MetaPipeEntity> aPipes, ForgeDirection side,
+ HashSet<Node> aNodeMap) {
+ if (isPipe(aTileEntity)) {
+ final BaseMetaPipeEntity tPipe = (BaseMetaPipeEntity) aTileEntity;
+ final MetaPipeEntity tMetaPipe = (MetaPipeEntity) tPipe.getMetaTileEntity();
+ final Node tNode = tPipe.getNode();
+ if (tNode != null) {
+ if (aNodeMap.contains(tNode)) return null;
+ }
+ final int tConnections = getNumberOfConnections(tMetaPipe);
+ if (tConnections == 2) {
+ final ForgeDirection tSideOp = side.getOpposite();
+ for (final ForgeDirection s : ForgeDirection.VALID_DIRECTIONS) {
+ if (s == tSideOp || !(tMetaPipe.isConnectedAtSide(s))) continue;
+ final TileEntity tNewTileEntity = tPipe.getTileEntityAtSide(s);
+ if (tNewTileEntity == null) continue;
+ if (isPipe(tNewTileEntity)) {
+ aPipes.add(tMetaPipe);
+ return getNextValidTileEntity(tNewTileEntity, aPipes, s, aNodeMap);
+ } else {
+ return new Pair(aTileEntity, s);
+ }
+ }
+ } else {
+ return new Pair(aTileEntity, side);
+ }
+ } else {
+ return new Pair(aTileEntity, side);
+ }
+ return null;
+ }
+
+ // check if the tile entity is the correct pipe
+ protected boolean isPipe(TileEntity aTileEntity) {
+ return aTileEntity instanceof BaseMetaPipeEntity;
+ }
+
+ // checks if the tile entity is a consumer and add to the list
+ protected abstract boolean addConsumer(TileEntity aTileEntity, ForgeDirection side, int aNodeValue,
+ ArrayList<ConsumerNode> aConsumers);
+
+ // get correct pathClass that you need for your node network
+ protected abstract NodePath getNewPath(MetaPipeEntity[] aPipes);
+
+ // used for if you need to use dead ends for something can be null
+ protected Node getEmptyNode(int aNodeValue, ForgeDirection side, TileEntity aTileEntity,
+ ArrayList<ConsumerNode> aConsumers) {
+ return null;
+ }
+
+ // get correct node type you need for your network
+ protected Node getPipeNode(int aNodeValue, ForgeDirection side, TileEntity aTileEntity,
+ ArrayList<ConsumerNode> aConsumers) {
+ return new Node(aNodeValue, aTileEntity, aConsumers);
+ }
+
+ private static class Pair {
+
+ public ForgeDirection mSide;
+ public TileEntity mTileEntity;
+
+ public Pair(TileEntity aTileEntity, ForgeDirection side) {
+ this.mTileEntity = aTileEntity;
+ this.mSide = side;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/GenerateNodeMapPower.java b/src/main/java/gregtech/api/graphs/GenerateNodeMapPower.java
new file mode 100644
index 0000000000..95f9aee32d
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/GenerateNodeMapPower.java
@@ -0,0 +1,104 @@
+package gregtech.api.graphs;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cofh.api.energy.IEnergyReceiver;
+import gregtech.api.GregTech_API;
+import gregtech.api.graphs.consumers.ConsumerNode;
+import gregtech.api.graphs.consumers.EmptyPowerConsumer;
+import gregtech.api.graphs.consumers.NodeEnergyConnected;
+import gregtech.api.graphs.consumers.NodeEnergyReceiver;
+import gregtech.api.graphs.consumers.NodeEnergySink;
+import gregtech.api.graphs.consumers.NodeGTBaseMetaTile;
+import gregtech.api.graphs.paths.NodePath;
+import gregtech.api.graphs.paths.PowerNodePath;
+import gregtech.api.interfaces.tileentity.IEnergyConnected;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable;
+import ic2.api.energy.tile.IEnergySink;
+
+// node map generator for power distribution
+public class GenerateNodeMapPower extends GenerateNodeMap {
+
+ public GenerateNodeMapPower(BaseMetaPipeEntity aTileEntity) {
+ generateNode(aTileEntity, null, 1, null, ForgeDirection.UNKNOWN, new ArrayList<>(), new HashSet<>());
+ }
+
+ @Override
+ protected boolean isPipe(TileEntity aTileEntity) {
+ return super.isPipe(aTileEntity)
+ && ((BaseMetaPipeEntity) aTileEntity).getMetaTileEntity() instanceof GT_MetaPipeEntity_Cable;
+ }
+
+ @Override
+ protected boolean addConsumer(TileEntity aTileEntity, ForgeDirection side, int aNodeValue,
+ ArrayList<ConsumerNode> aConsumers) {
+ if (aTileEntity instanceof BaseMetaTileEntity tBaseTileEntity) {
+ if (tBaseTileEntity.inputEnergyFrom(side, false)) {
+ ConsumerNode tConsumerNode = new NodeGTBaseMetaTile(aNodeValue, tBaseTileEntity, side, aConsumers);
+ aConsumers.add(tConsumerNode);
+ return true;
+ }
+
+ } else if (aTileEntity instanceof IEnergyConnected tTileEntity) {
+ if (tTileEntity.inputEnergyFrom(side, false)) {
+ ConsumerNode tConsumerNode = new NodeEnergyConnected(aNodeValue, tTileEntity, side, aConsumers);
+ aConsumers.add(tConsumerNode);
+ return true;
+ }
+ } else if (aTileEntity instanceof IEnergySink sink) {
+ // ic2 wants the tilentity next to it of that side not going to add a bunch of arguments just for ic2
+ // crossborder checks to not load chuncks just to make sure
+ int dX = aTileEntity.xCoord + side.offsetX;
+ int dY = aTileEntity.yCoord + side.offsetY;
+ int dZ = aTileEntity.zCoord + side.offsetZ;
+ boolean crossesChuncks = dX >> 4 != aTileEntity.xCoord >> 4 || dZ >> 4 != aTileEntity.zCoord >> 4;
+ TileEntity tNextTo = null;
+ if (!crossesChuncks || !aTileEntity.getWorldObj()
+ .blockExists(dX, dY, dZ))
+ tNextTo = aTileEntity.getWorldObj()
+ .getTileEntity(dX, dY, dZ);
+
+ if (sink.acceptsEnergyFrom(tNextTo, side)) {
+ ConsumerNode tConsumerNode = new NodeEnergySink(
+ aNodeValue,
+ (IEnergySink) aTileEntity,
+ side,
+ aConsumers);
+ aConsumers.add(tConsumerNode);
+ return true;
+ }
+ } else if (GregTech_API.mOutputRF && aTileEntity instanceof IEnergyReceiver receiver) {
+ ConsumerNode tConsumerNode = new NodeEnergyReceiver(aNodeValue, receiver, side, aConsumers);
+ aConsumers.add(tConsumerNode);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected NodePath getNewPath(MetaPipeEntity[] aPipes) {
+ return new PowerNodePath(aPipes);
+ }
+
+ // used to apply voltage on dead ends
+ @Override
+ protected Node getEmptyNode(int aNodeValue, ForgeDirection side, TileEntity aTileEntity,
+ ArrayList<ConsumerNode> aConsumers) {
+ ConsumerNode tNode = new EmptyPowerConsumer(aNodeValue, aTileEntity, side, aConsumers);
+ aConsumers.add(tNode);
+ return tNode;
+ }
+
+ @Override
+ protected Node getPipeNode(int aNodeValue, ForgeDirection side, TileEntity aTileEntity,
+ ArrayList<ConsumerNode> aConsumers) {
+ return new PowerNode(aNodeValue, aTileEntity, aConsumers);
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/Lock.java b/src/main/java/gregtech/api/graphs/Lock.java
new file mode 100644
index 0000000000..d3c8c49169
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/Lock.java
@@ -0,0 +1,38 @@
+package gregtech.api.graphs;
+
+import java.util.ArrayList;
+
+import net.minecraft.tileentity.TileEntity;
+
+public class Lock {
+
+ protected ArrayList<TileEntity> tiles = new ArrayList<>();
+
+ public void addTileEntity(TileEntity tileEntity) {
+ int i = contains(tileEntity);
+ if (i == -1) {
+ tiles.add(tileEntity);
+ }
+ }
+
+ public void removeTileEntity(TileEntity tileEntity) {
+ int i = contains(tileEntity);
+ if (i > -1) {
+ tiles.remove(i);
+ }
+ }
+
+ public boolean isLocked() {
+ return !tiles.isEmpty();
+ }
+
+ // i want to check for the exact object not equals
+ protected int contains(TileEntity tileEntity) {
+ for (int i = 0; i < tiles.size(); i++) {
+ if (tiles.get(i) == tileEntity) {
+ return i;
+ }
+ }
+ return -1;
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/Node.java b/src/main/java/gregtech/api/graphs/Node.java
new file mode 100644
index 0000000000..9afe009d3e
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/Node.java
@@ -0,0 +1,40 @@
+package gregtech.api.graphs;
+
+import java.util.ArrayList;
+
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.tileentity.TileEntity;
+
+import gregtech.api.graphs.consumers.ConsumerNode;
+import gregtech.api.graphs.paths.NodePath;
+
+// base Node class
+public class Node {
+
+ public Node(int aNodeValue, TileEntity aTileEntity, ArrayList<ConsumerNode> aConsumers) {
+ this.mNodeValue = aNodeValue;
+ this.mTileEntity = aTileEntity;
+ this.mConsumers = aConsumers;
+ mHighestNodeValue = aNodeValue;
+ // you don't want to generate map multiple times in the same tick
+ mCreationTime = MinecraftServer.getServer()
+ .getTickCounter();
+ }
+
+ public final TileEntity mTileEntity;
+ public Node[] mNeighbourNodes = new Node[6];
+ public NodePath[] mNodePaths = new NodePath[6];
+ public Lock[] locks = new Lock[6];
+ public ReturnPair returnValues = new ReturnPair();
+ public NodePath mSelfPath;
+ public ArrayList<ConsumerNode> mConsumers;
+ public int mCreationTime;
+ public int mNodeValue;
+ public int mHighestNodeValue;
+
+ public static class ReturnPair {
+
+ public NodePath mReturnPath;
+ public Lock returnLock;
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/NodeList.java b/src/main/java/gregtech/api/graphs/NodeList.java
new file mode 100644
index 0000000000..899384b3d4
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/NodeList.java
@@ -0,0 +1,22 @@
+package gregtech.api.graphs;
+
+// keep track on which node is being looked for across the recursive functions
+public class NodeList {
+
+ Node[] mNodes;
+ int mCounter = 0;
+
+ public NodeList(Node[] mNodes) {
+ this.mNodes = mNodes;
+ }
+
+ Node getNextNode() {
+ if (++mCounter < mNodes.length) return mNodes[mCounter];
+ else return null;
+ }
+
+ Node getNode() {
+ if (mCounter < mNodes.length) return mNodes[mCounter];
+ else return null;
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/PowerNode.java b/src/main/java/gregtech/api/graphs/PowerNode.java
new file mode 100644
index 0000000000..75a8e8d73b
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/PowerNode.java
@@ -0,0 +1,17 @@
+package gregtech.api.graphs;
+
+import java.util.ArrayList;
+
+import net.minecraft.tileentity.TileEntity;
+
+import gregtech.api.graphs.consumers.ConsumerNode;
+
+// base node for power networks
+public class PowerNode extends Node {
+
+ public boolean mHadVoltage = false;
+
+ public PowerNode(int aNodeValue, TileEntity aTileEntity, ArrayList<ConsumerNode> aConsumers) {
+ super(aNodeValue, aTileEntity, aConsumers);
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/PowerNodes.java b/src/main/java/gregtech/api/graphs/PowerNodes.java
new file mode 100644
index 0000000000..98d35e2971
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/PowerNodes.java
@@ -0,0 +1,182 @@
+package gregtech.api.graphs;
+
+import gregtech.api.graphs.consumers.ConsumerNode;
+import gregtech.api.graphs.paths.PowerNodePath;
+
+/*
+ * look for and power node that need power how this works a node only contains nodes that has a higher value then it
+ * self except for 1 which is the return node this node also contains the highest known node value of its network this
+ * network only includes nodes that have a higher value then it self so it does not know the highest known value that
+ * the return node knows with these rules we can know for the target node to be in the network of a node, the target
+ * node must have a value no less than the node we are looking and no greater than the highest value that node knows
+ * this way we don't have to go over the entire network to look for it we also hold a list of all consumers so we can
+ * check before looking if that consumer actually needs power and only look for nodes that actually need power
+ */
+public class PowerNodes {
+
+ // check if the looked for node is next to or get the next node that is closer to it
+ public static long powerNode(Node aCurrentNode, Node aPreviousNode, NodeList aConsumers, long aVoltage,
+ long aMaxAmps) {
+ long tAmpsUsed = 0;
+ ConsumerNode tConsumer = (ConsumerNode) aConsumers.getNode();
+ int tLoopProtection = 0;
+ while (tConsumer != null) {
+ int tTargetNodeValue = tConsumer.mNodeValue;
+ // if the target node has a value less then the current node
+ if (tTargetNodeValue < aCurrentNode.mNodeValue || tTargetNodeValue > aCurrentNode.mHighestNodeValue) {
+ for (int j = 0; j < 6; j++) {
+ final Node tNextNode = aCurrentNode.mNeighbourNodes[j];
+ if (tNextNode != null && tNextNode.mNodeValue < aCurrentNode.mNodeValue) {
+ if (tNextNode.mNodeValue == tConsumer.mNodeValue) {
+ tAmpsUsed += processNodeInject(aCurrentNode, tConsumer, j, aMaxAmps - tAmpsUsed, aVoltage);
+ tConsumer = (ConsumerNode) aConsumers.getNextNode();
+ } else {
+ if (aPreviousNode == tNextNode) return tAmpsUsed;
+ tAmpsUsed += processNextNode(
+ aCurrentNode,
+ tNextNode,
+ aConsumers,
+ j,
+ aMaxAmps - tAmpsUsed,
+ aVoltage);
+ tConsumer = (ConsumerNode) aConsumers.getNode();
+ }
+ break;
+ }
+ }
+ } else {
+ // if the target node has a node value greater then current node value
+ for (int side = 5; side > -1; side--) {
+ final Node tNextNode = aCurrentNode.mNeighbourNodes[side];
+ if (tNextNode == null) continue;
+ if (tNextNode.mNodeValue > aCurrentNode.mNodeValue && tNextNode.mNodeValue < tTargetNodeValue) {
+ if (tNextNode == aPreviousNode) return tAmpsUsed;
+ tAmpsUsed += processNextNodeAbove(
+ aCurrentNode,
+ tNextNode,
+ aConsumers,
+ side,
+ aMaxAmps - tAmpsUsed,
+ aVoltage);
+ tConsumer = (ConsumerNode) aConsumers.getNode();
+ break;
+ } else if (tNextNode.mNodeValue == tTargetNodeValue) {
+ tAmpsUsed += processNodeInject(aCurrentNode, tConsumer, side, aMaxAmps - tAmpsUsed, aVoltage);
+ tConsumer = (ConsumerNode) aConsumers.getNextNode();
+ break;
+ }
+ }
+ }
+ if (aMaxAmps - tAmpsUsed <= 0) {
+ return tAmpsUsed;
+ }
+ if (tLoopProtection++ > 20) {
+ throw new NullPointerException("infinite loop in powering nodes ");
+ }
+ }
+ return tAmpsUsed;
+ }
+
+ // checking if target node is next to it or has a higher value then current node value
+ // these functions are different to either go down or up the stack
+ protected static long powerNodeAbove(Node aCurrentNode, Node aPreviousNode, NodeList aConsumers, long aVoltage,
+ long aMaxAmps) {
+ long tAmpsUsed = 0;
+ int tLoopProtection = 0;
+ ConsumerNode tConsumer = (ConsumerNode) aConsumers.getNode();
+ while (tConsumer != null) {
+ int tTargetNodeValue = tConsumer.mNodeValue;
+ if (tTargetNodeValue > aCurrentNode.mHighestNodeValue || tTargetNodeValue < aCurrentNode.mNodeValue) {
+ return tAmpsUsed;
+ } else {
+ for (int side = 5; side > -1; side--) {
+ final Node tNextNode = aCurrentNode.mNeighbourNodes[side];
+ if (tNextNode == null) continue;
+ if (tNextNode.mNodeValue > aCurrentNode.mNodeValue && tNextNode.mNodeValue < tTargetNodeValue) {
+ if (tNextNode == aPreviousNode) return tAmpsUsed;
+ tAmpsUsed += processNextNodeAbove(
+ aCurrentNode,
+ tNextNode,
+ aConsumers,
+ side,
+ aMaxAmps - tAmpsUsed,
+ aVoltage);
+ tConsumer = (ConsumerNode) aConsumers.getNode();
+ break;
+ } else if (tNextNode.mNodeValue == tTargetNodeValue) {
+ tAmpsUsed += processNodeInject(aCurrentNode, tConsumer, side, aMaxAmps - tAmpsUsed, aVoltage);
+ tConsumer = (ConsumerNode) aConsumers.getNextNode();
+ break;
+ }
+ }
+ }
+ if (aMaxAmps - tAmpsUsed <= 0) {
+ return tAmpsUsed;
+ }
+ if (tLoopProtection++ > 20) {
+ throw new NullPointerException("infinite loop in powering nodes ");
+ }
+ }
+ return tAmpsUsed;
+ }
+
+ protected static long processNextNode(Node aCurrentNode, Node aNextNode, NodeList aConsumers, int ordinalSide,
+ long aMaxAmps, long aVoltage) {
+ if (aCurrentNode.locks[ordinalSide].isLocked()) {
+ aConsumers.getNextNode();
+ return 0;
+ }
+ final PowerNodePath tPath = (PowerNodePath) aCurrentNode.mNodePaths[ordinalSide];
+ final PowerNodePath tSelfPath = (PowerNodePath) aCurrentNode.mSelfPath;
+ long tVoltLoss = 0;
+ if (tSelfPath != null) {
+ tVoltLoss += tSelfPath.getLoss();
+ tSelfPath.applyVoltage(aVoltage, false);
+ }
+ tPath.applyVoltage(aVoltage - tVoltLoss, true);
+ tVoltLoss += tPath.getLoss();
+ long tAmps = powerNode(aNextNode, aCurrentNode, aConsumers, aVoltage - tVoltLoss, aMaxAmps);
+ tPath.addAmps(tAmps);
+ if (tSelfPath != null) tSelfPath.addAmps(tAmps);
+ return tAmps;
+ }
+
+ protected static long processNextNodeAbove(Node aCurrentNode, Node aNextNode, NodeList aConsumers, int ordinalSide,
+ long aMaxAmps, long aVoltage) {
+ if (aCurrentNode.locks[ordinalSide].isLocked()) {
+ aConsumers.getNextNode();
+ return 0;
+ }
+ final PowerNodePath tPath = (PowerNodePath) aCurrentNode.mNodePaths[ordinalSide];
+ final PowerNodePath tSelfPath = (PowerNodePath) aCurrentNode.mSelfPath;
+ long tVoltLoss = 0;
+ if (tSelfPath != null) {
+ tVoltLoss += tSelfPath.getLoss();
+ tSelfPath.applyVoltage(aVoltage, false);
+ }
+ tPath.applyVoltage(aVoltage - tVoltLoss, true);
+ tVoltLoss += tPath.getLoss();
+ long tAmps = powerNodeAbove(aNextNode, aCurrentNode, aConsumers, aVoltage - tVoltLoss, aMaxAmps);
+ tPath.addAmps(tAmps);
+ if (tSelfPath != null) tSelfPath.addAmps(tAmps);
+ return tAmps;
+ }
+
+ protected static long processNodeInject(Node aCurrentNode, ConsumerNode aConsumer, int ordinalSide, long aMaxAmps,
+ long aVoltage) {
+ if (aCurrentNode.locks[ordinalSide].isLocked()) return 0;
+ final PowerNodePath tPath = (PowerNodePath) aCurrentNode.mNodePaths[ordinalSide];
+ final PowerNodePath tSelfPath = (PowerNodePath) aCurrentNode.mSelfPath;
+ long tVoltLoss = 0;
+ if (tSelfPath != null) {
+ tVoltLoss += tSelfPath.getLoss();
+ tSelfPath.applyVoltage(aVoltage, false);
+ }
+ tPath.applyVoltage(aVoltage - tVoltLoss, true);
+ tVoltLoss += tPath.getLoss();
+ long tAmps = aConsumer.injectEnergy(aVoltage - tVoltLoss, aMaxAmps);
+ tPath.addAmps(tAmps);
+ if (tSelfPath != null) tSelfPath.addAmps(tAmps);
+ return tAmps;
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/consumers/ConsumerNode.java b/src/main/java/gregtech/api/graphs/consumers/ConsumerNode.java
new file mode 100644
index 0000000000..392fe74a32
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/consumers/ConsumerNode.java
@@ -0,0 +1,30 @@
+package gregtech.api.graphs.consumers;
+
+import java.util.ArrayList;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.graphs.Node;
+
+/**
+ * A node attached to a {@code TileEntity} that can consume stuff from the network.
+ */
+public class ConsumerNode extends Node {
+
+ public ForgeDirection mSide;
+
+ public ConsumerNode(int aNodeValue, TileEntity aTileEntity, ForgeDirection side,
+ ArrayList<ConsumerNode> aConsumers) {
+ super(aNodeValue, aTileEntity, aConsumers);
+ this.mSide = side;
+ }
+
+ public boolean needsEnergy() {
+ return !mTileEntity.isInvalid();
+ }
+
+ public int injectEnergy(long aVoltage, long aMaxAmps) {
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/consumers/EmptyPowerConsumer.java b/src/main/java/gregtech/api/graphs/consumers/EmptyPowerConsumer.java
new file mode 100644
index 0000000000..48cf330bdb
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/consumers/EmptyPowerConsumer.java
@@ -0,0 +1,31 @@
+package gregtech.api.graphs.consumers;
+
+import java.util.ArrayList;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.graphs.paths.PowerNodePath;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+
+// this is here to apply voltage to dead ends
+public class EmptyPowerConsumer extends ConsumerNode {
+
+ public EmptyPowerConsumer(int aNodeValue, TileEntity aTileEntity, ForgeDirection side,
+ ArrayList<ConsumerNode> aConsumers) {
+ super(aNodeValue, aTileEntity, side, aConsumers);
+ }
+
+ @Override
+ public boolean needsEnergy() {
+ return false;
+ }
+
+ @Override
+ public int injectEnergy(long aVoltage, long aMaxAmps) {
+ BaseMetaPipeEntity tPipe = (BaseMetaPipeEntity) mTileEntity;
+ PowerNodePath tPath = (PowerNodePath) tPipe.getNodePath();
+ tPath.applyVoltage(aVoltage, true);
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/consumers/NodeEnergyConnected.java b/src/main/java/gregtech/api/graphs/consumers/NodeEnergyConnected.java
new file mode 100644
index 0000000000..fb0a8cf287
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/consumers/NodeEnergyConnected.java
@@ -0,0 +1,21 @@
+package gregtech.api.graphs.consumers;
+
+import java.util.ArrayList;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.tileentity.IEnergyConnected;
+
+public class NodeEnergyConnected extends ConsumerNode {
+
+ public NodeEnergyConnected(int aNodeValue, IEnergyConnected aTileEntity, ForgeDirection side,
+ ArrayList<ConsumerNode> aConsumers) {
+ super(aNodeValue, (TileEntity) aTileEntity, side, aConsumers);
+ }
+
+ @Override
+ public int injectEnergy(long aVoltage, long aMaxAmps) {
+ return (int) ((IEnergyConnected) mTileEntity).injectEnergyUnits(mSide, aVoltage, aMaxAmps);
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/consumers/NodeEnergyReceiver.java b/src/main/java/gregtech/api/graphs/consumers/NodeEnergyReceiver.java
new file mode 100644
index 0000000000..4f35922029
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/consumers/NodeEnergyReceiver.java
@@ -0,0 +1,68 @@
+package gregtech.api.graphs.consumers;
+
+import java.util.ArrayList;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cofh.api.energy.IEnergyReceiver;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder;
+import gregtech.common.GT_Pollution;
+
+// consumer for RF machines
+public class NodeEnergyReceiver extends ConsumerNode {
+
+ int mRestRF = 0;
+
+ public NodeEnergyReceiver(int aNodeValue, IEnergyReceiver aTileEntity, ForgeDirection side,
+ ArrayList<ConsumerNode> aConsumers) {
+ super(aNodeValue, (TileEntity) aTileEntity, side, aConsumers);
+ }
+
+ @Override
+ public int injectEnergy(long aVoltage, long aMaxAmps) {
+ ForgeDirection tDirection = mSide;
+ int rfOut = GT_Utility.safeInt(aVoltage * GregTech_API.mEUtoRF / 100);
+ int ampsUsed = 0;
+ if (mRestRF < rfOut) {
+ mRestRF += rfOut;
+ ampsUsed = 1;
+ }
+ if (((IEnergyReceiver) mTileEntity).receiveEnergy(tDirection, mRestRF, true) > 0) {
+ int consumed = ((IEnergyReceiver) mTileEntity).receiveEnergy(tDirection, mRestRF, false);
+ mRestRF -= consumed;
+ return ampsUsed;
+ }
+ if (GregTech_API.mRFExplosions && GregTech_API.sMachineExplosions
+ && ((IEnergyReceiver) mTileEntity).getMaxEnergyStored(tDirection) < rfOut * 600L) {
+ explode(rfOut);
+ }
+ return 0;
+ }
+
+ // copied from IEnergyConnected
+ private void explode(int aRfOut) {
+ if (aRfOut > 32L * GregTech_API.mEUtoRF / 100L) {
+ float tStrength = GT_Values.getExplosionPowerForVoltage(aRfOut);
+ int tX = mTileEntity.xCoord, tY = mTileEntity.yCoord, tZ = mTileEntity.zCoord;
+ World tWorld = mTileEntity.getWorldObj();
+ GT_Utility.sendSoundToPlayers(tWorld, SoundResource.IC2_MACHINES_MACHINE_OVERLOAD, 1.0F, -1, tX, tY, tZ);
+ tWorld.setBlock(tX, tY, tZ, Blocks.air);
+ if (GregTech_API.sMachineExplosions) if (GT_Mod.gregtechproxy.mPollution) GT_Pollution
+ .addPollution(tWorld.getChunkFromBlockCoords(tX, tZ), GT_Mod.gregtechproxy.mPollutionOnExplosion);
+
+ new WorldSpawnedEventBuilder.ExplosionEffectEventBuilder().setStrength(tStrength)
+ .setSmoking(true)
+ .setPosition(tX + 0.5, tY + 0.5, tZ + 0.5)
+ .setWorld(tWorld)
+ .run();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/consumers/NodeEnergySink.java b/src/main/java/gregtech/api/graphs/consumers/NodeEnergySink.java
new file mode 100644
index 0000000000..44fb88e5e8
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/consumers/NodeEnergySink.java
@@ -0,0 +1,30 @@
+package gregtech.api.graphs.consumers;
+
+import java.util.ArrayList;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import ic2.api.energy.tile.IEnergySink;
+
+// consumer for IC2 machines
+public class NodeEnergySink extends ConsumerNode {
+
+ public NodeEnergySink(int nodeValue, IEnergySink tileEntity, ForgeDirection side,
+ ArrayList<ConsumerNode> consumers) {
+ super(nodeValue, (TileEntity) tileEntity, side, consumers);
+ }
+
+ @Override
+ public boolean needsEnergy() {
+ return super.needsEnergy() && ((IEnergySink) mTileEntity).getDemandedEnergy() > 0;
+ }
+
+ @Override
+ public int injectEnergy(long aVoltage, long aMaxAmps) {
+ int tUsedAmps = 0;
+ while (aMaxAmps > tUsedAmps && ((IEnergySink) mTileEntity).getDemandedEnergy() > 0
+ && ((IEnergySink) mTileEntity).injectEnergy(mSide, aVoltage, aVoltage) < aVoltage) tUsedAmps++;
+ return tUsedAmps;
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/consumers/NodeGTBaseMetaTile.java b/src/main/java/gregtech/api/graphs/consumers/NodeGTBaseMetaTile.java
new file mode 100644
index 0000000000..e8d8304eb3
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/consumers/NodeGTBaseMetaTile.java
@@ -0,0 +1,28 @@
+package gregtech.api.graphs.consumers;
+
+import java.util.ArrayList;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.tileentity.IEnergyConnected;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+
+// consumer for gt machines
+public class NodeGTBaseMetaTile extends ConsumerNode {
+
+ public NodeGTBaseMetaTile(int aNodeValue, BaseMetaTileEntity aTileEntity, ForgeDirection side,
+ ArrayList<ConsumerNode> aConsumers) {
+ super(aNodeValue, aTileEntity, side, aConsumers);
+ }
+
+ @Override
+ public int injectEnergy(long aVoltage, long aMaxAmps) {
+ return (int) ((IEnergyConnected) mTileEntity).injectEnergyUnits(mSide, aVoltage, aMaxAmps);
+ }
+
+ @Override
+ public boolean needsEnergy() {
+ BaseMetaTileEntity tTileEntity = (BaseMetaTileEntity) mTileEntity;
+ return super.needsEnergy() && tTileEntity.getStoredEU() < tTileEntity.getEUCapacity();
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/paths/NodePath.java b/src/main/java/gregtech/api/graphs/paths/NodePath.java
new file mode 100644
index 0000000000..0e852bd484
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/paths/NodePath.java
@@ -0,0 +1,42 @@
+package gregtech.api.graphs.paths;
+
+import gregtech.api.graphs.Lock;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+
+// to contain all info about the path between nodes
+public class NodePath {
+
+ protected MetaPipeEntity[] mPipes;
+ public Lock lock = new Lock();
+
+ public NodePath(MetaPipeEntity[] aCables) {
+ this.mPipes = aCables;
+ processPipes();
+ }
+
+ protected void processPipes() {
+ for (MetaPipeEntity tPipe : mPipes) {
+ BaseMetaPipeEntity basePipe = (BaseMetaPipeEntity) tPipe.getBaseMetaTileEntity();
+ basePipe.setNodePath(this);
+ }
+ }
+
+ public void clearPath() {
+ for (MetaPipeEntity mPipe : mPipes) {
+ BaseMetaPipeEntity tBasePipe = (BaseMetaPipeEntity) mPipe.getBaseMetaTileEntity();
+ if (tBasePipe != null) {
+ tBasePipe.setNodePath(null);
+ }
+ }
+ }
+
+ public void reloadLocks() {
+ for (MetaPipeEntity pipe : mPipes) {
+ BaseMetaPipeEntity basePipe = (BaseMetaPipeEntity) pipe.getBaseMetaTileEntity();
+ if (basePipe != null) {
+ basePipe.reloadLocks();
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/graphs/paths/PowerNodePath.java b/src/main/java/gregtech/api/graphs/paths/PowerNodePath.java
new file mode 100644
index 0000000000..8a869c333e
--- /dev/null
+++ b/src/main/java/gregtech/api/graphs/paths/PowerNodePath.java
@@ -0,0 +1,153 @@
+package gregtech.api.graphs.paths;
+
+import net.minecraft.server.MinecraftServer;
+
+import gregtech.api.enums.TickTime;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable;
+import gregtech.api.util.AveragePerTickCounter;
+
+// path for cables
+// all calculations like amp and voltage happens here
+public class PowerNodePath extends NodePath {
+
+ long mMaxAmps;
+ long mAmps = 0;
+ long mLoss;
+ long mVoltage = 0;
+ long mMaxVoltage;
+ int mTick = 0;
+ boolean mCountUp = true;
+
+ private AveragePerTickCounter avgAmperageCounter = new AveragePerTickCounter(TickTime.SECOND);
+ private AveragePerTickCounter avgVoltageCounter = new AveragePerTickCounter(TickTime.SECOND);
+
+ public PowerNodePath(MetaPipeEntity[] aCables) {
+ super(aCables);
+ }
+
+ public long getLoss() {
+ return mLoss;
+ }
+
+ public void applyVoltage(long aVoltage, boolean aCountUp) {
+
+ avgVoltageCounter.addValue(Math.max(aVoltage - mLoss, 0));
+
+ int tNewTime = MinecraftServer.getServer()
+ .getTickCounter();
+ if (mTick != tNewTime) {
+ reset(tNewTime - mTick);
+ mTick = tNewTime;
+ this.mVoltage = aVoltage;
+ this.mCountUp = aCountUp;
+ } else if (this.mCountUp != aCountUp && (aVoltage - mLoss) > this.mVoltage || aVoltage > this.mVoltage) {
+ this.mCountUp = aCountUp;
+ this.mVoltage = aVoltage;
+ }
+ if (aVoltage > mMaxVoltage) {
+ lock.addTileEntity(null);
+ for (MetaPipeEntity tCable : mPipes) {
+ if (((GT_MetaPipeEntity_Cable) tCable).mVoltage < this.mVoltage) {
+ BaseMetaPipeEntity tBaseCable = (BaseMetaPipeEntity) tCable.getBaseMetaTileEntity();
+ if (tBaseCable != null) {
+ tBaseCable.setToFire();
+ }
+ }
+ }
+ }
+ }
+
+ private void reset(int aTimePassed) {
+ if (aTimePassed < 0 || aTimePassed > 100) {
+ mAmps = 0;
+ return;
+ }
+ mAmps = Math.max(0, mAmps - (mMaxAmps * aTimePassed));
+ }
+
+ public void addAmps(long aAmps) {
+
+ avgAmperageCounter.addValue(aAmps);
+
+ this.mAmps += aAmps;
+ if (this.mAmps > mMaxAmps * 40) {
+ lock.addTileEntity(null);
+ for (MetaPipeEntity tCable : mPipes) {
+ if (((GT_MetaPipeEntity_Cable) tCable).mAmperage * 40 < this.mAmps) {
+ BaseMetaPipeEntity tBaseCable = (BaseMetaPipeEntity) tCable.getBaseMetaTileEntity();
+ if (tBaseCable != null) {
+ tBaseCable.setToFire();
+ }
+ }
+ }
+ }
+ }
+
+ // if no amps pass through for more than 0.5 second reduce them to minimize wrong results
+ // but still allow the player to see if activity is happening
+ @Deprecated
+ public long getAmps() {
+ int tTime = MinecraftServer.getServer()
+ .getTickCounter() - 10;
+ if (mTick < tTime) {
+ reset(tTime - mTick);
+ mTick = tTime;
+ }
+ return mAmps;
+ }
+
+ @Deprecated
+ public long getVoltage(MetaPipeEntity aCable) {
+ int tLoss = 0;
+ if (mCountUp) {
+ for (MetaPipeEntity mPipe : mPipes) {
+ GT_MetaPipeEntity_Cable tCable = (GT_MetaPipeEntity_Cable) mPipe;
+ tLoss += tCable.mCableLossPerMeter;
+ if (aCable == tCable) {
+ return Math.max(mVoltage - tLoss, 0);
+ }
+ }
+ } else {
+ for (int i = mPipes.length - 1; i >= 0; i--) {
+ GT_MetaPipeEntity_Cable tCable = (GT_MetaPipeEntity_Cable) mPipes[i];
+ tLoss += tCable.mCableLossPerMeter;
+ if (aCable == tCable) {
+ return Math.max(mVoltage - tLoss, 0);
+ }
+ }
+ }
+ return -1;
+ }
+
+ public long getAmperage() {
+ return avgAmperageCounter.getLast();
+ }
+
+ public double getAvgAmperage() {
+ return avgAmperageCounter.getAverage();
+ }
+
+ public long getVoltage() {
+ return avgVoltageCounter.getLast();
+ }
+
+ public double getAvgVoltage() {
+ return avgVoltageCounter.getAverage();
+ }
+
+ @Override
+ protected void processPipes() {
+ super.processPipes();
+ mMaxAmps = Integer.MAX_VALUE;
+ mMaxVoltage = Integer.MAX_VALUE;
+ for (MetaPipeEntity tCable : mPipes) {
+ if (tCable instanceof GT_MetaPipeEntity_Cable) {
+ mMaxAmps = Math.min(((GT_MetaPipeEntity_Cable) tCable).mAmperage, mMaxAmps);
+ mLoss += ((GT_MetaPipeEntity_Cable) tCable).mCableLossPerMeter;
+ mMaxVoltage = Math.min(((GT_MetaPipeEntity_Cable) tCable).mVoltage, mMaxVoltage);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_Container.java b/src/main/java/gregtech/api/gui/GT_Container.java
new file mode 100644
index 0000000000..851e1f6461
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_Container.java
@@ -0,0 +1,740 @@
+package gregtech.api.gui;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.ICrafting;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+
+import gregtech.api.interfaces.IFluidAccess;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * The main Container class. It is used for all GregTech GUIs.
+ * <p>
+ * Never include this file in your mod - it will break your modpack.
+ */
+public class GT_Container extends Container {
+
+ public IGregTechTileEntity mTileEntity;
+ public InventoryPlayer mPlayerInventory;
+
+ public GT_Container(InventoryPlayer aPlayerInventory, IGregTechTileEntity aTileEntityInventory) {
+
+ mTileEntity = aTileEntityInventory;
+ mPlayerInventory = aPlayerInventory;
+ mTileEntity.openInventory();
+ }
+
+ /**
+ * To add the Slots to your GUI
+ */
+ public void addSlots(InventoryPlayer aPlayerInventory) {
+ //
+ }
+
+ /**
+ * Amount of regular Slots in the GUI (so, non-HoloSlots)
+ */
+ public int getSlotCount() {
+ return 0;
+ }
+
+ /**
+ * Amount of ALL Slots in the GUI including HoloSlots and ArmorSlots, but excluding regular Player Slots
+ */
+ protected final int getAllSlotCount() {
+ if (inventorySlots != null) {
+ if (doesBindPlayerInventory()) return inventorySlots.size() - 36;
+ return inventorySlots.size();
+ }
+ return getSlotCount();
+ }
+
+ /**
+ * Start-Index of the usable Slots (the first non-HoloSlot)
+ */
+ public int getSlotStartIndex() {
+ return 0;
+ }
+
+ public int getShiftClickStartIndex() {
+ return getSlotStartIndex();
+ }
+
+ /**
+ * Amount of Slots in the GUI the player can Shift-Click into. Uses also getSlotStartIndex
+ */
+ public int getShiftClickSlotCount() {
+ return 0;
+ }
+
+ /**
+ * Is Player-Inventory visible?
+ */
+ public boolean doesBindPlayerInventory() {
+ return true;
+ }
+
+ /**
+ * Override this Function with something like "return mTileEntity.isUseableByPlayer(aPlayer);"
+ */
+ @Override
+ public boolean canInteractWith(EntityPlayer aPlayer) {
+ return false;
+ }
+
+ protected void bindPlayerInventory(InventoryPlayer aInventoryPlayer) {
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 9; j++) {
+ addSlotToContainer(new Slot(aInventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
+ }
+ }
+
+ for (int i = 0; i < 9; i++) {
+ addSlotToContainer(new Slot(aInventoryPlayer, i, 8 + i * 18, 142));
+ }
+ }
+
+ @Override
+ public ItemStack slotClick(int aSlotIndex, int aMouseclick, int aShifthold, EntityPlayer aPlayer) {
+ mTileEntity.markDirty();
+
+ if (aSlotIndex >= 0) {
+ if (inventorySlots.get(aSlotIndex) == null || inventorySlots.get(aSlotIndex) instanceof GT_Slot_Holo)
+ return null;
+ if (!(inventorySlots.get(aSlotIndex) instanceof GT_Slot_Armor)) if (aSlotIndex < getAllSlotCount())
+ if (aSlotIndex < getSlotStartIndex() || aSlotIndex >= getSlotStartIndex() + getSlotCount()) return null;
+ }
+
+ try {
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+
+ // It looks like the rest of this code should ideally never be
+ // called, and might in fact never be called.
+
+ ItemStack rStack = null;
+ InventoryPlayer aPlayerInventory = aPlayer.inventory;
+ Slot aSlot;
+ ItemStack tTempStack;
+ int tTempStackSize;
+ ItemStack aHoldStack;
+
+ if ((aShifthold == 0 || aShifthold == 1) && (aMouseclick == 0 || aMouseclick == 1)) {
+ if (aSlotIndex == -999) {
+ if (aPlayerInventory.getItemStack() != null) {
+ if (aMouseclick == 0) {
+ aPlayer.dropPlayerItemWithRandomChoice(aPlayerInventory.getItemStack(), true);
+ aPlayerInventory.setItemStack(null);
+ }
+ if (aMouseclick == 1) {
+ aPlayer.dropPlayerItemWithRandomChoice(
+ aPlayerInventory.getItemStack()
+ .splitStack(1),
+ true);
+ if (aPlayerInventory.getItemStack().stackSize == 0) {
+ aPlayerInventory.setItemStack(null);
+ }
+ }
+ }
+ } else if (aShifthold == 1) {
+ aSlot = this.inventorySlots.get(aSlotIndex);
+ if (aSlot != null && aSlot.canTakeStack(aPlayer)) {
+ tTempStack = this.transferStackInSlot(aPlayer, aSlotIndex);
+ if (tTempStack != null) {
+ rStack = GT_Utility.copyOrNull(tTempStack);
+ if (aSlot.getStack() != null && aSlot.getStack()
+ .getItem() == tTempStack.getItem()) {
+ slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ }
+ }
+ }
+ } else {
+ if (aSlotIndex < 0) {
+ return null;
+ }
+ aSlot = this.inventorySlots.get(aSlotIndex);
+ if (aSlot != null) {
+ tTempStack = aSlot.getStack();
+ ItemStack mouseStack = aPlayerInventory.getItemStack();
+ if (tTempStack != null) {
+ rStack = GT_Utility.copyOrNull(tTempStack);
+ }
+ if (tTempStack == null) {
+ if (mouseStack != null && aSlot.isItemValid(mouseStack)) {
+ tTempStackSize = aMouseclick == 0 ? mouseStack.stackSize : 1;
+ if (tTempStackSize > aSlot.getSlotStackLimit()) {
+ tTempStackSize = aSlot.getSlotStackLimit();
+ }
+ aSlot.putStack(mouseStack.splitStack(tTempStackSize));
+
+ if (mouseStack.stackSize == 0) {
+ aPlayerInventory.setItemStack(null);
+ }
+ }
+ } else if (aSlot.canTakeStack(aPlayer)) {
+ if (mouseStack == null) {
+ tTempStackSize = aMouseclick == 0 ? tTempStack.stackSize : (tTempStack.stackSize + 1) / 2;
+ aHoldStack = aSlot.decrStackSize(tTempStackSize);
+ aPlayerInventory.setItemStack(aHoldStack);
+ if (tTempStack.stackSize == 0) {
+ aSlot.putStack(null);
+ }
+ aSlot.onPickupFromSlot(aPlayer, aPlayerInventory.getItemStack());
+ } else if (aSlot.isItemValid(mouseStack)) {
+ if (tTempStack.getItem() == mouseStack.getItem()
+ && tTempStack.getItemDamage() == mouseStack.getItemDamage()
+ && ItemStack.areItemStackTagsEqual(tTempStack, mouseStack)) {
+ tTempStackSize = aMouseclick == 0 ? mouseStack.stackSize : 1;
+ if (tTempStackSize > aSlot.getSlotStackLimit() - tTempStack.stackSize) {
+ tTempStackSize = aSlot.getSlotStackLimit() - tTempStack.stackSize;
+ }
+ if (tTempStackSize > mouseStack.getMaxStackSize() - tTempStack.stackSize) {
+ tTempStackSize = mouseStack.getMaxStackSize() - tTempStack.stackSize;
+ }
+ mouseStack.splitStack(tTempStackSize);
+ if (mouseStack.stackSize == 0) {
+ aPlayerInventory.setItemStack(null);
+ }
+ tTempStack.stackSize += tTempStackSize;
+ } else if (mouseStack.stackSize <= aSlot.getSlotStackLimit()) {
+ aSlot.putStack(mouseStack);
+ aPlayerInventory.setItemStack(tTempStack);
+ }
+ } else if (tTempStack.getItem() == mouseStack.getItem() && mouseStack.getMaxStackSize() > 1
+ && (!tTempStack.getHasSubtypes()
+ || tTempStack.getItemDamage() == mouseStack.getItemDamage())
+ && ItemStack.areItemStackTagsEqual(tTempStack, mouseStack)) {
+ tTempStackSize = tTempStack.stackSize;
+
+ if (tTempStackSize > 0
+ && tTempStackSize + mouseStack.stackSize <= mouseStack.getMaxStackSize()) {
+ mouseStack.stackSize += tTempStackSize;
+ tTempStack = aSlot.decrStackSize(tTempStackSize);
+
+ if (tTempStack.stackSize == 0) {
+ aSlot.putStack(null);
+ }
+
+ aSlot.onPickupFromSlot(aPlayer, aPlayerInventory.getItemStack());
+ }
+ }
+ }
+ aSlot.onSlotChanged();
+ }
+ }
+ // Did the player try to swap a slot with his hotbar using a
+ // number key from 1 to 9
+ // aMouseclick == 0 means number 1, aMouseclick == 8 means number 9
+ } else if (aShifthold == 2 && aMouseclick >= 0 && aMouseclick < 9) {
+ aSlot = this.inventorySlots.get(aSlotIndex);
+
+ if (aSlot.canTakeStack(aPlayer)) {
+ // get the stack at the specified hotbar slot.
+ tTempStack = aPlayerInventory.getStackInSlot(aMouseclick);
+ boolean canSwap = tTempStack == null
+ || aSlot.inventory == aPlayerInventory && aSlot.isItemValid(tTempStack);
+ tTempStackSize = -1;
+
+ if (!canSwap) {
+ tTempStackSize = aPlayerInventory.getFirstEmptyStack();
+ canSwap = tTempStackSize > -1;
+ }
+
+ if (canSwap && aSlot.getHasStack()) {
+ aHoldStack = aSlot.getStack();
+ aPlayerInventory.setInventorySlotContents(aMouseclick, aHoldStack);
+
+ if (tTempStack != null && (aSlot.inventory != aPlayerInventory || !aSlot.isItemValid(tTempStack))) {
+ if (tTempStackSize > -1) {
+ aPlayerInventory.addItemStackToInventory(tTempStack);
+ aSlot.decrStackSize(aHoldStack.stackSize);
+ aSlot.putStack(null);
+ aSlot.onPickupFromSlot(aPlayer, aHoldStack);
+ }
+ } else {
+ aSlot.decrStackSize(aHoldStack.stackSize);
+ aSlot.putStack(tTempStack);
+ aSlot.onPickupFromSlot(aPlayer, aHoldStack);
+ }
+ } else if (tTempStack != null && !aSlot.getHasStack() && aSlot.isItemValid(tTempStack)) {
+ aPlayerInventory.setInventorySlotContents(aMouseclick, null);
+ aSlot.putStack(tTempStack);
+ }
+ }
+ } else if (aShifthold == 3 && aPlayer.capabilities.isCreativeMode
+ && aPlayerInventory.getItemStack() == null
+ && aSlotIndex >= 0) {
+ aSlot = this.inventorySlots.get(aSlotIndex);
+ if (aSlot != null && aSlot.getHasStack()) {
+ tTempStack = GT_Utility.copyOrNull(aSlot.getStack());
+ tTempStack.stackSize = tTempStack.getMaxStackSize();
+ aPlayerInventory.setItemStack(tTempStack);
+ }
+ }
+ return rStack;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(EntityPlayer aPlayer, int aSlotIndex) {
+ ItemStack stack = null;
+ Slot slotObject = inventorySlots.get(aSlotIndex);
+
+ mTileEntity.markDirty();
+
+ // null checks and checks if the item can be stacked (maxStackSize > 1)
+ if (getSlotCount() > 0 && slotObject != null
+ && slotObject.getHasStack()
+ && !(slotObject instanceof GT_Slot_Holo)) {
+ ItemStack stackInSlot = slotObject.getStack();
+ stack = GT_Utility.copyOrNull(stackInSlot);
+
+ // TileEntity -> Player
+ if (aSlotIndex < getAllSlotCount()) {
+ if (doesBindPlayerInventory())
+ if (!mergeItemStack(stackInSlot, getAllSlotCount(), getAllSlotCount() + 36, true)) {
+ return null;
+ }
+ // Player -> TileEntity
+ } else if (!mergeItemStack(
+ stackInSlot,
+ getShiftClickStartIndex(),
+ getShiftClickStartIndex() + getShiftClickSlotCount(),
+ false)) {
+ return null;
+ }
+
+ if (stackInSlot.stackSize == 0) {
+ slotObject.putStack(null);
+ } else {
+ slotObject.onSlotChanged();
+ }
+ }
+ return stack;
+ }
+
+ /**
+ * merges provided ItemStack with the first avaliable one in the container/player inventory
+ */
+ @Override
+ protected boolean mergeItemStack(ItemStack aStack, int aStartIndex, int aSlotCount, boolean reverseOrder) {
+ boolean transferredStack = false;
+ int slotIndex = aStartIndex;
+
+ mTileEntity.markDirty();
+
+ if (reverseOrder) {
+ slotIndex = aSlotCount - 1;
+ }
+
+ Slot slot;
+ ItemStack itemStack;
+
+ if (aStack.isStackable()) {
+ while (aStack.stackSize > 0
+ && (!reverseOrder && slotIndex < aSlotCount || reverseOrder && slotIndex >= aStartIndex)) {
+ slot = this.inventorySlots.get(slotIndex);
+ itemStack = slot.getStack();
+ if (!(slot instanceof GT_Slot_Holo) && !(slot instanceof GT_Slot_Output)
+ && slot.isItemValid(aStack)
+ && itemStack != null
+ && itemStack.getItem() == aStack.getItem()
+ && (!aStack.getHasSubtypes() || aStack.getItemDamage() == itemStack.getItemDamage())
+ && ItemStack.areItemStackTagsEqual(aStack, itemStack)) {
+ int combinedStackSize = itemStack.stackSize + aStack.stackSize;
+ if (itemStack.stackSize < mTileEntity.getInventoryStackLimit()) {
+ if (combinedStackSize <= aStack.getMaxStackSize()) {
+ aStack.stackSize = 0;
+ itemStack.stackSize = combinedStackSize;
+ slot.onSlotChanged();
+ transferredStack = true;
+ } else if (itemStack.stackSize < aStack.getMaxStackSize()) {
+ aStack.stackSize -= aStack.getMaxStackSize() - itemStack.stackSize;
+ itemStack.stackSize = aStack.getMaxStackSize();
+ slot.onSlotChanged();
+ transferredStack = true;
+ }
+ }
+ }
+
+ if (reverseOrder) {
+ --slotIndex;
+ } else {
+ ++slotIndex;
+ }
+ }
+ }
+ if (aStack.stackSize > 0) {
+ if (reverseOrder) {
+ slotIndex = aSlotCount - 1;
+ } else {
+ slotIndex = aStartIndex;
+ }
+
+ while (!reverseOrder && slotIndex < aSlotCount || reverseOrder && slotIndex >= aStartIndex) {
+ slot = this.inventorySlots.get(slotIndex);
+ itemStack = slot.getStack();
+
+ if (slot.isItemValid(aStack) && itemStack == null) {
+ int quantityToTransfer = Math.min(aStack.stackSize, mTileEntity.getInventoryStackLimit());
+ slot.putStack(GT_Utility.copyAmount(quantityToTransfer, aStack));
+ slot.onSlotChanged();
+ aStack.stackSize -= quantityToTransfer;
+ transferredStack = true;
+ break;
+ }
+
+ if (reverseOrder) {
+ --slotIndex;
+ } else {
+ ++slotIndex;
+ }
+ }
+ }
+
+ return transferredStack;
+ }
+
+ @Override
+ protected Slot addSlotToContainer(Slot slot) {
+ try {
+ return super.addSlotToContainer(slot);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ return slot;
+ }
+
+ @Override
+ public void addCraftingToCrafters(ICrafting player) {
+ try {
+ super.addCraftingToCrafters(player);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ public List<ItemStack> getInventory() {
+ try {
+ return super.getInventory();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ return null;
+ }
+
+ @Override
+ public void removeCraftingFromCrafters(ICrafting player) {
+ try {
+ super.removeCraftingFromCrafters(player);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ public void detectAndSendChanges() {
+ try {
+ super.detectAndSendChanges();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ public boolean enchantItem(EntityPlayer player, int slotIndex) {
+ try {
+ return super.enchantItem(player, slotIndex);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ return false;
+ }
+
+ @Override
+ public Slot getSlotFromInventory(IInventory inventory, int slotIndex) {
+ try {
+ return super.getSlotFromInventory(inventory, slotIndex);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ return null;
+ }
+
+ @Override
+ public Slot getSlot(int slotIndex) {
+ try {
+ if (this.inventorySlots.size() > slotIndex) return super.getSlot(slotIndex);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean func_94530_a(ItemStack itemStack, Slot slot) {
+ try {
+ return super.func_94530_a(itemStack, slot);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ return true;
+ }
+
+ @Override
+ protected void retrySlotClick(int slotIndex, int mouseButton, boolean aShifthold, EntityPlayer player) {
+ try {
+ super.retrySlotClick(slotIndex, mouseButton, aShifthold, player);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ public void onContainerClosed(EntityPlayer player) {
+ try {
+ super.onContainerClosed(player);
+ mTileEntity.closeInventory();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ public void onCraftMatrixChanged(IInventory inventory) {
+ try {
+ super.onCraftMatrixChanged(inventory);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ public void putStackInSlot(int slotIndex, ItemStack itemStack) {
+ try {
+ super.putStackInSlot(slotIndex, itemStack);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ public void putStacksInSlots(ItemStack[] itemStacks) {
+ try {
+ super.putStacksInSlots(itemStacks);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ public void updateProgressBar(int id, int value) {
+ try {
+ super.updateProgressBar(id, value);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ public short getNextTransactionID(InventoryPlayer inventoryPlayer) {
+ try {
+ return super.getNextTransactionID(inventoryPlayer);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean isPlayerNotUsingContainer(EntityPlayer player) {
+ try {
+ return super.isPlayerNotUsingContainer(player);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ return true;
+ }
+
+ @Override
+ public void setPlayerIsPresent(EntityPlayer player, boolean value) {
+ try {
+ super.setPlayerIsPresent(player, value);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ protected void func_94533_d() {
+ try {
+ super.func_94533_d();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ public boolean canDragIntoSlot(Slot slot) {
+ try {
+ return super.canDragIntoSlot(slot);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ return true;
+ }
+
+ protected static ItemStack handleFluidSlotClick(IFluidAccess aFluidAccess, EntityPlayer aPlayer,
+ boolean aProcessFullStack, boolean aCanDrain, boolean aCanFill) {
+ ItemStack tStackHeld = aPlayer.inventory.getItemStack();
+ ItemStack tStackSizedOne = GT_Utility.copyAmount(1, tStackHeld);
+ if (tStackSizedOne == null || tStackHeld.stackSize == 0) return null;
+ FluidStack tInputFluid = aFluidAccess.get();
+ FluidStack tFluidHeld = GT_Utility.getFluidForFilledItem(tStackSizedOne, true);
+ if (tFluidHeld != null && tFluidHeld.amount <= 0) tFluidHeld = null;
+ if (tInputFluid == null) {
+ // tank empty, consider fill only from now on
+ if (!aCanFill)
+ // cannot fill and nothing to take, bail out
+ return null;
+ if (tFluidHeld == null)
+ // no fluid to fill
+ return null;
+ return fillFluid(aFluidAccess, aPlayer, tFluidHeld, aProcessFullStack);
+ }
+ // tank not empty, both action possible
+ if (tFluidHeld != null && tInputFluid.amount < aFluidAccess.getCapacity()) {
+ // both nonnull and have space left for filling.
+ if (aCanFill)
+ // actually both pickup and fill is reasonable, but I'll go with fill here
+ return fillFluid(aFluidAccess, aPlayer, tFluidHeld, aProcessFullStack);
+ if (!aCanDrain)
+ // cannot take AND cannot fill, why make this call then?
+ return null;
+ // the slot does not allow filling, so try take some
+ return drainFluid(aFluidAccess, aPlayer, aProcessFullStack);
+ } else {
+ // cannot fill and there is something to take
+ if (!aCanDrain)
+ // but the slot does not allow taking, so bail out
+ return null;
+ return drainFluid(aFluidAccess, aPlayer, aProcessFullStack);
+ }
+ }
+
+ protected static ItemStack drainFluid(IFluidAccess aFluidAccess, EntityPlayer aPlayer, boolean aProcessFullStack) {
+ FluidStack tTankStack = aFluidAccess.get();
+ if (tTankStack == null) return null;
+ ItemStack tStackHeld = aPlayer.inventory.getItemStack();
+ ItemStack tStackSizedOne = GT_Utility.copyAmount(1, tStackHeld);
+ if (tStackSizedOne == null || tStackHeld.stackSize == 0) return null;
+ int tOriginalFluidAmount = tTankStack.amount;
+ ItemStack tFilledContainer = GT_Utility.fillFluidContainer(tTankStack, tStackSizedOne, true, false);
+ if (tFilledContainer == null && tStackSizedOne.getItem() instanceof IFluidContainerItem tContainerItem) {
+ int tFilledAmount = tContainerItem.fill(tStackSizedOne, tTankStack, true);
+ if (tFilledAmount > 0) {
+ tFilledContainer = tStackSizedOne;
+ tTankStack.amount -= tFilledAmount;
+ }
+ }
+ if (tFilledContainer != null) {
+ if (aProcessFullStack) {
+ int tFilledAmount = tOriginalFluidAmount - tTankStack.amount;
+ /*
+ * work out how many more items we can fill one cell is already used, so account for that the round down
+ * behavior will left over a fraction of a cell worth of fluid the user then get to decide what to do
+ * with it it will not be too fancy if it spills out partially filled cells
+ */
+ int tAdditionalParallel = Math.min(tStackHeld.stackSize - 1, tTankStack.amount / tFilledAmount);
+ tTankStack.amount -= tFilledAmount * tAdditionalParallel;
+ tFilledContainer.stackSize += tAdditionalParallel;
+ }
+ replaceCursorItemStack(aPlayer, tFilledContainer);
+ }
+ aFluidAccess.verifyFluidStack();
+ return tFilledContainer;
+ }
+
+ protected static ItemStack fillFluid(IFluidAccess aFluidAccess, EntityPlayer aPlayer, FluidStack aFluidHeld,
+ boolean aProcessFullStack) {
+ // we are not using aMachine.fill() here any more, so we need to check for fluid type here ourselves
+ if (aFluidAccess.get() != null && !aFluidAccess.get()
+ .isFluidEqual(aFluidHeld)) return null;
+ ItemStack tStackHeld = aPlayer.inventory.getItemStack();
+ ItemStack tStackSizedOne = GT_Utility.copyAmount(1, tStackHeld);
+ if (tStackSizedOne == null) return null;
+
+ int tFreeSpace = aFluidAccess.getCapacity() - (aFluidAccess.get() != null ? aFluidAccess.get().amount : 0);
+ if (tFreeSpace <= 0)
+ // no space left
+ return null;
+
+ // find out how much fluid can be taken
+ // some cells cannot be partially filled
+ ItemStack tStackEmptied = null;
+ int tAmountTaken = 0;
+ if (tFreeSpace >= aFluidHeld.amount) {
+ // fully accepted - try take it from item now
+ // IFluidContainerItem is intentionally not checked here. it will be checked later
+ tStackEmptied = GT_Utility.getContainerForFilledItem(tStackSizedOne, false);
+ tAmountTaken = aFluidHeld.amount;
+ }
+ if (tStackEmptied == null && tStackSizedOne.getItem() instanceof IFluidContainerItem container) {
+ // either partially accepted, or is IFluidContainerItem
+ FluidStack tDrained = container.drain(tStackSizedOne, tFreeSpace, true);
+ if (tDrained != null && tDrained.amount > 0) {
+ // something is actually drained - change the cell and drop it to player
+ tStackEmptied = tStackSizedOne;
+ tAmountTaken = tDrained.amount;
+ }
+ }
+ if (tStackEmptied == null)
+ // somehow the cell refuse to give out that amount of fluid, no op then
+ return null;
+
+ // find out how many fill can we do
+ // same round down behavior as above
+ // however here the fluid stack is not changed at all, so the exact code will slightly differ
+ int tParallel = aProcessFullStack ? Math.min(tFreeSpace / tAmountTaken, tStackHeld.stackSize) : 1;
+ if (aFluidAccess.get() == null) {
+ FluidStack tNewFillableStack = aFluidHeld.copy();
+ tNewFillableStack.amount = tAmountTaken * tParallel;
+ aFluidAccess.set(tNewFillableStack);
+ } else {
+ aFluidAccess.addAmount(tAmountTaken * tParallel);
+ }
+ tStackEmptied.stackSize = tParallel;
+ replaceCursorItemStack(aPlayer, tStackEmptied);
+ return tStackEmptied;
+ }
+
+ private static void replaceCursorItemStack(EntityPlayer aPlayer, ItemStack tStackResult) {
+ int tStackResultMaxStackSize = tStackResult.getMaxStackSize();
+ while (tStackResult.stackSize > tStackResultMaxStackSize) {
+ aPlayer.inventory.getItemStack().stackSize -= tStackResultMaxStackSize;
+ GT_Utility.addItemToPlayerInventory(aPlayer, tStackResult.splitStack(tStackResultMaxStackSize));
+ }
+ if (aPlayer.inventory.getItemStack().stackSize == tStackResult.stackSize) {
+ // every cell is mutated. it could just stay on the cursor.
+ aPlayer.inventory.setItemStack(tStackResult);
+ } else {
+ // some cells not mutated. The mutated cells must go into the inventory
+ // or drop into the world if there isn't enough space.
+ ItemStack tStackHeld = aPlayer.inventory.getItemStack();
+ tStackHeld.stackSize -= tStackResult.stackSize;
+ GT_Utility.addItemToPlayerInventory(aPlayer, tStackResult);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_ContainerMetaTile_Machine.java b/src/main/java/gregtech/api/gui/GT_ContainerMetaTile_Machine.java
new file mode 100644
index 0000000000..a77f376e00
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_ContainerMetaTile_Machine.java
@@ -0,0 +1,244 @@
+package gregtech.api.gui;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.ICrafting;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * The Container I use for all my MetaTileEntities
+ */
+public class GT_ContainerMetaTile_Machine extends GT_Container {
+
+ public int mActive = 0, mMaxProgressTime = 0, mProgressTime = 0, mEnergy = 0, mSteam = 0, mSteamStorage = 0,
+ mStorage = 0, mOutput = 0, mInput = 0, mID = 0, mDisplayErrorCode = 0;
+ public long mEnergyLong = 0, mStorageLong = 0;
+ private int oActive = 0, oMaxProgressTime = 0, oProgressTime = 0, oEnergy = 0, oSteam = 0, oSteamStorage = 0,
+ oStorage = 0, oOutput = 0, oInput = 0, oID = 0, oDisplayErrorCode = 0;
+ private long oEnergyLong = 0, oStorageLong = 0;
+ protected int mTimer = 0;
+ protected Runnable circuitSlotClickCallback;
+
+ public GT_ContainerMetaTile_Machine(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity) {
+ super(aInventoryPlayer, aTileEntity);
+
+ mTileEntity = aTileEntity;
+
+ if (mTileEntity != null && mTileEntity.getMetaTileEntity() != null) {
+ addSlots(aInventoryPlayer);
+ if (doesBindPlayerInventory()) bindPlayerInventory(aInventoryPlayer);
+ detectAndSendChanges();
+ } else {
+ aInventoryPlayer.player.openContainer = aInventoryPlayer.player.inventoryContainer;
+ }
+ }
+
+ public GT_ContainerMetaTile_Machine(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity,
+ boolean doesBindInventory) {
+ super(aInventoryPlayer, aTileEntity);
+ mTileEntity = aTileEntity;
+
+ if (mTileEntity != null && mTileEntity.getMetaTileEntity() != null) {
+ addSlots(aInventoryPlayer);
+ if (doesBindPlayerInventory() && doesBindInventory) bindPlayerInventory(aInventoryPlayer);
+ detectAndSendChanges();
+ } else {
+ aInventoryPlayer.player.openContainer = aInventoryPlayer.player.inventoryContainer;
+ }
+ }
+
+ protected void addCircuitSlot() {
+ if (mTileEntity.getMetaTileEntity() instanceof IConfigurationCircuitSupport ccs) {
+ GT_Slot_Render slotCircuit = new GT_Slot_Render(
+ mTileEntity,
+ ccs.getCircuitSlot(),
+ ccs.getCircuitSlotX(),
+ ccs.getCircuitSlotY());
+ addSlotToContainer(slotCircuit);
+ slotCircuit.setEnabled(ccs.allowSelectCircuit());
+ }
+ }
+
+ @Override
+ public void addSlots(InventoryPlayer aInventoryPlayer) {
+ addCircuitSlot();
+ }
+
+ @Override
+ public void detectAndSendChanges() {
+ super.detectAndSendChanges();
+ if (mTileEntity.isClientSide() || mTileEntity.getMetaTileEntity() == null) return;
+ mStorage = (int) Math.min(Integer.MAX_VALUE, mTileEntity.getEUCapacity());
+ mStorageLong = mTileEntity.getEUCapacity();
+ mEnergy = (int) Math.min(Integer.MAX_VALUE, mTileEntity.getStoredEU());
+ mEnergyLong = mTileEntity.getStoredEU();
+ mSteamStorage = (int) Math.min(Integer.MAX_VALUE, mTileEntity.getSteamCapacity());
+ mSteam = (int) Math.min(Integer.MAX_VALUE, mTileEntity.getStoredSteam());
+ mOutput = (int) Math.min(Integer.MAX_VALUE, mTileEntity.getOutputVoltage());
+ mInput = (int) Math.min(Integer.MAX_VALUE, mTileEntity.getInputVoltage());
+ mDisplayErrorCode = mTileEntity.getErrorDisplayID();
+ mProgressTime = mTileEntity.getProgress();
+ mMaxProgressTime = mTileEntity.getMaxProgress();
+ mActive = mTileEntity.isActive() ? 1 : 0;
+ mTimer++;
+
+ for (ICrafting player : this.crafters) {
+ if (mTimer % 500 == 10 || oEnergy != mEnergy) {
+ player.sendProgressBarUpdate(this, 0, mEnergy & 65535);
+ player.sendProgressBarUpdate(this, 1, mEnergy >>> 16);
+ }
+ if (mTimer % 500 == 10 || oStorage != mStorage) {
+ player.sendProgressBarUpdate(this, 2, mStorage & 65535);
+ player.sendProgressBarUpdate(this, 3, mStorage >>> 16);
+ }
+ if (mTimer % 500 == 10 || oOutput != mOutput) {
+ player.sendProgressBarUpdate(this, 4, mOutput);
+ }
+ if (mTimer % 500 == 10 || oInput != mInput) {
+ player.sendProgressBarUpdate(this, 5, mInput);
+ }
+ if (mTimer % 500 == 10 || oDisplayErrorCode != mDisplayErrorCode) {
+ player.sendProgressBarUpdate(this, 6, mDisplayErrorCode);
+ }
+ if (mTimer % 500 == 10 || oProgressTime != mProgressTime) {
+ player.sendProgressBarUpdate(this, 11, mProgressTime & 65535);
+ player.sendProgressBarUpdate(this, 12, mProgressTime >>> 16);
+ }
+ if (mTimer % 500 == 10 || oMaxProgressTime != mMaxProgressTime) {
+ player.sendProgressBarUpdate(this, 13, mMaxProgressTime & 65535);
+ player.sendProgressBarUpdate(this, 14, mMaxProgressTime >>> 16);
+ }
+ if (mTimer % 500 == 10 || oID != mID) {
+ player.sendProgressBarUpdate(this, 15, mID);
+ }
+ if (mTimer % 500 == 10 || oActive != mActive) {
+ player.sendProgressBarUpdate(this, 16, mActive);
+ }
+ if (mTimer % 500 == 10 || oSteam != mSteam) {
+ player.sendProgressBarUpdate(this, 17, mSteam & 65535);
+ player.sendProgressBarUpdate(this, 18, mSteam >>> 16);
+ }
+ if (mTimer % 500 == 10 || oSteamStorage != mSteamStorage) {
+ player.sendProgressBarUpdate(this, 19, mSteamStorage & 65535);
+ player.sendProgressBarUpdate(this, 20, mSteamStorage >>> 16);
+ }
+ if (mTimer % 500 == 10 || oEnergyLong != mEnergyLong) {
+ player.sendProgressBarUpdate(this, 21, (int) mEnergyLong);
+ player.sendProgressBarUpdate(this, 22, (int) (mEnergyLong >>> 32));
+ }
+ if (mTimer % 500 == 10 || oStorageLong != mStorageLong) {
+ player.sendProgressBarUpdate(this, 23, (int) mStorageLong);
+ player.sendProgressBarUpdate(this, 24, (int) (mStorageLong >>> 32));
+ }
+ }
+
+ oID = mID;
+ oSteam = mSteam;
+ oInput = mInput;
+ oActive = mActive;
+ oOutput = mOutput;
+ oEnergy = mEnergy;
+ oEnergyLong = mEnergyLong;
+ oStorage = mStorage;
+ oStorageLong = mStorageLong;
+ oSteamStorage = mSteamStorage;
+ oProgressTime = mProgressTime;
+ oMaxProgressTime = mMaxProgressTime;
+ oDisplayErrorCode = mDisplayErrorCode;
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void updateProgressBar(int id, int value) {
+ super.updateProgressBar(id, value);
+ switch (id) {
+ case 0 -> mEnergy = mEnergy & 0xffff0000 | value & 0x0000ffff;
+ case 1 -> mEnergy = mEnergy & 0x0000ffff | value << 16;
+ case 2 -> mStorage = mStorage & 0xffff0000 | value & 0x0000ffff;
+ case 3 -> mStorage = mStorage & 0x0000ffff | value << 16;
+ case 4 -> mOutput = value;
+ case 5 -> mInput = value;
+ case 6 -> mDisplayErrorCode = value;
+ case 11 -> mProgressTime = mProgressTime & 0xffff0000 | value;
+ case 12 -> mProgressTime = mProgressTime & 0x0000ffff | value << 16;
+ case 13 -> mMaxProgressTime = mMaxProgressTime & 0xffff0000 | value & 0x0000ffff;
+ case 14 -> mMaxProgressTime = mMaxProgressTime & 0x0000ffff | value << 16;
+ case 15 -> mID = value;
+ case 16 -> mActive = value;
+ case 17 -> mSteam = mSteam & 0xffff0000 | value & 0x0000ffff;
+ case 18 -> mSteam = mSteam & 0x0000ffff | value << 16;
+ case 19 -> mSteamStorage = mSteamStorage & 0xffff0000 | value & 0x0000ffff;
+ case 20 -> mSteamStorage = mSteamStorage & 0x0000ffff | value << 16;
+ case 21 -> mEnergyLong = mEnergyLong & 0xffffffff00000000L | value & 0x00000000ffffffffL;
+ case 22 -> mEnergyLong = mEnergyLong & 0x00000000ffffffffL | (long) value << 32;
+ case 23 -> mStorageLong = mStorageLong & 0xffffffff00000000L | value & 0x00000000ffffffffL;
+ case 24 -> mStorageLong = mStorageLong & 0x00000000ffffffffL | (long) value << 32;
+ }
+ }
+
+ @Override
+ public boolean canInteractWith(EntityPlayer player) {
+ return mTileEntity.isUseableByPlayer(player);
+ }
+
+ @Deprecated
+ public String trans(String aKey, String aEnglish) {
+ return GT_Utility.trans(aKey, aEnglish);
+ }
+
+ public void setCircuitSlotClickCallback(Runnable circuitSlotClickCallback) {
+ this.circuitSlotClickCallback = circuitSlotClickCallback;
+ }
+
+ @Override
+ public ItemStack slotClick(int aSlotNumber, int aMouseclick, int aShifthold, EntityPlayer aPlayer) {
+ if (mTileEntity.getMetaTileEntity() instanceof IConfigurationCircuitSupport) {
+ IMetaTileEntity machine = mTileEntity.getMetaTileEntity();
+ IConfigurationCircuitSupport ccs = (IConfigurationCircuitSupport) machine;
+ if (ccs.allowSelectCircuit() && aSlotNumber == ccs.getCircuitGUISlot() && aMouseclick < 2) {
+ ItemStack newCircuit;
+ if (aShifthold == 1) {
+ if (aMouseclick == 0) {
+ if (circuitSlotClickCallback != null) circuitSlotClickCallback.run();
+ return null;
+ } else {
+ // clear
+ newCircuit = null;
+ }
+ } else {
+ ItemStack cursorStack = aPlayer.inventory.getItemStack();
+ List<ItemStack> tCircuits = ccs.getConfigurationCircuits();
+ int index = GT_Utility.findMatchingStackInList(tCircuits, cursorStack);
+ if (index < 0) {
+ int curIndex = GT_Utility
+ .findMatchingStackInList(tCircuits, machine.getStackInSlot(ccs.getCircuitSlot())) + 1;
+ if (aMouseclick == 0) {
+ curIndex += 1;
+ } else {
+ curIndex -= 1;
+ }
+ curIndex = Math.floorMod(curIndex, tCircuits.size() + 1) - 1;
+ newCircuit = curIndex < 0 ? null : tCircuits.get(curIndex);
+ } else {
+ // set to whatever it is
+ newCircuit = tCircuits.get(index);
+ }
+ }
+ mTileEntity.setInventorySlotContents(ccs.getCircuitSlot(), newCircuit);
+ return newCircuit;
+ }
+ }
+ return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_Container_1by1.java b/src/main/java/gregtech/api/gui/GT_Container_1by1.java
new file mode 100644
index 0000000000..06efaee5ef
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_Container_1by1.java
@@ -0,0 +1,30 @@
+package gregtech.api.gui;
+
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Slot;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+@Deprecated
+public class GT_Container_1by1 extends GT_ContainerMetaTile_Machine {
+
+ public GT_Container_1by1(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity) {
+ super(aInventoryPlayer, aTileEntity);
+ }
+
+ @Override
+ public void addSlots(InventoryPlayer aInventoryPlayer) {
+ addSlotToContainer(new Slot(mTileEntity, 0, 80, 35));
+ super.addSlots(aInventoryPlayer);
+ }
+
+ @Override
+ public int getSlotCount() {
+ return 1;
+ }
+
+ @Override
+ public int getShiftClickSlotCount() {
+ return 1;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_Container_2by2.java b/src/main/java/gregtech/api/gui/GT_Container_2by2.java
new file mode 100644
index 0000000000..4e3584a0a6
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_Container_2by2.java
@@ -0,0 +1,33 @@
+package gregtech.api.gui;
+
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Slot;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+@Deprecated
+public class GT_Container_2by2 extends GT_ContainerMetaTile_Machine {
+
+ public GT_Container_2by2(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity) {
+ super(aInventoryPlayer, aTileEntity);
+ }
+
+ @Override
+ public void addSlots(InventoryPlayer aInventoryPlayer) {
+ addSlotToContainer(new Slot(mTileEntity, 0, 71, 26));
+ addSlotToContainer(new Slot(mTileEntity, 1, 89, 26));
+ addSlotToContainer(new Slot(mTileEntity, 2, 71, 44));
+ addSlotToContainer(new Slot(mTileEntity, 3, 89, 44));
+ super.addSlots(aInventoryPlayer);
+ }
+
+ @Override
+ public int getSlotCount() {
+ return 4;
+ }
+
+ @Override
+ public int getShiftClickSlotCount() {
+ return 4;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_Container_3by3.java b/src/main/java/gregtech/api/gui/GT_Container_3by3.java
new file mode 100644
index 0000000000..4c0f7f946b
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_Container_3by3.java
@@ -0,0 +1,38 @@
+package gregtech.api.gui;
+
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Slot;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+@Deprecated
+public class GT_Container_3by3 extends GT_ContainerMetaTile_Machine {
+
+ public GT_Container_3by3(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity) {
+ super(aInventoryPlayer, aTileEntity);
+ }
+
+ @Override
+ public void addSlots(InventoryPlayer aInventoryPlayer) {
+ addSlotToContainer(new Slot(mTileEntity, 0, 62, 17));
+ addSlotToContainer(new Slot(mTileEntity, 1, 80, 17));
+ addSlotToContainer(new Slot(mTileEntity, 2, 98, 17));
+ addSlotToContainer(new Slot(mTileEntity, 3, 62, 35));
+ addSlotToContainer(new Slot(mTileEntity, 4, 80, 35));
+ addSlotToContainer(new Slot(mTileEntity, 5, 98, 35));
+ addSlotToContainer(new Slot(mTileEntity, 6, 62, 53));
+ addSlotToContainer(new Slot(mTileEntity, 7, 80, 53));
+ addSlotToContainer(new Slot(mTileEntity, 8, 98, 53));
+ super.addSlots(aInventoryPlayer);
+ }
+
+ @Override
+ public int getSlotCount() {
+ return 9;
+ }
+
+ @Override
+ public int getShiftClickSlotCount() {
+ return 9;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_Container_4by4.java b/src/main/java/gregtech/api/gui/GT_Container_4by4.java
new file mode 100644
index 0000000000..db5cde4cfe
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_Container_4by4.java
@@ -0,0 +1,45 @@
+package gregtech.api.gui;
+
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Slot;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+@Deprecated
+public class GT_Container_4by4 extends GT_ContainerMetaTile_Machine {
+
+ public GT_Container_4by4(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity) {
+ super(aInventoryPlayer, aTileEntity);
+ }
+
+ @Override
+ public void addSlots(InventoryPlayer aInventoryPlayer) {
+ addSlotToContainer(new Slot(mTileEntity, 0, 53, 8));
+ addSlotToContainer(new Slot(mTileEntity, 1, 71, 8));
+ addSlotToContainer(new Slot(mTileEntity, 2, 89, 8));
+ addSlotToContainer(new Slot(mTileEntity, 3, 107, 8));
+ addSlotToContainer(new Slot(mTileEntity, 4, 53, 26));
+ addSlotToContainer(new Slot(mTileEntity, 5, 71, 26));
+ addSlotToContainer(new Slot(mTileEntity, 6, 89, 26));
+ addSlotToContainer(new Slot(mTileEntity, 7, 107, 26));
+ addSlotToContainer(new Slot(mTileEntity, 8, 53, 44));
+ addSlotToContainer(new Slot(mTileEntity, 9, 71, 44));
+ addSlotToContainer(new Slot(mTileEntity, 10, 89, 44));
+ addSlotToContainer(new Slot(mTileEntity, 11, 107, 44));
+ addSlotToContainer(new Slot(mTileEntity, 12, 53, 62));
+ addSlotToContainer(new Slot(mTileEntity, 13, 71, 62));
+ addSlotToContainer(new Slot(mTileEntity, 14, 89, 62));
+ addSlotToContainer(new Slot(mTileEntity, 15, 107, 62));
+ super.addSlots(aInventoryPlayer);
+ }
+
+ @Override
+ public int getSlotCount() {
+ return 16;
+ }
+
+ @Override
+ public int getShiftClickSlotCount() {
+ return 16;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_Container_BasicTank.java b/src/main/java/gregtech/api/gui/GT_Container_BasicTank.java
new file mode 100644
index 0000000000..403de4bab5
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_Container_BasicTank.java
@@ -0,0 +1,138 @@
+package gregtech.api.gui;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.ICrafting;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.interfaces.IFluidAccess;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * The Container I use for all my Basic Tanks
+ */
+public class GT_Container_BasicTank extends GT_ContainerMetaTile_Machine {
+
+ public int mContent = 0;
+ protected int oContent = 0;
+
+ public GT_Container_BasicTank(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity) {
+ super(aInventoryPlayer, aTileEntity);
+ }
+
+ /**
+ * Subclasses must ensure third slot (aSlotIndex==2) is drainable fluid display item slot. Otherwise, subclasses
+ * must intercept the appropriate the slotClick event and call super.slotClick(2, xxx) if necessary
+ */
+ @Override
+ public void addSlots(InventoryPlayer aInventoryPlayer) {
+ addSlotToContainer(new Slot(mTileEntity, 0, 80, 17));
+ addSlotToContainer(new GT_Slot_Output(mTileEntity, 1, 80, 53));
+ addSlotToContainer(new GT_Slot_Render(mTileEntity, 2, 59, 42));
+ }
+
+ @Override
+ public ItemStack slotClick(int aSlotIndex, int aMouseclick, int aShifthold, EntityPlayer aPlayer) {
+ if (aSlotIndex == 2 && aMouseclick < 2) {
+ GT_MetaTileEntity_BasicTank tTank = (GT_MetaTileEntity_BasicTank) mTileEntity.getMetaTileEntity();
+ if (mTileEntity.isClientSide()) {
+ /*
+ * While a logical client don't really need to process fluid cells upon click (it could have just wait
+ * for server side to send the result), doing so would result in every fluid interaction having a
+ * noticeable delay between clicking and changes happening even on single player. I'd imagine this lag
+ * to become only more severe when playing MP over ethernet, which would have much more latency than a
+ * memory connection
+ */
+ Slot slot = inventorySlots.get(aSlotIndex);
+ tTank.setDrainableStack(GT_Utility.getFluidFromDisplayStack(slot.getStack()));
+ }
+ IFluidAccess tDrainableAccess = constructFluidAccess(tTank, false);
+ return handleFluidSlotClick(
+ tDrainableAccess,
+ aPlayer,
+ aMouseclick == 0,
+ true,
+ !tTank.isDrainableStackSeparate());
+ }
+ return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
+ }
+
+ @Override
+ public void detectAndSendChanges() {
+ super.detectAndSendChanges();
+ if (mTileEntity.isClientSide() || mTileEntity.getMetaTileEntity() == null) return;
+ if (((GT_MetaTileEntity_BasicTank) mTileEntity.getMetaTileEntity()).mFluid != null)
+ mContent = ((GT_MetaTileEntity_BasicTank) mTileEntity.getMetaTileEntity()).mFluid.amount;
+ else mContent = 0;
+ sendProgressBar();
+ oContent = mContent;
+ }
+
+ public void sendProgressBar() {
+ for (ICrafting player : this.crafters) {
+ if (mTimer % 500 == 0 || oContent != mContent) {
+ player.sendProgressBarUpdate(this, 100, mContent & 65535);
+ player.sendProgressBarUpdate(this, 101, mContent >>> 16);
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void updateProgressBar(int id, int value) {
+ super.updateProgressBar(id, value);
+ switch (id) {
+ case 100 -> mContent = mContent & 0xffff0000 | value & 0x0000ffff;
+ case 101 -> mContent = mContent & 0xffff | value << 16;
+ }
+ }
+
+ @Override
+ public int getSlotCount() {
+ return 2;
+ }
+
+ @Override
+ public int getShiftClickSlotCount() {
+ return 1;
+ }
+
+ protected IFluidAccess constructFluidAccess(GT_MetaTileEntity_BasicTank aTank, boolean aIsFillableStack) {
+ return new BasicTankFluidAccess(aTank, aIsFillableStack);
+ }
+
+ static class BasicTankFluidAccess implements IFluidAccess {
+
+ protected final GT_MetaTileEntity_BasicTank mTank;
+ protected final boolean mIsFillableStack;
+
+ public BasicTankFluidAccess(GT_MetaTileEntity_BasicTank aTank, boolean aIsFillableStack) {
+ this.mTank = aTank;
+ this.mIsFillableStack = aIsFillableStack;
+ }
+
+ @Override
+ public void set(FluidStack stack) {
+ if (mIsFillableStack) mTank.setFillableStack(stack);
+ else mTank.setDrainableStack(stack);
+ }
+
+ @Override
+ public FluidStack get() {
+ return mIsFillableStack ? mTank.getFillableStack() : mTank.getDrainableStack();
+ }
+
+ @Override
+ public int getCapacity() {
+ return mTank.getCapacity();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_Container_MultiMachine.java b/src/main/java/gregtech/api/gui/GT_Container_MultiMachine.java
new file mode 100644
index 0000000000..142b84e008
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_Container_MultiMachine.java
@@ -0,0 +1,39 @@
+package gregtech.api.gui;
+
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Slot;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * The Container I use for all my Basic Machines
+ */
+@Deprecated
+public class GT_Container_MultiMachine extends GT_ContainerMetaTile_Machine {
+
+ public GT_Container_MultiMachine(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity) {
+ super(aInventoryPlayer, aTileEntity);
+ }
+
+ public GT_Container_MultiMachine(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity,
+ boolean bindInventory) {
+ super(aInventoryPlayer, aTileEntity, bindInventory);
+ }
+
+ @Override
+ public void addSlots(InventoryPlayer aInventoryPlayer) {
+ addSlotToContainer(new Slot(mTileEntity, 1, 152, 5));
+ }
+
+ @Override
+ public int getSlotCount() {
+ return 1;
+ }
+
+ @Override
+ public int getShiftClickSlotCount() {
+ return 1;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIColorOverride.java b/src/main/java/gregtech/api/gui/GT_GUIColorOverride.java
new file mode 100644
index 0000000000..304e792a2a
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUIColorOverride.java
@@ -0,0 +1,92 @@
+package gregtech.api.gui;
+
+import java.util.concurrent.ExecutionException;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.resources.IResource;
+import net.minecraft.util.ResourceLocation;
+
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.util.concurrent.UncheckedExecutionException;
+
+import cpw.mods.fml.relauncher.FMLLaunchHandler;
+import cpw.mods.fml.relauncher.Side;
+import gregtech.api.GregTech_API;
+import gregtech.api.util.ColorsMetadataSection;
+
+public class GT_GUIColorOverride {
+
+ private static final Object NOT_FOUND = new Object();
+ private static final LoadingCache<ResourceLocation, Object> cache = CacheBuilder.newBuilder()
+ .softValues()
+ .build(new CacheLoader<>() {
+
+ @Override
+ public Object load(@Nonnull ResourceLocation key) throws Exception {
+ IResource ir = Minecraft.getMinecraft()
+ .getResourceManager()
+ .getResource(key);
+ if (ir.hasMetadata()) return ir.getMetadata("colors");
+ // return a dummy
+ // object because
+ // LoadingCache
+ // doesn't like null
+ return NOT_FOUND;
+ }
+ });
+ private static final GT_GUIColorOverride FALLBACK = new GT_GUIColorOverride();
+ private ColorsMetadataSection cmSection;
+
+ public static GT_GUIColorOverride get(String fullLocation) {
+ // see other get for more info
+ if (FMLLaunchHandler.side() != Side.CLIENT) return FALLBACK;
+ return new GT_GUIColorOverride(new ResourceLocation(fullLocation));
+ }
+
+ public static GT_GUIColorOverride get(ResourceLocation path) {
+ // use dummy fallback if there isn't such thing as a resource pack.
+ // #side() usually has two possible return value, but since this might be called by test code, it might
+ // also return null when in test env. Using #isClient will cause a NPE. A plain inequality test won't.
+ // FMLCommonHandler's #getSide() might trigger a NPE when in test env, so no.
+ if (FMLLaunchHandler.side() != Side.CLIENT) return FALLBACK;
+ return new GT_GUIColorOverride(path);
+ }
+
+ private GT_GUIColorOverride() {
+ cmSection = null;
+ }
+
+ private GT_GUIColorOverride(ResourceLocation resourceLocation) {
+ try {
+ Object metadata = cache.get(resourceLocation);
+ if (metadata != NOT_FOUND) cmSection = (ColorsMetadataSection) metadata;
+ } catch (ExecutionException | UncheckedExecutionException ignore) {
+ // make sure it doesn't cache a failing entry
+ cache.invalidate(resourceLocation);
+ }
+ }
+
+ public int getTextColorOrDefault(String textType, int defaultColor) {
+ return sLoaded() ? cmSection.getTextColorOrDefault(textType, defaultColor) : defaultColor;
+ }
+
+ public int getGuiTintOrDefault(String key, int defaultColor) {
+ return sLoaded() ? cmSection.getGuiTintOrDefault(key, defaultColor) : defaultColor;
+ }
+
+ public boolean sGuiTintingEnabled() {
+ return sLoaded() ? cmSection.sGuiTintingEnabled() : GregTech_API.sColoredGUI;
+ }
+
+ public boolean sLoaded() {
+ return cmSection != null;
+ }
+
+ public static void onResourceManagerReload() {
+ cache.invalidateAll();
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainer.java b/src/main/java/gregtech/api/gui/GT_GUIContainer.java
new file mode 100644
index 0000000000..639bd56162
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUIContainer.java
@@ -0,0 +1,99 @@
+package gregtech.api.gui;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.Slot;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.input.Mouse;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * Main GUI-Container-Class which basically contains the Code needed to prevent crashes from improperly Coded Items.
+ */
+public class GT_GUIContainer extends GuiContainer {
+
+ public boolean mCrashed = false;
+
+ public ResourceLocation mGUIbackground;
+
+ public GT_GUIColorOverride colorOverride;
+
+ public String mGUIbackgroundPath;
+
+ public GT_GUIContainer(Container aContainer, String aGUIbackground) {
+ super(aContainer);
+ mGUIbackground = new ResourceLocation(mGUIbackgroundPath = aGUIbackground);
+ colorOverride = GT_GUIColorOverride.get(aGUIbackground);
+ }
+
+ protected int getTextColorOrDefault(String textType, int defaultColor) {
+ return colorOverride.getTextColorOrDefault(textType, defaultColor);
+ }
+
+ public int getLeft() {
+ return guiLeft;
+ }
+
+ public int getTop() {
+ return guiTop;
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
+ //
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(float parTicks, int mouseX, int mouseY) {
+ mc.renderEngine.bindTexture(mGUIbackground);
+ }
+
+ @Override
+ public void drawScreen(int mouseX, int mouseY, float parTicks) {
+ try {
+ super.drawScreen(mouseX, mouseY, parTicks);
+ } catch (Throwable e) {
+ try {
+ Tessellator.instance.draw();
+ } catch (Throwable f) {
+ //
+ }
+ }
+ }
+
+ @Override
+ public void handleMouseInput() {
+ int delta = Mouse.getEventDWheel();
+ if (delta != 0) {
+ int i = Mouse.getEventX() * this.width / this.mc.displayWidth;
+ int j = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1;
+ onMouseWheel(i, j, delta);
+ }
+ super.handleMouseInput();
+ }
+
+ protected void onMouseWheel(int mx, int my, int delta) {}
+
+ public boolean isMouseOverSlot(int slotIndex, int mx, int my) {
+ int size = inventorySlots.inventorySlots.size();
+ if (slotIndex < 0 || slotIndex >= size) {
+ // slot does not exist somehow. log and carry on
+ GT_FML_LOGGER.error("Slot {} required where only {} is present", slotIndex, size);
+ return false;
+ }
+ Slot slot = inventorySlots.getSlot(slotIndex);
+ return this.func_146978_c(slot.xDisplayPosition, slot.yDisplayPosition, 16, 16, mx, my);
+ }
+
+ /*
+ * @Override protected void drawSlotInventory(Slot slot) { try { super.drawSlotInventory(slot); } catch(Throwable e)
+ * { try { Tessellator.instance.draw(); } catch(Throwable f) {} if (!mCrashed) { GT_Log.out.
+ * println("Clientside Slot drawing Crash prevented. Seems one Itemstack causes Problems with negative Damage Values or the Wildcard Damage Value. This is absolutely NOT a Bug of the GregTech-Addon, so don't even think about reporting it to me, it's a Bug of the Mod, which belongs to the almost-crash-causing Item, so bug that Mods Author and not me! Did you hear it? NOT ME!!!"
+ * ); e.printStackTrace(); mCrashed = true; } } }
+ */
+}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainerMetaTile_Machine.java b/src/main/java/gregtech/api/gui/GT_GUIContainerMetaTile_Machine.java
new file mode 100644
index 0000000000..df395858a9
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUIContainerMetaTile_Machine.java
@@ -0,0 +1,271 @@
+package gregtech.api.gui;
+
+import java.util.List;
+
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.renderer.entity.RenderItem;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+
+import org.lwjgl.opengl.GL11;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.gui.widgets.GT_GuiCoverTabLine;
+import gregtech.api.gui.widgets.GT_GuiIcon;
+import gregtech.api.gui.widgets.GT_GuiSlotTooltip;
+import gregtech.api.gui.widgets.GT_GuiTabLine.DisplayStyle;
+import gregtech.api.gui.widgets.GT_GuiTabLine.GT_GuiTabIconSet;
+import gregtech.api.gui.widgets.GT_GuiTabLine.GT_ITabRenderer;
+import gregtech.api.gui.widgets.GT_GuiTooltip;
+import gregtech.api.gui.widgets.GT_GuiTooltipManager;
+import gregtech.api.gui.widgets.GT_GuiTooltipManager.GT_IToolTipRenderer;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.net.GT_Packet_SetConfigurationCircuit;
+import gregtech.api.util.GT_TooltipDataCache;
+import gregtech.api.util.GT_Util;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * The GUI-Container I use for all my MetaTileEntities
+ */
+public class GT_GUIContainerMetaTile_Machine extends GT_GUIContainer implements GT_IToolTipRenderer, GT_ITabRenderer {
+
+ public final GT_ContainerMetaTile_Machine mContainer;
+
+ protected final GT_GuiTooltipManager mTooltipManager = new GT_GuiTooltipManager();
+ protected final GT_TooltipDataCache mTooltipCache = new GT_TooltipDataCache();
+ private static final String GHOST_CIRCUIT_TOOLTIP = "GT5U.machines.select_circuit.tooltip";
+
+ private final int guiTint;
+
+ // Cover Tabs support. Subclasses can override display position, style and visuals by overriding setupCoverTabs
+ public GT_GuiCoverTabLine coverTabs;
+ private static final int COVER_TAB_LEFT = -16, COVER_TAB_TOP = 1, COVER_TAB_HEIGHT = 20, COVER_TAB_WIDTH = 18,
+ COVER_TAB_SPACING = 2;
+ private static final DisplayStyle COVER_TAB_X_DIR = DisplayStyle.NONE, COVER_TAB_Y_DIR = DisplayStyle.NORMAL;
+ private static final GT_GuiTabIconSet TAB_ICONSET = new GT_GuiTabIconSet(
+ GT_GuiIcon.TAB_NORMAL,
+ GT_GuiIcon.TAB_HIGHLIGHT,
+ GT_GuiIcon.TAB_DISABLED);
+
+ public GT_GUIContainerMetaTile_Machine(GT_ContainerMetaTile_Machine aContainer, String aGUIbackground) {
+ super(aContainer, aGUIbackground);
+ mContainer = aContainer;
+
+ DisplayStyle preferredDisplayStyle = GT_Mod.gregtechproxy.mCoverTabsVisible
+ ? (GT_Mod.gregtechproxy.mCoverTabsFlipped ? DisplayStyle.INVERSE : DisplayStyle.NORMAL)
+ : DisplayStyle.NONE;
+ setupCoverTabs(preferredDisplayStyle);
+
+ // Only setup tooltips if they're currently enabled.
+ if (GT_Mod.gregtechproxy.mTooltipVerbosity > 0 || GT_Mod.gregtechproxy.mTooltipShiftVerbosity > 0) {
+ setupTooltips();
+ }
+
+ guiTint = getColorization();
+ mContainer.setCircuitSlotClickCallback(this::openSelectCircuitDialog);
+ }
+
+ public GT_GUIContainerMetaTile_Machine(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity,
+ String aGUIbackground) {
+ this(new GT_ContainerMetaTile_Machine(aInventoryPlayer, aTileEntity), aGUIbackground);
+ }
+
+ /**
+ * Initialize the coverTabs object according to client preferences
+ */
+ protected void setupCoverTabs(DisplayStyle preferredDisplayStyle) {
+ coverTabs = new GT_GuiCoverTabLine(
+ this,
+ COVER_TAB_LEFT,
+ COVER_TAB_TOP,
+ COVER_TAB_HEIGHT,
+ COVER_TAB_WIDTH,
+ COVER_TAB_SPACING,
+ COVER_TAB_X_DIR,
+ COVER_TAB_Y_DIR,
+ preferredDisplayStyle,
+ getTabBackground(),
+ getMachine().getBaseMetaTileEntity(),
+ getColorization());
+ }
+
+ @Override
+ public void drawScreen(int mouseX, int mouseY, float parTicks) {
+ super.drawScreen(mouseX, mouseY, parTicks);
+ if (mc.thePlayer.inventory.getItemStack() == null) {
+ GL11.glPushMatrix();
+ GL11.glTranslatef(guiLeft, guiTop, 0.0F);
+ mTooltipManager.onTick(this, mouseX, mouseY);
+ GL11.glPopMatrix();
+ }
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(float parTicks, int mouseX, int mouseY) {
+ // Drawing tabs
+ coverTabs.drawTabs(parTicks, mouseX, mouseY);
+
+ // Applying machine coloration, which subclasses rely on
+ GL11.glColor3ub((byte) ((guiTint >> 16) & 0xFF), (byte) ((guiTint >> 8) & 0xFF), (byte) (guiTint & 0xFF));
+
+ // Binding machine's own texture, which subclasses rely on being set
+ super.drawGuiContainerBackgroundLayer(parTicks, mouseX, mouseY);
+ }
+
+ /**
+ * @return The color used to render this machine's GUI
+ */
+ private int getColorization() {
+ Dyes dye = Dyes.dyeWhite;
+ if (this.colorOverride.sLoaded()) {
+ if (this.colorOverride.sGuiTintingEnabled()) {
+ dye = getDyeFromIndex(mContainer.mTileEntity.getColorization());
+ return this.colorOverride.getGuiTintOrDefault(dye.mName, GT_Util.getRGBInt(dye.getRGBA()));
+ }
+ } else if (GregTech_API.sColoredGUI) {
+ if (GregTech_API.sMachineMetalGUI) {
+ dye = Dyes.MACHINE_METAL;
+ } else if (mContainer != null && mContainer.mTileEntity != null) {
+ dye = getDyeFromIndex(mContainer.mTileEntity.getColorization());
+ }
+ }
+ return GT_Util.getRGBInt(dye.getRGBA());
+ }
+
+ private Dyes getDyeFromIndex(short index) {
+ return index != -1 ? Dyes.get(index) : Dyes.MACHINE_METAL;
+ }
+
+ /**
+ * @return This machine's MetaTileEntity
+ */
+ private MetaTileEntity getMachine() {
+ return (MetaTileEntity) mContainer.mTileEntity.getMetaTileEntity();
+ }
+
+ // Tabs support
+
+ @Override
+ protected void mouseClicked(int mouseX, int mouseY, int mouseButton) {
+ super.mouseClicked(mouseX, mouseY, mouseButton);
+ // Check for clicked tabs
+ coverTabs.onMouseClicked(mouseX, mouseY, mouseButton);
+ }
+
+ @Override
+ public void initGui() {
+ super.initGui();
+ // Perform layout of tabs
+ coverTabs.onInit();
+ }
+
+ /**
+ * @return the background textures used by this machine GUI's tabs
+ */
+ protected GT_GuiTabIconSet getTabBackground() {
+ return TAB_ICONSET;
+ }
+
+ // Tooltips support
+
+ /**
+ * Load data for and create appropriate tooltips for this machine. Only called when one of regular or shift tooltips
+ * are enabled.
+ */
+ protected void setupTooltips() {
+ if (mContainer.mTileEntity.getMetaTileEntity() instanceof IConfigurationCircuitSupport ccs) {
+ if (ccs.allowSelectCircuit()) addToolTip(
+ new GT_GuiSlotTooltip(
+ mContainer.getSlot(ccs.getCircuitGUISlot()),
+ mTooltipCache.getData(GHOST_CIRCUIT_TOOLTIP)));
+ }
+ }
+
+ // GT_IToolTipRenderer and GT_ITabRenderer implementations
+ @Override
+ public void drawHoveringText(List<String> text, int mouseX, int mouseY, FontRenderer font) {
+ super.drawHoveringText(text, mouseX, mouseY, font);
+ }
+
+ @Override
+ public int getGuiTop() {
+ return guiTop;
+ }
+
+ @Override
+ public int getGuiLeft() {
+ return guiLeft;
+ }
+
+ @Override
+ public int getXSize() {
+ return xSize;
+ }
+
+ @Override
+ public FontRenderer getFontRenderer() {
+ return fontRendererObj;
+ }
+
+ @Override
+ public RenderItem getItemRenderer() {
+ return itemRender;
+ }
+
+ @Override
+ public void addToolTip(GT_GuiTooltip toolTip) {
+ mTooltipManager.addToolTip(toolTip);
+ }
+
+ @Override
+ public boolean removeToolTip(GT_GuiTooltip toolTip) {
+ return mTooltipManager.removeToolTip(toolTip);
+ }
+
+ @Override
+ protected void onMouseWheel(int mx, int my, int delta) {
+ if (mContainer.mTileEntity.getMetaTileEntity() instanceof IConfigurationCircuitSupport ccs) {
+ Slot slotCircuit = mContainer.getSlot(ccs.getCircuitGUISlot());
+ if (slotCircuit != null
+ && func_146978_c(slotCircuit.xDisplayPosition, slotCircuit.yDisplayPosition, 16, 16, mx, my)) {
+ // emulate click
+ handleMouseClick(slotCircuit, -1, delta > 0 ? 1 : 0, 0);
+ return;
+ }
+ }
+ super.onMouseWheel(mx, my, delta);
+ }
+
+ private void openSelectCircuitDialog() {
+ IMetaTileEntity machine = mContainer.mTileEntity.getMetaTileEntity();
+ IConfigurationCircuitSupport ccs = (IConfigurationCircuitSupport) machine;
+ List<ItemStack> circuits = ccs.getConfigurationCircuits();
+ mc.displayGuiScreen(
+ new GT_GUIDialogSelectItem(
+ StatCollector.translateToLocal("GT5U.machines.select_circuit"),
+ machine.getStackForm(0),
+ this,
+ this::onCircuitSelected,
+ circuits,
+ GT_Utility.findMatchingStackInList(circuits, machine.getStackInSlot(ccs.getCircuitSlot()))));
+ }
+
+ private void onCircuitSelected(ItemStack selected) {
+ GT_Values.NW.sendToServer(new GT_Packet_SetConfigurationCircuit(mContainer.mTileEntity, selected));
+ // we will not do any validation on client side
+ // it doesn't get to actually decide what inventory contains anyway
+ IConfigurationCircuitSupport ccs = (IConfigurationCircuitSupport) mContainer.mTileEntity.getMetaTileEntity();
+ mContainer.mTileEntity.setInventorySlotContents(ccs.getCircuitSlot(), selected);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainer_1by1.java b/src/main/java/gregtech/api/gui/GT_GUIContainer_1by1.java
new file mode 100644
index 0000000000..5bd44668c5
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUIContainer_1by1.java
@@ -0,0 +1,42 @@
+package gregtech.api.gui;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraft.entity.player.InventoryPlayer;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+@Deprecated
+public class GT_GUIContainer_1by1 extends GT_GUIContainerMetaTile_Machine {
+
+ private final String mName;
+ private final int textColor = this.getTextColorOrDefault("title", 0x404040);
+
+ public GT_GUIContainer_1by1(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity, String aName) {
+ super(
+ new GT_Container_1by1(aInventoryPlayer, aTileEntity),
+ GregTech.getResourcePath("textures", "gui", "1by1.png"));
+ mName = aName;
+ }
+
+ public GT_GUIContainer_1by1(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity, String aName,
+ String aBackground) {
+ super(
+ new GT_Container_1by1(aInventoryPlayer, aTileEntity),
+ GregTech.getResourcePath("textures", "gui", aBackground + "1by1.png"));
+ mName = aName;
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
+ fontRendererObj.drawString(mName, 8, 4, textColor);
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(float parTicks, int mouseX, int mouseY) {
+ super.drawGuiContainerBackgroundLayer(parTicks, mouseX, mouseY);
+ int x = (width - xSize) / 2;
+ int y = (height - ySize) / 2;
+ drawTexturedModalRect(x, y, 0, 0, xSize, ySize);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainer_2by2.java b/src/main/java/gregtech/api/gui/GT_GUIContainer_2by2.java
new file mode 100644
index 0000000000..107bcc3859
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUIContainer_2by2.java
@@ -0,0 +1,42 @@
+package gregtech.api.gui;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraft.entity.player.InventoryPlayer;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+@Deprecated
+public class GT_GUIContainer_2by2 extends GT_GUIContainerMetaTile_Machine {
+
+ private final String mName;
+ private final int textColor = this.getTextColorOrDefault("title", 0x404040);
+
+ public GT_GUIContainer_2by2(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity, String aName) {
+ super(
+ new GT_Container_2by2(aInventoryPlayer, aTileEntity),
+ GregTech.getResourcePath("textures", "gui", "2by2.png"));
+ mName = aName;
+ }
+
+ public GT_GUIContainer_2by2(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity, String aName,
+ String aBackground) {
+ super(
+ new GT_Container_2by2(aInventoryPlayer, aTileEntity),
+ GregTech.getResourcePath("textures", "gui", aBackground + "2by2.png"));
+ mName = aName;
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
+ fontRendererObj.drawString(mName, 8, 4, textColor);
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(float parTicks, int mouseX, int mouseY) {
+ super.drawGuiContainerBackgroundLayer(parTicks, mouseX, mouseY);
+ int x = (width - xSize) / 2;
+ int y = (height - ySize) / 2;
+ drawTexturedModalRect(x, y, 0, 0, xSize, ySize);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainer_3by3.java b/src/main/java/gregtech/api/gui/GT_GUIContainer_3by3.java
new file mode 100644
index 0000000000..0c8b63664a
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUIContainer_3by3.java
@@ -0,0 +1,42 @@
+package gregtech.api.gui;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraft.entity.player.InventoryPlayer;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+@Deprecated
+public class GT_GUIContainer_3by3 extends GT_GUIContainerMetaTile_Machine {
+
+ private final String mName;
+ private final int textColor = this.getTextColorOrDefault("title", 0x404040);
+
+ public GT_GUIContainer_3by3(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity, String aName) {
+ super(
+ new GT_Container_3by3(aInventoryPlayer, aTileEntity),
+ GregTech.getResourcePath("textures", "gui", "3by3.png"));
+ mName = aName;
+ }
+
+ public GT_GUIContainer_3by3(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity, String aName,
+ String aBackground) {
+ super(
+ new GT_Container_3by3(aInventoryPlayer, aTileEntity),
+ GregTech.getResourcePath("textures", "gui", aBackground + "3by3.png"));
+ mName = aName;
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
+ fontRendererObj.drawString(mName, 8, 4, textColor);
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(float parTicks, int mouseX, int mouseY) {
+ super.drawGuiContainerBackgroundLayer(parTicks, mouseX, mouseY);
+ int x = (width - xSize) / 2;
+ int y = (height - ySize) / 2;
+ drawTexturedModalRect(x, y, 0, 0, xSize, ySize);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainer_4by4.java b/src/main/java/gregtech/api/gui/GT_GUIContainer_4by4.java
new file mode 100644
index 0000000000..9e5d7f7155
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUIContainer_4by4.java
@@ -0,0 +1,42 @@
+package gregtech.api.gui;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraft.entity.player.InventoryPlayer;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+@Deprecated
+public class GT_GUIContainer_4by4 extends GT_GUIContainerMetaTile_Machine {
+
+ private final String mName;
+ private final int textColor = this.getTextColorOrDefault("title", 0x404040);
+
+ public GT_GUIContainer_4by4(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity, String aName) {
+ super(
+ new GT_Container_4by4(aInventoryPlayer, aTileEntity),
+ GregTech.getResourcePath("textures", "gui", "4by4.png"));
+ mName = aName;
+ }
+
+ public GT_GUIContainer_4by4(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity, String aName,
+ String aBackground) {
+ super(
+ new GT_Container_4by4(aInventoryPlayer, aTileEntity),
+ GregTech.getResourcePath("textures", "gui", aBackground + "4by4.png"));
+ mName = aName;
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
+ fontRendererObj.drawString(mName, 8, 4, textColor);
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(float parTicks, int mouseX, int mouseY) {
+ super.drawGuiContainerBackgroundLayer(parTicks, mouseX, mouseY);
+ int x = (width - xSize) / 2;
+ int y = (height - ySize) / 2;
+ drawTexturedModalRect(x, y, 0, 0, xSize, ySize);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainer_BasicTank.java b/src/main/java/gregtech/api/gui/GT_GUIContainer_BasicTank.java
new file mode 100644
index 0000000000..54aa42d2a3
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUIContainer_BasicTank.java
@@ -0,0 +1,47 @@
+package gregtech.api.gui;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Utility;
+
+public class GT_GUIContainer_BasicTank extends GT_GUIContainerMetaTile_Machine {
+
+ private final String mName;
+ private final int textColor = this.getTextColorOrDefault("text", 0xFAFAFF),
+ textColorTitle = this.getTextColorOrDefault("title", 0x404040),
+ textColorValue = this.getTextColorOrDefault("value", 0xFAFAFF);
+
+ public GT_GUIContainer_BasicTank(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity, String aName) {
+ super(
+ new GT_Container_BasicTank(aInventoryPlayer, aTileEntity),
+ GregTech.getResourcePath("textures", "gui", "BasicTank.png"));
+ mName = aName;
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
+ fontRendererObj
+ .drawString(StatCollector.translateToLocal("container.inventory"), 8, ySize - 96 + 2, textColorTitle);
+ fontRendererObj.drawString(mName, 8, 6, textColorTitle);
+ if (mContainer != null) {
+ fontRendererObj.drawString("Liquid Amount", 10, 20, textColor);
+ fontRendererObj.drawString(
+ GT_Utility.parseNumberToString(((GT_Container_BasicTank) mContainer).mContent),
+ 10,
+ 30,
+ textColorValue);
+ }
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(float parTicks, int mouseX, int mouseY) {
+ super.drawGuiContainerBackgroundLayer(parTicks, mouseX, mouseY);
+ int x = (width - xSize) / 2;
+ int y = (height - ySize) / 2;
+ drawTexturedModalRect(x, y, 0, 0, xSize, ySize);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainer_MultiMachine.java b/src/main/java/gregtech/api/gui/GT_GUIContainer_MultiMachine.java
new file mode 100644
index 0000000000..3d9515b19a
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUIContainer_MultiMachine.java
@@ -0,0 +1,173 @@
+package gregtech.api.gui;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_DrillerBase;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * The GUI-Container I use for all my Basic Machines
+ */
+@Deprecated
+public class GT_GUIContainer_MultiMachine extends GT_GUIContainerMetaTile_Machine {
+
+ final String mName;
+ private final int textColor = this.getTextColorOrDefault("text", 0xFAFAFF),
+ textColorTitle = this.getTextColorOrDefault("title", 0xFAFAFF);
+
+ public GT_GUIContainer_MultiMachine(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity, String aName,
+ String aTextureFile) {
+ super(
+ new GT_Container_MultiMachine(aInventoryPlayer, aTileEntity),
+ GregTech.getResourcePath(
+ "textures",
+ "gui",
+ "multimachines",
+ aTextureFile == null ? "MultiblockDisplay" : aTextureFile));
+ mName = aName;
+ }
+
+ @Override
+ protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
+
+ // If text is drawn iterate down GUI 8 pixels (height of characters).
+ int line_counter = 7;
+ int max_chars_per_line = 26;
+
+ if (mName.length() > 26) {
+
+ // Split the machine name into an array, so we can try fit it on one line but if not use more.
+ String[] split = mName.split(" ");
+
+ int total_line_length = 0;
+ StringBuilder current_line = new StringBuilder();
+
+ int index = 0;
+
+ for (String str : split) {
+
+ total_line_length += str.length();
+
+ if (total_line_length > max_chars_per_line) {
+ fontRendererObj.drawString(current_line.toString(), 10, line_counter, textColorTitle);
+ line_counter += 8;
+ current_line = new StringBuilder();
+ index = 0;
+ total_line_length = str.length();
+ }
+
+ if (index == 0) {
+ current_line.append(str);
+ } else {
+ current_line.append(" ")
+ .append(str);
+ }
+ index++;
+ }
+ fontRendererObj.drawString(current_line.toString(), 10, line_counter, textColorTitle);
+ } else {
+ fontRendererObj.drawString(mName, 10, line_counter, textColorTitle);
+ }
+ line_counter += 8;
+
+ if (mContainer != null) { // (mWrench ? 0 : 1) | (mScrewdriver ? 0 : 2) | (mSoftHammer ? 0 : 4) | (mHardHammer ?
+ // 0 : 8)
+ // | (mSolderingTool ? 0 : 16) | (mCrowbar ? 0 : 32) | (mMachine ? 0 : 64));
+ if ((mContainer.mDisplayErrorCode & 1) != 0) {
+ fontRendererObj.drawString(GT_Utility.trans("132", "Pipe is loose."), 10, line_counter, textColor);
+ line_counter += 8;
+ }
+
+ if ((mContainer.mDisplayErrorCode & 2) != 0) {
+ fontRendererObj.drawString(GT_Utility.trans("133", "Screws are loose."), 10, line_counter, textColor);
+ line_counter += 8;
+ }
+
+ if ((mContainer.mDisplayErrorCode & 4) != 0) {
+ fontRendererObj.drawString(GT_Utility.trans("134", "Something is stuck."), 10, line_counter, textColor);
+ line_counter += 8;
+ }
+
+ if ((mContainer.mDisplayErrorCode & 8) != 0) {
+ fontRendererObj
+ .drawString(GT_Utility.trans("135", "Platings are dented."), 10, line_counter, textColor);
+ line_counter += 8;
+ }
+
+ if ((mContainer.mDisplayErrorCode & 16) != 0) {
+ fontRendererObj
+ .drawString(GT_Utility.trans("136", "Circuitry burned out."), 10, line_counter, textColor);
+ line_counter += 8;
+ }
+
+ if ((mContainer.mDisplayErrorCode & 32) != 0) {
+ fontRendererObj
+ .drawString(GT_Utility.trans("137", "That doesn't belong there."), 10, line_counter, textColor);
+ line_counter += 8;
+ }
+
+ if ((mContainer.mDisplayErrorCode & 64) != 0) {
+ fontRendererObj
+ .drawString(GT_Utility.trans("138", "Incomplete Structure."), 10, line_counter, textColor);
+ line_counter += 8;
+ }
+
+ if (mContainer.mDisplayErrorCode == 0) {
+ if (mContainer.mActive == 0) {
+ fontRendererObj
+ .drawString(GT_Utility.trans("139", "Hit with Soft Mallet"), 10, line_counter, textColor);
+ line_counter += 8;
+ fontRendererObj
+ .drawString(GT_Utility.trans("140", "to (re-)start the Machine"), 10, line_counter, textColor);
+ line_counter += 8;
+ fontRendererObj
+ .drawString(GT_Utility.trans("141", "if it doesn't start."), 10, line_counter, textColor);
+ } else {
+ fontRendererObj
+ .drawString(GT_Utility.trans("142", "Running perfectly."), 10, line_counter, textColor);
+ }
+ line_counter += 8;
+ if (mContainer.mTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_DrillerBase) {
+ ItemStack tItem = mContainer.mTileEntity.getMetaTileEntity()
+ .getStackInSlot(1);
+ if (tItem == null
+ || !GT_Utility.areStacksEqual(tItem, GT_ModHandler.getIC2Item("miningPipe", 1L))) {
+ fontRendererObj
+ .drawString(GT_Utility.trans("143", "Missing Mining Pipe"), 10, line_counter, textColor);
+ }
+ } else if (mContainer.mTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_LargeTurbine) {
+ ItemStack tItem = mContainer.mTileEntity.getMetaTileEntity()
+ .getStackInSlot(1);
+ if (tItem == null
+ || !(tItem.getItem() == GT_MetaGenerated_Tool_01.INSTANCE && tItem.getItemDamage() >= 170
+ && tItem.getItemDamage() <= 177)) {
+ fontRendererObj
+ .drawString(GT_Utility.trans("144", "Missing Turbine Rotor"), 10, line_counter, textColor);
+ }
+ }
+ }
+ }
+ }
+
+ @Deprecated
+ public String trans(String aKey, String aEnglish) {
+ return GT_Utility.trans(aKey, aEnglish);
+ }
+
+ @Override
+ protected void drawGuiContainerBackgroundLayer(float parTicks, int mouseX, int mouseY) {
+ super.drawGuiContainerBackgroundLayer(parTicks, mouseX, mouseY);
+ int x = (width - xSize) / 2;
+ int y = (height - ySize) / 2;
+ drawTexturedModalRect(x, y, 0, 0, xSize, ySize);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_GUICover.java b/src/main/java/gregtech/api/gui/GT_GUICover.java
new file mode 100644
index 0000000000..5729ada685
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUICover.java
@@ -0,0 +1,55 @@
+package gregtech.api.gui;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.net.GT_Packet_GtTileEntityGuiRequest;
+
+@Deprecated
+public abstract class GT_GUICover extends GT_GUIScreen {
+
+ public final ICoverable tile;
+ public int parentGuiId = -1;
+
+ public GT_GUICover(ICoverable tile, int width, int height, ItemStack cover) {
+ super(width, height, cover == null ? "" : cover.getDisplayName());
+ this.tile = tile;
+ headerIcon.setItem(cover);
+ }
+
+ @Override
+ public void updateScreen() {
+ super.updateScreen();
+ if (!tile.isUseableByPlayer(mc.thePlayer)) {
+ closeScreen();
+ }
+ }
+
+ /**
+ * The parent GUI to exit to. -1 is ignored.
+ *
+ * @param parentGuiId parent GUI ID
+ */
+ public void setParentGuiId(int parentGuiId) {
+ this.parentGuiId = parentGuiId;
+ }
+
+ @Override
+ public void closeScreen() {
+ // If this cover was given a guiId, tell the server to open it for us when this GUI closes.
+ if (parentGuiId != -1 && tile.isUseableByPlayer(mc.thePlayer)) {
+ GT_Values.NW.sendToServer(
+ new GT_Packet_GtTileEntityGuiRequest(
+ tile.getXCoord(),
+ tile.getYCoord(),
+ tile.getZCoord(),
+ parentGuiId,
+ tile.getWorld().provider.dimensionId,
+ mc.thePlayer.getEntityId()));
+ } else {
+ this.mc.displayGuiScreen(null);
+ this.mc.setIngameFocus();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIDialogSelectItem.java b/src/main/java/gregtech/api/gui/GT_GUIDialogSelectItem.java
new file mode 100644
index 0000000000..03a6fb2a70
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUIDialogSelectItem.java
@@ -0,0 +1,229 @@
+package gregtech.api.gui;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.gui.widgets.GT_GuiFakeItemButton;
+import gregtech.api.gui.widgets.GT_GuiIcon;
+import gregtech.api.gui.widgets.GT_GuiIconButton;
+import gregtech.api.util.GT_Utility;
+
+@Deprecated
+public class GT_GUIDialogSelectItem extends GT_GUIScreen {
+
+ public static final int UNSELECTED = -1;
+ private static final int cols = 9;
+ private static final int rows = 3;
+ private final int textColor = this.getTextColorOrDefault("text", 0xff555555);
+ private final GuiScreen parent;
+ private final Consumer<ItemStack> selectedCallback;
+ // passed in stack
+ private final List<ItemStack> stacks;
+ // all slots not including btnCurrent
+ private final List<GT_GuiFakeItemButton> slots = new ArrayList<>();
+ // the currently selected slot content
+ private final GT_GuiFakeItemButton btnCurrent = new GT_GuiFakeItemButton(this, 8, 25, GT_GuiIcon.SLOT_DARKGRAY)
+ .setMimicSlot(true);
+ private final boolean noDeselect;
+ private int selected;
+ private int scroll = 0;
+ private GT_GuiIconButton btnUp;
+ private GT_GuiIconButton btnDown;
+
+ public GT_GUIDialogSelectItem(String header, ItemStack headerItem, GuiScreen parent,
+ Consumer<ItemStack> selectedCallback, List<ItemStack> stacks) {
+ this(header, headerItem, parent, selectedCallback, stacks, UNSELECTED);
+ }
+
+ public GT_GUIDialogSelectItem(String header, ItemStack headerItem, GuiScreen parent,
+ Consumer<ItemStack> selectedCallback, List<ItemStack> stacks, int selected) {
+ this(header, headerItem, parent, selectedCallback, stacks, selected, false);
+ }
+
+ /**
+ * Open a dialog to select an item from given list. Given callback may be called zero or more times depending on
+ * user action.
+ *
+ * @param header Header text
+ * @param headerItem ItemStack to use as Dialog icon
+ * @param parent open which GUIScreen when this dialog is closed. use null if it has no parent.
+ * @param selectedCallback callback upon selected
+ * @param stacks list to choose from
+ * @param selected preselected item. Use {@link #UNSELECTED} for unselected. Invalid selected will be
+ * clamped to 0 or highest index
+ * @param noDeselect true if player cannot deselect, false otherwise. If this is set to true, selectedCallback
+ * is guaranteed to be called with a nonnull stack
+ */
+ public GT_GUIDialogSelectItem(String header, ItemStack headerItem, GuiScreen parent,
+ Consumer<ItemStack> selectedCallback, List<ItemStack> stacks, int selected, boolean noDeselect) {
+ super(176, 107, header);
+ this.noDeselect = noDeselect;
+ if (headerItem != null) this.headerIcon.setItem(headerItem);
+ this.parent = parent;
+ this.selectedCallback = selectedCallback;
+ this.stacks = stacks;
+
+ if (stacks.size() > rows * cols) {
+ btnUp = new GT_GuiIconButton(this, 0, 134, 25, GT_GuiIcon.GREEN_ARROW_UP);
+ btnDown = new GT_GuiIconButton(this, 1, 152, 25, GT_GuiIcon.GREEN_ARROW_DOWN);
+ }
+
+ for (int i = 0; i < rows; i++) {
+ for (int j = 0; j < cols; j++) {
+ slots.add(
+ new GT_GuiFakeItemButton(this, 8 + 18 * j, 44 + 18 * i, GT_GuiIcon.SLOT_GRAY).setMimicSlot(true));
+ }
+ }
+
+ setSelected(noDeselect ? Math.max(0, selected) : selected);
+ ensureSelectedDisplayed();
+ }
+
+ @Override
+ protected void onInitGui(int guiLeft, int guiTop, int gui_width, int gui_height) {
+ btnCurrent
+ .setX(8 + 2 + fontRendererObj.getStringWidth(StatCollector.translateToLocal("GT5U.gui.select.current")));
+ }
+
+ @Override
+ public void closeScreen() {
+ selectedCallback.accept(getCandidate(getSelected()));
+ mc.displayGuiScreen(parent);
+ if (parent == null) mc.setIngameFocus();
+ }
+
+ @Override
+ public void buttonClicked(GuiButton button) {
+ switch (button.id) {
+ case 0 -> {
+ setScroll(scroll - 1);
+ return;
+ }
+ case 1 -> {
+ setScroll(scroll + 1);
+ return;
+ }
+ }
+ super.buttonClicked(button);
+ }
+
+ @Override
+ public void drawExtras(int mouseX, int mouseY, float parTicks) {
+ int y = 25 + (18 - getFontRenderer().FONT_HEIGHT) / 2;
+ getFontRenderer().drawString(StatCollector.translateToLocal("GT5U.gui.select.current"), 8, y, textColor);
+ super.drawExtras(mouseX, mouseY, parTicks);
+ }
+
+ @Override
+ public void mouseClicked(int x, int y, int button) {
+ int mx = x - guiLeft, my = y - guiTop;
+ if (button == 0) {
+ if (btnCurrent.getBounds()
+ .contains(mx, my)) {
+ ensureSelectedDisplayed();
+ return;
+ }
+
+ for (int i = 0, slotsSize = slots.size(); i < slotsSize; i++) {
+ GT_GuiFakeItemButton slot = slots.get(i);
+ if (slot.getBounds()
+ .contains(mx, my)) {
+ setSelected(slotIndexToListIndex(i));
+ return;
+ }
+ }
+ } else if (button == 1 && getSelected() >= 0) {
+ if (btnCurrent.getBounds()
+ .contains(mx, my)) {
+ setSelected(UNSELECTED);
+ return;
+ }
+ GT_GuiFakeItemButton slot = getSlot(listIndexToSlotIndex(getSelected()));
+ if (slot != null && slot.getBounds()
+ .contains(mx, my)) {
+ setSelected(UNSELECTED);
+ }
+ }
+ super.mouseClicked(x, y, button);
+ }
+
+ @Override
+ public void onMouseWheel(int x, int y, int delta) {
+ if (delta < 0) setScroll(scroll + 1);
+ else if (delta > 0) setScroll(scroll - 1);
+ }
+
+ private void fillSlots() {
+ for (int i = 0, j = scroll * cols; i < slots.size(); i++, j++) {
+ slots.get(i)
+ .setItem(getCandidate(j))
+ .setBgIcon(j == getSelected() ? GT_GuiIcon.SLOT_DARKGRAY : GT_GuiIcon.SLOT_GRAY);
+ }
+ }
+
+ private void ensureSelectedDisplayed() {
+ if (getSelected() < scroll * cols) {
+ setScroll(getSelected() / cols);
+ } else if (getSelected() > (scroll + rows) * cols) {
+ setScroll((getSelected() - (rows - 1) * cols) / cols);
+ } else {
+ // called nonetheless to update button enabled states
+ setScroll(scroll);
+ }
+ }
+
+ private int slotIndexToListIndex(int index) {
+ int mapped = scroll * cols + index;
+ return mapped >= stacks.size() ? UNSELECTED : mapped;
+ }
+
+ private int listIndexToSlotIndex(int index) {
+ return index - scroll * cols;
+ }
+
+ public int getSelected() {
+ return selected;
+ }
+
+ public void setSelected(int selected) {
+ if (selected == this.selected) return;
+ int newSelected = GT_Utility.clamp(selected, UNSELECTED, stacks.size() - 1);
+
+ if (noDeselect && newSelected == UNSELECTED) return;
+
+ GT_GuiFakeItemButton selectedSlot = getSlot(this.selected);
+ if (selectedSlot != null) selectedSlot.setBgIcon(GT_GuiIcon.SLOT_GRAY);
+
+ this.selected = newSelected;
+
+ btnCurrent.setItem(getCandidate(this.selected));
+
+ selectedSlot = getSlot(this.selected);
+ if (selectedSlot != null) selectedSlot.setBgIcon(GT_GuiIcon.SLOT_DARKGRAY);
+ }
+
+ private void setScroll(int scroll) {
+ if (stacks.size() > rows * cols) {
+ int lo = 0;
+ int hi = (stacks.size() - rows * cols) / cols + 1;
+ this.scroll = GT_Utility.clamp(scroll, lo, hi);
+ btnUp.enabled = this.scroll != lo;
+ btnDown.enabled = this.scroll != hi;
+ }
+ fillSlots();
+ }
+
+ private ItemStack getCandidate(int listIndex) {
+ return listIndex < 0 || listIndex >= stacks.size() ? null : stacks.get(listIndex);
+ }
+
+ private GT_GuiFakeItemButton getSlot(int slotIndex) {
+ return slotIndex < 0 || slotIndex >= slots.size() ? null : slots.get(slotIndex);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIScreen.java b/src/main/java/gregtech/api/gui/GT_GUIScreen.java
new file mode 100644
index 0000000000..2ff2973792
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUIScreen.java
@@ -0,0 +1,327 @@
+package gregtech.api.gui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.gui.GuiTextField;
+import net.minecraft.client.renderer.RenderHelper;
+import net.minecraft.client.renderer.entity.RenderItem;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.input.Mouse;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.gui.widgets.GT_GuiFakeItemButton;
+import gregtech.api.gui.widgets.GT_GuiIntegerTextBox;
+import gregtech.api.gui.widgets.GT_GuiTooltip;
+import gregtech.api.gui.widgets.GT_GuiTooltipManager;
+import gregtech.api.gui.widgets.GT_GuiTooltipManager.GT_IToolTipRenderer;
+import gregtech.api.interfaces.IGuiScreen;
+
+@Deprecated
+public abstract class GT_GUIScreen extends GuiScreen implements GT_IToolTipRenderer, IGuiScreen {
+
+ protected final GT_GuiTooltipManager ttManager = new GT_GuiTooltipManager();
+
+ protected int gui_width = 176;
+ protected int gui_height = 107;
+ protected int guiTop, guiLeft;
+ protected final boolean drawButtons = true;
+ protected final ResourceLocation mGUIbackgroundLocation;
+
+ private GuiButton selectedButton;
+ private final GT_GUIColorOverride colorOverride;
+ private final int textColor;
+ private static final String guiTexturePath = "gregtech:textures/gui/GuiCover.png";
+
+ public String header;
+ public GT_GuiFakeItemButton headerIcon;
+
+ protected final List<IGuiElement> elements = new ArrayList<>();
+ protected final List<GT_GuiIntegerTextBox> textBoxes = new ArrayList<>();
+
+ public GT_GUIScreen(int width, int height, String header) {
+ this.gui_width = width;
+ this.gui_height = height;
+ this.header = header;
+ this.headerIcon = new GT_GuiFakeItemButton(this, 5, 5, null);
+ this.mGUIbackgroundLocation = new ResourceLocation(guiTexturePath);
+ this.colorOverride = GT_GUIColorOverride.get(guiTexturePath);
+ this.textColor = getTextColorOrDefault("title", 0xFF222222);
+ }
+
+ @Override
+ public void initGui() {
+ guiLeft = (this.width - this.gui_width) / 2;
+ guiTop = (this.height - this.gui_height) / 2;
+
+ for (IGuiElement element : elements) {
+ if (element instanceof GuiButton button) buttonList.add(button);
+ if (element instanceof GT_GuiIntegerTextBox) textBoxes.add((GT_GuiIntegerTextBox) element);
+ }
+
+ onInitGui(guiLeft, guiTop, gui_width, gui_height);
+
+ for (IGuiElement element : elements) {
+ element.onInit();
+ }
+ super.initGui();
+ }
+
+ protected abstract void onInitGui(int guiLeft, int guiTop, int gui_width, int gui_height);
+
+ protected int getTextColorOrDefault(String textType, int defaultColor) {
+ return colorOverride.getTextColorOrDefault(textType, defaultColor);
+ }
+
+ public void onMouseWheel(int x, int y, int delta) {}
+
+ @Override
+ public void handleMouseInput() {
+ int delta = Mouse.getEventDWheel();
+ if (delta != 0) {
+ int i = Mouse.getEventX() * this.width / this.mc.displayWidth;
+ int j = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1;
+ onMouseWheel(i, j, delta);
+ }
+ super.handleMouseInput();
+ }
+
+ @Override
+ public void drawScreen(int mouseX, int mouseY, float parTicks) {
+ drawDefaultBackground();
+
+ drawBackground(mouseX, mouseY, parTicks);
+
+ RenderHelper.disableStandardItemLighting();
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ if (drawButtons) {
+ RenderHelper.enableGUIStandardItemLighting();
+ for (IGuiElement e : elements) e.draw(mouseX, mouseY, parTicks);
+ }
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+
+ GL11.glPushMatrix();
+ GL11.glTranslatef(guiLeft, guiTop, 0.0F);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+
+ GL11.glDisable(GL11.GL_LIGHTING);
+ drawForegroundLayer(mouseX, mouseY, parTicks);
+ GL11.glEnable(GL11.GL_LIGHTING);
+
+ GL11.glPopMatrix();
+
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ RenderHelper.enableStandardItemLighting();
+ }
+
+ public void drawForegroundLayer(int mouseX, int mouseY, float parTicks) {
+ drawExtras(mouseX, mouseY, parTicks);
+ ttManager.onTick(this, mouseX, mouseY);
+ }
+
+ public void drawBackground(int mouseX, int mouseY, float parTicks) {
+ short[] color = Dyes.MACHINE_METAL.getRGBA();
+ GL11.glColor3ub((byte) color[0], (byte) color[1], (byte) color[2]);
+ this.mc.renderEngine.bindTexture(mGUIbackgroundLocation);
+ drawTexturedModalRect(guiLeft, guiTop, 0, 0, gui_width, gui_height);
+ }
+
+ public void drawExtras(int mouseX, int mouseY, float parTicks) {
+ this.fontRendererObj.drawString(header, 25, 9, textColor);
+ }
+
+ @Override
+ public boolean doesGuiPauseGame() {
+ return false;
+ }
+
+ public void closeScreen() {
+ this.mc.displayGuiScreen(null);
+ this.mc.setIngameFocus();
+ }
+
+ @Override
+ public void updateScreen() {
+ super.updateScreen();
+ for (GuiTextField f : textBoxes) {
+ f.updateCursorCounter();
+ }
+ }
+
+ @Override
+ public void mouseClicked(int x, int y, int button) {
+ for (GT_GuiIntegerTextBox tBox : textBoxes) {
+ boolean hadFocus = tBox.isFocused();
+ if (tBox.isEnabled() || hadFocus) tBox.mouseClicked(x, y, button);
+
+ if (tBox.isFocused() && button == 1 && tBox.isEnabled()) // rightclick -> lcear it
+ tBox.setText("0");
+ else if (hadFocus && !tBox.isFocused()) applyTextBox(tBox);
+ }
+ super.mouseClicked(x, y, button);
+ }
+
+ @Override
+ public void keyTyped(char c, int key) {
+ GT_GuiIntegerTextBox focusedTextBox = null;
+ for (GT_GuiIntegerTextBox textBox : textBoxes) {
+ if (textBox.isFocused()) focusedTextBox = textBox;
+ }
+
+ if (key == 1) { // esc
+ if (focusedTextBox != null) {
+ resetTextBox(focusedTextBox);
+ setFocusedTextBox(null);
+ } else {
+ closeScreen();
+ // don't fall through to parent
+ }
+ return;
+ }
+
+ if (c == '\t') { // tab
+ for (int i = 0; i < textBoxes.size(); i++) {
+ GT_GuiIntegerTextBox box = textBoxes.get(i);
+ if (box.isFocused()) {
+ applyTextBox(box);
+ setFocusedTextBox(((i + 1) < textBoxes.size()) ? textBoxes.get(i + 1) : null);
+ return;
+ }
+ }
+ if (!textBoxes.isEmpty()) setFocusedTextBox(textBoxes.get(0));
+ return;
+ }
+
+ if (focusedTextBox != null && focusedTextBox.textboxKeyTyped(c, key)) {
+ return;
+ }
+
+ if (key == 28 && focusedTextBox != null) { // enter
+ applyTextBox(focusedTextBox);
+ setFocusedTextBox(null);
+ return;
+ }
+
+ if (key == this.mc.gameSettings.keyBindInventory.getKeyCode()) {
+ if (focusedTextBox != null) {
+ applyTextBox(focusedTextBox);
+ setFocusedTextBox(null);
+ return;
+ }
+ closeScreen();
+ return;
+ }
+ super.keyTyped(c, key);
+ }
+
+ /**
+ * Button
+ */
+ @Override
+ public void actionPerformed(GuiButton button) {
+ selectedButton = button;
+ }
+
+ @Override
+ public void clearSelectedButton() {
+ selectedButton = null;
+ }
+
+ @Override
+ public GuiButton getSelectedButton() {
+ return selectedButton;
+ }
+
+ @Override
+ public void buttonClicked(GuiButton button) {}
+
+ /**
+ * TextBoxes
+ */
+ private void setFocusedTextBox(GT_GuiIntegerTextBox boxToFocus) {
+ for (GT_GuiIntegerTextBox textBox : textBoxes) {
+ textBox.setFocused(textBox.equals(boxToFocus) && textBox.isEnabled());
+ }
+ }
+
+ /**
+ * Given textbox's value might have changed.
+ */
+ public void applyTextBox(GT_GuiIntegerTextBox box) {}
+
+ /**
+ * Reset the given textbox to the last valid value, <b>NOT</b> 0.
+ */
+ public void resetTextBox(GT_GuiIntegerTextBox box) {}
+
+ /**
+ * GT_IToolTipRenderer
+ */
+ @Override
+ public void drawHoveringText(List<String> text, int mouseX, int mouseY, FontRenderer render) {
+ super.drawHoveringText(text, mouseX, mouseY, render);
+ }
+
+ @Override
+ public FontRenderer getFontRenderer() {
+ return super.fontRendererObj;
+ }
+
+ @Override
+ public void addToolTip(GT_GuiTooltip toolTip) {
+ ttManager.addToolTip(toolTip);
+ }
+
+ @Override
+ public boolean removeToolTip(GT_GuiTooltip toolTip) {
+ return ttManager.removeToolTip(toolTip);
+ }
+
+ /**
+ * Junk
+ */
+ @Override
+ public int getGuiTop() {
+ return guiTop;
+ }
+
+ @Override
+ public int getGuiLeft() {
+ return guiLeft;
+ }
+
+ @Override
+ public int getXSize() {
+ return gui_width;
+ }
+
+ @Override
+ public int getYSize() {
+ return gui_height;
+ }
+
+ @Override
+ public RenderItem getItemRenderer() {
+ return itemRender;
+ }
+
+ @Override
+ public void addElement(IGuiElement element) {
+ if (elements.contains(element)) return;
+ elements.add(element);
+ }
+
+ @Override
+ public boolean removeElement(IGuiElement element) {
+ return elements.remove(element);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_Slot_Armor.java b/src/main/java/gregtech/api/gui/GT_Slot_Armor.java
new file mode 100644
index 0000000000..1c48b01430
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_Slot_Armor.java
@@ -0,0 +1,30 @@
+package gregtech.api.gui;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+public class GT_Slot_Armor extends Slot {
+
+ final int mArmorType;
+ final EntityPlayer mPlayer;
+
+ public GT_Slot_Armor(IInventory inventory, int slotIndex, int xPos, int yPos, int armorType, EntityPlayer aPlayer) {
+ super(inventory, slotIndex, xPos, yPos);
+ mArmorType = armorType;
+ mPlayer = aPlayer;
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+
+ @Override
+ public boolean isItemValid(ItemStack aStack) {
+ return aStack != null && aStack.getItem() != null
+ && aStack.getItem()
+ .isValidArmor(aStack, mArmorType, mPlayer);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_Slot_DataOrb.java b/src/main/java/gregtech/api/gui/GT_Slot_DataOrb.java
new file mode 100644
index 0000000000..115b50ddb8
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_Slot_DataOrb.java
@@ -0,0 +1,19 @@
+package gregtech.api.gui;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+
+public class GT_Slot_DataOrb extends Slot {
+
+ public GT_Slot_DataOrb(IInventory inventory, int slotIndex, int xPos, int yPos) {
+ super(inventory, slotIndex, xPos, yPos);
+ }
+
+ @Override
+ public boolean isItemValid(ItemStack aStack) {
+ return ItemList.Tool_DataOrb.isStackEqual(aStack, false, true);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_Slot_Holo.java b/src/main/java/gregtech/api/gui/GT_Slot_Holo.java
new file mode 100644
index 0000000000..9b7b75f0b2
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_Slot_Holo.java
@@ -0,0 +1,77 @@
+package gregtech.api.gui;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class GT_Slot_Holo extends Slot {
+
+ public final int mSlotIndex;
+ public boolean mEnabled = true;
+ public boolean mCanInsertItem, mCanStackItem;
+ public int mMaxStacksize = 127;
+
+ public GT_Slot_Holo(IInventory inventory, int slotIndex, int xPos, int yPos, boolean aCanInsertItem,
+ boolean aCanStackItem, int aMaxStacksize) {
+ super(inventory, slotIndex, xPos, yPos);
+ mCanInsertItem = aCanInsertItem;
+ mCanStackItem = aCanStackItem;
+ mMaxStacksize = aMaxStacksize;
+ mSlotIndex = slotIndex;
+ }
+
+ @Override
+ public boolean isItemValid(ItemStack itemStack) {
+ return mCanInsertItem;
+ }
+
+ @Override
+ public int getSlotStackLimit() {
+ return mMaxStacksize;
+ }
+
+ @Override
+ public boolean getHasStack() {
+ return false;
+ }
+
+ @Override
+ public ItemStack decrStackSize(int amount) {
+ if (!mCanStackItem) return null;
+ return super.decrStackSize(amount);
+ }
+
+ @Override
+ public boolean canTakeStack(EntityPlayer player) {
+ return false;
+ }
+
+ /**
+ * Sets if this slot should be ignored in event-processing. For example, highlight the slot on mouseOver.
+ *
+ * @param enabled if the slot should be enabled
+ */
+ public void setEnabled(boolean enabled) {
+ mEnabled = enabled;
+ }
+
+ /**
+ * Use this value to determine whether to ignore this slot in event processing
+ */
+ public boolean isEnabled() {
+ return mEnabled;
+ }
+
+ /**
+ * This function controls whether to highlight the slot on mouseOver.
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean func_111238_b() {
+ return isEnabled();
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_Slot_Output.java b/src/main/java/gregtech/api/gui/GT_Slot_Output.java
new file mode 100644
index 0000000000..7c883ea2d1
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_Slot_Output.java
@@ -0,0 +1,17 @@
+package gregtech.api.gui;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+public class GT_Slot_Output extends Slot {
+
+ public GT_Slot_Output(IInventory inventory, int slotIndex, int xPos, int yPos) {
+ super(inventory, slotIndex, xPos, yPos);
+ }
+
+ @Override
+ public boolean isItemValid(ItemStack itemStack) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_Slot_Render.java b/src/main/java/gregtech/api/gui/GT_Slot_Render.java
new file mode 100644
index 0000000000..ae03ce83ea
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_Slot_Render.java
@@ -0,0 +1,24 @@
+package gregtech.api.gui;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+
+public class GT_Slot_Render extends GT_Slot_Holo {
+
+ public GT_Slot_Render(IInventory inventory, int slotIndex, int xPos, int yPos) {
+ super(inventory, slotIndex, xPos, yPos, false, false, 0);
+ }
+
+ /**
+ * NEI has a nice and "useful" Delete-All Function, which would delete the Content of this Slot. This is here to
+ * prevent that.
+ */
+ @Override
+ public void putStack(ItemStack aStack) {
+ if (inventory instanceof TileEntity && ((TileEntity) inventory).getWorldObj().isRemote) {
+ inventory.setInventorySlotContents(getSlotIndex(), aStack);
+ }
+ onSlotChanged();
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GUIHost.java b/src/main/java/gregtech/api/gui/GUIHost.java
new file mode 100644
index 0000000000..bbb94317c4
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GUIHost.java
@@ -0,0 +1,56 @@
+package gregtech.api.gui;
+
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizons.modularui.api.screen.ITileWithModularUI;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+public interface GUIHost extends ITileWithModularUI {
+
+ @Nonnull
+ @Override
+ default ModularWindow createWindow(UIBuildContext uiContext) {
+ Objects.requireNonNull(uiContext);
+ GUIProvider<?> gui = getGUI(uiContext);
+ return gui.openGUI(uiContext);
+ }
+
+ /**
+ * Width of the GUI when its being displayed
+ */
+ default int getWidth() {
+ return 170;
+ }
+
+ default int getHeight() {
+ return 192;
+ }
+
+ @Nonnull
+ GUIProvider<?> getGUI(@Nonnull UIBuildContext uiContext);
+
+ ItemStack getAsItem();
+
+ String getMachineName();
+
+ default boolean hasItemInput() {
+ return true;
+ }
+
+ default boolean hasItemOutput() {
+ return true;
+ }
+
+ default boolean hasFluidInput() {
+ return true;
+ }
+
+ default boolean hasFluidOutput() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GUIProvider.java b/src/main/java/gregtech/api/gui/GUIProvider.java
new file mode 100644
index 0000000000..6fec4aa52a
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GUIProvider.java
@@ -0,0 +1,38 @@
+package gregtech.api.gui;
+
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+public abstract class GUIProvider<T extends GUIHost> {
+
+ @Nonnull
+ protected final T host;
+
+ public GUIProvider(@Nonnull T host) {
+ this.host = host;
+ }
+
+ @Nonnull
+ public ModularWindow openGUI(@Nonnull UIBuildContext uiContext) {
+ Builder builder = Objects.requireNonNull(ModularWindow.builder(host.getWidth(), host.getHeight()));
+ if (shouldBindPlayerInventory()) {
+ builder.bindPlayerInventory(uiContext.getPlayer());
+ }
+ attachSynchHandlers(builder, uiContext);
+ addWidgets(builder, uiContext);
+ return Objects.requireNonNull(builder.build());
+ }
+
+ protected abstract void attachSynchHandlers(@Nonnull Builder builder, @Nonnull UIBuildContext uiContext);
+
+ protected abstract void addWidgets(@Nonnull Builder builder, @Nonnull UIBuildContext uiContext);
+
+ protected boolean shouldBindPlayerInventory() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/modularui/FallbackableSteamTexture.java b/src/main/java/gregtech/api/gui/modularui/FallbackableSteamTexture.java
new file mode 100644
index 0000000000..8de4bc4536
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/modularui/FallbackableSteamTexture.java
@@ -0,0 +1,89 @@
+package gregtech.api.gui.modularui;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.client.Minecraft;
+
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+
+import gregtech.api.enums.SteamVariant;
+
+public class FallbackableSteamTexture {
+
+ private final SteamTexture candidate;
+ private final Object fallback;
+ private final Map<SteamVariant, Boolean> useFallbackMap = new HashMap<>();
+
+ private static final List<FallbackableSteamTexture> ALL_INSTANCES = new ArrayList<>();
+
+ public FallbackableSteamTexture(SteamTexture candidate, SteamTexture fallback) {
+ this(candidate, (Object) fallback);
+ }
+
+ public FallbackableSteamTexture(SteamTexture candidate, FallbackableSteamTexture fallback) {
+ this(candidate, (Object) fallback);
+ }
+
+ public FallbackableSteamTexture(SteamTexture fallback) {
+ this(null, fallback);
+ }
+
+ private FallbackableSteamTexture(SteamTexture candidate, Object fallback) {
+ this.candidate = candidate;
+ this.fallback = fallback;
+ ALL_INSTANCES.add(this);
+ }
+
+ public UITexture get(SteamVariant steamVariant) {
+ verifyCandidate(steamVariant);
+ if (useFallbackMap.get(steamVariant)) {
+ return castFallback(steamVariant);
+ } else {
+ return candidate.get(steamVariant);
+ }
+ }
+
+ private void verifyCandidate(SteamVariant steamVariant) {
+ if (useFallbackMap.get(steamVariant) == null) {
+ boolean useFallback;
+ if (NetworkUtils.isDedicatedClient()) {
+ if (candidate == null) {
+ useFallback = true;
+ } else {
+ try {
+ Minecraft.getMinecraft()
+ .getResourceManager()
+ .getResource(candidate.get(steamVariant).location);
+ useFallback = false;
+ } catch (IOException e) {
+ useFallback = true;
+ }
+ }
+ } else {
+ useFallback = true;
+ }
+ useFallbackMap.put(steamVariant, useFallback);
+ }
+ }
+
+ private UITexture castFallback(SteamVariant steamVariant) {
+ if (fallback instanceof SteamTexture) {
+ return ((SteamTexture) fallback).get(steamVariant);
+ } else if (fallback instanceof FallbackableSteamTexture) {
+ return ((FallbackableSteamTexture) fallback).get(steamVariant);
+ } else {
+ throw new RuntimeException("Unexpected type found for fallback: " + fallback.getClass());
+ }
+ }
+
+ public static void reload() {
+ for (FallbackableSteamTexture t : ALL_INSTANCES) {
+ t.useFallbackMap.clear();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/modularui/GT_CoverUIBuildContext.java b/src/main/java/gregtech/api/gui/modularui/GT_CoverUIBuildContext.java
new file mode 100644
index 0000000000..f98d6099fc
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/modularui/GT_CoverUIBuildContext.java
@@ -0,0 +1,74 @@
+package gregtech.api.gui.modularui;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+
+public class GT_CoverUIBuildContext extends UIBuildContext {
+
+ // cover data is not synced to client, while ID is
+ private final int coverID;
+ private final ForgeDirection side;
+ private final ICoverable tile;
+ private final boolean anotherWindow;
+ private final int guiColorization;
+
+ /**
+ * @param player Player opened this UI
+ * @param coverID See {@link ICoverable#getCoverIDAtSide}
+ * @param side Side this cover is attached to
+ * @param tile Tile this cover is attached to
+ * @param anotherWindow If cover UI is shown on top of another window
+ * @param guiColorization The color used to render machine's GUI
+ */
+ public GT_CoverUIBuildContext(EntityPlayer player, int coverID, ForgeDirection side, ICoverable tile,
+ boolean anotherWindow, int guiColorization) {
+ super(player);
+ this.coverID = coverID;
+ this.side = side;
+ this.tile = tile;
+ this.anotherWindow = anotherWindow;
+ this.guiColorization = guiColorization;
+ }
+
+ /**
+ * @param player Player opened this UI
+ * @param coverID See {@link ICoverable#getCoverIDAtSide}
+ * @param side Side this cover is attached to
+ * @param tile Tile this cover is attached to
+ * @param anotherWindow If cover GUI is shown in opened on top of another window
+ */
+ public GT_CoverUIBuildContext(EntityPlayer player, int coverID, ForgeDirection side, ICoverable tile,
+ boolean anotherWindow) {
+ this(player, coverID, side, tile, anotherWindow, tile.getGUIColorization());
+ }
+
+ public int getCoverID() {
+ return coverID;
+ }
+
+ public ForgeDirection getCoverSide() {
+ return side;
+ }
+
+ /**
+ * Note that this will return different object between client v.s. server side on SP.
+ */
+ public ICoverable getTile() {
+ return tile;
+ }
+
+ /**
+ * If cover GUI is shown in opened on top of another window.
+ */
+ public boolean isAnotherWindow() {
+ return anotherWindow;
+ }
+
+ public int getGuiColorization() {
+ return guiColorization;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java b/src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java
new file mode 100644
index 0000000000..89a0835f13
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java
@@ -0,0 +1,188 @@
+package gregtech.api.gui.modularui;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Function;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.UIInfos;
+import com.gtnewhorizons.modularui.api.screen.ITileWithModularUI;
+import com.gtnewhorizons.modularui.api.screen.ModularUIContext;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.builder.UIBuilder;
+import com.gtnewhorizons.modularui.common.builder.UIInfo;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.internal.wrapper.ModularGui;
+import com.gtnewhorizons.modularui.common.internal.wrapper.ModularUIContainer;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords;
+import gregtech.api.net.GT_Packet_SendCoverData;
+import gregtech.api.util.GT_CoverBehaviorBase;
+
+public class GT_UIInfos {
+
+ public static void init() {}
+
+ /**
+ * Generator for {@link UIInfo} which is responsible for registering and opening UIs. Unlike
+ * {@link com.gtnewhorizons.modularui.api.UIInfos#TILE_MODULAR_UI}, this accepts custom constructors for UI. <br>
+ * Do NOT run {@link UIBuilder#build} on-the-fly, otherwise MP client won't register UIs. Instead, store to static
+ * field, just like {@link #GTTileEntityDefaultUI}. Such mistake can be easily overlooked by testing only SP.
+ */
+ public static final Function<ContainerConstructor, UIInfo<?, ?>> GTTileEntityUIFactory = containerConstructor -> UIBuilder
+ .of()
+ .container((player, world, x, y, z) -> {
+ TileEntity te = world.getTileEntity(x, y, z);
+ if (te instanceof ITileWithModularUI mui) {
+ return createTileEntityContainer(player, mui::createWindow, te::markDirty, containerConstructor);
+ }
+ return null;
+ })
+ .gui(((player, world, x, y, z) -> {
+ if (!world.isRemote) return null;
+ TileEntity te = world.getTileEntity(x, y, z);
+ if (te instanceof ITileWithModularUI mui) {
+ return createTileEntityGuiContainer(player, mui::createWindow, containerConstructor);
+ }
+ return null;
+ }))
+ .build();
+
+ private static final UIInfo<?, ?> GTTileEntityDefaultUI = GTTileEntityUIFactory.apply(ModularUIContainer::new);
+
+ private static final Map<ForgeDirection, UIInfo<?, ?>> coverUI = new HashMap<>();
+
+ static {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ coverUI.put(
+ side,
+ UIBuilder.of()
+ .container((player, world, x, y, z) -> {
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if (!(te instanceof ICoverable gtTileEntity)) return null;
+ final GT_CoverBehaviorBase<?> cover = gtTileEntity.getCoverBehaviorAtSideNew(side);
+ return createCoverContainer(
+ player,
+ cover::createWindow,
+ te::markDirty,
+ gtTileEntity.getCoverIDAtSide(side),
+ side,
+ gtTileEntity);
+ })
+ .gui((player, world, x, y, z) -> {
+ if (!world.isRemote) return null;
+ final TileEntity te = world.getTileEntity(x, y, z);
+ if (!(te instanceof ICoverable gtTileEntity)) return null;
+ final GT_CoverBehaviorBase<?> cover = gtTileEntity.getCoverBehaviorAtSideNew(side);
+ return createCoverGuiContainer(
+ player,
+ cover::createWindow,
+ gtTileEntity.getCoverIDAtSide(side),
+ side,
+ gtTileEntity);
+ })
+ .build());
+ }
+ }
+
+ /**
+ * Opens TileEntity UI, created by {@link ITileWithModularUI#createWindow}.
+ */
+ public static void openGTTileEntityUI(IHasWorldObjectAndCoords aTileEntity, EntityPlayer aPlayer) {
+ if (aTileEntity.isClientSide()) return;
+ GTTileEntityDefaultUI.open(
+ aPlayer,
+ aTileEntity.getWorld(),
+ aTileEntity.getXCoord(),
+ aTileEntity.getYCoord(),
+ aTileEntity.getZCoord());
+ }
+
+ /**
+ * Opens cover UI, created by {@link GT_CoverBehaviorBase#createWindow}.
+ */
+ public static void openCoverUI(ICoverable tileEntity, EntityPlayer player, ForgeDirection side) {
+ if (tileEntity.isClientSide()) return;
+
+ GT_Values.NW.sendToPlayer(
+ new GT_Packet_SendCoverData(
+ side,
+ tileEntity.getCoverIDAtSide(side),
+ tileEntity.getComplexCoverDataAtSide(side),
+ tileEntity),
+ (EntityPlayerMP) player);
+
+ coverUI.get(side)
+ .open(
+ player,
+ tileEntity.getWorld(),
+ tileEntity.getXCoord(),
+ tileEntity.getYCoord(),
+ tileEntity.getZCoord());
+ }
+
+ /**
+ * Opens UI for player's item, created by
+ * {@link com.gtnewhorizons.modularui.api.screen.IItemWithModularUI#createWindow}.
+ */
+ public static void openPlayerHeldItemUI(EntityPlayer player) {
+ if (NetworkUtils.isClient()) return;
+ UIInfos.PLAYER_HELD_ITEM_UI.open(player);
+ }
+
+ private static ModularUIContainer createTileEntityContainer(EntityPlayer player,
+ Function<UIBuildContext, ModularWindow> windowCreator, Runnable onWidgetUpdate,
+ ContainerConstructor containerCreator) {
+ final UIBuildContext buildContext = new UIBuildContext(player);
+ final ModularWindow window = windowCreator.apply(buildContext);
+ if (window == null) return null;
+ return containerCreator.of(new ModularUIContext(buildContext, onWidgetUpdate), window);
+ }
+
+ @SideOnly(Side.CLIENT)
+ private static ModularGui createTileEntityGuiContainer(EntityPlayer player,
+ Function<UIBuildContext, ModularWindow> windowCreator, ContainerConstructor containerConstructor) {
+ final ModularUIContainer container = createTileEntityContainer(
+ player,
+ windowCreator,
+ null,
+ containerConstructor);
+ if (container == null) return null;
+ return new ModularGui(container);
+ }
+
+ private static ModularUIContainer createCoverContainer(EntityPlayer player,
+ Function<GT_CoverUIBuildContext, ModularWindow> windowCreator, Runnable onWidgetUpdate, int coverID,
+ ForgeDirection side, ICoverable tile) {
+ final GT_CoverUIBuildContext buildContext = new GT_CoverUIBuildContext(player, coverID, side, tile, false);
+ final ModularWindow window = windowCreator.apply(buildContext);
+ if (window == null) return null;
+ return new ModularUIContainer(new ModularUIContext(buildContext, onWidgetUpdate), window);
+ }
+
+ @SideOnly(Side.CLIENT)
+ private static ModularGui createCoverGuiContainer(EntityPlayer player,
+ Function<GT_CoverUIBuildContext, ModularWindow> windowCreator, int coverID, ForgeDirection side,
+ ICoverable tile) {
+ final ModularUIContainer container = createCoverContainer(player, windowCreator, null, coverID, side, tile);
+ if (container == null) {
+ return null;
+ }
+ return new ModularGui(container);
+ }
+
+ @FunctionalInterface
+ public interface ContainerConstructor {
+
+ ModularUIContainer of(ModularUIContext context, ModularWindow mainWindow);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java b/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java
new file mode 100644
index 0000000000..b200e16d47
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java
@@ -0,0 +1,488 @@
+package gregtech.api.gui.modularui;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.function.BiFunction;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import com.gtnewhorizons.modularui.api.drawable.AdaptableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+public class GT_UITextures {
+
+ public static final UITexture TRANSPARENT = UITexture.fullImage(GregTech.ID, "gui/picture/transparent");
+
+ public static final AdaptableUITexture BACKGROUND_SINGLEBLOCK_DEFAULT = AdaptableUITexture
+ .of(GregTech.ID, "gui/background/singleblock_default", 176, 166, 4);
+ public static final SteamTexture BACKGROUND_STEAM = SteamTexture
+ .adaptableTexture(GregTech.ID, "gui/background/%s", 176, 166, 4);
+ public static final UITexture BACKGROUND_FUSION_COMPUTER = UITexture
+ .fullImage(GregTech.ID, "gui/background/fusion_computer");
+ public static final AdaptableUITexture BACKGROUND_TEXT_FIELD = AdaptableUITexture
+ .of(GregTech.ID, "gui/background/text_field", 142, 28, 1);
+ public static final AdaptableUITexture BACKGROUND_TEXT_FIELD_LIGHT_GRAY = AdaptableUITexture
+ .of(GregTech.ID, "gui/background/text_field_light_gray", 61, 12, 1);
+ public static final AdaptableUITexture BACKGROUND_NEI_SINGLE_RECIPE = AdaptableUITexture
+ .of(GregTech.ID, "gui/background/nei_single_recipe.png", 64, 64, 2);
+
+ public static final SteamTexture SLOT_ITEM_STEAM = SteamTexture.fullImage(GregTech.ID, "gui/slot/item_%s");
+ public static final SteamTexture SLOT_FLUID_STEAM = SteamTexture.fullImage(GregTech.ID, "gui/slot/fluid_%s");
+ public static final AdaptableUITexture SLOT_DARK_GRAY = AdaptableUITexture
+ .of(GregTech.ID, "gui/slot/dark_gray", 18, 18, 1);
+ public static final AdaptableUITexture SLOT_MAINTENANCE = AdaptableUITexture
+ .of(GregTech.ID, "gui/slot/maintenance", 20, 20, 1);
+ public static final AdaptableUITexture SLOT_UPLIFTED = AdaptableUITexture
+ .of(GregTech.ID, "gui/slot/uplifted", 18, 18, 1);
+
+ public static final UITexture OVERLAY_SLOT_ARROW_ME = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/arrow_me");
+ public static final UITexture OVERLAY_SLOT_PATTERN_ME = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/pattern_me");
+
+ public static final UITexture OVERLAY_SLOT_BEAKER_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/beaker_1");
+ public static final UITexture OVERLAY_SLOT_BEAKER_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/beaker_2");
+ public static final UITexture OVERLAY_SLOT_BEE_DRONE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/bee_drone");
+ public static final UITexture OVERLAY_SLOT_BEE_QUEEN = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/bee_queen");
+ public static final UITexture OVERLAY_SLOT_BENDER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/bender");
+ public static final UITexture OVERLAY_SLOT_BOX = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/box");
+ public static final UITexture OVERLAY_SLOT_BOXED = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/boxed");
+ public static final UITexture OVERLAY_SLOT_CANISTER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/canister");
+ public static final SteamTexture OVERLAY_SLOT_CANISTER_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/canister_%s");
+ public static final UITexture OVERLAY_SLOT_CANNER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/canner");
+ public static final UITexture OVERLAY_SLOT_CAULDRON = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/cauldron");
+ public static final UITexture OVERLAY_SLOT_CENTRIFUGE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/centrifuge");
+ public static final UITexture OVERLAY_SLOT_CENTRIFUGE_FLUID = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/centrifuge_fluid");
+ public static final SteamTexture OVERLAY_SLOT_CENTRIFUGE_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/centrifuge_%s");
+ public static final UITexture OVERLAY_SLOT_CHARGER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/charger");
+ public static final UITexture OVERLAY_SLOT_CHARGER_FLUID = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/charger_fluid");
+ public static final UITexture OVERLAY_SLOT_CIRCUIT = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/circuit");
+ public static final SteamTexture OVERLAY_SLOT_COAL_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/coal_%s");
+ public static final UITexture OVERLAY_SLOT_COMPRESSOR = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/compressor");
+ public static final SteamTexture OVERLAY_SLOT_COMPRESSOR_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/compressor_%s");
+ public static final UITexture OVERLAY_SLOT_CRUSHED_ORE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/crushed_ore");
+ public static final SteamTexture OVERLAY_SLOT_CRUSHED_ORE_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/crushed_ore_%s");
+ public static final UITexture OVERLAY_SLOT_CUTTER_SLICED = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/cutter_sliced");
+ public static final UITexture OVERLAY_SLOT_DATA_ORB = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/data_orb");
+ public static final UITexture OVERLAY_SLOT_DATA_STICK = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/data_stick");
+ public static final UITexture OVERLAY_SLOT_DUST = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/dust");
+ public static final SteamTexture OVERLAY_SLOT_DUST_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/dust_%s");
+ public static final SteamTexture OVERLAY_SLOT_BLOCK_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/block_%s");
+ public static final UITexture OVERLAY_SLOT_EXPLOSIVE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/explosive");
+ public static final UITexture OVERLAY_SLOT_EXTRUDER_SHAPE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/extruder_shape");
+ public static final UITexture OVERLAY_SLOT_FURNACE = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/furnace");
+ public static final SteamTexture OVERLAY_SLOT_FURNACE_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/furnace_%s");
+ public static final UITexture OVERLAY_SLOT_GEM = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/gem");
+ public static final UITexture OVERLAY_SLOT_HAMMER = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/hammer");
+ public static final SteamTexture OVERLAY_SLOT_HAMMER_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/hammer_%s");
+ public static final UITexture OVERLAY_SLOT_HEATER_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/heater_1");
+ public static final UITexture OVERLAY_SLOT_HEATER_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/heater_2");
+ public static final UITexture OVERLAY_SLOT_IMPLOSION = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/implosion");
+ public static final UITexture OVERLAY_SLOT_IN = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/in");
+ public static final SteamTexture OVERLAY_SLOT_IN_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/in_%s");
+ public static final SteamTexture OVERLAY_SLOT_INGOT_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/ingot_%s");
+ public static final UITexture OVERLAY_SLOT_INT_CIRCUIT = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/int_circuit");
+ public static final UITexture OVERLAY_SLOT_LENS = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/lens");
+ public static final UITexture OVERLAY_SLOT_MICROSCOPE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/microscope");
+ public static final UITexture OVERLAY_SLOT_MINING_PIPE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/mining_pipe");
+ public static final UITexture OVERLAY_SLOT_MOLD = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/mold");
+ public static final UITexture OVERLAY_SLOT_MOLECULAR_1 = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/molecular_1");
+ public static final UITexture OVERLAY_SLOT_MOLECULAR_2 = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/molecular_2");
+ public static final UITexture OVERLAY_SLOT_MOLECULAR_3 = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/molecular_3");
+ public static final UITexture OVERLAY_SLOT_OUT = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/out");
+ public static final SteamTexture OVERLAY_SLOT_OUT_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/out_%s");
+ public static final UITexture OVERLAY_SLOT_PAGE_BLANK = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/page_blank");
+ public static final UITexture OVERLAY_SLOT_PAGE_PRINTED = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/page_printed");
+ public static final UITexture OVERLAY_SLOT_PRESS_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/press_1");
+ public static final UITexture OVERLAY_SLOT_PRESS_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/press_2");
+ public static final UITexture OVERLAY_SLOT_PRESS_3 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/press_3");
+ public static final UITexture OVERLAY_SLOT_RECYCLE = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/recycle");
+ public static final UITexture OVERLAY_SLOT_ROD_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/rod_1");
+ public static final UITexture OVERLAY_SLOT_ROD_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/rod_2");
+ public static final UITexture OVERLAY_SLOT_SLICE_SHAPE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/slice_shape");
+ public static final UITexture OVERLAY_SLOT_SLICER_SLICED = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_slot/slicer_sliced");
+ public static final UITexture OVERLAY_SLOT_SQUARE = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/square");
+ public static final UITexture OVERLAY_SLOT_UUA = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/uua");
+ public static final UITexture OVERLAY_SLOT_UUM = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/uum");
+ public static final UITexture OVERLAY_SLOT_VIAL_1 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/vial_1");
+ public static final UITexture OVERLAY_SLOT_VIAL_2 = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/vial_2");
+ public static final UITexture OVERLAY_SLOT_WIREMILL = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/wiremill");
+ public static final UITexture OVERLAY_SLOT_WRENCH = UITexture.fullImage(GregTech.ID, "gui/overlay_slot/wrench");
+ public static final UITexture[] OVERLAY_SLOTS_NUMBER = IntStream.range(0, 12)
+ .mapToObj(i -> UITexture.fullImage(GregTech.ID, "gui/overlay_slot/number_" + i))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+
+ public static final UITexture PROGRESSBAR_ARROW = UITexture.fullImage(GregTech.ID, "gui/progressbar/arrow");
+ public static final SteamTexture PROGRESSBAR_ARROW_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/progressbar/arrow_%s");
+ public static final SteamTexture PROGRESSBAR_ARROW_2_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/progressbar/arrow_2_%s");
+ public static final UITexture PROGRESSBAR_ARROW_MULTIPLE = UITexture
+ .fullImage(GregTech.ID, "gui/progressbar/arrow_multiple");
+ public static final UITexture PROGRESSBAR_ASSEMBLE = UITexture.fullImage(GregTech.ID, "gui/progressbar/assemble");
+ public static final UITexture PROGRESSBAR_ASSEMBLY_LINE_1 = UITexture
+ .fullImage(GregTech.ID, "gui/progressbar/assemblyline_1");
+ public static final UITexture PROGRESSBAR_ASSEMBLY_LINE_2 = UITexture
+ .fullImage(GregTech.ID, "gui/progressbar/assemblyline_2");
+ public static final UITexture PROGRESSBAR_ASSEMBLY_LINE_3 = UITexture
+ .fullImage(GregTech.ID, "gui/progressbar/assemblyline_3");
+ public static final UITexture PROGRESSBAR_BATH = UITexture.fullImage(GregTech.ID, "gui/progressbar/bath");
+ public static final UITexture PROGRESSBAR_BENDING = UITexture.fullImage(GregTech.ID, "gui/progressbar/bending");
+ public static final SteamTexture PROGRESSBAR_BOILER_EMPTY_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/progressbar/boiler_empty_%s");
+ public static final UITexture PROGRESSBAR_BOILER_HEAT = UITexture
+ .fullImage(GregTech.ID, "gui/progressbar/boiler_heat");
+ public static final UITexture PROGRESSBAR_BOILER_STEAM = UITexture
+ .fullImage(GregTech.ID, "gui/progressbar/boiler_steam");
+ public static final UITexture PROGRESSBAR_BOILER_WATER = UITexture
+ .fullImage(GregTech.ID, "gui/progressbar/boiler_water");
+ public static final UITexture PROGRESSBAR_CANNER = UITexture.fullImage(GregTech.ID, "gui/progressbar/canner");
+ public static final UITexture PROGRESSBAR_CIRCUIT_ASSEMBLER = UITexture
+ .fullImage(GregTech.ID, "gui/progressbar/circuit_assembler");
+ public static final UITexture PROGRESSBAR_COMPRESS = UITexture.fullImage(GregTech.ID, "gui/progressbar/compress");
+ public static final SteamTexture PROGRESSBAR_COMPRESS_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/progressbar/compress_%s");
+ public static final UITexture PROGRESSBAR_CUT = UITexture.fullImage(GregTech.ID, "gui/progressbar/cut");
+ public static final UITexture PROGRESSBAR_EXTRACT = UITexture.fullImage(GregTech.ID, "gui/progressbar/extract");
+ public static final SteamTexture PROGRESSBAR_EXTRACT_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/progressbar/extract_%s");
+ public static final UITexture PROGRESSBAR_EXTRUDE = UITexture.fullImage(GregTech.ID, "gui/progressbar/extrude");
+ public static final SteamTexture PROGRESSBAR_FUEL_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/progressbar/fuel_%s");
+ public static final UITexture PROGRESSBAR_HAMMER = UITexture.fullImage(GregTech.ID, "gui/progressbar/hammer");
+ public static final UITexture PROGRESSBAR_HAMMER_BASE = UITexture
+ .fullImage(GregTech.ID, "gui/progressbar/hammer_base");
+ public static final SteamTexture PROGRESSBAR_HAMMER_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/progressbar/hammer_%s");
+ public static final SteamTexture PROGRESSBAR_HAMMER_BASE_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/progressbar/hammer_base_%s");
+ public static final UITexture PROGRESSBAR_LATHE = UITexture.fullImage(GregTech.ID, "gui/progressbar/lathe");
+ public static final UITexture PROGRESSBAR_LATHE_BASE = UITexture
+ .fullImage(GregTech.ID, "gui/progressbar/lathe_base");
+ public static final UITexture PROGRESSBAR_MACERATE = UITexture.fullImage(GregTech.ID, "gui/progressbar/macerate");
+ public static final SteamTexture PROGRESSBAR_MACERATE_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/progressbar/macerate_%s");
+ public static final UITexture PROGRESSBAR_MAGNET = UITexture.fullImage(GregTech.ID, "gui/progressbar/magnet");
+ public static final UITexture PROGRESSBAR_MIXER = UITexture.fullImage(GregTech.ID, "gui/progressbar/mixer");
+ public static final UITexture PROGRESSBAR_RECYCLE = UITexture.fullImage(GregTech.ID, "gui/progressbar/recycle");
+ public static final UITexture PROGRESSBAR_SIFT = UITexture.fullImage(GregTech.ID, "gui/progressbar/sift");
+ public static final UITexture PROGRESSBAR_SLICE = UITexture.fullImage(GregTech.ID, "gui/progressbar/slice");
+ public static final UITexture PROGRESSBAR_STORED_EU = UITexture.fullImage(GregTech.ID, "gui/progressbar/stored_eu");
+ public static final UITexture PROGRESSBAR_WIREMILL = UITexture.fullImage(GregTech.ID, "gui/progressbar/wiremill");
+
+ public static FallbackableUITexture fallbackableProgressbar(String name, UITexture fallback) {
+ return new FallbackableUITexture(UITexture.fullImage(GregTech.ID, "gui/progressbar/" + name), fallback);
+ }
+
+ public static final UITexture TAB_COVER_NORMAL = UITexture.fullImage(GregTech.ID, "gui/tab/cover_normal");
+ public static final UITexture TAB_COVER_HIGHLIGHT = UITexture.fullImage(GregTech.ID, "gui/tab/cover_highlight");
+ public static final UITexture TAB_COVER_DISABLED = UITexture.fullImage(GregTech.ID, "gui/tab/cover_disabled");
+ public static final SteamTexture TAB_COVER_STEAM_NORMAL = SteamTexture
+ .fullImage(GregTech.ID, "gui/tab/cover_%s_normal");
+ public static final SteamTexture TAB_COVER_STEAM_HIGHLIGHT = SteamTexture
+ .fullImage(GregTech.ID, "gui/tab/cover_%s_highlight");
+ public static final SteamTexture TAB_COVER_STEAM_DISABLED = SteamTexture
+ .fullImage(GregTech.ID, "gui/tab/cover_%s_disabled");
+ public static final AdaptableUITexture TAB_TITLE = AdaptableUITexture.of(GregTech.ID, "gui/tab/title", 28, 28, 4);
+ public static final AdaptableUITexture TAB_TITLE_DARK = AdaptableUITexture
+ .of(GregTech.ID, "gui/tab/title_dark", 28, 28, 4);
+ public static final SteamTexture TAB_TITLE_STEAM = SteamTexture
+ .adaptableTexture(GregTech.ID, "gui/tab/title_%s", 28, 28, 4);
+ public static final SteamTexture TAB_TITLE_DARK_STEAM = SteamTexture
+ .adaptableTexture(GregTech.ID, "gui/tab/title_dark_%s", 28, 28, 4);
+ public static final AdaptableUITexture TAB_TITLE_ANGULAR = AdaptableUITexture
+ .of(GregTech.ID, "gui/tab/title_angular", 28, 28, 4);
+ public static final SteamTexture TAB_TITLE_ANGULAR_STEAM = SteamTexture
+ .adaptableTexture(GregTech.ID, "gui/tab/title_angular_%s", 28, 28, 4);
+
+ public static final UITexture BUTTON_STANDARD = AdaptableUITexture
+ .of(GregTech.ID, "gui/button/standard", 18, 18, 1);
+ public static final UITexture BUTTON_STANDARD_PRESSED = AdaptableUITexture
+ .of(GregTech.ID, "gui/button/standard_pressed", 18, 18, 1);
+ public static final UITexture BUTTON_STANDARD_DISABLED = AdaptableUITexture
+ .of(GregTech.ID, "gui/button/standard_disabled", 18, 18, 1);
+ public static final UITexture BUTTON_STANDARD_TOGGLE = AdaptableUITexture
+ .of(GregTech.ID, "gui/button/standard_toggle", 18, 18, 1);
+ public static final UITexture BUTTON_STANDARD_TOGGLE_DISABLED = AdaptableUITexture
+ .of(GregTech.ID, "gui/button/standard_toggle_disabled", 18, 18, 1);
+ public static final UITexture BUTTON_COVER_NORMAL = UITexture.fullImage(GregTech.ID, "gui/button/cover_normal");
+ public static final UITexture BUTTON_COVER_NORMAL_HOVERED = UITexture
+ .fullImage(GregTech.ID, "gui/button/cover_normal_hovered");
+ public static final UITexture BUTTON_COVER_NORMAL_DISABLED = UITexture
+ .fullImage(GregTech.ID, "gui/button/cover_normal_disabled");
+
+ public static final UITexture OVERLAY_BUTTON_DISABLE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/disable");
+ public static final UITexture OVERLAY_BUTTON_REDSTONE_OFF = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/redstone_off");
+ public static final UITexture OVERLAY_BUTTON_REDSTONE_ON = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/redstone_on");
+ public static final UITexture OVERLAY_BUTTON_POWER_SWITCH_ON = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/power_switch_on");
+ public static final UITexture OVERLAY_BUTTON_POWER_SWITCH_OFF = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/power_switch_off");
+ public static final UITexture OVERLAY_BUTTON_VOID_EXCESS_NONE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/void_excess_none");
+ public static final UITexture OVERLAY_BUTTON_VOID_EXCESS_ITEM = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/void_excess_item");
+ public static final UITexture OVERLAY_BUTTON_VOID_EXCESS_FLUID = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/void_excess_fluid");
+ public static final UITexture OVERLAY_BUTTON_VOID_EXCESS_ALL = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/void_excess_all");
+ public static final UITexture OVERLAY_BUTTON_INPUT_SEPARATION_ON = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/input_separation_on");
+ public static final UITexture OVERLAY_BUTTON_INPUT_SEPARATION_ON_DISABLED = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/input_separation_on_disabled");
+ public static final UITexture OVERLAY_BUTTON_INPUT_SEPARATION_OFF = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/input_separation_off");
+ public static final UITexture OVERLAY_BUTTON_INPUT_SEPARATION_OFF_DISABLED = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/input_separation_off_disabled");
+ public static final UITexture OVERLAY_BUTTON_RECIPE_LOCKED = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/recipe_locked");
+ public static final UITexture OVERLAY_BUTTON_RECIPE_LOCKED_DISABLED = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/recipe_locked_disabled");
+ public static final UITexture OVERLAY_BUTTON_RECIPE_UNLOCKED = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/recipe_unlocked");
+ public static final UITexture OVERLAY_BUTTON_RECIPE_UNLOCKED_DISABLED = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/recipe_unlocked_disabled");
+ public static final UITexture OVERLAY_BUTTON_BATCH_MODE_ON = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/batch_mode_on");
+ public static final UITexture OVERLAY_BUTTON_BATCH_MODE_ON_DISABLED = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/batch_mode_on_disabled");
+ public static final UITexture OVERLAY_BUTTON_BATCH_MODE_OFF = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/batch_mode_off");
+ public static final UITexture OVERLAY_BUTTON_BATCH_MODE_OFF_DISABLED = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/batch_mode_off_disabled");
+ public static final UITexture OVERLAY_BUTTON_FORBIDDEN = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/forbidden");
+ public static final UITexture OVERLAY_BUTTON_LOCKED = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/lock_small");
+ public static final UITexture OVERLAY_BUTTON_DOWN_TIERING_ON = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/down_tiering_on");
+ public static final UITexture OVERLAY_BUTTON_DOWN_TIERING_OFF = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/down_tiering_off");
+ public static final UITexture OVERLAY_BUTTON_CHECKMARK = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/checkmark");
+ public static final UITexture OVERLAY_BUTTON_CROSS = UITexture.fullImage(GregTech.ID, "gui/overlay_button/cross");
+ public static final UITexture OVERLAY_BUTTON_WHITELIST = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/whitelist");
+ public static final UITexture OVERLAY_BUTTON_BLACKLIST = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/blacklist");
+ public static final UITexture OVERLAY_BUTTON_PROGRESS = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/progress");
+ public static final UITexture OVERLAY_BUTTON_EXPORT = UITexture.fullImage(GregTech.ID, "gui/overlay_button/export");
+ public static final UITexture OVERLAY_BUTTON_IMPORT = UITexture.fullImage(GregTech.ID, "gui/overlay_button/import");
+ public static final UITexture OVERLAY_BUTTON_AUTOOUTPUT_ITEM = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/autooutput_item");
+ public static final UITexture OVERLAY_BUTTON_AUTOOUTPUT_FLUID = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/autooutput_fluid");
+ public static final UITexture OVERLAY_BUTTON_ALLOW_INPUT = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/allow_input");
+ public static final UITexture OVERLAY_BUTTON_ALLOW_OUTPUT = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/allow_output");
+ public static final UITexture OVERLAY_BUTTON_AUTOPULL_ME = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/auto_pull_me");
+ public static final UITexture OVERLAY_BUTTON_AUTOPULL_ME_DISABLED = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/auto_pull_me_disabled");
+ public static final UITexture OVERLAY_BUTTON_BLOCK_INPUT = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/block_input");
+ public static final UITexture OVERLAY_BUTTON_BLOCK_OUTPUT = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/block_output");
+ public static final UITexture OVERLAY_BUTTON_ARROW_GREEN_UP = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/arrow_green_up");
+ public static final UITexture OVERLAY_BUTTON_ARROW_GREEN_DOWN = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/arrow_green_down");
+ public static final UITexture OVERLAY_BUTTON_CYCLIC = UITexture.fullImage(GregTech.ID, "gui/overlay_button/cyclic");
+ public static final UITexture OVERLAY_BUTTON_EMIT_ENERGY = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/emit_energy");
+ public static final UITexture OVERLAY_BUTTON_EMIT_REDSTONE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/emit_redstone");
+ public static final UITexture OVERLAY_BUTTON_INVERT_REDSTONE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/invert_redstone");
+ public static final UITexture OVERLAY_BUTTON_STOCKING_MODE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/stocking_mode");
+ public static final UITexture OVERLAY_BUTTON_INVERT_FILTER = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/invert_filter");
+ public static final UITexture OVERLAY_BUTTON_NBT = UITexture.fullImage(GregTech.ID, "gui/overlay_button/nbt");
+ public static final UITexture OVERLAY_BUTTON_PRINT = UITexture.fullImage(GregTech.ID, "gui/overlay_button/print");
+ public static final UITexture OVERLAY_BUTTON_TRANSPOSE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/transpose");
+ public static final UITexture OVERLAY_BUTTON_SORTING_MODE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/sorting_mode");
+ public static final UITexture OVERLAY_BUTTON_ONE_STACK_LIMIT = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/one_stack_limit");
+ public static final UITexture OVERLAY_BUTTON_BOUNDING_BOX = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/bounding_box");
+ public static final UITexture OVERLAY_BUTTON_MINUS_SMALL = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/minus_small");
+ public static final UITexture OVERLAY_BUTTON_MINUS_LARGE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/minus_large");
+ public static final UITexture OVERLAY_BUTTON_PLUS_SMALL = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/plus_small");
+ public static final UITexture OVERLAY_BUTTON_PLUS_LARGE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/plus_large");
+ public static final UITexture OVERLAY_BUTTON_GATE_AND = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/gate_and");
+ public static final UITexture OVERLAY_BUTTON_GATE_NAND = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/gate_nand");
+ public static final UITexture OVERLAY_BUTTON_GATE_OR = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/gate_or");
+ public static final UITexture OVERLAY_BUTTON_GATE_NOR = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/gate_nor");
+ public static final UITexture OVERLAY_BUTTON_ANALOG = UITexture.fullImage(GregTech.ID, "gui/overlay_button/analog");
+ public static final UITexture OVERLAY_BUTTON_LOCK = UITexture.fullImage(GregTech.ID, "gui/overlay_button/lock");
+ public static final UITexture OVERLAY_BUTTON_INPUT_FROM_OUTPUT_SIDE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/input_from_output_side");
+ public static final UITexture OVERLAY_BUTTON_TANK_VOID_EXCESS = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/tank_void_excess");
+ public static final UITexture OVERLAY_BUTTON_TANK_VOID_ALL = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/tank_void_all");
+ public static final UITexture OVERLAY_BUTTON_NEI = UITexture.fullImage(GregTech.ID, "gui/overlay_button/nei");
+ public static final UITexture OVERLAY_BUTTON_USE_PROCESSING_STATE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/use_processing_state.png");
+ public static final UITexture OVERLAY_BUTTON_USE_INVERTED_PROCESSING_STATE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/use_inverted_processing_state.png");
+ public static final UITexture OVERLAY_BUTTON_CHUNK_LOADING = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/chunkloading");
+ public static final UITexture OVERLAY_BUTTON_CHUNK_LOADING_OFF = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/chunkloading_off");
+ public static final UITexture OVERLAY_BUTTON_WORK_AREA = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/work_area");
+ public static final UITexture OVERLAY_BUTTON_REPLACE_COBBLE_ON = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/replace_cobble_on");
+ public static final UITexture OVERLAY_BUTTON_REPLACE_COBBLE_OFF = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/replace_cobble_off");
+ public static final UITexture OVERLAY_BUTTON_RETRACT_PIPE = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/retract_pipes");
+ public static final UITexture OVERLAY_BUTTON_HOURGLASS = UITexture
+ .fullImage(GregTech.ID, "gui/overlay_button/hourglass");
+
+ /**
+ * Can adjust size as needed.
+ */
+ public static final AdaptableUITexture PICTURE_SCREEN_BLACK = AdaptableUITexture
+ .of(GregTech.ID, "gui/picture/screen_black", 16, 16, 2);
+
+ public static final UITexture PICTURE_RADIATION_WARNING = UITexture
+ .fullImage(GregTech.ID, "gui/picture/radiation_warning");
+ public static final UITexture PICTURE_GT_LOGO_17x17_TRANSPARENT = UITexture
+ .fullImage(GregTech.ID, "gui/picture/gt_logo_17x17_transparent");
+ public static final UITexture PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY = UITexture
+ .fullImage(GregTech.ID, "gui/picture/gt_logo_17x17_transparent_gray");
+ public static final SteamTexture PICTURE_GT_LOGO_17x17_TRANSPARENT_STEAM = SteamTexture
+ .fullImage(GregTech.ID, "gui/picture/gt_logo_17x17_transparent_%s");
+ public static final UITexture PICTURE_GT_LOGO_18x18 = UITexture.fullImage(GregTech.ID, "gui/picture/gt_logo_18x18");
+ public static final UITexture PICTURE_GT_LOGO_19x19 = UITexture.fullImage(GregTech.ID, "gui/picture/gt_logo_19x19");
+ public static final UITexture PICTURE_INFORMATION = UITexture.fullImage(GregTech.ID, "gui/picture/information");
+ public static final UITexture PICTURE_STALLED_ELECTRICITY = UITexture
+ .fullImage(GregTech.ID, "gui/picture/stalled_electricity");
+ public static final UITexture PICTURE_STALLED_STEAM = UITexture.fullImage(GregTech.ID, "gui/picture/stalled_steam");
+ public static final BiFunction<Integer, Boolean, UITexture> PICTURE_ARROW_22_RED = (width, fromRight) -> UITexture
+ .partly(
+ GregTech.ID,
+ "gui/picture/arrow_22_red",
+ 87,
+ 22,
+ fromRight ? 87 - width : 0,
+ 0,
+ fromRight ? 87 : width,
+ 22);
+ public static final BiFunction<Integer, Boolean, UITexture> PICTURE_ARROW_22_BLUE = (width, fromRight) -> UITexture
+ .partly(
+ GregTech.ID,
+ "gui/picture/arrow_22_blue",
+ 87,
+ 22,
+ fromRight ? 87 - width : 0,
+ 0,
+ fromRight ? 87 : width,
+ 22);
+ public static final BiFunction<Integer, Boolean, UITexture> PICTURE_ARROW_22_WHITE = (width, fromRight) -> UITexture
+ .partly(
+ GregTech.ID,
+ "gui/picture/arrow_22_white",
+ 87,
+ 22,
+ fromRight ? 87 - width : 0,
+ 0,
+ fromRight ? 87 : width,
+ 22);
+ public static final BiFunction<Integer, Boolean, UITexture> PICTURE_ARROW_24_RED = (width, fromRight) -> UITexture
+ .partly(
+ GregTech.ID,
+ "gui/picture/arrow_24_red",
+ 69,
+ 24,
+ fromRight ? 69 - width : 0,
+ 0,
+ fromRight ? 69 : width,
+ 24);
+ public static final BiFunction<Integer, Boolean, UITexture> PICTURE_ARROW_24_BLUE = (width, fromRight) -> UITexture
+ .partly(
+ GregTech.ID,
+ "gui/picture/arrow_24_blue",
+ 69,
+ 24,
+ fromRight ? 69 - width : 0,
+ 0,
+ fromRight ? 69 : width,
+ 24);
+ public static final BiFunction<Integer, Boolean, UITexture> PICTURE_ARROW_24_WHITE = (width, fromRight) -> UITexture
+ .partly(
+ GregTech.ID,
+ "gui/picture/arrow_24_white",
+ 69,
+ 24,
+ fromRight ? 69 - width : 0,
+ 0,
+ fromRight ? 69 : width,
+ 24);
+ public static final UITexture PICTURE_FLUID_WINDOW = UITexture.fullImage(GregTech.ID, "gui/picture/fluid_window");
+ public static final UITexture PICTURE_FLUID_TANK = UITexture.fullImage(GregTech.ID, "gui/picture/fluid_tank");
+ public static final UITexture PICTURE_SLOTS_HOLO_3BY3 = UITexture
+ .fullImage(GregTech.ID, "gui/picture/slots_holo_3by3");
+ public static final UITexture PICTURE_ARROW_DOUBLE = UITexture.fullImage(GregTech.ID, "gui/picture/arrow_double");
+ public static final UITexture PICTURE_SUPER_BUFFER = UITexture.fullImage(GregTech.ID, "gui/picture/super_buffer");
+ public static final UITexture PICTURE_SQUARE_LIGHT_GRAY = UITexture
+ .fullImage(GregTech.ID, "gui/picture/square_light_gray");
+ public static final UITexture PICTURE_GAUGE = UITexture.fullImage(GregTech.ID, "gui/picture/gauge");
+ public static final UITexture PICTURE_ITEM_IN = UITexture.fullImage(GregTech.ID, "gui/picture/item_in");
+ public static final UITexture PICTURE_ITEM_OUT = UITexture.fullImage(GregTech.ID, "gui/picture/item_out");
+ public static final UITexture PICTURE_FLUID_IN = UITexture.fullImage(GregTech.ID, "gui/picture/fluid_in");
+ public static final UITexture PICTURE_FLUID_OUT = UITexture.fullImage(GregTech.ID, "gui/picture/fluid_out");
+}
diff --git a/src/main/java/gregtech/api/gui/modularui/GUITextureSet.java b/src/main/java/gregtech/api/gui/modularui/GUITextureSet.java
new file mode 100644
index 0000000000..18d7741421
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/modularui/GUITextureSet.java
@@ -0,0 +1,156 @@
+package gregtech.api.gui.modularui;
+
+import java.util.function.Function;
+
+import com.gtnewhorizons.modularui.api.ModularUITextures;
+import com.gtnewhorizons.modularui.api.drawable.AdaptableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+import gregtech.api.enums.SteamVariant;
+
+/**
+ * Set of textures that is commonly used for GUI but can vary depending on "style" of machines, e.g. bronze steam or
+ * steel steam. <br>
+ * This has builder pattern; Textures you didn't specify will fall back to default ones.
+ */
+public class GUITextureSet {
+
+ private UITexture mainBackground;
+ private UITexture itemSlot;
+ private UITexture fluidSlot;
+ private UITexture coverTabNormal;
+ private UITexture coverTabHighlight;
+ private UITexture coverTabDisabled;
+ private UITexture coverTabNormalFlipped;
+ private UITexture coverTabHighlightFlipped;
+ private UITexture coverTabDisabledFlipped;
+ private AdaptableUITexture titleTabNormal;
+ private AdaptableUITexture titleTabDark;
+ private AdaptableUITexture titleTabAngular;
+ private UITexture gregtechLogo;
+
+ public static final GUITextureSet DEFAULT = new GUITextureSet()
+ .setMainBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT)
+ .setItemSlot(ModularUITextures.ITEM_SLOT)
+ .setFluidSlot(ModularUITextures.FLUID_SLOT)
+ .setCoverTab(
+ GT_UITextures.TAB_COVER_NORMAL,
+ GT_UITextures.TAB_COVER_HIGHLIGHT,
+ GT_UITextures.TAB_COVER_DISABLED)
+ .setTitleTab(GT_UITextures.TAB_TITLE, GT_UITextures.TAB_TITLE_DARK, GT_UITextures.TAB_TITLE_ANGULAR)
+ .setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT);
+
+ public static final Function<SteamVariant, GUITextureSet> STEAM = steamVariant -> new GUITextureSet()
+ .setMainBackground(GT_UITextures.BACKGROUND_STEAM.get(steamVariant))
+ .setItemSlot(GT_UITextures.SLOT_ITEM_STEAM.get(steamVariant))
+ .setFluidSlot(GT_UITextures.SLOT_FLUID_STEAM.get(steamVariant))
+ .setCoverTab(
+ GT_UITextures.TAB_COVER_STEAM_NORMAL.get(steamVariant),
+ GT_UITextures.TAB_COVER_STEAM_HIGHLIGHT.get(steamVariant),
+ GT_UITextures.TAB_COVER_STEAM_DISABLED.get(steamVariant))
+ .setTitleTab(
+ GT_UITextures.TAB_TITLE_STEAM.getAdaptable(steamVariant),
+ GT_UITextures.TAB_TITLE_DARK_STEAM.getAdaptable(steamVariant),
+ GT_UITextures.TAB_TITLE_ANGULAR_STEAM.getAdaptable(steamVariant))
+ .setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_STEAM.get(steamVariant));
+
+ public GUITextureSet() {}
+
+ // region setters
+
+ public GUITextureSet setMainBackground(UITexture mainBackground) {
+ this.mainBackground = mainBackground;
+ return this;
+ }
+
+ public GUITextureSet setItemSlot(UITexture itemSlot) {
+ this.itemSlot = itemSlot;
+ return this;
+ }
+
+ public GUITextureSet setFluidSlot(UITexture fluidSlot) {
+ this.fluidSlot = fluidSlot;
+ return this;
+ }
+
+ public GUITextureSet setCoverTab(UITexture coverNormal, UITexture coverHighlight, UITexture coverDisabled) {
+ this.coverTabNormal = coverNormal;
+ this.coverTabHighlight = coverHighlight;
+ this.coverTabDisabled = coverDisabled;
+ this.coverTabNormalFlipped = coverNormal.getFlipped(true, false);
+ this.coverTabHighlightFlipped = coverHighlight.getFlipped(true, false);
+ this.coverTabDisabledFlipped = coverDisabled.getFlipped(true, false);
+ return this;
+ }
+
+ public GUITextureSet setTitleTab(AdaptableUITexture titleNormal, AdaptableUITexture titleDark,
+ AdaptableUITexture titleTabAngular) {
+ this.titleTabNormal = titleNormal;
+ this.titleTabDark = titleDark;
+ this.titleTabAngular = titleTabAngular;
+ return this;
+ }
+
+ public GUITextureSet setGregTechLogo(UITexture gregtechLogo) {
+ this.gregtechLogo = gregtechLogo;
+ return this;
+ }
+
+ // endregion
+
+ // region getters
+
+ public UITexture getMainBackground() {
+ return mainBackground != null ? mainBackground : DEFAULT.mainBackground;
+ }
+
+ public UITexture getItemSlot() {
+ return itemSlot != null ? itemSlot : DEFAULT.itemSlot;
+ }
+
+ public UITexture getFluidSlot() {
+ return fluidSlot != null ? fluidSlot : DEFAULT.fluidSlot;
+ }
+
+ public UITexture getCoverTabNormal() {
+ return coverTabNormal != null ? coverTabNormal : DEFAULT.coverTabNormal;
+ }
+
+ public UITexture getCoverTabHighlight() {
+ return coverTabHighlight != null ? coverTabHighlight : DEFAULT.coverTabHighlight;
+ }
+
+ public UITexture getCoverTabDisabled() {
+ return coverTabDisabled != null ? coverTabDisabled : DEFAULT.coverTabDisabled;
+ }
+
+ public UITexture getCoverTabNormalFlipped() {
+ return coverTabNormalFlipped != null ? coverTabNormalFlipped : DEFAULT.coverTabNormalFlipped;
+ }
+
+ public UITexture getCoverTabHighlightFlipped() {
+ return coverTabHighlightFlipped != null ? coverTabHighlightFlipped : DEFAULT.coverTabHighlightFlipped;
+ }
+
+ public UITexture getCoverTabDisabledFlipped() {
+ return coverTabDisabledFlipped != null ? coverTabDisabledFlipped : DEFAULT.coverTabDisabledFlipped;
+ }
+
+ public AdaptableUITexture getTitleTabNormal() {
+ return titleTabNormal != null ? titleTabNormal : DEFAULT.titleTabNormal;
+ }
+
+ public AdaptableUITexture getTitleTabDark() {
+ return titleTabDark != null ? titleTabDark : DEFAULT.titleTabDark;
+ }
+
+ public AdaptableUITexture getTitleTabAngular() {
+ return titleTabAngular != null ? titleTabAngular : DEFAULT.titleTabAngular;
+ }
+
+ public UITexture getGregTechLogo() {
+ return gregtechLogo != null ? gregtechLogo : DEFAULT.gregtechLogo;
+ }
+
+ // endregion
+}
diff --git a/src/main/java/gregtech/api/gui/modularui/IDataFollowerWidget.java b/src/main/java/gregtech/api/gui/modularui/IDataFollowerWidget.java
new file mode 100644
index 0000000000..393b8431e2
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/modularui/IDataFollowerWidget.java
@@ -0,0 +1,50 @@
+package gregtech.api.gui.modularui;
+
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import com.gtnewhorizons.modularui.api.widget.Widget;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.DataControllerWidget;
+
+/**
+ * Widget whose state is controlled by specific data. Data can be anything, e.g. {@link ISerializableObject} or machine
+ * recipe mode. <br>
+ * No widgets implementing this interface should not sync; Instead, {@link DataControllerWidget} will sync data, either
+ * when this widget triggers update on client or data update is detected on server.
+ *
+ * @param <T> Data type stored in the parent widget
+ * @param <U> State type stored in this widget
+ * @see DataControllerWidget
+ */
+@SuppressWarnings("UnusedReturnValue")
+public interface IDataFollowerWidget<T, U> {
+
+ /**
+ * Sets function to get widget state from provided data. This function will be called when client receives data from
+ * server and {@link DataControllerWidget} updates all children, including this widget.
+ */
+ Widget setDataToStateGetter(Function<T, U> dataToStateGetter);
+
+ /**
+ * Sets setter called when this widget gets action from player. Basically the same functionality with widgets that
+ * have getter/setter.
+ */
+ Widget setStateSetter(Consumer<U> setter);
+
+ /**
+ * Updates state of this widget with provided data. On server {@link DataControllerWidget} won't propagate data
+ * update to this widget, so this method is client-only.
+ */
+ @SideOnly(Side.CLIENT)
+ void updateState(T data);
+
+ /**
+ * Called on {@link Widget#onPostInit}.
+ */
+ @SuppressWarnings("OverrideOnly") // So IntelliJ doesn't warn about the Widget#onPostInit link in the javadoc
+ default void onPostInit() {}
+}
diff --git a/src/main/java/gregtech/api/gui/modularui/SteamTexture.java b/src/main/java/gregtech/api/gui/modularui/SteamTexture.java
new file mode 100644
index 0000000000..301671afe8
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/modularui/SteamTexture.java
@@ -0,0 +1,62 @@
+package gregtech.api.gui.modularui;
+
+import com.gtnewhorizons.modularui.api.drawable.AdaptableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+import gregtech.api.enums.SteamVariant;
+
+/**
+ * Wrapper for {@link UITexture}s used to ease in choosing between Bronze, Steel and Primitive textures.
+ */
+public class SteamTexture {
+
+ private final UITexture bronzeTexture;
+ private final UITexture steelTexture;
+ private final UITexture primitiveTexture;
+
+ private SteamTexture(UITexture bronzeTexture, UITexture steelTexture, UITexture primitiveTexture) {
+ this.bronzeTexture = bronzeTexture;
+ this.steelTexture = steelTexture;
+ this.primitiveTexture = primitiveTexture;
+ }
+
+ public static SteamTexture fullImage(String mod, String location) {
+ return new SteamTexture(
+ UITexture.fullImage(mod, String.format(location, SteamVariant.BRONZE)),
+ UITexture.fullImage(mod, String.format(location, SteamVariant.STEEL)),
+ UITexture.fullImage(mod, String.format(location, SteamVariant.PRIMITIVE)));
+ }
+
+ public static SteamTexture adaptableTexture(String mod, String location, int imageWidth, int imageHeight,
+ int borderWidthPixel) {
+ return new SteamTexture(
+ AdaptableUITexture
+ .of(mod, String.format(location, SteamVariant.BRONZE), imageWidth, imageHeight, borderWidthPixel),
+ AdaptableUITexture
+ .of(mod, String.format(location, SteamVariant.STEEL), imageWidth, imageHeight, borderWidthPixel),
+ AdaptableUITexture
+ .of(mod, String.format(location, SteamVariant.PRIMITIVE), imageWidth, imageHeight, borderWidthPixel));
+ }
+
+ public UITexture get(SteamVariant variant) {
+ return switch (variant) {
+ case BRONZE -> bronzeTexture;
+ case STEEL -> steelTexture;
+ case PRIMITIVE -> primitiveTexture;
+ default -> null;
+ };
+ }
+
+ public AdaptableUITexture getAdaptable(SteamVariant variant) {
+ return switch (variant) {
+ case BRONZE -> (AdaptableUITexture) bronzeTexture;
+ case STEEL -> (AdaptableUITexture) steelTexture;
+ case PRIMITIVE -> (AdaptableUITexture) primitiveTexture;
+ default -> null;
+ };
+ }
+
+ public UITexture get(boolean isHighPressure) {
+ return isHighPressure ? steelTexture : bronzeTexture;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java b/src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java
new file mode 100644
index 0000000000..883ffb4079
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java
@@ -0,0 +1,82 @@
+package gregtech.api.gui.widgets;
+
+import static gregtech.api.gui.modularui.GT_UITextures.OVERLAY_BUTTON_HOURGLASS;
+import static gregtech.common.covers.CoverInfo.MAX_TICK_RATE_ADDITION;
+
+import java.util.List;
+
+import net.minecraft.util.StatCollector;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.common.covers.CoverInfo;
+
+public class GT_CoverTickRateButton extends ButtonWidget {
+
+ private static final UITexture BACKGROUND = GT_UITextures.BUTTON_COVER_NORMAL.getSubArea(0, 0, 1, 0.5f);
+
+ private final CoverInfo coverInfo;
+ private int clientTickRate;
+ private int tickRateAddition;
+
+ public GT_CoverTickRateButton(@NotNull CoverInfo coverInfo, @NotNull IWidgetBuilder<?> builder) {
+ this.coverInfo = coverInfo;
+ this.clientTickRate = coverInfo.getTickRate();
+ this.tickRateAddition = coverInfo.getTickRateAddition();
+
+ super.setBackground(BACKGROUND, OVERLAY_BUTTON_HOURGLASS);
+ super.setOnClick(this::onClick);
+ super.dynamicTooltip(this::dynamicTooltip);
+ super.attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(this.coverInfo::getTickRate, integer -> clientTickRate = integer),
+ builder,
+ (widget, aInt) -> notifyTooltipChange())
+ .attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(
+ this.coverInfo::getTickRateAddition,
+ integer -> tickRateAddition = integer),
+ builder);
+
+ }
+
+ private void onClick(@NotNull ClickData clickData, @NotNull Widget widget) {
+ final int iterations = clickData.ctrl ? 5 : 1;
+ final boolean isDecreasing = clickData.mouseButton == 1;
+
+ // Do five operations at once if Ctrl is held down. Since the actual increase granted by each invocation can be
+ // different on each call, just call the method several times rather than trying to do a bunch of weird math.
+ for (int i = 0; i < iterations; i++) {
+ coverInfo.adjustTickRateMultiplier(isDecreasing);
+ }
+ }
+
+ private List<String> dynamicTooltip() {
+ final String boundsNotification;
+
+ if (tickRateAddition == 0) {
+ boundsNotification = StatCollector.translateToLocal("gt.cover.info.button.bounds_notification.minimum");
+ } else if (tickRateAddition >= MAX_TICK_RATE_ADDITION - 1) {
+ // Clamping can make tickRateAddition approach but never actually equal MAX_ADDITION, so we need this
+ // adjustment.
+ boundsNotification = StatCollector.translateToLocal("gt.cover.info.button.bounds_notification.maximum");
+ } else {
+ boundsNotification = "";
+ }
+
+ return ImmutableList.of(
+ StatCollector.translateToLocalFormatted(
+ "gt.cover.info.button.tick_rate.1",
+ new CoverInfo.ClientTickRateFormatter(clientTickRate),
+ boundsNotification),
+ StatCollector.translateToLocal("gt.cover.info.button.tick_rate.2"),
+ StatCollector.translateToLocal("gt.cover.info.button.tick_rate.3"));
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiCoverTabLine.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiCoverTabLine.java
new file mode 100644
index 0000000000..6f4eb0e2c2
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiCoverTabLine.java
@@ -0,0 +1,179 @@
+package gregtech.api.gui.widgets;
+
+import java.awt.Rectangle;
+import java.util.List;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.lwjgl.opengl.GL11;
+
+import codechicken.nei.api.API;
+import codechicken.nei.api.INEIGuiAdapter;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.gui.GT_GUIContainerMetaTile_Machine;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.net.GT_Packet_GtTileEntityGuiRequest;
+import gregtech.common.GT_Proxy;
+
+/**
+ * Let's you access a GregTech IGregTechTileEntity's covers as tabs on the GUI's sides
+ */
+public class GT_GuiCoverTabLine extends GT_GuiTabLine {
+
+ // Names of the block a cover could be on
+ private static final String[] SIDES = new String[] { "GT5U.interface.coverTabs.down", "GT5U.interface.coverTabs.up",
+ "GT5U.interface.coverTabs.north", "GT5U.interface.coverTabs.south", "GT5U.interface.coverTabs.west",
+ "GT5U.interface.coverTabs.east" };
+
+ // Not sure if there's a point in JIT translation but that's what this is
+ private final String[] translatedSides;
+ private final IGregTechTileEntity tile;
+ private final int colorization;
+
+ /**
+ * Let's you access an IGregTechTileEntity's covers as tabs on the GUI's sides
+ *
+ * @param gui GT_ITabRenderer gui which this tab line attaches to
+ * @param tabLineLeft left position of the tab line in relation to the gui
+ * @param tabLineTop top position of the tab line in relation to the gui
+ * @param tabHeight height of a tab
+ * @param tabWidth width of a tab
+ * @param tabSpacing pixels between each tab
+ * @param xDir whether to extend the line horizontally to the right (NORMAL), the left (INVERSE) or not at
+ * all (NONE)
+ * @param yDir whether to extend the line vertically down (NORMAL), up (INVERSE) or not at all (NONE)
+ * @param displayMode whether to display on the left side of the GT_ITabRenderer (NORMAL), on it's right side
+ * (INVERSE) or not at all (NONE)
+ * @param tabBackground the set of textures used to draw this tab line's tab backgrounds
+ * @param tile The IGregTechTileEntity the covers of which we are accessing
+ * @param colorization The colorization of the GUI we are adding tabs to
+ */
+ public GT_GuiCoverTabLine(GT_GUIContainerMetaTile_Machine gui, int tabLineLeft, int tabLineTop, int tabHeight,
+ int tabWidth, int tabSpacing, DisplayStyle xDir, DisplayStyle yDir, DisplayStyle displayMode,
+ GT_GuiTabIconSet tabBackground, IGregTechTileEntity tile, int colorization) {
+ super(gui, 6, tabLineLeft, tabLineTop, tabHeight, tabWidth, tabSpacing, xDir, yDir, displayMode, tabBackground);
+ this.tile = tile;
+ this.colorization = colorization;
+ this.translatedSides = new String[6];
+ setupTabs();
+ }
+
+ /**
+ * Add a tab for each existing cover on this IGregTechTileEntity at creation time
+ */
+ private void setupTabs() {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final ItemStack cover = tile.getCoverItemAtSide(side);
+ if (cover != null) {
+ addCoverToTabs(side, cover);
+ }
+ }
+ }
+
+ @Override
+ protected void drawBackground(float parTicks, int mouseX, int mouseY) {
+ // Apply this tile's coloration to draw the background
+ GL11.glColor3ub(
+ (byte) ((colorization >> 16) & 0xFF),
+ (byte) ((colorization >> 8) & 0xFF),
+ (byte) (colorization & 0xFF));
+ super.drawBackground(parTicks, mouseX, mouseY);
+ }
+
+ @Override
+ protected void tabClicked(int tabId, int mouseButton) {
+ if (mouseButton == 0 && mTabs[tabId].enabled) {
+ GT_Values.NW.sendToServer(
+ new GT_Packet_GtTileEntityGuiRequest(
+ this.tile.getXCoord(),
+ this.tile.getYCoord(),
+ this.tile.getZCoord(),
+ tabId + GT_Proxy.GUI_ID_COVER_SIDE_BASE,
+ this.tile.getWorld().provider.dimensionId,
+ Minecraft.getMinecraft().thePlayer.getEntityId(),
+ 0));
+ }
+ }
+
+ /**
+ * Add the cover on this side of the IGregTechTileEntity to the tabs
+ *
+ * @param side side to apply the cover to
+ * @param cover cover to add
+ */
+ private void addCoverToTabs(ForgeDirection side, ItemStack cover) {
+ final boolean enabled = this.tile.getCoverBehaviorAtSideNew(side)
+ .hasCoverGUI();
+ final int ordinalSide = side.ordinal();
+ this.setTab(ordinalSide, cover, null, getTooltipForCoverTab(side, cover, enabled));
+ this.setTabEnabled(ordinalSide, enabled);
+ }
+
+ /**
+ * Decorate the cover's tooltips according to the side it's on and on whether the tab is enabled or not
+ *
+ * @param side side
+ * @param cover cover which tooltip to decorate
+ * @param enabled if the tab is enabled
+ * @return This cover tab's tooltip
+ */
+ private String[] getTooltipForCoverTab(ForgeDirection side, ItemStack cover, boolean enabled) {
+ final List<String> tooltip = cover.getTooltip(Minecraft.getMinecraft().thePlayer, true);
+ tooltip.set(
+ 0,
+ (enabled ? EnumChatFormatting.UNDERLINE : EnumChatFormatting.DARK_GRAY) + getSideDescription(side)
+ + (enabled ? EnumChatFormatting.RESET + ": " : ": " + EnumChatFormatting.RESET)
+ + tooltip.get(0));
+ return tooltip.toArray(new String[0]);
+ }
+
+ /**
+ * Get the translated name for a side of the IGregTechTileEntity
+ *
+ * @param side side of the entity
+ * @return translated name for a side of the IGregTechTileEntity
+ */
+ private String getSideDescription(ForgeDirection side) {
+ final int ordinalSide = side.ordinal();
+ if (ordinalSide < SIDES.length) {
+ if (this.translatedSides[ordinalSide] == null) {
+ this.translatedSides[ordinalSide] = StatCollector.translateToLocal(SIDES[ordinalSide]);
+ }
+ return this.translatedSides[ordinalSide];
+ }
+ return null;
+ }
+
+ /**
+ * Hide any NEI slots that would intersect with a cover tab
+ */
+ static class CoverTabLineNEIHandler extends INEIGuiAdapter {
+
+ @Override
+ public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h) {
+ final Rectangle neiSlotArea = new Rectangle(x, y, w, h);
+ if (gui instanceof GT_GUIContainerMetaTile_Machine) {
+ final GT_GuiTabLine tabLine = ((GT_GUIContainerMetaTile_Machine) gui).coverTabs;
+ if (!tabLine.visible) {
+ return false;
+ }
+ for (int i = 0; i < tabLine.mTabs.length; i++) {
+ if (tabLine.mTabs[i] != null && tabLine.mTabs[i].getBounds()
+ .intersects(neiSlotArea)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ }
+
+ static {
+ API.registerNEIGuiHandler(new CoverTabLineNEIHandler());
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java
new file mode 100644
index 0000000000..9f4287a65b
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java
@@ -0,0 +1,162 @@
+package gregtech.api.gui.widgets;
+
+import java.awt.Rectangle;
+import java.util.List;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import codechicken.lib.gui.GuiDraw;
+import gregtech.api.interfaces.IGuiScreen;
+import gregtech.api.util.GT_UtilityClient;
+
+public class GT_GuiFakeItemButton implements IGuiScreen.IGuiElement {
+
+ private GT_GuiIcon bgIcon;
+ private ItemStack item;
+ private final IGuiScreen gui;
+ private int xPosition, yPosition;
+ private List<String> itemTooltips;
+ private final GT_GuiTooltip tooltip = new GT_GuiTooltip(null) {
+
+ @Override
+ public List<String> getToolTipText() {
+ return itemTooltips;
+ }
+
+ @Override
+ public boolean isDelayed() {
+ return false;
+ }
+
+ @Override
+ public Rectangle getBounds() {
+ return GT_GuiFakeItemButton.this.getBounds();
+ }
+ };
+ private final Rectangle rectangle;
+ private boolean mimicSlot;
+
+ public GT_GuiFakeItemButton(IGuiScreen gui, int x, int y, GT_GuiIcon bgIcon) {
+ this.gui = gui;
+ this.bgIcon = bgIcon;
+ item = null;
+ rectangle = new Rectangle(x, y, 18, 18);
+ gui.addElement(this);
+ }
+
+ public GT_GuiFakeItemButton setItem(ItemStack i) {
+ item = i;
+ if (getMimicSlot()) updateTooltip();
+ return this;
+ }
+
+ private void updateTooltip() {
+ itemTooltips = item == null ? null : GT_UtilityClient.getTooltip(item, true);
+ }
+
+ public ItemStack getItem() {
+ return item;
+ }
+
+ public GT_GuiFakeItemButton setMimicSlot(boolean mimicSlot) {
+ if (mimicSlot != this.mimicSlot) {
+ if (mimicSlot) {
+ updateTooltip();
+ gui.addToolTip(tooltip);
+ } else {
+ gui.removeToolTip(tooltip);
+ }
+ this.mimicSlot = mimicSlot;
+ }
+ return this;
+ }
+
+ public boolean getMimicSlot() {
+ return mimicSlot;
+ }
+
+ public GT_GuiIcon getBgIcon() {
+ return bgIcon;
+ }
+
+ public GT_GuiFakeItemButton setBgIcon(GT_GuiIcon bgIcon) {
+ this.bgIcon = bgIcon;
+ return this;
+ }
+
+ @Override
+ public void onInit() {
+ xPosition = rectangle.x + gui.getGuiLeft();
+ yPosition = rectangle.y + gui.getGuiTop();
+ }
+
+ @Override
+ public void onRemoved() {
+ if (mimicSlot) gui.removeToolTip(tooltip);
+ }
+
+ @Override
+ public void draw(int mouseX, int mouseY, float parTicks) {
+ GL11.glColor4f(1, 1, 1, 1);
+ GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+
+ if (bgIcon != null) {
+ GT_GuiIcon.render(bgIcon, xPosition - 1, yPosition - 1, 18, 18, 0, true);
+ }
+
+ if (item != null) {
+ if (item.getItem() instanceof ItemBlock) {
+ GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ }
+ gui.getItemRenderer()
+ .renderItemAndEffectIntoGUI(
+ gui.getFontRenderer(),
+ Minecraft.getMinecraft()
+ .getTextureManager(),
+ item,
+ xPosition,
+ yPosition);
+
+ if (item.getItem() instanceof ItemBlock) GL11.glPopAttrib();
+ }
+
+ if (getMimicSlot()) if (getBounds().contains(mouseX - gui.getGuiLeft(), mouseY - gui.getGuiTop())) {
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ GL11.glColorMask(true, true, true, false);
+ GuiDraw.drawGradientRect(xPosition, yPosition, 16, 16, 0x80ffffff, 0x80ffffff);
+ GL11.glColorMask(true, true, true, true);
+ // no glEnable, state will be recovered by glPopAttrib
+ }
+
+ GL11.glPopAttrib();
+ }
+
+ public Rectangle getBounds() {
+ return rectangle;
+ }
+
+ public void setX(int x) {
+ rectangle.x = x;
+ }
+
+ public void setY(int y) {
+ rectangle.y = y;
+ }
+
+ public void setWidth(int width) {
+ rectangle.width = width;
+ }
+
+ public void setHeight(int height) {
+ rectangle.height = height;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiIcon.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiIcon.java
new file mode 100644
index 0000000000..66ab27356e
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiIcon.java
@@ -0,0 +1,157 @@
+package gregtech.api.gui.widgets;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.Arrays;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.util.ResourceLocation;
+
+import gregtech.api.interfaces.IGuiIcon;
+
+public enum GT_GuiIcon implements IGuiIcon {
+
+ BUTTON_NORMAL(0, 0, 0),
+ BUTTON_DOWN(0, 32, 0),
+ BUTTON_HIGHLIGHT(0, 32 * 2, 0),
+ BUTTON_HIGHLIGHT_DOWN(0, 32 * 3, 0),
+ BUTTON_DISABLED(0, 32 * 4, 0),
+
+ DISABLE(0, 0, 32),
+ REDSTONE_OFF(0, 32, 32),
+ REDSTONE_ON(0, 32 * 2, 32),
+ CHECKMARK(0, 32 * 3, 32),
+ CROSS(0, 32 * 4, 32),
+ WHITELIST(0, 32 * 5, 32),
+ BLACKLIST(0, 32 * 6, 32),
+ PROGRESS(0, 32 * 7, 32),
+
+ EXPORT(0, 0, 32 * 2),
+ IMPORT(0, 32, 32 * 2),
+ ALLOW_INPUT(0, 32 * 2, 32 * 2),
+ BLOCK_INPUT(0, 32 * 3, 32 * 2),
+ GREEN_ARROW_UP(0, 32 * 4, 32 * 2),
+ GREEN_ARROW_DOWN(0, 32 * 5, 32 * 2),
+ CYCLIC(0, 32 * 6, 32 * 2),
+
+ AND_GATE(0, 0, 32 * 3),
+ NAND_GATE(0, 32, 32 * 3),
+ OR_GATE(0, 32 * 2, 32 * 3),
+ NOR_GATE(0, 32 * 3, 32 * 3),
+ ANALOG_MODE(0, 32 * 4, 32 * 3),
+
+ SLOT_DARKGRAY(1, 176, 0, 18, 18),
+ SLOT_GRAY(1, 176, 18, 18, 18),
+
+ TAB_NORMAL(2, 0, 0, 18, 20),
+ TAB_HIGHLIGHT(2, 18, 0, 18, 20),
+ TAB_DISABLED(2, 18 * 2, 0, 18, 20),
+ TAB_NORMAL_BRONZE(2, 0, 20, 18, 20),
+ TAB_HIGHLIGHT_BRONZE(2, 18, 20, 18, 20),
+ TAB_DISABLED_BRONZE(2, 18 * 2, 20, 18, 20),
+ TAB_NORMAL_STEEL(2, 0, 2 * 20, 18, 20),
+ TAB_HIGHLIGHT_STEEL(2, 18, 2 * 20, 18, 20),
+ TAB_DISABLED_STEEL(2, 18 * 2, 2 * 20, 18, 20),
+ TAB_NORMAL_BRICK(2, 0, 3 * 20, 18, 20),
+ TAB_HIGHLIGHT_BRICK(2, 18, 3 * 20, 18, 20),
+ TAB_DISABLED_BRICK(2, 18 * 2, 3 * 20, 18, 20),
+ TAB_INFO_GRAY(2, 220, 0, 18, 20),
+ TAB_INFO_BLUE(2, 220 + 18, 0, 18, 20),;
+
+ private static final int T_SIZE = 256;
+ private static ResourceLocation[] TEXTURES = { new ResourceLocation(GregTech.ID, "textures/gui/GuiButtons.png"),
+ new ResourceLocation(GregTech.ID, "textures/gui/GuiCover.png"),
+ new ResourceLocation(GregTech.ID, "textures/gui/GuiTabs.png"), };
+
+ public final int x, y, width, height;
+ public final IGuiIcon overlay;
+ private final int texID;
+
+ GT_GuiIcon(int texID, int x, int y, int width, int height, IGuiIcon overlay) {
+ this.x = x;
+ this.y = y;
+ this.width = width;
+ this.height = height;
+ this.overlay = overlay;
+ this.texID = texID;
+ }
+
+ GT_GuiIcon(int texID, int x, int y) {
+ this(texID, x, y, 32, 32, null);
+ }
+
+ GT_GuiIcon(int texID, int x, int y, int width, int height) {
+ this(texID, x, y, width, height, null);
+ }
+
+ public static void render(IGuiIcon icon, double x, double y, double width, double height, double zLevel,
+ boolean doDraw) {
+ render(icon, x, y, width, height, zLevel, doDraw, false);
+ }
+
+ public static void render(IGuiIcon icon, double x, double y, double width, double height, double zLevel,
+ boolean doDraw, boolean flipHoritontally) {
+ Tessellator tess = Tessellator.instance;
+ if (doDraw) {
+ Minecraft.getMinecraft().renderEngine.bindTexture(TEXTURES[icon.getTexId()]);
+ tess.startDrawingQuads();
+ }
+ double minU = (double) (icon.getX() + (flipHoritontally ? icon.getWidth() : 0)) / T_SIZE;
+ double maxU = (double) (icon.getX() + (flipHoritontally ? 0 : icon.getWidth())) / T_SIZE;
+ double minV = (double) icon.getY() / T_SIZE;
+ double maxV = (double) (icon.getY() + icon.getHeight()) / T_SIZE;
+ tess.addVertexWithUV(x, y + height, zLevel, minU, maxV);
+ tess.addVertexWithUV(x + width, y + height, zLevel, maxU, maxV);
+ tess.addVertexWithUV(x + width, y + 0, zLevel, maxU, minV);
+ tess.addVertexWithUV(x, y + 0, zLevel, minU, minV);
+
+ if (icon.getOverlay() != null) render(icon.getOverlay(), x, y, width, height, zLevel, false);
+
+ if (doDraw) tess.draw();
+ }
+
+ /**
+ * This is intended to enable addon mods to register additional textures. They can then add to this enum using
+ * EnumHelper.addEnum or by creating their enum that implements IGuiIcon (still requires adding a texture here)
+ *
+ * @param location location of the texture to add
+ */
+ public static void addTextures(ResourceLocation... location) {
+ if (location == null || location.length == 0) return;
+
+ int startIndex = TEXTURES.length;
+ TEXTURES = Arrays.copyOf(TEXTURES, location.length);
+ System.arraycopy(location, 0, TEXTURES, startIndex, location.length);
+ }
+
+ @Override
+ public int getX() {
+ return this.x;
+ }
+
+ @Override
+ public int getY() {
+ return this.y;
+ }
+
+ @Override
+ public int getWidth() {
+ return this.width;
+ }
+
+ @Override
+ public int getHeight() {
+ return this.height;
+ }
+
+ @Override
+ public int getTexId() {
+ return this.texID;
+ }
+
+ @Override
+ public IGuiIcon getOverlay() {
+ return this.overlay;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiIconButton.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiIconButton.java
new file mode 100644
index 0000000000..d4bfe31404
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiIconButton.java
@@ -0,0 +1,114 @@
+package gregtech.api.gui.widgets;
+
+import java.awt.Rectangle;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiButton;
+
+import org.lwjgl.opengl.GL11;
+
+import gregtech.api.interfaces.IGuiScreen;
+
+public class GT_GuiIconButton extends GuiButton implements IGuiScreen.IGuiElement {
+
+ public static final int DEFAULT_WIDTH = 16;
+ public static final int DEFAULT_HEIGHT = 16;
+
+ protected GT_GuiIcon icon;
+ private final int x0;
+ private final int y0;
+ protected final IGuiScreen gui;
+
+ private GT_GuiTooltip tooltip;
+
+ public GT_GuiIconButton(IGuiScreen gui, int id, int x, int y, GT_GuiIcon icon) {
+ super(id, x, y, DEFAULT_WIDTH, DEFAULT_HEIGHT, "");
+ this.gui = gui;
+ this.icon = icon;
+ this.x0 = x;
+ this.y0 = y;
+ gui.addElement(this);
+ }
+
+ @Override
+ public void onInit() {
+ if (tooltip != null) gui.addToolTip(tooltip);
+ xPosition = x0 + gui.getGuiLeft();
+ yPosition = y0 + gui.getGuiTop();
+ }
+
+ @Override
+ public void draw(int mouseX, int mouseY, float parTicks) {
+ drawButton(Minecraft.getMinecraft(), mouseX, mouseY);
+ }
+
+ @Override
+ public void drawButton(Minecraft mc, int mouseX, int mouseY) {
+ if (this.tooltip != null) this.tooltip.enabled = true;
+
+ if (this.visible) {
+ // moused over
+ this.field_146123_n = mouseX >= this.xPosition && mouseY >= this.yPosition
+ && mouseX < this.xPosition + width
+ && mouseY < this.yPosition + height;
+
+ mouseDragged(mc, mouseX, mouseY);
+
+ GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+
+ int x = xPosition;
+ int y = yPosition;
+ if (!this.field_146123_n) {
+ // GL11.glColor4f(200F/255F, 210F/255F, 1, 1);
+ } else GL11.glColor4f(1, 1, 1, 1);
+
+ GT_GuiIcon.render(getButtonTexture(this.field_146123_n), x, y, width, height, 0, true);
+
+ GL11.glColor4f(1, 1, 1, 1);
+ if (icon != null) {
+ GT_GuiIcon.render(icon, x, y, width, height, 0, true);
+ }
+
+ GL11.glPopAttrib();
+ }
+ }
+
+ @Override
+ public void mouseReleased(int mouseX, int mouseY) {
+ this.gui.clearSelectedButton();
+ if (mousePressed(Minecraft.getMinecraft(), mouseX, mouseY)) this.gui.buttonClicked(this);
+ }
+
+ public GT_GuiIcon getButtonTexture(boolean mouseOver) {
+ if (!enabled) return GT_GuiIcon.BUTTON_DISABLED;
+ if (this.equals(this.gui.getSelectedButton()))
+ return mouseOver ? GT_GuiIcon.BUTTON_HIGHLIGHT_DOWN : GT_GuiIcon.BUTTON_DOWN;
+
+ return mouseOver ? GT_GuiIcon.BUTTON_HIGHLIGHT : GT_GuiIcon.BUTTON_NORMAL;
+ }
+
+ public GT_GuiIcon getIcon() {
+ return icon;
+ }
+
+ public GT_GuiIconButton setIcon(GT_GuiIcon icon) {
+ this.icon = icon;
+ return this;
+ }
+
+ public GT_GuiTooltip getTooltip() {
+ return tooltip;
+ }
+
+ public GT_GuiIconButton setTooltipText(String... text) {
+ if (tooltip == null) tooltip = new GT_GuiTooltip(getBounds(), text);
+ else tooltip.setToolTipText(text);
+ return this;
+ }
+
+ public Rectangle getBounds() {
+ return new Rectangle(x0, y0, width, height);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiIconCheckButton.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiIconCheckButton.java
new file mode 100644
index 0000000000..5b5007fef3
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiIconCheckButton.java
@@ -0,0 +1,43 @@
+package gregtech.api.gui.widgets;
+
+import gregtech.api.interfaces.IGuiScreen;
+
+public class GT_GuiIconCheckButton extends GT_GuiIconButton {
+
+ private final GT_GuiIcon checkedIcon;
+ private final GT_GuiIcon normalIcon;
+ private final String checkedTooltip;
+ private final String normalTooltip;
+ private boolean checked = false;
+
+ public GT_GuiIconCheckButton(IGuiScreen gui, int id, int x, int y, GT_GuiIcon checkedIcon, GT_GuiIcon normalIcon) {
+ this(gui, id, x, y, checkedIcon, normalIcon, null, null);
+ }
+
+ public GT_GuiIconCheckButton(IGuiScreen gui, int id, int x, int y, GT_GuiIcon checkedIcon, GT_GuiIcon normalIcon,
+ String checkedTooltip, String normalTooltip) {
+ super(gui, id, x, y, normalIcon);
+ this.checkedIcon = checkedIcon;
+ this.normalIcon = normalIcon;
+ this.checkedTooltip = checkedTooltip;
+ this.normalTooltip = normalTooltip;
+ }
+
+ @Override
+ public GT_GuiIcon getButtonTexture(boolean mouseOver) {
+ if (!enabled) return GT_GuiIcon.BUTTON_DISABLED;
+ if (this.equals(super.gui.getSelectedButton()))
+ return mouseOver ? GT_GuiIcon.BUTTON_HIGHLIGHT_DOWN : GT_GuiIcon.BUTTON_DOWN;
+ return mouseOver ? GT_GuiIcon.BUTTON_HIGHLIGHT : GT_GuiIcon.BUTTON_NORMAL;
+ }
+
+ public boolean isChecked() {
+ return checked;
+ }
+
+ public void setChecked(boolean checked) {
+ super.setIcon(checked ? checkedIcon : normalIcon);
+ super.setTooltipText(checked ? checkedTooltip : normalTooltip);
+ this.checked = checked;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiIntegerTextBox.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiIntegerTextBox.java
new file mode 100644
index 0000000000..2d3c7374bd
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiIntegerTextBox.java
@@ -0,0 +1,73 @@
+package gregtech.api.gui.widgets;
+
+import java.awt.Rectangle;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiTextField;
+
+import gregtech.api.interfaces.IGuiScreen;
+
+public class GT_GuiIntegerTextBox extends GuiTextField implements IGuiScreen.IGuiElement {
+
+ private final int x0, y0;
+ private final IGuiScreen gui;
+ public final int id;
+ private boolean enabled;
+
+ public GT_GuiIntegerTextBox(IGuiScreen gui, int id, int x, int y, int width, int height) {
+ super(Minecraft.getMinecraft().fontRenderer, x, y, width, height);
+ super.setText("");
+ this.id = id;
+ x0 = x;
+ y0 = y;
+ this.gui = gui;
+ enabled = true;
+ gui.addElement(this);
+ }
+
+ @Override
+ public void onInit() {
+ xPosition = x0 + gui.getGuiLeft();
+ yPosition = y0 + gui.getGuiTop();
+ }
+
+ @Override
+ public void draw(int mouseX, int mouseY, float parTicks) {
+ super.drawTextBox();
+ }
+
+ public Rectangle getBounds() {
+ return new Rectangle(x0, y0, width, height);
+ }
+
+ public boolean validChar(char c, int key) {
+ return Character.isDigit(c);
+ }
+
+ @Override
+ public boolean textboxKeyTyped(char c, int key) {
+ if (validChar(c, key) || c == 1
+ || c == 3
+ || c == 22
+ || c == 24
+ || key == 14
+ || key == 199
+ || key == 203
+ || key == 205
+ || key == 207
+ || key == 211) {
+ return super.textboxKeyTyped(c, key);
+ }
+ return false;
+ }
+
+ @Override
+ public void setEnabled(boolean p_146184_1_) {
+ super.setEnabled(p_146184_1_);
+ enabled = p_146184_1_;
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiSlotTooltip.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiSlotTooltip.java
new file mode 100644
index 0000000000..015c8c7697
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiSlotTooltip.java
@@ -0,0 +1,24 @@
+package gregtech.api.gui.widgets;
+
+import java.awt.Rectangle;
+
+import net.minecraft.inventory.Slot;
+
+import gregtech.api.util.GT_TooltipDataCache.TooltipData;
+
+public class GT_GuiSlotTooltip extends GT_GuiTooltip {
+
+ private final Slot slot;
+
+ public GT_GuiSlotTooltip(Slot slot, TooltipData data) {
+ super(new Rectangle(slot.xDisplayPosition - 1, slot.yDisplayPosition - 1, 18, 18), data);
+ this.slot = slot;
+ }
+
+ @Override
+ protected void onTick() {
+ super.onTick();
+ // If disabled by super, stay disabled.
+ this.enabled = this.enabled && this.slot.getStack() == null;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiSmartTooltip.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiSmartTooltip.java
new file mode 100644
index 0000000000..ffae5c30e6
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiSmartTooltip.java
@@ -0,0 +1,27 @@
+package gregtech.api.gui.widgets;
+
+import java.awt.Rectangle;
+
+import gregtech.api.util.GT_TooltipDataCache.TooltipData;
+
+public class GT_GuiSmartTooltip extends GT_GuiTooltip {
+
+ public interface TooltipVisibilityProvider {
+
+ boolean shouldShowTooltip();
+ }
+
+ private final TooltipVisibilityProvider visibilityProvider;
+
+ public GT_GuiSmartTooltip(Rectangle bounds, TooltipVisibilityProvider visibilityProvider, TooltipData data) {
+ super(bounds, data);
+ this.visibilityProvider = visibilityProvider;
+ }
+
+ @Override
+ protected void onTick() {
+ super.onTick();
+ // If disabled by super, stay disabled.
+ this.enabled = this.enabled && this.visibilityProvider.shouldShowTooltip();
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiTab.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiTab.java
new file mode 100644
index 0000000000..d06c2bd2eb
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiTab.java
@@ -0,0 +1,174 @@
+package gregtech.api.gui.widgets;
+
+import java.awt.Rectangle;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import gregtech.api.gui.widgets.GT_GuiTabLine.GT_GuiTabIconSet;
+import gregtech.api.gui.widgets.GT_GuiTabLine.GT_ITabRenderer;
+import gregtech.api.interfaces.IGuiIcon;
+
+/**
+ * A tab to be attached to a tab line
+ */
+public class GT_GuiTab {
+
+ private static final int SLOT_SIZE = 18;
+
+ public boolean visible = true, mousedOver, enabled = true;
+
+ private Rectangle bounds;
+ private final GT_GuiTabIconSet tabBackground;
+ private final ItemStack item;
+ private final GT_ITabRenderer gui;
+ private GT_GuiTooltip tooltip;
+ private final IGuiIcon overlay;
+ private final boolean flipHorizontally;
+
+ /**
+ * A tab to be attached to a tab line
+ *
+ * @param gui IGregTechTileEntity the tab line this tab belongs to is attached to
+ * @param id both the ID and position in the tab line of this tab. Not used, kept for compatibility.
+ * @param bounds bounds of this tab
+ * @param tabBackground set of background textures
+ * @param item item to draw atop the background texture, not colored
+ * @param overlay texture to draw atop the background texture, not colored
+ * @param tooltipText tooltip of this tab
+ * @param flipHorizontally whether to draw this tab on the right side of the IGregTechTileEntity
+ */
+ public GT_GuiTab(GT_ITabRenderer gui, int id, Rectangle bounds, GT_GuiTabIconSet tabBackground, ItemStack item,
+ IGuiIcon overlay, String[] tooltipText, boolean flipHorizontally) {
+ this.gui = gui;
+ this.bounds = bounds;
+ this.item = item;
+ this.tabBackground = tabBackground;
+ this.overlay = overlay;
+ if (tooltipText != null) {
+ setTooltipText(tooltipText);
+ }
+ this.flipHorizontally = flipHorizontally;
+ }
+
+ public GT_GuiTab(GT_ITabRenderer gui, int id, Rectangle bounds, GT_GuiTabIconSet tabBackground) {
+ this(gui, id, bounds, tabBackground, null, null, null, false);
+ }
+
+ /**
+ * Set this tab's tooltip text
+ *
+ * @param text text to set
+ * @return This tab for chaining
+ */
+ public GT_GuiTab setTooltipText(String... text) {
+ if (tooltip == null) {
+ tooltip = new GT_GuiTooltip(bounds, text);
+ gui.addToolTip(tooltip);
+ } else {
+ tooltip.setToolTipText(text);
+ }
+ return this;
+ }
+
+ /**
+ * @return This tab's tooltip object
+ */
+ public GT_GuiTooltip getTooltip() {
+ return tooltip;
+ }
+
+ /**
+ * Draw the background texture for this tab
+ *
+ * @param mouseX not used, likely kept for backward compatibility
+ * @param mouseY not used, likely kept for backward compatibility
+ * @param parTicks not used, likely kept for backward compatibility
+ */
+ public void drawBackground(int mouseX, int mouseY, float parTicks) {
+ if (this.visible) {
+ GT_GuiIcon.render(
+ getBackgroundTexture(),
+ bounds.x,
+ bounds.y,
+ bounds.width,
+ bounds.height,
+ 1,
+ true,
+ this.flipHorizontally);
+ }
+ }
+
+ /**
+ * Draw overlay textures and items atop the background texture
+ *
+ * @param mouseX X mouse coordinate
+ * @param mouseY Y mouse coordinate
+ * @param parTicks not used, likely kept for backward compatibility
+ */
+ public void drawOverlays(int mouseX, int mouseY, float parTicks) {
+ this.mousedOver = bounds.contains(mouseX, mouseY);
+
+ if (this.tooltip != null) {
+ this.tooltip.enabled = this.visible;
+ }
+
+ if (this.visible) {
+ if (overlay != null) {
+ GL11.glColor4f(1, 1, 1, 1);
+ GT_GuiIcon.render(overlay, bounds.x, bounds.y, bounds.width, bounds.height, 1, true);
+ }
+ if (item != null) {
+ GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
+
+ if (item.getItem() instanceof ItemBlock) {
+ GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ }
+ int margin = (bounds.height - SLOT_SIZE);
+ gui.getItemRenderer()
+ .renderItemAndEffectIntoGUI(
+ gui.getFontRenderer(),
+ Minecraft.getMinecraft()
+ .getTextureManager(),
+ item,
+ bounds.x + (this.flipHorizontally ? 0 : margin),
+ bounds.y + margin);
+
+ if (item.getItem() instanceof ItemBlock) GL11.glPopAttrib();
+
+ GL11.glPopAttrib();
+ }
+ }
+ }
+
+ /**
+ * @return the texture this tab should currently use as it's background
+ */
+ protected IGuiIcon getBackgroundTexture() {
+ if (!enabled) return tabBackground.disabled;
+
+ return mousedOver ? tabBackground.highlight : tabBackground.normal;
+ }
+
+ /**
+ * @return the screen space occupied by this tab
+ */
+ public Rectangle getBounds() {
+ return this.bounds;
+ }
+
+ /**
+ * Reposition this tab on the screen
+ *
+ * @param xPos X tab coordinate
+ * @param yPos Y tab coordinate
+ */
+ public void setPosition(int xPos, int yPos) {
+ this.bounds = new Rectangle(xPos, yPos, bounds.width, bounds.height);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiTabLine.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiTabLine.java
new file mode 100644
index 0000000000..950478cdfa
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiTabLine.java
@@ -0,0 +1,274 @@
+package gregtech.api.gui.widgets;
+
+import java.awt.Rectangle;
+
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.renderer.entity.RenderItem;
+import net.minecraft.item.ItemStack;
+
+import org.lwjgl.opengl.GL11;
+
+import gregtech.api.interfaces.IGuiIcon;
+
+/**
+ * Draws clickable and configurable tabs on the left or right side of another GUI
+ */
+public class GT_GuiTabLine {
+
+ /**
+ * Defines a set of textures a tab line can use to render it's tab backgrounds
+ */
+ public static class GT_GuiTabIconSet {
+
+ public IGuiIcon disabled;
+ public IGuiIcon normal;
+ public IGuiIcon highlight;
+
+ public GT_GuiTabIconSet(IGuiIcon normalIcon, IGuiIcon highlightIcon, IGuiIcon disabledIcon) {
+ this.normal = normalIcon;
+ this.highlight = highlightIcon;
+ this.disabled = disabledIcon;
+ }
+ }
+
+ /**
+ * Controls the rendering style of the tab line
+ */
+ public enum DisplayStyle {
+
+ NONE((byte) 0),
+ NORMAL((byte) 1),
+ INVERSE((byte) -1);
+
+ private final byte value;
+
+ DisplayStyle(byte value) {
+ this.value = value;
+ }
+
+ public byte getValue() {
+ return value;
+ }
+ }
+
+ /**
+ * A GUI should implement these methods as well as call the tab line's onMouseClicked, onInit and drawTabs for the
+ * tab line to attach to it properly.
+ */
+ public interface GT_ITabRenderer {
+
+ int getGuiLeft();
+
+ int getGuiTop();
+
+ int getXSize();
+
+ RenderItem getItemRenderer();
+
+ FontRenderer getFontRenderer();
+
+ void addToolTip(GT_GuiTooltip tooltip);
+
+ boolean removeToolTip(GT_GuiTooltip tooltip);
+ }
+
+ // The tabs are arranged according to their index in this array
+ protected final GT_GuiTab[] mTabs;
+
+ private final int tabLineLeft;
+ private final int tabLineTop;
+ private final int tabHeight;
+ private final int tabWidth;
+ private final int tabSpacing;
+
+ // In which direction to draw the tab line
+ private final DisplayStyle xDir;
+ private final DisplayStyle yDir;
+
+ // Whether to display on the right side of the GT_ITabRenderer instead of left
+ protected final boolean flipHorizontally;
+ protected final boolean visible;
+
+ private final GT_GuiTabIconSet tabBackground;
+ private final GT_ITabRenderer gui;
+
+ /**
+ * Draws clickable and configurable tabs on the left or right side of a GT_ITabRenderer
+ *
+ * @param gui GT_ITabRenderer gui which this tab line attaches to
+ * @param numTabs number of tab positions in this tab line
+ * @param tabLineLeft left position of the tab line in relation to the gui
+ * @param tabLineTop top position of the tab line in relation to the gui
+ * @param tabHeight height of a tab
+ * @param tabWidth width of a tab
+ * @param tabSpacing pixels between each tab
+ * @param xDir whether to extend the line horizontally to the right (NORMAL), the left (INVERSE) or not at
+ * all (NONE)
+ * @param yDir whether to extend the line vertically down (NORMAL), up (INVERSE) or not at all (NONE)
+ * @param displayMode whether to display on the left side of the GT_ITabRenderer (NORMAL), on it's right side
+ * (INVERSE) or not at all (NONE)
+ * @param tabBackground the set of textures used to draw this tab line's tab backgrounds
+ */
+ public GT_GuiTabLine(GT_ITabRenderer gui, int numTabs, int tabLineLeft, int tabLineTop, int tabHeight, int tabWidth,
+ int tabSpacing, DisplayStyle xDir, DisplayStyle yDir, DisplayStyle displayMode,
+ GT_GuiTabIconSet tabBackground) {
+ this.gui = gui;
+ this.mTabs = new GT_GuiTab[numTabs];
+ this.tabLineLeft = tabLineLeft;
+ this.tabLineTop = tabLineTop;
+ this.tabHeight = tabHeight;
+ this.tabWidth = tabWidth;
+ this.tabSpacing = tabSpacing;
+ this.xDir = xDir;
+ this.yDir = yDir;
+ this.tabBackground = tabBackground;
+ this.flipHorizontally = displayMode == DisplayStyle.INVERSE;
+ this.visible = !(displayMode == DisplayStyle.NONE);
+ }
+
+ /**
+ * Creates a new tab at the specified position with the given parameters. This class handles the positioning.
+ *
+ * @param tabId tab ID
+ * @param item item to draw atop the background texture, not colored
+ * @param overlay texture to draw atop the background texture, not colored
+ * @param text tooltip of this tab
+ */
+ public void setTab(int tabId, ItemStack item, IGuiIcon overlay, String[] text) {
+ mTabs[tabId] = new GT_GuiTab(
+ this.gui,
+ tabId,
+ getBoundsForTab(tabId),
+ this.tabBackground,
+ item,
+ overlay,
+ text,
+ this.flipHorizontally);
+ }
+
+ /**
+ * Get the bounds a given tab should occupy
+ *
+ * @param tabId tab ID
+ * @return tab bounds
+ */
+ protected Rectangle getBoundsForTab(int tabId) {
+ return new Rectangle(getTabX(tabId), getTabY(tabId), this.tabWidth, this.tabHeight);
+ }
+
+ /**
+ * Enable or disable a tab. Disabled tabs have a dark background.
+ *
+ * @param tabId tab ID
+ * @param enable true to enable, false to disable
+ */
+ public void setTabEnabled(int tabId, boolean enable) {
+ if (mTabs[tabId] != null) {
+ mTabs[tabId].enabled = enable;
+ }
+ }
+
+ /**
+ * Draw the tabs for this tab bar GT_ITabRenderer must call this method on drawGuiContainerBackgroundLayer or on
+ * drawScreen.
+ *
+ * @param parTicks
+ */
+ public void drawTabs(float parTicks, int mouseX, int mouseY) {
+ if (this.visible) {
+ GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ drawBackground(parTicks, mouseX, mouseY);
+ drawOverlays(parTicks, mouseX, mouseY);
+ GL11.glPopAttrib();
+ }
+ }
+
+ /**
+ * Draw the tab's backgrounds first
+ *
+ * @param parTicks not used, likely kept for compatibility
+ * @param mouseX mouse X position
+ * @param mouseY mouse Y position
+ */
+ protected void drawOverlays(float parTicks, int mouseX, int mouseY) {
+ for (GT_GuiTab mTab : mTabs) {
+ if (mTab != null) {
+ mTab.drawOverlays(mouseX, mouseY, parTicks);
+ }
+ }
+ }
+
+ /**
+ * Draw anything that overlays the tab's background texture
+ *
+ * @param parTicks not used, likely kept for compatibility
+ * @param mouseX mouse X position
+ * @param mouseY mouse Y position
+ */
+ protected void drawBackground(float parTicks, int mouseX, int mouseY) {
+ for (GT_GuiTab mTab : mTabs) {
+ if (mTab != null) {
+ mTab.drawBackground(mouseX, mouseY, parTicks);
+ }
+ }
+ }
+
+ /**
+ * Call tabClick for every tab that was clicked. GT_ITabRenderer must call this method on mouseClicked.
+ *
+ * @param mouseX mouse X position
+ * @param mouseY mouse Y position
+ * @param mouseButton which mouse button was used to click
+ */
+ public void onMouseClicked(int mouseX, int mouseY, int mouseButton) {
+ for (int tabId = 0; tabId < mTabs.length; tabId++) {
+ if (mTabs[tabId] != null && mTabs[tabId].getBounds()
+ .contains(mouseX, mouseY)) {
+ tabClicked(tabId, mouseButton);
+ return;
+ }
+ }
+ }
+
+ /**
+ * Act on a tab being clicked.
+ *
+ * @param tabId tab ID
+ * @param mouseButton which mouse button was used to click
+ */
+ protected void tabClicked(int tabId, int mouseButton) {}
+
+ /**
+ * Reposition ourselves whenever the GT_ITabRenderer does so. GT_ITabRenderer must call this method on Init.
+ */
+ public void onInit() {
+ for (int i = 0; i < mTabs.length; i++) {
+ if (mTabs[i] != null) {
+ mTabs[i].setPosition(getTabX(i), getTabY(i));
+ }
+ }
+ }
+
+ /**
+ * Get the proper X position for a given tab
+ *
+ * @param tabId tab ID
+ * @return X position of the tab
+ */
+ private int getTabX(int tabId) {
+ return this.gui.getGuiLeft() + (flipHorizontally ? (gui.getXSize() - tabLineLeft - tabWidth) : tabLineLeft)
+ + (tabId * (tabWidth + tabSpacing) * xDir.getValue());
+ }
+
+ /**
+ * Get the proper Y position for a given tab
+ *
+ * @param tabId tab ID
+ * @return Y position of the tab
+ */
+ private int getTabY(int tabId) {
+ return this.gui.getGuiTop() + tabLineTop + (tabId * (tabHeight + tabSpacing) * yDir.getValue());
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltip.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltip.java
new file mode 100644
index 0000000000..fe20b2b57a
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltip.java
@@ -0,0 +1,121 @@
+package gregtech.api.gui.widgets;
+
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.lwjgl.input.Keyboard;
+
+import gregtech.api.util.GT_TooltipDataCache.TooltipData;
+
+public class GT_GuiTooltip {
+
+ protected final Rectangle bounds;
+ protected TooltipData data;
+ private List<String> displayedText;
+ public boolean enabled = true;
+
+ /**
+ * Used to create a tooltip that will appear over the specified bounds. This will initially be a "static" tooltip
+ * that doesn't respect verbosity levels or respond to the shift key.
+ *
+ * @param bounds tooltip bounds
+ * @param text tooltip text
+ */
+ public GT_GuiTooltip(Rectangle bounds, String... text) {
+ this.bounds = bounds;
+ setToolTipText(text);
+ }
+
+ /**
+ * Used to create a tooltip that will appear over the specified bounds. This will initially be a "dynamic" tooltip
+ * that respects verbosity levels and responds to the shift key.
+ *
+ * @param bounds tooltip bounds
+ * @param data tooltip data
+ */
+ public GT_GuiTooltip(Rectangle bounds, TooltipData data) {
+ this.bounds = bounds;
+ // Trust that the tooltips have already been formatted and colored, just make sure it has no nulls
+ this.data = sanitizeTooltipData(data);
+ }
+
+ private TooltipData sanitizeTooltipData(TooltipData data) {
+ if (data.text == null) {
+ data.text = Collections.emptyList();
+ }
+ if (data.shiftText == null) {
+ data.shiftText = Collections.emptyList();
+ }
+ return data;
+ }
+
+ /**
+ * Called before the tooltip manager checks whether this tooltip is enabled
+ */
+ protected void onTick() {
+ // Switch which of our 2 stored texts we're displaying now.
+ this.displayedText = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) ? this.data.shiftText : this.data.text;
+ // If this text is empty, let's not display a tooltip at all.
+ this.enabled = this.displayedText.size() != 0;
+ }
+
+ /**
+ * Called once this tooltip has been determined to be enabled
+ */
+ protected void updateText() {}
+
+ /**
+ * Used to set a "static" tooltip that doesn't respect verbosity levels or respond to the shift key
+ *
+ * @param text tooltip text
+ */
+ public void setToolTipText(String... text) {
+ this.data = formatTooltip(text);
+ this.displayedText = data.text;
+ }
+
+ /**
+ * Used to set a "dynamic" tooltip that respects verbosity levels and responds to the shift key
+ *
+ * @param data tooltip data
+ */
+ public void setToolTipText(TooltipData data) {
+ // Trust that the tooltips have already been formatted and colored, just make sure it has no nulls
+ this.data = sanitizeTooltipData(data);
+ }
+
+ /**
+ * Apply tooltip colors in case the text doesn't contain them and return as tooltip data
+ *
+ * @param text text to apply the colors to
+ * @return colored tooltip lines as list
+ */
+ protected TooltipData formatTooltip(String[] text) {
+ List<String> list;
+ if (text != null) {
+ list = new ArrayList<>(text.length);
+ for (String s : text) {
+ if (s == null) continue;
+ if (list.isEmpty()) list.add("\u00a7f" + s);
+ else list.add("\u00a77" + s);
+ }
+ } else {
+ list = Collections.emptyList();
+ }
+ return new TooltipData(list, list);
+ }
+
+ public List<String> getToolTipText() {
+ return this.displayedText;
+ }
+
+ public Rectangle getBounds() {
+ return bounds;
+ }
+
+ public boolean isDelayed() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltipManager.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltipManager.java
new file mode 100644
index 0000000000..4304ca14fc
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltipManager.java
@@ -0,0 +1,80 @@
+package gregtech.api.gui.widgets;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.client.gui.FontRenderer;
+
+public class GT_GuiTooltipManager {
+
+ public interface GT_IToolTipRenderer {
+
+ int getGuiLeft();
+
+ int getGuiTop();
+
+ int getXSize();
+
+ FontRenderer getFontRenderer();
+
+ void drawHoveringText(List<String> text, int mouseX, int mouseY, FontRenderer font);
+ }
+
+ private static final long DELAY = 5;
+ private int mouseStopped;
+ private int lastMouseX = -1;
+ private int lastMouseY = -1;
+ private final List<GT_GuiTooltip> tips = new ArrayList<>();
+
+ public void addToolTip(GT_GuiTooltip tip) {
+ if (tip != null && !tips.contains(tip)) tips.add(tip);
+ }
+
+ public boolean removeToolTip(GT_GuiTooltip tip) {
+ return tips.remove(tip);
+ }
+
+ public final void onTick(GT_IToolTipRenderer render, int mouseX, int mouseY) {
+ if ((Math.abs(mouseX - lastMouseX) < 2) && (Math.abs(mouseY - lastMouseY) < 2)) {
+ mouseStopped = Math.min(mouseStopped + 1, 50);
+ } else {
+ mouseStopped = 0;
+ }
+
+ lastMouseX = mouseX;
+ lastMouseY = mouseY;
+
+ mouseX -= render.getGuiLeft();
+ mouseY -= render.getGuiTop();
+ for (GT_GuiTooltip tip : tips) {
+ // Give the tooltip the opportunity to decide whether they should be enabled
+ tip.onTick();
+ if (tip.enabled && (!tip.isDelayed() || mouseStopped > DELAY)
+ && tip.getBounds()
+ .contains(mouseX, mouseY)) {
+ tip.updateText();
+ drawTooltip(tip, mouseX, mouseY, render);
+ break;
+ }
+ }
+ }
+
+ private void drawTooltip(GT_GuiTooltip tip, int mouseX, int mouseY, GT_IToolTipRenderer render) {
+ List<String> text = tip.getToolTipText();
+ if (text == null) return;
+
+ if (mouseX > render.getGuiLeft() + render.getXSize() / 2) {
+ int maxWidth = 0;
+ for (String s : text) {
+ int w = render.getFontRenderer()
+ .getStringWidth(s);
+ if (w > maxWidth) {
+ maxWidth = w;
+ }
+ }
+ mouseX -= (maxWidth + 18);
+ }
+
+ render.drawHoveringText(text, mouseX, mouseY, render.getFontRenderer());
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_LockedWhileActiveButton.java b/src/main/java/gregtech/api/gui/widgets/GT_LockedWhileActiveButton.java
new file mode 100644
index 0000000000..9a93a8fadf
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/widgets/GT_LockedWhileActiveButton.java
@@ -0,0 +1,90 @@
+package gregtech.api.gui.widgets;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.function.Supplier;
+
+import net.minecraft.util.StatCollector;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+
+public class GT_LockedWhileActiveButton extends ButtonWidget {
+
+ @NotNull
+ private final IMachineProgress machine;
+
+ public GT_LockedWhileActiveButton(@NotNull IMachineProgress machine, @NotNull ModularWindow.Builder builder) {
+ super();
+ this.machine = machine;
+
+ super.attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(machine::isActive, a -> {}),
+ builder,
+ (widget, aBoolean) -> widget.notifyTooltipChange());
+
+ super.dynamicTooltip(this::generateTooltip);
+ }
+
+ @NotNull
+ @Override
+ public ButtonWidget setOnClick(@NotNull BiConsumer<ClickData, Widget> clickAction) {
+ return super.setOnClick((clickData, widget) -> {
+ if (!machine.isActive()) {
+ clickAction.accept(clickData, widget);
+ }
+ });
+ }
+
+ @NotNull
+ @Override
+ public Widget setBackground(@NotNull IDrawable... drawables) {
+ return super.setBackground(() -> appendLockedOverlay(drawables));
+ }
+
+ @NotNull
+ @Override
+ public Widget setBackground(@NotNull Supplier<IDrawable[]> drawablesSupplier) {
+ return super.setBackground(() -> appendLockedOverlay(drawablesSupplier.get()));
+ }
+
+ @NotNull
+ @Override
+ public Widget dynamicTooltip(@NotNull Supplier<List<String>> dynamicTooltip) {
+ return super.dynamicTooltip(() -> {
+ ImmutableList.Builder<String> tooltips = ImmutableList.<String>builder()
+ .addAll(dynamicTooltip.get());
+ tooltips.addAll(generateTooltip());
+
+ return tooltips.build();
+ });
+ }
+
+ @NotNull
+ private IDrawable[] appendLockedOverlay(@NotNull IDrawable[] drawables) {
+ if (machine.isActive()) {
+ final IDrawable[] copy = Arrays.copyOf(drawables, drawables.length + 1);
+ copy[drawables.length] = GT_UITextures.OVERLAY_BUTTON_LOCKED;
+ return copy;
+ }
+ return drawables;
+ }
+
+ @NotNull
+ private List<String> generateTooltip() {
+ if (machine.isActive()) {
+ return ImmutableList.of(StatCollector.translateToLocal("GT5U.gui.button.forbidden_while_running"));
+ }
+ return ImmutableList.of();
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/IBlockContainer.java b/src/main/java/gregtech/api/interfaces/IBlockContainer.java
new file mode 100644
index 0000000000..5a80655a5c
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IBlockContainer.java
@@ -0,0 +1,10 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.block.Block;
+
+public interface IBlockContainer {
+
+ Block getBlock();
+
+ byte getMeta();
+}
diff --git a/src/main/java/gregtech/api/interfaces/IBlockOnWalkOver.java b/src/main/java/gregtech/api/interfaces/IBlockOnWalkOver.java
new file mode 100644
index 0000000000..0c8fce931b
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IBlockOnWalkOver.java
@@ -0,0 +1,9 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.world.World;
+
+public interface IBlockOnWalkOver {
+
+ void onWalkOver(EntityLivingBase aEntity, World aWorld, int aX, int aY, int aZ);
+}
diff --git a/src/main/java/gregtech/api/interfaces/IChunkLoader.java b/src/main/java/gregtech/api/interfaces/IChunkLoader.java
new file mode 100644
index 0000000000..b597d6a71f
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IChunkLoader.java
@@ -0,0 +1,10 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.world.ChunkCoordIntPair;
+
+// This interface is implemented by the machines that actively load a working chunk
+public interface IChunkLoader {
+
+ // return a working chunk coordinates, may be null
+ ChunkCoordIntPair getActiveChunk();
+}
diff --git a/src/main/java/gregtech/api/interfaces/ICleanroom.java b/src/main/java/gregtech/api/interfaces/ICleanroom.java
new file mode 100644
index 0000000000..61e339d050
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/ICleanroom.java
@@ -0,0 +1,22 @@
+package gregtech.api.interfaces;
+
+/**
+ * Classes implementing this interface can act as cleanroom, used to satisfy environment required for some recipes.
+ */
+public interface ICleanroom {
+
+ /**
+ * @return Current cleanness of this cleanroom. Max at 10000.
+ */
+ int getCleanness();
+
+ /**
+ * @return If this cleanroom is valid.
+ */
+ boolean isValidCleanroom();
+
+ /**
+ * Release pollution to this cleanroom.
+ */
+ void pollute();
+}
diff --git a/src/main/java/gregtech/api/interfaces/ICleanroomReceiver.java b/src/main/java/gregtech/api/interfaces/ICleanroomReceiver.java
new file mode 100644
index 0000000000..b0d42f9aec
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/ICleanroomReceiver.java
@@ -0,0 +1,18 @@
+package gregtech.api.interfaces;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.tileentity.TileEntity;
+
+/**
+ * Implement this interface for TileEntities that can have association to cleanroom.
+ * Calling {@link gregtech.common.GT_Pollution#addPollution(TileEntity, int)} from this machine
+ * will pollute associated cleanroom.
+ */
+public interface ICleanroomReceiver {
+
+ @Nullable
+ ICleanroom getCleanroom();
+
+ void setCleanroom(ICleanroom cleanroom);
+}
diff --git a/src/main/java/gregtech/api/interfaces/IColorModulationContainer.java b/src/main/java/gregtech/api/interfaces/IColorModulationContainer.java
new file mode 100644
index 0000000000..55053e1d12
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IColorModulationContainer.java
@@ -0,0 +1,6 @@
+package gregtech.api.interfaces;
+
+public interface IColorModulationContainer {
+
+ short[] getRGBA();
+}
diff --git a/src/main/java/gregtech/api/interfaces/ICondition.java b/src/main/java/gregtech/api/interfaces/ICondition.java
new file mode 100644
index 0000000000..9c7033b3d7
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/ICondition.java
@@ -0,0 +1,116 @@
+package gregtech.api.interfaces;
+
+public interface ICondition<O> {
+
+ boolean isTrue(O aObject);
+
+ // Utility Classes for adding relations between Conditions.
+
+ class Not<O> implements ICondition<O> {
+
+ private final ICondition<O> mCondition;
+
+ public Not(ICondition<O> aCondition) {
+ mCondition = aCondition;
+ }
+
+ @Override
+ public boolean isTrue(O aObject) {
+ return !mCondition.isTrue(aObject);
+ }
+ }
+
+ class Or<O> implements ICondition<O> {
+
+ private final ICondition<O>[] mConditions;
+
+ @SafeVarargs
+ public Or(ICondition<O>... aConditions) {
+ mConditions = aConditions;
+ }
+
+ @Override
+ public boolean isTrue(O aObject) {
+ for (ICondition<O> tCondition : mConditions) if (tCondition.isTrue(aObject)) return true;
+ return false;
+ }
+ }
+
+ class Nor<O> implements ICondition<O> {
+
+ private final ICondition<O>[] mConditions;
+
+ @SafeVarargs
+ public Nor(ICondition<O>... aConditions) {
+ mConditions = aConditions;
+ }
+
+ @Override
+ public boolean isTrue(O aObject) {
+ for (ICondition<O> tCondition : mConditions) if (tCondition.isTrue(aObject)) return false;
+ return true;
+ }
+ }
+
+ class And<O> implements ICondition<O> {
+
+ private final ICondition<O>[] mConditions;
+
+ @SafeVarargs
+ public And(ICondition<O>... aConditions) {
+ mConditions = aConditions;
+ }
+
+ @Override
+ public boolean isTrue(O aObject) {
+ for (ICondition<O> tCondition : mConditions) if (!tCondition.isTrue(aObject)) return false;
+ return true;
+ }
+ }
+
+ class Nand<O> implements ICondition<O> {
+
+ private final ICondition<O>[] mConditions;
+
+ @SafeVarargs
+ public Nand(ICondition<O>... aConditions) {
+ mConditions = aConditions;
+ }
+
+ @Override
+ public boolean isTrue(O aObject) {
+ for (ICondition<O> tCondition : mConditions) if (!tCondition.isTrue(aObject)) return true;
+ return false;
+ }
+ }
+
+ class Xor<O> implements ICondition<O> {
+
+ private final ICondition<O> mCondition1, mCondition2;
+
+ public Xor(ICondition<O> aCondition1, ICondition<O> aCondition2) {
+ mCondition1 = aCondition1;
+ mCondition2 = aCondition2;
+ }
+
+ @Override
+ public boolean isTrue(O aObject) {
+ return mCondition1.isTrue(aObject) != mCondition2.isTrue(aObject);
+ }
+ }
+
+ class Equal<O> implements ICondition<O> {
+
+ private final ICondition<O> mCondition1, mCondition2;
+
+ public Equal(ICondition<O> aCondition1, ICondition<O> aCondition2) {
+ mCondition1 = aCondition1;
+ mCondition2 = aCondition2;
+ }
+
+ @Override
+ public boolean isTrue(O aObject) {
+ return mCondition1.isTrue(aObject) == mCondition2.isTrue(aObject);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/IConfigurationCircuitSupport.java b/src/main/java/gregtech/api/interfaces/IConfigurationCircuitSupport.java
new file mode 100644
index 0000000000..8dde8163c8
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IConfigurationCircuitSupport.java
@@ -0,0 +1,47 @@
+package gregtech.api.interfaces;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+
+/**
+ * Implement this interface if your tileentity (or metatileentity) supports configuration circuits to resolve recipe
+ * conflicts.
+ */
+public interface IConfigurationCircuitSupport {
+
+ /**
+ *
+ * @return Integrated circuit slot index in the machine inventory
+ */
+ int getCircuitSlot();
+
+ /**
+ * Return a list of possible configuration circuit this machine expects.
+ * <p>
+ * This list is unmodifiable. Its elements are not supposed to be modified in any way!
+ */
+ default List<ItemStack> getConfigurationCircuits() {
+ return GregTech_API.getConfigurationCircuitList(100);
+ }
+
+ /**
+ *
+ * @return True if that machine supports built-in configuration circuit
+ */
+ boolean allowSelectCircuit();
+
+ /**
+ *
+ * @return Circuit slot index in GUI container
+ */
+ default int getCircuitGUISlot() {
+ return getCircuitSlot();
+ }
+
+ int getCircuitSlotX();
+
+ int getCircuitSlotY();
+}
diff --git a/src/main/java/gregtech/api/interfaces/IDamagableItem.java b/src/main/java/gregtech/api/interfaces/IDamagableItem.java
new file mode 100644
index 0000000000..5f0d53b577
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IDamagableItem.java
@@ -0,0 +1,8 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.item.ItemStack;
+
+public interface IDamagableItem {
+
+ boolean doDamageToItem(ItemStack aStack, int aVanillaDamage);
+}
diff --git a/src/main/java/gregtech/api/interfaces/IDebugableBlock.java b/src/main/java/gregtech/api/interfaces/IDebugableBlock.java
new file mode 100644
index 0000000000..9c6ab660bd
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IDebugableBlock.java
@@ -0,0 +1,24 @@
+package gregtech.api.interfaces;
+
+import java.util.ArrayList;
+
+import net.minecraft.entity.player.EntityPlayer;
+
+/**
+ * You are allowed to include this File in your Download, as i will not change it.
+ */
+public interface IDebugableBlock {
+
+ /**
+ * Returns a Debug Message, for a generic DebugItem Blocks have to implement this interface NOT TileEntities!
+ *
+ * @param aPlayer the Player, who rightclicked with his Debug Item
+ * @param aX Block-Coordinate
+ * @param aY Block-Coordinate
+ * @param aZ Block-Coordinate
+ * @param aLogLevel the Log Level of the Debug Item. 0 = Obvious 1 = Visible for the regular Scanner 2 = Only
+ * visible to more advanced Scanners 3 = Debug ONLY
+ * @return a String-Array containing the DebugInfo, every Index is a separate line (0 = first Line)
+ */
+ ArrayList<String> getDebugInfo(EntityPlayer aPlayer, int aX, int aY, int aZ, int aLogLevel);
+}
diff --git a/src/main/java/gregtech/api/interfaces/IDescribable.java b/src/main/java/gregtech/api/interfaces/IDescribable.java
new file mode 100644
index 0000000000..21bb520482
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IDescribable.java
@@ -0,0 +1,12 @@
+package gregtech.api.interfaces;
+
+/**
+ * To get simple things like a ToolTip Description
+ */
+public interface IDescribable {
+
+ /**
+ * The Tooltip Text
+ */
+ String[] getDescription();
+}
diff --git a/src/main/java/gregtech/api/interfaces/IDragAndDropSupport.java b/src/main/java/gregtech/api/interfaces/IDragAndDropSupport.java
new file mode 100644
index 0000000000..b516db5bad
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IDragAndDropSupport.java
@@ -0,0 +1,58 @@
+package gregtech.api.interfaces;
+
+import java.util.Collections;
+import java.util.List;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.item.ItemStack;
+
+import codechicken.nei.NEIClientUtils;
+import codechicken.nei.VisiblityData;
+import codechicken.nei.api.INEIGuiHandler;
+import codechicken.nei.api.TaggedInventoryArea;
+import cpw.mods.fml.common.Optional;
+import gregtech.api.enums.Mods;
+
+/**
+ * Implement this interface if your GuiContainer supports Drag-And-Drop behavior on NEI.
+ */
+@Optional.Interface(modid = Mods.Names.NOT_ENOUGH_ITEMS, iface = "codechicken.nei.api.INEIGuiHandler")
+public interface IDragAndDropSupport extends INEIGuiHandler {
+
+ /**
+ * Implement this to handle Drag-And-Drop behavior. This may be invoked on normal click too
+ * ({@code isGhost==false}), so be careful if your slot supports both Drag-And-Drop and other behaviors e.g. fluid
+ * I/O with FluidDisplay click
+ *
+ * @param gui Current gui instance. Make sure to check if it is an instance of your GuiContainer.
+ * @param mousex X position of the mouse
+ * @param mousey Y position of the mouse
+ * @param draggedStack ItemStack user is holding on cursor
+ * @param button 0 = left click, 1 = right click
+ * @param isGhost Whether {@code draggedStack} is dragged from ItemPanel/BookmarkPanel, or actual item player
+ * holds
+ * @return True if success
+ */
+ boolean handleDragAndDropGT(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button,
+ boolean isGhost);
+
+ default boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button) {
+ return handleDragAndDropGT(gui, mousex, mousey, draggedStack, button, NEIClientUtils.getHeldItem() == null);
+ }
+
+ default VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility) {
+ return currentVisibility;
+ }
+
+ default Iterable<Integer> getItemSpawnSlots(GuiContainer gui, ItemStack item) {
+ return Collections.emptyList();
+ }
+
+ default List<TaggedInventoryArea> getInventoryAreas(GuiContainer gui) {
+ return null;
+ }
+
+ default boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/IFluidAccess.java b/src/main/java/gregtech/api/interfaces/IFluidAccess.java
new file mode 100644
index 0000000000..8fa9b3a3fa
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IFluidAccess.java
@@ -0,0 +1,26 @@
+package gregtech.api.interfaces;
+
+import net.minecraftforge.fluids.FluidStack;
+
+public interface IFluidAccess {
+
+ void set(FluidStack stack);
+
+ FluidStack get();
+
+ int getCapacity();
+
+ default int getRealCapacity() {
+ return getCapacity();
+ }
+
+ default void addAmount(int amount) {
+ if (get() != null) {
+ get().amount = Math.min(get().amount + amount, getRealCapacity());
+ }
+ }
+
+ default void verifyFluidStack() {
+ if (get() != null && get().amount <= 0) set(null);
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/IFoodStat.java b/src/main/java/gregtech/api/interfaces/IFoodStat.java
new file mode 100644
index 0000000000..c768c5ca1c
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IFoodStat.java
@@ -0,0 +1,37 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumAction;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.items.GT_MetaBase_Item;
+
+public interface IFoodStat {
+
+ /**
+ * Warning the "aPlayer" Parameter may be null!
+ */
+ int getFoodLevel(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer);
+
+ /**
+ * Warning the "aPlayer" Parameter may be null!
+ */
+ float getSaturation(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer);
+
+ /**
+ * Warning the "aPlayer" Parameter may be null!
+ */
+ boolean alwaysEdible(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer);
+
+ /**
+ * Warning the "aPlayer" Parameter may be null!
+ */
+ boolean isRotten(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer);
+
+ /**
+ * Warning the "aPlayer" Parameter may be null!
+ */
+ EnumAction getFoodAction(GT_MetaBase_Item aItem, ItemStack aStack);
+
+ void onEaten(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer);
+}
diff --git a/src/main/java/gregtech/api/interfaces/IGT_ItemWithMaterialRenderer.java b/src/main/java/gregtech/api/interfaces/IGT_ItemWithMaterialRenderer.java
new file mode 100644
index 0000000000..4bf0311544
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IGT_ItemWithMaterialRenderer.java
@@ -0,0 +1,68 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.common.render.items.GT_GeneratedMaterial_Renderer;
+
+public interface IGT_ItemWithMaterialRenderer {
+
+ /**
+ * @return If allow using {@link gregtech.common.render.items.GT_MetaGenerated_Item_Renderer} to render item
+ */
+ boolean shouldUseCustomRenderer(int aMetaData);
+
+ /**
+ * @return Custom renderer of the Material with offset < 32000
+ */
+ GT_GeneratedMaterial_Renderer getMaterialRenderer(int aMetaData);
+
+ /**
+ * If this returns false, renderer falls back to {@link gregtech.common.render.items.GT_GeneratedItem_Renderer}
+ */
+ boolean allowMaterialRenderer(int aMetaData);
+
+ /**
+ * @return Icon the Material is going to be rendered with
+ */
+ IIcon getIcon(int aMetaData, int pass);
+
+ /**
+ * @return Icon of the Overlay (or null if there is no Icon)
+ */
+ IIcon getOverlayIcon(int aMetaData, int pass);
+
+ /**
+ * @return Color Modulation the Material is going to be rendered with.
+ */
+ short[] getRGBa(ItemStack aStack);
+
+ @SideOnly(Side.CLIENT)
+ default int getSpriteNumber() {
+ if (this instanceof Item) {
+ return ((Item) this).getSpriteNumber();
+ } else {
+ throw new RuntimeException(String.format("Class %s does not extend Item!", getClass()));
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ default boolean requiresMultipleRenderPasses() {
+ if (this instanceof Item) {
+ return ((Item) this).requiresMultipleRenderPasses();
+ } else {
+ throw new RuntimeException(String.format("Class %s does not extend Item!", getClass()));
+ }
+ }
+
+ default int getRenderPasses(int metadata) {
+ if (this instanceof Item) {
+ return ((Item) this).getRenderPasses(metadata);
+ } else {
+ throw new RuntimeException(String.format("Class %s does not extend Item!", getClass()));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/IGlobalWirelessEnergy.java b/src/main/java/gregtech/api/interfaces/IGlobalWirelessEnergy.java
new file mode 100644
index 0000000000..b931549a07
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IGlobalWirelessEnergy.java
@@ -0,0 +1,98 @@
+package gregtech.api.interfaces;
+
+import java.math.BigInteger;
+import java.util.UUID;
+
+import net.minecraft.entity.player.EntityPlayer;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.common.misc.WirelessNetworkManager;
+import gregtech.common.misc.spaceprojects.SpaceProjectManager;
+
+// If you are adding very late-game content feel free to tap into this interface.
+// The eventual goal is to bypass laser/dynamo stuff and have energy deposited directly from ultra-endgame
+// multi-blocks directly into the users network.
+/**
+ * Use WirelessNetworkManager instead
+ */
+@Deprecated
+public interface IGlobalWirelessEnergy {
+
+ // Adds a user to the energy map if they do not already exist. Otherwise, do
+ // nothing. Will also check if the user
+ // has changed their username and adjust the maps accordingly. This should be
+ // called infrequently. Ideally on first
+ // tick of a machine being placed only.
+
+ default void strongCheckOrAddUser(EntityPlayer user) {
+ WirelessNetworkManager.strongCheckOrAddUser(user.getUniqueID());
+ }
+
+ default void strongCheckOrAddUser(UUID user_uuid, String user_name) {
+ WirelessNetworkManager.strongCheckOrAddUser(user_uuid);
+ }
+
+ default void strongCheckOrAddUser(String user_uuid, String user_name) {
+ WirelessNetworkManager.strongCheckOrAddUser(UUID.fromString(user_uuid));
+ }
+
+ // ------------------------------------------------------------------------------------
+ // Add EU to the users global energy. You can enter a negative number to
+ // subtract it.
+ // If the value goes below 0 it will return false and not perform the operation.
+ // BigIntegers have much slower operations than longs/ints. You should call
+ // these methods
+ // as infrequently as possible and bulk store values to add to the global map.
+ default boolean addEUToGlobalEnergyMap(String userUUID, BigInteger EU) {
+ return WirelessNetworkManager.addEUToGlobalEnergyMap(UUID.fromString(userUUID), EU);
+ }
+
+ default boolean addEUToGlobalEnergyMap(UUID user_uuid, BigInteger EU) {
+ return addEUToGlobalEnergyMap(user_uuid.toString(), EU);
+ }
+
+ default boolean addEUToGlobalEnergyMap(UUID user_uuid, long EU) {
+ return addEUToGlobalEnergyMap(user_uuid.toString(), BigInteger.valueOf(EU));
+ }
+
+ default boolean addEUToGlobalEnergyMap(UUID user_uuid, int EU) {
+ return addEUToGlobalEnergyMap(user_uuid.toString(), BigInteger.valueOf(EU));
+ }
+
+ default boolean addEUToGlobalEnergyMap(String user_uuid, long EU) {
+ return addEUToGlobalEnergyMap(user_uuid, BigInteger.valueOf(EU));
+ }
+
+ default boolean addEUToGlobalEnergyMap(String user_uuid, int EU) {
+ return addEUToGlobalEnergyMap(user_uuid, BigInteger.valueOf(EU));
+ }
+
+ // ------------------------------------------------------------------------------------
+
+ default BigInteger getUserEU(String user_uuid) {
+ return WirelessNetworkManager.getUserEU(UUID.fromString(user_uuid));
+ }
+
+ // This overwrites the EU in the network. Only use this if you are absolutely
+ // sure you know what you are doing.
+ default void setUserEU(String user_uuid, BigInteger EU) {
+ WirelessNetworkManager.setUserEU(UUID.fromString(user_uuid), EU);
+ }
+
+ default String GetUsernameFromUUID(String uuid) {
+ return SpaceProjectManager.getPlayerNameFromUUID(UUID.fromString(uuid));
+ }
+
+ default String getUUIDFromUsername(String username) {
+ return SpaceProjectManager.getPlayerUUIDFromName(username)
+ .toString();
+ }
+
+ static void clearGlobalEnergyInformationMaps() {
+ WirelessNetworkManager.clearGlobalEnergyInformationMaps();
+ }
+
+ default UUID processInitialSettings(final IGregTechTileEntity machine) {
+ return WirelessNetworkManager.processInitialSettings(machine);
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/IGuiIcon.java b/src/main/java/gregtech/api/interfaces/IGuiIcon.java
new file mode 100644
index 0000000000..0bc7408250
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IGuiIcon.java
@@ -0,0 +1,19 @@
+package gregtech.api.interfaces;
+
+/**
+ * To allow addons to make use of GT_GuiIcon
+ */
+public interface IGuiIcon {
+
+ int getX();
+
+ int getY();
+
+ int getWidth();
+
+ int getHeight();
+
+ int getTexId();
+
+ IGuiIcon getOverlay();
+}
diff --git a/src/main/java/gregtech/api/interfaces/IGuiScreen.java b/src/main/java/gregtech/api/interfaces/IGuiScreen.java
new file mode 100644
index 0000000000..c33838fc7f
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IGuiScreen.java
@@ -0,0 +1,45 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.client.renderer.entity.RenderItem;
+
+import gregtech.api.gui.widgets.GT_GuiTooltip;
+
+public interface IGuiScreen {
+
+ interface IGuiElement {
+
+ void onInit();
+
+ default void onRemoved() {}
+
+ void draw(int mouseX, int mouseY, float parTicks);
+ }
+
+ void addToolTip(GT_GuiTooltip toolTip);
+
+ boolean removeToolTip(GT_GuiTooltip toolTip);
+
+ GuiButton getSelectedButton();
+
+ void clearSelectedButton();
+
+ void buttonClicked(GuiButton button);
+
+ int getGuiLeft();
+
+ int getGuiTop();
+
+ int getXSize();
+
+ int getYSize();
+
+ void addElement(IGuiElement element);
+
+ boolean removeElement(IGuiElement element);
+
+ RenderItem getItemRenderer();
+
+ FontRenderer getFontRenderer();
+}
diff --git a/src/main/java/gregtech/api/interfaces/IHasIndexedTexture.java b/src/main/java/gregtech/api/interfaces/IHasIndexedTexture.java
new file mode 100644
index 0000000000..ed31984b6e
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IHasIndexedTexture.java
@@ -0,0 +1,17 @@
+package gregtech.api.interfaces;
+
+/**
+ * To be implemented on blocks. Usually machine casing blocks.
+ */
+public interface IHasIndexedTexture {
+
+ /**
+ * Returns the statically mapped texture for this casing. Return
+ * {@link gregtech.api.enums.Textures.BlockIcons#ERROR_TEXTURE_INDEX} if meta maps to a nonexistent block, or the
+ * block does not have a statically mapped texture.
+ *
+ * @param aMeta block meta
+ * @return texture index into {@link gregtech.api.enums.Textures.BlockIcons#casingTexturePages}
+ */
+ int getTextureIndex(int aMeta);
+}
diff --git a/src/main/java/gregtech/api/interfaces/IHatchElement.java b/src/main/java/gregtech/api/interfaces/IHatchElement.java
new file mode 100644
index 0000000000..09f3385729
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IHatchElement.java
@@ -0,0 +1,198 @@
+package gregtech.api.interfaces;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.BiPredicate;
+import java.util.function.ToLongFunction;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_StructureUtility;
+import gregtech.api.util.IGT_HatchAdder;
+
+public interface IHatchElement<T> {
+
+ List<? extends Class<? extends IMetaTileEntity>> mteClasses();
+
+ IGT_HatchAdder<? super T> adder();
+
+ String name();
+
+ long count(T t);
+
+ default <T2 extends T> IHatchElement<T2> withMteClass(Class<? extends IMetaTileEntity> aClass) {
+ if (aClass == null) throw new IllegalArgumentException();
+ return withMteClasses(Collections.singletonList(aClass));
+ }
+
+ @SuppressWarnings("unchecked") // can't set SafeVarargs :(
+ default <T2 extends T> IHatchElement<T2> withMteClasses(Class<? extends IMetaTileEntity>... aClasses) {
+ if (aClasses == null) throw new IllegalArgumentException();
+ return withMteClasses(Arrays.asList(aClasses));
+ }
+
+ default <T2 extends T> IHatchElement<T2> withMteClasses(List<Class<? extends IMetaTileEntity>> aClasses) {
+ if (aClasses == null) throw new IllegalArgumentException();
+ return new HatchElement<>(aClasses, null, null, null, this);
+ }
+
+ default <T2 extends T> IHatchElement<T2> withAdder(IGT_HatchAdder<T2> aAdder) {
+ if (aAdder == null) throw new IllegalArgumentException();
+ return new HatchElement<>(null, aAdder, null, null, this);
+ }
+
+ default IHatchElement<T> withName(String aName) {
+ if (aName == null) throw new IllegalArgumentException();
+ return new HatchElement<>(null, null, aName, null, this);
+ }
+
+ default <T2 extends T> IHatchElement<T2> withCount(ToLongFunction<T2> aCount) {
+ if (aCount == null) throw new IllegalArgumentException();
+ return new HatchElement<>(null, null, null, aCount, this);
+ }
+
+ default <T2 extends T> IStructureElement<T2> newAny(int aCasingIndex, int aDot) {
+ if (aCasingIndex < 0 || aDot < 0) throw new IllegalArgumentException();
+ return GT_StructureUtility.<T2>buildHatchAdder()
+ .anyOf(this)
+ .casingIndex(aCasingIndex)
+ .dot(aDot)
+ .continueIfSuccess()
+ .build();
+ }
+
+ default <T2 extends T> IStructureElement<T2> newAny(int aCasingIndex, int aDot, ForgeDirection... allowedFacings) {
+ if (aCasingIndex < 0 || aDot < 0) throw new IllegalArgumentException();
+ return GT_StructureUtility.<T2>buildHatchAdder()
+ .anyOf(this)
+ .casingIndex(aCasingIndex)
+ .dot(aDot)
+ .continueIfSuccess()
+ .allowOnly(allowedFacings)
+ .build();
+ }
+
+ default <T2 extends T> IStructureElement<T2> newAny(int aCasingIndex, int aDot,
+ BiPredicate<? super T2, ? super IGregTechTileEntity> aShouldSkip) {
+ if (aCasingIndex < 0 || aDot < 0 || aShouldSkip == null) throw new IllegalArgumentException();
+ return GT_StructureUtility.<T2>buildHatchAdder()
+ .anyOf(this)
+ .casingIndex(aCasingIndex)
+ .dot(aDot)
+ .shouldSkip(aShouldSkip)
+ .continueIfSuccess()
+ .build();
+ }
+
+ default <T2 extends T> IHatchElement<T2> or(IHatchElement<? super T2> fallback) {
+ return new HatchElementEither<>(this, fallback);
+ }
+}
+
+class HatchElementEither<T> implements IHatchElement<T> {
+
+ private final IHatchElement<? super T> first, second;
+ private ImmutableList<? extends Class<? extends IMetaTileEntity>> mMteClasses;
+ private String name;
+
+ HatchElementEither(IHatchElement<? super T> first, IHatchElement<? super T> second) {
+ this.first = first;
+ this.second = second;
+ }
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ if (mMteClasses == null) mMteClasses = ImmutableList.<Class<? extends IMetaTileEntity>>builder()
+ .addAll(first.mteClasses())
+ .addAll(second.mteClasses())
+ .build();
+ return mMteClasses;
+ }
+
+ @Override
+ public IGT_HatchAdder<? super T> adder() {
+ return ((t, te, i) -> first.adder()
+ .apply(t, te, i)
+ || second.adder()
+ .apply(t, te, i));
+ }
+
+ @Override
+ public String name() {
+ if (name == null) name = first.name() + " or " + second.name();
+ return name;
+ }
+
+ @Override
+ public long count(T t) {
+ return first.count(t) + second.count(t);
+ }
+}
+
+class HatchElement<T> implements IHatchElement<T> {
+
+ private final List<Class<? extends IMetaTileEntity>> mClasses;
+ private final IGT_HatchAdder<? super T> mAdder;
+ private final String mName;
+ private final IHatchElement<? super T> mBacking;
+ private final ToLongFunction<? super T> mCount;
+
+ public HatchElement(List<Class<? extends IMetaTileEntity>> aMteClasses, IGT_HatchAdder<? super T> aAdder,
+ String aName, ToLongFunction<? super T> aCount, IHatchElement<? super T> aBacking) {
+ this.mClasses = aMteClasses;
+ this.mAdder = aAdder;
+ this.mName = aName;
+ this.mCount = aCount;
+ this.mBacking = aBacking;
+ }
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return mClasses == null ? mBacking.mteClasses() : mClasses;
+ }
+
+ @Override
+ public IGT_HatchAdder<? super T> adder() {
+ return mAdder == null ? mBacking.adder() : mAdder;
+ }
+
+ @Override
+ public String name() {
+ return mName == null ? mBacking.name() : mName;
+ }
+
+ @Override
+ public long count(T t) {
+ return mCount == null ? mBacking.count(t) : mCount.applyAsLong(t);
+ }
+
+ @Override
+ public <T2 extends T> IHatchElement<T2> withMteClasses(List<Class<? extends IMetaTileEntity>> aClasses) {
+ if (aClasses == null) throw new IllegalArgumentException();
+ return new HatchElement<>(aClasses, mAdder, mName, mCount, mBacking);
+ }
+
+ @Override
+ public <T2 extends T> IHatchElement<T2> withAdder(IGT_HatchAdder<T2> aAdder) {
+ if (aAdder == null) throw new IllegalArgumentException();
+ return new HatchElement<>(mClasses, aAdder, mName, mCount, mBacking);
+ }
+
+ @Override
+ public IHatchElement<T> withName(String aName) {
+ if (aName == null) throw new IllegalArgumentException();
+ return new HatchElement<>(mClasses, mAdder, aName, mCount, mBacking);
+ }
+
+ @Override
+ public <T2 extends T> IHatchElement<T2> withCount(ToLongFunction<T2> aCount) {
+ if (aCount == null) throw new IllegalArgumentException();
+ return new HatchElement<>(mClasses, mAdder, mName, aCount, mBacking);
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/IHeatingCoil.java b/src/main/java/gregtech/api/interfaces/IHeatingCoil.java
new file mode 100644
index 0000000000..37f7969d56
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IHeatingCoil.java
@@ -0,0 +1,20 @@
+package gregtech.api.interfaces;
+
+import java.util.function.Consumer;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.HeatingCoilLevel;
+
+public interface IHeatingCoil {
+
+ HeatingCoilLevel getCoilHeat(int meta);
+
+ default HeatingCoilLevel getCoilHeat(ItemStack stack) {
+ return getCoilHeat(stack.getItemDamage());
+ }
+
+ void setOnCoilCheck(Consumer<IHeatingCoil> callback);
+
+ Consumer<IHeatingCoil> getOnCoilCheck();
+}
diff --git a/src/main/java/gregtech/api/interfaces/IIconContainer.java b/src/main/java/gregtech/api/interfaces/IIconContainer.java
new file mode 100644
index 0000000000..525721bb5c
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IIconContainer.java
@@ -0,0 +1,48 @@
+package gregtech.api.interfaces;
+
+import static gregtech.api.enums.GT_Values.UNCOLORED_RGBA;
+
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public interface IIconContainer {
+
+ /**
+ * @return A regular Icon.
+ */
+ @SideOnly(Side.CLIENT)
+ IIcon getIcon();
+
+ /**
+ * @return Icon of the Overlay (or null if there is no Icon)
+ */
+ @SideOnly(Side.CLIENT)
+ IIcon getOverlayIcon();
+
+ /**
+ * @return the Amount of Render Passes for this Icon.
+ */
+ @SideOnly(Side.CLIENT)
+ default int getIconPasses() {
+ return 1;
+ }
+
+ /**
+ * @return the Default Texture File for this Icon.
+ */
+ @SideOnly(Side.CLIENT)
+ ResourceLocation getTextureFile();
+
+ @SideOnly(Side.CLIENT)
+ default short[] getIconColor(int aRenderPass) {
+ return UNCOLORED_RGBA;
+ }
+
+ @SideOnly(Side.CLIENT)
+ default boolean isUsingColorModulation(int aRenderPass) {
+ return aRenderPass == 0;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/IItemBehaviour.java b/src/main/java/gregtech/api/interfaces/IItemBehaviour.java
new file mode 100644
index 0000000000..67bb505c6b
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IItemBehaviour.java
@@ -0,0 +1,47 @@
+package gregtech.api.interfaces;
+
+import java.util.List;
+
+import net.minecraft.dispenser.IBlockSource;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.SubTag;
+import gregtech.api.items.GT_MetaBase_Item;
+
+public interface IItemBehaviour<E extends Item> {
+
+ boolean onLeftClickEntity(E aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity);
+
+ boolean onItemUse(E aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ int ordinalSide, float hitX, float hitY, float hitZ);
+
+ boolean onItemUseFirst(E aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ ForgeDirection side, float hitX, float hitY, float hitZ);
+
+ ItemStack onItemRightClick(E aItem, ItemStack aStack, World aWorld, EntityPlayer aPlayer);
+
+ List<String> getAdditionalToolTips(E aItem, List<String> aList, ItemStack aStack);
+
+ void onUpdate(E aItem, ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, boolean aIsInHand);
+
+ boolean isItemStackUsable(E aItem, ItemStack aStack);
+
+ boolean canDispense(E aItem, IBlockSource aSource, ItemStack aStack);
+
+ ItemStack onDispense(E aItem, IBlockSource aSource, ItemStack aStack);
+
+ boolean hasProjectile(GT_MetaBase_Item aItem, SubTag aProjectileType, ItemStack aStack);
+
+ EntityArrow getProjectile(E aItem, SubTag aProjectileType, ItemStack aStack, World aWorld, double aX, double aY,
+ double aZ);
+
+ EntityArrow getProjectile(E aItem, SubTag aProjectileType, ItemStack aStack, World aWorld, EntityLivingBase aEntity,
+ float aSpeed);
+}
diff --git a/src/main/java/gregtech/api/interfaces/IItemContainer.java b/src/main/java/gregtech/api/interfaces/IItemContainer.java
new file mode 100644
index 0000000000..de94606e95
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IItemContainer.java
@@ -0,0 +1,40 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+public interface IItemContainer {
+
+ Item getItem();
+
+ Block getBlock();
+
+ boolean isStackEqual(Object aStack);
+
+ boolean isStackEqual(Object aStack, boolean aWildcard, boolean aIgnoreNBT);
+
+ ItemStack get(long aAmount, Object... aReplacements);
+
+ ItemStack getWildcard(long aAmount, Object... aReplacements);
+
+ ItemStack getUndamaged(long aAmount, Object... aReplacements);
+
+ ItemStack getAlmostBroken(long aAmount, Object... aReplacements);
+
+ ItemStack getWithDamage(long aAmount, long aMetaValue, Object... aReplacements);
+
+ IItemContainer set(Item aItem);
+
+ IItemContainer set(ItemStack aStack);
+
+ IItemContainer registerOre(Object... aOreNames);
+
+ IItemContainer registerWildcardAsOre(Object... aOreNames);
+
+ ItemStack getWithCharge(long aAmount, int aEnergy, Object... aReplacements);
+
+ ItemStack getWithName(long aAmount, String aDisplayName, Object... aReplacements);
+
+ boolean hasBeenSet();
+}
diff --git a/src/main/java/gregtech/api/interfaces/IMaterialHandler.java b/src/main/java/gregtech/api/interfaces/IMaterialHandler.java
new file mode 100644
index 0000000000..ddd7e832dd
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IMaterialHandler.java
@@ -0,0 +1,6 @@
+package gregtech.api.interfaces;
+
+public interface IMaterialHandler {
+
+ void onMaterialsInit();
+}
diff --git a/src/main/java/gregtech/api/interfaces/INetworkUpdatableItem.java b/src/main/java/gregtech/api/interfaces/INetworkUpdatableItem.java
new file mode 100644
index 0000000000..1dd36d9998
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/INetworkUpdatableItem.java
@@ -0,0 +1,25 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+/**
+ * Together with {@link gregtech.api.net.GT_Packet_UpdateItem} you can request server side to update item in hand with a
+ * NBT tag.
+ * <p>
+ * Usual NBT tag size limit applies.
+ */
+public interface INetworkUpdatableItem {
+
+ /**
+ * Receive update from client. Runs on server thread.
+ *
+ * @param stack Stack being updated
+ * @param player player holding the stack
+ * @param tag received data
+ * @return true if this stack should be kept inside the player inventory. false if this stack should vanish (i.e.
+ * slot content set to null)
+ */
+ boolean receive(ItemStack stack, EntityPlayerMP player, NBTTagCompound tag);
+}
diff --git a/src/main/java/gregtech/api/interfaces/IOreRecipeRegistrator.java b/src/main/java/gregtech/api/interfaces/IOreRecipeRegistrator.java
new file mode 100644
index 0000000000..714342ae7e
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IOreRecipeRegistrator.java
@@ -0,0 +1,19 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+
+public interface IOreRecipeRegistrator {
+
+ /**
+ * Contains a Code Fragment, used in the OrePrefix to register Recipes. Better than using a switch/case, like I did
+ * before.
+ *
+ * @param aPrefix always != null
+ * @param aMaterial always != null, and can be == _NULL if the Prefix is Self Referencing or not Material based!
+ * @param aStack always != null
+ */
+ void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName, ItemStack aStack);
+}
diff --git a/src/main/java/gregtech/api/interfaces/IProjectileItem.java b/src/main/java/gregtech/api/interfaces/IProjectileItem.java
new file mode 100644
index 0000000000..64782bf04c
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IProjectileItem.java
@@ -0,0 +1,29 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import gregtech.api.enums.SubTag;
+
+public interface IProjectileItem {
+
+ /**
+ * @return if this Item has an Arrow Entity
+ */
+ boolean hasProjectile(SubTag aProjectileType, ItemStack aStack);
+
+ /**
+ * @return an Arrow Entity to be spawned. If null then this is not an Arrow. Note: Other Projectiles still extend
+ * EntityArrow
+ */
+ EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, double aX, double aY, double aZ);
+
+ /**
+ * @return an Arrow Entity to be spawned. If null then this is not an Arrow. Note: Other Projectiles still extend
+ * EntityArrow
+ */
+ EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, EntityLivingBase aEntity,
+ float aSpeed);
+}
diff --git a/src/main/java/gregtech/api/interfaces/IRecipeMap.java b/src/main/java/gregtech/api/interfaces/IRecipeMap.java
new file mode 100644
index 0000000000..ce48b29927
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IRecipeMap.java
@@ -0,0 +1,74 @@
+package gregtech.api.interfaces;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.function.Function;
+
+import javax.annotation.Nonnull;
+
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * Represents the target of a recipe adding action, usually, but not necessarily, is a recipe map itself.
+ */
+public interface IRecipeMap {
+
+ /**
+ * Add a downstream recipe map that will get to handle the original builder.
+ * <p>
+ * Downstream recipe maps got passed the recipe builder after parent recipe map is done with its business. Notice
+ * at this time the original recipe builder might be modified by the parent recipe map in some form, but it will
+ * remain as valid.
+ * <p>
+ * A downstream will only be invoked if parent recipe map added something.
+ *
+ * @param downstream the downstream recipe map to add
+ */
+ void addDownstream(IRecipeMap downstream);
+
+ /**
+ * Actually add the recipe represented by the builder. CAN modify the builder's internal states!!!
+ */
+ @Nonnull
+ Collection<GT_Recipe> doAdd(GT_RecipeBuilder builder);
+
+ /**
+ * Return a variant of this recipe map that will perform a deep copy on input recipe builder before doing anything
+ * to it.
+ * <p>
+ * The returned recipe map will not have any downstreams, but can accept new downstreams.
+ */
+ default IRecipeMap deepCopyInput() {
+ return newRecipeMap(b -> doAdd(b.copy()));
+ }
+
+ static IRecipeMap newRecipeMap(Function<? super GT_RecipeBuilder, Collection<GT_Recipe>> func) {
+ return new IRecipeMap() {
+
+ private final Collection<IRecipeMap> downstreams = new ArrayList<>();
+
+ @Override
+ public void addDownstream(IRecipeMap downstream) {
+ downstreams.add(downstream);
+ }
+
+ @Nonnull
+ @Override
+ public Collection<GT_Recipe> doAdd(GT_RecipeBuilder builder) {
+ List<Collection<GT_Recipe>> ret = new ArrayList<>();
+ Collection<GT_Recipe> out = func.apply(builder);
+ ret.add(out);
+ builder.clearInvalid();
+ if (!out.isEmpty()) {
+ for (IRecipeMap downstream : downstreams) {
+ ret.add(downstream.doAdd(builder));
+ }
+ }
+ return GT_Utility.concat(ret);
+ }
+ };
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/IRedstoneCircuitBlock.java b/src/main/java/gregtech/api/interfaces/IRedstoneCircuitBlock.java
new file mode 100644
index 0000000000..0eea6ca3a4
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IRedstoneCircuitBlock.java
@@ -0,0 +1,69 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.block.Block;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehavior;
+
+/**
+ * Implemented by the MetaTileEntity of the Redstone Circuit Block
+ */
+public interface IRedstoneCircuitBlock {
+
+ /**
+ * The Output Direction the Circuit Block is Facing
+ */
+ ForgeDirection getOutputFacing();
+
+ /**
+ * sets Output Redstone State at Side
+ */
+ boolean setRedstone(byte aStrength, ForgeDirection side);
+
+ /**
+ * returns Output Redstone State at Side Note that setRedstone checks if there is a Difference between the old and
+ * the new Setting before consuming any Energy
+ */
+ byte getOutputRedstone(ForgeDirection side);
+
+ /**
+ * returns Input Redstone Signal at Side
+ */
+ byte getInputRedstone(ForgeDirection side);
+
+ /**
+ * If this Side is Covered up and therefor not doing any Redstone
+ */
+ GT_CoverBehavior getCover(ForgeDirection side);
+
+ int getCoverID(ForgeDirection side);
+
+ int getCoverVariable(ForgeDirection side);
+
+ /**
+ * returns whatever Block-ID is adjacent to the Redstone Circuit Block
+ */
+ Block getBlockAtSide(ForgeDirection side);
+
+ /**
+ * returns whatever Meta-Value is adjacent to the Redstone Circuit Block
+ */
+ byte getMetaIDAtSide(ForgeDirection side);
+
+ /**
+ * returns whatever TileEntity is adjacent to the Redstone Circuit Block
+ */
+ TileEntity getTileEntityAtSide(ForgeDirection side);
+
+ /**
+ * returns whatever TileEntity is used by the Redstone Circuit Block
+ */
+ ICoverable getOwnTileEntity();
+
+ /**
+ * returns worldObj.rand.nextInt(aRange)
+ */
+ int getRandom(int aRange);
+}
diff --git a/src/main/java/gregtech/api/interfaces/ISecondaryDescribable.java b/src/main/java/gregtech/api/interfaces/ISecondaryDescribable.java
new file mode 100644
index 0000000000..1f480091fc
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/ISecondaryDescribable.java
@@ -0,0 +1,30 @@
+package gregtech.api.interfaces;
+
+/**
+ * To get a tooltip with a secondary description
+ */
+public interface ISecondaryDescribable extends IDescribable {
+
+ /**
+ * Convenient to call when overriding the `String[] getDescription()` method.
+ */
+ default String[] getCurrentDescription() {
+ if (isDisplaySecondaryDescription() && getSecondaryDescription() != null) {
+ return getSecondaryDescription();
+ }
+ return getPrimaryDescription();
+ }
+
+ String[] getPrimaryDescription();
+
+ String[] getSecondaryDescription();
+
+ /**
+ * This method will only be called on client side
+ *
+ * @return whether the secondary description should be display. default is false
+ */
+ default boolean isDisplaySecondaryDescription() {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/ISubTagContainer.java b/src/main/java/gregtech/api/interfaces/ISubTagContainer.java
new file mode 100644
index 0000000000..3e3690c67b
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/ISubTagContainer.java
@@ -0,0 +1,21 @@
+package gregtech.api.interfaces;
+
+import gregtech.api.enums.SubTag;
+
+public interface ISubTagContainer {
+
+ /**
+ * @return if the Tag is inside the List.
+ */
+ boolean contains(SubTag aTag);
+
+ /**
+ * @return The ISubTagContainer you called this Function on, for convenience.
+ */
+ ISubTagContainer add(SubTag... aTags);
+
+ /**
+ * @return if the Tag was there before it has been removed.
+ */
+ boolean remove(SubTag aTag);
+}
diff --git a/src/main/java/gregtech/api/interfaces/ITexture.java b/src/main/java/gregtech/api/interfaces/ITexture.java
new file mode 100644
index 0000000000..e97fa4539a
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/ITexture.java
@@ -0,0 +1,55 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+
+public interface ITexture {
+
+ void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ);
+
+ void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ);
+
+ void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ);
+
+ void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ);
+
+ void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ);
+
+ void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ);
+
+ boolean isValidTexture();
+
+ /**
+ * @return {@code true} if this texture is from the old package
+ */
+ default boolean isOldTexture() {
+ return true;
+ }
+
+ /**
+ * Will initialize the {@link Tessellator} if rendering off-world (Inventory)
+ *
+ * @param aRenderer The {@link RenderBlocks} Renderer
+ * @param aNormalX The X Normal for current Quad Face
+ * @param aNormalY The Y Normal for current Quad Face
+ * @param aNormalZ The Z Normal for current Quad Face
+ */
+ default void startDrawingQuads(RenderBlocks aRenderer, float aNormalX, float aNormalY, float aNormalZ) {
+ if (aRenderer.useInventoryTint && !isOldTexture()) {
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(aNormalX, aNormalY, aNormalZ);
+ }
+ }
+
+ /**
+ * Will run the {@link Tessellator} to draw Quads if rendering off-world (Inventory)
+ *
+ * @param aRenderer The {@link RenderBlocks} Renderer
+ */
+ default void draw(RenderBlocks aRenderer) {
+ if (aRenderer.useInventoryTint && !isOldTexture()) {
+ Tessellator.instance.draw();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/ITextureBuilder.java b/src/main/java/gregtech/api/interfaces/ITextureBuilder.java
new file mode 100644
index 0000000000..7c9672d521
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/ITextureBuilder.java
@@ -0,0 +1,109 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
+
+import gregtech.api.render.TextureFactory;
+
+/**
+ * <p>
+ * This Interface defines operations to configure and build instances of the {@link ITexture} implementations
+ * </p>
+ * <p>
+ * Use the {@link TextureFactory#builder()} method to get an instance of the {@link ITextureBuilder} implementation.
+ * </p>
+ */
+public interface ITextureBuilder {
+
+ /**
+ * Build the {@link ITexture}
+ *
+ * @return The built {@link ITexture}
+ * @throws IllegalStateException if setFromBlock has never been called.
+ */
+ ITexture build();
+
+ /**
+ * @param block The {@link Block}
+ * @param meta The meta value for the Block
+ * @return {@link ITextureBuilder} for chaining
+ */
+ ITextureBuilder setFromBlock(final Block block, final int meta);
+
+ /**
+ * @param side
+ * <p>
+ * The {@link ForgeDirection} side providing the texture
+ * </p>
+ * <p>
+ * Default is {@link ForgeDirection#UNKNOWN} to use same side as rendered
+ * </p>
+ * @return {@link ITextureBuilder} for chaining
+ */
+ ITextureBuilder setFromSide(final ForgeDirection side);
+
+ /**
+ * @param iconContainers The {@link IIconContainer}s to add
+ * @return {@link ITextureBuilder} for chaining
+ */
+ ITextureBuilder addIcon(final IIconContainer... iconContainers);
+
+ /**
+ * @param rgba The RGBA tint for this {@link ITexture}
+ * @return {@link ITextureBuilder} for chaining
+ */
+ ITextureBuilder setRGBA(final short[] rgba);
+
+ /**
+ * @param iTextures The {@link ITexture} layers to add
+ * @return {@link ITextureBuilder} for chaining
+ */
+ ITextureBuilder addLayer(final ITexture... iTextures);
+
+ /**
+ * Set alpha blending
+ *
+ * @param allowAlpha to set
+ *
+ * @return {@link ITextureBuilder} for chaining
+ */
+ ITextureBuilder setAllowAlpha(final boolean allowAlpha);
+
+ /**
+ * Texture will render with same orientation as with vanilla blocks
+ *
+ * @return {@link ITextureBuilder} for chaining
+ */
+ ITextureBuilder stdOrient();
+
+ /**
+ * Force using world coord overload of getIcon.
+ *
+ * @return {@link ITextureBuilder} for chaining
+ * @throws IllegalStateException if setFromBlock has never been called.
+ */
+ ITextureBuilder useWorldCoord();
+
+ /**
+ * Force using meta overload of getIcon.
+ *
+ * @return {@link ITextureBuilder} for chaining
+ */
+ ITextureBuilder noWorldCoord();
+
+ /**
+ * Texture will orientate from block's {@link ExtendedFacing}
+ *
+ * @return {@link ITextureBuilder} for chaining
+ */
+ ITextureBuilder extFacing();
+
+ /**
+ * Texture always render with full brightness to glow in the dark
+ *
+ * @return {@link ITextureBuilder} for chaining
+ */
+ ITextureBuilder glow();
+}
diff --git a/src/main/java/gregtech/api/interfaces/IToolStats.java b/src/main/java/gregtech/api/interfaces/IToolStats.java
new file mode 100644
index 0000000000..9d8da63b6c
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/IToolStats.java
@@ -0,0 +1,206 @@
+package gregtech.api.interfaces;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.enchantment.Enchantment;
+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.DamageSource;
+import net.minecraft.world.World;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.api.items.GT_MetaGenerated_Tool;
+
+/**
+ * The Stats for GT Tools. Not including any Material Modifiers.
+ * <p/>
+ * And this is supposed to not have any ItemStack Parameters as these are generic Stats.
+ */
+public interface IToolStats {
+
+ /**
+ * Called when aPlayer crafts this Tool
+ */
+ void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer);
+
+ /**
+ * Called when this gets added to a Tool Item
+ */
+ void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID);
+
+ /**
+ * @implNote if you are only modifying drops, override
+ * {@link #convertBlockDrops(List, ItemStack, EntityPlayer, Block, int, int, int, byte, int, boolean, BlockEvent.HarvestDropsEvent)}
+ * @param player The player
+ * @param x Block pos
+ * @param y Block pos
+ * @param z Block pos
+ * @param block the block
+ * @param metadata block metadata
+ * @param tile TileEntity of the block if exist
+ * @param event the event, cancel it to prevent the block from being broken
+ */
+ default void onBreakBlock(@Nonnull EntityPlayer player, int x, int y, int z, @Nonnull Block block, byte metadata,
+ @Nullable TileEntity tile, @Nonnull BlockEvent.BreakEvent event) {}
+
+ /**
+ * @return Damage the Tool receives when breaking a Block. 100 is one Damage Point (or 100 EU).
+ */
+ int getToolDamagePerBlockBreak();
+
+ /**
+ * @return Damage the Tool receives when converting the drops of a Block. 100 is one Damage Point (or 100 EU).
+ */
+ int getToolDamagePerDropConversion();
+
+ /**
+ * @return Damage the Tool receives when being used as Container Item. 100 is one use, however it is usually 8 times
+ * more than normal.
+ */
+ int getToolDamagePerContainerCraft();
+
+ /**
+ * @return Damage the Tool receives when being used as Weapon, 200 is the normal Value, 100 for actual Weapons.
+ */
+ int getToolDamagePerEntityAttack();
+
+ /**
+ * @return Basic Quality of the Tool, 0 is normal. If increased, it will increase the general quality of all Tools
+ * of this Type. Decreasing is also possible.
+ */
+ int getBaseQuality();
+
+ /**
+ * @return The Damage Bonus for this Type of Tool against Mobs. 1.0F is normal punch.
+ */
+ float getBaseDamage();
+
+ /**
+ * @return This gets the Hurt Resistance time for Entities getting hit. (always does 1 as minimum)
+ */
+ int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity);
+
+ /**
+ * @return This is a multiplier for the Tool Speed. 1.0F = no special Speed.
+ */
+ float getSpeedMultiplier();
+
+ /**
+ * @return This is a multiplier for the Tool Speed. 1.0F = no special Durability.
+ */
+ float getMaxDurabilityMultiplier();
+
+ DamageSource getDamageSource(EntityLivingBase aPlayer, Entity aEntity);
+
+ String getMiningSound();
+
+ String getCraftingSound();
+
+ String getEntityHitSound();
+
+ String getBreakingSound();
+
+ Enchantment[] getEnchantments(ItemStack aStack);
+
+ int[] getEnchantmentLevels(ItemStack aStack);
+
+ /**
+ * @return If this Tool can be used for blocking Damage like a Sword.
+ */
+ boolean canBlock();
+
+ /**
+ * @return If this Tool can be used as an RC Crowbar.
+ */
+ boolean isCrowbar();
+
+ /**
+ * @return If this Tool can be used as an FR Grafter.
+ */
+ boolean isGrafter();
+
+ boolean isChainsaw();
+
+ /**
+ * @return If this Tool can be used as an BC Wrench.
+ */
+ boolean isWrench();
+
+ /**
+ * @return if this Tool can be used as an PR screwdriver
+ */
+ default boolean isScrewdriver() {
+ return false;
+ }
+
+ /**
+ * @return If this Tool can be used as Weapon i.e. if that is the main purpose.
+ */
+ boolean isWeapon();
+
+ /**
+ * @return If this Tool is a Ranged Weapon. Return false at isWeapon unless you have a Blade attached to your
+ * Bow/Gun or something
+ */
+ boolean isRangedWeapon();
+
+ /**
+ * @return If this Tool can be used as Weapon i.e. if that is the main purpose.
+ */
+ boolean isMiningTool();
+
+ /**
+ * {@link Block#getHarvestTool(int)} can return the following Values for example. "axe", "pickaxe", "sword",
+ * "shovel", "hoe", "grafter", "saw", "wrench", "crowbar", "file", "hammer", "plow", "plunger", "scoop",
+ * "screwdriver", "sense", "scythe", "softhammer", "cutter", "plasmatorch"
+ *
+ * @return If this is a minable Block. Tool Quality checks (like Diamond Tier or something) are separate from this
+ * check.
+ */
+ boolean isMinableBlock(Block aBlock, byte aMetaData);
+
+ /**
+ * This lets you modify the Drop List, when this type of Tool has been used.
+ *
+ * @return the Amount of modified Items, used to determine the extra durability cost
+ */
+ int convertBlockDrops(List<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, int aY,
+ int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent);
+
+ /**
+ * @return Returns a broken Version of the Item.
+ */
+ ItemStack getBrokenItem(ItemStack aStack);
+
+ /**
+ * @return the Damage actually done to the Mob.
+ */
+ float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, EntityPlayer aPlayer);
+
+ /**
+ * @return the Damage actually done to the Mob.
+ */
+ float getMagicDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack, EntityPlayer aPlayer);
+
+ IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack);
+
+ short[] getRGBa(boolean aIsToolHead, ItemStack aStack);
+
+ float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World worldObj, int aX,
+ int aY, int aZ);
+
+ default String getToolTypeName() {
+ return null;
+ };
+
+ default byte getMaxMode() {
+ return 1;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/covers/IControlsWorkCover.java b/src/main/java/gregtech/api/interfaces/covers/IControlsWorkCover.java
new file mode 100644
index 0000000000..d4cd1e9ec2
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/covers/IControlsWorkCover.java
@@ -0,0 +1,30 @@
+package gregtech.api.interfaces.covers;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+
+/**
+ * Marker interface for covers that might control whether the work can start on a {@link IMachineProgress}.
+ */
+public interface IControlsWorkCover {
+
+ /**
+ * Make sure there is only one GT_Cover_ControlsWork on the aTileEntity TODO this is a migration thing. Remove this
+ * after 2.3.0 is released.
+ *
+ * @return true if the cover is the first (side) one
+ **/
+ static boolean makeSureOnlyOne(ForgeDirection aMySide, ICoverable aTileEntity) {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (aTileEntity.getCoverBehaviorAtSideNew(side) instanceof IControlsWorkCover
+ && side.ordinal() < aMySide.ordinal()) {
+ aTileEntity.dropCover(side, side, true);
+ aTileEntity.markDirty();
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/fluid/IFluidStore.java b/src/main/java/gregtech/api/interfaces/fluid/IFluidStore.java
new file mode 100644
index 0000000000..047cf4df5b
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/fluid/IFluidStore.java
@@ -0,0 +1,22 @@
+package gregtech.api.interfaces.fluid;
+
+import javax.annotation.Nonnull;
+
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidTank;
+
+/**
+ * Objects implementing this interface can be used for storing certain fluid, especially for recipe output.
+ */
+public interface IFluidStore extends IFluidTank {
+
+ /**
+ * @return If this does not have partially filled fluid nor have restriction on what fluid to accept.
+ */
+ boolean isEmptyAndAcceptsAnyFluid();
+
+ /**
+ * @return Whether to allow given fluid to be inserted into this.
+ */
+ boolean canStoreFluid(@Nonnull FluidStack fluidStack);
+}
diff --git a/src/main/java/gregtech/api/interfaces/fluid/IGT_Fluid.java b/src/main/java/gregtech/api/interfaces/fluid/IGT_Fluid.java
new file mode 100644
index 0000000000..7c8b2b3f11
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/fluid/IGT_Fluid.java
@@ -0,0 +1,14 @@
+package gregtech.api.interfaces.fluid;
+
+import net.minecraftforge.fluids.FluidRegistry;
+
+@SuppressWarnings("unused") // API might legitimately expose unused methods within this local project's scope
+public interface IGT_Fluid {
+
+ /**
+ * Adds this {@link IGT_Fluid} to the {@link FluidRegistry} and internally-implemented registrations
+ *
+ * @return {@link IGT_RegisteredFluid} The GregTech registered fluid
+ */
+ IGT_RegisteredFluid addFluid();
+}
diff --git a/src/main/java/gregtech/api/interfaces/fluid/IGT_FluidBuilder.java b/src/main/java/gregtech/api/interfaces/fluid/IGT_FluidBuilder.java
new file mode 100644
index 0000000000..f15b148fcb
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/fluid/IGT_FluidBuilder.java
@@ -0,0 +1,96 @@
+package gregtech.api.interfaces.fluid;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gregtech.api.enums.FluidState;
+
+@SuppressWarnings("unused") // API might legitimately expose unused methods within this local project's scope
+public interface IGT_FluidBuilder {
+
+ /**
+ * @param colorRGBA The {@code short[]} RGBA color of the {@link Fluid} or {@code null} for no defined RGBA color
+ * @return {@link IGT_FluidBuilder} self for call chaining
+ */
+ @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value
+ IGT_FluidBuilder withColorRGBA(final short[] colorRGBA);
+
+ /**
+ * @param localizedName The localized name of this {@link IGT_FluidBuilder}
+ * @return {@link IGT_FluidBuilder} self for call chaining
+ */
+ @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value
+ IGT_FluidBuilder withLocalizedName(final String localizedName);
+
+ /**
+ * @param fluidState The {@link FluidState} of this {@link IGT_FluidBuilder}
+ * @param temperature The Kelvin temperature of this {@link IGT_FluidBuilder}
+ * @return {@link IGT_FluidBuilder} self for call chaining
+ */
+ @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value
+ IGT_FluidBuilder withStateAndTemperature(final FluidState fluidState, final int temperature);
+
+ /**
+ * @param stillIconResourceLocation the {@link ResourceLocation} of the still fluid icon
+ * @return {@link IGT_FluidBuilder} self for call chaining
+ */
+ @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value
+ IGT_FluidBuilder withStillIconResourceLocation(final ResourceLocation stillIconResourceLocation);
+
+ /**
+ * @param flowingIconResourceLocation the {@link ResourceLocation} of the flowing fluid icon
+ * @return {@link IGT_FluidBuilder} self for call chaining
+ */
+ @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value
+ IGT_FluidBuilder withFlowingIconResourceLocation(final ResourceLocation flowingIconResourceLocation);
+
+ /**
+ * @param textureName The name of the GregTech mod texture of this {@link IGT_FluidBuilder}
+ * @return {@link IGT_FluidBuilder} self for call chaining
+ */
+ @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value
+ IGT_FluidBuilder withTextureName(final String textureName);
+
+ /**
+ * @param fluidBlock the {@link Block} implementation of the {@link IGT_Fluid}
+ * @return {@link IGT_FluidBuilder} self for call chaining
+ */
+ @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value
+ IGT_FluidBuilder withFluidBlock(final Block fluidBlock);
+
+ /**
+ * @param fromFluid the {@link Fluid} to copy the icons from
+ * @return {@link IGT_FluidBuilder} self for call chaining
+ */
+ @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value
+ IGT_FluidBuilder withIconsFrom(@Nonnull final Fluid fromFluid);
+
+ /**
+ * @param stillIconResourceLocation The {@link ResourceLocation} of the still fluid texture
+ * @param flowingIconResourceLocation The {@link ResourceLocation} of the flowing fluid texture
+ * @return {@link IGT_FluidBuilder} self for call chaining
+ */
+ @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value
+ IGT_FluidBuilder withTextures(final ResourceLocation stillIconResourceLocation,
+ final ResourceLocation flowingIconResourceLocation);
+
+ /**
+ * Builds the {@link IGT_Fluid}
+ *
+ * @return the built {@link IGT_Fluid}
+ */
+ IGT_Fluid build();
+
+ /**
+ * Builds, then adds the {@link IGT_Fluid} to the {@link FluidRegistry}
+ *
+ * @return the {@link IGT_Fluid}
+ * @see #build()
+ * @see IGT_Fluid#addFluid()
+ */
+ IGT_RegisteredFluid buildAndRegister();
+}
diff --git a/src/main/java/gregtech/api/interfaces/fluid/IGT_RegisteredFluid.java b/src/main/java/gregtech/api/interfaces/fluid/IGT_RegisteredFluid.java
new file mode 100644
index 0000000000..181824874c
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/fluid/IGT_RegisteredFluid.java
@@ -0,0 +1,60 @@
+package gregtech.api.interfaces.fluid;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+
+import gregtech.api.enums.FluidState;
+import gregtech.api.enums.Materials;
+
+public interface IGT_RegisteredFluid {
+
+ /**
+ * Registers the containers in the {@link FluidContainerRegistry} for this {@link IGT_RegisteredFluid}
+ *
+ * @param fullContainer The full fluid container
+ * @param emptyContainer The empty fluid container
+ * @param containerSize The size of the container
+ * @return The {@link IGT_RegisteredFluid} for call chaining
+ */
+ @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value
+ IGT_RegisteredFluid registerContainers(final ItemStack fullContainer, final ItemStack emptyContainer,
+ final int containerSize);
+
+ /**
+ * Registers the bucket-sized 1000L containers in the {@link FluidContainerRegistry} for this
+ * {@link IGT_RegisteredFluid}
+ *
+ * @param fullContainer The full container to associate with this {@link IGT_RegisteredFluid}
+ * @param emptyContainer The empty container associate with this {@link IGT_RegisteredFluid}
+ * @return {@link IGT_RegisteredFluid} for call chaining
+ */
+ @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value
+ IGT_RegisteredFluid registerBContainers(final ItemStack fullContainer, final ItemStack emptyContainer);
+
+ /**
+ * Registers the potion-sized 250L containers in the {@link FluidContainerRegistry} for this
+ * {@link IGT_RegisteredFluid}
+ *
+ * @param fullContainer The full container to associate with this {@link IGT_RegisteredFluid}
+ * @param emptyContainer The empty container associate with this {@link IGT_RegisteredFluid}
+ * @return {@link IGT_RegisteredFluid} self for call chaining
+ */
+ @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value
+ IGT_RegisteredFluid registerPContainers(final ItemStack fullContainer, final ItemStack emptyContainer);
+
+ /**
+ * Updates the {@link Materials}'s fluids from this {@link IGT_RegisteredFluid}'s state
+ *
+ * @param material the {@link Materials} to configure based on this {@link IGT_RegisteredFluid} and
+ * {@link FluidState}
+ * @return The {@link IGT_RegisteredFluid} for call chaining
+ */
+ @SuppressWarnings("UnusedReturnValue") // Last call in chain, may not use this returned value
+ IGT_RegisteredFluid configureMaterials(final Materials material);
+
+ /**
+ * @return this {@link IGT_RegisteredFluid} cast to {@link Fluid}
+ */
+ Fluid asFluid();
+}
diff --git a/src/main/java/gregtech/api/interfaces/internal/IBCTileEntity.java b/src/main/java/gregtech/api/interfaces/internal/IBCTileEntity.java
new file mode 100644
index 0000000000..4acfa62549
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/internal/IBCTileEntity.java
@@ -0,0 +1,8 @@
+package gregtech.api.interfaces.internal;
+
+/**
+ * A simple compound Interface for generic BuildCraft Code.
+ */
+public interface IBCTileEntity /* extends IPowerReceptor */ {
+ //
+}
diff --git a/src/main/java/gregtech/api/interfaces/internal/IGT_CraftingRecipe.java b/src/main/java/gregtech/api/interfaces/internal/IGT_CraftingRecipe.java
new file mode 100644
index 0000000000..3f29736470
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/internal/IGT_CraftingRecipe.java
@@ -0,0 +1,8 @@
+package gregtech.api.interfaces.internal;
+
+import net.minecraft.item.crafting.IRecipe;
+
+public interface IGT_CraftingRecipe extends IRecipe {
+
+ boolean isRemovable();
+}
diff --git a/src/main/java/gregtech/api/interfaces/internal/IGT_Mod.java b/src/main/java/gregtech/api/interfaces/internal/IGT_Mod.java
new file mode 100644
index 0000000000..dbf888ef96
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/internal/IGT_Mod.java
@@ -0,0 +1,50 @@
+package gregtech.api.interfaces.internal;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+/**
+ * Interface used by the Mods Main Class to reference to internals.
+ * <p/>
+ * Don't even think about including this File in your Mod.
+ */
+public interface IGT_Mod {
+
+ /**
+ * This means that Server specific Basefiles are definitely existing! Not if the World is actually server side or
+ * not!
+ */
+ boolean isServerSide();
+
+ /**
+ * This means that Client specific Basefiles are definitely existing! Not if the World is actually client side or
+ * not!
+ */
+ boolean isClientSide();
+
+ /**
+ * This means that Bukkit specific Basefiles are definitely existing! Not if the World is actually bukkit server or
+ * not!
+ */
+ boolean isBukkitSide();
+
+ /**
+ * works only ClientSide otherwise returns null
+ */
+ EntityPlayer getThePlayer();
+
+ // ---------- Internal Usage Only ----------
+
+ /**
+ * works only ClientSide otherwise returns 0
+ *
+ * @return the Index of the added Armor
+ */
+ int addArmor(String aArmorPrefix);
+
+ /**
+ * Plays the Sonictron Sound for the ItemStack on the Client Side
+ */
+ void doSonictronSound(ItemStack aStack, World aWorld, double aX, double aY, double aZ);
+}
diff --git a/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java b/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java
new file mode 100644
index 0000000000..e7abfea98f
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java
@@ -0,0 +1,1069 @@
+package gregtech.api.interfaces.internal;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeBuilder;
+
+public interface IGT_RecipeAdder {
+
+ /**
+ * Adds a FusionreactorRecipe Does not work anymore!
+ */
+
+ @Deprecated
+ boolean addFusionReactorRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, int aFusionDurationInTicks,
+ int aFusionEnergyPerTick, int aEnergyNeededForStartingFusion);
+
+ /**
+ * Adds a FusionreactorRecipe
+ *
+ * @param aInput1 = first Input (not null, and respects StackSize)
+ * @param aInput2 = second Input (not null, and respects StackSize)
+ * @param aOutput1 = Output of the Fusion (can be null, and respects StackSize)
+ * @param aFusionDurationInTicks = How many ticks the Fusion lasts (must be > 0)
+ * @param aFusionEnergyPerTick = The EU generated per Tick (can even be negative!)
+ * @param aEnergyNeededForStartingFusion = EU needed for heating the Reactor up (must be >= 0)
+ * @return true if the Recipe got added, otherwise false.
+ */
+
+ @Deprecated
+ boolean addFusionReactorRecipe(FluidStack aInput1, FluidStack aInput2, FluidStack aOutput1,
+ int aFusionDurationInTicks, int aFusionEnergyPerTick, int aEnergyNeededForStartingFusion);
+
+ /**
+ * Adds a Fusion Reactor Recipe
+ *
+ * @param FluidInputArray Array of input fluids. Up to 16.
+ * @param FluidOutputArray Array of output fluids. Up to 16.
+ * @param aFusionDurationInTicks How many ticks the Fusion lasts (must be > 0).
+ * @param aFusionEnergyPerTick The EU consumed per tick to keep the reaction going.
+ * @param aEnergyNeededForStartingFusion EU needed to initialize the fusion reaction. (must be >= 0).
+ * @return true if the recipe got added, otherwise false.
+ */
+
+ @Deprecated
+ boolean addFusionReactorRecipe(FluidStack[] FluidInputArray, FluidStack[] FluidOutputArray,
+ int aFusionDurationInTicks, int aFusionEnergyPerTick, int aEnergyNeededForStartingFusion);
+
+ /**
+ * Adds a Centrifuge Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aOutput1 must be != null
+ * @param aOutput2 can be null
+ * @param aOutput3 can be null
+ * @param aOutput4 can be null
+ * @param aDuration must be > 0
+ */
+
+ @Deprecated
+ boolean addCentrifugeRecipe(ItemStack aInput1, int aInput2, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, ItemStack aOutput4, ItemStack aOutput5, ItemStack aOutput6, int aDuration);
+
+ @Deprecated
+ boolean addCentrifugeRecipe(ItemStack aInput1, int aInput2, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, ItemStack aOutput4, ItemStack aOutput5, ItemStack aOutput6, int aDuration, int aEUt);
+
+ /**
+ * Adds a Centrifuge Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aOutput1 must be != null
+ * @param aOutput2 can be null
+ * @param aOutput3 can be null
+ * @param aOutput4 can be null
+ * @param aDuration must be > 0
+ */
+ @Deprecated
+ boolean addCentrifugeRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, ItemStack aOutput4, ItemStack aOutput5,
+ ItemStack aOutput6, int[] aChances, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addCentrifugeRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, ItemStack aOutput4, ItemStack aOutput5,
+ ItemStack aOutput6, int[] aChances, int aDuration, int aEUt, boolean aCleanroom);
+
+ /**
+ * @param aInput1 must be != null
+ * @param aOutput1 must be != null
+ * @param aDuration must be > 0
+ * @return if the recipe was successfully added
+ */
+
+ @Deprecated
+ boolean addCompressorRecipe(ItemStack aInput1, ItemStack aOutput1, int aDuration, int aEUt);
+
+ /**
+ * Adds a Electrolyzer Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aOutput1 must be != null
+ * @param aOutput2 can be null
+ * @param aOutput3 can be null
+ * @param aOutput4 can be null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addElectrolyzerRecipe(ItemStack aInput1, int aInput2, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, ItemStack aOutput4, ItemStack aOutput5, ItemStack aOutput6, int aDuration, int aEUt);
+
+ /**
+ * Adds a Electrolyzer Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aOutput1 must be != null
+ * @param aOutput2 can be null
+ * @param aOutput3 can be null
+ * @param aOutput4 can be null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addElectrolyzerRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, ItemStack aOutput4, ItemStack aOutput5,
+ ItemStack aOutput6, int[] aChances, int aDuration, int aEUt);
+
+ /**
+ * Adds a Chemical Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aInput2 must be != null
+ * @param aOutput must be != null
+ * @param aDuration must be > 0
+ */
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput, int aDuration);
+
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds a Chemical Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aInput2 must be != null
+ * @param aOutput must be != null
+ * @param aDuration must be > 0
+ */
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack aOutput, int aDuration);
+
+ /**
+ * Adds a Chemical Recipe Only use this when the recipe conflicts in MultiBlock!
+ *
+ * @param aInput1 must be != null
+ * @param aInput2 must be != null
+ * @param aOutput must be != null
+ * @param aOutput2 must be != null
+ * @param aDuration must be > 0
+ */
+ @Deprecated
+ boolean addChemicalRecipeForBasicMachineOnly(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput, ItemStack aOutput2, int aDuration, int aEUtick);
+
+ /**
+ * Adds a Chemical Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aInput2 must be != null
+ * @param aOutput must be != null
+ * @param aOutput2 must be != null
+ * @param aDuration must be > 0
+ */
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack aOutput, ItemStack aOutput2, int aDuration);
+
+ /**
+ * Adds Recipes for creating a radically polymerized polymer from a base Material (for example Ethylene ->
+ * Polyethylene)
+ *
+ * @param aBasicMaterial The basic Material
+ * @param aBasicMaterialCell The corresponding Cell basic Material
+ * @param aPolymer The polymer
+ */
+ void addDefaultPolymerizationRecipes(Fluid aBasicMaterial, ItemStack aBasicMaterialCell, Fluid aPolymer);
+
+ /**
+ * Adds a Chemical Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aInput2 must be != null
+ * @param aOutput must be != null
+ * @param aDuration must be > 0
+ * @param aEUtick must be > 0
+ */
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack aOutput, int aDuration, int aEUtick);
+
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack aOutput, ItemStack aOutput2, int aDuration, int aEUtick, boolean aCleanroom);
+
+ /**
+ * Adds a Chemical Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aInput2 must be != null
+ * @param aOutput must be != null
+ * @param aOutput2 must be != null
+ * @param aDuration must be > 0
+ * @param aEUtick must be > 0
+ */
+ @Deprecated
+ boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack aOutput, ItemStack aOutput2, int aDuration, int aEUtick);
+
+ /**
+ * Adds a Chemical Recipe that only exists in the Large Chemical Reactor
+ *
+ * @param aInputs item inputs
+ * @param aFluidInputs fluid inputs
+ * @param aFluidOutputs fluid outputs
+ * @param aOutputs item outputs
+ * @param aDuration must be > 0
+ * @param aEUtick must be > 0 <br>
+ * aInputs and aFluidInputs must contain at least one valid input. <br>
+ * aOutputs and aFluidOutputs must contain at least one valid output.
+ *
+ */
+ @Deprecated
+ boolean addMultiblockChemicalRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs,
+ ItemStack[] aOutputs, int aDuration, int aEUtick);
+
+ /**
+ * Adds a Blast Furnace Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aInput2 can be null
+ * @param aOutput1 must be != null
+ * @param aOutput2 can be null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ * @param aLevel should be > 0 is the minimum Heat Level needed for this Recipe
+ */
+ @Deprecated
+ boolean addBlastRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, ItemStack aOutput2, int aDuration,
+ int aEUt, int aLevel);
+
+ /**
+ * Adds a Blast Furnace Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aInput2 can be null
+ * @param aOutput1 must be != null
+ * @param aOutput2 can be null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ * @param aLevel should be > 0 is the minimum Heat Level needed for this Recipe
+ */
+ @Deprecated
+ boolean addBlastRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack aOutput1, ItemStack aOutput2, int aDuration, int aEUt, int aLevel);
+
+ @Deprecated
+ boolean addBlastRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ ItemStack aOutput4, int aDuration, int aEUt, int aLevel);
+
+ /**
+ * Adds a Plasma Forge Recipe
+ *
+ * @param ItemInputArray Array of input items.
+ * @param FluidInputArray Array of output items.
+ * @param OutputItemArray Array of input fluids.
+ * @param FluidOutputArray Array of output items.
+ * @param aDuration Must be > 0. Duration in ticks.
+ * @param aEUt Should be > 0. EU/t.
+ * @param coil_heat_level Should be > 0. Heat of the coils used.
+ */
+ @Deprecated
+ boolean addPlasmaForgeRecipe(ItemStack[] ItemInputArray, FluidStack[] FluidInputArray, ItemStack[] OutputItemArray,
+ FluidStack[] FluidOutputArray, int aDuration, int aEUt, int coil_heat_level);
+
+ @Deprecated
+ boolean addPrimitiveBlastRecipe(ItemStack aInput1, ItemStack aInput2, int aCoalAmount, ItemStack aOutput1,
+ ItemStack aOutput2, int aDuration);
+
+ /**
+ * Adds a Canning Machine Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aOutput1 must be != null
+ * @param aDuration must be > 0, 100 ticks is standard.
+ * @param aEUt should be > 0, 1 EU/t is standard.
+ */
+ @Deprecated
+ boolean addCannerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, ItemStack aOutput2, int aDuration,
+ int aEUt);
+
+ /**
+ * Adds an Alloy Smelter Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aInput2 can be null
+ * @param aOutput1 must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addAlloySmelterRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addAlloySmelterRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, int aDuration, int aEUt,
+ boolean hidden);
+
+ /**
+ * Adds an Assembler Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aOutput1 must be != null
+ * @param aInput2 must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addAssemblerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, int aDuration, int aEUt);
+
+ /**
+ * Adds an Assembler Recipe
+ *
+ * @param aInputs must be != null
+ * @param aOutput1 must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ *
+ */
+ @Deprecated
+ boolean addAssemblerRecipe(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack aOutput1, int aDuration,
+ int aEUt);
+
+ /**
+ * Adds an Assembler Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aOutput1 must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addAssemblerRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, ItemStack aOutput1,
+ int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addAssemblerRecipe(ItemStack aInput1, Object aOreDict, int aAmount, FluidStack aFluidInput,
+ ItemStack aOutput1, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addAssemblerRecipe(ItemStack[] aInputs, Object aOreDict, int aAmount, FluidStack aFluidInput,
+ ItemStack aOutput1, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addAssemblerRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, ItemStack aOutput1,
+ int aDuration, int aEUt, boolean aCleanroom);
+
+ @Deprecated
+ boolean addAssemblerRecipe(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack aOutput1, int aDuration, int aEUt,
+ boolean aCleanroom);
+
+ /**
+ * Adds an Circuit Assembler Recipe
+ *
+ * @param aInputs must be 1-6 ItemStacks
+ * @param aFluidInput 0-1 fluids
+ * @param aOutput must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addCircuitAssemblerRecipe(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack aOutput, int aDuration,
+ int aEUt);
+
+ @Deprecated
+ boolean addCircuitAssemblerRecipe(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack aOutput, int aDuration,
+ int aEUt, boolean aCleanroom);
+
+ /**
+ * Adds an Assemblyline Recipe
+ *
+ * @param aInputs must be != null, 4-16 inputs
+ * @param aFluidInputs 0-4 fluids
+ * @param aOutput1 must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addAssemblylineRecipe(ItemStack aResearchItem, int aResearchTime, ItemStack[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput1, int aDuration, int aEUt);
+
+ /**
+ * Adds a Assemblyline Recipe
+ *
+ * @param aInputs elements should be: ItemStack for single item; ItemStack[] for multiple equivalent items;
+ * {OreDict, amount} for oredict.
+ */
+ @Deprecated
+ boolean addAssemblylineRecipe(ItemStack aResearchItem, int aResearchTime, Object[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput1, int aDuration, int aEUt);
+
+ /**
+ * Adds a Forge Hammer Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aOutput1 must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addForgeHammerRecipe(ItemStack aInput1, ItemStack aOutput1, int aDuration, int aEUt);
+
+ // Allows fluids as well as multiple items.
+ @Deprecated
+ boolean addForgeHammerRecipe(ItemStack[] ItemInputArray, FluidStack[] FluidInputArray, ItemStack[] ItemOutputArray,
+ FluidStack[] FluidOutputArray, int aDuration, int aEUt);
+
+ /**
+ * Adds a Wiremill Recipe
+ *
+ * @param aInput must be != null
+ * @param aOutput must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addWiremillRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addWiremillRecipe(ItemStack aInput, ItemStack aCircuit, ItemStack aOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds a Polariser Recipe
+ *
+ * @param aInput must be != null
+ * @param aOutput must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addPolarizerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds a Plate Bending Machine Recipe
+ *
+ * @param aInput must be != null
+ * @param aOutput must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addBenderRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addBenderRecipe(ItemStack aInput, ItemStack aCircuit, ItemStack aOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds a Extruder Machine Recipe
+ *
+ * @param aInput must be != null
+ * @param aShape must be != null, Set the stackSize to 0 if you don't want to let it consume this Item.
+ * @param aOutput must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addExtruderRecipe(ItemStack aInput, ItemStack aShape, ItemStack aOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds a Slicer Machine Recipe
+ *
+ * @param aInput must be != null
+ * @param aShape must be != null, Set the stackSize to 0 if you don't want to let it consume this Item.
+ * @param aOutput must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ */
+ @Deprecated
+ boolean addSlicerRecipe(ItemStack aInput, ItemStack aShape, ItemStack aOutput, int aDuration, int aEUt);
+
+ /**
+ * @param aInput must be != null
+ * @param aFluidInput must be != null
+ * @param aOutput1 must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ * @return if the recipe was successfully added
+ */
+ @Deprecated
+ boolean addOreWasherRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ FluidStack aFluidInput, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addOreWasherRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ FluidStack aFluidInput, int[] aChances, int aDuration, int aEUt);
+
+ /**
+ * Adds an Implosion Compressor Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aInput2 amount of ITNT, should be > 0
+ * @param aOutput1 must be != null
+ * @param aOutput2 can be null
+ */
+ @Deprecated
+ boolean addImplosionRecipe(ItemStack aInput1, int aInput2, ItemStack aOutput1, ItemStack aOutput2);
+
+ /**
+ * Adds a Grinder Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aInput2 id for the Cell needed for this Recipe
+ * @param aOutput1 must be != null
+ * @param aOutput2 can be null
+ * @param aOutput3 can be null
+ * @param aOutput4 can be null
+ */
+ @Deprecated
+ boolean addGrinderRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, ItemStack aOutput4);
+
+ /**
+ * Adds a Distillation Tower Recipe
+ *
+ * @param aInput must be != null
+ * @param aOutputs must be != null 1-5 Fluids
+ * @param aOutput2 can be null
+ */
+ @Deprecated
+ boolean addDistillationTowerRecipe(FluidStack aInput, FluidStack[] aOutputs, ItemStack aOutput2, int aDuration,
+ int aEUt);
+
+ @Deprecated
+ boolean addDistillationTowerRecipe(FluidStack aInput, ItemStack[] aCircuit, FluidStack[] aOutputs,
+ ItemStack aOutput2, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addSimpleArcFurnaceRecipe(ItemStack aInput, FluidStack aFluidInput, ItemStack[] aOutputs, int[] aChances,
+ int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addPlasmaArcFurnaceRecipe(ItemStack aInput, FluidStack aFluidInput, ItemStack[] aOutputs, int[] aChances,
+ int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addPlasmaArcFurnaceRecipe(ItemStack aInput, FluidStack aFluidInput, ItemStack[] aOutputs,
+ FluidStack aFluidPutput, int[] aChances, int aDuration, int aEUt);
+
+ /**
+ * Adds a Distillation Tower Recipe
+ */
+ @Deprecated
+ boolean addDistillationRecipe(ItemStack aInput1, int aInput2, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, ItemStack aOutput4, int aDuration, int aEUt);
+
+ /**
+ * Adds a Lathe Machine Recipe
+ */
+ @Deprecated
+ boolean addLatheRecipe(ItemStack aInput1, ItemStack aOutput1, ItemStack aOutput2, int aDuration, int aEUt);
+
+ /**
+ * Adds a Cutter Recipe
+ */
+ @Deprecated
+ boolean addCutterRecipe(ItemStack aInput, FluidStack aLubricant, ItemStack aOutput1, ItemStack aOutput2,
+ int aDuration, int aEUt);
+
+ /**
+ * Adds Cutter Recipes with default Lubricants
+ */
+ @Deprecated
+ boolean addCutterRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addCutterRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2, int aDuration, int aEUt,
+ boolean aCleanroom);
+
+ @Deprecated
+ boolean addCutterRecipe(ItemStack aInput, ItemStack aCircuit, ItemStack aOutput1, ItemStack aOutput2, int aDuration,
+ int aEUt);
+
+ @Deprecated
+ boolean addCutterRecipe(ItemStack aInput, ItemStack aCircuit, ItemStack aOutput1, ItemStack aOutput2, int aDuration,
+ int aEUt, boolean aCleanroom);
+
+ @Deprecated
+ boolean addCutterRecipe(ItemStack[] aInputs, ItemStack[] aOutputs, int aDuration, int aEUt, int aSpecial);
+
+ @Deprecated
+ boolean addCutterRecipe(ItemStack[] aInputs, ItemStack[] aOutputs, int aDuration, int aEUt, boolean aCleanroom);
+
+ /**
+ * Adds a Boxing Recipe
+ */
+ @Deprecated
+ boolean addBoxingRecipe(ItemStack aContainedItem, ItemStack aEmptyBox, ItemStack aFullBox, int aDuration, int aEUt);
+
+ /**
+ * @param aInput must be != null
+ * @param aOutput1 must be != null
+ * @param aDuration must be > 0
+ * @param aEUt should be > 0
+ * @return if the recipe was successfully added
+ */
+ @Deprecated
+ boolean addThermalCentrifugeRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addThermalCentrifugeRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ int[] aChances, int aDuration, int aEUt);
+
+ /**
+ * Adds an Unboxing Recipe
+ */
+ @Deprecated
+ boolean addUnboxingRecipe(ItemStack aFullBox, ItemStack aContainedItem, ItemStack aEmptyBox, int aDuration,
+ int aEUt);
+
+ /**
+ * Adds a Vacuum Freezer Recipe
+ *
+ * @param aInput1 must be != null
+ * @param aOutput1 must be != null
+ * @param aDuration must be > 0
+ */
+ @Deprecated
+ boolean addVacuumFreezerRecipe(ItemStack aInput1, ItemStack aOutput1, int aDuration);
+
+ @Deprecated
+ boolean addVacuumFreezerRecipe(ItemStack aInput1, ItemStack aOutput1, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addVacuumFreezerRecipe(FluidStack aInput1, FluidStack aOutput1, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addVacuumFreezerRecipe(ItemStack[] aItemInput, FluidStack[] aFluidInput, ItemStack[] aItemOutput,
+ FluidStack[] aFluidOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds a Fuel for My Generators
+ *
+ * @param aInput1 must be != null
+ * @param aOutput1 can be null
+ * @param aEU EU per MilliBucket. If no Liquid Form of this Container is available, then it will give you
+ * EU*1000 per Item.
+ * @param aType 0 = Diesel; 1 = Gas Turbine; 2 = Thermal; 3 = Dense Fluid; 4 = Plasma; 5 = Magic; And if
+ * something is unclear or missing, then look at the GT_Recipe-Class
+ */
+ @Deprecated
+ boolean addFuel(ItemStack aInput1, ItemStack aOutput1, int aEU, int aType);
+
+ /**
+ * Adds an Amplifier Recipe for the Amplifabricator
+ */
+ @Deprecated
+ boolean addAmplifier(ItemStack aAmplifierItem, int aDuration, int aAmplifierAmountOutputted);
+
+ /**
+ * Adds a Recipe for the Brewing Machine (intentionally limited to Fluid IDs)
+ */
+ @Deprecated
+ boolean addBrewingRecipe(ItemStack aIngredient, Fluid aInput, Fluid aOutput, boolean aHidden);
+
+ @Deprecated
+ boolean addBrewingRecipe(ItemStack aIngredient, Fluid aInput, Fluid aOutput, int aDuration, int aEUt,
+ boolean aHidden);
+
+ @Deprecated
+ boolean addBrewingRecipeCustom(ItemStack aIngredient, FluidStack aInput, FluidStack aOutput, int aDuration,
+ int aEUt, boolean aHidden);
+
+ /**
+ * Adds a Recipe for the Fermenter
+ */
+ @Deprecated
+ boolean addFermentingRecipe(FluidStack aInput, FluidStack aOutput, int aDuration, boolean aHidden);
+
+ @Deprecated
+ boolean addFermentingRecipe(FluidStack aInput, FluidStack aOutput, int aDuration, int aEUT, boolean aHidden);
+
+ /**
+ * Adds a Recipe for the Fluid Heater
+ */
+ @Deprecated
+ boolean addFluidHeaterRecipe(ItemStack aCircuit, FluidStack aOutput, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addFluidHeaterRecipe(ItemStack aCircuit, FluidStack aInput, FluidStack aOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Distillery
+ */
+ @Deprecated
+ boolean addDistilleryRecipe(ItemStack aCircuit, FluidStack aInput, FluidStack aOutput, ItemStack aSolidOutput,
+ int aDuration, int aEUt, boolean aHidden);
+
+ @Deprecated
+ boolean addDistilleryRecipe(ItemStack aCircuit, FluidStack aInput, FluidStack aOutput, int aDuration, int aEUt,
+ boolean aHidden);
+
+ @Deprecated
+ boolean addDistilleryRecipe(int circuitConfig, FluidStack aInput, FluidStack aOutput, ItemStack aSolidOutput,
+ int aDuration, int aEUt, boolean aHidden);
+
+ @Deprecated
+ boolean addDistilleryRecipe(int aCircuit, FluidStack aInput, FluidStack aOutput, int aDuration, int aEUt,
+ boolean aHidden);
+
+ /**
+ * Adds a Recipe for the Fluid Solidifier
+ */
+ @Deprecated
+ boolean addFluidSolidifierRecipe(ItemStack aMold, FluidStack aInput, ItemStack aOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Fluid Solidifier
+ */
+ @Deprecated
+ boolean addFluidSolidifierRecipe(final ItemStack[] itemInputs, final FluidStack[] fluidInputs,
+ final ItemStack[] itemOutputs, final FluidStack[] fluidOutputs, final int EUPerTick,
+ final int aDurationInTicks);
+
+ /**
+ * Adds a Recipe for Fluid Smelting
+ */
+ @Deprecated
+ boolean addFluidSmelterRecipe(ItemStack aInput, ItemStack aRemains, FluidStack aOutput, int aChance, int aDuration,
+ int aEUt);
+
+ /**
+ * Adds a Recipe for Fluid Smelting
+ */
+ @Deprecated
+ boolean addFluidSmelterRecipe(ItemStack aInput, ItemStack aRemains, FluidStack aOutput, int aChance, int aDuration,
+ int aEUt, boolean hidden);
+
+ /**
+ * Adds a Recipe for Fluid Extraction
+ */
+ @Deprecated
+ boolean addFluidExtractionRecipe(ItemStack aInput, ItemStack aRemains, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Fluid Canner
+ */
+ @Deprecated
+ boolean addFluidCannerRecipe(ItemStack aInput, ItemStack aOutput, FluidStack aFluidInput, FluidStack aFluidOutput);
+
+ @Deprecated
+ boolean addFluidCannerRecipe(ItemStack aInput, ItemStack aOutput, FluidStack aFluidInput, FluidStack aFluidOutput,
+ int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Chemical Bath
+ */
+ @Deprecated
+ boolean addChemicalBathRecipe(ItemStack aInput, FluidStack aBathingFluid, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, int[] aChances, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addChemicalBathRecipe(ItemStack aInput, FluidStack aBathingFluid, FluidStack aFluidOutput,
+ ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, int[] aChances, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Electromagnetic Separator
+ */
+ @Deprecated
+ boolean addElectromagneticSeparatorRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, int[] aChances, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Extractor
+ */
+ @Deprecated
+ boolean addExtractorRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Printer
+ */
+ @Deprecated
+ boolean addPrinterRecipe(ItemStack aInput, FluidStack aFluid, ItemStack aSpecialSlot, ItemStack aOutput,
+ int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Autoclave
+ */
+ @Deprecated
+ boolean addAutoclaveRecipe(ItemStack aInput, FluidStack aFluid, ItemStack aOutput, int aChance, int aDuration,
+ int aEUt);
+
+ @Deprecated
+ boolean addAutoclaveRecipe(ItemStack aInput, FluidStack aFluid, ItemStack aOutput, int aChance, int aDuration,
+ int aEUt, boolean aCleanroom);
+
+ @Deprecated
+ boolean addAutoclaveRecipe(ItemStack aInput, ItemStack aCircuit, FluidStack aFluid, ItemStack aOutput, int aChance,
+ int aDuration, int aEUt, boolean aCleanroom);
+
+ @Deprecated
+ boolean addAutoclaveRecipe(ItemStack aInput, ItemStack aCircuit, FluidStack aFluidIn, FluidStack aFluidOut,
+ ItemStack aOutput, int aChance, int aDuration, int aEUt, boolean aCleanroom);
+
+ @Deprecated
+ boolean addAutoclaveSpaceRecipe(ItemStack aInput, FluidStack aFluid, ItemStack aOutput, int aChance, int aDuration,
+ int aEUt, boolean aCleanroom);
+
+ @Deprecated
+ boolean addAutoclaveSpaceRecipe(ItemStack aInput, ItemStack aCircuit, FluidStack aFluid, ItemStack aOutput,
+ int aChance, int aDuration, int aEUt, boolean aCleanroom);
+
+ @Deprecated
+ boolean addAutoclave4Recipe(ItemStack aInput, ItemStack aCircuit, FluidStack aFluidIn, FluidStack aFluidOut,
+ ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUt, boolean aCleanroom);
+
+ /**
+ * Adds a Recipe for the Mixer
+ */
+ @Deprecated
+ boolean addMixerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addMixerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ ItemStack aInput5, ItemStack aInput6, FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput,
+ int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addMixerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ ItemStack aInput5, ItemStack aInput6, ItemStack aInput7, ItemStack aInput8, ItemStack aInput9,
+ FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput, int aDuration, int aEUt);
+
+ @Deprecated
+ boolean addMixerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ ItemStack aInput5, ItemStack aInput6, ItemStack aInput7, ItemStack aInput8, ItemStack aInput9,
+ FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ ItemStack aOutput4, int aDuration, int aEUt);
+
+ // Use me only from now on!
+ @Deprecated
+ boolean addMixerRecipe(ItemStack[] ItemInputArray, FluidStack[] FluidInputArray, ItemStack[] ItemOutputArray,
+ FluidStack[] FluidOutputArray, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Laser Engraver.
+ */
+ @Deprecated
+ boolean addLaserEngraverRecipe(ItemStack aItemToEngrave, ItemStack aLens, ItemStack aEngravedItem, int aDuration,
+ int aEUt);
+
+ /**
+ * Adds a Recipe for the Laser Engraver.
+ */
+ @Deprecated
+ boolean addLaserEngraverRecipe(ItemStack aItemToEngrave, ItemStack aLens, ItemStack aEngravedItem, int aDuration,
+ int aEUt, boolean aCleanroom);
+
+ /**
+ * Adds a Generalised Laser Engraver Recipe.
+ *
+ * @param ItemInputArray Array of input items.
+ * @param FluidInputArray Array of output items.
+ * @param OutputItemArray Array of input fluids.
+ * @param FluidOutputArray Array of output items.
+ * @param aDuration Must be > 0. Duration in ticks.
+ * @param aEUt Should be > 0. EU/t.
+ * @param aCleanroom Boolean for usage of cleanroom in recipe.
+ */
+ @Deprecated
+ boolean addLaserEngraverRecipe(ItemStack[] ItemInputArray, FluidStack[] FluidInputArray,
+ ItemStack[] OutputItemArray, FluidStack[] FluidOutputArray, int aDuration, int aEUt, boolean aCleanroom);
+
+ /**
+ * Adds a Recipe for the Forming Press
+ */
+ @Deprecated
+ boolean addFormingPressRecipe(ItemStack aItemToImprint, ItemStack aForm, ItemStack aImprintedItem, int aDuration,
+ int aEUt);
+
+ // Allows more than 2 inputs and multiple outputs
+ @Deprecated
+ boolean addFormingPressRecipe(ItemStack[] ItemInputArray, ItemStack[] OutputItemArray, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Sifter. (up to 9 Outputs)
+ */
+ @Deprecated
+ boolean addSifterRecipe(ItemStack aItemToSift, ItemStack[] aSiftedItems, int[] aChances, int aDuration, int aEUt);
+
+ /**
+ * Adds a Generalised Sifter Recipe.
+ *
+ * @param ItemInputArray Array of input items.
+ * @param FluidInputArray Array of output items.
+ * @param OutputItemArray Array of input fluids.
+ * @param FluidOutputArray Array of output items.
+ * @param aChances Array of output chances.
+ * @param aDuration Must be > 0. Duration in ticks.
+ * @param aEUt Should be > 0. EU/t.
+ * @param aCleanroom Boolean for usage of cleanroom in recipe.
+ */
+ @Deprecated
+ boolean addSifterRecipe(ItemStack[] ItemInputArray, FluidStack[] FluidInputArray, ItemStack[] OutputItemArray,
+ FluidStack[] FluidOutputArray, int[] aChances, int aDuration, int aEUt, boolean aCleanroom);
+
+ /**
+ * Adds a Recipe for the Arc Furnace. (up to 4 Outputs)
+ */
+ @Deprecated
+ boolean addArcFurnaceRecipe(ItemStack aInput, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the Arc Furnace. (up to 4 Outputs)
+ */
+ @Deprecated
+ boolean addArcFurnaceRecipe(ItemStack aInput, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUt,
+ boolean hidden);
+
+ /**
+ * Adds a Recipe for the GT Pulveriser. (up to 4 Outputs)
+ */
+ @Deprecated
+ boolean addPulveriserRecipe(ItemStack aInput, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUt);
+
+ /**
+ * Adds a Recipe for the GT Pulveriser. (up to 4 Outputs)
+ */
+ @Deprecated
+ boolean addPulveriserRecipe(ItemStack aInput, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUt,
+ boolean hidden);
+
+ /**
+ * Adds a Distillation Tower Recipe Every Fluid also gets separate distillation recipes
+ *
+ * @param aInput must be != null
+ * @param aOutputs must be != null 1-5 Fluids
+ * @param aOutput2 can be null
+ */
+ @Deprecated
+ boolean addUniversalDistillationRecipe(FluidStack aInput, FluidStack[] aOutputs, ItemStack aOutput2, int aDuration,
+ int aEUt);
+
+ @Deprecated
+ boolean addUniversalDistillationRecipewithCircuit(FluidStack aInput, ItemStack[] aCircuit, FluidStack[] aOutputs,
+ ItemStack aOutput2, int aDuration, int aEUt);
+
+ /**
+ * Adds Pyrolyse Recipe
+ *
+ * @param aInput input item stack
+ * @param aFluidInput fluid input
+ * @param intCircuit circuit index
+ * @param aOutput output item stack
+ * @param aFluidOutput fluid output
+ * @param aDuration recipe duration
+ * @param aEUt recipe EU/t expenditure
+ *
+ * @return if the recipe was successfully added
+ */
+ @Deprecated
+ boolean addPyrolyseRecipe(ItemStack aInput, FluidStack aFluidInput, int intCircuit, ItemStack aOutput,
+ FluidStack aFluidOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds Oil Cracking Recipe
+ *
+ * @param aInput input item stack
+ * @param aOutput output item stack
+ * @param aDuration recipe duration
+ * @param aEUt recipe EU/t expenditure
+ */
+ @Deprecated
+ boolean addCrackingRecipe(FluidStack aInput, FluidStack aOutput, int aDuration, int aEUt);
+
+ /**
+ * Adds Oil Cracking Recipe
+ *
+ * @param circuitConfig The circuit configuration to control cracking severity
+ * @param aInput The fluid to be cracked
+ * @param aInput2 The fluid to catalyze the cracking (typically Hydrogen or Steam)
+ * @param aOutput The cracked fluid
+ * @param aDuration recipe duration
+ * @param aEUt recipe EU/t expenditure
+ */
+ @Deprecated
+ boolean addCrackingRecipe(int circuitConfig, FluidStack aInput, FluidStack aInput2, FluidStack aOutput,
+ int aDuration, int aEUt);
+
+ /**
+ * Adds a Sound to the Sonictron9001 you should NOT call this in the preInit-Phase!
+ *
+ * @param aItemStack = The Item you want to display for this Sound
+ * @param aSoundName = The Name of the Sound in the resources/newsound-folder like Vanillasounds
+ * @return true if the Sound got added, otherwise false.
+ */
+ @Deprecated
+ boolean addSonictronSound(ItemStack aItemStack, String aSoundName);
+
+ @Deprecated
+ boolean addChemicalBathRecipe(ItemStack aInput, FluidStack aBathingFluid, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, FluidStack aFluidOutput, int[] aChances, int aDuration, int aEUt);
+
+ /**
+ * Add a Nano Forge Recipe. The Nano Forge's main use is to make nanites/nanorobots. Tier 1 Nano Forge - Can make
+ * partly biological, partly metal nanites TIer 2 Nano Forge - Can make mostly metal nanites with some biological
+ * aspects TIer 3 Nano Forge - Can make nanites entierly out of metal
+ *
+ * @param aInputs must not be null
+ * @param aFluidInputs can be null
+ * @param aOutputs must not be null, the nanite or other output
+ * @param aFluidOutputs can be null
+ * @param aChances can be null
+ * @param aDuration recipe duration
+ * @param aEUt recipe EU/t expenditure
+ * @param aSpecialValue defines the tier of nano forge required.
+ *
+ */
+ @Deprecated
+ boolean addNanoForgeRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int[] aChances, int aDuration, int aEUt, int aSpecialValue);
+
+ /**
+ * Add a breeder cell.
+ *
+ * @param input raw stack. should be undamaged.
+ * @param output breed output
+ * @param heatMultiplier bonus progress per neutron pulse per heat step
+ * @param heatStep divisor for hull heat
+ * @param reflector true if also acts as a neutron reflector, false otherwise.
+ * @param requiredPulses progress required to complete breeding
+ * @return added fake recipe
+ */
+ GT_Recipe addIC2ReactorBreederCell(ItemStack input, ItemStack output, boolean reflector, int heatStep,
+ int heatMultiplier, int requiredPulses);
+
+ /**
+ * Add a fuel cell.
+ *
+ * @param input raw stack. should be undamaged.
+ * @param output depleted stack
+ * @param aMox true if has mox behavior, false if uranium behavior.
+ * @param aHeat inherent heat output multiplier of the fuel material. should not add the extra heat from being a
+ * multi-cell!
+ * @param aEnergy inherent energy output multiplier of the fuel material. should not add the extra energy from being
+ * a multi-cell!
+ * @param aCells cell count
+ * @return added fake recipe
+ */
+ GT_Recipe addIC2ReactorFuelCell(ItemStack input, ItemStack output, boolean aMox, float aHeat, float aEnergy,
+ int aCells);
+
+ GT_RecipeBuilder stdBuilder();
+}
diff --git a/src/main/java/gregtech/api/interfaces/internal/IIC2TileEntity.java b/src/main/java/gregtech/api/interfaces/internal/IIC2TileEntity.java
new file mode 100644
index 0000000000..ce9b4c4282
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/internal/IIC2TileEntity.java
@@ -0,0 +1,14 @@
+package gregtech.api.interfaces.internal;
+
+import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords;
+import ic2.api.energy.tile.IEnergySink;
+import ic2.api.energy.tile.IEnergySource;
+import ic2.api.tile.IEnergyStorage;
+
+/**
+ * A simple compound Interface for generic EnergyTileEntities. I don't want to have imports of the IC2-API in my
+ * main-code
+ */
+public interface IIC2TileEntity extends IEnergyStorage, IEnergySink, IEnergySource, IHasWorldObjectAndCoords {
+ //
+}
diff --git a/src/main/java/gregtech/api/interfaces/internal/IThaumcraftCompat.java b/src/main/java/gregtech/api/interfaces/internal/IThaumcraftCompat.java
new file mode 100644
index 0000000000..5d99f83689
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/internal/IThaumcraftCompat.java
@@ -0,0 +1,46 @@
+package gregtech.api.interfaces.internal;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+
+public interface IThaumcraftCompat {
+
+ int RESEARCH_TYPE_NORMAL = 0, RESEARCH_TYPE_SECONDARY = 1, RESEARCH_TYPE_FREE = 2, RESEARCH_TYPE_HIDDEN = 4,
+ RESEARCH_TYPE_VIRTUAL = 8, RESEARCH_TYPE_ROUND = 16, RESEARCH_TYPE_SPECIAL = 32, RESEARCH_TYPE_AUTOUNLOCK = 64;
+
+ /**
+ * The Research Keys of GT
+ */
+ String IRON_TO_STEEL = "GT_IRON_TO_STEEL", FILL_WATER_BUCKET = "GT_FILL_WATER_BUCKET",
+ WOOD_TO_CHARCOAL = "GT_WOOD_TO_CHARCOAL", TRANSZINC = "GT_TRANSZINC", TRANSNICKEL = "GT_TRANSNICKEL",
+ TRANSCOBALT = "GT_TRANSCOBALT", TRANSBISMUTH = "GT_TRANSBISMUTH", TRANSANTIMONY = "GT_TRANSANTIMONY",
+ TRANSCUPRONICKEL = "GT_TRANSCUPRONICKEL", TRANSBATTERYALLOY = "GT_TRANSBATTERYALLOY",
+ TRANSSOLDERINGALLOY = "GT_TRANSSOLDERINGALLOY", TRANSBRASS = "GT_TRANSBRASS", TRANSBRONZE = "GT_TRANSBRONZE",
+ TRANSINVAR = "GT_TRANSINVAR", TRANSELECTRUM = "GT_TRANSELECTRUM", TRANSALUMINIUM = "GT_TRANSALUMINIUM",
+ CRYSTALLISATION = "GT_CRYSTALLISATION", ADVANCEDENTROPICPROCESSING = "GT_ADVANCEDENTROPICPROCESSING", // unused
+ ADVANCEDMETALLURGY = "GT_ADVANCEDMETALLURGY";
+
+ boolean registerPortholeBlacklistedBlock(Block aBlock);
+
+ boolean registerThaumcraftAspectsToItem(ItemStack aStack, List<TC_AspectStack> aAspects, boolean aAdditive);
+
+ boolean registerThaumcraftAspectsToItem(ItemStack aStack, List<TC_AspectStack> aAspects, String aOreDict);
+
+ Object addCrucibleRecipe(String aResearch, Object aInput, ItemStack aOutput, List<TC_AspectStack> aAspects);
+
+ Object addInfusionRecipe(String aResearch, ItemStack aMainInput, ItemStack[] aSideInputs, ItemStack aOutput,
+ int aInstability, List<TC_Aspects.TC_AspectStack> aAspects);
+
+ Object addInfusionEnchantmentRecipe(String aResearch, Enchantment aEnchantment, int aInstability,
+ List<TC_Aspects.TC_AspectStack> aAspects, ItemStack[] aSideInputs);
+
+ Object addResearch(String aResearch, String aName, String aText, String[] aParentResearches, String aCategory,
+ ItemStack aIcon, int aComplexity, int aType, int aX, int aY, List<TC_AspectStack> aAspects,
+ ItemStack[] aResearchTriggers, Object[] aPages);
+}
diff --git a/src/main/java/gregtech/api/interfaces/internal/IUETileEntity.java b/src/main/java/gregtech/api/interfaces/internal/IUETileEntity.java
new file mode 100644
index 0000000000..7c9d487e05
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/internal/IUETileEntity.java
@@ -0,0 +1,5 @@
+package gregtech.api.interfaces.internal;
+
+public interface IUETileEntity /* extends IElectrical */ {
+ //
+}
diff --git a/src/main/java/gregtech/api/interfaces/metatileentity/IConnectable.java b/src/main/java/gregtech/api/interfaces/metatileentity/IConnectable.java
new file mode 100644
index 0000000000..0ca519d40b
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/metatileentity/IConnectable.java
@@ -0,0 +1,34 @@
+package gregtech.api.interfaces.metatileentity;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+/**
+ * For pipes, wires, and other MetaTiles which need to be decided whether they should connect to the block at each side.
+ */
+public interface IConnectable {
+
+ int NO_CONNECTION = 0b00000000;
+ int CONNECTED_DOWN = 0b00000001;
+ int CONNECTED_UP = 0b00000010;
+ int CONNECTED_NORTH = 0b00000100;
+ int CONNECTED_SOUTH = 0b00001000;
+ int CONNECTED_WEST = 0b00010000;
+ int CONNECTED_EAST = 0b00100000;
+ int CONNECTED_ALL = 0b00111111;
+ int HAS_FRESHFOAM = 0b01000000;
+ int HAS_HARDENEDFOAM = 0b10000000;
+ int HAS_FOAM = 0b11000000;
+
+ /**
+ * Try to connect to the Block at the specified side returns the connection state. Non-positive values for failed,
+ * others for succeeded.
+ */
+ int connect(ForgeDirection side);
+
+ /**
+ * Try to disconnect to the Block at the specified side
+ */
+ void disconnect(ForgeDirection side);
+
+ boolean isConnectedAtSide(ForgeDirection side);
+}
diff --git a/src/main/java/gregtech/api/interfaces/metatileentity/IFluidLockable.java b/src/main/java/gregtech/api/interfaces/metatileentity/IFluidLockable.java
new file mode 100644
index 0000000000..f7f6112680
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/metatileentity/IFluidLockable.java
@@ -0,0 +1,27 @@
+package gregtech.api.interfaces.metatileentity;
+
+import net.minecraftforge.fluids.Fluid;
+
+/**
+ * Implement this interface if your MetaTileEntity supports fluid lock mechanism.
+ */
+@SuppressWarnings({ "BooleanMethodIsAlwaysInverted" })
+public interface IFluidLockable {
+
+ /**
+ * Use {@link Fluid#getName()} instead of {@link Fluid#getUnlocalizedName()} for fluid name
+ */
+ void setLockedFluidName(String name);
+
+ String getLockedFluidName();
+
+ /**
+ * Set fluid lock state. Would be useful when you don't necessarily want to change mode when locked fluid is
+ * changed.
+ */
+ void lockFluid(boolean lock);
+
+ boolean isFluidLocked();
+
+ boolean acceptsFluidLock(String name);
+}
diff --git a/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java
new file mode 100644
index 0000000000..2c222e76a8
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java
@@ -0,0 +1,539 @@
+package gregtech.api.interfaces.metatileentity;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.IFluidHandler;
+import net.minecraftforge.fluids.IFluidTank;
+
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+
+import appeng.api.crafting.ICraftingIconProvider;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Dyes;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IGetGUITextureSet;
+import gregtech.api.interfaces.tileentity.IGearEnergyTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IGregtechWailaProvider;
+import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_Util;
+
+/**
+ * Warning, this Interface has just been made to be able to add multiple kinds of MetaTileEntities (Cables, Pipes,
+ * Transformers, but not the regular Blocks)
+ * <p/>
+ * Don't implement this yourself and expect it to work. Extend @MetaTileEntity itself.
+ */
+public interface IMetaTileEntity extends ISidedInventory, IFluidTank, IFluidHandler, IGearEnergyTileEntity,
+ IMachineBlockUpdateable, IGregtechWailaProvider, IGetGUITextureSet, ICraftingIconProvider {
+
+ /**
+ * This determines the BaseMetaTileEntity belonging to this MetaTileEntity by using the Meta ID of the Block itself.
+ * <p/>
+ * 0 = BaseMetaTileEntity, Wrench lvl 0 to dismantle 1 = BaseMetaTileEntity, Wrench lvl 1 to dismantle 2 =
+ * BaseMetaTileEntity, Wrench lvl 2 to dismantle 3 = BaseMetaTileEntity, Wrench lvl 3 to dismantle 4 =
+ * BaseMetaPipeEntity, Wrench lvl 0 to dismantle 5 = BaseMetaPipeEntity, Wrench lvl 1 to dismantle 6 =
+ * BaseMetaPipeEntity, Wrench lvl 2 to dismantle 7 = BaseMetaPipeEntity, Wrench lvl 3 to dismantle 8 =
+ * BaseMetaPipeEntity, Cutter lvl 0 to dismantle 9 = BaseMetaPipeEntity, Cutter lvl 1 to dismantle 10 =
+ * BaseMetaPipeEntity, Cutter lvl 2 to dismantle 11 = BaseMetaPipeEntity, Cutter lvl 3 to dismantle 12 = GT++ 13 =
+ * GT++ 14 = GT++ 15 = GT++
+ */
+ byte getTileEntityBaseType();
+
+ /**
+ * @param aTileEntity is just because the internal Variable "mBaseMetaTileEntity" is set after this Call.
+ * @return a newly created and ready MetaTileEntity
+ */
+ IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity);
+
+ /**
+ * @return an ItemStack representing this MetaTileEntity.
+ */
+ ItemStack getStackForm(long aAmount);
+
+ /**
+ * new getter for the BaseMetaTileEntity, which restricts usage to certain Functions.
+ */
+ IGregTechTileEntity getBaseMetaTileEntity();
+
+ /**
+ * Sets the BaseMetaTileEntity of this
+ */
+ void setBaseMetaTileEntity(IGregTechTileEntity aBaseMetaTileEntity);
+
+ /**
+ * when placing a Machine in World, to initialize default Modes. aNBT can be null!
+ */
+ void initDefaultModes(NBTTagCompound aNBT);
+
+ /**
+ * ^= writeToNBT
+ */
+ void saveNBTData(NBTTagCompound aNBT);
+
+ /**
+ * ^= readFromNBT
+ */
+ void loadNBTData(NBTTagCompound aNBT);
+
+ /**
+ * Adds the NBT-Information to the ItemStack, when being dismanteled properly Used to store Machine specific Upgrade
+ * Data.
+ */
+ void setItemNBT(NBTTagCompound aNBT);
+
+ /**
+ * Called in the registered MetaTileEntity when the Server starts, to reset static variables
+ */
+ void onServerStart();
+
+ /**
+ * Called in the registered MetaTileEntity when the Server ticks a World the first time, to load things from the
+ * World Save
+ */
+ void onWorldLoad(File aSaveDirectory);
+
+ /**
+ * Called in the registered MetaTileEntity when the Server stops, to save the Game.
+ */
+ void onWorldSave(File aSaveDirectory);
+
+ /**
+ * Called to set Configuration values for this MetaTileEntity. Use aConfig.get(ConfigCategories.machineconfig,
+ * "MetaTileEntityName.Ability", DEFAULT_VALUE); to set the Values.
+ */
+ void onConfigLoad(GT_Config aConfig);
+
+ /**
+ * If a Cover of that Type can be placed on this Side. Also Called when the Facing of the Block Changes and a Cover
+ * is on said Side.
+ */
+ boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack);
+
+ /**
+ * When a Player right-clicks the Facing with a Screwdriver.
+ */
+ void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ,
+ ItemStack aTool);
+
+ /**
+ * When a Player right-clicks the Facing with a Wrench.
+ */
+ boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer, float aX,
+ float aY, float aZ, ItemStack aTool);
+
+ /**
+ * When a Player right-clicks the Facing with a wire cutter.
+ */
+ boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer,
+ float aX, float aY, float aZ, ItemStack aTool);
+
+ /**
+ * When a Player right-clicks the Facing with a soldering iron.
+ */
+ boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer,
+ float aX, float aY, float aZ, ItemStack aTool);
+
+ /**
+ * Called right before this Machine explodes
+ */
+ void onExplosion();
+
+ /**
+ * The First processed Tick which was passed to this MetaTileEntity
+ */
+ void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity);
+
+ /**
+ * The Tick before all the generic handling happens, what gives a slightly faster reaction speed. Don't use this if
+ * you really don't need to. @onPostTick is better suited for ticks. This happens still after the Cover handling.
+ */
+ void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick);
+
+ /**
+ * The Tick after all the generic handling happened. Recommended to use this like updateEntity.
+ */
+ void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick);
+
+ /**
+ * Called when this MetaTileEntity gets (intentionally) disconnected from the BaseMetaTileEntity. Doesn't get called
+ * when this thing is moved by Frames or similar hacks.
+ */
+ void inValidate();
+
+ /**
+ * Called when the BaseMetaTileEntity gets invalidated, what happens right before the @inValidate above gets called
+ */
+ void onRemoval();
+
+ /**
+ * Called when the BaseMetaTileEntity gets unloaded (chunk or world)
+ */
+ default void onUnload() {}
+
+ /**
+ * @param facing the facing direction to check
+ * @return if aFacing would be a valid Facing for this Device. Used for wrenching.
+ */
+ boolean isFacingValid(ForgeDirection facing);
+
+ /**
+ * @return the Server Side Container
+ * @deprecated Use ModularUI
+ */
+ @Deprecated
+ default Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * @return the Client Side GUI Container
+ * @deprecated Use ModularUI
+ */
+ @Deprecated
+ default Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * For back compatibility, you need to override this if this MetaTileEntity uses ModularUI.
+ */
+ default boolean useModularUI() {
+ return false;
+ }
+
+ /**
+ * From new ISidedInventory
+ */
+ boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, ItemStack aStack);
+
+ /**
+ * From new ISidedInventory
+ */
+ boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, ItemStack aStack);
+
+ /**
+ * @return if aIndex is a valid Slot. false for things like HoloSlots. Is used for determining if an Item is dropped
+ * upon Block destruction and for Inventory Access Management
+ */
+ boolean isValidSlot(int aIndex);
+
+ /**
+ * Check if the item at the specified index should be dropped
+ *
+ * @param index Index that will be checked
+ * @return True if the item at the index should be dropped, else false
+ */
+ boolean shouldDropItemAt(int index);
+
+ /**
+ * @return if aIndex can be set to Zero stackSize, when being removed.
+ */
+ boolean setStackToZeroInsteadOfNull(int aIndex);
+
+ /**
+ * If this Side can connect to inputting pipes
+ */
+ boolean isLiquidInput(ForgeDirection side);
+
+ /**
+ * If this Side can connect to outputting pipes
+ */
+ boolean isLiquidOutput(ForgeDirection side);
+
+ /**
+ * Just an Accessor for the Name variable.
+ */
+ String getMetaName();
+
+ /**
+ * @return true if the Machine can be accessed
+ */
+ boolean isAccessAllowed(EntityPlayer aPlayer);
+
+ /**
+ * a Player right-clicks the Machine Sneaky right clicks are not getting passed to this!
+ *
+ * @return mostly {@code false}. Probably is left for compatibility.
+ */
+ boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, float aX,
+ float aY, float aZ);
+
+ /**
+ * a Player leftclicks the Machine Sneaky leftclicks are getting passed to this unlike with the rightclicks.
+ */
+ void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer);
+
+ /**
+ * Called Clientside with the Data got from @getUpdateData
+ */
+ void onValueUpdate(byte aValue);
+
+ /**
+ * return a small bit of Data, like a secondary Facing for example with this Function, for the Client. The
+ * BaseMetaTileEntity detects changes to this Value and will then send an Update. This is only for Information,
+ * which is visible as Texture to the outside.
+ * <p/>
+ * If you just want to have an Active/Redstone State then set the Active State inside the BaseMetaTileEntity
+ * instead.
+ */
+ byte getUpdateData();
+
+ /**
+ * For the rare case you need this Function
+ */
+ void receiveClientEvent(byte aEventID, byte aValue);
+
+ /**
+ * Called to actually play the sound on client side. Client/Server check is already done.
+ */
+ void doSound(byte aIndex, double aX, double aY, double aZ);
+
+ void startSoundLoop(byte aIndex, double aX, double aY, double aZ);
+
+ void stopSoundLoop(byte aValue, double aX, double aY, double aZ);
+
+ /**
+ * Sends the Event for the Sound Triggers, only usable Server Side!
+ */
+ void sendSound(byte aIndex);
+
+ /**
+ * Sends the Event for the Sound Triggers, only usable Server Side!
+ */
+ void sendLoopStart(byte aIndex);
+
+ /**
+ * Sends the Event for the Sound Triggers, only usable Server Side!
+ */
+ void sendLoopEnd(byte aIndex);
+
+ /**
+ * Called when the Machine explodes. Override the Explosion code here.
+ *
+ * @param aExplosionPower explosion power
+ */
+ void doExplosion(long aExplosionPower);
+
+ /**
+ * If this is just a simple Machine, which can be wrenched at 100%
+ */
+ boolean isSimpleMachine();
+
+ /**
+ * If there should be a Lag Warning if something laggy happens during this Tick.
+ * <p/>
+ * The Advanced Pump uses this to not cause the Lag Message, while it scans for all close Fluids. The Item Pipes and
+ * Retrievers neither send this Message, when scanning for Pipes.
+ */
+ boolean doTickProfilingMessageDuringThisTick();
+
+ /**
+ * returns the DebugLog
+ */
+ ArrayList<String> getSpecialDebugInfo(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, int aLogLevel,
+ ArrayList<String> aList);
+
+ /**
+ * get a small Description
+ */
+ String[] getDescription();
+
+ /**
+ * In case the Output Voltage varies.
+ */
+ String getSpecialVoltageToolTip();
+
+ /**
+ * Icon of the Texture. If this returns null then it falls back to getTextureIndex.
+ *
+ * @param side is the Side of the Block
+ * @param facing is the direction the Block is facing
+ * @param colorIndex The Minecraft Color the Block is having
+ * @param active if the Machine is currently active (use this instead of calling
+ * {@code mBaseMetaTileEntity.mActive)}. Note: In case of Pipes this means if this Side is
+ * connected to something or not.
+ * @param redstoneLevel if the Machine is currently outputting a RedstoneSignal (use this instead of calling
+ * {@code mBaseMetaTileEntity.mRedstone} !!!)
+ */
+ ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean active, boolean redstoneLevel);
+
+ /**
+ * Register Icons here. This gets called when the Icons get initialized by the Base Block Best is you put your Icons
+ * in a static Array for quick and easy access without relying on the MetaTileList.
+ *
+ * @param aBlockIconRegister The Block Icon Register
+ */
+ @SideOnly(Side.CLIENT)
+ void registerIcons(IIconRegister aBlockIconRegister);
+
+ /**
+ * @return true if you override the Rendering.
+ */
+ @SideOnly(Side.CLIENT)
+ boolean renderInInventory(Block aBlock, int aMeta, RenderBlocks aRenderer);
+
+ /**
+ * @return true if you override the Rendering.
+ */
+ @SideOnly(Side.CLIENT)
+ boolean renderInWorld(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, RenderBlocks aRenderer);
+
+ /**
+ * Gets the Output for the comparator on the given Side
+ */
+ byte getComparatorValue(ForgeDirection side);
+
+ float getExplosionResistance(ForgeDirection side);
+
+ String[] getInfoData();
+
+ boolean isGivingInformation();
+
+ ItemStack[] getRealInventory();
+
+ boolean connectsToItemPipe(ForgeDirection side);
+
+ void onColorChangeServer(byte aColor);
+
+ void onColorChangeClient(byte aColor);
+
+ /**
+ * @return Actual color shown on GUI
+ */
+ default int getGUIColorization() {
+ if (getBaseMetaTileEntity() != null) {
+ return getBaseMetaTileEntity().getGUIColorization();
+ } else {
+ return GT_Util.getRGBInt(Dyes.MACHINE_METAL.getRGBA());
+ }
+ }
+
+ int getLightOpacity();
+
+ boolean allowGeneralRedstoneOutput();
+
+ void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB,
+ List<AxisAlignedBB> outputAABB, Entity collider);
+
+ AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ);
+
+ void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider);
+
+ /**
+ * The onCreated Function of the Item Class redirects here
+ */
+ void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer);
+
+ boolean hasAlternativeModeText();
+
+ String getAlternativeModeText();
+
+ boolean shouldJoinIc2Enet();
+
+ /**
+ * The Machine Update, which is called when the Machine needs an Update of its Parts. I suggest to wait 1-5 seconds
+ * before actually checking the Machine Parts. RP-Frames could for example cause Problems when you instacheck the
+ * Machine Parts.
+ * <p>
+ * just do stuff since we are already in meta tile...
+ */
+ @Override
+ void onMachineBlockUpdate();
+
+ /**
+ * just return in should recurse since we are already in meta tile...
+ */
+ @Override
+ default boolean isMachineBlockUpdateRecursive() {
+ return true;
+ }
+
+ /**
+ * A randomly called display update to be able to add particles or other items for display
+ *
+ * @param aBaseMetaTileEntity The entity that will handle the {@see Block#randomDisplayTick}
+ */
+ @SideOnly(Side.CLIENT)
+ default void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ /* do nothing */
+ }
+
+ default int getGUIWidth() {
+ return 176;
+ }
+
+ default int getGUIHeight() {
+ return 166;
+ }
+
+ /*
+ * ModularUI Support
+ */
+ default ItemStackHandler getInventoryHandler() {
+ return null;
+ }
+
+ default String getLocalName() {
+ return "Unknown";
+ }
+
+ default boolean doesBindPlayerInventory() {
+ return true;
+ }
+
+ default int getTextColorOrDefault(String textType, int defaultColor) {
+ return defaultColor;
+ }
+
+ /**
+ * Called before block is destroyed. This is before inventory dropping code has executed.
+ */
+ default void onBlockDestroyed() {}
+
+ /**
+ * Allows to add additional data to the tooltip, which is specific to an instance of the machine
+ *
+ * @param stack Item stack of this MTE
+ * @param tooltip Tooltip to which can be added
+ */
+ default void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {}
+
+ @Override
+ default ItemStack getMachineCraftingIcon() {
+ return null;
+ }
+
+ /**
+ * Gets items to be displayed for HoloInventory mod.
+ *
+ * @return null if default implementation should be used, i.e. {@link IInventory#getStackInSlot}.
+ * Otherwise, a list of items to be displayed. Null element may be contained.
+ */
+ @Nullable
+ default List<ItemStack> getItemsForHoloGlasses() {
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityCable.java b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityCable.java
new file mode 100644
index 0000000000..a2d672e765
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityCable.java
@@ -0,0 +1,19 @@
+package gregtech.api.interfaces.metatileentity;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+public interface IMetaTileEntityCable extends IMetaTileEntityPipe {
+
+ @Deprecated
+ long transferElectricity(ForgeDirection side, long aVoltage, long aAmperage,
+ ArrayList<TileEntity> aAlreadyPassedTileEntityList);
+
+ default long transferElectricity(ForgeDirection side, long aVoltage, long aAmperage,
+ HashSet<TileEntity> aAlreadyPassedSet) {
+ return transferElectricity(side, aVoltage, aAmperage, new ArrayList<>(aAlreadyPassedSet));
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityItemPipe.java b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityItemPipe.java
new file mode 100644
index 0000000000..5daf895c20
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityItemPipe.java
@@ -0,0 +1,123 @@
+package gregtech.api.interfaces.metatileentity;
+
+import java.util.Map;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+
+public interface IMetaTileEntityItemPipe extends IMetaTileEntityPipe {
+
+ /**
+ * @return if this Pipe can still be used.
+ */
+ boolean pipeCapacityCheck();
+
+ /**
+ * @return if this Pipe can still be used.
+ */
+ boolean incrementTransferCounter(int aIncrement);
+
+ /**
+ * Sends an ItemStack from aSender to the adjacent Blocks.
+ *
+ * @param aSender the BaseMetaTileEntity sending the Stack.
+ * @return if it was able to send something
+ */
+ boolean sendItemStack(Object aSender);
+
+ /**
+ * Executes the Sending Code for inserting Stacks into the TileEntities.
+ *
+ * @param aSender the BaseMetaTileEntity sending the Stack.
+ * @param side the Side of the PIPE facing the TileEntity.
+ * @return if this Side was allowed to Output into the Block.
+ */
+ boolean insertItemStackIntoTileEntity(Object aSender, ForgeDirection side);
+
+ /**
+ * Can be used to make flow control Pipes, like Redpowers Restriction Tubes. Every normal Pipe returns a Value of
+ * 32768, so you can easily insert lower Numbers to set Routing priorities. Negative Numbers to "suck" Items into a
+ * certain direction are also possible.
+ */
+ int getStepSize();
+
+ /**
+ * Utility for the Item Network
+ */
+ class Util {
+
+ /**
+ * @return connected Item Pipes
+ */
+ public static Map<IMetaTileEntityItemPipe, Long> scanPipes(IMetaTileEntityItemPipe aMetaTileEntity,
+ Map<IMetaTileEntityItemPipe, Long> aMap, long aStep, boolean aSuckItems, boolean aIgnoreCapacity) {
+ aStep += aMetaTileEntity.getStepSize();
+ if (aIgnoreCapacity || aMetaTileEntity.pipeCapacityCheck())
+ if (aMap.get(aMetaTileEntity) == null || aMap.get(aMetaTileEntity) > aStep) {
+ final IGregTechTileEntity aBaseMetaTileEntity = aMetaTileEntity.getBaseMetaTileEntity();
+ aMap.put(aMetaTileEntity, aStep);
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (aMetaTileEntity instanceof IConnectable
+ && !((IConnectable) aMetaTileEntity).isConnectedAtSide(side)) continue;
+ final ForgeDirection oppositeSide = side.getOpposite();
+ if (aSuckItems) {
+ if (aBaseMetaTileEntity.getCoverInfoAtSide(side)
+ .letsItemsIn(-2)) {
+ final IGregTechTileEntity tItemPipe = aBaseMetaTileEntity
+ .getIGregTechTileEntityAtSide(side);
+ if (aBaseMetaTileEntity.getColorization() >= 0) {
+ final byte tColor = tItemPipe.getColorization();
+ if (tColor >= 0 && tColor != aBaseMetaTileEntity.getColorization()) {
+ continue;
+ }
+ }
+ if (tItemPipe instanceof BaseMetaPipeEntity) {
+ final IMetaTileEntity tMetaTileEntity = tItemPipe.getMetaTileEntity();
+ if (tMetaTileEntity instanceof IMetaTileEntityItemPipe
+ && tItemPipe.getCoverInfoAtSide(oppositeSide)
+ .letsItemsOut(-2)) {
+ scanPipes(
+ (IMetaTileEntityItemPipe) tMetaTileEntity,
+ aMap,
+ aStep,
+ aSuckItems,
+ aIgnoreCapacity);
+ }
+ }
+ }
+ } else {
+ if (aBaseMetaTileEntity.getCoverInfoAtSide(side)
+ .letsItemsOut(-2)) {
+ final IGregTechTileEntity tItemPipe = aBaseMetaTileEntity
+ .getIGregTechTileEntityAtSide(side);
+ if (tItemPipe != null) {
+ if (aBaseMetaTileEntity.getColorization() >= 0) {
+ final byte tColor = tItemPipe.getColorization();
+ if (tColor >= 0 && tColor != aBaseMetaTileEntity.getColorization()) {
+ continue;
+ }
+ }
+ if (tItemPipe instanceof BaseMetaPipeEntity) {
+ final IMetaTileEntity tMetaTileEntity = tItemPipe.getMetaTileEntity();
+ if (tMetaTileEntity instanceof IMetaTileEntityItemPipe
+ && tItemPipe.getCoverInfoAtSide(oppositeSide)
+ .letsItemsIn(-2)) {
+ scanPipes(
+ (IMetaTileEntityItemPipe) tMetaTileEntity,
+ aMap,
+ aStep,
+ aSuckItems,
+ aIgnoreCapacity);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return aMap;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityPipe.java b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityPipe.java
new file mode 100644
index 0000000000..0ac29b2e45
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntityPipe.java
@@ -0,0 +1,24 @@
+package gregtech.api.interfaces.metatileentity;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public interface IMetaTileEntityPipe extends IMetaTileEntity {
+
+ /**
+ * Icon of the Texture. If this returns null then it falls back to getTextureIndex.
+ *
+ * @param side is the Side of the Block
+ * @param facingBitMask is the Bitmask of all Connections
+ * @param colorIndex The Minecraft Color the Block is having
+ * @param active if the Machine is currently active (use this instead of calling
+ * mBaseMetaTileEntity.mActive!!!). Note: In case of Pipes this means if this Side is connected
+ * to something or not.
+ * @param redstoneLevel if the Machine is currently outputting a RedstoneSignal (use this instead of calling
+ * mBaseMetaTileEntity.mRedstone!!!)
+ */
+ ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, int facingBitMask,
+ int colorIndex, boolean active, boolean redstoneLevel);
+}
diff --git a/src/main/java/gregtech/api/interfaces/metatileentity/IMetricsExporter.java b/src/main/java/gregtech/api/interfaces/metatileentity/IMetricsExporter.java
new file mode 100644
index 0000000000..f97cd79ed6
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/metatileentity/IMetricsExporter.java
@@ -0,0 +1,28 @@
+package gregtech.api.interfaces.metatileentity;
+
+import java.util.List;
+
+import org.jetbrains.annotations.NotNull;
+
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+
+/**
+ * Metrics Transmitter covers look for this interface for retrieving custom metrics for a machine. If this interface is
+ * not present on the machine housing the cover, it will use {@link BaseMetaTileEntity#getInfoData()} to retrieve info
+ * instead.
+ */
+public interface IMetricsExporter {
+
+ /**
+ * Attached metrics covers will call this method to receive reported metrics.
+ * <p>
+ * When reporting metrics, try to keep the number of entries small, and ordering of entries consistent. Advanced
+ * Sensor Cards allow the user to selectively turn off individual lines using the panel's UI, and doing so is
+ * aggravated by a metrics set that is inconsistent and/or large.
+ *
+ * @return A list of strings to print on the information panel the advanced sensor card is utilizing. Each item in
+ * the list will be printed on its own line.
+ */
+ @NotNull
+ List<String> reportMetrics();
+}
diff --git a/src/main/java/gregtech/api/interfaces/modularui/ControllerWithOptionalFeatures.java b/src/main/java/gregtech/api/interfaces/modularui/ControllerWithOptionalFeatures.java
new file mode 100644
index 0000000000..22694cdafd
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/modularui/ControllerWithOptionalFeatures.java
@@ -0,0 +1,282 @@
+package gregtech.api.interfaces.modularui;
+
+import static gregtech.api.metatileentity.BaseTileEntity.BUTTON_FORBIDDEN_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+import net.minecraft.util.StatCollector;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.tileentity.IRecipeLockable;
+import gregtech.api.interfaces.tileentity.IVoidable;
+
+/**
+ * Machines implementing this interface can have logic and GUI buttons
+ * to configure various behaviors regarding multiblock.
+ * <ul>
+ * <li>Power switch</li>
+ * <li>Void protection</li>
+ * <li>Separated input buses</li>
+ * <li>Batch mode</li>
+ * <li>Recipe locking</li>
+ * </ul>
+ */
+public interface ControllerWithOptionalFeatures extends IVoidable, IRecipeLockable {
+
+ boolean isAllowedToWork();
+
+ void disableWorking();
+
+ void enableWorking();
+
+ Pos2d getPowerSwitchButtonPos();
+
+ default ButtonWidget createPowerSwitchButton(IWidgetBuilder<?> builder) {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (isAllowedToWork()) {
+ disableWorking();
+ } else {
+ enableWorking();
+ }
+ })
+ .setPlayClickSoundResource(
+ () -> isAllowedToWork() ? SoundResource.GUI_BUTTON_UP.resourceLocation
+ : SoundResource.GUI_BUTTON_DOWN.resourceLocation)
+ .setBackground(() -> {
+ if (isAllowedToWork()) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED,
+ GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON };
+ } else {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD,
+ GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF };
+ }
+ })
+ .attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isAllowedToWork, val -> {
+ if (val) enableWorking();
+ else disableWorking();
+ }), builder)
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.power_switch"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(getPowerSwitchButtonPos())
+ .setSize(16, 16);
+ return (ButtonWidget) button;
+ }
+
+ Pos2d getVoidingModeButtonPos();
+
+ default ButtonWidget createVoidExcessButton(IWidgetBuilder<?> builder) {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (supportsVoidProtection()) {
+ Set<VoidingMode> allowed = getAllowedVoidingModes();
+ switch (clickData.mouseButton) {
+ case 0 -> setVoidingMode(getVoidingMode().nextInCollection(allowed));
+ case 1 -> setVoidingMode(getVoidingMode().previousInCollection(allowed));
+ }
+ widget.notifyTooltipChange();
+ }
+ })
+ .setPlayClickSound(supportsVoidProtection())
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(getVoidingMode().buttonTexture);
+ ret.add(getVoidingMode().buttonOverlay);
+ if (!supportsVoidProtection()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN);
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(
+ () -> getVoidingMode().ordinal(),
+ val -> setVoidingMode(VoidingMode.fromOrdinal(val))),
+ builder)
+ .dynamicTooltip(
+ () -> Arrays.asList(
+ StatCollector.translateToLocal("GT5U.gui.button.voiding_mode"),
+ StatCollector.translateToLocal(getVoidingMode().getTransKey())))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(getVoidingModeButtonPos())
+ .setSize(16, 16);
+ if (!supportsVoidProtection()) {
+ button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP));
+ }
+ return (ButtonWidget) button;
+ }
+
+ /**
+ * @return if the multi supports input separation.
+ */
+ boolean supportsInputSeparation();
+
+ /**
+ * @return true if input separation is enabled, else false. This is getter is used for displaying the icon in the
+ * GUI
+ */
+ boolean isInputSeparationEnabled();
+
+ void setInputSeparation(boolean enabled);
+
+ default boolean getDefaultInputSeparationMode() {
+ return supportsInputSeparation();
+ }
+
+ Pos2d getInputSeparationButtonPos();
+
+ default ButtonWidget createInputSeparationButton(IWidgetBuilder<?> builder) {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (supportsInputSeparation()) {
+ setInputSeparation(!isInputSeparationEnabled());
+ }
+ })
+ .setPlayClickSound(supportsInputSeparation())
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ if (isInputSeparationEnabled()) {
+ ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED);
+ if (supportsInputSeparation()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON_DISABLED);
+ }
+ } else {
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (supportsInputSeparation()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF_DISABLED);
+ }
+ }
+ if (!supportsInputSeparation()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN);
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(this::isInputSeparationEnabled, this::setInputSeparation),
+ builder)
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.input_separation"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(getInputSeparationButtonPos())
+ .setSize(16, 16);
+ if (!supportsInputSeparation()) {
+ button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP));
+ }
+ return (ButtonWidget) button;
+ }
+
+ /**
+ * @return if the multi supports batch mode.
+ */
+ boolean supportsBatchMode();
+
+ /**
+ * @return true if batch mode is enabled, else false. This is getter is used for displaying the icon in the GUI
+ */
+ boolean isBatchModeEnabled();
+
+ void setBatchMode(boolean enabled);
+
+ default boolean getDefaultBatchMode() {
+ return false;
+ }
+
+ Pos2d getBatchModeButtonPos();
+
+ default ButtonWidget createBatchModeButton(IWidgetBuilder<?> builder) {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (supportsBatchMode()) {
+ setBatchMode(!isBatchModeEnabled());
+ }
+ })
+ .setPlayClickSound(supportsBatchMode())
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ if (isBatchModeEnabled()) {
+ ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED);
+ if (supportsBatchMode()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON_DISABLED);
+ }
+ } else {
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (supportsBatchMode()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_OFF);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_OFF_DISABLED);
+ }
+ }
+ if (!supportsBatchMode()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN);
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isBatchModeEnabled, this::setBatchMode), builder)
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.batch_mode"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(getBatchModeButtonPos())
+ .setSize(16, 16);
+ if (!supportsBatchMode()) {
+ button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP));
+ }
+ return (ButtonWidget) button;
+ }
+
+ Pos2d getRecipeLockingButtonPos();
+
+ default ButtonWidget createLockToSingleRecipeButton(IWidgetBuilder<?> builder) {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (supportsSingleRecipeLocking()) {
+ setRecipeLocking(!isRecipeLockingEnabled());
+ }
+ })
+ .setPlayClickSound(supportsSingleRecipeLocking())
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ if (isRecipeLockingEnabled()) {
+ ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED);
+ if (supportsSingleRecipeLocking()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_LOCKED);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_LOCKED_DISABLED);
+ }
+ } else {
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (supportsSingleRecipeLocking()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED_DISABLED);
+ }
+ }
+ if (!supportsSingleRecipeLocking()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN);
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(this::isRecipeLockingEnabled, this::setRecipeLocking),
+ builder)
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.lock_recipe"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(getRecipeLockingButtonPos())
+ .setSize(16, 16);
+ if (!supportsSingleRecipeLocking()) {
+ button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP));
+ }
+ return (ButtonWidget) button;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/modularui/IAddGregtechLogo.java b/src/main/java/gregtech/api/interfaces/modularui/IAddGregtechLogo.java
new file mode 100644
index 0000000000..12ac32c143
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/modularui/IAddGregtechLogo.java
@@ -0,0 +1,8 @@
+package gregtech.api.interfaces.modularui;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+
+public interface IAddGregtechLogo {
+
+ default void addGregTechLogo(ModularWindow.Builder builder) {}
+}
diff --git a/src/main/java/gregtech/api/interfaces/modularui/IAddInventorySlots.java b/src/main/java/gregtech/api/interfaces/modularui/IAddInventorySlots.java
new file mode 100644
index 0000000000..4111848ecb
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/modularui/IAddInventorySlots.java
@@ -0,0 +1,15 @@
+package gregtech.api.interfaces.modularui;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+
+public interface IAddInventorySlots {
+
+ default void add1by1Slot(ModularWindow.Builder builder, IDrawable... background) {}
+
+ default void add2by2Slots(ModularWindow.Builder builder, IDrawable... background) {}
+
+ default void add3by3Slots(ModularWindow.Builder builder, IDrawable... background) {}
+
+ default void add4by4Slots(ModularWindow.Builder builder, IDrawable... background) {}
+}
diff --git a/src/main/java/gregtech/api/interfaces/modularui/IAddUIWidgets.java b/src/main/java/gregtech/api/interfaces/modularui/IAddUIWidgets.java
new file mode 100644
index 0000000000..1fa317b17f
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/modularui/IAddUIWidgets.java
@@ -0,0 +1,9 @@
+package gregtech.api.interfaces.modularui;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+public interface IAddUIWidgets {
+
+ default void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {}
+}
diff --git a/src/main/java/gregtech/api/interfaces/modularui/IBindPlayerInventoryUI.java b/src/main/java/gregtech/api/interfaces/modularui/IBindPlayerInventoryUI.java
new file mode 100644
index 0000000000..426a24ad38
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/modularui/IBindPlayerInventoryUI.java
@@ -0,0 +1,9 @@
+package gregtech.api.interfaces.modularui;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+public interface IBindPlayerInventoryUI {
+
+ void bindPlayerInventoryUI(ModularWindow.Builder builder, UIBuildContext buildContext);
+}
diff --git a/src/main/java/gregtech/api/interfaces/modularui/IGetGUITextureSet.java b/src/main/java/gregtech/api/interfaces/modularui/IGetGUITextureSet.java
new file mode 100644
index 0000000000..59aa2723c3
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/modularui/IGetGUITextureSet.java
@@ -0,0 +1,10 @@
+package gregtech.api.interfaces.modularui;
+
+import gregtech.api.gui.modularui.GUITextureSet;
+
+public interface IGetGUITextureSet {
+
+ default GUITextureSet getGUITextureSet() {
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/modularui/IGetTitleColor.java b/src/main/java/gregtech/api/interfaces/modularui/IGetTitleColor.java
new file mode 100644
index 0000000000..76d94ee299
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/modularui/IGetTitleColor.java
@@ -0,0 +1,11 @@
+package gregtech.api.interfaces.modularui;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.util.GT_Util;
+
+public interface IGetTitleColor {
+
+ default int getTitleColor() {
+ return GT_Util.getRGBaInt(Dyes.dyeWhite.getRGBA());
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IAllSidedTexturedTileEntity.java b/src/main/java/gregtech/api/interfaces/tileentity/IAllSidedTexturedTileEntity.java
new file mode 100644
index 0000000000..1d00aa5d76
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IAllSidedTexturedTileEntity.java
@@ -0,0 +1,24 @@
+package gregtech.api.interfaces.tileentity;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+
+/**
+ * Block which has same texture on all sides
+ */
+public interface IAllSidedTexturedTileEntity extends ITexturedTileEntity {
+
+ /**
+ * @return the Textures rendered by the GT Rendering
+ */
+ default ITexture[] getTexture(Block aBlock, ForgeDirection side) {
+ return getTexture(aBlock);
+ }
+
+ /**
+ * @return the Textures rendered by the GT Rendering
+ */
+ ITexture[] getTexture(Block aBlock);
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IBasicEnergyContainer.java b/src/main/java/gregtech/api/interfaces/tileentity/IBasicEnergyContainer.java
new file mode 100644
index 0000000000..37d62894bb
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IBasicEnergyContainer.java
@@ -0,0 +1,110 @@
+package gregtech.api.interfaces.tileentity;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+/**
+ * Interface for internal Code, which is mainly used for independent Energy conversion.
+ */
+public interface IBasicEnergyContainer extends IEnergyConnected, IHasWorldObjectAndCoords {
+
+ /**
+ * Gets if that Amount of Energy is stored inside the Machine. It is used for checking the contained Energy before
+ * consuming it. If this returns false, it will also give a Message inside the Scanner, that this Machine doesn't
+ * have enough Energy.
+ */
+ boolean isUniversalEnergyStored(long aEnergyAmount);
+
+ /**
+ * Gets the stored electric, kinetic or steam Energy (with EU as reference Value) Always returns the largest one.
+ */
+ long getUniversalEnergyStored();
+
+ /**
+ * Gets the largest electric, kinetic or steam Energy Capacity (with EU as reference Value)
+ */
+ long getUniversalEnergyCapacity();
+
+ /**
+ * Gets the amount of Energy Packets per tick.
+ */
+ long getOutputAmperage();
+
+ /**
+ * Gets the Output in EU/p.
+ */
+ long getOutputVoltage();
+
+ /**
+ * Gets the amount of Energy Packets per tick.
+ */
+ long getInputAmperage();
+
+ /**
+ * Gets the maximum Input in EU/p.
+ */
+ long getInputVoltage();
+
+ /**
+ * Decreases the Amount of stored universal Energy. If ignoring too less Energy, then it just sets the Energy to 0
+ * and returns false.
+ */
+ boolean decreaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooLessEnergy);
+
+ /**
+ * Increases the Amount of stored electric Energy. If ignoring too much Energy, then the Energy Limit is just being
+ * ignored.
+ */
+ boolean increaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooMuchEnergy);
+
+ /**
+ * Drain Energy Call for Electricity.
+ */
+ boolean drainEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage);
+
+ /**
+ * returns the amount of Electricity, accepted by this Block the last 5 ticks as Average.
+ */
+ long getAverageElectricInput();
+
+ /**
+ * returns the amount of Electricity, outputted by this Block the last 5 ticks as Average.
+ */
+ long getAverageElectricOutput();
+
+ /**
+ * returns the amount of electricity contained in this Block, in EU units!
+ */
+ long getStoredEU();
+
+ /**
+ * returns the amount of electricity containable in this Block, in EU units!
+ */
+ long getEUCapacity();
+
+ /**
+ * returns the amount of Steam contained in this Block, in EU units!
+ */
+ default long getStoredSteam() {
+ return 0;
+ }
+
+ /**
+ * returns the amount of Steam containable in this Block, in EU units!
+ */
+ default long getSteamCapacity() {
+ return 0;
+ }
+
+ /**
+ * Increases stored Energy. Energy Base Value is in EU, even though it's Steam!
+ *
+ * @param aEnergy The Energy to add to the Machine.
+ * @param aIgnoreTooMuchEnergy if it shall ignore if it has too much Energy.
+ * @return if it was successful
+ * <p/>
+ * And yes, you can't directly decrease the Steam of a Machine. That is done by decreaseStoredEnergyUnits
+ */
+ default boolean increaseStoredSteam(long aEnergy, boolean aIgnoreTooMuchEnergy) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IColoredTileEntity.java b/src/main/java/gregtech/api/interfaces/tileentity/IColoredTileEntity.java
new file mode 100644
index 0000000000..ec760dd346
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IColoredTileEntity.java
@@ -0,0 +1,27 @@
+package gregtech.api.interfaces.tileentity;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.util.GT_Util;
+
+public interface IColoredTileEntity {
+
+ /**
+ * @return 0 - 15 are Colors, while -1 means uncolored
+ */
+ byte getColorization();
+
+ /**
+ * Sets the Color Modulation of the Block
+ *
+ * @param aColor the Color you want to set it to. -1 for reset.
+ */
+ byte setColorization(byte aColor);
+
+ /**
+ * @return Actual color shown on GUI
+ */
+ default int getGUIColorization() {
+ return GT_Util
+ .getRGBInt((getColorization() != -1 ? Dyes.get(getColorization()) : Dyes.MACHINE_METAL).getRGBA());
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/ICoverable.java b/src/main/java/gregtech/api/interfaces/tileentity/ICoverable.java
new file mode 100644
index 0000000000..8834678984
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/ICoverable.java
@@ -0,0 +1,91 @@
+package gregtech.api.interfaces.tileentity;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.covers.CoverInfo;
+
+public interface ICoverable extends IRedstoneTileEntity, IHasInventory, IBasicEnergyContainer {
+
+ boolean canPlaceCoverIDAtSide(ForgeDirection side, int aID);
+
+ boolean canPlaceCoverItemAtSide(ForgeDirection side, ItemStack aCover);
+
+ boolean dropCover(ForgeDirection side, ForgeDirection droppedSide, boolean aForced);
+
+ @Deprecated
+ void setCoverDataAtSide(ForgeDirection side, int aData);
+
+ default void setCoverDataAtSide(ForgeDirection side, ISerializableObject aData) {
+ if (aData instanceof ISerializableObject.LegacyCoverData)
+ setCoverDataAtSide(side, ((ISerializableObject.LegacyCoverData) aData).get());
+ }
+
+ void setCoverIdAndDataAtSide(ForgeDirection side, int aId, ISerializableObject aData);
+
+ void setCoverIDAtSide(ForgeDirection side, int aID);
+
+ boolean setCoverIDAtSideNoUpdate(ForgeDirection side, int aID);
+
+ void setCoverItemAtSide(ForgeDirection side, ItemStack aCover);
+
+ @Deprecated
+ int getCoverDataAtSide(ForgeDirection side);
+
+ default CoverInfo getCoverInfoAtSide(ForgeDirection side) {
+ return null;
+ }
+
+ default ISerializableObject getComplexCoverDataAtSide(ForgeDirection side) {
+ return new ISerializableObject.LegacyCoverData(getCoverDataAtSide(side));
+ }
+
+ int getCoverIDAtSide(ForgeDirection side);
+
+ ItemStack getCoverItemAtSide(ForgeDirection side);
+
+ @Deprecated
+ GT_CoverBehavior getCoverBehaviorAtSide(ForgeDirection side);
+
+ default GT_CoverBehaviorBase<?> getCoverBehaviorAtSideNew(ForgeDirection side) {
+ return getCoverBehaviorAtSide(side);
+ }
+
+ /**
+ * For use by the regular MetaTileEntities. Returns the Cover Manipulated input Redstone. Don't use this if you are
+ * a Cover Behavior. Only for MetaTileEntities.
+ */
+ byte getInternalInputRedstoneSignal(ForgeDirection side);
+
+ /**
+ * For use by the regular MetaTileEntities. This makes it not conflict with Cover based Redstone Signals. Don't use
+ * this if you are a Cover Behavior. Only for MetaTileEntities.
+ */
+ void setInternalOutputRedstoneSignal(ForgeDirection side, byte aStrength);
+
+ /**
+ * Causes a general Cover Texture update. Sends 6 Integers to Client + causes @issueTextureUpdate()
+ */
+ void issueCoverUpdate(ForgeDirection side);
+
+ /**
+ * Receiving a packet with cover data.
+ */
+ void receiveCoverData(ForgeDirection coverSide, int coverID, int coverData);
+
+ /**
+ * Receiving a packet with cover data.
+ *
+ * @param coverSide cover side
+ * @param aPlayer the player who made the change
+ */
+ default void receiveCoverData(ForgeDirection coverSide, int aCoverID, ISerializableObject aCoverData,
+ EntityPlayerMP aPlayer) {
+ if (aCoverData instanceof ISerializableObject.LegacyCoverData)
+ receiveCoverData(coverSide, aCoverID, ((ISerializableObject.LegacyCoverData) aCoverData).get());
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IDebugableTileEntity.java b/src/main/java/gregtech/api/interfaces/tileentity/IDebugableTileEntity.java
new file mode 100644
index 0000000000..5208944d66
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IDebugableTileEntity.java
@@ -0,0 +1,18 @@
+package gregtech.api.interfaces.tileentity;
+
+import java.util.ArrayList;
+
+import net.minecraft.entity.player.EntityPlayer;
+
+public interface IDebugableTileEntity {
+
+ /**
+ * Returns a Debug Message, for a generic DebugItem
+ *
+ * @param aPlayer the Player, who rightclicked with his Debug Item
+ * @param aLogLevel the Log Level of the Debug Item. 0 = Obvious 1 = Visible for the regular Scanner 2 = Only
+ * visible to more advanced Scanners 3 = Debug ONLY
+ * @return a String-Array containing the DebugInfo, every Index is a separate line (0 = first Line)
+ */
+ ArrayList<String> getDebugInfo(EntityPlayer aPlayer, int aLogLevel);
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IDigitalChest.java b/src/main/java/gregtech/api/interfaces/tileentity/IDigitalChest.java
new file mode 100644
index 0000000000..9a08e65b78
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IDigitalChest.java
@@ -0,0 +1,33 @@
+package gregtech.api.interfaces.tileentity;
+
+import net.minecraft.item.ItemStack;
+
+/**
+ * You are allowed to include this File in your Download, as i will not change it.
+ */
+public interface IDigitalChest extends IHasWorldObjectAndCoords {
+
+ /**
+ * Is this even a TileEntity of a Digital Chest? I need things like this Function for MetaTileEntities, you MUST
+ * check this!!! Do not assume that it's a Digital Chest or similar Device, when it just implements this Interface.
+ */
+ boolean isDigitalChest();
+
+ /**
+ * Gives an Array of Stacks with Size (of all the Data-stored Items) of the correspondent Item kinds (regular
+ * QChests have only one) Does NOT include the 64 "ready" Items inside the Slots, and neither the 128 Items in the
+ * overflow Buffer.
+ */
+ ItemStack[] getStoredItemData();
+
+ /**
+ * A generic Interface for just setting the amount of contained Items
+ */
+ void setItemCount(int aCount);
+
+ /**
+ * Gets the maximum Item count for this QChest alike Storage. This applies to the Data-Storage, not for the up to
+ * 192 buffered Items!
+ */
+ int getMaxItemCount();
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConductor.java b/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConductor.java
new file mode 100644
index 0000000000..e285c6f0e3
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConductor.java
@@ -0,0 +1,41 @@
+package gregtech.api.interfaces.tileentity;
+
+import gregtech.api.enums.Materials;
+
+/**
+ * Informative Class for Cables. Not used for now.
+ * <p/>
+ * Not all Data might be reliable. This is just for Information sake.
+ */
+public interface IEnergyConductor extends IEnergyConnected, IHasWorldObjectAndCoords {
+
+ /**
+ * @return if this is actually a Cable. (you must check this)
+ */
+ boolean isConductor();
+
+ /**
+ * @return the maximum Voltage of the Cable.
+ */
+ long getMaxVoltage();
+
+ /**
+ * @return the maximum Amperage of the Cable, per Wire.
+ */
+ long getMaxAmperage();
+
+ /**
+ * @return the Loss of the Cable, per Meter.
+ */
+ long getLossPerMeter();
+
+ /**
+ * @return the Material the Cable consists of. (may return Materials._NULL)
+ */
+ Materials getCableMaterial();
+
+ /**
+ * @return the Material the Cable Insulation consists of. (may return Materials._NULL)
+ */
+ Materials getInsulationMaterial();
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java b/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java
new file mode 100644
index 0000000000..91a9759e47
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java
@@ -0,0 +1,178 @@
+package gregtech.api.interfaces.tileentity;
+
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cofh.api.energy.IEnergyReceiver;
+import gregtech.api.GregTech_API;
+import gregtech.api.logic.PowerLogic;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.util.GT_Utility;
+import ic2.api.energy.tile.IEnergySink;
+
+/**
+ * Interface for getting Connected to the GregTech Energy Network.
+ * <p/>
+ * This is all you need to connect to the GT Network. IColoredTileEntity is needed for not connecting differently
+ * coloured Blocks to each other. IHasWorldObjectAndCoords is needed for the InWorld related Stuff. @BaseTileEntity does
+ * implement most of that Interface.
+ */
+public interface IEnergyConnected extends IColoredTileEntity {
+
+ /**
+ * Inject Energy Call for Electricity. Gets called by EnergyEmitters to inject Energy into your Block
+ * <p/>
+ * Note: you have to check for @inputEnergyFrom because the Network won't check for that by itself.
+ *
+ * @param side 0 - 5 = Vanilla Directions of YOUR Block the Energy gets inserted to. 6 = No specific Side (don't do
+ * Side checks for this Side)
+ * @return amount of used Amperes. 0 if not accepted anything.
+ */
+ long injectEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage);
+
+ /**
+ * Sided Energy Input
+ */
+ boolean inputEnergyFrom(ForgeDirection side);
+
+ default boolean inputEnergyFrom(ForgeDirection side, boolean waitForActive) {
+ return inputEnergyFrom(side);
+ }
+
+ /**
+ * Sided Energy Output
+ */
+ boolean outputsEnergyTo(ForgeDirection side);
+
+ default boolean outputsEnergyTo(ForgeDirection side, boolean waitForActive) {
+ return outputsEnergyTo(side);
+ }
+
+ /**
+ * Utility for the Network
+ */
+ final class Util {
+
+ // TODO: Deduplicate code by rewokring the Enet system using the GTCEu one as inspiration - BlueWeabo
+ /**
+ * Emits Energy to the E-net. Also compatible with adjacent IC2 TileEntities.
+ *
+ * @return the used Amperage.
+ */
+ public static long emitEnergyToNetwork(long voltage, long amperage, IEnergyConnected emitter) {
+ long usedAmperes = 0;
+ if (!(emitter instanceof IHasWorldObjectAndCoords emitterTile)) {
+ return 0;
+ }
+
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (usedAmperes > amperage) break;
+ if (!emitter.outputsEnergyTo(side)) {
+ continue;
+ }
+
+ final ForgeDirection oppositeSide = Objects.requireNonNull(side.getOpposite());
+ final TileEntity tTileEntity = emitterTile.getTileEntityAtSide(side);
+ if (tTileEntity instanceof PowerLogicHost host) {
+
+ final PowerLogic logic = host.getPowerLogic(oppositeSide);
+ if (logic == null || logic.isEnergyReceiver()) {
+ continue;
+ }
+
+ usedAmperes += logic.injectEnergy(voltage, amperage - usedAmperes);
+ } else if (tTileEntity instanceof IEnergyConnected energyConnected) {
+ if (emitter.getColorization() >= 0) {
+ final byte tColor = energyConnected.getColorization();
+ if (tColor >= 0 && tColor != emitter.getColorization()) continue;
+ }
+ usedAmperes += energyConnected.injectEnergyUnits(oppositeSide, voltage, amperage - usedAmperes);
+
+ } else if (tTileEntity instanceof IEnergySink sink) {
+ if (sink.acceptsEnergyFrom((TileEntity) emitter, oppositeSide)) {
+ while (amperage > usedAmperes && sink.getDemandedEnergy() > 0
+ && sink.injectEnergy(oppositeSide, voltage, voltage) < voltage) usedAmperes++;
+ }
+ } else if (GregTech_API.mOutputRF && tTileEntity instanceof IEnergyReceiver receiver) {
+ final int rfOut = GT_Utility.safeInt(voltage * GregTech_API.mEUtoRF / 100);
+ if (receiver.receiveEnergy(oppositeSide, rfOut, true) == rfOut) {
+ receiver.receiveEnergy(oppositeSide, rfOut, false);
+ usedAmperes++;
+ }
+ }
+ }
+ return usedAmperes;
+ }
+
+ /**
+ * Same as {@link #emitEnergyToNetwork(long, long, IEnergyConnected)}, but instead we remove the energy directly from the logic itself.
+ * @param emitter The host, which is trying to emit energy in the network
+ * @param outputSide side from where energy is being outputted to. If its {@link ForgeDirection#UNKNOWN} then it doesn't emit energy to the network
+ */
+ public static void emitEnergyToNetwork(@Nonnull final PowerLogicHost emitter, @Nonnull final ForgeDirection outputSide) {
+ if (outputSide == ForgeDirection.UNKNOWN) return;
+ final PowerLogic emitterLogic = emitter.getPowerLogic();
+ long usedAmperes = 0;
+ long voltage = emitterLogic.getVoltage();
+ long amperage = emitterLogic.getMaxAmperage();
+ if (!(emitter instanceof final IHasWorldObjectAndCoords emitterTile)) {
+ return;
+ }
+ // We need to make sure we can actually output energy on this side. This is more of a safety check.
+ if (emitter.getPowerLogic(outputSide) == null) {
+ return;
+ }
+
+ final ForgeDirection oppositeSide = Objects.requireNonNull(outputSide.getOpposite());
+ final TileEntity tileEntity = emitterTile.getTileEntityAtSide(outputSide);
+ if (tileEntity instanceof PowerLogicHost host) {
+
+ final PowerLogic logic = host.getPowerLogic(oppositeSide);
+ if (logic == null || logic.isEnergyReceiver()) {
+ return;
+ }
+
+ usedAmperes += logic.injectEnergy(voltage, amperage);
+ emitterLogic.removeEnergyUnsafe(usedAmperes * voltage);
+ return;
+ }
+
+ if (tileEntity instanceof IEnergyConnected energyConnected) {
+ if (emitter instanceof IColoredTileEntity coloredEmitter && coloredEmitter.getColorization() >= 0) {
+ final byte tColor = energyConnected.getColorization();
+ if (tColor >= 0 && tColor != coloredEmitter.getColorization()) {
+ return;
+ }
+ }
+ usedAmperes += energyConnected.injectEnergyUnits(oppositeSide, voltage, amperage - usedAmperes);
+ emitterLogic.removeEnergyUnsafe(usedAmperes * voltage);
+ return;
+ }
+
+ if (tileEntity instanceof IEnergySink sink) {
+ if (sink.acceptsEnergyFrom((TileEntity) emitter, oppositeSide)) {
+ while (amperage > usedAmperes && sink.getDemandedEnergy() > 0
+ && sink.injectEnergy(oppositeSide, voltage, voltage) < voltage) {
+ usedAmperes++;
+ }
+ emitterLogic.removeEnergyUnsafe(usedAmperes * voltage);
+ return;
+ }
+ }
+
+ if (GregTech_API.mOutputRF && tileEntity instanceof IEnergyReceiver receiver) {
+ final int rfOut = GT_Utility.safeInt(voltage * GregTech_API.mEUtoRF / 100);
+ if (receiver.receiveEnergy(oppositeSide, rfOut, true) == rfOut) {
+ receiver.receiveEnergy(oppositeSide, rfOut, false);
+ usedAmperes++;
+ emitterLogic.removeEnergyUnsafe(usedAmperes * voltage);
+ return;
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IFibreConnected.java b/src/main/java/gregtech/api/interfaces/tileentity/IFibreConnected.java
new file mode 100644
index 0000000000..2f7f26e723
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IFibreConnected.java
@@ -0,0 +1,34 @@
+package gregtech.api.interfaces.tileentity;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+/**
+ * This File has just internal Information about the Fibre Redstone State of a TileEntity
+ */
+public interface IFibreConnected extends IColoredTileEntity, IHasWorldObjectAndCoords {
+
+ /**
+ * If this Blocks accepts Fibre from this Side
+ */
+ void inputFibreFrom(ForgeDirection side);
+
+ /**
+ * If this Blocks emits Fibre to this Side
+ */
+ void outputsFibreTo(ForgeDirection side);
+
+ /**
+ * Sets the Signal this Blocks outputs to this Fibre Color
+ */
+ void setFibreOutput(ForgeDirection side, byte aColor, byte aRedstoneStrength);
+
+ /**
+ * Gets the Signal this Blocks outputs to this Fibre Color
+ */
+ byte getFibreOutput(ForgeDirection side, byte aColor);
+
+ /**
+ * Gets the Signal this Blocks receives from this Fibre Color
+ */
+ byte getFibreInput(ForgeDirection side, byte aColor);
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IGTEnet.java b/src/main/java/gregtech/api/interfaces/tileentity/IGTEnet.java
new file mode 100644
index 0000000000..77b894fea7
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IGTEnet.java
@@ -0,0 +1,19 @@
+package gregtech.api.interfaces.tileentity;
+
+public interface IGTEnet {
+
+ /**
+ * @return true if this Device consumes Energy at all
+ */
+ default boolean isEnetInput() {
+ return false;
+ }
+
+ /**
+ *
+ * @return true if this Device emits Energy at all
+ */
+ default boolean isEnetOutput() {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IGearEnergyTileEntity.java b/src/main/java/gregtech/api/interfaces/tileentity/IGearEnergyTileEntity.java
new file mode 100644
index 0000000000..7eeee90c8c
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IGearEnergyTileEntity.java
@@ -0,0 +1,21 @@
+package gregtech.api.interfaces.tileentity;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+public interface IGearEnergyTileEntity {
+
+ /**
+ * If Rotation Energy can be accepted on this Side. This means that the Gear/Axle will connect to this Side, and can
+ * cause the Gear/Axle to stop if the Energy isn't accepted.
+ */
+ boolean acceptsRotationalEnergy(ForgeDirection side);
+
+ /**
+ * Inject Energy Call for Rotational Energy. Rotation Energy can't be stored, this is just for things like internal
+ * Dynamos, which convert it into Energy, or into Progress.
+ *
+ * @param side inject to this side
+ * @param aSpeed Positive = Clockwise, Negative = Counterclockwise
+ */
+ boolean injectRotationalEnergy(ForgeDirection side, long aSpeed, long aEnergy);
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IGregTechDeviceInformation.java b/src/main/java/gregtech/api/interfaces/tileentity/IGregTechDeviceInformation.java
new file mode 100644
index 0000000000..001ed44825
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IGregTechDeviceInformation.java
@@ -0,0 +1,22 @@
+package gregtech.api.interfaces.tileentity;
+
+/**
+ * You are allowed to include this File in your Download, as i will not change it.
+ */
+public interface IGregTechDeviceInformation {
+
+ /**
+ * Is this even a TileEntity which allows GregTech Sensor Kits? I need things like this Function for
+ * MetaTileEntities, you MUST check this!!! Do not assume that it's a Information returning Device, when it just
+ * implements this Interface.
+ */
+ boolean isGivingInformation();
+
+ /**
+ * Up to 8 Strings can be returned. Note: If you insert "\\\\" in the String it tries to translate seperate Parts of
+ * the String instead of the String as a whole.
+ *
+ * @return an Array of Information Strings. Don't return null!
+ */
+ String[] getInfoData();
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java b/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java
new file mode 100644
index 0000000000..d8231ee544
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java
@@ -0,0 +1,206 @@
+package gregtech.api.interfaces.tileentity;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.interfaces.IDescribable;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.modularui.IAddInventorySlots;
+import gregtech.api.interfaces.modularui.IGetGUITextureSet;
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.common.blocks.GT_Block_Machines;
+
+/**
+ * A simple compound Interface for all my TileEntities.
+ * <p/>
+ * Also delivers most of the Information about my TileEntities.
+ * <p/>
+ * It can cause Problems to include this Interface!
+ */
+public interface IGregTechTileEntity extends ITexturedTileEntity, IGearEnergyTileEntity, ICoverable, IFluidHandler,
+ ITurnable, IGregTechDeviceInformation, IUpgradableMachine, IDigitalChest, IDescribable, IMachineBlockUpdateable,
+ IGregtechWailaProvider, IGetGUITextureSet, IAddInventorySlots {
+
+ /**
+ * gets the Error displayed on the GUI
+ */
+ int getErrorDisplayID();
+
+ /**
+ * sets the Error displayed on the GUI
+ */
+ void setErrorDisplayID(int aErrorID);
+
+ /**
+ * @return the MetaID of the Block or the MetaTileEntity ID.
+ */
+ int getMetaTileID();
+
+ /**
+ * Internal Usage only!
+ */
+ int setMetaTileID(short aID);
+
+ /**
+ * @return the MetaTileEntity which is belonging to this, or null if it doesnt has one.
+ */
+ IMetaTileEntity getMetaTileEntity();
+
+ /**
+ * Sets the MetaTileEntity. Even though this uses the Universal Interface, certain BaseMetaTileEntities only accept
+ * one kind of MetaTileEntity so only use this if you are sure its the correct one or you will get a Class cast
+ * Error.
+ *
+ * @param aMetaTileEntity a MetaTileEntity
+ */
+ void setMetaTileEntity(IMetaTileEntity aMetaTileEntity);
+
+ /**
+ * Causes a general Texture update.
+ * <p/>
+ * Only used Client Side to mark Blocks dirty.
+ */
+ void issueTextureUpdate();
+
+ /**
+ * Causes the Machine to send its initial Data, like Covers and its ID.
+ */
+ void issueClientUpdate();
+
+ /**
+ * causes Explosion. Strength in Overload-EU
+ */
+ void doExplosion(long aExplosionEU);
+
+ /**
+ * Sets the Block on Fire in all 6 Directions
+ */
+ void setOnFire();
+
+ /**
+ * Sets the Block to Fire
+ */
+ void setToFire();
+
+ /**
+ * Sets the Owner of the Machine. Returns the set Name.
+ */
+ String setOwnerName(String aName);
+
+ /**
+ * gets the Name of the Machines Owner or "Player" if not set.
+ */
+ String getOwnerName();
+
+ /**
+ * Gets the UniqueID of the Machines Owner.
+ */
+ UUID getOwnerUuid();
+
+ /**
+ * Sets the UniqueID of the Machines Owner.
+ */
+ void setOwnerUuid(UUID uuid);
+
+ /**
+ * Sets initial Values from NBT
+ *
+ * @param aNBT is the NBTTag of readFromNBT
+ * @param aID is the MetaTileEntityID
+ */
+ void setInitialValuesAsNBT(NBTTagCompound aNBT, short aID);
+
+ /**
+ * Called when leftclicking the TileEntity
+ */
+ void onLeftclick(EntityPlayer aPlayer);
+
+ /**
+ * Called when rightclicking the TileEntity
+ */
+ boolean onRightclick(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ);
+
+ float getBlastResistance(ForgeDirection side);
+
+ default void onBlockDestroyed() {}
+
+ ArrayList<ItemStack> getDrops();
+
+ /**
+ * Check if the item at the specific index should be dropped or not
+ *
+ * @param index Index that will be checked
+ * @return True if it should drop, else false
+ */
+ boolean shouldDropItemAt(int index);
+
+ /**
+ * 255 = 100%
+ */
+ int getLightOpacity();
+
+ void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB,
+ List<AxisAlignedBB> outputAABB, Entity collider);
+
+ AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ);
+
+ void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider);
+
+ /**
+ * Checks validity of meta tile and delegates to it
+ */
+ @Override
+ default void onMachineBlockUpdate() {
+ if (!isDead() && getMetaTileEntity() != null && getMetaTileEntity().getBaseMetaTileEntity() == this) {
+ getMetaTileEntity().onMachineBlockUpdate();
+ }
+ }
+
+ /**
+ * Checks validity of meta tile and delegates to it
+ */
+ @Override
+ default boolean isMachineBlockUpdateRecursive() {
+ return !isDead() && getMetaTileEntity() != null
+ && getMetaTileEntity().getBaseMetaTileEntity() == this
+ && getMetaTileEntity().isMachineBlockUpdateRecursive();
+ }
+
+ default void setShutdownStatus(boolean newStatus) {}
+
+ default void setShutDownReason(@Nonnull ShutDownReason reason) {}
+
+ /**
+ * A randomly called display update to be able to add particles or other items for display The event is proxied by
+ * the {@link GT_Block_Machines#randomDisplayTick}
+ */
+ @SideOnly(Side.CLIENT)
+ default void onRandomDisplayTick() {
+ if (getMetaTileEntity() != null && getMetaTileEntity().getBaseMetaTileEntity() == this) {
+ getMetaTileEntity().onRandomDisplayTick(this);
+ }
+ }
+
+ /**
+ * gets the time statistics used for CPU timing
+ */
+ default int[] getTimeStatistics() {
+ return null;
+ }
+
+ default void startTimeStatistics() {}
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IGregtechWailaProvider.java b/src/main/java/gregtech/api/interfaces/tileentity/IGregtechWailaProvider.java
new file mode 100644
index 0000000000..61566d82fb
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IGregtechWailaProvider.java
@@ -0,0 +1,21 @@
+package gregtech.api.interfaces.tileentity;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public interface IGregtechWailaProvider {
+
+ default void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {}
+
+ default void getWailaNBTData(final EntityPlayerMP player, final TileEntity tile, final NBTTagCompound tag,
+ final World world, int x, int y, int z) {}
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IHasInventory.java b/src/main/java/gregtech/api/interfaces/tileentity/IHasInventory.java
new file mode 100644
index 0000000000..bee1756217
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IHasInventory.java
@@ -0,0 +1,37 @@
+package gregtech.api.interfaces.tileentity;
+
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+
+public interface IHasInventory extends ISidedInventory, IHasWorldObjectAndCoords {
+
+ default void markInventoryBeenModified() {}
+
+ /**
+ * if the Inventory of this TileEntity got modified this tick
+ */
+ boolean hasInventoryBeenModified();
+
+ /**
+ * if this is just a Holoslot
+ */
+ boolean isValidSlot(int aIndex);
+
+ /**
+ * Tries to add a Stack to the Slot. It doesn't matter if the Slot is valid or invalid as described at the Function
+ * above.
+ *
+ * @return true if aStack == null, then false if aIndex is out of bounds, then false if aStack cannot be added, and
+ * then true if aStack has been added
+ */
+ boolean addStackToSlot(int aIndex, ItemStack aStack);
+
+ /**
+ * Tries to add X Items of a Stack to the Slot. It doesn't matter if the Slot is valid or invalid as described at
+ * the Function above.
+ *
+ * @return true if aStack == null, then false if aIndex is out of bounds, then false if aStack cannot be added, and
+ * then true if aStack has been added
+ */
+ boolean addStackToSlot(int aIndex, ItemStack aStack, int aAmount);
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IHasWorldObjectAndCoords.java b/src/main/java/gregtech/api/interfaces/tileentity/IHasWorldObjectAndCoords.java
new file mode 100644
index 0000000000..6d81d5c401
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IHasWorldObjectAndCoords.java
@@ -0,0 +1,190 @@
+package gregtech.api.interfaces.tileentity;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.IFluidHandler;
+
+/**
+ * This is a bunch of Functions my TileEntities provide, to make life much easier, and to get rid of internal TileEntity
+ * stuff.
+ * <p/>
+ * This also makes access to adjacent TileEntities more Efficient.
+ * <p/>
+ * Note: It doesn't have to be a TileEntity in certain cases! And only certain cases, such as the Recipe checking of the
+ * findRecipe Function.
+ */
+public interface IHasWorldObjectAndCoords {
+
+ World getWorld();
+
+ int getXCoord();
+
+ short getYCoord();
+
+ int getZCoord();
+
+ default ChunkCoordinates getCoords() {
+ return new ChunkCoordinates(getXCoord(), getYCoord(), getZCoord());
+ }
+
+ boolean isServerSide();
+
+ boolean isClientSide();
+
+ int getRandomNumber(int aRange);
+
+ TileEntity getTileEntity(int aX, int aY, int aZ);
+
+ TileEntity getTileEntityOffset(int aX, int aY, int aZ);
+
+ TileEntity getTileEntityAtSide(ForgeDirection side);
+
+ TileEntity getTileEntityAtSideAndDistance(ForgeDirection side, int aDistance);
+
+ IInventory getIInventory(int aX, int aY, int aZ);
+
+ IInventory getIInventoryOffset(int aX, int aY, int aZ);
+
+ IInventory getIInventoryAtSide(ForgeDirection side);
+
+ IInventory getIInventoryAtSideAndDistance(ForgeDirection side, int aDistance);
+
+ IFluidHandler getITankContainer(int aX, int aY, int aZ);
+
+ IFluidHandler getITankContainerOffset(int aX, int aY, int aZ);
+
+ IFluidHandler getITankContainerAtSide(ForgeDirection side);
+
+ IFluidHandler getITankContainerAtSideAndDistance(ForgeDirection side, int aDistance);
+
+ IGregTechTileEntity getIGregTechTileEntity(int aX, int aY, int aZ);
+
+ IGregTechTileEntity getIGregTechTileEntityOffset(int aX, int aY, int aZ);
+
+ IGregTechTileEntity getIGregTechTileEntityAtSide(ForgeDirection side);
+
+ IGregTechTileEntity getIGregTechTileEntityAtSideAndDistance(ForgeDirection side, int aDistance);
+
+ Block getBlock(int aX, int aY, int aZ);
+
+ Block getBlockOffset(int aX, int aY, int aZ);
+
+ Block getBlockAtSide(ForgeDirection side);
+
+ Block getBlockAtSideAndDistance(ForgeDirection side, int aDistance);
+
+ byte getMetaID(int aX, int aY, int aZ);
+
+ byte getMetaIDOffset(int aX, int aY, int aZ);
+
+ byte getMetaIDAtSide(ForgeDirection side);
+
+ byte getMetaIDAtSideAndDistance(ForgeDirection side, int aDistance);
+
+ byte getLightLevel(int aX, int aY, int aZ);
+
+ byte getLightLevelOffset(int aX, int aY, int aZ);
+
+ byte getLightLevelAtSide(ForgeDirection side);
+
+ byte getLightLevelAtSideAndDistance(ForgeDirection side, int aDistance);
+
+ boolean getOpacity(int aX, int aY, int aZ);
+
+ boolean getOpacityOffset(int aX, int aY, int aZ);
+
+ boolean getOpacityAtSide(ForgeDirection side);
+
+ boolean getOpacityAtSideAndDistance(ForgeDirection side, int aDistance);
+
+ boolean getSky(int aX, int aY, int aZ);
+
+ boolean getSkyOffset(int aX, int aY, int aZ);
+
+ boolean getSkyAtSide(ForgeDirection side);
+
+ boolean getSkyAtSideAndDistance(ForgeDirection side, int aDistance);
+
+ boolean getAir(int aX, int aY, int aZ);
+
+ boolean getAirOffset(int aX, int aY, int aZ);
+
+ boolean getAirAtSide(ForgeDirection side);
+
+ boolean getAirAtSideAndDistance(ForgeDirection side, int aDistance);
+
+ BiomeGenBase getBiome();
+
+ BiomeGenBase getBiome(int aX, int aZ);
+
+ int getOffsetX(ForgeDirection side, int aMultiplier);
+
+ short getOffsetY(ForgeDirection side, int aMultiplier);
+
+ int getOffsetZ(ForgeDirection side, int aMultiplier);
+
+ /**
+ * Checks if the TileEntity is Invalid or Unloaded. Stupid Minecraft cannot do that btw.
+ */
+ boolean isDead();
+
+ /**
+ * Sends a Block Event to the Client TileEntity.
+ *
+ * @param aValue value to sync
+ */
+ void sendBlockEvent(byte aID, byte aValue);
+
+ /**
+ * @return the Time this TileEntity has been loaded.
+ */
+ long getTimer();
+
+ /**
+ * Sets the Light Level of this Block on a Scale of 0 - 15 It could be that it doesn't work. This is just for
+ * convenience.
+ */
+ void setLightValue(byte aLightValue);
+
+ /**
+ * Function of the regular TileEntity
+ */
+ void writeToNBT(NBTTagCompound aNBT);
+
+ /**
+ * Function of the regular TileEntity
+ */
+ void readFromNBT(NBTTagCompound aNBT);
+
+ /**
+ * Function of the regular TileEntity
+ */
+ boolean isInvalidTileEntity();
+
+ /**
+ * Opens the GUI with this ID of this MetaTileEntity
+ *
+ * @deprecated Use ModularUI
+ */
+ @Deprecated
+ default boolean openGUI(EntityPlayer aPlayer, int aID) {
+ return false;
+ }
+
+ /**
+ * Opens the GUI with the ID = 0 of this TileEntity
+ *
+ * @deprecated Use ModularUI
+ */
+ @Deprecated
+ default boolean openGUI(EntityPlayer aPlayer) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IIC2Enet.java b/src/main/java/gregtech/api/interfaces/tileentity/IIC2Enet.java
new file mode 100644
index 0000000000..971558c092
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IIC2Enet.java
@@ -0,0 +1,17 @@
+package gregtech.api.interfaces.tileentity;
+
+/**
+ * IC2 Energy Compat
+ */
+public interface IIC2Enet {
+
+ /**
+ * Should this tile/block join the ic2 enet
+ */
+ boolean shouldJoinIc2Enet();
+
+ /**
+ * Update the ic2 enet
+ */
+ void doEnetUpdate();
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IMachineBlockUpdateable.java b/src/main/java/gregtech/api/interfaces/tileentity/IMachineBlockUpdateable.java
new file mode 100644
index 0000000000..f772c1ee69
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IMachineBlockUpdateable.java
@@ -0,0 +1,24 @@
+package gregtech.api.interfaces.tileentity;
+
+/**
+ * You are allowed to include this File in your Download, as i will not change it. Simple Interface for Machines, which
+ * need my Machine Blocks for MultiBlockStructures.
+ * <p/>
+ * Every Machine implementing this Interface will conduct Machine updates.
+ */
+public interface IMachineBlockUpdateable {
+
+ /**
+ * The Machine Update, which is called when the Machine needs an Update of its Parts. I suggest to wait 1-5 seconds
+ * before actually checking the Machine Parts. RP-Frames could for example cause Problems when you instacheck the
+ * Machine Parts.
+ */
+ void onMachineBlockUpdate();
+
+ /**
+ * Should recurse?
+ */
+ default boolean isMachineBlockUpdateRecursive() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IMachineProgress.java b/src/main/java/gregtech/api/interfaces/tileentity/IMachineProgress.java
new file mode 100644
index 0000000000..83570fedcc
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IMachineProgress.java
@@ -0,0 +1,96 @@
+package gregtech.api.interfaces.tileentity;
+
+import javax.annotation.Nonnull;
+
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+
+/**
+ * For Machines which have Progress
+ */
+public interface IMachineProgress extends IHasWorldObjectAndCoords {
+
+ /**
+ * returns the Progress this Machine has made. Warning, this can also be negative!
+ */
+ int getProgress();
+
+ /**
+ * returns the Progress the Machine needs to complete its task.
+ */
+ int getMaxProgress();
+
+ /**
+ * Manually increases the Progress of the Machine by vent cover.
+ */
+ boolean increaseProgress(int aProgressAmountInTicks);
+
+ /**
+ * returns if the Machine currently does something.
+ */
+ boolean hasThingsToDo();
+
+ /**
+ * returns if the Machine just got enableWorking called after being disabled. Used for Translocators, which need to
+ * check if they need to transfer immediately.
+ */
+ boolean hasWorkJustBeenEnabled();
+
+ /**
+ * allows Machine to work
+ */
+ void enableWorking();
+
+ /**
+ * disallows Machine to work
+ */
+ void disableWorking();
+
+ /**
+ * if the Machine is allowed to Work
+ */
+ boolean isAllowedToWork();
+
+ default void setAllowedToWork(Boolean allowedToWork) {
+ if (allowedToWork) {
+ enableWorking();
+ } else {
+ disableWorking();
+ }
+ }
+
+ /**
+ * used to control Machines via Redstone Signal Strength by special Covers In case of 0 the Machine is very likely
+ * doing nothing, or is just not being controlled at all.
+ */
+ default byte getWorkDataValue() {
+ return 0;
+ }
+
+ /**
+ * used to control Machines via Redstone Signal Strength by special Covers only Values between 0 and 15!
+ */
+ default void setWorkDataValue(byte aValue) {}
+
+ /**
+ * gives you the Active Status of the Machine
+ */
+ boolean isActive();
+
+ /**
+ * sets the visible Active Status of the Machine
+ */
+ void setActive(boolean aActive);
+
+ /**
+ * Indicates if the object in question was forced to shut down (i.e. loss of power)
+ */
+ default boolean wasShutdown() {
+ return false;
+ }
+
+ @Nonnull
+ default ShutDownReason getLastShutDownReason() {
+ return ShutDownReasonRegistry.NONE;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IOverclockDescriptionProvider.java b/src/main/java/gregtech/api/interfaces/tileentity/IOverclockDescriptionProvider.java
new file mode 100644
index 0000000000..495cd9def4
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IOverclockDescriptionProvider.java
@@ -0,0 +1,15 @@
+package gregtech.api.interfaces.tileentity;
+
+import javax.annotation.Nullable;
+
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+
+/**
+ * Classes implementing this interface can provide {@link OverclockDescriber} to provide overclock behavior and NEI
+ * description.
+ */
+public interface IOverclockDescriptionProvider {
+
+ @Nullable
+ OverclockDescriber getOverclockDescriber();
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IPipeRenderedTileEntity.java b/src/main/java/gregtech/api/interfaces/tileentity/IPipeRenderedTileEntity.java
new file mode 100644
index 0000000000..ab476449f0
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IPipeRenderedTileEntity.java
@@ -0,0 +1,18 @@
+package gregtech.api.interfaces.tileentity;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+
+public interface IPipeRenderedTileEntity extends ICoverable, ITexturedTileEntity {
+
+ float getThickNess();
+
+ byte getConnections();
+
+ ITexture[] getTextureUncovered(ForgeDirection side);
+
+ default ITexture[] getTextureCovered(ForgeDirection side) {
+ return getTextureUncovered(side);
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IRecipeLockable.java b/src/main/java/gregtech/api/interfaces/tileentity/IRecipeLockable.java
new file mode 100644
index 0000000000..54d178af3c
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IRecipeLockable.java
@@ -0,0 +1,31 @@
+package gregtech.api.interfaces.tileentity;
+
+import gregtech.api.recipe.check.SingleRecipeCheck;
+
+/**
+ * Machines implementing this interface can have logic to lock to a single recipe.
+ */
+public interface IRecipeLockable extends RecipeMapWorkable {
+
+ /**
+ * @return if this machine supports single recipe locking.
+ */
+ boolean supportsSingleRecipeLocking();
+
+ /**
+ * @return true if recipe locking is enabled, else false. This is getter is used for displaying the icon in the GUI
+ */
+ boolean isRecipeLockingEnabled();
+
+ void setRecipeLocking(boolean enabled);
+
+ default boolean getDefaultRecipeLockingMode() {
+ return false;
+ }
+
+ default SingleRecipeCheck getSingleRecipeCheck() {
+ return null;
+ }
+
+ default void setSingleRecipeCheck(SingleRecipeCheck recipeCheck) {}
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IRedstoneEmitter.java b/src/main/java/gregtech/api/interfaces/tileentity/IRedstoneEmitter.java
new file mode 100644
index 0000000000..1b280184ce
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IRedstoneEmitter.java
@@ -0,0 +1,52 @@
+package gregtech.api.interfaces.tileentity;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+/**
+ * This File has just internal Information about the Redstone State of a TileEntity
+ */
+public interface IRedstoneEmitter extends IHasWorldObjectAndCoords {
+
+ /**
+ * gets the Redstone Level the TileEntity should emit to the given Output Side
+ *
+ * @param side the {@link ForgeDirection} side
+ * @return the Redstone Level the TileEntity
+ */
+ byte getOutputRedstoneSignal(ForgeDirection side);
+
+ /**
+ * sets the Redstone Level the TileEntity should emit to the given Output Side
+ * <p/>
+ * Do not use this if ICoverable is implemented. ICoverable has @getInternalOutputRedstoneSignal for Machine
+ * internal Output Redstone, so that it doesnt conflict with Cover Redstone. This sets the true Redstone Output
+ * Signal. Only Cover Behaviors should use it, not MetaTileEntities.
+ */
+ void setOutputRedstoneSignal(ForgeDirection side, byte aStrength);
+
+ /**
+ * gets the Redstone Level the TileEntity should emit to the given Output Side
+ */
+ byte getStrongOutputRedstoneSignal(ForgeDirection side);
+
+ /**
+ * sets the Redstone Level the TileEntity should emit to the given Output Side
+ * <p/>
+ * Do not use this if ICoverable is implemented. ICoverable has @getInternalOutputRedstoneSignal for Machine
+ * internal Output Redstone, so that it doesnt conflict with Cover Redstone. This sets the true Redstone Output
+ * Signal. Only Cover Behaviors should use it, not MetaTileEntities.
+ */
+ void setStrongOutputRedstoneSignal(ForgeDirection side, byte aStrength);
+
+ /**
+ * Gets the Output for the comparator on the given Side
+ */
+ byte getComparatorValue(ForgeDirection side);
+
+ /**
+ * Get the redstone output signal strength for a given side
+ */
+ default byte getGeneralRS(ForgeDirection side) {
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IRedstoneReceiver.java b/src/main/java/gregtech/api/interfaces/tileentity/IRedstoneReceiver.java
new file mode 100644
index 0000000000..a41e9aaf7a
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IRedstoneReceiver.java
@@ -0,0 +1,33 @@
+package gregtech.api.interfaces.tileentity;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+/**
+ * This File has just internal Information about the Redstone State of a TileEntity
+ */
+public interface IRedstoneReceiver extends IHasWorldObjectAndCoords {
+
+ /**
+ * gets the Redstone Level of the TileEntity to the given Input Side
+ * <p/>
+ * Do not use this if ICoverable is implemented. ICoverable has @getInternalInputRedstoneSignal for Machine internal
+ * Input Redstone This returns the true incoming Redstone Signal. Only Cover Behaviors should check it, not
+ * MetaTileEntities.
+ */
+ byte getInputRedstoneSignal(ForgeDirection side);
+
+ /**
+ * gets the strongest Redstone Level the TileEntity receives
+ */
+ byte getStrongestRedstone();
+
+ /**
+ * gets if the TileEntity receives Redstone
+ */
+ boolean getRedstone();
+
+ /**
+ * gets if the TileEntity receives Redstone at this Side
+ */
+ boolean getRedstone(ForgeDirection side);
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IRedstoneTileEntity.java b/src/main/java/gregtech/api/interfaces/tileentity/IRedstoneTileEntity.java
new file mode 100644
index 0000000000..1deb5f1d7c
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IRedstoneTileEntity.java
@@ -0,0 +1,17 @@
+package gregtech.api.interfaces.tileentity;
+
+/**
+ * This File has just internal Information about the Redstone State of a TileEntity
+ */
+public interface IRedstoneTileEntity extends IRedstoneEmitter, IRedstoneReceiver {
+
+ /**
+ * enables/disables Redstone Output in general.
+ */
+ void setGenericRedstoneOutput(boolean aOnOff);
+
+ /**
+ * Causes a general Block update. Sends nothing to Client, just causes a Block Update.
+ */
+ void issueBlockUpdate();
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/ITexturedTileEntity.java b/src/main/java/gregtech/api/interfaces/tileentity/ITexturedTileEntity.java
new file mode 100644
index 0000000000..379111b07e
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/ITexturedTileEntity.java
@@ -0,0 +1,14 @@
+package gregtech.api.interfaces.tileentity;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+
+public interface ITexturedTileEntity {
+
+ /**
+ * @return the Textures rendered by the GT Rendering
+ */
+ ITexture[] getTexture(Block aBlock, ForgeDirection side);
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/ITurnable.java b/src/main/java/gregtech/api/interfaces/tileentity/ITurnable.java
new file mode 100644
index 0000000000..64cc8675ef
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/ITurnable.java
@@ -0,0 +1,46 @@
+package gregtech.api.interfaces.tileentity;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+/**
+ * Implemented by all my Machines. However without any security checks, if the Players are even allowed to rotate it.
+ */
+public interface ITurnable {
+
+ /**
+ * Get the block's facing.
+ *
+ * @return front Block facing
+ */
+ ForgeDirection getFrontFacing();
+
+ /**
+ * Set the block's facing
+ *
+ * @param side facing to set the block to
+ */
+ void setFrontFacing(ForgeDirection side);
+
+ /**
+ * Get the block's back facing.
+ *
+ * @return opposite Block facing
+ */
+ ForgeDirection getBackFacing();
+
+ /**
+ * Determine if the wrench can be used to set the block's facing.
+ */
+ boolean isValidFacing(ForgeDirection side);
+
+ /**
+ * Get the list of valid facings
+ */
+ default boolean[] getValidFacings() {
+ final boolean[] validFacings = new boolean[6];
+ for (final ForgeDirection facing : ForgeDirection.VALID_DIRECTIONS) {
+ validFacings[facing.ordinal()] = isValidFacing(facing);
+ }
+ return validFacings;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IUpgradableMachine.java b/src/main/java/gregtech/api/interfaces/tileentity/IUpgradableMachine.java
new file mode 100644
index 0000000000..546ada0c9d
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IUpgradableMachine.java
@@ -0,0 +1,42 @@
+package gregtech.api.interfaces.tileentity;
+
+/**
+ * To access my Machines a bit easier
+ */
+public interface IUpgradableMachine extends IMachineProgress {
+
+ /**
+ * Accepts Upgrades. Some Machines have an Upgrade Limit.
+ */
+ boolean isUpgradable();
+
+ /**
+ * Accepts Muffler Upgrades
+ */
+ boolean isMufflerUpgradable();
+
+ /**
+ * Accepts Steam-Converter Upgrades
+ */
+ boolean isSteamEngineUpgradable();
+
+ /**
+ * Adds Muffler Upgrade
+ */
+ boolean addMufflerUpgrade();
+
+ /**
+ * Adds MJ-Converter Upgrade
+ */
+ boolean addSteamEngineUpgrade();
+
+ /**
+ * Does this Machine have an Muffler
+ */
+ boolean hasMufflerUpgrade();
+
+ /**
+ * Does this Machine have a Steam-Converter
+ */
+ boolean hasSteamEngineUpgrade();
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IVoidable.java b/src/main/java/gregtech/api/interfaces/tileentity/IVoidable.java
new file mode 100644
index 0000000000..841fd07bba
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IVoidable.java
@@ -0,0 +1,89 @@
+package gregtech.api.interfaces.tileentity;
+
+import java.util.List;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.interfaces.fluid.IFluidStore;
+
+/**
+ * Machines implementing this interface can have logic to configure whether to void excess output or not.
+ */
+public interface IVoidable {
+
+ /**
+ * @return if this machine can prevent excess item and fluid from voiding.
+ */
+ boolean supportsVoidProtection();
+
+ default Set<VoidingMode> getAllowedVoidingModes() {
+ return VoidingMode.ALL_OPTIONS;
+ }
+
+ /**
+ * @return if this machine is configured to not void excess item.
+ */
+ default boolean protectsExcessItem() {
+ return supportsVoidProtection() && getVoidingMode().protectItem;
+ }
+
+ /**
+ * @return if this machine is configured to not void excess fluid.
+ */
+ default boolean protectsExcessFluid() {
+ return supportsVoidProtection() && getVoidingMode().protectFluid;
+ }
+
+ VoidingMode getVoidingMode();
+
+ void setVoidingMode(VoidingMode mode);
+
+ default VoidingMode getDefaultVoidingMode() {
+ return supportsVoidProtection() ? VoidingMode.VOID_NONE : VoidingMode.VOID_ALL;
+ }
+
+ /**
+ * @param toOutput List of items this machine is going to output.
+ * @return List of slots available for item outputs. Null element represents empty slot.
+ */
+ List<ItemStack> getItemOutputSlots(ItemStack[] toOutput);
+
+ /**
+ * @param toOutput List of fluids this machine is going to output.
+ * @return List of slots available for fluid outputs.
+ */
+ List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput);
+
+ /**
+ * @return How many slots of items this machine can output per recipe. Item outputs whose slot number
+ * exceeding this limit will be voided.
+ */
+ default int getItemOutputLimit() {
+ return Integer.MAX_VALUE;
+ }
+
+ /**
+ * @return How many slots of fluids this machine can output per recipe. Fluid outputs whose slot number
+ * exceeding this limit will be voided.
+ */
+ default int getFluidOutputLimit() {
+ return Integer.MAX_VALUE;
+ }
+
+ /**
+ * @return If this machine has ability to dump item outputs to ME network.
+ * This doesn't need to check if it can actually dump to ME,
+ * as this might be called every tick and cause lag.
+ */
+ boolean canDumpItemToME();
+
+ /**
+ * @return If this machine has ability to dump fluid outputs to ME network.
+ * This doesn't need to check if it can actually dump to ME,
+ * as this might be called every tick and cause lag.
+ */
+ boolean canDumpFluidToME();
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IWirelessEnergyHatchInformation.java b/src/main/java/gregtech/api/interfaces/tileentity/IWirelessEnergyHatchInformation.java
new file mode 100644
index 0000000000..fa58e5dd54
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/IWirelessEnergyHatchInformation.java
@@ -0,0 +1,17 @@
+package gregtech.api.interfaces.tileentity;
+
+public interface IWirelessEnergyHatchInformation {
+
+ // This interface is solely for usage by wireless hatches/dynamos.
+
+ // Ticks between energy additions to the hatch. For a dynamo this is how many ticks between energy being consumed
+ // and added to the global energy map.
+ long ticks_between_energy_addition = 100L * 20L;
+
+ // Total number of energy additions this multi can store before it is full.
+ long number_of_energy_additions = 4L;
+
+ default long totalStorage(long tier_eu_per_tick) {
+ return tier_eu_per_tick * ticks_between_energy_addition * number_of_energy_additions;
+ }
+}
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/RecipeMapWorkable.java b/src/main/java/gregtech/api/interfaces/tileentity/RecipeMapWorkable.java
new file mode 100644
index 0000000000..7d4db4396c
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/tileentity/RecipeMapWorkable.java
@@ -0,0 +1,49 @@
+package gregtech.api.interfaces.tileentity;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.recipe.RecipeMap;
+
+/**
+ * Machines implementing this interface are capable of executing certain recipes provided by {@link RecipeMap}.
+ * They will also be automatically registered as NEI recipe catalyst for the corresponding recipemaps.
+ */
+public interface RecipeMapWorkable {
+
+ /**
+ * @return RecipeMap this machine currently can execute. In general, it's allowed to be null.
+ */
+ RecipeMap<?> getRecipeMap();
+
+ /**
+ * @return ItemStack form of this machine.
+ */
+ ItemStack getStackForm(long amount);
+
+ /**
+ * If the machine supports multiple recipemaps by switching mode, override this method so that it will be displayed
+ * as NEI recipe catalyst on all the supported recipemaps.
+ *
+ * @return List of possible {@link RecipeMap}s this machine can execute. Must not contain null element.
+ */
+ @Nonnull
+ default Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ RecipeMap<?> recipeMap = getRecipeMap();
+ if (recipeMap != null) {
+ return Collections.singletonList(recipeMap);
+ }
+ return Collections.emptyList();
+ }
+
+ /**
+ * @return Priority for NEI recipe catalyst. Higher priority comes first.
+ */
+ default int getRecipeCatalystPriority() {
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_Block_LongDistancePipe.java b/src/main/java/gregtech/api/items/GT_Block_LongDistancePipe.java
new file mode 100644
index 0000000000..31a44f3dbc
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_Block_LongDistancePipe.java
@@ -0,0 +1,125 @@
+package gregtech.api.items;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Item_LongDistancePipe;
+import gregtech.common.blocks.GT_Material_Machines;
+
+public class GT_Block_LongDistancePipe extends GT_Generic_Block {
+
+ public IIconContainer[] mIcons;
+
+ public GT_Block_LongDistancePipe() {
+ super(GT_Item_LongDistancePipe.class, "gt.block.longdistancepipe", new GT_Material_Machines());
+ setStepSound(soundTypeMetal);
+ setCreativeTab(GregTech_API.TAB_GREGTECH);
+ GregTech_API.registerMachineBlock(this, -1);
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Long Distance Fluid Pipeline Pipe");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Long Distance Item Pipeline Pipe");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + 32767 + ".name", "Any Sub Block of this");
+
+ ItemList.Long_Distance_Pipeline_Fluid_Pipe.set(new ItemStack(this, 1, 0));
+ ItemList.Long_Distance_Pipeline_Item_Pipe.set(new ItemStack(this, 1, 1));
+ mIcons = new IIconContainer[] { Textures.BlockIcons.LONG_DISTANCE_PIPE_FLUID,
+ Textures.BlockIcons.LONG_DISTANCE_PIPE_ITEM };
+ }
+
+ @Override
+ public void onBlockAdded(World aWorld, int aX, int aY, int aZ) {
+ super.onBlockAdded(aWorld, aX, aY, aZ);
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetaData) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ super.breakBlock(aWorld, aX, aY, aZ, aBlock, aMetaData);
+ }
+
+ @Override
+ public String getHarvestTool(int aMeta) {
+ return "wrench";
+ }
+
+ @Override
+ public int getHarvestLevel(int aMeta) {
+ return 2;
+ }
+
+ @Override
+ public float getBlockHardness(World aWorld, int aX, int aY, int aZ) {
+ return Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public float getExplosionResistance(Entity aTNT) {
+ return Blocks.iron_block.getExplosionResistance(aTNT);
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return this.mUnlocalizedName;
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return StatCollector.translateToLocal(this.mUnlocalizedName + ".name");
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return mIcons[aMeta % mIcons.length].getIcon();
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister aIconRegister) {}
+
+ @Override
+ public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) {
+ return false;
+ }
+
+ @Override
+ public int damageDropped(int metadata) {
+ return metadata;
+ }
+
+ @Override
+ public int getDamageValue(World aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlockMetadata(aX, aY, aZ);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ for (int i = 0; i < 3; i++) {
+ ItemStack aStack = new ItemStack(aItem, 1, i);
+ if (!aStack.getDisplayName()
+ .contains(".name")) aList.add(aStack);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_BreederCell_Item.java b/src/main/java/gregtech/api/items/GT_BreederCell_Item.java
new file mode 100644
index 0000000000..3d51415783
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_BreederCell_Item.java
@@ -0,0 +1,147 @@
+package gregtech.api.items;
+
+import static gregtech.api.util.GT_Utility.formatNumbers;
+
+import java.util.List;
+import java.util.function.Supplier;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Utility;
+import ic2.api.reactor.IReactor;
+import ic2.api.reactor.IReactorComponent;
+import ic2.core.IC2Potion;
+
+/**
+ * A {@link ic2.core.item.reactor.ItemReactorLithiumCell}, but can be used to produce anything!
+ *
+ * @author glee8e
+ */
+public class GT_BreederCell_Item extends GT_Generic_Item implements IReactorComponent {
+
+ protected final int mHeatBonusStep;
+ protected final int mHeatBonusMultiplier;
+ protected ItemStack mProduct;
+ protected boolean deflector = false;
+ protected boolean hidden = false;
+ protected boolean neiAdded = false;
+
+ public GT_BreederCell_Item(String aUnlocalized, String aEnglish, String aEnglishTooltip, int aHeatBonusStep,
+ int aHeatBonusMultiplier, int aRequiredPulse, Supplier<ItemStack> aProduct) {
+ super(aUnlocalized, aEnglish, aEnglishTooltip);
+ this.mHeatBonusStep = aHeatBonusStep;
+ this.mHeatBonusMultiplier = aHeatBonusMultiplier;
+ this.setMaxDamage(aRequiredPulse);
+ setNoRepair();
+ GregTech_API.sAfterGTPostload.add(() -> {
+ mProduct = aProduct.get();
+ if (!hidden && !neiAdded) {
+ GT_Values.RA.addIC2ReactorBreederCell(
+ new ItemStack(this),
+ mProduct,
+ deflector,
+ mHeatBonusStep,
+ mHeatBonusMultiplier,
+ getMaxDamage());
+ neiAdded = true;
+ }
+ });
+ }
+
+ public GT_BreederCell_Item setDeflector() {
+ deflector = true;
+ return this;
+ }
+
+ public GT_BreederCell_Item setHidden() {
+ hidden = true;
+ return this;
+ }
+
+ @Override
+ public void onUpdate(ItemStack stack, World world, Entity entity, int slotIndex, boolean isCurrentItem) {
+ if ((entity instanceof EntityLivingBase entityLiving)) {
+ if (!GT_Utility.isWearingFullRadioHazmat(entityLiving)) {
+ IC2Potion.radiation.applyTo(entityLiving, 20, 1);
+ }
+ }
+ }
+
+ @Override
+ public void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
+ aList.add(transItem("019", "Bath with neutron in a hot reactor"));
+ int rDmg = aStack.getItemDamage() * 4 / getMaxDamage();
+ EnumChatFormatting color2 = switch (rDmg) {
+ case 0 -> EnumChatFormatting.DARK_GRAY;
+ case 1, 2 -> EnumChatFormatting.GRAY;
+ default -> EnumChatFormatting.WHITE;
+ };
+ aList.add(
+ String.format(
+ transItem("020", "Progress: %s/%s"),
+ "" + color2 + formatNumbers(aStack.getItemDamage()) + EnumChatFormatting.RESET,
+ "" + formatNumbers(getMaxDamage())));
+ if (aStack.getItemDamage() > 0) aList.add(EnumChatFormatting.RED + transItem("021", "Radiation Hazard"));
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack stack) {
+ return stack.getItemDamage() == 0 ? maxStackSize : 1;
+ }
+
+ @Override
+ public void processChamber(IReactor reactor, ItemStack yourStack, int x, int y, boolean heatrun) {}
+
+ @Override
+ public boolean acceptUraniumPulse(IReactor reactor, ItemStack yourStack, ItemStack pulsingStack, int youX, int youY,
+ int pulseX, int pulseY, boolean heatrun) {
+ if (heatrun) {
+ int myLevel = getNewDamage(reactor, yourStack);
+ if (myLevel >= getMaxDamage()) reactor.setItemAt(youX, youY, mProduct.copy());
+ else yourStack.setItemDamage(myLevel);
+ }
+
+ return deflector;
+ }
+
+ protected int getNewDamage(IReactor reactor, ItemStack stack) {
+ return stack.getItemDamage() + 1 + reactor.getHeat() / mHeatBonusStep * mHeatBonusMultiplier;
+ }
+
+ @Override
+ public boolean canStoreHeat(IReactor reactor, ItemStack yourStack, int x, int y) {
+ return false;
+ }
+
+ @Override
+ public int getMaxHeat(IReactor reactor, ItemStack yourStack, int x, int y) {
+ return 0;
+ }
+
+ @Override
+ public int getCurrentHeat(IReactor reactor, ItemStack yourStack, int x, int y) {
+ return 0;
+ }
+
+ @Override
+ public int alterHeat(IReactor reactor, ItemStack yourStack, int x, int y, int heat) {
+ return heat;
+ }
+
+ @Override
+ public float influenceExplosion(IReactor reactor, ItemStack yourStack) {
+ return 0.0F;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ return 1.0D - (double) stack.getItemDamageForDisplay() / (double) stack.getMaxDamage();
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_CoolantCellIC_Item.java b/src/main/java/gregtech/api/items/GT_CoolantCellIC_Item.java
new file mode 100644
index 0000000000..eb3c6276cf
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_CoolantCellIC_Item.java
@@ -0,0 +1,67 @@
+package gregtech.api.items;
+
+import net.minecraft.item.ItemStack;
+
+import ic2.api.reactor.IReactor;
+import ic2.api.reactor.IReactorComponent;
+
+public class GT_CoolantCellIC_Item extends GT_CoolantCell_Item implements IReactorComponent {
+
+ public GT_CoolantCellIC_Item(String aUnlocalized, String aEnglish, int aMaxStore) {
+ super(aUnlocalized, aEnglish, aMaxStore);
+ }
+
+ @Override
+ public void processChamber(IReactor aReactor, ItemStack aStack, int x, int y, boolean aHeatRun) {}
+
+ @Override
+ public boolean acceptUraniumPulse(IReactor aReactor, ItemStack aStack, ItemStack pulsingStack, int youX, int youY,
+ int pulseX, int pulseY, boolean aHeatRun) {
+ return false;
+ }
+
+ @Override
+ public boolean canStoreHeat(IReactor aReactor, ItemStack aStack, int x, int y) {
+ return !aReactor.isFluidCooled() || getControlTagOfStack(aStack) == 0;
+ }
+
+ @Override
+ public int getMaxHeat(IReactor aReactor, ItemStack aStack, int x, int y) {
+ return this.heatStorage;
+ }
+
+ @Override
+ public int getCurrentHeat(IReactor aReactor, ItemStack aStack, int x, int y) {
+ return getHeatOfStack(aStack);
+ }
+
+ @Override
+ public float influenceExplosion(IReactor aReactor, ItemStack aStack) {
+ return 1.0F + this.heatStorage / 30000.0F;
+ }
+
+ @Override
+ public int alterHeat(IReactor aReactor, ItemStack aStack, int x, int y, int aHeat) {
+ int tHeat = getHeatOfStack(aStack);
+ if ((tHeat == 0) && (getControlTagOfStack(aStack) != 0)) {
+ setControlTagOfStack(aStack, 0);
+ }
+ tHeat += aHeat;
+ if (tHeat > this.heatStorage) {
+ aReactor.setItemAt(x, y, null);
+ aHeat = this.heatStorage - tHeat + 1;
+ } else {
+ if (tHeat < 0) {
+ aHeat = tHeat;
+ tHeat = 0;
+ } else {
+ aHeat = 0;
+ }
+ if ((tHeat > 0) && (getControlTagOfStack(aStack) == 0) && (!aReactor.isFluidCooled())) {
+ setControlTagOfStack(aStack, 1);
+ }
+ setHeatForStack(aStack, tHeat);
+ }
+ return aHeat;
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_CoolantCell_Item.java b/src/main/java/gregtech/api/items/GT_CoolantCell_Item.java
new file mode 100644
index 0000000000..6ed7dae3b0
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_CoolantCell_Item.java
@@ -0,0 +1,82 @@
+package gregtech.api.items;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.GregTech_API;
+import ic2.core.util.StackUtil;
+
+public class GT_CoolantCell_Item extends GT_Generic_Item {
+
+ protected final int heatStorage;
+
+ public GT_CoolantCell_Item(String aUnlocalized, String aEnglish, int aMaxStore) {
+ super(aUnlocalized, aEnglish, null);
+ this.setMaxStackSize(1);
+ this.setMaxDamage(100);
+ setNoRepair();
+ this.heatStorage = aMaxStore;
+ this.setCreativeTab(GregTech_API.TAB_GREGTECH);
+ }
+
+ protected static int getHeatOfStack(ItemStack aStack) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ aStack.setTagCompound(tNBT);
+ }
+ return tNBT.getInteger("heat");
+ }
+
+ protected void setHeatForStack(ItemStack aStack, int aHeat) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ aStack.setTagCompound(tNBT);
+ }
+ tNBT.setInteger("heat", aHeat);
+ if (this.heatStorage > 0) {
+ double heatRatio = (double) aHeat / (double) this.heatStorage;
+ int damage = (int) (aStack.getMaxDamage() * heatRatio);
+ if (damage >= aStack.getMaxDamage()) {
+ damage = aStack.getMaxDamage() - 1;
+ }
+ aStack.setItemDamage(damage);
+ }
+ }
+
+ @Override
+ public void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
+ super.addAdditionalToolTips(aList, aStack, aPlayer);
+ int rHeat = getHeatOfStack(aStack) * 10 / this.heatStorage;
+ EnumChatFormatting color = switch (rHeat) {
+ case 0 -> EnumChatFormatting.BLUE;
+ case 1, 2 -> EnumChatFormatting.GREEN;
+ case 3, 4, 5, 6 -> EnumChatFormatting.YELLOW;
+ case 7, 8 -> EnumChatFormatting.RED;
+ default -> EnumChatFormatting.DARK_RED;
+ };
+ aList.add(
+ EnumChatFormatting.WHITE
+ + String.format(transItem("000", "Stored Heat: %s"), "" + color + getHeatOfStack(aStack)));
+ if (getControlTagOfStack(aStack) == 1) {
+ aList.add(StatCollector.translateToLocal("ic2.reactoritem.heatwarning.line1"));
+ aList.add(StatCollector.translateToLocal("ic2.reactoritem.heatwarning.line2"));
+ }
+ }
+
+ public int getControlTagOfStack(ItemStack stack) {
+ NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack);
+ return nbtData.getInteger("tag");
+ }
+
+ public void setControlTagOfStack(ItemStack stack, int tag) {
+ NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack);
+ nbtData.setInteger("tag", tag);
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java b/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java
new file mode 100644
index 0000000000..9c7b7c173c
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java
@@ -0,0 +1,340 @@
+package gregtech.api.items;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemArmor;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+import net.minecraftforge.common.ISpecialArmor;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.living.LivingFallEvent;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+
+public class GT_EnergyArmor_Item extends ItemArmor implements ISpecialArmor {
+
+ public static Map<EntityPlayer, Float> jumpChargeMap = new ConcurrentHashMap<>();
+ public int mCharge, mTransfer, mTier, mDamageEnergyCost, mSpecials;
+ public boolean mChargeProvider;
+ public double mArmorAbsorbtionPercentage;
+
+ public GT_EnergyArmor_Item(int aID, String aUnlocalized, String aEnglish, int aCharge, int aTransfer, int aTier,
+ int aDamageEnergyCost, int aSpecials, double aArmorAbsorbtionPercentage, boolean aChargeProvider, int aType,
+ int aArmorIndex) {
+ super(ArmorMaterial.DIAMOND, aArmorIndex, aType);
+ setMaxStackSize(1);
+ setMaxDamage(100);
+ setNoRepair();
+ setUnlocalizedName(aUnlocalized);
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".name", aEnglish);
+ mCharge = Math.max(1, aCharge);
+ mTransfer = Math.max(1, aTransfer);
+ mTier = Math.max(1, aTier);
+ mSpecials = aSpecials;
+ mChargeProvider = aChargeProvider;
+ mDamageEnergyCost = Math.max(0, aDamageEnergyCost);
+ mArmorAbsorbtionPercentage = aArmorAbsorbtionPercentage;
+
+ setCreativeTab(GregTech_API.TAB_GREGTECH);
+
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ private static void setCharge(ItemStack aStack) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) tNBT = new NBTTagCompound();
+ tNBT.setInteger("charge", 1000000000);
+ aStack.setTagCompound(tNBT);
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ ItemStack tStack = aPlayer.inventory.armorInventory[3 - armorType];
+ if (tStack != null) {
+ for (int i = 0; i < 9; i++) {
+ if (aPlayer.inventory.mainInventory[i] == aStack) {
+ aPlayer.inventory.armorInventory[3 - armorType] = aPlayer.inventory.mainInventory[i];
+ aPlayer.inventory.mainInventory[i] = tStack;
+ return tStack;
+ }
+ }
+ }
+ return super.onItemRightClick(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aIconRegister) {
+ this.itemIcon = aIconRegister.registerIcon(GregTech.getResourcePath(getUnlocalizedName()));
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ aList.add("Tier: " + mTier);
+ if ((mSpecials & 1) != 0) aList.add("Rebreather");
+ if ((mSpecials & 2) != 0) aList.add("Inertia Damper");
+ if ((mSpecials & 4) != 0) aList.add("Food Replicator");
+ if ((mSpecials & 8) != 0) aList.add("Medicine Module");
+ if ((mSpecials & 16) != 0) aList.add("Lamp");
+ if ((mSpecials & 32) != 0) aList.add("Solarpanel");
+ if ((mSpecials & 64) != 0) aList.add("Extinguisher Module");
+ if ((mSpecials & 128) != 0) aList.add("Jump Booster");
+ if ((mSpecials & 256) != 0) aList.add("Speed Booster");
+ if ((mSpecials & 512) != 0) aList.add("Invisibility Field");
+ if ((mSpecials & 1024) != 0) aList.add("Infinite Charge");
+ }
+
+ @Override
+ public void onArmorTick(World aWorld, EntityPlayer aPlayer, ItemStack aStack) {
+ if (mSpecials == 0) return;
+
+ if (!aPlayer.worldObj.isRemote && (mSpecials & 1) != 0) {
+ int airSupply = aPlayer.getAir();
+ if (GT_ModHandler.canUseElectricItem(aStack, 1000) && airSupply < 50) {
+ aPlayer.setAir(airSupply + 250);
+ GT_ModHandler.useElectricItem(aStack, 1000, aPlayer);
+ }
+ }
+
+ if (!aPlayer.worldObj.isRemote && (mSpecials & 4) != 0) {
+ if (GT_ModHandler.canUseElectricItem(aStack, 50000) && aPlayer.getFoodStats()
+ .needFood()) {
+ aPlayer.getFoodStats()
+ .addStats(1, 0.0F);
+ GT_ModHandler.useElectricItem(aStack, 50000, aPlayer);
+ }
+ }
+
+ if ((mSpecials & 8) != 0) {
+ if (GT_ModHandler.canUseElectricItem(aStack, 10000) && aPlayer.isPotionActive(Potion.poison)) {
+ GT_Utility.removePotion(aPlayer, Potion.poison.id);
+ GT_ModHandler.useElectricItem(aStack, 10000, aPlayer);
+ }
+ if (GT_ModHandler.canUseElectricItem(aStack, 100000) && aPlayer.isPotionActive(Potion.wither)) {
+ GT_Utility.removePotion(aPlayer, Potion.wither.id);
+ GT_ModHandler.useElectricItem(aStack, 100000, aPlayer);
+ }
+ }
+
+ if ((mSpecials & 64) != 0) {
+ aPlayer.setFire(0);
+ }
+
+ if (!aPlayer.worldObj.isRemote && (mSpecials & 128) != 0) {
+ float jumpCharge = jumpChargeMap.getOrDefault(aPlayer, 1.0F);
+
+ if (GT_ModHandler.canUseElectricItem(aStack, 1000) && aPlayer.onGround && jumpCharge < 1.0F) {
+ jumpCharge = 1.0F;
+ GT_ModHandler.useElectricItem(aStack, 1000, aPlayer);
+ }
+
+ if (aPlayer.motionY >= 0.0D && jumpCharge > 0.0F && !aPlayer.isInWater()) {
+ if (GT_ModHandler.getJumpKeyDown(aPlayer) && GT_ModHandler.getBoostKeyDown(aPlayer)) {
+ if (jumpCharge == 1.0F) {
+ aPlayer.motionX *= 3.5D;
+ aPlayer.motionZ *= 3.5D;
+ }
+
+ aPlayer.motionY += (jumpCharge * 0.3F);
+ jumpCharge = (float) (jumpCharge * 0.75D);
+ } else if (jumpCharge < 1.0F) {
+ jumpCharge = 0.0F;
+ }
+ }
+
+ jumpChargeMap.put(aPlayer, jumpCharge);
+ }
+
+ if ((mSpecials & 256) != 0) {
+ if (GT_ModHandler.canUseElectricItem(aStack, 100) && aPlayer.isSprinting()
+ && (aPlayer.onGround && Math.abs(aPlayer.motionX) + Math.abs(aPlayer.motionZ) > 0.10000000149011612D
+ || aPlayer.isInWater())) {
+ GT_ModHandler.useElectricItem(aStack, 100, aPlayer);
+ float bonus = 0.22F;
+
+ if (aPlayer.isInWater()) {
+ GT_ModHandler.useElectricItem(aStack, 100, aPlayer);
+ bonus = 0.1F;
+
+ if (aPlayer.motionY > 0) {
+ aPlayer.motionY += 0.10000000149011612D;
+ }
+ }
+
+ aPlayer.moveFlying(0.0F, 1.0F, bonus);
+ }
+ }
+
+ if ((mSpecials & 512) != 0) {
+ if (GT_ModHandler.canUseElectricItem(aStack, 10000)) {
+ GT_ModHandler.useElectricItem(aStack, 10000, aPlayer);
+ aPlayer.addPotionEffect(new PotionEffect(Potion.invisibility.getId(), 25, 1, true));
+ }
+ }
+
+ if (!aPlayer.worldObj.isRemote && (mSpecials & (16 | 32)) != 0) {
+ // if (GregTech_API.sWorldTickCounter%20==0) {
+ ItemStack tTargetChargeItem = aStack, tTargetDechargeItem = aStack;
+
+ if (GT_ModHandler.chargeElectricItem(tTargetChargeItem, 1, Integer.MAX_VALUE, true, true) < 1) {
+ tTargetChargeItem = aPlayer.inventory.armorInventory[2];
+ }
+ if (GT_ModHandler.dischargeElectricItem(tTargetDechargeItem, 10, Integer.MAX_VALUE, true, true, true)
+ < 10) {
+ tTargetDechargeItem = aPlayer.inventory.armorInventory[2];
+ }
+
+ if (tTargetChargeItem == null || !GT_ModHandler.isElectricItem(tTargetChargeItem)) {
+ tTargetChargeItem = null;
+ }
+
+ if (aPlayer.worldObj.isDaytime() && aPlayer.worldObj.canBlockSeeTheSky(
+ MathHelper.floor_double(aPlayer.posX),
+ MathHelper.floor_double(aPlayer.posY + 1),
+ MathHelper.floor_double(aPlayer.posZ))) {
+ if ((mSpecials & 32) != 0 && tTargetChargeItem != null) {
+ GT_ModHandler.chargeElectricItem(tTargetChargeItem, 20, Integer.MAX_VALUE, true, false);
+ }
+ } else {
+ /*
+ * TODO: if ((mSpecials & 16) != 0 && tTargetDechargeItem != null &&
+ * GT_ModHandler.canUseElectricItem(tTargetDechargeItem, 10)) { if (aPlayer.worldObj.getBlock
+ * ((int)aPlayer.posX, (int)aPlayer.posY+1, (int)aPlayer.posZ) == Blocks.air) aPlayer.worldObj.setBlock
+ * ((int)aPlayer.posX, (int)aPlayer.posY+1, (int)aPlayer.posZ, GregTech_API.sBlockList[3]);
+ * GT_ModHandler.useElectricItem(tTargetDechargeItem, 10, aPlayer); }
+ */
+ // }
+ }
+ }
+ }
+
+ @Override
+ public boolean getShareTag() {
+ return true;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item aItem, CreativeTabs creativeTab, List<ItemStack> outputSubItems) {
+ ItemStack tCharged = new ItemStack(this, 1), tUncharged = new ItemStack(this, 1, getMaxDamage());
+ GT_ModHandler.chargeElectricItem(tCharged, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false);
+ outputSubItems.add(tCharged);
+ outputSubItems.add(tUncharged);
+ }
+
+ public boolean canProvideEnergy(ItemStack aStack) {
+ if ((mSpecials & 1024) != 0) setCharge(aStack);
+ return mChargeProvider;
+ }
+
+ public Item getChargedItem(ItemStack aStack) {
+ if ((mSpecials & 1024) != 0) setCharge(aStack);
+ return this;
+ }
+
+ public Item getEmptyItem(ItemStack aStack) {
+ if ((mSpecials & 1024) != 0) setCharge(aStack);
+ return this;
+ }
+
+ public int getMaxCharge(ItemStack aStack) {
+ if ((mSpecials & 1024) != 0) setCharge(aStack);
+ return mCharge;
+ }
+
+ public int getTier(ItemStack aStack) {
+ if ((mSpecials & 1024) != 0) setCharge(aStack);
+ return mTier;
+ }
+
+ public int getTransferLimit(ItemStack aStack) {
+ if ((mSpecials & 1024) != 0) setCharge(aStack);
+ return mTransfer;
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack ingredient, ItemStack bookEnchant) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack toBeRepaired, ItemStack repairWith) {
+ return false;
+ }
+
+ // TODO: @ForgeSubscribe
+ public void onEntityLivingFallEvent(LivingFallEvent event) {
+ if (!event.entity.worldObj.isRemote && event.entity instanceof EntityPlayer player) {
+ for (int i = 0; i < 4; i++) {
+ ItemStack armor = player.inventory.armorInventory[i];
+ if (armor != null && armor.getItem() == this && (mSpecials & 2) != 0) {
+ int distanceFactor = (int) event.distance - 3;
+ int energyCost = (this.mDamageEnergyCost * distanceFactor) / 4;
+ if (energyCost <= GT_ModHandler
+ .dischargeElectricItem(armor, Integer.MAX_VALUE, Integer.MAX_VALUE, true, true, true)) {
+ GT_ModHandler.dischargeElectricItem(armor, energyCost, Integer.MAX_VALUE, true, false, true);
+ event.setCanceled(true);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public ISpecialArmor.ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source,
+ double damage, int slotIndex) {
+ return new ISpecialArmor.ArmorProperties(
+ (source == DamageSource.fall && (mSpecials & 2) != 0) ? 10 : 0,
+ getBaseAbsorptionRatio() * mArmorAbsorbtionPercentage,
+ mDamageEnergyCost > 0 ? 25
+ * GT_ModHandler.dischargeElectricItem(armor, Integer.MAX_VALUE, Integer.MAX_VALUE, true, true, true)
+ / mDamageEnergyCost : 0);
+ }
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slotIndex) {
+ return (int) Math.round(20.0D * getBaseAbsorptionRatio() * mArmorAbsorbtionPercentage);
+ }
+
+ @Override
+ public void damageArmor(EntityLivingBase entity, ItemStack itemStack, DamageSource source, int damage,
+ int slotIndex) {
+ GT_ModHandler
+ .dischargeElectricItem(itemStack, damage * mDamageEnergyCost, Integer.MAX_VALUE, true, false, true);
+ }
+
+ private double getBaseAbsorptionRatio() {
+ if (mArmorAbsorbtionPercentage <= 0) return 0.00;
+ return switch (this.armorType) {
+ case 0, 3 -> 0.15;
+ case 1 -> 0.40;
+ case 2 -> 0.30;
+ default -> 0.00;
+ };
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_Generic_Block.java b/src/main/java/gregtech/api/items/GT_Generic_Block.java
new file mode 100644
index 0000000000..7aaef6d5ca
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_Generic_Block.java
@@ -0,0 +1,22 @@
+package gregtech.api.items;
+
+import static gregtech.api.enums.GT_Values.W;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.item.ItemBlock;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.util.GT_LanguageManager;
+
+public class GT_Generic_Block extends Block {
+
+ protected final String mUnlocalizedName;
+
+ protected GT_Generic_Block(Class<? extends ItemBlock> aItemClass, String aName, Material aMaterial) {
+ super(aMaterial);
+ setBlockName(mUnlocalizedName = aName);
+ GameRegistry.registerBlock(this, aItemClass, getUnlocalizedName());
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + W + ".name", "Any Sub Block of this one");
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_Generic_Item.java b/src/main/java/gregtech/api/items/GT_Generic_Item.java
new file mode 100644
index 0000000000..a1e01c92c7
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_Generic_Item.java
@@ -0,0 +1,167 @@
+package gregtech.api.items;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.List;
+
+import net.minecraft.block.BlockDispenser;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.dispenser.BehaviorDefaultDispenseItem;
+import net.minecraft.dispenser.BehaviorProjectileDispense;
+import net.minecraft.dispenser.IBlockSource;
+import net.minecraft.dispenser.IPosition;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.IProjectile;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SubTag;
+import gregtech.api.interfaces.IProjectileItem;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * Extended by most Items, also used as a fallback Item, to prevent the accidental deletion when Errors occur.
+ */
+public class GT_Generic_Item extends Item implements IProjectileItem {
+
+ private final String mName, mTooltip;
+ protected IIcon mIcon;
+
+ public GT_Generic_Item(String aUnlocalized, String aEnglish, String aEnglishTooltip) {
+ super();
+ mName = "gt." + aUnlocalized;
+ GT_LanguageManager.addStringLocalization(mName + ".name", aEnglish);
+ if (GT_Utility.isStringValid(aEnglishTooltip))
+ GT_LanguageManager.addStringLocalization(mTooltip = mName + ".tooltip_main", aEnglishTooltip);
+ else mTooltip = null;
+ setCreativeTab(GregTech_API.TAB_GREGTECH);
+ GameRegistry.registerItem(this, mName, GregTech.ID);
+ BlockDispenser.dispenseBehaviorRegistry.putObject(this, new GT_Item_Dispense());
+ }
+
+ @Override
+ public final Item setUnlocalizedName(String aName) {
+ return this;
+ }
+
+ @Override
+ public final String getUnlocalizedName() {
+ return mName;
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack aStack) {
+ return getHasSubtypes() ? mName + "." + getDamage(aStack) : mName;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aIconRegister) {
+ mIcon = aIconRegister.registerIcon(GregTech.getResourcePath(GT_Config.troll ? "troll" : mName));
+ }
+
+ @Override
+ public boolean doesSneakBypassUse(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int aMetaData) {
+ return mIcon;
+ }
+
+ public int getTier(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ if (getMaxDamage() > 0 && !getHasSubtypes())
+ aList.add((aStack.getMaxDamage() - getDamage(aStack)) + " / " + aStack.getMaxDamage());
+ if (mTooltip != null) aList.add(GT_LanguageManager.getTranslation(mTooltip));
+ if (GT_ModHandler.isElectricItem(aStack)) aList.add("Tier: " + getTier(aStack));
+ addAdditionalToolTips(aList, aStack, aPlayer);
+ }
+
+ protected void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
+ //
+ }
+
+ @Override
+ public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ isItemStackUsable(aStack);
+ }
+
+ public boolean isItemStackUsable(ItemStack aStack) {
+ return true;
+ }
+
+ public ItemStack onDispense(IBlockSource aSource, ItemStack aStack) {
+ EnumFacing enumfacing = BlockDispenser.func_149937_b(aSource.getBlockMetadata());
+ IPosition iposition = BlockDispenser.func_149939_a(aSource);
+ ItemStack itemstack1 = aStack.splitStack(1);
+ BehaviorDefaultDispenseItem.doDispense(aSource.getWorld(), itemstack1, 6, enumfacing, iposition);
+ return aStack;
+ }
+
+ @Override
+ public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, double aX, double aY,
+ double aZ) {
+ return null;
+ }
+
+ @Override
+ public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, EntityLivingBase aEntity,
+ float aSpeed) {
+ return null;
+ }
+
+ @Override
+ public boolean hasProjectile(SubTag aProjectileType, ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public ItemStack getContainerItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public boolean hasContainerItem(ItemStack aStack) {
+ return getContainerItem(aStack) != null;
+ }
+
+ @Deprecated
+ public String trans(String aKey, String aEnglish) {
+ return transItem(aKey, aEnglish);
+ }
+
+ public String transItem(String aKey, String aEnglish) {
+ return GT_LanguageManager.addStringLocalization("Item_DESCRIPTION_Index_" + aKey, aEnglish);
+ }
+
+ public static class GT_Item_Dispense extends BehaviorProjectileDispense {
+
+ @Override
+ public ItemStack dispenseStack(IBlockSource aSource, ItemStack aStack) {
+ return ((GT_Generic_Item) aStack.getItem()).onDispense(aSource, aStack);
+ }
+
+ @Override
+ protected IProjectile getProjectileEntity(World aWorld, IPosition aPosition) {
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_MetaBase_Item.java b/src/main/java/gregtech/api/items/GT_MetaBase_Item.java
new file mode 100644
index 0000000000..481c0b5a08
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_MetaBase_Item.java
@@ -0,0 +1,622 @@
+package gregtech.api.items;
+
+import static gregtech.api.enums.GT_Values.D1;
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.dispenser.IBlockSource;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.inventory.Container;
+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.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+
+import gregtech.api.enums.SubTag;
+import gregtech.api.interfaces.IItemBehaviour;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import ic2.api.item.ElectricItem;
+import ic2.api.item.IElectricItem;
+import ic2.api.item.IElectricItemManager;
+import ic2.api.item.ISpecialElectricItem;
+
+public abstract class GT_MetaBase_Item extends GT_Generic_Item
+ implements ISpecialElectricItem, IElectricItemManager, IFluidContainerItem {
+
+ /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */
+ private final ConcurrentHashMap<Short, ArrayList<IItemBehaviour<GT_MetaBase_Item>>> mItemBehaviors = new ConcurrentHashMap<>();
+
+ /**
+ * Creates the Item using these Parameters.
+ *
+ * @param aUnlocalized The Unlocalized Name of this Item.
+ */
+ public GT_MetaBase_Item(String aUnlocalized) {
+ super(aUnlocalized, "Generated Item", null);
+ setHasSubtypes(true);
+ setMaxDamage(0);
+ }
+
+ /**
+ * Adds a special Item Behaviour to the Item.
+ * <p/>
+ * Note: the boolean Behaviours sometimes won't be executed if another boolean Behaviour returned true before.
+ *
+ * @param aMetaValue the Meta Value of the Item you want to add it to. [0 - 32765]
+ * @param aBehavior the Click Behavior you want to add.
+ * @return the Item itself for convenience in constructing.
+ */
+ public final GT_MetaBase_Item addItemBehavior(int aMetaValue, IItemBehaviour<GT_MetaBase_Item> aBehavior) {
+ if (aMetaValue < 0 || aMetaValue >= 32766 || aBehavior == null) return this;
+ ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors
+ .computeIfAbsent((short) aMetaValue, k -> new ArrayList<>(1));
+ tList.add(aBehavior);
+ return this;
+ }
+
+ public abstract Long[] getElectricStats(ItemStack aStack);
+
+ public abstract Long[] getFluidContainerStats(ItemStack aStack);
+
+ @Override
+ public boolean hasProjectile(SubTag aProjectileType, ItemStack aStack) {
+ ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short) getDamage(aStack));
+ if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList)
+ if (tBehavior.hasProjectile(this, aProjectileType, aStack)) return true;
+ return super.hasProjectile(aProjectileType, aStack);
+ }
+
+ @Override
+ public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, double aX, double aY,
+ double aZ) {
+ ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short) getDamage(aStack));
+ if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) {
+ EntityArrow rArrow = tBehavior.getProjectile(this, aProjectileType, aStack, aWorld, aX, aY, aZ);
+ if (rArrow != null) return rArrow;
+ }
+ return super.getProjectile(aProjectileType, aStack, aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, EntityLivingBase aEntity,
+ float aSpeed) {
+ ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short) getDamage(aStack));
+ if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) {
+ EntityArrow rArrow = tBehavior.getProjectile(this, aProjectileType, aStack, aWorld, aEntity, aSpeed);
+ if (rArrow != null) return rArrow;
+ }
+ return super.getProjectile(aProjectileType, aStack, aWorld, aEntity, aSpeed);
+ }
+
+ @Override
+ public ItemStack onDispense(IBlockSource aSource, ItemStack aStack) {
+ ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short) getDamage(aStack));
+ if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList)
+ if (tBehavior.canDispense(this, aSource, aStack)) return tBehavior.onDispense(this, aSource, aStack);
+ return super.onDispense(aSource, aStack);
+ }
+
+ @Override
+ public boolean isItemStackUsable(ItemStack aStack) {
+ ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short) getDamage(aStack));
+ if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList)
+ if (!tBehavior.isItemStackUsable(this, aStack)) return false;
+ return super.isItemStackUsable(aStack);
+ }
+
+ @Override
+ public boolean onLeftClickEntity(ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) {
+ use(aStack, 0, aPlayer);
+ isItemStackUsable(aStack);
+ ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short) getDamage(aStack));
+ try {
+ if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList)
+ if (tBehavior.onLeftClickEntity(this, aStack, aPlayer, aEntity)) {
+ if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem();
+ return true;
+ }
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ return false;
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onItemUse(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ int ordinalSide, float hitX, float hitY, float hitZ) {
+ use(aStack, 0, aPlayer);
+ isItemStackUsable(aStack);
+ ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short) getDamage(aStack));
+ try {
+ if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList)
+ if (tBehavior.onItemUse(this, aStack, aPlayer, aWorld, aX, aY, aZ, ordinalSide, hitX, hitY, hitZ)) {
+ if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem();
+ return true;
+ }
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ return false;
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onItemUseFirst(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ int ordinalSide, float hitX, float hitY, float hitZ) {
+ use(aStack, 0, aPlayer);
+ isItemStackUsable(aStack);
+ ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short) getDamage(aStack));
+ try {
+ if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) if (tBehavior.onItemUseFirst(
+ this,
+ aStack,
+ aPlayer,
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ ForgeDirection.getOrientation(ordinalSide),
+ hitX,
+ hitY,
+ hitZ)) {
+ if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem();
+ return true;
+ }
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ return false;
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return false;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ use(aStack, 0, aPlayer);
+ isItemStackUsable(aStack);
+ ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short) getDamage(aStack));
+ try {
+ if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList)
+ aStack = tBehavior.onItemRightClick(this, aStack, aWorld, aPlayer);
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return aStack;
+ }
+
+ @Override
+ public final void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ String tKey = getUnlocalizedName(aStack) + ".tooltip";
+ String[] tStrings = GT_LanguageManager.getTranslation(tKey)
+ .split("/n ");
+ for (String tString : tStrings)
+ if (GT_Utility.isStringValid(tString) && !tKey.equals(tString)) aList.add(tString);
+
+ Long[] tStats = getElectricStats(aStack);
+ if (tStats != null) {
+ if (tStats[3] > 0) {
+ aList.add(
+ EnumChatFormatting.AQUA + String.format(
+ transItem("009", "Contains %s EU Tier: %s"),
+ formatNumbers(tStats[3]),
+ "" + (tStats[2] >= 0 ? tStats[2] : 0)) + EnumChatFormatting.GRAY);
+ } else {
+ long tCharge = getRealCharge(aStack);
+ if (tStats[3] == -2 && tCharge <= 0) {
+ aList.add(
+ EnumChatFormatting.AQUA + transItem("010", "Empty. You should recycle it properly.")
+ + EnumChatFormatting.GRAY);
+ } else {
+ aList.add(
+ EnumChatFormatting.AQUA
+ + String.format(
+ transItem("011", "%s / %s EU - Voltage: %s"),
+ formatNumbers(tCharge),
+ formatNumbers(Math.abs(tStats[0])),
+ "" + V[(int) (tStats[2] >= 0 ? tStats[2] < V.length ? tStats[2] : V.length - 1 : 1)])
+ + EnumChatFormatting.GRAY);
+ }
+ }
+ }
+
+ tStats = getFluidContainerStats(aStack);
+ if (tStats != null && tStats[0] > 0) {
+ FluidStack tFluid = getFluidContent(aStack);
+ aList.add(
+ EnumChatFormatting.BLUE + ((tFluid == null ? transItem("012", "No Fluids Contained")
+ : GT_Utility.getFluidName(tFluid, true))) + EnumChatFormatting.GRAY);
+ aList.add(
+ EnumChatFormatting.BLUE + String.format(
+ transItem("013", "%sL / %sL"),
+ "" + (tFluid == null ? 0 : formatNumbers(tFluid.amount)),
+ "" + formatNumbers(tStats[0])) + EnumChatFormatting.GRAY);
+ }
+
+ ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short) getDamage(aStack));
+ if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList)
+ aList = tBehavior.getAdditionalToolTips(this, aList, aStack);
+
+ addAdditionalToolTips(aList, aStack, aPlayer);
+ }
+
+ @Override
+ public void onUpdate(ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, boolean aIsInHand) {
+ ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short) getDamage(aStack));
+ if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList)
+ tBehavior.onUpdate(this, aStack, aWorld, aPlayer, aTimer, aIsInHand);
+ }
+
+ @Override
+ public final boolean canProvideEnergy(ItemStack aStack) {
+ Long[] tStats = getElectricStats(aStack);
+ if (tStats == null) return false;
+ return tStats[3] > 0 || (aStack.stackSize == 1 && (tStats[3] == -2 || tStats[3] == -3));
+ }
+
+ @Override
+ public final double getMaxCharge(ItemStack aStack) {
+ Long[] tStats = getElectricStats(aStack);
+ if (tStats == null) return 0;
+ return Math.abs(tStats[0]);
+ }
+
+ @Override
+ public final double getTransferLimit(ItemStack aStack) {
+ Long[] tStats = getElectricStats(aStack);
+ if (tStats == null) return 0;
+ return Math.max(tStats[1], tStats[3]);
+ }
+
+ @Override
+ public final double charge(ItemStack aStack, double aCharge, int aTier, boolean aIgnoreTransferLimit,
+ boolean aSimulate) {
+ Long[] tStats = getElectricStats(aStack);
+ if (tStats == null || tStats[2] > aTier
+ || !(tStats[3] == -1 || tStats[3] == -3 || (tStats[3] < 0 && aCharge == Integer.MAX_VALUE))
+ || aStack.stackSize != 1) return 0;
+ long tTransfer = aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge);
+ long tChargeBefore = getRealCharge(aStack), tNewCharge = Math.min(
+ Math.abs(tStats[0]),
+ Long.MAX_VALUE - tTransfer >= tChargeBefore ? tChargeBefore + tTransfer : Long.MAX_VALUE);
+ if (!aSimulate) setCharge(aStack, tNewCharge);
+ return tNewCharge - tChargeBefore;
+ }
+
+ @Override
+ public final double discharge(ItemStack aStack, double aCharge, int aTier, boolean aIgnoreTransferLimit,
+ boolean aBatteryAlike, boolean aSimulate) {
+ Long[] tStats = getElectricStats(aStack);
+ if (tStats == null || tStats[2] > aTier) return 0;
+ if (aBatteryAlike && !canProvideEnergy(aStack)) return 0;
+ if (tStats[3] > 0) {
+ if (aCharge < tStats[3] || aStack.stackSize < 1) return 0;
+ if (!aSimulate) aStack.stackSize--;
+ return tStats[3];
+ }
+ long tChargeBefore = getRealCharge(aStack), tNewCharge = Math
+ .max(0, tChargeBefore - (aIgnoreTransferLimit ? (long) aCharge : Math.min(tStats[1], (long) aCharge)));
+ if (!aSimulate) setCharge(aStack, tNewCharge);
+ return tChargeBefore - tNewCharge;
+ }
+
+ @Override
+ public final double getCharge(ItemStack aStack) {
+ return getRealCharge(aStack);
+ }
+
+ @Override
+ public final boolean canUse(ItemStack aStack, double aAmount) {
+ return getRealCharge(aStack) >= aAmount;
+ }
+
+ @Override
+ public final boolean use(ItemStack aStack, double aAmount, EntityLivingBase aPlayer) {
+ chargeFromArmor(aStack, aPlayer);
+ if (aPlayer instanceof EntityPlayer && ((EntityPlayer) aPlayer).capabilities.isCreativeMode) return true;
+ double tTransfer = discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, true);
+ if (Math.abs(tTransfer - aAmount) < .0000001) {
+ discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false);
+ chargeFromArmor(aStack, aPlayer);
+ return true;
+ }
+ discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false);
+ chargeFromArmor(aStack, aPlayer);
+ return false;
+ }
+
+ @Override
+ public final void chargeFromArmor(ItemStack aStack, EntityLivingBase aPlayer) {
+ if (aPlayer == null || aPlayer.worldObj.isRemote) return;
+ for (int i = 1; i < 5; i++) {
+ ItemStack tArmor = aPlayer.getEquipmentInSlot(i);
+ if (GT_ModHandler.isElectricItem(tArmor)) {
+ IElectricItem tArmorItem = (IElectricItem) tArmor.getItem();
+ if (tArmorItem.canProvideEnergy(tArmor) && tArmorItem.getTier(tArmor) >= getTier(aStack)) {
+ double tCharge = ElectricItem.manager.discharge(
+ tArmor,
+ charge(aStack, Integer.MAX_VALUE - 1, Integer.MAX_VALUE, true, true),
+ Integer.MAX_VALUE,
+ true,
+ true,
+ false);
+ if (tCharge > 0) {
+ charge(aStack, tCharge, Integer.MAX_VALUE, true, false);
+ if (aPlayer instanceof EntityPlayer) {
+ Container tContainer = ((EntityPlayer) aPlayer).openContainer;
+ if (tContainer != null) tContainer.detectAndSendChanges();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * @Override public final int getMaxCharge(ItemStack aStack) { Long[] tStats = getElectricStats(aStack); if (tStats
+ * == null) return 0; return (int)Math.abs(tStats[0]); }
+ * @Override public final int getTransferLimit(ItemStack aStack) { Long[] tStats = getElectricStats(aStack); if
+ * (tStats == null) return 0; return (int)Math.max(tStats[1], tStats[3]); }
+ * @Override public final int charge(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreTransferLimit, boolean
+ * aSimulate) { Long[] tStats = getElectricStats(aStack); if (tStats == null || tStats[2] > aTier || !(tStats[3] ==
+ * -1 || tStats[3] == -3 || (tStats[3] < 0 && aCharge == Integer.MAX_VALUE)) || aStack.stackSize != 1) return 0;
+ * long tChargeBefore = getRealCharge(aStack), tNewCharge =
+ * aCharge==Integer.MAX_VALUE?Long.MAX_VALUE:Math.min(Math.abs(tStats[0]), tChargeBefore +
+ * (aIgnoreTransferLimit?aCharge:Math.min(tStats[1], aCharge))); if (!aSimulate) setCharge(aStack, tNewCharge);
+ * return (int)(tNewCharge-tChargeBefore); }
+ * @Override public final int discharge(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreTransferLimit,
+ * boolean aSimulate) { Long[] tStats = getElectricStats(aStack); if (tStats == null || tStats[2] > aTier) return 0;
+ * if (tStats[3] > 0) { if (aCharge < tStats[3] || aStack.stackSize < 1) return 0; if (!aSimulate)
+ * aStack.stackSize--; return (int)(long)tStats[3]; } long tChargeBefore = getRealCharge(aStack), tNewCharge =
+ * Math.max(0, tChargeBefore - (aIgnoreTransferLimit?aCharge:Math.min(tStats[1], aCharge))); if (!aSimulate)
+ * setCharge(aStack, tNewCharge); return (int)(tChargeBefore-tNewCharge); }
+ * @Override public final int getCharge(ItemStack aStack) { return (int)Math.min(Integer.MAX_VALUE,
+ * getRealCharge(aStack)); }
+ * @Override public final boolean canUse(ItemStack aStack, int aAmount) { return getRealCharge(aStack) >= aAmount; }
+ * @Override public final boolean use(ItemStack aStack, int aAmount, EntityLivingBase aPlayer) {
+ * chargeFromArmor(aStack, aPlayer); if (aPlayer instanceof EntityPlayer &&
+ * ((EntityPlayer)aPlayer).capabilities.isCreativeMode) return true; int tTransfer = discharge(aStack, aAmount,
+ * Integer.MAX_VALUE, true, true); if (tTransfer == aAmount) { discharge(aStack, aAmount, Integer.MAX_VALUE, true,
+ * false); chargeFromArmor(aStack, aPlayer); return true; } discharge(aStack, aAmount, Integer.MAX_VALUE, true,
+ * false); chargeFromArmor(aStack, aPlayer); return false; }
+ * @Override public final void chargeFromArmor(ItemStack aStack, EntityLivingBase aPlayer) { if (aPlayer == null ||
+ * aPlayer.worldObj.isRemote) return; for (int i = 1; i < 5; i++) { ItemStack tArmor =
+ * aPlayer.getEquipmentInSlot(i); if (GT_ModHandler.isElectricItem(tArmor)) { IElectricItem tArmorItem =
+ * (IElectricItem)tArmor.getItem(); if (tArmorItem.canProvideEnergy(tArmor) && tArmorItem.getTier(tArmor) >=
+ * getTier(aStack)) { int tCharge = ElectricItem.manager.discharge(tArmor, charge(aStack, Integer.MAX_VALUE-1,
+ * Integer.MAX_VALUE, true, true), Integer.MAX_VALUE, true, false); if (tCharge > 0) { charge(aStack, tCharge,
+ * Integer.MAX_VALUE, true, false); if (aPlayer instanceof EntityPlayer) { Container tContainer =
+ * ((EntityPlayer)aPlayer).openContainer; if (tContainer != null) tContainer.detectAndSendChanges(); } } } } } }
+ */
+ public final long getRealCharge(ItemStack aStack) {
+ Long[] tStats = getElectricStats(aStack);
+ if (tStats == null) return 0;
+ if (tStats[3] > 0) return (int) (long) tStats[3];
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ return tNBT == null ? 0 : tNBT.getLong("GT.ItemCharge");
+ }
+
+ public final boolean setCharge(ItemStack aStack, long aCharge) {
+ Long[] tStats = getElectricStats(aStack);
+ if (tStats == null || tStats[3] > 0) return false;
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) tNBT = new NBTTagCompound();
+ tNBT.removeTag("GT.ItemCharge");
+ aCharge = Math.min(tStats[0] < 0 ? Math.abs(tStats[0] / 2) : aCharge, Math.abs(tStats[0]));
+ if (aCharge > 0) {
+ aStack.setItemDamage(getChargedMetaData(aStack));
+ tNBT.setLong("GT.ItemCharge", aCharge);
+ } else {
+ aStack.setItemDamage(getEmptyMetaData(aStack));
+ }
+ if (tNBT.hasNoTags()) aStack.setTagCompound(null);
+ else aStack.setTagCompound(tNBT);
+ isItemStackUsable(aStack);
+ return true;
+ }
+
+ public short getChargedMetaData(ItemStack aStack) {
+ return (short) aStack.getItemDamage();
+ }
+
+ public short getEmptyMetaData(ItemStack aStack) {
+ return (short) aStack.getItemDamage();
+ }
+
+ @Override
+ public FluidStack getFluid(ItemStack aStack) {
+ return getFluidContent(aStack);
+ }
+
+ @Override
+ public int getCapacity(ItemStack aStack) {
+ Long[] tStats = getFluidContainerStats(aStack);
+ return tStats == null ? 0 : (int) Math.max(0, tStats[0]);
+ }
+
+ @Override
+ public int fill(ItemStack aStack, FluidStack aFluid, boolean doFill) {
+ if (aStack == null || aStack.stackSize != 1) return 0;
+
+ ItemStack tStack = GT_Utility.fillFluidContainer(aFluid, aStack, false, false);
+ if (tStack != null) {
+ aStack.setItemDamage(tStack.getItemDamage());
+ aStack.func_150996_a(tStack.getItem());
+ return GT_Utility.getFluidForFilledItem(tStack, false).amount;
+ }
+
+ Long[] tStats = getFluidContainerStats(aStack);
+ if (tStats == null || tStats[0] <= 0
+ || aFluid == null
+ || aFluid.getFluid()
+ .getID() <= 0
+ || aFluid.amount <= 0) return 0;
+
+ FluidStack tFluid = getFluidContent(aStack);
+
+ if (tFluid == null || tFluid.getFluid()
+ .getID() <= 0) {
+ if (aFluid.amount <= tStats[0]) {
+ if (doFill) {
+ setFluidContent(aStack, aFluid);
+ }
+ return aFluid.amount;
+ }
+ if (doFill) {
+ tFluid = aFluid.copy();
+ tFluid.amount = (int) (long) tStats[0];
+ setFluidContent(aStack, tFluid);
+ }
+ return (int) (long) tStats[0];
+ }
+
+ if (!tFluid.isFluidEqual(aFluid)) return 0;
+
+ int space = (int) (long) tStats[0] - tFluid.amount;
+ if (aFluid.amount <= space) {
+ if (doFill) {
+ tFluid.amount += aFluid.amount;
+ setFluidContent(aStack, tFluid);
+ }
+ return aFluid.amount;
+ }
+ if (doFill) {
+ tFluid.amount = (int) (long) tStats[0];
+ setFluidContent(aStack, tFluid);
+ }
+ return space;
+ }
+
+ @Override
+ public FluidStack drain(ItemStack aStack, int maxDrain, boolean doDrain) {
+ if (aStack == null || aStack.stackSize != 1) return null;
+
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(aStack, false);
+ if (tFluid != null && maxDrain >= tFluid.amount) {
+ ItemStack tStack = GT_Utility.getContainerItem(aStack, false);
+ if (tStack == null) {
+ if (doDrain) aStack.stackSize = 0;
+ return tFluid;
+ }
+ if (doDrain) {
+ aStack.setItemDamage(tStack.getItemDamage());
+ aStack.func_150996_a(tStack.getItem());
+ }
+ return tFluid;
+ }
+
+ Long[] tStats = getFluidContainerStats(aStack);
+ if (tStats == null || tStats[0] <= 0) return null;
+
+ tFluid = getFluidContent(aStack);
+ if (tFluid == null) return null;
+
+ int used = maxDrain;
+ if (tFluid.amount < used) used = tFluid.amount;
+ if (doDrain) {
+ tFluid.amount -= used;
+ setFluidContent(aStack, tFluid);
+ }
+
+ FluidStack drained = tFluid.copy();
+ drained.amount = used;
+ return drained;
+ }
+
+ public FluidStack getFluidContent(ItemStack aStack) {
+ Long[] tStats = getFluidContainerStats(aStack);
+ if (tStats == null || tStats[0] <= 0) return GT_Utility.getFluidForFilledItem(aStack, false);
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ return tNBT == null ? null : FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("GT.FluidContent"));
+ }
+
+ public void setFluidContent(ItemStack aStack, FluidStack aFluid) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) tNBT = new NBTTagCompound();
+ else tNBT.removeTag("GT.FluidContent");
+ if (aFluid != null && aFluid.amount > 0)
+ tNBT.setTag("GT.FluidContent", aFluid.writeToNBT(new NBTTagCompound()));
+ if (tNBT.hasNoTags()) aStack.setTagCompound(null);
+ else aStack.setTagCompound(tNBT);
+ isItemStackUsable(aStack);
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack aStack) {
+ Long[] tStats = getElectricStats(aStack);
+ if (tStats != null && (tStats[3] == -1 || tStats[3] == -2 || tStats[3] == -3) && getRealCharge(aStack) > 0)
+ return 1;
+ tStats = getFluidContainerStats(aStack);
+ if (tStats != null) return (int) (long) tStats[1];
+ if (getDamage(aStack) == 32763) return 1;
+ return 64;
+ }
+
+ @Override
+ public final Item getChargedItem(ItemStack itemStack) {
+ return this;
+ }
+
+ @Override
+ public final Item getEmptyItem(ItemStack itemStack) {
+ return this;
+ }
+
+ @Override
+ public final int getTier(ItemStack aStack) {
+ Long[] tStats = getElectricStats(aStack);
+ return (int) (tStats == null ? Integer.MAX_VALUE : tStats[2]);
+ }
+
+ @Override
+ public final String getToolTip(ItemStack aStack) {
+ return null;
+ } // This has its own ToolTip Handler, no need to let the IC2 Handler screw us up at this Point
+
+ @Override
+ public final IElectricItemManager getManager(ItemStack aStack) {
+ return this;
+ } // We are our own Manager
+
+ @Override
+ public final boolean getShareTag() {
+ return true;
+ } // just to be sure.
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java b/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java
new file mode 100644
index 0000000000..465c4bc9d6
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java
@@ -0,0 +1,415 @@
+package gregtech.api.items;
+
+import static gregtech.api.enums.GT_Values.D1;
+import static gregtech.api.enums.Mods.AppleCore;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.recipe.RecipeMaps.cannerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.BitSet;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumAction;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemFood;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Mods;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+import gregtech.api.interfaces.IFoodStat;
+import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.IItemBehaviour;
+import gregtech.api.interfaces.IItemContainer;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.render.items.GT_GeneratedMaterial_Renderer;
+import squeek.applecore.api.food.FoodValues;
+import squeek.applecore.api.food.IEdible;
+import squeek.applecore.api.food.ItemFoodProxy;
+
+/**
+ * @author Gregorius Techneticies
+ * <p/>
+ * One Item for everything!
+ * <p/>
+ * This brilliant Item Class is used for automatically generating all possible variations of Material Items,
+ * like Dusts, Ingots, Gems, Plates and similar. It saves me a ton of work, when adding Items, because I always
+ * have to make a new Item SubType for each OreDict Prefix, when adding a new Material.
+ * <p/>
+ * As you can see, up to 32766 Items can be generated using this Class. And the last 766 Items can be custom
+ * defined, just to save space and MetaData.
+ * <p/>
+ * These Items can also have special RightClick abilities, electric Charge or even be set to become a Food alike
+ * Item.
+ */
+@Optional.Interface(iface = "squeek.applecore.api.food.IEdible", modid = Mods.Names.APPLE_CORE)
+public abstract class GT_MetaGenerated_Item extends GT_MetaBase_Item implements IGT_ItemWithMaterialRenderer, IEdible {
+
+ /**
+ * All instances of this Item Class are listed here. This gets used to register the Renderer to all Items of this
+ * Type, if useStandardMetaItemRenderer() returns true.
+ * <p/>
+ * You can also use the unlocalized Name gotten from getUnlocalizedName() as Key if you want to get a specific Item.
+ */
+ public static final ConcurrentHashMap<String, GT_MetaGenerated_Item> sInstances = new ConcurrentHashMap<>();
+
+ /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */
+
+ public final short mOffset, mItemAmount;
+ public final BitSet mEnabledItems;
+ public final BitSet mVisibleItems;
+ public final IIcon[][] mIconList;
+
+ public final ConcurrentHashMap<Short, IFoodStat> mFoodStats = new ConcurrentHashMap<>();
+ public final ConcurrentHashMap<Short, Long[]> mElectricStats = new ConcurrentHashMap<>();
+ public final ConcurrentHashMap<Short, Long[]> mFluidContainerStats = new ConcurrentHashMap<>();
+ public final ConcurrentHashMap<Short, Short> mBurnValues = new ConcurrentHashMap<>();
+
+ /**
+ * Creates the Item using these Parameters.
+ *
+ * @param aUnlocalized The Unlocalized Name of this Item.
+ */
+ public GT_MetaGenerated_Item(String aUnlocalized, short aOffset, short aItemAmount) {
+ super(aUnlocalized);
+ setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS);
+ setHasSubtypes(true);
+ setMaxDamage(0);
+ mEnabledItems = new BitSet(aItemAmount);
+ mVisibleItems = new BitSet(aItemAmount);
+
+ mOffset = (short) Math.min(32766, aOffset);
+ mItemAmount = (short) Math.min(aItemAmount, 32766 - mOffset);
+ mIconList = new IIcon[aItemAmount][1];
+
+ sInstances.put(getUnlocalizedName(), this);
+ }
+
+ /**
+ * This adds a Custom Item to the ending Range.
+ *
+ * @param aID The Id of the assigned Item [0 - mItemAmount] (The MetaData gets auto-shifted by +mOffset)
+ * @param aEnglish The Default Localized Name of the created Item
+ * @param aToolTip The Default ToolTip of the created Item, you can also insert null for having no ToolTip
+ * @param aRandomData The OreDict Names you want to give the Item. Also used for TC Aspects and some other things.
+ * @return An ItemStack containing the newly created Item.
+ */
+ public final ItemStack addItem(int aID, String aEnglish, String aToolTip, Object... aRandomData) {
+ if (aToolTip == null) aToolTip = "";
+ if (aID >= 0 && aID < mItemAmount) {
+ ItemStack rStack = new ItemStack(this, 1, mOffset + aID);
+ if (mEnabledItems.get(aID)) {
+ throw new IllegalArgumentException(
+ String.format("ID %s is already reserved for %s!", aID, rStack.getDisplayName()));
+ }
+ mEnabledItems.set(aID);
+ mVisibleItems.set(aID);
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName(rStack) + ".name", aEnglish);
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName(rStack) + ".tooltip", aToolTip);
+ List<TC_AspectStack> tAspects = new ArrayList<>();
+ // Important Stuff to do first
+ for (Object tRandomData : aRandomData) if (tRandomData instanceof SubTag) {
+ if (tRandomData == SubTag.INVISIBLE) {
+ mVisibleItems.set(aID, false);
+ continue;
+ }
+ if (tRandomData == SubTag.NO_UNIFICATION) {
+ GT_OreDictUnificator.addToBlacklist(rStack);
+ }
+ }
+ // now check for the rest
+ for (Object tRandomData : aRandomData) if (tRandomData != null) {
+ boolean tUseOreDict = true;
+ if (tRandomData instanceof IFoodStat) {
+ setFoodBehavior(mOffset + aID, (IFoodStat) tRandomData);
+ if (((IFoodStat) tRandomData).getFoodAction(this, rStack) == EnumAction.eat) {
+ int tFoodValue = ((IFoodStat) tRandomData).getFoodLevel(this, rStack, null);
+ if (tFoodValue > 0) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(rStack, ItemList.IC2_Food_Can_Empty.get(tFoodValue))
+ .itemOutputs(
+ ((IFoodStat) tRandomData).isRotten(this, rStack, null)
+ ? ItemList.IC2_Food_Can_Spoiled.get(tFoodValue)
+ : ItemList.IC2_Food_Can_Filled.get(tFoodValue))
+ .duration(tFoodValue * 5 * SECONDS)
+ .eut(1)
+ .addTo(cannerRecipes);
+ }
+ }
+ tUseOreDict = false;
+ }
+ if (tRandomData instanceof IItemBehaviour) {
+ // The cast below from is not safe. If you know how to make it safe, please do.
+ // noinspection unchecked
+ addItemBehavior(mOffset + aID, (IItemBehaviour<GT_MetaBase_Item>) tRandomData);
+ tUseOreDict = false;
+ }
+ if (tRandomData instanceof IItemContainer) {
+ ((IItemContainer) tRandomData).set(rStack);
+ tUseOreDict = false;
+ }
+ if (tRandomData instanceof SubTag) {
+ continue;
+ }
+ if (tRandomData instanceof TC_AspectStack) {
+ ((TC_AspectStack) tRandomData).addToAspectList(tAspects);
+ continue;
+ }
+ if (tRandomData instanceof ItemData) {
+ if (GT_Utility.isStringValid(tRandomData)) GT_OreDictUnificator.registerOre(tRandomData, rStack);
+ else GT_OreDictUnificator.addItemData(rStack, (ItemData) tRandomData);
+ continue;
+ }
+ if (tUseOreDict) {
+ GT_OreDictUnificator.registerOre(tRandomData, rStack);
+ }
+ }
+ if (GregTech_API.sThaumcraftCompat != null)
+ GregTech_API.sThaumcraftCompat.registerThaumcraftAspectsToItem(rStack, tAspects, false);
+ return rStack;
+ }
+ return null;
+ }
+
+ /**
+ * Sets a Food Behavior for the Item.
+ *
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aFoodBehavior the Food Behavior you want to add.
+ * @return the Item itself for convenience in constructing.
+ */
+ public final GT_MetaGenerated_Item setFoodBehavior(int aMetaValue, IFoodStat aFoodBehavior) {
+ if (aMetaValue < 0 || aMetaValue >= mOffset + mEnabledItems.length()) return this;
+ if (aFoodBehavior == null) mFoodStats.remove((short) aMetaValue);
+ else mFoodStats.put((short) aMetaValue, aFoodBehavior);
+ return this;
+ }
+
+ /**
+ * Sets the Furnace Burn Value for the Item.
+ *
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aValue 200 = 1 Burn Process = 500 EU, max = 32767 (that is 81917.5 EU)
+ * @return the Item itself for convenience in constructing.
+ */
+ public final GT_MetaGenerated_Item setBurnValue(int aMetaValue, int aValue) {
+ if (aMetaValue < 0 || aMetaValue >= mOffset + mEnabledItems.length() || aValue < 0) return this;
+ if (aValue == 0) mBurnValues.remove((short) aMetaValue);
+ else mBurnValues.put((short) aMetaValue, aValue > Short.MAX_VALUE ? Short.MAX_VALUE : (short) aValue);
+ return this;
+ }
+
+ /**
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aMaxCharge Maximum Charge. (if this is == 0 it will remove the Electric Behavior)
+ * @param aTransferLimit Transfer Limit.
+ * @param aTier The electric Tier.
+ * @param aSpecialData If this Item has a Fixed Charge, like a SingleUse Battery (if > 0). Use -1 if you want to
+ * make this Battery chargeable (the use and canUse Functions will still discharge if you just
+ * use this) Use -2 if you want to make this Battery dischargeable. Use -3 if you want to make
+ * this Battery charge/discharge-able.
+ * @return the Item itself for convenience in constructing.
+ */
+ public final GT_MetaGenerated_Item setElectricStats(int aMetaValue, long aMaxCharge, long aTransferLimit,
+ long aTier, long aSpecialData, boolean aUseAnimations) {
+ if (aMetaValue < 0 || aMetaValue >= mOffset + mEnabledItems.length()) return this;
+ if (aMaxCharge == 0) mElectricStats.remove((short) aMetaValue);
+ else {
+ mElectricStats.put(
+ (short) aMetaValue,
+ new Long[] { aMaxCharge, Math.max(0, aTransferLimit), Math.max(-1, aTier), aSpecialData });
+ if (aMetaValue >= mOffset && aUseAnimations) mIconList[aMetaValue - mOffset] = Arrays
+ .copyOf(mIconList[aMetaValue - mOffset], Math.max(9, mIconList[aMetaValue - mOffset].length));
+ }
+ return this;
+ }
+
+ /**
+ *
+ * @param aMetaValue the Meta Value of the Item you want to set it to. [0 - 32765]
+ * @param aCapacity fluid capacity in L or mb
+ * @param aStacksize item stack size
+ * @return the Item itself for convenience in constructing.
+ */
+ public final GT_MetaGenerated_Item setFluidContainerStats(int aMetaValue, long aCapacity, long aStacksize) {
+ if (aMetaValue < 0 || aMetaValue >= mOffset + mEnabledItems.length()) return this;
+ if (aCapacity < 0) mElectricStats.remove((short) aMetaValue);
+ else mFluidContainerStats.put((short) aMetaValue, new Long[] { aCapacity, Math.max(1, aStacksize) });
+ return this;
+ }
+
+ /**
+ * @return if this MetaGenerated Item should use my Default Renderer System.
+ */
+ public boolean useStandardMetaItemRenderer() {
+ return true;
+ }
+
+ @Override
+ public short[] getRGBa(ItemStack aStack) {
+ return Materials._NULL.getRGBA();
+ }
+
+ /**
+ * @return the Icon the Material is going to be rendered with.
+ */
+ public IIconContainer getIconContainer(int aMetaData) {
+ return null;
+ }
+
+ @Override
+ public IIcon getIcon(int aMetaData, int pass) {
+ IIconContainer iconContainer = getIconContainer(aMetaData);
+ return iconContainer != null ? iconContainer.getIcon() : null;
+ }
+
+ @Override
+ public IIcon getOverlayIcon(int aMetaData, int pass) {
+ IIconContainer iconContainer = getIconContainer(aMetaData);
+ return iconContainer != null ? iconContainer.getOverlayIcon() : null;
+ }
+
+ @Override
+ public boolean shouldUseCustomRenderer(int aMetaData) {
+ return true;
+ }
+
+ @Override
+ public GT_GeneratedMaterial_Renderer getMaterialRenderer(int aMetaData) {
+ return null;
+ }
+
+ @Override
+ public boolean allowMaterialRenderer(int aMetaData) {
+ return aMetaData < this.mOffset;
+ }
+
+ /* ---------- INTERNAL OVERRIDES ---------- */
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ IFoodStat tStat = mFoodStats.get((short) getDamage(aStack));
+ if (tStat != null && aPlayer.canEat(tStat.alwaysEdible(this, aStack, aPlayer)))
+ aPlayer.setItemInUse(aStack, 32);
+ return super.onItemRightClick(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ public int getMaxItemUseDuration(ItemStack aStack) {
+ return mFoodStats.get((short) getDamage(aStack)) == null ? 0 : 32;
+ }
+
+ @Override
+ public EnumAction getItemUseAction(ItemStack aStack) {
+ IFoodStat tStat = mFoodStats.get((short) getDamage(aStack));
+ return tStat == null ? EnumAction.none : tStat.getFoodAction(this, aStack);
+ }
+
+ @Override
+ public final ItemStack onEaten(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ IFoodStat tStat = mFoodStats.get((short) getDamage(aStack));
+ if (tStat != null) {
+ if (AppleCore.isModLoaded()) {
+ aPlayer.getFoodStats()
+ .func_151686_a(getFoodProxy(this), aStack);
+ } else {
+ aPlayer.getFoodStats()
+ .addStats(tStat.getFoodLevel(this, aStack, aPlayer), tStat.getSaturation(this, aStack, aPlayer));
+ }
+ tStat.onEaten(this, aStack, aPlayer);
+ }
+ return aStack;
+ }
+
+ @Optional.Method(modid = Mods.Names.APPLE_CORE)
+ private static ItemFood getFoodProxy(Object edible) {
+ return new ItemFoodProxy((IEdible) edible);
+ }
+
+ @Override
+ @Optional.Method(modid = Mods.Names.APPLE_CORE)
+ public FoodValues getFoodValues(ItemStack aStack) {
+ IFoodStat tStat = mFoodStats.get((short) getDamage(aStack));
+ return tStat == null ? null
+ : new FoodValues(tStat.getFoodLevel(this, aStack, null), tStat.getSaturation(this, aStack, null));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ int j = mEnabledItems.length();
+ for (int i = 0; i < j; i++) if (mVisibleItems.get(i) || (D1 && mEnabledItems.get(i))) {
+ Long[] tStats = mElectricStats.get((short) (mOffset + i));
+ if (tStats != null && tStats[3] < 0) {
+ ItemStack tStack = new ItemStack(this, 1, mOffset + i);
+ setCharge(tStack, Math.abs(tStats[0]));
+ isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ if (tStats == null || tStats[3] != -2) {
+ ItemStack tStack = new ItemStack(this, 1, mOffset + i);
+ isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void registerIcons(IIconRegister aIconRegister) {
+ short j = (short) mEnabledItems.length();
+ for (short i = 0; i < j; i++) if (mEnabledItems.get(i)) {
+ for (byte k = 1; k < mIconList[i].length; k++) {
+ mIconList[i][k] = aIconRegister.registerIcon(
+ GregTech.getResourcePath(GT_Config.troll ? "troll" : getUnlocalizedName() + "/" + i + "/" + k));
+ }
+ mIconList[i][0] = aIconRegister
+ .registerIcon(GregTech.getResourcePath(GT_Config.troll ? "troll" : getUnlocalizedName() + "/" + i));
+ }
+ }
+
+ @Override
+ public final Long[] getElectricStats(ItemStack aStack) {
+ return mElectricStats.get((short) aStack.getItemDamage());
+ }
+
+ @Override
+ public final Long[] getFluidContainerStats(ItemStack aStack) {
+ return mFluidContainerStats.get((short) aStack.getItemDamage());
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X01.java b/src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X01.java
new file mode 100644
index 0000000000..db41a3c35b
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X01.java
@@ -0,0 +1,213 @@
+package gregtech.api.items;
+
+import static gregtech.api.enums.GT_Values.M;
+
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * @author Gregorius Techneticies
+ * <p/>
+ * One Item for everything!
+ * <p/>
+ * This brilliant Item Class is used for automatically generating all possible variations of Material Items,
+ * like Dusts, Ingots, Gems, Plates and similar. It saves me a ton of work, when adding Items, because I always
+ * have to make a new Item SubType for each OreDict Prefix, when adding a new Material.
+ * <p/>
+ * As you can see, up to 32766 Items can be generated using this Class. And the last 766 Items can be custom
+ * defined, just to save space and MetaData.
+ * <p/>
+ * These Items can also have special RightClick abilities, electric Charge or even be set to become a Food alike
+ * Item.
+ */
+public abstract class GT_MetaGenerated_Item_X01 extends GT_MetaGenerated_Item {
+
+ protected final OrePrefixes mPrefix;
+ protected final int mIconSetIndex;
+
+ /**
+ * Creates the Item using these Parameters. This is for the new 1 Item = 1 Prefix System.
+ *
+ * @param aUnlocalized The Unlocalized Name of this Item.
+ * @param aGeneratedPrefix The OreDict Prefix you want to have generated.
+ * @param aIconSetIndex The TextureSet Index to be used. -1 for Defaulting to the Data contained in the Prefix.
+ * (this is only to be used for selecting the Icon in getIconContainer, nothing else)
+ */
+ public GT_MetaGenerated_Item_X01(String aUnlocalized, OrePrefixes aGeneratedPrefix, int aIconSetIndex) {
+ super(aUnlocalized, (short) 32000, (short) 766);
+ mPrefix = aGeneratedPrefix;
+ mIconSetIndex = aIconSetIndex >= 0 ? aIconSetIndex
+ : aGeneratedPrefix.mTextureIndex >= 0 ? aGeneratedPrefix.mTextureIndex : 0;
+
+ for (int i = 0; i < GregTech_API.sGeneratedMaterials.length; i++) {
+ OrePrefixes tPrefix = mPrefix;
+ if (tPrefix == null) continue;
+ Materials tMaterial = GregTech_API.sGeneratedMaterials[i];
+ if (tMaterial == null) continue;
+ if (mPrefix.doGenerateItem(tMaterial)) {
+ ItemStack tStack = new ItemStack(this, 1, i);
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName(tStack) + ".name",
+ GT_LanguageManager.i18nPlaceholder ? getDefaultLocalizationFormat(tPrefix, tMaterial, i)
+ : getDefaultLocalization(tPrefix, tMaterial, i));
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName(tStack) + ".tooltip",
+ tMaterial.getToolTip(tPrefix.mMaterialAmount / M));
+ String tOreName = getOreDictString(tPrefix, tMaterial);
+ tPrefix = OrePrefixes.getOrePrefix(tOreName);
+ if (tPrefix != null && tPrefix.mIsUnificatable) {
+ GT_OreDictUnificator.set(tPrefix, OrePrefixes.getMaterial(tOreName, tPrefix), tStack);
+ } else {
+ GT_OreDictUnificator.registerOre(tOreName, tStack);
+ }
+ }
+ }
+ }
+
+ /* ---------- OVERRIDEABLE FUNCTIONS ---------- */
+
+ /**
+ * @param aPrefix the OreDict Prefix
+ * @param aMaterial the Material
+ * @param aMetaData a Index from [0 - 31999]
+ * @return the Localized Name when default LangFiles are used.
+ */
+ public String getDefaultLocalization(OrePrefixes aPrefix, Materials aMaterial, int aMetaData) {
+ return aPrefix.getDefaultLocalNameForItem(aMaterial);
+ }
+
+ /**
+ * @param aPrefix the OreDict Prefix
+ * @param aMaterial the Material
+ * @param aMetaData a Index from [0 - 31999]
+ * @return the Localized Name Format when default LangFiles are used.
+ */
+ public String getDefaultLocalizationFormat(OrePrefixes aPrefix, Materials aMaterial, int aMetaData) {
+ return aPrefix.getDefaultLocalNameFormatForItem(aMaterial);
+ }
+
+ /**
+ * @param aPrefix always != null
+ * @param aMaterial always != null
+ * @param aDoShowAllItems this is the Configuration Setting of the User, if he wants to see all the Stuff like Tiny
+ * Dusts or Crushed Ores as well.
+ * @return if this Item should be visible in NEI or Creative
+ */
+ public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) {
+ return true;
+ }
+
+ /**
+ * @return the name of the Item to be registered at the OreDict.
+ */
+ public String getOreDictString(OrePrefixes aPrefix, Materials aMaterial) {
+ return aPrefix.get(aMaterial)
+ .toString();
+ }
+
+ public IIconContainer getIconContainer(int aMetaData, Materials aMaterial) {
+ return aMaterial.mIconSet.mTextures[mIconSetIndex];
+ }
+
+ /* ---------- INTERNAL OVERRIDES ---------- */
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ String aName = super.getItemStackDisplayName(aStack);
+ int aDamage = aStack.getItemDamage();
+ if (aDamage < 32000 && aDamage >= 0) return Materials.getLocalizedNameForItem(aName, aDamage % 1000);
+ return aName;
+ }
+
+ @Override
+ public ItemStack getContainerItem(ItemStack aStack) {
+ int aMetaData = aStack.getItemDamage();
+ if (aMetaData < GregTech_API.sGeneratedMaterials.length && aMetaData >= 0) {
+ Materials aMaterial = GregTech_API.sGeneratedMaterials[aMetaData];
+ if (aMaterial != null && aMaterial != Materials.Empty && aMaterial != Materials._NULL) {
+ return GT_Utility.copyAmount(1, mPrefix.mContainerItem);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public short[] getRGBa(ItemStack aStack) {
+ int aMetaData = getDamage(aStack);
+ return aMetaData < GregTech_API.sGeneratedMaterials.length
+ && GregTech_API.sGeneratedMaterials[aMetaData] != null ? GregTech_API.sGeneratedMaterials[aMetaData].mRGBa
+ : Materials._NULL.mRGBa;
+ }
+
+ @Override
+ public final IIconContainer getIconContainer(int aMetaData) {
+ return aMetaData < GregTech_API.sGeneratedMaterials.length
+ && GregTech_API.sGeneratedMaterials[aMetaData] != null
+ ? getIconContainer(aMetaData, GregTech_API.sGeneratedMaterials[aMetaData])
+ : null;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void getSubItems(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ for (int i = 0; i < GregTech_API.sGeneratedMaterials.length; i++)
+ if (mPrefix.doGenerateItem(GregTech_API.sGeneratedMaterials[i]) && doesShowInCreative(
+ mPrefix,
+ GregTech_API.sGeneratedMaterials[i],
+ GregTech_API.sDoShowAllItemsInCreative)) {
+ ItemStack tStack = new ItemStack(this, 1, i);
+ isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ super.getSubItems(aItem, aCreativeTab, aList);
+ }
+
+ @Override
+ public final IIcon getIconFromDamage(int aMetaData) {
+ if (aMetaData < 0) return null;
+ if (aMetaData < GregTech_API.sGeneratedMaterials.length) {
+ Materials tMaterial = GregTech_API.sGeneratedMaterials[aMetaData];
+ if (tMaterial == null) return null;
+ IIconContainer tIcon = getIconContainer(aMetaData, tMaterial);
+ if (tIcon != null) return tIcon.getIcon();
+ return null;
+ }
+ return aMetaData >= mOffset && aMetaData - mOffset < mIconList.length ? mIconList[aMetaData - mOffset][0]
+ : null;
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack aStack) {
+ return getDamage(aStack) < mOffset ? Math.min(super.getItemStackLimit(aStack), mPrefix.mDefaultStackSize)
+ : super.getItemStackLimit(aStack);
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X32.java b/src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X32.java
new file mode 100644
index 0000000000..a06a4a7a63
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X32.java
@@ -0,0 +1,224 @@
+package gregtech.api.items;
+
+import static gregtech.api.enums.GT_Values.M;
+
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.render.items.GT_GeneratedMaterial_Renderer;
+
+/**
+ * @author Gregorius Techneticies
+ * <p/>
+ * One Item for everything!
+ * <p/>
+ * This brilliant Item Class is used for automatically generating all possible variations of Material Items,
+ * like Dusts, Ingots, Gems, Plates and similar. It saves me a ton of work, when adding Items, because I always
+ * have to make a new Item SubType for each OreDict Prefix, when adding a new Material.
+ * <p/>
+ * As you can see, up to 32766 Items can be generated using this Class. And the last 766 Items can be custom
+ * defined, just to save space and MetaData.
+ * <p/>
+ * These Items can also have special RightClick abilities, electric Charge or even be set to become a Food alike
+ * Item.
+ */
+public abstract class GT_MetaGenerated_Item_X32 extends GT_MetaGenerated_Item {
+
+ protected final OrePrefixes[] mGeneratedPrefixList;
+
+ /**
+ * Creates the Item using these Parameters.
+ *
+ * @param aUnlocalized The Unlocalized Name of this Item.
+ * @param aGeneratedPrefixList The OreDict Prefixes you want to have generated.
+ */
+ public GT_MetaGenerated_Item_X32(String aUnlocalized, OrePrefixes... aGeneratedPrefixList) {
+ super(aUnlocalized, (short) 32000, (short) 766);
+ mGeneratedPrefixList = Arrays.copyOf(aGeneratedPrefixList, 32);
+
+ for (int i = 0; i < 32000; i++) {
+ OrePrefixes tPrefix = mGeneratedPrefixList[i / 1000];
+ if (tPrefix == null) continue;
+ Materials tMaterial = GregTech_API.sGeneratedMaterials[i % 1000];
+ if (tMaterial == null) continue;
+ if (doesMaterialAllowGeneration(tPrefix, tMaterial)) {
+ ItemStack tStack = new ItemStack(this, 1, i);
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName(tStack) + ".name",
+ GT_LanguageManager.i18nPlaceholder ? getDefaultLocalizationFormat(tPrefix, tMaterial, i)
+ : getDefaultLocalization(tPrefix, tMaterial, i));
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName(tStack) + ".tooltip",
+ tMaterial.getToolTip(tPrefix.mMaterialAmount / M));
+ if (tPrefix.mIsUnificatable) {
+ GT_OreDictUnificator.set(tPrefix, tMaterial, tStack);
+ } else {
+ GT_OreDictUnificator.registerOre(tPrefix.get(tMaterial), tStack);
+ }
+ if ((tPrefix == OrePrefixes.stick || tPrefix == OrePrefixes.wireFine || tPrefix == OrePrefixes.ingot)
+ && (tMaterial == Materials.Lead || tMaterial == Materials.Tin
+ || tMaterial == Materials.SolderingAlloy)) {
+ GregTech_API.sSolderingMetalList.add(tStack);
+ GT_ModHandler.registerBoxableItemToToolBox(tStack);
+ }
+ }
+ }
+ }
+
+ /* ---------- OVERRIDEABLE FUNCTIONS ---------- */
+
+ /**
+ * @return the Color Modulation the Material is going to be rendered with.
+ */
+ @Override
+ public short[] getRGBa(ItemStack aStack) {
+ Materials tMaterial = GregTech_API.sGeneratedMaterials[getDamage(aStack) % 1000];
+ return tMaterial == null ? Materials._NULL.mRGBa : tMaterial.mRGBa;
+ }
+
+ /**
+ * @param aPrefix this can be null, you have to return false in that case
+ * @param aMaterial this can be null, you have to return false in that case
+ * @return if this Item should be generated and visible.
+ */
+ public boolean doesMaterialAllowGeneration(OrePrefixes aPrefix, Materials aMaterial) {
+ // You have to check for at least these Conditions in every Case! So add a super Call like the following for
+ // this before executing your Code:
+ // if (!super.doesMaterialAllowGeneration(aPrefix, aMaterial)) return false;
+ return aPrefix != null && aPrefix.doGenerateItem(aMaterial);
+ }
+
+ /* ---------- OVERRIDEABLE FUNCTIONS ---------- */
+
+ /**
+ * @param aPrefix the OreDict Prefix
+ * @param aMaterial the Material
+ * @param aMetaData a Index from [0 - 31999]
+ * @return the Localized Name when default LangFiles are used.
+ */
+ public String getDefaultLocalization(OrePrefixes aPrefix, Materials aMaterial, int aMetaData) {
+ return aPrefix.getDefaultLocalNameForItem(aMaterial);
+ }
+
+ /**
+ * @param aPrefix the OreDict Prefix
+ * @param aMaterial the Material
+ * @param aMetaData a Index from [0 - 31999]
+ * @return the Localized Name Format when default LangFiles are used.
+ */
+ public String getDefaultLocalizationFormat(OrePrefixes aPrefix, Materials aMaterial, int aMetaData) {
+ return aPrefix.getDefaultLocalNameFormatForItem(aMaterial);
+ }
+
+ /**
+ * @param aMetaData a Index from [0 - 31999]
+ * @param aMaterial the Material
+ * @return an Icon Container for the Item Display.
+ */
+ public final IIconContainer getIconContainer(int aMetaData, Materials aMaterial) {
+ return mGeneratedPrefixList[aMetaData / 1000] != null
+ && mGeneratedPrefixList[aMetaData / 1000].mTextureIndex >= 0
+ ? aMaterial.mIconSet.mTextures[mGeneratedPrefixList[aMetaData / 1000].mTextureIndex]
+ : null;
+ }
+
+ /**
+ * @param aPrefix always != null
+ * @param aMaterial always != null
+ * @param aDoShowAllItems this is the Configuration Setting of the User, if he wants to see all the Stuff like Tiny
+ * Dusts or Crushed Ores as well.
+ * @return if this Item should be visible in NEI or Creative
+ */
+ public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) {
+ return true;
+ }
+
+ /* ---------- INTERNAL OVERRIDES ---------- */
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ String aName = super.getItemStackDisplayName(aStack);
+ int aDamage = aStack.getItemDamage();
+ if (aDamage < 32000 && aDamage >= 0) return Materials.getLocalizedNameForItem(aName, aDamage % 1000);
+ return aName;
+ }
+
+ @Override
+ public ItemStack getContainerItem(ItemStack aStack) {
+ int aDamage = aStack.getItemDamage();
+ if (aDamage < 32000 && aDamage >= 0) {
+ Materials aMaterial = GregTech_API.sGeneratedMaterials[aDamage % 1000];
+ if (aMaterial != null && aMaterial != Materials.Empty && aMaterial != Materials._NULL) {
+ OrePrefixes aPrefix = mGeneratedPrefixList[aDamage / 1000];
+ if (aPrefix != null) return GT_Utility.copyAmount(1, aPrefix.mContainerItem);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public final IIconContainer getIconContainer(int aMetaData) {
+ return GregTech_API.sGeneratedMaterials[aMetaData % 1000] == null ? null
+ : getIconContainer(aMetaData, GregTech_API.sGeneratedMaterials[aMetaData % 1000]);
+ }
+
+ @Override
+ public GT_GeneratedMaterial_Renderer getMaterialRenderer(int aMetaData) {
+ return GregTech_API.sGeneratedMaterials[aMetaData % 1000] == null ? null
+ : GregTech_API.sGeneratedMaterials[aMetaData % 1000].renderer;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void getSubItems(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ for (int i = 0; i < 32000; i++) {
+ OrePrefixes aPrefix = mGeneratedPrefixList[i / 1000];
+ Materials aMaterial = GregTech_API.sGeneratedMaterials[i % 1000];
+ if (aPrefix != null && aMaterial != null) {
+ if (doesMaterialAllowGeneration(aPrefix, aMaterial)
+ && doesShowInCreative(aPrefix, aMaterial, GregTech_API.sDoShowAllItemsInCreative)) {
+ ItemStack tStack = new ItemStack(this, 1, i);
+ isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ }
+ }
+ super.getSubItems(aItem, aCreativeTab, aList);
+ }
+
+ @Override
+ public final IIcon getIconFromDamage(int aMetaData) {
+ if (aMetaData < 0) return null;
+ if (aMetaData < 32000) {
+ Materials tMaterial = GregTech_API.sGeneratedMaterials[aMetaData % 1000];
+ if (tMaterial == null) return null;
+ IIconContainer tIcon = getIconContainer(aMetaData, tMaterial);
+ if (tIcon != null) return tIcon.getIcon();
+ return null;
+ }
+ return aMetaData - 32000 < mIconList.length ? mIconList[aMetaData - 32000][0] : null;
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack aStack) {
+ int tDamage = getDamage(aStack);
+ if (tDamage < 32000 && mGeneratedPrefixList[tDamage / 1000] != null)
+ return Math.min(super.getItemStackLimit(aStack), mGeneratedPrefixList[tDamage / 1000].mDefaultStackSize);
+ return super.getItemStackLimit(aStack);
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_MetaGenerated_Tool.java b/src/main/java/gregtech/api/items/GT_MetaGenerated_Tool.java
new file mode 100644
index 0000000000..cec93169ec
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_MetaGenerated_Tool.java
@@ -0,0 +1,1013 @@
+package gregtech.api.items;
+
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_Steam.calculateLooseFlow;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.SharedMonsterAttributes;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.item.EntityMinecart;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.EnumAction;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.potion.Potion;
+import net.minecraft.stats.AchievementList;
+import net.minecraft.stats.StatList;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.IShearable;
+import net.minecraftforge.event.entity.player.PlayerEvent;
+import net.minecraftforge.event.world.BlockEvent;
+
+import appeng.api.implementations.items.IAEWrench;
+import buildcraft.api.tools.IToolWrench;
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import crazypants.enderio.api.tool.ITool;
+import forestry.api.arboriculture.IToolGrafter;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enchants.Enchantment_Radioactivity;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+import gregtech.api.interfaces.IDamagableItem;
+import gregtech.api.interfaces.IToolStats;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.tools.GT_Tool_Turbine;
+import mods.railcraft.api.core.items.IToolCrowbar;
+import mrtjp.projectred.api.IScrewdriver;
+
+/**
+ * This is an example on how you can create a Tool ItemStack, in this case a Bismuth Wrench:
+ * GT_MetaGenerated_Tool.sInstances.get("gt.metatool.01").getToolWithStats(GT_MetaGenerated_Tool_01.WRENCH, 1,
+ * Materials.Bismuth, Materials.Bismuth, null);
+ */
+@Optional.InterfaceList(
+ value = {
+ @Optional.Interface(iface = "forestry.api.arboriculture.IToolGrafter", modid = "ForestryAPI|arboriculture"),
+ @Optional.Interface(iface = "mods.railcraft.api.core.items.IToolCrowbar", modid = "RailcraftAPI|items"),
+ @Optional.Interface(iface = "buildcraft.api.tools.IToolWrench", modid = "BuildCraftAPI|tools"),
+ @Optional.Interface(iface = "crazypants.enderio.api.tool.ITool", modid = "EnderIOAPI|Tools"),
+ @Optional.Interface(iface = "mrtjp.projectred.api.IScrewdriver", modid = "ProjRed|Core"), })
+public abstract class GT_MetaGenerated_Tool extends GT_MetaBase_Item
+ implements IDamagableItem, IToolGrafter, IToolCrowbar, IToolWrench, ITool, IScrewdriver, IAEWrench {
+
+ /**
+ * All instances of this Item Class are listed here. This gets used to register the Renderer to all Items of this
+ * Type, if useStandardMetaItemRenderer() returns true.
+ * <p/>
+ * You can also use the unlocalized Name gotten from getUnlocalizedName() as Key if you want to get a specific Item.
+ */
+ public static final ConcurrentHashMap<String, GT_MetaGenerated_Tool> sInstances = new ConcurrentHashMap<>();
+
+ /* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */
+
+ public final ConcurrentHashMap<Short, IToolStats> mToolStats = new ConcurrentHashMap<>();
+
+ /**
+ * Creates the Item using these Parameters.
+ *
+ * @param aUnlocalized The Unlocalized Name of this Item.
+ */
+ public GT_MetaGenerated_Tool(String aUnlocalized) {
+ super(aUnlocalized);
+ setCreativeTab(GregTech_API.TAB_GREGTECH);
+ setMaxStackSize(1);
+ sInstances.put(getUnlocalizedName(), this);
+ }
+
+ /* ---------- FOR ADDING CUSTOM ITEMS INTO THE REMAINING 766 RANGE ---------- */
+
+ public static final Materials getPrimaryMaterial(ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("GT.ToolStats");
+ if (aNBT != null) return Materials.getRealMaterial(aNBT.getString("PrimaryMaterial"));
+ }
+ return Materials._NULL;
+ }
+
+ public static final Materials getSecondaryMaterial(ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("GT.ToolStats");
+ if (aNBT != null) return Materials.getRealMaterial(aNBT.getString("SecondaryMaterial"));
+ }
+ return Materials._NULL;
+ }
+
+ /* ---------- INTERNAL OVERRIDES ---------- */
+
+ public static final long getToolMaxDamage(ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("GT.ToolStats");
+ if (aNBT != null) return aNBT.getLong("MaxDamage");
+ }
+ return 0;
+ }
+
+ public static final long getToolDamage(ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("GT.ToolStats");
+ if (aNBT != null) return aNBT.getLong("Damage");
+ }
+ return 0;
+ }
+
+ public static final boolean setToolDamage(ItemStack aStack, long aDamage) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("GT.ToolStats");
+ if (aNBT != null) {
+ aNBT.setLong("Damage", aDamage);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static final boolean setToolMode(ItemStack aStack, byte aMode) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("GT.ToolStats");
+ if (aNBT != null) {
+ aNBT.setByte("Mode", aMode);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static final byte getToolMode(ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("GT.ToolStats");
+ if (aNBT != null) return aNBT.getByte("Mode");
+ }
+ return 0;
+ }
+
+ /**
+ * This adds a Custom Item to the ending Range.
+ *
+ * @param aID The Id of the assigned Tool Class [0 - 32765] (only even Numbers allowed! Uneven
+ * ID's are empty electric Items)
+ * @param aEnglish The Default Localized Name of the created Item
+ * @param aToolTip The Default ToolTip of the created Item, you can also insert null for having no
+ * ToolTip
+ * @param aToolStats The Food Value of this Item. Can be null as well.
+ * @param aOreDictNamesAndAspects The OreDict Names you want to give the Item. Also used to assign Thaumcraft
+ * Aspects.
+ * @return An ItemStack containing the newly created Item, but without specific Stats.
+ */
+ public final ItemStack addTool(int aID, String aEnglish, String aToolTip, IToolStats aToolStats,
+ Object... aOreDictNamesAndAspects) {
+ if (aToolTip == null) aToolTip = "";
+ if (aID >= 0 && aID < 32766 && aID % 2 == 0) {
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + aID + ".name", aEnglish);
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + aID + ".tooltip", aToolTip);
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + "." + (aID + 1) + ".name", aEnglish + " (Empty)");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + "." + (aID + 1) + ".tooltip", "You need to recharge it");
+ mToolStats.put((short) aID, aToolStats);
+ mToolStats.put((short) (aID + 1), aToolStats);
+ aToolStats.onStatsAddedToTool(this, aID);
+ ItemStack rStack = new ItemStack(this, 1, aID);
+ List<TC_AspectStack> tAspects = new ArrayList<>();
+ for (Object tOreDictNameOrAspect : aOreDictNamesAndAspects) {
+ if (tOreDictNameOrAspect instanceof TC_AspectStack)
+ ((TC_AspectStack) tOreDictNameOrAspect).addToAspectList(tAspects);
+ else GT_OreDictUnificator.registerOre(tOreDictNameOrAspect, rStack);
+ }
+ if (GregTech_API.sThaumcraftCompat != null)
+ GregTech_API.sThaumcraftCompat.registerThaumcraftAspectsToItem(rStack, tAspects, false);
+ GT_ModHandler.registerBoxableItemToToolBox(rStack);
+ return rStack;
+ }
+ return null;
+ }
+
+ /**
+ * This Function gets an ItemStack Version of this Tool
+ *
+ * @param aToolID the ID of the Tool Class
+ * @param aAmount Amount of Items (well normally you only need 1)
+ * @param aPrimaryMaterial Primary Material of this Tool
+ * @param aSecondaryMaterial Secondary (Rod/Handle) Material of this Tool
+ * @param aElectricArray The Electric Stats of this Tool (or null if not electric)
+ */
+ public final ItemStack getToolWithStats(int aToolID, int aAmount, Materials aPrimaryMaterial,
+ Materials aSecondaryMaterial, long[] aElectricArray) {
+ ItemStack rStack = new ItemStack(this, aAmount, aToolID);
+ IToolStats tToolStats = getToolStats(rStack);
+ if (tToolStats != null) {
+ NBTTagCompound tMainNBT = new NBTTagCompound(), tToolNBT = new NBTTagCompound();
+ tToolNBT.setByte("Mode", (byte) 0);
+ if (aPrimaryMaterial != null) {
+ tToolNBT.setString("PrimaryMaterial", aPrimaryMaterial.mName);
+ tToolNBT.setLong(
+ "MaxDamage",
+ 100L * (long) (aPrimaryMaterial.mDurability * tToolStats.getMaxDurabilityMultiplier()));
+ }
+ if (aSecondaryMaterial != null) tToolNBT.setString("SecondaryMaterial", aSecondaryMaterial.mName);
+
+ if (aElectricArray != null) {
+ tToolNBT.setBoolean("Electric", true);
+ tToolNBT.setLong("MaxCharge", aElectricArray[0]);
+ tToolNBT.setLong("Voltage", aElectricArray[1]);
+ tToolNBT.setLong("Tier", aElectricArray[2]);
+ tToolNBT.setLong("SpecialData", aElectricArray[3]);
+ }
+
+ tMainNBT.setTag("GT.ToolStats", tToolNBT);
+ rStack.setTagCompound(tMainNBT);
+ }
+ isItemStackUsable(rStack);
+ return rStack;
+ }
+
+ /**
+ * Called by the Block Harvesting Event within the GT_Proxy
+ */
+ @Mod.EventHandler
+ public void onHarvestBlockEvent(ArrayList<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock,
+ int aX, int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) {
+ IToolStats tStats = getToolStats(aStack);
+ if (isItemStackUsable(aStack) && getDigSpeed(aStack, aBlock, aMetaData) > 0.0F) doDamage(
+ aStack,
+ (long) tStats
+ .convertBlockDrops(aDrops, aStack, aPlayer, aBlock, aX, aY, aZ, aMetaData, aFortune, aSilkTouch, aEvent)
+ * tStats.getToolDamagePerDropConversion());
+ }
+
+ @Mod.EventHandler
+ public float onBlockBreakSpeedEvent(float aDefault, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX,
+ int aY, int aZ, byte aMetaData, PlayerEvent.BreakSpeed aEvent) {
+ IToolStats tStats = getToolStats(aStack);
+ return tStats == null ? aDefault
+ : tStats.getMiningSpeed(aBlock, aMetaData, aDefault, aPlayer, aPlayer.worldObj, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean onBlockStartBreak(ItemStack aStack, int aX, int aY, int aZ, EntityPlayer aPlayer) {
+ if (aPlayer.worldObj.isRemote) {
+ return false;
+ }
+ IToolStats tStats = getToolStats(aStack);
+ Block aBlock = aPlayer.worldObj.getBlock(aX, aY, aZ);
+ if (tStats.isChainsaw() && (aBlock instanceof IShearable target)) {
+ if ((target.isShearable(aStack, aPlayer.worldObj, aX, aY, aZ))) {
+ ArrayList<ItemStack> drops = target.onSheared(
+ aStack,
+ aPlayer.worldObj,
+ aX,
+ aY,
+ aZ,
+ EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, aStack));
+ for (ItemStack stack : drops) {
+ float f = 0.7F;
+ double d = itemRand.nextFloat() * f + (1.0F - f) * 0.5D;
+ double d1 = itemRand.nextFloat() * f + (1.0F - f) * 0.5D;
+ double d2 = itemRand.nextFloat() * f + (1.0F - f) * 0.5D;
+ EntityItem entityitem = new EntityItem(aPlayer.worldObj, aX + d, aY + d1, aZ + d2, stack);
+ entityitem.delayBeforeCanPickup = 10;
+ aPlayer.worldObj.spawnEntityInWorld(entityitem);
+ }
+ aPlayer.addStat(net.minecraft.stats.StatList.mineBlockStatArray[Block.getIdFromBlock(aBlock)], 1);
+ onBlockDestroyed(aStack, aPlayer.worldObj, aBlock, aX, aY, aZ, aPlayer);
+ }
+ return false;
+ }
+ return super.onBlockStartBreak(aStack, aX, aY, aZ, aPlayer);
+ }
+
+ @Override
+ public boolean onLeftClickEntity(ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) {
+ IToolStats tStats = getToolStats(aStack);
+ if (tStats == null || !isItemStackUsable(aStack)) return true;
+ GT_Utility.doSoundAtClient(tStats.getEntityHitSound(), 1, 1.0F);
+ if (super.onLeftClickEntity(aStack, aPlayer, aEntity)) return true;
+ if (aEntity.canAttackWithItem() && !aEntity.hitByEntity(aPlayer)) {
+ float tMagicDamage = tStats.getMagicDamageAgainstEntity(
+ aEntity instanceof EntityLivingBase
+ ? EnchantmentHelper.getEnchantmentModifierLiving(aPlayer, (EntityLivingBase) aEntity)
+ : 0.0F,
+ aEntity,
+ aStack,
+ aPlayer),
+ tDamage = tStats.getNormalDamageAgainstEntity(
+ (float) aPlayer.getEntityAttribute(SharedMonsterAttributes.attackDamage)
+ .getAttributeValue() + getToolCombatDamage(aStack),
+ aEntity,
+ aStack,
+ aPlayer);
+ if (tDamage + tMagicDamage > 0.0F) {
+ boolean tCriticalHit = aPlayer.fallDistance > 0.0F && !aPlayer.onGround
+ && !aPlayer.isOnLadder()
+ && !aPlayer.isInWater()
+ && !aPlayer.isPotionActive(Potion.blindness)
+ && aPlayer.ridingEntity == null
+ && aEntity instanceof EntityLivingBase;
+ if (tCriticalHit && tDamage > 0.0F) tDamage *= 1.5F;
+ tDamage += tMagicDamage;
+ if (aEntity.attackEntityFrom(tStats.getDamageSource(aPlayer, aEntity), tDamage)) {
+ if (aEntity instanceof EntityLivingBase)
+ aEntity.setFire(EnchantmentHelper.getFireAspectModifier(aPlayer) * 4);
+ int tKnockcack = (aPlayer.isSprinting() ? 1 : 0) + (aEntity instanceof EntityLivingBase
+ ? EnchantmentHelper.getKnockbackModifier(aPlayer, (EntityLivingBase) aEntity)
+ : 0);
+ if (tKnockcack > 0) {
+ aEntity.addVelocity(
+ -MathHelper.sin(aPlayer.rotationYaw * (float) Math.PI / 180.0F) * tKnockcack * 0.5F,
+ 0.1D,
+ MathHelper.cos(aPlayer.rotationYaw * (float) Math.PI / 180.0F) * tKnockcack * 0.5F);
+ aPlayer.motionX *= 0.6D;
+ aPlayer.motionZ *= 0.6D;
+ aPlayer.setSprinting(false);
+ }
+ if (tCriticalHit) aPlayer.onCriticalHit(aEntity);
+ if (tMagicDamage > 0.0F) aPlayer.onEnchantmentCritical(aEntity);
+ if (tDamage >= 18.0F) aPlayer.triggerAchievement(AchievementList.overkill);
+ aPlayer.setLastAttacker(aEntity);
+ if (aEntity instanceof EntityLivingBase)
+ EnchantmentHelper.func_151384_a((EntityLivingBase) aEntity, aPlayer);
+ EnchantmentHelper.func_151385_b(aPlayer, aEntity);
+ if (aEntity instanceof EntityLivingBase)
+ aPlayer.addStat(StatList.damageDealtStat, Math.round(tDamage * 10.0F));
+ aEntity.hurtResistantTime = Math
+ .max(1, tStats.getHurtResistanceTime(aEntity.hurtResistantTime, aEntity));
+ aPlayer.addExhaustion(0.3F);
+ doDamage(aStack, tStats.getToolDamagePerEntityAttack());
+ }
+ }
+ }
+ if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem();
+ return true;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ IToolStats tStats = getToolStats(aStack);
+ if (tStats != null && tStats.canBlock()) aPlayer.setItemInUse(aStack, 72000);
+ return super.onItemRightClick(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ public final int getMaxItemUseDuration(ItemStack aStack) {
+ return 72000;
+ }
+
+ @Override
+ public final EnumAction getItemUseAction(ItemStack aStack) {
+ IToolStats tStats = getToolStats(aStack);
+ if (tStats != null && tStats.canBlock()) return EnumAction.block;
+ return EnumAction.none;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void getSubItems(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ for (int i = 0; i < 32766; i += 2) {
+ if (getToolStats(new ItemStack(this, 1, i)) != null) {
+ ItemStack tStack = new ItemStack(this, 1, i);
+ isItemStackUsable(tStack);
+ aList.add(tStack);
+ aList.add(getToolWithStats(i, 1, Materials.Neutronium, Materials.Neutronium, null));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void registerIcons(IIconRegister aIconRegister) {
+ //
+ }
+
+ @Override
+ public final IIcon getIconFromDamage(int aMetaData) {
+ return null;
+ }
+
+ @Override
+ public void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
+ long tMaxDamage = getToolMaxDamage(aStack);
+ Materials tMaterial = getPrimaryMaterial(aStack);
+ IToolStats tStats = getToolStats(aStack);
+ int tOffset = getElectricStats(aStack) != null ? 2 : 1;
+ if (tStats != null) {
+ if (tStats instanceof GT_Tool_Turbine) {
+
+ // Durability -> toolMaxDamage
+ // % Efficiency -> toolCombatDamage -> toolQuality
+ // Optimal Flow -> toolSpeed
+ // EU/t -> toolCombatDamage, toolSpeed
+ // Overflow Tier -> toolQuality
+ float aBaseEff = (5f + getToolCombatDamage(aStack)) * 1000f;
+
+ // It was noted by IntelliJ that replacing ((GT_MetaGenerated_Tool) aStack.getItem()) with
+ // GT_MetaGenerated_Tool can have side effects. This refactoring will need tests.
+ @SuppressWarnings("AccessStaticViaInstance")
+ float aOptFlow = (Math.max(
+ Float.MIN_NORMAL,
+ ((GT_MetaGenerated_Tool) aStack.getItem()).getToolStats(aStack)
+ .getSpeedMultiplier()
+ * ((GT_MetaGenerated_Tool) aStack.getItem()).getPrimaryMaterial(aStack).mToolSpeed
+ * 50F));
+ aList.add(
+ tOffset + 0,
+ EnumChatFormatting.GRAY + String.format(
+ transItem("001", "Durability: %s/%s"),
+ "" + EnumChatFormatting.GREEN + formatNumbers(tMaxDamage - getToolDamage(aStack)) + " ",
+ " " + formatNumbers(tMaxDamage)) + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 1,
+ EnumChatFormatting.GRAY + String.format(
+ transItem("002", "%s lvl %s"),
+ tMaterial.mLocalizedName + EnumChatFormatting.YELLOW,
+ "" + getHarvestLevel(aStack, "")) + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 2,
+ EnumChatFormatting.WHITE
+ + String.format(
+ transItem("005", "Turbine Efficiency: %s"),
+ "" + EnumChatFormatting.BLUE + (50.0F + (10.0F * getToolCombatDamage(aStack))))
+ + "%"
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE + String.format(
+ transItem("006", "Optimal Steam flow: %s L/t"),
+ "" + EnumChatFormatting.GOLD
+ + formatNumbers(
+ GT_Utility.safeInt(
+ (long) (Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed
+ * (1000 * getPrimaryMaterial(aStack).mSteamMultiplier / 20)))))
+ + EnumChatFormatting.GRAY));
+ aList.add(
+ tOffset + 4,
+ EnumChatFormatting.WHITE + String.format(
+ transItem("900", "Energy from Optimal Steam Flow: %s EU/t"),
+ "" + EnumChatFormatting.GOLD
+ + formatNumbers(
+ GT_Utility.safeInt(
+ (long) (Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed
+ * (1000 * getPrimaryMaterial(aStack).mSteamMultiplier / 20))
+ * (50.0F + (10.0F * getToolCombatDamage(aStack)))
+ / 200)))
+ + EnumChatFormatting.GRAY));
+ {
+ float[] calculatedFlow = calculateLooseFlow(aOptFlow, aBaseEff);
+ float aOptFlowLoose = calculatedFlow[0];
+ float aBaseEffLoose = calculatedFlow[1];
+
+ aList.add(
+ tOffset + 5,
+ EnumChatFormatting.AQUA + String.format(
+ transItem("500", "Turbine Efficiency (Loose): %s"),
+ "" + EnumChatFormatting.BLUE + (long) aBaseEffLoose / 100 + "%" + EnumChatFormatting.GRAY));
+ aList.add(
+ tOffset + 6,
+ EnumChatFormatting.AQUA + String.format(
+ transItem("501", "Optimal Steam flow (Loose): %s L/t"),
+ "" + EnumChatFormatting.GOLD
+ + formatNumbers(((long) aOptFlowLoose * getPrimaryMaterial(aStack).mSteamMultiplier))
+ + EnumChatFormatting.GRAY));
+ aList.add(
+ tOffset + 7,
+ EnumChatFormatting.AQUA + String.format(
+ transItem("901", "Energy from Optimal Steam Flow (Loose): %s EU/t"),
+ "" + EnumChatFormatting.GOLD
+ + formatNumbers(
+ ((long) aOptFlowLoose * getPrimaryMaterial(aStack).mSteamMultiplier / 10000)
+ * ((long) aBaseEffLoose / 2))
+ + EnumChatFormatting.GRAY));
+ aList.add(
+ tOffset + 8,
+ EnumChatFormatting.GRAY + "(Superheated Steam EU values are 2x those of Steam)");
+ }
+ aList.add(
+ tOffset + 9,
+ EnumChatFormatting.WHITE + String.format(
+ transItem("902", "Optimal SC Steam flow: %s L/t"),
+ "" + EnumChatFormatting.GOLD
+ + formatNumbers(
+ GT_Utility.safeInt(
+ (long) (Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed
+ * (1000f / 20f)))))
+ + EnumChatFormatting.GRAY));
+ aList.add(
+ tOffset + 10,
+ EnumChatFormatting.WHITE + String.format(
+ transItem("903", "Energy from Optimal SC Steam Flow: %s EU/t"),
+ "" + EnumChatFormatting.GOLD
+ + formatNumbers(
+ GT_Utility.safeInt(
+ (long) (Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed
+ * (1000f / 20f))
+ * (50.0F + (10.0F * getToolCombatDamage(aStack))))))
+ + EnumChatFormatting.GRAY));
+ aList.add(
+ tOffset + 11,
+ EnumChatFormatting.LIGHT_PURPLE + String.format(
+ transItem("007", "Energy from Optimal Gas Flow: %s EU/t"),
+ "" + EnumChatFormatting.GOLD
+ + formatNumbers(
+ GT_Utility.safeInt(
+ (long) (Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed
+ * 50
+ * getPrimaryMaterial(aStack).mGasMultiplier)
+ * (50.0F + (10.0F * getToolCombatDamage(aStack)))
+ / 100)))
+ + EnumChatFormatting.GRAY));
+ aList.add(
+ tOffset + 12,
+ EnumChatFormatting.LIGHT_PURPLE + String.format(
+ transItem("008", "Energy from Optimal Plasma Flow: %s EU/t"),
+ "" + EnumChatFormatting.GOLD
+ + formatNumbers(
+ GT_Utility.safeInt(
+ (long) (Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed
+ * 2000
+ * getPrimaryMaterial(aStack).mPlasmaMultiplier)
+ * (50.0F + (10.0F * getToolCombatDamage(aStack)))
+ * (1.05 / 100))))
+ + EnumChatFormatting.GRAY));
+ aList.add(
+ tOffset + 14,
+ EnumChatFormatting.GRAY + "(EU/t values include efficiency and are not 100% accurate)");
+ int toolQualityLevel = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mToolQuality;
+ int overflowMultiplier = 0;
+ if (toolQualityLevel >= 6) {
+ overflowMultiplier = 3;
+ } else if (toolQualityLevel >= 3) {
+ overflowMultiplier = 2;
+ } else {
+ overflowMultiplier = 1;
+ }
+ aList.add(
+ tOffset + 13,
+ EnumChatFormatting.LIGHT_PURPLE + String.format(
+ transItem("502", "Overflow Efficiency Tier: %s"),
+ "" + EnumChatFormatting.GOLD + overflowMultiplier + EnumChatFormatting.GRAY));
+
+ } else {
+ aList.add(
+ tOffset,
+ EnumChatFormatting.WHITE + String.format(
+ transItem("001", "Durability: %s/%s"),
+ "" + EnumChatFormatting.GREEN + formatNumbers(tMaxDamage - getToolDamage(aStack)) + " ",
+ " " + formatNumbers(tMaxDamage)) + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 1,
+ EnumChatFormatting.WHITE + String.format(
+ transItem("002", "%s lvl %s"),
+ tMaterial.mLocalizedName + EnumChatFormatting.YELLOW,
+ "" + getHarvestLevel(aStack, "")) + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 2,
+ EnumChatFormatting.WHITE + String.format(
+ transItem("003", "Attack Damage: %s"),
+ "" + EnumChatFormatting.BLUE + getToolCombatDamage(aStack)) + EnumChatFormatting.GRAY);
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.WHITE
+ + String.format(
+ transItem("004", "Mining Speed: %s"),
+ "" + EnumChatFormatting.GOLD
+ + Math.max(
+ Float.MIN_NORMAL,
+ tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed))
+ + EnumChatFormatting.GRAY);
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("GT.ToolStats");
+ if (aNBT != null && aNBT.hasKey("Heat")) {
+ int tHeat = aNBT.getInteger("Heat");
+ long tWorldTime = aPlayer.getEntityWorld()
+ .getWorldTime();
+ if (aNBT.hasKey("HeatTime")) {
+ long tHeatTime = aNBT.getLong("HeatTime");
+ if (tWorldTime > (tHeatTime + 10)) {
+ tHeat = (int) (tHeat - ((tWorldTime - tHeatTime) / 10));
+ if (tHeat < 300 && tHeat > -10000) tHeat = 300;
+ }
+ aNBT.setLong("HeatTime", tWorldTime);
+ if (tHeat > -10000) aNBT.setInteger("Heat", tHeat);
+ }
+
+ aList.add(
+ tOffset + 3,
+ EnumChatFormatting.RED + "Heat: "
+ + aNBT.getInteger("Heat")
+ + " K"
+ + EnumChatFormatting.GRAY);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public Long[] getFluidContainerStats(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public Long[] getElectricStats(ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ aNBT = aNBT.getCompoundTag("GT.ToolStats");
+ if (aNBT != null && aNBT.getBoolean("Electric")) return new Long[] { aNBT.getLong("MaxCharge"),
+ aNBT.getLong("Voltage"), aNBT.getLong("Tier"), aNBT.getLong("SpecialData") };
+ }
+ return null;
+ }
+
+ public float getToolCombatDamage(ItemStack aStack) {
+ IToolStats tStats = getToolStats(aStack);
+ if (tStats == null) return 0;
+ return tStats.getBaseDamage() + getPrimaryMaterial(aStack).mToolQuality;
+ }
+
+ @Override
+ public final boolean doDamageToItem(ItemStack aStack, int aVanillaDamage) {
+ return doDamage(aStack, aVanillaDamage * 100L);
+ }
+
+ public final boolean doDamage(ItemStack aStack, long aAmount) {
+ if (!isItemStackUsable(aStack)) return false;
+ Long[] tElectric = getElectricStats(aStack);
+ if (tElectric == null) {
+ long tNewDamage = getToolDamage(aStack) + aAmount;
+ setToolDamage(aStack, tNewDamage);
+ if (tNewDamage >= getToolMaxDamage(aStack)) {
+ IToolStats tStats = getToolStats(aStack);
+ if (tStats == null || GT_Utility.setStack(aStack, tStats.getBrokenItem(aStack)) == null) {
+ if (tStats != null) GT_Utility.doSoundAtClient(tStats.getBreakingSound(), 1, 1.0F);
+ if (aStack.stackSize > 0) aStack.stackSize--;
+ }
+ }
+ return true;
+ }
+ if (use(aStack, (int) aAmount, null)) {
+ if (java.util.concurrent.ThreadLocalRandom.current()
+ .nextInt(0, 25) == 0) {
+ long tNewDamage = getToolDamage(aStack) + aAmount;
+ setToolDamage(aStack, tNewDamage);
+ if (tNewDamage >= getToolMaxDamage(aStack)) {
+ IToolStats tStats = getToolStats(aStack);
+ if (tStats == null || GT_Utility.setStack(aStack, tStats.getBrokenItem(aStack)) == null) {
+ if (tStats != null) GT_Utility.doSoundAtClient(tStats.getBreakingSound(), 1, 1.0F);
+ if (aStack.stackSize > 0) aStack.stackSize--;
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public float getDigSpeed(ItemStack aStack, Block aBlock, int aMetaData) {
+ if (!isItemStackUsable(aStack)) return 0.0F;
+ IToolStats tStats = getToolStats(aStack);
+ if (tStats == null || Math.max(0, getHarvestLevel(aStack, "")) < aBlock.getHarvestLevel(aMetaData)) return 0.0F;
+ return tStats.isMinableBlock(aBlock, (byte) aMetaData)
+ ? Math.max(Float.MIN_NORMAL, tStats.getSpeedMultiplier() * getPrimaryMaterial(aStack).mToolSpeed)
+ : 0.0F;
+ }
+
+ @Override
+ public final boolean canHarvestBlock(Block aBlock, ItemStack aStack) {
+ return getDigSpeed(aStack, aBlock, (byte) 0) > 0.0F;
+ }
+
+ @Override
+ public final int getHarvestLevel(ItemStack aStack, String aToolClass) {
+ IToolStats tStats = getToolStats(aStack);
+ return tStats == null ? -1 : tStats.getBaseQuality() + getPrimaryMaterial(aStack).mToolQuality;
+ }
+
+ @Override
+ public boolean onBlockDestroyed(ItemStack aStack, World aWorld, Block aBlock, int aX, int aY, int aZ,
+ EntityLivingBase aPlayer) {
+ if (!isItemStackUsable(aStack)) return false;
+ IToolStats tStats = getToolStats(aStack);
+ if (tStats == null) return false;
+ GT_Utility.doSoundAtClient(tStats.getMiningSound(), 1, 1.0F);
+ doDamage(
+ aStack,
+ (int) Math.max(1, aBlock.getBlockHardness(aWorld, aX, aY, aZ) * tStats.getToolDamagePerBlockBreak()));
+ return getDigSpeed(aStack, aBlock, aWorld.getBlockMetadata(aX, aY, aZ)) > 0.0F;
+ }
+
+ @Override
+ public final ItemStack getContainerItem(ItemStack aStack) {
+ return getContainerItem(aStack, true);
+ }
+
+ @Override
+ public final boolean hasContainerItem(ItemStack aStack) {
+ return getContainerItem(aStack, false) != null;
+ }
+
+ private ItemStack getContainerItem(ItemStack aStack, boolean playSound) {
+ if (!isItemStackUsable(aStack)) return null;
+ aStack = GT_Utility.copyAmount(1, aStack);
+ IToolStats tStats = getToolStats(aStack);
+ if (tStats == null) return null;
+ doDamage(aStack, tStats.getToolDamagePerContainerCraft());
+ aStack = aStack.stackSize > 0 ? aStack : null;
+ if (playSound && GT_Mod.gregtechproxy.mTicksUntilNextCraftSound <= 0) {
+ GT_Mod.gregtechproxy.mTicksUntilNextCraftSound = 10;
+ String sound = (aStack == null) ? tStats.getBreakingSound() : tStats.getCraftingSound();
+ GT_Utility.doSoundAtClient(sound, 1, 1.0F);
+ }
+ return aStack;
+ }
+
+ public IToolStats getToolStats(ItemStack aStack) {
+ isItemStackUsable(aStack);
+ return getToolStatsInternal(aStack);
+ }
+
+ public byte getToolMaxMode(ItemStack aStack) {
+ IToolStats stats = getToolStats(aStack);
+ if (stats != null) {
+ return stats.getMaxMode();
+ }
+ return 1;
+ }
+
+ private IToolStats getToolStatsInternal(ItemStack aStack) {
+ return aStack == null ? null : mToolStats.get((short) aStack.getItemDamage());
+ }
+
+ @Override
+ public float getSaplingModifier(ItemStack aStack, World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ) {
+ IToolStats tStats = getToolStats(aStack);
+ return tStats != null && tStats.isGrafter() ? Math.min(100.0F, (1 + getHarvestLevel(aStack, "")) * 20.0F)
+ : 0.0F;
+ }
+
+ @Override
+ public boolean canWhack(EntityPlayer aPlayer, ItemStack aStack, int aX, int aY, int aZ) {
+ if (!isItemStackUsable(aStack)) return false;
+ IToolStats tStats = getToolStats(aStack);
+ return tStats != null && tStats.isCrowbar();
+ }
+
+ @Override
+ public void onWhack(EntityPlayer aPlayer, ItemStack aStack, int aX, int aY, int aZ) {
+ IToolStats tStats = getToolStats(aStack);
+ if (tStats != null) doDamage(aStack, tStats.getToolDamagePerEntityAttack());
+ }
+
+ @Override
+ public boolean canWrench(EntityPlayer player, int x, int y, int z) {
+ if (player == null) return false;
+ return canWrench(player.getHeldItem(), player, x, y, z);
+ }
+
+ @Override
+ public boolean canWrench(ItemStack wrench, EntityPlayer player, int x, int y, int z) {
+ if (wrench == null) return false;
+ if (!isItemStackUsable(wrench)) return false;
+ IToolStats tStats = getToolStats(player.getCurrentEquippedItem());
+ return tStats != null && tStats.isWrench();
+ }
+
+ @Override
+ public void wrenchUsed(EntityPlayer player, int x, int y, int z) {
+ if (player == null) return;
+ if (player.getCurrentEquippedItem() == null) return;
+ IToolStats tStats = getToolStats(player.getCurrentEquippedItem());
+ if (tStats != null) doDamage(player.getCurrentEquippedItem(), tStats.getToolDamagePerEntityAttack());
+ }
+
+ @Override
+ public boolean canUse(ItemStack stack, EntityPlayer player, int x, int y, int z) {
+ return canWrench(player, x, y, z);
+ }
+
+ // ProjectRed screwdriver
+ @Override
+ public boolean canUse(EntityPlayer player, ItemStack stack) {
+ if (player == null) return false;
+ if (GT_Utility.isStackInvalid(stack) || !isItemStackUsable(stack)) return false;
+ IToolStats tStats = getToolStats(stack);
+ return tStats != null && tStats.isScrewdriver();
+ }
+
+ @Override
+ public void damageScrewdriver(EntityPlayer player, ItemStack stack) {
+ if (player == null) return;
+ if (GT_Utility.isStackInvalid(stack) || !isItemStackUsable(stack)) return;
+ IToolStats tStats = getToolStats(stack);
+ if (tStats != null) doDamage(stack, tStats.getToolDamagePerEntityAttack());
+ }
+
+ @Override
+ public void used(ItemStack stack, EntityPlayer player, int x, int y, int z) {
+ wrenchUsed(player, x, y, z);
+ }
+
+ @Override
+ public boolean shouldHideFacades(ItemStack stack, EntityPlayer player) {
+ if (player == null) return false;
+ if (player.getCurrentEquippedItem() == null) return false;
+ if (!isItemStackUsable(player.getCurrentEquippedItem())) return false;
+ IToolStats tStats = getToolStats(player.getCurrentEquippedItem());
+ return tStats.isWrench();
+ }
+
+ @Override
+ public boolean canLink(EntityPlayer aPlayer, ItemStack aStack, EntityMinecart cart) {
+ if (!isItemStackUsable(aStack)) return false;
+ IToolStats tStats = getToolStats(aStack);
+ return tStats != null && tStats.isCrowbar();
+ }
+
+ @Override
+ public void onLink(EntityPlayer aPlayer, ItemStack aStack, EntityMinecart cart) {
+ IToolStats tStats = getToolStats(aStack);
+ if (tStats != null) doDamage(aStack, tStats.getToolDamagePerEntityAttack());
+ }
+
+ @Override
+ public boolean canBoost(EntityPlayer aPlayer, ItemStack aStack, EntityMinecart cart) {
+ if (!isItemStackUsable(aStack)) return false;
+ IToolStats tStats = getToolStats(aStack);
+ return tStats != null && tStats.isCrowbar();
+ }
+
+ @Override
+ public void onBoost(EntityPlayer aPlayer, ItemStack aStack, EntityMinecart cart) {
+ IToolStats tStats = getToolStats(aStack);
+ if (tStats != null) doDamage(aStack, tStats.getToolDamagePerEntityAttack());
+ }
+
+ @Override
+ public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ IToolStats tStats = getToolStats(aStack);
+ if (tStats != null && aPlayer != null) tStats.onToolCrafted(aStack, aPlayer);
+ super.onCreated(aStack, aWorld, aPlayer);
+ }
+
+ @Override
+ public final boolean doesContainerItemLeaveCraftingGrid(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public final int getItemStackLimit(ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public boolean isFull3D() {
+ return true;
+ }
+
+ @Override
+ public boolean isItemStackUsable(ItemStack aStack) {
+ IToolStats tStats = getToolStatsInternal(aStack);
+ if (aStack.getItemDamage() % 2 != 0 || tStats == null) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) aNBT.removeTag("ench");
+ return false;
+ }
+ Materials aMaterial = getPrimaryMaterial(aStack);
+ HashMap<Integer, Integer> tMap = new HashMap<>(), tResult = new HashMap<>();
+ if (aMaterial.mEnchantmentTools != null) {
+ tMap.put(aMaterial.mEnchantmentTools.effectId, (int) aMaterial.mEnchantmentToolsLevel);
+ if (aMaterial.mEnchantmentTools == Enchantment.fortune)
+ tMap.put(Enchantment.looting.effectId, (int) aMaterial.mEnchantmentToolsLevel);
+ if (aMaterial.mEnchantmentTools == Enchantment.knockback)
+ tMap.put(Enchantment.power.effectId, (int) aMaterial.mEnchantmentToolsLevel);
+ if (aMaterial.mEnchantmentTools == Enchantment.fireAspect)
+ tMap.put(Enchantment.flame.effectId, (int) aMaterial.mEnchantmentToolsLevel);
+ }
+ Enchantment[] tEnchants = tStats.getEnchantments(aStack);
+ int[] tLevels = tStats.getEnchantmentLevels(aStack);
+ for (int i = 0; i < tEnchants.length; i++) if (tLevels[i] > 0) {
+ Integer tLevel = tMap.get(tEnchants[i].effectId);
+ tMap.put(
+ tEnchants[i].effectId,
+ tLevel == null ? tLevels[i] : tLevel == tLevels[i] ? tLevel + 1 : Math.max(tLevel, tLevels[i]));
+ }
+ for (Entry<Integer, Integer> tEntry : tMap.entrySet()) {
+ if (tEntry.getKey() == 33 || (tEntry.getKey() == 20 && tEntry.getValue() > 2)
+ || tEntry.getKey() == Enchantment_Radioactivity.INSTANCE.effectId)
+ tResult.put(tEntry.getKey(), tEntry.getValue());
+ else switch (Enchantment.enchantmentsList[tEntry.getKey()].type) {
+ case weapon:
+ if (tStats.isWeapon()) tResult.put(tEntry.getKey(), tEntry.getValue());
+ break;
+ case all:
+ tResult.put(tEntry.getKey(), tEntry.getValue());
+ break;
+ case armor:
+ case armor_feet:
+ case armor_head:
+ case armor_legs:
+ case armor_torso:
+ break;
+ case bow:
+ if (tStats.isRangedWeapon()) tResult.put(tEntry.getKey(), tEntry.getValue());
+ break;
+ case breakable:
+ break;
+ case fishing_rod:
+ break;
+ case digger:
+ if (tStats.isMiningTool()) tResult.put(tEntry.getKey(), tEntry.getValue());
+ break;
+ }
+ }
+ EnchantmentHelper.setEnchantments(tResult, aStack);
+ return true;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+
+ String result = super.getItemStackDisplayName(aStack);
+ IToolStats toolStats = getToolStats(aStack);
+ if (toolStats != null) {
+ String toolName = toolStats.getToolTypeName();
+ if (toolName == null) return result;
+
+ String key = "gt." + toolName + ".mode." + getToolMode(aStack);
+ if (StatCollector.canTranslate(key)) {
+ result += " (" + StatCollector.translateToLocal(key) + ")";
+ }
+ }
+ return result;
+
+ }
+
+ @Override
+ public short getChargedMetaData(ItemStack aStack) {
+ return (short) (aStack.getItemDamage() - (aStack.getItemDamage() % 2));
+ }
+
+ @Override
+ public short getEmptyMetaData(ItemStack aStack) {
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) aNBT.removeTag("ench");
+ return (short) (aStack.getItemDamage() + 1 - (aStack.getItemDamage() % 2));
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_RadioactiveCellIC_Item.java b/src/main/java/gregtech/api/items/GT_RadioactiveCellIC_Item.java
new file mode 100644
index 0000000000..8698bac886
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_RadioactiveCellIC_Item.java
@@ -0,0 +1,196 @@
+package gregtech.api.items;
+
+import java.util.ArrayList;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Utility;
+import ic2.api.reactor.IReactor;
+import ic2.api.reactor.IReactorComponent;
+import ic2.core.IC2Potion;
+
+public class GT_RadioactiveCellIC_Item extends GT_RadioactiveCell_Item implements IReactorComponent {
+
+ private static final int MYSTERIOUS_MULTIPLIER_HEAT = 4;
+ public final int numberOfCells;
+ public final float sEnergy;
+ public final int sRadiation;
+ public final float sHeat;
+ public final ItemStack sDepleted;
+ public final boolean sMox;
+
+ public GT_RadioactiveCellIC_Item(String aUnlocalized, String aEnglish, int aCellcount, int maxDamage, float aEnergy,
+ int aRadiation, float aHeat, ItemStack aDepleted, boolean aMox) {
+ super(aUnlocalized, aEnglish, aCellcount);
+ setMaxStackSize(64);
+ this.maxDmg = maxDamage;
+ this.numberOfCells = aCellcount;
+ this.sEnergy = aEnergy;
+ this.sRadiation = aRadiation;
+ this.sHeat = aHeat;
+ this.sDepleted = aDepleted;
+ this.sMox = aMox;
+ if (aDepleted != null && aEnergy > 0 && aHeat > 0) {
+ // avoid adding depleted cells to recipe map
+ GT_Values.RA.addIC2ReactorFuelCell(
+ new ItemStack(this),
+ aDepleted,
+ aMox,
+ aHeat * MYSTERIOUS_MULTIPLIER_HEAT,
+ aEnergy,
+ aCellcount);
+ }
+ }
+
+ private static int checkPulseable(IReactor reactor, int x, int y, ItemStack me, int mex, int mey, boolean heatrun) {
+ ItemStack other = reactor.getItemAt(x, y);
+ if ((other != null) && ((other.getItem() instanceof IReactorComponent))
+ && (((IReactorComponent) other.getItem())
+ .acceptUraniumPulse(reactor, other, me, x, y, mex, mey, heatrun))) {
+ return 1;
+ }
+ return 0;
+ }
+
+ @Override
+ public void processChamber(IReactor reactor, ItemStack yourStack, int x, int y, boolean heatrun) {
+ if (!reactor.produceEnergy()) {
+ return;
+ }
+ for (int iteration = 0; iteration < this.numberOfCells; iteration++) {
+ int pulses = 1 + this.numberOfCells / 2;
+ if (!heatrun) {
+ for (int i = 0; i < pulses; i++) {
+ acceptUraniumPulse(reactor, yourStack, yourStack, x, y, x, y, heatrun);
+ }
+ checkPulseable(reactor, x - 1, y, yourStack, x, y, heatrun);
+ checkPulseable(reactor, x + 1, y, yourStack, x, y, heatrun);
+ checkPulseable(reactor, x, y - 1, yourStack, x, y, heatrun);
+ checkPulseable(reactor, x, y + 1, yourStack, x, y, heatrun);
+ } else {
+ pulses += checkPulseable(reactor, x - 1, y, yourStack, x, y, heatrun)
+ + checkPulseable(reactor, x + 1, y, yourStack, x, y, heatrun)
+ + checkPulseable(reactor, x, y - 1, yourStack, x, y, heatrun)
+ + checkPulseable(reactor, x, y + 1, yourStack, x, y, heatrun);
+
+ // int heat = sumUp(pulses) * 4;
+
+ int heat = triangularNumber(pulses) * MYSTERIOUS_MULTIPLIER_HEAT;
+
+ heat = getFinalHeat(reactor, yourStack, x, y, heat);
+
+ ArrayList<ItemStackCoord> heatAcceptors = new ArrayList<>();
+ checkHeatAcceptor(reactor, x - 1, y, heatAcceptors);
+ checkHeatAcceptor(reactor, x + 1, y, heatAcceptors);
+ checkHeatAcceptor(reactor, x, y - 1, heatAcceptors);
+ checkHeatAcceptor(reactor, x, y + 1, heatAcceptors);
+ heat = Math.round(heat * sHeat);
+ while ((heatAcceptors.size() > 0) && (heat > 0)) {
+
+ int dheat = heat / heatAcceptors.size();
+ heat -= dheat;
+ dheat = ((IReactorComponent) heatAcceptors.get(0).stack.getItem()).alterHeat(
+ reactor,
+ heatAcceptors.get(0).stack,
+ heatAcceptors.get(0).x,
+ heatAcceptors.get(0).y,
+ dheat);
+ heat += dheat;
+ heatAcceptors.remove(0);
+ }
+ if (heat > 0) {
+ reactor.addHeat(heat);
+ }
+ }
+ }
+ if (getDamageOfStack(yourStack) >= getMaxDamageEx() - 1) {
+ reactor.setItemAt(x, y, sDepleted.copy());
+ } else if (heatrun) {
+ damageItemStack(yourStack, 1);
+ }
+ }
+
+ protected int getFinalHeat(IReactor reactor, ItemStack stack, int x, int y, int heat) {
+ if (sMox && reactor.isFluidCooled()) {
+ float breedereffectiveness = (float) reactor.getHeat() / (float) reactor.getMaxHeat();
+ if (breedereffectiveness > 0.5D) {
+ heat *= 2;
+ }
+ }
+ return heat;
+ }
+
+ private void checkHeatAcceptor(IReactor reactor, int x, int y, ArrayList<ItemStackCoord> heatAcceptors) {
+ ItemStack thing = reactor.getItemAt(x, y);
+ if ((thing != null) && ((thing.getItem() instanceof IReactorComponent))
+ && (((IReactorComponent) thing.getItem()).canStoreHeat(reactor, thing, x, y))) {
+ heatAcceptors.add(new ItemStackCoord(thing, x, y));
+ }
+ }
+
+ @Override
+ public boolean acceptUraniumPulse(IReactor reactor, ItemStack yourStack, ItemStack pulsingStack, int youX, int youY,
+ int pulseX, int pulseY, boolean heatrun) {
+ if (!heatrun) {
+ if (sMox) {
+ float breedereffectiveness = (float) reactor.getHeat() / (float) reactor.getMaxHeat();
+ float ReaktorOutput = 1.5F * breedereffectiveness + 1.0F;
+ reactor.addOutput(ReaktorOutput * this.sEnergy);
+ } else {
+ reactor.addOutput(1.0F * this.sEnergy);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean canStoreHeat(IReactor reactor, ItemStack yourStack, int x, int y) {
+ return false;
+ }
+
+ @Override
+ public int getMaxHeat(IReactor reactor, ItemStack yourStack, int x, int y) {
+ return 0;
+ }
+
+ @Override
+ public int getCurrentHeat(IReactor reactor, ItemStack yourStack, int x, int y) {
+ return 0;
+ }
+
+ @Override
+ public int alterHeat(IReactor reactor, ItemStack yourStack, int x, int y, int heat) {
+ return heat;
+ }
+
+ @Override
+ public float influenceExplosion(IReactor reactor, ItemStack yourStack) {
+ return 2 * this.numberOfCells;
+ }
+
+ @Override
+ public void onUpdate(ItemStack stack, World world, Entity entity, int slotIndex, boolean isCurrentItem) {
+ if (this.sRadiation > 0 && (entity instanceof EntityLivingBase entityLiving)) {
+ if (!GT_Utility.isWearingFullRadioHazmat(entityLiving)) {
+ IC2Potion.radiation.applyTo(entityLiving, sRadiation * 20, sRadiation * 10);
+ }
+ }
+ }
+
+ private static class ItemStackCoord {
+
+ public ItemStack stack;
+ public int x;
+ public int y;
+
+ public ItemStackCoord(ItemStack stack1, int x1, int y1) {
+ this.stack = stack1;
+ this.x = x1;
+ this.y = y1;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_RadioactiveCell_Item.java b/src/main/java/gregtech/api/items/GT_RadioactiveCell_Item.java
new file mode 100644
index 0000000000..c927737889
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_RadioactiveCell_Item.java
@@ -0,0 +1,159 @@
+package gregtech.api.items;
+
+import static gregtech.api.util.GT_Utility.formatNumbers;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.common.items.GT_DepletetCell_Item;
+import ic2.api.item.IBoxable;
+import ic2.core.util.StackUtil;
+
+public class GT_RadioactiveCell_Item extends GT_Generic_Item implements IBoxable {
+
+ protected int cellCount;
+ protected int maxDmg;
+ protected int dura;
+
+ public GT_RadioactiveCell_Item(String aUnlocalized, String aEnglish, int aCellcount) {
+ super(aUnlocalized, aEnglish, null);
+ this.setMaxStackSize(64);
+ this.setMaxDamage(100);
+ setNoRepair();
+ this.cellCount = Math.max(1, aCellcount);
+ }
+
+ public static int getDurabilityOfStack(ItemStack aStack) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ aStack.setTagCompound(tNBT);
+ }
+ return tNBT.getInteger("advDmg");
+ }
+
+ protected static int sumUp(int a) {
+ int b = 0;
+ for (int c = 1; c <= a; c++) {
+ b += c;
+ }
+ return b;
+ }
+
+ protected static int triangularNumber(int x) {
+ return (x * x + x) / 2;
+ }
+
+ protected boolean outputPulseForStack(ItemStack aStack) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ aStack.setTagCompound(tNBT);
+ }
+ tNBT.setInteger("output", tNBT.getInteger("output") + 1);
+ return false; // (this.pulserate > 0) || (tNBT.getInteger("output") % -this.pulserate == 0);
+ }
+
+ protected boolean incrementPulseForStack(ItemStack aStack) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ aStack.setTagCompound(tNBT);
+ }
+ tNBT.setInteger("pulse", tNBT.getInteger("pulse") + 1);
+ return false; // (this.pulserate > 0) || (tNBT.getInteger("pulse") % -this.pulserate == 0);
+ }
+
+ protected void setDurabilityForStack(ItemStack aStack, int aDurability) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ aStack.setTagCompound(tNBT);
+ }
+ tNBT.setInteger("durability", aDurability);
+ }
+
+ public int getMaxNuclearDurability() {
+ return 0; // return this.maxDelay;
+ }
+
+ public int func_77619_b() {
+ return 0;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack ingredient, ItemStack bookEnchant) {
+ return false;
+ }
+
+ // getIsRepairable
+ public boolean func_82789_a(ItemStack toBeRepaired, ItemStack repairWith) {
+ return false;
+ }
+
+ public void setDamageForStack(ItemStack stack, int advDmg) {
+ NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack);
+ nbtData.setInteger("advDmg", advDmg);
+ if (this.maxDmg > 0) {
+ double p = (double) advDmg / (double) this.maxDmg;
+ int newDmg = (int) (stack.getMaxDamage() * p);
+ if (newDmg >= stack.getMaxDamage()) {
+ newDmg = stack.getMaxDamage() - 1;
+ }
+ stack.setItemDamage(newDmg);
+ this.dura = newDmg;
+ }
+ }
+
+ public int getDamageOfStack(ItemStack stack) {
+ NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack);
+ this.dura = nbtData.getInteger("advDmg");
+ return this.dura;
+ }
+
+ public int getControlTagOfStack(ItemStack stack) {
+ NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack);
+ return nbtData.getInteger("tag");
+ }
+
+ public void setControlTagOfStack(ItemStack stack, int tag) {
+ NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack);
+ nbtData.setInteger("tag", tag);
+ }
+
+ public int getMaxDamageEx() {
+ return this.maxDmg;
+ }
+
+ public void damageItemStack(ItemStack stack, int Dmg) {
+ setDamageForStack(stack, getDamageOfStack(stack) + Dmg);
+ }
+
+ @Override
+ public void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
+ super.addAdditionalToolTips(aList, aStack, aPlayer);
+ // aList.add("Time left: " + (this.maxDelay - getDurabilityOfStack(aStack)) + " secs");
+ int rDmg = getDurabilityOfStack(aStack) * 6 / this.maxDmg;
+ EnumChatFormatting color2 = switch (rDmg) {
+ case 0, 1 -> EnumChatFormatting.WHITE;
+ case 2, 3, 4 -> EnumChatFormatting.GRAY;
+ default -> EnumChatFormatting.DARK_GRAY;
+ };
+ EnumChatFormatting color1 = this instanceof GT_DepletetCell_Item ? color2 = EnumChatFormatting.DARK_GRAY
+ : EnumChatFormatting.WHITE;
+ aList.add(
+ color1 + String.format(
+ transItem("001", "Durability: %s/%s"),
+ "" + color2 + formatNumbers(this.maxDmg - getDurabilityOfStack(aStack)) + color1,
+ "" + formatNumbers(this.maxDmg)));
+ }
+
+ @Override
+ public boolean canBeStoredInToolbox(ItemStack itemstack) {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_Tool_Item.java b/src/main/java/gregtech/api/items/GT_Tool_Item.java
new file mode 100644
index 0000000000..9f78bdc3fc
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_Tool_Item.java
@@ -0,0 +1,41 @@
+package gregtech.api.items;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_ModHandler;
+
+/**
+ * This is just a basic Tool, which has normal durability and could break Blocks.
+ */
+public class GT_Tool_Item extends GT_Generic_Item {
+
+ public GT_Tool_Item(String aUnlocalized, String aEnglish, String aTooltip, int aMaxDamage, int aEntityDamage,
+ boolean aSwingIfUsed) {
+ this(aUnlocalized, aEnglish, aTooltip, aMaxDamage, aEntityDamage, aSwingIfUsed, -1, -1);
+ }
+
+ public GT_Tool_Item(String aUnlocalized, String aEnglish, String aTooltip, int aMaxDamage, int aEntityDamage,
+ boolean aSwingIfUsed, int aChargedGTID, int aDisChargedGTID) {
+ this(
+ aUnlocalized,
+ aEnglish,
+ aTooltip,
+ aMaxDamage,
+ aEntityDamage,
+ aSwingIfUsed,
+ aChargedGTID,
+ aDisChargedGTID,
+ 0,
+ 0.0F);
+ }
+
+ public GT_Tool_Item(String aUnlocalized, String aEnglish, String aTooltip, int aMaxDamage, int aEntityDamage,
+ boolean aSwingIfUsed, int aChargedGTID, int aDisChargedGTID, int aToolQuality, float aToolStrength) {
+ super(aUnlocalized, aEnglish, aTooltip);
+ setMaxDamage(aMaxDamage);
+ setMaxStackSize(1);
+ setNoRepair();
+ setFull3D();
+ GT_ModHandler.registerBoxableItemToToolBox(new ItemStack(this));
+ }
+}
diff --git a/src/main/java/gregtech/api/logic/AbstractProcessingLogic.java b/src/main/java/gregtech/api/logic/AbstractProcessingLogic.java
new file mode 100644
index 0000000000..ae78bbacc2
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/AbstractProcessingLogic.java
@@ -0,0 +1,346 @@
+package gregtech.api.logic;
+
+import java.util.function.Supplier;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.interfaces.tileentity.IVoidable;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+
+/**
+ * Logic class to calculate result of recipe check from inputs.
+ */
+@SuppressWarnings({ "unused", "UnusedReturnValue" })
+public abstract class AbstractProcessingLogic<P extends AbstractProcessingLogic<P>> {
+
+ protected IVoidable machine;
+ protected Supplier<RecipeMap<?>> recipeMapSupplier;
+ protected GT_Recipe lastRecipe;
+ protected RecipeMap<?> lastRecipeMap;
+ protected ItemStack[] outputItems;
+ protected FluidStack[] outputFluids;
+ protected long calculatedEut;
+ protected int duration;
+ protected long availableVoltage;
+ protected long availableAmperage;
+ protected int overClockTimeReduction = 1;
+ protected int overClockPowerIncrease = 2;
+ protected boolean protectItems;
+ protected boolean protectFluids;
+ protected int maxParallel = 1;
+ protected Supplier<Integer> maxParallelSupplier;
+ protected int calculatedParallels = 0;
+ protected int batchSize = 1;
+ protected float euModifier = 1.0f;
+ protected float speedBoost = 1.0f;
+ protected boolean amperageOC = true;
+ protected boolean isCleanroom;
+
+ // #region Setters
+
+ /**
+ * Overwrites item output result of the calculation.
+ */
+ public P setOutputItems(ItemStack... itemOutputs) {
+ this.outputItems = itemOutputs;
+ return getThis();
+ }
+
+ /**
+ * Overwrites fluid output result of the calculation.
+ */
+ public P setOutputFluids(FluidStack... fluidOutputs) {
+ this.outputFluids = fluidOutputs;
+ return getThis();
+ }
+
+ public P setIsCleanroom(boolean isCleanroom) {
+ this.isCleanroom = isCleanroom;
+ return getThis();
+ }
+
+ /**
+ * Sets max amount of parallel.
+ */
+ public P setMaxParallel(int maxParallel) {
+ this.maxParallel = maxParallel;
+ return getThis();
+ }
+
+ /**
+ * Sets method to get max amount of parallel.
+ */
+ public P setMaxParallelSupplier(Supplier<Integer> supplier) {
+ this.maxParallelSupplier = supplier;
+ return getThis();
+ }
+
+ /**
+ * Sets batch size for batch mode.
+ */
+ public P setBatchSize(int size) {
+ this.batchSize = size;
+ return getThis();
+ }
+
+ public P setRecipeMap(RecipeMap<?> recipeMap) {
+ return setRecipeMapSupplier(() -> recipeMap);
+ }
+
+ public P setRecipeMapSupplier(Supplier<RecipeMap<?>> supplier) {
+ this.recipeMapSupplier = supplier;
+ return getThis();
+ }
+
+ public P setEuModifier(float modifier) {
+ this.euModifier = modifier;
+ return getThis();
+ }
+
+ public P setSpeedBonus(float speedModifier) {
+ this.speedBoost = speedModifier;
+ return getThis();
+ }
+
+ /**
+ * Sets machine used for void protection logic.
+ */
+ public P setMachine(IVoidable machine) {
+ this.machine = machine;
+ return getThis();
+ }
+
+ /**
+ * Overwrites duration result of the calculation.
+ */
+ public P setDuration(int duration) {
+ this.duration = duration;
+ return getThis();
+ }
+
+ /**
+ * Overwrites EU/t result of the calculation.
+ */
+ public P setCalculatedEut(long calculatedEut) {
+ this.calculatedEut = calculatedEut;
+ return getThis();
+ }
+
+ /**
+ * Sets voltage of the machine. It doesn't need to be actual voltage (excluding amperage) of the machine;
+ * For example, most of the multiblock machines set maximum possible input power (including amperage) as voltage
+ * and 1 as amperage. That way recipemap search will be executed with overclocked voltage.
+ */
+ public P setAvailableVoltage(long voltage) {
+ availableVoltage = voltage;
+ return getThis();
+ }
+
+ /**
+ * Sets amperage of the machine. This amperage doesn't involve in EU/t when searching recipemap.
+ * Useful for preventing tier skip but still considering amperage for parallel.
+ */
+ public P setAvailableAmperage(long amperage) {
+ availableAmperage = amperage;
+ return getThis();
+ }
+
+ public P setVoidProtection(boolean protectItems, boolean protectFluids) {
+ this.protectItems = protectItems;
+ this.protectFluids = protectFluids;
+ return getThis();
+ }
+
+ /**
+ * Sets custom overclock ratio. 2/4 by default.
+ * Parameters represent number of bit shift, so 1 -> 2x, 2 -> 4x.
+ */
+ public P setOverclock(int timeReduction, int powerIncrease) {
+ this.overClockTimeReduction = timeReduction;
+ this.overClockPowerIncrease = powerIncrease;
+ return getThis();
+ }
+
+ /**
+ * Sets overclock ratio to 4/4.
+ */
+ public P enablePerfectOverclock() {
+ return this.setOverclock(2, 2);
+ }
+
+ /**
+ * Sets whether the multi should use amperage to OC or not
+ */
+ public P setAmperageOC(boolean amperageOC) {
+ this.amperageOC = amperageOC;
+ return getThis();
+ }
+
+ /**
+ * Clears calculated results (and provided machine inputs) to prepare for the next machine operation.
+ */
+ public P clear() {
+ this.calculatedEut = 0;
+ this.duration = 0;
+ this.calculatedParallels = 0;
+ return getThis();
+ }
+
+ // #endregion
+
+ // #region Logic
+
+ /**
+ * Executes the recipe check: Find recipe from recipemap, Calculate parallel, overclock and outputs.
+ */
+ @Nonnull
+ public abstract CheckRecipeResult process();
+
+ /**
+ * Refreshes recipemap to use. Remember to call this before {@link #process} to make sure correct recipemap is used.
+ *
+ * @return Recipemap to use now
+ */
+ protected RecipeMap<?> preProcess() {
+ RecipeMap<?> recipeMap;
+ if (recipeMapSupplier == null) {
+ recipeMap = null;
+ } else {
+ recipeMap = recipeMapSupplier.get();
+ }
+ if (lastRecipeMap != recipeMap) {
+ lastRecipe = null;
+ lastRecipeMap = recipeMap;
+ }
+
+ if (maxParallelSupplier != null) {
+ maxParallel = maxParallelSupplier.get();
+ }
+
+ return recipeMap;
+ }
+
+ /**
+ * Check has been succeeded, so it applies the recipe and calculated parameters.
+ * At this point, inputs have been already consumed.
+ */
+ @Nonnull
+ protected CheckRecipeResult applyRecipe(@Nonnull GT_Recipe recipe, @Nonnull GT_ParallelHelper helper,
+ @Nonnull GT_OverclockCalculator calculator, @Nonnull CheckRecipeResult result) {
+ if (recipe.mCanBeBuffered) {
+ lastRecipe = recipe;
+ } else {
+ lastRecipe = null;
+ }
+ calculatedParallels = helper.getCurrentParallel();
+
+ if (calculator.getConsumption() == Long.MAX_VALUE) {
+ return CheckRecipeResultRegistry.POWER_OVERFLOW;
+ }
+ if (calculator.getDuration() == Integer.MAX_VALUE) {
+ return CheckRecipeResultRegistry.DURATION_OVERFLOW;
+ }
+
+ calculatedEut = calculator.getConsumption();
+
+ double finalDuration = calculateDuration(recipe, helper, calculator);
+ if (finalDuration >= Integer.MAX_VALUE) {
+ return CheckRecipeResultRegistry.DURATION_OVERFLOW;
+ }
+ duration = (int) finalDuration;
+
+ CheckRecipeResult hookResult = onRecipeStart(recipe);
+ if (!hookResult.wasSuccessful()) {
+ return hookResult;
+ }
+
+ outputItems = helper.getItemOutputs();
+ outputFluids = helper.getFluidOutputs();
+
+ return result;
+ }
+
+ /**
+ * Override to tweak final duration that will be set as a result of this logic class.
+ */
+ protected double calculateDuration(@Nonnull GT_Recipe recipe, @Nonnull GT_ParallelHelper helper,
+ @Nonnull GT_OverclockCalculator calculator) {
+ return calculator.getDuration() * helper.getDurationMultiplierDouble();
+ }
+
+ /**
+ * Override to do additional check for found recipe if needed.
+ */
+ @Nonnull
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ /**
+ * Override to perform additional logic when recipe starts.
+ *
+ * This is called when the recipe processing logic has finished all
+ * checks, consumed all inputs, but has not yet set the outputs to
+ * be produced. Returning a result other than SUCCESSFUL will void
+ * all inputs!
+ */
+ @Nonnull
+ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) {
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ /**
+ * Override to tweak overclock logic if needed.
+ */
+ @Nonnull
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return new GT_OverclockCalculator().setRecipeEUt(recipe.mEUt)
+ .setAmperage(availableAmperage)
+ .setEUt(availableVoltage)
+ .setDuration(recipe.mDuration)
+ .setSpeedBoost(speedBoost)
+ .setEUtDiscount(euModifier)
+ .setAmperageOC(amperageOC)
+ .setDurationDecreasePerOC(overClockTimeReduction)
+ .setEUtIncreasePerOC(overClockPowerIncrease);
+ }
+ // #endregion
+
+ // #region Getters
+
+ public ItemStack[] getOutputItems() {
+ return outputItems;
+ }
+
+ public FluidStack[] getOutputFluids() {
+ return outputFluids;
+ }
+
+ public int getDuration() {
+ return duration;
+ }
+
+ public long getCalculatedEut() {
+ return calculatedEut;
+ }
+
+ public int getCurrentParallels() {
+ return calculatedParallels;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Nonnull
+ public P getThis() {
+ return (P) this;
+ }
+
+ // #endregion
+}
diff --git a/src/main/java/gregtech/api/logic/ComplexParallelProcessingLogic.java b/src/main/java/gregtech/api/logic/ComplexParallelProcessingLogic.java
new file mode 100644
index 0000000000..72a74ebd04
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/ComplexParallelProcessingLogic.java
@@ -0,0 +1,121 @@
+package gregtech.api.logic;
+
+import java.util.stream.LongStream;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+public class ComplexParallelProcessingLogic<P extends ComplexParallelProcessingLogic<P>>
+ extends MuTEProcessingLogic<P> {
+
+ protected int maxComplexParallels;
+ protected ItemStack[][] outputItems;
+ protected FluidStack[][] outputFluids;
+ protected long[] calculatedEutValues;
+ protected int[] durations;
+ protected int[] progresses;
+
+ public P setMaxComplexParallel(int maxComplexParallels) {
+ this.maxComplexParallels = maxComplexParallels;
+ reinitializeProcessingArrays();
+ return getThis();
+ }
+
+ public ItemStack[] getOutputItems(int index) {
+ if (index >= 0 && index < maxComplexParallels) {
+ return outputItems[index];
+ }
+ return null;
+ }
+
+ public FluidStack[] getOutputFluids(int index) {
+ if (index >= 0 && index < maxComplexParallels) {
+ return outputFluids[index];
+ }
+ return null;
+ }
+
+ @Override
+ public boolean canWork() {
+ for (int i = 0; i < maxComplexParallels; i++) {
+ if (progresses[i] >= durations[i]) {
+ return machineHost.isAllowedToWork();
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public long getCalculatedEut() {
+ return LongStream.of(this.calculatedEutValues)
+ .sum();
+ }
+
+ public int getDuration(int index) {
+ return durations[index];
+ }
+
+ public int getProgress(int index) {
+ return progresses[index];
+ }
+
+ @Override
+ public void progress() {
+ for (int i = 0; i < maxComplexParallels; i++) {
+ if (progresses[i] == durations[i]) {
+ progresses[i] = 0;
+ durations[i] = 0;
+ output(i);
+ continue;
+ }
+ progresses[i] = progresses[i] + 1;
+ }
+ }
+
+ @Override
+ public void startCheck() {
+ for (int i = 0; i < maxComplexParallels; i++) {
+ if (durations[i] > 0) continue;
+ recipeResult = process();
+ calculatedEutValues[i] = calculatedEut;
+ durations[i] = duration;
+ progresses[i] = 0;
+ outputItems[i] = getOutputItems();
+ outputFluids[i] = getOutputFluids();
+ }
+ }
+
+ protected void output(int index) {
+ setOutputItems(getOutputItems(index));
+ setOutputFluids(getOutputFluids(index));
+ output();
+ }
+
+ protected void reinitializeProcessingArrays() {
+ ItemStack[][] oldOutputItems = outputItems;
+ FluidStack[][] oldOutputFluids = outputFluids;
+ long[] oldCalculatedEutValues = calculatedEutValues;
+ int[] oldDurations = durations;
+ int[] oldProgresses = progresses;
+ outputItems = new ItemStack[maxComplexParallels][];
+ outputFluids = new FluidStack[maxComplexParallels][];
+ calculatedEutValues = new long[maxComplexParallels];
+ durations = new int[maxComplexParallels];
+ progresses = new int[maxComplexParallels];
+ for (int i = 0; i < oldOutputItems.length; i++) {
+ outputItems[i] = oldOutputItems[i];
+ }
+ for (int i = 0; i < oldOutputFluids.length; i++) {
+ outputFluids[i] = oldOutputFluids[i];
+ }
+ for (int i = 0; i < oldCalculatedEutValues.length; i++) {
+ calculatedEutValues[i] = oldCalculatedEutValues[i];
+ }
+ for (int i = 0; i < oldDurations[i]; i++) {
+ durations[i] = oldDurations[i];
+ }
+ for (int i = 0; i < oldProgresses.length; i++) {
+ progresses[i] = oldProgresses[i];
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/logic/ControllerFluidLogic.java b/src/main/java/gregtech/api/logic/ControllerFluidLogic.java
new file mode 100644
index 0000000000..211c1c2982
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/ControllerFluidLogic.java
@@ -0,0 +1,152 @@
+package gregtech.api.logic;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraftforge.common.util.Constants;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+/**
+ * Controller logic for Fluid inventories
+ *
+ * @author BlueWeabo
+ */
+public class ControllerFluidLogic {
+
+ private final Map<UUID, FluidInventoryLogic> inventories = new HashMap<>();
+ private final Set<Pair<UUID, FluidInventoryLogic>> unallocatedInventories = new HashSet<>();
+
+ public void addInventory(@Nonnull UUID id, @Nonnull FluidInventoryLogic inventory) {
+ Pair<UUID, FluidInventoryLogic> found = checkIfInventoryExistsAsUnallocated(inventory);
+ if (inventory.isUpgradeInventory() && found != null) {
+ unallocatedInventories.remove(found);
+ inventories.put(id, found.getRight());
+ return;
+ }
+ inventories.put(id, inventory);
+ }
+
+ @Nonnull
+ public UUID addInventory(@Nonnull FluidInventoryLogic inventory) {
+ Pair<UUID, FluidInventoryLogic> found = checkIfInventoryExistsAsUnallocated(inventory);
+ if (inventory.isUpgradeInventory() && found != null) {
+ unallocatedInventories.remove(found);
+ inventories.put(found.getLeft(), found.getRight());
+ return Objects.requireNonNull(found.getLeft());
+ }
+ UUID generatedUUID = Objects.requireNonNull(UUID.randomUUID());
+ inventories.put(generatedUUID, inventory);
+ return generatedUUID;
+ }
+
+ @Nullable
+ private Pair<UUID, FluidInventoryLogic> checkIfInventoryExistsAsUnallocated(
+ @Nonnull FluidInventoryLogic inventory) {
+ if (unallocatedInventories.size() == 0) {
+ return null;
+ }
+ return unallocatedInventories.stream()
+ .filter(
+ unallocated -> unallocated.getRight()
+ .getTier() == inventory.getTier())
+ .findFirst()
+ .get();
+ }
+
+ /**
+ * Removes the inventory with said id and gives it back to be processed if needed.
+ */
+ @Nonnull
+ public FluidInventoryLogic removeInventory(@Nonnull UUID id) {
+ return Objects.requireNonNull(inventories.remove(id));
+ }
+
+ @Nonnull
+ public FluidInventoryLogic getAllInventoryLogics() {
+ return new FluidInventoryLogic(
+ inventories.values()
+ .stream()
+ .map(inv -> inv.getInventory())
+ .collect(Collectors.toList()));
+ }
+
+ @Nonnull
+ public FluidInventoryLogic getInventoryLogic(@Nullable UUID id) {
+ if (id == null) return getAllInventoryLogics();
+ return Objects.requireNonNull(inventories.getOrDefault(id, getAllInventoryLogics()));
+ }
+
+ @Nonnull
+ public Set<Entry<UUID, FluidInventoryLogic>> getAllInventoryLogicsAsEntrySet() {
+ return Objects.requireNonNull(inventories.entrySet());
+ }
+
+ @Nonnull
+ public String getInventoryDisplayName(@Nullable UUID id) {
+ if (id == null) return "";
+ FluidInventoryLogic logic = inventories.get(id);
+ if (logic == null) return "";
+ String displayName = logic.getDisplayName();
+ if (displayName == null) return Objects.requireNonNull(id.toString());
+ return displayName;
+ }
+
+ public void setInventoryDisplayName(@Nullable UUID id, @Nullable String displayName) {
+ if (id == null) return;
+ FluidInventoryLogic logic = inventories.get(id);
+ if (logic == null) return;
+ logic.setDisplayName(displayName);
+ }
+
+ @Nonnull
+ public NBTTagCompound saveToNBT() {
+ NBTTagCompound nbt = new NBTTagCompound();
+ NBTTagList inventoriesNBT = new NBTTagList();
+ inventories.forEach((uuid, inventory) -> {
+ NBTTagCompound inventoryNBT = new NBTTagCompound();
+ inventoryNBT.setTag("inventory", inventory.saveToNBT());
+ inventoryNBT.setString("uuid", uuid.toString());
+ inventoryNBT.setInteger(
+ "invSize",
+ inventory.getInventory()
+ .getTanks());
+ inventoryNBT.setLong(
+ "tankCapacity",
+ inventory.getInventory()
+ .getTankCapacity(0));
+ inventoriesNBT.appendTag(inventoryNBT);
+ });
+ nbt.setTag("inventories", inventoriesNBT);
+ return nbt;
+ }
+
+ public void loadFromNBT(@Nonnull NBTTagCompound nbt) {
+ NBTTagList inventoriesNBT = nbt.getTagList("inventories", Constants.NBT.TAG_COMPOUND);
+ if (inventoriesNBT == null) return;
+ for (int i = 0; i < inventoriesNBT.tagCount(); i++) {
+ NBTTagCompound inventoryNBT = inventoriesNBT.getCompoundTagAt(i);
+ UUID uuid = UUID.fromString(inventoryNBT.getString("uuid"));
+ FluidInventoryLogic inventory = new FluidInventoryLogic(
+ inventoryNBT.getInteger("invSize"),
+ inventoryNBT.getLong("tankCapacity"));
+ inventory.loadFromNBT(inventoryNBT.getCompoundTag("inventory"));
+ if (inventory.isUpgradeInventory()) {
+ unallocatedInventories.add(Pair.of(uuid, inventory));
+ } else {
+ inventories.put(uuid, inventory);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/logic/ControllerItemLogic.java b/src/main/java/gregtech/api/logic/ControllerItemLogic.java
new file mode 100644
index 0000000000..2863c2f49c
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/ControllerItemLogic.java
@@ -0,0 +1,148 @@
+package gregtech.api.logic;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraftforge.common.util.Constants;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+/**
+ * Logic of the Item logic for the controller. This is controlling all of the inventories.
+ *
+ * @author BlueWeabo
+ */
+public class ControllerItemLogic {
+
+ private final Map<UUID, ItemInventoryLogic> inventories = new HashMap<>();
+ private final Set<Pair<UUID, ItemInventoryLogic>> unallocatedInventories = new HashSet<>();
+
+ public void addInventory(@Nonnull UUID id, @Nonnull ItemInventoryLogic inventory) {
+ Pair<UUID, ItemInventoryLogic> found = checkIfInventoryExistsAsUnallocated(inventory);
+ if (inventory.isUpgradeInventory() && found != null) {
+ unallocatedInventories.remove(found);
+ inventories.put(id, found.getRight());
+ return;
+ }
+ inventories.put(id, inventory);
+ }
+
+ @Nonnull
+ public UUID addInventory(@Nonnull ItemInventoryLogic inventory) {
+ Pair<UUID, ItemInventoryLogic> found = checkIfInventoryExistsAsUnallocated(inventory);
+ if (inventory.isUpgradeInventory() && found != null) {
+ unallocatedInventories.remove(found);
+ inventories.put(found.getLeft(), found.getRight());
+ return Objects.requireNonNull(found.getLeft());
+ }
+ UUID generatedUUID = Objects.requireNonNull(UUID.randomUUID());
+ inventories.put(generatedUUID, inventory);
+ return generatedUUID;
+ }
+
+ @Nullable
+ private Pair<UUID, ItemInventoryLogic> checkIfInventoryExistsAsUnallocated(@Nonnull ItemInventoryLogic inventory) {
+ if (unallocatedInventories.size() == 0) {
+ return null;
+ }
+ return unallocatedInventories.stream()
+ .filter(
+ unallocated -> unallocated.getRight()
+ .getTier() == inventory.getTier()
+ && unallocated.getRight()
+ .getSlots() == inventory.getSlots())
+ .findFirst()
+ .get();
+ }
+
+ /**
+ * Removes the inventory with said id and gives it back to be processed if needed.
+ */
+ @Nonnull
+ public ItemInventoryLogic removeInventory(@Nonnull UUID id) {
+ return Objects.requireNonNull(inventories.remove(id));
+ }
+
+ @Nonnull
+ public ItemInventoryLogic getAllInventoryLogics() {
+ return new ItemInventoryLogic(
+ inventories.values()
+ .stream()
+ .map(inv -> inv.getInventory())
+ .collect(Collectors.toList()));
+ }
+
+ @Nonnull
+ public ItemInventoryLogic getInventoryLogic(@Nullable UUID id) {
+ if (id == null) return getAllInventoryLogics();
+ return Objects.requireNonNull(inventories.getOrDefault(id, getAllInventoryLogics()));
+ }
+
+ @Nonnull
+ public Set<Entry<UUID, ItemInventoryLogic>> getAllInventoryLogicsAsEntrySet() {
+ return Objects.requireNonNull(inventories.entrySet());
+ }
+
+ @Nullable
+ public String getInventoryDisplayName(@Nullable UUID id) {
+ if (id == null) return "";
+ ItemInventoryLogic logic = inventories.get(id);
+ if (logic == null) return "";
+ String displayName = logic.getDisplayName();
+ if (displayName == null) return Objects.requireNonNull(id.toString());
+ return displayName;
+ }
+
+ public void setInventoryDisplayName(@Nullable UUID id, @Nullable String displayName) {
+ if (id == null) return;
+ ItemInventoryLogic logic = inventories.get(id);
+ if (logic == null) return;
+ logic.setDisplayName(displayName);
+ }
+
+ @Nonnull
+ public NBTTagCompound saveToNBT() {
+ NBTTagCompound nbt = new NBTTagCompound();
+ NBTTagList inventoriesNBT = new NBTTagList();
+ inventories.forEach((uuid, inventory) -> {
+ NBTTagCompound inventoryNBT = new NBTTagCompound();
+ inventoryNBT.setTag("inventory", inventory.saveToNBT());
+ inventoryNBT.setString("uuid", uuid.toString());
+ inventoryNBT.setInteger(
+ "invSize",
+ inventory.getInventory()
+ .getSlots());
+ inventoriesNBT.appendTag(inventoryNBT);
+ });
+ nbt.setTag("inventories", inventoriesNBT);
+ return nbt;
+ }
+
+ public void loadFromNBT(@Nonnull NBTTagCompound nbt) {
+ NBTTagList inventoriesNBT = nbt.getTagList("inventories", Constants.NBT.TAG_COMPOUND);
+ if (inventoriesNBT == null) return;
+ for (int i = 0; i < inventoriesNBT.tagCount(); i++) {
+ NBTTagCompound inventoryNBT = inventoriesNBT.getCompoundTagAt(i);
+ UUID uuid = UUID.fromString(inventoryNBT.getString("uuid"));
+ ItemInventoryLogic inventory = new ItemInventoryLogic(inventoryNBT.getInteger("invSize"));
+ NBTTagCompound internalInventoryNBT = inventoryNBT.getCompoundTag("inventory");
+ if (internalInventoryNBT != null) inventory.loadFromNBT(internalInventoryNBT);
+ if (inventory.isUpgradeInventory()) {
+ unallocatedInventories.add(Pair.of(uuid, inventory));
+ } else {
+ inventories.put(uuid, inventory);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/logic/FluidInventoryLogic.java b/src/main/java/gregtech/api/logic/FluidInventoryLogic.java
new file mode 100644
index 0000000000..88c0c954ec
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/FluidInventoryLogic.java
@@ -0,0 +1,269 @@
+package gregtech.api.logic;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizons.modularui.api.fluids.FluidTanksHandler;
+import com.gtnewhorizons.modularui.api.fluids.IFluidTankLong;
+import com.gtnewhorizons.modularui.api.fluids.IFluidTanksHandler;
+import com.gtnewhorizons.modularui.api.fluids.ListFluidHandler;
+import com.gtnewhorizons.modularui.api.math.Size;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
+import com.gtnewhorizons.modularui.common.widget.Scrollable;
+
+/**
+ * Generic Fluid logic for MuTEs.
+ *
+ * @author BlueWeabo
+ */
+public class FluidInventoryLogic {
+
+ private static final int DEFAULT_COLUMNS_PER_ROW = 4;
+ private static final int POSITION_INTERVAL = 18;
+ private static final Size SIZE = new Size(18, 18);
+
+ protected String displayName = "";
+ @Nonnull
+ protected final IFluidTanksHandler inventory;
+ protected final Map<Fluid, IFluidTankLong> fluidToTankMap;
+ protected int tier = 0;
+ protected boolean isUpgradeInventory = false;
+
+ public FluidInventoryLogic(int numberOfSlots, long capacityOfEachTank) {
+ this(new FluidTanksHandler(numberOfSlots, capacityOfEachTank), 0, false);
+ }
+
+ public FluidInventoryLogic(int numberOfSlots, long capacityOfEachTank, int tier) {
+ this(new FluidTanksHandler(numberOfSlots, capacityOfEachTank), tier, false);
+ }
+
+ public FluidInventoryLogic(int numberOfSlots, long capacityOfEachTank, int tier, boolean isUpgradeInventory) {
+ this(new FluidTanksHandler(numberOfSlots, capacityOfEachTank), tier, isUpgradeInventory);
+ }
+
+ public FluidInventoryLogic(@Nonnull IFluidTanksHandler inventory, int tier, boolean isUpgradeInventory) {
+ this.inventory = inventory;
+ fluidToTankMap = new HashMap<>(inventory.getTanks());
+ this.tier = tier;
+ this.isUpgradeInventory = isUpgradeInventory;
+ }
+
+ public FluidInventoryLogic(Collection<IFluidTanksHandler> inventories) {
+ this(new ListFluidHandler(inventories), -1, false);
+ }
+
+ @Nullable
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public int getTier() {
+ return tier;
+ }
+
+ public boolean isUpgradeInventory() {
+ return isUpgradeInventory;
+ }
+
+ public void setDisplayName(@Nullable String displayName) {
+ this.displayName = displayName;
+ }
+
+ /**
+ *
+ * @return The Fluid Inventory Logic as an NBTTagList to be saved in another nbt as how one wants.
+ */
+ @Nonnull
+ public NBTTagCompound saveToNBT() {
+ final NBTTagCompound nbt = new NBTTagCompound();
+ final NBTTagList tList = new NBTTagList();
+ for (int tankNumber = 0; tankNumber < inventory.getTanks(); tankNumber++) {
+ final IFluidTankLong tank = inventory.getFluidTank(tankNumber);
+ if (tank == null) continue;
+
+ final NBTTagCompound tag = new NBTTagCompound();
+ tag.setByte("s", (byte) tankNumber);
+ tank.saveToNBT(tag);
+ tList.appendTag(tag);
+ }
+ nbt.setTag("inventory", tList);
+ nbt.setInteger("tier", tier);
+ if (displayName != null) {
+ nbt.setString("displayName", displayName);
+ }
+ nbt.setBoolean("isUpgradeInventory", isUpgradeInventory);
+ return nbt;
+ }
+
+ /**
+ * Loads the Item Inventory Logic from an NBTTagList.
+ */
+ public void loadFromNBT(@Nonnull NBTTagCompound nbt) {
+ NBTTagList nbtList = nbt.getTagList("inventory", Constants.NBT.TAG_COMPOUND);
+ for (int i = 0; i < nbtList.tagCount(); i++) {
+ final NBTTagCompound tankNBT = nbtList.getCompoundTagAt(i);
+ final int tank = tankNBT.getShort("s");
+ if (tank >= 0 && tank < inventory.getTanks()) inventory.getFluidTank(tank)
+ .loadFromNBT(tankNBT);
+ if (inventory.getFluidInTank(tank) != null) {
+ fluidToTankMap.put(inventory.getFluidInTank(tank), inventory.getFluidTank(tank));
+ }
+ }
+ tier = nbt.getInteger("tier");
+ if (nbt.hasKey("displayName")) {
+ displayName = nbt.getString("displayName");
+ }
+ isUpgradeInventory = nbt.getBoolean("isUpgradeInventory");
+ }
+
+ @Nonnull
+ public IFluidTanksHandler getInventory() {
+ return inventory;
+ }
+
+ @Nonnull
+ public FluidStack[] getStoredFluids() {
+ final FluidStack[] fluids = inventory.getFluids()
+ .stream()
+ .filter(fluid -> fluid != null)
+ .collect(Collectors.toList())
+ .toArray(new FluidStack[0]);
+ if (fluids == null) {
+ return new FluidStack[0];
+ }
+ return fluids;
+ }
+
+ public boolean isFluidValid(@Nullable Fluid fluid) {
+ return fluid != null;
+ }
+
+ /**
+ * @param fluid What we are trying to input
+ * @param amount amount of fluid we are trying to put
+ * @return amount of fluid filled into the tank
+ */
+ public long fill(@Nullable Fluid fluid, long amount, boolean simulate) {
+ if (!isFluidValid(fluid)) return 0;
+ IFluidTankLong tank = fluidToTankMap.get(fluid);
+ if (tank != null) {
+ return tank.fill(fluid, amount, !simulate);
+ }
+ int tankNumber = 0;
+ tank = inventory.getFluidTank(tankNumber++);
+ while (tank.getStoredFluid() != fluid && tank.getStoredFluid() != null) {
+ tank = inventory.getFluidTank(tankNumber++);
+ }
+ fluidToTankMap.put(fluid, tank);
+ return tank.fill(fluid, amount, !simulate);
+ }
+
+ @Nullable
+ public FluidStack fill(@Nullable FluidStack fluid) {
+ if (fluid == null) return null;
+ for (int i = 0; i < inventory.getTanks(); i++) {
+ fill(fluid.getFluid(), fluid.amount, false);
+ }
+ return fluid;
+ }
+
+ /**
+ * Try and drain the first fluid found for that amount. Used by GT_Cover_Pump
+ *
+ * @param amount Fluid to drain from the tank
+ * @return A fluidstack with the possible amount drained
+ */
+ @Nullable
+ public FluidStack drain(long amount, boolean simulate) {
+ for (int i = 0; i < inventory.getTanks(); i++) {
+ Fluid fluid = inventory.getFluidInTank(i);
+ FluidStack drained = drain(fluid, amount, simulate);
+ if (drained != null) return drained;
+ }
+
+ return null;
+ }
+
+ @Nullable
+ public FluidStack drain(Fluid fluid, long amount, boolean simulate) {
+ if (!isFluidValid(fluid)) return null;
+ IFluidTankLong tank = fluidToTankMap.get(fluid);
+ if (tank != null) {
+ return tank.drain(amount, !simulate);
+ }
+ int tankNumber = 0;
+ tank = inventory.getFluidTank(tankNumber++);
+ while (tank.getStoredFluid() != fluid) {
+ tank = inventory.getFluidTank(tankNumber++);
+ }
+ fluidToTankMap.put(fluid, tank);
+ return tank.drain(amount, !simulate);
+ }
+
+ public void update() {
+ for (int i = 0; i < inventory.getTanks(); i++) {
+ IFluidTankLong tank = inventory.getFluidTank(i);
+ if (tank.getFluidAmountLong() > 0) continue;
+ tank.setFluid(null, 0);
+ }
+ }
+
+ public long calculateAmountOfTimesFluidCanBeTaken(Fluid fluid, long amountToTake) {
+ if (!isFluidValid(fluid)) return 0;
+ IFluidTankLong tank = fluidToTankMap.get(fluid);
+ if (tank == null) return 0;
+ return tank.getFluidAmountLong() / amountToTake;
+ }
+
+ @Nonnull
+ public Map<Fluid, Long> getMapOfStoredFluids() {
+ Map<Fluid, Long> map = new HashMap<>();
+ for (int i = 0; i < inventory.getTanks(); i++) {
+ IFluidTankLong tank = inventory.getFluidTank(i);
+ if (tank == null) continue;
+ Fluid fluid = tank.getStoredFluid();
+ if (fluid == null) continue;
+ map.put(fluid, map.getOrDefault(fluid, 0L) + tank.getFluidAmountLong());
+ }
+ return map;
+ }
+
+ /**
+ * Return a scrollable widget with only the inventory.
+ */
+ @Nonnull
+ public Widget getGuiPart() {
+ return getGUIPart(DEFAULT_COLUMNS_PER_ROW);
+ }
+
+ /**
+ * Return a scrollable widget with only the inventory.
+ */
+ @Nonnull
+ public Widget getGUIPart(int columnsPerRow) {
+ final Scrollable scrollable = new Scrollable();
+ scrollable.setVerticalScroll();
+ for (int rows = 0; rows * 4 < inventory.getTanks(); rows++) {
+ final int columnsToMake = Math.min(inventory.getTanks() - rows * 4, 4);
+ for (int column = 0; column < columnsToMake; column++) {
+ final FluidSlotWidget fluidSlot = new FluidSlotWidget(inventory, rows * 4 + column);
+ scrollable.widget(
+ fluidSlot.setPos(column * POSITION_INTERVAL, rows * POSITION_INTERVAL)
+ .setSize(SIZE));
+ }
+ }
+ return scrollable;
+ }
+}
diff --git a/src/main/java/gregtech/api/logic/ItemInventoryLogic.java b/src/main/java/gregtech/api/logic/ItemInventoryLogic.java
new file mode 100644
index 0000000000..69005216b8
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/ItemInventoryLogic.java
@@ -0,0 +1,314 @@
+package gregtech.api.logic;
+
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraftforge.common.util.Constants;
+
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.forge.ListItemHandler;
+import com.gtnewhorizons.modularui.api.math.Size;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.Scrollable;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.item.ItemHolder;
+
+/**
+ * Generic Item logic for MuTEs.
+ *
+ * @author BlueWeabo
+ */
+public class ItemInventoryLogic {
+
+ private static final int DEFAULT_COLUMNS_PER_ROW = 4;
+ private static final int POSITION_INTERVAL = 18;
+ private static final Size SIZE = new Size(18, 18);
+
+ protected String displayName;
+ @Nonnull
+ protected final IItemHandlerModifiable inventory;
+ protected UUID connectedFluidInventory;
+ protected int tier;
+ protected boolean isUpgradeInventory;
+ protected Map<ItemHolder, Long> cachedItemMap;
+ protected boolean inRecipeCheck;
+
+ public ItemInventoryLogic(int numberOfSlots) {
+ this(numberOfSlots, 0);
+ }
+
+ public ItemInventoryLogic(int numberOfSlots, int tier) {
+ this(new ItemStackHandler(numberOfSlots), tier, false);
+ }
+
+ public ItemInventoryLogic(int numberOfSlots, int tier, boolean isUpgradeInventory) {
+ this(new ItemStackHandler(numberOfSlots), tier, isUpgradeInventory);
+ }
+
+ public ItemInventoryLogic(@Nonnull IItemHandlerModifiable inventory, int tier, boolean isUpgradeInventory) {
+ this.inventory = inventory;
+ this.tier = tier;
+ this.isUpgradeInventory = isUpgradeInventory;
+ }
+
+ public ItemInventoryLogic(Collection<IItemHandlerModifiable> inventories) {
+ this(new ListItemHandler(inventories), -1, false);
+ }
+
+ @Nullable
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public int getTier() {
+ return tier;
+ }
+
+ public boolean isUpgradeInventory() {
+ return isUpgradeInventory;
+ }
+
+ public int getSlots() {
+ return getInventory().getSlots();
+ }
+
+ public void setDisplayName(@Nullable String displayName) {
+ this.displayName = displayName;
+ }
+
+ @Nullable
+ public UUID getConnectedFluidInventoryID() {
+ return connectedFluidInventory;
+ }
+
+ public void setConnectedFluidInventoryID(@Nullable UUID connectedFluidTank) {
+ this.connectedFluidInventory = connectedFluidTank;
+ }
+
+ /**
+ *
+ * @return The Item Inventory Logic as an NBTTagCompound to be saved in another nbt as how one wants.
+ */
+ @Nonnull
+ public NBTTagCompound saveToNBT() {
+ final NBTTagCompound nbt = new NBTTagCompound();
+ final NBTTagList tList = new NBTTagList();
+ for (int slot = 0; slot < inventory.getSlots(); slot++) {
+ final ItemStack tStack = inventory.getStackInSlot(slot);
+ if (tStack == null) continue;
+
+ final NBTTagCompound tag = new NBTTagCompound();
+ tag.setByte("s", (byte) slot);
+ tStack.writeToNBT(tag);
+ tList.appendTag(tag);
+ }
+ nbt.setTag("inventory", tList);
+ nbt.setInteger("tier", tier);
+ if (displayName != null) {
+ nbt.setString("displayName", displayName);
+ }
+ nbt.setBoolean("isUpgradeInventory", isUpgradeInventory);
+ if (connectedFluidInventory != null) {
+ nbt.setString("connectedFluidInventory", connectedFluidInventory.toString());
+ }
+ return nbt;
+ }
+
+ /**
+ * Loads the Item Inventory Logic from an NBTTagCompound.
+ */
+ public void loadFromNBT(@Nonnull NBTTagCompound nbt) {
+ tier = nbt.getInteger("tier");
+ if (nbt.hasKey("displayName")) {
+ displayName = nbt.getString("displayName");
+ }
+
+ isUpgradeInventory = nbt.getBoolean("isUpgradeInventory");
+ if (nbt.hasKey("connectedFluidInventory")) {
+ connectedFluidInventory = UUID.fromString(nbt.getString("connectedFluidInventory"));
+ }
+
+ NBTTagList nbtList = nbt.getTagList("inventory", Constants.NBT.TAG_COMPOUND);
+ if (nbtList == null) return;
+
+ for (int i = 0; i < nbtList.tagCount(); i++) {
+ final NBTTagCompound tNBT = nbtList.getCompoundTagAt(i);
+ final int tSlot = tNBT.getShort("s");
+ if (tSlot >= 0 && tSlot < inventory.getSlots()) {
+ inventory.setStackInSlot(tSlot, GT_Utility.loadItem(tNBT));
+ }
+ }
+ }
+
+ @Nonnull
+ public IItemHandlerModifiable getInventory() {
+ return inventory;
+ }
+
+ @Nonnull
+ public ItemStack[] getStoredItems() {
+ final ItemStack[] items = inventory.getStacks()
+ .stream()
+ .filter(item -> item != null)
+ .collect(Collectors.toList())
+ .toArray(new ItemStack[0]);
+ if (items == null) {
+ return new ItemStack[0];
+ }
+ return items;
+ }
+
+ public boolean isStackValid(ItemStack item) {
+ return true;
+ }
+
+ @Nullable
+ public ItemStack insertItem(ItemStack item) {
+ if (!isStackValid(item)) return item;
+ for (int i = 0; i < inventory.getSlots() && item != null && item.stackSize > 0; i++) {
+ item = inventory.insertItem(i, item, false);
+ }
+ return item;
+ }
+
+ @Nullable
+ public ItemStack extractItem(int slot, int amount) {
+ return inventory.extractItem(slot, amount, false);
+ }
+
+ public boolean subtractItemAmount(@Nonnull ItemHolder item, long amount, boolean simulate) {
+ Map<ItemHolder, Long> itemMap = getMapOfStoredItems();
+ if (!itemMap.containsKey(item)) {
+ return false;
+ }
+
+ if (itemMap.get(item) < amount) {
+ return false;
+ }
+
+ if (simulate) {
+ return true;
+ }
+
+ itemMap.put(item, itemMap.get(item) - amount);
+ return true;
+ }
+
+ @Nullable
+ public ItemStack getItemInSlot(int slot) {
+ return inventory.getStackInSlot(slot);
+ }
+
+ public void sort() {
+ Map<ItemHolder, Long> itemMap = getMapOfStoredItems();
+ List<ItemHolder> sortedItems = itemMap.keySet()
+ .stream()
+ .sorted(
+ Comparator.comparing(
+ a -> a.getItem()
+ .getUnlocalizedName() + a.getMeta()))
+ .collect(Collectors.toList());
+ putInItemsFromMap(itemMap, sortedItems);
+ }
+
+ public void update(boolean shouldSort) {
+ if (shouldSort) {
+ sort();
+ }
+
+ for (int i = 0; i < inventory.getSlots(); i++) {
+ ItemStack item = inventory.getStackInSlot(i);
+ if (item == null) continue;
+ if (item.stackSize > 0) continue;
+ inventory.setStackInSlot(i, null);
+ }
+ }
+
+ /**
+ * Return a scrollable widget with only the inventory.
+ */
+ @Nonnull
+ public Widget getGuiPart() {
+ return getGUIPart(DEFAULT_COLUMNS_PER_ROW);
+ }
+
+ /**
+ * Return a scrollable widget with only the inventory.
+ */
+ @Nonnull
+ public Widget getGUIPart(int columnsPerRow) {
+ final Scrollable scrollable = new Scrollable();
+ scrollable.setVerticalScroll();
+ for (int rows = 0; rows * columnsPerRow < Math.min(inventory.getSlots(), 128); rows++) {
+ final int columnsToMake = Math
+ .min(Math.min(inventory.getSlots(), 128) - rows * columnsPerRow, columnsPerRow);
+ for (int column = 0; column < columnsToMake; column++) {
+ scrollable.widget(
+ new SlotWidget(inventory, rows * columnsPerRow + column)
+ .setPos(column * POSITION_INTERVAL, rows * POSITION_INTERVAL)
+ .setSize(SIZE));
+ }
+ }
+ return scrollable;
+ }
+
+ public void startRecipeCheck() {
+ cachedItemMap = getMapOfStoredItems();
+ inRecipeCheck = true;
+ }
+
+ public void stopRecipeCheck() {
+ inRecipeCheck = false;
+ putInItemsFromMap(cachedItemMap, null);
+ cachedItemMap = null;
+ }
+
+ @Nonnull
+ public Map<ItemHolder, Long> getMapOfStoredItems() {
+ if (inRecipeCheck) return cachedItemMap;
+ Map<ItemHolder, Long> items = new HashMap<>();
+ for (int i = 0; i < inventory.getSlots(); i++) {
+ ItemStack item = extractItem(i, Integer.MAX_VALUE);
+ if (item == null) continue;
+ ItemHolder itemHolder = new ItemHolder(item);
+ items.put(itemHolder, items.getOrDefault(itemHolder, 0L) + item.stackSize);
+ }
+ return items;
+ }
+
+ protected void putInItemsFromMap(@Nonnull Map<ItemHolder, Long> itemMap, @Nullable List<ItemHolder> sortedList) {
+ for (ItemHolder itemHolder : (sortedList == null ? itemMap.keySet() : sortedList)) {
+ long itemAmount = itemMap.get(itemHolder);
+ ItemStack item = new ItemStack(itemHolder.getItem(), 0, itemHolder.getMeta());
+ item.setTagCompound(itemHolder.getNBT());
+ while (itemAmount > 0) {
+ item.stackSize = (int) Math.min(item.getMaxStackSize(), itemAmount);
+ itemAmount -= item.stackSize;
+ insertItem(item);
+ }
+ }
+ }
+
+ public long calculateAmountOfTimesItemCanBeTaken(ItemHolder item, long amount) {
+ return getMapOfStoredItems().getOrDefault(item, 0L) / amount;
+ }
+
+ public Set<ItemHolder> getSetOfStoredItems() {
+ return getMapOfStoredItems().keySet();
+ }
+}
diff --git a/src/main/java/gregtech/api/logic/ModelRenderLogic.java b/src/main/java/gregtech/api/logic/ModelRenderLogic.java
new file mode 100644
index 0000000000..d9f2fdcf27
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/ModelRenderLogic.java
@@ -0,0 +1,5 @@
+package gregtech.api.logic;
+
+public abstract class ModelRenderLogic {
+
+}
diff --git a/src/main/java/gregtech/api/logic/MuTEProcessingLogic.java b/src/main/java/gregtech/api/logic/MuTEProcessingLogic.java
new file mode 100644
index 0000000000..da53c8875d
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/MuTEProcessingLogic.java
@@ -0,0 +1,256 @@
+package gregtech.api.logic;
+
+import static net.minecraftforge.common.util.Constants.NBT.TAG_COMPOUND;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.Scrollable;
+
+import gregtech.api.enums.InventoryType;
+import gregtech.api.logic.interfaces.ProcessingLogicHost;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * Processing logic class, dedicated for MultiTileEntities.
+ */
+public class MuTEProcessingLogic<P extends MuTEProcessingLogic<P>> extends AbstractProcessingLogic<P> {
+
+ protected boolean hasWork;
+ protected int progress;
+ protected ProcessingLogicHost<P> machineHost;
+ @Nonnull
+ protected CheckRecipeResult recipeResult = CheckRecipeResultRegistry.NONE;
+ @Nullable
+ protected UUID itemOutputID;
+ @Nullable
+ protected UUID fluidOutputID;
+
+ public P setMachineHost(@Nonnull ProcessingLogicHost<P> machineHost) {
+ this.machineHost = machineHost;
+ return getThis();
+ }
+
+ // #region Logic
+
+ @Nonnull
+ @Override
+ public CheckRecipeResult process() {
+ RecipeMap<?> recipeMap = preProcess();
+
+ ItemInventoryLogic itemInput = null;
+ FluidInventoryLogic fluidInput = null;
+ if (machineHost.isInputSeparated()) {
+ for (Map.Entry<UUID, ItemInventoryLogic> itemEntry : machineHost
+ .getAllItemInventoryLogics(InventoryType.Input)) {
+ itemOutputID = Objects.requireNonNull(itemEntry.getKey());
+ itemInput = Objects.requireNonNull(itemEntry.getValue());
+ fluidInput = Objects.requireNonNull(
+ machineHost.getFluidLogic(InventoryType.Input, itemInput.getConnectedFluidInventoryID()));
+ fluidOutputID = itemInput.getConnectedFluidInventoryID();
+ }
+ } else {
+ itemInput = Objects.requireNonNull(machineHost.getItemLogic(InventoryType.Input, null));
+ fluidInput = Objects.requireNonNull(machineHost.getFluidLogic(InventoryType.Input, null));
+ }
+
+ CheckRecipeResult recipeValidatorResult = null;
+ if (recipeValidatorResult != null) {
+ return recipeValidatorResult;
+ }
+
+ return processRecipe(null, Objects.requireNonNull(itemInput), Objects.requireNonNull(fluidInput));
+ }
+
+ @Nonnull
+ protected CheckRecipeResult processRecipe(@Nonnull List<GT_Recipe> recipes, @Nonnull ItemInventoryLogic itemInput,
+ @Nonnull FluidInventoryLogic fluidInput) {
+ CheckRecipeResult result = CheckRecipeResultRegistry.INTERNAL_ERROR;
+ for (GT_Recipe recipe : recipes) {
+ Objects.requireNonNull(recipe);
+ GT_ParallelHelper helper = createParallelHelper(recipe, itemInput, fluidInput);
+ GT_OverclockCalculator calculator = createOverclockCalculator(recipe);
+ helper.setCalculator(calculator);
+ helper.build();
+ result = helper.getResult();
+ if (result.wasSuccessful()) {
+ return applyRecipe(recipe, helper, calculator, result);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Override if you don't work with regular gt recipe maps
+ */
+ @Nonnull
+ protected Object findRecipe(@Nullable RecipeMap<?> map, @Nonnull ItemInventoryLogic itemInput,
+ @Nonnull FluidInventoryLogic fluidInput) {
+ if (map == null) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Nonnull
+ protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe, @Nonnull ItemInventoryLogic itemInput,
+ @Nonnull FluidInventoryLogic fluidInput) {
+ return new GT_ParallelHelper().setRecipe(recipe)
+ .setItemInputInventory(itemInput)
+ .setFluidInputInventory(fluidInput)
+ .setAvailableEUt(availableVoltage * availableAmperage)
+ .setMaxParallel(maxParallel)
+ .setEUtModifier(euModifier)
+ .enableBatchMode(batchSize)
+ .setConsumption(true)
+ .setOutputCalculation(true)
+ .setMuTEMode(true);
+ }
+
+ // #endregion
+
+ // #region Getters
+
+ @Nonnull
+ public CheckRecipeResult getResult() {
+ return recipeResult;
+ }
+
+ public int getProgress() {
+ return progress;
+ }
+
+ // #endregion
+
+ // #region Other
+
+ public void startCheck() {
+ recipeResult = process();
+ }
+
+ public void progress() {
+ if (!hasWork) return;
+ if (progress == duration) {
+ progress = 0;
+ duration = 0;
+ calculatedEut = 0;
+ output();
+ return;
+ }
+ progress++;
+ }
+
+ protected void output() {
+ ItemInventoryLogic itemOutput = machineHost.getItemLogic(InventoryType.Output, itemOutputID);
+ FluidInventoryLogic fluidOutput = machineHost.getFluidLogic(InventoryType.Output, fluidOutputID);
+ if (itemOutput == null || fluidOutput == null) return;
+ for (ItemStack item : outputItems) {
+ if (item == null) continue;
+ itemOutput.insertItem(item);
+ }
+ for (FluidStack fluid : outputFluids) {
+ if (fluid == null) continue;
+ fluidOutput.fill(fluid.getFluid(), fluid.amount, false);
+ }
+ outputItems = new ItemStack[0];
+ outputFluids = new FluidStack[0];
+ }
+
+ public boolean canWork() {
+ return !hasWork && machineHost.isAllowedToWork();
+ }
+
+ /**
+ * By how much to increase the progress?
+ *
+ * @param progressAmount in ticks
+ */
+ public void increaseProgress(int progressAmount) {
+ progress += progressAmount;
+ }
+
+ public NBTTagCompound saveToNBT() {
+ NBTTagCompound logicNBT = new NBTTagCompound();
+ logicNBT.setLong("eutConsumption", calculatedEut);
+ logicNBT.setInteger("duration", duration);
+ logicNBT.setInteger("progress", progress);
+ logicNBT.setBoolean("hasWork", hasWork);
+ if (outputItems != null) {
+ NBTTagList itemOutputsNBT = new NBTTagList();
+ for (ItemStack item : outputItems) {
+ itemOutputsNBT.appendTag(GT_Utility.saveItem(item));
+ }
+ logicNBT.setTag("itemOutputs", itemOutputsNBT);
+ }
+ if (outputFluids != null) {
+ NBTTagList fluidOutputsNBT = new NBTTagList();
+ for (FluidStack fluid : outputFluids) {
+ fluidOutputsNBT.appendTag(fluid.writeToNBT(new NBTTagCompound()));
+ }
+ logicNBT.setTag("fluidOutputs", fluidOutputsNBT);
+ }
+ if (itemOutputID != null) {
+ logicNBT.setString("itemOutputID", itemOutputID.toString());
+ }
+ if (fluidOutputID != null) {
+ logicNBT.setString("fluidOutputID", fluidOutputID.toString());
+ }
+ return logicNBT;
+ }
+
+ public void loadFromNBT(@Nonnull NBTTagCompound logicNBT) {
+ calculatedEut = logicNBT.getLong("eutConsumption");
+ duration = logicNBT.getInteger("duration");
+ progress = logicNBT.getInteger("progress");
+ hasWork = logicNBT.getBoolean("hasWork");
+ if (logicNBT.hasKey("itemOutputs")) {
+ NBTTagList itemOutputsNBT = logicNBT.getTagList("itemOutputs", TAG_COMPOUND);
+ outputItems = new ItemStack[itemOutputsNBT.tagCount()];
+ for (int i = 0; i < itemOutputsNBT.tagCount(); i++) {
+ outputItems[i] = GT_Utility.loadItem(itemOutputsNBT.getCompoundTagAt(i));
+ }
+ }
+ if (logicNBT.hasKey("fluidOutputs")) {
+ NBTTagList fluidOutputsNBT = logicNBT.getTagList("fluidOutputs", TAG_COMPOUND);
+ outputFluids = new FluidStack[fluidOutputsNBT.tagCount()];
+ for (int i = 0; i < fluidOutputsNBT.tagCount(); i++) {
+ outputFluids[i] = FluidStack.loadFluidStackFromNBT(fluidOutputsNBT.getCompoundTagAt(i));
+ }
+ }
+ if (logicNBT.hasKey("itemOutputID")) {
+ itemOutputID = UUID.fromString(logicNBT.getString("itemOutputID"));
+ }
+ if (logicNBT.hasKey("fluidOutputID")) {
+ fluidOutputID = UUID.fromString(logicNBT.getString("fluidOutputID"));
+ }
+ }
+
+ /**
+ * Returns a gui part, which will be displayed in a separate tab on the machine's gui.
+ */
+ @Nonnull
+ public Widget getGUIPart(ModularWindow.Builder builder) {
+ return new Scrollable();
+ }
+
+ // #endregion
+}
diff --git a/src/main/java/gregtech/api/logic/NullPowerLogic.java b/src/main/java/gregtech/api/logic/NullPowerLogic.java
new file mode 100644
index 0000000000..0017f0e647
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/NullPowerLogic.java
@@ -0,0 +1,5 @@
+package gregtech.api.logic;
+
+public class NullPowerLogic extends PowerLogic {
+
+}
diff --git a/src/main/java/gregtech/api/logic/PowerLogic.java b/src/main/java/gregtech/api/logic/PowerLogic.java
new file mode 100644
index 0000000000..ad19987a76
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/PowerLogic.java
@@ -0,0 +1,254 @@
+package gregtech.api.logic;
+
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.GT_Values.NBT;
+
+/**
+ * Power logic for machines. This is used to store all the important variables for a machine to have energy and use it
+ * in any way.
+ *
+ * @author BlueWeabo, Maxim
+ */
+public class PowerLogic {
+
+ public static final int NONE = 0;
+ public static final int RECEIVER = 1;
+ public static final int EMITTER = 2;
+ public static final int BOTH = RECEIVER | EMITTER;
+ private static float wirelessChargeFactor = 0.5F;
+ private long storedEnergy = 0;
+ private long energyCapacity = 0;
+ private long voltage = 0;
+ private long amperage = 0;
+ private int type = 0;
+ private boolean canUseLaser = false;
+ private boolean canUseWireless = false;
+ private UUID owner;
+
+ public PowerLogic() {}
+
+ /**
+ * Sets the max voltage the logic can accept
+ */
+ @Nonnull
+ public PowerLogic setMaxVoltage(long voltage) {
+ this.voltage = voltage;
+ return this;
+ }
+
+ /**
+ * Sets the maximum amount of energy the machine can store inside of it
+ */
+ @Nonnull
+ public PowerLogic setEnergyCapacity(long energyCapacity) {
+ this.energyCapacity = energyCapacity;
+ return this;
+ }
+
+ /**
+ * Sets the maximum amount of amps a machine can receive from an emitter
+ */
+ @Nonnull
+ public PowerLogic setMaxAmperage(long amperage) {
+ this.amperage = amperage;
+ return this;
+ }
+
+ /**
+ * Sets the type of power logic this is. Whether it will receive EU or emit it to others, or do both
+ */
+ @Nonnull
+ public PowerLogic setType(int type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * If this power logic can use lasers to be used for it
+ */
+ @Nonnull
+ public PowerLogic setCanUseLaser(boolean canUse) {
+ canUseLaser = canUse;
+ return this;
+ }
+
+ /**
+ * If the power logic should use wireless EU first before using its internal buffer
+ */
+ @Nonnull
+ public PowerLogic setCanUseWireless(boolean canUse, UUID owner) {
+ canUseWireless = canUse;
+ this.owner = owner;
+ return this;
+ }
+
+ /**
+ * Adding energy directly to the buffer, but only if it has the capacity.
+ */
+ public boolean addEnergyUnsafe(long totalEUAdded) {
+ if (storedEnergy + totalEUAdded >= energyCapacity) {
+ return false;
+ }
+
+ storedEnergy += totalEUAdded;
+ return true;
+ }
+
+ /**
+ * Adding energy to the buffer if the voltage given isn't higher than the voltage of the logic
+ */
+ public boolean addEnergy(long voltage, long amperage) {
+ if (voltage > this.voltage) {
+ return false;
+ }
+
+ return addEnergyUnsafe(voltage * amperage);
+ }
+
+ /**
+ * Same as {@link #addEnergy(long, long)}, but only 1 amp of it
+ */
+ public boolean addEnergy(long voltage) {
+ return addEnergy(voltage, 1);
+ }
+
+ /**
+ * Injecting energy in the multiblock ampere per ampere until full or until we have added the maximum possible
+ * amperes for this tick
+ *
+ * @param voltage At what voltage are the amps?
+ * @param availableAmperage How much amperage do we have available
+ * @return Amount of amperes used
+ */
+ public long injectEnergy(long voltage, long availableAmperage) {
+ if (canUseWireless) return 0;
+ long usedAmperes = 0;
+ while (addEnergy(voltage, 1) && usedAmperes < amperage) {
+ usedAmperes++;
+ }
+
+ return usedAmperes;
+ }
+
+ /**
+ * Remove energy from the logic only if it has enough to be removed.
+ */
+ public boolean removeEnergyUnsafe(long totalEURemoved) {
+ if (canUseWireless) {
+ if (storedEnergy < energyCapacity * wirelessChargeFactor) {
+ if (addEUToGlobalEnergyMap(owner, -(energyCapacity - storedEnergy))) {
+ storedEnergy = energyCapacity;
+ }
+ }
+ }
+ if (storedEnergy - totalEURemoved < 0) {
+ return false;
+ }
+
+ storedEnergy -= totalEURemoved;
+ return true;
+ }
+
+ /**
+ * Remove the given voltage for the amount of amperage if the removed isn't higher than the logic's voltage
+ */
+ public boolean removeEnergy(long voltage, long amperage) {
+ if (voltage > this.voltage) {
+ return false;
+ }
+
+ return removeEnergyUnsafe(voltage * amperage);
+ }
+
+ /**
+ * Same as {@link #removeEnergy(long, long)}, but with only 1 amperage
+ */
+ public boolean removeEnergy(long voltage) {
+ return removeEnergy(voltage, 1);
+ }
+
+ /**
+ * @return The maximum energy that can be stored.
+ */
+ public long getCapacity() {
+ return energyCapacity;
+ }
+
+ /**
+ * @return The maximum voltage that is available
+ */
+ public long getVoltage() {
+ return voltage;
+ }
+
+ /**
+ * @return The current energy stored
+ */
+ public long getStoredEnergy() {
+ return storedEnergy;
+ }
+
+ /**
+ * @return The current maximum Amperage
+ */
+ public long getMaxAmperage() {
+ return amperage;
+ }
+
+ /**
+ * Is the logic a receiver to receive energy
+ */
+ public boolean isEnergyReceiver() {
+ return (type & RECEIVER) > 0;
+ }
+
+ /**
+ * Is the logic a emitter to emit energy
+ */
+ public boolean isEnergyEmitter() {
+ return (type & EMITTER) > 0;
+ }
+
+ /**
+ * Saves the power logic to its own nbt tag before saving it to the given one.
+ *
+ * @param nbt Tag where you want to save the power logic tag to.
+ */
+ public void saveToNBT(NBTTagCompound nbt) {
+ NBTTagCompound powerLogic = new NBTTagCompound();
+ powerLogic.setLong(NBT.POWER_LOGIC_ENERGY_CAPACITY, energyCapacity);
+ powerLogic.setLong(NBT.POWER_LOGIC_STORED_ENERGY, storedEnergy);
+ powerLogic.setLong(NBT.POWER_LOGIC_AMPERAGE, amperage);
+ powerLogic.setLong(NBT.POWER_LOGIC_VOLTAGE, voltage);
+ powerLogic.setInteger(NBT.POWER_LOGIC_TYPE, type);
+ nbt.setTag(NBT.POWER_LOGIC, powerLogic);
+ }
+
+ /**
+ * Loads the power logic from its own nbt after getting it from the given one
+ *
+ * @param nbt Tag where the power logic tag was saved to
+ */
+ public void loadFromNBT(NBTTagCompound nbt) {
+ NBTTagCompound powerLogic = nbt.getCompoundTag(NBT.POWER_LOGIC);
+ energyCapacity = powerLogic.getLong(NBT.POWER_LOGIC_ENERGY_CAPACITY);
+ storedEnergy = powerLogic.getLong(NBT.POWER_LOGIC_STORED_ENERGY);
+ amperage = powerLogic.getLong(NBT.POWER_LOGIC_AMPERAGE);
+ voltage = powerLogic.getLong(NBT.POWER_LOGIC_VOLTAGE);
+ type = powerLogic.getInteger(NBT.POWER_LOGIC_TYPE);
+ }
+
+ /**
+ * Can we use lasers for inputting EU
+ */
+ public boolean canUseLaser() {
+ return canUseLaser;
+ }
+}
diff --git a/src/main/java/gregtech/api/logic/ProcessingLogic.java b/src/main/java/gregtech/api/logic/ProcessingLogic.java
new file mode 100644
index 0000000000..4d203ed80f
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/ProcessingLogic.java
@@ -0,0 +1,228 @@
+package gregtech.api.logic;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.interfaces.tileentity.IRecipeLockable;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SingleRecipeCheck;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+
+/**
+ * Logic class to calculate result of recipe check from inputs, based on recipemap.
+ */
+@SuppressWarnings({ "unused", "UnusedReturnValue" })
+public class ProcessingLogic extends AbstractProcessingLogic<ProcessingLogic> {
+
+ protected IRecipeLockable recipeLockableMachine;
+ protected ItemStack specialSlotItem;
+ protected ItemStack[] inputItems;
+ protected FluidStack[] inputFluids;
+ protected boolean isRecipeLocked;
+
+ public ProcessingLogic() {}
+
+ // #region Setters
+
+ @Nonnull
+ public ProcessingLogic setInputItems(ItemStack... itemInputs) {
+ this.inputItems = itemInputs;
+ return getThis();
+ }
+
+ @Nonnull
+ public ProcessingLogic setInputItems(List<ItemStack> itemOutputs) {
+ this.inputItems = itemOutputs.toArray(new ItemStack[0]);
+ return getThis();
+ }
+
+ @Nonnull
+ public ProcessingLogic setInputFluids(FluidStack... fluidInputs) {
+ this.inputFluids = fluidInputs;
+ return getThis();
+ }
+
+ @Nonnull
+ public ProcessingLogic setInputFluids(List<FluidStack> fluidInputs) {
+ this.inputFluids = fluidInputs.toArray(new FluidStack[0]);
+ return getThis();
+ }
+
+ public ProcessingLogic setSpecialSlotItem(ItemStack specialSlotItem) {
+ this.specialSlotItem = specialSlotItem;
+ return getThis();
+ }
+
+ /**
+ * Enables single recipe locking mode.
+ */
+ public ProcessingLogic setRecipeLocking(IRecipeLockable recipeLockableMachine, boolean isRecipeLocked) {
+ this.recipeLockableMachine = recipeLockableMachine;
+ this.isRecipeLocked = isRecipeLocked;
+ return getThis();
+ }
+
+ /**
+ * Clears calculated results and provided machine inputs to prepare for the next machine operation.
+ */
+
+ public ProcessingLogic clear() {
+ this.inputItems = null;
+ this.inputFluids = null;
+ this.specialSlotItem = null;
+ this.outputItems = null;
+ this.outputFluids = null;
+ this.calculatedEut = 0;
+ this.duration = 0;
+ this.calculatedParallels = 0;
+ return getThis();
+ }
+
+ // #endregion
+
+ // #region Logic
+
+ /**
+ * Executes the recipe check: Find recipe from recipemap, Calculate parallel, overclock and outputs.
+ */
+ @Nonnull
+ public CheckRecipeResult process() {
+ RecipeMap<?> recipeMap = preProcess();
+
+ if (inputItems == null) {
+ inputItems = new ItemStack[0];
+ }
+ if (inputFluids == null) {
+ inputFluids = new FluidStack[0];
+ }
+
+ if (isRecipeLocked && recipeLockableMachine != null && recipeLockableMachine.getSingleRecipeCheck() != null) {
+ // Recipe checker is already built, we'll use it
+ SingleRecipeCheck singleRecipeCheck = recipeLockableMachine.getSingleRecipeCheck();
+ // Validate recipe here, otherwise machine will show "not enough output space"
+ // even if recipe cannot be found
+ if (singleRecipeCheck.checkRecipeInputs(false, 1, inputItems, inputFluids) == 0) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ return validateAndCalculateRecipe(
+ recipeLockableMachine.getSingleRecipeCheck()
+ .getRecipe()).checkRecipeResult;
+ }
+ Stream<GT_Recipe> matchedRecipes = findRecipeMatches(recipeMap);
+ Iterable<GT_Recipe> recipeIterable = matchedRecipes::iterator;
+ CheckRecipeResult checkRecipeResult = CheckRecipeResultRegistry.NO_RECIPE;
+ for (GT_Recipe matchedRecipe : recipeIterable) {
+ CalculationResult foundResult = validateAndCalculateRecipe(matchedRecipe);
+ if (foundResult.successfullyConsumedInputs) {
+ // Successfully found and set recipe, so return it
+ return foundResult.checkRecipeResult;
+ }
+ if (foundResult.checkRecipeResult != CheckRecipeResultRegistry.NO_RECIPE) {
+ // Recipe failed in interesting way, so remember that and continue searching
+ checkRecipeResult = foundResult.checkRecipeResult;
+ }
+ }
+ return checkRecipeResult;
+ }
+
+ /**
+ * Checks if supplied recipe is valid for process. This involves voltage check, output full check. If successful,
+ * additionally performs input consumption, output calculation with parallel, and overclock calculation.
+ *
+ * @param recipe The recipe which will be checked and processed
+ */
+ @Nonnull
+ private CalculationResult validateAndCalculateRecipe(@Nonnull GT_Recipe recipe) {
+ CheckRecipeResult result = validateRecipe(recipe);
+ if (!result.wasSuccessful()) {
+ return CalculationResult.ofFailure(result);
+ }
+
+ GT_ParallelHelper helper = createParallelHelper(recipe);
+ GT_OverclockCalculator calculator = createOverclockCalculator(recipe);
+ helper.setCalculator(calculator);
+ helper.build();
+
+ if (!helper.getResult()
+ .wasSuccessful()) {
+ return CalculationResult.ofFailure(helper.getResult());
+ }
+
+ return CalculationResult.ofSuccess(applyRecipe(recipe, helper, calculator, result));
+ }
+
+ /**
+ * Finds a list of matched recipes. At this point no additional check to the matched recipe has been done.
+ * <p>
+ * Override {@link #validateRecipe} to have custom check.
+ * <p>
+ * Override this method if it doesn't work with normal recipemaps.
+ */
+ @Nonnull
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ if (map == null) {
+ return Stream.empty();
+ }
+ return map.findRecipeQuery()
+ .items(inputItems)
+ .fluids(inputFluids)
+ .specialSlot(specialSlotItem)
+ .cachedRecipe(lastRecipe)
+ .findAll();
+ }
+
+ /**
+ * Override to tweak parallel logic if needed.
+ */
+ @Nonnull
+ protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) {
+ return new GT_ParallelHelper().setRecipe(recipe)
+ .setItemInputs(inputItems)
+ .setFluidInputs(inputFluids)
+ .setAvailableEUt(availableVoltage * availableAmperage)
+ .setMachine(machine, protectItems, protectFluids)
+ .setRecipeLocked(recipeLockableMachine, isRecipeLocked)
+ .setMaxParallel(maxParallel)
+ .setEUtModifier(euModifier)
+ .enableBatchMode(batchSize)
+ .setConsumption(true)
+ .setOutputCalculation(true);
+ }
+
+ // #endregion
+
+ /**
+ * Represents the status of check recipe calculation. {@link #successfullyConsumedInputs} does not necessarily mean
+ * {@link #checkRecipeResult} being successful, when duration or power is overflowed. Being failure means
+ * recipe cannot meet requirements and recipe search should be continued if possible.
+ */
+ protected final static class CalculationResult {
+
+ public final boolean successfullyConsumedInputs;
+ public final CheckRecipeResult checkRecipeResult;
+
+ public static CalculationResult ofSuccess(CheckRecipeResult checkRecipeResult) {
+ return new CalculationResult(true, checkRecipeResult);
+ }
+
+ public static CalculationResult ofFailure(CheckRecipeResult checkRecipeResult) {
+ return new CalculationResult(false, checkRecipeResult);
+ }
+
+ private CalculationResult(boolean successfullyConsumedInputs, CheckRecipeResult checkRecipeResult) {
+ this.successfullyConsumedInputs = successfullyConsumedInputs;
+ this.checkRecipeResult = checkRecipeResult;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/logic/interfaces/FluidInventoryLogicHost.java b/src/main/java/gregtech/api/logic/interfaces/FluidInventoryLogicHost.java
new file mode 100644
index 0000000000..c12333a4c6
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/interfaces/FluidInventoryLogicHost.java
@@ -0,0 +1,95 @@
+package gregtech.api.logic.interfaces;
+
+import static com.google.common.primitives.Ints.saturatedCast;
+
+import java.util.HashSet;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import gregtech.api.enums.InventoryType;
+import gregtech.api.logic.FluidInventoryLogic;
+
+public interface FluidInventoryLogicHost extends IFluidHandler {
+
+ /**
+ * To be used for single blocks or when directly interacting with the controller
+ *
+ * @param side The side from where fluids are being inputted or extracted from
+ * @param type The type of inventory being accessed. For inputting its Input, For outputting its Output.
+ * @return The Fluid Logic responsible for said type. Can return null if the side is invalid
+ */
+ @Nullable
+ FluidInventoryLogic getFluidLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType type);
+
+ /**
+ * Only to be used by MultiBlockPart for accessing the Controller Inventory
+ *
+ * @param type Type of inventory, is it Input or Output
+ * @param id ID of the locked inventory. A null id is all inventories of said controller of said type
+ * @return The Fluid Logic responsible for everything that should be done with said inventory
+ */
+ @Nonnull
+ default FluidInventoryLogic getFluidLogic(@Nonnull InventoryType type, @Nullable UUID id) {
+ return Objects.requireNonNull(getFluidLogic(ForgeDirection.UNKNOWN, type));
+ }
+
+ /**
+ * Returns an empty set if the type is {@link InventoryType#Both} or when the machine isn't a controller.
+ */
+ @Nonnull
+ default Set<Entry<UUID, FluidInventoryLogic>> getAllFluidInventoryLogics(@Nonnull InventoryType type) {
+ return new HashSet<>();
+ }
+
+ @Override
+ default boolean canDrain(@Nonnull ForgeDirection from, Fluid fluid) {
+ FluidInventoryLogic logic = getFluidLogic(from, InventoryType.Output);
+ return logic != null;
+ }
+
+ @Override
+ default boolean canFill(@Nonnull ForgeDirection from, Fluid fluid) {
+ FluidInventoryLogic logic = getFluidLogic(from, InventoryType.Input);
+ return logic != null;
+ }
+
+ @Override
+ @Nullable
+ default FluidStack drain(@Nonnull ForgeDirection from, @Nonnull FluidStack resource, boolean doDrain) {
+ FluidInventoryLogic logic = getFluidLogic(from, InventoryType.Output);
+ if (logic == null) return null;
+ return logic.drain(resource.getFluid(), resource.amount, !doDrain);
+ }
+
+ @Override
+ @Nullable
+ default FluidStack drain(@Nonnull ForgeDirection from, int maxDrain, boolean doDrain) {
+ FluidInventoryLogic logic = getFluidLogic(from, InventoryType.Output);
+ if (logic == null) return null;
+ return logic.drain(maxDrain, !doDrain);
+ }
+
+ @Override
+ default int fill(@Nonnull ForgeDirection from, @Nonnull FluidStack resource, boolean doFill) {
+ FluidInventoryLogic logic = getFluidLogic(from, InventoryType.Input);
+ if (logic == null) return 0;
+ return saturatedCast(logic.fill(resource.getFluid(), resource.amount, !doFill));
+ }
+
+ @Override
+ @Nullable
+ default FluidTankInfo[] getTankInfo(@Nonnull ForgeDirection from) {
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/api/logic/interfaces/ItemInventoryLogicHost.java b/src/main/java/gregtech/api/logic/interfaces/ItemInventoryLogicHost.java
new file mode 100644
index 0000000000..a65f3c50f1
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/interfaces/ItemInventoryLogicHost.java
@@ -0,0 +1,172 @@
+package gregtech.api.logic.interfaces;
+
+import java.util.HashSet;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.InventoryType;
+import gregtech.api.logic.ItemInventoryLogic;
+
+public interface ItemInventoryLogicHost extends ISidedInventory {
+
+ /**
+ * To be used for single blocks or when directly interacting with the controller
+ *
+ * @param side The side from where items are being inputted or extracted from
+ * @param type The type of inventory being accessed. For inputting its Input, For outputting its Output.
+ * @return The Item Logic responsible for said type. Will return null if the side is not valid
+ */
+ @Nullable
+ ItemInventoryLogic getItemLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType type);
+
+ /**
+ * Only to be used by MultiBlockPart for accessing the Controller Inventory
+ *
+ * @param type Type of inventory, is it Input or Output
+ * @param id ID of the locked inventory. A null id is all inventories of said controller of said type
+ * @return The Item Logic responsible for everything that should be done with said inventory
+ */
+ @Nonnull
+ default ItemInventoryLogic getItemLogic(@Nonnull InventoryType type, @Nullable UUID id) {
+ return Objects.requireNonNull(getItemLogic(ForgeDirection.UNKNOWN, type));
+ }
+
+ /**
+ * Only to be used for MultiBlockPart
+ *
+ * @return
+ */
+ @Nullable
+ default InventoryType getItemInventoryType() {
+ return null;
+ }
+
+ /**
+ * Returns an empty set if the type is {@link InventoryType#Both} or this is used when the machine isn't a
+ * controller
+ */
+ @Nonnull
+ default Set<Entry<UUID, ItemInventoryLogic>> getAllItemInventoryLogics(@Nonnull InventoryType type) {
+ return new HashSet<>();
+ }
+
+ @Override
+ @Nullable
+ default ItemStack decrStackSize(int slot, int count) {
+ InventoryType type = getItemInventoryType();
+ if (type == InventoryType.Both) return null;
+ ItemInventoryLogic logic = getItemLogic(ForgeDirection.UNKNOWN, type == null ? InventoryType.Output : type);
+ if (logic == null) return null;
+ return logic.extractItem(slot, count);
+ }
+
+ @Override
+ default int getSizeInventory() {
+ InventoryType type = getItemInventoryType();
+ if (type == InventoryType.Both) return 0;
+ ItemInventoryLogic logic = getItemLogic(ForgeDirection.UNKNOWN, type == null ? InventoryType.Output : type);
+ if (logic == null) return 0;
+ return logic.getSlots();
+ }
+
+ @Override
+ @Nullable
+ default ItemStack getStackInSlot(int slot) {
+ InventoryType type = getItemInventoryType();
+ if (type == InventoryType.Both) return null;
+ ItemInventoryLogic logic = getItemLogic(ForgeDirection.UNKNOWN, type == null ? InventoryType.Output : type);
+ if (logic == null) return null;
+ return logic.getInventory()
+ .getStackInSlot(slot);
+ }
+
+ @Override
+ default boolean isItemValidForSlot(int slot, @Nullable ItemStack stack) {
+ InventoryType type = getItemInventoryType();
+ if (type == InventoryType.Both) return false;
+ ItemInventoryLogic logic = getItemLogic(ForgeDirection.UNKNOWN, type == null ? InventoryType.Output : type);
+ if (logic == null) return false;
+ return logic.getInventory()
+ .isItemValid(slot, stack);
+ }
+
+ @Override
+ default void setInventorySlotContents(int slot, @Nullable ItemStack stack) {
+ InventoryType type = getItemInventoryType();
+ if (type == InventoryType.Both) return;
+ ItemInventoryLogic logic = getItemLogic(ForgeDirection.UNKNOWN, type == null ? InventoryType.Output : type);
+ if (logic == null) return;
+ logic.getInventory()
+ .setStackInSlot(slot, stack);
+ }
+
+ @Override
+ default boolean canExtractItem(int ignoredSlot, ItemStack ignoredItem, int side) {
+ InventoryType type = getItemInventoryType();
+ if (type == null) return false;
+ return getItemLogic(ForgeDirection.getOrientation(side), type) != null;
+ }
+
+ @Override
+ default boolean canInsertItem(int ignoredSlot, ItemStack ignoredItem, int side) {
+ InventoryType type = getItemInventoryType();
+ if (type == null) return false;
+ return getItemInventoryType() != InventoryType.Output
+ && getItemLogic(ForgeDirection.getOrientation(side), type) != null;
+ }
+
+ @Override
+ default int[] getAccessibleSlotsFromSide(int side) {
+ InventoryType type = getItemInventoryType();
+ if (type == null) return new int[0];
+ ItemInventoryLogic logic = getItemLogic(ForgeDirection.UNKNOWN, type == null ? InventoryType.Output : type);
+ if (logic == null) return new int[0];
+ int[] indexes = new int[logic.getSlots()];
+ for (int i = 0; i < logic.getSlots(); i++) {
+ indexes[i] = i;
+ }
+ return indexes;
+ }
+
+ @Override
+ default void closeInventory() {}
+
+ @Override
+ default String getInventoryName() {
+ return "";
+ }
+
+ @Override
+ default int getInventoryStackLimit() {
+ return 64;
+ }
+
+ @Override
+ default ItemStack getStackInSlotOnClosing(int index) {
+ return null;
+ }
+
+ @Override
+ default boolean hasCustomInventoryName() {
+ return false;
+ }
+
+ @Override
+ default boolean isUseableByPlayer(@Nonnull EntityPlayer player) {
+ return false;
+ }
+
+ @Override
+ default void openInventory() {}
+
+}
diff --git a/src/main/java/gregtech/api/logic/interfaces/ModelRenderLogicHost.java b/src/main/java/gregtech/api/logic/interfaces/ModelRenderLogicHost.java
new file mode 100644
index 0000000000..9a0afaa539
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/interfaces/ModelRenderLogicHost.java
@@ -0,0 +1,10 @@
+package gregtech.api.logic.interfaces;
+
+import gregtech.api.logic.ModelRenderLogic;
+
+public interface ModelRenderLogicHost {
+
+ ModelRenderLogic getRenderLogic();
+
+ boolean shouldRenderModel();
+}
diff --git a/src/main/java/gregtech/api/logic/interfaces/PowerLogicHost.java b/src/main/java/gregtech/api/logic/interfaces/PowerLogicHost.java
new file mode 100644
index 0000000000..4903d7fa23
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/interfaces/PowerLogicHost.java
@@ -0,0 +1,60 @@
+package gregtech.api.logic.interfaces;
+
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.tileentity.IEnergyConnected;
+import gregtech.api.logic.PowerLogic;
+
+/**
+ * Power logic class for one to use to enable a machine to use energy
+ */
+public interface PowerLogicHost {
+
+ /**
+ *
+ * @param side Side being access to try and get the power logic from
+ * @return Can return NullPowerLogic if the side doesn't allow the return of the logic. That power logic is unusable
+ */
+ @Nonnull
+ PowerLogic getPowerLogic(@Nonnull ForgeDirection side);
+
+ /**
+ * Gives the power logic ignoring the side.
+ */
+ @Nonnull
+ default PowerLogic getPowerLogic() {
+ return Objects.requireNonNull(getPowerLogic(ForgeDirection.UNKNOWN));
+ }
+
+ /**
+ * Shortcut to the method of {@link PowerLogic#isEnergyReceiver()}
+ */
+ default boolean isEnergyReceiver() {
+ return getPowerLogic().isEnergyReceiver();
+ }
+
+ /**
+ * Shortcut to the method of {@link PowerLogic#isEnergyEmitter()}
+ */
+ default boolean isEnergyEmitter() {
+ return getPowerLogic().isEnergyEmitter();
+ }
+
+ /**
+ * Method for emitting energy to other blocks and machines. Override when it needs to be changed.
+ */
+ default void emitEnergyFromLogic() {
+ IEnergyConnected.Util.emitEnergyToNetwork(this, getPowerOutputSide());
+ }
+
+ /**
+ * From where does the machine output energy from?
+ * When the output side is {@link ForgeDirection#UNKNOWN} then it won't output energy
+ */
+ @Nonnull
+ ForgeDirection getPowerOutputSide();
+}
diff --git a/src/main/java/gregtech/api/logic/interfaces/ProcessingLogicHost.java b/src/main/java/gregtech/api/logic/interfaces/ProcessingLogicHost.java
new file mode 100644
index 0000000000..b8291c9843
--- /dev/null
+++ b/src/main/java/gregtech/api/logic/interfaces/ProcessingLogicHost.java
@@ -0,0 +1,82 @@
+package gregtech.api.logic.interfaces;
+
+import javax.annotation.Nonnull;
+
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.interfaces.tileentity.IVoidable;
+import gregtech.api.logic.MuTEProcessingLogic;
+
+public interface ProcessingLogicHost<P extends MuTEProcessingLogic<P>>
+ extends IVoidable, ItemInventoryLogicHost, FluidInventoryLogicHost, IMachineProgress {
+
+ /**
+ * Get the processing logic for the current machine
+ */
+ @Nonnull
+ P getProcessingLogic();
+
+ boolean isInputSeparated();
+
+ void setInputSeparation(Boolean inputSeparation);
+
+ default boolean supportsInputSeparation() {
+ return true;
+ }
+
+ default boolean getDefaultInputSeparationMode() {
+ return false;
+ }
+
+ boolean isRecipeLockingEnabled();
+
+ void setRecipeLocking(Boolean recipeLocked);
+
+ default boolean supportsSingleRecipeLocking() {
+ return true;
+ }
+
+ default boolean getDefaultRecipeLockingMode() {
+ return false;
+ }
+
+ default boolean supportsBatchMode() {
+ return true;
+ }
+
+ void setBatchMode(Boolean batchMode);
+
+ boolean isBatchModeEnabled();
+
+ default boolean getDefaultBatchMode() {
+ return false;
+ }
+
+ /**
+ * Get what the machine can void or not
+ */
+ @Nonnull
+ VoidingMode getVoidMode();
+
+ /**
+ * Called when the processing logic should be updated by {@link #needsUpdate()}
+ */
+ default void updateProcessingLogic(@Nonnull P processingLogic) {}
+
+ /**
+ * Called before the recipe check, but after any other updates
+ */
+ default void setProcessingLogicPower(@Nonnull P processingLogic) {}
+
+ /**
+ * DO NOT CALL YOURSELF!!!
+ *
+ * If you want to make the processing logic be updated call {@link #setProcessingUpdate(boolean)}
+ */
+ boolean needsUpdate();
+
+ /**
+ * To be called when one needs to updated the processing logic. That can be when parallel changes, ect.
+ */
+ void setProcessingUpdate(boolean update);
+}
diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java
new file mode 100644
index 0000000000..1dc0e34d53
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java
@@ -0,0 +1,1416 @@
+package gregtech.api.metatileentity;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.enums.GT_Values.NW;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.graphs.Lock;
+import gregtech.api.graphs.Node;
+import gregtech.api.graphs.paths.NodePath;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IConnectable;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IDebugableTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IPipeRenderedTileEntity;
+import gregtech.api.net.GT_Packet_TileEntity;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.covers.CoverInfo;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * This is the main TileEntity for EVERYTHING.
+ */
+public class BaseMetaPipeEntity extends CommonMetaTileEntity
+ implements IGregTechTileEntity, IPipeRenderedTileEntity, IDebugableTileEntity {
+
+ public byte mConnections = IConnectable.NO_CONNECTION;
+ protected MetaPipeEntity mMetaTileEntity;
+ private final int[] mTimeStatistics = new int[GregTech_API.TICKS_FOR_LAG_AVERAGING];
+ private boolean hasTimeStatisticsStarted;
+ private boolean mWorkUpdate = false, mWorks = true;
+ private byte mColor = 0, oColor = 0, oStrongRedstone = 0, oRedstoneData = 63, oTextureData = 0, oUpdateData = 0,
+ mLagWarningCount = 0;
+ private int oX = 0, oY = 0, oZ = 0, mTimeStatisticsIndex = 0;
+ protected Node node;
+ protected NodePath nodePath;
+
+ public Node getNode() {
+ return node;
+ }
+
+ public void setNode(Node node) {
+ this.node = node;
+ }
+
+ public NodePath getNodePath() {
+ return nodePath;
+ }
+
+ public void setNodePath(NodePath nodePath) {
+ this.nodePath = nodePath;
+ }
+
+ public void addToLock(TileEntity tileEntity, ForgeDirection side) {
+ if (node != null) {
+ final Lock lock = node.locks[side.ordinal()];
+ if (lock != null) {
+ lock.addTileEntity(tileEntity);
+ }
+ } else if (nodePath != null) {
+ nodePath.lock.addTileEntity(tileEntity);
+ }
+ }
+
+ public void removeFromLock(TileEntity tileEntity, ForgeDirection side) {
+ if (node != null) {
+ final Lock lock = node.locks[side.ordinal()];
+ if (lock != null) {
+ lock.removeTileEntity(tileEntity);
+ }
+ } else if (nodePath != null) {
+ nodePath.lock.removeTileEntity(tileEntity);
+ }
+ }
+
+ public void reloadLocks() {
+ final IMetaTileEntity meta = getMetaTileEntity();
+ if (meta instanceof MetaPipeEntity) {
+ ((MetaPipeEntity) meta).reloadLocks();
+ }
+ }
+
+ public BaseMetaPipeEntity() {}
+
+ @Override
+ public void writeToNBT(NBTTagCompound aNBT) {
+ try {
+ super.writeToNBT(aNBT);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity", e);
+ }
+ try {
+ aNBT.setInteger("mID", mID);
+ writeCoverNBT(aNBT, false);
+ aNBT.setByte("mConnections", mConnections);
+ aNBT.setByte("mColor", mColor);
+ aNBT.setBoolean("mWorks", !mWorks);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity", e);
+ }
+ saveMetaTileNBT(aNBT);
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound aNBT) {
+ super.readFromNBT(aNBT);
+ setInitialValuesAsNBT(aNBT, (short) 0);
+ }
+
+ @Override
+ public void setInitialValuesAsNBT(NBTTagCompound aNBT, short aID) {
+ if (aNBT == null) {
+ if (aID > 0) mID = aID;
+ else mID = mID > 0 ? mID : 0;
+ if (mID != 0) createNewMetatileEntity(mID);
+ } else {
+ if (aID <= 0) mID = (short) aNBT.getInteger("mID");
+ else mID = aID;
+ mConnections = aNBT.getByte("mConnections");
+ mColor = aNBT.getByte("mColor");
+ mWorks = !aNBT.getBoolean("mWorks");
+
+ if (mSidedRedstone.length != 6) mSidedRedstone = new byte[] { 0, 0, 0, 0, 0, 0 };
+
+ readCoverNBT(aNBT);
+ loadMetaTileNBT(aNBT);
+ }
+ }
+
+ @Override
+ public void updateEntity() {
+ super.updateEntity();
+
+ if (!hasValidMetaTileEntity()) {
+ if (mMetaTileEntity == null) return;
+ mMetaTileEntity.setBaseMetaTileEntity(this);
+ }
+
+ long tTime;
+ if (hasTimeStatisticsStarted) {
+ tTime = System.nanoTime();
+ } else {
+ tTime = 0;
+ }
+ try {
+ if (hasValidMetaTileEntity()) {
+ if (mTickTimer++ == 0) {
+ oX = xCoord;
+ oY = yCoord;
+ oZ = zCoord;
+ if (isServerSide()) checkDropCover();
+ else {
+ requestCoverDataIfNeeded();
+ }
+ worldObj.markTileEntityChunkModified(xCoord, yCoord, zCoord, this);
+ mMetaTileEntity.onFirstTick(this);
+ if (!hasValidMetaTileEntity()) return;
+ }
+
+ if (isClientSide()) {
+ if (mColor != oColor) {
+ mMetaTileEntity.onColorChangeClient(oColor = mColor);
+ issueTextureUpdate();
+ }
+
+ if (mNeedsUpdate) {
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ mNeedsUpdate = false;
+ }
+ }
+ if (isServerSide() && mTickTimer > 10) {
+ if (!doCoverThings()) return;
+
+ final byte oldConnections = mConnections;
+ // Mask-out connection direction bits to keep only Foam related connections
+ mConnections = (byte) (mMetaTileEntity.mConnections | (mConnections & ~IConnectable.CONNECTED_ALL));
+ // If foam not hardened, tries roll chance to harden
+ if ((mConnections & IConnectable.HAS_FOAM) == IConnectable.HAS_FRESHFOAM
+ && getRandomNumber(1000) == 0) {
+ mConnections = (byte) ((mConnections & ~IConnectable.HAS_FRESHFOAM)
+ | IConnectable.HAS_HARDENEDFOAM);
+ }
+ if (mTickTimer > 12 && oldConnections != mConnections)
+ GregTech_API.causeCableUpdate(worldObj, xCoord, yCoord, zCoord);
+ }
+ mMetaTileEntity.onPreTick(this, mTickTimer);
+ if (!hasValidMetaTileEntity()) return;
+ if (isServerSide()) {
+ if (mTickTimer == 10) {
+ updateCoverBehavior();
+ issueBlockUpdate();
+ joinEnet();
+ }
+
+ if (xCoord != oX || yCoord != oY || zCoord != oZ) {
+ oX = xCoord;
+ oY = yCoord;
+ oZ = zCoord;
+ issueClientUpdate();
+ clearTileEntityBuffer();
+ }
+ }
+
+ mMetaTileEntity.onPostTick(this, mTickTimer);
+ if (!hasValidMetaTileEntity()) return;
+
+ if (isServerSide()) {
+ if (mTickTimer % 10 == 0) {
+ sendClientData();
+ }
+
+ if (mTickTimer > 10) {
+ if (mConnections != oTextureData) sendBlockEvent((byte) 0, oTextureData = mConnections);
+ byte tData = mMetaTileEntity.getUpdateData();
+ if (tData != oUpdateData) sendBlockEvent((byte) 1, oUpdateData = tData);
+ if (mColor != oColor) sendBlockEvent((byte) 2, oColor = mColor);
+ tData = (byte) (((mSidedRedstone[0] > 0) ? 1 : 0) | ((mSidedRedstone[1] > 0) ? 2 : 0)
+ | ((mSidedRedstone[2] > 0) ? 4 : 0)
+ | ((mSidedRedstone[3] > 0) ? 8 : 0)
+ | ((mSidedRedstone[4] > 0) ? 16 : 0)
+ | ((mSidedRedstone[5] > 0) ? 32 : 0));
+ if (tData != oRedstoneData) sendBlockEvent((byte) 3, oRedstoneData = tData);
+ }
+
+ if (mNeedsBlockUpdate) {
+ updateNeighbours(mStrongRedstone, oStrongRedstone);
+ oStrongRedstone = mStrongRedstone;
+ mNeedsBlockUpdate = false;
+ }
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ e.printStackTrace(GT_Log.err);
+ }
+
+ if (isServerSide() && hasTimeStatisticsStarted && hasValidMetaTileEntity()) {
+ tTime = System.nanoTime() - tTime;
+ mTimeStatisticsIndex = (mTimeStatisticsIndex + 1) % mTimeStatistics.length;
+ mTimeStatistics[mTimeStatisticsIndex] = (int) tTime;
+ if (tTime > 0 && tTime > (GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING * 1000000L)
+ && mTickTimer > 1000
+ && getMetaTileEntity().doTickProfilingMessageDuringThisTick()
+ && mLagWarningCount++ < 10)
+ GT_FML_LOGGER.warn(
+ "WARNING: Possible Lag Source at [" + xCoord
+ + ","
+ + yCoord
+ + ","
+ + zCoord
+ + "] in Dimension "
+ + worldObj.provider.dimensionId
+ + " with "
+ + tTime
+ + " ns caused by an instance of "
+ + getMetaTileEntity().getClass());
+ }
+
+ mWorkUpdate = mInventoryChanged = false;
+ }
+
+ private void sendClientData() {
+ if (mSendClientData) {
+ NW.sendPacketToAllPlayersInRange(
+ worldObj,
+ new GT_Packet_TileEntity(
+ xCoord,
+ (short) yCoord,
+ zCoord,
+ mID,
+ getCoverInfoAtSide(ForgeDirection.DOWN).getCoverID(),
+ getCoverInfoAtSide(ForgeDirection.UP).getCoverID(),
+ getCoverInfoAtSide(ForgeDirection.NORTH).getCoverID(),
+ getCoverInfoAtSide(ForgeDirection.SOUTH).getCoverID(),
+ getCoverInfoAtSide(ForgeDirection.WEST).getCoverID(),
+ getCoverInfoAtSide(ForgeDirection.EAST).getCoverID(),
+ oTextureData = mConnections,
+ oUpdateData = hasValidMetaTileEntity() ? mMetaTileEntity.getUpdateData() : 0,
+ oRedstoneData = (byte) (((mSidedRedstone[0] > 0) ? 1 : 0) | ((mSidedRedstone[1] > 0) ? 2 : 0)
+ | ((mSidedRedstone[2] > 0) ? 4 : 0)
+ | ((mSidedRedstone[3] > 0) ? 8 : 0)
+ | ((mSidedRedstone[4] > 0) ? 16 : 0)
+ | ((mSidedRedstone[5] > 0) ? 32 : 0)),
+ oColor = mColor),
+ xCoord,
+ zCoord);
+ mSendClientData = false;
+ }
+ sendCoverDataIfNeeded();
+ }
+
+ public final void receiveMetaTileEntityData(short aID, int aCover0, int aCover1, int aCover2, int aCover3,
+ int aCover4, int aCover5, byte aTextureData, byte aUpdateData, byte aRedstoneData, byte aColorData) {
+ issueTextureUpdate();
+ if (aID > 0 && mID != aID) {
+ mID = aID;
+ createNewMetatileEntity(mID);
+ }
+
+ setCoverIDAtSide(ForgeDirection.DOWN, aCover0);
+ setCoverIDAtSide(ForgeDirection.UP, aCover1);
+ setCoverIDAtSide(ForgeDirection.NORTH, aCover2);
+ setCoverIDAtSide(ForgeDirection.SOUTH, aCover3);
+ setCoverIDAtSide(ForgeDirection.WEST, aCover4);
+ setCoverIDAtSide(ForgeDirection.EAST, aCover5);
+
+ receiveClientEvent(GregTechTileClientEvents.CHANGE_COMMON_DATA, aTextureData);
+ receiveClientEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, aUpdateData);
+ receiveClientEvent(GregTechTileClientEvents.CHANGE_COLOR, aColorData);
+ receiveClientEvent(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, aRedstoneData);
+ }
+
+ @Override
+ public boolean receiveClientEvent(int aEventID, int aValue) {
+ super.receiveClientEvent(aEventID, aValue);
+
+ if (hasValidMetaTileEntity()) {
+ try {
+ mMetaTileEntity.receiveClientEvent((byte) aEventID, (byte) aValue);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("Encountered Exception while receiving Data from the Server", e);
+ }
+ }
+
+ if (isClientSide()) {
+ issueTextureUpdate();
+ switch (aEventID) {
+ case GregTechTileClientEvents.CHANGE_COMMON_DATA -> mConnections = (byte) aValue;
+ case GregTechTileClientEvents.CHANGE_CUSTOM_DATA -> {
+ if (hasValidMetaTileEntity()) mMetaTileEntity.onValueUpdate((byte) aValue);
+ }
+ case GregTechTileClientEvents.CHANGE_COLOR -> {
+ if (aValue > 16 || aValue < 0) aValue = 0;
+ mColor = (byte) aValue;
+ }
+ case GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT -> {
+ mSidedRedstone[0] = (byte) ((aValue & 1) == 1 ? 15 : 0);
+ mSidedRedstone[1] = (byte) ((aValue & 2) == 2 ? 15 : 0);
+ mSidedRedstone[2] = (byte) ((aValue & 4) == 4 ? 15 : 0);
+ mSidedRedstone[3] = (byte) ((aValue & 8) == 8 ? 15 : 0);
+ mSidedRedstone[4] = (byte) ((aValue & 16) == 16 ? 15 : 0);
+ mSidedRedstone[5] = (byte) ((aValue & 32) == 32 ? 15 : 0);
+ }
+ case GregTechTileClientEvents.DO_SOUND -> {
+ if (hasValidMetaTileEntity() && mTickTimer > 20)
+ mMetaTileEntity.doSound((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5);
+ }
+ case GregTechTileClientEvents.START_SOUND_LOOP -> {
+ if (hasValidMetaTileEntity() && mTickTimer > 20)
+ mMetaTileEntity.startSoundLoop((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5);
+ }
+ case GregTechTileClientEvents.STOP_SOUND_LOOP -> {
+ if (hasValidMetaTileEntity() && mTickTimer > 20)
+ mMetaTileEntity.stopSoundLoop((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5);
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public ArrayList<String> getDebugInfo(EntityPlayer aPlayer, int aLogLevel) {
+ final ArrayList<String> tList = new ArrayList<>();
+ if (aLogLevel > 3) {
+ tList.add(
+ "Meta-ID: " + EnumChatFormatting.BLUE
+ + mID
+ + EnumChatFormatting.RESET
+ + (hasValidMetaTileEntity() ? EnumChatFormatting.GREEN + " valid" + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + " invalid" + EnumChatFormatting.RESET)
+ + (mMetaTileEntity == null
+ ? EnumChatFormatting.RED + " MetaTileEntity == null!" + EnumChatFormatting.RESET
+ : " "));
+ }
+ if (aLogLevel > 1) {
+ if (hasTimeStatisticsStarted) {
+ double tAverageTime = 0;
+ double tWorstTime = 0;
+ int amountOfZero = 0;
+ for (int tTime : mTimeStatistics) {
+ tAverageTime += tTime;
+ if (tTime > tWorstTime) {
+ tWorstTime = tTime;
+ }
+ if (tTime == 0) {
+ amountOfZero += 1;
+ }
+ }
+ // tick time zero means it has not been updated yet
+ int samples = mTimeStatistics.length - amountOfZero;
+ if (samples > 0) {
+ tList.add(
+ "Average CPU-load of ~" + (tAverageTime / samples)
+ + "ns since "
+ + samples
+ + " ticks with worst time of "
+ + tWorstTime
+ + "ns.");
+ }
+ } else {
+ startTimeStatistics();
+ tList.add("Just started tick time statistics.");
+ }
+ if (mLagWarningCount > 0) {
+ tList.add(
+ "Caused " + (mLagWarningCount >= 10 ? "more than 10" : mLagWarningCount)
+ + " Lag Spike Warnings (anything taking longer than "
+ + GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING
+ + "ms) on the Server.");
+ }
+ if (mMetaTileEntity != null) {
+ tList.add(
+ "Is" + (mMetaTileEntity.isAccessAllowed(aPlayer) ? " "
+ : EnumChatFormatting.RED + " not " + EnumChatFormatting.RESET) + "accessible for you");
+ }
+ }
+ if (joinedIc2Enet) tList.add("Joined IC2 ENet");
+
+ return mMetaTileEntity != null ? mMetaTileEntity.getSpecialDebugInfo(this, aPlayer, aLogLevel, tList)
+ : new ArrayList<>();
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ if (canAccessData()) return mMetaTileEntity.isGivingInformation();
+ return false;
+ }
+
+ @Override
+ public ForgeDirection getBackFacing() {
+ return getFrontFacing().getOpposite();
+ }
+
+ @Override
+ public ForgeDirection getFrontFacing() {
+ return ForgeDirection.UNKNOWN;
+ }
+
+ @Override
+ public void setFrontFacing(ForgeDirection aFacing) {
+ doEnetUpdate();
+ }
+
+ @Override
+ public int getSizeInventory() {
+ if (canAccessData()) return mMetaTileEntity.getSizeInventory();
+ return 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(int aIndex) {
+ if (canAccessData()) return mMetaTileEntity.getStackInSlot(aIndex);
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(int aIndex, ItemStack aStack) {
+ markDirty();
+ mInventoryChanged = true;
+ if (canAccessData()) mMetaTileEntity
+ .setInventorySlotContents(aIndex, worldObj.isRemote ? aStack : GT_OreDictUnificator.setStack(true, aStack));
+ }
+
+ @Override
+ public String getInventoryName() {
+ if (canAccessData()) return mMetaTileEntity.getInventoryName();
+ if (GregTech_API.METATILEENTITIES[mID] != null) return GregTech_API.METATILEENTITIES[mID].getInventoryName();
+ return "";
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ if (canAccessData()) return mMetaTileEntity.getInventoryStackLimit();
+ return 64;
+ }
+
+ @Override
+ public void openInventory() {
+ /* Do nothing */
+ }
+
+ @Override
+ public void closeInventory() {
+ /* Do nothing */
+ }
+
+ @Override
+ public boolean isUseableByPlayer(EntityPlayer aPlayer) {
+ return hasValidMetaTileEntity() && mTickTimer > 1
+ && getTileEntityOffset(0, 0, 0) == this
+ && aPlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64
+ && mMetaTileEntity.isAccessAllowed(aPlayer);
+ }
+
+ @Override
+ public void validate() {
+ super.validate();
+ mTickTimer = 0;
+ }
+
+ @Override
+ public void invalidate() {
+ tileEntityInvalid = false;
+ if (hasValidMetaTileEntity()) {
+ mMetaTileEntity.onRemoval();
+ mMetaTileEntity.setBaseMetaTileEntity(null);
+ }
+ leaveEnet();
+ super.invalidate();
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return false;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(int slot) {
+ ItemStack stack = getStackInSlot(slot);
+ if (stack != null) setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ /**
+ * Checks validity of meta tile and delegates to it
+ */
+ @Override
+ public void onMachineBlockUpdate() {
+ if (canAccessData()) mMetaTileEntity.onMachineBlockUpdate();
+ }
+
+ /**
+ * Checks validity of meta tile and delegates to it
+ */
+ @Override
+ public boolean isMachineBlockUpdateRecursive() {
+ return canAccessData() && mMetaTileEntity.isMachineBlockUpdateRecursive();
+ }
+
+ @Override
+ public int getProgress() {
+ return canAccessData() ? mMetaTileEntity.getProgresstime() : 0;
+ }
+
+ @Override
+ public int getMaxProgress() {
+ return canAccessData() ? mMetaTileEntity.maxProgresstime() : 0;
+ }
+
+ @Override
+ public boolean increaseProgress(int aProgressAmountInTicks) {
+ return canAccessData() && mMetaTileEntity.increaseProgress(aProgressAmountInTicks) != aProgressAmountInTicks;
+ }
+
+ @Override
+ public boolean hasThingsToDo() {
+ return getMaxProgress() > 0;
+ }
+
+ @Override
+ public void enableWorking() {
+ if (!mWorks) mWorkUpdate = true;
+ mWorks = true;
+ reloadLocks();
+ }
+
+ @Override
+ public void disableWorking() {
+ mWorks = false;
+ reloadLocks();
+ }
+
+ @Override
+ public boolean isAllowedToWork() {
+ return mWorks;
+ }
+
+ @Override
+ public boolean hasWorkJustBeenEnabled() {
+ return mWorkUpdate;
+ }
+
+ @Override
+ public byte getWorkDataValue() {
+ return 0;
+ }
+
+ @Override
+ public void setWorkDataValue(byte aValue) {
+ /* Do nothing */
+ }
+
+ @Override
+ public int getMetaTileID() {
+ return mID;
+ }
+
+ @Override
+ public int setMetaTileID(short aID) {
+ return mID = aID;
+ }
+
+ @Override
+ public boolean isActive() {
+ return false;
+ }
+
+ @Override
+ public void setActive(boolean aActive) {
+ /* Do nothing */
+ }
+
+ @Override
+ public long getTimer() {
+ return mTickTimer;
+ }
+
+ @Override
+ public boolean decreaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooLessEnergy) {
+ return false;
+ }
+
+ @Override
+ public boolean increaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooMuchEnergy) {
+ return false;
+ }
+
+ @Override
+ public boolean inputEnergyFrom(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean inputEnergyFrom(ForgeDirection side, boolean waitForActive) {
+ return false;
+ }
+
+ @Override
+ public boolean outputsEnergyTo(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean outputsEnergyTo(ForgeDirection side, boolean waitForActive) {
+ return false;
+ }
+
+ @Override
+ public long getOutputAmperage() {
+ return 0;
+ }
+
+ @Override
+ public long getOutputVoltage() {
+ return 0;
+ }
+
+ @Override
+ public long getInputAmperage() {
+ return 0;
+ }
+
+ @Override
+ public long getInputVoltage() {
+ return 0;
+ }
+
+ @Override
+ public long getUniversalEnergyStored() {
+ return Math.max(getStoredEU(), getStoredSteam());
+ }
+
+ @Override
+ public long getUniversalEnergyCapacity() {
+ return Math.max(getEUCapacity(), getSteamCapacity());
+ }
+
+ @Override
+ public long getStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long getEUCapacity() {
+ return 0;
+ }
+
+ @Override
+ public ITexture[] getTexture(Block aBlock, ForgeDirection side) {
+ final ITexture rIcon = getCoverTexture(side);
+ if (rIcon != null) return new ITexture[] { rIcon };
+ return getTextureUncovered(side);
+ }
+
+ @Override
+ public ITexture[] getTextureCovered(ForgeDirection side) {
+ final ITexture coverTexture = getCoverTexture(side);
+ final ITexture[] textureUncovered = getTextureUncovered(side);
+ final ITexture[] textureCovered;
+ if (coverTexture != null) {
+ textureCovered = Arrays.copyOf(textureUncovered, textureUncovered.length + 1);
+ textureCovered[textureUncovered.length] = coverTexture;
+ return textureCovered;
+ } else {
+ return textureUncovered;
+ }
+ }
+
+ @Override
+ public ITexture[] getTextureUncovered(ForgeDirection sideDirection) {
+ if ((mConnections & IConnectable.HAS_FRESHFOAM) != 0) return Textures.BlockIcons.FRESHFOAM;
+ if ((mConnections & IConnectable.HAS_HARDENEDFOAM) != 0) return Textures.BlockIcons.HARDENEDFOAMS[mColor];
+ if ((mConnections & IConnectable.HAS_FOAM) != 0) return Textures.BlockIcons.ERROR_RENDERING;
+ int tConnections = mConnections;
+ if (tConnections == IConnectable.CONNECTED_WEST || tConnections == IConnectable.CONNECTED_EAST)
+ tConnections = IConnectable.CONNECTED_WEST | IConnectable.CONNECTED_EAST;
+ else if (tConnections == IConnectable.CONNECTED_DOWN || tConnections == IConnectable.CONNECTED_UP)
+ tConnections = IConnectable.CONNECTED_DOWN | IConnectable.CONNECTED_UP;
+ else if (tConnections == IConnectable.CONNECTED_NORTH || tConnections == IConnectable.CONNECTED_SOUTH)
+ tConnections = IConnectable.CONNECTED_NORTH | IConnectable.CONNECTED_SOUTH;
+ if (hasValidMetaTileEntity()) return mMetaTileEntity.getTexture(
+ this,
+ sideDirection,
+ tConnections,
+ mColor - 1,
+ tConnections == 0 || (tConnections & sideDirection.flag) != 0,
+ getOutputRedstoneSignal(sideDirection) > 0);
+ return Textures.BlockIcons.ERROR_RENDERING;
+ }
+
+ @Override
+ protected boolean hasValidMetaTileEntity() {
+ return mMetaTileEntity != null && mMetaTileEntity.getBaseMetaTileEntity() == this;
+ }
+
+ @Override
+ public void doExplosion(long aAmount) {
+ if (canAccessData()) {
+ mMetaTileEntity.onExplosion();
+ mMetaTileEntity.doExplosion(aAmount);
+ }
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops() {
+ final ItemStack rStack = new ItemStack(GregTech_API.sBlockMachines, 1, mID);
+ final NBTTagCompound tNBT = new NBTTagCompound();
+
+ writeCoverNBT(tNBT, true);
+
+ if (hasValidMetaTileEntity()) mMetaTileEntity.setItemNBT(tNBT);
+ if (!tNBT.hasNoTags()) rStack.setTagCompound(tNBT);
+
+ onBaseTEDestroyed();
+ return new ArrayList<>(Collections.singletonList(rStack));
+ }
+
+ @Override
+ public boolean shouldDropItemAt(int index) {
+ return this.mMetaTileEntity == null || this.mMetaTileEntity.shouldDropItemAt(index);
+ }
+
+ @Override
+ public boolean onRightclick(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ) {
+ if (isClientSide()) {
+ // Configure Cover, sneak can also be: screwdriver, wrench, side cutter, soldering iron
+ if (aPlayer.isSneaking()) {
+ final ForgeDirection tSide = (getCoverIDAtSide(side) == 0)
+ ? GT_Utility.determineWrenchingSide(side, aX, aY, aZ)
+ : side;
+ return (getCoverInfoAtSide(tSide).hasCoverGUI());
+ } else if (getCoverBehaviorAtSideNew(side).onCoverRightclickClient(side, this, aPlayer, aX, aY, aZ)) {
+ return true;
+ }
+ }
+ if (isServerSide()) {
+ final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
+ if (tCurrentItem != null) {
+ if (getColorization() >= 0
+ && GT_Utility.areStacksEqual(new ItemStack(Items.water_bucket, 1), tCurrentItem)) {
+ mMetaTileEntity.markDirty();
+ tCurrentItem.func_150996_a(Items.bucket);
+ setColorization((byte) -1);
+ return true;
+ }
+ final ForgeDirection tSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ);
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList)) {
+
+ if (mMetaTileEntity.onWrenchRightClick(side, tSide, aPlayer, aX, aY, aZ, tCurrentItem)) {
+ mMetaTileEntity.markDirty();
+ GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer);
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_WRENCH,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ }
+ return true;
+ }
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sScrewdriverList)) {
+ if (getCoverIDAtSide(side) == 0 && getCoverIDAtSide(tSide) != 0) {
+ if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 200, aPlayer)) {
+ setCoverDataAtSide(
+ tSide,
+ getCoverInfoAtSide(tSide).onCoverScrewdriverClick(aPlayer, 0.5F, 0.5F, 0.5F));
+ mMetaTileEntity.onScrewdriverRightClick(tSide, aPlayer, aX, aY, aZ, tCurrentItem);
+ mMetaTileEntity.markDirty();
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_WRENCH,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ }
+ } else {
+ if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
+ setCoverDataAtSide(
+ side,
+ getCoverInfoAtSide(side).onCoverScrewdriverClick(aPlayer, aX, aY, aZ));
+ mMetaTileEntity.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ, tCurrentItem);
+ mMetaTileEntity.markDirty();
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_WRENCH,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ }
+ }
+ return true;
+ }
+
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sHardHammerList)) {
+ return true;
+ }
+
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSoftHammerList)) {
+ if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
+ if (mWorks) disableWorking();
+ else enableWorking();
+ mMetaTileEntity.markDirty();
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("090", "Machine Processing: ")
+ + (isAllowedToWork() ? GT_Utility.trans("088", "Enabled")
+ : GT_Utility.trans("087", "Disabled")));
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ }
+ return true;
+ }
+
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList)) {
+ if (mMetaTileEntity.onWireCutterRightClick(side, tSide, aPlayer, aX, aY, aZ, tCurrentItem)) {
+ mMetaTileEntity.markDirty();
+ // logic handled internally
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_WRENCH,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ }
+ doEnetUpdate();
+ return true;
+ }
+
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList)) {
+ if (mMetaTileEntity.onSolderingToolRightClick(side, tSide, aPlayer, aX, aY, aZ, tCurrentItem)) {
+ mMetaTileEntity.markDirty();
+ // logic handled internally
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_BATTERY_USE,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ } else if (GT_ModHandler.useSolderingIron(tCurrentItem, aPlayer)) {
+ mMetaTileEntity.markDirty();
+ mStrongRedstone ^= tSide.flag;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("091", "Redstone Output at Side ") + tSide
+ + GT_Utility.trans("092", " set to: ")
+ + ((mStrongRedstone & tSide.flag) != 0 ? GT_Utility.trans("093", "Strong")
+ : GT_Utility.trans("094", "Weak")));
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_BATTERY_USE,
+ 3.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ issueBlockUpdate();
+ }
+ doEnetUpdate();
+ return true;
+ }
+
+ ForgeDirection coverSide = side;
+ if (getCoverIDAtSide(side) == 0) coverSide = tSide;
+
+ final CoverInfo coverInfo = getCoverInfoAtSide(coverSide);
+
+ if (coverInfo.getCoverID() == 0) {
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCovers.keySet())) {
+ final GT_CoverBehaviorBase<?> coverBehavior = GregTech_API.getCoverBehaviorNew(tCurrentItem);
+ if (coverBehavior.isCoverPlaceable(coverSide, tCurrentItem, this)
+ && mMetaTileEntity.allowCoverOnSide(coverSide, new GT_ItemStack(tCurrentItem))) {
+
+ setCoverItemAtSide(coverSide, tCurrentItem);
+ coverBehavior.onPlayerAttach(aPlayer, tCurrentItem, this, side);
+
+ mMetaTileEntity.markDirty();
+ if (!aPlayer.capabilities.isCreativeMode) tCurrentItem.stackSize--;
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_WRENCH,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ }
+ return true;
+ }
+ } else {
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCrowbarList)) {
+ if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.RANDOM_BREAK,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ dropCover(coverSide, side, false);
+ mMetaTileEntity.markDirty();
+ }
+ return true;
+ }
+ }
+ } else if (aPlayer.isSneaking()) { // Sneak click, no tool -> open cover config or turn back.
+ side = (getCoverIDAtSide(side) == 0) ? GT_Utility.determineWrenchingSide(side, aX, aY, aZ) : side;
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ return coverInfo.isValid() && coverInfo.onCoverShiftRightClick(aPlayer);
+ }
+
+ if (getCoverInfoAtSide(side).onCoverRightClick(aPlayer, aX, aY, aZ)) return true;
+ }
+
+ if (!getCoverInfoAtSide(side).isGUIClickable()) return false;
+
+ try {
+ if (!aPlayer.isSneaking() && hasValidMetaTileEntity()) {
+ final boolean handled = mMetaTileEntity.onRightclick(this, aPlayer, side, aX, aY, aZ);
+ if (handled) {
+ mMetaTileEntity.markDirty();
+ }
+ return handled;
+ }
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("Encountered Exception while right clicking TileEntity", e);
+ }
+
+ return false;
+ }
+
+ @Override
+ public void onLeftclick(EntityPlayer aPlayer) {
+ try {
+ if (aPlayer != null && hasValidMetaTileEntity()) mMetaTileEntity.onLeftclick(this, aPlayer);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("Encountered Exception while left clicking TileEntity", e);
+ }
+ }
+
+ @Override
+ public boolean isDigitalChest() {
+ return false;
+ }
+
+ @Override
+ public ItemStack[] getStoredItemData() {
+ return null;
+ }
+
+ @Override
+ public void setItemCount(int aCount) {
+ //
+ }
+
+ @Override
+ public int getMaxItemCount() {
+ return 0;
+ }
+
+ /**
+ * Can put aStack into Slot
+ */
+ @Override
+ public boolean isItemValidForSlot(int aIndex, ItemStack aStack) {
+ return canAccessData() && mMetaTileEntity.isItemValidForSlot(aIndex, aStack);
+ }
+
+ /**
+ * returns all valid Inventory Slots, no matter which Side (Unless it's covered). The Side Stuff is done in the
+ * following two Functions.
+ */
+ @Override
+ public int[] getAccessibleSlotsFromSide(int ordinalSide) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(ForgeDirection.getOrientation(ordinalSide));
+ if (canAccessData() && (coverInfo.letsItemsOut(-1) || coverInfo.letsItemsIn(-1)))
+ return mMetaTileEntity.getAccessibleSlotsFromSide(ordinalSide);
+ return GT_Values.emptyIntArray;
+ }
+
+ /**
+ * Can put aStack into Slot at Side
+ */
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ return canAccessData() && getCoverInfoAtSide(ForgeDirection.getOrientation(ordinalSide)).letsItemsIn(aIndex)
+ && mMetaTileEntity.canInsertItem(aIndex, aStack, ordinalSide);
+ }
+
+ /**
+ * Can pull aStack out of Slot from Side
+ */
+ @Override
+ public boolean canExtractItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ return canAccessData()
+ && getCoverBehaviorAtSideNew(side)
+ .letsItemsOut(side, getCoverIDAtSide(side), getComplexCoverDataAtSide(side), aIndex, this)
+ && mMetaTileEntity.canExtractItem(aIndex, aStack, ordinalSide);
+ }
+
+ @Override
+ public boolean isUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isSteamEngineUpgradable() {
+ return isUpgradable() && !hasSteamEngineUpgrade() && getSteamCapacity() > 0;
+ }
+
+ @Override
+ public boolean addSteamEngineUpgrade() {
+ if (isSteamEngineUpgradable()) {
+ issueBlockUpdate();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean hasSteamEngineUpgrade() {
+ return false;
+ }
+
+ @Override
+ public void setGenericRedstoneOutput(boolean aOnOff) {
+ // Do nothing
+ }
+
+ @Override
+ public int getErrorDisplayID() {
+ return 0;
+ }
+
+ @Override
+ public void setErrorDisplayID(int aErrorID) {
+ //
+ }
+
+ @Override
+ public IMetaTileEntity getMetaTileEntity() {
+ return hasValidMetaTileEntity() ? mMetaTileEntity : null;
+ }
+
+ @Override
+ public void setMetaTileEntity(IMetaTileEntity aMetaTileEntity) {
+ mMetaTileEntity = (MetaPipeEntity) aMetaTileEntity;
+ }
+
+ @Override
+ public void setLightValue(byte aLightValue) {
+ //
+ }
+
+ @Override
+ public long getAverageElectricInput() {
+ return 0;
+ }
+
+ @Override
+ public long getAverageElectricOutput() {
+ return 0;
+ }
+
+ @Override
+ public String getOwnerName() {
+ return "Player";
+ }
+
+ @Override
+ public String setOwnerName(String aName) {
+ return "Player";
+ }
+
+ @Override
+ public UUID getOwnerUuid() {
+ return GT_Utility.defaultUuid;
+ }
+
+ @Override
+ public void setOwnerUuid(UUID uuid) {}
+
+ @Override
+ public byte getComparatorValue(ForgeDirection side) {
+ return canAccessData() ? mMetaTileEntity.getComparatorValue(side) : 0;
+ }
+
+ @Override
+ public ItemStack decrStackSize(int aIndex, int aAmount) {
+ if (canAccessData()) {
+ mInventoryChanged = true;
+ return mMetaTileEntity.decrStackSize(aIndex, aAmount);
+ }
+ return null;
+ }
+
+ @Override
+ public long injectEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage) {
+ if (canAccessData()) return mMetaTileEntity.injectEnergyUnits(side, aVoltage, aAmperage);
+ return 0;
+ }
+
+ @Override
+ public boolean drainEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage) {
+ return false;
+ }
+
+ @Override
+ public boolean acceptsRotationalEnergy(ForgeDirection side) {
+ if (!canAccessData() || getCoverIDAtSide(side) != 0) return false;
+ return mMetaTileEntity.acceptsRotationalEnergy(side);
+ }
+
+ @Override
+ public boolean injectRotationalEnergy(ForgeDirection side, long aSpeed, long aEnergy) {
+ if (!canAccessData() || getCoverIDAtSide(side) != 0) return false;
+ return mMetaTileEntity.injectRotationalEnergy(side, aSpeed, aEnergy);
+ }
+
+ private boolean canMoveFluidOnSide(ForgeDirection side, Fluid fluid, boolean isFill) {
+ if (side == ForgeDirection.UNKNOWN) return true;
+
+ final IFluidHandler tTileEntity = getITankContainerAtSide(side);
+ // Only require a connection if there's something to connect to - Allows fluid cells & buckets to interact with
+ // the pipe
+ if (tTileEntity != null && !mMetaTileEntity.isConnectedAtSide(side)) return false;
+
+ if (isFill && mMetaTileEntity.isLiquidInput(side) && getCoverInfoAtSide(side).letsFluidIn(fluid)) return true;
+
+ return !isFill && mMetaTileEntity.isLiquidOutput(side) && getCoverInfoAtSide(side).letsFluidOut(fluid);
+ }
+
+ @Override
+ public int fill(ForgeDirection side, FluidStack aFluidStack, boolean doFill) {
+ if (mTickTimer > 5 && canAccessData()
+ && canMoveFluidOnSide(side, aFluidStack == null ? null : aFluidStack.getFluid(), true))
+ return mMetaTileEntity.fill(side, aFluidStack, doFill);
+ return 0;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, int maxDrain, boolean doDrain) {
+ if (mTickTimer > 5 && canAccessData()
+ && canMoveFluidOnSide(
+ side,
+ mMetaTileEntity.getFluid() == null ? null
+ : mMetaTileEntity.getFluid()
+ .getFluid(),
+ false))
+ return mMetaTileEntity.drain(side, maxDrain, doDrain);
+ return null;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, FluidStack aFluidStack, boolean doDrain) {
+ if (mTickTimer > 5 && canAccessData()
+ && canMoveFluidOnSide(side, aFluidStack == null ? null : aFluidStack.getFluid(), false))
+ return mMetaTileEntity.drain(side, aFluidStack, doDrain);
+ return null;
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection side, Fluid aFluid) {
+ if (mTickTimer > 5 && canAccessData() && canMoveFluidOnSide(side, aFluid, true))
+ return mMetaTileEntity.canFill(side, aFluid);
+ return false;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection side, Fluid aFluid) {
+ if (mTickTimer > 5 && canAccessData() && canMoveFluidOnSide(side, aFluid, false))
+ return mMetaTileEntity.canDrain(side, aFluid);
+ return false;
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection side) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (canAccessData()
+ && (side == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidInput(side) && coverInfo.letsFluidIn(null))
+ || (mMetaTileEntity.isLiquidOutput(side) && coverInfo.letsFluidOut(null))
+ // Doesn't need to be connected to get Tank Info -- otherwise things can't connect
+ )) return mMetaTileEntity.getTankInfo(side);
+ return new FluidTankInfo[] {};
+ }
+
+ @Override
+ public boolean addStackToSlot(int aIndex, ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return true;
+ if (aIndex < 0 || aIndex >= getSizeInventory()) return false;
+ final ItemStack tStack = getStackInSlot(aIndex);
+ if (GT_Utility.isStackInvalid(tStack)) {
+ setInventorySlotContents(aIndex, aStack);
+ return true;
+ }
+ aStack = GT_OreDictUnificator.get(aStack);
+ if (GT_Utility.areStacksEqual(tStack, aStack)
+ && tStack.stackSize + aStack.stackSize <= Math.min(aStack.getMaxStackSize(), getInventoryStackLimit())) {
+ markDirty();
+ tStack.stackSize += aStack.stackSize;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addStackToSlot(int aIndex, ItemStack aStack, int aAmount) {
+ return addStackToSlot(aIndex, GT_Utility.copyAmount(aAmount, aStack));
+ }
+
+ @Override
+ public byte getColorization() {
+ return (byte) (mColor - 1);
+ }
+
+ @Override
+ public byte setColorization(byte aColor) {
+ if (aColor > 15 || aColor < -1) aColor = -1;
+ mColor = (byte) (aColor + 1);
+ if (canAccessData()) mMetaTileEntity.onColorChangeServer(aColor);
+ return mColor;
+ }
+
+ @Override
+ public float getThickNess() {
+ if (canAccessData()) return mMetaTileEntity.getThickNess();
+ return 1.0F;
+ }
+
+ public boolean renderInside(ForgeDirection side) {
+ if (canAccessData()) return mMetaTileEntity.renderInside(side);
+ return false;
+ }
+
+ @Override
+ public float getBlastResistance(ForgeDirection side) {
+ return canAccessData() ? Math.max(0, getMetaTileEntity().getExplosionResistance(side)) : 5.0F;
+ }
+
+ @Override
+ public void onBlockDestroyed() {
+ if (canAccessData()) getMetaTileEntity().onBlockDestroyed();
+ }
+
+ @Override
+ public boolean isMufflerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean addMufflerUpgrade() {
+ return false;
+ }
+
+ @Override
+ public boolean hasMufflerUpgrade() {
+ return false;
+ }
+
+ @Override
+ public boolean isUniversalEnergyStored(long aEnergyAmount) {
+ return getUniversalEnergyStored() >= aEnergyAmount;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ if (canAccessData()) return getMetaTileEntity().getInfoData();
+ return new String[] {};
+ }
+
+ @Override
+ public byte getConnections() {
+ return mConnections;
+ }
+
+ public void onNeighborBlockChange(int aX, int aY, int aZ) {
+ if (canAccessData()) {
+ final IMetaTileEntity meta = getMetaTileEntity();
+ if (meta instanceof MetaPipeEntity) {
+ // Trigger a checking of connections in case someone placed down a block that the pipe/wire shouldn't be
+ // connected to.
+ // However; don't do it immediately in case the world isn't finished loading
+ // (This caused issues with AE2 GTEU p2p connections.
+ ((MetaPipeEntity) meta).setCheckConnections();
+ }
+ }
+ }
+
+ @Override
+ public int getLightOpacity() {
+ return mMetaTileEntity == null ? 0 : mMetaTileEntity.getLightOpacity();
+ }
+
+ @Override
+ public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB,
+ List<AxisAlignedBB> outputAABB, Entity collider) {
+ mMetaTileEntity.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider);
+ }
+
+ @Override
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ return mMetaTileEntity.getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider) {
+ mMetaTileEntity.onEntityCollidedWithBlock(aWorld, aX, aY, aZ, collider);
+ }
+
+ @Override
+ public int[] getTimeStatistics() {
+ return mTimeStatistics;
+ }
+
+ @Override
+ public void startTimeStatistics() {
+ hasTimeStatisticsStarted = true;
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ mMetaTileEntity.getWailaBody(itemStack, currentTip, accessor, config);
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java
new file mode 100644
index 0000000000..bf6358c884
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java
@@ -0,0 +1,2538 @@
+package gregtech.api.metatileentity;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.enums.GT_Values.NW;
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockFire;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.EnumSkyBlock;
+import net.minecraft.world.World;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignment;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider;
+import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
+import com.gtnewhorizon.structurelib.alignment.constructable.IConstructableProvider;
+
+import appeng.api.networking.IGridNode;
+import appeng.api.networking.security.IActionHost;
+import appeng.api.util.AECableType;
+import appeng.api.util.DimensionalCoord;
+import appeng.helpers.ICustomNameObject;
+import appeng.me.helpers.AENetworkProxy;
+import appeng.me.helpers.IGridProxyable;
+import appeng.tile.TileEvent;
+import appeng.tile.events.TileEventType;
+import cpw.mods.fml.relauncher.ReflectionHelper;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.graphs.GenerateNodeMap;
+import gregtech.api.graphs.GenerateNodeMapPower;
+import gregtech.api.graphs.Node;
+import gregtech.api.interfaces.ICleanroom;
+import gregtech.api.interfaces.ICleanroomReceiver;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IDebugableTileEntity;
+import gregtech.api.interfaces.tileentity.IEnergyConnected;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IGregtechWailaProvider;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.net.GT_Packet_TileEntity;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.blockupdate.BlockUpdateHandler;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gregtech.common.GT_Pollution;
+import gregtech.common.covers.CoverInfo;
+import ic2.api.Direction;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * This is the main TileEntity for EVERYTHING.
+ */
+public class BaseMetaTileEntity extends CommonMetaTileEntity
+ implements IGregTechTileEntity, IActionHost, IGridProxyable, IAlignmentProvider, IConstructableProvider,
+ IDebugableTileEntity, IGregtechWailaProvider, ICleanroomReceiver, ICustomNameObject {
+
+ private static final Field ENTITY_ITEM_HEALTH_FIELD = ReflectionHelper
+ .findField(EntityItem.class, "health", "field_70291_e");
+ private final boolean[] mActiveEUInputs = new boolean[] { false, false, false, false, false, false };
+ private final boolean[] mActiveEUOutputs = new boolean[] { false, false, false, false, false, false };
+ private final int[] mTimeStatistics = new int[GregTech_API.TICKS_FOR_LAG_AVERAGING];
+ private boolean hasTimeStatisticsStarted;
+ public long mLastSoundTick = 0;
+ public boolean mWasShutdown = false;
+ public @Nonnull ShutDownReason lastShutDownReason = ShutDownReasonRegistry.NONE;
+ protected MetaTileEntity mMetaTileEntity;
+ protected long mStoredEnergy = 0, mStoredSteam = 0;
+ protected int mAverageEUInputIndex = 0, mAverageEUOutputIndex = 0;
+ protected boolean mReleaseEnergy = false;
+ protected final long[] mAverageEUInput = new long[] { 0, 0, 0, 0, 0 };
+ protected final long[] mAverageEUOutput = new long[] { 0, 0, 0, 0, 0 };
+ private boolean mHasEnoughEnergy = true, mRunningThroughTick = false, mInputDisabled = false,
+ mOutputDisabled = false, mMuffler = false, mLockUpgrade = false;
+ private boolean mActive = false, mWorkUpdate = false, mSteamConverter = false, mWorks = true;
+ private boolean oRedstone = false;
+ private byte mColor = 0, oColor = 0, oStrongRedstone = 0, oRedstoneData = 63, oTextureData = 0, oUpdateData = 0,
+ oTexturePage = 0;
+ private byte oLightValueClient = 0, oLightValue = -1, mLightValue = 0, mOtherUpgrades = 0, mWorkData = 0;
+ private ForgeDirection mFacing = ForgeDirection.DOWN, oFacing = ForgeDirection.DOWN;
+ private int mDisplayErrorCode = 0, oX = 0, oY = 0, oZ = 0, mTimeStatisticsIndex = 0, mLagWarningCount = 0;
+ private long oOutput = 0, mAcceptedAmperes = Long.MAX_VALUE;
+ private long mLastCheckTick = 0;
+ private String mOwnerName = "";
+ private UUID mOwnerUuid = GT_Utility.defaultUuid;
+ private NBTTagCompound mRecipeStuff = new NBTTagCompound();
+ private int cableUpdateDelay = 30;
+
+ public BaseMetaTileEntity() {}
+
+ @Override
+ public void writeToNBT(NBTTagCompound aNBT) {
+ try {
+ super.writeToNBT(aNBT);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity.", e);
+ }
+ try {
+ aNBT.setInteger("mID", mID);
+ aNBT.setLong("mStoredSteam", mStoredSteam);
+ aNBT.setLong("mStoredEnergy", mStoredEnergy);
+ writeCoverNBT(aNBT, false);
+ aNBT.setByte("mColor", mColor);
+ aNBT.setByte("mLightValue", mLightValue);
+ aNBT.setByte("mOtherUpgrades", mOtherUpgrades);
+ aNBT.setByte("mWorkData", mWorkData);
+ aNBT.setShort("mFacing", (short) mFacing.ordinal());
+ aNBT.setString("mOwnerName", mOwnerName);
+ aNBT.setString("mOwnerUuid", mOwnerUuid == null ? "" : mOwnerUuid.toString());
+ aNBT.setBoolean("mLockUpgrade", mLockUpgrade);
+ aNBT.setBoolean("mMuffler", mMuffler);
+ aNBT.setBoolean("mSteamConverter", mSteamConverter);
+ aNBT.setBoolean("mActive", mActive);
+ aNBT.setBoolean("mWorks", !mWorks);
+ aNBT.setBoolean("mInputDisabled", mInputDisabled);
+ aNBT.setBoolean("mOutputDisabled", mOutputDisabled);
+ aNBT.setTag("GT.CraftingComponents", mRecipeStuff);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity.", e);
+ }
+ saveMetaTileNBT(aNBT);
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound aNBT) {
+ super.readFromNBT(aNBT);
+ setInitialValuesAsNBT(aNBT, (short) 0);
+ }
+
+ @Override
+ public void setInitialValuesAsNBT(NBTTagCompound aNBT, short aID) {
+ if (aNBT == null) {
+ if (aID > 0) mID = aID;
+ else mID = mID > 0 ? mID : 0;
+ if (mID != 0) createNewMetatileEntity(mID);
+ mSidedRedstone = (hasValidMetaTileEntity() && mMetaTileEntity.hasSidedRedstoneOutputBehavior()
+ ? new byte[] { 0, 0, 0, 0, 0, 0 }
+ : new byte[] { 15, 15, 15, 15, 15, 15 });
+ } else {
+ if (aID <= 0) mID = (short) aNBT.getInteger("mID");
+ else mID = aID;
+ mStoredSteam = aNBT.getLong("mStoredSteam");
+ mStoredEnergy = aNBT.getLong("mStoredEnergy");
+ mColor = aNBT.getByte("mColor");
+ mLightValue = aNBT.getByte("mLightValue");
+ mWorkData = aNBT.getByte("mWorkData");
+ mFacing = oFacing = ForgeDirection.getOrientation(aNBT.getShort("mFacing"));
+ mOwnerName = aNBT.getString("mOwnerName");
+ try {
+ mOwnerUuid = UUID.fromString(aNBT.getString("mOwnerUuid"));
+ } catch (IllegalArgumentException e) {
+ mOwnerUuid = null;
+ }
+ mLockUpgrade = aNBT.getBoolean("mLockUpgrade");
+ mMuffler = aNBT.getBoolean("mMuffler");
+ mSteamConverter = aNBT.getBoolean("mSteamConverter");
+ mActive = aNBT.getBoolean("mActive");
+ mWorks = !aNBT.getBoolean("mWorks");
+ mInputDisabled = aNBT.getBoolean("mInputDisabled");
+ mOutputDisabled = aNBT.getBoolean("mOutputDisabled");
+ mOtherUpgrades = (byte) (aNBT.getByte("mOtherUpgrades") + aNBT.getByte("mBatteries")
+ + aNBT.getByte("mLiBatteries"));
+
+ mRecipeStuff = aNBT.getCompoundTag("GT.CraftingComponents");
+ final int nbtVersion = aNBT.getInteger("nbtVersion");
+ readCoverNBT(aNBT);
+ loadMetaTileNBT(aNBT);
+ }
+
+ if (mSidedRedstone.length != 6)
+ if (hasValidMetaTileEntity() && mMetaTileEntity.hasSidedRedstoneOutputBehavior())
+ mSidedRedstone = new byte[] { 0, 0, 0, 0, 0, 0 };
+ else mSidedRedstone = new byte[] { 15, 15, 15, 15, 15, 15 };
+
+ updateCoverBehavior();
+ }
+
+ /**
+ * Used for ticking special BaseMetaTileEntities, which need that for Energy Conversion It's called right before
+ * onPostTick()
+ */
+ public void updateStatus() {
+ //
+ }
+
+ /**
+ * Called when trying to charge Items
+ */
+ public void chargeItem(ItemStack aStack) {
+ decreaseStoredEU(
+ GT_ModHandler.chargeElectricItem(
+ aStack,
+ (int) Math.min(Integer.MAX_VALUE, getStoredEU()),
+ (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getOutputTier()),
+ false,
+ false),
+ true);
+ }
+
+ /**
+ * Called when trying to discharge Items
+ */
+ public void dischargeItem(ItemStack aStack) {
+ increaseStoredEnergyUnits(
+ GT_ModHandler.dischargeElectricItem(
+ aStack,
+ (int) Math.min(Integer.MAX_VALUE, getEUCapacity() - getStoredEU()),
+ (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getInputTier()),
+ false,
+ false,
+ false),
+ true);
+ }
+
+ protected boolean isRainPossible() {
+ BiomeGenBase biome = getBiome();
+ // see net.minecraft.client.renderer.EntityRenderer.renderRainSnow
+ return biome.rainfall > 0 && (biome.canSpawnLightningBolt() || biome.getEnableSnow());
+ }
+
+ /**
+ * Check if this is exposed to rain
+ *
+ * @return True if exposed to rain, else false
+ */
+ public boolean isRainExposed() {
+ final int precipitationHeightAtSide2 = worldObj.getPrecipitationHeight(xCoord, zCoord - 1);
+ final int precipitationHeightAtSide3 = worldObj.getPrecipitationHeight(xCoord, zCoord + 1);
+ final int precipitationHeightAtSide4 = worldObj.getPrecipitationHeight(xCoord - 1, zCoord);
+ final int precipitationHeightAtSide5 = worldObj.getPrecipitationHeight(xCoord + 1, zCoord);
+ return (getCoverIDAtSide(ForgeDirection.UP) == 0
+ && worldObj.getPrecipitationHeight(xCoord, zCoord) - 2 < yCoord)
+ || (getCoverIDAtSide(ForgeDirection.NORTH) == 0 && precipitationHeightAtSide2 - 1 < yCoord
+ && precipitationHeightAtSide2 > -1)
+ || (getCoverIDAtSide(ForgeDirection.SOUTH) == 0 && precipitationHeightAtSide3 - 1 < yCoord
+ && precipitationHeightAtSide3 > -1)
+ || (getCoverIDAtSide(ForgeDirection.WEST) == 0 && precipitationHeightAtSide4 - 1 < yCoord
+ && precipitationHeightAtSide4 > -1)
+ || (getCoverIDAtSide(ForgeDirection.EAST) == 0 && precipitationHeightAtSide5 - 1 < yCoord
+ && precipitationHeightAtSide5 > -1);
+ }
+
+ @Override
+ public void updateEntity() {
+ super.updateEntity();
+
+ if (!hasValidMetaTileEntity()) {
+ if (mMetaTileEntity == null) return;
+ mMetaTileEntity.setBaseMetaTileEntity(this);
+ }
+
+ mRunningThroughTick = true;
+ long tTime;
+ if (hasTimeStatisticsStarted) {
+ tTime = System.nanoTime();
+ } else {
+ tTime = 0;
+ }
+ final boolean aSideServer = isServerSide();
+ final boolean aSideClient = isClientSide();
+
+ try {
+ if (hasValidMetaTileEntity()) {
+ if (mTickTimer++ == 0) {
+ oX = xCoord;
+ oY = yCoord;
+ oZ = zCoord;
+ if (aSideServer) {
+ checkDropCover();
+ } else {
+ requestCoverDataIfNeeded();
+ }
+ worldObj.markTileEntityChunkModified(xCoord, yCoord, zCoord, this);
+ mMetaTileEntity.onFirstTick(this);
+ if (!hasValidMetaTileEntity()) {
+ mRunningThroughTick = false;
+ return;
+ }
+ }
+ if (aSideClient) {
+ if (mColor != oColor) {
+ mMetaTileEntity.onColorChangeClient(oColor = mColor);
+ issueTextureUpdate();
+ }
+
+ if (mLightValue != oLightValueClient) {
+ worldObj.setLightValue(EnumSkyBlock.Block, xCoord, yCoord, zCoord, mLightValue);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord + 1, yCoord, zCoord);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord - 1, yCoord, zCoord);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord + 1, zCoord);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord - 1, zCoord);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord + 1);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord - 1);
+ oLightValueClient = mLightValue;
+ issueTextureUpdate();
+ }
+
+ if (mNeedsUpdate) {
+ if (GT_Mod.gregtechproxy.mUseBlockUpdateHandler) {
+ BlockUpdateHandler.Instance.enqueueBlockUpdate(worldObj, getLocation());
+ } else {
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ }
+ mNeedsUpdate = false;
+ }
+ }
+ if (aSideServer && mTickTimer > 10) {
+ if (!doCoverThings()) {
+ mRunningThroughTick = false;
+ return;
+ }
+ }
+ if (aSideServer) {
+ if (++mAverageEUInputIndex >= mAverageEUInput.length) mAverageEUInputIndex = 0;
+ if (++mAverageEUOutputIndex >= mAverageEUOutput.length) mAverageEUOutputIndex = 0;
+
+ mAverageEUInput[mAverageEUInputIndex] = 0;
+ mAverageEUOutput[mAverageEUOutputIndex] = 0;
+ }
+
+ mMetaTileEntity.onPreTick(this, mTickTimer);
+
+ if (!hasValidMetaTileEntity()) {
+ mRunningThroughTick = false;
+ return;
+ }
+ if (aSideServer) {
+ if (mRedstone != oRedstone || mTickTimer == 10) {
+ updateCoverBehavior();
+ oRedstone = mRedstone;
+ issueBlockUpdate();
+ }
+ if (mTickTimer == 10) joinEnet();
+
+ if (xCoord != oX || yCoord != oY || zCoord != oZ) {
+ oX = xCoord;
+ oY = yCoord;
+ oZ = zCoord;
+ issueClientUpdate();
+ clearTileEntityBuffer();
+ }
+
+ if (mFacing != oFacing) {
+ oFacing = mFacing;
+ checkDropCover();
+ issueBlockUpdate();
+ }
+
+ if (mTickTimer > 20 && mMetaTileEntity.isElectric()) {
+ mAcceptedAmperes = 0;
+
+ if (getOutputVoltage() != oOutput) {
+ oOutput = getOutputVoltage();
+ }
+
+ if (mMetaTileEntity.isEnetOutput() || mMetaTileEntity.isEnetInput()) {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final int ordinalSide = side.ordinal();
+ boolean temp = isEnergyInputSide(side);
+ if (temp != mActiveEUInputs[ordinalSide]) {
+ mActiveEUInputs[ordinalSide] = temp;
+ }
+ temp = isEnergyOutputSide(side);
+ if (temp != mActiveEUOutputs[ordinalSide]) {
+ mActiveEUOutputs[ordinalSide] = temp;
+ }
+ }
+ }
+
+ if (mMetaTileEntity.isEnetOutput() && oOutput > 0) {
+ final long tOutputVoltage = Math
+ .max(oOutput, oOutput + (1L << Math.max(0, GT_Utility.getTier(oOutput) - 1)));
+ final long tUsableAmperage = Math.min(
+ getOutputAmperage(),
+ (getStoredEU() - mMetaTileEntity.getMinimumStoredEU()) / tOutputVoltage);
+ if (tUsableAmperage > 0) {
+ final long tEU = tOutputVoltage
+ * Util.emitEnergyToNetwork(oOutput, tUsableAmperage, this);
+ mAverageEUOutput[mAverageEUOutputIndex] += tEU;
+ decreaseStoredEU(tEU, true);
+ }
+ }
+ if (getEUCapacity() > 0) {
+ if (GregTech_API.sMachineFireExplosions && getRandomNumber(1000) == 0) {
+ final Block tBlock = getBlockAtSide(ForgeDirection.getOrientation(getRandomNumber(6)));
+ if (tBlock instanceof BlockFire) doEnergyExplosion();
+ }
+
+ if (!hasValidMetaTileEntity()) {
+ mRunningThroughTick = false;
+ return;
+ }
+
+ if (GregTech_API.sMachineRainExplosions) {
+ if (mMetaTileEntity.willExplodeInRain()) {
+ if (getRandomNumber(1000) == 0 && isRainPossible()) {
+ // Short-circuit so raincheck happens before isRainExposed,
+ // saves sme TPS since rain exposed check can be slow
+ // This logic can be compressed further by only checking for
+ // isRainExposed once IF we can guarantee it never thunders without
+ // raining, but I don't know if this is true or not.
+ if (worldObj.isRaining() && isRainExposed()) {
+ if (getRandomNumber(10) == 0) {
+ try {
+ GT_Mod.achievements.issueAchievement(
+ this.getWorldObj()
+ .getPlayerEntityByName(mOwnerName),
+ "badweather");
+ } catch (Exception ignored) {}
+ GT_Log.exp.println(
+ "Machine at: " + this.getXCoord()
+ + " | "
+ + this.getYCoord()
+ + " | "
+ + this.getZCoord()
+ + " DIMID: "
+ + this.worldObj.provider.dimensionId
+ + " explosion due to rain!");
+ doEnergyExplosion();
+ } else {
+ GT_Log.exp.println(
+ "Machine at: " + this.getXCoord()
+ + " | "
+ + this.getYCoord()
+ + " | "
+ + this.getZCoord()
+ + " DIMID: "
+ + this.worldObj.provider.dimensionId
+ + " set to Fire due to rain!");
+ setOnFire();
+ }
+ }
+ if (!hasValidMetaTileEntity()) {
+ mRunningThroughTick = false;
+ return;
+ }
+ if (GregTech_API.sMachineThunderExplosions && worldObj.isThundering()
+ && getRandomNumber(3) == 0
+ && isRainExposed()) {
+ try {
+ GT_Mod.achievements.issueAchievement(
+ this.getWorldObj()
+ .getPlayerEntityByName(mOwnerName),
+ "badweather");
+ } catch (Exception ignored) {}
+ GT_Log.exp.println(
+ "Machine at: " + this.getXCoord()
+ + " | "
+ + this.getYCoord()
+ + " | "
+ + this.getZCoord()
+ + " DIMID: "
+ + this.worldObj.provider.dimensionId
+ + " explosion due to Thunderstorm!");
+ doEnergyExplosion();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!hasValidMetaTileEntity()) {
+ mRunningThroughTick = false;
+ return;
+ }
+ }
+ if (aSideServer) {
+ if (mMetaTileEntity.dechargerSlotCount() > 0 && getStoredEU() < getEUCapacity()) {
+ for (int i = mMetaTileEntity.dechargerSlotStartIndex(),
+ k = mMetaTileEntity.dechargerSlotCount() + i; i < k; i++) {
+ if (mMetaTileEntity.mInventory[i] != null && getStoredEU() < getEUCapacity()) {
+ dischargeItem(mMetaTileEntity.mInventory[i]);
+ if (ic2.api.info.Info.itemEnergy.getEnergyValue(mMetaTileEntity.mInventory[i]) > 0) {
+ if ((getStoredEU()
+ + ic2.api.info.Info.itemEnergy.getEnergyValue(mMetaTileEntity.mInventory[i]))
+ < getEUCapacity()) {
+ increaseStoredEnergyUnits(
+ (long) ic2.api.info.Info.itemEnergy
+ .getEnergyValue(mMetaTileEntity.mInventory[i]),
+ false);
+ mMetaTileEntity.mInventory[i].stackSize--;
+ mInventoryChanged = true;
+ }
+ }
+ if (mMetaTileEntity.mInventory[i].stackSize <= 0) {
+ mMetaTileEntity.mInventory[i] = null;
+ mInventoryChanged = true;
+ }
+ }
+ }
+ }
+ }
+ if (aSideServer) {
+ if (mMetaTileEntity.rechargerSlotCount() > 0 && getStoredEU() > 0) {
+ for (int i = mMetaTileEntity.rechargerSlotStartIndex(),
+ k = mMetaTileEntity.rechargerSlotCount() + i; i < k; i++) {
+ if (getStoredEU() > 0 && mMetaTileEntity.mInventory[i] != null) {
+ chargeItem(mMetaTileEntity.mInventory[i]);
+ if (mMetaTileEntity.mInventory[i].stackSize <= 0) {
+ mMetaTileEntity.mInventory[i] = null;
+ mInventoryChanged = true;
+ }
+ }
+ }
+ }
+ }
+ updateStatus();
+ if (!hasValidMetaTileEntity()) {
+ mRunningThroughTick = false;
+ return;
+ }
+ mMetaTileEntity.onPostTick(this, mTickTimer);
+ if (!hasValidMetaTileEntity()) {
+ mRunningThroughTick = false;
+ return;
+ }
+ if (aSideServer) {
+ if (mTickTimer > 20 && cableUpdateDelay == 0) {
+ generatePowerNodes();
+ }
+ cableUpdateDelay--;
+ if (mTickTimer % 10 == 0) {
+ sendClientData();
+ }
+
+ if (mTickTimer > 10) {
+ byte tData = (byte) ((mFacing.ordinal() & 7) | (mActive ? 8 : 0)
+ | (mRedstone ? 16 : 0)
+ | (mLockUpgrade ? 32 : 0)
+ | (mWorks ? 64 : 0)
+ | (mMuffler ? 128 : 0));
+ if (tData != oTextureData)
+ sendBlockEvent(GregTechTileClientEvents.CHANGE_COMMON_DATA, oTextureData = tData);
+
+ tData = mMetaTileEntity.getUpdateData();
+ if (tData != oUpdateData)
+ sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, oUpdateData = tData);
+ if (mMetaTileEntity instanceof GT_MetaTileEntity_Hatch) {
+ tData = ((GT_MetaTileEntity_Hatch) mMetaTileEntity).getTexturePage();
+ if (tData != oTexturePage) sendBlockEvent(
+ GregTechTileClientEvents.CHANGE_CUSTOM_DATA,
+ (byte) ((oTexturePage = tData) | 0x80)); // set last bit as a flag for page
+ }
+ if (mColor != oColor) sendBlockEvent(GregTechTileClientEvents.CHANGE_COLOR, oColor = mColor);
+ tData = (byte) (((mSidedRedstone[0] > 0) ? 1 : 0) | ((mSidedRedstone[1] > 0) ? 2 : 0)
+ | ((mSidedRedstone[2] > 0) ? 4 : 0)
+ | ((mSidedRedstone[3] > 0) ? 8 : 0)
+ | ((mSidedRedstone[4] > 0) ? 16 : 0)
+ | ((mSidedRedstone[5] > 0) ? 32 : 0));
+ if (tData != oRedstoneData)
+ sendBlockEvent(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, oRedstoneData = tData);
+ if (mLightValue != oLightValue) {
+ worldObj.setLightValue(EnumSkyBlock.Block, xCoord, yCoord, zCoord, mLightValue);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord + 1, yCoord, zCoord);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord - 1, yCoord, zCoord);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord + 1, zCoord);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord - 1, zCoord);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord + 1);
+ worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord - 1);
+ issueTextureUpdate();
+ sendBlockEvent(GregTechTileClientEvents.CHANGE_LIGHT, oLightValue = mLightValue);
+ }
+ }
+
+ if (mNeedsBlockUpdate) {
+ updateNeighbours(mStrongRedstone, oStrongRedstone);
+ oStrongRedstone = mStrongRedstone;
+ mNeedsBlockUpdate = false;
+ }
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ e.printStackTrace(GT_Log.err);
+ try {
+ mMetaTileEntity.onTickFail(this, mTickTimer);
+ } catch (Throwable ex) {
+ ex.printStackTrace();
+ ex.printStackTrace(GT_Log.err);
+ }
+ }
+
+ if (aSideServer && hasTimeStatisticsStarted && hasValidMetaTileEntity()) {
+ tTime = System.nanoTime() - tTime;
+ mTimeStatisticsIndex = (mTimeStatisticsIndex + 1) % mTimeStatistics.length;
+ mTimeStatistics[mTimeStatisticsIndex] = (int) tTime;
+ if (tTime > 0 && tTime > (GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING * 1_000_000L)
+ && mTickTimer > 1000
+ && getMetaTileEntity().doTickProfilingMessageDuringThisTick()
+ && mLagWarningCount++ < 10)
+ GT_FML_LOGGER.warn(
+ "WARNING: Possible Lag Source at [" + xCoord
+ + ", "
+ + yCoord
+ + ", "
+ + zCoord
+ + "] in Dimension "
+ + worldObj.provider.dimensionId
+ + " with "
+ + tTime
+ + "ns caused by an instance of "
+ + getMetaTileEntity().getClass());
+ }
+
+ mWorkUpdate = mInventoryChanged = mRunningThroughTick = false;
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ if (hasValidMetaTileEntity()) {
+ getMetaTileEntity().getWailaBody(itemStack, currentTip, accessor, config);
+ }
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ if (hasValidMetaTileEntity()) {
+ getMetaTileEntity().getWailaNBTData(player, tile, tag, world, x, y, z);
+ }
+ }
+
+ private void sendClientData() {
+ if (mSendClientData) {
+ NW.sendPacketToAllPlayersInRange(
+ worldObj,
+ new GT_Packet_TileEntity(
+ xCoord,
+ (short) yCoord,
+ zCoord,
+ mID,
+ getCoverInfoAtSide(ForgeDirection.DOWN).getCoverID(),
+ getCoverInfoAtSide(ForgeDirection.UP).getCoverID(),
+ getCoverInfoAtSide(ForgeDirection.NORTH).getCoverID(),
+ getCoverInfoAtSide(ForgeDirection.SOUTH).getCoverID(),
+ getCoverInfoAtSide(ForgeDirection.WEST).getCoverID(),
+ getCoverInfoAtSide(ForgeDirection.EAST).getCoverID(),
+ oTextureData = (byte) ((mFacing.ordinal() & 7) | (mActive ? 8 : 0)
+ | (mRedstone ? 16 : 0)
+ | (mLockUpgrade ? 32 : 0)
+ | (mWorks ? 64 : 0)),
+ oTexturePage = (hasValidMetaTileEntity() && mMetaTileEntity instanceof GT_MetaTileEntity_Hatch)
+ ? ((GT_MetaTileEntity_Hatch) mMetaTileEntity).getTexturePage()
+ : 0,
+ oUpdateData = hasValidMetaTileEntity() ? mMetaTileEntity.getUpdateData() : 0,
+ oRedstoneData = (byte) (((mSidedRedstone[0] > 0) ? 1 : 0) | ((mSidedRedstone[1] > 0) ? 2 : 0)
+ | ((mSidedRedstone[2] > 0) ? 4 : 0)
+ | ((mSidedRedstone[3] > 0) ? 8 : 0)
+ | ((mSidedRedstone[4] > 0) ? 16 : 0)
+ | ((mSidedRedstone[5] > 0) ? 32 : 0)),
+ oColor = mColor),
+ xCoord,
+ zCoord);
+ mSendClientData = false;
+ }
+ sendCoverDataIfNeeded();
+ }
+
+ public final void receiveMetaTileEntityData(short aID, int aCover0, int aCover1, int aCover2, int aCover3,
+ int aCover4, int aCover5, byte aTextureData, byte aTexturePage, byte aUpdateData, byte aRedstoneData,
+ byte aColorData) {
+ issueTextureUpdate();
+ if (mID != aID && aID > 0) {
+ mID = aID;
+ createNewMetatileEntity(mID);
+ }
+
+ setCoverIDAtSide(ForgeDirection.DOWN, aCover0);
+ setCoverIDAtSide(ForgeDirection.UP, aCover1);
+ setCoverIDAtSide(ForgeDirection.NORTH, aCover2);
+ setCoverIDAtSide(ForgeDirection.SOUTH, aCover3);
+ setCoverIDAtSide(ForgeDirection.WEST, aCover4);
+ setCoverIDAtSide(ForgeDirection.EAST, aCover5);
+
+ receiveClientEvent(GregTechTileClientEvents.CHANGE_COMMON_DATA, aTextureData);
+ receiveClientEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, aUpdateData & 0x7F);
+ receiveClientEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, aTexturePage | 0x80);
+ receiveClientEvent(GregTechTileClientEvents.CHANGE_COLOR, aColorData);
+ receiveClientEvent(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, aRedstoneData);
+ }
+
+ @Override
+ public boolean receiveClientEvent(int aEventID, int aValue) {
+ super.receiveClientEvent(aEventID, aValue);
+
+ if (hasValidMetaTileEntity()) {
+ try {
+ mMetaTileEntity.receiveClientEvent((byte) aEventID, (byte) aValue);
+ } catch (Throwable e) {
+ GT_Log.err.println(
+ "Encountered Exception while receiving Data from the Server, the Client should've been crashed by now, but I prevented that. Please report immediately to GregTech Intergalactical!!!");
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ if (isClientSide()) {
+ issueTextureUpdate();
+ switch (aEventID) {
+ case GregTechTileClientEvents.CHANGE_COMMON_DATA -> {
+ mFacing = ForgeDirection.getOrientation((byte) (aValue & 7));
+ mActive = ((aValue & 8) != 0);
+ mRedstone = ((aValue & 16) != 0);
+ // mLockUpgrade = ((aValue&32) != 0);
+ mWorks = ((aValue & 64) != 0);
+ mMuffler = ((aValue & 128) != 0);
+ }
+ case GregTechTileClientEvents.CHANGE_CUSTOM_DATA -> {
+ if (hasValidMetaTileEntity()) {
+ if ((aValue & 0x80) == 0) // Is texture index
+ mMetaTileEntity.onValueUpdate((byte) (aValue & 0x7F));
+ else if (mMetaTileEntity instanceof GT_MetaTileEntity_Hatch) // is texture page and hatch
+ ((GT_MetaTileEntity_Hatch) mMetaTileEntity).onTexturePageUpdate((byte) (aValue & 0x7F));
+ }
+ }
+ case GregTechTileClientEvents.CHANGE_COLOR -> {
+ if (aValue > 16 || aValue < 0) aValue = 0;
+ mColor = (byte) aValue;
+ }
+ case GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT -> {
+ mSidedRedstone[0] = (byte) ((aValue & 1) == 1 ? 15 : 0);
+ mSidedRedstone[1] = (byte) ((aValue & 2) == 2 ? 15 : 0);
+ mSidedRedstone[2] = (byte) ((aValue & 4) == 4 ? 15 : 0);
+ mSidedRedstone[3] = (byte) ((aValue & 8) == 8 ? 15 : 0);
+ mSidedRedstone[4] = (byte) ((aValue & 16) == 16 ? 15 : 0);
+ mSidedRedstone[5] = (byte) ((aValue & 32) == 32 ? 15 : 0);
+ }
+ case GregTechTileClientEvents.DO_SOUND -> {
+ if (hasValidMetaTileEntity() && mTickTimer > 20)
+ mMetaTileEntity.doSound((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5);
+ }
+ case GregTechTileClientEvents.START_SOUND_LOOP -> {
+ if (hasValidMetaTileEntity() && mTickTimer > 20)
+ mMetaTileEntity.startSoundLoop((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5);
+ }
+ case GregTechTileClientEvents.STOP_SOUND_LOOP -> {
+ if (hasValidMetaTileEntity() && mTickTimer > 20)
+ mMetaTileEntity.stopSoundLoop((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5);
+ }
+ case GregTechTileClientEvents.CHANGE_LIGHT -> mLightValue = (byte) aValue;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public ArrayList<String> getDebugInfo(EntityPlayer aPlayer, int aLogLevel) {
+ final ArrayList<String> tList = new ArrayList<>();
+ if (aLogLevel > 2) {
+ tList.add(
+ "Meta-ID: " + EnumChatFormatting.BLUE
+ + mID
+ + EnumChatFormatting.RESET
+ + (canAccessData() ? EnumChatFormatting.GREEN + " valid" + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + " invalid" + EnumChatFormatting.RESET)
+ + (mMetaTileEntity == null
+ ? EnumChatFormatting.RED + " MetaTileEntity == null!" + EnumChatFormatting.RESET
+ : " "));
+ }
+ if (aLogLevel > 1 && mMetaTileEntity != null) {
+ if (hasTimeStatisticsStarted) {
+ double tAverageTime = 0;
+ double tWorstTime = 0;
+ int amountOfZero = 0;
+ for (int tTime : mTimeStatistics) {
+ tAverageTime += tTime;
+ if (tTime > tWorstTime) {
+ tWorstTime = tTime;
+ }
+ if (tTime == 0) {
+ amountOfZero += 1;
+ }
+ // Uncomment this line to print out tick-by-tick times.
+ // tList.add("tTime " + tTime);
+ }
+ // tick time zero means it has not been updated yet
+ int samples = mTimeStatistics.length - amountOfZero;
+ if (samples > 0) {
+ tList.add(
+ "Average CPU load of ~" + GT_Utility.formatNumbers(tAverageTime / samples)
+ + "ns over "
+ + GT_Utility.formatNumbers(samples)
+ + " ticks with worst time of "
+ + GT_Utility.formatNumbers(tWorstTime)
+ + "ns.");
+ }
+ } else {
+ startTimeStatistics();
+ tList.add("Just started tick time statistics.");
+ }
+ tList.add(
+ "Recorded " + GT_Utility.formatNumbers(mMetaTileEntity.mSoundRequests)
+ + " sound requests in "
+ + GT_Utility.formatNumbers(mTickTimer - mLastCheckTick)
+ + " ticks.");
+ mLastCheckTick = mTickTimer;
+ mMetaTileEntity.mSoundRequests = 0;
+ if (mLagWarningCount > 0) {
+ tList.add(
+ "Caused " + (mLagWarningCount >= 10 ? "more than 10" : mLagWarningCount)
+ + " Lag Spike Warnings (anything taking longer than "
+ + GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING
+ + "ms) on the Server.");
+ }
+ tList.add(
+ "Is" + (mMetaTileEntity.isAccessAllowed(aPlayer) ? " "
+ : EnumChatFormatting.RED + " not " + EnumChatFormatting.RESET) + "accessible for you");
+ }
+ if (aLogLevel > 0) {
+ if (getSteamCapacity() > 0 && hasSteamEngineUpgrade()) tList.add(
+ GT_Utility.formatNumbers(getStoredSteam()) + " of "
+ + GT_Utility.formatNumbers(getSteamCapacity())
+ + " Steam");
+ tList.add(
+ "Machine is " + (mActive ? EnumChatFormatting.GREEN + "active" + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + "inactive" + EnumChatFormatting.RESET));
+ if (!mHasEnoughEnergy) tList
+ .add(EnumChatFormatting.RED + "ATTENTION: This Device needs more power." + EnumChatFormatting.RESET);
+ }
+ if (joinedIc2Enet) tList.add("Joined IC2 ENet");
+ return mMetaTileEntity.getSpecialDebugInfo(this, aPlayer, aLogLevel, tList);
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ if (canAccessData()) return mMetaTileEntity.isGivingInformation();
+ return false;
+ }
+
+ @Override
+ public ForgeDirection getBackFacing() {
+ return mFacing.getOpposite();
+ }
+
+ @Override
+ public ForgeDirection getFrontFacing() {
+ return mFacing;
+ }
+
+ @Override
+ public void setFrontFacing(ForgeDirection aFacing) {
+ if (isValidFacing(aFacing)) {
+ mFacing = aFacing;
+ mMetaTileEntity.onFacingChange();
+
+ doEnetUpdate();
+ cableUpdateDelay = 10;
+
+ if (mMetaTileEntity.shouldTriggerBlockUpdate()) {
+ // If we're triggering a block update this will call onMachineBlockUpdate()
+ GregTech_API.causeMachineUpdate(worldObj, xCoord, yCoord, zCoord);
+ } else {
+ // If we're not trigger a cascading one, call the update here.
+ onMachineBlockUpdate();
+ }
+ }
+ }
+
+ @Override
+ public int getSizeInventory() {
+ if (canAccessData()) return mMetaTileEntity.getSizeInventory();
+ return 0;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(int aIndex) {
+ if (canAccessData()) return mMetaTileEntity.getStackInSlot(aIndex);
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(int aIndex, ItemStack aStack) {
+ mInventoryChanged = true;
+ if (canAccessData()) {
+ markDirty();
+ mMetaTileEntity.setInventorySlotContents(
+ aIndex,
+ worldObj.isRemote ? aStack : GT_OreDictUnificator.setStack(true, aStack));
+ }
+ }
+
+ @Override
+ public String getInventoryName() {
+ if (canAccessData()) return mMetaTileEntity.getInventoryName();
+ if (GregTech_API.METATILEENTITIES[mID] != null) return GregTech_API.METATILEENTITIES[mID].getInventoryName();
+ return "";
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ if (canAccessData()) return mMetaTileEntity.getInventoryStackLimit();
+ return 64;
+ }
+
+ @Override
+ public void openInventory() {
+ if (canAccessData()) mMetaTileEntity.onOpenGUI();
+ }
+
+ @Override
+ public void closeInventory() {
+ if (canAccessData()) mMetaTileEntity.onCloseGUI();
+ }
+
+ @Override
+ public boolean isUseableByPlayer(EntityPlayer aPlayer) {
+ return canAccessData() && playerOwnsThis(aPlayer, false)
+ && mTickTimer > 1
+ && getTileEntityOffset(0, 0, 0) == this
+ && aPlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64
+ && mMetaTileEntity.isAccessAllowed(aPlayer);
+ }
+
+ @Override
+ public void validate() {
+ super.validate();
+ mTickTimer = 0;
+ }
+
+ @Override
+ public void invalidate() {
+ tileEntityInvalid = false;
+ leaveEnet();
+ if (canAccessData()) {
+ invalidateAE();
+ mMetaTileEntity.onRemoval();
+ mMetaTileEntity.setBaseMetaTileEntity(null);
+ }
+ super.invalidate();
+ }
+
+ @Override
+ public void onChunkUnload() {
+ if (canAccessData()) {
+ mMetaTileEntity.onUnload();
+ }
+
+ super.onChunkUnload();
+ onChunkUnloadAE();
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return false;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(int slot) {
+ final ItemStack stack = getStackInSlot(slot);
+ if (stack != null) setInventorySlotContents(slot, null);
+ return stack;
+ }
+
+ /**
+ * Checks validity of meta tile and delegates to it
+ */
+ @Override
+ public void onMachineBlockUpdate() {
+ if (canAccessData()) mMetaTileEntity.onMachineBlockUpdate();
+ cableUpdateDelay = 10;
+ }
+
+ /**
+ * Checks validity of meta tile and delegates to it
+ */
+ @Override
+ public boolean isMachineBlockUpdateRecursive() {
+ return canAccessData() && mMetaTileEntity.isMachineBlockUpdateRecursive();
+ }
+
+ @Override
+ public int getProgress() {
+ return canAccessData() ? mMetaTileEntity.getProgresstime() : 0;
+ }
+
+ @Override
+ public int getMaxProgress() {
+ return canAccessData() ? mMetaTileEntity.maxProgresstime() : 0;
+ }
+
+ @Override
+ public boolean increaseProgress(int aProgressAmountInTicks) {
+ return canAccessData() && mMetaTileEntity.increaseProgress(aProgressAmountInTicks) != aProgressAmountInTicks;
+ }
+
+ @Override
+ public boolean hasThingsToDo() {
+ return getMaxProgress() > 0;
+ }
+
+ @Override
+ public void enableWorking() {
+ if (!mWorks) mWorkUpdate = true;
+ mWorks = true;
+ mWasShutdown = false;
+ }
+
+ @Override
+ public void disableWorking() {
+ mWorks = false;
+ if (hasValidMetaTileEntity()) {
+ mMetaTileEntity.onDisableWorking();
+ }
+ }
+
+ @Override
+ public boolean isAllowedToWork() {
+ return mWorks;
+ }
+
+ @Override
+ public boolean hasWorkJustBeenEnabled() {
+ return mWorkUpdate;
+ }
+
+ @Override
+ public byte getWorkDataValue() {
+ return mWorkData;
+ }
+
+ @Override
+ public void setWorkDataValue(byte aValue) {
+ mWorkData = aValue;
+ }
+
+ @Override
+ public int getMetaTileID() {
+ return mID;
+ }
+
+ @Override
+ public int setMetaTileID(short aID) {
+ return mID = aID;
+ }
+
+ @Override
+ public boolean isActive() {
+ return mActive;
+ }
+
+ @Override
+ public void setActive(boolean aActive) {
+ mActive = aActive;
+ if (hasValidMetaTileEntity()) {
+ mMetaTileEntity.onSetActive(aActive);
+ }
+ }
+
+ @Override
+ public long getTimer() {
+ return mTickTimer;
+ }
+
+ @Override
+ public boolean decreaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooLessEnergy) {
+ if (!canAccessData()) return false;
+ return mHasEnoughEnergy = decreaseStoredEU(aEnergy, aIgnoreTooLessEnergy) || decreaseStoredSteam(aEnergy, false)
+ || (aIgnoreTooLessEnergy && (decreaseStoredSteam(aEnergy, true)));
+ }
+
+ @Override
+ public boolean increaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooMuchEnergy) {
+ if (!canAccessData()) return false;
+ if (getStoredEU() < getEUCapacity() || aIgnoreTooMuchEnergy) {
+ setStoredEU(mMetaTileEntity.getEUVar() + aEnergy);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean inputEnergyFrom(ForgeDirection side) {
+ return inputEnergyFrom(side, true);
+ }
+
+ @Override
+ public boolean inputEnergyFrom(ForgeDirection side, boolean waitForActive) {
+ if (side == ForgeDirection.UNKNOWN) return true;
+ if (isServerSide() && waitForActive) return mActiveEUInputs[side.ordinal()] && !mReleaseEnergy;
+ return isEnergyInputSide(side);
+ }
+
+ @Override
+ public boolean outputsEnergyTo(ForgeDirection side) {
+ return outputsEnergyTo(side, true);
+ }
+
+ @Override
+ public boolean outputsEnergyTo(ForgeDirection side, boolean waitForActive) {
+ if (side == ForgeDirection.UNKNOWN) return true;
+ if (isServerSide() && waitForActive) return (mActiveEUOutputs[side.ordinal()]) || mReleaseEnergy;
+ return isEnergyOutputSide(side);
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return mMetaTileEntity != null && mMetaTileEntity.isEnetOutput();
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return mMetaTileEntity != null && mMetaTileEntity.isEnetInput();
+ }
+
+ public void generatePowerNodes() {
+ if (isServerSide() && (isEnetInput() || isEnetOutput())) {
+ final int time = MinecraftServer.getServer()
+ .getTickCounter();
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (outputsEnergyTo(side, false) || inputEnergyFrom(side, false)) {
+ final IGregTechTileEntity TE = getIGregTechTileEntityAtSide(side);
+ if (TE instanceof BaseMetaPipeEntity) {
+ final Node node = ((BaseMetaPipeEntity) TE).getNode();
+ if (node == null) {
+ new GenerateNodeMapPower((BaseMetaPipeEntity) TE);
+ } else if (node.mCreationTime != time) {
+ GenerateNodeMap.clearNodeMap(node, -1);
+ new GenerateNodeMapPower((BaseMetaPipeEntity) TE);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public long getOutputAmperage() {
+ if (canAccessData() && mMetaTileEntity.isElectric()) return mMetaTileEntity.maxAmperesOut();
+ return 0;
+ }
+
+ @Override
+ public long getOutputVoltage() {
+ if (canAccessData() && mMetaTileEntity.isElectric() && mMetaTileEntity.isEnetOutput())
+ return mMetaTileEntity.maxEUOutput();
+ return 0;
+ }
+
+ @Override
+ public long getInputAmperage() {
+ if (canAccessData() && mMetaTileEntity.isElectric()) return mMetaTileEntity.maxAmperesIn();
+ return 0;
+ }
+
+ @Override
+ public long getInputVoltage() {
+ if (canAccessData() && mMetaTileEntity.isElectric()) return mMetaTileEntity.maxEUInput();
+ return Integer.MAX_VALUE;
+ }
+
+ @Override
+ public boolean increaseStoredSteam(long aEnergy, boolean aIgnoreTooMuchEnergy) {
+ if (!canAccessData()) return false;
+ if (mMetaTileEntity.getSteamVar() < getSteamCapacity() || aIgnoreTooMuchEnergy) {
+ setStoredSteam(mMetaTileEntity.getSteamVar() + aEnergy);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public long getUniversalEnergyStored() {
+ return Math.max(getStoredEU(), getStoredSteam());
+ }
+
+ @Override
+ public long getUniversalEnergyCapacity() {
+ return Math.max(getEUCapacity(), getSteamCapacity());
+ }
+
+ @Override
+ public long getStoredEU() {
+ if (canAccessData()) return Math.min(mMetaTileEntity.getEUVar(), getEUCapacity());
+ return 0;
+ }
+
+ @Override
+ public long getEUCapacity() {
+ if (canAccessData()) return mMetaTileEntity.maxEUStore();
+ return 0;
+ }
+
+ @Override
+ public long getStoredSteam() {
+ if (canAccessData()) return Math.min(mMetaTileEntity.getSteamVar(), getSteamCapacity());
+ return 0;
+ }
+
+ @Override
+ public long getSteamCapacity() {
+ if (canAccessData()) return mMetaTileEntity.maxSteamStore();
+ return 0;
+ }
+
+ @Override
+ public ITexture[] getTexture(Block aBlock, ForgeDirection side) {
+ final ITexture coverTexture = getCoverTexture(side);
+ final ITexture[] textureUncovered = hasValidMetaTileEntity()
+ ? mMetaTileEntity
+ .getTexture(this, side, mFacing, (byte) (mColor - 1), mActive, getOutputRedstoneSignal(side) > 0)
+ : Textures.BlockIcons.ERROR_RENDERING;
+ final ITexture[] textureCovered;
+ if (coverTexture != null) {
+ textureCovered = Arrays.copyOf(textureUncovered, textureUncovered.length + 1);
+ textureCovered[textureUncovered.length] = coverTexture;
+ return textureCovered;
+ } else {
+ return textureUncovered;
+ }
+ }
+
+ private boolean isEnergyInputSide(ForgeDirection side) {
+ if (side != ForgeDirection.UNKNOWN) {
+ if (!getCoverInfoAtSide(side).letsEnergyIn()) return false;
+ if (isInvalid() || mReleaseEnergy) return false;
+ if (canAccessData() && mMetaTileEntity.isElectric() && mMetaTileEntity.isEnetInput())
+ return mMetaTileEntity.isInputFacing(side);
+ }
+ return false;
+ }
+
+ private boolean isEnergyOutputSide(ForgeDirection side) {
+ if (side != ForgeDirection.UNKNOWN) {
+ if (!getCoverInfoAtSide(side).letsEnergyOut()) return false;
+ if (isInvalid() || mReleaseEnergy) return mReleaseEnergy;
+ if (canAccessData() && mMetaTileEntity.isElectric() && mMetaTileEntity.isEnetOutput())
+ return mMetaTileEntity.isOutputFacing(side);
+ }
+ return false;
+ }
+
+ @Override
+ protected boolean hasValidMetaTileEntity() {
+ return mMetaTileEntity != null && mMetaTileEntity.getBaseMetaTileEntity() == this;
+ }
+
+ @Override
+ protected boolean canAccessData() {
+ return !isDead && hasValidMetaTileEntity();
+ }
+
+ public boolean setStoredEU(long aEnergy) {
+ if (!canAccessData()) return false;
+ if (aEnergy < 0) aEnergy = 0;
+ mMetaTileEntity.setEUVar(aEnergy);
+ return true;
+ }
+
+ public boolean setStoredSteam(long aEnergy) {
+ if (!canAccessData()) return false;
+ if (aEnergy < 0) aEnergy = 0;
+ mMetaTileEntity.setSteamVar(aEnergy);
+ return true;
+ }
+
+ public boolean decreaseStoredEU(long aEnergy, boolean aIgnoreTooLessEnergy) {
+ if (!canAccessData()) {
+ return false;
+ }
+ if (mMetaTileEntity.getEUVar() - aEnergy >= 0 || aIgnoreTooLessEnergy) {
+ setStoredEU(mMetaTileEntity.getEUVar() - aEnergy);
+ if (mMetaTileEntity.getEUVar() < 0) {
+ setStoredEU(0);
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public boolean decreaseStoredSteam(long aEnergy, boolean aIgnoreTooLessEnergy) {
+ if (!canAccessData()) return false;
+ if (mMetaTileEntity.getSteamVar() - aEnergy >= 0 || aIgnoreTooLessEnergy) {
+ setStoredSteam(mMetaTileEntity.getSteamVar() - aEnergy);
+ if (mMetaTileEntity.getSteamVar() < 0) {
+ setStoredSteam(0);
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public boolean playerOwnsThis(EntityPlayer aPlayer, boolean aCheckPrecicely) {
+ if (!canAccessData()) return false;
+ if (aCheckPrecicely || privateAccess() || (mOwnerName.length() == 0))
+ if ((mOwnerName.length() == 0) && isServerSide()) {
+ setOwnerName(aPlayer.getDisplayName());
+ setOwnerUuid(aPlayer.getUniqueID());
+ } else return !privateAccess() || aPlayer.getDisplayName()
+ .equals("Player") || mOwnerName.equals("Player") || mOwnerName.equals(aPlayer.getDisplayName());
+ return true;
+ }
+
+ public boolean privateAccess() {
+ if (!canAccessData()) return mLockUpgrade;
+ return mLockUpgrade || mMetaTileEntity.ownerControl();
+ }
+
+ @Nullable
+ @Override
+ public ICleanroom getCleanroom() {
+ if (canAccessData()) {
+ return mMetaTileEntity.getCleanroom();
+ }
+ return null;
+ }
+
+ @Override
+ public void setCleanroom(ICleanroom cleanroom) {
+ if (canAccessData()) {
+ mMetaTileEntity.setCleanroom(cleanroom);
+ }
+ }
+
+ public void doEnergyExplosion() {
+ if (getUniversalEnergyCapacity() > 0 && getUniversalEnergyStored() >= getUniversalEnergyCapacity() / 5) {
+ GT_Log.exp.println(
+ "Energy Explosion, injected " + getUniversalEnergyStored()
+ + "EU >= "
+ + getUniversalEnergyCapacity() / 5D
+ + "Capacity of the Machine!");
+
+ doExplosion(
+ oOutput * (getUniversalEnergyStored() >= getUniversalEnergyCapacity() ? 4
+ : getUniversalEnergyStored() >= getUniversalEnergyCapacity() / 2 ? 2 : 1));
+ GT_Mod.achievements.issueAchievement(
+ this.getWorldObj()
+ .getPlayerEntityByName(mOwnerName),
+ "electricproblems");
+ }
+ }
+
+ @Override
+ public void doExplosion(long aAmount) {
+ if (canAccessData()) {
+ // This is only for Electric Machines
+ if (GregTech_API.sMachineWireFire && mMetaTileEntity.isElectric()) {
+ try {
+ mReleaseEnergy = true;
+ IEnergyConnected.Util.emitEnergyToNetwork(V[5], Math.max(1, getStoredEU() / V[5]), this);
+ } catch (Exception ignored) {}
+ }
+ mReleaseEnergy = false;
+ // Normal Explosion Code
+ mMetaTileEntity.onExplosion();
+ if (GT_Mod.gregtechproxy.mExplosionItemDrop) {
+ for (int i = 0; i < this.getSizeInventory(); i++) {
+ final ItemStack tItem = this.getStackInSlot(i);
+ if ((tItem != null) && (tItem.stackSize > 0) && (this.isValidSlot(i))) {
+ dropItems(tItem);
+ this.setInventorySlotContents(i, null);
+ }
+ }
+ }
+ if (mRecipeStuff != null) {
+ for (int i = 0; i < 9; i++) {
+ if (this.getRandomNumber(100) < 50) {
+ dropItems(GT_Utility.loadItem(mRecipeStuff, "Ingredient." + i));
+ }
+ }
+ }
+
+ GT_Pollution.addPollution((TileEntity) this, GT_Mod.gregtechproxy.mPollutionOnExplosion);
+ mMetaTileEntity.doExplosion(aAmount);
+ }
+ }
+
+ public void dropItems(ItemStack tItem) {
+ if (tItem == null) return;
+ final EntityItem tItemEntity = new EntityItem(
+ this.worldObj,
+ this.xCoord + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F,
+ this.yCoord + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F,
+ this.zCoord + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F,
+ new ItemStack(tItem.getItem(), tItem.stackSize, tItem.getItemDamage()));
+ if (tItem.hasTagCompound()) {
+ tItemEntity.getEntityItem()
+ .setTagCompound(
+ (NBTTagCompound) tItem.getTagCompound()
+ .copy());
+ }
+ tItemEntity.motionX = (XSTR_INSTANCE.nextGaussian() * 0.0500000007450581D);
+ tItemEntity.motionY = (XSTR_INSTANCE.nextGaussian() * 0.0500000007450581D + 0.2000000029802322D);
+ tItemEntity.motionZ = (XSTR_INSTANCE.nextGaussian() * 0.0500000007450581D);
+ tItemEntity.hurtResistantTime = 999999;
+ tItemEntity.lifespan = 60000;
+ try {
+ ENTITY_ITEM_HEALTH_FIELD.setInt(tItemEntity, 99999999);
+ } catch (Exception ignored) {}
+ this.worldObj.spawnEntityInWorld(tItemEntity);
+ tItem.stackSize = 0;
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops() {
+ final ItemStack rStack = new ItemStack(GregTech_API.sBlockMachines, 1, mID);
+ final NBTTagCompound tNBT = new NBTTagCompound();
+ if (mRecipeStuff != null && !mRecipeStuff.hasNoTags()) tNBT.setTag("GT.CraftingComponents", mRecipeStuff);
+ if (mMuffler) tNBT.setBoolean("mMuffler", mMuffler);
+ if (mLockUpgrade) tNBT.setBoolean("mLockUpgrade", mLockUpgrade);
+ if (mSteamConverter) tNBT.setBoolean("mSteamConverter", mSteamConverter);
+ if (mColor > 0) tNBT.setByte("mColor", mColor);
+ if (mOtherUpgrades > 0) tNBT.setByte("mOtherUpgrades", mOtherUpgrades);
+
+ writeCoverNBT(tNBT, true);
+
+ if (hasValidMetaTileEntity()) mMetaTileEntity.setItemNBT(tNBT);
+ if (!tNBT.hasNoTags()) rStack.setTagCompound(tNBT);
+
+ onBaseTEDestroyed();
+ return new ArrayList<>(Collections.singletonList(rStack));
+ }
+
+ @Override
+ public boolean shouldDropItemAt(int index) {
+ return this.mMetaTileEntity == null || this.mMetaTileEntity.shouldDropItemAt(index);
+ }
+
+ public int getUpgradeCount() {
+ return (mMuffler ? 1 : 0) + (mLockUpgrade ? 1 : 0) + (mSteamConverter ? 1 : 0) + mOtherUpgrades;
+ }
+
+ @Override
+ public boolean onRightclick(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ) {
+ if (isClientSide()) {
+ // Configure Cover, sneak can also be: screwdriver, wrench, side cutter, soldering iron
+ if (aPlayer.isSneaking()) {
+ final ForgeDirection tSide = (getCoverIDAtSide(side) == 0)
+ ? GT_Utility.determineWrenchingSide(side, aX, aY, aZ)
+ : side;
+ return (getCoverBehaviorAtSideNew(tSide).hasCoverGUI());
+ } else if (getCoverBehaviorAtSideNew(side).onCoverRightclickClient(side, this, aPlayer, aX, aY, aZ)) {
+ return true;
+ }
+
+ if (!getCoverInfoAtSide(side).isGUIClickable()) return false;
+ }
+
+ if (isServerSide()) {
+ if (!privateAccess() || aPlayer.getDisplayName()
+ .equalsIgnoreCase(getOwnerName())) {
+ final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
+ if (tCurrentItem != null) {
+ if (getColorization() >= 0
+ && GT_Utility.areStacksEqual(new ItemStack(Items.water_bucket, 1), tCurrentItem)) {
+ tCurrentItem.func_150996_a(Items.bucket);
+ setColorization((byte) (getColorization() >= 16 ? -2 : -1));
+ return true;
+ }
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList)) {
+ if (aPlayer.isSneaking() && mMetaTileEntity instanceof GT_MetaTileEntity_BasicMachine
+ && ((GT_MetaTileEntity_BasicMachine) mMetaTileEntity)
+ .setMainFacing(GT_Utility.determineWrenchingSide(side, aX, aY, aZ))) {
+ GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer);
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_WRENCH,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ cableUpdateDelay = 10;
+ } else if (mMetaTileEntity.onWrenchRightClick(
+ side,
+ GT_Utility.determineWrenchingSide(side, aX, aY, aZ),
+ aPlayer,
+ aX,
+ aY,
+ aZ,
+ tCurrentItem)) {
+ GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer);
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_WRENCH,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ cableUpdateDelay = 10;
+ }
+ return true;
+ }
+
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sScrewdriverList)) {
+ if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 200, aPlayer)) {
+ setCoverDataAtSide(
+ side,
+ getCoverBehaviorAtSideNew(side).onCoverScrewdriverClick(
+ side,
+ getCoverIDAtSide(side),
+ getComplexCoverDataAtSide(side),
+ this,
+ aPlayer,
+ aX,
+ aY,
+ aZ));
+ mMetaTileEntity.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ, tCurrentItem);
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_WRENCH,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ }
+ return true;
+ }
+
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sHardHammerList)) {
+ if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
+ mInputDisabled = !mInputDisabled;
+ if (mInputDisabled) mOutputDisabled = !mOutputDisabled;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("086", "Auto-Input: ") + (mInputDisabled
+ ? GT_Utility.trans("087", "Disabled")
+ : GT_Utility.trans("088", "Enabled") + GT_Utility.trans("089", " Auto-Output: ")
+ + (mOutputDisabled ? GT_Utility.trans("087", "Disabled")
+ : GT_Utility.trans("088", "Enabled"))));
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.RANDOM_ANVIL_USE,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ }
+ return true;
+ }
+
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSoftHammerList)) {
+ if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
+ if (mWorks) disableWorking();
+ else enableWorking();
+ {
+ String tChat = GT_Utility.trans("090", "Machine Processing: ")
+ + (isAllowedToWork() ? GT_Utility.trans("088", "Enabled")
+ : GT_Utility.trans("087", "Disabled"));
+ if (getMetaTileEntity() != null && getMetaTileEntity().hasAlternativeModeText())
+ tChat = getMetaTileEntity().getAlternativeModeText();
+ GT_Utility.sendChatToPlayer(aPlayer, tChat);
+ }
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ }
+ return true;
+ }
+
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList)) {
+ final ForgeDirection tSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ);
+ if (mMetaTileEntity.onSolderingToolRightClick(side, tSide, aPlayer, aX, aY, aZ, tCurrentItem)) {
+ // logic handled internally
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_BATTERY_USE,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ } else if (GT_ModHandler.useSolderingIron(tCurrentItem, aPlayer)) {
+ mStrongRedstone ^= tSide.flag;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("091", "Redstone Output at Side ") + tSide
+ + GT_Utility.trans("092", " set to: ")
+ + ((mStrongRedstone & tSide.flag) != 0 ? GT_Utility.trans("093", "Strong")
+ : GT_Utility.trans("094", "Weak")));
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_BATTERY_USE,
+ 3.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ issueBlockUpdate();
+ }
+ doEnetUpdate();
+ cableUpdateDelay = 10;
+ return true;
+ }
+
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList)) {
+ final ForgeDirection tSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ);
+ if (mMetaTileEntity.onWireCutterRightClick(side, tSide, aPlayer, aX, aY, aZ, tCurrentItem)) {
+ // logic handled internally
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_WRENCH,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ }
+ doEnetUpdate();
+ cableUpdateDelay = 10;
+ return true;
+ }
+
+ ForgeDirection coverSide = side;
+ if (getCoverIDAtSide(side) == 0) coverSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ);
+
+ if (getCoverIDAtSide(coverSide) == 0) {
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCovers.keySet())) {
+ final GT_CoverBehaviorBase<?> coverBehavior = GregTech_API
+ .getCoverBehaviorNew(tCurrentItem);
+ if (coverBehavior.isCoverPlaceable(coverSide, tCurrentItem, this)
+ && mMetaTileEntity.allowCoverOnSide(coverSide, new GT_ItemStack(tCurrentItem))) {
+
+ setCoverItemAtSide(coverSide, tCurrentItem);
+ coverBehavior.onPlayerAttach(aPlayer, tCurrentItem, this, coverSide);
+
+ if (!aPlayer.capabilities.isCreativeMode) tCurrentItem.stackSize--;
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_WRENCH,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ sendClientData();
+ }
+ return true;
+ }
+ } else {
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCrowbarList)) {
+ if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.RANDOM_BREAK,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ dropCover(coverSide, side, false);
+ }
+ return true;
+ } else if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sJackhammerList)) {
+ // Configuration of delicate electronics calls for a tool with precision and subtlety.
+ if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
+ final CoverInfo info = getCoverInfoAtSide(coverSide);
+ if (info != CoverInfo.EMPTY_INFO) {
+ final GT_CoverBehaviorBase<?> behavior = info.getCoverBehavior();
+ if (behavior.allowsTickRateAddition()) {
+ info.onCoverJackhammer(aPlayer);
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT,
+ 1.0F,
+ 1,
+ xCoord,
+ yCoord,
+ zCoord);
+
+ } else {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("gt.cover.info.chat.tick_rate_not_allowed"));
+ }
+ return true;
+ }
+ }
+ }
+ }
+ // End item != null
+ } else if (aPlayer.isSneaking()) { // Sneak click, no tool -> open cover config if possible.
+ side = (getCoverIDAtSide(side) == 0) ? GT_Utility.determineWrenchingSide(side, aX, aY, aZ) : side;
+ return getCoverIDAtSide(side) > 0 && getCoverBehaviorAtSideNew(side).onCoverShiftRightClick(
+ side,
+ getCoverIDAtSide(side),
+ getComplexCoverDataAtSide(side),
+ this,
+ aPlayer);
+ }
+
+ if (getCoverBehaviorAtSideNew(side).onCoverRightClick(
+ side,
+ getCoverIDAtSide(side),
+ getComplexCoverDataAtSide(side),
+ this,
+ aPlayer,
+ aX,
+ aY,
+ aZ)) return true;
+
+ if (!getCoverInfoAtSide(side).isGUIClickable()) return false;
+
+ if (isUpgradable() && tCurrentItem != null) {
+ if (ItemList.Upgrade_Muffler.isStackEqual(aPlayer.inventory.getCurrentItem())) {
+ if (addMufflerUpgrade()) {
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.RANDOM_CLICK,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ if (!aPlayer.capabilities.isCreativeMode) aPlayer.inventory.getCurrentItem().stackSize--;
+ }
+ return true;
+ }
+ if (ItemList.Upgrade_Lock.isStackEqual(aPlayer.inventory.getCurrentItem())) {
+ if (isUpgradable() && !mLockUpgrade) {
+ mLockUpgrade = true;
+ setOwnerName(aPlayer.getDisplayName());
+ setOwnerUuid(aPlayer.getUniqueID());
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.RANDOM_CLICK,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ if (!aPlayer.capabilities.isCreativeMode) aPlayer.inventory.getCurrentItem().stackSize--;
+ }
+ return true;
+ }
+ }
+ }
+ }
+
+ try {
+ if (!aPlayer.isSneaking() && hasValidMetaTileEntity())
+ return mMetaTileEntity.onRightclick(this, aPlayer, side, aX, aY, aZ);
+ } catch (Throwable e) {
+ GT_Log.err.println(
+ "Encountered Exception while rightclicking TileEntity, the Game should've crashed now, but I prevented that. Please report immediately to GregTech Intergalactical!!!");
+ e.printStackTrace(GT_Log.err);
+ e.printStackTrace();
+ }
+
+ return false;
+ }
+
+ @Override
+ public void onLeftclick(EntityPlayer aPlayer) {
+ try {
+ if (aPlayer != null && hasValidMetaTileEntity()) mMetaTileEntity.onLeftclick(this, aPlayer);
+ } catch (Throwable e) {
+ GT_Log.err.println(
+ "Encountered Exception while leftclicking TileEntity, the Game should've crashed now, but I prevented that. Please report immediately to GregTech Intergalactical!!!");
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ public boolean isDigitalChest() {
+ if (canAccessData()) return mMetaTileEntity.isDigitalChest();
+ return false;
+ }
+
+ @Override
+ public ItemStack[] getStoredItemData() {
+ if (canAccessData()) return mMetaTileEntity.getStoredItemData();
+ return null;
+ }
+
+ @Override
+ public void setItemCount(int aCount) {
+ if (canAccessData()) mMetaTileEntity.setItemCount(aCount);
+ }
+
+ @Override
+ public int getMaxItemCount() {
+ if (canAccessData()) return mMetaTileEntity.getMaxItemCount();
+ return 0;
+ }
+
+ /**
+ * Can put aStack into Slot
+ */
+ @Override
+ public boolean isItemValidForSlot(int aIndex, ItemStack aStack) {
+ return canAccessData() && mMetaTileEntity.isItemValidForSlot(aIndex, aStack);
+ }
+
+ /**
+ * returns all valid Inventory Slots, no matter which Side (Unless it's covered). The Side Stuff is done in the
+ * following two Functions.
+ */
+ @Override
+ public int[] getAccessibleSlotsFromSide(int ordinalSide) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(ForgeDirection.getOrientation(ordinalSide));
+ if (canAccessData() && (coverInfo.letsItemsOut(-1) || coverInfo.letsItemsIn(-1)))
+ return mMetaTileEntity.getAccessibleSlotsFromSide(ordinalSide);
+ return GT_Values.emptyIntArray;
+ }
+
+ /**
+ * Can put aStack into Slot at Side
+ */
+ @Override
+ public boolean canInsertItem(int slotIndex, ItemStack stack, int ordinalSide) {
+ return canAccessData() && (mRunningThroughTick || !mInputDisabled)
+ && getCoverInfoAtSide(ForgeDirection.getOrientation(ordinalSide)).letsItemsIn(slotIndex)
+ && mMetaTileEntity.canInsertItem(slotIndex, stack, ordinalSide);
+ }
+
+ /**
+ * Can pull stack out of Slot from Side
+ */
+ @Override
+ public boolean canExtractItem(int slotIndex, ItemStack stack, int ordinalSide) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ return canAccessData() && (mRunningThroughTick || !mOutputDisabled)
+ && getCoverBehaviorAtSideNew(side)
+ .letsItemsOut(side, getCoverIDAtSide(side), getComplexCoverDataAtSide(side), slotIndex, this)
+ && mMetaTileEntity.canExtractItem(slotIndex, stack, ordinalSide);
+ }
+
+ @Override
+ public boolean isUpgradable() {
+ return canAccessData() && getUpgradeCount() < 8;
+ }
+
+ @Override
+ public byte getGeneralRS(ForgeDirection side) {
+ if (mMetaTileEntity == null) return 0;
+ return mMetaTileEntity.allowGeneralRedstoneOutput() ? mSidedRedstone[side.ordinal()] : 0;
+ }
+
+ @Override
+ public boolean isSteamEngineUpgradable() {
+ return isUpgradable() && !hasSteamEngineUpgrade() && getSteamCapacity() > 0;
+ }
+
+ @Override
+ public boolean addSteamEngineUpgrade() {
+ if (isSteamEngineUpgradable()) {
+ issueBlockUpdate();
+ mSteamConverter = true;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean hasSteamEngineUpgrade() {
+ if (canAccessData() && mMetaTileEntity.isSteampowered()) return true;
+ return mSteamConverter;
+ }
+
+ @Override
+ public boolean hasMufflerUpgrade() {
+ return mMuffler;
+ }
+
+ @Override
+ public boolean isMufflerUpgradable() {
+ return isUpgradable() && !hasMufflerUpgrade();
+ }
+
+ @Override
+ public boolean addMufflerUpgrade() {
+ if (isMufflerUpgradable()) return mMuffler = true;
+ return false;
+ }
+
+ @Override
+ public void markInventoryBeenModified() {
+ mInventoryChanged = true;
+ }
+
+ @Override
+ public int getErrorDisplayID() {
+ return mDisplayErrorCode;
+ }
+
+ @Override
+ public void setErrorDisplayID(int aErrorID) {
+ mDisplayErrorCode = aErrorID;
+ }
+
+ @Override
+ public IMetaTileEntity getMetaTileEntity() {
+ return hasValidMetaTileEntity() ? mMetaTileEntity : null;
+ }
+
+ @Override
+ public void setMetaTileEntity(IMetaTileEntity aMetaTileEntity) {
+ if (aMetaTileEntity instanceof MetaTileEntity || aMetaTileEntity == null)
+ mMetaTileEntity = (MetaTileEntity) aMetaTileEntity;
+ else {
+ GT_FML_LOGGER.error(
+ "Unknown meta tile entity set! Class {}, inventory name {}.",
+ aMetaTileEntity.getClass(),
+ aMetaTileEntity.getInventoryName());
+ }
+ }
+
+ public byte getLightValue() {
+ return mLightValue;
+ }
+
+ @Override
+ public void setLightValue(byte aLightValue) {
+ mLightValue = (byte) (aLightValue & 15);
+ }
+
+ @Override
+ public long getAverageElectricInput() {
+ long rEU = 0;
+ for (int i = 0; i < mAverageEUInput.length; ++i) if (i != mAverageEUInputIndex) rEU += mAverageEUInput[i];
+ return rEU / (mAverageEUInput.length - 1);
+ }
+
+ @Override
+ public long getAverageElectricOutput() {
+ long rEU = 0;
+ for (int i = 0; i < mAverageEUOutput.length; ++i) if (i != mAverageEUOutputIndex) rEU += mAverageEUOutput[i];
+ return rEU / (mAverageEUOutput.length - 1);
+ }
+
+ @Override
+ protected void updateOutputRedstoneSignal(ForgeDirection side) {
+ if (mMetaTileEntity.hasSidedRedstoneOutputBehavior()) {
+ setOutputRedstoneSignal(side, (byte) 0);
+ } else {
+ setOutputRedstoneSignal(side, (byte) 15);
+ }
+ }
+
+ @Override
+ public String getOwnerName() {
+ if (GT_Utility.isStringInvalid(mOwnerName)) return "Player";
+ return mOwnerName;
+ }
+
+ @Override
+ public String setOwnerName(String aName) {
+ if (GT_Utility.isStringInvalid(aName)) return mOwnerName = "Player";
+ return mOwnerName = aName;
+ }
+
+ @Override
+ public UUID getOwnerUuid() {
+ return mOwnerUuid;
+ }
+
+ @Override
+ public void setOwnerUuid(UUID uuid) {
+ mOwnerUuid = uuid;
+ }
+
+ @Override
+ public byte getComparatorValue(ForgeDirection side) {
+ return canAccessData() ? mMetaTileEntity.getComparatorValue(side) : 0;
+ }
+
+ @Override
+ public ItemStack decrStackSize(int aIndex, int aAmount) {
+ if (canAccessData()) {
+ mInventoryChanged = true;
+ return mMetaTileEntity.decrStackSize(aIndex, aAmount);
+ }
+ return null;
+ }
+
+ @Override
+ public long injectEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage) {
+ if (!canAccessData() || !mMetaTileEntity.isElectric()
+ || !inputEnergyFrom(side)
+ || aAmperage <= 0
+ || aVoltage <= 0
+ || getStoredEU() >= getEUCapacity()
+ || mMetaTileEntity.maxAmperesIn() <= mAcceptedAmperes) return 0;
+ if (aVoltage > getInputVoltage()) {
+ GT_Log.exp
+ .println("Energy Explosion, injected " + aVoltage + "EU/t in a " + getInputVoltage() + "EU/t Machine!");
+ doExplosion(aVoltage);
+ return 0;
+ }
+ if (increaseStoredEnergyUnits(
+ aVoltage * (aAmperage = Math.min(
+ aAmperage,
+ Math.min(
+ mMetaTileEntity.maxAmperesIn() - mAcceptedAmperes,
+ 1 + ((getEUCapacity() - getStoredEU()) / aVoltage)))),
+ true)) {
+ mAverageEUInput[mAverageEUInputIndex] += aVoltage * aAmperage;
+ mAcceptedAmperes += aAmperage;
+ return aAmperage;
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean drainEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage) {
+ if (!canAccessData() || !mMetaTileEntity.isElectric()
+ || !outputsEnergyTo(side)
+ || getStoredEU() - (aVoltage * aAmperage) < mMetaTileEntity.getMinimumStoredEU()) return false;
+ if (decreaseStoredEU(aVoltage * aAmperage, false)) {
+ mAverageEUOutput[mAverageEUOutputIndex] += aVoltage * aAmperage;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean acceptsRotationalEnergy(ForgeDirection side) {
+ if (!canAccessData() || getCoverIDAtSide(side) != 0) return false;
+ return mMetaTileEntity.acceptsRotationalEnergy(side);
+ }
+
+ @Override
+ public boolean injectRotationalEnergy(ForgeDirection side, long aSpeed, long aEnergy) {
+ if (!canAccessData() || getCoverIDAtSide(side) != 0) return false;
+ return mMetaTileEntity.injectRotationalEnergy(side, aSpeed, aEnergy);
+ }
+
+ @Override
+ public int fill(ForgeDirection side, FluidStack aFluid, boolean doFill) {
+ if (mTickTimer > 5 && canAccessData()
+ && (mRunningThroughTick || !mInputDisabled)
+ && (side == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidInput(side)
+ && getCoverInfoAtSide(side).letsFluidIn(aFluid == null ? null : aFluid.getFluid()))))
+ return mMetaTileEntity.fill(side, aFluid, doFill);
+ return 0;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, int maxDrain, boolean doDrain) {
+ if (mTickTimer > 5 && canAccessData()
+ && (mRunningThroughTick || !mOutputDisabled)
+ && (side == ForgeDirection.UNKNOWN
+ || (mMetaTileEntity.isLiquidOutput(side) && getCoverInfoAtSide(side).letsFluidOut(
+ mMetaTileEntity.getFluid() == null ? null
+ : mMetaTileEntity.getFluid()
+ .getFluid()))))
+ return mMetaTileEntity.drain(side, maxDrain, doDrain);
+ return null;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, FluidStack aFluid, boolean doDrain) {
+ if (mTickTimer > 5 && canAccessData()
+ && (mRunningThroughTick || !mOutputDisabled)
+ && (side == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidOutput(side)
+ && getCoverInfoAtSide(side).letsFluidOut(aFluid == null ? null : aFluid.getFluid()))))
+ return mMetaTileEntity.drain(side, aFluid, doDrain);
+ return null;
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection side, Fluid aFluid) {
+ if (mTickTimer > 5 && canAccessData()
+ && (mRunningThroughTick || !mInputDisabled)
+ && (side == ForgeDirection.UNKNOWN
+ || (mMetaTileEntity.isLiquidInput(side) && getCoverInfoAtSide(side).letsFluidIn(aFluid))))
+ return mMetaTileEntity.canFill(side, aFluid);
+ return false;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection side, Fluid aFluid) {
+ if (mTickTimer > 5 && canAccessData()
+ && (mRunningThroughTick || !mOutputDisabled)
+ && (side == ForgeDirection.UNKNOWN
+ || (mMetaTileEntity.isLiquidOutput(side) && getCoverInfoAtSide(side).letsFluidOut(aFluid))))
+ return mMetaTileEntity.canDrain(side, aFluid);
+ return false;
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection side) {
+ if (canAccessData() && (side == ForgeDirection.UNKNOWN
+ || (mMetaTileEntity.isLiquidInput(side) && getCoverInfoAtSide(side).letsFluidIn(null))
+ || (mMetaTileEntity.isLiquidOutput(side) && getCoverInfoAtSide(side).letsFluidOut(null))))
+ return mMetaTileEntity.getTankInfo(side);
+ return new FluidTankInfo[] {};
+ }
+
+ public double getOutputEnergyUnitsPerTick() {
+ return oOutput;
+ }
+
+ public boolean isTeleporterCompatible(ForgeDirection side) {
+ return canAccessData() && mMetaTileEntity.isTeleporterCompatible();
+ }
+
+ public double demandedEnergyUnits() {
+ if (mReleaseEnergy || !canAccessData() || !mMetaTileEntity.isEnetInput()) return 0;
+ return getEUCapacity() - getStoredEU();
+ }
+
+ public double injectEnergyUnits(ForgeDirection aDirection, double aAmount) {
+ return injectEnergyUnits(aDirection, (int) aAmount, 1) > 0 ? 0 : aAmount;
+ }
+
+ public boolean acceptsEnergyFrom(TileEntity aEmitter, ForgeDirection aDirection) {
+ return inputEnergyFrom(aDirection);
+ }
+
+ public boolean emitsEnergyTo(TileEntity aReceiver, ForgeDirection aDirection) {
+ return outputsEnergyTo(aDirection);
+ }
+
+ public double getOfferedEnergy() {
+ return (canAccessData() && getStoredEU() - mMetaTileEntity.getMinimumStoredEU() >= oOutput)
+ ? Math.max(0, oOutput)
+ : 0;
+ }
+
+ public void drawEnergy(double amount) {
+ mAverageEUOutput[mAverageEUOutputIndex] += amount;
+ decreaseStoredEU((int) amount, true);
+ }
+
+ public int injectEnergy(ForgeDirection aForgeDirection, int aAmount) {
+ return injectEnergyUnits(aForgeDirection, aAmount, 1) > 0 ? 0 : aAmount;
+ }
+
+ public int addEnergy(int aEnergy) {
+ if (!canAccessData()) return 0;
+ if (aEnergy > 0) increaseStoredEnergyUnits(aEnergy, true);
+ else decreaseStoredEU(-aEnergy, true);
+ return (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getEUVar());
+ }
+
+ public boolean isAddedToEnergyNet() {
+ return false;
+ }
+
+ public int demandsEnergy() {
+ if (mReleaseEnergy || !canAccessData() || !mMetaTileEntity.isEnetInput()) return 0;
+ return getCapacity() - getStored();
+ }
+
+ public int getCapacity() {
+ return (int) Math.min(Integer.MAX_VALUE, getEUCapacity());
+ }
+
+ public int getStored() {
+ return (int) Math.min(Integer.MAX_VALUE, Math.min(getStoredEU(), getCapacity()));
+ }
+
+ public void setStored(int aEU) {
+ if (canAccessData()) setStoredEU(aEU);
+ }
+
+ public int getMaxSafeInput() {
+ return (int) Math.min(Integer.MAX_VALUE, getInputVoltage());
+ }
+
+ public int getMaxEnergyOutput() {
+ if (mReleaseEnergy) return Integer.MAX_VALUE;
+ return getOutput();
+ }
+
+ public int getOutput() {
+ return (int) Math.min(Integer.MAX_VALUE, oOutput);
+ }
+
+ public int injectEnergy(Direction aDirection, int aAmount) {
+ return injectEnergyUnits(aDirection.toForgeDirection(), aAmount, 1) > 0 ? 0 : aAmount;
+ }
+
+ public boolean isTeleporterCompatible(Direction ignoredDirection) {
+ return canAccessData() && mMetaTileEntity.isTeleporterCompatible();
+ }
+
+ public boolean acceptsEnergyFrom(TileEntity ignoredTileEntity, Direction aDirection) {
+ return inputEnergyFrom(aDirection.toForgeDirection());
+ }
+
+ public boolean emitsEnergyTo(TileEntity ignoredTileEntity, Direction aDirection) {
+ return outputsEnergyTo(aDirection.toForgeDirection());
+ }
+
+ @Override
+ public boolean addStackToSlot(int slotIndex, ItemStack stack) {
+ if (GT_Utility.isStackInvalid(stack)) return true;
+ if (slotIndex < 0 || slotIndex >= getSizeInventory()) return false;
+ final ItemStack toStack = getStackInSlot(slotIndex);
+ if (GT_Utility.isStackInvalid(toStack)) {
+ setInventorySlotContents(slotIndex, stack);
+ return true;
+ }
+ final ItemStack fromStack = GT_OreDictUnificator.get(stack);
+ if (GT_Utility.areStacksEqual(toStack, fromStack) && toStack.stackSize + fromStack.stackSize
+ <= Math.min(fromStack.getMaxStackSize(), getInventoryStackLimit())) {
+ toStack.stackSize += fromStack.stackSize;
+ markDirty();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean addStackToSlot(int aIndex, ItemStack aStack, int aAmount) {
+ return addStackToSlot(aIndex, GT_Utility.copyAmount(aAmount, aStack));
+ }
+
+ @Override
+ public byte getColorization() {
+ return (byte) (mColor - 1);
+ }
+
+ @Override
+ public byte setColorization(byte aColor) {
+ if (aColor > 15 || aColor < -1) aColor = -1;
+ mColor = (byte) (aColor + 1);
+ if (canAccessData()) mMetaTileEntity.onColorChangeServer(aColor);
+ return mColor;
+ }
+
+ @Override
+ public float getBlastResistance(ForgeDirection side) {
+ return canAccessData() ? Math.max(0, getMetaTileEntity().getExplosionResistance(side)) : 10.0F;
+ }
+
+ @Override
+ public void onBlockDestroyed() {
+ if (canAccessData()) getMetaTileEntity().onBlockDestroyed();
+ }
+
+ @Override
+ public boolean isUniversalEnergyStored(long aEnergyAmount) {
+ if (getUniversalEnergyStored() >= aEnergyAmount) return true;
+ mHasEnoughEnergy = false;
+ return false;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ {
+ if (canAccessData()) return getMetaTileEntity().getInfoData();
+ return new String[] {};
+ }
+ }
+
+ @Override
+ public int getLightOpacity() {
+ return mMetaTileEntity == null ? getLightValue() > 0 ? 0 : 255 : mMetaTileEntity.getLightOpacity();
+ }
+
+ @Override
+ public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB,
+ List<AxisAlignedBB> outputAABB, Entity collider) {
+ mMetaTileEntity.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider);
+ }
+
+ @Override
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ return mMetaTileEntity.getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider) {
+ mMetaTileEntity.onEntityCollidedWithBlock(aWorld, aX, aY, aZ, collider);
+ }
+
+ /**
+ * Shifts the machine Inventory index according to the change in Input/Output Slots. This is NOT done automatically.
+ * If you want to change slot count for a machine this method needs to be adapted. Currently this method only works
+ * for GT_MetaTileEntity_BasicMachine
+ *
+ * @param slotIndex The original Inventory index
+ * @param nbtVersion The GregTech version in which the original Inventory Index was saved.
+ * @return The corrected Inventory index
+ */
+ @Override
+ protected int migrateInventoryIndex(int slotIndex, int nbtVersion) {
+ final int oldInputSize;
+ final int newInputSize;
+ final int oldOutputSize;
+ final int newOutputSize;
+ final int chemistryUpdateVersion = GT_Mod.calculateTotalGTVersion(509, 31);
+ final int configCircuitAdditionVersion = GT_Mod.calculateTotalGTVersion(509, 40);
+ final int wireAdditionVersion = GT_Mod.calculateTotalGTVersion(509, 41);
+ final int disassemblerRemoveVersion = GT_Mod.calculateTotalGTVersion(509, 42, 44);
+ if (nbtVersion < 1000000) nbtVersion *= 1000;
+ // 4 is old GT_MetaTileEntity_BasicMachine.OTHER_SLOT_COUNT
+ if (nbtVersion < configCircuitAdditionVersion && getMetaTileEntity() instanceof GT_MetaTileEntity_BasicMachine
+ && slotIndex >= 4) slotIndex += 1;
+ if (mID >= 211 && mID <= 218) { // Assembler
+ if (nbtVersion < chemistryUpdateVersion) {
+ oldInputSize = 2;
+ oldOutputSize = 1;
+ } else {
+ return slotIndex;
+ }
+ newInputSize = 6;
+ newOutputSize = 1;
+
+ } else if (mID >= 421 && mID <= 428) { // Chemical Reactor
+ if (nbtVersion < chemistryUpdateVersion) {
+ oldInputSize = 2;
+ oldOutputSize = 1;
+ } else {
+ return slotIndex;
+ }
+ newInputSize = 2;
+ newOutputSize = 2;
+
+ } else if (mID >= 531 && mID <= 538) { // Distillery
+ if (nbtVersion < chemistryUpdateVersion) {
+ oldInputSize = 1;
+ oldOutputSize = 0;
+ } else {
+ return slotIndex;
+ }
+ newInputSize = 1;
+ newOutputSize = 1;
+ } else if (mID >= 581 && mID <= 588) { // Mixer
+ if (nbtVersion < chemistryUpdateVersion) {
+ oldInputSize = 4;
+ oldOutputSize = 1;
+ } else {
+ return slotIndex;
+ }
+ newInputSize = 6;
+ newOutputSize = 1;
+
+ } else if (mID >= 351 && mID <= 355 || mID >= 11050 && mID <= 11056) { // wire mill
+ if (nbtVersion < wireAdditionVersion) {
+ oldInputSize = 1;
+ oldOutputSize = 1;
+ } else {
+ return slotIndex;
+ }
+ newInputSize = 2;
+ newOutputSize = 1;
+
+ } else if (mID >= 654 && mID <= 655 || mID >= 11070 && mID <= 11076) { // arc furnace
+ if (nbtVersion < disassemblerRemoveVersion) {
+ oldInputSize = 1;
+ oldOutputSize = 4;
+ } else {
+ return slotIndex;
+ }
+ newInputSize = 1;
+ newOutputSize = 9;
+
+ } else {
+ return slotIndex;
+ }
+
+ int indexShift = 0;
+ if (slotIndex >= GT_MetaTileEntity_BasicMachine.OTHER_SLOT_COUNT + oldInputSize) {
+ indexShift += newInputSize - oldInputSize;
+ }
+ if (slotIndex >= GT_MetaTileEntity_BasicMachine.OTHER_SLOT_COUNT + oldInputSize + oldOutputSize) {
+ indexShift += newOutputSize - oldOutputSize;
+ }
+ return slotIndex + indexShift;
+ }
+
+ @Override
+ public IGridNode getGridNode(ForgeDirection forgeDirection) {
+ final AENetworkProxy gp = getProxy();
+ return gp != null ? gp.getNode() : null;
+ }
+
+ @Override
+ public AECableType getCableConnectionType(ForgeDirection forgeDirection) {
+ return mMetaTileEntity == null ? AECableType.NONE : mMetaTileEntity.getCableConnectionType(forgeDirection);
+ }
+
+ @Override
+ public void securityBreak() {}
+
+ @Override
+ public IGridNode getActionableNode() {
+ final AENetworkProxy gp = getProxy();
+ return gp != null ? gp.getNode() : null;
+ }
+
+ @Override
+ public AENetworkProxy getProxy() {
+ return mMetaTileEntity == null ? null : mMetaTileEntity.getProxy();
+ }
+
+ @Override
+ public DimensionalCoord getLocation() {
+ return new DimensionalCoord(this);
+ }
+
+ @Override
+ public void gridChanged() {
+ if (mMetaTileEntity != null) mMetaTileEntity.gridChanged();
+ }
+
+ @TileEvent(TileEventType.WORLD_NBT_READ)
+ public void readFromNBT_AENetwork(final NBTTagCompound data) {
+ final AENetworkProxy gp = getProxy();
+ if (gp != null) getProxy().readFromNBT(data);
+ }
+
+ @TileEvent(TileEventType.WORLD_NBT_WRITE)
+ public void writeToNBT_AENetwork(final NBTTagCompound data) {
+ final AENetworkProxy gp = getProxy();
+ if (gp != null) gp.writeToNBT(data);
+ }
+
+ void onChunkUnloadAE() {
+ final AENetworkProxy gp = getProxy();
+ if (gp != null) gp.onChunkUnload();
+ }
+
+ void invalidateAE() {
+ final AENetworkProxy gp = getProxy();
+ if (gp != null) gp.invalidate();
+ }
+
+ @Override
+ public boolean wasShutdown() {
+ return mWasShutdown;
+ }
+
+ @Override
+ public void setShutdownStatus(boolean newStatus) {
+ mWasShutdown = newStatus;
+ }
+
+ @Override
+ public void setShutDownReason(@NotNull ShutDownReason reason) {
+ lastShutDownReason = reason;
+ }
+
+ @Override
+ public @NotNull ShutDownReason getLastShutDownReason() {
+ return lastShutDownReason;
+ }
+
+ @Override
+ public IAlignment getAlignment() {
+ return getMetaTileEntity() instanceof IAlignmentProvider
+ ? ((IAlignmentProvider) getMetaTileEntity()).getAlignment()
+ : getMetaTileEntity() instanceof IAlignment ? (IAlignment) getMetaTileEntity() : null;
+ }
+
+ @Nullable
+ @Override
+ public IConstructable getConstructable() {
+ return getMetaTileEntity() instanceof IConstructable ? (IConstructable) getMetaTileEntity() : null;
+ }
+
+ @Override
+ public int[] getTimeStatistics() {
+ return mTimeStatistics;
+ }
+
+ @Override
+ public void startTimeStatistics() {
+ hasTimeStatisticsStarted = true;
+ }
+
+ @Nullable
+ @Override
+ public List<ItemStack> getItemsForHoloGlasses() {
+ if (canAccessData()) {
+ return mMetaTileEntity.getItemsForHoloGlasses();
+ }
+ return null;
+ }
+
+ @Override
+ public String getCustomName() {
+ return getMetaTileEntity() instanceof ICustomNameObject customNameObject ? customNameObject.getCustomName()
+ : null;
+ }
+
+ @Override
+ public boolean hasCustomName() {
+ return getMetaTileEntity() instanceof ICustomNameObject customNameObject && customNameObject.hasCustomName();
+ }
+
+ @Override
+ public void setCustomName(String name) {
+ if (getMetaTileEntity() instanceof ICustomNameObject customNameObject) customNameObject.setCustomName(name);
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java
new file mode 100644
index 0000000000..d8b0086f0f
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java
@@ -0,0 +1,979 @@
+package gregtech.api.metatileentity;
+
+import static gregtech.api.enums.GT_Values.COMPASS_DIRECTIONS;
+import static gregtech.api.enums.GT_Values.GT;
+import static gregtech.api.enums.GT_Values.NW;
+import static gregtech.api.enums.GT_Values.SIDE_DOWN;
+import static gregtech.api.enums.GT_Values.SIDE_UP;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Supplier;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.screen.ITileWithModularUI;
+import com.gtnewhorizons.modularui.api.screen.ModularUIContext;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.relauncher.Side;
+import gregtech.GT_Mod;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddInventorySlots;
+import gregtech.api.interfaces.modularui.IGetGUITextureSet;
+import gregtech.api.interfaces.tileentity.IGTEnet;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords;
+import gregtech.api.interfaces.tileentity.IIC2Enet;
+import gregtech.api.net.GT_Packet_Block_Event;
+import gregtech.api.net.GT_Packet_SetConfigurationCircuit;
+import gregtech.api.util.GT_TooltipDataCache;
+import gregtech.api.util.GT_Util;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.gui.modularui.uifactory.SelectItemUIFactory;
+import ic2.api.energy.event.EnergyTileLoadEvent;
+import ic2.api.energy.event.EnergyTileUnloadEvent;
+
+/**
+ * The Functions my old TileEntities and my BaseMetaTileEntities have in common.
+ * <p/>
+ * Basically everything a TileEntity should have.
+ */
+public abstract class BaseTileEntity extends TileEntity implements IHasWorldObjectAndCoords, IIC2Enet, IGTEnet,
+ ITileWithModularUI, IAddGregtechLogo, IGetGUITextureSet, IAddInventorySlots {
+
+ protected boolean mInventoryChanged = false;
+
+ /**
+ * Buffers adjacent TileEntities for faster access
+ * <p/>
+ * "this" means that there is no TileEntity, while "null" means that it doesn't know if there is even a TileEntity
+ * and still needs to check that if needed.
+ */
+ private final TileEntity[] mBufferedTileEntities = new TileEntity[6];
+ /**
+ * If this TileEntity checks for the Chunk to be loaded before returning World based values. The AdvPump hacks this
+ * to false to ensure everything runs properly even when far Chunks are not actively loaded. But anything else
+ * should not cause worfin' Chunks, uhh I mean orphan Chunks.
+ */
+ public boolean ignoreUnloadedChunks = true;
+ /**
+ * This Variable checks if this TileEntity is dead, because Minecraft is too stupid to have proper TileEntity
+ * unloading.
+ */
+ public boolean isDead = false;
+
+ private final ChunkCoordinates mReturnedCoordinates = new ChunkCoordinates();
+
+ public static ForgeDirection getSideForPlayerPlacing(Entity aPlayer, ForgeDirection defaultFacing,
+ boolean[] aAllowedFacings) {
+ if (aPlayer != null) {
+ if (aPlayer.rotationPitch >= 65 && aAllowedFacings[SIDE_UP]) return ForgeDirection.UP;
+ if (aPlayer.rotationPitch <= -65 && aAllowedFacings[SIDE_DOWN]) return ForgeDirection.DOWN;
+ final byte rFacing = COMPASS_DIRECTIONS[MathHelper.floor_double(0.5D + 4.0F * aPlayer.rotationYaw / 360.0F)
+ & 0x3];
+ if (aAllowedFacings[rFacing]) return ForgeDirection.getOrientation(rFacing);
+ }
+ for (final ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) if (aAllowedFacings[dir.ordinal()]) return dir;
+ return defaultFacing;
+ }
+
+ private void clearNullMarkersFromTileEntityBuffer() {
+ for (int i = 0; i < mBufferedTileEntities.length; i++)
+ if (mBufferedTileEntities[i] == this) mBufferedTileEntities[i] = null;
+ }
+
+ /**
+ * Called automatically when the Coordinates of this TileEntity have been changed
+ */
+ protected final void clearTileEntityBuffer() {
+ Arrays.fill(mBufferedTileEntities, null);
+ }
+
+ @Override
+ public final World getWorld() {
+ return worldObj;
+ }
+
+ @Override
+ public final int getXCoord() {
+ return xCoord;
+ }
+
+ @Override
+ public final short getYCoord() {
+ return (short) yCoord;
+ }
+
+ @Override
+ public final int getZCoord() {
+ return zCoord;
+ }
+
+ @Override
+ public ChunkCoordinates getCoords() {
+ mReturnedCoordinates.posX = xCoord;
+ mReturnedCoordinates.posY = yCoord;
+ mReturnedCoordinates.posZ = zCoord;
+ return mReturnedCoordinates;
+ }
+
+ @Override
+ public final int getOffsetX(ForgeDirection side, int aMultiplier) {
+ return xCoord + side.offsetX * aMultiplier;
+ }
+
+ @Override
+ public final short getOffsetY(ForgeDirection side, int aMultiplier) {
+ return (short) (yCoord + side.offsetY * aMultiplier);
+ }
+
+ @Override
+ public final int getOffsetZ(ForgeDirection side, int aMultiplier) {
+ return zCoord + side.offsetZ * aMultiplier;
+ }
+
+ @Override
+ public final boolean isServerSide() {
+ if (worldObj == null) {
+ return FMLCommonHandler.instance()
+ .getEffectiveSide() == Side.SERVER;
+ }
+ return !worldObj.isRemote;
+ }
+
+ @Override
+ public final boolean isClientSide() {
+ if (worldObj == null) {
+ return FMLCommonHandler.instance()
+ .getEffectiveSide() == Side.CLIENT;
+ }
+ return worldObj.isRemote;
+ }
+
+ @Override
+ @Deprecated
+ public final boolean openGUI(EntityPlayer aPlayer) {
+ return openGUI(aPlayer, 0);
+ }
+
+ @Override
+ @Deprecated
+ public final boolean openGUI(EntityPlayer aPlayer, int aID) {
+ if (aPlayer == null) return false;
+ aPlayer.openGui(GT, aID, worldObj, xCoord, yCoord, zCoord);
+ return true;
+ }
+
+ @Override
+ public boolean isInvalidTileEntity() {
+ return isInvalid();
+ }
+
+ @Override
+ public int getRandomNumber(int aRange) {
+ return ThreadLocalRandom.current()
+ .nextInt(aRange);
+ }
+
+ @Override
+ public final BiomeGenBase getBiome(int aX, int aZ) {
+ return worldObj.getBiomeGenForCoords(aX, aZ);
+ }
+
+ @Override
+ public final BiomeGenBase getBiome() {
+ return getBiome(xCoord, zCoord);
+ }
+
+ @Override
+ public final Block getBlockOffset(int aX, int aY, int aZ) {
+ return getBlock(xCoord + aX, yCoord + aY, zCoord + aZ);
+ }
+
+ @Override
+ public final Block getBlockAtSide(ForgeDirection side) {
+ return getBlockAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final Block getBlockAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return getBlock(getOffsetX(side, aDistance), getOffsetY(side, aDistance), getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final byte getMetaIDOffset(int aX, int aY, int aZ) {
+ return getMetaID(xCoord + aX, yCoord + aY, zCoord + aZ);
+ }
+
+ @Override
+ public final byte getMetaIDAtSide(ForgeDirection side) {
+ return getMetaIDAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final byte getMetaIDAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return getMetaID(getOffsetX(side, aDistance), getOffsetY(side, aDistance), getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final byte getLightLevelOffset(int aX, int aY, int aZ) {
+ return getLightLevel(xCoord + aX, yCoord + aY, zCoord + aZ);
+ }
+
+ @Override
+ public final byte getLightLevelAtSide(ForgeDirection side) {
+ return getLightLevelAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final byte getLightLevelAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return getLightLevel(getOffsetX(side, aDistance), getOffsetY(side, aDistance), getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final boolean getOpacityOffset(int aX, int aY, int aZ) {
+ return getOpacity(xCoord + aX, yCoord + aY, zCoord + aZ);
+ }
+
+ @Override
+ public final boolean getOpacityAtSide(ForgeDirection side) {
+ return getOpacityAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final boolean getOpacityAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return getOpacity(getOffsetX(side, aDistance), getOffsetY(side, aDistance), getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final boolean getSkyOffset(int aX, int aY, int aZ) {
+ return getSky(xCoord + aX, yCoord + aY, zCoord + aZ);
+ }
+
+ @Override
+ public final boolean getSkyAtSide(ForgeDirection side) {
+ return getSkyAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final boolean getSkyAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return getSky(getOffsetX(side, aDistance), getOffsetY(side, aDistance), getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final boolean getAirOffset(int aX, int aY, int aZ) {
+ return getAir(xCoord + aX, yCoord + aY, zCoord + aZ);
+ }
+
+ @Override
+ public final boolean getAirAtSide(ForgeDirection side) {
+ return getAirAtSideAndDistance(side, 1);
+ }
+
+ @Override
+ public final boolean getAirAtSideAndDistance(ForgeDirection side, int aDistance) {
+ return getAir(getOffsetX(side, aDistance), getOffsetY(side, aDistance), getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final TileEntity getTileEntityOffset(int aX, int aY, int aZ) {
+ return getTileEntity(xCoord + aX, yCoord + aY, zCoord + aZ);
+ }
+
+ @Override
+ public final TileEntity getTileEntityAtSideAndDistance(ForgeDirection side, int aDistance) {
+ if (aDistance == 1) return getTileEntityAtSide(side);
+ return getTileEntity(getOffsetX(side, aDistance), getOffsetY(side, aDistance), getOffsetZ(side, aDistance));
+ }
+
+ @Override
+ public final IInventory getIInventory(int aX, int aY, int aZ) {
+ final TileEntity tTileEntity = getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IInventory) return (IInventory) tTileEntity;
+ return null;
+ }
+
+ @Override
+ public final IInventory getIInventoryOffset(int aX, int aY, int aZ) {
+ final TileEntity tTileEntity = getTileEntityOffset(aX, aY, aZ);
+ if (tTileEntity instanceof IInventory) return (IInventory) tTileEntity;
+ return null;
+ }
+
+ @Override
+ public final IInventory getIInventoryAtSide(ForgeDirection side) {
+ final TileEntity tTileEntity = getTileEntityAtSide(side);
+ if (tTileEntity instanceof IInventory) return (IInventory) tTileEntity;
+ return null;
+ }
+
+ @Override
+ public final IInventory getIInventoryAtSideAndDistance(ForgeDirection side, int aDistance) {
+ final TileEntity tTileEntity = getTileEntityAtSideAndDistance(side, aDistance);
+ if (tTileEntity instanceof IInventory) return (IInventory) tTileEntity;
+ return null;
+ }
+
+ @Override
+ public final IFluidHandler getITankContainer(int aX, int aY, int aZ) {
+ final TileEntity tTileEntity = getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IFluidHandler) return (IFluidHandler) tTileEntity;
+ return null;
+ }
+
+ @Override
+ public final IFluidHandler getITankContainerOffset(int aX, int aY, int aZ) {
+ final TileEntity tTileEntity = getTileEntityOffset(aX, aY, aZ);
+ if (tTileEntity instanceof IFluidHandler) return (IFluidHandler) tTileEntity;
+ return null;
+ }
+
+ @Override
+ public final IFluidHandler getITankContainerAtSide(ForgeDirection side) {
+ final TileEntity tTileEntity = getTileEntityAtSide(side);
+ if (tTileEntity instanceof IFluidHandler) return (IFluidHandler) tTileEntity;
+ return null;
+ }
+
+ @Override
+ public final IFluidHandler getITankContainerAtSideAndDistance(ForgeDirection side, int aDistance) {
+ final TileEntity tTileEntity = getTileEntityAtSideAndDistance(side, aDistance);
+ if (tTileEntity instanceof IFluidHandler) return (IFluidHandler) tTileEntity;
+ return null;
+ }
+
+ @Override
+ public final IGregTechTileEntity getIGregTechTileEntity(int aX, int aY, int aZ) {
+ final TileEntity tTileEntity = getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity) return (IGregTechTileEntity) tTileEntity;
+ return null;
+ }
+
+ @Override
+ public final IGregTechTileEntity getIGregTechTileEntityOffset(int aX, int aY, int aZ) {
+ final TileEntity tTileEntity = getTileEntityOffset(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity) return (IGregTechTileEntity) tTileEntity;
+ return null;
+ }
+
+ @Override
+ public final IGregTechTileEntity getIGregTechTileEntityAtSide(ForgeDirection side) {
+ final TileEntity tTileEntity = getTileEntityAtSide(side);
+ if (tTileEntity instanceof IGregTechTileEntity) return (IGregTechTileEntity) tTileEntity;
+ return null;
+ }
+
+ @Override
+ public final IGregTechTileEntity getIGregTechTileEntityAtSideAndDistance(ForgeDirection side, int aDistance) {
+ final TileEntity tTileEntity = getTileEntityAtSideAndDistance(side, aDistance);
+ if (tTileEntity instanceof IGregTechTileEntity) return (IGregTechTileEntity) tTileEntity;
+ return null;
+ }
+
+ @Override
+ public final Block getBlock(int aX, int aY, int aZ) {
+ if (ignoreUnloadedChunks && crossedChunkBorder(aX, aZ) && !worldObj.blockExists(aX, aY, aZ)) return Blocks.air;
+ return worldObj.getBlock(aX, aY, aZ);
+ }
+
+ public Block getBlock(ChunkCoordinates aCoords) {
+ if (worldObj == null) return Blocks.air;
+ if (ignoreUnloadedChunks && crossedChunkBorder(aCoords)
+ && !worldObj.blockExists(aCoords.posX, aCoords.posY, aCoords.posZ)) return Blocks.air;
+ return worldObj.getBlock(aCoords.posX, aCoords.posY, aCoords.posZ);
+ }
+
+ @Override
+ public final byte getMetaID(int aX, int aY, int aZ) {
+ if (ignoreUnloadedChunks && crossedChunkBorder(aX, aZ) && !worldObj.blockExists(aX, aY, aZ)) return 0;
+ return (byte) worldObj.getBlockMetadata(aX, aY, aZ);
+ }
+
+ @Override
+ public final byte getLightLevel(int aX, int aY, int aZ) {
+ if (ignoreUnloadedChunks && crossedChunkBorder(aX, aZ) && !worldObj.blockExists(aX, aY, aZ)) return 0;
+ return (byte) (worldObj.getLightBrightness(aX, aY, aZ) * 15);
+ }
+
+ @Override
+ public final boolean getSky(int aX, int aY, int aZ) {
+ if (ignoreUnloadedChunks && crossedChunkBorder(aX, aZ) && !worldObj.blockExists(aX, aY, aZ)) return true;
+ return worldObj.canBlockSeeTheSky(aX, aY, aZ);
+ }
+
+ @Override
+ public final boolean getOpacity(int aX, int aY, int aZ) {
+ if (ignoreUnloadedChunks && crossedChunkBorder(aX, aZ) && !worldObj.blockExists(aX, aY, aZ)) return false;
+ return GT_Utility.isOpaqueBlock(worldObj, aX, aY, aZ);
+ }
+
+ @Override
+ public final boolean getAir(int aX, int aY, int aZ) {
+ if (ignoreUnloadedChunks && crossedChunkBorder(aX, aZ) && !worldObj.blockExists(aX, aY, aZ)) return true;
+ return GT_Utility.isBlockAir(worldObj, aX, aY, aZ);
+ }
+
+ @Override
+ public TileEntity getTileEntity(int aX, int aY, int aZ) {
+ if (ignoreUnloadedChunks && crossedChunkBorder(aX, aZ) && !worldObj.blockExists(aX, aY, aZ)) return null;
+ return worldObj.getTileEntity(aX, aY, aZ);
+ }
+
+ @Override
+ public final TileEntity getTileEntityAtSide(ForgeDirection side) {
+ final int ordinalSide = side.ordinal();
+ if (side == ForgeDirection.UNKNOWN || mBufferedTileEntities[ordinalSide] == this) return null;
+ final int tX = getOffsetX(side, 1);
+ final int tY = getOffsetY(side, 1);
+ final int tZ = getOffsetZ(side, 1);
+ if (crossedChunkBorder(tX, tZ)) {
+ mBufferedTileEntities[ordinalSide] = null;
+ if (ignoreUnloadedChunks && !worldObj.blockExists(tX, tY, tZ)) return null;
+ }
+ if (mBufferedTileEntities[ordinalSide] == null) {
+ mBufferedTileEntities[ordinalSide] = worldObj.getTileEntity(tX, tY, tZ);
+ if (mBufferedTileEntities[ordinalSide] == null) {
+ mBufferedTileEntities[ordinalSide] = this;
+ return null;
+ }
+ return mBufferedTileEntities[ordinalSide];
+ }
+ if (mBufferedTileEntities[ordinalSide].isInvalid()) {
+ mBufferedTileEntities[ordinalSide] = null;
+ return getTileEntityAtSide(side);
+ }
+ if (mBufferedTileEntities[ordinalSide].xCoord == tX && mBufferedTileEntities[ordinalSide].yCoord == tY
+ && mBufferedTileEntities[ordinalSide].zCoord == tZ) {
+ return mBufferedTileEntities[ordinalSide];
+ }
+ return null;
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound aNBT) {
+ super.writeToNBT(aNBT);
+ }
+
+ @Override
+ public boolean isDead() {
+ return isDead || isInvalidTileEntity();
+ }
+
+ @Override
+ public void validate() {
+ clearNullMarkersFromTileEntityBuffer();
+ super.validate();
+ }
+
+ @Override
+ public void invalidate() {
+ leaveEnet();
+ clearNullMarkersFromTileEntityBuffer();
+ super.invalidate();
+ }
+
+ @Override
+ public void onChunkUnload() {
+ leaveEnet();
+ clearNullMarkersFromTileEntityBuffer();
+ super.onChunkUnload();
+ isDead = true;
+ }
+
+ @Override
+ public void updateEntity() {
+ // Well if the TileEntity gets ticked it is alive.
+ isDead = false;
+ }
+
+ public final void onAdjacentBlockChange(int ignoredAX, int ignoredAY, int ignoredAZ) {
+ clearNullMarkersFromTileEntityBuffer();
+ }
+
+ public void updateNeighbours(int mStrongRedstone, int oStrongRedstone) {
+ final Block thisBlock = getBlockOffset(0, 0, 0);
+ for (final ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
+ final int x1 = xCoord + dir.offsetX, y1 = yCoord + dir.offsetY, z1 = zCoord + dir.offsetZ;
+
+ if (worldObj.blockExists(x1, y1, z1)) {
+ worldObj.notifyBlockOfNeighborChange(x1, y1, z1, thisBlock);
+
+ // update if it was / is strong powered.
+ if (((((mStrongRedstone | oStrongRedstone) >>> dir.ordinal()) & 1) != 0)
+ && getBlock(x1, y1, z1).isNormalCube()) {
+ final int skipUpdateSide = dir.getOpposite()
+ .ordinal(); // Don't update this block. Still updates
+ // diagonal blocks twice if conditions
+ // meet.
+
+ for (final ForgeDirection dir2 : ForgeDirection.VALID_DIRECTIONS) {
+ final int x2 = x1 + dir2.offsetX, y2 = y1 + dir2.offsetY, z2 = z1 + dir2.offsetZ;
+ if (dir2.ordinal() != skipUpdateSide && worldObj.blockExists(x2, y2, z2))
+ worldObj.notifyBlockOfNeighborChange(x2, y2, z2, thisBlock);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public final void sendBlockEvent(byte aID, byte aValue) {
+ NW.sendPacketToAllPlayersInRange(
+ worldObj,
+ new GT_Packet_Block_Event(xCoord, (short) yCoord, zCoord, aID, aValue),
+ xCoord,
+ zCoord);
+ }
+
+ protected boolean crossedChunkBorder(int aX, int aZ) {
+ return aX >> 4 != xCoord >> 4 || aZ >> 4 != zCoord >> 4;
+ }
+
+ public final boolean crossedChunkBorder(ChunkCoordinates aCoords) {
+ return aCoords.posX >> 4 != xCoord >> 4 || aCoords.posZ >> 4 != zCoord >> 4;
+ }
+
+ public final void setOnFire() {
+ GT_Utility.setCoordsOnFire(worldObj, xCoord, yCoord, zCoord, false);
+ }
+
+ public final void setToFire() {
+ worldObj.setBlock(xCoord, yCoord, zCoord, Blocks.fire);
+ }
+
+ @Override
+ public void markDirty() {
+ // Avoid sending neighbor updates, just mark the chunk as dirty to make sure it gets saved
+ final Chunk chunk = worldObj.getChunkFromBlockCoords(xCoord, zCoord);
+ if (chunk != null) {
+ chunk.setChunkModified();
+ }
+ }
+
+ /**
+ * Gets items to be displayed for HoloInventory mod.
+ *
+ * @return null if default implementation should be used, i.e. {@link IInventory#getStackInSlot}.
+ * Otherwise, a list of items to be displayed. Null element may be contained.
+ */
+ @Nullable
+ public List<ItemStack> getItemsForHoloGlasses() {
+ return null;
+ }
+
+ @Deprecated
+ public String trans(String aKey, String aEnglish) {
+ return GT_Utility.trans(aKey, aEnglish);
+ }
+
+ protected Supplier<Boolean> getValidator() {
+ return () -> !this.isDead();
+ }
+
+ public boolean useModularUI() {
+ return false;
+ }
+
+ /*
+ * IC2 Energy Compat
+ */
+ protected TileIC2EnergySink ic2EnergySink = null;
+ protected boolean joinedIc2Enet = false;
+
+ protected void createIc2Sink() {
+ if (ic2EnergySink == null && isServerSide() && shouldJoinIc2Enet()) {
+ ic2EnergySink = new TileIC2EnergySink((IGregTechTileEntity) this);
+ }
+ }
+
+ @Override
+ public void doEnetUpdate() {
+ leaveEnet();
+ joinEnet();
+ }
+
+ protected void joinEnet() {
+ if (joinedIc2Enet || !shouldJoinIc2Enet()) return;
+
+ if (ic2EnergySink == null) createIc2Sink();
+
+ if (ic2EnergySink != null) {
+ MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(ic2EnergySink));
+ joinedIc2Enet = true;
+ }
+ }
+
+ protected void leaveEnet() {
+ if (joinedIc2Enet && ic2EnergySink != null && isServerSide()) {
+ joinedIc2Enet = false;
+ MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(ic2EnergySink));
+ }
+ }
+
+ // === GUI stuff ===
+
+ public ItemStackHandler getInventoryHandler() {
+ return null;
+ }
+
+ protected GT_TooltipDataCache mTooltipCache = new GT_TooltipDataCache();
+
+ // Tooltip localization keys
+ public static final String BATTERY_SLOT_TOOLTIP = "GT5U.machines.battery_slot.tooltip",
+ BATTERY_SLOT_TOOLTIP_ALT = "GT5U.machines.battery_slot.tooltip.alternative",
+ UNUSED_SLOT_TOOLTIP = "GT5U.machines.unused_slot.tooltip",
+ SPECIAL_SLOT_TOOLTIP = "GT5U.machines.special_slot.tooltip",
+ STALLED_STUTTERING_TOOLTIP = "GT5U.machines.stalled_stuttering.tooltip",
+ STALLED_VENT_TOOLTIP = "GT5U.machines.stalled_vent.tooltip",
+ FLUID_TRANSFER_TOOLTIP = "GT5U.machines.fluid_transfer.tooltip",
+ ITEM_TRANSFER_TOOLTIP = "GT5U.machines.item_transfer.tooltip", POWER_SOURCE_KEY = "GT5U.machines.powersource.",
+ BUTTON_FORBIDDEN_TOOLTIP = "GT5U.gui.button.forbidden",
+ NEI_TRANSFER_STEAM_TOOLTIP = "GT5U.machines.nei_transfer.steam.tooltip",
+ NEI_TRANSFER_VOLTAGE_TOOLTIP = "GT5U.machines.nei_transfer.voltage.tooltip";
+
+ public static final int TOOLTIP_DELAY = 5;
+
+ /**
+ * Override this to add {@link com.gtnewhorizons.modularui.api.widget.Widget}s for your UI.
+ */
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {}
+
+ public void bindPlayerInventoryUI(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.bindPlayerInventory(buildContext.getPlayer(), 7, getGUITextureSet().getItemSlot());
+ }
+
+ public String getLocalName() {
+ return "Unknown";
+ }
+
+ protected void addTitleToUI(ModularWindow.Builder builder) {
+ addTitleToUI(builder, getLocalName());
+ }
+
+ protected void addTitleToUI(ModularWindow.Builder builder, String title) {
+ if (GT_Mod.gregtechproxy.mTitleTabStyle == 2) {
+ addTitleItemIconStyle(builder, title);
+ } else {
+ addTitleTextStyle(builder, title);
+ }
+ }
+
+ protected void addTitleTextStyle(ModularWindow.Builder builder, String title) {
+ final int TAB_PADDING = 3;
+ final int TITLE_PADDING = 2;
+ int titleWidth = 0, titleHeight = 0;
+ if (NetworkUtils.isClient()) {
+ final FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
+ final List<String> titleLines = fontRenderer
+ .listFormattedStringToWidth(title, getGUIWidth() - (TAB_PADDING + TITLE_PADDING) * 2);
+ titleWidth = titleLines.size() > 1 ? getGUIWidth() - (TAB_PADDING + TITLE_PADDING) * 2
+ : fontRenderer.getStringWidth(title);
+ // noinspection PointlessArithmeticExpression
+ titleHeight = titleLines.size() * fontRenderer.FONT_HEIGHT + (titleLines.size() - 1) * 1;
+ }
+
+ final DrawableWidget tab = new DrawableWidget();
+ final TextWidget text = new TextWidget(title).setDefaultColor(getTitleColor())
+ .setTextAlignment(Alignment.CenterLeft)
+ .setMaxWidth(titleWidth);
+ if (GT_Mod.gregtechproxy.mTitleTabStyle == 1) {
+ tab.setDrawable(getGUITextureSet().getTitleTabAngular())
+ .setPos(0, -(titleHeight + TAB_PADDING) + 1)
+ .setSize(getGUIWidth(), titleHeight + TAB_PADDING * 2);
+ text.setPos(TAB_PADDING + TITLE_PADDING, -titleHeight + TAB_PADDING);
+ } else {
+ tab.setDrawable(getGUITextureSet().getTitleTabDark())
+ .setPos(0, -(titleHeight + TAB_PADDING * 2) + 1)
+ .setSize(titleWidth + (TAB_PADDING + TITLE_PADDING) * 2, titleHeight + TAB_PADDING * 2 - 1);
+ text.setPos(TAB_PADDING + TITLE_PADDING, -titleHeight);
+ }
+ builder.widget(tab)
+ .widget(text);
+ }
+
+ protected void addTitleItemIconStyle(ModularWindow.Builder builder, String title) {
+ builder.widget(
+ new MultiChildWidget().addChild(
+ new DrawableWidget().setDrawable(getGUITextureSet().getTitleTabNormal())
+ .setPos(0, 0)
+ .setSize(24, 24))
+ .addChild(
+ new ItemDrawable(getStackForm(1)).asWidget()
+ .setPos(4, 4))
+ .addTooltip(title)
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(0, -24 + 3));
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return GUITextureSet.DEFAULT;
+ }
+
+ protected int getTitleColor() {
+ return COLOR_TITLE.get();
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(152, 63));
+ }
+
+ protected int getGUIWidth() {
+ return 176;
+ }
+
+ protected int getGUIHeight() {
+ return 166;
+ }
+
+ protected boolean doesBindPlayerInventory() {
+ return true;
+ }
+
+ @Override
+ public void add1by1Slot(ModularWindow.Builder builder, IDrawable... background) {
+ final ItemStackHandler inventoryHandler = getInventoryHandler();
+ if (inventoryHandler == null) return;
+
+ if (background.length == 0) {
+ background = new IDrawable[] { getGUITextureSet().getItemSlot() };
+ }
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 1)
+ .startFromSlot(0)
+ .endAtSlot(0)
+ .background(background)
+ .build()
+ .setPos(79, 34));
+ }
+
+ @Override
+ public void add2by2Slots(ModularWindow.Builder builder, IDrawable... background) {
+ final ItemStackHandler inventoryHandler = getInventoryHandler();
+ if (inventoryHandler == null) return;
+
+ if (background.length == 0) {
+ background = new IDrawable[] { getGUITextureSet().getItemSlot() };
+ }
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 2)
+ .startFromSlot(0)
+ .endAtSlot(3)
+ .background(background)
+ .build()
+ .setPos(70, 25));
+ }
+
+ @Override
+ public void add3by3Slots(ModularWindow.Builder builder, IDrawable... background) {
+ final ItemStackHandler inventoryHandler = getInventoryHandler();
+ if (inventoryHandler == null) return;
+
+ if (background.length == 0) {
+ background = new IDrawable[] { getGUITextureSet().getItemSlot() };
+ }
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .startFromSlot(0)
+ .endAtSlot(8)
+ .background(background)
+ .build()
+ .setPos(61, 16));
+ }
+
+ @Override
+ public void add4by4Slots(ModularWindow.Builder builder, IDrawable... background) {
+ final ItemStackHandler inventoryHandler = getInventoryHandler();
+ if (inventoryHandler == null) return;
+
+ if (background.length == 0) {
+ background = new IDrawable[] { getGUITextureSet().getItemSlot() };
+ }
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 4)
+ .startFromSlot(0)
+ .endAtSlot(15)
+ .background(background)
+ .build()
+ .setPos(52, 7));
+ }
+
+ public void addCoverTabs(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ /* Do nothing */
+ }
+
+ public IConfigurationCircuitSupport getConfigurationCircuitSupport() {
+ if (!(this instanceof IConfigurationCircuitSupport)) return null;
+ return (IConfigurationCircuitSupport) this;
+ }
+
+ protected void addConfigurationCircuitSlot(ModularWindow.Builder builder) {
+ final ItemStackHandler inventoryHandler = getInventoryHandler();
+ if (inventoryHandler == null) return;
+
+ if (!(this instanceof IInventory inv)) return;
+
+ final IConfigurationCircuitSupport ccs = getConfigurationCircuitSupport();
+ if (ccs == null) return;
+
+ final AtomicBoolean dialogOpened = new AtomicBoolean(false);
+ builder.widget(new SlotWidget(new BaseSlot(inventoryHandler, ccs.getCircuitSlot(), true)) {
+
+ @Override
+ protected void phantomClick(ClickData clickData, ItemStack cursorStack) {
+ final ItemStack newCircuit;
+ if (clickData.shift) {
+ if (clickData.mouseButton == 0) {
+ if (NetworkUtils.isClient() && !dialogOpened.get()) {
+ openSelectCircuitDialog(getContext(), dialogOpened);
+ }
+ return;
+ } else {
+ newCircuit = null;
+ }
+ } else {
+ final List<ItemStack> tCircuits = ccs.getConfigurationCircuits();
+ final int index = GT_Utility.findMatchingStackInList(tCircuits, cursorStack);
+ if (index < 0) {
+ int curIndex = GT_Utility
+ .findMatchingStackInList(tCircuits, inv.getStackInSlot(ccs.getCircuitSlot())) + 1;
+ if (clickData.mouseButton == 0) {
+ curIndex += 1;
+ } else {
+ curIndex -= 1;
+ }
+ curIndex = Math.floorMod(curIndex, tCircuits.size() + 1) - 1;
+ newCircuit = curIndex < 0 ? null : tCircuits.get(curIndex);
+ } else {
+ // set to whatever it is
+ newCircuit = tCircuits.get(index);
+ }
+ }
+ inv.setInventorySlotContents(ccs.getCircuitSlot(), newCircuit);
+ }
+
+ @Override
+ protected void phantomScroll(int direction) {
+ phantomClick(new ClickData(direction > 0 ? 1 : 0, false, false, false));
+ }
+
+ @Override
+ public List<String> getExtraTooltip() {
+ return Arrays.asList(
+ EnumChatFormatting.DARK_GRAY + EnumChatFormatting.getTextWithoutFormattingCodes(
+ StatCollector.translateToLocal("GT5U.machines.select_circuit.tooltip.1")),
+ EnumChatFormatting.DARK_GRAY + EnumChatFormatting.getTextWithoutFormattingCodes(
+ StatCollector.translateToLocal("GT5U.machines.select_circuit.tooltip.2")),
+ EnumChatFormatting.DARK_GRAY + EnumChatFormatting.getTextWithoutFormattingCodes(
+ StatCollector.translateToLocal("GT5U.machines.select_circuit.tooltip.3")));
+ }
+ }.setOverwriteItemStackTooltip(list -> {
+ list.removeIf(
+ line -> line.contains(StatCollector.translateToLocal("gt.integrated_circuit.tooltip.0"))
+ || line.contains(StatCollector.translateToLocal("gt.integrated_circuit.tooltip.1")));
+ return list;
+ })
+ .disableShiftInsert()
+ .setHandlePhantomActionClient(true)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_INT_CIRCUIT)
+ .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.select_circuit.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(ccs.getCircuitSlotX() - 1, ccs.getCircuitSlotY() - 1));
+ }
+
+ protected void openSelectCircuitDialog(ModularUIContext uiContext, AtomicBoolean dialogOpened) {
+ final IConfigurationCircuitSupport ccs = getConfigurationCircuitSupport();
+ if (ccs == null) return;
+
+ if (!(this instanceof IInventory inv)) return;
+
+ final List<ItemStack> circuits = ccs.getConfigurationCircuits();
+ uiContext.openClientWindow(
+ player -> new SelectItemUIFactory(
+ StatCollector.translateToLocal("GT5U.machines.select_circuit"),
+ getStackForm(0),
+ this::onCircuitSelected,
+ circuits,
+ GT_Utility.findMatchingStackInList(circuits, inv.getStackInSlot(ccs.getCircuitSlot())))
+ .setAnotherWindow(true, dialogOpened)
+ .setGuiTint(getGUIColorization())
+ .setCurrentGetter(() -> inv.getStackInSlot(ccs.getCircuitSlot()))
+ .createWindow(new UIBuildContext(player)));
+ }
+
+ protected void onCircuitSelected(ItemStack selected) {
+ final IConfigurationCircuitSupport ccs = getConfigurationCircuitSupport();
+ if (ccs == null) return;
+
+ if (!(this instanceof IInventory inv)) return;
+
+ GT_Values.NW.sendToServer(new GT_Packet_SetConfigurationCircuit(this, selected));
+ // we will not do any validation on client side
+ // it doesn't get to actually decide what inventory contains anyway
+ inv.setInventorySlotContents(ccs.getCircuitSlot(), selected);
+ }
+
+ protected int getTextColorOrDefault(String textType, int defaultColor) {
+ return defaultColor;
+ }
+
+ protected Supplier<Integer> COLOR_TITLE = () -> getTextColorOrDefault("title", 0x404040);
+ protected Supplier<Integer> COLOR_TITLE_WHITE = () -> getTextColorOrDefault("title_white", 0xfafaff);
+ protected Supplier<Integer> COLOR_TEXT_WHITE = () -> getTextColorOrDefault("text_white", 0xfafaff);
+ protected Supplier<Integer> COLOR_TEXT_GRAY = () -> getTextColorOrDefault("text_gray", 0x404040);
+ protected Supplier<Integer> COLOR_TEXT_RED = () -> getTextColorOrDefault("text_red", 0xff0000);
+
+ public int getGUIColorization() {
+ return GT_Util.getRGBaInt(Dyes.dyeWhite.getRGBA());
+ }
+
+ public ItemStack getStackForm(long aAmount) {
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java
new file mode 100644
index 0000000000..5a2e88b242
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java
@@ -0,0 +1,340 @@
+package gregtech.api.metatileentity;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.network.Packet;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import appeng.api.crafting.ICraftingIconProvider;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.modularui.IBindPlayerInventoryUI;
+import gregtech.api.interfaces.modularui.IGetTitleColor;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+
+public abstract class CommonMetaTileEntity extends CoverableTileEntity
+ implements IGregTechTileEntity, ICraftingIconProvider {
+
+ protected boolean mNeedsBlockUpdate = true, mNeedsUpdate = true, mSendClientData = false, mInventoryChanged = false;
+
+ protected boolean createNewMetatileEntity(short aID) {
+ if (aID <= 0 || aID >= GregTech_API.METATILEENTITIES.length || GregTech_API.METATILEENTITIES[aID] == null) {
+ GT_Log.err.println("MetaID " + aID + " not loadable => locking TileEntity!");
+ } else {
+ if (hasValidMetaTileEntity()) getMetaTileEntity().setBaseMetaTileEntity(null);
+ GregTech_API.METATILEENTITIES[aID].newMetaEntity(this)
+ .setBaseMetaTileEntity(this);
+ mTickTimer = 0;
+ mID = aID;
+ return true;
+ }
+ return false;
+ }
+
+ protected void saveMetaTileNBT(NBTTagCompound aNBT) {
+ try {
+ if (hasValidMetaTileEntity()) {
+ aNBT.setInteger("nbtVersion", GT_Mod.NBT_VERSION);
+ final NBTTagList tItemList = new NBTTagList();
+ for (int i = 0; i < getMetaTileEntity().getRealInventory().length; i++) {
+ final ItemStack tStack = getMetaTileEntity().getRealInventory()[i];
+ if (tStack != null) {
+ final NBTTagCompound tTag = new NBTTagCompound();
+ tTag.setInteger("IntSlot", i);
+ tStack.writeToNBT(tTag);
+ tItemList.appendTag(tTag);
+ }
+ }
+ aNBT.setTag("Inventory", tItemList);
+
+ try {
+ getMetaTileEntity().saveNBTData(aNBT);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity.");
+ GT_Mod.logStackTrace(e);
+ }
+ }
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("Encountered CRITICAL ERROR while saving MetaTileEntity.");
+ GT_Mod.logStackTrace(e);
+ }
+ }
+
+ protected void loadMetaTileNBT(NBTTagCompound aNBT) {
+ final int nbtVersion = aNBT.getInteger("nbtVersion");
+ if (mID != 0 && createNewMetatileEntity(mID)) {
+ final NBTTagList tItemList = aNBT.getTagList("Inventory", 10);
+ for (int i = 0; i < tItemList.tagCount(); i++) {
+ final NBTTagCompound tTag = tItemList.getCompoundTagAt(i);
+ final int tSlot = migrateInventoryIndex(tTag.getInteger("IntSlot"), nbtVersion);
+ if (tSlot >= 0 && tSlot < getMetaTileEntity().getRealInventory().length) {
+ ItemStack loadedStack = GT_Utility.loadItem(tTag);
+ // We move away from fluid display item in TEs
+ if (loadedStack != null && loadedStack.getItem() == ItemList.Display_Fluid.getItem()) {
+ loadedStack = null;
+ }
+ getMetaTileEntity().getRealInventory()[tSlot] = loadedStack;
+ }
+ }
+
+ try {
+ getMetaTileEntity().loadNBTData(aNBT);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("Encountered Exception while loading MetaTileEntity.");
+ GT_Mod.logStackTrace(e);
+ }
+ }
+ }
+
+ /**
+ * Shifts the machine Inventory index according to the change in Input/Output Slots. Default implementation does not
+ * do anything to the slotIndex.
+ */
+ protected int migrateInventoryIndex(int slotIndex, int nbtVersion) {
+ return slotIndex;
+ }
+
+ @Override
+ public void markDirty() {
+ super.markDirty();
+ mInventoryChanged = true;
+ }
+
+ @Override
+ public boolean hasInventoryBeenModified() {
+ return mInventoryChanged;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ if (canAccessData()) return getMetaTileEntity().isValidSlot(aIndex);
+ return false;
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ issueClientUpdate();
+ return null;
+ }
+
+ @Override
+ public void issueTextureUpdate() {
+ mNeedsUpdate = true;
+ }
+
+ @Override
+ public void issueClientUpdate() {
+ mSendClientData = true;
+ }
+
+ @Override
+ public void issueBlockUpdate() {
+ mNeedsBlockUpdate = true;
+ }
+
+ @Override
+ public boolean isValidFacing(ForgeDirection side) {
+ if (canAccessData()) return getMetaTileEntity().isFacingValid(side);
+ return false;
+ }
+
+ protected boolean canAccessData() {
+ return !isDead && hasValidMetaTileEntity();
+ }
+
+ protected abstract boolean hasValidMetaTileEntity();
+
+ @Override
+ public String[] getDescription() {
+ if (canAccessData()) return getMetaTileEntity().getDescription();
+ return new String[0];
+ }
+
+ @Override
+ public boolean isStillValid() {
+ return hasValidMetaTileEntity();
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) {
+ return hasValidMetaTileEntity() && getMetaTileEntity().allowCoverOnSide(side, aCoverID);
+ }
+
+ @Override
+ public void issueCoverUpdate(ForgeDirection side) {
+ super.issueCoverUpdate(side);
+ issueClientUpdate();
+ }
+
+ /*
+ * IC2 Energy Compat
+ */
+ @Override
+ public boolean shouldJoinIc2Enet() {
+ final IMetaTileEntity meta = getMetaTileEntity();
+ return meta != null && meta.shouldJoinIc2Enet();
+ }
+
+ /*
+ * Modular UI Support
+ */
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (hasValidMetaTileEntity() && getMetaTileEntity() instanceof IAddUIWidgets) {
+ ((IAddUIWidgets) getMetaTileEntity()).addUIWidgets(builder, buildContext);
+ return;
+ }
+ super.addUIWidgets(builder, buildContext);
+ }
+
+ @Override
+ public void bindPlayerInventoryUI(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (hasValidMetaTileEntity() && getMetaTileEntity() instanceof IBindPlayerInventoryUI) {
+ ((IBindPlayerInventoryUI) getMetaTileEntity()).bindPlayerInventoryUI(builder, buildContext);
+ return;
+ }
+ super.bindPlayerInventoryUI(builder, buildContext);
+ }
+
+ @Override
+ public IConfigurationCircuitSupport getConfigurationCircuitSupport() {
+ if (hasValidMetaTileEntity() && getMetaTileEntity() instanceof IConfigurationCircuitSupport) {
+ return (IConfigurationCircuitSupport) getMetaTileEntity();
+ }
+ return null;
+ }
+
+ @Override
+ public ItemStackHandler getInventoryHandler() {
+ if (hasValidMetaTileEntity()) {
+ return getMetaTileEntity().getInventoryHandler();
+ }
+ return null;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return hasValidMetaTileEntity() && getMetaTileEntity().useModularUI();
+ }
+
+ @Override
+ public String getLocalName() {
+ if (hasValidMetaTileEntity()) return getMetaTileEntity().getLocalName();
+ return super.getLocalName();
+ }
+
+ @Override
+ protected int getGUIWidth() {
+ if (hasValidMetaTileEntity()) return getMetaTileEntity().getGUIWidth();
+
+ return super.getGUIWidth();
+ }
+
+ @Override
+ protected int getGUIHeight() {
+ if (hasValidMetaTileEntity()) return getMetaTileEntity().getGUIHeight();
+
+ return super.getGUIHeight();
+ }
+
+ @Override
+ protected boolean doesBindPlayerInventory() {
+ if (hasValidMetaTileEntity()) return getMetaTileEntity().doesBindPlayerInventory();
+
+ return super.doesBindPlayerInventory();
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ if (hasValidMetaTileEntity() && getMetaTileEntity() instanceof IAddGregtechLogo) {
+ ((IAddGregtechLogo) getMetaTileEntity()).addGregTechLogo(builder);
+ return;
+ }
+ super.addGregTechLogo(builder);
+ }
+
+ @Override
+ public ItemStack getStackForm(long aAmount) {
+ if (hasValidMetaTileEntity()) {
+ return getMetaTileEntity().getStackForm(aAmount);
+ }
+ return super.getStackForm(aAmount);
+ }
+
+ @Override
+ public int getTitleColor() {
+ if (hasValidMetaTileEntity() && getMetaTileEntity() instanceof IGetTitleColor) {
+ return ((IGetTitleColor) getMetaTileEntity()).getTitleColor();
+ }
+ return super.getTitleColor();
+ }
+
+ @Override
+ public int getGUIColorization() {
+ if (hasValidMetaTileEntity()) {
+ return getMetaTileEntity().getGUIColorization();
+ }
+ return super.getGUIColorization();
+ }
+
+ @Override
+ protected int getTextColorOrDefault(String textType, int defaultColor) {
+ if (hasValidMetaTileEntity()) {
+ return getMetaTileEntity().getTextColorOrDefault(textType, defaultColor);
+ }
+ return defaultColor;
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ if (hasValidMetaTileEntity()) {
+ return getMetaTileEntity().getGUITextureSet();
+ }
+ return super.getGUITextureSet();
+ }
+
+ @Override
+ public ItemStack getMachineCraftingIcon() {
+ return getMetaTileEntity() != null ? getMetaTileEntity().getMachineCraftingIcon() : null;
+ }
+
+ @Override
+ public ModularWindow createWindow(UIBuildContext buildContext) {
+ if (!useModularUI()) return null;
+
+ buildContext.setValidator(getValidator());
+ final ModularWindow.Builder builder = ModularWindow.builder(getGUIWidth(), getGUIHeight());
+ builder.setBackground(getGUITextureSet().getMainBackground());
+ builder.setGuiTint(getGUIColorization());
+ if (doesBindPlayerInventory()) {
+ bindPlayerInventoryUI(builder, buildContext);
+ }
+ addUIWidgets(builder, buildContext);
+ addTitleToUI(builder);
+ addCoverTabs(builder, buildContext);
+ final IConfigurationCircuitSupport csc = getConfigurationCircuitSupport();
+ if (csc != null && csc.allowSelectCircuit()) {
+ addConfigurationCircuitSlot(builder);
+ } else {
+ addGregTechLogo(builder);
+ }
+ return builder.build();
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java
new file mode 100644
index 0000000000..277b79c777
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java
@@ -0,0 +1,803 @@
+package gregtech.api.metatileentity;
+
+import static gregtech.api.enums.GT_Values.E;
+import static gregtech.api.enums.GT_Values.NW;
+import static gregtech.api.util.GT_LanguageManager.FACES;
+import static gregtech.api.util.GT_LanguageManager.getTranslation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.IntStream;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.entity.item.EntityItem;
+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.nbt.NBTTagList;
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.io.ByteStreams;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
+import com.gtnewhorizons.modularui.api.math.MainAxisAlignment;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.Column;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregtechWailaProvider;
+import gregtech.api.net.GT_Packet_RequestCoverData;
+import gregtech.api.net.GT_Packet_SendCoverData;
+import gregtech.api.net.GT_Packet_TileEntityCoverGUI;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.GT_Client;
+import gregtech.common.covers.CoverInfo;
+import gregtech.common.covers.GT_Cover_Fluidfilter;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public abstract class CoverableTileEntity extends BaseTileEntity implements ICoverable, IGregtechWailaProvider {
+
+ public static final String[] COVER_DATA_NBT_KEYS = Arrays.stream(ForgeDirection.VALID_DIRECTIONS)
+ .mapToInt(Enum::ordinal)
+ .mapToObj(i -> "mCoverData" + i)
+ .toArray(String[]::new);
+
+ // New Cover Information
+ protected final CoverInfo[] coverInfos = new CoverInfo[] { null, null, null, null, null, null };
+ private byte validCoversMask;
+
+ protected byte[] mSidedRedstone = new byte[] { 15, 15, 15, 15, 15, 15 };
+ protected boolean mRedstone = false;
+ protected byte mStrongRedstone = 0;
+
+ protected short mID = 0;
+ public long mTickTimer = 0;
+ private Map<ForgeDirection, ISerializableObject> clientCoverData = new HashMap<>();
+
+ protected void writeCoverNBT(NBTTagCompound aNBT, boolean isDrop) {
+ final NBTTagList tList = new NBTTagList();
+ final int[] coverSides = new int[] { 0, 0, 0, 0, 0, 0 };
+
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (!coverInfo.isValid()) continue;
+
+ // Backwards compat, in case of a revert... for now
+ tList.appendTag(coverInfo.writeToNBT(new NBTTagCompound()));
+ aNBT.setTag(
+ COVER_DATA_NBT_KEYS[side.ordinal()],
+ coverInfo.getCoverData()
+ .saveDataToNBT());
+ }
+ if (tList.tagCount() > 0) {
+ aNBT.setTag(GT_Values.NBT.COVERS, tList);
+ // Backwards compat, in case of a revert... for now
+ aNBT.setIntArray("mCoverSides", coverSides);
+ }
+
+ if (mStrongRedstone > 0) aNBT.setByte("mStrongRedstone", mStrongRedstone);
+
+ if (!isDrop) {
+ aNBT.setByteArray("mRedstoneSided", mSidedRedstone);
+ aNBT.setBoolean("mRedstone", mRedstone);
+ }
+ }
+
+ protected void readCoverNBT(NBTTagCompound aNBT) {
+ mRedstone = aNBT.getBoolean("mRedstone");
+ mSidedRedstone = aNBT.hasKey("mRedstoneSided") ? aNBT.getByteArray("mRedstoneSided")
+ : new byte[] { 15, 15, 15, 15, 15, 15 };
+ mStrongRedstone = aNBT.getByte("mStrongRedstone");
+
+ if (aNBT.hasKey(GT_Values.NBT.COVERS)) {
+ readCoverInfoNBT(aNBT);
+ } else if (aNBT.hasKey("mCoverSides")) {
+ readLegacyCoverInfoNBT(aNBT);
+ }
+ }
+
+ public void readCoverInfoNBT(NBTTagCompound aNBT) {
+ final NBTTagList tList = aNBT.getTagList(GT_Values.NBT.COVERS, 10);
+ for (byte i = 0; i < tList.tagCount(); i++) {
+ final NBTTagCompound tNBT = tList.getCompoundTagAt(i);
+ final CoverInfo coverInfo = new CoverInfo(this, tNBT);
+ this.setCoverInfoAtSide(coverInfo.getSide(), coverInfo);
+ if (coverInfo.isDataNeededOnClient()) issueCoverUpdate(ForgeDirection.getOrientation(i));
+ }
+ }
+
+ public void readLegacyCoverInfoNBT(NBTTagCompound aNBT) {
+ final int[] coverIDs = aNBT.hasKey("mCoverSides") ? aNBT.getIntArray("mCoverSides")
+ : new int[] { 0, 0, 0, 0, 0, 0 };
+ final boolean hasOldCoverData = (aNBT.hasKey("mCoverData", 11) && aNBT.getIntArray("mCoverData").length == 6);
+ final int[] tOldData = hasOldCoverData ? aNBT.getIntArray("mCoverData") : new int[] {};
+
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final int ordinalSide = side.ordinal();
+ if (coverIDs[ordinalSide] == 0) continue;
+
+ final CoverInfo coverInfo = new CoverInfo(side, coverIDs[ordinalSide], this, null);
+ final GT_CoverBehaviorBase<?> coverBehavior = coverInfo.getCoverBehavior();
+ if (coverBehavior == GregTech_API.sNoBehavior) continue;
+
+ ISerializableObject coverData = null;
+ if (hasOldCoverData) {
+ if (coverBehavior instanceof GT_Cover_Fluidfilter) {
+ final String filterKey = String.format("fluidFilter%d", ordinalSide);
+ if (aNBT.hasKey(filterKey)) {
+ coverData = coverInfo.getCoverBehavior()
+ .createDataObject(
+ (tOldData[ordinalSide] & 7)
+ | (FluidRegistry.getFluidID(aNBT.getString(filterKey)) << 3));
+ }
+ } else {
+ coverData = coverBehavior.createDataObject(tOldData[ordinalSide]);
+ }
+ } else {
+ if (aNBT.hasKey(COVER_DATA_NBT_KEYS[ordinalSide]))
+ coverData = coverBehavior.createDataObject(aNBT.getTag(COVER_DATA_NBT_KEYS[ordinalSide]));
+ }
+
+ if (coverData != null) coverInfo.setCoverData(coverData);
+ setCoverInfoAtSide(side, coverInfo);
+ if (coverInfo.isDataNeededOnClient()) issueCoverUpdate(side);
+ }
+ }
+
+ public abstract boolean isStillValid();
+
+ protected boolean doCoverThings() {
+ byte validCoversMask = this.validCoversMask;
+ if (validCoversMask == 0) return true;
+
+ for (int i = Integer.numberOfTrailingZeros(validCoversMask); i < 6; i++) {
+ if (((validCoversMask >>> i) & 1) == 0) continue;
+ if (!tickCoverAtSide(ForgeDirection.VALID_DIRECTIONS[i])) return false;
+ }
+
+ return true;
+ }
+
+ public boolean tickCoverAtSide(ForgeDirection side) {
+ return tickCoverAtSide(side, mTickTimer);
+ }
+
+ /**
+ * @return {@code false} if the tile is no longer valid after ticking the cover
+ */
+ public boolean tickCoverAtSide(ForgeDirection side, long aTickTimer) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (!coverInfo.isValid()) return true;
+ final int tCoverTickRate = coverInfo.getTickRate();
+ if (tCoverTickRate > 0 && aTickTimer % tCoverTickRate == 0) {
+ final byte tRedstone = coverInfo.isRedstoneSensitive(aTickTimer) ? getInputRedstoneSignal(side) : 0;
+ coverInfo.setCoverData(coverInfo.doCoverThings(aTickTimer, tRedstone));
+ return isStillValid();
+ }
+
+ return true;
+ }
+
+ public abstract boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID);
+
+ protected void checkDropCover() {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final int coverId = getCoverIDAtSide(side);
+ if (coverId != 0 && !allowCoverOnSide(side, new GT_ItemStack(coverId))) dropCover(side, side, true);
+ }
+ }
+
+ protected void updateCoverBehavior() {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (coverInfo.isValid()) coverInfo.updateCoverBehavior();
+ }
+ }
+
+ @Override
+ public void issueCoverUpdate(ForgeDirection side) {
+ // If we've got a null worldObj we're getting called as a part of readingNBT from a non tickable MultiTileEntity
+ // on chunk load before the world is set, so we'll want to send a cover update.
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (worldObj == null || (isServerSide() && coverInfo.isDataNeededOnClient())) coverInfo.setNeedsUpdate(true);
+ }
+
+ public final ITexture getCoverTexture(ForgeDirection side) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (!coverInfo.isValid()) return null;
+ if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x1) != 0) {
+ return Textures.BlockIcons.HIDDEN_TEXTURE[0]; // See through
+ }
+ final ITexture coverTexture = (!(this instanceof BaseMetaPipeEntity)) ? coverInfo.getSpecialCoverFGTexture()
+ : coverInfo.getSpecialCoverTexture();
+
+ return coverTexture != null ? coverTexture : GregTech_API.sCovers.get(new GT_ItemStack(getCoverIDAtSide(side)));
+ }
+
+ protected void requestCoverDataIfNeeded() {
+ if (worldObj == null || !worldObj.isRemote) return;
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (coverInfo.isDataNeededOnClient()) NW.sendToServer(new GT_Packet_RequestCoverData(coverInfo, this));
+ }
+ }
+
+ @Override
+ public void setCoverIdAndDataAtSide(ForgeDirection side, int aId, ISerializableObject aData) {
+ if (setCoverIDAtSideNoUpdate(side, aId, aData)) {
+ issueCoverUpdate(side);
+ issueBlockUpdate();
+ }
+ }
+
+ @Override
+ public void setCoverIDAtSide(ForgeDirection side, int aID) {
+ setCoverIdAndDataAtSide(side, aID, null);
+ }
+
+ @Override
+ public boolean setCoverIDAtSideNoUpdate(ForgeDirection side, int aID) {
+ return setCoverIDAtSideNoUpdate(side, aID, null);
+ }
+
+ public boolean setCoverIDAtSideNoUpdate(ForgeDirection side, int aID, ISerializableObject aData) {
+ final CoverInfo oldCoverInfo = getCoverInfoAtSide(side);
+ if (side != ForgeDirection.UNKNOWN && oldCoverInfo.getCoverID() != aID) {
+ if (aID == 0 && isClientSide()) oldCoverInfo.onDropped();
+ setCoverInfoAtSide(side, new CoverInfo(side, aID, this, aData));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ @Deprecated
+ public void setCoverDataAtSide(ForgeDirection side, int aData) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (coverInfo.isValid() && coverInfo.getCoverData() instanceof ISerializableObject.LegacyCoverData)
+ coverInfo.setCoverData(new ISerializableObject.LegacyCoverData(aData));
+ }
+
+ @Override
+ public void setCoverDataAtSide(ForgeDirection side, ISerializableObject aData) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (coverInfo.isValid() && coverInfo.getCoverBehavior()
+ .cast(aData) != null) coverInfo.setCoverData(aData);
+ }
+
+ @Override
+ @Deprecated
+ public GT_CoverBehavior getCoverBehaviorAtSide(ForgeDirection side) {
+ final GT_CoverBehaviorBase<?> behavior = getCoverInfoAtSide(side).getCoverBehavior();
+ if (behavior instanceof GT_CoverBehavior) return (GT_CoverBehavior) behavior;
+ return GregTech_API.sNoBehavior;
+ }
+
+ @Override
+ public void setCoverItemAtSide(ForgeDirection side, ItemStack aCover) {
+ GregTech_API.getCoverBehaviorNew(aCover)
+ .placeCover(side, aCover, this);
+ }
+
+ @Override
+ public int getCoverIDAtSide(ForgeDirection side) {
+ return getCoverInfoAtSide(side).getCoverID();
+ }
+
+ @Override
+ public ItemStack getCoverItemAtSide(ForgeDirection side) {
+ return getCoverInfoAtSide(side).getDisplayStack();
+ }
+
+ @Override
+ public boolean canPlaceCoverIDAtSide(ForgeDirection side, int aID) {
+ return getCoverIDAtSide(side) == 0;
+ }
+
+ @Override
+ public boolean canPlaceCoverItemAtSide(ForgeDirection side, ItemStack aCover) {
+ return getCoverIDAtSide(side) == 0;
+ }
+
+ @Override
+ @Deprecated
+ public int getCoverDataAtSide(ForgeDirection side) {
+ final ISerializableObject coverData = getCoverInfoAtSide(side).getCoverData();
+ if (coverData instanceof ISerializableObject.LegacyCoverData) {
+ return ((ISerializableObject.LegacyCoverData) coverData).get();
+ }
+ return 0;
+ }
+
+ @Override
+ public ISerializableObject getComplexCoverDataAtSide(ForgeDirection side) {
+ return getCoverInfoAtSide(side).getCoverData();
+ }
+
+ @Override
+ public GT_CoverBehaviorBase<?> getCoverBehaviorAtSideNew(ForgeDirection side) {
+ return getCoverInfoAtSide(side).getCoverBehavior();
+ }
+
+ public final void setCoverInfoAtSide(ForgeDirection side, CoverInfo coverInfo) {
+ if (side != ForgeDirection.UNKNOWN) {
+ coverInfos[side.ordinal()] = coverInfo;
+
+ validCoversMask &= (byte) ~side.flag;
+ if (coverInfo.isValid()) validCoversMask |= side.flag;
+ }
+ }
+
+ @Override
+ public final CoverInfo getCoverInfoAtSide(ForgeDirection side) {
+ final int ordinalSide = side.ordinal();
+ if (side != ForgeDirection.UNKNOWN) {
+ CoverInfo coverInfo = coverInfos[ordinalSide];
+ if (coverInfo == null) coverInfo = (coverInfos[ordinalSide] = new CoverInfo(side, this));
+ return coverInfo;
+ }
+ return CoverInfo.EMPTY_INFO;
+ }
+
+ public void clearCoverInfoAtSide(ForgeDirection side) {
+ if (side != ForgeDirection.UNKNOWN) {
+ setCoverIDAtSide(side, 0);
+ }
+ }
+
+ @Override
+ public boolean dropCover(ForgeDirection side, ForgeDirection droppedSide, boolean aForced) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (!coverInfo.isValid()) return false;
+ if (!coverInfo.onCoverRemoval(aForced) && !aForced) return false;
+ final ItemStack tStack = coverInfo.getDrop();
+ if (tStack != null) {
+ coverInfo.onDropped();
+ final EntityItem tEntity = new EntityItem(
+ worldObj,
+ getOffsetX(droppedSide, 1) + 0.5,
+ getOffsetY(droppedSide, 1) + 0.5,
+ getOffsetZ(droppedSide, 1) + 0.5,
+ tStack);
+ tEntity.motionX = 0;
+ tEntity.motionY = 0;
+ tEntity.motionZ = 0;
+ worldObj.spawnEntityInWorld(tEntity);
+ }
+ clearCoverInfoAtSide(side);
+ updateOutputRedstoneSignal(side);
+
+ return true;
+ }
+
+ protected void onBaseTEDestroyed() {
+ for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (coverInfo.isValid()) coverInfo.onBaseTEDestroyed();
+ }
+ }
+
+ @Override
+ public void setOutputRedstoneSignal(ForgeDirection side, byte strength) {
+ final byte cappedStrength = (byte) Math.min(Math.max(0, strength), 15);
+ if (side == ForgeDirection.UNKNOWN) return;
+
+ final int ordinalSide = side.ordinal();
+ if (mSidedRedstone[ordinalSide] != cappedStrength || (mStrongRedstone & (1 << ordinalSide)) > 0) {
+ mSidedRedstone[ordinalSide] = cappedStrength;
+ issueBlockUpdate();
+ }
+ }
+
+ @Override
+ public void setStrongOutputRedstoneSignal(ForgeDirection side, byte strength) {
+ mStrongRedstone |= (byte) side.flag;
+ setOutputRedstoneSignal(side, strength);
+ }
+
+ @Override
+ public void setInternalOutputRedstoneSignal(ForgeDirection side, byte aStrength) {
+ if (!getCoverBehaviorAtSideNew(side)
+ .manipulatesSidedRedstoneOutput(side, getCoverIDAtSide(side), getComplexCoverDataAtSide(side), this))
+ setOutputRedstoneSignal(side, aStrength);
+ }
+
+ @Override
+ public boolean getRedstone() {
+ return Arrays.stream(ForgeDirection.VALID_DIRECTIONS)
+ .anyMatch(this::getRedstone);
+ }
+
+ @Override
+ public boolean getRedstone(ForgeDirection side) {
+ return getInternalInputRedstoneSignal(side) > 0;
+ }
+
+ @Override
+ public byte getStrongestRedstone() {
+ return Arrays.stream(ForgeDirection.VALID_DIRECTIONS)
+ .map(this::getInternalInputRedstoneSignal)
+ .max(Comparator.comparing(Byte::valueOf))
+ .orElse((byte) 0);
+ }
+
+ @Override
+ public byte getStrongOutputRedstoneSignal(ForgeDirection side) {
+ final int ordinalSide = side.ordinal();
+ return side != ForgeDirection.UNKNOWN && (mStrongRedstone & (1 << ordinalSide)) != 0
+ ? (byte) (mSidedRedstone[ordinalSide] & 15)
+ : 0;
+ }
+
+ @Override
+ public void setGenericRedstoneOutput(boolean aOnOff) {
+ mRedstone = aOnOff;
+ }
+
+ @Override
+ public byte getInternalInputRedstoneSignal(ForgeDirection side) {
+ return (byte) (getCoverBehaviorAtSideNew(side).getRedstoneInput(
+ side,
+ getInputRedstoneSignal(side),
+ getCoverIDAtSide(side),
+ getComplexCoverDataAtSide(side),
+ this) & 15);
+ }
+
+ @Override
+ public byte getInputRedstoneSignal(ForgeDirection side) {
+ return (byte) (worldObj
+ .getIndirectPowerLevelTo(getOffsetX(side, 1), getOffsetY(side, 1), getOffsetZ(side, 1), side.ordinal())
+ & 15);
+ }
+
+ @Override
+ public byte getOutputRedstoneSignal(ForgeDirection side) {
+ return getCoverBehaviorAtSideNew(side)
+ .manipulatesSidedRedstoneOutput(side, getCoverIDAtSide(side), getComplexCoverDataAtSide(side), this)
+ ? mSidedRedstone[side.ordinal()]
+ : getGeneralRS(side);
+ }
+
+ protected void updateOutputRedstoneSignal(ForgeDirection side) {
+ setOutputRedstoneSignal(side, (byte) 0);
+ }
+
+ @Override
+ public void receiveCoverData(ForgeDirection coverSide, int aCoverID, int aCoverData) {
+ if (coverSide == ForgeDirection.UNKNOWN) return;
+ final CoverInfo oldCoverInfo = getCoverInfoAtSide(coverSide);
+ if (!oldCoverInfo.isValid()) return;
+
+ setCoverIDAtSideNoUpdate(coverSide, aCoverID);
+ setCoverDataAtSide(coverSide, aCoverData);
+ }
+
+ @Override
+ public void receiveCoverData(ForgeDirection coverSide, int aCoverID, ISerializableObject aCoverData,
+ EntityPlayerMP aPlayer) {
+ if (coverSide == ForgeDirection.UNKNOWN) return;
+
+ final CoverInfo oldCoverInfo = getCoverInfoAtSide(coverSide);
+
+ if (!oldCoverInfo.isValid()) return;
+ oldCoverInfo.preDataChanged(aCoverID, aCoverData);
+ setCoverIDAtSideNoUpdate(coverSide, aCoverID, aCoverData);
+ setCoverDataAtSide(coverSide, aCoverData);
+
+ if (isClientSide()) {
+ getCoverInfoAtSide(coverSide).onDataChanged();
+ }
+ }
+
+ protected void sendCoverDataIfNeeded() {
+ if (worldObj == null || worldObj.isRemote) return;
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (coverInfo.needsUpdate()) {
+ NW.sendPacketToAllPlayersInRange(
+ worldObj,
+ new GT_Packet_SendCoverData(coverInfo, this),
+ xCoord,
+ zCoord);
+ coverInfo.setNeedsUpdate(false);
+ }
+ }
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ final NBTTagCompound tag = accessor.getNBTData();
+ final ForgeDirection currentFacing = accessor.getSide();
+
+ final NBTTagList tList = tag.getTagList(GT_Values.NBT.COVERS, 10);
+ for (byte i = 0; i < tList.tagCount(); i++) {
+ final NBTTagCompound tNBT = tList.getCompoundTagAt(i);
+ final CoverInfo coverInfo = new CoverInfo(this, tNBT);
+ if (!coverInfo.isValid() || coverInfo.getCoverBehavior() == GregTech_API.sNoBehavior) continue;
+
+ final ItemStack coverStack = coverInfo.getDisplayStack();
+ if (coverStack != null) {
+ currentTip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.cover",
+ currentFacing == coverInfo.getSide()
+ ? StatCollector.translateToLocal("GT5U.waila.cover.current_facing")
+ : StatCollector.translateToLocal(
+ "GT5U.interface.coverTabs." + coverInfo.getSide()
+ .toString()
+ .toLowerCase()),
+ coverStack.getDisplayName()));
+ final String behaviorDesc = coverInfo.getBehaviorDescription();
+ if (!Objects.equals(behaviorDesc, E)) currentTip.add(behaviorDesc);
+ }
+ }
+
+ // No super implementation
+ // super.getWailaBody(itemStack, currenttip, accessor, config);
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ // No super implementation
+ // super.getWailaNBTData(player, tile, tag, world, x, y, z);
+
+ // While we have some cover data on the client (enough to render it); we don't have all the information we want,
+ // such as details on the fluid filter, so send it all here.
+ writeCoverNBT(tag, false);
+ }
+
+ /**
+ * Add installed cover information, generally called from ItemBlock
+ *
+ * @param aNBT - NBTTagCompound from the stack
+ * @param aList - List to add the information to
+ */
+ public static void addInstalledCoversInformation(NBTTagCompound aNBT, List<String> aList) {
+ if (aNBT == null || aList == null) return;
+ final NBTTagList tList = aNBT.getTagList(GT_Values.NBT.COVERS, 10);
+ for (byte i = 0; i < tList.tagCount(); i++) {
+ final NBTTagCompound tNBT = tList.getCompoundTagAt(i);
+ final CoverInfo coverInfo = new CoverInfo(null, tNBT);
+ if (!coverInfo.isValid() || coverInfo.getCoverBehavior() == GregTech_API.sNoBehavior) continue;
+
+ final ItemStack coverStack = coverInfo.getDisplayStack();
+ if (coverStack != null) {
+ aList.add(
+ String.format(
+ "Cover on %s side: %s",
+ getTranslation(
+ FACES[coverInfo.getSide()
+ .ordinal()]),
+ coverStack.getDisplayName()));
+ }
+ }
+
+ if (aNBT.hasKey("mCoverSides")) {
+ final int[] mCoverSides = aNBT.getIntArray("mCoverSides");
+ if (mCoverSides != null && mCoverSides.length == 6) {
+ for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) {
+ final int i = tSide.ordinal();
+ final int coverId = mCoverSides[i];
+ if (coverId == 0) continue;
+ final GT_CoverBehaviorBase<?> behavior = GregTech_API.getCoverBehaviorNew(coverId);
+ if (behavior == null || behavior == GregTech_API.sNoBehavior) continue;
+ if (!aNBT.hasKey(CoverableTileEntity.COVER_DATA_NBT_KEYS[i])) continue;
+ final ISerializableObject dataObject = behavior
+ .createDataObject(aNBT.getTag(CoverableTileEntity.COVER_DATA_NBT_KEYS[i]));
+ final ItemStack coverStack = behavior.getDisplayStack(coverId, dataObject);
+ if (coverStack != null) {
+ aList.add(
+ String
+ .format("Cover on %s side: %s", getTranslation(FACES[i]), coverStack.getDisplayName()));
+ }
+ }
+ }
+ }
+ }
+
+ protected ModularWindow createCoverWindow(EntityPlayer player, ForgeDirection side) {
+ return getCoverInfoAtSide(side).createWindow(player);
+ }
+
+ protected static final int COVER_WINDOW_ID_START = 1;
+
+ @Override
+ public void addCoverTabs(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ final int COVER_TAB_LEFT = -16, COVER_TAB_TOP = 1, COVER_TAB_HEIGHT = 20, COVER_TAB_WIDTH = 18,
+ COVER_TAB_SPACING = 2, ICON_SIZE = 16;
+ final boolean flipHorizontally = GT_Mod.gregtechproxy.mCoverTabsFlipped;
+
+ final Column columnWidget = new Column();
+ builder.widget(columnWidget);
+ final int xPos = flipHorizontally ? (getGUIWidth() - COVER_TAB_LEFT - COVER_TAB_WIDTH) : COVER_TAB_LEFT;
+ if (GT_Mod.gregtechproxy.mCoverTabsVisible) {
+ columnWidget.setPos(xPos, COVER_TAB_TOP)
+ .setEnabled(
+ widget -> ((Column) widget).getChildren()
+ .stream()
+ .anyMatch(Widget::isEnabled));
+ } else {
+ columnWidget.setEnabled(false);
+ }
+ columnWidget.setAlignment(MainAxisAlignment.SPACE_BETWEEN)
+ .setSpace(COVER_TAB_SPACING);
+
+ for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
+ buildContext.addSyncedWindow(
+ direction.ordinal() + COVER_WINDOW_ID_START,
+ player -> createCoverWindow(player, direction));
+ columnWidget.addChild(new MultiChildWidget().addChild(new ButtonWidget() {
+
+ @Override
+ public IDrawable[] getBackground() {
+ final List<IDrawable> backgrounds = new ArrayList<>();
+ final GUITextureSet tabIconSet = getGUITextureSet();
+
+ if (getCoverBehaviorAtSideNew(direction).hasCoverGUI()) {
+ if (isHovering()) {
+ backgrounds.add(
+ flipHorizontally ? tabIconSet.getCoverTabHighlightFlipped()
+ : tabIconSet.getCoverTabHighlight());
+ } else {
+ backgrounds.add(
+ flipHorizontally ? tabIconSet.getCoverTabNormalFlipped()
+ : tabIconSet.getCoverTabNormal());
+ }
+ } else {
+ backgrounds.add(
+ flipHorizontally ? tabIconSet.getCoverTabDisabledFlipped()
+ : tabIconSet.getCoverTabDisabled());
+ }
+ return backgrounds.toArray(new IDrawable[] {});
+ }
+ }.setOnClick((clickData, widget) -> onTabClicked(clickData, widget, direction))
+ .dynamicTooltip(() -> getCoverTabTooltip(direction, clientCoverData.get(direction)))
+ .setSize(COVER_TAB_WIDTH, COVER_TAB_HEIGHT))
+ .addChild(
+ new ItemDrawable(() -> getCoverItemAtSide(direction)).asWidget()
+ .setPos(
+ (COVER_TAB_WIDTH - ICON_SIZE) / 2 + (flipHorizontally ? -1 : 1),
+ (COVER_TAB_HEIGHT - ICON_SIZE) / 2))
+ .setEnabled(widget -> getCoverItemAtSide(direction) != null));
+ }
+
+ builder.widget(
+ new FakeSyncWidget<>(
+ this::collectCoverData,
+ data -> clientCoverData = data,
+ this::writeClientCoverData,
+ this::readClientCoverData));
+ }
+
+ @SideOnly(Side.CLIENT)
+ protected List<String> getCoverTabTooltip(ForgeDirection side, ISerializableObject coverData) {
+ final String[] SIDE_TOOLTIPS = new String[] { "GT5U.interface.coverTabs.down", "GT5U.interface.coverTabs.up",
+ "GT5U.interface.coverTabs.north", "GT5U.interface.coverTabs.south", "GT5U.interface.coverTabs.west",
+ "GT5U.interface.coverTabs.east" };
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ final ItemStack coverItem = coverInfo.getDisplayStack();
+ if (coverItem == null) return Collections.emptyList();
+ final boolean coverHasGUI = coverInfo.hasCoverGUI();
+
+ final List<String> tooltip = coverItem.getTooltip(Minecraft.getMinecraft().thePlayer, true);
+ final ImmutableList.Builder<String> builder = ImmutableList.builder();
+ builder.add(
+ (coverHasGUI ? EnumChatFormatting.UNDERLINE : EnumChatFormatting.DARK_GRAY)
+ + StatCollector.translateToLocal(SIDE_TOOLTIPS[side.ordinal()])
+ + (coverHasGUI ? EnumChatFormatting.RESET + ": " : ": " + EnumChatFormatting.RESET)
+ + tooltip.get(0));
+ builder.addAll(coverInfo.getAdditionalTooltip(coverData));
+ builder.addAll(
+ IntStream.range(1, tooltip.size())
+ .mapToObj(index -> EnumChatFormatting.GRAY + tooltip.get(index))
+ .iterator());
+ return builder.build();
+ }
+
+ protected void onTabClicked(Widget.ClickData ignoredClickData, Widget widget, ForgeDirection side) {
+ if (isClientSide()) return;
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (coverInfo.useModularUI()) {
+ widget.getContext()
+ .openSyncedWindow(side.ordinal() + COVER_WINDOW_ID_START);
+ } else {
+ final GT_Packet_TileEntityCoverGUI packet = new GT_Packet_TileEntityCoverGUI(
+ coverInfo,
+ getWorld().provider.dimensionId,
+ widget.getContext()
+ .getPlayer()
+ .getEntityId(),
+ 0);
+ GT_Values.NW.sendToPlayer(
+ packet,
+ (EntityPlayerMP) widget.getContext()
+ .getPlayer());
+ }
+ }
+
+ @NotNull
+ private Map<ForgeDirection, ISerializableObject> collectCoverData() {
+ final ImmutableMap.Builder<ForgeDirection, ISerializableObject> builder = ImmutableMap.builder();
+ for (final ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(direction);
+ if (coverInfo.isValid()) {
+ builder.put(direction, coverInfo.getCoverData());
+ }
+ }
+
+ return builder.build();
+ }
+
+ private void writeClientCoverData(@NotNull PacketBuffer buffer,
+ @NotNull Map<ForgeDirection, ISerializableObject> dataMap) {
+ buffer.writeInt(dataMap.size());
+ dataMap.forEach((direction, serializableObject) -> {
+ final ByteBuf individualBuffer = Unpooled.buffer();
+ serializableObject.writeToByteBuf(individualBuffer);
+
+ buffer.writeByte(direction.ordinal());
+ buffer.writeInt(individualBuffer.array().length);
+ buffer.writeBytes(individualBuffer.array());
+ });
+ }
+
+ @NotNull
+ private Map<ForgeDirection, ISerializableObject> readClientCoverData(@NotNull PacketBuffer buffer) {
+ ImmutableMap.Builder<ForgeDirection, ISerializableObject> builder = ImmutableMap.builder();
+ final int size = buffer.readInt();
+ for (int i = 0; i < size; i++) {
+ final ForgeDirection direction = ForgeDirection.getOrientation(buffer.readByte());
+ final int length = buffer.readInt();
+ final byte[] object = buffer.readBytes(length)
+ .array();
+
+ // noinspection UnstableApiUsage
+ builder.put(
+ direction,
+ getCoverInfoAtSide(direction).getCoverBehavior()
+ .createDataObject()
+ .readFromPacket(ByteStreams.newDataInput(object), null));
+ }
+
+ return builder.build();
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/GregTechTileClientEvents.java b/src/main/java/gregtech/api/metatileentity/GregTechTileClientEvents.java
new file mode 100644
index 0000000000..2f560c5f15
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/GregTechTileClientEvents.java
@@ -0,0 +1,13 @@
+package gregtech.api.metatileentity;
+
+public final class GregTechTileClientEvents {
+
+ public static final byte CHANGE_COMMON_DATA = 0;
+ public static final byte CHANGE_CUSTOM_DATA = 1;
+ public static final byte CHANGE_COLOR = 2;
+ public static final byte CHANGE_REDSTONE_OUTPUT = 3;
+ public static final byte DO_SOUND = 4;
+ public static final byte START_SOUND_LOOP = 5;
+ public static final byte STOP_SOUND_LOOP = 6;
+ public static final byte CHANGE_LIGHT = 7;
+}
diff --git a/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java
new file mode 100644
index 0000000000..a7e05355a4
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java
@@ -0,0 +1,1029 @@
+package gregtech.api.metatileentity;
+
+import static gregtech.api.enums.GT_Values.GT;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Objects;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+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.entity.player.InventoryPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gnu.trove.list.TIntList;
+import gnu.trove.list.array.TIntArrayList;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IConnectable;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IColoredTileEntity;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Util;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.api.util.WorldSpawnedEventBuilder;
+import gregtech.common.GT_Client;
+import gregtech.common.covers.CoverInfo;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * Extend this Class to add a new MetaPipe Call the Constructor with the desired ID at the load-phase (not preload and
+ * also not postload!) Implement the newMetaEntity-Method to return a new ready instance of your MetaTileEntity
+ * <p/>
+ * Call the Constructor like the following example inside the Load Phase, to register it. "new
+ * GT_MetaTileEntity_E_Furnace(54, "GT_E_Furnace", "Automatic E-Furnace");"
+ */
+public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable {
+
+ /**
+ * The Inventory of the MetaTileEntity. Amount of Slots can be larger than 256. HAYO!
+ */
+ public final ItemStack[] mInventory;
+ /**
+ * This variable tells, which directions the Block is connected to. It is a Bitmask.
+ */
+ public byte mConnections = 0;
+
+ protected boolean mCheckConnections = false;
+ /**
+ * Only assigned for the MetaTileEntity in the List! Also only used to get the localized Name for the ItemStack and
+ * for getInvName.
+ */
+ public String mName;
+
+ public boolean doTickProfilingInThisTick = true;
+ /**
+ * accessibility to this Field is no longer given, see below
+ */
+ private IGregTechTileEntity mBaseMetaTileEntity;
+
+ /**
+ * This registers your Machine at the List. Use only ID's larger than 2048 - the ones lower are reserved by GT.
+ * See also the list in the API package - it has a description that contains all the reservations.
+ * <p>
+ * The constructor can be overloaded as follows:
+ * <blockquote>
+ *
+ * <pre>
+ *
+ * public GT_MetaTileEntity_EBench(int id, String name, String nameRegional) {
+ * super(id, name, nameRegional);
+ * }
+ * </pre>
+ *
+ * </blockquote>
+ *
+ * @param aID the machine ID
+ */
+ public MetaPipeEntity(int aID, String aBasicName, String aRegionalName, int aInvSlotCount) {
+ this(aID, aBasicName, aRegionalName, aInvSlotCount, true);
+ }
+
+ public MetaPipeEntity(int aID, String aBasicName, String aRegionalName, int aInvSlotCount, boolean aAddInfo) {
+ if (GregTech_API.sPostloadStarted || !GregTech_API.sPreloadStarted)
+ throw new IllegalAccessError("This Constructor has to be called in the load Phase");
+ if (GregTech_API.METATILEENTITIES[aID] == null) {
+ GregTech_API.METATILEENTITIES[aID] = this;
+ } else {
+ throw new IllegalArgumentException("MetaMachine-Slot Nr. " + aID + " is already occupied!");
+ }
+ mName = aBasicName.replaceAll(" ", "_")
+ .toLowerCase(Locale.ENGLISH);
+ setBaseMetaTileEntity(new BaseMetaPipeEntity());
+ getBaseMetaTileEntity().setMetaTileID((short) aID);
+ GT_LanguageManager.addStringLocalization("gt.blockmachines." + mName + ".name", aRegionalName);
+ mInventory = new ItemStack[aInvSlotCount];
+
+ if (aAddInfo && GT.isClientSide()) {
+ addInfo(aID);
+ }
+ }
+
+ protected final void addInfo(int aID) {
+ if (!GT.isClientSide()) return;
+
+ ItemStack tStack = new ItemStack(GregTech_API.sBlockMachines, 1, aID);
+ Objects.requireNonNull(tStack.getItem())
+ .addInformation(tStack, null, new ArrayList<>(), true);
+ }
+
+ /**
+ * This is the normal Constructor.
+ */
+ public MetaPipeEntity(String aName, int aInvSlotCount) {
+ mInventory = new ItemStack[aInvSlotCount];
+ mName = aName;
+ }
+
+ /**
+ * For Pipe Rendering
+ */
+ public abstract float getThickNess();
+
+ /**
+ * For Pipe Rendering
+ */
+ public abstract boolean renderInside(ForgeDirection side);
+
+ public boolean isDisplaySecondaryDescription() {
+ return false;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean active, boolean redstoneLevel) {
+ return Textures.BlockIcons.ERROR_RENDERING;
+ }
+
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, int connections,
+ int colorIndex, boolean active, boolean redstoneLevel) {
+ return Textures.BlockIcons.ERROR_RENDERING;
+ }
+
+ @Override
+ public IGregTechTileEntity getBaseMetaTileEntity() {
+ return mBaseMetaTileEntity;
+ }
+
+ @Override
+ public void setBaseMetaTileEntity(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (mBaseMetaTileEntity != null && aBaseMetaTileEntity == null) {
+ mBaseMetaTileEntity.getMetaTileEntity()
+ .inValidate();
+ mBaseMetaTileEntity.setMetaTileEntity(null);
+ }
+ mBaseMetaTileEntity = aBaseMetaTileEntity;
+ if (mBaseMetaTileEntity != null) {
+ mBaseMetaTileEntity.setMetaTileEntity(this);
+ }
+ }
+
+ @Override
+ public ItemStack getStackForm(long aAmount) {
+ return new ItemStack(GregTech_API.sBlockMachines, (int) aAmount, getBaseMetaTileEntity().getMetaTileID());
+ }
+
+ public boolean isCoverOnSide(BaseMetaPipeEntity aPipe, EntityLivingBase aEntity) {
+ ForgeDirection side = ForgeDirection.UNKNOWN;
+ double difference = aEntity.posY - (double) aPipe.yCoord;
+ if (difference > 0.6 && difference < 0.99) {
+ side = ForgeDirection.UP;
+ }
+ if (difference < -1.5 && difference > -1.99) {
+ side = ForgeDirection.DOWN;
+ }
+ difference = aEntity.posZ - (double) aPipe.zCoord;
+ if (difference < -0.05 && difference > -0.4) {
+ side = ForgeDirection.NORTH;
+ }
+ if (difference > 1.05 && difference < 1.4) {
+ side = ForgeDirection.SOUTH;
+ }
+ difference = aEntity.posX - (double) aPipe.xCoord;
+ if (difference < -0.05 && difference > -0.4) {
+ side = ForgeDirection.WEST;
+ }
+ if (difference > 1.05 && difference < 1.4) {
+ side = ForgeDirection.EAST;
+ }
+ boolean tCovered = side != ForgeDirection.UNKNOWN && mBaseMetaTileEntity.getCoverIDAtSide(side) > 0;
+ if (isConnectedAtSide(side)) {
+ tCovered = true;
+ }
+ // GT_FML_LOGGER.info("Cover: "+mBaseMetaTileEntity.getCoverIDAtSide(aSide));
+ // toDo: filter cover ids that actually protect against temperature (rubber/plastic maybe?, more like asbestos)
+ return tCovered;
+ }
+
+ @Override
+ public void onServerStart() {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onWorldSave(File aSaveDirectory) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onWorldLoad(File aSaveDirectory) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onConfigLoad(GT_Config aConfig) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ /* Do nothing */
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ /* Do nothing */
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) {
+ return true;
+ }
+
+ @Deprecated
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ /* Do nothing */
+ }
+
+ @Deprecated
+ public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer,
+ float aX, float aY, float aZ) {
+ return false;
+ }
+
+ @Deprecated
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ return false;
+ }
+
+ @Deprecated
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ return false;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ,
+ ItemStack aTool) {
+ onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, float aX,
+ float aY, float aZ, ItemStack aTool) {
+ return onWrenchRightClick(side, wrenchingSide, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ, ItemStack aTool) {
+ return onWireCutterRightClick(side, wrenchingSide, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ, ItemStack aTool) {
+ return onSolderingToolRightClick(side, wrenchingSide, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public void onExplosion() {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isClientSide() && GT_Client.changeDetected == 4) {
+ /*
+ * Client tick counter that is set to 5 on hiding pipes and covers. It triggers a texture update next client
+ * tick when reaching 4, with provision for 3 more update tasks, spreading client change detection related
+ * work and network traffic on different ticks, until it reaches 0.
+ */
+ aBaseMetaTileEntity.issueTextureUpdate();
+ }
+ }
+
+ @Override
+ public void inValidate() {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onRemoval() {
+ /* Do nothing */
+ }
+
+ @Override
+ public void initDefaultModes(NBTTagCompound aNBT) {
+ /* Do nothing */
+ }
+
+ /**
+ * When a GUI is opened
+ */
+ public void onOpenGUI() {
+ /* Do nothing */
+ }
+
+ /**
+ * When a GUI is closed
+ */
+ public void onCloseGUI() {
+ /* Do nothing */
+ }
+
+ /**
+ * Called when a Player rightclicks the Machine. Sneaky rightclicks are not getting passed to this!
+ */
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ return false;
+ }
+
+ @Override
+ public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onValueUpdate(byte aValue) {
+ /* Do nothing */
+ }
+
+ @Override
+ public byte getUpdateData() {
+ return 0;
+ }
+
+ @Override
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void stopSoundLoop(byte aValue, double aX, double aY, double aZ) {
+ /* Do nothing */
+ }
+
+ @Override
+ public final void sendSound(byte aIndex) {
+ if (!getBaseMetaTileEntity().hasMufflerUpgrade())
+ getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.DO_SOUND, aIndex);
+ }
+
+ @Override
+ public final void sendLoopStart(byte aIndex) {
+ if (!getBaseMetaTileEntity().hasMufflerUpgrade())
+ getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.START_SOUND_LOOP, aIndex);
+ }
+
+ @Override
+ public final void sendLoopEnd(byte aIndex) {
+ if (!getBaseMetaTileEntity().hasMufflerUpgrade())
+ getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.STOP_SOUND_LOOP, aIndex);
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return false;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean shouldDropItemAt(int index) {
+ return true;
+ }
+
+ @Override
+ public boolean setStackToZeroInsteadOfNull(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public ArrayList<String> getSpecialDebugInfo(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer,
+ int aLogLevel, ArrayList<String> aList) {
+ return aList;
+ }
+
+ @Override
+ public boolean isLiquidInput(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isLiquidOutput(ForgeDirection side) {
+ return false;
+ }
+
+ /**
+ * gets the contained Liquid
+ */
+ @Override
+ public FluidStack getFluid() {
+ return null;
+ }
+
+ /**
+ * tries to fill this Tank
+ */
+ @Override
+ public int fill(FluidStack resource, boolean doFill) {
+ return 0;
+ }
+
+ /**
+ * tries to empty this Tank
+ */
+ @Override
+ public FluidStack drain(int maxDrain, boolean doDrain) {
+ return null;
+ }
+
+ /**
+ * Tank pressure
+ */
+ public int getTankPressure() {
+ return 0;
+ }
+
+ /**
+ * Liquid Capacity
+ */
+ @Override
+ public int getCapacity() {
+ return 0;
+ }
+
+ /**
+ * Progress this machine has already made
+ */
+ public int getProgresstime() {
+ return 0;
+ }
+
+ /**
+ * Progress this Machine has to do to produce something
+ */
+ public int maxProgresstime() {
+ return 0;
+ }
+
+ /**
+ * Increases the Progress, returns the overflown Progress.
+ */
+ public int increaseProgress(int aProgress) {
+ return 0;
+ }
+
+ @Override
+ public void onMachineBlockUpdate() {
+ /* Do nothing */
+ }
+
+ @Override
+ public void receiveClientEvent(byte aEventID, byte aValue) {
+ /* Do nothing */
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public byte getComparatorValue(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ public boolean acceptsRotationalEnergy(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean injectRotationalEnergy(ForgeDirection side, long aSpeed, long aEnergy) {
+ return false;
+ }
+
+ @Override
+ public String getSpecialVoltageToolTip() {
+ return null;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return false;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] {};
+ }
+
+ public boolean isDigitalChest() {
+ return false;
+ }
+
+ public ItemStack[] getStoredItemData() {
+ return null;
+ }
+
+ public void setItemCount(int aCount) {
+ /* Do nothing */
+ }
+
+ public int getMaxItemCount() {
+ return 0;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return mInventory.length;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(int slotIndex) {
+ if (slotIndex >= 0 && slotIndex < mInventory.length) return mInventory[slotIndex];
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(int aIndex, ItemStack aStack) {
+ if (aIndex >= 0 && aIndex < mInventory.length) mInventory[aIndex] = aStack;
+ }
+
+ @Override
+ public String getInventoryName() {
+ if (GregTech_API.METATILEENTITIES[getBaseMetaTileEntity().getMetaTileID()] != null)
+ return GregTech_API.METATILEENTITIES[getBaseMetaTileEntity().getMetaTileID()].getMetaName();
+ return "";
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ @Override
+ public boolean isItemValidForSlot(int aIndex, ItemStack aStack) {
+ return getBaseMetaTileEntity().isValidSlot(aIndex);
+ }
+
+ @Override
+ public ItemStack decrStackSize(int aIndex, int aAmount) {
+ ItemStack tStack = getStackInSlot(aIndex), rStack = GT_Utility.copyOrNull(tStack);
+ if (tStack != null) {
+ if (tStack.stackSize <= aAmount) {
+ if (setStackToZeroInsteadOfNull(aIndex)) tStack.stackSize = 0;
+ else setInventorySlotContents(aIndex, null);
+ } else {
+ rStack = tStack.splitStack(aAmount);
+ if (tStack.stackSize == 0 && !setStackToZeroInsteadOfNull(aIndex))
+ setInventorySlotContents(aIndex, null);
+ }
+ }
+ return rStack;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(int ordinalSide) {
+ final TIntList tList = new TIntArrayList();
+ final IGregTechTileEntity tTileEntity = getBaseMetaTileEntity();
+ final CoverInfo tileCoverInfo = tTileEntity.getCoverInfoAtSide(ForgeDirection.getOrientation(ordinalSide));
+ final boolean tSkip = tileCoverInfo.letsItemsIn(-2) || tileCoverInfo.letsItemsOut(-2);
+ for (int i = 0; i < getSizeInventory(); i++) {
+ if (isValidSlot(i) && (tSkip || tileCoverInfo.letsItemsOut(i) || tileCoverInfo.letsItemsIn(i))) {
+ tList.add(i);
+ }
+ }
+ return tList.toArray();
+ }
+
+ @Override
+ public boolean canInsertItem(int slotIndex, ItemStack itemStack, int ordinalSide) {
+ return isValidSlot(slotIndex) && itemStack != null
+ && slotIndex < mInventory.length
+ && (mInventory[slotIndex] == null || GT_Utility.areStacksEqual(itemStack, mInventory[slotIndex]))
+ && allowPutStack(getBaseMetaTileEntity(), slotIndex, ForgeDirection.getOrientation(ordinalSide), itemStack);
+ }
+
+ @Override
+ public boolean canExtractItem(int slotIndex, ItemStack itemStack, int ordinalSide) {
+ return isValidSlot(slotIndex) && itemStack != null
+ && slotIndex < mInventory.length
+ && allowPullStack(
+ getBaseMetaTileEntity(),
+ slotIndex,
+ ForgeDirection.getOrientation(ordinalSide),
+ itemStack);
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection side, Fluid aFluid) {
+ return fill(side, new FluidStack(aFluid, 1), false) == 1;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection side, Fluid aFluid) {
+ return drain(side, new FluidStack(aFluid, 1), false) != null;
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection side) {
+ if (getCapacity() <= 0 && !getBaseMetaTileEntity().hasSteamEngineUpgrade()) return new FluidTankInfo[] {};
+ return new FluidTankInfo[] { getInfo() };
+ }
+
+ public int fill_default(ForgeDirection side, FluidStack aFluid, boolean doFill) {
+ return fill(aFluid, doFill);
+ }
+
+ @Override
+ public int fill(ForgeDirection side, FluidStack aFluid, boolean doFill) {
+ return fill_default(side, aFluid, doFill);
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, FluidStack aFluid, boolean doDrain) {
+ if (getFluid() != null && aFluid != null && getFluid().isFluidEqual(aFluid))
+ return drain(aFluid.amount, doDrain);
+ return null;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, int maxDrain, boolean doDrain) {
+ return drain(maxDrain, doDrain);
+ }
+
+ @Override
+ public int getFluidAmount() {
+ return 0;
+ }
+
+ @Override
+ public FluidTankInfo getInfo() {
+ return new FluidTankInfo(this);
+ }
+
+ @Override
+ public String getMetaName() {
+ return mName;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(int i) {
+ return null;
+ }
+
+ @Override
+ public boolean doTickProfilingMessageDuringThisTick() {
+ return doTickProfilingInThisTick;
+ }
+
+ @Override
+ public boolean isUseableByPlayer(EntityPlayer entityplayer) {
+ return false;
+ }
+
+ @Override
+ public boolean connectsToItemPipe(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public void openInventory() {
+ //
+ }
+
+ @Override
+ public void closeInventory() {
+ //
+ }
+
+ @Override
+ public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
+ return null;
+ }
+
+ @Override
+ public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
+ return null;
+ }
+
+ @Override
+ public float getExplosionResistance(ForgeDirection side) {
+ return (mConnections & IConnectable.HAS_FOAM) != 0 ? 50.0F : 5.0F;
+ }
+
+ @Override
+ public ItemStack[] getRealInventory() {
+ return mInventory;
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return false;
+ }
+
+ @Override
+ public void markDirty() {
+ //
+ }
+
+ @Override
+ public void onColorChangeServer(byte aColor) {
+ setCheckConnections();
+ }
+
+ @Override
+ public void onColorChangeClient(byte aColor) {
+ // Do nothing apparently
+ }
+
+ public void setCheckConnections() {
+ mCheckConnections = true;
+ }
+
+ public long injectEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage) {
+ return 0;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean renderInInventory(Block aBlock, int aMeta, RenderBlocks aRenderer) {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean renderInWorld(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, RenderBlocks aRenderer) {
+ return false;
+ }
+
+ @Override
+ public void doExplosion(long aExplosionPower) {
+ float tStrength = GT_Values.getExplosionPowerForVoltage(aExplosionPower);
+ int tX = getBaseMetaTileEntity().getXCoord(), tY = getBaseMetaTileEntity().getYCoord(),
+ tZ = getBaseMetaTileEntity().getZCoord();
+ World tWorld = getBaseMetaTileEntity().getWorld();
+ tWorld.setBlock(tX, tY, tZ, Blocks.air);
+ if (GregTech_API.sMachineExplosions) {
+ new WorldSpawnedEventBuilder.ExplosionEffectEventBuilder().setStrength(tStrength)
+ .setSmoking(true)
+ .setPosition(tX + 0.5, tY + 0.5, tZ + 0.5)
+ .setWorld(tWorld)
+ .run();
+ }
+ }
+
+ @Override
+ public int getLightOpacity() {
+ return 0;
+ }
+
+ @Override
+ public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB,
+ List<AxisAlignedBB> outputAABB, Entity collider) {
+ AxisAlignedBB axisalignedbb1 = getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ if (axisalignedbb1 != null && inputAABB.intersectsWith(axisalignedbb1)) outputAABB.add(axisalignedbb1);
+ }
+
+ @Override
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1);
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider) {
+ //
+ }
+
+ @Override
+ public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ //
+ }
+
+ @Override
+ public boolean allowGeneralRedstoneOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean hasAlternativeModeText() {
+ return false;
+ }
+
+ @Override
+ public String getAlternativeModeText() {
+ return "";
+ }
+
+ @Deprecated
+ public String trans(String aKey, String aEnglish) {
+ return GT_Utility.trans(aKey, aEnglish);
+ }
+
+ protected boolean connectableColor(TileEntity tTileEntity) {
+ // Determine if two entities are connectable based on their colorization:
+ // Uncolored can connect to anything
+ // If both are colored they must be the same color to connect.
+ if (tTileEntity instanceof IColoredTileEntity) {
+ if (getBaseMetaTileEntity().getColorization() >= 0) {
+ final byte tColor = ((IColoredTileEntity) tTileEntity).getColorization();
+ return tColor < 0 || tColor == getBaseMetaTileEntity().getColorization();
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public int connect(ForgeDirection side) {
+ if (side == ForgeDirection.UNKNOWN) return 0;
+
+ final ForgeDirection oppositeSide = side.getOpposite();
+ final IGregTechTileEntity baseMetaTile = getBaseMetaTileEntity();
+ if (baseMetaTile == null || !baseMetaTile.isServerSide()) return 0;
+
+ final CoverInfo coverInfo = baseMetaTile.getCoverInfoAtSide(side);
+
+ final boolean alwaysLookConnected = coverInfo.alwaysLookConnected();
+ final boolean letsIn = letsIn(coverInfo);
+ final boolean letsOut = letsOut(coverInfo);
+
+ // Careful - tTileEntity might be null, and that's ok -- so handle it
+ final TileEntity tTileEntity = baseMetaTile.getTileEntityAtSide(side);
+ if (!connectableColor(tTileEntity)) return 0;
+
+ if ((alwaysLookConnected || letsIn || letsOut)) {
+ // Are we trying to connect to a pipe? let's do it!
+ final IMetaTileEntity tPipe = tTileEntity instanceof IGregTechTileEntity
+ ? ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()
+ : null;
+ if (getClass().isInstance(tPipe) || (tPipe != null && tPipe.getClass()
+ .isInstance(this))) {
+ connectAtSide(side);
+ if (!((IConnectable) tPipe).isConnectedAtSide(oppositeSide)) {
+ // Make sure pipes all get together -- connect back to us if we're connecting to a pipe
+ ((IConnectable) tPipe).connect(oppositeSide);
+ }
+ return 1;
+ } else if ((getGT6StyleConnection() && baseMetaTile.getAirAtSide(side)) || canConnect(side, tTileEntity)) {
+ // Allow open connections to Air, if the GT6 style pipe/cables are enabled, so that it'll connect to
+ // the next block placed down next to it
+ connectAtSide(side);
+ return 1;
+ }
+ if (!baseMetaTile.getWorld()
+ .getChunkProvider()
+ .chunkExists(baseMetaTile.getOffsetX(side, 1) >> 4, baseMetaTile.getOffsetZ(side, 1) >> 4)) {
+ // Target chunk unloaded
+ return -1;
+ }
+ }
+ return 0;
+ }
+
+ protected void checkConnections() {
+ // Verify connections around us. If GT6 style cables are not enabled then revert to old behavior and try
+ // connecting to everything around us
+ for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if ((!getGT6StyleConnection() || isConnectedAtSide(side)) && connect(side) == 0) {
+ disconnect(side);
+ }
+ }
+ mCheckConnections = false;
+ }
+
+ private void connectAtSide(ForgeDirection side) {
+ mConnections |= side.flag;
+ }
+
+ @Override
+ public void disconnect(ForgeDirection side) {
+ if (side == ForgeDirection.UNKNOWN) return;
+ mConnections &= ~side.flag;
+ final ForgeDirection oppositeSide = side.getOpposite();
+ IGregTechTileEntity tTileEntity = getBaseMetaTileEntity().getIGregTechTileEntityAtSide(side);
+ IMetaTileEntity tPipe = tTileEntity == null ? null : tTileEntity.getMetaTileEntity();
+ if ((this.getClass()
+ .isInstance(tPipe)
+ || (tPipe != null && tPipe.getClass()
+ .isInstance(this)))
+ && ((IConnectable) tPipe).isConnectedAtSide(oppositeSide)) {
+ ((IConnectable) tPipe).disconnect(oppositeSide);
+ }
+ }
+
+ @Override
+ public boolean isConnectedAtSide(ForgeDirection sideDirection) {
+ return (mConnections & sideDirection.flag) != 0;
+ }
+
+ public boolean letsIn(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ public boolean letsIn(CoverInfo coverInfo) {
+ return false;
+ }
+
+ public boolean letsOut(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ public boolean letsOut(CoverInfo coverInfo) {
+ return false;
+ }
+
+ public boolean letsIn(GT_CoverBehaviorBase<?> coverBehavior, ForgeDirection side, int aCoverID,
+ ISerializableObject aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ public boolean letsOut(GT_CoverBehaviorBase<?> coverBehavior, ForgeDirection side, int aCoverID,
+ ISerializableObject aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ public boolean canConnect(ForgeDirection side, TileEntity tTileEntity) {
+ return false;
+ }
+
+ public boolean getGT6StyleConnection() {
+ return false;
+ }
+
+ @Override
+ public boolean shouldJoinIc2Enet() {
+ return false;
+ }
+
+ @Override
+ public boolean isMachineBlockUpdateRecursive() {
+ return false;
+ }
+
+ public void reloadLocks() {}
+
+ @Override
+ public int getGUIColorization() {
+ Dyes dye = Dyes.dyeWhite;
+ if (GregTech_API.sColoredGUI) {
+ if (GregTech_API.sMachineMetalGUI) {
+ dye = Dyes.MACHINE_METAL;
+ } else if (getBaseMetaTileEntity() != null) {
+ dye = Dyes.getDyeFromIndex(getBaseMetaTileEntity().getColorization());
+ }
+ }
+ return GT_Util.getRGBInt(dye.getRGBA());
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java
new file mode 100644
index 0000000000..0a56f8467f
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java
@@ -0,0 +1,1326 @@
+package gregtech.api.metatileentity;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.function.Supplier;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+
+import org.jetbrains.annotations.Nullable;
+
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+
+import appeng.api.implementations.IPowerChannelState;
+import appeng.api.networking.energy.IEnergyGrid;
+import appeng.api.networking.pathing.IPathingGrid;
+import appeng.api.util.AECableType;
+import appeng.core.localization.WailaText;
+import appeng.me.helpers.AENetworkProxy;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gnu.trove.list.TIntList;
+import gnu.trove.list.array.TIntArrayList;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.gui.GT_GUIColorOverride;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.ICleanroom;
+import gregtech.api.interfaces.ICleanroomReceiver;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_TooltipDataCache;
+import gregtech.api.util.GT_Util;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Client;
+import gregtech.common.covers.CoverInfo;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * Extend this Class to add a new MetaMachine Call the Constructor with the desired ID at the load-phase (not preload
+ * and also not postload!) Implement the newMetaEntity-Method to return a new ready instance of your MetaTileEntity
+ * <p/>
+ * Call the Constructor like the following example inside the Load Phase, to register it. "new
+ * GT_MetaTileEntity_E_Furnace(54, "GT_E_Furnace", "Automatic E-Furnace");"
+ */
+@SuppressWarnings("unused")
+public abstract class MetaTileEntity implements IMetaTileEntity, ICleanroomReceiver {
+
+ /**
+ * Only assigned for the MetaTileEntity in the List! Also only used to get the localized Name for the ItemStack and
+ * for getInvName.
+ */
+ public final String mName;
+ /**
+ * The Inventory of the MetaTileEntity. Amount of Slots can be larger than 256. HAYO!
+ */
+ public final ItemStack[] mInventory;
+
+ /**
+ * Inventory wrapper for ModularUI
+ */
+ public final ItemStackHandler inventoryHandler;
+
+ protected GT_GUIColorOverride colorOverride;
+ protected GT_TooltipDataCache mTooltipCache = new GT_TooltipDataCache();
+
+ @Override
+ public ItemStackHandler getInventoryHandler() {
+ return inventoryHandler;
+ }
+
+ public boolean doTickProfilingInThisTick = true;
+
+ private ICleanroom cleanroom;
+
+ /**
+ * accessibility to this Field is no longer given, see below
+ */
+ private IGregTechTileEntity mBaseMetaTileEntity;
+
+ public long mSoundRequests = 0;
+
+ /**
+ * This registers your Machine at the List. Use only ID's larger than 2048 - the ones lower are reserved by GT.
+ * See also the list in the API package - it has a description that contains all the reservations.
+ * <p>
+ * The constructor can be overloaded as follows:
+ * <blockquote>
+ *
+ * <pre>
+ *
+ * public GT_MetaTileEntity_EBench(int id, String name, String nameRegional) {
+ * super(id, name, nameRegional);
+ * }
+ * </pre>
+ *
+ * </blockquote>
+ *
+ * @param aID the machine ID
+ */
+ public MetaTileEntity(int aID, String aBasicName, String aRegionalName, int aInvSlotCount) {
+ if (GregTech_API.sPostloadStarted || !GregTech_API.sPreloadStarted)
+ throw new IllegalAccessError("This Constructor has to be called in the load Phase");
+ if (GregTech_API.METATILEENTITIES[aID] == null) {
+ GregTech_API.METATILEENTITIES[aID] = this;
+ } else {
+ throw new IllegalArgumentException("MetaMachine-Slot Nr. " + aID + " is already occupied!");
+ }
+ mName = aBasicName.replace(" ", "_")
+ .toLowerCase(Locale.ENGLISH);
+ setBaseMetaTileEntity(GregTech_API.constructBaseMetaTileEntity());
+ getBaseMetaTileEntity().setMetaTileID((short) aID);
+ GT_LanguageManager.addStringLocalization("gt.blockmachines." + mName + ".name", aRegionalName);
+ mInventory = new ItemStack[aInvSlotCount];
+ inventoryHandler = new ItemStackHandler(mInventory);
+ }
+
+ /**
+ * This is the normal Constructor.
+ */
+ public MetaTileEntity(String aName, int aInvSlotCount) {
+ mInventory = new ItemStack[aInvSlotCount];
+ mName = aName;
+ inventoryHandler = new ItemStackHandler(mInventory);
+ colorOverride = GT_GUIColorOverride.get(getGUITextureSet().getMainBackground().location);
+ }
+
+ /**
+ * This method will only be called on client side
+ *
+ * @return whether the secondary description should be display. default is false
+ */
+ @Deprecated
+ public boolean isDisplaySecondaryDescription() {
+ return false;
+ }
+
+ @Override
+ public IGregTechTileEntity getBaseMetaTileEntity() {
+ return mBaseMetaTileEntity;
+ }
+
+ @Override
+ public void setBaseMetaTileEntity(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (mBaseMetaTileEntity != null && aBaseMetaTileEntity == null) {
+ mBaseMetaTileEntity.getMetaTileEntity()
+ .inValidate();
+ mBaseMetaTileEntity.setMetaTileEntity(null);
+ }
+ mBaseMetaTileEntity = aBaseMetaTileEntity;
+ if (mBaseMetaTileEntity != null) {
+ mBaseMetaTileEntity.setMetaTileEntity(this);
+ }
+ }
+
+ public boolean isValid() {
+ return getBaseMetaTileEntity() != null && getBaseMetaTileEntity().getMetaTileEntity() == this
+ && !getBaseMetaTileEntity().isDead();
+ }
+
+ @Override
+ public ItemStack getStackForm(long aAmount) {
+ return new ItemStack(GregTech_API.sBlockMachines, (int) aAmount, getBaseMetaTileEntity().getMetaTileID());
+ }
+
+ @Override
+ public String getLocalName() {
+ return GT_LanguageManager.getTranslation("gt.blockmachines." + mName + ".name");
+ }
+
+ @Override
+ public void onServerStart() {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onWorldSave(File aSaveDirectory) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onWorldLoad(File aSaveDirectory) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onConfigLoad(GT_Config aConfig) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ /* Do nothing */
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ /* Do nothing */
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ,
+ ItemStack aTool) {
+ onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer,
+ float aX, float aY, float aZ, ItemStack aTool) {
+
+ // glue
+ if (onWrenchRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ)) {
+ return true;
+ }
+ if (getBaseMetaTileEntity().isValidFacing(wrenchingSide)) {
+ getBaseMetaTileEntity().setFrontFacing(wrenchingSide);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ, ItemStack aTool) {
+ // glue
+ if (onWireCutterRightClick(side, wrenchingSide, aPlayer, aX, aY, aZ)) {
+ return true;
+ }
+ if (!aPlayer.isSneaking()) return false;
+ final ForgeDirection oppositeSide = wrenchingSide.getOpposite();
+ final TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntityAtSide(wrenchingSide);
+ if ((tTileEntity instanceof IGregTechTileEntity gtTE)
+ && (gtTE.getMetaTileEntity() instanceof GT_MetaPipeEntity_Cable)) {
+
+ // The tile entity we're facing is a cable, let's try to connect to it
+ return gtTE.getMetaTileEntity()
+ .onWireCutterRightClick(wrenchingSide, oppositeSide, aPlayer, aX, aY, aZ, aTool);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ, ItemStack aTool) {
+
+ // glue
+ if (onSolderingToolRightClick(side, wrenchingSide, aPlayer, aX, aY, aZ)) {
+ return true;
+ }
+
+ if (!aPlayer.isSneaking()) return false;
+ final ForgeDirection oppositeSide = wrenchingSide.getOpposite();
+ TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntityAtSide(wrenchingSide);
+ if ((tTileEntity instanceof IGregTechTileEntity gtTE)
+ && (gtTE.getMetaTileEntity() instanceof GT_MetaPipeEntity_Cable)) {
+
+ // The tile entity we're facing is a cable, let's try to connect to it
+ return gtTE.getMetaTileEntity()
+ .onSolderingToolRightClick(wrenchingSide, oppositeSide, aPlayer, aX, aY, aZ, aTool);
+ }
+ return false;
+ }
+
+ @Deprecated
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ return false;
+ }
+
+ @Deprecated
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ return false;
+ }
+
+ @Deprecated
+ public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, float aX,
+ float aY, float aZ) {
+ return false;
+ }
+
+ @Deprecated
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+
+ }
+
+ @Override
+ public void onExplosion() {
+ GT_Log.exp.println(
+ "Machine at " + this.getBaseMetaTileEntity()
+ .getXCoord()
+ + " | "
+ + this.getBaseMetaTileEntity()
+ .getYCoord()
+ + " | "
+ + this.getBaseMetaTileEntity()
+ .getZCoord()
+ + " DIMID: "
+ + this.getBaseMetaTileEntity()
+ .getWorld().provider.dimensionId
+ + " exploded.");
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isClientSide() && GT_Client.changeDetected == 4) {
+ /*
+ * Client tick counter that is set to 5 on hiding pipes and covers. It triggers a texture update next client
+ * tick when reaching 4, with provision for 3 more update tasks, spreading client change detection related
+ * work and network traffic on different ticks, until it reaches 0.
+ */
+ aBaseMetaTileEntity.issueTextureUpdate();
+ }
+ }
+
+ public void onTickFail(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {}
+
+ public void onSetActive(boolean active) {}
+
+ public void onDisableWorking() {}
+
+ @Override
+ public void inValidate() {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onRemoval() {
+ /* Do nothing */
+ }
+
+ @Override
+ public void initDefaultModes(NBTTagCompound aNBT) {
+ /* Do nothing */
+ }
+
+ /**
+ * When a GUI is opened
+ */
+ public void onOpenGUI() {
+ /* Do nothing */
+ }
+
+ /**
+ * When a GUI is closed
+ */
+ public void onCloseGUI() {
+ /* Do nothing */
+ }
+
+ /**
+ * a Player rightclicks the Machine Sneaky rightclicks are not getting passed to this!
+ */
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ return false;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ return onRightclick(aBaseMetaTileEntity, aPlayer);
+ }
+
+ @Override
+ public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void onValueUpdate(byte aValue) {
+ /* Do nothing */
+ }
+
+ @Override
+ public byte getUpdateData() {
+ return 0;
+ }
+
+ @Override
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ /* Do nothing */
+ }
+
+ @Override
+ public void stopSoundLoop(byte aValue, double aX, double aY, double aZ) {
+ /* Do nothing */
+ }
+
+ @Nullable
+ @Override
+ public ICleanroom getCleanroom() {
+ return cleanroom;
+ }
+
+ @Override
+ public void setCleanroom(ICleanroom cleanroom) {
+ this.cleanroom = cleanroom;
+ }
+
+ @Override
+ public final void sendSound(byte aIndex) {
+ if (!getBaseMetaTileEntity().hasMufflerUpgrade())
+ getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.DO_SOUND, aIndex);
+ }
+
+ @Override
+ public final void sendLoopStart(byte aIndex) {
+ if (!getBaseMetaTileEntity().hasMufflerUpgrade())
+ getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.START_SOUND_LOOP, aIndex);
+ mSoundRequests++;
+ }
+
+ @Override
+ public final void sendLoopEnd(byte aIndex) {
+ if (!getBaseMetaTileEntity().hasMufflerUpgrade())
+ getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.STOP_SOUND_LOOP, aIndex);
+ }
+
+ /**
+ * @return true if this Device emits Energy at all
+ */
+ public boolean isElectric() {
+ return true;
+ }
+
+ /**
+ * @return true if this Device emits Energy at all
+ */
+ public boolean isPneumatic() {
+ return false;
+ }
+
+ /**
+ * @return true if this Device emits Energy at all
+ */
+ public boolean isSteampowered() {
+ return false;
+ }
+
+ /**
+ * @return what type of texture does this machine use for GUI, i.e. Bronze, Steel, or Primitive
+ */
+ public SteamVariant getSteamVariant() {
+ return SteamVariant.NONE;
+ }
+
+ /**
+ * @return true if this Device emits Energy at all
+ */
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ /**
+ * @return true if this Device consumes Energy at all
+ */
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ /**
+ * @return the amount of EU, which can be stored in this Device. Default is 0 EU.
+ */
+ public long maxEUStore() {
+ return 0;
+ }
+
+ /**
+ * @return the amount of EU/t, which can be accepted by this Device before it explodes.
+ */
+ public long maxEUInput() {
+ return 0;
+ }
+
+ /**
+ * @return the amount of EU/t, which can be outputted by this Device.
+ */
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ /**
+ * @return the amount of E-net Impulses of the maxEUOutput size, which can be outputted by this Device. Default is 1
+ * Pulse, this shouldn't be set to smaller Values than 1, as it won't output anything in that Case!
+ */
+ public long maxAmperesOut() {
+ return 1;
+ }
+
+ /**
+ * How many Amperes this Block can suck at max. Surpassing this value won't blow it up.
+ */
+ public long maxAmperesIn() {
+ return 1;
+ }
+
+ /**
+ * @return true if that Side is an Output.
+ */
+ public boolean isOutputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ /**
+ * @return true if that Side is an Input.
+ */
+ public boolean isInputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ /**
+ * @return true if Transformer Upgrades increase Packet Amount.
+ */
+ public boolean isTransformingLowEnergy() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return false;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean shouldDropItemAt(int index) {
+ return true;
+ }
+
+ @Override
+ public boolean setStackToZeroInsteadOfNull(int aIndex) {
+ return false;
+ }
+
+ /**
+ * This is used to get the internal Energy. I use this for the IDSU.
+ */
+ public long getEUVar() {
+ return ((BaseMetaTileEntity) mBaseMetaTileEntity).mStoredEnergy;
+ }
+
+ /**
+ * This is used to set the internal Energy to the given Parameter. I use this for the IDSU.
+ */
+ public void setEUVar(long aEnergy) {
+ if (aEnergy != ((BaseMetaTileEntity) mBaseMetaTileEntity).mStoredEnergy) {
+ markDirty();
+ ((BaseMetaTileEntity) mBaseMetaTileEntity).mStoredEnergy = aEnergy;
+ }
+ }
+
+ /**
+ * This is used to get the internal Steam Energy.
+ */
+ public long getSteamVar() {
+ return ((BaseMetaTileEntity) mBaseMetaTileEntity).mStoredSteam;
+ }
+
+ /**
+ * This is used to set the internal Steam Energy to the given Parameter.
+ */
+ public void setSteamVar(long aSteam) {
+ if (((BaseMetaTileEntity) mBaseMetaTileEntity).mStoredSteam != aSteam) {
+ markDirty();
+ ((BaseMetaTileEntity) mBaseMetaTileEntity).mStoredSteam = aSteam;
+ }
+ }
+
+ /**
+ * @return the amount of Steam, which can be stored in this Device. Default is 0 EU.
+ */
+ public long maxSteamStore() {
+ return 0;
+ }
+
+ /**
+ * @return the amount of EU, which this Device stores before starting to emit Energy. useful if you don't want to
+ * emit stored Energy until a certain Level is reached.
+ */
+ public long getMinimumStoredEU() {
+ return 512;
+ }
+
+ /**
+ * Determines the Tier of the Machine, used for de-charging Tools.
+ */
+ public long getInputTier() {
+ return GT_Utility.getTier(getBaseMetaTileEntity().getInputVoltage());
+ }
+
+ /**
+ * Determines the Tier of the Machine, used for charging Tools.
+ */
+ public long getOutputTier() {
+ return GT_Utility.getTier(getBaseMetaTileEntity().getOutputVoltage());
+ }
+
+ /**
+ * gets the first RechargerSlot
+ */
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ /**
+ * gets the amount of RechargerSlots
+ */
+ public int rechargerSlotCount() {
+ return 0;
+ }
+
+ /**
+ * gets the first DechargerSlot
+ */
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ /**
+ * gets the amount of DechargerSlots
+ */
+ public int dechargerSlotCount() {
+ return 0;
+ }
+
+ /**
+ * gets if this is protected from other Players per default or not
+ */
+ public boolean ownerControl() {
+ return false;
+ }
+
+ @Override
+ public ArrayList<String> getSpecialDebugInfo(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer,
+ int aLogLevel, ArrayList<String> aList) {
+ return aList;
+ }
+
+ @Override
+ public boolean isLiquidInput(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isLiquidOutput(ForgeDirection side) {
+ return true;
+ }
+
+ /**
+ * gets the contained Liquid
+ */
+ @Override
+ public FluidStack getFluid() {
+ return null;
+ }
+
+ /**
+ * tries to fill this Tank
+ */
+ @Override
+ public int fill(FluidStack resource, boolean doFill) {
+ return 0;
+ }
+
+ /**
+ * tries to empty this Tank
+ */
+ @Override
+ public FluidStack drain(int maxDrain, boolean doDrain) {
+ return null;
+ }
+
+ /**
+ * Tank pressure
+ */
+ public int getTankPressure() {
+ return 0;
+ }
+
+ /**
+ * Liquid Capacity
+ */
+ @Override
+ public int getCapacity() {
+ return 0;
+ }
+
+ /**
+ * Actual fluid capacity. If your machine has void-overflow feature, you'll want to override this method to make
+ * sure correct capacity is shown on GUI.
+ */
+ public int getRealCapacity() {
+ return getCapacity();
+ }
+
+ @Override
+ public void onMachineBlockUpdate() {
+ /* Do nothing */
+ }
+
+ @Override
+ public void receiveClientEvent(byte aEventID, byte aValue) {
+ /* Do nothing */
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ /**
+ * If this accepts up to 4 Overclockers
+ */
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ /**
+ * If this accepts Transformer Upgrades
+ */
+ public boolean isTransformerUpgradable() {
+ return false;
+ }
+
+ /**
+ * Progress this machine has already made
+ */
+ public int getProgresstime() {
+ return 0;
+ }
+
+ /**
+ * Progress this Machine has to do to produce something
+ */
+ public int maxProgresstime() {
+ return 0;
+ }
+
+ /**
+ * Increases the Progress, returns the overflown Progress.
+ */
+ public int increaseProgress(int aProgress) {
+ return 0;
+ }
+
+ /**
+ * If this TileEntity makes use of Sided Redstone behaviors. Determines only, if the Output Redstone Array is
+ * getting filled with 0 for true, or 15 for false.
+ */
+ public boolean hasSidedRedstoneOutputBehavior() {
+ return false;
+ }
+
+ /**
+ * When the Facing gets changed.
+ */
+ public void onFacingChange() {
+ /* Do nothing */
+ }
+
+ /**
+ * if the IC2 Teleporter can drain from this.
+ */
+ public boolean isTeleporterCompatible() {
+ return isEnetOutput() && getBaseMetaTileEntity().getOutputVoltage() >= 128
+ && getBaseMetaTileEntity().getUniversalEnergyCapacity() >= 500000;
+ }
+
+ /**
+ * Flag if this MTE will exploding when its raining
+ *
+ * @return True if this will explode in rain, else false
+ */
+ public boolean willExplodeInRain() {
+ return true;
+ }
+
+ /**
+ * Gets the Output for the comparator on the given Side
+ */
+ @Override
+ public byte getComparatorValue(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ public boolean acceptsRotationalEnergy(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean injectRotationalEnergy(ForgeDirection side, long aSpeed, long aEnergy) {
+ return false;
+ }
+
+ @Override
+ public String getSpecialVoltageToolTip() {
+ return null;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return false;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] {};
+ }
+
+ public boolean isDigitalChest() {
+ return false;
+ }
+
+ public ItemStack[] getStoredItemData() {
+ return null;
+ }
+
+ public void setItemCount(int aCount) {
+ /* Do nothing */
+ }
+
+ public int getMaxItemCount() {
+ return 0;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ return mInventory.length;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(int aIndex) {
+ if (aIndex >= 0 && aIndex < mInventory.length) return mInventory[aIndex];
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(int aIndex, ItemStack aStack) {
+ markDirty();
+ if (this instanceof IConfigurationCircuitSupport ccs) {
+ if (ccs.allowSelectCircuit() && aIndex == ccs.getCircuitSlot() && aStack != null) {
+ mInventory[aIndex] = GT_Utility.copyAmount(0, aStack);
+ return;
+ }
+ }
+ if (aIndex >= 0 && aIndex < mInventory.length) mInventory[aIndex] = aStack;
+ }
+
+ @Override
+ public String getInventoryName() {
+ if (GregTech_API.METATILEENTITIES[getBaseMetaTileEntity().getMetaTileID()] != null)
+ return GregTech_API.METATILEENTITIES[getBaseMetaTileEntity().getMetaTileID()].getMetaName();
+ return "";
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ @Override
+ public boolean isItemValidForSlot(int aIndex, ItemStack aStack) {
+ return getBaseMetaTileEntity().isValidSlot(aIndex);
+ }
+
+ @Override
+ public ItemStack decrStackSize(int aIndex, int aAmount) {
+ ItemStack tStack = getStackInSlot(aIndex), rStack = GT_Utility.copyOrNull(tStack);
+ if (tStack != null) {
+ if (tStack.stackSize <= aAmount) {
+ if (setStackToZeroInsteadOfNull(aIndex)) {
+ tStack.stackSize = 0;
+ markDirty();
+ } else setInventorySlotContents(aIndex, null);
+ } else {
+ rStack = tStack.splitStack(aAmount);
+ markDirty();
+ if (tStack.stackSize == 0 && !setStackToZeroInsteadOfNull(aIndex))
+ setInventorySlotContents(aIndex, null);
+ }
+ }
+ return rStack;
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(int ordinalSide) {
+ final TIntList tList = new TIntArrayList();
+ final IGregTechTileEntity tTileEntity = getBaseMetaTileEntity();
+ final CoverInfo tileCoverInfo = tTileEntity.getCoverInfoAtSide(ForgeDirection.getOrientation(ordinalSide));
+ final boolean tSkip = tileCoverInfo.letsItemsIn(-2) || tileCoverInfo.letsItemsOut(-2);
+ for (int i = 0; i < getSizeInventory(); i++) {
+ if (isValidSlot(i) && (tSkip || tileCoverInfo.letsItemsOut(i) || tileCoverInfo.letsItemsIn(i))) {
+ tList.add(i);
+ }
+ }
+ return tList.toArray();
+ }
+
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ return isValidSlot(aIndex) && aStack != null
+ && aIndex < mInventory.length
+ && (mInventory[aIndex] == null || GT_Utility.areStacksEqual(aStack, mInventory[aIndex]))
+ && allowPutStack(getBaseMetaTileEntity(), aIndex, ForgeDirection.getOrientation(ordinalSide), aStack);
+ }
+
+ @Override
+ public boolean canExtractItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ return isValidSlot(aIndex) && aStack != null
+ && aIndex < mInventory.length
+ && allowPullStack(getBaseMetaTileEntity(), aIndex, ForgeDirection.getOrientation(ordinalSide), aStack);
+ }
+
+ @Override
+ public boolean canFill(ForgeDirection side, Fluid aFluid) {
+ return fill(side, new FluidStack(aFluid, 1), false) == 1;
+ }
+
+ @Override
+ public boolean canDrain(ForgeDirection side, Fluid aFluid) {
+ return drain(side, new FluidStack(aFluid, 1), false) != null;
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection side) {
+ if (getCapacity() <= 0 && !getBaseMetaTileEntity().hasSteamEngineUpgrade()) return new FluidTankInfo[] {};
+ return new FluidTankInfo[] { getInfo() };
+ }
+
+ public int fill_default(ForgeDirection side, FluidStack aFluid, boolean doFill) {
+ int filled = fill(aFluid, doFill);
+ if (filled > 0) {
+ markDirty();
+ }
+ return filled;
+ }
+
+ @Override
+ public int fill(ForgeDirection side, FluidStack aFluid, boolean doFill) {
+ if (getBaseMetaTileEntity().hasSteamEngineUpgrade() && GT_ModHandler.isSteam(aFluid) && aFluid.amount > 1) {
+ int tSteam = (int) Math.min(
+ Integer.MAX_VALUE,
+ Math.min(
+ aFluid.amount / 2,
+ getBaseMetaTileEntity().getSteamCapacity() - getBaseMetaTileEntity().getStoredSteam()));
+ if (tSteam > 0) {
+ markDirty();
+ if (doFill) getBaseMetaTileEntity().increaseStoredSteam(tSteam, true);
+ return tSteam * 2;
+ }
+ } else {
+ return fill_default(side, aFluid, doFill);
+ }
+ return 0;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, FluidStack aFluid, boolean doDrain) {
+ if (getFluid() != null && aFluid != null && getFluid().isFluidEqual(aFluid))
+ return drain(aFluid.amount, doDrain);
+ return null;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, int maxDrain, boolean doDrain) {
+ return drain(maxDrain, doDrain);
+ }
+
+ @Override
+ public int getFluidAmount() {
+ return 0;
+ }
+
+ @Override
+ public FluidTankInfo getInfo() {
+ return new FluidTankInfo(this);
+ }
+
+ @Override
+ public String getMetaName() {
+ return mName;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(int i) {
+ return null;
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ return false;
+ }
+
+ @Override
+ public boolean doTickProfilingMessageDuringThisTick() {
+ return doTickProfilingInThisTick;
+ }
+
+ @Override
+ public void markDirty() {
+ if (mBaseMetaTileEntity != null) {
+ mBaseMetaTileEntity.markDirty();
+ }
+ }
+
+ @Override
+ public boolean isUseableByPlayer(EntityPlayer entityplayer) {
+ return false;
+ }
+
+ @Override
+ public void openInventory() {
+ //
+ }
+
+ @Override
+ public void closeInventory() {
+ //
+ }
+
+ /**
+ * @deprecated Use ModularUI
+ */
+ @Deprecated
+ @Override
+ public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
+ return null;
+ }
+
+ /**
+ * @deprecated Use ModularUI
+ */
+ @Deprecated
+ @Override
+ public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
+ return null;
+ }
+
+ @Override
+ public boolean connectsToItemPipe(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public float getExplosionResistance(ForgeDirection side) {
+ return 10.0F;
+ }
+
+ @Override
+ public ItemStack[] getRealInventory() {
+ return mInventory;
+ }
+
+ @Override
+ public void onColorChangeServer(byte aColor) {
+ final IGregTechTileEntity meta = getBaseMetaTileEntity();
+ final int aX = meta.getXCoord(), aY = meta.getYCoord(), aZ = meta.getZCoord();
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ // Flag surrounding pipes/cables to revaluate their connection with us if we got painted
+ final TileEntity tTileEntity = meta.getTileEntityAtSide(side);
+ if (tTileEntity instanceof BaseMetaPipeEntity pipe) {
+ pipe.onNeighborBlockChange(aX, aY, aZ);
+ }
+ }
+ }
+
+ @Override
+ public void onColorChangeClient(byte aColor) {
+ // Do nothing apparently
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean renderInInventory(Block aBlock, int aMeta, RenderBlocks aRenderer) {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean renderInWorld(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, RenderBlocks aRenderer) {
+ return false;
+ }
+
+ @Override
+ public void doExplosion(long aExplosionPower) {
+ float tStrength = GT_Values.getExplosionPowerForVoltage(aExplosionPower);
+ final int tX = getBaseMetaTileEntity().getXCoord();
+ final int tY = getBaseMetaTileEntity().getYCoord();
+ final int tZ = getBaseMetaTileEntity().getZCoord();
+ final World tWorld = getBaseMetaTileEntity().getWorld();
+ GT_Utility.sendSoundToPlayers(tWorld, SoundResource.IC2_MACHINES_MACHINE_OVERLOAD, 1.0F, -1, tX, tY, tZ);
+ tWorld.setBlock(tX, tY, tZ, Blocks.air);
+ if (GregTech_API.sMachineExplosions)
+ tWorld.createExplosion(null, tX + 0.5, tY + 0.5, tZ + 0.5, tStrength, true);
+ }
+
+ @Override
+ public int getLightOpacity() {
+ return ((BaseMetaTileEntity) getBaseMetaTileEntity()).getLightValue() > 0 ? 0 : 255;
+ }
+
+ @Override
+ public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB,
+ List<AxisAlignedBB> outputAABB, Entity collider) {
+ AxisAlignedBB axisalignedbb1 = getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ if (axisalignedbb1 != null && inputAABB.intersectsWith(axisalignedbb1)) outputAABB.add(axisalignedbb1);
+ }
+
+ @Override
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1);
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider) {
+ //
+ }
+
+ @Override
+ public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ //
+ }
+
+ @Override
+ public boolean allowGeneralRedstoneOutput() {
+ return false;
+ }
+
+ @Deprecated
+ public String trans(String aKey, String aEnglish) {
+ return GT_Utility.trans(aKey, aEnglish);
+ }
+
+ @Override
+ public boolean hasAlternativeModeText() {
+ return false;
+ }
+
+ @Override
+ public String getAlternativeModeText() {
+ return "";
+ }
+
+ @Override
+ public boolean shouldJoinIc2Enet() {
+ return false;
+ }
+
+ public boolean shouldTriggerBlockUpdate() {
+ return false;
+ }
+
+ // === AE2 compat ===
+
+ public AECableType getCableConnectionType(ForgeDirection forgeDirection) {
+ return AECableType.NONE;
+ }
+
+ public AENetworkProxy getProxy() {
+ return null;
+ }
+
+ public void gridChanged() {}
+
+ @Override
+ public ItemStack getMachineCraftingIcon() {
+ final IGregTechTileEntity mte = getBaseMetaTileEntity();
+ if (mte == null) {
+ return null;
+ }
+ return mte.getDrops()
+ .stream()
+ .findAny()
+ .orElse(null);
+ }
+
+ // === Waila compat ===
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ currenttip.add(
+ String.format(
+ "Facing: %s",
+ mBaseMetaTileEntity.getFrontFacing()
+ .name()));
+
+ if (this instanceof IPowerChannelState state) {
+ final NBTTagCompound tag = accessor.getNBTData();
+ final boolean isActive = tag.getBoolean("isActive");
+ final boolean isPowered = tag.getBoolean("isPowered");
+ final boolean isBooting = tag.getBoolean("isBooting");
+ currenttip.add(WailaText.getPowerState(isActive, isPowered, isBooting));
+ }
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ if (this instanceof IPowerChannelState state) {
+ final boolean isActive = state.isActive();
+ final boolean isPowered = state.isPowered();
+ final boolean isBooting = state.isBooting();
+ tag.setBoolean("isActive", isActive);
+ tag.setBoolean("isPowered", isPowered);
+ tag.setBoolean("isBooting", isBooting);
+ }
+ }
+
+ protected String getAEDiagnostics() {
+ try {
+ if (getProxy() == null) return "(proxy)";
+ if (getProxy().getNode() == null) return "(node)";
+ if (getProxy().getNode()
+ .getGrid() == null) return "(grid)";
+ if (!getProxy().getNode()
+ .meetsChannelRequirements()) return "(channels)";
+ IPathingGrid pg = getProxy().getNode()
+ .getGrid()
+ .getCache(IPathingGrid.class);
+ if (!pg.isNetworkBooting()) return "(booting)";
+ IEnergyGrid eg = getProxy().getNode()
+ .getGrid()
+ .getCache(IEnergyGrid.class);
+ if (!eg.isNetworkPowered()) return "(power)";
+ } catch (Throwable ex) {
+ ex.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return GUITextureSet.DEFAULT;
+ }
+
+ @Override
+ public int getGUIColorization() {
+ Dyes dye = Dyes.dyeWhite;
+ if (this.colorOverride.sLoaded()) {
+ if (this.colorOverride.sGuiTintingEnabled() && getBaseMetaTileEntity() != null) {
+ dye = Dyes.getDyeFromIndex(getBaseMetaTileEntity().getColorization());
+ return this.colorOverride.getGuiTintOrDefault(dye.mName, GT_Util.getRGBInt(dye.getRGBA()));
+ }
+ } else if (GregTech_API.sColoredGUI) {
+ if (GregTech_API.sMachineMetalGUI) {
+ dye = Dyes.MACHINE_METAL;
+ } else if (getBaseMetaTileEntity() != null) {
+ dye = Dyes.getDyeFromIndex(getBaseMetaTileEntity().getColorization());
+ }
+ }
+ return GT_Util.getRGBInt(dye.getRGBA());
+ }
+
+ @Override
+ public int getTextColorOrDefault(String textType, int defaultColor) {
+ return colorOverride.getTextColorOrDefault(textType, defaultColor);
+ }
+
+ protected Supplier<Integer> COLOR_TITLE = () -> getTextColorOrDefault("title", 0x404040);
+ protected Supplier<Integer> COLOR_TITLE_WHITE = () -> getTextColorOrDefault("title_white", 0xfafaff);
+ protected Supplier<Integer> COLOR_TEXT_WHITE = () -> getTextColorOrDefault("text_white", 0xfafaff);
+ protected Supplier<Integer> COLOR_TEXT_GRAY = () -> getTextColorOrDefault("text_gray", 0x404040);
+ protected Supplier<Integer> COLOR_TEXT_RED = () -> getTextColorOrDefault("text_red", 0xff0000);
+}
diff --git a/src/main/java/gregtech/api/metatileentity/TileIC2EnergySink.java b/src/main/java/gregtech/api/metatileentity/TileIC2EnergySink.java
new file mode 100644
index 0000000000..6fecb840b4
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/TileIC2EnergySink.java
@@ -0,0 +1,119 @@
+package gregtech.api.metatileentity;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.collect.Sets;
+
+import gregtech.api.interfaces.metatileentity.IConnectable;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntityCable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable;
+import gregtech.api.util.GT_Utility;
+import ic2.api.energy.tile.IEnergySink;
+
+public class TileIC2EnergySink extends TileEntity implements IEnergySink {
+
+ private final IGregTechTileEntity myMeta;
+ private GT_MetaPipeEntity_Cable cableMeta = null;
+
+ public TileIC2EnergySink(IGregTechTileEntity meta) {
+ if (meta == null) throw new NullPointerException("no null metas");
+ myMeta = meta;
+ final IMetaTileEntity metaTile = myMeta.getMetaTileEntity();
+ if (metaTile instanceof IMetaTileEntityCable) {
+ cableMeta = (GT_MetaPipeEntity_Cable) metaTile;
+ }
+ setWorldObj(meta.getWorld());
+ xCoord = meta.getXCoord();
+ yCoord = meta.getYCoord();
+ zCoord = meta.getZCoord();
+ }
+ /*
+ * IC2 enet compat - IEnergySink
+ */
+
+ /**
+ * Determine how much energy the sink accepts. Note that you cannot modify the energy net from this method.
+ * <p>
+ * Make sure that {@link TileIC2EnergySink#injectEnergy} accepts energy if this function returns anything positive.
+ *
+ * @return max accepted input in eu
+ */
+ @Override
+ public double getDemandedEnergy() {
+ if (cableMeta != null) {
+ /*
+ * We don't want everything to join the enet, treating the cable as a conductor, so we join it as a link.
+ * We don't want to traverse all cables connected to this, like we would during distribution, to see if it
+ * actually needs any EU, so we just always say we want it all. If there are more than two things attached
+ * and one of them is a GT cable that doesn't have anywhere to send its energy, the distribution will be a
+ * bit weird. In that case, use only one cable or a transformer.
+ */
+ return (cableMeta.mVoltage * cableMeta.mAmperage);
+ } else return myMeta.getEUCapacity() - myMeta.getStoredEU();
+ }
+
+ /**
+ * Gets the tier of this energy sink. 1 = LV, 2 = MV, 3 = HV, 4 = EV etc.
+ *
+ * @return tier of this energy sink or {@link Integer#MAX_VALUE} to allow any voltage
+ */
+ @Override
+ public int getSinkTier() {
+ return GT_Utility.getTier(cableMeta != null ? cableMeta.mVoltage : myMeta.getInputVoltage());
+ }
+
+ /**
+ * Transfer energy to the sink.
+ * <p>
+ * It's highly recommended to accept all energy by letting the internal buffer overflow to increase the performance
+ * and accuracy of the distribution simulation.
+ *
+ * @param directionFrom direction from which the energy comes from
+ * @param amount energy to be transferred
+ * @return Energy not consumed (leftover)
+ */
+ @Override
+ public double injectEnergy(ForgeDirection directionFrom, double amount, double voltage) {
+
+ final long amps = (long) Math
+ .max(amount / (cableMeta != null ? cableMeta.mVoltage : myMeta.getInputVoltage() * 1.0), 1.0);
+ final long euPerAmp = (long) (amount / (amps * 1.0));
+
+ final IMetaTileEntity metaTile = myMeta.getMetaTileEntity();
+ if (metaTile == null) return amount;
+
+ final long usedAmps;
+ if (cableMeta != null) {
+ usedAmps = ((IMetaTileEntityCable) metaTile).transferElectricity(
+ directionFrom,
+ Math.min(euPerAmp, cableMeta.mVoltage),
+ amps,
+ Sets.newHashSet((TileEntity) myMeta));
+
+ } else usedAmps = myMeta.injectEnergyUnits(directionFrom, Math.min(euPerAmp, myMeta.getInputVoltage()), amps);
+ return amount - (usedAmps * euPerAmp);
+
+ // transferElectricity for cables
+ }
+
+ /**
+ * Determine if this acceptor can accept current from an adjacent emitter in a direction.
+ * <p>
+ * The TileEntity in the emitter parameter is what was originally added to the energy net, which may be normal
+ * in-world TileEntity, a delegate or an IMetaDelegate.
+ *
+ * @param emitter energy emitter, may also be null or an IMetaDelegate
+ * @param direction direction the energy is being received from
+ */
+ @Override
+ public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction) {
+ final IMetaTileEntity metaTile = myMeta.getMetaTileEntity();
+ if (metaTile instanceof IMetaTileEntityCable
+ && (direction == ForgeDirection.UNKNOWN || ((IConnectable) metaTile).isConnectedAtSide(direction)))
+ return true;
+ else return myMeta.inputEnergyFrom(direction, false);
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
new file mode 100644
index 0000000000..1477f989f8
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
@@ -0,0 +1,679 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Mods.GalacticraftCore;
+import static net.minecraftforge.common.util.ForgeDirection.DOWN;
+import static net.minecraftforge.common.util.ForgeDirection.EAST;
+import static net.minecraftforge.common.util.ForgeDirection.NORTH;
+import static net.minecraftforge.common.util.ForgeDirection.SOUTH;
+import static net.minecraftforge.common.util.ForgeDirection.UP;
+import static net.minecraftforge.common.util.ForgeDirection.WEST;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cofh.api.energy.IEnergyReceiver;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.enums.Textures;
+import gregtech.api.graphs.Node;
+import gregtech.api.graphs.NodeList;
+import gregtech.api.graphs.PowerNode;
+import gregtech.api.graphs.PowerNodes;
+import gregtech.api.graphs.consumers.ConsumerNode;
+import gregtech.api.graphs.paths.PowerNodePath;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IConnectable;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntityCable;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IEnergyConnected;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+import gregtech.api.objects.GT_Cover_None;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_GC_Compat;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.GT_Client;
+import gregtech.common.covers.CoverInfo;
+import gregtech.common.covers.GT_Cover_SolarPanel;
+import ic2.api.energy.EnergyNet;
+import ic2.api.energy.tile.IEnergyEmitter;
+import ic2.api.energy.tile.IEnergySink;
+import ic2.api.energy.tile.IEnergySource;
+import ic2.api.energy.tile.IEnergyTile;
+import ic2.api.reactor.IReactorChamber;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTileEntityCable {
+
+ public final float mThickNess;
+ public final Materials mMaterial;
+ public final long mCableLossPerMeter, mAmperage, mVoltage;
+ public final boolean mInsulated, mCanShock;
+
+ public int mTransferredAmperage = 0;
+ public long mTransferredVoltage = 0;
+
+ @Deprecated
+ public int mTransferredAmperageLast20 = 0, mTransferredAmperageLast20OK = 0, mTransferredAmperageOK = 0;
+ @Deprecated
+ public long mTransferredVoltageLast20 = 0, mTransferredVoltageLast20OK = 0, mTransferredVoltageOK = 0;
+
+ public long mRestRF;
+ public int mOverheat;
+ public static short mMaxOverheat = (short) (GT_Mod.gregtechproxy.mWireHeatingTicks * 100);
+
+ private long lastWorldTick;
+
+ public GT_MetaPipeEntity_Cable(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial,
+ long aCableLossPerMeter, long aAmperage, long aVoltage, boolean aInsulated, boolean aCanShock) {
+ super(aID, aName, aNameRegional, 0);
+ mThickNess = aThickNess;
+ mMaterial = aMaterial;
+ mAmperage = aAmperage;
+ mVoltage = aVoltage;
+ mInsulated = aInsulated;
+ mCanShock = aCanShock;
+ mCableLossPerMeter = aCableLossPerMeter;
+ }
+
+ public GT_MetaPipeEntity_Cable(String aName, float aThickNess, Materials aMaterial, long aCableLossPerMeter,
+ long aAmperage, long aVoltage, boolean aInsulated, boolean aCanShock) {
+ super(aName, 0);
+ mThickNess = aThickNess;
+ mMaterial = aMaterial;
+ mAmperage = aAmperage;
+ mVoltage = aVoltage;
+ mInsulated = aInsulated;
+ mCanShock = aCanShock;
+ mCableLossPerMeter = aCableLossPerMeter;
+ }
+
+ @Override
+ public byte getTileEntityBaseType() {
+ return (byte) (mInsulated ? 9 : 8);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaPipeEntity_Cable(
+ mName,
+ mThickNess,
+ mMaterial,
+ mCableLossPerMeter,
+ mAmperage,
+ mVoltage,
+ mInsulated,
+ mCanShock);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ int facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ if (!mInsulated) return new ITexture[] { TextureFactory
+ .of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], Dyes.getModulation(colorIndex, mMaterial.mRGBa)) };
+ if (active) {
+ float tThickNess = getThickNess();
+ if (tThickNess < 0.124F) return new ITexture[] { TextureFactory
+ .of(Textures.BlockIcons.INSULATION_FULL, Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.374F) // 0.375 x1
+ return new ITexture[] {
+ TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa),
+ TextureFactory.of(
+ Textures.BlockIcons.INSULATION_TINY,
+ Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.499F) // 0.500 x2
+ return new ITexture[] {
+ TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa),
+ TextureFactory.of(
+ Textures.BlockIcons.INSULATION_SMALL,
+ Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.624F) // 0.625 x4
+ return new ITexture[] {
+ TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa),
+ TextureFactory.of(
+ Textures.BlockIcons.INSULATION_MEDIUM,
+ Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.749F) // 0.750 x8
+ return new ITexture[] {
+ TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa),
+ TextureFactory.of(
+ Textures.BlockIcons.INSULATION_MEDIUM_PLUS,
+ Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ if (tThickNess < 0.874F) // 0.825 x12
+ return new ITexture[] {
+ TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa),
+ TextureFactory.of(
+ Textures.BlockIcons.INSULATION_LARGE,
+ Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ return new ITexture[] {
+ TextureFactory.of(mMaterial.mIconSet.mTextures[TextureSet.INDEX_wire], mMaterial.mRGBa),
+ TextureFactory.of(
+ Textures.BlockIcons.INSULATION_HUGE,
+ Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ }
+ return new ITexture[] { TextureFactory
+ .of(Textures.BlockIcons.INSULATION_FULL, Dyes.getModulation(colorIndex, Dyes.CABLE_INSULATION.mRGBa)) };
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity aEntity) {
+
+ if (!mCanShock) return;
+
+ final BaseMetaPipeEntity baseEntity = (BaseMetaPipeEntity) getBaseMetaTileEntity();
+
+ if (!(aEntity instanceof EntityLivingBase livingEntity)) return;
+ if (!(baseEntity.getNodePath() instanceof PowerNodePath powerPath)) return;
+
+ if (isCoverOnSide(baseEntity, livingEntity)) return;
+ if ((baseEntity.mConnections & IConnectable.HAS_HARDENEDFOAM) == 1) return;
+
+ final long amperage = powerPath.getAmperage();
+ final long voltage = powerPath.getVoltage();
+
+ if (amperage == 0L) return;
+
+ GT_Utility.applyElectricityDamage(livingEntity, voltage, amperage);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public final boolean renderInside(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (int) mTransferredAmperage * 64;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return (int) mAmperage * 64;
+ }
+
+ @Override
+ public long injectEnergyUnits(ForgeDirection side, long voltage, long amperage) {
+ if (!isConnectedAtSide(side) && side != ForgeDirection.UNKNOWN) return 0;
+ if (!getBaseMetaTileEntity().getCoverInfoAtSide(side)
+ .letsEnergyIn()) return 0;
+ return transferElectricity(side, voltage, amperage, (HashSet<TileEntity>) null);
+ }
+
+ @Override
+ @Deprecated
+ public long transferElectricity(ForgeDirection side, long aVoltage, long aAmperage,
+ ArrayList<TileEntity> aAlreadyPassedTileEntityList) {
+ return transferElectricity(side, aVoltage, aAmperage, new HashSet<>(aAlreadyPassedTileEntityList));
+ }
+
+ @Override
+ public long transferElectricity(ForgeDirection side, long voltage, long amperage,
+ HashSet<TileEntity> alreadyPassedSet) {
+ if (!getBaseMetaTileEntity().isServerSide() || !isConnectedAtSide(side) && side != ForgeDirection.UNKNOWN)
+ return 0;
+ final BaseMetaPipeEntity tBase = (BaseMetaPipeEntity) getBaseMetaTileEntity();
+ if (!(tBase.getNode() instanceof PowerNode tNode)) return 0;
+ int tPlace = 0;
+ final Node[] tToPower = new Node[tNode.mConsumers.size()];
+ if (tNode.mHadVoltage) {
+ for (ConsumerNode consumer : tNode.mConsumers) {
+ if (consumer.needsEnergy()) tToPower[tPlace++] = consumer;
+ }
+ } else {
+ tNode.mHadVoltage = true;
+ for (ConsumerNode consumer : tNode.mConsumers) {
+ tToPower[tPlace++] = consumer;
+ }
+ }
+ return PowerNodes.powerNode(tNode, null, new NodeList(tToPower), (int) voltage, (int) amperage);
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ lastWorldTick = aBaseMetaTileEntity.getWorld()
+ .getTotalWorldTime() - 1;
+ // sets initial value -1 since it is
+ // in the same tick as first on post
+ // tick
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aTick % 20 == 0 && aBaseMetaTileEntity.isServerSide()
+ && (!GT_Mod.gregtechproxy.gt6Cable || mCheckConnections)) {
+ checkConnections();
+ }
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ if (GT_Mod.gregtechproxy.gt6Cable
+ && GT_ModHandler.damageOrDechargeItem(aPlayer.inventory.getCurrentItem(), 1, 500, aPlayer)) {
+ if (isConnectedAtSide(wrenchingSide)) {
+ disconnect(wrenchingSide);
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("215", "Disconnected"));
+ } else if (!GT_Mod.gregtechproxy.costlyCableConnection) {
+ if (connect(wrenchingSide) > 0)
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("214", "Connected"));
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ if (GT_Mod.gregtechproxy.gt6Cable
+ && GT_ModHandler.damageOrDechargeItem(aPlayer.inventory.getCurrentItem(), 1, 500, aPlayer)) {
+ if (isConnectedAtSide(wrenchingSide)) {
+ disconnect(wrenchingSide);
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("215", "Disconnected"));
+ } else if (!GT_Mod.gregtechproxy.costlyCableConnection || GT_ModHandler.consumeSolderingMaterial(aPlayer)) {
+ if (connect(wrenchingSide) > 0)
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("214", "Connected"));
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean letsIn(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return coverBehavior.letsEnergyIn(side, aCoverID, aCoverVariable, aTileEntity);
+ }
+
+ @Override
+ public boolean letsOut(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return coverBehavior.letsEnergyOut(side, aCoverID, aCoverVariable, aTileEntity);
+ }
+
+ @Override
+ public boolean letsIn(GT_CoverBehaviorBase<?> coverBehavior, ForgeDirection side, int aCoverID,
+ ISerializableObject aCoverVariable, ICoverable aTileEntity) {
+ return coverBehavior.letsEnergyIn(side, aCoverID, aCoverVariable, aTileEntity);
+ }
+
+ @Override
+ public boolean letsOut(GT_CoverBehaviorBase<?> coverBehavior, ForgeDirection side, int aCoverID,
+ ISerializableObject aCoverVariable, ICoverable aTileEntity) {
+ return coverBehavior.letsEnergyOut(side, aCoverID, aCoverVariable, aTileEntity);
+ }
+
+ @Override
+ public boolean letsIn(CoverInfo coverInfo) {
+ return coverInfo.letsEnergyIn();
+ }
+
+ @Override
+ public boolean letsOut(CoverInfo coverInfo) {
+ return coverInfo.letsEnergyOut();
+ }
+
+ @Override
+ public boolean canConnect(ForgeDirection side, TileEntity tileEntity) {
+ final IGregTechTileEntity baseMetaTile = getBaseMetaTileEntity();
+ final GT_CoverBehaviorBase<?> coverBehavior = baseMetaTile.getCoverBehaviorAtSideNew(side);
+ final ForgeDirection oppositeSide = side.getOpposite();
+
+ // GT Machine handling
+ if ((tileEntity instanceof PowerLogicHost powerLogic && powerLogic.getPowerLogic(oppositeSide) != null)
+ || ((tileEntity instanceof IEnergyConnected energyConnected)
+ && (energyConnected.inputEnergyFrom(oppositeSide, false)
+ || energyConnected.outputsEnergyTo(oppositeSide, false))))
+ return true;
+
+ // Solar Panel Compat
+ if (coverBehavior instanceof GT_Cover_SolarPanel) return true;
+
+ // ((tIsGregTechTileEntity && tIsTileEntityCable) && (tAlwaysLookConnected || tLetEnergyIn || tLetEnergyOut) )
+ // --> Not needed
+ if (GalacticraftCore.isModLoaded() && GT_GC_Compat.canConnect(tileEntity, oppositeSide)) return true;
+
+ // AE2-p2p Compat
+ if (tileEntity instanceof appeng.tile.powersink.IC2 ic2sink
+ && ic2sink.acceptsEnergyFrom((TileEntity) baseMetaTile, oppositeSide)) return true;
+
+ // IC2 Compat
+ {
+ final TileEntity ic2Energy;
+
+ if (tileEntity instanceof IReactorChamber)
+ ic2Energy = (TileEntity) ((IReactorChamber) tileEntity).getReactor();
+ else ic2Energy = (tileEntity == null || tileEntity instanceof IEnergyTile || EnergyNet.instance == null)
+ ? tileEntity
+ : EnergyNet.instance
+ .getTileEntity(tileEntity.getWorldObj(), tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord);
+
+ // IC2 Sink Compat
+ if ((ic2Energy instanceof IEnergySink)
+ && ((IEnergySink) ic2Energy).acceptsEnergyFrom((TileEntity) baseMetaTile, oppositeSide)) return true;
+
+ // IC2 Source Compat
+ if (GT_Mod.gregtechproxy.ic2EnergySourceCompat && (ic2Energy instanceof IEnergySource)) {
+ if (((IEnergySource) ic2Energy).emitsEnergyTo((TileEntity) baseMetaTile, oppositeSide)) {
+ return true;
+ }
+ }
+ }
+ // RF Output Compat
+ if (GregTech_API.mOutputRF && tileEntity instanceof IEnergyReceiver
+ && ((IEnergyReceiver) tileEntity).canConnectEnergy(oppositeSide)) return true;
+
+ // RF Input Compat
+ return GregTech_API.mInputRF && (tileEntity instanceof IEnergyEmitter
+ && ((IEnergyEmitter) tileEntity).emitsEnergyTo((TileEntity) baseMetaTile, oppositeSide));
+ }
+
+ @Override
+ public boolean getGT6StyleConnection() {
+ // Yes if GT6 Cables are enabled
+ return GT_Mod.gregtechproxy.gt6Cable;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] {
+ StatCollector.translateToLocal("GT5U.item.cable.max_voltage") + ": %%%"
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mVoltage)
+ + " ("
+ + GT_Utility.getColoredTierNameFromVoltage(mVoltage)
+ + EnumChatFormatting.GREEN
+ + ")"
+ + EnumChatFormatting.GRAY,
+ StatCollector.translateToLocal("GT5U.item.cable.max_amperage") + ": %%%"
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mAmperage)
+ + EnumChatFormatting.GRAY,
+ StatCollector.translateToLocal("GT5U.item.cable.loss") + ": %%%"
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(mCableLossPerMeter)
+ + EnumChatFormatting.GRAY
+ + "%%% "
+ + StatCollector.translateToLocal("GT5U.item.cable.eu_volt") };
+ }
+
+ @Override
+ public float getThickNess() {
+ if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x1) != 0) return 0.0625F;
+ return mThickNess;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ if (GT_Mod.gregtechproxy.gt6Cable) aNBT.setByte("mConnections", mConnections);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ if (GT_Mod.gregtechproxy.gt6Cable) {
+ mConnections = aNBT.getByte("mConnections");
+ }
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ final BaseMetaPipeEntity base = (BaseMetaPipeEntity) getBaseMetaTileEntity();
+ final PowerNodePath path = (PowerNodePath) base.getNodePath();
+
+ if (path == null)
+ return new String[] { EnumChatFormatting.RED + "Failed to get Power Node info" + EnumChatFormatting.RESET };
+
+ final long currAmp = path.getAmperage();
+ final long currVoltage = path.getVoltage();
+
+ final double avgAmp = path.getAvgAmperage();
+ final double avgVoltage = path.getAvgVoltage();
+
+ final long maxVoltageOut = (mVoltage - mCableLossPerMeter) * mAmperage;
+
+ return new String[] {
+ "Heat: " + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(mOverheat)
+ + EnumChatFormatting.RESET
+ + " / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxOverheat)
+ + EnumChatFormatting.RESET,
+ "Amperage: " + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(currAmp)
+ + EnumChatFormatting.RESET
+ + " / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mAmperage)
+ + EnumChatFormatting.RESET
+ + " A",
+ "Voltage Out: " + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(currVoltage)
+ + EnumChatFormatting.RESET
+ + " / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxVoltageOut)
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ "Avg Amperage (20t): " + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(avgAmp)
+ + EnumChatFormatting.RESET
+ + " A",
+ "Avg Output (20t): " + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(avgVoltage)
+ + EnumChatFormatting.RESET
+ + " EU/t" };
+ }
+
+ @Override
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0)
+ return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1);
+ else return getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ }
+
+ private AxisAlignedBB getActualCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ float tSpace = (1f - mThickNess) / 2;
+ float spaceDown = tSpace;
+ float spaceUp = 1f - tSpace;
+ float spaceNorth = tSpace;
+ float spaceSouth = 1f - tSpace;
+ float spaceWest = tSpace;
+ float spaceEast = 1f - tSpace;
+
+ if (getBaseMetaTileEntity().getCoverIDAtSide(DOWN) != 0) {
+ spaceDown = spaceNorth = spaceWest = 0;
+ spaceSouth = spaceEast = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(UP) != 0) {
+ spaceNorth = spaceWest = 0;
+ spaceUp = spaceSouth = spaceEast = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(NORTH) != 0) {
+ spaceDown = spaceNorth = spaceWest = 0;
+ spaceUp = spaceEast = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(SOUTH) != 0) {
+ spaceDown = spaceWest = 0;
+ spaceUp = spaceSouth = spaceEast = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(WEST) != 0) {
+ spaceDown = spaceNorth = spaceWest = 0;
+ spaceUp = spaceSouth = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(EAST) != 0) {
+ spaceDown = spaceNorth = 0;
+ spaceUp = spaceSouth = spaceEast = 1;
+ }
+
+ byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections;
+ if ((tConn & DOWN.flag) != 0) spaceDown = 0f;
+ if ((tConn & UP.flag) != 0) spaceUp = 1f;
+ if ((tConn & NORTH.flag) != 0) spaceNorth = 0f;
+ if ((tConn & SOUTH.flag) != 0) spaceSouth = 1f;
+ if ((tConn & WEST.flag) != 0) spaceWest = 0f;
+ if ((tConn & EAST.flag) != 0) spaceEast = 1f;
+
+ return AxisAlignedBB.getBoundingBox(
+ aX + spaceWest,
+ aY + spaceDown,
+ aZ + spaceNorth,
+ aX + spaceEast,
+ aY + spaceUp,
+ aZ + spaceSouth);
+ }
+
+ @Override
+ public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB,
+ List<AxisAlignedBB> outputAABB, Entity collider) {
+ super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider);
+ if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0) {
+ final AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ if (inputAABB.intersectsWith(aabb)) outputAABB.add(aabb);
+ }
+ }
+
+ @Override
+ public boolean shouldJoinIc2Enet() {
+ if (!GT_Mod.gregtechproxy.ic2EnergySourceCompat) return false;
+
+ if (mConnections != 0) {
+ final IGregTechTileEntity baseMeta = getBaseMetaTileEntity();
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (isConnectedAtSide(side)) {
+ final TileEntity tTileEntity = baseMeta.getTileEntityAtSide(side);
+ final TileEntity tEmitter = (tTileEntity == null || tTileEntity instanceof IEnergyTile
+ || EnergyNet.instance == null)
+ ? tTileEntity
+ : EnergyNet.instance.getTileEntity(
+ tTileEntity.getWorldObj(),
+ tTileEntity.xCoord,
+ tTileEntity.yCoord,
+ tTileEntity.zCoord);
+
+ if (tEmitter instanceof IEnergyEmitter) return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void reloadLocks() {
+ final BaseMetaPipeEntity pipe = (BaseMetaPipeEntity) getBaseMetaTileEntity();
+ if (pipe.getNode() != null) {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (isConnectedAtSide(side)) {
+ final CoverInfo coverInfo = pipe.getCoverInfoAtSide(side);
+ if (coverInfo.getCoverBehavior() instanceof GT_Cover_None) continue;
+ if (!letsIn(coverInfo) || !letsOut(coverInfo)) {
+ pipe.addToLock(pipe, side);
+ } else {
+ pipe.removeFromLock(pipe, side);
+ }
+ }
+ }
+ } else {
+ boolean dontAllow = false;
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (isConnectedAtSide(side)) {
+ final CoverInfo coverInfo = pipe.getCoverInfoAtSide(side);
+ if (coverInfo.getCoverBehavior() instanceof GT_Cover_None) continue;
+
+ if (!letsIn(coverInfo) || !letsOut(coverInfo)) {
+ dontAllow = true;
+ }
+ }
+ }
+ if (dontAllow) {
+ pipe.addToLock(pipe, DOWN);
+ } else {
+ pipe.removeFromLock(pipe, DOWN);
+ }
+ }
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+
+ currenttip.add(
+ StatCollector.translateToLocal("GT5U.item.cable.max_voltage") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mVoltage)
+ + " ("
+ + GT_Utility.getColoredTierNameFromVoltage(mVoltage)
+ + EnumChatFormatting.GREEN
+ + ")");
+ currenttip.add(
+ StatCollector.translateToLocal("GT5U.item.cable.max_amperage") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mAmperage));
+ currenttip.add(
+ StatCollector.translateToLocal("GT5U.item.cable.loss") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(mCableLossPerMeter)
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.item.cable.eu_volt"));
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Fluid.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Fluid.java
new file mode 100644
index 0000000000..f604f1583f
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Fluid.java
@@ -0,0 +1,991 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES;
+import static gregtech.api.enums.GT_Values.D1;
+import static gregtech.api.enums.Mods.TinkerConstruct;
+import static gregtech.api.enums.Mods.Translocator;
+import static gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid.Border.BOTTOM;
+import static gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid.Border.LEFT;
+import static gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid.Border.RIGHT;
+import static gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid.Border.TOP;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+import static net.minecraftforge.common.util.ForgeDirection.DOWN;
+import static net.minecraftforge.common.util.ForgeDirection.EAST;
+import static net.minecraftforge.common.util.ForgeDirection.NORTH;
+import static net.minecraftforge.common.util.ForgeDirection.SOUTH;
+import static net.minecraftforge.common.util.ForgeDirection.UP;
+import static net.minecraftforge.common.util.ForgeDirection.WEST;
+
+import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import org.apache.commons.lang3.tuple.MutableTriple;
+
+import cpw.mods.fml.common.Optional;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Mods;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.ToolModes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder;
+import gregtech.common.GT_Client;
+import gregtech.common.covers.CoverInfo;
+import gregtech.common.covers.GT_Cover_Drain;
+import gregtech.common.covers.GT_Cover_FluidRegulator;
+
+public class GT_MetaPipeEntity_Fluid extends MetaPipeEntity {
+
+ protected static final EnumMap<ForgeDirection, EnumMap<Border, ForgeDirection>> FACE_BORDER_MAP = new EnumMap<>(
+ ForgeDirection.class);
+
+ static {
+ FACE_BORDER_MAP.put(DOWN, borderMap(NORTH, SOUTH, EAST, WEST));
+ FACE_BORDER_MAP.put(UP, borderMap(NORTH, SOUTH, WEST, EAST));
+ FACE_BORDER_MAP.put(NORTH, borderMap(UP, DOWN, EAST, WEST));
+ FACE_BORDER_MAP.put(SOUTH, borderMap(UP, DOWN, WEST, EAST));
+ FACE_BORDER_MAP.put(WEST, borderMap(UP, DOWN, NORTH, SOUTH));
+ FACE_BORDER_MAP.put(EAST, borderMap(UP, DOWN, SOUTH, NORTH));
+ }
+
+ protected static final Map<Integer, IIconContainer> RESTR_TEXTURE_MAP = new HashMap<>();
+
+ static {
+ RESTR_TEXTURE_MAP.put(TOP.mask, Textures.BlockIcons.PIPE_RESTRICTOR_UP);
+ RESTR_TEXTURE_MAP.put(BOTTOM.mask, Textures.BlockIcons.PIPE_RESTRICTOR_DOWN);
+ RESTR_TEXTURE_MAP.put(TOP.mask | BOTTOM.mask, Textures.BlockIcons.PIPE_RESTRICTOR_UD);
+ RESTR_TEXTURE_MAP.put(LEFT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_LEFT);
+ RESTR_TEXTURE_MAP.put(TOP.mask | LEFT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_UL);
+ RESTR_TEXTURE_MAP.put(BOTTOM.mask | LEFT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_DL);
+ RESTR_TEXTURE_MAP.put(TOP.mask | BOTTOM.mask | LEFT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_NR);
+ RESTR_TEXTURE_MAP.put(RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_RIGHT);
+ RESTR_TEXTURE_MAP.put(TOP.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_UR);
+ RESTR_TEXTURE_MAP.put(BOTTOM.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_DR);
+ RESTR_TEXTURE_MAP.put(TOP.mask | BOTTOM.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_NL);
+ RESTR_TEXTURE_MAP.put(LEFT.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_LR);
+ RESTR_TEXTURE_MAP.put(TOP.mask | LEFT.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_ND);
+ RESTR_TEXTURE_MAP.put(BOTTOM.mask | LEFT.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR_NU);
+ RESTR_TEXTURE_MAP.put(TOP.mask | BOTTOM.mask | LEFT.mask | RIGHT.mask, Textures.BlockIcons.PIPE_RESTRICTOR);
+ }
+
+ public final float mThickNess;
+ public final Materials mMaterial;
+ public final int mCapacity, mHeatResistance, mPipeAmount;
+ public final boolean mGasProof;
+ public final FluidStack[] mFluids;
+ public byte mLastReceivedFrom = 0, oLastReceivedFrom = 0;
+ /**
+ * Bitmask for whether disable fluid input form each side.
+ */
+ public byte mDisableInput = 0;
+
+ public GT_MetaPipeEntity_Fluid(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial,
+ int aCapacity, int aHeatResistance, boolean aGasProof) {
+ this(aID, aName, aNameRegional, aThickNess, aMaterial, aCapacity, aHeatResistance, aGasProof, 1);
+ }
+
+ public GT_MetaPipeEntity_Fluid(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial,
+ int aCapacity, int aHeatResistance, boolean aGasProof, int aFluidTypes) {
+ super(aID, aName, aNameRegional, 0, false);
+ mThickNess = aThickNess;
+ mMaterial = aMaterial;
+ mCapacity = aCapacity;
+ mGasProof = aGasProof;
+ mHeatResistance = aHeatResistance;
+ mPipeAmount = aFluidTypes;
+ mFluids = new FluidStack[mPipeAmount];
+ addInfo(aID);
+ }
+
+ @Deprecated
+ public GT_MetaPipeEntity_Fluid(String aName, float aThickNess, Materials aMaterial, int aCapacity,
+ int aHeatResistance, boolean aGasProof) {
+ this(aName, aThickNess, aMaterial, aCapacity, aHeatResistance, aGasProof, 1);
+ }
+
+ public GT_MetaPipeEntity_Fluid(String aName, float aThickNess, Materials aMaterial, int aCapacity,
+ int aHeatResistance, boolean aGasProof, int aFluidTypes) {
+ super(aName, 0);
+ mThickNess = aThickNess;
+ mMaterial = aMaterial;
+ mCapacity = aCapacity;
+ mGasProof = aGasProof;
+ mHeatResistance = aHeatResistance;
+ mPipeAmount = aFluidTypes;
+ mFluids = new FluidStack[mPipeAmount];
+ }
+
+ @Override
+ public byte getTileEntityBaseType() {
+ return (byte) (mMaterial == null ? 4 : (byte) (4) + Math.max(0, Math.min(3, mMaterial.mToolQuality)));
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaPipeEntity_Fluid(
+ mName,
+ mThickNess,
+ mMaterial,
+ mCapacity,
+ mHeatResistance,
+ mGasProof,
+ mPipeAmount);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections,
+ int colorIndex, boolean aConnected, boolean redstoneLevel) {
+ if (side == ForgeDirection.UNKNOWN) return Textures.BlockIcons.ERROR_RENDERING;
+ final float tThickNess = getThickNess();
+ if (mDisableInput == 0)
+ return new ITexture[] { aConnected ? getBaseTexture(tThickNess, mPipeAmount, mMaterial, colorIndex)
+ : TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex],
+ Dyes.getModulation(colorIndex, mMaterial.mRGBa)) };
+ int borderMask = 0;
+ for (Border border : Border.values()) {
+ if (isInputDisabledAtSide(getSideAtBorder(side, border))) borderMask |= border.mask;
+ }
+
+ return new ITexture[] { aConnected ? getBaseTexture(tThickNess, mPipeAmount, mMaterial, colorIndex)
+ : TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex],
+ Dyes.getModulation(colorIndex, mMaterial.mRGBa)),
+ getRestrictorTexture(borderMask) };
+ }
+
+ protected static ITexture getBaseTexture(float aThickNess, int aPipeAmount, Materials aMaterial, int colorIndex) {
+ if (aPipeAmount >= 9) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeNonuple.mTextureIndex],
+ Dyes.getModulation(colorIndex, aMaterial.mRGBa));
+ if (aPipeAmount >= 4) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeQuadruple.mTextureIndex],
+ Dyes.getModulation(colorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.124F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex],
+ Dyes.getModulation(colorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.374F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeTiny.mTextureIndex],
+ Dyes.getModulation(colorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.499F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeSmall.mTextureIndex],
+ Dyes.getModulation(colorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.749F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeMedium.mTextureIndex],
+ Dyes.getModulation(colorIndex, aMaterial.mRGBa));
+ if (aThickNess < 0.874F) return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeLarge.mTextureIndex],
+ Dyes.getModulation(colorIndex, aMaterial.mRGBa));
+ return TextureFactory.of(
+ aMaterial.mIconSet.mTextures[OrePrefixes.pipeHuge.mTextureIndex],
+ Dyes.getModulation(colorIndex, aMaterial.mRGBa));
+ }
+
+ @Deprecated
+ protected static ITexture getRestrictorTexture(byte borderMask) {
+ return getRestrictorTexture((int) borderMask);
+ }
+
+ protected static ITexture getRestrictorTexture(int borderMask) {
+ final IIconContainer restrictorIcon = RESTR_TEXTURE_MAP.get(borderMask);
+ return restrictorIcon != null ? TextureFactory.of(restrictorIcon) : null;
+ }
+
+ @Override
+ public void onValueUpdate(byte aValue) {
+ mDisableInput = aValue;
+ }
+
+ @Override
+ public byte getUpdateData() {
+ return mDisableInput;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public final boolean renderInside(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return getFluidAmount();
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return getCapacity();
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ for (int i = 0; i < mPipeAmount; i++) if (mFluids[i] != null)
+ aNBT.setTag("mFluid" + (i == 0 ? "" : i), mFluids[i].writeToNBT(new NBTTagCompound()));
+ aNBT.setByte("mLastReceivedFrom", mLastReceivedFrom);
+ if (GT_Mod.gregtechproxy.gt6Pipe) {
+ aNBT.setByte("mConnections", mConnections);
+ aNBT.setByte("mDisableInput", mDisableInput);
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ for (int i = 0; i < mPipeAmount; i++)
+ mFluids[i] = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid" + (i == 0 ? "" : i)));
+ mLastReceivedFrom = aNBT.getByte("mLastReceivedFrom");
+ if (GT_Mod.gregtechproxy.gt6Pipe) {
+ mConnections = aNBT.getByte("mConnections");
+ mDisableInput = aNBT.getByte("mDisableInput");
+ }
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity aEntity) {
+ if ((((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections & -128) == 0
+ && aEntity instanceof EntityLivingBase) {
+ for (FluidStack tFluid : mFluids) {
+ if (tFluid != null) {
+ final int tTemperature = tFluid.getFluid()
+ .getTemperature(tFluid);
+ if (tTemperature > 320
+ && !isCoverOnSide((BaseMetaPipeEntity) getBaseMetaTileEntity(), (EntityLivingBase) aEntity)) {
+ GT_Utility.applyHeatDamage((EntityLivingBase) aEntity, (tTemperature - 300) / 50.0F);
+ break;
+ } else if (tTemperature < 260
+ && !isCoverOnSide((BaseMetaPipeEntity) getBaseMetaTileEntity(), (EntityLivingBase) aEntity)) {
+ GT_Utility.applyFrostDamage((EntityLivingBase) aEntity, (270 - tTemperature) / 25.0F);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide() && aTick % 5 == 0) {
+ mLastReceivedFrom &= 63;
+ if (mLastReceivedFrom == 63) {
+ mLastReceivedFrom = 0;
+ }
+
+ if (!GT_Mod.gregtechproxy.gt6Pipe || mCheckConnections) checkConnections();
+
+ final boolean shouldDistribute = (oLastReceivedFrom == mLastReceivedFrom);
+ for (int i = 0, j = aBaseMetaTileEntity.getRandomNumber(mPipeAmount); i < mPipeAmount; i++) {
+ final int index = (i + j) % mPipeAmount;
+ if (mFluids[index] != null && mFluids[index].amount <= 0) mFluids[index] = null;
+ if (mFluids[index] == null) continue;
+
+ if (checkEnvironment(index, aBaseMetaTileEntity)) return;
+
+ if (shouldDistribute) {
+ distributeFluid(index, aBaseMetaTileEntity);
+ mLastReceivedFrom = 0;
+ }
+ }
+
+ oLastReceivedFrom = mLastReceivedFrom;
+ }
+ }
+
+ private boolean checkEnvironment(int index, IGregTechTileEntity aBaseMetaTileEntity) {
+ // Check for hot liquids that melt the pipe or gasses that escape and burn/freeze people
+ final FluidStack tFluid = mFluids[index];
+
+ if (tFluid != null && tFluid.amount > 0) {
+ final int tTemperature = tFluid.getFluid()
+ .getTemperature(tFluid);
+ if (tTemperature > mHeatResistance) {
+ if (aBaseMetaTileEntity.getRandomNumber(100) == 0) {
+ // Poof
+ GT_Log.exp.println(
+ "Set Pipe to Fire due to to low heat resistance at " + aBaseMetaTileEntity.getXCoord()
+ + " | "
+ + aBaseMetaTileEntity.getYCoord()
+ + " | "
+ + aBaseMetaTileEntity.getZCoord()
+ + " DIMID: "
+ + aBaseMetaTileEntity.getWorld().provider.dimensionId);
+ aBaseMetaTileEntity.setToFire();
+ return true;
+ }
+ // Mmhmm, Fire
+ aBaseMetaTileEntity.setOnFire();
+ GT_Log.exp.println(
+ "Set Blocks around Pipe to Fire due to to low heat resistance at " + aBaseMetaTileEntity.getXCoord()
+ + " | "
+ + aBaseMetaTileEntity.getYCoord()
+ + " | "
+ + aBaseMetaTileEntity.getZCoord()
+ + " DIMID: "
+ + aBaseMetaTileEntity.getWorld().provider.dimensionId);
+ }
+ if (!mGasProof && tFluid.getFluid()
+ .isGaseous(tFluid)) {
+ tFluid.amount -= 5;
+ sendSound((byte) 9);
+ if (tTemperature > 320) {
+ try {
+ for (EntityLivingBase tLiving : getBaseMetaTileEntity().getWorld()
+ .getEntitiesWithinAABB(
+ EntityLivingBase.class,
+ AxisAlignedBB.getBoundingBox(
+ getBaseMetaTileEntity().getXCoord() - 2,
+ getBaseMetaTileEntity().getYCoord() - 2,
+ getBaseMetaTileEntity().getZCoord() - 2,
+ getBaseMetaTileEntity().getXCoord() + 3,
+ getBaseMetaTileEntity().getYCoord() + 3,
+ getBaseMetaTileEntity().getZCoord() + 3))) {
+ GT_Utility.applyHeatDamage(tLiving, (tTemperature - 300) / 25.0F);
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ } else if (tTemperature < 260) {
+ try {
+ for (EntityLivingBase tLiving : getBaseMetaTileEntity().getWorld()
+ .getEntitiesWithinAABB(
+ EntityLivingBase.class,
+ AxisAlignedBB.getBoundingBox(
+ getBaseMetaTileEntity().getXCoord() - 2,
+ getBaseMetaTileEntity().getYCoord() - 2,
+ getBaseMetaTileEntity().getZCoord() - 2,
+ getBaseMetaTileEntity().getXCoord() + 3,
+ getBaseMetaTileEntity().getYCoord() + 3,
+ getBaseMetaTileEntity().getZCoord() + 3))) {
+ GT_Utility.applyFrostDamage(tLiving, (270 - tTemperature) / 12.5F);
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ if (tFluid.amount <= 0) mFluids[index] = null;
+ }
+ return false;
+ }
+
+ private void distributeFluid(int index, IGregTechTileEntity aBaseMetaTileEntity) {
+ final FluidStack tFluid = mFluids[index];
+ if (tFluid == null) return;
+
+ // Tank, From, Amount to receive
+ final List<MutableTriple<IFluidHandler, ForgeDirection, Integer>> tTanks = new ArrayList<>();
+ final int amount = tFluid.amount;
+ final byte tOffset = (byte) getBaseMetaTileEntity().getRandomNumber(6);
+ for (final byte i : ALL_VALID_SIDES) {
+ // Get a list of tanks accepting fluids, and what side they're on
+ final ForgeDirection side = ForgeDirection.getOrientation((i + tOffset) % 6);
+ final ForgeDirection oppositeSide = side.getOpposite();
+ final IFluidHandler tTank = aBaseMetaTileEntity.getITankContainerAtSide(side);
+ final IGregTechTileEntity gTank = tTank instanceof IGregTechTileEntity ? (IGregTechTileEntity) tTank : null;
+
+ if (isConnectedAtSide(side) && tTank != null
+ && (mLastReceivedFrom & side.flag) == 0
+ && getBaseMetaTileEntity().getCoverInfoAtSide(side)
+ .letsFluidOut(tFluid.getFluid())
+ && (gTank == null || gTank.getCoverInfoAtSide(oppositeSide)
+ .letsFluidIn(tFluid.getFluid()))) {
+ if (tTank.fill(oppositeSide, tFluid, false) > 0) {
+ tTanks.add(new MutableTriple<>(tTank, oppositeSide, 0));
+ }
+ tFluid.amount = amount; // Because some mods do actually modify input fluid stack
+ }
+ }
+
+ // How much of this fluid is available for distribution?
+ final double tAmount = Math.max(1, Math.min(mCapacity * 10, tFluid.amount));
+
+ final FluidStack maxFluid = tFluid.copy();
+ maxFluid.amount = Integer.MAX_VALUE;
+
+ double availableCapacity = 0;
+ // Calculate available capacity for distribution from all tanks
+ for (final MutableTriple<IFluidHandler, ForgeDirection, Integer> tEntry : tTanks) {
+ tEntry.right = tEntry.left.fill(tEntry.middle, maxFluid, false);
+ availableCapacity += tEntry.right;
+ }
+
+ // Now distribute
+ for (final MutableTriple<IFluidHandler, ForgeDirection, Integer> tEntry : tTanks) {
+ // Distribue fluids based on percentage available space at destination
+ if (availableCapacity > tAmount)
+ tEntry.right = (int) Math.floor(tEntry.right * tAmount / availableCapacity);
+
+ // If the percent is not enough to give at least 1L, try to give 1L
+ if (tEntry.right == 0) tEntry.right = (int) Math.min(1, tAmount);
+
+ if (tEntry.right <= 0) continue;
+
+ final int tFilledAmount = tEntry.left
+ .fill(tEntry.middle, drainFromIndex(tEntry.right, false, index), false);
+
+ if (tFilledAmount > 0) tEntry.left.fill(tEntry.middle, drainFromIndex(tFilledAmount, true, index), true);
+
+ if (mFluids[index] == null || mFluids[index].amount <= 0) return;
+ }
+ }
+
+ public void connectPipeOnSide(ForgeDirection side, EntityPlayer entityPlayer) {
+ if (!isConnectedAtSide(side)) {
+ if (connect(side) > 0) GT_Utility.sendChatToPlayer(entityPlayer, GT_Utility.trans("214", "Connected"));
+ } else {
+ disconnect(side);
+ GT_Utility.sendChatToPlayer(entityPlayer, GT_Utility.trans("215", "Disconnected"));
+ }
+ }
+
+ public void blockPipeOnSide(ForgeDirection side, EntityPlayer entityPlayer, byte mask) {
+ if (isInputDisabledAtSide(side)) {
+ mDisableInput &= ~mask;
+ GT_Utility.sendChatToPlayer(entityPlayer, GT_Utility.trans("212", "Input enabled"));
+ if (!isConnectedAtSide(side)) connect(side);
+ } else {
+ mDisableInput |= mask;
+ GT_Utility.sendChatToPlayer(entityPlayer, GT_Utility.trans("213", "Input disabled"));
+ }
+ }
+
+ @Override
+ public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer,
+ float aX, float aY, float aZ, ItemStack aTool) {
+
+ if (GT_Mod.gregtechproxy.gt6Pipe) {
+ final int mode = GT_MetaGenerated_Tool.getToolMode(aTool);
+ IGregTechTileEntity currentPipeBase = getBaseMetaTileEntity();
+ GT_MetaPipeEntity_Fluid currentPipe = (GT_MetaPipeEntity_Fluid) currentPipeBase.getMetaTileEntity();
+ final ForgeDirection tSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ);
+ final byte tMask = (byte) (tSide.flag);
+
+ if (mode == ToolModes.REGULAR.get()) {
+ if (entityPlayer.isSneaking()) {
+ currentPipe.blockPipeOnSide(tSide, entityPlayer, tMask);
+ } else currentPipe.connectPipeOnSide(tSide, entityPlayer);
+ return true;
+ }
+
+ if (mode == ToolModes.WRENCH_LINE.get()) {
+
+ boolean initialState = entityPlayer.isSneaking() ? currentPipe.isInputDisabledAtSide(tSide)
+ : currentPipe.isConnectedAtSide(tSide);
+
+ boolean wasActionPerformed = false;
+
+ int limit = GregTech_API.sSpecialFile.get(ConfigCategories.general, "PipeWrenchingChainRange", 64);
+ for (int connected = 0; connected < limit; connected++) {
+
+ TileEntity nextPipeBaseTile = currentPipeBase.getTileEntityAtSide(tSide);
+
+ // if next tile doesn't exist or if next tile is not GT tile
+ if (!(nextPipeBaseTile instanceof IGregTechTileEntity nextPipeBase)) {
+ return wasActionPerformed;
+ }
+
+ // if next tile is wrong color
+ if (!currentPipe.connectableColor(nextPipeBaseTile)) {
+ return wasActionPerformed;
+ }
+
+ GT_MetaPipeEntity_Fluid nextPipe = nextPipeBase
+ .getMetaTileEntity() instanceof GT_MetaPipeEntity_Fluid
+ ? (GT_MetaPipeEntity_Fluid) nextPipeBase.getMetaTileEntity()
+ : null;
+
+ // if next tile entity is not a pipe
+ if (nextPipe == null) {
+ return wasActionPerformed;
+ }
+
+ // if pipes are same size
+ if (mPipeAmount != nextPipe.mPipeAmount) {
+ return wasActionPerformed;
+ }
+
+ // making sure next pipe has same fluid
+ for (int i = 0; i < mPipeAmount; i++) {
+ if (mFluids[i] != null && nextPipe.mFluids[i] != null) {
+ if (!mFluids[i].isFluidEqual(nextPipe.mFluids[i])) {
+ return wasActionPerformed;
+ }
+ } else if (mFluids[i] != nextPipe.mFluids[i]) {
+ return wasActionPerformed;
+ }
+ }
+
+ boolean currentState = entityPlayer.isSneaking() ? currentPipe.isInputDisabledAtSide(tSide)
+ : currentPipe.isConnectedAtSide(tSide);
+
+ /*
+ * Making sure next pipe will have same action applied to it
+ * e.g. Connecting pipe won`t trigger disconnect if next pipe is already connected
+ */
+ if (currentState != initialState) {
+ return wasActionPerformed;
+ }
+
+ if (entityPlayer.isSneaking()) {
+ currentPipe.blockPipeOnSide(tSide, entityPlayer, tMask);
+ } else currentPipe.connectPipeOnSide(tSide, entityPlayer);
+
+ wasActionPerformed = true;
+
+ currentPipeBase = (IGregTechTileEntity) nextPipeBase;
+ currentPipe = nextPipe;
+
+ }
+ return wasActionPerformed;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean letsIn(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return coverBehavior.letsFluidIn(side, aCoverID, aCoverVariable, null, aTileEntity);
+ }
+
+ @Override
+ public boolean letsOut(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return coverBehavior.letsFluidOut(side, aCoverID, aCoverVariable, null, aTileEntity);
+ }
+
+ @Override
+ public boolean letsIn(GT_CoverBehaviorBase<?> coverBehavior, ForgeDirection side, int aCoverID,
+ ISerializableObject aCoverVariable, ICoverable aTileEntity) {
+ return coverBehavior.letsFluidIn(side, aCoverID, aCoverVariable, null, aTileEntity);
+ }
+
+ @Override
+ public boolean letsOut(GT_CoverBehaviorBase<?> coverBehavior, ForgeDirection side, int aCoverID,
+ ISerializableObject aCoverVariable, ICoverable aTileEntity) {
+ return coverBehavior.letsFluidOut(side, aCoverID, aCoverVariable, null, aTileEntity);
+ }
+
+ @Override
+ public boolean letsIn(CoverInfo coverInfo) {
+ return coverInfo.letsFluidIn(null);
+ }
+
+ @Override
+ public boolean letsOut(CoverInfo coverInfo) {
+ return coverInfo.letsFluidOut(null);
+ }
+
+ @Override
+ public boolean canConnect(ForgeDirection side, TileEntity tileEntity) {
+ if (tileEntity == null) return false;
+
+ final ForgeDirection tSide = side.getOpposite();
+ final IGregTechTileEntity baseMetaTile = getBaseMetaTileEntity();
+ if (baseMetaTile == null) return false;
+
+ final GT_CoverBehaviorBase<?> coverBehavior = baseMetaTile.getCoverBehaviorAtSideNew(side);
+ final IGregTechTileEntity gTileEntity = (tileEntity instanceof IGregTechTileEntity)
+ ? (IGregTechTileEntity) tileEntity
+ : null;
+
+ if (coverBehavior instanceof GT_Cover_Drain
+ || (TinkerConstruct.isModLoaded() && isTConstructFaucet(tileEntity))) return true;
+
+ final IFluidHandler fTileEntity = (tileEntity instanceof IFluidHandler) ? (IFluidHandler) tileEntity : null;
+
+ if (fTileEntity != null) {
+ final FluidTankInfo[] tInfo = fTileEntity.getTankInfo(tSide);
+ if (tInfo != null) {
+ return tInfo.length > 0 || (Translocator.isModLoaded() && isTranslocator(tileEntity))
+ || gTileEntity != null
+ && gTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof GT_Cover_FluidRegulator;
+ }
+ }
+ return false;
+ }
+
+ @Optional.Method(modid = Mods.Names.TINKER_CONSTRUCT)
+ private boolean isTConstructFaucet(TileEntity tTileEntity) {
+ // Tinker Construct Faucets return a null tank info, so check the class
+ return tTileEntity instanceof tconstruct.smeltery.logic.FaucetLogic;
+ }
+
+ @Optional.Method(modid = Mods.Names.TRANSLOCATOR)
+ private boolean isTranslocator(TileEntity tTileEntity) {
+ // Translocators return a TankInfo, but it's of 0 length - so check the class if we see this pattern
+ return tTileEntity instanceof codechicken.translocator.TileLiquidTranslocator;
+ }
+
+ @Override
+ public boolean getGT6StyleConnection() {
+ // Yes if GT6 pipes are enabled
+ return GT_Mod.gregtechproxy.gt6Pipe;
+ }
+
+ @Override
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ super.doSound(aIndex, aX, aY, aZ);
+ if (aIndex == 9) {
+ GT_Utility.doSoundAtClient(SoundResource.RANDOM_FIZZ, 5, 1.0F, aX, aY, aZ);
+
+ new ParticleEventBuilder().setIdentifier(ParticleFX.CLOUD)
+ .setWorld(getBaseMetaTileEntity().getWorld())
+ .<ParticleEventBuilder>times(
+ 6,
+ (x, i) -> x
+ .setMotion(
+ ForgeDirection.getOrientation(i).offsetX / 5.0,
+ ForgeDirection.getOrientation(i).offsetY / 5.0,
+ ForgeDirection.getOrientation(i).offsetZ / 5.0)
+ .setPosition(
+ aX - 0.5 + XSTR_INSTANCE.nextFloat(),
+ aY - 0.5 + XSTR_INSTANCE.nextFloat(),
+ aZ - 0.5 + XSTR_INSTANCE.nextFloat())
+ .run());
+ }
+ }
+
+ @Override
+ public final int getCapacity() {
+ return mCapacity * 20 * mPipeAmount;
+ }
+
+ @Override
+ public FluidTankInfo getInfo() {
+ for (FluidStack tFluid : mFluids) {
+ if (tFluid != null) return new FluidTankInfo(tFluid, mCapacity * 20);
+ }
+ return new FluidTankInfo(null, mCapacity * 20);
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection side) {
+ if (getCapacity() <= 0 && !getBaseMetaTileEntity().hasSteamEngineUpgrade()) return new FluidTankInfo[] {};
+ ArrayList<FluidTankInfo> tList = new ArrayList<>();
+ for (FluidStack tFluid : mFluids) tList.add(new FluidTankInfo(tFluid, mCapacity * 20));
+ return tList.toArray(new FluidTankInfo[mPipeAmount]);
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public final FluidStack getFluid() {
+ for (FluidStack tFluid : mFluids) {
+ if (tFluid != null) return tFluid;
+ }
+ return null;
+ }
+
+ @Override
+ public final int getFluidAmount() {
+ int rAmount = 0;
+ for (FluidStack tFluid : mFluids) {
+ if (tFluid != null) rAmount += tFluid.amount;
+ }
+ return rAmount;
+ }
+
+ @Override
+ public final int fill_default(ForgeDirection side, FluidStack aFluid, boolean doFill) {
+ if (aFluid == null || aFluid.getFluid()
+ .getID() <= 0) return 0;
+
+ int index = -1;
+ for (int i = 0; i < mPipeAmount; i++) {
+ if (mFluids[i] != null && mFluids[i].isFluidEqual(aFluid)) {
+ index = i;
+ break;
+ } else if ((mFluids[i] == null || mFluids[i].getFluid()
+ .getID() <= 0) && index < 0) {
+ index = i;
+ }
+ }
+
+ return fill_default_intoIndex(side, aFluid, doFill, index);
+ }
+
+ private int fill_default_intoIndex(ForgeDirection side, FluidStack aFluid, boolean doFill, int index) {
+ if (index < 0 || index >= mPipeAmount) return 0;
+ if (aFluid == null || aFluid.getFluid()
+ .getID() <= 0) return 0;
+
+ final int ordinalSide = side.ordinal();
+
+ if (mFluids[index] == null || mFluids[index].getFluid()
+ .getID() <= 0) {
+ if (aFluid.amount * mPipeAmount <= getCapacity()) {
+ if (doFill) {
+ mFluids[index] = aFluid.copy();
+ mLastReceivedFrom |= (1 << ordinalSide);
+ }
+ return aFluid.amount;
+ }
+ if (doFill) {
+ mFluids[index] = aFluid.copy();
+ mLastReceivedFrom |= (1 << ordinalSide);
+ mFluids[index].amount = getCapacity() / mPipeAmount;
+ }
+ return getCapacity() / mPipeAmount;
+ }
+
+ if (!mFluids[index].isFluidEqual(aFluid)) return 0;
+
+ final int space = getCapacity() / mPipeAmount - mFluids[index].amount;
+ if (aFluid.amount <= space) {
+ if (doFill) {
+ mFluids[index].amount += aFluid.amount;
+ mLastReceivedFrom |= (1 << ordinalSide);
+ }
+ return aFluid.amount;
+ }
+ if (doFill) {
+ mFluids[index].amount = getCapacity() / mPipeAmount;
+ mLastReceivedFrom |= (1 << ordinalSide);
+ }
+ return space;
+ }
+
+ @Override
+ public final FluidStack drain(int maxDrain, boolean doDrain) {
+ FluidStack drained;
+ for (int i = 0; i < mPipeAmount; i++) {
+ if ((drained = drainFromIndex(maxDrain, doDrain, i)) != null) return drained;
+ }
+ return null;
+ }
+
+ private FluidStack drainFromIndex(int maxDrain, boolean doDrain, int index) {
+ if (index < 0 || index >= mPipeAmount) return null;
+ if (mFluids[index] == null) return null;
+ if (mFluids[index].amount <= 0) {
+ mFluids[index] = null;
+ return null;
+ }
+
+ int used = maxDrain;
+ if (mFluids[index].amount < used) used = mFluids[index].amount;
+
+ if (doDrain) {
+ mFluids[index].amount -= used;
+ }
+
+ final FluidStack drained = mFluids[index].copy();
+ drained.amount = used;
+
+ if (mFluids[index].amount <= 0) {
+ mFluids[index] = null;
+ }
+
+ return drained;
+ }
+
+ @Override
+ public int getTankPressure() {
+ return getFluidAmount() - (getCapacity() / 2);
+ }
+
+ @Override
+ public String[] getDescription() {
+ List<String> descriptions = new ArrayList<>();
+ descriptions.add(
+ EnumChatFormatting.BLUE + "Fluid Capacity: %%%"
+ + GT_Utility.formatNumbers(mCapacity * 20L)
+ + "%%% L/sec"
+ + EnumChatFormatting.GRAY);
+ descriptions.add(
+ EnumChatFormatting.RED + "Heat Limit: %%%"
+ + GT_Utility.formatNumbers(mHeatResistance)
+ + "%%% K"
+ + EnumChatFormatting.GRAY);
+ if (!mGasProof) {
+ descriptions.add(EnumChatFormatting.DARK_GREEN + "Cannot handle gas" + EnumChatFormatting.GRAY);
+ }
+ if (mPipeAmount != 1) {
+ descriptions.add(EnumChatFormatting.AQUA + "Pipe Amount: %%%" + mPipeAmount + EnumChatFormatting.GRAY);
+ }
+ return descriptions.toArray(new String[0]);
+ }
+
+ @Override
+ public float getThickNess() {
+ if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x1) != 0) return 0.0625F;
+ return mThickNess;
+ }
+
+ @Override
+ public boolean isLiquidInput(ForgeDirection side) {
+ return !isInputDisabledAtSide(side);
+ }
+
+ @Override
+ public boolean isLiquidOutput(ForgeDirection side) {
+ return true;
+ }
+
+ public boolean isInputDisabledAtSide(ForgeDirection side) {
+ return (mDisableInput & side.flag) != 0;
+ }
+
+ @Override
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0)
+ return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1);
+ else return getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ }
+
+ private AxisAlignedBB getActualCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ final float tSpace = (1f - mThickNess) / 2;
+ float tSide0 = tSpace;
+ float tSide1 = 1f - tSpace;
+ float tSide2 = tSpace;
+ float tSide3 = 1f - tSpace;
+ float tSide4 = tSpace;
+ float tSide5 = 1f - tSpace;
+
+ if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.DOWN) != 0) {
+ tSide0 = tSide2 = tSide4 = 0;
+ tSide3 = tSide5 = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.UP) != 0) {
+ tSide2 = tSide4 = 0;
+ tSide1 = tSide3 = tSide5 = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.NORTH) != 0) {
+ tSide0 = tSide2 = tSide4 = 0;
+ tSide1 = tSide5 = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.SOUTH) != 0) {
+ tSide0 = tSide4 = 0;
+ tSide1 = tSide3 = tSide5 = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.WEST) != 0) {
+ tSide0 = tSide2 = tSide4 = 0;
+ tSide1 = tSide3 = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.EAST) != 0) {
+ tSide0 = tSide2 = 0;
+ tSide1 = tSide3 = tSide5 = 1;
+ }
+
+ final byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections;
+ if ((tConn & ForgeDirection.DOWN.flag) != 0) tSide0 = 0f;
+ if ((tConn & ForgeDirection.UP.flag) != 0) tSide1 = 1f;
+ if ((tConn & ForgeDirection.NORTH.flag) != 0) tSide2 = 0f;
+ if ((tConn & ForgeDirection.SOUTH.flag) != 0) tSide3 = 1f;
+ if ((tConn & ForgeDirection.WEST.flag) != 0) tSide4 = 0f;
+ if ((tConn & ForgeDirection.EAST.flag) != 0) tSide5 = 1f;
+
+ return AxisAlignedBB
+ .getBoundingBox(aX + tSide4, aY + tSide0, aZ + tSide2, aX + tSide5, aY + tSide1, aZ + tSide3);
+ }
+
+ @Override
+ public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB,
+ List<AxisAlignedBB> outputAABB, Entity collider) {
+ super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider);
+ if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0) {
+ final AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ if (inputAABB.intersectsWith(aabb)) outputAABB.add(aabb);
+ }
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, FluidStack aFluid, boolean doDrain) {
+ if (aFluid == null) return null;
+ for (int i = 0; i < mFluids.length; ++i) {
+ final FluidStack f = mFluids[i];
+ if (f == null || !f.isFluidEqual(aFluid)) continue;
+ return drainFromIndex(aFluid.amount, doDrain, i);
+ }
+ return null;
+ }
+
+ private static EnumMap<Border, ForgeDirection> borderMap(ForgeDirection topSide, ForgeDirection bottomSide,
+ ForgeDirection leftSide, ForgeDirection rightSide) {
+ final EnumMap<Border, ForgeDirection> sideMap = new EnumMap<>(Border.class);
+ sideMap.put(TOP, topSide);
+ sideMap.put(BOTTOM, bottomSide);
+ sideMap.put(LEFT, leftSide);
+ sideMap.put(RIGHT, rightSide);
+ return sideMap;
+ }
+
+ protected static ForgeDirection getSideAtBorder(ForgeDirection side, Border border) {
+ return FACE_BORDER_MAP.get(side)
+ .get(border);
+ }
+
+ protected enum Border {
+
+ TOP(),
+ BOTTOM(),
+ LEFT(),
+ RIGHT();
+
+ public final int mask;
+
+ Border() {
+ mask = 1 << this.ordinal();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java
new file mode 100644
index 0000000000..399c536b9f
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java
@@ -0,0 +1,150 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_ModHandler.RecipeBits;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaPipeEntity_Frame extends MetaPipeEntity {
+
+ private static final String localizedDescFormat = GT_LanguageManager
+ .addStringLocalization("gt.blockmachines.gt_frame.desc.format", "Just something you can put covers on.");
+ public final Materials mMaterial;
+
+ public GT_MetaPipeEntity_Frame(int aID, String aName, String aNameRegional, Materials aMaterial) {
+ super(aID, aName, aNameRegional, 0);
+ mMaterial = aMaterial;
+
+ GT_OreDictUnificator.registerOre(OrePrefixes.frameGt, aMaterial, getStackForm(1));
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ getStackForm(2),
+ RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SSS", "SwS", "SSS", 'S', OrePrefixes.stick.get(mMaterial) });
+ }
+
+ if (!aMaterial.contains(SubTag.NO_RECIPES)
+ && GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1) != null) {
+ // Auto generate frame box recipe in an assembler.
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 4),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(getStackForm(1))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 7))
+ .addTo(assemblerRecipes);
+ }
+ }
+
+ public GT_MetaPipeEntity_Frame(String aName, Materials aMaterial) {
+ super(aName, 0);
+ mMaterial = aMaterial;
+ }
+
+ @Override
+ public byte getTileEntityBaseType() {
+ return (byte) (mMaterial == null ? 4 : (byte) (4) + Math.max(0, Math.min(3, mMaterial.mToolQuality)));
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaPipeEntity_Frame(mName, mMaterial);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection, int connections,
+ int colorIndex, boolean active, boolean redstoneLevel) {
+ return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex],
+ Dyes.getModulation(colorIndex, mMaterial.mRGBa)) };
+ }
+
+ @Override
+ public String[] getDescription() {
+ return localizedDescFormat.split("\\R");
+ }
+
+ @Override
+ public final boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public final boolean isFacingValid(ForgeDirection facing) {
+ return false;
+ }
+
+ @Override
+ public final boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public final boolean renderInside(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public final float getThickNess() {
+ return 1.0F;
+ }
+
+ @Override
+ public final void saveNBTData(NBTTagCompound aNBT) {
+ /* Do nothing */
+ }
+
+ @Override
+ public final void loadNBTData(NBTTagCompound aNBT) {
+ /* Do nothing */
+ }
+
+ @Override
+ public final boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public final boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int connect(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ public void disconnect(ForgeDirection side) {
+ /* Do nothing */
+ }
+
+ @Override
+ public boolean isMachineBlockUpdateRecursive() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Item.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Item.java
new file mode 100644
index 0000000000..660230660e
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Item.java
@@ -0,0 +1,530 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES;
+import static gregtech.api.enums.Textures.BlockIcons.PIPE_RESTRICTOR;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+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.tileentity.TileEntity;
+import net.minecraft.tileentity.TileEntityDispenser;
+import net.minecraft.tileentity.TileEntityHopper;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntityItemPipe;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.GT_Client;
+import gregtech.common.covers.CoverInfo;
+
+public class GT_MetaPipeEntity_Item extends MetaPipeEntity implements IMetaTileEntityItemPipe {
+
+ public final float mThickNess;
+ public final Materials mMaterial;
+ public final int mStepSize;
+ public final int mTickTime;
+ public int mTransferredItems = 0;
+ public long mCurrentTransferStartTick = 0;
+ public ForgeDirection mLastReceivedFrom = ForgeDirection.UNKNOWN, oLastReceivedFrom = ForgeDirection.UNKNOWN;
+ public boolean mIsRestrictive = false;
+ private int[] cacheSides;
+
+ public GT_MetaPipeEntity_Item(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial,
+ int aInvSlotCount, int aStepSize, boolean aIsRestrictive, int aTickTime) {
+ super(aID, aName, aNameRegional, aInvSlotCount, false);
+ mIsRestrictive = aIsRestrictive;
+ mThickNess = aThickNess;
+ mMaterial = aMaterial;
+ mStepSize = aStepSize;
+ mTickTime = aTickTime;
+ addInfo(aID);
+ }
+
+ public GT_MetaPipeEntity_Item(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial,
+ int aInvSlotCount, int aStepSize, boolean aIsRestrictive) {
+ this(aID, aName, aNameRegional, aThickNess, aMaterial, aInvSlotCount, aStepSize, aIsRestrictive, 20);
+ }
+
+ public GT_MetaPipeEntity_Item(String aName, float aThickNess, Materials aMaterial, int aInvSlotCount, int aStepSize,
+ boolean aIsRestrictive, int aTickTime) {
+ super(aName, aInvSlotCount);
+ mIsRestrictive = aIsRestrictive;
+ mThickNess = aThickNess;
+ mMaterial = aMaterial;
+ mStepSize = aStepSize;
+ mTickTime = aTickTime;
+ }
+
+ @Override
+ public byte getTileEntityBaseType() {
+ return (byte) (mMaterial == null ? 4 : (byte) (4) + Math.max(0, Math.min(3, mMaterial.mToolQuality)));
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaPipeEntity_Item(
+ mName,
+ mThickNess,
+ mMaterial,
+ mInventory.length,
+ mStepSize,
+ mIsRestrictive,
+ mTickTime);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections,
+ int aColorIndex, boolean aConnected, boolean redstoneLevel) {
+ if (mIsRestrictive) {
+ if (aConnected) {
+ float tThickNess = getThickNess();
+ if (tThickNess < 0.124F) return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) };
+ if (tThickNess < 0.374F) // 0.375
+ return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipeTiny.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) };
+ if (tThickNess < 0.499F) // 0.500
+ return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipeSmall.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) };
+ if (tThickNess < 0.749F) // 0.750
+ return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipeMedium.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) };
+ if (tThickNess < 0.874F) // 0.825
+ return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipeLarge.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) };
+ return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipeHuge.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) };
+ }
+ return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)), TextureFactory.of(PIPE_RESTRICTOR) };
+ }
+ if (aConnected) {
+ float tThickNess = getThickNess();
+ if (tThickNess < 0.124F) return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) };
+ if (tThickNess < 0.374F) // 0.375
+ return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipeTiny.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) };
+ if (tThickNess < 0.499F) // 0.500
+ return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipeSmall.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) };
+ if (tThickNess < 0.749F) // 0.750
+ return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipeMedium.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) };
+ if (tThickNess < 0.874F) // 0.825
+ return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipeLarge.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) };
+ return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipeHuge.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) };
+ }
+ return new ITexture[] { TextureFactory.of(
+ mMaterial.mIconSet.mTextures[OrePrefixes.pipe.mTextureIndex],
+ Dyes.getModulation(aColorIndex, mMaterial.mRGBa)) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(int ignoredSlotIndex) {
+ return true;
+ }
+
+ @Override
+ public final boolean renderInside(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return getPipeContent() * 64;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return getMaxPipeCapacity() * 64;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setByte("mLastReceivedFrom", (byte) mLastReceivedFrom.ordinal());
+ if (GT_Mod.gregtechproxy.gt6Pipe) aNBT.setByte("mConnections", mConnections);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mLastReceivedFrom = ForgeDirection.getOrientation(aNBT.getByte("mLastReceivedFrom"));
+ if (GT_Mod.gregtechproxy.gt6Pipe) {
+ mConnections = aNBT.getByte("mConnections");
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide() && (aTick - mCurrentTransferStartTick) % 10 == 0) {
+ if ((aTick - mCurrentTransferStartTick) % mTickTime == 0) {
+ mTransferredItems = 0;
+ mCurrentTransferStartTick = 0;
+ }
+
+ if (!GT_Mod.gregtechproxy.gt6Pipe || mCheckConnections) checkConnections();
+
+ if (oLastReceivedFrom == mLastReceivedFrom) {
+ doTickProfilingInThisTick = false;
+
+ final ArrayList<IMetaTileEntityItemPipe> tPipeList = new ArrayList<>();
+
+ for (boolean temp = true; temp && !isInventoryEmpty() && pipeCapacityCheck();) {
+ temp = false;
+ tPipeList.clear();
+ for (IMetaTileEntityItemPipe tTileEntity : GT_Utility
+ .sortMapByValuesAcending(
+ IMetaTileEntityItemPipe.Util.scanPipes(this, new HashMap<>(), 0, false, false))
+ .keySet()) {
+ if (temp) break;
+ tPipeList.add(tTileEntity);
+ while (!temp && !isInventoryEmpty() && tTileEntity.sendItemStack(aBaseMetaTileEntity))
+ for (IMetaTileEntityItemPipe tPipe : tPipeList)
+ if (!tPipe.incrementTransferCounter(1)) temp = true;
+ }
+ }
+ }
+
+ if (isInventoryEmpty()) mLastReceivedFrom = ForgeDirection.UNKNOWN;
+ oLastReceivedFrom = mLastReceivedFrom;
+ }
+ }
+
+ @Override
+ public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer,
+ float aX, float aY, float aZ) {
+ if (GT_Mod.gregtechproxy.gt6Pipe) {
+ final ForgeDirection tSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ);
+ if (isConnectedAtSide(tSide)) {
+ disconnect(tSide);
+ GT_Utility.sendChatToPlayer(entityPlayer, GT_Utility.trans("215", "Disconnected"));
+ } else {
+ if (connect(tSide) > 0) GT_Utility.sendChatToPlayer(entityPlayer, GT_Utility.trans("214", "Connected"));
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean letsIn(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return coverBehavior.letsItemsIn(side, aCoverID, aCoverVariable, -1, aTileEntity);
+ }
+
+ @Override
+ public boolean letsOut(GT_CoverBehavior coverBehavior, ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return coverBehavior.letsItemsOut(side, aCoverID, aCoverVariable, -1, aTileEntity);
+ }
+
+ @Override
+ public boolean letsIn(GT_CoverBehaviorBase<?> coverBehavior, ForgeDirection side, int aCoverID,
+ ISerializableObject aCoverVariable, ICoverable aTileEntity) {
+ return coverBehavior.letsItemsIn(side, aCoverID, aCoverVariable, -1, aTileEntity);
+ }
+
+ @Override
+ public boolean letsOut(GT_CoverBehaviorBase<?> coverBehavior, ForgeDirection side, int aCoverID,
+ ISerializableObject aCoverVariable, ICoverable aTileEntity) {
+ return coverBehavior.letsItemsOut(side, aCoverID, aCoverVariable, -1, aTileEntity);
+ }
+
+ @Override
+ public boolean letsIn(CoverInfo coverInfo) {
+ return coverInfo.letsItemsOut(-1);
+ }
+
+ @Override
+ public boolean letsOut(CoverInfo coverInfo) {
+ return coverInfo.letsItemsOut(-1);
+ }
+
+ @Override
+ public boolean canConnect(ForgeDirection side, TileEntity tileEntity) {
+ if (tileEntity == null) return false;
+
+ final ForgeDirection oppositeSide = side.getOpposite();
+ boolean connectable = GT_Utility.isConnectableNonInventoryPipe(tileEntity, oppositeSide);
+
+ final IGregTechTileEntity gTileEntity = (tileEntity instanceof IGregTechTileEntity)
+ ? (IGregTechTileEntity) tileEntity
+ : null;
+ if (gTileEntity != null) {
+ if (gTileEntity.getMetaTileEntity() == null) return false;
+ if (gTileEntity.getMetaTileEntity()
+ .connectsToItemPipe(oppositeSide)) return true;
+ connectable = true;
+ }
+
+ if (tileEntity instanceof IInventory) {
+ if (((IInventory) tileEntity).getSizeInventory() <= 0) return false;
+ connectable = true;
+ }
+ if (tileEntity instanceof ISidedInventory) {
+ final int[] tSlots = ((ISidedInventory) tileEntity).getAccessibleSlotsFromSide(oppositeSide.ordinal());
+ if (tSlots == null || tSlots.length == 0) return false;
+ connectable = true;
+ }
+
+ return connectable;
+ }
+
+ @Override
+ public boolean getGT6StyleConnection() {
+ // Yes if GT6 pipes are enabled
+ return GT_Mod.gregtechproxy.gt6Pipe;
+ }
+
+ @Override
+ public boolean incrementTransferCounter(int aIncrement) {
+ if (mTransferredItems == 0) mCurrentTransferStartTick = getBaseMetaTileEntity().getTimer();
+ mTransferredItems += aIncrement;
+ return pipeCapacityCheck();
+ }
+
+ @Override
+ public boolean sendItemStack(Object aSender) {
+ if (pipeCapacityCheck()) {
+ final byte tOffset = (byte) getBaseMetaTileEntity().getRandomNumber(6);
+ for (final byte i : ALL_VALID_SIDES) {
+ final ForgeDirection tSide = ForgeDirection.getOrientation((i + tOffset) % 6);
+ if (isConnectedAtSide(tSide)
+ && (isInventoryEmpty() || (tSide != mLastReceivedFrom || aSender != getBaseMetaTileEntity()))) {
+ if (insertItemStackIntoTileEntity(aSender, tSide)) return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean insertItemStackIntoTileEntity(Object aSender, ForgeDirection side) {
+ if (getBaseMetaTileEntity().getCoverInfoAtSide(side)
+ .letsItemsOut(-1)) {
+ final TileEntity tInventory = getBaseMetaTileEntity().getTileEntityAtSide(side);
+ if (tInventory != null && !(tInventory instanceof BaseMetaPipeEntity)) {
+ if ((!(tInventory instanceof TileEntityHopper) && !(tInventory instanceof TileEntityDispenser))
+ || getBaseMetaTileEntity().getMetaIDAtSide(side) != side.getOpposite()
+ .ordinal()) {
+ return GT_Utility.moveMultipleItemStacks(
+ aSender,
+ tInventory,
+ ForgeDirection.UNKNOWN,
+ side.getOpposite(),
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1,
+ 1) > 0;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean pipeCapacityCheck() {
+ return mTransferredItems <= 0 || getPipeContent() < getMaxPipeCapacity();
+ }
+
+ private int getPipeContent() {
+ return mTransferredItems;
+ }
+
+ private int getMaxPipeCapacity() {
+ return Math.max(1, getPipeCapacity());
+ }
+
+ /**
+ * Amount of ItemStacks this Pipe can conduct per Second.
+ */
+ public int getPipeCapacity() {
+ return mInventory.length;
+ }
+
+ @Override
+ public int getStepSize() {
+ return mStepSize;
+ }
+
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ return isConnectedAtSide(ForgeDirection.getOrientation(ordinalSide))
+ && super.canInsertItem(aIndex, aStack, ordinalSide);
+ }
+
+ @Override
+ public boolean canExtractItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ return isConnectedAtSide(ForgeDirection.getOrientation(ordinalSide));
+ }
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(int ordinalSide) {
+ final IGregTechTileEntity tTileEntity = getBaseMetaTileEntity();
+ final CoverInfo coverInfo = tTileEntity.getCoverInfoAtSide(ForgeDirection.getOrientation(ordinalSide));
+ final boolean tAllow = coverInfo.letsItemsIn(-2) || coverInfo.letsItemsOut(-2);
+ if (tAllow) {
+ if (cacheSides == null) cacheSides = super.getAccessibleSlotsFromSide(ordinalSide);
+ return cacheSides;
+ } else {
+ return GT_Values.emptyIntArray;
+ }
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return isConnectedAtSide(side);
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (!isConnectedAtSide(side)) return false;
+ if (isInventoryEmpty()) mLastReceivedFrom = side;
+ return mLastReceivedFrom == side && mInventory[aIndex] == null;
+ }
+
+ @Override
+ public String[] getDescription() {
+ if (mTickTime == 20) return new String[] { "Item Capacity: %%%" + getMaxPipeCapacity() + "%%% Stacks/sec",
+ "Routing Value: %%%" + GT_Utility.formatNumbers(mStepSize) };
+ else if (mTickTime % 20 == 0) return new String[] {
+ "Item Capacity: %%%" + getMaxPipeCapacity() + "%%% Stacks/%%%" + (mTickTime / 20) + "%%% sec",
+ "Routing Value: %%%" + GT_Utility.formatNumbers(mStepSize) };
+ else return new String[] {
+ "Item Capacity: %%%" + getMaxPipeCapacity() + "%%% Stacks/%%%" + mTickTime + "%%% ticks",
+ "Routing Value: %%%" + GT_Utility.formatNumbers(mStepSize) };
+ }
+
+ private boolean isInventoryEmpty() {
+ for (ItemStack tStack : mInventory) if (tStack != null) return false;
+ return true;
+ }
+
+ @Override
+ public float getThickNess() {
+ if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x1) != 0) return 0.0625F;
+ return mThickNess;
+ }
+
+ @Override
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0)
+ return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1);
+ else return getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ }
+
+ private AxisAlignedBB getActualCollisionBoundingBoxFromPool(World ignoredAWorld, int aX, int aY, int aZ) {
+ final float tSpace = (1f - mThickNess) / 2;
+ float spaceDown = tSpace;
+ float spaceUp = 1f - tSpace;
+ float spaceNorth = tSpace;
+ float spaceSouth = 1f - tSpace;
+ float spaceWest = tSpace;
+ float spaceEast = 1f - tSpace;
+
+ if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.DOWN) != 0) {
+ spaceDown = spaceNorth = spaceWest = 0;
+ spaceSouth = spaceEast = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.UP) != 0) {
+ spaceNorth = spaceWest = 0;
+ spaceUp = spaceSouth = spaceEast = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.NORTH) != 0) {
+ spaceDown = spaceNorth = spaceWest = 0;
+ spaceUp = spaceEast = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.SOUTH) != 0) {
+ spaceDown = spaceWest = 0;
+ spaceUp = spaceSouth = spaceEast = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.WEST) != 0) {
+ spaceDown = spaceNorth = spaceWest = 0;
+ spaceUp = spaceSouth = 1;
+ }
+ if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.EAST) != 0) {
+ spaceDown = spaceNorth = 0;
+ spaceUp = spaceSouth = spaceEast = 1;
+ }
+
+ final byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections;
+ if ((tConn & ForgeDirection.DOWN.flag) != 0) spaceDown = 0f;
+ if ((tConn & ForgeDirection.UP.flag) != 0) spaceUp = 1f;
+ if ((tConn & ForgeDirection.NORTH.flag) != 0) spaceNorth = 0f;
+ if ((tConn & ForgeDirection.SOUTH.flag) != 0) spaceSouth = 1f;
+ if ((tConn & ForgeDirection.WEST.flag) != 0) spaceWest = 0f;
+ if ((tConn & ForgeDirection.EAST.flag) != 0) spaceEast = 1f;
+
+ return AxisAlignedBB.getBoundingBox(
+ aX + spaceWest,
+ aY + spaceDown,
+ aZ + spaceNorth,
+ aX + spaceEast,
+ aY + spaceUp,
+ aZ + spaceSouth);
+ }
+
+ @Override
+ public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB,
+ List<AxisAlignedBB> outputAABB, Entity collider) {
+ super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider);
+ if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x2) != 0) {
+ final AxisAlignedBB aabb = getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ if (inputAABB.intersectsWith(aabb)) outputAABB.add(aabb);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicBatteryBuffer.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicBatteryBuffer.java
new file mode 100644
index 0000000000..ece64e2c1d
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicBatteryBuffer.java
@@ -0,0 +1,441 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import java.util.List;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import ic2.api.item.IElectricItem;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple
+ * Machine
+ */
+public class GT_MetaTileEntity_BasicBatteryBuffer extends GT_MetaTileEntity_TieredMachineBlock
+ implements IAddUIWidgets {
+
+ public boolean mCharge = false, mDecharge = false;
+ public int mBatteryCount = 0, mChargeableCount = 0;
+ private long count = 0;
+ private long mStored = 0;
+ private long mMax = 0;
+
+ public GT_MetaTileEntity_BasicBatteryBuffer(int aID, String aName, String aNameRegional, int aTier,
+ String aDescription, int aSlotCount) {
+ super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription);
+ }
+
+ public GT_MetaTileEntity_BasicBatteryBuffer(String aName, int aTier, String aDescription, ITexture[][][] aTextures,
+ int aSlotCount) {
+ super(aName, aTier, aSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicBatteryBuffer(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures, int aSlotCount) {
+ super(aName, aTier, aSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ String[] desc = new String[mDescriptionArray.length + 1];
+ System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length);
+ desc[mDescriptionArray.length] = mInventory.length + " Slots";
+ return desc;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[2][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1] };
+ rTextures[1][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ mInventory.length == 16 ? Textures.BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier]
+ : mInventory.length > 4 ? Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier]
+ : Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] };
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ return mTextures[side == aFacing ? 1 : 0][colorIndex + 1];
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_BasicBatteryBuffer(mName, mTier, mDescriptionArray, mTextures, mInventory.length);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return side != getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return V[mTier] * 16L * mInventory.length;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return V[mTier] * 64L * mInventory.length;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return mChargeableCount * 2L;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return mBatteryCount;
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return mCharge ? mInventory.length : 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return mDecharge ? mInventory.length : 0;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return (int) getBaseMetaTileEntity().getUniversalEnergyStored();
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return (int) getBaseMetaTileEntity().getUniversalEnergyCapacity();
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ //
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ //
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ mCharge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3;
+ mDecharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3;
+ mBatteryCount = 0;
+ mChargeableCount = 0;
+ for (ItemStack tStack : mInventory) if (GT_ModHandler.isElectricItem(tStack, mTier)) {
+ if (GT_ModHandler.isChargerItem(tStack)) mBatteryCount++;
+ mChargeableCount++;
+ }
+ }
+ count++;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (GT_ModHandler.isElectricItem(aStack) && aStack.getUnlocalizedName()
+ .startsWith("gt.metaitem.01.")) {
+ String name = aStack.getUnlocalizedName();
+ if (name.equals("gt.metaitem.01.32510") || name.equals("gt.metaitem.01.32511")
+ || name.equals("gt.metaitem.01.32520")
+ || name.equals("gt.metaitem.01.32521")
+ || name.equals("gt.metaitem.01.32530")
+ || name.equals("gt.metaitem.01.32531")) {
+ return ic2.api.item.ElectricItem.manager.getCharge(aStack) == 0;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (!GT_Utility.isStackValid(aStack)) {
+ return false;
+ }
+ return mInventory[aIndex] == null && GT_ModHandler.isElectricItem(aStack, this.mTier);
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+
+ public long[] getStoredEnergy() {
+ boolean scaleOverflow = false;
+ boolean storedOverflow = false;
+ long tScale = getBaseMetaTileEntity().getEUCapacity();
+ long tStored = getBaseMetaTileEntity().getStoredEU();
+ long tStep = 0;
+ if (mInventory != null) {
+ for (ItemStack aStack : mInventory) {
+ if (GT_ModHandler.isElectricItem(aStack)) {
+
+ if (aStack.getItem() instanceof GT_MetaBase_Item) {
+ Long[] stats = ((GT_MetaBase_Item) aStack.getItem()).getElectricStats(aStack);
+ if (stats != null) {
+ if (stats[0] > Long.MAX_VALUE / 2) {
+ scaleOverflow = true;
+ }
+ tScale = tScale + stats[0];
+ tStep = ((GT_MetaBase_Item) aStack.getItem()).getRealCharge(aStack);
+ if (tStep > Long.MAX_VALUE / 2) {
+ storedOverflow = true;
+ }
+ tStored = tStored + tStep;
+ }
+ } else if (aStack.getItem() instanceof IElectricItem) {
+ tStored = tStored + (long) ic2.api.item.ElectricItem.manager.getCharge(aStack);
+ tScale = tScale + (long) ((IElectricItem) aStack.getItem()).getMaxCharge(aStack);
+ }
+ }
+ }
+ }
+ if (scaleOverflow) {
+ tScale = Long.MAX_VALUE;
+ }
+ if (storedOverflow) {
+ tStored = Long.MAX_VALUE;
+ }
+ return new long[] { tStored, tScale };
+ }
+
+ @Override
+ public String[] getInfoData() {
+ updateStorageInfo();
+
+ return new String[] { EnumChatFormatting.BLUE + getLocalName() + EnumChatFormatting.RESET, "Stored Items:",
+ EnumChatFormatting.GREEN + GT_Utility.formatNumbers(mStored)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMax)
+ + EnumChatFormatting.RESET
+ + " EU",
+ "Average input:", GT_Utility.formatNumbers(getBaseMetaTileEntity().getAverageElectricInput()) + " EU/t",
+ "Average output:", GT_Utility.formatNumbers(getBaseMetaTileEntity().getAverageElectricOutput()) + " EU/t" };
+ }
+
+ private void updateStorageInfo() {
+ if (mMax == 0 || (count > 20)) {
+ long[] tmp = getStoredEnergy();
+ mStored = tmp[0];
+ mMax = tmp[1];
+ count = 0;
+ }
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ NBTTagCompound tag = accessor.getNBTData();
+ currenttip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.stored",
+ GT_Utility.formatNumbers(tag.getLong("mStored")),
+ GT_Utility.formatNumbers(tag.getLong("mMax"))));
+ long avgIn = tag.getLong("AvgIn");
+ long avgOut = tag.getLong("AvgOut");
+ currenttip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.avg_in_with_amperage",
+ GT_Utility.formatNumbers(avgIn),
+ GT_Utility.getAmperageForTier(avgIn, (byte) getInputTier()),
+ GT_Utility.getColoredTierNameFromTier((byte) getInputTier())));
+ currenttip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.avg_out_with_amperage",
+ GT_Utility.formatNumbers(avgOut),
+ GT_Utility.getAmperageForTier(avgOut, (byte) getOutputTier()),
+ GT_Utility.getColoredTierNameFromTier((byte) getOutputTier())));
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ updateStorageInfo();
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ tag.setLong("mStored", mStored);
+ tag.setLong("mMax", mMax);
+ tag.setLong("AvgIn", getBaseMetaTileEntity().getAverageElectricInput());
+ tag.setLong("AvgOut", getBaseMetaTileEntity().getAverageElectricOutput());
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ switch (mInventory.length) {
+ case 4 -> builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 2)
+ .startFromSlot(0)
+ .endAtSlot(3)
+ .slotCreator(index -> new BaseSlot(inventoryHandler, index) {
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+ })
+ .background(getGUITextureSet().getItemSlot())
+ .build()
+ .setPos(70, 25));
+ case 9 -> builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .startFromSlot(0)
+ .endAtSlot(8)
+ .slotCreator(index -> new BaseSlot(inventoryHandler, index) {
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+ })
+ .background(getGUITextureSet().getItemSlot())
+ .build()
+ .setPos(61, 16));
+ case 16 -> builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 4)
+ .startFromSlot(0)
+ .endAtSlot(15)
+ .slotCreator(index -> new BaseSlot(inventoryHandler, index) {
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+ })
+ .background(getGUITextureSet().getItemSlot())
+ .build()
+ .setPos(52, 7));
+ default -> builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 1)
+ .startFromSlot(0)
+ .endAtSlot(0)
+ .slotCreator(index -> new BaseSlot(inventoryHandler, index) {
+
+ @Override
+ public int getSlotStackLimit() {
+ return 1;
+ }
+ })
+ .background(getGUITextureSet().getItemSlot())
+ .build()
+ .setPos(79, 34));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicGenerator.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicGenerator.java
new file mode 100644
index 0000000000..897f9dad6f
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicGenerator.java
@@ -0,0 +1,344 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.RecipeMapWorkable;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.maps.FuelBackend;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Pollution;
+
+public abstract class GT_MetaTileEntity_BasicGenerator extends GT_MetaTileEntity_BasicTank
+ implements RecipeMapWorkable {
+
+ public GT_MetaTileEntity_BasicGenerator(int aID, String aName, String aNameRegional, int aTier, String aDescription,
+ ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, 3, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicGenerator(int aID, String aName, String aNameRegional, int aTier,
+ String[] aDescription, ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, 3, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicGenerator(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicGenerator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[10][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = getFront(i);
+ rTextures[1][i + 1] = getBack(i);
+ rTextures[2][i + 1] = getBottom(i);
+ rTextures[3][i + 1] = getTop(i);
+ rTextures[4][i + 1] = getSides(i);
+ rTextures[5][i + 1] = getFrontActive(i);
+ rTextures[6][i + 1] = getBackActive(i);
+ rTextures[7][i + 1] = getBottomActive(i);
+ rTextures[8][i + 1] = getTopActive(i);
+ rTextures[9][i + 1] = getSidesActive(i);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ return mTextures[(active ? 5 : 0) + (side == facingDirection ? 0
+ : side == facingDirection.getOpposite() ? 1
+ : side == ForgeDirection.DOWN ? 2 : side == ForgeDirection.UP ? 3 : 4)][colorIndex + 1];
+ }
+
+ @Override
+ public String[] getDescription() {
+ String[] desc = new String[mDescriptionArray.length + 1];
+ System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length);
+ desc[mDescriptionArray.length] = "Fuel Efficiency: " + getEfficiency() + "%";
+ return desc;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ public ITexture[] getFront(byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] };
+ }
+
+ public ITexture[] getBack(byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] };
+ }
+
+ public ITexture[] getBottom(byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] };
+ }
+
+ public ITexture[] getTop(byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] };
+ }
+
+ public ITexture[] getSides(byte aColor) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][aColor + 1] };
+ }
+
+ public ITexture[] getFrontActive(byte aColor) {
+ return getFront(aColor);
+ }
+
+ public ITexture[] getBackActive(byte aColor) {
+ return getBack(aColor);
+ }
+
+ public ITexture[] getBottomActive(byte aColor) {
+ return getBottom(aColor);
+ }
+
+ public ITexture[] getTopActive(byte aColor) {
+ return getTop(aColor);
+ }
+
+ public ITexture[] getSidesActive(byte aColor) {
+ return getSides(aColor);
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex < 2;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return getBaseMetaTileEntity().isAllowedToWork() ? V[mTier] : 0L;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(getEUVar(), V[mTier] * 80L + getMinimumStoredEU());
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return getBaseMetaTileEntity().isAllowedToWork();
+ // return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return getBaseMetaTileEntity().isAllowedToWork();
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return getBaseMetaTileEntity().isAllowedToWork();
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return getBaseMetaTileEntity().isAllowedToWork();
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return getFuelValue(aFluid) > 0;
+ }
+
+ @Override
+ public boolean isLiquidOutput(ForgeDirection side) {
+ // return super.isLiquidOutput(aSide);
+ return false;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && aTick % 10 == 0) {
+ if (mFluid != null) {
+ long tFuelValue = getFuelValue(mFluid), tConsumed = consumedFluidPerOperation(mFluid);
+ if (tFuelValue > 0 && tConsumed > 0 && mFluid.amount >= tConsumed) {
+ long tFluidAmountToUse = Math.min(
+ mFluid.amount / tConsumed,
+ (maxEUStore() - aBaseMetaTileEntity.getUniversalEnergyStored()) / tFuelValue);
+ if (tFluidAmountToUse > 0
+ && aBaseMetaTileEntity.increaseStoredEnergyUnits(tFluidAmountToUse * tFuelValue, true)) {
+ // divided by two because this is called every 10 ticks, not 20
+ GT_Pollution.addPollution(getBaseMetaTileEntity(), getPollution() / 2);
+ mFluid.amount -= tFluidAmountToUse * tConsumed;
+ }
+ }
+ }
+
+ if (mInventory[getInputSlot()] != null
+ && aBaseMetaTileEntity.getUniversalEnergyStored() < (maxEUOutput() * 20 + getMinimumStoredEU())
+ && ((GT_Utility.getFluidForFilledItem(mInventory[getInputSlot()], true) != null)
+ || solidFuelOverride(mInventory[getInputSlot()]))) {
+ long tFuelValue = getFuelValue(mInventory[getInputSlot()]);
+ if (tFuelValue <= 0) tFuelValue = getFuelValue(mInventory[getInputSlot()], true);
+ // System.out.println(" tFuelValue : " + tFuelValue );
+ if (tFuelValue > 0) {
+ ItemStack tEmptyContainer = getEmptyContainer(mInventory[getInputSlot()]);
+ if (aBaseMetaTileEntity.addStackToSlot(getOutputSlot(), tEmptyContainer)) {
+ aBaseMetaTileEntity.increaseStoredEnergyUnits(tFuelValue, true);
+ aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1);
+ // divided by two because this is called every 10 ticks, not 20
+ GT_Pollution.addPollution(getBaseMetaTileEntity(), getPollution() / 2);
+ }
+ }
+ }
+ }
+
+ if (aBaseMetaTileEntity.isServerSide()) aBaseMetaTileEntity.setActive(
+ aBaseMetaTileEntity.isAllowedToWork()
+ && aBaseMetaTileEntity.getUniversalEnergyStored() >= maxEUOutput() + getMinimumStoredEU());
+ }
+
+ /**
+ * @param stack the fuel stack
+ * @return if the stack is a solid fuel
+ */
+ public boolean solidFuelOverride(ItemStack stack) {
+ // this could be used for a coal generator for example aswell...
+ ItemData association = GT_OreDictUnificator.getAssociation(stack);
+ // if it is a gregtech Item, make sure its not a VOLUMETRIC_FLASK or any type of cell, else do vanilla checks
+ if (association != null) {
+ return !OrePrefixes.CELL_TYPES.contains(association.mPrefix)
+ && !GT_Utility.areStacksEqual(ItemList.VOLUMETRIC_FLASK.get(1L), stack, true);
+ } else {
+ return stack != null && // when the stack is null its not a solid
+ stack.getItem() != null && // when the item in the stack is null its not a solid
+ !(stack.getItem() instanceof IFluidContainerItem) && // when the item is a fluid container its not a
+ // solid...
+ !(stack.getItem() instanceof IFluidHandler) && // when the item is a fluid handler its not a
+ // solid...
+ !stack.getItem()
+ .getUnlocalizedName()
+ .contains("bucket"); // since we cant really check for
+ // buckets...
+ }
+ }
+
+ public abstract int getPollution();
+
+ @Override
+ public abstract RecipeMap<?> getRecipeMap();
+
+ public abstract int getEfficiency();
+
+ public int consumedFluidPerOperation(FluidStack aLiquid) {
+ return 1;
+ }
+
+ public int getFuelValue(FluidStack aLiquid) {
+ long value = getFuelValue(aLiquid, true);
+ return (value > Integer.MAX_VALUE) ? 0 : (int) value;
+ }
+
+ public long getFuelValue(FluidStack aLiquid, boolean aLong) {
+ RecipeMap<?> tRecipes = getRecipeMap();
+ if (aLiquid == null || !(tRecipes.getBackend() instanceof FuelBackend tFuels)) return 0;
+ GT_Recipe tFuel = tFuels.findFuel(aLiquid);
+ if (tFuel == null) return 0;
+
+ return (long) tFuel.mSpecialValue * getEfficiency() * consumedFluidPerOperation(aLiquid) / 100;
+ }
+
+ public int getFuelValue(ItemStack aStack) {
+ long value = getFuelValue(aStack, true);
+ return (value > Integer.MAX_VALUE) ? 0 : (int) value;
+ }
+
+ public long getFuelValue(ItemStack aStack, boolean aLong) {
+ if (GT_Utility.isStackInvalid(aStack) || getRecipeMap() == null) return 0;
+ GT_Recipe tFuel = getRecipeMap().findRecipe(getBaseMetaTileEntity(), false, Long.MAX_VALUE, null, aStack);
+ if (tFuel == null) return 0;
+
+ long liters = 10L; // 1000mb/100
+ return (long) tFuel.mSpecialValue * liters * getEfficiency();
+ }
+
+ public ItemStack getEmptyContainer(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack) || getRecipeMap() == null) return null;
+ GT_Recipe tFuel = getRecipeMap().findRecipe(getBaseMetaTileEntity(), false, Long.MAX_VALUE, null, aStack);
+ if (tFuel != null) return GT_Utility.copyOrNull(tFuel.getOutput(0));
+ return GT_Utility.getContainerItem(aStack, true);
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack) && (getFuelValue(aStack, true) > 0
+ || getFuelValue(GT_Utility.getFluidForFilledItem(aStack, true), true) > 0);
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ @Override
+ public int getTankPressure() {
+ return -100;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull.java
new file mode 100644
index 0000000000..e5766eee39
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull.java
@@ -0,0 +1,175 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public class GT_MetaTileEntity_BasicHull extends GT_MetaTileEntity_BasicTank {
+
+ public GT_MetaTileEntity_BasicHull(int aID, String aName, String aNameRegional, int aTier, String aDescription,
+ ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, 1, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicHull(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String aDescription, ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicHull(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicHull(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_BasicHull(mName, mTier, mInventory.length, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return !isOutputFacing(side);
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 512;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512 + V[mTier] * 50;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return V[mTier];
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aConnected, boolean redstoneLevel) {
+ return mTextures[Math.min(2, side.ordinal()) + (side == aFacing ? 3 : 0)][colorIndex + 1];
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[6][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1] };
+ rTextures[1][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1] };
+ rTextures[2][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1] };
+ rTextures[3][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] };
+ rTextures[4][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] };
+ rTextures[5][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] };
+ }
+ return rTextures;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public int getCapacity() {
+ return (mTier + 1) * 1000;
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull_NonElectric.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull_NonElectric.java
new file mode 100644
index 0000000000..b6584b50ab
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicHull_NonElectric.java
@@ -0,0 +1,78 @@
+package gregtech.api.metatileentity.implementations;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public abstract class GT_MetaTileEntity_BasicHull_NonElectric extends GT_MetaTileEntity_BasicHull {
+
+ public GT_MetaTileEntity_BasicHull_NonElectric(int aID, String aName, String aNameRegional, int aTier,
+ String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aDescription);
+ }
+
+ public GT_MetaTileEntity_BasicHull_NonElectric(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicHull_NonElectric(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ return mTextures[Math.min(2, sideDirection.ordinal())][colorIndex + 1];
+ }
+
+ @Override
+ public boolean isElectric() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return 0;
+ }
+
+ @Override
+ public abstract ITexture[][][] getTextureSet(ITexture[] aTextures);
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java
new file mode 100644
index 0000000000..4709c82776
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java
@@ -0,0 +1,1568 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.GT_Values.debugCleanroom;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
+import static gregtech.api.metatileentity.BaseTileEntity.FLUID_TRANSFER_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.ITEM_TRANSFER_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.NEI_TRANSFER_STEAM_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.NEI_TRANSFER_VOLTAGE_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.POWER_SOURCE_KEY;
+import static gregtech.api.metatileentity.BaseTileEntity.SPECIAL_SLOT_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.STALLED_STUTTERING_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.STALLED_VENT_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.metatileentity.BaseTileEntity.UNUSED_SLOT_TOOLTIP;
+import static gregtech.api.util.GT_RecipeConstants.EXPLODE;
+import static gregtech.api.util.GT_RecipeConstants.ON_FIRE;
+import static gregtech.api.util.GT_Utility.moveMultipleItemStacks;
+import static net.minecraftforge.common.util.ForgeDirection.DOWN;
+import static net.minecraftforge.common.util.ForgeDirection.UNKNOWN;
+import static net.minecraftforge.common.util.ForgeDirection.UP;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.math.Size;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.fluid.FluidStackTank;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.SteamTexture;
+import gregtech.api.interfaces.ICleanroom;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IOverclockDescriptionProvider;
+import gregtech.api.interfaces.tileentity.RecipeMapWorkable;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.overclockdescriber.EUOverclockDescriber;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.recipe.BasicUIProperties;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ClientPreference;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_TooltipDataCache;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GT_Waila;
+import gregtech.common.gui.modularui.UIHelper;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple
+ * Machine
+ */
+public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_BasicTank implements RecipeMapWorkable,
+ IConfigurationCircuitSupport, IOverclockDescriptionProvider, IAddGregtechLogo, IAddUIWidgets {
+
+ /**
+ * return values for checkRecipe()
+ */
+ protected static final int DID_NOT_FIND_RECIPE = 0, FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS = 1,
+ FOUND_AND_SUCCESSFULLY_USED_RECIPE = 2;
+
+ public static final int OTHER_SLOT_COUNT = 5;
+ public final ItemStack[] mOutputItems;
+ public final int mInputSlotCount, mAmperage;
+ public boolean mAllowInputFromOutputSide = false, mFluidTransfer = false, mItemTransfer = false,
+ mHasBeenUpdated = false, mStuttering = false, mCharge = false, mDecharge = false;
+ public boolean mDisableFilter = true;
+ public boolean mDisableMultiStack = true;
+ public int mProgresstime = 0, mMaxProgresstime = 0, mEUt = 0, mOutputBlocked = 0;
+ public ForgeDirection mMainFacing = ForgeDirection.WEST;
+ public FluidStack mOutputFluid;
+ protected final OverclockDescriber overclockDescriber;
+
+ /**
+ * Contains the Recipe which has been previously used, or null if there was no previous Recipe, which could have
+ * been buffered
+ */
+ protected GT_Recipe mLastRecipe = null;
+
+ private FluidStack mFluidOut;
+ protected final FluidStackTank fluidOutputTank = new FluidStackTank(
+ () -> mFluidOut,
+ fluidStack -> mFluidOut = fluidStack,
+ this::getCapacity);
+
+ /**
+ * Registers machine with single-line description.
+ *
+ * @param aOverlays 0 = SideFacingActive 1 = SideFacingInactive 2 = FrontFacingActive 3 = FrontFacingInactive 4 =
+ * TopFacingActive 5 = TopFacingInactive 6 = BottomFacingActive 7 = BottomFacingInactive ----- Not
+ * all Array Elements have to be initialised, you can also just use 8 Parameters for the Default
+ * Pipe Texture Overlays ----- 8 = BottomFacingPipeActive 9 = BottomFacingPipeInactive 10 =
+ * TopFacingPipeActive 11 = TopFacingPipeInactive 12 = SideFacingPipeActive 13 =
+ * SideFacingPipeInactive
+ */
+ public GT_MetaTileEntity_BasicMachine(int aID, String aName, String aNameRegional, int aTier, int aAmperage,
+ String aDescription, int aInputSlotCount, int aOutputSlotCount, ITexture... aOverlays) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ OTHER_SLOT_COUNT + aInputSlotCount + aOutputSlotCount + 1,
+ aDescription,
+ aOverlays);
+ mInputSlotCount = Math.max(0, aInputSlotCount);
+ mOutputItems = new ItemStack[Math.max(0, aOutputSlotCount)];
+ mAmperage = aAmperage;
+ overclockDescriber = createOverclockDescriber();
+ }
+
+ /**
+ * Registers machine with multi-line descriptions.
+ */
+ public GT_MetaTileEntity_BasicMachine(int aID, String aName, String aNameRegional, int aTier, int aAmperage,
+ String[] aDescription, int aInputSlotCount, int aOutputSlotCount, ITexture... aOverlays) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ OTHER_SLOT_COUNT + aInputSlotCount + aOutputSlotCount + 1,
+ aDescription,
+ aOverlays);
+ mInputSlotCount = Math.max(0, aInputSlotCount);
+ mOutputItems = new ItemStack[Math.max(0, aOutputSlotCount)];
+ mAmperage = aAmperage;
+ overclockDescriber = createOverclockDescriber();
+ }
+
+ /**
+ * For {@link #newMetaEntity}.
+ */
+ public GT_MetaTileEntity_BasicMachine(String aName, int aTier, int aAmperage, String[] aDescription,
+ ITexture[][][] aTextures, int aInputSlotCount, int aOutputSlotCount) {
+ super(aName, aTier, OTHER_SLOT_COUNT + aInputSlotCount + aOutputSlotCount + 1, aDescription, aTextures);
+ mInputSlotCount = Math.max(0, aInputSlotCount);
+ mOutputItems = new ItemStack[Math.max(0, aOutputSlotCount)];
+ mAmperage = aAmperage;
+ overclockDescriber = createOverclockDescriber();
+ }
+
+ /**
+ * To be called by the constructor to initialize this instance's overclock behavior
+ */
+ protected OverclockDescriber createOverclockDescriber() {
+ return new EUOverclockDescriber(mTier, mAmperage);
+ }
+
+ protected boolean isValidMainFacing(ForgeDirection side) {
+ return (side.flag & (UP.flag | DOWN.flag | UNKNOWN.flag)) == 0; // Horizontal
+ }
+
+ public boolean setMainFacing(ForgeDirection side) {
+ if (!isValidMainFacing(side)) return false;
+ mMainFacing = side;
+ if (getBaseMetaTileEntity().getFrontFacing() == mMainFacing) {
+ getBaseMetaTileEntity().setFrontFacing(side.getOpposite());
+ }
+ onFacingChange();
+ onMachineBlockUpdate();
+ return true;
+ }
+
+ @Override
+ public void onFacingChange() {
+ super.onFacingChange();
+ // Set up the correct facing (front towards player, output opposite) client-side before the server packet
+ // arrives
+ if (mMainFacing == UNKNOWN) {
+ IGregTechTileEntity te = getBaseMetaTileEntity();
+ if (te != null && te.getWorld().isRemote) {
+ mMainFacing = te.getFrontFacing();
+ te.setFrontFacing(te.getBackFacing());
+ }
+ }
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[14][17][];
+ aTextures = Arrays.copyOf(aTextures, 14);
+
+ for (int i = 0; i < aTextures.length; i++) if (aTextures[i] != null) for (byte c = -1; c < 16; c++) {
+ if (rTextures[i][c + 1] == null)
+ rTextures[i][c + 1] = new ITexture[] { MACHINE_CASINGS[mTier][c + 1], aTextures[i] };
+ }
+
+ for (byte c = -1; c < 16; c++) {
+ if (rTextures[0][c + 1] == null) rTextures[0][c + 1] = getSideFacingActive(c);
+ if (rTextures[1][c + 1] == null) rTextures[1][c + 1] = getSideFacingInactive(c);
+ if (rTextures[2][c + 1] == null) rTextures[2][c + 1] = getFrontFacingActive(c);
+ if (rTextures[3][c + 1] == null) rTextures[3][c + 1] = getFrontFacingInactive(c);
+ if (rTextures[4][c + 1] == null) rTextures[4][c + 1] = getTopFacingActive(c);
+ if (rTextures[5][c + 1] == null) rTextures[5][c + 1] = getTopFacingInactive(c);
+ if (rTextures[6][c + 1] == null) rTextures[6][c + 1] = getBottomFacingActive(c);
+ if (rTextures[7][c + 1] == null) rTextures[7][c + 1] = getBottomFacingInactive(c);
+ if (rTextures[8][c + 1] == null) rTextures[8][c + 1] = getBottomFacingPipeActive(c);
+ if (rTextures[9][c + 1] == null) rTextures[9][c + 1] = getBottomFacingPipeInactive(c);
+ if (rTextures[10][c + 1] == null) rTextures[10][c + 1] = getTopFacingPipeActive(c);
+ if (rTextures[11][c + 1] == null) rTextures[11][c + 1] = getTopFacingPipeInactive(c);
+ if (rTextures[12][c + 1] == null) rTextures[12][c + 1] = getSideFacingPipeActive(c);
+ if (rTextures[13][c + 1] == null) rTextures[13][c + 1] = getSideFacingPipeInactive(c);
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ final int textureIndex;
+ if ((mMainFacing.flag & (UP.flag | DOWN.flag)) != 0) { // UP or DOWN
+ if (sideDirection == facingDirection) {
+ textureIndex = active ? 2 : 3;
+ } else {
+ textureIndex = switch (sideDirection) {
+ case DOWN -> active ? 6 : 7;
+ case UP -> active ? 4 : 5;
+ default -> active ? 0 : 1;
+ };
+ }
+ } else {
+ if (sideDirection == mMainFacing) {
+ textureIndex = active ? 2 : 3;
+ } else {
+ if (showPipeFacing() && sideDirection == facingDirection) {
+ textureIndex = switch (sideDirection) {
+ case DOWN -> active ? 8 : 9;
+ case UP -> active ? 10 : 11;
+ default -> active ? 12 : 13;
+ };
+ } else {
+ textureIndex = switch (sideDirection) {
+ case DOWN -> active ? 6 : 7;
+ case UP -> active ? 4 : 5;
+ default -> active ? 0 : 1;
+ };
+ }
+ }
+ }
+ return mTextures[textureIndex][colorIndex + 1];
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex > 0 && super.isValidSlot(aIndex)
+ && aIndex != getCircuitSlot()
+ && aIndex != OTHER_SLOT_COUNT + mInputSlotCount + mOutputItems.length;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ // Either mMainFacing or mMainFacing is horizontal
+ return ((facing.flag | mMainFacing.flag) & ~(UP.flag | DOWN.flag | UNKNOWN.flag)) != 0;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return side != mMainFacing;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public boolean isLiquidInput(ForgeDirection side) {
+ return side != mMainFacing && (mAllowInputFromOutputSide || side != getBaseMetaTileEntity().getFrontFacing());
+ }
+
+ @Override
+ public boolean isLiquidOutput(ForgeDirection side) {
+ return side != mMainFacing;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return V[mTier] * 16L;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return V[mTier] * 64L;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxSteamStore() {
+ return maxEUStore();
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return ((long) mEUt * 2L) / V[mTier] + 1L;
+ }
+
+ @Override
+ public int getInputSlot() {
+ return OTHER_SLOT_COUNT;
+ }
+
+ @Override
+ public int getOutputSlot() {
+ return OTHER_SLOT_COUNT + mInputSlotCount;
+ }
+
+ public int getSpecialSlotIndex() {
+ return 3;
+ }
+
+ @Override
+ public int getStackDisplaySlot() {
+ return 2;
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 1;
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 1;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return mCharge ? 1 : 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return mDecharge ? 1 : 0;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return mProgresstime;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return mMaxProgresstime;
+ }
+
+ @Override
+ public int increaseProgress(int aProgress) {
+ mProgresstime += aProgress;
+ return mMaxProgresstime - mProgresstime;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return getFillableStack() != null || (getRecipeMap() != null && getRecipeMap().containsInput(aFluid));
+ }
+
+ @Override
+ public boolean isFluidChangingAllowed() {
+ return true;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return true;
+ }
+
+ @Override
+ public FluidStack getDrainableStack() {
+ return mFluidOut;
+ }
+
+ @Override
+ public FluidStack setDrainableStack(FluidStack aFluid) {
+ markDirty();
+ mFluidOut = aFluid;
+ return mFluidOut;
+ }
+
+ @Override
+ public boolean isDrainableStackSeparate() {
+ return true;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) return true;
+ if (!GT_Mod.gregtechproxy.mForceFreeFace) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (aBaseMetaTileEntity.getAirAtSide(side)) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+ }
+ GT_Utility.sendChatToPlayer(aPlayer, "No free Side!");
+ return true;
+ }
+
+ @Override
+ public void initDefaultModes(NBTTagCompound aNBT) {
+ mMainFacing = ForgeDirection.UNKNOWN;
+ if (!getBaseMetaTileEntity().getWorld().isRemote) {
+ final GT_ClientPreference tPreference = GT_Mod.gregtechproxy
+ .getClientPreference(getBaseMetaTileEntity().getOwnerUuid());
+ if (tPreference != null) {
+ mDisableFilter = !tPreference.isSingleBlockInitialFilterEnabled();
+ mDisableMultiStack = !tPreference.isSingleBlockInitialMultiStackEnabled();
+ }
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mFluidTransfer", mFluidTransfer);
+ aNBT.setBoolean("mItemTransfer", mItemTransfer);
+ aNBT.setBoolean("mHasBeenUpdated", mHasBeenUpdated);
+ aNBT.setBoolean("mAllowInputFromOutputSide", mAllowInputFromOutputSide);
+ aNBT.setBoolean("mDisableFilter", mDisableFilter);
+ aNBT.setBoolean("mDisableMultiStack", mDisableMultiStack);
+ aNBT.setInteger("mEUt", mEUt);
+ aNBT.setInteger("mMainFacing", mMainFacing.ordinal());
+ aNBT.setInteger("mProgresstime", mProgresstime);
+ aNBT.setInteger("mMaxProgresstime", mMaxProgresstime);
+ if (mOutputFluid != null) aNBT.setTag("mOutputFluid", mOutputFluid.writeToNBT(new NBTTagCompound()));
+ if (mFluidOut != null) aNBT.setTag("mFluidOut", mFluidOut.writeToNBT(new NBTTagCompound()));
+
+ for (int i = 0; i < mOutputItems.length; i++)
+ if (mOutputItems[i] != null) GT_Utility.saveItem(aNBT, "mOutputItem" + i, mOutputItems[i]);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mFluidTransfer = aNBT.getBoolean("mFluidTransfer");
+ mItemTransfer = aNBT.getBoolean("mItemTransfer");
+ mHasBeenUpdated = aNBT.getBoolean("mHasBeenUpdated");
+ mAllowInputFromOutputSide = aNBT.getBoolean("mAllowInputFromOutputSide");
+ mDisableFilter = aNBT.getBoolean("mDisableFilter");
+ mDisableMultiStack = aNBT.getBoolean("mDisableMultiStack");
+ mEUt = aNBT.getInteger("mEUt");
+ mMainFacing = ForgeDirection.getOrientation(aNBT.getInteger("mMainFacing"));
+ mProgresstime = aNBT.getInteger("mProgresstime");
+ mMaxProgresstime = aNBT.getInteger("mMaxProgresstime");
+ mOutputFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mOutputFluid"));
+ mFluidOut = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluidOut"));
+
+ for (int i = 0; i < mOutputItems.length; i++) mOutputItems[i] = GT_Utility.loadItem(aNBT, "mOutputItem" + i);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+
+ if (aBaseMetaTileEntity.isServerSide()) {
+ mCharge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3;
+ mDecharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3;
+
+ doDisplayThings();
+
+ boolean tSucceeded = false;
+
+ if (mMaxProgresstime > 0 && (mProgresstime >= 0 || aBaseMetaTileEntity.isAllowedToWork())) {
+ markDirty();
+ aBaseMetaTileEntity.setActive(true);
+ if (mProgresstime < 0 || drainEnergyForProcess(mEUt)) {
+ if (++mProgresstime >= mMaxProgresstime) {
+ for (int i = 0; i < mOutputItems.length; i++)
+ for (int j = 0; j < mOutputItems.length; j++) if (aBaseMetaTileEntity
+ .addStackToSlot(getOutputSlot() + ((j + i) % mOutputItems.length), mOutputItems[i]))
+ break;
+ if (mOutputFluid != null)
+ if (getDrainableStack() == null) setDrainableStack(mOutputFluid.copy());
+ else if (mOutputFluid.isFluidEqual(getDrainableStack()))
+ getDrainableStack().amount += mOutputFluid.amount;
+ Arrays.fill(mOutputItems, null);
+ mOutputFluid = null;
+ mEUt = 0;
+ mProgresstime = 0;
+ mMaxProgresstime = 0;
+ mStuttering = false;
+ tSucceeded = true;
+ endProcess();
+ }
+ if (mProgresstime > 5) mStuttering = false;
+ } else {
+ if (!mStuttering) {
+ stutterProcess();
+ if (canHaveInsufficientEnergy()) mProgresstime = -100;
+ mStuttering = true;
+ }
+ }
+ } else {
+ aBaseMetaTileEntity.setActive(false);
+ }
+
+ boolean tRemovedOutputFluid = false;
+
+ if (doesAutoOutputFluids() && getDrainableStack() != null
+ && aBaseMetaTileEntity.getFrontFacing() != mMainFacing
+ && (tSucceeded || aTick % 20 == 0)) {
+ IFluidHandler tTank = aBaseMetaTileEntity.getITankContainerAtSide(aBaseMetaTileEntity.getFrontFacing());
+ if (tTank != null) {
+ FluidStack tDrained = drain(1000, false);
+ if (tDrained != null) {
+ final int tFilledAmount = tTank.fill(aBaseMetaTileEntity.getBackFacing(), tDrained, false);
+ if (tFilledAmount > 0)
+ tTank.fill(aBaseMetaTileEntity.getBackFacing(), drain(tFilledAmount, true), true);
+ }
+ }
+ if (getDrainableStack() == null) tRemovedOutputFluid = true;
+ }
+
+ if (doesAutoOutput() && !isOutputEmpty()
+ && aBaseMetaTileEntity.getFrontFacing() != mMainFacing
+ && (tSucceeded || mOutputBlocked % 300 == 1
+ || aBaseMetaTileEntity.hasInventoryBeenModified()
+ || aTick % 600 == 0)) {
+ TileEntity tTileEntity2 = aBaseMetaTileEntity.getTileEntityAtSide(aBaseMetaTileEntity.getFrontFacing());
+ long tStoredEnergy = aBaseMetaTileEntity.getUniversalEnergyStored();
+ int tMaxStacks = (int) (tStoredEnergy / 64L);
+ if (tMaxStacks > mOutputItems.length) tMaxStacks = mOutputItems.length;
+
+ moveMultipleItemStacks(
+ aBaseMetaTileEntity,
+ tTileEntity2,
+ aBaseMetaTileEntity.getFrontFacing(),
+ aBaseMetaTileEntity.getBackFacing(),
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1,
+ tMaxStacks);
+ }
+
+ if (mOutputBlocked != 0) if (isOutputEmpty()) mOutputBlocked = 0;
+ else mOutputBlocked++;
+
+ if (allowToCheckRecipe()) {
+ if (mMaxProgresstime <= 0 && aBaseMetaTileEntity.isAllowedToWork()
+ && (tRemovedOutputFluid || tSucceeded
+ || aBaseMetaTileEntity.hasInventoryBeenModified()
+ || aTick % 600 == 0
+ || aBaseMetaTileEntity.hasWorkJustBeenEnabled())
+ && hasEnoughEnergyToCheckRecipe()) {
+ if (checkRecipe() == FOUND_AND_SUCCESSFULLY_USED_RECIPE) {
+ if (getSpecialSlot() != null && getSpecialSlot().stackSize <= 0)
+ mInventory[getSpecialSlotIndex()] = null;
+ for (int i = getInputSlot(), j = i + mInputSlotCount; i < j; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ for (int i = 0; i < mOutputItems.length; i++) {
+ mOutputItems[i] = GT_Utility.copyOrNull(mOutputItems[i]);
+ if (mOutputItems[i] != null && mOutputItems[i].stackSize > 64)
+ mOutputItems[i].stackSize = 64;
+ mOutputItems[i] = GT_OreDictUnificator.get(true, mOutputItems[i]);
+ }
+ if (mFluid != null && mFluid.amount <= 0) mFluid = null;
+ mMaxProgresstime = Math.max(1, mMaxProgresstime);
+ if (GT_Utility.isDebugItem(mInventory[dechargerSlotStartIndex()])) {
+ mEUt = mMaxProgresstime = 1;
+ }
+ startProcess();
+ } else {
+ mMaxProgresstime = 0;
+ Arrays.fill(mOutputItems, null);
+ mOutputFluid = null;
+ }
+ }
+ } else {
+ if (!mStuttering) {
+ stutterProcess();
+ mStuttering = true;
+ }
+ }
+ }
+ // Only using mNeedsSteamVenting right now and assigning it to 64 to space in the range for more single block
+ // machine problems.
+ // Value | Class | Field
+ // 1 | GT_MetaTileEntity_BasicMachine | mStuttering
+ // 64 | GT_MetaTileEntity_BasicMachine_Bronze | mNeedsSteamVenting
+ aBaseMetaTileEntity.setErrorDisplayID((aBaseMetaTileEntity.getErrorDisplayID() & ~127)); // | (mStuttering ? 1 :
+ // 0));
+ }
+
+ protected void doDisplayThings() {
+ if (!isValidMainFacing(mMainFacing) && isValidMainFacing(getBaseMetaTileEntity().getFrontFacing())) {
+ mMainFacing = getBaseMetaTileEntity().getFrontFacing();
+ }
+ if (isValidMainFacing(mMainFacing) && !mHasBeenUpdated) {
+ mHasBeenUpdated = true;
+ getBaseMetaTileEntity().setFrontFacing(getBaseMetaTileEntity().getBackFacing());
+ }
+ }
+
+ protected boolean hasEnoughEnergyToCheckRecipe() {
+ return getBaseMetaTileEntity().isUniversalEnergyStored(getMinimumStoredEU() / 2);
+ }
+
+ protected boolean drainEnergyForProcess(long aEUt) {
+ return getBaseMetaTileEntity().decreaseStoredEnergyUnits(aEUt, false);
+ }
+
+ /**
+ * Calculates overclock based on {@link #overclockDescriber}.
+ */
+ protected void calculateCustomOverclock(GT_Recipe recipe) {
+ GT_OverclockCalculator calculator = overclockDescriber.createCalculator(
+ new GT_OverclockCalculator().setRecipeEUt(recipe.mEUt)
+ .setDuration(recipe.mDuration)
+ .setOneTickDiscount(true),
+ recipe);
+ calculator.calculate();
+ mEUt = (int) calculator.getConsumption();
+ mMaxProgresstime = calculator.getDuration();
+ }
+
+ /**
+ * Helper method for calculating simple overclock.
+ */
+ protected void calculateOverclockedNess(int eut, int duration) {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(eut)
+ .setEUt(V[mTier] * mAmperage)
+ .setDuration(duration)
+ .setOneTickDiscount(true)
+ .calculate();
+ mEUt = (int) calculator.getConsumption();
+ mMaxProgresstime = calculator.getDuration();
+ }
+
+ protected ItemStack getSpecialSlot() {
+ return mInventory[getSpecialSlotIndex()];
+ }
+
+ protected ItemStack getOutputAt(int aIndex) {
+ return mInventory[getOutputSlot() + aIndex];
+ }
+
+ protected ItemStack[] getAllOutputs() {
+ ItemStack[] rOutputs = new ItemStack[mOutputItems.length];
+ for (int i = 0; i < mOutputItems.length; i++) rOutputs[i] = getOutputAt(i);
+ return rOutputs;
+ }
+
+ protected boolean canOutput(GT_Recipe aRecipe) {
+ return aRecipe != null && (aRecipe.mNeedsEmptyOutput ? isOutputEmpty() && getDrainableStack() == null
+ : canOutput(aRecipe.getFluidOutput(0)) && canOutput(aRecipe.mOutputs));
+ }
+
+ protected boolean canOutput(ItemStack... aOutputs) {
+ if (aOutputs == null) return true;
+ ItemStack[] tOutputSlots = getAllOutputs();
+ for (int i = 0; i < tOutputSlots.length && i < aOutputs.length; i++)
+ if (tOutputSlots[i] != null && aOutputs[i] != null
+ && (!GT_Utility.areStacksEqual(tOutputSlots[i], aOutputs[i], false)
+ || tOutputSlots[i].stackSize + aOutputs[i].stackSize > tOutputSlots[i].getMaxStackSize())) {
+ mOutputBlocked++;
+ return false;
+ }
+ return true;
+ }
+
+ protected boolean canOutput(FluidStack aOutput) {
+ if (aOutput == null) return true;
+ FluidStack drainableStack = getDrainableStack();
+ if (drainableStack != null && !drainableStack.isFluidEqual(aOutput)) return false;
+ return (drainableStack != null ? drainableStack.amount : 0) + aOutput.amount <= getCapacity();
+ }
+
+ protected ItemStack getInputAt(int aIndex) {
+ return mInventory[getInputSlot() + aIndex];
+ }
+
+ protected ItemStack[] getAllInputs() {
+ int tRealInputSlotCount = this.mInputSlotCount + (allowSelectCircuit() ? 1 : 0);
+ ItemStack[] rInputs = new ItemStack[tRealInputSlotCount];
+ for (int i = 0; i < mInputSlotCount; i++) rInputs[i] = getInputAt(i);
+ if (allowSelectCircuit()) rInputs[mInputSlotCount] = getStackInSlot(getCircuitSlot());
+ return rInputs;
+ }
+
+ protected boolean isOutputEmpty() {
+ boolean rIsEmpty = true;
+ for (ItemStack tOutputSlotContent : getAllOutputs()) if (tOutputSlotContent != null) {
+ rIsEmpty = false;
+ break;
+ }
+ return rIsEmpty;
+ }
+
+ @Override
+ public void onValueUpdate(byte aValue) {
+ mMainFacing = ForgeDirection.getOrientation(aValue);
+ }
+
+ @Override
+ public byte getUpdateData() {
+ return (byte) mMainFacing.ordinal();
+ }
+
+ @Override
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ super.doSound(aIndex, aX, aY, aZ);
+ if (aIndex == 8) GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_INTERRUPT_ONE, 100, 1.0F, aX, aY, aZ);
+ }
+
+ public boolean doesAutoOutput() {
+ return mItemTransfer;
+ }
+
+ public boolean doesAutoOutputFluids() {
+ return mFluidTransfer;
+ }
+
+ public boolean allowToCheckRecipe() {
+ return true;
+ }
+
+ public boolean showPipeFacing() {
+ return true;
+ }
+
+ /**
+ * Called whenever the Machine successfully started a Process, useful for Sound Effects
+ */
+ public void startProcess() {
+ //
+ }
+
+ /**
+ * Called whenever the Machine successfully finished a Process, useful for Sound Effects
+ */
+ public void endProcess() {
+ //
+ }
+
+ /**
+ * Called whenever the Machine aborted a Process, useful for Sound Effects
+ */
+ public void abortProcess() {
+ //
+ }
+
+ /**
+ * Called whenever the Machine aborted a Process but still works on it, useful for Sound Effects
+ */
+ public void stutterProcess() {
+ if (useStandardStutterSound()) sendSound((byte) 8);
+ }
+
+ /**
+ * If this Machine can have the Insufficient Energy Line Problem
+ */
+ public boolean canHaveInsufficientEnergy() {
+ return true;
+ }
+
+ public boolean useStandardStutterSound() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { "Progress:",
+ EnumChatFormatting.GREEN + GT_Utility.formatNumbers((mProgresstime / 20))
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s",
+ "Stored Energy:",
+ EnumChatFormatting.GREEN + GT_Utility.formatNumbers(getBaseMetaTileEntity().getStoredEU())
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getBaseMetaTileEntity().getEUCapacity())
+ + EnumChatFormatting.RESET
+ + " EU",
+ "Probably uses: " + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(mEUt)
+ + EnumChatFormatting.RESET
+ + " EU/t at "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(mEUt == 0 ? 0 : mAmperage)
+ + EnumChatFormatting.RESET
+ + " A" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (side == getBaseMetaTileEntity().getFrontFacing() || side == mMainFacing) {
+ if (aPlayer.isSneaking()) {
+ mDisableFilter = !mDisableFilter;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.hatch.disableFilter." + mDisableFilter));
+ } else {
+ mAllowInputFromOutputSide = !mAllowInputFromOutputSide;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ mAllowInputFromOutputSide ? GT_Utility.trans("095", "Input from Output Side allowed")
+ : GT_Utility.trans("096", "Input from Output Side forbidden"));
+ }
+ }
+ }
+
+ @Override
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide,
+ EntityPlayer entityPlayer, float aX, float aY, float aZ) {
+ if (!entityPlayer.isSneaking()) return false;
+ final boolean click = super.onSolderingToolRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ);
+ if (click) return true;
+ if (wrenchingSide != mMainFacing) return false;
+ mDisableMultiStack = !mDisableMultiStack;
+ GT_Utility.sendChatToPlayer(
+ entityPlayer,
+ StatCollector.translateToLocal("GT5U.hatch.disableMultiStack." + mDisableMultiStack));
+ return true;
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) {
+ if (side != mMainFacing) return true;
+ GT_CoverBehaviorBase<?> tBehavior = GregTech_API.getCoverBehaviorNew(aCoverID.toStack());
+ return tBehavior.isGUIClickable(
+ side,
+ GT_Utility.stackToInt(aCoverID.toStack()),
+ tBehavior.createDataObject(),
+ getBaseMetaTileEntity());
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side != mMainFacing && aIndex >= getOutputSlot() && aIndex < getOutputSlot() + mOutputItems.length;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (side == mMainFacing || aIndex < getInputSlot()
+ || aIndex >= getInputSlot() + mInputSlotCount
+ || (!mAllowInputFromOutputSide && side == aBaseMetaTileEntity.getFrontFacing())) return false;
+ for (int i = getInputSlot(), j = i + mInputSlotCount; i < j; i++)
+ if (GT_Utility.areStacksEqual(GT_OreDictUnificator.get(aStack), mInventory[i]) && mDisableMultiStack)
+ return i == aIndex;
+ return mDisableFilter || allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack);
+ }
+
+ /**
+ * Test if given stack can be inserted into specified slot. If mDisableMultiStack is false, before execution of this
+ * method it is ensured there is no such kind of item inside any input slots already. Otherwise, you don't need to
+ * check for it anyway.
+ */
+ protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return !mDisableMultiStack || mInventory[aIndex] == null;
+ }
+
+ @Override
+ public boolean allowSelectCircuit() {
+ return false;
+ }
+
+ protected final ItemStack[] appendSelectedCircuit(ItemStack... inputs) {
+ if (allowSelectCircuit()) {
+ ItemStack circuit = getStackInSlot(getCircuitSlot());
+ if (circuit != null) {
+ ItemStack[] result = Arrays.copyOf(inputs, inputs.length + 1);
+ result[inputs.length] = circuit;
+ return result;
+ }
+ }
+ return inputs;
+ }
+
+ @Override
+ public int getCircuitSlot() {
+ return 4;
+ }
+
+ @Override
+ public int getCircuitGUISlot() {
+ return 3;
+ }
+
+ @Override
+ public List<ItemStack> getConfigurationCircuits() {
+ return GregTech_API.getConfigurationCircuitList(mTier);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return null;
+ }
+
+ /**
+ * Override this to check the Recipes yourself, super calls to this could be useful if you just want to add a
+ * special case
+ * <p/>
+ * I thought about Enum too, but Enum doesn't add support for people adding other return Systems.
+ * <p/>
+ * Funny how Eclipse marks the word Enum as not correctly spelled.
+ *
+ * @return see constants above
+ */
+ public int checkRecipe() {
+ return checkRecipe(false);
+ }
+
+ public static boolean isValidForLowGravity(GT_Recipe tRecipe, int dimId) {
+ return // TODO check or get a better solution
+ DimensionManager.getProvider(dimId)
+ .getClass()
+ .getName()
+ .contains("Orbit")
+ || DimensionManager.getProvider(dimId)
+ .getClass()
+ .getName()
+ .endsWith("Space")
+ || DimensionManager.getProvider(dimId)
+ .getClass()
+ .getName()
+ .endsWith("Asteroids")
+ || DimensionManager.getProvider(dimId)
+ .getClass()
+ .getName()
+ .endsWith("SS")
+ || DimensionManager.getProvider(dimId)
+ .getClass()
+ .getName()
+ .contains("SpaceStation");
+ }
+
+ /**
+ *
+ * @param skipOC disables OverclockedNess calculation and check - if you do you must implement your own method...
+ * @return DID_NOT_FIND_RECIPE = 0, FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS = 1,
+ * FOUND_AND_SUCCESSFULLY_USED_RECIPE = 2;
+ */
+ public int checkRecipe(boolean skipOC) {
+ RecipeMap<?> tMap = getRecipeMap();
+ if (tMap == null) return DID_NOT_FIND_RECIPE;
+ GT_Recipe tRecipe = tMap.findRecipeQuery()
+ .items(getAllInputs())
+ .fluids(getFillableStack())
+ .specialSlot(getSpecialSlot())
+ .voltage(V[mTier])
+ .cachedRecipe(mLastRecipe)
+ .find();
+ if (tRecipe == null) {
+ return DID_NOT_FIND_RECIPE;
+ }
+ if (tRecipe.getMetadataOrDefault(EXPLODE, false) && getBaseMetaTileEntity() != null) {
+ getBaseMetaTileEntity().doExplosion(V[mTier] * 4);
+ return DID_NOT_FIND_RECIPE;
+ }
+ if (tRecipe.getMetadataOrDefault(ON_FIRE, false) && getBaseMetaTileEntity() != null) {
+ getBaseMetaTileEntity().setOnFire();
+ return DID_NOT_FIND_RECIPE;
+ }
+
+ if (GT_Mod.gregtechproxy.mLowGravProcessing && (tRecipe.mSpecialValue == -100 || tRecipe.mSpecialValue == -300)
+ && !isValidForLowGravity(tRecipe, getBaseMetaTileEntity().getWorld().provider.dimensionId))
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ if (tRecipe.mCanBeBuffered) mLastRecipe = tRecipe;
+ if (!canOutput(tRecipe)) {
+ mOutputBlocked++;
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ }
+ ICleanroom cleanroom = getCleanroom();
+ if (tRecipe.mSpecialValue == -200 || tRecipe.mSpecialValue == -300) {
+ if (cleanroom == null || !cleanroom.isValidCleanroom() || cleanroom.getCleanness() == 0) {
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ }
+ }
+ if (!tRecipe.isRecipeInputEqual(true, new FluidStack[] { getFillableStack() }, getAllInputs()))
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ for (int i = 0; i < mOutputItems.length; i++)
+ if (getBaseMetaTileEntity().getRandomNumber(10000) < tRecipe.getOutputChance(i))
+ mOutputItems[i] = tRecipe.getOutput(i);
+ if (tRecipe.mSpecialValue == -200 || tRecipe.mSpecialValue == -300) {
+ assert cleanroom != null;
+ for (int i = 0; i < mOutputItems.length; i++) if (mOutputItems[i] != null
+ && getBaseMetaTileEntity().getRandomNumber(10000) > cleanroom.getCleanness()) {
+ if (debugCleanroom) {
+ GT_Log.out.println(
+ "BasicMachine: Voiding output due to cleanness failure. Cleanness = "
+ + cleanroom.getCleanness());
+ }
+ mOutputItems[i] = null;
+ }
+ }
+ mOutputFluid = tRecipe.getFluidOutput(0);
+ if (!skipOC) {
+ calculateCustomOverclock(tRecipe);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ }
+ return FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ }
+
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] };
+ }
+
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] };
+ }
+
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] };
+ }
+
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] };
+ }
+
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] };
+ }
+
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] };
+ }
+
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] };
+ }
+
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1] };
+ }
+
+ public ITexture[] getBottomFacingPipeActive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getBottomFacingPipeInactive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getTopFacingPipeActive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getTopFacingPipeInactive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getSideFacingPipeActive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ public ITexture[] getSideFacingPipeInactive(byte aColor) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][aColor + 1], TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ final NBTTagCompound tag = accessor.getNBTData();
+
+ if (tag.getBoolean("stutteringSingleBlock")) {
+ currenttip.add("Status: insufficient energy");
+ } else {
+ boolean isActive = tag.getBoolean("isActiveSingleBlock");
+ if (isActive) {
+ int mEUt = tag.getInteger("eut");
+ if (!isSteampowered()) {
+ if (mEUt > 0) {
+ currenttip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.use_with_amperage",
+ GT_Utility.formatNumbers(mEUt),
+ GT_Utility.getAmperageForTier(mEUt, (byte) getInputTier()),
+ GT_Utility.getColoredTierNameFromTier((byte) getInputTier())));
+ } else if (mEUt < 0) {
+ currenttip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.produce_with_amperage",
+ GT_Utility.formatNumbers(-mEUt),
+ GT_Utility.getAmperageForTier(-mEUt, (byte) getOutputTier()),
+ GT_Utility.getColoredTierNameFromTier((byte) getOutputTier())));
+ }
+ } else {
+ if (mEUt > 0) {
+ currenttip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.use",
+ GT_Utility.formatNumbers(mEUt),
+ GT_Utility.getColoredTierNameFromVoltage(mEUt)));
+ } else if (mEUt < 0) {
+ currenttip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.produce",
+ GT_Utility.formatNumbers(-mEUt),
+ GT_Utility.getColoredTierNameFromVoltage(-mEUt)));
+ }
+ }
+ }
+ currenttip.add(
+ GT_Waila.getMachineProgressString(
+ isActive,
+ tag.getInteger("maxProgressSingleBlock"),
+ tag.getInteger("progressSingleBlock")));
+ }
+
+ currenttip.add(
+ String.format(
+ "Machine Facing: %s",
+ ForgeDirection.getOrientation(tag.getInteger("mainFacingSingleBlock"))
+ .name()));
+
+ currenttip.add(
+ String.format(
+ "Output Facing: %s",
+ ForgeDirection.getOrientation(tag.getInteger("outputFacingSingleBlock"))
+ .name()));
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+
+ tag.setInteger("progressSingleBlock", mProgresstime);
+ tag.setInteger("maxProgressSingleBlock", mMaxProgresstime);
+ tag.setInteger("mainFacingSingleBlock", mMainFacing.ordinal());
+ tag.setBoolean("stutteringSingleBlock", mStuttering);
+
+ final IGregTechTileEntity tileEntity = getBaseMetaTileEntity();
+ if (tileEntity != null) {
+ tag.setBoolean("isActiveSingleBlock", tileEntity.isActive());
+ tag.setInteger(
+ "outputFacingSingleBlock",
+ tileEntity.getFrontFacing()
+ .ordinal());
+ if (tileEntity.isActive()) tag.setInteger("eut", mEUt);
+ }
+ }
+
+ @Nonnull
+ @Override
+ public OverclockDescriber getOverclockDescriber() {
+ return overclockDescriber;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean useModularUI() {
+ return getRecipeMap() != null;
+ }
+
+ @Override
+ public int getCircuitSlotX() {
+ return 153;
+ }
+
+ @Override
+ public int getCircuitSlotY() {
+ return 63;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ if (getRecipeMap() != null) {
+ getRecipeMap().getFrontend()
+ .addGregTechLogo(builder, new Pos2d(0, 0));
+ } else {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(152, 63));
+ }
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (!isSteampowered()) {
+ builder.widget(createFluidAutoOutputButton());
+ builder.widget(createItemAutoOutputButton());
+ }
+
+ BasicUIProperties uiProperties = getUIProperties();
+ addIOSlots(builder, uiProperties);
+
+ builder.widget(createChargerSlot(79, 62));
+
+ addProgressBar(builder, uiProperties);
+
+ builder.widget(
+ createErrorStatusArea(
+ builder,
+ isSteampowered() ? GT_UITextures.PICTURE_STALLED_STEAM : GT_UITextures.PICTURE_STALLED_ELECTRICITY));
+ }
+
+ /**
+ * Override to specify UI properties if this machine doesn't work with recipemap.
+ */
+ protected BasicUIProperties getUIProperties() {
+ if (getRecipeMap() != null) {
+ BasicUIProperties originalProperties = getRecipeMap().getFrontend()
+ .getUIProperties();
+ return originalProperties.toBuilder()
+ .maxItemInputs(mInputSlotCount)
+ .maxItemOutputs(mOutputItems.length)
+ .maxFluidInputs(Math.min(originalProperties.maxFluidInputs, 1))
+ .maxFluidOutputs(Math.min(originalProperties.maxFluidOutputs, 1))
+ .build();
+ }
+ return BasicUIProperties.builder()
+ .maxItemInputs(mInputSlotCount)
+ .maxItemOutputs(mOutputItems.length)
+ .maxFluidInputs(getCapacity() != 0 ? 1 : 0)
+ .maxFluidOutputs(0)
+ .build();
+ }
+
+ /**
+ * Adds item I/O, special item, and fluid I/O slots.
+ */
+ protected void addIOSlots(ModularWindow.Builder builder, BasicUIProperties uiProperties) {
+ UIHelper.forEachSlots(
+ (i, backgrounds, pos) -> builder.widget(createItemInputSlot(i, backgrounds, pos)),
+ (i, backgrounds, pos) -> builder.widget(createItemOutputSlot(i, backgrounds, pos)),
+ (i, backgrounds, pos) -> builder.widget(createSpecialSlot(backgrounds, pos, uiProperties)),
+ (i, backgrounds, pos) -> builder.widget(createFluidInputSlot(backgrounds, pos)),
+ (i, backgrounds, pos) -> builder.widget(createFluidOutputSlot(backgrounds, pos)),
+ getGUITextureSet().getItemSlot(),
+ getGUITextureSet().getFluidSlot(),
+ uiProperties,
+ uiProperties.maxItemInputs,
+ uiProperties.maxItemOutputs,
+ uiProperties.maxFluidInputs,
+ uiProperties.maxFluidOutputs,
+ getSteamVariant(),
+ Pos2d.ZERO);
+ }
+
+ protected void addProgressBar(ModularWindow.Builder builder, BasicUIProperties uiProperties) {
+ boolean isSteamPowered = isSteampowered();
+ RecipeMap<?> recipeMap = getRecipeMap();
+ if (!isSteamPowered && uiProperties.progressBarTexture == null) {
+ if (recipeMap != null) {
+ // Require progress bar texture for machines working with recipemap, otherwise permit
+ throw new RuntimeException("Missing progressbar texture for " + recipeMap.unlocalizedName);
+ } else {
+ return;
+ }
+ }
+ if (isSteamPowered && uiProperties.progressBarTextureSteam == null) {
+ if (recipeMap != null) {
+ throw new RuntimeException("Missing steam progressbar texture for " + recipeMap.unlocalizedName);
+ } else {
+ return;
+ }
+ }
+
+ builder.widget(
+ setNEITransferRect(
+ new ProgressBar()
+ .setProgress(() -> maxProgresstime() != 0 ? (float) getProgresstime() / maxProgresstime() : 0)
+ .setTexture(
+ isSteamPowered ? uiProperties.progressBarTextureSteam.get(getSteamVariant())
+ : uiProperties.progressBarTexture.get(),
+ uiProperties.progressBarImageSize)
+ .setDirection(uiProperties.progressBarDirection)
+ .setPos(uiProperties.progressBarPos)
+ .setSize(uiProperties.progressBarSize),
+ uiProperties.neiTransferRectId));
+ addProgressBarSpecialTextures(builder, uiProperties);
+ }
+
+ /**
+ * Override this as needed instead of calling.
+ */
+ protected SlotWidget createItemInputSlot(int index, IDrawable[] backgrounds, Pos2d pos) {
+ return (SlotWidget) new SlotWidget(inventoryHandler, getInputSlot() + index).setAccess(true, true)
+ .setBackground(backgrounds)
+ .setPos(pos);
+ }
+
+ /**
+ * Override this as needed instead of calling.
+ */
+ protected SlotWidget createItemOutputSlot(int index, IDrawable[] backgrounds, Pos2d pos) {
+ return (SlotWidget) new SlotWidget(inventoryHandler, getOutputSlot() + index).setAccess(true, false)
+ .setBackground(backgrounds)
+ .setPos(pos);
+ }
+
+ /**
+ * Override this as needed instead of calling.
+ */
+ protected SlotWidget createSpecialSlot(IDrawable[] backgrounds, Pos2d pos, BasicUIProperties uiProperties) {
+ return (SlotWidget) new SlotWidget(inventoryHandler, getSpecialSlotIndex()).setAccess(true, true)
+ .disableShiftInsert()
+ .setGTTooltip(
+ () -> mTooltipCache.getData(uiProperties.useSpecialSlot ? SPECIAL_SLOT_TOOLTIP : UNUSED_SLOT_TOOLTIP))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setBackground(backgrounds)
+ .setPos(pos);
+ }
+
+ protected FluidSlotWidget createFluidInputSlot(IDrawable[] backgrounds, Pos2d pos) {
+ return (FluidSlotWidget) new FluidSlotWidget(fluidTank).setBackground(backgrounds)
+ .setPos(pos);
+ }
+
+ protected FluidSlotWidget createFluidOutputSlot(IDrawable[] backgrounds, Pos2d pos) {
+ return (FluidSlotWidget) new FluidSlotWidget(fluidOutputTank).setInteraction(true, false)
+ .setBackground(backgrounds)
+ .setPos(pos);
+ }
+
+ @Override
+ protected SlotWidget createChargerSlot(int x, int y) {
+ if (isSteampowered()) {
+ return (SlotWidget) createChargerSlot(x, y, UNUSED_SLOT_TOOLTIP, new String[0])
+ .setBackground(getGUITextureSet().getItemSlot());
+ } else {
+ return super.createChargerSlot(x, y);
+ }
+ }
+
+ protected CycleButtonWidget createItemAutoOutputButton() {
+ return (CycleButtonWidget) new CycleButtonWidget().setToggle(() -> mItemTransfer, val -> mItemTransfer = val)
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_AUTOOUTPUT_ITEM)
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setGTTooltip(() -> mTooltipCache.getData(ITEM_TRANSFER_TOOLTIP))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(25, 62)
+ .setSize(18, 18);
+ }
+
+ protected CycleButtonWidget createFluidAutoOutputButton() {
+ return (CycleButtonWidget) new CycleButtonWidget().setToggle(() -> mFluidTransfer, val -> mFluidTransfer = val)
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_AUTOOUTPUT_FLUID)
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setGTTooltip(() -> mTooltipCache.getData(FLUID_TRANSFER_TOOLTIP))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(7, 62)
+ .setSize(18, 18);
+ }
+
+ protected Widget setNEITransferRect(Widget widget, String transferRectID) {
+ if (GT_Utility.isStringInvalid(transferRectID)) {
+ return widget;
+ }
+ final String transferRectTooltip;
+ if (isSteampowered()) {
+ transferRectTooltip = StatCollector
+ .translateToLocalFormatted(NEI_TRANSFER_STEAM_TOOLTIP, overclockDescriber.getTierString());
+ } else {
+ transferRectTooltip = StatCollector
+ .translateToLocalFormatted(NEI_TRANSFER_VOLTAGE_TOOLTIP, overclockDescriber.getTierString());
+ }
+ widget.setNEITransferRect(transferRectID, new Object[] { overclockDescriber }, transferRectTooltip);
+ return widget;
+ }
+
+ protected void addProgressBarSpecialTextures(ModularWindow.Builder builder, BasicUIProperties uiProperties) {
+ if (isSteampowered()) {
+ for (Pair<SteamTexture, Pair<Size, Pos2d>> specialTexture : uiProperties.specialTexturesSteam) {
+ builder.widget(
+ new DrawableWidget().setDrawable(
+ specialTexture.getLeft()
+ .get(getSteamVariant()))
+ .setSize(
+ specialTexture.getRight()
+ .getLeft())
+ .setPos(
+ specialTexture.getRight()
+ .getRight()));
+ }
+ } else {
+ for (Pair<IDrawable, Pair<Size, Pos2d>> specialTexture : uiProperties.specialTextures) {
+ builder.widget(
+ new DrawableWidget().setDrawable(specialTexture.getLeft())
+ .setSize(
+ specialTexture.getRight()
+ .getLeft())
+ .setPos(
+ specialTexture.getRight()
+ .getRight()));
+ }
+ }
+ }
+
+ protected DrawableWidget createErrorStatusArea(ModularWindow.Builder builder, IDrawable picture) {
+ return (DrawableWidget) new DrawableWidget().setDrawable(picture)
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setEnabled(
+ widget -> !widget.getTooltip()
+ .isEmpty())
+ .dynamicTooltip(this::getErrorDescriptions)
+ .dynamicTooltipShift(this::getErrorDescriptionsShift)
+ .setPos(79, 44)
+ .setSize(18, 18)
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(() -> mStuttering, val -> mStuttering = val),
+ builder,
+ (widget, val) -> widget.notifyTooltipChange())
+ .attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(
+ () -> getBaseMetaTileEntity().getErrorDisplayID(),
+ val -> getBaseMetaTileEntity().setErrorDisplayID(val)),
+ builder,
+ (widget, val) -> widget.notifyTooltipChange());
+ }
+
+ protected List<String> getErrorDescriptions() {
+ final GT_TooltipDataCache.TooltipData tooltip = getErrorTooltip();
+ return tooltip != null ? tooltip.text : Collections.emptyList();
+ }
+
+ protected List<String> getErrorDescriptionsShift() {
+ final GT_TooltipDataCache.TooltipData tooltip = getErrorTooltip();
+ return tooltip != null ? tooltip.shiftText : Collections.emptyList();
+ }
+
+ protected GT_TooltipDataCache.TooltipData getErrorTooltip() {
+ if (isSteampowered()) {
+ if ((getBaseMetaTileEntity().getErrorDisplayID() & 64) != 0) {
+ return mTooltipCache.getData(STALLED_VENT_TOOLTIP);
+ }
+ }
+ if (mStuttering) {
+ return mTooltipCache.getData(
+ STALLED_STUTTERING_TOOLTIP,
+ StatCollector.translateToLocal(POWER_SOURCE_KEY + (isSteampowered() ? "steam" : "power")));
+ }
+ return null;
+ }
+
+ protected static int getCapacityForTier(int tier) {
+ return switch (tier) {
+ case 0 -> 8000;
+ case 1 -> 16000;
+ case 2 -> 32000;
+ case 3 -> 64000;
+ case 4 -> 128000;
+ default -> 256000;
+ };
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java
new file mode 100644
index 0000000000..5eb648d560
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java
@@ -0,0 +1,387 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.D1;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZE_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZE_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZE_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import java.util.Arrays;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.enums.TierEU;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.objects.overclockdescriber.SteamOverclockDescriber;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple
+ * Machine
+ */
+public abstract class GT_MetaTileEntity_BasicMachine_Bronze extends GT_MetaTileEntity_BasicMachine {
+
+ private static final String TT_machineType = "GT5U.MBTT.MachineType";
+ private static final int NEEDS_STEAM_VENTING = 64;
+ public boolean mNeedsSteamVenting = false;
+
+ public GT_MetaTileEntity_BasicMachine_Bronze(int aID, String aName, String aNameRegional, String aDescription,
+ int aInputSlotCount, int aOutputSlotCount, boolean aHighPressure) {
+ super(aID, aName, aNameRegional, aHighPressure ? 2 : 1, 0, aDescription, aInputSlotCount, aOutputSlotCount);
+ }
+
+ public GT_MetaTileEntity_BasicMachine_Bronze(String aName, String[] aDescription, ITexture[][][] aTextures,
+ int aInputSlotCount, int aOutputSlotCount, boolean aHighPressure) {
+ super(aName, aHighPressure ? 2 : 1, 0, aDescription, aTextures, aInputSlotCount, aOutputSlotCount);
+ }
+
+ protected boolean isBricked() {
+ return false;
+ }
+
+ @Override
+ public OverclockDescriber createOverclockDescriber() {
+ return new SteamOverclockDescriber(SteamVariant.BRONZE, 1, 2);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mNeedsSteamVenting", mNeedsSteamVenting);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mNeedsSteamVenting = aNBT.getBoolean("mNeedsSteamVenting");
+ }
+
+ @Override
+ public boolean isElectric() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 0;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return 0;
+ }
+
+ @Override
+ public boolean isSteampowered() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return super.isFacingValid(facing) && facing != mMainFacing;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 1000;
+ }
+
+ @Override
+ public long maxSteamStore() {
+ return 16000;
+ }
+
+ @Override
+ public boolean isLiquidInput(ForgeDirection side) {
+ return side != mMainFacing;
+ }
+
+ @Override
+ public boolean isLiquidOutput(ForgeDirection side) {
+ return side != mMainFacing;
+ }
+
+ @Override
+ public boolean doesAutoOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean allowToCheckRecipe() {
+ if (mNeedsSteamVenting
+ && getBaseMetaTileEntity().getCoverIDAtSide(getBaseMetaTileEntity().getFrontFacing()) == 0
+ && !GT_Utility.hasBlockHitBox(
+ getBaseMetaTileEntity().getWorld(),
+ getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 1),
+ getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 1),
+ getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 1))) {
+ sendSound((byte) 9);
+ mNeedsSteamVenting = false;
+ try {
+ for (EntityLivingBase tLiving : getBaseMetaTileEntity().getWorld()
+ .getEntitiesWithinAABB(
+ EntityLivingBase.class,
+ AxisAlignedBB.getBoundingBox(
+ getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 1),
+ getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 1),
+ getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 1),
+ getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 1) + 1,
+ getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 1) + 1,
+ getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 1) + 1))) {
+ GT_Utility.applyHeatDamage(tLiving, getSteamDamage());
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ }
+ return !mNeedsSteamVenting;
+ }
+
+ @Override
+ public int checkRecipe() {
+ GT_Recipe tRecipe = getRecipeMap().findRecipe(getBaseMetaTileEntity(), false, TierEU.LV, null, getAllInputs());
+ if ((tRecipe != null) && (canOutput(tRecipe.mOutputs))
+ && (tRecipe.isRecipeInputEqual(true, null, getAllInputs()))) {
+ this.mOutputItems[0] = tRecipe.getOutput(0);
+ calculateCustomOverclock(tRecipe);
+ return FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ }
+ return DID_NOT_FIND_RECIPE;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ // Super already zeroed out setErrorDisplayID, add additional error codes here.
+ aBaseMetaTileEntity.setErrorDisplayID(aBaseMetaTileEntity.getErrorDisplayID() | (mNeedsSteamVenting ? 64 : 0));
+ }
+
+ @Override
+ public void endProcess() {
+ if (isSteampowered()) mNeedsSteamVenting = true;
+ }
+
+ @Override
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ super.doSound(aIndex, aX, aY, aZ);
+ if (aIndex == 9) {
+ GT_Utility.doSoundAtClient(SoundResource.RANDOM_FIZZ, 5, 1.0F, aX, aY, aZ);
+
+ new ParticleEventBuilder().setIdentifier(ParticleFX.CLOUD)
+ .setWorld(getBaseMetaTileEntity().getWorld())
+ .setMotion(
+ getBaseMetaTileEntity().getFrontFacing().offsetX / 5.0,
+ getBaseMetaTileEntity().getFrontFacing().offsetY / 5.0,
+ getBaseMetaTileEntity().getFrontFacing().offsetZ / 5.0)
+ .<ParticleEventBuilder>times(
+ 8,
+ x -> x
+ .setPosition(
+ aX - 0.5 + XSTR_INSTANCE.nextFloat(),
+ aY - 0.5 + XSTR_INSTANCE.nextFloat(),
+ aZ - 0.5 + XSTR_INSTANCE.nextFloat())
+ .run());
+ }
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return false;
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) {
+ return GregTech_API.getCoverBehaviorNew(aCoverID.toStack())
+ .isSimpleCover() && super.allowCoverOnSide(side, aCoverID);
+ }
+
+ public float getSteamDamage() {
+ return 6.0F * mTier;
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_TOP : MACHINE_BRONZE_TOP,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_TOP : MACHINE_BRONZE_TOP,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_BOTTOM : MACHINE_BRONZE_BOTTOM,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_BOTTOM : MACHINE_BRONZE_BOTTOM,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingPipeActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_BOTTOM : MACHINE_BRONZE_BOTTOM,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingPipeInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_BOTTOM : MACHINE_BRONZE_BOTTOM,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getTopFacingPipeActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_TOP : MACHINE_BRONZE_TOP,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getTopFacingPipeInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_TOP : MACHINE_BRONZE_TOP,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getSideFacingPipeActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getSideFacingPipeInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_BRONZEBRICKS_SIDE : MACHINE_BRONZE_SIDE,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public SteamVariant getSteamVariant() {
+ return SteamVariant.BRONZE;
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return GUITextureSet.STEAM.apply(getSteamVariant());
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(152, 63));
+ }
+
+ @Override
+ protected FluidSlotWidget createFluidInputSlot(IDrawable[] backgrounds, Pos2d pos) {
+ return null;
+ }
+
+ @Override
+ protected FluidSlotWidget createFluidOutputSlot(IDrawable[] backgrounds, Pos2d pos) {
+ return null;
+ }
+
+ @Override
+ public String[] getDescription() {
+ String[] description = Arrays.copyOf(mDescriptionArray, mDescriptionArray.length + 1);
+ description[mDescriptionArray.length] = StatCollector.translateToLocal(TT_machineType) + ": "
+ + EnumChatFormatting.YELLOW
+ + StatCollector.translateToLocal(this.getRecipeMap().unlocalizedName)
+ + EnumChatFormatting.RESET;
+ return description;
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_GT_Recipe.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_GT_Recipe.java
new file mode 100644
index 0000000000..8bba0fee25
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_GT_Recipe.java
@@ -0,0 +1,820 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.enums.GT_Values.W;
+import static gregtech.api.enums.GT_Values.ticksBetweenSounds;
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+import static net.minecraftforge.common.util.ForgeDirection.UP;
+
+import java.util.Locale;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures.BlockIcons.CustomIcon;
+import gregtech.api.enums.Tier;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.recipe.BasicUIProperties;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.ExternalMaterials;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder;
+import ic2.core.Ic2Items;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple
+ * Machine
+ */
+public class GT_MetaTileEntity_BasicMachine_GT_Recipe extends GT_MetaTileEntity_BasicMachine {
+
+ private final RecipeMap<?> mRecipes;
+ private final int mTankCapacity;
+ private final SpecialEffects mSpecialEffect;
+ private final ResourceLocation mSoundResourceLocation;
+ private FallbackableUITexture progressBarTexture;
+ private int recipeCatalystPriority;
+
+ /**
+ * Registers machine with single-line description, specific tank capacity, and sound specified by ResourceLocation.
+ */
+ public GT_MetaTileEntity_BasicMachine_GT_Recipe(int aID, String aName, String aNameRegional, int aTier,
+ String aDescription, RecipeMap<?> aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity,
+ ResourceLocation aSound, SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) {
+ this(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ new String[] { aDescription },
+ aRecipes,
+ aInputSlots,
+ aOutputSlots,
+ aTankCapacity,
+ aSound,
+ aSpecialEffect,
+ aOverlays,
+ aRecipe);
+ }
+
+ /**
+ * Registers machine with multi-line descriptions, specific tank capacity, and sound specified by ResourceLocation.
+ */
+ public GT_MetaTileEntity_BasicMachine_GT_Recipe(int aID, String aName, String aNameRegional, int aTier,
+ String[] aDescription, RecipeMap<?> aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity,
+ ResourceLocation aSound, SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ aRecipes.getAmperage(),
+ aDescription,
+ aInputSlots,
+ aOutputSlots,
+ TextureFactory.of(
+ TextureFactory.of(
+ new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_SIDE_ACTIVE")),
+ TextureFactory.builder()
+ .addIcon(
+ (new CustomIcon(
+ "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_SIDE_ACTIVE_GLOW")))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory
+ .of(new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_SIDE")),
+ TextureFactory.builder()
+ .addIcon(
+ (new CustomIcon(
+ "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_SIDE_GLOW")))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(
+ new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_FRONT_ACTIVE")),
+ TextureFactory.builder()
+ .addIcon(
+ (new CustomIcon(
+ "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_FRONT_ACTIVE_GLOW")))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory
+ .of(new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_FRONT")),
+ TextureFactory.builder()
+ .addIcon(
+ (new CustomIcon(
+ "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_FRONT_GLOW")))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(
+ new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_TOP_ACTIVE")),
+ TextureFactory.builder()
+ .addIcon(
+ (new CustomIcon(
+ "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_TOP_ACTIVE_GLOW")))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory
+ .of(new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_TOP")),
+ TextureFactory.builder()
+ .addIcon(
+ (new CustomIcon(
+ "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_TOP_GLOW")))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(
+ new CustomIcon(
+ "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_BOTTOM_ACTIVE")),
+ TextureFactory.builder()
+ .addIcon(
+ (new CustomIcon(
+ "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_BOTTOM_ACTIVE_GLOW")))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory
+ .of(new CustomIcon("basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_BOTTOM")),
+ TextureFactory.builder()
+ .addIcon(
+ (new CustomIcon(
+ "basicmachines/" + aOverlays.toLowerCase(Locale.ENGLISH) + "/OVERLAY_BOTTOM_GLOW")))
+ .glow()
+ .build()));
+ this.mTankCapacity = aTankCapacity;
+ this.mSpecialEffect = aSpecialEffect;
+ this.mRecipes = aRecipes;
+ this.mSoundResourceLocation = aSound;
+ this.progressBarTexture = mRecipes.getFrontend()
+ .getUIProperties().progressBarTexture;
+
+ // TODO: CHECK
+ if (aRecipe != null) {
+ for (int i = 3; i < aRecipe.length; i++) {
+ if (!(aRecipe[i] instanceof X)) continue;
+
+ // spotless:off
+ aRecipe[i] = switch ((X) aRecipe[i]) {
+ case CIRCUIT -> Tier.ELECTRIC[this.mTier].mManagingObject;
+ case BETTER_CIRCUIT -> Tier.ELECTRIC[this.mTier].mBetterManagingObject;
+ case HULL -> Tier.ELECTRIC[this.mTier].mHullObject;
+ case WIRE -> Tier.ELECTRIC[this.mTier].mConductingObject;
+ case WIRE4 -> Tier.ELECTRIC[this.mTier].mLargerConductingObject;
+ case STICK_DISTILLATION -> OrePrefixes.stick.get(Materials.Blaze);
+
+ case GLASS -> switch (this.mTier) {
+ case 0, 1, 2, 3 -> new ItemStack(Blocks.glass, 1, W);
+ case 4, 5, 6, 7, 8 -> BartWorks.isModLoaded() ? "blockGlass" + VN[aTier] : Ic2Items.reinforcedGlass;
+ default -> BartWorks.isModLoaded() ? "blockGlass" + VN[8] : Ic2Items.reinforcedGlass;
+ };
+
+ case PLATE -> switch (this.mTier) {
+ case 0, 1 -> OrePrefixes.plate.get(Materials.Steel);
+ case 2 -> OrePrefixes.plate.get(Materials.Aluminium);
+ case 3 -> OrePrefixes.plate.get(Materials.StainlessSteel);
+ case 4 -> OrePrefixes.plate.get(Materials.Titanium);
+ case 5 -> OrePrefixes.plate.get(Materials.TungstenSteel);
+ case 6 -> OrePrefixes.plate.get(Materials.HSSG);
+ case 7 -> OrePrefixes.plate.get(Materials.HSSE);
+ default -> OrePrefixes.plate.get(Materials.Neutronium);
+ };
+
+ case PIPE -> switch (this.mTier) {
+ case 0, 1 -> OrePrefixes.pipeMedium.get(Materials.Bronze);
+ case 2 -> OrePrefixes.pipeMedium.get(Materials.Steel);
+ case 3 -> OrePrefixes.pipeMedium.get(Materials.StainlessSteel);
+ case 4 -> OrePrefixes.pipeMedium.get(Materials.Titanium);
+ case 5 -> OrePrefixes.pipeMedium.get(Materials.TungstenSteel);
+ case 6 -> OrePrefixes.pipeSmall.get(Materials.Ultimate);
+ case 7 -> OrePrefixes.pipeMedium.get(Materials.Ultimate);
+ case 8 -> OrePrefixes.pipeLarge.get(Materials.Ultimate);
+ default -> OrePrefixes.pipeHuge.get(Materials.Ultimate);
+ };
+
+ case COIL_HEATING -> switch (this.mTier) {
+ case 0, 1 -> OrePrefixes.wireGt02.get(Materials.AnyCopper);
+ case 2 -> OrePrefixes.wireGt02.get(Materials.Cupronickel);
+ case 3 -> OrePrefixes.wireGt02.get(Materials.Kanthal);
+ case 4 -> OrePrefixes.wireGt02.get(Materials.Nichrome);
+ case 5 -> OrePrefixes.wireGt02.get(Materials.TPV);
+ case 6 -> OrePrefixes.wireGt02.get(Materials.HSSG);
+ case 7 -> OrePrefixes.wireGt02.get(Materials.Naquadah);
+ case 8 -> OrePrefixes.wireGt02.get(Materials.NaquadahAlloy);
+ case 9 -> OrePrefixes.wireGt04.get(Materials.NaquadahAlloy);
+ default -> OrePrefixes.wireGt08.get(Materials.NaquadahAlloy);
+ };
+
+ case COIL_HEATING_DOUBLE -> switch (this.mTier) {
+ case 0, 1 -> OrePrefixes.wireGt04.get(Materials.AnyCopper);
+ case 2 -> OrePrefixes.wireGt04.get(Materials.Cupronickel);
+ case 3 -> OrePrefixes.wireGt04.get(Materials.Kanthal);
+ case 4 -> OrePrefixes.wireGt04.get(Materials.Nichrome);
+ case 5 -> OrePrefixes.wireGt04.get(Materials.TPV);
+ case 6 -> OrePrefixes.wireGt04.get(Materials.HSSG);
+ case 7 -> OrePrefixes.wireGt04.get(Materials.Naquadah);
+ case 8 -> OrePrefixes.wireGt04.get(Materials.NaquadahAlloy);
+ case 9 -> OrePrefixes.wireGt08.get(Materials.NaquadahAlloy);
+ default -> OrePrefixes.wireGt16.get(Materials.NaquadahAlloy);
+ };
+
+ case STICK_MAGNETIC -> switch (this.mTier) {
+ case 0, 1 -> OrePrefixes.stick.get(Materials.IronMagnetic);
+ case 2, 3 -> OrePrefixes.stick.get(Materials.SteelMagnetic);
+ case 4, 5 -> OrePrefixes.stick.get(Materials.NeodymiumMagnetic);
+ case 6, 7, 8, 9 -> OrePrefixes.stick.get(Materials.SamariumMagnetic);
+ default -> OrePrefixes.stick.get(Materials.TengamAttuned);
+ };
+
+ case STICK_ELECTROMAGNETIC -> switch (this.mTier) {
+ case 0, 1 -> OrePrefixes.stick.get(Materials.AnyIron);
+ case 2, 3 -> OrePrefixes.stick.get(Materials.Steel);
+ case 4 -> OrePrefixes.stick.get(Materials.Neodymium);
+ default -> OrePrefixes.stick.get(Materials.VanadiumGallium);
+ };
+
+ case COIL_ELECTRIC -> switch (this.mTier) {
+ case 0 -> OrePrefixes.wireGt01.get(Materials.Lead);
+ case 1 -> OrePrefixes.wireGt02.get(Materials.Tin);
+ case 2 -> OrePrefixes.wireGt02.get(Materials.AnyCopper);
+ case 3 -> OrePrefixes.wireGt04.get(Materials.AnyCopper);
+ case 4 -> OrePrefixes.wireGt08.get(Materials.AnnealedCopper);
+ case 5 -> OrePrefixes.wireGt16.get(Materials.AnnealedCopper);
+ case 6 -> OrePrefixes.wireGt04.get(Materials.YttriumBariumCuprate);
+ case 7 -> OrePrefixes.wireGt08.get(Materials.Iridium);
+ default -> OrePrefixes.wireGt16.get(Materials.Osmium);
+ };
+
+ case ROBOT_ARM -> switch (this.mTier) {
+ case 0, 1 -> ItemList.Robot_Arm_LV;
+ case 2 -> ItemList.Robot_Arm_MV;
+ case 3 -> ItemList.Robot_Arm_HV;
+ case 4 -> ItemList.Robot_Arm_EV;
+ case 5 -> ItemList.Robot_Arm_IV;
+ case 6 -> ItemList.Robot_Arm_LuV;
+ case 7 -> ItemList.Robot_Arm_ZPM;
+ case 8 -> ItemList.Robot_Arm_UV;
+ case 9 -> ItemList.Robot_Arm_UHV;
+ case 10 -> ItemList.Robot_Arm_UEV;
+ case 11 -> ItemList.Robot_Arm_UIV;
+ case 12 -> ItemList.Robot_Arm_UMV;
+ case 13 -> ItemList.Robot_Arm_UXV;
+ default -> ItemList.Robot_Arm_MAX;
+ };
+
+ case PUMP -> switch (this.mTier) {
+ case 0, 1 -> ItemList.Electric_Pump_LV;
+ case 2 -> ItemList.Electric_Pump_MV;
+ case 3 -> ItemList.Electric_Pump_HV;
+ case 4 -> ItemList.Electric_Pump_EV;
+ case 5 -> ItemList.Electric_Pump_IV;
+ case 6 -> ItemList.Electric_Pump_LuV;
+ case 7 -> ItemList.Electric_Pump_ZPM;
+ case 8 -> ItemList.Electric_Pump_UV;
+ case 9 -> ItemList.Electric_Pump_UHV;
+ case 10 -> ItemList.Electric_Pump_UEV;
+ case 11 -> ItemList.Electric_Pump_UIV;
+ case 12 -> ItemList.Electric_Pump_UMV;
+ case 13 -> ItemList.Electric_Pump_UXV;
+ default -> ItemList.Electric_Pump_MAX;
+ };
+
+ case MOTOR -> switch (this.mTier) {
+ case 0, 1 -> ItemList.Electric_Motor_LV;
+ case 2 -> ItemList.Electric_Motor_MV;
+ case 3 -> ItemList.Electric_Motor_HV;
+ case 4 -> ItemList.Electric_Motor_EV;
+ case 5 -> ItemList.Electric_Motor_IV;
+ case 6 -> ItemList.Electric_Motor_LuV;
+ case 7 -> ItemList.Electric_Motor_ZPM;
+ case 8 -> ItemList.Electric_Motor_UV;
+ case 9 -> ItemList.Electric_Motor_UHV;
+ case 10 -> ItemList.Electric_Motor_UEV;
+ case 11 -> ItemList.Electric_Motor_UIV;
+ case 12 -> ItemList.Electric_Motor_UMV;
+ case 13 -> ItemList.Electric_Motor_UXV;
+ default -> ItemList.Electric_Motor_MAX;
+ };
+
+ case PISTON -> switch (this.mTier) {
+ case 0, 1 -> ItemList.Electric_Piston_LV;
+ case 2 -> ItemList.Electric_Piston_MV;
+ case 3 -> ItemList.Electric_Piston_HV;
+ case 4 -> ItemList.Electric_Piston_EV;
+ case 5 -> ItemList.Electric_Piston_IV;
+ case 6 -> ItemList.Electric_Piston_LuV;
+ case 7 -> ItemList.Electric_Piston_ZPM;
+ case 8 -> ItemList.Electric_Piston_UV;
+ case 9 -> ItemList.Electric_Piston_UHV;
+ case 10 -> ItemList.Electric_Piston_UEV;
+ case 11 -> ItemList.Electric_Piston_UIV;
+ case 12 -> ItemList.Electric_Piston_UMV;
+ case 13 -> ItemList.Electric_Piston_UXV;
+ default -> ItemList.Electric_Piston_MAX;
+ };
+
+ case CONVEYOR -> switch (this.mTier) {
+ case 0, 1 -> ItemList.Conveyor_Module_LV;
+ case 2 -> ItemList.Conveyor_Module_MV;
+ case 3 -> ItemList.Conveyor_Module_HV;
+ case 4 -> ItemList.Conveyor_Module_EV;
+ case 5 -> ItemList.Conveyor_Module_IV;
+ case 6 -> ItemList.Conveyor_Module_LuV;
+ case 7 -> ItemList.Conveyor_Module_ZPM;
+ case 8 -> ItemList.Conveyor_Module_UV;
+ case 9 -> ItemList.Conveyor_Module_UHV;
+ case 10 -> ItemList.Conveyor_Module_UEV;
+ case 11 -> ItemList.Conveyor_Module_UIV;
+ case 12 -> ItemList.Conveyor_Module_UMV;
+ case 13 -> ItemList.Conveyor_Module_UXV;
+ default -> ItemList.Conveyor_Module_MAX;
+ };
+
+ case EMITTER -> switch (this.mTier) {
+ case 0, 1 -> ItemList.Emitter_LV;
+ case 2 -> ItemList.Emitter_MV;
+ case 3 -> ItemList.Emitter_HV;
+ case 4 -> ItemList.Emitter_EV;
+ case 5 -> ItemList.Emitter_IV;
+ case 6 -> ItemList.Emitter_LuV;
+ case 7 -> ItemList.Emitter_ZPM;
+ case 8 -> ItemList.Emitter_UV;
+ case 9 -> ItemList.Emitter_UHV;
+ case 10 -> ItemList.Emitter_UEV;
+ case 11 -> ItemList.Emitter_UIV;
+ case 12 -> ItemList.Emitter_UMV;
+ case 13 -> ItemList.Emitter_UXV;
+ default -> ItemList.Emitter_MAX;
+ };
+
+ case SENSOR -> switch (this.mTier) {
+ case 0, 1 -> ItemList.Sensor_LV;
+ case 2 -> ItemList.Sensor_MV;
+ case 3 -> ItemList.Sensor_HV;
+ case 4 -> ItemList.Sensor_EV;
+ case 5 -> ItemList.Sensor_IV;
+ case 6 -> ItemList.Sensor_LuV;
+ case 7 -> ItemList.Sensor_ZPM;
+ case 8 -> ItemList.Sensor_UV;
+ case 9 -> ItemList.Sensor_UHV;
+ case 10 -> ItemList.Sensor_UEV;
+ case 11 -> ItemList.Sensor_UIV;
+ case 12 -> ItemList.Sensor_UMV;
+ case 13 -> ItemList.Sensor_UXV;
+ default -> ItemList.Sensor_MAX;
+ };
+
+ case FIELD_GENERATOR -> switch (this.mTier) {
+ case 0, 1 -> ItemList.Field_Generator_LV;
+ case 2 -> ItemList.Field_Generator_MV;
+ case 3 -> ItemList.Field_Generator_HV;
+ case 4 -> ItemList.Field_Generator_EV;
+ case 5 -> ItemList.Field_Generator_IV;
+ case 6 -> ItemList.Field_Generator_LuV;
+ case 7 -> ItemList.Field_Generator_ZPM;
+ case 8 -> ItemList.Field_Generator_UV;
+ case 9 -> ItemList.Field_Generator_UHV;
+ case 10 -> ItemList.Field_Generator_UEV;
+ case 11 -> ItemList.Field_Generator_UIV;
+ case 12 -> ItemList.Field_Generator_UMV;
+ case 13 -> ItemList.Field_Generator_UXV;
+ default -> ItemList.Field_Generator_MAX;
+ };
+
+ case ROTOR -> switch (this.mTier) {
+ case 0, 1 -> OrePrefixes.rotor.get(Materials.Tin);
+ case 2 -> OrePrefixes.rotor.get(Materials.Bronze);
+ case 3 -> OrePrefixes.rotor.get(Materials.Steel);
+ case 4 -> OrePrefixes.rotor.get(Materials.StainlessSteel);
+ case 5 -> OrePrefixes.rotor.get(Materials.TungstenSteel);
+ case 6 -> OrePrefixes.rotor.get(ExternalMaterials.getRhodiumPlatedPalladium());
+ case 7 -> OrePrefixes.rotor.get(Materials.Iridium);
+ default -> OrePrefixes.rotor.get(Materials.Osmium);
+ };
+
+ default -> throw new IllegalArgumentException("MISSING TIER MAPPING FOR: " + aRecipe[i] + " AT TIER " + this.mTier);
+ };
+ // spotless:on
+ }
+
+ if (!GT_ModHandler.addCraftingRecipe(
+ getStackForm(1),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.BUFFERED
+ | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ aRecipe)) {
+ throw new IllegalArgumentException("INVALID CRAFTING RECIPE FOR: " + getStackForm(1).getDisplayName());
+ }
+ }
+ }
+
+ /**
+ * Registers machine with single-line description, auto-scaled fluid tank, and sound specified by SoundResource.
+ */
+ public GT_MetaTileEntity_BasicMachine_GT_Recipe(int aID, String aName, String aNameRegional, int aTier,
+ String aDescription, RecipeMap<?> aRecipes, int aInputSlots, int aOutputSlots, boolean usesFluids,
+ SoundResource aSound, SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) {
+ this(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ aDescription,
+ aRecipes,
+ aInputSlots,
+ aOutputSlots,
+ usesFluids ? getCapacityForTier(aTier) : 0,
+ aSound.resourceLocation,
+ aSpecialEffect,
+ aOverlays,
+ aRecipe);
+ }
+
+ /**
+ * Registers machine with multi-line descriptions, auto-scaled fluid tank, and sound specified by SoundResource.
+ */
+ public GT_MetaTileEntity_BasicMachine_GT_Recipe(int aID, String aName, String aNameRegional, int aTier,
+ String[] aDescription, RecipeMap<?> aRecipes, int aInputSlots, int aOutputSlots, boolean usesFluids,
+ SoundResource aSound, SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) {
+ this(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ aDescription,
+ aRecipes,
+ aInputSlots,
+ aOutputSlots,
+ usesFluids ? getCapacityForTier(aTier) : 0,
+ aSound.resourceLocation,
+ aSpecialEffect,
+ aOverlays,
+ aRecipe);
+ }
+
+ /**
+ * Registers machine with single-line description, specific tank capacity, and sound specified by SoundResource.
+ */
+ public GT_MetaTileEntity_BasicMachine_GT_Recipe(int aID, String aName, String aNameRegional, int aTier,
+ String aDescription, RecipeMap<?> aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity,
+ SoundResource aSound, SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) {
+ this(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ aDescription,
+ aRecipes,
+ aInputSlots,
+ aOutputSlots,
+ aTankCapacity,
+ aSound.resourceLocation,
+ aSpecialEffect,
+ aOverlays,
+ aRecipe);
+ }
+
+ /**
+ * Registers machine with multi-line descriptions, specific tank capacity, and sound specified by SoundResource.
+ */
+ public GT_MetaTileEntity_BasicMachine_GT_Recipe(int aID, String aName, String aNameRegional, int aTier,
+ String[] aDescription, RecipeMap<?> aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity,
+ SoundResource aSound, SpecialEffects aSpecialEffect, String aOverlays, Object[] aRecipe) {
+ this(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ aDescription,
+ aRecipes,
+ aInputSlots,
+ aOutputSlots,
+ aTankCapacity,
+ aSound.resourceLocation,
+ aSpecialEffect,
+ aOverlays,
+ aRecipe);
+ }
+
+ /**
+ * For {@link #newMetaEntity}.
+ */
+ public GT_MetaTileEntity_BasicMachine_GT_Recipe(String aName, int aTier, String[] aDescription,
+ RecipeMap<?> aRecipes, int aInputSlots, int aOutputSlots, int aTankCapacity, int aAmperage,
+ ITexture[][][] aTextures, ResourceLocation aSound, SpecialEffects aSpecialEffect) {
+ super(aName, aTier, aAmperage, aDescription, aTextures, aInputSlots, aOutputSlots);
+ this.mTankCapacity = aTankCapacity;
+ this.mSpecialEffect = aSpecialEffect;
+ this.mRecipes = aRecipes;
+ this.mSoundResourceLocation = aSound;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mRecipes,
+ this.mInputSlotCount,
+ this.mOutputItems == null ? 0 : this.mOutputItems.length,
+ this.mTankCapacity,
+ this.mAmperage,
+ this.mTextures,
+ this.mSoundResourceLocation,
+ this.mSpecialEffect).setProgressBarTexture(this.progressBarTexture)
+ .setRecipeCatalystPriority(this.recipeCatalystPriority);
+ }
+
+ public GT_MetaTileEntity_BasicMachine_GT_Recipe setProgressBarTexture(FallbackableUITexture progressBarTexture) {
+ this.progressBarTexture = progressBarTexture;
+ return this;
+ }
+
+ public GT_MetaTileEntity_BasicMachine_GT_Recipe setProgressBarTextureName(String name, UITexture fallback) {
+ return setProgressBarTexture(GT_UITextures.fallbackableProgressbar(name, fallback));
+ }
+
+ public GT_MetaTileEntity_BasicMachine_GT_Recipe setProgressBarTextureName(String name) {
+ return setProgressBarTextureName(name, GT_UITextures.PROGRESSBAR_ARROW);
+ }
+
+ @Override
+ protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (!super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)) return false;
+ switch (this.mInputSlotCount) {
+ case 0 -> {
+ return false;
+ }
+ case 1 -> {
+ if (this.getFillableStack() == null) return this.getRecipeMap()
+ .containsInput(aStack);
+ else return this.getRecipeMap()
+ .findRecipe(
+ this.getBaseMetaTileEntity(),
+ this.mLastRecipe,
+ true,
+ true,
+ V[this.mTier],
+ new FluidStack[] { this.getFillableStack() },
+ this.getSpecialSlot(),
+ appendSelectedCircuit(aStack))
+ != null;
+ }
+ case 2 -> {
+ return ((this.getInputAt(0) != null && this.getInputAt(1) != null)
+ || (this.getInputAt(0) == null && this.getInputAt(1) == null ? this.getRecipeMap()
+ .containsInput(aStack)
+ : (this.getRecipeMap()
+ .containsInput(aStack)
+ && this.getRecipeMap()
+ .findRecipe(
+ this.getBaseMetaTileEntity(),
+ this.mLastRecipe,
+ true,
+ true,
+ V[this.mTier],
+ new FluidStack[] { this.getFillableStack() },
+ this.getSpecialSlot(),
+ aIndex == this.getInputSlot() ? appendSelectedCircuit(aStack, this.getInputAt(1))
+ : appendSelectedCircuit(this.getInputAt(0), aStack))
+ != null)));
+ }
+ default -> {
+ int tID = this.getBaseMetaTileEntity()
+ .getMetaTileID();
+ if (tID >= 211 && tID <= 218 || tID >= 1180 && tID <= 1187 || tID >= 10780 && tID <= 10786) { // assembler
+ // lv-iv;
+ // circuit
+ // asseblers
+ // lv -
+ // uv;
+ // assemblers
+ // luv-uev
+ if (GT_Utility.isStackValid(aStack)) for (int oreID : OreDictionary.getOreIDs(aStack)) {
+ if (OreDictionary.getOreName(oreID)
+ .startsWith("circuit")) return true;
+ }
+ }
+ return this.getRecipeMap()
+ .containsInput(aStack);
+ }
+ }
+ }
+
+ @Override
+ public boolean allowSelectCircuit() {
+ return true;
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isClientSide() && aBaseMetaTileEntity.isActive()) {
+ // noinspection SwitchStatementWithTooFewBranches
+ switch (this.mSpecialEffect) {
+ case TOP_SMOKE -> {
+ if (aBaseMetaTileEntity.getFrontFacing() != UP && aBaseMetaTileEntity.getCoverIDAtSide(UP) == 0
+ && !aBaseMetaTileEntity.getOpacityAtSide(UP)) {
+
+ new ParticleEventBuilder().setMotion(0.0D, 0.0D, 0.0D)
+ .setIdentifier(ParticleFX.SMOKE)
+ .setPosition(
+ aBaseMetaTileEntity.getXCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F,
+ aBaseMetaTileEntity.getYCoord() + 0.9F + XSTR_INSTANCE.nextFloat() * 0.2F,
+ aBaseMetaTileEntity.getZCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F)
+ .setWorld(aBaseMetaTileEntity.getWorld())
+ .run();
+ }
+ }
+ default -> {}
+ }
+ }
+ }
+
+ /**
+ * Handles {@link Block#randomDisplayTick} driven Special Effects
+ *
+ * @param aBaseMetaTileEntity The entity that will handle the {@see Block#randomDisplayTick}
+ */
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) {
+
+ // noinspection SwitchStatementWithTooFewBranches
+ switch (this.mSpecialEffect) {
+ case MAIN_RANDOM_SPARKS -> {
+ // Random Sparkles at main face
+ if (aBaseMetaTileEntity.isActive() && XSTR_INSTANCE.nextInt(3) == 0) {
+
+ final ForgeDirection mainFacing = this.mMainFacing;
+
+ if ((mainFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0
+ && aBaseMetaTileEntity.getCoverIDAtSide(mainFacing) == 0
+ && !aBaseMetaTileEntity.getOpacityAtSide(mainFacing)) {
+
+ final double oX = aBaseMetaTileEntity.getXCoord();
+ final double oY = aBaseMetaTileEntity.getYCoord();
+ final double oZ = aBaseMetaTileEntity.getZCoord();
+ final double offset = 0.02D;
+ final double horizontal = 0.5D + XSTR_INSTANCE.nextFloat() * 8D / 16D - 4D / 16D;
+
+ final double x, y, z, mX, mZ;
+
+ y = oY + XSTR_INSTANCE.nextFloat() * 10D / 16D + 5D / 16D;
+
+ if (mainFacing == ForgeDirection.WEST) {
+ x = oX - offset;
+ mX = -.05D;
+ z = oZ + horizontal;
+ mZ = 0D;
+ } else if (mainFacing == ForgeDirection.EAST) {
+ x = oX + offset;
+ mX = .05D;
+ z = oZ + horizontal;
+ mZ = 0D;
+ } else if (mainFacing == ForgeDirection.NORTH) {
+ x = oX + horizontal;
+ mX = 0D;
+ z = oZ - offset;
+ mZ = -.05D;
+ } else // if (frontFacing == ForgeDirection.SOUTH.ordinal())
+ {
+ x = oX + horizontal;
+ mX = 0D;
+ z = oZ + offset;
+ mZ = .05D;
+ }
+
+ ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(mX, 0, mZ)
+ .setPosition(x, y, z)
+ .setWorld(getBaseMetaTileEntity().getWorld());
+ particleEventBuilder.setIdentifier(ParticleFX.LAVA)
+ .run();
+ }
+ }
+ }
+ default -> {}
+ }
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return this.mRecipes;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return recipeCatalystPriority;
+ }
+
+ public GT_MetaTileEntity_BasicMachine_GT_Recipe setRecipeCatalystPriority(int recipeCatalystPriority) {
+ this.recipeCatalystPriority = recipeCatalystPriority;
+ return this;
+ }
+
+ @Override
+ public int getCapacity() {
+ return this.mTankCapacity;
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1 && this.mSoundResourceLocation != null
+ && GT_Utility.isStringValid(this.mSoundResourceLocation.getResourceDomain())
+ && GT_Utility.isStringValid(this.mSoundResourceLocation.getResourcePath()))
+ GT_Utility.doSoundAtClient(this.mSoundResourceLocation, 100, 1.0F, aX, aY, aZ);
+ }
+
+ @Override
+ public void startProcess() {
+ BaseMetaTileEntity myMetaTileEntity = ((BaseMetaTileEntity) this.getBaseMetaTileEntity());
+ // Added to throttle sounds. To reduce lag, this is on the server side so BlockUpdate packets aren't sent.
+ if (myMetaTileEntity.mTickTimer > (myMetaTileEntity.mLastSoundTick + ticksBetweenSounds)) {
+ if (this.mSoundResourceLocation != null
+ && GT_Utility.isStringValid(this.mSoundResourceLocation.getResourceDomain())
+ && GT_Utility.isStringValid(this.mSoundResourceLocation.getResourcePath()))
+ this.sendLoopStart((byte) 1);
+ // Does not have overflow protection, but they are longs.
+ myMetaTileEntity.mLastSoundTick = myMetaTileEntity.mTickTimer;
+ }
+ }
+
+ @Override
+ protected BasicUIProperties getUIProperties() {
+ return super.getUIProperties().toBuilder()
+ .progressBarTexture(progressBarTexture)
+ .build();
+ }
+
+ public enum X {
+ PUMP,
+ WIRE,
+ WIRE4,
+ HULL,
+ PIPE,
+ GLASS,
+ PLATE,
+ MOTOR,
+ ROTOR,
+ SENSOR,
+ PISTON,
+ CIRCUIT,
+ EMITTER,
+ CONVEYOR,
+ ROBOT_ARM,
+ COIL_HEATING,
+ COIL_ELECTRIC,
+ STICK_MAGNETIC,
+ STICK_DISTILLATION,
+ BETTER_CIRCUIT,
+ FIELD_GENERATOR,
+ COIL_HEATING_DOUBLE,
+ STICK_ELECTROMAGNETIC
+ }
+
+ /**
+ * Special Effects
+ */
+ public enum SpecialEffects {
+
+ NONE,
+ TOP_SMOKE,
+ MAIN_RANDOM_SPARKS;
+
+ static final SpecialEffects[] VALID_SPECIAL_EFFECTS = { NONE, TOP_SMOKE, MAIN_RANDOM_SPARKS };
+
+ static SpecialEffects fromId(int id) {
+ return id >= 0 && id < VALID_SPECIAL_EFFECTS.length ? VALID_SPECIAL_EFFECTS[id] : NONE;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Steel.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Steel.java
new file mode 100644
index 0000000000..d6ae385430
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Steel.java
@@ -0,0 +1,150 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEEL_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEEL_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEEL_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IGetTitleColor;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.objects.overclockdescriber.SteamOverclockDescriber;
+import gregtech.api.render.TextureFactory;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple
+ * Machine
+ */
+public abstract class GT_MetaTileEntity_BasicMachine_Steel extends GT_MetaTileEntity_BasicMachine_Bronze
+ implements IGetTitleColor {
+
+ public GT_MetaTileEntity_BasicMachine_Steel(int aID, String aName, String aNameRegional, String aDescription,
+ int aInputSlotCount, int aOutputSlotCount, boolean aHighPressure) {
+ super(aID, aName, aNameRegional, aDescription, aInputSlotCount, aOutputSlotCount, aHighPressure);
+ }
+
+ public GT_MetaTileEntity_BasicMachine_Steel(String aName, String[] aDescription, ITexture[][][] aTextures,
+ int aInputSlotCount, int aOutputSlotCount, boolean aHighPressure) {
+ super(aName, aDescription, aTextures, aInputSlotCount, aOutputSlotCount, aHighPressure);
+ }
+
+ @Override
+ public OverclockDescriber createOverclockDescriber() {
+ return new SteamOverclockDescriber(SteamVariant.STEEL, 2, 1);
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_TOP : MACHINE_STEEL_TOP,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_TOP : MACHINE_STEEL_TOP,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_BOTTOM : MACHINE_STEEL_BOTTOM,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_BOTTOM : MACHINE_STEEL_BOTTOM,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)) };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingPipeActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_BOTTOM : MACHINE_STEEL_BOTTOM,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingPipeInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_BOTTOM : MACHINE_STEEL_BOTTOM,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getTopFacingPipeActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_TOP : MACHINE_STEEL_TOP,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getTopFacingPipeInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_TOP : MACHINE_STEEL_TOP,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getSideFacingPipeActive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getSideFacingPipeInactive(byte aColor) {
+ return new ITexture[] { TextureFactory.of(
+ isBricked() ? MACHINE_STEELBRICKS_SIDE : MACHINE_STEEL_SIDE,
+ Dyes.getModulation(aColor, Dyes._NULL.mRGBa)), TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public SteamVariant getSteamVariant() {
+ return SteamVariant.STEEL;
+ }
+
+ @Override
+ public int getTitleColor() {
+ return COLOR_TITLE_WHITE.get();
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicTank.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicTank.java
new file mode 100644
index 0000000000..c810614161
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicTank.java
@@ -0,0 +1,348 @@
+package gregtech.api.metatileentity.implementations;
+
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.fluid.FluidStackTank;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.GT_Container_BasicTank;
+import gregtech.api.gui.GT_GUIContainer_BasicTank;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p>
+ * This is the main construct for my generic Tanks. Filling and emptying behavior have to be implemented manually
+ */
+public abstract class GT_MetaTileEntity_BasicTank extends GT_MetaTileEntity_TieredMachineBlock
+ implements IAddUIWidgets {
+
+ public FluidStack mFluid;
+ // Due to class initializing order, getCapacity might not work properly at this time.
+ // So we pass supplier instead of current value here.
+ protected final FluidStackTank fluidTank = new FluidStackTank(
+ () -> mFluid,
+ fluidStack -> mFluid = fluidStack,
+ this::getRealCapacity);
+
+ /**
+ * @param aInvSlotCount should be 3
+ */
+ public GT_MetaTileEntity_BasicTank(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String aDescription, ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicTank(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String[] aDescription, ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicTank(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicTank(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex != getStackDisplaySlot();
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ if (mFluid != null) aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound()));
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid"));
+ }
+
+ public abstract boolean doesFillContainers();
+
+ public abstract boolean doesEmptyContainers();
+
+ public abstract boolean canTankBeFilled();
+
+ public abstract boolean canTankBeEmptied();
+
+ public abstract boolean displaysItemStack();
+
+ /**
+ * @return If fluid amount is shown on FluidDisplayItem
+ */
+ public abstract boolean displaysStackSize();
+
+ public int getInputSlot() {
+ return 0;
+ }
+
+ public int getOutputSlot() {
+ return 1;
+ }
+
+ public int getStackDisplaySlot() {
+ return 2;
+ }
+
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return true;
+ }
+
+ public boolean isFluidChangingAllowed() {
+ return true;
+ }
+
+ public FluidStack getFillableStack() {
+ return mFluid;
+ }
+
+ public FluidStack setFillableStack(FluidStack aFluid) {
+ mFluid = aFluid;
+ return mFluid;
+ }
+
+ /**
+ * If you override this and change the field returned, be sure to override {@link #isDrainableStackSeparate()} as
+ * well!
+ */
+ public FluidStack getDrainableStack() {
+ return mFluid;
+ }
+
+ public FluidStack setDrainableStack(FluidStack aFluid) {
+ mFluid = aFluid;
+ return mFluid;
+ }
+
+ public boolean isDrainableStackSeparate() {
+ return false;
+ }
+
+ @Deprecated
+ public FluidStack getDisplayedFluid() {
+ return getDrainableStack();
+ }
+
+ @Deprecated
+ @Override
+ public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
+ return new GT_Container_BasicTank(aPlayerInventory, aBaseMetaTileEntity);
+ }
+
+ @Deprecated
+ @Override
+ public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
+ return new GT_GUIContainer_BasicTank(aPlayerInventory, aBaseMetaTileEntity, getLocalName());
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (isFluidChangingAllowed() && getFillableStack() != null && getFillableStack().amount <= 0)
+ setFillableStack(null);
+
+ if (doesEmptyContainers()) {
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(mInventory[getInputSlot()], true);
+ if (tFluid != null && isFluidInputAllowed(tFluid)) {
+ if (getFillableStack() == null) {
+ if (isFluidInputAllowed(tFluid) && tFluid.amount <= getCapacity()) {
+ if (aBaseMetaTileEntity.addStackToSlot(
+ getOutputSlot(),
+ GT_Utility.getContainerForFilledItem(mInventory[getInputSlot()], true),
+ 1)) {
+ setFillableStack(tFluid.copy());
+ this.onEmptyingContainerWhenEmpty();
+ aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1);
+ }
+ }
+ } else {
+ if (tFluid.isFluidEqual(getFillableStack())
+ && ((long) tFluid.amount + getFillableStack().amount) <= (long) getCapacity()) {
+ if (aBaseMetaTileEntity.addStackToSlot(
+ getOutputSlot(),
+ GT_Utility.getContainerForFilledItem(mInventory[getInputSlot()], true),
+ 1)) {
+ getFillableStack().amount += tFluid.amount;
+ aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1);
+ }
+ }
+ }
+ }
+ }
+
+ if (doesFillContainers()) {
+ ItemStack tOutput = GT_Utility
+ .fillFluidContainer(getDrainableStack(), mInventory[getInputSlot()], false, true);
+ if (tOutput != null && aBaseMetaTileEntity.addStackToSlot(getOutputSlot(), tOutput, 1)) {
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(tOutput, true);
+ aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1);
+ if (tFluid != null) getDrainableStack().amount -= tFluid.amount;
+ if (getDrainableStack().amount <= 0 && isFluidChangingAllowed()) setDrainableStack(null);
+ }
+ }
+ }
+ }
+
+ @Override
+ public FluidStack getFluid() {
+ return getDrainableStack();
+ }
+
+ @Override
+ public int getFluidAmount() {
+ return getDrainableStack() != null ? getDrainableStack().amount : 0;
+ }
+
+ @Override
+ public int fill(FluidStack aFluid, boolean doFill) {
+ if (aFluid == null || aFluid.getFluid()
+ .getID() <= 0 || aFluid.amount <= 0 || !canTankBeFilled() || !isFluidInputAllowed(aFluid)) return 0;
+
+ if (getFillableStack() == null || getFillableStack().getFluid()
+ .getID() <= 0) {
+ if (aFluid.amount <= getCapacity()) {
+ if (doFill) {
+ setFillableStack(aFluid.copy());
+ getBaseMetaTileEntity().markDirty();
+ }
+ return aFluid.amount;
+ }
+ if (doFill) {
+ setFillableStack(aFluid.copy());
+ getFillableStack().amount = getCapacity();
+ getBaseMetaTileEntity().markDirty();
+ }
+ return getCapacity();
+ }
+
+ if (!getFillableStack().isFluidEqual(aFluid)) return 0;
+
+ int space = getCapacity() - getFillableStack().amount;
+ if (aFluid.amount <= space) {
+ if (doFill) {
+ getFillableStack().amount += aFluid.amount;
+ getBaseMetaTileEntity().markDirty();
+ }
+ return aFluid.amount;
+ }
+ if (doFill) getFillableStack().amount = getCapacity();
+ return space;
+ }
+
+ @Override
+ public FluidStack drain(int maxDrain, boolean doDrain) {
+ if (getDrainableStack() == null || !canTankBeEmptied()) return null;
+ if (getDrainableStack().amount <= 0 && isFluidChangingAllowed()) {
+ setDrainableStack(null);
+ getBaseMetaTileEntity().markDirty();
+ return null;
+ }
+
+ int used = maxDrain;
+ if (getDrainableStack().amount < used) used = getDrainableStack().amount;
+
+ if (doDrain) {
+ getDrainableStack().amount -= used;
+ getBaseMetaTileEntity().markDirty();
+ }
+
+ FluidStack drained = getDrainableStack().copy();
+ drained.amount = used;
+
+ if (getDrainableStack().amount <= 0 && isFluidChangingAllowed()) {
+ setDrainableStack(null);
+ getBaseMetaTileEntity().markDirty();
+ }
+
+ return drained;
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection side) {
+ if (getCapacity() <= 0 && !getBaseMetaTileEntity().hasSteamEngineUpgrade()) return new FluidTankInfo[] {};
+ if (isDrainableStackSeparate()) {
+ return new FluidTankInfo[] { new FluidTankInfo(getFillableStack(), getCapacity()),
+ new FluidTankInfo(getDrainableStack(), getCapacity()) };
+ } else {
+ return new FluidTankInfo[] { new FluidTankInfo(this) };
+ }
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return aIndex == getOutputSlot();
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return aIndex == getInputSlot();
+ }
+
+ protected void onEmptyingContainerWhenEmpty() {
+ // Do nothing
+ }
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(7, 16)
+ .setSize(71, 45))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_GAUGE)
+ .setPos(79, 34)
+ .setSize(18, 18))
+ .widget(
+ new SlotWidget(inventoryHandler, getInputSlot())
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_IN)
+ .setPos(79, 16))
+ .widget(
+ new SlotWidget(inventoryHandler, getOutputSlot()).setAccess(true, false)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_OUT)
+ .setPos(79, 52))
+ .widget(
+ createFluidSlot().setBackground(GT_UITextures.TRANSPARENT)
+ .setPos(58, 41))
+ .widget(
+ new TextWidget("Liquid Amount").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 20))
+ .widget(
+ new TextWidget().setStringSupplier(() -> numberFormat.format(mFluid != null ? mFluid.amount : 0))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 30));
+ }
+
+ protected FluidSlotWidget createFluidSlot() {
+ return new FluidSlotWidget(fluidTank);
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java
new file mode 100644
index 0000000000..1fc347da1f
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java
@@ -0,0 +1,568 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.Textures.BlockIcons.ARROW_DOWN;
+import static gregtech.api.enums.Textures.BlockIcons.ARROW_DOWN_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.ARROW_LEFT;
+import static gregtech.api.enums.Textures.BlockIcons.ARROW_LEFT_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.ARROW_RIGHT;
+import static gregtech.api.enums.Textures.BlockIcons.ARROW_RIGHT_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.ARROW_UP;
+import static gregtech.api.enums.Textures.BlockIcons.ARROW_UP_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+import java.util.stream.IntStream;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_TooltipDataCache;
+import gregtech.api.util.GT_Utility;
+
+public abstract class GT_MetaTileEntity_Buffer extends GT_MetaTileEntity_TieredMachineBlock implements IAddUIWidgets {
+
+ private static final int OUTPUT_INDEX = 0;
+ private static final int ARROW_RIGHT_INDEX = 1;
+ private static final int ARROW_DOWN_INDEX = 2;
+ private static final int ARROW_LEFT_INDEX = 3;
+ private static final int ARROW_UP_INDEX = 4;
+ private static final int FRONT_INDEX = 5;
+
+ private static final String EMIT_ENERGY_TOOLTIP = "GT5U.machines.emit_energy.tooltip";
+ private static final String EMIT_REDSTONE_IF_FULL_TOOLTIP = "GT5U.machines.emit_redstone_if_full.tooltip";
+ private static final String INVERT_REDSTONE_TOOLTIP = "GT5U.machines.invert_redstone.tooltip";
+ private static final String STOCKING_MODE_TOOLTIP = "GT5U.machines.buffer_stocking_mode.tooltip";
+ private static final String SORTING_MODE_TOOLTIP = "GT5U.machines.sorting_mode.tooltip";
+ private static final int BUTTON_SIZE = 18;
+
+ public int mMaxStackSize = 64;
+ public static int MAX = 8;
+ public boolean bOutput = false, bRedstoneIfFull = false, bInvert = false, bStockingMode = false,
+ bSortStacks = false;
+ public int mSuccess = 0, mTargetStackSize = 0;
+ private int uiButtonCount = 0;
+
+ public GT_MetaTileEntity_Buffer(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription);
+ }
+
+ public GT_MetaTileEntity_Buffer(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String[] aDescription) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription);
+ }
+
+ public GT_MetaTileEntity_Buffer(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Buffer(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[ForgeDirection.VALID_DIRECTIONS.length][17][];
+ ITexture tIcon = getOverlayIcon();
+ ITexture tOut = TextureFactory.of(OVERLAY_PIPE_OUT);
+ ITexture tUp = TextureFactory.of(
+ TextureFactory.of(ARROW_UP),
+ TextureFactory.builder()
+ .addIcon(ARROW_UP_GLOW)
+ .glow()
+ .build());
+ ITexture tDown = TextureFactory.of(
+ TextureFactory.of(ARROW_DOWN),
+ TextureFactory.builder()
+ .addIcon(ARROW_DOWN_GLOW)
+ .glow()
+ .build());
+ ITexture tLeft = TextureFactory.of(
+ TextureFactory.of(ARROW_LEFT),
+ TextureFactory.builder()
+ .addIcon(ARROW_LEFT_GLOW)
+ .glow()
+ .build());
+ ITexture tRight = TextureFactory.of(
+ TextureFactory.of(ARROW_RIGHT),
+ TextureFactory.builder()
+ .addIcon(ARROW_RIGHT_GLOW)
+ .glow()
+ .build());
+ for (int i = 0; i < rTextures[0].length; i++) {
+ rTextures[OUTPUT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tOut };
+ rTextures[ARROW_RIGHT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tRight, tIcon };
+ rTextures[ARROW_DOWN_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tDown, tIcon };
+ rTextures[ARROW_LEFT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tLeft, tIcon };
+ rTextures[ARROW_UP_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tUp, tIcon };
+ rTextures[FRONT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], tIcon };
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ colorIndex = colorIndex + 1;
+ if (sideDirection == facingDirection) return mTextures[FRONT_INDEX][colorIndex];
+ if (sideDirection.getOpposite() == facingDirection) return mTextures[OUTPUT_INDEX][colorIndex];
+ switch (facingDirection) {
+ case DOWN -> {
+ return mTextures[ARROW_UP_INDEX][colorIndex]; // ARROW_UP
+ }
+ case UP -> {
+ return mTextures[ARROW_DOWN_INDEX][colorIndex]; // ARROW_DOWN
+ }
+ case NORTH -> {
+ switch (sideDirection) {
+ case DOWN, UP -> {
+ return mTextures[ARROW_DOWN_INDEX][colorIndex]; // ARROW_DOWN
+ }
+ case WEST -> {
+ return mTextures[ARROW_RIGHT_INDEX][colorIndex]; // ARROW_RIGHT
+ }
+ case EAST -> {
+ return mTextures[ARROW_LEFT_INDEX][colorIndex]; // ARROW_LEFT
+ }
+ default -> {}
+ }
+ }
+ case SOUTH -> {
+ switch (sideDirection) {
+ case DOWN, UP -> {
+ return mTextures[ARROW_UP_INDEX][colorIndex]; // ARROW_UP
+ }
+ case WEST -> {
+ return mTextures[ARROW_LEFT_INDEX][colorIndex]; // ARROW_LEFT
+ }
+ case EAST -> {
+ return mTextures[ARROW_RIGHT_INDEX][colorIndex]; // ARROW_RIGHT
+ }
+ default -> {}
+ }
+ }
+ case WEST -> {
+ switch (sideDirection) {
+ case UP, SOUTH -> {
+ return mTextures[ARROW_RIGHT_INDEX][colorIndex]; // ARROW_RIGHT
+ }
+ case DOWN, NORTH -> {
+ return mTextures[ARROW_LEFT_INDEX][colorIndex]; // ARROW_LEFT
+ }
+ default -> {}
+ }
+ }
+ case EAST -> {
+ switch (sideDirection) {
+ case UP, SOUTH -> {
+ return mTextures[ARROW_LEFT_INDEX][colorIndex]; // ARROW_LEFT
+ }
+ case DOWN, NORTH -> {
+ return mTextures[ARROW_RIGHT_INDEX][colorIndex]; // ARROW_RIGHT
+ }
+ default -> {}
+ }
+ }
+ default -> {}
+ }
+ return mTextures[FRONT_INDEX][colorIndex];
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex < mInventory.length - 1;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return !isOutputFacing(side);
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return getBaseMetaTileEntity().getBackFacing() == side;
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 512L;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512L + V[mTier] * 50L;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUOutput() {
+ // Return full value if we're an item and don't exist in the world for tooltip purposes
+ return getBaseMetaTileEntity().getWorld() == null || bOutput ? V[mTier] : 0L;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 2;
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 2;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ public abstract ITexture getOverlayIcon();
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setBoolean("bInvert", bInvert);
+ aNBT.setBoolean("bOutput", bOutput);
+ aNBT.setBoolean("bRedstoneIfFull", bRedstoneIfFull);
+ aNBT.setBoolean("bStockingMode", bStockingMode);
+ aNBT.setInteger("mTargetStackSize", mTargetStackSize);
+ aNBT.setBoolean("bSortStacks", bSortStacks);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ bInvert = aNBT.getBoolean("bInvert");
+ bOutput = aNBT.getBoolean("bOutput");
+ bRedstoneIfFull = aNBT.getBoolean("bRedstoneIfFull");
+ bSortStacks = aNBT.getBoolean("bSortStacks");
+ bStockingMode = aNBT.getBoolean("bStockingMode");
+ mTargetStackSize = aNBT.getInteger("mTargetStackSize");
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ super.setItemNBT(aNBT);
+ if (mTargetStackSize > 0) aNBT.setInteger("mTargetStackSize", mTargetStackSize);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (side == getBaseMetaTileEntity().getBackFacing()) {
+
+ mTargetStackSize = (byte) ((mTargetStackSize + (aPlayer.isSneaking() ? -1 : 1)) % 65);
+ if (mTargetStackSize < 0) {
+ mTargetStackSize = mMaxStackSize;
+ }
+ if (mTargetStackSize == 0) {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("098", "Do not regulate Item Stack Size"));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("099", "Regulate Item Stack Size to: ") + mTargetStackSize);
+ }
+ }
+ }
+
+ @Override
+ public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer,
+ float aX, float aY, float aZ) {
+ wrenchingSide = wrenchingSide.getOpposite();
+ if (getBaseMetaTileEntity().isValidFacing(wrenchingSide)) {
+ getBaseMetaTileEntity().setFrontFacing(wrenchingSide);
+ return true;
+ }
+ return false;
+ }
+
+ protected void handleRedstoneOutput(IGregTechTileEntity aBaseMetaTileEntity) {
+ int redstoneOutput = getRedstoneOutput();
+ Arrays.stream(ForgeDirection.VALID_DIRECTIONS)
+ .forEach(side -> aBaseMetaTileEntity.setInternalOutputRedstoneSignal(side, (byte) redstoneOutput));
+ }
+
+ protected int getRedstoneOutput() {
+ return (!bRedstoneIfFull || (bInvert ^ hasEmptySlots())) ? 0 : 15;
+ }
+
+ private boolean hasEmptySlots() {
+ return IntStream.range(0, mInventory.length)
+ .anyMatch(i -> isValidSlot(i) && mInventory[i] == null);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aBaseMetaTileEntity.isAllowedToWork() && aBaseMetaTileEntity.isServerSide()
+ && (aBaseMetaTileEntity.hasWorkJustBeenEnabled() || aBaseMetaTileEntity.hasInventoryBeenModified()
+ || aTimer % 200 == 0
+ || mSuccess > 0)) {
+ mSuccess--;
+ updateSlots();
+ moveItems(aBaseMetaTileEntity, aTimer);
+ handleRedstoneOutput(aBaseMetaTileEntity);
+ }
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
+ aBaseMetaTileEntity.setInternalOutputRedstoneSignal(side, (byte) 0);
+ }
+
+ protected void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ moveItems(aBaseMetaTileEntity, aTimer, 1);
+ }
+
+ protected void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long ignoredTimer, int stacks) {
+ int tCost;
+ if (bStockingMode) tCost = GT_Utility.moveMultipleItemStacks(
+ aBaseMetaTileEntity,
+ aBaseMetaTileEntity.getTileEntityAtSide(aBaseMetaTileEntity.getBackFacing()),
+ aBaseMetaTileEntity.getBackFacing(),
+ aBaseMetaTileEntity.getFrontFacing(),
+ null,
+ false,
+ mTargetStackSize == 0 ? 64 : (byte) mTargetStackSize,
+ mTargetStackSize == 0 ? 1 : (byte) mTargetStackSize,
+ (byte) 64,
+ (byte) 1,
+ stacks);
+ else tCost = GT_Utility.moveMultipleItemStacks(
+ aBaseMetaTileEntity,
+ aBaseMetaTileEntity.getTileEntityAtSide(aBaseMetaTileEntity.getBackFacing()),
+ aBaseMetaTileEntity.getBackFacing(),
+ aBaseMetaTileEntity.getFrontFacing(),
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ mTargetStackSize == 0 ? 64 : (byte) mTargetStackSize,
+ mTargetStackSize == 0 ? 1 : (byte) mTargetStackSize,
+ stacks);
+
+ if (tCost > 0 || aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ mSuccess = 50;
+ }
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side != aBaseMetaTileEntity.getBackFacing();
+ }
+
+ @Override
+ public boolean allowGeneralRedstoneOutput() {
+ return true;
+ }
+
+ public void updateSlots() {
+ for (int i = 0; i < mInventory.length; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ if (bSortStacks) fillStacksIntoFirstSlots();
+ }
+
+ protected void fillStacksIntoFirstSlots() {
+ HashMap<GT_Utility.ItemId, Integer> slots = new HashMap<>(mInventory.length);
+ HashMap<GT_Utility.ItemId, ItemStack> stacks = new HashMap<>(mInventory.length);
+ List<GT_Utility.ItemId> order = new ArrayList<>(mInventory.length);
+ List<Integer> validSlots = new ArrayList<>(mInventory.length);
+ for (int i = 0; i < mInventory.length - 1; i++) {
+ if (!isValidSlot(i)) continue;
+ validSlots.add(i);
+ ItemStack s = mInventory[i];
+ if (s == null) continue;
+ GT_Utility.ItemId sID = GT_Utility.ItemId.createNoCopy(s);
+ slots.merge(sID, s.stackSize, Integer::sum);
+ if (!stacks.containsKey(sID)) stacks.put(sID, s);
+ order.add(sID);
+ mInventory[i] = null;
+ }
+ int slotindex = 0;
+ for (GT_Utility.ItemId sID : order) {
+ int toSet = slots.get(sID);
+ if (toSet == 0) continue;
+ int slot = validSlots.get(slotindex);
+ slotindex++;
+ mInventory[slot] = stacks.get(sID)
+ .copy();
+ toSet = Math.min(toSet, mInventory[slot].getMaxStackSize());
+ mInventory[slot].stackSize = toSet;
+ slots.merge(sID, toSet, (a, b) -> a - b);
+ }
+ }
+
+ @Override
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide,
+ EntityPlayer entityPlayer, float aX, float aY, float aZ) {
+ if (entityPlayer.isSneaking()) {
+ // I was so proud of all this but I literally just copied code from OutputBus
+ bSortStacks = !bSortStacks;
+ GT_Utility.sendChatToPlayer(
+ entityPlayer,
+ GT_Utility.trans("200", "Sort mode: ")
+ + (bSortStacks ? GT_Utility.trans("088", "Enabled") : GT_Utility.trans("087", "Disabled")));
+ return true;
+ }
+ return super.onSolderingToolRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ protected void addEmitEnergyButton(ModularWindow.Builder builder) {
+ builder.widget(
+ createToggleButton(
+ () -> bOutput,
+ val -> bOutput = val,
+ GT_UITextures.OVERLAY_BUTTON_EMIT_ENERGY,
+ this::getEmitEnergyButtonTooltip));
+ }
+
+ private GT_TooltipDataCache.TooltipData getEmitEnergyButtonTooltip() {
+ return mTooltipCache.getData(
+ EMIT_ENERGY_TOOLTIP,
+ EnumChatFormatting.GREEN + GT_Utility.formatNumbers(V[mTier])
+ + " ("
+ + GT_Utility.getColoredTierNameFromTier(mTier)
+ + EnumChatFormatting.GREEN
+ + ")"
+ + EnumChatFormatting.GRAY,
+ maxAmperesOut());
+ }
+
+ protected void addEmitRedstoneIfFullButton(ModularWindow.Builder builder) {
+ builder.widget(
+ createToggleButton(
+ () -> bRedstoneIfFull,
+ val -> bRedstoneIfFull = val,
+ GT_UITextures.OVERLAY_BUTTON_EMIT_REDSTONE,
+ this::getEmitRedstoneIfFullButtonTooltip).setUpdateTooltipEveryTick(true));
+ }
+
+ private GT_TooltipDataCache.TooltipData getEmitRedstoneIfFullButtonTooltip() {
+ return mTooltipCache.getUncachedTooltipData(
+ EMIT_REDSTONE_IF_FULL_TOOLTIP,
+ StatCollector.translateToLocal(hasEmptySlots() ? "gui.yes" : "gui.no"),
+ getRedstoneOutput());
+ }
+
+ protected void addInvertRedstoneButton(ModularWindow.Builder builder) {
+ builder.widget(
+ createToggleButton(
+ () -> bInvert,
+ val -> bInvert = val,
+ GT_UITextures.OVERLAY_BUTTON_INVERT_REDSTONE,
+ () -> mTooltipCache.getData(INVERT_REDSTONE_TOOLTIP)));
+ }
+
+ protected void addStockingModeButton(ModularWindow.Builder builder) {
+ builder.widget(
+ createToggleButton(
+ () -> bStockingMode,
+ val -> bStockingMode = val,
+ GT_UITextures.OVERLAY_BUTTON_STOCKING_MODE,
+ () -> mTooltipCache.getData(STOCKING_MODE_TOOLTIP)));
+ }
+
+ protected void addSortStacksButton(ModularWindow.Builder builder) {
+ builder.widget(
+ createToggleButton(
+ () -> bSortStacks,
+ val -> bSortStacks = val,
+ GT_UITextures.OVERLAY_BUTTON_SORTING_MODE,
+ () -> mTooltipCache.getData(SORTING_MODE_TOOLTIP)));
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ buildContext.addCloseListener(() -> uiButtonCount = 0);
+ addEmitEnergyButton(builder);
+ }
+
+ protected Widget createToggleButton(Supplier<Boolean> getter, Consumer<Boolean> setter, UITexture picture,
+ Supplier<GT_TooltipDataCache.TooltipData> tooltipDataSupplier) {
+ return new CycleButtonWidget().setToggle(getter, setter)
+ .setStaticTexture(picture)
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(7 + (uiButtonCount++ * BUTTON_SIZE), 62)
+ .setSize(BUTTON_SIZE, BUTTON_SIZE)
+ .setGTTooltip(tooltipDataSupplier);
+ }
+
+ protected void addInventorySlots(ModularWindow.Builder builder) {
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 9)
+ .endAtSlot(26)
+ .build()
+ .setPos(7, 4));
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_CubicMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_CubicMultiBlockBase.java
new file mode 100644
index 0000000000..efb91e3a26
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_CubicMultiBlockBase.java
@@ -0,0 +1,141 @@
+package gregtech.api.metatileentity.implementations;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_StructureUtility;
+
+/**
+ * A simple 3x3x3 hollow cubic multiblock, that can be arbitrarily rotated, made of a single type of machine casing and
+ * accepts hatches everywhere. Controller will be placed in front center of the structure.
+ * <p>
+ * Note: You cannot use different casing for the same Class. Make a new subclass for it. You also should not change the
+ * casing dynamically, i.e. it should be a dumb method returning some sort of constant.
+ * <p>
+ * Implementation tips: 1. To restrict hatches, override {@link #addDynamoToMachineList(IGregTechTileEntity, int)} and
+ * its cousins instead of overriding the whole {@link #getStructureDefinition()} or change
+ * {@link #checkHatches(IGregTechTileEntity, ItemStack)}. The former is a total overkill, while the later cannot stop
+ * the structure check early. 2. To limit rotation, override {@link #getInitialAlignmentLimits()}
+ *
+ * @param <T>
+ */
+public abstract class GT_MetaTileEntity_CubicMultiBlockBase<T extends GT_MetaTileEntity_CubicMultiBlockBase<T>>
+ extends GT_MetaTileEntity_EnhancedMultiBlockBase<T> implements ISurvivalConstructable {
+
+ protected static final String STRUCTURE_PIECE_MAIN = "main";
+ protected static final ClassValue<IStructureDefinition<GT_MetaTileEntity_CubicMultiBlockBase<?>>> STRUCTURE_DEFINITION = new ClassValue<>() {
+
+ @Override
+ protected IStructureDefinition<GT_MetaTileEntity_CubicMultiBlockBase<?>> computeValue(Class<?> type) {
+ return StructureDefinition.<GT_MetaTileEntity_CubicMultiBlockBase<?>>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(
+ new String[][] { { "hhh", "hhh", "hhh" }, { "h~h", "h-h", "hhh" }, { "hhh", "hhh", "hhh" }, }))
+ .addElement(
+ 'h',
+ ofChain(
+ lazy(
+ t -> GT_StructureUtility.<GT_MetaTileEntity_CubicMultiBlockBase<?>>buildHatchAdder()
+ .atLeastList(t.getAllowedHatches())
+ .casingIndex(t.getHatchTextureIndex())
+ .dot(1)
+ .build()),
+ onElementPass(
+ GT_MetaTileEntity_CubicMultiBlockBase::onCorrectCasingAdded,
+ lazy(GT_MetaTileEntity_CubicMultiBlockBase::getCasingElement))))
+ .build();
+ }
+ };
+ private int mCasingAmount = 0;
+
+ protected GT_MetaTileEntity_CubicMultiBlockBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ protected GT_MetaTileEntity_CubicMultiBlockBase(String aName) {
+ super(aName);
+ }
+
+ /**
+ * Create a simple 3x3x3 hollow cubic structure made of a single type of machine casing and accepts hatches
+ * everywhere.
+ * <p>
+ * The created definition contains a single piece named {@link #STRUCTURE_PIECE_MAIN}.
+ */
+ @Override
+ @SuppressWarnings("unchecked")
+ public IStructureDefinition<T> getStructureDefinition() {
+ return (IStructureDefinition<T>) STRUCTURE_DEFINITION.get(getClass());
+ }
+
+ @Override
+ public void construct(ItemStack aStack, boolean aHintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, aStack, aHintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasingAmount = 0;
+ return checkPiece(STRUCTURE_PIECE_MAIN, 1, 1, 0) && mCasingAmount >= getRequiredCasingCount()
+ && checkHatches(aBaseMetaTileEntity, aStack);
+ }
+
+ /**
+ * Called by {@link #checkMachine(IGregTechTileEntity, ItemStack)} to check if all required hatches are present.
+ * <p>
+ * Default implementation requires EXACTLY ONE maintenance hatch to be present, and ignore all other conditions.
+ *
+ * @param aBaseMetaTileEntity the tile entity of self
+ * @param aStack The item stack inside the controller
+ * @return true if the test passes, false otherwise
+ */
+ protected boolean checkHatches(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ return mMaintenanceHatches.size() == 1;
+ }
+
+ protected abstract IStructureElement<GT_MetaTileEntity_CubicMultiBlockBase<?>> getCasingElement();
+
+ protected List<IHatchElement<? super GT_MetaTileEntity_CubicMultiBlockBase<?>>> getAllowedHatches() {
+ return ImmutableList.of(InputHatch, OutputHatch, InputBus, OutputBus, Muffler, Maintenance, Energy);
+ }
+
+ /**
+ * The hatch's texture index.
+ */
+ protected abstract int getHatchTextureIndex();
+
+ protected abstract int getRequiredCasingCount();
+
+ protected void onCorrectCasingAdded() {
+ mCasingAmount++;
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_EnhancedMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_EnhancedMultiBlockBase.java
new file mode 100644
index 0000000000..c7f0e6cdd5
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_EnhancedMultiBlockBase.java
@@ -0,0 +1,318 @@
+package gregtech.api.metatileentity.implementations;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.alignment.IAlignment;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider;
+import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
+import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
+import com.gtnewhorizon.structurelib.alignment.enumerable.Flip;
+import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation;
+import com.gtnewhorizon.structurelib.structure.IItemSource;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+
+import cpw.mods.fml.common.network.NetworkRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+
+/**
+ * Enhanced multiblock base class, featuring following improvement over {@link GT_MetaTileEntity_MultiBlockBase}
+ * <p>
+ * 1. TecTech style declarative structure check utilizing StructureLib. 2. Arbitrarily rotating the whole structure, if
+ * allowed to.
+ *
+ * @param <T> type of this
+ */
+public abstract class GT_MetaTileEntity_EnhancedMultiBlockBase<T extends GT_MetaTileEntity_EnhancedMultiBlockBase<T>>
+ extends GT_MetaTileEntity_TooltipMultiBlockBase implements IAlignment, IConstructable {
+
+ private ExtendedFacing mExtendedFacing = ExtendedFacing.DEFAULT;
+ private IAlignmentLimits mLimits = getInitialAlignmentLimits();
+
+ protected GT_MetaTileEntity_EnhancedMultiBlockBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ protected GT_MetaTileEntity_EnhancedMultiBlockBase(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public ExtendedFacing getExtendedFacing() {
+ return mExtendedFacing;
+ }
+
+ @Override
+ public void setExtendedFacing(ExtendedFacing newExtendedFacing) {
+ if (mExtendedFacing != newExtendedFacing) {
+ if (mMachine) stopMachine(ShutDownReasonRegistry.STRUCTURE_INCOMPLETE);
+ mExtendedFacing = newExtendedFacing;
+ final IGregTechTileEntity base = getBaseMetaTileEntity();
+ mMachine = false;
+ mUpdated = false;
+ mUpdate = 100;
+ if (getBaseMetaTileEntity().isServerSide()
+ && !GregTech_API.isDummyWorld(getBaseMetaTileEntity().getWorld())) {
+ StructureLibAPI.sendAlignment(
+ (IAlignmentProvider) base,
+ new NetworkRegistry.TargetPoint(
+ base.getWorld().provider.dimensionId,
+ base.getXCoord(),
+ base.getYCoord(),
+ base.getZCoord(),
+ 512));
+ } else {
+ base.issueTextureUpdate();
+ }
+ }
+ }
+
+ @Override
+ public final boolean isFacingValid(ForgeDirection facing) {
+ return canSetToDirectionAny(facing);
+ }
+
+ @Override
+ public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer,
+ float aX, float aY, float aZ) {
+ if (wrenchingSide != getBaseMetaTileEntity().getFrontFacing())
+ return super.onWrenchRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ);
+ if (entityPlayer.isSneaking()) {
+ if (isFlipChangeAllowed()) {
+ toolSetFlip(getFlip().isHorizontallyFlipped() ? Flip.NONE : Flip.HORIZONTAL);
+ } else {
+ return false;
+ }
+ } else {
+ if (isRotationChangeAllowed()) {
+ toolSetRotation(null);
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void onFacingChange() {
+ toolSetDirection(getBaseMetaTileEntity().getFrontFacing());
+ }
+
+ @Override
+ public IAlignmentLimits getAlignmentLimits() {
+ return mLimits;
+ }
+
+ protected void setAlignmentLimits(IAlignmentLimits mLimits) {
+ this.mLimits = mLimits;
+ }
+
+ /**
+ * Due to limitation of Java type system, you might need to do an unchecked cast. HOWEVER, the returned
+ * IStructureDefinition is expected to be evaluated against current instance only, and should not be used against
+ * other instances, even for those of the same class.
+ */
+ public abstract IStructureDefinition<T> getStructureDefinition();
+
+ protected abstract GT_Multiblock_Tooltip_Builder createTooltip();
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return getTooltip().getStructureHint();
+ }
+
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> !f.isVerticallyFliped();
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setByte(
+ "eRotation",
+ (byte) mExtendedFacing.getRotation()
+ .getIndex());
+ aNBT.setByte(
+ "eFlip",
+ (byte) mExtendedFacing.getFlip()
+ .getIndex());
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mExtendedFacing = ExtendedFacing.of(
+ getBaseMetaTileEntity().getFrontFacing(),
+ Rotation.byIndex(aNBT.getByte("eRotation")),
+ Flip.byIndex(aNBT.getByte("eFlip")));
+ if (!getAlignmentLimits().isNewExtendedFacingValid(mExtendedFacing)) {
+ mExtendedFacing = getCorrectedAlignment(mExtendedFacing);
+ }
+ }
+
+ /**
+ * When an old {@link ExtendedFacing} is loaded upon MTE deserialization, and the loaded facing cannot pass test of
+ * current {@link #getAlignmentLimits()}, this method will be called to retrieve a corrected version. This method
+ * is currently only intended to be used as a mean to migrate alignment limits, so if you never change the alignment
+ * limit then you can probably just use the default implementation.
+ *
+ * The returned new facing must be able to pass the test of {@link #isNewExtendedFacingValid(ExtendedFacing)}
+ */
+ protected ExtendedFacing getCorrectedAlignment(ExtendedFacing aOldFacing) {
+ if (isNewExtendedFacingValid(ExtendedFacing.DEFAULT)) {
+ return ExtendedFacing.DEFAULT;
+ }
+ for (ExtendedFacing facing : ExtendedFacing.VALUES) {
+ if (facing.getFlip()
+ .isVerticallyFliped()) {
+ continue;
+ }
+ if (isNewExtendedFacingValid(facing)) {
+ return facing;
+ }
+ }
+ throw new AssertionError("No ExtendedFacing can pass the test of isNewExtendedFacingValid");
+ }
+
+ @SuppressWarnings("unchecked")
+ private IStructureDefinition<GT_MetaTileEntity_EnhancedMultiBlockBase<T>> getCastedStructureDefinition() {
+ return (IStructureDefinition<GT_MetaTileEntity_EnhancedMultiBlockBase<T>>) getStructureDefinition();
+ }
+
+ /**
+ * Explanation of the world coordinate these offset means:
+ * <p>
+ * Imagine you stand in front of the controller, with controller facing towards you not rotated or flipped.
+ * <p>
+ * The horizontalOffset would be the number of blocks on the left side of the controller, not counting controller
+ * itself. The verticalOffset would be the number of blocks on the top side of the controller, not counting
+ * controller itself. The depthOffset would be the number of blocks between you and controller, not counting
+ * controller itself.
+ * <p>
+ * All these offsets can be negative.
+ */
+ protected final boolean checkPiece(String piece, int horizontalOffset, int verticalOffset, int depthOffset) {
+ final IGregTechTileEntity tTile = getBaseMetaTileEntity();
+ return getCastedStructureDefinition().check(
+ this,
+ piece,
+ tTile.getWorld(),
+ getExtendedFacing(),
+ tTile.getXCoord(),
+ tTile.getYCoord(),
+ tTile.getZCoord(),
+ horizontalOffset,
+ verticalOffset,
+ depthOffset,
+ !mMachine);
+ }
+
+ protected final boolean buildPiece(String piece, ItemStack trigger, boolean hintOnly, int horizontalOffset,
+ int verticalOffset, int depthOffset) {
+ final IGregTechTileEntity tTile = getBaseMetaTileEntity();
+ return getCastedStructureDefinition().buildOrHints(
+ this,
+ trigger,
+ piece,
+ tTile.getWorld(),
+ getExtendedFacing(),
+ tTile.getXCoord(),
+ tTile.getYCoord(),
+ tTile.getZCoord(),
+ horizontalOffset,
+ verticalOffset,
+ depthOffset,
+ hintOnly);
+ }
+
+ @Deprecated
+ protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset,
+ int depthOffset, int elementsBudget, IItemSource source, EntityPlayerMP actor, boolean check) {
+ final IGregTechTileEntity tTile = getBaseMetaTileEntity();
+ return getCastedStructureDefinition().survivalBuild(
+ this,
+ trigger,
+ piece,
+ tTile.getWorld(),
+ getExtendedFacing(),
+ tTile.getXCoord(),
+ tTile.getYCoord(),
+ tTile.getZCoord(),
+ horizontalOffset,
+ verticalOffset,
+ depthOffset,
+ elementsBudget,
+ source,
+ actor,
+ check);
+ }
+
+ protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset,
+ int depthOffset, int elementsBudget, ISurvivalBuildEnvironment env, boolean check) {
+ final IGregTechTileEntity tTile = getBaseMetaTileEntity();
+ return getCastedStructureDefinition().survivalBuild(
+ this,
+ trigger,
+ piece,
+ tTile.getWorld(),
+ getExtendedFacing(),
+ tTile.getXCoord(),
+ tTile.getYCoord(),
+ tTile.getZCoord(),
+ horizontalOffset,
+ verticalOffset,
+ depthOffset,
+ elementsBudget,
+ env,
+ check);
+ }
+
+ @Deprecated
+ protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset,
+ int depthOffset, int elementsBudget, IItemSource source, EntityPlayerMP actor, boolean check,
+ boolean checkIfPlaced) {
+ int built = survivialBuildPiece(
+ piece,
+ trigger,
+ horizontalOffset,
+ verticalOffset,
+ depthOffset,
+ elementsBudget,
+ source,
+ actor,
+ check);
+ if (checkIfPlaced && built > 0) checkStructure(true, getBaseMetaTileEntity());
+ return built;
+ }
+
+ protected final int survivialBuildPiece(String piece, ItemStack trigger, int horizontalOffset, int verticalOffset,
+ int depthOffset, int elementsBudget, ISurvivalBuildEnvironment env, boolean check, boolean checkIfPlaced) {
+ int built = survivialBuildPiece(
+ piece,
+ trigger,
+ horizontalOffset,
+ verticalOffset,
+ depthOffset,
+ elementsBudget,
+ env,
+ check);
+ if (checkIfPlaced && built > 0) checkStructure(true, getBaseMetaTileEntity());
+ return built;
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ if (aBaseMetaTileEntity.isClientSide())
+ StructureLibAPI.queryAlignment((IAlignmentProvider) aBaseMetaTileEntity);
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ExtendedPowerMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ExtendedPowerMultiBlockBase.java
new file mode 100644
index 0000000000..b7f34f264c
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_ExtendedPowerMultiBlockBase.java
@@ -0,0 +1,242 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import org.jetbrains.annotations.NotNull;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.util.GT_ExoticEnergyInputHelper;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+
+/**
+ * Multiblock base class that allows machine to use power over int.
+ */
+public abstract class GT_MetaTileEntity_ExtendedPowerMultiBlockBase<T extends GT_MetaTileEntity_EnhancedMultiBlockBase<T>>
+ extends GT_MetaTileEntity_EnhancedMultiBlockBase<T> {
+
+ public long lEUt;
+
+ protected GT_MetaTileEntity_ExtendedPowerMultiBlockBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ protected GT_MetaTileEntity_ExtendedPowerMultiBlockBase(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ // NBT can be loaded as any primitive type, so we can load it as long.
+ this.lEUt = aNBT.getLong("mEUt");
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setLong("mEUt", this.lEUt);
+ }
+
+ @Override
+ protected void calculateOverclockedNessMultiInternal(long aEUt, int aDuration, int mAmperage, long maxInputVoltage,
+ boolean perfectOC) {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(aEUt)
+ .setEUt(maxInputVoltage * mAmperage)
+ .setDuration(aDuration)
+ .setDurationDecreasePerOC(perfectOC ? 2 : 1)
+ .calculate();
+ lEUt = calculator.getConsumption();
+ mMaxProgresstime = calculator.getDuration();
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (this.lEUt > 0) {
+ addEnergyOutput((this.lEUt * mEfficiency) / 10000);
+ return true;
+ }
+ if (this.lEUt < 0) {
+ if (!drainEnergyInput(getActualEnergyUsage())) {
+ stopMachine(ShutDownReasonRegistry.POWER_LOSS);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void stopMachine(@NotNull ShutDownReason reason) {
+ this.lEUt = 0;
+ super.stopMachine(reason);
+ }
+
+ @Override
+ protected long getActualEnergyUsage() {
+ return (-this.lEUt * 10000) / Math.max(1000, mEfficiency);
+ }
+
+ public List<GT_MetaTileEntity_Hatch> getExoticAndNormalEnergyHatchList() {
+ List<GT_MetaTileEntity_Hatch> tHatches = new ArrayList<>();
+ tHatches.addAll(filterValidMTEs(mExoticEnergyHatches));
+ tHatches.addAll(filterValidMTEs(mEnergyHatches));
+ return tHatches;
+ }
+
+ @Override
+ public boolean drainEnergyInput(long aEU) {
+ return GT_ExoticEnergyInputHelper.drainEnergy(aEU, getExoticAndNormalEnergyHatchList());
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+
+ final IGregTechTileEntity tileEntity = getBaseMetaTileEntity();
+ if (tileEntity != null) {
+ if (tileEntity.isActive()) {
+ if (lEUt < 0) tag.setLong("energyUsage", getActualEnergyUsage());
+ else tag.setLong("energyUsage", -lEUt * mEfficiency / 10000);
+ }
+ }
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(getAverageInputVoltage());
+ logic.setAvailableAmperage(getMaxInputAmps());
+ logic.setAmperageOC(true);
+ }
+
+ @Nonnull
+ @Override
+ protected CheckRecipeResult postCheckRecipe(@Nonnull CheckRecipeResult result,
+ @Nonnull ProcessingLogic processingLogic) {
+ return result;
+ }
+
+ @Override
+ protected void setEnergyUsage(ProcessingLogic processingLogic) {
+ lEUt = processingLogic.getCalculatedEut();
+ if (lEUt > 0) {
+ lEUt = (-lEUt);
+ }
+ }
+
+ @Override
+ public String[] getInfoData() {
+ int mPollutionReduction = 0;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction);
+ }
+
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : getExoticAndNormalEnergyHatchList()) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+ long voltage = getAverageInputVoltage();
+ long amps = getMaxInputAmps();
+
+ return new String[] {
+ /* 1 */ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s",
+ /* 2 */ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ /* 3 */ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(getActualEnergyUsage())
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ /* 4 */ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(voltage)
+ + EnumChatFormatting.RESET
+ + " EU/t(*"
+ + amps
+ + " A)"
+ + StatCollector.translateToLocal("GT5U.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + VN[GT_Utility.getTier(voltage)]
+ + EnumChatFormatting.RESET,
+ /* 5 */ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": "
+ + EnumChatFormatting.RED
+ + (getIdealStatus() - getRepairStatus())
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.multiblock.efficiency")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + mEfficiency / 100.0F
+ + EnumChatFormatting.RESET
+ + " %",
+ /* 6 */ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": "
+ + EnumChatFormatting.GREEN
+ + mPollutionReduction
+ + EnumChatFormatting.RESET
+ + " %" };
+ }
+
+ @Override
+ public long getMaxInputVoltage() {
+ return GT_ExoticEnergyInputHelper.getMaxInputVoltageMulti(getExoticAndNormalEnergyHatchList());
+ }
+
+ @Override
+ public long getAverageInputVoltage() {
+ return GT_ExoticEnergyInputHelper.getAverageInputVoltageMulti(getExoticAndNormalEnergyHatchList());
+ }
+
+ @Override
+ public long getMaxInputAmps() {
+ return GT_ExoticEnergyInputHelper.getMaxWorkingInputAmpsMulti(getExoticAndNormalEnergyHatchList());
+ }
+
+ @Override
+ public long getMaxInputEu() {
+ return GT_ExoticEnergyInputHelper.getTotalEuMulti(getExoticAndNormalEnergyHatchList());
+ }
+
+ @Override
+ public void clearHatches() {
+ super.clearHatches();
+ mExoticEnergyHatches.clear();
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_FilterBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_FilterBase.java
new file mode 100644
index 0000000000..896cb223f3
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_FilterBase.java
@@ -0,0 +1,106 @@
+package gregtech.api.metatileentity.implementations;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.util.GT_TooltipDataCache;
+
+public abstract class GT_MetaTileEntity_FilterBase extends GT_MetaTileEntity_Buffer {
+
+ private static final String INVERT_FILTER_TOOLTIP = "GT5U.machines.invert_filter.tooltip";
+ protected static final int FILTER_SLOT_INDEX = 9;
+ protected static final int NUM_INVENTORY_SLOTS = 9;
+ private static final String EMIT_REDSTONE_GRADUALLY_TOOLTIP = "GT5U" + ".machines.emit_redstone_gradually.tooltip";
+ protected boolean invertFilter = false;
+
+ public GT_MetaTileEntity_FilterBase(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription);
+ }
+
+ public GT_MetaTileEntity_FilterBase(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String[] aDescription) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription);
+ }
+
+ public GT_MetaTileEntity_FilterBase(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_FilterBase(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex < NUM_INVENTORY_SLOTS;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("bInvertFilter", this.invertFilter);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.invertFilter = aNBT.getBoolean("bInvertFilter");
+ }
+
+ @Override
+ protected int getRedstoneOutput() {
+ if (!bRedstoneIfFull) {
+ return 0;
+ }
+ int redstoneOutput = getEmptySlots();
+ if (!bInvert) redstoneOutput = NUM_INVENTORY_SLOTS - redstoneOutput;
+ return redstoneOutput;
+ }
+
+ private int getEmptySlots() {
+ int emptySlots = 0;
+ for (int i = 0; i < NUM_INVENTORY_SLOTS; i++) {
+ if (mInventory[i] == null) ++emptySlots;
+ }
+ return emptySlots;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ addSortStacksButton(builder);
+ addEmitRedstoneGraduallyButton(builder);
+ addInvertRedstoneButton(builder);
+ addInvertFilterButton(builder);
+ }
+
+ private void addEmitRedstoneGraduallyButton(ModularWindow.Builder builder) {
+ builder.widget(
+ createToggleButton(
+ () -> bRedstoneIfFull,
+ val -> bRedstoneIfFull = val,
+ GT_UITextures.OVERLAY_BUTTON_EMIT_REDSTONE,
+ this::getEmitRedstoneGraduallyButtonTooltip).setUpdateTooltipEveryTick(true));
+ }
+
+ private GT_TooltipDataCache.TooltipData getEmitRedstoneGraduallyButtonTooltip() {
+ return mTooltipCache
+ .getUncachedTooltipData(EMIT_REDSTONE_GRADUALLY_TOOLTIP, getEmptySlots(), getRedstoneOutput());
+ }
+
+ private void addInvertFilterButton(ModularWindow.Builder builder) {
+ builder.widget(
+ createToggleButton(
+ () -> invertFilter,
+ val -> invertFilter = val,
+ GT_UITextures.OVERLAY_BUTTON_INVERT_FILTER,
+ () -> mTooltipCache.getData(INVERT_FILTER_TOOLTIP)));
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch.java
new file mode 100644
index 0000000000..1e974f5e9d
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch.java
@@ -0,0 +1,252 @@
+package gregtech.api.metatileentity.implementations;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import appeng.api.crafting.ICraftingIconProvider;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+/**
+ * Handles texture changes internally. No special calls are necessary other than updateTexture in add***ToMachineList.
+ */
+public abstract class GT_MetaTileEntity_Hatch extends GT_MetaTileEntity_BasicTank implements ICraftingIconProvider {
+
+ public enum ConnectionType {
+ CABLE,
+ WIRELESS,
+ LASER
+ }
+
+ /**
+ * Uses new texture changing methods to avoid limitations of byte as texture index...
+ */
+ @Deprecated
+ public byte mMachineBlock = 0;
+
+ private byte mTexturePage = 0;
+ private byte actualTexture = 0;
+
+ private ItemStack ae2CraftingIcon;
+
+ public GT_MetaTileEntity_Hatch(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String aDescription, ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String[] aDescription, ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public static int getSlots(int aTier) {
+ return aTier < 1 ? 1 : aTier == 1 ? 4 : aTier == 2 ? 9 : 16;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return new ITexture[0][0][0];
+ }
+
+ public abstract ITexture[] getTexturesActive(ITexture aBaseTexture);
+
+ public abstract ITexture[] getTexturesInactive(ITexture aBaseTexture);
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ int texturePointer = (byte) (actualTexture & 0x7F); // just to be sure, from my testing the 8th bit cannot be
+ // set clientside
+ int textureIndex = texturePointer | (mTexturePage << 7); // Shift seven since one page is 128 textures!
+ try {
+ if (side != aFacing) {
+ if (textureIndex > 0)
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[mTexturePage][texturePointer] };
+ else return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1] };
+ } else {
+ if (textureIndex > 0) {
+ if (aActive)
+ return getTexturesActive(Textures.BlockIcons.casingTexturePages[mTexturePage][texturePointer]);
+ else return getTexturesInactive(
+ Textures.BlockIcons.casingTexturePages[mTexturePage][texturePointer]);
+ } else {
+ if (aActive) return getTexturesActive(Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1]);
+ else return getTexturesInactive(Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1]);
+ }
+ }
+ } catch (NullPointerException npe) {
+ return new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[0][0] };
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setByte("mMachineBlock", actualTexture);
+ aNBT.setByte("mTexturePage", mTexturePage);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ actualTexture = aNBT.getByte("mMachineBlock");
+ mTexturePage = aNBT.getByte("mTexturePage");
+
+ if (mTexturePage != 0 && GT_Values.GT.isServerSide()) actualTexture |= 0x80; // <- lets just hope no one needs
+ // the correct value for that on
+ // server
+ mMachineBlock = actualTexture;
+ }
+
+ /**
+ * Sets texture with page and index, called on add to machine list
+ *
+ * @param id (page<<7)+index of the texture
+ */
+ public final void updateTexture(int id) {
+ onValueUpdate((byte) id);
+ onTexturePageUpdate((byte) (id >> 7));
+ }
+
+ /**
+ * Sets the icon for the owning multiblock used for AE2 crafting display of attached interfaces, called on add to
+ * machine list
+ */
+ public final void updateCraftingIcon(ItemStack icon) {
+ this.ae2CraftingIcon = icon;
+ }
+
+ @Override
+ public ItemStack getMachineCraftingIcon() {
+ return this.ae2CraftingIcon;
+ }
+
+ /**
+ * Some multiblocks restrict hatches by tier. This method allows hatches to specify custom tier used for
+ * structure check, while keeping {@link #mTier} for other uses.
+ *
+ * @return Tier used for multiblock structure
+ */
+ public byte getTierForStructure() {
+ return mTier;
+ }
+
+ /**
+ * Sets texture with page and index, rather unusable, but kept FFS
+ *
+ * @param page page of texure
+ * @param index index of texure
+ */
+ @Deprecated
+ public final void updateTexture(byte page, byte index) {
+ onValueUpdate(index);
+ onTexturePageUpdate(page);
+ }
+
+ @Override
+ public final void onValueUpdate(byte aValue) {
+ actualTexture = (byte) (aValue & 0x7F);
+ mMachineBlock = actualTexture;
+ mTexturePage = 0;
+ }
+
+ /**
+ * Get the maximum amount of amperes to work with, which excludes the additional amps in for loss
+ *
+ * @return Working amps
+ */
+ public long maxWorkingAmperesIn() {
+ return maxAmperesIn();
+ }
+
+ /**
+ * Get the type of connection this hatch allows
+ *
+ * @return Connection type
+ */
+ public ConnectionType getConnectionType() {
+ return ConnectionType.CABLE;
+ }
+
+ @Override
+ public final byte getUpdateData() {
+ return (byte) (actualTexture & 0x7F);
+ }
+
+ public final void onTexturePageUpdate(byte aValue) {
+ mTexturePage = (byte) (aValue & 0x7F);
+ if (mTexturePage != 0 && getBaseMetaTileEntity().isServerSide()) { // just to be sure
+ mMachineBlock |= 0x80; // <- lets just hope no one needs the correct value for that on server
+ actualTexture = mMachineBlock;
+ }
+ // set last bit to allow working of the page reset-er to 0 in rare case when texture id is the same but page
+ // changes to 0
+ }
+
+ public final byte getTexturePage() {
+ return (byte) (mTexturePage & 0x7F);
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { // in that method since it is usually
+ // not overriden, especially for
+ // hatches.
+ if (actualTexture != mMachineBlock) { // revert to page 0 on edition of the field - old code way
+ actualTexture = (byte) (mMachineBlock & 0x7F);
+ mMachineBlock = actualTexture; // clear last bit in mMachineBlock since now we are at page 0 after the
+ // direct field
+ // change
+ mTexturePage = 0; // assuming old code only supports page 0
+ }
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ }
+
+ // To change to other page -> use the setter method -> updateTexture
+
+ public int getCircuitSlot() {
+ return -1;
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java
new file mode 100644
index 0000000000..122dcfa746
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java
@@ -0,0 +1,157 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DATA_ACCESS;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_AssemblyLineUtils;
+
+public class GT_MetaTileEntity_Hatch_DataAccess extends GT_MetaTileEntity_Hatch implements IAddUIWidgets {
+
+ private int timeout = 4;
+
+ public GT_MetaTileEntity_Hatch_DataAccess(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 16,
+ new String[] { "Data Access for Multiblocks",
+ "Adds " + (aTier == 4 ? 4 : 16) + " extra slots for Data Sticks" });
+ }
+
+ public GT_MetaTileEntity_Hatch_DataAccess(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aTier == 4 ? 4 : 16, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_DataAccess(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aTier == 4 ? 4 : 16, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_DATA_ACCESS) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_DATA_ACCESS) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_DataAccess(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return mTier >= 8 && !aBaseMetaTileEntity.isActive();
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return mTier >= 8 && !aBaseMetaTileEntity.isActive();
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ return 1;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isActive()) {
+ timeout--;
+ if (timeout <= 0) {
+ aBaseMetaTileEntity.setActive(false);
+ }
+ }
+ }
+
+ public void setActive(boolean mActive) {
+ getBaseMetaTileEntity().setActive(mActive);
+ timeout = mActive ? 4 : 0;
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.getByte("mSticksUpdated") != 1) {
+ for (int i = 0; i < getSizeInventory(); i++) {
+ GT_AssemblyLineUtils.processDataStick(getStackInSlot(i));
+ }
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ // reminder: remove this marker after many years
+ aNBT.setByte("mSticksUpdated", (byte) 1);
+ }
+
+ @Override
+ public void setInventorySlotContents(int aIndex, ItemStack aStack) {
+ super.setInventorySlotContents(aIndex, aStack);
+ GT_AssemblyLineUtils.processDataStick(aStack);
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (mTier == 4) {
+ getBaseMetaTileEntity()
+ .add2by2Slots(builder, getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_CIRCUIT);
+ } else {
+ getBaseMetaTileEntity()
+ .add4by4Slots(builder, getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_CIRCUIT);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Dynamo.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Dynamo.java
new file mode 100644
index 0000000000..8e621434db
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Dynamo.java
@@ -0,0 +1,110 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+public class GT_MetaTileEntity_Hatch_Dynamo extends GT_MetaTileEntity_Hatch {
+
+ public GT_MetaTileEntity_Hatch_Dynamo(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 0,
+ new String[] { "Generating electric Energy from Multiblocks", "Puts out up to 1 Amp" });
+ }
+
+ public GT_MetaTileEntity_Hatch_Dynamo(int aID, String aName, String aNameRegional, int aTier,
+ String[] aDescription) {
+ super(aID, aName, aNameRegional, aTier, 0, aDescription);
+ }
+
+ public GT_MetaTileEntity_Hatch_Dynamo(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Dynamo(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 512;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512L + V[mTier + 1] * 2L;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Dynamo(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Energy.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Energy.java
new file mode 100644
index 0000000000..d9be12671d
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Energy.java
@@ -0,0 +1,125 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+public class GT_MetaTileEntity_Hatch_Energy extends GT_MetaTileEntity_Hatch {
+
+ public GT_MetaTileEntity_Hatch_Energy(int aID, String aName, String aNameRegional, int aTier,
+ String[] aDescription) {
+ super(aID, aName, aNameRegional, aTier, 0, aDescription);
+ }
+
+ public GT_MetaTileEntity_Hatch_Energy(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 0,
+ new String[] { "Energy Injector for Multiblocks", "Accepts up to 2 Amps" });
+ }
+
+ public GT_MetaTileEntity_Hatch_Energy(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String[] aDescription, ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Energy(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Energy(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Energy(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 512;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512L + V[mTier] * 8L;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 2;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Energy(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Input.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Input.java
new file mode 100644
index 0000000000..18aef371b6
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Input.java
@@ -0,0 +1,201 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.FLUID_IN_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Hatch_Input extends GT_MetaTileEntity_Hatch {
+
+ public RecipeMap<?> mRecipeMap = null;
+
+ public GT_MetaTileEntity_Hatch_Input(int aID, String aName, String aNameRegional, int aTier) {
+ this(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ new String[] { "Fluid Input for Multiblocks",
+ "Capacity: " + GT_Utility.formatNumbers(8000L * (1L << aTier)) + "L" });
+ }
+
+ public GT_MetaTileEntity_Hatch_Input(int aID, String aName, String aNameRegional, int aTier,
+ String[] aDescription) {
+ this(aID, 3, aName, aNameRegional, aTier, aDescription);
+ }
+
+ public GT_MetaTileEntity_Hatch_Input(int aID, int aSlot, String aName, String aNameRegional, int aTier) {
+ this(
+ aID,
+ aSlot,
+ aName,
+ aNameRegional,
+ aTier,
+ new String[] { "Fluid Input for Multiblocks", "", "Can hold " + aSlot + " types of fluid." });
+ mDescriptionArray[1] = "Capacity: " + GT_Utility.formatNumbers(getCapacityPerTank(aTier, aSlot)) + "L";
+ }
+
+ public GT_MetaTileEntity_Hatch_Input(int aID, int aSlot, String aName, String aNameRegional, int aTier,
+ String[] aDescription) {
+ super(aID, aName, aNameRegional, aTier, aSlot, aDescription);
+ }
+
+ public GT_MetaTileEntity_Hatch_Input(int aID, String aName, String aNameRegional, int aTier, int allSlotCount,
+ String[] strings) {
+ super(aID, aName, aNameRegional, aTier, allSlotCount, strings);
+ }
+
+ public int getCapacityPerTank(int aTier, int aSlot) {
+ return (int) (8000L * (1L << aTier) / aSlot);
+ }
+
+ public GT_MetaTileEntity_Hatch_Input(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Input(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Input(String aName, int aSlots, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aSlots, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(FLUID_IN_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(FLUID_IN_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Input(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ if (mRecipeMap != null) {
+ aNBT.setString("recipeMap", mRecipeMap.unlocalizedName);
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mRecipeMap = RecipeMap.getFromOldIdentifier(aNBT.getString("recipeMap"));
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ // return true;
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ public void updateSlots() {
+ if (mInventory[getInputSlot()] != null && mInventory[getInputSlot()].stackSize <= 0)
+ mInventory[getInputSlot()] = null;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return mRecipeMap == null || mRecipeMap.containsInput(aFluid);
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 1;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 0
+ && (mRecipeMap == null || mRecipeMap.containsInput(aStack)
+ || mRecipeMap.containsInput(GT_Utility.getFluidForFilledItem(aStack, true)));
+ }
+
+ @Override
+ public int getCapacity() {
+ return 8000 * (1 << mTier);
+ }
+
+ @Override
+ public int getTankPressure() {
+ return -100;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java
new file mode 100644
index 0000000000..f4c4eb6a14
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java
@@ -0,0 +1,323 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.ITEM_IN_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+
+import gregtech.GT_Mod;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ClientPreference;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_TooltipDataCache;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.extensions.ArrayExt;
+
+public class GT_MetaTileEntity_Hatch_InputBus extends GT_MetaTileEntity_Hatch
+ implements IConfigurationCircuitSupport, IAddUIWidgets {
+
+ private static final String SORTING_MODE_TOOLTIP = "GT5U.machines.sorting_mode.tooltip";
+ private static final String ONE_STACK_LIMIT_TOOLTIP = "GT5U.machines.one_stack_limit.tooltip";
+ private static final int BUTTON_SIZE = 18;
+
+ public RecipeMap<?> mRecipeMap = null;
+ public boolean disableSort;
+ public boolean disableFilter = true;
+ public boolean disableLimited = true;
+ private int uiButtonCount = 0;
+
+ public GT_MetaTileEntity_Hatch_InputBus(int id, String name, String nameRegional, int tier) {
+ this(id, name, nameRegional, tier, getSlots(tier) + 1);
+ }
+
+ protected GT_MetaTileEntity_Hatch_InputBus(int id, String name, String nameRegional, int tier, int slots,
+ String[] description) {
+ super(id, name, nameRegional, tier, slots, description);
+ }
+
+ public GT_MetaTileEntity_Hatch_InputBus(int id, String name, String nameRegional, int tier, int slots) {
+ super(
+ id,
+ name,
+ nameRegional,
+ tier,
+ slots,
+ ArrayExt.of(
+ "Item Input for Multiblocks",
+ "Shift + right click with screwdriver to turn Sort mode on/off",
+ "Capacity: " + getSlots(tier) + " stack" + (getSlots(tier) >= 2 ? "s" : "")));
+ }
+
+ @Deprecated
+ // having too many constructors is bad, don't be so lazy, use GT_MetaTileEntity_Hatch_InputBus(String, int,
+ // String[], ITexture[][][])
+ public GT_MetaTileEntity_Hatch_InputBus(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ this(aName, aTier, ArrayExt.of(aDescription), aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_InputBus(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ this(aName, aTier, getSlots(aTier) + 1, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_InputBus(String aName, int aTier, int aSlots, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aSlots, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(ITEM_IN_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN), TextureFactory.of(ITEM_IN_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_IN) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex != getCircuitSlot();
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_InputBus(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public int getCircuitSlotX() {
+ return 153;
+ }
+
+ @Override
+ public int getCircuitSlotY() {
+ return 63;
+ }
+
+ @Override
+ public void initDefaultModes(NBTTagCompound aNBT) {
+ if (!getBaseMetaTileEntity().getWorld().isRemote) {
+ GT_ClientPreference tPreference = GT_Mod.gregtechproxy
+ .getClientPreference(getBaseMetaTileEntity().getOwnerUuid());
+ if (tPreference != null) disableFilter = !tPreference.isInputBusInitialFilterEnabled();
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ updateSlots();
+ }
+ }
+
+ public void updateSlots() {
+ for (int i = 0; i < mInventory.length - 1; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ if (!disableSort) fillStacksIntoFirstSlots();
+ }
+
+ protected void fillStacksIntoFirstSlots() {
+ final int L = mInventory.length - 1;
+ HashMap<GT_Utility.ItemId, Integer> slots = new HashMap<>(L);
+ HashMap<GT_Utility.ItemId, ItemStack> stacks = new HashMap<>(L);
+ List<GT_Utility.ItemId> order = new ArrayList<>(L);
+ List<Integer> validSlots = new ArrayList<>(L);
+ for (int i = 0; i < L; i++) {
+ if (!isValidSlot(i)) continue;
+ validSlots.add(i);
+ ItemStack s = mInventory[i];
+ if (s == null) continue;
+ GT_Utility.ItemId sID = GT_Utility.ItemId.createNoCopy(s);
+ slots.merge(sID, s.stackSize, Integer::sum);
+ if (!stacks.containsKey(sID)) stacks.put(sID, s);
+ order.add(sID);
+ mInventory[i] = null;
+ }
+ int slotindex = 0;
+ for (GT_Utility.ItemId sID : order) {
+ int toSet = slots.get(sID);
+ if (toSet == 0) continue;
+ int slot = validSlots.get(slotindex);
+ slotindex++;
+ mInventory[slot] = stacks.get(sID)
+ .copy();
+ toSet = Math.min(toSet, mInventory[slot].getMaxStackSize());
+ mInventory[slot].stackSize = toSet;
+ slots.merge(sID, toSet, (a, b) -> a - b);
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("disableSort", disableSort);
+ aNBT.setBoolean("disableFilter", disableFilter);
+ aNBT.setBoolean("disableLimited", disableLimited);
+ if (mRecipeMap != null) {
+ aNBT.setString("recipeMap", mRecipeMap.unlocalizedName);
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ disableSort = aNBT.getBoolean("disableSort");
+ disableFilter = aNBT.getBoolean("disableFilter");
+ if (aNBT.hasKey("disableLimited")) {
+ disableLimited = aNBT.getBoolean("disableLimited");
+ }
+ mRecipeMap = RecipeMap.getFromOldIdentifier(aNBT.getString("recipeMap"));
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (!getBaseMetaTileEntity().getCoverInfoAtSide(side)
+ .isGUIClickable()) return;
+ if (aPlayer.isSneaking()) {
+ if (disableSort) {
+ disableSort = false;
+ } else {
+ if (disableLimited) {
+ disableLimited = false;
+ } else {
+ disableSort = true;
+ disableLimited = true;
+ }
+ }
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.hatch.disableSort." + disableSort) + " "
+ + StatCollector.translateToLocal("GT5U.hatch.disableLimited." + disableLimited));
+ } else {
+ disableFilter = !disableFilter;
+ GT_Utility
+ .sendChatToPlayer(aPlayer, StatCollector.translateToLocal("GT5U.hatch.disableFilter." + disableFilter));
+ }
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (aIndex == getCircuitSlot()) return false;
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == getBaseMetaTileEntity().getFrontFacing() && aIndex != getCircuitSlot()
+ && (mRecipeMap == null || disableFilter || mRecipeMap.containsInput(aStack))
+ && (disableLimited || limitedAllowPutStack(aIndex, aStack));
+ }
+
+ protected boolean limitedAllowPutStack(int aIndex, ItemStack aStack) {
+ for (int i = 0; i < getSizeInventory(); i++)
+ if (GT_Utility.areStacksEqual(GT_OreDictUnificator.get_nocopy(aStack), mInventory[i])) return i == aIndex;
+ return mInventory[aIndex] == null;
+ }
+
+ @Override
+ public boolean allowSelectCircuit() {
+ return true;
+ }
+
+ @Override
+ public int getCircuitSlot() {
+ return getSlots(mTier);
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ private void addSortStacksButton(ModularWindow.Builder builder) {
+ builder.widget(
+ createToggleButton(
+ () -> !disableSort,
+ val -> disableSort = !val,
+ GT_UITextures.OVERLAY_BUTTON_SORTING_MODE,
+ () -> mTooltipCache.getData(SORTING_MODE_TOOLTIP)));
+ }
+
+ private void addOneStackLimitButton(ModularWindow.Builder builder) {
+ builder.widget(createToggleButton(() -> !disableLimited, val -> {
+ disableLimited = !val;
+ updateSlots();
+ }, GT_UITextures.OVERLAY_BUTTON_ONE_STACK_LIMIT, () -> mTooltipCache.getData(ONE_STACK_LIMIT_TOOLTIP)));
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ buildContext.addCloseListener(() -> uiButtonCount = 0);
+ addSortStacksButton(builder);
+ addOneStackLimitButton(builder);
+ switch (mTier) {
+ case 0 -> getBaseMetaTileEntity().add1by1Slot(builder);
+ case 1 -> getBaseMetaTileEntity().add2by2Slots(builder);
+ case 2 -> getBaseMetaTileEntity().add3by3Slots(builder);
+ default -> getBaseMetaTileEntity().add4by4Slots(builder);
+ }
+ }
+
+ private Widget createToggleButton(Supplier<Boolean> getter, Consumer<Boolean> setter, UITexture picture,
+ Supplier<GT_TooltipDataCache.TooltipData> tooltipDataSupplier) {
+ return new CycleButtonWidget().setToggle(getter, setter)
+ .setStaticTexture(picture)
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(7 + (uiButtonCount++ * BUTTON_SIZE), 62)
+ .setSize(BUTTON_SIZE, BUTTON_SIZE)
+ .setGTTooltip(tooltipDataSupplier);
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Maintenance.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Maintenance.java
new file mode 100644
index 0000000000..e1b5ee8f03
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Maintenance.java
@@ -0,0 +1,464 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_AUTOMAINTENANCE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_AUTOMAINTENANCE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_AUTOMAINTENANCE_IDLE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_AUTOMAINTENANCE_IDLE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DUCTTAPE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MAINTENANCE;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.FakePlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.alignment.IAlignment;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider;
+import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
+import com.gtnewhorizon.structurelib.alignment.enumerable.Flip;
+import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import cpw.mods.fml.common.network.NetworkRegistry;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import ic2.core.IHasGui;
+import ic2.core.item.ItemToolbox;
+
+public class GT_MetaTileEntity_Hatch_Maintenance extends GT_MetaTileEntity_Hatch implements IAddUIWidgets, IAlignment {
+
+ private Rotation rotation = Rotation.NORMAL;
+
+ private static ItemStack[] sAutoMaintenanceInputs;
+ public boolean mWrench = false, mScrewdriver = false, mSoftHammer = false, mHardHammer = false,
+ mSolderingTool = false, mCrowbar = false, mAuto;
+
+ public GT_MetaTileEntity_Hatch_Maintenance(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, 1, "For maintaining Multiblocks");
+ mAuto = false;
+ }
+
+ public GT_MetaTileEntity_Hatch_Maintenance(int aID, String aName, String aNameRegional, int aTier, boolean aAuto) {
+ super(aID, aName, aNameRegional, aTier, 4, "For automatically maintaining Multiblocks");
+ mAuto = aAuto;
+ }
+
+ public GT_MetaTileEntity_Hatch_Maintenance(String aName, int aTier, String aDescription, ITexture[][][] aTextures,
+ boolean aAuto) {
+ super(aName, aTier, aAuto ? 4 : 1, aDescription, aTextures);
+ mAuto = aAuto;
+ }
+
+ public GT_MetaTileEntity_Hatch_Maintenance(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures,
+ boolean aAuto) {
+ super(aName, aTier, aAuto ? 4 : 1, aDescription, aTextures);
+ mAuto = aAuto;
+ }
+
+ private static ItemStack[] getAutoMaintenanceInputs() {
+ if (sAutoMaintenanceInputs == null) sAutoMaintenanceInputs = new ItemStack[] { ItemList.Duct_Tape.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Lubricant, 2),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 2) };
+ return sAutoMaintenanceInputs;
+ }
+
+ @Override
+ public String[] getDescription() {
+ String[] desc;
+ if (mAuto) {
+ desc = new String[mDescriptionArray.length + 3];
+ System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length);
+ desc[mDescriptionArray.length] = "4 Ducttape, 2 Lubricant Cells";
+ desc[mDescriptionArray.length + 1] = "4 Steel Screws, 2 HV Circuits";
+ desc[mDescriptionArray.length + 2] = "For each autorepair";
+ } else {
+ desc = new String[mDescriptionArray.length + 1];
+ System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length);
+ desc[mDescriptionArray.length] = "Cannot be shared between Multiblocks!";
+ }
+ return desc;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ if (mAuto) return new ITexture[] { aBaseTexture, TextureFactory.builder()
+ .addIcon(OVERLAY_AUTOMAINTENANCE_IDLE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_AUTOMAINTENANCE_IDLE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { aBaseTexture, TextureFactory.builder()
+ .addIcon(OVERLAY_MAINTENANCE)
+ .extFacing()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ if (mAuto) return new ITexture[] { aBaseTexture, TextureFactory.builder()
+ .addIcon(OVERLAY_AUTOMAINTENANCE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_AUTOMAINTENANCE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { aBaseTexture, TextureFactory.builder()
+ .addIcon(OVERLAY_MAINTENANCE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_DUCTTAPE)
+ .extFacing()
+ .build() };
+ }
+
+ @Override
+ public void initDefaultModes(NBTTagCompound aNBT) {
+ getBaseMetaTileEntity().setActive(true);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return mAuto && GT_Mod.gregtechproxy.mAMHInteraction;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ if (aTileEntity.getMetaTileID() == 111)
+ return new GT_MetaTileEntity_Hatch_Maintenance(mName, mTier, mDescriptionArray, mTextures, true);
+ return new GT_MetaTileEntity_Hatch_Maintenance(mName, mTier, mDescriptionArray, mTextures, false);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ if (aBaseMetaTileEntity.isClientSide()) return true;
+ if (side == aBaseMetaTileEntity.getFrontFacing()) {
+ // only allow OC robot fake player
+ if (aPlayer instanceof FakePlayer && !aPlayer.getGameProfile()
+ .getName()
+ .endsWith(".robot")) return false;
+ ItemStack tStack = aPlayer.getCurrentEquippedItem();
+ if (tStack != null) {
+ if (tStack.getItem() instanceof ItemToolbox) {
+ applyToolbox(tStack, aPlayer);
+ } else if (ItemList.Duct_Tape.isStackEqual(tStack)) {
+ mWrench = mScrewdriver = mSoftHammer = mHardHammer = mCrowbar = mSolderingTool = true;
+ getBaseMetaTileEntity().setActive(false);
+ if (--tStack.stackSize == 0) {
+ aPlayer.inventory.mainInventory[aPlayer.inventory.currentItem] = null;
+ }
+ } else GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ } else {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public void updateSlots() {
+ for (int i = 0; i < mInventory.length; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ if (aBaseMetaTileEntity.isClientSide())
+ StructureLibAPI.queryAlignment((IAlignmentProvider) aBaseMetaTileEntity);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide() && mAuto && aTick % 100L == 0L) {
+ aBaseMetaTileEntity.setActive(!isRecipeInputEqual(false));
+ }
+ }
+
+ @Override
+ public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer entityPlayer,
+ float aX, float aY, float aZ) {
+ if (wrenchingSide != getBaseMetaTileEntity().getFrontFacing())
+ return super.onWrenchRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ);
+ if (!entityPlayer.isSneaking() && isRotationChangeAllowed()) {
+ toolSetRotation(null);
+ return true;
+ }
+ return false;
+ }
+
+ public boolean autoMaintainance() {
+ return isRecipeInputEqual(true);
+ }
+
+ public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess) {
+ ItemStack[] mInputs = getAutoMaintenanceInputs();
+
+ int amt;
+
+ for (ItemStack tStack : mInputs) {
+ if (tStack != null) {
+ amt = tStack.stackSize;
+ boolean temp = true;
+ for (ItemStack aStack : mInventory) {
+ if ((GT_Utility.areUnificationsEqual(aStack, tStack, true)
+ || GT_Utility.areUnificationsEqual(GT_OreDictUnificator.get(false, aStack), tStack, true))) {
+ amt -= aStack.stackSize;
+ if (amt < 1) {
+ temp = false;
+ break;
+ }
+ }
+ }
+ if (temp) return false;
+ }
+ }
+
+ if (aDecreaseStacksizeBySuccess) {
+ for (ItemStack tStack : mInputs) {
+ if (tStack != null) {
+ amt = tStack.stackSize;
+ for (ItemStack aStack : mInventory) {
+ if ((GT_Utility.areUnificationsEqual(aStack, tStack, true) || GT_Utility
+ .areUnificationsEqual(GT_OreDictUnificator.get(false, aStack), tStack, true))) {
+ if (aStack.stackSize < amt) {
+ amt -= aStack.stackSize;
+ aStack.stackSize = 0;
+ } else {
+ aStack.stackSize -= amt;
+ amt = 0;
+ break;
+ }
+ }
+ }
+ }
+ }
+ mCrowbar = true;
+ mHardHammer = true;
+ mScrewdriver = true;
+ mSoftHammer = true;
+ mSolderingTool = true;
+ mWrench = true;
+ updateSlots();
+ }
+ return true;
+ }
+
+ public void onToolClick(ItemStack aStack, EntityLivingBase aPlayer, IInventory aToolboxInventory) {
+ if (aStack == null || aPlayer == null) return;
+
+ // Allow IC2 Toolbox with tools to function for maint issues.
+ if (aStack.getItem() instanceof ItemToolbox && aPlayer instanceof EntityPlayer) {
+ applyToolbox(aStack, (EntityPlayer) aPlayer);
+ return;
+ }
+
+ if (GT_Utility.isStackInList(aStack, GregTech_API.sWrenchList) && !mWrench
+ && GT_ModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mWrench = true;
+ if (GT_Utility.isStackInList(aStack, GregTech_API.sScrewdriverList) && !mScrewdriver
+ && GT_ModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mScrewdriver = true;
+ if (GT_Utility.isStackInList(aStack, GregTech_API.sSoftHammerList) && !mSoftHammer
+ && GT_ModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mSoftHammer = true;
+ if (GT_Utility.isStackInList(aStack, GregTech_API.sHardHammerList) && !mHardHammer
+ && GT_ModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mHardHammer = true;
+ if (GT_Utility.isStackInList(aStack, GregTech_API.sCrowbarList) && !mCrowbar
+ && GT_ModHandler.damageOrDechargeItem(aStack, 1, 1000, aPlayer)) mCrowbar = true;
+ if (!mSolderingTool && GT_ModHandler.useSolderingIron(aStack, aPlayer, aToolboxInventory))
+ mSolderingTool = true;
+ if (GT_OreDictUnificator.isItemStackInstanceOf(aStack, "craftingDuctTape")) {
+ mWrench = mScrewdriver = mSoftHammer = mHardHammer = mCrowbar = mSolderingTool = true;
+ getBaseMetaTileEntity().setActive(false);
+ aStack.stackSize--;
+ }
+ if (mSolderingTool && aPlayer instanceof EntityPlayerMP tPlayer) {
+ try {
+ GT_Mod.achievements.issueAchievement(tPlayer, "maintainance");
+ } catch (Exception ignored) {}
+ }
+ }
+
+ public void onToolClick(ItemStack aStack, EntityLivingBase aPlayer) {
+ onToolClick(aStack, aPlayer, null);
+ }
+
+ private void applyToolbox(ItemStack aStack, EntityPlayer aPlayer) {
+ final ItemToolbox aToolbox = (ItemToolbox) aStack.getItem();
+ final IHasGui aToolboxGUI = aToolbox.getInventory(aPlayer, aStack);
+ for (int i = 0; i < aToolboxGUI.getSizeInventory(); i++) {
+ if (aToolboxGUI.getStackInSlot(i) != null) {
+ onToolClick(aToolboxGUI.getStackInSlot(i), aPlayer, aToolboxGUI);
+ if (aToolboxGUI.getStackInSlot(i) != null && aToolboxGUI.getStackInSlot(i).stackSize <= 0)
+ aToolboxGUI.setInventorySlotContents(i, null);
+ }
+ }
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return mAuto && GT_Mod.gregtechproxy.mAMHInteraction;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (mAuto && GT_Mod.gregtechproxy.mAMHInteraction) {
+ for (int i = 0; i < getSizeInventory(); i++) if (GT_Utility.areStacksEqual(
+ GT_OreDictUnificator.get(false, aStack),
+ GT_OreDictUnificator.get(false, getStackInSlot(i)))) return i == aIndex;
+ for (ItemStack tInput : getAutoMaintenanceInputs())
+ if (GT_Utility.areUnificationsEqual(tInput, aStack, true)
+ || GT_Utility.areUnificationsEqual(GT_OreDictUnificator.get(false, aStack), tInput, true))
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (mAuto) {
+ getBaseMetaTileEntity().add2by2Slots(builder);
+ } else {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.SLOT_MAINTENANCE)
+ .setPos(78, 33)
+ .setSize(20, 20))
+ .widget(new SlotWidget(BaseSlot.empty()) {
+
+ @Override
+ public boolean handleDragAndDrop(ItemStack draggedStack, int button) {
+ return false;
+ }
+
+ @Override
+ protected void phantomClick(ClickData clickData, ItemStack cursorStack) {
+ if (cursorStack == null) return;
+ onToolClick(cursorStack, getContext().getPlayer());
+ if (cursorStack.stackSize < 1) {
+ getContext().getPlayer().inventory.setItemStack(null);
+ }
+ if (getContext().getPlayer() instanceof EntityPlayerMP) {
+ ((EntityPlayerMP) getContext().getPlayer()).updateHeldItem();
+ }
+ }
+ }.disableShiftInsert()
+ .setBackground(GT_UITextures.TRANSPARENT)
+ .setPos(79, 34))
+ .widget(
+ new TextWidget("Click with Tool to repair.").setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(8, 12));
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setByte("mRotation", (byte) rotation.getIndex());
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ rotation = Rotation.byIndex(aNBT.getByte("mRotation"));
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public ExtendedFacing getExtendedFacing() {
+ return ExtendedFacing.of(getBaseMetaTileEntity().getFrontFacing(), rotation, Flip.NONE);
+ }
+
+ @Override
+ public void setExtendedFacing(ExtendedFacing alignment) {
+ boolean changed = false;
+ final IGregTechTileEntity base = getBaseMetaTileEntity();
+ if (base.getFrontFacing() != alignment.getDirection()) {
+ base.setFrontFacing(alignment.getDirection());
+ changed = true;
+ }
+ if (rotation != alignment.getRotation()) {
+ rotation = alignment.getRotation();
+ changed = true;
+ }
+ if (changed) {
+ if (base.isServerSide() && !GregTech_API.isDummyWorld(base.getWorld())) {
+ StructureLibAPI.sendAlignment(
+ (IAlignmentProvider) base,
+ new NetworkRegistry.TargetPoint(
+ base.getWorld().provider.dimensionId,
+ base.getXCoord(),
+ base.getYCoord(),
+ base.getZCoord(),
+ 512));
+ } else {
+ base.issueTextureUpdate();
+ }
+ }
+ }
+
+ @Override
+ public IAlignmentLimits getAlignmentLimits() {
+ return (d, r, f) -> f.isNotFlipped();
+ }
+
+ @Override
+ public boolean isFlipChangeAllowed() {
+ return false;
+ }
+
+ @Override
+ public boolean isRotationChangeAllowed() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler.java
new file mode 100644
index 0000000000..8707d0f804
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler.java
@@ -0,0 +1,208 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MUFFLER;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.WorldSpawnedEventBuilder;
+import gregtech.common.GT_Pollution;
+
+@SuppressWarnings("unused") // Unused API is expected within scope
+public class GT_MetaTileEntity_Hatch_Muffler extends GT_MetaTileEntity_Hatch {
+
+ private static final String localizedDescFormat = GT_LanguageManager.addStringLocalization(
+ "gt.blockmachines.hatch.muffler.desc.format",
+ "Outputs the Pollution (Might cause ... things)%n" + "DO NOT OBSTRUCT THE OUTPUT!%n"
+ + "Reduces Pollution to %d%%%n"
+ + "Recovers %d%% of CO2/CO/SO2");
+ private final int pollutionReduction = calculatePollutionReduction(100);
+ private final int pollutionRecover = 100 - pollutionReduction;
+ private final String[] description = String.format(localizedDescFormat, pollutionReduction, pollutionRecover)
+ .split("\\R");
+
+ public GT_MetaTileEntity_Hatch_Muffler(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, 0, "");
+ }
+
+ public GT_MetaTileEntity_Hatch_Muffler(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String[] aDescription, ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Muffler(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ this(aName, aTier, new String[] { aDescription }, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Muffler(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ this(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Muffler(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return description;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_MUFFLER) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_MUFFLER) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Muffler(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isClientSide() && this.getBaseMetaTileEntity()
+ .isActive()) {
+ pollutionParticles(
+ this.getBaseMetaTileEntity()
+ .getWorld(),
+ ParticleFX.LARGE_SMOKE.toString());
+ }
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @SideOnly(Side.CLIENT)
+ public void pollutionParticles(World aWorld, String name) {
+ boolean chk1, chk2, chk3;
+ float ran1 = XSTR_INSTANCE.nextFloat(), ran2, ran3;
+ chk1 = ran1 * 100 < calculatePollutionReduction(100);
+ if (GT_Pollution.getPollution(getBaseMetaTileEntity()) >= GT_Mod.gregtechproxy.mPollutionSmogLimit) {
+ ran2 = XSTR_INSTANCE.nextFloat();
+ ran3 = XSTR_INSTANCE.nextFloat();
+ chk2 = ran2 * 100 < calculatePollutionReduction(100);
+ chk3 = ran3 * 100 < calculatePollutionReduction(100);
+ if (!(chk1 || chk2 || chk3)) return;
+ } else {
+ if (!chk1) return;
+ ran2 = ran3 = 0.0F;
+ chk2 = chk3 = false;
+ }
+
+ final IGregTechTileEntity aMuffler = this.getBaseMetaTileEntity();
+ final ForgeDirection aDir = aMuffler.getFrontFacing();
+ final float xPos = aDir.offsetX * 0.76F + aMuffler.getXCoord() + 0.25F;
+ final float yPos = aDir.offsetY * 0.76F + aMuffler.getYCoord() + 0.25F;
+ final float zPos = aDir.offsetZ * 0.76F + aMuffler.getZCoord() + 0.25F;
+
+ final float ySpd = aDir.offsetY * 0.1F + 0.2F + 0.1F * XSTR_INSTANCE.nextFloat();
+ final float xSpd;
+ final float zSpd;
+
+ if (aDir.offsetY == -1) {
+ final float temp = XSTR_INSTANCE.nextFloat() * 2 * (float) Math.PI;
+ xSpd = (float) Math.sin(temp) * 0.1F;
+ zSpd = (float) Math.cos(temp) * 0.1F;
+ } else {
+ xSpd = aDir.offsetX * (0.1F + 0.2F * XSTR_INSTANCE.nextFloat());
+ zSpd = aDir.offsetZ * (0.1F + 0.2F * XSTR_INSTANCE.nextFloat());
+ }
+
+ final WorldSpawnedEventBuilder.ParticleEventBuilder events = new WorldSpawnedEventBuilder.ParticleEventBuilder()
+ .setIdentifier(name)
+ .setWorld(aWorld)
+ .setMotion(xSpd, ySpd, zSpd);
+
+ if (chk1) {
+ events
+ .setPosition(
+ xPos + ran1 * 0.5F,
+ yPos + XSTR_INSTANCE.nextFloat() * 0.5F,
+ zPos + XSTR_INSTANCE.nextFloat() * 0.5F)
+ .run();
+ }
+ if (chk2) {
+ events
+ .setPosition(
+ xPos + ran2 * 0.5F,
+ yPos + XSTR_INSTANCE.nextFloat() * 0.5F,
+ zPos + XSTR_INSTANCE.nextFloat() * 0.5F)
+ .run();
+ }
+ if (chk3) {
+ events
+ .setPosition(
+ xPos + ran3 * 0.5F,
+ yPos + XSTR_INSTANCE.nextFloat() * 0.5F,
+ zPos + XSTR_INSTANCE.nextFloat() * 0.5F)
+ .run();
+ }
+ }
+
+ public int calculatePollutionReduction(int aPollution) {
+ if (mTier < 2) {
+ return aPollution;
+ }
+ return (int) ((float) aPollution * ((100F - 12.5F * ((float) mTier - 1F)) / 100F));
+ }
+
+ /**
+ * @param mte The multi-block controller's {@link MetaTileEntity} MetaTileEntity is passed so newer muffler hatches
+ * can do wacky things with the multis
+ * @return pollution success
+ */
+ public boolean polluteEnvironment(MetaTileEntity mte) {
+ if (getBaseMetaTileEntity().getAirAtSide(getBaseMetaTileEntity().getFrontFacing())) {
+ GT_Pollution.addPollution(getBaseMetaTileEntity(), calculatePollutionReduction(10000));
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_MultiInput.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_MultiInput.java
new file mode 100644
index 0000000000..cea2e25baa
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_MultiInput.java
@@ -0,0 +1,305 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_INPUT_HATCH_2x2;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+
+import com.gtnewhorizons.modularui.api.ModularUITextures;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.fluid.FluidStackTank;
+import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_Hatch_MultiInput extends GT_MetaTileEntity_Hatch_Input implements IAddUIWidgets {
+
+ private final FluidStack[] mStoredFluid;
+ private final FluidStackTank[] fluidTanks;
+ public final int mCapacityPer;
+
+ public GT_MetaTileEntity_Hatch_MultiInput(int aID, int aSlot, String aName, String aNameRegional, int aTier) {
+ super(aID, aSlot, aName, aNameRegional, aTier);
+ this.mStoredFluid = new FluidStack[aSlot];
+ fluidTanks = new FluidStackTank[aSlot];
+ mCapacityPer = getCapacityPerTank(aTier, aSlot);
+ }
+
+ public GT_MetaTileEntity_Hatch_MultiInput(int aID, int aSlot, String aName, String aNameRegional, int aTier,
+ String[] aDescription) {
+ super(aID, aSlot, aName, aNameRegional, aTier, aDescription);
+ this.mStoredFluid = new FluidStack[aSlot];
+ fluidTanks = new FluidStackTank[aSlot];
+ mCapacityPer = getCapacityPerTank(aTier, aSlot);
+ }
+
+ public GT_MetaTileEntity_Hatch_MultiInput(String aName, int aSlot, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aSlot, aTier, aDescription, aTextures);
+ this.mStoredFluid = new FluidStack[aSlot];
+ fluidTanks = new FluidStackTank[aSlot];
+ mCapacityPer = getCapacityPerTank(aTier, aSlot);
+ for (int i = 0; i < aSlot; i++) {
+ final int index = i;
+ fluidTanks[i] = new FluidStackTank(
+ () -> mStoredFluid[index],
+ fluid -> mStoredFluid[index] = fluid,
+ mCapacityPer);
+ }
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_MultiInput(mName, getMaxType(), mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ if (mStoredFluid != null) {
+ for (int i = 0; i < mStoredFluid.length; i++) {
+ if (mStoredFluid[i] != null)
+ aNBT.setTag("mFluid" + i, mStoredFluid[i].writeToNBT(new NBTTagCompound()));
+ }
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (mStoredFluid != null) {
+ for (int i = 0; i < mStoredFluid.length; i++) {
+ if (aNBT.hasKey("mFluid" + i)) {
+ mStoredFluid[i] = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid" + i));
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return true;
+ }
+
+ public FluidStack[] getStoredFluid() {
+ return mStoredFluid;
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_INPUT_HATCH_2x2) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_INPUT_HATCH_2x2) };
+ }
+
+ public int getMaxType() {
+ return mStoredFluid.length;
+ }
+
+ @Override
+ public FluidStack getFluid() {
+ for (FluidStack tFluid : mStoredFluid) {
+ if (tFluid != null && tFluid.amount > 0) return tFluid;
+ }
+ return null;
+ }
+
+ public FluidStack getFluid(int aSlot) {
+ if (mStoredFluid == null || aSlot < 0 || aSlot >= getMaxType()) return null;
+ return mStoredFluid[aSlot];
+ }
+
+ @Override
+ public int getFluidAmount() {
+ if (getFluid() != null) {
+ return getFluid().amount;
+ }
+ return 0;
+ }
+
+ @Override
+ public int getCapacity() {
+ return mCapacityPer;
+ }
+
+ public int getFirstEmptySlot() {
+ for (int i = 0; i < mStoredFluid.length; i++) {
+ if (mStoredFluid[i] == null) return i;
+ }
+ return -1;
+ }
+
+ public boolean hasFluid(FluidStack aFluid) {
+ if (aFluid == null) return false;
+ for (FluidStack tFluid : mStoredFluid) {
+ if (aFluid.isFluidEqual(tFluid)) return true;
+ }
+ return false;
+ }
+
+ public int getFluidSlot(FluidStack tFluid) {
+ if (tFluid == null) return -1;
+ for (int i = 0; i < mStoredFluid.length; i++) {
+ if (tFluid.equals(mStoredFluid[i])) return i;
+ }
+ return -1;
+ }
+
+ public int getFluidAmount(FluidStack tFluid) {
+ int tSlot = getFluidSlot(tFluid);
+ if (tSlot != -1) {
+ return mStoredFluid[tSlot].amount;
+ }
+ return 0;
+ }
+
+ public void setFluid(FluidStack aFluid, int aSlot) {
+ if (aSlot < 0 || aSlot >= getMaxType()) return;
+ mStoredFluid[aSlot] = aFluid;
+ }
+
+ public void addFluid(FluidStack aFluid, int aSlot) {
+ if (aSlot < 0 || aSlot >= getMaxType()) return;
+ if (aFluid.equals(mStoredFluid[aSlot])) mStoredFluid[aSlot].amount += aFluid.amount;
+ if (mStoredFluid[aSlot] == null) mStoredFluid[aSlot] = aFluid.copy();
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ mFluid = getFluid();
+ }
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public int fill(FluidStack aFluid, boolean doFill) {
+ if (aFluid == null || aFluid.getFluid()
+ .getID() <= 0 || aFluid.amount <= 0 || !canTankBeFilled() || !isFluidInputAllowed(aFluid)) return 0;
+ if (!hasFluid(aFluid) && getFirstEmptySlot() != -1) {
+ int tFilled = Math.min(aFluid.amount, mCapacityPer);
+ if (doFill) {
+ FluidStack tFluid = aFluid.copy();
+ tFluid.amount = tFilled;
+ addFluid(tFluid, getFirstEmptySlot());
+ getBaseMetaTileEntity().markDirty();
+ }
+ return tFilled;
+ }
+ if (hasFluid(aFluid)) {
+ int tLeft = mCapacityPer - getFluidAmount(aFluid);
+ int tFilled = Math.min(tLeft, aFluid.amount);
+ if (doFill) {
+ FluidStack tFluid = aFluid.copy();
+ tFluid.amount = tFilled;
+ addFluid(tFluid, getFluidSlot(tFluid));
+ getBaseMetaTileEntity().markDirty();
+ }
+ return tFilled;
+ }
+ return 0;
+ }
+
+ @Override
+ public FluidStack drain(int maxDrain, boolean doDrain) {
+ if (getFluid() == null || !canTankBeEmptied()) return null;
+ if (getFluid().amount <= 0 && isFluidChangingAllowed()) {
+ setFluid(null, getFluidSlot(getFluid()));
+ getBaseMetaTileEntity().markDirty();
+ return null;
+ }
+ FluidStack tRemove = getFluid().copy();
+ tRemove.amount = Math.min(maxDrain, tRemove.amount);
+ if (doDrain) {
+ getFluid().amount -= tRemove.amount;
+ getBaseMetaTileEntity().markDirty();
+ }
+ if (getFluid() == null || getFluid().amount <= 0 && isFluidChangingAllowed()) {
+ setFluid(null, getFluidSlot(getFluid()));
+ getBaseMetaTileEntity().markDirty();
+ }
+ return tRemove;
+ }
+
+ @Override
+ public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
+ return fill(resource, doFill);
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection from, FluidStack aFluid, boolean doDrain) {
+ if (aFluid == null || !hasFluid(aFluid)) return null;
+ FluidStack tStored = mStoredFluid[getFluidSlot(aFluid)];
+ if (tStored.amount <= 0 && isFluidChangingAllowed()) {
+ setFluid(null, getFluidSlot(tStored));
+ getBaseMetaTileEntity().markDirty();
+ return null;
+ }
+ FluidStack tRemove = tStored.copy();
+ tRemove.amount = Math.min(aFluid.amount, tRemove.amount);
+ if (doDrain) {
+ tStored.amount -= tRemove.amount;
+ getBaseMetaTileEntity().markDirty();
+ }
+ if (tStored.amount <= 0 && isFluidChangingAllowed()) {
+ setFluid(null, getFluidSlot(tStored));
+ getBaseMetaTileEntity().markDirty();
+ }
+ return tRemove;
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection from) {
+ FluidTankInfo[] FTI = new FluidTankInfo[getMaxType()];
+ for (int i = 0; i < getMaxType(); i++) {
+ FTI[i] = new FluidTankInfo(mStoredFluid[i], mCapacityPer);
+ }
+ return FTI;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide() && mStoredFluid != null) {
+ for (int i = 0; i < getMaxType(); i++) {
+ if (mStoredFluid[i] != null && mStoredFluid[i].amount <= 0) {
+ mStoredFluid[i] = null;
+ }
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex >= 4;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ final int SLOT_NUMBER = 4;
+ final Pos2d[] positions = new Pos2d[] { new Pos2d(70, 25), new Pos2d(88, 25), new Pos2d(70, 43),
+ new Pos2d(88, 43), };
+
+ for (int i = 0; i < SLOT_NUMBER; i++) {
+ builder.widget(
+ new FluidSlotWidget(fluidTanks[i]).setBackground(ModularUITextures.FLUID_SLOT)
+ .setPos(positions[i]));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java
new file mode 100644
index 0000000000..fd83f6899b
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java
@@ -0,0 +1,502 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.FLUID_OUT_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
+
+import java.lang.ref.WeakReference;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.GT_Mod;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.interfaces.metatileentity.IFluidLockable;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.gui.modularui.widget.FluidLockWidget;
+
+public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch
+ implements IFluidStore, IFluidLockable, IAddUIWidgets {
+
+ private String lockedFluidName = null;
+ private WeakReference<EntityPlayer> playerThatLockedfluid = null;
+ public byte mMode = 0;
+
+ public GT_MetaTileEntity_Hatch_Output(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 4,
+ new String[] { "Fluid Output for Multiblocks",
+ "Capacity: " + GT_Utility.formatNumbers(8000L * (1L << aTier)) + "L",
+ "Right click with screwdriver to restrict output",
+ "Can be restricted to put out Items and/or Steam/No Steam/1 specific Fluid",
+ "Restricted Output Hatches are given priority for Multiblock Fluid output" });
+ }
+
+ public GT_MetaTileEntity_Hatch_Output(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Output(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Output(int aID, String aName, String aNameRegional, int aTier, String[] aDescription,
+ int inventorySize) {
+ super(aID, aName, aNameRegional, aTier, inventorySize, aDescription);
+ }
+
+ public GT_MetaTileEntity_Hatch_Output(String name, int tier, int slots, String[] description,
+ ITexture[][][] textures) {
+ super(name, tier, slots, description, textures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(FLUID_OUT_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(FLUID_OUT_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isLiquidInput(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Output(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && mFluid != null) {
+ IFluidHandler tTileEntity = aBaseMetaTileEntity
+ .getITankContainerAtSide(aBaseMetaTileEntity.getFrontFacing());
+ if (tTileEntity != null) {
+ GT_Utility.moveFluid(
+ aBaseMetaTileEntity,
+ tTileEntity,
+ aBaseMetaTileEntity.getFrontFacing(),
+ Math.max(1, mFluid.amount),
+ null);
+ }
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setByte("mMode", mMode);
+ if (isFluidLocked() && lockedFluidName != null && lockedFluidName.length() != 0)
+ aNBT.setString("lockedFluidName", lockedFluidName);
+ else aNBT.removeTag("lockedFluidName");
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mMode = aNBT.getByte("mMode");
+ if (isFluidLocked()) {
+ lockedFluidName = aNBT.getString("lockedFluidName");
+ }
+ lockedFluidName = GT_Utility.isStringInvalid(lockedFluidName) ? null : lockedFluidName;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ public int getLockedDisplaySlot() {
+ return 3;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ // Because getStackDisplaySlot() only allow return one int, this place I only can manually set.
+ return aIndex != getStackDisplaySlot() && aIndex != getLockedDisplaySlot();
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 1;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing() && aIndex == 0;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 8000 * (1 << mTier);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (!getBaseMetaTileEntity().getCoverInfoAtSide(side)
+ .isGUIClickable()) return;
+ if (aPlayer.isSneaking()) {
+ mMode = (byte) ((mMode + 9) % 10);
+ } else {
+ mMode = (byte) ((mMode + 1) % 10);
+ }
+ final String inBrackets;
+ switch (mMode) {
+ case 0 -> {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("108", "Outputs misc. Fluids, Steam and Items"));
+ this.setLockedFluidName(null);
+ }
+ case 1 -> {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("109", "Outputs Steam and Items"));
+ this.setLockedFluidName(null);
+ }
+ case 2 -> {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("110", "Outputs Steam and misc. Fluids"));
+ this.setLockedFluidName(null);
+ }
+ case 3 -> {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("111", "Outputs Steam"));
+ this.setLockedFluidName(null);
+ }
+ case 4 -> {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("112", "Outputs misc. Fluids and Items"));
+ this.setLockedFluidName(null);
+ }
+ case 5 -> {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("113", "Outputs only Items"));
+ this.setLockedFluidName(null);
+ }
+ case 6 -> {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("114", "Outputs only misc. Fluids"));
+ this.setLockedFluidName(null);
+ }
+ case 7 -> {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("115", "Outputs nothing"));
+ this.setLockedFluidName(null);
+ }
+ case 8 -> {
+ playerThatLockedfluid = new WeakReference<>(aPlayer);
+ if (mFluid == null) {
+ this.setLockedFluidName(null);
+ inBrackets = GT_Utility.trans(
+ "115.3",
+ "currently none, will be locked to the next that is put in (or use fluid cell to lock)");
+ } else {
+ this.setLockedFluidName(
+ this.getDrainableStack()
+ .getFluid()
+ .getName());
+ inBrackets = this.getDrainableStack()
+ .getLocalizedName();
+ }
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ String.format(
+ "%s (%s)",
+ GT_Utility.trans("151.1", "Outputs items and 1 specific Fluid"),
+ inBrackets));
+ }
+ case 9 -> {
+ playerThatLockedfluid = new WeakReference<>(aPlayer);
+ if (mFluid == null) {
+ this.setLockedFluidName(null);
+ inBrackets = GT_Utility.trans(
+ "115.3",
+ "currently none, will be locked to the next that is put in (or use fluid cell to lock)");
+ } else {
+ this.setLockedFluidName(
+ this.getDrainableStack()
+ .getFluid()
+ .getName());
+ inBrackets = this.getDrainableStack()
+ .getLocalizedName();
+ }
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ String.format("%s (%s)", GT_Utility.trans("151.2", "Outputs 1 specific Fluid"), inBrackets));
+ }
+ }
+ }
+
+ private boolean tryToLockHatch(EntityPlayer aPlayer, ForgeDirection side) {
+ if (!getBaseMetaTileEntity().getCoverInfoAtSide(side)
+ .isGUIClickable()) return false;
+ if (!isFluidLocked()) return false;
+ final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
+ if (tCurrentItem == null) return false;
+ FluidStack tFluid = FluidContainerRegistry.getFluidForFilledItem(tCurrentItem);
+ if (tFluid == null && tCurrentItem.getItem() instanceof IFluidContainerItem)
+ tFluid = ((IFluidContainerItem) tCurrentItem.getItem()).getFluid(tCurrentItem);
+ if (tFluid != null) {
+ if (getLockedFluidName() != null && !getLockedFluidName().equals(
+ tFluid.getFluid()
+ .getName())) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ String.format(
+ "%s %s",
+ GT_Utility.trans(
+ "151.3",
+ "Hatch is locked to a different fluid. To change the locking, empty it and made it locked to the next fluid with a screwdriver. Currently locked to"),
+ StatCollector.translateToLocal(getLockedFluidName())));
+ } else {
+ setLockedFluidName(
+ tFluid.getFluid()
+ .getName());
+ if (mMode == 8) GT_Utility.sendChatToPlayer(
+ aPlayer,
+ String.format(
+ "%s (%s)",
+ GT_Utility.trans("151.1", "Outputs items and 1 specific Fluid"),
+ tFluid.getLocalizedName()));
+ else GT_Utility.sendChatToPlayer(
+ aPlayer,
+ String.format(
+ "%s (%s)",
+ GT_Utility.trans("151.2", "Outputs 1 specific Fluid"),
+ tFluid.getLocalizedName()));
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public byte getMode() {
+ return mMode;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ if (tryToLockHatch(aPlayer, side)) return true;
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ }
+
+ public boolean outputsSteam() {
+ return mMode < 4;
+ }
+
+ public boolean outputsLiquids() {
+ return mMode % 2 == 0 || mMode == 9;
+ }
+
+ public boolean outputsItems() {
+ return mMode % 4 < 2 && mMode != 9;
+ }
+
+ @Override
+ public String getLockedFluidName() {
+ return lockedFluidName;
+ }
+
+ @Override
+ public void setLockedFluidName(String lockedFluidName) {
+ this.lockedFluidName = lockedFluidName;
+ markDirty();
+ }
+
+ @Override
+ public void lockFluid(boolean lock) {
+ if (lock) {
+ if (!isFluidLocked()) {
+ this.mMode = 9;
+ markDirty();
+ }
+ } else {
+ this.mMode = 0;
+ setLockedFluidName(null);
+ markDirty();
+ }
+ }
+
+ @Override
+ public boolean isFluidLocked() {
+ return mMode == 8 || mMode == 9;
+ }
+
+ @Override
+ public boolean acceptsFluidLock(String name) {
+ return true;
+ }
+
+ @Override
+ public boolean isEmptyAndAcceptsAnyFluid() {
+ return mMode == 0 && getFluidAmount() == 0;
+ }
+
+ @Override
+ public boolean canStoreFluid(@Nonnull FluidStack fluidStack) {
+ if (mFluid != null && !GT_Utility.areFluidsEqual(mFluid, fluidStack)) {
+ return false;
+ }
+ if (isFluidLocked()) {
+ if (lockedFluidName == null) {
+ return true;
+ }
+ return lockedFluidName.equals(
+ fluidStack.getFluid()
+ .getName());
+ }
+ if (GT_ModHandler.isSteam(fluidStack)) {
+ return outputsSteam();
+ }
+ return outputsLiquids();
+ }
+
+ @Override
+ public int getTankPressure() {
+ return +100;
+ }
+
+ @Override
+ protected void onEmptyingContainerWhenEmpty() {
+ if (this.lockedFluidName == null && this.mFluid != null && isFluidLocked()) {
+ this.setLockedFluidName(
+ this.mFluid.getFluid()
+ .getName());
+ final EntityPlayer player;
+ if (playerThatLockedfluid == null || (player = playerThatLockedfluid.get()) == null) return;
+ GT_Utility.sendChatToPlayer(
+ player,
+ String.format(GT_Utility.trans("151.4", "Successfully locked Fluid to %s"), mFluid.getLocalizedName()));
+ playerThatLockedfluid = null;
+ }
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { EnumChatFormatting.BLUE + "Output Hatch" + EnumChatFormatting.RESET, "Stored Fluid:",
+ EnumChatFormatting.GOLD + (mFluid == null ? "No Fluid" : mFluid.getLocalizedName())
+ + EnumChatFormatting.RESET,
+ EnumChatFormatting.GREEN + GT_Utility.formatNumbers(mFluid == null ? 0 : mFluid.amount)
+ + " L"
+ + EnumChatFormatting.RESET
+ + " "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getCapacity())
+ + " L"
+ + EnumChatFormatting.RESET,
+ (!isFluidLocked() || lockedFluidName == null) ? "Not Locked"
+ : ("Locked to " + StatCollector.translateToLocal(
+ FluidRegistry.getFluidStack(lockedFluidName, 1)
+ .getUnlocalizedName())) };
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(98, 16)
+ .setSize(71, 45))
+ .widget(new FluidLockWidget(this).setPos(149, 41))
+ .widget(
+ new TextWidget("Locked Fluid").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(101, 20))
+ .widget(TextWidget.dynamicString(() -> {
+ FluidStack fluidStack = FluidRegistry.getFluidStack(lockedFluidName, 1);
+ return fluidStack != null ? fluidStack.getLocalizedName() : "None";
+ })
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setTextAlignment(Alignment.CenterLeft)
+ .setMaxWidth(65)
+ .setPos(101, 30))
+ .widget(new FakeSyncWidget.ByteSyncer(() -> mMode, val -> mMode = val));
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java
new file mode 100644
index 0000000000..3bd92c6871
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java
@@ -0,0 +1,202 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.Textures.BlockIcons.ITEM_OUT_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
+import static gregtech.api.util.GT_Utility.moveMultipleItemStacks;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.GT_Mod;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.extensions.ArrayExt;
+
+public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch implements IAddUIWidgets {
+
+ public GT_MetaTileEntity_Hatch_OutputBus(int aID, String aName, String aNameRegional, int aTier) {
+ this(aID, aName, aNameRegional, aTier, getSlots(aTier));
+ }
+
+ public GT_MetaTileEntity_Hatch_OutputBus(int id, String name, String nameRegional, int tier, int slots) {
+ super(
+ id,
+ name,
+ nameRegional,
+ tier,
+ slots,
+ ArrayExt.of(
+ "Item Output for Multiblocks",
+ "Capacity: " + getSlots(tier) + " stack" + (getSlots(tier) >= 2 ? "s" : "")));
+ }
+
+ public GT_MetaTileEntity_Hatch_OutputBus(int aID, String aName, String aNameRegional, int aTier,
+ String[] aDescription) {
+ super(aID, aName, aNameRegional, aTier, getSlots(aTier), aDescription);
+ }
+
+ public GT_MetaTileEntity_Hatch_OutputBus(int aID, String aName, String aNameRegional, int aTier,
+ String[] aDescription, int inventorySize) {
+ super(aID, aName, aNameRegional, aTier, inventorySize, aDescription);
+ }
+
+ @Deprecated
+ // having too many constructors is bad, don't be so lazy, use GT_MetaTileEntity_Hatch_OutputBus(String, int,
+ // String[], ITexture[][][])
+ public GT_MetaTileEntity_Hatch_OutputBus(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ this(aName, aTier, getSlots(aTier), ArrayExt.of(aDescription), aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_OutputBus(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, getSlots(aTier), aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_OutputBus(String name, int tier, int slots, String[] description,
+ ITexture[][][] textures) {
+ super(name, tier, slots, description, textures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(ITEM_OUT_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch
+ ? new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(ITEM_OUT_SIGN) }
+ : new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_PIPE_OUT) };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_OutputBus(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ /**
+ * Attempt to store as many items as possible into the internal inventory of this output bus. If you need atomicity
+ * you should use {@link gregtech.api.interfaces.tileentity.IHasInventory#addStackToSlot(int, ItemStack)}
+ *
+ * @param aStack Assume valid. Will be mutated. Take over the ownership. Caller should not retain a reference to
+ * this stack if the call returns true.
+ * @return true if stack is fully accepted. false is stack is partially accepted or nothing is accepted
+ */
+ public boolean storeAll(ItemStack aStack) {
+ markDirty();
+ for (int i = 0, mInventoryLength = mInventory.length; i < mInventoryLength && aStack.stackSize > 0; i++) {
+ ItemStack tSlot = mInventory[i];
+ if (GT_Utility.isStackInvalid(tSlot)) {
+ int tRealStackLimit = Math.min(getInventoryStackLimit(), aStack.getMaxStackSize());
+ if (aStack.stackSize <= tRealStackLimit) {
+ mInventory[i] = aStack;
+ return true;
+ }
+ mInventory[i] = aStack.splitStack(tRealStackLimit);
+ } else {
+ int tRealStackLimit = Math.min(getInventoryStackLimit(), tSlot.getMaxStackSize());
+ if (tSlot.stackSize < tRealStackLimit && tSlot.isItemEqual(aStack)
+ && ItemStack.areItemStackTagsEqual(tSlot, aStack)) {
+ if (aStack.stackSize + tSlot.stackSize <= tRealStackLimit) {
+ mInventory[i].stackSize += aStack.stackSize;
+ return true;
+ } else {
+ // more to serve
+ aStack.stackSize -= tRealStackLimit - tSlot.stackSize;
+ mInventory[i].stackSize = tRealStackLimit;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && (aTick & 0x7) == 0) {
+ final IInventory tTileEntity = aBaseMetaTileEntity
+ .getIInventoryAtSide(aBaseMetaTileEntity.getFrontFacing());
+ if (tTileEntity != null) {
+ moveMultipleItemStacks(
+ aBaseMetaTileEntity,
+ tTileEntity,
+ aBaseMetaTileEntity.getFrontFacing(),
+ aBaseMetaTileEntity.getBackFacing(),
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1,
+ mInventory.length);
+ for (int i = 0; i < mInventory.length; i++)
+ if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ switch (mTier) {
+ case 0 -> getBaseMetaTileEntity().add1by1Slot(builder);
+ case 1 -> getBaseMetaTileEntity().add2by2Slots(builder);
+ case 2 -> getBaseMetaTileEntity().add3by3Slots(builder);
+ default -> getBaseMetaTileEntity().add4by4Slots(builder);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_QuadrupleHumongous.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_QuadrupleHumongous.java
new file mode 100644
index 0000000000..e0ab7acf95
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_QuadrupleHumongous.java
@@ -0,0 +1,27 @@
+package gregtech.api.metatileentity.implementations;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+public class GT_MetaTileEntity_Hatch_QuadrupleHumongous extends GT_MetaTileEntity_Hatch_MultiInput {
+
+ public GT_MetaTileEntity_Hatch_QuadrupleHumongous(int aID, int aSlot, String aName, String aNameRegional) {
+ super(aID, aSlot, aName, aNameRegional, 13);
+ }
+
+ public GT_MetaTileEntity_Hatch_QuadrupleHumongous(String aName, int aSlot, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aSlot, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public int getCapacityPerTank(int aTier, int aSlot) {
+ return 500_000_000;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_QuadrupleHumongous(mName, getMaxType(), mTier, mDescriptionArray, mTextures);
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java
new file mode 100644
index 0000000000..32ea708773
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java
@@ -0,0 +1,2540 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static mcp.mobius.waila.api.SpecialChars.GREEN;
+import static mcp.mobius.waila.api.SpecialChars.RED;
+import static mcp.mobius.waila.api.SpecialChars.RESET;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.IntConsumer;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.TestOnly;
+import org.lwjgl.input.Keyboard;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.modularui.IBindPlayerInventoryUI;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SingleRecipeCheck;
+import gregtech.api.util.GT_ClientPreference;
+import gregtech.api.util.GT_ExoticEnergyInputHelper;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GT_Waila;
+import gregtech.api.util.OutputHatchWrapper;
+import gregtech.api.util.VoidProtectionHelper;
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gregtech.client.GT_SoundLoop;
+import gregtech.common.GT_Pollution;
+import gregtech.common.gui.modularui.widget.CheckRecipeResultSyncer;
+import gregtech.common.gui.modularui.widget.ShutDownReasonSyncer;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_CraftingInput_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_InputBus_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Input_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_OutputBus_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Output_ME;
+import gregtech.common.tileentities.machines.IDualInputHatch;
+import gregtech.common.tileentities.machines.IDualInputInventory;
+import gregtech.common.tileentities.machines.IRecipeProcessingAwareHatch;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine;
+import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap;
+import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity
+ implements ControllerWithOptionalFeatures, IAddGregtechLogo, IAddUIWidgets, IBindPlayerInventoryUI {
+
+ public static boolean disableMaintenance;
+ public boolean mMachine = false, mWrench = false, mScrewdriver = false, mSoftHammer = false, mHardHammer = false,
+ mSolderingTool = false, mCrowbar = false, mRunningOnLoad = false;
+ public boolean mStructureChanged = false;
+ public int mPollution = 0, mProgresstime = 0, mMaxProgresstime = 0, mEUt = 0, mEfficiencyIncrease = 0,
+ mStartUpCheck = 100, mRuntime = 0, mEfficiency = 0;
+ public volatile boolean mUpdated = false;
+ public int mUpdate = 0;
+ public ItemStack[] mOutputItems = null;
+ public FluidStack[] mOutputFluids = null;
+ public String mNEI;
+ public int damageFactorLow = 5;
+ public float damageFactorHigh = 0.6f;
+
+ public boolean mLockedToSingleRecipe = getDefaultRecipeLockingMode();
+ protected boolean inputSeparation = getDefaultInputSeparationMode();
+ protected VoidingMode voidingMode = getDefaultVoidingMode();
+ protected boolean batchMode = getDefaultBatchMode();
+ private @Nonnull CheckRecipeResult checkRecipeResult = CheckRecipeResultRegistry.NONE;
+
+ protected static final String INPUT_SEPARATION_NBT_KEY = "inputSeparation";
+ protected static final String VOID_EXCESS_NBT_KEY = "voidExcess";
+ protected static final String VOIDING_MODE_NBT_KEY = "voidingMode";
+ protected static final String BATCH_MODE_NBT_KEY = "batchMode";
+ protected SingleRecipeCheck mSingleRecipeCheck = null;
+
+ public ArrayList<GT_MetaTileEntity_Hatch_Input> mInputHatches = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch_Output> mOutputHatches = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch_InputBus> mInputBusses = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch_OutputBus> mOutputBusses = new ArrayList<>();
+ public ArrayList<IDualInputHatch> mDualInputHatches = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch_Dynamo> mDynamoHatches = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch_Muffler> mMufflerHatches = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch_Energy> mEnergyHatches = new ArrayList<>();
+ public ArrayList<GT_MetaTileEntity_Hatch_Maintenance> mMaintenanceHatches = new ArrayList<>();
+ protected List<GT_MetaTileEntity_Hatch> mExoticEnergyHatches = new ArrayList<>();
+ protected final ProcessingLogic processingLogic;
+ @SideOnly(Side.CLIENT)
+ protected GT_SoundLoop activitySoundLoop;
+
+ private long mLastWorkingTick = 0;
+
+ protected static final byte INTERRUPT_SOUND_INDEX = 8;
+ protected static final byte PROCESS_START_SOUND_INDEX = 1;
+
+ public GT_MetaTileEntity_MultiBlockBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, 2);
+ this.processingLogic = null;
+ GT_MetaTileEntity_MultiBlockBase.disableMaintenance = GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "MultiBlockMachines.disableMaintenance", false);
+ this.damageFactorLow = GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "MultiBlockMachines.damageFactorLow", 5);
+ this.damageFactorHigh = (float) GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "MultiBlockMachines.damageFactorHigh", 0.6f);
+ this.mNEI = "";
+ }
+
+ public GT_MetaTileEntity_MultiBlockBase(String aName) {
+ super(aName, 2);
+ this.processingLogic = createProcessingLogic();
+ GT_MetaTileEntity_MultiBlockBase.disableMaintenance = GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "MultiBlockMachines.disableMaintenance", false);
+ this.damageFactorLow = GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "MultiBlockMachines.damageFactorLow", 5);
+ this.damageFactorHigh = (float) GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "MultiBlockMachines.damageFactorHigh", 0.6f);
+ }
+
+ @Override
+ public boolean isDisplaySecondaryDescription() {
+ return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT);
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) {
+ return side != getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (supportsSingleRecipeLocking()) {
+ mLockedToSingleRecipe = !mLockedToSingleRecipe;
+ if (mLockedToSingleRecipe) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("223", "Single recipe locking enabled. Will lock to next recipe."));
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("220", "Single recipe locking disabled."));
+ mSingleRecipeCheck = null;
+ }
+ }
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex > 0;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return mProgresstime;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return mMaxProgresstime;
+ }
+
+ @Override
+ public int increaseProgress(int aProgress) {
+ return aProgress;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mEUt", mEUt);
+ aNBT.setInteger("mProgresstime", mProgresstime);
+ aNBT.setInteger("mMaxProgresstime", mMaxProgresstime);
+ aNBT.setInteger("mEfficiencyIncrease", mEfficiencyIncrease);
+ aNBT.setInteger("mEfficiency", mEfficiency);
+ aNBT.setInteger("mPollution", mPollution);
+ aNBT.setInteger("mRuntime", mRuntime);
+ if (supportsSingleRecipeLocking()) {
+ aNBT.setBoolean("mLockedToSingleRecipe", mLockedToSingleRecipe);
+ if (mLockedToSingleRecipe && mSingleRecipeCheck != null)
+ aNBT.setTag("mSingleRecipeCheck", mSingleRecipeCheck.writeToNBT());
+ }
+
+ if (mOutputItems != null) {
+ aNBT.setInteger("mOutputItemsLength", mOutputItems.length);
+ for (int i = 0; i < mOutputItems.length; i++) if (mOutputItems[i] != null) {
+ GT_Utility.saveItem(aNBT, "mOutputItem" + i, mOutputItems[i]);
+ }
+ }
+ if (mOutputFluids != null) {
+ aNBT.setInteger("mOutputFluidsLength", mOutputFluids.length);
+ for (int i = 0; i < mOutputFluids.length; i++) if (mOutputFluids[i] != null) {
+ NBTTagCompound tNBT = new NBTTagCompound();
+ mOutputFluids[i].writeToNBT(tNBT);
+ aNBT.setTag("mOutputFluids" + i, tNBT);
+ }
+ }
+ aNBT.setBoolean("mWrench", mWrench);
+ aNBT.setBoolean("mScrewdriver", mScrewdriver);
+ aNBT.setBoolean("mSoftHammer", mSoftHammer);
+ aNBT.setBoolean("mHardHammer", mHardHammer);
+ aNBT.setBoolean("mSolderingTool", mSolderingTool);
+ aNBT.setBoolean("mCrowbar", mCrowbar);
+ aNBT.setBoolean(BATCH_MODE_NBT_KEY, batchMode);
+ aNBT.setBoolean(INPUT_SEPARATION_NBT_KEY, inputSeparation);
+ aNBT.setString(VOIDING_MODE_NBT_KEY, voidingMode.name);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mEUt = aNBT.getInteger("mEUt");
+ mProgresstime = aNBT.getInteger("mProgresstime");
+ mMaxProgresstime = aNBT.getInteger("mMaxProgresstime");
+ if (mMaxProgresstime > 0) mRunningOnLoad = true;
+ mEfficiencyIncrease = aNBT.getInteger("mEfficiencyIncrease");
+ mEfficiency = aNBT.getInteger("mEfficiency");
+ mPollution = aNBT.getInteger("mPollution");
+ mRuntime = aNBT.getInteger("mRuntime");
+ if (supportsSingleRecipeLocking()) {
+ mLockedToSingleRecipe = aNBT.getBoolean("mLockedToSingleRecipe");
+ if (mLockedToSingleRecipe && aNBT.hasKey("mSingleRecipeCheck", Constants.NBT.TAG_COMPOUND)) {
+ SingleRecipeCheck c = loadSingleRecipeChecker(aNBT.getCompoundTag("mSingleRecipeCheck"));
+ if (c != null) mSingleRecipeCheck = c;
+ // the old recipe is gone. we disable the machine to prevent making garbage in case of shared inputs
+ // maybe use a better way to inform player in the future.
+ else getBaseMetaTileEntity().disableWorking();
+ }
+ }
+ batchMode = aNBT.getBoolean(BATCH_MODE_NBT_KEY);
+ inputSeparation = aNBT.getBoolean(INPUT_SEPARATION_NBT_KEY);
+ if (aNBT.hasKey(VOIDING_MODE_NBT_KEY, Constants.NBT.TAG_STRING)) {
+ voidingMode = VoidingMode.fromName(aNBT.getString(VOIDING_MODE_NBT_KEY));
+ } else if (aNBT.hasKey(VOID_EXCESS_NBT_KEY)) {
+ // backward compatibility
+ voidingMode = aNBT.getBoolean(VOID_EXCESS_NBT_KEY) ? VoidingMode.VOID_ALL : VoidingMode.VOID_NONE;
+ }
+ if (!getAllowedVoidingModes().contains(voidingMode)) voidingMode = getDefaultVoidingMode();
+
+ int aOutputItemsLength = aNBT.getInteger("mOutputItemsLength");
+ if (aOutputItemsLength > 0) {
+ mOutputItems = new ItemStack[aOutputItemsLength];
+ for (int i = 0; i < mOutputItems.length; i++)
+ mOutputItems[i] = GT_Utility.loadItem(aNBT, "mOutputItem" + i);
+ }
+
+ int aOutputFluidsLength = aNBT.getInteger("mOutputFluidsLength");
+ if (aOutputFluidsLength > 0) {
+ mOutputFluids = new FluidStack[aOutputFluidsLength];
+ for (int i = 0; i < mOutputFluids.length; i++)
+ mOutputFluids[i] = GT_Utility.loadFluid(aNBT, "mOutputFluids" + i);
+ }
+
+ mWrench = aNBT.getBoolean("mWrench");
+ mScrewdriver = aNBT.getBoolean("mScrewdriver");
+ mSoftHammer = aNBT.getBoolean("mSoftHammer");
+ mHardHammer = aNBT.getBoolean("mHardHammer");
+ mSolderingTool = aNBT.getBoolean("mSolderingTool");
+ mCrowbar = aNBT.getBoolean("mCrowbar");
+ }
+
+ protected SingleRecipeCheck loadSingleRecipeChecker(NBTTagCompound aNBT) {
+ return SingleRecipeCheck.tryLoad(getRecipeMap(), aNBT);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public byte getTileEntityBaseType() {
+ return 2;
+ }
+
+ /**
+ * Set the structure as having changed, and trigger an update.
+ */
+ public void onStructureChange() {
+ mStructureChanged = true;
+ }
+
+ @Override
+ public void onMachineBlockUpdate() {
+ mUpdated = true;
+ }
+
+ /**
+ * ClearHatches as a part of structure check. If your multiblock has any hatches that need clearing override this
+ * method, call super, and clear your own hatches
+ */
+ public void clearHatches() {
+ mInputHatches.clear();
+ mInputBusses.clear();
+ mOutputHatches.clear();
+ mOutputBusses.clear();
+ mDynamoHatches.clear();
+ mEnergyHatches.clear();
+ setMufflers(false);
+ mMufflerHatches.clear();
+ mMaintenanceHatches.clear();
+ mDualInputHatches.clear();
+ }
+
+ public boolean checkStructure(boolean aForceReset) {
+ return checkStructure(aForceReset, getBaseMetaTileEntity());
+ }
+
+ public boolean checkStructure(boolean aForceReset, IGregTechTileEntity aBaseMetaTileEntity) {
+ if (!aBaseMetaTileEntity.isServerSide()) return mMachine;
+ // Only trigger an update if forced (from onPostTick, generally), or if the structure has changed
+ if ((mStructureChanged || aForceReset)) {
+ clearHatches();
+ mMachine = checkMachine(aBaseMetaTileEntity, mInventory[1]);
+ }
+ mStructureChanged = false;
+ return mMachine;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (mEfficiency < 0) mEfficiency = 0;
+ if (mUpdated) {
+ // duct tape fix for too many updates on an overloaded server, causing the structure check to not run
+ if (mUpdate <= 0) mUpdate = 50;
+ mUpdated = false;
+ }
+ if (--mUpdate == 0 || --mStartUpCheck == 0) {
+ checkStructure(true, aBaseMetaTileEntity);
+ }
+
+ if (mStartUpCheck < 0) {
+ if (mMachine) {
+ checkMaintenance();
+ if (getRepairStatus() > 0) {
+ runMachine(aBaseMetaTileEntity, aTick);
+ } else if (aBaseMetaTileEntity.isAllowedToWork()) {
+ stopMachine(ShutDownReasonRegistry.NO_REPAIR);
+ }
+ } else if (aBaseMetaTileEntity.isAllowedToWork()) {
+ stopMachine(ShutDownReasonRegistry.STRUCTURE_INCOMPLETE);
+ }
+ }
+ aBaseMetaTileEntity.setErrorDisplayID(
+ (aBaseMetaTileEntity.getErrorDisplayID() & ~127) | (mWrench ? 0 : 1)
+ | (mScrewdriver ? 0 : 2)
+ | (mSoftHammer ? 0 : 4)
+ | (mHardHammer ? 0 : 8)
+ | (mSolderingTool ? 0 : 16)
+ | (mCrowbar ? 0 : 32)
+ | (mMachine ? 0 : 64));
+ aBaseMetaTileEntity.setActive(mMaxProgresstime > 0);
+ boolean active = aBaseMetaTileEntity.isActive() && mPollution > 0;
+ setMufflers(active);
+ } else {
+ if (!aBaseMetaTileEntity.hasMufflerUpgrade()) {
+ doActivitySound(getActivitySoundLoop());
+ }
+ }
+ }
+
+ @Override
+ public void onTickFail(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onTickFail(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+ aBaseMetaTileEntity.disableWorking();
+ checkRecipeResult = CheckRecipeResultRegistry.CRASH;
+ }
+ }
+
+ private void checkMaintenance() {
+ if (disableMaintenance) {
+ mWrench = true;
+ mScrewdriver = true;
+ mSoftHammer = true;
+ mHardHammer = true;
+ mSolderingTool = true;
+ mCrowbar = true;
+
+ return;
+ }
+ for (GT_MetaTileEntity_Hatch_Maintenance tHatch : filterValidMTEs(mMaintenanceHatches)) {
+ if (tHatch.mAuto && !(mWrench && mScrewdriver && mSoftHammer && mHardHammer && mSolderingTool && mCrowbar))
+ tHatch.autoMaintainance();
+ if (tHatch.mWrench) mWrench = true;
+ if (tHatch.mScrewdriver) mScrewdriver = true;
+ if (tHatch.mSoftHammer) mSoftHammer = true;
+ if (tHatch.mHardHammer) mHardHammer = true;
+ if (tHatch.mSolderingTool) mSolderingTool = true;
+ if (tHatch.mCrowbar) mCrowbar = true;
+
+ tHatch.mWrench = false;
+ tHatch.mScrewdriver = false;
+ tHatch.mSoftHammer = false;
+ tHatch.mHardHammer = false;
+ tHatch.mSolderingTool = false;
+ tHatch.mCrowbar = false;
+ }
+ }
+
+ /**
+ * Starts checking recipe with some operations needed to actually run the check. Overriding this without due care
+ * may result in dupe of items, hence it's marked as final.
+ * <p>
+ * See {@link #createProcessingLogic()} or {@link #checkProcessing()} for what you want to override.
+ *
+ * @return If successfully found recipe and/or started processing
+ */
+ protected final boolean checkRecipe() {
+ startRecipeProcessing();
+ CheckRecipeResult result = checkProcessing();
+ if (!CheckRecipeResultRegistry.isRegistered(result.getID())) {
+ throw new RuntimeException(String.format("Result %s is not registered for registry", result.getID()));
+ }
+ if (result.wasSuccessful()) {
+ sendStartMultiBlockSoundLoop();
+ }
+ this.checkRecipeResult = result;
+ endRecipeProcessing();
+ // Don't use `result` here because `endRecipeProcessing()` might mutate `this.checkRecipeResult`
+ return this.checkRecipeResult.wasSuccessful();
+ }
+
+ private boolean shouldCheckRecipeThisTick(long aTick) {
+ // do a recipe check if any crafting input hatch just got pushed in items
+ boolean shouldCheck = false;
+ // check all of them (i.e. do not return early) to reset the state of all of them.
+ for (IDualInputHatch craftingInputMe : mDualInputHatches) {
+ shouldCheck |= craftingInputMe.justUpdated();
+ }
+ if (shouldCheck) return true;
+
+ // Perform more frequent recipe change after the machine just shuts down.
+ long timeElapsed = aTick - mLastWorkingTick;
+
+ if (timeElapsed >= 100) return aTick % 100 == 0;
+ // Batch mode should be a lot less aggressive at recipe checking
+ if (!isBatchModeEnabled()) {
+ return timeElapsed == 5 || timeElapsed == 12
+ || timeElapsed == 20
+ || timeElapsed == 30
+ || timeElapsed == 40
+ || timeElapsed == 55
+ || timeElapsed == 70
+ || timeElapsed == 85;
+ }
+ return false;
+ }
+
+ protected void runMachine(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (mMaxProgresstime > 0 && doRandomMaintenanceDamage()) {
+ if (onRunningTick(mInventory[1])) {
+ markDirty();
+ if (!polluteEnvironment(getPollutionPerTick(mInventory[1]))) {
+ stopMachine(ShutDownReasonRegistry.POLLUTION_FAIL);
+ }
+ if (mMaxProgresstime > 0 && ++mProgresstime >= mMaxProgresstime) {
+ if (mOutputItems != null) {
+ for (ItemStack tStack : mOutputItems) {
+ if (tStack != null) {
+ try {
+ GT_Mod.achievements.issueAchivementHatch(
+ aBaseMetaTileEntity.getWorld()
+ .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()),
+ tStack);
+ } catch (Exception ignored) {}
+ addOutput(tStack);
+ }
+ }
+ mOutputItems = null;
+ }
+ if (mOutputFluids != null) {
+ addFluidOutputs(mOutputFluids);
+ if (mOutputFluids.length > 1) {
+ try {
+ GT_Mod.achievements.issueAchievement(
+ aBaseMetaTileEntity.getWorld()
+ .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()),
+ "oilplant");
+ } catch (Exception ignored) {}
+ }
+ mOutputFluids = null;
+ }
+ mEfficiency = Math.max(
+ 0,
+ Math.min(
+ mEfficiency + mEfficiencyIncrease,
+ getMaxEfficiency(mInventory[1]) - ((getIdealStatus() - getRepairStatus()) * 1000)));
+ mOutputItems = null;
+ mProgresstime = 0;
+ mMaxProgresstime = 0;
+ mEfficiencyIncrease = 0;
+ mLastWorkingTick = aTick;
+ if (aBaseMetaTileEntity.isAllowedToWork()) {
+ checkRecipe();
+ }
+ }
+ }
+ } else {
+ if (shouldCheckRecipeThisTick(aTick) || aBaseMetaTileEntity.hasWorkJustBeenEnabled()
+ || aBaseMetaTileEntity.hasInventoryBeenModified()) {
+
+ if (aBaseMetaTileEntity.isAllowedToWork()) {
+ if (checkRecipe()) {
+ markDirty();
+ }
+ }
+ if (mMaxProgresstime <= 0) mEfficiency = Math.max(0, mEfficiency - 1000);
+ }
+ }
+ }
+
+ public boolean polluteEnvironment(int aPollutionLevel) {
+ mPollution += aPollutionLevel;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ if (mPollution >= 10000) {
+ if (tHatch.polluteEnvironment(this)) {
+ mPollution -= 10000;
+ }
+ } else {
+ break;
+ }
+ }
+ return mPollution < 10000;
+ }
+
+ protected void sendStartMultiBlockSoundLoop() {
+ if (getProcessStartSound() != null) {
+ sendLoopStart(PROCESS_START_SOUND_INDEX);
+ }
+ }
+
+ @Override
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ super.doSound(aIndex, aX, aY, aZ);
+ switch (aIndex) {
+ case PROCESS_START_SOUND_INDEX -> {
+ if (getProcessStartSound() != null)
+ GT_Utility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ);
+ }
+ case INTERRUPT_SOUND_INDEX -> GT_Utility
+ .doSoundAtClient(SoundResource.IC2_MACHINES_INTERRUPT_ONE, 100, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == PROCESS_START_SOUND_INDEX) {
+ if (getProcessStartSound() != null)
+ GT_Utility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ protected void doActivitySound(ResourceLocation activitySound) {
+ if (getBaseMetaTileEntity().isActive() && activitySound != null) {
+ if (activitySoundLoop == null) {
+ activitySoundLoop = new GT_SoundLoop(activitySound, getBaseMetaTileEntity(), false, true);
+ Minecraft.getMinecraft()
+ .getSoundHandler()
+ .playSound(activitySoundLoop);
+ }
+ } else {
+ if (activitySoundLoop != null) {
+ activitySoundLoop = null;
+ }
+ }
+ }
+
+ /**
+ * @return Time before the start process sound is played again
+ */
+ protected int getTimeBetweenProcessSounds() {
+ return 100;
+ }
+
+ /**
+ * @return Sound that will be played once, when the recipe check was valid
+ */
+ protected SoundResource getProcessStartSound() {
+ return null;
+ }
+
+ /**
+ * @return Sound that will be looped for as long as the machine is doing a recipe
+ */
+ @SideOnly(Side.CLIENT)
+ protected ResourceLocation getActivitySoundLoop() {
+ return null;
+ }
+
+ /**
+ * Called every tick the Machine runs
+ */
+ public boolean onRunningTick(ItemStack aStack) {
+ if (mEUt > 0) {
+ addEnergyOutput(((long) mEUt * mEfficiency) / 10000);
+ return true;
+ }
+ if (mEUt < 0) {
+ if (!drainEnergyInput(getActualEnergyUsage())) {
+ stopMachine(ShutDownReasonRegistry.POWER_LOSS);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ protected long getActualEnergyUsage() {
+ return ((long) -mEUt * 10_000) / Math.max(1000, mEfficiency);
+ }
+
+ /**
+ * Checks if this is a Correct Machine Part for this kind of Machine (Turbine Rotor for example)
+ */
+ public abstract boolean isCorrectMachinePart(ItemStack aStack);
+
+ /**
+ * @deprecated Use {@link #createProcessingLogic()} or {@link #checkProcessing()}
+ */
+ @Deprecated
+ public boolean checkRecipe(ItemStack aStack) {
+ return false;
+ }
+
+ /**
+ * Checks recipe and setup machine if it's successful.
+ * <p>
+ * For generic machine working with recipemap, use {@link #createProcessingLogic()} to make use of shared codebase.
+ */
+ @Nonnull
+ public CheckRecipeResult checkProcessing() {
+ // If no logic is found, try legacy checkRecipe
+ if (processingLogic == null) {
+ return checkRecipe(mInventory[1]) ? CheckRecipeResultRegistry.SUCCESSFUL
+ : CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ setupProcessingLogic(processingLogic);
+
+ CheckRecipeResult result = doCheckRecipe();
+ result = postCheckRecipe(result, processingLogic);
+ // inputs are consumed at this point
+ updateSlots();
+ if (!result.wasSuccessful()) return result;
+
+ mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
+ mEfficiencyIncrease = 10000;
+ mMaxProgresstime = processingLogic.getDuration();
+ setEnergyUsage(processingLogic);
+
+ mOutputItems = processingLogic.getOutputItems();
+ mOutputFluids = processingLogic.getOutputFluids();
+
+ return result;
+ }
+
+ /**
+ * @return If controller slot should be considered as inputs for {@link #doCheckRecipe}
+ */
+ protected boolean canUseControllerSlotForRecipe() {
+ return true;
+ }
+
+ /**
+ * Initializes processing logic for use. Unlike {@link #createProcessingLogic}, this method is called
+ * every time checking for recipes.
+ */
+ protected void setupProcessingLogic(ProcessingLogic logic) {
+ logic.clear();
+ logic.setMachine(this);
+ logic.setRecipeMapSupplier(this::getRecipeMap);
+ logic.setVoidProtection(protectsExcessItem(), protectsExcessFluid());
+ logic.setBatchSize(isBatchModeEnabled() ? getMaxBatchSize() : 1);
+ logic.setRecipeLocking(this, isRecipeLockingEnabled());
+ setProcessingLogicPower(logic);
+ }
+
+ /**
+ * Initializes processing logic for use, specifically for power-related parameters.
+ * Unlike {@link #createProcessingLogic}, this method is called every time checking for recipes.
+ */
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(getAverageInputVoltage());
+ logic.setAvailableAmperage(getMaxInputAmps());
+ logic.setAmperageOC(mEnergyHatches.size() != 1);
+ }
+
+ protected boolean supportsCraftingMEBuffer() {
+ return true;
+ }
+
+ /**
+ * Iterates over hatches and tries to find recipe. Assume {@link #processingLogic} is already set up for use.
+ * If return value is successful, inputs are consumed.
+ */
+ @Nonnull
+ protected CheckRecipeResult doCheckRecipe() {
+ CheckRecipeResult result = CheckRecipeResultRegistry.NO_RECIPE;
+ // check crafting input hatches first
+ if (supportsCraftingMEBuffer()) {
+ for (IDualInputHatch dualInputHatch : mDualInputHatches) {
+ for (var it = dualInputHatch.inventories(); it.hasNext();) {
+ IDualInputInventory slot = it.next();
+ processingLogic.setInputItems(slot.getItemInputs());
+ processingLogic.setInputFluids(slot.getFluidInputs());
+ CheckRecipeResult foundResult = processingLogic.process();
+ if (foundResult.wasSuccessful()) {
+ return foundResult;
+ }
+ if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) {
+ // Recipe failed in interesting way, so remember that and continue searching
+ result = foundResult;
+ }
+ }
+ }
+ }
+
+ processingLogic.setInputFluids(getStoredFluids());
+
+ if (isInputSeparationEnabled()) {
+ if (mInputBusses.isEmpty()) {
+ CheckRecipeResult foundResult = processingLogic.process();
+ if (foundResult.wasSuccessful()) {
+ return foundResult;
+ }
+ if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) {
+ // Recipe failed in interesting way, so remember that and continue searching
+ result = foundResult;
+ }
+ } else {
+ for (GT_MetaTileEntity_Hatch_InputBus bus : mInputBusses) {
+ if (bus instanceof GT_MetaTileEntity_Hatch_CraftingInput_ME) {
+ continue;
+ }
+ List<ItemStack> inputItems = new ArrayList<>();
+ for (int i = bus.getSizeInventory() - 1; i >= 0; i--) {
+ ItemStack stored = bus.getStackInSlot(i);
+ if (stored != null) {
+ inputItems.add(stored);
+ }
+ }
+ if (canUseControllerSlotForRecipe() && getControllerSlot() != null) {
+ inputItems.add(getControllerSlot());
+ }
+ processingLogic.setInputItems(inputItems.toArray(new ItemStack[0]));
+ CheckRecipeResult foundResult = processingLogic.process();
+ if (foundResult.wasSuccessful()) {
+ return foundResult;
+ }
+ if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) {
+ // Recipe failed in interesting way, so remember that and continue searching
+ result = foundResult;
+ }
+ }
+ }
+ } else {
+ List<ItemStack> inputItems = getStoredInputs();
+ if (canUseControllerSlotForRecipe() && getControllerSlot() != null) {
+ inputItems.add(getControllerSlot());
+ }
+ processingLogic.setInputItems(inputItems);
+ CheckRecipeResult foundResult = processingLogic.process();
+ if (foundResult.wasSuccessful()) {
+ return foundResult;
+ }
+ if (foundResult != CheckRecipeResultRegistry.NO_RECIPE) {
+ // Recipe failed in interesting way, so remember that
+ result = foundResult;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Performs additional check for {@link #processingLogic} after all the calculations are done.
+ * As many as checks should be done inside of custom {@link ProcessingLogic}, which you can specify with
+ * {@link #createProcessingLogic()}, because when this method is called, inputs might have been already consumed.
+ * However, certain checks cannot be done like that; Checking energy overflow should be suppressed for
+ * long-power machines for example.
+ *
+ * @return Modified (or not modified) result
+ */
+ @Nonnull
+ protected CheckRecipeResult postCheckRecipe(@Nonnull CheckRecipeResult result,
+ @Nonnull ProcessingLogic processingLogic) {
+ if (result.wasSuccessful() && processingLogic.getCalculatedEut() > Integer.MAX_VALUE) {
+ return CheckRecipeResultRegistry.POWER_OVERFLOW;
+ }
+ return result;
+ }
+
+ /**
+ * Called after {@link #doCheckRecipe} and {@link #postCheckRecipe} being successful.
+ * Override to set energy usage for this machine.
+ */
+ protected void setEnergyUsage(ProcessingLogic processingLogic) {
+ // getCalculatedEut() is guaranteed to not exceed int by postCheckRecipe()
+ mEUt = (int) processingLogic.getCalculatedEut();
+ if (mEUt > 0) {
+ mEUt = (-mEUt);
+ }
+ }
+
+ protected int getMaxBatchSize() {
+ return 128;
+ }
+
+ /**
+ * Checks the Machine. You have to assign the MetaTileEntities for the Hatches here.
+ */
+ public abstract boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack);
+
+ /**
+ * Gets the maximum Efficiency that spare Part can get (0 - 10000)
+ */
+ public abstract int getMaxEfficiency(ItemStack aStack);
+
+ /**
+ * Gets the pollution this Device outputs to a Muffler per tick (10000 = one Pullution Block)
+ */
+ public int getPollutionPerTick(ItemStack aStack) {
+ return getPollutionPerSecond(aStack) / 20;
+ }
+
+ /**
+ * Gets the pollution produced per second by this multiblock, default to 0. Override this with its actual value in
+ * the code of the multiblock.
+ */
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 0;
+ }
+
+ /**
+ * Gets the damage to the ItemStack, usually 0 or 1.
+ */
+ public abstract int getDamageToComponent(ItemStack aStack);
+
+ /**
+ * If it explodes when the Component has to be replaced.
+ */
+ public abstract boolean explodesOnComponentBreak(ItemStack aStack);
+
+ /**
+ * @deprecated Use {@link #stopMachine(ShutDownReason)}
+ */
+ @Deprecated
+ public void stopMachine() {
+ stopMachine(ShutDownReasonRegistry.NONE);
+ }
+
+ /**
+ * @deprecated Use {@link #stopMachine(ShutDownReason)}
+ */
+ @Deprecated
+ public void criticalStopMachine() {
+ stopMachine(ShutDownReasonRegistry.CRITICAL_NONE);
+ }
+
+ public void stopMachine(@Nonnull ShutDownReason reason) {
+ if (!ShutDownReasonRegistry.isRegistered(reason.getID())) {
+ throw new RuntimeException(String.format("Reason %s is not registered for registry", reason.getID()));
+ }
+ mOutputItems = null;
+ mOutputFluids = null;
+ mEUt = 0;
+ mEfficiency = 0;
+ mProgresstime = 0;
+ mMaxProgresstime = 0;
+ mEfficiencyIncrease = 0;
+ getBaseMetaTileEntity().disableWorking();
+ getBaseMetaTileEntity().setShutDownReason(reason);
+ getBaseMetaTileEntity().setShutdownStatus(true);
+ if (reason.wasCritical()) {
+ sendSound(INTERRUPT_SOUND_INDEX);
+ }
+ }
+
+ public int getRepairStatus() {
+ return (mWrench ? 1 : 0) + (mScrewdriver ? 1 : 0)
+ + (mSoftHammer ? 1 : 0)
+ + (mHardHammer ? 1 : 0)
+ + (mSolderingTool ? 1 : 0)
+ + (mCrowbar ? 1 : 0);
+ }
+
+ public int getIdealStatus() {
+ return 6;
+ }
+
+ public int getCurrentEfficiency(ItemStack itemStack) {
+ int maxEff = getMaxEfficiency(itemStack);
+ return maxEff - (getIdealStatus() - getRepairStatus()) * maxEff / 10;
+ }
+
+ public boolean doRandomMaintenanceDamage() {
+ if (!isCorrectMachinePart(mInventory[1])) {
+ stopMachine(ShutDownReasonRegistry.NO_MACHINE_PART);
+ return false;
+ }
+ if (getRepairStatus() == 0) {
+ stopMachine(ShutDownReasonRegistry.NO_REPAIR);
+ return false;
+ }
+ if (mRuntime++ > 1000) {
+ mRuntime = 0;
+ if (getBaseMetaTileEntity().getRandomNumber(6000) == 0) {
+ switch (getBaseMetaTileEntity().getRandomNumber(6)) {
+ case 0 -> mWrench = false;
+ case 1 -> mScrewdriver = false;
+ case 2 -> mSoftHammer = false;
+ case 3 -> mHardHammer = false;
+ case 4 -> mSolderingTool = false;
+ case 5 -> mCrowbar = false;
+ }
+ }
+ if (mInventory[1] != null && getBaseMetaTileEntity().getRandomNumber(2) == 0
+ && !mInventory[1].getUnlocalizedName()
+ .startsWith("gt.blockmachines.basicmachine.")) {
+ if (mInventory[1].getItem() instanceof GT_MetaGenerated_Tool_01) {
+ NBTTagCompound tNBT = mInventory[1].getTagCompound();
+ ((GT_MetaGenerated_Tool) mInventory[1].getItem()).doDamage(
+ mInventory[1],
+ (long) getDamageToComponent(mInventory[1])
+ * (long) Math.min(mEUt / this.damageFactorLow, Math.pow(mEUt, this.damageFactorHigh)));
+ if (mInventory[1].stackSize == 0) mInventory[1] = null;
+ }
+ }
+ }
+ return true;
+ }
+
+ public void explodeMultiblock() {
+
+ GT_Log.exp.println(
+ "MultiBlockExplosion at: " + this.getBaseMetaTileEntity()
+ .getXCoord()
+ + " | "
+ + this.getBaseMetaTileEntity()
+ .getYCoord()
+ + " | "
+ + this.getBaseMetaTileEntity()
+ .getZCoord()
+ + " DIMID: "
+ + this.getBaseMetaTileEntity()
+ .getWorld().provider.dimensionId
+ + ".");
+
+ GT_Pollution.addPollution(getBaseMetaTileEntity(), GT_Mod.gregtechproxy.mPollutionOnExplosion);
+ mInventory[1] = null;
+ // noinspection unchecked // In this case, the inspection only indicates that the array can be abused in runtime
+ Iterable<MetaTileEntity> allHatches = Iterables.concat(
+ mInputBusses,
+ mOutputBusses,
+ mInputHatches,
+ mOutputHatches,
+ mDynamoHatches,
+ mMufflerHatches,
+ mEnergyHatches,
+ mMaintenanceHatches);
+ for (MetaTileEntity tTileEntity : allHatches) {
+ if (tTileEntity != null && tTileEntity.getBaseMetaTileEntity() != null) {
+ tTileEntity.getBaseMetaTileEntity()
+ .doExplosion(V[8]);
+ }
+ }
+ getBaseMetaTileEntity().doExplosion(V[8]);
+ }
+
+ public boolean addEnergyOutput(long aEU) {
+ if (aEU <= 0) {
+ return true;
+ }
+ if (mDynamoHatches.size() > 0) {
+ return addEnergyOutputMultipleDynamos(aEU, true);
+ }
+ return false;
+ }
+
+ public boolean addEnergyOutputMultipleDynamos(long aEU, boolean aAllowMixedVoltageDynamos) {
+ int injected = 0;
+ long totalOutput = 0;
+ long aFirstVoltageFound = -1;
+ boolean aFoundMixedDynamos = false;
+ for (GT_MetaTileEntity_Hatch_Dynamo aDynamo : filterValidMTEs(mDynamoHatches)) {
+ long aVoltage = aDynamo.maxEUOutput();
+ long aTotal = aDynamo.maxAmperesOut() * aVoltage;
+ // Check against voltage to check when hatch mixing
+ if (aFirstVoltageFound == -1) {
+ aFirstVoltageFound = aVoltage;
+ } else {
+ if (aFirstVoltageFound != aVoltage) {
+ aFoundMixedDynamos = true;
+ }
+ }
+ totalOutput += aTotal;
+ }
+
+ if (totalOutput < aEU || (aFoundMixedDynamos && !aAllowMixedVoltageDynamos)) {
+ explodeMultiblock();
+ return false;
+ }
+
+ long leftToInject;
+ long aVoltage;
+ int aAmpsToInject;
+ int aRemainder;
+ int ampsOnCurrentHatch;
+ for (GT_MetaTileEntity_Hatch_Dynamo aDynamo : filterValidMTEs(mDynamoHatches)) {
+ leftToInject = aEU - injected;
+ aVoltage = aDynamo.maxEUOutput();
+ aAmpsToInject = (int) (leftToInject / aVoltage);
+ aRemainder = (int) (leftToInject - (aAmpsToInject * aVoltage));
+ ampsOnCurrentHatch = (int) Math.min(aDynamo.maxAmperesOut(), aAmpsToInject);
+ for (int i = 0; i < ampsOnCurrentHatch; i++) {
+ aDynamo.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits(aVoltage, false);
+ }
+ injected += aVoltage * ampsOnCurrentHatch;
+ if (aRemainder > 0 && ampsOnCurrentHatch < aDynamo.maxAmperesOut()) {
+ aDynamo.getBaseMetaTileEntity()
+ .increaseStoredEnergyUnits(aRemainder, false);
+ injected += aRemainder;
+ }
+ }
+ return injected > 0;
+ }
+
+ /**
+ * Sums up voltage of energy hatches. Amperage does not matter.
+ */
+ public long getMaxInputVoltage() {
+ long rVoltage = 0;
+ for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches))
+ rVoltage += tHatch.getBaseMetaTileEntity()
+ .getInputVoltage();
+ return rVoltage;
+ }
+
+ public long getAverageInputVoltage() {
+ return GT_ExoticEnergyInputHelper.getAverageInputVoltageMulti(mEnergyHatches);
+ }
+
+ public long getMaxInputAmps() {
+ return GT_ExoticEnergyInputHelper.getMaxWorkingInputAmpsMulti(mEnergyHatches);
+ }
+
+ public long getMaxInputEu() {
+ return GT_ExoticEnergyInputHelper.getTotalEuMulti(mEnergyHatches);
+ }
+
+ /**
+ * Sums up max input EU/t of energy hatches, amperage included.
+ */
+ public long getMaxInputPower() {
+ long eut = 0;
+ for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) {
+ IGregTechTileEntity baseTile = tHatch.getBaseMetaTileEntity();
+ eut += baseTile.getInputVoltage() * baseTile.getInputAmperage();
+ }
+ return eut;
+ }
+
+ /**
+ * Returns voltage tier of energy hatches. If multiple tiers are found, returns 0.
+ */
+ public long getInputVoltageTier() {
+ long rTier = 0;
+ if (mEnergyHatches.size() > 0) {
+ rTier = mEnergyHatches.get(0)
+ .getInputTier();
+ for (int i = 1; i < mEnergyHatches.size(); i++) {
+ if (mEnergyHatches.get(i)
+ .getInputTier() != rTier) return 0;
+ }
+ }
+
+ return rTier;
+ }
+
+ /**
+ * Calcualtes the overclockedness using long integers
+ *
+ * @param aEUt - recipe EUt
+ * @param aDuration - recipe Duration
+ * @param mAmperage - should be 1 ?
+ * @param maxInputVoltage - Multiblock Max input voltage. Voltage is rounded up to higher tier voltage.
+ * @param perfectOC - If the Multiblock OCs perfectly, i.e. the large Chemical Reactor
+ */
+ protected void calculateOverclockedNessMultiInternal(long aEUt, int aDuration, int mAmperage, long maxInputVoltage,
+ boolean perfectOC) {
+ byte tier = (byte) Math.max(0, GT_Utility.getTier(maxInputVoltage));
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(aEUt)
+ .setEUt(V[tier] * mAmperage)
+ .setDuration(aDuration)
+ .setDurationDecreasePerOC(perfectOC ? 2 : 1)
+ .calculate();
+ mEUt = (int) calculator.getConsumption();
+ mMaxProgresstime = calculator.getDuration();
+ }
+
+ @Deprecated
+ protected void calculateOverclockedNessMulti(int aEUt, int aDuration, int mAmperage, long maxInputVoltage) {
+ calculateOverclockedNessMultiInternal(aEUt, aDuration, mAmperage, maxInputVoltage, false);
+ }
+
+ protected void calculateOverclockedNessMulti(long aEUt, int aDuration, int mAmperage, long maxInputVoltage) {
+ calculateOverclockedNessMultiInternal(aEUt, aDuration, mAmperage, maxInputVoltage, false);
+ }
+
+ @Deprecated
+ protected void calculatePerfectOverclockedNessMulti(int aEUt, int aDuration, int mAmperage, long maxInputVoltage) {
+ calculateOverclockedNessMultiInternal(aEUt, aDuration, mAmperage, maxInputVoltage, true);
+ }
+
+ protected void calculatePerfectOverclockedNessMulti(long aEUt, int aDuration, int mAmperage, long maxInputVoltage) {
+ calculateOverclockedNessMultiInternal(aEUt, aDuration, mAmperage, maxInputVoltage, true);
+ }
+
+ public boolean drainEnergyInput(long aEU) {
+ if (aEU <= 0) return true;
+ for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) {
+ if (tHatch.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(aEU, false)) return true;
+ }
+ return false;
+ }
+
+ protected static boolean dumpFluid(List<GT_MetaTileEntity_Hatch_Output> aOutputHatches, FluidStack copiedFluidStack,
+ boolean restrictiveHatchesOnly) {
+ for (GT_MetaTileEntity_Hatch_Output tHatch : filterValidMTEs(aOutputHatches)) {
+ if (restrictiveHatchesOnly && tHatch.mMode == 0) {
+ continue;
+ }
+ if (!tHatch.canStoreFluid(copiedFluidStack)) continue;
+ int tAmount = tHatch.fill(copiedFluidStack, false);
+ if (tAmount >= copiedFluidStack.amount) {
+ boolean filled = tHatch.fill(copiedFluidStack, true) >= copiedFluidStack.amount;
+ tHatch.onEmptyingContainerWhenEmpty();
+ return filled;
+ } else if (tAmount > 0) {
+ copiedFluidStack.amount = copiedFluidStack.amount - tHatch.fill(copiedFluidStack, true);
+ tHatch.onEmptyingContainerWhenEmpty();
+ }
+ }
+ return false;
+ }
+
+ public boolean addOutput(FluidStack aLiquid) {
+ if (aLiquid == null) return false;
+ FluidStack copiedFluidStack = aLiquid.copy();
+ if (!dumpFluid(mOutputHatches, copiedFluidStack, true)) {
+ dumpFluid(mOutputHatches, copiedFluidStack, false);
+ }
+ return false;
+ }
+
+ protected void addFluidOutputs(FluidStack[] mOutputFluids2) {
+ for (FluidStack outputFluidStack : mOutputFluids2) {
+ addOutput(outputFluidStack);
+ }
+ }
+
+ public boolean depleteInput(FluidStack aLiquid) {
+ return depleteInput(aLiquid, false);
+ }
+
+ public boolean depleteInput(FluidStack aLiquid, boolean simulate) {
+ if (aLiquid == null) return false;
+ for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) {
+ setHatchRecipeMap(tHatch);
+ FluidStack tLiquid = tHatch.drain(ForgeDirection.UNKNOWN, aLiquid, false);
+ if (tLiquid != null && tLiquid.amount >= aLiquid.amount) {
+ if (simulate) {
+ return true;
+ }
+ tLiquid = tHatch.drain(ForgeDirection.UNKNOWN, aLiquid, true);
+ return tLiquid != null && tLiquid.amount >= aLiquid.amount;
+ }
+ }
+ return false;
+ }
+
+ public boolean addOutput(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return false;
+ aStack = GT_Utility.copyOrNull(aStack);
+ for (GT_MetaTileEntity_Hatch_OutputBus tHatch : filterValidMTEs(mOutputBusses)) {
+ if (tHatch.storeAll(aStack)) {
+ return true;
+ }
+ }
+ boolean outputSuccess = true;
+ while (outputSuccess && aStack.stackSize > 0) {
+ outputSuccess = false;
+ ItemStack single = aStack.splitStack(1);
+ for (GT_MetaTileEntity_Hatch_Output tHatch : filterValidMTEs(mOutputHatches)) {
+ if (!outputSuccess && tHatch.outputsItems()) {
+ if (tHatch.getBaseMetaTileEntity()
+ .addStackToSlot(1, single)) outputSuccess = true;
+ }
+ }
+ }
+ return outputSuccess;
+ }
+
+ public boolean depleteInput(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return false;
+ FluidStack aLiquid = GT_Utility.getFluidForFilledItem(aStack, true);
+ if (aLiquid != null) return depleteInput(aLiquid);
+ for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) {
+ setHatchRecipeMap(tHatch);
+ if (GT_Utility.areStacksEqual(
+ aStack,
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(0))) {
+ if (tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(0).stackSize >= aStack.stackSize) {
+ tHatch.getBaseMetaTileEntity()
+ .decrStackSize(0, aStack.stackSize);
+ return true;
+ }
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_InputBus tHatch : filterValidMTEs(mInputBusses)) {
+ tHatch.mRecipeMap = getRecipeMap();
+ for (int i = tHatch.getBaseMetaTileEntity()
+ .getSizeInventory() - 1; i >= 0; i--) {
+ if (GT_Utility.areStacksEqual(
+ aStack,
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i))) {
+ if (tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i).stackSize >= aStack.stackSize) {
+ tHatch.getBaseMetaTileEntity()
+ .decrStackSize(i, aStack.stackSize);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ public ArrayList<ItemStack> getStoredOutputs() {
+ ArrayList<ItemStack> rList = new ArrayList<>();
+ for (GT_MetaTileEntity_Hatch_OutputBus tHatch : filterValidMTEs(mOutputBusses)) {
+ for (int i = tHatch.getBaseMetaTileEntity()
+ .getSizeInventory() - 1; i >= 0; i--) {
+ rList.add(
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i));
+ }
+ }
+ return rList;
+ }
+
+ public ArrayList<FluidStack> getStoredFluids() {
+ ArrayList<FluidStack> rList = new ArrayList<>();
+ Map<Fluid, FluidStack> inputsFromME = new HashMap<>();
+ for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) {
+ setHatchRecipeMap(tHatch);
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_MultiInput multiInputHatch) {
+ for (FluidStack tFluid : multiInputHatch.getStoredFluid()) {
+ if (tFluid != null) {
+ rList.add(tFluid);
+ }
+ }
+ } else if (tHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) {
+ for (FluidStack fluidStack : meHatch.getStoredFluids()) {
+ if (fluidStack != null) {
+ // Prevent the same fluid from different ME hatches from being recognized
+ inputsFromME.put(fluidStack.getFluid(), fluidStack);
+ }
+ }
+ } else {
+ if (tHatch.getFillableStack() != null) {
+ rList.add(tHatch.getFillableStack());
+ }
+ }
+ }
+
+ if (!inputsFromME.isEmpty()) {
+ rList.addAll(inputsFromME.values());
+ }
+ return rList;
+ }
+
+ /**
+ * Drains fluid from the given hatch, including {@link IDualInputHatch}. Should never be used during recipe check!
+ *
+ * @param doDrain If false, fluid will not actually be consumed
+ * @return Whether the hatch contains enough fluid to drain
+ */
+ public boolean drain(GT_MetaTileEntity_Hatch hatch, FluidStack fluid, boolean doDrain) {
+ if (fluid == null || hatch == null) return false;
+ if (supportsCraftingMEBuffer() && hatch instanceof IDualInputHatch tHatch && tHatch.supportsFluids()) {
+ Optional<IDualInputInventory> inventory = tHatch.getFirstNonEmptyInventory();
+ if (inventory.isPresent()) {
+ for (FluidStack storedFluid : Lists.newArrayList(
+ inventory.get()
+ .getFluidInputs())) {
+ if (fluid.isFluidEqual(storedFluid)) {
+ if (doDrain) storedFluid.amount = Math.max(storedFluid.amount - fluid.amount, 0);
+ return storedFluid.amount >= fluid.amount;
+ }
+ }
+ }
+ }
+
+ if (hatch instanceof GT_MetaTileEntity_Hatch_Input tHatch && tHatch.isValid()) {
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) {
+ meHatch.startRecipeProcessing();
+ FluidStack tFluid = meHatch.drain(ForgeDirection.UNKNOWN, fluid, doDrain);
+ meHatch.endRecipeProcessing(this);
+ return tFluid != null && tFluid.amount >= fluid.amount;
+ } else {
+ FluidStack tFluid = tHatch.drain(ForgeDirection.UNKNOWN, fluid, doDrain);
+ return tFluid != null && tFluid.amount >= fluid.amount;
+ }
+ }
+
+ return false;
+ }
+
+ public ArrayList<ItemStack> getStoredInputs() {
+ ArrayList<ItemStack> rList = new ArrayList<>();
+ Map<GT_Utility.ItemId, ItemStack> inputsFromME = new HashMap<>();
+ for (GT_MetaTileEntity_Hatch_InputBus tHatch : filterValidMTEs(mInputBusses)) {
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_CraftingInput_ME) {
+ continue;
+ }
+ tHatch.mRecipeMap = getRecipeMap();
+ IGregTechTileEntity tileEntity = tHatch.getBaseMetaTileEntity();
+ boolean isMEBus = tHatch instanceof GT_MetaTileEntity_Hatch_InputBus_ME;
+ for (int i = tileEntity.getSizeInventory() - 1; i >= 0; i--) {
+ ItemStack itemStack = tileEntity.getStackInSlot(i);
+ if (itemStack != null) {
+ if (isMEBus) {
+ // Prevent the same item from different ME buses from being recognized
+ inputsFromME.put(GT_Utility.ItemId.createNoCopy(itemStack), itemStack);
+ } else {
+ rList.add(itemStack);
+ }
+ }
+ }
+ }
+
+ if (getStackInSlot(1) != null && getStackInSlot(1).getUnlocalizedName()
+ .startsWith("gt.integrated_circuit")) rList.add(getStackInSlot(1));
+ if (!inputsFromME.isEmpty()) {
+ rList.addAll(inputsFromME.values());
+ }
+ return rList;
+ }
+
+ /**
+ * Anything that is usually separated off in {@link #getStoredInputs()} (like crafting input bus/buffer) is also
+ * included here.
+ */
+ public ArrayList<ItemStack> getAllStoredInputs() {
+ ArrayList<ItemStack> rList = new ArrayList<>();
+
+ if (supportsCraftingMEBuffer()) {
+ for (IDualInputHatch dualInputHatch : mDualInputHatches) {
+ Iterator<? extends IDualInputInventory> inventoryIterator = dualInputHatch.inventories();
+ while (inventoryIterator.hasNext()) {
+ ItemStack[] items = inventoryIterator.next()
+ .getItemInputs();
+ if (items == null) {
+ continue;
+ }
+ for (int i = 0; i < items.length; i++) {
+ ItemStack item = items[i];
+ if (item != null) {
+ rList.add(item);
+ }
+ }
+ }
+ }
+ }
+
+ Map<GT_Utility.ItemId, ItemStack> inputsFromME = new HashMap<>();
+ for (GT_MetaTileEntity_Hatch_InputBus tHatch : filterValidMTEs(mInputBusses)) {
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_CraftingInput_ME) {
+ continue;
+ }
+ tHatch.mRecipeMap = getRecipeMap();
+ IGregTechTileEntity tileEntity = tHatch.getBaseMetaTileEntity();
+ boolean isMEBus = tHatch instanceof GT_MetaTileEntity_Hatch_InputBus_ME;
+ for (int i = tileEntity.getSizeInventory() - 1; i >= 0; i--) {
+ ItemStack itemStack = tileEntity.getStackInSlot(i);
+ if (itemStack != null) {
+ if (isMEBus) {
+ // Prevent the same item from different ME buses from being recognized
+ inputsFromME.put(GT_Utility.ItemId.createNoCopy(itemStack), itemStack);
+ } else {
+ rList.add(itemStack);
+ }
+ }
+ }
+ }
+
+ if (getStackInSlot(1) != null && getStackInSlot(1).getUnlocalizedName()
+ .startsWith("gt.integrated_circuit")) rList.add(getStackInSlot(1));
+ if (!inputsFromME.isEmpty()) {
+ rList.addAll(inputsFromME.values());
+ }
+ return rList;
+ }
+
+ public Map<GT_Utility.ItemId, ItemStack> getStoredInputsFromME() {
+ Map<GT_Utility.ItemId, ItemStack> inputsFromME = new Object2ReferenceOpenHashMap<>();
+ for (GT_MetaTileEntity_Hatch_InputBus tHatch : filterValidMTEs(mInputBusses)) {
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_InputBus_ME meBus) {
+ for (int i = meBus.getSizeInventory() - 1; i >= 0; i--) {
+ ItemStack itemStack = meBus.getStackInSlot(i);
+ if (itemStack != null) {
+ // Prevent the same item from different ME buses from being recognized
+ inputsFromME.put(GT_Utility.ItemId.createNoCopy(itemStack), itemStack);
+ }
+ }
+ }
+ }
+ return inputsFromME;
+ }
+
+ public Map<Fluid, FluidStack> getStoredFluidsFromME() {
+ Map<Fluid, FluidStack> fluidsFromME = new Reference2ReferenceOpenHashMap<>();
+ for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) {
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) {
+ for (FluidStack fluid : meHatch.getStoredFluids()) {
+ if (fluid != null) {
+ // Prevent the same fluid from different ME hatches from being recognized
+ fluidsFromME.put(fluid.getFluid(), fluid);
+ }
+ }
+ }
+ }
+ return fluidsFromME;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return null;
+ }
+
+ /**
+ * Creates logic to run recipe check based on recipemap. This runs only once, on class instantiation.
+ * <p>
+ * If this machine doesn't use recipemap or does some complex things, override {@link #checkProcessing()}.
+ */
+ @ApiStatus.OverrideOnly
+ protected ProcessingLogic createProcessingLogic() {
+ return null;
+ }
+
+ public void updateSlots() {
+ for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) tHatch.updateSlots();
+ for (GT_MetaTileEntity_Hatch_InputBus tHatch : filterValidMTEs(mInputBusses)) tHatch.updateSlots();
+ }
+
+ protected void startRecipeProcessing() {
+ for (GT_MetaTileEntity_Hatch_InputBus hatch : filterValidMTEs(mInputBusses)) {
+ if (hatch instanceof IRecipeProcessingAwareHatch aware) {
+ aware.startRecipeProcessing();
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_Input hatch : filterValidMTEs(mInputHatches)) {
+ if (hatch instanceof IRecipeProcessingAwareHatch aware) {
+ aware.startRecipeProcessing();
+ }
+ }
+ }
+
+ public void setResultIfFailure(CheckRecipeResult result) {
+ if (!result.wasSuccessful()) {
+ this.checkRecipeResult = result;
+ }
+ }
+
+ protected void endRecipeProcessing() {
+ for (GT_MetaTileEntity_Hatch_InputBus hatch : filterValidMTEs(mInputBusses)) {
+ if (hatch instanceof IRecipeProcessingAwareHatch aware) {
+ setResultIfFailure(aware.endRecipeProcessing(this));
+ }
+ }
+ for (GT_MetaTileEntity_Hatch_Input hatch : filterValidMTEs(mInputHatches)) {
+ if (hatch instanceof IRecipeProcessingAwareHatch aware) {
+ setResultIfFailure(aware.endRecipeProcessing(this));
+ }
+ }
+ }
+
+ public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch hatch) {
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ }
+ if (aMetaTileEntity instanceof IDualInputHatch hatch) {
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ return mDualInputHatches.add(hatch);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ setHatchRecipeMap((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity);
+ return mInputHatches.add((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) {
+ ((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity).mRecipeMap = getRecipeMap();
+ return mInputBusses.add((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output)
+ return mOutputHatches.add((GT_MetaTileEntity_Hatch_Output) aMetaTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus)
+ return mOutputBusses.add((GT_MetaTileEntity_Hatch_OutputBus) aMetaTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy)
+ return mEnergyHatches.add((GT_MetaTileEntity_Hatch_Energy) aMetaTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo)
+ return mDynamoHatches.add((GT_MetaTileEntity_Hatch_Dynamo) aMetaTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance)
+ return mMaintenanceHatches.add((GT_MetaTileEntity_Hatch_Maintenance) aMetaTileEntity);
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler)
+ return mMufflerHatches.add((GT_MetaTileEntity_Hatch_Muffler) aMetaTileEntity);
+ return false;
+ }
+
+ public boolean addMaintenanceToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance hatch) {
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ return mMaintenanceHatches.add(hatch);
+ }
+ return false;
+ }
+
+ public boolean addEnergyInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy hatch) {
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ return mEnergyHatches.add(hatch);
+ }
+ return false;
+ }
+
+ public boolean addExoticEnergyInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch hatch
+ && GT_ExoticEnergyInputHelper.isExoticEnergyInput(aMetaTileEntity)) {
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ return mExoticEnergyHatches.add(hatch);
+ }
+ return false;
+ }
+
+ public boolean addDynamoToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo hatch) {
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ return mDynamoHatches.add(hatch);
+ }
+ return false;
+ }
+
+ public boolean addMufflerToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler hatch) {
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ return mMufflerHatches.add(hatch);
+ }
+ return false;
+ }
+
+ public boolean addInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ return addInputBusToMachineList(aTileEntity, aBaseCasingIndex)
+ || addInputHatchToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+
+ public boolean addOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ return addOutputBusToMachineList(aTileEntity, aBaseCasingIndex)
+ || addOutputHatchToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+
+ public boolean addInputBusToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof IDualInputHatch hatch) {
+ if (!supportsCraftingMEBuffer()) return false;
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ return mDualInputHatches.add(hatch);
+ }
+
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus hatch) {
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ hatch.mRecipeMap = getRecipeMap();
+ return mInputBusses.add(hatch);
+ }
+ return false;
+ }
+
+ public boolean addOutputBusToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus hatch) {
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ return mOutputBusses.add(hatch);
+ }
+ return false;
+ }
+
+ public boolean addInputHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input hatch) {
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ setHatchRecipeMap(hatch);
+ return mInputHatches.add(hatch);
+ }
+ return false;
+ }
+
+ public boolean addOutputHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output hatch) {
+ hatch.updateTexture(aBaseCasingIndex);
+ hatch.updateCraftingIcon(this.getMachineCraftingIcon());
+ return mOutputHatches.add(hatch);
+ }
+ return false;
+ }
+
+ protected void setHatchRecipeMap(GT_MetaTileEntity_Hatch_Input hatch) {
+ if (filtersFluid()) {
+ hatch.mRecipeMap = getRecipeMap();
+ }
+ }
+
+ /**
+ * @return If this multi filters fluid input for hatches based on recipemap.
+ */
+ protected boolean filtersFluid() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ int mPollutionReduction = 0;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction);
+ }
+
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ return new String[] {
+ /* 1 */ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + formatNumbers(mProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + formatNumbers(mMaxProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s",
+ /* 2 */ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ /* 3 */ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": "
+ + EnumChatFormatting.RED
+ + formatNumbers(getActualEnergyUsage())
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ /* 4 */ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
+ + EnumChatFormatting.YELLOW
+ + formatNumbers(getMaxInputVoltage())
+ + EnumChatFormatting.RESET
+ + " EU/t(*2A) "
+ + StatCollector.translateToLocal("GT5U.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + VN[GT_Utility.getTier(getMaxInputVoltage())]
+ + EnumChatFormatting.RESET,
+ /* 5 */ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": "
+ + EnumChatFormatting.RED
+ + (getIdealStatus() - getRepairStatus())
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.multiblock.efficiency")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + mEfficiency / 100.0F
+ + EnumChatFormatting.RESET
+ + " %",
+ /* 6 */ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": "
+ + EnumChatFormatting.GREEN
+ + mPollutionReduction
+ + EnumChatFormatting.RESET
+ + " %" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ protected ItemStack[] getCompactedInputs() {
+ // TODO: repalce method with a cleaner one
+ ArrayList<ItemStack> tInputList = getStoredInputs();
+ int tInputList_sS = tInputList.size();
+ for (int i = 0; i < tInputList_sS - 1; i++) {
+ for (int j = i + 1; j < tInputList_sS; j++) {
+ if (!GT_Utility.areStacksEqual(tInputList.get(i), tInputList.get(j))) continue;
+ if (tInputList.get(i).stackSize >= tInputList.get(j).stackSize) {
+ tInputList.remove(j--);
+ tInputList_sS = tInputList.size();
+ } else {
+ tInputList.remove(i--);
+ tInputList_sS = tInputList.size();
+ break;
+ }
+ }
+ }
+ return tInputList.toArray(new ItemStack[0]);
+ }
+
+ protected FluidStack[] getCompactedFluids() {
+ // TODO: repalce method with a cleaner one
+ ArrayList<FluidStack> tFluidList = getStoredFluids();
+ int tFluidList_sS = tFluidList.size();
+ for (int i = 0; i < tFluidList_sS - 1; i++) {
+ for (int j = i + 1; j < tFluidList_sS; j++) {
+ if (!GT_Utility.areFluidsEqual(tFluidList.get(i), tFluidList.get(j))) continue;
+
+ if (tFluidList.get(i).amount >= tFluidList.get(j).amount) {
+ tFluidList.remove(j--);
+ tFluidList_sS = tFluidList.size();
+ } else {
+ tFluidList.remove(i--);
+ tFluidList_sS = tFluidList.size();
+ break;
+ }
+ }
+ }
+ return tFluidList.toArray(new FluidStack[0]);
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ final NBTTagCompound tag = accessor.getNBTData();
+
+ if (tag.getBoolean("incompleteStructure")) {
+ currentTip.add(RED + "** INCOMPLETE STRUCTURE **" + RESET);
+ }
+ currentTip.add(
+ (tag.getBoolean("hasProblems") ? (RED + "** HAS PROBLEMS **") : GREEN + "Running Fine") + RESET
+ + " Efficiency: "
+ + tag.getFloat("efficiency")
+ + "%");
+
+ boolean isActive = tag.getBoolean("isActive");
+ if (isActive) {
+ long energyTier = tag.getLong("energyTier");
+ long actualEnergyUsage = tag.getLong("energyUsage");
+ if (energyTier > 0) {
+ if (actualEnergyUsage > 0) {
+ currentTip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.use_with_amperage",
+ formatNumbers(actualEnergyUsage),
+ GT_Utility.getAmperageForTier(actualEnergyUsage, (byte) energyTier),
+ GT_Utility.getColoredTierNameFromTier((byte) energyTier)));
+ } else if (actualEnergyUsage < 0) {
+ currentTip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.produce_with_amperage",
+ formatNumbers(-actualEnergyUsage),
+ GT_Utility.getAmperageForTier(-actualEnergyUsage, (byte) energyTier),
+ GT_Utility.getColoredTierNameFromTier((byte) energyTier)));
+ }
+ } else {
+ if (actualEnergyUsage > 0) {
+ currentTip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.use",
+ formatNumbers(actualEnergyUsage),
+ GT_Utility.getColoredTierNameFromVoltage(actualEnergyUsage)));
+ } else if (actualEnergyUsage < 0) {
+ currentTip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.produce",
+ formatNumbers(-actualEnergyUsage),
+ GT_Utility.getColoredTierNameFromVoltage(-actualEnergyUsage)));
+ }
+ }
+ }
+ currentTip.add(
+ GT_Waila.getMachineProgressString(isActive, tag.getInteger("maxProgress"), tag.getInteger("progress")));
+ // Show ns on the tooltip
+ if (GT_Mod.gregtechproxy.wailaAverageNS && tag.hasKey("averageNS")) {
+ int tAverageTime = tag.getInteger("averageNS");
+ currentTip.add("Average CPU load of ~" + formatNumbers(tAverageTime) + " ns");
+ }
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ }
+
+ public final void getMTEWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+
+ tag.setBoolean("hasProblems", (getIdealStatus() - getRepairStatus()) > 0);
+ tag.setFloat("efficiency", mEfficiency / 100.0F);
+ tag.setInteger("progress", mProgresstime);
+ tag.setInteger("maxProgress", mMaxProgresstime);
+ tag.setBoolean("incompleteStructure", (getBaseMetaTileEntity().getErrorDisplayID() & 64) != 0);
+
+ final IGregTechTileEntity tileEntity = getBaseMetaTileEntity();
+ if (tileEntity != null) {
+ tag.setBoolean("isActive", tileEntity.isActive());
+ if (tileEntity.isActive()) {
+ if (mEUt < 0) tag.setLong("energyUsage", getActualEnergyUsage());
+ else tag.setLong("energyUsage", (long) -mEUt * mEfficiency / 10000);
+ tag.setLong("energyTier", getInputVoltageTier());
+ }
+ }
+
+ final GT_ClientPreference preference = GT_Mod.gregtechproxy.getClientPreference(player.getUniqueID());
+ if (preference != null && preference.isWailaAverageNSEnabled()) {
+ getBaseMetaTileEntity().startTimeStatistics();
+ int tAverageTime = 0;
+ int amountOfZero = 0;
+ for (int tTime : this.getBaseMetaTileEntity()
+ .getTimeStatistics()) {
+ tAverageTime += tTime;
+ if (tTime == 0) {
+ amountOfZero += 1;
+ }
+ }
+
+ // tick time zero means it has not been updated yet
+ int samples = getBaseMetaTileEntity().getTimeStatistics().length - amountOfZero;
+ if (samples > 0) {
+ tag.setInteger("averageNS", tAverageTime / samples);
+ }
+ }
+ }
+
+ protected void setMufflers(boolean state) {
+ for (GT_MetaTileEntity_Hatch_Muffler aMuffler : mMufflerHatches) {
+ final IGregTechTileEntity iGTTileEntity = aMuffler.getBaseMetaTileEntity();
+ if (iGTTileEntity != null && !iGTTileEntity.isDead()) {
+ iGTTileEntity.setActive(state);
+ }
+ }
+ }
+
+ @Override
+ public void onRemoval() {
+ super.onRemoval();
+ // Deactivate mufflers
+ setMufflers(false);
+ }
+
+ public List<GT_MetaTileEntity_Hatch> getExoticEnergyHatches() {
+ return mExoticEnergyHatches;
+ }
+
+ /**
+ * @return Returns true if there is 1 TT Energy Hatch OR up to 2 Energy Hatches
+ */
+ public boolean checkExoticAndNormalEnergyHatches() {
+ if (mExoticEnergyHatches.isEmpty() && mEnergyHatches.isEmpty()) {
+ return false;
+ }
+
+ if (!mExoticEnergyHatches.isEmpty()) {
+ if (!mEnergyHatches.isEmpty()) {
+ return false;
+ }
+
+ if (mExoticEnergyHatches.size() != 1) {
+ return false;
+ }
+ }
+
+ return mEnergyHatches.size() <= 2;
+ }
+
+ /**
+ * Checks if all the item / fluid outputs of the recipe can be outputted to the buses / hatches.
+ * If void protection is enabled, it also checks for {@link #protectsExcessItem()} and
+ * {@link #protectsExcessFluid()}, so you don't need to call them along with this method.
+ * <p>
+ * If you're using {@link GT_ParallelHelper}, it will handle void protection and return 0 parallel
+ * if all the output cannot be dumped into buses / hatches. In that case you won't use this method.
+ */
+ protected boolean canOutputAll(@Nonnull GT_Recipe recipe) {
+ return canOutputAll(recipe.mOutputs, recipe.mFluidOutputs);
+ }
+
+ /**
+ * Checks if all the items can be outputted to the output buses.
+ * If void protection is enabled, it also checks for {@link #protectsExcessItem()},
+ * so you don't need to call it along with this method.
+ */
+ @SuppressWarnings("BooleanMethodIsAlwaysInverted")
+ protected boolean canOutputAll(ItemStack[] items) {
+ return canOutputAll(items, null);
+ }
+
+ /**
+ * Checks if all the fluids can be outputted to the output hatches.
+ * If void protection is enabled, it also checks for {@link #protectsExcessFluid()},
+ * so you don't need to call it along with this method.
+ */
+ protected boolean canOutputAll(FluidStack[] fluids) {
+ return canOutputAll(null, fluids);
+ }
+
+ /**
+ * Checks if all the items / fluids can be outputted to output buses / hatches.
+ * If void protection is enabled, it also checks for {@link #protectsExcessItem()} and
+ * {@link #protectsExcessFluid()}, so you don't need to call them along with this method.
+ */
+ protected boolean canOutputAll(@Nullable ItemStack[] items, @Nullable FluidStack[] fluids) {
+ if (!protectsExcessItem() && !protectsExcessFluid()) {
+ return true;
+ }
+
+ VoidProtectionHelper voidProtectionHelper = new VoidProtectionHelper().setMachine(this)
+ .setItemOutputs(items)
+ .setFluidOutputs(fluids)
+ .build();
+ return voidProtectionHelper.getMaxParallel() > 0;
+ }
+
+ @Override
+ public boolean isAllowedToWork() {
+ return getBaseMetaTileEntity() != null && getBaseMetaTileEntity().isAllowedToWork();
+ }
+
+ @Override
+ public void disableWorking() {
+ if (getBaseMetaTileEntity() != null) {
+ getBaseMetaTileEntity().disableWorking();
+ }
+ }
+
+ @Override
+ public void enableWorking() {
+ if (getBaseMetaTileEntity() != null) {
+ getBaseMetaTileEntity().enableWorking();
+ }
+ }
+
+ public ItemStack getControllerSlot() {
+ return mInventory[1];
+ }
+
+ @Override
+ public Pos2d getPowerSwitchButtonPos() {
+ return new Pos2d(174, 148);
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return false;
+ }
+
+ @Override
+ public VoidingMode getVoidingMode() {
+ return voidingMode;
+ }
+
+ @Override
+ public void setVoidingMode(VoidingMode mode) {
+ this.voidingMode = mode;
+ }
+
+ @Override
+ public List<ItemStack> getItemOutputSlots(ItemStack[] toOutput) {
+ List<ItemStack> ret = new ArrayList<>();
+ for (final GT_MetaTileEntity_Hatch tBus : filterValidMTEs(mOutputBusses)) {
+ final IInventory tBusInv = tBus.getBaseMetaTileEntity();
+ for (int i = 0; i < tBusInv.getSizeInventory(); i++) {
+ ret.add(tBus.getStackInSlot(i));
+ }
+ }
+ return ret;
+ }
+
+ @Override
+ public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
+ return filterValidMTEs(mOutputHatches);
+ }
+
+ /**
+ * Util method for DT-like structure to collect list of output hatches.
+ */
+ protected <T extends GT_MetaTileEntity_Hatch_Output> List<? extends IFluidStore> getFluidOutputSlotsByLayer(
+ FluidStack[] toOutput, List<List<T>> hatchesByLayer) {
+ List<IFluidStore> ret = new ArrayList<>();
+ for (int i = 0; i < toOutput.length; i++) {
+ if (i >= hatchesByLayer.size()) {
+ break;
+ }
+ FluidStack fluidOutputForLayer = toOutput[i];
+ for (GT_MetaTileEntity_Hatch_Output hatch : hatchesByLayer.get(i)) {
+ if (!hatch.isValid()) continue;
+ if (fluidOutputForLayer != null) {
+ ret.add(new OutputHatchWrapper(hatch, f -> GT_Utility.areFluidsEqual(f, fluidOutputForLayer)));
+ } else {
+ ret.add(hatch);
+ }
+ }
+ }
+ return ret;
+ }
+
+ @Override
+ public boolean canDumpItemToME() {
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mOutputBusses)) {
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_OutputBus_ME) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canDumpFluidToME() {
+ for (IFluidStore tHatch : getFluidOutputSlots(new FluidStack[0])) {
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_Output_ME) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public Pos2d getVoidingModeButtonPos() {
+ return new Pos2d(8, 91);
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputSeparationEnabled() {
+ return inputSeparation;
+ }
+
+ @Override
+ public void setInputSeparation(boolean enabled) {
+ this.inputSeparation = enabled;
+ }
+
+ @Override
+ public Pos2d getInputSeparationButtonPos() {
+ return new Pos2d(26, 91);
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return false;
+ }
+
+ @Override
+ public boolean isBatchModeEnabled() {
+ return batchMode;
+ }
+
+ @Override
+ public void setBatchMode(boolean enabled) {
+ this.batchMode = enabled;
+ }
+
+ @Override
+ public Pos2d getBatchModeButtonPos() {
+ return new Pos2d(44, 91);
+ }
+
+ @Override
+ public boolean supportsSingleRecipeLocking() {
+ return false;
+ }
+
+ @Override
+ public boolean isRecipeLockingEnabled() {
+ return mLockedToSingleRecipe;
+ }
+
+ @Override
+ public void setRecipeLocking(boolean enabled) {
+ mLockedToSingleRecipe = enabled;
+ if (!enabled) {
+ setSingleRecipeCheck(null);
+ }
+ }
+
+ @Override
+ public void setSingleRecipeCheck(SingleRecipeCheck recipeCheck) {
+ mSingleRecipeCheck = recipeCheck;
+ }
+
+ @Override
+ public SingleRecipeCheck getSingleRecipeCheck() {
+ return mSingleRecipeCheck;
+ }
+
+ @Override
+ public Pos2d getRecipeLockingButtonPos() {
+ return new Pos2d(62, 91);
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public int getGUIWidth() {
+ return 198;
+ }
+
+ @Override
+ public int getGUIHeight() {
+ return 192;
+ }
+
+ @Override
+ public void bindPlayerInventoryUI(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.bindPlayerInventory(buildContext.getPlayer(), new Pos2d(7, 109), getGUITextureSet().getItemSlot());
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(4, 4)
+ .setSize(190, 85));
+ final SlotWidget inventorySlot = new SlotWidget(inventoryHandler, 1);
+ builder.widget(
+ inventorySlot.setPos(173, 167)
+ .setBackground(GT_UITextures.SLOT_DARK_GRAY));
+
+ final DynamicPositionedColumn screenElements = new DynamicPositionedColumn();
+ drawTexts(screenElements, inventorySlot);
+ builder.widget(screenElements);
+
+ builder.widget(createPowerSwitchButton(builder))
+ .widget(createVoidExcessButton(builder))
+ .widget(createInputSeparationButton(builder))
+ .widget(createBatchModeButton(builder))
+ .widget(createLockToSingleRecipeButton(builder));
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {}
+
+ protected boolean shouldDisplayCheckRecipeResult() {
+ return true;
+ }
+
+ public boolean shouldDisplayShutDownReason() {
+ return true;
+ }
+
+ protected final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ protected String generateCurrentRecipeInfoString() {
+ StringBuffer ret = new StringBuffer(EnumChatFormatting.WHITE + "Progress: ");
+
+ numberFormat.setMinimumFractionDigits(2);
+ numberFormat.setMaximumFractionDigits(2);
+ numberFormat.format((double) mProgresstime / 20, ret);
+ ret.append("s / ");
+ numberFormat.format((double) mMaxProgresstime / 20, ret);
+ ret.append("s (");
+ numberFormat.setMinimumFractionDigits(1);
+ numberFormat.setMaximumFractionDigits(1);
+ numberFormat.format((double) mProgresstime / mMaxProgresstime * 100, ret);
+ ret.append("%)\n");
+ numberFormat.setMinimumFractionDigits(0);
+ numberFormat.setMaximumFractionDigits(2);
+
+ IntConsumer appendRate = (amount) -> {
+ double processPerTick = (double) amount / mMaxProgresstime * 20;
+ if (processPerTick > 1) {
+ ret.append(" (");
+ numberFormat.format(Math.round(processPerTick * 10) / 10.0, ret);
+ ret.append("/s)");
+ } else {
+ ret.append(" (");
+ numberFormat.format(Math.round(1 / processPerTick * 10) / 10.0, ret);
+ ret.append("s/ea)");
+ }
+ };
+
+ int lines = 0;
+ int MAX_LINES = 5;
+
+ if (mOutputItems != null) {
+ for (var item : mOutputItems) {
+ if (item == null) continue;
+ if (lines >= MAX_LINES) {
+ ret.append("...");
+ return ret.toString();
+ }
+ lines++;
+ ret.append(EnumChatFormatting.AQUA)
+ .append(item.getDisplayName())
+ .append(EnumChatFormatting.WHITE)
+ .append(" x ")
+ .append(EnumChatFormatting.GOLD);
+ numberFormat.format(item.stackSize, ret);
+ ret.append(EnumChatFormatting.WHITE);
+ appendRate.accept(item.stackSize);
+ ret.append('\n');
+ }
+ }
+ if (mOutputFluids != null) {
+ for (var fluid : mOutputFluids) {
+ if (fluid == null) continue;
+ if (lines >= MAX_LINES) {
+ ret.append("...");
+ return ret.toString();
+ }
+ lines++;
+ ret.append(EnumChatFormatting.AQUA)
+ .append(fluid.getLocalizedName())
+ .append(EnumChatFormatting.WHITE)
+ .append(" x ")
+ .append(EnumChatFormatting.GOLD);
+ numberFormat.format(fluid.amount, ret);
+ ret.append("L")
+ .append(EnumChatFormatting.WHITE);
+ appendRate.accept(fluid.amount);
+ ret.append('\n');
+ }
+ }
+ return ret.toString();
+ }
+
+ protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) {
+ screenElements.setSynced(false)
+ .setSpace(0)
+ .setPos(10, 7);
+
+ screenElements
+ .widget(
+ new TextWidget(GT_Utility.trans("132", "Pipe is loose.")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mWrench))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mWrench, val -> mWrench = val));
+ screenElements
+ .widget(
+ new TextWidget(GT_Utility.trans("133", "Screws are loose.")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mScrewdriver))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mScrewdriver, val -> mScrewdriver = val));
+ screenElements
+ .widget(
+ new TextWidget(GT_Utility.trans("134", "Something is stuck.")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mSoftHammer))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mSoftHammer, val -> mSoftHammer = val));
+ screenElements
+ .widget(
+ new TextWidget(GT_Utility.trans("135", "Platings are dented.")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mHardHammer))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mHardHammer, val -> mHardHammer = val));
+ screenElements
+ .widget(
+ new TextWidget(GT_Utility.trans("136", "Circuitry burned out.")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mSolderingTool))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mSolderingTool, val -> mSolderingTool = val));
+ screenElements
+ .widget(
+ new TextWidget(GT_Utility.trans("137", "That doesn't belong there."))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mCrowbar))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mCrowbar, val -> mCrowbar = val));
+ screenElements
+ .widget(
+ new TextWidget(GT_Utility.trans("138", "Incomplete Structure.")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mMachine))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mMachine, val -> mMachine = val));
+ screenElements.widget(
+ new TextWidget("Too Uncertain.").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> (getBaseMetaTileEntity().getErrorDisplayID() & 128) != 0));
+ screenElements.widget(
+ new TextWidget("Invalid Parameters.").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> (getBaseMetaTileEntity().getErrorDisplayID() & 256) != 0));
+
+ screenElements.widget(
+ new TextWidget(GT_Utility.trans("139", "Hit with Soft Mallet")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(
+ widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && !getBaseMetaTileEntity().isActive()))
+ .widget(
+ new FakeSyncWidget.IntegerSyncer(
+ () -> getBaseMetaTileEntity().getErrorDisplayID(),
+ val -> getBaseMetaTileEntity().setErrorDisplayID(val)))
+ .widget(
+ new FakeSyncWidget.BooleanSyncer(
+ () -> getBaseMetaTileEntity().isActive(),
+ val -> getBaseMetaTileEntity().setActive(val)));
+ screenElements.widget(
+ new TextWidget(GT_Utility.trans("140", "to (re-)start the Machine")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(
+ widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && !getBaseMetaTileEntity().isActive()));
+ screenElements.widget(
+ new TextWidget(GT_Utility.trans("141", "if it doesn't start.")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(
+ widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && !getBaseMetaTileEntity().isActive()));
+ screenElements.widget(
+ new TextWidget(GT_Utility.trans("142", "Running perfectly.")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(
+ widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0 && getBaseMetaTileEntity().isActive()));
+
+ screenElements.widget(
+ TextWidget.dynamicString(
+ () -> getBaseMetaTileEntity().getLastShutDownReason()
+ .getDisplayString())
+ .setSynced(false)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setEnabled(
+ widget -> shouldDisplayShutDownReason() && !getBaseMetaTileEntity().isActive()
+ && GT_Utility.isStringValid(
+ getBaseMetaTileEntity().getLastShutDownReason()
+ .getDisplayString())
+ && getBaseMetaTileEntity().wasShutdown()))
+ .widget(
+ new ShutDownReasonSyncer(
+ () -> getBaseMetaTileEntity().getLastShutDownReason(),
+ reason -> getBaseMetaTileEntity().setShutDownReason(reason)))
+ .widget(
+ new FakeSyncWidget.BooleanSyncer(
+ () -> getBaseMetaTileEntity().wasShutdown(),
+ wasShutDown -> getBaseMetaTileEntity().setShutdownStatus(wasShutDown)));
+
+ screenElements.widget(
+ TextWidget.dynamicString(() -> checkRecipeResult.getDisplayString())
+ .setSynced(false)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setEnabled(
+ widget -> shouldDisplayCheckRecipeResult()
+ && GT_Utility.isStringValid(checkRecipeResult.getDisplayString())
+ && (isAllowedToWork() || getBaseMetaTileEntity().isActive()
+ || checkRecipeResult.persistsOnShutdown())))
+ .widget(new CheckRecipeResultSyncer(() -> checkRecipeResult, (result) -> checkRecipeResult = result));
+
+ if (showRecipeTextInGUI()) {
+ // Display current recipe
+ screenElements.widget(
+ TextWidget.dynamicString(this::generateCurrentRecipeInfoString)
+ .setSynced(false)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setEnabled(
+ widget -> (mOutputFluids != null && mOutputFluids.length > 0)
+ || (mOutputItems != null && mOutputItems.length > 0)))
+ .widget(
+ new FakeSyncWidget.ListSyncer<>(
+ () -> mOutputFluids != null ? Arrays.asList(mOutputFluids) : Collections.emptyList(),
+ val -> mOutputFluids = val.toArray(new FluidStack[0]),
+ NetworkUtils::writeFluidStack,
+ NetworkUtils::readFluidStack))
+ .widget(
+ new FakeSyncWidget.ListSyncer<>(
+ () -> mOutputItems != null ? Arrays.asList(mOutputItems) : Collections.emptyList(),
+ val -> mOutputItems = val.toArray(new ItemStack[0]),
+ NetworkUtils::writeItemStack,
+ NetworkUtils::readItemStack))
+ .widget(new FakeSyncWidget.IntegerSyncer(() -> mProgresstime, val -> mProgresstime = val))
+ .widget(new FakeSyncWidget.IntegerSyncer(() -> mMaxProgresstime, val -> mMaxProgresstime = val));
+ }
+
+ screenElements.widget(
+ new TextWidget(GT_Utility.trans("144", "Missing Turbine Rotor")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> {
+ if (getBaseMetaTileEntity().isAllowedToWork()) return false;
+ if (getBaseMetaTileEntity().getErrorDisplayID() == 0
+ && this instanceof GT_MetaTileEntity_LargeTurbine) {
+ final ItemStack tItem = inventorySlot.getMcSlot()
+ .getStack();
+ return tItem == null
+ || !(tItem.getItem() == GT_MetaGenerated_Tool_01.INSTANCE && tItem.getItemDamage() >= 170
+ && tItem.getItemDamage() <= 177);
+ }
+ return false;
+ }));
+ }
+
+ protected boolean showRecipeTextInGUI() {
+ return true;
+ }
+
+ @TestOnly
+ protected void setEnergyHatches(ArrayList<GT_MetaTileEntity_Hatch_Energy> EnergyHatches) {
+ this.mEnergyHatches = EnergyHatches;
+ }
+
+ @TestOnly
+ protected void setExoticEnergyHatches(List<GT_MetaTileEntity_Hatch> ExoticEnergyHatches) {
+ this.mExoticEnergyHatches = ExoticEnergyHatches;
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java
new file mode 100644
index 0000000000..1a71f17ec8
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java
@@ -0,0 +1,134 @@
+package gregtech.api.metatileentity.implementations;
+
+import java.util.List;
+import java.util.function.Function;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.drawable.Text;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public abstract class GT_MetaTileEntity_SpecialFilter extends GT_MetaTileEntity_FilterBase {
+
+ private static final String ALLOW_NBT_TOOLTIP = "GT5U.machines.allow_nbt.tooltip";
+ private boolean allowNbt = false;
+
+ public GT_MetaTileEntity_SpecialFilter(int aID, String aName, String aNameRegional, int aTier,
+ String[] aDescription) {
+ // 9 buffer slot, 1 representation slot, 1 holo slot. last seems not needed...
+ super(aID, aName, aNameRegional, aTier, 11, aDescription);
+ }
+
+ public GT_MetaTileEntity_SpecialFilter(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_SpecialFilter(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("bNBTAllowed", this.allowNbt);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.allowNbt = aNBT.getBoolean("bNBTAllowed");
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return (super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack))
+ && ((this.allowNbt) || (!aStack.hasTagCompound()))
+ && (this.isStackAllowed(aStack) != this.invertFilter);
+ }
+
+ protected abstract boolean isStackAllowed(ItemStack aStack);
+
+ protected List<Text> getEmptySlotTooltip() {
+ return null;
+ }
+
+ protected Function<List<String>, List<String>> getItemStackReplacementTooltip() {
+ return list -> list;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ addAllowNbtButton(builder);
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_WHITE.apply(27, false))
+ .setPos(6, 19)
+ .setSize(27, 24))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_BLUE.apply(42, true))
+ .setPos(53, 19)
+ .setSize(42, 24))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_RED.apply(19, true))
+ .setPos(152, 19)
+ .setSize(19, 24))
+ .widget(
+ createFilterIconSlot(BaseSlot.phantom(inventoryHandler, 9)).disableShiftInsert()
+ .setPos(34, 22)
+ .setBackground(GT_UITextures.BUTTON_STANDARD))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .endAtSlot(8)
+ .build()
+ .setPos(97, 4));
+ }
+
+ private void addAllowNbtButton(ModularWindow.Builder builder) {
+ builder.widget(
+ createToggleButton(
+ () -> allowNbt,
+ val -> allowNbt = val,
+ GT_UITextures.OVERLAY_BUTTON_NBT,
+ () -> mTooltipCache.getData(ALLOW_NBT_TOOLTIP)));
+ }
+
+ protected abstract SlotWidget createFilterIconSlot(BaseSlot slot);
+
+ protected abstract class FilterIconSlotWidget extends SlotWidget {
+
+ public FilterIconSlotWidget(BaseSlot slot) {
+ super(slot);
+ }
+
+ @Override
+ protected abstract void phantomClick(ClickData clickData, ItemStack cursorStack);
+
+ @Override
+ public void buildTooltip(List<Text> tooltip) {
+ super.buildTooltip(tooltip);
+ List<Text> emptySlotTooltip = getEmptySlotTooltip();
+ if (emptySlotTooltip != null) {
+ tooltip.addAll(emptySlotTooltip);
+ }
+ }
+
+ @Override
+ public Function<List<String>, List<String>> getOverwriteItemStackTooltip() {
+ return getItemStackReplacementTooltip();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TieredMachineBlock.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TieredMachineBlock.java
new file mode 100644
index 0000000000..dd21d6f412
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TieredMachineBlock.java
@@ -0,0 +1,126 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.GT;
+import static gregtech.api.metatileentity.BaseTileEntity.BATTERY_SLOT_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.BATTERY_SLOT_TOOLTIP_ALT;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.util.GT_Utility;
+
+public abstract class GT_MetaTileEntity_TieredMachineBlock extends MetaTileEntity {
+
+ /**
+ * Value between [0 - 9] to describe the Tier of this Machine. PLZ [0-15] works - READ! GT_Values class.
+ */
+ public final byte mTier;
+
+ @Deprecated
+ public final String mDescription;
+
+ /**
+ * A simple Description.
+ */
+ public final String[] mDescriptionArray;
+
+ /**
+ * Contains all Textures used by this Block.
+ */
+ public final ITexture[][][] mTextures;
+
+ public GT_MetaTileEntity_TieredMachineBlock(int aID, String aName, String aNameRegional, int aTier,
+ int aInvSlotCount, String aDescription, ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aInvSlotCount);
+ mTier = (byte) Math.max(0, Math.min(aTier, 14));
+ mDescriptionArray = aDescription == null ? new String[0] : new String[] { aDescription };
+ mDescription = mDescriptionArray.length > 0 ? mDescriptionArray[0] : "";
+ // must always be the last call!
+ if (GT.isClientSide()) mTextures = getTextureSet(aTextures);
+ else mTextures = null;
+ }
+
+ public GT_MetaTileEntity_TieredMachineBlock(int aID, String aName, String aNameRegional, int aTier,
+ int aInvSlotCount, String[] aDescription, ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aInvSlotCount);
+ mTier = (byte) Math.max(0, Math.min(aTier, 15));
+ mDescriptionArray = aDescription == null ? new String[0] : aDescription;
+ mDescription = mDescriptionArray.length > 0 ? mDescriptionArray[0] : "";
+
+ // must always be the last call!
+ if (GT.isClientSide()) mTextures = getTextureSet(aTextures);
+ else mTextures = null;
+ }
+
+ public GT_MetaTileEntity_TieredMachineBlock(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aInvSlotCount);
+ mTier = (byte) aTier;
+ mDescriptionArray = aDescription == null ? new String[0] : new String[] { aDescription };
+ mDescription = mDescriptionArray.length > 0 ? mDescriptionArray[0] : "";
+ mTextures = aTextures;
+ }
+
+ public GT_MetaTileEntity_TieredMachineBlock(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aInvSlotCount);
+ mTier = (byte) aTier;
+ mDescriptionArray = aDescription == null ? new String[0] : aDescription;
+ mDescription = mDescriptionArray.length > 0 ? mDescriptionArray[0] : "";
+ mTextures = aTextures;
+ }
+
+ @Override
+ public byte getTileEntityBaseType() {
+ return (byte) (Math.min(3, mTier <= 0 ? 0 : 1 + ((mTier - 1) / 4)));
+ }
+
+ @Override
+ public long getInputTier() {
+ return mTier;
+ }
+
+ @Override
+ public long getOutputTier() {
+ return mTier;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return mDescriptionArray;
+ }
+
+ /**
+ * Used Client Side to get a Texture Set for this Block. Called after setting the Tier and the Description so that
+ * those two are accessible.
+ *
+ * @param aTextures is the optional Array you can give to the Constructor.
+ */
+ public abstract ITexture[][][] getTextureSet(ITexture[] aTextures);
+
+ protected SlotWidget createChargerSlot(int x, int y) {
+ final String batterySlotTooltipKey;
+ final Object[] batterySlotTooltipArgs;
+ final String pTier1 = GT_Utility.getColoredTierNameFromTier(mTier);
+ if (mTier == GT_Values.VN.length - 1) {
+ batterySlotTooltipKey = BATTERY_SLOT_TOOLTIP_ALT;
+ batterySlotTooltipArgs = new String[] { pTier1 };
+ } else {
+ batterySlotTooltipKey = BATTERY_SLOT_TOOLTIP;
+ batterySlotTooltipArgs = new String[] { pTier1, GT_Utility.getColoredTierNameFromTier((byte) (mTier + 1)) };
+ }
+ return createChargerSlot(x, y, batterySlotTooltipKey, batterySlotTooltipArgs);
+ }
+
+ protected SlotWidget createChargerSlot(int x, int y, String tooltipKey, Object[] tooltipArgs) {
+ return (SlotWidget) new SlotWidget(inventoryHandler, rechargerSlotStartIndex()).disableShiftInsert()
+ .setGTTooltip(() -> mTooltipCache.getData(tooltipKey, tooltipArgs))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_CHARGER)
+ .setPos(x, y);
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TooltipMultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TooltipMultiBlockBase.java
new file mode 100644
index 0000000000..c12c7c1442
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TooltipMultiBlockBase.java
@@ -0,0 +1,57 @@
+package gregtech.api.metatileentity.implementations;
+
+import java.util.concurrent.atomic.AtomicReferenceArray;
+
+import org.lwjgl.input.Keyboard;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ISecondaryDescribable;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+/**
+ * A multiblock with tooltip {@link GT_Multiblock_Tooltip_Builder}
+ */
+public abstract class GT_MetaTileEntity_TooltipMultiBlockBase extends GT_MetaTileEntity_MultiBlockBase
+ implements ISecondaryDescribable {
+
+ private static final AtomicReferenceArray<GT_Multiblock_Tooltip_Builder> tooltips = new AtomicReferenceArray<>(
+ GregTech_API.METATILEENTITIES.length);
+
+ public GT_MetaTileEntity_TooltipMultiBlockBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_TooltipMultiBlockBase(String aName) {
+ super(aName);
+ }
+
+ protected GT_Multiblock_Tooltip_Builder getTooltip() {
+ int tId = getBaseMetaTileEntity().getMetaTileID();
+ GT_Multiblock_Tooltip_Builder tooltip = tooltips.get(tId);
+ if (tooltip == null) {
+ tooltip = createTooltip();
+ tooltips.set(tId, tooltip);
+ }
+ return tooltip;
+ }
+
+ protected abstract GT_Multiblock_Tooltip_Builder createTooltip();
+
+ @Override
+ public String[] getDescription() {
+ return getCurrentDescription();
+ }
+
+ @Override
+ public boolean isDisplaySecondaryDescription() {
+ return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT);
+ }
+
+ public String[] getPrimaryDescription() {
+ return getTooltip().getInformation();
+ }
+
+ public String[] getSecondaryDescription() {
+ return getTooltip().getStructureInformation();
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Transformer.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Transformer.java
new file mode 100644
index 0000000000..a8c26957f8
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Transformer.java
@@ -0,0 +1,325 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.V;
+import static mcp.mobius.waila.api.SpecialChars.BLUE;
+import static mcp.mobius.waila.api.SpecialChars.GOLD;
+import static mcp.mobius.waila.api.SpecialChars.GREEN;
+import static mcp.mobius.waila.api.SpecialChars.RED;
+import static mcp.mobius.waila.api.SpecialChars.RESET;
+
+import java.util.List;
+
+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.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cofh.api.energy.IEnergyProvider;
+import cofh.api.energy.IEnergyStorage;
+import crazypants.enderio.machine.capbank.TileCapBank;
+import crazypants.enderio.machine.capbank.network.ICapBankNetwork;
+import crazypants.enderio.power.IPowerContainer;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Utility;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * This is the main construct for my Basic Machines such as the Automatic Extractor Extend this class to make a simple
+ * Machine
+ */
+public class GT_MetaTileEntity_Transformer extends GT_MetaTileEntity_TieredMachineBlock {
+
+ public GT_MetaTileEntity_Transformer(int aID, String aName, String aNameRegional, int aTier, String aDescription) {
+ super(aID, aName, aNameRegional, aTier, 0, aDescription);
+ }
+
+ public GT_MetaTileEntity_Transformer(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Transformer(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[12][17][];
+ for (byte i = -1; i < 16; i++) {
+ rTextures[0][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] };
+ rTextures[1][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] };
+ rTextures[2][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT[mTier] };
+ rTextures[3][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] };
+ rTextures[4][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] };
+ rTextures[5][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI[mTier] };
+ rTextures[6][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] };
+ rTextures[7][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] };
+ rTextures[8][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_IN[mTier] };
+ rTextures[9][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] };
+ rTextures[10][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] };
+ rTextures[11][i + 1] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i + 1],
+ Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI[mTier] };
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection side,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ return mTextures[Math.min(2, side.ordinal()) + (side == facingDirection ? 3 : 0)
+ + (baseMetaTileEntity.isAllowedToWork() ? 0 : 6)][colorIndex + 1];
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Transformer(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ ForgeDirection blockFrontFacing = getBaseMetaTileEntity().getFrontFacing();
+
+ if (getBaseMetaTileEntity().isAllowedToWork()) {
+ return side == blockFrontFacing;
+ } else {
+ return side != blockFrontFacing;
+ }
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return !isInputFacing(side);
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return V[mTier + 1];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(512L, 1L << (mTier + 2)) + V[mTier + 1] * 4L;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[getBaseMetaTileEntity().isAllowedToWork() ? mTier + 1 : mTier];
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return V[getBaseMetaTileEntity().isAllowedToWork() ? mTier : mTier + 1];
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return getBaseMetaTileEntity().isAllowedToWork() ? 4 : 1;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return getBaseMetaTileEntity().isAllowedToWork() ? 1 : 4;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide() && GregTech_API.mInputRF) {
+ aBaseMetaTileEntity.setActive(aBaseMetaTileEntity.isAllowedToWork());
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (aBaseMetaTileEntity.getStoredEU() >= aBaseMetaTileEntity.getEUCapacity()) break;
+ if (!aBaseMetaTileEntity.inputEnergyFrom(side)) continue;
+ final TileEntity tTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(side);
+ if (tTileEntity instanceof IEnergyProvider energyProvider
+ && energyProvider.extractEnergy(side.getOpposite(), 1, true) == 1) {
+ long tEU = ((IEnergyProvider) tTileEntity).extractEnergy(
+ side.getOpposite(),
+ GT_Utility.safeInt(maxEUInput() * 100L / GregTech_API.mRFtoEU),
+ false);
+ tEU = tEU * GregTech_API.mRFtoEU / 100;
+ aBaseMetaTileEntity.injectEnergyUnits(ForgeDirection.UNKNOWN, Math.min(tEU, maxEUInput()), 1);
+ } else if (tTileEntity instanceof IEnergyStorage energyStorage
+ && energyStorage.extractEnergy(1, true) == 1) {
+ long tEU = ((IEnergyStorage) tTileEntity)
+ .extractEnergy(GT_Utility.safeInt(maxEUInput() * 100L / GregTech_API.mRFtoEU), false);
+ tEU = tEU * GregTech_API.mRFtoEU / 100;
+ aBaseMetaTileEntity.injectEnergyUnits(ForgeDirection.UNKNOWN, Math.min(tEU, maxEUInput()), 1);
+ } else if (GregTech_API.meIOLoaded && tTileEntity instanceof IPowerContainer powerContainer
+ && powerContainer.getEnergyStored() > 0) {
+ final int storedRF = powerContainer.getEnergyStored();
+ final int extractRF = GT_Utility.safeInt(maxEUInput() * 100L / GregTech_API.mRFtoEU);
+ long tEU = 0;
+ if (tTileEntity instanceof TileCapBank capBank) {
+ ICapBankNetwork network = capBank.getNetwork();
+ if (network != null && network.getEnergyStoredL() > 0) {
+ tEU = Math.min(
+ (Math.min(
+ Math.min(network.getEnergyStoredL(), storedRF - extractRF),
+ network.getMaxOutput())) * (long) GregTech_API.mRFtoEU / 100L,
+ maxEUInput());
+ network.addEnergy(GT_Utility.safeInt(-(tEU * 100 / GregTech_API.mRFtoEU)));
+ }
+ } else {
+ if (storedRF > extractRF) {
+ powerContainer.setEnergyStored(storedRF - extractRF);
+ tEU = maxEUInput();
+ } else {
+ powerContainer.setEnergyStored(0);
+ tEU = storedRF * (long) GregTech_API.mRFtoEU / 100L;
+ }
+ }
+ aBaseMetaTileEntity
+ .injectEnergyUnits(ForgeDirection.UNKNOWN, Math.min(tEU, maxEUInput()), 1);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ //
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ //
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean hasAlternativeModeText() {
+ return true;
+ }
+
+ @Override
+ public String getAlternativeModeText() {
+ return (getBaseMetaTileEntity().isAllowedToWork() ? GT_Utility.trans("145", "Step Down, In: ")
+ : GT_Utility.trans("146", "Step Up, In: ")) + maxEUInput()
+ + GT_Utility.trans("148", "V ")
+ + maxAmperesIn()
+ + GT_Utility.trans("147", "A, Out: ")
+ + maxEUOutput()
+ + GT_Utility.trans("148", "V ")
+ + maxAmperesOut()
+ + GT_Utility.trans("149", "A");
+ }
+
+ @Override
+ public boolean shouldJoinIc2Enet() {
+ return true;
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ final ForgeDirection facing = getBaseMetaTileEntity().getFrontFacing();
+ final NBTTagCompound tag = accessor.getNBTData();
+ final ForgeDirection side = accessor.getSide();
+ final boolean allowedToWork = tag.getBoolean("isAllowedToWork");
+
+ final byte inputTier = GT_Utility.getTier(tag.getLong("maxEUInput"));
+ final byte outputTier = GT_Utility.getTier(tag.getLong("maxEUOutput"));
+
+ currenttip.add(
+ String.format(
+ "%s %s(%dA) -> %s(%dA)",
+ (allowedToWork ? (GREEN + "Step Down") : (RED + "Step Up")) + RESET,
+ GT_Mod.gregtechproxy.mWailaTransformerVoltageTier ? GT_Utility.getColoredTierNameFromTier(inputTier)
+ : tag.getLong("maxEUInput"),
+ tag.getLong("maxAmperesIn"),
+ GT_Mod.gregtechproxy.mWailaTransformerVoltageTier ? GT_Utility.getColoredTierNameFromTier(outputTier)
+ : tag.getLong("maxEUOutput"),
+ tag.getLong("maxAmperesOut")));
+
+ if ((side == facing && allowedToWork) || (side != facing && !allowedToWork)) {
+ currenttip.add(
+ String.format(
+ GOLD + "Input:" + RESET + " %s(%dA)",
+ GT_Mod.gregtechproxy.mWailaTransformerVoltageTier ? GT_Utility.getColoredTierNameFromTier(inputTier)
+ : tag.getLong("maxEUInput"),
+ tag.getLong("maxAmperesIn")));
+ } else {
+ currenttip.add(
+ String.format(
+ BLUE + "Output:" + RESET + " %s(%dA)",
+ GT_Mod.gregtechproxy.mWailaTransformerVoltageTier
+ ? GT_Utility.getColoredTierNameFromTier(outputTier)
+ : tag.getLong("maxEUOutput"),
+ tag.getLong("maxAmperesOut")));
+ }
+
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ tag.setBoolean("isAllowedToWork", getBaseMetaTileEntity().isAllowedToWork());
+ tag.setLong("maxEUInput", maxEUInput());
+ tag.setLong("maxAmperesIn", maxAmperesIn());
+ tag.setLong("maxEUOutput", maxEUOutput());
+ tag.setLong("maxAmperesOut", maxAmperesOut());
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Dynamo.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Dynamo.java
new file mode 100644
index 0000000000..a04f5cd986
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Dynamo.java
@@ -0,0 +1,146 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.AuthorColen;
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.strongCheckOrAddUser;
+
+import java.util.UUID;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IWirelessEnergyHatchInformation;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+public class GT_MetaTileEntity_Wireless_Dynamo extends GT_MetaTileEntity_Hatch_Dynamo
+ implements IWirelessEnergyHatchInformation {
+
+ private UUID owner_uuid;
+
+ public GT_MetaTileEntity_Wireless_Dynamo(String aName, byte aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Wireless_Dynamo(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, new String[] { "" });
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI_WIRELESS_ON[mTier] };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI_WIRELESS_ON[mTier] };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 2 * V[mTier];
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return totalStorage(V[mTier]);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { EnumChatFormatting.GRAY + "Stores energy globally in a network, up to 2^(2^31) EU.",
+ EnumChatFormatting.GRAY + "Does not connect to wires. This block accepts EU into the network.",
+ AuthorColen };
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 2;
+ }
+
+ @Override
+ public ConnectionType getConnectionType() {
+ return ConnectionType.WIRELESS;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Wireless_Dynamo(mName, mTier, new String[] { "" }, mTextures);
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+
+ if (aBaseMetaTileEntity.isServerSide()) {
+
+ // On first tick find the player name and attempt to add them to the map.
+ if (aTick == 1) {
+
+ // UUID and username of the owner.
+ owner_uuid = aBaseMetaTileEntity.getOwnerUuid();
+
+ strongCheckOrAddUser(owner_uuid);
+ }
+
+ // Every ticks_between_energy_addition ticks change the energy content of the machine.
+ if (aTick % ticks_between_energy_addition == 0L) {
+ addEUToGlobalEnergyMap(owner_uuid, getEUVar());
+ setEUVar(0L);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Hatch.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Hatch.java
new file mode 100644
index 0000000000..bf624eadd7
--- /dev/null
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Wireless_Hatch.java
@@ -0,0 +1,168 @@
+package gregtech.api.metatileentity.implementations;
+
+import static gregtech.api.enums.GT_Values.AuthorColen;
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static java.lang.Long.min;
+
+import java.math.BigInteger;
+import java.util.UUID;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IWirelessEnergyHatchInformation;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.common.misc.spaceprojects.SpaceProjectManager;
+
+public class GT_MetaTileEntity_Wireless_Hatch extends GT_MetaTileEntity_Hatch_Energy
+ implements IWirelessEnergyHatchInformation {
+
+ private final BigInteger eu_transferred_per_operation = BigInteger
+ .valueOf(2 * V[mTier] * ticks_between_energy_addition);
+ private final long eu_transferred_per_operation_long = eu_transferred_per_operation.longValue();
+
+ private UUID owner_uuid;
+
+ public GT_MetaTileEntity_Wireless_Hatch(String aName, byte aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Wireless_Hatch(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, new String[] { "" });
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { EnumChatFormatting.GRAY + "Stores energy globally in a network, up to 2^(2^31) EU.",
+ EnumChatFormatting.GRAY + "Does not connect to wires. This block withdraws EU from the network.",
+ AuthorColen };
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI_WIRELESS_ON[mTier] };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI_WIRELESS_ON[mTier] };
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 2 * V[mTier];
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxEUStore() {
+ return totalStorage(V[mTier]);
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 2;
+ }
+
+ @Override
+ public ConnectionType getConnectionType() {
+ return ConnectionType.WIRELESS;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Wireless_Hatch(mName, mTier, new String[] { "" }, mTextures);
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+
+ if (!aBaseMetaTileEntity.isServerSide()) return;
+
+ // UUID of the owner.
+ owner_uuid = aBaseMetaTileEntity.getOwnerUuid();
+
+ SpaceProjectManager.checkOrCreateTeam(owner_uuid);;
+
+ tryFetchingEnergy();
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+
+ if (aBaseMetaTileEntity.isServerSide()) {
+ // This is set up in a way to be as optimised as possible. If a user has a relatively plentiful energy
+ // network
+ // it should make no difference to them. Minimising the number of operations on BigInteger is essential.
+
+ // Every ticks_between_energy_addition add eu_transferred_per_operation to internal EU storage from network.
+ if (aTick % ticks_between_energy_addition == 0L) {
+ tryFetchingEnergy();
+ }
+ }
+ }
+
+ private void tryFetchingEnergy() {
+ long currentEU = getBaseMetaTileEntity().getStoredEU();
+ long maxEU = maxEUStore();
+ long euToTransfer = min(maxEU - currentEU, eu_transferred_per_operation_long);
+ if (euToTransfer <= 0) return; // nothing to transfer
+ if (!addEUToGlobalEnergyMap(owner_uuid, -euToTransfer)) return;
+ setEUVar(currentEU + euToTransfer);
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java
new file mode 100644
index 0000000000..6ee760553e
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java
@@ -0,0 +1,654 @@
+package gregtech.api.multitileentity;
+
+import static gregtech.api.enums.GT_Values.OFFX;
+import static gregtech.api.enums.GT_Values.OFFY;
+import static gregtech.api.enums.GT_Values.OFFZ;
+import static gregtech.api.util.GT_Util.LAST_BROKEN_TILEENTITY;
+import static gregtech.api.util.GT_Util.getTileEntity;
+import static gregtech.api.util.GT_Util.setTileEntity;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.ITileEntityProvider;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.stats.StatList;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.Explosion;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.event.ForgeEventFactory;
+
+import com.cricketcraft.chisel.api.IFacade;
+
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IDebugableBlock;
+import gregtech.api.interfaces.tileentity.IDebugableTileEntity;
+import gregtech.api.metatileentity.BaseTileEntity;
+import gregtech.api.metatileentity.CoverableTileEntity;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_BreakBlock;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_GetBlockHardness;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_GetComparatorInputOverride;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_GetWeakChanges;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_HasMultiBlockMachineRelevantData;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_IsProvidingStrongPower;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_IsProvidingWeakPower;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_OnNeighborBlockChange;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_ShouldCheckWeakPower;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Util;
+import gregtech.common.covers.CoverInfo;
+import gregtech.common.render.GT_MultiTile_Renderer;
+
+/*
+ * MultiTileEntityBlock ported from GT6
+ */
+@Optional.Interface(iface = "com.cricketcraft.chisel.api.IFacade", modid = "ChiselAPI")
+public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITileEntityProvider, IFacade {
+
+ protected static final Map<String, MultiTileEntityBlock> MULTI_BLOCK_MAP = new HashMap<>();
+ private static boolean LOCK = false;
+
+ protected final String mNameInternal, mTool;
+ protected final int mHarvestLevelOffset, mHarvestLevelMinimum, mHarvestLevelMaximum;
+ protected final boolean mOpaque, mNormalCube;
+
+ public static String getName(String aMaterialName, SoundType aSoundType, String aTool, int aHarvestLevelOffset,
+ int aHarvestLevelMinimum, int aHarvestLevelMaximum, boolean aOpaque, boolean aNormalCube) {
+ return "gt.block.multiblock." + aMaterialName
+ + "."
+ + aSoundType.soundName
+ + "."
+ + aTool
+ + "."
+ + aHarvestLevelOffset
+ + "."
+ + aHarvestLevelMinimum
+ + "."
+ + aHarvestLevelMaximum
+ + "."
+ + aOpaque
+ + "."
+ + aNormalCube;
+ }
+
+ /**
+ * @param aMaterialName the Name of the vanilla Material Field. In case this is not a vanilla Material,
+ * insert the Name you want to give your own Material instead.
+ * @param aMaterial the Material used to determine the Block.
+ * @param aSoundType the Sound Type of the Block.
+ * @param aTool the Tool used to harvest this Block.
+ * @param aHarvestLevelOffset obvious
+ * @param aHarvestLevelMinimum obvious
+ * @param aHarvestLevelMaximum obvious
+ * @param aOpaque if this Block is Opaque.
+ * @param aNormalCube if this Block is a normal Cube (for Redstone Stuff).
+ */
+ public static MultiTileEntityBlock getOrCreate(String aModID, String aMaterialName, Material aMaterial,
+ SoundType aSoundType, String aTool, int aHarvestLevelOffset, int aHarvestLevelMinimum, int aHarvestLevelMaximum,
+ boolean aOpaque, boolean aNormalCube) {
+ final MultiTileEntityBlock rBlock = MULTI_BLOCK_MAP.get(
+ aModID + ":"
+ + getName(
+ aMaterialName,
+ aSoundType,
+ aTool = aTool.toLowerCase(),
+ aHarvestLevelOffset,
+ aHarvestLevelMinimum,
+ aHarvestLevelMaximum,
+ aOpaque,
+ aNormalCube));
+ return rBlock == null
+ ? new MultiTileEntityBlock(
+ aModID,
+ aMaterialName,
+ aMaterial,
+ aSoundType,
+ aTool,
+ aHarvestLevelOffset,
+ aHarvestLevelMinimum,
+ aHarvestLevelMaximum,
+ aOpaque,
+ aNormalCube)
+ : rBlock;
+ }
+
+ protected MultiTileEntityBlock(String aModID, String aMaterialName, Material aMaterial, SoundType aSoundType,
+ String aTool, int aHarvestLevelOffset, int aHarvestLevelMinimum, int aHarvestLevelMaximum, boolean aOpaque,
+ boolean aNormalCube) {
+ super(aMaterial);
+ if (GregTech_API.sPreloadFinished)
+ throw new IllegalStateException("Blocks can only be initialized within preInit!");
+
+ mNameInternal = getName(
+ aMaterialName,
+ aSoundType,
+ aTool,
+ aHarvestLevelOffset,
+ aHarvestLevelMinimum,
+ aHarvestLevelMaximum,
+ aOpaque,
+ aNormalCube);
+ GameRegistry.registerBlock(this, ItemBlock.class, mNameInternal);
+
+ MULTI_BLOCK_MAP.put(aModID + ":" + mNameInternal, this);
+
+ setStepSound(aSoundType);
+ mOpaque = aOpaque;
+ mNormalCube = aNormalCube;
+
+ mTool = aTool.toLowerCase();
+ mHarvestLevelOffset = aHarvestLevelOffset;
+ mHarvestLevelMinimum = Math.max(0, aHarvestLevelMinimum);
+ mHarvestLevelMaximum = Math.max(aHarvestLevelMinimum, aHarvestLevelMaximum);
+
+ opaque = isOpaqueCube();
+ lightOpacity = isOpaqueCube() ? 255 : 0;
+ }
+
+ @Override
+ public final void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetaData) {
+ final TileEntity aTileEntity = getTileEntity(aWorld, aX, aY, aZ, true);
+ if (aTileEntity != null) LAST_BROKEN_TILEENTITY.set(aTileEntity);
+ if (aTileEntity == null || !aTileEntity.shouldRefresh(this, aBlock, aMetaData, aMetaData, aWorld, aX, aY, aZ))
+ return;
+ if (aTileEntity instanceof IMTE_BreakBlock && ((IMTE_BreakBlock) aTileEntity).breakBlock()) return;
+ if (aTileEntity instanceof IMTE_HasMultiBlockMachineRelevantData
+ && ((IMTE_HasMultiBlockMachineRelevantData) aTileEntity).hasMultiBlockMachineRelevantData())
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+
+ aWorld.removeTileEntity(aX, aY, aZ);
+ }
+
+ @Override
+ public ArrayList<String> getDebugInfo(EntityPlayer aPlayer, int aX, int aY, int aZ, int aLogLevel) {
+ final TileEntity aTileEntity = aPlayer.worldObj.getTileEntity(aX, aY, aZ);
+ if (aTileEntity instanceof IDebugableTileEntity mte) {
+ return mte.getDebugInfo(aPlayer, aLogLevel);
+ }
+ return new ArrayList<>();
+ }
+
+ @Override
+ public final boolean func_149730_j /* isFullBlock */() {
+ return mOpaque;
+ }
+
+ @Override
+ public final boolean isNormalCube() {
+ return mNormalCube;
+ }
+
+ @Override
+ public final boolean renderAsNormalBlock() {
+ return mOpaque || mNormalCube;
+ }
+
+ @Override
+ public int getRenderType() {
+ return GT_MultiTile_Renderer.INSTANCE == null ? super.getRenderType()
+ : GT_MultiTile_Renderer.INSTANCE.getRenderId();
+ }
+
+ @Override
+ public final float getBlockHardness(World aWorld, int aX, int aY, int aZ) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity instanceof IMTE_GetBlockHardness ? ((IMTE_GetBlockHardness) aTileEntity).getBlockHardness()
+ : 1.0F;
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public IIcon getIcon(IBlockAccess aIBlockAccess, int aX, int aY, int aZ, int ordinalSide) {
+ return Textures.BlockIcons.MACHINE_LV_SIDE.getIcon();
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return Textures.BlockIcons.MACHINE_LV_SIDE.getIcon();
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public final void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB aAABB,
+ List<AxisAlignedBB> aList, Entity aEntity) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (aTileEntity instanceof IMultiTileEntity)
+ ((IMultiTileEntity) aTileEntity).addCollisionBoxesToList(aAABB, aList, aEntity);
+ else super.addCollisionBoxesToList(aWorld, aX, aY, aZ, aAABB, aList, aEntity);
+ }
+
+ @Override
+ public final AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity instanceof IMultiTileEntity mte ? mte.getCollisionBoundingBoxFromPool()
+ : aTileEntity == null ? null : super.getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public final AxisAlignedBB getSelectedBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity instanceof IMultiTileEntity mte ? mte.getSelectedBoundingBoxFromPool()
+ : super.getSelectedBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public void setBlockBoundsBasedOnState(IBlockAccess blockAccess, int aX, int aY, int aZ) {
+ final TileEntity aTileEntity = blockAccess.getTileEntity(aX, aY, aZ);
+ if (aTileEntity instanceof IMultiTileEntity mte) {
+ mte.setBlockBoundsBasedOnState(this);
+ return;
+ }
+ super.setBlockBoundsBasedOnState(blockAccess, aX, aY, aZ);
+ }
+
+ @Override
+ public final boolean isOpaqueCube() {
+ return mOpaque;
+ }
+
+ @Override
+ public final void onNeighborChange(IBlockAccess aWorld, int aX, int aY, int aZ, int aTileX, int aTileY,
+ int aTileZ) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (!LOCK) {
+ LOCK = true;
+ if (aTileEntity instanceof BaseTileEntity)
+ ((BaseTileEntity) aTileEntity).onAdjacentBlockChange(aTileX, aTileY, aTileZ);
+ LOCK = false;
+ }
+ }
+
+ @Override
+ public void onNeighborBlockChange(World aWorld, int aX, int aY, int aZ, Block aBlock) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (!LOCK) {
+ LOCK = true;
+ if (aTileEntity instanceof BaseTileEntity bte) bte.onAdjacentBlockChange(aX, aY, aZ);
+ LOCK = false;
+ }
+ if (aTileEntity instanceof IMTE_OnNeighborBlockChange change) change.onNeighborBlockChange(aWorld, aBlock);
+ if (aTileEntity == null) aWorld.setBlockToAir(aX, aY, aZ);
+ }
+
+ @Override
+ public final void onBlockAdded(World aWorld, int aX, int aY, int aZ) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (aTileEntity instanceof IMultiTileEntity mte) mte.onBlockAdded();
+ }
+
+ @Override
+ public float getPlayerRelativeBlockHardness(EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity instanceof IMultiTileEntity mte && mte.privateAccess()
+ && !((IMultiTileEntity) aTileEntity).playerOwnsThis(aPlayer, true) ? -1.0F
+ : super.getPlayerRelativeBlockHardness(aPlayer, aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public final void onBlockClicked(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (aTileEntity instanceof IMultiTileEntity mte) mte.onLeftClick(aPlayer);
+ else super.onBlockClicked(aWorld, aX, aY, aZ, aPlayer);
+ }
+
+ @Override
+ public boolean onBlockActivated(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer, int ordinalSide,
+ float aHitX, float aHitY, float aHitZ) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (aPlayer != null && ItemList.TC_Thaumometer.isStackEqual(aPlayer.getHeldItem(), true, true)) return false;
+ return aTileEntity instanceof IMultiTileEntity mte
+ && mte.onBlockActivated(aPlayer, ForgeDirection.getOrientation(ordinalSide), aHitX, aHitY, aHitZ);
+ }
+
+ @Override
+ public final int isProvidingWeakPower(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity instanceof IMTE_IsProvidingWeakPower power
+ ? power.isProvidingWeakPower(ForgeDirection.getOrientation(ordinalSide))
+ : super.isProvidingWeakPower(aWorld, aX, aY, aZ, ordinalSide);
+ }
+
+ @Override
+ public final int isProvidingStrongPower(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity instanceof IMTE_IsProvidingStrongPower power
+ ? power.isProvidingStrongPower(ForgeDirection.getOrientation(ordinalSide))
+ : super.isProvidingStrongPower(aWorld, aX, aY, aZ, ordinalSide);
+ }
+
+ @Override
+ public final boolean shouldCheckWeakPower(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity instanceof IMTE_ShouldCheckWeakPower power
+ ? power.shouldCheckWeakPower(ForgeDirection.getOrientation(ordinalSide))
+ : isNormalCube(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public final boolean getWeakChanges(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity instanceof IMTE_GetWeakChanges changes ? changes.getWeakChanges()
+ : super.getWeakChanges(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public final void harvestBlock(World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ, int aMeta) {
+ if (aPlayer == null) aPlayer = harvesters.get();
+ aPlayer.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1);
+ aPlayer.addExhaustion(0.025F);
+ final boolean aSilkTouch = EnchantmentHelper.getSilkTouchModifier(aPlayer);
+ final int aFortune = EnchantmentHelper.getFortuneModifier(aPlayer);
+ float aChance = 1.0F;
+ final TileEntity aTileEntity = getTileEntity(aWorld, aX, aY, aZ, true);
+
+ if (!(aTileEntity instanceof IMultiTileEntity mte)) {
+ return;
+ }
+
+ final ArrayList<ItemStack> tList = mte.getDrops(aFortune, aSilkTouch);
+ aChance = ForgeEventFactory
+ .fireBlockHarvesting(tList, aWorld, this, aX, aY, aZ, aMeta, aFortune, aChance, aSilkTouch, aPlayer);
+ for (final ItemStack tStack : tList)
+ if (XSTR.XSTR_INSTANCE.nextFloat() <= aChance) dropBlockAsItem(aWorld, aX, aY, aZ, tStack);
+
+ }
+
+ @Override
+ public final boolean shouldSideBeRendered(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ final TileEntity aTileEntity = aWorld
+ .getTileEntity(aX - OFFX[ordinalSide], aY - OFFY[ordinalSide], aZ - OFFZ[ordinalSide]);
+ return aTileEntity instanceof IMultiTileEntity mte
+ ? mte.shouldSideBeRendered(ForgeDirection.getOrientation(ordinalSide))
+ : super.shouldSideBeRendered(aWorld, aX, aY, aZ, ordinalSide);
+ }
+
+ @Override
+ public Block getFacade(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof CoverableTileEntity tile) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ if (ordinalSide != -1) {
+ final Block facadeBlock = tile.getCoverInfoAtSide(side)
+ .getFacadeBlock();
+ if (facadeBlock != null) return facadeBlock;
+ } else {
+ // we do not allow more than one type of facade per block, so no need to check every side
+ // see comment in gregtech.common.covers.GT_Cover_FacadeBase.isCoverPlaceable
+ for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) {
+ final Block facadeBlock = tile.getCoverInfoAtSide(tSide)
+ .getFacadeBlock();
+ if (facadeBlock != null) {
+ return facadeBlock;
+ }
+ }
+ }
+ }
+ return Blocks.air;
+ }
+
+ @Override
+ public int getFacadeMetadata(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof CoverableTileEntity tile) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ if (ordinalSide != -1) {
+ final CoverInfo coverInfo = tile.getCoverInfoAtSide(side);
+ final Block facadeBlock = coverInfo.getFacadeBlock();
+ if (facadeBlock != null) return coverInfo.getFacadeMeta();
+ } else {
+ // we do not allow more than one type of facade per block, so no need to check every side
+ // see comment in gregtech.common.covers.GT_Cover_FacadeBase.isCoverPlaceable
+ for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) {
+ final CoverInfo coverInfo = tile.getCoverInfoAtSide(tSide);
+ final Block facadeBlock = coverInfo.getFacadeBlock();
+ if (facadeBlock != null) {
+ return coverInfo.getFacadeMeta();
+ }
+ }
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ protected boolean canSilkHarvest() {
+ return false;
+ }
+
+ @Override
+ public final boolean canProvidePower() {
+ return !mNormalCube;
+ }
+
+ @Override
+ public final String getLocalizedName() {
+ return StatCollector.translateToLocal(mNameInternal + ".name");
+ }
+
+ @Override
+ public final String getUnlocalizedName() {
+ return mNameInternal;
+ }
+
+ @Override
+ public final boolean onBlockEventReceived(World aWorld, int aX, int aY, int aZ, int aID, int aData) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity == null || aTileEntity.receiveClientEvent(aID, aData);
+ }
+
+ @Override
+ public final void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ /**/
+ }
+
+ @Override
+ public boolean hasComparatorInputOverride() {
+ return true;
+ }
+
+ @Override
+ public final int getComparatorInputOverride(World aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (aTileEntity instanceof IMTE_GetComparatorInputOverride override) {
+ return override.getComparatorInputOverride(ForgeDirection.getOrientation(ordinalSide));
+ }
+
+ if (aTileEntity instanceof IMTE_IsProvidingWeakPower power) {
+ return power.isProvidingWeakPower(
+ ForgeDirection.getOrientation(ordinalSide)
+ .getOpposite());
+ }
+
+ return super.getComparatorInputOverride(aWorld, aX, aY, aZ, ordinalSide);
+ }
+
+ @Override
+ public final void registerBlockIcons(IIconRegister aIconRegister) {
+ /**/
+ }
+
+ @Override
+ public final boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return mNormalCube;
+ }
+
+ @Override
+ public final boolean isSideSolid(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection side) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity instanceof IMultiTileEntity mte ? mte.isSideSolid(side) : mOpaque;
+ }
+
+ @Override
+ public boolean removedByPlayer(World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ, boolean aWillHarvest) {
+ final TileEntity aTileEntity = GT_Util.getTileEntity(aWorld, aX, aY, aZ, true);
+ if (aTileEntity != null) LAST_BROKEN_TILEENTITY.set(aTileEntity);
+ return super.removedByPlayer(aWorld, aPlayer, aX, aY, aZ, aWillHarvest);
+ }
+
+ @Override
+ public int getFlammability(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) {
+ return 0;
+ }
+
+ @Override
+ public int getFireSpreadSpeed(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) {
+ return GregTech_API.sMachineFlammable && (aWorld.getBlockMetadata(aX, aY, aZ) == 0) ? 100 : 0;
+ }
+
+ @Override
+ public boolean hasTileEntity(int aMeta) {
+ return true;
+ }
+
+ @Override
+ public final ArrayList<ItemStack> getDrops(World aWorld, int aX, int aY, int aZ, int aUnusableMetaData,
+ int aFortune) {
+ final TileEntity aTileEntity = getTileEntity(aWorld, aX, aY, aZ, true);
+ if (aTileEntity instanceof IMultiTileEntity mte) return mte.getDrops(aFortune, false);
+ return new ArrayList<>();
+ }
+
+ @Override
+ public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return false;
+ }
+
+ @Override
+ public final float getExplosionResistance(Entity aExploder, World aWorld, int aX, int aY, int aZ,
+ double aExplosionX, double aExplosionY, double aExplosionZ) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity instanceof IMultiTileEntity mte
+ ? mte.getExplosionResistance(aExploder, aExplosionX, aExplosionY, aExplosionZ)
+ : 1.0F;
+ }
+
+ @Override
+ public final void onBlockExploded(World aWorld, int aX, int aY, int aZ, Explosion aExplosion) {
+ if (aWorld.isRemote) return;
+ final TileEntity aTileEntity = getTileEntity(aWorld, aX, aY, aZ, true);
+ if (aTileEntity != null) LAST_BROKEN_TILEENTITY.set(aTileEntity);
+ if (aTileEntity instanceof IMultiTileEntity mte) {
+ GT_Log.exp.printf(
+ "Explosion at : %d | %d | %d DIMID: %s due to near explosion!%n",
+ aX,
+ aY,
+ aZ,
+ aWorld.provider.dimensionId);
+ mte.onExploded(aExplosion);
+ } else aWorld.setBlockToAir(aX, aY, aZ);
+ }
+
+ @Override
+ public final boolean canConnectRedstone(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ return true;
+ }
+
+ @Override
+ public final boolean recolourBlock(World aWorld, int aX, int aY, int aZ, ForgeDirection side, int aColor) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity instanceof IMultiTileEntity mte && mte.recolourBlock(side, (byte) aColor);
+ }
+
+ @Override
+ public final String getHarvestTool(int aMeta) {
+ return mTool;
+ }
+
+ @Override
+ public final int getHarvestLevel(int aMeta) {
+ return Math.max(mHarvestLevelMinimum, Math.min(mHarvestLevelMaximum, mHarvestLevelOffset + aMeta));
+ }
+
+ @Override
+ public final boolean isToolEffective(String aType, int aMeta) {
+ return getHarvestTool(aMeta).equals(aType);
+ }
+
+ @Override
+ public final ItemStack getPickBlock(MovingObjectPosition aTarget, World aWorld, int aX, int aY, int aZ,
+ EntityPlayer aPlayer) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity instanceof IMultiTileEntity mte ? mte.getPickBlock(aTarget) : null;
+ }
+
+ @Override
+ public final ItemStack getPickBlock(MovingObjectPosition aTarget, World aWorld, int aX, int aY, int aZ) {
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return aTileEntity instanceof IMultiTileEntity mte ? mte.getPickBlock(aTarget) : null;
+ }
+
+ @Nullable
+ public final IMultiTileEntity receiveMultiTileEntityData(@Nonnull IBlockAccess aWorld, int aX, int aY, int aZ,
+ int registryId, int aID) {
+ if (!(aWorld instanceof World)) return null;
+ TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+
+ if (!(aTileEntity instanceof IMultiTileEntity mte) || mte.getMultiTileEntityRegistryID() != registryId
+ || mte.getMultiTileEntityID() != aID) {
+ final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(registryId);
+ if (tRegistry == null) return null;
+
+ aTileEntity = tRegistry.getNewTileEntity((World) aWorld, aX, aY, aZ, aID);
+ if (!(aTileEntity instanceof IMultiTileEntity)) return null;
+
+ setTileEntity((World) aWorld, aX, aY, aZ, aTileEntity, false);
+ }
+ return (IMultiTileEntity) aTileEntity;
+ }
+
+ public void receiveCoverData(IMultiTileEntity mte, int aCover0, int aCover1, int aCover2, int aCover3, int aCover4,
+ int aCover5) {
+ boolean updated;
+ updated = mte.setCoverIDAtSideNoUpdate(ForgeDirection.DOWN, aCover0);
+ updated |= mte.setCoverIDAtSideNoUpdate(ForgeDirection.UP, aCover1);
+ updated |= mte.setCoverIDAtSideNoUpdate(ForgeDirection.NORTH, aCover2);
+ updated |= mte.setCoverIDAtSideNoUpdate(ForgeDirection.SOUTH, aCover3);
+ updated |= mte.setCoverIDAtSideNoUpdate(ForgeDirection.WEST, aCover4);
+ updated |= mte.setCoverIDAtSideNoUpdate(ForgeDirection.EAST, aCover5);
+
+ if (updated) {
+ mte.issueBlockUpdate();
+ }
+ }
+
+ @Override
+ public final TileEntity createTileEntity(World aWorld, int aMeta) {
+ return null;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(World world, int i) {
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlockInternal.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlockInternal.java
new file mode 100644
index 0000000000..17e217ae7e
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlockInternal.java
@@ -0,0 +1,118 @@
+package gregtech.api.multitileentity;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.util.GT_Util.setTileEntity;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.init.Blocks;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_HasMultiBlockMachineRelevantData;
+import gregtech.common.render.GT_MultiTile_Renderer;
+
+public class MultiTileEntityBlockInternal extends Block {
+
+ public MultiTileEntityRegistry mMultiTileEntityRegistry;
+
+ public MultiTileEntityBlockInternal() {
+ super(Material.anvil);
+ }
+
+ @Override
+ public void registerBlockIcons(IIconRegister aIconRegister) {
+ /* Do Nothing */
+ }
+
+ @Override
+ public int getRenderType() {
+ return GT_MultiTile_Renderer.INSTANCE == null ? super.getRenderType()
+ : GT_MultiTile_Renderer.INSTANCE.getRenderId();
+ }
+
+ @Override
+ public final String getUnlocalizedName() {
+ return mMultiTileEntityRegistry.mNameInternal;
+ }
+
+ @Override
+ public final String getLocalizedName() {
+ return StatCollector.translateToLocal(mMultiTileEntityRegistry.mNameInternal + ".name");
+ }
+
+ public boolean placeBlock(World aWorld, int aX, int aY, int aZ, ForgeDirection side, short aMetaData,
+ NBTTagCompound aNBT, boolean aCauseBlockUpdates, boolean aForcePlacement) {
+ final MultiTileEntityContainer aMTEContainer = mMultiTileEntityRegistry
+ .getNewTileEntityContainer(aWorld, aX, aY, aZ, aMetaData, aNBT);
+ if (aMTEContainer == null) return false;
+
+ final Block tReplacedBlock = aWorld.getBlock(aX, aY, aZ);
+
+ // This is some complicated bullshit Greg had to do to make his MTEs work right.
+ // Set Block with reverse MetaData first.
+ aWorld.setBlock(aX, aY, aZ, aMTEContainer.mBlock, 15 - aMTEContainer.mBlockMetaData, 2);
+ // Make sure the Block has been set, yes I know setBlock has a true/false return value, but guess what, it is
+ // not reliable in 0.0001% of cases! -Greg
+ if (aWorld.getBlock(aX, aY, aZ) != aMTEContainer.mBlock) {
+ aWorld.setBlock(aX, aY, aZ, Blocks.air, 0, 0);
+ return false;
+ }
+ // TileEntity should not refresh yet! -Greg
+ ((IMultiTileEntity) aMTEContainer.mTileEntity).setShouldRefresh(false);
+ // Fake-Set the TileEntity first, bypassing a lot of checks. -Greg
+ setTileEntity(aWorld, aX, aY, aZ, aMTEContainer.mTileEntity, false);
+ // Now set the Block with the REAL MetaData. -Greg
+ setTileEntity(aWorld, aX, aY, aZ, aMTEContainer.mBlock, aMTEContainer.mBlockMetaData, 0, false);
+ // When the TileEntity is set now it SHOULD refresh! -Greg
+ ((IMultiTileEntity) aMTEContainer.mTileEntity).setShouldRefresh(true);
+ // But make sure again that the Block we have set was actually set properly, because 0.0001%! -Greg
+ if (aWorld.getBlock(aX, aY, aZ) != aMTEContainer.mBlock) {
+ aWorld.setBlock(aX, aY, aZ, Blocks.air, 0, 0);
+ return false;
+ }
+ // And finally properly set the TileEntity for real! -Greg
+ setTileEntity(aWorld, aX, aY, aZ, aMTEContainer.mTileEntity, aCauseBlockUpdates);
+ // Yep, all this just to set one Block and its TileEntity properly... -Greg
+
+ try {
+ if (aMTEContainer.mTileEntity instanceof IMTE_HasMultiBlockMachineRelevantData) {
+ if (((IMTE_HasMultiBlockMachineRelevantData) aMTEContainer.mTileEntity)
+ .hasMultiBlockMachineRelevantData()) GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("causeMachineUpdate", e);
+ }
+
+ try {
+ if (!aWorld.isRemote && aCauseBlockUpdates) {
+ aWorld.notifyBlockChange(aX, aY, aZ, tReplacedBlock);
+ aWorld.func_147453_f(aX, aY, aZ, aMTEContainer.mBlock);
+ }
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("aCauseBlockUpdates", e);
+ }
+
+ try {
+ ((IMultiTileEntity) aMTEContainer.mTileEntity).onTileEntityPlaced();
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("onTileEntityPlaced", e);
+ }
+
+ try {
+ aWorld.func_147451_t /* updateAllLightTypes */(aX, aY, aZ);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("updateAllLightTypes", e);
+ }
+ return true;
+ }
+
+ public MultiTileEntityRegistry getRegistry() {
+ return mMultiTileEntityRegistry;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java
new file mode 100644
index 0000000000..4ce4c3c886
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java
@@ -0,0 +1,205 @@
+package gregtech.api.multitileentity;
+
+import static gregtech.api.enums.GT_Values.NBT;
+
+import java.lang.ref.WeakReference;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.Tuple;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.multitileentity.base.MultiTileEntity;
+import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+import gregtech.api.util.GT_Util;
+import gregtech.common.tileentities.casings.upgrade.Inventory;
+import gregtech.common.tileentities.casings.upgrade.Tank;
+
+public class MultiTileEntityClassContainer {
+
+ private final WeakReference<MultiTileEntityRegistry> mRegistry;
+ private String mLocalized;
+ private String mCategoryName;
+
+ public final short mID;
+ public Class<? extends MultiTileEntity> mClass;
+ public MultiTileEntityBlock mBlock;
+ public MultiTileEntity mCanonicalTileEntity;
+ public NBTTagCompound mParameters;
+
+ // These have defaults
+ public byte mBlockMetaData = 1;
+ public byte mStackSize = 64;
+ public boolean mHidden = false;
+
+ public MultiTileEntityClassContainer(MultiTileEntityRegistry aRegistry, int aID,
+ Class<? extends MultiTileEntity> aClass) {
+ /* Start the Builder */
+ mRegistry = new WeakReference<>(aRegistry);
+ mID = (short) aID;
+ mClass = aClass;
+ mParameters = new NBTTagCompound();
+ }
+
+ public boolean register() {
+ /* End and register the Builder with the registry */
+ final MultiTileEntityRegistry registry = mRegistry.get();
+
+ if (mParameters.hasKey(NBT.MATERIAL) && !mParameters.hasKey(NBT.COLOR)) mParameters.setInteger(
+ NBT.COLOR,
+ GT_Util.getRGBInt(
+ Materials.get(mParameters.getString(NBT.MATERIAL))
+ .getRGBA()));
+
+ try {
+ mCanonicalTileEntity = mClass.newInstance();
+ } catch (Throwable e) {
+ throw new IllegalArgumentException(e);
+ }
+ mCanonicalTileEntity.initFromNBT(mParameters, mID, (short) -1);
+
+ return registry != null && registry.add(this.mLocalized, this.mCategoryName, this) != null;
+ }
+
+ public MultiTileEntityClassContainer name(String aName) {
+ mLocalized = aName;
+ return this;
+ }
+
+ public MultiTileEntityClassContainer category(String aCategoryName) {
+ mCategoryName = aCategoryName;
+ return this;
+ }
+
+ public MultiTileEntityClassContainer meta(int aMeta) {
+ mBlockMetaData = (byte) aMeta;
+ return this;
+ }
+
+ public MultiTileEntityClassContainer stackSize(int aStackSize) {
+ mStackSize = (byte) aStackSize;
+ return this;
+ }
+
+ public MultiTileEntityClassContainer hide() {
+ mHidden = true;
+ return this;
+ }
+
+ public MultiTileEntityClassContainer setBlock(MultiTileEntityBlock aBlock) {
+ mBlock = aBlock;
+ return this;
+ }
+
+ /* These methods are builder methods for commonly used NBT tags */
+
+ // Need a base texture for the MTE machine, and then a separate texture set for the machine/active overlays
+
+ public MultiTileEntityClassContainer material(Materials material) {
+ // Sets the material, and the color from the material, if not already set
+ mParameters.setString(NBT.MATERIAL, material.toString());
+ if (!mParameters.hasKey(NBT.COLOR)) mParameters.setInteger(NBT.COLOR, GT_Util.getRGBInt(material.getRGBA()));
+ return this;
+ }
+
+ public MultiTileEntityClassContainer color(int rbg) {
+ mParameters.setInteger(NBT.COLOR, rbg);
+ return this;
+ }
+
+ public MultiTileEntityClassContainer color(short[] rgba) {
+ mParameters.setInteger(NBT.COLOR, GT_Util.getRGBInt(rgba));
+ return this;
+ }
+
+ public MultiTileEntityClassContainer textureFolder(String texture) {
+ mParameters.setString(NBT.TEXTURE_FOLDER, texture);
+ return this;
+ }
+
+ public MultiTileEntityClassContainer inputInventorySize(int aSize) {
+ mParameters.setInteger(NBT.INV_INPUT_SIZE, aSize);
+ return this;
+ }
+
+ public MultiTileEntityClassContainer outputInventorySize(int aSize) {
+ mParameters.setInteger(NBT.INV_OUTPUT_SIZE, aSize);
+ return this;
+ }
+
+ public MultiTileEntityClassContainer tankCapacity(Long aCapacity) {
+ mParameters.setLong(NBT.TANK_CAPACITY, aCapacity);
+ return this;
+ }
+
+ public MultiTileEntityClassContainer tier(int aTier) {
+ verifyDescendentOfMultiple(true, UpgradeCasing.class, FunctionalCasing.class);
+ mParameters.setInteger(NBT.TIER, aTier);
+ return this;
+ }
+
+ public MultiTileEntityClassContainer upgradeInventorySize(int aSize) {
+ verifyDescendentOf(Inventory.class);
+
+ mParameters.setInteger(NBT.UPGRADE_INVENTORY_SIZE, aSize);
+ return this;
+ }
+
+ public MultiTileEntityClassContainer upgradeTankCount(int count) {
+ verifyDescendentOf(Tank.class);
+
+ mParameters.setInteger(NBT.UPGRADE_TANK_COUNT, count);
+ return this;
+ }
+
+ public MultiTileEntityClassContainer upgradeTankCapacity(Long aCapacity) {
+ mParameters.setLong(NBT.UPGRADE_TANK_CAPACITY, aCapacity);
+ return this;
+ }
+
+ public MultiTileEntityClassContainer upgradeAmperage(long amperage) {
+ mParameters.setLong(NBT.UPGRADE_AMPERAGE, amperage);
+ return this;
+ }
+
+ @SuppressWarnings("unused")
+ public MultiTileEntityClassContainer setNBT(String key, Object val) {
+ return setNBT(new Tuple(key, val));
+ }
+
+ public MultiTileEntityClassContainer setNBT(Tuple... aTags) {
+ /*
+ * Merge in arbitrary NBT tuples of (key, value). Useful for anything for which a custom method has not yet been
+ * exposed
+ */
+ mParameters = GT_Util.fuseNBT(mParameters, GT_Util.makeNBT(aTags));
+ return this;
+ }
+
+ private void verifyDescendentOf(Class<?> cls) {
+ // Check if cls is extended by mClass
+ if (!cls.isAssignableFrom(mClass)) {
+ throw new IllegalArgumentException(
+ "Expected a descendent of " + cls.getName() + " got " + mClass.getName() + " instead.");
+ }
+ }
+
+ private void verifyDescendentOfMultiple(boolean onlyOne, Class<?>... classes) {
+ boolean atLeastOne = false;
+ String classNames = "";
+ for (Class<?> cls : classes) {
+ classNames += cls.getName() + " ";
+ if (!onlyOne) {
+ verifyDescendentOf(cls);
+ atLeastOne = true;
+ } else if (cls.isAssignableFrom(mClass)) {
+ atLeastOne = true;
+ }
+ }
+
+ if (!atLeastOne) {
+ throw new IllegalArgumentException(
+ "Expected a descendent of any of these " + classNames + " got " + mClass.getName() + " instead.");
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityContainer.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityContainer.java
new file mode 100644
index 0000000000..3510140c12
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityContainer.java
@@ -0,0 +1,30 @@
+package gregtech.api.multitileentity;
+
+import static gregtech.api.util.GT_Util.setTileEntity;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+
+public class MultiTileEntityContainer {
+
+ public final TileEntity mTileEntity;
+ public final MultiTileEntityBlock mBlock;
+ public final byte mBlockMetaData;
+
+ public MultiTileEntityContainer(TileEntity aTileEntity, MultiTileEntityBlock aBlock, byte aBlockMetaData) {
+ mBlockMetaData = aBlockMetaData;
+ mTileEntity = aTileEntity;
+ mBlock = aBlock;
+ }
+
+ public void setMultiTile(World aWorld, int aX, int aY, int aZ) {
+ // This is some complicated Bullshit Greg had to do to make his MTEs work right.
+ ((IMultiTileEntity) mTileEntity).setShouldRefresh(false);
+ setTileEntity(aWorld, aX, aY, aZ, mTileEntity, false);
+ setTileEntity(aWorld, aX, aY, aZ, mBlock, mBlockMetaData, 0, false);
+ ((IMultiTileEntity) mTileEntity).setShouldRefresh(true);
+ setTileEntity(aWorld, aX, aY, aZ, mTileEntity, true);
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityItemInternal.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityItemInternal.java
new file mode 100644
index 0000000000..cc10485f84
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityItemInternal.java
@@ -0,0 +1,354 @@
+package gregtech.api.multitileentity;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.enums.GT_Values.SIDE_TOP;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockSnow;
+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.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.metatileentity.CoverableTileEntity;
+import gregtech.api.multitileentity.interfaces.IItemUpdatable;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_AddToolTips;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_CanPlace;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_GetMaxStackSize;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_HasMultiBlockMachineRelevantData;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_IgnoreEntityCollisionWhenPlacing;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_OnlyPlaceableWhenSneaking;
+
+public class MultiTileEntityItemInternal extends ItemBlock implements IFluidContainerItem, IItemUpdatable {
+
+ public final MultiTileEntityBlockInternal mBlock;
+
+ public MultiTileEntityItemInternal(Block aBlock) {
+ super(aBlock);
+ setMaxDamage(0);
+ setHasSubtypes(true);
+ mBlock = (MultiTileEntityBlockInternal) aBlock;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
+ .getCachedTileEntityContainer(aStack);
+ if (tTileEntityContainer == null) {
+ aList.add("INVALID ITEM!");
+ return;
+ }
+ if (tTileEntityContainer.mTileEntity instanceof IMTE_AddToolTips mte) {
+ try {
+ mte.addToolTips(aList, aStack, aF3_H);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("addInformation", e);
+ }
+ }
+ final NBTTagCompound aNBT = aStack.getTagCompound();
+ CoverableTileEntity.addInstalledCoversInformation(aNBT, aList);
+ // TODO: Add anything else relevant
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ @SuppressWarnings("unchecked")
+ public void getSubItems(Item aItem, CreativeTabs aTab, List<ItemStack> aList) {
+ for (MultiTileEntityClassContainer tClass : mBlock.mMultiTileEntityRegistry.mRegistrations) {
+ if (!tClass.mHidden && ((IMultiTileEntity) tClass.mCanonicalTileEntity)
+ .getSubItems(mBlock, aItem, aTab, aList, tClass.mID)) {
+ aList.add(mBlock.mMultiTileEntityRegistry.getItem(tClass.mID));
+ }
+ }
+ }
+
+ @Override
+ public boolean onItemUse(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ int ordinalSide, float aHitX, float aHitY, float aHitZ) {
+
+ if (aY < 0 || aY > aWorld.getHeight()) return false;
+
+ if (aPlayer == null) return false;
+
+ try {
+ ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ final Block tClickedBlock = aWorld.getBlock(aX, aY, aZ);
+
+ if (tClickedBlock instanceof BlockSnow && (aWorld.getBlockMetadata(aX, aY, aZ) & 7) < 1) {
+ ordinalSide = SIDE_TOP;
+ side = ForgeDirection.UP;
+ } else if (tClickedBlock != Blocks.vine && tClickedBlock != Blocks.tallgrass
+ && tClickedBlock != Blocks.deadbush
+ && !tClickedBlock.isReplaceable(aWorld, aX, aY, aZ)) {
+ aX += side.offsetX;
+ aY += side.offsetY;
+ aZ += side.offsetZ;
+ }
+ final Block tReplacedBlock = aWorld.getBlock(aX, aY, aZ);
+
+ if (!tReplacedBlock.isReplaceable(aWorld, aX, aY, aZ)
+ || !mBlock.canReplace(aWorld, aX, aY, aZ, ordinalSide, aStack)) {
+ return false;
+ }
+
+ if (aStack.stackSize == 0 || (!aPlayer.canPlayerEdit(aX, aY, aZ, ordinalSide, aStack))) {
+ return false;
+ }
+
+ final MultiTileEntityContainer aMTEContainer = mBlock.mMultiTileEntityRegistry
+ .getNewTileEntityContainer(aWorld, aX, aY, aZ, aStack);
+
+ if (aMTEContainer == null) return false;
+
+ if (!aPlayer.isSneaking() && aMTEContainer.mTileEntity instanceof IMTE_OnlyPlaceableWhenSneaking mteSNeaking
+ && mteSNeaking.onlyPlaceableWhenSneaking()) {
+ return false;
+ }
+
+ if ((!(aMTEContainer.mTileEntity instanceof IMTE_IgnoreEntityCollisionWhenPlacing mteIgnoreCollision)
+ || !mteIgnoreCollision
+ .ignoreEntityCollisionWhenPlacing(aStack, aPlayer, aWorld, aX, aY, aZ, side, aHitX, aHitY, aHitZ))
+ && !aWorld.checkNoEntityCollision(AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1))) {
+ return false;
+ }
+
+ if (aMTEContainer.mTileEntity instanceof IMTE_CanPlace mteCanPlace
+ && !mteCanPlace.canPlace(aStack, aPlayer, aWorld, aX, aY, aZ, side, aHitX, aHitY, aHitZ)) {
+ return false;
+ }
+
+ if (!aWorld.setBlock(aX, aY, aZ, aMTEContainer.mBlock, 15 - aMTEContainer.mBlockMetaData, 2)) {
+ return false;
+ }
+
+ aMTEContainer.setMultiTile(aWorld, aX, aY, aZ);
+
+ try {
+ if (((IMultiTileEntity) aMTEContainer.mTileEntity)
+ .onPlaced(aStack, aPlayer, aWorld, aX, aY, aZ, side, aHitX, aHitY, aHitZ)) {
+ aWorld.playSoundEffect(
+ aX + 0.5,
+ aY + 0.5,
+ aZ + 0.5,
+ aMTEContainer.mBlock.stepSound.func_150496_b(),
+ (aMTEContainer.mBlock.stepSound.getVolume() + 1) / 2,
+ aMTEContainer.mBlock.stepSound.getPitch() * 0.8F);
+ }
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("onPlaced", e);
+ }
+ try {
+ if (aMTEContainer.mTileEntity instanceof IMTE_HasMultiBlockMachineRelevantData mteData
+ && (mteData.hasMultiBlockMachineRelevantData())) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("causeMachineUpdate", e);
+ }
+ try {
+ if (!aWorld.isRemote) {
+ aWorld.notifyBlockChange(aX, aY, aZ, tReplacedBlock);
+ aWorld.func_147453_f /* updateNeighborsAboutBlockChange */(aX, aY, aZ, aMTEContainer.mBlock);
+ }
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("notifyBlockChange", e);
+ }
+ try {
+ ((IMultiTileEntity) aMTEContainer.mTileEntity).onTileEntityPlaced();
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("onTileEntityPlaced", e);
+ }
+ try {
+ aWorld.func_147451_t /* updateAllLightTypes */(aX, aY, aZ);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("updateAllLightTypes", e);
+ }
+
+ aStack.stackSize--;
+ return true;
+
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("onItemUse", e);
+ }
+ return false;
+ }
+
+ @Override
+ public void updateItemStack(ItemStack aStack) {
+ final MultiTileEntityClassContainer tContainer = mBlock.mMultiTileEntityRegistry.getClassContainer(aStack);
+ if (tContainer == null) return;
+ final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
+ .getCachedTileEntityContainer(aStack);
+ if (tTileEntityContainer != null && tTileEntityContainer.mTileEntity instanceof IItemUpdatable itemUpdatable) {
+ itemUpdatable.updateItemStack(aStack);
+ }
+ }
+
+ @Override
+ public void updateItemStack(ItemStack aStack, World aWorld, int aX, int aY, int aZ) {
+ final MultiTileEntityClassContainer tContainer = mBlock.mMultiTileEntityRegistry.getClassContainer(aStack);
+ if (tContainer == null) return;
+ final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
+ .getCachedTileEntityContainer(aStack);
+ if (tTileEntityContainer != null && tTileEntityContainer.mTileEntity instanceof IItemUpdatable itemUpdatable) {
+ itemUpdatable.updateItemStack(aStack, aWorld, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack aStack) {
+ final MultiTileEntityClassContainer tContainer = mBlock.mMultiTileEntityRegistry.getClassContainer(aStack);
+ if (tContainer == null) return 1;
+ final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
+ .getCachedTileEntityContainer(aStack);
+ if (tTileEntityContainer != null
+ && tTileEntityContainer.mTileEntity instanceof IMTE_GetMaxStackSize maxStackSize) {
+ return maxStackSize.getMaxStackSize(aStack, tContainer.mStackSize);
+ }
+ return tContainer.mStackSize;
+ }
+
+ @Override
+ public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ updateItemStack(aStack);
+ }
+
+ @Override
+ public FluidStack getFluid(ItemStack aStack) {
+ final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
+ .getCachedTileEntityContainer(aStack);
+ if (tTileEntityContainer != null
+ && tTileEntityContainer.mTileEntity instanceof IFluidContainerItem fluidContainerItem) {
+ final FluidStack rFluid = fluidContainerItem.getFluid(aStack);
+ updateItemStack(aStack);
+ return rFluid;
+ }
+ return null;
+ }
+
+ @Override
+ public int getCapacity(ItemStack aStack) {
+ final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
+ .getCachedTileEntityContainer(aStack);
+ if (tTileEntityContainer != null
+ && tTileEntityContainer.mTileEntity instanceof IFluidContainerItem fluidContainerItem) {
+ final int rCapacity = fluidContainerItem.getCapacity(aStack);
+ updateItemStack(aStack);
+ return rCapacity;
+ }
+ return 0;
+ }
+
+ @Override
+ public int fill(ItemStack aStack, FluidStack aFluid, boolean aDoFill) {
+ final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
+ .getCachedTileEntityContainer(aStack);
+ if (tTileEntityContainer != null
+ && tTileEntityContainer.mTileEntity instanceof IFluidContainerItem fluidContainerItem) {
+ final int tFilled = fluidContainerItem.fill(aStack, aFluid, aDoFill);
+ updateItemStack(aStack);
+ return tFilled;
+ }
+ return 0;
+ }
+
+ @Override
+ public FluidStack drain(ItemStack aStack, int aMaxDrain, boolean aDoDrain) {
+ final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
+ .getCachedTileEntityContainer(aStack);
+ if (tTileEntityContainer != null
+ && tTileEntityContainer.mTileEntity instanceof IFluidContainerItem fluidContainerItem) {
+ final FluidStack rFluid = fluidContainerItem.drain(aStack, aMaxDrain, aDoDrain);
+ updateItemStack(aStack);
+ return rFluid;
+ }
+ return null;
+ }
+
+ @Override
+ public boolean func_150936_a /* canPlaceAtSide */(World aWorld, int aX, int aY, int aZ, int ordinalSide,
+ EntityPlayer aPlayer, ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public final String getUnlocalizedName() {
+ return mBlock.mMultiTileEntityRegistry.mNameInternal;
+ }
+
+ @Override
+ public final String getUnlocalizedName(ItemStack aStack) {
+ return mBlock.mMultiTileEntityRegistry.mNameInternal + "." + getDamage(aStack);
+ }
+
+ @Override
+ public int getSpriteNumber() {
+ return 0;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aRegister) {
+ /* Empty */
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIconFromDamage(int aMeta) {
+ itemIcon = Items.bread.getIconFromDamage(0);
+ return itemIcon; /* Fixes Eating Animation Particles. */
+ }
+
+ @Override
+ public boolean doesContainerItemLeaveCraftingGrid(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public final boolean getShareTag() {
+ return true; // just to be sure
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) {
+ return false;
+ }
+
+ @Override
+ public ItemStack getContainerItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public final boolean hasContainerItem(ItemStack aStack) {
+ return getContainerItem(aStack) != null;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java
new file mode 100644
index 0000000000..3392d1ab41
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java
@@ -0,0 +1,290 @@
+package gregtech.api.multitileentity;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import com.gtnewhorizon.gtnhlib.util.map.ItemStackMap;
+
+import appeng.core.CreativeTab;
+import cpw.mods.fml.common.Loader;
+import cpw.mods.fml.common.LoaderState;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.multitileentity.base.MultiTileEntity;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Util;
+import gregtech.api.util.GT_Utility;
+
+public class MultiTileEntityRegistry {
+
+ private static final HashMap<String, MultiTileEntityRegistry> NAMED_REGISTRIES = new HashMap<>();
+
+ // TODO: NBT sensitive or not? Starting with not for now
+ private static final ItemStackMap<MultiTileEntityRegistry> REGISTRIES = new ItemStackMap<>(false);
+ private static final HashSet<Class<?>> sRegisteredTileEntities = new HashSet<>();
+ private final HashMap<Integer, MultiTileEntityContainer> cachedTileEntityContainers = new HashMap<>();
+
+ public HashMap<Short, CreativeTab> mCreativeTabs = new HashMap<>();
+ public Map<Short, MultiTileEntityClassContainer> mRegistry = new HashMap<>();
+ public List<MultiTileEntityClassContainer> mRegistrations = new ArrayList<>();
+
+ public final String mNameInternal;
+ public final MultiTileEntityBlockInternal mBlock;
+
+ private static MultiTileEntityBlockInternal regblock(String aNameInternal, MultiTileEntityBlockInternal aBlock,
+ Class<? extends ItemBlock> aItemClass) {
+ GameRegistry.registerBlock(aBlock, aItemClass == null ? ItemBlock.class : aItemClass, aNameInternal);
+ return aBlock;
+ }
+
+ /**
+ * @param aNameInternal the internal Name of the Item
+ */
+ public MultiTileEntityRegistry(String aNameInternal) {
+ this(aNameInternal, new MultiTileEntityBlockInternal(), MultiTileEntityItemInternal.class);
+ }
+
+ /**
+ * @param aNameInternal the internal Name of the Item
+ */
+ public MultiTileEntityRegistry(String aNameInternal, MultiTileEntityBlockInternal aBlock,
+ Class<? extends ItemBlock> aItemClass) {
+ this(aNameInternal, regblock(aNameInternal, aBlock, aItemClass));
+ }
+
+ /**
+ * @param aNameInternal the internal Name of the Item
+ */
+ public MultiTileEntityRegistry(String aNameInternal, MultiTileEntityBlockInternal aBlock) {
+ if (!Loader.instance()
+ .isInState(LoaderState.PREINITIALIZATION)) {
+ throw new IllegalStateException(
+ "The MultiTileEntity Registry must be initialized during Preload Phase and not before");
+ }
+ mNameInternal = aNameInternal;
+ mBlock = aBlock;
+ GT_FML_LOGGER.info(aNameInternal + " " + Block.getIdFromBlock(aBlock) + "This is the answer");
+ mBlock.mMultiTileEntityRegistry = this;
+ REGISTRIES.put(new ItemStack(Item.getItemById(Block.getIdFromBlock(aBlock)), 1, GT_Values.W), this);
+ NAMED_REGISTRIES.put(mNameInternal, this);
+ }
+
+ public static TileEntity getCanonicalTileEntity(int aRegistryID, int aMultiTileEntityID) {
+ final MultiTileEntityRegistry tRegistry = getRegistry(aRegistryID);
+ if (tRegistry == null) return null;
+ final MultiTileEntityClassContainer tClassContainer = tRegistry.getClassContainer(aMultiTileEntityID);
+ if (tClassContainer == null) return null;
+ return tClassContainer.mCanonicalTileEntity;
+ }
+
+ public static MultiTileEntityRegistry getRegistry(int aRegistryID) {
+ return REGISTRIES.get(new ItemStack(Item.getItemById(aRegistryID), 1, GT_Values.W));
+ }
+
+ public static MultiTileEntityRegistry getRegistry(String aRegistryName) {
+ return NAMED_REGISTRIES.get(aRegistryName);
+ }
+
+ public MultiTileEntityClassContainer create(int aID, Class<? extends MultiTileEntity> aClass) {
+ return new MultiTileEntityClassContainer(this, aID, aClass);
+ }
+
+ /**
+ * Adds a new MultiTileEntity. It is highly recommended to do this in either the PreInit or the Init Phase. PostInit
+ * might not work well.
+ */
+ public ItemStack add(String aLocalised, String aCategoricalName, MultiTileEntityClassContainer aClassContainer) {
+ boolean tFailed = false;
+ if (GT_Utility.isStringInvalid(aLocalised)) {
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Localisation Missing!");
+ tFailed = true;
+ }
+ if (aClassContainer == null) {
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container is null!");
+ tFailed = true;
+ } else {
+ if (aClassContainer.mClass == null) {
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class inside Class Container is null!");
+ tFailed = true;
+ }
+ if (aClassContainer.mID == GT_Values.W) {
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container uses Wildcard MetaData!");
+ tFailed = true;
+ }
+ if (aClassContainer.mID < 0) {
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container uses negative MetaData!");
+ tFailed = true;
+ }
+ if (mRegistry.containsKey(aClassContainer.mID)) {
+ GT_FML_LOGGER.error(
+ "MULTI-TILE REGISTRY ERROR: Class Container uses occupied MetaData! (" + aClassContainer.mID + ")");
+ tFailed = true;
+ }
+ }
+ if (tFailed) {
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: STACKTRACE START");
+ int i = 0;
+ for (StackTraceElement tElement : new Exception().getStackTrace()) if (i++ < 5 && !tElement.getClassName()
+ .startsWith("sun")) GT_FML_LOGGER.error("\tat " + tElement);
+ else break;
+ GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: STACKTRACE END");
+ return null;
+ }
+
+ GT_LanguageManager.addStringLocalization(mNameInternal + "." + aClassContainer.mID + ".name", aLocalised);
+ mRegistry.put(aClassContainer.mID, aClassContainer);
+ mLastRegisteredID = aClassContainer.mID;
+ mRegistrations.add(aClassContainer);
+
+ if (sRegisteredTileEntities.add(aClassContainer.mCanonicalTileEntity.getClass())) {
+ aClassContainer.mCanonicalTileEntity.onRegistrationFirst(this, aClassContainer.mID);
+ }
+ // // TODO: Recipe
+ // if (aRecipe != null && aRecipe.length > 1) {
+ // if (aRecipe[0] instanceof Object[]) aRecipe = (Object[])aRecipe[0];
+ // if (aRecipe.length > 2) CR.shaped(getItem(aClassContainer.mID), CR.DEF_REV_NCC, aRecipe);
+ // }
+ // // A simple special case to make it easier to add a Machine to Recipe Lists without having to worry
+ // about anything.
+ // String tRecipeMapName = aClassContainer.mParameters.getString(NBT_RECIPEMAP);
+ // if (GT_Utility.isStringValid(tRecipeMapName)) {RecipeMap tMap =
+ // RecipeMap.RECIPE_MAPS.get(tRecipeMapName); if (tMap != null)
+ // tMap.mRecipeMachineList.add(getItem(aClassContainer.mID));}
+ // tRecipeMapName = aClassContainer.mParameters.getString(NBT_FUELMAP);
+ // if (GT_Utility.isStringValid(tRecipeMapName)) {RecipeMap tMap =
+ // RecipeMap.RECIPE_MAPS.get(tRecipeMapName); if (tMap != null)
+ // tMap.mRecipeMachineList.add(getItem(aClassContainer.mID));}
+ //
+ return getItem(aClassContainer.mID);
+ }
+
+ public short mLastRegisteredID = GT_Values.W;
+
+ public ItemStack getItem() {
+ return getItem(mLastRegisteredID, 1, null);
+ }
+
+ public ItemStack getItem(int aID) {
+ return getItem(aID, 1, null);
+ }
+
+ public ItemStack getItem(int aID, NBTTagCompound aNBT) {
+ return getItem(aID, 1, aNBT);
+ }
+
+ public ItemStack getItem(int aID, long aAmount) {
+ return getItem(aID, aAmount, null);
+ }
+
+ public ItemStack getItem(int aID, long aAmount, NBTTagCompound aNBT) {
+ final ItemStack rStack = new ItemStack(mBlock, (int) aAmount, aID);
+ if (aNBT == null || aNBT.hasNoTags()) {
+ aNBT = new NBTTagCompound();
+ final MultiTileEntityContainer tTileEntityContainer = getNewTileEntityContainer(aID, aNBT);
+ if (tTileEntityContainer != null) ((IMultiTileEntity) tTileEntityContainer.mTileEntity).writeItemNBT(aNBT);
+ }
+ rStack.setTagCompound(aNBT);
+ return rStack;
+ }
+
+ public String getLocal(int aID) {
+ return StatCollector.translateToLocal(mNameInternal + "." + aID + ".name");
+ }
+
+ public MultiTileEntityClassContainer getClassContainer(int aID) {
+ return mRegistry.get((short) aID);
+ }
+
+ public MultiTileEntityClassContainer getClassContainer(ItemStack aStack) {
+ return mRegistry.get((short) Items.feather.getDamage(aStack));
+ }
+
+ public TileEntity getNewTileEntity(int aID) {
+ final MultiTileEntityContainer tContainer = getNewTileEntityContainer(null, 0, 0, 0, aID, null);
+ return tContainer == null ? null : tContainer.mTileEntity;
+ }
+
+ public MultiTileEntityContainer getNewTileEntityContainer(World aWorld, int aX, int aY, int aZ, int aID,
+ NBTTagCompound aNBT) {
+ final MultiTileEntityClassContainer tClass = mRegistry.get((short) aID);
+ if (tClass == null || tClass.mBlock == null) return null;
+ final MultiTileEntityContainer rContainer = new MultiTileEntityContainer(
+ (TileEntity) GT_Utility.callConstructor(tClass.mClass, -1, null, true),
+ tClass.mBlock,
+ tClass.mBlockMetaData);
+ if (rContainer.mTileEntity == null) return null;
+ rContainer.mTileEntity.setWorldObj(aWorld);
+ rContainer.mTileEntity.xCoord = aX;
+ rContainer.mTileEntity.yCoord = aY;
+ rContainer.mTileEntity.zCoord = aZ;
+ ((IMultiTileEntity) rContainer.mTileEntity).initFromNBT(
+ aNBT == null || aNBT.hasNoTags() ? tClass.mParameters : GT_Util.fuseNBT(aNBT, tClass.mParameters),
+ (short) aID,
+ (short) Block.getIdFromBlock(mBlock));
+ return rContainer;
+ }
+
+ public TileEntity getNewTileEntity(World aWorld, int aX, int aY, int aZ, int aID) {
+ final MultiTileEntityContainer tContainer = getNewTileEntityContainer(aWorld, aX, aY, aZ, aID, null);
+ return tContainer == null ? null : tContainer.mTileEntity;
+ }
+
+ public TileEntity getNewTileEntity(ItemStack aStack) {
+ final MultiTileEntityContainer tContainer = getNewTileEntityContainer(
+ null,
+ 0,
+ 0,
+ 0,
+ Items.feather.getDamage(aStack),
+ aStack.getTagCompound());
+ return tContainer == null ? null : tContainer.mTileEntity;
+ }
+
+ public TileEntity getNewTileEntity(World aWorld, int aX, int aY, int aZ, ItemStack aStack) {
+ final MultiTileEntityContainer tContainer = getNewTileEntityContainer(
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ Items.feather.getDamage(aStack),
+ aStack.getTagCompound());
+ return tContainer == null ? null : tContainer.mTileEntity;
+ }
+
+ public MultiTileEntityContainer getCachedTileEntityContainer(ItemStack stack) {
+ MultiTileEntityContainer container = cachedTileEntityContainers.get(Items.feather.getDamage(stack));
+ if (container == null) {
+ container = getNewTileEntityContainer(stack);
+ cachedTileEntityContainers.put(Items.feather.getDamage(stack), container);
+ }
+ return container;
+ }
+
+ public MultiTileEntityContainer getNewTileEntityContainer(ItemStack aStack) {
+ return getNewTileEntityContainer(null, 0, 0, 0, Items.feather.getDamage(aStack), aStack.getTagCompound());
+ }
+
+ public MultiTileEntityContainer getNewTileEntityContainer(World aWorld, int aX, int aY, int aZ, ItemStack aStack) {
+ return getNewTileEntityContainer(aWorld, aX, aY, aZ, Items.feather.getDamage(aStack), aStack.getTagCompound());
+ }
+
+ public MultiTileEntityContainer getNewTileEntityContainer(int aID, NBTTagCompound aNBT) {
+ return getNewTileEntityContainer(null, 0, 0, 0, aID, aNBT);
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java
new file mode 100644
index 0000000000..7c56d40296
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java
@@ -0,0 +1,1381 @@
+package gregtech.api.multitileentity.base;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.enums.GT_Values.VALID_SIDES;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.Packet;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.Explosion;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GT_Values.NBT;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Mods;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.Textures.BlockIcons.CustomIcon;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.metatileentity.CoverableTileEntity;
+import gregtech.api.metatileentity.GregTechTileClientEvents;
+import gregtech.api.multitileentity.MultiTileEntityBlockInternal;
+import gregtech.api.multitileentity.MultiTileEntityClassContainer;
+import gregtech.api.multitileentity.MultiTileEntityRegistry;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+import gregtech.api.multitileentity.interfaces.SyncedMultiTileEntity;
+import gregtech.api.net.GT_Packet_MultiTileEntity;
+import gregtech.api.net.GT_Packet_New;
+import gregtech.api.net.data.CommonData;
+import gregtech.api.net.data.CoordinateData;
+import gregtech.api.net.data.MultiTileEntityData;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.XSTR;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Util;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.render.MultiTileBasicRender;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public abstract class MultiTileEntity extends CoverableTileEntity
+ implements IMultiTileEntity.IMTE_BreakBlock, MultiTileBasicRender, SyncedMultiTileEntity {
+
+ private ITexture baseTexture = null;
+ private ITexture topOverlayTexture = null;
+ private ITexture bottomOverlayTexture = null;
+ private ITexture leftOverlayTexture = null;
+ private ITexture rightOverlayTexture = null;
+ private ITexture backOverlayTexture = null;
+ private ITexture frontOverlayTexture = null;
+
+ // A Bounding Box without having to constantly specify the Offset Coordinates.
+ protected static final float[] PX_BOX = { 0, 0, 0, 1, 1, 1 };
+
+ public Materials material = Materials._NULL;
+ protected final boolean isTicking; // If this TileEntity is ticking at all
+
+ // Checks if this TileEntity should refresh when the Block is being set.
+ // This way you can toggle this check at any time.
+ protected boolean shouldRefresh = true;
+
+ protected boolean needsBlockUpdate = false; // This Variable is for a buffered Block Update.
+ protected boolean forceFullSelectionBox = false; // This Variable is for forcing the Selection Box to be full.
+ protected boolean needsUpdate = false;
+ protected boolean hasInventoryChanged = false;
+ protected boolean isPainted = false;
+ @Nonnull
+ protected ForgeDirection facing = ForgeDirection.WEST; // Default to WEST, so it renders facing Left in the
+ // inventory
+ protected byte color;
+ protected int rgba = GT_Values.UNCOLORED;
+ private short mteID = GT_Values.W, mteRegistry = GT_Values.W;
+ private String customName = null;
+ private String ownerName = "";
+ private UUID ownerUUID = GT_Utility.defaultUuid;
+ private boolean lockUpgrade = false;
+
+ private final GT_Packet_MultiTileEntity fullPacket = new GT_Packet_MultiTileEntity(false);
+ private final GT_Packet_MultiTileEntity timedPacket = new GT_Packet_MultiTileEntity(false);
+ private final GT_Packet_MultiTileEntity graphicPacket = new GT_Packet_MultiTileEntity(false);
+
+ public MultiTileEntity(boolean isTicking) {
+ this.isTicking = isTicking;
+ }
+
+ @Override
+ public short getMultiTileEntityID() {
+ return mteID;
+ }
+
+ @Override
+ public short getMultiTileEntityRegistryID() {
+ return mteRegistry;
+ }
+
+ @Override
+ public void onRegistrationFirst(MultiTileEntityRegistry registry, short id) {
+ GameRegistry.registerTileEntity(getClass(), getTileEntityName());
+ }
+
+ @Override
+ public void initFromNBT(NBTTagCompound nbt, short mteID, short mteRegistry) {
+ if (this.mteID == mteID && this.mteRegistry == mteRegistry) {
+ return;
+ }
+ // Set ID and Registry ID.
+ this.mteID = mteID;
+ this.mteRegistry = mteRegistry;
+ // Read the Default Parameters from NBT.
+ if (nbt != null) readFromNBT(nbt);
+ }
+
+ @Override
+ public void loadTextures(String folder) {
+ // Loading the registry
+ for (SidedTextureNames textureName : SidedTextureNames.TEXTURES) {
+ ITexture texture;
+ try {
+ Minecraft.getMinecraft()
+ .getResourceManager()
+ .getResource(
+ new ResourceLocation(
+ Mods.GregTech.ID,
+ "textures/blocks/multitileentity/" + folder + "/" + textureName.getName() + ".png"));
+ texture = TextureFactory.of(new CustomIcon("multitileentity/" + folder + "/" + textureName.getName()));
+ } catch (IOException ignored) {
+ texture = TextureFactory.of(Textures.BlockIcons.VOID);
+ }
+ switch (textureName) {
+ case Top -> topOverlayTexture = texture;
+ case Bottom -> bottomOverlayTexture = texture;
+ case Back -> backOverlayTexture = texture;
+ case Front -> frontOverlayTexture = texture;
+ case Left -> leftOverlayTexture = texture;
+ case Right -> rightOverlayTexture = texture;
+ case Base -> baseTexture = texture;
+ }
+ }
+ }
+
+ @Override
+ public void copyTextures() {
+ // Loading an instance
+ final TileEntity tCanonicalTileEntity = MultiTileEntityRegistry
+ .getCanonicalTileEntity(getMultiTileEntityRegistryID(), getMultiTileEntityID());
+ if (!(tCanonicalTileEntity instanceof MultiTileEntity)) {
+ return;
+ }
+ final MultiTileEntity canonicalEntity = (MultiTileEntity) tCanonicalTileEntity;
+ baseTexture = canonicalEntity.baseTexture;
+ topOverlayTexture = canonicalEntity.topOverlayTexture;
+ bottomOverlayTexture = canonicalEntity.bottomOverlayTexture;
+ leftOverlayTexture = canonicalEntity.leftOverlayTexture;
+ rightOverlayTexture = canonicalEntity.rightOverlayTexture;
+ backOverlayTexture = canonicalEntity.backOverlayTexture;
+ frontOverlayTexture = canonicalEntity.frontOverlayTexture;
+ }
+
+ @Override
+ public ITexture getTexture(ForgeDirection side) {
+ if (facing == side) {
+ return TextureFactory.of(baseTexture, frontOverlayTexture);
+ }
+
+ if (facing.getOpposite() == side) {
+ return TextureFactory.of(baseTexture, backOverlayTexture);
+ }
+
+ if (side == ForgeDirection.UP) {
+ return TextureFactory.of(baseTexture, topOverlayTexture);
+ }
+
+ if (side == ForgeDirection.DOWN) {
+ return TextureFactory.of(baseTexture, bottomOverlayTexture);
+ }
+
+ if (facing.getRotation(ForgeDirection.DOWN) == side) {
+ return TextureFactory.of(baseTexture, rightOverlayTexture);
+ } else {
+ return TextureFactory.of(baseTexture, leftOverlayTexture);
+ }
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound nbt) {
+ // Check if it is a World/Chunk-Loading Process calling readFromNBT
+ if (mteID == GT_Values.W || mteRegistry == GT_Values.W) {
+ // Read the ID Tags first
+ mteID = nbt.getShort(NBT.MTE_ID);
+ mteRegistry = nbt.getShort(NBT.MTE_REG);
+ // Add additional Default Parameters in case the Mod updated with new ones
+ final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(mteRegistry);
+ if (tRegistry != null) {
+ final MultiTileEntityClassContainer tClass = tRegistry.getClassContainer(mteID);
+ if (tClass != null) {
+ // Add the Default Parameters. Useful for things that differ between different tiers/types of the
+ // same machine
+ nbt = GT_Util.fuseNBT(nbt, tClass.mParameters);
+ }
+ }
+ }
+ // read the Coords if it has them.
+ if (nbt.hasKey("x")) xCoord = nbt.getInteger("x");
+ if (nbt.hasKey("y")) yCoord = nbt.getInteger("y");
+ if (nbt.hasKey("z")) zCoord = nbt.getInteger("z");
+ // read the custom Name.
+ if (nbt.hasKey(NBT.DISPLAY)) customName = nbt.getCompoundTag(NBT.DISPLAY)
+ .getString(NBT.CUSTOM_NAME);
+
+ // And now everything else.
+ try {
+ if (nbt.hasKey(NBT.MATERIAL)) material = Materials.get(nbt.getString(NBT.MATERIAL));
+ if (nbt.hasKey(NBT.COLOR)) rgba = nbt.getInteger(NBT.COLOR);
+
+ ownerName = nbt.getString(NBT.OWNER);
+ try {
+ ownerUUID = UUID.fromString(nbt.getString(NBT.OWNER_UUID));
+ } catch (IllegalArgumentException e) {
+ ownerUUID = null;
+ }
+ if (nbt.hasKey(NBT.LOCK_UPGRADE)) lockUpgrade = nbt.getBoolean(NBT.LOCK_UPGRADE);
+ if (nbt.hasKey(NBT.FACING)) facing = ForgeDirection.getOrientation(nbt.getInteger(NBT.FACING));
+
+ readCoverNBT(nbt);
+ readTasksNBT(nbt);
+ readMultiTileNBT(nbt);
+
+ if (NetworkUtils.isDedicatedClient()) {
+ if (GregTech_API.sBlockIcons == null && nbt.hasKey(NBT.TEXTURE_FOLDER)) {
+ loadTextures(nbt.getString(NBT.TEXTURE_FOLDER));
+ } else {
+ copyTextures();
+ }
+ }
+
+ if (mSidedRedstone.length != 6) mSidedRedstone = new byte[] { 15, 15, 15, 15, 15, 15 };
+
+ updateCoverBehavior();
+
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("readFromNBT", e);
+ }
+ }
+
+ public void readMultiTileNBT(NBTTagCompound aNBT) {
+ /* Do Nothing */
+ }
+
+ protected void readTasksNBT(NBTTagCompound nbt) {}
+
+ @Override
+ public final void writeToNBT(NBTTagCompound aNBT) {
+ super.writeToNBT(aNBT);
+ // write the IDs
+ aNBT.setShort(NBT.MTE_ID, mteID);
+ aNBT.setShort(NBT.MTE_REG, mteRegistry);
+ // write the Custom Name
+ if (GT_Utility.isStringValid(customName)) {
+ final NBTTagCompound displayNBT;
+ if (aNBT.hasKey(NBT.DISPLAY)) {
+ displayNBT = aNBT.getCompoundTag(NBT.DISPLAY);
+ } else {
+ displayNBT = new NBTTagCompound();
+ aNBT.setTag(NBT.DISPLAY, displayNBT);
+ }
+ displayNBT.setString(NBT.CUSTOM_NAME, customName);
+ }
+
+ // write the rest
+ try {
+ aNBT.setString(NBT.OWNER, ownerName);
+ aNBT.setString(NBT.OWNER_UUID, ownerUUID == null ? "" : ownerUUID.toString());
+ aNBT.setBoolean(NBT.LOCK_UPGRADE, lockUpgrade);
+ aNBT.setInteger(NBT.FACING, facing.ordinal());
+
+ writeCoverNBT(aNBT, false);
+ writeTasksNBT(aNBT);
+ writeMultiTileNBT(aNBT);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("writeToNBT", e);
+ }
+ }
+
+ public void writeMultiTileNBT(NBTTagCompound aNBT) {
+ /* Do Nothing */
+ }
+
+ protected void writeTasksNBT(NBTTagCompound aNBT) {}
+
+ @Override
+ public NBTTagCompound writeItemNBT(NBTTagCompound aNBT) {
+ writeCoverNBT(aNBT, true);
+ if (shouldSaveNBTToItemStack()) {
+ writeTasksNBT(aNBT);
+ writeMultiTileNBT(aNBT);
+ }
+ return aNBT;
+ }
+
+ protected boolean shouldSaveNBTToItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return false;
+ }
+
+ @Override
+ public long getTimer() {
+ return 0;
+ }
+
+ @Override
+ public int getRandomNumber(int aRange) {
+ return XSTR.XSTR_INSTANCE.nextInt(aRange);
+ }
+
+ @Override
+ public TileEntity getTileEntity(int aX, int aY, int aZ) {
+ if (worldObj == null
+ || (ignoreUnloadedChunks && crossedChunkBorder(aX, aZ) && !worldObj.blockExists(aX, aY, aZ))) return null;
+ return GT_Util.getTileEntity(worldObj, aX, aY, aZ, true);
+ }
+
+ @Override
+ public boolean canUpdate() {
+ return isTicking && shouldRefresh;
+ }
+
+ @Override
+ public boolean shouldRefresh(Block aOldBlock, Block aNewBlock, int aOldMeta, int aNewMeta, World aWorld, int aX,
+ int aY, int aZ) {
+ return shouldRefresh || aOldBlock != aNewBlock;
+ }
+
+ @Override
+ public void updateEntity() {
+ super.updateEntity();
+ if (needsBlockUpdate) doBlockUpdate();
+ }
+
+ public void doBlockUpdate() {
+ final Block tBlock = getBlock(getCoords());
+ worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, tBlock);
+ if (this instanceof IMTE_IsProvidingStrongPower) {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (getBlockAtSide(side)
+ .isNormalCube(worldObj, xCoord + side.offsetX, yCoord + side.offsetY, zCoord + side.offsetZ)) {
+ worldObj.notifyBlocksOfNeighborChange(
+ xCoord + side.offsetX,
+ yCoord + side.offsetY,
+ zCoord + side.offsetZ,
+ tBlock,
+ side.getOpposite()
+ .ordinal());
+ }
+ }
+ }
+ needsBlockUpdate = false;
+ }
+
+ @Override
+ public boolean shouldSideBeRendered(ForgeDirection side) {
+ final TileEntity tTileEntity = getTileEntityAtSideAndDistance(side, 1);
+ // TODO: check to an interface
+ // if (getBlockAtSide(aSide) == Blocks.glass) return false;
+ return tTileEntity instanceof IMultiTileEntity mte ? !mte.isSurfaceOpaque(side.getOpposite())
+ : !getBlockAtSide(side).isOpaqueCube();
+ }
+
+ @Override
+ public boolean isSurfaceOpaque(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public void setCustomName(String aName) {
+ customName = aName;
+ }
+
+ @Override
+ public String getCustomName() {
+ return GT_Utility.isStringValid(customName) ? customName : null;
+ }
+
+ @Override
+ public byte getColorization() {
+ // TODO
+ return 0;
+ }
+
+ @Override
+ public boolean unpaint() {
+ return false;
+ }
+
+ @Override
+ public byte setColorization(byte aColor) {
+ // TODO
+ return 0;
+ }
+
+ @Override
+ public boolean isPainted() {
+ return false;
+ }
+
+ @Override
+ public boolean paint(int aRGB) {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return false;
+ }
+
+ @Override
+ public ForgeDirection getFrontFacing() {
+ return facing;
+ }
+
+ /**
+ * Sets the main facing to {aSide} and update as appropriately
+ *
+ * @return Whether the facing was changed
+ */
+ @Override
+ public boolean setMainFacing(ForgeDirection side) {
+ if (!isValidFacing(side)) return false;
+ facing = side;
+
+ issueClientUpdate();
+ issueBlockUpdate();
+ onFacingChange();
+ checkDropCover();
+ doEnetUpdate();
+
+ if (shouldTriggerBlockUpdate()) {
+ // If we're triggering a block update this will call onMachineBlockUpdate()
+ GregTech_API.causeMachineUpdate(worldObj, xCoord, yCoord, zCoord);
+ } else {
+ // If we're not trigger a cascading one, call the update here.
+ onMachineBlockUpdate();
+ }
+ return true;
+ }
+
+ @Override
+ public int getPaint() {
+ return this.rgba;
+ }
+
+ @Override
+ public ForgeDirection getBackFacing() {
+ return facing.getOpposite();
+ }
+
+ @Override
+ public boolean isValidFacing(ForgeDirection side) {
+ return side != ForgeDirection.UNKNOWN && getValidFacings()[side.ordinal()];
+ }
+
+ @Override
+ public boolean[] getValidFacings() {
+ return VALID_SIDES;
+ }
+
+ @Override
+ public void issueCoverUpdate(ForgeDirection side) {
+ super.issueCoverUpdate(side);
+ issueClientUpdate();
+ }
+
+ public AxisAlignedBB box(double[] aBox) {
+ return AxisAlignedBB.getBoundingBox(
+ xCoord + aBox[0],
+ yCoord + aBox[1],
+ zCoord + aBox[2],
+ xCoord + aBox[3],
+ yCoord + aBox[4],
+ zCoord + aBox[5]);
+ }
+
+ public boolean box(AxisAlignedBB aAABB, List<AxisAlignedBB> aList, double aMinX, double aMinY, double aMinZ,
+ double aMaxX, double aMaxY, double aMaxZ) {
+ final AxisAlignedBB tBox = box(aMinX, aMinY, aMinZ, aMaxX, aMaxY, aMaxZ);
+ return tBox.intersectsWith(aAABB) && aList.add(tBox);
+ }
+
+ @Override
+ public void onFacingChange() {
+ /* Do nothing */
+ }
+
+ public AxisAlignedBB box(double aMinX, double aMinY, double aMinZ, double aMaxX, double aMaxY, double aMaxZ) {
+ return AxisAlignedBB.getBoundingBox(
+ xCoord + aMinX,
+ yCoord + aMinY,
+ zCoord + aMinZ,
+ xCoord + aMaxX,
+ yCoord + aMaxY,
+ zCoord + aMaxZ);
+ }
+
+ @Override
+ public boolean shouldTriggerBlockUpdate() {
+ return false;
+ }
+
+ public boolean box(AxisAlignedBB aAABB, List<AxisAlignedBB> aList, double[] aBox) {
+ final AxisAlignedBB tBox = box(aBox[0], aBox[1], aBox[2], aBox[3], aBox[4], aBox[5]);
+ return tBox.intersectsWith(aAABB) && aList.add(tBox);
+ }
+
+ @Override
+ public void onMachineBlockUpdate() {
+ /* Do nothing */
+ }
+
+ public boolean box(AxisAlignedBB aAABB, List<AxisAlignedBB> aList, float[] aBox) {
+ final AxisAlignedBB tBox = box(aBox[0], aBox[1], aBox[2], aBox[3], aBox[4], aBox[5]);
+ return tBox.intersectsWith(aAABB) && aList.add(tBox);
+ }
+
+ public boolean box(AxisAlignedBB aAABB, List<AxisAlignedBB> aList) {
+ final AxisAlignedBB tBox = box(PX_BOX);
+ return tBox.intersectsWith(aAABB) && aList.add(tBox);
+ }
+
+ public AxisAlignedBB box(float[] aBox) {
+ return AxisAlignedBB.getBoundingBox(
+ xCoord + aBox[0],
+ yCoord + aBox[1],
+ zCoord + aBox[2],
+ xCoord + aBox[3],
+ yCoord + aBox[4],
+ zCoord + aBox[5]);
+ }
+
+ public boolean box(Block aBlock) {
+ aBlock.setBlockBounds(0, 0, 0, 1, 1, 1);
+ return true;
+ }
+
+ /**
+ * Causes a general Texture update.
+ * <p/>
+ * Only used Client Side to mark Blocks dirty.
+ */
+ @Override
+ public void issueTextureUpdate() {
+ if (!isTicking) {
+ markBlockForUpdate();
+ } else {
+ needsUpdate = true;
+ }
+ }
+
+ public boolean box(Block aBlock, double[] aBox) {
+ aBlock.setBlockBounds(
+ (float) aBox[0],
+ (float) aBox[1],
+ (float) aBox[2],
+ (float) aBox[3],
+ (float) aBox[4],
+ (float) aBox[5]);
+ return true;
+ }
+
+ protected void markBlockForUpdate() {
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ // worldObj.func_147479_m(xCoord, yCoord, zCoord);
+ needsUpdate = false;
+ }
+
+ public boolean box(Block aBlock, float[] aBox) {
+ aBlock.setBlockBounds(aBox[0], aBox[1], aBox[2], aBox[3], aBox[4], aBox[5]);
+ return true;
+ }
+
+ @Override
+ public void onTileEntityPlaced() {
+ /* empty */
+ }
+
+ public boolean box(Block aBlock, double aMinX, double aMinY, double aMinZ, double aMaxX, double aMaxY,
+ double aMaxZ) {
+ aBlock.setBlockBounds((float) aMinX, (float) aMinY, (float) aMinZ, (float) aMaxX, (float) aMaxY, (float) aMaxZ);
+ return true;
+ }
+
+ @Override
+ public void setShouldRefresh(boolean aShouldRefresh) {
+ shouldRefresh = aShouldRefresh;
+ }
+
+ /**
+ * shouldJoinIc2Enet - defaults to false, override to change
+ */
+ @Override
+ public boolean shouldJoinIc2Enet() {
+ return false;
+ }
+
+ @Override
+ public final void addCollisionBoxesToList(AxisAlignedBB aAABB, List<AxisAlignedBB> aList, Entity aEntity) {
+ box(getCollisionBoundingBoxFromPool(), aAABB, aList);
+ }
+
+ /**
+ * Simple Function to prevent Block Updates from happening multiple times within the same Tick.
+ */
+ @Override
+ public final void issueBlockUpdate() {
+ if (isTicking) needsBlockUpdate = true;
+ else doBlockUpdate();
+ }
+
+ @Override
+ public boolean isStillValid() {
+ return !isInvalid();
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) {
+ return true;
+ }
+
+ public AxisAlignedBB box() {
+ return AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 1, zCoord + 1);
+ }
+
+ public boolean box(AxisAlignedBB aBox, AxisAlignedBB aAABB, List<AxisAlignedBB> aList) {
+ return aBox != null && aBox.intersectsWith(aAABB) && aList.add(aBox);
+ }
+
+ public float[] shrunkBox() {
+ return PX_BOX;
+ }
+
+ @Override
+ public void setBlockBoundsBasedOnState(Block aBlock) {
+ box(aBlock);
+ }
+
+ @Override
+ public AxisAlignedBB getCollisionBoundingBoxFromPool() {
+ return box();
+ }
+
+ @Override
+ public AxisAlignedBB getSelectedBoundingBoxFromPool() {
+ if (forceFullSelectionBox) return box();
+ return box(shrunkBox());
+ }
+
+ @Override
+ public ItemStack getPickBlock(MovingObjectPosition aTarget) {
+ final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(mteRegistry);
+ return tRegistry == null ? null : tRegistry.getItem(mteID, writeItemNBT(new NBTTagCompound()));
+ }
+
+ @Override
+ public void onBlockAdded() {}
+
+ @Override
+ public String getOwnerName() {
+ if (GT_Utility.isStringInvalid(ownerName)) return "Player";
+ return ownerName;
+ }
+
+ @Override
+ public String setOwnerName(String aName) {
+ if (GT_Utility.isStringInvalid(aName)) return ownerName = "Player";
+ return ownerName = aName;
+ }
+
+ @Override
+ public UUID getOwnerUuid() {
+ return ownerUUID;
+ }
+
+ @Override
+ public void setOwnerUuid(UUID uuid) {
+ ownerUUID = uuid;
+ }
+
+ @Override
+ public boolean onPlaced(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ ForgeDirection side, float aHitX, float aHitY, float aHitZ) {
+ facing = getSideForPlayerPlacing(aPlayer, facing, getValidFacings());
+ setOwnerUuid(aPlayer.getUniqueID());
+ setOwnerName(aPlayer.getDisplayName());
+ onFacingChange();
+ return true;
+ }
+
+ @Override
+ public boolean allowInteraction(Entity aEntity) {
+ return true;
+ }
+
+ public boolean allowRightclick(Entity aEntity) {
+ return allowInteraction(aEntity);
+ }
+
+ @Override
+ public boolean onBlockActivated(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ) {
+ try {
+ return allowRightclick(aPlayer) && onRightClick(aPlayer, side, aX, aY, aZ);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("onBlockActivated Failed", e);
+ e.printStackTrace(GT_Log.err);
+ return true;
+ }
+ }
+
+ @Override
+ public boolean onRightClick(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ) {
+ if (isClientSide()) {
+ // Configure Cover, sneak can also be: screwdriver, wrench, side cutter, soldering iron
+ if (aPlayer.isSneaking()) {
+ final ForgeDirection tSide = (getCoverIDAtSide(side) == 0)
+ ? GT_Utility.determineWrenchingSide(side, aX, aY, aZ)
+ : side;
+ return (getCoverBehaviorAtSideNew(tSide).hasCoverGUI());
+ } else if (getCoverBehaviorAtSideNew(side).onCoverRightclickClient(side, this, aPlayer, aX, aY, aZ)) {
+ return true;
+ }
+
+ if (!getCoverInfoAtSide(side).isGUIClickable()) return false;
+ } else { // server side
+ if (!privateAccess() || aPlayer.getDisplayName()
+ .equalsIgnoreCase(getOwnerName())) {
+ final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
+ final ForgeDirection wrenchSide = GT_Utility.determineWrenchingSide(side, aX, aY, aZ);
+
+ if (tCurrentItem != null) {
+ if (getColorization() >= 0
+ && GT_Utility.areStacksEqual(new ItemStack(Items.water_bucket, 1), tCurrentItem)) {
+ // TODO (Colorization)
+ }
+
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList))
+ return onWrenchRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ, tCurrentItem);
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sScrewdriverList))
+ return onScrewdriverRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ, tCurrentItem);
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sHardHammerList))
+ return onHammerRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ, tCurrentItem);
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSoftHammerList))
+ return onMalletRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ, tCurrentItem);
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList))
+ return onSolderingRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ, tCurrentItem);
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList))
+ return onWireCutterRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ, tCurrentItem);
+
+ final ForgeDirection coverSide = getCoverIDAtSide(side) == 0 ? wrenchSide : side;
+
+ if (getCoverIDAtSide(coverSide) == 0) {
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCovers.keySet())) {
+ if (GregTech_API.getCoverBehaviorNew(tCurrentItem)
+ .isCoverPlaceable(coverSide, tCurrentItem, this)
+ && allowCoverOnSide(coverSide, new GT_ItemStack(tCurrentItem))) {
+ setCoverItemAtSide(coverSide, tCurrentItem);
+ if (!aPlayer.capabilities.isCreativeMode) tCurrentItem.stackSize--;
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.IC2_TOOLS_WRENCH,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ issueClientUpdate();
+ }
+ sendCoverDataIfNeeded();
+ return true;
+ }
+ } else {
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCrowbarList)) {
+ if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) {
+ GT_Utility.sendSoundToPlayers(
+ worldObj,
+ SoundResource.RANDOM_BREAK,
+ 1.0F,
+ -1,
+ xCoord,
+ yCoord,
+ zCoord);
+ dropCover(coverSide, side, false);
+ }
+ sendCoverDataIfNeeded();
+ return true;
+ }
+ }
+ } else if (aPlayer.isSneaking()) { // Sneak click, no tool -> open cover config if possible.
+ side = (getCoverIDAtSide(side) == 0) ? GT_Utility.determineWrenchingSide(side, aX, aY, aZ) : side;
+ return getCoverIDAtSide(side) > 0 && getCoverBehaviorAtSideNew(side).onCoverShiftRightClick(
+ side,
+ getCoverIDAtSide(side),
+ getComplexCoverDataAtSide(side),
+ this,
+ aPlayer);
+ }
+
+ if (getCoverBehaviorAtSideNew(side).onCoverRightClick(
+ side,
+ getCoverIDAtSide(side),
+ getComplexCoverDataAtSide(side),
+ this,
+ aPlayer,
+ aX,
+ aY,
+ aZ)) return true;
+
+ if (!getCoverInfoAtSide(side).isGUIClickable()) return false;
+
+ if (aPlayer.getHeldItem() != null && aPlayer.getHeldItem()
+ .getItem() instanceof ItemBlock) {
+ return false;
+ }
+
+ return openModularUi(aPlayer, side);
+ }
+ }
+ return false;
+ }
+
+ public boolean hasGui(ForgeDirection side) {
+ return false;
+ }
+
+ boolean openModularUi(EntityPlayer aPlayer, ForgeDirection side) {
+ if (!hasGui(side) || !isServerSide()) {
+ System.out.println("No GUI or Not Serverside");
+ return false;
+ }
+
+ GT_UIInfos.openGTTileEntityUI(this, aPlayer);
+ System.out.println("Trying to open a UI");
+ return true;
+ }
+
+ public boolean onWrenchRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide, float aX,
+ float aY, float aZ, ItemStack aTool) {
+ if (setMainFacing(wrenchSide)) {
+ GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer);
+ GT_Utility.sendSoundToPlayers(worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1, xCoord, yCoord, zCoord);
+ }
+ return onWrenchRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ);
+ }
+
+ public boolean onScrewdriverRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide,
+ float aX, float aY, float aZ, ItemStack aTool) {
+ if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 200, aPlayer)) {
+ setCoverDataAtSide(
+ wrenchSide,
+ getCoverBehaviorAtSideNew(wrenchSide).onCoverScrewdriverClick(
+ wrenchSide,
+ getCoverIDAtSide(wrenchSide),
+ getComplexCoverDataAtSide(wrenchSide),
+ this,
+ aPlayer,
+ aX,
+ aY,
+ aZ));
+ // TODO: Update connections!
+ GT_Utility.sendSoundToPlayers(worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1, xCoord, yCoord, zCoord);
+ }
+ return onScrewdriverRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ);
+ }
+
+ public boolean onHammerRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide, float aX,
+ float aY, float aZ, ItemStack aTool) {
+
+ return onHammerRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ);
+ }
+
+ public boolean onMalletRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide, float aX,
+ float aY, float aZ, ItemStack aTool) {
+
+ return onMalletRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ);
+ }
+
+ public boolean onSolderingRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide,
+ float aX, float aY, float aZ, ItemStack aTool) {
+
+ return onSolderingRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ);
+ }
+
+ public boolean onWireCutterRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide,
+ float aX, float aY, float aZ, ItemStack aTool) {
+
+ return onWireCutterRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ);
+ }
+
+ @Deprecated
+ public boolean onHammerRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide, float aX,
+ float aY, float aZ) {
+ return true;
+ }
+
+ @Deprecated
+ public boolean onSolderingRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide,
+ float aX, float aY, float aZ) {
+ return true;
+ }
+
+ @Deprecated
+ public boolean onMalletRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide, float aX,
+ float aY, float aZ) {
+ return true;
+ }
+
+ @Deprecated
+ public boolean onWireCutterRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide,
+ float aX, float aY, float aZ) {
+ return true;
+ }
+
+ @Deprecated
+ public boolean onWrenchRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide, float aX,
+ float aY, float aZ) {
+ return true;
+ }
+
+ @Deprecated
+ public boolean onScrewdriverRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide,
+ float aX, float aY, float aZ) {
+ return true;
+ }
+
+ @Override
+ public float getExplosionResistance(Entity aExploder, double aExplosionX, double aExplosionY, double aExplosionZ) {
+ return getExplosionResistance();
+ }
+
+ @Override
+ public float getExplosionResistance() {
+ return 10.0F;
+ }
+
+ @Override
+ public void onExploded(Explosion aExplosion) {}
+
+ @Override
+ public boolean isSideSolid(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(int aFortune, boolean aSilkTouch) {
+ final ArrayList<ItemStack> rList = new ArrayList<>();
+ final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(getMultiTileEntityRegistryID());
+ if (tRegistry != null) rList.add(tRegistry.getItem(getMultiTileEntityID(), writeItemNBT(new NBTTagCompound())));
+ return rList;
+ }
+
+ @Override
+ public boolean breakBlock() {
+ isDead = true;
+ onBaseTEDestroyed();
+ return false;
+ }
+
+ @Override
+ public boolean getSubItems(MultiTileEntityBlockInternal aBlock, Item aItem, CreativeTabs aTab,
+ List<ItemStack> aList, short aID) {
+ return true;
+ }
+
+ @Override
+ public boolean recolourBlock(ForgeDirection side, byte aColor) {
+ // if (aColor > 15 || aColor < -1) aColor = -1;
+ // if(paint((byte) (aColor + 1))) {
+ //// updateClientData();
+ //// causeBlockUpdate();
+ // return true;
+ // }
+ // if (unpaint()) {updateClientData(); causeBlockUpdate(); return T;}
+ // mColor = (byte) (aColor + 1);
+ //// if (canAccessData()) mMetaTileEntity.onColorChangeServer(aColor);
+ return false;
+ }
+
+ @Override
+ public boolean playerOwnsThis(EntityPlayer aPlayer, boolean aCheckPrecicely) {
+ if (aCheckPrecicely || privateAccess() || (ownerName.length() == 0))
+ if ((ownerName.length() == 0) && isServerSide()) {
+ setOwnerName(aPlayer.getDisplayName());
+ setOwnerUuid(aPlayer.getUniqueID());
+ } else return !privateAccess() || aPlayer.getDisplayName()
+ .equals("Player") || ownerName.equals("Player") || ownerName.equals(aPlayer.getDisplayName());
+ return true;
+ }
+
+ @Override
+ public boolean privateAccess() {
+ return lockUpgrade;
+ }
+
+ /**
+ * @return a Packet containing all Data which has to be synchronised to the Client - Override as needed
+ */
+ public GT_Packet_MultiTileEntity getClientDataPacket() {
+
+ final GT_Packet_MultiTileEntity packet = new GT_Packet_MultiTileEntity(false);
+ return packet;
+ }
+
+ @Override
+ public void sendClientData(EntityPlayerMP aPlayer) {
+ if (worldObj == null || worldObj.isRemote) return;
+ final GT_Packet_New tPacket = getClientDataPacket();
+ if (aPlayer == null) {
+ GT_Values.NW.sendPacketToAllPlayersInRange(worldObj, tPacket, getXCoord(), getZCoord());
+ } else {
+ GT_Values.NW.sendToPlayer(tPacket, aPlayer);
+ }
+ sendCoverDataIfNeeded();
+ }
+
+ @Override
+ public boolean receiveClientData(int aEventID, int aValue) {
+ super.receiveClientEvent(aEventID, aValue);
+ if (isClientSide()) {
+ issueTextureUpdate();
+ switch (aEventID) {
+ case GregTechTileClientEvents.CHANGE_COMMON_DATA:
+ facing = ForgeDirection.getOrientation(aValue & 7);
+ // mActive = ((aValue & 8) != 0);
+ mRedstone = ((aValue & 16) != 0);
+ // mLockUpgrade = ((aValue&32) != 0);
+ // mWorks = ((aValue & 64) != 0);
+ break;
+ case GregTechTileClientEvents.CHANGE_CUSTOM_DATA:
+ // Nothing here, currently
+ break;
+ case GregTechTileClientEvents.CHANGE_COLOR:
+ if (aValue > 16 || aValue < 0) aValue = 0;
+ color = (byte) aValue;
+ break;
+ case GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT:
+ mSidedRedstone[0] = (byte) ((aValue & 1) == 1 ? 15 : 0);
+ mSidedRedstone[1] = (byte) ((aValue & 2) == 2 ? 15 : 0);
+ mSidedRedstone[2] = (byte) ((aValue & 4) == 4 ? 15 : 0);
+ mSidedRedstone[3] = (byte) ((aValue & 8) == 8 ? 15 : 0);
+ mSidedRedstone[4] = (byte) ((aValue & 16) == 16 ? 15 : 0);
+ mSidedRedstone[5] = (byte) ((aValue & 32) == 32 ? 15 : 0);
+ break;
+ // case GregTechTileClientEvents.DO_SOUND:
+ // if (mTickTimer > 20)
+ // doSound((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5);
+ // break;
+ // case GregTechTileClientEvents.START_SOUND_LOOP:
+ // if (mTickTimer > 20)
+ // startSoundLoop((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5);
+ // break;
+ // case GregTechTileClientEvents.STOP_SOUND_LOOP:
+ // if (mTickTimer > 20)
+ // stopSoundLoop((byte) aValue, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5);
+ // break;
+ // case GregTechTileClientEvents.CHANGE_LIGHT:
+ // mLightValue = (byte) aValue;
+ // break;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ issueClientUpdate();
+ return null;
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ currentTip.add(String.format("Facing: %s", getFrontFacing().name()));
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ }
+
+ @Override
+ public ArrayList<String> getDebugInfo(EntityPlayer aPlayer, int aLogLevel) {
+ final ArrayList<String> tList = new ArrayList<>();
+ if (aLogLevel > 2) {
+ tList.add(
+ "MultiTileRegistry-ID: " + EnumChatFormatting.BLUE
+ + mteRegistry
+ + EnumChatFormatting.RESET
+ + " MultiTile-ID: "
+ + EnumChatFormatting.BLUE
+ + mteID
+ + EnumChatFormatting.RESET);
+ }
+
+ addDebugInfo(aPlayer, aLogLevel, tList);
+
+ return tList;
+ }
+
+ protected void addDebugInfo(EntityPlayer aPlayer, int aLogLevel, ArrayList<String> tList) {
+ /* Do nothing */
+ }
+
+ /**
+ * Energy - Do nothing by Default
+ */
+ @Override
+ public boolean isUniversalEnergyStored(long aEnergyAmount) {
+ return false;
+ }
+
+ @Override
+ public long getUniversalEnergyStored() {
+ return 0;
+ }
+
+ @Override
+ public long getUniversalEnergyCapacity() {
+ return 0;
+ }
+
+ @Override
+ public long getOutputAmperage() {
+ return 0;
+ }
+
+ @Override
+ public long getOutputVoltage() {
+ return 0;
+ }
+
+ @Override
+ public long getInputAmperage() {
+ return 0;
+ }
+
+ @Override
+ public long getInputVoltage() {
+ return 0;
+ }
+
+ @Override
+ public boolean decreaseStoredEnergyUnits(long energy, boolean ignoreTooLittleEnergy) {
+ return false;
+ }
+
+ @Override
+ public boolean increaseStoredEnergyUnits(long energy, boolean ignoreTooMuchEnergy) {
+ return false;
+ }
+
+ @Override
+ public boolean drainEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage) {
+ return false;
+ }
+
+ @Override
+ public long getAverageElectricInput() {
+ return 0;
+ }
+
+ @Override
+ public long getAverageElectricOutput() {
+ return 0;
+ }
+
+ @Override
+ public long getStoredEU() {
+ return 0;
+ }
+
+ @Override
+ public long getEUCapacity() {
+ return 0;
+ }
+
+ @Override
+ public long injectEnergyUnits(ForgeDirection side, long aVoltage, long aAmperage) {
+ return 0;
+ }
+
+ @Override
+ public boolean inputEnergyFrom(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean outputsEnergyTo(ForgeDirection side) {
+ return false;
+ }
+
+ /**
+ * Inventory - Do nothing by default
+ */
+
+ @Override
+ public boolean hasInventoryBeenModified() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public boolean addStackToSlot(int aIndex, ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean addStackToSlot(int aIndex, ItemStack aStack, int aAmount) {
+ return false;
+ }
+
+ @Override
+ public void markInventoryBeenModified() {
+ hasInventoryChanged = true;
+ }
+
+ /*
+ * Cover Helpers
+ */
+
+ public boolean coverLetsFluidIn(ForgeDirection side, Fluid aFluid) {
+ return getCoverInfoAtSide(side).letsFluidIn(aFluid);
+ }
+
+ public boolean coverLetsFluidOut(ForgeDirection side, Fluid aFluid) {
+ return getCoverInfoAtSide(side).letsFluidOut(aFluid);
+ }
+
+ public boolean coverLetsEnergyIn(ForgeDirection side) {
+ return getCoverInfoAtSide(side).letsEnergyIn();
+ }
+
+ public boolean coverLetsEnergyOut(ForgeDirection side) {
+ return getCoverInfoAtSide(side).letsEnergyOut();
+ }
+
+ public boolean coverLetsItemsIn(ForgeDirection side, int aSlot) {
+ return getCoverInfoAtSide(side).letsItemsIn(aSlot);
+ }
+
+ public boolean coverLetsItemsOut(ForgeDirection side, int aSlot) {
+ return getCoverInfoAtSide(side).letsItemsOut(aSlot);
+ }
+
+ @Override
+ public ItemStack getStackForm(long aAmount) {
+ return new ItemStack(Item.getItemById(getMultiTileEntityRegistryID()), (int) aAmount, getMultiTileEntityID());
+ }
+
+ protected enum SidedTextureNames {
+
+ Base("base"),
+ Left("left"),
+ Right("right"),
+ Top("top"),
+ Bottom("bottom"),
+ Back("back"),
+ Front("front");
+
+ private final String name;
+ public static final SidedTextureNames[] TEXTURES = { Base, Left, Right, Top, Bottom, Back, Front };
+
+ SidedTextureNames(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+ }
+
+ protected enum StatusTextures {
+
+ Active("active", false),
+ ActiveWithGlow("active_glow", true),
+ Inactive("inactive", false),
+ InactiveWithGlow("inactive_glow", true);
+
+ private final String name;
+ private final boolean hasGlow;
+ public static final StatusTextures[] TEXTURES = { Active, ActiveWithGlow, Inactive, InactiveWithGlow };
+
+ StatusTextures(String name, boolean hasGlow) {
+ this.name = name;
+ this.hasGlow = hasGlow;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public boolean hasGlow() {
+ return hasGlow;
+ }
+ }
+
+ @Override
+ public void getFullPacketData(GT_Packet_MultiTileEntity packet) {
+ packet.addData(new CoordinateData(getCoords()));
+ packet.addData(new CommonData(mStrongRedstone, color, (byte) 0));
+ packet.addData(new MultiTileEntityData(mteRegistry, mteID));
+ }
+
+ @Override
+ public void getGraphicPacketData(GT_Packet_MultiTileEntity packet) {
+ packet.addData(new CoordinateData(getCoords()));
+ packet.addData(new MultiTileEntityData(mteRegistry, mteID));
+ }
+
+ @Override
+ public void getTimedPacketData(GT_Packet_MultiTileEntity packet) {
+ packet.addData(new CoordinateData(getCoords()));
+ packet.addData(new MultiTileEntityData(mteRegistry, mteID));
+ }
+
+ @Override
+ public void sendFullPacket(@Nonnull EntityPlayerMP player) {
+ fullPacket.clearData();
+ getFullPacketData(fullPacket);
+ GT_Values.NW.sendToPlayer(fullPacket, player);
+ }
+
+ @Override
+ public void sendGraphicPacket() {
+ graphicPacket.clearData();
+ getGraphicPacketData(graphicPacket);
+ GT_Values.NW.sendPacketToAllPlayersInRange(worldObj, graphicPacket, getXCoord(), getZCoord());
+ }
+
+ @Override
+ public void sendTimedPacket() {
+ timedPacket.clearData();
+ getTimedPacketData(timedPacket);
+ GT_Values.NW.sendPacketToAllPlayersInRange(worldObj, timedPacket, getXCoord(), getZCoord());
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/base/NonTickableMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/NonTickableMultiTileEntity.java
new file mode 100644
index 0000000000..2837a88180
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/base/NonTickableMultiTileEntity.java
@@ -0,0 +1,62 @@
+package gregtech.api.multitileentity.base;
+
+import static gregtech.api.enums.GT_Values.NW;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.network.Packet;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.net.GT_Packet_SendCoverData;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.covers.CoverInfo;
+
+public abstract class NonTickableMultiTileEntity extends MultiTileEntity {
+
+ boolean mConstructed = false; // Keeps track of whether this TE has been constructed and placed in the world
+
+ public NonTickableMultiTileEntity() {
+ super(false);
+ }
+
+ @Override
+ public void issueClientUpdate() {
+ if (worldObj != null && !worldObj.isRemote) {
+ sendClientData(null);
+ sendGraphicPacket();
+ }
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ // We should have a world object and have been constructed by this point
+ mConstructed = true;
+
+ super.getDescriptionPacket();
+ // We don't get ticked, so if we have any cover data that needs to be sent, send it now
+ sendCoverDataIfNeeded();
+ return null;
+ }
+
+ @Override
+ public void issueCoverUpdate(ForgeDirection side) {
+ if (!mConstructed) {
+ // Queue these up and send them with the description packet
+ super.issueCoverUpdate(side);
+ } else {
+ // Otherwise, send the data right away
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ NW.sendPacketToAllPlayersInRange(worldObj, new GT_Packet_SendCoverData(coverInfo, this), xCoord, zCoord);
+
+ // Just in case
+ coverInfo.setNeedsUpdate(false);
+ }
+ }
+
+ @Override
+ public void receiveCoverData(ForgeDirection coverSide, int aCoverID, ISerializableObject aCoverData,
+ EntityPlayerMP aPlayer) {
+ super.receiveCoverData(coverSide, aCoverID, aCoverData, aPlayer);
+ // We don't get ticked so issue the texture update right away
+ issueTextureUpdate();
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java
new file mode 100644
index 0000000000..b25504dc6a
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java
@@ -0,0 +1,173 @@
+package gregtech.api.multitileentity.base;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_OnNeighborBlockChange;
+import gregtech.api.task.TaskHost;
+import gregtech.api.task.TickableTask;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Util;
+
+public abstract class TickableMultiTileEntity extends MultiTileEntity implements TaskHost, IMTE_OnNeighborBlockChange {
+
+ /** Variable for seeing if the Tick Function is called right now. */
+ public boolean isRunningTick = false;
+ /** Gets set to true when the Block received a Block Update. */
+ public boolean blockUpdated = false;
+ /** Timer Value */
+ protected long timer = 0;
+ /** Variable for updating Data to the Client */
+ private boolean sendClientData = false;
+
+ private final Map<String, TickableTask<?>> tasks = new HashMap<>();
+
+ public TickableMultiTileEntity() {
+ super(true);
+ }
+
+ @Override
+ public final void registerTask(@Nonnull TickableTask<?> task) {
+ if (tasks.containsKey(task.getName())) {
+ throw new IllegalStateException(String.format("Task with name %s is already registered", task.getName()));
+ }
+ tasks.put(task.getName(), task);
+ }
+
+ @Nullable
+ public TickableTask<?> getTask(@Nonnull String name) {
+ return tasks.get(name);
+ }
+
+ @Override
+ public final void updateEntity() {
+ isRunningTick = true;
+ final boolean isServerSide = isServerSide();
+ try {
+ if (timer++ == 0) {
+ markDirty();
+ GT_Util.markChunkDirty(this);
+ onFirstTick(isServerSide);
+ }
+ if (isDead()) {
+ return;
+ }
+ onPreTick(timer, isServerSide);
+ super.updateEntity();
+ if (!isServerSide && needsUpdate) {
+ worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
+ needsUpdate = false;
+ }
+ onTick(timer, isServerSide);
+ for (TickableTask<?> task : tasks.values()) {
+ task.update(timer, isServerSide);
+ }
+ if (isServerSide && timer > 2 && sendClientData) {
+ sendClientData(null);
+ }
+ onPostTick(timer, isServerSide);
+
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("UpdateEntity Failed", e);
+ e.printStackTrace(GT_Log.err);
+ try {
+ onTickFailed(timer, isServerSide);
+ } catch (Throwable e2) {
+ GT_FML_LOGGER.error("UpdateEntity:onTickFailed Failed", e);
+ }
+ }
+
+ isRunningTick = false;
+ }
+
+ @Override
+ public void sendClientData(EntityPlayerMP aPlayer) {
+ if (sendClientData) {
+ // GT_FML_LOGGER.info("Sending client data");
+ super.sendClientData(aPlayer);
+ sendClientData = false;
+ }
+ }
+
+ /**
+ * The very first Tick happening to this TileEntity.
+ */
+ public void onFirstTick(boolean isServerSide) {
+ if (isServerSide) {
+ checkDropCover();
+ } else {
+ requestCoverDataIfNeeded();
+ }
+ }
+
+ /**
+ * The first part of the Tick, before block update.
+ */
+ public void onPreTick(long tick, boolean isServerSide) {}
+
+ /**
+ * The regular Tick. After block update, before sending data to client.
+ */
+ public void onTick(long tick, boolean isServerSide) {}
+
+ /**
+ * The absolute last part of the Tick, after sending data to client.
+ */
+ public void onPostTick(long tick, boolean isServerSide) {}
+
+ /**
+ * Gets called when there is an Exception/Error happening during one of the Tick methods.
+ */
+ public void onTickFailed(long tick, boolean isServerSide) {}
+
+ @Override
+ protected final void readTasksNBT(NBTTagCompound nbt) {
+ if (nbt.hasKey(GT_Values.NBT.TASKS)) {
+ NBTTagCompound tasksTag = nbt.getCompoundTag(GT_Values.NBT.TASKS);
+ for (TickableTask<?> task : tasks.values()) {
+ if (tasksTag.hasKey(task.getName())) {
+ task.readFromNBT(tasksTag.getCompoundTag(task.getName()));
+ }
+ }
+ }
+ }
+
+ @Override
+ protected final void writeTasksNBT(NBTTagCompound aNBT) {
+ NBTTagCompound tasksTag = new NBTTagCompound();
+ for (TickableTask<?> task : tasks.values()) {
+ NBTTagCompound tag = new NBTTagCompound();
+ task.writeToNBT(tag);
+ tasksTag.setTag(task.getName(), tag);
+ }
+ aNBT.setTag(GT_Values.NBT.TASKS, tasksTag);
+ }
+
+ @Override
+ public void onNeighborBlockChange(World aWorld, Block aBlock) {
+ blockUpdated = true;
+ }
+
+ @Override
+ public void issueClientUpdate() {
+ sendClientData = true;
+ sendGraphicPacket();
+ }
+
+ @Override
+ public byte getComparatorValue(ForgeDirection side) {
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java
new file mode 100644
index 0000000000..73bd55738a
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java
@@ -0,0 +1,43 @@
+package gregtech.api.multitileentity.enums;
+
+import static gregtech.api.util.GT_StructureUtilityMuTE.createMuTEStructureCasing;
+import static gregtech.loaders.preload.GT_Loader_MultiTileEntities.CASING_REGISTRY_NAME;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_StructureUtilityMuTE;
+
+public enum GT_MultiTileCasing {
+
+ CokeOven(0),
+ Chemical(1),
+ Distillation(2),
+ Macerator(18000),
+ LaserEngraver(4),
+ Mirror(5),
+ BlackLaserEngraverCasing(6),
+ LaserEngraverUpgrade1(7),
+ LaserEngraverUpgrade2(8),
+ LaserEngraverUpgrade3(9),
+ LaserEngraverUpgrade4(10),
+ NONE(GT_Values.W);
+
+ private final int meta;
+ private final GT_StructureUtilityMuTE.MuTEStructureCasing casing;
+
+ GT_MultiTileCasing(int meta) {
+ this.meta = meta;
+ casing = createMuTEStructureCasing(CASING_REGISTRY_NAME, meta);
+ }
+
+ public int getId() {
+ return meta;
+ }
+
+ public short getRegistryId() {
+ return (short) casing.getRegistryId();
+ }
+
+ public GT_StructureUtilityMuTE.MuTEStructureCasing getCasing() {
+ return casing;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileComponentCasing.java b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileComponentCasing.java
new file mode 100644
index 0000000000..e062ecc705
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileComponentCasing.java
@@ -0,0 +1,130 @@
+package gregtech.api.multitileentity.enums;
+
+import gregtech.api.enums.GT_Values;
+
+public enum GT_MultiTileComponentCasing {
+
+ LV_Motor(0),
+ MV_Motor(1),
+ HV_Motor(2),
+ EV_Motor(3),
+ IV_Motor(4),
+ LuV_Motor(5),
+ ZPM_Motor(6),
+ UV_Motor(7),
+ UHV_Motor(8),
+ UEV_Motor(9),
+ UIV_Motor(10),
+ UMV_Motor(11),
+ UXV_Motor(12),
+ MAX_Motor(13),
+ LV_Pump(14),
+ MV_Pump(15),
+ HV_Pump(16),
+ EV_Pump(17),
+ IV_Pump(18),
+ LuV_Pump(19),
+ ZPM_Pump(20),
+ UV_Pump(21),
+ UHV_Pump(22),
+ UEV_Pump(23),
+ UIV_Pump(24),
+ UMV_Pump(25),
+ UXV_Pump(26),
+ MAX_Pump(27),
+ LV_Conveyor(28),
+ MV_Conveyor(29),
+ HV_Conveyor(30),
+ EV_Conveyor(31),
+ IV_Conveyor(32),
+ LuV_Conveyor(33),
+ ZPM_Conveyor(34),
+ UV_Conveyor(35),
+ UHV_Conveyor(36),
+ UEV_Conveyor(37),
+ UIV_Conveyor(38),
+ UMV_Conveyor(39),
+ UXV_Conveyor(40),
+ MAX_Conveyor(41),
+ LV_Piston(42),
+ MV_Piston(43),
+ HV_Piston(44),
+ EV_Piston(45),
+ IV_Piston(46),
+ LuV_Piston(47),
+ ZPM_Piston(48),
+ UV_Piston(49),
+ UHV_Piston(50),
+ UEV_Piston(51),
+ UIV_Piston(52),
+ UMV_Piston(53),
+ UXV_Piston(54),
+ MAX_Piston(55),
+ LV_RobotArm(56),
+ MV_RobotArm(57),
+ HV_RobotArm(58),
+ EV_RobotArm(59),
+ IV_RobotArm(60),
+ LuV_RobotArm(61),
+ ZPM_RobotArm(62),
+ UV_RobotArm(63),
+ UHV_RobotArm(64),
+ UEV_RobotArm(65),
+ UIV_RobotArm(66),
+ UMV_RobotArm(67),
+ UXV_RobotArm(68),
+ MAX_RobotArm(69),
+ LV_Emitter(70),
+ MV_Emitter(71),
+ HV_Emitter(72),
+ EV_Emitter(73),
+ IV_Emitter(74),
+ LuV_Emitter(75),
+ ZPM_Emitter(76),
+ UV_Emitter(77),
+ UHV_Emitter(78),
+ UEV_Emitter(79),
+ UIV_Emitter(80),
+ UMV_Emitter(81),
+ UXV_Emitter(82),
+ MAX_Emitter(83),
+ LV_Sensor(84),
+ MV_Sensor(85),
+ HV_Sensor(86),
+ EV_Sensor(87),
+ IV_Sensor(88),
+ LuV_Sensor(89),
+ ZPM_Sensor(90),
+ UV_Sensor(91),
+ UHV_Sensor(92),
+ UEV_Sensor(93),
+ UIV_Sensor(94),
+ UMV_Sensor(95),
+ UXV_Sensor(96),
+ MAX_Sensor(97),
+ LV_FieldGenerator(98),
+ MV_FieldGenerator(99),
+ HV_FieldGenerator(100),
+ EV_FieldGenerator(101),
+ IV_FieldGenerator(102),
+ LuV_FieldGenerator(103),
+ ZPM_FieldGenerator(104),
+ UV_FieldGenerator(105),
+ UHV_FieldGenerator(106),
+ UEV_FieldGenerator(107),
+ UIV_FieldGenerator(108),
+ UMV_FieldGenerator(109),
+ UXV_FieldGenerator(110),
+ MAX_FieldGenerator(111),
+ NONE(GT_Values.W);
+
+ private final int meta;
+
+ GT_MultiTileComponentCasing(int meta) {
+ this.meta = meta;
+ }
+
+ public int getId() {
+ return meta;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileMachine.java b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileMachine.java
new file mode 100644
index 0000000000..7cdde78986
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileMachine.java
@@ -0,0 +1,19 @@
+package gregtech.api.multitileentity.enums;
+
+import gregtech.api.enums.GT_Values;
+
+public enum GT_MultiTileMachine {
+
+ CokeOven(0),
+ NONE(GT_Values.W);
+
+ private final int meta;
+
+ GT_MultiTileMachine(int meta) {
+ this.meta = meta;
+ }
+
+ public int getId() {
+ return meta;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileUpgradeCasing.java b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileUpgradeCasing.java
new file mode 100644
index 0000000000..296bae546d
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileUpgradeCasing.java
@@ -0,0 +1,71 @@
+package gregtech.api.multitileentity.enums;
+
+import gregtech.api.enums.GT_Values;
+
+public enum GT_MultiTileUpgradeCasing {
+
+ ULV_Inventory(0),
+ LV_Inventory(1),
+ MV_Inventory(2),
+ HV_Inventory(3),
+ EV_Inventory(4),
+ IV_Inventory(5),
+ LuV_Inventory(6),
+ ZPM_Inventory(7),
+ UV_Inventory(8),
+ UHV_Inventory(9),
+ UEV_Inventory(10),
+ UIV_Inventory(11),
+ UXV_Inventory(12),
+ UMV_Inventory(13),
+ MAX_Inventory(14),
+ ULV_Tank(15),
+ LV_Tank(16),
+ MV_Tank(17),
+ HV_Tank(18),
+ EV_Tank(19),
+ IV_Tank(20),
+ LuV_Tank(21),
+ ZPM_Tank(22),
+ UV_Tank(23),
+ UHV_Tank(24),
+ UEV_Tank(25),
+ UIV_Tank(26),
+ UXV_Tank(27),
+ UMV_Tank(28),
+ MAX_Tank(29),
+ Amp_4(30),
+ Amp_16(31),
+ Amp_64(32),
+ Amp_256(33),
+ Amp_1_024(34),
+ Amp_4_096(35),
+ Amp_16_384(36),
+ Amp_65_536(37),
+ Amp_262_144(38),
+ Amp_1_048_576(39),
+ Laser(40),
+ Wireless(41),
+ Cleanroom(42),
+ Heater_Prototype(100),
+ Heater_IndustrialGrade(101),
+ Heater_NextGen(102),
+ Heater_Omnipotent(103),
+ Heater_OmegaType(104),
+ Insulator_Prototype(105),
+ Insulator_IndustrialGrade(106),
+ Insulator_NextGen(107),
+ Insulator_Omnipotent(108),
+ Insulator_OmegaType(109),
+ NONE(GT_Values.W);
+
+ private final int meta;
+
+ GT_MultiTileUpgradeCasing(int meta) {
+ this.meta = meta;
+ }
+
+ public int getId() {
+ return meta;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/enums/MultiTileCasingPurpose.java b/src/main/java/gregtech/api/multitileentity/enums/MultiTileCasingPurpose.java
new file mode 100644
index 0000000000..2733da33cf
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/enums/MultiTileCasingPurpose.java
@@ -0,0 +1,13 @@
+package gregtech.api.multitileentity.enums;
+
+/**
+ * Purposes with which a casing can registered itself in the MuTE controller to be ticked.
+ * Can be used for example to auto output recipe outputs from output casings.
+ *
+ * @author minecraft7771
+ */
+public enum MultiTileCasingPurpose {
+ ItemOutput,
+ FluidOutput,
+ EnergyOutput,
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IItemUpdatable.java b/src/main/java/gregtech/api/multitileentity/interfaces/IItemUpdatable.java
new file mode 100644
index 0000000000..89d281eb27
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IItemUpdatable.java
@@ -0,0 +1,19 @@
+package gregtech.api.multitileentity.interfaces;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+public interface IItemUpdatable {
+
+ /**
+ * Updates the Data of the ItemStack. Not called every tick but instead called whenever something important happens
+ * to the Stack.
+ */
+ void updateItemStack(ItemStack aStack);
+
+ /**
+ * Updates the Data of the ItemStack. Not called every tick but instead called whenever something important happens
+ * to the Stack.
+ */
+ void updateItemStack(ItemStack aStack, World aWorld, int aX, int aY, int aZ);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java
new file mode 100644
index 0000000000..58af918c50
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java
@@ -0,0 +1,51 @@
+package gregtech.api.multitileentity.interfaces;
+
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.InventoryType;
+import gregtech.api.gui.GUIHost;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.logic.interfaces.FluidInventoryLogicHost;
+import gregtech.api.logic.interfaces.ItemInventoryLogicHost;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.multitileentity.enums.MultiTileCasingPurpose;
+
+public interface IMultiBlockController
+ extends IMultiTileEntity, FluidInventoryLogicHost, ItemInventoryLogicHost, UpgradableMuTE, PowerLogicHost, GUIHost {
+
+ boolean checkStructure(boolean aForceReset);
+
+ /** Set the structure as having changed, and trigger an update */
+ void onStructureChange();
+
+ @Override
+ ChunkCoordinates getCoords();
+
+ void registerCoveredPartOnSide(final ForgeDirection side, IMultiBlockPart part);
+
+ void unregisterCoveredPartOnSide(final ForgeDirection side, IMultiBlockPart part);
+
+ void registerCaseWithPurpose(MultiTileCasingPurpose purpose, IMultiBlockPart part);
+
+ void unregisterCaseWithPurpose(MultiTileCasingPurpose purpose, IMultiBlockPart part);
+
+ UUID registerItemInventory(int slots, int tier, @Nonnull InventoryType type, boolean isUpgradeInventory);
+
+ ItemInventoryLogic unregisterItemInventory(@Nonnull UUID id, @Nonnull InventoryType type);
+
+ void changeItemInventoryDisplayName(@Nonnull UUID id, @Nullable String displayName, @Nonnull InventoryType type);
+
+ UUID registerFluidInventory(int tanks, long capacity, int tier, @Nonnull InventoryType type,
+ boolean isUpgradeInventory);
+
+ FluidInventoryLogic unregisterFluidInventory(@Nonnull UUID id, @Nonnull InventoryType type);
+
+ void changeFluidInventoryDisplayName(@Nonnull UUID id, @Nullable String displayName, @Nonnull InventoryType type);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockEnergy.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockEnergy.java
new file mode 100644
index 0000000000..d6d8bf5310
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockEnergy.java
@@ -0,0 +1,42 @@
+package gregtech.api.multitileentity.interfaces;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+
+interface IMultiBlockEnergy {
+
+ boolean isUniversalEnergyStored(MultiBlockPart aPart, long aEnergyAmount);
+
+ long getUniversalEnergyStored(MultiBlockPart aPart);
+
+ long getUniversalEnergyCapacity(MultiBlockPart aPart);
+
+ long getOutputAmperage(MultiBlockPart aPart);
+
+ long getOutputVoltage(MultiBlockPart aPart);
+
+ long getInputAmperage(MultiBlockPart aPart);
+
+ long getInputVoltage(MultiBlockPart aPart);
+
+ boolean decreaseStoredEnergyUnits(MultiBlockPart aPart, long aEnergy, boolean aIgnoreTooLittleEnergy);
+
+ boolean increaseStoredEnergyUnits(MultiBlockPart aPart, long aEnergy, boolean aIgnoreTooMuchEnergy);
+
+ boolean drainEnergyUnits(MultiBlockPart aPart, ForgeDirection side, long aVoltage, long aAmperage);
+
+ long injectEnergyUnits(MultiBlockPart aPart, ForgeDirection side, long aVoltage, long aAmperage);
+
+ long getAverageElectricInput(MultiBlockPart aPart);
+
+ long getAverageElectricOutput(MultiBlockPart aPart);
+
+ long getStoredEU(MultiBlockPart aPart);
+
+ long getEUCapacity(MultiBlockPart aPart);
+
+ boolean inputEnergyFrom(MultiBlockPart aPart, ForgeDirection side);
+
+ boolean outputsEnergyTo(MultiBlockPart aPart, ForgeDirection side);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockFluidHandler.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockFluidHandler.java
new file mode 100644
index 0000000000..b513f51324
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockFluidHandler.java
@@ -0,0 +1,32 @@
+package gregtech.api.multitileentity.interfaces;
+
+import java.util.List;
+
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidTank;
+
+import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+
+public interface IMultiBlockFluidHandler {
+
+ int fill(MultiBlockPart aPart, ForgeDirection aDirection, FluidStack aFluid, boolean aDoFill);
+
+ FluidStack drain(MultiBlockPart aPart, ForgeDirection aDirection, FluidStack aFluid, boolean aDoDrain);
+
+ FluidStack drain(MultiBlockPart aPart, ForgeDirection aDirection, int aAmountToDrain, boolean aDoDrain);
+
+ boolean canFill(MultiBlockPart aPart, ForgeDirection aDirection, Fluid aFluid);
+
+ boolean canDrain(MultiBlockPart aPart, ForgeDirection aDirection, Fluid aFluid);
+
+ FluidTankInfo[] getTankInfo(MultiBlockPart aPart, ForgeDirection aDirection);
+
+ IFluidTank[] getFluidTanksForGUI(MultiBlockPart aPart);
+
+ List<String> getTankArrayNames(MultiBlockPart aPart);
+
+ List<String> getTankArrayIDs(MultiBlockPart aPart);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java
new file mode 100644
index 0000000000..5dc0fec196
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java
@@ -0,0 +1,60 @@
+package gregtech.api.multitileentity.interfaces;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+
+import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+
+public interface IMultiBlockInventory {
+
+ boolean hasInventoryBeenModified(MultiBlockPart aPart);
+
+ boolean isValidSlot(MultiBlockPart aPart, int aIndex);
+
+ boolean addStackToSlot(MultiBlockPart aPart, int aIndex, ItemStack aStack);
+
+ boolean addStackToSlot(MultiBlockPart aPart, int aIndex, ItemStack aStack, int aAmount);
+
+ int[] getAccessibleSlotsFromSide(MultiBlockPart aPart, ForgeDirection side);
+
+ boolean canInsertItem(MultiBlockPart aPart, int aSlot, ItemStack aStack, ForgeDirection side);
+
+ boolean canExtractItem(MultiBlockPart aPart, int aSlot, ItemStack aStack, ForgeDirection side);
+
+ int getSizeInventory(MultiBlockPart aPart);
+
+ ItemStack getStackInSlot(MultiBlockPart aPart, int aSlot);
+
+ ItemStack decrStackSize(MultiBlockPart aPart, int aSlot, int aDecrement);
+
+ ItemStack getStackInSlotOnClosing(MultiBlockPart aPart, int aSlot);
+
+ void setInventorySlotContents(MultiBlockPart aPart, int aSlot, ItemStack aStack);
+
+ String getInventoryName(MultiBlockPart aPart);
+
+ boolean hasCustomInventoryName(MultiBlockPart aPart);
+
+ int getInventoryStackLimit(MultiBlockPart aPart);
+
+ void markDirty(MultiBlockPart aPart);
+
+ boolean isUseableByPlayer(MultiBlockPart aPart, EntityPlayer aPlayer);
+
+ void openInventory(MultiBlockPart aPart);
+
+ void closeInventory(MultiBlockPart aPart);
+
+ boolean isItemValidForSlot(MultiBlockPart aPart, int aSlot, ItemStack aStack);
+
+ IItemHandlerModifiable getInventoryForGUI(MultiBlockPart aPart);
+
+ List<String> getInventoryNames(MultiBlockPart aPart);
+
+ List<String> getInventoryIDs(MultiBlockPart aPart);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java
new file mode 100644
index 0000000000..59d838fdeb
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java
@@ -0,0 +1,26 @@
+package gregtech.api.multitileentity.interfaces;
+
+import java.util.UUID;
+
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.logic.interfaces.FluidInventoryLogicHost;
+import gregtech.api.logic.interfaces.ItemInventoryLogicHost;
+
+public interface IMultiBlockPart extends IMultiTileEntity, ItemInventoryLogicHost, FluidInventoryLogicHost {
+
+ ChunkCoordinates getTargetPos();
+
+ void setTargetPos(ChunkCoordinates aTargetPos);
+
+ void setLockedInventoryIndex(int aIndex);
+
+ int getLockedInventoryIndex();
+
+ UUID getLockedInventory();
+
+ boolean tickCoverAtSide(ForgeDirection side, long aTickTimer);
+
+ boolean shouldTick(long tickTimer);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java
new file mode 100644
index 0000000000..91803690fc
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java
@@ -0,0 +1,293 @@
+package gregtech.api.multitileentity.interfaces;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import net.minecraft.block.Block;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+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.MovingObjectPosition;
+import net.minecraft.world.Explosion;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.common.Optional;
+import gregtech.api.enums.Mods;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IDebugableTileEntity;
+import gregtech.api.interfaces.tileentity.ITurnable;
+import gregtech.api.multitileentity.MultiTileEntityBlockInternal;
+import gregtech.api.multitileentity.MultiTileEntityItemInternal;
+import gregtech.api.multitileentity.MultiTileEntityRegistry;
+
+/*
+ * Heavily inspired by GT6
+ */
+public interface IMultiTileEntity extends ICoverable, ITurnable, IDebugableTileEntity {
+
+ /**
+ * Those two IDs HAVE to be saved inside the NBT of the TileEntity itself. They get set by the Registry itself, when
+ * the TileEntity is placed.
+ */
+ short getMultiTileEntityID();
+
+ short getMultiTileEntityRegistryID();
+
+ /**
+ * Called by the Registry with the default NBT Parameters and the two IDs you have to save, when the TileEntity is
+ * created. aNBT may be null, take that into account if you decide to call the regular readFromNBT Function from
+ * here.
+ */
+ void initFromNBT(NBTTagCompound aNBT, short aMTEID, short aMTERegistry);
+
+ /** Writes Item Data to the NBT. */
+ NBTTagCompound writeItemNBT(NBTTagCompound aNBT);
+
+ /** Sets the Item Display Name. Use null to reset it. */
+ void setCustomName(String aName);
+
+ String getCustomName();
+
+ /** return the internal Name of this TileEntity to be registered. */
+ String getTileEntityName();
+
+ /**
+ * Called when a TileEntity of this particular Class is being registered first at any MultiTileEntity Registry. So
+ * basically one call per Class.
+ */
+ void onRegistrationFirst(MultiTileEntityRegistry aRegistry, short aID);
+
+ /** Called after the TileEntity has been placed and set up. */
+ void onTileEntityPlaced();
+
+ /** Checks if the TileEntity is Invalid or Unloaded, should bes required for every TileEntity. */
+ @Override
+ boolean isDead();
+
+ void loadTextures(String folder);
+
+ void copyTextures();
+
+ void issueClientUpdate();
+
+ void sendClientData(EntityPlayerMP aPlayer);
+
+ boolean receiveClientData(int aEventID, int aValue);
+
+ void setShouldRefresh(boolean aShouldRefresh);
+
+ void addCollisionBoxesToList(AxisAlignedBB aAABB, List<AxisAlignedBB> aList, Entity aEntity);
+
+ AxisAlignedBB getCollisionBoundingBoxFromPool();
+
+ AxisAlignedBB getSelectedBoundingBoxFromPool();
+
+ void setBlockBoundsBasedOnState(Block aBlock);
+
+ void onBlockAdded();
+
+ boolean playerOwnsThis(EntityPlayer aPlayer, boolean aCheckPrecicely);
+
+ boolean privateAccess();
+
+ /** @return the amount of Time this TileEntity has been loaded. */
+ @Override
+ long getTimer();
+
+ /** Sets the Owner of the Machine. Returns the set Name. */
+ String setOwnerName(String aName);
+
+ /** gets the Name of the Machines Owner or "Player" if not set. */
+ String getOwnerName();
+
+ /** Gets the UniqueID of the Machines Owner. */
+ UUID getOwnerUuid();
+
+ /** Sets the UniqueID of the Machines Owner. */
+ void setOwnerUuid(UUID uuid);
+
+ /**
+ * Causes a general Texture update. Only used Client Side to mark Blocks dirty.
+ */
+ void issueTextureUpdate();
+
+ /**
+ * Paintable Support
+ */
+ boolean unpaint();
+
+ boolean isPainted();
+
+ boolean paint(int aRGB);
+
+ int getPaint();
+
+ /**
+ * Sets the main facing to {side} and update as appropriately
+ *
+ * @return Whether the facing was changed
+ */
+ boolean setMainFacing(ForgeDirection side);
+
+ boolean isFacingValid(ForgeDirection facing);
+
+ void onFacingChange();
+
+ @Override
+ default void setFrontFacing(ForgeDirection side) {
+ setMainFacing(side);
+ }
+
+ boolean shouldTriggerBlockUpdate();
+
+ void onMachineBlockUpdate();
+
+ boolean allowInteraction(Entity aEntity);
+
+ default void onLeftClick(EntityPlayer aPlayer) {
+ /* do nothing */
+ }
+
+ boolean onBlockActivated(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ);
+
+ boolean onRightClick(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ);
+
+ ArrayList<ItemStack> getDrops(int aFortune, boolean aSilkTouch);
+
+ boolean isSideSolid(ForgeDirection side);
+
+ float getExplosionResistance(Entity aExploder, double aExplosionX, double aExplosionY, double aExplosionZ);
+
+ float getExplosionResistance();
+
+ void onExploded(Explosion aExplosion);
+
+ boolean recolourBlock(ForgeDirection side, byte aColor);
+
+ /** Adds to the Creative Tab. return false to prevent it from being added. */
+ boolean getSubItems(MultiTileEntityBlockInternal aBlock, Item aItem, CreativeTabs aTab, List<ItemStack> aList,
+ short aID);
+
+ ItemStack getPickBlock(MovingObjectPosition aTarget);
+
+ boolean shouldSideBeRendered(ForgeDirection side);
+
+ boolean isSurfaceOpaque(ForgeDirection side);
+
+ boolean onPlaced(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, ForgeDirection side,
+ float aHitX, float aHitY, float aHitZ);
+
+ // ItemStack getPickBlock(MovingObjectPosition aTarget);
+
+ /*
+ * Various Sub Interfaces from GT6
+ */
+
+ interface IMTE_OnNeighborBlockChange extends IMultiTileEntity {
+
+ void onNeighborBlockChange(World aWorld, Block aBlock);
+ }
+
+ interface IMTE_IsProvidingWeakPower extends IMultiTileEntity {
+
+ /** Remember that it passes the opposite Side due to the way vanilla works! */
+ int isProvidingWeakPower(ForgeDirection oppositeSide);
+ }
+
+ interface IMTE_IsProvidingStrongPower extends IMultiTileEntity {
+
+ /** Remember that it passes the opposite Side due to the way vanilla works! */
+ int isProvidingStrongPower(ForgeDirection oppositeSide);
+ }
+
+ interface IMTE_ShouldCheckWeakPower extends IMultiTileEntity {
+
+ boolean shouldCheckWeakPower(ForgeDirection side);
+ }
+
+ interface IMTE_GetWeakChanges extends IMultiTileEntity {
+
+ boolean getWeakChanges();
+ }
+
+ interface IMTE_GetComparatorInputOverride extends IMultiTileEntity {
+
+ int getComparatorInputOverride(ForgeDirection side);
+ }
+
+ interface IMTE_BreakBlock extends IMultiTileEntity {
+
+ /** return true to prevent the TileEntity from being removed. */
+ boolean breakBlock();
+ }
+
+ interface IMTE_HasMultiBlockMachineRelevantData extends IMultiTileEntity {
+
+ /** Return true to mark this Block as a Machine Block for Multiblocks. (Triggers machine update thread) */
+ boolean hasMultiBlockMachineRelevantData();
+ }
+
+ interface IMTE_GetBlockHardness extends IMultiTileEntity {
+
+ float getBlockHardness();
+ }
+
+ interface IMTE_GetFoodValues extends IMultiTileEntity {
+
+ @Optional.Method(modid = Mods.Names.APPLE_CORE)
+ squeek.applecore.api.food.FoodValues getFoodValues(MultiTileEntityItemInternal aItem, ItemStack aStack);
+ }
+
+ interface IMTE_OnlyPlaceableWhenSneaking extends IMultiTileEntity {
+
+ /** Return true to prevent placing this Block without Sneaking. */
+ boolean onlyPlaceableWhenSneaking();
+ }
+
+ interface IMTE_IgnoreEntityCollisionWhenPlacing extends IMultiTileEntity {
+
+ /**
+ * Return true to ignore the Player standing in the way of placing this Block; useful for things like
+ * pipes/wires.
+ */
+ boolean ignoreEntityCollisionWhenPlacing(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY,
+ int aZ, ForgeDirection side, float aHitX, float aHitY, float aHitZ);
+ }
+
+ interface IMTE_CanPlace extends IMultiTileEntity {
+
+ /** Return false if this TileEntity cannot be placed at that Location. */
+ boolean canPlace(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ ForgeDirection side, float aHitX, float aHitY, float aHitZ);
+ }
+
+ interface IMTE_GetMaxStackSize extends IMultiTileEntity {
+
+ /** Gets the Max Stacksize of this Item. */
+ byte getMaxStackSize(ItemStack aStack, byte aDefault);
+ }
+
+ interface IMTE_AddToolTips extends IMultiTileEntity {
+
+ /** Adds ToolTips to the Item. */
+ void addToolTips(List<String> aList, ItemStack aStack, boolean aF3_H);
+ }
+
+ interface IMTE_HasModes extends IMultiTileEntity {
+
+ int getMode();
+
+ void setMode(int mode);
+
+ int getAllowedModes();
+
+ void setAllowedModes(int allowedModes);
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileMachine.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileMachine.java
new file mode 100644
index 0000000000..babb85d118
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileMachine.java
@@ -0,0 +1,10 @@
+package gregtech.api.multitileentity.interfaces;
+
+public interface IMultiTileMachine {
+
+ void setBooleans(int booleans);
+
+ int getBooleans();
+
+ void setSound(byte soundEvent, int soundEventValue);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java
new file mode 100644
index 0000000000..2045f28d67
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/SyncedMultiTileEntity.java
@@ -0,0 +1,63 @@
+package gregtech.api.multitileentity.interfaces;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+
+import gregtech.api.net.GT_Packet_MultiTileEntity;
+
+public interface SyncedMultiTileEntity {
+
+ public static final int DEFAULT_TIMED_PACKET_PERIOD = 20;
+
+ /**
+ * Will send a packet to the client when they open the controller or access a casing.
+ * Should only be sent to one player!
+ */
+ void sendFullPacket(@Nonnull EntityPlayerMP player);
+
+ /**
+ * Should always collect all the data that the controller or casing has and should send
+ * Called by {@link #sendFullPacket()}
+ *
+ * @param packet The packet which will be sent
+ */
+ void getFullPacketData(GT_Packet_MultiTileEntity packet);
+
+ /**
+ * Will send a packet at a certain period of time, defined by {@link #getTimedPacketPeriod()}, to all players around
+ * the controller or casing to send important information.
+ * Redstone state, color, ect. It shouldn't send data about the internals like inventory and processing time
+ */
+ void sendTimedPacket();
+
+ /**
+ * Collects all the data that should be sent out at a certain period of time defined by
+ * {@link #getTimedPacketPeriod()}
+ * Called by {@link #sendTimedPacket()}
+ *
+ * @param packet The packet which will be sent
+ */
+ void getTimedPacketData(GT_Packet_MultiTileEntity packet);
+
+ /**
+ * Defines the period of time at which a timed packet should be sent out. Default 20 ticks
+ */
+ default int getTimedPacketPeriod() {
+ return DEFAULT_TIMED_PACKET_PERIOD;
+ }
+
+ /**
+ * Will send a packet, which should only contain data about how the TileEntity should be rendered.
+ * !!! Warning !!! This is sent every single tick! Do not put a lot of data here!
+ */
+ void sendGraphicPacket();
+
+ /**
+ * Collects all the data that is needed to be send every single tick
+ * Called by {@link #sendGraphicPacket()}
+ *
+ * @param packet The packet which will be sent
+ */
+ void getGraphicPacketData(GT_Packet_MultiTileEntity packet);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableModularMuTE.java b/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableModularMuTE.java
new file mode 100644
index 0000000000..3b4c3cb6f3
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableModularMuTE.java
@@ -0,0 +1,10 @@
+package gregtech.api.multitileentity.interfaces;
+
+import gregtech.api.util.GT_StructureUtilityMuTE.UpgradeCasings;
+
+public interface UpgradableModularMuTE extends UpgradableMuTE {
+
+ void increaseMucCount(UpgradeCasings casingType, int tier);
+
+ void resetMucCount();
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableMuTE.java b/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableMuTE.java
new file mode 100644
index 0000000000..c18852c95e
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableMuTE.java
@@ -0,0 +1,12 @@
+package gregtech.api.multitileentity.interfaces;
+
+public interface UpgradableMuTE {
+
+ void setCleanroom(boolean isCleanroom);
+
+ void setWirelessSupport(boolean canUse);
+
+ void setLaserSupport(boolean canUse);
+
+ void setMaxAmperage(long amperage);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
new file mode 100644
index 0000000000..4b348c2fec
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
@@ -0,0 +1,800 @@
+package gregtech.api.multitileentity.machine;
+
+import static gregtech.api.enums.GT_Values.*;
+import static gregtech.api.enums.TickTime.MINUTE;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.tileentity.TileEntityFurnace;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.ApiStatus.OverrideOnly;
+
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.GT_Values.NBT;
+import gregtech.api.enums.InventoryType;
+import gregtech.api.enums.Mods;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.Textures.BlockIcons.CustomIcon;
+import gregtech.api.enums.TickTime;
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.gui.GUIHost;
+import gregtech.api.gui.GUIProvider;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.logic.MuTEProcessingLogic;
+import gregtech.api.logic.NullPowerLogic;
+import gregtech.api.logic.PowerLogic;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.logic.interfaces.ProcessingLogicHost;
+import gregtech.api.metatileentity.GregTechTileClientEvents;
+import gregtech.api.multitileentity.MultiTileEntityRegistry;
+import gregtech.api.multitileentity.base.TickableMultiTileEntity;
+import gregtech.api.multitileentity.interfaces.IMultiTileMachine;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.task.tasks.ProcessingTask;
+import gregtech.api.util.GT_Utility;
+import gregtech.client.GT_SoundLoop;
+import gregtech.common.gui.MachineGUIProvider;
+
+public abstract class MultiTileBasicMachine<P extends MuTEProcessingLogic<P>> extends TickableMultiTileEntity
+ implements IMultiTileMachine, ProcessingLogicHost<P>, PowerLogicHost, GUIHost {
+
+ protected static final int ACTIVE = B[0];
+ protected static final int TICKS_BETWEEN_RECIPE_CHECKS = 5 * TickTime.SECOND;
+ protected static final int POLLUTION_TICK = TickTime.SECOND;
+ protected static final byte INTERRUPT_SOUND_INDEX = 8;
+ protected static final byte PROCESS_START_SOUND_INDEX = 1;
+
+ protected static final IItemHandlerModifiable EMPTY_INVENTORY = new ItemStackHandler(0);
+
+ public ITexture activeOverlayTexture = null;
+ public ITexture activeOverlayGlowTexture = null;
+ public ITexture inactiveOverlayTexture = null;
+ public ITexture inactiveOverlayGlowTexture = null;
+
+ protected int maxParallel = 1;
+ protected boolean active = false;
+ protected int tier = 0;
+ protected long burnTime = 0;
+ protected long totalBurnTime = 0;
+
+ protected boolean outputInventoryChanged = false;
+ protected boolean powerShutDown = false;
+ protected boolean wasEnabled = false;
+ protected boolean canWork = true;
+ protected boolean isElectric = true;
+ protected boolean isSteam = false;
+ protected boolean acceptsFuel = false;
+
+ protected byte soundEvent = 0;
+ protected int soundEventValue = 0;
+ protected ItemInventoryLogic itemInput;
+ protected ItemInventoryLogic itemOutput;
+ protected FluidInventoryLogic fluidInput;
+ protected FluidInventoryLogic fluidOutput;
+
+ protected P processingLogic;
+ @Nonnull
+ protected VoidingMode voidingMode = VoidingMode.VOID_NONE;
+ protected boolean processingUpdate = false;
+ @Nonnull
+ protected PowerLogic power = createPowerLogic();
+ @Nonnull
+ protected GUIProvider<?> guiProvider = createGUIProvider();
+
+ @SideOnly(Side.CLIENT)
+ protected GT_SoundLoop activitySoundLoop;
+
+ public MultiTileBasicMachine() {
+ new ProcessingTask<>(this);
+ }
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.machine.basic";
+ }
+
+ @Override
+ public void writeMultiTileNBT(NBTTagCompound nbt) {
+ super.writeMultiTileNBT(nbt);
+ if (maxParallel > 0) {
+ nbt.setInteger(NBT.PARALLEL, maxParallel);
+ }
+
+ if (active) {
+ nbt.setBoolean(NBT.ACTIVE, active);
+ }
+
+ saveItemLogic(nbt);
+ saveFluidLogic(nbt);
+
+ if (processingLogic != null) {
+ NBTTagCompound processingLogicNBT = processingLogic.saveToNBT();
+ nbt.setTag("processingLogic", processingLogicNBT);
+ }
+
+ nbt.setInteger(NBT.TIER, tier);
+ nbt.setLong(NBT.BURN_TIME_LEFT, burnTime);
+ nbt.setLong(NBT.TOTAL_BURN_TIME, totalBurnTime);
+ nbt.setBoolean(NBT.ALLOWED_WORK, canWork);
+ nbt.setBoolean(NBT.ACTIVE, active);
+ power.saveToNBT(nbt);
+ }
+
+ protected void saveItemLogic(NBTTagCompound nbt) {
+ NBTTagCompound nbtListInput = itemInput.saveToNBT();
+ nbt.setTag(NBT.INV_INPUT_LIST, nbtListInput);
+ NBTTagCompound nbtListOutput = itemOutput.saveToNBT();
+ nbt.setTag(NBT.INV_OUTPUT_LIST, nbtListOutput);
+ }
+
+ protected void saveFluidLogic(NBTTagCompound nbt) {
+ NBTTagCompound fluidInputNBT = fluidInput.saveToNBT();
+ nbt.setTag(NBT.TANK_IN, fluidInputNBT);
+ NBTTagCompound fluidOutputNBT = fluidOutput.saveToNBT();
+ nbt.setTag(NBT.TANK_OUT, fluidOutputNBT);
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound nbt) {
+ super.readMultiTileNBT(nbt);
+ if (nbt.hasKey(NBT.PARALLEL)) {
+ maxParallel = Math.max(1, nbt.getInteger(NBT.PARALLEL));
+ }
+
+ if (nbt.hasKey(NBT.ACTIVE)) {
+ active = nbt.getBoolean(NBT.ACTIVE);
+ }
+
+ loadItemLogic(nbt);
+ loadFluidLogic(nbt);
+
+ if (nbt.hasKey("processingLogic")) {
+ P processingLogic = getProcessingLogic();
+ processingLogic.loadFromNBT(Objects.requireNonNull(nbt.getCompoundTag("processingLogic")));
+ }
+
+ tier = nbt.getInteger(NBT.TIER);
+ burnTime = nbt.getLong(NBT.BURN_TIME_LEFT);
+ totalBurnTime = nbt.getLong(NBT.TOTAL_BURN_TIME);
+ canWork = nbt.getBoolean(NBT.ALLOWED_WORK);
+ active = nbt.getBoolean(NBT.ACTIVE);
+ power.loadFromNBT(nbt);
+ }
+
+ protected void loadItemLogic(NBTTagCompound nbt) {
+ itemInput = new ItemInventoryLogic(nbt.getInteger(NBT.INV_OUTPUT_SIZE), tier);
+ itemOutput = new ItemInventoryLogic(nbt.getInteger(NBT.INV_OUTPUT_SIZE), tier);
+ if (nbt.hasKey(NBT.INV_INPUT_LIST)) {
+ itemInput.loadFromNBT(nbt.getCompoundTag(NBT.INV_INPUT_LIST));
+ }
+ if (nbt.hasKey(NBT.INV_OUTPUT_LIST)) {
+ itemOutput.loadFromNBT(nbt.getCompoundTag(NBT.INV_OUTPUT_LIST));
+ }
+ }
+
+ protected void loadFluidLogic(NBTTagCompound nbt) {
+ fluidInput = new FluidInventoryLogic(16, 10000, tier);
+ fluidOutput = new FluidInventoryLogic(16, 10000, tier);
+ fluidInput.loadFromNBT(nbt.getCompoundTag(NBT.TANK_IN));
+ fluidOutput.loadFromNBT(nbt.getCompoundTag(NBT.TANK_OUT));
+ }
+
+ public boolean checkTexture(String modID, String resourcePath) {
+ try {
+ Minecraft.getMinecraft()
+ .getResourceManager()
+ .getResource(new ResourceLocation(modID, resourcePath));
+ return true;
+ } catch (IOException ignored) {
+ return false;
+ }
+ }
+
+ @Override
+ public void loadTextures(String folder) {
+ super.loadTextures(folder);
+ for (StatusTextures textureName : StatusTextures.TEXTURES) {
+ ITexture texture = null;
+ String texturePath = "textures/blocks/multitileentity/" + folder + "/" + textureName.getName() + ".png";
+ if (!checkTexture(Mods.GregTech.ID, texturePath)) {
+ texture = TextureFactory.of(Textures.BlockIcons.VOID);
+ } else {
+ if (textureName.hasGlow()) {
+ texture = TextureFactory.builder()
+ .addIcon(new CustomIcon("multitileentity/" + folder + "/" + textureName.getName()))
+ .glow()
+ .build();
+ } else {
+ texture = TextureFactory
+ .of(new CustomIcon("multitileentity/" + folder + "/" + textureName.getName()));
+ }
+ }
+ switch (textureName) {
+ case Active -> activeOverlayTexture = texture;
+ case ActiveWithGlow -> activeOverlayGlowTexture = texture;
+ case Inactive -> inactiveOverlayTexture = texture;
+ case InactiveWithGlow -> inactiveOverlayGlowTexture = texture;
+ }
+ }
+ }
+
+ @Override
+ public void copyTextures() {
+ super.copyTextures();
+ final TileEntity tCanonicalTileEntity = MultiTileEntityRegistry
+ .getCanonicalTileEntity(getMultiTileEntityRegistryID(), getMultiTileEntityID());
+ if (!(tCanonicalTileEntity instanceof MultiTileBasicMachine)) {
+ return;
+ }
+ final MultiTileBasicMachine canonicalEntity = (MultiTileBasicMachine) tCanonicalTileEntity;
+ activeOverlayTexture = canonicalEntity.activeOverlayTexture;
+ activeOverlayGlowTexture = canonicalEntity.activeOverlayGlowTexture;
+ inactiveOverlayTexture = canonicalEntity.inactiveOverlayTexture;
+ inactiveOverlayGlowTexture = canonicalEntity.inactiveOverlayGlowTexture;
+ }
+
+ @Override
+ public ITexture getTexture(ForgeDirection side) {
+ final ITexture texture = super.getTexture(side);
+ if (side == facing) {
+ if (isActive()) {
+ return TextureFactory.of(texture, activeOverlayTexture, activeOverlayGlowTexture);
+ }
+
+ return TextureFactory.of(texture, inactiveOverlayTexture, inactiveOverlayGlowTexture);
+ }
+
+ return TextureFactory.of(texture, getCoverTexture(side));
+ }
+ /*
+ * Fluids
+ */
+
+ /**
+ * The number of fluid (input) slots available for this machine
+ */
+ public int getFluidInputCount() {
+ return 7;
+ }
+
+ /**
+ * The number of fluid (output) slots available for this machine
+ */
+ public int getFluidOutputCount() {
+ return 3;
+ }
+
+ @Override
+ public void setLightValue(byte aLightValue) {}
+
+ /*
+ * Inventory
+ */
+
+ @Override
+ public boolean hasInventoryBeenModified() {
+ // True if the input inventory has changed
+ return hasInventoryChanged;
+ }
+
+ public void markOutputInventoryBeenModified() {
+ outputInventoryChanged = true;
+ }
+
+ public boolean hasOutputInventoryBeenModified() {
+ // True if the output inventory has changed
+ return outputInventoryChanged;
+ }
+
+ public void markInputInventoryBeenModified() {
+ hasInventoryChanged = true;
+ }
+
+ // #region Machine
+
+ @Override
+ public void onPostTick(long tick, boolean isServerSide) {
+ if (isServerSide) {
+ runMachine(tick);
+ } else {
+ doActivitySound(getActivitySoundLoop());
+ }
+ }
+
+ /**
+ * Runs only on server side
+ *
+ * @param tick The current tick of the machine
+ */
+ protected void runMachine(long tick) {
+ if (acceptsFuel() && isActive() && !consumeFuel()) {
+ stopMachine(true);
+ return;
+ }
+
+ if (hasThingsToDo()) {
+ markDirty();
+ runningTick(tick);
+ return;
+ }
+
+ if (tick % TICKS_BETWEEN_RECIPE_CHECKS == 0 || hasWorkJustBeenEnabled()
+ || hasInventoryBeenModified() && isAllowedToWork()) {
+ wasEnabled = false;
+ if (checkRecipe()) {
+ setActive(true);
+ setSound(GregTechTileClientEvents.START_SOUND_LOOP, PROCESS_START_SOUND_INDEX);
+ updateSlots();
+ markDirty();
+ issueClientUpdate();
+ }
+ }
+ }
+
+ /**
+ * Runs only on server side
+ *
+ * @param tick The current tick of the machine
+ */
+ protected void runningTick(long tick) {
+ consumeEnergy();
+ }
+
+ /**
+ * Runs only on server side
+ */
+ protected boolean checkRecipe() {
+ return false;
+ }
+
+ /**
+ * Runs only on server side
+ */
+ protected void consumeEnergy() {
+ PowerLogic logic = getPowerLogic();
+
+ P processing = getProcessingLogic();
+
+ if (!logic.removeEnergyUnsafe(processing.getCalculatedEut())) {
+ stopMachine(true);
+ }
+ }
+
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ switch (aIndex) {
+ case PROCESS_START_SOUND_INDEX -> {
+ if (getProcessStartSound() != null)
+ GT_Utility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ);
+ }
+ case INTERRUPT_SOUND_INDEX -> GT_Utility
+ .doSoundAtClient(SoundResource.IC2_MACHINES_INTERRUPT_ONE, 100, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ if (aIndex == PROCESS_START_SOUND_INDEX && getProcessStartSound() != null) {
+ GT_Utility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ);
+ }
+ }
+
+ protected ResourceLocation getProcessStartSound() {
+ return null;
+ }
+
+ protected int getTimeBetweenProcessSounds() {
+ return 100;
+ }
+
+ @SideOnly(Side.CLIENT)
+ protected void doActivitySound(ResourceLocation activitySound) {
+ if (isActive() && activitySound != null && activitySoundLoop == null) {
+ activitySoundLoop = new GT_SoundLoop(activitySound, this, false, true);
+ Minecraft.getMinecraft()
+ .getSoundHandler()
+ .playSound(activitySoundLoop);
+ return;
+ }
+
+ if (activitySoundLoop != null) {
+ activitySoundLoop = null;
+ }
+
+ }
+
+ @SideOnly(Side.CLIENT)
+ protected ResourceLocation getActivitySoundLoop() {
+ return null;
+ }
+
+ protected ItemStack[] getInputItems() {
+ return itemInput.getStoredItems();
+ }
+
+ protected FluidStack[] getInputFluids() {
+ return fluidInput.getStoredFluids();
+ }
+
+ @Override
+ public int getProgress() {
+ P processing = getProcessingLogic();
+ return processing.getProgress();
+ }
+
+ @Override
+ public int getMaxProgress() {
+ P processing = getProcessingLogic();
+ return processing.getDuration();
+ }
+
+ @Override
+ public boolean increaseProgress(int progressAmount) {
+ P processing = getProcessingLogic();
+ processing.increaseProgress(progressAmount);
+ return true;
+ }
+
+ @Override
+ public boolean hasThingsToDo() {
+ return getMaxProgress() > 0;
+ }
+
+ @Override
+ public boolean hasWorkJustBeenEnabled() {
+ return wasEnabled;
+ }
+
+ @Override
+ public void enableWorking() {
+ wasEnabled = true;
+ canWork = true;
+ }
+
+ @Override
+ public void disableWorking() {
+ canWork = false;
+ }
+
+ @Override
+ public boolean wasShutdown() {
+ return powerShutDown;
+ }
+
+ @Override
+ public boolean isAllowedToWork() {
+ return canWork;
+ }
+
+ @Override
+ public boolean isActive() {
+ return active;
+ }
+
+ @Override
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+ protected boolean isElectric() {
+ return isElectric;
+ }
+
+ protected void setElectric(boolean isElectric) {
+ this.isElectric = isElectric;
+ }
+
+ protected boolean isSteam() {
+ return isSteam;
+ }
+
+ protected void setSteam(boolean isSteam) {
+ this.isSteam = isSteam;
+ }
+
+ protected boolean acceptsFuel() {
+ return acceptsFuel;
+ }
+
+ protected void setFuel(boolean acceptsFuel) {
+ this.acceptsFuel = acceptsFuel;
+ }
+
+ protected boolean consumeFuel() {
+ if (isElectric() || isSteam()) return false;
+ if (isActive() && burnTime <= 0) {
+ for (int i = 0; i < itemInput.getSlots(); i++) {
+ ItemStack item = itemInput.getItemInSlot(i);
+ if (item == null) continue;
+ int checkBurnTime = TileEntityFurnace.getItemBurnTime(item) / 10;
+ if (checkBurnTime <= 0) continue;
+ item.stackSize--;
+ burnTime = checkBurnTime;
+ totalBurnTime = checkBurnTime;
+ break;
+ }
+ updateSlots();
+ }
+
+ if (--burnTime < 0) {
+ burnTime = 0;
+ totalBurnTime = 0;
+ return false;
+ }
+ return false;
+ }
+
+ @Override
+ protected void addDebugInfo(EntityPlayer player, int logLevel, ArrayList<String> list) {
+ list.add(
+ GT_Utility.trans("186", "Owned by: ") + EnumChatFormatting.BLUE
+ + getOwnerName()
+ + EnumChatFormatting.RESET
+ + " ("
+ + EnumChatFormatting.AQUA
+ + getOwnerUuid()
+ + EnumChatFormatting.RESET
+ + ")");
+
+ if (acceptsFuel()) {
+ list.add("Fuel: " + EnumChatFormatting.GOLD + burnTime + "/" + totalBurnTime);
+ }
+
+ PowerLogic logic = getPowerLogic();
+ if (isElectric) {
+ list.add(
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(logic.getStoredEnergy())
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(logic.getCapacity())
+ + EnumChatFormatting.RESET
+ + " EU");
+ list.add(
+ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(getProcessingLogic().getCalculatedEut())
+ + EnumChatFormatting.RESET
+ + " EU/t");
+ list.add(
+ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(logic.getVoltage())
+ + EnumChatFormatting.RESET
+ // TODO: Put ampere getter here, once that's variable
+ + " EU/t(*2A) "
+ + StatCollector.translateToLocal("GT5U.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + VN[GT_Utility.getTier(logic.getVoltage())]
+ + EnumChatFormatting.RESET);
+ }
+
+ addProgressStringToScanner(player, logLevel, list);
+
+ // TODO: Add CPU load calculator
+ list.add(
+ "Average CPU load of ~" + GT_Utility.formatNumbers(0)
+ + "ns over "
+ + GT_Utility.formatNumbers(0)
+ + " ticks with worst time of "
+ + GT_Utility.formatNumbers(0)
+ + "ns.");
+ }
+
+ protected void addProgressStringToScanner(EntityPlayer player, int logLevel, ArrayList<String> list) {
+ P processing = getProcessingLogic();
+ int progressTime = processing.getProgress();
+ int maxProgressTime = processing.getDuration();
+ list.add(
+ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(progressTime > 20 ? progressTime / 20 : progressTime)
+ + EnumChatFormatting.RESET
+ + (progressTime > 20 ? " s / " : " ticks / ")
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxProgressTime > 20 ? maxProgressTime / 20 : maxProgressTime)
+ + EnumChatFormatting.RESET
+ + (maxProgressTime > 20 ? " s" : " ticks"));
+ }
+
+ protected void stopMachine(boolean powerShutDown) {
+ setActive(false);
+ disableWorking();
+ if (powerShutDown) {
+ setSound(GregTechTileClientEvents.STOP_SOUND_LOOP, INTERRUPT_SOUND_INDEX);
+ }
+ issueClientUpdate();
+ }
+
+ protected void updateSlots() {
+ itemInput.update(false);
+ itemOutput.update(false);
+ fluidInput.update();
+ fluidOutput.update();
+ }
+
+ @Override
+ public int getBooleans() {
+ int booleans = 0;
+ if (isActive()) {
+ booleans |= ACTIVE;
+ }
+ return booleans;
+ }
+
+ @Override
+ public void setBooleans(int booleans) {
+ setActive((booleans & ACTIVE) == ACTIVE);
+ }
+
+ public boolean hasItemInput() {
+ return true;
+ }
+
+ public boolean hasItemOutput() {
+ return true;
+ }
+
+ public boolean hasFluidInput() {
+ return true;
+ }
+
+ public boolean hasFluidOutput() {
+ return true;
+ }
+
+ @Override
+ public void setSound(byte soundEvent, int soundEventValue) {
+ this.soundEvent = soundEvent;
+ this.soundEventValue = soundEventValue;
+ if (isServerSide()) {
+ return;
+ }
+
+ switch (soundEventValue) {
+ case PROCESS_START_SOUND_INDEX -> {
+ if (getProcessStartSound() != null) GT_Utility.doSoundAtClient(
+ getProcessStartSound(),
+ getTimeBetweenProcessSounds(),
+ 1.0F,
+ getXCoord(),
+ getYCoord(),
+ getZCoord());
+ }
+ case INTERRUPT_SOUND_INDEX -> GT_Utility.doSoundAtClient(
+ SoundResource.IC2_MACHINES_INTERRUPT_ONE,
+ 100,
+ 1.0F,
+ getXCoord(),
+ getYCoord(),
+ getZCoord());
+ }
+
+ }
+
+ @Nullable
+ public ItemInventoryLogic getItemLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType type) {
+ if (side == facing) return null;
+ return switch (type) {
+ case Input -> itemInput;
+ case Output -> itemOutput;
+ default -> null;
+ };
+ }
+
+ @Nullable
+ public FluidInventoryLogic getFluidLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType type) {
+ if (side == facing) return null;
+ return switch (type) {
+ case Input -> fluidInput;
+ case Output -> fluidOutput;
+ default -> null;
+ };
+ }
+
+ @Override
+ @Nonnull
+ public P getProcessingLogic() {
+ if (processingLogic == null) {
+ processingLogic = createProcessingLogic().setMachineHost(this);
+ }
+ return Objects.requireNonNull(processingLogic);
+ }
+
+ @OverrideOnly
+ @Nonnull
+ protected abstract P createProcessingLogic();
+
+ @Override
+ public boolean isInputSeparated() {
+ return false;
+ }
+
+ @Nonnull
+ @Override
+ public VoidingMode getVoidMode() {
+ return voidingMode;
+ }
+
+ @Override
+ public boolean needsUpdate() {
+ return processingUpdate;
+ }
+
+ @Override
+ public void setProcessingUpdate(boolean update) {
+ processingUpdate = update;
+ }
+
+ @Override
+ @Nonnull
+ public PowerLogic getPowerLogic(@Nonnull ForgeDirection side) {
+ if (side == facing) return new NullPowerLogic();
+ return power;
+ }
+
+ @Override
+ @Nonnull
+ public ForgeDirection getPowerOutputSide() {
+ return Objects.requireNonNull(facing.getOpposite());
+ }
+
+ protected void updatePowerLogic() {
+ power.setEnergyCapacity(GT_Values.V[tier] * power.getMaxAmperage() * 2 * MINUTE);
+ power.setMaxVoltage(GT_Values.V[tier]);
+ power.setMaxAmperage(1);
+ }
+
+ @Nonnull
+ protected PowerLogic createPowerLogic() {
+ return new PowerLogic().setMaxAmperage(1)
+ .setType(PowerLogic.RECEIVER);
+ }
+
+ @Nonnull
+ protected GUIProvider<?> createGUIProvider() {
+ return new MachineGUIProvider<>(this);
+ }
+
+ @Nonnull
+ public GUIProvider<?> getGUI(@Nonnull UIBuildContext uiContext) {
+ return guiProvider;
+ }
+
+ @Override
+ public ItemStack getAsItem() {
+ return MultiTileEntityRegistry.getRegistry(getMultiTileEntityRegistryID())
+ .getItem(getMultiTileEntityID());
+ }
+
+ @Override
+ public String getMachineName() {
+ return StatCollector.translateToLocal(getAsItem().getUnlocalizedName());
+ }
+
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java
new file mode 100644
index 0000000000..cdcb77d6e5
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java
@@ -0,0 +1,111 @@
+package gregtech.api.multitileentity.multiblock.base;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import gregtech.api.logic.ComplexParallelProcessingLogic;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GT_Waila;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public abstract class ComplexParallelController<C extends ComplexParallelController<C, P>, P extends ComplexParallelProcessingLogic<P>>
+ extends Controller<C, P> {
+
+ protected int maxComplexParallels = 0;
+ protected int currentComplexParallels = 0;
+
+ public ComplexParallelController() {
+ isSimpleMachine = false;
+ }
+
+ protected void setMaxComplexParallels(int parallel, boolean stopMachine) {
+ if (parallel != maxComplexParallels && maxComplexParallels != 0 && stopMachine) {
+ stopMachine(false);
+ }
+ maxComplexParallels = parallel;
+ setProcessingUpdate(true);
+ }
+
+ @Override
+ protected void stopMachine(boolean powerShutDown) {
+ super.stopMachine(powerShutDown);
+ }
+
+ protected boolean hasPerfectOverclock() {
+ return false;
+ }
+
+ @Override
+ protected void addProgressStringToScanner(EntityPlayer player, int logLevel, ArrayList<String> list) {
+ P processing = getProcessingLogic();
+ for (int i = 0; i < maxComplexParallels; i++) {
+ list.add(
+ StatCollector.translateToLocal("GT5U.multiblock.Progress") + " "
+ + (i + 1)
+ + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(
+ processing.getProgress(i) > 20 ? processing.getProgress(i) / 20 : processing.getProgress(i))
+ + EnumChatFormatting.RESET
+ + (processing.getProgress(i) > 20 ? " s / " : " ticks / ")
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(
+ processing.getDuration(i) > 20 ? processing.getDuration(i) / 20 : processing.getDuration(i))
+ + EnumChatFormatting.RESET
+ + (processing.getDuration(i) > 20 ? " s" : " ticks"));
+ }
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ P processing = getProcessingLogic();
+ tag.setInteger("maxComplexParallels", maxComplexParallels);
+ for (int i = 0; i < maxComplexParallels; i++) {
+ tag.setInteger("maxProgress" + i, processing.getDuration(i));
+ tag.setInteger("progress" + i, processing.getProgress(i));
+ }
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ final NBTTagCompound tag = accessor.getNBTData();
+ maxComplexParallels = tag.getInteger("maxComplexParallels");
+ for (int i = 0; i < maxComplexParallels; i++) {
+ long maxProgress = tag.getInteger("maxProgress" + i);
+ long progress = tag.getInteger("progress" + i);
+ currentTip.add(
+ "Process " + (i + 1)
+ + ": "
+ + GT_Waila
+ .getMachineProgressString(maxProgress > 0 && maxProgress >= progress, maxProgress, progress));
+ }
+ }
+
+ @Override
+ public void setProcessingLogicPower(@Nonnull P processingLogic) {
+ processingLogic.setAmperageOC(true);
+ processingLogic.setAvailableAmperage(getPowerLogic().getMaxAmperage() / maxComplexParallels);
+ processingLogic.setAvailableVoltage(getPowerLogic().getVoltage() / maxComplexParallels);
+ }
+
+ @Override
+ public void updateProcessingLogic(@Nonnull P processingLogic) {
+ processingLogic.setMaxComplexParallel(maxComplexParallels);
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java
new file mode 100644
index 0000000000..7ffdc4fb60
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java
@@ -0,0 +1,1083 @@
+package gregtech.api.multitileentity.multiblock.base;
+
+import static gregtech.api.util.GT_Utility.moveMultipleItemStacks;
+import static gregtech.common.misc.WirelessNetworkManager.strongCheckOrAddUser;
+import static mcp.mobius.waila.api.SpecialChars.*;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.lwjgl.input.Keyboard;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.alignment.IAlignment;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
+import com.gtnewhorizon.structurelib.alignment.enumerable.Flip;
+import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+
+import cpw.mods.fml.common.network.NetworkRegistry;
+import gregtech.api.enums.GT_Values.NBT;
+import gregtech.api.enums.InventoryType;
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.interfaces.IDescribable;
+import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.logic.ControllerFluidLogic;
+import gregtech.api.logic.ControllerItemLogic;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.logic.MuTEProcessingLogic;
+import gregtech.api.logic.PowerLogic;
+import gregtech.api.multitileentity.enums.MultiTileCasingPurpose;
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.interfaces.IMultiBlockPart;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_AddToolTips;
+import gregtech.api.multitileentity.machine.MultiTileBasicMachine;
+import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+import gregtech.api.net.GT_Packet_MultiTileEntity;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GT_Waila;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+/**
+ * Multi Tile Entities - or MuTEs - don't have dedicated hatches, but their casings can become hatches.
+ */
+public abstract class Controller<C extends Controller<C, P>, P extends MuTEProcessingLogic<P>>
+ extends MultiTileBasicMachine<P>
+ implements IAlignment, IMultiBlockController, IDescribable, IMTE_AddToolTips, ISurvivalConstructable {
+
+ public static final String ALL_INVENTORIES_NAME = "all";
+ protected static final int AUTO_OUTPUT_FREQUENCY_TICK = 20;
+
+ private static final Map<Integer, GT_Multiblock_Tooltip_Builder> tooltip = new ConcurrentHashMap<>();
+ private final List<UpgradeCasing> upgradeCasings = new ArrayList<>();
+ private final List<FunctionalCasing> functionalCasings = new ArrayList<>();
+ protected BuildState buildState = new BuildState();
+
+ private boolean structureOkay = false, structureChanged = false;
+ private ExtendedFacing extendedFacing = ExtendedFacing.DEFAULT;
+ private IAlignmentLimits limits = getInitialAlignmentLimits();
+ protected boolean separateInputs = getDefaultInputSeparationMode();
+ protected VoidingMode voidingMode = getDefaultVoidingMode();
+ protected boolean batchMode = getDefaultBatchMode();
+ protected boolean recipeLock = getDefaultRecipeLockingMode();
+ protected boolean shouldSort = false;
+ /** If this is set to true, the machine will get default WAILA behavior */
+ protected boolean isSimpleMachine = true;
+
+ protected boolean isCleanroom = false;
+ protected ControllerItemLogic controllerItemInput = new ControllerItemLogic();
+ protected ControllerItemLogic controllerItemOutput = new ControllerItemLogic();
+ protected ControllerFluidLogic controllerFluidInput = new ControllerFluidLogic();
+ protected ControllerFluidLogic controllerFluidOutput = new ControllerFluidLogic();
+
+ // A list of sides
+ // Each side has a list of parts that have a cover that need to be ticked
+ protected List<LinkedList<WeakReference<IMultiBlockPart>>> registeredCoveredParts = Arrays.asList(
+ new LinkedList<>(),
+ new LinkedList<>(),
+ new LinkedList<>(),
+ new LinkedList<>(),
+ new LinkedList<>(),
+ new LinkedList<>());
+
+ // A list for each purpose that a casing can register to, to be ticked
+ protected List<LinkedList<WeakReference<IMultiBlockPart>>> registeredTickableParts = new ArrayList<>();
+
+ public Controller() {
+ for (int i = 0; i < MultiTileCasingPurpose.values().length; i++) {
+ registeredTickableParts.add(new LinkedList<>());
+ }
+ }
+
+ /** Registry ID of the required casing */
+ public abstract short getCasingRegistryID();
+
+ /** Meta ID of the required casing */
+ public abstract int getCasingMeta();
+
+ /**
+ * Create the tooltip for this multi block controller.
+ */
+ protected abstract GT_Multiblock_Tooltip_Builder createTooltip();
+
+ /**
+ * @return The starting offset for the structure builder
+ */
+ public abstract Vec3Impl getStartingStructureOffset();
+
+ /**
+ * Due to limitation of Java type system, you might need to do an unchecked cast. HOWEVER, the returned
+ * IStructureDefinition is expected to be evaluated against current instance only, and should not be used against
+ * other instances, even for those of the same class.
+ */
+ @Override
+ public abstract IStructureDefinition<C> getStructureDefinition();
+
+ /**
+ * Checks the Machine.
+ * <p>
+ * NOTE: If using `buildState` be sure to `startBuilding()` and either `endBuilding()` or `failBuilding()`
+ */
+ public boolean checkMachine() {
+ calculateTier();
+ updatePowerLogic();
+ return tier > 0;
+ }
+
+ protected void calculateTier() {
+ double sum = 0;
+ if (functionalCasings == null || functionalCasings.size() == 0) {
+ return;
+ }
+ for (FunctionalCasing casing : functionalCasings) {
+ sum += casing.getPartTier() * casing.getPartModifier();
+ }
+ tier = (int) Math.min(Math.floor(sum / functionalCasings.size()), 14);
+ }
+
+ @Override
+ public void writeMultiTileNBT(NBTTagCompound nbt) {
+ super.writeMultiTileNBT(nbt);
+
+ nbt.setBoolean(NBT.STRUCTURE_OK, structureOkay);
+ nbt.setByte(
+ NBT.ROTATION,
+ (byte) extendedFacing.getRotation()
+ .getIndex());
+ nbt.setByte(
+ NBT.FLIP,
+ (byte) extendedFacing.getFlip()
+ .getIndex());
+
+ nbt.setString(NBT.VOIDING_MODE, voidingMode.name);
+ nbt.setBoolean(NBT.SEPARATE_INPUTS, separateInputs);
+ nbt.setBoolean(NBT.RECIPE_LOCK, recipeLock);
+ nbt.setBoolean(NBT.BATCH_MODE, batchMode);
+ }
+
+ @Override
+ protected void saveItemLogic(NBTTagCompound nbt) {
+ NBTTagCompound itemInputNBT = controllerItemInput.saveToNBT();
+ nbt.setTag(NBT.INV_INPUT_LIST, itemInputNBT);
+ NBTTagCompound itemOutputNBT = controllerItemOutput.saveToNBT();
+ nbt.setTag(NBT.INV_OUTPUT_LIST, itemOutputNBT);
+ }
+
+ @Override
+ protected void saveFluidLogic(NBTTagCompound nbt) {
+ NBTTagCompound fluidInputNBT = controllerFluidInput.saveToNBT();
+ nbt.setTag(NBT.TANK_IN, fluidInputNBT);
+ NBTTagCompound fluidOutputNBT = controllerFluidOutput.saveToNBT();
+ nbt.setTag(NBT.TANK_OUT, fluidOutputNBT);
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound nbt) {
+ super.readMultiTileNBT(nbt);
+
+ // Multiblock inventories are a collection of inventories. The first inventory is the default internal
+ // inventory, and the others are added by inventory extending blocks.
+
+ structureOkay = nbt.getBoolean(NBT.STRUCTURE_OK);
+ extendedFacing = ExtendedFacing
+ .of(getFrontFacing(), Rotation.byIndex(nbt.getByte(NBT.ROTATION)), Flip.byIndex(nbt.getByte(NBT.FLIP)));
+
+ voidingMode = VoidingMode.fromName(nbt.getString(NBT.VOIDING_MODE));
+ separateInputs = nbt.getBoolean(NBT.SEPARATE_INPUTS);
+ recipeLock = nbt.getBoolean(NBT.RECIPE_LOCK);
+ batchMode = nbt.getBoolean(NBT.BATCH_MODE);
+ }
+
+ @Override
+ protected void loadItemLogic(NBTTagCompound nbt) {
+ if (!nbt.hasKey(NBT.INV_INPUT_LIST) && !nbt.hasKey(NBT.INV_OUTPUT_LIST)) {
+ controllerItemInput.addInventory(new ItemInventoryLogic(16));
+ controllerItemOutput.addInventory(new ItemInventoryLogic(16));
+ return;
+ }
+ controllerItemInput.loadFromNBT(nbt.getCompoundTag(NBT.INV_INPUT_LIST));
+ controllerItemOutput.loadFromNBT(nbt.getCompoundTag(NBT.INV_OUTPUT_LIST));
+ }
+
+ @Override
+ protected void loadFluidLogic(NBTTagCompound nbt) {
+ if (!nbt.hasKey(NBT.TANK_IN) && !nbt.hasKey(NBT.TANK_OUT)) {
+ controllerFluidInput.addInventory(new FluidInventoryLogic(16, 32000));
+ controllerFluidOutput.addInventory(new FluidInventoryLogic(16, 32000));
+ return;
+ }
+ controllerFluidInput.loadFromNBT(nbt.getCompoundTag(NBT.TANK_IN));
+ controllerFluidOutput.loadFromNBT(nbt.getCompoundTag(NBT.TANK_OUT));
+ }
+
+ @Override
+ public void addToolTips(List<String> aList, ItemStack aStack, boolean aF3_H) {
+ aList.addAll(Arrays.asList(getDescription()));
+ }
+
+ @Override
+ public String[] getDescription() {
+ if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {
+ return getTooltip().getStructureInformation();
+ }
+
+ return getTooltip().getInformation();
+ }
+
+ @Override
+ protected void addDebugInfo(EntityPlayer aPlayer, int aLogLevel, ArrayList<String> tList) {
+ super.addDebugInfo(aPlayer, aLogLevel, tList);
+ tList.add("Structure ok: " + checkStructure(false));
+ }
+
+ protected int getToolTipID() {
+ return getMultiTileEntityRegistryID() << 16 + getMultiTileEntityID();
+ }
+
+ protected GT_Multiblock_Tooltip_Builder getTooltip() {
+ GT_Multiblock_Tooltip_Builder builder = tooltip.get(getToolTipID());
+ if (builder == null) {
+ builder = createTooltip();
+ tooltip.put(getToolTipID(), builder);
+ }
+ return builder;
+ }
+
+ @Override
+ public boolean checkStructure(boolean aForceReset) {
+ if (!isServerSide()) return structureOkay;
+
+ // Only trigger an update if forced (from onPostTick, generally), or if the structure has changed
+ if ((structureChanged || aForceReset)) {
+ clearSpecialLists();
+ structureOkay = checkMachine();
+ }
+ structureChanged = false;
+ return structureOkay;
+ }
+
+ @Override
+ public void onStructureChange() {
+ structureChanged = true;
+ }
+
+ public final boolean checkPiece(String piece, Vec3Impl offset) {
+ return checkPiece(piece, offset.get0(), offset.get1(), offset.get2());
+ }
+
+ /**
+ * Explanation of the world coordinate these offset means:
+ * <p>
+ * Imagine you stand in front of the controller, with controller facing towards you not rotated or flipped.
+ * <p>
+ * The horizontalOffset would be the number of blocks on the left side of the controller, not counting controller
+ * itself. The verticalOffset would be the number of blocks on the top side of the controller, not counting
+ * controller itself. The depthOffset would be the number of blocks between you and controller, not counting
+ * controller itself.
+ * <p>
+ * All these offsets can be negative.
+ */
+ protected final boolean checkPiece(String piece, int horizontalOffset, int verticalOffset, int depthOffset) {
+ return getCastedStructureDefinition().check(
+ this,
+ piece,
+ getWorld(),
+ getExtendedFacing(),
+ getXCoord(),
+ getYCoord(),
+ getZCoord(),
+ horizontalOffset,
+ verticalOffset,
+ depthOffset,
+ !structureOkay);
+ }
+
+ public final boolean buildPiece(String piece, ItemStack trigger, boolean hintsOnly, Vec3Impl offset) {
+ return buildPiece(piece, trigger, hintsOnly, offset.get0(), offset.get1(), offset.get2());
+ }
+
+ protected final boolean buildPiece(String piece, ItemStack trigger, boolean hintOnly, int horizontalOffset,
+ int verticalOffset, int depthOffset) {
+ return getCastedStructureDefinition().buildOrHints(
+ this,
+ trigger,
+ piece,
+ getWorld(),
+ getExtendedFacing(),
+ getXCoord(),
+ getYCoord(),
+ getZCoord(),
+ horizontalOffset,
+ verticalOffset,
+ depthOffset,
+ hintOnly);
+ }
+
+ protected final int survivalBuildPiece(String piece, ItemStack trigger, Vec3Impl offset, int elementBudget,
+ ISurvivalBuildEnvironment env, boolean check) {
+ return survivalBuildPiece(
+ piece,
+ trigger,
+ offset.get0(),
+ offset.get1(),
+ offset.get2(),
+ elementBudget,
+ env,
+ check);
+ }
+
+ protected final Integer survivalBuildPiece(String piece, ItemStack trigger, int horizontalOffset,
+ int verticalOffset, int depthOffset, int elementBudget, ISurvivalBuildEnvironment env, boolean check) {
+ return getCastedStructureDefinition().survivalBuild(
+ this,
+ trigger,
+ piece,
+ getWorld(),
+ getExtendedFacing(),
+ getXCoord(),
+ getYCoord(),
+ getZCoord(),
+ horizontalOffset,
+ verticalOffset,
+ depthOffset,
+ elementBudget,
+ env,
+ check);
+ }
+
+ @SuppressWarnings("unchecked")
+ private IStructureDefinition<Controller<C, P>> getCastedStructureDefinition() {
+ return (IStructureDefinition<Controller<C, P>>) getStructureDefinition();
+ }
+
+ @Override
+ public ExtendedFacing getExtendedFacing() {
+ return extendedFacing;
+ }
+
+ @Override
+ public void setExtendedFacing(ExtendedFacing newExtendedFacing) {
+ if (extendedFacing == newExtendedFacing) {
+ return;
+ }
+
+ onStructureChange();
+ if (structureOkay) stopMachine(false);
+ extendedFacing = newExtendedFacing;
+ structureOkay = false;
+ if (isServerSide()) {
+ StructureLibAPI.sendAlignment(
+ this,
+ new NetworkRegistry.TargetPoint(
+ getWorld().provider.dimensionId,
+ getXCoord(),
+ getYCoord(),
+ getZCoord(),
+ 512));
+ } else {
+ issueTextureUpdate();
+ }
+
+ }
+
+ @Override
+ public boolean onWrenchRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide, float aX,
+ float aY, float aZ, ItemStack aTool) {
+ if (wrenchSide != getFrontFacing())
+ return super.onWrenchRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ);
+ if (aPlayer.isSneaking()) {
+ // we won't be allowing horizontal flips, as it can be perfectly emulated by rotating twice and flipping
+ // horizontally allowing an extra round of flip make it hard to draw meaningful flip markers in
+ // GT_Proxy#drawGrid
+ toolSetFlip(getFlip().isHorizontallyFlipped() ? Flip.NONE : Flip.HORIZONTAL);
+ } else {
+ toolSetRotation(null);
+ }
+ return true;
+ }
+
+ @Override
+ public void registerCoveredPartOnSide(final ForgeDirection side, IMultiBlockPart part) {
+ if (side == ForgeDirection.UNKNOWN) return;
+
+ final LinkedList<WeakReference<IMultiBlockPart>> registeredCovers = registeredCoveredParts.get(side.ordinal());
+ // TODO: Make sure that we're not already registered on this side
+ registeredCovers.add(new WeakReference<>(part));
+ }
+
+ @Override
+ public void unregisterCoveredPartOnSide(final ForgeDirection side, IMultiBlockPart aPart) {
+ if (side == ForgeDirection.UNKNOWN) return;
+
+ final LinkedList<WeakReference<IMultiBlockPart>> coveredParts = registeredCoveredParts.get(side.ordinal());
+ final Iterator<WeakReference<IMultiBlockPart>> it = coveredParts.iterator();
+ while (it.hasNext()) {
+ final IMultiBlockPart part = (it.next()).get();
+ if (part == null || part == aPart) it.remove();
+ }
+ }
+
+ @Override
+ public void registerCaseWithPurpose(MultiTileCasingPurpose purpose, IMultiBlockPart part) {
+ final LinkedList<WeakReference<IMultiBlockPart>> tickableParts = registeredTickableParts.get(purpose.ordinal());
+ final Iterator<WeakReference<IMultiBlockPart>> it = tickableParts.iterator();
+ while (it.hasNext()) {
+ final IMultiBlockPart next = (it.next()).get();
+ if (next == null) {
+ it.remove();
+ } else if (next == part) {
+ return;
+ }
+ }
+ tickableParts.add(new WeakReference<>(part));
+ }
+
+ @Override
+ public void unregisterCaseWithPurpose(MultiTileCasingPurpose purpose, IMultiBlockPart part) {
+ final LinkedList<WeakReference<IMultiBlockPart>> tickableParts = registeredTickableParts.get(purpose.ordinal());
+ final Iterator<WeakReference<IMultiBlockPart>> it = tickableParts.iterator();
+ while (it.hasNext()) {
+ final IMultiBlockPart next = (it.next()).get();
+ if (next == null || next == part) it.remove();
+ }
+ }
+
+ @Override
+ public void onFirstTick(boolean isServerSide) {
+ super.onFirstTick(isServerSide);
+ if (isServerSide) {
+ checkStructure(true);
+ } else {
+ StructureLibAPI.queryAlignment(this);
+ }
+ }
+
+ private boolean tickCovers() {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ // TODO: Tick controller covers, if any
+ final LinkedList<WeakReference<IMultiBlockPart>> coveredParts = this.registeredCoveredParts
+ .get(side.ordinal());
+ final Iterator<WeakReference<IMultiBlockPart>> it = coveredParts.iterator();
+ while (it.hasNext()) {
+ final IMultiBlockPart part = (it.next()).get();
+ if (part == null) {
+ it.remove();
+ continue;
+ }
+ if (!part.tickCoverAtSide(side, mTickTimer)) it.remove();
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public void onTick(long tick, boolean isServerSide) {
+ if (!tickCovers()) {
+ return;
+ }
+ }
+
+ @Override
+ public void onPostTick(long tick, boolean isServerSide) {
+ if (!isServerSide) { // client side
+ doActivitySound(getActivitySoundLoop());
+ return;
+ }
+
+ // server side
+ if (tick % 600 == 5) {
+ // Recheck the structure every 30 seconds or so
+ if (!checkStructure(false)) checkStructure(true);
+ }
+ if (checkStructure(false)) {
+ runMachine(tick);
+ pushItemOutputs(tick);
+ pushFluidOutputs(tick);
+
+ } else {
+ stopMachine(false);
+ }
+
+ }
+
+ protected void pushItemOutputs(long tick) {
+ if (tick % AUTO_OUTPUT_FREQUENCY_TICK != 0) return;
+ final LinkedList<WeakReference<IMultiBlockPart>> registeredItemOutputs = registeredTickableParts
+ .get(MultiTileCasingPurpose.ItemOutput.ordinal());
+ final Iterator<WeakReference<IMultiBlockPart>> itemOutputIterator = registeredItemOutputs.iterator();
+ while (itemOutputIterator.hasNext()) {
+ final IMultiBlockPart part = (itemOutputIterator.next()).get();
+ if (part == null) {
+ itemOutputIterator.remove();
+ continue;
+ }
+ if (!part.shouldTick(mTickTimer)) {
+ itemOutputIterator.remove();
+ continue;
+ }
+
+ final IInventory facingInventory = part.getIInventoryAtSide(part.getFrontFacing());
+ if (facingInventory == null) {
+ continue;
+ }
+
+ moveMultipleItemStacks(
+ part,
+ facingInventory,
+ part.getFrontFacing(),
+ part.getBackFacing(),
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1,
+ part.getSizeInventory());
+ for (int i = 0; i < part.getSizeInventory(); i++) {
+ if (part.getStackInSlot(i) != null && part.getStackInSlot(i).stackSize <= 0) {
+ part.setInventorySlotContents(i, null);
+ }
+ }
+
+ }
+ }
+
+ protected void pushFluidOutputs(long tick) {
+ if (tick % AUTO_OUTPUT_FREQUENCY_TICK != 0) return;
+ final LinkedList<WeakReference<IMultiBlockPart>> registeredFluidOutputs = registeredTickableParts
+ .get(MultiTileCasingPurpose.FluidOutput.ordinal());
+ final Iterator<WeakReference<IMultiBlockPart>> fluidOutputIterator = registeredFluidOutputs.iterator();
+ while (fluidOutputIterator.hasNext()) {
+ final IMultiBlockPart part = (fluidOutputIterator.next()).get();
+ if (part == null) {
+ fluidOutputIterator.remove();
+ continue;
+ }
+ if (!part.shouldTick(mTickTimer)) {
+ fluidOutputIterator.remove();
+ }
+ }
+ }
+
+ @Override
+ public void setCleanroom(boolean cleanroom) {
+ isCleanroom = cleanroom;
+ }
+
+ protected void clearSpecialLists() {
+ upgradeCasings.clear();
+ functionalCasings.clear();
+ }
+
+ @Override
+ public final boolean isFacingValid(ForgeDirection facing) {
+ return canSetToDirectionAny(facing);
+ }
+
+ @Override
+ public void onFacingChange() {
+ toolSetDirection(getFrontFacing());
+ onStructureChange();
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) {
+ return side != facing;
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return getTooltip().getStructureHint();
+ }
+
+ @Override
+ public IAlignmentLimits getAlignmentLimits() {
+ return limits;
+ }
+
+ protected void setAlignmentLimits(IAlignmentLimits mLimits) {
+ this.limits = mLimits;
+ }
+
+ public boolean isSeparateInputs() {
+ return separateInputs;
+ }
+
+ public void setSeparateInputs(boolean aSeparateInputs) {
+ separateInputs = aSeparateInputs;
+ }
+
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> !f.isVerticallyFliped();
+ }
+
+ public static class BuildState {
+
+ /**
+ * Utility class to keep track of the build state of a multiblock
+ */
+ boolean building = false;
+
+ Vec3Impl currentOffset;
+
+ public void startBuilding(Vec3Impl structureOffset) {
+ if (building) throw new IllegalStateException("Already building!");
+ building = true;
+ setCurrentOffset(structureOffset);
+ }
+
+ public Vec3Impl setCurrentOffset(Vec3Impl structureOffset) {
+ verifyBuilding();
+ return (currentOffset = structureOffset);
+ }
+
+ private void verifyBuilding() {
+ if (!building) throw new IllegalStateException("Not building!");
+ }
+
+ public boolean failBuilding() {
+ building = false;
+ currentOffset = null;
+ return false;
+ }
+
+ public Vec3Impl stopBuilding() {
+ final Vec3Impl toReturn = getCurrentOffset();
+ building = false;
+ currentOffset = null;
+
+ return toReturn;
+ }
+
+ public Vec3Impl getCurrentOffset() {
+ verifyBuilding();
+ return currentOffset;
+ }
+
+ public Vec3Impl addOffset(Vec3Impl offset) {
+ verifyBuilding();
+ return setCurrentOffset(currentOffset.add(offset));
+ }
+ }
+
+ public void registerSpecialCasings(MultiBlockPart part) {
+ if (part instanceof UpgradeCasing) {
+ upgradeCasings.add((UpgradeCasing) part);
+ }
+ if (part instanceof FunctionalCasing) {
+ functionalCasings.add((FunctionalCasing) part);
+ }
+ }
+
+ // #region Fluid - MultiBlock related Fluid Tank behaviour.
+
+ @Override
+ @Nullable
+ public FluidInventoryLogic getFluidLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType type) {
+ if (side == facing) return null;
+ return switch (type) {
+ case Input -> controllerFluidInput.getAllInventoryLogics();
+ case Output -> controllerFluidOutput.getAllInventoryLogics();
+ default -> null;
+ };
+ }
+
+ @Nullable
+ public FluidInventoryLogic getFluidLogic(@Nonnull InventoryType type, @Nullable UUID id) {
+ return switch (type) {
+ case Input -> controllerFluidInput.getInventoryLogic(id);
+ case Output -> controllerFluidOutput.getInventoryLogic(id);
+ default -> null;
+ };
+ }
+
+ @Override
+ @Nonnull
+ public UUID registerFluidInventory(int tanks, long capacity, int tier, @Nonnull InventoryType type,
+ boolean isUpgradeInventory) {
+ return switch (type) {
+ case Input -> controllerFluidInput
+ .addInventory(new FluidInventoryLogic(tanks, capacity, tier, isUpgradeInventory));
+ case Output -> controllerFluidOutput
+ .addInventory(new FluidInventoryLogic(tanks, capacity, tier, isUpgradeInventory));
+ case Both -> {
+ UUID id = controllerFluidInput
+ .addInventory(new FluidInventoryLogic(tanks, capacity, tier, isUpgradeInventory));
+ controllerFluidOutput
+ .addInventory(id, new FluidInventoryLogic(tanks, capacity, tier, isUpgradeInventory));
+ yield id;
+ }
+ };
+ }
+
+ @Override
+ @Nonnull
+ public FluidInventoryLogic unregisterFluidInventory(@Nonnull UUID id, @Nonnull InventoryType type) {
+ return switch (type) {
+ case Input -> controllerFluidInput.removeInventory(id);
+ case Output -> controllerFluidOutput.removeInventory(id);
+ case Both -> {
+ FluidInventoryLogic input = controllerFluidInput.removeInventory(id);
+ FluidInventoryLogic output = controllerFluidOutput.removeInventory(id);
+ yield new FluidInventoryLogic(
+ Arrays.asList(input, output)
+ .stream()
+ .map(inv -> inv.getInventory())
+ .collect(Collectors.toList()));
+ }
+ };
+ }
+
+ @Override
+ public void changeFluidInventoryDisplayName(@Nullable UUID id, @Nullable String displayName,
+ @Nonnull InventoryType type) {
+ switch (type) {
+ case Input:
+ controllerFluidInput.setInventoryDisplayName(id, displayName);
+ break;
+ case Output:
+ controllerFluidOutput.setInventoryDisplayName(id, displayName);
+ break;
+ case Both:
+ controllerFluidInput.setInventoryDisplayName(id, displayName);
+ controllerFluidOutput.setInventoryDisplayName(id, displayName);
+ break;
+ }
+ }
+
+ // #endregion Fluid
+
+ // #region Item - MultiBlock related Item behaviour.
+
+ @Override
+ @Nullable
+ public ItemInventoryLogic getItemLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType type) {
+ if (side == facing) return null;
+ return switch (type) {
+ case Input -> controllerItemInput.getAllInventoryLogics();
+ case Output -> controllerItemOutput.getAllInventoryLogics();
+ default -> null;
+ };
+ }
+
+ @Override
+ @Nullable
+ public ItemInventoryLogic getItemLogic(@Nonnull InventoryType type, @Nullable UUID id) {
+ return switch (type) {
+ case Input -> controllerItemInput.getInventoryLogic(id);
+ case Output -> controllerItemOutput.getInventoryLogic(id);
+ default -> null;
+ };
+ }
+
+ @Override
+ @Nonnull
+ public UUID registerItemInventory(int slots, int tier, @Nonnull InventoryType type, boolean isUpgradeInventory) {
+ return switch (type) {
+ case Input -> controllerItemInput.addInventory(new ItemInventoryLogic(slots, tier, isUpgradeInventory));
+ case Output -> controllerItemOutput.addInventory(new ItemInventoryLogic(slots, tier, isUpgradeInventory));
+ case Both -> {
+ UUID id = controllerItemInput.addInventory(new ItemInventoryLogic(slots, tier, isUpgradeInventory));
+ controllerItemOutput.addInventory(id, new ItemInventoryLogic(slots, tier, isUpgradeInventory));
+ yield id;
+ }
+ };
+ }
+
+ @Override
+ public ItemInventoryLogic unregisterItemInventory(@Nonnull UUID id, @Nonnull InventoryType type) {
+ return switch (type) {
+ case Input -> controllerItemInput.removeInventory(id);
+ case Output -> controllerItemOutput.removeInventory(id);
+ case Both -> {
+ ItemInventoryLogic input = controllerItemInput.removeInventory(id);
+ ItemInventoryLogic output = controllerItemOutput.removeInventory(id);
+ yield new ItemInventoryLogic(
+ Arrays.asList(input, output)
+ .stream()
+ .map(inv -> inv.getInventory())
+ .collect(Collectors.toList()));
+ }
+ };
+ }
+
+ @Override
+ public void changeItemInventoryDisplayName(@Nullable UUID id, @Nullable String displayName,
+ @Nonnull InventoryType type) {
+ switch (type) {
+ case Input:
+ controllerItemInput.setInventoryDisplayName(id, displayName);
+ break;
+ case Output:
+ controllerItemOutput.setInventoryDisplayName(id, displayName);
+ break;
+ case Both:
+ controllerItemInput.setInventoryDisplayName(id, displayName);
+ controllerItemOutput.setInventoryDisplayName(id, displayName);
+ break;
+ }
+ }
+
+ // #endregion Item
+
+ // #region Energy
+
+ @Nonnull
+ @Override
+ public PowerLogic getPowerLogic() {
+ return getPowerLogic(ForgeDirection.UNKNOWN);
+ }
+
+ // #endregion Energy
+
+ @Override
+ protected void updateSlots() {
+ controllerItemInput.getAllInventoryLogics()
+ .update(shouldSort);
+ controllerItemOutput.getAllInventoryLogics()
+ .update(shouldSort);
+ controllerFluidInput.getAllInventoryLogics()
+ .update();
+ controllerFluidOutput.getAllInventoryLogics()
+ .update();
+ }
+
+ /*
+ * GUI Work - Multiblock GUI related methods
+ */
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public boolean hasGui(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ protected void addTitleTextStyle(ModularWindow.Builder builder, String title) {
+ // leave empty
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public VoidingMode getVoidingMode() {
+ return voidingMode;
+ }
+
+ @Override
+ public void setVoidingMode(VoidingMode mode) {
+ this.voidingMode = mode;
+ }
+
+ @Override
+ public boolean canDumpItemToME() {
+ return false;
+ }
+
+ @Override
+ public boolean canDumpFluidToME() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputSeparated() {
+ return separateInputs;
+ }
+
+ @Override
+ public void setInputSeparation(Boolean enabled) {
+ this.separateInputs = enabled;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+
+ @Override
+ public boolean isBatchModeEnabled() {
+ return batchMode;
+ }
+
+ @Override
+ public void setBatchMode(Boolean mode) {
+ this.batchMode = mode;
+ }
+
+ @Override
+ public boolean supportsSingleRecipeLocking() {
+ return false;
+ }
+
+ @Override
+ public boolean isRecipeLockingEnabled() {
+ return recipeLock;
+ }
+
+ @Override
+ public void setRecipeLocking(Boolean enabled) {
+ this.recipeLock = enabled;
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ P processing = getProcessingLogic();
+ tag.setInteger("progress", processing.getProgress());
+ tag.setInteger("maxProgress", processing.getDuration());
+ tag.setBoolean("structureOkay", structureOkay);
+ tag.setBoolean("isActive", isActive());
+ if (isActive()) {
+ tag.setLong("energyUsage", getProcessingLogic().getCalculatedEut());
+ tag.setLong("energyTier", tier);
+ }
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ final NBTTagCompound tag = accessor.getNBTData();
+ if (!tag.getBoolean("structureOkay")) {
+ currentTip.add(RED + "** INCOMPLETE STRUCTURE **" + RESET);
+ } else {
+ currentTip.add((GREEN + "Running Fine") + RESET);
+ }
+ if (isSimpleMachine) {
+ boolean isActive = tag.getBoolean("isActive");
+ currentTip.add(
+ GT_Waila.getMachineProgressString(isActive, tag.getInteger("maxProgress"), tag.getInteger("progress")));
+ }
+ boolean isActive = tag.getBoolean("isActive");
+ if (isActive) {
+ long energyTier = tag.getLong("energyTier");
+ long actualEnergyUsage = tag.getLong("energyUsage");
+ if (actualEnergyUsage > 0) {
+ currentTip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.use_with_amperage",
+ GT_Utility.formatNumbers(actualEnergyUsage),
+ GT_Utility.getAmperageForTier(actualEnergyUsage, (byte) energyTier),
+ GT_Utility.getColoredTierNameFromTier((byte) energyTier)));
+ } else if (actualEnergyUsage < 0) {
+ currentTip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.produce_with_amperage",
+ GT_Utility.formatNumbers(-actualEnergyUsage),
+ GT_Utility.getAmperageForTier(-actualEnergyUsage, (byte) energyTier),
+ GT_Utility.getColoredTierNameFromTier((byte) energyTier)));
+ }
+ }
+ }
+
+ @Override
+ public GT_Packet_MultiTileEntity getClientDataPacket() {
+ final GT_Packet_MultiTileEntity packet = super.getClientDataPacket();
+
+ return packet;
+
+ }
+
+ @Override
+ public void enableWorking() {
+ super.enableWorking();
+ if (!structureOkay) {
+ checkStructure(true);
+ }
+ }
+
+ @Override
+ public List<ItemStack> getItemOutputSlots(ItemStack[] toOutput) {
+ return new ArrayList<>(0);
+ }
+
+ @Override
+ public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
+ return new ArrayList<>(0);
+ }
+
+ @Override
+ @Nonnull
+ public Set<Entry<UUID, FluidInventoryLogic>> getAllFluidInventoryLogics(@Nonnull InventoryType type) {
+ return switch (type) {
+ case Input -> controllerFluidInput.getAllInventoryLogicsAsEntrySet();
+ case Output -> controllerFluidOutput.getAllInventoryLogicsAsEntrySet();
+ default -> super.getAllFluidInventoryLogics(type);
+ };
+ }
+
+ @Override
+ @Nonnull
+ public Set<Entry<UUID, ItemInventoryLogic>> getAllItemInventoryLogics(@Nonnull InventoryType type) {
+ return switch (type) {
+ case Input -> controllerItemInput.getAllInventoryLogicsAsEntrySet();
+ case Output -> controllerItemOutput.getAllInventoryLogicsAsEntrySet();
+ default -> super.getAllItemInventoryLogics(type);
+ };
+ }
+
+ @Override
+ public void setWirelessSupport(boolean canUse) {
+ if (canUse) {
+ strongCheckOrAddUser(getOwnerUuid());
+ }
+ power.setCanUseWireless(canUse, getOwnerUuid());
+ }
+
+ @Override
+ public void setLaserSupport(boolean canUse) {
+ power.setCanUseLaser(canUse);
+ }
+
+ @Override
+ public void setMaxAmperage(long amperage) {
+ power.setMaxAmperage(amperage);
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
new file mode 100644
index 0000000000..5331d1477d
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
@@ -0,0 +1,711 @@
+package gregtech.api.multitileentity.multiblock.base;
+
+import static com.google.common.math.LongMath.log2;
+import static gregtech.api.enums.GT_Values.B;
+import static gregtech.api.enums.Textures.BlockIcons.FLUID_IN_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.FLUID_OUT_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.ITEM_IN_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.ITEM_OUT_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_IN_MULTI;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_OUT_MULTI;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
+
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+
+import gregtech.api.enums.GT_Values.NBT;
+import gregtech.api.enums.InventoryType;
+import gregtech.api.fluid.FluidTankGT;
+import gregtech.api.gui.GUIHost;
+import gregtech.api.gui.GUIProvider;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.logic.NullPowerLogic;
+import gregtech.api.logic.PowerLogic;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.multitileentity.MultiTileEntityRegistry;
+import gregtech.api.multitileentity.base.NonTickableMultiTileEntity;
+import gregtech.api.multitileentity.enums.MultiTileCasingPurpose;
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.interfaces.IMultiBlockPart;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_HasModes;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.covers.CoverInfo;
+import gregtech.common.gui.PartGUIProvider;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public abstract class MultiBlockPart extends NonTickableMultiTileEntity
+ implements IMultiBlockPart, IMTE_HasModes, PowerLogicHost, IMultiTileEntity.IMTE_AddToolTips, GUIHost {
+
+ public static final int NOTHING = 0, ENERGY_IN = B[0], ENERGY_OUT = B[1], FLUID_IN = B[2], FLUID_OUT = B[3],
+ ITEM_IN = B[4], ITEM_OUT = B[5];
+
+ protected final List<Integer> BASIC_MODES = new ArrayList<>(
+ Arrays.asList(NOTHING, ENERGY_IN, ENERGY_OUT, FLUID_IN, FLUID_OUT, ITEM_IN, ITEM_OUT));
+
+ protected Set<MultiTileCasingPurpose> registeredPurposes = new HashSet<>();
+
+ protected ChunkCoordinates targetPosition = null;
+
+ protected int allowedModes = NOTHING; // BITMASK - Modes allowed for this part
+ protected int mode = 0; // Mode selected for this part
+
+ protected UUID lockedInventory;
+ protected int mLockedInventoryIndex = 0;
+ protected FluidTankGT configurationTank = new FluidTankGT();
+
+ @Nonnull
+ protected final GUIProvider<?> guiProvider = createGUIProvider();
+
+ /**
+ * What Part Tier is this part? All Basic Casings are Tier 1, and will allow: Energy, Item, Fluid input/output. Some
+ * of the more advanced modes can be set to require a higher tier part.
+ */
+ public int getPartTier() {
+ return 1;
+ }
+
+ @Override
+ public UUID getLockedInventory() {
+ return lockedInventory;
+ }
+
+ public void setTarget(IMultiBlockController newTarget, int aAllowedModes) {
+ IMultiBlockController currentTarget = getTarget(false);
+ if (currentTarget != null && currentTarget != newTarget) {
+ for (MultiTileCasingPurpose purpose : registeredPurposes) {
+ unregisterPurpose(purpose);
+ }
+ }
+ targetPosition = (newTarget == null ? null : newTarget.getCoords());
+ allowedModes = aAllowedModes;
+ if (newTarget != null) {
+ registerCovers(newTarget);
+ registerPurposes();
+ }
+ }
+
+ protected void registerPurpose(MultiTileCasingPurpose purpose) {
+ IMultiBlockController target = getTarget(false);
+ if (target != null) {
+ target.registerCaseWithPurpose(purpose, this);
+ registeredPurposes.add(purpose);
+ }
+ }
+
+ protected void unregisterPurpose(MultiTileCasingPurpose purpose) {
+ IMultiBlockController target = getTarget(false);
+ if (target != null) {
+ target.unregisterCaseWithPurpose(purpose, this);
+ }
+ registeredPurposes.remove(purpose);
+ }
+
+ @Override
+ protected void addDebugInfo(EntityPlayer aPlayer, int aLogLevel, ArrayList<String> tList) {
+ final IMultiBlockController controller = getTarget(false);
+ if (controller != null) {
+ tList.add("Has controller");
+ } else {
+ tList.add("No Controller");
+ }
+ tList.add("Casing Mode: " + getModeName(mode));
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ currentTip.add(String.format("Mode: %s", getModeName(mode)));
+ if (modeSelected(FLUID_OUT)) {
+ if (configurationTank != null && configurationTank.get() != null) {
+ currentTip.add(
+ String.format(
+ "Locked to: %s",
+ configurationTank.get()
+ .getLocalizedName()));
+ } else {
+ currentTip.add("Locked to: Nothing");
+ }
+ }
+ }
+
+ public IMultiBlockController getTarget(boolean aCheckValidity) {
+ if (targetPosition == null) {
+ return null;
+ }
+
+ if (!worldObj.blockExists(targetPosition.posX, targetPosition.posY, targetPosition.posZ)) {
+ return null;
+ }
+ final TileEntity te = worldObj.getTileEntity(targetPosition.posX, targetPosition.posY, targetPosition.posZ);
+ IMultiBlockController target = null;
+ if (te instanceof IMultiBlockController targetFound) {
+ target = targetFound;
+ } else {
+ targetPosition = null;
+ return null;
+ }
+
+ if (aCheckValidity) {
+ return target != null && target.checkStructure(false) ? target : null;
+ }
+ return target;
+ }
+
+ public void registerCovers(IMultiBlockController controller) {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (coverInfo.isValid() && coverInfo.getTickRate() > 0) {
+ controller.registerCoveredPartOnSide(side, this);
+ }
+ }
+ }
+
+ protected void registerPurposes() {
+ for (MultiTileCasingPurpose purpose : registeredPurposes) {
+ registerPurpose(purpose);
+ }
+ }
+
+ @Override
+ public void setCoverItemAtSide(ForgeDirection side, ItemStack aCover) {
+ super.setCoverItemAtSide(side, aCover);
+ // TODO: Filter on tickable covers
+ final IMultiBlockController tTarget = getTarget(true);
+ if (tTarget == null) {
+ return;
+ }
+
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (coverInfo.isValid() && coverInfo.getTickRate() > 0) {
+ tTarget.registerCoveredPartOnSide(side, this);
+ }
+
+ }
+
+ public void unregisterCovers(IMultiBlockController controller) {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (getCoverInfoAtSide(side).isValid()) {
+ controller.unregisterCoveredPartOnSide(side, this);
+ }
+ }
+ }
+
+ @Override
+ public boolean dropCover(ForgeDirection side, ForgeDirection droppedSide, boolean aForced) {
+ final boolean res = super.dropCover(side, droppedSide, aForced);
+ final IMultiBlockController tTarget = getTarget(true);
+ if (tTarget != null) {
+ tTarget.unregisterCoveredPartOnSide(side, this);
+ }
+ return res;
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound aNBT) {
+ if (aNBT.hasKey(NBT.ALLOWED_MODES)) allowedModes = aNBT.getInteger(NBT.ALLOWED_MODES);
+ if (aNBT.hasKey(NBT.MODE)) setMode(aNBT.getByte(NBT.MODE));
+ if (aNBT.hasKey(NBT.TARGET)) {
+ targetPosition = new ChunkCoordinates(
+ aNBT.getInteger(NBT.TARGET_X),
+ aNBT.getShort(NBT.TARGET_Y),
+ aNBT.getInteger(NBT.TARGET_Z));
+ }
+ if (aNBT.hasKey(NBT.LOCKED_INVENTORY)) {
+ lockedInventory = UUID.fromString(aNBT.getString(NBT.LOCKED_INVENTORY));
+ }
+ if (aNBT.hasKey(NBT.LOCKED_INVENTORY_INDEX)) {
+ mLockedInventoryIndex = aNBT.getInteger(NBT.LOCKED_INVENTORY_INDEX);
+ }
+ if (aNBT.hasKey(NBT.LOCKED_FLUID)) {
+ configurationTank.readFromNBT(aNBT, NBT.LOCKED_FLUID);
+ }
+ if (modeSelected(ITEM_OUT)) {
+ registeredPurposes.add(MultiTileCasingPurpose.ItemOutput);
+ }
+ if (modeSelected(FLUID_OUT)) {
+ registeredPurposes.add(MultiTileCasingPurpose.FluidOutput);
+ }
+ }
+
+ @Override
+ public void writeMultiTileNBT(NBTTagCompound aNBT) {
+ if (allowedModes != NOTHING) aNBT.setInteger(NBT.ALLOWED_MODES, allowedModes);
+ if (mode != 0) aNBT.setInteger(NBT.MODE, mode);
+ if (targetPosition != null) {
+ aNBT.setBoolean(NBT.TARGET, true);
+ aNBT.setInteger(NBT.TARGET_X, targetPosition.posX);
+ aNBT.setShort(NBT.TARGET_Y, (short) targetPosition.posY);
+ aNBT.setInteger(NBT.TARGET_Z, targetPosition.posZ);
+ }
+ if (lockedInventory != null) {
+ aNBT.setString(NBT.LOCKED_INVENTORY, lockedInventory.toString());
+ }
+ if (mLockedInventoryIndex != 0) {
+ aNBT.setInteger(NBT.LOCKED_INVENTORY_INDEX, mLockedInventoryIndex);
+ }
+ configurationTank.writeToNBT(aNBT, NBT.LOCKED_FLUID);
+ }
+
+ @Override
+ public void setLockedInventoryIndex(int aIndex) {
+ mLockedInventoryIndex = aIndex;
+ }
+
+ @Override
+ public int getLockedInventoryIndex() {
+ return mLockedInventoryIndex;
+ }
+
+ @Override
+ public void setTargetPos(ChunkCoordinates aTargetPos) {
+ targetPosition = aTargetPos;
+ IMultiBlockController target = getTarget(false);
+ setTarget(target, allowedModes);
+ }
+
+ @Override
+ public ChunkCoordinates getTargetPos() {
+ return targetPosition;
+ }
+
+ @Override
+ public void setMode(int mode) {
+ if (this.mode == mode) return;
+ if (modeSelected(FLUID_OUT)) {
+ unregisterPurpose(MultiTileCasingPurpose.FluidOutput);
+ }
+ if (modeSelected(ITEM_OUT)) {
+ unregisterPurpose(MultiTileCasingPurpose.ItemOutput);
+ }
+ this.mode = mode;
+ if (modeSelected(FLUID_OUT)) {
+ registerPurpose(MultiTileCasingPurpose.FluidOutput);
+ }
+ if (modeSelected(ITEM_OUT)) {
+ registerPurpose(MultiTileCasingPurpose.ItemOutput);
+ }
+ }
+
+ @Override
+ public int getMode() {
+ return mode;
+ }
+
+ @Override
+ public int getAllowedModes() {
+ return allowedModes;
+ }
+
+ @Override
+ public void setAllowedModes(int aAllowedModes) {
+ allowedModes = aAllowedModes;
+ }
+
+ /**
+ * True if `aMode` is one of the allowed modes
+ */
+ public boolean hasMode(int aMode) {
+ // This is not sent to the client
+ return (allowedModes & aMode) != 0;
+ }
+
+ /**
+ * Returns true if the part has any of the modes provided, and that mode is the currently selected mode
+ */
+ public boolean modeSelected(int... aModes) {
+ for (int aMode : aModes) {
+ if (hasMode(aMode) && mode == getModeOrdinal(aMode)) return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean breakBlock() {
+ final IMultiBlockController tTarget = getTarget(false);
+ if (tTarget != null) {
+ unregisterCovers(tTarget);
+ tTarget.onStructureChange();
+ }
+ return false;
+ }
+
+ @Override
+ public void onBlockAdded() {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final TileEntity te = getTileEntityAtSide(side);
+ if (te instanceof MultiBlockPart part) {
+ final IMultiBlockController tController = part.getTarget(false);
+ if (tController != null) tController.onStructureChange();
+ } else if (te instanceof IMultiBlockController controller) {
+ controller.onStructureChange();
+ }
+ }
+ }
+
+ @Override
+ public ITexture getTexture(ForgeDirection side) {
+ ITexture texture = super.getTexture(side);
+ if (mode != 0 && side == facing) {
+ if (mode == getModeOrdinal(ITEM_IN)) {
+ return TextureFactory.of(
+ texture,
+ TextureFactory.of(OVERLAY_PIPE_IN),
+ TextureFactory.of(ITEM_IN_SIGN),
+ getCoverTexture(side));
+ }
+ if (mode == getModeOrdinal(ITEM_OUT)) {
+ return TextureFactory.of(
+ texture,
+ TextureFactory.of(OVERLAY_PIPE_OUT),
+ TextureFactory.of(ITEM_OUT_SIGN),
+ getCoverTexture(side));
+ }
+ if (mode == getModeOrdinal(FLUID_IN)) {
+ return TextureFactory.of(
+ texture,
+ TextureFactory.of(OVERLAY_PIPE_IN),
+ TextureFactory.of(FLUID_IN_SIGN),
+ getCoverTexture(side));
+ }
+ if (mode == getModeOrdinal(FLUID_OUT)) {
+ return TextureFactory.of(
+ texture,
+ TextureFactory.of(OVERLAY_PIPE_OUT),
+ TextureFactory.of(FLUID_OUT_SIGN),
+ getCoverTexture(side));
+ }
+ if (mode == getModeOrdinal(ENERGY_IN)) {
+ return TextureFactory.of(texture, TextureFactory.of(OVERLAY_ENERGY_IN_MULTI), getCoverTexture(side));
+ }
+ if (mode == getModeOrdinal(ENERGY_OUT)) {
+ return TextureFactory.of(texture, TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI), getCoverTexture(side));
+ }
+ }
+
+ return TextureFactory.of(texture, getCoverTexture(side));
+ }
+
+ protected String getModeName(int aMode) {
+ if (aMode == NOTHING) return "Nothing";
+ if (aMode == getModeOrdinal(ITEM_IN)) return "Item Input";
+ if (aMode == getModeOrdinal(ITEM_OUT)) return "Item Output";
+ if (aMode == getModeOrdinal(FLUID_IN)) return "Fluid Input";
+ if (aMode == getModeOrdinal(FLUID_OUT)) return "Fluid Output";
+ if (aMode == getModeOrdinal(ENERGY_IN)) return "Energy Input";
+ if (aMode == getModeOrdinal(ENERGY_OUT)) return "Energy Output";
+ return "Unknown";
+ }
+
+ protected byte getModeOrdinal(int aMode) {
+ // log2 returns the bit position of the only bit set, add 1 to account for 0 being NOTHING
+ // NOTE: Must be a power of 2 (single bit)
+ return (byte) (log2(aMode, RoundingMode.UNNECESSARY) + 1);
+ }
+
+ protected byte getNextAllowedMode(List<Integer> allowedModes) {
+ if (this.allowedModes == NOTHING) return NOTHING;
+
+ final int numModes = allowedModes.size();
+ for (byte i = 1; i <= numModes; i++) {
+ final byte curMode = (byte) ((mode + i) % numModes);
+ if (curMode == NOTHING || hasMode(1 << (curMode - 1))) return curMode;
+ }
+ // Nothing valid found
+ return 0;
+ }
+
+ @Override
+ public boolean onMalletRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide, float aX,
+ float aY, float aZ) {
+ if (allowedModes == NOTHING) return true;
+ if (mode == NOTHING) {
+ facing = wrenchSide;
+ }
+ setMode(getNextAllowedMode(BASIC_MODES));
+ if (aPlayer.isSneaking()) {
+ facing = wrenchSide;
+ }
+ GT_Utility.sendChatToPlayer(aPlayer, "Mode set to `" + getModeName(mode) + "' (" + mode + ")");
+ sendClientData((EntityPlayerMP) aPlayer);
+ return true;
+ }
+
+ @Override
+ public void setLightValue(byte aLightValue) {}
+
+ @Override
+ public byte getComparatorValue(ForgeDirection side) {
+ return 0;
+ }
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.part";
+ }
+
+ @Override
+ public boolean shouldTick(long tickTimer) {
+ return modeSelected(ITEM_OUT, FLUID_OUT);
+ }
+
+ /**
+ * TODO: Make sure the energy/item/fluid hatch is facing that way! or has that mode enabled on that side Check
+ * SIDE_UNKNOWN for or coverbehavior
+ */
+
+ // #region Fluid - Depending on the part type - proxy it to the multiblock controller, if we have one
+ @Override
+ @Nullable
+ public FluidInventoryLogic getFluidLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType type) {
+ if (side != facing && side != ForgeDirection.UNKNOWN) return null;
+
+ if (!modeSelected(FLUID_IN, FLUID_OUT)) return null;
+
+ IMultiBlockController controller = getTarget(false);
+ if (controller == null) return null;
+ return controller
+ .getFluidLogic(modeSelected(FLUID_IN) ? InventoryType.Input : InventoryType.Output, lockedInventory);
+ }
+
+ // #endregion Fluid
+
+ // #region Energy - Depending on the part type - proxy to the multiblock controller, if we have one
+
+ @Override
+ @Nonnull
+ public PowerLogic getPowerLogic(@Nonnull ForgeDirection side) {
+ if (side != facing && side != ForgeDirection.UNKNOWN) {
+ return new NullPowerLogic();
+ }
+
+ if (!modeSelected(ENERGY_IN, ENERGY_OUT)) {
+ return new NullPowerLogic();
+ }
+
+ final IMultiBlockController controller = getTarget(true);
+ if (controller == null) {
+ return new NullPowerLogic();
+ }
+ return controller.getPowerLogic();
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return modeSelected(ENERGY_IN);
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return modeSelected(ENERGY_OUT);
+ }
+
+ // #endregion Energy
+
+ // #region Item - Depending on the part type - proxy to the multiblock controller, if we have one
+
+ @Override
+ @Nullable
+ public ItemInventoryLogic getItemLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType unused) {
+ if (side != facing && side != ForgeDirection.UNKNOWN) return null;
+
+ if (!modeSelected(ITEM_IN, ITEM_OUT)) return null;
+
+ final IMultiBlockController controller = getTarget(false);
+ if (controller == null) return null;
+
+ return controller
+ .getItemLogic(modeSelected(ITEM_IN) ? InventoryType.Input : InventoryType.Output, lockedInventory);
+ }
+
+ @Override
+ @Nullable
+ public InventoryType getItemInventoryType() {
+ if (!modeSelected(ITEM_IN, ITEM_OUT)) return InventoryType.Both;
+ return modeSelected(ITEM_IN) ? InventoryType.Input : InventoryType.Output;
+ }
+
+ // #endregion Item
+
+ // === Modular UI ===
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public String getLocalName() {
+ if (modeSelected(ITEM_IN)) return "Input Inventory";
+ if (modeSelected(ITEM_OUT)) return "Output Inventory";
+ if (modeSelected(FLUID_IN)) return "Fluid Input Hatch";
+ if (modeSelected(FLUID_OUT)) return "Fluid Output Hatch";
+
+ return "Unknown";
+ }
+
+ @Override
+ public boolean hasGui(ForgeDirection side) {
+ if (modeSelected(ENERGY_IN, ENERGY_OUT) && facing == side) {
+ return false;
+ }
+ return getTarget(true) != null;
+ }
+
+ protected boolean isWrongFluid(Fluid fluid) {
+ if (fluid == null) {
+ return true;
+ }
+ Fluid lockedFluid = getLockedFluid();
+ if (lockedFluid != null) {
+ return !fluid.equals(lockedFluid);
+ }
+ return false;
+ }
+
+ protected Fluid getLockedFluid() {
+ if (configurationTank.get() != null && configurationTank.get()
+ .getFluid() != null) {
+ return configurationTank.get()
+ .getFluid();
+ }
+ return null;
+ }
+
+ @Override
+ public void addUIWidgets(Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ IMultiBlockController controller = getTarget(false);
+ if (controller == null) {
+ return;
+ }
+ if ((modeSelected(ITEM_IN, ITEM_OUT))) {
+ builder.widget(
+ controller
+ .getItemLogic(modeSelected(ITEM_IN) ? InventoryType.Input : InventoryType.Output, lockedInventory)
+ .getGuiPart()
+ .setSize(18 * 4 + 4, 18 * 5)
+ .setPos(52, 7));
+ }
+
+ if ((modeSelected(FLUID_IN, FLUID_OUT))) {
+ builder.widget(
+ controller
+ .getFluidLogic(modeSelected(FLUID_IN) ? InventoryType.Input : InventoryType.Output, lockedInventory)
+ .getGuiPart()
+ .setSize(18 * 4 + 4, 18 * 5)
+ .setPos(52, 7));
+ }
+ }
+
+ protected boolean canOpenControllerGui() {
+ return true;
+ }
+
+ @Override
+ protected int getGUIHeight() {
+ return super.getGUIHeight() + 20;
+ }
+
+ @Override
+ public void addGregTechLogo(Builder builder) {
+ if (modeSelected(ITEM_IN, ITEM_OUT)) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(152, 74));
+ } else if (modeSelected(FLUID_IN, FLUID_OUT)) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(152, 82));
+ } else {
+ super.addGregTechLogo(builder);
+ }
+ }
+
+ @Override
+ public void addToolTips(List<String> list, ItemStack stack, boolean f3_h) {
+ list.add("A MultiTileEntity Casing");
+ }
+
+ public String getInventoryName() {
+ IMultiBlockController controller = getTarget(false);
+ if (controller == null) return "";
+ if (modeSelected(ITEM_IN, ITEM_OUT)) {
+ InventoryType type = modeSelected(ITEM_IN) ? InventoryType.Input : InventoryType.Output;
+ ItemInventoryLogic itemLogic = controller.getItemLogic(type, lockedInventory);
+ return itemLogic.getDisplayName();
+ }
+ if (modeSelected(FLUID_IN, FLUID_OUT)) {
+ InventoryType type = modeSelected(FLUID_IN) ? InventoryType.Input : InventoryType.Output;
+ FluidInventoryLogic fluidLogic = controller.getFluidLogic(type, lockedInventory);
+ return fluidLogic.getDisplayName();
+ }
+ return "";
+ }
+
+ @Override
+ @Nonnull
+ public ForgeDirection getPowerOutputSide() {
+ if (!modeSelected(ENERGY_OUT)) return ForgeDirection.UNKNOWN;
+ return facing;
+ }
+
+ @Nonnull
+ protected GUIProvider<?> createGUIProvider() {
+ return new PartGUIProvider<>(this);
+ }
+
+ @Override
+ @Nonnull
+ public GUIProvider<?> getGUI(@Nonnull UIBuildContext uiContext) {
+ IMultiBlockController controller = getTarget(false);
+ if (controller == null) return guiProvider;
+ if (!modeSelected(NOTHING, ENERGY_IN, ENERGY_OUT)) return guiProvider;
+ if (!canOpenControllerGui()) return guiProvider;
+ if (uiContext.getPlayer()
+ .isSneaking()) return guiProvider;
+ GUIProvider<?> controllerGUI = controller.getGUI(uiContext);
+ return controllerGUI;
+ }
+
+ @Override
+ public ItemStack getAsItem() {
+ return MultiTileEntityRegistry.getRegistry(getMultiTileEntityRegistryID())
+ .getItem(getMultiTileEntityID());
+ }
+
+ @Override
+ public String getMachineName() {
+ return StatCollector.translateToLocal(getAsItem().getUnlocalizedName());
+ }
+
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/StackableController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/StackableController.java
new file mode 100644
index 0000000000..51feb363dd
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/StackableController.java
@@ -0,0 +1,128 @@
+package gregtech.api.multitileentity.multiblock.base;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+import gregtech.api.logic.MuTEProcessingLogic;
+
+public abstract class StackableController<C extends StackableController<C, P>, P extends MuTEProcessingLogic<P>>
+ extends Controller<C, P> {
+
+ protected static String STACKABLE_STOP = "STACKABLE_STOP";
+ protected static String STACKABLE_MIDDLE = "STACKABLE_MIDDLE";
+ protected static String STACKABLE_START = "STACKABLE_START";
+ protected int stackCount = 0;
+
+ /**
+ * construct implementation for stackable multi-blocks
+ */
+ @Override
+ public void construct(ItemStack trigger, boolean hintsOnly) {
+ final int blueprintCount = (trigger.stackSize - 1) + getMinStacks();
+ final int stackCount = Math.min(blueprintCount, getMaxStacks());
+
+ buildState.startBuilding(getStartingStructureOffset());
+ buildPiece(getStackableStart(), trigger, hintsOnly, buildState.getCurrentOffset());
+ buildState.addOffset(getStartingStackOffset());
+
+ for (int i = 0; i < stackCount; i++) {
+ buildPiece(getStackableMiddle(i), trigger, hintsOnly, buildState.getCurrentOffset());
+ buildState.addOffset(getPerStackOffset());
+ }
+ if (hasTop()) {
+ buildState.addOffset(getAfterLastStackOffset());
+ buildPiece(getStackableStop(), trigger, hintsOnly, buildState.stopBuilding());
+ } else {
+ buildState.stopBuilding();
+ }
+ }
+
+ /**
+ * Stackable
+ *
+ * @return The minimum number of stacks required for this multi-block to form
+ */
+ public abstract int getMinStacks();
+
+ /**
+ * Stackable
+ *
+ * @return The maximum number of stacks allowed for this multi-block to form
+ */
+ public abstract int getMaxStacks();
+
+ /**
+ * Stackable
+ *
+ * @return The starting offset for the first stack
+ */
+ public abstract Vec3Impl getStartingStackOffset();
+
+ /**
+ * Stackable
+ *
+ * @return The per stack offset
+ */
+ public abstract Vec3Impl getPerStackOffset();
+
+ /**
+ * Stackable
+ *
+ * @return Whether this structure has a Top/Cap. Defaults to true.
+ */
+ public boolean hasTop() {
+ return true;
+ }
+
+ /**
+ * Stackable
+ *
+ * @return Any offset needed after the last stack
+ */
+ public Vec3Impl getAfterLastStackOffset() {
+ return new Vec3Impl(0, 0, 0);
+ }
+
+ /**
+ * checkMachine implementation for stackable multi-blocks
+ */
+ @Override
+ public boolean checkMachine() {
+ stackCount = 0;
+
+ buildState.startBuilding(getStartingStructureOffset());
+ if (!checkPiece(getStackableStart(), buildState.getCurrentOffset())) return buildState.failBuilding();
+
+ buildState.addOffset(getStartingStackOffset());
+
+ for (int i = 0; i < getMaxStacks(); i++) {
+ if (!checkPiece(getStackableMiddle(i), buildState.getCurrentOffset())) {
+ break;
+ }
+
+ buildState.addOffset(getPerStackOffset());
+ stackCount++;
+
+ }
+ if (stackCount < getMinStacks()) return buildState.failBuilding();
+
+ buildState.addOffset(getAfterLastStackOffset());
+ if (!checkPiece(getStackableStop(), buildState.stopBuilding())) {
+ return buildState.failBuilding();
+ }
+ return super.checkMachine();
+ }
+
+ protected String getStackableStop() {
+ return STACKABLE_STOP;
+ }
+
+ protected String getStackableMiddle(int stackIndex) {
+ return STACKABLE_MIDDLE;
+ }
+
+ protected String getStackableStart() {
+ return STACKABLE_START;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/StackableModularController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/StackableModularController.java
new file mode 100644
index 0000000000..1dfd497151
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/StackableModularController.java
@@ -0,0 +1,77 @@
+package gregtech.api.multitileentity.multiblock.base;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jetbrains.annotations.NotNull;
+
+import gregtech.api.logic.MuTEProcessingLogic;
+import gregtech.api.multitileentity.interfaces.UpgradableModularMuTE;
+import gregtech.api.util.GT_StructureUtilityMuTE.UpgradeCasings;
+
+public abstract class StackableModularController<C extends StackableModularController<C, P>, P extends MuTEProcessingLogic<P>>
+ extends StackableController<C, P> implements UpgradableModularMuTE {
+
+ protected double durationMultiplier = 1;
+ protected double euTickMultiplier = 1;
+
+ private Map<UpgradeCasings, int[]> mucMap;
+
+ protected @NotNull Map<UpgradeCasings, int[]> getMucMap() {
+ if (mucMap == null) {
+ mucMap = createMucMap();
+ }
+ return mucMap;
+ }
+
+ protected static @NotNull Map<UpgradeCasings, int[]> createMucMap() {
+ Map<UpgradeCasings, int[]> mucCount = new HashMap<>();
+ mucCount.put(UpgradeCasings.Heater, new int[] { 0, 0, 0, 0, 0 });
+ mucCount.put(UpgradeCasings.Insulator, new int[] { 0, 0, 0, 0, 0 });
+ return mucCount;
+ }
+
+ @Override
+ public void increaseMucCount(UpgradeCasings casingType, int tier) {
+ Map<UpgradeCasings, int[]> mucCounters = getMucMap();
+ int[] casingCount = mucCounters.get(casingType);
+
+ switch (tier) {
+ case 0, 1, 2 -> casingCount[0] += 1;
+ case 3, 4, 5 -> casingCount[1] += 1;
+ case 6, 7, 8 -> casingCount[2] += 1;
+ case 9, 10, 11 -> casingCount[3] += 1;
+ default -> casingCount[4] += 1;
+ }
+ }
+
+ @Override
+ public void resetMucCount() {
+ Map<UpgradeCasings, int[]> mucCounters = getMucMap();
+ mucCounters.forEach((type, casingCount) -> { Arrays.fill(casingCount, 0); });
+ }
+
+ // Returns the cheapest MUC that is possible for the multi, which gets the minimum bonuses.
+ protected abstract UpgradeCasings getBaseMucType();
+
+ // Minimum parallel bonus per MUC. Higher tier MUCs multiply with this value for even more parallels.
+ protected abstract int getParallelFactor();
+
+ protected void calculateParallels() {
+ int parallelCount = 0;
+ int parallelFactor = getParallelFactor();
+ int[] parallelCasingList = mucMap.get(getBaseMucType());
+
+ for (int i = 0; i < 5; i++) {
+ // (i * 3 + 1) -> Convert MUC tier into minimum GT tier, in groups of 3 (LV, EV, LuV, UHV, UMV)
+ // If higher than multi tier, upgrade casing has no effect
+ if (i * 3 + 1 <= tier) {
+ parallelCount += parallelCasingList[i] * (i + 1) * parallelFactor;
+ }
+ }
+ maxParallel = parallelCount == 0 ? 1 : parallelCount;
+ }
+
+ protected abstract boolean calculateMucMultipliers();
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java
new file mode 100644
index 0000000000..ccde0c49e6
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java
@@ -0,0 +1,96 @@
+package gregtech.api.multitileentity.multiblock.base;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+
+public class WallShareablePart extends MultiBlockPart {
+
+ protected List<ChunkCoordinates> targetPositions = new ArrayList<>();
+
+ @Override
+ public void setTarget(IMultiBlockController aTarget, int aAllowedModes) {
+ if (targetPositions.size() >= 1) {
+ allowedModes = 0;
+ setMode((byte) 0);
+ targetPosition = null;
+ } else {
+ allowedModes = aAllowedModes;
+ }
+
+ if (aTarget == null) {
+ return;
+ }
+
+ targetPositions.add(aTarget.getCoords());
+ }
+
+ @Override
+ public UUID getLockedInventory() {
+ if (targetPositions.size() > 1) {
+ return null;
+ }
+ return super.getLockedInventory();
+ }
+
+ @Override
+ public IMultiBlockController getTarget(boolean aCheckValidity) {
+ if (targetPositions.size() != 1) {
+ return null;
+ }
+
+ targetPosition = targetPositions.get(0);
+ return super.getTarget(aCheckValidity);
+ }
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multiTileEntity.casing.wallSharable";
+ }
+
+ @Override
+ public boolean breakBlock() {
+ for (final ChunkCoordinates coordinates : targetPositions) {
+ IMultiBlockController target = getTarget(coordinates, false);
+ if (target == null) {
+ continue;
+ }
+ target.onStructureChange();
+ }
+ return false;
+ }
+
+ @Override
+ public void onBlockAdded() {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ final TileEntity te = getTileEntityAtSide(side);
+ if (te instanceof MultiBlockPart part) {
+ final IMultiBlockController tController = part.getTarget(false);
+ if (tController != null) tController.onStructureChange();
+ } else if (te instanceof IMultiBlockController controller) {
+ controller.onStructureChange();
+ }
+ }
+ }
+
+ public IMultiBlockController getTarget(ChunkCoordinates coordinates, boolean aCheckValidity) {
+ IMultiBlockController target = null;
+ if (coordinates == null) return null;
+ if (worldObj.blockExists(coordinates.posX, coordinates.posY, coordinates.posZ)) {
+ final TileEntity te = worldObj.getTileEntity(coordinates.posX, coordinates.posY, coordinates.posZ);
+ if (te instanceof IMultiBlockController) {
+ target = (IMultiBlockController) te;
+ }
+ }
+ if (aCheckValidity) {
+ return target != null && target.checkStructure(false) ? target : null;
+ }
+ return target;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/BasicCasing.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/BasicCasing.java
new file mode 100644
index 0000000000..84f1442a88
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/BasicCasing.java
@@ -0,0 +1,7 @@
+package gregtech.api.multitileentity.multiblock.casing;
+
+import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+
+public class BasicCasing extends MultiBlockPart {
+ /* Nothing */
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/CasingBehaviorBase.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/CasingBehaviorBase.java
new file mode 100644
index 0000000000..9f0d9bd2d1
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/CasingBehaviorBase.java
@@ -0,0 +1,10 @@
+package gregtech.api.multitileentity.multiblock.casing;
+
+/**
+ * Allows for functional casings that influence the multiblock structure's behavior Examples include: - Extra Byproducts
+ * - Extra Speed - More parallels - Upgraded internal item/energy/fluid storage - Faster output - Voiding/Anti-Voiding
+ * upgrade - Ender Upgrades - etc, etc.
+ *
+ */
+public class CasingBehaviorBase {
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/FunctionalCasing.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/FunctionalCasing.java
new file mode 100644
index 0000000000..bc3c857fd6
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/FunctionalCasing.java
@@ -0,0 +1,29 @@
+package gregtech.api.multitileentity.multiblock.casing;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+
+public abstract class FunctionalCasing extends MultiBlockPart {
+
+ private int tier = 0;
+
+ @Override
+ public int getPartTier() {
+ return tier;
+ }
+
+ public abstract float getPartModifier();
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound nbt) {
+ super.readMultiTileNBT(nbt);
+ tier = nbt.getInteger(GT_Values.NBT.TIER);
+ }
+
+ @Override
+ public void writeMultiTileNBT(NBTTagCompound nbt) {
+ super.writeMultiTileNBT(nbt);
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/Glasses.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/Glasses.java
new file mode 100644
index 0000000000..edc1bd0e5b
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/Glasses.java
@@ -0,0 +1,32 @@
+package gregtech.api.multitileentity.multiblock.casing;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockUnlocalizedName;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.Botania;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.enums.Mods.Thaumcraft;
+
+import com.gtnewhorizon.structurelib.structure.IStructureElementChain;
+
+public class Glasses {
+
+ /** support all Bart, Botania, Ic2, Thaumcraft glasses for multiblock structure **/
+ public static <T> IStructureElementChain<T> chainAllGlasses() {
+ return ofChain(
+ // IndustrialCraft2 glass
+ ofBlockUnlocalizedName(IndustrialCraft2.ID, "blockAlloyGlass", 0, true),
+
+ // Botania glass
+ ofBlockUnlocalizedName(Botania.ID, "manaGlass", 0, false),
+ ofBlockUnlocalizedName(Botania.ID, "elfGlass", 0, false),
+
+ // BartWorks glass
+ ofBlockUnlocalizedName(BartWorks.ID, "BW_GlasBlocks", 0, true),
+ ofBlockUnlocalizedName(BartWorks.ID, "BW_GlasBlocks2", 0, true),
+
+ // warded glass
+ ofBlockUnlocalizedName(Thaumcraft.ID, "blockCosmeticOpaque", 2, false));
+ }
+
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java
new file mode 100644
index 0000000000..fb045557e4
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java
@@ -0,0 +1,35 @@
+package gregtech.api.multitileentity.multiblock.casing;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+
+public abstract class UpgradeCasing extends MultiBlockPart {
+
+ protected int tier = 0;
+
+ @Override
+ public int getPartTier() {
+ return tier;
+ }
+
+ @Override
+ public void setTarget(IMultiBlockController newTarget, int aAllowedModes) {
+ super.setTarget(newTarget, aAllowedModes);
+
+ if (getTarget(false) != null) {
+ customWork(getTarget(false));
+ }
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound aNBT) {
+ super.readMultiTileNBT(aNBT);
+ tier = aNBT.getInteger(GT_Values.NBT.TIER);
+ }
+
+ protected abstract void customWork(IMultiBlockController aTarget);
+
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet.java b/src/main/java/gregtech/api/net/GT_Packet.java
new file mode 100644
index 0000000000..d06ea7d0d3
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet.java
@@ -0,0 +1,59 @@
+package gregtech.api.net;
+
+import net.minecraft.network.INetHandler;
+import net.minecraft.world.IBlockAccess;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+
+/**
+ * @deprecated Use {@link GT_Packet_New} instead
+ */
+@Deprecated
+public abstract class GT_Packet {
+
+ public GT_Packet(boolean aIsReference) {
+ //
+ }
+
+ /**
+ * I use constant IDs instead of Dynamic ones, since that is much more fail safe
+ *
+ * @return a Packet ID for this Class
+ */
+ public abstract byte getPacketID();
+
+ /**
+ * @return encoded byte Stream
+ * @deprecated Use {@link #encode(ByteBuf)} instead
+ */
+ @Deprecated
+ public abstract byte[] encode();
+
+ /**
+ * Encode the data into given byte buffer without creating an intermediate byte array. Default implementation just
+ * throw {@link UnsupportedOperationException}.
+ */
+ public void encode(ByteBuf aOut) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * @return encoded byte Stream
+ */
+ public abstract GT_Packet decode(ByteArrayDataInput aData);
+
+ /**
+ * Process the packet
+ *
+ * @param aWorld null if message is received on server side, the client world if message is received on client side
+ */
+ public abstract void process(IBlockAccess aWorld);
+
+ /**
+ * This will be called just before {@link #process(IBlockAccess)} to inform the handler about the source and type of
+ * connection
+ */
+ public void setINetHandler(INetHandler aHandler) {}
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_Block_Event.java b/src/main/java/gregtech/api/net/GT_Packet_Block_Event.java
new file mode 100644
index 0000000000..98dc8a5c4f
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_Block_Event.java
@@ -0,0 +1,63 @@
+package gregtech.api.net;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+
+/**
+ * Used to transfer Block Events in a much better fashion
+ */
+public class GT_Packet_Block_Event extends GT_Packet_New {
+
+ private int mX, mZ;
+ private short mY;
+ private byte mID, mValue;
+
+ public GT_Packet_Block_Event() {
+ super(true);
+ }
+
+ public GT_Packet_Block_Event(int aX, short aY, int aZ, byte aID, byte aValue) {
+ super(false);
+ mX = aX;
+ mY = aY;
+ mZ = aZ;
+ mID = aID;
+ mValue = aValue;
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(mX);
+ aOut.writeShort(mY);
+ aOut.writeInt(mZ);
+ aOut.writeByte(mID);
+ aOut.writeByte(mValue);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_Block_Event(
+ aData.readInt(),
+ aData.readShort(),
+ aData.readInt(),
+ aData.readByte(),
+ aData.readByte());
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ if (aWorld != null) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ);
+ if (tTileEntity != null) tTileEntity.receiveClientEvent(mID, mValue);
+ }
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 2;
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_ClientPreference.java b/src/main/java/gregtech/api/net/GT_Packet_ClientPreference.java
new file mode 100644
index 0000000000..0835676c6f
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_ClientPreference.java
@@ -0,0 +1,62 @@
+package gregtech.api.net;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.network.INetHandler;
+import net.minecraft.network.NetHandlerPlayServer;
+import net.minecraft.world.IBlockAccess;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.GT_Mod;
+import gregtech.api.util.GT_ClientPreference;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Packet_ClientPreference extends GT_Packet_New {
+
+ private GT_ClientPreference mPreference;
+ private EntityPlayerMP mPlayer;
+
+ public GT_Packet_ClientPreference() {
+ super(true);
+ }
+
+ public GT_Packet_ClientPreference(GT_ClientPreference mPreference) {
+ super(false);
+ this.mPreference = mPreference;
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 9;
+ }
+
+ @Override
+ public void setINetHandler(INetHandler aHandler) {
+ if (aHandler instanceof NetHandlerPlayServer) {
+ mPlayer = ((NetHandlerPlayServer) aHandler).playerEntity;
+ }
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ if (mPlayer != null) GT_Mod.gregtechproxy.setClientPreference(mPlayer.getUniqueID(), mPreference);
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeBoolean(mPreference.isSingleBlockInitialFilterEnabled());
+ aOut.writeBoolean(mPreference.isSingleBlockInitialMultiStackEnabled());
+ aOut.writeBoolean(mPreference.isInputBusInitialFilterEnabled());
+ aOut.writeBoolean(mPreference.isWailaAverageNSEnabled());
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_ClientPreference(
+ new GT_ClientPreference(
+ aData.readBoolean(),
+ aData.readBoolean(),
+ aData.readBoolean(),
+ aData.readBoolean()));
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_GtTileEntityGuiRequest.java b/src/main/java/gregtech/api/net/GT_Packet_GtTileEntityGuiRequest.java
new file mode 100644
index 0000000000..dc2f88316d
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_GtTileEntityGuiRequest.java
@@ -0,0 +1,122 @@
+package gregtech.api.net;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.metatileentity.BaseTileEntity;
+import gregtech.api.metatileentity.CoverableTileEntity;
+import gregtech.common.GT_Proxy;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * Client -> Server: Request that the server opens a Gregtech GUI for us after providing us with the required data.
+ */
+public class GT_Packet_GtTileEntityGuiRequest extends GT_Packet_New {
+
+ protected int mX;
+ protected short mY;
+ protected int mZ;
+
+ protected int guiId;
+ protected int dimId, playerId;
+
+ protected int parentGuiId;
+
+ public GT_Packet_GtTileEntityGuiRequest() {
+ super(true);
+ }
+
+ public GT_Packet_GtTileEntityGuiRequest(int mX, short mY, int mZ, int guiId, int dimID, int playerID,
+ int parentGuiId) {
+ super(false);
+ this.mX = mX;
+ this.mY = mY;
+ this.mZ = mZ;
+
+ this.guiId = guiId;
+
+ this.dimId = dimID;
+ this.playerId = playerID;
+
+ this.parentGuiId = parentGuiId;
+ }
+
+ public GT_Packet_GtTileEntityGuiRequest(int mX, short mY, int mZ, int guiId, int dimID, int playerID) {
+ this(mX, mY, mZ, guiId, dimID, playerID, -1);
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(mX);
+ aOut.writeShort(mY);
+ aOut.writeInt(mZ);
+
+ aOut.writeInt(guiId);
+
+ aOut.writeInt(dimId);
+ aOut.writeInt(playerId);
+
+ aOut.writeInt(parentGuiId);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_GtTileEntityGuiRequest(
+ aData.readInt(),
+ aData.readShort(),
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt());
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 15;
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ final World world = DimensionManager.getWorld(this.dimId);
+ if (world == null) return;
+ final TileEntity tile = world.getTileEntity(this.mX, this.mY, this.mZ);
+ if (!(tile instanceof BaseTileEntity baseTile) || baseTile.isDead()) return;
+
+ final EntityPlayerMP player = (EntityPlayerMP) world.getEntityByID(playerId);
+ final CoverableTileEntity coverableTile = (baseTile instanceof CoverableTileEntity)
+ ? (CoverableTileEntity) baseTile
+ : null;
+ // If the requested Gui ID corresponds to a cover, send the cover data to the client so they can open it.
+ if (GT_Proxy.GUI_ID_COVER_SIDE_BASE <= guiId && guiId < GT_Proxy.GUI_ID_COVER_SIDE_BASE + 6
+ && coverableTile != null) {
+ final ForgeDirection coverSide = ForgeDirection
+ .getOrientation((byte) (guiId - GT_Proxy.GUI_ID_COVER_SIDE_BASE));
+ final GT_Packet_TileEntityCoverGUI packet = new GT_Packet_TileEntityCoverGUI(
+ this.mX,
+ this.mY,
+ this.mZ,
+ coverSide,
+ coverableTile.getCoverIDAtSide(coverSide),
+ coverableTile.getComplexCoverDataAtSide(coverSide),
+ this.dimId,
+ this.playerId,
+ parentGuiId);
+ GT_Values.NW.sendToPlayer(packet, player);
+ } else if (guiId == 0) {
+ if (baseTile.useModularUI()) {
+ GT_UIInfos.openGTTileEntityUI(baseTile, player);
+ } else {
+ baseTile.openGUI(player);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java b/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java
new file mode 100644
index 0000000000..096f21df29
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java
@@ -0,0 +1,254 @@
+package gregtech.api.net;
+
+import static gregtech.api.enums.GT_Values.B;
+
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+import net.minecraft.world.IBlockAccess;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.net.data.CasingData;
+import gregtech.api.net.data.CommonData;
+import gregtech.api.net.data.CoordinateData;
+import gregtech.api.net.data.MultiTileEntityData;
+import gregtech.api.net.data.MultiTileEntityProcess;
+import gregtech.api.net.data.PacketData;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Packet_MultiTileEntity extends GT_Packet_New {
+
+ private final Set<PacketData<MultiTileEntityProcess>> data = new HashSet<>();
+ public static final int COVERS = B[0], REDSTONE = B[1], MODES = B[2], CONTROLLER = B[3], INVENTORY_INDEX = B[4],
+ INVENTORY_NAME_ID = B[5], BOOLEANS = B[6], SOUND = B[7];
+
+ public GT_Packet_MultiTileEntity(boolean reference) {
+ super(reference);
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ Set<PacketData<MultiTileEntityProcess>> set = data.stream()
+ .sorted()
+ .collect(
+ HashSet<PacketData<MultiTileEntityProcess>>::new,
+ HashSet<PacketData<MultiTileEntityProcess>>::add,
+ HashSet<PacketData<MultiTileEntityProcess>>::addAll);
+ clearData();
+ data.addAll(set);
+ int features = 0;
+ for (PacketData<MultiTileEntityProcess> data : data) {
+ features |= 1 << data.getId();
+ }
+
+ aOut.writeInt(features);
+
+ for (PacketData<MultiTileEntityProcess> data : data) {
+ data.encode(aOut);
+ }
+ /*
+ * TODO Move to new system
+ * if ((features & COVERS) == COVERS) {
+ * aOut.writeInt(mC0);
+ * aOut.writeInt(mC1);
+ * aOut.writeInt(mC2);
+ * aOut.writeInt(mC3);
+ * aOut.writeInt(mC4);
+ * aOut.writeInt(mC5);
+ * }
+ * if ((features & MODES) == MODES) {
+ * aOut.writeInt(mode);
+ * aOut.writeInt(allowedModes);
+ * }
+ * if ((features & CONTROLLER) == CONTROLLER) {
+ * aOut.writeInt(mTargetPos.posX);
+ * aOut.writeShort(mTargetPos.posY);
+ * aOut.writeInt(mTargetPos.posZ);
+ * }
+ * if ((features & INVENTORY_INDEX) == INVENTORY_INDEX) {
+ * aOut.writeInt(mLockedInventoryIndex);
+ * }
+ * if ((features & INVENTORY_NAME_ID) == INVENTORY_NAME_ID) {
+ * if (mInventoryName != null && mInventoryName.length() > 0) {
+ * byte[] bytes = mInventoryName.getBytes();
+ * aOut.writeInt(bytes.length);
+ * aOut.writeBytes(bytes);
+ * } else {
+ * aOut.writeInt(0);
+ * }
+ * if (inventoryID != null && inventoryID.length() > 0) {
+ * byte[] bytes = inventoryID.getBytes();
+ * aOut.writeInt(bytes.length);
+ * aOut.writeBytes(bytes);
+ * } else {
+ * aOut.writeInt(0);
+ * }
+ * }
+ * if ((features & BOOLEANS) == BOOLEANS) {
+ * aOut.writeInt(booleans);
+ * }
+ * if ((features & SOUND) == SOUND) {
+ * aOut.writeByte(soundEvent);
+ * aOut.writeInt(soundEventValue);
+ * }
+ */
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput in) {
+ Objects.requireNonNull(in);
+ final int packetFeatures = in.readInt();
+
+ final GT_Packet_MultiTileEntity packet = new GT_Packet_MultiTileEntity(false);
+
+ if (containsBit(packetFeatures, CoordinateData.COORDINATE_DATA_ID)) {
+ packet.addData(new CoordinateData());
+ }
+ if (containsBit(packetFeatures, MultiTileEntityData.MULTI_TILE_ENTITY_DATA_ID)) {
+ packet.addData(new MultiTileEntityData());
+ }
+ if (containsBit(packetFeatures, CommonData.COMMON_DATA_ID)) {
+ packet.addData(new CommonData());
+ }
+ if (containsBit(packetFeatures, CasingData.CASING_DATA_ID)) {
+ packet.addData(new CasingData());
+ }
+
+ Set<PacketData<MultiTileEntityProcess>> set = packet.data.stream()
+ .sorted()
+ .collect(
+ HashSet<PacketData<MultiTileEntityProcess>>::new,
+ HashSet<PacketData<MultiTileEntityProcess>>::add,
+ HashSet<PacketData<MultiTileEntityProcess>>::addAll);
+ packet.clearData();
+ packet.data.addAll(set);
+ for (PacketData<MultiTileEntityProcess> data : packet.data) {
+ data.decode(in);
+ }
+ /*
+ * if ((packetFeatures & COVERS) == COVERS) {
+ * packet.setCoverData(
+ * in.readInt(),
+ * in.readInt(),
+ * in.readInt(),
+ * in.readInt(),
+ * in.readInt(),
+ * in.readInt());
+ * }
+ * if ((packetFeatures & INVENTORY_INDEX) == INVENTORY_INDEX) {
+ * packet.setInventoryIndex(aData.readInt());
+ * }
+ * if ((packetFeatures & INVENTORY_NAME_ID) == INVENTORY_NAME_ID) {
+ * int nameLength = aData.readInt();
+ * String inventoryName;
+ * if (nameLength > 0) {
+ * byte[] bytes = new byte[nameLength];
+ * for (int i = 0; i < nameLength; i++) {
+ * bytes[i] = aData.readByte();
+ * }
+ * inventoryName = new String(bytes);
+ * } else {
+ * inventoryName = null;
+ * }
+ * int idLength = aData.readInt();
+ * String inventoryID;
+ * if (idLength > 0) {
+ * byte[] bytes = new byte[idLength];
+ * for (int i = 0; i < idLength; i++) {
+ * bytes[i] = aData.readByte();
+ * }
+ * inventoryID = new String(bytes);
+ * } else {
+ * inventoryID = null;
+ * }
+ * packet.setInventoryName(inventoryName, inventoryID);
+ * }
+ * if ((packetFeatures & BOOLEANS) == BOOLEANS) {
+ * packet.setBooleans(aData.readInt());
+ * }
+ * if ((packetFeatures & SOUND) == SOUND) {
+ * packet.setSoundEvent(aData.readByte(), aData.readInt());
+ * }
+ */
+ return packet;
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ if (aWorld == null) return;
+ MultiTileEntityProcess process = new MultiTileEntityProcess(aWorld);
+ for (PacketData<MultiTileEntityProcess> data : data) {
+ data.process(process);
+ }
+ process.process();
+ /*
+ * final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ);
+ * try {
+ * final Block tBlock = aWorld.getBlock(mX, mY, mZ);
+ * if (tBlock instanceof MultiTileEntityBlock mteBlock) {
+ * final IMultiTileEntity mte = mteBlock.receiveMultiTileEntityData(aWorld, mX, mY, mZ, mRID, mID);
+ * if (mte == null) return;
+ * mte.receiveClientData(GregTechTileClientEvents.CHANGE_COMMON_DATA, mCommonData);
+ * mte.receiveClientData(GregTechTileClientEvents.CHANGE_COLOR, mColor);
+ * if ((features & COVERS) == COVERS) {
+ * mteBlock.receiveCoverData(mte, mC0, mC1, mC2, mC3, mC4, mC5);
+ * }
+ * if ((features & REDSTONE) == REDSTONE) {
+ * mte.receiveClientData(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, mRedstone);
+ * }
+ * if ((features & MODES) == MODES && mte instanceof IMultiTileEntity.IMTE_HasModes mteModes) {
+ * mteModes.setMode(mode);
+ * mteModes.setAllowedModes(allowedModes);
+ * }
+ * if ((features & INVENTORY_NAME_ID) == INVENTORY_NAME_ID && mte instanceof Inventory invUpg) {
+ * invUpg.setInventoryName(mInventoryName);
+ * invUpg.setInventoryId(inventoryID);
+ * }
+ * if ((features & CONTROLLER) == CONTROLLER && mte instanceof IMultiBlockPart) {
+ * final IMultiBlockPart mtePart = (IMultiBlockPart) mte;
+ * mtePart.setTargetPos(mTargetPos);
+ * }
+ * if ((features & INVENTORY_INDEX) == INVENTORY_INDEX && mte instanceof IMultiBlockPart) {
+ * final IMultiBlockPart mtePart = (IMultiBlockPart) mte;
+ * mtePart.setLockedInventoryIndex(mLockedInventoryIndex);
+ * }
+ * if ((features & BOOLEANS) == BOOLEANS && mte instanceof IMultiTileMachine) {
+ * final IMultiTileMachine machine = (IMultiTileMachine) mte;
+ * machine.setBooleans(booleans);
+ * }
+ * if ((features & SOUND) == SOUND && mte instanceof IMultiTileMachine) {
+ * final IMultiTileMachine machine = (IMultiTileMachine) mte;
+ * machine.setSound(soundEvent, soundEventValue);
+ * }
+ * }
+ * } catch (Exception e) {
+ * e.printStackTrace();
+ * GT_Mod.GT_FML_LOGGER.error(
+ * "Exception setting tile entity data for tile entity {} at ({}, {}, {})",
+ * tTileEntity,
+ * mX,
+ * mY,
+ * mZ);
+ * }
+ */
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 18;
+ }
+
+ public void clearData() {
+ data.clear();
+ }
+
+ public void addData(PacketData<MultiTileEntityProcess> data) {
+ this.data.add(data);
+ }
+
+ private static boolean containsBit(int toCheck, int bit) {
+ return (toCheck & (1 << bit)) > 0;
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_New.java b/src/main/java/gregtech/api/net/GT_Packet_New.java
new file mode 100644
index 0000000000..41eb1740b3
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_New.java
@@ -0,0 +1,30 @@
+package gregtech.api.net;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+
+@SuppressWarnings("deprecation")
+public abstract class GT_Packet_New extends GT_Packet {
+
+ public GT_Packet_New(boolean aIsReference) {
+ super(aIsReference);
+ }
+
+ @Override
+ @Deprecated
+ public final byte[] encode() {
+ final ByteBuf tOut = Unpooled.buffer();
+ encode(tOut);
+ final byte[] bytes = new byte[tOut.readableBytes()];
+ tOut.readBytes(bytes);
+ return bytes;
+ }
+
+ @Override
+ public abstract void encode(ByteBuf aOut);
+
+ @Override
+ public abstract GT_Packet_New decode(ByteArrayDataInput aData);
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_Pollution.java b/src/main/java/gregtech/api/net/GT_Packet_Pollution.java
new file mode 100644
index 0000000000..c298af2db4
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_Pollution.java
@@ -0,0 +1,47 @@
+package gregtech.api.net;
+
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.IBlockAccess;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.common.GT_Client;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Packet_Pollution extends GT_Packet_New {
+
+ private ChunkCoordIntPair chunk;
+ private int pollution;
+
+ public GT_Packet_Pollution() {
+ super(true);
+ }
+
+ public GT_Packet_Pollution(ChunkCoordIntPair chunk, int pollution) {
+ super(false);
+ this.chunk = chunk;
+ this.pollution = pollution;
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(chunk.chunkXPos)
+ .writeInt(chunk.chunkZPos)
+ .writeInt(pollution);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_Pollution(new ChunkCoordIntPair(aData.readInt(), aData.readInt()), aData.readInt());
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ GT_Client.recieveChunkPollutionPacket(chunk, pollution);
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 4;
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_RequestCoverData.java b/src/main/java/gregtech/api/net/GT_Packet_RequestCoverData.java
new file mode 100644
index 0000000000..94ae86c2d9
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_RequestCoverData.java
@@ -0,0 +1,113 @@
+package gregtech.api.net;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.network.INetHandler;
+import net.minecraft.network.NetHandlerPlayServer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.metatileentity.CoverableTileEntity;
+import gregtech.common.covers.CoverInfo;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * Client -> Server : ask for cover data
+ */
+public class GT_Packet_RequestCoverData extends GT_Packet_New {
+
+ protected int mX;
+ protected short mY;
+ protected int mZ;
+
+ protected ForgeDirection side;
+ protected int coverID;
+
+ protected EntityPlayerMP mPlayer;
+
+ public GT_Packet_RequestCoverData() {
+ super(true);
+ }
+
+ public GT_Packet_RequestCoverData(CoverInfo info, ICoverable tile) {
+ super(false);
+ this.mX = tile.getXCoord();
+ this.mY = tile.getYCoord();
+ this.mZ = tile.getZCoord();
+
+ this.side = info.getSide();
+ this.coverID = info.getCoverID();
+ }
+
+ public GT_Packet_RequestCoverData(int mX, short mY, int mZ, ForgeDirection coverSide, int coverID) {
+ super(false);
+ this.mX = mX;
+ this.mY = mY;
+ this.mZ = mZ;
+
+ this.side = coverSide;
+ this.coverID = coverID;
+ }
+
+ public GT_Packet_RequestCoverData(ForgeDirection coverSide, int coverID, ICoverable tile) {
+ super(false);
+ this.mX = tile.getXCoord();
+ this.mY = tile.getYCoord();
+ this.mZ = tile.getZCoord();
+
+ this.side = coverSide;
+ this.coverID = coverID;
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 17;
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(mX);
+ aOut.writeShort(mY);
+ aOut.writeInt(mZ);
+
+ aOut.writeByte(side.ordinal());
+ aOut.writeInt(coverID);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_RequestCoverData(
+ aData.readInt(),
+ aData.readShort(),
+ aData.readInt(),
+ ForgeDirection.getOrientation(aData.readByte()),
+ aData.readInt());
+ }
+
+ @Override
+ public void setINetHandler(INetHandler aHandler) {
+ if (aHandler instanceof NetHandlerPlayServer) {
+ mPlayer = ((NetHandlerPlayServer) aHandler).playerEntity;
+ }
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ // impossible, but who knows
+ if (mPlayer == null) return;
+ final World world = DimensionManager.getWorld(mPlayer.dimension);
+ if (world != null) {
+ final TileEntity tile = world.getTileEntity(mX, mY, mZ);
+ if (tile instanceof CoverableTileEntity te) {
+ if (!te.isDead() && te.getCoverIDAtSide(side) == coverID) {
+ te.issueCoverUpdate(side);
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_SendCoverData.java b/src/main/java/gregtech/api/net/GT_Packet_SendCoverData.java
new file mode 100644
index 0000000000..47f549b5b4
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_SendCoverData.java
@@ -0,0 +1,107 @@
+package gregtech.api.net;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.metatileentity.CoverableTileEntity;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.covers.CoverInfo;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * Server -> Client : Update cover data
+ */
+public class GT_Packet_SendCoverData extends GT_Packet_New {
+
+ protected int mX;
+ protected short mY;
+ protected int mZ;
+
+ protected ForgeDirection side;
+ protected int coverID;
+ protected ISerializableObject coverData;
+
+ public GT_Packet_SendCoverData() {
+ super(true);
+ }
+
+ public GT_Packet_SendCoverData(int mX, short mY, int mZ, ForgeDirection coverSide, int coverID,
+ ISerializableObject coverData) {
+ super(false);
+ this.mX = mX;
+ this.mY = mY;
+ this.mZ = mZ;
+
+ this.side = coverSide;
+ this.coverID = coverID;
+ this.coverData = coverData;
+ }
+
+ public GT_Packet_SendCoverData(CoverInfo info, ICoverable tile) {
+ super(false);
+ this.mX = tile.getXCoord();
+ this.mY = tile.getYCoord();
+ this.mZ = tile.getZCoord();
+
+ this.side = info.getSide();
+ this.coverID = info.getCoverID();
+ this.coverData = info.getCoverData();
+ }
+
+ public GT_Packet_SendCoverData(ForgeDirection coverSide, int coverID, ISerializableObject coverData,
+ ICoverable tile) {
+ super(false);
+ this.mX = tile.getXCoord();
+ this.mY = tile.getYCoord();
+ this.mZ = tile.getZCoord();
+
+ this.side = coverSide;
+ this.coverID = coverID;
+ this.coverData = coverData;
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 16;
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(mX);
+ aOut.writeShort(mY);
+ aOut.writeInt(mZ);
+
+ aOut.writeByte(side.ordinal());
+ aOut.writeInt(coverID);
+ coverData.writeToByteBuf(aOut);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ final int coverId;
+ return new GT_Packet_SendCoverData(
+ aData.readInt(),
+ aData.readShort(),
+ aData.readInt(),
+ ForgeDirection.getOrientation(aData.readByte()),
+ coverId = aData.readInt(),
+ GregTech_API.getCoverBehaviorNew(coverId)
+ .createDataObject()
+ .readFromPacket(aData, null));
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ if (aWorld != null) {
+ final TileEntity tile = aWorld.getTileEntity(mX, mY, mZ);
+ if (tile instanceof CoverableTileEntity coverable && !coverable.isDead()) {
+ coverable.receiveCoverData(side, coverID, coverData, null);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_SendOregenPattern.java b/src/main/java/gregtech/api/net/GT_Packet_SendOregenPattern.java
new file mode 100644
index 0000000000..d03fd1d7f0
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_SendOregenPattern.java
@@ -0,0 +1,56 @@
+package gregtech.api.net;
+
+import net.minecraft.world.IBlockAccess;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.util.GT_Log;
+import gregtech.common.GT_Worldgenerator;
+import gregtech.common.GT_Worldgenerator.OregenPattern;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Packet_SendOregenPattern extends GT_Packet_New {
+
+ protected OregenPattern pattern = OregenPattern.AXISSYMMETRICAL;
+
+ public GT_Packet_SendOregenPattern() {
+ super(true);
+ }
+
+ public GT_Packet_SendOregenPattern(OregenPattern pattern) {
+ super(false);
+ this.pattern = pattern;
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(this.pattern.ordinal());
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ int ordinal = aData.readInt();
+ // make sure we get valid data:
+ if (ordinal >= 0 && ordinal < OregenPattern.values().length) {
+ return new GT_Packet_SendOregenPattern(OregenPattern.values()[ordinal]);
+ }
+ // invalid data, default to AXISSYMMETRICAL:
+ GT_Log.err.println(
+ String.format(
+ "Received invalid data! Received %d but value must be between 0 and %d! Default (0) will be used.",
+ ordinal,
+ OregenPattern.values().length - 1));
+ return new GT_Packet_SendOregenPattern();
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 19;
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ GT_Worldgenerator.oregenPattern = this.pattern;
+ }
+
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_SetConfigurationCircuit.java b/src/main/java/gregtech/api/net/GT_Packet_SetConfigurationCircuit.java
new file mode 100644
index 0000000000..b2d9a59438
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_SetConfigurationCircuit.java
@@ -0,0 +1,110 @@
+package gregtech.api.net;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.network.INetHandler;
+import net.minecraft.network.NetHandlerPlayServer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import cpw.mods.fml.common.network.ByteBufUtils;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IHasInventory;
+import gregtech.api.metatileentity.BaseTileEntity;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * Client -> Server: Update machine configuration data
+ */
+public class GT_Packet_SetConfigurationCircuit extends GT_Packet_New {
+
+ protected int mX;
+ protected short mY;
+ protected int mZ;
+ protected int dimId;
+
+ protected ItemStack circuit;
+
+ public GT_Packet_SetConfigurationCircuit() {
+ super(true);
+ }
+
+ public GT_Packet_SetConfigurationCircuit(IGregTechTileEntity tile, ItemStack circuit) {
+ this(tile.getXCoord(), tile.getYCoord(), tile.getZCoord(), circuit);
+ }
+
+ public GT_Packet_SetConfigurationCircuit(BaseTileEntity tile, ItemStack circuit) {
+ this(tile.getXCoord(), tile.getYCoord(), tile.getZCoord(), circuit);
+ }
+
+ public GT_Packet_SetConfigurationCircuit(int x, short y, int z, ItemStack circuit) {
+ super(false);
+
+ this.mX = x;
+ this.mY = y;
+ this.mZ = z;
+
+ this.circuit = circuit;
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 12;
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(mX);
+ aOut.writeShort(mY);
+ aOut.writeInt(mZ);
+
+ // no null check needed. ByteBufUtils will handle it
+ ByteBufUtils.writeItemStack(aOut, this.circuit);
+ }
+
+ @Override
+ public void setINetHandler(INetHandler aHandler) {
+ if (aHandler instanceof NetHandlerPlayServer) {
+ dimId = ((NetHandlerPlayServer) aHandler).playerEntity.dimension;
+ } else {
+ // packet sent to wrong side, so we need to ignore this one
+ // but there is no way to disrupt packet pipeline
+ // so we will instead go find world -2, which (hopefully) doesn't exist
+ // then we will fail silently in process()
+ dimId = -2;
+ }
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_SetConfigurationCircuit(
+ aData.readInt(),
+ aData.readShort(),
+ aData.readInt(),
+ ISerializableObject.readItemStackFromGreggyByteBuf(aData));
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ final World world = DimensionManager.getWorld(dimId);
+ if (world == null) return;
+
+ final TileEntity tile = world.getTileEntity(mX, mY, mZ);
+ if (!(tile instanceof BaseTileEntity) || ((BaseTileEntity) tile).isDead()) return;
+
+ final IConfigurationCircuitSupport machine = ((BaseTileEntity) tile).getConfigurationCircuitSupport();
+ if (machine == null) return;
+ if (!machine.allowSelectCircuit()) return;
+ machine.getConfigurationCircuits()
+ .stream()
+ .filter(stack -> GT_Utility.areStacksEqual(stack, circuit))
+ .findFirst()
+ .ifPresent(stack -> ((IHasInventory) tile).setInventorySlotContents(machine.getCircuitSlot(), stack));
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_Sound.java b/src/main/java/gregtech/api/net/GT_Packet_Sound.java
new file mode 100644
index 0000000000..fdaf5b3979
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_Sound.java
@@ -0,0 +1,70 @@
+package gregtech.api.net;
+
+import java.io.IOException;
+
+import net.minecraft.world.IBlockAccess;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufOutputStream;
+
+public class GT_Packet_Sound extends GT_Packet_New {
+
+ private int mX, mZ;
+ private short mY;
+ private String mSoundName;
+ private float mSoundStrength, mSoundPitch;
+
+ public GT_Packet_Sound() {
+ super(true);
+ }
+
+ public GT_Packet_Sound(String aSoundName, float aSoundStrength, float aSoundPitch, int aX, short aY, int aZ) {
+ super(false);
+ mX = aX;
+ mY = aY;
+ mZ = aZ;
+ mSoundName = aSoundName;
+ mSoundStrength = aSoundStrength;
+ mSoundPitch = aSoundPitch;
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ try (ByteBufOutputStream byteOutputStream = new ByteBufOutputStream(aOut)) {
+ byteOutputStream.writeUTF(mSoundName);
+ byteOutputStream.writeFloat(mSoundStrength);
+ byteOutputStream.writeFloat(mSoundPitch);
+ byteOutputStream.writeInt(mX);
+ byteOutputStream.writeShort(mY);
+ byteOutputStream.writeInt(mZ);
+ } catch (IOException e) {
+ // this really shouldn't happen, but whatever
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_Sound(
+ aData.readUTF(),
+ aData.readFloat(),
+ aData.readFloat(),
+ aData.readInt(),
+ aData.readShort(),
+ aData.readInt());
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ GT_Utility.doSoundAtClient(mSoundName, 1, mSoundStrength, mSoundPitch, mX, mY, mZ);
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 1;
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java b/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java
new file mode 100644
index 0000000000..29562e9b4d
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java
@@ -0,0 +1,157 @@
+package gregtech.api.net;
+
+import net.minecraft.block.Block;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.GT_Mod;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Packet_TileEntity extends GT_Packet_New {
+
+ private int mX, mZ, mC0, mC1, mC2, mC3, mC4, mC5;
+ private short mY, mID, mRID;
+ private byte mTexture, mTexturePage, mUpdate, mRedstone, mColor;
+
+ public GT_Packet_TileEntity() {
+ super(true);
+ }
+
+ // For multi tiles
+ public GT_Packet_TileEntity(int aX, short aY, int aZ, short aRID, short aID, int aC0, int aC1, int aC2, int aC3,
+ int aC4, int aC5, byte aTexture, byte aTexturePage, byte aUpdate, byte aRedstone, byte aColor) {
+ super(false);
+ mX = aX;
+ mY = aY;
+ mZ = aZ;
+ mC0 = aC0;
+ mC1 = aC1;
+ mC2 = aC2;
+ mC3 = aC3;
+ mC4 = aC4;
+ mC5 = aC5;
+ mRID = aRID;
+ mID = aID;
+ mTexture = aTexture;
+ mTexturePage = aTexturePage;
+ mUpdate = aUpdate;
+ mRedstone = aRedstone;
+ mColor = aColor;
+ }
+
+ // For meta tiles
+ public GT_Packet_TileEntity(int aX, short aY, int aZ, short aID, int aC0, int aC1, int aC2, int aC3, int aC4,
+ int aC5, byte aTexture, byte aTexturePage, byte aUpdate, byte aRedstone, byte aColor) {
+ this(
+ aX,
+ aY,
+ aZ,
+ (short) 0,
+ aID,
+ aC0,
+ aC1,
+ aC2,
+ aC3,
+ aC4,
+ aC5,
+ aTexture,
+ aTexturePage,
+ aUpdate,
+ aRedstone,
+ aColor);
+ }
+
+ // For pipes
+ public GT_Packet_TileEntity(int aX, short aY, int aZ, short aID, int aC0, int aC1, int aC2, int aC3, int aC4,
+ int aC5, byte aTexture, byte aUpdate, byte aRedstone, byte aColor) {
+ this(aX, aY, aZ, (short) 0, aID, aC0, aC1, aC2, aC3, aC4, aC5, aTexture, (byte) 0, aUpdate, aRedstone, aColor);
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(mX);
+ aOut.writeShort(mY);
+ aOut.writeInt(mZ);
+
+ aOut.writeShort(mRID);
+ aOut.writeShort(mID);
+
+ aOut.writeInt(mC0);
+ aOut.writeInt(mC1);
+ aOut.writeInt(mC2);
+ aOut.writeInt(mC3);
+ aOut.writeInt(mC4);
+ aOut.writeInt(mC5);
+
+ aOut.writeByte(mTexture);
+ aOut.writeByte(mTexturePage);
+ aOut.writeByte(mUpdate);
+ aOut.writeByte(mRedstone);
+ aOut.writeByte(mColor);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_TileEntity(
+ // Coords
+ aData.readInt(),
+ aData.readShort(),
+ aData.readInt(),
+ // Registry & ID
+ aData.readShort(),
+ aData.readShort(),
+ // Covers
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt(),
+ // Everything else
+ aData.readByte(),
+ aData.readByte(),
+ aData.readByte(),
+ aData.readByte(),
+ aData.readByte());
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ if (aWorld == null) return;
+ final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ);
+ try {
+ final Block tBlock;
+ if (tTileEntity instanceof BaseMetaTileEntity) ((BaseMetaTileEntity) tTileEntity).receiveMetaTileEntityData(
+ mID,
+ mC0,
+ mC1,
+ mC2,
+ mC3,
+ mC4,
+ mC5,
+ mTexture,
+ mTexturePage,
+ mUpdate,
+ mRedstone,
+ mColor);
+ else if (tTileEntity instanceof BaseMetaPipeEntity) ((BaseMetaPipeEntity) tTileEntity)
+ .receiveMetaTileEntityData(mID, mC0, mC1, mC2, mC3, mC4, mC5, mTexture, mUpdate, mRedstone, mColor);
+ } catch (Exception e) {
+ GT_Mod.GT_FML_LOGGER.error(
+ "Exception setting tile entity data for tile entity {} at ({}, {}, {})",
+ tTileEntity,
+ mX,
+ mY,
+ mZ);
+ }
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_TileEntityCover.java b/src/main/java/gregtech/api/net/GT_Packet_TileEntityCover.java
new file mode 100644
index 0000000000..d3642b62e8
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_TileEntityCover.java
@@ -0,0 +1,98 @@
+package gregtech.api.net;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * Client -> Server: Update cover data. use this only if you are using the legacy data storage
+ */
+public class GT_Packet_TileEntityCover extends GT_Packet_New {
+
+ protected int mX;
+ protected short mY;
+ protected int mZ;
+
+ protected ForgeDirection side;
+ protected int coverID, coverData, dimID;
+
+ public GT_Packet_TileEntityCover() {
+ super(true);
+ }
+
+ public GT_Packet_TileEntityCover(int mX, short mY, int mZ, ForgeDirection coverSide, int coverID, int coverData,
+ int dimID) {
+ super(false);
+ this.mX = mX;
+ this.mY = mY;
+ this.mZ = mZ;
+
+ this.side = coverSide;
+ this.coverID = coverID;
+ this.coverData = coverData;
+
+ this.dimID = dimID;
+ }
+
+ public GT_Packet_TileEntityCover(ForgeDirection coverSide, int coverID, int coverData, ICoverable tile) {
+ super(false);
+ this.mX = tile.getXCoord();
+ this.mY = tile.getYCoord();
+ this.mZ = tile.getZCoord();
+
+ this.side = coverSide;
+ this.coverID = coverID;
+ this.coverData = coverData;
+
+ this.dimID = tile.getWorld().provider.dimensionId;
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 6;
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(mX);
+ aOut.writeShort(mY);
+ aOut.writeInt(mZ);
+
+ aOut.writeByte(side.ordinal());
+ aOut.writeInt(coverID);
+ aOut.writeInt(coverData);
+
+ aOut.writeInt(dimID);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_TileEntityCover(
+ aData.readInt(),
+ aData.readShort(),
+ aData.readInt(),
+ ForgeDirection.getOrientation(aData.readByte()),
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt());
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ World world = DimensionManager.getWorld(dimID);
+ if (world != null) {
+ TileEntity tile = world.getTileEntity(mX, mY, mZ);
+ if (tile instanceof IGregTechTileEntity && !((IGregTechTileEntity) tile).isDead()) {
+ ((IGregTechTileEntity) tile).receiveCoverData(side, coverID, coverData);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverGUI.java b/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverGUI.java
new file mode 100644
index 0000000000..1b61f87541
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverGUI.java
@@ -0,0 +1,219 @@
+package gregtech.api.net;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.gui.GT_GUICover;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.covers.CoverInfo;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * Server -> Client: Show GUI
+ */
+public class GT_Packet_TileEntityCoverGUI extends GT_Packet_New {
+
+ protected int mX;
+ protected short mY;
+ protected int mZ;
+
+ protected ForgeDirection side;
+ protected int coverID, dimID, playerID;
+ protected ISerializableObject coverData;
+
+ protected int parentGuiId;
+
+ public GT_Packet_TileEntityCoverGUI() {
+ super(true);
+ }
+
+ public GT_Packet_TileEntityCoverGUI(int mX, short mY, int mZ, ForgeDirection coverSide, int coverID, int coverData,
+ int dimID, int playerID) {
+ super(false);
+ this.mX = mX;
+ this.mY = mY;
+ this.mZ = mZ;
+
+ this.side = coverSide;
+ this.coverID = coverID;
+ this.coverData = new ISerializableObject.LegacyCoverData(coverData);
+
+ this.dimID = dimID;
+ this.playerID = playerID;
+ this.parentGuiId = -1;
+ }
+
+ public GT_Packet_TileEntityCoverGUI(int mX, short mY, int mZ, ForgeDirection coverSide, int coverID,
+ ISerializableObject coverData, int dimID, int playerID) {
+ super(false);
+ this.mX = mX;
+ this.mY = mY;
+ this.mZ = mZ;
+
+ this.side = coverSide;
+ this.coverID = coverID;
+ this.coverData = coverData;
+ this.dimID = dimID;
+ this.playerID = playerID;
+ this.parentGuiId = -1;
+ }
+
+ public GT_Packet_TileEntityCoverGUI(CoverInfo coverInfo, int dimID, int playerID, int parentGuiId) {
+ super(false);
+ final ICoverable tile = coverInfo.getTile();
+ this.mX = tile.getXCoord();
+ this.mY = tile.getYCoord();
+ this.mZ = tile.getZCoord();
+
+ this.side = coverInfo.getSide();
+ this.coverID = coverInfo.getCoverID();
+ this.coverData = coverInfo.getCoverData();
+
+ this.dimID = dimID;
+ this.playerID = playerID;
+ this.parentGuiId = parentGuiId;
+ }
+
+ public GT_Packet_TileEntityCoverGUI(int mX, short mY, int mZ, ForgeDirection coverSide, int coverID,
+ ISerializableObject coverData, int dimID, int playerID, int parentGuiId) {
+ super(false);
+ this.mX = mX;
+ this.mY = mY;
+ this.mZ = mZ;
+
+ this.side = coverSide;
+ this.coverID = coverID;
+ this.coverData = coverData;
+ this.dimID = dimID;
+ this.playerID = playerID;
+ this.parentGuiId = parentGuiId;
+ }
+
+ public GT_Packet_TileEntityCoverGUI(ForgeDirection side, int coverID, int coverData, ICoverable tile,
+ EntityPlayerMP aPlayer) {
+ super(false);
+
+ this.mX = tile.getXCoord();
+ this.mY = tile.getYCoord();
+ this.mZ = tile.getZCoord();
+
+ this.side = side;
+ this.coverID = coverID;
+ this.coverData = new ISerializableObject.LegacyCoverData(coverData);
+
+ this.dimID = tile.getWorld().provider.dimensionId;
+ this.playerID = aPlayer.getEntityId();
+ this.parentGuiId = -1;
+ }
+
+ public GT_Packet_TileEntityCoverGUI(ForgeDirection coverSide, int coverID, int coverData,
+ IGregTechTileEntity tile) {
+ super(false);
+ this.mX = tile.getXCoord();
+ this.mY = tile.getYCoord();
+ this.mZ = tile.getZCoord();
+
+ this.side = coverSide;
+ this.coverID = coverID;
+ this.coverData = new ISerializableObject.LegacyCoverData(coverData);
+
+ this.dimID = tile.getWorld().provider.dimensionId;
+ this.parentGuiId = -1;
+ }
+
+ public GT_Packet_TileEntityCoverGUI(ForgeDirection side, int coverID, ISerializableObject coverData,
+ ICoverable tile, EntityPlayerMP aPlayer) {
+ super(false);
+ this.mX = tile.getXCoord();
+ this.mY = tile.getYCoord();
+ this.mZ = tile.getZCoord();
+
+ this.side = side;
+ this.coverID = coverID;
+ this.coverData = coverData.copy(); // make a copy so we don't get a race condition
+
+ this.dimID = tile.getWorld().provider.dimensionId;
+ this.playerID = aPlayer.getEntityId();
+ this.parentGuiId = -1;
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 7;
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(mX);
+ aOut.writeShort(mY);
+ aOut.writeInt(mZ);
+
+ aOut.writeByte(side.ordinal());
+ aOut.writeInt(coverID);
+ coverData.writeToByteBuf(aOut);
+
+ aOut.writeInt(dimID);
+ aOut.writeInt(playerID);
+
+ aOut.writeInt(parentGuiId);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ final int coverID;
+ return new GT_Packet_TileEntityCoverGUI(
+ aData.readInt(),
+ aData.readShort(),
+ aData.readInt(),
+ ForgeDirection.getOrientation(aData.readByte()),
+ coverID = aData.readInt(),
+ GregTech_API.getCoverBehaviorNew(coverID)
+ .createDataObject()
+ .readFromPacket(aData, null),
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt());
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ if (aWorld instanceof World) {
+ // Using EntityPlayer instead of EntityClientPlayerMP so both client and server can load this
+ final EntityPlayer thePlayer = ((EntityPlayer) ((World) aWorld).getEntityByID(playerID));
+ final TileEntity tile = aWorld.getTileEntity(mX, mY, mZ);
+ if (tile instanceof IGregTechTileEntity gtTile && !gtTile.isDead()) {
+ gtTile.setCoverDataAtSide(side, coverData); // Set it client side to read later.
+
+ GT_CoverBehaviorBase<?> cover = gtTile.getCoverBehaviorAtSideNew(side);
+ if (cover.hasCoverGUI()) {
+ final GuiScreen gui = (GuiScreen) cover.getClientGUI(
+ side,
+ gtTile.getCoverIDAtSide(side),
+ gtTile.getComplexCoverDataAtSide(side),
+ gtTile,
+ thePlayer,
+ thePlayer.worldObj);
+ // If it's one of this mod's covers, tell it to exit to the GUI with the specified ID (-1 is
+ // ignored)
+ if (gui instanceof GT_GUICover guiCover) {
+ guiCover.setParentGuiId(parentGuiId);
+ }
+ Minecraft.getMinecraft()
+ .displayGuiScreen(gui);
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverNew.java b/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverNew.java
new file mode 100644
index 0000000000..8fd7348b24
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_TileEntityCoverNew.java
@@ -0,0 +1,119 @@
+package gregtech.api.net;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.network.INetHandler;
+import net.minecraft.network.NetHandlerPlayServer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.ISerializableObject;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * Client -> Server: Update cover data
+ */
+public class GT_Packet_TileEntityCoverNew extends GT_Packet_New {
+
+ protected int mX;
+ protected short mY;
+ protected int mZ;
+
+ protected ForgeDirection side;
+ protected int coverID, dimID;
+ protected ISerializableObject coverData;
+
+ protected EntityPlayerMP mPlayer;
+
+ public GT_Packet_TileEntityCoverNew() {
+ super(true);
+ }
+
+ public GT_Packet_TileEntityCoverNew(int mX, short mY, int mZ, ForgeDirection coverSide, int coverID,
+ ISerializableObject coverData, int dimID) {
+ super(false);
+ this.mX = mX;
+ this.mY = mY;
+ this.mZ = mZ;
+
+ this.side = coverSide;
+ this.coverID = coverID;
+ this.coverData = coverData;
+
+ this.dimID = dimID;
+ }
+
+ public GT_Packet_TileEntityCoverNew(ForgeDirection coverSide, int coverID, ISerializableObject coverData,
+ ICoverable tile) {
+ super(false);
+ this.mX = tile.getXCoord();
+ this.mY = tile.getYCoord();
+ this.mZ = tile.getZCoord();
+
+ this.side = coverSide;
+ this.coverID = coverID;
+ this.coverData = coverData;
+
+ this.dimID = tile.getWorld().provider.dimensionId;
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 11;
+ }
+
+ @Override
+ public void setINetHandler(INetHandler aHandler) {
+ if (aHandler instanceof NetHandlerPlayServer) {
+ mPlayer = ((NetHandlerPlayServer) aHandler).playerEntity;
+ }
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(mX);
+ aOut.writeShort(mY);
+ aOut.writeInt(mZ);
+
+ aOut.writeByte(side.ordinal());
+ aOut.writeInt(coverID);
+ coverData.writeToByteBuf(aOut);
+
+ aOut.writeInt(dimID);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ int coverId;
+ return new GT_Packet_TileEntityCoverNew(
+ aData.readInt(),
+ aData.readShort(),
+ aData.readInt(),
+ ForgeDirection.getOrientation(aData.readByte()),
+ coverId = aData.readInt(),
+ GregTech_API.getCoverBehaviorNew(coverId)
+ .createDataObject()
+ .readFromPacket(aData, mPlayer),
+ aData.readInt());
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ if (mPlayer == null) // impossible, but who knows
+ return;
+ World world = DimensionManager.getWorld(dimID);
+ if (world != null) {
+ TileEntity tile = world.getTileEntity(mX, mY, mZ);
+ if (tile instanceof IGregTechTileEntity && !((IGregTechTileEntity) tile).isDead()) {
+ ((IGregTechTileEntity) tile).receiveCoverData(side, coverID, coverData, mPlayer);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_UpdateItem.java b/src/main/java/gregtech/api/net/GT_Packet_UpdateItem.java
new file mode 100644
index 0000000000..e8ec9be80b
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_UpdateItem.java
@@ -0,0 +1,64 @@
+package gregtech.api.net;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.INetHandler;
+import net.minecraft.network.NetHandlerPlayServer;
+import net.minecraft.world.IBlockAccess;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import cpw.mods.fml.common.network.ByteBufUtils;
+import gregtech.api.interfaces.INetworkUpdatableItem;
+import gregtech.api.util.ISerializableObject;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * Client -> Server: send arbitrary data to server and update the currently held item.
+ */
+public class GT_Packet_UpdateItem extends GT_Packet_New {
+
+ private NBTTagCompound tag;
+ private EntityPlayerMP mPlayer;
+
+ public GT_Packet_UpdateItem() {
+ super(true);
+ }
+
+ public GT_Packet_UpdateItem(NBTTagCompound tag) {
+ super(false);
+ this.tag = tag;
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 13;
+ }
+
+ @Override
+ public void setINetHandler(INetHandler aHandler) {
+ if (aHandler instanceof NetHandlerPlayServer) {
+ mPlayer = ((NetHandlerPlayServer) aHandler).playerEntity;
+ }
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ ByteBufUtils.writeTag(aOut, tag);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_UpdateItem(ISerializableObject.readCompoundTagFromGreggyByteBuf(aData));
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ if (mPlayer == null) return;
+ ItemStack stack = mPlayer.inventory.getCurrentItem();
+ if (stack != null && stack.getItem() instanceof INetworkUpdatableItem) {
+ ((INetworkUpdatableItem) stack.getItem()).receive(stack, mPlayer, tag);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_WirelessRedstoneCover.java b/src/main/java/gregtech/api/net/GT_Packet_WirelessRedstoneCover.java
new file mode 100644
index 0000000000..08628ace2b
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_WirelessRedstoneCover.java
@@ -0,0 +1,99 @@
+package gregtech.api.net;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.network.INetHandler;
+import net.minecraft.network.NetHandlerPlayServer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Packet_WirelessRedstoneCover extends GT_Packet_TileEntityCover {
+
+ private static final int PRIVATE_MASK = 0xFFFE0000;
+ private static final int PUBLIC_MASK = 0x0000FFFF;
+ private static final int CHECKBOX_MASK = 0x00010000;
+
+ private EntityPlayerMP mPlayer;
+ private int mPublicChannel;
+ private int mCheckBoxValue;
+
+ public GT_Packet_WirelessRedstoneCover() {
+ super();
+ }
+
+ public GT_Packet_WirelessRedstoneCover(int mX, short mY, int mZ, ForgeDirection coverSide, int coverID, int dimID,
+ int publicChannel, int checkBoxValue) {
+ super(mX, mY, mZ, coverSide, coverID, 0, dimID);
+ mPublicChannel = publicChannel;
+ mCheckBoxValue = checkBoxValue;
+ }
+
+ public GT_Packet_WirelessRedstoneCover(ForgeDirection coverSide, int coverID, ICoverable tile, int publicChannel,
+ int checkBoxValue) {
+ super(coverSide, coverID, 0, tile);
+ mPublicChannel = publicChannel;
+ mCheckBoxValue = checkBoxValue;
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 10;
+ }
+
+ @Override
+ public void setINetHandler(INetHandler aHandler) {
+ if (aHandler instanceof NetHandlerPlayServer) {
+ mPlayer = ((NetHandlerPlayServer) aHandler).playerEntity;
+ }
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(mX);
+ aOut.writeShort(mY);
+ aOut.writeInt(mZ);
+
+ aOut.writeByte(side.ordinal());
+ aOut.writeInt(coverID);
+
+ aOut.writeInt(dimID);
+
+ aOut.writeInt(mPublicChannel);
+ aOut.writeInt(mCheckBoxValue);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_WirelessRedstoneCover(
+ aData.readInt(),
+ aData.readShort(),
+ aData.readInt(),
+ ForgeDirection.getOrientation(aData.readByte()),
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt(),
+ aData.readInt());
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ World world = DimensionManager.getWorld(dimID);
+ if (world != null && world.blockExists(mX, mY, mZ)) {
+ TileEntity tile = world.getTileEntity(mX, mY, mZ);
+ if (tile instanceof IGregTechTileEntity && !((IGregTechTileEntity) tile).isDead()) {
+ int tPrivateChannel = (mCheckBoxValue > 0) ? mPlayer.getUniqueID()
+ .hashCode() & PRIVATE_MASK : 0;
+ int tCoverData = tPrivateChannel | (mCheckBoxValue & CHECKBOX_MASK) | (mPublicChannel & PUBLIC_MASK);
+ ((IGregTechTileEntity) tile).receiveCoverData(side, coverID, tCoverData);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/net/IGT_NetworkHandler.java b/src/main/java/gregtech/api/net/IGT_NetworkHandler.java
new file mode 100644
index 0000000000..07c4a37030
--- /dev/null
+++ b/src/main/java/gregtech/api/net/IGT_NetworkHandler.java
@@ -0,0 +1,18 @@
+package gregtech.api.net;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
+
+@SuppressWarnings("deprecation")
+public interface IGT_NetworkHandler {
+
+ void sendToPlayer(GT_Packet aPacket, EntityPlayerMP aPlayer);
+
+ void sendToAllAround(GT_Packet aPacket, TargetPoint aPosition);
+
+ void sendToServer(GT_Packet aPacket);
+
+ void sendPacketToAllPlayersInRange(World aWorld, GT_Packet aPacket, int aX, int aZ);
+}
diff --git a/src/main/java/gregtech/api/net/data/CasingData.java b/src/main/java/gregtech/api/net/data/CasingData.java
new file mode 100644
index 0000000000..627c1eacf2
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/CasingData.java
@@ -0,0 +1,53 @@
+package gregtech.api.net.data;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.util.ChunkCoordinates;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+
+public class CasingData extends PacketData<MultiTileEntityProcess> {
+
+ public static final int CASING_DATA_ID = 4;
+
+ private int currentMode;
+ private int allowedModes;
+ private ChunkCoordinates controllerCoords;
+
+ public CasingData() {}
+
+ public CasingData(int currentMode, int allowedModes, ChunkCoordinates controllerCoords) {
+ this.currentMode = currentMode;
+ this.allowedModes = allowedModes;
+ this.controllerCoords = controllerCoords;
+ }
+
+ @Override
+ public void decode(@Nonnull ByteArrayDataInput in) {
+ currentMode = in.readInt();
+ allowedModes = in.readInt();
+ controllerCoords = new ChunkCoordinates(in.readInt(), in.readInt(), in.readInt());
+ }
+
+ @Override
+ public void encode(@Nonnull ByteBuf out) {
+ out.writeInt(currentMode);
+ out.writeInt(allowedModes);
+ out.writeInt(controllerCoords.posX);
+ out.writeInt(controllerCoords.posY);
+ out.writeInt(controllerCoords.posZ);
+ }
+
+ @Override
+ public int getId() {
+ return CASING_DATA_ID;
+ }
+
+ @Override
+ public void process(MultiTileEntityProcess processData) {
+
+ }
+
+}
diff --git a/src/main/java/gregtech/api/net/data/CommonData.java b/src/main/java/gregtech/api/net/data/CommonData.java
new file mode 100644
index 0000000000..294cca134b
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/CommonData.java
@@ -0,0 +1,50 @@
+package gregtech.api.net.data;
+
+import javax.annotation.Nonnull;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+
+public class CommonData extends PacketData<MultiTileEntityProcess> {
+
+ public static final int COMMON_DATA_ID = 2;
+
+ private byte redstone;
+ private byte color;
+ private byte commonData;
+
+ public CommonData() {}
+
+ public CommonData(byte redstone, byte color, byte commonData) {
+ this.redstone = redstone;
+ this.color = color;
+ this.commonData = commonData;
+ }
+
+ @Override
+ public void decode(@Nonnull ByteArrayDataInput in) {
+ redstone = in.readByte();
+ color = in.readByte();
+ commonData = in.readByte();
+ }
+
+ @Override
+ public void encode(@Nonnull ByteBuf out) {
+ out.writeByte(redstone);
+ out.writeByte(color);
+ out.writeByte(commonData);
+ }
+
+ @Override
+ public int getId() {
+ return COMMON_DATA_ID;
+ }
+
+ @Override
+ public void process(MultiTileEntityProcess processData) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/src/main/java/gregtech/api/net/data/CoordinateData.java b/src/main/java/gregtech/api/net/data/CoordinateData.java
new file mode 100644
index 0000000000..ad8ebbd210
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/CoordinateData.java
@@ -0,0 +1,50 @@
+package gregtech.api.net.data;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.util.ChunkCoordinates;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+
+public class CoordinateData extends PacketData<MultiTileEntityProcess> {
+
+ public final static int COORDINATE_DATA_ID = 0;
+
+ private ChunkCoordinates coords;
+
+ public CoordinateData(ChunkCoordinates coords) {
+ this.coords = coords;
+ }
+
+ public CoordinateData(int x, int y, int z) {
+ this(new ChunkCoordinates(x, y, z));
+ }
+
+ public CoordinateData() {}
+
+ @Override
+ public int getId() {
+ return COORDINATE_DATA_ID;
+ }
+
+ @Override
+ public void encode(@Nonnull ByteBuf out) {
+ out.writeInt(coords.posX);
+ out.writeInt(coords.posY);
+ out.writeInt(coords.posZ);
+ }
+
+ @Override
+ public void decode(@Nonnull ByteArrayDataInput in) {
+ coords = new ChunkCoordinates(in.readInt(), in.readInt(), in.readInt());
+ }
+
+ @Override
+ public void process(MultiTileEntityProcess processData) {
+ if (coords == null) return;
+ processData.giveCoordinates(coords);
+ }
+
+}
diff --git a/src/main/java/gregtech/api/net/data/MultiTileEntityData.java b/src/main/java/gregtech/api/net/data/MultiTileEntityData.java
new file mode 100644
index 0000000000..2bdbf4acc9
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/MultiTileEntityData.java
@@ -0,0 +1,45 @@
+package gregtech.api.net.data;
+
+import javax.annotation.Nonnull;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+
+public class MultiTileEntityData extends PacketData<MultiTileEntityProcess> {
+
+ public static final int MULTI_TILE_ENTITY_DATA_ID = 1;
+
+ private int registryId;
+ private int metaId;
+
+ public MultiTileEntityData() {}
+
+ public MultiTileEntityData(int registryId, int metaId) {
+ this.registryId = registryId;
+ this.metaId = metaId;
+ }
+
+ @Override
+ public int getId() {
+ return MULTI_TILE_ENTITY_DATA_ID;
+ }
+
+ @Override
+ public void encode(@Nonnull ByteBuf out) {
+ out.writeInt(registryId);
+ out.writeInt(metaId);
+ }
+
+ @Override
+ public void decode(@Nonnull ByteArrayDataInput in) {
+ registryId = in.readInt();
+ metaId = in.readInt();
+ }
+
+ @Override
+ public void process(MultiTileEntityProcess processData) {
+ processData.giveMultiTileEntityData(registryId, metaId);
+ }
+
+}
diff --git a/src/main/java/gregtech/api/net/data/MultiTileEntityProcess.java b/src/main/java/gregtech/api/net/data/MultiTileEntityProcess.java
new file mode 100644
index 0000000000..02e04981c0
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/MultiTileEntityProcess.java
@@ -0,0 +1,54 @@
+package gregtech.api.net.data;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.IBlockAccess;
+
+import gregtech.api.multitileentity.MultiTileEntityBlock;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+
+public class MultiTileEntityProcess extends Process {
+
+ @Nonnull
+ private final IBlockAccess world;
+ private ChunkCoordinates coords;
+ private int registryId;
+ private int metaId;
+ private byte redstone;
+ private byte color;
+ private byte commonData;
+
+ public MultiTileEntityProcess(@Nonnull IBlockAccess world) {
+ this.world = world;
+ }
+
+ @Override
+ public void process() {
+ if (coords == null) return;
+ Block block = world.getBlock(coords.posX, coords.posY, coords.posZ);
+ if (!(block instanceof MultiTileEntityBlock muteBlock)) {
+ return;
+ }
+ IMultiTileEntity mute = muteBlock
+ .receiveMultiTileEntityData(world, coords.posX, coords.posY, coords.posZ, registryId, metaId);
+ if (mute == null) return;
+ mute.setColorization(color);
+ }
+
+ public void giveCoordinates(@Nonnull ChunkCoordinates coords) {
+ this.coords = coords;
+ }
+
+ public void giveMultiTileEntityData(int registryId, int metaId) {
+ this.registryId = registryId;
+ this.metaId = metaId;
+ }
+
+ public void giveCommonData(byte redstone, byte color, byte commonData) {
+ this.redstone = redstone;
+ this.color = color;
+ this.commonData = commonData;
+ }
+}
diff --git a/src/main/java/gregtech/api/net/data/PacketData.java b/src/main/java/gregtech/api/net/data/PacketData.java
new file mode 100644
index 0000000000..bde2b9fb76
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/PacketData.java
@@ -0,0 +1,48 @@
+package gregtech.api.net.data;
+
+import javax.annotation.Nonnull;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+
+public abstract class PacketData<T extends Process> implements Comparable<PacketData<T>> {
+
+ /**
+ * This should return the Id of the packet. The Id is is used to bit-shift to be added a header for the packet its
+ * used in
+ */
+ public abstract int getId();
+
+ /**
+ * Called by the packet it is held by to store the data it needs
+ */
+ public abstract void encode(@Nonnull ByteBuf out);
+
+ /**
+ * Called by the packet it is held by to decode the data to later be used in {@link #process()}
+ */
+ public abstract void decode(@Nonnull ByteArrayDataInput in);
+
+ /**
+ * Called by the packet it is held by to process the data it decoded.
+ */
+ public abstract void process(T processData);
+
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) return true;
+ if (!(other instanceof PacketData otherData)) return false;
+ return this.getId() == otherData.getId();
+ }
+
+ @Override
+ public int hashCode() {
+ return getId();
+ }
+
+ @Override
+ public int compareTo(PacketData<T> other) {
+ return Integer.compare(this.getId(), other.getId());
+ }
+}
diff --git a/src/main/java/gregtech/api/net/data/Process.java b/src/main/java/gregtech/api/net/data/Process.java
new file mode 100644
index 0000000000..d5bc1317b7
--- /dev/null
+++ b/src/main/java/gregtech/api/net/data/Process.java
@@ -0,0 +1,6 @@
+package gregtech.api.net.data;
+
+public abstract class Process {
+
+ public abstract void process();
+}
diff --git a/src/main/java/gregtech/api/objects/AE2DigitalChestHandler.java b/src/main/java/gregtech/api/objects/AE2DigitalChestHandler.java
new file mode 100644
index 0000000000..c2e0556de9
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/AE2DigitalChestHandler.java
@@ -0,0 +1,26 @@
+package gregtech.api.objects;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalChestBase;
+
+public class AE2DigitalChestHandler implements appeng.api.storage.IExternalStorageHandler {
+
+ @Override
+ public boolean canHandle(final TileEntity te, final ForgeDirection d, final appeng.api.storage.StorageChannel chan,
+ final appeng.api.networking.security.BaseActionSource mySrc) {
+ return chan == appeng.api.storage.StorageChannel.ITEMS && te instanceof BaseMetaTileEntity
+ && ((BaseMetaTileEntity) te).getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalChestBase;
+ }
+
+ @Override
+ public appeng.api.storage.IMEInventory<?> getInventory(final TileEntity te, final ForgeDirection d,
+ final appeng.api.storage.StorageChannel chan, final appeng.api.networking.security.BaseActionSource src) {
+ if (chan == appeng.api.storage.StorageChannel.ITEMS) {
+ return ((GT_MetaTileEntity_DigitalChestBase) (((BaseMetaTileEntity) te).getMetaTileEntity()));
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/CollectorUtils.java b/src/main/java/gregtech/api/objects/CollectorUtils.java
new file mode 100644
index 0000000000..7265076683
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/CollectorUtils.java
@@ -0,0 +1,30 @@
+package gregtech.api.objects;
+
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.function.BinaryOperator;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+
+public class CollectorUtils {
+
+ /**
+ * Returns a merge function, suitable for use in {@link Map#merge(Object, Object, BiFunction) Map.merge()} or
+ * {@link Collectors#toMap(Function, Function, BinaryOperator) toMap()}, which always throws
+ * {@code IllegalStateException}. This can be used to enforce the assumption that the elements being collected are
+ * distinct.
+ *
+ * @param <T> the type of input arguments to the merge function
+ * @return a merge function which always throw {@code IllegalStateException}
+ */
+ public static <T> BinaryOperator<T> throwingMerger() {
+ return (u, v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); };
+ }
+
+ public static <K, V, E extends Map.Entry<K, V>, M extends Map<K, V>> Collector<E, ?, M> entriesToMap(
+ Supplier<M> mapSupplier) {
+ return Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, CollectorUtils.throwingMerger(), mapSupplier);
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/ElementStack.java b/src/main/java/gregtech/api/objects/ElementStack.java
new file mode 100644
index 0000000000..58fffd475a
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/ElementStack.java
@@ -0,0 +1,47 @@
+package gregtech.api.objects;
+
+import gregtech.api.enums.Element;
+
+public class ElementStack implements Cloneable {
+
+ public int mAmount;
+ public Element mElement;
+
+ public ElementStack(Element aElement, int aAmount) {
+ mElement = aElement == null ? Element._NULL : aElement;
+ mAmount = aAmount;
+ }
+
+ public ElementStack copy(int aAmount) {
+ return new ElementStack(mElement, aAmount);
+ }
+
+ @Override
+ public ElementStack clone() {
+ try {
+ return (ElementStack) super.clone();
+ } catch (Exception e) {
+ return new ElementStack(mElement, mAmount);
+ }
+ }
+
+ @Override
+ public boolean equals(Object aObject) {
+ if (aObject == this) return true;
+ if (aObject == null) return false;
+ if (aObject instanceof Element) return aObject == mElement;
+ if (aObject instanceof ElementStack) return ((ElementStack) aObject).mElement == mElement
+ && (mAmount < 0 || ((ElementStack) aObject).mAmount < 0 || ((ElementStack) aObject).mAmount == mAmount);
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return mElement.toString() + mAmount;
+ }
+
+ @Override
+ public int hashCode() {
+ return mElement.hashCode();
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_ArrayList.java b/src/main/java/gregtech/api/objects/GT_ArrayList.java
new file mode 100644
index 0000000000..9124ef8616
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_ArrayList.java
@@ -0,0 +1,73 @@
+package gregtech.api.objects;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Objects;
+
+import com.google.common.collect.Collections2;
+
+public class GT_ArrayList<E> extends ArrayList<E> {
+
+ private static final long serialVersionUID = 1L;
+ private int size_sS;
+
+ private final boolean mAllowNulls;
+
+ public GT_ArrayList(boolean aAllowNulls, int aCapacity) {
+ super(aCapacity);
+ mAllowNulls = aAllowNulls;
+ }
+
+ @SafeVarargs
+ public GT_ArrayList(boolean aAllowNulls, E... aArray) {
+ super(Arrays.asList(aArray));
+ mAllowNulls = aAllowNulls;
+ if (!mAllowNulls) {
+ size_sS = size();
+ for (int i = 0; i < size_sS; i++) if (get(i) == null) {
+ remove(i--);
+ size_sS = size();
+ }
+ }
+ }
+
+ public GT_ArrayList(boolean aAllowNulls, Collection<? extends E> aList) {
+ super(aList);
+ mAllowNulls = aAllowNulls;
+ if (!mAllowNulls) {
+ size_sS = size();
+ for (int i = 0; i < size_sS; i++) if (get(i) == null) {
+ remove(i--);
+ size_sS = size();
+ }
+ }
+ }
+
+ @Override
+ public E set(int aIndex, E aElement) {
+ if (mAllowNulls || aElement != null) return super.set(aIndex, aElement);
+ return null;
+ }
+
+ @Override
+ public boolean add(E aElement) {
+ if (mAllowNulls || aElement != null) return super.add(aElement);
+ return false;
+ }
+
+ @Override
+ public void add(int aIndex, E aElement) {
+ if (mAllowNulls || aElement != null) super.add(aIndex, aElement);
+ }
+
+ @Override
+ public boolean addAll(Collection<? extends E> aList) {
+ return super.addAll(Collections2.filter(aList, Objects::nonNull));
+ }
+
+ @Override
+ public boolean addAll(int aIndex, Collection<? extends E> aList) {
+ return super.addAll(aIndex, Collections2.filter(aList, Objects::nonNull));
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_ChunkManager.java b/src/main/java/gregtech/api/objects/GT_ChunkManager.java
new file mode 100644
index 0000000000..14baaddd3d
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_ChunkManager.java
@@ -0,0 +1,204 @@
+package gregtech.api.objects;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.World;
+import net.minecraftforge.common.ForgeChunkManager;
+import net.minecraftforge.common.ForgeChunkManager.Ticket;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ListMultimap;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.IChunkLoader;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Log;
+
+/**
+ * Handles re-initialization of chunks after a server restart.
+ */
+public class GT_ChunkManager
+ implements ForgeChunkManager.OrderedLoadingCallback, ForgeChunkManager.PlayerOrderedLoadingCallback {
+
+ private final Map<TileEntity, Ticket> registeredTickets = new HashMap<>();
+ public static GT_ChunkManager instance = new GT_ChunkManager();
+
+ public static void init() {
+ ForgeChunkManager.setForcedChunkLoadingCallback(GT_Mod.instance, instance);
+ }
+
+ @Override
+ public void ticketsLoaded(List<Ticket> tickets, World world) {}
+
+ /**
+ * Determines if tickets should be kept. Based on if the ticket is a machine or a working-chunk ticket.
+ * Working-chunk tickets are tossed and recreated when the machine reactivates.
+ * Machine tickets are kept only if the config {@code alwaysReloadChunkloaders} is true.
+ * Otherwise, machine chunks are tossed and recreated only when the machine reactivates,
+ * similarly to a Passive Anchor.
+ *
+ * @param tickets The tickets that you will want to select from.
+ * The list is immutable and cannot be manipulated directly. Copy it first.
+ * @param world The world
+ * @param maxTicketCount The maximum number of tickets that will be allowed.
+ * @return list of tickets
+ */
+
+ @Override
+ public List<Ticket> ticketsLoaded(List<Ticket> tickets, World world, int maxTicketCount) {
+ List<Ticket> validTickets = new ArrayList<>();
+ if (GT_Values.alwaysReloadChunkloaders) {
+ for (Ticket ticket : tickets) {
+ int x = ticket.getModData()
+ .getInteger("OwnerX");
+ int y = ticket.getModData()
+ .getInteger("OwnerY");
+ int z = ticket.getModData()
+ .getInteger("OwnerZ");
+ if (y > 0) {
+ TileEntity tile = world.getTileEntity(x, y, z);
+ if (tile instanceof IGregTechTileEntity && ((IGregTechTileEntity) tile).isAllowedToWork()) {
+ ForgeChunkManager.forceChunk(ticket, new ChunkCoordIntPair(x >> 4, z >> 4));
+ if (!registeredTickets.containsKey(tile)) {
+ registeredTickets.put(tile, ticket);
+ if (((IGregTechTileEntity) tile).getMetaTileEntity() instanceof IChunkLoader)
+ ForgeChunkManager.forceChunk(
+ ticket,
+ ((IChunkLoader) ((IGregTechTileEntity) tile).getMetaTileEntity()).getActiveChunk());
+ validTickets.add(ticket);
+ }
+ }
+ }
+ }
+ }
+ return validTickets;
+ }
+
+ /**
+ * Determines if player tickets should be kept. This is where a ticket list per-player would be created and
+ * maintained. When a player joins, an event occurs, their name/UUID/etc is compared against tickets on this list
+ * and those tickets are reactivated.
+ * Since that info would be maintained/dealt with on a per-player startup, the list returned back to Forge is empty.
+ *
+ * @param tickets The tickets that you will want to select from.
+ * The list is immutable and cannot be manipulated directly. Copy it first.
+ * @param world The world
+ * @return the list of string-ticket paris
+ */
+ @Override
+ public ListMultimap<String, Ticket> playerTicketsLoaded(ListMultimap<String, Ticket> tickets, World world) {
+ // Not currently used, so just return an empty list.
+ return ArrayListMultimap.create();
+ }
+
+ /**
+ * Requests a chunk to be loaded for this machine. May pass a {@code null} chunk to load just the machine itself if
+ * {@code alwaysReloadChunkloaders} is enabled in config.
+ *
+ * @param owner owner of the TileEntity
+ * @param chunkXZ chunk coordinates
+ * @param player player
+ * @return if the chunk was loaded successfully
+ */
+ public static boolean requestPlayerChunkLoad(TileEntity owner, ChunkCoordIntPair chunkXZ, String player) {
+ if (!GT_Values.enableChunkloaders) return false;
+ if (!GT_Values.alwaysReloadChunkloaders && chunkXZ == null) return false;
+ if (GT_Values.debugChunkloaders && chunkXZ != null) GT_Log.out
+ .println("GT_ChunkManager: Chunk request: (" + chunkXZ.chunkXPos + ", " + chunkXZ.chunkZPos + ")");
+ if (instance.registeredTickets.containsKey(owner)) {
+ ForgeChunkManager.forceChunk(instance.registeredTickets.get(owner), chunkXZ);
+ } else {
+ Ticket ticket;
+ if (player.equals("")) ticket = ForgeChunkManager
+ .requestTicket(GT_Mod.instance, owner.getWorldObj(), ForgeChunkManager.Type.NORMAL);
+ else ticket = ForgeChunkManager
+ .requestPlayerTicket(GT_Mod.instance, player, owner.getWorldObj(), ForgeChunkManager.Type.NORMAL);
+ if (ticket == null) {
+ if (GT_Values.debugChunkloaders)
+ GT_Log.out.println("GT_ChunkManager: ForgeChunkManager.requestTicket failed");
+ return false;
+ }
+ if (GT_Values.debugChunkloaders) GT_Log.out.println(
+ "GT_ChunkManager: ticket issued for machine at: (" + owner.xCoord
+ + ", "
+ + owner.yCoord
+ + ", "
+ + owner.zCoord
+ + ")");
+ NBTTagCompound tag = ticket.getModData();
+ tag.setInteger("OwnerX", owner.xCoord);
+ tag.setInteger("OwnerY", owner.yCoord);
+ tag.setInteger("OwnerZ", owner.zCoord);
+ ForgeChunkManager.forceChunk(ticket, chunkXZ);
+ if (GT_Values.alwaysReloadChunkloaders)
+ ForgeChunkManager.forceChunk(ticket, new ChunkCoordIntPair(owner.xCoord >> 4, owner.zCoord >> 4));
+ instance.registeredTickets.put(owner, ticket);
+ }
+ return true;
+ }
+
+ @SuppressWarnings("UnusedReturnValue")
+ public static boolean requestChunkLoad(TileEntity owner, ChunkCoordIntPair chunkXZ) {
+ return requestPlayerChunkLoad(owner, chunkXZ, "");
+ }
+
+ public static void releaseChunk(TileEntity owner, ChunkCoordIntPair chunkXZ) {
+ if (!GT_Values.enableChunkloaders) return;
+ Ticket ticket = instance.registeredTickets.get(owner);
+ if (ticket != null) {
+ if (GT_Values.debugChunkloaders) GT_Log.out
+ .println("GT_ChunkManager: Chunk release: (" + chunkXZ.chunkXPos + ", " + chunkXZ.chunkZPos + ")");
+ ForgeChunkManager.unforceChunk(ticket, chunkXZ);
+ }
+ }
+
+ public static void releaseTicket(TileEntity owner) {
+ if (!GT_Values.enableChunkloaders) return;
+ Ticket ticket = instance.registeredTickets.get(owner);
+ if (ticket != null) {
+ if (GT_Values.debugChunkloaders) {
+ GT_Log.out.println(
+ "GT_ChunkManager: ticket released by machine at: (" + owner.xCoord
+ + ", "
+ + owner.yCoord
+ + ", "
+ + owner.zCoord
+ + ")");
+ for (ChunkCoordIntPair chunk : ticket.getChunkList()) GT_Log.out
+ .println("GT_ChunkManager: Chunk release: (" + chunk.chunkXPos + ", " + chunk.chunkZPos + ")");
+ }
+ ForgeChunkManager.releaseTicket(ticket);
+ instance.registeredTickets.remove(owner);
+ }
+ }
+
+ public static void printTickets() {
+ GT_Log.out.println("GT_ChunkManager: Start forced chunks dump:");
+ instance.registeredTickets.forEach((machine, ticket) -> {
+ GT_Log.out.print(
+ "GT_ChunkManager: Chunks forced by the machine at (" + machine.xCoord
+ + ", "
+ + machine.yCoord
+ + ", "
+ + machine.zCoord
+ + ")");
+ if (ticket.isPlayerTicket()) GT_Log.out.print(" Owner: " + ticket.getPlayerName());
+ GT_Log.out.print(" :");
+ for (ChunkCoordIntPair c : ticket.getChunkList()) {
+ GT_Log.out.print("(");
+ GT_Log.out.print(c.chunkXPos);
+ GT_Log.out.print(", ");
+ GT_Log.out.print(c.chunkZPos);
+ GT_Log.out.print("), ");
+ }
+ });
+ GT_Log.out.println("GT_ChunkManager: End forced chunks dump:");
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_CopiedBlockTexture.java b/src/main/java/gregtech/api/objects/GT_CopiedBlockTexture.java
new file mode 100644
index 0000000000..c5307b4803
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_CopiedBlockTexture.java
@@ -0,0 +1,35 @@
+package gregtech.api.objects;
+
+import net.minecraft.block.Block;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.interfaces.ITexture;
+
+/**
+ * @deprecated Replaced by the {@link gregtech.api.render.TextureFactory} API.
+ */
+@Deprecated
+public class GT_CopiedBlockTexture extends gregtech.common.render.GT_CopiedBlockTexture implements ITexture {
+
+ // Backwards Compat
+ @Deprecated
+ public short[] mRGBa;
+
+ public GT_CopiedBlockTexture(Block aBlock, int ordinalSide, int aMeta, short[] aRGBa, boolean aAllowAlpha) {
+ super(aBlock, ordinalSide, aMeta, aRGBa, aAllowAlpha);
+ GT_CopiedBlockTexture.this.mRGBa = aRGBa;
+ }
+
+ public GT_CopiedBlockTexture(Block aBlock, int ordinalSide, int aMeta, short[] aRGBa) {
+ this(aBlock, ordinalSide, aMeta, aRGBa, true);
+ }
+
+ public GT_CopiedBlockTexture(Block aBlock, int ordinalSide, int aMeta) {
+ this(aBlock, ordinalSide, aMeta, Dyes._NULL.mRGBa);
+ }
+
+ @Override
+ public boolean isOldTexture() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_Cover_Default.java b/src/main/java/gregtech/api/objects/GT_Cover_Default.java
new file mode 100644
index 0000000000..cc5f96eef3
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_Cover_Default.java
@@ -0,0 +1,81 @@
+package gregtech.api.objects;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+
+public class GT_Cover_Default extends GT_CoverBehavior {
+
+ /**
+ * This is the Dummy, if there is a generic Cover without behavior
+ */
+ public GT_Cover_Default() {
+ super();
+ }
+
+ @Override
+ public boolean isSimpleCover() {
+ return true;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable = ((aCoverVariable + 1) & 15);
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ ((aCoverVariable & 1) != 0 ? GT_Utility.trans("128.1", "Redstone ") : "")
+ + ((aCoverVariable & 2) != 0 ? GT_Utility.trans("129.1", "Energy ") : "")
+ + ((aCoverVariable & 4) != 0 ? GT_Utility.trans("130.1", "Fluids ") : "")
+ + ((aCoverVariable & 8) != 0 ? GT_Utility.trans("131.1", "Items ") : ""));
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return (aCoverVariable & 1) != 0;
+ }
+
+ @Override
+ public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return (aCoverVariable & 1) != 0;
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return (aCoverVariable & 2) != 0;
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return (aCoverVariable & 2) != 0;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return (aCoverVariable & 4) != 0;
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return (aCoverVariable & 4) != 0;
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return (aCoverVariable & 8) != 0;
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return (aCoverVariable & 8) != 0;
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_Cover_None.java b/src/main/java/gregtech/api/objects/GT_Cover_None.java
new file mode 100644
index 0000000000..279efe63d8
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_Cover_None.java
@@ -0,0 +1,237 @@
+package gregtech.api.objects;
+
+import static gregtech.api.enums.GT_Values.E;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.ISerializableObject;
+
+public class GT_Cover_None extends GT_CoverBehavior {
+
+ /**
+ * This is the Dummy, if there is no Cover
+ */
+ public GT_Cover_None() {}
+
+ @Override
+ public float getBlastProofLevel(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 10.0F;
+ }
+
+ @Override
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean isGUIClickable(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return false;
+ }
+
+ @Override
+ public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ boolean aForced) {
+ return true;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return 0;
+ }
+
+ @Override
+ public boolean isSimpleCover() {
+ return true;
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ return false;
+ }
+
+ @Override
+ protected ISerializableObject.LegacyCoverData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone,
+ int aCoverID, ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX,
+ float aY, float aZ) {
+ return false;
+ }
+
+ @Override
+ protected ISerializableObject.LegacyCoverData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX,
+ float aY, float aZ) {
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean onCoverShiftRightClickImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer) {
+ return false;
+ }
+
+ @Override
+ protected boolean onCoverRemovalImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, boolean aForced) {
+ return true;
+ }
+
+ @Override
+ protected String getDescriptionImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return E;
+ }
+
+ @Override
+ protected float getBlastProofLevelImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return 10.0F;
+ }
+
+ @Override
+ protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, int aSlot, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, int aSlot, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ protected byte getRedstoneInputImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return aInputRedstone;
+ }
+
+ @Override
+ protected int getTickRateImpl(ForgeDirection side, int aCoverID, ISerializableObject.LegacyCoverData aCoverVariable,
+ ICoverable aTileEntity) {
+ return 0;
+ }
+
+ @Override
+ protected byte getLensColorImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return -1;
+ }
+
+ @Override
+ protected ItemStack getDropImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_Fluid.java b/src/main/java/gregtech/api/objects/GT_Fluid.java
new file mode 100644
index 0000000000..10824d6327
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_Fluid.java
@@ -0,0 +1,36 @@
+package gregtech.api.objects;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.fluid.GT_FluidFactory;
+
+/**
+ * @deprecated use {@link GT_FluidFactory#builder}
+ */
+@Deprecated
+public class GT_Fluid extends Fluid implements Runnable {
+
+ public final String mTextureName;
+ private final short[] mRGBa;
+
+ public GT_Fluid(String aName, String aTextureName, short[] aRGBa) {
+ super(aName);
+ mRGBa = aRGBa;
+ mTextureName = aTextureName;
+ GregTech_API.sGTBlockIconload.add(this);
+ }
+
+ @Override
+ public int getColor() {
+ return (Math.max(0, Math.min(255, mRGBa[0])) << 16) | (Math.max(0, Math.min(255, mRGBa[1])) << 8)
+ | Math.max(0, Math.min(255, mRGBa[2]));
+ }
+
+ @Override
+ public void run() {
+ setIcons(GregTech_API.sBlockIcons.registerIcon(GregTech.getResourcePath("fluids", "fluid." + mTextureName)));
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_HashSet.java b/src/main/java/gregtech/api/objects/GT_HashSet.java
new file mode 100644
index 0000000000..d42f194e5d
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_HashSet.java
@@ -0,0 +1,91 @@
+package gregtech.api.objects;
+
+import java.util.AbstractSet;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.util.GT_Utility;
+
+public class GT_HashSet<E extends GT_ItemStack> extends AbstractSet<E> {
+
+ private static final Object OBJECT = new Object();
+ private final transient HashMap<GT_ItemStack, Object> map;
+
+ public GT_HashSet() {
+ map = new HashMap<>();
+ GregTech_API.sItemStackMappings.add(map);
+ }
+
+ public GT_HashSet(Collection<? extends E> c) {
+ map = new HashMap<>(Math.max((int) (c.size() / .75f) + 1, 16));
+ addAll(c);
+ GregTech_API.sItemStackMappings.add(map);
+ }
+
+ public GT_HashSet(int initialCapacity, float loadFactor) {
+ map = new HashMap<>(initialCapacity, loadFactor);
+ GregTech_API.sItemStackMappings.add(map);
+ }
+
+ public GT_HashSet(int initialCapacity) {
+ map = new HashMap<>(initialCapacity);
+ GregTech_API.sItemStackMappings.add(map);
+ }
+
+ GT_HashSet(int initialCapacity, float loadFactor, boolean dummy) {
+ map = new LinkedHashMap<>(initialCapacity, loadFactor);
+ GregTech_API.sItemStackMappings.add(map);
+ }
+
+ public Map<GT_ItemStack, Object> getMap() {
+ return map;
+ }
+
+ @SuppressWarnings("unchecked") // The downcasting below will throw ClassCastException unless E is GT_ItemStack.
+ @Override
+ public Iterator<E> iterator() {
+ return (Iterator<E>) map.keySet()
+ .iterator();
+ }
+
+ @Override
+ public int size() {
+ return map.size();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return map.isEmpty();
+ }
+
+ @Override
+ public boolean contains(Object o) {
+ return map.containsKey(o);
+ }
+
+ public boolean add(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return false;
+ return map.put(new GT_ItemStack(aStack), OBJECT) == null;
+ }
+
+ @Override
+ public boolean add(E e) {
+ return map.put(e, OBJECT) == null;
+ }
+
+ @Override
+ public boolean remove(Object o) {
+ return map.remove(o) == OBJECT;
+ }
+
+ @Override
+ public void clear() {
+ map.clear();
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_ItemStack.java b/src/main/java/gregtech/api/objects/GT_ItemStack.java
new file mode 100644
index 0000000000..492655740d
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_ItemStack.java
@@ -0,0 +1,107 @@
+package gregtech.api.objects;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.item.ItemHolder;
+import it.unimi.dsi.fastutil.Hash;
+
+/**
+ * An optimization of {@link ItemStack} to have a better {@code hashcode} and {@code equals} in order to improve
+ * {@code HashMap} and {@code Set} performance
+ */
+public class GT_ItemStack extends ItemHolder {
+
+ /**
+ * A better {@link Hash.Strategy} for {@link ItemStack}. Implementation originally from {@code GT_ItemStack2}.
+ */
+ public static final Hash.Strategy<ItemStack> ITEMSTACK_HASH_STRATEGY2 = new Hash.Strategy<>() {
+
+ @Override
+ public int hashCode(ItemStack o) {
+ return o.getItem()
+ .hashCode() * 38197 + Items.feather.getDamage(o);
+ }
+
+ @Override
+ public boolean equals(ItemStack a, ItemStack b) {
+ if (a == b) return true;
+ if (a == null || b == null) return false;
+ return a.getItem() == b.getItem() && Items.feather.getDamage(a) == Items.feather.getDamage(b);
+ }
+ };
+
+ public final Item mItem;
+ public final byte mStackSize;
+ public final short mMetaData;
+
+ public GT_ItemStack(Item aItem, long aStackSize, long aMetaData) {
+ super(new ItemStack(aItem, 1, (int) aMetaData));
+ mItem = aItem;
+ mStackSize = (byte) aStackSize;
+ mMetaData = (short) aMetaData;
+ }
+
+ public GT_ItemStack(ItemStack aStack) {
+ this(aStack, false);
+ }
+
+ public GT_ItemStack(ItemStack aStack, boolean wildcard) {
+ this(
+ aStack == null ? null : aStack.getItem(),
+ aStack == null ? 0 : aStack.stackSize,
+ aStack == null ? 0 : wildcard ? GT_Values.W : Items.feather.getDamage(aStack));
+ }
+
+ public GT_ItemStack(int aHashCode) {
+ this(GT_Utility.intToStack(aHashCode));
+ }
+
+ public final ItemStack toStack() {
+ if (mItem == null) return null;
+ return new ItemStack(mItem, 1, mMetaData);
+ }
+
+ public final boolean isStackEqual(ItemStack aStack) {
+ return GT_Utility.areStacksEqual(toStack(), aStack);
+ }
+
+ public final boolean isStackEqual(GT_ItemStack aStack) {
+ return GT_Utility.areStacksEqual(toStack(), aStack.toStack());
+ }
+
+ @Override
+ public boolean equals(Object aStack) {
+ if (aStack == this) return true;
+ if (aStack instanceof GT_ItemStack) {
+ return ((GT_ItemStack) aStack).mItem == mItem && ((GT_ItemStack) aStack).mMetaData == mMetaData;
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return GT_Utility.stackToInt(toStack());
+ }
+
+ /**
+ * @see #internalCopyStack(ItemStack, boolean)
+ */
+ public static ItemStack internalCopyStack(ItemStack aStack) {
+ return internalCopyStack(aStack, false);
+ }
+
+ /**
+ * Replicates the copy behavior of {@link #toStack()} but for normal {@link ItemStack}s.
+ *
+ * @param aStack the stack to copy
+ * @param wildcard whether to use wildcard damage value
+ * @return a copy of the stack with stack size 1 and no NBT
+ */
+ public static ItemStack internalCopyStack(ItemStack aStack, boolean wildcard) {
+ return new ItemStack(aStack.getItem(), 1, wildcard ? GT_Values.W : Items.feather.getDamage(aStack));
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_ItemStack2.java b/src/main/java/gregtech/api/objects/GT_ItemStack2.java
new file mode 100644
index 0000000000..aa93876830
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_ItemStack2.java
@@ -0,0 +1,41 @@
+package gregtech.api.objects;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+/**
+ * GT_ItemStack, but with a better hashCode(). Due to this change, it should not be placed in the same hash based data
+ * structure with GT_ItemStack. It also shouldn't be used to construct search query into a hash based data structure
+ * that contains GT_ItemStack.
+ *
+ * @deprecated See {@link GT_ItemStack#ITEMSTACK_HASH_STRATEGY2}
+ */
+@Deprecated
+public class GT_ItemStack2 extends GT_ItemStack {
+
+ public GT_ItemStack2(Item aItem, long aStackSize, long aMetaData) {
+ super(aItem, aStackSize, aMetaData);
+ }
+
+ public GT_ItemStack2(ItemStack aStack) {
+ super(aStack);
+ }
+
+ public GT_ItemStack2(ItemStack aStack, boolean wildcard) {
+ super(aStack, wildcard);
+ }
+
+ @Override
+ public boolean equals(Object aStack) {
+ if (aStack == this) return true;
+ if (aStack instanceof GT_ItemStack) {
+ return ((GT_ItemStack) aStack).mItem == mItem && ((GT_ItemStack) aStack).mMetaData == mMetaData;
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return mItem.hashCode() * 38197 + mMetaData;
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_MultiTexture.java b/src/main/java/gregtech/api/objects/GT_MultiTexture.java
new file mode 100644
index 0000000000..9748ecb934
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_MultiTexture.java
@@ -0,0 +1,26 @@
+package gregtech.api.objects;
+
+import gregtech.api.interfaces.ITexture;
+
+/**
+ * <p>
+ * Lets Multiple ITextures Render overlay over each other.<
+ * </p>
+ * <p>
+ * I should have done this much earlier...
+ * </p>
+ *
+ * @deprecated Replaced by the {@link gregtech.api.render.TextureFactory} API.
+ */
+@Deprecated
+public class GT_MultiTexture extends gregtech.common.render.GT_MultiTexture implements ITexture {
+
+ public GT_MultiTexture(ITexture... aTextures) {
+ super(aTextures);
+ }
+
+ @Override
+ public boolean isOldTexture() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_RenderedTexture.java b/src/main/java/gregtech/api/objects/GT_RenderedTexture.java
new file mode 100644
index 0000000000..bbb22e7d36
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_RenderedTexture.java
@@ -0,0 +1,33 @@
+package gregtech.api.objects;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.interfaces.IColorModulationContainer;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+
+@Deprecated
+public class GT_RenderedTexture extends gregtech.common.render.GT_RenderedTexture
+ implements ITexture, IColorModulationContainer {
+
+ @Deprecated
+ public short[] mRGBa;
+
+ public GT_RenderedTexture(IIconContainer aIcon, short[] aRGBa, boolean aAllowAlpha) {
+ super(aIcon, aRGBa, aAllowAlpha, false, true, false);
+ if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_RenderedTexture");
+ mRGBa = aRGBa;
+ }
+
+ public GT_RenderedTexture(IIconContainer aIcon, short[] aRGBa) {
+ this(aIcon, aRGBa, true);
+ }
+
+ public GT_RenderedTexture(IIconContainer aIcon) {
+ this(aIcon, Dyes._NULL.mRGBa);
+ }
+
+ @Override
+ public boolean isOldTexture() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_SidedTexture.java b/src/main/java/gregtech/api/objects/GT_SidedTexture.java
new file mode 100644
index 0000000000..d042ebede9
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_SidedTexture.java
@@ -0,0 +1,48 @@
+package gregtech.api.objects;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.interfaces.IColorModulationContainer;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+
+/**
+ * @deprecated Replaced by the {@link gregtech.api.render.TextureFactory} API.
+ */
+@Deprecated
+public class GT_SidedTexture extends gregtech.common.render.GT_SidedTexture
+ implements ITexture, IColorModulationContainer {
+
+ @Deprecated
+ public short[] mRGBa;
+
+ public GT_SidedTexture(IIconContainer aIcon0, IIconContainer aIcon1, IIconContainer aIcon2, IIconContainer aIcon3,
+ IIconContainer aIcon4, IIconContainer aIcon5, short[] aRGBa, boolean aAllowAlpha) {
+ super(aIcon0, aIcon1, aIcon2, aIcon3, aIcon4, aIcon5, aRGBa, aAllowAlpha);
+
+ // Backwards Compat
+ GT_SidedTexture.this.mRGBa = aRGBa;
+ }
+
+ public GT_SidedTexture(IIconContainer aIcon0, IIconContainer aIcon1, IIconContainer aIcon2, IIconContainer aIcon3,
+ IIconContainer aIcon4, IIconContainer aIcon5, short[] aRGBa) {
+ this(aIcon0, aIcon1, aIcon2, aIcon3, aIcon4, aIcon5, aRGBa, true);
+ }
+
+ public GT_SidedTexture(IIconContainer aIcon0, IIconContainer aIcon1, IIconContainer aIcon2, IIconContainer aIcon3,
+ IIconContainer aIcon4, IIconContainer aIcon5) {
+ this(aIcon0, aIcon1, aIcon2, aIcon3, aIcon4, aIcon5, Dyes._NULL.mRGBa);
+ }
+
+ public GT_SidedTexture(IIconContainer aBottom, IIconContainer aTop, IIconContainer aSides, short[] aRGBa) {
+ this(aBottom, aTop, aSides, aSides, aSides, aSides, aRGBa);
+ }
+
+ public GT_SidedTexture(IIconContainer aBottom, IIconContainer aTop, IIconContainer aSides) {
+ this(aBottom, aTop, aSides, Dyes._NULL.mRGBa);
+ }
+
+ @Override
+ public boolean isOldTexture() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_StdRenderedTexture.java b/src/main/java/gregtech/api/objects/GT_StdRenderedTexture.java
new file mode 100644
index 0000000000..d4b8d16da6
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_StdRenderedTexture.java
@@ -0,0 +1,46 @@
+package gregtech.api.objects;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.util.LightingHelper;
+
+/**
+ * This ITexture implementation extends the GT_RenderedTexture class to render with bottom side flipped as with dumb
+ * blocks rendering. It is used in Ore blocks rendering so they better blends with dumb block ores from vanilla or other
+ * mods, when seen from bottom.
+ *
+ * @deprecated Replaced by the {@link gregtech.api.render.TextureFactory} API.
+ */
+@Deprecated
+public class GT_StdRenderedTexture extends GT_RenderedTexture {
+
+ @SuppressWarnings("unused")
+ public GT_StdRenderedTexture(IIconContainer aIcon, short[] aRGBa, boolean aAllowAlpha) {
+ super(aIcon, aRGBa, aAllowAlpha);
+ }
+
+ public GT_StdRenderedTexture(IIconContainer aIcon, short[] aRGBa) {
+ super(aIcon, aRGBa, true);
+ }
+
+ @SuppressWarnings("unused")
+ public GT_StdRenderedTexture(IIconContainer aIcon) {
+ super(aIcon, Dyes._NULL.mRGBa);
+ }
+
+ @Override
+ public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ LightingHelper lighting = new LightingHelper(aRenderer);
+ lighting.setupLightingYNeg(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.DOWN, mRGBa);
+ aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, mIconContainer.getIcon());
+ if (mIconContainer.getOverlayIcon() != null) {
+ lighting.setupColor(ForgeDirection.DOWN, 0xffffff);
+ aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, mIconContainer.getOverlayIcon());
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_UO_Dimension.java b/src/main/java/gregtech/api/objects/GT_UO_Dimension.java
new file mode 100644
index 0000000000..af82c35dab
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_UO_Dimension.java
@@ -0,0 +1,54 @@
+package gregtech.api.objects;
+
+import java.util.Random;
+
+import net.minecraftforge.common.config.ConfigCategory;
+
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+
+public class GT_UO_Dimension {
+
+ private final BiMap<String, GT_UO_Fluid> fFluids;
+ private int maxChance;
+ public String Dimension = "null";
+
+ public GT_UO_Dimension(ConfigCategory aConfigCategory) { // TODO CONFIGURE
+ fFluids = HashBiMap.create();
+ if (aConfigCategory.containsKey("Dimension")) {
+ aConfigCategory.get("Dimension").comment = "Dimension ID or Class Name";
+ Dimension = aConfigCategory.get("Dimension")
+ .getString();
+ }
+ maxChance = 0;
+ // GT_FML_LOGGER.info("GT UO "+aConfigCategory.getName()+" Dimension:"+Dimension);
+ for (int i = 0; i < aConfigCategory.getChildren()
+ .size(); i++) {
+ GT_UO_Fluid fluid = new GT_UO_Fluid(
+ (ConfigCategory) aConfigCategory.getChildren()
+ .toArray()[i]);
+ fFluids.put(fluid.Registry, fluid);
+ maxChance += fluid.Chance;
+ }
+ }
+
+ public GT_UO_Fluid getRandomFluid(Random aRandom) {
+ int random = aRandom.nextInt(1000);
+ for (BiMap.Entry<String, GT_UO_Fluid> fl : fFluids.entrySet()) {
+ int chance = fl.getValue().Chance * 1000 / maxChance;
+ if (random <= chance) return fl.getValue();
+ // GT_FML_LOGGER.info("GT UO "+fl.getValue().Registry+" Chance:"+chance+" Random:"+random);
+ random -= chance;
+ }
+ return null;
+ }
+
+ public String getUOFluidKey(GT_UO_Fluid uoFluid) {
+ return fFluids.inverse()
+ .get(uoFluid);
+ }
+
+ public GT_UO_Fluid getUOFluid(String key) {
+ return fFluids.get(key);
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_UO_DimensionList.java b/src/main/java/gregtech/api/objects/GT_UO_DimensionList.java
new file mode 100644
index 0000000000..95d4246cb6
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_UO_DimensionList.java
@@ -0,0 +1,98 @@
+package gregtech.api.objects;
+
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.common.config.ConfigCategory;
+import net.minecraftforge.common.config.Configuration;
+
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+
+public class GT_UO_DimensionList {
+
+ private Configuration fConfig;
+ private String fCategory;
+ private final BiMap<String, GT_UO_Dimension> fDimensionList;
+
+ public int[] blackList = new int[0];
+
+ public GT_UO_DimensionList() {
+ fDimensionList = HashBiMap.create();
+ }
+
+ public GT_UO_Dimension GetDimension(int aDimension) {
+ if (CheckBlackList(aDimension)) return null;
+ if (fDimensionList.containsKey(Integer.toString(aDimension)))
+ return fDimensionList.get(Integer.toString(aDimension));
+ for (BiMap.Entry<String, GT_UO_Dimension> dl : fDimensionList.entrySet())
+ if (DimensionManager.getProvider(aDimension)
+ .getClass()
+ .getName()
+ .contains(dl.getValue().Dimension)) return dl.getValue();
+ return fDimensionList.get("Default");
+ }
+
+ private boolean CheckBlackList(int aDimensionId) {
+ try {
+ return java.util.Arrays.binarySearch(blackList, aDimensionId) >= 0;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ public void SetConfigValues(String aDimensionName, String aDimension, String aName, String aRegistry,
+ int aMinAmount, int aMaxAmount, int aChance, int aDecreasePerOperationAmount) {
+ String Category = fCategory + "." + aDimensionName;
+ fConfig.get(Category, "Dimension", aDimension)
+ .getString();
+ Category += "." + aName;
+ fConfig.get(Category, "Registry", aRegistry)
+ .getString();
+ fConfig.get(Category, "MinAmount", aMinAmount)
+ .getInt(aMinAmount);
+ fConfig.get(Category, "MaxAmount", aMaxAmount)
+ .getInt(aMaxAmount);
+ fConfig.get(Category, "Chance", aChance)
+ .getInt(aChance);
+ fConfig.get(Category, "DecreasePerOperationAmount", aDecreasePerOperationAmount)
+ .getInt(aDecreasePerOperationAmount);
+ // IT IS IN BUCKETS!!!
+ }
+
+ public void SetDafultValues() {
+ SetConfigValues("Overworld", "0", "gas_natural_gas", "gas_natural_gas", 0, 700, 20, 7);
+ SetConfigValues("Overworld", "0", "liquid_light_oil", "liquid_light_oil", 0, 650, 20, 6);
+ SetConfigValues("Overworld", "0", "liquid_medium_oil", "liquid_medium_oil", 0, 600, 20, 5);
+ SetConfigValues("Overworld", "0", "liquid_heavy_oil", "liquid_heavy_oil", 0, 550, 20, 4);
+ SetConfigValues("Overworld", "0", "oil", "oil", 0, 600, 20, 5);
+ SetConfigValues("Moon", "Moon", "helium-3", "helium-3", 24, 128, 100, 1);
+ }
+
+ public void getConfig(Configuration aConfig, String aCategory) {
+ fCategory = aCategory;
+ fConfig = aConfig;
+ if (!fConfig.hasCategory(fCategory)) SetDafultValues();
+
+ fConfig.setCategoryComment(fCategory, "Config Underground Fluids (Delete this Category for regenerate)");
+ fConfig.setCategoryComment(
+ fCategory + ".Default",
+ "Set Default Generating (Use this Category for Default settings)");
+ fConfig.setCategoryComment(fCategory + ".Overworld", "Set Overworld Generating");
+ fConfig.setCategoryComment(fCategory + ".Moon", "Set Moon Generating");
+
+ blackList = new int[] { -1, 1 };
+ blackList = aConfig.get(fCategory, "DimBlackList", blackList, "Dimension IDs Black List")
+ .getIntList();
+ java.util.Arrays.sort(blackList);
+
+ for (int i = 0; i < fConfig.getCategory(fCategory)
+ .getChildren()
+ .size(); i++) {
+ GT_UO_Dimension Dimension = new GT_UO_Dimension(
+ (ConfigCategory) fConfig.getCategory(fCategory)
+ .getChildren()
+ .toArray()[i]);
+ fDimensionList.put(Dimension.Dimension, Dimension);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/GT_UO_Fluid.java b/src/main/java/gregtech/api/objects/GT_UO_Fluid.java
new file mode 100644
index 0000000000..7f9898e02e
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/GT_UO_Fluid.java
@@ -0,0 +1,69 @@
+package gregtech.api.objects;
+
+import static gregtech.common.GT_UndergroundOil.DIVIDER;
+
+import java.util.Random;
+
+import net.minecraftforge.common.config.ConfigCategory;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+public class GT_UO_Fluid {
+
+ public String Registry = "null";
+ public int MaxAmount = 0;
+ public int MinAmount = 0;
+ public int Chance = 0;
+ public int DecreasePerOperationAmount = 5;
+
+ public GT_UO_Fluid(ConfigCategory aConfigCategory) { // TODO CONFIGURE
+ if (aConfigCategory.containsKey("Registry")) {
+ aConfigCategory.get("Registry").comment = "Fluid registry name";
+ Registry = aConfigCategory.get("Registry")
+ .getString();
+ }
+ if (aConfigCategory.containsKey("MaxAmount")) {
+ aConfigCategory
+ .get("MaxAmount").comment = "Max amount generation (per operation, sets the VeinData) 80000 MAX";
+ MaxAmount = aConfigCategory.get("MaxAmount")
+ .getInt(0);
+ }
+ if (aConfigCategory.containsKey("MinAmount")) {
+ aConfigCategory.get("MinAmount").comment = "Min amount generation (per operation, sets the VeinData) 0 MIN";
+ MinAmount = aConfigCategory.get("MinAmount")
+ .getInt(0);
+ }
+ if (aConfigCategory.containsKey("Chance")) {
+ aConfigCategory
+ .get("Chance").comment = "Chance generating (weighted chance!, there will be a fluid in chunk always!)";
+ Chance = aConfigCategory.get("Chance")
+ .getInt(0);
+ }
+ if (aConfigCategory.containsKey("DecreasePerOperationAmount")) {
+ aConfigCategory.get(
+ "DecreasePerOperationAmount").comment = "Decrease per operation (actual fluid gained works like (Litre)VeinData/5000)";
+ DecreasePerOperationAmount = aConfigCategory.get("DecreasePerOperationAmount")
+ .getInt(5);
+ }
+ // GT_FML_LOGGER.info("GT UO "+aConfigCategory.getName()+" Fluid:"+Registry+" Max:"+MaxAmount+"
+ // Min:"+MinAmount+" Chance:"+Chance);
+ }
+
+ public Fluid getFluid() {
+ try {
+ return FluidRegistry.getFluid(this.Registry);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public int getRandomAmount(Random aRandom) { // generates some random ass number that correlates to extraction
+ // speeds
+ int smax = (int) Math.floor(Math.pow(MaxAmount * 100.d * DIVIDER, 0.2d)); // use scaled max and min values for
+ // the randomness to make high values
+ // more rare.
+ double smin = Math.pow(MinAmount * 100.d * DIVIDER, 0.2d);
+ double samount = Math.max(smin, aRandom.nextInt(smax) + aRandom.nextDouble());
+ return (int) (Math.pow(samount, 5) / 100); // reverses the computation above
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/ItemData.java b/src/main/java/gregtech/api/objects/ItemData.java
new file mode 100644
index 0000000000..779e45ac8b
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/ItemData.java
@@ -0,0 +1,122 @@
+package gregtech.api.objects;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+
+public class ItemData {
+
+ private static final MaterialStack[] EMPTY_MATERIALSTACK_ARRAY = new MaterialStack[0];
+
+ public final List<Object> mExtraData = new GT_ArrayList<>(false, 1);
+ public final OrePrefixes mPrefix;
+ public final MaterialStack mMaterial;
+ public final MaterialStack[] mByProducts;
+ public boolean mBlackListed = false;
+ public ItemStack mUnificationTarget = null;
+
+ public ItemData(OrePrefixes aPrefix, Materials aMaterial, boolean aBlackListed) {
+ mPrefix = aPrefix;
+ mMaterial = aMaterial == null ? null : new MaterialStack(aMaterial, aPrefix.mMaterialAmount);
+ mBlackListed = aBlackListed;
+ mByProducts = aPrefix.mSecondaryMaterial == null || aPrefix.mSecondaryMaterial.mMaterial == null
+ ? EMPTY_MATERIALSTACK_ARRAY
+ : new MaterialStack[] { aPrefix.mSecondaryMaterial.clone() };
+ }
+
+ public ItemData(OrePrefixes aPrefix, Materials aMaterial) {
+ this(aPrefix, aMaterial, false);
+ }
+
+ public ItemData(MaterialStack aMaterial, MaterialStack... aByProducts) {
+ mPrefix = null;
+ mMaterial = aMaterial.mMaterial == null ? null : aMaterial.clone();
+ mBlackListed = true;
+ if (aByProducts == null) {
+ mByProducts = EMPTY_MATERIALSTACK_ARRAY;
+ } else {
+ MaterialStack[] tByProducts = aByProducts.length < 1 ? EMPTY_MATERIALSTACK_ARRAY
+ : new MaterialStack[aByProducts.length];
+ int j = 0;
+ for (MaterialStack aByProduct : aByProducts)
+ if (aByProduct != null && aByProduct.mMaterial != null) tByProducts[j++] = aByProduct.clone();
+ mByProducts = j > 0 ? new MaterialStack[j] : EMPTY_MATERIALSTACK_ARRAY;
+ System.arraycopy(tByProducts, 0, mByProducts, 0, mByProducts.length);
+ }
+ }
+
+ public ItemData(Materials aMaterial, long aAmount, MaterialStack... aByProducts) {
+ this(new MaterialStack(aMaterial, aAmount), aByProducts);
+ }
+
+ public ItemData(Materials aMaterial, long aAmount, Materials aByProduct, long aByProductAmount) {
+ this(new MaterialStack(aMaterial, aAmount), new MaterialStack(aByProduct, aByProductAmount));
+ }
+
+ public ItemData(ItemData... aData) {
+ mPrefix = null;
+ mBlackListed = true;
+
+ ArrayList<MaterialStack> aList = new ArrayList<>(), rList = new ArrayList<>();
+
+ for (ItemData tData : aData) if (tData != null) {
+ if (tData.hasValidMaterialData() && tData.mMaterial.mAmount > 0) aList.add(tData.mMaterial.clone());
+ for (MaterialStack tMaterial : tData.mByProducts) if (tMaterial.mAmount > 0) aList.add(tMaterial.clone());
+ }
+
+ for (MaterialStack aMaterial : aList) {
+ boolean temp = true;
+ for (MaterialStack tMaterial : rList) if (aMaterial.mMaterial == tMaterial.mMaterial) {
+ tMaterial.mAmount += aMaterial.mAmount;
+ temp = false;
+ break;
+ }
+ if (temp) rList.add(aMaterial.clone());
+ }
+
+ rList.sort((a, b) -> Long.compare(b.mAmount, a.mAmount));
+
+ if (rList.isEmpty()) {
+ mMaterial = null;
+ } else {
+ mMaterial = rList.get(0);
+ rList.remove(0);
+ }
+
+ mByProducts = rList.toArray(new MaterialStack[0]);
+ }
+
+ public final boolean hasValidPrefixMaterialData() {
+ return mPrefix != null && mMaterial != null && mMaterial.mMaterial != null;
+ }
+
+ public final boolean hasValidPrefixData() {
+ return mPrefix != null;
+ }
+
+ public final boolean hasValidMaterialData() {
+ return mMaterial != null && mMaterial.mMaterial != null;
+ }
+
+ public final ArrayList<MaterialStack> getAllMaterialStacks() {
+ ArrayList<MaterialStack> rList = new ArrayList<>();
+ if (hasValidMaterialData()) rList.add(mMaterial);
+ rList.addAll(Arrays.asList(mByProducts));
+ return rList;
+ }
+
+ public final MaterialStack getByProduct(int aIndex) {
+ return aIndex >= 0 && aIndex < mByProducts.length ? mByProducts[aIndex] : null;
+ }
+
+ @Override
+ public String toString() {
+ if (mPrefix == null || mMaterial == null || mMaterial.mMaterial == null) return "";
+ return String.valueOf(mPrefix.name() + mMaterial.mMaterial.mName);
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/MaterialStack.java b/src/main/java/gregtech/api/objects/MaterialStack.java
new file mode 100644
index 0000000000..0a433e0d99
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/MaterialStack.java
@@ -0,0 +1,70 @@
+package gregtech.api.objects;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Utility;
+
+public class MaterialStack implements Cloneable {
+
+ public long mAmount;
+ public Materials mMaterial;
+
+ public MaterialStack(Materials aMaterial, long aAmount) {
+ mMaterial = aMaterial == null ? Materials._NULL : aMaterial;
+ mAmount = aAmount;
+ }
+
+ public MaterialStack copy(long aAmount) {
+ return new MaterialStack(mMaterial, aAmount);
+ }
+
+ @Override
+ public MaterialStack clone() {
+ try {
+ return (MaterialStack) super.clone();
+ } catch (Exception e) {
+ return new MaterialStack(mMaterial, mAmount);
+ }
+ }
+
+ @Override
+ public boolean equals(Object aObject) {
+ if (aObject == this) return true;
+ if (aObject == null) return false;
+ if (aObject instanceof Materials) return aObject == mMaterial;
+ if (aObject instanceof MaterialStack) return ((MaterialStack) aObject).mMaterial == mMaterial
+ && (mAmount < 0 || ((MaterialStack) aObject).mAmount < 0 || ((MaterialStack) aObject).mAmount == mAmount);
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toString(false);
+ }
+
+ public String toString(boolean single) {
+ String temp1 = "", temp2 = mMaterial.getToolTip(true), temp3 = "", temp4 = "";
+ if (mAmount > 1) {
+ temp4 = GT_Utility.toSubscript(mAmount);
+ }
+ if ((!single || mAmount > 1) && isMaterialListComplex(this)) {
+ temp1 = "(";
+ temp3 = ")";
+ }
+ return temp1 + temp2 + temp3 + temp4;
+ }
+
+ private boolean isMaterialListComplex(MaterialStack materialStack) {
+ if (materialStack.mMaterial.mMaterialList.size() > 1) {
+ return true;
+ }
+ if (materialStack.mMaterial.mMaterialList.size() == 0) {
+ return false;
+ }
+ return isMaterialListComplex(materialStack.mMaterial.mMaterialList.get(0));
+ }
+
+ @Override
+ public int hashCode() {
+ return mMaterial.hashCode();
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/ObjMap.java b/src/main/java/gregtech/api/objects/ObjMap.java
new file mode 100644
index 0000000000..badc673464
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/ObjMap.java
@@ -0,0 +1,239 @@
+package gregtech.api.objects;
+
+import java.util.Arrays;
+
+/**
+ * Object-2-object map based on IntIntMap4a
+ */
+public class ObjMap<K, V> {
+
+ private static final Object FREE_KEY = new Object();
+ private static final Object REMOVED_KEY = new Object();
+
+ /** Keys and values */
+ private Object[] m_data;
+
+ /** Value for the null key (if inserted into a map) */
+ private Object m_nullValue;
+
+ private boolean m_hasNull;
+
+ /** Fill factor, must be between (0 and 1) */
+ private final float m_fillFactor;
+ /** We will resize a map once it reaches this size */
+ private int m_threshold;
+ /** Current map size */
+ private int m_size;
+ /** Mask to calculate the original position */
+ private int m_mask;
+ /** Mask to wrap the actual array pointer */
+ private int m_mask2;
+
+ public ObjMap(final int size, final float fillFactor) {
+ if (fillFactor <= 0 || fillFactor >= 1) throw new IllegalArgumentException("FillFactor must be in (0, 1)");
+ if (size <= 0) throw new IllegalArgumentException("Size must be positive!");
+ final int capacity = arraySize(size, fillFactor);
+ m_mask = capacity - 1;
+ m_mask2 = capacity * 2 - 1;
+ m_fillFactor = fillFactor;
+
+ m_data = new Object[capacity * 2];
+ Arrays.fill(m_data, FREE_KEY);
+
+ m_threshold = (int) (capacity * fillFactor);
+ }
+
+ @SuppressWarnings("unchecked")
+ public V get(final K key) {
+ if (key == null) return (V) m_nullValue; // we null it on remove, so safe not to check a flag here
+
+ int ptr = (key.hashCode() & m_mask) << 1;
+ Object k = m_data[ptr];
+
+ if (k == FREE_KEY) return null; // end of chain already
+ if (k.equals(key)) // we check FREE and REMOVED prior to this call
+ return (V) m_data[ptr + 1];
+ while (true) {
+ ptr = (ptr + 2) & m_mask2; // that's next index
+ k = m_data[ptr];
+ if (k == FREE_KEY) return null;
+ if (k.equals(key)) return (V) m_data[ptr + 1];
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public V put(final K key, final V value) {
+ if (key == null) return insertNullKey(value);
+
+ int ptr = getStartIndex(key) << 1;
+ Object k = m_data[ptr];
+
+ if (k == FREE_KEY) // end of chain already
+ {
+ m_data[ptr] = key;
+ m_data[ptr + 1] = value;
+ if (m_size >= m_threshold) rehash(m_data.length * 2); // size is set inside
+ else++m_size;
+ return null;
+ } else if (k.equals(key)) // we check FREE and REMOVED prior to this call
+ {
+ final Object ret = m_data[ptr + 1];
+ m_data[ptr + 1] = value;
+ return (V) ret;
+ }
+
+ int firstRemoved = -1;
+ if (k == REMOVED_KEY) firstRemoved = ptr; // we may find a key later
+
+ while (true) {
+ ptr = (ptr + 2) & m_mask2; // that's next index calculation
+ k = m_data[ptr];
+ if (k == FREE_KEY) {
+ if (firstRemoved != -1) ptr = firstRemoved;
+ m_data[ptr] = key;
+ m_data[ptr + 1] = value;
+ if (m_size >= m_threshold) rehash(m_data.length * 2); // size is set inside
+ else++m_size;
+ return null;
+ } else if (k.equals(key)) {
+ final Object ret = m_data[ptr + 1];
+ m_data[ptr + 1] = value;
+ return (V) ret;
+ } else if (k == REMOVED_KEY) {
+ if (firstRemoved == -1) firstRemoved = ptr;
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public V remove(final K key) {
+ if (key == null) return removeNullKey();
+
+ int ptr = getStartIndex(key) << 1;
+ Object k = m_data[ptr];
+ if (k == FREE_KEY) return null; // end of chain already
+ else if (k.equals(key)) // we check FREE and REMOVED prior to this call
+ {
+ --m_size;
+ if (m_data[(ptr + 2) & m_mask2] == FREE_KEY) m_data[ptr] = FREE_KEY;
+ else m_data[ptr] = REMOVED_KEY;
+ final V ret = (V) m_data[ptr + 1];
+ m_data[ptr + 1] = null;
+ return ret;
+ }
+ while (true) {
+ ptr = (ptr + 2) & m_mask2; // that's next index calculation
+ k = m_data[ptr];
+ if (k == FREE_KEY) return null;
+ else if (k.equals(key)) {
+ --m_size;
+ if (m_data[(ptr + 2) & m_mask2] == FREE_KEY) m_data[ptr] = FREE_KEY;
+ else m_data[ptr] = REMOVED_KEY;
+ final V ret = (V) m_data[ptr + 1];
+ m_data[ptr + 1] = null;
+ return ret;
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private V insertNullKey(final V value) {
+ if (m_hasNull) {
+ final Object ret = m_nullValue;
+ m_nullValue = value;
+ return (V) ret;
+ } else {
+ m_nullValue = value;
+ ++m_size;
+ return null;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private V removeNullKey() {
+ if (m_hasNull) {
+ final Object ret = m_nullValue;
+ m_nullValue = null;
+ m_hasNull = false;
+ --m_size;
+ return (V) ret;
+ } else {
+ return null;
+ }
+ }
+
+ public int size() {
+ return m_size;
+ }
+
+ @SuppressWarnings("unchecked")
+ private void rehash(final int newCapacity) {
+ m_threshold = (int) (newCapacity / 2 * m_fillFactor);
+ m_mask = newCapacity / 2 - 1;
+ m_mask2 = newCapacity - 1;
+
+ final int oldCapacity = m_data.length;
+ final Object[] oldData = m_data;
+
+ m_data = new Object[newCapacity];
+ Arrays.fill(m_data, FREE_KEY);
+
+ m_size = m_hasNull ? 1 : 0;
+
+ for (int i = 0; i < oldCapacity; i += 2) {
+ final Object oldKey = oldData[i];
+ if (oldKey != FREE_KEY && oldKey != REMOVED_KEY) put((K) oldKey, (V) oldData[i + 1]);
+ }
+ }
+
+ public int getStartIndex(final Object key) {
+ // key is not null here
+ return key.hashCode() & m_mask;
+ }
+
+ /* Taken from FastUtil implementation */
+
+ /**
+ * Return the least power of two greater than or equal to the specified value.
+ *
+ * <p>
+ * Note that this function will return 1 when the argument is 0.
+ *
+ * @param x a long integer smaller than or equal to 2<sup>62</sup>.
+ * @return the least power of two greater than or equal to the specified value.
+ */
+ public static long nextPowerOfTwo(long x) {
+ if (x == 0) return 1;
+ x--;
+ x |= x >> 1;
+ x |= x >> 2;
+ x |= x >> 4;
+ x |= x >> 8;
+ x |= x >> 16;
+ return (x | x >> 32) + 1;
+ }
+
+ /**
+ * Returns the least power of two smaller than or equal to 2<sup>30</sup> and larger than or equal to
+ * <code>Math.ceil( expected / f )</code>.
+ *
+ * @param expected the expected number of elements in a hash table.
+ * @param f the load factor.
+ * @return the minimum possible size for a backing array.
+ * @throws IllegalArgumentException if the necessary size is larger than 2<sup>30</sup>.
+ */
+ public static int arraySize(final int expected, final float f) {
+ final long s = Math.max(2, nextPowerOfTwo((long) Math.ceil(expected / f)));
+ if (s > (1 << 30)) throw new IllegalArgumentException(
+ "Too large (" + expected + " expected elements with load factor " + f + ")");
+ return (int) s;
+ }
+
+ // taken from FastUtil
+ private static final int INT_PHI = 0x9E3779B9;
+
+ public static int phiMix(final int x) {
+ final int h = x * INT_PHI;
+ return h ^ (h >> 16);
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/XSTR.java b/src/main/java/gregtech/api/objects/XSTR.java
new file mode 100644
index 0000000000..33823d3ebd
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/XSTR.java
@@ -0,0 +1,246 @@
+package gregtech.api.objects;
+
+import java.util.Random;
+import java.util.concurrent.atomic.AtomicLong;
+
+/*
+ * TODO: Check the validity of the algorithm.
+ * There is a claim that this particular implementation is not faithful to the articles it links, skewing the
+ * distribution.
+ */
+/**
+ * XSTR - Xorshift ThermiteRandom Modified by Bogdan-G 03.06.2016 version 0.0.4
+ * <p>
+ * A subclass of java.util.random that implements the Xorshift random number generator
+ * <p>
+ * - it is 30% faster than the generator from Java's library - it produces random sequences of higher quality than
+ * java.util.Random - this class also provides a clone() function
+ * <p>
+ * Usage: XSRandom rand = new XSRandom(); //Instantiation x = rand.nextInt(); //pull a random number
+ * <p>
+ * To use the class in legacy code, you may also instantiate an XSRandom object and assign it to a java.util.Random
+ * object: java.util.Random rand = new XSRandom();
+ * <p>
+ * for an explanation of the algorithm, see http://demesos.blogspot.com/2011/09/pseudo-random-number-generators.html
+ *
+ * @author Wilfried Elmenreich University of Klagenfurt/Lakeside Labs http://www.elmenreich.tk
+ * <p>
+ * This code is released under the GNU Lesser General Public License Version 3
+ * http://www.gnu.org/licenses/lgpl-3.0.txt
+ */
+public class XSTR extends Random {
+
+ private static final long serialVersionUID = 6208727693524452904L;
+ private long seed;
+ private long last;
+ private static final long GAMMA = 0x9e3779b97f4a7c15L;
+ private static final int PROBE_INCREMENT = 0x9e3779b9;
+ private static final long SEEDER_INCREMENT = 0xbb67ae8584caa73bL;
+ private static final double DOUBLE_UNIT = 0x1.0p-53; // 1.0 / (1L << 53)
+ private static final float FLOAT_UNIT = 0x1.0p-24f; // 1.0f / (1 << 24)
+ private static final AtomicLong seedUniquifier = new AtomicLong(8682522807148012L);
+ public static final XSTR XSTR_INSTANCE = new XSTR() {
+
+ @Override
+ public synchronized void setSeed(long seed) {
+ if (!Thread.currentThread()
+ .getStackTrace()[2].getClassName()
+ .equals(Random.class.getName()))
+ throw new NoSuchMethodError("This is meant to be shared!, leave seed state alone!");
+ }
+ };
+
+ /*
+ * MODIFIED BY: Robotia Modification: Implemented Random class seed generator
+ */
+ /**
+ * Creates a new pseudo random number generator. The seed is initialized to the current time, as if by
+ * <code>setSeed(System.currentTimeMillis());</code>.
+ */
+ public XSTR() {
+ this(seedUniquifier() ^ System.nanoTime());
+ }
+
+ private static long seedUniquifier() {
+ // L'Ecuyer, "Tables of Linear Congruential Generators of
+ // Different Sizes and Good Lattice Structure", 1999
+ for (;;) {
+ long current = seedUniquifier.get();
+ long next = current * 181783497276652981L;
+ if (seedUniquifier.compareAndSet(current, next)) {
+ return next;
+ }
+ }
+ }
+
+ /**
+ * Creates a new pseudo random number generator, starting with the specified seed, using
+ * <code>setSeed(seed);</code>.
+ *
+ * @param seed the initial seed
+ */
+ public XSTR(long seed) {
+ this.seed = seed;
+ }
+
+ @Override
+ public boolean nextBoolean() {
+ return next(1) != 0;
+ }
+
+ @Override
+ public double nextDouble() {
+ return (((long) (next(26)) << 27) + next(27)) * DOUBLE_UNIT;
+ }
+
+ /**
+ * Returns the current state of the seed, can be used to clone the object
+ *
+ * @return the current seed
+ */
+ public synchronized long getSeed() {
+ return seed;
+ }
+
+ /**
+ * Sets the seed for this pseudo random number generator. As described above, two instances of the same random
+ * class, starting with the same seed, produce the same results, if the same methods are called.
+ *
+ * @param seed the new seed
+ */
+ @Override
+ public synchronized void setSeed(long seed) {
+ this.seed = seed;
+ }
+
+ /**
+ * @return Returns an XSRandom object with the same state as the original
+ */
+ @Override
+ public XSTR clone() {
+ return new XSTR(getSeed());
+ }
+
+ /**
+ * Implementation of George Marsaglia's Xorshift random generator that is 30% faster and better quality than the
+ * built-in java.util.random.
+ *
+ * @param nbits number of bits to shift the result for
+ * @return a random integer
+ * @see <a href="https://www.javamex.com/tutorials/random_numbers/xorshift.shtml">the Xorshift article</a>
+ */
+ @Override
+ public int next(int nbits) {
+ long x = seed;
+ x ^= (x << 21);
+ x ^= (x >>> 35);
+ x ^= (x << 4);
+ seed = x;
+ x &= ((1L << nbits) - 1);
+ return (int) x;
+ }
+
+ boolean haveNextNextGaussian = false;
+ double nextNextGaussian = 0;
+
+ @Override
+ public synchronized double nextGaussian() {
+ // See Knuth, ACP, Section 3.4.1 Algorithm C.
+ if (haveNextNextGaussian) {
+ haveNextNextGaussian = false;
+ return nextNextGaussian;
+ } else {
+ double v1, v2, s;
+ do {
+ v1 = 2 * nextDouble() - 1; // between -1 and 1
+ v2 = 2 * nextDouble() - 1; // between -1 and 1
+ s = v1 * v1 + v2 * v2;
+ } while (s >= 1 || s == 0);
+ double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s) / s);
+ nextNextGaussian = v2 * multiplier;
+ haveNextNextGaussian = true;
+ return v1 * multiplier;
+ }
+ }
+
+ /**
+ * Returns a pseudorandom, uniformly distributed {@code int} value between 0 (inclusive) and the specified value
+ * (exclusive), drawn from this random number generator's sequence. The general contract of {@code nextInt} is that
+ * one {@code int} value in the specified range is pseudorandomly generated and returned. All {@code bound} possible
+ * {@code int} values are produced with (approximately) equal probability. The method {@code nextInt(int bound)} is
+ * implemented by class {@code Random} as if by:
+ *
+ * <pre>
+ * {@code
+ * public int nextInt(int bound) {
+ * if (bound <= 0)
+ * throw new IllegalArgumentException("bound must be positive");
+ *
+ * if ((bound & -bound) == bound) // i.e., bound is a power of 2
+ * return (int)((bound * (long)next(31)) >> 31);
+ *
+ * int bits, val;
+ * do {
+ * bits = next(31);
+ * val = bits % bound;
+ * } while (bits - val + (bound-1) < 0);
+ * return val;
+ * }}
+ * </pre>
+ *
+ * <p>
+ * The next method is only approximately an unbiased source of independently chosen bits. If it were a perfect
+ * source of randomly chosen bits, then the algorithm shown would choose {@code int} values from the stated range
+ * with perfect uniformity.
+ * <p>
+ * The algorithm is slightly tricky. It rejects values that would result in an uneven distribution (due to the fact
+ * that 2^31 is not divisible by n). The probability of a value being rejected depends on n. The worst case is
+ * n=2^30+1, for which the probability of a reject is 1/2, and the expected number of iterations before the loop
+ * terminates is 2.
+ * <p>
+ * The algorithm treats the case where n is a power of two specially: it returns the correct number of high-order
+ * bits from the underlying pseudo-random number generator. In the absence of special treatment, the correct number
+ * of <i>low-order</i> bits would be returned. Linear congruential pseudo-random number generators such as the one
+ * implemented by this class are known to have short periods in the sequence of values of their low-order bits.
+ * Thus, this special case greatly increases the length of the sequence of values returned by successive calls to
+ * this method if n is a small power of two.
+ *
+ * @param bound the upper bound (exclusive). Must be positive.
+ * @return the next pseudorandom, uniformly distributed {@code int} value between zero (inclusive) and {@code bound}
+ * (exclusive) from this random number generator's sequence
+ * @throws IllegalArgumentException if bound is not positive
+ * @since 1.2
+ */
+ @Override
+ public int nextInt(int bound) {
+ last = seed ^ (seed << 21);
+ last ^= (last >>> 35);
+ last ^= (last << 4);
+ seed = last;
+ int out = (int) last % bound;
+ return (out < 0) ? -out : out;
+ }
+
+ @Override
+ public int nextInt() {
+ return next(32);
+ }
+
+ @Override
+ public float nextFloat() {
+ return next(24) * FLOAT_UNIT;
+ }
+
+ @Override
+ public long nextLong() {
+ // it's okay that the bottom word remains signed.
+ return ((long) (next(32)) << 32) + next(32);
+ }
+
+ @Override
+ public void nextBytes(byte[] bytes_arr) {
+ for (int iba = 0, lenba = bytes_arr.length; iba < lenba;)
+ for (int rndba = nextInt(), nba = Math.min(lenba - iba, Integer.SIZE / Byte.SIZE); nba--
+ > 0; rndba >>= Byte.SIZE) bytes_arr[iba++] = (byte) rndba;
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/blockupdate/BlockUpdateHandler.java b/src/main/java/gregtech/api/objects/blockupdate/BlockUpdateHandler.java
new file mode 100644
index 0000000000..e8f084ea34
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/blockupdate/BlockUpdateHandler.java
@@ -0,0 +1,117 @@
+package gregtech.api.objects.blockupdate;
+
+import java.util.HashMap;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityClientPlayerMP;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+
+import appeng.api.util.WorldCoord;
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent;
+import cpw.mods.fml.common.gameevent.TickEvent.Phase;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.TickTime;
+
+// this is a middleware for block updates
+// Greg's BaseMetaTileEntity uses World::markBlockForUpdate() to update the texture of a machine
+// World::markBlockForUpdate() triggers block updates of all blocks within the same chunk
+// this class makes sure chunk updates are perfmormed only once even if several blocks requested update
+// (valid obly for requests made using BlockUpdateHandler::enqueueBlockUpdate)
+// and introduces a per chunk cooldown to slow the things a bit
+// cause too frequent updates are not necessary for visual appearance of a block
+
+@SideOnly(Side.CLIENT)
+public class BlockUpdateHandler {
+
+ public static final int MIN_UPDATE_COOLDOWN = TickTime.SECOND / 2;
+ public static final int MAX_UPDATE_COOLDOWN = TickTime.SECOND;
+
+ public final static BlockUpdateHandler Instance = new BlockUpdateHandler();
+
+ private BlockUpdateHandler() {
+
+ blocksToUpdate = new HashMap<ChunkCoordIntPair, WorldCoord>();
+ cooldowns = new HashMap<ChunkCoordIntPair, RandomCooldown>();
+
+ FMLCommonHandler.instance()
+ .bus()
+ .register(this);
+ }
+
+ public void enqueueBlockUpdate(World world, WorldCoord pos) {
+
+ var player = getPlayer();
+
+ if (world != player.worldObj) return;
+
+ ResetDataIfPlayerWorldChanged(player);
+
+ blocksToUpdate.put(getBlockChunkCoords(world, pos), pos);
+ }
+
+ @SubscribeEvent
+ public void OnClientTickEvent(ClientTickEvent event) {
+
+ if (event.phase != Phase.START) return;
+
+ ResetDataIfPlayerWorldChanged(getPlayer());
+
+ var it = blocksToUpdate.entrySet()
+ .iterator();
+
+ while (it.hasNext()) {
+
+ var entry = it.next();
+ ChunkCoordIntPair chunkCoords = entry.getKey();
+ WorldCoord blockCoords = entry.getValue();
+
+ RandomCooldown cooldown = cooldowns.get(chunkCoords);
+
+ if (cooldown == null) {
+ cooldown = new RandomCooldown(MIN_UPDATE_COOLDOWN, MAX_UPDATE_COOLDOWN);
+ cooldowns.put(chunkCoords, cooldown);
+ }
+
+ if (!cooldown.hasPassed(internalTickCounter)) continue;
+
+ currWorld.markBlockForUpdate(blockCoords.x, blockCoords.y, blockCoords.z);
+ cooldown.set(internalTickCounter);
+ it.remove();
+ }
+
+ ++internalTickCounter;
+ }
+
+ private EntityClientPlayerMP getPlayer() {
+ return Minecraft.getMinecraft().thePlayer;
+ }
+
+ private void ResetDataIfPlayerWorldChanged(EntityClientPlayerMP player) {
+
+ if (player == null) return;
+
+ World playerWorld = player.worldObj;
+
+ if (currWorld != playerWorld) {
+ blocksToUpdate.clear();
+ cooldowns.clear();
+ currWorld = playerWorld;
+ }
+ }
+
+ private ChunkCoordIntPair getBlockChunkCoords(World world, WorldCoord pos) {
+
+ Chunk chunk = world.getChunkFromBlockCoords(pos.x, pos.z);
+ return chunk.getChunkCoordIntPair();
+ }
+
+ private HashMap<ChunkCoordIntPair, WorldCoord> blocksToUpdate;
+ private HashMap<ChunkCoordIntPair, RandomCooldown> cooldowns;
+ private World currWorld = null;
+ private long internalTickCounter = 0;
+}
diff --git a/src/main/java/gregtech/api/objects/blockupdate/Cooldown.java b/src/main/java/gregtech/api/objects/blockupdate/Cooldown.java
new file mode 100644
index 0000000000..e00fc1c770
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/blockupdate/Cooldown.java
@@ -0,0 +1,27 @@
+package gregtech.api.objects.blockupdate;
+
+public class Cooldown {
+
+ public Cooldown(int aLengthInTicks) {
+
+ if (aLengthInTicks <= 0) throw new IllegalArgumentException("length should be a positive non-zero number");
+
+ this.lengthInTicks = aLengthInTicks;
+ this.lastTimeStarted = 0;
+ }
+
+ public void set(long currTickTime) {
+ lastTimeStarted = currTickTime;
+ }
+
+ public boolean hasPassed(long currTickTime) {
+ return currTickTime - lastTimeStarted >= lengthInTicks;
+ }
+
+ public long getLastTimeStarted() {
+ return lastTimeStarted;
+ }
+
+ private long lastTimeStarted;
+ protected int lengthInTicks;
+}
diff --git a/src/main/java/gregtech/api/objects/blockupdate/RandomCooldown.java b/src/main/java/gregtech/api/objects/blockupdate/RandomCooldown.java
new file mode 100644
index 0000000000..d275c29744
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/blockupdate/RandomCooldown.java
@@ -0,0 +1,31 @@
+package gregtech.api.objects.blockupdate;
+
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+public class RandomCooldown extends Cooldown {
+
+ public RandomCooldown(int aMinLengthInTicks, int aMaxLengthInTicks) {
+
+ super(aMinLengthInTicks);
+
+ if (aMinLengthInTicks <= 0)
+ throw new IllegalArgumentException("min length should be a positive non-zero number");
+ if (aMaxLengthInTicks <= 0)
+ throw new IllegalArgumentException("max length should be a positive non-zero number");
+ if (aMinLengthInTicks > aMaxLengthInTicks)
+ throw new IllegalArgumentException("min length should be less or equal to max length");
+
+ this.minLengthInTicks = aMinLengthInTicks;
+ this.maxLengthInTicks = aMaxLengthInTicks;
+ }
+
+ @Override
+ public void set(long currTickTime) {
+
+ super.set(currTickTime);
+ lengthInTicks = minLengthInTicks + XSTR_INSTANCE.nextInt(maxLengthInTicks - minLengthInTicks + 1);
+ }
+
+ private int minLengthInTicks;
+ private int maxLengthInTicks;
+}
diff --git a/src/main/java/gregtech/api/objects/iterators/MergedIterator.java b/src/main/java/gregtech/api/objects/iterators/MergedIterator.java
new file mode 100644
index 0000000000..961c98e81a
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/iterators/MergedIterator.java
@@ -0,0 +1,31 @@
+package gregtech.api.objects.iterators;
+
+import java.util.Iterator;
+
+public class MergedIterator<T> implements Iterator<T> {
+
+ private final Iterator<T>[] inners;
+ private int current;
+
+ @SafeVarargs
+ public MergedIterator(Iterator<T>... iterators) {
+ inners = iterators;
+ current = 0;
+ }
+
+ public boolean hasNext() {
+ while (current < inners.length && !inners[current].hasNext()) {
+ current++;
+ }
+
+ return current < inners.length;
+ }
+
+ public T next() {
+ while (current < inners.length && !inners[current].hasNext()) {
+ current++;
+ }
+
+ return inners[current].next();
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/overclockdescriber/EUNoOverclockDescriber.java b/src/main/java/gregtech/api/objects/overclockdescriber/EUNoOverclockDescriber.java
new file mode 100644
index 0000000000..1e29e2d812
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/overclockdescriber/EUNoOverclockDescriber.java
@@ -0,0 +1,110 @@
+package gregtech.api.objects.overclockdescriber;
+
+import static gregtech.api.util.GT_Utility.trans;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class EUNoOverclockDescriber extends OverclockDescriber {
+
+ /**
+ * Amperage of the recipemap.
+ */
+ protected final int amperage;
+
+ public EUNoOverclockDescriber(byte tier, int amperage) {
+ super(tier);
+ if (amperage < 1) {
+ throw new IllegalArgumentException("Amperage cannot be lower than 1");
+ }
+ this.amperage = amperage;
+ }
+
+ @Override
+ public GT_OverclockCalculator createCalculator(GT_OverclockCalculator template, GT_Recipe recipe) {
+ return GT_OverclockCalculator.ofNoOverclock(recipe);
+ }
+
+ @Override
+ public String getTierString() {
+ return GT_Utility.getColoredTierNameFromTier(tier);
+ }
+
+ @Override
+ public final void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {
+ if (recipeInfo.calculator.getDuration() > 0 && recipeInfo.calculator.getConsumption() > 0) {
+ recipeInfo.drawText(trans("152", "Total: ") + getTotalPowerString(recipeInfo.calculator));
+ }
+ drawEnergyInfoImpl(recipeInfo);
+ }
+
+ /**
+ * Override this to draw custom info about the energy this object can handle on NEI recipe GUI, minus total
+ * power usage.
+ */
+ protected void drawEnergyInfoImpl(RecipeDisplayInfo recipeInfo) {
+ if (recipeInfo.calculator.getConsumption() <= 0) {
+ return;
+ }
+ recipeInfo.drawText(trans("153", "Usage: ") + getEUtDisplay(recipeInfo.calculator));
+ if (shouldShowAmperage(recipeInfo.calculator)) {
+ recipeInfo.drawText(trans("154", "Voltage: ") + getVoltageString(recipeInfo.calculator));
+ recipeInfo.drawText(trans("155", "Amperage: ") + getAmperageString(recipeInfo.calculator));
+ }
+ }
+
+ protected String getTotalPowerString(GT_OverclockCalculator calculator) {
+ return GT_Utility.formatNumbers(calculator.getConsumption() * calculator.getDuration()) + " EU";
+ }
+
+ /**
+ * @return If amperage should be shown on NEI.
+ */
+ protected boolean shouldShowAmperage(GT_OverclockCalculator calculator) {
+ return amperage != 1;
+ }
+
+ /**
+ * @return Whole EU/t usage, without tier display.
+ */
+ protected String getEUtWithoutTier(GT_OverclockCalculator calculator) {
+ return GT_Utility.formatNumbers(calculator.getConsumption()) + " EU/t";
+ }
+
+ /**
+ * @return Whole EU/t usage, with tier display.
+ */
+ protected String getEUtWithTier(GT_OverclockCalculator calculator) {
+ return getEUtWithoutTier(calculator) + GT_Utility.getTierNameWithParentheses(calculator.getConsumption());
+ }
+
+ /**
+ * @return Whole EU/t usage. Also displays voltage tier if it should be shown.
+ */
+ protected String getEUtDisplay(GT_OverclockCalculator calculator) {
+ return shouldShowAmperage(calculator) ? getEUtWithoutTier(calculator) : getEUtWithTier(calculator);
+ }
+
+ /**
+ * @return EU/t usage, divided by amperage. With tier display.
+ */
+ protected String getVoltageString(GT_OverclockCalculator calculator) {
+ long voltage = computeVoltageForEURate(calculator.getConsumption());
+ return GT_Utility.formatNumbers(voltage) + " EU/t" + GT_Utility.getTierNameWithParentheses(voltage);
+ }
+
+ protected String getAmperageString(GT_OverclockCalculator calculator) {
+ return GT_Utility.formatNumbers(amperage);
+ }
+
+ protected long computeVoltageForEURate(long euPerTick) {
+ return euPerTick / amperage;
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/overclockdescriber/EUOverclockDescriber.java b/src/main/java/gregtech/api/objects/overclockdescriber/EUOverclockDescriber.java
new file mode 100644
index 0000000000..9d53711515
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/overclockdescriber/EUOverclockDescriber.java
@@ -0,0 +1,80 @@
+package gregtech.api.objects.overclockdescriber;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.util.GT_Utility.trans;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.google.common.primitives.Ints;
+
+import gregtech.GT_Mod;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class EUOverclockDescriber extends EUNoOverclockDescriber {
+
+ public EUOverclockDescriber(byte tier, int amperage) {
+ super(tier, amperage);
+ }
+
+ @Override
+ public GT_OverclockCalculator createCalculator(GT_OverclockCalculator template, GT_Recipe recipe) {
+ return template.setEUt(Ints.saturatedCast(V[tier] * amperage));
+ }
+
+ @Override
+ protected void drawEnergyInfoImpl(RecipeDisplayInfo recipeInfo) {
+ if (!wasOverclocked(recipeInfo.calculator)) {
+ super.drawEnergyInfoImpl(recipeInfo);
+ return;
+ }
+
+ recipeInfo.drawText(trans("153", "Usage: ") + getEUtDisplay(recipeInfo.calculator));
+ if (shouldShowAmperage(recipeInfo.calculator)) {
+ recipeInfo.drawText(trans("154", "Voltage: ") + getVoltageString(recipeInfo.calculator));
+ }
+ if (GT_Mod.gregtechproxy.mNEIOriginalVoltage) {
+ EUNoOverclockDescriber originalPower = new EUNoOverclockDescriber(tier, amperage);
+ GT_OverclockCalculator originalPowerCalculator = GT_OverclockCalculator.ofNoOverclock(recipeInfo.recipe)
+ .calculate();
+ recipeInfo
+ .drawText(trans("275", "Original usage: ") + originalPower.getEUtDisplay(originalPowerCalculator));
+ }
+ if (shouldShowAmperage(recipeInfo.calculator)) {
+ recipeInfo.drawText(trans("155", "Amperage: ") + getAmperageString(recipeInfo.calculator));
+ }
+ }
+
+ @Override
+ protected String getEUtWithoutTier(GT_OverclockCalculator calculator) {
+ return decorateWithOverclockLabel(super.getEUtWithoutTier(calculator), calculator);
+ }
+
+ @Override
+ protected String getEUtWithTier(GT_OverclockCalculator calculator) {
+ return this.getEUtWithoutTier(calculator) + GT_Utility.getTierNameWithParentheses(calculator.getConsumption());
+ }
+
+ @Override
+ protected String getVoltageString(GT_OverclockCalculator calculator) {
+ long voltage = computeVoltageForEURate(calculator.getConsumption());
+ return decorateWithOverclockLabel(GT_Utility.formatNumbers(voltage) + " EU/t", calculator)
+ + GT_Utility.getTierNameWithParentheses(voltage);
+ }
+
+ protected String decorateWithOverclockLabel(String s, GT_OverclockCalculator calculator) {
+ if (wasOverclocked(calculator)) {
+ s += " (OC)";
+ }
+ return s;
+ }
+
+ protected boolean wasOverclocked(GT_OverclockCalculator calculator) {
+ return calculator.getPerformedOverclocks() > 0;
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/overclockdescriber/FusionOverclockDescriber.java b/src/main/java/gregtech/api/objects/overclockdescriber/FusionOverclockDescriber.java
new file mode 100644
index 0000000000..8f64f3146e
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/overclockdescriber/FusionOverclockDescriber.java
@@ -0,0 +1,63 @@
+package gregtech.api.objects.overclockdescriber;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.formatter.FusionSpecialValueFormatter;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class FusionOverclockDescriber extends EUOverclockDescriber {
+
+ protected final long capableStartup;
+
+ public FusionOverclockDescriber(byte energyTier, long capableStartup) {
+ super(energyTier, 1);
+ this.capableStartup = capableStartup;
+ }
+
+ @Override
+ public GT_OverclockCalculator createCalculator(GT_OverclockCalculator template, GT_Recipe recipe) {
+ return super.createCalculator(template, recipe)
+ .limitOverclockCount(overclock(recipe.mSpecialValue, recipe.mEUt))
+ .setEUtIncreasePerOC(getEUtIncreasePerOC())
+ .setDurationDecreasePerOC(getDurationDecreasePerOC());
+ }
+
+ protected int getEUtIncreasePerOC() {
+ return 1;
+ }
+
+ protected int getDurationDecreasePerOC() {
+ return 1;
+ }
+
+ @Override
+ public String getTierString() {
+ return GT_Values.TIER_COLORS[tier] + "MK " + getFusionTier() + EnumChatFormatting.RESET;
+ }
+
+ @Override
+ public boolean canHandle(GT_Recipe recipe) {
+ byte tier = GT_Utility.getTier(recipe.mEUt);
+ if (this.tier < tier) {
+ return false;
+ }
+ return this.capableStartup >= recipe.mSpecialValue;
+ }
+
+ protected int overclock(long startEnergy, long voltage) {
+ // Fusion Computer tier - recipe tier
+ return Math.max(getFusionTier() - FusionSpecialValueFormatter.getFusionTier(startEnergy, voltage), 0);
+ }
+
+ protected int getFusionTier() {
+ return this.tier - 5; // Mk1 <-> LuV
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/overclockdescriber/OverclockDescriber.java b/src/main/java/gregtech/api/objects/overclockdescriber/OverclockDescriber.java
new file mode 100644
index 0000000000..0b253c95fa
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/overclockdescriber/OverclockDescriber.java
@@ -0,0 +1,106 @@
+package gregtech.api.objects.overclockdescriber;
+
+import static gregtech.api.util.GT_Utility.trans;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.GT_Mod;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+/**
+ * Provides an overclock behavior that will run on machines with the ability to draw information about it on NEI.
+ * <p>
+ * Implement {@link gregtech.api.interfaces.tileentity.IOverclockDescriptionProvider} for corresponding machine to use
+ * derivative of this class when looking up NEI recipe catalyst.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public abstract class OverclockDescriber {
+
+ /**
+ * Tier of the (maybe virtual) machine this object belongs to.
+ */
+ protected final byte tier;
+
+ public OverclockDescriber(byte tier) {
+ this.tier = tier;
+ }
+
+ /**
+ * @return Tier of this object. Used to limit recipes shown on NEI, based on recipe EU/t.
+ */
+ public final byte getTier() {
+ return tier;
+ }
+
+ /**
+ * @return Tier display of this object, shown on NEI header in a form of {@code Machine Name (tier)}
+ */
+ public abstract String getTierString();
+
+ /**
+ * Creates overclock calculator from given template. This template should be used instead of building from the
+ * ground to avoid issues coming from different caller using different templates, but it's not applicable when using
+ * {@link GT_OverclockCalculator#ofNoOverclock(GT_Recipe)}.
+ *
+ * @param template Calculator that can be used as template. Recipe EU/t and duration are already set.
+ * @param recipe Recipe to calculate.
+ */
+ public abstract GT_OverclockCalculator createCalculator(GT_OverclockCalculator template, GT_Recipe recipe);
+
+ /**
+ * Draws info about the energy this object can handle on NEI recipe GUI.
+ */
+ public abstract void drawEnergyInfo(RecipeDisplayInfo recipeInfo);
+
+ public void drawDurationInfo(RecipeDisplayInfo recipeInfo) {
+ if (getDurationTicks(recipeInfo.calculator) <= 0) return;
+
+ String textToDraw = trans("158", "Time: ");
+ if (GT_Mod.gregtechproxy.mNEIRecipeSecondMode) {
+ textToDraw += getDurationStringSeconds(recipeInfo.calculator);
+ if (getDurationSeconds(recipeInfo.calculator) <= 1.0d) {
+ textToDraw += String.format(" (%s)", getDurationStringTicks(recipeInfo.calculator));
+ }
+ } else {
+ textToDraw += getDurationStringTicks(recipeInfo.calculator);
+ }
+ recipeInfo.drawText(textToDraw);
+ }
+
+ /**
+ * Used to limit the shown recipes when searching recipes with NEI recipe catalyst. Unless overridden, this method
+ * doesn't do anything special (except for a bit worse performance).
+ * <p>
+ * In order to make use of this method, {@link gregtech.api.recipe.RecipeMapBuilder#useCustomFilterForNEI}
+ * should be enabled for the recipemap.
+ *
+ * @return If this object can handle the supplied recipe
+ */
+ public boolean canHandle(GT_Recipe recipe) {
+ byte tier = GT_Utility.getTier(recipe.mEUt);
+ return this.tier >= tier;
+ }
+
+ private int getDurationTicks(GT_OverclockCalculator calculator) {
+ return calculator.getDuration();
+ }
+
+ private double getDurationSeconds(GT_OverclockCalculator calculator) {
+ return 0.05d * getDurationTicks(calculator);
+ }
+
+ private String getDurationStringSeconds(GT_OverclockCalculator calculator) {
+ return GT_Utility.formatNumbers(getDurationSeconds(calculator)) + GT_Utility.trans("161", " secs");
+ }
+
+ private String getDurationStringTicks(GT_OverclockCalculator calculator) {
+ String ticksString = getDurationTicks(calculator) == 1 ? GT_Utility.trans("209.1", " tick")
+ : GT_Utility.trans("209", " ticks");
+ return GT_Utility.formatNumbers(getDurationTicks(calculator)) + ticksString;
+ }
+}
diff --git a/src/main/java/gregtech/api/objects/overclockdescriber/SteamOverclockDescriber.java b/src/main/java/gregtech/api/objects/overclockdescriber/SteamOverclockDescriber.java
new file mode 100644
index 0000000000..5da64d4028
--- /dev/null
+++ b/src/main/java/gregtech/api/objects/overclockdescriber/SteamOverclockDescriber.java
@@ -0,0 +1,64 @@
+package gregtech.api.objects.overclockdescriber;
+
+import static gregtech.api.util.GT_Utility.trans;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class SteamOverclockDescriber extends OverclockDescriber {
+
+ private final SteamVariant steamVariant;
+ private final int euPerTickMultiplier;
+ private final int durationMultiplier;
+
+ public SteamOverclockDescriber(SteamVariant steamVariant, int euPerTickMultiplier, int durationMultiplier) {
+ super((byte) 1); // recipe tier is always LV
+ this.steamVariant = steamVariant;
+ this.euPerTickMultiplier = euPerTickMultiplier;
+ this.durationMultiplier = durationMultiplier;
+ }
+
+ @Override
+ public String getTierString() {
+ return StatCollector.translateToLocal("GT5U.steam_variant." + steamVariant.toString());
+ }
+
+ @Override
+ public GT_OverclockCalculator createCalculator(GT_OverclockCalculator template, GT_Recipe recipe) {
+ return GT_OverclockCalculator.ofNoOverclock(recipe)
+ .setEUtDiscount(euPerTickMultiplier)
+ .setSpeedBoost(durationMultiplier);
+ }
+
+ @Override
+ public void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {
+ if (recipeInfo.calculator.getConsumption() <= 0) return;
+
+ recipeInfo.drawText(trans("152", "Total: ") + getTotalPowerString(recipeInfo.calculator));
+ recipeInfo.drawText(trans("153", "Usage: ") + getSteamUsageString(recipeInfo.calculator));
+ }
+
+ private String getTotalPowerString(GT_OverclockCalculator calculator) {
+ return GT_Utility.formatNumbers(convertEUToSteam(calculator.getConsumption() * calculator.getDuration()))
+ + " Steam";
+ }
+
+ private String getSteamUsageString(GT_OverclockCalculator calculator) {
+ return GT_Utility.formatNumbers(20 * convertEUToSteam(calculator.getConsumption())) + " L/s Steam";
+ }
+
+ private static long convertEUToSteam(long eu) {
+ // 2L normal steam == 1EU
+ return 2 * eu;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/BasicUIProperties.java b/src/main/java/gregtech/api/recipe/BasicUIProperties.java
new file mode 100644
index 0000000000..fde86785b2
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/BasicUIProperties.java
@@ -0,0 +1,251 @@
+package gregtech.api.recipe;
+
+import java.awt.Rectangle;
+import java.util.List;
+import java.util.function.IntFunction;
+import java.util.function.Supplier;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.math.Size;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+
+import gregtech.api.gui.modularui.FallbackableSteamTexture;
+import gregtech.api.gui.modularui.SteamTexture;
+import gregtech.api.util.FieldsAreNonnullByDefault;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Data object to store properties, used to draw both basic machine GUI and NEI recipe GUI, mainly GUI widgets.
+ * Not all the info used to draw NEI are listed here, see also {@link NEIRecipeProperties}.
+ * <p>
+ * Use {@link #builder()} for creation.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+@FieldsAreNonnullByDefault
+public final class BasicUIProperties {
+
+ /**
+ * Starts constructing BasicUIProperties.
+ */
+ public static BasicUIPropertiesBuilder builder() {
+ return new BasicUIPropertiesBuilder();
+ }
+
+ /**
+ * Creates new builder from this instance.
+ */
+ public BasicUIPropertiesBuilder toBuilder() {
+ return new BasicUIPropertiesBuilder().maxItemInputs(maxItemInputs)
+ .maxItemOutputs(maxItemOutputs)
+ .maxFluidInputs(maxFluidInputs)
+ .maxFluidOutputs(maxFluidOutputs)
+ .slotOverlays(slotOverlays)
+ .slotOverlaysSteam(slotOverlaysSteam)
+ .progressBarTexture(progressBarTexture)
+ .progressBarTextureSteam(progressBarTextureSteam)
+ .progressBarDirection(progressBarDirection)
+ .progressBarSize(progressBarSize)
+ .progressBarPos(progressBarPos)
+ .useProgressBar(useProgressBar)
+ .useSpecialSlot(useSpecialSlot)
+ .neiTransferRect(neiTransferRect)
+ .neiTransferRectId(neiTransferRectId)
+ .specialTextures(specialTextures)
+ .specialTexturesSteam(specialTexturesSteam)
+ .logo(logo)
+ .logoSize(logoSize)
+ .logoPos(logoPos)
+ .itemInputPositionsGetter(itemInputPositionsGetter)
+ .itemOutputPositionsGetter(itemOutputPositionsGetter)
+ .specialItemPositionGetter(specialItemPositionGetter)
+ .fluidInputPositionsGetter(fluidInputPositionsGetter)
+ .fluidOutputPositionsGetter(fluidOutputPositionsGetter)
+ .amperage(amperage);
+ }
+
+ /**
+ * How many item inputs does this recipemap usually has at most.
+ * It does not actually restrict number of items used in the recipe.
+ */
+ public final int maxItemInputs;
+ /**
+ * How many item outputs does this recipemap usually has at most.
+ * It does not actually restrict number of items used in the recipe.
+ */
+ public final int maxItemOutputs;
+ /**
+ * How many fluid inputs does this recipemap usually has at most.
+ * It does not actually restrict number of items used in the recipe.
+ */
+ public final int maxFluidInputs;
+ /**
+ * How many fluid outputs does this recipemap usually has at most.
+ * It does not actually restrict number of items used in the recipe.
+ */
+ public final int maxFluidOutputs;
+
+ private final SlotOverlayGetter<IDrawable> slotOverlays;
+ private final SlotOverlayGetter<SteamTexture> slotOverlaysSteam;
+
+ /**
+ * Progressbar used for BasicMachine GUI and NEI.
+ */
+ @Nullable
+ public final FallbackableUITexture progressBarTexture;
+ /**
+ * Progressbar used for steam machine GUI.
+ */
+ @Nullable
+ public final FallbackableSteamTexture progressBarTextureSteam;
+ /**
+ * Direction of progressbar animation.
+ */
+ public final ProgressBar.Direction progressBarDirection;
+ /**
+ * Size of the progressbar. (20, 36) by default.
+ */
+ public final Size progressBarSize;
+ /**
+ * Position of the progressbar. (78, 24) by default.
+ */
+ public final Pos2d progressBarPos;
+ /**
+ * Image size in the direction of progressbar. Used for non-smooth rendering.
+ */
+ public final int progressBarImageSize;
+
+ /**
+ * If progressbar should be added.
+ */
+ public final boolean useProgressBar;
+
+ /**
+ * If special slot has its usage for this GUI.
+ */
+ public final boolean useSpecialSlot;
+
+ /**
+ * GUI area where clicking shows up all the recipes available.
+ */
+ public final List<Rectangle> neiTransferRect;
+ /**
+ * ID used to open NEI recipe GUI when progressbar is clicked.
+ */
+ @Nullable
+ public final String neiTransferRectId;
+
+ /**
+ * Additional textures shown on GUI.
+ */
+ public final List<Pair<IDrawable, Pair<Size, Pos2d>>> specialTextures;
+ /**
+ * Additional textures shown on steam machine GUI.
+ */
+ public final List<Pair<SteamTexture, Pair<Size, Pos2d>>> specialTexturesSteam;
+
+ /**
+ * Logo shown on GUI. GregTech logo by default.
+ */
+ public final IDrawable logo;
+ /**
+ * Size of logo. (17, 17) by default.
+ */
+ public final Size logoSize;
+ /**
+ * Position of logo. (152, 63) by default.
+ */
+ public final Pos2d logoPos;
+
+ public final IntFunction<List<Pos2d>> itemInputPositionsGetter;
+ public final IntFunction<List<Pos2d>> itemOutputPositionsGetter;
+ public final Supplier<Pos2d> specialItemPositionGetter;
+ public final IntFunction<List<Pos2d>> fluidInputPositionsGetter;
+ public final IntFunction<List<Pos2d>> fluidOutputPositionsGetter;
+
+ /**
+ * Amperage for the recipemap. Even though this is placed at frontend because backend logic doesn't need it,
+ * some machine logic also use this variable.
+ */
+ public final int amperage;
+
+ BasicUIProperties(int maxItemInputs, int maxItemOutputs, int maxFluidInputs, int maxFluidOutputs,
+ SlotOverlayGetter<IDrawable> slotOverlays, SlotOverlayGetter<SteamTexture> slotOverlaysSteam,
+ @Nullable FallbackableUITexture progressBarTexture, @Nullable FallbackableSteamTexture progressBarTextureSteam,
+ ProgressBar.Direction progressBarDirection, Size progressBarSize, Pos2d progressBarPos, boolean useProgressBar,
+ boolean useSpecialSlot, List<Rectangle> neiTransferRect, @Nullable String neiTransferRectId,
+ List<Pair<IDrawable, Pair<Size, Pos2d>>> specialTextures,
+ List<Pair<SteamTexture, Pair<Size, Pos2d>>> specialTexturesSteam, IDrawable logo, Size logoSize, Pos2d logoPos,
+ IntFunction<List<Pos2d>> itemInputPositionsGetter, IntFunction<List<Pos2d>> itemOutputPositionsGetter,
+ Supplier<Pos2d> specialItemPositionGetter, IntFunction<List<Pos2d>> fluidInputPositionsGetter,
+ IntFunction<List<Pos2d>> fluidOutputPositionsGetter, int amperage) {
+ if (maxItemInputs < 0 || maxItemOutputs < 0 || maxFluidInputs < 0 || maxFluidOutputs < 0) {
+ throw new IllegalArgumentException(
+ "maxItemInputs, maxItemOutputs, maxFluidInputs and maxFluidOutputs cannot be negative");
+ }
+ if (amperage < 1) {
+ throw new IllegalArgumentException("Amperage cannot be lower than 1");
+ }
+ this.maxItemInputs = maxItemInputs;
+ this.maxItemOutputs = maxItemOutputs;
+ this.maxFluidInputs = maxFluidInputs;
+ this.maxFluidOutputs = maxFluidOutputs;
+ this.slotOverlays = slotOverlays;
+ this.slotOverlaysSteam = slotOverlaysSteam;
+ this.progressBarTexture = progressBarTexture;
+ this.progressBarTextureSteam = progressBarTextureSteam;
+ this.progressBarDirection = progressBarDirection;
+ this.progressBarSize = progressBarSize;
+ this.progressBarPos = progressBarPos;
+ this.useProgressBar = useProgressBar;
+ this.useSpecialSlot = useSpecialSlot;
+ this.neiTransferRect = neiTransferRect;
+ this.neiTransferRectId = neiTransferRectId;
+ this.specialTextures = specialTextures;
+ this.specialTexturesSteam = specialTexturesSteam;
+ this.logo = logo;
+ this.logoSize = logoSize;
+ this.logoPos = logoPos;
+ this.itemInputPositionsGetter = itemInputPositionsGetter;
+ this.itemOutputPositionsGetter = itemOutputPositionsGetter;
+ this.specialItemPositionGetter = specialItemPositionGetter;
+ this.fluidInputPositionsGetter = fluidInputPositionsGetter;
+ this.fluidOutputPositionsGetter = fluidOutputPositionsGetter;
+ this.amperage = amperage;
+
+ this.progressBarImageSize = switch (progressBarDirection) {
+ case UP, DOWN -> progressBarSize.height;
+ case CIRCULAR_CW -> Math.max(progressBarSize.width, progressBarSize.height);
+ default -> progressBarSize.width;
+ };
+ }
+
+ /**
+ * Retrieves overlay for slot, with given matching conditions.
+ */
+ @Nullable
+ public IDrawable getOverlayForSlot(int index, boolean isFluid, boolean isOutput, boolean isSpecial) {
+ return slotOverlays.apply(index, isFluid, isOutput, isSpecial);
+ }
+
+ /**
+ * Retrieves overlay for slot of steam machines, with given matching conditions.
+ */
+ @Nullable
+ public SteamTexture getOverlayForSlotSteam(int index, boolean isFluid, boolean isOutput, boolean isSpecial) {
+ return slotOverlaysSteam.apply(index, isFluid, isOutput, isSpecial);
+ }
+
+ public interface SlotOverlayGetter<T> {
+
+ @Nullable
+ T apply(int index, boolean isFluid, boolean isOutput, boolean isSpecial);
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/BasicUIPropertiesBuilder.java b/src/main/java/gregtech/api/recipe/BasicUIPropertiesBuilder.java
new file mode 100644
index 0000000000..7be2c94b23
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/BasicUIPropertiesBuilder.java
@@ -0,0 +1,264 @@
+package gregtech.api.recipe;
+
+import java.awt.Rectangle;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.IntFunction;
+import java.util.function.Supplier;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.math.Size;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+
+import gregtech.api.gui.modularui.FallbackableSteamTexture;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.SteamTexture;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+
+/**
+ * Builder class for {@link BasicUIProperties}.
+ */
+@SuppressWarnings("UnusedReturnValue")
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public final class BasicUIPropertiesBuilder {
+
+ private int maxItemInputs, maxItemOutputs, maxFluidInputs, maxFluidOutputs;
+
+ private BasicUIProperties.SlotOverlayGetter<IDrawable> slotOverlays = (index, isFluid, isOutput, isSpecial) -> null;
+ private BasicUIProperties.SlotOverlayGetter<SteamTexture> slotOverlaysSteam = (index, isFluid, isOutput,
+ isSpecial) -> null;
+
+ @Nullable
+ private FallbackableUITexture progressBarTexture;
+ @Nullable
+ private FallbackableSteamTexture progressBarTextureSteam;
+ private ProgressBar.Direction progressBarDirection = ProgressBar.Direction.RIGHT;
+ private Size progressBarSize = new Size(20, 18);
+ private Pos2d progressBarPos = new Pos2d(78, 24);
+
+ private boolean useProgressBar = true;
+
+ private boolean useSpecialSlot;
+
+ private final ImmutableList.Builder<Rectangle> neiTransferRect = ImmutableList.builder();
+ @Nullable
+ private String neiTransferRectId;
+
+ private final ImmutableList.Builder<Pair<IDrawable, Pair<Size, Pos2d>>> specialTextures = ImmutableList.builder();
+ private final ImmutableList.Builder<Pair<SteamTexture, Pair<Size, Pos2d>>> specialTexturesSteam = ImmutableList
+ .builder();
+
+ private IDrawable logo = GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT;
+ private Size logoSize = new Size(17, 17);
+ private Pos2d logoPos = new Pos2d(152, 63);
+
+ private IntFunction<List<Pos2d>> itemInputPositionsGetter = UIHelper::getItemInputPositions;
+ private IntFunction<List<Pos2d>> itemOutputPositionsGetter = UIHelper::getItemOutputPositions;
+ private Supplier<Pos2d> specialItemPositionGetter = UIHelper::getSpecialItemPosition;
+ private IntFunction<List<Pos2d>> fluidInputPositionsGetter = UIHelper::getFluidInputPositions;
+ private IntFunction<List<Pos2d>> fluidOutputPositionsGetter = UIHelper::getFluidOutputPositions;
+
+ private int amperage = 1;
+
+ BasicUIPropertiesBuilder() {}
+
+ public BasicUIProperties build() {
+ if (maxItemInputs == 0 && maxItemOutputs == 0 && maxFluidInputs == 0 && maxFluidOutputs == 0) {
+ throw new IllegalArgumentException("Set either of max I/O count");
+ }
+ List<Rectangle> builtNEITransferRect = neiTransferRect.build();
+ if (builtNEITransferRect.isEmpty()) {
+ builtNEITransferRect = Collections.singletonList(
+ new Rectangle(
+ progressBarPos.x - (16 / 2),
+ progressBarPos.y,
+ progressBarSize.width + 16,
+ progressBarSize.height));
+ }
+ return new BasicUIProperties(
+ maxItemInputs,
+ maxItemOutputs,
+ maxFluidInputs,
+ maxFluidOutputs,
+ slotOverlays,
+ slotOverlaysSteam,
+ progressBarTexture,
+ progressBarTextureSteam,
+ progressBarDirection,
+ progressBarSize,
+ progressBarPos,
+ useProgressBar,
+ useSpecialSlot,
+ builtNEITransferRect,
+ neiTransferRectId,
+ specialTextures.build(),
+ specialTexturesSteam.build(),
+ logo,
+ logoSize,
+ logoPos,
+ itemInputPositionsGetter,
+ itemOutputPositionsGetter,
+ specialItemPositionGetter,
+ fluidInputPositionsGetter,
+ fluidOutputPositionsGetter,
+ amperage);
+ }
+
+ public BasicUIPropertiesBuilder maxItemInputs(int maxItemInputs) {
+ this.maxItemInputs = maxItemInputs;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder maxItemOutputs(int maxItemOutputs) {
+ this.maxItemOutputs = maxItemOutputs;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder maxFluidInputs(int maxFluidInputs) {
+ this.maxFluidInputs = maxFluidInputs;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder maxFluidOutputs(int maxFluidOutputs) {
+ this.maxFluidOutputs = maxFluidOutputs;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder slotOverlays(BasicUIProperties.SlotOverlayGetter<IDrawable> slotOverlays) {
+ this.slotOverlays = slotOverlays;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder slotOverlaysSteam(
+ BasicUIProperties.SlotOverlayGetter<SteamTexture> slotOverlaysSteam) {
+ this.slotOverlaysSteam = slotOverlaysSteam;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder progressBarTexture(@Nullable FallbackableUITexture progressBarTexture) {
+ this.progressBarTexture = progressBarTexture;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder progressBarTextureSteam(
+ @Nullable FallbackableSteamTexture progressBarTextureSteam) {
+ this.progressBarTextureSteam = progressBarTextureSteam;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder progressBarDirection(ProgressBar.Direction progressBarDirection) {
+ this.progressBarDirection = progressBarDirection;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder progressBarSize(Size progressBarSize) {
+ this.progressBarSize = progressBarSize;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder progressBarPos(Pos2d progressBarPos) {
+ this.progressBarPos = progressBarPos;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder useProgressBar(boolean useProgressBar) {
+ this.useProgressBar = useProgressBar;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder useSpecialSlot(boolean useSpecialSlot) {
+ this.useSpecialSlot = useSpecialSlot;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder addNEITransferRect(Rectangle neiTransferRect) {
+ this.neiTransferRect.add(neiTransferRect);
+ return this;
+ }
+
+ BasicUIPropertiesBuilder neiTransferRect(List<Rectangle> neiTransferRect) {
+ this.neiTransferRect.addAll(neiTransferRect);
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder neiTransferRectId(@Nullable String neiTransferRectId) {
+ this.neiTransferRectId = neiTransferRectId;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder addSpecialTexture(Size size, Pos2d pos, IDrawable texture) {
+ this.specialTextures.add(new ImmutablePair<>(texture, new ImmutablePair<>(size, pos)));
+ return this;
+ }
+
+ BasicUIPropertiesBuilder specialTextures(List<Pair<IDrawable, Pair<Size, Pos2d>>> specialTextures) {
+ this.specialTextures.addAll(specialTextures);
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder addSpecialTextureSteam(Size size, Pos2d pos, SteamTexture texture) {
+ this.specialTexturesSteam.add(new ImmutablePair<>(texture, new ImmutablePair<>(size, pos)));
+ return this;
+ }
+
+ BasicUIPropertiesBuilder specialTexturesSteam(List<Pair<SteamTexture, Pair<Size, Pos2d>>> specialTextures) {
+ this.specialTexturesSteam.addAll(specialTextures);
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder logo(IDrawable logo) {
+ this.logo = logo;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder logoSize(Size logoSize) {
+ this.logoSize = logoSize;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder logoPos(Pos2d logoPos) {
+ this.logoPos = logoPos;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder itemInputPositionsGetter(IntFunction<List<Pos2d>> itemInputPositionsGetter) {
+ this.itemInputPositionsGetter = itemInputPositionsGetter;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder itemOutputPositionsGetter(IntFunction<List<Pos2d>> itemOutputPositionsGetter) {
+ this.itemOutputPositionsGetter = itemOutputPositionsGetter;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder specialItemPositionGetter(Supplier<Pos2d> specialItemPositionGetter) {
+ this.specialItemPositionGetter = specialItemPositionGetter;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder fluidInputPositionsGetter(IntFunction<List<Pos2d>> fluidInputPositionsGetter) {
+ this.fluidInputPositionsGetter = fluidInputPositionsGetter;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder fluidOutputPositionsGetter(IntFunction<List<Pos2d>> fluidOutputPositionsGetter) {
+ this.fluidOutputPositionsGetter = fluidOutputPositionsGetter;
+ return this;
+ }
+
+ public BasicUIPropertiesBuilder amperage(int amperage) {
+ this.amperage = amperage;
+ return this;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/FindRecipeQuery.java b/src/main/java/gregtech/api/recipe/FindRecipeQuery.java
new file mode 100644
index 0000000000..77c0648688
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/FindRecipeQuery.java
@@ -0,0 +1,178 @@
+package gregtech.api.recipe;
+
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+// spotless:off spotless likes formatting @code to &#64;code
+/**
+ * Helper class for searching recipe. Retrieve instance with {@link RecipeMap#findRecipeQuery}.
+ * <p>
+ * It features fluent API, so you can find recipes like this:
+ *
+ * <pre>
+ * {@code
+ * GT_Recipe recipe = recipeMap.findRecipeQuery()
+ * .items(inputItems)
+ * .fluids(inputFluids)
+ * .find();
+ * }
+ * </pre>
+ */
+// spotless:on
+@SuppressWarnings("unused")
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public final class FindRecipeQuery {
+
+ private static final Predicate<GT_Recipe> ALWAYS = r -> true;
+
+ private final RecipeMap<?> recipeMap;
+
+ @Nullable
+ private ItemStack[] items;
+ @Nullable
+ private FluidStack[] fluids;
+ @Nullable
+ private ItemStack specialSlot;
+ private Predicate<GT_Recipe> filter = ALWAYS;
+ private long voltage = Integer.MAX_VALUE;
+ @Nullable
+ private GT_Recipe cachedRecipe;
+ private boolean notUnificated;
+ private boolean dontCheckStackSizes;
+ private boolean forCollisionCheck;
+
+ FindRecipeQuery(RecipeMap<?> recipeMap) {
+ this.recipeMap = recipeMap;
+ }
+
+ // region executors
+
+ /**
+ * @return The first matched recipe, or null if not found.
+ */
+ @Nullable
+ public GT_Recipe find() {
+ return findAll().findFirst()
+ .orElse(null);
+ }
+
+ /**
+ * @return All the matched recipes in the form of Stream.
+ */
+ public Stream<GT_Recipe> findAll() {
+ if (items == null) {
+ items = new ItemStack[0];
+ }
+ if (fluids == null) {
+ fluids = new FluidStack[0];
+ }
+
+ return recipeMap.getBackend()
+ .matchRecipeStream(
+ items,
+ fluids,
+ specialSlot,
+ cachedRecipe,
+ notUnificated,
+ dontCheckStackSizes,
+ forCollisionCheck)
+ .filter(recipe -> voltage * recipeMap.getAmperage() >= recipe.mEUt && filter.test(recipe));
+ }
+
+ /**
+ * Checks if given inputs conflict with already registered recipes.
+ *
+ * @return True if collision is found.
+ */
+ public boolean checkCollision() {
+ dontCheckStackSizes = true;
+ forCollisionCheck = true;
+ return findAll().findAny()
+ .isPresent();
+ }
+
+ // endregion
+
+ // region setters
+
+ /**
+ * @param items Item inputs.
+ */
+ public FindRecipeQuery items(@Nullable ItemStack... items) {
+ this.items = items;
+ return this;
+ }
+
+ /**
+ * @param fluids Fluid inputs.
+ */
+ public FindRecipeQuery fluids(@Nullable FluidStack... fluids) {
+ this.fluids = fluids;
+ return this;
+ }
+
+ /**
+ * @param specialSlot Content of the special slot. Normal recipemaps don't need this, but some do.
+ * Set {@link RecipeMapBuilder#specialSlotSensitive} to make it actually functional.
+ * Alternatively overriding {@link RecipeMapBackend#filterFindRecipe} will also work.
+ */
+ public FindRecipeQuery specialSlot(@Nullable ItemStack specialSlot) {
+ this.specialSlot = specialSlot;
+ return this;
+ }
+
+ /**
+ * @param filter Matched recipe will be tested by this function. If it returns false, the query will attempt to
+ * find next recipe.
+ */
+ public FindRecipeQuery filter(Predicate<GT_Recipe> filter) {
+ this.filter = filter;
+ return this;
+ }
+
+ /**
+ * @param voltage Recipes that exceed this voltage won't match. It will be automatically multiplied by amperage
+ * of the recipemap.
+ */
+ public FindRecipeQuery voltage(long voltage) {
+ this.voltage = voltage;
+ return this;
+ }
+
+ /**
+ * @param cachedRecipe If this is not null, the query tests it before all other recipes.
+ */
+ public FindRecipeQuery cachedRecipe(@Nullable GT_Recipe cachedRecipe) {
+ this.cachedRecipe = cachedRecipe;
+ return this;
+ }
+
+ /**
+ * @param notUnificated If this is set to true, item inputs will be unificated.
+ */
+ public FindRecipeQuery notUnificated(boolean notUnificated) {
+ this.notUnificated = notUnificated;
+ return this;
+ }
+
+ /**
+ * @param dontCheckStackSizes If this is set to true, the query won't check item count and fluid amount
+ * for the matched recipe.
+ */
+ public FindRecipeQuery dontCheckStackSizes(boolean dontCheckStackSizes) {
+ this.dontCheckStackSizes = dontCheckStackSizes;
+ return this;
+ }
+
+ // endregion
+}
diff --git a/src/main/java/gregtech/api/recipe/NEIRecipeProperties.java b/src/main/java/gregtech/api/recipe/NEIRecipeProperties.java
new file mode 100644
index 0000000000..2ba49f5da1
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/NEIRecipeProperties.java
@@ -0,0 +1,89 @@
+package gregtech.api.recipe;
+
+import java.util.Comparator;
+import java.util.function.UnaryOperator;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.math.Size;
+
+import codechicken.nei.recipe.HandlerInfo;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.util.FieldsAreNonnullByDefault;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.formatter.INEISpecialInfoFormatter;
+
+/**
+ * Data object storing info exclusively used to draw NEI recipe GUI. Not all the properties used to draw NEI
+ * are present here. See {@link BasicUIProperties} for the rest.
+ * <p>
+ * Use {@link #builder} for creation.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+@FieldsAreNonnullByDefault
+public final class NEIRecipeProperties {
+
+ static NEIRecipePropertiesBuilder builder() {
+ return new NEIRecipePropertiesBuilder();
+ }
+
+ /**
+ * Whether to register dedicated NEI recipe page for the recipemap.
+ */
+ public final boolean registerNEI;
+ @Nullable
+ public final UnaryOperator<HandlerInfo.Builder> handlerInfoCreator;
+
+ /**
+ * Size of background shown.
+ */
+ // todo make it final
+ public Size recipeBackgroundSize;
+ /**
+ * Offset of background shown.
+ */
+ public final Pos2d recipeBackgroundOffset;
+
+ /**
+ * Formats special description for the recipe, mainly {@link gregtech.api.util.GT_Recipe#mSpecialValue}.
+ */
+ public final INEISpecialInfoFormatter neiSpecialInfoFormatter;
+
+ /**
+ * Whether to show oredict equivalent item outputs.
+ */
+ public final boolean unificateOutput;
+ /**
+ * If a custom filter method {@link OverclockDescriber#canHandle} should be used to limit the shown recipes when
+ * searching recipes with recipe catalyst. Else, the voltage of the recipe is the only factor to filter recipes.
+ */
+ public final boolean useCustomFilter;
+ /**
+ * Whether to render the actual stack size of items or not.
+ */
+ public final boolean renderRealStackSizes;
+
+ /**
+ * Comparator for NEI recipe sort. {@link GT_Recipe#compareTo(GT_Recipe)} by default.
+ */
+ public final Comparator<GT_Recipe> comparator;
+
+ NEIRecipeProperties(boolean registerNEI, @Nullable UnaryOperator<HandlerInfo.Builder> handlerInfoCreator,
+ Size recipeBackgroundSize, Pos2d recipeBackgroundOffset, INEISpecialInfoFormatter neiSpecialInfoFormatter,
+ boolean unificateOutput, boolean useCustomFilter, boolean renderRealStackSizes,
+ Comparator<GT_Recipe> comparator) {
+ this.registerNEI = registerNEI;
+ this.handlerInfoCreator = handlerInfoCreator;
+ this.recipeBackgroundOffset = recipeBackgroundOffset;
+ this.recipeBackgroundSize = recipeBackgroundSize;
+ this.neiSpecialInfoFormatter = neiSpecialInfoFormatter;
+ this.unificateOutput = unificateOutput;
+ this.useCustomFilter = useCustomFilter;
+ this.renderRealStackSizes = renderRealStackSizes;
+ this.comparator = comparator;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/NEIRecipePropertiesBuilder.java b/src/main/java/gregtech/api/recipe/NEIRecipePropertiesBuilder.java
new file mode 100644
index 0000000000..050a1c4920
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/NEIRecipePropertiesBuilder.java
@@ -0,0 +1,100 @@
+package gregtech.api.recipe;
+
+import java.util.Comparator;
+import java.util.function.UnaryOperator;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.math.Size;
+
+import codechicken.nei.recipe.HandlerInfo;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.formatter.DefaultSpecialValueFormatter;
+import gregtech.nei.formatter.INEISpecialInfoFormatter;
+
+/**
+ * Builder class for {@link NEIRecipeProperties}.
+ */
+@SuppressWarnings("UnusedReturnValue")
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public final class NEIRecipePropertiesBuilder {
+
+ private boolean registerNEI = true;
+ @Nullable
+ private UnaryOperator<HandlerInfo.Builder> handlerInfoCreator;
+
+ private Size recipeBackgroundSize = new Size(170, 82);
+ private Pos2d recipeBackgroundOffset = new Pos2d(3, 3);
+
+ private INEISpecialInfoFormatter neiSpecialInfoFormatter = DefaultSpecialValueFormatter.INSTANCE;
+
+ private boolean unificateOutput = true;
+ private boolean useCustomFilter;
+ private boolean renderRealStackSizes = true;
+
+ private Comparator<GT_Recipe> comparator = GT_Recipe::compareTo;
+
+ NEIRecipePropertiesBuilder() {}
+
+ public NEIRecipeProperties build() {
+ return new NEIRecipeProperties(
+ registerNEI,
+ handlerInfoCreator,
+ recipeBackgroundSize,
+ recipeBackgroundOffset,
+ neiSpecialInfoFormatter,
+ unificateOutput,
+ useCustomFilter,
+ renderRealStackSizes,
+ comparator);
+ }
+
+ public NEIRecipePropertiesBuilder disableRegisterNEI() {
+ this.registerNEI = false;
+ return this;
+ }
+
+ public NEIRecipePropertiesBuilder handlerInfoCreator(UnaryOperator<HandlerInfo.Builder> builderCreator) {
+ this.handlerInfoCreator = builderCreator;
+ return this;
+ }
+
+ public NEIRecipePropertiesBuilder recipeBackgroundSize(Size recipeBackgroundSize) {
+ this.recipeBackgroundSize = recipeBackgroundSize;
+ return this;
+ }
+
+ public NEIRecipePropertiesBuilder recipeBackgroundOffset(Pos2d recipeBackgroundOffset) {
+ this.recipeBackgroundOffset = recipeBackgroundOffset;
+ return this;
+ }
+
+ public NEIRecipePropertiesBuilder neiSpecialInfoFormatter(INEISpecialInfoFormatter neiSpecialInfoFormatter) {
+ this.neiSpecialInfoFormatter = neiSpecialInfoFormatter;
+ return this;
+ }
+
+ public NEIRecipePropertiesBuilder unificateOutput(boolean unificateOutput) {
+ this.unificateOutput = unificateOutput;
+ return this;
+ }
+
+ public NEIRecipePropertiesBuilder useCustomFilter() {
+ this.useCustomFilter = true;
+ return this;
+ }
+
+ public NEIRecipePropertiesBuilder disableRenderRealStackSizes() {
+ this.renderRealStackSizes = false;
+ return this;
+ }
+
+ public NEIRecipePropertiesBuilder recipeComparator(Comparator<GT_Recipe> comparator) {
+ this.comparator = comparator;
+ return this;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/RecipeCategories.java b/src/main/java/gregtech/api/recipe/RecipeCategories.java
new file mode 100644
index 0000000000..61eed8a8d7
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/RecipeCategories.java
@@ -0,0 +1,71 @@
+package gregtech.api.recipe;
+
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.recipe.RecipeCategory.createIcon;
+
+@SuppressWarnings("unused")
+public final class RecipeCategories {
+
+ @RecipeCategoryHolder
+ public static final RecipeCategory arcFurnaceRecycling = new RecipeCategory(
+ "gt.recipe.category.arc_furnace_recycling",
+ RecipeMaps.arcFurnaceRecipes,
+ builder -> builder.setDisplayImage(
+ createIcon(GregTech.getResourcePath("textures", "gui", "picture", "arc_furnace_recycling.png"))));
+
+ @RecipeCategoryHolder
+ public static final RecipeCategory plasmaArcFurnaceRecycling = new RecipeCategory(
+ "gt.recipe.category.plasma_arc_furnace_recycling",
+ RecipeMaps.plasmaArcFurnaceRecipes,
+ builder -> builder.setDisplayImage(
+ createIcon(GregTech.getResourcePath("textures", "gui", "picture", "plasma_arc_furnace_recycling.png"))));
+
+ @RecipeCategoryHolder
+ public static final RecipeCategory maceratorRecycling = new RecipeCategory(
+ "gt.recipe.category.macerator_recycling",
+ RecipeMaps.maceratorRecipes,
+ builder -> builder.setDisplayImage(
+ createIcon(GregTech.getResourcePath("textures", "gui", "picture", "macerator_recycling.png"))));
+
+ @RecipeCategoryHolder
+ public static final RecipeCategory fluidExtractorRecycling = new RecipeCategory(
+ "gt.recipe.category.fluid_extractor_recycling",
+ RecipeMaps.fluidExtractionRecipes,
+ builder -> builder.setDisplayImage(
+ createIcon(GregTech.getResourcePath("textures", "gui", "picture", "fluid_extractor_recycling.png"))));
+
+ @RecipeCategoryHolder
+ public static final RecipeCategory alloySmelterRecycling = new RecipeCategory(
+ "gt.recipe.category.alloy_smelter_recycling",
+ RecipeMaps.alloySmelterRecipes,
+ builder -> builder.setDisplayImage(
+ createIcon(GregTech.getResourcePath("textures", "gui", "picture", "alloy_smelter_recycling.png"))));
+
+ @RecipeCategoryHolder
+ public static final RecipeCategory alloySmelterMolding = new RecipeCategory(
+ "gt.recipe.category.alloy_smelter_molding",
+ RecipeMaps.alloySmelterRecipes,
+ builder -> builder.setDisplayImage(
+ createIcon(GregTech.getResourcePath("textures", "gui", "picture", "alloy_smelter_molding.png"))));
+
+ @RecipeCategoryHolder
+ public static final RecipeCategory forgeHammerRecycling = new RecipeCategory(
+ "gt.recipe.category.forge_hammer_recycling",
+ RecipeMaps.hammerRecipes,
+ builder -> builder.setDisplayImage(
+ createIcon(GregTech.getResourcePath("textures", "gui", "picture", "forge_hammer_recycling.png"))));
+
+ @RecipeCategoryHolder
+ public static final RecipeCategory ticPartExtruding = new RecipeCategory(
+ "gt.recipe.category.tic_part_extruding",
+ RecipeMaps.extruderRecipes,
+ builder -> builder.setDisplayImage(
+ createIcon(GregTech.getResourcePath("textures", "gui", "picture", "tic_part_extruding.png"))));
+
+ @RecipeCategoryHolder
+ public static final RecipeCategory ticBoltMolding = new RecipeCategory(
+ "gt.recipe.category.tic_bolt_molding",
+ RecipeMaps.fluidSolidifierRecipes,
+ builder -> builder.setDisplayImage(
+ createIcon(GregTech.getResourcePath("textures", "gui", "picture", "tic_bolt_molding.png"))));
+}
diff --git a/src/main/java/gregtech/api/recipe/RecipeCategory.java b/src/main/java/gregtech/api/recipe/RecipeCategory.java
new file mode 100644
index 0000000000..9f8674e939
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/RecipeCategory.java
@@ -0,0 +1,81 @@
+package gregtech.api.recipe;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.UnaryOperator;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import codechicken.nei.drawable.DrawableBuilder;
+import codechicken.nei.drawable.DrawableResource;
+import codechicken.nei.recipe.HandlerInfo;
+import cpw.mods.fml.common.Loader;
+import cpw.mods.fml.common.ModContainer;
+import gregtech.api.util.FieldsAreNonnullByDefault;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Allows certain recipes to be displayed on different tabs on NEI.
+ * <p>
+ * Also apply {@link RecipeCategoryHolder} annotation to each instance to be picked up by GT config.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+@FieldsAreNonnullByDefault
+public final class RecipeCategory {
+
+ public static final Map<String, RecipeCategory> ALL_RECIPE_CATEGORIES = new HashMap<>();
+
+ public final String unlocalizedName;
+ public final RecipeMap<?> recipeMap;
+ public final ModContainer ownerMod;
+ @Nullable
+ public final UnaryOperator<HandlerInfo.Builder> handlerInfoCreator;
+
+ /**
+ * @param unlocalizedName Unlocalized name of this category. Must be unique.
+ * @param recipeMap RecipeMap this category belongs to.
+ * @param handlerInfoCreator Supplier of handler info for the NEI handler this category belongs to.
+ */
+ public RecipeCategory(String unlocalizedName, RecipeMap<?> recipeMap,
+ @Nullable UnaryOperator<HandlerInfo.Builder> handlerInfoCreator) {
+ this.unlocalizedName = unlocalizedName;
+ this.recipeMap = recipeMap;
+ this.ownerMod = Loader.instance()
+ .activeModContainer();
+ this.handlerInfoCreator = handlerInfoCreator;
+ if (ALL_RECIPE_CATEGORIES.containsKey(unlocalizedName)) {
+ throw new IllegalArgumentException(
+ "Cannot register recipe category with duplicated unlocalized name: " + unlocalizedName);
+ }
+ ALL_RECIPE_CATEGORIES.put(unlocalizedName, this);
+ }
+
+ RecipeCategory(RecipeMap<?> recipeMap) {
+ this(recipeMap.unlocalizedName, recipeMap, recipeMap.getFrontend().neiProperties.handlerInfoCreator);
+ }
+
+ @Override
+ public String toString() {
+ return "RecipeCategory{" + "unlocalizedName='"
+ + unlocalizedName
+ + '\''
+ + ", recipeMap="
+ + recipeMap.unlocalizedName
+ + ", ownerMod="
+ + ownerMod.getModId()
+ + '}';
+ }
+
+ /**
+ * Util method for creating icon for recipe category. Size is 16px.
+ */
+ public static DrawableResource createIcon(String resourceLocation) {
+ return new DrawableBuilder(resourceLocation, 0, 0, 16, 16)
+ // GuiRecipeTab#drawForeground draws icon with 1px offset to make fuel icon (14px) prettier
+ .addPadding(-1, 0, -1, 0)
+ .setTextureSize(16, 16)
+ .build();
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/RecipeCategoryHolder.java b/src/main/java/gregtech/api/recipe/RecipeCategoryHolder.java
new file mode 100644
index 0000000000..0ad87e3f6f
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/RecipeCategoryHolder.java
@@ -0,0 +1,13 @@
+package gregtech.api.recipe;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Apply this annotation to each recipe category so that GT config will pick it up.
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface RecipeCategoryHolder {}
diff --git a/src/main/java/gregtech/api/recipe/RecipeCategorySetting.java b/src/main/java/gregtech/api/recipe/RecipeCategorySetting.java
new file mode 100644
index 0000000000..4920d64212
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/RecipeCategorySetting.java
@@ -0,0 +1,52 @@
+package gregtech.api.recipe;
+
+import java.util.Locale;
+import java.util.stream.Stream;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Specifies behaviors for {@link RecipeCategory}.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public enum RecipeCategorySetting {
+
+ /**
+ * Show the category in separated NEI tab.
+ */
+ ENABLE,
+ /**
+ * The category is merged to default one for the recipemap.
+ */
+ MERGE,
+ /**
+ * Recipes belonging to the category are hidden from NEI.
+ */
+ HIDE;
+
+ public static final RecipeCategorySetting[] VALUES = values();
+ public static final String[] NAMES = Stream.of(VALUES)
+ .map(RecipeCategorySetting::toName)
+ .toArray(String[]::new);
+
+ public static RecipeCategorySetting getDefault() {
+ return ENABLE;
+ }
+
+ public String toName() {
+ return toString().toLowerCase(Locale.ENGLISH);
+ }
+
+ public static RecipeCategorySetting find(String name) {
+ for (RecipeCategorySetting setting : VALUES) {
+ if (setting.toName()
+ .equals(name)) {
+ return setting;
+ }
+ }
+ return getDefault();
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/RecipeMap.java b/src/main/java/gregtech/api/recipe/RecipeMap.java
new file mode 100644
index 0000000000..2ee2d3cb94
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/RecipeMap.java
@@ -0,0 +1,395 @@
+package gregtech.api.recipe;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.Unmodifiable;
+
+import gregtech.api.interfaces.IRecipeMap;
+import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords;
+import gregtech.api.util.FieldsAreNonnullByDefault;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Manages list of recipes. Its functionalities are split
+ * between {@link RecipeMapBackend} and {@link RecipeMapFrontend}.
+ *
+ * @param <B> Type of {@link RecipeMapBackend}
+ */
+@SuppressWarnings({ "unused", "UnusedReturnValue" })
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+@FieldsAreNonnullByDefault
+public final class RecipeMap<B extends RecipeMapBackend> implements IRecipeMap {
+
+ /**
+ * All the recipemap instances. key=unlocalized name, value=instance.
+ */
+ public static final Map<String, RecipeMap<?>> ALL_RECIPE_MAPS = new HashMap<>();
+
+ private final B backend;
+ private final RecipeMapFrontend frontend;
+
+ /**
+ * Unique unlocalized name of this recipemap. Used for identifier, localization key for NEI tab name, etc.
+ */
+ public final String unlocalizedName;
+
+ private final RecipeCategory defaultRecipeCategory;
+
+ /**
+ * Use {@link RecipeMapBuilder} to instantiate.
+ */
+ RecipeMap(String unlocalizedName, B backend, RecipeMapFrontend frontend) {
+ this.unlocalizedName = unlocalizedName;
+ this.backend = backend;
+ this.frontend = frontend;
+ this.defaultRecipeCategory = new RecipeCategory(this);
+ backend.setRecipeMap(this);
+ if (ALL_RECIPE_MAPS.containsKey(unlocalizedName)) {
+ throw new IllegalArgumentException(
+ "Cannot register recipemap with duplicated unlocalized name: " + unlocalizedName);
+ }
+ ALL_RECIPE_MAPS.put(unlocalizedName, this);
+ }
+
+ public B getBackend() {
+ return backend;
+ }
+
+ public RecipeMapFrontend getFrontend() {
+ return frontend;
+ }
+
+ /**
+ * @return All the recipes belonging to this recipemap.
+ */
+ @Unmodifiable
+ public Collection<GT_Recipe> getAllRecipes() {
+ return backend.getAllRecipes();
+ }
+
+ /**
+ * @return List of registered recipe categories associated with this recipemap.
+ */
+ public List<RecipeCategory> getAssociatedCategories() {
+ return RecipeCategory.ALL_RECIPE_CATEGORIES.values()
+ .stream()
+ .filter(category -> category.recipeMap == this)
+ .collect(Collectors.toList());
+ }
+
+ public RecipeCategory getDefaultRecipeCategory() {
+ return defaultRecipeCategory;
+ }
+
+ /**
+ * @return Amperage of this recipemap. Note that recipes store EU/t with amperage included,
+ * e.g. Arc Furnace recipe with 90 EU/t means 30 EU/t (LV) with 3 amperage.
+ */
+ public int getAmperage() {
+ return frontend.getUIProperties().amperage;
+ }
+
+ @Override
+ public void addDownstream(IRecipeMap downstream) {
+ backend.addDownstream(downstream);
+ }
+
+ // region add recipe
+
+ @Nullable
+ public GT_Recipe addRecipe(boolean aOptimize, @Nullable ItemStack[] aInputs, @Nullable ItemStack[] aOutputs,
+ @Nullable Object aSpecial, @Nullable int[] aOutputChances, @Nullable FluidStack[] aFluidInputs,
+ @Nullable FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue) {
+ return addRecipe(
+ new GT_Recipe(
+ aOptimize,
+ aInputs,
+ aOutputs,
+ aSpecial,
+ aOutputChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUt,
+ aSpecialValue));
+ }
+
+ @Nullable
+ public GT_Recipe addRecipe(@Nullable int[] aOutputChances, @Nullable FluidStack[] aFluidInputs,
+ @Nullable FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue) {
+ return addRecipe(
+ new GT_Recipe(
+ false,
+ null,
+ null,
+ null,
+ aOutputChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUt,
+ aSpecialValue),
+ false,
+ false,
+ false);
+ }
+
+ @Nullable
+ public GT_Recipe addRecipe(boolean aOptimize, @Nullable ItemStack[] aInputs, @Nullable ItemStack[] aOutputs,
+ @Nullable Object aSpecial, @Nullable FluidStack[] aFluidInputs, @Nullable FluidStack[] aFluidOutputs,
+ int aDuration, int aEUt, int aSpecialValue) {
+ return addRecipe(
+ new GT_Recipe(
+ aOptimize,
+ aInputs,
+ aOutputs,
+ aSpecial,
+ null,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUt,
+ aSpecialValue));
+ }
+
+ @Nullable
+ public GT_Recipe addRecipe(GT_Recipe aRecipe) {
+ return addRecipe(aRecipe, true, false, false);
+ }
+
+ @Nullable
+ public GT_Recipe addRecipe(GT_Recipe aRecipe, boolean aCheckForCollisions, boolean aFakeRecipe, boolean aHidden) {
+ aRecipe.mHidden = aHidden;
+ aRecipe.mFakeRecipe = aFakeRecipe;
+ if (aRecipe.mFluidInputs.length < backend.properties.minFluidInputs
+ && aRecipe.mInputs.length < backend.properties.minItemInputs) return null;
+ if (aCheckForCollisions && backend.checkCollision(aRecipe)) return null;
+ return backend.compileRecipe(aRecipe);
+ }
+
+ /**
+ * Only used for fake Recipe Handlers to show something in NEI, do not use this for adding actual Recipes!
+ * findRecipe won't find fake Recipes, containsInput WILL find fake Recipes
+ */
+ @Nullable
+ public GT_Recipe addFakeRecipe(boolean aCheckForCollisions, @Nullable ItemStack[] aInputs,
+ @Nullable ItemStack[] aOutputs, @Nullable Object aSpecial, @Nullable int[] aOutputChances,
+ @Nullable FluidStack[] aFluidInputs, @Nullable FluidStack[] aFluidOutputs, int aDuration, int aEUt,
+ int aSpecialValue) {
+ return addFakeRecipe(
+ aCheckForCollisions,
+ new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ aSpecial,
+ aOutputChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUt,
+ aSpecialValue));
+ }
+
+ /**
+ * Only used for fake Recipe Handlers to show something in NEI, do not use this for adding actual Recipes!
+ * findRecipe won't find fake Recipes, containsInput WILL find fake Recipes
+ */
+ @Nullable
+ public GT_Recipe addFakeRecipe(boolean aCheckForCollisions, @Nullable ItemStack[] aInputs,
+ @Nullable ItemStack[] aOutputs, @Nullable Object aSpecial, @Nullable FluidStack[] aFluidInputs,
+ @Nullable FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue) {
+ return addFakeRecipe(
+ aCheckForCollisions,
+ new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ aSpecial,
+ null,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUt,
+ aSpecialValue));
+ }
+
+ @Nullable
+ public GT_Recipe addFakeRecipe(boolean aCheckForCollisions, @Nullable ItemStack[] aInputs,
+ @Nullable ItemStack[] aOutputs, @Nullable Object aSpecial, @Nullable FluidStack[] aFluidInputs,
+ @Nullable FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue, boolean hidden) {
+ return addFakeRecipe(
+ aCheckForCollisions,
+ new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ aSpecial,
+ null,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUt,
+ aSpecialValue),
+ hidden);
+ }
+
+ @Nullable
+ public GT_Recipe addFakeRecipe(boolean aCheckForCollisions, @Nullable ItemStack[] aInputs,
+ @Nullable ItemStack[] aOutputs, @Nullable Object aSpecial, @Nullable FluidStack[] aFluidInputs,
+ @Nullable FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue, ItemStack[][] aAlt,
+ boolean hidden) {
+ return addFakeRecipe(
+ aCheckForCollisions,
+ new GT_Recipe.GT_Recipe_WithAlt(
+ false,
+ aInputs,
+ aOutputs,
+ aSpecial,
+ null,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUt,
+ aSpecialValue,
+ aAlt),
+ hidden);
+ }
+
+ /**
+ * Only used for fake Recipe Handlers to show something in NEI, do not use this for adding actual Recipes!
+ * findRecipe won't find fake Recipes, containsInput WILL find fake Recipes
+ */
+ @Nullable
+ public GT_Recipe addFakeRecipe(boolean aCheckForCollisions, GT_Recipe aRecipe) {
+ return addRecipe(aRecipe, aCheckForCollisions, true, false);
+ }
+
+ @Nullable
+ public GT_Recipe addFakeRecipe(boolean aCheckForCollisions, GT_Recipe aRecipe, boolean hidden) {
+ return addRecipe(aRecipe, aCheckForCollisions, true, hidden);
+ }
+
+ @Nonnull
+ @Override
+ public Collection<GT_Recipe> doAdd(GT_RecipeBuilder builder) {
+ return backend.doAdd(builder);
+ }
+
+ public GT_Recipe add(GT_Recipe aRecipe) {
+ return backend.compileRecipe(aRecipe);
+ }
+
+ // endregion
+
+ /**
+ * @return if this Item is a valid Input for any for the Recipes
+ */
+ public boolean containsInput(@Nullable ItemStack aStack) {
+ return aStack != null && backend.containsInput(aStack);
+ }
+
+ /**
+ * @return if this Fluid is a valid Input for any for the Recipes
+ */
+ public boolean containsInput(@Nullable FluidStack aFluid) {
+ return aFluid != null && containsInput(aFluid.getFluid());
+ }
+
+ /**
+ * @return if this Fluid is a valid Input for any for the Recipes
+ */
+ public boolean containsInput(@Nullable Fluid aFluid) {
+ return aFluid != null && backend.containsInput(aFluid);
+ }
+
+ // region find recipe
+
+ /**
+ * @return Entrypoint for fluent API for finding recipe.
+ */
+ public FindRecipeQuery findRecipeQuery() {
+ return new FindRecipeQuery(this);
+ }
+
+ @Nullable
+ public GT_Recipe findRecipe(@Nullable IHasWorldObjectAndCoords aTileEntity, boolean aNotUnificated, long aVoltage,
+ @Nullable FluidStack[] aFluids, @Nullable ItemStack... aInputs) {
+ return findRecipe(aTileEntity, null, aNotUnificated, aVoltage, aFluids, null, aInputs);
+ }
+
+ @Nullable
+ public GT_Recipe findRecipe(@Nullable IHasWorldObjectAndCoords aTileEntity, boolean aNotUnificated,
+ boolean aDontCheckStackSizes, long aVoltage, @Nullable FluidStack[] aFluids, @Nullable ItemStack... aInputs) {
+ return findRecipe(aTileEntity, null, aNotUnificated, aDontCheckStackSizes, aVoltage, aFluids, null, aInputs);
+ }
+
+ @Nullable
+ public GT_Recipe findRecipe(@Nullable IHasWorldObjectAndCoords aTileEntity, @Nullable GT_Recipe aRecipe,
+ boolean aNotUnificated, long aVoltage, @Nullable FluidStack[] aFluids, @Nullable ItemStack aSpecialSlot,
+ @Nullable ItemStack... aInputs) {
+ return findRecipe(aTileEntity, aRecipe, aNotUnificated, false, aVoltage, aFluids, aSpecialSlot, aInputs);
+ }
+
+ @Nullable
+ public GT_Recipe findRecipe(@Nullable IHasWorldObjectAndCoords aTileEntity, @Nullable GT_Recipe aRecipe,
+ boolean aNotUnificated, boolean aDontCheckStackSizes, long aVoltage, @Nullable FluidStack[] aFluids,
+ @Nullable ItemStack aSpecialSlot, @Nullable ItemStack... aInputs) {
+ return findRecipeQuery().items(aInputs != null ? aInputs : new ItemStack[0])
+ .fluids(aFluids != null ? aFluids : new FluidStack[0])
+ .specialSlot(aSpecialSlot)
+ .voltage(aVoltage)
+ .cachedRecipe(aRecipe)
+ .notUnificated(aNotUnificated)
+ .dontCheckStackSizes(aDontCheckStackSizes)
+ .find();
+ }
+
+ // endregion
+
+ @Override
+ public String toString() {
+ return "RecipeMap{" + "unlocalizedName='"
+ + unlocalizedName
+ + '\''
+ + ", ownerMod="
+ + defaultRecipeCategory.ownerMod.getModId()
+ + '}';
+ }
+
+ private static final Pattern LEGACY_IDENTIFIER_PATTERN = Pattern.compile("(.+)_[0-9]+_[0-9]+_[0-9]+_[0-9]+_[0-9]+");
+
+ /**
+ * Gets recipemap instance from old mUniqueIdentifier format. This is only for backward compat, where tiles
+ * saved recipemap with mUniqueIdentifier.
+ *
+ * @param legacyIdentifier mUniqueIdentifier, in %s_%d_%d_%d_%d_%d format
+ * @return Found recipemap, can be null
+ */
+ @Nullable
+ public static RecipeMap<?> getFromOldIdentifier(String legacyIdentifier) {
+ Matcher matcher = LEGACY_IDENTIFIER_PATTERN.matcher(legacyIdentifier);
+ if (!matcher.find()) {
+ // It can be new format
+ return ALL_RECIPE_MAPS.get(legacyIdentifier);
+ }
+ return ALL_RECIPE_MAPS.get(matcher.group(1));
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/RecipeMapBackend.java b/src/main/java/gregtech/api/recipe/RecipeMapBackend.java
new file mode 100644
index 0000000000..a539067e93
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/RecipeMapBackend.java
@@ -0,0 +1,469 @@
+package gregtech.api.recipe;
+
+import static gregtech.api.util.GT_RecipeBuilder.handleInvalidRecipe;
+import static gregtech.api.util.GT_RecipeBuilder.handleRecipeCollision;
+import static gregtech.api.util.GT_Utility.areStacksEqualOrNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.Unmodifiable;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.SetMultimap;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IRecipeMap;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_StreamUtil;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Responsible for recipe addition / search for recipemap.
+ * <p>
+ * In order to bind custom backend to recipemap, use {@link RecipeMapBuilder#of(String, BackendCreator)}.
+ */
+@SuppressWarnings("unused")
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class RecipeMapBackend {
+
+ private RecipeMap<?> recipeMap;
+
+ /**
+ * Recipe index based on items.
+ */
+ private final SetMultimap<GT_ItemStack, GT_Recipe> itemIndex = HashMultimap.create();
+ /**
+ * Recipe index based on fluids.
+ */
+ private final SetMultimap<String, GT_Recipe> fluidIndex = HashMultimap.create();
+
+ /**
+ * All the recipes belonging to this backend, indexed by recipe category.
+ */
+ private final Map<RecipeCategory, Collection<GT_Recipe>> recipesByCategory = new HashMap<>();
+
+ /**
+ * List of recipemaps that also receive recipe addition from this backend.
+ */
+ private final List<IRecipeMap> downstreams = new ArrayList<>(0);
+
+ /**
+ * All the properties specific to this backend.
+ */
+ protected final RecipeMapBackendProperties properties;
+
+ public RecipeMapBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ this.properties = propertiesBuilder.build();
+ GregTech_API.itemStackMultiMaps.add(itemIndex);
+ }
+
+ void setRecipeMap(RecipeMap<?> recipeMap) {
+ this.recipeMap = recipeMap;
+ }
+
+ /**
+ * @return Properties specific to this backend.
+ */
+ public RecipeMapBackendProperties getProperties() {
+ return properties;
+ }
+
+ /**
+ * @return All the recipes belonging to this backend. Returned collection is immutable,
+ * use {@link #compileRecipe} to add / {@link #removeRecipes} to remove.
+ */
+ @Unmodifiable
+ public Collection<GT_Recipe> getAllRecipes() {
+ return Collections.unmodifiableCollection(allRecipes());
+ }
+
+ /**
+ * @return Raw recipe list
+ */
+ private Collection<GT_Recipe> allRecipes() {
+ return recipesByCategory.values()
+ .stream()
+ .flatMap(Collection::stream)
+ .collect(Collectors.toCollection(ArrayList::new));
+ }
+
+ /**
+ * @return All the recipes belonging to this backend, indexed by recipe category.
+ */
+ @Unmodifiable
+ public Collection<GT_Recipe> getRecipesByCategory(RecipeCategory recipeCategory) {
+ return Collections
+ .unmodifiableCollection(recipesByCategory.getOrDefault(recipeCategory, Collections.emptyList()));
+ }
+
+ @Unmodifiable
+ public Map<RecipeCategory, Collection<GT_Recipe>> getRecipeCategoryMap() {
+ return Collections.unmodifiableMap(recipesByCategory);
+ }
+
+ // region add recipe
+
+ /**
+ * Adds the supplied recipe to the recipe list and index, without any check.
+ *
+ * @return Supplied recipe.
+ */
+ public GT_Recipe compileRecipe(GT_Recipe recipe) {
+ if (recipe.getRecipeCategory() == null) {
+ recipe.setRecipeCategory(recipeMap.getDefaultRecipeCategory());
+ }
+ recipesByCategory.computeIfAbsent(recipe.getRecipeCategory(), v -> new ArrayList<>())
+ .add(recipe);
+ for (FluidStack fluid : recipe.mFluidInputs) {
+ if (fluid == null) continue;
+ fluidIndex.put(
+ fluid.getFluid()
+ .getName(),
+ recipe);
+ }
+ return addToItemMap(recipe);
+ }
+
+ /**
+ * Adds the supplied recipe to the item cache.
+ */
+ protected GT_Recipe addToItemMap(GT_Recipe recipe) {
+ for (ItemStack item : recipe.mInputs) {
+ if (item == null) continue;
+ itemIndex.put(new GT_ItemStack(item), recipe);
+ }
+ if (recipe instanceof GT_Recipe.GT_Recipe_WithAlt recipeWithAlt) {
+ for (ItemStack[] itemStacks : recipeWithAlt.mOreDictAlt) {
+ if (itemStacks == null) continue;
+ for (ItemStack item : itemStacks) {
+ if (item == null) continue;
+ itemIndex.put(new GT_ItemStack(item), recipe);
+ }
+ }
+ }
+ return recipe;
+ }
+
+ /**
+ * Builds recipe from supplied recipe builder and adds it.
+ */
+ protected Collection<GT_Recipe> doAdd(GT_RecipeBuilder builder) {
+ Iterable<? extends GT_Recipe> recipes = properties.recipeEmitter.apply(builder);
+ Collection<GT_Recipe> ret = new ArrayList<>();
+ for (GT_Recipe recipe : recipes) {
+ if (properties.recipeConfigCategory != null) {
+ assert properties.recipeConfigKeyConvertor != null;
+ String configKey = properties.recipeConfigKeyConvertor.apply(recipe);
+ if (configKey != null && recipe.mDuration <= 0) {
+ continue;
+ }
+ }
+ if (recipe.mFluidInputs.length < properties.minFluidInputs
+ || recipe.mInputs.length < properties.minItemInputs) {
+ return Collections.emptyList();
+ }
+ if (properties.recipeTransformer != null) {
+ recipe = properties.recipeTransformer.apply(recipe);
+ }
+ if (recipe == null) continue;
+ if (builder.isCheckForCollision() && checkCollision(recipe)) {
+ handleCollision(recipe);
+ continue;
+ }
+ if (recipe.getRecipeCategory() != null && recipe.getRecipeCategory().recipeMap != this.recipeMap) {
+ handleInvalidRecipe();
+ continue;
+ }
+ ret.add(compileRecipe(recipe));
+ }
+ if (!ret.isEmpty()) {
+ builder.clearInvalid();
+ for (IRecipeMap downstream : downstreams) {
+ downstream.doAdd(builder);
+ }
+ }
+ return ret;
+ }
+
+ private void handleCollision(GT_Recipe recipe) {
+ StringBuilder errorInfo = new StringBuilder();
+ boolean hasAnEntry = false;
+ for (FluidStack fluid : recipe.mFluidInputs) {
+ if (fluid == null) {
+ continue;
+ }
+ String s = fluid.getLocalizedName();
+ if (s == null) {
+ continue;
+ }
+ if (hasAnEntry) {
+ errorInfo.append("+")
+ .append(s);
+ } else {
+ errorInfo.append(s);
+ }
+ hasAnEntry = true;
+ }
+ for (ItemStack item : recipe.mInputs) {
+ if (item == null) {
+ continue;
+ }
+ String itemName = item.getDisplayName();
+ if (hasAnEntry) {
+ errorInfo.append("+")
+ .append(itemName);
+ } else {
+ errorInfo.append(itemName);
+ }
+ hasAnEntry = true;
+ }
+ handleRecipeCollision(errorInfo.toString());
+ }
+
+ void addDownstream(IRecipeMap downstream) {
+ downstreams.add(downstream);
+ }
+
+ /**
+ * Removes supplied recipes from recipe list. Do not use unless absolute necessity!
+ */
+ public void removeRecipes(Collection<? extends GT_Recipe> recipesToRemove) {
+ for (Collection<GT_Recipe> recipes : recipesByCategory.values()) {
+ recipes.removeAll(recipesToRemove);
+ }
+ for (GT_ItemStack key : new HashMap<>(itemIndex.asMap()).keySet()) {
+ itemIndex.get(key)
+ .removeAll(recipesToRemove);
+ }
+ for (String key : new HashMap<>(fluidIndex.asMap()).keySet()) {
+ fluidIndex.get(key)
+ .removeAll(recipesToRemove);
+ }
+ }
+
+ /**
+ * Removes supplied recipe from recipe list. Do not use unless absolute necessity!
+ */
+ public void removeRecipe(GT_Recipe recipe) {
+ removeRecipes(Collections.singleton(recipe));
+ }
+
+ /**
+ * If you want to shoot your foot...
+ */
+ public void clearRecipes() {
+ recipesByCategory.clear();
+ }
+
+ // endregion
+
+ /**
+ * Re-unificates all the items present in recipes. Also reflects recipe removals.
+ */
+ public void reInit() {
+ itemIndex.clear();
+ for (GT_Recipe recipe : allRecipes()) {
+ GT_OreDictUnificator.setStackArray(true, recipe.mInputs);
+ GT_OreDictUnificator.setStackArray(true, recipe.mOutputs);
+ addToItemMap(recipe);
+ }
+ }
+
+ /**
+ * @return If supplied item is a valid input for any of the recipes
+ */
+ public boolean containsInput(ItemStack item) {
+ return itemIndex.containsKey(new GT_ItemStack(item)) || itemIndex.containsKey(new GT_ItemStack(item, true));
+ }
+
+ /**
+ * @return If supplied fluid is a valid input for any of the recipes
+ */
+ public boolean containsInput(Fluid fluid) {
+ return fluidIndex.containsKey(fluid.getName());
+ }
+
+ // region find recipe
+
+ /**
+ * Checks if given recipe conflicts with already registered recipes.
+ *
+ * @return True if collision is found.
+ */
+ boolean checkCollision(GT_Recipe recipe) {
+ return matchRecipeStream(recipe.mInputs, recipe.mFluidInputs, null, null, false, true, true).findAny()
+ .isPresent();
+ }
+
+ /**
+ * Overwrites {@link #matchRecipeStream} method. Also override {@link #doesOverwriteFindRecipe} to make it work.
+ */
+ @Nullable
+ protected GT_Recipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot,
+ @Nullable GT_Recipe cachedRecipe) {
+ return null;
+ }
+
+ /**
+ * @return Whether to use {@link #overwriteFindRecipe} for finding recipe.
+ */
+ protected boolean doesOverwriteFindRecipe() {
+ return false;
+ }
+
+ /**
+ * Modifies successfully found recipe. Make sure not to mutate the found recipe but use copy!
+ */
+ @Nullable
+ protected GT_Recipe modifyFoundRecipe(GT_Recipe recipe, ItemStack[] items, FluidStack[] fluids,
+ @Nullable ItemStack specialSlot) {
+ return recipe;
+ }
+
+ /**
+ * Called when {@link #matchRecipeStream} cannot find recipe.
+ */
+ @Nullable
+ protected GT_Recipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) {
+ return null;
+ }
+
+ /**
+ * Returns all the matched recipes in the form of Stream, without any additional check for matches.
+ *
+ * @param rawItems Item inputs.
+ * @param fluids Fluid inputs.
+ * @param specialSlot Content of the special slot. Normal recipemaps don't need this, but some do.
+ * Set {@link RecipeMapBuilder#specialSlotSensitive} to make it actually functional.
+ * Alternatively overriding {@link #filterFindRecipe} will also work.
+ * @param cachedRecipe If this is not null, this method tests it before all other recipes.
+ * @param notUnificated If this is set to true, item inputs will be unificated.
+ * @param dontCheckStackSizes If this is set to true, this method won't check item count and fluid amount
+ * for the matched recipe.
+ * @param forCollisionCheck If this method is called to check collision with already registered recipes.
+ * @return Stream of matches recipes.
+ */
+ Stream<GT_Recipe> matchRecipeStream(ItemStack[] rawItems, FluidStack[] fluids, @Nullable ItemStack specialSlot,
+ @Nullable GT_Recipe cachedRecipe, boolean notUnificated, boolean dontCheckStackSizes,
+ boolean forCollisionCheck) {
+ if (doesOverwriteFindRecipe()) {
+ return GT_StreamUtil.ofNullable(overwriteFindRecipe(rawItems, fluids, specialSlot, cachedRecipe));
+ }
+
+ if (recipesByCategory.isEmpty()) {
+ return Stream.empty();
+ }
+
+ // Some recipe classes require a certain amount of inputs of certain kinds. Like "at least 1 fluid + 1 item"
+ // or "at least 2 items" before they start searching for recipes.
+ // This improves performance massively, especially when people leave things like programmed circuits,
+ // molds or shapes in their machines.
+ // For checking collision, we assume min inputs check already has been passed as of building the recipe.
+ if (!forCollisionCheck) {
+ if (properties.minFluidInputs > 0) {
+ int count = 0;
+ for (FluidStack fluid : fluids) if (fluid != null) count++;
+ if (count < properties.minFluidInputs) {
+ return Stream.empty();
+ }
+ }
+ if (properties.minItemInputs > 0) {
+ int count = 0;
+ for (ItemStack item : rawItems) if (item != null) count++;
+ if (count < properties.minItemInputs) {
+ return Stream.empty();
+ }
+ }
+ }
+
+ ItemStack[] items;
+ // Unification happens here in case the item input isn't already unificated.
+ if (notUnificated) {
+ items = GT_OreDictUnificator.getStackArray(true, (Object[]) rawItems);
+ } else {
+ items = rawItems;
+ }
+
+ return Stream.<Stream<GT_Recipe>>of(
+ // Check the recipe which has been used last time in order to not have to search for it again, if possible.
+ GT_StreamUtil.ofNullable(cachedRecipe)
+ .filter(recipe -> recipe.mCanBeBuffered)
+ .filter(recipe -> filterFindRecipe(recipe, items, fluids, specialSlot, dontCheckStackSizes))
+ .map(recipe -> modifyFoundRecipe(recipe, items, fluids, specialSlot))
+ .filter(Objects::nonNull),
+ // Now look for the recipes inside the item index, but only when the recipes actually can have items inputs.
+ GT_StreamUtil.ofConditional(!itemIndex.isEmpty(), items)
+ .filter(Objects::nonNull)
+ .flatMap(item -> Stream.of(new GT_ItemStack(item), new GT_ItemStack(item, true)))
+ .map(itemIndex::get)
+ .flatMap(Collection::stream)
+ .filter(recipe -> filterFindRecipe(recipe, items, fluids, specialSlot, dontCheckStackSizes))
+ .map(recipe -> modifyFoundRecipe(recipe, items, fluids, specialSlot))
+ .filter(Objects::nonNull),
+ // If the minimum amount of items required for the recipes is 0, then it could match to fluid-only recipes,
+ // so check fluid index too.
+ GT_StreamUtil.ofConditional(properties.minItemInputs == 0, fluids)
+ .filter(Objects::nonNull)
+ .map(
+ fluidStack -> fluidIndex.get(
+ fluidStack.getFluid()
+ .getName()))
+ .flatMap(Collection::stream)
+ .filter(recipe -> filterFindRecipe(recipe, items, fluids, specialSlot, dontCheckStackSizes))
+ .map(recipe -> modifyFoundRecipe(recipe, items, fluids, specialSlot))
+ .filter(Objects::nonNull),
+ // Lastly, find fallback.
+ forCollisionCheck ? Stream.empty()
+ : GT_StreamUtil.ofSupplier(() -> findFallback(items, fluids, specialSlot))
+ .filter(Objects::nonNull))
+ .flatMap(Function.identity());
+ }
+
+ /**
+ * The minimum filter required for recipe match logic. You can override this to have custom validation.
+ * <p>
+ * Other checks like machine voltage will be done in another places.
+ * <p>
+ * Note that this won't be called if {@link #doesOverwriteFindRecipe} is true.
+ */
+ protected boolean filterFindRecipe(GT_Recipe recipe, ItemStack[] items, FluidStack[] fluids,
+ @Nullable ItemStack specialSlot, boolean dontCheckStackSizes) {
+ if (recipe.mEnabled && !recipe.mFakeRecipe
+ && recipe.isRecipeInputEqual(false, dontCheckStackSizes, fluids, items)) {
+ return !properties.specialSlotSensitive
+ || areStacksEqualOrNull((ItemStack) recipe.mSpecialItems, specialSlot);
+ }
+ return false;
+ }
+
+ // endregion
+
+ @FunctionalInterface
+ public interface BackendCreator<B extends RecipeMapBackend> {
+
+ /**
+ * @see RecipeMapBackend#RecipeMapBackend
+ */
+ B create(RecipeMapBackendPropertiesBuilder propertiesBuilder);
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/RecipeMapBackendProperties.java b/src/main/java/gregtech/api/recipe/RecipeMapBackendProperties.java
new file mode 100644
index 0000000000..7262b794ab
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/RecipeMapBackendProperties.java
@@ -0,0 +1,77 @@
+package gregtech.api.recipe;
+
+import java.util.function.Function;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.api.util.FieldsAreNonnullByDefault;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Data object to store properties used for {@link RecipeMapBackend}. Use {@link #builder()} for creation.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+@FieldsAreNonnullByDefault
+public final class RecipeMapBackendProperties {
+
+ static RecipeMapBackendPropertiesBuilder builder() {
+ return new RecipeMapBackendPropertiesBuilder();
+ }
+
+ /**
+ * Minimum amount of item inputs required for the recipes.
+ */
+ public final int minItemInputs;
+ /**
+ * Minimum amount of fluid inputs required for the recipes.
+ */
+ public final int minFluidInputs;
+
+ /**
+ * Whether this backend should check for equality of special slot when searching recipe.
+ */
+ public final boolean specialSlotSensitive;
+
+ /**
+ * If recipe builder should stop optimizing inputs.
+ */
+ public final boolean disableOptimize;
+
+ /**
+ * Changes how recipes are emitted by a particular recipe builder.
+ */
+ public final Function<? super GT_RecipeBuilder, ? extends Iterable<? extends GT_Recipe>> recipeEmitter;
+
+ /**
+ * Runs a custom hook on all recipes added <b>via builder</b>.
+ */
+ @Nullable
+ public final Function<? super GT_Recipe, ? extends GT_Recipe> recipeTransformer;
+
+ @Nullable
+ public final String recipeConfigCategory;
+ @Nullable
+ public final Function<? super GT_Recipe, String> recipeConfigKeyConvertor;
+
+ RecipeMapBackendProperties(int minItemInputs, int minFluidInputs, boolean specialSlotSensitive,
+ boolean disableOptimize,
+ Function<? super GT_RecipeBuilder, ? extends Iterable<? extends GT_Recipe>> recipeEmitter,
+ @Nullable Function<? super GT_Recipe, ? extends GT_Recipe> recipeTransformer,
+ @Nullable String recipeConfigCategory, @Nullable Function<? super GT_Recipe, String> recipeConfigKeyConvertor) {
+ if (minItemInputs < 0 || minFluidInputs < 0) {
+ throw new IllegalArgumentException("minItemInputs and minFluidInputs cannot be negative");
+ }
+ this.minItemInputs = minItemInputs;
+ this.minFluidInputs = minFluidInputs;
+ this.specialSlotSensitive = specialSlotSensitive;
+ this.disableOptimize = disableOptimize;
+ this.recipeEmitter = recipeEmitter;
+ this.recipeTransformer = recipeTransformer;
+ this.recipeConfigCategory = recipeConfigCategory;
+ this.recipeConfigKeyConvertor = recipeConfigKeyConvertor;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/RecipeMapBackendPropertiesBuilder.java b/src/main/java/gregtech/api/recipe/RecipeMapBackendPropertiesBuilder.java
new file mode 100644
index 0000000000..933ea1b06b
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/RecipeMapBackendPropertiesBuilder.java
@@ -0,0 +1,119 @@
+package gregtech.api.recipe;
+
+import static gregtech.api.util.GT_RecipeMapUtil.buildOrEmpty;
+
+import java.util.function.Function;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.google.common.collect.Iterables;
+
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Builder class for {@link RecipeMapBackendProperties}.
+ */
+@SuppressWarnings({ "unused", "UnusedReturnValue" })
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public final class RecipeMapBackendPropertiesBuilder {
+
+ private int minItemInputs;
+ private int minFluidInputs;
+
+ private boolean specialSlotSensitive;
+
+ private boolean disableOptimize;
+
+ private Function<? super GT_RecipeBuilder, ? extends Iterable<? extends GT_Recipe>> recipeEmitter = this::defaultBuildRecipe;
+
+ @Nullable
+ private Function<? super GT_Recipe, ? extends GT_Recipe> recipeTransformer;
+
+ @Nullable
+ private String recipeConfigCategory;
+ @Nullable
+ private Function<? super GT_Recipe, String> recipeConfigKeyConvertor;
+
+ RecipeMapBackendPropertiesBuilder() {}
+
+ RecipeMapBackendProperties build() {
+ return new RecipeMapBackendProperties(
+ minItemInputs,
+ minFluidInputs,
+ specialSlotSensitive,
+ disableOptimize,
+ recipeEmitter,
+ recipeTransformer,
+ recipeConfigCategory,
+ recipeConfigKeyConvertor);
+ }
+
+ public RecipeMapBackendPropertiesBuilder minItemInputs(int minItemInputs) {
+ this.minItemInputs = minItemInputs;
+ return this;
+ }
+
+ public RecipeMapBackendPropertiesBuilder minFluidInputs(int minFluidInputs) {
+ this.minFluidInputs = minFluidInputs;
+ return this;
+ }
+
+ public RecipeMapBackendPropertiesBuilder specialSlotSensitive() {
+ this.specialSlotSensitive = true;
+ return this;
+ }
+
+ public RecipeMapBackendPropertiesBuilder disableOptimize() {
+ this.disableOptimize = true;
+ return this;
+ }
+
+ public RecipeMapBackendPropertiesBuilder recipeEmitter(
+ Function<? super GT_RecipeBuilder, ? extends Iterable<? extends GT_Recipe>> recipeEmitter) {
+ this.recipeEmitter = recipeEmitter;
+ return this;
+ }
+
+ public RecipeMapBackendPropertiesBuilder combineRecipeEmitter(
+ Function<? super GT_RecipeBuilder, ? extends Iterable<? extends GT_Recipe>> func) {
+ // move recipeEmitter to local variable, so lambda capture the function itself instead of this
+ Function<? super GT_RecipeBuilder, ? extends Iterable<? extends GT_Recipe>> cur = this.recipeEmitter;
+ return recipeEmitter(b -> Iterables.concat(cur.apply(b), func.apply(b)));
+ }
+
+ public RecipeMapBackendPropertiesBuilder recipeTransformer(
+ Function<? super GT_Recipe, ? extends GT_Recipe> recipeTransformer) {
+ this.recipeTransformer = recipeTransformer;
+ return this;
+ }
+
+ public RecipeMapBackendPropertiesBuilder chainRecipeTransformer(
+ Function<? super GT_Recipe, ? extends GT_Recipe> func) {
+ this.recipeTransformer = this.recipeTransformer == null ? func : this.recipeTransformer.andThen(func);
+ return this;
+ }
+
+ public RecipeMapBackendPropertiesBuilder recipeConfigFile(String category,
+ Function<? super GT_Recipe, String> keyConvertor) {
+ this.recipeConfigCategory = category;
+ this.recipeConfigKeyConvertor = keyConvertor;
+ return this;
+ }
+
+ private Iterable<? extends GT_Recipe> defaultBuildRecipe(GT_RecipeBuilder builder) {
+ // TODO sensible validation
+ GT_RecipeBuilder b = builder;
+ if (disableOptimize && builder.isOptimize()) {
+ b = copy(builder, b).noOptimize();
+ }
+ return buildOrEmpty(b);
+ }
+
+ private static GT_RecipeBuilder copy(GT_RecipeBuilder original, GT_RecipeBuilder b) {
+ return b == original ? b.copy() : b;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/RecipeMapBuilder.java b/src/main/java/gregtech/api/recipe/RecipeMapBuilder.java
new file mode 100644
index 0000000000..8659018934
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/RecipeMapBuilder.java
@@ -0,0 +1,522 @@
+package gregtech.api.recipe;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.awt.Rectangle;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.UnaryOperator;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.math.Size;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+
+import codechicken.nei.recipe.HandlerInfo;
+import gregtech.api.gui.modularui.FallbackableSteamTexture;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.SteamTexture;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.formatter.INEISpecialInfoFormatter;
+
+// spotless:off spotless likes formatting @code to &#64;code
+/**
+ * Builder class for constructing {@link RecipeMap}. Instantiate this class and call {@link #build}
+ * to retrieve RecipeMap. Smallest example:
+ *
+ * <pre>
+ * {@code
+ * RecipeMap<RecipeMapBackend> exampleRecipes = RecipeMapBuilder.of("example")
+ * .maxIO(9, 4, 1, 1)
+ * .build();
+ * }
+ * </pre>
+ *
+ * Note that {@link #maxIO} is required to build.
+ */
+// spotless:on
+@SuppressWarnings("unused")
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public final class RecipeMapBuilder<B extends RecipeMapBackend> {
+
+ private final String unlocalizedName;
+ private final RecipeMapBackendPropertiesBuilder backendPropertiesBuilder = RecipeMapBackendProperties.builder();
+ private final RecipeMapBackend.BackendCreator<B> backendCreator;
+ private final BasicUIPropertiesBuilder uiPropertiesBuilder;
+ private final NEIRecipePropertiesBuilder neiPropertiesBuilder = NEIRecipeProperties.builder();
+ private RecipeMapFrontend.FrontendCreator frontendCreator = RecipeMapFrontend::new;
+
+ /**
+ * Constructs builder object for {@link RecipeMap} with given backend logic. For custom frontend,
+ * call {@link #frontend} for the created builder object.
+ *
+ * @param unlocalizedName Unique identifier for the recipemap. This is also used as translation key
+ * for NEI recipe GUI header, so add localization for it if needed.
+ * @return New builder object.
+ */
+ public static <B extends RecipeMapBackend> RecipeMapBuilder<B> of(String unlocalizedName,
+ RecipeMapBackend.BackendCreator<B> backendCreator) {
+ return new RecipeMapBuilder<>(unlocalizedName, backendCreator);
+ }
+
+ /**
+ * Constructs builder object for {@link RecipeMap}.
+ *
+ * @param unlocalizedName Unique identifier for the recipemap. This is also used as translation key
+ * for NEI recipe GUI header, so add localization for it if needed.
+ * @return New builder object.
+ */
+ public static RecipeMapBuilder<RecipeMapBackend> of(String unlocalizedName) {
+ return new RecipeMapBuilder<>(unlocalizedName, RecipeMapBackend::new);
+ }
+
+ private RecipeMapBuilder(String unlocalizedName, RecipeMapBackend.BackendCreator<B> backendCreator) {
+ this.unlocalizedName = unlocalizedName;
+ this.backendCreator = backendCreator;
+ this.uiPropertiesBuilder = BasicUIProperties.builder()
+ .progressBarTexture(GT_UITextures.fallbackableProgressbar(unlocalizedName, GT_UITextures.PROGRESSBAR_ARROW))
+ .neiTransferRectId(unlocalizedName);
+ }
+
+ // region backend
+
+ /**
+ * Sets minimum amount of inputs required for the recipes.
+ */
+ public RecipeMapBuilder<B> minInputs(int minItemInputs, int minFluidInputs) {
+ backendPropertiesBuilder.minItemInputs(minItemInputs)
+ .minFluidInputs(minFluidInputs);
+ return this;
+ }
+
+ /**
+ * Whether this recipemap should check for equality of special slot when searching recipe.
+ */
+ public RecipeMapBuilder<B> specialSlotSensitive() {
+ backendPropertiesBuilder.specialSlotSensitive();
+ return this;
+ }
+
+ /**
+ * If recipe builder should stop optimizing inputs.
+ */
+ public RecipeMapBuilder<B> disableOptimize() {
+ backendPropertiesBuilder.disableOptimize();
+ return this;
+ }
+
+ /**
+ * Changes how recipes are emitted by a particular recipe builder. Can emit multiple recipe per builder.
+ */
+ public RecipeMapBuilder<B> recipeEmitter(
+ Function<? super GT_RecipeBuilder, ? extends Iterable<? extends GT_Recipe>> recipeEmitter) {
+ backendPropertiesBuilder.recipeEmitter(recipeEmitter);
+ return this;
+ }
+
+ /**
+ * Changes how recipes are emitted by a particular recipe builder. Should not return null.
+ * <p>
+ * Recipes added via one of the overloads of addRecipe will NOT be affected by this function.
+ */
+ public RecipeMapBuilder<B> recipeEmitterSingle(
+ Function<? super GT_RecipeBuilder, ? extends GT_Recipe> recipeEmitter) {
+ return recipeEmitter(recipeEmitter.andThen(Collections::singletonList));
+ }
+
+ /**
+ * Changes how recipes are emitted by a particular recipe builder. Can emit multiple recipe per builder.
+ * <p>
+ * Recipes added via one of the overloads of addRecipe will NOT be affected by this function.
+ * <p>
+ * Unlike {@link #recipeEmitter(Function)}, this one does not clear the existing recipe being emitted, if any
+ */
+ public RecipeMapBuilder<B> combineRecipeEmitter(
+ Function<? super GT_RecipeBuilder, ? extends Iterable<? extends GT_Recipe>> recipeEmitter) {
+ backendPropertiesBuilder.combineRecipeEmitter(recipeEmitter);
+ return this;
+ }
+
+ /**
+ * Changes how recipes are emitted by a particular recipe builder. Effectively add a new recipe per recipe added.
+ * func must not return null.
+ * <p>
+ * Recipes added via one of the overloads of addRecipe will NOT be affected by this function.
+ * <p>
+ * Unlike {@link #recipeEmitter(Function)}, this one does not clear the existing recipe being emitted, if any
+ */
+ public RecipeMapBuilder<B> combineRecipeEmitterSingle(
+ Function<? super GT_RecipeBuilder, ? extends GT_Recipe> recipeEmitter) {
+ return combineRecipeEmitter(recipeEmitter.andThen(Collections::singletonList));
+ }
+
+ /**
+ * Runs a custom hook on all recipes added <b>via builder</b>. For more complicated behavior,
+ * use {@link #recipeEmitter}.
+ * <p>
+ * Recipes added via one of the overloads of addRecipe will NOT be affected by this function.
+ */
+ public RecipeMapBuilder<B> recipeTransformer(Function<? super GT_Recipe, ? extends GT_Recipe> recipeTransformer) {
+ backendPropertiesBuilder.recipeTransformer(recipeTransformer);
+ return this;
+ }
+
+ /**
+ * Runs a custom hook on all recipes added <b>via builder</b>. For more complicated behavior,
+ * use {@link #recipeEmitter}.
+ * <p>
+ * Recipes added via one of the overloads of addRecipe will NOT be affected by this function.
+ */
+ public RecipeMapBuilder<B> recipeTransformer(Consumer<GT_Recipe> recipeTransformer) {
+ return recipeTransformer(withIdentityReturn(recipeTransformer));
+ }
+
+ /**
+ * Runs a custom hook on all recipes added <b>via builder</b>. For more complicated behavior,
+ * use {@link #recipeEmitter}.
+ * <p>
+ * Recipes added via one of the overloads of addRecipe will NOT be affected by this function.
+ * <p>
+ * Unlike {@link #recipeTransformer(Function)}, this one will not replace the existing special handler.
+ * The supplied function will be given the output of existing handler when a recipe is added.
+ */
+ public RecipeMapBuilder<B> chainRecipeTransformer(
+ Function<? super GT_Recipe, ? extends GT_Recipe> recipeTransformer) {
+ backendPropertiesBuilder.chainRecipeTransformer(recipeTransformer);
+ return this;
+ }
+
+ /**
+ * Runs a custom hook on all recipes added <b>via builder</b>. For more complicated behavior,
+ * use {@link #recipeEmitter}.
+ * <p>
+ * Recipes added via one of the overloads of addRecipe will NOT be affected by this function.
+ * <p>
+ * Unlike {@link #recipeTransformer(Function)}, this one will not replace the existing special handler.
+ * The supplied function will be given the output of existing handler when a recipe is added.
+ */
+ public RecipeMapBuilder<B> chainRecipeTransformer(Consumer<GT_Recipe> recipeTransformer) {
+ return chainRecipeTransformer(withIdentityReturn(recipeTransformer));
+ }
+
+ public RecipeMapBuilder<B> recipeConfigFile(String category, Function<? super GT_Recipe, String> keyConvertor) {
+ if (StringUtils.isBlank(category)) throw new IllegalArgumentException();
+ backendPropertiesBuilder.recipeConfigFile(category, keyConvertor);
+ return this;
+ }
+
+ // endregion
+
+ // region frontend UI properties
+
+ /**
+ * Sets how many item/fluid inputs/outputs does this recipemap usually has at most.
+ * It does not actually restrict the number of items that can be used in recipes.
+ */
+ public RecipeMapBuilder<B> maxIO(int maxItemInputs, int maxItemOutputs, int maxFluidInputs, int maxFluidOutputs) {
+ uiPropertiesBuilder.maxItemInputs(maxItemInputs)
+ .maxItemOutputs(maxItemOutputs)
+ .maxFluidInputs(maxFluidInputs)
+ .maxFluidOutputs(maxFluidOutputs);
+ return this;
+ }
+
+ /**
+ * Sets function to get overlay for slots.
+ */
+ public RecipeMapBuilder<B> slotOverlays(BasicUIProperties.SlotOverlayGetter<IDrawable> slotOverlays) {
+ uiPropertiesBuilder.slotOverlays(slotOverlays);
+ return this;
+ }
+
+ /**
+ * Sets function to get overlay for slots of steam machines.
+ */
+ public RecipeMapBuilder<B> slotOverlaysSteam(BasicUIProperties.SlotOverlayGetter<SteamTexture> slotOverlaysSteam) {
+ uiPropertiesBuilder.slotOverlaysSteam(slotOverlaysSteam);
+ return this;
+ }
+
+ /**
+ * Sets texture and animation direction of the progressbar.
+ * <p>
+ * Unless specified, size should be (20, 36), consisting of two parts;
+ * First is (20, 18) size of "empty" image at the top, Second is (20, 18) size of "filled" image at the bottom.
+ * <p>
+ * By default, it's set to {@code GT_UITextures.PROGRESSBAR_ARROW, ProgressBar.Direction.RIGHT}.
+ */
+ public RecipeMapBuilder<B> progressBar(UITexture texture, ProgressBar.Direction direction) {
+ return progressBarWithFallback(GT_UITextures.fallbackableProgressbar(unlocalizedName, texture), direction);
+ }
+
+ /**
+ * Sets progressbar texture with right direction.
+ * <p>
+ * Unless specified, size should be (20, 36), consisting of two parts;
+ * First is (20, 18) size of "empty" image at the top, Second is (20, 18) size of "filled" image at the bottom.
+ */
+ public RecipeMapBuilder<B> progressBar(UITexture texture) {
+ return progressBar(texture, ProgressBar.Direction.RIGHT);
+ }
+
+ /**
+ * Some resource packs want to use custom progress bar textures even for plain arrow. This method allows them to
+ * add unique textures, yet other packs don't need to make textures for every recipemap.
+ */
+ private RecipeMapBuilder<B> progressBarWithFallback(FallbackableUITexture texture,
+ ProgressBar.Direction direction) {
+ uiPropertiesBuilder.progressBarTexture(texture)
+ .progressBarDirection(direction);
+ return this;
+ }
+
+ /**
+ * Sets progressbar texture for steam machines.
+ * <p>
+ * Unless specified, size should be (20, 36), consisting of two parts;
+ * First is (20, 18) size of "empty" image at the top, Second is (20, 18) size of "filled" image at the bottom.
+ */
+ public RecipeMapBuilder<B> progressBarSteam(SteamTexture texture) {
+ return progressBarSteamWithFallback(
+ new FallbackableSteamTexture(
+ SteamTexture.fullImage(GregTech.ID, "gui/progressbar/" + unlocalizedName + "_%s"),
+ texture));
+ }
+
+ private RecipeMapBuilder<B> progressBarSteamWithFallback(FallbackableSteamTexture texture) {
+ uiPropertiesBuilder.progressBarTextureSteam(texture);
+ return this;
+ }
+
+ /**
+ * Sets size of the progressbar. (20, 36) by default.
+ */
+ public RecipeMapBuilder<B> progressBarSize(int x, int y) {
+ uiPropertiesBuilder.progressBarSize(new Size(x, y));
+ return this;
+ }
+
+ /**
+ * Sets position of the progressbar. (78, 24) by default.
+ */
+ public RecipeMapBuilder<B> progressBarPos(int x, int y) {
+ uiPropertiesBuilder.progressBarPos(new Pos2d(x, y));
+ return this;
+ }
+
+ /**
+ * Stops adding progressbar to the UI.
+ */
+ public RecipeMapBuilder<B> dontUseProgressBar() {
+ uiPropertiesBuilder.useProgressBar(false);
+ return this;
+ }
+
+ /**
+ * Configures this recipemap to use special slot. This means special slot shows up on NEI and tooltip for
+ * special slot on basic machine GUI indicates it has actual usage.
+ */
+ public RecipeMapBuilder<B> useSpecialSlot() {
+ uiPropertiesBuilder.useSpecialSlot(true);
+ return this;
+ }
+
+ /**
+ * Adds GUI area where clicking shows up all the recipes available.
+ *
+ * @see codechicken.nei.recipe.TemplateRecipeHandler.RecipeTransferRect
+ */
+ public RecipeMapBuilder<B> neiTransferRect(int x, int y, int width, int height) {
+ uiPropertiesBuilder.addNEITransferRect(new Rectangle(x, y, width, height));
+ return this;
+ }
+
+ /**
+ * Sets ID used to open NEI recipe GUI when progressbar is clicked.
+ */
+ public RecipeMapBuilder<B> neiTransferRectId(String neiTransferRectId) {
+ uiPropertiesBuilder.neiTransferRectId(neiTransferRectId);
+ return this;
+ }
+
+ /**
+ * Adds additional textures shown on GUI.
+ */
+ public RecipeMapBuilder<B> addSpecialTexture(int x, int y, int width, int height, IDrawable texture) {
+ uiPropertiesBuilder.addSpecialTexture(new Size(width, height), new Pos2d(x, y), texture);
+ return this;
+ }
+
+ /**
+ * Adds additional textures shown on steam machine GUI.
+ */
+ public RecipeMapBuilder<B> addSpecialTextureSteam(int x, int y, int width, int height, SteamTexture texture) {
+ uiPropertiesBuilder.addSpecialTextureSteam(new Size(width, height), new Pos2d(x, y), texture);
+ return this;
+ }
+
+ /**
+ * Sets logo shown on GUI. GregTech logo by default.
+ */
+ public RecipeMapBuilder<B> logo(IDrawable logo) {
+ uiPropertiesBuilder.logo(logo);
+ return this;
+ }
+
+ /**
+ * Sets size of logo. (17, 17) by default.
+ */
+ public RecipeMapBuilder<B> logoSize(int width, int height) {
+ uiPropertiesBuilder.logoSize(new Size(width, height));
+ return this;
+ }
+
+ /**
+ * Sets position of logo. (152, 63) by default.
+ */
+ public RecipeMapBuilder<B> logoPos(int x, int y) {
+ uiPropertiesBuilder.logoPos(new Pos2d(x, y));
+ return this;
+ }
+
+ /**
+ * Sets amperage for the recipemap.
+ */
+ public RecipeMapBuilder<B> amperage(int amperage) {
+ uiPropertiesBuilder.amperage(amperage);
+ return this;
+ }
+
+ // endregion
+
+ // region frontend NEI properties
+
+ /**
+ * Stops adding dedicated NEI recipe page for this recipemap. This does not prevent adding transferrect
+ * for the machine GUI.
+ */
+ public RecipeMapBuilder<B> disableRegisterNEI() {
+ neiPropertiesBuilder.disableRegisterNEI();
+ return this;
+ }
+
+ /**
+ * Sets properties of NEI handler info this recipemap belongs to. You can specify icon shown on recipe tab,
+ * handler height, number of recipes per page, etc. Either use supplied template or return newly constructed one.
+ * <p>
+ * Invocation of the builder creator is delayed until the actual registration (FMLLoadCompleteEvent),
+ * so you can safely use itemstack that doesn't exist as of recipemap initialization.
+ * <p>
+ * If this method is not used, handler icon will be inferred from recipe catalysts associated with this recipemap.
+ * <p>
+ * Precisely, what's registered to NEI is {@link RecipeCategory}, not RecipeMap. However, handler info supplied
+ * by this method will be used for default category where most of the recipes belong to.
+ */
+ public RecipeMapBuilder<B> neiHandlerInfo(UnaryOperator<HandlerInfo.Builder> handlerInfoCreator) {
+ neiPropertiesBuilder.handlerInfoCreator(handlerInfoCreator);
+ return this;
+ }
+
+ /**
+ * Sets offset of background shown on NEI.
+ */
+ public RecipeMapBuilder<B> neiRecipeBackgroundSize(int width, int height) {
+ neiPropertiesBuilder.recipeBackgroundSize(new Size(width, height));
+ return this;
+ }
+
+ /**
+ * Sets size of background shown on NEI.
+ */
+ public RecipeMapBuilder<B> neiRecipeBackgroundOffset(int x, int y) {
+ neiPropertiesBuilder.recipeBackgroundOffset(new Pos2d(x, y));
+ return this;
+ }
+
+ /**
+ * Sets formatter for special description for the recipe, mainly {@link gregtech.api.util.GT_Recipe#mSpecialValue}.
+ */
+ public RecipeMapBuilder<B> neiSpecialInfoFormatter(INEISpecialInfoFormatter neiSpecialInfoFormatter) {
+ neiPropertiesBuilder.neiSpecialInfoFormatter(neiSpecialInfoFormatter);
+ return this;
+ }
+
+ /**
+ * Sets whether to show oredict equivalent item outputs on NEI.
+ */
+ public RecipeMapBuilder<B> unificateOutputNEI(boolean unificateOutputNEI) {
+ neiPropertiesBuilder.unificateOutput(unificateOutputNEI);
+ return this;
+ }
+
+ /**
+ * Sets NEI recipe handler to use a custom filter method {@link OverclockDescriber#canHandle} to limit the shown
+ * recipes when searching recipes with recipe catalyst. Without calling this method, the voltage of the recipe is
+ * the only factor to filter recipes by default.
+ * <p>
+ * This method on its own doesn't do anything. You need to bind custom {@link OverclockDescriber} object to machines
+ * that will be shown as recipe catalysts for this recipemap by implementing
+ * {@link gregtech.api.interfaces.tileentity.IOverclockDescriptionProvider}.
+ */
+ public RecipeMapBuilder<B> useCustomFilterForNEI() {
+ neiPropertiesBuilder.useCustomFilter();
+ return this;
+ }
+
+ /**
+ * Stops rendering the actual stack size of items on NEI.
+ */
+ public RecipeMapBuilder<B> disableRenderRealStackSizes() {
+ neiPropertiesBuilder.disableRenderRealStackSizes();
+ return this;
+ }
+
+ /**
+ * Sets custom comparator for NEI recipe sort.
+ */
+ public RecipeMapBuilder<B> neiRecipeComparator(Comparator<GT_Recipe> comparator) {
+ neiPropertiesBuilder.recipeComparator(comparator);
+ return this;
+ }
+
+ // endregion
+
+ /**
+ * Sets custom frontend logic. For custom backend, pass it to {@link #of(String, RecipeMapBackend.BackendCreator)}.
+ */
+ public RecipeMapBuilder<B> frontend(RecipeMapFrontend.FrontendCreator frontendCreator) {
+ this.frontendCreator = frontendCreator;
+ return this;
+ }
+
+ /**
+ * Builds new recipemap.
+ *
+ * @return Recipemap object with backend type parameter, which is {@code RecipeMapFrontend} unless specified.
+ */
+ public RecipeMap<B> build() {
+ return new RecipeMap<>(
+ unlocalizedName,
+ backendCreator.create(backendPropertiesBuilder),
+ frontendCreator.create(uiPropertiesBuilder, neiPropertiesBuilder));
+ }
+
+ private static <T> Function<? super T, ? extends T> withIdentityReturn(Consumer<T> func) {
+ return r -> {
+ func.accept(r);
+ return r;
+ };
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/RecipeMapFrontend.java b/src/main/java/gregtech/api/recipe/RecipeMapFrontend.java
new file mode 100644
index 0000000000..63daa00dc7
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/RecipeMapFrontend.java
@@ -0,0 +1,395 @@
+package gregtech.api.recipe;
+
+import static gregtech.api.util.GT_Utility.trans;
+import static net.minecraft.util.EnumChatFormatting.GRAY;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Supplier;
+import java.util.stream.IntStream;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.gtnewhorizons.modularui.api.GlStateManager;
+import com.gtnewhorizons.modularui.api.ModularUITextures;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.math.Size;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import codechicken.nei.PositionedStack;
+import gregtech.GT_Mod;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.gui.GT_GUIColorOverride;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.recipe.metadata.IRecipeMetadataStorage;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+import gregtech.nei.GT_NEI_DefaultHandler;
+import gregtech.nei.RecipeDisplayInfo;
+
+/**
+ * Responsible for managing GUI tied to recipemap. It has two property objects, {@link NEIRecipeProperties} and
+ * {@link BasicUIProperties}. The former is only for NEI display, while the latter is for both NEI and basic machine.
+ * <p>
+ * In order to bind custom frontend to recipemap, use {@link RecipeMapBuilder#frontend}.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class RecipeMapFrontend {
+
+ /**
+ * Properties specific to this frontend, mainly for GUI widgets.
+ */
+ protected final BasicUIProperties uiProperties;
+ /**
+ * Properties specific to this frontend, only for NEI specific settings.
+ */
+ protected final NEIRecipeProperties neiProperties;
+
+ protected final GT_GUIColorOverride colorOverride = GT_GUIColorOverride
+ .get(GT_UITextures.BACKGROUND_NEI_SINGLE_RECIPE.location);
+
+ public RecipeMapFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ this.uiProperties = uiPropertiesBuilder.itemInputPositionsGetter(this::getItemInputPositions)
+ .itemOutputPositionsGetter(this::getItemOutputPositions)
+ .specialItemPositionGetter(this::getSpecialItemPosition)
+ .fluidInputPositionsGetter(this::getFluidInputPositions)
+ .fluidOutputPositionsGetter(this::getFluidOutputPositions)
+ .build();
+ this.neiProperties = neiPropertiesBuilder.build();
+ }
+
+ /**
+ * @return Properties specific to this frontend, mainly for GUI widgets.
+ */
+ public BasicUIProperties getUIProperties() {
+ return uiProperties;
+ }
+
+ /**
+ * @return Properties specific to this frontend, only for NEI specific settings.
+ */
+ public NEIRecipeProperties getNEIProperties() {
+ return neiProperties;
+ }
+
+ /**
+ * Creates NEI recipe layout, except for actual items / fluids.
+ */
+ public ModularWindow.Builder createNEITemplate(IItemHandlerModifiable itemInputsInventory,
+ IItemHandlerModifiable itemOutputsInventory, IItemHandlerModifiable specialSlotInventory,
+ IItemHandlerModifiable fluidInputsInventory, IItemHandlerModifiable fluidOutputsInventory,
+ Supplier<Float> progressSupplier, Pos2d windowOffset) {
+ ModularWindow.Builder builder = ModularWindow.builder(neiProperties.recipeBackgroundSize)
+ .setBackground(GT_UITextures.BACKGROUND_NEI_SINGLE_RECIPE);
+
+ UIHelper.forEachSlots(
+ (i, backgrounds, pos) -> builder.widget(
+ SlotWidget.phantom(itemInputsInventory, i)
+ .setBackground(backgrounds)
+ .setPos(pos)
+ .setSize(18, 18)),
+ (i, backgrounds, pos) -> builder.widget(
+ SlotWidget.phantom(itemOutputsInventory, i)
+ .setBackground(backgrounds)
+ .setPos(pos)
+ .setSize(18, 18)),
+ (i, backgrounds, pos) -> {
+ if (uiProperties.useSpecialSlot) builder.widget(
+ SlotWidget.phantom(specialSlotInventory, 0)
+ .setBackground(backgrounds)
+ .setPos(pos)
+ .setSize(18, 18));
+ },
+ (i, backgrounds, pos) -> builder.widget(
+ SlotWidget.phantom(fluidInputsInventory, i)
+ .setBackground(backgrounds)
+ .setPos(pos)
+ .setSize(18, 18)),
+ (i, backgrounds, pos) -> builder.widget(
+ SlotWidget.phantom(fluidOutputsInventory, i)
+ .setBackground(backgrounds)
+ .setPos(pos)
+ .setSize(18, 18)),
+ ModularUITextures.ITEM_SLOT,
+ ModularUITextures.FLUID_SLOT,
+ uiProperties,
+ uiProperties.maxItemInputs,
+ uiProperties.maxItemOutputs,
+ uiProperties.maxFluidInputs,
+ uiProperties.maxFluidOutputs,
+ SteamVariant.NONE,
+ windowOffset);
+
+ if (uiProperties.useProgressBar) {
+ addProgressBar(builder, progressSupplier, windowOffset);
+ }
+ addGregTechLogo(builder, windowOffset);
+
+ for (Pair<IDrawable, Pair<Size, Pos2d>> specialTexture : uiProperties.specialTextures) {
+ builder.widget(
+ new DrawableWidget().setDrawable(specialTexture.getLeft())
+ .setSize(
+ specialTexture.getRight()
+ .getLeft())
+ .setPos(
+ specialTexture.getRight()
+ .getRight()
+ .add(windowOffset)));
+ }
+
+ return builder;
+ }
+
+ public void addProgressBar(ModularWindow.Builder builder, Supplier<Float> progressSupplier, Pos2d windowOffset) {
+ assert uiProperties.progressBarTexture != null;
+ builder.widget(
+ new ProgressBar().setTexture(uiProperties.progressBarTexture.get(), 20)
+ .setDirection(uiProperties.progressBarDirection)
+ .setProgress(progressSupplier)
+ .setSynced(false, false)
+ .setPos(uiProperties.progressBarPos.add(windowOffset))
+ .setSize(uiProperties.progressBarSize));
+ }
+
+ public void addGregTechLogo(ModularWindow.Builder builder, Pos2d windowOffset) {
+ builder.widget(
+ new DrawableWidget().setDrawable(uiProperties.logo)
+ .setSize(uiProperties.logoSize)
+ .setPos(uiProperties.logoPos.add(windowOffset)));
+ }
+
+ /**
+ * Overriding this method allows custom NEI stack placement
+ */
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return UIHelper.getItemInputPositions(itemInputCount);
+ }
+
+ /**
+ * Overriding this method allows custom NEI stack placement
+ */
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return UIHelper.getItemOutputPositions(itemOutputCount);
+ }
+
+ /**
+ * Overriding this method allows custom NEI stack placement
+ */
+ public Pos2d getSpecialItemPosition() {
+ return UIHelper.getSpecialItemPosition();
+ }
+
+ /**
+ * Overriding this method allows custom NEI stack placement
+ */
+ public List<Pos2d> getFluidInputPositions(int fluidInputCount) {
+ return UIHelper.getFluidInputPositions(fluidInputCount);
+ }
+
+ /**
+ * Overriding this method allows custom NEI stack placement
+ */
+ public List<Pos2d> getFluidOutputPositions(int fluidOutputCount) {
+ return UIHelper.getFluidOutputPositions(fluidOutputCount);
+ }
+
+ public void drawDescription(RecipeDisplayInfo recipeInfo) {
+ drawEnergyInfo(recipeInfo);
+ drawDurationInfo(recipeInfo);
+ drawSpecialInfo(recipeInfo);
+ drawMetadataInfo(recipeInfo);
+ drawRecipeOwnerInfo(recipeInfo);
+ }
+
+ protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {
+ recipeInfo.overclockDescriber.drawEnergyInfo(recipeInfo);
+ }
+
+ protected void drawDurationInfo(RecipeDisplayInfo recipeInfo) {
+ recipeInfo.overclockDescriber.drawDurationInfo(recipeInfo);
+ }
+
+ protected void drawSpecialInfo(RecipeDisplayInfo recipeInfo) {
+ String[] recipeDesc = recipeInfo.recipe.getNeiDesc();
+ if (recipeDesc != null) {
+ for (String s : recipeDesc) {
+ recipeInfo.drawText(s);
+ }
+ } else {
+ recipeInfo.drawTextMultipleLines(neiProperties.neiSpecialInfoFormatter.format(recipeInfo));
+ }
+ }
+
+ protected void drawMetadataInfo(RecipeDisplayInfo recipeInfo) {
+ IRecipeMetadataStorage metadataStorage = recipeInfo.recipe.getMetadataStorage();
+ for (Map.Entry<RecipeMetadataKey<?>, Object> entry : metadataStorage.getEntries()) {
+ entry.getKey()
+ .drawInfo(recipeInfo, entry.getValue());
+ }
+ }
+
+ protected void drawRecipeOwnerInfo(RecipeDisplayInfo recipeInfo) {
+ GT_Recipe recipe = recipeInfo.recipe;
+ if (GT_Mod.gregtechproxy.mNEIRecipeOwner) {
+ if (recipe.owners.size() > 1) {
+ recipeInfo.drawText(
+ EnumChatFormatting.ITALIC + trans("273", "Original Recipe by: ")
+ + recipe.owners.get(0)
+ .getName());
+ for (int i = 1; i < recipe.owners.size(); i++) {
+ recipeInfo.drawText(
+ EnumChatFormatting.ITALIC + trans("274", "Modified by: ")
+ + recipe.owners.get(i)
+ .getName());
+ }
+ } else if (!recipe.owners.isEmpty()) {
+ recipeInfo.drawText(
+ EnumChatFormatting.ITALIC + trans("272", "Recipe by: ")
+ + recipe.owners.get(0)
+ .getName());
+ }
+ }
+ if (GT_Mod.gregtechproxy.mNEIRecipeOwnerStackTrace && recipe.stackTraces != null
+ && !recipe.stackTraces.isEmpty()) {
+ recipeInfo.drawText("stackTrace:");
+ // todo: good way to show all stacktraces
+ for (String stackTrace : recipe.stackTraces.get(0)) {
+ recipeInfo.drawText(stackTrace);
+ }
+ }
+ }
+
+ public List<String> handleNEIItemTooltip(ItemStack stack, List<String> currentTip,
+ GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) {
+ for (PositionedStack pStack : neiCachedRecipe.mInputs) {
+ if (stack == pStack.item) {
+ if (pStack instanceof GT_NEI_DefaultHandler.FixedPositionedStack) {
+ currentTip = handleNEIItemInputTooltip(
+ currentTip,
+ (GT_NEI_DefaultHandler.FixedPositionedStack) pStack);
+ }
+ break;
+ }
+ }
+ for (PositionedStack pStack : neiCachedRecipe.mOutputs) {
+ if (stack == pStack.item) {
+ if (pStack instanceof GT_NEI_DefaultHandler.FixedPositionedStack) {
+ currentTip = handleNEIItemOutputTooltip(
+ currentTip,
+ (GT_NEI_DefaultHandler.FixedPositionedStack) pStack);
+ }
+ break;
+ }
+ }
+ return currentTip;
+ }
+
+ protected List<String> handleNEIItemInputTooltip(List<String> currentTip,
+ GT_NEI_DefaultHandler.FixedPositionedStack pStack) {
+ if (pStack.isNotConsumed()) {
+ currentTip.add(GRAY + trans("151", "Does not get consumed in the process"));
+ }
+ return currentTip;
+ }
+
+ protected List<String> handleNEIItemOutputTooltip(List<String> currentTip,
+ GT_NEI_DefaultHandler.FixedPositionedStack pStack) {
+ if (pStack.isChanceBased()) {
+ currentTip.add(GRAY + trans("150", "Chance: ") + pStack.getChanceText());
+ }
+ return currentTip;
+ }
+
+ public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) {
+ for (PositionedStack stack : neiCachedRecipe.mInputs) {
+ if (stack instanceof GT_NEI_DefaultHandler.FixedPositionedStack) {
+ drawNEIOverlayForInput((GT_NEI_DefaultHandler.FixedPositionedStack) stack);
+ }
+ }
+ for (PositionedStack stack : neiCachedRecipe.mOutputs) {
+ if (stack instanceof GT_NEI_DefaultHandler.FixedPositionedStack) {
+ drawNEIOverlayForOutput((GT_NEI_DefaultHandler.FixedPositionedStack) stack);
+ }
+ }
+ }
+
+ protected void drawNEIOverlayForInput(GT_NEI_DefaultHandler.FixedPositionedStack stack) {
+ if (stack.isNotConsumed()) {
+ drawNEIOverlayText("NC", stack);
+ }
+ }
+
+ protected void drawNEIOverlayForOutput(GT_NEI_DefaultHandler.FixedPositionedStack stack) {
+ if (stack.isChanceBased()) {
+ drawNEIOverlayText(stack.getChanceText(), stack);
+ }
+ }
+
+ @SuppressWarnings("SameParameterValue")
+ protected void drawNEIOverlayText(String text, PositionedStack stack, int color, float scale, boolean shadow,
+ Alignment alignment) {
+ FontRenderer fontRenderer = net.minecraft.client.Minecraft.getMinecraft().fontRenderer;
+ int width = fontRenderer.getStringWidth(text);
+ int x = (int) ((stack.relx + 8 + 8 * alignment.x) / scale) - (width / 2 * (alignment.x + 1));
+ int y = (int) ((stack.rely + 8 + 8 * alignment.y) / scale) - (fontRenderer.FONT_HEIGHT / 2 * (alignment.y + 1))
+ - (alignment.y - 1) / 2;
+
+ GlStateManager.pushMatrix();
+ GlStateManager.scale(scale, scale, 1);
+ fontRenderer.drawString(text, x, y, color, shadow);
+ GlStateManager.popMatrix();
+ }
+
+ protected void drawNEIOverlayText(String text, PositionedStack stack) {
+ drawNEIOverlayText(
+ text,
+ stack,
+ colorOverride.getTextColorOrDefault("nei_overlay_yellow", 0xFDD835),
+ 0.5f,
+ false,
+ Alignment.TopLeft);
+ }
+
+ public static List<Supplier<Float>> splitProgress(Supplier<Float> progress, int... progressbarLengthArray) {
+ float lengthSum = IntStream.of(progressbarLengthArray)
+ .sum();
+ List<Supplier<Float>> ret = new ArrayList<>();
+ float currentLengthSum = 0;
+ for (int progressbarLength : progressbarLengthArray) {
+ float speed = lengthSum / progressbarLength;
+ float offset = currentLengthSum / lengthSum;
+ ret.add(() -> {
+ float current = progress.get();
+ return (current - offset) * speed;
+ });
+ currentLengthSum += progressbarLength;
+ }
+ return ret;
+ }
+
+ @FunctionalInterface
+ public interface FrontendCreator {
+
+ /**
+ * @see RecipeMapFrontend#RecipeMapFrontend
+ */
+ RecipeMapFrontend create(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder);
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/RecipeMaps.java b/src/main/java/gregtech/api/recipe/RecipeMaps.java
new file mode 100644
index 0000000000..4494d1efba
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/RecipeMaps.java
@@ -0,0 +1,1194 @@
+package gregtech.api.recipe;
+
+import static gregtech.api.enums.Mods.GTNHIntergalactic;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.NEICustomDiagrams;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.util.GT_RecipeConstants.ADDITIVE_AMOUNT;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GT_RecipeMapUtil.FIRST_FLUIDSTACK_INPUT;
+import static gregtech.api.util.GT_RecipeMapUtil.FIRST_FLUIDSTACK_OUTPUT;
+import static gregtech.api.util.GT_RecipeMapUtil.FIRST_FLUID_OUTPUT;
+import static gregtech.api.util.GT_RecipeMapUtil.FIRST_ITEM_INPUT;
+import static gregtech.api.util.GT_RecipeMapUtil.FIRST_ITEM_OR_FLUID_INPUT;
+import static gregtech.api.util.GT_RecipeMapUtil.FIRST_ITEM_OR_FLUID_OUTPUT;
+import static gregtech.api.util.GT_RecipeMapUtil.FIRST_ITEM_OUTPUT;
+import static gregtech.api.util.GT_RecipeMapUtil.GT_RecipeTemplate;
+import static gregtech.api.util.GT_RecipeMapUtil.asTemplate;
+import static gregtech.api.util.GT_RecipeMapUtil.buildOrEmpty;
+import static gregtech.api.util.GT_Utility.clamp;
+import static gregtech.api.util.GT_Utility.copyAmount;
+import static gregtech.api.util.GT_Utility.getFluidForFilledItem;
+import static gregtech.api.util.GT_Utility.isArrayEmptyOrNull;
+import static gregtech.api.util.GT_Utility.isArrayOfLength;
+import static gregtech.api.util.GT_Utility.multiplyStack;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Optional;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.IRecipeMap;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.maps.AssemblerBackend;
+import gregtech.api.recipe.maps.AssemblyLineFrontend;
+import gregtech.api.recipe.maps.DistillationTowerFrontend;
+import gregtech.api.recipe.maps.FluidCannerBackend;
+import gregtech.api.recipe.maps.FluidOnlyFrontend;
+import gregtech.api.recipe.maps.FormingPressBackend;
+import gregtech.api.recipe.maps.FuelBackend;
+import gregtech.api.recipe.maps.FurnaceBackend;
+import gregtech.api.recipe.maps.LargeBoilerFuelBackend;
+import gregtech.api.recipe.maps.LargeBoilerFuelFrontend;
+import gregtech.api.recipe.maps.LargeNEIFrontend;
+import gregtech.api.recipe.maps.MicrowaveBackend;
+import gregtech.api.recipe.maps.OilCrackerBackend;
+import gregtech.api.recipe.maps.PrinterBackend;
+import gregtech.api.recipe.maps.RecyclerBackend;
+import gregtech.api.recipe.maps.ReplicatorBackend;
+import gregtech.api.recipe.maps.SpaceProjectFrontend;
+import gregtech.api.recipe.maps.TranscendentPlasmaMixerFrontend;
+import gregtech.api.recipe.maps.UnpackagerBackend;
+import gregtech.api.recipe.metadata.PCBFactoryTierKey;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_RecipeMapUtil;
+import gregtech.api.util.GT_Utility;
+import gregtech.nei.formatter.FuelSpecialValueFormatter;
+import gregtech.nei.formatter.FusionSpecialValueFormatter;
+import gregtech.nei.formatter.HeatingCoilSpecialValueFormatter;
+import gregtech.nei.formatter.SimpleSpecialValueFormatter;
+import mods.railcraft.common.blocks.aesthetics.cube.EnumCube;
+import mods.railcraft.common.items.RailcraftToolItems;
+
+@SuppressWarnings("SimplifyOptionalCallChains")
+public final class RecipeMaps {
+
+ public static final RecipeMap<RecipeMapBackend> oreWasherRecipes = RecipeMapBuilder.of("gt.recipe.orewasher")
+ .maxIO(1, 3, 1, 0)
+ .minInputs(1, 1)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isFluid) {
+ return null;
+ }
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_DUST;
+ } else {
+ return GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE;
+ }
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_BATH, ProgressBar.Direction.CIRCULAR_CW)
+ .recipeConfigFile("orewasher", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> thermalCentrifugeRecipes = RecipeMapBuilder
+ .of("gt.recipe.thermalcentrifuge")
+ .maxIO(1, 3, 0, 0)
+ .minInputs(1, 0)
+ .amperage(2)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isFluid) {
+ return null;
+ }
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_DUST;
+ } else {
+ return GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE;
+ }
+ })
+ .recipeConfigFile("thermalcentrifuge", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> compressorRecipes = RecipeMapBuilder.of("gt.recipe.compressor")
+ .maxIO(1, 1, 0, 0)
+ .minInputs(1, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_COMPRESSOR
+ : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_COMPRESS)
+ .slotOverlaysSteam(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_COMPRESSOR_STEAM
+ : null)
+ .progressBarSteam(GT_UITextures.PROGRESSBAR_COMPRESS_STEAM)
+ // Avoid steam machine being used as handler icon
+ .neiHandlerInfo(builder -> builder.setDisplayStack(ItemList.Machine_LV_Compressor.get(1)))
+ .recipeConfigFile("compressor", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> extractorRecipes = RecipeMapBuilder.of("gt.recipe.extractor")
+ .maxIO(1, 1, 0, 0)
+ .minInputs(1, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CENTRIFUGE
+ : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT)
+ .slotOverlaysSteam(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CENTRIFUGE_STEAM
+ : null)
+ .progressBarSteam(GT_UITextures.PROGRESSBAR_EXTRACT_STEAM)
+ // Avoid steam machine being used as handler icon
+ .neiHandlerInfo(builder -> builder.setDisplayStack(ItemList.Machine_LV_Extractor.get(1)))
+ .recipeConfigFile("extractor", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecyclerBackend> recyclerRecipes = RecipeMapBuilder
+ .of("ic.recipe.recycler", RecyclerBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .minInputs(1, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_RECYCLE : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_RECYCLE, ProgressBar.Direction.CIRCULAR_CW)
+ .neiTransferRectId("ic2.recycler")
+ .disableRegisterNEI()
+ .build();
+ public static final RecipeMap<FurnaceBackend> furnaceRecipes = RecipeMapBuilder
+ .of("mc.recipe.furnace", FurnaceBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .minInputs(1, 9)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_FURNACE : null)
+ .slotOverlaysSteam(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_FURNACE_STEAM
+ : null)
+ .progressBarSteam(GT_UITextures.PROGRESSBAR_ARROW_STEAM)
+ .neiTransferRectId("smelting")
+ .disableRegisterNEI()
+ .build();
+ public static final RecipeMap<MicrowaveBackend> microwaveRecipes = RecipeMapBuilder
+ .of("gt.recipe.microwave", MicrowaveBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .minInputs(1, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_FURNACE : null)
+ .neiTransferRectId("smelting")
+ .disableRegisterNEI()
+ .build();
+ public static final RecipeMap<RecipeMapBackend> scannerFakeRecipes = RecipeMapBuilder.of("gt.recipe.scanner")
+ .maxIO(1, 1, 1, 0)
+ .minInputs(1, 0)
+ .useSpecialSlot()
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isSpecial) {
+ return GT_UITextures.OVERLAY_SLOT_DATA_ORB;
+ }
+ if (!isFluid && !isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_MICROSCOPE;
+ }
+ return null;
+ })
+ .build();
+ public static final RecipeMap<RecipeMapBackend> rockBreakerFakeRecipes = RecipeMapBuilder
+ .of("gt.recipe.rockbreaker")
+ .maxIO(2, 1, 0, 0)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE;
+ } else {
+ return GT_UITextures.OVERLAY_SLOT_DUST;
+ }
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_MACERATE)
+ .build();
+ public static final RecipeMap<ReplicatorBackend> replicatorRecipes = RecipeMapBuilder
+ .of("gt.recipe.replicator", ReplicatorBackend::new)
+ .maxIO(0, 1, 1, 1)
+ .minInputs(0, 1)
+ .useSpecialSlot()
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isSpecial) {
+ return GT_UITextures.OVERLAY_SLOT_DATA_ORB;
+ }
+ if (isFluid && !isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_UUM;
+ }
+ return null;
+ })
+ .build();
+ /**
+ * Use {@link GT_RecipeConstants#AssemblyLine} for recipe addition.
+ */
+ public static final RecipeMap<RecipeMapBackend> assemblylineVisualRecipes = RecipeMapBuilder
+ .of("gt.recipe.fakeAssemblylineProcess")
+ .maxIO(16, 1, 4, 0)
+ .minInputs(1, 0)
+ .useSpecialSlot()
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> isSpecial ? GT_UITextures.OVERLAY_SLOT_DATA_ORB : null)
+ .disableOptimize()
+ .neiTransferRect(88, 8, 18, 72)
+ .neiTransferRect(124, 8, 18, 72)
+ .neiTransferRect(142, 26, 18, 18)
+ .frontend(AssemblyLineFrontend::new)
+ .build();
+ /**
+ * Usually, but not always, you should use {@link GT_RecipeConstants#UniversalArcFurnace} instead.
+ */
+ public static final RecipeMap<RecipeMapBackend> plasmaArcFurnaceRecipes = RecipeMapBuilder
+ .of("gt.recipe.plasmaarcfurnace")
+ .maxIO(1, 9, 1, 1)
+ .minInputs(1, 1)
+ .recipeConfigFile("arcfurnace", FIRST_ITEM_INPUT)
+ .build();
+ /**
+ * Usually, but not always, you should use {@link GT_RecipeConstants#UniversalArcFurnace} instead.
+ */
+ public static final RecipeMap<RecipeMapBackend> arcFurnaceRecipes = RecipeMapBuilder.of("gt.recipe.arcfurnace")
+ .maxIO(1, 9, 1, 0)
+ .minInputs(1, 1)
+ .amperage(3)
+ .recipeConfigFile("arcfurnace", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<PrinterBackend> printerRecipes = RecipeMapBuilder
+ .of("gt.recipe.printer", PrinterBackend::new)
+ .maxIO(1, 1, 1, 0)
+ .minInputs(1, 1)
+ .useSpecialSlot()
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isSpecial) {
+ return GT_UITextures.OVERLAY_SLOT_DATA_STICK;
+ }
+ if (isFluid) {
+ return null;
+ }
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_PAGE_PRINTED;
+ }
+ return GT_UITextures.OVERLAY_SLOT_PAGE_BLANK;
+ })
+ .recipeConfigFile("printer", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> sifterRecipes = RecipeMapBuilder.of("gt.recipe.sifter")
+ .maxIO(1, 9, 1, 1)
+ .progressBar(GT_UITextures.PROGRESSBAR_SIFT, ProgressBar.Direction.DOWN)
+ .recipeConfigFile("sifter", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<FormingPressBackend> formingPressRecipes = RecipeMapBuilder
+ .of("gt.recipe.press", FormingPressBackend::new)
+ .maxIO(6, 1, 0, 0)
+ .minInputs(2, 0)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_PRESS_3;
+ }
+ if (index == 0) {
+ return GT_UITextures.OVERLAY_SLOT_PRESS_1;
+ }
+ return GT_UITextures.OVERLAY_SLOT_PRESS_2;
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_COMPRESS)
+ .recipeConfigFile("press", FIRST_ITEM_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> laserEngraverRecipes = RecipeMapBuilder
+ .of("gt.recipe.laserengraver")
+ .maxIO(4, 4, 2, 2)
+ .slotOverlays(
+ (index, isFluid, isOutput,
+ isSpecial) -> !isFluid && !isOutput && index != 0 ? GT_UITextures.OVERLAY_SLOT_LENS : null)
+ .recipeConfigFile("laserengraving", FIRST_ITEM_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> mixerRecipes = RecipeMapBuilder.of("gt.recipe.mixer")
+ .maxIO(9, 4, 1, 1)
+ .minInputs(1, 0)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> !isFluid ? GT_UITextures.OVERLAY_SLOT_DUST : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_MIXER, ProgressBar.Direction.CIRCULAR_CW)
+ .recipeConfigFile("mixer", FIRST_ITEM_OR_FLUID_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> autoclaveRecipes = RecipeMapBuilder.of("gt.recipe.autoclave")
+ .maxIO(2, 4, 1, 1)
+ .minInputs(1, 1)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isFluid) {
+ return null;
+ }
+ if (isOutput) {
+ if (index == 0) {
+ return GT_UITextures.OVERLAY_SLOT_GEM;
+ }
+ return GT_UITextures.OVERLAY_SLOT_DUST;
+ }
+ return GT_UITextures.OVERLAY_SLOT_DUST;
+ })
+
+ .recipeConfigFile("autoclave", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> electroMagneticSeparatorRecipes = RecipeMapBuilder
+ .of("gt.recipe.electromagneticseparator")
+ .maxIO(1, 3, 0, 0)
+ .minInputs(1, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> isOutput ? GT_UITextures.OVERLAY_SLOT_DUST
+ : GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE)
+ .progressBar(GT_UITextures.PROGRESSBAR_MAGNET)
+ .recipeConfigFile("electromagneticseparator", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> polarizerRecipes = RecipeMapBuilder.of("gt.recipe.polarizer")
+ .maxIO(1, 1, 0, 0)
+ .minInputs(1, 0)
+ .progressBar(GT_UITextures.PROGRESSBAR_MAGNET)
+ .recipeConfigFile("polarizer", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> maceratorRecipes = RecipeMapBuilder.of("gt.recipe.macerator")
+ .maxIO(1, 4, 0, 0)
+ .minInputs(1, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> isOutput ? GT_UITextures.OVERLAY_SLOT_DUST
+ : GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE)
+ .slotOverlaysSteam(
+ (index, isFluid, isOutput, isSpecial) -> isOutput ? GT_UITextures.OVERLAY_SLOT_DUST_STEAM
+ : GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE_STEAM)
+ .progressBar(GT_UITextures.PROGRESSBAR_MACERATE)
+ .progressBarSteam(GT_UITextures.PROGRESSBAR_MACERATE_STEAM)
+ // Avoid steam machine being used as handler icon
+ .neiHandlerInfo(builder -> builder.setDisplayStack(ItemList.Machine_LV_Macerator.get(1)))
+ .recipeConfigFile("pulveriser", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> chemicalBathRecipes = RecipeMapBuilder.of("gt.recipe.chemicalbath")
+ .maxIO(1, 3, 1, 1)
+ .minInputs(1, 1)
+ .progressBar(GT_UITextures.PROGRESSBAR_BATH, ProgressBar.Direction.CIRCULAR_CW)
+ .recipeConfigFile("chemicalbath", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<FluidCannerBackend> fluidCannerRecipes = RecipeMapBuilder
+ .of("gt.recipe.fluidcanner", FluidCannerBackend::new)
+ .maxIO(1, 1, 1, 1)
+ .minInputs(1, 0)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> !isFluid ? GT_UITextures.OVERLAY_SLOT_CANISTER : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_CANNER)
+ .recipeConfigFile("canning", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> brewingRecipes = RecipeMapBuilder.of("gt.recipe.brewer")
+ .maxIO(1, 0, 1, 1)
+ .minInputs(1, 1)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CAULDRON : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .recipeConfigFile("brewing", FIRST_FLUIDSTACK_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> fluidHeaterRecipes = RecipeMapBuilder.of("gt.recipe.fluidheater")
+ .maxIO(1, 0, 1, 1)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (!isFluid) {
+ return null;
+ }
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_HEATER_2;
+ }
+ return GT_UITextures.OVERLAY_SLOT_HEATER_1;
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .recipeConfigFile("fluidheater", FIRST_FLUIDSTACK_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> distilleryRecipes = RecipeMapBuilder.of("gt.recipe.distillery")
+ .maxIO(1, 1, 1, 1)
+ .minInputs(1, 1)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (!isFluid) {
+ return null;
+ }
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_BEAKER_2;
+ }
+ return GT_UITextures.OVERLAY_SLOT_BEAKER_1;
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .recipeTransformer(r -> {
+ int aInput = r.mFluidInputs[0].amount, aOutput = r.mFluidOutputs[0].amount, aDuration = r.mDuration;
+
+ // reduce the batch size if fluid amount is exceeding
+ int tScale = (Math.max(aInput, aOutput) + 999) / 1000;
+ if (tScale <= 0) tScale = 1;
+ if (tScale > 1) {
+ // trying to find whether there is a better factor
+ for (int i = tScale; i <= 5; i++) {
+ if (aInput % i == 0 && aDuration % i == 0) {
+ tScale = i;
+ break;
+ }
+ }
+ for (int i = tScale; i <= 5; i++) {
+ if (aInput % i == 0 && aDuration % i == 0 && aOutput % i == 0) {
+ tScale = i;
+ break;
+ }
+ }
+ aInput = (aInput + tScale - 1) / tScale;
+ aOutput = aOutput / tScale;
+ if (!isArrayEmptyOrNull(r.mOutputs)) {
+ ItemData tData = GT_OreDictUnificator.getItemData(r.mOutputs[0]);
+ if (tData != null && (tData.mPrefix == OrePrefixes.dust
+ || OrePrefixes.dust.mFamiliarPrefixes.contains(tData.mPrefix))) {
+ r.mOutputs[0] = GT_OreDictUnificator.getDust(
+ tData.mMaterial.mMaterial,
+ tData.mMaterial.mAmount * r.mOutputs[0].stackSize / tScale);
+ } else {
+ if (r.mOutputs[0].stackSize / tScale == 0) r.mOutputs[0] = GT_Values.NI;
+ else r.mOutputs[0] = copyAmount(r.mOutputs[0].stackSize / tScale, r.mOutputs[0]);
+ }
+ }
+ aDuration = (aDuration + tScale - 1) / tScale;
+ r.mFluidInputs[0] = copyAmount(aInput, r.mFluidInputs[0]);
+ r.mFluidOutputs[0] = copyAmount(aOutput, r.mFluidOutputs[0]);
+ r.mDuration = aDuration;
+ }
+ })
+ .recipeConfigFile("distillery", FIRST_FLUIDSTACK_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> fermentingRecipes = RecipeMapBuilder.of("gt.recipe.fermenter")
+ .maxIO(0, 0, 1, 1)
+ .minInputs(0, 1)
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .recipeConfigFile("fermenting", FIRST_FLUIDSTACK_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> fluidSolidifierRecipes = RecipeMapBuilder
+ .of("gt.recipe.fluidsolidifier")
+ .maxIO(1, 1, 1, 0)
+ .minInputs(1, 1)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_MOLD : null)
+ .recipeTransformer(r -> {
+ if (ArrayUtils.isNotEmpty(r.mFluidInputs)) {
+ if (Materials.PhasedGold.getMolten(1)
+ .isFluidEqual(r.mFluidInputs[0]))
+ r.mFluidInputs = new FluidStack[] { Materials.VibrantAlloy.getMolten(r.mFluidInputs[0].amount) };
+ else if (Materials.PhasedIron.getMolten(1)
+ .isFluidEqual(r.mFluidInputs[0]))
+ r.mFluidInputs = new FluidStack[] { Materials.PulsatingIron.getMolten(r.mFluidInputs[0].amount) };
+ }
+ })
+ .recipeConfigFile("fluidsolidifier", FIRST_ITEM_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> fluidExtractionRecipes = RecipeMapBuilder
+ .of("gt.recipe.fluidextractor")
+ .maxIO(1, 1, 0, 1)
+ .minInputs(1, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CENTRIFUGE
+ : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT)
+ .recipeTransformer(r -> {
+ if (ArrayUtils.isNotEmpty(r.mFluidOutputs)) {
+ if (Materials.PhasedGold.getMolten(1)
+ .isFluidEqual(r.mFluidOutputs[0]))
+ r.mFluidOutputs = new FluidStack[] { Materials.VibrantAlloy.getMolten(r.mFluidOutputs[0].amount) };
+ else if (Materials.PhasedIron.getMolten(1)
+ .isFluidEqual(r.mFluidOutputs[0]))
+ r.mFluidOutputs = new FluidStack[] { Materials.PulsatingIron.getMolten(r.mFluidOutputs[0].amount) };
+ }
+ })
+ .recipeConfigFile("fluidextractor", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> packagerRecipes = RecipeMapBuilder.of("gt.recipe.packager")
+ .maxIO(2, 1, 0, 0)
+ .minInputs(2, 0)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_BOXED;
+ }
+ if (index != 0) {
+ return GT_UITextures.OVERLAY_SLOT_BOX;
+ }
+ return null;
+ })
+ .recipeConfigFile("boxing", FIRST_ITEM_OUTPUT)
+ .build();
+ public static final RecipeMap<UnpackagerBackend> unpackagerRecipes = RecipeMapBuilder
+ .of("gt.recipe.unpackager", UnpackagerBackend::new)
+ .maxIO(1, 2, 0, 0)
+ .minInputs(1, 0)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> !isOutput ? GT_UITextures.OVERLAY_SLOT_BOXED : null)
+ .recipeConfigFile("unboxing", FIRST_ITEM_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> fusionRecipes = RecipeMapBuilder.of("gt.recipe.fusionreactor")
+ .maxIO(0, 0, 2, 1)
+ .minInputs(0, 2)
+ .disableOptimize()
+ .useCustomFilterForNEI()
+ .neiSpecialInfoFormatter(FusionSpecialValueFormatter.INSTANCE)
+ .neiRecipeComparator(
+ Comparator
+ .<GT_Recipe, Integer>comparing(
+ recipe -> FusionSpecialValueFormatter.getFusionTier(recipe.mSpecialValue, recipe.mEUt))
+ .thenComparing(GT_Recipe::compareTo))
+ .frontend(FluidOnlyFrontend::new)
+ .recipeConfigFile("fusion", FIRST_FLUID_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> centrifugeRecipes = RecipeMapBuilder.of("gt.recipe.centrifuge")
+ .maxIO(2, 6, 1, 1)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isOutput) {
+ return null;
+ }
+ if (isFluid) {
+ return GT_UITextures.OVERLAY_SLOT_CENTRIFUGE_FLUID;
+ } else {
+ if (index == 0) {
+ return GT_UITextures.OVERLAY_SLOT_CENTRIFUGE;
+ }
+ return GT_UITextures.OVERLAY_SLOT_CANISTER;
+ }
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT)
+ .recipeConfigFile("centrifuge", FIRST_ITEM_OR_FLUID_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> electrolyzerRecipes = RecipeMapBuilder.of("gt.recipe.electrolyzer")
+ .maxIO(2, 6, 1, 1)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isOutput) {
+ return null;
+ }
+ if (isFluid) {
+ return GT_UITextures.OVERLAY_SLOT_CHARGER_FLUID;
+ } else {
+ if (index == 0) {
+ return GT_UITextures.OVERLAY_SLOT_CHARGER;
+ }
+ return GT_UITextures.OVERLAY_SLOT_CANISTER;
+ }
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT)
+ .recipeConfigFile("electrolyzer", FIRST_ITEM_OR_FLUID_INPUT)
+ .build();
+ /**
+ * Use {@link GT_RecipeConstants#COIL_HEAT} as heat level.
+ */
+ public static final RecipeMap<RecipeMapBackend> blastFurnaceRecipes = RecipeMapBuilder.of("gt.recipe.blastfurnace")
+ .maxIO(6, 6, 1, 1)
+ .minInputs(1, 0)
+ .neiSpecialInfoFormatter(HeatingCoilSpecialValueFormatter.INSTANCE)
+ .recipeConfigFile("blastfurnace", FIRST_ITEM_INPUT)
+ .build();
+ /**
+ * Use {@link GT_RecipeConstants#COIL_HEAT} as heat level.
+ */
+ public static final RecipeMap<RecipeMapBackend> plasmaForgeRecipes = RecipeMapBuilder.of("gt.recipe.plasmaforge")
+ .maxIO(9, 9, 9, 9)
+ .disableOptimize()
+ .neiSpecialInfoFormatter(HeatingCoilSpecialValueFormatter.INSTANCE)
+ .neiHandlerInfo(
+ builder -> builder.setDisplayStack(ItemList.Machine_Multi_PlasmaForge.get(1))
+ .setMaxRecipesPerPage(1))
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> transcendentPlasmaMixerRecipes = RecipeMapBuilder
+ .of("gt.recipe.transcendentplasmamixerrecipes")
+ .maxIO(1, 0, 20, 1)
+ .progressBarPos(86, 44)
+ .logoPos(87, 99)
+ .neiRecipeBackgroundSize(170, 118)
+ .neiHandlerInfo(
+ builder -> builder.setDisplayStack(ItemList.Machine_Multi_TranscendentPlasmaMixer.get(1))
+ .setMaxRecipesPerPage(1))
+ .frontend(TranscendentPlasmaMixerFrontend::new)
+ .disableOptimize()
+ .build();
+ public static final RecipeMap<RecipeMapBackend> spaceProjectFakeRecipes = RecipeMapBuilder
+ .of("gt.recipe.fakespaceprojects")
+ .maxIO(12, 0, 4, 0)
+ .neiSpecialInfoFormatter(new SimpleSpecialValueFormatter("GT5U.nei.stages"))
+ .neiRecipeBackgroundOffset(3, 23)
+ .logo(UITexture.fullImage(GTNHIntergalactic.ID, "gui/picture/space_elevator_logo.png"))
+ .logoSize(18, 18)
+ .logoPos(152, 83)
+ .neiTransferRect(70, 28, 18, 72)
+ .neiTransferRect(106, 28, 18, 72)
+ .frontend(SpaceProjectFrontend::new)
+ .disableRenderRealStackSizes()
+ .disableOptimize()
+ .build();
+ /**
+ * Uses {@link GT_RecipeConstants#ADDITIVE_AMOUNT} for coal/charcoal amount.
+ */
+ public static final RecipeMap<RecipeMapBackend> primitiveBlastRecipes = RecipeMapBuilder
+ .of("gt.recipe.primitiveblastfurnace")
+ .maxIO(3, 3, 0, 0)
+ .minInputs(1, 0)
+ .recipeEmitter(builder -> {
+ Optional<GT_Recipe> rr = builder.eut(0)
+ .validateInputCount(1, 2)
+ .validateOutputCount(1, 2)
+ .validateNoInputFluid()
+ .validateNoOutputFluid()
+ .noOptimize()
+ .build();
+ if (!rr.isPresent()) return Collections.emptyList();
+ ItemStack aInput1 = builder.getItemInputBasic(0);
+ ItemStack aInput2 = builder.getItemInputBasic(1);
+ ItemStack aOutput1 = builder.getItemOutput(0);
+ ItemStack aOutput2 = builder.getItemOutput(1);
+ if ((aInput1 == null && aInput2 == null) || (aOutput1 == null && aOutput2 == null))
+ return Collections.emptyList();
+ int aCoalAmount = builder.getMetadataOrDefault(ADDITIVE_AMOUNT, 0);
+ if (aCoalAmount <= 0) return Collections.emptyList();
+ GT_RecipeTemplate coll = asTemplate(rr.get());
+ for (Materials coal : new Materials[] { Materials.Coal, Materials.Charcoal }) {
+ coll.derive()
+ .setInputs(aInput1, aInput2, coal.getGems(aCoalAmount))
+ .setOutputs(aOutput1, aOutput2, Materials.DarkAsh.getDustTiny(aCoalAmount));
+ coll.derive()
+ .setInputs(aInput1, aInput2, coal.getDust(aCoalAmount))
+ .setOutputs(aOutput1, aOutput2, Materials.DarkAsh.getDustTiny(aCoalAmount));
+ }
+ int aDuration = builder.getDuration();
+ if (Railcraft.isModLoaded()) {
+ coll.derive()
+ .setInputs(aInput1, aInput2, RailcraftToolItems.getCoalCoke(aCoalAmount / 2))
+ .setOutputs(aOutput1, aOutput2, Materials.Ash.getDustTiny(aCoalAmount / 2))
+ .setDuration(aDuration * 2 / 3);
+ }
+ if (GTPlusPlus.isModLoaded()) {
+ ItemStack cactusCoke = GT_ModHandler.getModItem(GTPlusPlus.ID, "itemCactusCoke", aCoalAmount * 2L);
+ ItemStack sugarCoke = GT_ModHandler.getModItem(GTPlusPlus.ID, "itemSugarCoke", aCoalAmount * 2L);
+ coll.derive()
+ .setInputs(aInput1, aInput2, cactusCoke)
+ .setOutputs(aOutput1, aOutput2, Materials.Ash.getDustTiny(aCoalAmount * 2))
+ .setDuration(aDuration * 2 / 3);
+ coll.derive()
+ .setInputs(aInput1, aInput2, sugarCoke)
+ .setOutputs(aOutput1, aOutput2, Materials.Ash.getDustTiny(aCoalAmount * 2))
+ .setDuration(aDuration * 2 / 3);
+ }
+ if ((aInput1 == null || aInput1.stackSize <= 6) && (aInput2 == null || aInput2.stackSize <= 6)
+ && (aOutput1 == null || aOutput1.stackSize <= 6)
+ && (aOutput2 == null || aOutput2.stackSize <= 6)) {
+ // we don't use GT_Utility.mul() here. It does not have the truncating we need here.
+ aInput1 = multiplyStack(10, aInput1);
+ aInput2 = multiplyStack(10, aInput2);
+ aOutput1 = multiplyStack(10, aOutput1);
+ aOutput2 = multiplyStack(10, aOutput2);
+ for (Materials coal : new Materials[] { Materials.Coal, Materials.Charcoal }) {
+ coll.derive()
+ .setInputs(aInput1, aInput2, coal.getBlocks(aCoalAmount))
+ .setOutputs(aOutput1, aOutput2, Materials.DarkAsh.getDust(aCoalAmount))
+ .setDuration(aDuration * 10);
+ coll.derive()
+ .setInputs(aInput1, aInput2, coal.getBlocks(aCoalAmount))
+ .setOutputs(aOutput1, aOutput2, Materials.DarkAsh.getDust(aCoalAmount))
+ .setDuration(aDuration * 10);
+ }
+ if (Railcraft.isModLoaded()) {
+ coll.derive()
+ .setInputs(aInput1, aInput2, EnumCube.COKE_BLOCK.getItem(aCoalAmount / 2))
+ .setOutputs(aOutput1, aOutput2, Materials.Ash.getDust(aCoalAmount / 2))
+ .setDuration(aDuration * 20 / 3);
+ }
+ }
+ return coll.getAll();
+ })
+ .recipeConfigFile("primitiveblastfurnace", FIRST_ITEM_INPUT)
+ .build();
+ /**
+ * Uses {@link GT_RecipeConstants#ADDITIVE_AMOUNT} for TNT/ITNT/... amount. Value is truncated to [0, 64]
+ */
+ public static final RecipeMap<RecipeMapBackend> implosionRecipes = RecipeMapBuilder
+ .of("gt.recipe.implosioncompressor")
+ .maxIO(2, 2, 0, 0)
+ .minInputs(2, 0)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (!isFluid && !isOutput) {
+ if (index == 0) {
+ return GT_UITextures.OVERLAY_SLOT_IMPLOSION;
+ }
+ return GT_UITextures.OVERLAY_SLOT_EXPLOSIVE;
+ }
+ return null;
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_COMPRESS)
+ .disableOptimize()
+ .recipeEmitter(b -> {
+ switch (b.getItemInputsBasic().length) {
+ case 0:
+ return Collections.emptyList();
+ case 1:
+ break;
+ default:
+ return b.build()
+ .map(Collections::singletonList)
+ .orElse(Collections.emptyList());
+ }
+ Optional<GT_Recipe> t = b.noOptimize()
+ .duration(20)
+ .eut(30)
+ .validateInputCount(1, 1)
+ .validateOutputCount(1, 2)
+ .build();
+ if (!t.isPresent()) return Collections.emptyList();
+ ItemStack input = b.getItemInputBasic(0);
+ GT_RecipeTemplate coll = asTemplate(t.get());
+ int tExplosives = Math.min(b.getMetadataOrDefault(ADDITIVE_AMOUNT, 0), 64);
+ int tGunpowder = tExplosives << 1; // Worst
+ int tDynamite = Math.max(1, tExplosives >> 1); // good
+ @SuppressWarnings("UnnecessaryLocalVariable")
+ int tTNT = tExplosives; // Slightly better
+ int tITNT = Math.max(1, tExplosives >> 2); // the best
+ if (tGunpowder < 65) coll.derive()
+ .setInputs(input, ItemList.Block_Powderbarrel.get(tGunpowder));
+ if (tDynamite < 17) coll.derive()
+ .setInputs(input, GT_ModHandler.getIC2Item("dynamite", tDynamite, null));
+ coll.derive()
+ .setInputs(input, new ItemStack(Blocks.tnt, tTNT));
+ coll.derive()
+ .setInputs(input, GT_ModHandler.getIC2Item("industrialTnt", tITNT, null));
+ return coll.getAll();
+ })
+ .recipeConfigFile("implosion", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> vacuumFreezerRecipes = RecipeMapBuilder
+ .of("gt.recipe.vacuumfreezer")
+ .maxIO(1, 1, 2, 1)
+ .recipeEmitter(b -> {
+ b.noOptimize();
+ FluidStack in, out;
+ if (isArrayOfLength(b.getItemInputsBasic(), 1) && isArrayOfLength(b.getItemOutputs(), 1)
+ && isArrayEmptyOrNull(b.getFluidInputs())
+ && isArrayEmptyOrNull(b.getFluidOutputs())
+ && (in = getFluidForFilledItem(b.getItemInputBasic(0), true)) != null
+ && (out = getFluidForFilledItem(b.getItemOutput(0), true)) != null) {
+ Collection<GT_Recipe> ret = new ArrayList<>();
+ b.build()
+ .ifPresent(ret::add);
+ b.itemInputs()
+ .itemOutputs()
+ .fluidInputs(in)
+ .fluidOutputs(out)
+ .build()
+ .ifPresent(ret::add);
+ return ret;
+ }
+ return buildOrEmpty(b);
+ })
+ .recipeConfigFile("vacuumfreezer", FIRST_ITEM_INPUT)
+ .build();
+ /**
+ * Using {@code .addTo(chemicalReactorRecipes)} will cause the recipe to be added to single block recipe map ONLY!
+ * Use {@link GT_RecipeConstants#UniversalChemical} to add to both.
+ */
+ public static final RecipeMap<RecipeMapBackend> chemicalReactorRecipes = RecipeMapBuilder
+ .of("gt.recipe.chemicalreactor")
+ .maxIO(2, 2, 1, 1)
+ .minInputs(1, 0)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isFluid) {
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_VIAL_2;
+ }
+ return GT_UITextures.OVERLAY_SLOT_MOLECULAR_3;
+ } else {
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_VIAL_1;
+ }
+ if (index == 0) {
+ return GT_UITextures.OVERLAY_SLOT_MOLECULAR_1;
+ }
+ return GT_UITextures.OVERLAY_SLOT_MOLECULAR_2;
+ }
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .disableOptimize()
+ .recipeConfigFile("chemicalreactor", FIRST_ITEM_OR_FLUID_OUTPUT)
+ .build();
+ /**
+ * Using {@code .addTo(multiblockChemicalReactorRecipes)} will cause the recipe to be added to
+ * multiblock recipe map ONLY! Use {@link GT_RecipeConstants#UniversalChemical} to add to both.
+ */
+ public static final RecipeMap<RecipeMapBackend> multiblockChemicalReactorRecipes = RecipeMapBuilder
+ .of("gt.recipe.largechemicalreactor")
+ .maxIO(6, 6, 6, 6)
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .disableOptimize()
+ .frontend(LargeNEIFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> distillationTowerRecipes = RecipeMapBuilder
+ .of("gt.recipe.distillationtower")
+ .maxIO(2, 1, 1, 11)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (!isOutput) {
+ return null;
+ }
+ if (isFluid) {
+ return GT_UITextures.OVERLAY_SLOTS_NUMBER[index + 1];
+ } else {
+ return GT_UITextures.OVERLAY_SLOTS_NUMBER[0];
+ }
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .logoPos(80, 62)
+ .frontend(DistillationTowerFrontend::new)
+ .disableOptimize()
+ .recipeConfigFile("distillation", FIRST_FLUIDSTACK_INPUT)
+ .build();
+ public static final RecipeMap<OilCrackerBackend> crackingRecipes = RecipeMapBuilder
+ .of("gt.recipe.craker", OilCrackerBackend::new)
+ .maxIO(1, 1, 2, 1)
+ .minInputs(1, 2)
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW_MULTIPLE)
+ .recipeConfigFile("cracking", FIRST_FLUIDSTACK_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> pyrolyseRecipes = RecipeMapBuilder.of("gt.recipe.pyro")
+ .maxIO(2, 1, 1, 1)
+ .minInputs(1, 0)
+ .disableOptimize()
+ .recipeConfigFile("pyrolyse", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> wiremillRecipes = RecipeMapBuilder.of("gt.recipe.wiremill")
+ .maxIO(2, 1, 0, 0)
+ .minInputs(1, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_WIREMILL : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_WIREMILL)
+ .recipeConfigFile("wiremill", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> benderRecipes = RecipeMapBuilder.of("gt.recipe.metalbender")
+ .maxIO(2, 1, 0, 0)
+ .minInputs(2, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_BENDER : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_BENDING)
+ .recipeConfigFile("bender", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> alloySmelterRecipes = RecipeMapBuilder.of("gt.recipe.alloysmelter")
+ .maxIO(2, 1, 0, 0)
+ .minInputs(2, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_FURNACE : null)
+ .slotOverlaysSteam((index, isFluid, isOutput, isSpecial) -> GT_UITextures.OVERLAY_SLOT_FURNACE_STEAM)
+ .progressBarSteam(GT_UITextures.PROGRESSBAR_ARROW_STEAM)
+ .recipeEmitter(b -> {
+ if (Materials.Graphite.contains(b.getItemInputBasic(0))) return Collections.emptyList();
+ if (GT_Utility.isArrayOfLength(b.getItemInputsBasic(), 1)) {
+ ItemStack aInput1 = b.getItemInputBasic(0);
+ if (((OrePrefixes.ingot.contains(aInput1)) || (OrePrefixes.dust.contains(aInput1))
+ || (OrePrefixes.gem.contains(aInput1)))) return Collections.emptyList();
+ }
+ return buildOrEmpty(
+ b.validateNoInputFluid()
+ .validateNoOutputFluid()
+ .validateInputCount(1, 2)
+ .validateOutputCount(1, 1));
+ })
+ // Avoid steam machine being used as handler icon
+ .neiHandlerInfo(builder -> builder.setDisplayStack(ItemList.Machine_LV_AlloySmelter.get(1)))
+ .recipeConfigFile(
+ "alloysmelting",
+ r -> GT_Config.getStackConfigName(GT_Utility.isArrayOfLength(r.mInputs, 1) ? r.mInputs[0] : r.mOutputs[0]))
+ .build();
+ public static final RecipeMap<AssemblerBackend> assemblerRecipes = RecipeMapBuilder
+ .of("gt.recipe.assembler", AssemblerBackend::new)
+ .maxIO(9, 1, 1, 0)
+ .minInputs(1, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CIRCUIT : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_ASSEMBLE)
+ .disableOptimize()
+ .recipeConfigFile("assembling", FIRST_ITEM_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> circuitAssemblerRecipes = RecipeMapBuilder
+ .of("gt.recipe.circuitassembler")
+ .maxIO(6, 1, 1, 0)
+ .minInputs(1, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_CIRCUIT : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_CIRCUIT_ASSEMBLER)
+ .unificateOutputNEI(!NEICustomDiagrams.isModLoaded())
+ .recipeConfigFile("circuitassembler", FIRST_ITEM_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> cannerRecipes = RecipeMapBuilder.of("gt.recipe.canner")
+ .maxIO(2, 2, 0, 0)
+ .minInputs(1, 0)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isOutput) {
+ return null;
+ }
+ if (index == 0) {
+ return GT_UITextures.OVERLAY_SLOT_CANNER;
+ }
+ return GT_UITextures.OVERLAY_SLOT_CANISTER;
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_CANNER)
+ .recipeConfigFile("canning", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> latheRecipes = RecipeMapBuilder.of("gt.recipe.lathe")
+ .maxIO(1, 2, 0, 0)
+ .minInputs(1, 0)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isOutput) {
+ if (index == 0) {
+ return GT_UITextures.OVERLAY_SLOT_ROD_2;
+ }
+ return GT_UITextures.OVERLAY_SLOT_DUST;
+ }
+ return GT_UITextures.OVERLAY_SLOT_ROD_1;
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_LATHE)
+ .addSpecialTexture(98, 24, 5, 18, GT_UITextures.PROGRESSBAR_LATHE_BASE)
+ .recipeConfigFile("lathe", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> cutterRecipes = RecipeMapBuilder.of("gt.recipe.cuttingsaw")
+ .maxIO(2, 4, 1, 0)
+ .minInputs(1, 1)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isFluid) {
+ return null;
+ }
+ if (isOutput) {
+ if (index == 0) {
+ return GT_UITextures.OVERLAY_SLOT_CUTTER_SLICED;
+ }
+ return GT_UITextures.OVERLAY_SLOT_DUST;
+ }
+ return GT_UITextures.OVERLAY_SLOT_BOX;
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_CUT)
+ .recipeEmitter(b -> {
+ b.validateInputCount(1, 2)
+ .validateOutputCount(1, 4)
+ .validateNoOutputFluid();
+ if ((b.getFluidInputs() != null && b.getFluidInputs().length > 0) || !b.isValid())
+ return buildOrEmpty(b.validateInputFluidCount(1, 1));
+ int aDuration = b.getDuration(), aEUt = b.getEUt();
+ Collection<GT_Recipe> ret = new ArrayList<>();
+ b.copy()
+ .fluidInputs(Materials.Water.getFluid(clamp(aDuration * aEUt / 320, 4, 1000)))
+ .duration(aDuration * 2)
+ .build()
+ .ifPresent(ret::add);
+ b.copy()
+ .fluidInputs(GT_ModHandler.getDistilledWater(clamp(aDuration * aEUt / 426, 3, 750)))
+ .duration(aDuration * 2)
+ .build()
+ .ifPresent(ret::add);
+ b.fluidInputs(Materials.Lubricant.getFluid(clamp(aDuration * aEUt / 1280, 1, 250)))
+ .duration(aDuration)
+ .build()
+ .ifPresent(ret::add);
+ return ret;
+ })
+ .recipeConfigFile("cutting", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> slicerRecipes = RecipeMapBuilder.of("gt.recipe.slicer")
+ .maxIO(2, 1, 0, 0)
+ .minInputs(2, 0)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_SLICER_SLICED;
+ }
+ if (index == 0) {
+ return GT_UITextures.OVERLAY_SLOT_SQUARE;
+ }
+ return GT_UITextures.OVERLAY_SLOT_SLICE_SHAPE;
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_SLICE)
+ .recipeConfigFile("slicer", FIRST_ITEM_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> extruderRecipes = RecipeMapBuilder.of("gt.recipe.extruder")
+ .maxIO(2, 1, 0, 0)
+ .minInputs(2, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput,
+ isSpecial) -> !isFluid && !isOutput && index != 0 ? GT_UITextures.OVERLAY_SLOT_EXTRUDER_SHAPE : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_EXTRUDE)
+ .recipeConfigFile("extruder", FIRST_ITEM_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> hammerRecipes = RecipeMapBuilder.of("gt.recipe.hammer")
+ .maxIO(2, 2, 2, 2)
+ .minInputs(1, 0)
+ .slotOverlays(
+ (index, isFluid, isOutput, isSpecial) -> !isFluid && !isOutput ? GT_UITextures.OVERLAY_SLOT_HAMMER : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_HAMMER, ProgressBar.Direction.DOWN)
+ .addSpecialTexture(78, 42, 20, 6, GT_UITextures.PROGRESSBAR_HAMMER_BASE)
+ .slotOverlaysSteam(
+ (index, isFluid, isOutput, isSpecial) -> !isOutput ? GT_UITextures.OVERLAY_SLOT_HAMMER_STEAM : null)
+ .progressBarSteam(GT_UITextures.PROGRESSBAR_HAMMER_STEAM)
+ .addSpecialTextureSteam(78, 42, 20, 6, GT_UITextures.PROGRESSBAR_HAMMER_BASE_STEAM)
+ // Avoid steam machine being used as handler icon
+ .neiHandlerInfo(builder -> builder.setDisplayStack(ItemList.Machine_LV_Hammer.get(1)))
+ .recipeConfigFile("forgehammer", FIRST_ITEM_OUTPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> amplifierRecipes = RecipeMapBuilder.of("gt.recipe.uuamplifier")
+ .maxIO(1, 0, 0, 1)
+ .minInputs(1, 0)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (isFluid) {
+ return GT_UITextures.OVERLAY_SLOT_UUA;
+ }
+ if (!isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_CENTRIFUGE;
+ }
+ return null;
+ })
+ .progressBar(GT_UITextures.PROGRESSBAR_EXTRACT)
+ .recipeConfigFile("amplifier", FIRST_ITEM_INPUT)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> massFabFakeRecipes = RecipeMapBuilder.of("gt.recipe.massfab")
+ .maxIO(1, 0, 1, 1)
+ .minInputs(1, 0)
+ .amperage(8)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (!isFluid) {
+ return null;
+ }
+ if (isOutput) {
+ return GT_UITextures.OVERLAY_SLOT_UUM;
+ }
+ return GT_UITextures.OVERLAY_SLOT_UUA;
+ })
+ .build();
+ public static final RecipeMap<FuelBackend> dieselFuels = RecipeMapBuilder
+ .of("gt.recipe.dieselgeneratorfuel", FuelBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<FuelBackend> extremeDieselFuels = RecipeMapBuilder
+ .of("gt.recipe.extremedieselgeneratorfuel", FuelBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<FuelBackend> gasTurbineFuels = RecipeMapBuilder
+ .of("gt.recipe.gasturbinefuel", FuelBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<FuelBackend> hotFuels = RecipeMapBuilder
+ .of("gt.recipe.thermalgeneratorfuel", FuelBackend::new)
+ .maxIO(1, 4, 0, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<FuelBackend> denseLiquidFuels = RecipeMapBuilder
+ .of("gt.recipe.semifluidboilerfuels", FuelBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .disableRegisterNEI()
+ .build();
+ public static final RecipeMap<FuelBackend> plasmaFuels = RecipeMapBuilder
+ .of("gt.recipe.plasmageneratorfuels", FuelBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<FuelBackend> magicFuels = RecipeMapBuilder
+ .of("gt.recipe.magicfuels", FuelBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<FuelBackend> smallNaquadahReactorFuels = RecipeMapBuilder
+ .of("gt.recipe.smallnaquadahreactor", FuelBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<FuelBackend> largeNaquadahReactorFuels = RecipeMapBuilder
+ .of("gt.recipe.largenaquadahreactor", FuelBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<FuelBackend> hugeNaquadahReactorFuels = RecipeMapBuilder
+ .of("gt.recipe.fluidnaquadahreactor", FuelBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<FuelBackend> extremeNaquadahReactorFuels = RecipeMapBuilder
+ .of("gt.recipe.hugenaquadahreactor", FuelBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<FuelBackend> ultraHugeNaquadahReactorFuels = RecipeMapBuilder
+ .of("gt.recipe.extrahugenaquadahreactor", FuelBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<FuelBackend> fluidNaquadahReactorFuels = RecipeMapBuilder
+ .of("gt.recipe.fluidfuelnaquadahreactor", FuelBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .neiSpecialInfoFormatter(FuelSpecialValueFormatter.INSTANCE)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> electrolyzerNonCellRecipes = RecipeMapBuilder
+ .of("gt.recipe.largeelectrolyzer")
+ .maxIO(1, 6, 1, 6)
+ .disableRegisterNEI()
+ .recipeEmitter(GT_RecipeMapUtil::buildRecipeForMultiblock)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> centrifugeNonCellRecipes = RecipeMapBuilder
+ .of("gt.recipe.largecentrifuge")
+ .maxIO(2, 6, 1, 6)
+ .disableOptimize()
+ .disableRegisterNEI()
+ .recipeEmitter(GT_RecipeMapUtil::buildRecipeForMultiblock)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> mixerNonCellRecipes = RecipeMapBuilder.of("gt.recipe.largemixer")
+ .maxIO(9, 4, 6, 4)
+ .disableOptimize()
+ .disableRegisterNEI()
+ .recipeEmitter(GT_RecipeMapUtil::buildRecipeForMultiblockNoCircuit)
+ .build();
+ public static final RecipeMap<LargeBoilerFuelBackend> largeBoilerFakeFuels = RecipeMapBuilder
+ .of("gt.recipe.largeboilerfakefuels", LargeBoilerFuelBackend::new)
+ .maxIO(1, 1, 0, 0)
+ .minInputs(1, 0)
+ .disableOptimize()
+ .frontend(LargeBoilerFuelFrontend::new)
+ .build();
+ public static final RecipeMap<RecipeMapBackend> nanoForgeRecipes = RecipeMapBuilder.of("gt.recipe.nanoforge")
+ .maxIO(6, 2, 3, 0)
+ .minInputs(2, 1)
+ .slotOverlays(
+ (index, isFluid, isOutput,
+ isSpecial) -> !isFluid && !isOutput && index == 0 ? GT_UITextures.OVERLAY_SLOT_LENS : null)
+ .progressBar(GT_UITextures.PROGRESSBAR_ASSEMBLE)
+ .disableOptimize()
+ .neiSpecialInfoFormatter(new SimpleSpecialValueFormatter("GT5U.nei.tier"))
+ .build();
+ public static final RecipeMap<RecipeMapBackend> pcbFactoryRecipes = RecipeMapBuilder.of("gt.recipe.pcbfactory")
+ .maxIO(6, 9, 3, 0)
+ .minInputs(3, 1)
+ .progressBar(GT_UITextures.PROGRESSBAR_ASSEMBLE)
+ .disableOptimize()
+ .neiRecipeComparator(
+ Comparator
+ .<GT_Recipe, Integer>comparing(recipe -> recipe.getMetadataOrDefault(PCBFactoryTierKey.INSTANCE, 1))
+ .thenComparing(GT_Recipe::compareTo))
+ .build();
+ public static final RecipeMap<RecipeMapBackend> ic2NuclearFakeRecipes = RecipeMapBuilder.of("gt.recipe.ic2nuke")
+ .maxIO(1, 1, 0, 0)
+ .minInputs(1, 0)
+ .disableOptimize()
+ .logo(GT_UITextures.PICTURE_RADIATION_WARNING)
+ .logoPos(152, 41)
+ .neiRecipeBackgroundSize(170, 60)
+ .neiHandlerInfo(builder -> builder.setDisplayStack(GT_ModHandler.getIC2Item("nuclearReactor", 1, null)))
+ .build();
+
+ static {
+ RecipeMaps.centrifugeRecipes.addDownstream(RecipeMaps.centrifugeNonCellRecipes.deepCopyInput());
+ RecipeMaps.mixerRecipes.addDownstream(RecipeMaps.mixerNonCellRecipes.deepCopyInput());
+ RecipeMaps.electrolyzerRecipes.addDownstream(RecipeMaps.electrolyzerNonCellRecipes.deepCopyInput());
+ RecipeMaps.dieselFuels.addDownstream(
+ IRecipeMap.newRecipeMap(
+ b -> b.build()
+ .map(
+ r -> RecipeMaps.largeBoilerFakeFuels.getBackend()
+ .addDieselRecipe(r))
+ .map(Collections::singletonList)
+ .orElse(Collections.emptyList())));
+ RecipeMaps.dieselFuels.addDownstream(IRecipeMap.newRecipeMap(b -> {
+ if (b.getMetadataOrDefault(FUEL_VALUE, 0) < 1500) return Collections.emptyList();
+ return b.addTo(RecipeMaps.extremeDieselFuels);
+ }));
+ RecipeMaps.denseLiquidFuels.addDownstream(
+ IRecipeMap.newRecipeMap(
+ b -> b.build()
+ .map(
+ r -> RecipeMaps.largeBoilerFakeFuels.getBackend()
+ .addDenseLiquidRecipe(r))
+ .map(Collections::singletonList)
+ .orElse(Collections.emptyList())));
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/RecipeMetadataKey.java b/src/main/java/gregtech/api/recipe/RecipeMetadataKey.java
new file mode 100644
index 0000000000..2156421835
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/RecipeMetadataKey.java
@@ -0,0 +1,84 @@
+package gregtech.api.recipe;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import org.jetbrains.annotations.Contract;
+
+import gregtech.api.recipe.metadata.IRecipeMetadataStorage;
+import gregtech.api.util.FieldsAreNonnullByDefault;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+/**
+ * Unique key for the {@link IRecipeMetadataStorage}. It's also responsible for drawing metadata info on NEI.
+ * <p>
+ * You can use {@link gregtech.api.recipe.metadata.SimpleRecipeMetadataKey} if your metadata does not need NEI handling.
+ *
+ * @param <T> Type of the metadata to use.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+@FieldsAreNonnullByDefault
+public abstract class RecipeMetadataKey<T> {
+
+ private static final Set<RecipeMetadataKey<?>> allIdentifiers = new HashSet<>();
+ private final Class<T> clazz;
+ private final String identifier;
+
+ protected RecipeMetadataKey(Class<T> clazz, String identifier) {
+ this.clazz = clazz;
+ this.identifier = identifier;
+ if (allIdentifiers.contains(this)) {
+ throw new IllegalArgumentException(
+ "Cannot register metadata key with exact same properties: " + identifier + "@" + clazz);
+ }
+ allIdentifiers.add(this);
+ }
+
+ /**
+ * Draws info about the metadata.
+ *
+ * @param recipeInfo Object to use for drawing text.
+ * @param value Metadata stored in the recipe. Can be safely {@link #cast}ed to the desired type.
+ */
+ public abstract void drawInfo(RecipeDisplayInfo recipeInfo, @Nullable Object value);
+
+ @Nullable
+ public T cast(@Nullable Object o) {
+ return clazz.cast(o);
+ }
+
+ @Contract("_, !null -> !null")
+ @Nullable
+ public T cast(@Nullable Object o, @Nullable T defaultValue) {
+ T val = cast(o);
+ return val != null ? val : defaultValue;
+ }
+
+ @Override
+ public String toString() {
+ return "RecipeMetadataKey{" + "clazz=" + clazz.getName() + ", identifier=" + identifier + '\'' + '}';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ RecipeMetadataKey<?> that = (RecipeMetadataKey<?>) o;
+
+ if (!clazz.equals(that.clazz)) return false;
+ return identifier.equals(that.identifier);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = clazz.hashCode();
+ result = 31 * result + identifier.hashCode();
+ return result;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/check/CheckRecipeResult.java b/src/main/java/gregtech/api/recipe/check/CheckRecipeResult.java
new file mode 100644
index 0000000000..8af5c58f5e
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/check/CheckRecipeResult.java
@@ -0,0 +1,54 @@
+package gregtech.api.recipe.check;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.network.PacketBuffer;
+
+/**
+ * Class to indicate the result of recipe check in the machine. It doesn't need to be actual result of recipemap check,
+ * but can also be status of whether to start the machine. Examples can be found at {@link CheckRecipeResultRegistry}.
+ * <p>
+ * Sample instance must be registered to {@link CheckRecipeResultRegistry}.
+ */
+public interface CheckRecipeResult {
+
+ /**
+ * @return Unique registry ID
+ */
+ @Nonnull
+ String getID();
+
+ /**
+ * @return If recipe check is successful
+ */
+ boolean wasSuccessful();
+
+ /**
+ * @return Actual text to show on client GUI
+ */
+ @Nonnull
+ String getDisplayString();
+
+ /**
+ * Create new instance to receive packet.
+ */
+ @Nonnull
+ CheckRecipeResult newInstance();
+
+ /**
+ * Encode value to sync.
+ */
+ void encode(@Nonnull PacketBuffer buffer);
+
+ /**
+ * Decode synced value.
+ */
+ void decode(PacketBuffer buffer);
+
+ /**
+ * @return If this message should stay on GUI when the machine is shut down.
+ */
+ default boolean persistsOnShutdown() {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/check/CheckRecipeResultRegistry.java b/src/main/java/gregtech/api/recipe/check/CheckRecipeResultRegistry.java
new file mode 100644
index 0000000000..e141c39a67
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/check/CheckRecipeResultRegistry.java
@@ -0,0 +1,150 @@
+package gregtech.api.recipe.check;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+public final class CheckRecipeResultRegistry {
+
+ private static final Map<String, CheckRecipeResult> registry = new HashMap<>();
+
+ /**
+ * Registers CheckRecipeResult. No duplicated IDs are allowed.
+ *
+ * @param sample Sample object to register
+ */
+ public static void register(CheckRecipeResult sample) {
+ if (isRegistered(sample.getID())) {
+ throw new IllegalStateException(
+ String.format(
+ "ID %s is already registered for %s",
+ sample.getID(),
+ registry.get(sample.getID())
+ .getClass()
+ .getCanonicalName()));
+ }
+ registry.put(sample.getID(), sample);
+ }
+
+ public static CheckRecipeResult getSampleFromRegistry(String id) {
+ if (!isRegistered(id)) {
+ throw new RuntimeException("Unknown id: " + id);
+ }
+ return registry.get(id);
+ }
+
+ public static boolean isRegistered(String id) {
+ return registry.containsKey(id);
+ }
+
+ /**
+ * Successfully found recipe.
+ */
+ @Nonnull
+ public static final CheckRecipeResult SUCCESSFUL = SimpleCheckRecipeResult.ofSuccess("success");
+ /**
+ * All requirements met to generator power.
+ */
+ @Nonnull
+ public static final CheckRecipeResult GENERATING = SimpleCheckRecipeResult.ofSuccess("generating");
+ /**
+ * Cannot find recipe.
+ */
+ @Nonnull
+ public static final CheckRecipeResult NO_RECIPE = SimpleCheckRecipeResult.ofFailure("no_recipe");
+ /**
+ * Cannot process recipe because item output is full.
+ */
+ public static final CheckRecipeResult ITEM_OUTPUT_FULL = SimpleCheckRecipeResult.ofFailure("item_output_full");
+ /**
+ * Cannot process recipe because fluid output is full.
+ */
+ public static final CheckRecipeResult FLUID_OUTPUT_FULL = SimpleCheckRecipeResult.ofFailure("fluid_output_full");
+ /**
+ * Default unknown state.
+ */
+ @Nonnull
+ public static final CheckRecipeResult NONE = SimpleCheckRecipeResult.ofFailure("none");
+ /**
+ * Code crashed.
+ */
+ public static final CheckRecipeResult CRASH = SimpleCheckRecipeResult.ofFailurePersistOnShutdown("crash");
+ /**
+ * Cannot find valid fuel for generator.
+ */
+ @Nonnull
+ public static final CheckRecipeResult NO_FUEL_FOUND = SimpleCheckRecipeResult.ofFailure("no_fuel");
+ /**
+ * Cannot find valid turbine.
+ */
+ @Nonnull
+ public static final CheckRecipeResult NO_TURBINE_FOUND = SimpleCheckRecipeResult.ofFailure("no_turbine");
+ /**
+ * No data sticks found for Assembly Line.
+ */
+ @Nonnull
+ public static final CheckRecipeResult NO_DATA_STICKS = SimpleCheckRecipeResult.ofFailure("no_data_sticks");
+ /**
+ * EU/t overflowed.
+ */
+ @Nonnull
+ public static final CheckRecipeResult POWER_OVERFLOW = SimpleCheckRecipeResult.ofFailure("power_overflow");
+ /**
+ * Progress time overflowed.
+ */
+ @Nonnull
+ public static final CheckRecipeResult DURATION_OVERFLOW = SimpleCheckRecipeResult.ofFailure("duration_overflow");
+ /**
+ * Machine had an internal error
+ */
+ @Nonnull
+ public static final CheckRecipeResult INTERNAL_ERROR = SimpleCheckRecipeResult.ofFailure("internal_error");
+ /** Multiblock ore drill has no drilling fluid */
+ public static final CheckRecipeResult NO_DRILLING_FLUID = SimpleCheckRecipeResult.ofFailure("no_drilling_fluid");
+ /** Multiblock drill is missing mining pipe */
+ public static final CheckRecipeResult MISSING_MINING_PIPE = SimpleCheckRecipeResult.ofFailure("no_mining_pipe");
+ /** Concrete backfiller is out of concrete */
+ public static final CheckRecipeResult BACKFILLER_NO_CONCRETE = SimpleCheckRecipeResult
+ .ofFailure("backfiller_no_concrete");
+
+ /**
+ * Cannot process recipe because the machine cannot handle required EUt.
+ */
+ @Nonnull
+ public static CheckRecipeResult insufficientPower(long required) {
+ return new ResultInsufficientPower(required);
+ }
+
+ /**
+ * Cannot process recipe because the machine cannot handle its heat.
+ */
+ @Nonnull
+ public static CheckRecipeResult insufficientHeat(int required) {
+ return new ResultInsufficientHeat(required);
+ }
+
+ /**
+ * Cannot process recipe because the machine is tiered and its tier is too low.
+ */
+ @Nonnull
+ public static CheckRecipeResult insufficientMachineTier(int required) {
+ return new ResultInsufficientMachineTier(required);
+ }
+
+ /**
+ * Cannot process recipe because the machine doesn't have enough startup power.
+ */
+ @Nonnull
+ public static CheckRecipeResult insufficientStartupPower(int required) {
+ return new ResultInsufficientStartupPower(required);
+ }
+
+ static {
+ register(new SimpleCheckRecipeResult(false, "", false));
+ register(new ResultInsufficientPower(0));
+ register(new ResultInsufficientHeat(0));
+ register(new ResultInsufficientMachineTier(0));
+ register(new ResultInsufficientStartupPower(0));
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/check/ResultInsufficientHeat.java b/src/main/java/gregtech/api/recipe/check/ResultInsufficientHeat.java
new file mode 100644
index 0000000000..26c3530ba3
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/check/ResultInsufficientHeat.java
@@ -0,0 +1,65 @@
+package gregtech.api.recipe.check;
+
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.util.GT_Utility;
+
+public class ResultInsufficientHeat implements CheckRecipeResult {
+
+ private int required;
+
+ ResultInsufficientHeat(int required) {
+ this.required = required;
+ }
+
+ @Override
+ @Nonnull
+ public String getID() {
+ return "insufficient_heat";
+ }
+
+ @Override
+ public boolean wasSuccessful() {
+ return false;
+ }
+
+ @Override
+ @Nonnull
+ public String getDisplayString() {
+ return Objects.requireNonNull(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.insufficient_heat",
+ GT_Utility.formatNumbers(required),
+ HeatingCoilLevel.getDisplayNameFromHeat(required, true)));
+ }
+
+ @Override
+ @Nonnull
+ public CheckRecipeResult newInstance() {
+ return new ResultInsufficientHeat(0);
+ }
+
+ @Override
+ public void encode(@Nonnull PacketBuffer buffer) {
+ buffer.writeVarIntToBuffer(required);
+ }
+
+ @Override
+ public void decode(@Nonnull PacketBuffer buffer) {
+ required = buffer.readVarIntFromBuffer();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ResultInsufficientHeat that = (ResultInsufficientHeat) o;
+ return required == that.required;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/check/ResultInsufficientMachineTier.java b/src/main/java/gregtech/api/recipe/check/ResultInsufficientMachineTier.java
new file mode 100644
index 0000000000..742eb3ef7a
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/check/ResultInsufficientMachineTier.java
@@ -0,0 +1,63 @@
+package gregtech.api.recipe.check;
+
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.util.GT_Utility;
+
+public class ResultInsufficientMachineTier implements CheckRecipeResult {
+
+ private int required;
+
+ ResultInsufficientMachineTier(int required) {
+ this.required = required;
+ }
+
+ @Override
+ @Nonnull
+ public String getID() {
+ return "insufficient_machine_tier";
+ }
+
+ @Override
+ public boolean wasSuccessful() {
+ return false;
+ }
+
+ @Override
+ @Nonnull
+ public String getDisplayString() {
+ return Objects.requireNonNull(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.insufficient_machine_tier",
+ GT_Utility.formatNumbers(required)));
+ }
+
+ @Override
+ @Nonnull
+ public CheckRecipeResult newInstance() {
+ return new ResultInsufficientMachineTier(0);
+ }
+
+ @Override
+ public void encode(@Nonnull PacketBuffer buffer) {
+ buffer.writeVarIntToBuffer(required);
+ }
+
+ @Override
+ public void decode(@Nonnull PacketBuffer buffer) {
+ required = buffer.readVarIntFromBuffer();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ResultInsufficientMachineTier that = (ResultInsufficientMachineTier) o;
+ return required == that.required;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/check/ResultInsufficientPower.java b/src/main/java/gregtech/api/recipe/check/ResultInsufficientPower.java
new file mode 100644
index 0000000000..fdc06c0c07
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/check/ResultInsufficientPower.java
@@ -0,0 +1,64 @@
+package gregtech.api.recipe.check;
+
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.util.GT_Utility;
+
+public class ResultInsufficientPower implements CheckRecipeResult {
+
+ private long required;
+
+ ResultInsufficientPower(long required) {
+ this.required = required;
+ }
+
+ @Override
+ @Nonnull
+ public String getID() {
+ return "insufficient_power";
+ }
+
+ @Override
+ public boolean wasSuccessful() {
+ return false;
+ }
+
+ @Override
+ @Nonnull
+ public String getDisplayString() {
+ return Objects.requireNonNull(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.insufficient_power",
+ GT_Utility.formatNumbers(required),
+ GT_Utility.getColoredTierNameFromVoltage(required)));
+ }
+
+ @Override
+ @Nonnull
+ public CheckRecipeResult newInstance() {
+ return new ResultInsufficientPower(0);
+ }
+
+ @Override
+ public void encode(@Nonnull PacketBuffer buffer) {
+ buffer.writeLong(required);
+ }
+
+ @Override
+ public void decode(@Nonnull PacketBuffer buffer) {
+ required = buffer.readLong();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ResultInsufficientPower that = (ResultInsufficientPower) o;
+ return required == that.required;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/check/ResultInsufficientStartupPower.java b/src/main/java/gregtech/api/recipe/check/ResultInsufficientStartupPower.java
new file mode 100644
index 0000000000..62d2dd1fb2
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/check/ResultInsufficientStartupPower.java
@@ -0,0 +1,63 @@
+package gregtech.api.recipe.check;
+
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.util.GT_Utility;
+
+public class ResultInsufficientStartupPower implements CheckRecipeResult {
+
+ private int required;
+
+ ResultInsufficientStartupPower(int required) {
+ this.required = required;
+ }
+
+ @Override
+ @Nonnull
+ public String getID() {
+ return "insufficient_startup_power";
+ }
+
+ @Override
+ public boolean wasSuccessful() {
+ return false;
+ }
+
+ @Override
+ @Nonnull
+ public String getDisplayString() {
+ return Objects.requireNonNull(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.insufficient_startup_power",
+ GT_Utility.formatNumbers(required)));
+ }
+
+ @Override
+ @Nonnull
+ public CheckRecipeResult newInstance() {
+ return new ResultInsufficientStartupPower(0);
+ }
+
+ @Override
+ public void encode(@Nonnull PacketBuffer buffer) {
+ buffer.writeVarIntToBuffer(required);
+ }
+
+ @Override
+ public void decode(@Nonnull PacketBuffer buffer) {
+ required = buffer.readVarIntFromBuffer();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ResultInsufficientStartupPower that = (ResultInsufficientStartupPower) o;
+ return required == that.required;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/check/SimpleCheckRecipeResult.java b/src/main/java/gregtech/api/recipe/check/SimpleCheckRecipeResult.java
new file mode 100644
index 0000000000..58c85bbe9d
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/check/SimpleCheckRecipeResult.java
@@ -0,0 +1,102 @@
+package gregtech.api.recipe.check;
+
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.util.StatCollector;
+
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+
+/**
+ * Simple implementation of {@link CheckRecipeResult}. You can create new object without registering it.
+ */
+public class SimpleCheckRecipeResult implements CheckRecipeResult {
+
+ private boolean success;
+ private String key;
+ private boolean persistsOnShutdown;
+
+ SimpleCheckRecipeResult(boolean success, String key, boolean persistsOnShutdown) {
+ this.success = success;
+ this.key = key;
+ this.persistsOnShutdown = persistsOnShutdown;
+ }
+
+ @Override
+ public String getID() {
+ return "simple_result";
+ }
+
+ @Override
+ public boolean wasSuccessful() {
+ return success;
+ }
+
+ @Override
+ @Nonnull
+ public String getDisplayString() {
+ return Objects.requireNonNull(StatCollector.translateToLocal("GT5U.gui.text." + key));
+ }
+
+ @Override
+ @Nonnull
+ public CheckRecipeResult newInstance() {
+ return new SimpleCheckRecipeResult(false, "", false);
+ }
+
+ @Override
+ public void encode(@Nonnull PacketBuffer buffer) {
+ buffer.writeBoolean(success);
+ NetworkUtils.writeStringSafe(buffer, key);
+ buffer.writeBoolean(persistsOnShutdown);
+ }
+
+ @Override
+ public void decode(@Nonnull PacketBuffer buffer) {
+ success = buffer.readBoolean();
+ key = NetworkUtils.readStringSafe(buffer);
+ persistsOnShutdown = buffer.readBoolean();
+ }
+
+ @Override
+ public boolean persistsOnShutdown() {
+ return persistsOnShutdown;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ SimpleCheckRecipeResult that = (SimpleCheckRecipeResult) o;
+ return success == that.success && Objects.equals(key, that.key)
+ && persistsOnShutdown == that.persistsOnShutdown;
+ }
+
+ /**
+ * Creates new result with successful state. Add your localized description with `GT5U.gui.text.{key}`.
+ * This is already registered to registry.
+ */
+ @Nonnull
+ public static CheckRecipeResult ofSuccess(String key) {
+ return new SimpleCheckRecipeResult(true, key, false);
+ }
+
+ /**
+ * Creates new result with failed state. Add your localized description with `GT5U.gui.text.{key}`.
+ * This is already registered to registry.
+ */
+ @Nonnull
+ public static CheckRecipeResult ofFailure(String key) {
+ return new SimpleCheckRecipeResult(false, key, false);
+ }
+
+ /**
+ * Creates new result object with failed state that does not get reset on shutdown. Add your localized description
+ * with `GT5U.gui.text.{key}`. This is already registered to registry.
+ */
+ public static CheckRecipeResult ofFailurePersistOnShutdown(String key) {
+ return new SimpleCheckRecipeResult(false, key, true);
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/check/SingleRecipeCheck.java b/src/main/java/gregtech/api/recipe/check/SingleRecipeCheck.java
new file mode 100644
index 0000000000..8683812d84
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/check/SingleRecipeCheck.java
@@ -0,0 +1,405 @@
+package gregtech.api.recipe.check;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.google.common.collect.ImmutableMap;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GT_Utility.ItemId;
+
+/**
+ * Used by machines that are locked to a single recipe, for faster recipe check.
+ * <p>
+ * Computation time will be like these:
+ * <ul>
+ * Normal recipe check:
+ * <ul>
+ * {@link gregtech.api.recipe.FindRecipeQuery#find Find recipe from recipemap}: O(NCR)
+ * where N = number of machine inputs, C = average amount of recipe candidates found for specific input,
+ * R = computation time to {@link GT_Recipe#isRecipeInputEqual check if inputs match to recipe}
+ * </ul>
+ * <ul>
+ * {@link GT_Recipe#isRecipeInputEqual Check if inputs match to recipe}: O(NM)
+ * where N = number of machine inputs, M = number of recipe inputs
+ * </ul>
+ * </ul>
+ * <ul>
+ * {@link #checkRecipeInputs Single recipe check}: O(N + M)
+ * where N = number of machine inputs, M = number of recipe inputs
+ * </ul>
+ */
+public class SingleRecipeCheck {
+
+ @Nonnull
+ private final GT_Recipe recipe;
+ @Nonnull
+ private final RecipeMap<?> recipeMap;
+ @Nonnull
+ private final ImmutableMap<ItemId, Integer> itemCost;
+ @Nonnull
+ private final ImmutableMap<Fluid, Integer> fluidCost;
+
+ private final int totalItemCost;
+ private final int totalFluidCost;
+
+ private SingleRecipeCheck(@Nonnull GT_Recipe recipe, @Nonnull RecipeMap<?> recipeMap,
+ @Nonnull ImmutableMap<ItemId, Integer> itemCost, @Nonnull ImmutableMap<Fluid, Integer> fluidCost) {
+ this.recipe = recipe;
+ this.recipeMap = recipeMap;
+ this.itemCost = itemCost;
+ this.fluidCost = fluidCost;
+
+ this.totalItemCost = itemCost.values()
+ .stream()
+ .mapToInt(Integer::intValue)
+ .sum();
+ this.totalFluidCost = fluidCost.values()
+ .stream()
+ .mapToInt(Integer::intValue)
+ .sum();
+ }
+
+ @Nonnull
+ public GT_Recipe getRecipe() {
+ return recipe;
+ }
+
+ @Nonnull
+ public RecipeMap<?> getRecipeMap() {
+ return recipeMap;
+ }
+
+ /**
+ * Returns the number of parallel recipes, or 0 if recipe is not satisfied at all.
+ */
+ public int checkRecipeInputs(boolean consumeInputs, int maxParallel, ItemStack[] itemInputs,
+ FluidStack[] fluidInputs) {
+ int currentParallel = maxParallel;
+
+ if (totalItemCost > 0) {
+ // Create map for item -> stored amount
+ Map<ItemId, Integer> itemMap = new HashMap<>();
+ for (ItemStack itemStack : itemInputs) {
+ if (itemStack == null) continue;
+ itemMap.merge(ItemId.createNoCopy(itemStack), itemStack.stackSize, Integer::sum);
+ }
+
+ // Check how many parallels can it perform for each item
+ for (Map.Entry<ItemId, Integer> costEntry : itemCost.entrySet()) {
+ currentParallel = Math
+ .min(currentParallel, itemMap.getOrDefault(costEntry.getKey(), 0) / costEntry.getValue());
+ if (currentParallel <= 0) {
+ return 0;
+ }
+ }
+ }
+
+ if (totalFluidCost > 0) {
+ // Create map for fluid -> stored amount
+ Map<Fluid, Integer> fluidMap = new HashMap<>();
+ for (FluidStack fluidStack : fluidInputs) {
+ if (fluidStack == null) continue;
+ fluidMap.merge(fluidStack.getFluid(), fluidStack.amount, Integer::sum);
+ }
+
+ // Check how many parallels can it perform for each fluid
+ for (Map.Entry<Fluid, Integer> costEntry : fluidCost.entrySet()) {
+ currentParallel = Math
+ .min(currentParallel, fluidMap.getOrDefault(costEntry.getKey(), 0) / costEntry.getValue());
+ if (currentParallel <= 0) {
+ return 0;
+ }
+ }
+ }
+
+ final int finalParallel = currentParallel;
+ if (consumeInputs) {
+ if (totalItemCost > 0) {
+ int remainingItemCost = totalItemCost * finalParallel;
+ Map<ItemId, Integer> runningItemCost = itemCost.entrySet()
+ .stream()
+ .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue() * finalParallel));
+
+ for (ItemStack itemStack : itemInputs) {
+ if (itemStack == null) continue;
+ ItemId key = ItemId.createNoCopy(itemStack);
+ int runningCost = runningItemCost.getOrDefault(key, 0);
+ int paid = Math.min(itemStack.stackSize, runningCost);
+ itemStack.stackSize -= paid;
+ runningItemCost.put(key, runningCost - paid);
+
+ remainingItemCost -= paid;
+ // If all item costs are paid, we don't need to iterate inputs furthermore
+ if (remainingItemCost <= 0) {
+ break;
+ }
+ }
+ }
+
+ if (totalFluidCost > 0) {
+ int remainingFluidCost = totalFluidCost * finalParallel;
+ Map<Fluid, Integer> runningFluidCost = fluidCost.entrySet()
+ .stream()
+ .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue() * finalParallel));
+
+ for (FluidStack fluidStack : fluidInputs) {
+ if (fluidStack == null) continue;
+ Fluid key = fluidStack.getFluid();
+ int runningCost = runningFluidCost.getOrDefault(key, 0);
+ int paid = Math.min(fluidStack.amount, runningCost);
+ fluidStack.amount -= paid;
+ runningFluidCost.put(key, runningCost - paid);
+
+ remainingFluidCost -= paid;
+ // If all fluid costs are paid, we don't need to iterate inputs furthermore
+ if (remainingFluidCost <= 0) {
+ break;
+ }
+ }
+ }
+ }
+
+ return finalParallel;
+ }
+
+ public NBTTagCompound writeToNBT() {
+ // Here we encode recipe input, output and all other important values.
+ // At load time we do a recipe check again, so in case the recipe is gone, we can stop tracking.
+ // Of course the next step would be auto migrating to new recipe (if any), but given
+ // we don't yet have a mean to uniquely name a recipe, this will have to make do.
+ // Consider move serialization code to GT_Recipe once this has been proven to work
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setString("recipemap", recipeMap.unlocalizedName);
+ if (recipe.mInputs != null) {
+ tag.setTag("inputs", writeList(recipe.mInputs, GT_Utility::saveItem));
+ }
+ if (recipe.mOutputs != null) {
+ tag.setTag("outputs", writeList(recipe.mOutputs, GT_Utility::saveItem));
+ }
+ if (recipe.mChances != null) {
+ tag.setIntArray("chances", recipe.mChances);
+ }
+ if (recipe.mFluidInputs != null) {
+ tag.setTag(
+ "fInputs",
+ writeList(
+ recipe.mFluidInputs,
+ s -> s == null ? new NBTTagCompound() : s.writeToNBT(new NBTTagCompound())));
+ }
+ if (recipe.mFluidOutputs != null) {
+ tag.setTag(
+ "fOutputs",
+ writeList(
+ recipe.mFluidOutputs,
+ s -> s == null ? new NBTTagCompound() : s.writeToNBT(new NBTTagCompound())));
+ }
+ tag.setInteger("eut", recipe.mEUt);
+ tag.setInteger("duration", recipe.mDuration);
+ tag.setInteger("specialValue", recipe.mSpecialValue);
+ tag.setTag("itemCost", writeList(itemCost.entrySet(), e -> {
+ NBTTagCompound ret = new NBTTagCompound();
+ ret.setTag(
+ "id",
+ e.getKey()
+ .writeToNBT());
+ ret.setInteger("count", e.getValue());
+ return ret;
+ }));
+ tag.setTag("fluidCost", writeList(fluidCost.entrySet(), e -> {
+ NBTTagCompound ret = new NBTTagCompound();
+ ret.setString(
+ "id",
+ e.getKey()
+ .getName());
+ ret.setInteger("count", e.getValue());
+ return ret;
+ }));
+ return tag;
+ }
+
+ private static <T, NBT extends NBTBase> NBTTagList writeList(T[] arr, Function<T, NBT> ser) {
+ return writeList(Arrays.asList(arr), ser);
+ }
+
+ private static <T, NBT extends NBTBase> NBTTagList writeList(Collection<T> arr, Function<T, NBT> ser) {
+ NBTTagList l = new NBTTagList();
+ for (T t : arr) {
+ l.appendTag(ser.apply(t));
+ }
+ return l;
+ }
+
+ @Nullable
+ public static SingleRecipeCheck tryLoad(RecipeMap<?> recipeMap, NBTTagCompound tag) {
+ if (tag == null || tag.hasNoTags()) return null;
+
+ RecipeMap<?> mapToUse;
+ if (tag.hasKey("recipemap")) {
+ String mapName = tag.getString("recipemap");
+ RecipeMap<?> foundMap = RecipeMap.ALL_RECIPE_MAPS.get(mapName);
+ if (foundMap != null) {
+ mapToUse = foundMap;
+ } else {
+ mapToUse = recipeMap;
+ }
+ } else {
+ mapToUse = recipeMap;
+ }
+ if (mapToUse == null) {
+ return null;
+ }
+
+ GT_Recipe foundRecipe = tryFindRecipe(mapToUse, tag);
+ if (foundRecipe == null) return null;
+ return new SingleRecipeCheck(foundRecipe, mapToUse, loadItemCost(tag), loadFluidCost(tag));
+ }
+
+ private static ImmutableMap<Fluid, Integer> loadFluidCost(NBTTagCompound tag) {
+ return GT_Utility.streamCompounds(tag.getTagList("fluidCost", Constants.NBT.TAG_COMPOUND))
+ .collect(
+ GT_Utility
+ .toImmutableMapSerial(t -> FluidRegistry.getFluid(t.getString("id")), t -> t.getInteger("count")));
+ }
+
+ private static ImmutableMap<ItemId, Integer> loadItemCost(NBTTagCompound tag) {
+ return GT_Utility.streamCompounds(tag.getTagList("itemCost", Constants.NBT.TAG_COMPOUND))
+ .collect(
+ GT_Utility
+ .toImmutableMapSerial(t -> ItemId.create(t.getCompoundTag("id")), t -> t.getInteger("count")));
+ }
+
+ private static GT_Recipe tryFindRecipe(@Nonnull RecipeMap<?> recipeMap, NBTTagCompound tag) {
+ ItemStack[] inputs = GT_Utility.streamCompounds(tag.getTagList("inputs", Constants.NBT.TAG_COMPOUND))
+ .map(GT_Utility::loadItem)
+ .toArray(ItemStack[]::new);
+ ItemStack[] outputs = GT_Utility.streamCompounds(tag.getTagList("outputs", Constants.NBT.TAG_COMPOUND))
+ .map(GT_Utility::loadItem)
+ .toArray(ItemStack[]::new);
+ FluidStack[] fInputs = GT_Utility.streamCompounds(tag.getTagList("fInputs", Constants.NBT.TAG_COMPOUND))
+ .map(FluidStack::loadFluidStackFromNBT)
+ .toArray(FluidStack[]::new);
+ FluidStack[] fOutputs = GT_Utility.streamCompounds(tag.getTagList("fOutputs", Constants.NBT.TAG_COMPOUND))
+ .map(FluidStack::loadFluidStackFromNBT)
+ .toArray(FluidStack[]::new);
+ int eut = tag.getInteger("eut");
+ GT_Recipe found = recipeMap.findRecipe(null, false, GT_Values.V[GT_Utility.getTier(eut)], fInputs, inputs);
+ int[] chances = tag.getIntArray("chances");
+ if (chances.length == 0) chances = null;
+ if (found == null || !GT_Utility.equals(inputs, found.mInputs)
+ || !Arrays.equals(fInputs, found.mFluidInputs)
+ || !GT_Utility.equals(outputs, found.mOutputs)
+ || !Arrays.equals(fOutputs, found.mFluidOutputs)
+ || !Arrays.equals(chances, found.mChances)
+ || found.mDuration != tag.getInteger("duration")
+ || found.mEUt != eut
+ || found.mSpecialValue != tag.getInteger("specialValue")) return null;
+ return found;
+ }
+
+ private static ImmutableMap<ItemId, Integer> buildItemMap(ItemStack[] inputs) {
+ Map<ItemId, Integer> itemMap = new HashMap<>();
+ for (ItemStack itemStack : inputs) {
+ if (itemStack == null) continue;
+ itemMap.merge(ItemId.create(itemStack), itemStack.stackSize, Integer::sum);
+ }
+ return ImmutableMap.copyOf(itemMap);
+ }
+
+ private static ImmutableMap<Fluid, Integer> buildFluidMap(FluidStack[] fluids) {
+ Map<Fluid, Integer> fluidMap = new HashMap<>();
+ for (FluidStack fluidStack : fluids) {
+ if (fluidStack == null) continue;
+ fluidMap.merge(fluidStack.getFluid(), fluidStack.amount, Integer::sum);
+ }
+ return ImmutableMap.copyOf(fluidMap);
+ }
+
+ public static Builder builder(@Nonnull RecipeMap<?> recipeMap) {
+ return new Builder(Objects.requireNonNull(recipeMap));
+ }
+
+ public static class Builder {
+
+ private final RecipeMap<?> recipeMap;
+
+ // In order to compute which items and fluids are consumed by the recipe, we compare the
+ // multi-block's items and fluids before and after inputs are consumed by the recipe.
+ private Map<ItemId, Integer> beforeItems;
+ private Map<Fluid, Integer> beforeFluids;
+ private Map<ItemId, Integer> afterItems;
+ private Map<Fluid, Integer> afterFluids;
+
+ private GT_Recipe recipe;
+
+ private Builder(@Nonnull RecipeMap<?> recipeMap) {
+ this.recipeMap = recipeMap;
+ }
+
+ public Builder setBefore(ItemStack[] inputs, FluidStack[] fluids) {
+ beforeItems = buildItemMap(inputs);
+ beforeFluids = buildFluidMap(fluids);
+ return this;
+ }
+
+ public Builder setAfter(ItemStack[] inputs, FluidStack[] fluids) {
+ afterItems = buildItemMap(inputs);
+ afterFluids = buildFluidMap(fluids);
+ return this;
+ }
+
+ public Builder setRecipe(@Nonnull GT_Recipe recipe) {
+ this.recipe = recipe;
+ return this;
+ }
+
+ private ImmutableMap<ItemId, Integer> buildItemCost() {
+ ImmutableMap.Builder<ItemId, Integer> itemCostBuilder = ImmutableMap.builder();
+ for (Map.Entry<ItemId, Integer> entry : beforeItems.entrySet()) {
+ int cost = entry.getValue() - afterItems.getOrDefault(entry.getKey(), 0);
+ if (cost > 0) {
+ itemCostBuilder.put(entry.getKey(), cost);
+ }
+ }
+ return itemCostBuilder.build();
+ }
+
+ private ImmutableMap<Fluid, Integer> buildFluidCost() {
+ ImmutableMap.Builder<Fluid, Integer> fluidCostBuilder = ImmutableMap.builder();
+ for (Map.Entry<Fluid, Integer> entry : beforeFluids.entrySet()) {
+ int cost = entry.getValue() - afterFluids.getOrDefault(entry.getKey(), 0);
+ if (cost > 0) {
+ fluidCostBuilder.put(entry.getKey(), cost);
+ }
+ }
+ return fluidCostBuilder.build();
+ }
+
+ public SingleRecipeCheck build() {
+ if (recipe == null) {
+ throw new IllegalStateException("recipe is not set");
+ }
+ return new SingleRecipeCheck(recipe, recipeMap, buildItemCost(), buildFluidCost());
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/AssemblerBackend.java b/src/main/java/gregtech/api/recipe/maps/AssemblerBackend.java
new file mode 100644
index 0000000000..cfa25e9fe2
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/AssemblerBackend.java
@@ -0,0 +1,35 @@
+package gregtech.api.recipe.maps;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class AssemblerBackend extends RecipeMapBackend {
+
+ public AssemblerBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ super(propertiesBuilder);
+ }
+
+ @Override
+ protected GT_Recipe modifyFoundRecipe(GT_Recipe recipe, ItemStack[] items, FluidStack[] fluids,
+ @Nullable ItemStack specialSlot) {
+ for (ItemStack item : items) {
+ if (ItemList.Paper_Printed_Pages.isStackEqual(item, false, true)) {
+ recipe = recipe.copy();
+ recipe.mCanBeBuffered = false;
+ recipe.mOutputs[0].setTagCompound(item.getTagCompound());
+ }
+ }
+ return recipe;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/AssemblyLineFrontend.java b/src/main/java/gregtech/api/recipe/maps/AssemblyLineFrontend.java
new file mode 100644
index 0000000000..3d56c96b82
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/AssemblyLineFrontend.java
@@ -0,0 +1,76 @@
+package gregtech.api.recipe.maps;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Supplier;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class AssemblyLineFrontend extends RecipeMapFrontend {
+
+ public AssemblyLineFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return UIHelper.getGridPositions(itemInputCount, 16, 8, 4);
+ }
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return Collections.singletonList(new Pos2d(142, 8));
+ }
+
+ @Override
+ public Pos2d getSpecialItemPosition() {
+ return new Pos2d(142, 44);
+ }
+
+ @Override
+ public List<Pos2d> getFluidInputPositions(int fluidInputCount) {
+ return UIHelper.getGridPositions(fluidInputCount, 106, 8, 1);
+ }
+
+ @Override
+ public void addProgressBar(ModularWindow.Builder builder, Supplier<Float> progressSupplier, Pos2d windowOffset) {
+ int bar1Width = 17;
+ int bar2Width = 18;
+ List<Supplier<Float>> splitProgress = splitProgress(progressSupplier, bar1Width, bar2Width);
+ builder.widget(
+ new ProgressBar().setTexture(GT_UITextures.PROGRESSBAR_ASSEMBLY_LINE_1, bar1Width)
+ .setDirection(ProgressBar.Direction.RIGHT)
+ .setProgress(splitProgress.get(0))
+ .setSynced(false, false)
+ .setPos(new Pos2d(88, 8).add(windowOffset))
+ .setSize(bar1Width, 72));
+ builder.widget(
+ new ProgressBar().setTexture(GT_UITextures.PROGRESSBAR_ASSEMBLY_LINE_2, bar2Width)
+ .setDirection(ProgressBar.Direction.RIGHT)
+ .setProgress(splitProgress.get(1))
+ .setSynced(false, false)
+ .setPos(new Pos2d(124, 8).add(windowOffset))
+ .setSize(bar2Width, 72));
+ builder.widget(
+ new ProgressBar().setTexture(GT_UITextures.PROGRESSBAR_ASSEMBLY_LINE_3, 18)
+ .setDirection(ProgressBar.Direction.UP)
+ .setProgress(progressSupplier)
+ .setSynced(false, false)
+ .setPos(new Pos2d(146, 26).add(windowOffset))
+ .setSize(10, 18));
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/DistillationTowerFrontend.java b/src/main/java/gregtech/api/recipe/maps/DistillationTowerFrontend.java
new file mode 100644
index 0000000000..b061d10d55
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/DistillationTowerFrontend.java
@@ -0,0 +1,38 @@
+package gregtech.api.recipe.maps;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class DistillationTowerFrontend extends RecipeMapFrontend {
+
+ public DistillationTowerFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return Collections.singletonList(new Pos2d(106, 62));
+ }
+
+ @Override
+ public List<Pos2d> getFluidOutputPositions(int fluidOutputCount) {
+ List<Pos2d> results = new ArrayList<>();
+ for (int i = 1; i < fluidOutputCount + 1; i++) {
+ results.add(new Pos2d(106 + (i % 3) * 18, 62 - (i / 3) * 18));
+ }
+ return results;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/FluidCannerBackend.java b/src/main/java/gregtech/api/recipe/maps/FluidCannerBackend.java
new file mode 100644
index 0000000000..e5681f59aa
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/FluidCannerBackend.java
@@ -0,0 +1,73 @@
+package gregtech.api.recipe.maps;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class FluidCannerBackend extends RecipeMapBackend {
+
+ public FluidCannerBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ super(propertiesBuilder);
+ }
+
+ @Override
+ protected GT_Recipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) {
+ if (items.length == 0 || items[0] == null) {
+ return null;
+ }
+
+ if (fluids.length > 0 && fluids[0] != null) {
+ ItemStack filledItem = GT_Utility.fillFluidContainer(fluids[0], items[0], false, true);
+ FluidStack fluidToTake = GT_Utility.getFluidForFilledItem(filledItem, true);
+ if (fluidToTake != null) {
+ return GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, items[0]))
+ .itemOutputs(filledItem)
+ .fluidInputs(fluidToTake)
+ .duration(Math.max(fluidToTake.amount / 64, 16))
+ .eut(1)
+ .noOptimize()
+ .noBuffer()
+ .build()
+ .orElse(null);
+ }
+ }
+ FluidStack drainedFluid = GT_Utility.getFluidForFilledItem(items[0], true);
+ if (drainedFluid != null) {
+ return GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, items[0]))
+ .itemOutputs(GT_Utility.getContainerItem(items[0], true))
+ .fluidOutputs(drainedFluid)
+ .duration(Math.max(drainedFluid.amount / 64, 16))
+ .eut(1)
+ .noBuffer()
+ .build()
+ .orElse(null);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean containsInput(ItemStack item) {
+ return super.containsInput(item) || (item.getItem() instanceof IFluidContainerItem
+ && ((IFluidContainerItem) item.getItem()).getCapacity(item) > 0);
+ }
+
+ @Override
+ public boolean containsInput(Fluid fluid) {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/FluidOnlyFrontend.java b/src/main/java/gregtech/api/recipe/maps/FluidOnlyFrontend.java
new file mode 100644
index 0000000000..8b37f6388c
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/FluidOnlyFrontend.java
@@ -0,0 +1,33 @@
+package gregtech.api.recipe.maps;
+
+import java.util.List;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+
+/**
+ * Display fluids where normally items are placed on NEI.
+ */
+@MethodsReturnNonnullByDefault
+public class FluidOnlyFrontend extends RecipeMapFrontend {
+
+ public FluidOnlyFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ public List<Pos2d> getFluidInputPositions(int fluidInputCount) {
+ return UIHelper.getItemInputPositions(fluidInputCount);
+ }
+
+ @Override
+ public List<Pos2d> getFluidOutputPositions(int fluidOutputCount) {
+ return UIHelper.getItemOutputPositions(fluidOutputCount);
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/FormingPressBackend.java b/src/main/java/gregtech/api/recipe/maps/FormingPressBackend.java
new file mode 100644
index 0000000000..ce3ea3e89c
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/FormingPressBackend.java
@@ -0,0 +1,92 @@
+package gregtech.api.recipe.maps;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Special Class for Forming Press handling.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class FormingPressBackend extends RecipeMapBackend {
+
+ public FormingPressBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ super(propertiesBuilder);
+ }
+
+ @Override
+ protected GT_Recipe modifyFoundRecipe(GT_Recipe recipe, ItemStack[] items, FluidStack[] fluids,
+ @Nullable ItemStack specialSlot) {
+ for (ItemStack mold : items) {
+ if (ItemList.Shape_Mold_Credit.isStackEqual(mold, false, true)) {
+ NBTTagCompound nbt = mold.getTagCompound();
+ if (nbt == null) nbt = new NBTTagCompound();
+ if (!nbt.hasKey("credit_security_id")) nbt.setLong("credit_security_id", System.nanoTime());
+ mold.setTagCompound(nbt);
+
+ recipe = recipe.copy();
+ recipe.mCanBeBuffered = false;
+ recipe.mOutputs[0].setTagCompound(nbt);
+ return recipe;
+ }
+ }
+ return recipe;
+ }
+
+ @Override
+ protected GT_Recipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) {
+ if (items.length < 2) {
+ return null;
+ }
+ return findRenamingRecipe(items);
+ }
+
+ @Nullable
+ private GT_Recipe findRenamingRecipe(ItemStack[] inputs) {
+ ItemStack mold = findNameMoldIndex(inputs);
+ if (mold == null) return null;
+ ItemStack input = findStackToRename(inputs, mold);
+ if (input == null) return null;
+ ItemStack output = GT_Utility.copyAmount(1, input);
+ if (output == null) return null;
+ output.setStackDisplayName(mold.getDisplayName());
+ return GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(0, mold), GT_Utility.copyAmount(1, input))
+ .itemOutputs(output)
+ .duration(128)
+ .eut(8)
+ .noBuffer()
+ .nbtSensitive()
+ .build()
+ .orElse(null);
+ }
+
+ @Nullable
+ private ItemStack findNameMoldIndex(ItemStack[] inputs) {
+ for (ItemStack stack : inputs) {
+ if (ItemList.Shape_Mold_Name.isStackEqual(stack, false, true)) return stack;
+ }
+ return null;
+ }
+
+ @Nullable
+ private ItemStack findStackToRename(ItemStack[] inputs, ItemStack mold) {
+ for (ItemStack stack : inputs) {
+ if (stack == mold || stack == null) continue;
+ return stack;
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/FuelBackend.java b/src/main/java/gregtech/api/recipe/maps/FuelBackend.java
new file mode 100644
index 0000000000..49c989e174
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/FuelBackend.java
@@ -0,0 +1,75 @@
+package gregtech.api.recipe.maps;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class FuelBackend extends RecipeMapBackend {
+
+ private final Map<String, GT_Recipe> recipesByFluidInput = new HashMap<>();
+
+ public FuelBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ super(propertiesBuilder.disableOptimize());
+ }
+
+ @Override
+ protected Collection<GT_Recipe> doAdd(GT_RecipeBuilder builder) {
+ if (builder.getDuration() == -1) {
+ builder.duration(0);
+ }
+ if (builder.getEUt() == -1) {
+ builder.eut(0);
+ }
+ return super.doAdd(builder);
+ }
+
+ @Override
+ public GT_Recipe compileRecipe(GT_Recipe recipe) {
+ super.compileRecipe(recipe);
+ if (recipe.mInputs != null && GT_Utility.getNonnullElementCount(recipe.mInputs) == 1
+ && (recipe.mFluidInputs == null || GT_Utility.getNonnullElementCount(recipe.mFluidInputs) == 0)) {
+ FluidStack fluidStack = GT_Utility.getFluidForFilledItem(recipe.mInputs[0], true);
+ if (fluidStack != null) {
+ fluidStack.amount = 0;
+ recipesByFluidInput.put(
+ fluidStack.getFluid()
+ .getName(),
+ recipe);
+ }
+ } else if ((recipe.mInputs == null || GT_Utility.getNonnullElementCount(recipe.mInputs) == 0)
+ && recipe.mFluidInputs != null
+ && GT_Utility.getNonnullElementCount(recipe.mFluidInputs) >= 1
+ && recipe.mFluidInputs[0] != null) {
+ recipesByFluidInput.put(
+ recipe.mFluidInputs[0].getFluid()
+ .getName(),
+ recipe);
+ }
+ return recipe;
+ }
+
+ @Nullable
+ public GT_Recipe findFuel(FluidStack fluidStack) {
+ return findFuel(fluidStack.getFluid());
+ }
+
+ @Nullable
+ public GT_Recipe findFuel(Fluid fluid) {
+ return recipesByFluidInput.get(fluid.getName());
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/FurnaceBackend.java b/src/main/java/gregtech/api/recipe/maps/FurnaceBackend.java
new file mode 100644
index 0000000000..c4095eeb4e
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/FurnaceBackend.java
@@ -0,0 +1,52 @@
+package gregtech.api.recipe.maps;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Special Class for Furnace Recipe handling.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class FurnaceBackend extends NonGTBackend {
+
+ public FurnaceBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ super(propertiesBuilder);
+ }
+
+ @Override
+ protected GT_Recipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot,
+ @Nullable GT_Recipe cachedRecipe) {
+ if (items.length == 0 || items[0] == null) {
+ return null;
+ }
+ if (cachedRecipe != null && cachedRecipe.isRecipeInputEqual(false, true, fluids, items)) {
+ return cachedRecipe;
+ }
+ ItemStack output = GT_ModHandler.getSmeltingOutput(items[0], false, null);
+ return output == null ? null
+ : GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, items[0]))
+ .itemOutputs(output)
+ .duration(128)
+ .eut(4)
+ .noOptimize()
+ .build()
+ .orElse(null);
+ }
+
+ @Override
+ public boolean containsInput(ItemStack item) {
+ return GT_ModHandler.getSmeltingOutput(item, false, null) != null;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/LargeBoilerFuelBackend.java b/src/main/java/gregtech/api/recipe/maps/LargeBoilerFuelBackend.java
new file mode 100644
index 0000000000..53152312f4
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/LargeBoilerFuelBackend.java
@@ -0,0 +1,132 @@
+package gregtech.api.recipe.maps;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+@SuppressWarnings({ "unused", "UnusedReturnValue" })
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class LargeBoilerFuelBackend extends RecipeMapBackend {
+
+ private static boolean addedGeneralDesc = false;
+
+ private static final List<String> ALLOWED_SOLID_FUELS = Arrays.asList(
+ GregTech_API.sMachineFile.mConfig.getStringList(
+ "LargeBoiler.allowedFuels",
+ ConfigCategories.machineconfig.toString(),
+ new String[] { "gregtech:gt.blockreinforced:6", "gregtech:gt.blockreinforced:7" },
+ "Allowed fuels for the Large Titanium Boiler and Large Tungstensteel Boiler"));
+
+ public LargeBoilerFuelBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ super(propertiesBuilder);
+ }
+
+ public static boolean isAllowedSolidFuel(ItemStack stack) {
+ return isAllowedSolidFuel(Item.itemRegistry.getNameForObject(stack.getItem()), stack.getItemDamage());
+ }
+
+ public static boolean isAllowedSolidFuel(String itemRegistryName, int meta) {
+ return ALLOWED_SOLID_FUELS.contains(itemRegistryName + ":" + meta);
+ }
+
+ public static boolean addAllowedSolidFuel(ItemStack stack) {
+ return addAllowedSolidFuel(Item.itemRegistry.getNameForObject(stack.getItem()), stack.getItemDamage());
+ }
+
+ public static boolean addAllowedSolidFuel(String itemregistryName, int meta) {
+ return ALLOWED_SOLID_FUELS.add(itemregistryName + ":" + meta);
+ }
+
+ public GT_Recipe addDenseLiquidRecipe(GT_Recipe recipe) {
+ return addRecipe(recipe, ((double) recipe.mSpecialValue) / 10, false);
+ }
+
+ public GT_Recipe addDieselRecipe(GT_Recipe recipe) {
+ return addRecipe(recipe, ((double) recipe.mSpecialValue) / 40, false);
+ }
+
+ public void addSolidRecipes(ItemStack... itemStacks) {
+ for (ItemStack itemStack : itemStacks) {
+ addSolidRecipe(itemStack);
+ }
+ }
+
+ @Nullable
+ public GT_Recipe addSolidRecipe(@Nullable ItemStack fuelItemStack) {
+ if (fuelItemStack == null) {
+ return null;
+ }
+ if (!addedGeneralDesc) {
+ GT_Values.RA.stdBuilder()
+ .duration(1)
+ .eut(1)
+ .specialValue(1)
+ .setNEIDesc(
+ "Not all solid fuels are listed.",
+ "Any item that burns in a",
+ "vanilla furnace will burn in",
+ "a Large Bronze or Steel Boiler.")
+ .build()
+ .map(this::compileRecipe);
+ addedGeneralDesc = true;
+ }
+
+ String registryName = Item.itemRegistry.getNameForObject(fuelItemStack.getItem());
+ boolean isHighTierAllowed = ALLOWED_SOLID_FUELS.contains(registryName + ":" + fuelItemStack.getItemDamage());
+ return GT_Values.RA.stdBuilder()
+ .itemInputs(fuelItemStack)
+ .duration(1)
+ .eut(0)
+ .specialValue(GT_ModHandler.getFuelValue(fuelItemStack) / 1600)
+ .build()
+ .map(r -> addRecipe(r, ((double) GT_ModHandler.getFuelValue(fuelItemStack)) / 1600, isHighTierAllowed))
+ .orElse(null);
+ }
+
+ private GT_Recipe addRecipe(GT_Recipe recipe, double baseBurnTime, boolean isHighTierAllowed) {
+ // Some recipes will have a burn time like 15.9999999 and % always rounds down
+ double floatErrorCorrection = 0.0001;
+
+ double bronzeBurnTime = baseBurnTime * 2 + floatErrorCorrection;
+ bronzeBurnTime -= bronzeBurnTime % 0.05;
+ double steelBurnTime = baseBurnTime + floatErrorCorrection;
+ steelBurnTime -= steelBurnTime % 0.05;
+ double titaniumBurnTime = baseBurnTime * 0.3 + floatErrorCorrection;
+ titaniumBurnTime -= titaniumBurnTime % 0.05;
+ double tungstensteelBurnTime = baseBurnTime * 0.15 + floatErrorCorrection;
+ tungstensteelBurnTime -= tungstensteelBurnTime % 0.05;
+
+ if (isHighTierAllowed) {
+ recipe.setNeiDesc(
+ "Burn time in seconds:",
+ String.format("Bronze Boiler: %.4f", bronzeBurnTime),
+ String.format("Steel Boiler: %.4f", steelBurnTime),
+ String.format("Titanium Boiler: %.4f", titaniumBurnTime),
+ String.format("Tungstensteel Boiler: %.4f", tungstensteelBurnTime));
+ } else {
+ recipe.setNeiDesc(
+ "Burn time in seconds:",
+ String.format("Bronze Boiler: %.4f", bronzeBurnTime),
+ String.format("Steel Boiler: %.4f", steelBurnTime),
+ "Titanium Boiler: Not allowed",
+ "Tungstenst. Boiler: Not allowed");
+ }
+
+ return compileRecipe(recipe);
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/LargeBoilerFuelFrontend.java b/src/main/java/gregtech/api/recipe/maps/LargeBoilerFuelFrontend.java
new file mode 100644
index 0000000000..dbe7f6fe2f
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/LargeBoilerFuelFrontend.java
@@ -0,0 +1,25 @@
+package gregtech.api.recipe.maps;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class LargeBoilerFuelFrontend extends RecipeMapFrontend {
+
+ public LargeBoilerFuelFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {}
+
+ @Override
+ protected void drawDurationInfo(RecipeDisplayInfo recipeInfo) {}
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/LargeNEIFrontend.java b/src/main/java/gregtech/api/recipe/maps/LargeNEIFrontend.java
new file mode 100644
index 0000000000..70184a83de
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/LargeNEIFrontend.java
@@ -0,0 +1,65 @@
+package gregtech.api.recipe.maps;
+
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.math.Size;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+
+/**
+ * Nicely display NEI with many items and fluids. Remember to call
+ * If row count >= 6, it doesn't fit in 2 recipes per page, so change it via IMC.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class LargeNEIFrontend extends RecipeMapFrontend {
+
+ private static final int xDirMaxCount = 3;
+ private static final int yOrigin = 8;
+
+ private final int itemRowCount;
+ private final int fluidRowCount;
+
+ public LargeNEIFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder.logoPos(new Pos2d(80, 62)), neiPropertiesBuilder);
+ this.itemRowCount = getItemRowCount();
+ this.fluidRowCount = getFluidRowCount();
+ neiProperties.recipeBackgroundSize = new Size(170, 82 + (Math.max(itemRowCount + fluidRowCount - 4, 0)) * 18);
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return UIHelper.getGridPositions(itemInputCount, 16, yOrigin, xDirMaxCount);
+ }
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return UIHelper.getGridPositions(itemOutputCount, 106, yOrigin, xDirMaxCount);
+ }
+
+ @Override
+ public List<Pos2d> getFluidInputPositions(int fluidInputCount) {
+ return UIHelper.getGridPositions(fluidInputCount, 16, yOrigin + itemRowCount * 18, xDirMaxCount);
+ }
+
+ @Override
+ public List<Pos2d> getFluidOutputPositions(int fluidOutputCount) {
+ return UIHelper.getGridPositions(fluidOutputCount, 106, yOrigin + itemRowCount * 18, xDirMaxCount);
+ }
+
+ private int getItemRowCount() {
+ return (Math.max(uiProperties.maxItemInputs, uiProperties.maxItemOutputs) - 1) / xDirMaxCount + 1;
+ }
+
+ private int getFluidRowCount() {
+ return (Math.max(uiProperties.maxFluidInputs, uiProperties.maxFluidOutputs) - 1) / xDirMaxCount + 1;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/MicrowaveBackend.java b/src/main/java/gregtech/api/recipe/maps/MicrowaveBackend.java
new file mode 100644
index 0000000000..53623cb0c7
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/MicrowaveBackend.java
@@ -0,0 +1,145 @@
+package gregtech.api.recipe.maps;
+
+import static gregtech.api.enums.GT_Values.W;
+import static gregtech.api.util.GT_RecipeConstants.EXPLODE;
+import static gregtech.api.util.GT_RecipeConstants.ON_FIRE;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntityFurnace;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.SubTag;
+import gregtech.api.objects.ItemData;
+import gregtech.api.objects.MaterialStack;
+import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Special Class for Microwave Recipe handling.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class MicrowaveBackend extends NonGTBackend {
+
+ public MicrowaveBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ super(propertiesBuilder);
+ }
+
+ @Override
+ protected GT_Recipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot,
+ @Nullable GT_Recipe cachedRecipe) {
+ if (items.length == 0 || items[0] == null) {
+ return null;
+ }
+ if (cachedRecipe != null && cachedRecipe.isRecipeInputEqual(false, true, fluids, items)) {
+ return cachedRecipe;
+ }
+
+ ItemStack output = GT_ModHandler.getSmeltingOutput(items[0], false, null);
+
+ if (GT_Utility.areStacksEqual(items[0], new ItemStack(Items.book, 1, W))) {
+ return GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, items[0]))
+ .itemOutputs(GT_Utility.getWrittenBook("Manual_Microwave", ItemList.Book_Written_03.get(1)))
+ .duration(32)
+ .eut(4)
+ .noOptimize()
+ .build()
+ .orElse(null);
+ }
+
+ // Check Container Item of Input since it is around the Input, then the Input itself, then Container Item of
+ // Output and last check the Output itself
+ for (ItemStack item : new ItemStack[] { GT_Utility.getContainerItem(items[0], true), items[0],
+ GT_Utility.getContainerItem(output, true), output }) {
+ if (item == null) continue;
+ if (GT_Utility.areStacksEqual(item, new ItemStack(Blocks.netherrack, 1, W), true)
+ || GT_Utility.areStacksEqual(item, new ItemStack(Blocks.tnt, 1, W), true)
+ || GT_Utility.areStacksEqual(item, new ItemStack(Items.egg, 1, W), true)
+ || GT_Utility.areStacksEqual(item, new ItemStack(Items.firework_charge, 1, W), true)
+ || GT_Utility.areStacksEqual(item, new ItemStack(Items.fireworks, 1, W), true)
+ || GT_Utility.areStacksEqual(item, new ItemStack(Items.fire_charge, 1, W), true)) {
+ GT_Log.exp
+ .println("Microwave Explosion due to TNT || EGG || FIREWORKCHARGE || FIREWORK || FIRE CHARGE");
+ return GT_RecipeBuilder.empty()
+ .metadata(EXPLODE, true)
+ .build()
+ .orElse(null);
+ }
+
+ ItemData itemData = GT_OreDictUnificator.getItemData(item);
+ if (itemData != null) {
+ if (itemData.mMaterial != null && itemData.mMaterial.mMaterial != null) {
+ if (itemData.mMaterial.mMaterial.contains(SubTag.METAL)
+ || itemData.mMaterial.mMaterial.contains(SubTag.EXPLOSIVE)) {
+ GT_Log.exp.println("Microwave Explosion due to METAL insertion");
+ return GT_RecipeBuilder.empty()
+ .metadata(EXPLODE, true)
+ .build()
+ .orElse(null);
+ }
+ if (itemData.mMaterial.mMaterial.contains(SubTag.FLAMMABLE)) {
+ GT_Log.exp.println("Microwave INFLAMMATION due to FLAMMABLE insertion");
+ return GT_RecipeBuilder.empty()
+ .metadata(ON_FIRE, true)
+ .build()
+ .orElse(null);
+ }
+ }
+ for (MaterialStack materialStack : itemData.mByProducts) {
+ if (materialStack == null) continue;
+ if (materialStack.mMaterial.contains(SubTag.METAL)
+ || materialStack.mMaterial.contains(SubTag.EXPLOSIVE)) {
+ GT_Log.exp.println("Microwave Explosion due to METAL insertion");
+ return GT_RecipeBuilder.empty()
+ .metadata(EXPLODE, true)
+ .build()
+ .orElse(null);
+ }
+ if (materialStack.mMaterial.contains(SubTag.FLAMMABLE)) {
+ GT_Log.exp.println("Microwave INFLAMMATION due to FLAMMABLE insertion");
+ return GT_RecipeBuilder.empty()
+ .metadata(ON_FIRE, true)
+ .build()
+ .orElse(null);
+ }
+ }
+ }
+ if (TileEntityFurnace.getItemBurnTime(item) > 0) {
+ GT_Log.exp.println("Microwave INFLAMMATION due to BURNABLE insertion");
+ return GT_RecipeBuilder.empty()
+ .metadata(ON_FIRE, true)
+ .build()
+ .orElse(null);
+ }
+ }
+
+ return output == null ? null
+ : GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, items[0]))
+ .itemOutputs(output)
+ .duration(32)
+ .eut(4)
+ .noOptimize()
+ .build()
+ .orElse(null);
+ }
+
+ @Override
+ public boolean containsInput(ItemStack item) {
+ return GT_ModHandler.getSmeltingOutput(item, false, null) != null;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/NonGTBackend.java b/src/main/java/gregtech/api/recipe/maps/NonGTBackend.java
new file mode 100644
index 0000000000..1e871df372
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/NonGTBackend.java
@@ -0,0 +1,52 @@
+package gregtech.api.recipe.maps;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Abstract class for general recipe handling of non GT recipes
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public abstract class NonGTBackend extends RecipeMapBackend {
+
+ public NonGTBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ super(propertiesBuilder);
+ }
+
+ @Override
+ protected abstract GT_Recipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids,
+ @Nullable ItemStack specialSlot, @Nullable GT_Recipe cachedRecipe);
+
+ @Override
+ protected boolean doesOverwriteFindRecipe() {
+ return true;
+ }
+
+ @Override
+ public boolean containsInput(ItemStack item) {
+ return false;
+ }
+
+ @Override
+ public boolean containsInput(Fluid fluid) {
+ return false;
+ }
+
+ @Override
+ public void reInit() {}
+
+ @Override
+ protected GT_Recipe addToItemMap(GT_Recipe recipe) {
+ return recipe;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/OilCrackerBackend.java b/src/main/java/gregtech/api/recipe/maps/OilCrackerBackend.java
new file mode 100644
index 0000000000..c2c312a48a
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/OilCrackerBackend.java
@@ -0,0 +1,41 @@
+package gregtech.api.recipe.maps;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class OilCrackerBackend extends RecipeMapBackend {
+
+ private final Set<String> validCatalystFluidNames = new HashSet<>();
+
+ public OilCrackerBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ super(propertiesBuilder);
+ }
+
+ @Override
+ public GT_Recipe compileRecipe(GT_Recipe recipe) {
+ super.compileRecipe(recipe);
+ if (recipe.mFluidInputs != null && recipe.mFluidInputs.length > 1 && recipe.mFluidInputs[1] != null) {
+ validCatalystFluidNames.add(
+ recipe.mFluidInputs[1].getFluid()
+ .getName());
+ }
+ return recipe;
+ }
+
+ public boolean isValidCatalystFluid(FluidStack fluid) {
+ return validCatalystFluidNames.contains(
+ fluid.getFluid()
+ .getName());
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/PrinterBackend.java b/src/main/java/gregtech/api/recipe/maps/PrinterBackend.java
new file mode 100644
index 0000000000..a933886447
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/PrinterBackend.java
@@ -0,0 +1,142 @@
+package gregtech.api.recipe.maps;
+
+import static gregtech.api.enums.GT_Values.L;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Special Class for Printer handling.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class PrinterBackend extends RecipeMapBackend {
+
+ public PrinterBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ super(propertiesBuilder);
+ }
+
+ @Override
+ protected GT_Recipe modifyFoundRecipe(GT_Recipe recipe, ItemStack[] items, FluidStack[] fluids,
+ @Nullable ItemStack specialSlot) {
+ if (items[0].getItem() == Items.paper) {
+ assert specialSlot != null;
+ if (!ItemList.Tool_DataStick.isStackEqual(specialSlot, false, true)) return null;
+ NBTTagCompound nbt = specialSlot.getTagCompound();
+ if (nbt == null || GT_Utility.isStringInvalid(nbt.getString("title"))
+ || GT_Utility.isStringInvalid(nbt.getString("author"))) return null;
+
+ recipe = recipe.copy();
+ recipe.mCanBeBuffered = false;
+ recipe.mOutputs[0].setTagCompound(nbt);
+ return recipe;
+ }
+ if (items[0].getItem() == Items.map) {
+ assert specialSlot != null;
+ if (!ItemList.Tool_DataStick.isStackEqual(specialSlot, false, true)) return null;
+ NBTTagCompound nbt = specialSlot.getTagCompound();
+ if (nbt == null || !nbt.hasKey("map_id")) return null;
+
+ recipe = recipe.copy();
+ recipe.mCanBeBuffered = false;
+ recipe.mOutputs[0].setItemDamage(nbt.getShort("map_id"));
+ return recipe;
+ }
+ if (ItemList.Paper_Punch_Card_Empty.isStackEqual(items[0], false, true)) {
+ assert specialSlot != null;
+ if (!ItemList.Tool_DataStick.isStackEqual(specialSlot, false, true)) return null;
+ NBTTagCompound nbt = specialSlot.getTagCompound();
+ if (nbt == null || !nbt.hasKey("GT.PunchCardData")) return null;
+
+ recipe = recipe.copy();
+ recipe.mCanBeBuffered = false;
+ recipe.mOutputs[0].setTagCompound(
+ GT_Utility.getNBTContainingString(
+ new NBTTagCompound(),
+ "GT.PunchCardData",
+ nbt.getString("GT.PunchCardData")));
+ return recipe;
+ }
+ return recipe;
+ }
+
+ @Override
+ protected GT_Recipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) {
+ if (items.length == 0 || items[0] == null || fluids.length == 0 || fluids[0] == null) {
+ return null;
+ }
+ Dyes dye = null;
+ for (Dyes tDye : Dyes.VALUES) if (tDye.isFluidDye(fluids[0])) {
+ dye = tDye;
+ break;
+ }
+ if (dye == null) return null;
+
+ ItemStack batchRecolorOutput = GT_ModHandler.getAllRecipeOutput(
+ null,
+ items[0],
+ items[0],
+ items[0],
+ items[0],
+ ItemList.DYE_ONLY_ITEMS[dye.mIndex].get(1),
+ items[0],
+ items[0],
+ items[0],
+ items[0]);
+ if (batchRecolorOutput != null) {
+ return GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(8, items[0]))
+ .itemOutputs(batchRecolorOutput)
+ .fluidInputs(new FluidStack(fluids[0].getFluid(), (int) L))
+ .duration(256)
+ .eut(2)
+ .hidden()
+ .build()
+ .map(this::compileRecipe)
+ .orElse(null);
+ }
+
+ ItemStack singleRecolorOutput = GT_ModHandler
+ .getAllRecipeOutput(null, items[0], ItemList.DYE_ONLY_ITEMS[dye.mIndex].get(1));
+ if (singleRecolorOutput != null) {
+ return GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, items[0]))
+ .itemOutputs(singleRecolorOutput)
+ .fluidInputs(new FluidStack(fluids[0].getFluid(), (int) L))
+ .duration(32)
+ .eut(2)
+ .hidden()
+ .build()
+ .map(this::compileRecipe)
+ .orElse(null);
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean containsInput(ItemStack item) {
+ return true;
+ }
+
+ @Override
+ public boolean containsInput(Fluid fluid) {
+ return super.containsInput(fluid) || Dyes.isAnyFluidDye(fluid);
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/RecyclerBackend.java b/src/main/java/gregtech/api/recipe/maps/RecyclerBackend.java
new file mode 100644
index 0000000000..55fb9b4cc4
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/RecyclerBackend.java
@@ -0,0 +1,55 @@
+package gregtech.api.recipe.maps;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Special Class for Recycler Recipe handling.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class RecyclerBackend extends NonGTBackend {
+
+ public RecyclerBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ super(propertiesBuilder);
+ }
+
+ @Override
+ protected GT_Recipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot,
+ @Nullable GT_Recipe cachedRecipe) {
+ if (items.length == 0 || items[0] == null) {
+ return null;
+ }
+ if (cachedRecipe != null && cachedRecipe.isRecipeInputEqual(false, true, fluids, items)) {
+ return cachedRecipe;
+ }
+ GT_RecipeBuilder builder = GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, items[0]));
+ ItemStack output = GT_ModHandler.getRecyclerOutput(items[0], 0);
+ if (output != null) {
+ builder.itemOutputs(output)
+ .outputChances(1250);
+ }
+ return builder.duration(45)
+ .eut(1)
+ .noOptimize()
+ .build()
+ .orElse(null);
+ }
+
+ @Override
+ public boolean containsInput(ItemStack item) {
+ return GT_ModHandler.getRecyclerOutput(item, 0) != null;
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/ReplicatorBackend.java b/src/main/java/gregtech/api/recipe/maps/ReplicatorBackend.java
new file mode 100644
index 0000000000..f201698457
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/ReplicatorBackend.java
@@ -0,0 +1,100 @@
+package gregtech.api.recipe.maps;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Element;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TierEU;
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.items.behaviors.Behaviour_DataOrb;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class ReplicatorBackend extends RecipeMapBackend {
+
+ private final Map<Materials, GT_Recipe> recipesByMaterial = new HashMap<>();
+
+ public ReplicatorBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ super(propertiesBuilder.recipeEmitter(ReplicatorBackend::replicatorRecipeEmitter));
+ }
+
+ @Override
+ public GT_Recipe compileRecipe(GT_Recipe recipe) {
+ super.compileRecipe(recipe);
+ Materials material = recipe.getMetadata(GT_RecipeConstants.MATERIAL);
+ assert material != null; // checked by replicatorRecipeEmitter
+ recipesByMaterial.put(material, recipe);
+ return recipe;
+ }
+
+ @Override
+ protected boolean doesOverwriteFindRecipe() {
+ return true;
+ }
+
+ @Override
+ protected GT_Recipe overwriteFindRecipe(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot,
+ @Nullable GT_Recipe cachedRecipe) {
+ if (specialSlot == null) {
+ return null;
+ }
+ Materials foundMaterial = getMaterialFromDataOrb(specialSlot);
+ if (foundMaterial == null) {
+ return null;
+ }
+ return recipesByMaterial.getOrDefault(foundMaterial, null);
+ }
+
+ @Nullable
+ private static Materials getMaterialFromDataOrb(ItemStack stack) {
+ if (ItemList.Tool_DataOrb.isStackEqual(stack, false, true) && Behaviour_DataOrb.getDataTitle(stack)
+ .equals("Elemental-Scan")) {
+ return Element.get(Behaviour_DataOrb.getDataName(stack)).mLinkedMaterials.stream()
+ .findFirst()
+ .orElse(null);
+ }
+ return null;
+ }
+
+ private static Collection<GT_Recipe> replicatorRecipeEmitter(GT_RecipeBuilder builder) {
+ Materials material = builder.getMetadata(GT_RecipeConstants.MATERIAL);
+ if (material == null) {
+ throw new IllegalStateException("GT_RecipeConstants.MATERIAL must be set for replicator recipe");
+ }
+ return Optional.of(material)
+ .map(material1 -> material1.mElement)
+ .map(Element::getMass)
+ .map(ReplicatorBackend::getUUMAmountFromMass)
+ .flatMap(
+ uum -> builder.fluidInputs(Materials.UUMatter.getFluid(uum))
+ .duration(GT_Utility.safeInt(uum * 512L, 1))
+ .eut(TierEU.RECIPE_LV)
+ .ignoreCollision()
+ .noOptimize()
+ .build())
+ .map(Collections::singletonList)
+ .orElse(Collections.emptyList());
+ }
+
+ private static int getUUMAmountFromMass(long mass) {
+ return GT_Utility.safeInt((long) Math.pow(mass, GT_Mod.gregtechproxy.replicatorExponent), 1);
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/SpaceProjectFrontend.java b/src/main/java/gregtech/api/recipe/maps/SpaceProjectFrontend.java
new file mode 100644
index 0000000000..98463dcc4d
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/SpaceProjectFrontend.java
@@ -0,0 +1,131 @@
+package gregtech.api.recipe.maps;
+
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static net.minecraft.util.EnumChatFormatting.GRAY;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.List;
+import java.util.function.Supplier;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.util.EnumChatFormatting;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+
+import appeng.util.ReadableNumberConverter;
+import codechicken.lib.gui.GuiDraw;
+import codechicken.nei.PositionedStack;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+import gregtech.common.misc.spaceprojects.SpaceProjectManager;
+import gregtech.common.misc.spaceprojects.SpaceProjectManager.FakeSpaceProjectRecipe;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject;
+import gregtech.nei.GT_NEI_DefaultHandler;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class SpaceProjectFrontend extends RecipeMapFrontend {
+
+ IDrawable projectTexture;
+
+ public SpaceProjectFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ public ModularWindow.Builder createNEITemplate(IItemHandlerModifiable itemInputsInventory,
+ IItemHandlerModifiable itemOutputsInventory, IItemHandlerModifiable specialSlotInventory,
+ IItemHandlerModifiable fluidInputsInventory, IItemHandlerModifiable fluidOutputsInventory,
+ Supplier<Float> progressSupplier, Pos2d windowOffset) {
+ ModularWindow.Builder builder = super.createNEITemplate(
+ itemInputsInventory,
+ itemOutputsInventory,
+ specialSlotInventory,
+ fluidInputsInventory,
+ fluidOutputsInventory,
+ progressSupplier,
+ windowOffset);
+ builder.widget(
+ new DrawableWidget().setDrawable(() -> projectTexture)
+ .setSize(18, 18)
+ .setPos(new Pos2d(124, 28).add(windowOffset)));
+ return builder;
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return UIHelper.getGridPositions(itemInputCount, 16, 28, 3);
+ }
+
+ @Override
+ public List<Pos2d> getFluidInputPositions(int fluidInputCount) {
+ return UIHelper.getGridPositions(fluidInputCount, 88, 28, 1);
+ }
+
+ @Override
+ protected List<String> handleNEIItemInputTooltip(List<String> currentTip,
+ GT_NEI_DefaultHandler.FixedPositionedStack pStack) {
+ super.handleNEIItemOutputTooltip(currentTip, pStack);
+ if (pStack.isFluid()) return currentTip;
+ currentTip.add(GRAY + translateToLocal("Item Count: ") + formatNumbers(pStack.realStackSize));
+ return currentTip;
+ }
+
+ @Override
+ public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) {
+ for (PositionedStack stack : neiCachedRecipe.mInputs) {
+ if (stack instanceof GT_NEI_DefaultHandler.FixedPositionedStack pStack && stack.item != null
+ && !pStack.isFluid()) {
+ int stackSize = ((GT_NEI_DefaultHandler.FixedPositionedStack) stack).realStackSize;
+ String displayString;
+ if (stack.item.stackSize > 9999) {
+ displayString = ReadableNumberConverter.INSTANCE.toWideReadableForm(stackSize);
+ } else {
+ displayString = String.valueOf(stackSize);
+ }
+ drawNEIOverlayText(displayString, stack, 0xffffff, 0.5f, true, Alignment.BottomRight);
+ }
+ }
+ if (neiCachedRecipe.mRecipe instanceof FakeSpaceProjectRecipe) {
+ ISpaceProject project = SpaceProjectManager
+ .getProject(((FakeSpaceProjectRecipe) neiCachedRecipe.mRecipe).projectName);
+ if (project != null) {
+ projectTexture = project.getTexture();
+ GuiDraw.drawStringC(EnumChatFormatting.BOLD + project.getLocalizedName(), 85, 0, 0x404040, false);
+ }
+ }
+ }
+
+ @Override
+ public void addProgressBar(ModularWindow.Builder builder, Supplier<Float> progressSupplier, Pos2d windowOffset) {
+ int bar1Width = 17;
+ int bar2Width = 18;
+ List<Supplier<Float>> splitProgress = splitProgress(progressSupplier, bar1Width, bar2Width);
+ builder.widget(
+ new ProgressBar().setTexture(GT_UITextures.PROGRESSBAR_ASSEMBLY_LINE_1, 17)
+ .setDirection(ProgressBar.Direction.RIGHT)
+ .setProgress(splitProgress.get(0))
+ .setSynced(false, false)
+ .setPos(new Pos2d(70, 28).add(windowOffset))
+ .setSize(bar1Width, 72));
+ builder.widget(
+ new ProgressBar().setTexture(GT_UITextures.PROGRESSBAR_ASSEMBLY_LINE_2, 18)
+ .setDirection(ProgressBar.Direction.RIGHT)
+ .setProgress(splitProgress.get(1))
+ .setSynced(false, false)
+ .setPos(new Pos2d(106, 28).add(windowOffset))
+ .setSize(bar2Width, 72));
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/TranscendentPlasmaMixerFrontend.java b/src/main/java/gregtech/api/recipe/maps/TranscendentPlasmaMixerFrontend.java
new file mode 100644
index 0000000000..7a5d7ff164
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/TranscendentPlasmaMixerFrontend.java
@@ -0,0 +1,56 @@
+package gregtech.api.recipe.maps;
+
+import static gregtech.api.util.GT_Utility.formatNumbers;
+
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class TranscendentPlasmaMixerFrontend extends RecipeMapFrontend {
+
+ public TranscendentPlasmaMixerFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return UIHelper.getGridPositions(itemInputCount, 60, 8, 1);
+ }
+
+ @Override
+ public List<Pos2d> getFluidInputPositions(int fluidInputCount) {
+ return UIHelper.getGridPositions(fluidInputCount, 6, 26, 4, 5);
+ }
+
+ @Override
+ public List<Pos2d> getFluidOutputPositions(int fluidOutputCount) {
+ return UIHelper.getGridPositions(fluidOutputCount, 114, 44, 1);
+ }
+
+ @Override
+ protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {
+ // These look odd because recipeInfo.recipe.mEUt is actually the EU per litre of fluid processed, not
+ // the EU/t.
+ recipeInfo.drawText(
+ GT_Utility.trans("152", "Total: ")
+ + formatNumbers(1000L * recipeInfo.recipe.mDuration / 100L * recipeInfo.recipe.mEUt)
+ + " EU");
+ // 1000 / (20 ticks * 5 seconds) = 10L/t. 10L/t * x EU/L = 10 * x EU/t.
+ long averageUsage = 10L * recipeInfo.recipe.mEUt;
+ recipeInfo.drawText(
+ "Average: " + formatNumbers(averageUsage) + " EU/t" + GT_Utility.getTierNameWithParentheses(averageUsage));
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/maps/UnpackagerBackend.java b/src/main/java/gregtech/api/recipe/maps/UnpackagerBackend.java
new file mode 100644
index 0000000000..e7297f0609
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/maps/UnpackagerBackend.java
@@ -0,0 +1,53 @@
+package gregtech.api.recipe.maps;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class UnpackagerBackend extends RecipeMapBackend {
+
+ public UnpackagerBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
+ super(propertiesBuilder);
+ }
+
+ @Override
+ protected GT_Recipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) {
+ if (items.length == 0 || !ItemList.IC2_Scrapbox.isStackEqual(items[0], false, true)) {
+ return null;
+ }
+
+ ItemStack output = GT_ModHandler.getRandomScrapboxDrop();
+ if (output == null) {
+ return null;
+ }
+ return GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Scrapbox.get(1))
+ .itemOutputs(output)
+ .duration(16)
+ .eut(1)
+ // It is not allowed to be buffered due to the random Output
+ .noBuffer()
+ // Due to its randomness it is not good if there are Items in the Output Slot, because those Items could
+ // manipulate the outcome.
+ .needsEmptyOutput()
+ .build()
+ .orElse(null);
+ }
+
+ @Override
+ public boolean containsInput(ItemStack item) {
+ return ItemList.IC2_Scrapbox.isStackEqual(item, false, true) || super.containsInput(item);
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/metadata/EmptyRecipeMetadataStorage.java b/src/main/java/gregtech/api/recipe/metadata/EmptyRecipeMetadataStorage.java
new file mode 100644
index 0000000000..f7831f1485
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/metadata/EmptyRecipeMetadataStorage.java
@@ -0,0 +1,50 @@
+package gregtech.api.recipe.metadata;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import org.jetbrains.annotations.Contract;
+
+import gregtech.api.recipe.RecipeMetadataKey;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public final class EmptyRecipeMetadataStorage implements IRecipeMetadataStorage {
+
+ public static EmptyRecipeMetadataStorage INSTANCE = new EmptyRecipeMetadataStorage();
+
+ private EmptyRecipeMetadataStorage() {}
+
+ @Override
+ public <T> void store(RecipeMetadataKey<T> key, @Nullable T value) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Nullable
+ @Override
+ public <T> T getMetadata(RecipeMetadataKey<T> key) {
+ return null;
+ }
+
+ @Contract("_, !null -> !null")
+ @Nullable
+ @Override
+ public <T> T getMetadataOrDefault(RecipeMetadataKey<T> key, @Nullable T defaultValue) {
+ return defaultValue;
+ }
+
+ @Override
+ public Set<Map.Entry<RecipeMetadataKey<?>, Object>> getEntries() {
+ return Collections.emptySet();
+ }
+
+ @Override
+ public IRecipeMetadataStorage copy() {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/metadata/IRecipeMetadataStorage.java b/src/main/java/gregtech/api/recipe/metadata/IRecipeMetadataStorage.java
new file mode 100644
index 0000000000..52141937cf
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/metadata/IRecipeMetadataStorage.java
@@ -0,0 +1,34 @@
+package gregtech.api.recipe.metadata;
+
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import org.jetbrains.annotations.Contract;
+
+import gregtech.api.recipe.RecipeMetadataKey;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Stores set of metadata for the recipe with key {@link RecipeMetadataKey}. More explicit way to store various info
+ * on recipe than special value or special object. Type of the metadata can be anything.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public interface IRecipeMetadataStorage {
+
+ <T> void store(RecipeMetadataKey<T> key, @Nullable T value);
+
+ @Nullable
+ <T> T getMetadata(RecipeMetadataKey<T> key);
+
+ @Contract("_, !null -> !null")
+ @Nullable
+ <T> T getMetadataOrDefault(RecipeMetadataKey<T> key, @Nullable T defaultValue);
+
+ Set<Map.Entry<RecipeMetadataKey<?>, Object>> getEntries();
+
+ IRecipeMetadataStorage copy();
+}
diff --git a/src/main/java/gregtech/api/recipe/metadata/PCBFactoryTierKey.java b/src/main/java/gregtech/api/recipe/metadata/PCBFactoryTierKey.java
new file mode 100644
index 0000000000..05db919b57
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/metadata/PCBFactoryTierKey.java
@@ -0,0 +1,30 @@
+package gregtech.api.recipe.metadata;
+
+import static gregtech.api.util.GT_Utility.trans;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.api.recipe.RecipeMetadataKey;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+/**
+ * Minimum tier required for the PCB factory recipe.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class PCBFactoryTierKey extends RecipeMetadataKey<Integer> {
+
+ public static final PCBFactoryTierKey INSTANCE = new PCBFactoryTierKey();
+
+ private PCBFactoryTierKey() {
+ super(Integer.class, "pcb_factory_tier");
+ }
+
+ @Override
+ public void drawInfo(RecipeDisplayInfo recipeInfo, @Nullable Object value) {
+ int tier = cast(value, 1);
+ recipeInfo.drawText(trans("336", "PCB Factory Tier: ") + tier);
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/metadata/PCBFactoryUpgrade.java b/src/main/java/gregtech/api/recipe/metadata/PCBFactoryUpgrade.java
new file mode 100644
index 0000000000..6d76ae05c3
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/metadata/PCBFactoryUpgrade.java
@@ -0,0 +1,7 @@
+package gregtech.api.recipe.metadata;
+
+public enum PCBFactoryUpgrade {
+
+ NONE,
+ BIO
+}
diff --git a/src/main/java/gregtech/api/recipe/metadata/PCBFactoryUpgradeKey.java b/src/main/java/gregtech/api/recipe/metadata/PCBFactoryUpgradeKey.java
new file mode 100644
index 0000000000..8257f1e6ef
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/metadata/PCBFactoryUpgradeKey.java
@@ -0,0 +1,32 @@
+package gregtech.api.recipe.metadata;
+
+import static gregtech.api.util.GT_Utility.trans;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.api.recipe.RecipeMetadataKey;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+/**
+ * If bio upgrade is required for the PCB factory recipe.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class PCBFactoryUpgradeKey extends RecipeMetadataKey<PCBFactoryUpgrade> {
+
+ public static final PCBFactoryUpgradeKey INSTANCE = new PCBFactoryUpgradeKey();
+
+ private PCBFactoryUpgradeKey() {
+ super(PCBFactoryUpgrade.class, "pcb_factory_bio_upgrade");
+ }
+
+ @Override
+ public void drawInfo(RecipeDisplayInfo recipeInfo, @Nullable Object value) {
+ PCBFactoryUpgrade upgrade = cast(value);
+ if (upgrade == PCBFactoryUpgrade.BIO) {
+ recipeInfo.drawText(trans("337", "Upgrade Required: ") + trans("338", "Bio"));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/metadata/RecipeMetadataStorage.java b/src/main/java/gregtech/api/recipe/metadata/RecipeMetadataStorage.java
new file mode 100644
index 0000000000..5b65d8a600
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/metadata/RecipeMetadataStorage.java
@@ -0,0 +1,56 @@
+package gregtech.api.recipe.metadata;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import org.jetbrains.annotations.Contract;
+
+import gregtech.api.recipe.RecipeMetadataKey;
+import gregtech.api.util.FieldsAreNonnullByDefault;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+@FieldsAreNonnullByDefault
+public final class RecipeMetadataStorage implements IRecipeMetadataStorage {
+
+ private final Map<RecipeMetadataKey<?>, Object> metadata = new HashMap<>();
+
+ public RecipeMetadataStorage() {}
+
+ private RecipeMetadataStorage(Map<RecipeMetadataKey<?>, Object> metadata) {
+ this.metadata.putAll(metadata);
+ }
+
+ @Override
+ public <T> void store(RecipeMetadataKey<T> key, @Nullable T value) {
+ metadata.put(key, key.cast(value));
+ }
+
+ @Nullable
+ @Override
+ public <T> T getMetadata(RecipeMetadataKey<T> key) {
+ return key.cast(metadata.get(key));
+ }
+
+ @Contract("_, !null -> !null")
+ @Nullable
+ @Override
+ public <T> T getMetadataOrDefault(RecipeMetadataKey<T> key, @Nullable T defaultValue) {
+ return key.cast(metadata.getOrDefault(key, defaultValue));
+ }
+
+ @Override
+ public Set<Map.Entry<RecipeMetadataKey<?>, Object>> getEntries() {
+ return metadata.entrySet();
+ }
+
+ @Override
+ public IRecipeMetadataStorage copy() {
+ return new RecipeMetadataStorage(metadata);
+ }
+}
diff --git a/src/main/java/gregtech/api/recipe/metadata/SimpleRecipeMetadataKey.java b/src/main/java/gregtech/api/recipe/metadata/SimpleRecipeMetadataKey.java
new file mode 100644
index 0000000000..19395f11a0
--- /dev/null
+++ b/src/main/java/gregtech/api/recipe/metadata/SimpleRecipeMetadataKey.java
@@ -0,0 +1,27 @@
+package gregtech.api.recipe.metadata;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.api.recipe.RecipeMetadataKey;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+/**
+ * Simple metadata key that does not draw anything on NEI.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class SimpleRecipeMetadataKey<T> extends RecipeMetadataKey<T> {
+
+ private SimpleRecipeMetadataKey(Class<T> clazz, String identifier) {
+ super(clazz, identifier);
+ }
+
+ public static <T> RecipeMetadataKey<T> create(Class<T> clazz, String identifier) {
+ return new SimpleRecipeMetadataKey<>(clazz, identifier);
+ }
+
+ @Override
+ public void drawInfo(RecipeDisplayInfo recipeInfo, @Nullable Object value) {}
+}
diff --git a/src/main/java/gregtech/api/render/TextureFactory.java b/src/main/java/gregtech/api/render/TextureFactory.java
new file mode 100644
index 0000000000..26142fd606
--- /dev/null
+++ b/src/main/java/gregtech/api/render/TextureFactory.java
@@ -0,0 +1,157 @@
+package gregtech.api.render;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.ITextureBuilder;
+import gregtech.common.render.GT_TextureBuilder;
+
+/**
+ * <p>
+ * This class contains a collection of static factory methods to access the New Texture API.
+ * </p>
+ * <p>
+ * The {@link #of} methods directly returns ready-to-use instances of {@link ITexture} implementations.
+ * </p>
+ * <p>
+ * To get more specific implementations of {@link ITexture} instances, use the {@link #builder()} method.
+ * </p>
+ * <p>
+ * Example of the {@link #builder()}:
+ * </p>
+ *
+ * <pre>
+ * {@code
+ * // Texture that glows in the dark
+ * TextureFactory.builder().addIcon(OVERLAY_FUSION1_GLOW).glow().build());
+ *
+ * // Texture with same bottom flipped orientation as vanilla
+ * TextureFactory.builder().addIcon(GRANITE_RED_STONE).stdOrient().build();
+ * }
+ * </pre>
+ *
+ * See: the {@link ITextureBuilder} interface
+ */
+@SuppressWarnings("unused")
+public final class TextureFactory {
+
+ private TextureFactory() {
+ throw new AssertionError("Non-instantiable class");
+ }
+
+ /**
+ * Multi-layered {@link ITexture} factory
+ *
+ * @param textures The layers of {@link ITexture} from bottom to top
+ * @return The instance of an {@link ITexture} implementation
+ */
+ public static ITexture of(final ITexture... textures) {
+ return builder().addLayer(textures)
+ .build();
+ }
+
+ /**
+ * All-Sided {@link ITexture} factory
+ *
+ * @param bottom The {@link IIconContainer} Icon for the Bottom Side.
+ * @param top The {@link IIconContainer} Icon for the Top Side.
+ * @param north The {@link IIconContainer} Icon for the North Side.
+ * @param south The {@link IIconContainer} Icon for the South Side.
+ * @param west The {@link IIconContainer} Icon for the West Side.
+ * @param east The {@link IIconContainer} Icon for the East Side.
+ * @param rgba The {@code short[]} RGBA tint for all sides.
+ * @return The instance of an {@link ITexture} implementation
+ */
+ public static ITexture of(final IIconContainer bottom, final IIconContainer top, final IIconContainer north,
+ final IIconContainer south, final IIconContainer west, final IIconContainer east, final short[] rgba) {
+ return builder().addIcon(bottom, top, north, south, west, east)
+ .setRGBA(rgba)
+ .setAllowAlpha(true)
+ .build();
+ }
+
+ /**
+ * Bottom-Top-Sides-Sided {@link ITexture} factory
+ *
+ * @param bottom The {@link IIconContainer} Icon for the Bottom Side.
+ * @param top The {@link IIconContainer} Icon for the Top Side.
+ * @param sides The {@link IIconContainer} Icon for the North, South, West and East Sides.
+ * @param rgba The {@code short[]} RGBA tint for all sides.
+ * @return The instance of an {@link ITexture} implementation
+ */
+ public static ITexture of(final IIconContainer bottom, final IIconContainer top, final IIconContainer sides,
+ final short[] rgba) {
+ return builder().addIcon(bottom, top, sides, sides, sides, sides)
+ .setRGBA(rgba)
+ .setAllowAlpha(true)
+ .build();
+ }
+
+ /**
+ * Rendered {@link ITexture} factory
+ *
+ * @param iconContainer The {@link IIconContainer} to render
+ * @param rgba The {@code short[]} RGBA tint for the texture.
+ * @param allowAlpha Determine if texture will use alpha blending (Not yet implemented)
+ * @return The instance of an {@link ITexture} implementation
+ */
+ public static ITexture of(final IIconContainer iconContainer, final short[] rgba, final boolean allowAlpha) {
+ return builder().addIcon(iconContainer)
+ .setRGBA(rgba)
+ .setAllowAlpha(allowAlpha)
+ .build();
+ }
+
+ public static ITexture of(final IIconContainer iconContainer, final short[] rgba) {
+ return builder().addIcon(iconContainer)
+ .setRGBA(rgba)
+ .build();
+ }
+
+ public static ITexture of(final IIconContainer iconContainer) {
+ return builder().addIcon(iconContainer)
+ .build();
+ }
+
+ /**
+ * Copied-Block {@link ITexture} factory that will render a texture copied from the side of a {@link Block}.
+ *
+ * @param block The {@link Block} that will provide the texture
+ * @param meta The meta value for the Block
+ * @param side The {@link ForgeDirection} side providing the texture
+ * @param rgba The RGBA tint to apply
+ * @return The instance of an {@link ITexture} implementation
+ */
+ public static ITexture of(final Block block, final int meta, final ForgeDirection side, final short[] rgba) {
+ return builder().setFromBlock(block, meta)
+ .setFromSide(side)
+ .setRGBA(rgba)
+ .build();
+ }
+
+ public static ITexture of(final Block block, final int meta, final ForgeDirection side) {
+ return builder().setFromBlock(block, meta)
+ .setFromSide(side)
+ .build();
+ }
+
+ public static ITexture of(final Block block, final int meta) {
+ return builder().setFromBlock(block, meta)
+ .build();
+ }
+
+ public static ITexture of(final Block block) {
+ return of(block, 0);
+ }
+
+ /**
+ * {@link ITextureBuilder} factory
+ *
+ * @return An instance of the {@link ITextureBuilder} implementation
+ */
+ public static ITextureBuilder builder() {
+ return new GT_TextureBuilder();
+ }
+}
diff --git a/src/main/java/gregtech/api/task/TaskHost.java b/src/main/java/gregtech/api/task/TaskHost.java
new file mode 100644
index 0000000000..d6377949c1
--- /dev/null
+++ b/src/main/java/gregtech/api/task/TaskHost.java
@@ -0,0 +1,18 @@
+package gregtech.api.task;
+
+import javax.annotation.Nonnull;
+
+import org.jetbrains.annotations.ApiStatus;
+
+/**
+ * Classes implementing this interface can have {@link TickableTask} to run. Tasks with conflicting name should not be
+ * allowed, to prevent them from overwriting others' NBT load/save.
+ */
+public interface TaskHost {
+
+ /**
+ * This method should be called ONLY by {@link TickableTask} constructor.
+ */
+ @ApiStatus.OverrideOnly
+ void registerTask(@Nonnull TickableTask<?> task);
+}
diff --git a/src/main/java/gregtech/api/task/TickableTask.java b/src/main/java/gregtech/api/task/TickableTask.java
new file mode 100644
index 0000000000..3bbeb216e7
--- /dev/null
+++ b/src/main/java/gregtech/api/task/TickableTask.java
@@ -0,0 +1,48 @@
+package gregtech.api.task;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.nbt.NBTTagCompound;
+
+/**
+ * This class aims at separating logic run on {@link TaskHost}, rather than using interface layers.
+ * It has two main functionalities: Run tick and Save/Load.
+ *
+ * @param <T> Type of the host
+ */
+public abstract class TickableTask<T extends TaskHost> {
+
+ @Nonnull
+ protected final T taskHost;
+
+ public TickableTask(@Nonnull T taskHost) {
+ this.taskHost = taskHost;
+ taskHost.registerTask(this);
+ }
+
+ /**
+ * @return Name of this task. Tasks with conflicting name cannot be registered to the same machine.
+ */
+ @Nonnull
+ public abstract String getName();
+
+ /**
+ * Called once per world tick.
+ */
+ public abstract void update(long tick, boolean isServerSide);
+
+ /**
+ * Save info to NBT.
+ */
+ public void writeToNBT(@Nonnull NBTTagCompound nbt) {}
+
+ /**
+ * Read info from NBT.
+ */
+ public void readFromNBT(@Nonnull NBTTagCompound nbt) {}
+
+ @Override
+ public String toString() {
+ return "TickableTask{" + "name=" + getName() + ", taskHost=" + taskHost + "}";
+ }
+}
diff --git a/src/main/java/gregtech/api/task/tasks/PollutionTask.java b/src/main/java/gregtech/api/task/tasks/PollutionTask.java
new file mode 100644
index 0000000000..060a91acab
--- /dev/null
+++ b/src/main/java/gregtech/api/task/tasks/PollutionTask.java
@@ -0,0 +1,45 @@
+package gregtech.api.task.tasks;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.tileentity.TileEntity;
+
+import gregtech.api.enums.TickTime;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.task.TaskHost;
+import gregtech.api.task.TickableTask;
+import gregtech.common.GT_Pollution;
+
+public class PollutionTask<T extends TaskHost & IMachineProgress> extends TickableTask<T> {
+
+ private int pollutionPerSecond;
+ private static final int POLLUTION_TICK = TickTime.SECOND;
+
+ public PollutionTask(@Nonnull T taskHost) {
+ super(taskHost);
+ }
+
+ public PollutionTask<T> setPollutionPerSecond(int pollutionPerSecond) {
+ this.pollutionPerSecond = pollutionPerSecond;
+ return this;
+ }
+
+ public int getPollutionPerSecond() {
+ return pollutionPerSecond;
+ }
+
+ @Nonnull
+ @Override
+ public String getName() {
+ return "pollution";
+ }
+
+ @Override
+ public void update(long tick, boolean isServerSide) {
+ if (isServerSide && tick % POLLUTION_TICK == 0 && taskHost.hasThingsToDo()) {
+ if (taskHost instanceof final TileEntity entity) {
+ GT_Pollution.addPollution(entity, getPollutionPerSecond());
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/task/tasks/PowerOutputTask.java b/src/main/java/gregtech/api/task/tasks/PowerOutputTask.java
new file mode 100644
index 0000000000..ef800635fb
--- /dev/null
+++ b/src/main/java/gregtech/api/task/tasks/PowerOutputTask.java
@@ -0,0 +1,32 @@
+package gregtech.api.task.tasks;
+
+import javax.annotation.Nonnull;
+
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.task.TaskHost;
+import gregtech.api.task.TickableTask;
+
+public class PowerOutputTask<T extends PowerLogicHost & TaskHost & IMachineProgress> extends TickableTask<T> {
+
+ private static final String NAME = "powerOutput";
+
+ public PowerOutputTask(@Nonnull T taskHost) {
+ super(taskHost);
+ }
+
+ @Override
+ @Nonnull
+ public String getName() {
+ return NAME;
+ }
+
+ @Override
+ public void update(long tick, boolean isServerSide) {
+ if (!isServerSide) return;
+ if (!taskHost.isActive()) return;
+ if (!taskHost.isEnergyEmitter()) return;
+ taskHost.emitEnergyFromLogic();
+ }
+
+}
diff --git a/src/main/java/gregtech/api/task/tasks/ProcessingTask.java b/src/main/java/gregtech/api/task/tasks/ProcessingTask.java
new file mode 100644
index 0000000000..410c8d7a6f
--- /dev/null
+++ b/src/main/java/gregtech/api/task/tasks/ProcessingTask.java
@@ -0,0 +1,51 @@
+package gregtech.api.task.tasks;
+
+import javax.annotation.Nonnull;
+
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.logic.MuTEProcessingLogic;
+import gregtech.api.logic.interfaces.ProcessingLogicHost;
+import gregtech.api.task.TaskHost;
+import gregtech.api.task.TickableTask;
+
+public class ProcessingTask<T extends TaskHost & ProcessingLogicHost<P> & IMachineProgress, P extends MuTEProcessingLogic<P>>
+ extends TickableTask<T> {
+
+ public ProcessingTask(@Nonnull T taskHost) {
+ super(taskHost);
+ }
+
+ private static final String NAME = "processing";
+
+ @Override
+ @Nonnull
+ public String getName() {
+ return NAME;
+ }
+
+ @Override
+ public void update(long tick, boolean isServerSide) {
+ if (!isServerSide) return;
+ if (!taskHost.isAllowedToWork()) return;
+ final P logic = taskHost.getProcessingLogic();
+ if (taskHost.needsUpdate()) {
+ taskHost.updateProcessingLogic(logic);
+ taskHost.setProcessingUpdate(false);
+ }
+ if (logic.canWork() && tick % 100 == 0) {
+ taskHost.setProcessingLogicPower(logic);
+ logic.startCheck();
+ if (logic.getResult()
+ .wasSuccessful()) {
+ taskHost.setActive(true);
+ }
+ }
+
+ if (taskHost.hasThingsToDo()) {
+ logic.progress();
+ } else {
+ taskHost.setActive(false);
+ }
+ }
+
+}
diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_Cable_Update.java b/src/main/java/gregtech/api/threads/GT_Runnable_Cable_Update.java
new file mode 100644
index 0000000000..4375d21e40
--- /dev/null
+++ b/src/main/java/gregtech/api/threads/GT_Runnable_Cable_Update.java
@@ -0,0 +1,84 @@
+package gregtech.api.threads;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.GT_Mod;
+import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable;
+import gregtech.common.GT_Proxy;
+
+public class GT_Runnable_Cable_Update extends GT_Runnable_MachineBlockUpdate {
+
+ protected GT_Runnable_Cable_Update(World aWorld, int posX, int posY, int posZ) {
+ super(aWorld, posX, posY, posZ);
+ }
+
+ public static void setCableUpdateValues(World aWorld, int posX, int posY, int posZ) {
+ if (isEnabled) {
+ EXECUTOR_SERVICE.submit(new GT_Runnable_Cable_Update(aWorld, posX, posY, posZ));
+ }
+ }
+
+ @Override
+ public void run() {
+ int posX, posY, posZ;
+ try {
+ while (!tQueue.isEmpty()) {
+ final long packedCoords = tQueue.dequeueLong();
+ posX = unpackLongX(packedCoords);
+ posY = unpackLongY(packedCoords);
+ posZ = unpackLongZ(packedCoords);
+
+ final TileEntity tTileEntity;
+
+ GT_Proxy.TICK_LOCK.lock();
+ try {
+ // we dont want to go over cables that are in unloaded chunks
+ // keeping the lock just to make sure no CME happens
+ if (world.blockExists(posX, posY, posZ)) {
+ tTileEntity = world.getTileEntity(posX, posY, posZ);
+ } else {
+ tTileEntity = null;
+ }
+ } finally {
+ GT_Proxy.TICK_LOCK.unlock();
+ }
+
+ // See if the block itself needs an update
+ if (tTileEntity instanceof IMachineBlockUpdateable)
+ ((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate();
+
+ // Now see if we should add the nearby blocks to the queue:
+ // only add blocks the cable is connected to
+ if (tTileEntity instanceof BaseMetaPipeEntity metaPipe
+ && metaPipe.getMetaTileEntity() instanceof GT_MetaPipeEntity_Cable cable) {
+ for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) {
+ final ForgeDirection side = ForgeDirection.VALID_DIRECTIONS[i];
+ if (cable.isConnectedAtSide(side)) {
+ final long tCoords = asLong(posX + side.offsetX, posY + side.offsetY, posZ + side.offsetZ);
+ if (visited.add(tCoords)) {
+ tQueue.enqueue(tCoords);
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ GT_Mod.GT_FML_LOGGER.error(
+ "Well this update was broken... " + initialX
+ + ", "
+ + initialY
+ + ", "
+ + initialZ
+ + ", mWorld={"
+ + world.getProviderName()
+ + " @dimId "
+ + world.provider.dimensionId
+ + "}",
+ e);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java
new file mode 100644
index 0000000000..3670655eaf
--- /dev/null
+++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java
@@ -0,0 +1,211 @@
+package gregtech.api.threads;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable;
+import gregtech.common.GT_Proxy;
+import it.unimi.dsi.fastutil.longs.LongArrayFIFOQueue;
+import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
+import it.unimi.dsi.fastutil.longs.LongSet;
+
+public class GT_Runnable_MachineBlockUpdate implements Runnable {
+
+ // Borrowed from Angelica until moving to GTNHLib or something
+ final static int SIZE_BITS_X = 26; // 1 + log2(MathHelper.roundUpToPowerOfTwo(30000000), RoundingMode.UNNECESSARY);
+ final static int SIZE_BITS_Z = SIZE_BITS_X;
+ final static int SIZE_BITS_Y = 64 - SIZE_BITS_X - SIZE_BITS_Z;
+ final static long BITS_X = (1L << SIZE_BITS_X) - 1L;
+ final static long BITS_Y = (1L << SIZE_BITS_Y) - 1L;
+ final static long BITS_Z = (1L << SIZE_BITS_Z) - 1L;
+ final static int BIT_SHIFT_Z = SIZE_BITS_Y;
+ final static int BIT_SHIFT_X = SIZE_BITS_Y + SIZE_BITS_Z;
+
+ static long asLong(int x, int y, int z) {
+ long l = 0L;
+ l |= ((long) x & BITS_X) << BIT_SHIFT_X;
+ l |= ((long) y & BITS_Y) << 0;
+ l |= ((long) z & BITS_Z) << BIT_SHIFT_Z;
+ return l;
+ }
+
+ public static int unpackLongX(long packedPos) {
+ return (int) (packedPos << 64 - BIT_SHIFT_X - SIZE_BITS_X >> 64 - SIZE_BITS_X);
+ }
+
+ public static int unpackLongY(long packedPos) {
+ return (int) (packedPos << 64 - SIZE_BITS_Y >> 64 - SIZE_BITS_Y);
+ }
+
+ public static int unpackLongZ(long packedPos) {
+ return (int) (packedPos << 64 - BIT_SHIFT_Z - SIZE_BITS_Z >> 64 - SIZE_BITS_Z);
+ }
+
+ // used by runner thread
+ protected final int initialX, initialY, initialZ;
+ protected final World world;
+ protected final LongSet visited = new LongOpenHashSet();
+ protected final LongArrayFIFOQueue tQueue = new LongArrayFIFOQueue();
+
+ // Threading
+ private static final ThreadFactory THREAD_FACTORY = r -> {
+ Thread thread = new Thread(r);
+ thread.setName("GT_MachineBlockUpdate");
+ return thread;
+ };
+ protected static ExecutorService EXECUTOR_SERVICE;
+
+ // This class should never be initiated outside of this class!
+ protected GT_Runnable_MachineBlockUpdate(World aWorld, int posX, int posY, int posZ) {
+ this.world = aWorld;
+ this.initialX = posX;
+ this.initialY = posY;
+ this.initialZ = posZ;
+ final long coords = asLong(posX, posY, posZ);
+ visited.add(coords);
+ tQueue.enqueue(coords);
+ }
+
+ public static boolean isEnabled() {
+ return isEnabled;
+ }
+
+ public static void setEnabled() {
+ GT_Runnable_MachineBlockUpdate.isEnabled = true;
+ }
+
+ public static void setDisabled() {
+ GT_Runnable_MachineBlockUpdate.isEnabled = false;
+ }
+
+ public static void setEnabled(boolean isEnabled) {
+ GT_Runnable_MachineBlockUpdate.isEnabled = isEnabled;
+ }
+
+ public static boolean isCurrentThreadEnabled() {
+ return perThreadEnable.get();
+ }
+
+ public static void setCurrentThreadEnabled(boolean perThreadEnable) {
+ GT_Runnable_MachineBlockUpdate.perThreadEnable.set(perThreadEnable);
+ }
+
+ protected static boolean isEnabled = true;
+ protected static final ThreadLocal<Boolean> perThreadEnable = ThreadLocal.withInitial(() -> true);
+
+ public static void setMachineUpdateValues(World aWorld, int posX, int posY, int posZ) {
+ if (isEnabled() && isCurrentThreadEnabled()) {
+ EXECUTOR_SERVICE.submit(new GT_Runnable_MachineBlockUpdate(aWorld, posX, posY, posZ));
+ }
+ }
+
+ public static void initExecutorService() {
+ EXECUTOR_SERVICE = Executors.newFixedThreadPool(
+ Math.max(
+ 1,
+ (Runtime.getRuntime()
+ .availableProcessors() * 2
+ / 3)),
+ THREAD_FACTORY);
+ }
+
+ public static void shutdownExecutorService() {
+ try {
+ GT_Mod.GT_FML_LOGGER.info("Shutting down Machine block update executor service");
+ EXECUTOR_SERVICE.shutdown(); // Disable new tasks from being submitted
+ // Wait a while for existing tasks to terminate
+ if (!EXECUTOR_SERVICE.awaitTermination(60, TimeUnit.SECONDS)) {
+ EXECUTOR_SERVICE.shutdownNow(); // Cancel currently executing tasks
+ // Wait a while for tasks to respond to being cancelled
+ if (!EXECUTOR_SERVICE.awaitTermination(60, TimeUnit.SECONDS)) {
+ GT_Mod.GT_FML_LOGGER.error(
+ "Well this didn't terminated well... GT_Runnable_MachineBlockUpdate.shutdownExecutorService");
+ }
+ }
+ } catch (InterruptedException ie) {
+ GT_Mod.GT_FML_LOGGER.error("Well this interruption got interrupted...", ie);
+ // (Re-)Cancel if current thread also interrupted
+ EXECUTOR_SERVICE.shutdownNow();
+ // Preserve interrupt status
+ Thread.currentThread()
+ .interrupt();
+ } catch (Exception e) {
+ GT_Mod.GT_FML_LOGGER.error("Well this didn't terminated well...", e);
+ // (Re-)Cancel in case
+ EXECUTOR_SERVICE.shutdownNow();
+ } finally {
+ GT_Mod.GT_FML_LOGGER.info("Leaving... GT_Runnable_MachineBlockUpdate.shutdownExecutorService");
+ }
+ }
+
+ @Override
+ public void run() {
+ int posX, posY, posZ;
+ try {
+ while (!tQueue.isEmpty()) {
+ final long packedCoords = tQueue.dequeueLong();
+ posX = unpackLongX(packedCoords);
+ posY = unpackLongY(packedCoords);
+ posZ = unpackLongZ(packedCoords);
+
+ final TileEntity tTileEntity;
+ final boolean isMachineBlock;
+
+ // This might load a chunk... which might load a TileEntity... which might get added to
+ // `loadedTileEntityList`... which might be in the process
+ // of being iterated over during `UpdateEntities()`... which might cause a
+ // ConcurrentModificationException. So, lock that shit.
+ GT_Proxy.TICK_LOCK.lock();
+ try {
+ tTileEntity = world.getTileEntity(posX, posY, posZ);
+ isMachineBlock = GregTech_API
+ .isMachineBlock(world.getBlock(posX, posY, posZ), world.getBlockMetadata(posX, posY, posZ));
+ } finally {
+ GT_Proxy.TICK_LOCK.unlock();
+ }
+
+ // See if the block itself needs an update
+ if (tTileEntity instanceof IMachineBlockUpdateable)
+ ((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate();
+
+ // Now see if we should add the nearby blocks to the queue:
+ // 1) If we've visited less than 5 blocks, then yes
+ // 2) If the tile says we should recursively updated (pipes don't, machine blocks do)
+ // 3) If the block at the coordinates is marked as a machine block
+ if (visited.size() < 5
+ || (tTileEntity instanceof IMachineBlockUpdateable
+ && ((IMachineBlockUpdateable) tTileEntity).isMachineBlockUpdateRecursive())
+ || isMachineBlock) {
+ for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) {
+ final ForgeDirection side = ForgeDirection.VALID_DIRECTIONS[i];
+ final long tCoords = asLong(posX + side.offsetX, posY + side.offsetY, posZ + side.offsetZ);
+ if (visited.add(tCoords)) {
+ tQueue.enqueue(tCoords);
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ GT_Mod.GT_FML_LOGGER.error(
+ "Well this update was broken... " + initialX
+ + ", "
+ + initialY
+ + ", "
+ + initialZ
+ + ", mWorld={"
+ + world.getProviderName()
+ + " @dimId "
+ + world.provider.dimensionId
+ + "}",
+ e);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_Sound.java b/src/main/java/gregtech/api/threads/GT_Runnable_Sound.java
new file mode 100644
index 0000000000..9021a60e89
--- /dev/null
+++ b/src/main/java/gregtech/api/threads/GT_Runnable_Sound.java
@@ -0,0 +1,41 @@
+package gregtech.api.threads;
+
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.World;
+
+import gregtech.api.util.GT_PlayedSound;
+import gregtech.api.util.GT_Utility;
+
+public class GT_Runnable_Sound implements Runnable {
+
+ private final double mX, mY, mZ;
+ private final int mTimeUntilNextSound;
+ private final World mWorld;
+ private final ResourceLocation mSoundResourceLocation;
+ private final float mSoundStrength, mSoundModulation;
+
+ public GT_Runnable_Sound(World aWorld, double aX, double aY, double aZ, int aTimeUntilNextSound,
+ ResourceLocation aSoundResourceLocation, float aSoundStrength, float aSoundModulation) {
+ mWorld = aWorld;
+ mX = aX;
+ mY = aY;
+ mZ = aZ;
+ mTimeUntilNextSound = aTimeUntilNextSound;
+ mSoundResourceLocation = aSoundResourceLocation;
+ mSoundStrength = aSoundStrength;
+ mSoundModulation = aSoundModulation;
+ }
+
+ @Override
+ public void run() {
+ try {
+ GT_PlayedSound tSound;
+ if (GT_Utility.sPlayedSoundMap.containsKey(tSound = new GT_PlayedSound(mSoundResourceLocation, mX, mY, mZ)))
+ return;
+ mWorld.playSound(mX, mY, mZ, mSoundResourceLocation.toString(), mSoundStrength, mSoundModulation, false);
+ GT_Utility.sPlayedSoundMap.put(tSound, mTimeUntilNextSound);
+ } catch (Throwable e) {
+ /**/
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/AveragePerTickCounter.java b/src/main/java/gregtech/api/util/AveragePerTickCounter.java
new file mode 100644
index 0000000000..c9b1275deb
--- /dev/null
+++ b/src/main/java/gregtech/api/util/AveragePerTickCounter.java
@@ -0,0 +1,139 @@
+package gregtech.api.util;
+
+import java.security.InvalidParameterException;
+import java.util.ArrayDeque;
+
+import net.minecraft.server.MinecraftServer;
+
+public class AveragePerTickCounter {
+
+ /**
+ * Averages a value over a certain amount of ticks
+ *
+ * @param period amount of ticks to average (20 for 1 second)
+ *
+ */
+ public AveragePerTickCounter(int period) throws InvalidParameterException {
+
+ if (period <= 0) throw new InvalidParameterException("period should be a positive non-zero number");
+
+ this.period = period;
+ values = new ArrayDeque<>(period);
+ }
+
+ public void addValue(long value) {
+
+ if (value == 0) return;
+
+ final int currTick = getWorldTimeInTicks();
+
+ if (values.isEmpty()) {
+ values.addLast(new Measurement(currTick, value));
+ isCachedAverageValid = false;
+ return;
+ }
+
+ Measurement lastMeasurement = values.peekLast();
+ final int lastMeasurementTick = lastMeasurement.TimestampInWorldTicks;
+
+ /// sums up values added in the same tick
+ /// for example a cable had an amp running through it multiple times in the same tick
+ if (currTick == lastMeasurementTick) {
+ lastMeasurement.Value = lastMeasurement.Value + value;
+ isCachedAverageValid = false;
+ return;
+ }
+
+ if (currTick > lastMeasurementTick) {
+ trimIrrelevantData(currTick);
+
+ values.addLast(new Measurement(currTick, value));
+ isCachedAverageValid = false;
+ return;
+ }
+ }
+
+ public double getAverage() {
+
+ if (values.isEmpty()) return 0;
+
+ final int currTick = getWorldTimeInTicks();
+
+ Measurement lastMeasurement = values.peekLast();
+ final int lastMeasurementTick = lastMeasurement.TimestampInWorldTicks;
+
+ if (currTick < lastMeasurementTick) return 0;
+
+ if (currTick > lastMeasurementTick) {
+ trimIrrelevantData(currTick);
+ }
+
+ if (isCachedAverageValid) return cachedAverage;
+
+ return calculateAverage();
+ }
+
+ public long getLast() {
+
+ if (values.isEmpty()) return 0;
+
+ final int currTick = getWorldTimeInTicks();
+
+ Measurement lastMeasurement = values.peekLast();
+ final int lastMeasurementTick = lastMeasurement.TimestampInWorldTicks;
+
+ if (currTick == lastMeasurementTick) return values.getLast().Value;
+
+ return 0;
+ }
+
+ private double calculateAverage() {
+
+ isCachedAverageValid = true;
+ long sum = 0;
+
+ for (Measurement measurement : values) {
+ sum += measurement.Value;
+ }
+
+ return sum / (double) period;
+ }
+
+ private void trimIrrelevantData(int currWorldTimeInTicks) {
+
+ if (values.isEmpty()) return;
+
+ int firstMeasurementTick = values.peekFirst().TimestampInWorldTicks;
+
+ while (currWorldTimeInTicks - firstMeasurementTick >= period) {
+ values.removeFirst();
+ isCachedAverageValid = false;
+
+ if (values.isEmpty()) return;
+
+ firstMeasurementTick = values.peekFirst().TimestampInWorldTicks;
+ }
+ }
+
+ private int getWorldTimeInTicks() {
+ return MinecraftServer.getServer()
+ .getTickCounter();
+ }
+
+ private ArrayDeque<Measurement> values;
+ private int period;
+
+ private double cachedAverage = 0;
+ private boolean isCachedAverageValid = true;
+
+ private class Measurement {
+
+ public int TimestampInWorldTicks;
+ public long Value;
+
+ public Measurement(int timestampInWorldTicks, long value) {
+ this.TimestampInWorldTicks = timestampInWorldTicks;
+ this.Value = value;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/ColorsMetadataSection.java b/src/main/java/gregtech/api/util/ColorsMetadataSection.java
new file mode 100644
index 0000000000..fb9cc6dd56
--- /dev/null
+++ b/src/main/java/gregtech/api/util/ColorsMetadataSection.java
@@ -0,0 +1,63 @@
+package gregtech.api.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.client.resources.data.IMetadataSection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class ColorsMetadataSection implements IMetadataSection {
+
+ private final Map<String, Integer> textColors;
+ private final Map<String, String> hexTextColors;
+ private final Map<String, Integer> guiTints;
+ private final Map<String, String> hexGuiTints;
+ private final boolean guiTintEnabled;
+
+ public ColorsMetadataSection(Map<String, String> hexTextColorMap, Map<String, String> hexGuiTintMap,
+ boolean guiTintEnabled) {
+ this.hexTextColors = hexTextColorMap;
+ this.textColors = convertHexMapToIntMap(hexTextColorMap);
+
+ this.hexGuiTints = hexGuiTintMap;
+ this.guiTints = convertHexMapToIntMap(hexGuiTintMap);
+
+ this.guiTintEnabled = guiTintEnabled;
+ }
+
+ private Map<String, Integer> convertHexMapToIntMap(Map<String, String> hexMap) {
+ Map<String, Integer> intMap = new HashMap<>();
+
+ for (String key : hexMap.keySet()) {
+ int colorValue = -1;
+ String hex = hexMap.get(key);
+ try {
+ if (!hex.isEmpty()) colorValue = Integer.parseUnsignedInt(hex, 16);
+ } catch (final NumberFormatException e) {
+ GT_Log.err.println("Couldn't format color correctly of " + key + " -> " + hex);
+ }
+ intMap.put(key, colorValue);
+ }
+ return intMap;
+ }
+
+ public int getTextColorOrDefault(String key, int defaultColor) {
+ return isColorInMap(key, this.hexTextColors) ? this.textColors.get(key) : defaultColor;
+ }
+
+ public int getGuiTintOrDefault(String key, int defaultColor) {
+ return isColorInMap(key, this.hexGuiTints) ? this.guiTints.get(key) : defaultColor;
+ }
+
+ private boolean isColorInMap(String key, Map<String, String> hexMap) {
+ return hexMap.containsKey(key) && !hexMap.get(key)
+ .isEmpty();
+ }
+
+ public boolean sGuiTintingEnabled() {
+ return this.guiTintEnabled;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/ColorsMetadataSectionSerializer.java b/src/main/java/gregtech/api/util/ColorsMetadataSectionSerializer.java
new file mode 100644
index 0000000000..389662d041
--- /dev/null
+++ b/src/main/java/gregtech/api/util/ColorsMetadataSectionSerializer.java
@@ -0,0 +1,81 @@
+package gregtech.api.util;
+
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.client.resources.data.BaseMetadataSectionSerializer;
+import net.minecraft.util.JsonUtils;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonSerializationContext;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Dyes;
+
+@SideOnly(Side.CLIENT)
+public class ColorsMetadataSectionSerializer extends BaseMetadataSectionSerializer {
+
+ public ColorsMetadataSection deserialize(JsonElement metadataColors, Type type,
+ JsonDeserializationContext context) {
+ // Default values
+ boolean enableGuiTint = GregTech_API.sColoredGUI;
+ Map<String, String> hexGuiTintMap = new HashMap<>();
+ Map<String, String> hexTextColorMap = new HashMap<>();
+
+ JsonObject jsonObject = JsonUtils.getJsonElementAsJsonObject(metadataColors, "metadata section");
+ if (jsonObject.has("textColor")) {
+ JsonObject textColors = JsonUtils.func_152754_s(jsonObject, "textColor");
+ for (Map.Entry<String, JsonElement> entry : textColors.entrySet()) {
+ if (entry.getValue()
+ .isJsonPrimitive()) {
+ hexTextColorMap.put(
+ entry.getKey(),
+ entry.getValue()
+ .getAsString());
+ } else {
+ GT_Mod.GT_FML_LOGGER.warn("ColorOverride expects primitive value for key `textColor`");
+ }
+ }
+ }
+
+ if (jsonObject.has("guiTint")) {
+ JsonObject guiTints = JsonUtils.func_152754_s(jsonObject, "guiTint");
+ enableGuiTint = JsonUtils
+ .getJsonObjectBooleanFieldValueOrDefault(guiTints, "enableGuiTintWhenPainted", true);
+
+ for (Dyes dye : Dyes.values()) {
+ hexGuiTintMap.put(dye.mName, GT_Util.toHexString(dye.getRGBA()));
+ }
+
+ for (String key : hexGuiTintMap.keySet()) {
+ if (enableGuiTint) {
+ hexGuiTintMap.replace(
+ key,
+ JsonUtils.getJsonObjectStringFieldValueOrDefault(guiTints, key, hexGuiTintMap.get(key)));
+ } else {
+ hexGuiTintMap.replace(key, GT_Util.toHexString(Dyes.dyeWhite.getRGBA()));
+ }
+ }
+ }
+
+ return new ColorsMetadataSection(hexTextColorMap, hexGuiTintMap, enableGuiTint);
+ }
+
+ public JsonElement serialize(ColorsMetadataSection colorsMetaSection, Type type, JsonSerializationContext context) {
+ return new JsonObject();
+ }
+
+ public String getSectionName() {
+ return "colors";
+ }
+
+ public JsonElement serialize(Object object, Type type, JsonSerializationContext context) {
+ return this.serialize((ColorsMetadataSection) object, type, context);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/ExternalMaterials.java b/src/main/java/gregtech/api/util/ExternalMaterials.java
new file mode 100644
index 0000000000..29564db2fd
--- /dev/null
+++ b/src/main/java/gregtech/api/util/ExternalMaterials.java
@@ -0,0 +1,14 @@
+package gregtech.api.util;
+
+import gregtech.api.enums.Materials;
+
+public class ExternalMaterials {
+
+ public static Materials getRhodiumPlatedPalladium() {
+ return Materials.getWithFallback("Rhodium-PlatedPalladium", Materials.Chrome);
+ }
+
+ public static Materials getRuridit() {
+ return Materials.getWithFallback("Ruridit", Materials.Osmiridium);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/FieldsAreNonnullByDefault.java b/src/main/java/gregtech/api/util/FieldsAreNonnullByDefault.java
new file mode 100644
index 0000000000..1f51aa39a7
--- /dev/null
+++ b/src/main/java/gregtech/api/util/FieldsAreNonnullByDefault.java
@@ -0,0 +1,18 @@
+package gregtech.api.util;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * This annotation can be applied to a package or class to indicate that
+ * the fields in that element are nonnull by default unless there is an explicit nullness annotation.
+ * </ul>
+ */
+@Nonnull
+@TypeQualifierDefault({ ElementType.FIELD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface FieldsAreNonnullByDefault {}
diff --git a/src/main/java/gregtech/api/util/GT_ApiaryModifier.java b/src/main/java/gregtech/api/util/GT_ApiaryModifier.java
new file mode 100644
index 0000000000..4a89345670
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_ApiaryModifier.java
@@ -0,0 +1,24 @@
+package gregtech.api.util;
+
+import net.minecraft.world.biome.BiomeGenBase;
+
+public class GT_ApiaryModifier {
+
+ public float territory = 1f;
+ public float mutation = 1f;
+ public float lifespan = 1f;
+ public float production = 2f;
+ public float flowering = 1f;
+ public float geneticDecay = 1f;
+ public boolean isSealed = false;
+ public boolean isSelfLighted = false;
+ public boolean isSelfUnlighted = false;
+ public boolean isSunlightSimulated = false;
+ public boolean isAutomated = false;
+ public boolean isCollectingPollen = false;
+ public BiomeGenBase biomeOverride = null;
+ public float energy = 1f;
+ public float temperature = 0f;
+ public float humidity = 0f;
+ public int maxSpeed = 0;
+}
diff --git a/src/main/java/gregtech/api/util/GT_ApiaryUpgrade.java b/src/main/java/gregtech/api/util/GT_ApiaryUpgrade.java
new file mode 100644
index 0000000000..9ed7a56e1e
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_ApiaryUpgrade.java
@@ -0,0 +1,225 @@
+package gregtech.api.util;
+
+import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.biome.BiomeGenBase;
+
+import gregtech.api.enums.OrePrefixes;
+import gregtech.common.items.GT_MetaGenerated_Item_03;
+
+/**
+ * Actual items are defined in {@link GT_MetaGenerated_Item_03}
+ */
+public enum GT_ApiaryUpgrade {
+
+ speed1(UNIQUE_INDEX.SPEED_UPGRADE, 32200, 1, (mods, n) -> mods.maxSpeed = 1),
+ speed2(UNIQUE_INDEX.SPEED_UPGRADE, 32201, 1, (mods, n) -> mods.maxSpeed = 2),
+ speed3(UNIQUE_INDEX.SPEED_UPGRADE, 32202, 1, (mods, n) -> mods.maxSpeed = 3),
+ speed4(UNIQUE_INDEX.SPEED_UPGRADE, 32203, 1, (mods, n) -> mods.maxSpeed = 4),
+ speed5(UNIQUE_INDEX.SPEED_UPGRADE, 32204, 1, (mods, n) -> mods.maxSpeed = 5),
+ speed6(UNIQUE_INDEX.SPEED_UPGRADE, 32205, 1, (mods, n) -> mods.maxSpeed = 6),
+ speed7(UNIQUE_INDEX.SPEED_UPGRADE, 32206, 1, (mods, n) -> mods.maxSpeed = 7),
+ speed8(UNIQUE_INDEX.SPEED_UPGRADE, 32207, 1, (mods, n) -> mods.maxSpeed = 8),
+ speed8upgraded(UNIQUE_INDEX.SPEED_UPGRADE, 32208, 1, (mods, n) -> {
+ mods.maxSpeed = 8;
+ mods.production = 17.19926784f;
+ mods.energy *= 14.75;
+ }),
+ production(UNIQUE_INDEX.PRODUCTION_UPGRADE, 32209, 8, (mods, n) -> {
+ mods.production = 4.f * (float) Math.pow(1.2d, n);
+ mods.energy *= Math.pow(1.4f, n);
+ }),
+ plains(UNIQUE_INDEX.PLAINS_UPGRADE, 32210, 1, (mods, n) -> {
+ mods.biomeOverride = BiomeGenBase.plains;
+ mods.energy *= 1.2f;
+ }),
+ light(UNIQUE_INDEX.LIGHT_UPGRADE, 32211, 1, (mods, n) -> {
+ mods.isSelfLighted = true;
+ mods.energy *= 1.05f;
+ }),
+ flowering(UNIQUE_INDEX.FLOWERING_UPGRADE, 32212, 8, (mods, n) -> {
+ mods.flowering *= Math.pow(1.2f, n);
+ mods.energy *= Math.pow(1.1f, n);
+ }),
+ winter(UNIQUE_INDEX.WINTER_UPGRADE, 32213, 1, (mods, n) -> {
+ mods.biomeOverride = BiomeGenBase.taiga;
+ mods.energy *= 1.5f;
+ }),
+ dryer(UNIQUE_INDEX.DRYER_UPGRADE, 32214, 16, (mods, n) -> {
+ mods.humidity -= 0.125f * n;
+ mods.energy *= Math.pow(1.025f, n);
+ }),
+ automation(UNIQUE_INDEX.AUTOMATION_UPGRADE, 32215, 1, (mods, n) -> {
+ mods.isAutomated = true;
+ mods.energy *= 1.1f;
+ }),
+ humidifier(UNIQUE_INDEX.HUMIDIFIER_UPGRADE, 32216, 16, (mods, n) -> {
+ mods.humidity += 0.125f * n;
+ mods.energy *= Math.pow(1.05f, n);
+ }),
+ hell(UNIQUE_INDEX.HELL_UPGRADE, 32217, 1, (mods, n) -> {
+ mods.biomeOverride = BiomeGenBase.hell;
+ mods.energy *= 1.5f;
+ }),
+ pollen(UNIQUE_INDEX.POLLEN_UPGRADE, 32218, 1, (mods, n) -> {
+ mods.flowering = 0f;
+ mods.energy *= 1.3f;
+ }),
+ desert(UNIQUE_INDEX.DESERT_UPGRADE, 32219, 1, (mods, n) -> {
+ mods.biomeOverride = BiomeGenBase.desert;
+ mods.energy *= 1.2f;
+ }),
+ cooler(UNIQUE_INDEX.COOLER_UPGRADE, 32220, 16, (mods, n) -> {
+ mods.temperature -= 0.125f * n;
+ mods.energy *= Math.pow(1.025f, n);
+ }),
+ lifespan(UNIQUE_INDEX.LIFESPAN_UPGRADE, 32221, 4, (mods, n) -> {
+ mods.lifespan /= Math.pow(1.5f, n);
+ mods.energy *= Math.pow(1.05f, n);
+ }),
+ seal(UNIQUE_INDEX.SEAL_UPGRADE, 32222, 1, (mods, n) -> {
+ mods.isSealed = true;
+ mods.energy *= 1.05f;
+ }),
+ stabilizer(UNIQUE_INDEX.STABILIZER_UPGRADE, 32223, 1, (mods, n) -> {
+ mods.geneticDecay = 0f;
+ mods.energy *= 2.50f;
+ }),
+ jungle(UNIQUE_INDEX.JUNGLE_UPGRADE, 32224, 1, (mods, n) -> {
+ mods.biomeOverride = BiomeGenBase.jungle;
+ mods.energy *= 1.20f;
+ }),
+ territory(UNIQUE_INDEX.TERRITORY_UPGRADE, 32225, 4, (mods, n) -> {
+ mods.territory *= Math.pow(1.5f, n);
+ mods.energy *= Math.pow(1.05f, n);
+ }),
+ ocean(UNIQUE_INDEX.OCEAN_UPGRADE, 32226, 1, (mods, n) -> {
+ mods.biomeOverride = BiomeGenBase.ocean;
+ mods.energy *= 1.20f;
+ }),
+ sky(UNIQUE_INDEX.SKY_UPGRADE, 32227, 1, (mods, n) -> {
+ mods.isSunlightSimulated = true;
+ mods.energy *= 1.05f;
+ }),
+ heater(UNIQUE_INDEX.HEATER_UPGRADE, 32228, 16, (mods, n) -> {
+ mods.temperature += 0.125f * n;
+ mods.energy *= Math.pow(1.025f, n);
+ }),
+ sieve(UNIQUE_INDEX.SIEVE_UPGRADE, 32229, 1, (mods, n) -> {
+ mods.isCollectingPollen = true;
+ mods.energy *= 1.05f;
+ }),
+ unlight(UNIQUE_INDEX.LIGHT_UPGRADE, 32231, 1, (mods, n) -> {
+ mods.isSelfUnlighted = true;
+ mods.energy *= 1.05f;
+ }),;
+
+ private enum UNIQUE_INDEX {
+
+ SPEED_UPGRADE,
+ PRODUCTION_UPGRADE,
+ PLAINS_UPGRADE,
+ LIGHT_UPGRADE, // also unlight
+ FLOWERING_UPGRADE,
+ WINTER_UPGRADE,
+ DRYER_UPGRADE,
+ AUTOMATION_UPGRADE,
+ HUMIDIFIER_UPGRADE,
+ HELL_UPGRADE,
+ POLLEN_UPGRADE,
+ DESERT_UPGRADE,
+ COOLER_UPGRADE,
+ LIFESPAN_UPGRADE,
+ SEAL_UPGRADE,
+ STABILIZER_UPGRADE,
+ JUNGLE_UPGRADE,
+ TERRITORY_UPGRADE,
+ OCEAN_UPGRADE,
+ SKY_UPGRADE,
+ HEATER_UPGRADE,
+ SIEVE_UPGRADE,;
+
+ void apply(Consumer<GT_ApiaryUpgrade> fn) {
+ UNIQUE_UPGRADE_LIST.get(this)
+ .forEach(fn);
+ }
+ }
+
+ private static final EnumMap<UNIQUE_INDEX, ArrayList<GT_ApiaryUpgrade>> UNIQUE_UPGRADE_LIST = new EnumMap<>(
+ UNIQUE_INDEX.class);
+
+ private int meta = 0;
+ private int maxnumber = 1;
+
+ private final GT_Utility.ItemId id;
+ private final UNIQUE_INDEX unique_index;
+ private final BiConsumer<GT_ApiaryModifier, Integer> applier;
+
+ private final HashSet<GT_Utility.ItemId> blacklistedUpgrades = new HashSet<>();
+
+ GT_ApiaryUpgrade(UNIQUE_INDEX unique_index, int meta, int maxnumber,
+ BiConsumer<GT_ApiaryModifier, Integer> applier) {
+ this.unique_index = unique_index;
+ this.meta = meta;
+ this.maxnumber = maxnumber;
+ this.applier = applier;
+ this.id = GT_Utility.ItemId.createNoCopy(get(1));
+ }
+
+ private void setup_static_variables() {
+ quickLookup.put(this.meta, this);
+ ArrayList<GT_ApiaryUpgrade> un = UNIQUE_UPGRADE_LIST.get(this.unique_index);
+ if (un != null) un.forEach((u) -> {
+ u.blacklistedUpgrades.add(this.id);
+ this.blacklistedUpgrades.add(u.id);
+ });
+ else {
+ un = new ArrayList<>(1);
+ UNIQUE_UPGRADE_LIST.put(this.unique_index, un);
+ }
+ un.add(this);
+ }
+
+ public static GT_ApiaryUpgrade getUpgrade(ItemStack s) {
+ if (s == null) return null;
+ if (!isUpgrade(s)) return null;
+ return quickLookup.get(s.getItemDamage());
+ }
+
+ public boolean isAllowedToWorkWith(ItemStack s) {
+ GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(s);
+ return !blacklistedUpgrades.contains(id);
+ }
+
+ public int getMaxNumber() {
+ return maxnumber;
+ }
+
+ public void applyModifiers(GT_ApiaryModifier mods, ItemStack stack) {
+ if (applier != null) applier.accept(mods, stack.stackSize);
+ }
+
+ public ItemStack get(int count) {
+ return new ItemStack(GT_MetaGenerated_Item_03.INSTANCE, count, meta);
+ }
+
+ public static boolean isUpgrade(ItemStack s) {
+ return OrePrefixes.apiaryUpgrade.contains(s);
+ }
+
+ private static final HashMap<Integer, GT_ApiaryUpgrade> quickLookup = new HashMap<>();
+
+ static {
+ EnumSet.allOf(GT_ApiaryUpgrade.class)
+ .forEach(GT_ApiaryUpgrade::setup_static_variables);
+ speed8upgraded.blacklistedUpgrades.add(production.id);
+ production.blacklistedUpgrades.add(speed8upgraded.id);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_AssemblyLineUtils.java b/src/main/java/gregtech/api/util/GT_AssemblyLineUtils.java
new file mode 100644
index 0000000000..1ada9c78d5
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_AssemblyLineUtils.java
@@ -0,0 +1,557 @@
+package gregtech.api.util;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
+import net.minecraftforge.common.util.Constants.NBT;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_Recipe.GT_Recipe_AssemblyLine;
+
+public class GT_AssemblyLineUtils {
+
+ /**
+ * A cache of Recipes using the Output as Key.
+ */
+ private static final HashMap<GT_ItemStack, GT_Recipe_AssemblyLine> sRecipeCacheByOutput = new HashMap<>();
+ /**
+ * A cache of Recipes using the Recipe Hash String as Key.
+ */
+ private static final HashMap<String, GT_Recipe_AssemblyLine> sRecipeCacheByRecipeHash = new HashMap<>();
+
+ /**
+ * Checks the DataStick for deprecated/invalid recipes, updating them as required.
+ *
+ * @param aDataStick - The DataStick to process
+ * @return Is this DataStick now valid with a current recipe?
+ */
+ public static GT_Recipe_AssemblyLine processDataStick(ItemStack aDataStick) {
+ if (!isItemDataStick(aDataStick)) {
+ return null;
+ }
+ if (doesDataStickNeedUpdate(aDataStick)) {
+ ItemStack aStickOutput = getDataStickOutput(aDataStick);
+ if (aStickOutput != null) {
+ GT_Recipe_AssemblyLine aIntendedRecipe = findAssemblyLineRecipeByOutput(aStickOutput);
+ if (aIntendedRecipe != null && setAssemblyLineRecipeOnDataStick(aDataStick, aIntendedRecipe))
+ return aIntendedRecipe;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Finds an Assembly Line recipe from a DataStick.
+ *
+ * @param aDataStick - The DataStick to check.
+ * @return The GT_Recipe_AssemblyLine recipe contained on the DataStick, if any.
+ */
+ public static GT_Recipe_AssemblyLine findAssemblyLineRecipeFromDataStick(ItemStack aDataStick) {
+ return findAssemblyLineRecipeFromDataStick(aDataStick, false).getRecipe();
+ }
+
+ /**
+ * Finds an Assembly Line recipe from a DataStick.
+ *
+ * @param aDataStick - The DataStick to check.
+ * @param aReturnBuiltRecipe - Do we return a GT_Recipe_AssemblyLine built from the data on the Data Stick instead
+ * of searching the Recipe Map?
+ * @return The GT_Recipe_AssemblyLine recipe contained on the DataStick, if any.
+ */
+ @Nonnull
+ public static LookupResult findAssemblyLineRecipeFromDataStick(ItemStack aDataStick, boolean aReturnBuiltRecipe) {
+ if (!isItemDataStick(aDataStick) || !doesDataStickHaveOutput(aDataStick)) {
+ return LookupResultType.INVALID_STICK.getResult();
+ }
+ List<ItemStack> aInputs = new ArrayList<>(16);
+ ItemStack aOutput = getDataStickOutput(aDataStick);
+ List<List<ItemStack>> mOreDictAlt = new ArrayList<>(16);
+ List<FluidStack> aFluidInputs = new ArrayList<>(4);
+
+ NBTTagCompound aTag = aDataStick.getTagCompound();
+ if (aTag == null) {
+ return LookupResultType.INVALID_STICK.getResult();
+ }
+
+ // Get From Cache
+ if (doesDataStickHaveRecipeHash(aDataStick)) {
+ GT_Recipe_AssemblyLine aRecipeFromCache = sRecipeCacheByRecipeHash.get(getHashFromDataStack(aDataStick));
+ if (aRecipeFromCache != null && GT_Utility.areStacksEqual(aOutput, aRecipeFromCache.mOutput)) {
+ return LookupResultType.VALID_STACK_AND_VALID_HASH.getResult(aRecipeFromCache);
+ } // else: no cache, or the old recipe run into a hash collision with a different new recipe
+ }
+
+ for (int i = 0; i < 16; i++) {
+ int count = aTag.getInteger("a" + i);
+ if (!aTag.hasKey("" + i) && count <= 0) {
+ continue;
+ }
+
+ List<ItemStack> tAltCurrent = new ArrayList<>();
+ for (int j = 0; j < count; j++) {
+ ItemStack tLoaded = GT_Utility.loadItem(aTag, "a" + i + ":" + j);
+ if (tLoaded == null) {
+ continue;
+ }
+ tAltCurrent.add(tLoaded);
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Item Alt " + i + " : " + tLoaded.getUnlocalizedName());
+ }
+ }
+ mOreDictAlt.add(tAltCurrent);
+ ItemStack tLoaded = GT_Utility.loadItem(aTag, "" + i);
+ if (tLoaded == null) {
+ continue;
+ }
+ aInputs.add(tLoaded);
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Item " + i + " : " + tLoaded.getUnlocalizedName());
+ }
+ }
+
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("All Items done, start fluid check");
+ }
+ for (int i = 0; i < 4; i++) {
+ if (!aTag.hasKey("f" + i)) continue;
+ FluidStack tLoaded = GT_Utility.loadFluid(aTag, "f" + i);
+ if (tLoaded == null) continue;
+ aFluidInputs.add(tLoaded);
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Fluid " + i + " " + tLoaded.getUnlocalizedName());
+ }
+ }
+ if (!aTag.hasKey("output") || !aTag.hasKey("time")
+ || aTag.getInteger("time") <= 0
+ || !aTag.hasKey("eu")
+ || !GT_Utility.isStackValid(aOutput)) {
+ return LookupResultType.INVALID_STICK.getResult();
+ }
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Found Data Stick recipe");
+ }
+
+ int aTime = aTag.getInteger("time");
+ int aEU = aTag.getInteger("eu");
+
+ // Try build a recipe instance
+ if (aReturnBuiltRecipe) {
+ return LookupResultType.VALID_STACK_AND_VALID_HASH.getResult(
+ new GT_Recipe_AssemblyLine(
+ null,
+ 0,
+ aInputs.toArray(new ItemStack[0]),
+ aFluidInputs.toArray(new FluidStack[0]),
+ aOutput,
+ aTime,
+ aEU));
+ }
+
+ for (GT_Recipe_AssemblyLine aRecipe : GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes) {
+ if (aRecipe.mEUt != aEU || aRecipe.mDuration != aTime) continue;
+ if (!GT_Utility.areStacksEqual(aOutput, aRecipe.mOutput, true)) continue;
+ if (!GT_Utility.areStackListsEqual(Arrays.asList(aRecipe.mInputs), aInputs, false, true)) continue;
+ if (!Objects.equals(Arrays.asList(aRecipe.mFluidInputs), aFluidInputs)) continue;
+ if (!areStacksEqual(aRecipe.mOreDictAlt, mOreDictAlt)) continue;
+
+ // Cache it
+ String aRecipeHash = generateRecipeHash(aRecipe);
+ sRecipeCacheByRecipeHash.put(aRecipeHash, aRecipe);
+ sRecipeCacheByOutput.put(new GT_ItemStack(aRecipe.mOutput), aRecipe);
+ if (doesDataStickHaveRecipeHash(aDataStick)) {
+ String aStickHash = getHashFromDataStack(aDataStick);
+ if (aRecipeHash.equals(aStickHash))
+ return LookupResultType.VALID_STACK_AND_VALID_HASH.getResult(aRecipe);
+ }
+ return LookupResultType.VALID_STACK_AND_VALID_RECIPE.getResult(aRecipe);
+ }
+ return LookupResultType.VALID_STACK_BUT_INVALID_RECIPE.getResult();
+ }
+
+ private static boolean areStacksEqual(ItemStack[][] lhs, List<List<ItemStack>> rhs) {
+ for (int i = 0; i < lhs.length; i++) {
+ if (!areStacksEqual(lhs[i], rhs.get(i))) return false;
+ }
+ return true;
+ }
+
+ private static boolean areStacksEqual(ItemStack[] lhs, List<ItemStack> rhs) {
+ return lhs == null ? rhs.isEmpty()
+ : !rhs.isEmpty() && GT_Utility.areStackListsEqual(Arrays.asList(lhs), rhs, false, true);
+ }
+
+ /**
+ * Finds a GT_Recipe_AssemblyLine based on the expected output ItemStack.
+ *
+ * @param aOutput - The Output of a GT_Recipe_AssemblyLine.
+ * @return First found GT_Recipe_AssemblyLine with matching output.
+ */
+ public static GT_Recipe_AssemblyLine findAssemblyLineRecipeByOutput(ItemStack aOutput) {
+ if (aOutput == null) {
+ return null;
+ }
+
+ // Check the cache
+ GT_ItemStack aCacheStack = new GT_ItemStack(aOutput);
+ GT_Recipe_AssemblyLine aRecipeFromCache = sRecipeCacheByOutput.get(aCacheStack);
+ if (aRecipeFromCache != null) {
+ return aRecipeFromCache;
+ }
+
+ // Iterate all recipes and return the first matching based on Output.
+ for (GT_Recipe_AssemblyLine aRecipe : GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes) {
+ ItemStack aRecipeOutput = aRecipe.mOutput;
+ if (GT_Utility.areStacksEqual(aRecipeOutput, aOutput)) {
+ // Cache it to prevent future iterations of all recipes
+ sRecipeCacheByOutput.put(aCacheStack, aRecipe);
+ sRecipeCacheByRecipeHash.put(generateRecipeHash(aRecipe), aRecipe);
+ return aRecipe;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @param aRecipe - The recipe to generate a Recipe Hash String from.
+ * @return The Recipe Hash String.
+ */
+ public static String generateRecipeHash(GT_Recipe_AssemblyLine aRecipe) {
+ String aHash = "Invalid.Recipe.Hash";
+ if (aRecipe != null) {
+ aHash = "Hash." + aRecipe.getPersistentHash();
+ }
+ return aHash;
+ }
+
+ /**
+ * @param aRecipe - The recipe to add to internal caches
+ * @throws IllegalArgumentException if given recipe collide with any existing recipe in the cache
+ */
+ public static void addRecipeToCache(GT_Recipe_AssemblyLine aRecipe) {
+ if (aRecipe != null) {
+ String aHash = "Hash." + aRecipe.getPersistentHash();
+ GT_Recipe_AssemblyLine existing = sRecipeCacheByOutput.put(new GT_ItemStack(aRecipe.mOutput), aRecipe);
+ if (existing != null) throw new IllegalArgumentException("Duplicate assline recipe for " + aRecipe.mOutput);
+ existing = sRecipeCacheByRecipeHash.put(aHash, aRecipe);
+ if (existing != null && !existing.equals(aRecipe))
+ throw new IllegalArgumentException("Recipe hash collision for " + aRecipe + " and " + existing);
+ }
+ }
+
+ /**
+ * @param aHash - Recipe hash String, may be null but will just be treated as invalid.
+ * @return Is this Recipe Hash String valid?
+ */
+ public static boolean isValidHash(String aHash) {
+ if (aHash != null && aHash.length() > 0) {
+ // persistent hash can never be 0
+ return !aHash.equals("Invalid.Recipe.Hash") && !aHash.equals("Hash.0");
+ }
+ return false;
+ }
+
+ /**
+ * @param aStack - The ItemStack to check.
+ * @return Is this ItemStack a Data Stick?
+ */
+ public static boolean isItemDataStick(ItemStack aStack) {
+ return GT_Utility.isStackValid(aStack) && ItemList.Tool_DataStick.isStackEqual(aStack, false, true);
+ }
+
+ /**
+ * @param aDataStick - The Data Stick to check.
+ * @return Does this Data Stick have a valid output ItemStack?
+ */
+ public static boolean doesDataStickHaveOutput(ItemStack aDataStick) {
+ return isItemDataStick(aDataStick) && aDataStick.hasTagCompound()
+ && aDataStick.getTagCompound()
+ .hasKey("output");
+ }
+
+ /**
+ * @param aDataStick - The Data Stick to check.
+ * @return Does this Data Stick need recipe data updated.
+ */
+ public static boolean doesDataStickNeedUpdate(ItemStack aDataStick) {
+ if (isItemDataStick(aDataStick) && doesDataStickHaveRecipeHash(aDataStick)) {
+ String aStickHash = getHashFromDataStack(aDataStick);
+ if (isValidHash(aStickHash) && doesDataStickHaveOutput(aDataStick)) {
+ ItemStack aStickOutput = getDataStickOutput(aDataStick);
+ GT_Recipe_AssemblyLine aIntendedRecipe = findAssemblyLineRecipeByOutput(aStickOutput);
+ return !aStickHash.equals(generateRecipeHash(aIntendedRecipe));
+ }
+ }
+ return true;
+ }
+
+ /**
+ * @param aDataStick - The Data Stick to check.
+ * @return Does this have a Recipe Hash String at all?
+ */
+ public static boolean doesDataStickHaveRecipeHash(ItemStack aDataStick) {
+ if (isItemDataStick(aDataStick) && aDataStick.hasTagCompound()) {
+ NBTTagCompound aNBT = aDataStick.getTagCompound();
+ return aNBT.hasKey("Data.Recipe.Hash") && !aNBT.getString("Data.Recipe.Hash")
+ .equals("Hash.0");
+ }
+ return false;
+ }
+
+ /**
+ * Get the Output ItemStack from a Data Stick.
+ *
+ * @param aDataStick - The Data Stick to check.
+ * @return Output ItemStack contained on the Data Stick.
+ */
+ public static ItemStack getDataStickOutput(ItemStack aDataStick) {
+ if (doesDataStickHaveOutput(aDataStick)) {
+ return GT_Utility.loadItem(aDataStick.getTagCompound(), "output");
+ }
+ return null;
+ }
+
+ /**
+ * @param aDataStick - The Data Stick to process.
+ * @return The stored Recipe Hash String on the Data Stick, will return an invalid Hash if one is not found.
+ * <p>
+ * The hash will be guaranteed to pass isValidHash().
+ * <p>
+ * Will not return Null.
+ */
+ public static String getHashFromDataStack(ItemStack aDataStick) {
+ if (isItemDataStick(aDataStick) && aDataStick.hasTagCompound()) {
+ NBTTagCompound aNBT = aDataStick.getTagCompound();
+ if (aNBT.hasKey("Data.Recipe.Hash", NBT.TAG_STRING)) {
+ String hash = aNBT.getString("Data.Recipe.Hash");
+ if (isValidHash(hash)) return hash;
+ }
+ }
+ return "Invalid.Recipe.Hash";
+ }
+
+ /**
+ *
+ * @param aDataStick - The Data Stick to update.
+ * @param aRecipeHash - The Recipe Hash String to update with.
+ * @return Did we update the Recipe Hash String on the Data Stick?
+ */
+ public static boolean setRecipeHashOnDataStick(ItemStack aDataStick, String aRecipeHash) {
+ if (isItemDataStick(aDataStick) && aDataStick.hasTagCompound()) {
+ NBTTagCompound aNBT = aDataStick.getTagCompound();
+ aNBT.setString("Data.Recipe.Hash", aRecipeHash);
+ aDataStick.setTagCompound(aNBT);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ *
+ * @param aDataStick - The Data Stick to update.
+ * @param aNewRecipe - The New GT_Recipe_AssemblyLine recipe to update it with.
+ * @return Did we set the new recipe data & Recipe Hash String on the Data Stick?
+ */
+ public static boolean setAssemblyLineRecipeOnDataStick(ItemStack aDataStick, GT_Recipe_AssemblyLine aNewRecipe) {
+ if (isItemDataStick(aDataStick)) {
+ String s = aNewRecipe.mOutput.getDisplayName();
+ if (FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isServer()) {
+ s = GT_Assemblyline_Server.lServerNames.get(aNewRecipe.mOutput.getDisplayName());
+ if (s == null) {
+ s = aNewRecipe.mOutput.getDisplayName();
+ }
+ }
+
+ String aHash = generateRecipeHash(aNewRecipe);
+ if (GT_Values.D1) {
+ GT_Recipe_AssemblyLine aOldRecipe = findAssemblyLineRecipeFromDataStick(aDataStick, true).recipe;
+ GT_FML_LOGGER.info(
+ "Updating data stick: " + aDataStick.getDisplayName()
+ + " | Old Recipe Hash: "
+ + generateRecipeHash(aOldRecipe)
+ + ", New Recipe Hash: "
+ + aHash);
+ }
+
+ String author = "Assembling Line Recipe Generator";
+ String displayName = null;
+ if (aDataStick.hasTagCompound()) {
+ NBTTagCompound tag = aDataStick.getTagCompound();
+ if (tag.hasKey("author", NBT.TAG_STRING)) {
+ author = tag.getString("author");
+ }
+ if (tag.hasKey("display", NBT.TAG_COMPOUND)) {
+ NBTTagCompound displayTag = tag.getCompoundTag("display");
+ if (displayTag.hasKey("Name", NBT.TAG_STRING)) displayName = displayTag.getString("Name");
+ }
+ }
+
+ // remove possible old NBTTagCompound
+ aDataStick.setTagCompound(new NBTTagCompound());
+ if (displayName != null) aDataStick.setStackDisplayName(displayName);
+ if (GT_Values.D1) {
+ GT_Utility.ItemNBT.setBookTitle(aDataStick, s + " Construction Data (" + aHash + ")");
+ } else {
+ GT_Utility.ItemNBT.setBookTitle(aDataStick, s + " Construction Data");
+ }
+
+ NBTTagCompound tNBT = aDataStick.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ }
+
+ tNBT.setTag("output", aNewRecipe.mOutput.writeToNBT(new NBTTagCompound()));
+ tNBT.setInteger("time", aNewRecipe.mDuration);
+ tNBT.setInteger("eu", aNewRecipe.mEUt);
+ for (int i = 0; i < aNewRecipe.mInputs.length; i++) {
+ tNBT.setTag("" + i, aNewRecipe.mInputs[i].writeToNBT(new NBTTagCompound()));
+ }
+ for (int i = 0; i < aNewRecipe.mOreDictAlt.length; i++) {
+ if (aNewRecipe.mOreDictAlt[i] != null && aNewRecipe.mOreDictAlt[i].length > 0) {
+ tNBT.setInteger("a" + i, aNewRecipe.mOreDictAlt[i].length);
+ for (int j = 0; j < aNewRecipe.mOreDictAlt[i].length; j++) {
+ tNBT.setTag("a" + i + ":" + j, aNewRecipe.mOreDictAlt[i][j].writeToNBT(new NBTTagCompound()));
+ }
+ }
+ }
+ for (int i = 0; i < aNewRecipe.mFluidInputs.length; i++) {
+ tNBT.setTag("f" + i, aNewRecipe.mFluidInputs[i].writeToNBT(new NBTTagCompound()));
+ }
+ tNBT.setString("author", author);
+ NBTTagList tNBTList = new NBTTagList();
+ s = aNewRecipe.mOutput.getDisplayName();
+ if (FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isServer()) {
+ s = GT_Assemblyline_Server.lServerNames.get(aNewRecipe.mOutput.getDisplayName());
+ if (s == null) s = aNewRecipe.mOutput.getDisplayName();
+ }
+ tNBTList.appendTag(
+ new NBTTagString(
+ "Construction plan for " + aNewRecipe.mOutput.stackSize
+ + " "
+ + s
+ + ". Needed EU/t: "
+ + aNewRecipe.mEUt
+ + " Production time: "
+ + (aNewRecipe.mDuration / 20)));
+ for (int i = 0; i < aNewRecipe.mInputs.length; i++) {
+ if (aNewRecipe.mOreDictAlt[i] != null) {
+ int count = 0;
+ StringBuilder tBuilder = new StringBuilder("Input Bus " + (i + 1) + ": ");
+ for (ItemStack tStack : aNewRecipe.mOreDictAlt[i]) {
+ if (tStack != null) {
+ s = tStack.getDisplayName();
+ if (FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isServer()) {
+ s = GT_Assemblyline_Server.lServerNames.get(tStack.getDisplayName());
+ if (s == null) s = tStack.getDisplayName();
+ }
+
+ tBuilder.append(count == 0 ? "" : "\nOr ")
+ .append(tStack.stackSize)
+ .append(" ")
+ .append(s);
+ count++;
+ }
+ }
+ if (count > 0) tNBTList.appendTag(new NBTTagString(tBuilder.toString()));
+ } else if (aNewRecipe.mInputs[i] != null) {
+ s = aNewRecipe.mInputs[i].getDisplayName();
+ if (FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isServer()) {
+ s = GT_Assemblyline_Server.lServerNames.get(aNewRecipe.mInputs[i].getDisplayName());
+ if (s == null) s = aNewRecipe.mInputs[i].getDisplayName();
+ }
+ tNBTList.appendTag(
+ new NBTTagString("Input Bus " + (i + 1) + ": " + aNewRecipe.mInputs[i].stackSize + " " + s));
+ }
+ }
+ for (int i = 0; i < aNewRecipe.mFluidInputs.length; i++) {
+ if (aNewRecipe.mFluidInputs[i] != null) {
+ s = aNewRecipe.mFluidInputs[i].getLocalizedName();
+ if (FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isServer()) {
+ s = GT_Assemblyline_Server.lServerNames.get(aNewRecipe.mFluidInputs[i].getLocalizedName());
+ if (s == null) s = aNewRecipe.mFluidInputs[i].getLocalizedName();
+ }
+ tNBTList.appendTag(
+ new NBTTagString(
+ "Input Hatch " + (i + 1) + ": " + aNewRecipe.mFluidInputs[i].amount + "L " + s));
+ }
+ }
+ tNBT.setTag("pages", tNBTList);
+ tNBT.setLong("lastUpdate", System.currentTimeMillis());
+ aDataStick.setTagCompound(tNBT);
+ // Set recipe hash
+ setRecipeHashOnDataStick(aDataStick, aHash);
+ return true;
+ }
+ return false;
+ }
+
+ public enum LookupResultType {
+
+ INVALID_STICK(true),
+ VALID_STACK_BUT_INVALID_RECIPE(true),
+ VALID_STACK_AND_VALID_RECIPE(false),
+ VALID_STACK_AND_VALID_HASH(false);
+
+ private final boolean recipeNull;
+ private LookupResult singletonResult;
+
+ LookupResultType(boolean recipeNull) {
+ this.recipeNull = recipeNull;
+ }
+
+ public LookupResult getResult() {
+ if (!recipeNull) throw new IllegalArgumentException("This result type require a nonnull recipe");
+ if (singletonResult == null) singletonResult = new LookupResult(null, this);
+ return singletonResult;
+ }
+
+ public LookupResult getResult(GT_Recipe_AssemblyLine recipe) {
+ if ((recipe == null) != recipeNull)
+ throw new IllegalArgumentException("This result type does not allow given input");
+ return new LookupResult(recipe, this);
+ }
+ }
+
+ public static class LookupResult {
+
+ private final GT_Recipe_AssemblyLine recipe;
+ private final LookupResultType type;
+
+ LookupResult(GT_Recipe_AssemblyLine recipe, LookupResultType type) {
+ this.recipe = recipe;
+ this.type = type;
+ }
+
+ public GT_Recipe_AssemblyLine getRecipe() {
+ return recipe;
+ }
+
+ public LookupResultType getType() {
+ return type;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_Assemblyline_Server.java b/src/main/java/gregtech/api/util/GT_Assemblyline_Server.java
new file mode 100644
index 0000000000..4c0348683a
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_Assemblyline_Server.java
@@ -0,0 +1,297 @@
+package gregtech.api.util;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import net.minecraftforge.common.config.ConfigCategory;
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.common.config.Property;
+
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsBotania;
+
+public class GT_Assemblyline_Server {
+
+ public static LinkedHashMap<String, String> lServerNames = new LinkedHashMap<>();
+ private static LinkedHashMap<String, String> internal2 = new LinkedHashMap<>(), internal3 = new LinkedHashMap<>(),
+ internal4 = new LinkedHashMap<>();
+ private static HashMap<String, Property> internal = new HashMap<>();
+
+ public static void fillMap(FMLPreInitializationEvent aEvent) {
+ Configuration conf = GT_LanguageManager.sEnglishFile;
+
+ ConfigCategory cat = conf.getCategory("languagefile");
+ internal.putAll(cat.getValues());
+ for (Map.Entry<String, Property> entry : internal.entrySet()) {
+ try {
+ String s = entry.getValue()
+ .getString()
+ .replaceAll("%", "");
+
+ if (entry.getKey()
+ .contains("metaitem") && s.contains("material")) internal2.put(entry.getKey(), s);
+ else if (entry.getKey()
+ .contains("blockmachines") && s.contains("material")) internal3.put(entry.getKey(), s);
+ else if ((entry.getKey()
+ .contains("blockores")
+ || (entry.getKey()
+ .contains("blockmetal")
+ || entry.getKey()
+ .contains("blockgem")))
+ && s.contains("material")) internal4.put(entry.getKey(), s);
+ else lServerNames.put(entry.getKey(), s);
+ } catch (Exception ignored) {}
+ }
+ for (Map.Entry<String, String> entry : internal2.entrySet()) {
+ try {
+ if (entry.getKey()
+ .contains("name")) {
+ int i = Integer.parseInt(
+ entry.getKey()
+ .substring(
+ "gt.metaitem.01.".length(),
+ entry.getKey()
+ .length() - ".name".length()));
+ i = i % 1000;
+ if (GregTech_API.sGeneratedMaterials[i] != null) lServerNames.put(
+ entry.getKey(),
+ entry.getValue()
+ .replace("material", GregTech_API.sGeneratedMaterials[i].toString()));
+ else lServerNames.put(entry.getKey(), null);
+ }
+ } catch (Exception ignored) {}
+ }
+ for (Map.Entry<String, String> entry : internal3.entrySet()) {
+ try {
+ if (entry.getKey()
+ .contains("cable"))
+ lServerNames.put(
+ entry.getKey(),
+ entry.getValue()
+ .replace(
+ "material",
+ entry.getKey()
+ .substring(
+ "gt.blockmachines.cable.".length(),
+ entry.getKey()
+ .length() - ".01.name".length())));
+ else if (entry.getKey()
+ .contains("gt_frame_"))
+ lServerNames.put(
+ entry.getKey(),
+ entry.getValue()
+ .replace(
+ "material",
+ entry.getKey()
+ .substring(
+ "gt.blockmachines.gt_frame_".length(),
+ entry.getKey()
+ .length() - ".name".length())));
+ else if (entry.getKey()
+ .contains("gt_pipe_")) {
+ if (!entry.getKey()
+ .contains("_huge")
+ && !entry.getKey()
+ .contains("_large")
+ && !entry.getKey()
+ .contains("_nonuple")
+ && !entry.getKey()
+ .contains("_quadruple")
+ && !entry.getKey()
+ .contains("_small")
+ && !entry.getKey()
+ .contains("_tiny"))
+ lServerNames.put(
+ entry.getKey(),
+ entry.getValue()
+ .replace(
+ "material",
+ entry.getKey()
+ .substring(
+ "gt.blockmachines.gt_pipe_".length(),
+ entry.getKey()
+ .length() - ".name".length())));
+ else if (entry.getKey()
+ .contains("_huge")
+ || entry.getKey()
+ .contains("_tiny"))
+ lServerNames.put(
+ entry.getKey(),
+ entry.getValue()
+ .replace(
+ "material",
+ entry.getKey()
+ .substring(
+ "gt.blockmachines.gt_pipe_".length(),
+ entry.getKey()
+ .length() - "_tiny.name".length())));
+ else if (entry.getKey()
+ .contains("_large")
+ || entry.getKey()
+ .contains("_small"))
+ lServerNames.put(
+ entry.getKey(),
+ entry.getValue()
+ .replace(
+ "material",
+ entry.getKey()
+ .substring(
+ "gt.blockmachines.gt_pipe_".length(),
+ entry.getKey()
+ .length() - "_large.name".length())));
+ else if (entry.getKey()
+ .contains("_nonuple"))
+ lServerNames.put(
+ entry.getKey(),
+ entry.getValue()
+ .replace(
+ "material",
+ entry.getKey()
+ .substring(
+ "gt.blockmachines.gt_pipe_".length(),
+ entry.getKey()
+ .length() - "_nonuple.name".length())));
+ else if (entry.getKey()
+ .contains("_quadruple"))
+ lServerNames.put(
+ entry.getKey(),
+ entry.getValue()
+ .replace(
+ "material",
+ entry.getKey()
+ .substring(
+ "gt.blockmachines.gt_pipe_".length(),
+ entry.getKey()
+ .length() - "_quadruple.name".length())));
+ } else if (entry.getKey()
+ .contains("wire"))
+ lServerNames.put(
+ entry.getKey(),
+ entry.getValue()
+ .replace(
+ "material",
+ entry.getKey()
+ .substring(
+ "gt.blockmachines.wire.".length(),
+ entry.getKey()
+ .length() - ".01.name".length())));
+ else lServerNames.put(entry.getKey(), entry.getValue());
+ } catch (Exception ignored) {}
+ }
+ for (Map.Entry<String, String> entry : internal4.entrySet()) {
+ try {
+ if (entry.getKey()
+ .contains("blockores")) {
+ int i = Integer.parseInt(
+ entry.getKey()
+ .substring(
+ "gt.blockores.".length(),
+ entry.getKey()
+ .length() - ".name".length()));
+ i = i % 1000;
+ if (GregTech_API.sGeneratedMaterials[i] != null) lServerNames.put(
+ entry.getKey(),
+ entry.getValue()
+ .replace("material", GregTech_API.sGeneratedMaterials[i].toString()));
+ else lServerNames.put(entry.getKey(), null);
+ } else if (entry.getKey()
+ .contains("blockmetal")) {
+ Materials[] mMats = null;
+ String t = entry.getKey()
+ .substring("gt.blockmetal".length());
+ t = t.substring(0, 1);
+ int i = Integer.parseInt(t);
+ switch (i) {
+ case 1 -> mMats = new Materials[] { Materials.Adamantium, Materials.Aluminium,
+ Materials.Americium, Materials.AnnealedCopper, Materials.Antimony, Materials.Arsenic,
+ Materials.AstralSilver, Materials.BatteryAlloy, Materials.Beryllium, Materials.Bismuth,
+ Materials.BismuthBronze, Materials.BlackBronze, Materials.BlackSteel,
+ Materials.BlueAlloy, Materials.BlueSteel, Materials.Brass };
+ case 2 -> mMats = new Materials[] { Materials.Bronze, Materials.Caesium, Materials.Cerium,
+ Materials.Chrome, Materials.ChromiumDioxide, Materials.Cobalt, Materials.CobaltBrass,
+ Materials.Copper, Materials.Cupronickel, Materials.DamascusSteel, Materials.DarkIron,
+ Materials.DeepIron, Materials.Desh, Materials.Duranium, Materials.Dysprosium,
+ Materials.Electrum };
+ case 3 -> mMats = new Materials[] { Materials.ElectrumFlux, Materials.Enderium,
+ Materials.Erbium, Materials.Europium, Materials.FierySteel, Materials.Gadolinium,
+ Materials.Gallium, Materials.Holmium, Materials.HSLA, Materials.Indium,
+ Materials.InfusedGold, Materials.Invar, Materials.Iridium, Materials.IronMagnetic,
+ Materials.IronWood, Materials.Kanthal };
+ case 4 -> mMats = new Materials[] { Materials.Knightmetal, Materials.Lanthanum,
+ Materials.Lead, Materials.Lutetium, Materials.Magnalium, Materials.Magnesium,
+ Materials.Manganese, Materials.MeteoricIron, Materials.MeteoricSteel, Materials.Trinium,
+ Materials.Mithril, Materials.Molybdenum, Materials.Naquadah, Materials.NaquadahAlloy,
+ Materials.NaquadahEnriched, Materials.Naquadria };
+ case 5 -> mMats = new Materials[] { Materials.Neodymium, Materials.NeodymiumMagnetic,
+ Materials.Neutronium, Materials.Nichrome, Materials.Nickel, Materials.Niobium,
+ Materials.NiobiumNitride, Materials.NiobiumTitanium, Materials.Osmiridium,
+ Materials.Osmium, Materials.Palladium, Materials.PigIron, Materials.Platinum,
+ Materials.Plutonium, Materials.Plutonium241, Materials.Praseodymium };
+ case 6 -> mMats = new Materials[] { Materials.Promethium, Materials.RedAlloy,
+ Materials.RedSteel, Materials.RoseGold, Materials.Rubidium, Materials.Samarium,
+ Materials.Scandium, Materials.ShadowIron, Materials.ShadowSteel, Materials.Silicon,
+ Materials.Silver, Materials.SolderingAlloy, Materials.StainlessSteel, Materials.Steel,
+ Materials.SteelMagnetic, Materials.SterlingSilver };
+ case 7 -> mMats = new Materials[] { Materials.Sunnarium, Materials.Tantalum,
+ Materials.Tellurium, Materials.Terbium, Materials.Thaumium, Materials.Thorium,
+ Materials.Thulium, Materials.Tin, Materials.TinAlloy, Materials.Titanium,
+ Materials.Tritanium, Materials.Tungsten, Materials.TungstenSteel, Materials.Ultimet,
+ Materials.Uranium, Materials.Uranium235 };
+ case 8 -> mMats = new Materials[] { Materials.Vanadium, Materials.VanadiumGallium,
+ Materials.WroughtIron, Materials.Ytterbium, Materials.Yttrium,
+ Materials.YttriumBariumCuprate, Materials.Zinc, Materials.TungstenCarbide,
+ Materials.VanadiumSteel, Materials.HSSG, Materials.HSSE, Materials.HSSS,
+ Materials.Steeleaf, Materials.Ichorium, Materials.Firestone };
+ }
+ t = entry.getKey()
+ .substring(
+ "gt.blockmetal1.".length(),
+ entry.getKey()
+ .length() - ".name".length());
+ i = Integer.parseInt(t);
+ lServerNames.put(entry.getKey(), "Block of " + mMats[i].toString());
+ mMats = null;
+ } else if (entry.getKey()
+ .contains("blockgem")) {
+ Materials[] mMats = null;
+ String t = entry.getKey()
+ .substring("gt.blockgem".length());
+ t = t.substring(0, 1);
+ int i = Integer.parseInt(t);
+ switch (i) {
+ case 1 -> mMats = new Materials[] { Materials.InfusedAir, Materials.Amber,
+ Materials.Amethyst, Materials.InfusedWater, Materials.BlueTopaz,
+ Materials.CertusQuartz, Materials.Dilithium, Materials.EnderEye,
+ Materials.EnderPearl, Materials.FoolsRuby, Materials.Force, Materials.Forcicium,
+ Materials.Forcillium, Materials.GreenSapphire, Materials.InfusedFire,
+ Materials.Jasper, MaterialsBotania.ManaDiamond,
+ MaterialsBotania.BotaniaDragonstone };
+ case 2 -> mMats = new Materials[] { Materials.Lazurite, Materials.Lignite,
+ Materials.Monazite, Materials.Niter, Materials.Olivine, Materials.Opal,
+ Materials.InfusedOrder, Materials.InfusedEntropy, Materials.Phosphorus,
+ Materials.Quartzite, Materials.GarnetRed, Materials.Ruby, Materials.Sapphire,
+ Materials.Sodalite, Materials.Tanzanite, Materials.InfusedEarth };
+ case 3 -> mMats = new Materials[] { Materials.Topaz, Materials.Vinteum,
+ Materials.GarnetYellow, Materials.NetherStar, Materials.Charcoal, Materials.Blaze };
+ }
+ t = entry.getKey()
+ .substring(
+ "gt.blockgem1.".length(),
+ entry.getKey()
+ .length() - ".name".length());
+ i = Integer.parseInt(t);
+ lServerNames.put(entry.getKey(), "Block of " + mMats[i].toString());
+ mMats = null;
+ }
+ } catch (Exception ignored) {}
+ }
+
+ internal = null;
+ internal2 = null;
+ internal3 = null;
+ internal4 = null;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_BaseCrop.java b/src/main/java/gregtech/api/util/GT_BaseCrop.java
new file mode 100644
index 0000000000..d8608c85a0
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_BaseCrop.java
@@ -0,0 +1,311 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.E;
+import static gregtech.api.enums.Mods.IC2CropPlugin;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.objects.ItemData;
+import gregtech.common.blocks.GT_Block_Ores_Abstract;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+import ic2.api.crops.CropCard;
+import ic2.api.crops.Crops;
+import ic2.api.crops.ICropTile;
+import speiger.src.crops.api.ICropCardInfo;
+
+public class GT_BaseCrop extends CropCard implements ICropCardInfo {
+
+ public static ArrayList<GT_BaseCrop> sCropList = new ArrayList<>();
+ private String mName = E;
+ private String mDiscoveredBy = "Gregorius Techneticies";
+ private String[] mAttributes;
+ private int mTier = 0;
+ private int mMaxSize = 0;
+ private int mAfterHarvestSize = 0;
+ private int mHarvestSize = 0;
+ private final int[] mStats = new int[5];
+ private final int mGrowthSpeed = 0;
+ private ItemStack mDrop = null;
+ private ItemStack[] mSpecialDrops = null;
+ private Materials mBlock = null;
+ private static boolean bIc2NeiLoaded = IC2CropPlugin.isModLoaded();
+
+ /**
+ * To create new Crops
+ *
+ * @param aID Default ID
+ * @param aCropName Name of the Crop
+ * @param aDiscoveredBy The one who discovered the Crop
+ * @param aDrop The Item which is dropped by the Crop. must be != null
+ * @param aBaseSeed Baseseed to plant this Crop. null == crossbreed only
+ * @param aTier tier of the Crop. forced to be >= 1
+ * @param aMaxSize maximum Size of the Crop. forced to be >= 3
+ * @param aGrowthSpeed how fast the Crop grows. if < 0 then its set to Tier*300
+ * @param aHarvestSize the size the Crop needs to be harvested. forced to be between 2 and max size
+ */
+ public GT_BaseCrop(int aID, String aCropName, String aDiscoveredBy, ItemStack aBaseSeed, int aTier, int aMaxSize,
+ int aGrowthSpeed, int aAfterHarvestSize, int aHarvestSize, int aStatChemical, int aStatFood, int aStatDefensive,
+ int aStatColor, int aStatWeed, String[] aAttributes, ItemStack aDrop, ItemStack[] aSpecialDrops) {
+ new GT_BaseCrop(
+ aID,
+ aCropName,
+ aDiscoveredBy,
+ aBaseSeed,
+ aTier,
+ aMaxSize,
+ aGrowthSpeed,
+ aAfterHarvestSize,
+ aHarvestSize,
+ aStatChemical,
+ aStatFood,
+ aStatDefensive,
+ aStatColor,
+ aStatWeed,
+ aAttributes,
+ null,
+ aDrop,
+ aSpecialDrops);
+ }
+
+ /**
+ * To create new Crops
+ *
+ * @param aID Default ID
+ * @param aCropName Name of the Crop
+ * @param aDiscoveredBy The one who discovered the Crop
+ * @param aDrop The Item which is dropped by the Crop. must be != null
+ * @param aBaseSeed Baseseed to plant this Crop. null == crossbreed only
+ * @param aTier tier of the Crop. forced to be >= 1
+ * @param aMaxSize maximum Size of the Crop. forced to be >= 3
+ * @param aGrowthSpeed how fast the Crop grows. if < 0 then its set to Tier*300
+ * @param aHarvestSize the size the Crop needs to be harvested. forced to be between 2 and max size
+ * @param aBlock the block below needed for crop to grow. If null no block needed
+ */
+ public GT_BaseCrop(int aID, String aCropName, String aDiscoveredBy, ItemStack aBaseSeed, int aTier, int aMaxSize,
+ int aGrowthSpeed, int aAfterHarvestSize, int aHarvestSize, int aStatChemical, int aStatFood, int aStatDefensive,
+ int aStatColor, int aStatWeed, String[] aAttributes, Materials aBlock, ItemStack aDrop,
+ ItemStack[] aSpecialDrops) {
+ mName = aCropName;
+ aID = GT_Config.addIDConfig(ConfigCategories.IDs.crops, mName.replaceAll(" ", "_"), aID);
+ if (aDiscoveredBy != null && !aDiscoveredBy.equals(E)) mDiscoveredBy = aDiscoveredBy;
+ if (aDrop != null && aID > 0 && aID < 256) {
+ mDrop = GT_Utility.copyOrNull(aDrop);
+ mSpecialDrops = aSpecialDrops;
+ mTier = Math.max(1, aTier);
+ mMaxSize = Math.max(3, aMaxSize);
+ mHarvestSize = Math.min(Math.max(aHarvestSize, 2), mMaxSize);
+ mAfterHarvestSize = Math.min(Math.max(aAfterHarvestSize, 1), mMaxSize - 1);
+ mStats[0] = aStatChemical;
+ mStats[1] = aStatFood;
+ mStats[2] = aStatDefensive;
+ mStats[3] = aStatColor;
+ mStats[4] = aStatWeed;
+ mAttributes = aAttributes;
+ mBlock = aBlock;
+ if (!Crops.instance.registerCrop(this, aID))
+ throw new GT_ItsNotMyFaultException("Make sure the Crop ID is valid!");
+ if (aBaseSeed != null) Crops.instance.registerBaseSeed(aBaseSeed, this, 1, 1, 1, 1);
+ sCropList.add(this);
+ }
+ if (bIc2NeiLoaded) {
+ try {
+ Class.forName("speiger.src.crops.api.CropPluginAPI")
+ .getMethod("registerCropInfo", Class.forName("speiger.src.crops.api.ICropCardInfo"))
+ .invoke(
+ Class.forName("speiger.src.crops.api.CropPluginAPI")
+ .getField("instance"),
+ this);
+ } catch (IllegalAccessException | ClassNotFoundException | SecurityException | NoSuchMethodException
+ | NoSuchFieldException | InvocationTargetException | IllegalArgumentException ex) {
+ bIc2NeiLoaded = false;
+ }
+ }
+ }
+
+ @Override
+ public byte getSizeAfterHarvest(ICropTile crop) {
+ return (byte) mAfterHarvestSize;
+ }
+
+ @Override
+ public int growthDuration(ICropTile aCrop) {
+ if (mGrowthSpeed < 200) return super.growthDuration(aCrop);
+ return tier() * mGrowthSpeed;
+ }
+
+ @Override
+ public int getrootslength(ICropTile crop) {
+ return 5;
+ }
+
+ @Override
+ public String[] attributes() {
+ return mAttributes;
+ }
+
+ @Override
+ public String discoveredBy() {
+ return mDiscoveredBy;
+ }
+
+ @Override
+ public final boolean canGrow(ICropTile aCrop) {
+ // block check is only performed at the last stage of growth
+ if (this.needsBlockBelow() && aCrop.getSize() == mMaxSize - 1) {
+ return isBlockBelow(aCrop);
+ }
+ return aCrop.getSize() < maxSize();
+ }
+
+ @Override
+ public final boolean canBeHarvested(ICropTile aCrop) {
+ return aCrop.getSize() >= mHarvestSize;
+ }
+
+ @Override
+ public boolean canCross(ICropTile aCrop) {
+ return aCrop.getSize() + 2 > maxSize();
+ }
+
+ @Override
+ public int stat(int n) {
+ if (n < 0 || n >= mStats.length) return 0;
+ return mStats[n];
+ }
+
+ @Override
+ public String name() {
+ return mName;
+ }
+
+ @Override
+ public int tier() {
+ return mTier;
+ }
+
+ @Override
+ public int maxSize() {
+ return mMaxSize;
+ }
+
+ @Override
+ public ItemStack getGain(ICropTile aCrop) {
+ int tDrop = 0;
+ if (mSpecialDrops != null && (tDrop = java.util.concurrent.ThreadLocalRandom.current()
+ .nextInt(0, (mSpecialDrops.length * 2) + 2)) < mSpecialDrops.length && mSpecialDrops[tDrop] != null) {
+ return GT_Utility.copyOrNull(mSpecialDrops[tDrop]);
+ }
+ return GT_Utility.copyOrNull(mDrop);
+ }
+
+ @Override
+ public boolean rightclick(ICropTile aCrop, EntityPlayer aPlayer) {
+ if (!canBeHarvested(aCrop)) return false;
+ return aCrop.harvest(aPlayer instanceof EntityPlayerMP);
+ }
+
+ @Override
+ public int getOptimalHavestSize(ICropTile crop) {
+ return maxSize();
+ }
+
+ /**
+ * Checks if the crop needs a block below it
+ *
+ * @return True if the crop needs a block below it to grow to its max size
+ */
+ public boolean needsBlockBelow() {
+ return GT_Mod.gregtechproxy.mCropNeedBlock && this.mBlock != null;
+ }
+
+ public boolean isBlockBelow(ICropTile aCrop) {
+ if (aCrop == null) {
+ return false;
+ }
+ for (int i = 1; i < this.getrootslength(aCrop); i++) {
+ Block tBlock = aCrop.getWorld()
+ .getBlock(aCrop.getLocation().posX, aCrop.getLocation().posY - i, aCrop.getLocation().posZ);
+ if ((tBlock instanceof GT_Block_Ores_Abstract)) {
+ TileEntity tTileEntity = aCrop.getWorld()
+ .getTileEntity(aCrop.getLocation().posX, aCrop.getLocation().posY - i, aCrop.getLocation().posZ);
+ if ((tTileEntity instanceof GT_TileEntity_Ores)) {
+ Materials tMaterial = GregTech_API.sGeneratedMaterials[(((GT_TileEntity_Ores) tTileEntity).mMetaData
+ % 1000)];
+ if ((tMaterial != null) && (tMaterial != Materials._NULL)) {
+ return tMaterial == mBlock;
+ }
+ }
+ } else {
+ int tMetaID = aCrop.getWorld()
+ .getBlockMetadata(aCrop.getLocation().posX, aCrop.getLocation().posY - i, aCrop.getLocation().posZ);
+ if (isBlockBelow(new ItemStack(tBlock, 1, tMetaID))) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * An isolated function to check if an item stack is a block that should be below this crop
+ *
+ * @param aItem a stack of the block placed under the crop
+ * @return The result of the check
+ */
+ public boolean isBlockBelow(ItemStack aItem) {
+ // safety in case someone calls this without checking if we have a block
+ if (!this.needsBlockBelow()) return true;
+
+ // get material from stack
+ ItemData tAssociation = GT_OreDictUnificator.getAssociation(aItem);
+ if (tAssociation == null) return false;
+
+ // return true if it's an ore of the material
+ // note: some ores don't appear to have associations in testing, naq ore is an example of that
+ if (tAssociation.mPrefix.toString()
+ .startsWith("ore") && tAssociation.mMaterial.mMaterial == mBlock) {
+ return true;
+ }
+
+ // return true if it's a block of the material
+ if (tAssociation.mPrefix == OrePrefixes.block && tAssociation.mMaterial.mMaterial == mBlock) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public List<String> getCropInformation() {
+ if (mBlock != null) {
+ ArrayList<String> result = new ArrayList<>(1);
+ result.add(
+ String.format(
+ "Requires %s Ore or Block of %s as soil block to reach full growth.",
+ mBlock.mName,
+ mBlock.mName));
+ return result;
+ }
+ return null;
+ }
+
+ @Override
+ public ItemStack getDisplayItem() {
+ if (mSpecialDrops != null && mSpecialDrops[mSpecialDrops.length - 1] != null) {
+ return GT_Utility.copyOrNull(mSpecialDrops[mSpecialDrops.length - 1]);
+ }
+ return GT_Utility.copyOrNull(mDrop);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_BlockMap.java b/src/main/java/gregtech/api/util/GT_BlockMap.java
new file mode 100644
index 0000000000..9ffe273cac
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_BlockMap.java
@@ -0,0 +1,134 @@
+package gregtech.api.util;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.BiFunction;
+
+import net.minecraft.block.Block;
+
+import gnu.trove.map.TByteObjectMap;
+import gnu.trove.map.hash.TByteObjectHashMap;
+
+public class GT_BlockMap<V> {
+
+ public static final byte WILDCARD = -1;
+ private final ConcurrentHashMap<Block, TByteObjectMap<V>> backing = new ConcurrentHashMap<>();
+ private int size = 0;
+
+ private TByteObjectMap<V> getSubmap(Block block) {
+ return backing.computeIfAbsent(block, b -> new TByteObjectHashMap<>());
+ }
+
+ /**
+ * Associate a value with that union key
+ *
+ * @param block block
+ * @param meta meta
+ * @return old mapping, or null if that doesn't exist
+ */
+ public V put(Block block, byte meta, V value) {
+ V v = getSubmap(block).put(meta, value);
+ if (v == null) size++;
+ return v;
+ }
+
+ /**
+ * Associate a value with that union key ONLY IF there isn't a prior EXACT mapping
+ *
+ * @param block block
+ * @param meta meta
+ * @return old mapping, or null if that doesn't exist
+ */
+ public V putIfAbsent(Block block, byte meta, V value) {
+ V v = getSubmap(block).putIfAbsent(meta, value);
+ if (v == null) size++;
+ return v;
+ }
+
+ /**
+ * Associate a value with that union key ONLY IF there isn't a prior EXACT mapping
+ *
+ * @param block block
+ * @param meta meta
+ * @return old mapping, or null if that doesn't exist
+ */
+ public V computeIfAbsent(Block block, byte meta, BiFunction<Block, Byte, V> function) {
+ TByteObjectMap<V> submap = getSubmap(block);
+ V v = submap.get(meta);
+ if (v == null) {
+ v = function.apply(block, meta);
+ submap.put(meta, v);
+ size++;
+ }
+ return v;
+ }
+
+ /**
+ * Contains an associated value
+ *
+ * @param block block
+ * @param meta meta
+ * @return current mapping OR wildcard of that mapping exists
+ */
+ public boolean containsKey(Block block, byte meta) {
+ TByteObjectMap<V> submap = backing.get(block);
+ if (submap == null) return false;
+ return submap.containsKey(meta) || submap.containsKey(WILDCARD);
+ }
+
+ /**
+ * Get the associated value
+ *
+ * @param block block
+ * @param meta meta
+ * @return current mapping OR wildcard of that block. null if neither exists
+ */
+ public V get(Block block, byte meta) {
+ TByteObjectMap<V> submap = backing.get(block);
+ if (submap == null) return null;
+ V v = submap.get(meta);
+ if (v != null) return v;
+ return submap.get(WILDCARD);
+ }
+
+ /**
+ * Remove a mapping
+ *
+ * @param block block
+ * @param meta meta
+ * @return old value, or null if none
+ */
+ public V remove(Block block, byte meta) {
+ TByteObjectMap<V> submap = backing.get(block);
+ if (submap == null) return null;
+ V v = submap.remove(meta);
+ if (v != null) {
+ size--;
+ if (submap.isEmpty()) backing.remove(block);
+ }
+ return v;
+ }
+
+ /**
+ * Size of all mappings
+ *
+ * @return size
+ */
+ public int size() {
+ return size;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ GT_BlockMap<?> that = (GT_BlockMap<?>) o;
+
+ return backing.equals(that.backing);
+ }
+
+ @Override
+ public int hashCode() {
+ return backing.hashCode();
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_BlockSet.java b/src/main/java/gregtech/api/util/GT_BlockSet.java
new file mode 100644
index 0000000000..1d13afd056
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_BlockSet.java
@@ -0,0 +1,39 @@
+package gregtech.api.util;
+
+import net.minecraft.block.Block;
+
+public class GT_BlockSet {
+
+ private final GT_BlockMap<Object> backing = new GT_BlockMap<>();
+
+ public boolean add(Block block, byte meta) {
+ return backing.put(block, meta, this) != this;
+ }
+
+ public boolean contains(Block block, byte meta) {
+ return backing.get(block, meta) == this;
+ }
+
+ public boolean remove(Block block, byte meta) {
+ return backing.remove(block, meta) == this;
+ }
+
+ public int size() {
+ return backing.size();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ GT_BlockSet that = (GT_BlockSet) o;
+
+ return backing.equals(that.backing);
+ }
+
+ @Override
+ public int hashCode() {
+ return backing.hashCode();
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_CLS_Compat.java b/src/main/java/gregtech/api/util/GT_CLS_Compat.java
new file mode 100644
index 0000000000..c560435e30
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_CLS_Compat.java
@@ -0,0 +1,157 @@
+package gregtech.api.util;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import cpw.mods.fml.common.ProgressManager;
+import gregtech.GT_Mod;
+import gregtech.api.enums.Materials;
+import gregtech.common.GT_Proxy;
+import gregtech.loaders.postload.GT_PostLoad;
+
+@SuppressWarnings("rawtypes, unchecked, deprecation")
+public class GT_CLS_Compat {
+
+ private static Class alexiilMinecraftDisplayer;
+ private static Class alexiilProgressDisplayer;
+ private static Class cpwProgressBar;
+
+ private static Method getLastPercent;
+ private static Method displayProgress;
+
+ private static Field isReplacingVanillaMaterials;
+ private static Field isRegisteringGTmaterials;
+ private static Field progressBarStep;
+
+ static {
+ // CLS
+ try {
+ alexiilMinecraftDisplayer = Class.forName("alexiil.mods.load.MinecraftDisplayer");
+ alexiilProgressDisplayer = Class.forName("alexiil.mods.load.ProgressDisplayer");
+ } catch (ClassNotFoundException ex) {
+ GT_Mod.GT_FML_LOGGER.catching(ex);
+ }
+
+ try {
+ cpwProgressBar = Class.forName("cpw.mods.fml.common.ProgressManager$ProgressBar");
+ } catch (ClassNotFoundException ex) {
+ GT_Mod.GT_FML_LOGGER.catching(ex);
+ }
+
+ Optional.ofNullable(alexiilMinecraftDisplayer)
+ .ifPresent(e -> {
+ try {
+ getLastPercent = e.getMethod("getLastPercent");
+ isReplacingVanillaMaterials = e.getField("isReplacingVanillaMaterials");
+ isRegisteringGTmaterials = e.getField("isRegisteringGTmaterials");
+ } catch (NoSuchMethodException | NoSuchFieldException ex) {
+ GT_Mod.GT_FML_LOGGER.catching(ex);
+ }
+ });
+
+ Optional.ofNullable(alexiilProgressDisplayer)
+ .ifPresent(e -> {
+ try {
+ displayProgress = e.getMethod("displayProgress", String.class, float.class);
+ } catch (NoSuchMethodException ex) {
+ GT_Mod.GT_FML_LOGGER.catching(ex);
+ }
+ });
+
+ try {
+ progressBarStep = cpwProgressBar.getDeclaredField("step");
+ progressBarStep.setAccessible(true);
+ } catch (NoSuchFieldException ex) {
+ GT_Mod.GT_FML_LOGGER.catching(ex);
+ }
+ }
+
+ private GT_CLS_Compat() {}
+
+ private static <T> void registerAndReportProgression(String materialsType, Collection<T> materials,
+ ProgressManager.ProgressBar progressBar, Function<T, Object> getName, Consumer<T> action) {
+ int sizeStep = materials.size();
+ final long progressionReportsEvery = 100;
+ final long bakingMsgEvery = 1000;
+ long nextProgressionReportAt = 0;
+ long nextBakingMsgAt = 0;
+ int currentStep = 0;
+
+ for (T m : materials) {
+ long now = System.currentTimeMillis();
+
+ if (nextProgressionReportAt < now) {
+ nextProgressionReportAt = now + progressionReportsEvery;
+ String materialName = getName.apply(m)
+ .toString();
+ try {
+ displayProgress.invoke(null, materialName, (float) currentStep / sizeStep);
+ } catch (IllegalAccessException | InvocationTargetException iae) {
+ GT_Mod.GT_FML_LOGGER.error("While updating progression", iae);
+ }
+ try {
+ progressBarStep.set(progressBar, currentStep);
+ } catch (IllegalAccessException iae) {
+ GT_Mod.GT_FML_LOGGER.error("While updating intermediate progression steps number", iae);
+ }
+ progressBar.step(materialName);
+ }
+ if (nextBakingMsgAt < now) {
+ nextBakingMsgAt = now + bakingMsgEvery;
+ GT_Mod.GT_FML_LOGGER
+ .info(String.format("%s - Baking: %d%%", materialsType, currentStep * 100 / sizeStep));
+ }
+ action.accept(m);
+ currentStep += 1;
+ }
+ GT_Mod.GT_FML_LOGGER.info(String.format("%s - Baking: Done", materialsType));
+ try {
+ progressBarStep.set(progressBar, currentStep);
+ } catch (IllegalAccessException iae) {
+ GT_Mod.GT_FML_LOGGER.error("While updating final progression steps number", iae);
+ }
+ }
+
+ public static void stepMaterialsCLS(Collection<GT_Proxy.OreDictEventContainer> mEvents,
+ ProgressManager.ProgressBar progressBar) throws IllegalAccessException {
+ try {
+ isRegisteringGTmaterials.set(null, true);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ GT_Mod.GT_FML_LOGGER.catching(e);
+ }
+ registerAndReportProgression(
+ "GregTech materials",
+ mEvents,
+ progressBar,
+ m -> m.mMaterial,
+ GT_Proxy::registerRecipes);
+ ProgressManager.pop(progressBar);
+ isRegisteringGTmaterials.set(null, false);
+ }
+
+ public static void doActualRegistrationCLS(ProgressManager.ProgressBar progressBar,
+ Set<Materials> replacedVanillaItemsSet) {
+ try {
+ isReplacingVanillaMaterials.set(null, true);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ GT_Mod.GT_FML_LOGGER.catching(e);
+ }
+ registerAndReportProgression(
+ "Vanilla materials",
+ replacedVanillaItemsSet,
+ progressBar,
+ m -> m.mDefaultLocalName,
+ GT_PostLoad::doActualRegistration);
+ }
+
+ public static void pushToDisplayProgress() throws InvocationTargetException, IllegalAccessException {
+ isReplacingVanillaMaterials.set(null, false);
+ displayProgress.invoke(null, "Post Initialization: loading GregTech", getLastPercent.invoke(null));
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_ChunkAssociatedData.java b/src/main/java/gregtech/api/util/GT_ChunkAssociatedData.java
new file mode 100644
index 0000000000..bb73cf77ed
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_ChunkAssociatedData.java
@@ -0,0 +1,494 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.io.DataInput;
+import java.io.DataInputStream;
+import java.io.DataOutput;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Array;
+import java.nio.file.AtomicMoveNotSupportedException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.function.Function;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.world.WorldEvent;
+
+import org.apache.commons.io.FileUtils;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+/**
+ * A utility to save all kinds of data that is a function of any chunk.
+ * <p>
+ * GregTech takes care of saving and loading the data from disk, and an efficient mechanism to locate it. Subclass only
+ * need to define the exact scheme of each element data (by overriding the three protected abstract method)
+ * <p>
+ * Oh, there is no limit on how large your data is, though you'd not have the familiar NBT interface, but DataOutput
+ * should be reasonably common anyway.
+ * <p>
+ * It should be noted this class is NOT thread safe.
+ * <p>
+ * Element cannot be null.
+ * <p>
+ * TODO: Implement automatic region unloading.
+ *
+ * @param <T> data element type
+ * @author glease
+ */
+@ParametersAreNonnullByDefault
+public abstract class GT_ChunkAssociatedData<T extends GT_ChunkAssociatedData.IData> {
+
+ private static final Map<String, GT_ChunkAssociatedData<?>> instances = new ConcurrentHashMap<>();
+ private static final int IO_PARALLELISM = Math.min(
+ 8,
+ Math.max(
+ 1,
+ Runtime.getRuntime()
+ .availableProcessors() * 2
+ / 3));
+ private static final ExecutorService IO_WORKERS = Executors.newWorkStealingPool(IO_PARALLELISM);
+ private static final Pattern FILE_PATTERN = Pattern.compile("(.+)\\.(-?\\d+)\\.(-?\\d+)\\.dat");
+
+ static {
+ // register event handler
+ new EventHandler();
+ }
+
+ protected final String mId;
+ protected final Class<T> elementtype;
+ private final int regionLength;
+ private final int version;
+ private final boolean saveDefaults;
+ /**
+ * Data is stored as a `(world id -> (super region id -> super region data))` hash map. where super region's size is
+ * determined by regionSize. Here it is called super region, to not confuse with vanilla's regions.
+ */
+ private final Map<Integer, Map<ChunkCoordIntPair, SuperRegion>> masterMap = new ConcurrentHashMap<>();
+
+ /**
+ * Initialize this instance.
+ *
+ * @param aId An arbitrary, but globally unique identifier for what this data is
+ * @param elementType The class of this element type. Used to create arrays.
+ * @param regionLength The length of one super region. Each super region will contain
+ * {@code regionLength * regionLength} chunks
+ * @param version An integer marking the version of this data. Useful later when the data's serialized form
+ * changed.
+ */
+ protected GT_ChunkAssociatedData(String aId, Class<T> elementType, int regionLength, byte version,
+ boolean saveDefaults) {
+ if (regionLength * regionLength > Short.MAX_VALUE || regionLength <= 0)
+ throw new IllegalArgumentException("Region invalid: " + regionLength);
+ if (!IData.class.isAssignableFrom(elementType)) throw new IllegalArgumentException("Data type invalid");
+ if (aId.contains(".")) throw new IllegalArgumentException("ID cannot contains dot");
+ this.mId = aId;
+ this.elementtype = elementType;
+ this.regionLength = regionLength;
+ this.version = version;
+ this.saveDefaults = saveDefaults;
+ if (instances.putIfAbsent(aId, this) != null)
+ throw new IllegalArgumentException("Duplicate GT_ChunkAssociatedData: " + aId);
+ }
+
+ private ChunkCoordIntPair getRegionID(int aChunkX, int aChunkZ) {
+ return new ChunkCoordIntPair(Math.floorDiv(aChunkX, regionLength), Math.floorDiv(aChunkZ, regionLength));
+ }
+
+ /**
+ * Get a reference to data of the chunk that tile entity is in. The returned reference should be mutable.
+ */
+ public final T get(IGregTechTileEntity tileEntity) {
+ return get(tileEntity.getWorld(), tileEntity.getXCoord() >> 4, tileEntity.getZCoord() >> 4);
+ }
+
+ public final T get(Chunk chunk) {
+ return get(chunk.worldObj, chunk.xPosition, chunk.zPosition);
+ }
+
+ public final T get(World world, ChunkCoordIntPair coord) {
+ return get(world, coord.chunkXPos, coord.chunkZPos);
+ }
+
+ public final T get(World world, int chunkX, int chunkZ) {
+ SuperRegion region = masterMap.computeIfAbsent(world.provider.dimensionId, ignored -> new ConcurrentHashMap<>())
+ .computeIfAbsent(getRegionID(chunkX, chunkZ), c -> new SuperRegion(world, c));
+ return region.get(Math.floorMod(chunkX, regionLength), Math.floorMod(chunkZ, regionLength));
+ }
+
+ protected final void set(World world, int chunkX, int chunkZ, T data) {
+ SuperRegion region = masterMap.computeIfAbsent(world.provider.dimensionId, ignored -> new ConcurrentHashMap<>())
+ .computeIfAbsent(getRegionID(chunkX, chunkZ), c -> new SuperRegion(world, c));
+ region.set(Math.floorMod(chunkX, regionLength), Math.floorMod(chunkZ, regionLength), data);
+ }
+
+ protected final boolean isCreated(int dimId, int chunkX, int chunkZ) {
+ Map<ChunkCoordIntPair, SuperRegion> dimData = masterMap.getOrDefault(dimId, null);
+ if (dimData == null) return false;
+
+ SuperRegion region = dimData.getOrDefault(getRegionID(chunkX, chunkZ), null);
+ if (region == null) return false;
+
+ return region.isCreated(Math.floorMod(chunkX, regionLength), Math.floorMod(chunkZ, regionLength));
+ }
+
+ public void clear() {
+ if (GT_Values.debugWorldData) {
+ long dirtyRegionCount = masterMap.values()
+ .stream()
+ .flatMap(
+ m -> m.values()
+ .stream())
+ .filter(SuperRegion::isDirty)
+ .count();
+ if (dirtyRegionCount > 0) GT_Log.out.println(
+ "Clearing ChunkAssociatedData with " + dirtyRegionCount + " regions dirty. Data might have been lost!");
+ }
+ masterMap.clear();
+ }
+
+ public void save() {
+ saveRegions(
+ masterMap.values()
+ .stream()
+ .flatMap(
+ m -> m.values()
+ .stream()));
+ }
+
+ public void save(World world) {
+ Map<ChunkCoordIntPair, SuperRegion> map = masterMap.get(world.provider.dimensionId);
+ if (map != null) saveRegions(
+ map.values()
+ .stream());
+ }
+
+ private void saveRegions(Stream<SuperRegion> stream) {
+ stream.filter(SuperRegion::isDirty)
+ .map(c -> (Runnable) c::save)
+ .map(r -> CompletableFuture.runAsync(r, IO_WORKERS))
+ .reduce(CompletableFuture::allOf)
+ .ifPresent(f -> {
+ try {
+ f.get();
+ } catch (Exception e) {
+ GT_Log.err.println("Data save error: " + mId);
+ e.printStackTrace(GT_Log.err);
+ }
+ });
+ }
+
+ protected abstract void writeElement(DataOutput output, T element, World world, int chunkX, int chunkZ)
+ throws IOException;
+
+ protected abstract T readElement(DataInput input, int version, World world, int chunkX, int chunkZ)
+ throws IOException;
+
+ protected abstract T createElement(World world, int chunkX, int chunkZ);
+
+ /**
+ * Clear all mappings, regardless of whether they are dirty
+ */
+ public static void clearAll() {
+ for (GT_ChunkAssociatedData<?> d : instances.values()) d.clear();
+ }
+
+ /**
+ * Save all mappings
+ */
+ public static void saveAll() {
+ for (GT_ChunkAssociatedData<?> d : instances.values()) d.save();
+ }
+
+ /**
+ * Load data for all chunks for a given world. Current data for that world will be discarded. If this is what you
+ * intended, call {@link #save(World)} beforehand.
+ * <p>
+ * Be aware of the memory consumption though.
+ */
+ protected void loadAll(World w) {
+ if (GT_Values.debugWorldData && masterMap.containsKey(w.provider.dimensionId)) GT_Log.err.println(
+ "Reloading ChunkAssociatedData " + mId + " for world " + w.provider.dimensionId + " discards old data!");
+ if (!getSaveDirectory(w).isDirectory())
+ // nothing to load...
+ return;
+ try (Stream<Path> stream = Files.list(getSaveDirectory(w).toPath())) {
+ Map<ChunkCoordIntPair, SuperRegion> worldData = stream.map(f -> {
+ Matcher matcher = FILE_PATTERN.matcher(
+ f.getFileName()
+ .toString());
+ return matcher.matches() ? matcher : null;
+ })
+ .filter(Objects::nonNull)
+ .filter(m -> mId.equals(m.group(1)))
+ .map(
+ m -> CompletableFuture.supplyAsync(
+ () -> new SuperRegion(w, Integer.parseInt(m.group(2)), Integer.parseInt(m.group(3))),
+ IO_WORKERS))
+ .map(f -> {
+ try {
+ return f.get();
+ } catch (Exception e) {
+ GT_Log.err.println("Error loading region");
+ e.printStackTrace(GT_Log.err);
+ return null;
+ }
+ })
+ .filter(Objects::nonNull)
+ .collect(Collectors.toMap(SuperRegion::getCoord, Function.identity()));
+ masterMap.put(w.provider.dimensionId, worldData);
+ } catch (IOException | UncheckedIOException e) {
+ GT_Log.err.println("Error loading all region");
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ protected File getSaveDirectory(World w) {
+ File base;
+ if (w.provider.getSaveFolder() == null) base = w.getSaveHandler()
+ .getWorldDirectory();
+ else base = new File(
+ w.getSaveHandler()
+ .getWorldDirectory(),
+ w.provider.getSaveFolder());
+ return new File(base, GregTech.ID);
+ }
+
+ public interface IData {
+
+ /**
+ * @return Whether the data is different from chunk default
+ */
+ boolean isSameAsDefault();
+ }
+
+ protected final class SuperRegion {
+
+ private final T[] data = createData();
+ private final File backingStorage;
+ private final WeakReference<World> world;
+ /**
+ * Be aware, this means region coord, not bottom-left chunk coord
+ */
+ private final ChunkCoordIntPair coord;
+
+ private SuperRegion(World world, int regionX, int regionZ) {
+ this.world = new WeakReference<>(world);
+ this.coord = new ChunkCoordIntPair(regionX, regionZ);
+ backingStorage = new File(getSaveDirectory(world), String.format("%s.%d.%d.dat", mId, regionX, regionZ));
+ if (backingStorage.isFile()) load();
+ }
+
+ private SuperRegion(World world, ChunkCoordIntPair regionCoord) {
+ this.world = new WeakReference<>(world);
+ this.coord = regionCoord;
+ backingStorage = new File(
+ getSaveDirectory(world),
+ String.format("%s.%d.%d.dat", mId, regionCoord.chunkXPos, regionCoord.chunkZPos));
+ if (backingStorage.isFile()) load();
+ }
+
+ @SuppressWarnings("unchecked")
+ private T[] createData() {
+ return (T[]) Array.newInstance(elementtype, regionLength * regionLength);
+ }
+
+ public T get(int subRegionX, int subRegionZ) {
+ int index = getIndex(subRegionX, subRegionZ);
+ T datum = data[index];
+ if (datum == null) {
+ World world = Objects.requireNonNull(this.world.get());
+ T newElem = createElement(
+ world,
+ coord.chunkXPos * regionLength + subRegionX,
+ coord.chunkZPos * regionLength + subRegionZ);
+ data[index] = newElem;
+ return newElem;
+ }
+ return datum;
+ }
+
+ public void set(int subRegionX, int subRegionZ, T data) {
+ this.data[getIndex(subRegionX, subRegionZ)] = data;
+ }
+
+ public boolean isCreated(int subRegionX, int subRegionZ) {
+ return this.data[getIndex(subRegionX, subRegionZ)] != null;
+ }
+
+ public ChunkCoordIntPair getCoord() {
+ return coord;
+ }
+
+ private int getIndex(int subRegionX, int subRegionY) {
+ return subRegionX * regionLength + subRegionY;
+ }
+
+ private int getChunkX(int index) {
+ return index / regionLength + coord.chunkXPos * regionLength;
+ }
+
+ private int getChunkZ(int index) {
+ return index % regionLength + coord.chunkZPos * regionLength;
+ }
+
+ public boolean isDirty() {
+ for (T datum : data) {
+ if (datum != null && !datum.isSameAsDefault()) return true;
+ }
+ return false;
+ }
+
+ public void save() {
+ try {
+ save0();
+ } catch (IOException e) {
+ GT_Log.err.println("Error saving data " + backingStorage.getPath());
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ private void save0() throws IOException {
+ // noinspection ResultOfMethodCallIgnored
+ backingStorage.getParentFile()
+ .mkdirs();
+ File tmpFile = getTmpFile();
+ World world = Objects.requireNonNull(this.world.get(), "Attempting to save region of another world!");
+ try (DataOutputStream output = new DataOutputStream(new FileOutputStream(tmpFile))) {
+ int ptr = 0;
+ boolean nullRange = data[0] == null;
+ // write a magic byte as storage format version
+ output.writeByte(0);
+ // write a magic byte as data format version
+ output.writeByte(version);
+ output.writeBoolean(nullRange);
+ while (ptr < data.length) {
+ // work out how long is this range
+ int rangeStart = ptr;
+ while (ptr < data.length
+ && (data[ptr] == null || (!saveDefaults && data[ptr].isSameAsDefault())) == nullRange) ptr++;
+ // write range length
+ output.writeShort(ptr - rangeStart);
+ if (!nullRange)
+ // write element data
+ for (int i = rangeStart; i < ptr; i++)
+ writeElement(output, data[i], world, getChunkX(ptr), getChunkZ(ptr));
+ // or not
+ nullRange = !nullRange;
+ }
+ }
+ // first try to replace the destination file
+ // since atomic operation, no need to keep the backup in place
+ try {
+ Files.move(
+ tmpFile.toPath(),
+ backingStorage.toPath(),
+ StandardCopyOption.REPLACE_EXISTING,
+ StandardCopyOption.ATOMIC_MOVE);
+ } catch (AtomicMoveNotSupportedException ignored) {
+ // in case some dumb system/jre combination would cause this
+ // or if **somehow** two file inside the same directory belongs two separate filesystem
+ FileUtils.copyFile(tmpFile, backingStorage);
+ }
+ }
+
+ public void load() {
+ try {
+ loadFromFile(backingStorage);
+ } catch (IOException | RuntimeException e) {
+ GT_Log.err.println("Primary storage file broken in " + backingStorage.getPath());
+ e.printStackTrace(GT_Log.err);
+ // in case the primary storage is broken
+ try {
+ loadFromFile(getTmpFile());
+ } catch (IOException | RuntimeException e2) {
+ GT_Log.err.println("Backup storage file broken in " + backingStorage.getPath());
+ e2.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+
+ private void loadFromFile(File file) throws IOException {
+ World world = Objects.requireNonNull(this.world.get(), "Attempting to load region of another world!");
+ try (DataInputStream input = new DataInputStream(new FileInputStream(file))) {
+ byte b = input.readByte();
+ if (b == 0) {
+ loadV0(input, world);
+ } else {
+ GT_Log.err.printf("Unknown ChunkAssociatedData version %d\n", b);
+ }
+ }
+ }
+
+ private void loadV0(DataInput input, World world) throws IOException {
+ int version = input.readByte();
+ boolean nullRange = input.readBoolean();
+ int ptr = 0;
+ while (ptr != data.length) {
+ int rangeEnd = ptr + input.readUnsignedShort();
+ if (!nullRange) {
+ for (; ptr < rangeEnd; ptr++) {
+ data[ptr] = readElement(input, version, world, getChunkX(ptr), getChunkZ(ptr));
+ }
+ } else {
+ Arrays.fill(data, ptr, rangeEnd, null);
+ ptr = rangeEnd;
+ }
+ nullRange = !nullRange;
+ }
+ }
+
+ private File getTmpFile() {
+ return new File(backingStorage.getParentFile(), backingStorage.getName() + ".tmp");
+ }
+ }
+
+ public static class EventHandler {
+
+ private EventHandler() {
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @SubscribeEvent
+ public void onWorldSave(WorldEvent.Save e) {
+ for (GT_ChunkAssociatedData<?> d : instances.values()) {
+ d.save(e.world);
+ }
+ }
+
+ @SubscribeEvent
+ public void onWorldUnload(WorldEvent.Unload e) {
+ for (GT_ChunkAssociatedData<?> d : instances.values()) {
+ // there is no need to explicitly do a save here
+ // forge will send a WorldEvent.Save on server thread before this event is distributed
+ d.masterMap.remove(e.world.provider.dimensionId);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_CircuitryBehavior.java b/src/main/java/gregtech/api/util/GT_CircuitryBehavior.java
new file mode 100644
index 0000000000..63fb7d1e70
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_CircuitryBehavior.java
@@ -0,0 +1,212 @@
+package gregtech.api.util;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+
+/**
+ * Redstone Circuit Control Code
+ * <p/>
+ * This should make everything possible what a Redstone Computer or BuildCraft Gate could do. It is intended to use this
+ * similar to BC-Gates (for acquiring Data) and RP Logic Gates. You could write an extremely specified and complex Logic
+ * Gate, which works only for you Setup, like with ComputerCraft, but you would have to write an extra Mod to add that,
+ * as it doesn't work Ingame.
+ * <p/>
+ * One can make use of the fact, that ItemStacks can be stored as Integer, so that you can scan Inventories for specific
+ * Items using that. Luckily the Buttons in the GUI enable Copy/Paste of ItemID+MetaData to Integer, including the
+ * WildCard Damage Value when you use rightclick to place it. You just need to use @GT_Utility.stackToInt(ItemStack
+ * aStack) to get it.
+ * <p/>
+ * All Functions run usually in a seperate try/catch Block, so that failed Logic won't crash the TileEntity.
+ */
+public abstract class GT_CircuitryBehavior {
+
+ /**
+ * @param aIndex 0 - 1023 are my own Indices, so use other Numbers!
+ */
+ public GT_CircuitryBehavior(int aIndex) {
+ GregTech_API.sCircuitryBehaviors.put(aIndex, this);
+ }
+
+ /**
+ * returns if there is Redstone applied to any of the valid Inputs (OR)
+ */
+ public static boolean getAnyRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side)
+ .letsRedstoneGoIn(
+ side,
+ aRedstoneCircuitBlock.getCoverID(side),
+ aRedstoneCircuitBlock.getCoverVariable(side),
+ aRedstoneCircuitBlock.getOwnTileEntity())) {
+ if (aRedstoneCircuitBlock.getInputRedstone(side) > 0) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * returns if there is Redstone applied to all the valid Inputs (AND)
+ */
+ public static boolean getAllRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side)
+ .letsRedstoneGoIn(
+ side,
+ aRedstoneCircuitBlock.getCoverID(side),
+ aRedstoneCircuitBlock.getCoverVariable(side),
+ aRedstoneCircuitBlock.getOwnTileEntity())) {
+ if (aRedstoneCircuitBlock.getInputRedstone(side) == 0) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * returns if there is Redstone applied to exactly one of the valid Inputs (XOR)
+ */
+ public static boolean getOneRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ int tRedstoneAmount = 0;
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side)
+ .letsRedstoneGoIn(
+ side,
+ aRedstoneCircuitBlock.getCoverID(side),
+ aRedstoneCircuitBlock.getCoverVariable(side),
+ aRedstoneCircuitBlock.getOwnTileEntity())) {
+ if (aRedstoneCircuitBlock.getInputRedstone(side) > 0) {
+ tRedstoneAmount++;
+ }
+ }
+ }
+ return tRedstoneAmount == 1;
+ }
+
+ /**
+ * returns the strongest incoming RS-Power
+ */
+ public static byte getStrongestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ byte tRedstoneAmount = 0;
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side)
+ .letsRedstoneGoIn(
+ side,
+ aRedstoneCircuitBlock.getCoverID(side),
+ aRedstoneCircuitBlock.getCoverVariable(side),
+ aRedstoneCircuitBlock.getOwnTileEntity())) {
+ tRedstoneAmount = (byte) Math.max(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(side));
+ }
+ }
+ return tRedstoneAmount;
+ }
+
+ // region GUI Functions
+
+ /**
+ * returns the weakest incoming non-zero RS-Power
+ */
+ public static byte getWeakestNonZeroRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (!getAnyRedstone(aRedstoneCircuitBlock)) return 0;
+ byte tRedstoneAmount = 15;
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side)
+ .letsRedstoneGoIn(
+ side,
+ aRedstoneCircuitBlock.getCoverID(side),
+ aRedstoneCircuitBlock.getCoverVariable(side),
+ aRedstoneCircuitBlock.getOwnTileEntity())) {
+ if (aRedstoneCircuitBlock.getInputRedstone(side) > 0)
+ tRedstoneAmount = (byte) Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(side));
+ }
+ }
+ return tRedstoneAmount;
+ }
+
+ /**
+ * returns the weakest incoming RS-Power
+ */
+ public static byte getWeakestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (!getAnyRedstone(aRedstoneCircuitBlock)) return 0;
+ byte tRedstoneAmount = 15;
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side)
+ .letsRedstoneGoIn(
+ side,
+ aRedstoneCircuitBlock.getCoverID(side),
+ aRedstoneCircuitBlock.getCoverVariable(side),
+ aRedstoneCircuitBlock.getOwnTileEntity())) {
+ tRedstoneAmount = (byte) Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(side));
+ }
+ }
+ return tRedstoneAmount;
+ }
+
+ /**
+ * Initializes the Parameters of this Circuit, all Parameters have been set to 0 right before calling this
+ *
+ * @param aCircuitData, The Data Storage you can use (8 Slots)
+ * @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself
+ */
+ public abstract void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock);
+
+ /**
+ * Validates the Parameters of this Circuit when a value has been changed by the GUI Also called right
+ * after @initParameters and when the Chunk reloads
+ *
+ * @param aCircuitData, The Data Storage you can use (8 Slots and only the first 4 are User definable)
+ * @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself
+ */
+ public abstract void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock);
+
+ // endregion
+
+ // region Utility Functions
+
+ /**
+ * Called every tick if the Block has enough Energy and if the Block is Active
+ *
+ * @param aCircuitData, The Data Storage you can use (8 Slots)
+ * @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself
+ */
+ public abstract void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock);
+
+ /**
+ * If the ItemStack should be displayed. Parameters are between 0 and 3.
+ */
+ public abstract boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock,
+ int aIndex);
+
+ /**
+ * The Name of the Gate for the GUI
+ */
+ @SideOnly(Side.CLIENT)
+ public abstract String getName();
+
+ /**
+ * The Description of the Gate for the GUI
+ */
+ @SideOnly(Side.CLIENT)
+ public abstract String getDescription();
+
+ /**
+ * The Description of the Data Field for the GUI
+ */
+ @SideOnly(Side.CLIENT)
+ public abstract String getDataDescription(int[] aCircuitData, int aCircuitDataIndex);
+
+ /**
+ * How the Integer should be displayed in the GUI. null means, that it just displays as regular Number.
+ */
+ @SideOnly(Side.CLIENT)
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ return null;
+ }
+ // endregion
+}
diff --git a/src/main/java/gregtech/api/util/GT_ClientPreference.java b/src/main/java/gregtech/api/util/GT_ClientPreference.java
new file mode 100644
index 0000000000..8df4ef8b05
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_ClientPreference.java
@@ -0,0 +1,41 @@
+package gregtech.api.util;
+
+public class GT_ClientPreference {
+
+ private final boolean mSingleBlockInitialFilter;
+ private final boolean mSingleBlockInitialMultiStack;
+ private final boolean mInputBusInitialFilter;
+ private final boolean wailaAverageNS;
+
+ public GT_ClientPreference(boolean mSingleBlockInitialFilter, boolean mSingleBlockInitialMultiStack,
+ boolean mInputBusInitialFilter, boolean wailaAverageNS) {
+ this.mSingleBlockInitialFilter = mSingleBlockInitialFilter;
+ this.mSingleBlockInitialMultiStack = mSingleBlockInitialMultiStack;
+ this.mInputBusInitialFilter = mInputBusInitialFilter;
+ this.wailaAverageNS = wailaAverageNS;
+ }
+
+ public GT_ClientPreference(GT_Config aClientDataFile) {
+ this.mSingleBlockInitialFilter = aClientDataFile.get("preference", "mSingleBlockInitialFilter", false);
+ this.mSingleBlockInitialMultiStack = aClientDataFile
+ .get("preference", "mSingleBlockInitialAllowMultiStack", false);
+ this.mInputBusInitialFilter = aClientDataFile.get("preference", "mInputBusInitialFilter", true);
+ this.wailaAverageNS = aClientDataFile.get("waila", "WailaAverageNS", false);
+ }
+
+ public boolean isSingleBlockInitialFilterEnabled() {
+ return mSingleBlockInitialFilter;
+ }
+
+ public boolean isSingleBlockInitialMultiStackEnabled() {
+ return mSingleBlockInitialMultiStack;
+ }
+
+ public boolean isInputBusInitialFilterEnabled() {
+ return mInputBusInitialFilter;
+ }
+
+ public boolean isWailaAverageNSEnabled() {
+ return wailaAverageNS;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_Config.java b/src/main/java/gregtech/api/util/GT_Config.java
new file mode 100644
index 0000000000..dc56def68f
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_Config.java
@@ -0,0 +1,160 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.E;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.common.config.Property;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+
+public class GT_Config implements Runnable {
+
+ public static boolean troll = false;
+
+ public static Configuration sConfigFileIDs;
+ public final Configuration mConfig;
+
+ public GT_Config(Configuration aConfig) {
+ mConfig = aConfig;
+ mConfig.load();
+ mConfig.save();
+ GregTech_API.sAfterGTPreload.add(this); // in case of crash on startup
+ GregTech_API.sAfterGTLoad.add(this); // in case of crash on startup
+ GregTech_API.sAfterGTPostload.add(this);
+ if (GT_Values.lateConfigSave) GregTech_API.sFirstWorldTick.add(this);
+ }
+
+ private static boolean shouldSave() {
+ return GT_Values.lateConfigSave ? GT_Values.worldTickHappened : GregTech_API.sPostloadFinished;
+ }
+
+ public static int addIDConfig(Object aCategory, String aName, int aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = sConfigFileIDs.get(
+ aCategory.toString()
+ .replaceAll("\\|", "."),
+ aName.replaceAll("\\|", "."),
+ aDefault);
+ int rResult = tProperty.getInt(aDefault);
+ if (!tProperty.wasRead() && shouldSave()) sConfigFileIDs.save();
+ return rResult;
+ }
+
+ public static String getStackConfigName(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return E;
+ Object rName = GT_OreDictUnificator.getAssociation(aStack);
+ if (rName != null) return rName.toString();
+ try {
+ if (GT_Utility.isStringValid(rName = aStack.getUnlocalizedName())) return rName.toString();
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ String sName = aStack.getItem()
+ .toString();
+ String[] tmp = sName.split("@");
+ if (tmp.length > 0) sName = tmp[0];
+ return sName + "." + aStack.getItemDamage();
+ }
+
+ public boolean get(Object aCategory, ItemStack aStack, boolean aDefault) {
+ String aName = getStackConfigName(aStack);
+ return get(aCategory, aName, aDefault);
+ }
+
+ public boolean get(Object aCategory, String aName, boolean aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ (aName + "_" + aDefault).replaceAll("\\|", "_"),
+ aDefault);
+ boolean rResult = tProperty.getBoolean(aDefault);
+ if (!tProperty.wasRead() && shouldSave()) mConfig.save();
+ return rResult;
+ }
+
+ public int get(Object aCategory, ItemStack aStack, int aDefault) {
+ return get(aCategory, getStackConfigName(aStack), aDefault);
+ }
+
+ public int get(Object aCategory, String aName, int aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ (aName + "_" + aDefault).replaceAll("\\|", "_"),
+ aDefault);
+ int rResult = tProperty.getInt(aDefault);
+ if (!tProperty.wasRead() && shouldSave()) mConfig.save();
+ return rResult;
+ }
+
+ public double get(Object aCategory, ItemStack aStack, double aDefault) {
+ return get(aCategory, getStackConfigName(aStack), aDefault);
+ }
+
+ public double get(Object aCategory, String aName, double aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ (aName + "_" + aDefault).replaceAll("\\|", "_"),
+ aDefault);
+ double rResult = tProperty.getDouble(aDefault);
+ if (!tProperty.wasRead() && shouldSave()) mConfig.save();
+ return rResult;
+ }
+
+ public String get(Object aCategory, ItemStack aStack, String aDefault) {
+ return get(aCategory, getStackConfigName(aStack), aDefault);
+ }
+
+ public String get(Object aCategory, String aName, String aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ (aName + "_" + aDefault).replaceAll("\\|", "_"),
+ aDefault);
+ String rResult = tProperty.getString();
+ if (!tProperty.wasRead() && shouldSave()) mConfig.save();
+ return rResult;
+ }
+
+ public String[] get(Object aCategory, ItemStack aStack, String... aDefault) {
+ return get(aCategory, getStackConfigName(aStack), aDefault);
+ }
+
+ public String[] get(Object aCategory, String aName, String... aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ aName.replaceAll("\\|", "_"),
+ aDefault);
+ String[] rResult = tProperty.getStringList();
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save();
+ return rResult;
+ }
+
+ public String getWithValidValues(Object aCategory, String aName, String[] validValues, String aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(
+ aCategory.toString()
+ .replaceAll("\\|", "_"),
+ aName.replaceAll("\\|", "_"),
+ aDefault,
+ null,
+ validValues);
+ String rResult = tProperty.getString();
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save();
+ return rResult;
+ }
+
+ @Override
+ public void run() {
+ mConfig.save();
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_CoverBehavior.java b/src/main/java/gregtech/api/util/GT_CoverBehavior.java
new file mode 100644
index 0000000000..34fc151b9a
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_CoverBehavior.java
@@ -0,0 +1,411 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.E;
+
+import java.lang.ref.WeakReference;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.net.GT_Packet_TileEntityCoverGUI;
+
+/**
+ * For Covers with a special behavior. Has fixed storage format of 4 byte. Not very convenient...
+ */
+public abstract class GT_CoverBehavior extends GT_CoverBehaviorBase<ISerializableObject.LegacyCoverData> {
+
+ public boolean mPlayerNotified = false;
+
+ public GT_CoverBehavior() {
+ this(null);
+ }
+
+ public GT_CoverBehavior(ITexture coverTexture) {
+ super(ISerializableObject.LegacyCoverData.class, coverTexture);
+ }
+
+ protected static int convert(ISerializableObject.LegacyCoverData data) {
+ return data == null ? 0 : data.get();
+ }
+
+ // region bridge the parent call to legacy calls
+
+ @Override
+ public final ISerializableObject.LegacyCoverData createDataObject() {
+ return new ISerializableObject.LegacyCoverData();
+ }
+
+ @Override
+ public ISerializableObject.LegacyCoverData createDataObject(int aLegacyData) {
+ return new ISerializableObject.LegacyCoverData(aLegacyData);
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ return isRedstoneSensitive(side, aCoverID, aCoverVariable.get(), aTileEntity, aTimer);
+ }
+
+ @Override
+ protected ISerializableObject.LegacyCoverData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone,
+ int aCoverID, ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ if (aCoverVariable == null) aCoverVariable = new ISerializableObject.LegacyCoverData();
+ aCoverVariable.set(doCoverThings(side, aInputRedstone, aCoverID, aCoverVariable.get(), aTileEntity, aTimer));
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX,
+ float aY, float aZ) {
+ return onCoverRightclick(side, aCoverID, convert(aCoverVariable), aTileEntity, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ protected ISerializableObject.LegacyCoverData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX,
+ float aY, float aZ) {
+ if (aCoverVariable == null) aCoverVariable = new ISerializableObject.LegacyCoverData();
+ aCoverVariable
+ .set(onCoverScrewdriverclick(side, aCoverID, convert(aCoverVariable), aTileEntity, aPlayer, aX, aY, aZ));
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean onCoverShiftRightClickImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer) {
+ return onCoverShiftRightclick(side, aCoverID, convert(aCoverVariable), aTileEntity, aPlayer);
+ }
+
+ @Deprecated
+ @Override
+ protected Object getClientGUIImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer,
+ World aWorld) {
+ return getClientGUI(side, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ @Override
+ protected boolean onCoverRemovalImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, boolean aForced) {
+ return onCoverRemoval(side, aCoverID, convert(aCoverVariable), aTileEntity, aForced);
+ }
+
+ @Override
+ protected String getDescriptionImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return getDescription(side, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ @Override
+ protected float getBlastProofLevelImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return getBlastProofLevel(side, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ @Override
+ protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return letsRedstoneGoIn(side, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ @Override
+ protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return letsRedstoneGoOut(side, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ @Override
+ protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return letsEnergyIn(side, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ @Override
+ protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return letsEnergyOut(side, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ @Override
+ protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) {
+ return letsFluidIn(side, aCoverID, convert(aCoverVariable), aFluid, aTileEntity);
+ }
+
+ @Override
+ protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, Fluid aFluid, ICoverable aTileEntity) {
+ return letsFluidOut(side, aCoverID, convert(aCoverVariable), aFluid, aTileEntity);
+ }
+
+ @Override
+ protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, int aSlot, ICoverable aTileEntity) {
+ return letsItemsIn(side, aCoverID, convert(aCoverVariable), aSlot, aTileEntity);
+ }
+
+ @Override
+ protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, int aSlot, ICoverable aTileEntity) {
+ return letsItemsOut(side, aCoverID, convert(aCoverVariable), aSlot, aTileEntity);
+ }
+
+ @Override
+ protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return isGUIClickable(side, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ @Override
+ protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return manipulatesSidedRedstoneOutput(side, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ @Override
+ protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return alwaysLookConnected(side, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ @Override
+ protected byte getRedstoneInputImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return getRedstoneInput(side, aInputRedstone, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ @Override
+ protected int getTickRateImpl(ForgeDirection side, int aCoverID, ISerializableObject.LegacyCoverData aCoverVariable,
+ ICoverable aTileEntity) {
+ return getTickRate(side, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ @Override
+ protected byte getLensColorImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return getLensColor(side, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ @Override
+ protected ItemStack getDropImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return getDrop(side, aCoverID, convert(aCoverVariable), aTileEntity);
+ }
+
+ // endregion
+
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return true;
+ }
+
+ /**
+ * Called by updateEntity inside the covered TileEntity. aCoverVariable is the Value you returned last time.
+ */
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return aCoverVariable;
+ }
+
+ /**
+ * Called when someone rightclicks this Cover.
+ * <p/>
+ * return true, if something actually happens.
+ */
+ public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return false;
+ }
+
+ /**
+ * Called when someone rightclicks this Cover with a Screwdriver. Doesn't call @onCoverRightclick in this Case.
+ * <p/>
+ * return the new Value of the Cover Variable
+ */
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return aCoverVariable;
+ }
+
+ /**
+ * Called when someone shift-rightclicks this Cover with no tool. Doesn't call @onCoverRightclick in this Case.
+ */
+ public boolean onCoverShiftRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer) {
+ if (hasCoverGUI() && aPlayer instanceof EntityPlayerMP) {
+ lastPlayer = new WeakReference<>(aPlayer);
+ mPlayerNotified = false;
+ if (useModularUI()) {
+ GT_UIInfos.openCoverUI(aTileEntity, aPlayer, side);
+ } else {
+ GT_Values.NW.sendToPlayer(
+ new GT_Packet_TileEntityCoverGUI(
+ side,
+ aCoverID,
+ aCoverVariable,
+ aTileEntity,
+ (EntityPlayerMP) aPlayer),
+ (EntityPlayerMP) aPlayer);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Deprecated
+ public Object getClientGUI(ForgeDirection side, int aCoverID, int coverData, ICoverable aTileEntity) {
+ return null;
+ }
+
+ /**
+ * Removes the Cover if this returns true, or if aForced is true. Doesn't get called when the Machine Block is
+ * getting broken, only if you break the Cover away from the Machine.
+ */
+ public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ boolean aForced) {
+ return true;
+ }
+
+ /**
+ * Gives a small Text for the status of the Cover.
+ */
+ public String getDescription(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return E;
+ }
+
+ /**
+ * How Blast Proof the Cover is. 30 is normal.
+ */
+ public float getBlastProofLevel(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 10.0F;
+ }
+
+ /**
+ * If it lets RS-Signals into the Block
+ * <p/>
+ * This is just Informative so that Machines know if their Redstone Input is blocked or not
+ */
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets RS-Signals out of the Block
+ */
+ public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Energy into the Block
+ */
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Energy out of the Block
+ */
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Liquids into the Block, aFluid can be null meaning if this is generally allowing Fluids or not.
+ */
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Liquids out of the Block, aFluid can be null meaning if this is generally allowing Fluids or not.
+ */
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Items into the Block, aSlot = -1 means if it is generally accepting Items (return false for no
+ * Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each
+ * Slot).
+ */
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Items out of the Block, aSlot = -1 means if it is generally accepting Items (return false for no
+ * Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each
+ * Slot).
+ */
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets you rightclick the Machine normally
+ */
+ public boolean isGUIClickable(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ /**
+ * Needs to return true for Covers, which have a Redstone Output on their Facing.
+ */
+ public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * if this Cover should let Pipe Connections look connected even if it is not the case.
+ */
+ public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * Called to determine the incoming Redstone Signal of a Machine. Returns the original Redstone per default. The
+ * Cover should @letsRedstoneGoIn or the aInputRedstone Parameter is always 0.
+ */
+ public byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return letsRedstoneGoIn(side, aCoverID, aCoverVariable, aTileEntity) ? aInputRedstone : 0;
+ }
+
+ /**
+ * Gets the Tick Rate for doCoverThings of the Cover
+ * <p/>
+ * 0 = No Ticks! Yes, 0 is Default, you have to override this
+ */
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 0;
+ }
+
+ /**
+ * The MC Color of this Lens. -1 for no Color (meaning this isn't a Lens then).
+ */
+ public byte getLensColor(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return -1;
+ }
+
+ /**
+ * @return the ItemStack dropped by this Cover
+ */
+ public ItemStack getDrop(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return GT_OreDictUnificator.get(true, aTileEntity.getCoverItemAtSide(side));
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java b/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java
new file mode 100644
index 0000000000..be9492ebba
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java
@@ -0,0 +1,856 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.E;
+
+import java.lang.ref.WeakReference;
+import java.util.List;
+import java.util.function.Supplier;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagInt;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizons.modularui.api.ModularUITextures;
+import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.gui.GT_GUIColorOverride;
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.widgets.GT_CoverTickRateButton;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.net.GT_Packet_TileEntityCoverGUI;
+import gregtech.common.covers.CoverInfo;
+
+/**
+ * For Covers with a special behavior.
+ *
+ * @author glease
+ */
+public abstract class GT_CoverBehaviorBase<T extends ISerializableObject> {
+
+ public WeakReference<EntityPlayer> lastPlayer = null;
+ private final Class<T> typeToken;
+ private final ITexture coverFGTexture;
+
+ protected GT_CoverBehaviorBase(Class<T> typeToken) {
+ this(typeToken, null);
+ }
+
+ protected GT_CoverBehaviorBase(Class<T> typeToken, ITexture coverTexture) {
+ this.typeToken = typeToken;
+ this.coverFGTexture = coverTexture;
+ reloadColorOverride();
+ }
+
+ public void reloadColorOverride() {
+ this.colorOverride = GT_GUIColorOverride.get(guiTexturePath);
+ }
+
+ public abstract T createDataObject(int aLegacyData);
+
+ public abstract T createDataObject();
+
+ public final T createDataObject(NBTBase aNBT) {
+ // Handle legacy data (migrating from GT_CoverBehavior to GT_CoverBehaviorBase)
+ if (aNBT instanceof NBTTagInt) {
+ return createDataObject(((NBTTagInt) aNBT).func_150287_d());
+ }
+
+ final T ret = createDataObject();
+ ret.loadDataFromNBT(aNBT);
+ return ret;
+ }
+
+ public final T cast(ISerializableObject aData) {
+ if (typeToken.isInstance(aData)) return forceCast(aData);
+ return null;
+ }
+
+ private T forceCast(ISerializableObject aData) {
+ try {
+ return typeToken.cast(aData);
+ } catch (Exception e) {
+ throw new RuntimeException("Casting data in " + this.getClass() + ", data " + aData, e);
+ }
+ }
+
+ // region facade
+
+ /**
+ * Get target facade block. Does not affect rendering of **this** block. It is only used as a hint for other block
+ * in case of CTM
+ *
+ * @return null if none, otherwise return facade target block
+ */
+ public final Block getFacadeBlock(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return getFacadeBlockImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * Get target facade block. Does not affect rendering of **this** block. It is only used as a hint for other block
+ * in case of CTM
+ *
+ * @return 0 if none, otherwise return facade target meta
+ */
+ public final int getFacadeMeta(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return getFacadeMetaImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * Get the display stack. Default to {@code int2Stack(aCoverID)}
+ */
+ public final ItemStack getDisplayStack(int aCoverID, ISerializableObject aCoverVariable) {
+ return getDisplayStackImpl(aCoverID, forceCast(aCoverVariable));
+ }
+
+ /**
+ * Get the special foreground cover texture associated with this cover. Return null if one should use the texture
+ * passed to {@link gregtech.api.GregTech_API#registerCover(ItemStack, ITexture, GT_CoverBehaviorBase)} or its
+ * overloads.
+ */
+ public final ITexture getSpecialCoverFGTexture(ForgeDirection side, int aCoverID,
+ ISerializableObject aCoverVariable, ICoverable aTileEntity) {
+ return getSpecialCoverFGTextureImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * Get the special cover texture associated with this cover. Return null if one should use the texture passed to
+ * {@link gregtech.api.GregTech_API#registerCover(ItemStack, ITexture, GT_CoverBehaviorBase)} or its overloads.
+ */
+ public final ITexture getSpecialCoverTexture(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return getSpecialCoverTextureImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * Return whether cover data needs to be synced to client upon tile entity creation or cover placement.
+ * <p>
+ * Note if you want to sync the data afterwards you will have to manually do it by calling
+ * {@link ICoverable#issueCoverUpdate(ForgeDirection)} This option only affects the initial sync.
+ */
+ public final boolean isDataNeededOnClient(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return isDataNeededOnClientImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * Called upon receiving data from network. Use {@link ICoverable#isClientSide()} to determine the side.
+ */
+ public final void onDataChanged(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ onDataChangedImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * Called before receiving data from network. Use {@link ICoverable#isClientSide()} to determine the side.
+ */
+ public final void preDataChanged(ForgeDirection side, int aCoverID, int aNewCoverId,
+ ISerializableObject aCoverVariable, ISerializableObject aNewCoverVariable, ICoverable aTileEntity) {
+ preDataChangedImpl(
+ side,
+ aCoverID,
+ aNewCoverId,
+ forceCast(aCoverVariable),
+ forceCast(aNewCoverVariable),
+ aTileEntity);
+ }
+
+ /**
+ * Called upon cover being removed. Called on both server and client.
+ */
+ public final void onDropped(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ onDroppedImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ public final boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return isRedstoneSensitiveImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aTimer);
+ }
+
+ /**
+ * Called by updateEntity inside the covered TileEntity. aCoverVariable is the Value you returned last time.
+ */
+ public final T doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ ISerializableObject aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ return doCoverThingsImpl(side, aInputRedstone, aCoverID, forceCast(aCoverVariable), aTileEntity, aTimer);
+ }
+
+ /**
+ * Called when someone rightclicks this Cover.
+ * <p/>
+ * return true, if something actually happens.
+ */
+ public final boolean onCoverRightClick(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return onCoverRightClickImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aPlayer, aX, aY, aZ);
+ }
+
+ /**
+ * Called when someone rightclicks this Cover with a Screwdriver. Doesn't call @onCoverRightclick in this Case.
+ * <p/>
+ * return the new Value of the Cover Variable
+ */
+ public final T onCoverScrewdriverClick(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return onCoverScrewdriverClickImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aPlayer, aX, aY, aZ);
+ }
+
+ /**
+ * Called when someone shift-rightclicks this Cover with no tool. Doesn't call @onCoverRightclick in this Case.
+ */
+ public final boolean onCoverShiftRightClick(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity, EntityPlayer aPlayer) {
+ return onCoverShiftRightClickImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aPlayer);
+ }
+
+ @Deprecated
+ public final Object getClientGUI(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity, EntityPlayer aPlayer, World aWorld) {
+ return getClientGUIImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aPlayer, aWorld);
+ }
+
+ /**
+ * Removes the Cover if this returns true, or if aForced is true. Doesn't get called when the Machine Block is
+ * getting broken, only if you break the Cover away from the Machine.
+ */
+ public final boolean onCoverRemoval(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity, boolean aForced) {
+ return onCoverRemovalImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity, aForced);
+ }
+
+ /**
+ * Called upon Base TE being destroyed (once getDrops is called), thus getting called only when destroyed in
+ * survival.
+ */
+ public final void onBaseTEDestroyed(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ onBaseTEDestroyedImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * Gives a small Text for the status of the Cover.
+ */
+ public final String getDescription(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return getDescriptionImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * How Blast Proof the Cover is. 30 is normal.
+ */
+ public final float getBlastProofLevel(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return getBlastProofLevelImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * If it lets RS-Signals into the Block
+ * <p/>
+ * This is just Informative so that Machines know if their Redstone Input is blocked or not
+ */
+ public final boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return letsRedstoneGoInImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * If it lets RS-Signals out of the Block
+ */
+ public final boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return letsRedstoneGoOutImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * If it lets Energy into the Block
+ */
+ public final boolean letsEnergyIn(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return letsEnergyInImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * If it lets Energy out of the Block
+ */
+ public final boolean letsEnergyOut(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return letsEnergyOutImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * If it lets Liquids into the Block, aFluid can be null meaning if this is generally allowing Fluids or not.
+ */
+ public final boolean letsFluidIn(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ Fluid aFluid, ICoverable aTileEntity) {
+ return letsFluidInImpl(side, aCoverID, forceCast(aCoverVariable), aFluid, aTileEntity);
+ }
+
+ /**
+ * If it lets Liquids out of the Block, aFluid can be null meaning if this is generally allowing Fluids or not.
+ */
+ public final boolean letsFluidOut(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ Fluid aFluid, ICoverable aTileEntity) {
+ return letsFluidOutImpl(side, aCoverID, forceCast(aCoverVariable), aFluid, aTileEntity);
+ }
+
+ /**
+ * If it lets Items into the Block, aSlot = -1 means if it is generally accepting Items (return false for no
+ * reaction at all), aSlot = -2 means if it would accept for all Slots Impl(return true to skip the Checks for each
+ * Slot).
+ */
+ public final boolean letsItemsIn(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return letsItemsInImpl(side, aCoverID, forceCast(aCoverVariable), aSlot, aTileEntity);
+ }
+
+ /**
+ * If it lets Items out of the Block, aSlot = -1 means if it is generally accepting Items (return false for no
+ * reaction at all), aSlot = -2 means if it would accept for all Slots Impl(return true to skip the Checks for each
+ * Slot).
+ */
+ public final boolean letsItemsOut(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return letsItemsOutImpl(side, aCoverID, forceCast(aCoverVariable), aSlot, aTileEntity);
+ }
+
+ /**
+ * If it lets you rightclick the Machine normally
+ */
+ public final boolean isGUIClickable(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return isGUIClickableImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * Needs to return true for Covers, which have a Redstone Output on their Facing.
+ */
+ public final boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID,
+ ISerializableObject aCoverVariable, ICoverable aTileEntity) {
+ return manipulatesSidedRedstoneOutputImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * if this Cover should let Pipe Connections look connected even if it is not the case.
+ */
+ public final boolean alwaysLookConnected(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return alwaysLookConnectedImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * Called to determine the incoming Redstone Signal of a Machine. Returns the original Redstone per default. The
+ * Cover should @letsRedstoneGoIn or the aInputRedstone Parameter is always 0.
+ */
+ public final byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ ISerializableObject aCoverVariable, ICoverable aTileEntity) {
+ return getRedstoneInputImpl(side, aInputRedstone, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * Gets the Tick Rate for doCoverThings of the Cover
+ * <p/>
+ * 0 = No Ticks! Yes, 0 is Default, you have to override this
+ */
+ public final int getTickRate(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return getTickRateImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * The MC Color of this Lens. -1 for no Color (meaning this isn't a Lens then).
+ */
+ public final byte getLensColor(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return getLensColorImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * @return the ItemStack dropped by this Cover
+ */
+ public final ItemStack getDrop(ForgeDirection side, int aCoverID, ISerializableObject aCoverVariable,
+ ICoverable aTileEntity) {
+ return getDropImpl(side, aCoverID, forceCast(aCoverVariable), aTileEntity);
+ }
+
+ /**
+ * Called when the cover is initially attached to a machine.
+ *
+ * @param player The attaching player
+ * @param aCover An {@link ItemStack} containing the cover
+ * @param aTileEntity The machine receiving the cover
+ * @param side Which side the cover is attached to
+ */
+ public void onPlayerAttach(EntityPlayer player, ItemStack aCover, ICoverable aTileEntity, ForgeDirection side) {
+ // Do nothing by default.
+ }
+
+ // endregion
+
+ // region UI stuff
+
+ protected GT_TooltipDataCache mTooltipCache = new GT_TooltipDataCache();
+ protected GT_GUIColorOverride colorOverride;
+ private static final String guiTexturePath = "gregtech:textures/gui/GuiCover.png";
+
+ /**
+ * For back compatibility, you need to override this if this cover uses ModularUI.
+ */
+ public boolean useModularUI() {
+ return false;
+ }
+
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new UIFactory(buildContext).createWindow();
+ }
+
+ /**
+ * Creates {@link ModularWindow} for this cover. This is separated from base class, as attaching the same covers in
+ * different sides of the same tile needs different UI with different context.
+ */
+ protected class UIFactory {
+
+ private final GT_CoverUIBuildContext uiBuildContext;
+
+ public UIFactory(GT_CoverUIBuildContext buildContext) {
+ this.uiBuildContext = buildContext;
+ }
+
+ public ModularWindow createWindow() {
+ ModularWindow.Builder builder = ModularWindow.builder(getGUIWidth(), getGUIHeight());
+ builder.setBackground(ModularUITextures.VANILLA_BACKGROUND);
+ builder.setGuiTint(getUIBuildContext().getGuiColorization());
+ if (doesBindPlayerInventory() && !getUIBuildContext().isAnotherWindow()) {
+ builder.bindPlayerInventory(getUIBuildContext().getPlayer());
+ }
+ addTitleToUI(builder);
+ addUIWidgets(builder);
+ if (getUIBuildContext().isAnotherWindow()) {
+ builder.widget(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(getGUIWidth() - 15, 3));
+ }
+
+ final CoverInfo coverInfo = uiBuildContext.getTile()
+ .getCoverInfoAtSide(uiBuildContext.getCoverSide());
+ final GT_CoverBehaviorBase<?> behavior = coverInfo.getCoverBehavior();
+ if (coverInfo.getMinimumTickRate() > 0 && behavior.allowsTickRateAddition()) {
+ builder.widget(
+ new GT_CoverTickRateButton(coverInfo, builder).setPos(getGUIWidth() - 24, getGUIHeight() - 24));
+ }
+
+ return builder.build();
+ }
+
+ /**
+ * Override this to add widgets for your UI.
+ */
+ protected void addUIWidgets(ModularWindow.Builder builder) {}
+
+ public GT_CoverUIBuildContext getUIBuildContext() {
+ return uiBuildContext;
+ }
+
+ /**
+ * Can return null when cover data is invalid e.g. tile is broken or cover is removed
+ */
+ @Nullable
+ public T getCoverData() {
+ if (isCoverValid()) {
+ return forceCast(
+ getUIBuildContext().getTile()
+ .getComplexCoverDataAtSide(getUIBuildContext().getCoverSide()));
+ } else {
+ return null;
+ }
+ }
+
+ public boolean setCoverData(T data) {
+ if (isCoverValid()) {
+ getUIBuildContext().getTile()
+ .receiveCoverData(
+ getUIBuildContext().getCoverSide(),
+ getUIBuildContext().getCoverID(),
+ data,
+ getUIBuildContext().getPlayer() instanceof EntityPlayerMP
+ ? (EntityPlayerMP) getUIBuildContext().getPlayer()
+ : null);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean isCoverValid() {
+ return !getUIBuildContext().getTile()
+ .isDead()
+ && getUIBuildContext().getTile()
+ .getCoverBehaviorAtSideNew(getUIBuildContext().getCoverSide()) != GregTech_API.sNoBehavior;
+ }
+
+ protected void addTitleToUI(ModularWindow.Builder builder) {
+ ItemStack coverItem = GT_Utility.intToStack(getUIBuildContext().getCoverID());
+ if (coverItem != null) {
+ builder.widget(
+ new ItemDrawable(coverItem).asWidget()
+ .setPos(5, 5)
+ .setSize(16, 16))
+ .widget(
+ new TextWidget(coverItem.getDisplayName()).setDefaultColor(COLOR_TITLE.get())
+ .setPos(25, 9));
+ }
+ }
+
+ protected int getGUIWidth() {
+ return 176;
+ }
+
+ protected int getGUIHeight() {
+ return 107;
+ }
+
+ protected boolean doesBindPlayerInventory() {
+ return false;
+ }
+
+ protected int getTextColorOrDefault(String textType, int defaultColor) {
+ return colorOverride.getTextColorOrDefault(textType, defaultColor);
+ }
+
+ protected final Supplier<Integer> COLOR_TITLE = () -> getTextColorOrDefault("title", 0x222222);
+ protected final Supplier<Integer> COLOR_TEXT_GRAY = () -> getTextColorOrDefault("text_gray", 0x555555);
+ protected final Supplier<Integer> COLOR_TEXT_WARN = () -> getTextColorOrDefault("text_warn", 0xff0000);
+ }
+
+ // endregion
+
+ // region impl
+
+ protected Block getFacadeBlockImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {
+ return null;
+ }
+
+ protected int getFacadeMetaImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {
+ return 0;
+ }
+
+ protected ItemStack getDisplayStackImpl(int aCoverID, T aCoverVariable) {
+ return GT_Utility.intToStack(aCoverID);
+ }
+
+ protected ITexture getSpecialCoverFGTextureImpl(ForgeDirection side, int aCoverID, T aCoverVariable,
+ ICoverable aTileEntity) {
+ return coverFGTexture;
+ }
+
+ protected ITexture getSpecialCoverTextureImpl(ForgeDirection side, int aCoverID, T aCoverVariable,
+ ICoverable aTileEntity) {
+ return null;
+ }
+
+ protected boolean isDataNeededOnClientImpl(ForgeDirection side, int aCoverID, T aCoverVariable,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ protected void onDataChangedImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {}
+
+ protected void preDataChangedImpl(ForgeDirection side, int aCoverID, int aNewCoverId, T aCoverVariable,
+ T aNewCoverVariable, ICoverable aTileEntity) {}
+
+ protected void onDroppedImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {}
+
+ protected void onBaseTEDestroyedImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {}
+
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, T aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return false;
+ }
+
+ /**
+ * Called by updateEntity inside the covered TileEntity. aCoverVariable is the Value you returned last time.
+ */
+ protected T doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, T aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return aCoverVariable;
+ }
+
+ /**
+ * Called when someone rightclicks this Cover.
+ * <p/>
+ * return true, if something actually happens.
+ */
+ protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return false;
+ }
+
+ /**
+ * Called when someone rightclicks this Cover with a Screwdriver. Doesn't call @onCoverRightclick in this Case.
+ * <p/>
+ * return the new Value of the Cover Variable
+ */
+ protected T onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return aCoverVariable;
+ }
+
+ /**
+ * Called when someone shift-rightclicks this Cover with no tool. Doesn't call @onCoverRightclick in this Case.
+ */
+ protected boolean onCoverShiftRightClickImpl(ForgeDirection side, int aCoverID, T aCoverVariable,
+ ICoverable aTileEntity, EntityPlayer aPlayer) {
+ if (hasCoverGUI() && aPlayer instanceof EntityPlayerMP) {
+ lastPlayer = new WeakReference<>(aPlayer);
+ if (useModularUI()) {
+ GT_UIInfos.openCoverUI(aTileEntity, aPlayer, side);
+ } else {
+ GT_Values.NW.sendToPlayer(
+ new GT_Packet_TileEntityCoverGUI(
+ side,
+ aCoverID,
+ aCoverVariable,
+ aTileEntity,
+ (EntityPlayerMP) aPlayer),
+ (EntityPlayerMP) aPlayer);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Deprecated
+ protected Object getClientGUIImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, World aWorld) {
+ return null;
+ }
+
+ /**
+ * Removes the Cover if this returns true, or if aForced is true. Doesn't get called when the Machine Block is
+ * getting broken, only if you break the Cover away from the Machine.
+ */
+ protected boolean onCoverRemovalImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity,
+ boolean aForced) {
+ return true;
+ }
+
+ /**
+ * Gives a small Text for the status of the Cover.
+ */
+ protected String getDescriptionImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {
+ return E;
+ }
+
+ /**
+ * How Blast Proof the Cover is. 30 is normal.
+ */
+ protected float getBlastProofLevelImpl(ForgeDirection side, int aCoverID, T aCoverVariable,
+ ICoverable aTileEntity) {
+ return 10.0F;
+ }
+
+ /**
+ * If it lets RS-Signals into the Block
+ * <p/>
+ * This is just Informative so that Machines know if their Redstone Input is blocked or not
+ */
+ protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, T aCoverVariable,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets RS-Signals out of the Block
+ */
+ protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Energy into the Block
+ */
+ protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Energy out of the Block
+ */
+ protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Liquids into the Block, aFluid can be null meaning if this is generally allowing Fluids or not.
+ */
+ protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Liquids out of the Block, aFluid can be null meaning if this is generally allowing Fluids or not.
+ */
+ protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Items into the Block, aSlot = -1 means if it is generally accepting Items (return false for no
+ * Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each
+ * Slot).
+ */
+ protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Items out of the Block, aSlot = -1 means if it is generally accepting Items (return false for no
+ * Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each
+ * Slot).
+ */
+ protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets you rightclick the Machine normally
+ */
+ protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ /**
+ * Needs to return true for Covers, which have a Redstone Output on their Facing.
+ */
+ protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, T aCoverVariable,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * if this Cover should let Pipe Connections look connected even if it is not the case.
+ */
+ protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, T aCoverVariable,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * Called to determine the incoming Redstone Signal of a Machine. Returns the original Redstone per default. The
+ * Cover should @letsRedstoneGoIn or the aInputRedstone Parameter is always 0.
+ */
+ protected byte getRedstoneInputImpl(ForgeDirection side, byte aInputRedstone, int aCoverID, T aCoverVariable,
+ ICoverable aTileEntity) {
+ return letsRedstoneGoIn(side, aCoverID, aCoverVariable, aTileEntity) ? aInputRedstone : 0;
+ }
+
+ /**
+ * Gets the Tick Rate for doCoverThings of the Cover
+ * <p/>
+ * 0 = No Ticks! Yes, 0 is Default, you have to override this
+ */
+ protected int getTickRateImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {
+ return 0;
+ }
+
+ /**
+ * The MC Color of this Lens. -1 for no Color (meaning this isn't a Lens then).
+ */
+ protected byte getLensColorImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {
+ return -1;
+ }
+
+ /**
+ * @return the ItemStack dropped by this Cover
+ */
+ protected ItemStack getDropImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {
+ return GT_OreDictUnificator.get(true, aTileEntity.getCoverItemAtSide(side));
+ }
+
+ // endregion
+
+ // region no data
+
+ /**
+ * Checks if the Cover can be placed on this.
+ */
+ public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) {
+ return true;
+ }
+
+ public boolean hasCoverGUI() {
+ return false;
+ }
+
+ /**
+ * Called when someone rightclicks this Cover Client Side
+ * <p/>
+ * return true, if something actually happens.
+ */
+ public boolean onCoverRightclickClient(ForgeDirection side, ICoverable aTileEntity, EntityPlayer aPlayer, float aX,
+ float aY, float aZ) {
+ return false;
+ }
+
+ /**
+ * If this is a simple Cover, which can also be used on Bronze Machines and similar.
+ */
+ public boolean isSimpleCover() {
+ return false;
+ }
+
+ /**
+ * sets the Cover upon placement.
+ */
+ public void placeCover(ForgeDirection side, ItemStack aCover, ICoverable aTileEntity) {
+ aTileEntity.setCoverIDAtSide(side, GT_Utility.stackToInt(aCover));
+ }
+
+ public boolean allowsCopyPasteTool() {
+ return true;
+ }
+
+ public boolean allowsTickRateAddition() {
+ return true;
+ }
+
+ @NotNull
+ public final List<String> getAdditionalTooltip(ISerializableObject coverData) {
+ return getAdditionalTooltipImpl(forceCast(coverData));
+ }
+
+ /**
+ * Override to add to the tooltip generated when a user hovers over the cover on the left side of a machine's UI.
+ *
+ * @param coverData The cover data associated with the cover on a particular side.
+ * @return A list of new tooltip entries. Entries are inserted at the top, just after the name and direction line.
+ */
+ protected List<String> getAdditionalTooltipImpl(T coverData) {
+ return ImmutableList.of();
+ }
+ // endregion
+}
diff --git a/src/main/java/gregtech/api/util/GT_CreativeTab.java b/src/main/java/gregtech/api/util/GT_CreativeTab.java
new file mode 100644
index 0000000000..1049f40278
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_CreativeTab.java
@@ -0,0 +1,26 @@
+package gregtech.api.util;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+
+public class GT_CreativeTab extends CreativeTabs {
+
+ public GT_CreativeTab(String aName, String aLocalName) {
+ super("GregTech." + aName);
+ GT_LanguageManager.addStringLocalization("itemGroup.GregTech." + aName, aLocalName);
+ }
+
+ @Override
+ public ItemStack getIconItemStack() {
+ return ItemList.Tool_Cheat.get(1, new ItemStack(Blocks.iron_block, 1));
+ }
+
+ @Override
+ public Item getTabIconItem() {
+ return ItemList.Circuit_Integrated.getItem();
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_ExoticEnergyInputHelper.java b/src/main/java/gregtech/api/util/GT_ExoticEnergyInputHelper.java
new file mode 100644
index 0000000000..d59796b251
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_ExoticEnergyInputHelper.java
@@ -0,0 +1,114 @@
+package gregtech.api.util;
+
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+
+public class GT_ExoticEnergyInputHelper {
+
+ /**
+ * The Valid Types of TecTech Hatch List.
+ */
+ private static final List<Class<? extends GT_MetaTileEntity_Hatch>> sExoticEnergyHatchType = new ArrayList<>();
+
+ static {
+ tryRegister("com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti");
+ tryRegister("com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyTunnel");
+ }
+
+ public static void register(Class<? extends GT_MetaTileEntity_Hatch> clazz) {
+ if (!GT_MetaTileEntity_Hatch.class.isAssignableFrom(clazz)) throw new IllegalArgumentException(
+ clazz.getName() + " is not a subclass of " + GT_MetaTileEntity_Hatch.class.getName());
+ sExoticEnergyHatchType.add(clazz);
+ }
+
+ @SuppressWarnings("unchecked")
+ public static void tryRegister(String className) {
+ Class<?> clazz;
+ try {
+ clazz = Class.forName(className);
+ } catch (ClassNotFoundException e) {
+ return;
+ }
+ if (!GT_MetaTileEntity_Hatch.class.isAssignableFrom(clazz)) throw new IllegalArgumentException(
+ clazz.getName() + " is not a subclass of " + GT_MetaTileEntity_Hatch.class.getName());
+ sExoticEnergyHatchType.add((Class<? extends GT_MetaTileEntity_Hatch>) clazz);
+ }
+
+ public static boolean drainEnergy(long aEU, Collection<? extends GT_MetaTileEntity_Hatch> hatches) {
+ for (GT_MetaTileEntity_Hatch tHatch : hatches) {
+ long tDrain = Math.min(
+ tHatch.getBaseMetaTileEntity()
+ .getStoredEU(),
+ aEU);
+ tHatch.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(tDrain, false);
+ aEU -= tDrain;
+ }
+ return aEU <= 0;
+ }
+
+ public static boolean isExoticEnergyInput(IMetaTileEntity aHatch) {
+ for (Class<?> clazz : sExoticEnergyHatchType) {
+ if (clazz.isInstance(aHatch)) return true;
+ }
+ return false;
+ }
+
+ public static long getTotalEuMulti(Collection<? extends GT_MetaTileEntity_Hatch> hatches) {
+ long rEU = 0L;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(hatches)) {
+ rEU += tHatch.getBaseMetaTileEntity()
+ .getInputVoltage() * tHatch.maxWorkingAmperesIn();
+ }
+ return rEU;
+ }
+
+ public static long getMaxInputVoltageMulti(Collection<? extends GT_MetaTileEntity_Hatch> hatches) {
+ long rVoltage = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(hatches)) {
+ rVoltage += tHatch.getBaseMetaTileEntity()
+ .getInputVoltage();
+ }
+ return rVoltage;
+ }
+
+ public static long getAverageInputVoltageMulti(Collection<? extends GT_MetaTileEntity_Hatch> hatches) {
+ long rVoltage = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(hatches)) {
+ rVoltage += tHatch.getBaseMetaTileEntity()
+ .getInputVoltage();
+ }
+ if (hatches.isEmpty()) {
+ return 0;
+ }
+ return rVoltage / hatches.size();
+ }
+
+ public static long getMaxInputAmpsMulti(Collection<? extends GT_MetaTileEntity_Hatch> hatches) {
+ long rAmp = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(hatches)) {
+ rAmp += tHatch.getBaseMetaTileEntity()
+ .getInputAmperage();
+ }
+ return rAmp;
+ }
+
+ public static long getMaxWorkingInputAmpsMulti(Collection<? extends GT_MetaTileEntity_Hatch> hatches) {
+ long rAmp = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(hatches)) {
+ rAmp += tHatch.maxWorkingAmperesIn();
+ }
+ return rAmp;
+ }
+
+ public static List<Class<? extends GT_MetaTileEntity_Hatch>> getAllClasses() {
+ return Collections.unmodifiableList(sExoticEnergyHatchType);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_FoodStat.java b/src/main/java/gregtech/api/util/GT_FoodStat.java
new file mode 100644
index 0000000000..5eda76f9d0
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_FoodStat.java
@@ -0,0 +1,122 @@
+package gregtech.api.util;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.EnumAction;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.PotionEffect;
+
+import gregtech.api.damagesources.GT_DamageSources;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IFoodStat;
+import gregtech.api.items.GT_MetaBase_Item;
+
+public class GT_FoodStat implements IFoodStat {
+
+ private final int mFoodLevel;
+ private final int[] mPotionEffects;
+ private final float mSaturation;
+ private final EnumAction mAction;
+ private final ItemStack mEmptyContainer;
+ private final boolean mAlwaysEdible, mInvisibleParticles, mIsRotten;
+ private boolean mExplosive = false, mMilk = false;
+
+ /**
+ * @param aFoodLevel Amount of Food in Half Bacon [0 - 20]
+ * @param aSaturation Amount of Saturation [0.0F - 1.0F]
+ * @param aAction The Action to be used. If this is null, it uses the Eating Action
+ * @param aEmptyContainer An empty Container (Optional)
+ * @param aAlwaysEdible If this Item is always edible, like Golden Apples or Potions
+ * @param aInvisibleParticles If the Particles of the Potion Effects are invisible
+ * @param aPotionEffects An Array of Potion Effects with %4==0 Elements as follows ID of a Potion Effect. 0 for
+ * none Duration of the Potion in Ticks Level of the Effect. [0, 1, 2] are for [I, II,
+ * III] The likelihood that this Potion Effect takes place upon being eaten [1 - 100]
+ */
+ public GT_FoodStat(int aFoodLevel, float aSaturation, EnumAction aAction, ItemStack aEmptyContainer,
+ boolean aAlwaysEdible, boolean aInvisibleParticles, boolean aIsRotten, int... aPotionEffects) {
+ mFoodLevel = aFoodLevel;
+ mSaturation = aSaturation;
+ mAction = aAction == null ? EnumAction.eat : aAction;
+ mPotionEffects = aPotionEffects;
+ mEmptyContainer = GT_Utility.copyOrNull(aEmptyContainer);
+ mInvisibleParticles = aInvisibleParticles;
+ mAlwaysEdible = aAlwaysEdible;
+ mIsRotten = aIsRotten;
+ }
+
+ public GT_FoodStat setExplosive() {
+ mExplosive = true;
+ return this;
+ }
+
+ public GT_FoodStat setMilk() {
+ mMilk = true;
+ return this;
+ }
+
+ @Override
+ public int getFoodLevel(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
+ return mFoodLevel;
+ }
+
+ @Override
+ public float getSaturation(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
+ return mSaturation;
+ }
+
+ @Override
+ public void onEaten(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
+ aStack.stackSize--;
+ ItemStack tStack = GT_OreDictUnificator.get(GT_Utility.copyOrNull(mEmptyContainer));
+ if (tStack != null && !aPlayer.inventory.addItemStackToInventory(tStack))
+ aPlayer.dropPlayerItemWithRandomChoice(tStack, true);
+
+ new WorldSpawnedEventBuilder.SoundAtEntityEventBuilder().setIdentifier(SoundResource.RANDOM_BURP)
+ .setVolume(0.5F)
+ .setPitch(aPlayer.worldObj.rand.nextFloat() * 0.1F + 0.9F)
+ .setEntity(aPlayer)
+ .setWorld(aPlayer.worldObj)
+ .run();
+
+ if (!aPlayer.worldObj.isRemote) {
+ if (mMilk) {
+ aPlayer.curePotionEffects(new ItemStack(Items.milk_bucket, 1, 0));
+ }
+ for (int i = 3; i < mPotionEffects.length; i += 4) {
+ if (aPlayer.worldObj.rand.nextInt(100) < mPotionEffects[i]) {
+ aPlayer.addPotionEffect(
+ new PotionEffect(
+ mPotionEffects[i - 3],
+ mPotionEffects[i - 2],
+ mPotionEffects[i - 1],
+ mInvisibleParticles));
+ }
+ }
+ if (mExplosive) {
+ new WorldSpawnedEventBuilder.ExplosionEffectEventBuilder().setSmoking(true)
+ .setFlaming(true)
+ .setStrength(4f)
+ .setPosition(aPlayer.posX, aPlayer.posY, aPlayer.posZ)
+ .setEntity(aPlayer)
+ .setWorld(aPlayer.worldObj)
+ .run();
+ aPlayer.attackEntityFrom(GT_DamageSources.getExplodingDamage(), Float.MAX_VALUE);
+ }
+ }
+ }
+
+ @Override
+ public EnumAction getFoodAction(GT_MetaBase_Item aItem, ItemStack aStack) {
+ return mAction;
+ }
+
+ @Override
+ public boolean alwaysEdible(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
+ return mAlwaysEdible;
+ }
+
+ @Override
+ public boolean isRotten(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
+ return mIsRotten;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_Forestry_Compat.java b/src/main/java/gregtech/api/util/GT_Forestry_Compat.java
new file mode 100644
index 0000000000..427703e6f7
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_Forestry_Compat.java
@@ -0,0 +1,195 @@
+package gregtech.api.util;
+
+import java.util.Map;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import forestry.api.recipes.ICentrifugeRecipe;
+import forestry.api.recipes.ISqueezerRecipe;
+import forestry.api.recipes.RecipeManagers;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.recipe.RecipeMaps;
+
+public class GT_Forestry_Compat {
+
+ public static void populateFakeNeiRecipes() {
+ if (ItemList.FR_Bee_Drone.get(1L) != null) {
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.FR_Bee_Drone.getWildcard(1L) },
+ new ItemStack[] { ItemList.FR_Bee_Drone.getWithName(1L, "Scanned Drone") },
+ null,
+ new FluidStack[] { Materials.Honey.getFluid(100L) },
+ null,
+ 500,
+ 2,
+ 0);
+ }
+ if (ItemList.FR_Bee_Princess.get(1L) != null) {
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.FR_Bee_Princess.getWildcard(1L) },
+ new ItemStack[] { ItemList.FR_Bee_Princess.getWithName(1L, "Scanned Princess") },
+ null,
+ new FluidStack[] { Materials.Honey.getFluid(100L) },
+ null,
+ 500,
+ 2,
+ 0);
+ }
+ if (ItemList.FR_Bee_Queen.get(1L) != null) {
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.FR_Bee_Queen.getWildcard(1L) },
+ new ItemStack[] { ItemList.FR_Bee_Queen.getWithName(1L, "Scanned Queen") },
+ null,
+ new FluidStack[] { Materials.Honey.getFluid(100L) },
+ null,
+ 500,
+ 2,
+ 0);
+ }
+ if (ItemList.FR_Tree_Sapling.get(1L) != null) {
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.FR_Tree_Sapling.getWildcard(1L) },
+ new ItemStack[] { ItemList.FR_Tree_Sapling.getWithName(1L, "Scanned Sapling") },
+ null,
+ new FluidStack[] { Materials.Honey.getFluid(100L) },
+ null,
+ 500,
+ 2,
+ 0);
+ }
+ if (ItemList.FR_Butterfly.get(1L) != null) {
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.FR_Butterfly.getWildcard(1L) },
+ new ItemStack[] { ItemList.FR_Butterfly.getWithName(1L, "Scanned Butterfly") },
+ null,
+ new FluidStack[] { Materials.Honey.getFluid(100L) },
+ null,
+ 500,
+ 2,
+ 0);
+ }
+ if (ItemList.FR_Larvae.get(1L) != null) {
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.FR_Larvae.getWildcard(1L) },
+ new ItemStack[] { ItemList.FR_Larvae.getWithName(1L, "Scanned Larvae") },
+ null,
+ new FluidStack[] { Materials.Honey.getFluid(100L) },
+ null,
+ 500,
+ 2,
+ 0);
+ }
+ if (ItemList.FR_Serum.get(1L) != null) {
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.FR_Serum.getWildcard(1L) },
+ new ItemStack[] { ItemList.FR_Serum.getWithName(1L, "Scanned Serum") },
+ null,
+ new FluidStack[] { Materials.Honey.getFluid(100L) },
+ null,
+ 500,
+ 2,
+ 0);
+ }
+ if (ItemList.FR_Caterpillar.get(1L) != null) {
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.FR_Caterpillar.getWildcard(1L) },
+ new ItemStack[] { ItemList.FR_Caterpillar.getWithName(1L, "Scanned Caterpillar") },
+ null,
+ new FluidStack[] { Materials.Honey.getFluid(100L) },
+ null,
+ 500,
+ 2,
+ 0);
+ }
+ if (ItemList.FR_PollenFertile.get(1L) != null) {
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.FR_PollenFertile.getWildcard(1L) },
+ new ItemStack[] { ItemList.FR_PollenFertile.getWithName(1L, "Scanned Pollen") },
+ null,
+ new FluidStack[] { Materials.Honey.getFluid(100L) },
+ null,
+ 500,
+ 2,
+ 0);
+ }
+ }
+
+ public static void transferCentrifugeRecipes() {
+ try {
+ for (ICentrifugeRecipe tRecipe : RecipeManagers.centrifugeManager.recipes()) {
+ Map<ItemStack, Float> outputs = tRecipe.getAllProducts();
+ ItemStack[] tOutputs = new ItemStack[outputs.size()];
+ int[] tChances = new int[outputs.size()];
+ int i = 0;
+ for (Map.Entry<ItemStack, Float> entry : outputs.entrySet()) {
+ tChances[i] = (int) (entry.getValue() * 10000);
+ tOutputs[i] = entry.getKey()
+ .copy();
+ i++;
+ }
+ RecipeMaps.centrifugeRecipes.addRecipe(
+ true,
+ new ItemStack[] { tRecipe.getInput() },
+ tOutputs,
+ null,
+ tChances,
+ null,
+ null,
+ 128,
+ 5,
+ 0);
+ RecipeMaps.centrifugeNonCellRecipes.addRecipe(
+ true,
+ new ItemStack[] { tRecipe.getInput() },
+ tOutputs,
+ null,
+ tChances,
+ null,
+ null,
+ 128,
+ 5,
+ 0);
+ }
+ } catch (Throwable e) {
+ if (GT_Values.D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+
+ public static void transferSqueezerRecipes() {
+ try {
+ for (ISqueezerRecipe tRecipe : RecipeManagers.squeezerManager.recipes()) {
+ if ((tRecipe.getResources().length == 1) && (tRecipe.getFluidOutput() != null)) {
+ RecipeMaps.fluidExtractionRecipes.addRecipe(
+ true,
+ new ItemStack[] { tRecipe.getResources()[0] },
+ new ItemStack[] { tRecipe.getRemnants() },
+ null,
+ new int[] { (int) (tRecipe.getRemnantsChance() * 10000) },
+ null,
+ new FluidStack[] { tRecipe.getFluidOutput() },
+ 32,
+ 8,
+ 0);
+ }
+ }
+ } catch (Throwable e) {
+ if (GT_Values.D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_GC_Compat.java b/src/main/java/gregtech/api/util/GT_GC_Compat.java
new file mode 100644
index 0000000000..24710ab0ac
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_GC_Compat.java
@@ -0,0 +1,52 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.Mods.GalacticraftCore;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import micdoodle8.mods.galacticraft.api.power.EnergySource;
+import micdoodle8.mods.galacticraft.api.power.EnergySource.EnergySourceAdjacent;
+import micdoodle8.mods.galacticraft.api.power.IEnergyHandlerGC;
+import micdoodle8.mods.galacticraft.api.transmission.NetworkType;
+import micdoodle8.mods.galacticraft.api.transmission.tile.IConnector;
+import micdoodle8.mods.galacticraft.core.energy.EnergyConfigHandler;
+
+public class GT_GC_Compat {
+
+ public static long insertEnergyInto(TileEntity tTileEntity, long aVoltage, ForgeDirection tDirection) {
+ // GC Compat
+ if (GalacticraftCore.isModLoaded() && tTileEntity instanceof IEnergyHandlerGC) {
+ if (!(tTileEntity instanceof IConnector)
+ || ((IConnector) tTileEntity).canConnect(tDirection, NetworkType.POWER)) {
+ EnergySource eSource = new EnergySourceAdjacent(tDirection);
+
+ float tSizeToReceive = aVoltage * EnergyConfigHandler.IC2_RATIO,
+ tStored = ((IEnergyHandlerGC) tTileEntity).getEnergyStoredGC(eSource);
+ if (tSizeToReceive >= tStored
+ || tSizeToReceive <= ((IEnergyHandlerGC) tTileEntity).getMaxEnergyStoredGC(eSource) - tStored) {
+ float tReceived = ((IEnergyHandlerGC) tTileEntity).receiveEnergyGC(eSource, tSizeToReceive, false);
+ if (tReceived > 0) {
+ tSizeToReceive -= tReceived;
+ while (tSizeToReceive > 0) {
+ tReceived = ((IEnergyHandlerGC) tTileEntity)
+ .receiveEnergyGC(eSource, tSizeToReceive, false);
+ if (tReceived < 1) break;
+ tSizeToReceive -= tReceived;
+ }
+ return 1;
+ }
+ }
+ }
+ return 0;
+ }
+ return 2;
+ }
+
+ public static boolean canConnect(TileEntity tTileEntity, ForgeDirection tDirection) {
+ // GC Compat
+ return GalacticraftCore.isModLoaded() && tTileEntity instanceof IEnergyHandlerGC
+ && (!(tTileEntity instanceof IConnector)
+ || ((IConnector) tTileEntity).canConnect(tDirection, NetworkType.POWER));
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_HatchElementBuilder.java b/src/main/java/gregtech/api/util/GT_HatchElementBuilder.java
new file mode 100644
index 0000000000..2087ad755c
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_HatchElementBuilder.java
@@ -0,0 +1,524 @@
+package gregtech.api.util;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.function.BiPredicate;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment;
+import com.gtnewhorizon.structurelib.structure.IItemSource;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.IStructureElementChain;
+import com.gtnewhorizon.structurelib.structure.IStructureElementNoPlacement;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+import com.gtnewhorizon.structurelib.util.ItemStackPredicate;
+
+import gnu.trove.TIntCollection;
+import gnu.trove.list.array.TIntArrayList;
+import gnu.trove.set.hash.TIntHashSet;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.common.blocks.GT_Item_Machines;
+
+public class GT_HatchElementBuilder<T> {
+
+ private interface Builtin {
+ }
+
+ private IGT_HatchAdder<? super T> mAdder;
+ private int mCasingIndex = -1;
+ private int mDot = -1;
+ private BiPredicate<? super T, ? super IGregTechTileEntity> mShouldSkip;
+ private BiFunction<? super T, ItemStack, ? extends Predicate<ItemStack>> mHatchItemFilter;
+ private Supplier<String> mHatchItemType;
+ private Predicate<? super T> mReject;
+ private boolean mCacheHint;
+ private boolean mNoStop;
+ private EnumSet<ForgeDirection> mDisallowedDirection = EnumSet.noneOf(ForgeDirection.class);
+
+ private GT_HatchElementBuilder() {}
+
+ public static <T> GT_HatchElementBuilder<T> builder() {
+ return new GT_HatchElementBuilder<>();
+ }
+
+ // region composite
+
+ /**
+ * Set all of adder, hint and hatchItemFilter. Provide a reasonable default for shouldSkip. TODO add doc
+ */
+ @SafeVarargs
+ public final GT_HatchElementBuilder<T> anyOf(IHatchElement<? super T>... elements) {
+ if (elements == null || elements.length == 0) throw new IllegalArgumentException();
+ return adder(
+ Arrays.stream(elements)
+ .map(
+ e -> e.adder()
+ .rebrand())
+ .reduce(IGT_HatchAdder::orElse)
+ .get()).hatchClasses(
+ Arrays.stream(elements)
+ .map(IHatchElement::mteClasses)
+ .flatMap(Collection::stream)
+ .collect(Collectors.toList()))
+ .cacheHint(
+ () -> Arrays.stream(elements)
+ .map(IHatchElement::name)
+ .sorted()
+ .collect(Collectors.joining(" or ", "of type ", "")));
+ }
+
+ /**
+ * Set all of adder, hint and hatchItemFilter. Provide a reasonable default for shouldSkip.
+ * <p>
+ * Will rotate through all elements TODO add doc
+ */
+ @SafeVarargs
+ public final GT_HatchElementBuilder<T> atLeast(IHatchElement<? super T>... elements) {
+ if (elements == null || elements.length == 0) throw new IllegalArgumentException();
+ return atLeast(
+ Arrays.stream(elements)
+ .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting())));
+ }
+
+ /**
+ * Set all of adder, hint and hatchItemFilter. Provide a reasonable default for shouldSkip.
+ * <p>
+ * Will rotate through all elements TODO add doc
+ */
+ public final GT_HatchElementBuilder<T> atLeastList(List<IHatchElement<? super T>> elements) {
+ if (elements == null || elements.isEmpty()) throw new IllegalArgumentException();
+ return atLeast(
+ elements.stream()
+ .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting())));
+ }
+
+ /**
+ * Set all of adder, hint and hatchItemFilter. Provide a reasonable default for shouldSkip. TODO add doc
+ */
+ public final GT_HatchElementBuilder<T> atLeast(Map<IHatchElement<? super T>, ? extends Number> elements) {
+ if (elements == null || elements.isEmpty() || elements.containsKey(null) || elements.containsValue(null))
+ throw new IllegalArgumentException();
+ List<Class<? extends IMetaTileEntity>> list = elements.keySet()
+ .stream()
+ .map(IHatchElement::mteClasses)
+ .flatMap(Collection::stream)
+ .collect(Collectors.toList());
+ // map cannot be null or empty, so assert Optional isPresent
+ return adder(
+ elements.keySet()
+ .stream()
+ .map(
+ e -> e.adder()
+ .rebrand())
+ .reduce(IGT_HatchAdder::orElse)
+ .orElseThrow(AssertionError::new))
+ .hatchItemFilter(
+ obj -> GT_StructureUtility.filterByMTEClass(
+ elements.entrySet()
+ .stream()
+ .filter(
+ entry -> entry.getKey()
+ .count(obj)
+ < entry.getValue()
+ .longValue())
+ .flatMap(
+ entry -> entry.getKey()
+ .mteClasses()
+ .stream())
+ .collect(Collectors.toList())))
+ .shouldReject(
+ obj -> elements.entrySet()
+ .stream()
+ .allMatch(
+ e -> e.getKey()
+ .count(obj)
+ >= e.getValue()
+ .longValue()))
+ .shouldSkip(
+ (BiPredicate<? super T, ? super IGregTechTileEntity> & Builtin) (c,
+ t) -> t != null && list.stream()
+ .anyMatch(clazz -> clazz.isInstance(t.getMetaTileEntity())))
+ .cacheHint(
+ () -> elements.keySet()
+ .stream()
+ .map(IHatchElement::name)
+ .sorted()
+ .collect(Collectors.joining(" or ", "of type ", "")));
+ }
+ // endregion
+
+ // region primitives
+
+ public GT_HatchElementBuilder<T> adder(IGT_HatchAdder<? super T> aAdder) {
+ if (aAdder == null) throw new IllegalArgumentException();
+ mAdder = aAdder;
+ return this;
+ }
+
+ public GT_HatchElementBuilder<T> casingIndex(int aCasingIndex) {
+ if (aCasingIndex <= 0) throw new IllegalArgumentException();
+ mCasingIndex = aCasingIndex;
+ return this;
+ }
+
+ public GT_HatchElementBuilder<T> dot(int aDot) {
+ if (aDot <= 0) throw new IllegalArgumentException();
+ mDot = aDot;
+ return this;
+ }
+
+ public GT_HatchElementBuilder<T> shouldSkip(BiPredicate<? super T, ? super IGregTechTileEntity> aShouldSkip) {
+ if (!(aShouldSkip instanceof Builtin) || mShouldSkip != null) {
+ if (!(mShouldSkip instanceof Builtin) && mShouldSkip != null) throw new IllegalStateException();
+ if (aShouldSkip == null) throw new IllegalArgumentException();
+ }
+ mShouldSkip = aShouldSkip;
+ return this;
+ }
+
+ public GT_HatchElementBuilder<T> shouldReject(Predicate<? super T> aShouldReject) {
+ if (aShouldReject == null) throw new IllegalArgumentException();
+ mReject = aShouldReject;
+ return this;
+ }
+
+ public GT_HatchElementBuilder<T> hatchItemFilter(
+ Function<? super T, ? extends Predicate<ItemStack>> aHatchItemFilter) {
+ if (aHatchItemFilter == null) throw new IllegalArgumentException();
+ mHatchItemFilter = (t, s) -> aHatchItemFilter.apply(t);
+ return this;
+ }
+
+ public GT_HatchElementBuilder<T> hatchItemFilterAnd(
+ Function<? super T, ? extends Predicate<ItemStack>> aHatchItemFilter) {
+ if (aHatchItemFilter == null) throw new IllegalArgumentException();
+ BiFunction<? super T, ItemStack, ? extends Predicate<ItemStack>> tOldFilter = mHatchItemFilter;
+ mHatchItemFilter = (t, s) -> tOldFilter.apply(t, s)
+ .and(aHatchItemFilter.apply(t));
+ return this;
+ }
+
+ public GT_HatchElementBuilder<T> hatchItemFilter(
+ BiFunction<? super T, ItemStack, ? extends Predicate<ItemStack>> aHatchItemFilter) {
+ if (aHatchItemFilter == null) throw new IllegalArgumentException();
+ mHatchItemFilter = aHatchItemFilter;
+ return this;
+ }
+
+ public GT_HatchElementBuilder<T> hatchItemFilterAnd(
+ BiFunction<? super T, ItemStack, ? extends Predicate<ItemStack>> aHatchItemFilter) {
+ if (aHatchItemFilter == null) throw new IllegalArgumentException();
+ BiFunction<? super T, ItemStack, ? extends Predicate<ItemStack>> tOldFilter = mHatchItemFilter;
+ mHatchItemFilter = (t, s) -> tOldFilter.apply(t, s)
+ .and(aHatchItemFilter.apply(t, s));
+ return this;
+ }
+
+ // region hint
+ public GT_HatchElementBuilder<T> hint(Supplier<String> aSupplier) {
+ if (aSupplier == null) throw new IllegalArgumentException();
+ mHatchItemType = aSupplier;
+ mCacheHint = false;
+ return this;
+ }
+
+ public GT_HatchElementBuilder<T> cacheHint(Supplier<String> aSupplier) {
+ if (aSupplier == null) throw new IllegalArgumentException();
+ mHatchItemType = aSupplier;
+ mCacheHint = true;
+ return this;
+ }
+
+ public GT_HatchElementBuilder<T> cacheHint() {
+ if (mHatchItemType == null) throw new IllegalStateException();
+ mCacheHint = true;
+ return this;
+ }
+ // endregion
+
+ public GT_HatchElementBuilder<T> continueIfSuccess() {
+ mNoStop = true;
+ return this;
+ }
+
+ public GT_HatchElementBuilder<T> stopIfSuccess() {
+ mNoStop = false;
+ return this;
+ }
+
+ /**
+ * Help automatic hatch side determination code by ruling out some directions. Note the automatic hatch side
+ * determination code will choose to use the default facing if the final allowed facing set is empty.
+ * <p>
+ * This will clear the sides set by previous call to this or {@link #allowOnly(ForgeDirection...)}
+ * <p>
+ * Usually mandatory for multis with multiple slices, and otherwise not needed if it contains a single slice only.
+ *
+ * @param facings disallowed direction in ABC coordinate system
+ */
+ public GT_HatchElementBuilder<T> disallowOnly(ForgeDirection... facings) {
+ if (facings == null) throw new IllegalArgumentException();
+ mDisallowedDirection = EnumSet.copyOf(Arrays.asList(facings));
+ return this;
+ }
+
+ /**
+ * Help automatic hatch side determination code by allowing only some directions. Note the automatic hatch side
+ * determination code will choose to use the default facing if the final allowed facing set is empty.
+ * <p>
+ * This will clear the sides set by previous call to this or {@link #disallowOnly(ForgeDirection...)}
+ * <p>
+ * Usually mandatory for multis with multiple slices, and otherwise not needed if it contains a single slice only.
+ *
+ * @param facings allowed direction in ABC coordinate system
+ */
+ public GT_HatchElementBuilder<T> allowOnly(ForgeDirection... facings) {
+ if (facings == null) throw new IllegalArgumentException();
+ mDisallowedDirection = EnumSet.complementOf(EnumSet.copyOf(Arrays.asList(facings)));
+ mDisallowedDirection.remove(ForgeDirection.UNKNOWN);
+ return this;
+ }
+ // endregion
+
+ // region intermediate
+ public GT_HatchElementBuilder<T> hatchClass(Class<? extends IMetaTileEntity> clazz) {
+ return hatchItemFilter(c -> is -> clazz.isInstance(GT_Item_Machines.getMetaTileEntity(is)))
+ .cacheHint(() -> "of class " + clazz.getSimpleName())
+ .shouldSkip(
+ (BiPredicate<? super T, ? super IGregTechTileEntity> & Builtin) (c, t) -> clazz
+ .isInstance(t.getMetaTileEntity()));
+ }
+
+ @SafeVarargs
+ public final GT_HatchElementBuilder<T> hatchClasses(Class<? extends IMetaTileEntity>... classes) {
+ return hatchClasses(Arrays.asList(classes));
+ }
+
+ public final GT_HatchElementBuilder<T> hatchClasses(List<? extends Class<? extends IMetaTileEntity>> classes) {
+ List<? extends Class<? extends IMetaTileEntity>> list = new ArrayList<>(classes);
+ return hatchItemFilter(obj -> GT_StructureUtility.filterByMTEClass(list)).cacheHint(
+ () -> list.stream()
+ .map(Class::getSimpleName)
+ .sorted()
+ .collect(Collectors.joining(" or ", "of class ", "")))
+ .shouldSkip(
+ (BiPredicate<? super T, ? super IGregTechTileEntity> & Builtin) (c, t) -> t != null && list.stream()
+ .anyMatch(clazz -> clazz.isInstance(t.getMetaTileEntity())));
+ }
+
+ public GT_HatchElementBuilder<T> hatchId(int aId) {
+ return hatchItemFilter(
+ c -> is -> GT_Utility.isStackValid(is) && is.getItem() instanceof GT_Item_Machines
+ && is.getItemDamage() == aId).cacheHint(() -> "of id " + aId)
+ .shouldSkip(
+ (BiPredicate<? super T, ? super IGregTechTileEntity> & Builtin) (c, t) -> t != null
+ && t.getMetaTileID() == aId);
+ }
+
+ public GT_HatchElementBuilder<T> hatchIds(int... aIds) {
+ if (aIds == null || aIds.length == 0) throw new IllegalArgumentException();
+ if (aIds.length == 1) return hatchId(aIds[0]);
+ TIntCollection coll = aIds.length < 16 ? new TIntArrayList(aIds) : new TIntHashSet(aIds);
+ return hatchItemFilter(
+ c -> is -> GT_Utility.isStackValid(is) && is.getItem() instanceof GT_Item_Machines
+ && coll.contains(is.getItemDamage())).cacheHint(
+ () -> Arrays.stream(coll.toArray())
+ .sorted()
+ .mapToObj(String::valueOf)
+ .collect(Collectors.joining(" or ", "of id ", "")))
+ .shouldSkip(
+ (BiPredicate<? super T, ? super IGregTechTileEntity> & Builtin) (c, t) -> t != null
+ && coll.contains(t.getMetaTileID()));
+ }
+
+ // endregion
+
+ @SuppressWarnings("unchecked")
+ @SafeVarargs
+ public final IStructureElementChain<T> buildAndChain(IStructureElement<T>... elements) {
+ List<IStructureElement<T>> l = new ArrayList<>();
+ l.add(build());
+ l.addAll(Arrays.asList(elements));
+ IStructureElement<T>[] array = l.toArray(new IStructureElement[0]);
+ return () -> array;
+ }
+
+ public final IStructureElementChain<T> buildAndChain(Block block, int meta) {
+ return buildAndChain(ofBlock(block, meta));
+ }
+
+ public IStructureElement<T> build() {
+ if (mAdder == null || mCasingIndex == -1 || mDot == -1) {
+ throw new IllegalArgumentException();
+ }
+ if (mHatchItemFilter == null) {
+ // no item filter -> no placement
+ return new IStructureElementNoPlacement<>() {
+
+ @Override
+ public boolean check(T t, World world, int x, int y, int z) {
+ TileEntity tileEntity = world.getTileEntity(x, y, z);
+ return tileEntity instanceof IGregTechTileEntity
+ && mAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) mCasingIndex);
+ }
+
+ @Override
+ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
+ StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), mDot - 1);
+ return true;
+ }
+ };
+ }
+ return new IStructureElement<>() {
+
+ private String mHint = mHatchItemType == null ? "unspecified GT hatch" : mHatchItemType.get();
+
+ @Override
+ public boolean check(T t, World world, int x, int y, int z) {
+ TileEntity tileEntity = world.getTileEntity(x, y, z);
+ return tileEntity instanceof IGregTechTileEntity
+ && mAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) mCasingIndex);
+ }
+
+ @Override
+ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
+ StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), mDot - 1);
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(T t, World world, int i, int i1, int i2, ItemStack itemStack) {
+ // TODO
+ return false;
+ }
+
+ private String getHint() {
+ if (mHint != null) return mHint;
+ String tHint = mHatchItemType.get();
+ if (tHint == null) return "?";
+ // TODO move this to some .lang instead of half ass it into the crappy gt lang file
+ tHint = GT_LanguageManager.addStringLocalization("Hatch_Type_" + tHint.replace(' ', '_'), tHint);
+ if (mCacheHint) {
+ mHint = tHint;
+ if (mHint != null)
+ // yeet the getter, since its product is retrieved and cached
+ mHatchItemType = null;
+ }
+ return tHint;
+ }
+
+ @Override
+ public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ return BlocksToPlace.create(mHatchItemFilter.apply(t, trigger));
+ }
+
+ @Deprecated
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ IItemSource s, EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
+ return survivalPlaceBlock(
+ t,
+ world,
+ x,
+ y,
+ z,
+ trigger,
+ AutoPlaceEnvironment.fromLegacy(s, actor, chatter));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ if (mShouldSkip != null) {
+ TileEntity tileEntity = world.getTileEntity(x, y, z);
+ if (tileEntity instanceof IGregTechTileEntity
+ && mShouldSkip.test(t, (IGregTechTileEntity) tileEntity)) return PlaceResult.SKIP;
+ }
+ if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, env.getActor()))
+ return PlaceResult.REJECT;
+ if (mReject != null && mReject.test(t)) return PlaceResult.REJECT;
+ ItemStack taken = env.getSource()
+ .takeOne(mHatchItemFilter.apply(t, trigger), true);
+ if (GT_Utility.isStackInvalid(taken)) {
+ String type = getHint();
+ env.getChatter()
+ .accept(new ChatComponentTranslation("GT5U.autoplace.error.no_hatch", type));
+ return PlaceResult.REJECT;
+ }
+ if (StructureUtility.survivalPlaceBlock(
+ taken,
+ ItemStackPredicate.NBTMode.IGNORE,
+ null,
+ true,
+ world,
+ x,
+ y,
+ z,
+ env.getSource(),
+ env.getActor()) != PlaceResult.ACCEPT) {
+ return PlaceResult.REJECT;
+ }
+ // try to infer facing
+ EnumSet<ForgeDirection> allowed = EnumSet.noneOf(ForgeDirection.class);
+ // first find which face of block is not contained in structure
+ if (env.getAPILevel() == AutoPlaceEnvironment.APILevel.Legacy) {
+ // a legacy decorator isn't passing down necessary information
+ // in that case, we just assume all facing is allowed
+ allowed.addAll(Arrays.asList(ForgeDirection.VALID_DIRECTIONS));
+ } else {
+ for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
+ // as noted on getWorldDirection Y axis should be flipped before use
+ if (env.isContainedInPiece(direction.offsetX, -direction.offsetY, direction.offsetZ)) continue;
+ // explicitly rejected, probably obstructed by another slice
+ if (mDisallowedDirection.contains(direction)) continue;
+ ForgeDirection rotated = env.getFacing()
+ .getWorldDirection(
+ (direction.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) != 0
+ ? direction.getOpposite()
+ : direction);
+ allowed.add(rotated);
+ }
+ }
+ if (!allowed.isEmpty()) {
+ TileEntity tileEntity = world.getTileEntity(x, y, z);
+ if (tileEntity instanceof IGregTechTileEntity) {
+ ForgeDirection result = null;
+ // find the first facing available, but prefer a facing that isn't up/down
+ for (ForgeDirection facing : allowed) {
+ result = facing;
+ if ((facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) break; // Horizontal
+ }
+ assert result != null;
+ ((IGregTechTileEntity) tileEntity).setFrontFacing(result);
+ }
+ }
+ return mNoStop ? PlaceResult.ACCEPT : PlaceResult.ACCEPT_STOP;
+ }
+ };
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_IBoxableWrapper.java b/src/main/java/gregtech/api/util/GT_IBoxableWrapper.java
new file mode 100644
index 0000000000..796699c261
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_IBoxableWrapper.java
@@ -0,0 +1,13 @@
+package gregtech.api.util;
+
+import net.minecraft.item.ItemStack;
+
+import ic2.api.item.IBoxable;
+
+public class GT_IBoxableWrapper implements IBoxable {
+
+ @Override
+ public boolean canBeStoredInToolbox(ItemStack itemstack) {
+ return GT_Utility.isStackInList(itemstack, GT_ModHandler.sBoxableItems);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_ItsNotMyFaultException.java b/src/main/java/gregtech/api/util/GT_ItsNotMyFaultException.java
new file mode 100644
index 0000000000..f47a356d7b
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_ItsNotMyFaultException.java
@@ -0,0 +1,18 @@
+package gregtech.api.util;
+
+public class GT_ItsNotMyFaultException extends RuntimeException {
+
+ private static final long serialVersionUID = -8752778866486460495L;
+
+ private final String mError;
+
+ public GT_ItsNotMyFaultException(String aError) {
+ mError = aError;
+ }
+
+ @Override
+ public String toString() {
+ return "The GregTech-Addon has a Problem.\nIT'S NOT MY FAULT!!! Below is how to fix it.\n" + mError
+ + "\nDO NOT COME TO ME WITH THIS CRASH. YOU CAUSED IT YOURSELF, AND I TOLD YOU HOW TO FIX IT!!!";
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_JubilanceMegaApiary.java b/src/main/java/gregtech/api/util/GT_JubilanceMegaApiary.java
new file mode 100644
index 0000000000..f20a58c34a
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_JubilanceMegaApiary.java
@@ -0,0 +1,23 @@
+package gregtech.api.util;
+
+import forestry.api.apiculture.IAlleleBeeSpecies;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeHousing;
+import forestry.api.apiculture.IJubilanceProvider;
+
+public class GT_JubilanceMegaApiary implements IJubilanceProvider {
+
+ public static final GT_JubilanceMegaApiary instance = new GT_JubilanceMegaApiary();
+
+ protected GT_JubilanceMegaApiary() {}
+
+ @Override
+ public boolean isJubilant(IAlleleBeeSpecies species, IBeeGenome genome, IBeeHousing housing) {
+ return false;
+ }
+
+ @Override
+ public String getDescription() {
+ return "Will only be produced in mega Apiary";
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_LanguageManager.java b/src/main/java/gregtech/api/util/GT_LanguageManager.java
new file mode 100644
index 0000000000..b1bd45476a
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_LanguageManager.java
@@ -0,0 +1,600 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.E;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.common.config.Property;
+
+import cpw.mods.fml.common.registry.LanguageRegistry;
+import cpw.mods.fml.relauncher.ReflectionHelper;
+import gregtech.api.GregTech_API;
+
+public class GT_LanguageManager {
+
+ /**
+ * Buffer to reduce memory allocation when injecting data to LanguageRegistry.
+ */
+ private static final HashMap<String, String> TEMPMAP = new HashMap<>();
+ /**
+ * Buffer used when something is trying to add new lang entry while config file is not set up yet.
+ */
+ public static final Map<String, String> BUFFERMAP = new HashMap<>();
+ /**
+ * Map containing all the translation data coming into this class.
+ */
+ private static final Map<String, String> LANGMAP = new HashMap<>();
+ /**
+ * Config file handler bound to GregTech.lang or GregTech_(locale_name).lang. Even though it says English file,
+ * it's not necessarily English, but on system it's always treated as English (as in, "default" language.)
+ */
+ public static Configuration sEnglishFile;
+ /**
+ * If the game is running with en_US language. This does not get updated when user changes language in game;
+ * GT lang system cannot handle that anyway.
+ */
+ public static boolean isEN_US;
+ /**
+ * If placeholder like %material should be used for writing lang entries to file.
+ */
+ public static boolean i18nPlaceholder = true;
+ /**
+ * If there's any lang entry that is not found on lang file and waiting to be written.
+ */
+ private static boolean hasUnsavedEntry = false;
+
+ // TODO: convert to enum
+ public static String FACE_ANY = "gt.lang.face.any", FACE_BOTTOM = "gt.lang.face.bottom",
+ FACE_TOP = "gt.lang.face.top", FACE_LEFT = "gt.lang.face.left", FACE_FRONT = "gt.lang.face.front",
+ FACE_RIGHT = "gt.lang.face.right", FACE_BACK = "gt.lang.face.back", FACE_NONE = "gt.lang.face.none";
+
+ public static String[] FACES = { FACE_BOTTOM, FACE_TOP, FACE_LEFT, FACE_FRONT, FACE_RIGHT, FACE_BACK, FACE_NONE };
+
+ /**
+ * Map referencing private field of StringTranslate, used by StatCollector. Used to inject lang entries there.
+ */
+ private static final Map<String, String> stringTranslateLanguageList;
+
+ static {
+ try {
+ Field fieldStringTranslateLanguageList = ReflectionHelper
+ .findField(net.minecraft.util.StringTranslate.class, "languageList", "field_74816_c");
+ Field fieldStringTranslateInstance = ReflectionHelper
+ .findField(net.minecraft.util.StringTranslate.class, "instance", "field_74817_a");
+ // noinspection unchecked
+ stringTranslateLanguageList = (Map<String, String>) fieldStringTranslateLanguageList
+ .get(fieldStringTranslateInstance.get(null));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * @deprecated Parameter aWriteIntoLangFile is no longer used,
+ * use {@link #addStringLocalization(String, String)} or consider migrating to MC lang system instead.
+ */
+ @Deprecated
+ public static synchronized String addStringLocalization(String aKey, String aEnglish, boolean aWriteIntoLangFile) {
+ return addStringLocalization(aKey, aEnglish);
+ }
+
+ /**
+ * If you newly use this method, please consider using MC lang system instead.
+ */
+ public static synchronized String addStringLocalization(String aKey, String aEnglish) {
+ String trimmedKey = aKey != null ? aKey.trim() : "";
+ if (trimmedKey.isEmpty()) return E; // RIP cascading class loading, don't use GT_Utility here
+ if (sEnglishFile == null) {
+ // Lang file is not set up yet
+ BUFFERMAP.put(trimmedKey, aEnglish);
+ return aEnglish;
+ }
+ if (!BUFFERMAP.isEmpty()) {
+ // Lang file is now set up, resolve all the buffers
+ // This won't be visited twice
+ for (Entry<String, String> tEntry : BUFFERMAP.entrySet()) {
+ storeTranslation(tEntry.getKey(), tEntry.getValue());
+ }
+ BUFFERMAP.clear();
+ }
+
+ if (!LANGMAP.containsKey(trimmedKey)) {
+ return storeTranslation(trimmedKey, aEnglish);
+ }
+ return LANGMAP.get(trimmedKey);
+ }
+
+ private static synchronized String storeTranslation(String trimmedKey, String english) {
+ String translation = writeToLangFile(trimmedKey, english);
+ LANGMAP.put(trimmedKey, translation);
+ addToMCLangList(trimmedKey, translation);
+ TEMPMAP.put(trimmedKey, translation);
+ LanguageRegistry.instance()
+ // If we use the actual user configured locale here, switching lang to others while running game
+ // turns everything into unlocalized string. So we make it "default" and call it a day.
+ .injectLanguage("en_US", TEMPMAP);
+ TEMPMAP.clear();
+ return translation;
+ }
+
+ private static synchronized String writeToLangFile(String trimmedKey, String aEnglish) {
+ Property tProperty = sEnglishFile.get("LanguageFile", trimmedKey, aEnglish);
+ if (hasUnsavedEntry && GregTech_API.sPostloadFinished) {
+ sEnglishFile.save();
+ hasUnsavedEntry = false;
+ }
+ String translation = tProperty.getString();
+ if (tProperty.wasRead()) {
+ if (isEN_US && !aEnglish.equals(translation)) {
+ tProperty.set(aEnglish);
+ markFileDirty();
+ return aEnglish;
+ }
+ } else {
+ markFileDirty();
+ }
+ return translation;
+ }
+
+ private static synchronized void markFileDirty() {
+ if (GregTech_API.sPostloadFinished) {
+ sEnglishFile.save();
+ } else {
+ hasUnsavedEntry = true;
+ }
+ }
+
+ public static String getTranslation(String aKey) {
+ String tTrimmedKey = aKey != null ? aKey.trim() : "";
+ if (tTrimmedKey.isEmpty()) return E;
+
+ if (StatCollector.canTranslate(tTrimmedKey)) {
+ return StatCollector.translateToLocal(tTrimmedKey);
+ }
+ String anotherKeyToTry;
+ if (tTrimmedKey.endsWith(".name")) {
+ anotherKeyToTry = tTrimmedKey.substring(0, tTrimmedKey.length() - 5);
+ } else {
+ anotherKeyToTry = tTrimmedKey + ".name";
+ }
+ if (StatCollector.canTranslate(anotherKeyToTry)) {
+ return StatCollector.translateToLocal(anotherKeyToTry);
+ }
+ return tTrimmedKey;
+ }
+
+ public static String getTranslation(String aKey, String aSeperator) {
+ if (aKey == null) return E;
+ String rTranslation = E;
+ StringBuilder rTranslationSB = new StringBuilder(rTranslation);
+ for (String tString : aKey.split(aSeperator)) {
+ rTranslationSB.append(getTranslation(tString));
+ }
+ rTranslation = String.valueOf(rTranslationSB);
+ return rTranslation;
+ }
+
+ @SuppressWarnings("unused")
+ public static String getTranslateableItemStackName(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return "null";
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT != null && tNBT.hasKey("display")) {
+ String tName = tNBT.getCompoundTag("display")
+ .getString("Name");
+ if (GT_Utility.isStringValid(tName)) {
+ return tName;
+ }
+ }
+ return aStack.getUnlocalizedName() + ".name";
+ }
+
+ public static void writePlaceholderStrings() {
+ addStringLocalization("Interaction_DESCRIPTION_Index_001", "Puts out into adjacent Slot #");
+ addStringLocalization("Interaction_DESCRIPTION_Index_002", "Grabs in for own Slot #");
+ addStringLocalization("Interaction_DESCRIPTION_Index_003", "Enable with Signal");
+ addStringLocalization("Interaction_DESCRIPTION_Index_004", "Disable with Signal");
+ addStringLocalization("Interaction_DESCRIPTION_Index_005", "Disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_006", "Export");
+ addStringLocalization("Interaction_DESCRIPTION_Index_007", "Import");
+ addStringLocalization("Interaction_DESCRIPTION_Index_008", "Export (conditional)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_009", "Import (conditional)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_010", "Export (invert cond)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_011", "Import (invert cond)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_012", "Export allow Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_013", "Import allow Output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_014", "Export allow Input (conditional)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_015", "Import allow Output (conditional)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_016", "Export allow Input (invert cond)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_017", "Import allow Output (invert cond)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_018", "Normal");
+ addStringLocalization("Interaction_DESCRIPTION_Index_019", "Inverted");
+ addStringLocalization("Interaction_DESCRIPTION_Index_020", "Ready to work");
+ addStringLocalization("Interaction_DESCRIPTION_Index_021", "Not ready to work");
+ addStringLocalization("Interaction_DESCRIPTION_Index_022", "Import");
+ addStringLocalization("Interaction_DESCRIPTION_Index_023", "Import (conditional)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_024", "Import (invert cond)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_025", "Keep Liquids Away");
+ addStringLocalization("Interaction_DESCRIPTION_Index_026", "Keep Liquids Away (conditional)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_027", "Keep Liquids Away (invert cond)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_031", "Normal Universal Storage");
+ addStringLocalization("Interaction_DESCRIPTION_Index_032", "Inverted Universal Storage");
+ addStringLocalization("Interaction_DESCRIPTION_Index_033", "Normal Electricity Storage");
+ addStringLocalization("Interaction_DESCRIPTION_Index_034", "Inverted Electricity Storage");
+ addStringLocalization("Interaction_DESCRIPTION_Index_035", "Normal Steam Storage");
+ addStringLocalization("Interaction_DESCRIPTION_Index_036", "Inverted Steam Storage");
+ addStringLocalization("Interaction_DESCRIPTION_Index_037", "Normal Average Electric Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_038", "Inverted Average Electric Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_039", "Normal Average Electric Output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_040", "Inverted Average Electric Output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_041", "Normal Electricity Storage(Including Batteries)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_042", "Inverted Electricity Storage(Including Batteries)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_043", "Filter input, Deny output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_044", "Invert input, Deny output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_045", "Filter input, Permit any output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_046", "Invert input, Permit any output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_047", "Filter Fluid: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_048", "Pump speed: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_049", "L/tick ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_050", "L/sec");
+ addStringLocalization("Interaction_DESCRIPTION_Index_053", "Slot: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_054", "Inverted");
+ addStringLocalization("Interaction_DESCRIPTION_Index_055", "Normal");
+ addStringLocalization("Interaction_DESCRIPTION_Index_056", "Emit if 1 Maintenance Needed");
+ addStringLocalization("Interaction_DESCRIPTION_Index_057", "Emit if 1 Maintenance Needed(inverted)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_058", "Emit if 2 Maintenance Needed");
+ addStringLocalization("Interaction_DESCRIPTION_Index_059", "Emit if 2 Maintenance Needed(inverted)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_060", "Emit if 3 Maintenance Needed");
+ addStringLocalization("Interaction_DESCRIPTION_Index_061", "Emit if 3 Maintenance Needed(inverted)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_062", "Emit if 4 Maintenance Needed");
+ addStringLocalization("Interaction_DESCRIPTION_Index_063", "Emit if 4 Maintenance Needed(inverted)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_064", "Emit if 5 Maintenance Needed");
+ addStringLocalization("Interaction_DESCRIPTION_Index_065", "Emit if 5 Maintenance Needed(inverted)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_066", "Emit if rotor needs maintenance low accuracy mod");
+ addStringLocalization(
+ "Interaction_DESCRIPTION_Index_067",
+ "Emit if rotor needs maintenance low accuracy mod(inverted)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_068", "Emit if rotor needs maintenance high accuracy mod");
+ addStringLocalization("Interaction_DESCRIPTION_Index_068.1", "Emit if any Player is close");
+ addStringLocalization(
+ "Interaction_DESCRIPTION_Index_069",
+ "Emit if rotor needs maintenance high accuracy mod(inverted)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_069.1", "Emit if other Player is close");
+ addStringLocalization("Interaction_DESCRIPTION_Index_070", "Emit if you are close");
+ addStringLocalization("Interaction_DESCRIPTION_Index_071", "Conducts strongest Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_072", "Conducts from bottom Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_073", "Conducts from top Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_074", "Conducts from north Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_075", "Conducts from south Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_076", "Conducts from west Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_077", "Conducts from east Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_078", "Signal = ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_079", "Conditional Signal = ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_080", "Inverted Conditional Signal = ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_081", "Frequency: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_082", "Open if work enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_083", "Open if work disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_084", "Only Output allowed");
+ addStringLocalization("Interaction_DESCRIPTION_Index_085", "Only Input allowed");
+ addStringLocalization("Interaction_DESCRIPTION_Index_086", "Auto-Input: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_087", "Disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_088", "Enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_089", " Auto-Output: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_090", "Machine Processing: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_091", "Redstone Output at Side ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_092", " set to: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_093", "Strong");
+ addStringLocalization("Interaction_DESCRIPTION_Index_094", "Weak");
+ addStringLocalization("Interaction_DESCRIPTION_Index_094.1", "Not enough soldering material!");
+ addStringLocalization("Interaction_DESCRIPTION_Index_095", "Input from Output Side allowed");
+ addStringLocalization("Interaction_DESCRIPTION_Index_096", "Input from Output Side forbidden");
+ addStringLocalization("Interaction_DESCRIPTION_Index_098", "Do not regulate Item Stack Size");
+ addStringLocalization("Interaction_DESCRIPTION_Index_099", "Regulate Item Stack Size to: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_100", "This is ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_101", " Ore.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_102", "There is Lava behind this Rock.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_103", "There is a Liquid behind this Rock.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_104", "There is an Air Pocket behind this Rock.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_105", "Material is changing behind this Rock.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_106", "Found traces of ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_107", "No Ores found.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_108", "Outputs misc. Fluids, Steam and Items");
+ addStringLocalization("Interaction_DESCRIPTION_Index_109", "Outputs Steam and Items");
+ addStringLocalization("Interaction_DESCRIPTION_Index_110", "Outputs Steam and misc. Fluids");
+ addStringLocalization("Interaction_DESCRIPTION_Index_111", "Outputs Steam");
+ addStringLocalization("Interaction_DESCRIPTION_Index_112", "Outputs misc. Fluids and Items");
+ addStringLocalization("Interaction_DESCRIPTION_Index_113", "Outputs only Items");
+ addStringLocalization("Interaction_DESCRIPTION_Index_114", "Outputs only misc. Fluids");
+ addStringLocalization("Interaction_DESCRIPTION_Index_115", "Outputs nothing");
+ // 116 moved to lang files
+ // 117 obsolete
+ // 118 moved to lang files
+ // 119 obsolete
+ // 120 moved to lang files
+ // 121 obsolete
+ addStringLocalization("Interaction_DESCRIPTION_Index_122", "Emit Redstone if slots contain something");
+ addStringLocalization("Interaction_DESCRIPTION_Index_123", "Don't emit Redstone");
+ // 124 moved to lang files
+ addStringLocalization("Interaction_DESCRIPTION_Index_124.1", "Blacklist Mode");
+ // 125 obsolete
+ addStringLocalization("Interaction_DESCRIPTION_Index_125.1", "Whitelist Mode");
+ // 126 moved to lang files
+ // 127 obsolete
+ addStringLocalization("Interaction_DESCRIPTION_Index_128", "Redstone");
+ addStringLocalization("Interaction_DESCRIPTION_Index_128.1", "Redstone ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_129", "Energy");
+ addStringLocalization("Interaction_DESCRIPTION_Index_129.1", "Energy ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_130", "Fluids");
+ addStringLocalization("Interaction_DESCRIPTION_Index_130.1", "Fluids ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_131", "Items");
+ addStringLocalization("Interaction_DESCRIPTION_Index_131.1", "Items ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_132", "Pipe is loose.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_133", "Screws are loose.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_134", "Something is stuck.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_135", "Platings are dented.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_136", "Circuitry burned out.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_137", "That doesn't belong there.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_138", "Incomplete Structure.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_139", "Hit with Soft Mallet");
+ addStringLocalization("Interaction_DESCRIPTION_Index_140", "to (re-)start the Machine");
+ addStringLocalization("Interaction_DESCRIPTION_Index_141", "if it doesn't start.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_142", "Running perfectly.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_143", "Missing Mining Pipe");
+ addStringLocalization("Interaction_DESCRIPTION_Index_144", "Missing Turbine Rotor");
+ addStringLocalization("Interaction_DESCRIPTION_Index_145", "Step Down, In: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_146", "Step Up, In: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_147", "A, Out: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_148", "V ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_149", "A");
+ addStringLocalization("Interaction_DESCRIPTION_Index_150", "Chance: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_151", "Does not get consumed in the process");
+ addStringLocalization("Interaction_DESCRIPTION_Index_151.1", "Outputs items and 1 specific Fluid");
+ addStringLocalization("Interaction_DESCRIPTION_Index_151.2", "Outputs 1 specific Fluid");
+ addStringLocalization("Interaction_DESCRIPTION_Index_151.4", "Successfully locked Fluid to %s");
+ addStringLocalization("Interaction_DESCRIPTION_Index_152", "Total: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_153", "Usage: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_154", "Voltage: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_155", "Amperage: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_156", "Voltage: unspecified");
+ addStringLocalization("Interaction_DESCRIPTION_Index_157", "Amperage: unspecified");
+ addStringLocalization("Interaction_DESCRIPTION_Index_158", "Time: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_159", "Needs Low Gravity");
+ addStringLocalization("Interaction_DESCRIPTION_Index_160", "Needs Cleanroom");
+ addStringLocalization("Interaction_DESCRIPTION_Index_160.1", "Needs Cleanroom & LowGrav");
+ addStringLocalization("Interaction_DESCRIPTION_Index_161", " secs");
+ addStringLocalization("Interaction_DESCRIPTION_Index_162", "Name: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_163", " MetaData: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_164", "Hardness: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_165", " Blast Resistance: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_166", "Is valid Beacon Pyramid Material");
+ addStringLocalization("Interaction_DESCRIPTION_Index_167", "Tank ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_168", "Heat: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_169", "HEM: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_170", " Base EU Output: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_171", "Facing: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_172", " / Chance: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_173", "You can remove this with a Wrench");
+ addStringLocalization("Interaction_DESCRIPTION_Index_174", "You can NOT remove this with a Wrench");
+ addStringLocalization("Interaction_DESCRIPTION_Index_175", "Conduction Loss: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_176", "Contained Energy: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_177", "Has Muffler Upgrade");
+ addStringLocalization("Interaction_DESCRIPTION_Index_178", "Progress/Load: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_179", "Max IN: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_181", "Max OUT: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_182", " EU at ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_183", " A");
+ addStringLocalization("Interaction_DESCRIPTION_Index_184", "Energy: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_186", "Owned by: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_187", "Type -- Crop-Name: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_188", " Growth: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_189", " Gain: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_190", " Resistance: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_191", "Plant -- Fertilizer: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_192", " Water: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_193", " Weed-Ex: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_194", " Scan-Level: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_195", "Environment -- Nutrients: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_196", " Humidity: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_197", " Air-Quality: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_198", "Attributes:");
+ addStringLocalization("Interaction_DESCRIPTION_Index_199", "Discovered by: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_200", "Sort mode: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_200.1", "Automatic Item Shuffling: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_201", "Nothing");
+ addStringLocalization("Interaction_DESCRIPTION_Index_202", "Pollution in Chunk: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_203", " gibbl");
+ addStringLocalization("Interaction_DESCRIPTION_Index_204", "No Pollution in Chunk! HAYO!");
+ addStringLocalization("Interaction_DESCRIPTION_Index_206", "Scan for Assembly Line");
+ addStringLocalization(
+ "Interaction_DESCRIPTION_Index_207",
+ "Pump speed: %dL every %d ticks, %.2f L/sec on average");
+ addStringLocalization("Interaction_DESCRIPTION_Index_208", " L");
+ addStringLocalization("Interaction_DESCRIPTION_Index_209", " ticks");
+ addStringLocalization("Interaction_DESCRIPTION_Index_209.1", " tick");
+ addStringLocalization("Interaction_DESCRIPTION_Index_210", "Average: %.2f L/sec");
+ addStringLocalization("Interaction_DESCRIPTION_Index_211", "Items per side: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_212", "Input enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_213", "Input disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_214", "Connected");
+ addStringLocalization("Interaction_DESCRIPTION_Index_215", "Disconnected");
+ addStringLocalization("Interaction_DESCRIPTION_Index_216", "Deprecated Recipe");
+ addStringLocalization("Interaction_DESCRIPTION_Index_219", "Extended Facing: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_220", "Single recipe locking disabled.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_221", "Item threshold");
+ addStringLocalization("Interaction_DESCRIPTION_Index_222", "Fluid threshold");
+ addStringLocalization("Interaction_DESCRIPTION_Index_222.1", "Energy threshold");
+ addStringLocalization(
+ "Interaction_DESCRIPTION_Index_223",
+ "Single recipe locking enabled. Will lock to next recipe.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_224", "Always On");
+ addStringLocalization("Interaction_DESCRIPTION_Index_225", "Active with Redstone Signal");
+ addStringLocalization("Interaction_DESCRIPTION_Index_226", "Inactive with Redstone Signal");
+ addStringLocalization("Interaction_DESCRIPTION_Index_227", "Allow Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_228", "Block Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_229", "Export/Import");
+ addStringLocalization("Interaction_DESCRIPTION_Index_230", "Conditional");
+ addStringLocalization("Interaction_DESCRIPTION_Index_231", "Enable Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_232", "Filter Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_233", "Filter Output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_234", "Block Output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_235", "Allow Output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_236", "Whitelist Fluid");
+ addStringLocalization("Interaction_DESCRIPTION_Index_237", "Blacklist Fluid");
+ addStringLocalization("Interaction_DESCRIPTION_Index_238", "Filter Direction");
+ addStringLocalization("Interaction_DESCRIPTION_Index_239", "Filter Type");
+ addStringLocalization("Interaction_DESCRIPTION_Index_240", "Block Flow");
+ addStringLocalization("Interaction_DESCRIPTION_Index_241", "Recipe progress");
+ addStringLocalization("Interaction_DESCRIPTION_Index_242", "Machine idle");
+ addStringLocalization("Interaction_DESCRIPTION_Index_243", "Enable with Redstone");
+ addStringLocalization("Interaction_DESCRIPTION_Index_244", "Disable with Redstone");
+ addStringLocalization("Interaction_DESCRIPTION_Index_245", "Disable machine");
+ addStringLocalization("Interaction_DESCRIPTION_Index_246", "Frequency");
+ addStringLocalization("Interaction_DESCRIPTION_Index_247", "1 Issue");
+ addStringLocalization("Interaction_DESCRIPTION_Index_248", "2 Issues");
+ addStringLocalization("Interaction_DESCRIPTION_Index_249", "3 Issues");
+ addStringLocalization("Interaction_DESCRIPTION_Index_250", "4 Issues");
+ addStringLocalization("Interaction_DESCRIPTION_Index_251", "5 Issues");
+ addStringLocalization("Interaction_DESCRIPTION_Index_252", "Rotor < 80%");
+ addStringLocalization("Interaction_DESCRIPTION_Index_253", "Rotor < 100%");
+ addStringLocalization("Interaction_DESCRIPTION_Index_254", "Detect slot#");
+ addStringLocalization("Interaction_DESCRIPTION_Index_254.0", "Detect Slot");
+ addStringLocalization("Interaction_DESCRIPTION_Index_254.1", "Internal slot#");
+ addStringLocalization("Interaction_DESCRIPTION_Index_255", "Adjacent slot#");
+ addStringLocalization("Interaction_DESCRIPTION_Index_256", "Universal Storage");
+ addStringLocalization("Interaction_DESCRIPTION_Index_257", "Electricity Storage");
+ addStringLocalization("Interaction_DESCRIPTION_Index_258", "Steam Storage");
+ addStringLocalization("Interaction_DESCRIPTION_Index_259", "Average Electric Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_260", "Average Electric Output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_261", "Electricity Storage(Including Batteries)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_262", "Fluid Auto Output Disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_263", "Fluid Auto Output Enabled");
+ addStringLocalization(
+ "Interaction_DESCRIPTION_Index_264",
+ "currently none, will be locked to the next that is put in");
+ addStringLocalization("Interaction_DESCRIPTION_Index_265", "1 specific Fluid");
+ addStringLocalization("Interaction_DESCRIPTION_Index_266", "Lock Fluid Mode Disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_267", "Overflow Voiding Mode Disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_268", "Overflow Voiding Mode Enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_269", "Void Full Mode Disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_270", "Void Full Mode Enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_271", "unspecified");
+ addStringLocalization("Interaction_DESCRIPTION_Index_272", "Recipe by: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_273", "Original Recipe by: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_274", "Modified by: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_275", "Original voltage: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_299", "Item Filter: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_300", "Filter Cleared!");
+ addStringLocalization("Interaction_DESCRIPTION_Index_300.1", "Fluid Lock Cleared.");
+ addStringLocalization("Interaction_DESCRIPTION_Index_301", "Universal");
+ addStringLocalization("Interaction_DESCRIPTION_Index_302", "Int. EU");
+ addStringLocalization("Interaction_DESCRIPTION_Index_303", "Steam");
+ addStringLocalization("Interaction_DESCRIPTION_Index_304", "Avg. Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_305", "Avg. Output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_306", "EU stored");
+ addStringLocalization("Interaction_DESCRIPTION_Index_307", "Deny input, Filter output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_308", "Deny input, Invert output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_309", "Permit any input, Filter output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_310", "Permit any input, Invert output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_311", "Block Output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_312", "Allow Output");
+ addStringLocalization("Interaction_DESCRIPTION_Index_313", "Block Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_314", "Allow Input");
+ addStringLocalization("Interaction_DESCRIPTION_Index_315", "Filter Empty");
+ addStringLocalization("Interaction_DESCRIPTION_Index_316", "Pump speed limit reached!");
+ addStringLocalization("Interaction_DESCRIPTION_Index_317", "Filter: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_318", "Check Mode");
+ addStringLocalization("Interaction_DESCRIPTION_Index_319", "Any player");
+ addStringLocalization("Interaction_DESCRIPTION_Index_320", "Other players");
+ addStringLocalization("Interaction_DESCRIPTION_Index_321", "Only owner");
+ addStringLocalization("Interaction_DESCRIPTION_Index_322", "Overflow point: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_323", "L");
+ addStringLocalization("Interaction_DESCRIPTION_Index_324", "Now");
+ addStringLocalization("Interaction_DESCRIPTION_Index_325", "Max");
+ addStringLocalization("Interaction_DESCRIPTION_Index_326", "Public");
+ addStringLocalization("Interaction_DESCRIPTION_Index_327", "Private");
+ addStringLocalization("Interaction_DESCRIPTION_Index_328", "Channel");
+ addStringLocalization("Interaction_DESCRIPTION_Index_329", "Public/Private");
+ addStringLocalization("Interaction_DESCRIPTION_Index_330", "Sneak Rightclick to switch Mode");
+ addStringLocalization("Interaction_DESCRIPTION_Index_331", "AND Gate");
+ addStringLocalization("Interaction_DESCRIPTION_Index_332", "NAND Gate");
+ addStringLocalization("Interaction_DESCRIPTION_Index_333", "OR Gate");
+ addStringLocalization("Interaction_DESCRIPTION_Index_334", "NOR Gate");
+ addStringLocalization("Interaction_DESCRIPTION_Index_335", "Gate Mode");
+ addStringLocalization("Interaction_DESCRIPTION_Index_336", "PCB Factory Tier: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_337", "Upgrade Required: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_338", "Bio");
+ addStringLocalization("Interaction_DESCRIPTION_Index_339", "Biochamber Upgrade Enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_339.1", "Biochamber Upgrade Disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_340", "Rotated biochamber enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_340.1", "Rotated biochamber disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_341", "Tier 1 cooling enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_341.1", "Tier 1 cooling disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_342", "Tier 2 cooling enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_342.1", "Tier 2 cooling disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_343", "Use Machine Processing State");
+ addStringLocalization("Interaction_DESCRIPTION_Index_343.1", "Use Inverted Machine Processing State");
+ addStringLocalization("Interaction_DESCRIPTION_Index_344", "Input Blocking");
+ addStringLocalization("Interaction_DESCRIPTION_Index_344.1", "Output Blocking");
+ addStringLocalization("Interaction_DESCRIPTION_Index_500", "Fitting: Loose - More Flow");
+ addStringLocalization("Interaction_DESCRIPTION_Index_501", "Fitting: Tight - More Efficiency");
+ addStringLocalization("Interaction_DESCRIPTION_Index_502", "Mining chunk loading enabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_503", "Mining chunk loading disabled");
+ addStringLocalization("Interaction_DESCRIPTION_Index_505", "Enable with Signal (Safe)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_506", "Disable with Signal (Safe)");
+ addStringLocalization("Interaction_DESCRIPTION_Index_507", "Safe Mode");
+ addStringLocalization("Interaction_DESCRIPTION_Index_602", "Use Private Frequency");
+ addStringLocalization("Interaction_DESCRIPTION_Index_756", "Connectable: ");
+ addStringLocalization("Interaction_DESCRIPTION_Index_ALL", "All");
+ addStringLocalization("Interaction_DESCRIPTION_Index_ANY", "Any");
+ addStringLocalization("Interaction_DESCRIPTION_Index_INVERTED", "Inverted");
+ addStringLocalization("Interaction_DESCRIPTION_Index_NORMAL", "Normal");
+ addStringLocalization("Interaction_DESCRIPTION_Index_SIDE", "Side: ");
+
+ addStringLocalization("Item_DESCRIPTION_Index_000", "Stored Heat: %s");
+ addStringLocalization("Item_DESCRIPTION_Index_001", "Durability: %s/%s");
+ addStringLocalization("Item_DESCRIPTION_Index_002", "%s lvl %s");
+ addStringLocalization("Item_DESCRIPTION_Index_003", "Attack Damage: %s");
+ addStringLocalization("Item_DESCRIPTION_Index_004", "Mining Speed: %s");
+ addStringLocalization("Item_DESCRIPTION_Index_005", "Turbine Efficiency: %s");
+ addStringLocalization("Item_DESCRIPTION_Index_006", "Optimal Steam flow: %s L/t");
+ addStringLocalization("Item_DESCRIPTION_Index_007", "Energy from Optimal Gas Flow: %s EU/t");
+ addStringLocalization("Item_DESCRIPTION_Index_008", "Energy from Optimal Plasma Flow: %s EU/t");
+ addStringLocalization("Item_DESCRIPTION_Index_009", "Contains %s EU Tier: %s");
+ addStringLocalization("Item_DESCRIPTION_Index_010", "Empty. You should recycle it properly.");
+ addStringLocalization("Item_DESCRIPTION_Index_011", "%s / %s EU - Voltage: %s");
+ addStringLocalization("Item_DESCRIPTION_Index_012", "No Fluids Contained");
+ addStringLocalization("Item_DESCRIPTION_Index_013", "%sL / %sL");
+ addStringLocalization("Item_DESCRIPTION_Index_014", "Missing Coodinates!");
+ addStringLocalization("Item_DESCRIPTION_Index_015", "Device at:");
+ addStringLocalization("Item_DESCRIPTION_Index_018", "State: %s");
+ addStringLocalization("Item_DESCRIPTION_Index_019", "Bath with neutron in a hot reactor");
+ addStringLocalization("Item_DESCRIPTION_Index_020", "Progress: %s/%s");
+ addStringLocalization("Item_DESCRIPTION_Index_021", "Radiation Hazard");
+ addStringLocalization("Item_DESCRIPTION_Index_500", "Turbine Efficiency (Loose): %s");
+ addStringLocalization("Item_DESCRIPTION_Index_501", "Optimal Steam flow (Loose): %s L/t");
+ addStringLocalization("Item_DESCRIPTION_Index_502", "Overflow Efficiency Tier: %s");
+ addStringLocalization("Item_DESCRIPTION_Index_900", "Energy from Optimal Steam Flow: %s EU/t");
+ addStringLocalization("Item_DESCRIPTION_Index_901", "Energy from Optimal Steam Flow (Loose): %s EU/t");
+
+ addStringLocalization(FACE_ANY, "Any Side");
+ addStringLocalization(FACE_BOTTOM, "Bottom");
+ addStringLocalization(FACE_TOP, "Top");
+ addStringLocalization(FACE_LEFT, "Left");
+ addStringLocalization(FACE_FRONT, "Front");
+ addStringLocalization(FACE_RIGHT, "Right");
+ addStringLocalization(FACE_BACK, "Back");
+ addStringLocalization(FACE_NONE, "None");
+ }
+
+ private static void addToMCLangList(String aKey, String translation) {
+ if (stringTranslateLanguageList != null) {
+ stringTranslateLanguageList.put(aKey, translation);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_Log.java b/src/main/java/gregtech/api/util/GT_Log.java
new file mode 100644
index 0000000000..2d00c2e061
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_Log.java
@@ -0,0 +1,45 @@
+package gregtech.api.util;
+
+import java.io.File;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * Just a simple Logging Function. If on Server, then this will point to System.out and System.err
+ */
+public class GT_Log {
+
+ public static PrintStream out = System.out;
+ public static PrintStream err = System.err;
+ public static PrintStream ore = new LogBuffer();
+ public static PrintStream pal = null;
+ public static PrintStream exp = new LogBuffer();
+ public static File mLogFile;
+ public static File mOreDictLogFile;
+ public static File mPlayerActivityLogFile;
+ public static File mExplosionLog;
+
+ public static class LogBuffer extends PrintStream {
+
+ public final List<String> mBufferedOreDictLog = new ArrayList<>();
+
+ public LogBuffer() {
+ super(new OutputStream() {
+
+ @Override
+ public void write(int arg0) {
+ /* Do nothing */
+ }
+ });
+ }
+
+ @Override
+ public void println(String aString) {
+ mBufferedOreDictLog.add(aString);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_ModHandler.java b/src/main/java/gregtech/api/util/GT_ModHandler.java
new file mode 100644
index 0000000000..70dc2f30b0
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_ModHandler.java
@@ -0,0 +1,2551 @@
+package gregtech.api.util;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.enums.GT_Values.B;
+import static gregtech.api.enums.GT_Values.D1;
+import static gregtech.api.enums.GT_Values.DW;
+import static gregtech.api.enums.GT_Values.E;
+import static gregtech.api.enums.GT_Values.M;
+import static gregtech.api.enums.GT_Values.RA;
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.GT_Values.W;
+import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
+import static gregtech.api.recipe.RecipeMaps.extractorRecipes;
+import static gregtech.api.recipe.RecipeMaps.oreWasherRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.InventoryCrafting;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
+import net.minecraft.item.crafting.FurnaceRecipes;
+import net.minecraft.item.crafting.IRecipe;
+import net.minecraft.item.crafting.ShapedRecipes;
+import net.minecraft.item.crafting.ShapelessRecipes;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntityFurnace;
+import net.minecraft.world.World;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.ShapedOreRecipe;
+import net.minecraftforge.oredict.ShapelessOreRecipe;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OreDictNames;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.interfaces.IDamagableItem;
+import gregtech.api.interfaces.IItemContainer;
+import gregtech.api.interfaces.internal.IGT_CraftingRecipe;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.objects.GT_HashSet;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.RecipeCategories;
+import gregtech.api.recipe.RecipeMap;
+import ic2.api.item.IBoxable;
+import ic2.api.item.IC2Items;
+import ic2.api.item.IElectricItem;
+import ic2.api.reactor.IReactorComponent;
+import ic2.api.recipe.IRecipeInput;
+import ic2.api.recipe.RecipeInputItemStack;
+import ic2.api.recipe.RecipeOutput;
+import ic2.core.item.ItemToolbox;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * This is the Interface I use for interacting with other Mods.
+ * <p/>
+ * Due to the many imports, this File can cause compile Problems if not all the APIs are installed
+ */
+public class GT_ModHandler {
+
+ public static final List<IRecipe> sSingleNonBlockDamagableRecipeList = new ArrayList<>(1000);
+ private static final Map<String, ItemStack> sIC2ItemMap = new HashMap<>();
+
+ private static final List<IRecipe> sAllRecipeList = new ArrayList<>(5000),
+ sBufferRecipeList = new ArrayList<>(1000);
+ private static final List<ItemStack> delayedRemovalByOutput = new ArrayList<>();
+ private static final List<InventoryCrafting> delayedRemovalByRecipe = new ArrayList<>();
+
+ public static Collection<String> sNativeRecipeClasses = new HashSet<>(), sSpecialRecipeClasses = new HashSet<>();
+ public static GT_HashSet<GT_ItemStack> sNonReplaceableItems = new GT_HashSet<>();
+ public static Object sBoxableWrapper = new GT_IBoxableWrapper();
+ public static Collection<GT_ItemStack> sBoxableItems = new ArrayList<>();
+ private static final Map<IRecipeInput, RecipeOutput> emptyRecipeMap = new HashMap<>();
+ private static Set<GT_Utility.ItemId> recyclerWhitelist;
+ private static Set<GT_Utility.ItemId> recyclerBlacklist;
+
+ private static boolean sBufferCraftingRecipes = true;
+ public static List<Integer> sSingleNonBlockDamagableRecipeList_list = new ArrayList<>(100);
+ private static final boolean sSingleNonBlockDamagableRecipeList_create = true;
+ private static final ItemStack sMt1 = new ItemStack(Blocks.dirt, 1, 0), sMt2 = new ItemStack(Blocks.dirt, 1, 0);
+ private static final String s_H = "h", s_F = "f", s_I = "I", s_P = "P", s_R = "R";
+ private static final ItemStack[][] sShapes1 = new ItemStack[][] {
+ { sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1, null },
+ { sMt1, null, sMt1, sMt1, null, sMt1, sMt1, sMt1, sMt1 },
+ { null, sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1 },
+ { sMt1, sMt1, sMt1, sMt1, null, sMt1, null, null, null },
+ { sMt1, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1 },
+ { sMt1, sMt1, sMt1, sMt1, null, sMt1, sMt1, null, sMt1 },
+ { null, null, null, sMt1, null, sMt1, sMt1, null, sMt1 },
+ { null, sMt1, null, null, sMt1, null, null, sMt2, null },
+ { sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2, null },
+ { null, sMt1, null, null, sMt2, null, null, sMt2, null },
+ { sMt1, sMt1, null, sMt1, sMt2, null, null, sMt2, null },
+ { null, sMt1, sMt1, null, sMt2, sMt1, null, sMt2, null },
+ { sMt1, sMt1, null, null, sMt2, null, null, sMt2, null },
+ { null, sMt1, sMt1, null, sMt2, null, null, sMt2, null },
+ { null, sMt1, null, sMt1, null, null, null, sMt1, sMt2 },
+ { null, sMt1, null, null, null, sMt1, sMt2, sMt1, null },
+ { null, sMt1, null, sMt1, null, sMt1, null, null, sMt2 },
+ { null, sMt1, null, sMt1, null, sMt1, sMt2, null, null },
+ { null, sMt2, null, null, sMt1, null, null, sMt1, null },
+ { null, sMt2, null, null, sMt2, null, sMt1, sMt1, sMt1 },
+ { null, sMt2, null, null, sMt2, null, null, sMt1, null },
+ { null, sMt2, null, sMt1, sMt2, null, sMt1, sMt1, null },
+ { null, sMt2, null, null, sMt2, sMt1, null, sMt1, sMt1 },
+ { null, sMt2, null, null, sMt2, null, sMt1, sMt1, null },
+ { sMt1, null, null, null, sMt2, null, null, null, sMt2 },
+ { null, null, sMt1, null, sMt2, null, sMt2, null, null },
+ { sMt1, null, null, null, sMt2, null, null, null, null },
+ { null, null, sMt1, null, sMt2, null, null, null, null },
+ { sMt1, sMt2, null, null, null, null, null, null, null },
+ { sMt2, sMt1, null, null, null, null, null, null, null },
+ { sMt1, null, null, sMt2, null, null, null, null, null },
+ { sMt2, null, null, sMt1, null, null, null, null, null },
+ { sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, null, sMt2, null },
+ { sMt1, sMt1, null, sMt1, sMt1, sMt2, sMt1, sMt1, null },
+ { null, sMt1, sMt1, sMt2, sMt1, sMt1, null, sMt1, sMt1 },
+ { null, sMt2, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1 },
+ { sMt1, sMt1, sMt1, sMt1, sMt2, sMt1, null, sMt2, null },
+ { sMt1, sMt1, null, sMt1, sMt2, sMt2, sMt1, sMt1, null },
+ { null, sMt1, sMt1, sMt2, sMt2, sMt1, null, sMt1, sMt1 },
+ { null, sMt2, null, sMt1, sMt2, sMt1, sMt1, sMt1, sMt1 },
+ { sMt1, null, null, null, sMt1, null, null, null, null },
+ { null, sMt1, null, sMt1, null, null, null, null, null },
+ { sMt1, sMt1, null, sMt2, null, sMt1, sMt2, null, null },
+ { null, sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2 } };
+ public static List<Integer> sSingleNonBlockDamagableRecipeList_validsShapes1 = new ArrayList<>(44);
+ public static boolean sSingleNonBlockDamagableRecipeList_validsShapes1_update = false;
+ public static List<Integer> sSingleNonBlockDamagableRecipeList_warntOutput = new ArrayList<>(50);
+ public static List<Integer> sVanillaRecipeList_warntOutput = new ArrayList<>(50);
+ public static final List<IRecipe> sSingleNonBlockDamagableRecipeList_verified = new ArrayList<>(1000);
+ public static List<Integer> sAnySteamFluidIDs = new ArrayList<>();
+ public static List<Integer> sSuperHeatedSteamFluidIDs = new ArrayList<>();
+
+ static {
+ sNativeRecipeClasses.add(ShapedRecipes.class.getName());
+ sNativeRecipeClasses.add(ShapedOreRecipe.class.getName());
+ sNativeRecipeClasses.add(GT_Shaped_Recipe.class.getName());
+ sNativeRecipeClasses.add(ShapelessRecipes.class.getName());
+ sNativeRecipeClasses.add(ShapelessOreRecipe.class.getName());
+ sNativeRecipeClasses.add(GT_Shapeless_Recipe.class.getName());
+ sNativeRecipeClasses.add(ic2.core.AdvRecipe.class.getName());
+ sNativeRecipeClasses.add(ic2.core.AdvShapelessRecipe.class.getName());
+ sNativeRecipeClasses.add("appeng.recipes.game.ShapedRecipe");
+ sNativeRecipeClasses.add("appeng.recipes.game.ShapelessRecipe");
+ sNativeRecipeClasses.add("forestry.core.utils.ShapedRecipeCustom");
+
+ // Recipe Classes, which should never be removed.
+ sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipeFireworks.class.getName());
+ sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipesArmorDyes.class.getName());
+ sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipeBookCloning.class.getName());
+ sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipesMapCloning.class.getName());
+ sSpecialRecipeClasses.add(net.minecraft.item.crafting.RecipesMapExtending.class.getName());
+ sSpecialRecipeClasses.add("jds.bibliocraft.BiblioSpecialRecipes");
+ sSpecialRecipeClasses.add("dan200.qcraft.shared.EntangledQBlockRecipe");
+ sSpecialRecipeClasses.add("dan200.qcraft.shared.EntangledQuantumComputerRecipe");
+ sSpecialRecipeClasses.add("dan200.qcraft.shared.QBlockRecipe");
+ sSpecialRecipeClasses.add("appeng.recipes.game.FacadeRecipe");
+ sSpecialRecipeClasses.add("appeng.recipes.game.DisassembleRecipe");
+ sSpecialRecipeClasses.add("mods.railcraft.common.carts.LocomotivePaintingRecipe");
+ sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.RotorRepairRecipe");
+ sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.RoutingTableCopyRecipe");
+ sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.RoutingTicketCopyRecipe");
+ sSpecialRecipeClasses.add("mods.railcraft.common.util.crafting.TankCartFilterRecipe");
+ sSpecialRecipeClasses.add("mods.railcraft.common.emblems.LocomotiveEmblemRecipe");
+ sSpecialRecipeClasses.add("mods.railcraft.common.emblems.EmblemPostColorRecipe");
+ sSpecialRecipeClasses.add("mods.railcraft.common.emblems.EmblemPostEmblemRecipe");
+ sSpecialRecipeClasses.add("mods.immibis.redlogic.interaction.RecipeDyeLumarButton");
+ sSpecialRecipeClasses.add("thaumcraft.common.items.armor.RecipesRobeArmorDyes");
+ sSpecialRecipeClasses.add("thaumcraft.common.items.armor.RecipesVoidRobeArmorDyes");
+ sSpecialRecipeClasses.add("thaumcraft.common.lib.crafting.ShapelessNBTOreRecipe");
+ sSpecialRecipeClasses.add("twilightforest.item.TFMapCloningRecipe");
+ sSpecialRecipeClasses.add("forestry.lepidopterology.MatingRecipe");
+ sSpecialRecipeClasses.add("micdoodle8.mods.galacticraft.planets.asteroids.recipe.CanisterRecipes");
+ sSpecialRecipeClasses.add("shedar.mods.ic2.nuclearcontrol.StorageArrayRecipe");
+ }
+
+ /**
+ * Returns if that Liquid is Water or Distilled Water
+ */
+ public static boolean isWater(FluidStack aFluid) {
+ if (aFluid == null) return false;
+ return aFluid.isFluidEqual(getWater(1)) || aFluid.isFluidEqual(getDistilledWater(1));
+ }
+
+ /**
+ * Returns a Liquid Stack with given amount of Water.
+ */
+ public static FluidStack getWater(long aAmount) {
+ return FluidRegistry.getFluidStack("water", (int) aAmount);
+ }
+
+ /**
+ * Returns a Liquid Stack with given amount of distilled Water.
+ */
+ public static FluidStack getDistilledWater(long aAmount) {
+ FluidStack tFluid = FluidRegistry.getFluidStack("ic2distilledwater", (int) aAmount);
+ if (tFluid == null) tFluid = getWater(aAmount);
+ return tFluid;
+ }
+
+ /**
+ * Returns if that Liquid is Lava
+ */
+ public static boolean isLava(FluidStack aFluid) {
+ if (aFluid == null) return false;
+ return aFluid.isFluidEqual(getLava(1));
+ }
+
+ /**
+ * Returns a Liquid Stack with given amount of Lava.
+ */
+ public static FluidStack getLava(long aAmount) {
+ return FluidRegistry.getFluidStack("lava", (int) aAmount);
+ }
+
+ /**
+ * Returns if that Liquid is Steam
+ */
+ public static boolean isSteam(FluidStack aFluid) {
+ if (aFluid == null) return false;
+ return aFluid.isFluidEqual(getSteam(1));
+ }
+
+ /**
+ * Returns if that Liquid is Any Steam (including other mods)
+ */
+ public static boolean isAnySteam(FluidStack aFluid) {
+ return (aFluid != null && (isSteam(aFluid) || sAnySteamFluidIDs.contains(aFluid.getFluidID())));
+ }
+
+ /**
+ * Returns if that Liquid is Super Heated Steam (including other mods)
+ */
+ public static boolean isSuperHeatedSteam(FluidStack aFluid) {
+ return (aFluid != null && sSuperHeatedSteamFluidIDs.contains(aFluid.getFluidID()));
+ }
+
+ /**
+ * Returns a Liquid Stack with given amount of Steam.
+ */
+ public static FluidStack getSteam(long aAmount) {
+ return FluidRegistry.getFluidStack("steam", (int) aAmount);
+ }
+
+ /**
+ * Returns if that Liquid is Milk
+ */
+ public static boolean isMilk(FluidStack aFluid) {
+ if (aFluid == null) return false;
+ return aFluid.isFluidEqual(getMilk(1));
+ }
+
+ /**
+ * Returns a Liquid Stack with given amount of Milk.
+ */
+ public static FluidStack getMilk(long aAmount) {
+ return FluidRegistry.getFluidStack("milk", (int) aAmount);
+ }
+
+ @Deprecated
+ public static ItemStack getEmptyFuelCan(long aAmount) {
+ return null;
+ }
+
+ public static ItemStack getEmptyCell(long aAmount) {
+ return ItemList.Cell_Empty.get(aAmount);
+ }
+
+ public static ItemStack getAirCell(long aAmount) {
+ return ItemList.Cell_Air.get(aAmount);
+ }
+
+ public static ItemStack getWaterCell(long aAmount) {
+ return ItemList.Cell_Water.get(aAmount);
+ }
+
+ public static ItemStack getLavaCell(long aAmount) {
+ return ItemList.Cell_Lava.get(aAmount);
+ }
+
+ /**
+ * @param aValue the Value of this Stack, when burning inside a Furnace (200 = 1 Burn Process = 500 EU, max = 32767
+ * (that is 81917.5 EU)), limited to Short because the vanilla Furnace otherwise can't handle it
+ * properly, stupid Mojang...
+ */
+ public static ItemStack setFuelValue(ItemStack aStack, short aValue) {
+ aStack.setTagCompound(GT_Utility.getNBTContainingShort(aStack.getTagCompound(), "GT.ItemFuelValue", aValue));
+ return aStack;
+ }
+
+ /**
+ * @return the Value of this Stack, when burning inside a Furnace (200 = 1 Burn Process = 500 EU, max = 32767 (that
+ * is 81917.5 EU)), limited to Short because the vanilla Furnace otherwise can't handle it properly, stupid
+ * Mojang...
+ */
+ public static int getFuelValue(ItemStack aStack) {
+ return TileEntityFurnace.getItemBurnTime(aStack);
+ }
+
+ /**
+ * @param aValue Fuel value in EU
+ */
+ @Deprecated
+ public static ItemStack getFuelCan(int aValue) {
+ return null;
+ }
+
+ /**
+ * @param aFuelCan the Item you want to check
+ * @return the exact Value in EU the Fuel Can is worth if its even a Fuel Can.
+ */
+ @Deprecated
+ public static int getFuelCanValue(ItemStack aFuelCan) {
+ return 0;
+ }
+
+ /**
+ * Gets an Item from IndustrialCraft, and returns a Replacement Item if not possible
+ */
+ public static ItemStack getIC2Item(String aItem, long aAmount, ItemStack aReplacement) {
+ if (GT_Utility.isStringInvalid(aItem) || !GregTech_API.sPreloadStarted) return null;
+ // if (D1) GT_Log.out.println("Requested the Item '" + aItem + "' from the IC2-API");
+ if (!sIC2ItemMap.containsKey(aItem)) try {
+ ItemStack tStack = IC2Items.getItem(aItem);
+ sIC2ItemMap.put(aItem, tStack);
+ if (tStack == null && D1) GT_Log.err.println(aItem + " is not found in the IC2 Items!");
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return GT_Utility.copyAmount(aAmount, sIC2ItemMap.get(aItem), aReplacement);
+ }
+
+ /**
+ * Gets an Item from IndustrialCraft, but the Damage Value can be specified, and returns a Replacement Item with the
+ * same Damage if not possible
+ */
+ public static ItemStack getIC2Item(String aItem, long aAmount, int aMeta, ItemStack aReplacement) {
+ ItemStack rStack = getIC2Item(aItem, aAmount, aReplacement);
+ if (rStack == null) return null;
+ Items.feather.setDamage(rStack, aMeta);
+ return rStack;
+ }
+
+ /**
+ * Gets an Item from IndustrialCraft, but the Damage Value can be specified
+ */
+ public static ItemStack getIC2Item(String aItem, long aAmount, int aMeta) {
+ return getIC2Item(aItem, aAmount, aMeta, null);
+ }
+
+ /**
+ * Gets an Item from IndustrialCraft
+ */
+ public static ItemStack getIC2Item(String aItem, long aAmount) {
+ return getIC2Item(aItem, aAmount, null);
+ }
+
+ /**
+ * Gets an Item from the specified mod
+ */
+ public static ItemStack getModItem(String aModID, String aItem, long aAmount) {
+ return getModItem(aModID, aItem, aAmount, null);
+ }
+
+ /**
+ * Gets an Item from the specified mod, and returns a Replacement Item if not possible
+ */
+ public static ItemStack getModItem(String aModID, String aItem, long aAmount, ItemStack aReplacement) {
+ ItemStack result;
+ if (GT_Utility.isStringInvalid(aItem) || !GregTech_API.sPreloadStarted) {
+ result = null;
+ } else {
+ result = GT_Utility
+ .copyAmount(aAmount, GameRegistry.findItemStack(aModID, aItem, (int) aAmount), aReplacement);
+ }
+
+ if (result == null) {
+ String reason;
+ if (GT_Utility.isStringInvalid(aItem)) {
+ reason = "the name of the item is an invalid string";
+ } else if (!GregTech_API.sPreloadStarted) {
+ reason = "the GT5U preloading phase has not yet started";
+ } else {
+ reason = "the item was not found in the game registry";
+ }
+ String log_message = "getModItem call: object \"" + aItem
+ + "\" with mod id \""
+ + aModID
+ + "\" has returned null because "
+ + reason;
+ GT_Log.out.println(log_message);
+ new Exception().printStackTrace(GT_Log.out);
+ }
+ return result;
+ }
+
+ /**
+ * Gets an Item from the specified mod, but the Damage Value can be specified
+ */
+ public static ItemStack getModItem(String aModID, String aItem, long aAmount, int aMeta) {
+ ItemStack rStack = getModItem(aModID, aItem, aAmount);
+ if (rStack == null) return null;
+ Items.feather.setDamage(rStack, aMeta);
+ return rStack;
+ }
+
+ /**
+ * Gets an Item from the specified mod, but the Damage Value can be specified, and returns a Replacement Item with
+ * the same Damage if not possible
+ */
+ public static ItemStack getModItem(String aModID, String aItem, long aAmount, int aMeta, ItemStack aReplacement) {
+ ItemStack rStack = getModItem(aModID, aItem, aAmount, aReplacement);
+ if (rStack == null) return null;
+ Items.feather.setDamage(rStack, aMeta);
+ return rStack;
+ }
+
+ /**
+ * OUT OF ORDER
+ */
+ public static boolean getModeKeyDown(EntityPlayer aPlayer) {
+ return false;
+ }
+
+ /**
+ * OUT OF ORDER
+ */
+ public static boolean getBoostKeyDown(EntityPlayer aPlayer) {
+ return false;
+ }
+
+ /**
+ * OUT OF ORDER
+ */
+ public static boolean getJumpKeyDown(EntityPlayer aPlayer) {
+ return false;
+ }
+
+ /**
+ * Adds a Valuable Ore to the Miner
+ */
+ public static boolean addValuableOre(Block aBlock, int aMeta, int aValue) {
+ if (aValue <= 0) return false;
+ try {
+ Class.forName("ic2.core.IC2")
+ .getMethod("addValuableOre", IRecipeInput.class, int.class)
+ .invoke(null, new RecipeInputItemStack(new ItemStack(aBlock, 1, aMeta)), aValue);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return true;
+ }
+
+ /**
+ * Adds a Scrapbox Drop. Fails at April first for the "suddenly Hoes"-Feature of IC2
+ */
+ public static boolean addScrapboxDrop(float aChance, ItemStack aOutput) {
+ aOutput = GT_OreDictUnificator.get(true, aOutput);
+ if (aOutput == null || aChance <= 0) return false;
+ aOutput.stackSize = 1;
+ if (GT_Config.troll && !GT_Utility.areStacksEqual(aOutput, new ItemStack(Items.wooden_hoe, 1, 0))) return false;
+ try {
+ GT_Utility.callMethod(
+ GT_Utility.getFieldContent("ic2.api.recipe.Recipes", "scrapboxDrops", true, true),
+ "addDrop",
+ true,
+ false,
+ true,
+ GT_Utility.copyOrNull(aOutput),
+ aChance);
+ GT_Utility.callMethod(
+ GT_Utility.getFieldContent("ic2.api.recipe.Recipes", "scrapboxDrops", true, true),
+ "addRecipe",
+ true,
+ true,
+ false,
+ GT_Utility.copyOrNull(aOutput),
+ aChance);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return true;
+ }
+
+ /**
+ * Adds an Item to the Recycler Blacklist
+ */
+ public static boolean addToRecyclerBlackList(ItemStack aRecycledStack) {
+ if (aRecycledStack == null) return false;
+ try {
+ ic2.api.recipe.Recipes.recyclerBlacklist.add(new RecipeInputItemStack(aRecycledStack));
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return true;
+ }
+
+ /**
+ * Just simple Furnace smelting. Unbelievable how Minecraft fails at making a simple ItemStack->ItemStack mapping...
+ */
+ public static boolean addSmeltingRecipe(ItemStack aInput, ItemStack aOutput) {
+ aOutput = GT_OreDictUnificator.get(true, aOutput);
+ if (aInput == null || aOutput == null) return false;
+ FurnaceRecipes.smelting()
+ .func_151394_a(aInput, GT_Utility.copyOrNull(aOutput), 0.0F);
+ return true;
+ }
+
+ /**
+ * Adds to Furnace AND Alloy Smelter
+ */
+ public static boolean addSmeltingAndAlloySmeltingRecipe(ItemStack aInput, ItemStack aOutput, boolean hidden) {
+ if (aInput == null || aOutput == null) {
+ return false;
+ }
+ boolean temp = aInput.stackSize == 1 && addSmeltingRecipe(aInput, aOutput);
+ ItemStack input2 = OrePrefixes.ingot.contains(aOutput) ? ItemList.Shape_Mold_Ingot.get(0)
+ : OrePrefixes.block.contains(aOutput) ? ItemList.Shape_Mold_Block.get(0)
+ : OrePrefixes.nugget.contains(aOutput) ? ItemList.Shape_Mold_Nugget.get(0) : null;
+ if (Materials.Graphite.contains(aInput)) {
+ return false;
+ }
+ if ((input2 == null) && ((OrePrefixes.ingot.contains(aInput)) || (OrePrefixes.dust.contains(aInput))
+ || (OrePrefixes.gem.contains(aInput)))) {
+ return false;
+ }
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ if (input2 == null) {
+ recipeBuilder.itemInputs(aInput);
+ } else {
+ recipeBuilder.itemInputs(aInput, input2);
+ }
+ recipeBuilder.itemOutputs(aOutput)
+ .duration(6 * SECONDS + 10 * TICKS)
+ .eut(3)
+ .recipeCategory(RecipeCategories.alloySmelterRecycling);
+ if (hidden) {
+ recipeBuilder.hidden();
+ }
+ recipeBuilder.addTo(alloySmelterRecipes);
+ return true;
+ }
+
+ /**
+ * LiquidTransposer Recipe for both directions
+ */
+ @Deprecated
+ public static boolean addLiquidTransposerRecipe(ItemStack aEmptyContainer, FluidStack aLiquid,
+ ItemStack aFullContainer, int aMJ) {
+ return true;
+ }
+
+ /**
+ * LiquidTransposer Recipe for filling Containers
+ */
+ @Deprecated
+ public static boolean addLiquidTransposerFillRecipe(ItemStack aEmptyContainer, FluidStack aLiquid,
+ ItemStack aFullContainer, int aMJ) {
+ return true;
+ }
+
+ /**
+ * LiquidTransposer Recipe for emptying Containers
+ */
+ @Deprecated
+ public static boolean addLiquidTransposerEmptyRecipe(ItemStack aFullContainer, FluidStack aLiquid,
+ ItemStack aEmptyContainer, int aMJ) {
+ return true;
+ }
+
+ /**
+ * IC2-Extractor Recipe. Overloads old Recipes automatically
+ */
+ @Deprecated
+ public static boolean addExtractionRecipe(ItemStack aInput, ItemStack aOutput) {
+ aOutput = GT_OreDictUnificator.get(true, aOutput);
+ if (aInput == null || aOutput == null) return false;
+ RA.stdBuilder()
+ .itemInputs(aInput)
+ .itemOutputs(aOutput)
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(extractorRecipes);
+ return true;
+ }
+
+ /**
+ * RC-BlastFurnace Recipes
+ */
+ @Deprecated
+ public static boolean addRCBlastFurnaceRecipe(ItemStack aInput, ItemStack aOutput, int aTime) {
+ return true;
+ }
+
+ @Deprecated
+ public static boolean addPulverisationRecipe(ItemStack aInput, ItemStack aOutput1) {
+ return addPulverisationRecipe(aInput, aOutput1, null, 0, false);
+ }
+
+ @Deprecated
+ public static boolean addPulverisationRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2) {
+ return addPulverisationRecipe(aInput, aOutput1, aOutput2, 100, false);
+ }
+
+ @Deprecated
+ public static boolean addPulverisationRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2,
+ int aChance) {
+ return addPulverisationRecipe(aInput, aOutput1, aOutput2, aChance, false);
+ }
+
+ @Deprecated
+ public static boolean addPulverisationRecipe(ItemStack aInput, ItemStack aOutput1, boolean aOverwrite) {
+ return addPulverisationRecipe(aInput, aOutput1, null, 0, aOverwrite);
+ }
+
+ @Deprecated
+ public static boolean addPulverisationRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2,
+ boolean aOverwrite) {
+ return addPulverisationRecipe(aInput, aOutput1, aOutput2, 100, aOverwrite);
+ }
+
+ @Deprecated
+ public static boolean addPulverisationRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2, int aChance,
+ boolean aOverwrite) {
+ return addPulverisationRecipe(aInput, aOutput1, aOutput2, aChance, null, 0, aOverwrite);
+ }
+
+ /**
+ * Adds Several Pulverizer-Type Recipes.
+ */
+ @Deprecated
+ public static boolean addPulverisationRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2, int aChance2,
+ ItemStack aOutput3, int aChance3, boolean aOverwrite) {
+ aOutput1 = GT_OreDictUnificator.get(true, aOutput1);
+ aOutput2 = GT_OreDictUnificator.get(true, aOutput2);
+ if (GT_Utility.isStackInvalid(aInput) || GT_Utility.isStackInvalid(aOutput1)) return false;
+
+ if (GT_Utility.getContainerItem(aInput, false) == null) {
+ RA.addPulveriserRecipe(
+ aInput,
+ new ItemStack[] { aOutput1, aOutput2, aOutput3 },
+ new int[] { 10000, aChance2 <= 0 ? 1000 : 100 * aChance2, aChance3 <= 0 ? 1000 : 100 * aChance3 },
+ 400,
+ 2);
+ }
+ return true;
+ }
+
+ @Deprecated
+ public static boolean addPulverisationRecipe(ItemStack aInputItem, ItemStack[] aOutputArray, int[] aChanceArray,
+ int aEUt, int aRecipeDurationInTicks) {
+
+ ItemStack[] aUnifiedOutputArray = new ItemStack[aOutputArray.length];
+ int counter = 0;
+
+ for (ItemStack item : aOutputArray) {
+ aUnifiedOutputArray[counter] = GT_OreDictUnificator.get(true, item);
+ counter++;
+ }
+
+ RA.addPulveriserRecipe(aInputItem, aOutputArray, aChanceArray, aRecipeDurationInTicks, aEUt);
+
+ return true;
+ }
+
+ @Deprecated
+ public static boolean addImmersiveEngineeringRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2,
+ int aChance2, ItemStack aOutput3, int aChance3) {
+ return true;
+ }
+
+ @Deprecated
+ public static boolean addMagneticraftRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2, int aChance2,
+ ItemStack aOutput3, int aChance3) {
+ return true;
+ }
+
+ /**
+ * Adds a Recipe to the Sawmills of ThermalCraft
+ */
+ @Deprecated
+ public static boolean addSawmillRecipe(ItemStack aInput1, ItemStack aOutput1, ItemStack aOutput2) {
+ return true;
+ }
+
+ /**
+ * Induction Smelter Recipes and Alloy Smelter Recipes
+ */
+ @Deprecated
+ public static boolean addAlloySmelterRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, int aDuration,
+ int aEUt, boolean aAllowSecondaryInputEmpty) {
+ if (aInput1 == null || (aInput2 == null && !aAllowSecondaryInputEmpty) || aOutput1 == null) return false;
+ aOutput1 = GT_OreDictUnificator.get(true, aOutput1);
+ RA.stdBuilder()
+ .itemInputs(aInput1, aInput2)
+ .itemOutputs(aOutput1)
+ .duration(aDuration)
+ .eut(aEUt)
+ .addTo(alloySmelterRecipes);
+ return true;
+ }
+
+ /**
+ * Induction Smelter Recipes for TE
+ */
+ public static boolean addInductionSmelterRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1,
+ ItemStack aOutput2, int aEnergy, int aChance) {
+ return true;
+ }
+
+ /**
+ * Smelts Ores to Ingots
+ */
+ public static boolean addOreToIngotSmeltingRecipe(ItemStack aInput, ItemStack aOutput) {
+ aOutput = GT_OreDictUnificator.get(true, aOutput);
+ if (aInput == null || aOutput == null) return false;
+ FurnaceRecipes.smelting()
+ .func_151394_a(aInput, GT_Utility.copyOrNull(aOutput), 0.0F);
+ return true;
+ }
+
+ /**
+ * Adds GT versions of the IC2 recipes from the supplied IC2RecipeList.
+ */
+ public static void addIC2RecipesToGT(Map<IRecipeInput, RecipeOutput> aIC2RecipeList, RecipeMap<?> aGTRecipeMap,
+ boolean aAddGTRecipe, boolean aRemoveIC2Recipe, boolean aExcludeGTIC2Items) {
+ Map<ItemStack, ItemStack> aRecipesToRemove = new HashMap<>();
+ for (Entry<IRecipeInput, RecipeOutput> iRecipeInputRecipeOutputEntry : aIC2RecipeList.entrySet()) {
+ if (iRecipeInputRecipeOutputEntry.getValue().items.isEmpty()) {
+ continue;
+ }
+
+ for (ItemStack tStack : (iRecipeInputRecipeOutputEntry.getKey()).getInputs()) {
+ if (!GT_Utility.isStackValid(tStack)) {
+ continue;
+ }
+
+ if (aAddGTRecipe) {
+ try {
+ if (aExcludeGTIC2Items && ((tStack.getUnlocalizedName()
+ .contains("gt.metaitem.01")
+ || tStack.getUnlocalizedName()
+ .contains("gt.blockores")
+ || tStack.getUnlocalizedName()
+ .contains("ic2.itemCrushed")
+ || tStack.getUnlocalizedName()
+ .contains("ic2.itemPurifiedCrushed"))))
+ continue;
+ switch (aGTRecipeMap.unlocalizedName) {
+ case "gt.recipe.macerator", "gt.recipe.extractor", "gt.recipe.compressor" -> aGTRecipeMap
+ .addRecipe(
+ true,
+ new ItemStack[] { GT_Utility.copyAmount(
+ iRecipeInputRecipeOutputEntry.getKey()
+ .getAmount(),
+ tStack) },
+ iRecipeInputRecipeOutputEntry.getValue().items.toArray(new ItemStack[0]),
+ null,
+ null,
+ null,
+ null,
+ 300,
+ 2,
+ 0);
+ case "gt.recipe.thermalcentrifuge" -> aGTRecipeMap.addRecipe(
+ true,
+ new ItemStack[] { GT_Utility.copyAmount(
+ iRecipeInputRecipeOutputEntry.getKey()
+ .getAmount(),
+ tStack) },
+ iRecipeInputRecipeOutputEntry.getValue().items.toArray(new ItemStack[0]),
+ null,
+ null,
+ null,
+ null,
+ 500,
+ 48,
+ 0);
+ }
+ } catch (Exception e) {
+ System.err.println(e);
+ }
+ }
+ if (aRemoveIC2Recipe) {
+ aRecipesToRemove.put(tStack, iRecipeInputRecipeOutputEntry.getValue().items.get(0));
+ }
+
+ }
+
+ }
+ GT_Utility.bulkRemoveSimpleIC2MachineRecipe(aRecipesToRemove, aIC2RecipeList);
+ }
+
+ public static Map<IRecipeInput, RecipeOutput> getExtractorRecipeList() {
+ try {
+ return ic2.api.recipe.Recipes.extractor.getRecipes();
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return emptyRecipeMap;
+ }
+
+ public static Map<IRecipeInput, RecipeOutput> getCompressorRecipeList() {
+ try {
+ return ic2.api.recipe.Recipes.compressor.getRecipes();
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return emptyRecipeMap;
+ }
+
+ public static Map<IRecipeInput, RecipeOutput> getMaceratorRecipeList() {
+ try {
+ return ic2.api.recipe.Recipes.macerator.getRecipes();
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return emptyRecipeMap;
+ }
+
+ public static Map<IRecipeInput, RecipeOutput> getThermalCentrifugeRecipeList() {
+ try {
+ return ic2.api.recipe.Recipes.centrifuge.getRecipes();
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return emptyRecipeMap;
+ }
+
+ public static Map<IRecipeInput, RecipeOutput> getOreWashingRecipeList() {
+ try {
+ return ic2.api.recipe.Recipes.oreWashing.getRecipes();
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return emptyRecipeMap;
+ }
+
+ public static Map<IRecipeInput, RecipeOutput> getMassFabricatorList() {
+ try {
+ return ic2.api.recipe.Recipes.matterAmplifier.getRecipes();
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return emptyRecipeMap;
+ }
+
+ /**
+ * IC2-ThermalCentrifuge Recipe. Overloads old Recipes automatically
+ */
+ @Deprecated
+ public static boolean addThermalCentrifugeRecipe(ItemStack aInput, int[] aChances, int aHeat, Object... aOutput) {
+ if (aInput == null || aOutput == null || aOutput.length == 0 || aOutput[0] == null) return false;
+ RA.addThermalCentrifugeRecipe(
+ aInput,
+ (ItemStack) aOutput[0],
+ aOutput.length >= 2 ? (ItemStack) aOutput[1] : null,
+ aOutput.length >= 3 ? (ItemStack) aOutput[2] : null,
+ aChances,
+ 500,
+ 48);
+ return true;
+ }
+
+ @Deprecated
+ public static boolean addThermalCentrifugeRecipe(ItemStack aInput, int aHeat, Object... aOutput) {
+ if (aInput == null || aOutput == null || aOutput.length == 0 || aOutput[0] == null) return false;
+ RA.addThermalCentrifugeRecipe(
+ aInput,
+ (ItemStack) aOutput[0],
+ aOutput.length >= 2 ? (ItemStack) aOutput[1] : null,
+ aOutput.length >= 3 ? (ItemStack) aOutput[2] : null,
+ 500,
+ 48);
+ return true;
+ }
+
+ /**
+ * IC2-OreWasher Recipe. Overloads old Recipes automatically
+ */
+ public static boolean addOreWasherRecipe(ItemStack aInput, int[] aChances, int aWaterAmount, Object... aOutput) {
+ if (aInput == null || aOutput == null || aOutput.length == 0 || aOutput[0] == null) return false;
+ RA.stdBuilder()
+ .itemInputs(aInput)
+ .itemOutputs((ItemStack) aOutput[0], (ItemStack) aOutput[1], (ItemStack) aOutput[2])
+ .outputChances(aChances)
+ .fluidInputs(GT_ModHandler.getWater(aWaterAmount))
+ .duration(25 * SECONDS)
+ .eut(16)
+ .addTo(oreWasherRecipes);
+
+ RA.stdBuilder()
+ .itemInputs(aInput)
+ .itemOutputs((ItemStack) aOutput[0], (ItemStack) aOutput[1], (ItemStack) aOutput[2])
+ .outputChances(aChances)
+ .fluidInputs(GT_ModHandler.getDistilledWater(aWaterAmount / 5))
+ .duration(15 * SECONDS)
+ .eut(16)
+ .addTo(oreWasherRecipes);
+ return true;
+ }
+
+ public static boolean addOreWasherRecipe(ItemStack aInput, int aWaterAmount, Object... aOutput) {
+ if (aInput == null || aOutput == null || aOutput.length == 0 || aOutput[0] == null) return false;
+ RA.stdBuilder()
+ .itemInputs(aInput)
+ .itemOutputs((ItemStack) aOutput[0], (ItemStack) aOutput[1], (ItemStack) aOutput[2])
+ .fluidInputs(GT_ModHandler.getWater(aWaterAmount))
+ .duration(25 * SECONDS)
+ .eut(16)
+ .addTo(oreWasherRecipes);
+
+ RA.stdBuilder()
+ .itemInputs(aInput)
+ .itemOutputs((ItemStack) aOutput[0], (ItemStack) aOutput[1], (ItemStack) aOutput[2])
+ .fluidInputs(GT_ModHandler.getDistilledWater(aWaterAmount / 5))
+ .duration(15 * SECONDS)
+ .eut(16)
+ .addTo(oreWasherRecipes);
+ return true;
+ }
+
+ /**
+ * IC2-Compressor Recipe. Overloads old Recipes automatically
+ */
+ @Deprecated
+ public static boolean addCompressionRecipe(ItemStack aInput, ItemStack aOutput) {
+ return addCompressionRecipe(aInput, aOutput, 300, 2);
+ }
+
+ /**
+ * IC2-Compressor Recipe. Overloads old Recipes automatically
+ */
+ @Deprecated
+ public static boolean addCompressionRecipe(ItemStack aInput, ItemStack aOutput, int duration, int EUPerTick) {
+ aOutput = GT_OreDictUnificator.get(true, aOutput);
+ if (aInput == null || aOutput == null || GT_Utility.areStacksEqual(aInput, aOutput, true)) return false;
+ RA.addCompressorRecipe(aInput, aOutput, duration, EUPerTick);
+ return true;
+ }
+
+ /**
+ * @param aValue Scrap = 5000, Scrapbox = 45000, Diamond Dust 125000
+ */
+ public static boolean addIC2MatterAmplifier(ItemStack aAmplifier, int aValue) {
+ if (aAmplifier == null || aValue <= 0) return false;
+ try {
+ NBTTagCompound tNBT = new NBTTagCompound();
+ tNBT.setInteger("amplification", aValue);
+ GT_Utility
+ .callMethod(ic2.api.recipe.Recipes.matterAmplifier, "addRecipe", false, false, false, aAmplifier, tNBT);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return true;
+ }
+
+ /**
+ * Rolling Machine Crafting Recipe
+ */
+ public static boolean addRollingMachineRecipe(ItemStack aResult, Object[] aRecipe) {
+ aResult = GT_OreDictUnificator.get(true, aResult);
+ if (aResult == null || aRecipe == null || aResult.stackSize <= 0) return false;
+ try {
+ mods.railcraft.api.crafting.RailcraftCraftingManager.rollingMachine.getRecipeList()
+ .add(new ShapedOreRecipe(GT_Utility.copyOrNull(aResult), aRecipe));
+ } catch (Throwable e) {
+ return addCraftingRecipe(GT_Utility.copyOrNull(aResult), aRecipe);
+ }
+ return true;
+ }
+
+ public static void stopBufferingCraftingRecipes() {
+ sBufferCraftingRecipes = false;
+
+ bulkRemoveRecipeByOutput(delayedRemovalByOutput);
+ bulkRemoveByRecipe(delayedRemovalByRecipe);
+ sBufferRecipeList.forEach(GameRegistry::addRecipe);
+
+ delayedRemovalByOutput.clear();
+ delayedRemovalByRecipe.clear();
+ sBufferRecipeList.clear();
+ }
+
+ /**
+ * Shapeless Crafting Recipes. Deletes conflicting Recipes too.
+ */
+ public static boolean addCraftingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded,
+ int[] aEnchantmentLevelsAdded, Object[] aRecipe) {
+ return addCraftingRecipe(
+ aResult,
+ aEnchantmentsAdded,
+ aEnchantmentLevelsAdded,
+ false,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ aRecipe);
+ }
+
+ /**
+ * Regular Crafting Recipes. Deletes conflicting Recipes too.
+ * <p/>
+ * You can insert instances of IItemContainer into the Recipe Input Array directly without having to call "get(1)"
+ * on them.
+ * <p/>
+ * Enums are automatically getting their "name()"-Method called in order to deliver an OreDict String.
+ * <p/>
+ * Lowercase Letters are reserved for Tools. They are as follows:
+ * <p/>
+ * 'b' ToolDictNames.craftingToolBlade 'c' ToolDictNames.craftingToolCrowbar, 'd'
+ * ToolDictNames.craftingToolScrewdriver, 'f' ToolDictNames.craftingToolFile, 'h'
+ * ToolDictNames.craftingToolHardHammer, 'i' ToolDictNames.craftingToolSolderingIron, 'j'
+ * ToolDictNames.craftingToolSolderingMetal, 'k' ToolDictNames.craftingToolKnive 'm'
+ * ToolDictNames.craftingToolMortar, 'p' ToolDictNames.craftingToolDrawplate, 'r'
+ * ToolDictNames.craftingToolSoftHammer, 's' ToolDictNames.craftingToolSaw, 'w' ToolDictNames.craftingToolWrench,
+ * 'x' ToolDictNames.craftingToolWireCutter,
+ */
+ public static boolean addCraftingRecipe(ItemStack aResult, Object[] aRecipe) {
+ return addCraftingRecipe(aResult, 0, aRecipe);
+ }
+
+ /**
+ * Regular Crafting Recipes. Deletes conflicting Recipes too.
+ * <p/>
+ * You can insert instances of IItemContainer into the Recipe Input Array directly without having to call "get(1)"
+ * on them.
+ * <p/>
+ * Enums are automatically getting their "name()"-Method called in order to deliver an OreDict String.
+ * <p/>
+ * Lowercase Letters are reserved for Tools. They are as follows:
+ * <p/>
+ * 'b' ToolDictNames.craftingToolBlade 'c' ToolDictNames.craftingToolCrowbar, 'd'
+ * ToolDictNames.craftingToolScrewdriver, 'f' ToolDictNames.craftingToolFile, 'h'
+ * ToolDictNames.craftingToolHardHammer, 'i' ToolDictNames.craftingToolSolderingIron, 'j'
+ * ToolDictNames.craftingToolSolderingMetal, 'k' ToolDictNames.craftingToolKnive 'm'
+ * ToolDictNames.craftingToolMortar, 'p' ToolDictNames.craftingToolDrawplate, 'r'
+ * ToolDictNames.craftingToolSoftHammer, 's' ToolDictNames.craftingToolSaw, 'w' ToolDictNames.craftingToolWrench,
+ * 'x' ToolDictNames.craftingToolWireCutter,
+ */
+ public static boolean addCraftingRecipe(ItemStack aResult, long aBitMask, Object[] aRecipe) {
+ return addCraftingRecipe(
+ aResult,
+ new Enchantment[0],
+ new int[0],
+ (aBitMask & RecipeBits.MIRRORED) != 0,
+ (aBitMask & RecipeBits.BUFFERED) != 0,
+ (aBitMask & RecipeBits.KEEPNBT) != 0,
+ (aBitMask & RecipeBits.DISMANTLEABLE) != 0,
+ (aBitMask & RecipeBits.NOT_REMOVABLE) == 0,
+ (aBitMask & RecipeBits.REVERSIBLE) != 0,
+ (aBitMask & RecipeBits.DELETE_ALL_OTHER_RECIPES) != 0,
+ (aBitMask & RecipeBits.DELETE_ALL_OTHER_RECIPES_IF_SAME_NBT) != 0,
+ (aBitMask & RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES) != 0,
+ (aBitMask & RecipeBits.DELETE_ALL_OTHER_NATIVE_RECIPES) != 0,
+ (aBitMask & RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS) == 0,
+ (aBitMask & RecipeBits.ONLY_ADD_IF_THERE_IS_ANOTHER_RECIPE_FOR_IT) != 0,
+ (aBitMask & RecipeBits.ONLY_ADD_IF_RESULT_IS_NOT_NULL) != 0,
+ aRecipe);
+ }
+
+ /**
+ * Internal realisation of the Crafting Recipe adding Process.
+ */
+ private static boolean addCraftingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded,
+ int[] aEnchantmentLevelsAdded, boolean aMirrored, boolean aBuffered, boolean aKeepNBT, boolean aDismantleable,
+ boolean aRemovable, boolean aReversible, boolean aRemoveAllOthersWithSameOutput,
+ boolean aRemoveAllOthersWithSameOutputIfTheyHaveSameNBT, boolean aRemoveAllOtherShapedsWithSameOutput,
+ boolean aRemoveAllOtherNativeRecipes, boolean aCheckForCollisions,
+ boolean aOnlyAddIfThereIsAnyRecipeOutputtingThis, boolean aOnlyAddIfResultIsNotNull, Object[] aRecipe) {
+
+ aResult = GT_OreDictUnificator.get(true, aResult);
+ if (aOnlyAddIfResultIsNotNull && aResult == null) return false;
+ if (aResult != null && Items.feather.getDamage(aResult) == W) Items.feather.setDamage(aResult, 0);
+ if (aRecipe == null || aRecipe.length == 0) return false;
+
+ // The renamed variable clarifies what's happening
+ // noinspection UnnecessaryLocalVariable
+ boolean tDoWeCareIfThereWasARecipe = aOnlyAddIfThereIsAnyRecipeOutputtingThis;
+ boolean tThereWasARecipe = false;
+
+ for (byte i = 0; i < aRecipe.length; i++) {
+ if (aRecipe[i] instanceof IItemContainer) aRecipe[i] = ((IItemContainer) aRecipe[i]).get(1);
+ else if (aRecipe[i] instanceof Enum) aRecipe[i] = ((Enum<?>) aRecipe[i]).name();
+ else if (!(aRecipe[i] == null || aRecipe[i] instanceof ItemStack
+ || aRecipe[i] instanceof ItemData
+ || aRecipe[i] instanceof String
+ || aRecipe[i] instanceof Character)) aRecipe[i] = aRecipe[i].toString();
+ }
+
+ try {
+ StringBuilder shape = new StringBuilder(E);
+ int idx = 0;
+ if (aRecipe[idx] instanceof Boolean) {
+ throw new IllegalArgumentException();
+ }
+
+ ArrayList<Object> tRecipeList = new ArrayList<>(Arrays.asList(aRecipe));
+
+ while (aRecipe[idx] instanceof String) {
+ StringBuilder s = new StringBuilder((String) aRecipe[idx++]);
+ shape.append(s);
+ while (s.length() < 3) s.append(" ");
+ if (s.length() > 3) throw new IllegalArgumentException();
+
+ for (char c : s.toString()
+ .toCharArray()) {
+ switch (c) {
+ case 'b' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolBlade.name());
+ }
+ case 'c' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolCrowbar.name());
+ }
+ case 'd' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolScrewdriver.name());
+ }
+ case 'f' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolFile.name());
+ }
+ case 'h' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolHardHammer.name());
+ }
+ case 'i' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolSolderingIron.name());
+ }
+ case 'j' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolSolderingMetal.name());
+ }
+ case 'k' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolKnife.name());
+ }
+ case 'm' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolMortar.name());
+ }
+ case 'p' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolDrawplate.name());
+ }
+ case 'r' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolSoftHammer.name());
+ }
+ case 's' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolSaw.name());
+ }
+ case 'w' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolWrench.name());
+ }
+ case 'x' -> {
+ tRecipeList.add(c);
+ tRecipeList.add(ToolDictNames.craftingToolWireCutter.name());
+ }
+ }
+ }
+ }
+
+ aRecipe = tRecipeList.toArray();
+
+ if (aRecipe[idx] instanceof Boolean) {
+ idx++;
+ }
+ Map<Character, ItemStack> tItemStackMap = new HashMap<>();
+ Map<Character, ItemData> tItemDataMap = new HashMap<>();
+ tItemStackMap.put(' ', null);
+
+ boolean tRemoveRecipe = true;
+
+ for (; idx < aRecipe.length; idx += 2) {
+ if (aRecipe[idx] == null || aRecipe[idx + 1] == null) {
+ if (D1) {
+ GT_Log.err.println(
+ "WARNING: Missing Item for shaped Recipe: "
+ + (aResult == null ? "null" : aResult.getDisplayName()));
+ for (Object tContent : aRecipe) GT_Log.err.println(tContent);
+ }
+ return false;
+ }
+ Character chr = (Character) aRecipe[idx];
+ Object in = aRecipe[idx + 1];
+ if (in instanceof ItemStack is) {
+ tItemStackMap.put(chr, GT_Utility.copyOrNull(is));
+ tItemDataMap.put(chr, GT_OreDictUnificator.getItemData(is));
+ } else if (in instanceof ItemData) {
+ String tString = in.toString();
+ switch (tString) {
+ case "plankWood" -> tItemDataMap.put(chr, new ItemData(Materials.Wood, M));
+ case "stoneNetherrack" -> tItemDataMap.put(chr, new ItemData(Materials.Netherrack, M));
+ case "stoneObsidian" -> tItemDataMap.put(chr, new ItemData(Materials.Obsidian, M));
+ case "stoneEndstone" -> tItemDataMap.put(chr, new ItemData(Materials.Endstone, M));
+ default -> tItemDataMap.put(chr, (ItemData) in);
+ }
+ ItemStack tStack = GT_OreDictUnificator.getFirstOre(in, 1);
+ if (tStack == null) tRemoveRecipe = false;
+ else tItemStackMap.put(chr, tStack);
+ in = aRecipe[idx + 1] = in.toString();
+ } else if (in instanceof String) {
+ if (in.equals(OreDictNames.craftingChest.toString()))
+ tItemDataMap.put(chr, new ItemData(Materials.Wood, M * 8));
+ else if (in.equals(OreDictNames.craftingBook.toString()))
+ tItemDataMap.put(chr, new ItemData(Materials.Paper, M * 3));
+ else if (in.equals(OreDictNames.craftingPiston.toString()))
+ tItemDataMap.put(chr, new ItemData(Materials.Stone, M * 4, Materials.Wood, M * 3));
+ else if (in.equals(OreDictNames.craftingFurnace.toString()))
+ tItemDataMap.put(chr, new ItemData(Materials.Stone, M * 8));
+ else if (in.equals(OreDictNames.craftingIndustrialDiamond.toString()))
+ tItemDataMap.put(chr, new ItemData(Materials.Diamond, M));
+ else if (in.equals(OreDictNames.craftingAnvil.toString()))
+ tItemDataMap.put(chr, new ItemData(Materials.Iron, M * 10));
+ ItemStack tStack = GT_OreDictUnificator.getFirstOre(in, 1);
+ if (tStack == null) tRemoveRecipe = false;
+ else tItemStackMap.put(chr, tStack);
+ } else {
+ throw new IllegalArgumentException();
+ }
+ }
+
+ if (aReversible && aResult != null) {
+ ItemData[] tData = new ItemData[9];
+ int x = -1;
+ for (char chr : shape.toString()
+ .toCharArray()) tData[++x] = tItemDataMap.get(chr);
+ if (GT_Utility.arrayContainsNonNull(tData))
+ GT_OreDictUnificator.addItemData(aResult, new ItemData(tData));
+ }
+
+ if (aCheckForCollisions && tRemoveRecipe) {
+ ItemStack[] tRecipe = new ItemStack[9];
+ int x = -1;
+ for (char chr : shape.toString()
+ .toCharArray()) {
+ tRecipe[++x] = tItemStackMap.get(chr);
+ if (tRecipe[x] != null && Items.feather.getDamage(tRecipe[x]) == W)
+ Items.feather.setDamage(tRecipe[x], 0);
+ }
+ if (tDoWeCareIfThereWasARecipe || !aBuffered) tThereWasARecipe = removeRecipe(tRecipe) != null;
+ else removeRecipeDelayed(tRecipe);
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+
+ if (aResult == null || aResult.stackSize <= 0) return false;
+
+ if (aRemoveAllOthersWithSameOutput || aRemoveAllOthersWithSameOutputIfTheyHaveSameNBT
+ || aRemoveAllOtherShapedsWithSameOutput
+ || aRemoveAllOtherNativeRecipes) {
+ if (tDoWeCareIfThereWasARecipe || !aBuffered) tThereWasARecipe = removeRecipeByOutput(
+ aResult,
+ !aRemoveAllOthersWithSameOutputIfTheyHaveSameNBT,
+ aRemoveAllOtherShapedsWithSameOutput,
+ aRemoveAllOtherNativeRecipes) || tThereWasARecipe;
+ else removeRecipeByOutputDelayed(aResult);
+ }
+
+ if (aOnlyAddIfThereIsAnyRecipeOutputtingThis && !tDoWeCareIfThereWasARecipe && !tThereWasARecipe) {
+ ArrayList<IRecipe> tList = (ArrayList<IRecipe>) CraftingManager.getInstance()
+ .getRecipeList();
+ int tList_sS = tList.size();
+ for (int i = 0; i < tList_sS && !tThereWasARecipe; i++) {
+ IRecipe tRecipe = tList.get(i);
+ if (sSpecialRecipeClasses.contains(
+ tRecipe.getClass()
+ .getName()))
+ continue;
+ if (GT_Utility.areStacksEqual(GT_OreDictUnificator.get(tRecipe.getRecipeOutput()), aResult, true)) {
+ tList.remove(i--);
+ tList_sS = tList.size();
+ tThereWasARecipe = true;
+ }
+ }
+ }
+
+ if (Items.feather.getDamage(aResult) == W || Items.feather.getDamage(aResult) < 0)
+ Items.feather.setDamage(aResult, 0);
+
+ GT_Utility.updateItemStack(aResult);
+
+ if (tThereWasARecipe || !aOnlyAddIfThereIsAnyRecipeOutputtingThis) {
+ if (sBufferCraftingRecipes && aBuffered) sBufferRecipeList.add(
+ new GT_Shaped_Recipe(
+ GT_Utility.copyOrNull(aResult),
+ aDismantleable,
+ aRemovable,
+ aKeepNBT,
+ aEnchantmentsAdded,
+ aEnchantmentLevelsAdded,
+ aRecipe).setMirrored(aMirrored));
+ else GameRegistry.addRecipe(
+ new GT_Shaped_Recipe(
+ GT_Utility.copyOrNull(aResult),
+ aDismantleable,
+ aRemovable,
+ aKeepNBT,
+ aEnchantmentsAdded,
+ aEnchantmentLevelsAdded,
+ aRecipe).setMirrored(aMirrored));
+ }
+ return true;
+ }
+
+ /**
+ * Shapeless Crafting Recipes. Deletes conflicting Recipes too.
+ */
+ public static boolean addShapelessEnchantingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded,
+ int[] aEnchantmentLevelsAdded, Object[] aRecipe) {
+ return addShapelessCraftingRecipe(
+ aResult,
+ aEnchantmentsAdded,
+ aEnchantmentLevelsAdded,
+ true,
+ false,
+ false,
+ false,
+ aRecipe);
+ }
+
+ /**
+ * Shapeless Crafting Recipes. Deletes conflicting Recipes too.
+ */
+ public static boolean addShapelessCraftingRecipe(ItemStack aResult, Object[] aRecipe) {
+ return addShapelessCraftingRecipe(
+ aResult,
+ RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | RecipeBits.BUFFERED,
+ aRecipe);
+ }
+
+ /**
+ * Shapeless Crafting Recipes. Deletes conflicting Recipes too.
+ */
+ public static boolean addShapelessCraftingRecipe(ItemStack aResult, long aBitMask, Object[] aRecipe) {
+ return addShapelessCraftingRecipe(
+ aResult,
+ new Enchantment[0],
+ new int[0],
+ (aBitMask & RecipeBits.BUFFERED) != 0,
+ (aBitMask & RecipeBits.KEEPNBT) != 0,
+ (aBitMask & RecipeBits.DISMANTLEABLE) != 0,
+ (aBitMask & RecipeBits.NOT_REMOVABLE) == 0,
+ aRecipe);
+ }
+
+ /**
+ * Shapeless Crafting Recipes. Deletes conflicting Recipes too.
+ */
+ private static boolean addShapelessCraftingRecipe(ItemStack aResult, Enchantment[] aEnchantmentsAdded,
+ int[] aEnchantmentLevelsAdded, boolean aBuffered, boolean aKeepNBT, boolean aDismantleable, boolean aRemovable,
+ Object[] aRecipe) {
+ aResult = GT_OreDictUnificator.get(true, aResult);
+ if (aRecipe == null || aRecipe.length == 0) return false;
+ for (byte i = 0; i < aRecipe.length; i++) {
+ if (aRecipe[i] instanceof IItemContainer) aRecipe[i] = ((IItemContainer) aRecipe[i]).get(1);
+ else if (aRecipe[i] instanceof Enum) aRecipe[i] = ((Enum<?>) aRecipe[i]).name();
+ else if (!(aRecipe[i] == null || aRecipe[i] instanceof ItemStack
+ || aRecipe[i] instanceof String
+ || aRecipe[i] instanceof Character)) aRecipe[i] = aRecipe[i].toString();
+ }
+ try {
+ ItemStack[] tRecipe = new ItemStack[9];
+ int i = 0;
+ for (Object tObject : aRecipe) {
+ if (tObject == null) {
+ if (D1) GT_Log.err.println(
+ "WARNING: Missing Item for shapeless Recipe: "
+ + (aResult == null ? "null" : aResult.getDisplayName()));
+ for (Object tContent : aRecipe) GT_Log.err.println(tContent);
+ return false;
+ }
+ if (tObject instanceof ItemStack) {
+ tRecipe[i] = (ItemStack) tObject;
+ } else if (tObject instanceof String) {
+ tRecipe[i] = GT_OreDictUnificator.getFirstOre(tObject, 1);
+ if (tRecipe[i] == null) break;
+ }
+ i++;
+ }
+ if (sBufferCraftingRecipes && aBuffered) removeRecipeDelayed(tRecipe);
+ else removeRecipe(tRecipe);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+
+ if (aResult == null || aResult.stackSize <= 0) return false;
+
+ if (Items.feather.getDamage(aResult) == W || Items.feather.getDamage(aResult) < 0)
+ Items.feather.setDamage(aResult, 0);
+
+ GT_Utility.updateItemStack(aResult);
+
+ if (sBufferCraftingRecipes && aBuffered) sBufferRecipeList.add(
+ new GT_Shapeless_Recipe(
+ GT_Utility.copyOrNull(aResult),
+ aDismantleable,
+ aRemovable,
+ aKeepNBT,
+ aEnchantmentsAdded,
+ aEnchantmentLevelsAdded,
+ aRecipe));
+ else GameRegistry.addRecipe(
+ new GT_Shapeless_Recipe(
+ GT_Utility.copyOrNull(aResult),
+ aDismantleable,
+ aRemovable,
+ aKeepNBT,
+ aEnchantmentsAdded,
+ aEnchantmentLevelsAdded,
+ aRecipe));
+ return true;
+ }
+
+ /**
+ * Removes a Smelting Recipe
+ */
+ public static boolean removeFurnaceSmelting(ItemStack aInput) {
+ if (aInput != null) {
+ for (ItemStack tInput : FurnaceRecipes.smelting()
+ .getSmeltingList()
+ .keySet()) {
+ if (GT_Utility.isStackValid(tInput) && GT_Utility.areStacksEqual(aInput, tInput, true)) {
+ FurnaceRecipes.smelting()
+ .getSmeltingList()
+ .remove(tInput);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Removes all matching Smelting Recipes by output
+ */
+ public static boolean removeFurnaceSmeltingByOutput(ItemStack aOutput) {
+ if (aOutput != null) {
+ return FurnaceRecipes.smelting()
+ .getSmeltingList()
+ .values()
+ .removeIf(
+ tOutput -> GT_Utility.isStackValid(tOutput) && GT_Utility.areStacksEqual(aOutput, tOutput, true));
+ }
+ return false;
+ }
+
+ /**
+ * Removes a Crafting Recipe and gives you the former output of it.
+ *
+ * @param aRecipe The content of the Crafting Grid as ItemStackArray with length 9
+ * @return the output of the old Recipe or null if there was nothing.
+ */
+ public static ItemStack removeRecipe(ItemStack... aRecipe) {
+ if (aRecipe == null) return null;
+ if (Arrays.stream(aRecipe)
+ .noneMatch(Objects::nonNull)) return null;
+
+ ItemStack rReturn = null;
+ InventoryCrafting aCrafting = new InventoryCrafting(new Container() {
+
+ @Override
+ public boolean canInteractWith(EntityPlayer player) {
+ return false;
+ }
+ }, 3, 3);
+ for (int i = 0; i < aRecipe.length && i < 9; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]);
+ ArrayList<IRecipe> tList = (ArrayList<IRecipe>) CraftingManager.getInstance()
+ .getRecipeList();
+ int tList_sS = tList.size();
+ try {
+ for (int i = 0; i < tList_sS; i++) {
+ for (; i < tList_sS; i++) {
+ if ((!(tList.get(i) instanceof IGT_CraftingRecipe)
+ || ((IGT_CraftingRecipe) tList.get(i)).isRemovable()) && tList.get(i)
+ .matches(aCrafting, DW)) {
+ rReturn = tList.get(i)
+ .getCraftingResult(aCrafting);
+ if (rReturn != null) tList.remove(i--);
+ tList_sS = tList.size();
+ }
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ return rReturn;
+ }
+
+ public static void removeRecipeDelayed(ItemStack... aRecipe) {
+ if (!sBufferCraftingRecipes) {
+ removeRecipe(aRecipe);
+ return;
+ }
+
+ if (aRecipe == null) return;
+ if (Arrays.stream(aRecipe)
+ .noneMatch(Objects::nonNull)) return;
+
+ InventoryCrafting aCrafting = new InventoryCrafting(new Container() {
+
+ @Override
+ public boolean canInteractWith(EntityPlayer player) {
+ return false;
+ }
+ }, 3, 3);
+ for (int i = 0; i < aRecipe.length && i < 9; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]);
+ delayedRemovalByRecipe.add(aCrafting);
+ }
+
+ public static void bulkRemoveByRecipe(List<InventoryCrafting> toRemove) {
+ ArrayList<IRecipe> tList = (ArrayList<IRecipe>) CraftingManager.getInstance()
+ .getRecipeList();
+ GT_FML_LOGGER.info("BulkRemoveByRecipe: tList: " + tList.size() + " toRemove: " + toRemove.size());
+
+ Set<IRecipe> tListToRemove = tList.parallelStream()
+ .filter(tRecipe -> {
+ if ((tRecipe instanceof IGT_CraftingRecipe) && !((IGT_CraftingRecipe) tRecipe).isRemovable())
+ return false;
+ return toRemove.stream()
+ .anyMatch(aCrafting -> tRecipe.matches(aCrafting, DW));
+ })
+ .collect(Collectors.toSet());
+
+ tList.removeIf(tListToRemove::contains);
+ }
+
+ public static boolean removeRecipeByOutputDelayed(ItemStack aOutput) {
+ if (sBufferCraftingRecipes) return delayedRemovalByOutput.add(aOutput);
+ else return removeRecipeByOutput(aOutput);
+ }
+
+ public static boolean removeRecipeByOutputDelayed(ItemStack aOutput, boolean aIgnoreNBT,
+ boolean aNotRemoveShapelessRecipes, boolean aOnlyRemoveNativeHandlers) {
+ if (sBufferCraftingRecipes && (aIgnoreNBT && !aNotRemoveShapelessRecipes && !aOnlyRemoveNativeHandlers))
+ // Too lazy to handle deferred versions of the parameters that aren't used very often
+ return delayedRemovalByOutput.add(aOutput);
+ else return removeRecipeByOutput(aOutput, aIgnoreNBT, aNotRemoveShapelessRecipes, aOnlyRemoveNativeHandlers);
+ }
+
+ public static boolean removeRecipeByOutput(ItemStack aOutput) {
+ return removeRecipeByOutput(aOutput, true, false, false);
+ }
+
+ /**
+ * Removes a Crafting Recipe.
+ *
+ * @param aOutput The output of the Recipe.
+ * @return if it has removed at least one Recipe.
+ */
+ public static boolean removeRecipeByOutput(ItemStack aOutput, boolean aIgnoreNBT,
+ boolean aNotRemoveShapelessRecipes, boolean aOnlyRemoveNativeHandlers) {
+ if (aOutput == null) return false;
+ boolean rReturn = false;
+ final ArrayList<IRecipe> tList = (ArrayList<IRecipe>) CraftingManager.getInstance()
+ .getRecipeList();
+ aOutput = GT_OreDictUnificator.get(aOutput);
+ int tList_sS = tList.size();
+ for (int i = 0; i < tList_sS; i++) {
+ final IRecipe tRecipe = tList.get(i);
+ if (aNotRemoveShapelessRecipes
+ && (tRecipe instanceof ShapelessRecipes || tRecipe instanceof ShapelessOreRecipe)) continue;
+ if (aOnlyRemoveNativeHandlers) {
+ if (!sNativeRecipeClasses.contains(
+ tRecipe.getClass()
+ .getName()))
+ continue;
+ } else {
+ if (sSpecialRecipeClasses.contains(
+ tRecipe.getClass()
+ .getName()))
+ continue;
+ }
+ ItemStack tStack = tRecipe.getRecipeOutput();
+ if ((!(tRecipe instanceof IGT_CraftingRecipe) || ((IGT_CraftingRecipe) tRecipe).isRemovable())
+ && GT_Utility.areStacksEqual(GT_OreDictUnificator.get(tStack), aOutput, aIgnoreNBT)) {
+ tList.remove(i--);
+ tList_sS = tList.size();
+ rReturn = true;
+ }
+ }
+ return rReturn;
+ }
+
+ public static boolean bulkRemoveRecipeByOutput(List<ItemStack> toRemove) {
+ ArrayList<IRecipe> tList = (ArrayList<IRecipe>) CraftingManager.getInstance()
+ .getRecipeList();
+
+ Set<ItemStack> setToRemove = toRemove.parallelStream()
+ .map(GT_OreDictUnificator::get_nocopy)
+ .collect(Collectors.toSet());
+
+ GT_FML_LOGGER.info("BulkRemoveRecipeByOutput: tList: " + tList.size() + " setToRemove: " + setToRemove.size());
+
+ Set<IRecipe> tListToRemove = tList.parallelStream()
+ .filter(tRecipe -> {
+ if ((tRecipe instanceof IGT_CraftingRecipe) && !((IGT_CraftingRecipe) tRecipe).isRemovable())
+ return false;
+ if (sSpecialRecipeClasses.contains(
+ tRecipe.getClass()
+ .getName()))
+ return false;
+ final ItemStack tStack = GT_OreDictUnificator.get_nocopy(tRecipe.getRecipeOutput());
+ return setToRemove.stream()
+ .anyMatch(aOutput -> GT_Utility.areStacksEqual(tStack, aOutput, true));
+ })
+ .collect(Collectors.toSet());
+
+ tList.removeIf(tListToRemove::contains);
+ return true;
+ }
+
+ /**
+ * Checks all Crafting Handlers for Recipe Output Used for the Autocrafting Table
+ */
+ public static ItemStack getAllRecipeOutput(World aWorld, ItemStack... aRecipe) {
+ if (aRecipe == null || aRecipe.length == 0) return null;
+
+ if (aWorld == null) aWorld = DW;
+
+ boolean temp = false;
+ for (ItemStack itemStack : aRecipe) {
+ if (itemStack != null) {
+ temp = true;
+ break;
+ }
+ }
+ if (!temp) return null;
+ InventoryCrafting aCrafting = new InventoryCrafting(new Container() {
+
+ @Override
+ public boolean canInteractWith(EntityPlayer player) {
+ return false;
+ }
+ }, 3, 3);
+ for (int i = 0; i < 9 && i < aRecipe.length; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]);
+ List<IRecipe> tList = CraftingManager.getInstance()
+ .getRecipeList();
+ synchronized (sAllRecipeList) {
+ if (sAllRecipeList.size() != tList.size()) {
+ sAllRecipeList.clear();
+ sAllRecipeList.addAll(tList);
+ }
+ for (int i = 0, j = sAllRecipeList.size(); i < j; i++) {
+ IRecipe tRecipe = sAllRecipeList.get(i);
+ if (tRecipe.matches(aCrafting, aWorld)) {
+ if (i > 10) {
+ sAllRecipeList.remove(i);
+ sAllRecipeList.add(i - 10, tRecipe);
+ }
+ return tRecipe.getCraftingResult(aCrafting);
+ }
+ }
+ }
+
+ int tIndex = 0;
+ ItemStack tStack1 = null, tStack2 = null;
+ for (int i = 0, j = aCrafting.getSizeInventory(); i < j; i++) {
+ ItemStack tStack = aCrafting.getStackInSlot(i);
+ if (tStack != null) {
+ if (tIndex == 0) tStack1 = tStack;
+ if (tIndex == 1) tStack2 = tStack;
+ tIndex++;
+ }
+ }
+
+ if (tIndex == 2 && tStack2 != null) {
+ if (tStack1.getItem() == tStack2.getItem() && tStack1.stackSize == 1
+ && tStack2.stackSize == 1
+ && tStack1.getItem()
+ .isRepairable()) {
+ int tNewDamage = tStack1.getMaxDamage() + tStack1.getItemDamage()
+ - tStack2.getItemDamage()
+ + tStack1.getMaxDamage() / 20;
+ return new ItemStack(tStack1.getItem(), 1, Math.max(tNewDamage, 0));
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Gives you a copy of the Output from a Crafting Recipe Used for Recipe Detection.
+ */
+ public static ItemStack getRecipeOutput(ItemStack... aRecipe) {
+ return getRecipeOutput(false, true, aRecipe);
+ }
+
+ public static ItemStack getRecipeOutputNoOreDict(ItemStack... aRecipe) {
+ return getRecipeOutput(false, false, aRecipe);
+ }
+
+ public static ItemStack getRecipeOutput(boolean aUncopiedStack, ItemStack... aRecipe) {
+ return getRecipeOutput(aUncopiedStack, true, aRecipe);
+ }
+
+ /**
+ * Gives you a copy of the Output from a Crafting Recipe Used for Recipe Detection.
+ */
+ public static ItemStack getRecipeOutput(boolean aUncopiedStack, boolean allowOreDict, ItemStack... aRecipe) {
+ if (aRecipe == null || Arrays.stream(aRecipe)
+ .noneMatch(Objects::nonNull)) return null;
+
+ InventoryCrafting aCrafting = new InventoryCrafting(new Container() {
+
+ @Override
+ public boolean canInteractWith(EntityPlayer player) {
+ return false;
+ }
+ }, 3, 3);
+ for (int i = 0; i < 9 && i < aRecipe.length; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]);
+ ArrayList<IRecipe> tList = (ArrayList<IRecipe>) CraftingManager.getInstance()
+ .getRecipeList();
+ boolean found = false;
+
+ for (IRecipe iRecipe : tList) {
+ found = false;
+ if (!allowOreDict && iRecipe instanceof ShapedOreRecipe) continue;
+
+ try {
+ found = iRecipe.matches(aCrafting, DW);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ if (found) {
+ ItemStack tOutput = aUncopiedStack ? iRecipe.getRecipeOutput() : iRecipe.getCraftingResult(aCrafting);
+ if (tOutput == null || tOutput.stackSize <= 0) {
+ // Seriously, who would ever do that shit?
+ if (!GregTech_API.sPostloadFinished) throw new GT_ItsNotMyFaultException(
+ "Seems another Mod added a Crafting Recipe with null Output. Tell the Developer of said Mod to fix that.");
+ } else {
+ if (aUncopiedStack) return tOutput;
+ return GT_Utility.copyOrNull(tOutput);
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Gives you a list of the Outputs from a Crafting Recipe If you have multiple Mods, which add Bronze Armor for
+ * example This also removes old Recipes from the List.
+ */
+ public static List<ItemStack> getVanillyToolRecipeOutputs(ItemStack... aRecipe) {
+ if (!GregTech_API.sPostloadStarted || GregTech_API.sPostloadFinished)
+ sSingleNonBlockDamagableRecipeList.clear();
+ if (sSingleNonBlockDamagableRecipeList.isEmpty()) {
+ for (IRecipe tRecipe : CraftingManager.getInstance()
+ .getRecipeList()) {
+ ItemStack tStack = tRecipe.getRecipeOutput();
+ if (GT_Utility.isStackValid(tStack) && tStack.getMaxStackSize() == 1
+ && tStack.getMaxDamage() > 0
+ && !(tStack.getItem() instanceof ItemBlock)
+ && !(tStack.getItem() instanceof IReactorComponent)
+ && !isElectricItem(tStack)
+ && !GT_Utility.isStackInList(tStack, sNonReplaceableItems)) {
+ if (!(tRecipe instanceof ShapelessRecipes || tRecipe instanceof ShapelessOreRecipe)) {
+ if (tRecipe instanceof ShapedOreRecipe) {
+ boolean temp = true;
+ for (Object tObject : ((ShapedOreRecipe) tRecipe).getInput()) if (tObject != null) {
+ if (tObject instanceof ItemStack && (((ItemStack) tObject).getItem() == null
+ || ((ItemStack) tObject).getMaxStackSize() < 2
+ || ((ItemStack) tObject).getMaxDamage() > 0
+ || ((ItemStack) tObject).getItem() instanceof ItemBlock)) {
+ temp = false;
+ break;
+ }
+ if (tObject instanceof List && ((List<?>) tObject).isEmpty()) {
+ temp = false;
+ break;
+ }
+ }
+ if (temp) sSingleNonBlockDamagableRecipeList.add(tRecipe);
+ } else if (tRecipe instanceof ShapedRecipes) {
+ boolean temp = true;
+ for (ItemStack tObject : ((ShapedRecipes) tRecipe).recipeItems) {
+ if (tObject != null && (tObject.getItem() == null || tObject.getMaxStackSize() < 2
+ || tObject.getMaxDamage() > 0
+ || tObject.getItem() instanceof ItemBlock)) {
+ temp = false;
+ break;
+ }
+ }
+ if (temp) sSingleNonBlockDamagableRecipeList.add(tRecipe);
+ } else {
+ sSingleNonBlockDamagableRecipeList.add(tRecipe);
+ }
+ }
+ }
+ }
+ GT_Log.out.println(
+ "GT_Mod: Created a List of Tool Recipes containing " + sSingleNonBlockDamagableRecipeList.size()
+ + " Recipes for recycling."
+ + (sSingleNonBlockDamagableRecipeList.size() > 1024
+ ? " Scanning all these Recipes is the reason for the startup Lag you receive right now."
+ : E));
+ }
+ List<ItemStack> rList = getRecipeOutputs(sSingleNonBlockDamagableRecipeList, true, aRecipe);
+ if (!GregTech_API.sPostloadStarted || GregTech_API.sPostloadFinished)
+ sSingleNonBlockDamagableRecipeList.clear();
+ return rList;
+ }
+
+ /**
+ * Gives you a list of the Outputs from a Crafting Recipe If you have multiple Mods, which add Bronze Armor for
+ * example
+ */
+ public static List<ItemStack> getRecipeOutputs(ItemStack... aRecipe) {
+ return getRecipeOutputs(
+ CraftingManager.getInstance()
+ .getRecipeList(),
+ false,
+ aRecipe);
+ }
+
+ private static List<IRecipe> bufferedRecipes = null;
+
+ /**
+ * Gives you a list of the Outputs from a Crafting Recipe If you have multiple Mods, which add Bronze Armor for
+ * example Buffers a List which only has armor-alike crafting in it
+ */
+ public static List<ItemStack> getRecipeOutputsBuffered(ItemStack... aRecipe) {
+
+ if (bufferedRecipes == null) bufferedRecipes = CraftingManager.getInstance()
+ .getRecipeList()
+ .stream()
+ .filter(
+ tRecipe -> !(tRecipe instanceof ShapelessRecipes) && !(tRecipe instanceof ShapelessOreRecipe)
+ && !(tRecipe instanceof IGT_CraftingRecipe))
+ .filter(tRecipe -> {
+ try {
+ ItemStack tOutput = tRecipe.getRecipeOutput();
+ if (tOutput.stackSize == 1 && tOutput.getMaxDamage() > 0 && tOutput.getMaxStackSize() == 1) {
+ return true;
+ }
+ } catch (Exception ignored) {}
+ return false;
+ })
+ .collect(Collectors.toList());
+ return getRecipeOutputs(bufferedRecipes, false, aRecipe);
+ }
+
+ /**
+ * Gives you a list of the Outputs from a Crafting Recipe If you have multiple Mods, which add Bronze Armor for
+ * example
+ */
+ public static List<ItemStack> getRecipeOutputs(List<IRecipe> aList, boolean aDeleteFromList, ItemStack... aRecipe) {
+ List<ItemStack> rList = new ArrayList<>();
+ if (aRecipe == null || Arrays.stream(aRecipe)
+ .noneMatch(Objects::nonNull)) return rList;
+ InventoryCrafting aCrafting = new InventoryCrafting(new Container() {
+
+ @Override
+ public boolean canInteractWith(EntityPlayer player) {
+ return false;
+ }
+ }, 3, 3);
+ for (int i = 0; i < 9 && i < aRecipe.length; i++) aCrafting.setInventorySlotContents(i, aRecipe[i]);
+ if (!aDeleteFromList) {
+ HashSet<ItemStack> stacks = new HashSet<>();
+ aList.stream()
+ .filter(tRecipe -> {
+ if (tRecipe instanceof ShapelessRecipes || tRecipe instanceof ShapelessOreRecipe
+ || tRecipe instanceof IGT_CraftingRecipe) return false;
+ try {
+ return tRecipe.matches(aCrafting, DW);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ return false;
+ }
+ })
+ .forEach(tRecipe -> stacks.add(tRecipe.getCraftingResult(aCrafting)));
+ rList = stacks.stream()
+ .filter(
+ tOutput -> tOutput.stackSize == 1 && tOutput.getMaxDamage() > 0 && tOutput.getMaxStackSize() == 1)
+ .collect(Collectors.toList());
+ } else for (Iterator<IRecipe> iterator = aList.iterator(); iterator.hasNext();) {
+ IRecipe tRecipe = iterator.next();
+ boolean matched = false;
+
+ try {
+ matched = tRecipe.matches(aCrafting, DW);
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ if (matched) {
+ ItemStack tOutput = tRecipe.getCraftingResult(aCrafting);
+
+ if (tOutput == null || tOutput.stackSize <= 0) {
+ // Seriously, who would ever do that shit?
+ if (!GregTech_API.sPostloadFinished) throw new GT_ItsNotMyFaultException(
+ "Seems another Mod added a Crafting Recipe with null Output. Tell the Developer of said Mod to fix that.");
+ continue;
+ }
+ if (tOutput.stackSize != 1) continue;
+ if (tOutput.getMaxDamage() <= 0) continue;
+ if (tOutput.getMaxStackSize() != 1) continue;
+ if (tRecipe instanceof ShapelessRecipes) continue;
+ if (tRecipe instanceof ShapelessOreRecipe) continue;
+ if (tRecipe instanceof IGT_CraftingRecipe) continue;
+ rList.add(GT_Utility.copyOrNull(tOutput));
+ iterator.remove();
+ }
+ }
+ return rList;
+ }
+
+ /**
+ * Used in my own Macerator. Decreases StackSize of the Input if wanted.
+ */
+ @Deprecated
+ public static ItemStack getMaceratorOutput(ItemStack aInput, boolean aRemoveInput, ItemStack aOutputSlot) {
+ return GT_Utility.copyOrNull(
+ getMachineOutput(aInput, getMaceratorRecipeList(), aRemoveInput, new NBTTagCompound(), aOutputSlot)[0]);
+ }
+
+ /**
+ * Used in my own Extractor. Decreases StackSize of the Input if wanted.
+ */
+ @Deprecated
+ public static ItemStack getExtractorOutput(ItemStack aInput, boolean aRemoveInput, ItemStack aOutputSlot) {
+ return GT_Utility.copyOrNull(
+ getMachineOutput(aInput, getExtractorRecipeList(), aRemoveInput, new NBTTagCompound(), aOutputSlot)[0]);
+ }
+
+ /**
+ * Used in my own Compressor. Decreases StackSize of the Input if wanted.
+ */
+ @Deprecated
+ public static ItemStack getCompressorOutput(ItemStack aInput, boolean aRemoveInput, ItemStack aOutputSlot) {
+ return GT_Utility.copyOrNull(
+ getMachineOutput(aInput, getCompressorRecipeList(), aRemoveInput, new NBTTagCompound(), aOutputSlot)[0]);
+ }
+
+ /**
+ * Used in my own Furnace.
+ */
+ public static ItemStack getSmeltingOutput(ItemStack aInput, boolean aRemoveInput, ItemStack aOutputSlot) {
+ if (aInput == null || aInput.stackSize < 1) return null;
+ ItemStack rStack = GT_OreDictUnificator.get(
+ FurnaceRecipes.smelting()
+ .getSmeltingResult(aInput));
+
+ if (rStack != null && (aOutputSlot == null || (GT_Utility.areStacksEqual(rStack, aOutputSlot)
+ && rStack.stackSize + aOutputSlot.stackSize <= aOutputSlot.getMaxStackSize()))) {
+ if (aRemoveInput) aInput.stackSize--;
+ return rStack;
+ }
+ return null;
+ }
+
+ /**
+ * Used in my own Machines. Decreases StackSize of the Input if wanted.
+ * <p/>
+ * Checks also if there is enough Space in the Output Slots.
+ */
+ public static ItemStack[] getMachineOutput(ItemStack aInput, Map<IRecipeInput, RecipeOutput> aRecipeList,
+ boolean aRemoveInput, NBTTagCompound rRecipeMetaData, ItemStack... aOutputSlots) {
+ if (aOutputSlots == null || aOutputSlots.length == 0) return new ItemStack[0];
+ if (aInput == null) return new ItemStack[aOutputSlots.length];
+ try {
+ for (Entry<IRecipeInput, RecipeOutput> tEntry : aRecipeList.entrySet()) {
+ if (tEntry.getKey()
+ .matches(aInput)) {
+ if (tEntry.getKey()
+ .getAmount() <= aInput.stackSize) {
+ ItemStack[] tList = tEntry.getValue().items.toArray(new ItemStack[0]);
+ if (tList.length == 0) break;
+ ItemStack[] rList = new ItemStack[aOutputSlots.length];
+ rRecipeMetaData.setTag("return", tEntry.getValue().metadata);
+ for (byte i = 0; i < aOutputSlots.length && i < tList.length; i++) {
+ if (tList[i] != null) {
+ if (aOutputSlots[i] == null || (GT_Utility.areStacksEqual(tList[i], aOutputSlots[i])
+ && tList[i].stackSize + aOutputSlots[i].stackSize
+ <= aOutputSlots[i].getMaxStackSize())) {
+ rList[i] = GT_Utility.copyOrNull(tList[i]);
+ } else {
+ return new ItemStack[aOutputSlots.length];
+ }
+ }
+ }
+
+ if (aRemoveInput) aInput.stackSize -= tEntry.getKey()
+ .getAmount();
+ return rList;
+ }
+ break;
+ }
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return new ItemStack[aOutputSlots.length];
+ }
+
+ /**
+ * Used in my own Recycler.
+ * <p/>
+ * Only produces Scrap if aScrapChance == 0. aScrapChance is usually the random Number I give to the Function If you
+ * directly insert 0 as aScrapChance then you can check if its Recycler-Blacklisted or similar
+ */
+ @Nullable
+ public static ItemStack getRecyclerOutput(ItemStack aInput, int aScrapChance) {
+ if (aInput == null || aScrapChance != 0) return null;
+ if (recyclerWhitelist == null) {
+ generateRecyclerCache();
+ }
+
+ if (recyclerWhitelist.isEmpty()) {
+ if (searchRecyclerCache(aInput, recyclerBlacklist)) {
+ return null;
+ } else {
+ return ItemList.IC2_Scrap.get(1);
+ }
+ } else {
+ if (searchRecyclerCache(aInput, recyclerWhitelist)) {
+ return ItemList.IC2_Scrap.get(1);
+ } else {
+ return null;
+ }
+ }
+ }
+
+ private static void generateRecyclerCache() {
+ recyclerWhitelist = new HashSet<>();
+ for (IRecipeInput input : ic2.api.recipe.Recipes.recyclerWhitelist) {
+ for (ItemStack stack : input.getInputs()) {
+ recyclerWhitelist.add(GT_Utility.ItemId.create(stack.getItem(), stack.getItemDamage(), null));
+ }
+ }
+ recyclerBlacklist = new HashSet<>();
+ for (IRecipeInput input : ic2.api.recipe.Recipes.recyclerBlacklist) {
+ for (ItemStack stack : input.getInputs()) {
+ recyclerBlacklist.add(GT_Utility.ItemId.create(stack.getItem(), stack.getItemDamage(), null));
+ }
+ }
+ }
+
+ private static boolean searchRecyclerCache(ItemStack stack, Set<GT_Utility.ItemId> set) {
+ if (set.contains(GT_Utility.ItemId.createWithoutNBT(stack))) {
+ return true;
+ }
+ // ic2.api.recipe.RecipeInputItemStack#matches expects item with wildcard meta to accept arbitrary meta
+ return set.contains(GT_Utility.ItemId.createAsWildcard(stack));
+ }
+
+ /**
+ * For the Scrapboxinator
+ */
+ public static ItemStack getRandomScrapboxDrop() {
+ return ic2.api.recipe.Recipes.scrapboxDrops.getDrop(ItemList.IC2_Scrapbox.get(1), false);
+ }
+
+ /**
+ * Charges an Electric Item. Only if it's a valid Electric Item of course. This forces the Usage of proper Voltages
+ * (so not the transfer limits defined by the Items) unless you ignore the Transfer Limit. If aTier is
+ * Integer.MAX_VALUE it will ignore Tier based Limitations.
+ *
+ * @return the actually used Energy.
+ */
+ public static int chargeElectricItem(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreLimit,
+ boolean aSimulate) {
+ try {
+ if (isElectricItem(aStack)) {
+ int tTier = ((ic2.api.item.IElectricItem) aStack.getItem()).getTier(aStack);
+ if (tTier < 0 || tTier == aTier || aTier == Integer.MAX_VALUE) {
+ if (!aIgnoreLimit && tTier >= 0)
+ aCharge = (int) Math.min(aCharge, V[Math.max(0, Math.min(V.length - 1, tTier))]);
+ if (aCharge > 0) {
+ int rCharge = (int) Math.max(
+ 0.0,
+ ic2.api.item.ElectricItem.manager.charge(aStack, aCharge, tTier, true, aSimulate));
+ return rCharge + (rCharge * 4 > aTier ? aTier : 0);
+ }
+ }
+ }
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return 0;
+ }
+
+ /**
+ * Discharges an Electric Item. Only if it's a valid Electric Item for that of course. This forces the Usage of
+ * proper Voltages (so not the transfer limits defined by the Items) unless you ignore the Transfer Limit. If aTier
+ * is Integer.MAX_VALUE it will ignore Tier based Limitations.
+ *
+ * @return the Energy got from the Item.
+ */
+ public static int dischargeElectricItem(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreLimit,
+ boolean aSimulate, boolean aIgnoreDischargability) {
+ try {
+ // if (isElectricItem(aStack) && (aIgnoreDischargability ||
+ // ((ic2.api.item.IElectricItem)aStack.getItem()).canProvideEnergy(aStack))) {
+ if (isElectricItem(aStack)) {
+ int tTier = ((ic2.api.item.IElectricItem) aStack.getItem()).getTier(aStack);
+ if (tTier < 0 || tTier == aTier || aTier == Integer.MAX_VALUE) {
+ if (!aIgnoreLimit && tTier >= 0) aCharge = (int) Math.min(
+ aCharge,
+ V[Math.max(0, Math.min(V.length - 1, tTier))] + B[Math.max(0, Math.min(V.length - 1, tTier))]);
+ if (aCharge > 0) {
+ int rCharge = (int) Math.max(
+ 0,
+ ic2.api.item.ElectricItem.manager.discharge(
+ aStack,
+ aCharge + (aCharge * 4 > aTier ? aTier : 0),
+ tTier,
+ true,
+ !aIgnoreDischargability,
+ aSimulate));
+ return rCharge - (rCharge * 4 > aTier ? aTier : 0);
+ }
+ }
+ }
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return 0;
+ }
+
+ /**
+ * Uses an Electric Item. Only if it's a valid Electric Item for that of course.
+ *
+ * @return if the action was successful
+ */
+ public static boolean canUseElectricItem(ItemStack aStack, int aCharge) {
+ try {
+ if (isElectricItem(aStack)) {
+ return ic2.api.item.ElectricItem.manager.canUse(aStack, aCharge);
+ }
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return false;
+ }
+
+ /**
+ * Uses an Electric Item. Only if it's a valid Electric Item for that of course.
+ *
+ * @return if the action was successful
+ */
+ public static boolean useElectricItem(ItemStack aStack, int aCharge, EntityPlayer aPlayer) {
+ try {
+ if (isElectricItem(aStack)) {
+ ic2.api.item.ElectricItem.manager.use(aStack, 0, aPlayer);
+ if (ic2.api.item.ElectricItem.manager.canUse(aStack, aCharge)) {
+ return ic2.api.item.ElectricItem.manager.use(aStack, aCharge, aPlayer);
+ }
+ }
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return false;
+ }
+
+ /**
+ * Uses an Item. Tries to discharge in case of Electric Items
+ */
+ public static boolean damageOrDechargeItem(ItemStack aStack, int aDamage, int aDecharge, EntityLivingBase aPlayer) {
+ if (GT_Utility.isStackInvalid(aStack) || (aStack.getMaxStackSize() <= 1 && aStack.stackSize > 1)) return false;
+ if (aPlayer instanceof EntityPlayer && ((EntityPlayer) aPlayer).capabilities.isCreativeMode) return true;
+ if (aStack.getItem() instanceof IDamagableItem) {
+ return ((IDamagableItem) aStack.getItem()).doDamageToItem(aStack, aDamage);
+ } else if (GT_ModHandler.isElectricItem(aStack)) {
+ if (canUseElectricItem(aStack, aDecharge)) {
+ if (aPlayer instanceof EntityPlayer) {
+ return GT_ModHandler.useElectricItem(aStack, aDecharge, (EntityPlayer) aPlayer);
+ }
+ return GT_ModHandler.dischargeElectricItem(aStack, aDecharge, Integer.MAX_VALUE, true, false, true)
+ >= aDecharge;
+ }
+ } else if (aStack.getItem()
+ .isDamageable()) {
+ if (aPlayer == null) {
+ aStack.setItemDamage(aStack.getItemDamage() + aDamage);
+ } else {
+ aStack.damageItem(aDamage, aPlayer);
+ }
+ if (aStack.getItemDamage() >= aStack.getMaxDamage()) {
+ aStack.setItemDamage(aStack.getMaxDamage() + 1);
+ ItemStack tStack = GT_Utility.getContainerItem(aStack, true);
+ if (tStack != null) {
+ aStack.func_150996_a(tStack.getItem());
+ aStack.setItemDamage(tStack.getItemDamage());
+ aStack.stackSize = tStack.stackSize;
+ aStack.setTagCompound(tStack.getTagCompound());
+ } else if (aStack.stackSize > 0) {
+ aStack.stackSize--;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Uses a Soldering Iron from player or external inventory
+ */
+ public static boolean useSolderingIron(ItemStack aStack, EntityLivingBase aPlayer, IInventory aExternalInventory) {
+ if (aPlayer == null || aStack == null) return false;
+ if (GT_Utility.isStackInList(aStack, GregTech_API.sSolderingToolList)) {
+ if (aPlayer instanceof EntityPlayer tPlayer) {
+ if (tPlayer.capabilities.isCreativeMode) return true;
+ if (isElectricItem(aStack) && ic2.api.item.ElectricItem.manager.getCharge(aStack) > 1000.0d) {
+ if (consumeSolderingMaterial(tPlayer)
+ || (aExternalInventory != null && consumeSolderingMaterial(aExternalInventory))) {
+ if (canUseElectricItem(aStack, 10000)) {
+ return GT_ModHandler.useElectricItem(aStack, 10000, (EntityPlayer) aPlayer);
+ }
+ GT_ModHandler.useElectricItem(
+ aStack,
+ (int) ic2.api.item.ElectricItem.manager.getCharge(aStack),
+ (EntityPlayer) aPlayer);
+ return false;
+ } else {
+ GT_Utility.sendChatToPlayer(
+ (EntityPlayer) aPlayer,
+ GT_Utility.trans("094.1", "Not enough soldering material!"));
+ }
+ }
+ } else {
+ damageOrDechargeItem(aStack, 1, 1000, aPlayer);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static boolean useSolderingIron(ItemStack aStack, EntityLivingBase aPlayer) {
+ return useSolderingIron(aStack, aPlayer, null);
+ }
+
+ public static boolean consumeSolderingMaterial(EntityPlayer aPlayer) {
+ if (aPlayer.capabilities.isCreativeMode) return true;
+ IInventory tInventory = aPlayer.inventory;
+ if (consumeSolderingMaterial(tInventory)) {
+ if (aPlayer.inventoryContainer != null) {
+ aPlayer.inventoryContainer.detectAndSendChanges();
+ }
+ return true;
+ }
+ for (int i = 0; i < tInventory.getSizeInventory(); i++) {
+ ItemStack tStack = tInventory.getStackInSlot(i);
+ if (tStack != null && tStack.getItem() instanceof ItemToolbox) {
+ IInventory tToolboxInventory = ((ItemToolbox) tStack.getItem()).getInventory(aPlayer, tStack);
+ if (consumeSolderingMaterial(tToolboxInventory)) {
+ tInventory.markDirty();
+ if (aPlayer.inventoryContainer != null) {
+ aPlayer.inventoryContainer.detectAndSendChanges();
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Consumes soldering material from given inventory
+ */
+ public static boolean consumeSolderingMaterial(IInventory aInventory) {
+ for (int i = 0; i < aInventory.getSizeInventory(); i++) {
+ ItemStack tStack = aInventory.getStackInSlot(i);
+ if (GT_Utility.isStackInList(tStack, GregTech_API.sSolderingMetalList)) {
+ if (tStack.stackSize < 1) return false;
+ if (tStack.stackSize == 1) {
+ tStack = null;
+ } else {
+ tStack.stackSize--;
+ }
+ aInventory.setInventorySlotContents(i, tStack);
+ aInventory.markDirty();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Is this an electric Item, which can charge other Items?
+ */
+ public static boolean isChargerItem(ItemStack aStack) {
+ try {
+ if (isElectricItem(aStack)) {
+ return ((ic2.api.item.IElectricItem) aStack.getItem()).canProvideEnergy(aStack);
+ }
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return false;
+ }
+
+ /**
+ * Is this an electric Item?
+ */
+ public static boolean isElectricItem(ItemStack aStack) {
+ try {
+ return aStack != null && aStack.getItem() instanceof ic2.api.item.IElectricItem
+ && ((IElectricItem) aStack.getItem()).getTier(aStack) < Integer.MAX_VALUE;
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return false;
+ }
+
+ public static boolean isElectricItem(ItemStack aStack, byte aTier) {
+ try {
+ return aStack != null && aStack.getItem() instanceof ic2.api.item.IElectricItem
+ && ((IElectricItem) aStack.getItem()).getTier(aStack) == aTier;
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return false;
+ }
+
+ /**
+ * Returns the current charge and maximum charge of an ItemStack.
+ *
+ * @param aStack Any ItemStack.
+ * @return Optional.empty() if the stack is null or not an electric item, or an Optional containing a payload of an
+ * array containing [ current_charge, maximum_charge ] on success.
+ */
+ public static Optional<Long[]> getElectricItemCharge(ItemStack aStack) {
+ if (aStack == null || !isElectricItem(aStack)) {
+ return Optional.empty();
+ }
+
+ final Item item = aStack.getItem();
+
+ if (item instanceof final GT_MetaBase_Item metaBaseItem) {
+ final Long[] stats = metaBaseItem.getElectricStats(aStack);
+ if (stats != null && stats.length > 0) {
+ return Optional.of(new Long[] { metaBaseItem.getRealCharge(aStack), stats[0] });
+ }
+
+ } else if (item instanceof final IElectricItem ic2ElectricItem) {
+ return Optional.of(
+ new Long[] { (long) ic2.api.item.ElectricItem.manager.getCharge(aStack),
+ (long) ic2ElectricItem.getMaxCharge(aStack) });
+ }
+
+ return Optional.empty();
+ }
+
+ /**
+ * Allow item to be inserted into ic2 toolbox
+ */
+ public static void registerBoxableItemToToolBox(ItemStack aStack) {
+ if (aStack != null) {
+ try {
+ ic2.api.item.ItemWrapper.registerBoxable(aStack.getItem(), (IBoxable) sBoxableWrapper);
+ } catch (Throwable ignored) {
+ /* Do nothing */
+ }
+ sBoxableItems.add(new GT_ItemStack(aStack));
+ }
+ }
+
+ @Deprecated
+ public static void registerBoxableItemToToolBox(Item aItem) {
+ registerBoxableItemToToolBox(new ItemStack(aItem, 1, GT_Values.W));
+ }
+
+ public static int getCapsuleCellContainerCountMultipliedWithStackSize(ItemStack... aStacks) {
+ int rAmount = 0;
+ for (ItemStack tStack : aStacks)
+ if (tStack != null) rAmount += getCapsuleCellContainerCount(tStack) * tStack.stackSize;
+ return rAmount;
+ }
+
+ public static int getCapsuleCellContainerCount(ItemStack aStack) {
+ if (aStack == null) return 0;
+
+ if (GT_Utility.areStacksEqual(GT_Utility.getContainerForFilledItem(aStack, true), ItemList.Cell_Empty.get(1))) {
+ return 1;
+ }
+
+ if (GT_Utility.areStacksEqual(aStack, getIC2Item("waterCell", 1, W))) {
+ return 1;
+ }
+
+ for (OrePrefixes cellType : OrePrefixes.CELL_TYPES) {
+ if (cellType.contains(aStack)) {
+ return 1;
+ }
+ }
+
+ return 0;
+ }
+
+ public static class RecipeBits {
+
+ /**
+ * Mirrors the Recipe
+ */
+ public static long MIRRORED = B[0];
+ /**
+ * Buffers the Recipe for later addition. This makes things more efficient.
+ */
+ public static long BUFFERED = B[1];
+ /**
+ * This is a special Tag I used for crafting Coins up and down.
+ */
+ public static long KEEPNBT = B[2];
+ /**
+ * Makes the Recipe Reverse Craftable in the Disassembler.
+ */
+ public static long DISMANTLEABLE = B[3];
+ /**
+ * Prevents the Recipe from accidentally getting removed by my own Handlers.
+ */
+ public static long NOT_REMOVABLE = B[4];
+ /**
+ * Reverses the Output of the Recipe for smelting and pulverising.
+ */
+ public static long REVERSIBLE = B[5];
+ /**
+ * Removes all Recipes with the same Output Item regardless of NBT, unless another Recipe Deletion Bit is added
+ * too.
+ */
+ public static long DELETE_ALL_OTHER_RECIPES = B[6];
+ /**
+ * Removes all Recipes with the same Output Item limited to the same NBT.
+ */
+ public static long DELETE_ALL_OTHER_RECIPES_IF_SAME_NBT = B[7];
+ /**
+ * Removes all Recipes with the same Output Item limited to Shaped Recipes.
+ */
+ public static long DELETE_ALL_OTHER_SHAPED_RECIPES = B[8];
+ /**
+ * Removes all Recipes with the same Output Item limited to native Recipe Handlers.
+ */
+ public static long DELETE_ALL_OTHER_NATIVE_RECIPES = B[9];
+ /**
+ * Disables the check for colliding Recipes.
+ */
+ public static long DO_NOT_CHECK_FOR_COLLISIONS = B[10];
+ /**
+ * Only adds the Recipe if there is another Recipe having that Output
+ */
+ public static long ONLY_ADD_IF_THERE_IS_ANOTHER_RECIPE_FOR_IT = B[11];
+ /**
+ * Only adds the Recipe if it has an Output
+ */
+ public static long ONLY_ADD_IF_RESULT_IS_NOT_NULL = B[12];
+ /**
+ * Don't remove shapeless recipes with this output
+ */
+ public static long DONT_REMOVE_SHAPELESS = B[13];
+ }
+
+ /**
+ * Copy of the original Helper Class of Thermal Expansion, just to make sure it works even when other Mods include
+ * TE-APIs
+ */
+ public static class ThermalExpansion {
+
+ public static void addFurnaceRecipe(int energy, ItemStack input, ItemStack output) {}
+
+ public static void addPulverizerRecipe(int energy, ItemStack input, ItemStack primaryOutput) {}
+
+ public static void addPulverizerRecipe(int energy, ItemStack input, ItemStack primaryOutput,
+ ItemStack secondaryOutput) {}
+
+ public static void addPulverizerRecipe(int energy, ItemStack input, ItemStack primaryOutput,
+ ItemStack secondaryOutput, int secondaryChance) {}
+
+ public static void addSawmillRecipe(int energy, ItemStack input, ItemStack primaryOutput) {}
+
+ public static void addSawmillRecipe(int energy, ItemStack input, ItemStack primaryOutput,
+ ItemStack secondaryOutput) {}
+
+ public static void addSawmillRecipe(int energy, ItemStack input, ItemStack primaryOutput,
+ ItemStack secondaryOutput, int secondaryChance) {}
+
+ public static void addSmelterRecipe(int energy, ItemStack primaryInput, ItemStack secondaryInput,
+ ItemStack primaryOutput) {}
+
+ public static void addSmelterRecipe(int energy, ItemStack primaryInput, ItemStack secondaryInput,
+ ItemStack primaryOutput, ItemStack secondaryOutput) {}
+
+ public static void addSmelterRecipe(int energy, ItemStack primaryInput, ItemStack secondaryInput,
+ ItemStack primaryOutput, ItemStack secondaryOutput, int secondaryChance) {}
+
+ public static void addSmelterBlastOre(Materials aMaterial) {}
+
+ public static void addCrucibleRecipe(int energy, ItemStack input, FluidStack output) {}
+
+ public static void addTransposerFill(int energy, ItemStack input, ItemStack output, FluidStack fluid,
+ boolean reversible) {}
+
+ public static void addTransposerExtract(int energy, ItemStack input, ItemStack output, FluidStack fluid,
+ int chance, boolean reversible) {}
+
+ public static void addMagmaticFuel(String fluidName, int energy) {}
+
+ public static void addCompressionFuel(String fluidName, int energy) {}
+
+ public static void addCoolant(String fluidName, int energy) {}
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_Multiblock_Tooltip_Builder.java b/src/main/java/gregtech/api/util/GT_Multiblock_Tooltip_Builder.java
new file mode 100644
index 0000000000..43eeccdc9f
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_Multiblock_Tooltip_Builder.java
@@ -0,0 +1,720 @@
+package gregtech.api.util;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+
+import com.google.common.collect.Multimaps;
+import com.google.common.collect.SetMultimap;
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+
+/**
+ * This makes it easier to build multi tooltips, with a standardized format. <br>
+ * Info section order should be:<br>
+ * addMachineType<br>
+ * addInfo, for what it does, special notes, etc.<br>
+ * addSeparator, if you need it<br>
+ * addPollutionAmount<br>
+ * <br>
+ * Structure order should be:<br>
+ * beginStructureBlock<br>
+ * addController<br>
+ * addCasingInfo<br>
+ * addOtherStructurePart, for secondary structure block info (pipes, coils, etc)<br>
+ * addEnergyHatch/addDynamoHatch<br>
+ * addMaintenanceHatch<br>
+ * addMufflerHatch<br>
+ * addInputBus/addInputHatch/addOutputBus/addOutputHatch, in that order<br>
+ * Use addStructureInfo for any comments on nonstandard structure info wherever needed <br>
+ * toolTipFinisher goes at the very end<br>
+ * <br>
+ * Originally created by kekzdealer
+ */
+public class GT_Multiblock_Tooltip_Builder {
+
+ private static final String TAB = " ";
+ private static final String COLON = ": ";
+ private static final String SEPARATOR = ", ";
+
+ private final List<String> iLines;
+ private final List<String> sLines;
+ private final List<String> hLines;
+ private final SetMultimap<Integer, String> hBlocks;
+
+ private String[] iArray;
+ private String[] sArray;
+ private String[] hArray;
+
+ // Localized tooltips
+ private static final String TT_machineType = StatCollector.translateToLocal("GT5U.MBTT.MachineType");
+ private static final String TT_dimensions = StatCollector.translateToLocal("GT5U.MBTT.Dimensions");
+ private static final String TT_hollow = StatCollector.translateToLocal("GT5U.MBTT.Hollow");
+ private static final String TT_structure = StatCollector.translateToLocal("GT5U.MBTT.Structure");
+ private static final String TT_controller = StatCollector.translateToLocal("GT5U.MBTT.Controller");
+ private static final String TT_minimum = StatCollector.translateToLocal("GT5U.MBTT.Minimum");
+ private static final String TT_tiered = StatCollector.translateToLocal("GT5U.MBTT.Tiered");
+ private static final String TT_maintenancehatch = StatCollector.translateToLocal("GT5U.MBTT.MaintenanceHatch");
+ private static final String TT_energyhatch = StatCollector.translateToLocal("GT5U.MBTT.EnergyHatch");
+ private static final String TT_dynamohatch = StatCollector.translateToLocal("GT5U.MBTT.DynamoHatch");
+ private static final String TT_mufflerhatch = StatCollector.translateToLocal("GT5U.MBTT.MufflerHatch");
+ private static final String TT_inputbus = StatCollector.translateToLocal("GT5U.MBTT.InputBus");
+ private static final String TT_inputhatch = StatCollector.translateToLocal("GT5U.MBTT.InputHatch");
+ private static final String TT_outputbus = StatCollector.translateToLocal("GT5U.MBTT.OutputBus");
+ private static final String TT_outputhatch = StatCollector.translateToLocal("GT5U.MBTT.OutputHatch");
+ private static final String TT_causes = StatCollector.translateToLocal("GT5U.MBTT.Causes");
+ private static final String TT_pps = StatCollector.translateToLocal("GT5U.MBTT.PPS");
+ private static final String TT_hold = StatCollector.translateToLocal("GT5U.MBTT.Hold");
+ private static final String TT_todisplay = StatCollector.translateToLocal("GT5U.MBTT.Display");
+ private static final String TT_structurehint = StatCollector.translateToLocal("GT5U.MBTT.StructureHint");
+ private static final String TT_mod = StatCollector.translateToLocal("GT5U.MBTT.Mod");
+ private static final String TT_air = StatCollector.translateToLocal("GT5U.MBTT.Air");
+ private static final String[] TT_dots = IntStream.range(0, 16)
+ .mapToObj(i -> StatCollector.translateToLocal("structurelib.blockhint." + i + ".name"))
+ .toArray(String[]::new);
+
+ public GT_Multiblock_Tooltip_Builder() {
+ iLines = new LinkedList<>();
+ sLines = new LinkedList<>();
+ hLines = new LinkedList<>();
+ hBlocks = Multimaps.newSetMultimap(new HashMap<>(), HashSet::new);
+ hBlocks.put(StructureLibAPI.HINT_BLOCK_META_AIR, TT_air);
+ }
+
+ /**
+ * Add a line telling you what the machine type is. Usually, this will be the name of a SB version.<br>
+ * Machine Type: machine
+ *
+ * @param machine Name of the machine type
+ *
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addMachineType(String machine) {
+ iLines.add(TT_machineType + COLON + EnumChatFormatting.YELLOW + machine + EnumChatFormatting.RESET);
+ return this;
+ }
+
+ /**
+ * Add a basic line of information about this structure
+ *
+ * @param info The line to be added.
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addInfo(String info) {
+ iLines.add(info);
+ return this;
+ }
+
+ /**
+ * Add a separator line like this:<br>
+ * -----------------------------------------
+ *
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addSeparator() {
+ iLines.add("-----------------------------------------");
+ return this;
+ }
+
+ /**
+ * Add a line telling how much this machine pollutes.
+ *
+ * @param pollution Amount of pollution per second when active
+ *
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addPollutionAmount(int pollution) {
+ iLines.add(
+ TT_causes + COLON + EnumChatFormatting.DARK_PURPLE + pollution + " " + EnumChatFormatting.GRAY + TT_pps);
+ return this;
+ }
+
+ /**
+ * Begin adding structural information by adding a line about the structure's dimensions and then inserting a
+ * "Structure:" line.
+ *
+ * @param w Structure width.
+ * @param h Structure height.
+ * @param l Structure depth/length.
+ * @param hollow T/F, adds a (hollow) comment if true
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder beginStructureBlock(int w, int h, int l, boolean hollow) {
+ sLines.add(
+ EnumChatFormatting.WHITE + TT_dimensions
+ + COLON
+ + EnumChatFormatting.GOLD
+ + w
+ + EnumChatFormatting.GRAY
+ + "x"
+ + EnumChatFormatting.GOLD
+ + h
+ + EnumChatFormatting.GRAY
+ + "x"
+ + EnumChatFormatting.GOLD
+ + l
+ + EnumChatFormatting.GRAY
+ + " ("
+ + EnumChatFormatting.GOLD
+ + "W"
+ + EnumChatFormatting.GRAY
+ + "x"
+ + EnumChatFormatting.GOLD
+ + "H"
+ + EnumChatFormatting.GRAY
+ + "x"
+ + EnumChatFormatting.GOLD
+ + "L"
+ + EnumChatFormatting.GRAY
+ + ") "
+ + EnumChatFormatting.RED
+ + (hollow ? EnumChatFormatting.RED + TT_hollow : ""));
+ sLines.add(EnumChatFormatting.WHITE + TT_structure + COLON);
+ return this;
+ }
+
+ /**
+ * Begin adding structural information by adding a line about the structure's dimensions<br>
+ * and then inserting a "Structure:" line. Variable version displays min and max
+ *
+ * @param wmin Structure min width.
+ * @param wmax Structure max width.
+ * @param hmin Structure min height.
+ * @param hmax Structure max height.
+ * @param lmin Structure min depth/length.
+ * @param lmax Structure max depth/length.
+ * @param hollow T/F, adds a (hollow) comment if true
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder beginVariableStructureBlock(int wmin, int wmax, int hmin, int hmax, int lmin,
+ int lmax, boolean hollow) {
+ sLines.add(
+ EnumChatFormatting.WHITE + TT_dimensions
+ + COLON
+ + EnumChatFormatting.GOLD
+ + wmin
+ + (wmin != wmax ? "-" + wmax : "")
+ + EnumChatFormatting.GRAY
+ + "x"
+ + EnumChatFormatting.GOLD
+ + hmin
+ + (hmin != hmax ? "-" + hmax : "")
+ + EnumChatFormatting.GRAY
+ + "x"
+ + EnumChatFormatting.GOLD
+ + lmin
+ + (lmin != lmax ? "-" + lmax : "")
+ + EnumChatFormatting.GRAY
+ + " ("
+ + EnumChatFormatting.GOLD
+ + "W"
+ + EnumChatFormatting.GRAY
+ + "x"
+ + EnumChatFormatting.GOLD
+ + "H"
+ + EnumChatFormatting.GRAY
+ + "x"
+ + EnumChatFormatting.GOLD
+ + "L"
+ + EnumChatFormatting.GRAY
+ + ") "
+ + (hollow ? EnumChatFormatting.RED + TT_hollow : ""));
+ sLines.add(EnumChatFormatting.WHITE + TT_structure + COLON);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Controller: info
+ *
+ * @param info Positional information.
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addController(String info) {
+ sLines.add(TAB + EnumChatFormatting.WHITE + TT_controller + COLON + EnumChatFormatting.GRAY + info);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)minCountx casingName (minimum) (tiered)
+ *
+ * @param casingName Name of the Casing.
+ * @param minCount Minimum needed for valid structure check.
+ * @return Instance this method was called on.
+ *
+ * @deprecated Replaced by {@link #addCasingInfoMin(String, int, boolean)}
+ *
+ */
+ @Deprecated
+ public GT_Multiblock_Tooltip_Builder addCasingInfo(String casingName, int minCount) {
+ return addCasingInfoMin(casingName, minCount, false);
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)countx casingName (tiered)
+ *
+ * @param casingName Name of the Casing.
+ * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils)
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addCasingInfoExactly(String casingName, int count, boolean isTiered) {
+ return addCasingInfoExactlyColored(
+ casingName,
+ EnumChatFormatting.GRAY,
+ count,
+ EnumChatFormatting.GOLD,
+ isTiered);
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)countx casingName (tiered)
+ *
+ * @param casingName Name of the Casing.
+ * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils)
+ * @param countColor Color of the casing count text
+ * @param textColor Color of the casing name text
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addCasingInfoExactlyColored(String casingName, EnumChatFormatting textColor,
+ int count, EnumChatFormatting countColor, boolean isTiered) {
+ sLines.add(
+ countColor + TAB
+ + count
+ + "x "
+ + EnumChatFormatting.RESET
+ + textColor
+ + casingName
+ + (isTiered ? " " + TT_tiered : ""));
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)minCountx casingName (minimum) (tiered)
+ *
+ * @param casingName Name of the Casing.
+ * @param minCount Minimum needed for valid structure check.
+ * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils)
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addCasingInfoMin(String casingName, int minCount, boolean isTiered) {
+ return addCasingInfoMinColored(
+ casingName,
+ EnumChatFormatting.GRAY,
+ minCount,
+ EnumChatFormatting.GOLD,
+ isTiered);
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)minCountx casingName (minimum) (tiered)
+ *
+ * @param casingName Name of the Casing.
+ * @param minCount Minimum needed for valid structure check.
+ * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils)
+ * @param countColor Color of the casing count text
+ * @param textColor Color of the casing name text
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addCasingInfoMinColored(String casingName, EnumChatFormatting textColor,
+ int minCount, EnumChatFormatting countColor, boolean isTiered) {
+ sLines.add(
+ countColor + TAB
+ + minCount
+ + "x "
+ + EnumChatFormatting.RESET
+ + textColor
+ + casingName
+ + " "
+ + TT_minimum
+ + (isTiered ? " " + TT_tiered : ""));
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)minCountx - maxCountx casingName (minimum) (tiered)
+ *
+ * @param casingName Name of the Casing.
+ * @param minCount Minimum needed for valid structure check.
+ * @param maxCount Maximum needed for valid structure check.
+ * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils)
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addCasingInfoRange(String casingName, int minCount, int maxCount,
+ boolean isTiered) {
+ return addCasingInfoRangeColored(
+ casingName,
+ EnumChatFormatting.GRAY,
+ minCount,
+ maxCount,
+ EnumChatFormatting.GOLD,
+ isTiered);
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)minCountx - maxCountx casingName (minimum) (tiered)
+ *
+ * @param casingName Name of the Casing.
+ * @param minCount Minimum needed for valid structure check.
+ * @param maxCount Maximum needed for valid structure check.
+ * @param isTiered Flag if this casing accepts multiple tiers (e.g. coils)
+ * @param countColor Color of the casing count text
+ * @param textColor Color of the casing name text
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addCasingInfoRangeColored(String casingName, EnumChatFormatting textColor,
+ int minCount, int maxCount, EnumChatFormatting countColor, boolean isTiered) {
+ sLines.add(
+ countColor + TAB
+ + minCount
+ + "x"
+ + EnumChatFormatting.GRAY
+ + " - "
+ + countColor
+ + maxCount
+ + "x "
+ + EnumChatFormatting.RESET
+ + textColor
+ + casingName
+ + (isTiered ? " " + TT_tiered : ""));
+ return this;
+ }
+
+ /**
+ * Use this method to add a structural part that isn't covered by the other methods.<br>
+ * (indent)name: info
+ *
+ * @param name Name of the hatch or other component.
+ * @param info Positional information.
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addOtherStructurePart(String name, String info) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + name + COLON + EnumChatFormatting.GRAY + info);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Maintenance Hatch: info
+ *
+ * @param info Positional information.
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addMaintenanceHatch(String info) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_maintenancehatch + COLON + EnumChatFormatting.GRAY + info);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Muffler Hatch: info
+ *
+ * @param info Location where the hatch goes
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addMufflerHatch(String info) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_mufflerhatch + COLON + EnumChatFormatting.GRAY + info);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Energy Hatch: info
+ *
+ * @param info Positional information.
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addEnergyHatch(String info) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_energyhatch + COLON + EnumChatFormatting.GRAY + info);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Dynamo Hatch: info
+ *
+ * @param info Positional information.
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addDynamoHatch(String info) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_dynamohatch + COLON + EnumChatFormatting.GRAY + info);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Input Bus: info
+ *
+ * @param info Location where the bus goes
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addInputBus(String info) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputbus + COLON + EnumChatFormatting.GRAY + info);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Input Hatch: info
+ *
+ * @param info Location where the hatch goes
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addInputHatch(String info) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputhatch + COLON + EnumChatFormatting.GRAY + info);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Output Bus: info
+ *
+ * @param info Location where the bus goes
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addOutputBus(String info) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputbus + COLON + EnumChatFormatting.GRAY + info);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Output Hatch: info
+ *
+ * @param info Location where the bus goes
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addOutputHatch(String info) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputhatch + COLON + EnumChatFormatting.GRAY + info);
+ return this;
+ }
+
+ /**
+ * Use this method to add a structural part that isn't covered by the other methods.<br>
+ * (indent)name: info
+ *
+ * @param name Name of the hatch or other component.
+ * @param info Positional information.
+ * @param dots The valid locations for this part when asked to display hints
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addOtherStructurePart(String name, String info, int... dots) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + name + COLON + EnumChatFormatting.GRAY + info);
+ for (int dot : dots) hBlocks.put(dot, name);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Maintenance Hatch: info
+ *
+ * @param info Positional information.
+ * @param dots The valid locations for this part when asked to display hints
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addMaintenanceHatch(String info, int... dots) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_maintenancehatch + COLON + EnumChatFormatting.GRAY + info);
+ for (int dot : dots) hBlocks.put(dot, TT_maintenancehatch);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Muffler Hatch: info
+ *
+ * @param info Location where the hatch goes
+ * @param dots The valid locations for this part when asked to display hints
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addMufflerHatch(String info, int... dots) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_mufflerhatch + COLON + EnumChatFormatting.GRAY + info);
+ for (int dot : dots) hBlocks.put(dot, TT_mufflerhatch);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Energy Hatch: info
+ *
+ * @param info Positional information.
+ * @param dots The valid locations for this part when asked to display hints
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addEnergyHatch(String info, int... dots) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_energyhatch + COLON + EnumChatFormatting.GRAY + info);
+ for (int dot : dots) hBlocks.put(dot, TT_energyhatch);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Dynamo Hatch: info
+ *
+ * @param info Positional information.
+ * @param dots The valid locations for this part when asked to display hints
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addDynamoHatch(String info, int... dots) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_dynamohatch + COLON + EnumChatFormatting.GRAY + info);
+ for (int dot : dots) hBlocks.put(dot, TT_dynamohatch);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Input Bus: info
+ *
+ * @param info Location where the bus goes
+ * @param dots The valid locations for this part when asked to display hints
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addInputBus(String info, int... dots) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputbus + COLON + EnumChatFormatting.GRAY + info);
+ for (int dot : dots) hBlocks.put(dot, TT_inputbus);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Input Hatch: info
+ *
+ * @param info Location where the hatch goes
+ * @param dots The valid locations for this part when asked to display hints
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addInputHatch(String info, int... dots) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_inputhatch + COLON + EnumChatFormatting.GRAY + info);
+ for (int dot : dots) hBlocks.put(dot, TT_inputhatch);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Output Bus: info
+ *
+ * @param info Location where the bus goes
+ * @param dots The valid locations for this part when asked to display hints
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addOutputBus(String info, int... dots) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputbus + COLON + EnumChatFormatting.GRAY + info);
+ for (int dot : dots) hBlocks.put(dot, TT_outputbus);
+ return this;
+ }
+
+ /**
+ * Add a line of information about the structure:<br>
+ * (indent)Output Hatch: info
+ *
+ * @param info Location where the bus goes
+ * @param dots The valid locations for this part when asked to display hints
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addOutputHatch(String info, int... dots) {
+ sLines.add(EnumChatFormatting.WHITE + TAB + TT_outputhatch + COLON + EnumChatFormatting.GRAY + info);
+ for (int dot : dots) hBlocks.put(dot, TT_outputhatch);
+ return this;
+ }
+
+ /**
+ * Use this method to add non-standard structural info.<br>
+ * (indent)info
+ *
+ * @param info The line to be added.
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addStructureInfo(String info) {
+ sLines.add(TAB + info);
+ return this;
+ }
+
+ /**
+ * Use this method to add non-standard structural info.<br>
+ * (indent)info
+ *
+ * @param channel the name of subchannel
+ * @param purpose the purpose of subchannel
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addSubChannelUsage(String channel, String purpose) {
+ sLines.add(TAB + StatCollector.translateToLocalFormatted("GT5U.MBTT.subchannel", channel, purpose));
+ return this;
+ }
+
+ /**
+ * Use this method to add non-standard structural hint. This info will appear before the standard structural hint.
+ *
+ * @param info The line to be added. This should be an entry into minecraft's localization system.
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addStructureHint(String info) {
+ hLines.add(StatCollector.translateToLocal(info));
+ return this;
+ }
+
+ /**
+ * Use this method to add an entry to standard structural hint without creating a corresponding line in structure
+ * information
+ *
+ * @param name The name of block This should be an entry into minecraft's localization system.
+ * @param dots Possible locations of this block
+ * @return Instance this method was called on.
+ */
+ public GT_Multiblock_Tooltip_Builder addStructureHint(String name, int... dots) {
+ for (int dot : dots) hBlocks.put(dot, StatCollector.translateToLocal(name));
+ return this;
+ }
+
+ /**
+ * Call at the very end.<br>
+ * Adds a final line with the mod name and information on how to display the structure guidelines.<br>
+ * Ends the building process.
+ *
+ * @param mod Name of the mod that adds this multiblock machine
+ */
+ public void toolTipFinisher(String mod) {
+ iLines.add(
+ TT_hold + " "
+ + EnumChatFormatting.BOLD
+ + "[LSHIFT]"
+ + EnumChatFormatting.RESET
+ + EnumChatFormatting.GRAY
+ + " "
+ + TT_todisplay);
+ iLines.add(TT_mod + COLON + EnumChatFormatting.GREEN + mod + EnumChatFormatting.GRAY);
+ hLines.add(TT_structurehint);
+ iArray = iLines.toArray(new String[0]);
+ sArray = sLines.toArray(new String[0]);
+ // e.getKey() - 1 because 1 dot is meta 0.
+ hArray = Stream.concat(
+ hLines.stream(),
+ hBlocks.asMap()
+ .entrySet()
+ .stream()
+ .map(e -> TT_dots[e.getKey() - 1] + COLON + String.join(SEPARATOR, e.getValue())))
+ .toArray(String[]::new);
+ }
+
+ public String[] getInformation() {
+ return iArray;
+ }
+
+ public String[] getStructureInformation() {
+ return sArray;
+ }
+
+ public String[] getStructureHint() {
+ return hArray;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_OreDictUnificator.java b/src/main/java/gregtech/api/util/GT_OreDictUnificator.java
new file mode 100644
index 0000000000..7032fc87fc
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_OreDictUnificator.java
@@ -0,0 +1,570 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.E;
+import static gregtech.api.enums.GT_Values.M;
+import static gregtech.api.enums.GT_Values.W;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.ItemData;
+import gregtech.api.objects.MaterialStack;
+import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap;
+import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * This is the Core of my OreDict Unification Code
+ * <p/>
+ * If you just want to use this to unificate your Items, then use the Function in the GregTech_API File
+ * <p/>
+ * P.S. It is intended to be named "Unificator" and not "Unifier", because that sounds more awesome.
+ */
+public class GT_OreDictUnificator {
+
+ private static final Map<String, ItemStack> sName2StackMap = new HashMap<>();
+ private static final Map<ItemStack, ItemData> sItemStack2DataMap = new Object2ObjectOpenCustomHashMap<>(
+ GT_ItemStack.ITEMSTACK_HASH_STRATEGY2);
+ private static final Map<ItemStack, List<ItemStack>> sUnificationTable = new Object2ObjectOpenCustomHashMap<>(
+ GT_ItemStack.ITEMSTACK_HASH_STRATEGY2);
+ private static final Set<ItemStack> sNoUnificationList = new ObjectOpenCustomHashSet<>(
+ GT_ItemStack.ITEMSTACK_HASH_STRATEGY2);
+ private static int isRegisteringOre = 0, isAddingOre = 0;
+ private static boolean mRunThroughTheList = true;
+
+ static {
+ GregTech_API.sItemStackMappings.add(sItemStack2DataMap);
+ GregTech_API.sItemStackMappings.add(sUnificationTable);
+ }
+
+ /**
+ * The Blacklist just prevents the Item from being unificated into something else. Useful if you have things like
+ * the Industrial Diamond, which is better than regular Diamond, but also usable in absolutely all Diamond Recipes.
+ */
+ public static void addToBlacklist(ItemStack aStack) {
+ if (GT_Utility.isStackValid(aStack) && !GT_Utility.isStackInStackSet(aStack, sNoUnificationList))
+ sNoUnificationList.add(aStack);
+ }
+
+ public static boolean isBlacklisted(ItemStack aStack) {
+ return GT_Utility.isStackInStackSet(aStack, sNoUnificationList);
+ }
+
+ public static void add(OrePrefixes aPrefix, Materials aMaterial, ItemStack aStack) {
+ set(aPrefix, aMaterial, aStack, false, false);
+ }
+
+ public static void set(OrePrefixes aPrefix, Materials aMaterial, ItemStack aStack) {
+ set(aPrefix, aMaterial, aStack, true, false);
+ }
+
+ public static void set(OrePrefixes aPrefix, Materials aMaterial, ItemStack aStack, boolean aOverwrite,
+ boolean aAlreadyRegistered) {
+ if (aMaterial == null || aPrefix == null
+ || GT_Utility.isStackInvalid(aStack)
+ || Items.feather.getDamage(aStack) == W) return;
+ isAddingOre++;
+ aStack = GT_Utility.copyAmount(1, aStack);
+ if (!aAlreadyRegistered) registerOre(aPrefix.get(aMaterial), aStack);
+ addAssociation(aPrefix, aMaterial, aStack, isBlacklisted(aStack));
+ if (aOverwrite || GT_Utility.isStackInvalid(
+ sName2StackMap.get(
+ aPrefix.get(aMaterial)
+ .toString())))
+ sName2StackMap.put(
+ aPrefix.get(aMaterial)
+ .toString(),
+ aStack);
+ isAddingOre--;
+ }
+
+ public static ItemStack getFirstOre(Object aName, long aAmount) {
+ if (GT_Utility.isStringInvalid(aName)) return null;
+ ItemStack tStack = sName2StackMap.get(aName.toString());
+ if (GT_Utility.isStackValid(tStack)) return GT_Utility.copyAmount(aAmount, tStack);
+ return GT_Utility.copyAmount(aAmount, getOresImmutable(aName).toArray());
+ }
+
+ public static ItemStack get(Object aName, long aAmount) {
+ return get(aName, null, aAmount, true, true);
+ }
+
+ public static ItemStack get(Object aName, ItemStack aReplacement, long aAmount) {
+ return get(aName, aReplacement, aAmount, true, true);
+ }
+
+ public static ItemStack get(OrePrefixes aPrefix, Object aMaterial, long aAmount) {
+ return get(aPrefix, aMaterial, null, aAmount);
+ }
+
+ public static ItemStack get(OrePrefixes aPrefix, Object aMaterial, ItemStack aReplacement, long aAmount) {
+ if (OrePrefixes.mPreventableComponents.contains(aPrefix) && aPrefix.mDisabledItems.contains(aMaterial))
+ return aReplacement;
+ return get(aPrefix.get(aMaterial), aReplacement, aAmount, false, true);
+ }
+
+ public static ItemStack get(OrePrefixes aPrefix, Object aMaterial, long aAmount, boolean aNoInvalidAmounts) {
+ if (OrePrefixes.mPreventableComponents.contains(aPrefix) && aPrefix.mDisabledItems.contains(aMaterial))
+ return null;
+ return get(aPrefix.get(aMaterial), null, aAmount, false, aNoInvalidAmounts);
+ }
+
+ public static ItemStack get(Object aName, ItemStack aReplacement, long aAmount, boolean aMentionPossibleTypos,
+ boolean aNoInvalidAmounts) {
+ if (aNoInvalidAmounts && aAmount < 1) return null;
+ final ItemStack stackFromName = sName2StackMap.get(aName.toString());
+ if (stackFromName != null) return GT_Utility.copyAmount(aAmount, stackFromName);
+ if (aMentionPossibleTypos) {
+ GT_Log.err.println("Unknown Key for Unification, Typo? " + aName);
+ }
+ final ItemStack stackFirstOre = getFirstOre(aName, aAmount);
+ if (stackFirstOre != null) return GT_Utility.copyAmount(aAmount, stackFirstOre);
+ return GT_Utility.copyAmount(aAmount, aReplacement);
+ }
+
+ public static ItemStack[] setStackArray(boolean aUseBlackList, ItemStack... aStacks) {
+ for (int i = 0; i < aStacks.length; i++) aStacks[i] = get(aUseBlackList, GT_Utility.copyOrNull(aStacks[i]));
+ return aStacks;
+ }
+
+ public static ItemStack[] getStackArray(boolean aUseBlackList, Object... aStacks) {
+ ItemStack[] rStacks = new ItemStack[aStacks.length];
+ for (int i = 0; i < aStacks.length; i++) {
+ rStacks[i] = get(aUseBlackList, GT_Utility.copy(aStacks[i]), true);
+ }
+ return rStacks;
+ }
+
+ public static ItemStack setStack(ItemStack aStack) {
+ return setStack(true, aStack);
+ }
+
+ public static ItemStack setStack(boolean aUseBlackList, ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return aStack;
+ ItemStack tStack = get(aUseBlackList, aStack);
+ if (GT_Utility.areStacksEqual(aStack, tStack)) return aStack;
+ aStack.func_150996_a(tStack.getItem());
+ Items.feather.setDamage(aStack, Items.feather.getDamage(tStack));
+ return aStack;
+ }
+
+ public static ItemStack get(ItemStack aStack) {
+ return get(true, aStack);
+ }
+
+ public static ItemStack get(boolean aUseBlackList, ItemStack aStack) {
+ return get(aUseBlackList, aStack, false);
+ }
+
+ /**
+ * @param unsafe If true, it does not limit stack size by 64.
+ */
+ public static ItemStack get(boolean aUseBlackList, ItemStack aStack, boolean unsafe) {
+ if (GT_Utility.isStackInvalid(aStack)) return null;
+ ItemData tPrefixMaterial = getAssociation(aStack);
+ if (tPrefixMaterial == null || !tPrefixMaterial.hasValidPrefixMaterialData()
+ || (aUseBlackList && tPrefixMaterial.mBlackListed)) return GT_Utility.copyOrNull(aStack);
+ if (aUseBlackList && !GregTech_API.sUnificationEntriesRegistered && isBlacklisted(aStack)) {
+ tPrefixMaterial.mBlackListed = true;
+ return GT_Utility.copyOrNull(aStack);
+ }
+ if (tPrefixMaterial.mUnificationTarget == null)
+ tPrefixMaterial.mUnificationTarget = sName2StackMap.get(tPrefixMaterial.toString());
+ ItemStack rStack = tPrefixMaterial.mUnificationTarget;
+ if (GT_Utility.isStackInvalid(rStack)) return GT_Utility.copyOrNull(aStack);
+ ItemStack newStack;
+ if (unsafe) {
+ newStack = GT_Utility.copyAmountUnsafe(aStack.stackSize, rStack);
+ } else {
+ newStack = GT_Utility.copyAmount(aStack.stackSize, rStack);
+ }
+ // NBT is assigned by reference here, so mutating it may have unexpected side effects.
+ newStack.setTagCompound(aStack.getTagCompound());
+ return newStack;
+ }
+
+ /**
+ * Doesn't copy the returned stack or set quantity. Be careful and do not mutate it; intended only to optimize
+ * comparisons
+ */
+ public static ItemStack get_nocopy(ItemStack aStack) {
+ return get_nocopy(true, aStack);
+ }
+
+ /**
+ * Doesn't copy the returned stack or set quantity. Be careful and do not mutate it; intended only to optimize
+ * comparisons
+ */
+ static ItemStack get_nocopy(boolean aUseBlackList, ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return null;
+ ItemData tPrefixMaterial = getAssociation(aStack);
+ if (tPrefixMaterial == null || !tPrefixMaterial.hasValidPrefixMaterialData()
+ || (aUseBlackList && tPrefixMaterial.mBlackListed)) return aStack;
+ if (aUseBlackList && !GregTech_API.sUnificationEntriesRegistered && isBlacklisted(aStack)) {
+ tPrefixMaterial.mBlackListed = true;
+ return aStack;
+ }
+ if (tPrefixMaterial.mUnificationTarget == null)
+ tPrefixMaterial.mUnificationTarget = sName2StackMap.get(tPrefixMaterial.toString());
+ ItemStack rStack = tPrefixMaterial.mUnificationTarget;
+ if (GT_Utility.isStackInvalid(rStack)) return aStack;
+
+ // Yes, == and not .equals().
+ // This check is primarily intended to optimize for the case where both rStack and aStack
+ // do not have NBT, and so we would be comparing null == null.
+ //
+ // Even if aStack and rStack may have equal NBT, we prefer to do an inexpensive
+ // new ItemStack() over the potentially expensive NBTTagCompound.equals().
+ if (aStack.getTagCompound() == rStack.getTagCompound()) {
+ // Warning: rStack's stack size may not be equal to aStack's stack size.
+ return rStack;
+ }
+
+ // Okay, okay, I lied, we actually do need to make a copy.
+ // This is to fix a long-standing bug where we were mutating NBT directly on rStack,
+ // which had unexpected and unpredictable ripple effects.
+ //
+ // We will do some custom copying here, to avoid ItemStack.copy(),
+ // which calls the potentially expensive NBTTagCompound.copy()
+ // NBT is assigned by reference here, so mutating it may have unexpected side effects.
+ ItemStack newStack = new ItemStack(rStack.getItem(), aStack.stackSize, Items.feather.getDamage(rStack));
+ newStack.setTagCompound(aStack.getTagCompound());
+ return newStack;
+ }
+
+ /**
+ * Compares the first argument against an already-unificated second argument as if aUseBlackList was both true and
+ * false.
+ */
+ public static boolean isInputStackEqual(ItemStack aStack, ItemStack unified_tStack) {
+ boolean alreadyCompared = false;
+ if (GT_Utility.isStackInvalid(aStack)) return false;
+ ItemData tPrefixMaterial = getAssociation(aStack);
+ ItemStack rStack = null;
+ if (tPrefixMaterial == null || !tPrefixMaterial.hasValidPrefixMaterialData())
+ return GT_Utility.areStacksEqual(aStack, unified_tStack, true);
+ else if (tPrefixMaterial.mBlackListed) {
+ if (GT_Utility.areStacksEqual(aStack, unified_tStack, true)) return true;
+ else alreadyCompared = true;
+ }
+ if (!alreadyCompared && !GregTech_API.sUnificationEntriesRegistered && isBlacklisted(aStack)) {
+ tPrefixMaterial.mBlackListed = true;
+ if (GT_Utility.areStacksEqual(aStack, unified_tStack, true)) return true;
+ else alreadyCompared = true;
+ }
+ if (tPrefixMaterial.mUnificationTarget == null)
+ tPrefixMaterial.mUnificationTarget = sName2StackMap.get(tPrefixMaterial.toString());
+ rStack = tPrefixMaterial.mUnificationTarget;
+ if (GT_Utility.isStackInvalid(rStack))
+ return !alreadyCompared && GT_Utility.areStacksEqual(aStack, unified_tStack, true);
+ return GT_Utility.areStacksEqual(rStack, unified_tStack, true);
+ }
+
+ public static List<ItemStack> getNonUnifiedStacks(Object obj) {
+ if (sUnificationTable.isEmpty() && !sItemStack2DataMap.isEmpty()) {
+ // use something akin to double check lock. this synchronization overhead is causing lag whenever my
+ // 5900x tries to do NEI lookup
+ synchronized (sUnificationTable) {
+ if (sUnificationTable.isEmpty() && !sItemStack2DataMap.isEmpty()) {
+ for (ItemStack tGTStack0 : sItemStack2DataMap.keySet()) {
+ ItemStack tStack0 = GT_ItemStack.internalCopyStack(tGTStack0);
+ ItemStack tStack1 = get_nocopy(false, tStack0);
+ if (!GT_Utility.areStacksEqual(tStack0, tStack1)) {
+ List<ItemStack> list = sUnificationTable.computeIfAbsent(tStack1, k -> new ArrayList<>());
+ // greg's original code tries to dedupe the list using List#contains, which won't work
+ // on vanilla ItemStack. I removed it since it never worked and can be slow.
+ list.add(tStack0);
+ }
+ }
+ }
+ }
+ }
+ ItemStack[] aStacks = {};
+ if (obj instanceof ItemStack) aStacks = new ItemStack[] { (ItemStack) obj };
+ else if (obj instanceof ItemStack[]) aStacks = (ItemStack[]) obj;
+ else if (obj instanceof List) aStacks = (ItemStack[]) ((List<?>) obj).toArray(new ItemStack[0]);
+ List<ItemStack> rList = new ArrayList<>();
+ for (ItemStack aStack : aStacks) {
+ if (aStack == null) continue;
+ rList.add(aStack);
+ List<ItemStack> tList = sUnificationTable.get(aStack);
+ if (tList != null) {
+ for (ItemStack tStack : tList) {
+ ItemStack tStack1 = GT_Utility.copyAmount(aStack.stackSize, tStack);
+ rList.add(tStack1);
+ }
+ }
+ }
+ return rList;
+ }
+
+ public static void addItemData(ItemStack aStack, ItemData aData) {
+ if (GT_Utility.isStackValid(aStack) && getItemData(aStack) == null && aData != null) setItemData(aStack, aData);
+ }
+
+ public static void addItemDataFromInputs(ItemStack output, Object... inputs) {
+ int length = inputs.length;
+ ItemData[] tData = new ItemData[length];
+ for (int i = 0; i < length; i++) {
+ if (inputs[i] instanceof ItemStack) {
+ tData[i] = GT_OreDictUnificator.getItemData((ItemStack) inputs[i]);
+ } else if (inputs[i] instanceof ItemData) {
+ tData[i] = (ItemData) inputs[i];
+ } else {
+ throw new IllegalArgumentException();
+ }
+ }
+ if (GT_Utility.arrayContainsNonNull(tData)) {
+ GT_OreDictUnificator.addItemData(output, new ItemData(tData));
+ }
+ }
+
+ public static void setItemData(ItemStack aStack, ItemData aData) {
+ if (GT_Utility.isStackInvalid(aStack) || aData == null) return;
+ ItemData tData = getItemData(aStack);
+ if (tData == null || !tData.hasValidPrefixMaterialData()) {
+ if (tData != null) for (Object tObject : tData.mExtraData)
+ if (!aData.mExtraData.contains(tObject)) aData.mExtraData.add(tObject);
+ if (aStack.stackSize > 1) {
+ if (aData.mMaterial != null) aData.mMaterial.mAmount /= aStack.stackSize;
+ for (MaterialStack tMaterial : aData.mByProducts) tMaterial.mAmount /= aStack.stackSize;
+ aStack = GT_Utility.copyAmount(1, aStack);
+ }
+ sItemStack2DataMap.put(aStack, aData);
+ if (aData.hasValidMaterialData()) {
+ long tValidMaterialAmount = aData.mMaterial.mMaterial.contains(SubTag.NO_RECYCLING) ? 0
+ : aData.mMaterial.mAmount >= 0 ? aData.mMaterial.mAmount : M;
+ for (MaterialStack tMaterial : aData.mByProducts)
+ tValidMaterialAmount += tMaterial.mMaterial.contains(SubTag.NO_RECYCLING) ? 0
+ : tMaterial.mAmount >= 0 ? tMaterial.mAmount : M;
+ if (tValidMaterialAmount < M) GT_ModHandler.addToRecyclerBlackList(aStack);
+ }
+ if (mRunThroughTheList) {
+ if (GregTech_API.sLoadStarted) {
+ mRunThroughTheList = false;
+ for (Entry<ItemStack, ItemData> tEntry : sItemStack2DataMap.entrySet()) if (!tEntry.getValue()
+ .hasValidPrefixData() || tEntry.getValue().mPrefix.mAllowNormalRecycling)
+ GT_RecipeRegistrator.registerMaterialRecycling(
+ GT_ItemStack.internalCopyStack(tEntry.getKey()),
+ tEntry.getValue());
+ }
+ } else {
+ if (!aData.hasValidPrefixData() || aData.mPrefix.mAllowNormalRecycling)
+ GT_RecipeRegistrator.registerMaterialRecycling(aStack, aData);
+ }
+ } else {
+ for (Object tObject : aData.mExtraData)
+ if (!tData.mExtraData.contains(tObject)) tData.mExtraData.add(tObject);
+ }
+ }
+
+ public static void removeItemData(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) {
+ return;
+ }
+ sItemStack2DataMap.remove(aStack);
+ }
+
+ public static void addAssociation(OrePrefixes aPrefix, Materials aMaterial, ItemStack aStack,
+ boolean aBlackListed) {
+ if (aPrefix == null || aMaterial == null || GT_Utility.isStackInvalid(aStack)) return;
+ if (Items.feather.getDamage(aStack) == W) for (byte i = 0; i < 16; i++)
+ setItemData(GT_Utility.copyAmountAndMetaData(1, i, aStack), new ItemData(aPrefix, aMaterial, aBlackListed));
+ setItemData(aStack, new ItemData(aPrefix, aMaterial, aBlackListed));
+ }
+
+ @Nullable
+ public static ItemData getItemData(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return null;
+ ItemData rData = sItemStack2DataMap.get(aStack);
+ if (rData == null) { // Try the lookup again but with wildcard damage value
+ rData = sItemStack2DataMap.get(GT_ItemStack.internalCopyStack(aStack, true));
+ }
+ return rData;
+ }
+
+ @Nullable
+ public static ItemData getAssociation(ItemStack aStack) {
+ ItemData rData = getItemData(aStack);
+ return rData != null && rData.hasValidPrefixMaterialData() ? rData : null;
+ }
+
+ public static boolean isItemStackInstanceOf(ItemStack aStack, Object aName) {
+ if (GT_Utility.isStringInvalid(aName) || GT_Utility.isStackInvalid(aStack)) return false;
+ for (ItemStack tOreStack : getOresImmutable(aName.toString()))
+ if (GT_Utility.areStacksEqual(tOreStack, aStack, true)) return true;
+ return false;
+ }
+
+ public static boolean isItemStackDye(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return false;
+
+ for (Dyes tDye : Dyes.VALUES) if (isItemStackInstanceOf(aStack, tDye.toString())) return true;
+
+ return false;
+ }
+
+ public static boolean registerOre(OrePrefixes aPrefix, Object aMaterial, ItemStack aStack) {
+ return registerOre(aPrefix.get(aMaterial), aStack);
+ }
+
+ public static boolean registerOre(Object aName, ItemStack aStack) {
+ if (aName == null || GT_Utility.isStackInvalid(aStack)) return false;
+
+ String tName = aName.toString();
+
+ if (GT_Utility.isStringInvalid(tName)) return false;
+
+ for (ItemStack itemStack : getOresImmutable(tName))
+ if (GT_Utility.areStacksEqual(itemStack, aStack, true)) return false;
+
+ isRegisteringOre++;
+ OreDictionary.registerOre(tName, GT_Utility.copyAmount(1, aStack));
+ isRegisteringOre--;
+ return true;
+ }
+
+ public static boolean isRegisteringOres() {
+ return isRegisteringOre > 0;
+ }
+
+ public static boolean isAddingOres() {
+ return isAddingOre > 0;
+ }
+
+ public static void resetUnificationEntries() {
+ for (ItemData tPrefixMaterial : sItemStack2DataMap.values()) tPrefixMaterial.mUnificationTarget = null;
+ }
+
+ public static ItemStack getGem(MaterialStack aMaterial) {
+ return aMaterial == null ? null : getGem(aMaterial.mMaterial, aMaterial.mAmount);
+ }
+
+ public static ItemStack getGem(Materials aMaterial, OrePrefixes aPrefix) {
+ return aMaterial == null ? null : getGem(aMaterial, aPrefix.mMaterialAmount);
+ }
+
+ public static ItemStack getGem(Materials aMaterial, long aMaterialAmount) {
+ ItemStack rStack = null;
+ if (((aMaterialAmount >= M))) rStack = get(OrePrefixes.gem, aMaterial, aMaterialAmount / M);
+ if (rStack == null) {
+ if ((((aMaterialAmount * 2) % M == 0) || aMaterialAmount >= M * 16))
+ rStack = get(OrePrefixes.gemFlawed, aMaterial, (aMaterialAmount * 2) / M);
+ if ((((aMaterialAmount * 4) >= M)))
+ rStack = get(OrePrefixes.gemChipped, aMaterial, (aMaterialAmount * 4) / M);
+ }
+ return rStack;
+ }
+
+ public static ItemStack getDust(MaterialStack aMaterial) {
+ return aMaterial == null ? null : getDust(aMaterial.mMaterial, aMaterial.mAmount);
+ }
+
+ public static ItemStack getDust(Materials aMaterial, OrePrefixes aPrefix) {
+ return aMaterial == null ? null : getDust(aMaterial, aPrefix.mMaterialAmount);
+ }
+
+ public static ItemStack getDust(Materials aMaterial, long aMaterialAmount) {
+ if (aMaterialAmount <= 0) return null;
+ ItemStack rStack = null;
+ if (((aMaterialAmount % M == 0) || aMaterialAmount >= M * 16))
+ rStack = get(OrePrefixes.dust, aMaterial, aMaterialAmount / M);
+ if (rStack == null && (((aMaterialAmount * 4) % M == 0) || aMaterialAmount >= M * 8))
+ rStack = get(OrePrefixes.dustSmall, aMaterial, (aMaterialAmount * 4) / M);
+ if (rStack == null && (((aMaterialAmount * 9) >= M)))
+ rStack = get(OrePrefixes.dustTiny, aMaterial, (aMaterialAmount * 9) / M);
+ return rStack;
+ }
+
+ public static ItemStack getIngot(MaterialStack aMaterial) {
+ return aMaterial == null ? null : getIngot(aMaterial.mMaterial, aMaterial.mAmount);
+ }
+
+ public static ItemStack getIngot(Materials aMaterial, OrePrefixes aPrefix) {
+ return aMaterial == null ? null : getIngot(aMaterial, aPrefix.mMaterialAmount);
+ }
+
+ public static ItemStack getIngot(Materials aMaterial, long aMaterialAmount) {
+ if (aMaterialAmount <= 0) return null;
+ ItemStack rStack = null;
+ if (((aMaterialAmount % (M * 9) == 0 && aMaterialAmount / (M * 9) > 1) || aMaterialAmount >= M * 72))
+ rStack = get(OrePrefixes.block, aMaterial, aMaterialAmount / (M * 9));
+ if (rStack == null && ((aMaterialAmount % M == 0) || aMaterialAmount >= M * 8))
+ rStack = get(OrePrefixes.ingot, aMaterial, aMaterialAmount / M);
+ if (rStack == null && (((aMaterialAmount * 9) >= M)))
+ rStack = get(OrePrefixes.nugget, aMaterial, (aMaterialAmount * 9) / M);
+ return rStack;
+ }
+
+ public static ItemStack getIngotOrDust(Materials aMaterial, long aMaterialAmount) {
+ if (aMaterialAmount <= 0) return null;
+ ItemStack rStack = getIngot(aMaterial, aMaterialAmount);
+ if (rStack == null) rStack = getDust(aMaterial, aMaterialAmount);
+ return rStack;
+ }
+
+ public static ItemStack getIngotOrDust(MaterialStack aMaterial) {
+ ItemStack rStack = getIngot(aMaterial);
+ if (rStack == null) rStack = getDust(aMaterial);
+ return rStack;
+ }
+
+ public static ItemStack getDustOrIngot(Materials aMaterial, long aMaterialAmount) {
+ if (aMaterialAmount <= 0) return null;
+ ItemStack rStack = getDust(aMaterial, aMaterialAmount);
+ if (rStack == null) rStack = getIngot(aMaterial, aMaterialAmount);
+ return rStack;
+ }
+
+ public static ItemStack getDustOrIngot(MaterialStack aMaterial) {
+ ItemStack rStack = getDust(aMaterial);
+ if (rStack == null) rStack = getIngot(aMaterial);
+ return rStack;
+ }
+
+ /**
+ * @return a Copy of the OreDictionary.getOres() List
+ */
+ public static ArrayList<ItemStack> getOres(OrePrefixes aPrefix, Object aMaterial) {
+ return getOres(aPrefix.get(aMaterial));
+ }
+
+ /**
+ * @return a Copy of the OreDictionary.getOres() List
+ */
+ public static ArrayList<ItemStack> getOres(Object aOreName) {
+ String aName = aOreName == null ? E : aOreName.toString();
+ ArrayList<ItemStack> rList = new ArrayList<>();
+ if (GT_Utility.isStringValid(aName)) rList.addAll(OreDictionary.getOres(aName));
+ return rList;
+ }
+
+ /**
+ * Fast version of {@link #getOres(Object)}, which doesn't call
+ * {@link System#arraycopy(Object, int, Object, int, int)} in {@link ArrayList#addAll}
+ */
+ public static List<ItemStack> getOresImmutable(@Nullable Object aOreName) {
+ String aName = aOreName == null ? E : aOreName.toString();
+
+ return GT_Utility.isStringValid(aName) ? Collections.unmodifiableList(OreDictionary.getOres(aName))
+ : Collections.emptyList();
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_OverclockCalculator.java b/src/main/java/gregtech/api/util/GT_OverclockCalculator.java
new file mode 100644
index 0000000000..609a196e80
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_OverclockCalculator.java
@@ -0,0 +1,631 @@
+package gregtech.api.util;
+
+import java.util.function.Supplier;
+
+import javax.annotation.Nonnull;
+
+import gregtech.api.enums.GT_Values;
+
+public class GT_OverclockCalculator {
+
+ private static final double LOG2 = Math.log(2);
+
+ /**
+ * Voltage the recipe will run at
+ */
+ private long recipeVoltage = 0;
+ /*
+ * The amount of amps the recipe needs
+ */
+ private long recipeAmperage = 1;
+ /**
+ * Voltage of the machine
+ */
+ private long machineVoltage = 0;
+ /**
+ * Amperage of the machine
+ */
+ private long machineAmperage = 1;
+ /**
+ * Duration of the recipe
+ */
+ private int duration = 0;
+ /**
+ * The parallel the machine has when trying to overclock
+ */
+ private int parallel = 1;
+
+ /**
+ * The min heat required for the recipe
+ */
+ private int recipeHeat = 0;
+ /**
+ * The heat the machine has when starting the recipe
+ */
+ private int machineHeat = 0;
+ /**
+ * How much the duration should be divided by for each 1800K above recipe heat
+ */
+ private double durationDecreasePerHeatOC = 4;
+ /**
+ * Whether to enable overclocking with heat like the EBF every 1800 heat difference
+ */
+ private boolean heatOC;
+ /**
+ * Whether to enable heat discounts every 900 heat difference
+ */
+ private boolean heatDiscount;
+ /**
+ * The value used for discount final eut per 900 heat
+ */
+ private double heatDiscountExponent = 0.95;
+
+ /**
+ * Discount for EUt at the beginning of calculating overclocks, like GT++ machines
+ */
+ private double eutDiscount = 1;
+ /**
+ * Speeding/Slowing up/down the duration of a recipe at the beginning of calculating overclocks, like GT++ machines
+ */
+ private double speedBoost = 1;
+
+ /**
+ * How much the energy would be multiplied by per overclock available
+ */
+ private double eutIncreasePerOC = 4;
+ /**
+ * How much the duration would be divided by per overclock made that isn't an overclock from HEAT
+ */
+ private double durationDecreasePerOC = 2;
+ /**
+ * Whether to give EUt Discount when the duration goes below one tick
+ */
+ private boolean oneTickDiscount;
+ /**
+ * Whether the multi should use amperage to overclock with an exponent. Incompatible with amperageOC
+ */
+ private boolean laserOC;
+ /**
+ * Laser OC's penalty for using high amp lasers for overclocking. Like what the Adv. Assline is doing
+ */
+ private double laserOCPenalty = 0.3;
+ /**
+ * Whether the multi should use amperage to overclock normally. Incompatible with laserOC
+ */
+ private boolean amperageOC;
+ /**
+ * If the OC calculator should only do a given amount of overclocks. Mainly used in fusion reactors
+ */
+ private boolean limitOverclocks;
+ /**
+ * Maximum amount of overclocks to perform, when limitOverclocks = true
+ */
+ private int maxOverclocks;
+ /**
+ * How many overclocks have been performed
+ */
+ private int overclockCount;
+ /**
+ * How many overclocks were performed with heat out of the overclocks we had
+ */
+ private int heatOverclockCount;
+ /**
+ * A supplier, which is used for machines which have a custom way of calculating duration, like Neutron Activator
+ */
+ private Supplier<Double> durationUnderOneTickSupplier;
+ /**
+ * Should we actually try to calculate overclocking
+ */
+ private boolean noOverclock;
+ /**
+ * variable to check whether the overclocks have been calculated
+ */
+ private boolean calculated;
+
+ private static final int HEAT_DISCOUNT_THRESHOLD = 900;
+ private static final int HEAT_PERFECT_OVERCLOCK_THRESHOLD = 1800;
+
+ /**
+ * Creates calculator that doesn't do OC at all. Will use recipe duration.
+ */
+ public static GT_OverclockCalculator ofNoOverclock(@Nonnull GT_Recipe recipe) {
+ return ofNoOverclock(recipe.mEUt, recipe.mDuration);
+ }
+
+ /**
+ * Creates calculator that doesn't do OC at all, with set duration.
+ */
+ public static GT_OverclockCalculator ofNoOverclock(long eut, int duration) {
+ return new GT_OverclockCalculator().setRecipeEUt(eut)
+ .setDuration(duration)
+ .setEUt(eut)
+ .setNoOverclock(true);
+ }
+
+ /**
+ * An Overclock helper for calculating overclocks in many different situations
+ */
+ public GT_OverclockCalculator() {}
+
+ /**
+ * @param recipeEUt Sets the Recipe's starting voltage
+ */
+ @Nonnull
+ public GT_OverclockCalculator setRecipeEUt(long recipeEUt) {
+ this.recipeVoltage = recipeEUt;
+ return this;
+ }
+
+ /**
+ * @param machineVoltage Sets the EUt that the machine can use. This is the voltage of the machine
+ */
+ @Nonnull
+ public GT_OverclockCalculator setEUt(long machineVoltage) {
+ this.machineVoltage = machineVoltage;
+ return this;
+ }
+
+ /**
+ * @param duration Sets the duration of the recipe
+ */
+ @Nonnull
+ public GT_OverclockCalculator setDuration(int duration) {
+ this.duration = duration;
+ return this;
+ }
+
+ /**
+ * @param machineAmperage Sets the Amperage that the machine can support
+ */
+ @Nonnull
+ public GT_OverclockCalculator setAmperage(long machineAmperage) {
+ this.machineAmperage = machineAmperage;
+ return this;
+ }
+
+ /**
+ * @param recipeAmperage Sets the Amperage of the recipe
+ */
+ @Nonnull
+ public GT_OverclockCalculator setRecipeAmperage(long recipeAmperage) {
+ this.recipeAmperage = recipeAmperage;
+ return this;
+ }
+
+ /**
+ * Enables Perfect OC in calculation
+ */
+ @Nonnull
+ public GT_OverclockCalculator enablePerfectOC() {
+ this.durationDecreasePerOC = 4;
+ return this;
+ }
+
+ /**
+ * Set if we should be calculating overclocking using EBF's perfectOC
+ */
+ @Nonnull
+ public GT_OverclockCalculator setHeatOC(boolean heatOC) {
+ this.heatOC = heatOC;
+ return this;
+ }
+
+ /**
+ * Sets if we should add a heat discount at the end of calculating an overclock, just like the EBF
+ */
+ @Nonnull
+ public GT_OverclockCalculator setHeatDiscount(boolean heatDiscount) {
+ this.heatDiscount = heatDiscount;
+ return this;
+ }
+
+ /**
+ * Sets the starting heat of the recipe
+ */
+ @Nonnull
+ public GT_OverclockCalculator setRecipeHeat(int recipeHeat) {
+ this.recipeHeat = recipeHeat;
+ return this;
+ }
+
+ /**
+ * Sets the heat of the coils on the machine
+ */
+ @Nonnull
+ public GT_OverclockCalculator setMachineHeat(int machineHeat) {
+ this.machineHeat = machineHeat;
+ return this;
+ }
+
+ /**
+ * Sets an EUtDiscount. 0.9 is 10% less energy. 1.1 is 10% more energy
+ */
+ @Nonnull
+ public GT_OverclockCalculator setEUtDiscount(float aEUtDiscount) {
+ this.eutDiscount = aEUtDiscount;
+ return this;
+ }
+
+ /**
+ * Sets a Speed Boost for the multiblock. 0.9 is 10% faster. 1.1 is 10% slower
+ */
+ @Nonnull
+ public GT_OverclockCalculator setSpeedBoost(float aSpeedBoost) {
+ this.speedBoost = aSpeedBoost;
+ return this;
+ }
+
+ /**
+ * Sets the parallel that the multiblock uses
+ */
+ @Nonnull
+ public GT_OverclockCalculator setParallel(int aParallel) {
+ this.parallel = aParallel;
+ return this;
+ }
+
+ /**
+ * Sets the heat discount during OC calculation if HeatOC is used. Default: 0.95 = 5% discount Used like a EU/t
+ * Discount
+ */
+ @Nonnull
+ public GT_OverclockCalculator setHeatDiscountMultiplier(float heatDiscountExponent) {
+ this.heatDiscountExponent = heatDiscountExponent;
+ return this;
+ }
+
+ /**
+ * @deprecated Deprecated in favor of {@link #setHeatPerfectOC(double)}. Calls {@link #setHeatPerfectOC(double)}
+ * where the given value is 2^heatPerfectOC
+ */
+ @Deprecated
+ @Nonnull
+ public GT_OverclockCalculator setHeatPerfectOC(int heatPerfectOC) {
+ return setHeatPerfectOC(Math.pow(2, heatPerfectOC));
+ }
+
+ /**
+ * Sets the Overclock that should be calculated when a heat OC is applied.
+ */
+ @Nonnull
+ public GT_OverclockCalculator setHeatPerfectOC(double heatPerfectOC) {
+ if (heatPerfectOC <= 0) throw new IllegalArgumentException("Heat OC can't be a negative number or zero");
+ this.durationDecreasePerHeatOC = heatPerfectOC;
+ return this;
+ }
+
+ /**
+ * @deprecated Deprecated in favor of {@link #setEUtIncreasePerOC(double)}. Calls
+ * {@link #setEUtIncreasePerOC(double)} where the given value is 2^eutIncreasePerOC
+ */
+ @Deprecated
+ @Nonnull
+ public GT_OverclockCalculator setEUtIncreasePerOC(int eutIncreasePerOC) {
+ return setEUtIncreasePerOC(Math.pow(2, eutIncreasePerOC));
+ }
+
+ /**
+ * Sets the amount that the eut would be multiplied by per overclock. Do not set as 1(ONE) if the duration decrease
+ * is also 1(ONE)!
+ */
+ @Nonnull
+ public GT_OverclockCalculator setEUtIncreasePerOC(double eutIncreasePerOC) {
+ if (eutIncreasePerOC <= 0)
+ throw new IllegalArgumentException("EUt increase can't be a negative number or zero");
+ this.eutIncreasePerOC = eutIncreasePerOC;
+ return this;
+ }
+
+ /**
+ * @deprecated Deprecated in favor of {@link #setDurationDecreasePerOC(double)}. Calls
+ * {@link #setDurationDecreasePerOC(double)} where the given value is 2^durationDecreasePerOC
+ */
+ @Deprecated
+ @Nonnull
+ public GT_OverclockCalculator setDurationDecreasePerOC(int durationDecreasePerOC) {
+ return setDurationDecreasePerOC(Math.pow(2, durationDecreasePerOC));
+ }
+
+ /**
+ * Sets the amount that the duration would be divided by per overclock. Do not set as 1(ONE) if the eut increase is
+ * also 1(ONE)!
+ */
+ @Nonnull
+ public GT_OverclockCalculator setDurationDecreasePerOC(double durationDecreasePerOC) {
+ if (durationDecreasePerOC <= 0)
+ throw new IllegalArgumentException("Duration decrease can't be a negative number or zero");
+ this.durationDecreasePerOC = durationDecreasePerOC;
+ return this;
+ }
+
+ /**
+ * Set One Tick Discount on EUt based on Duration Decrease Per Overclock. This functions the same as single blocks.
+ */
+ @Nonnull
+ public GT_OverclockCalculator setOneTickDiscount(boolean oneTickDiscount) {
+ this.oneTickDiscount = oneTickDiscount;
+ return this;
+ }
+
+ /**
+ * Limit the amount of overclocks that can be performed, regardless of how much power is available. Mainly used for
+ * fusion reactors.
+ */
+ @Nonnull
+ public GT_OverclockCalculator limitOverclockCount(int maxOverclocks) {
+ this.limitOverclocks = true;
+ this.maxOverclocks = maxOverclocks;
+ return this;
+ }
+
+ @Nonnull
+ public GT_OverclockCalculator setLaserOC(boolean laserOC) {
+ this.laserOC = laserOC;
+ return this;
+ }
+
+ @Nonnull
+ public GT_OverclockCalculator setAmperageOC(boolean amperageOC) {
+ this.amperageOC = amperageOC;
+ return this;
+ }
+
+ @Nonnull
+ public GT_OverclockCalculator setLaserOCPenalty(double laserOCPenalty) {
+ this.laserOCPenalty = laserOCPenalty;
+ return this;
+ }
+
+ /**
+ * Set a supplier for calculating custom duration for when its needed under one tick
+ */
+ @Nonnull
+ public GT_OverclockCalculator setDurationUnderOneTickSupplier(Supplier<Double> supplier) {
+ this.durationUnderOneTickSupplier = supplier;
+ return this;
+ }
+
+ /**
+ * Sets if we should do overclocking or not
+ */
+ @Nonnull
+ public GT_OverclockCalculator setNoOverclock(boolean noOverclock) {
+ this.noOverclock = noOverclock;
+ return this;
+ }
+
+ /**
+ * Call this when all values have been put it.
+ */
+ @Nonnull
+ public GT_OverclockCalculator calculate() {
+ if (calculated) {
+ throw new IllegalStateException("Tried to calculate overclocks twice");
+ }
+ calculateOverclock();
+ calculated = true;
+ return this;
+ }
+
+ private void calculateOverclock() {
+ duration = (int) Math.ceil(duration * speedBoost);
+ if (noOverclock) {
+ recipeVoltage = calculateFinalRecipeEUt(calculateHeatDiscountMultiplier());
+ return;
+ }
+ if (laserOC && amperageOC) {
+ throw new IllegalStateException("Tried to calculate overclock with both laser and amperage overclocking");
+ }
+ double heatDiscountMultiplier = calculateHeatDiscountMultiplier();
+ if (heatOC) {
+ heatOverclockCount = calculateAmountOfHeatOverclocks();
+ }
+
+ double recipePowerTier = calculateRecipePowerTier(heatDiscountMultiplier);
+ double machinePowerTier = calculateMachinePowerTier();
+
+ overclockCount = calculateAmountOfNeededOverclocks(machinePowerTier, recipePowerTier);
+ if (!amperageOC) {
+ overclockCount = Math.min(overclockCount, calculateRecipeToMachineVoltageDifference());
+ }
+
+ // Not just a safeguard. This also means that you can run a 1.2A recipe on a single hatch for a regular gt
+ // multi.
+ // This is intended, including the fact that you don't get an OC with a one tier upgrade in that case.
+ overclockCount = Math.max(overclockCount, 0);
+
+ overclockCount = limitOverclocks ? Math.min(maxOverclocks, overclockCount) : overclockCount;
+ heatOverclockCount = Math.min(heatOverclockCount, overclockCount);
+ recipeVoltage = (long) Math.floor(recipeVoltage * Math.pow(eutIncreasePerOC, overclockCount));
+ duration = (int) Math.floor(duration / Math.pow(durationDecreasePerOC, overclockCount - heatOverclockCount));
+ duration = (int) Math.floor(duration / Math.pow(durationDecreasePerHeatOC, heatOverclockCount));
+ if (oneTickDiscount) {
+ recipeVoltage = (long) Math.floor(
+ recipeVoltage
+ / Math.pow(durationDecreasePerOC, ((int) (machinePowerTier - recipePowerTier - overclockCount))));
+ if (recipeVoltage < 1) {
+ recipeVoltage = 1;
+ }
+ }
+
+ if (laserOC) {
+ calculateLaserOC();
+ }
+
+ if (duration < 1) {
+ duration = 1;
+ }
+
+ recipeVoltage = calculateFinalRecipeEUt(heatDiscountMultiplier);
+ }
+
+ private double calculateRecipePowerTier(double heatDiscountMultiplier) {
+ return calculatePowerTier(recipeVoltage * parallel * eutDiscount * heatDiscountMultiplier * recipeAmperage);
+ }
+
+ private double calculateMachinePowerTier() {
+ return calculatePowerTier(
+ machineVoltage * (amperageOC ? machineAmperage : Math.min(machineAmperage, parallel)));
+ }
+
+ private int calculateRecipeToMachineVoltageDifference() {
+ return (int) (Math.ceil(calculatePowerTier(machineVoltage)) - Math.ceil(calculatePowerTier(recipeVoltage)));
+ }
+
+ private double calculatePowerTier(double voltage) {
+ return 1 + Math.max(0, (Math.log(voltage) / LOG2) - 5) / 2;
+ }
+
+ private long calculateFinalRecipeEUt(double heatDiscountMultiplier) {
+ return (long) Math.ceil(recipeVoltage * eutDiscount * heatDiscountMultiplier * parallel * recipeAmperage);
+ }
+
+ private int calculateAmountOfHeatOverclocks() {
+ return Math.min(
+ (machineHeat - recipeHeat) / HEAT_PERFECT_OVERCLOCK_THRESHOLD,
+ calculateAmountOfOverclocks(
+ calculateMachinePowerTier(),
+ calculateRecipePowerTier(calculateHeatDiscountMultiplier())));
+ }
+
+ /**
+ * Calculate maximum possible overclocks ignoring if we are going to go under 1 tick
+ */
+ private int calculateAmountOfOverclocks(double machinePowerTier, double recipePowerTier) {
+ return (int) (machinePowerTier - recipePowerTier);
+ }
+
+ /**
+ * Calculates the amount of overclocks needed to reach 1 ticking
+ *
+ * Here we limit "the tier difference overclock" amount to a number of overclocks needed to reach 1 tick duration,
+ * for example:
+ *
+ * recipe initial duration = 250 ticks (12,5 seconds LV(1))
+ * we have LCR with IV(5) energy hatch, which overclocks at 4/4 rate
+ *
+ * log_4 (250) ~ 3,98 is the number of overclocks needed to reach 1 tick
+ *
+ * to calculate log_a(b) we can use the log property:
+ * log_a(b) = log_c(b) / log_c(a)
+ * in our case we use natural log base as 'c'
+ *
+ * as a final step we apply Math.ceil(),
+ * otherwise for fractional nums like 3,98 we will never reach 1 tick
+ */
+ private int calculateAmountOfNeededOverclocks(double machinePowerTier, double recipePowerTier) {
+ return (int) Math.min(
+ calculateAmountOfOverclocks(machinePowerTier, recipePowerTier),
+ Math.ceil(Math.log(duration) / Math.log(durationDecreasePerOC)));
+ }
+
+ private double calculateHeatDiscountMultiplier() {
+ int heatDiscounts = heatDiscount ? (machineHeat - recipeHeat) / HEAT_DISCOUNT_THRESHOLD : 0;
+ return Math.pow(heatDiscountExponent, heatDiscounts);
+ }
+
+ private void calculateLaserOC() {
+ long inputEut = machineVoltage * machineAmperage;
+ double currentPenalty = eutIncreasePerOC + laserOCPenalty;
+ while (inputEut > recipeVoltage * currentPenalty && recipeVoltage * currentPenalty > 0 && duration > 1) {
+ duration /= durationDecreasePerOC;
+ recipeVoltage *= currentPenalty;
+ currentPenalty += laserOCPenalty;
+ }
+ }
+
+ /**
+ * @return The consumption after overclock has been calculated
+ */
+ public long getConsumption() {
+ if (!calculated) {
+ throw new IllegalStateException("Tried to get consumption before calculating");
+ }
+ return recipeVoltage;
+ }
+
+ /**
+ * @return The duration of the recipe after overclock has been calculated
+ */
+ public int getDuration() {
+ if (!calculated) {
+ throw new IllegalStateException("Tried to get duration before calculating");
+ }
+ return duration;
+ }
+
+ /**
+ * @return Number of performed overclocks
+ */
+ public int getPerformedOverclocks() {
+ if (!calculated) {
+ throw new IllegalStateException("Tried to get performed overclocks before calculating");
+ }
+ return overclockCount;
+ }
+
+ /**
+ * Returns duration as a double to show how much it is overclocking too much to determine extra parallel. This
+ * doesn't count as calculating
+ */
+ public double calculateDurationUnderOneTick() {
+ if (durationUnderOneTickSupplier != null) return durationUnderOneTickSupplier.get();
+ if (noOverclock) return duration;
+ int normalOverclocks = calculateAmountOfOverclocks(
+ calculateMachinePowerTier(),
+ calculateRecipePowerTier(calculateHeatDiscountMultiplier()));
+ normalOverclocks = limitOverclocks ? Math.min(normalOverclocks, maxOverclocks) : normalOverclocks;
+ int heatOverclocks = Math.min(calculateAmountOfHeatOverclocks(), normalOverclocks);
+ return (duration * speedBoost) / (Math.pow(durationDecreasePerOC, normalOverclocks - heatOverclocks)
+ * Math.pow(durationDecreasePerHeatOC, heatOverclocks));
+ }
+
+ /**
+ * Returns the EUt consumption one would get from overclocking under 1 tick
+ * This Doesn't count as calculating
+ *
+ * @param originalMaxParallel Parallels which are of the actual machine before the overclocking extra ones
+ */
+ public long calculateEUtConsumptionUnderOneTick(int originalMaxParallel, int currentParallel) {
+ if (noOverclock) return recipeVoltage;
+ double heatDiscountMultiplier = calculateHeatDiscountMultiplier();
+ // So what we need to do here is as follows:
+ // - First we need to figure out what out parallel multiplier for getting to that OC was
+ // - Second we need to find how many of those were from heat overclocks
+ // - Third we need to find how many were from normal overclocking.
+ // = For that we need to find how much better heat overclocks are compared to normal ones
+ // = Then remove that many from our normal overclocks
+ // - Fourth we find how many total overclocks we have
+ // - Fifth we find how many of those are needed to one tick
+ // - Finally we calculate the formula
+ // = The energy increase from our overclocks for parallel
+ // = The energy increase from our overclock to reach maximum under one tick potential
+ // =- NOTE: This will always cause machine to use full power no matter what. Otherwise it creates many
+ // anomalies.
+ // = Everything else for recipe voltage is also calculated here.
+
+ double parallelMultiplierFromOverclocks = (double) currentParallel / originalMaxParallel;
+ double amountOfParallelHeatOverclocks = Math.min(
+ Math.log(parallelMultiplierFromOverclocks) / Math.log(durationDecreasePerHeatOC),
+ calculateAmountOfHeatOverclocks());
+ double amountOfParallelOverclocks = Math.log(parallelMultiplierFromOverclocks) / Math.log(durationDecreasePerOC)
+ - amountOfParallelHeatOverclocks * (durationDecreasePerHeatOC - durationDecreasePerOC);
+ double machineTier = calculateMachinePowerTier();
+ double recipeTier = calculateRecipePowerTier(heatDiscountMultiplier);
+ double amountOfTotalOverclocks = calculateAmountOfOverclocks(machineTier, recipeTier);
+ if (recipeVoltage <= GT_Values.V[0]) {
+ amountOfTotalOverclocks = Math.min(amountOfTotalOverclocks, calculateRecipeToMachineVoltageDifference());
+ }
+ amountOfTotalOverclocks = limitOverclocks ? Math.min(amountOfTotalOverclocks, maxOverclocks)
+ : amountOfTotalOverclocks;
+ return (long) Math.ceil(
+ recipeVoltage * Math.pow(eutIncreasePerOC, amountOfParallelOverclocks + amountOfParallelHeatOverclocks)
+ * Math.pow(
+ eutIncreasePerOC,
+ amountOfTotalOverclocks - (amountOfParallelOverclocks + amountOfParallelHeatOverclocks))
+ * originalMaxParallel
+ * eutDiscount
+ * recipeAmperage
+ * heatDiscountMultiplier);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_PCBFactoryManager.java b/src/main/java/gregtech/api/util/GT_PCBFactoryManager.java
new file mode 100644
index 0000000000..990e9bd174
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_PCBFactoryManager.java
@@ -0,0 +1,25 @@
+package gregtech.api.util;
+
+import com.google.common.collect.HashBiMap;
+
+import gregtech.api.enums.Materials;
+
+public class GT_PCBFactoryManager {
+
+ private static final HashBiMap<Materials, Integer> mPlasticTiers = HashBiMap.create();
+ public static int mTiersOfPlastics = 0;
+
+ public static void addPlasticTier(Materials aMaterial, int aTier) {
+ mPlasticTiers.put(aMaterial, aTier);
+ mTiersOfPlastics++;
+ }
+
+ public static int getPlasticTier(Materials aMaterial) {
+ return mPlasticTiers.get(aMaterial);
+ }
+
+ public static Materials getPlasticMaterialFromTier(int aTier) {
+ return mPlasticTiers.inverse()
+ .get(aTier);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_ParallelHelper.java b/src/main/java/gregtech/api/util/GT_ParallelHelper.java
new file mode 100644
index 0000000000..141ea35e9e
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_ParallelHelper.java
@@ -0,0 +1,717 @@
+package gregtech.api.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.Random;
+import java.util.function.Function;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.interfaces.tileentity.IRecipeLockable;
+import gregtech.api.interfaces.tileentity.IVoidable;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.objects.XSTR;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SingleRecipeCheck;
+
+@SuppressWarnings({ "unused", "UnusedReturnValue" })
+public class GT_ParallelHelper {
+
+ private static final double MAX_BATCH_MODE_TICK_TIME = 128;
+ /**
+ * Machine used for calculation
+ */
+ private IVoidable machine;
+ /**
+ * Machine used for single recipe locking calculation
+ */
+ private IRecipeLockable singleRecipeMachine;
+ /**
+ * Is locked to a single recipe?
+ */
+ private boolean isRecipeLocked;
+ /**
+ * Recipe used when trying to calculate parallels
+ */
+ private GT_Recipe recipe;
+ /**
+ * EUt available to the multiblock (This should be the total eut available)
+ */
+ private long availableEUt;
+ /**
+ * The current parallel possible for the multiblock
+ */
+ private int currentParallel = 0;
+ /**
+ * The maximum possible parallel possible for the multiblock
+ */
+ private int maxParallel = 1;
+ /**
+ * The Batch Modifier applied when batch mode is enabled. 1 does nothing. 2 doubles max possible
+ * parallel, but also duration
+ */
+ private int batchModifier = 1;
+ /**
+ * The inputs of the multiblock for the current recipe check
+ */
+ private ItemStack[] itemInputs;
+ /**
+ * The inputs of the machine for current recipe check
+ */
+ private ItemInventoryLogic itemInputInventory;
+ /**
+ * The output item inventory of the machine
+ */
+ private ItemInventoryLogic itemOutputInventory;
+ /**
+ * The outputs of the recipe with the applied parallel
+ */
+ private ItemStack[] itemOutputs;
+ /**
+ * The inputs of the multiblock for the current recipe check
+ */
+ private FluidStack[] fluidInputs;
+ /**
+ * The inputs of the machine for the current recipe check
+ */
+ private FluidInventoryLogic fluidInputInventory;
+ /**
+ * The output fluid inventory of the machine;
+ */
+ private FluidInventoryLogic fluidOutputInventory;
+ /**
+ * The outputs of the recipe with the applied parallel
+ */
+ private FluidStack[] fluidOutputs;
+ /**
+ * Does the multi have void protection enabled for items
+ */
+ private boolean protectExcessItem;
+ /**
+ * Does the multi have void protection enabled for fluids
+ */
+ private boolean protectExcessFluid;
+ /**
+ * Should the Parallel Helper automatically consume for the multi
+ */
+ private boolean consume;
+ /**
+ * Is batch mode turned on?
+ */
+ private boolean batchMode;
+ /**
+ * Should the Parallel Helper automatically calculate the outputs of the recipe with current parallel?
+ */
+ private boolean calculateOutputs;
+ /**
+ * Has the Parallel Helper been built?
+ */
+ private boolean built;
+ /**
+ * What is the duration multiplier with batch mode enabled
+ */
+ private double durationMultiplier;
+ /**
+ * Modifier which is applied on the recipe eut. Useful for GT++ machines
+ */
+ private float eutModifier = 1;
+ /**
+ * Multiplier that is applied on the output chances
+ */
+ private double chanceMultiplier = 1;
+ /**
+ * Multiplier by which the output will be multiplied
+ */
+ private int outputMultiplier = 1;
+ /**
+ * Method for calculating max parallel from given inputs.
+ */
+ private MaxParallelCalculator maxParallelCalculator = GT_Recipe::maxParallelCalculatedByInputs;
+ /**
+ * Method for consuming inputs after determining how many parallels it can execute.
+ */
+ private InputConsumer inputConsumer = GT_Recipe::consumeInput;
+
+ /**
+ * Calculator to use for overclocking
+ */
+ private GT_OverclockCalculator calculator;
+ @Nonnull
+ private CheckRecipeResult result = CheckRecipeResultRegistry.NONE;
+
+ private Function<Integer, ItemStack[]> customItemOutputCalculation;
+
+ private Function<Integer, FluidStack[]> customFluidOutputCalculation;
+
+ /**
+ * MuTE Mode this is a mode for changing how the GT_ParallelHelper works as Mutes don't use ItemStack and FluidStack
+ * arrays for inputs
+ */
+ private boolean muteMode = false;
+
+ public GT_ParallelHelper() {}
+
+ /**
+ * Sets machine, with current configuration for void protection mode.
+ */
+ @Nonnull
+ public GT_ParallelHelper setMachine(IVoidable machine) {
+ return setMachine(machine, machine.protectsExcessItem(), machine.protectsExcessFluid());
+ }
+
+ /**
+ * Sets machine, with void protection mode forcibly.
+ */
+ @Nonnull
+ public GT_ParallelHelper setMachine(IVoidable machine, boolean protectExcessItem, boolean protectExcessFluid) {
+ this.protectExcessItem = protectExcessItem;
+ this.protectExcessFluid = protectExcessFluid;
+ this.machine = machine;
+ return this;
+ }
+
+ /**
+ * Sets the recipe, which will be used for the parallel calculation
+ */
+ @Nonnull
+ public GT_ParallelHelper setRecipe(@Nonnull GT_Recipe aRecipe) {
+ recipe = Objects.requireNonNull(aRecipe);
+ return this;
+ }
+
+ @Nonnull
+ public GT_ParallelHelper setRecipeLocked(IRecipeLockable singleRecipeMachine, boolean isRecipeLocked) {
+ this.singleRecipeMachine = singleRecipeMachine;
+ this.isRecipeLocked = isRecipeLocked;
+ return this;
+ }
+
+ /**
+ * Sets the items available for the recipe check
+ */
+ @Nonnull
+ public GT_ParallelHelper setItemInputs(ItemStack... aItemInputs) {
+ this.itemInputs = aItemInputs;
+ return this;
+ }
+
+ /**
+ * Sets the fluid inputs available for the recipe check
+ */
+ @Nonnull
+ public GT_ParallelHelper setFluidInputs(FluidStack... aFluidInputs) {
+ this.fluidInputs = aFluidInputs;
+ return this;
+ }
+
+ /**
+ * Sets the available eut when trying for more parallels
+ */
+ @Nonnull
+ public GT_ParallelHelper setAvailableEUt(long aAvailableEUt) {
+ this.availableEUt = aAvailableEUt;
+ return this;
+ }
+
+ /**
+ * Sets the modifier for recipe eut. 1 does nothing 0.9 is 10% less. 1.1 is 10% more
+ */
+ @Nonnull
+ public GT_ParallelHelper setEUtModifier(float aEUtModifier) {
+ this.eutModifier = aEUtModifier;
+ return this;
+ }
+
+ /**
+ * Sets the multiplier that is applied on output chances. 1 does nothing. 0.9 is 10% less. 1.1 is 10% more.
+ * Only useful for item outputs for sure.
+ */
+ @Nonnull
+ public GT_ParallelHelper setChanceMultiplier(double chanceMultiplier) {
+ this.chanceMultiplier = chanceMultiplier;
+ return this;
+ }
+
+ /**
+ * Sets the item/fluid output multiplier. 1 does nothing. 2 doubles the item and fluid outputs.
+ */
+ @Nonnull
+ public GT_ParallelHelper setOutputMultiplier(int outputMultiplier) {
+ this.outputMultiplier = outputMultiplier;
+ return this;
+ }
+
+ @Nonnull
+ public GT_ParallelHelper setCalculator(GT_OverclockCalculator calculator) {
+ this.calculator = calculator;
+ return this;
+ }
+
+ /**
+ * Set if we should consume inputs or not when trying for parallels
+ *
+ * @param consume Should we consume inputs
+ */
+ @Nonnull
+ public GT_ParallelHelper setConsumption(boolean consume) {
+ this.consume = consume;
+ return this;
+ }
+
+ /**
+ * Sets the MaxParallel a multi can handle
+ */
+ @Nonnull
+ public GT_ParallelHelper setMaxParallel(int maxParallel) {
+ this.maxParallel = maxParallel;
+ return this;
+ }
+
+ /**
+ * Enables Batch mode. Can do up to an additional processed recipes of mCurrentParallel * mBatchModifier A batch
+ * modifier of 1 does nothing
+ */
+ @Nonnull
+ public GT_ParallelHelper enableBatchMode(int batchModifier) {
+ this.batchMode = batchModifier > 1;
+ this.batchModifier = batchModifier;
+ return this;
+ }
+
+ /**
+ * Sets if we should calculate outputs with the parallels we found or not
+ *
+ * @param calculateOutputs Should we calculate outputs with the helper or not
+ */
+ @Nonnull
+ public GT_ParallelHelper setOutputCalculation(boolean calculateOutputs) {
+ this.calculateOutputs = calculateOutputs;
+ return this;
+ }
+
+ /**
+ * Set a custom way to calculate item outputs. You are given the amount of parallels and must return an ItemStack
+ * array
+ */
+ @Nonnull
+ public GT_ParallelHelper setCustomItemOutputCalculation(Function<Integer, ItemStack[]> custom) {
+ customItemOutputCalculation = custom;
+ return this;
+ }
+
+ /**
+ * Set a custom way to calculate item outputs. You are given the amount of parallels and must return a FluidStack
+ * array
+ */
+ @Nonnull
+ public GT_ParallelHelper setCustomFluidOutputCalculation(Function<Integer, FluidStack[]> custom) {
+ customFluidOutputCalculation = custom;
+ return this;
+ }
+
+ @Nonnull
+ public GT_ParallelHelper setMuTEMode(boolean muteMode) {
+ this.muteMode = muteMode;
+ return this;
+ }
+
+ @Nonnull
+ public GT_ParallelHelper setItemInputInventory(ItemInventoryLogic itemInputInventory) {
+ this.itemInputInventory = itemInputInventory;
+ return this;
+ }
+
+ @Nonnull
+ public GT_ParallelHelper setFluidInputInventory(FluidInventoryLogic fluidInputInventory) {
+ this.fluidInputInventory = fluidInputInventory;
+ return this;
+ }
+
+ /**
+ * Sets method for calculating max parallel from given inputs.
+ */
+ public GT_ParallelHelper setMaxParallelCalculator(MaxParallelCalculator maxParallelCalculator) {
+ this.maxParallelCalculator = maxParallelCalculator;
+ return this;
+ }
+
+ /**
+ * Sets method for consuming inputs after determining how many parallels it can execute.
+ */
+ public GT_ParallelHelper setInputConsumer(InputConsumer inputConsumer) {
+ this.inputConsumer = inputConsumer;
+ return this;
+ }
+
+ @Nonnull
+ public GT_ParallelHelper setItemOutputInventory(ItemInventoryLogic itemOutputInventory) {
+ this.itemOutputInventory = itemOutputInventory;
+ return this;
+ }
+
+ @Nonnull
+ public GT_ParallelHelper setFluidOutputInventory(FluidInventoryLogic fluidOutputInventory) {
+ this.fluidOutputInventory = fluidOutputInventory;
+ return this;
+ }
+
+ /**
+ * Finishes the GT_ParallelHelper. Anything changed after this will not effect anything
+ */
+ @Nonnull
+ public GT_ParallelHelper build() {
+ if (built) {
+ throw new IllegalStateException("Tried to build twice");
+ }
+ if (recipe == null) {
+ throw new IllegalStateException("Recipe is not set");
+ }
+ built = true;
+ determineParallel();
+ return this;
+ }
+
+ /**
+ * @return The current parallels possible by the multiblock
+ */
+ public int getCurrentParallel() {
+ if (!built) {
+ throw new IllegalStateException("Tried to get parallels before building");
+ }
+ return currentParallel;
+ }
+
+ /**
+ * @return The duration multiplier if batch mode was enabled for the multiblock
+ */
+ public double getDurationMultiplierDouble() {
+ if (!built) {
+ throw new IllegalStateException("Tried to get duration multiplier before building");
+ }
+ if (batchMode && durationMultiplier > 0) {
+ return durationMultiplier;
+ }
+ return 1;
+ }
+
+ /**
+ * @return The ItemOutputs from the recipe
+ */
+ @Nonnull
+ public ItemStack[] getItemOutputs() {
+ if (!built || !calculateOutputs) {
+ throw new IllegalStateException(
+ "Tried to get item outputs before building or without enabling calculation of outputs");
+ }
+ return itemOutputs;
+ }
+
+ /**
+ * @return The FluidOutputs from the recipe
+ */
+ @Nonnull
+ public FluidStack[] getFluidOutputs() {
+ if (!built || !calculateOutputs) {
+ throw new IllegalStateException(
+ "Tried to get fluid outputs before building or without enabling calculation of outputs");
+ }
+ return fluidOutputs;
+ }
+
+ /**
+ * @return The result of why a recipe could've failed or succeeded
+ */
+ @Nonnull
+ public CheckRecipeResult getResult() {
+ if (!built) {
+ throw new IllegalStateException("Tried to get recipe result before building");
+ }
+ return result;
+ }
+
+ /**
+ * Called by build(). Determines the parallels and everything else that needs to be done at build time
+ */
+ protected void determineParallel() {
+ if (maxParallel <= 0) {
+ return;
+ }
+ if (itemInputs == null) {
+ itemInputs = new ItemStack[0];
+ }
+ if (fluidInputs == null) {
+ fluidInputs = new FluidStack[0];
+ }
+
+ if (!consume) {
+ copyInputs();
+ }
+
+ if (calculator == null) {
+ calculator = new GT_OverclockCalculator().setEUt(availableEUt)
+ .setRecipeEUt(recipe.mEUt)
+ .setDuration(recipe.mDuration)
+ .setEUtDiscount(eutModifier);
+ }
+
+ final int tRecipeEUt = (int) Math.ceil(recipe.mEUt * eutModifier);
+ if (availableEUt < tRecipeEUt) {
+ result = CheckRecipeResultRegistry.insufficientPower(tRecipeEUt);
+ return;
+ }
+
+ // Save the original max parallel before calculating our overclocking under 1 tick
+ int originalMaxParallel = maxParallel;
+ double tickTimeAfterOC = calculator.setParallel(originalMaxParallel)
+ .calculateDurationUnderOneTick();
+ if (tickTimeAfterOC < 1) {
+ maxParallel = GT_Utility.safeInt((long) (maxParallel / tickTimeAfterOC), 0);
+ }
+
+ int maxParallelBeforeBatchMode = maxParallel;
+ if (batchMode) {
+ maxParallel = GT_Utility.safeInt((long) maxParallel * batchModifier, 0);
+ }
+
+ final ItemStack[] truncatedItemOutputs = recipe.mOutputs != null
+ ? Arrays.copyOfRange(recipe.mOutputs, 0, Math.min(machine.getItemOutputLimit(), recipe.mOutputs.length))
+ : new ItemStack[0];
+ final FluidStack[] truncatedFluidOutputs = recipe.mFluidOutputs != null ? Arrays
+ .copyOfRange(recipe.mFluidOutputs, 0, Math.min(machine.getFluidOutputLimit(), recipe.mFluidOutputs.length))
+ : new FluidStack[0];
+
+ SingleRecipeCheck recipeCheck = null;
+ SingleRecipeCheck.Builder tSingleRecipeCheckBuilder = null;
+ if (isRecipeLocked && singleRecipeMachine != null) {
+ recipeCheck = singleRecipeMachine.getSingleRecipeCheck();
+ if (recipeCheck == null) {
+ // Machine is configured to lock to a single recipe, but haven't built the recipe checker yet.
+ // Build the checker on next successful recipe.
+ RecipeMap<?> recipeMap = singleRecipeMachine.getRecipeMap();
+ if (recipeMap != null) {
+ tSingleRecipeCheckBuilder = SingleRecipeCheck.builder(recipeMap)
+ .setBefore(itemInputs, fluidInputs);
+ }
+ }
+ }
+
+ // Let's look at how many parallels we can get with void protection
+ if (protectExcessItem || protectExcessFluid) {
+ if (machine == null && !muteMode) {
+ throw new IllegalStateException("Tried to calculate void protection, but machine is not set");
+ }
+ VoidProtectionHelper voidProtectionHelper = new VoidProtectionHelper();
+ voidProtectionHelper.setMachine(machine)
+ .setItemOutputs(truncatedItemOutputs)
+ .setFluidOutputs(truncatedFluidOutputs)
+ .setChangeGetter(recipe::getOutputChance)
+ .setOutputMultiplier(outputMultiplier)
+ .setChanceMultiplier(chanceMultiplier)
+ .setMaxParallel(maxParallel)
+ .setItemOutputInventory(itemOutputInventory)
+ .setFluidOutputInventory(fluidOutputInventory)
+ .setMuTEMode(muteMode)
+ .build();
+ maxParallel = Math.min(voidProtectionHelper.getMaxParallel(), maxParallel);
+ if (voidProtectionHelper.isItemFull()) {
+ result = CheckRecipeResultRegistry.ITEM_OUTPUT_FULL;
+ return;
+ }
+ if (voidProtectionHelper.isFluidFull()) {
+ result = CheckRecipeResultRegistry.FLUID_OUTPUT_FULL;
+ return;
+ }
+ }
+
+ maxParallelBeforeBatchMode = Math.min(maxParallel, maxParallelBeforeBatchMode);
+
+ // determine normal parallel
+ int actualMaxParallel = tRecipeEUt > 0 ? (int) Math.min(maxParallelBeforeBatchMode, availableEUt / tRecipeEUt)
+ : maxParallelBeforeBatchMode;
+ if (recipeCheck != null) {
+ currentParallel = recipeCheck.checkRecipeInputs(true, actualMaxParallel, itemInputs, fluidInputs);
+ } else {
+ currentParallel = (int) maxParallelCalculator.calculate(recipe, actualMaxParallel, fluidInputs, itemInputs);
+ if (currentParallel > 0) {
+ if (tSingleRecipeCheckBuilder != null) {
+ // If recipe checker is not built yet, build and set it
+ inputConsumer.consume(recipe, 1, fluidInputs, itemInputs);
+ SingleRecipeCheck builtCheck = tSingleRecipeCheckBuilder.setAfter(itemInputs, fluidInputs)
+ .setRecipe(recipe)
+ .build();
+ singleRecipeMachine.setSingleRecipeCheck(builtCheck);
+ inputConsumer.consume(recipe, currentParallel - 1, fluidInputs, itemInputs);
+ } else {
+ inputConsumer.consume(recipe, currentParallel, fluidInputs, itemInputs);
+ }
+ }
+ }
+
+ if (currentParallel <= 0) {
+ result = CheckRecipeResultRegistry.INTERNAL_ERROR;
+ return;
+ }
+
+ long eutUseAfterOC = calculator.calculateEUtConsumptionUnderOneTick(originalMaxParallel, currentParallel);
+ calculator.setParallel(Math.min(currentParallel, originalMaxParallel))
+ .calculate();
+ if (currentParallel > originalMaxParallel) {
+ calculator.setRecipeEUt(eutUseAfterOC);
+ }
+ // If Batch Mode is enabled determine how many extra parallels we can get
+ if (batchMode && currentParallel > 0 && calculator.getDuration() < MAX_BATCH_MODE_TICK_TIME) {
+ int tExtraParallels;
+ double batchMultiplierMax = MAX_BATCH_MODE_TICK_TIME / calculator.getDuration();
+ final int maxExtraParallels = (int) Math.floor(
+ Math.min(
+ currentParallel * Math.min(batchMultiplierMax - 1, batchModifier - 1),
+ maxParallel - currentParallel));
+ if (recipeCheck != null) {
+ tExtraParallels = recipeCheck.checkRecipeInputs(true, maxExtraParallels, itemInputs, fluidInputs);
+ } else {
+ tExtraParallels = (int) maxParallelCalculator
+ .calculate(recipe, maxExtraParallels, fluidInputs, itemInputs);
+ inputConsumer.consume(recipe, tExtraParallels, fluidInputs, itemInputs);
+ }
+ durationMultiplier = 1.0f + (float) tExtraParallels / currentParallel;
+ currentParallel += tExtraParallels;
+ }
+
+ // If we want to calculate outputs we do it here
+ if (calculateOutputs && currentParallel > 0) {
+ calculateItemOutputs(truncatedItemOutputs);
+ calculateFluidOutputs(truncatedFluidOutputs);
+ }
+ result = CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ protected void copyInputs() {
+ ItemStack[] itemInputsToUse;
+ FluidStack[] fluidInputsToUse;
+ itemInputsToUse = new ItemStack[itemInputs.length];
+ for (int i = 0; i < itemInputs.length; i++) {
+ itemInputsToUse[i] = itemInputs[i].copy();
+ }
+ fluidInputsToUse = new FluidStack[fluidInputs.length];
+ for (int i = 0; i < fluidInputs.length; i++) {
+ fluidInputsToUse[i] = fluidInputs[i].copy();
+ }
+ itemInputs = itemInputsToUse;
+ fluidInputs = fluidInputsToUse;
+ }
+
+ private void calculateItemOutputs(ItemStack[] truncatedItemOutputs) {
+ if (customItemOutputCalculation != null) {
+ itemOutputs = customItemOutputCalculation.apply(currentParallel);
+ return;
+ }
+ if (truncatedItemOutputs.length == 0) return;
+ ArrayList<ItemStack> itemOutputsList = new ArrayList<>();
+ for (int i = 0; i < truncatedItemOutputs.length; i++) {
+ if (recipe.getOutput(i) == null) continue;
+ ItemStack origin = recipe.getOutput(i)
+ .copy();
+ final long itemStackSize = origin.stackSize;
+ double chancedOutputMultiplier = calculateChancedOutputMultiplier(
+ (int) (recipe.getOutputChance(i) * chanceMultiplier),
+ currentParallel);
+ long items = (long) Math.ceil(itemStackSize * chancedOutputMultiplier * outputMultiplier);
+ addItemsLong(itemOutputsList, origin, items);
+ }
+ itemOutputs = itemOutputsList.toArray(new ItemStack[0]);
+ }
+
+ private void calculateFluidOutputs(FluidStack[] truncatedFluidOutputs) {
+ if (customFluidOutputCalculation != null) {
+ fluidOutputs = customFluidOutputCalculation.apply(currentParallel);
+ return;
+ }
+ if (truncatedFluidOutputs.length == 0) return;
+ ArrayList<FluidStack> fluidOutputsList = new ArrayList<>();
+ for (int i = 0; i < truncatedFluidOutputs.length; i++) {
+ if (recipe.getFluidOutput(i) == null) continue;
+ FluidStack origin = recipe.getFluidOutput(i)
+ .copy();
+ long fluids = (long) this.outputMultiplier * origin.amount * currentParallel;
+
+ addFluidsLong(fluidOutputsList, origin, fluids);
+ }
+ fluidOutputs = fluidOutputsList.toArray(new FluidStack[0]);
+ }
+
+ private static final Random rand = new Random();
+
+ public static double calculateChancedOutputMultiplier(int chanceInt, int parallel) {
+ // Multiply the integer part of the chance directly with parallel
+ double multiplier = Math.floorDiv(chanceInt, 10000) * parallel;
+ int transformedChanceInt = chanceInt % 10000;
+ if (transformedChanceInt == 0) return multiplier;
+ // Calculation of the Decimal Part of chance
+ double chance = transformedChanceInt / 10000.0;
+ double mean = parallel * chance;
+ double stdDev = Math.sqrt(parallel * chance * (1 - chance));
+ // Check if everything within 3 standard deviations of mean is within the range
+ // of possible values (0 ~ currentParallel)
+ boolean isSuitableForFittingWithNormalDistribution = mean - 3 * stdDev >= 0 && mean + 3 * stdDev <= parallel;
+ if (isSuitableForFittingWithNormalDistribution) {
+ // Use Normal Distribution to fit Binomial Distribution
+ double tMultiplier = stdDev * rand.nextGaussian() + mean;
+ multiplier += Math.max(Math.min(tMultiplier, parallel), 0);
+ } else {
+ // Do Binomial Distribution by loop
+ for (int roll = 0; roll < parallel; roll++) {
+ if (transformedChanceInt > XSTR.XSTR_INSTANCE.nextInt(10000)) {
+ multiplier += 1;
+ }
+ }
+ }
+ return multiplier;
+ }
+
+ public static void addItemsLong(ArrayList<ItemStack> itemList, ItemStack origin, long amount) {
+ if (amount > 0) {
+ while (amount > Integer.MAX_VALUE) {
+ ItemStack item = origin.copy();
+ item.stackSize = Integer.MAX_VALUE;
+ itemList.add(item);
+ amount -= Integer.MAX_VALUE;
+ }
+ ItemStack item = origin.copy();
+ item.stackSize = (int) amount;
+ itemList.add(item);
+ }
+ }
+
+ public static void addFluidsLong(ArrayList<FluidStack> fluidList, FluidStack origin, long amount) {
+ if (amount > 0) {
+ while (amount > Integer.MAX_VALUE) {
+ FluidStack fluid = origin.copy();
+ fluid.amount = Integer.MAX_VALUE;
+ fluidList.add(fluid);
+ amount -= Integer.MAX_VALUE;
+ }
+ FluidStack fluid = origin.copy();
+ fluid.amount = (int) amount;
+ fluidList.add(fluid);
+ }
+ }
+
+ @FunctionalInterface
+ public interface MaxParallelCalculator {
+
+ double calculate(GT_Recipe recipe, int maxParallel, FluidStack[] fluids, ItemStack[] items);
+ }
+
+ @FunctionalInterface
+ public interface InputConsumer {
+
+ void consume(GT_Recipe recipe, int amountMultiplier, FluidStack[] aFluidInputs, ItemStack[] aInputs);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_PlayedSound.java b/src/main/java/gregtech/api/util/GT_PlayedSound.java
new file mode 100644
index 0000000000..05d61e9833
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_PlayedSound.java
@@ -0,0 +1,42 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.E;
+
+import net.minecraft.util.ResourceLocation;
+
+public class GT_PlayedSound {
+
+ public final String mSoundName;
+ public final int mX, mY, mZ;
+
+ public GT_PlayedSound(ResourceLocation aSoundResourceLocation, double aX, double aY, double aZ) {
+ mSoundName = aSoundResourceLocation.toString();
+ mX = (int) aX;
+ mY = (int) aY;
+ mZ = (int) aZ;
+ }
+
+ /**
+ * @inheritDoc
+ * @deprecated Use {@link GT_PlayedSound(ResourceLocation, double, double, double)}
+ */
+ @Deprecated
+ public GT_PlayedSound(String aSoundName, double aX, double aY, double aZ) {
+ this(new ResourceLocation(aSoundName == null ? E : aSoundName), aX, aY, aZ);
+ }
+
+ @Override
+ public boolean equals(Object aObject) {
+ if (aObject instanceof GT_PlayedSound) {
+ return ((GT_PlayedSound) aObject).mX == mX && ((GT_PlayedSound) aObject).mY == mY
+ && ((GT_PlayedSound) aObject).mZ == mZ
+ && ((GT_PlayedSound) aObject).mSoundName.equals(mSoundName);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return mX + mY + mZ + mSoundName.hashCode();
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_ProcessingArray_Manager.java b/src/main/java/gregtech/api/util/GT_ProcessingArray_Manager.java
new file mode 100644
index 0000000000..ead9393d0e
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_ProcessingArray_Manager.java
@@ -0,0 +1,51 @@
+package gregtech.api.util;
+
+import java.util.HashMap;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.recipe.RecipeMap;
+
+@Deprecated
+public class GT_ProcessingArray_Manager {
+
+ private static final HashMap<String, RecipeMap<?>> mRecipeSaves = new HashMap<>();
+ private static final HashMap<String, SoundResource> machineSounds = new HashMap<>();
+
+ // Adds recipe Maps to the PA using the machines unlocalized name.
+ // Example: basicmachine.electrolyzer, with its recipe map will add the electrolyzer's recipe map to the PA
+ public static void addRecipeMapToPA(String aMachineName, RecipeMap<?> aMap) {
+ if (aMachineName != null) {
+ mRecipeSaves.put(aMachineName, aMap);
+ }
+ }
+
+ // Allows the PA to extract the recipe map for the machine inside it.
+ public static RecipeMap<?> giveRecipeMap(String aMachineName) {
+ if (aMachineName != null) {
+ return mRecipeSaves.get(aMachineName);
+ }
+ return null;
+ }
+
+ public static void addSoundResourceToPA(String machineName, SoundResource soundResource) {
+ if (machineName != null) {
+ machineSounds.put(machineName, soundResource);
+ }
+ }
+
+ public static SoundResource getSoundResource(String machineName) {
+ if (machineName != null) {
+ return machineSounds.get(machineName);
+ }
+ return null;
+ }
+
+ public static String getMachineName(ItemStack stack) {
+ int length = stack.getUnlocalizedName()
+ .length();
+ return stack.getUnlocalizedName()
+ .substring(17, length - 8); // trim "gt.blockmachines." and ".tier.xx"
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_Recipe.java b/src/main/java/gregtech/api/util/GT_Recipe.java
new file mode 100644
index 0000000000..04f65a8342
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_Recipe.java
@@ -0,0 +1,1271 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.D2;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.Contract;
+
+import cpw.mods.fml.common.Loader;
+import cpw.mods.fml.common.ModContainer;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.recipe.RecipeCategory;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.RecipeMetadataKey;
+import gregtech.api.recipe.metadata.EmptyRecipeMetadataStorage;
+import gregtech.api.recipe.metadata.IRecipeMetadataStorage;
+import gregtech.api.util.extensions.ArrayExt;
+import gregtech.api.util.item.ItemHolder;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_InputBus_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Input_ME;
+import ic2.core.Ic2Items;
+import it.unimi.dsi.fastutil.objects.Object2LongArrayMap;
+import it.unimi.dsi.fastutil.objects.Object2LongMap;
+import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap;
+import it.unimi.dsi.fastutil.objects.Reference2LongArrayMap;
+import it.unimi.dsi.fastutil.objects.Reference2LongMap;
+import it.unimi.dsi.fastutil.objects.Reference2LongOpenHashMap;
+
+public class GT_Recipe implements Comparable<GT_Recipe> {
+
+ /**
+ * If you want to change the Output, feel free to modify or even replace the whole ItemStack Array, for Inputs,
+ * please add a new Recipe, because of the HashMaps.
+ */
+ public ItemStack[] mInputs, mOutputs;
+ /**
+ * If you want to change the Output, feel free to modify or even replace the whole ItemStack Array, for Inputs,
+ * please add a new Recipe, because of the HashMaps.
+ */
+ public FluidStack[] mFluidInputs, mFluidOutputs;
+ /**
+ * If you changed the amount of Array-Items inside the Output Array then the length of this Array must be larger or
+ * equal to the Output Array. A chance of 10000 equals 100%
+ */
+ public int[] mChances;
+ /**
+ * An Item that needs to be inside the Special Slot, like for example the Copy Slot inside the Printer. This is only
+ * useful for Fake Recipes in NEI, since findRecipe() and containsInput() don't give a shit about this Field. Lists
+ * are also possible.
+ */
+ public Object mSpecialItems;
+
+ public int mDuration, mEUt, mSpecialValue;
+ /**
+ * Use this to just disable a specific Recipe, but the Configuration enables that already for every single Recipe.
+ */
+ public boolean mEnabled = true;
+ /**
+ * If this Recipe is hidden from NEI
+ */
+ public boolean mHidden = false;
+ /**
+ * If this Recipe is Fake and therefore doesn't get found by the findRecipe Function (It is still in the HashMaps,
+ * so that containsInput does return T on those fake Inputs)
+ */
+ public boolean mFakeRecipe = false;
+ /**
+ * If this Recipe can be stored inside a Machine in order to make Recipe searching more Efficient by trying the
+ * previously used Recipe first. In case you have a Recipe Map overriding things and returning one time use Recipes,
+ * you have to set this to F.
+ */
+ public boolean mCanBeBuffered = true;
+ /**
+ * If this Recipe needs the Output Slots to be completely empty. Needed in case you have randomised Outputs
+ */
+ public boolean mNeedsEmptyOutput = false;
+ /**
+ * If this is set to true, NBT equality is required for recipe check.
+ */
+ public boolean isNBTSensitive = false;
+ /**
+ * Used for describing recipes that do not fit the default recipe pattern (for example Large Boiler Fuels)
+ */
+ private String[] neiDesc = null;
+ /**
+ * Holds a set of metadata for this recipe.
+ */
+ @Nonnull
+ private final IRecipeMetadataStorage metadataStorage;
+ /**
+ * Category this recipe belongs to. Recipes belonging to recipemap are forced to have non-null category when added,
+ * otherwise it can be null.
+ */
+ private RecipeCategory recipeCategory;
+ /**
+ * Stores which mod added this recipe
+ */
+ public List<ModContainer> owners = new ArrayList<>();
+ /**
+ * Stores stack traces where this recipe was added
+ */
+ // BW wants to overwrite it, so no final
+ public List<List<String>> stackTraces = new ArrayList<>();
+
+ private GT_Recipe(GT_Recipe aRecipe, boolean shallow) {
+ mInputs = shallow ? aRecipe.mInputs : GT_Utility.copyItemArray(aRecipe.mInputs);
+ mOutputs = shallow ? aRecipe.mOutputs : GT_Utility.copyItemArray(aRecipe.mOutputs);
+ mSpecialItems = aRecipe.mSpecialItems;
+ mChances = aRecipe.mChances;
+ mFluidInputs = shallow ? aRecipe.mFluidInputs : GT_Utility.copyFluidArray(aRecipe.mFluidInputs);
+ mFluidOutputs = shallow ? aRecipe.mFluidOutputs : GT_Utility.copyFluidArray(aRecipe.mFluidOutputs);
+ mDuration = aRecipe.mDuration;
+ mSpecialValue = aRecipe.mSpecialValue;
+ mEUt = aRecipe.mEUt;
+ mNeedsEmptyOutput = aRecipe.mNeedsEmptyOutput;
+ isNBTSensitive = aRecipe.isNBTSensitive;
+ mCanBeBuffered = aRecipe.mCanBeBuffered;
+ mFakeRecipe = aRecipe.mFakeRecipe;
+ mEnabled = aRecipe.mEnabled;
+ mHidden = aRecipe.mHidden;
+ metadataStorage = EmptyRecipeMetadataStorage.INSTANCE;
+ owners = new ArrayList<>(aRecipe.owners);
+ reloadOwner();
+ }
+
+ /**
+ * Only for {@link GT_RecipeBuilder}.
+ */
+ GT_Recipe(ItemStack[] mInputs, ItemStack[] mOutputs, FluidStack[] mFluidInputs, FluidStack[] mFluidOutputs,
+ int[] mChances, Object mSpecialItems, int mDuration, int mEUt, int mSpecialValue, boolean mEnabled,
+ boolean mHidden, boolean mFakeRecipe, boolean mCanBeBuffered, boolean mNeedsEmptyOutput, boolean nbtSensitive,
+ String[] neiDesc, @Nullable IRecipeMetadataStorage metadataStorage, RecipeCategory recipeCategory) {
+ this.mInputs = mInputs;
+ this.mOutputs = mOutputs;
+ this.mFluidInputs = mFluidInputs;
+ this.mFluidOutputs = mFluidOutputs;
+ this.mChances = mChances;
+ this.mSpecialItems = mSpecialItems;
+ this.mDuration = mDuration;
+ this.mEUt = mEUt;
+ this.mSpecialValue = mSpecialValue;
+ this.mEnabled = mEnabled;
+ this.mHidden = mHidden;
+ this.mFakeRecipe = mFakeRecipe;
+ this.mCanBeBuffered = mCanBeBuffered;
+ this.mNeedsEmptyOutput = mNeedsEmptyOutput;
+ this.isNBTSensitive = nbtSensitive;
+ this.neiDesc = neiDesc;
+ this.metadataStorage = metadataStorage == null ? EmptyRecipeMetadataStorage.INSTANCE : metadataStorage.copy();
+ this.recipeCategory = recipeCategory;
+
+ reloadOwner();
+ }
+
+ public GT_Recipe(boolean aOptimize, ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecialItems, int[] aChances,
+ FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue) {
+ if (aInputs == null) aInputs = new ItemStack[0];
+ if (aOutputs == null) aOutputs = new ItemStack[0];
+ if (aFluidInputs == null) aFluidInputs = new FluidStack[0];
+ if (aFluidOutputs == null) aFluidOutputs = new FluidStack[0];
+ if (aChances == null) aChances = new int[aOutputs.length];
+ if (aChances.length < aOutputs.length) aChances = Arrays.copyOf(aChances, aOutputs.length);
+
+ aInputs = ArrayExt.withoutTrailingNulls(aInputs, ItemStack[]::new);
+ aOutputs = ArrayExt.withoutTrailingNulls(aOutputs, ItemStack[]::new);
+ aFluidInputs = ArrayExt.withoutNulls(aFluidInputs, FluidStack[]::new);
+ aFluidOutputs = ArrayExt.withoutNulls(aFluidOutputs, FluidStack[]::new);
+
+ GT_OreDictUnificator.setStackArray(true, aInputs);
+ GT_OreDictUnificator.setStackArray(true, aOutputs);
+
+ for (ItemStack tStack : aOutputs) GT_Utility.updateItemStack(tStack);
+
+ for (int i = 0; i < aChances.length; i++) if (aChances[i] <= 0) aChances[i] = 10000;
+ for (int i = 0; i < aFluidInputs.length; i++) aFluidInputs[i] = aFluidInputs[i].copy();
+ for (int i = 0; i < aFluidOutputs.length; i++) aFluidOutputs[i] = aFluidOutputs[i].copy();
+
+ if (aOptimize && aDuration >= 32) {
+ ArrayList<ItemStack> tList = new ArrayList<>();
+ tList.addAll(Arrays.asList(aInputs));
+ tList.addAll(Arrays.asList(aOutputs));
+ for (int i = 0; i < tList.size(); i++) if (tList.get(i) == null) tList.remove(i--);
+
+ for (byte i = (byte) Math.min(64, aDuration / 16); i > 1; i--) if (aDuration / i >= 16) {
+ boolean temp = true;
+ for (ItemStack stack : tList) if (stack.stackSize % i != 0) {
+ temp = false;
+ break;
+ }
+ if (temp) for (FluidStack aFluidInput : aFluidInputs) if (aFluidInput.amount % i != 0) {
+ temp = false;
+ break;
+ }
+ if (temp) for (FluidStack aFluidOutput : aFluidOutputs) if (aFluidOutput.amount % i != 0) {
+ temp = false;
+ break;
+ }
+ if (temp) {
+ for (ItemStack itemStack : tList) itemStack.stackSize /= i;
+ for (FluidStack aFluidInput : aFluidInputs) aFluidInput.amount /= i;
+ for (FluidStack aFluidOutput : aFluidOutputs) aFluidOutput.amount /= i;
+ aDuration /= i;
+ }
+ }
+ }
+
+ mInputs = aInputs;
+ mOutputs = aOutputs;
+ mSpecialItems = aSpecialItems;
+ mChances = aChances;
+ mFluidInputs = aFluidInputs;
+ mFluidOutputs = aFluidOutputs;
+ mDuration = aDuration;
+ mSpecialValue = aSpecialValue;
+ mEUt = aEUt;
+ metadataStorage = EmptyRecipeMetadataStorage.INSTANCE;
+ // checkCellBalance();
+ reloadOwner();
+ }
+
+ // aSpecialValue = EU per Liter! If there is no Liquid for this Object, then it gets multiplied with 1000!
+ public GT_Recipe(ItemStack aInput1, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, ItemStack aOutput4,
+ int aSpecialValue, int aType) {
+ this(
+ true,
+ new ItemStack[] { aInput1 },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3, aOutput4 },
+ null,
+ null,
+ null,
+ null,
+ 0,
+ 0,
+ Math.max(1, aSpecialValue));
+
+ if (mInputs.length > 0 && aSpecialValue > 0) {
+ switch (aType) {
+ // Diesel Generator
+ case 0 -> {
+ RecipeMaps.dieselFuels.addRecipe(this);
+ RecipeMaps.largeBoilerFakeFuels.getBackend()
+ .addDieselRecipe(this);
+ }
+ // Gas Turbine
+ case 1 -> RecipeMaps.gasTurbineFuels.addRecipe(this);
+
+ // Thermal Generator
+ case 2 -> RecipeMaps.hotFuels.addRecipe(this);
+
+ // Plasma Generator
+ case 4 -> RecipeMaps.plasmaFuels.addRecipe(this);
+
+ // Magic Generator
+ case 5 -> RecipeMaps.magicFuels.addRecipe(this);
+
+ // Fluid Generator. Usually 3. Every wrong Type ends up in the Semifluid Generator
+ default -> {
+ RecipeMaps.denseLiquidFuels.addRecipe(this);
+ RecipeMaps.largeBoilerFakeFuels.getBackend()
+ .addDenseLiquidRecipe(this);
+ }
+ }
+ }
+ }
+
+ // Dummy GT_Recipe maker...
+ public GT_Recipe(ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecialItems, int[] aChances,
+ FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue) {
+ this(
+ true,
+ aInputs,
+ aOutputs,
+ aSpecialItems,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUt,
+ aSpecialValue);
+ }
+
+ /**
+ * Re-unificates all the items present in recipes.
+ */
+ public static void reInit() {
+ GT_Log.out.println("GT_Mod: Re-Unificating Recipes.");
+ for (RecipeMap<?> map : RecipeMap.ALL_RECIPE_MAPS.values()) {
+ map.getBackend()
+ .reInit();
+ }
+ }
+
+ public ItemStack getRepresentativeInput(int aIndex) {
+ if (aIndex < 0 || aIndex >= mInputs.length) return null;
+ return GT_Utility.copyOrNull(mInputs[aIndex]);
+ }
+
+ public ItemStack getOutput(int aIndex) {
+ if (aIndex < 0 || aIndex >= mOutputs.length) return null;
+ return GT_Utility.copyOrNull(mOutputs[aIndex]);
+ }
+
+ /**
+ * Dictates the ItemStacks displayed in the output slots of any NEI page handled by the default GT NEI handler.
+ * Override to make shown items differ from a GT_Recipe's item output array
+ *
+ * @see gregtech.nei.GT_NEI_DefaultHandler
+ * @param i Slot index
+ * @return ItemStack to be displayed in the slot
+ */
+ public ItemStack getRepresentativeOutput(int i) {
+ return getOutput(i);
+ }
+
+ public int getOutputChance(int aIndex) {
+ if (mChances == null) return 10000;
+ if (aIndex < 0 || aIndex >= mChances.length) return 10000;
+ return mChances[aIndex];
+ }
+
+ public FluidStack getRepresentativeFluidInput(int aIndex) {
+ if (aIndex < 0 || aIndex >= mFluidInputs.length || mFluidInputs[aIndex] == null) return null;
+ return mFluidInputs[aIndex].copy();
+ }
+
+ public FluidStack getFluidOutput(int aIndex) {
+ if (aIndex < 0 || aIndex >= mFluidOutputs.length || mFluidOutputs[aIndex] == null) return null;
+ return mFluidOutputs[aIndex].copy();
+ }
+
+ public void checkCellBalance() {
+ if (!D2 || mInputs.length < 1) return;
+
+ int tInputAmount = GT_ModHandler.getCapsuleCellContainerCountMultipliedWithStackSize(mInputs);
+ int tOutputAmount = GT_ModHandler.getCapsuleCellContainerCountMultipliedWithStackSize(mOutputs);
+
+ if (tInputAmount < tOutputAmount) {
+ if (!Materials.Tin.contains(mInputs)) {
+ GT_Log.err.println("You get more Cells, than you put in? There must be something wrong.");
+ new Exception().printStackTrace(GT_Log.err);
+ }
+ } else if (tInputAmount > tOutputAmount) {
+ if (!Materials.Tin.contains(mOutputs)) {
+ GT_Log.err.println("You get less Cells, than you put in? GT Machines usually don't destroy Cells.");
+ new Exception().printStackTrace(GT_Log.err);
+ }
+ }
+ }
+
+ public GT_Recipe copy() {
+ return new GT_Recipe(this, false);
+ }
+
+ public GT_Recipe copyShallow() {
+ return new GT_Recipe(this, true);
+ }
+
+ public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess, FluidStack[] aFluidInputs,
+ ItemStack... aInputs) {
+ return isRecipeInputEqual(aDecreaseStacksizeBySuccess, false, 1, aFluidInputs, aInputs);
+ }
+
+ // For non-multiplied recipe amount values
+ public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess, boolean aDontCheckStackSizes,
+ FluidStack[] aFluidInputs, ItemStack... aInputs) {
+ return isRecipeInputEqual(aDecreaseStacksizeBySuccess, aDontCheckStackSizes, 1, aFluidInputs, aInputs);
+ }
+
+ /**
+ * Okay, did some code archeology to figure out what's going on here.
+ *
+ * <p>
+ * This variable was added in <a
+ * href=https://github.com/GTNewHorizons/GT5-Unofficial/commit/9959ab7443982a19ad329bca424ab515493432e9>this
+ * commit,</a> in order to fix the issues mentioned in <a
+ * href=https://github.com/GTNewHorizons/GT5-Unofficial/pull/183>the PR</a>.
+ *
+ * <p>
+ * It looks like it controls checking NBT. At this point, since we are still using universal fluid cells which store
+ * their fluids in NBT, it probably will not be safe to disable the NBT checks in the near future. Data sticks may
+ * be another case. Anyway, we probably can't get rid of this without some significant changes to clean up recipe
+ * inputs.
+ */
+ public static boolean GTppRecipeHelper;
+
+ /**
+ * WARNING: Do not call this method with both {@code aDecreaseStacksizeBySuccess} and {@code aDontCheckStackSizes}
+ * set to {@code true}! You'll get weird behavior.
+ */
+ public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess, boolean aDontCheckStackSizes,
+ int amountMultiplier, FluidStack[] aFluidInputs, ItemStack... aInputs) {
+ double maxParallel = maxParallelCalculatedByInputs(amountMultiplier, aFluidInputs, aInputs);
+ if (aDontCheckStackSizes) {
+ return maxParallel > 0;
+ } else if (maxParallel >= amountMultiplier) {
+ if (aDecreaseStacksizeBySuccess) {
+ consumeInput(amountMultiplier, aFluidInputs, aInputs);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * WARNING: Ensure that item inputs and fluid inputs are enough to be consumed with
+ * {@link #maxParallelCalculatedByInputs} before calling this method!
+ */
+ public void consumeInput(int amountMultiplier, FluidStack[] aFluidInputs, ItemStack... aInputs) {
+ if (amountMultiplier <= 0) return;
+
+ long remainingCost;
+
+ if (aFluidInputs != null) {
+ for (FluidStack recipeFluidCost : mFluidInputs) {
+ if (recipeFluidCost != null) {
+ remainingCost = (long) recipeFluidCost.amount * amountMultiplier;
+
+ for (FluidStack providedFluid : aFluidInputs) {
+ if (providedFluid != null && providedFluid.isFluidEqual(recipeFluidCost)) {
+ if (providedFluid.amount >= remainingCost) {
+ providedFluid.amount -= remainingCost;
+ break;
+ } else {
+ remainingCost -= providedFluid.amount;
+ providedFluid.amount = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (aInputs != null) {
+ for (ItemStack recipeItemCost : mInputs) {
+ ItemStack unifiedItemCost = GT_OreDictUnificator.get_nocopy(true, recipeItemCost);
+ if (unifiedItemCost != null) {
+ remainingCost = (long) recipeItemCost.stackSize * amountMultiplier;
+
+ for (ItemStack providedItem : aInputs) {
+ if (isNBTSensitive && !GT_Utility.areStacksEqual(providedItem, unifiedItemCost, false)) {
+ continue;
+ } else if (!isNBTSensitive
+ && !GT_OreDictUnificator.isInputStackEqual(providedItem, unifiedItemCost)) {
+ continue;
+ }
+
+ if (GTppRecipeHelper) { // Please see JavaDoc on GTppRecipeHelper for why this is here.
+ if (GT_Utility.areStacksEqual(providedItem, Ic2Items.FluidCell.copy(), true)
+ || GT_Utility.areStacksEqual(providedItem, ItemList.Tool_DataStick.get(1L), true)
+ || GT_Utility.areStacksEqual(providedItem, ItemList.Tool_DataOrb.get(1L), true)) {
+ if (!GT_Utility.areStacksEqual(providedItem, recipeItemCost, false)) continue;
+ }
+ }
+
+ if (providedItem.stackSize >= remainingCost) {
+ providedItem.stackSize -= remainingCost;
+ break;
+ } else {
+ remainingCost -= providedItem.stackSize;
+ providedItem.stackSize = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the number of parallel recipes, or 0 if recipe is not satisfied at all. 0 < number < 1 means that inputs
+ * are found but not enough.
+ */
+ public double maxParallelCalculatedByInputs(int maxParallel, FluidStack[] aFluidInputs, ItemStack... aInputs) {
+ if (mInputs.length > 0 && aInputs == null) return 0;
+ if (mFluidInputs.length > 0 && aFluidInputs == null) return 0;
+
+ double currentParallel = maxParallel;
+
+ // We need to have any fluids inputs, otherwise the code below does nothing. The second check is always true
+ // because of early exit condition above.
+ if (mFluidInputs.length > 0 /* && aFluidInputs != null */) {
+ // Create map for fluid -> stored amount
+ Reference2LongMap<Fluid> fluidMap = new Reference2LongArrayMap<>(2);
+ Reference2LongMap<Fluid> fluidCost = new Reference2LongArrayMap<>(2);
+ for (FluidStack fluidStack : aFluidInputs) {
+ if (fluidStack == null) continue;
+ fluidMap.mergeLong(fluidStack.getFluid(), fluidStack.amount, Long::sum);
+ }
+ for (FluidStack fluidStack : mFluidInputs) {
+ if (fluidStack == null) continue;
+ fluidCost.mergeLong(fluidStack.getFluid(), fluidStack.amount, Long::sum);
+ }
+
+ // Check how many parallels can it perform for each fluid
+ for (Reference2LongMap.Entry<Fluid> costEntry : fluidCost.reference2LongEntrySet()) {
+ if (costEntry.getLongValue() > 0) {
+ currentParallel = Math.min(
+ currentParallel,
+ (double) fluidMap.getOrDefault(costEntry.getKey(), 0L) / costEntry.getLongValue());
+ }
+ if (currentParallel <= 0) {
+ return 0;
+ }
+ }
+ }
+
+ if (mInputs.length > 0) {
+ double remainingCost;
+ long providedAmount;
+ Object2LongMap<GT_Utility.ItemId> itemCostMap = new Object2LongArrayMap<>(2);
+
+ for (ItemStack itemStack : mInputs) {
+ if (itemStack == null) continue;
+ if (shouldCheckNBT(itemStack)) {
+ GT_Utility.ItemId itemId = GT_Utility.ItemId.createNoCopy(itemStack);
+ itemCostMap.mergeLong(itemId, itemStack.stackSize, Long::sum);
+ continue;
+ }
+ ItemStack unifiedItem = GT_OreDictUnificator.get_nocopy(true, itemStack);
+ if (unifiedItem != null) {
+ GT_Utility.ItemId unifiedId;
+ if (isNBTSensitive) unifiedId = GT_Utility.ItemId.createNoCopy(unifiedItem);
+ else unifiedId = GT_Utility.ItemId.createWithoutNBT(unifiedItem);
+ itemCostMap.mergeLong(unifiedId, itemStack.stackSize, Long::sum);
+ }
+ }
+
+ ItemStack unifiedItemCost;
+ nextRecipeItemCost: for (Map.Entry<GT_Utility.ItemId, Long> costEntry : itemCostMap.entrySet()) {
+ unifiedItemCost = costEntry.getKey()
+ .getItemStack();
+ if (unifiedItemCost != null) {
+ remainingCost = costEntry.getValue() * currentParallel;
+ providedAmount = 0;
+
+ for (ItemStack providedItem : aInputs) {
+ if (!areInputStackAndRecipeCostMatched(providedItem, unifiedItemCost)) continue;
+ // for non-consumed input
+ if (costEntry.getValue() == 0) continue nextRecipeItemCost;
+
+ providedAmount += providedItem.stackSize;
+
+ if (providedAmount >= remainingCost) continue nextRecipeItemCost;
+ }
+ if (providedAmount == 0) return 0;
+ currentParallel = Math.min(currentParallel, (double) providedAmount / costEntry.getValue());
+ }
+ }
+ }
+ return currentParallel;
+ }
+
+ private boolean areInputStackAndRecipeCostMatched(ItemStack providedItem, ItemStack unifiedItemCost) {
+ if (isNBTSensitive || shouldCheckNBT(providedItem)) {
+ return GT_Utility.areStacksEqual(providedItem, unifiedItemCost, false);
+ } else {
+ return GT_OreDictUnificator.isInputStackEqual(providedItem, unifiedItemCost);
+ }
+ }
+
+ /**
+ * Please see JavaDoc on {@link #GTppRecipeHelper} for why this is here.
+ */
+ private boolean shouldCheckNBT(ItemStack item) {
+ if (GTppRecipeHelper) {
+ return GT_Utility.areStacksEqual(item, Ic2Items.FluidCell.copy(), true)
+ || GT_Utility.areStacksEqual(item, ItemList.Tool_DataStick.get(1L), true)
+ || GT_Utility.areStacksEqual(item, ItemList.Tool_DataOrb.get(1L), true);
+ }
+ return false;
+ }
+
+ public boolean isRecipePossible(@Nullable ItemInventoryLogic itemInput, @Nullable FluidInventoryLogic fluidInput) {
+ return getAmountOfRecipesDone(itemInput, fluidInput, 1, true) > 0;
+ }
+
+ public long getAmountOfRecipesDone(@Nullable ItemInventoryLogic itemInput, @Nullable FluidInventoryLogic fluidInput,
+ long maxParallel, boolean simulate) {
+ if (itemInput == null) {
+ itemInput = new ItemInventoryLogic(0);
+ }
+
+ if (fluidInput == null) {
+ fluidInput = new FluidInventoryLogic(0, 0);
+ }
+
+ itemInput.startRecipeCheck();
+ Map<ItemHolder, Long> recipeItems = getItemInputsAsItemMap();
+ for (Entry<ItemHolder, Long> entry : recipeItems.entrySet()) {
+ maxParallel = Math
+ .min(maxParallel, itemInput.calculateAmountOfTimesItemCanBeTaken(entry.getKey(), entry.getValue()));
+ }
+
+ for (FluidStack fluid : mFluidInputs) {
+ if (fluid == null) continue;
+ maxParallel = Math
+ .min(maxParallel, fluidInput.calculateAmountOfTimesFluidCanBeTaken(fluid.getFluid(), fluid.amount));
+ }
+
+ if (simulate) {
+ itemInput.stopRecipeCheck();
+ return maxParallel;
+ }
+
+ for (Entry<ItemHolder, Long> entry : recipeItems.entrySet()) {
+ itemInput.subtractItemAmount(entry.getKey(), entry.getValue() * maxParallel, false);
+ }
+
+ for (FluidStack fluid : mFluidInputs) {
+ if (fluid == null) continue;
+ fluidInput.drain(fluid.getFluid(), fluid.amount * maxParallel, false);
+ }
+ itemInput.stopRecipeCheck();
+ return maxParallel;
+ }
+
+ private Map<ItemHolder, Long> getItemInputsAsItemMap() {
+ Map<ItemHolder, Long> items = new HashMap<>();
+ for (ItemStack item : mInputs) {
+ if (item == null) continue;
+ ItemHolder itemHolder = new ItemHolder(item);
+ items.put(itemHolder, items.getOrDefault(itemHolder, 0L) + item.stackSize);
+ }
+ return items;
+ }
+
+ @Override
+ public int compareTo(GT_Recipe recipe) {
+ // first lowest tier recipes
+ // then fastest
+ // then with lowest special value
+ // then dry recipes
+ // then with fewer inputs
+ if (this.mEUt != recipe.mEUt) {
+ return this.mEUt - recipe.mEUt;
+ } else if (this.mDuration != recipe.mDuration) {
+ return this.mDuration - recipe.mDuration;
+ } else if (this.mSpecialValue != recipe.mSpecialValue) {
+ return this.mSpecialValue - recipe.mSpecialValue;
+ } else if (this.mFluidInputs.length != recipe.mFluidInputs.length) {
+ return this.mFluidInputs.length - recipe.mFluidInputs.length;
+ } else if (this.mInputs.length != recipe.mInputs.length) {
+ return this.mInputs.length - recipe.mInputs.length;
+ }
+ return 0;
+ }
+
+ public String[] getNeiDesc() {
+ return neiDesc;
+ }
+
+ /**
+ * Sets description shown on NEI. <br>
+ * If you have a large number of recipes for the recipemap, this is not efficient memory wise, so use
+ * {@link gregtech.api.recipe.RecipeMapBuilder#neiSpecialInfoFormatter} instead.
+ */
+ public void setNeiDesc(String... neiDesc) {
+ this.neiDesc = neiDesc;
+ }
+
+ // region metadata
+
+ // Don't try implementing setMetadata, as metadataStorage can be EmptyRecipeMetadataStorage
+
+ /**
+ * Gets metadata associated with this recipe. Can return null. Use
+ * {@link #getMetadataOrDefault(RecipeMetadataKey, Object)}
+ * if you want to specify default value.
+ */
+ @Nullable
+ public <T> T getMetadata(RecipeMetadataKey<T> key) {
+ return key.cast(metadataStorage.getMetadata(key));
+ }
+
+ /**
+ * Gets metadata associated with this recipe with default value. Does not return null unless default value is null.
+ */
+ @Contract("_, !null -> !null")
+ @Nullable
+ public <T> T getMetadataOrDefault(RecipeMetadataKey<T> key, @Nullable T defaultValue) {
+ return key.cast(metadataStorage.getMetadataOrDefault(key, defaultValue));
+ }
+
+ @Nonnull
+ public IRecipeMetadataStorage getMetadataStorage() {
+ return metadataStorage;
+ }
+
+ // endregion
+
+ public RecipeCategory getRecipeCategory() {
+ return recipeCategory;
+ }
+
+ /**
+ * Exists only for recipe copying from external. For ordinal use case, use {@link GT_RecipeBuilder#recipeCategory}.
+ */
+ public void setRecipeCategory(RecipeCategory recipeCategory) {
+ this.recipeCategory = recipeCategory;
+ }
+
+ private static final List<String> excludedStacktraces = Arrays.asList(
+ "java.lang.Thread",
+ "gregtech.api.interfaces.IRecipeMap",
+ "gregtech.api.interfaces.IRecipeMap$1",
+ "gregtech.api.recipe.RecipeMap",
+ "gregtech.api.recipe.RecipeMapBackend",
+ "gregtech.api.recipe.RecipeMapBackendPropertiesBuilder",
+ "gregtech.api.util.GT_Recipe",
+ "gregtech.api.util.GT_RecipeBuilder",
+ "gregtech.api.util.GT_RecipeConstants",
+ "gregtech.api.util.GT_RecipeMapUtil",
+ "gregtech.common.GT_RecipeAdder");
+
+ public void reloadOwner() {
+ setOwner(
+ Loader.instance()
+ .activeModContainer());
+
+ if (GT_Mod.gregtechproxy.mNEIRecipeOwnerStackTrace) {
+ List<String> toAdd = new ArrayList<>();
+ for (StackTraceElement stackTrace : Thread.currentThread()
+ .getStackTrace()) {
+ if (excludedStacktraces.stream()
+ .noneMatch(
+ c -> stackTrace.getClassName()
+ .equals(c))) {
+ toAdd.add(formatStackTrace(stackTrace));
+ }
+ }
+ stackTraces.add(toAdd);
+ }
+ }
+
+ private static String formatStackTrace(StackTraceElement stackTraceElement) {
+ String raw = stackTraceElement.toString();
+ int startParen = raw.lastIndexOf('(');
+ int colon = raw.lastIndexOf(':');
+ if (colon == -1) {
+ // native or unknown source
+ return raw;
+ }
+ // strip class name and leave line number, as class name is already shown
+ return raw.substring(0, startParen + 1) + raw.substring(colon);
+ }
+
+ public void setOwner(ModContainer newOwner) {
+ ModContainer oldOwner = !owners.isEmpty() ? this.owners.get(owners.size() - 1) : null;
+ if (newOwner != null && newOwner != oldOwner) {
+ owners.add(newOwner);
+ }
+ }
+
+ /**
+ * Use in case {@link Loader#activeModContainer()} isn't helpful
+ */
+ public void setOwner(String modId) {
+ for (ModContainer mod : Loader.instance()
+ .getModList()) {
+ if (mod.getModId()
+ .equals(modId)) {
+ setOwner(mod);
+ return;
+ }
+ }
+ }
+
+ public GT_Recipe setInputs(ItemStack... aInputs) {
+ // TODO determine if we need this without trailing nulls call
+ this.mInputs = ArrayExt.withoutTrailingNulls(aInputs, ItemStack[]::new);
+ return this;
+ }
+
+ public GT_Recipe setOutputs(ItemStack... aOutputs) {
+ this.mOutputs = ArrayExt.withoutTrailingNulls(aOutputs, ItemStack[]::new);
+ return this;
+ }
+
+ public GT_Recipe setFluidInputs(FluidStack... aInputs) {
+ this.mFluidInputs = ArrayExt.withoutTrailingNulls(aInputs, FluidStack[]::new);
+ return this;
+ }
+
+ public GT_Recipe setFluidOutputs(FluidStack... aOutputs) {
+ this.mFluidOutputs = ArrayExt.withoutTrailingNulls(aOutputs, FluidStack[]::new);
+ return this;
+ }
+
+ public GT_Recipe setDuration(int aDuration) {
+ this.mDuration = aDuration;
+ return this;
+ }
+
+ public GT_Recipe setEUt(int aEUt) {
+ this.mEUt = aEUt;
+ return this;
+ }
+
+ public static class GT_Recipe_AssemblyLine {
+
+ public static final ArrayList<GT_Recipe_AssemblyLine> sAssemblylineRecipes = new ArrayList<>();
+
+ static {
+ if (!Boolean.getBoolean("com.gtnh.gt5u.ignore-invalid-assline-recipe"))
+ GregTech_API.sFirstWorldTick.add(GT_Recipe_AssemblyLine::checkInvalidRecipes);
+ else GT_Log.out.println("NOT CHECKING INVALID ASSLINE RECIPE.");
+ }
+
+ private static void checkInvalidRecipes() {
+ int invalidCount = 0;
+ GT_Log.out.println("Started assline validation");
+ for (GT_Recipe_AssemblyLine recipe : sAssemblylineRecipes) {
+ if (recipe.getPersistentHash() == 0) {
+ invalidCount++;
+ GT_Log.err.printf("Invalid recipe: %s%n", recipe);
+ }
+ }
+ if (invalidCount > 0) throw new RuntimeException(
+ "There are " + invalidCount + " invalid assembly line recipe(s)! Check GregTech.log for details!");
+ }
+
+ public ItemStack mResearchItem;
+ public int mResearchTime;
+ public ItemStack[] mInputs;
+ public FluidStack[] mFluidInputs;
+ public ItemStack mOutput;
+ public int mDuration;
+ public int mEUt;
+ public ItemStack[][] mOreDictAlt;
+ private int mPersistentHash;
+
+ /**
+ * THIS CONSTRUCTOR DOES SET THE PERSISTENT HASH.
+ * <p>
+ * if you set one yourself, it will give you one of the RunetimeExceptions!
+ */
+ public GT_Recipe_AssemblyLine(ItemStack aResearchItem, int aResearchTime, ItemStack[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt) {
+ this(
+ aResearchItem,
+ aResearchTime,
+ aInputs,
+ aFluidInputs,
+ aOutput,
+ aDuration,
+ aEUt,
+ new ItemStack[aInputs.length][]);
+ int tPersistentHash = 1;
+ for (ItemStack tInput : aInputs)
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(tInput, true, false);
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(aResearchItem, true, false);
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(aOutput, true, false);
+ for (FluidStack tFluidInput : aFluidInputs)
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(tFluidInput, true, false);
+ tPersistentHash = tPersistentHash * 31 + aResearchTime;
+ tPersistentHash = tPersistentHash * 31 + aDuration;
+ tPersistentHash = tPersistentHash * 31 + aEUt;
+ setPersistentHash(tPersistentHash);
+ }
+
+ /**
+ * THIS CONSTRUCTOR DOES <b>NOT</b> SET THE PERSISTENT HASH.
+ * <p>
+ * if you don't set one yourself, it will break a lot of stuff!
+ */
+ public GT_Recipe_AssemblyLine(ItemStack aResearchItem, int aResearchTime, ItemStack[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt, ItemStack[][] aAlt) {
+ mResearchItem = aResearchItem;
+ mResearchTime = aResearchTime;
+ mInputs = aInputs;
+ mFluidInputs = aFluidInputs;
+ mOutput = aOutput;
+ mDuration = aDuration;
+ mEUt = aEUt;
+ mOreDictAlt = aAlt;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ GT_ItemStack[] thisInputs = new GT_ItemStack[this.mInputs.length];
+ int totalInputStackSize = 0;
+ for (int i = 0; i < this.mInputs.length; i++) {
+ thisInputs[i] = new GT_ItemStack(this.mInputs[i]);
+ totalInputStackSize += thisInputs[i].mStackSize;
+ }
+ int inputHash = Arrays.deepHashCode(thisInputs);
+ int inputFluidHash = Arrays.deepHashCode(this.mFluidInputs);
+ GT_ItemStack thisOutput = new GT_ItemStack(mOutput);
+ GT_ItemStack thisResearch = new GT_ItemStack(mResearchItem);
+ int miscRecipeDataHash = Arrays.deepHashCode(
+ new Object[] { totalInputStackSize, mDuration, mEUt, thisOutput, thisResearch, mResearchTime });
+ result = prime * result + inputFluidHash;
+ result = prime * result + inputHash;
+ result = prime * result + miscRecipeDataHash;
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof GT_Recipe_AssemblyLine other)) {
+ return false;
+ }
+ if (this.mInputs.length != other.mInputs.length) {
+ return false;
+ }
+ if (this.mFluidInputs.length != other.mFluidInputs.length) {
+ return false;
+ }
+ // Check Outputs Match
+ GT_ItemStack output1 = new GT_ItemStack(this.mOutput);
+ GT_ItemStack output2 = new GT_ItemStack(other.mOutput);
+ if (!output1.equals(output2)) {
+ return false;
+ }
+ // Check Scanned Item Match
+ GT_ItemStack scan1 = new GT_ItemStack(this.mResearchItem);
+ GT_ItemStack scan2 = new GT_ItemStack(other.mResearchItem);
+ if (!scan1.equals(scan2)) {
+ return false;
+ }
+ // Check Items Match
+ GT_ItemStack[] thisInputs = new GT_ItemStack[this.mInputs.length];
+ GT_ItemStack[] otherInputs = new GT_ItemStack[other.mInputs.length];
+ for (int i = 0; i < thisInputs.length; i++) {
+ thisInputs[i] = new GT_ItemStack(this.mInputs[i]);
+ otherInputs[i] = new GT_ItemStack(other.mInputs[i]);
+ }
+ for (int i = 0; i < thisInputs.length; i++) {
+ if (!thisInputs[i].equals(otherInputs[i]) || thisInputs[i].mStackSize != otherInputs[i].mStackSize) {
+ return false;
+ }
+ }
+ // Check Fluids Match
+ for (int i = 0; i < this.mFluidInputs.length; i++) {
+ if (!this.mFluidInputs[i].isFluidStackIdentical(other.mFluidInputs[i])) {
+ return false;
+ }
+ }
+
+ return this.mDuration == other.mDuration && this.mEUt == other.mEUt
+ && this.mResearchTime == other.mResearchTime;
+ }
+
+ public int getPersistentHash() {
+ if (mPersistentHash == 0)
+ GT_Log.err.println("Assline recipe persistent hash has not been set! Recipe: " + mOutput);
+ return mPersistentHash;
+ }
+
+ @Override
+ public String toString() {
+ return "GT_Recipe_AssemblyLine{" + "mResearchItem="
+ + mResearchItem
+ + ", mResearchTime="
+ + mResearchTime
+ + ", mInputs="
+ + Arrays.toString(mInputs)
+ + ", mFluidInputs="
+ + Arrays.toString(mFluidInputs)
+ + ", mOutput="
+ + mOutput
+ + ", mDuration="
+ + mDuration
+ + ", mEUt="
+ + mEUt
+ + ", mOreDictAlt="
+ + Arrays.toString(mOreDictAlt)
+ + '}';
+ }
+
+ /**
+ * @param aPersistentHash the persistent hash. it should reflect the exact input used to generate this recipe If
+ * 0 is passed in, the actual persistent hash will be automatically remapped to 1
+ * instead.
+ * @throws IllegalStateException if the persistent hash has been set already
+ */
+ public void setPersistentHash(int aPersistentHash) {
+ if (this.mPersistentHash != 0) throw new IllegalStateException("Cannot set persistent hash twice!");
+ if (aPersistentHash == 0) this.mPersistentHash = 1;
+ else this.mPersistentHash = aPersistentHash;
+ }
+
+ /**
+ * @param inputBusses List of input busses to check.
+ * @return An array containing the amount of item to consume from the first slot of every input bus.
+ * {@code null} if at least one item fails to match the recipe ingredient.
+ */
+ public static int[] getItemConsumptionAmountArray(ArrayList<GT_MetaTileEntity_Hatch_InputBus> inputBusses,
+ GT_Recipe_AssemblyLine recipe) {
+ int itemCount = recipe.mInputs.length;
+ if (itemCount == 0) return null;
+ int[] tStacks = new int[itemCount];
+ for (int i = 0; i < itemCount; i++) {
+ GT_MetaTileEntity_Hatch_InputBus inputBus = inputBusses.get(i);
+ if (!inputBus.isValid()) return null;
+ ItemStack slotStack;
+ if (inputBus instanceof GT_MetaTileEntity_Hatch_InputBus_ME meBus) {
+ slotStack = meBus.getShadowItemStack(0);
+ } else {
+ slotStack = inputBus.getStackInSlot(0);
+ }
+ if (slotStack == null) return null;
+
+ int amount = getMatchedIngredientAmount(slotStack, recipe.mInputs[i], recipe.mOreDictAlt[i]);
+ if (amount < 0) return null;
+
+ tStacks[i] = amount;
+ }
+ return tStacks;
+ }
+
+ public static int getMatchedIngredientAmount(ItemStack aSlotStack, ItemStack aIngredient, ItemStack[] alts) {
+ if (alts == null || alts.length == 0) {
+ if (GT_Utility.areStacksEqual(aSlotStack, aIngredient, true)) {
+ return aIngredient.stackSize;
+ }
+ return -1;
+ }
+ for (ItemStack tAltStack : alts) {
+ if (GT_Utility.areStacksEqual(aSlotStack, tAltStack, true)) {
+ return tAltStack.stackSize;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * @param inputBusses Input bus list to check. Usually the input bus list of multi.
+ * @param itemConsumptions Should be generated by {@link GT_Recipe_AssemblyLine#getItemConsumptionAmountArray}.
+ * @Return The number of parallel recipes, or 0 if recipe is not satisfied at all. 0 < number < 1 means that
+ * inputs are found but not enough.
+ */
+ public static double maxParallelCalculatedByInputItems(ArrayList<GT_MetaTileEntity_Hatch_InputBus> inputBusses,
+ int maxParallel, int[] itemConsumptions, Map<GT_Utility.ItemId, ItemStack> inputsFromME) {
+ // Recipe item matching is done in the generation of itemConsumptions.
+
+ Map<GT_Utility.ItemId, Long> itemConsumptionsFromME = new Object2LongOpenHashMap<>();
+ double currentParallel = maxParallel;
+
+ // Calculate the amount of each item to consume from ME
+ for (int i = 0; i < itemConsumptions.length; i++) {
+ GT_MetaTileEntity_Hatch_InputBus inputBus = inputBusses.get(i);
+ if (!inputBus.isValid()) return 0;
+ if (inputBus instanceof GT_MetaTileEntity_Hatch_InputBus_ME meBus) {
+ ItemStack item = meBus.getShadowItemStack(0);
+ if (item == null) return 0;
+ GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(item);
+ itemConsumptionsFromME.merge(id, (long) itemConsumptions[i], Long::sum);
+ }
+ }
+ // Calculate parallel from ME input busses
+ for (Entry<GT_Utility.ItemId, Long> entry : itemConsumptionsFromME.entrySet()) {
+ if (!inputsFromME.containsKey(entry.getKey())) return 0;
+ long consume = entry.getValue();
+ // For non-consumed inputs
+ if (consume == 0) continue;
+ currentParallel = Math
+ .min(currentParallel, (double) inputsFromME.get(entry.getKey()).stackSize / consume);
+ if (currentParallel <= 0) return 0;
+ }
+
+ // Calculate parallel from regular input busses
+ for (int i = 0; i < itemConsumptions.length; i++) {
+ GT_MetaTileEntity_Hatch_InputBus inputBus = inputBusses.get(i);
+ if (!inputBus.isValid()) return 0;
+ if (inputBus instanceof GT_MetaTileEntity_Hatch_InputBus_ME) continue;
+
+ ItemStack item = inputBus.getStackInSlot(0);
+ if (item == null) return 0;
+ // For non-consumed inputs
+ if (itemConsumptions[i] == 0) continue;
+ currentParallel = Math.min(currentParallel, (double) item.stackSize / itemConsumptions[i]);
+ if (currentParallel <= 0) return 0;
+ }
+ return currentParallel;
+ }
+
+ /**
+ * @param inputHatches Input hatch list to check. Usually the input hatch list of multi.
+ * @param fluidConsumptions Fluid inputs of the recipe.
+ * @return The number of parallel recipes, or 0 if recipe is not satisfied at all. 0 < number < 1 means that
+ * fluids are found but not enough.
+ */
+ public static double maxParallelCalculatedByInputFluids(ArrayList<GT_MetaTileEntity_Hatch_Input> inputHatches,
+ int maxParallel, FluidStack[] fluidConsumptions, Map<Fluid, FluidStack> fluidsFromME) {
+ Map<Fluid, Long> fluidConsumptionsFromME = new Reference2LongOpenHashMap<>();
+ double currentParallel = maxParallel;
+
+ // Calculate the amount of each fluid to consume from ME
+ for (int i = 0; i < fluidConsumptions.length; i++) {
+ GT_MetaTileEntity_Hatch_Input inputHatch = inputHatches.get(i);
+ if (!inputHatch.isValid()) return 0;
+ if (inputHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) {
+ FluidStack fluid = meHatch.getShadowFluidStack(0);
+ if (fluid == null) return 0;
+ if (!GT_Utility.areFluidsEqual(fluid, fluidConsumptions[i])) return 0;
+ fluidConsumptionsFromME.merge(fluid.getFluid(), (long) fluidConsumptions[i].amount, Long::sum);
+ }
+ }
+ // Calculate parallel from ME input hatches
+ for (Entry<Fluid, Long> entry : fluidConsumptionsFromME.entrySet()) {
+ Fluid fluid = entry.getKey();
+ if (!fluidsFromME.containsKey(fluid)) return 0;
+ long consume = entry.getValue();
+ currentParallel = Math.min(currentParallel, (double) fluidsFromME.get(fluid).amount / consume);
+ if (currentParallel <= 0) return 0;
+ }
+
+ // Calculate parallel from regular input hatches
+ for (int i = 0; i < fluidConsumptions.length; i++) {
+ GT_MetaTileEntity_Hatch_Input inputHatch = inputHatches.get(i);
+ if (!inputHatch.isValid()) return 0;
+ if (inputHatch instanceof GT_MetaTileEntity_Hatch_Input_ME) continue;
+
+ FluidStack fluid;
+ if (inputHatch instanceof GT_MetaTileEntity_Hatch_MultiInput multiInput) {
+ fluid = multiInput.getFluid(0);
+ } else {
+ fluid = inputHatch.getFillableStack();
+ }
+ if (fluid == null) return 0;
+ if (!GT_Utility.areFluidsEqual(fluid, fluidConsumptions[i])) return 0;
+ currentParallel = Math.min(currentParallel, (double) fluid.amount / fluidConsumptions[i].amount);
+ if (currentParallel <= 0) return 0;
+ }
+ return currentParallel;
+ }
+
+ /**
+ * WARNING: Ensure that item inputs are enough to be consumed with
+ * {@link GT_Recipe_AssemblyLine#maxParallelCalculatedByInputItems} before calling this method!
+ *
+ * @param inputBusses Input bus list to check. Usually the input bus list of multi.
+ * @param itemConsumptions Should be generated by {@link GT_Recipe_AssemblyLine#getItemConsumptionAmountArray}.
+ */
+ public static void consumeInputItems(ArrayList<GT_MetaTileEntity_Hatch_InputBus> inputBusses,
+ int amountMultiplier, int[] itemConsumptions, Map<GT_Utility.ItemId, ItemStack> inputsFromME) {
+ for (int i = 0; i < itemConsumptions.length; i++) {
+ GT_MetaTileEntity_Hatch_InputBus inputBus = inputBusses.get(i);
+ if (!inputBus.isValid()) continue;
+ ItemStack item;
+ if (inputBus instanceof GT_MetaTileEntity_Hatch_InputBus_ME meBus) {
+ item = inputsFromME.get(GT_Utility.ItemId.createNoCopy(meBus.getShadowItemStack(0)));
+ } else {
+ item = inputBus.getStackInSlot(0);
+ }
+ item.stackSize -= itemConsumptions[i] * amountMultiplier;
+ }
+ }
+
+ /**
+ * WARNING: Ensure that fluid inputs are enough to be consumed with
+ * {@link GT_Recipe_AssemblyLine#maxParallelCalculatedByInputFluids} before calling this method!
+ *
+ * @param inputHatches Input hatch list to check. Usually the input hatch list of multi.
+ * @param fluidConsumptions Fluid inputs of the recipe.
+ */
+ public static void consumeInputFluids(ArrayList<GT_MetaTileEntity_Hatch_Input> inputHatches,
+ int amountMultiplier, FluidStack[] fluidConsumptions, Map<Fluid, FluidStack> fluidsFromME) {
+ for (int i = 0; i < fluidConsumptions.length; i++) {
+ GT_MetaTileEntity_Hatch_Input inputHatch = inputHatches.get(i);
+ if (!inputHatch.isValid()) continue;
+ FluidStack fluid;
+ if (inputHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) {
+ fluid = fluidsFromME.get(
+ meHatch.getShadowFluidStack(0)
+ .getFluid());
+ } else if (inputHatch instanceof GT_MetaTileEntity_Hatch_MultiInput multiInput) {
+ fluid = multiInput.getFluid(0);
+ } else {
+ fluid = inputHatch.getFillableStack();
+ }
+ fluid.amount -= fluidConsumptions[i].amount * amountMultiplier;
+ }
+ }
+ }
+
+ public static class GT_Recipe_WithAlt extends GT_Recipe {
+
+ public ItemStack[][] mOreDictAlt;
+
+ /**
+ * Only for {@link GT_RecipeBuilder}.
+ */
+ GT_Recipe_WithAlt(ItemStack[] mInputs, ItemStack[] mOutputs, FluidStack[] mFluidInputs,
+ FluidStack[] mFluidOutputs, int[] mChances, Object mSpecialItems, int mDuration, int mEUt,
+ int mSpecialValue, boolean mEnabled, boolean mHidden, boolean mFakeRecipe, boolean mCanBeBuffered,
+ boolean mNeedsEmptyOutput, boolean nbtSensitive, String[] neiDesc,
+ @Nullable IRecipeMetadataStorage metadataStorage, RecipeCategory recipeCategory,
+ ItemStack[][] mOreDictAlt) {
+ super(
+ mInputs,
+ mOutputs,
+ mFluidInputs,
+ mFluidOutputs,
+ mChances,
+ mSpecialItems,
+ mDuration,
+ mEUt,
+ mSpecialValue,
+ mEnabled,
+ mHidden,
+ mFakeRecipe,
+ mCanBeBuffered,
+ mNeedsEmptyOutput,
+ nbtSensitive,
+ neiDesc,
+ metadataStorage,
+ recipeCategory);
+ this.mOreDictAlt = mOreDictAlt;
+ }
+
+ public GT_Recipe_WithAlt(boolean aOptimize, ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecialItems,
+ int[] aChances, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt,
+ int aSpecialValue, ItemStack[][] aAlt) {
+ super(
+ aOptimize,
+ aInputs,
+ aOutputs,
+ aSpecialItems,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUt,
+ aSpecialValue);
+ mOreDictAlt = aAlt;
+ }
+
+ public Object getAltRepresentativeInput(int aIndex) {
+ if (aIndex < 0) return null;
+ if (aIndex < mOreDictAlt.length) {
+ if (mOreDictAlt[aIndex] != null && mOreDictAlt[aIndex].length > 0) {
+ ItemStack[] rStacks = new ItemStack[mOreDictAlt[aIndex].length];
+ for (int i = 0; i < mOreDictAlt[aIndex].length; i++) {
+ rStacks[i] = GT_Utility.copyOrNull(mOreDictAlt[aIndex][i]);
+ }
+ return rStacks;
+ }
+ }
+ if (aIndex >= mInputs.length) return null;
+ return GT_Utility.copyOrNull(mInputs[aIndex]);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_RecipeBuilder.java b/src/main/java/gregtech/api/util/GT_RecipeBuilder.java
new file mode 100644
index 0000000000..6f7c9a81bb
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_RecipeBuilder.java
@@ -0,0 +1,933 @@
+package gregtech.api.util;
+
+import static gregtech.api.util.GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES;
+import static gregtech.api.util.GT_Utility.copyFluidArray;
+import static gregtech.api.util.GT_Utility.copyItemArray;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.launchwrapper.Launch;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.Contract;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Mods;
+import gregtech.api.interfaces.IRecipeMap;
+import gregtech.api.recipe.RecipeCategory;
+import gregtech.api.recipe.RecipeMetadataKey;
+import gregtech.api.recipe.metadata.IRecipeMetadataStorage;
+import gregtech.api.recipe.metadata.RecipeMetadataStorage;
+import gregtech.api.util.extensions.ArrayExt;
+
+@SuppressWarnings({ "unused", "UnusedReturnValue" })
+public class GT_RecipeBuilder {
+
+ // debug mode expose problems. panic mode help you check nothing is wrong-ish without you actively monitoring
+ private static final boolean DEBUG_MODE_NULL;
+ private static boolean PANIC_MODE_NULL;
+ private static final boolean DEBUG_MODE_INVALID;
+ private static final boolean PANIC_MODE_INVALID;
+ private static final boolean DEBUG_MODE_COLLISION;
+ private static final boolean PANIC_MODE_COLLISION;
+
+ public static final int WILDCARD = 32767;
+
+ // time units
+ public static final int HOURS = 20 * 60 * 60;
+ public static final int MINUTES = 20 * 60;
+ public static final int SECONDS = 20;
+ public static final int TICKS = 1;
+
+ // fluid units
+ public static final int INGOTS = 144;
+ public static final int HALF_INGOT = 72;
+ public static final int QUARTER_INGOT = 36;
+ public static final int EIGHTH_INGOT = 18;
+ public static final int NUGGETS = 16;
+ public static final int BUCKETS = 1000;
+
+ static {
+ final boolean debugAll;
+ if (System.getProperties()
+ .containsKey("gt.recipebuilder.debug")) {
+ debugAll = Boolean.getBoolean("gt.recipebuilder.debug");
+ } else {
+ // turn on debug by default in dev mode
+ debugAll = (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment");
+ }
+ DEBUG_MODE_NULL = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.null");
+ DEBUG_MODE_INVALID = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.invalid");
+ DEBUG_MODE_COLLISION = debugAll || Boolean.getBoolean("gt.recipebuilder.debug.collision");
+
+ final boolean panicAll = Boolean.getBoolean("gt.recipebuilder.panic");
+ PANIC_MODE_NULL = panicAll || Boolean.getBoolean("gt.recipebuilder.panic.null");
+ PANIC_MODE_INVALID = panicAll || Boolean.getBoolean("gt.recipebuilder.panic.invalid");
+ PANIC_MODE_COLLISION = panicAll || Boolean.getBoolean("gt.recipebuilder.panic.collision");
+ }
+
+ protected ItemStack[] inputsBasic = new ItemStack[0];
+ protected Object[] inputsOreDict;
+ protected ItemStack[] outputs = new ItemStack[0];
+ protected ItemStack[][] alts;
+ protected FluidStack[] fluidInputs = new FluidStack[0];
+ protected FluidStack[] fluidOutputs = new FluidStack[0];
+ protected int[] chances;
+ protected Object special;
+ protected int duration = -1;
+ protected int eut = -1;
+ protected int specialValue;
+ protected boolean enabled = true;
+ protected boolean hidden = false;
+ protected boolean fakeRecipe = false;
+ protected boolean mCanBeBuffered = true;
+ protected boolean mNeedsEmptyOutput = false;
+ protected boolean nbtSensitive = false;
+ protected String[] neiDesc;
+ protected RecipeCategory recipeCategory;
+ protected boolean optimize = true;
+ @Nullable
+ protected IRecipeMetadataStorage metadataStorage;
+ protected boolean checkForCollision = true;
+ /**
+ * If recipe addition should be skipped.
+ */
+ protected boolean skip = false;
+ protected boolean valid = true;
+
+ GT_RecipeBuilder() {}
+
+ private GT_RecipeBuilder(ItemStack[] inputsBasic, Object[] inputsOreDict, ItemStack[] outputs, ItemStack[][] alts,
+ FluidStack[] fluidInputs, FluidStack[] fluidOutputs, int[] chances, Object special, int duration, int eut,
+ int specialValue, boolean enabled, boolean hidden, boolean fakeRecipe, boolean mCanBeBuffered,
+ boolean mNeedsEmptyOutput, boolean nbtSensitive, String[] neiDesc, RecipeCategory recipeCategory,
+ boolean optimize, @Nullable IRecipeMetadataStorage metadataStorage, boolean checkForCollision, boolean skip,
+ boolean valid) {
+ this.inputsBasic = inputsBasic;
+ this.inputsOreDict = inputsOreDict;
+ this.outputs = outputs;
+ this.alts = alts;
+ this.fluidInputs = fluidInputs;
+ this.fluidOutputs = fluidOutputs;
+ this.chances = chances;
+ this.special = special;
+ this.duration = duration;
+ this.eut = eut;
+ this.specialValue = specialValue;
+ this.enabled = enabled;
+ this.hidden = hidden;
+ this.fakeRecipe = fakeRecipe;
+ this.mCanBeBuffered = mCanBeBuffered;
+ this.mNeedsEmptyOutput = mNeedsEmptyOutput;
+ this.nbtSensitive = nbtSensitive;
+ this.neiDesc = neiDesc;
+ this.recipeCategory = recipeCategory;
+ this.optimize = optimize;
+ this.metadataStorage = metadataStorage;
+ if (this.metadataStorage != null) {
+ this.metadataStorage = this.metadataStorage.copy();
+ }
+ this.checkForCollision = checkForCollision;
+ this.skip = skip;
+ this.valid = valid;
+ }
+
+ // region helper methods
+
+ private static FluidStack[] fix(FluidStack[] fluidInputs) {
+ return Arrays.stream(fluidInputs)
+ .filter(Objects::nonNull)
+ .map(FluidStack::copy)
+ .toArray(FluidStack[]::new);
+ }
+
+ private static ItemStack[] fix(ItemStack[] inputs) {
+ return GT_OreDictUnificator.setStackArray(true, ArrayExt.withoutTrailingNulls(inputs, ItemStack[]::new));
+ }
+
+ public static GT_RecipeBuilder builder() {
+ return new GT_RecipeBuilder();
+ }
+
+ /**
+ * Creates empty builder where only duration and EU/t are set to 0.
+ */
+ public static GT_RecipeBuilder empty() {
+ return new GT_RecipeBuilder().duration(0)
+ .eut(0);
+ }
+
+ private static boolean containsNull(Object[] arr) {
+ return arr == null || Arrays.stream(arr)
+ .anyMatch(Objects::isNull);
+ }
+
+ private static void handleNullRecipeComponents(String componentType) {
+ // place a breakpoint here to catch all these issues
+ GT_Log.err.print("null detected in ");
+ GT_Log.err.println(componentType);
+ new NullPointerException().printStackTrace(GT_Log.err);
+ if (PANIC_MODE_NULL) {
+ throw new IllegalArgumentException("null in argument");
+ }
+ }
+
+ private static boolean debugNull() {
+ return DEBUG_MODE_NULL || PANIC_MODE_NULL;
+ }
+
+ public static void handleInvalidRecipe() {
+ if (!DEBUG_MODE_INVALID && !PANIC_MODE_INVALID) {
+ return;
+ }
+ // place a breakpoint here to catch all these issues
+ GT_Log.err.print("invalid recipe");
+ new IllegalArgumentException().printStackTrace(GT_Log.err);
+ if (PANIC_MODE_INVALID) {
+ throw new IllegalArgumentException("invalid recipe");
+ }
+ }
+
+ public static void handleRecipeCollision(String details) {
+ if (!DEBUG_MODE_COLLISION && !PANIC_MODE_COLLISION) {
+ return;
+ }
+ GT_Log.err.print("Recipe collision resulting in recipe loss detected with ");
+ GT_Log.err.println(details);
+ if (PANIC_MODE_COLLISION) {
+ throw new IllegalArgumentException("Recipe Collision");
+ } else {
+ // place a breakpoint here to catch all these issues
+ new IllegalArgumentException().printStackTrace(GT_Log.err);
+ }
+ }
+
+ public static void onConfigLoad() {
+ PANIC_MODE_NULL |= GT_Mod.gregtechproxy.crashOnNullRecipeInput;
+ }
+
+ // endregion
+
+ // region setter
+
+ /**
+ * Non-OreDicted item inputs. Assumes input is unified.
+ */
+ public GT_RecipeBuilder itemInputsUnified(ItemStack... inputs) {
+ if (skip) return this;
+ if (debugNull() && containsNull(inputs)) handleNullRecipeComponents("itemInputUnified");
+ inputsBasic = ArrayExt.withoutTrailingNulls(inputs, ItemStack[]::new);
+ inputsOreDict = null;
+ alts = null;
+ return this;
+ }
+
+ /**
+ * Non-OreDicted item inputs. Assumes input is not unified.
+ */
+ public GT_RecipeBuilder itemInputs(ItemStack... inputs) {
+ if (skip) return this;
+ if (debugNull() && containsNull(inputs)) handleNullRecipeComponents("itemInputs");
+ inputsBasic = fix(inputs);
+ inputsOreDict = null;
+ alts = null;
+ return this;
+ }
+
+ /**
+ * OreDicted item inputs. Currently only used for assline recipes adder.
+ */
+ public GT_RecipeBuilder itemInputs(Object... inputs) {
+ if (skip) return this;
+ inputsOreDict = inputs;
+ alts = new ItemStack[inputs.length][];
+ for (int i = 0, inputsLength = inputs.length; i < inputsLength; i++) {
+ Object input = inputs[i];
+ if (input instanceof ItemStack) {
+ alts[i] = new ItemStack[] { (ItemStack) input };
+ } else if (input instanceof ItemStack[]) {
+ alts[i] = ((ItemStack[]) input).clone();
+ } else if (input instanceof Object[]arr) {
+ if (arr.length != 2) continue;
+ List<ItemStack> ores = GT_OreDictUnificator.getOres(arr[0]);
+ if (ores.isEmpty()) continue;
+ int size = ((Number) arr[1]).intValue();
+ alts[i] = ores.stream()
+ .map(s -> GT_Utility.copyAmount(size, s))
+ .filter(GT_Utility::isStackValid)
+ .toArray(ItemStack[]::new);
+ } else if (input == null) {
+ handleNullRecipeComponents("recipe oredict input");
+ alts[i] = new ItemStack[0];
+ } else {
+ throw new IllegalArgumentException("index " + i + ", unexpected type: " + input.getClass());
+ }
+ }
+ inputsBasic = Arrays.stream(alts)
+ .map(ss -> ss.length > 0 ? ss[0] : null)
+ .toArray(ItemStack[]::new);
+ // optimize cannot handle recipes with alts
+ return noOptimize();
+ }
+
+ public GT_RecipeBuilder itemOutputs(ItemStack... outputs) {
+ if (skip) return this;
+ if (debugNull() && containsNull(outputs)) handleNullRecipeComponents("itemOutputs");
+ this.outputs = outputs;
+ if (chances != null && chances.length != outputs.length) {
+ throw new IllegalArgumentException("Output chances array and items array length differs");
+ }
+ return this;
+ }
+
+ /**
+ * Not intended to be used by recipe authors.
+ * Intended for recipe rewrite middlewares.
+ */
+ public GT_RecipeBuilder itemOutputs(ItemStack[] outputs, int[] chances) {
+ if (skip) return this;
+ if (debugNull() && containsNull(outputs)) handleNullRecipeComponents("itemOutputs");
+ this.outputs = outputs;
+ this.chances = chances;
+ if (chances != null && chances.length != outputs.length) {
+ throw new IllegalArgumentException("Output chances array and items array length differs");
+ }
+ return this;
+ }
+
+ public GT_RecipeBuilder fluidInputs(FluidStack... fluidInputs) {
+ if (skip) return this;
+ if (debugNull() && containsNull(fluidInputs)) handleNullRecipeComponents("fluidInputs");
+ this.fluidInputs = fix(fluidInputs);
+ return this;
+ }
+
+ public GT_RecipeBuilder fluidOutputs(FluidStack... fluidOutputs) {
+ if (skip) return this;
+ if (debugNull() && containsNull(fluidOutputs)) handleNullRecipeComponents("fluidOutputs");
+ this.fluidOutputs = fix(fluidOutputs);
+ return this;
+ }
+
+ public GT_RecipeBuilder outputChances(int... chances) {
+ if (skip) return this;
+ if (outputs != null && chances.length != outputs.length) {
+ throw new IllegalArgumentException("Output chances array and items array length differs");
+ }
+ this.chances = chances;
+ return this;
+ }
+
+ public GT_RecipeBuilder special(Object special) {
+ this.special = special;
+ return this;
+ }
+
+ /**
+ * Really just {@link #special(Object)}, but with a different signature to make it less confusing. WARNING: only for
+ * legacy recipe map. do not abuse.
+ */
+ public GT_RecipeBuilder specialItem(ItemStack specialItem) {
+ return special(specialItem);
+ }
+
+ public GT_RecipeBuilder duration(int duration) {
+ this.duration = duration;
+ return this;
+ }
+
+ public GT_RecipeBuilder duration(long duration) {
+ this.duration = (int) duration;
+ return this;
+ }
+
+ public GT_RecipeBuilder eut(int eut) {
+ this.eut = eut;
+ return this;
+ }
+
+ public GT_RecipeBuilder eut(long eut) {
+ this.eut = (int) eut;
+ return this;
+ }
+
+ /**
+ * prefer to use metadata over this. should only use when the target recipe map does not yet support metadata
+ * system, or it's to bridge legacy code and modern code.
+ */
+ public GT_RecipeBuilder specialValue(int specialValue) {
+ this.specialValue = specialValue;
+ return this;
+ }
+
+ // I don't expect anyone to actually call this...
+ public GT_RecipeBuilder disabled() {
+ this.enabled = false;
+ return this;
+ }
+
+ public GT_RecipeBuilder hidden() {
+ this.hidden = true;
+ return this;
+ }
+
+ public GT_RecipeBuilder fake() {
+ this.fakeRecipe = true;
+ return this;
+ }
+
+ public GT_RecipeBuilder noBuffer() {
+ this.mCanBeBuffered = false;
+ return this;
+ }
+
+ public GT_RecipeBuilder needsEmptyOutput() {
+ this.mNeedsEmptyOutput = true;
+ return this;
+ }
+
+ public GT_RecipeBuilder nbtSensitive() {
+ this.nbtSensitive = true;
+ return this;
+ }
+
+ public GT_RecipeBuilder setNEIDesc(String... neiDesc) {
+ this.neiDesc = neiDesc;
+ return this;
+ }
+
+ public GT_RecipeBuilder recipeCategory(RecipeCategory recipeCategory) {
+ this.recipeCategory = recipeCategory;
+ return this;
+ }
+
+ /**
+ * Prevent the resulting recipe from optimizing recipe, which is a process that reduce recipe batch size.
+ */
+ public GT_RecipeBuilder noOptimize() {
+ this.optimize = false;
+ return this;
+ }
+
+ /**
+ * Prevents checking collision with existing recipes when adding the built recipe.
+ */
+ public GT_RecipeBuilder ignoreCollision() {
+ this.checkForCollision = false;
+ return this;
+ }
+
+ /**
+ * Sets metadata of the recipe. It can be used for recipe emitter to do special things, or for being stored in the
+ * built recipe and used for actual recipe processing.
+ * <p>
+ * {@link GT_RecipeConstants} has a series of metadata keys. Or you can create one by yourself.
+ */
+ public <T> GT_RecipeBuilder metadata(RecipeMetadataKey<T> key, T value) {
+ if (skip) return this;
+ if (metadataStorage == null) {
+ metadataStorage = new RecipeMetadataStorage();
+ }
+ metadataStorage.store(key, value);
+ return this;
+ }
+
+ /**
+ * Gets metadata already set for this builder. Can return null. Use
+ * {@link #getMetadataOrDefault(RecipeMetadataKey, Object)}
+ * if you want to specify default value.
+ */
+ @Nullable
+ public <T> T getMetadata(RecipeMetadataKey<T> key) {
+ if (metadataStorage == null) {
+ return null;
+ }
+ return key.cast(metadataStorage.getMetadata(key));
+ }
+
+ /**
+ * Gets metadata already set for this builder with default value. Does not return null unless default value is null.
+ */
+ @Contract("_, !null -> !null")
+ @Nullable
+ public <T> T getMetadataOrDefault(RecipeMetadataKey<T> key, T defaultValue) {
+ if (metadataStorage == null) {
+ return defaultValue;
+ }
+ return key.cast(metadataStorage.getMetadataOrDefault(key, defaultValue));
+ }
+
+ /**
+ * Specifies mods required to add the recipe. If any of the mods is not loaded, all the operations for this builder
+ * will be ignored.
+ *
+ * @param mods Mod(s) required for the recipe.
+ */
+ public GT_RecipeBuilder requireMods(Mods... mods) {
+ skip = Stream.of(mods)
+ .anyMatch(mod -> !mod.isModLoaded());
+ return this;
+ }
+
+ public GT_RecipeBuilder requiresCleanRoom() {
+ return metadata(GT_RecipeConstants.CLEANROOM, true);
+ }
+
+ public GT_RecipeBuilder requiresLowGravity() {
+ return metadata(GT_RecipeConstants.LOW_GRAVITY, true);
+ }
+
+ // endregion
+
+ private static <T> T[] copy(T[] arr) {
+ return arr == null ? null : arr.clone();
+ }
+
+ private static int[] copy(int[] arr) {
+ return arr == null ? null : arr.clone();
+ }
+
+ /**
+ * produce a deep copy of current values. anything unset will remain unset. IMPORTANT: If metadata contains mutable
+ * value, they will not be cloned!
+ * <p>
+ * checkout docs/RecipeBuilder.md for more info on whether to copy or not.
+ */
+ public GT_RecipeBuilder copy() {
+ return new GT_RecipeBuilder(
+ copyItemArray(inputsBasic),
+ copy(inputsOreDict),
+ copyItemArray(outputs),
+ copy(alts),
+ copyFluidArray(fluidInputs),
+ copyFluidArray(fluidOutputs),
+ copy(chances),
+ special,
+ duration,
+ eut,
+ specialValue,
+ enabled,
+ hidden,
+ fakeRecipe,
+ mCanBeBuffered,
+ mNeedsEmptyOutput,
+ nbtSensitive,
+ copy(neiDesc),
+ recipeCategory,
+ optimize,
+ metadataStorage,
+ checkForCollision,
+ skip,
+ valid);
+ }
+
+ /**
+ * produce a deep copy of current values. anything unset will remain unset. discard all existing metadata
+ */
+ public GT_RecipeBuilder copyNoMetadata() {
+ return new GT_RecipeBuilder(
+ copyItemArray(inputsBasic),
+ copy(inputsOreDict),
+ copyItemArray(outputs),
+ copy(alts),
+ copyFluidArray(fluidInputs),
+ copyFluidArray(fluidOutputs),
+ copy(chances),
+ special,
+ duration,
+ eut,
+ specialValue,
+ enabled,
+ hidden,
+ fakeRecipe,
+ mCanBeBuffered,
+ mNeedsEmptyOutput,
+ nbtSensitive,
+ copy(neiDesc),
+ recipeCategory,
+ optimize,
+ null,
+ checkForCollision,
+ skip,
+ valid);
+ }
+
+ // region getter
+
+ public ItemStack getItemInputBasic(int index) {
+ return index < inputsBasic.length ? inputsBasic[index] : null;
+ }
+
+ public Object getItemInputOreDict(int index) {
+ return index < inputsOreDict.length ? inputsOreDict[index] : null;
+ }
+
+ public ItemStack getItemOutput(int index) {
+ return index < outputs.length ? outputs[index] : null;
+ }
+
+ public FluidStack getFluidInput(int index) {
+ return index < fluidInputs.length ? fluidInputs[index] : null;
+ }
+
+ public FluidStack getFluidOutput(int index) {
+ return index < fluidOutputs.length ? fluidOutputs[index] : null;
+ }
+
+ public ItemStack[] getItemInputsBasic() {
+ return inputsBasic;
+ }
+
+ public Object[] getItemInputsOreDict() {
+ return inputsOreDict;
+ }
+
+ public ItemStack[] getItemOutputs() {
+ return outputs;
+ }
+
+ public FluidStack[] getFluidInputs() {
+ return fluidInputs;
+ }
+
+ public FluidStack[] getFluidOutputs() {
+ return fluidOutputs;
+ }
+
+ public int getDuration() {
+ return duration;
+ }
+
+ public int[] getChances() {
+ return chances;
+ }
+
+ public int getEUt() {
+ return eut;
+ }
+
+ public RecipeCategory getRecipeCategory() {
+ return recipeCategory;
+ }
+
+ public boolean isOptimize() {
+ return optimize;
+ }
+
+ public boolean isCheckForCollision() {
+ return checkForCollision;
+ }
+
+ // endregion
+
+ // region validator
+
+ public GT_RecipeBuilder clearInvalid() {
+ valid = true;
+ return this;
+ }
+
+ public GT_RecipeBuilder invalidate() {
+ valid = false;
+ return this;
+ }
+
+ public boolean isValid() {
+ return valid;
+ }
+
+ private static boolean isArrayValid(@Nonnull Object[] arr, int min, int max) {
+ int count = 0;
+ for (Object o : arr) {
+ if (o != null) count += 1;
+ }
+ return min <= count && max >= count;
+ }
+
+ /**
+ * Validate if input item match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow
+ * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code.
+ */
+ public GT_RecipeBuilder validateNoInput() {
+ if (skip) return this;
+ return GT_Utility.isArrayEmptyOrNull(inputsBasic) ? this : invalidate();
+ }
+
+ /**
+ * Validate if input fluid match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow
+ * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code.
+ */
+ public GT_RecipeBuilder validateNoInputFluid() {
+ if (skip) return this;
+ return GT_Utility.isArrayEmptyOrNull(fluidInputs) ? this : invalidate();
+ }
+
+ /**
+ * Validate if output item match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow
+ * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code.
+ */
+ public GT_RecipeBuilder validateNoOutput() {
+ if (skip) return this;
+ return GT_Utility.isArrayEmptyOrNull(outputs) ? this : invalidate();
+ }
+
+ /**
+ * Validate if output fluid match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow
+ * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code.
+ */
+ public GT_RecipeBuilder validateNoOutputFluid() {
+ if (skip) return this;
+ return GT_Utility.isArrayEmptyOrNull(fluidOutputs) ? this : invalidate();
+ }
+
+ /**
+ * Validate if input item match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow
+ * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code.
+ */
+ public GT_RecipeBuilder validateInputCount(int min, int max) {
+ if (skip) return this;
+ if (inputsBasic == null) return min < 0 ? this : invalidate();
+ return isArrayValid(inputsBasic, min, max) ? this : invalidate();
+ }
+
+ /**
+ * Validate if input fluid match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow
+ * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code.
+ */
+ public GT_RecipeBuilder validateInputFluidCount(int min, int max) {
+ if (skip) return this;
+ if (fluidInputs == null) return min < 0 ? this : invalidate();
+ return isArrayValid(fluidInputs, min, max) ? this : invalidate();
+ }
+
+ /**
+ * Validate if output item match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow
+ * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code.
+ */
+ public GT_RecipeBuilder validateOutputCount(int min, int max) {
+ if (skip) return this;
+ if (outputs == null) return min < 0 ? this : invalidate();
+ return isArrayValid(outputs, min, max) ? this : invalidate();
+ }
+
+ /**
+ * Validate if output fluid match requirement. Return as invalidated if fails prereq. Specify -1 as min to allow
+ * unset. Both bound inclusive. Only supposed to be called by IRecipeMap and not client code.
+ */
+ public GT_RecipeBuilder validateOutputFluidCount(int min, int max) {
+ if (skip) return this;
+ if (fluidOutputs == null) return min < 0 ? this : invalidate();
+ return isArrayValid(fluidOutputs, min, max) ? this : invalidate();
+ }
+
+ public GT_RecipeBuilder validateAnyInput() {
+ if (skip) return this;
+ if (fluidInputs != null && isArrayValid(fluidInputs, 1, Integer.MAX_VALUE)) {
+ return this;
+ }
+ if (inputsBasic != null && isArrayValid(inputsBasic, 1, Integer.MAX_VALUE)) {
+ return this;
+ }
+ return invalidate();
+ }
+
+ public GT_RecipeBuilder validateAnyOutput() {
+ if (skip) return this;
+ if (fluidOutputs != null && isArrayValid(fluidOutputs, 1, Integer.MAX_VALUE)) {
+ return this;
+ }
+ if (outputs != null && isArrayValid(outputs, 1, Integer.MAX_VALUE)) {
+ return this;
+ }
+ return invalidate();
+ }
+
+ // endregion
+
+ /**
+ * Builds new recipe, without custom behavior of recipemaps. For adding recipe to recipemap,
+ * use {@link #addTo} instead.
+ *
+ * @return Built recipe. Returns empty if failed to build.
+ */
+ public Optional<GT_Recipe> build() {
+ if (skip) {
+ return Optional.empty();
+ }
+ if (!valid) {
+ handleInvalidRecipe();
+ return Optional.empty();
+ }
+ preBuildChecks();
+ optimize();
+ return Optional.of(
+ decorate(
+ new GT_Recipe(
+ inputsBasic,
+ outputs,
+ fluidInputs,
+ fluidOutputs,
+ chances,
+ special,
+ duration,
+ eut,
+ specialValue,
+ enabled,
+ hidden,
+ fakeRecipe,
+ mCanBeBuffered,
+ mNeedsEmptyOutput,
+ nbtSensitive,
+ neiDesc,
+ metadataStorage,
+ recipeCategory)));
+ }
+
+ public GT_RecipeBuilder forceOreDictInput() {
+ if (inputsOreDict != null || inputsBasic == null) return this;
+ return itemInputs((Object[]) inputsBasic);
+ }
+
+ public Optional<GT_Recipe.GT_Recipe_WithAlt> buildWithAlt() {
+ if (skip) {
+ return Optional.empty();
+ }
+ if (inputsOreDict == null) {
+ throw new UnsupportedOperationException();
+ }
+ if (!valid) {
+ handleInvalidRecipe();
+ return Optional.empty();
+ }
+ preBuildChecks();
+ // no optimize.
+ return Optional.of(
+ decorate(
+ new GT_Recipe.GT_Recipe_WithAlt(
+ inputsBasic,
+ outputs,
+ fluidInputs,
+ fluidOutputs,
+ chances,
+ special,
+ duration,
+ eut,
+ specialValue,
+ enabled,
+ hidden,
+ fakeRecipe,
+ mCanBeBuffered,
+ mNeedsEmptyOutput,
+ nbtSensitive,
+ neiDesc,
+ metadataStorage,
+ recipeCategory,
+ alts)));
+ }
+
+ private void preBuildChecks() {
+ if (duration == -1) throw new IllegalStateException("no duration");
+ if (eut == -1) throw new IllegalStateException("no eut");
+ }
+
+ private void optimize() {
+ if (optimize) {
+ ArrayList<ItemStack> l = new ArrayList<>();
+ l.addAll(Arrays.asList(inputsBasic));
+ l.addAll(Arrays.asList(outputs));
+ for (int i = 0; i < l.size(); i++) if (l.get(i) == null) l.remove(i--);
+
+ outer: for (byte i = (byte) Math.min(64, duration / 16); i > 1; i--) {
+ if (duration / i >= 16) {
+ for (ItemStack stack : l) {
+ if (stack.stackSize % i != 0) continue outer;
+ }
+ for (FluidStack fluidInput : fluidInputs) {
+ if (fluidInput.amount % i != 0) continue outer;
+ }
+ for (FluidStack fluidOutput : fluidOutputs) {
+ if (fluidOutput.amount % i != 0) continue outer;
+ }
+ for (ItemStack itemStack : l) itemStack.stackSize /= i;
+ for (FluidStack fluidInput : fluidInputs) fluidInput.amount /= i;
+ for (FluidStack fluidOutput : fluidOutputs) fluidOutput.amount /= i;
+ duration /= i;
+ }
+ }
+ optimize = false;
+ }
+ }
+
+ private <T extends GT_Recipe> T decorate(T r) {
+ r.mHidden = hidden;
+ r.mCanBeBuffered = mCanBeBuffered;
+ r.mNeedsEmptyOutput = mNeedsEmptyOutput;
+ r.isNBTSensitive = nbtSensitive;
+ r.mFakeRecipe = fakeRecipe;
+ r.mEnabled = enabled;
+ if (neiDesc != null) r.setNeiDesc(neiDesc);
+ applyDefaultSpecialValues(r);
+ return r;
+ }
+
+ private void applyDefaultSpecialValues(GT_Recipe recipe) {
+ if (recipe.mSpecialValue != 0) return;
+
+ int specialValue = 0;
+ if (getMetadataOrDefault(GT_RecipeConstants.LOW_GRAVITY, false)) specialValue -= 100;
+ if (getMetadataOrDefault(GT_RecipeConstants.CLEANROOM, false)) specialValue -= 200;
+ for (RecipeMetadataKey<Integer> ident : SPECIAL_VALUE_ALIASES) {
+ Integer metadata = getMetadataOrDefault(ident, null);
+ if (metadata != null) {
+ specialValue = metadata;
+ break;
+ }
+ }
+ recipe.mSpecialValue = specialValue;
+ }
+
+ public Collection<GT_Recipe> addTo(IRecipeMap recipeMap) {
+ if (skip) {
+ return Collections.emptyList();
+ }
+ return recipeMap.doAdd(this);
+ }
+
+ public GT_RecipeBuilder reset() {
+ metadataStorage = null;
+ alts = null;
+ chances = null;
+ duration = -1;
+ enabled = true;
+ eut = -1;
+ fakeRecipe = false;
+ fluidInputs = null;
+ fluidOutputs = null;
+ hidden = false;
+ inputsBasic = null;
+ inputsOreDict = null;
+ mCanBeBuffered = true;
+ mNeedsEmptyOutput = false;
+ nbtSensitive = false;
+ neiDesc = null;
+ recipeCategory = null;
+ optimize = true;
+ outputs = null;
+ special = null;
+ specialValue = 0;
+ skip = false;
+ valid = true;
+ return this;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_RecipeConstants.java b/src/main/java/gregtech/api/util/GT_RecipeConstants.java
new file mode 100644
index 0000000000..d9d6c7d7d2
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_RecipeConstants.java
@@ -0,0 +1,332 @@
+package gregtech.api.util;
+
+import static gregtech.api.util.GT_RecipeMapUtil.convertCellToFluid;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Optional;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.IRecipeMap;
+import gregtech.api.recipe.RecipeCategories;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.RecipeMetadataKey;
+import gregtech.api.recipe.metadata.SimpleRecipeMetadataKey;
+
+// this class is intended to be import-static-ed on every recipe script
+// so take care to not put unrelated stuff here!
+public class GT_RecipeConstants {
+
+ /**
+ * Set to true to signal the recipe require low gravity. do nothing if recipe set specialValue explicitly. Can
+ * coexist with CLEANROOM just fine
+ */
+ public static final RecipeMetadataKey<Boolean> LOW_GRAVITY = SimpleRecipeMetadataKey
+ .create(Boolean.class, "low_gravity");
+ /**
+ * Set to true to signal the recipe require cleanroom. do nothing if recipe set specialValue explicitly. Can coexist
+ * with LOW_GRAVITY just fine
+ */
+ public static final RecipeMetadataKey<Boolean> CLEANROOM = SimpleRecipeMetadataKey
+ .create(Boolean.class, "cleanroom");
+ /**
+ * Common additive to use in recipe, e.g. for PBF, this is coal amount.
+ */
+ public static final RecipeMetadataKey<Integer> ADDITIVE_AMOUNT = SimpleRecipeMetadataKey
+ .create(Integer.class, "additives");
+ /**
+ * Used for fusion reactor. Denotes ignition threshold.
+ */
+ public static final RecipeMetadataKey<Integer> FUSION_THRESHOLD = SimpleRecipeMetadataKey
+ .create(Integer.class, "fusion_threshold");
+ /**
+ * Research time in a scanner used in ticks.
+ */
+ public static final RecipeMetadataKey<Integer> RESEARCH_TIME = SimpleRecipeMetadataKey
+ .create(Integer.class, "research_time");
+ /**
+ * Fuel type. TODO should we use enum directly?
+ */
+ public static final RecipeMetadataKey<Integer> FUEL_TYPE = SimpleRecipeMetadataKey
+ .create(Integer.class, "fuel_type");
+ /**
+ * Fuel value.
+ */
+ public static final RecipeMetadataKey<Integer> FUEL_VALUE = SimpleRecipeMetadataKey
+ .create(Integer.class, "fuel_value");
+ /**
+ * Required heat for heating coil (Kelvin).
+ */
+ public static final RecipeMetadataKey<Integer> COIL_HEAT = SimpleRecipeMetadataKey
+ .create(Integer.class, "coil_heat");
+ /**
+ * Research item used by assline recipes.
+ */
+ public static final RecipeMetadataKey<ItemStack> RESEARCH_ITEM = SimpleRecipeMetadataKey
+ .create(ItemStack.class, "research_item");
+ /**
+ * For assembler. It accepts a single item as oredict. It looks like no one uses this anyway...
+ */
+ public static final RecipeMetadataKey<Object> OREDICT_INPUT = SimpleRecipeMetadataKey
+ .create(Object.class, "oredict_input");
+ /**
+ * Replicator output material.
+ */
+ public static final RecipeMetadataKey<Materials> MATERIAL = SimpleRecipeMetadataKey
+ .create(Materials.class, "material");
+ /**
+ * Marker for {@link #UniversalArcFurnace} to tell that the recipe belongs to recycling category.
+ */
+ public static final RecipeMetadataKey<Boolean> RECYCLE = SimpleRecipeMetadataKey.create(Boolean.class, "recycle");
+ /**
+ * For Microwave.
+ */
+ public static final RecipeMetadataKey<Boolean> EXPLODE = SimpleRecipeMetadataKey.create(Boolean.class, "explode");
+ /**
+ * For Microwave.
+ */
+ public static final RecipeMetadataKey<Boolean> ON_FIRE = SimpleRecipeMetadataKey.create(Boolean.class, "on_fire");
+
+ /**
+ * Add a arc furnace recipe. Adds to both normal arc furnace and plasma arc furnace.
+ * Will override the fluid input with oxygen/plasma for the respective recipe maps, so there is no point setting it.
+ */
+ public static final IRecipeMap UniversalArcFurnace = IRecipeMap.newRecipeMap(builder -> {
+ if (!GT_Utility.isArrayOfLength(builder.getItemInputsBasic(), 1)
+ || GT_Utility.isArrayEmptyOrNull(builder.getItemOutputs())) return Collections.emptyList();
+ int aDuration = builder.getDuration();
+ if (aDuration <= 0) {
+ return Collections.emptyList();
+ }
+ builder.duration(aDuration);
+ boolean recycle = builder.getMetadataOrDefault(RECYCLE, false);
+ Collection<GT_Recipe> ret = new ArrayList<>();
+ for (Materials mat : new Materials[] { Materials.Argon, Materials.Nitrogen }) {
+ int tPlasmaAmount = (int) Math.max(1L, aDuration / (mat.getMass() * 16L));
+ GT_RecipeBuilder plasmaBuilder = builder.copy()
+ .fluidInputs(mat.getPlasma(tPlasmaAmount))
+ .fluidOutputs(mat.getGas(tPlasmaAmount));
+ if (recycle) {
+ plasmaBuilder.recipeCategory(RecipeCategories.plasmaArcFurnaceRecycling);
+ }
+ ret.addAll(RecipeMaps.plasmaArcFurnaceRecipes.doAdd(plasmaBuilder));
+ }
+ GT_RecipeBuilder arcBuilder = builder.copy()
+ .fluidInputs(Materials.Oxygen.getGas(aDuration));
+ if (recycle) {
+ arcBuilder.recipeCategory(RecipeCategories.arcFurnaceRecycling);
+ }
+ ret.addAll(RecipeMaps.arcFurnaceRecipes.doAdd(arcBuilder));
+ return ret;
+ });
+
+ /**
+ * Add a chemical reactor recipe to both LCR and singleblocks.
+ */
+ public static final IRecipeMap UniversalChemical = IRecipeMap.newRecipeMap(builder -> {
+ for (ItemStack input : builder.getItemInputsBasic()) {
+ // config >= 10 -> this is a special chemical recipe that output fluid/canned fluid variant.
+ // it doesn't belong to multiblocks
+ if (GT_Utility.isAnyIntegratedCircuit(input) && input.getItemDamage() >= 10) {
+ return builder.addTo(RecipeMaps.chemicalReactorRecipes);
+ }
+ }
+ return GT_Utility.concat(
+ builder.copy()
+ .addTo(RecipeMaps.chemicalReactorRecipes),
+ convertCellToFluid(builder, false)
+ // LCR does not need cleanroom.
+ .metadata(CLEANROOM, false)
+ .addTo(RecipeMaps.multiblockChemicalReactorRecipes));
+ });
+
+ /**
+ * The one and only :tm: assline recipe adder.
+ * Uses {@link #RESEARCH_ITEM} metadata as research item, and {@link #RESEARCH_TIME} metadata as research time, unit
+ * in ticks.
+ */
+ public static final IRecipeMap AssemblyLine = IRecipeMap.newRecipeMap(builder -> {
+ Optional<GT_Recipe.GT_Recipe_WithAlt> rr = builder.forceOreDictInput()
+ .validateInputCount(4, 16)
+ .validateOutputCount(1, 1)
+ .validateOutputFluidCount(-1, 0)
+ .validateInputFluidCount(0, 4)
+ .buildWithAlt();
+ // noinspection SimplifyOptionalCallChains
+ if (!rr.isPresent()) return Collections.emptyList();
+ GT_Recipe.GT_Recipe_WithAlt r = rr.get();
+ ItemStack[][] mOreDictAlt = r.mOreDictAlt;
+ Object[] inputs = builder.getItemInputsOreDict();
+ ItemStack aResearchItem = builder.getMetadata(RESEARCH_ITEM);
+ if (aResearchItem == null) {
+ return Collections.emptyList();
+ }
+ ItemStack aOutput = r.mOutputs[0];
+ int tPersistentHash = 1;
+ for (int i = 0, mOreDictAltLength = mOreDictAlt.length; i < mOreDictAltLength; i++) {
+ ItemStack[] alts = mOreDictAlt[i];
+ Object input = inputs[i];
+ if (input == null) {
+ GT_Log.err.println(
+ "addAssemblingLineRecipe " + aResearchItem.getDisplayName()
+ + " --> "
+ + aOutput.getUnlocalizedName()
+ + " there is some null item in that recipe");
+ }
+ if (input instanceof ItemStack) {
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash((ItemStack) input, true, false);
+ } else if (input instanceof ItemStack[]) {
+ for (ItemStack alt : ((ItemStack[]) input)) {
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(alt, true, false);
+ if (alt == null) {
+ GT_Log.err.println(
+ "addAssemblingLineRecipe " + aResearchItem.getDisplayName()
+ + " --> "
+ + aOutput.getUnlocalizedName()
+ + " there is some null alt item in that recipe");
+ }
+ }
+ tPersistentHash *= 31;
+ } else if (input instanceof Object[]objs) {
+ Arrays.sort(
+ alts,
+ Comparator
+ .<ItemStack, String>comparing(s -> GameRegistry.findUniqueIdentifierFor(s.getItem()).modId)
+ .thenComparing(s -> GameRegistry.findUniqueIdentifierFor(s.getItem()).name)
+ .thenComparingInt(Items.feather::getDamage)
+ .thenComparingInt(s -> s.stackSize));
+
+ tPersistentHash = tPersistentHash * 31 + (objs[0] == null ? "" : objs[0].toString()).hashCode();
+ tPersistentHash = tPersistentHash * 31 + ((Number) objs[1]).intValue();
+ }
+ }
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(aResearchItem, true, false);
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(aOutput, true, false);
+ for (FluidStack fluidInput : r.mFluidInputs) {
+ if (fluidInput == null) continue;
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(fluidInput, true, false);
+ }
+ int aResearchTime = builder.getMetadataOrDefault(RESEARCH_TIME, 0);
+ tPersistentHash = tPersistentHash * 31 + aResearchTime;
+ tPersistentHash = tPersistentHash * 31 + r.mDuration;
+ tPersistentHash = tPersistentHash * 31 + r.mEUt;
+ Collection<GT_Recipe> ret = new ArrayList<>(3);
+ ret.add(
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { aResearchItem },
+ new ItemStack[] { aOutput },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Writes Research result") },
+ null,
+ null,
+ aResearchTime,
+ 30,
+ -201)); // means it's scanned
+
+ ret.add(
+ RecipeMaps.assemblylineVisualRecipes.addFakeRecipe(
+ false,
+ r.mInputs,
+ new ItemStack[] { aOutput },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Reads Research result") },
+ r.mFluidInputs,
+ null,
+ r.mDuration,
+ r.mEUt,
+ 0,
+ r.mOreDictAlt,
+ false));
+
+ GT_Recipe.GT_Recipe_AssemblyLine tRecipe = new GT_Recipe.GT_Recipe_AssemblyLine(
+ aResearchItem,
+ aResearchTime,
+ r.mInputs,
+ r.mFluidInputs,
+ aOutput,
+ r.mDuration,
+ r.mEUt,
+ r.mOreDictAlt);
+ tRecipe.setPersistentHash(tPersistentHash);
+ GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes.add(tRecipe);
+ GT_AssemblyLineUtils.addRecipeToCache(tRecipe);
+ return ret;
+ });
+
+ /**
+ * Just like any normal assembler recipe, however it accepts one input item to be oredicted. Pass in the item to
+ * oredict via {@link #OREDICT_INPUT}. It will be used along all other item inputs as input of this recipe.
+ */
+ public static IRecipeMap AssemblerOD = IRecipeMap.newRecipeMap(builder -> {
+ Collection<GT_Recipe> ret = new ArrayList<>();
+ for (ItemStack input : GT_OreDictUnificator.getOresImmutable(builder.getMetadata(OREDICT_INPUT))) {
+ ret.addAll(
+ builder.copy()
+ .itemInputs(GT_RecipeMapUtil.appendArray(builder.getItemInputsBasic(), input))
+ .addTo(RecipeMaps.assemblerRecipes));
+ }
+ return ret;
+ });
+
+ /**
+ * A universal fuel adder. It's actually just a dispatcher towards all actual fuel recipe maps.
+ * Dispatch based on {@link #FUEL_TYPE}. Uses {@link #FUEL_VALUE} as fuel value.
+ * Can use {@link FuelType#ordinal()} as a human-readable form of what FUEL_TYPE should be.
+ * You can bypass this and add to relevant fuel maps directly if you wish.
+ */
+ public static IRecipeMap Fuel = IRecipeMap.newRecipeMap(builder -> {
+ builder.validateInputCount(1, 1)
+ .validateNoInputFluid()
+ .validateOutputCount(-1, 1)
+ .validateNoOutputFluid();
+ if (!builder.isValid()) return Collections.emptyList();
+ Integer fuelType = builder.getMetadata(FUEL_TYPE);
+ if (fuelType == null) return Collections.emptyList();
+ builder.metadata(FUEL_VALUE, builder.getMetadataOrDefault(FUEL_VALUE, 0));
+ return FuelType.get(fuelType)
+ .getTarget()
+ .doAdd(builder);
+ });
+
+ public enum FuelType {
+
+ // ORDER MATTERS. DO NOT INSERT ELEMENT BETWEEN EXISTING ONES
+ DieselFuel(RecipeMaps.dieselFuels),
+ GasTurbine(RecipeMaps.gasTurbineFuels),
+ // appears unused
+ HotFuel(RecipeMaps.hotFuels),
+ SemiFluid(RecipeMaps.denseLiquidFuels),
+ PlasmaTurbine(RecipeMaps.plasmaFuels),
+ Magic(RecipeMaps.magicFuels),;
+
+ private static final FuelType[] VALUES = values();
+ private final IRecipeMap target;
+
+ FuelType(IRecipeMap target) {
+ this.target = target;
+ }
+
+ public static FuelType get(int fuelType) {
+ if (fuelType < 0 || fuelType >= VALUES.length) return SemiFluid;
+ return VALUES[fuelType];
+ }
+
+ public IRecipeMap getTarget() {
+ return target;
+ }
+ }
+
+ static {
+ GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(COIL_HEAT);
+ GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(FUSION_THRESHOLD);
+ GT_RecipeMapUtil.SPECIAL_VALUE_ALIASES.add(FUEL_VALUE);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_RecipeMapUtil.java b/src/main/java/gregtech/api/util/GT_RecipeMapUtil.java
new file mode 100644
index 0000000000..3e97b56f84
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_RecipeMapUtil.java
@@ -0,0 +1,226 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.util.GT_Config.getStackConfigName;
+import static gregtech.api.util.GT_Utility.isArrayEmptyOrNull;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
+
+import cpw.mods.fml.common.Loader;
+import gnu.trove.list.TIntList;
+import gnu.trove.list.array.TIntArrayList;
+import gregtech.api.interfaces.IRecipeMap;
+import gregtech.api.recipe.RecipeMetadataKey;
+
+/**
+ * Define helpers useful in the creation of recipe maps.
+ */
+public class GT_RecipeMapUtil {
+
+ public static final Function<GT_Recipe, GT_Recipe> ALL_FAKE_RECIPE = r -> {
+ r.mFakeRecipe = true;
+ return r;
+ };
+
+ public static final Function<GT_Recipe, String> FIRST_FLUID_INPUT = r -> isArrayEmptyOrNull(r.mFluidInputs) ? null
+ : r.mFluidInputs[0].getFluid()
+ .getName();
+ public static final Function<GT_Recipe, String> FIRST_FLUID_OUTPUT = r -> isArrayEmptyOrNull(r.mFluidInputs) ? null
+ : r.mFluidOutputs[0].getFluid()
+ .getName();
+ public static final Function<GT_Recipe, String> FIRST_FLUIDSTACK_INPUT = r -> isArrayEmptyOrNull(r.mFluidInputs)
+ ? null
+ : r.mFluidInputs[0].getUnlocalizedName();
+ public static final Function<GT_Recipe, String> FIRST_FLUIDSTACK_OUTPUT = r -> isArrayEmptyOrNull(r.mFluidOutputs)
+ ? null
+ : r.mFluidOutputs[0].getUnlocalizedName();
+ public static final Function<GT_Recipe, String> FIRST_ITEM_INPUT = r -> isArrayEmptyOrNull(r.mInputs) ? null
+ : getStackConfigName(r.mInputs[0]);
+ public static final Function<GT_Recipe, String> FIRST_ITEM_OUTPUT = r -> isArrayEmptyOrNull(r.mOutputs) ? null
+ : getStackConfigName(r.mOutputs[0]);
+ public static final Function<GT_Recipe, String> FIRST_ITEM_OR_FLUID_INPUT = r -> isArrayEmptyOrNull(r.mInputs)
+ ? isArrayEmptyOrNull(r.mFluidInputs) ? null
+ : r.mFluidInputs[0].getFluid()
+ .getName()
+ : getStackConfigName(r.mInputs[0]);
+ public static final Function<GT_Recipe, String> FIRST_ITEM_OR_FLUID_OUTPUT = r -> isArrayEmptyOrNull(r.mOutputs)
+ ? isArrayEmptyOrNull(r.mFluidOutputs) ? null
+ : r.mFluidOutputs[0].getFluid()
+ .getName()
+ : getStackConfigName(r.mOutputs[0]);
+ private static final Map<String, IRecipeMap> addonRecipeMaps = new HashMap<>();
+ private static final Multimap<String, Consumer<IRecipeMap>> delayedActions = ArrayListMultimap.create();
+
+ /**
+ * Set of metadata that work as alias for special values.
+ */
+ public static final Set<RecipeMetadataKey<Integer>> SPECIAL_VALUE_ALIASES = new HashSet<>();
+
+ public static <T> T[] appendArray(T[] arr, T val) {
+ T[] newArr = Arrays.copyOf(arr, arr.length + 1);
+ newArr[arr.length] = val;
+ return newArr;
+ }
+
+ public static GT_RecipeTemplate asTemplate(GT_Recipe r) {
+ return asTemplate(r, false);
+ }
+
+ public static GT_RecipeTemplate asTemplate(GT_Recipe r, boolean includeTemplate) {
+ return new GT_RecipeTemplate(r, includeTemplate);
+ }
+
+ public static List<GT_Recipe> buildRecipeForMultiblock(GT_RecipeBuilder b) {
+ return buildOrEmpty(convertCellToFluid(b, true));
+
+ }
+
+ public static List<GT_Recipe> buildRecipeForMultiblockNoCircuit(GT_RecipeBuilder b) {
+ return buildOrEmpty(convertCellToFluid(b, false));
+ }
+
+ public static GT_RecipeBuilder convertCellToFluid(GT_RecipeBuilder b, boolean removeIntegratedCircuit) {
+ List<ItemStack> itemInputs = new ArrayList<>(Arrays.asList(b.getItemInputsBasic()));
+ List<ItemStack> itemOutputs = new ArrayList<>(Arrays.asList(b.getItemOutputs()));
+ List<FluidStack> fluidInputs = new ArrayList<>(Arrays.asList(b.getFluidInputs()));
+ List<FluidStack> fluidOutputs = new ArrayList<>(Arrays.asList(b.getFluidOutputs()));
+ TIntList chances = b.getChances() != null ? new TIntArrayList(b.getChances()) : null;
+ cellToFluid(itemInputs, fluidInputs, removeIntegratedCircuit, null);
+ cellToFluid(itemOutputs, fluidOutputs, removeIntegratedCircuit, chances);
+ itemInputs.removeIf(Objects::isNull);
+ if (chances == null) {
+ itemOutputs.removeIf(Objects::isNull);
+ }
+ fluidInputs.removeIf(Objects::isNull);
+ fluidOutputs.removeIf(Objects::isNull);
+ b.itemInputs(itemInputs.toArray(new ItemStack[0]));
+ b.itemOutputs(itemOutputs.toArray(new ItemStack[0]), chances != null ? chances.toArray() : null);
+ b.fluidInputs(fluidInputs.toArray(new FluidStack[0]));
+ b.fluidOutputs(fluidOutputs.toArray(new FluidStack[0]));
+ return b;
+ }
+
+ private static void cellToFluid(List<ItemStack> items, List<FluidStack> fluids, boolean removeIntegratedCircuit,
+ TIntList chances) {
+ for (int i = items.size() - 1; i >= 0; i--) {
+ ItemStack item = items.get(i);
+ if (GT_Utility.getFluidForFilledItem(item, true) != null || GT_Utility.isCellEmpty(item)
+ || (removeIntegratedCircuit && GT_Utility.isAnyIntegratedCircuit(item))) {
+ fluids.add(GT_Utility.convertCellToFluid(item));
+ items.remove(i);
+ if (chances != null) chances.removeAt(i);
+ }
+ }
+ }
+
+ public static List<GT_Recipe> buildOrEmpty(GT_RecipeBuilder builder) {
+ return builder.build()
+ .map(Collections::singletonList)
+ .orElse(Collections.emptyList());
+ }
+
+ /**
+ * Register a recipe map as part of your mod's public API under your modID and your given identifier.
+ *
+ * @param identifier map name
+ * @param recipeMap the map to register
+ * @param dependencies fully qualified identifier of dependent recipe maps. scheduler will only add recipes to one
+ * of the dependent recipe maps and this recipe map concurrently, guaranteeing thread safety.
+ * Currently unused, but you are advised to fill them, so that when The Day (tm) comes we don't
+ * end up with a bunch of weird concurrency bugs.
+ */
+ public static void registerRecipeMap(String identifier, IRecipeMap recipeMap, RecipeMapDependency... dependencies) {
+ String modId = Loader.instance()
+ .activeModContainer()
+ .getModId();
+ if (GregTech.ID.equals(modId)) throw new IllegalStateException(
+ "do not register recipe map under the name of gregtech! do it in your own preinit!");
+ String id = modId + "@" + identifier;
+ addonRecipeMaps.put(id, recipeMap);
+ for (Consumer<IRecipeMap> action : delayedActions.get(id)) {
+ action.accept(recipeMap);
+ }
+ }
+
+ /**
+ * Use this to register recipes for a recipe map in addon not present at compile time.
+ * <p>
+ * Do not use this for recipes maps already in {@link GT_RecipeConstants}. None of them will be available via this
+ * interface!
+ *
+ * @param identifier recipe map id
+ * @param registerAction DO NOT ADD RECIPES TO MAPS OTHER THAN THE ONE PASSED TO YOU. DO NOT DO ANYTHING OTHER THAN
+ * ADDING RECIPES TO THIS R
+ */
+ public static void registerRecipesFor(String modid, String identifier, Consumer<IRecipeMap> registerAction) {
+ String id = modid + "@" + identifier;
+ IRecipeMap map = addonRecipeMaps.get(id);
+ if (map == null) delayedActions.put(id, registerAction);
+ else registerAction.accept(map);
+ }
+
+ public static final class GT_RecipeTemplate {
+
+ private final GT_Recipe template;
+ private final List<GT_Recipe> derivatives = new ArrayList<>();
+
+ private GT_RecipeTemplate(GT_Recipe template, boolean includeTemplate) {
+ this.template = template;
+ if (includeTemplate) derivatives.add(template);
+ }
+
+ public GT_Recipe derive() {
+ GT_Recipe derived = template.copyShallow();
+ derivatives.add(derived);
+ return derived;
+ }
+
+ public List<GT_Recipe> getAll() {
+ // fix shallow references
+ Set<Object> references = Collections.newSetFromMap(new IdentityHashMap<>());
+ for (GT_Recipe r : derivatives) {
+ if (!references.add(r.mInputs)) r.mInputs = r.mInputs.clone();
+ if (!references.add(r.mOutputs)) r.mOutputs = r.mOutputs.clone();
+ if (!references.add(r.mFluidInputs)) r.mFluidInputs = r.mFluidInputs.clone();
+ if (!references.add(r.mFluidOutputs)) r.mFluidOutputs = r.mFluidOutputs.clone();
+ }
+ return derivatives;
+ }
+ }
+
+ public static final class RecipeMapDependency {
+
+ private final IRecipeMap obj;
+ private final String id;
+
+ public RecipeMapDependency(IRecipeMap obj, String id) {
+ this.obj = obj;
+ this.id = id;
+ }
+
+ public static RecipeMapDependency create(String id) {
+ return new RecipeMapDependency(null, id);
+ }
+
+ public static RecipeMapDependency create(IRecipeMap obj) {
+ return new RecipeMapDependency(obj, null);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_RecipeRegistrator.java b/src/main/java/gregtech/api/util/GT_RecipeRegistrator.java
new file mode 100644
index 0000000000..f4490b59b0
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_RecipeRegistrator.java
@@ -0,0 +1,868 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.L;
+import static gregtech.api.enums.GT_Values.M;
+import static gregtech.api.enums.GT_Values.RA;
+import static gregtech.api.enums.Materials.Bronze;
+import static gregtech.api.enums.Materials.Cobalt;
+import static gregtech.api.enums.Materials.DarkSteel;
+import static gregtech.api.enums.Materials.Diamond;
+import static gregtech.api.enums.Materials.FierySteel;
+import static gregtech.api.enums.Materials.Gold;
+import static gregtech.api.enums.Materials.Iron;
+import static gregtech.api.enums.Materials.IronWood;
+import static gregtech.api.enums.Materials.Knightmetal;
+import static gregtech.api.enums.Materials.Lead;
+import static gregtech.api.enums.Materials.Ruby;
+import static gregtech.api.enums.Materials.Sapphire;
+import static gregtech.api.enums.Materials.Steel;
+import static gregtech.api.enums.Materials.Steeleaf;
+import static gregtech.api.enums.Materials.Thaumium;
+import static gregtech.api.enums.Materials.Void;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.recipe.RecipeMaps.wiremillRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.RECYCLE;
+import static gregtech.api.util.GT_RecipeConstants.UniversalArcFurnace;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
+import net.minecraft.item.crafting.IRecipe;
+import net.minecraft.item.crafting.ShapedRecipes;
+import net.minecraft.item.crafting.ShapelessRecipes;
+import net.minecraftforge.oredict.ShapedOreRecipe;
+import net.minecraftforge.oredict.ShapelessOreRecipe;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.SetMultimap;
+
+import cpw.mods.fml.relauncher.ReflectionHelper;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.objects.ItemData;
+import gregtech.api.objects.MaterialStack;
+import gregtech.api.recipe.RecipeCategories;
+import ic2.api.reactor.IReactorComponent;
+
+/**
+ * Class for Automatic Recipe registering.
+ */
+public class GT_RecipeRegistrator {
+
+ /**
+ * List of Materials, which are used in the Creation of Sticks. All Rod Materials are automatically added to this
+ * List.
+ */
+ public static final List<Materials> sRodMaterialList = new ArrayList<>();
+
+ private static final ItemStack sMt1 = new ItemStack(Blocks.dirt, 1, 0), sMt2 = new ItemStack(Blocks.dirt, 1, 0);
+ private static final String s_H = "h", s_F = "f", s_I = "I", s_P = "P", s_R = "R";
+ private static final RecipeShape[] sShapes = new RecipeShape[] {
+ new RecipeShape(sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1, null),
+ new RecipeShape(sMt1, null, sMt1, sMt1, null, sMt1, sMt1, sMt1, sMt1),
+ new RecipeShape(null, sMt1, null, sMt1, sMt1, sMt1, sMt1, null, sMt1),
+ new RecipeShape(sMt1, sMt1, sMt1, sMt1, null, sMt1, null, null, null),
+ new RecipeShape(sMt1, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1),
+ new RecipeShape(sMt1, sMt1, sMt1, sMt1, null, sMt1, sMt1, null, sMt1),
+ new RecipeShape(null, null, null, sMt1, null, sMt1, sMt1, null, sMt1),
+ new RecipeShape(null, sMt1, null, null, sMt1, null, null, sMt2, null),
+ new RecipeShape(sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2, null),
+ new RecipeShape(null, sMt1, null, null, sMt2, null, null, sMt2, null),
+ new RecipeShape(sMt1, sMt1, null, sMt1, sMt2, null, null, sMt2, null),
+ new RecipeShape(null, sMt1, sMt1, null, sMt2, sMt1, null, sMt2, null),
+ new RecipeShape(sMt1, sMt1, null, null, sMt2, null, null, sMt2, null),
+ new RecipeShape(null, sMt1, sMt1, null, sMt2, null, null, sMt2, null),
+ new RecipeShape(null, sMt1, null, sMt1, null, null, null, sMt1, sMt2),
+ new RecipeShape(null, sMt1, null, null, null, sMt1, sMt2, sMt1, null),
+ new RecipeShape(null, sMt1, null, sMt1, null, sMt1, null, null, sMt2),
+ new RecipeShape(null, sMt1, null, sMt1, null, sMt1, sMt2, null, null),
+ new RecipeShape(null, sMt2, null, null, sMt1, null, null, sMt1, null),
+ new RecipeShape(null, sMt2, null, null, sMt2, null, sMt1, sMt1, sMt1),
+ new RecipeShape(null, sMt2, null, null, sMt2, null, null, sMt1, null),
+ new RecipeShape(null, sMt2, null, sMt1, sMt2, null, sMt1, sMt1, null),
+ new RecipeShape(null, sMt2, null, null, sMt2, sMt1, null, sMt1, sMt1),
+ new RecipeShape(null, sMt2, null, null, sMt2, null, sMt1, sMt1, null),
+ new RecipeShape(sMt1, null, null, null, sMt2, null, null, null, sMt2),
+ new RecipeShape(null, null, sMt1, null, sMt2, null, sMt2, null, null),
+ new RecipeShape(sMt1, null, null, null, sMt2, null, null, null, null),
+ new RecipeShape(null, null, sMt1, null, sMt2, null, null, null, null),
+ new RecipeShape(sMt1, sMt2, null, null, null, null, null, null, null),
+ new RecipeShape(sMt2, sMt1, null, null, null, null, null, null, null),
+ new RecipeShape(sMt1, null, null, sMt2, null, null, null, null, null),
+ new RecipeShape(sMt2, null, null, sMt1, null, null, null, null, null),
+ new RecipeShape(sMt1, sMt1, sMt1, sMt1, sMt1, sMt1, null, sMt2, null),
+ new RecipeShape(sMt1, sMt1, null, sMt1, sMt1, sMt2, sMt1, sMt1, null),
+ new RecipeShape(null, sMt1, sMt1, sMt2, sMt1, sMt1, null, sMt1, sMt1),
+ new RecipeShape(null, sMt2, null, sMt1, sMt1, sMt1, sMt1, sMt1, sMt1),
+ new RecipeShape(sMt1, sMt1, sMt1, sMt1, sMt2, sMt1, null, sMt2, null),
+ new RecipeShape(sMt1, sMt1, null, sMt1, sMt2, sMt2, sMt1, sMt1, null),
+ new RecipeShape(null, sMt1, sMt1, sMt2, sMt2, sMt1, null, sMt1, sMt1),
+ new RecipeShape(null, sMt2, null, sMt1, sMt2, sMt1, sMt1, sMt1, sMt1),
+ new RecipeShape(sMt1, null, null, null, sMt1, null, null, null, null),
+ new RecipeShape(null, sMt1, null, sMt1, null, null, null, null, null),
+ new RecipeShape(sMt1, sMt1, null, sMt2, null, sMt1, sMt2, null, null),
+ new RecipeShape(null, sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2) };
+ public static final Field SHAPED_ORE_RECIPE_WIDTH = ReflectionHelper.findField(ShapedOreRecipe.class, "width");
+ public static final Field SHAPED_ORE_RECIPE_HEIGHT = ReflectionHelper.findField(ShapedOreRecipe.class, "height");
+ private static volatile Map<RecipeShape, List<IRecipe>> indexedRecipeListCache;
+ private static final String[][] sShapesA = new String[][] { null, null, null,
+ { "Helmet", s_P + s_P + s_P, s_P + s_H + s_P },
+ { "ChestPlate", s_P + s_H + s_P, s_P + s_P + s_P, s_P + s_P + s_P },
+ { "Pants", s_P + s_P + s_P, s_P + s_H + s_P, s_P + " " + s_P }, { "Boots", s_P + " " + s_P, s_P + s_H + s_P },
+ { "Sword", " " + s_P + " ", s_F + s_P + s_H, " " + s_R + " " },
+ { "Pickaxe", s_P + s_I + s_I, s_F + s_R + s_H, " " + s_R + " " },
+ { "Shovel", s_F + s_P + s_H, " " + s_R + " ", " " + s_R + " " },
+ { "Axe", s_P + s_I + s_H, s_P + s_R + " ", s_F + s_R + " " },
+ { "Axe", s_P + s_I + s_H, s_P + s_R + " ", s_F + s_R + " " },
+ { "Hoe", s_P + s_I + s_H, s_F + s_R + " ", " " + s_R + " " },
+ { "Hoe", s_P + s_I + s_H, s_F + s_R + " ", " " + s_R + " " },
+ { "Sickle", " " + s_P + " ", s_P + s_F + " ", s_H + s_P + s_R },
+ { "Sickle", " " + s_P + " ", s_P + s_F + " ", s_H + s_P + s_R },
+ { "Sickle", " " + s_P + " ", s_P + s_F + " ", s_H + s_P + s_R },
+ { "Sickle", " " + s_P + " ", s_P + s_F + " ", s_H + s_P + s_R },
+ { "Sword", " " + s_R + " ", s_F + s_P + s_H, " " + s_P + " " },
+ { "Pickaxe", " " + s_R + " ", s_F + s_R + s_H, s_P + s_I + s_I },
+ { "Shovel", " " + s_R + " ", " " + s_R + " ", s_F + s_P + s_H },
+ { "Axe", s_F + s_R + " ", s_P + s_R + " ", s_P + s_I + s_H },
+ { "Axe", s_F + s_R + " ", s_P + s_R + " ", s_P + s_I + s_H },
+ { "Hoe", " " + s_R + " ", s_F + s_R + " ", s_P + s_I + s_H },
+ { "Hoe", " " + s_R + " ", s_F + s_R + " ", s_P + s_I + s_H },
+ { "Spear", s_P + s_H + " ", s_F + s_R + " ", " " + " " + s_R },
+ { "Spear", s_P + s_H + " ", s_F + s_R + " ", " " + " " + s_R }, { "Knive", s_H + s_P, s_R + s_F },
+ { "Knive", s_F + s_H, s_P + s_R }, { "Knive", s_F + s_H, s_P + s_R }, { "Knive", s_P + s_F, s_R + s_H },
+ { "Knive", s_P + s_F, s_R + s_H }, null, null, null, null,
+ { "WarAxe", s_P + s_P + s_P, s_P + s_R + s_P, s_F + s_R + s_H }, null, null, null,
+ { "Shears", s_H + s_P, s_P + s_F }, { "Shears", s_H + s_P, s_P + s_F },
+ { "Scythe", s_I + s_P + s_H, s_R + s_F + s_P, s_R + " " + " " },
+ { "Scythe", s_H + s_P + s_I, s_P + s_F + s_R, " " + " " + s_R } };
+
+ static {
+ // flush the cache on post load finish
+ GregTech_API.sAfterGTPostload.add(() -> indexedRecipeListCache = null);
+ }
+
+ public static void registerMaterialRecycling(ItemStack aStack, Materials aMaterial, long aMaterialAmount,
+ MaterialStack aByproduct) {
+ if (GT_Utility.isStackInvalid(aStack)) return;
+ if (aByproduct != null) {
+ aByproduct = aByproduct.clone();
+ aByproduct.mAmount /= aStack.stackSize;
+ }
+ GT_OreDictUnificator.addItemData(
+ GT_Utility.copyAmount(1, aStack),
+ new ItemData(aMaterial, aMaterialAmount / aStack.stackSize, aByproduct));
+ }
+
+ public static void registerMaterialRecycling(ItemStack aStack, ItemData aData) {
+ if (GT_Utility.isStackInvalid(aStack) || GT_Utility.areStacksEqual(new ItemStack(Items.blaze_rod), aStack)
+ || aData == null
+ || !aData.hasValidMaterialData()
+ || !aData.mMaterial.mMaterial.mAutoGenerateRecycleRecipes
+ || aData.mMaterial.mAmount <= 0
+ || GT_Utility.getFluidForFilledItem(aStack, false) != null
+ || aData.mMaterial.mMaterial.mSubTags.contains(SubTag.NO_RECIPES)) return;
+ registerReverseMacerating(GT_Utility.copyAmount(1, aStack), aData, aData.mPrefix == null);
+ if (!GT_Utility.areStacksEqual(GT_ModHandler.getIC2Item("iridiumOre", 1L), aStack)) {
+ registerReverseSmelting(
+ GT_Utility.copyAmount(1, aStack),
+ aData.mMaterial.mMaterial,
+ aData.mMaterial.mAmount,
+ true);
+ registerReverseFluidSmelting(
+ GT_Utility.copyAmount(1, aStack),
+ aData.mMaterial.mMaterial,
+ aData.mMaterial.mAmount,
+ aData.getByProduct(0));
+ registerReverseArcSmelting(GT_Utility.copyAmount(1, aStack), aData);
+ }
+ }
+
+ /**
+ * @param aStack the stack to be recycled.
+ * @param aMaterial the Material.
+ * @param aMaterialAmount the amount of it in Material Units.
+ */
+ public static void registerReverseFluidSmelting(ItemStack aStack, Materials aMaterial, long aMaterialAmount,
+ MaterialStack aByproduct) {
+ if (aStack == null || aMaterial == null
+ || aMaterial.mSmeltInto.mStandardMoltenFluid == null
+ || !aMaterial.contains(SubTag.SMELTING_TO_FLUID)
+ || (L * aMaterialAmount) / (M * aStack.stackSize) <= 0) return;
+
+ ItemStack recipeOutput = aByproduct == null ? null
+ : aByproduct.mMaterial.contains(SubTag.NO_SMELTING) || !aByproduct.mMaterial.contains(SubTag.METAL)
+ ? aByproduct.mMaterial.contains(SubTag.FLAMMABLE)
+ ? GT_OreDictUnificator.getDust(Materials.Ash, aByproduct.mAmount / 2)
+ : aByproduct.mMaterial.contains(SubTag.UNBURNABLE)
+ ? GT_OreDictUnificator.getDustOrIngot(aByproduct.mMaterial.mSmeltInto, aByproduct.mAmount)
+ : null
+ : GT_OreDictUnificator.getIngotOrDust(aByproduct.mMaterial.mSmeltInto, aByproduct.mAmount);
+
+ GT_RecipeBuilder builder = RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack));
+ if (recipeOutput != null) {
+ builder.itemOutputs(recipeOutput);
+ }
+ builder.fluidOutputs(aMaterial.mSmeltInto.getMolten((L * aMaterialAmount) / (M * aStack.stackSize)))
+ .duration((int) Math.max(1, (24 * aMaterialAmount) / M))
+ .eut(Math.max(8, (int) Math.sqrt(2 * aMaterial.mSmeltInto.mStandardMoltenFluid.getTemperature())))
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ /**
+ * @param aStack the stack to be recycled.
+ * @param aMaterial the Material.
+ * @param aMaterialAmount the amount of it in Material Units.
+ * @param aAllowAlloySmelter if it is allowed to be recycled inside the Alloy Smelter.
+ */
+ public static void registerReverseSmelting(ItemStack aStack, Materials aMaterial, long aMaterialAmount,
+ boolean aAllowAlloySmelter) {
+ if (aStack == null || aMaterial == null
+ || aMaterialAmount <= 0
+ || aMaterial.contains(SubTag.NO_SMELTING)
+ || (aMaterialAmount > M && aMaterial.contains(SubTag.METAL))
+ || (aMaterial.getProcessingMaterialTierEU() > TierEU.IV)) return;
+ if (aMaterial == Materials.Naquadah || aMaterial == Materials.NaquadahEnriched) return;
+
+ aMaterialAmount /= aStack.stackSize;
+
+ if (aAllowAlloySmelter) GT_ModHandler.addSmeltingAndAlloySmeltingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ GT_OreDictUnificator.getIngot(aMaterial.mSmeltInto, aMaterialAmount),
+ false);
+ else GT_ModHandler.addSmeltingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ GT_OreDictUnificator.getIngot(aMaterial.mSmeltInto, aMaterialAmount));
+ }
+
+ public static void registerReverseArcSmelting(ItemStack aStack, Materials aMaterial, long aMaterialAmount,
+ MaterialStack aByProduct01, MaterialStack aByProduct02, MaterialStack aByProduct03) {
+ registerReverseArcSmelting(
+ aStack,
+ new ItemData(
+ aMaterial == null ? null : new MaterialStack(aMaterial, aMaterialAmount),
+ aByProduct01,
+ aByProduct02,
+ aByProduct03));
+ }
+
+ public static void registerReverseArcSmelting(ItemStack aStack, ItemData aData) {
+ if (aStack == null || aData == null) return;
+ aData = new ItemData(aData);
+
+ if (!aData.hasValidMaterialData()) return;
+ boolean isRecycle = true;
+
+ for (MaterialStack tMaterial : aData.getAllMaterialStacks()) {
+ if (tMaterial.mMaterial == Materials.Iron || tMaterial.mMaterial == Materials.Copper
+ || tMaterial.mMaterial == Materials.WroughtIron
+ || tMaterial.mMaterial == Materials.AnnealedCopper) {
+ ItemData stackData = GT_OreDictUnificator.getItemData(aStack);
+ if (stackData != null
+ && (stackData.mPrefix == OrePrefixes.ingot || stackData.mPrefix == OrePrefixes.dust)) {
+ // iron ingot/dust -> wrought iron, copper ingot/dust -> annealed copper
+ isRecycle = false;
+ }
+ }
+
+ if (tMaterial.mMaterial.contains(SubTag.UNBURNABLE)) {
+ tMaterial.mMaterial = tMaterial.mMaterial.mSmeltInto.mArcSmeltInto;
+ continue;
+ }
+ if (tMaterial.mMaterial.contains(SubTag.EXPLOSIVE)) {
+ tMaterial.mMaterial = Materials.Ash;
+ tMaterial.mAmount /= 16;
+ continue;
+ }
+ if (tMaterial.mMaterial.contains(SubTag.FLAMMABLE)) {
+ tMaterial.mMaterial = Materials.Ash;
+ tMaterial.mAmount /= 8;
+ continue;
+ }
+ if (tMaterial.mMaterial.contains(SubTag.NO_SMELTING)) {
+ tMaterial.mAmount = 0;
+ continue;
+ }
+ if (tMaterial.mMaterial.contains(SubTag.METAL)) {
+ if (GT_Mod.gregtechproxy.mArcSmeltIntoAnnealed) {
+ tMaterial.mMaterial = tMaterial.mMaterial.mSmeltInto.mArcSmeltInto;
+ } else {
+ tMaterial.mMaterial = tMaterial.mMaterial.mSmeltInto.mSmeltInto;
+ }
+ continue;
+ }
+ tMaterial.mAmount = 0;
+ }
+
+ aData = new ItemData(aData);
+ if (aData.mByProducts.length > 3) for (MaterialStack tMaterial : aData.getAllMaterialStacks()) {
+ if (tMaterial.mMaterial == Materials.Ash) tMaterial.mAmount = 0;
+ }
+
+ aData = new ItemData(aData);
+
+ if (!aData.hasValidMaterialData()) return;
+
+ long tAmount = 0;
+ for (MaterialStack tMaterial : aData.getAllMaterialStacks())
+ tAmount += tMaterial.mAmount * tMaterial.mMaterial.getMass();
+
+ ArrayList<ItemStack> outputs = new ArrayList<>();
+ if (GT_OreDictUnificator.getIngotOrDust(aData.mMaterial) != null) {
+ outputs.add(GT_OreDictUnificator.getIngotOrDust(aData.mMaterial));
+ }
+ for (int i = 0; i < 8; i++) {
+ if (GT_OreDictUnificator.getIngotOrDust(aData.getByProduct(i)) != null) {
+ outputs.add(GT_OreDictUnificator.getIngotOrDust(aData.getByProduct(i)));
+ }
+ }
+ if (!outputs.isEmpty()) {
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder.itemInputs(aStack)
+ .itemOutputs(outputs.toArray(new ItemStack[0]))
+ .fluidInputs(Materials.Oxygen.getGas((int) Math.max(16, tAmount / M)))
+ .duration(((int) Math.max(16, tAmount / M)) * TICKS)
+ .eut(90)
+ .metadata(RECYCLE, isRecycle)
+ .addTo(UniversalArcFurnace);
+ }
+
+ }
+
+ public static void registerReverseMacerating(ItemStack aStack, Materials aMaterial, long aMaterialAmount,
+ MaterialStack aByProduct01, MaterialStack aByProduct02, MaterialStack aByProduct03, boolean aAllowHammer) {
+ registerReverseMacerating(
+ aStack,
+ new ItemData(
+ aMaterial == null ? null : new MaterialStack(aMaterial, aMaterialAmount),
+ aByProduct01,
+ aByProduct02,
+ aByProduct03),
+ aAllowHammer);
+ }
+
+ public static void registerReverseMacerating(ItemStack aStack, ItemData aData, boolean aAllowHammer) {
+ if (aStack == null || aData == null) return;
+ aData = new ItemData(aData);
+
+ if (!aData.hasValidMaterialData()) return;
+
+ for (MaterialStack tMaterial : aData.getAllMaterialStacks())
+ tMaterial.mMaterial = tMaterial.mMaterial.mMacerateInto;
+
+ aData = new ItemData(aData);
+
+ if (!aData.hasValidMaterialData()) return;
+
+ long tAmount = 0;
+ for (MaterialStack tMaterial : aData.getAllMaterialStacks()) {
+ tAmount += tMaterial.mAmount * tMaterial.mMaterial.getMass();
+ }
+
+ {
+ ArrayList<ItemStack> outputs = new ArrayList<>();
+ if (GT_OreDictUnificator.getDust(aData.mMaterial) != null) {
+ outputs.add(GT_OreDictUnificator.getDust(aData.mMaterial));
+ }
+ for (int i = 0; i < 3; i++) {
+ if (GT_OreDictUnificator.getDust(aData.getByProduct(i)) != null) {
+ outputs.add(GT_OreDictUnificator.getDust(aData.getByProduct(i)));
+ }
+ }
+ if (!outputs.isEmpty()) {
+ ItemStack[] outputsArray = outputs.toArray(new ItemStack[0]);
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder.itemInputs(aStack)
+ .itemOutputs(outputsArray)
+ .duration(
+ (aData.mMaterial.mMaterial == Materials.Marble ? 1 : (int) Math.max(16, tAmount / M)) * TICKS)
+ .eut(4)
+ .recipeCategory(RecipeCategories.maceratorRecycling)
+ .addTo(maceratorRecipes);
+ }
+ }
+
+ if (!aAllowHammer) {
+ return;
+ }
+
+ for (MaterialStack tMaterial : aData.getAllMaterialStacks()) {
+ if (tMaterial.mMaterial.contains(SubTag.CRYSTAL) && !tMaterial.mMaterial.contains(SubTag.METAL)
+ && tMaterial.mMaterial != Materials.Glass
+ && GT_OreDictUnificator.getDust(aData.mMaterial) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.getDust(aData.mMaterial))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .recipeCategory(RecipeCategories.forgeHammerRecycling)
+ .addTo(hammerRecipes);
+ break;
+ }
+ }
+
+ }
+
+ /**
+ * Place Materials which you want to replace in Non-GT-Recipes here (warning HUGHE impact on loading times!)
+ */
+ private static final Materials[] VANILLA_MATS = { Cobalt, Gold, Iron, Lead, FierySteel, Void, Bronze, Diamond, Ruby,
+ Sapphire, Steel, IronWood, Steeleaf, Knightmetal, Thaumium, DarkSteel, };
+
+ /**
+ * You give this Function a Material and it will scan almost everything for adding recycling Recipes and replacing
+ * Ingots, Gems etc.
+ *
+ * @param aMats Materials, for example an Ingot or a Gem.
+ * @param aPlate the Plate referenced to aMat
+ * @param aRecipeReplacing allows to replace the Recipe with a Plate variant
+ */
+ public static synchronized void registerUsagesForMaterials(String aPlate, boolean aRecipeReplacing,
+ ItemStack... aMats) {
+ for (ItemStack aMat : aMats) {
+ aMat = GT_Utility.copyOrNull(aMat);
+
+ if (aMat == null) continue;
+
+ ItemData aItemData = GT_OreDictUnificator.getItemData(aMat);
+ if (aItemData == null || aItemData.mPrefix != OrePrefixes.ingot) aPlate = null;
+ if (aPlate != null && GT_OreDictUnificator.getFirstOre(aPlate, 1) == null) aPlate = null;
+
+ sMt1.func_150996_a(aMat.getItem());
+ sMt1.stackSize = 1;
+ Items.feather.setDamage(sMt1, Items.feather.getDamage(aMat));
+
+ sMt2.func_150996_a(new ItemStack(Blocks.dirt).getItem());
+ sMt2.stackSize = 1;
+ Items.feather.setDamage(sMt2, 0);
+
+ if (aItemData != null && aItemData.hasValidPrefixMaterialData()) {
+ for (RecipeShape tRecipe : sShapes) {
+ for (ItemStack tCrafted : GT_ModHandler.getRecipeOutputsBuffered(tRecipe.shape)) {
+ GT_OreDictUnificator.addItemData(
+ tCrafted,
+ new ItemData(aItemData.mMaterial.mMaterial, aItemData.mMaterial.mAmount * tRecipe.amount1));
+ //
+ // GT_Log.out.println("###################################################################################");
+ // GT_Log.out.println("registerUsagesForMaterials used aPlate: "+aPlate);
+ // GT_Log.out.println("registerUsagesForMaterials used aPlate:
+ // "+aMat.getUnlocalizedName());
+ // GT_Log.out.println("registerUsagesForMaterials used aPlate:
+ // "+aMat.getDisplayName());
+ //
+ // GT_Log.out.println("###################################################################################");
+ }
+ }
+ }
+ registerStickStuff(aPlate, aItemData, aRecipeReplacing);
+ }
+ }
+
+ private static List<IRecipe> getRecipeList(RecipeShape shape) {
+ boolean force = !GregTech_API.sPostloadStarted || GregTech_API.sPostloadFinished;
+ if (force || indexedRecipeListCache == null) {
+ synchronized (GT_RecipeRegistrator.class) {
+ if (indexedRecipeListCache == null || force) {
+ indexedRecipeListCache = createIndexedRecipeListCache();
+ }
+ }
+ }
+ return indexedRecipeListCache.get(shape);
+ }
+
+ private static Map<RecipeShape, List<IRecipe>> createIndexedRecipeListCache() {
+ Map<RecipeShape, List<IRecipe>> result = new IdentityHashMap<>();
+ ArrayList<IRecipe> allRecipeList = (ArrayList<IRecipe>) CraftingManager.getInstance()
+ .getRecipeList();
+ // filter using the empty slots in the shape.
+ // if the empty slots doesn't match, the recipe will definitely fail
+ SetMultimap<List<Integer>, RecipeShape> filter = HashMultimap.create();
+ for (RecipeShape shape : sShapes) {
+ for (List<Integer> list : shape.getEmptySlotsAllVariants()) {
+ filter.put(list, shape);
+ }
+ }
+ List<Integer> buffer = new ArrayList<>(9);
+ for (IRecipe tRecipe : allRecipeList) {
+ if (tRecipe instanceof ShapelessRecipes || tRecipe instanceof ShapelessOreRecipe) {
+ // we don't target shapeless recipes
+ continue;
+ }
+ buffer.clear();
+ ItemStack tStack = tRecipe.getRecipeOutput();
+ if (GT_Utility.isStackValid(tStack) && tStack.getMaxStackSize() == 1
+ && tStack.getMaxDamage() > 0
+ && !(tStack.getItem() instanceof ItemBlock)
+ && !(tStack.getItem() instanceof IReactorComponent)
+ && !GT_ModHandler.isElectricItem(tStack)
+ && !GT_Utility.isStackInList(tStack, GT_ModHandler.sNonReplaceableItems)) {
+ if (tRecipe instanceof ShapedOreRecipe tShapedRecipe) {
+ if (checkRecipeShape(
+ buffer,
+ tShapedRecipe.getInput(),
+ getRecipeWidth(tShapedRecipe),
+ getRecipeHeight(tShapedRecipe))) {
+ for (RecipeShape s : filter.get(buffer)) {
+ result.computeIfAbsent(s, k -> new ArrayList<>())
+ .add(tRecipe);
+ }
+ }
+ } else if (tRecipe instanceof ShapedRecipes tShapedRecipe) {
+ if (checkRecipeShape(
+ buffer,
+ tShapedRecipe.recipeItems,
+ getRecipeWidth(tShapedRecipe),
+ getRecipeHeight(tShapedRecipe))) {
+ for (RecipeShape s : filter.get(buffer)) {
+ result.computeIfAbsent(s, k -> new ArrayList<>())
+ .add(tRecipe);
+ }
+ }
+ } else {
+ for (RecipeShape s : sShapes) {
+ // unknown recipe type. cannot determine empty slots. we choose to add to the recipe list for
+ // all shapes
+ result.computeIfAbsent(s, k -> new ArrayList<>())
+ .add(tRecipe);
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ private static boolean checkRecipeShape(List<Integer> emptySlotIndexesBuffer, Object[] input, int tRecipeWidth,
+ int tRecipeHeight) {
+ for (int y = 0; y < 3; y++) {
+ for (int x = 0; x < 3; x++) {
+ if (x >= tRecipeWidth || y >= tRecipeHeight) {
+ emptySlotIndexesBuffer.add(x + y * 3);
+ continue;
+ }
+ Object tObject = input[x + y * tRecipeWidth];
+ if (tObject == null) {
+ emptySlotIndexesBuffer.add(x + y * 3);
+ continue;
+ }
+ if (tObject instanceof ItemStack
+ && (((ItemStack) tObject).getItem() == null || ((ItemStack) tObject).getMaxStackSize() < 2
+ || ((ItemStack) tObject).getMaxDamage() > 0
+ || ((ItemStack) tObject).getItem() instanceof ItemBlock)) {
+ return false;
+ }
+ if (tObject instanceof List && ((List<?>) tObject).isEmpty()) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ private static synchronized void registerStickStuff(String aPlate, ItemData aItemData, boolean aRecipeReplacing) {
+ ItemStack tStack;
+ for (Materials tMaterial : sRodMaterialList) {
+ ItemStack tMt2 = GT_OreDictUnificator.get(OrePrefixes.stick, tMaterial, 1);
+ if (tMt2 != null) {
+ sMt2.func_150996_a(tMt2.getItem());
+ sMt2.stackSize = 1;
+ Items.feather.setDamage(sMt2, Items.feather.getDamage(tMt2));
+
+ for (int i = 0; i < sShapes.length; i++) {
+ RecipeShape tRecipe = sShapes[i];
+
+ for (ItemStack tCrafted : GT_ModHandler
+ .getRecipeOutputs(getRecipeList(tRecipe), true, tRecipe.shape)) {
+ if (aItemData != null && aItemData.hasValidPrefixMaterialData())
+ GT_OreDictUnificator.addItemData(
+ tCrafted,
+ new ItemData(
+ aItemData.mMaterial.mMaterial,
+ aItemData.mMaterial.mAmount * tRecipe.amount1,
+ new MaterialStack(tMaterial, OrePrefixes.stick.mMaterialAmount * tRecipe.amount2)));
+
+ if (aRecipeReplacing && aPlate != null && sShapesA[i] != null && sShapesA[i].length > 1) {
+ assert aItemData != null;
+
+ if (null != (tStack = GT_ModHandler.removeRecipe(tRecipe.shape))) {
+ switch (sShapesA[i].length) {
+ case 2 -> GT_ModHandler.addCraftingRecipe(
+ tStack,
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { sShapesA[i][1], s_P.charAt(0), aPlate, s_R.charAt(0),
+ OrePrefixes.stick.get(tMaterial), s_I.charAt(0), aItemData });
+ case 3 -> GT_ModHandler.addCraftingRecipe(
+ tStack,
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { sShapesA[i][1], sShapesA[i][2], s_P.charAt(0), aPlate,
+ s_R.charAt(0), OrePrefixes.stick.get(tMaterial), s_I.charAt(0),
+ aItemData });
+ default -> GT_ModHandler.addCraftingRecipe(
+ tStack,
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { sShapesA[i][1], sShapesA[i][2], sShapesA[i][3], s_P.charAt(0),
+ aPlate, s_R.charAt(0), OrePrefixes.stick.get(tMaterial), s_I.charAt(0),
+ aItemData });
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Registers wiremill recipes for given material using integrated circuits.
+ *
+ * @param aMaterial material to register
+ * @param baseDuration base duration ticks for ingot -> 1x wire recipe
+ * @param aEUt EU/t for recipe If you provide a proper EU tier for recipe processing then aEUt will be
+ * overriden with it.
+ */
+ public static void registerWiremillRecipes(Materials aMaterial, int baseDuration, int aEUt) {
+ registerWiremillRecipes(
+ aMaterial,
+ baseDuration,
+ calculateRecipeEU(aMaterial, aEUt),
+ OrePrefixes.ingot,
+ OrePrefixes.stick,
+ 2);
+ }
+
+ /**
+ * Registers wiremill recipes for given material using integrated circuits.
+ *
+ * @param aMaterial material to register
+ * @param baseDuration base duration ticks for ingot -> 1x wire recipe
+ * @param aEUt EU/t for recipe
+ * @param prefix1 prefix corresponds to ingot
+ * @param prefix2 prefix corresponds to stick
+ * @param multiplier amount of wires created from 1 ingot
+ */
+ public static void registerWiremillRecipes(Materials aMaterial, int baseDuration, int aEUt, OrePrefixes prefix1,
+ OrePrefixes prefix2, int multiplier) {
+ if (GT_OreDictUnificator.get(prefix1, aMaterial, 1L) != null
+ && GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(prefix1, aMaterial, 1L), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, multiplier))
+ .duration(baseDuration * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(prefix1, aMaterial, 2L / multiplier),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt02, aMaterial, 1L))
+ .duration(((int) (baseDuration * 1.5f)) * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(prefix1, aMaterial, 4L / multiplier),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt04, aMaterial, 1L))
+ .duration(baseDuration * 2 * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(prefix1, aMaterial, 8L / multiplier),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt08, aMaterial, 1L))
+ .duration(((int) (baseDuration * 2.5f)) * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(prefix1, aMaterial, 12L / multiplier),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt12, aMaterial, 1L))
+ .duration(baseDuration * 3 * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(prefix1, aMaterial, 16L / multiplier),
+ GT_Utility.getIntegratedCircuit(16))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt16, aMaterial, 1L))
+ .duration(((int) (baseDuration * 3.5f)) * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(prefix2, aMaterial, 1L) != null
+ && GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(prefix2, aMaterial, 1L), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 2L / multiplier))
+ .duration(((int) (baseDuration * 0.5f)) * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(prefix2, aMaterial, 4L / multiplier),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt02, aMaterial, 1L))
+ .duration(baseDuration * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(prefix2, aMaterial, 8L / multiplier),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt04, aMaterial, 1L))
+ .duration(((int) (baseDuration * 1.5f)) * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(prefix2, aMaterial, 16L / multiplier),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt08, aMaterial, 1L))
+ .duration(baseDuration * 2 * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(prefix2, aMaterial, 24L / multiplier),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt12, aMaterial, 1L))
+ .duration(((int) (baseDuration * 2.5f)) * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(prefix2, aMaterial, 32L / multiplier),
+ GT_Utility.getIntegratedCircuit(16))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt16, aMaterial, 1L))
+ .duration(baseDuration * 3 * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ }
+ if (GT_OreDictUnificator.get(prefix1, aMaterial, 1L) != null
+ && GT_OreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(prefix1, aMaterial, 1L), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 4L * multiplier))
+ .duration(baseDuration * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ }
+ if (GT_OreDictUnificator.get(prefix2, aMaterial, 1L) != null
+ && GT_OreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(prefix2, aMaterial, 1L), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 2L * multiplier))
+ .duration(((int) (baseDuration * 0.5f)) * TICKS)
+ .eut(aEUt)
+ .addTo(wiremillRecipes);
+ }
+ }
+
+ public static boolean hasVanillaRecipes(Materials materials) {
+ return Arrays.stream(VANILLA_MATS)
+ .anyMatch(mat -> mat == materials);
+ }
+
+ private static int getRecipeWidth(ShapedOreRecipe r) {
+ try {
+ return (int) SHAPED_ORE_RECIPE_WIDTH.get(r);
+ } catch (ReflectiveOperationException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static int getRecipeHeight(ShapedOreRecipe r) {
+ try {
+ return (int) SHAPED_ORE_RECIPE_HEIGHT.get(r);
+ } catch (ReflectiveOperationException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static int getRecipeHeight(ShapedRecipes r) {
+ return r.recipeHeight;
+ }
+
+ private static int getRecipeWidth(ShapedRecipes r) {
+ return r.recipeWidth;
+ }
+
+ private static class RecipeShape {
+
+ private final ItemStack[] shape;
+ private int amount1;
+ private int amount2;
+
+ public RecipeShape(ItemStack... shape) {
+ this.shape = shape;
+
+ for (ItemStack stack : shape) {
+ if (stack == sMt1) this.amount1++;
+ if (stack == sMt2) this.amount2++;
+ }
+ }
+
+ public List<List<Integer>> getEmptySlotsAllVariants() {
+ // "shake" the grid in 8 direction and see if the recipe shape is still valid
+ // also include the "no movement" case
+ ImmutableList.Builder<List<Integer>> b = ImmutableList.builder();
+ for (int i = -1; i < 2; i++) {
+ if (i != 0 && !isColClear(i + 1)) continue;
+ for (int j = -1; j < 2; j++) {
+ if (j != 0 && !isRowClear(j + 1)) continue;
+ b.add(getEmptySlots(i, j));
+ }
+ }
+ return b.build();
+ }
+
+ private boolean isRowClear(int row) {
+ for (int i = 0; i < 3; i++) {
+ if (shape[i + row * 3] != null) return false;
+ }
+ return true;
+ }
+
+ private boolean isColClear(int col) {
+ for (int i = 0; i < 3; i++) {
+ if (shape[col + i * 3] != null) return false;
+ }
+ return true;
+ }
+
+ private List<Integer> getEmptySlots(int offsetX, int offsetY) {
+ ImmutableList.Builder<Integer> b = ImmutableList.builder();
+ for (int i = 0; i < shape.length; i++) {
+ int mappedIndex = i - offsetX - offsetY * 3;
+ // empty slot if it either
+ // 1) map to a slot outside the original shape
+ // 2) map to an empty slot in original shape
+ if (mappedIndex < 0 || mappedIndex > 8 || shape[mappedIndex] == null) b.add(i);
+ }
+ return b.build();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_RenderingWorld.java b/src/main/java/gregtech/api/util/GT_RenderingWorld.java
new file mode 100644
index 0000000000..7220b921a5
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_RenderingWorld.java
@@ -0,0 +1,195 @@
+package gregtech.api.util;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.ChunkPosition;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.event.world.ChunkEvent;
+import net.minecraftforge.event.world.WorldEvent;
+
+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.TickEvent;
+
+/**
+ * Provide a fake IBlockAccess to support CTM. Facade are supposed to set these when they are placed/received by client.
+ */
+public class GT_RenderingWorld implements IBlockAccess {
+
+ private static final GT_RenderingWorld INSTANCE = new GT_RenderingWorld();
+ /*
+ * I do not think this map would ever grow too huge, so I won't go too overcomplicated on this one
+ */
+ private final Map<ChunkPosition, BlockInfo> infos = new HashMap<>();
+ private final Map<ChunkCoordIntPair, Set<ChunkPosition>> index = new HashMap<>();
+ private IBlockAccess mWorld = Minecraft.getMinecraft().theWorld;
+
+ private GT_RenderingWorld() {
+ new FMLEventHandler();
+ new ForgeEventHandler();
+ }
+
+ public static GT_RenderingWorld getInstance() {
+ return INSTANCE;
+ }
+
+ public static GT_RenderingWorld getInstance(IBlockAccess aWorld) {
+ if (aWorld == INSTANCE) return INSTANCE;
+ if (aWorld == null) INSTANCE.mWorld = Minecraft.getMinecraft().theWorld;
+ else INSTANCE.mWorld = aWorld;
+ return INSTANCE;
+ }
+
+ private void setWorld(IBlockAccess aWorld) {
+ if (aWorld == null) mWorld = Minecraft.getMinecraft().theWorld;
+ else mWorld = aWorld;
+ }
+
+ public void register(int x, int y, int z, Block block, int meta) {
+ ChunkPosition key = new ChunkPosition(x, y, z);
+ infos.put(key, new BlockInfo(block, meta));
+ index.computeIfAbsent(new ChunkCoordIntPair(x >> 4, z >> 4), p -> new HashSet<>())
+ .add(key);
+ }
+
+ public void unregister(int x, int y, int z, Block block, int meta) {
+ ChunkPosition key = new ChunkPosition(x, y, z);
+ if (infos.remove(key, new BlockInfo(block, meta))) {
+ ChunkCoordIntPair chunkKey = new ChunkCoordIntPair(x >> 4, z >> 4);
+ Set<ChunkPosition> set = index.get(chunkKey);
+ set.remove(key);
+ if (set.isEmpty()) index.remove(chunkKey);
+ }
+ }
+
+ @Override
+ public Block getBlock(int p_147439_1_, int p_147439_2_, int p_147439_3_) {
+ BlockInfo blockInfo = infos.get(new ChunkPosition(p_147439_1_, p_147439_2_, p_147439_3_));
+ return blockInfo != null ? blockInfo.block : mWorld.getBlock(p_147439_1_, p_147439_2_, p_147439_3_);
+ }
+
+ @Override
+ public TileEntity getTileEntity(int p_147438_1_, int p_147438_2_, int p_147438_3_) {
+ return mWorld.getTileEntity(p_147438_1_, p_147438_2_, p_147438_3_);
+ }
+
+ @Override
+ public int getLightBrightnessForSkyBlocks(int p_72802_1_, int p_72802_2_, int p_72802_3_, int p_72802_4_) {
+ return mWorld.getLightBrightnessForSkyBlocks(p_72802_1_, p_72802_2_, p_72802_3_, p_72802_4_);
+ }
+
+ @Override
+ public int getBlockMetadata(int p_72805_1_, int p_72805_2_, int p_72805_3_) {
+ BlockInfo blockInfo = infos.get(new ChunkPosition(p_72805_1_, p_72805_2_, p_72805_3_));
+ return blockInfo != null ? blockInfo.meta : mWorld.getBlockMetadata(p_72805_1_, p_72805_2_, p_72805_3_);
+ }
+
+ @Override
+ public int isBlockProvidingPowerTo(int p_72879_1_, int p_72879_2_, int p_72879_3_, int p_72879_4_) {
+ return mWorld.isBlockProvidingPowerTo(p_72879_1_, p_72879_2_, p_72879_3_, p_72879_4_);
+ }
+
+ @Override
+ public boolean isAirBlock(int p_147437_1_, int p_147437_2_, int p_147437_3_) {
+ return getBlock(p_147437_1_, p_147437_2_, p_147437_3_).isAir(mWorld, p_147437_1_, p_147437_2_, p_147437_3_);
+ }
+
+ @Override
+ public BiomeGenBase getBiomeGenForCoords(int p_72807_1_, int p_72807_2_) {
+ return mWorld.getBiomeGenForCoords(p_72807_1_, p_72807_2_);
+ }
+
+ @Override
+ public int getHeight() {
+ return mWorld.getHeight();
+ }
+
+ @Override
+ public boolean extendedLevelsInChunkCache() {
+ return mWorld.extendedLevelsInChunkCache();
+ }
+
+ @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);
+ }
+
+ public class FMLEventHandler {
+
+ public FMLEventHandler() {
+ FMLCommonHandler.instance()
+ .bus()
+ .register(this);
+ }
+
+ @SubscribeEvent(priority = EventPriority.HIGHEST)
+ public void onRenderTickStart(TickEvent.RenderTickEvent e) {
+ if (e.phase == TickEvent.Phase.START) mWorld = Minecraft.getMinecraft().theWorld;
+ }
+ }
+
+ public class ForgeEventHandler {
+
+ private ForgeEventHandler() {
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @SubscribeEvent
+ public void onChunkUnloaded(ChunkEvent.Unload e) {
+ if (!e.world.isRemote) return;
+ Set<ChunkPosition> set = index.remove(
+ e.getChunk()
+ .getChunkCoordIntPair());
+ if (set != null) infos.keySet()
+ .removeAll(set);
+ }
+
+ @SubscribeEvent
+ public void onWorldUnloaded(WorldEvent.Unload e) {
+ if (!e.world.isRemote) return;
+ infos.clear();
+ index.clear();
+ }
+ }
+
+ private static class BlockInfo {
+
+ private final Block block;
+ private final int meta;
+
+ public BlockInfo(Block block, int meta) {
+ this.block = block;
+ this.meta = meta;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ BlockInfo blockInfo = (BlockInfo) o;
+
+ if (meta != blockInfo.meta) return false;
+ return Objects.equals(block, blockInfo.block);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = block != null ? block.hashCode() : 0;
+ result = 31 * result + meta;
+ return result;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_Shaped_Recipe.java b/src/main/java/gregtech/api/util/GT_Shaped_Recipe.java
new file mode 100644
index 0000000000..95a1a0bb66
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_Shaped_Recipe.java
@@ -0,0 +1,100 @@
+package gregtech.api.util;
+
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.inventory.InventoryCrafting;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.oredict.ShapedOreRecipe;
+
+import gregtech.api.interfaces.internal.IGT_CraftingRecipe;
+
+public class GT_Shaped_Recipe extends ShapedOreRecipe implements IGT_CraftingRecipe {
+
+ public final boolean mRemovableByGT, mKeepingNBT;
+ private final Enchantment[] mEnchantmentsAdded;
+ private final int[] mEnchantmentLevelsAdded;
+
+ public GT_Shaped_Recipe(ItemStack aResult, boolean aDismantleAble, boolean aRemovableByGT, boolean aKeepingNBT,
+ Enchantment[] aEnchantmentsAdded, int[] aEnchantmentLevelsAdded, Object... aRecipe) {
+ super(aResult, aRecipe);
+ mEnchantmentsAdded = aEnchantmentsAdded;
+ mEnchantmentLevelsAdded = aEnchantmentLevelsAdded;
+ mRemovableByGT = aRemovableByGT;
+ mKeepingNBT = aKeepingNBT;
+ }
+
+ @Override
+ public boolean matches(InventoryCrafting aGrid, World aWorld) {
+ if (mKeepingNBT) {
+ ItemStack tStack = null;
+ for (int i = 0; i < aGrid.getSizeInventory(); i++) {
+ if (aGrid.getStackInSlot(i) != null) {
+ if (tStack != null) {
+ if ((tStack.hasTagCompound() != aGrid.getStackInSlot(i)
+ .hasTagCompound()) || (tStack.hasTagCompound()
+ && !tStack.getTagCompound()
+ .equals(
+ aGrid.getStackInSlot(i)
+ .getTagCompound())))
+ return false;
+ }
+ tStack = aGrid.getStackInSlot(i);
+ }
+ }
+ }
+ return super.matches(aGrid, aWorld);
+ }
+
+ @Override
+ public ItemStack getCraftingResult(InventoryCrafting aGrid) {
+ ItemStack rStack = super.getCraftingResult(aGrid);
+ if (rStack != null) {
+ // Update the Stack
+ GT_Utility.updateItemStack(rStack);
+
+ // Keeping NBT
+ if (mKeepingNBT) for (int i = 0; i < aGrid.getSizeInventory(); i++) {
+ if (aGrid.getStackInSlot(i) != null && aGrid.getStackInSlot(i)
+ .hasTagCompound()) {
+ rStack.setTagCompound(
+ (NBTTagCompound) aGrid.getStackInSlot(i)
+ .getTagCompound()
+ .copy());
+ break;
+ }
+ }
+
+ // Charge Values
+ if (GT_ModHandler.isElectricItem(rStack)) {
+ GT_ModHandler.dischargeElectricItem(rStack, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false, true);
+ int tCharge = 0;
+ for (int i = 0; i < aGrid.getSizeInventory(); i++) tCharge += GT_ModHandler.dischargeElectricItem(
+ aGrid.getStackInSlot(i),
+ Integer.MAX_VALUE,
+ Integer.MAX_VALUE,
+ true,
+ true,
+ true);
+ if (tCharge > 0) GT_ModHandler.chargeElectricItem(rStack, tCharge, Integer.MAX_VALUE, true, false);
+ }
+
+ // Add Enchantments
+ for (int i = 0; i < mEnchantmentsAdded.length; i++) GT_Utility.ItemNBT.addEnchantment(
+ rStack,
+ mEnchantmentsAdded[i],
+ EnchantmentHelper.getEnchantmentLevel(mEnchantmentsAdded[i].effectId, rStack)
+ + mEnchantmentLevelsAdded[i]);
+
+ // Update the Stack again
+ GT_Utility.updateItemStack(rStack);
+ }
+ return rStack;
+ }
+
+ @Override
+ public boolean isRemovable() {
+ return mRemovableByGT;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_Shapeless_Recipe.java b/src/main/java/gregtech/api/util/GT_Shapeless_Recipe.java
new file mode 100644
index 0000000000..582dd7cc10
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_Shapeless_Recipe.java
@@ -0,0 +1,100 @@
+package gregtech.api.util;
+
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.inventory.InventoryCrafting;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.oredict.ShapelessOreRecipe;
+
+import gregtech.api.interfaces.internal.IGT_CraftingRecipe;
+
+public class GT_Shapeless_Recipe extends ShapelessOreRecipe implements IGT_CraftingRecipe {
+
+ public final boolean mRemovableByGT, mKeepingNBT;
+ private final Enchantment[] mEnchantmentsAdded;
+ private final int[] mEnchantmentLevelsAdded;
+
+ public GT_Shapeless_Recipe(ItemStack aResult, boolean aDismantleAble, boolean aRemovableByGT, boolean aKeepingNBT,
+ Enchantment[] aEnchantmentsAdded, int[] aEnchantmentLevelsAdded, Object... aRecipe) {
+ super(aResult, aRecipe);
+ mEnchantmentsAdded = aEnchantmentsAdded;
+ mEnchantmentLevelsAdded = aEnchantmentLevelsAdded;
+ mRemovableByGT = aRemovableByGT;
+ mKeepingNBT = aKeepingNBT;
+ }
+
+ @Override
+ public boolean matches(InventoryCrafting aGrid, World aWorld) {
+ if (mKeepingNBT) {
+ ItemStack tStack = null;
+ for (int i = 0; i < aGrid.getSizeInventory(); i++) {
+ if (aGrid.getStackInSlot(i) != null) {
+ if (tStack != null) {
+ if ((tStack.hasTagCompound() != aGrid.getStackInSlot(i)
+ .hasTagCompound()) || (tStack.hasTagCompound()
+ && !tStack.getTagCompound()
+ .equals(
+ aGrid.getStackInSlot(i)
+ .getTagCompound())))
+ return false;
+ }
+ tStack = aGrid.getStackInSlot(i);
+ }
+ }
+ }
+ return super.matches(aGrid, aWorld);
+ }
+
+ @Override
+ public ItemStack getCraftingResult(InventoryCrafting aGrid) {
+ ItemStack rStack = super.getCraftingResult(aGrid);
+ if (rStack != null) {
+ // Update the Stack
+ GT_Utility.updateItemStack(rStack);
+
+ // Keeping NBT
+ if (mKeepingNBT) for (int i = 0; i < aGrid.getSizeInventory(); i++) {
+ if (aGrid.getStackInSlot(i) != null && aGrid.getStackInSlot(i)
+ .hasTagCompound()) {
+ rStack.setTagCompound(
+ (NBTTagCompound) aGrid.getStackInSlot(i)
+ .getTagCompound()
+ .copy());
+ break;
+ }
+ }
+
+ // Charge Values
+ if (GT_ModHandler.isElectricItem(rStack)) {
+ GT_ModHandler.dischargeElectricItem(rStack, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false, true);
+ int tCharge = 0;
+ for (int i = 0; i < aGrid.getSizeInventory(); i++) tCharge += GT_ModHandler.dischargeElectricItem(
+ aGrid.getStackInSlot(i),
+ Integer.MAX_VALUE,
+ Integer.MAX_VALUE,
+ true,
+ true,
+ true);
+ if (tCharge > 0) GT_ModHandler.chargeElectricItem(rStack, tCharge, Integer.MAX_VALUE, true, false);
+ }
+
+ // Add Enchantments
+ for (int i = 0; i < mEnchantmentsAdded.length; i++) GT_Utility.ItemNBT.addEnchantment(
+ rStack,
+ mEnchantmentsAdded[i],
+ EnchantmentHelper.getEnchantmentLevel(mEnchantmentsAdded[i].effectId, rStack)
+ + mEnchantmentLevelsAdded[i]);
+
+ // Update the Stack again
+ GT_Utility.updateItemStack(rStack);
+ }
+ return rStack;
+ }
+
+ @Override
+ public boolean isRemovable() {
+ return mRemovableByGT;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_SpawnEventHandler.java b/src/main/java/gregtech/api/util/GT_SpawnEventHandler.java
new file mode 100644
index 0000000000..ebdba1144b
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_SpawnEventHandler.java
@@ -0,0 +1,81 @@
+package gregtech.api.util;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.monster.EntitySlime;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.living.LivingSpawnEvent.CheckSpawn;
+
+import cpw.mods.fml.common.eventhandler.Event;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_MonsterRepellent;
+
+public class GT_SpawnEventHandler {
+
+ public static volatile List<int[]> mobReps = new CopyOnWriteArrayList<>();
+ // Future Optimiztation ideas, if this isn't sufficient
+ // 1: Keep a weakref list of mob repellents so we already have the tile
+ // 2: Have the tick method update a HashMap of (int[], range) so we don't have to load the tile at all
+
+ public GT_SpawnEventHandler() {
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ // Range of a powered repellent
+ public static int getPoweredRepellentRange(int aTier) {
+ return 16 + (48 * aTier);
+ }
+
+ // Range of an unpowered repellent
+ public static int getUnpoweredRepellentRange(int aTier) {
+ return 4 + (12 * aTier);
+ }
+
+ @SubscribeEvent
+ public void denyMobSpawn(CheckSpawn event) {
+ if (event.getResult() == Event.Result.DENY) return;
+
+ if (event.entityLiving instanceof EntitySlime slime && !slime.hasCustomNameTag()
+ && event.getResult() == Event.Result.ALLOW) {
+ event.setResult(Event.Result.DEFAULT);
+ }
+
+ if (event.getResult() == Event.Result.ALLOW) {
+ return;
+ }
+
+ if (event.entityLiving.isCreatureType(EnumCreatureType.monster, false)) {
+ final double maxRangeCheck = Math.pow(getPoweredRepellentRange(GT_Values.V.length - 1), 2);
+ for (int[] rep : mobReps) {
+ if (rep[3] == event.entity.worldObj.provider.dimensionId) {
+ // If the chunk isn't loaded, we ignore this Repellent
+ if (!event.entity.worldObj.blockExists(rep[0], rep[1], rep[2])) continue;
+ final double dx = rep[0] + 0.5F - event.entity.posX;
+ final double dy = rep[1] + 0.5F - event.entity.posY;
+ final double dz = rep[2] + 0.5F - event.entity.posZ;
+
+ final double check = (dx * dx + dz * dz + dy * dy);
+ // Fail early if outside of max range
+ if (check > maxRangeCheck) continue;
+
+ final TileEntity tTile = event.entity.worldObj.getTileEntity(rep[0], rep[1], rep[2]);
+ if (tTile instanceof BaseMetaTileEntity metaTile
+ && metaTile.getMetaTileEntity() instanceof GT_MetaTileEntity_MonsterRepellent repellent
+ && check <= Math.pow(repellent.mRange, 2)) {
+ if (event.entityLiving instanceof EntitySlime slime) {
+ slime.setCustomNameTag("DoNotSpawnSlimes");
+ }
+ event.setResult(Event.Result.DENY);
+ // We're already DENYing it. No reason to keep checking
+ return;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_StreamUtil.java b/src/main/java/gregtech/api/util/GT_StreamUtil.java
new file mode 100644
index 0000000000..c29e611c4e
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_StreamUtil.java
@@ -0,0 +1,44 @@
+package gregtech.api.util;
+
+import java.util.Arrays;
+import java.util.function.Supplier;
+import java.util.stream.Stream;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public final class GT_StreamUtil {
+
+ /**
+ * Backport of {@link Stream#ofNullable}.
+ */
+ public static <T> Stream<T> ofNullable(@Nullable T value) {
+ return value == null ? Stream.empty() : Stream.of(value);
+ }
+
+ /**
+ * Returns a sequential ordered {@code Stream} whose elements are the specified values,
+ * if {@code condition} is true, otherwise returns an empty {@code Stream}.
+ *
+ * @param <T> the type of stream elements
+ * @param values the elements of the new stream
+ * @return the new stream
+ */
+ public static <T> Stream<T> ofConditional(boolean condition, T[] values) {
+ return condition ? Arrays.stream(values) : Stream.empty();
+ }
+
+ /**
+ * Returns a sequential {@code Stream} containing a single element, which will be lazily evaluated from supplier.
+ *
+ * @param <T> the type of stream elements
+ * @param supplier the supplier for single stream element
+ * @return the new stream
+ */
+ public static <T> Stream<T> ofSupplier(Supplier<T> supplier) {
+ return Stream.generate(supplier)
+ .limit(1);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_StructureUtility.java b/src/main/java/gregtech/api/util/GT_StructureUtility.java
new file mode 100644
index 0000000000..d3c4c10a0d
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_StructureUtility.java
@@ -0,0 +1,512 @@
+package gregtech.api.util;
+
+import static com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult.ACCEPT;
+import static com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult.ACCEPT_STOP;
+import static com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult.REJECT;
+import static com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult.SKIP;
+import static com.gtnewhorizon.structurelib.util.ItemStackPredicate.NBTMode.EXACT;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.function.BiPredicate;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.function.ToIntFunction;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment;
+import com.gtnewhorizon.structurelib.structure.IItemSource;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.IStructureElementNoPlacement;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+import com.gtnewhorizon.structurelib.util.ItemStackPredicate;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IHeatingCoil;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Frame;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.common.blocks.GT_Block_Casings5;
+import gregtech.common.blocks.GT_Item_Machines;
+
+public class GT_StructureUtility {
+
+ // private static final Map<Class<?>, String> customNames = new HashMap<>();
+ private GT_StructureUtility() {
+ throw new AssertionError("Not instantiable");
+ }
+
+ public static boolean hasMTE(IGregTechTileEntity aTile, Class<? extends IMetaTileEntity> clazz) {
+ return aTile != null && clazz.isInstance(aTile.getMetaTileEntity());
+ }
+
+ public static <T> IStructureElementNoPlacement<T> ofHatchAdder(IGT_HatchAdder<T> aHatchAdder, int aTextureIndex,
+ int aDots) {
+ return ofHatchAdder(aHatchAdder, aTextureIndex, StructureLibAPI.getBlockHint(), aDots - 1);
+ }
+
+ public static <T> IStructureElement<T> ofFrame(Materials aFrameMaterial) {
+ if (aFrameMaterial == null) throw new IllegalArgumentException();
+ return new IStructureElement<>() {
+
+ private IIcon[] mIcons;
+
+ @Override
+ public boolean check(T t, World world, int x, int y, int z) {
+ TileEntity tBase = world.getTileEntity(x, y, z);
+ if (tBase instanceof BaseMetaPipeEntity tPipeBase) {
+ if (tPipeBase.isInvalidTileEntity()) return false;
+ if (tPipeBase.getMetaTileEntity() instanceof GT_MetaPipeEntity_Frame)
+ return aFrameMaterial == ((GT_MetaPipeEntity_Frame) tPipeBase.getMetaTileEntity()).mMaterial;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
+ if (mIcons == null) {
+ mIcons = new IIcon[6];
+ Arrays.fill(mIcons, aFrameMaterial.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex].getIcon());
+ }
+ StructureLibAPI.hintParticleTinted(world, x, y, z, mIcons, aFrameMaterial.mRGBa);
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
+ ItemStack tFrameStack = getFrameStack();
+ if (!GT_Utility.isStackValid(tFrameStack)
+ || !(tFrameStack.getItem() instanceof ItemBlock tFrameStackItem)) return false;
+ return tFrameStackItem
+ .placeBlockAt(tFrameStack, null, world, x, y, z, 6, 0, 0, 0, Items.feather.getDamage(tFrameStack));
+ }
+
+ private ItemStack getFrameStack() {
+ return GT_OreDictUnificator.get(OrePrefixes.frameGt, aFrameMaterial, 1);
+ }
+
+ @Override
+ public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ ItemStack tFrameStack = getFrameStack();
+ if (!GT_Utility.isStackValid(tFrameStack) || !(tFrameStack.getItem() instanceof ItemBlock))
+ return BlocksToPlace.errored;
+ return BlocksToPlace.create(tFrameStack);
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ IItemSource s, EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
+ return survivalPlaceBlock(
+ t,
+ world,
+ x,
+ y,
+ z,
+ trigger,
+ AutoPlaceEnvironment.fromLegacy(s, actor, chatter));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ if (check(t, world, x, y, z)) return SKIP;
+ ItemStack tFrameStack = getFrameStack();
+ if (!GT_Utility.isStackValid(tFrameStack) || !(tFrameStack.getItem() instanceof ItemBlock))
+ return REJECT; // honestly, this is more like a programming error or pack issue
+ return StructureUtility.survivalPlaceBlock(
+ tFrameStack,
+ ItemStackPredicate.NBTMode.IGNORE_KNOWN_INSIGNIFICANT_TAGS,
+ null,
+ false,
+ world,
+ x,
+ y,
+ z,
+ env.getSource(),
+ env.getActor(),
+ env.getChatter());
+ }
+ };
+ }
+
+ public static <T> GT_HatchElementBuilder<T> buildHatchAdder() {
+ return GT_HatchElementBuilder.builder();
+ }
+
+ /**
+ * Completely equivalent to {@link #buildHatchAdder()}, except it plays nicer with type inference when statically
+ * imported
+ */
+ public static <T> GT_HatchElementBuilder<T> buildHatchAdder(Class<T> typeToken) {
+ return GT_HatchElementBuilder.builder();
+ }
+
+ public static <T> IStructureElementNoPlacement<T> ofHatchAdder(IGT_HatchAdder<T> aHatchAdder, int aTextureIndex,
+ Block aHintBlock, int aHintMeta) {
+ if (aHatchAdder == null || aHintBlock == null) {
+ throw new IllegalArgumentException();
+ }
+ return new IStructureElementNoPlacement<>() {
+
+ @Override
+ public boolean check(T t, World world, int x, int y, int z) {
+ TileEntity tileEntity = world.getTileEntity(x, y, z);
+ return tileEntity instanceof IGregTechTileEntity
+ && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex);
+ }
+
+ @Override
+ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
+ StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, aHintMeta);
+ return true;
+ }
+ };
+ }
+
+ public static <T> IStructureElement<T> ofHatchAdder(IGT_HatchAdder<T> aHatchAdder, int aTextureIndex,
+ Block aHintBlock, int aHintMeta, BiPredicate<T, IGregTechTileEntity> shouldSkip,
+ Function<T, Class<? extends IMetaTileEntity>> aMetaId, final IStructureElement.PlaceResult acceptType) {
+ if (aHatchAdder == null) {
+ throw new IllegalArgumentException();
+ }
+ return new IStructureElement<>() {
+
+ @Override
+ public boolean check(T t, World world, int x, int y, int z) {
+ TileEntity tileEntity = world.getTileEntity(x, y, z);
+ return tileEntity instanceof IGregTechTileEntity
+ && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex);
+ }
+
+ @Override
+ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
+ StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, aHintMeta);
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(T t, World world, int i, int i1, int i2, ItemStack itemStack) {
+ // TODO
+ return false;
+ }
+
+ @Override
+ public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ Class<? extends IMetaTileEntity> clazz = aMetaId.apply(t);
+ if (clazz == null) return BlocksToPlace.createEmpty();
+ return BlocksToPlace.create(is -> clazz.isInstance(GT_Item_Machines.getMetaTileEntity(is)));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ IItemSource s, EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
+ return survivalPlaceBlock(
+ t,
+ world,
+ x,
+ y,
+ z,
+ trigger,
+ AutoPlaceEnvironment.fromLegacy(s, actor, chatter));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ if (shouldSkip != null) {
+ TileEntity tileEntity = world.getTileEntity(x, y, z);
+ if (tileEntity instanceof IGregTechTileEntity
+ && shouldSkip.test(t, (IGregTechTileEntity) tileEntity)) return SKIP;
+ }
+ if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, env.getActor())) return REJECT;
+ Class<? extends IMetaTileEntity> clazz = aMetaId.apply(t);
+ if (clazz == null) return REJECT;
+ ItemStack taken = env.getSource()
+ .takeOne(is -> clazz.isInstance(GT_Item_Machines.getMetaTileEntity(is)), true);
+ if (GT_Utility.isStackInvalid(taken)) {
+ env.getChatter()
+ .accept(
+ new ChatComponentTranslation(
+ "GT5U.autoplace.error.no_mte.class_name",
+ clazz.getSimpleName()));
+ return REJECT;
+ }
+ if (StructureUtility
+ .survivalPlaceBlock(taken, EXACT, null, true, world, x, y, z, env.getSource(), env.getActor())
+ == ACCEPT) return acceptType;
+ return REJECT;
+ }
+ };
+ }
+
+ public static <T> IStructureElement<T> ofHatchAdder(IGT_HatchAdder<T> aHatchAdder, int aTextureIndex,
+ Block aHintBlock, int aHintMeta, BiPredicate<T, IGregTechTileEntity> shouldSkip, ToIntFunction<T> aMetaId) {
+ if (aHatchAdder == null) {
+ throw new IllegalArgumentException();
+ }
+ return new IStructureElement<>() {
+
+ @Override
+ public boolean check(T t, World world, int x, int y, int z) {
+ TileEntity tileEntity = world.getTileEntity(x, y, z);
+ return tileEntity instanceof IGregTechTileEntity
+ && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex);
+ }
+
+ @Override
+ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
+ StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, aHintMeta);
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(T t, World world, int i, int i1, int i2, ItemStack itemStack) {
+ // TODO
+ return false;
+ }
+
+ @Override
+ public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ GT_Item_Machines item = (GT_Item_Machines) Item.getItemFromBlock(GregTech_API.sBlockMachines);
+ int meta = aMetaId.applyAsInt(t);
+ if (meta < 0) return BlocksToPlace.createEmpty();
+ return BlocksToPlace.create(
+ ItemStackPredicate.from(item)
+ .setMeta(meta));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ IItemSource s, EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
+ return survivalPlaceBlock(
+ t,
+ world,
+ x,
+ y,
+ z,
+ trigger,
+ AutoPlaceEnvironment.fromLegacy(s, actor, chatter));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ if (shouldSkip != null) {
+ TileEntity tileEntity = world.getTileEntity(x, y, z);
+ if (tileEntity instanceof IGregTechTileEntity
+ && shouldSkip.test(t, (IGregTechTileEntity) tileEntity)) return SKIP;
+ }
+ if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, env.getActor())) return REJECT;
+ GT_Item_Machines item = (GT_Item_Machines) Item.getItemFromBlock(GregTech_API.sBlockMachines);
+ int meta = aMetaId.applyAsInt(t);
+ if (meta < 0) return REJECT;
+ ItemStack taken = env.getSource()
+ .takeOne(
+ ItemStackPredicate.from(item)
+ .setMeta(meta),
+ true);
+ if (GT_Utility.isStackInvalid(taken)) {
+ env.getChatter()
+ .accept(new ChatComponentTranslation("GT5U.autoplace.error.no_mte.id", meta));
+ return REJECT;
+ }
+ return StructureUtility
+ .survivalPlaceBlock(taken, EXACT, null, true, world, x, y, z, env.getSource(), env.getActor())
+ == ACCEPT ? ACCEPT_STOP : REJECT;
+ }
+ };
+ }
+
+ public static <T> IStructureElement<T> ofHatchAdderOptional(IGT_HatchAdder<T> aHatchAdder, int textureIndex,
+ int dots, Block placeCasing, int placeCasingMeta) {
+ return ofHatchAdderOptional(
+ aHatchAdder,
+ textureIndex,
+ StructureLibAPI.getBlockHint(),
+ dots - 1,
+ placeCasing,
+ placeCasingMeta);
+ }
+
+ public static <T> IStructureElement<T> ofHatchAdderOptional(IGT_HatchAdder<T> aHatchAdder, int aTextureIndex,
+ Block aHintBlock, int hintMeta, Block placeCasing, int placeCasingMeta) {
+ if (aHatchAdder == null || aHintBlock == null) {
+ throw new IllegalArgumentException();
+ }
+ return new IStructureElement<>() {
+
+ @Override
+ public boolean check(T t, World world, int x, int y, int z) {
+ TileEntity tileEntity = world.getTileEntity(x, y, z);
+ Block worldBlock = world.getBlock(x, y, z);
+ return (tileEntity instanceof IGregTechTileEntity
+ && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex))
+ || (worldBlock == placeCasing && worldBlock.getDamageValue(world, x, y, z) == placeCasingMeta);
+ }
+
+ @Override
+ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
+ StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, hintMeta);
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
+ world.setBlock(x, y, z, placeCasing, placeCasingMeta, 2);
+ return true;
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ IItemSource s, EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
+ if (check(t, world, x, y, z)) return SKIP;
+ return StructureUtility
+ .survivalPlaceBlock(placeCasing, placeCasingMeta, world, x, y, z, s, actor, chatter);
+ }
+ };
+ }
+
+ /**
+ * Assume all coils accepted.
+ *
+ * @see #ofCoil(BiPredicate, Function)
+ */
+ public static <T> IStructureElement<T> ofCoil(BiConsumer<T, HeatingCoilLevel> aHeatingCoilSetter,
+ Function<T, HeatingCoilLevel> aHeatingCoilGetter) {
+ return ofCoil((t, l) -> {
+ aHeatingCoilSetter.accept(t, l);
+ return true;
+ }, aHeatingCoilGetter);
+ }
+
+ /**
+ * Heating coil structure element.
+ *
+ * @param aHeatingCoilSetter Notify the controller of this new coil. Got called exactly once per coil. Might be
+ * called less times if structure test fails. If the setter returns false then it assumes
+ * the coil is rejected.
+ * @param aHeatingCoilGetter Get the current heating level. Null means no coil recorded yet.
+ */
+ public static <T> IStructureElement<T> ofCoil(BiPredicate<T, HeatingCoilLevel> aHeatingCoilSetter,
+ Function<T, HeatingCoilLevel> aHeatingCoilGetter) {
+ if (aHeatingCoilSetter == null || aHeatingCoilGetter == null) {
+ throw new IllegalArgumentException();
+ }
+ return new IStructureElement<>() {
+
+ @Override
+ public boolean check(T t, World world, int x, int y, int z) {
+ Block block = world.getBlock(x, y, z);
+ if (!(block instanceof IHeatingCoil)) return false;
+ HeatingCoilLevel existingLevel = aHeatingCoilGetter.apply(t),
+ newLevel = ((IHeatingCoil) block).getCoilHeat(world.getBlockMetadata(x, y, z));
+ if (existingLevel == null || existingLevel == HeatingCoilLevel.None) {
+ return aHeatingCoilSetter.test(t, newLevel);
+ } else {
+ return newLevel == existingLevel;
+ }
+ }
+
+ @Override
+ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
+ StructureLibAPI.hintParticle(world, x, y, z, GregTech_API.sBlockCasings5, getMetaFromHint(trigger));
+ return true;
+ }
+
+ private int getMetaFromHint(ItemStack trigger) {
+ return GT_Block_Casings5.getMetaFromCoilHeat(getHeatFromHint(trigger));
+ }
+
+ private HeatingCoilLevel getHeatFromHint(ItemStack trigger) {
+ return HeatingCoilLevel
+ .getFromTier((byte) Math.min(HeatingCoilLevel.getMaxTier(), Math.max(0, trigger.stackSize - 1)));
+ }
+
+ @Override
+ public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
+ return world.setBlock(x, y, z, GregTech_API.sBlockCasings5, getMetaFromHint(trigger), 3);
+ }
+
+ @Override
+ public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ return BlocksToPlace.create(GregTech_API.sBlockCasings5, getMetaFromHint(trigger));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ IItemSource s, EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
+ return survivalPlaceBlock(
+ t,
+ world,
+ x,
+ y,
+ z,
+ trigger,
+ AutoPlaceEnvironment.fromLegacy(s, actor, chatter));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
+ AutoPlaceEnvironment env) {
+ Block block = world.getBlock(x, y, z);
+ boolean isCoil = block instanceof IHeatingCoil
+ && ((IHeatingCoil) block).getCoilHeat(world.getBlockMetadata(x, y, z)) == getHeatFromHint(trigger);
+ if (isCoil) return SKIP;
+ return StructureUtility.survivalPlaceBlock(
+ GregTech_API.sBlockCasings5,
+ getMetaFromHint(trigger),
+ world,
+ x,
+ y,
+ z,
+ env.getSource(),
+ env.getActor(),
+ env.getChatter());
+ }
+ };
+ }
+
+ @Nonnull
+ public static Predicate<ItemStack> filterByMTEClass(List<? extends Class<? extends IMetaTileEntity>> list) {
+ return is -> {
+ IMetaTileEntity tile = GT_Item_Machines.getMetaTileEntity(is);
+ return tile != null && list.stream()
+ .anyMatch(c -> c.isInstance(tile));
+ };
+ }
+
+ @Nonnull
+ public static Predicate<ItemStack> filterByMTETier(int aMinTier, int aMaxTier) {
+ return is -> {
+ IMetaTileEntity tile = GT_Item_Machines.getMetaTileEntity(is);
+ return tile instanceof GT_MetaTileEntity_TieredMachineBlock
+ && ((GT_MetaTileEntity_TieredMachineBlock) tile).mTier <= aMaxTier
+ && ((GT_MetaTileEntity_TieredMachineBlock) tile).mTier >= aMinTier;
+ };
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_StructureUtilityMuTE.java b/src/main/java/gregtech/api/util/GT_StructureUtilityMuTE.java
new file mode 100644
index 0000000000..8e8d027463
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_StructureUtilityMuTE.java
@@ -0,0 +1,271 @@
+package gregtech.api.util;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.*;
+import static gregtech.api.multitileentity.enums.GT_MultiTileUpgradeCasing.*;
+import static gregtech.loaders.preload.GT_Loader_MultiTileEntities.*;
+
+import java.util.Arrays;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.multitileentity.MultiTileEntityContainer;
+import gregtech.api.multitileentity.MultiTileEntityRegistry;
+import gregtech.api.multitileentity.enums.GT_MultiTileUpgradeCasing;
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+import gregtech.api.multitileentity.multiblock.base.Controller;
+import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+
+public class GT_StructureUtilityMuTE {
+
+ public static final MuTEStructureCasing MOTOR_CASINGS = FunctionalCasings.Motor.getCasing();
+ public static final MuTEStructureCasing PUMP_CASINGS = FunctionalCasings.Pump.getCasing();
+ public static final MuTEStructureCasing CONVEYOR_CASINGS = FunctionalCasings.Conveyor.getCasing();
+ public static final MuTEStructureCasing PISTON_CASINGS = FunctionalCasings.Piston.getCasing();
+ public static final MuTEStructureCasing ROBOT_ARM_CASINGS = FunctionalCasings.RobotArm.getCasing();
+ public static final MuTEStructureCasing EMITTER_CASINGS = FunctionalCasings.Emitter.getCasing();
+ public static final MuTEStructureCasing SENSOR_CASINGS = FunctionalCasings.Sensor.getCasing();
+ public static final MuTEStructureCasing FIELD_GENERATOR_CASINGS = FunctionalCasings.FieldGenerator.getCasing();
+ public static final MuTEStructureCasing INVENTORY_CASINGS = UpgradeCasings.Inventory.getCasing();
+ public static final MuTEStructureCasing TANK_CASINGS = UpgradeCasings.Tank.getCasing();
+ public static final MuTEStructureCasing AMPERAGE_CASINGS = UpgradeCasings.Amperage.getCasing();
+ public static final MuTEStructureCasing LASER_CASINGS = UpgradeCasings.Laser.getCasing();
+ public static final MuTEStructureCasing WIRELESS_CASINGS = UpgradeCasings.Wireless.getCasing();
+ public static final MuTEStructureCasing CLEANROOM_CASINGS = UpgradeCasings.Cleanroom.getCasing();
+ public static final MuTEStructureCasing HEATER_CASINGS = UpgradeCasings.Heater.getCasing();
+ public static final MuTEStructureCasing INSULATOR_CASINGS = UpgradeCasings.Insulator.getCasing();
+
+ public enum FunctionalCasings {
+
+ Motor(COMPONENT_CASING_REGISTRY_NAME, LV_Motor.getId(), MV_Motor.getId(), HV_Motor.getId(), EV_Motor.getId(),
+ IV_Motor.getId(), LuV_Motor.getId(), ZPM_Motor.getId(), UV_Motor.getId(), UHV_Motor.getId(),
+ UEV_Motor.getId(), UIV_Motor.getId(), UMV_Motor.getId(), UXV_Motor.getId(), MAX_Motor.getId()),
+
+ Pump(COMPONENT_CASING_REGISTRY_NAME, LV_Pump.getId(), MV_Pump.getId(), HV_Pump.getId(), EV_Pump.getId(),
+ IV_Pump.getId(), LuV_Pump.getId(), ZPM_Pump.getId(), UV_Pump.getId(), UHV_Pump.getId(), UEV_Pump.getId(),
+ UIV_Pump.getId(), UMV_Pump.getId(), UXV_Pump.getId(), MAX_Pump.getId()),
+
+ Conveyor(COMPONENT_CASING_REGISTRY_NAME, LV_Conveyor.getId(), MV_Conveyor.getId(), HV_Conveyor.getId(),
+ EV_Conveyor.getId(), IV_Conveyor.getId(), LuV_Conveyor.getId(), ZPM_Conveyor.getId(), UV_Conveyor.getId(),
+ UHV_Conveyor.getId(), UEV_Conveyor.getId(), UIV_Conveyor.getId(), UMV_Conveyor.getId(),
+ UXV_Conveyor.getId(), MAX_Conveyor.getId()),
+
+ Piston(COMPONENT_CASING_REGISTRY_NAME, LV_Piston.getId(), MV_Piston.getId(), HV_Piston.getId(),
+ EV_Piston.getId(), IV_Piston.getId(), LuV_Piston.getId(), ZPM_Piston.getId(), UV_Piston.getId(),
+ UHV_Piston.getId(), UEV_Piston.getId(), UIV_Piston.getId(), UMV_Piston.getId(), UXV_Piston.getId(),
+ MAX_Piston.getId()),
+
+ RobotArm(COMPONENT_CASING_REGISTRY_NAME, LV_RobotArm.getId(), MV_RobotArm.getId(), HV_RobotArm.getId(),
+ EV_RobotArm.getId(), IV_RobotArm.getId(), LuV_RobotArm.getId(), ZPM_RobotArm.getId(), UV_RobotArm.getId(),
+ UHV_RobotArm.getId(), UEV_RobotArm.getId(), UIV_RobotArm.getId(), UMV_RobotArm.getId(),
+ UXV_RobotArm.getId(), MAX_RobotArm.getId()),
+
+ Emitter(COMPONENT_CASING_REGISTRY_NAME, LV_Emitter.getId(), MV_Emitter.getId(), HV_Emitter.getId(),
+ EV_Emitter.getId(), IV_Emitter.getId(), LuV_Emitter.getId(), ZPM_Emitter.getId(), UV_Emitter.getId(),
+ UHV_Emitter.getId(), UEV_Emitter.getId(), UIV_Emitter.getId(), UMV_Emitter.getId(), UXV_Emitter.getId(),
+ MAX_Emitter.getId()),
+
+ Sensor(COMPONENT_CASING_REGISTRY_NAME, LV_Sensor.getId(), MV_Sensor.getId(), HV_Sensor.getId(),
+ EV_Sensor.getId(), IV_Sensor.getId(), LuV_Sensor.getId(), ZPM_Sensor.getId(), UV_Sensor.getId(),
+ UHV_Sensor.getId(), UEV_Sensor.getId(), UIV_Sensor.getId(), UMV_Sensor.getId(), UXV_Sensor.getId(),
+ MAX_Sensor.getId()),
+
+ FieldGenerator(COMPONENT_CASING_REGISTRY_NAME, LV_FieldGenerator.getId(), MV_FieldGenerator.getId(),
+ HV_FieldGenerator.getId(), EV_FieldGenerator.getId(), IV_FieldGenerator.getId(), LuV_FieldGenerator.getId(),
+ ZPM_FieldGenerator.getId(), UV_FieldGenerator.getId(), UHV_FieldGenerator.getId(),
+ UEV_FieldGenerator.getId(), UIV_FieldGenerator.getId(), UMV_FieldGenerator.getId(),
+ UXV_FieldGenerator.getId(), MAX_FieldGenerator.getId());
+
+ private final MuTEStructureCasing casing;
+
+ FunctionalCasings(String registryName, Integer... validIds) {
+ casing = createMuTEStructureCasing(registryName, validIds);
+ }
+
+ public MuTEStructureCasing getCasing() {
+ return casing;
+ }
+ }
+
+ public enum UpgradeCasings {
+
+ Inventory(UPGRADE_CASING_REGISTRY_NAME, ULV_Inventory.getId(), LV_Inventory.getId(), MV_Inventory.getId(),
+ HV_Inventory.getId(), EV_Inventory.getId(), IV_Inventory.getId(), LuV_Inventory.getId(),
+ ZPM_Inventory.getId(), UV_Inventory.getId(), UHV_Inventory.getId(), UEV_Inventory.getId(),
+ UIV_Inventory.getId(), UMV_Inventory.getId(), UXV_Inventory.getId(), MAX_Inventory.getId()),
+
+ Tank(UPGRADE_CASING_REGISTRY_NAME, ULV_Tank.getId(), LV_Tank.getId(), MV_Tank.getId(), HV_Tank.getId(),
+ EV_Tank.getId(), IV_Tank.getId(), LuV_Tank.getId(), ZPM_Tank.getId(), UV_Tank.getId(), UHV_Tank.getId(),
+ UEV_Tank.getId(), UIV_Tank.getId(), UMV_Tank.getId(), UXV_Tank.getId(), MAX_Tank.getId()),
+
+ Amperage(UPGRADE_CASING_REGISTRY_NAME, Amp_4.getId(), Amp_16.getId(), Amp_64.getId(), Amp_256.getId(),
+ Amp_1_024.getId(), Amp_4_096.getId(), Amp_16_384.getId(), Amp_65_536.getId(), Amp_262_144.getId(),
+ Amp_1_048_576.getId()),
+
+ Laser(UPGRADE_CASING_REGISTRY_NAME, GT_MultiTileUpgradeCasing.Laser.getId()),
+
+ Wireless(UPGRADE_CASING_REGISTRY_NAME, GT_MultiTileUpgradeCasing.Wireless.getId()),
+
+ Cleanroom(UPGRADE_CASING_REGISTRY_NAME, GT_MultiTileUpgradeCasing.Cleanroom.getId()),
+
+ Heater(UPGRADE_CASING_REGISTRY_NAME, Heater_Prototype.getId(), Heater_IndustrialGrade.getId(),
+ Heater_NextGen.getId(), Heater_Omnipotent.getId(), Heater_OmegaType.getId()),
+
+ Insulator(UPGRADE_CASING_REGISTRY_NAME, Insulator_Prototype.getId(), Insulator_IndustrialGrade.getId(),
+ Insulator_NextGen.getId(), Insulator_Omnipotent.getId(), Insulator_OmegaType.getId());
+
+ private final MuTEStructureCasing casing;
+
+ UpgradeCasings(String registryName, Integer... validIds) {
+ casing = createMuTEStructureCasing(registryName, validIds);
+ }
+
+ public MuTEStructureCasing getCasing() {
+ return casing;
+ }
+ }
+
+ /**
+ * Specify all casing sets that are valid for a multiblock structure position. The first casing will be used as
+ * default when doing auto place
+ *
+ * @param modes Allowed modes on the casings
+ * @param validCasings Allowed casing sets
+ * @return Structure Element
+ * @param <T> Multiblock class
+ */
+ public static <T> IStructureElement<T> ofMuTECasings(int modes, MuTEStructureCasing... validCasings) {
+ if (validCasings == null || validCasings.length == 0) {
+ throw new IllegalArgumentException();
+ }
+ return new IStructureElement<>() {
+
+ final MuTEStructureCasing[] allowedCasings = validCasings;
+ private final static short[] DEFAULT = new short[] { 255, 255, 255, 0 };
+ private static IIcon[] mIcons = null;
+
+ @Override
+ public boolean check(T t, World world, int x, int y, int z) {
+ final TileEntity tileEntity = world.getTileEntity(x, y, z);
+ if (!(tileEntity instanceof MultiBlockPart part)) return false;
+
+ for (MuTEStructureCasing casing : allowedCasings) {
+ if (casing.isCasingValid(part.getMultiTileEntityRegistryID(), part.getMultiTileEntityID())) {
+ final IMultiBlockController tTarget = part.getTarget(false);
+ if (tTarget != null && tTarget != t) return false;
+
+ part.setTarget((IMultiBlockController) t, modes);
+
+ ((Controller<?, ?>) t).registerSpecialCasings(part);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
+ // Moved here from Controller. TODO: Proper implementation
+ if (mIcons == null) {
+ mIcons = new IIcon[6];
+ Arrays.fill(mIcons, TextureSet.SET_NONE.mTextures[OrePrefixes.block.mTextureIndex].getIcon());
+ }
+ final short[] RGBA = DEFAULT;
+ StructureLibAPI.hintParticleTinted(world, x, y, z, mIcons, RGBA);
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
+ final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry
+ .getRegistry(validCasings[0].getRegistryId());
+ if (tRegistry == null) {
+ GT_FML_LOGGER.error("NULL REGISTRY");
+ return false;
+ }
+ final MultiTileEntityContainer tContainer = tRegistry
+ .getNewTileEntityContainer(world, x, y, z, validCasings[0].defaultMeta, null);
+ if (tContainer == null) {
+ GT_FML_LOGGER.error("NULL CONTAINER");
+ return false;
+ }
+ final IMultiTileEntity te = ((IMultiTileEntity) tContainer.mTileEntity);
+ if (!(te instanceof MultiBlockPart)) {
+ GT_FML_LOGGER.error("Not a multiblock part");
+ return false;
+ }
+ if (world.setBlock(x, y, z, tContainer.mBlock, 15 - tContainer.mBlockMetaData, 2)) {
+ tContainer.setMultiTile(world, x, y, z);
+ ((MultiBlockPart) te).setTarget((IMultiBlockController) t, modes);
+
+ ((Controller<?, ?>) t).registerSpecialCasings((MultiBlockPart) te);
+ }
+
+ return false;
+ }
+ };
+ }
+
+ public static MuTEStructureCasing createMuTEStructureCasing(String registryName, Integer... validIds) {
+ return new MuTEStructureCasing(registryName, validIds);
+ }
+
+ /**
+ * Object used to store a set of casings (e.g. all motor casings)
+ */
+ public static class MuTEStructureCasing {
+
+ private String registryName;
+ private int registryId = GT_Values.W;
+ private final int defaultMeta;
+ private final Integer[] validIds;
+
+ public MuTEStructureCasing(String registryName, Integer... validIds) {
+ MultiTileEntityRegistry registry = MultiTileEntityRegistry.getRegistry(registryName);
+ if (validIds == null || validIds.length == 0 || registry == null) {
+ throw new IllegalArgumentException();
+ }
+ this.registryName = registryName;
+ this.validIds = validIds;
+ this.defaultMeta = validIds[0];
+ }
+
+ public boolean isCasingValid(int registryId, int id) {
+ if (getRegistryId() != registryId) {
+ return false;
+ }
+ for (Integer validId : validIds) {
+ if (validId == id) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public int getDefaultMeta() {
+ return defaultMeta;
+ }
+
+ public int getRegistryId() {
+ // TODO: MuTE registry seems to somehow shift, probably due to NBT shenanigans. Lazy init circumvents this
+ // but it should be properly fixed in the future
+ if (registryId == GT_Values.W) {
+ MultiTileEntityRegistry registry = MultiTileEntityRegistry.getRegistry(registryName);
+ registryId = Block.getIdFromBlock(registry.mBlock);
+ }
+ return registryId;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_ToolHarvestHelper.java b/src/main/java/gregtech/api/util/GT_ToolHarvestHelper.java
new file mode 100644
index 0000000000..4263b77be6
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_ToolHarvestHelper.java
@@ -0,0 +1,71 @@
+package gregtech.api.util;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+
+import ic2.core.block.BlockMultiID;
+import ic2.core.block.BlockScaffold;
+import ic2.core.block.machine.BlockMiningPipe;
+import ic2.core.block.machine.BlockMiningTip;
+import ic2.core.block.wiring.BlockCable;
+import ic2.core.crop.BlockCrop;
+
+public class GT_ToolHarvestHelper {
+
+ public static boolean isAppropriateTool(Block aBlock, byte aMetaData, String... tTools) {
+
+ if (aBlock == null || tTools == null) {
+ return false;
+ }
+ String targetTool = aBlock.getHarvestTool(aMetaData);
+ return !isStringEmpty(targetTool) && isArrayContains(targetTool, tTools);
+ }
+
+ public static boolean isAppropriateMaterial(Block aBlock, Material... tMats) {
+ if (aBlock == null || tMats == null) {
+ return false;
+ }
+ return isArrayContains(aBlock.getMaterial(), tMats);
+ }
+
+ public static boolean isSpecialBlock(Block aBlock, Block... tBlocks) {
+ if (aBlock == null || tBlocks == null) {
+ return false;
+ }
+ return isArrayContains(aBlock, tBlocks);
+ }
+
+ public static <T> boolean isArrayContains(T obj, T[] list) {
+
+ if (obj == null || list == null) {
+ return false;
+ }
+
+ for (T iObj : list) {
+ if (obj == iObj || obj.equals(iObj)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static boolean isStringEmpty(String s) {
+ return s == null || s.isEmpty();
+ }
+
+ public static boolean isIC2Wrenchable(Block block) {
+ return (block instanceof BlockMultiID && !(block instanceof BlockCable) && !(block instanceof BlockCrop))
+ || block instanceof BlockScaffold
+ || block instanceof BlockMiningPipe
+ || block instanceof BlockMiningTip;
+ }
+
+ public static boolean hasNull(Object... obj) {
+ for (Object iObj : obj) {
+ if (iObj == null) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_TooltipDataCache.java b/src/main/java/gregtech/api/util/GT_TooltipDataCache.java
new file mode 100644
index 0000000000..431ef34fa4
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_TooltipDataCache.java
@@ -0,0 +1,105 @@
+package gregtech.api.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.util.StatCollector;
+
+import gregtech.GT_Mod;
+
+public class GT_TooltipDataCache {
+
+ public static class TooltipData {
+
+ public List<String> text;
+ public List<String> shiftText;
+
+ public TooltipData(List<String> text, List<String> shiftText) {
+ this.text = text;
+ this.shiftText = shiftText;
+ }
+ }
+
+ private final Map<String, TooltipData> fetchedTooltipData = new HashMap<>();
+
+ /**
+ * Returns tooltip data respecting the user's configured verbosity levels, applying any formatting arguments.
+ *
+ * @param key the key to lookup
+ * @param args arguments for string formatting (prefer using positional arguments)
+ * @return The tooltip data the user asked for
+ */
+ public TooltipData getData(String key, Object... args) {
+ TooltipData tooltipData = fetchedTooltipData.get(key);
+ if (tooltipData == null) {
+ tooltipData = getUncachedTooltipData(key, args);
+ fetchedTooltipData.put(key, tooltipData);
+ }
+ return tooltipData;
+ }
+
+ /**
+ * Builds tooltip data respecting the user's configured verbosity levels, applying any formatting arguments.
+ *
+ * @param key the key to lookup
+ * @param args arguments for string formatting (prefer using positional arguments)
+ * @return The tooltip data the user asked for
+ */
+ public TooltipData getUncachedTooltipData(String key, Object... args) {
+ List<String> lines = getAllLines(key, args);
+ int normalLines = lines.size();
+ if (Math.max(GT_Mod.gregtechproxy.mTooltipVerbosity, GT_Mod.gregtechproxy.mTooltipShiftVerbosity) >= 3) {
+ lines.addAll(getAllLines(key + ".extended", args)); // Are extended lines enabled? If so add them to the
+ // lines
+ }
+ if (lines.size() == 0) {
+ lines.add(key); // Fallback in case no lines could be found at all
+ }
+ return new TooltipData(
+ lines.subList(0, getVerbosityIndex(GT_Mod.gregtechproxy.mTooltipVerbosity, normalLines, lines.size())),
+ lines
+ .subList(0, getVerbosityIndex(GT_Mod.gregtechproxy.mTooltipShiftVerbosity, normalLines, lines.size())));
+ }
+
+ /**
+ * Gets all the lines for the given key and every other subsequent consecutive key with a .n suffix, n in {1,2,3...}
+ *
+ * @param key the key to lookup
+ * @param args arguments for string formatting (prefer using positional arguments)
+ * @return The lines for the key and all of it's subkeys
+ */
+ private List<String> getAllLines(String key, Object... args) {
+ List<String> lines = new ArrayList<>();
+ String keyToLookup = key;
+ int i = 1; // First loop has no .number postfix
+ while (StatCollector.canTranslate(keyToLookup)) {
+ lines.add(StatCollector.translateToLocalFormatted(keyToLookup, args));
+ keyToLookup = key + "." + i++;
+ }
+ return lines;
+ }
+
+ /**
+ * Determines how many lines from a tooltip to include from the full line list to respect a given verbosity level.
+ *
+ * @param tooltipVerbosity the verbosity level we're applying
+ * @param defaultIndex return if tooltipVerbosity is 2
+ * @param maxIndex return if tooltipVerbosity is greater than 2
+ * @return verbosity appropriate index
+ */
+ private static int getVerbosityIndex(int tooltipVerbosity, int defaultIndex, int maxIndex) {
+ int index;
+ if (tooltipVerbosity < 1) {
+ index = 0;
+ } else if (tooltipVerbosity == 1) {
+ index = 1;
+ } else if (tooltipVerbosity == 2) {
+ index = defaultIndex;
+ } else {
+ index = maxIndex;
+ }
+ return index;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_Util.java b/src/main/java/gregtech/api/util/GT_Util.java
new file mode 100644
index 0000000000..8a799a9616
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_Util.java
@@ -0,0 +1,202 @@
+package gregtech.api.util;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.util.Tuple;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
+
+public class GT_Util {
+
+ // Last broken tile entity
+ public static final ThreadLocal<TileEntity> LAST_BROKEN_TILEENTITY = new ThreadLocal<>();
+
+ public static Tuple tuple(String key, Object value) {
+ return new Tuple(key, value);
+ }
+
+ public static NBTTagCompound fuseNBT(NBTTagCompound aNBT1, NBTTagCompound aNBT2) {
+ if (aNBT1 == null) return aNBT2 == null ? new NBTTagCompound() : (NBTTagCompound) aNBT2.copy();
+ final NBTTagCompound rNBT = (NBTTagCompound) aNBT1.copy();
+ if (aNBT2 == null) return rNBT;
+ for (Object tKey : aNBT2.func_150296_c /* getKeySet */())
+ if (!rNBT.hasKey(tKey.toString())) rNBT.setTag(tKey.toString(), aNBT2.getTag(tKey.toString()));
+ return rNBT;
+ }
+
+ /**
+ * Construct a NBTTagCompound from a series of key, value pairs. Inspired from GT6.
+ */
+ public static NBTTagCompound makeNBT(Tuple... aTags) {
+ final NBTTagCompound rNBT = new NBTTagCompound();
+ for (Tuple t : aTags) {
+ if (t.getSecond() == null) continue;
+
+ if (t.getSecond() instanceof Boolean) rNBT.setBoolean(
+ t.getFirst()
+ .toString(),
+ (Boolean) t.getSecond());
+ else if (t.getSecond() instanceof Byte) rNBT.setByte(
+ t.getFirst()
+ .toString(),
+ (Byte) t.getSecond());
+ else if (t.getSecond() instanceof Short) rNBT.setShort(
+ t.getFirst()
+ .toString(),
+ (Short) t.getSecond());
+ else if (t.getSecond() instanceof Integer) rNBT.setInteger(
+ t.getFirst()
+ .toString(),
+ (Integer) t.getSecond());
+ else if (t.getSecond() instanceof Long) rNBT.setLong(
+ t.getFirst()
+ .toString(),
+ (Long) t.getSecond());
+ else if (t.getSecond() instanceof Float) rNBT.setFloat(
+ t.getFirst()
+ .toString(),
+ (Float) t.getSecond());
+ else if (t.getSecond() instanceof Double) rNBT.setDouble(
+ t.getFirst()
+ .toString(),
+ (Double) t.getSecond());
+ else if (t.getSecond() instanceof String) rNBT.setString(
+ t.getFirst()
+ .toString(),
+ (String) t.getSecond());
+ else if (t.getSecond() instanceof NBTBase) rNBT.setTag(
+ t.getFirst()
+ .toString(),
+ (NBTBase) t.getSecond());
+ else rNBT.setString(
+ t.getFirst()
+ .toString(),
+ t.getSecond()
+ .toString());
+ }
+
+ return rNBT;
+ }
+
+ /**
+ * Get a TileEntity
+ */
+ public static TileEntity getTileEntity(World aWorld, int aX, int aY, int aZ, boolean aLoadUnloadedChunks) {
+ if (aLoadUnloadedChunks || aWorld.blockExists(aX, aY, aZ)) {
+ TileEntity rTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (rTileEntity instanceof IMultiTileEntity && ((IMultiTileEntity) rTileEntity).isDead()) return null;
+ if (rTileEntity != null) return rTileEntity;
+ rTileEntity = LAST_BROKEN_TILEENTITY.get();
+ if (rTileEntity != null && rTileEntity.xCoord == aX && rTileEntity.yCoord == aY && rTileEntity.zCoord == aZ)
+ return rTileEntity;
+ }
+ return null;
+ }
+
+ /** Sets the TileEntity at the passed position, with the option of turning adjacent TileEntity updates off. */
+ public static TileEntity setTileEntity(World aWorld, int aX, int aY, int aZ, TileEntity aTileEntity,
+ boolean aCauseTileEntityUpdates) {
+ if (aCauseTileEntityUpdates) aWorld.setTileEntity(aX, aY, aZ, aTileEntity);
+ else {
+ Chunk tChunk = aWorld.getChunkFromChunkCoords(aX >> 4, aZ >> 4);
+ if (tChunk != null) {
+ aWorld.addTileEntity(aTileEntity);
+ tChunk.func_150812_a /* setBlockTileEntityInChunk */(aX & 15, aY, aZ & 15, aTileEntity);
+ tChunk.setChunkModified();
+ }
+ }
+ return aTileEntity;
+ }
+
+ public static boolean setTileEntity(World aWorld, int aX, int aY, int aZ, Block aBlock, short aMeta, long aFlags,
+ boolean aRemoveGrassBelow) {
+ if (aRemoveGrassBelow) {
+ final Block tBlock = aWorld.getBlock(aX, aY - 1, aZ);
+ if (tBlock == Blocks.grass || tBlock == Blocks.mycelium)
+ aWorld.setBlock(aX, aY - 1, aZ, Blocks.dirt, 0, (byte) aFlags);
+ }
+ return aWorld.setBlock(aX, aY, aZ, aBlock, aMeta, (byte) aFlags);
+ }
+
+ public static TileEntity getTileEntity(World aWorld, ChunkCoordinates aCoords, boolean aLoadUnloadedChunks) {
+ return getTileEntity(aWorld, aCoords.posX, aCoords.posY, aCoords.posZ, aLoadUnloadedChunks);
+ }
+
+ /** Marks a Chunk dirty so it is saved */
+ public static boolean markChunkDirty(World aWorld, int aX, int aZ) {
+ if (aWorld == null || aWorld.isRemote) return false;
+ Chunk aChunk = aWorld.getChunkFromBlockCoords(aX, aZ);
+ if (aChunk == null) {
+ aWorld.getBlockMetadata(aX, 0, aZ);
+ aChunk = aWorld.getChunkFromBlockCoords(aX, aZ);
+ if (aChunk == null) {
+ GT_Log.err.println(
+ "Some important Chunk does not exist for some reason at Coordinates X: " + aX + " and Z: " + aZ);
+ return false;
+ }
+ }
+ aChunk.setChunkModified();
+ return true;
+ }
+
+ /** Marks a Chunk dirty so it is saved */
+ public static boolean markChunkDirty(Object aTileEntity) {
+ return aTileEntity instanceof TileEntity && markChunkDirty(
+ ((TileEntity) aTileEntity).getWorldObj(),
+ ((TileEntity) aTileEntity).xCoord,
+ ((TileEntity) aTileEntity).zCoord);
+ }
+
+ public static int mixRGBInt(int aRGB1, int aRGB2) {
+ return getRGBInt(
+ new short[] { (short) ((getR(aRGB1) + getR(aRGB2)) >> 1), (short) ((getG(aRGB1) + getG(aRGB2)) >> 1),
+ (short) ((getB(aRGB1) + getB(aRGB2)) >> 1) });
+ }
+
+ public static int getRGBInt(short[] aColors) {
+ return aColors == null ? 16777215 : (aColors[0] << 16) | (aColors[1] << 8) | aColors[2];
+ }
+
+ public static int getRGBaInt(short[] aColors) {
+ return aColors == null ? 16777215 : (aColors[0]) << 16 | (aColors[1] << 8) | aColors[2] | (aColors[3] << 24);
+ }
+
+ public static String toHexString(short[] aColors) {
+ return aColors == null ? "FFFFFF" : Integer.toHexString((aColors[0] << 16) | (aColors[1] << 8) | aColors[2]);
+ }
+
+ public static int getRGBInt(short aR, short aG, short aB) {
+ return (aR << 16) | (aG << 8) | aB;
+ }
+
+ public static int getRGBaInt(short aR, short aG, short aB, short aA) {
+ return (aR << 16) | (aG << 8) | aB | (aA << 24);
+ }
+
+ public static short[] getRGBaArray(int aColors) {
+ return new short[] { (short) ((aColors >>> 16) & 255), (short) ((aColors >>> 8) & 255), (short) (aColors & 255),
+ (short) ((aColors >>> 24) & 255) };
+ }
+
+ public static short getR(int aColors) {
+ return (short) ((aColors >>> 16) & 255);
+ }
+
+ public static short getG(int aColors) {
+ return (short) ((aColors >>> 8) & 255);
+ }
+
+ public static short getB(int aColors) {
+ return (short) (aColors & 255);
+ }
+
+ public static short getA(int aColors) {
+ return (short) ((aColors >>> 24) & 255);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_Utility.java b/src/main/java/gregtech/api/util/GT_Utility.java
new file mode 100644
index 0000000000..62c4498927
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_Utility.java
@@ -0,0 +1,4982 @@
+package gregtech.api.util;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.enums.GT_Values.D1;
+import static gregtech.api.enums.GT_Values.E;
+import static gregtech.api.enums.GT_Values.GT;
+import static gregtech.api.enums.GT_Values.L;
+import static gregtech.api.enums.GT_Values.M;
+import static gregtech.api.enums.GT_Values.NW;
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.GT_Values.W;
+import static gregtech.api.enums.Materials.FLUID_MAP;
+import static gregtech.api.enums.Mods.Translocator;
+import static gregtech.common.GT_UndergroundOil.undergroundOilReadInformation;
+import static net.minecraftforge.common.util.ForgeDirection.DOWN;
+import static net.minecraftforge.common.util.ForgeDirection.EAST;
+import static net.minecraftforge.common.util.ForgeDirection.NORTH;
+import static net.minecraftforge.common.util.ForgeDirection.SOUTH;
+import static net.minecraftforge.common.util.ForgeDirection.UNKNOWN;
+import static net.minecraftforge.common.util.ForgeDirection.UP;
+import static net.minecraftforge.common.util.ForgeDirection.WEST;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.math.BigInteger;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.AbstractCollection;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
+import java.util.function.Function;
+import java.util.function.IntFunction;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityList;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.EnumCreatureAttribute;
+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.init.Items;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTBase.NBTPrimitive;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
+import net.minecraft.network.play.server.S07PacketRespawn;
+import net.minecraft.network.play.server.S1DPacketEntityEffect;
+import net.minecraft.network.play.server.S1FPacketSetExperience;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.tileentity.TileEntityChest;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.World;
+import net.minecraft.world.WorldServer;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.common.util.BlockSnapshot;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.FakePlayer;
+import net.minecraftforge.common.util.FakePlayerFactory;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.event.ForgeEventFactory;
+import net.minecraftforge.event.world.BlockEvent;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidContainerRegistry.FluidContainerData;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidContainerItem;
+import net.minecraftforge.fluids.IFluidHandler;
+import net.minecraftforge.oredict.OreDictionary;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import com.google.common.collect.SetMultimap;
+import com.gtnewhorizon.structurelib.alignment.IAlignment;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider;
+import com.mojang.authlib.GameProfile;
+
+import buildcraft.api.transport.IPipeTile;
+import cofh.api.energy.IEnergyReceiver;
+import cofh.api.transport.IItemDuct;
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.damagesources.GT_DamageSources;
+import gregtech.api.damagesources.GT_DamageSources.DamageSourceHotItem;
+import gregtech.api.enchants.Enchantment_Hazmat;
+import gregtech.api.enchants.Enchantment_Radioactivity;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.events.BlockScanningEvent;
+import gregtech.api.interfaces.IBlockContainer;
+import gregtech.api.interfaces.IDebugableBlock;
+import gregtech.api.interfaces.IHasIndexedTexture;
+import gregtech.api.interfaces.IProjectileItem;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IBasicEnergyContainer;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.interfaces.tileentity.IUpgradableMachine;
+import gregtech.api.items.GT_EnergyArmor_Item;
+import gregtech.api.items.GT_Generic_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.net.GT_Packet_Sound;
+import gregtech.api.objects.CollectorUtils;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_ItemStack2;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.threads.GT_Runnable_Sound;
+import gregtech.api.util.extensions.ArrayExt;
+import gregtech.common.GT_Pollution;
+import gregtech.common.blocks.GT_Block_Ores_Abstract;
+import ic2.api.recipe.IRecipeInput;
+import ic2.api.recipe.RecipeInputItemStack;
+import ic2.api.recipe.RecipeInputOreDict;
+import ic2.api.recipe.RecipeOutput;
+
+/**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+ * <p/>
+ * Just a few Utility Functions I use.
+ */
+public class GT_Utility {
+
+ /**
+ * Formats a number with group separator and at most 2 fraction digits.
+ */
+ private static final Map<Locale, DecimalFormat> decimalFormatters = new HashMap<>();
+
+ /**
+ * Forge screwed the Fluid Registry up again, so I make my own, which is also much more efficient than the stupid
+ * Stuff over there.
+ */
+ private static final List<FluidContainerData> sFluidContainerList = new ArrayList<>();
+
+ private static final Map<GT_ItemStack, FluidContainerData> sFilledContainerToData = new /* Concurrent */ HashMap<>();
+ private static final Map<GT_ItemStack, Map<String, FluidContainerData>> sEmptyContainerToFluidToData = new HashMap<>();
+ private static final Map<String, List<ItemStack>> sFluidToContainers = new HashMap<>();
+ /**
+ * Must use {@code Supplier} here because the ore prefixes have not yet been registered at class load time.
+ */
+ private static final Map<OrePrefixes, Supplier<ItemStack>> sOreToCobble = new HashMap<>();
+
+ private static final Map<Integer, Boolean> sOreTable = new HashMap<>();
+ public static boolean TE_CHECK = false, BC_CHECK = false, CHECK_ALL = true, RF_CHECK = false;
+ public static Map<GT_PlayedSound, Integer> sPlayedSoundMap = new /* Concurrent */ HashMap<>();
+ private static int sBookCount = 0;
+ public static UUID defaultUuid = null; // maybe default non-null?
+ // UUID.fromString("00000000-0000-0000-0000-000000000000");
+
+ static {
+ GregTech_API.sItemStackMappings.add(sFilledContainerToData);
+ GregTech_API.sItemStackMappings.add(sEmptyContainerToFluidToData);
+
+ // 1 is the magic index to get the cobblestone block.
+ // See: GT_Block_Stones.java, GT_Block_Granites.java
+ Function<Materials, Supplier<ItemStack>> materialToCobble = m -> Suppliers.memoize(
+ () -> GT_OreDictUnificator.getOres(OrePrefixes.stone, m)
+ .get(1))::get;
+ sOreToCobble.put(OrePrefixes.oreBlackgranite, materialToCobble.apply(Materials.GraniteBlack));
+ sOreToCobble.put(OrePrefixes.oreRedgranite, materialToCobble.apply(Materials.GraniteRed));
+ sOreToCobble.put(OrePrefixes.oreMarble, materialToCobble.apply(Materials.Marble));
+ sOreToCobble.put(OrePrefixes.oreBasalt, materialToCobble.apply(Materials.Basalt));
+ sOreToCobble.put(OrePrefixes.oreNetherrack, () -> new ItemStack(Blocks.netherrack));
+ sOreToCobble.put(OrePrefixes.oreEndstone, () -> new ItemStack(Blocks.end_stone));
+ }
+
+ public static int safeInt(long number, int margin) {
+ return number > Integer.MAX_VALUE - margin ? Integer.MAX_VALUE - margin : (int) number;
+ }
+
+ public static int safeInt(long number) {
+ return number > V[V.length - 1] ? safeInt(V[V.length - 1], 1)
+ : number < Integer.MIN_VALUE ? Integer.MIN_VALUE : (int) number;
+ }
+
+ public static Field getPublicField(Object aObject, String aField) {
+ Field rField = null;
+ try {
+ rField = aObject.getClass()
+ .getDeclaredField(aField);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return rField;
+ }
+
+ public static Field getField(Object aObject, String aField) {
+ Field rField = null;
+ try {
+ rField = aObject.getClass()
+ .getDeclaredField(aField);
+ rField.setAccessible(true);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return rField;
+ }
+
+ public static Field getField(Class<?> aObject, String aField) {
+ Field rField = null;
+ try {
+ rField = aObject.getDeclaredField(aField);
+ rField.setAccessible(true);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return rField;
+ }
+
+ public static Method getMethod(Class<?> aObject, String aMethod, Class<?>... aParameterTypes) {
+ Method rMethod = null;
+ try {
+ rMethod = aObject.getMethod(aMethod, aParameterTypes);
+ rMethod.setAccessible(true);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return rMethod;
+ }
+
+ public static Method getMethod(Object aObject, String aMethod, Class<?>... aParameterTypes) {
+ Method rMethod = null;
+ try {
+ rMethod = aObject.getClass()
+ .getMethod(aMethod, aParameterTypes);
+ rMethod.setAccessible(true);
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+ return rMethod;
+ }
+
+ public static Field getField(Object aObject, String aField, boolean aPrivate, boolean aLogErrors) {
+ try {
+ Field tField = (aObject instanceof Class) ? ((Class<?>) aObject).getDeclaredField(aField)
+ : (aObject instanceof String) ? Class.forName((String) aObject)
+ .getDeclaredField(aField)
+ : aObject.getClass()
+ .getDeclaredField(aField);
+ if (aPrivate) tField.setAccessible(true);
+ return tField;
+ } catch (Throwable e) {
+ if (aLogErrors) e.printStackTrace(GT_Log.err);
+ }
+ return null;
+ }
+
+ public static Object getFieldContent(Object aObject, String aField, boolean aPrivate, boolean aLogErrors) {
+ try {
+ Field tField = (aObject instanceof Class) ? ((Class<?>) aObject).getDeclaredField(aField)
+ : (aObject instanceof String) ? Class.forName((String) aObject)
+ .getDeclaredField(aField)
+ : aObject.getClass()
+ .getDeclaredField(aField);
+ if (aPrivate) tField.setAccessible(true);
+ return tField.get(aObject instanceof Class || aObject instanceof String ? null : aObject);
+ } catch (Throwable e) {
+ if (aLogErrors) e.printStackTrace(GT_Log.err);
+ }
+ return null;
+ }
+
+ public static Object callPublicMethod(Object aObject, String aMethod, Object... aParameters) {
+ return callMethod(aObject, aMethod, false, false, true, aParameters);
+ }
+
+ public static Object callPrivateMethod(Object aObject, String aMethod, Object... aParameters) {
+ return callMethod(aObject, aMethod, true, false, true, aParameters);
+ }
+
+ public static Object callMethod(Object aObject, String aMethod, boolean aPrivate, boolean aUseUpperCasedDataTypes,
+ boolean aLogErrors, Object... aParameters) {
+ try {
+ Class<?>[] tParameterTypes = new Class<?>[aParameters.length];
+ for (byte i = 0; i < aParameters.length; i++) {
+ if (aParameters[i] instanceof Class) {
+ tParameterTypes[i] = (Class<?>) aParameters[i];
+ aParameters[i] = null;
+ } else {
+ tParameterTypes[i] = aParameters[i].getClass();
+ }
+ if (!aUseUpperCasedDataTypes) {
+ if (tParameterTypes[i] == Boolean.class) tParameterTypes[i] = boolean.class;
+ else if (tParameterTypes[i] == Byte.class) tParameterTypes[i] = byte.class;
+ else if (tParameterTypes[i] == Short.class) tParameterTypes[i] = short.class;
+ else if (tParameterTypes[i] == Integer.class) tParameterTypes[i] = int.class;
+ else if (tParameterTypes[i] == Long.class) tParameterTypes[i] = long.class;
+ else if (tParameterTypes[i] == Float.class) tParameterTypes[i] = float.class;
+ else if (tParameterTypes[i] == Double.class) tParameterTypes[i] = double.class;
+ }
+ }
+
+ Method tMethod = (aObject instanceof Class) ? ((Class<?>) aObject).getMethod(aMethod, tParameterTypes)
+ : aObject.getClass()
+ .getMethod(aMethod, tParameterTypes);
+ if (aPrivate) tMethod.setAccessible(true);
+ return tMethod.invoke(aObject, aParameters);
+ } catch (Throwable e) {
+ if (aLogErrors) e.printStackTrace(GT_Log.err);
+ }
+ return null;
+ }
+
+ public static Object callConstructor(String aClass, int aConstructorIndex, Object aReplacementObject,
+ boolean aLogErrors, Object... aParameters) {
+ try {
+ return callConstructor(
+ Class.forName(aClass),
+ aConstructorIndex,
+ aReplacementObject,
+ aLogErrors,
+ aParameters);
+ } catch (Throwable e) {
+ if (aLogErrors) e.printStackTrace(GT_Log.err);
+ }
+ return aReplacementObject;
+ }
+
+ public static Object callConstructor(Class<?> aClass, int aConstructorIndex, Object aReplacementObject,
+ boolean aLogErrors, Object... aParameters) {
+ if (aConstructorIndex < 0) {
+ try {
+ for (Constructor<?> tConstructor : aClass.getConstructors()) {
+ try {
+ return tConstructor.newInstance(aParameters);
+ } catch (Throwable ignored) {}
+ }
+ } catch (Throwable e) {
+ if (aLogErrors) e.printStackTrace(GT_Log.err);
+ }
+ } else {
+ try {
+ return aClass.getConstructors()[aConstructorIndex].newInstance(aParameters);
+ } catch (Throwable e) {
+ if (aLogErrors) e.printStackTrace(GT_Log.err);
+ }
+ }
+ return aReplacementObject;
+ }
+
+ public static String capitalizeString(String aString) {
+ if (aString != null && aString.length() > 0) return aString.substring(0, 1)
+ .toUpperCase() + aString.substring(1);
+ return E;
+ }
+
+ public static boolean getPotion(EntityLivingBase aPlayer, int aPotionIndex) {
+ try {
+ Field tPotionHashmap = null;
+
+ Field[] fields = EntityLiving.class.getDeclaredFields();
+
+ for (Field field : fields) {
+ if (field.getType() == HashMap.class) {
+ tPotionHashmap = field;
+ tPotionHashmap.setAccessible(true);
+ break;
+ }
+ }
+
+ if (tPotionHashmap != null) return ((HashMap<?, ?>) tPotionHashmap.get(aPlayer)).get(aPotionIndex) != null;
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return false;
+ }
+
+ public static String getClassName(Object aObject) {
+ if (aObject == null) return "null";
+ return aObject.getClass()
+ .getName()
+ .substring(
+ aObject.getClass()
+ .getName()
+ .lastIndexOf(".") + 1);
+ }
+
+ public static void removePotion(EntityLivingBase aPlayer, int aPotionIndex) {
+ try {
+ Field tPotionHashmap = null;
+
+ Field[] fields = EntityLiving.class.getDeclaredFields();
+
+ for (Field field : fields) {
+ if (field.getType() == HashMap.class) {
+ tPotionHashmap = field;
+ tPotionHashmap.setAccessible(true);
+ break;
+ }
+ }
+
+ if (tPotionHashmap != null) ((HashMap<?, ?>) tPotionHashmap.get(aPlayer)).remove(aPotionIndex);
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ public static boolean getFullInvisibility(EntityPlayer aPlayer) {
+ try {
+ if (aPlayer.isInvisible()) {
+ for (int i = 0; i < 4; i++) {
+ if (aPlayer.inventory.armorInventory[i] != null) {
+ if (aPlayer.inventory.armorInventory[i].getItem() instanceof GT_EnergyArmor_Item) {
+ if ((((GT_EnergyArmor_Item) aPlayer.inventory.armorInventory[i].getItem()).mSpecials & 512)
+ != 0) {
+ if (GT_ModHandler.canUseElectricItem(aPlayer.inventory.armorInventory[i], 10000)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return false;
+ }
+
+ public static ItemStack suckOneItemStackAt(World aWorld, double aX, double aY, double aZ, double aL, double aH,
+ double aW) {
+ for (EntityItem tItem : aWorld.getEntitiesWithinAABB(
+ EntityItem.class,
+ AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + aL, aY + aH, aZ + aW))) {
+ if (!tItem.isDead) {
+ aWorld.removeEntity(tItem);
+ tItem.setDead();
+ return tItem.getEntityItem();
+ }
+ }
+ return null;
+ }
+
+ public static byte getOppositeSide(ForgeDirection side) {
+ return (byte) side.getOpposite()
+ .ordinal();
+ }
+
+ public static byte getTier(long l) {
+ byte i = -1;
+ while (++i < V.length) if (l <= V[i]) return i;
+ return (byte) (V.length - 1);
+ }
+
+ public static long getAmperageForTier(long voltage, byte tier) {
+ return ceilDiv(voltage, GT_Values.V[tier]);
+ }
+
+ /**
+ * Rounds up partial voltage that exceeds tiered voltage, e.g. 4,096 -> 8,192(IV)
+ */
+ public static long roundUpVoltage(long voltage) {
+ if (voltage > V[V.length - 1]) {
+ return voltage;
+ }
+ return V[GT_Utility.getTier(voltage)];
+ }
+
+ public static String getColoredTierNameFromVoltage(long voltage) {
+ return getColoredTierNameFromTier(getTier(voltage));
+ }
+
+ public static String getColoredTierNameFromTier(byte tier) {
+ return GT_Values.TIER_COLORS[tier] + GT_Values.VN[tier] + EnumChatFormatting.RESET;
+ }
+
+ /**
+ * @return e.g. {@code " (LV)"}
+ */
+ @Nonnull
+ public static String getTierNameWithParentheses(long voltage) {
+ byte tier = getTier(voltage);
+ if (tier < 0) {
+ return "";
+ } else if (tier >= GT_Values.VN.length - 1) {
+ return " (MAX+)";
+ }
+ return " (" + GT_Values.VN[tier] + ")";
+ }
+
+ public static void sendChatToPlayer(EntityPlayer aPlayer, String aChatMessage) {
+ if (aPlayer instanceof EntityPlayerMP && aChatMessage != null) {
+ aPlayer.addChatComponentMessage(new ChatComponentText(aChatMessage));
+ }
+ }
+
+ public static void checkAvailabilities() {
+ if (CHECK_ALL) {
+ try {
+ Class<IItemDuct> tClass = IItemDuct.class;
+ tClass.getCanonicalName();
+ TE_CHECK = true;
+ } catch (Throwable e) {
+ /**/
+ }
+ try {
+ Class<IPipeTile> tClass = buildcraft.api.transport.IPipeTile.class;
+ tClass.getCanonicalName();
+ BC_CHECK = true;
+ } catch (Throwable e) {
+ /**/
+ }
+ try {
+ Class<IEnergyReceiver> tClass = cofh.api.energy.IEnergyReceiver.class;
+ tClass.getCanonicalName();
+ RF_CHECK = true;
+ } catch (Throwable e) {
+ /**/
+ }
+ CHECK_ALL = false;
+ }
+ }
+
+ public static boolean isConnectableNonInventoryPipe(TileEntity tileEntity, ForgeDirection side) {
+ if (tileEntity == null) return false;
+ checkAvailabilities();
+ if (TE_CHECK && tileEntity instanceof IItemDuct) return true;
+ if (BC_CHECK && tileEntity instanceof buildcraft.api.transport.IPipeTile pipeTile)
+ return pipeTile.isPipeConnected(side);
+ return Translocator.isModLoaded() && tileEntity instanceof codechicken.translocator.TileItemTranslocator;
+ }
+
+ /**
+ * Moves Stack from Inv-Slot to Inv-Slot, without checking if its even allowed.
+ *
+ * @return the Amount of moved Items
+ */
+ public static byte moveStackIntoPipe(IInventory aTileEntity1, Object aTileEntity2, int[] aGrabSlots,
+ ForgeDirection fromSide, ForgeDirection putSide, List<ItemStack> aFilter, boolean aInvertFilter,
+ byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce) {
+ return moveStackIntoPipe(
+ aTileEntity1,
+ aTileEntity2,
+ aGrabSlots,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ true);
+ }
+
+ /**
+ * Moves Stack from Inv-Slot to Inv-Slot, without checking if it is even allowed.
+ *
+ * @return the Amount of moved Items
+ */
+ public static byte moveStackIntoPipe(IInventory fromInventory, Object toObject, int[] fromSlots,
+ ForgeDirection fromSide, ForgeDirection putSide, List<ItemStack> aFilter, boolean aInvertFilter,
+ byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce,
+ boolean dropItem) {
+ if (fromInventory == null || aMaxTargetStackSize <= 0
+ || aMinTargetStackSize <= 0
+ || aMinTargetStackSize > aMaxTargetStackSize
+ || aMaxMoveAtOnce <= 0
+ || aMinMoveAtOnce > aMaxMoveAtOnce) return 0;
+ if (toObject != null) {
+ checkAvailabilities();
+ if (TE_CHECK && toObject instanceof IItemDuct itemDuct) {
+ for (final int aGrabSlot : fromSlots) {
+ if (listContainsItem(aFilter, fromInventory.getStackInSlot(aGrabSlot), true, aInvertFilter)) {
+ if (isAllowedToTakeFromSlot(
+ fromInventory,
+ aGrabSlot,
+ fromSide,
+ fromInventory.getStackInSlot(aGrabSlot))) {
+ if (Math.max(aMinMoveAtOnce, aMinTargetStackSize)
+ <= fromInventory.getStackInSlot(aGrabSlot).stackSize) {
+ ItemStack tStack = copyAmount(
+ Math.min(
+ fromInventory.getStackInSlot(aGrabSlot).stackSize,
+ Math.min(aMaxMoveAtOnce, aMaxTargetStackSize)),
+ fromInventory.getStackInSlot(aGrabSlot));
+ ItemStack rStack = itemDuct.insertItem(putSide, copyOrNull(tStack));
+ byte tMovedItemCount = (byte) (tStack.stackSize
+ - (rStack == null ? 0 : rStack.stackSize));
+ if (tMovedItemCount >= 1 /* Math.max(aMinMoveAtOnce, aMinTargetStackSize) */) {
+ fromInventory.decrStackSize(aGrabSlot, tMovedItemCount);
+ fromInventory.markDirty();
+ return tMovedItemCount;
+ }
+ }
+ }
+ }
+ }
+ return 0;
+ }
+ if (BC_CHECK && toObject instanceof buildcraft.api.transport.IPipeTile bcPipe) {
+ for (int fromSlot : fromSlots) {
+ if (listContainsItem(aFilter, fromInventory.getStackInSlot(fromSlot), true, aInvertFilter)) {
+ if (isAllowedToTakeFromSlot(
+ fromInventory,
+ fromSlot,
+ fromSide,
+ fromInventory.getStackInSlot(fromSlot))) {
+ if (Math.max(aMinMoveAtOnce, aMinTargetStackSize)
+ <= fromInventory.getStackInSlot(fromSlot).stackSize) {
+ ItemStack tStack = copyAmount(
+ Math.min(
+ fromInventory.getStackInSlot(fromSlot).stackSize,
+ Math.min(aMaxMoveAtOnce, aMaxTargetStackSize)),
+ fromInventory.getStackInSlot(fromSlot));
+ byte tMovedItemCount = (byte) bcPipe.injectItem(copyOrNull(tStack), false, putSide);
+ if (tMovedItemCount >= Math.max(aMinMoveAtOnce, aMinTargetStackSize)) {
+ tMovedItemCount = (byte) (bcPipe
+ .injectItem(copyAmount(tMovedItemCount, tStack), true, putSide));
+ fromInventory.decrStackSize(fromSlot, tMovedItemCount);
+ fromInventory.markDirty();
+ return tMovedItemCount;
+ }
+ }
+ }
+ }
+ }
+ return 0;
+ }
+ }
+
+ if (fromInventory instanceof TileEntity fromTileEntity && fromSide != ForgeDirection.UNKNOWN
+ && fromSide.getOpposite() == ForgeDirection.getOrientation(putSide.ordinal())) {
+ int tX = fromTileEntity.xCoord + fromSide.offsetX, tY = fromTileEntity.yCoord + fromSide.offsetY,
+ tZ = fromTileEntity.zCoord + fromSide.offsetZ;
+ if (!hasBlockHitBox(((TileEntity) fromInventory).getWorldObj(), tX, tY, tZ) && dropItem) {
+ for (final int fromSlot : fromSlots) {
+ if (listContainsItem(aFilter, fromInventory.getStackInSlot(fromSlot), true, aInvertFilter)) {
+ if (isAllowedToTakeFromSlot(
+ fromInventory,
+ fromSlot,
+ fromSide,
+ fromInventory.getStackInSlot(fromSlot))) {
+ if (Math.max(aMinMoveAtOnce, aMinTargetStackSize)
+ <= fromInventory.getStackInSlot(fromSlot).stackSize) {
+ final ItemStack tStack = copyAmount(
+ Math.min(
+ fromInventory.getStackInSlot(fromSlot).stackSize,
+ Math.min(aMaxMoveAtOnce, aMaxTargetStackSize)),
+ fromInventory.getStackInSlot(fromSlot));
+ final EntityItem tEntity = new EntityItem(
+ ((TileEntity) fromInventory).getWorldObj(),
+ tX + 0.5,
+ tY + 0.5,
+ tZ + 0.5,
+ tStack);
+ tEntity.motionX = tEntity.motionY = tEntity.motionZ = 0;
+ ((TileEntity) fromInventory).getWorldObj()
+ .spawnEntityInWorld(tEntity);
+ assert tStack != null;
+ fromInventory.decrStackSize(fromSlot, tStack.stackSize);
+ fromInventory.markDirty();
+ return (byte) tStack.stackSize;
+ }
+ }
+ }
+ }
+ }
+ }
+ return 0;
+ }
+
+ /**
+ * Moves Stack from Inv-Slot to Inv-Slot, without checking if its even allowed. (useful for internal Inventory
+ * Operations)
+ *
+ * @return the Amount of moved Items
+ */
+ public static byte moveStackFromSlotAToSlotB(IInventory aTileEntity1, IInventory aTileEntity2, int aGrabFrom,
+ int aPutTo, byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce) {
+ if (aTileEntity1 == null || aTileEntity2 == null
+ || aMinTargetStackSize <= 0
+ || aMinTargetStackSize > aMaxTargetStackSize
+ || aMaxMoveAtOnce <= 0
+ || aMinMoveAtOnce > aMaxMoveAtOnce) return 0;
+
+ ItemStack tStack1 = aTileEntity1.getStackInSlot(aGrabFrom), tStack2 = aTileEntity2.getStackInSlot(aPutTo),
+ tStack3;
+ if (tStack1 != null) {
+ if (tStack2 != null && !areStacksEqual(tStack1, tStack2)) return 0;
+ tStack3 = copyOrNull(tStack1);
+ aMaxTargetStackSize = (byte) Math.min(
+ aMaxTargetStackSize,
+ Math.min(
+ tStack3.getMaxStackSize(),
+ Math.min(
+ tStack2 == null ? Integer.MAX_VALUE : tStack2.getMaxStackSize(),
+ aTileEntity2.getInventoryStackLimit())));
+ tStack3.stackSize = Math
+ .min(tStack3.stackSize, aMaxTargetStackSize - (tStack2 == null ? 0 : tStack2.stackSize));
+ if (tStack3.stackSize > aMaxMoveAtOnce) tStack3.stackSize = aMaxMoveAtOnce;
+ if (tStack3.stackSize + (tStack2 == null ? 0 : tStack2.stackSize)
+ >= Math.min(tStack3.getMaxStackSize(), aMinTargetStackSize) && tStack3.stackSize >= aMinMoveAtOnce) {
+ tStack3 = aTileEntity1.decrStackSize(aGrabFrom, tStack3.stackSize);
+ aTileEntity1.markDirty();
+ if (tStack3 != null) {
+ if (tStack2 == null) {
+ aTileEntity2.setInventorySlotContents(aPutTo, copyOrNull(tStack3));
+ } else {
+ tStack2.stackSize += tStack3.stackSize;
+ }
+ aTileEntity2.markDirty();
+ return (byte) tStack3.stackSize;
+ }
+ }
+ }
+ return 0;
+ }
+
+ public static boolean isAllowedToTakeFromSlot(IInventory aTileEntity, int aSlot, ForgeDirection side,
+ ItemStack aStack) {
+ if (side == ForgeDirection.UNKNOWN) {
+ return Arrays.stream(ForgeDirection.VALID_DIRECTIONS)
+ .anyMatch(d -> isAllowedToTakeFromSlot(aTileEntity, aSlot, d, aStack));
+ }
+ if (aTileEntity instanceof ISidedInventory sided) return sided.canExtractItem(aSlot, aStack, side.ordinal());
+ return true;
+ }
+
+ public static boolean isAllowedToPutIntoSlot(IInventory aTileEntity, int aSlot, ForgeDirection side,
+ ItemStack aStack, byte aMaxStackSize) {
+ ItemStack tStack = aTileEntity.getStackInSlot(aSlot);
+ if (tStack != null && (!areStacksEqual(tStack, aStack) || tStack.stackSize >= tStack.getMaxStackSize()))
+ return false;
+ if (side == ForgeDirection.UNKNOWN) {
+ return Arrays.stream(ForgeDirection.VALID_DIRECTIONS)
+ .anyMatch(d -> isAllowedToPutIntoSlot(aTileEntity, aSlot, d, aStack, aMaxStackSize));
+ }
+ if (aTileEntity instanceof ISidedInventory
+ && !((ISidedInventory) aTileEntity).canInsertItem(aSlot, aStack, side.ordinal())) return false;
+ return aSlot < aTileEntity.getSizeInventory() && aTileEntity.isItemValidForSlot(aSlot, aStack);
+ }
+
+ /**
+ * moves multiple stacks from Inv-Side to Inv-Side
+ *
+ * @return the Amount of moved Items
+ */
+ public static int moveMultipleItemStacks(Object aTileEntity1, Object aTileEntity2, ForgeDirection fromSide,
+ ForgeDirection putSide, List<ItemStack> aFilter, boolean aInvertFilter, byte aMaxTargetStackSize,
+ byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, int aStackAmount) {
+ if (aTileEntity1 instanceof IInventory) return moveMultipleItemStacks(
+ (IInventory) aTileEntity1,
+ aTileEntity2,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aStackAmount,
+ true);
+ return 0;
+ }
+
+ public static int moveMultipleItemStacks(IInventory fromInventory, Object toObject, ForgeDirection fromSide,
+ ForgeDirection putSide, List<ItemStack> aFilter, boolean aInvertFilter, byte aMaxTargetStackSize,
+ byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, int aMaxStackTransfer,
+ boolean aDoCheckChests) {
+ if (fromInventory == null || aMaxTargetStackSize <= 0
+ || aMinTargetStackSize <= 0
+ || aMaxMoveAtOnce <= 0
+ || aMinTargetStackSize > aMaxTargetStackSize
+ || aMinMoveAtOnce > aMaxMoveAtOnce
+ || aMaxStackTransfer == 0) return 0;
+
+ // find where to take from
+ final int[] tGrabSlots = new int[fromInventory.getSizeInventory()];
+ int tGrabSlotsSize = 0;
+ if (fromInventory instanceof ISidedInventory) {
+ for (int i : ((ISidedInventory) fromInventory).getAccessibleSlotsFromSide(fromSide.ordinal())) {
+ final ItemStack s = fromInventory.getStackInSlot(i);
+ if (s == null || !isAllowedToTakeFromSlot(fromInventory, i, fromSide, s)
+ || s.stackSize < aMinMoveAtOnce
+ || !listContainsItem(aFilter, s, true, aInvertFilter)) continue;
+ tGrabSlots[tGrabSlotsSize++] = i;
+ }
+ } else {
+ for (int i = 0; i < tGrabSlots.length; i++) {
+ ItemStack s = fromInventory.getStackInSlot(i);
+ if (s == null || s.stackSize < aMinMoveAtOnce || !listContainsItem(aFilter, s, true, aInvertFilter))
+ continue;
+ tGrabSlots[tGrabSlotsSize++] = i;
+ }
+ }
+
+ // no source, bail out
+ if (tGrabSlotsSize == 0) {
+ // maybe source is a double chest. check it
+ if (aDoCheckChests && fromInventory instanceof TileEntityChest chest) return moveFromAdjacentChests(
+ chest,
+ toObject,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aMaxStackTransfer);
+ return 0;
+ }
+
+ // if target is an inventory, e.g. chest, machine, drawers...
+ if (toObject instanceof IInventory toInventory) {
+
+ // partially filled slot spare space mapping.
+ // value is the sum of all spare space left not counting completely empty slot
+ final HashMap<ItemId, Integer> tPutItems = new HashMap<>(toInventory.getSizeInventory());
+ // partially filled slot contents
+ final HashMap<ItemId, List<ItemStack>> tPutItemStacks = new HashMap<>(toInventory.getSizeInventory());
+ // completely empty slots
+ final List<Integer> tPutFreeSlots = new ArrayList<>(toInventory.getSizeInventory());
+
+ // find possible target slots
+ int[] accessibleSlots = null;
+ if (toObject instanceof ISidedInventory sided)
+ accessibleSlots = sided.getAccessibleSlotsFromSide(putSide.ordinal());
+ for (int i = 0; i < toInventory.getSizeInventory(); i++) {
+ int slot = i;
+ if (accessibleSlots != null) {
+ if (accessibleSlots.length <= i) break;
+ slot = accessibleSlots[slot];
+ }
+ ItemStack s = toInventory.getStackInSlot(slot);
+ if (s == null) {
+ tPutFreeSlots.add(slot);
+ } else if ((s.stackSize < s.getMaxStackSize() && s.stackSize < toInventory.getInventoryStackLimit())
+ && aMinMoveAtOnce <= s.getMaxStackSize() - s.stackSize
+ && isAllowedToPutIntoSlot(toInventory, slot, putSide, s, (byte) 64)) {
+ ItemId sID = ItemId.createNoCopy(s);
+ tPutItems.merge(
+ sID,
+ (Math.min(s.getMaxStackSize(), toInventory.getInventoryStackLimit()) - s.stackSize),
+ Integer::sum);
+ tPutItemStacks.computeIfAbsent(sID, k -> new ArrayList<>())
+ .add(s);
+ }
+ }
+
+ // target completely filled, bail out
+ if (tPutItems.isEmpty() && tPutFreeSlots.isEmpty()) {
+ // maybe target is a double chest. check it.
+ if (aDoCheckChests && toObject instanceof TileEntityChest chest) return moveToAdjacentChests(
+ fromInventory,
+ chest,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aMaxStackTransfer);
+ return 0;
+ }
+
+ // go over source stacks one by one
+ int tStacksMoved = 0, tTotalItemsMoved = 0;
+ for (int j = 0; j < tGrabSlotsSize; j++) {
+ final int grabSlot = tGrabSlots[j];
+ int tMovedItems;
+ int tStackSize;
+ do {
+ tMovedItems = 0;
+ final ItemStack tGrabStack = fromInventory.getStackInSlot(grabSlot);
+ if (tGrabStack == null) break;
+ tStackSize = tGrabStack.stackSize;
+ final ItemId sID = ItemId.createNoCopy(tGrabStack);
+
+ if (tPutItems.containsKey(sID)) {
+ // there is a partially filled slot, try merging
+ final int canPut = Math.min(tPutItems.get(sID), aMaxMoveAtOnce);
+ if (canPut >= aMinMoveAtOnce) {
+ final List<ItemStack> putStack = tPutItemStacks.get(sID);
+ if (!putStack.isEmpty()) {
+ // can move, do merge
+ int toPut = Math.min(canPut, tStackSize);
+ tMovedItems = toPut;
+ for (int i = 0; i < putStack.size(); i++) {
+ final ItemStack s = putStack.get(i);
+ final int sToPut = Math.min(
+ Math.min(
+ Math.min(toPut, s.getMaxStackSize() - s.stackSize),
+ toInventory.getInventoryStackLimit() - s.stackSize),
+ aMaxTargetStackSize - s.stackSize);
+ if (sToPut <= 0) continue;
+ if (sToPut < aMinMoveAtOnce) continue;
+ if (s.stackSize + sToPut < aMinTargetStackSize) continue;
+ toPut -= sToPut;
+ s.stackSize += sToPut;
+ if (s.stackSize == s.getMaxStackSize()
+ || s.stackSize == toInventory.getInventoryStackLimit()) {
+ // this slot is full. remove this stack from candidate list
+ putStack.remove(i);
+ i--;
+ }
+ if (toPut == 0) break;
+ }
+ tMovedItems -= toPut;
+ if (tMovedItems > 0) {
+ tStackSize -= tMovedItems;
+ tTotalItemsMoved += tMovedItems;
+ // deduct spare space
+ tPutItems.merge(sID, tMovedItems, (a, b) -> a.equals(b) ? null : a - b);
+
+ if (tStackSize == 0) fromInventory.setInventorySlotContents(grabSlot, null);
+ else tGrabStack.stackSize = tStackSize;
+
+ fromInventory.markDirty();
+ toInventory.markDirty();
+ }
+ }
+ }
+ }
+ // still stuff to move & have completely empty slots
+ if (tStackSize > 0 && !tPutFreeSlots.isEmpty()) {
+ for (int i = 0; i < tPutFreeSlots.size(); i++) {
+ final int tPutSlot = tPutFreeSlots.get(i);
+ if (isAllowedToPutIntoSlot(toInventory, tPutSlot, putSide, tGrabStack, (byte) 64)) {
+ // allowed, now do moving
+ final int tMoved = moveStackFromSlotAToSlotB(
+ fromInventory,
+ toInventory,
+ grabSlot,
+ tPutSlot,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ (byte) (aMaxMoveAtOnce - tMovedItems),
+ aMinMoveAtOnce);
+ if (tMoved > 0) {
+ final ItemStack s = toInventory.getStackInSlot(tPutSlot);
+ if (s != null) {
+ // s might be null if tPutInventory is very special, e.g. infinity chest
+ // if s is null, we will not mark this slot as target candidate for anything
+ final int spare = Math
+ .min(s.getMaxStackSize(), toInventory.getInventoryStackLimit())
+ - s.stackSize;
+ if (spare > 0) {
+ final ItemId ssID = ItemId.createNoCopy(s);
+ // add back to spare space count
+ tPutItems.merge(ssID, spare, Integer::sum);
+ // add to partially filled slot list
+ tPutItemStacks.computeIfAbsent(ssID, k -> new ArrayList<>())
+ .add(s);
+ }
+ // this is no longer free
+ tPutFreeSlots.remove(i);
+ i--;
+ }
+ // else -> noop
+ // this is still a free slot. no need to do anything.
+ tTotalItemsMoved += tMoved;
+ tMovedItems += tMoved;
+ tStackSize -= tMoved;
+ if (tStackSize == 0) break;
+ }
+ }
+ }
+ }
+
+ if (tMovedItems > 0) {
+ // check if we have moved enough stacks
+ if (++tStacksMoved >= aMaxStackTransfer) return tTotalItemsMoved;
+ }
+ } while (tMovedItems > 0 && tStackSize > 0); // support inventories that store more than a stack in a
+ // slot
+ }
+
+ // check if source is a double chest, if yes, try move from the adjacent as well
+ if (aDoCheckChests && fromInventory instanceof TileEntityChest chest) {
+ final int tAmount = moveFromAdjacentChests(
+ chest,
+ toObject,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aMaxStackTransfer - tStacksMoved);
+ if (tAmount != 0) return tAmount + tTotalItemsMoved;
+ }
+
+ // check if target is a double chest, if yes, try move to the adjacent as well
+ if (aDoCheckChests && toObject instanceof TileEntityChest chest) {
+ final int tAmount = moveToAdjacentChests(
+ fromInventory,
+ chest,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aMaxStackTransfer - tStacksMoved);
+ if (tAmount != 0) return tAmount + tTotalItemsMoved;
+ }
+
+ return tTotalItemsMoved;
+ }
+ // there should be a function to transfer more than 1 stack in a pipe
+ // however I do not see any ways to improve it. too much work for what it is worth
+ int tTotalItemsMoved = 0;
+ final int tGrabInventorySize = tGrabSlots.length;
+ for (int i = 0; i < tGrabInventorySize; i++) {
+ final int tMoved = moveStackIntoPipe(
+ fromInventory,
+ toObject,
+ tGrabSlots,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aDoCheckChests);
+ if (tMoved == 0) return tTotalItemsMoved;
+ else tTotalItemsMoved += tMoved;
+ }
+ return 0;
+ }
+
+ private static int moveToAdjacentChests(IInventory aTileEntity1, TileEntityChest aTargetChest,
+ ForgeDirection fromSide, ForgeDirection putSide, List<ItemStack> aFilter, boolean aInvertFilter,
+ byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce,
+ int aMaxStackTransfer) {
+ if (aTargetChest.adjacentChestChecked) {
+ if (aTargetChest.adjacentChestXNeg != null) {
+ return moveMultipleItemStacks(
+ aTileEntity1,
+ aTargetChest.adjacentChestXNeg,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aMaxStackTransfer,
+ false);
+ } else if (aTargetChest.adjacentChestZNeg != null) {
+ return moveMultipleItemStacks(
+ aTileEntity1,
+ aTargetChest.adjacentChestZNeg,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aMaxStackTransfer,
+ false);
+ } else if (aTargetChest.adjacentChestXPos != null) {
+ return moveMultipleItemStacks(
+ aTileEntity1,
+ aTargetChest.adjacentChestXPos,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aMaxStackTransfer,
+ false);
+ } else if (aTargetChest.adjacentChestZPos != null) {
+ return moveMultipleItemStacks(
+ aTileEntity1,
+ aTargetChest.adjacentChestZPos,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aMaxStackTransfer,
+ false);
+ }
+ }
+ return 0;
+ }
+
+ private static int moveFromAdjacentChests(TileEntityChest fromTileEntityChest, Object toObject,
+ ForgeDirection fromSide, ForgeDirection putSide, List<ItemStack> aFilter, boolean aInvertFilter,
+ byte aMaxTargetStackSize, byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce,
+ int aMaxStackTransfer) {
+ if (fromTileEntityChest.adjacentChestXNeg != null) {
+ return moveMultipleItemStacks(
+ fromTileEntityChest.adjacentChestXNeg,
+ toObject,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aMaxStackTransfer,
+ false);
+ } else if (fromTileEntityChest.adjacentChestZNeg != null) {
+ return moveMultipleItemStacks(
+ fromTileEntityChest.adjacentChestZNeg,
+ toObject,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aMaxStackTransfer,
+ false);
+ } else if (fromTileEntityChest.adjacentChestXPos != null) {
+ return moveMultipleItemStacks(
+ fromTileEntityChest.adjacentChestXPos,
+ toObject,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aMaxStackTransfer,
+ false);
+ } else if (fromTileEntityChest.adjacentChestZPos != null) {
+ return moveMultipleItemStacks(
+ fromTileEntityChest.adjacentChestZPos,
+ toObject,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aMaxStackTransfer,
+ false);
+ }
+ return 0;
+ }
+
+ /**
+ * Moves Stack from Inv-Side to Inv-Side.
+ *
+ * @return the Amount of moved Items
+ */
+ public static byte moveOneItemStack(Object fromObject, Object toObject, ForgeDirection fromSide,
+ ForgeDirection putSide, List<ItemStack> aFilter, boolean aInvertFilter, byte aMaxTargetStackSize,
+ byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce) {
+ if (fromObject instanceof IInventory inv) return moveOneItemStack(
+ inv,
+ toObject,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ true);
+ return 0;
+ }
+
+ /**
+ * This is only because I needed an additional Parameter for the Double Chest Check.
+ */
+ private static byte moveOneItemStack(IInventory fromInventory, Object toObject, ForgeDirection fromSide,
+ ForgeDirection putSide, List<ItemStack> aFilter, boolean aInvertFilter, byte aMaxTargetStackSize,
+ byte aMinTargetStackSize, byte aMaxMoveAtOnce, byte aMinMoveAtOnce, boolean aDoCheckChests) {
+ if (fromInventory == null || aMaxTargetStackSize <= 0
+ || aMinTargetStackSize <= 0
+ || aMaxMoveAtOnce <= 0
+ || aMinTargetStackSize > aMaxTargetStackSize
+ || aMinMoveAtOnce > aMaxMoveAtOnce) return 0;
+
+ int[] tGrabSlots = null;
+ if (fromInventory instanceof ISidedInventory)
+ tGrabSlots = ((ISidedInventory) fromInventory).getAccessibleSlotsFromSide(fromSide.ordinal());
+ if (tGrabSlots == null) {
+ tGrabSlots = new int[fromInventory.getSizeInventory()];
+ for (int i = 0; i < tGrabSlots.length; i++) tGrabSlots[i] = i;
+ }
+
+ if (toObject instanceof IInventory inv) {
+ int[] tPutSlots = null;
+ if (toObject instanceof ISidedInventory sided)
+ tPutSlots = sided.getAccessibleSlotsFromSide(putSide.ordinal());
+
+ if (tPutSlots == null) {
+ tPutSlots = new int[inv.getSizeInventory()];
+ for (int i = 0; i < tPutSlots.length; i++) tPutSlots[i] = i;
+ }
+
+ for (final int tGrabSlot : tGrabSlots) {
+ byte tMovedItemCount = 0;
+ final ItemStack tGrabStack = fromInventory.getStackInSlot(tGrabSlot);
+ if (listContainsItem(aFilter, tGrabStack, true, aInvertFilter)
+ && (tGrabStack.stackSize >= aMinMoveAtOnce
+ && isAllowedToTakeFromSlot(fromInventory, tGrabSlot, fromSide, tGrabStack))) {
+ for (final int tPutSlot : tPutSlots) {
+ if (isAllowedToPutIntoSlot(inv, tPutSlot, putSide, tGrabStack, aMaxTargetStackSize)) {
+ tMovedItemCount += moveStackFromSlotAToSlotB(
+ fromInventory,
+ inv,
+ tGrabSlot,
+ tPutSlot,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ (byte) (aMaxMoveAtOnce - tMovedItemCount),
+ aMinMoveAtOnce);
+ if (tMovedItemCount >= aMaxMoveAtOnce || (tMovedItemCount > 0 && aMaxTargetStackSize < 64))
+ return tMovedItemCount;
+ }
+ }
+
+ }
+ if (tMovedItemCount > 0) return tMovedItemCount;
+ }
+
+ if (aDoCheckChests && fromInventory instanceof TileEntityChest fromChest
+ && (fromChest.adjacentChestChecked)) {
+ byte tAmount = 0;
+ if (fromChest.adjacentChestXNeg != null) {
+ tAmount = moveOneItemStack(
+ fromChest.adjacentChestXNeg,
+ toObject,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ false);
+ } else if (fromChest.adjacentChestZNeg != null) {
+ tAmount = moveOneItemStack(
+ fromChest.adjacentChestZNeg,
+ toObject,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ false);
+ } else if (fromChest.adjacentChestXPos != null) {
+ tAmount = moveOneItemStack(
+ fromChest.adjacentChestXPos,
+ toObject,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ false);
+ } else if (fromChest.adjacentChestZPos != null) {
+ tAmount = moveOneItemStack(
+ fromChest.adjacentChestZPos,
+ toObject,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ false);
+ }
+ if (tAmount != 0) return tAmount;
+
+ }
+ if (aDoCheckChests && toObject instanceof TileEntityChest toChest && (toChest.adjacentChestChecked)) {
+ byte tAmount = 0;
+ if (toChest.adjacentChestXNeg != null) {
+ tAmount = moveOneItemStack(
+ fromInventory,
+ toChest.adjacentChestXNeg,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ false);
+ } else if (toChest.adjacentChestZNeg != null) {
+ tAmount = moveOneItemStack(
+ fromInventory,
+ toChest.adjacentChestZNeg,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ false);
+ } else if (toChest.adjacentChestXPos != null) {
+ tAmount = moveOneItemStack(
+ fromInventory,
+ toChest.adjacentChestXPos,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ false);
+ } else if (toChest.adjacentChestZPos != null) {
+ tAmount = moveOneItemStack(
+ fromInventory,
+ toChest.adjacentChestZPos,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ false);
+ }
+ if (tAmount != 0) return tAmount;
+
+ }
+ }
+
+ return moveStackIntoPipe(
+ fromInventory,
+ toObject,
+ tGrabSlots,
+ fromSide,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aDoCheckChests);
+ }
+
+ /**
+ * Moves Stack from Inv-Side to Inv-Slot.
+ *
+ * @return the Amount of moved Items
+ */
+ public static byte moveOneItemStackIntoSlot(Object fromTileEntity, Object toTileEntity, ForgeDirection fromSide,
+ int putSlot, List<ItemStack> aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, byte aMinTargetStackSize,
+ byte aMaxMoveAtOnce, byte aMinMoveAtOnce) {
+ if (!(fromTileEntity instanceof IInventory fromInv) || aMaxTargetStackSize <= 0
+ || aMinTargetStackSize <= 0
+ || aMaxMoveAtOnce <= 0
+ || aMinTargetStackSize > aMaxTargetStackSize
+ || aMinMoveAtOnce > aMaxMoveAtOnce) return 0;
+
+ int[] tGrabSlots = null;
+ if (fromTileEntity instanceof ISidedInventory sided)
+ tGrabSlots = sided.getAccessibleSlotsFromSide(fromSide.ordinal());
+ if (tGrabSlots == null) {
+ tGrabSlots = new int[fromInv.getSizeInventory()];
+ for (int i = 0; i < tGrabSlots.length; i++) tGrabSlots[i] = i;
+ }
+
+ if (toTileEntity instanceof IInventory toInv) {
+ for (final int tGrabSlot : tGrabSlots) {
+ if (listContainsItem(aFilter, fromInv.getStackInSlot(tGrabSlot), true, aInvertFilter)) {
+ if (isAllowedToTakeFromSlot(fromInv, tGrabSlot, fromSide, fromInv.getStackInSlot(tGrabSlot))) {
+ if (isAllowedToPutIntoSlot(
+ toInv,
+ putSlot,
+ ForgeDirection.UNKNOWN,
+ fromInv.getStackInSlot(tGrabSlot),
+ aMaxTargetStackSize)) {
+ byte tMovedItemCount = moveStackFromSlotAToSlotB(
+ fromInv,
+ toInv,
+ tGrabSlot,
+ putSlot,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce);
+ if (tMovedItemCount > 0) return tMovedItemCount;
+ }
+ }
+ }
+ }
+ }
+
+ final ForgeDirection toSide = fromSide.getOpposite();
+ moveStackIntoPipe(
+ fromInv,
+ toTileEntity,
+ tGrabSlots,
+ fromSide,
+ ForgeDirection.UNKNOWN,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce);
+ return 0;
+ }
+
+ /**
+ * Moves Stack from Inv-Slot to Inv-Slot.
+ *
+ * @return the Amount of moved Items
+ */
+ public static byte moveFromSlotToSlot(IInventory fromInv, IInventory toInv, int aGrabFrom, int aPutTo,
+ List<ItemStack> aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, byte aMinTargetStackSize,
+ byte aMaxMoveAtOnce, byte aMinMoveAtOnce) {
+ if (fromInv == null || toInv == null
+ || aGrabFrom < 0
+ || aPutTo < 0
+ || aMinTargetStackSize <= 0
+ || aMaxMoveAtOnce <= 0
+ || aMinTargetStackSize > aMaxTargetStackSize
+ || aMinMoveAtOnce > aMaxMoveAtOnce) return 0;
+ if (listContainsItem(aFilter, fromInv.getStackInSlot(aGrabFrom), true, aInvertFilter)) {
+ if (isAllowedToTakeFromSlot(
+ fromInv,
+ aGrabFrom,
+ ForgeDirection.UNKNOWN,
+ fromInv.getStackInSlot(aGrabFrom))) {
+ if (isAllowedToPutIntoSlot(
+ toInv,
+ aPutTo,
+ ForgeDirection.UNKNOWN,
+ fromInv.getStackInSlot(aGrabFrom),
+ aMaxTargetStackSize)) {
+ byte tMovedItemCount = moveStackFromSlotAToSlotB(
+ fromInv,
+ toInv,
+ aGrabFrom,
+ aPutTo,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce);
+ if (tMovedItemCount > 0) return tMovedItemCount;
+ }
+ }
+ }
+ return 0;
+ }
+
+ /**
+ * Moves Stack from Inv-Side to Inv-Slot.
+ *
+ * @return the Amount of moved Items
+ */
+ public static byte moveFromSlotToSide(IInventory fromTile, Object toTile, int fromSlot, ForgeDirection putSide,
+ List<ItemStack> aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, byte aMinTargetStackSize,
+ byte aMaxMoveAtOnce, byte aMinMoveAtOnce, boolean aDoCheckChests) {
+ if (fromTile == null || fromSlot < 0
+ || aMinTargetStackSize <= 0
+ || aMaxMoveAtOnce <= 0
+ || aMinTargetStackSize > aMaxTargetStackSize
+ || aMinMoveAtOnce > aMaxMoveAtOnce) return 0;
+
+ if (!listContainsItem(aFilter, fromTile.getStackInSlot(fromSlot), true, aInvertFilter)
+ || !isAllowedToTakeFromSlot(fromTile, fromSlot, ForgeDirection.UNKNOWN, fromTile.getStackInSlot(fromSlot)))
+ return 0;
+
+ if (toTile instanceof IInventory) {
+ int[] tPutSlots = null;
+ if (toTile instanceof ISidedInventory sided)
+ tPutSlots = sided.getAccessibleSlotsFromSide(putSide.ordinal());
+
+ if (tPutSlots == null) {
+ tPutSlots = new int[((IInventory) toTile).getSizeInventory()];
+ for (int i = 0; i < tPutSlots.length; i++) tPutSlots[i] = i;
+ }
+
+ byte tMovedItemCount = 0;
+ for (final int tPutSlot : tPutSlots) {
+ if (isAllowedToPutIntoSlot(
+ (IInventory) toTile,
+ tPutSlot,
+ putSide,
+ fromTile.getStackInSlot(fromSlot),
+ aMaxTargetStackSize)) {
+ tMovedItemCount += moveStackFromSlotAToSlotB(
+ fromTile,
+ (IInventory) toTile,
+ fromSlot,
+ tPutSlot,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ (byte) (aMaxMoveAtOnce - tMovedItemCount),
+ aMinMoveAtOnce);
+ if (tMovedItemCount >= aMaxMoveAtOnce) {
+ return tMovedItemCount;
+ }
+ }
+ }
+ if (tMovedItemCount > 0) return tMovedItemCount;
+
+ if (aDoCheckChests && toTile instanceof TileEntityChest tTileEntity2) {
+ if (tTileEntity2.adjacentChestChecked) {
+ if (tTileEntity2.adjacentChestXNeg != null) {
+ tMovedItemCount = moveFromSlotToSide(
+ fromTile,
+ tTileEntity2.adjacentChestXNeg,
+ fromSlot,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ false);
+ } else if (tTileEntity2.adjacentChestZNeg != null) {
+ tMovedItemCount = moveFromSlotToSide(
+ fromTile,
+ tTileEntity2.adjacentChestZNeg,
+ fromSlot,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ false);
+ } else if (tTileEntity2.adjacentChestXPos != null) {
+ tMovedItemCount = moveFromSlotToSide(
+ fromTile,
+ tTileEntity2.adjacentChestXPos,
+ fromSlot,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ false);
+ } else if (tTileEntity2.adjacentChestZPos != null) {
+ tMovedItemCount = moveFromSlotToSide(
+ fromTile,
+ tTileEntity2.adjacentChestZPos,
+ fromSlot,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ false);
+ }
+ if (tMovedItemCount > 0) return tMovedItemCount;
+ }
+ }
+ }
+ return moveStackIntoPipe(
+ fromTile,
+ toTile,
+ new int[] { fromSlot },
+ ForgeDirection.UNKNOWN,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ aDoCheckChests);
+ }
+
+ public static byte moveFromSlotToSide(IInventory fromTile, Object toTile, int fromSlot, ForgeDirection putSide,
+ List<ItemStack> aFilter, boolean aInvertFilter, byte aMaxTargetStackSize, byte aMinTargetStackSize,
+ byte aMaxMoveAtOnce, byte aMinMoveAtOnce) {
+ return moveFromSlotToSide(
+ fromTile,
+ toTile,
+ fromSlot,
+ putSide,
+ aFilter,
+ aInvertFilter,
+ aMaxTargetStackSize,
+ aMinTargetStackSize,
+ aMaxMoveAtOnce,
+ aMinMoveAtOnce,
+ true);
+ }
+
+ /**
+ * Move up to maxAmount amount of fluid from source to dest, with optional filtering via allowMove. note that this
+ * filter cannot bypass filtering done by IFluidHandlers themselves.
+ *
+ * this overload will assume the fill side is the opposite of drainSide
+ *
+ * @param source tank to drain from. method become noop if this is null
+ * @param dest tank to fill to. method become noop if this is null
+ * @param drainSide side used during draining operation
+ * @param maxAmount max amount of fluid to transfer. method become noop if this is not a positive integer
+ * @param allowMove filter. can be null to signal all fluids are accepted
+ */
+ public static void moveFluid(IFluidHandler source, IFluidHandler dest, ForgeDirection drainSide, int maxAmount,
+ @Nullable Predicate<FluidStack> allowMove) {
+ moveFluid(source, dest, drainSide, drainSide.getOpposite(), maxAmount, allowMove);
+ }
+
+ /**
+ * Move up to maxAmount amount of fluid from source to dest, with optional filtering via allowMove. note that this
+ * filter cannot bypass filtering done by IFluidHandlers themselves.
+ *
+ * @param source tank to drain from. method become noop if this is null
+ * @param dest tank to fill to. method become noop if this is null
+ * @param drainSide side used during draining operation
+ * @param fillSide side used during filling operation
+ * @param maxAmount max amount of fluid to transfer. method become noop if this is not a positive integer
+ * @param allowMove filter. can be null to signal all fluids are accepted
+ */
+ public static void moveFluid(IFluidHandler source, IFluidHandler dest, ForgeDirection drainSide,
+ ForgeDirection fillSide, int maxAmount, @Nullable Predicate<FluidStack> allowMove) {
+ if (source == null || dest == null || maxAmount <= 0) return;
+ FluidStack liquid = source.drain(drainSide, maxAmount, false);
+ if (liquid == null) return;
+ liquid = liquid.copy();
+ liquid.amount = dest.fill(fillSide, liquid, false);
+ if (liquid.amount > 0 && (allowMove == null || allowMove.test(liquid))) {
+ dest.fill(fillSide, source.drain(drainSide, liquid.amount, true), true);
+ }
+ }
+
+ public static boolean listContainsItem(Collection<ItemStack> aList, ItemStack aStack, boolean aTIfListEmpty,
+ boolean aInvertFilter) {
+ if (aStack == null || aStack.stackSize < 1) return false;
+ if (aList == null) return aTIfListEmpty;
+ boolean tEmpty = true;
+ for (ItemStack tStack : aList) {
+ if (tStack != null) {
+ tEmpty = false;
+ if (areStacksEqual(aStack, tStack)) {
+ return !aInvertFilter;
+ }
+ }
+ }
+ return tEmpty ? aTIfListEmpty : aInvertFilter;
+ }
+
+ public static boolean areStacksOrToolsEqual(ItemStack aStack1, ItemStack aStack2) {
+ if (aStack1 != null && aStack2 != null && aStack1.getItem() == aStack2.getItem()) {
+ if (aStack1.getItem()
+ .isDamageable()) return true;
+ return ((aStack1.getTagCompound() == null) == (aStack2.getTagCompound() == null))
+ && (aStack1.getTagCompound() == null || aStack1.getTagCompound()
+ .equals(aStack2.getTagCompound()))
+ && (Items.feather.getDamage(aStack1) == Items.feather.getDamage(aStack2)
+ || Items.feather.getDamage(aStack1) == W
+ || Items.feather.getDamage(aStack2) == W);
+ }
+ return false;
+ }
+
+ public static boolean areFluidsEqual(FluidStack aFluid1, FluidStack aFluid2) {
+ return areFluidsEqual(aFluid1, aFluid2, false);
+ }
+
+ public static boolean areFluidsEqual(FluidStack aFluid1, FluidStack aFluid2, boolean aIgnoreNBT) {
+ return aFluid1 != null && aFluid2 != null
+ && aFluid1.getFluid() == aFluid2.getFluid()
+ && (aIgnoreNBT || ((aFluid1.tag == null) == (aFluid2.tag == null))
+ && (aFluid1.tag == null || aFluid1.tag.equals(aFluid2.tag)));
+ }
+
+ public static boolean areStacksEqual(ItemStack aStack1, ItemStack aStack2) {
+ return areStacksEqual(aStack1, aStack2, false);
+ }
+
+ public static boolean areStacksEqual(ItemStack aStack1, ItemStack aStack2, boolean aIgnoreNBT) {
+ return aStack1 != null && aStack2 != null
+ && aStack1.getItem() == aStack2.getItem()
+ && (aIgnoreNBT || (((aStack1.getTagCompound() == null) == (aStack2.getTagCompound() == null))
+ && (aStack1.getTagCompound() == null || aStack1.getTagCompound()
+ .equals(aStack2.getTagCompound()))))
+ && (Items.feather.getDamage(aStack1) == Items.feather.getDamage(aStack2)
+ || Items.feather.getDamage(aStack1) == W
+ || Items.feather.getDamage(aStack2) == W);
+ }
+
+ public static boolean areStacksEqualOrNull(ItemStack stack1, ItemStack stack2) {
+ return (stack1 == null && stack2 == null) || GT_Utility.areStacksEqual(stack1, stack2);
+ }
+
+ /**
+ * Treat both null list, or both null item stack at same list position as equal.
+ * <p>
+ * Since ItemStack doesn't override equals and hashCode, you cannot just use Objects.equals
+ */
+ public static boolean areStackListsEqual(List<ItemStack> lhs, List<ItemStack> rhs, boolean ignoreStackSize,
+ boolean ignoreNBT) {
+ if (lhs == null) return rhs == null;
+ if (rhs == null) return false;
+ if (lhs.size() != rhs.size()) return false;
+ for (Iterator<ItemStack> it1 = lhs.iterator(), it2 = rhs.iterator(); it1.hasNext() && it2.hasNext();) {
+ if (!areStacksEqualExtended(it1.next(), it2.next(), ignoreStackSize, ignoreNBT)) return false;
+ }
+ return true;
+ }
+
+ private static boolean areStacksEqualExtended(ItemStack lhs, ItemStack rhs, boolean ignoreStackSize,
+ boolean ignoreNBT) {
+ if (lhs == null) return rhs == null;
+ if (rhs == null) return false;
+ return lhs.getItem() == rhs.getItem()
+ && (ignoreNBT || Objects.equals(lhs.stackTagCompound, rhs.stackTagCompound))
+ && (ignoreStackSize || lhs.stackSize == rhs.stackSize);
+ }
+
+ public static boolean areUnificationsEqual(ItemStack aStack1, ItemStack aStack2) {
+ return areUnificationsEqual(aStack1, aStack2, false);
+ }
+
+ public static boolean areUnificationsEqual(ItemStack aStack1, ItemStack aStack2, boolean aIgnoreNBT) {
+ return areStacksEqual(
+ GT_OreDictUnificator.get_nocopy(aStack1),
+ GT_OreDictUnificator.get_nocopy(aStack2),
+ aIgnoreNBT);
+ }
+
+ public static String getFluidName(Fluid aFluid, boolean aLocalized) {
+ if (aFluid == null) return E;
+ String rName = aLocalized ? aFluid.getLocalizedName(new FluidStack(aFluid, 0)) : aFluid.getUnlocalizedName();
+ if (rName.contains("fluid.") || rName.contains("tile.")) return capitalizeString(
+ rName.replaceAll("fluid.", E)
+ .replaceAll("tile.", E));
+ return rName;
+ }
+
+ public static String getFluidName(FluidStack aFluid, boolean aLocalized) {
+ if (aFluid == null) return E;
+ return getFluidName(aFluid.getFluid(), aLocalized);
+ }
+
+ public static void reInit() {
+ sFilledContainerToData.clear();
+ sEmptyContainerToFluidToData.clear();
+ sFluidToContainers.clear();
+ for (FluidContainerData tData : sFluidContainerList) {
+ String fluidName = tData.fluid.getFluid()
+ .getName();
+ sFilledContainerToData.put(new GT_ItemStack(tData.filledContainer), tData);
+ Map<String, FluidContainerData> tFluidToContainer = sEmptyContainerToFluidToData
+ .get(new GT_ItemStack(tData.emptyContainer));
+ List<ItemStack> tContainers = sFluidToContainers.get(fluidName);
+ if (tFluidToContainer == null) {
+ sEmptyContainerToFluidToData
+ .put(new GT_ItemStack(tData.emptyContainer), tFluidToContainer = new /* Concurrent */ HashMap<>());
+ }
+ tFluidToContainer.put(fluidName, tData);
+ if (tContainers == null) {
+ tContainers = new ArrayList<>();
+ tContainers.add(tData.filledContainer);
+ sFluidToContainers.put(fluidName, tContainers);
+ } else tContainers.add(tData.filledContainer);
+ }
+ }
+
+ public static void addFluidContainerData(FluidContainerData aData) {
+ String fluidName = aData.fluid.getFluid()
+ .getName();
+ sFluidContainerList.add(aData);
+ sFilledContainerToData.put(new GT_ItemStack(aData.filledContainer), aData);
+ Map<String, FluidContainerData> tFluidToContainer = sEmptyContainerToFluidToData
+ .get(new GT_ItemStack(aData.emptyContainer));
+ List<ItemStack> tContainers = sFluidToContainers.get(fluidName);
+ if (tFluidToContainer == null) {
+ sEmptyContainerToFluidToData
+ .put(new GT_ItemStack(aData.emptyContainer), tFluidToContainer = new /* Concurrent */ HashMap<>());
+ }
+ tFluidToContainer.put(fluidName, aData);
+ if (tContainers == null) {
+ tContainers = new ArrayList<>();
+ tContainers.add(aData.filledContainer);
+ sFluidToContainers.put(fluidName, tContainers);
+ } else tContainers.add(aData.filledContainer);
+ }
+
+ public static List<ItemStack> getContainersFromFluid(FluidStack tFluidStack) {
+ if (tFluidStack != null) {
+ List<ItemStack> tContainers = sFluidToContainers.get(
+ tFluidStack.getFluid()
+ .getName());
+ if (tContainers == null) return new ArrayList<>();
+ return tContainers;
+ }
+ return new ArrayList<>();
+ }
+
+ public static ItemStack fillFluidContainer(FluidStack aFluid, ItemStack aStack, boolean aRemoveFluidDirectly,
+ boolean aCheckIFluidContainerItems) {
+ if (isStackInvalid(aStack) || aFluid == null) return null;
+ if (GT_ModHandler.isWater(aFluid) && ItemList.Bottle_Empty.isStackEqual(aStack)) {
+ if (aFluid.amount >= 1000) {
+ return new ItemStack(Items.potionitem, 1, 0);
+ }
+ return null;
+ }
+ if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem
+ && ((IFluidContainerItem) aStack.getItem()).getFluid(aStack) == null
+ && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) <= aFluid.amount) {
+ if (aRemoveFluidDirectly) aFluid.amount -= ((IFluidContainerItem) aStack.getItem())
+ .fill(aStack = copyAmount(1, aStack), aFluid, true);
+ else((IFluidContainerItem) aStack.getItem()).fill(aStack = copyAmount(1, aStack), aFluid, true);
+ return aStack;
+ }
+ Map<String, FluidContainerData> tFluidToContainer = sEmptyContainerToFluidToData.get(new GT_ItemStack(aStack));
+ if (tFluidToContainer == null) return null;
+ FluidContainerData tData = tFluidToContainer.get(
+ aFluid.getFluid()
+ .getName());
+ if (tData == null || tData.fluid.amount > aFluid.amount) return null;
+ if (aRemoveFluidDirectly) aFluid.amount -= tData.fluid.amount;
+ return copyAmount(1, tData.filledContainer);
+ }
+
+ public static int calculateRecipeEU(Materials aMaterial, int defaultRecipeEUPerTick) {
+ return aMaterial.getProcessingMaterialTierEU() == 0 ? defaultRecipeEUPerTick
+ : aMaterial.getProcessingMaterialTierEU();
+ }
+
+ public static ItemStack getFluidDisplayStack(Fluid aFluid) {
+ return aFluid == null ? null : getFluidDisplayStack(new FluidStack(aFluid, 0), false);
+ }
+
+ public static ItemStack getFluidDisplayStack(FluidStack aFluid, boolean aUseStackSize) {
+ return getFluidDisplayStack(aFluid, aUseStackSize, false);
+ }
+
+ public static ItemStack getFluidDisplayStack(FluidStack aFluid, boolean aUseStackSize, boolean aHideStackSize) {
+ if (aFluid == null || aFluid.getFluid() == null) return null;
+ int tmp = 0;
+ try {
+ tmp = aFluid.getFluid()
+ .getID();
+ } catch (Exception e) {
+ System.err.println(e);
+ }
+ ItemStack rStack = ItemList.Display_Fluid.getWithDamage(1, tmp);
+ NBTTagCompound tNBT = new NBTTagCompound();
+ tNBT.setLong("mFluidDisplayAmount", aUseStackSize ? aFluid.amount : 0);
+ tNBT.setLong(
+ "mFluidDisplayHeat",
+ aFluid.getFluid()
+ .getTemperature(aFluid));
+ tNBT.setBoolean(
+ "mFluidState",
+ aFluid.getFluid()
+ .isGaseous(aFluid));
+ tNBT.setBoolean("mHideStackSize", aHideStackSize);
+ try {
+ tNBT.setString("mFluidMaterialName", FLUID_MAP.get(aFluid.getFluid()).mName);
+ } catch (Exception ignored) {}
+ rStack.setTagCompound(tNBT);
+ return rStack;
+ }
+
+ public static FluidStack getFluidFromDisplayStack(ItemStack aDisplayStack) {
+ if (!isStackValid(aDisplayStack) || aDisplayStack.getItem() != ItemList.Display_Fluid.getItem()
+ || !aDisplayStack.hasTagCompound()) return null;
+ Fluid tFluid = FluidRegistry.getFluid(
+ ItemList.Display_Fluid.getItem()
+ .getDamage(aDisplayStack));
+ return new FluidStack(
+ tFluid,
+ (int) aDisplayStack.getTagCompound()
+ .getLong("mFluidDisplayAmount"));
+ }
+
+ public static boolean containsFluid(ItemStack aStack, FluidStack aFluid, boolean aCheckIFluidContainerItems) {
+ if (isStackInvalid(aStack) || aFluid == null) return false;
+ if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem
+ && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0)
+ return aFluid
+ .isFluidEqual(((IFluidContainerItem) aStack.getItem()).getFluid(aStack = copyAmount(1, aStack)));
+ FluidContainerData tData = sFilledContainerToData.get(new GT_ItemStack(aStack));
+ return tData != null && tData.fluid.isFluidEqual(aFluid);
+ }
+
+ public static FluidStack getFluidForFilledItem(ItemStack aStack, boolean aCheckIFluidContainerItems) {
+ if (isStackInvalid(aStack)) return null;
+ if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem
+ && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0)
+ return ((IFluidContainerItem) aStack.getItem()).drain(copyAmount(1, aStack), Integer.MAX_VALUE, true);
+ FluidContainerData tData = sFilledContainerToData.get(new GT_ItemStack(aStack));
+ return tData == null ? null : tData.fluid.copy();
+ }
+
+ /**
+ * Get empty fluid container from filled one.
+ */
+ public static ItemStack getContainerForFilledItem(ItemStack aStack, boolean aCheckIFluidContainerItems) {
+ if (isStackInvalid(aStack)) return null;
+ FluidContainerData tData = sFilledContainerToData.get(new GT_ItemStack(aStack));
+ if (tData != null) return copyAmount(1, tData.emptyContainer);
+ if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem
+ && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0) {
+ ((IFluidContainerItem) aStack.getItem()).drain(aStack = copyAmount(1, aStack), Integer.MAX_VALUE, true);
+ return aStack;
+ }
+ return null;
+ }
+
+ /**
+ * This is NOT meant for fluid manipulation! It's for getting item container, which is generally used for
+ * crafting recipes. While it also works for many of the fluid containers, some don't.
+ * <p>
+ * Use {@link #getContainerForFilledItem} for getting empty fluid container.
+ */
+ public static ItemStack getContainerItem(ItemStack aStack, boolean aCheckIFluidContainerItems) {
+ if (isStackInvalid(aStack)) return null;
+ if (aStack.getItem()
+ .hasContainerItem(aStack))
+ return aStack.getItem()
+ .getContainerItem(aStack);
+ /*
+ * These are all special Cases, in which it is intended to have only GT Blocks outputting those Container Items
+ */
+ if (ItemList.Cell_Empty.isStackEqual(aStack, false, true)) return null;
+ if (aStack.getItem() == Items.potionitem || aStack.getItem() == Items.experience_bottle
+ || ItemList.TF_Vial_FieryBlood.isStackEqual(aStack)
+ || ItemList.TF_Vial_FieryTears.isStackEqual(aStack)) return ItemList.Bottle_Empty.get(1);
+
+ if (aCheckIFluidContainerItems && aStack.getItem() instanceof IFluidContainerItem
+ && ((IFluidContainerItem) aStack.getItem()).getCapacity(aStack) > 0) {
+ ItemStack tStack = copyAmount(1, aStack);
+ ((IFluidContainerItem) aStack.getItem()).drain(tStack, Integer.MAX_VALUE, true);
+ if (!areStacksEqual(aStack, tStack)) return tStack;
+ return null;
+ }
+
+ int tCapsuleCount = GT_ModHandler.getCapsuleCellContainerCount(aStack);
+ if (tCapsuleCount > 0) return ItemList.Cell_Empty.get(tCapsuleCount);
+
+ if (ItemList.IC2_ForgeHammer.isStackEqual(aStack) || ItemList.IC2_WireCutter.isStackEqual(aStack))
+ return copyMetaData(Items.feather.getDamage(aStack) + 1, aStack);
+ return null;
+ }
+
+ public static FluidStack getFluidFromContainerOrFluidDisplay(ItemStack stack) {
+ FluidStack fluidStack = GT_Utility.getFluidForFilledItem(stack, true);
+ if (fluidStack == null) {
+ fluidStack = GT_Utility.getFluidFromDisplayStack(stack);
+ }
+ return fluidStack;
+ }
+
+ public static synchronized boolean removeIC2BottleRecipe(ItemStack aContainer, ItemStack aInput,
+ Map<ic2.api.recipe.ICannerBottleRecipeManager.Input, RecipeOutput> aRecipeList, ItemStack aOutput) {
+ if ((isStackInvalid(aInput) && isStackInvalid(aOutput) && isStackInvalid(aContainer)) || aRecipeList == null)
+ return false;
+ boolean rReturn = false;
+ Iterator<Map.Entry<ic2.api.recipe.ICannerBottleRecipeManager.Input, RecipeOutput>> tIterator = aRecipeList
+ .entrySet()
+ .iterator();
+ aOutput = GT_OreDictUnificator.get(aOutput);
+ while (tIterator.hasNext()) {
+ Map.Entry<ic2.api.recipe.ICannerBottleRecipeManager.Input, RecipeOutput> tEntry = tIterator.next();
+ if (aInput == null || tEntry.getKey()
+ .matches(aContainer, aInput)) {
+ List<ItemStack> tList = tEntry.getValue().items;
+ if (tList != null) for (ItemStack tOutput : tList)
+ if (aOutput == null || areStacksEqual(GT_OreDictUnificator.get(tOutput), aOutput)) {
+ tIterator.remove();
+ rReturn = true;
+ break;
+ }
+ }
+ }
+ return rReturn;
+ }
+
+ public static synchronized boolean removeSimpleIC2MachineRecipe(ItemStack aInput,
+ Map<IRecipeInput, RecipeOutput> aRecipeList, ItemStack aOutput) {
+ if ((isStackInvalid(aInput) && isStackInvalid(aOutput)) || aRecipeList == null) return false;
+ boolean rReturn = false;
+ Iterator<Map.Entry<IRecipeInput, RecipeOutput>> tIterator = aRecipeList.entrySet()
+ .iterator();
+ aOutput = GT_OreDictUnificator.get(aOutput);
+ while (tIterator.hasNext()) {
+ Map.Entry<IRecipeInput, RecipeOutput> tEntry = tIterator.next();
+ if (aInput == null || tEntry.getKey()
+ .matches(aInput)) {
+ List<ItemStack> tList = tEntry.getValue().items;
+ if (tList != null) for (ItemStack tOutput : tList)
+ if (aOutput == null || areStacksEqual(GT_OreDictUnificator.get(tOutput), aOutput)) {
+ tIterator.remove();
+ rReturn = true;
+ break;
+ }
+ }
+ }
+ return rReturn;
+ }
+
+ public static synchronized void bulkRemoveSimpleIC2MachineRecipe(Map<ItemStack, ItemStack> toRemove,
+ Map<IRecipeInput, RecipeOutput> aRecipeList) {
+ if (aRecipeList == null || aRecipeList.isEmpty()) return;
+ toRemove.entrySet()
+ .removeIf(aEntry -> (isStackInvalid(aEntry.getKey()) && isStackInvalid(aEntry.getValue())));
+ final Map<ItemStack, ItemStack> finalToRemove = Maps
+ .transformValues(toRemove, GT_OreDictUnificator::get_nocopy);
+
+ aRecipeList.entrySet()
+ .removeIf(
+ tEntry -> finalToRemove.entrySet()
+ .stream()
+ .anyMatch(aEntry -> {
+ final ItemStack aInput = aEntry.getKey(), aOutput = aEntry.getValue();
+ final List<ItemStack> tList = tEntry.getValue().items;
+
+ if (tList == null) return false;
+ if (aInput != null && !tEntry.getKey()
+ .matches(aInput)) return false;
+
+ return tList.stream()
+ .anyMatch(
+ tOutput -> (aOutput == null
+ || areStacksEqual(GT_OreDictUnificator.get(tOutput), aOutput)));
+ }));
+ }
+
+ public static boolean addSimpleIC2MachineRecipe(ItemStack aInput, Map<IRecipeInput, RecipeOutput> aRecipeList,
+ NBTTagCompound aNBT, Object... aOutput) {
+ if (isStackInvalid(aInput) || aOutput.length == 0 || aRecipeList == null) return false;
+ ItemData tOreName = GT_OreDictUnificator.getAssociation(aInput);
+ for (Object o : aOutput) {
+ if (o == null) {
+ GT_FML_LOGGER.info("EmptyIC2Output!" + aInput.getUnlocalizedName());
+ return false;
+ }
+ }
+ ItemStack[] tStack = GT_OreDictUnificator.getStackArray(true, aOutput);
+ if (tStack.length > 0 && areStacksEqual(aInput, tStack[0])) return false;
+ if (tOreName != null) {
+ if (tOreName.toString()
+ .equals("dustAsh")
+ && tStack[0].getUnlocalizedName()
+ .equals("tile.volcanicAsh"))
+ return false;
+ aRecipeList
+ .put(new RecipeInputOreDict(tOreName.toString(), aInput.stackSize), new RecipeOutput(aNBT, tStack));
+ } else {
+ aRecipeList
+ .put(new RecipeInputItemStack(copyOrNull(aInput), aInput.stackSize), new RecipeOutput(aNBT, tStack));
+ }
+ return true;
+ }
+
+ public static ItemStack getWrittenBook(String aMapping, ItemStack aStackToPutNBT) {
+ if (isStringInvalid(aMapping)) return null;
+ ItemStack rStack = GregTech_API.sBookList.get(aMapping);
+ if (rStack == null) return aStackToPutNBT;
+ if (aStackToPutNBT != null) {
+ aStackToPutNBT.setTagCompound(rStack.getTagCompound());
+ return aStackToPutNBT;
+ }
+ return copyAmount(1, rStack);
+ }
+
+ public static ItemStack getWrittenBook(String aMapping, String aTitle, String aAuthor, String... aPages) {
+ if (isStringInvalid(aMapping)) return null;
+ ItemStack rStack = GregTech_API.sBookList.get(aMapping);
+ if (rStack != null) return copyAmount(1, rStack);
+ if (isStringInvalid(aTitle) || isStringInvalid(aAuthor) || aPages.length == 0) return null;
+ sBookCount++;
+ rStack = new ItemStack(Items.written_book, 1);
+ NBTTagCompound tNBT = new NBTTagCompound();
+ tNBT.setString("title", GT_LanguageManager.addStringLocalization("Book." + aTitle + ".Name", aTitle));
+ tNBT.setString("author", aAuthor);
+ NBTTagList tNBTList = new NBTTagList();
+ for (byte i = 0; i < aPages.length; i++) {
+ aPages[i] = GT_LanguageManager
+ .addStringLocalization("Book." + aTitle + ".Page" + ((i < 10) ? "0" + i : i), aPages[i]);
+ if (i < 48) {
+ if (aPages[i].length() < 256) tNBTList.appendTag(new NBTTagString(aPages[i]));
+ else GT_Log.err.println("WARNING: String for written Book too long! -> " + aPages[i]);
+ } else {
+ GT_Log.err.println("WARNING: Too much Pages for written Book! -> " + aTitle);
+ break;
+ }
+ }
+ tNBTList.appendTag(
+ new NBTTagString(
+ "Credits to " + aAuthor
+ + " for writing this Book. This was Book Nr. "
+ + sBookCount
+ + " at its creation. Gotta get 'em all!"));
+ tNBT.setTag("pages", tNBTList);
+ rStack.setTagCompound(tNBT);
+ GT_Log.out.println(
+ "GT_Mod: Added Book to Book List - Mapping: '" + aMapping
+ + "' - Name: '"
+ + aTitle
+ + "' - Author: '"
+ + aAuthor
+ + "'");
+ GregTech_API.sBookList.put(aMapping, rStack);
+ return copyOrNull(rStack);
+ }
+
+ public static boolean doSoundAtClient(String aSoundName, int aTimeUntilNextSound, float aSoundStrength) {
+ if (aSoundName == null) return false;
+ return doSoundAtClient(aSoundName, aTimeUntilNextSound, aSoundStrength, GT.getThePlayer());
+ }
+
+ public static boolean doSoundAtClient(SoundResource sound, int aTimeUntilNextSound, float aSoundStrength) {
+ return doSoundAtClient(sound.resourceLocation, aTimeUntilNextSound, aSoundStrength, GT.getThePlayer());
+ }
+
+ public static boolean doSoundAtClient(ResourceLocation aSoundResourceLocation, int aTimeUntilNextSound,
+ float aSoundStrength) {
+ return doSoundAtClient(aSoundResourceLocation, aTimeUntilNextSound, aSoundStrength, GT.getThePlayer());
+ }
+
+ public static boolean doSoundAtClient(String aSoundName, int aTimeUntilNextSound, float aSoundStrength,
+ Entity aEntity) {
+ if (aEntity == null || aSoundName == null) return false;
+ return doSoundAtClient(
+ aSoundName,
+ aTimeUntilNextSound,
+ aSoundStrength,
+ aEntity.posX,
+ aEntity.posY,
+ aEntity.posZ);
+ }
+
+ public static boolean doSoundAtClient(ResourceLocation aSoundResourceLocation, int aTimeUntilNextSound,
+ float aSoundStrength, Entity aEntity) {
+ if (aEntity == null) return false;
+ return doSoundAtClient(
+ aSoundResourceLocation.toString(),
+ aTimeUntilNextSound,
+ aSoundStrength,
+ aEntity.posX,
+ aEntity.posY,
+ aEntity.posZ);
+ }
+
+ public static boolean doSoundAtClient(ResourceLocation aSoundResourceLocation, int aTimeUntilNextSound,
+ float aSoundStrength, double aX, double aY, double aZ) {
+ return doSoundAtClient(aSoundResourceLocation, aTimeUntilNextSound, aSoundStrength, 1.01818028F, aX, aY, aZ);
+ }
+
+ /**
+ * @inheritDoc
+ * @deprecated Use {@link #doSoundAtClient(ResourceLocation, int, float, double, double, double)}
+ */
+ @Deprecated
+ public static boolean doSoundAtClient(String aSoundName, int aTimeUntilNextSound, float aSoundStrength, double aX,
+ double aY, double aZ) {
+ if (aSoundName == null) return false;
+ return doSoundAtClient(
+ new ResourceLocation(aSoundName),
+ aTimeUntilNextSound,
+ aSoundStrength,
+ 1.01818028F,
+ aX,
+ aY,
+ aZ);
+ }
+
+ public static boolean doSoundAtClient(SoundResource aSound, int aTimeUntilNextSound, float aSoundStrength,
+ double aX, double aY, double aZ) {
+ return doSoundAtClient(aSound.resourceLocation, aTimeUntilNextSound, aSoundStrength, aX, aY, aZ);
+ }
+
+ public static boolean doSoundAtClient(SoundResource aSound, int aTimeUntilNextSound, float aSoundStrength,
+ float aSoundModulation, double aX, double aY, double aZ) {
+ return doSoundAtClient(
+ aSound.resourceLocation,
+ aTimeUntilNextSound,
+ aSoundStrength,
+ aSoundModulation,
+ aX,
+ aY,
+ aZ);
+ }
+
+ public static boolean doSoundAtClient(ResourceLocation aSoundResourceLocation, int aTimeUntilNextSound,
+ float aSoundStrength, float aSoundModulation, double aX, double aY, double aZ) {
+ if (!FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isClient() || GT.getThePlayer() == null || !GT.getThePlayer().worldObj.isRemote) return false;
+ if (GregTech_API.sMultiThreadedSounds) new Thread(
+ new GT_Runnable_Sound(
+ GT.getThePlayer().worldObj,
+ aX,
+ aY,
+ aZ,
+ aTimeUntilNextSound,
+ aSoundResourceLocation,
+ aSoundStrength,
+ aSoundModulation),
+ "Sound Effect").start();
+ else new GT_Runnable_Sound(
+ GT.getThePlayer().worldObj,
+ aX,
+ aY,
+ aZ,
+ aTimeUntilNextSound,
+ aSoundResourceLocation,
+ aSoundStrength,
+ aSoundModulation).run();
+ return true;
+ }
+
+ /**
+ * @inheritDoc
+ * @Deprecated Use {@link #doSoundAtClient(ResourceLocation, int, float, float, double, double, double)}
+ */
+ @Deprecated
+ public static boolean doSoundAtClient(String aSoundName, int aTimeUntilNextSound, float aSoundStrength,
+ float aSoundModulation, double aX, double aY, double aZ) {
+ if (isStringInvalid(aSoundName)) return false;
+ return doSoundAtClient(
+ new ResourceLocation(aSoundName),
+ aTimeUntilNextSound,
+ aSoundStrength,
+ aSoundModulation,
+ aX,
+ aY,
+ aZ);
+ }
+
+ public static boolean sendSoundToPlayers(World aWorld, String aSoundName, float aSoundStrength,
+ float aSoundModulation, int aX, int aY, int aZ) {
+ if (isStringInvalid(aSoundName) || aWorld == null || aWorld.isRemote) return false;
+ NW.sendPacketToAllPlayersInRange(
+ aWorld,
+ new GT_Packet_Sound(aSoundName, aSoundStrength, aSoundModulation, aX, (short) aY, aZ),
+ aX,
+ aZ);
+ return true;
+ }
+
+ public static boolean sendSoundToPlayers(World aWorld, SoundResource sound, float aSoundStrength,
+ float aSoundModulation, int aX, int aY, int aZ) {
+ if (aWorld == null || aWorld.isRemote) return false;
+ NW.sendPacketToAllPlayersInRange(
+ aWorld,
+ new GT_Packet_Sound(
+ sound.resourceLocation.toString(),
+ aSoundStrength,
+ aSoundModulation,
+ aX,
+ (short) aY,
+ aZ),
+ aX,
+ aZ);
+ return true;
+ }
+
+ public static int stackToInt(ItemStack aStack) {
+ if (isStackInvalid(aStack)) return 0;
+ return itemToInt(aStack.getItem(), Items.feather.getDamage(aStack));
+ }
+
+ public static int itemToInt(Item aItem, int aMeta) {
+ return Item.getIdFromItem(aItem) | (aMeta << 16);
+ }
+
+ public static int stackToWildcard(ItemStack aStack) {
+ if (isStackInvalid(aStack)) return 0;
+ return Item.getIdFromItem(aStack.getItem()) | (W << 16);
+ }
+
+ public static ItemStack intToStack(int aStack) {
+ int tID = aStack & (~0 >>> 16), tMeta = aStack >>> 16;
+ Item tItem = Item.getItemById(tID);
+ if (tItem != null) return new ItemStack(tItem, 1, tMeta);
+ return null;
+ }
+
+ public static Integer[] stacksToIntegerArray(ItemStack... aStacks) {
+ Integer[] rArray = new Integer[aStacks.length];
+ for (int i = 0; i < rArray.length; i++) {
+ rArray[i] = stackToInt(aStacks[i]);
+ }
+ return rArray;
+ }
+
+ public static int[] stacksToIntArray(ItemStack... aStacks) {
+ int[] rArray = new int[aStacks.length];
+ for (int i = 0; i < rArray.length; i++) {
+ rArray[i] = stackToInt(aStacks[i]);
+ }
+ return rArray;
+ }
+
+ public static boolean arrayContains(Object aObject, Object... aObjects) {
+ return listContains(aObject, Arrays.asList(aObjects));
+ }
+
+ public static boolean listContains(Object aObject, Collection<?> aObjects) {
+ if (aObjects == null) return false;
+ return aObjects.contains(aObject);
+ }
+
+ @SafeVarargs
+ public static <T> boolean arrayContainsNonNull(T... aArray) {
+ if (aArray != null) for (Object tObject : aArray) if (tObject != null) return true;
+ return false;
+ }
+
+ /**
+ * Note: use {@link ArrayExt#withoutNulls(Object[], IntFunction)} if you want an array as a result.
+ */
+ @SafeVarargs
+ public static <T> ArrayList<T> getArrayListWithoutNulls(T... aArray) {
+ if (aArray == null) return new ArrayList<>();
+ ArrayList<T> rList = new ArrayList<>(Arrays.asList(aArray));
+ for (int i = 0; i < rList.size(); i++) if (rList.get(i) == null) rList.remove(i--);
+ return rList;
+ }
+
+ /**
+ * Note: use {@link ArrayExt#withoutTrailingNulls(Object[], IntFunction)} if you want an array as a result.
+ */
+ @SafeVarargs
+ public static <T> ArrayList<T> getArrayListWithoutTrailingNulls(T... aArray) {
+ if (aArray == null) return new ArrayList<>();
+ ArrayList<T> rList = new ArrayList<>(Arrays.asList(aArray));
+ for (int i = rList.size() - 1; i >= 0 && rList.get(i) == null;) rList.remove(i--);
+ return rList;
+ }
+
+ @Deprecated // why do you use Objects?
+ public static Block getBlock(Object aBlock) {
+ return (Block) aBlock;
+ }
+
+ public static Block getBlockFromStack(ItemStack itemStack) {
+ if (isStackInvalid(itemStack)) return Blocks.air;
+ return getBlockFromItem(itemStack.getItem());
+ }
+
+ public static Block getBlockFromItem(Item item) {
+ return Block.getBlockFromItem(item);
+ }
+
+ @Deprecated // why do you use Objects? And if you want to check your block to be not null, check it directly!
+ public static boolean isBlockValid(Object aBlock) {
+ return (aBlock instanceof Block);
+ }
+
+ @Deprecated // why do you use Objects? And if you want to check your block to be null, check it directly!
+ public static boolean isBlockInvalid(Object aBlock) {
+ return !(aBlock instanceof Block);
+ }
+
+ public static boolean isStringValid(Object aString) {
+ return aString != null && !aString.toString()
+ .isEmpty();
+ }
+
+ public static boolean isStringInvalid(Object aString) {
+ return aString == null || aString.toString()
+ .isEmpty();
+ }
+
+ @Deprecated
+ public static boolean isStackValid(Object aStack) {
+ return (aStack instanceof ItemStack stack) && isStackValid(stack);
+ }
+
+ public static boolean isStackValid(ItemStack aStack) {
+ return (aStack != null) && aStack.getItem() != null && aStack.stackSize >= 0;
+ }
+
+ @Deprecated
+ public static boolean isStackInvalid(Object aStack) {
+ return !(aStack instanceof ItemStack stack) || isStackInvalid(stack);
+ }
+
+ public static boolean isStackInvalid(ItemStack aStack) {
+ return aStack == null || aStack.getItem() == null || aStack.stackSize < 0;
+ }
+
+ public static boolean isDebugItem(ItemStack aStack) {
+ return /* ItemList.Armor_Cheat.isStackEqual(aStack, T, T) || */ areStacksEqual(
+ GT_ModHandler.getIC2Item("debug", 1),
+ aStack,
+ true);
+ }
+
+ public static ItemStack updateItemStack(ItemStack aStack) {
+ if (isStackValid(aStack) && aStack.getItem() instanceof GT_Generic_Item)
+ ((GT_Generic_Item) aStack.getItem()).isItemStackUsable(aStack);
+ return aStack;
+ }
+
+ public static boolean isOpaqueBlock(World aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlock(aX, aY, aZ)
+ .isOpaqueCube();
+ }
+
+ public static boolean isBlockAir(World aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlock(aX, aY, aZ)
+ .isAir(aWorld, aX, aY, aZ);
+ }
+
+ public static boolean hasBlockHitBox(World aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlock(aX, aY, aZ)
+ .getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ) != null;
+ }
+
+ public static void setCoordsOnFire(World aWorld, int aX, int aY, int aZ, boolean aReplaceCenter) {
+ if (aReplaceCenter) if (aWorld.getBlock(aX, aY, aZ)
+ .getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ) == null) aWorld.setBlock(aX, aY, aZ, Blocks.fire);
+ if (aWorld.getBlock(aX + 1, aY, aZ)
+ .getCollisionBoundingBoxFromPool(aWorld, aX + 1, aY, aZ) == null)
+ aWorld.setBlock(aX + 1, aY, aZ, Blocks.fire);
+ if (aWorld.getBlock(aX - 1, aY, aZ)
+ .getCollisionBoundingBoxFromPool(aWorld, aX - 1, aY, aZ) == null)
+ aWorld.setBlock(aX - 1, aY, aZ, Blocks.fire);
+ if (aWorld.getBlock(aX, aY + 1, aZ)
+ .getCollisionBoundingBoxFromPool(aWorld, aX, aY + 1, aZ) == null)
+ aWorld.setBlock(aX, aY + 1, aZ, Blocks.fire);
+ if (aWorld.getBlock(aX, aY - 1, aZ)
+ .getCollisionBoundingBoxFromPool(aWorld, aX, aY - 1, aZ) == null)
+ aWorld.setBlock(aX, aY - 1, aZ, Blocks.fire);
+ if (aWorld.getBlock(aX, aY, aZ + 1)
+ .getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ + 1) == null)
+ aWorld.setBlock(aX, aY, aZ + 1, Blocks.fire);
+ if (aWorld.getBlock(aX, aY, aZ - 1)
+ .getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ - 1) == null)
+ aWorld.setBlock(aX, aY, aZ - 1, Blocks.fire);
+ }
+
+ public static ItemStack getProjectile(SubTag aProjectileType, IInventory aInventory) {
+ if (aInventory != null) for (int i = 0, j = aInventory.getSizeInventory(); i < j; i++) {
+ ItemStack rStack = aInventory.getStackInSlot(i);
+ if (isStackValid(rStack) && rStack.getItem() instanceof IProjectileItem
+ && ((IProjectileItem) rStack.getItem()).hasProjectile(aProjectileType, rStack))
+ return updateItemStack(rStack);
+ }
+ return null;
+ }
+
+ public static void removeNullStacksFromInventory(IInventory aInventory) {
+ if (aInventory != null) for (int i = 0, j = aInventory.getSizeInventory(); i < j; i++) {
+ ItemStack tStack = aInventory.getStackInSlot(i);
+ if (tStack != null && (tStack.stackSize == 0 || tStack.getItem() == null))
+ aInventory.setInventorySlotContents(i, null);
+ }
+ }
+
+ /**
+ * Initializes new empty texture page for casings page 0 is old CASING_BLOCKS
+ * <p>
+ * Then casings should be registered like this: for (byte i = MIN_USED_META; i < MAX_USED_META; i = (byte) (i + 1))
+ * { Textures.BlockIcons.casingTexturePages[PAGE][i+START_INDEX] = new GT_CopiedBlockTexture(this, 6, i); }
+ *
+ * @param page 0 to 127
+ * @return true if it made empty page, false if one already existed...
+ */
+ public static boolean addTexturePage(byte page) {
+ if (Textures.BlockIcons.casingTexturePages[page] == null) {
+ Textures.BlockIcons.casingTexturePages[page] = new ITexture[128];
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Return texture id from page and index, for use when determining hatches, but can also be precomputed from:
+ * (page<<7)+index
+ *
+ * @param page 0 to 127 page
+ * @param index 0 to 127 texture index
+ * @return casing texture 0 to 16383
+ */
+ public static int getTextureId(byte page, byte index) {
+ if (page >= 0 && index >= 0) {
+ return (page << 7) + index;
+ }
+ throw new RuntimeException("Index out of range: [" + page + "][" + index + "]");
+ }
+
+ /**
+ * Return texture id from page and index, for use when determining hatches, but can also be precomputed from:
+ * (page<<7)+index
+ *
+ * @param page 0 to 127 page
+ * @param startIndex 0 to 127 start texture index
+ * @param blockMeta meta of the block
+ * @return casing texture 0 to 16383
+ */
+ public static int getTextureId(byte page, byte startIndex, byte blockMeta) {
+ if (page >= 0 && startIndex >= 0 && blockMeta >= 0 && (startIndex + blockMeta) <= 127) {
+ return (page << 7) + (startIndex + blockMeta);
+ }
+ throw new RuntimeException(
+ "Index out of range: [" + page
+ + "]["
+ + startIndex
+ + "+"
+ + blockMeta
+ + "="
+ + (startIndex + blockMeta)
+ + "]");
+ }
+
+ /**
+ * Return texture id from item stack, unoptimized but readable?
+ *
+ * @return casing texture 0 to 16383
+ */
+ @Deprecated
+ public static int getTextureId(ItemStack stack) {
+ return getTextureId(Block.getBlockFromItem(stack.getItem()), (byte) stack.getItemDamage());
+ }
+
+ /**
+ * Return texture id from item stack, unoptimized but readable?
+ *
+ * @return casing texture 0 to 16383
+ */
+ public static int getTextureId(Block blockFromBlock, byte metaFromBlock) {
+ for (int page = 0; page < Textures.BlockIcons.casingTexturePages.length; page++) {
+ ITexture[] casingTexturePage = Textures.BlockIcons.casingTexturePages[page];
+ if (casingTexturePage != null) {
+ for (int index = 0; index < casingTexturePage.length; index++) {
+ ITexture iTexture = casingTexturePage[index];
+ if (iTexture instanceof IBlockContainer) {
+ Block block = ((IBlockContainer) iTexture).getBlock();
+ byte meta = ((IBlockContainer) iTexture).getMeta();
+ if (meta == metaFromBlock && blockFromBlock == block) {
+ return (page << 7) + index;
+ }
+ }
+ }
+ }
+ }
+ throw new RuntimeException(
+ "Probably missing mapping or different texture class used for: " + blockFromBlock.getUnlocalizedName()
+ + " meta:"
+ + metaFromBlock);
+ }
+
+ /**
+ * Converts a Number to a String
+ */
+ public static String parseNumberToString(int aNumber) {
+ boolean temp = true, negative = false;
+
+ if (aNumber < 0) {
+ aNumber *= -1;
+ negative = true;
+ }
+
+ StringBuilder tStringB = new StringBuilder();
+ for (int i = 1000000000; i > 0; i /= 10) {
+ int tDigit = (aNumber / i) % 10;
+ if (temp && tDigit != 0) temp = false;
+ if (!temp) {
+ tStringB.append(tDigit);
+ if (i != 1) for (int j = i; j > 0; j /= 1000) if (j == 1) tStringB.append(",");
+ }
+ }
+
+ String tString = tStringB.toString();
+
+ if (tString.equals(E)) tString = "0";
+
+ return negative ? "-" + tString : tString;
+ }
+
+ public static NBTTagCompound getNBTContainingBoolean(NBTTagCompound aNBT, Object aTag, boolean aValue) {
+ if (aNBT == null) aNBT = new NBTTagCompound();
+ aNBT.setBoolean(aTag.toString(), aValue);
+ return aNBT;
+ }
+
+ public static NBTTagCompound getNBTContainingByte(NBTTagCompound aNBT, Object aTag, byte aValue) {
+ if (aNBT == null) aNBT = new NBTTagCompound();
+ aNBT.setByte(aTag.toString(), aValue);
+ return aNBT;
+ }
+
+ public static NBTTagCompound getNBTContainingShort(NBTTagCompound aNBT, Object aTag, short aValue) {
+ if (aNBT == null) aNBT = new NBTTagCompound();
+ aNBT.setShort(aTag.toString(), aValue);
+ return aNBT;
+ }
+
+ public static NBTTagCompound getNBTContainingInteger(NBTTagCompound aNBT, Object aTag, int aValue) {
+ if (aNBT == null) aNBT = new NBTTagCompound();
+ aNBT.setInteger(aTag.toString(), aValue);
+ return aNBT;
+ }
+
+ public static NBTTagCompound getNBTContainingFloat(NBTTagCompound aNBT, Object aTag, float aValue) {
+ if (aNBT == null) aNBT = new NBTTagCompound();
+ aNBT.setFloat(aTag.toString(), aValue);
+ return aNBT;
+ }
+
+ public static NBTTagCompound getNBTContainingDouble(NBTTagCompound aNBT, Object aTag, double aValue) {
+ if (aNBT == null) aNBT = new NBTTagCompound();
+ aNBT.setDouble(aTag.toString(), aValue);
+ return aNBT;
+ }
+
+ public static NBTTagCompound getNBTContainingString(NBTTagCompound aNBT, Object aTag, Object aValue) {
+ if (aNBT == null) aNBT = new NBTTagCompound();
+ if (aValue == null) return aNBT;
+ aNBT.setString(aTag.toString(), aValue.toString());
+ return aNBT;
+ }
+
+ public static boolean isWearingFullFrostHazmat(EntityLivingBase aEntity) {
+ for (byte i = 1; i < 5; i++) {
+ ItemStack tStack = aEntity.getEquipmentInSlot(i);
+
+ if (!isStackInList(tStack, GregTech_API.sFrostHazmatList) && !hasHazmatEnchant(tStack)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static boolean isWearingFullHeatHazmat(EntityLivingBase aEntity) {
+ for (byte i = 1; i < 5; i++) {
+ ItemStack tStack = aEntity.getEquipmentInSlot(i);
+
+ if (!isStackInList(tStack, GregTech_API.sHeatHazmatList) && !hasHazmatEnchant(tStack)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public static boolean isWearingFullBioHazmat(EntityLivingBase aEntity) {
+ for (byte i = 1; i < 5; i++) {
+ ItemStack tStack = aEntity.getEquipmentInSlot(i);
+
+ if (!isStackInList(tStack, GregTech_API.sBioHazmatList) && !hasHazmatEnchant(tStack)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static boolean isWearingFullRadioHazmat(EntityLivingBase aEntity) {
+ for (byte i = 1; i < 5; i++) {
+ ItemStack tStack = aEntity.getEquipmentInSlot(i);
+
+ if (!isStackInList(tStack, GregTech_API.sRadioHazmatList) && !hasHazmatEnchant(tStack)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static boolean isWearingFullElectroHazmat(EntityLivingBase aEntity) {
+ for (byte i = 1; i < 5; i++) {
+ ItemStack tStack = aEntity.getEquipmentInSlot(i);
+
+ if (!isStackInList(tStack, GregTech_API.sElectroHazmatList) && !hasHazmatEnchant(tStack)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static boolean isWearingFullGasHazmat(EntityLivingBase aEntity) {
+ for (byte i = 1; i < 5; i++) {
+ ItemStack tStack = aEntity.getEquipmentInSlot(i);
+
+ if (!isStackInList(tStack, GregTech_API.sGasHazmatList) && !hasHazmatEnchant(tStack)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static boolean hasHazmatEnchant(ItemStack aStack) {
+ if (aStack == null) return false;
+ Map<Integer, Integer> tEnchantments = EnchantmentHelper.getEnchantments(aStack);
+ Integer tLevel = tEnchantments.get(Enchantment_Hazmat.INSTANCE.effectId);
+
+ return tLevel != null && tLevel >= 1;
+ }
+
+ public static float getHeatDamageFromItem(ItemStack aStack) {
+ ItemData tData = GT_OreDictUnificator.getItemData(aStack);
+ return tData == null ? 0
+ : (tData.mPrefix == null ? 0 : tData.mPrefix.mHeatDamage)
+ + (tData.hasValidMaterialData() ? tData.mMaterial.mMaterial.mHeatDamage : 0);
+ }
+
+ public static int getRadioactivityLevel(ItemStack aStack) {
+ ItemData tData = GT_OreDictUnificator.getItemData(aStack);
+ if (tData != null && tData.hasValidMaterialData()) {
+ if (tData.mMaterial.mMaterial.mEnchantmentArmors instanceof Enchantment_Radioactivity)
+ return tData.mMaterial.mMaterial.mEnchantmentArmorsLevel;
+ if (tData.mMaterial.mMaterial.mEnchantmentTools instanceof Enchantment_Radioactivity)
+ return tData.mMaterial.mMaterial.mEnchantmentToolsLevel;
+ }
+ return EnchantmentHelper.getEnchantmentLevel(Enchantment_Radioactivity.INSTANCE.effectId, aStack);
+ }
+
+ public static boolean isImmuneToBreathingGasses(EntityLivingBase aEntity) {
+ return isWearingFullGasHazmat(aEntity);
+ }
+
+ public static boolean applyHeatDamage(EntityLivingBase entity, float damage) {
+ return applyHeatDamage(entity, damage, GT_DamageSources.getHeatDamage());
+ }
+
+ public static boolean applyHeatDamageFromItem(EntityLivingBase entity, float damage, ItemStack item) {
+ return applyHeatDamage(entity, damage, new DamageSourceHotItem(item));
+ }
+
+ private static boolean applyHeatDamage(EntityLivingBase aEntity, float aDamage, DamageSource source) {
+ if (aDamage > 0 && aEntity != null && !isWearingFullHeatHazmat(aEntity)) {
+ return aEntity.attackEntityFrom(source, aDamage);
+ }
+ return false;
+ }
+
+ public static boolean applyFrostDamage(EntityLivingBase aEntity, float aDamage) {
+ if (aDamage > 0 && aEntity != null && !isWearingFullFrostHazmat(aEntity)) {
+ return aEntity.attackEntityFrom(GT_DamageSources.getFrostDamage(), aDamage);
+ }
+ return false;
+ }
+
+ public static boolean applyElectricityDamage(EntityLivingBase aEntity, long aVoltage, long aAmperage) {
+ long aDamage = getTier(aVoltage) * aAmperage * 4;
+ if (aDamage > 0 && aEntity != null && !isWearingFullElectroHazmat(aEntity)) {
+ return aEntity.attackEntityFrom(GT_DamageSources.getElectricDamage(), aDamage);
+ }
+ return false;
+ }
+
+ public static boolean applyRadioactivity(EntityLivingBase aEntity, int aLevel, int aAmountOfItems) {
+ if (aLevel > 0 && aEntity != null
+ && aEntity.getCreatureAttribute() != EnumCreatureAttribute.UNDEAD
+ && aEntity.getCreatureAttribute() != EnumCreatureAttribute.ARTHROPOD
+ && !isWearingFullRadioHazmat(aEntity)) {
+ PotionEffect tEffect = null;
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.moveSlowdown.id,
+ aLevel * 140 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.moveSlowdown)) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.digSlowdown.id,
+ aLevel * 150 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.digSlowdown)) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.confusion.id,
+ aLevel * 130 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.confusion)) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.weakness.id,
+ aLevel * 150 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.weakness)) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ Potion.hunger.id,
+ aLevel * 130 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.hunger)) == null ? 0 : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ aEntity.addPotionEffect(
+ new PotionEffect(
+ 24 /* IC2 Radiation */,
+ aLevel * 180 * aAmountOfItems + Math.max(
+ 0,
+ ((tEffect = aEntity.getActivePotionEffect(Potion.potionTypes[24])) == null ? 0
+ : tEffect.getDuration())),
+ Math.max(0, (5 * aLevel) / 7)));
+ return true;
+ }
+ return false;
+ }
+
+ @Deprecated
+ public static ItemStack setStack(Object aSetStack, Object aToStack) {
+ if (aSetStack instanceof ItemStack setStack && aToStack instanceof ItemStack toStack)
+ return setStack(setStack, toStack);
+ return null;
+ }
+
+ public static ItemStack setStack(ItemStack aSetStack, ItemStack aToStack) {
+ if (isStackInvalid(aSetStack) || isStackInvalid(aToStack)) return null;
+ aSetStack.func_150996_a(aToStack.getItem());
+ aSetStack.stackSize = aToStack.stackSize;
+ Items.feather.setDamage(aSetStack, Items.feather.getDamage(aToStack));
+ aSetStack.setTagCompound(aToStack.getTagCompound());
+ return aSetStack;
+ }
+
+ public static FluidStack[] copyFluidArray(FluidStack... aStacks) {
+ if (aStacks == null) return null;
+ FluidStack[] rStacks = new FluidStack[aStacks.length];
+ for (int i = 0; i < aStacks.length; i++) if (aStacks[i] != null) rStacks[i] = aStacks[i].copy();
+ return rStacks;
+ }
+
+ public static ItemStack[] copyItemArray(ItemStack... aStacks) {
+ if (aStacks == null) return null;
+ ItemStack[] rStacks = new ItemStack[aStacks.length];
+ for (int i = 0; i < aStacks.length; i++) rStacks[i] = copy(aStacks[i]);
+ return rStacks;
+ }
+
+ /**
+ * @deprecated use {@link #copy(ItemStack)} instead
+ */
+ @Deprecated
+ public static ItemStack copy(Object... aStacks) {
+ for (Object tStack : aStacks) if (isStackValid(tStack)) return ((ItemStack) tStack).copy();
+ return null;
+ }
+
+ public static ItemStack copy(ItemStack aStack) {
+ if (isStackValid(aStack)) return aStack.copy();
+ return null;
+ }
+
+ @Deprecated
+ private static ItemStack firstStackOrNull(Object... aStacks) {
+ for (Object tStack : aStacks) if (tStack instanceof ItemStack stack) return stack;
+ return null;
+ }
+
+ @Nullable
+ public static ItemStack copyOrNull(@Nullable ItemStack stack) {
+ if (isStackValid(stack)) return stack.copy();
+ return null;
+ }
+
+ public static FluidStack copyAmount(int aAmount, FluidStack aStack) {
+ if (aStack == null) return null;
+ FluidStack rStack = aStack.copy();
+ rStack.amount = aAmount;
+ return rStack;
+ }
+
+ /**
+ * @deprecated use {@link #copyAmount(int, ItemStack)} instead
+ */
+ @Deprecated
+ public static ItemStack copyAmount(long aAmount, Object... aStacks) {
+ return copyAmount(aAmount, firstStackOrNull(aStacks));
+ }
+
+ /**
+ * @deprecated use {@link #copyAmount(int, ItemStack)} instead
+ */
+ @Deprecated
+ public static ItemStack copyAmount(long aAmount, ItemStack aStack) {
+ return copyAmount((int) aAmount, aStack);
+ }
+
+ public static ItemStack copyAmount(int aAmount, ItemStack aStack) {
+ ItemStack rStack = copy(aStack);
+ if (isStackInvalid(rStack)) return null;
+ if (aAmount > 64) aAmount = 64;
+ else if (aAmount == -1) aAmount = 111;
+ else if (aAmount < 0) aAmount = 0;
+ rStack.stackSize = (byte) aAmount;
+ return rStack;
+ }
+
+ /**
+ * @deprecated use {@link #multiplyStack(int, ItemStack)} instead
+ */
+ @Deprecated
+ public static ItemStack multiplyStack(long aMultiplier, Object... aStacks) {
+ return multiplyStack((int) aMultiplier, firstStackOrNull(aStacks));
+ }
+
+ public static ItemStack multiplyStack(int aMultiplier, ItemStack aStack) {
+ ItemStack rStack = copy(aStack);
+ if (isStackInvalid(rStack)) return null;
+ int tAmount = rStack.stackSize * aMultiplier;
+ if (tAmount > 64) tAmount = 64;
+ else if (tAmount == -1) tAmount = 111;
+ else if (tAmount < 0) tAmount = 0;
+ rStack.stackSize = (byte) tAmount;
+ return rStack;
+ }
+
+ /**
+ * @deprecated use {@link #copyAmountUnsafe(int, ItemStack)} instead
+ */
+ @Deprecated
+ public static ItemStack copyAmountUnsafe(long aAmount, Object... aStacks) {
+ return copyAmountUnsafe((int) aAmount, firstStackOrNull(aStacks));
+ }
+
+ /**
+ * Unlike {@link #copyAmount(int, ItemStack)}, this method does not restrict stack size by 64.
+ */
+ public static ItemStack copyAmountUnsafe(int aAmount, ItemStack aStack) {
+ ItemStack rStack = copy(aStack);
+ if (isStackInvalid(rStack)) return null;
+ else if (aAmount < 0) aAmount = 0;
+ rStack.stackSize = (int) aAmount;
+ return rStack;
+ }
+
+ /**
+ * @deprecated use {@link #copyMetaData(int, ItemStack)} instead
+ */
+ @Deprecated
+ public static ItemStack copyMetaData(long aMetaData, Object... aStacks) {
+ return copyMetaData((int) aMetaData, firstStackOrNull(aStacks));
+ }
+
+ public static ItemStack copyMetaData(int aMetaData, ItemStack aStack) {
+ ItemStack rStack = copy(aStack);
+ if (isStackInvalid(rStack)) return null;
+ Items.feather.setDamage(rStack, aMetaData);
+ return rStack;
+ }
+
+ /**
+ * @deprecated use {@link #copyAmountAndMetaData(int, int, ItemStack)} instead
+ */
+ @Deprecated
+ public static ItemStack copyAmountAndMetaData(long aAmount, long aMetaData, Object... aStacks) {
+ return copyAmountAndMetaData(aAmount, aMetaData, firstStackOrNull(aStacks));
+ }
+
+ /**
+ * @deprecated use {@link #copyAmountAndMetaData(int, int, ItemStack)} instead
+ */
+ @Deprecated
+ public static ItemStack copyAmountAndMetaData(long aAmount, long aMetaData, ItemStack aStack) {
+ return copyAmountAndMetaData((int) aAmount, (int) aMetaData, aStack);
+ }
+
+ public static ItemStack copyAmountAndMetaData(int aAmount, int aMetaData, ItemStack aStack) {
+ ItemStack rStack = copyAmount(aAmount, aStack);
+ if (isStackInvalid(rStack)) return null;
+ Items.feather.setDamage(rStack, aMetaData);
+ return rStack;
+ }
+
+ /**
+ * @deprecated use {@link #mul(int, ItemStack)} instead
+ */
+ @Deprecated
+ public static ItemStack mul(long aMultiplier, Object... aStacks) {
+ return mul((int) aMultiplier, firstStackOrNull(aStacks));
+ }
+
+ /**
+ * returns a copy of an ItemStack with its Stacksize being multiplied by aMultiplier
+ */
+ public static ItemStack mul(int aMultiplier, ItemStack aStack) {
+ ItemStack rStack = copy(aStack);
+ if (rStack == null) return null;
+ rStack.stackSize *= aMultiplier;
+ return rStack;
+ }
+
+ /**
+ * Loads an ItemStack properly.
+ */
+ public static ItemStack loadItem(NBTTagCompound aNBT, String aTagName) {
+ return loadItem(aNBT.getCompoundTag(aTagName));
+ }
+
+ public static FluidStack loadFluid(NBTTagCompound aNBT, String aTagName) {
+ return loadFluid(aNBT.getCompoundTag(aTagName));
+ }
+
+ /**
+ * Loads an ItemStack properly.
+ */
+ public static ItemStack loadItem(NBTTagCompound aNBT) {
+ if (aNBT == null) return null;
+ ItemStack tRawStack = ItemStack.loadItemStackFromNBT(aNBT);
+ int tRealStackSize = 0;
+ if (tRawStack != null && aNBT.hasKey("Count", Constants.NBT.TAG_INT)) {
+ tRealStackSize = aNBT.getInteger("Count");
+ tRawStack.stackSize = tRealStackSize;
+ } else if (tRawStack != null) {
+ tRealStackSize = tRawStack.stackSize;
+ }
+ ItemStack tRet = GT_OreDictUnificator.get(true, tRawStack);
+ if (tRet != null) tRet.stackSize = tRealStackSize;
+ return tRet;
+ }
+
+ public static void saveItem(NBTTagCompound aParentTag, String aTagName, ItemStack aStack) {
+ if (aStack != null) aParentTag.setTag(aTagName, saveItem(aStack));
+ }
+
+ public static NBTTagCompound saveItem(ItemStack aStack) {
+ if (aStack == null) return new NBTTagCompound();
+ NBTTagCompound t = new NBTTagCompound();
+ aStack.writeToNBT(t);
+ if (aStack.stackSize > Byte.MAX_VALUE) t.setInteger("Count", aStack.stackSize);
+ return t;
+ }
+
+ /**
+ * Loads an FluidStack properly.
+ */
+ public static FluidStack loadFluid(NBTTagCompound aNBT) {
+ if (aNBT == null) return null;
+ return FluidStack.loadFluidStackFromNBT(aNBT);
+ }
+
+ public static <E> E selectItemInList(int aIndex, E aReplacement, List<E> aList) {
+ if (aList == null || aList.isEmpty()) return aReplacement;
+ if (aList.size() <= aIndex) return aList.get(aList.size() - 1);
+ if (aIndex < 0) return aList.get(0);
+ return aList.get(aIndex);
+ }
+
+ @SafeVarargs
+ public static <E> E selectItemInList(int aIndex, E aReplacement, E... aList) {
+ if (aList == null || aList.length == 0) return aReplacement;
+ if (aList.length <= aIndex) return aList[aList.length - 1];
+ if (aIndex < 0) return aList[0];
+ return aList[aIndex];
+ }
+
+ public static boolean isStackInStackSet(ItemStack aStack, Set<ItemStack> aSet) {
+ if (aStack == null) return false;
+ if (aSet.contains(aStack)) return true;
+
+ return aSet.contains(GT_ItemStack.internalCopyStack(aStack, true));
+ }
+
+ public static boolean isStackInList(ItemStack aStack, Collection<GT_ItemStack> aList) {
+ if (aStack == null) {
+ return false;
+ }
+ return isStackInList(new GT_ItemStack(aStack), aList);
+ }
+
+ public static boolean isStackInList(ItemStack aStack, Set<GT_ItemStack2> aList) {
+ if (aStack == null) {
+ return false;
+ }
+ return isStackInList(new GT_ItemStack2(aStack), aList);
+ }
+
+ public static boolean isStackInList(GT_ItemStack aStack, Collection<GT_ItemStack> aList) {
+ return aStack != null
+ && (aList.contains(aStack) || aList.contains(new GT_ItemStack(aStack.mItem, aStack.mStackSize, W)));
+ }
+
+ public static boolean isStackInList(GT_ItemStack2 aStack, Set<GT_ItemStack2> aList) {
+ return aStack != null
+ && (aList.contains(aStack) || aList.contains(new GT_ItemStack2(aStack.mItem, aStack.mStackSize, W)));
+ }
+
+ /**
+ * re-maps all Keys of a Map after the Keys were weakened.
+ */
+ public static <X, Y> Map<X, Y> reMap(Map<X, Y> aMap) {
+ Map<X, Y> tMap = null;
+ // We try to clone the Map first (most Maps are Cloneable) in order to retain as much state of the Map as
+ // possible when rehashing. For example, "Custom" HashMaps from fastutil may have a custom hash function which
+ // would not be used to rehash if we just create a new HashMap.
+ if (aMap instanceof Cloneable) {
+ try {
+ tMap = (Map<X, Y>) aMap.getClass()
+ .getMethod("clone")
+ .invoke(aMap);
+ } catch (Throwable e) {
+ GT_Log.err.println("Failed to clone Map of type " + aMap.getClass());
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ if (tMap == null) {
+ tMap = new HashMap<>(aMap);
+ }
+
+ aMap.clear();
+ aMap.putAll(tMap);
+ return aMap;
+ }
+
+ /**
+ * re-maps all Keys of a Map after the Keys were weakened.
+ */
+ public static <X, Y> SetMultimap<X, Y> reMap(SetMultimap<X, Y> aMap) {
+ @SuppressWarnings("unchecked")
+ Map.Entry<X, Y>[] entries = aMap.entries()
+ .toArray(new Map.Entry[0]);
+ aMap.clear();
+ for (Map.Entry<X, Y> entry : entries) {
+ aMap.put(entry.getKey(), entry.getValue());
+ }
+ return aMap;
+ }
+
+ public static <X, Y extends Comparable<Y>> LinkedHashMap<X, Y> sortMapByValuesAcending(Map<X, Y> map) {
+ return map.entrySet()
+ .stream()
+ .sorted(Map.Entry.comparingByValue())
+ .collect(CollectorUtils.entriesToMap(LinkedHashMap::new));
+ }
+
+ /**
+ * Why the fuck do neither Java nor Guava have a Function to do this?
+ */
+ public static <X, Y extends Comparable<Y>> LinkedHashMap<X, Y> sortMapByValuesDescending(Map<X, Y> aMap) {
+ List<Map.Entry<X, Y>> tEntrySet = new LinkedList<>(aMap.entrySet());
+ tEntrySet.sort((aValue1, aValue2) -> {
+ return aValue2.getValue()
+ .compareTo(aValue1.getValue()); // FB: RV - RV_NEGATING_RESULT_OF_COMPARETO
+ });
+ LinkedHashMap<X, Y> rMap = new LinkedHashMap<>();
+ for (Map.Entry<X, Y> tEntry : tEntrySet) rMap.put(tEntry.getKey(), tEntry.getValue());
+ return rMap;
+ }
+
+ /**
+ * Translates a Material Amount into an Amount of Fluid in Fluid Material Units.
+ */
+ public static long translateMaterialToFluidAmount(long aMaterialAmount, boolean aRoundUp) {
+ return translateMaterialToAmount(aMaterialAmount, L, aRoundUp);
+ }
+
+ /**
+ * Translates a Material Amount into an Amount of Fluid. Second Parameter for things like Bucket Amounts (1000) and
+ * similar
+ */
+ public static long translateMaterialToAmount(long aMaterialAmount, long aAmountPerUnit, boolean aRoundUp) {
+ return Math.max(
+ 0,
+ ((aMaterialAmount * aAmountPerUnit) / M)
+ + (aRoundUp && (aMaterialAmount * aAmountPerUnit) % M > 0 ? 1 : 0));
+ }
+
+ /**
+ * This checks if the Dimension is really a Dimension and not another Planet or something. Used for my Teleporter.
+ */
+ public static boolean isRealDimension(int aDimensionID) {
+ if (aDimensionID <= 1 && aDimensionID >= -1 && !GregTech_API.sDimensionalList.contains(aDimensionID))
+ return true;
+ return !GregTech_API.sDimensionalList.contains(aDimensionID)
+ && DimensionManager.isDimensionRegistered(aDimensionID);
+ }
+
+ public static boolean moveEntityToDimensionAtCoords(Entity entity, int aDimension, double aX, double aY,
+ double aZ) {
+ // Credit goes to BrandonCore Author :!:
+
+ if (entity == null || entity.worldObj.isRemote) return false;
+ if (entity.ridingEntity != null) entity.mountEntity(null);
+ if (entity.riddenByEntity != null) entity.riddenByEntity.mountEntity(null);
+
+ World startWorld = entity.worldObj;
+ WorldServer destinationWorld = FMLCommonHandler.instance()
+ .getMinecraftServerInstance()
+ .worldServerForDimension(aDimension);
+
+ if (destinationWorld == null) {
+ return false;
+ }
+
+ boolean interDimensional = startWorld.provider.dimensionId != destinationWorld.provider.dimensionId;
+ if (!interDimensional) return false;
+ startWorld.updateEntityWithOptionalForce(entity, false); // added
+
+ if (entity instanceof EntityPlayerMP player) {
+ player.closeScreen(); // added
+ player.dimension = aDimension;
+ player.playerNetServerHandler.sendPacket(
+ new S07PacketRespawn(
+ player.dimension,
+ player.worldObj.difficultySetting,
+ destinationWorld.getWorldInfo()
+ .getTerrainType(),
+ player.theItemInWorldManager.getGameType()));
+ ((WorldServer) startWorld).getPlayerManager()
+ .removePlayer(player);
+
+ startWorld.playerEntities.remove(player);
+ startWorld.updateAllPlayersSleepingFlag();
+ int i = entity.chunkCoordX;
+ int j = entity.chunkCoordZ;
+ if ((entity.addedToChunk) && (startWorld.getChunkProvider()
+ .chunkExists(i, j))) {
+ startWorld.getChunkFromChunkCoords(i, j)
+ .removeEntity(entity);
+ startWorld.getChunkFromChunkCoords(i, j).isModified = true;
+ }
+ startWorld.loadedEntityList.remove(entity);
+ startWorld.onEntityRemoved(entity);
+ }
+
+ entity.setLocationAndAngles(aX, aY, aZ, entity.rotationYaw, entity.rotationPitch);
+
+ destinationWorld.theChunkProviderServer.loadChunk((int) aX >> 4, (int) aZ >> 4);
+
+ destinationWorld.theProfiler.startSection("placing");
+ if (!(entity instanceof EntityPlayer)) {
+ NBTTagCompound entityNBT = new NBTTagCompound();
+ entity.isDead = false;
+ entityNBT.setString("id", EntityList.getEntityString(entity));
+ entity.writeToNBT(entityNBT);
+ entity.isDead = true;
+ entity = EntityList.createEntityFromNBT(entityNBT, destinationWorld);
+ if (entity == null) {
+ return false;
+ }
+ entity.dimension = destinationWorld.provider.dimensionId;
+ }
+ destinationWorld.spawnEntityInWorld(entity);
+ entity.setWorld(destinationWorld);
+ entity.setLocationAndAngles(aX, aY, aZ, entity.rotationYaw, entity.rotationPitch);
+
+ destinationWorld.updateEntityWithOptionalForce(entity, false);
+ entity.setLocationAndAngles(aX, aY, aZ, entity.rotationYaw, entity.rotationPitch);
+
+ if ((entity instanceof EntityPlayerMP player)) {
+ player.mcServer.getConfigurationManager()
+ .func_72375_a(player, destinationWorld);
+ player.playerNetServerHandler.setPlayerLocation(aX, aY, aZ, player.rotationYaw, player.rotationPitch);
+ }
+
+ destinationWorld.updateEntityWithOptionalForce(entity, false);
+
+ if (entity instanceof EntityPlayerMP player) {
+ player.theItemInWorldManager.setWorld(destinationWorld);
+ player.mcServer.getConfigurationManager()
+ .updateTimeAndWeatherForPlayer(player, destinationWorld);
+ player.mcServer.getConfigurationManager()
+ .syncPlayerInventory(player);
+
+ for (PotionEffect potionEffect : player.getActivePotionEffects()) {
+ player.playerNetServerHandler.sendPacket(new S1DPacketEntityEffect(player.getEntityId(), potionEffect));
+ }
+
+ player.playerNetServerHandler.sendPacket(
+ new S1FPacketSetExperience(player.experience, player.experienceTotal, player.experienceLevel));
+ FMLCommonHandler.instance()
+ .firePlayerChangedDimensionEvent(
+ player,
+ startWorld.provider.dimensionId,
+ destinationWorld.provider.dimensionId);
+ }
+ entity.setLocationAndAngles(aX, aY, aZ, entity.rotationYaw, entity.rotationPitch);
+
+ destinationWorld.theProfiler.endSection();
+ entity.fallDistance = 0;
+ return true;
+ }
+
+ public static int getScaleCoordinates(double aValue, int aScale) {
+ return (int) Math.floor(aValue / aScale);
+ }
+
+ public static int getCoordinateScan(ArrayList<String> aList, EntityPlayer aPlayer, World aWorld, int aScanLevel,
+ int aX, int aY, int aZ, ForgeDirection side, float aClickX, float aClickY, float aClickZ) {
+ if (aList == null) return 0;
+
+ ArrayList<String> tList = new ArrayList<>();
+ int rEUAmount = 0;
+
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+
+ final Block tBlock = aWorld.getBlock(aX, aY, aZ);
+
+ addBaseInfo(aPlayer, aWorld, aX, aY, aZ, tList, tTileEntity, tBlock);
+
+ if (tTileEntity != null) {
+ rEUAmount += addFluidHandlerInfo(side, tList, tTileEntity);
+
+ try {
+ if (tTileEntity instanceof ic2.api.reactor.IReactorChamber chamber) {
+ rEUAmount += 500;
+ // Redirect the rest of the scans to the reactor itself
+ tTileEntity = (TileEntity) chamber.getReactor();
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ rEUAmount += addReactorInfo(tList, tTileEntity);
+ rEUAmount += addAlignmentInfo(tList, tTileEntity);
+ rEUAmount += addIC2WrenchableInfo(aPlayer, tList, tTileEntity);
+ rEUAmount += addIC2EnergyConductorInfo(tList, tTileEntity);
+ rEUAmount += addIC2EnergyStorageInfo(tList, tTileEntity);
+ rEUAmount += addUpgradableMachineInfo(tList, tTileEntity);
+ rEUAmount += addMachineProgressInfo(tList, tTileEntity);
+ rEUAmount += addCoverableInfo(side, tList, tTileEntity);
+ addEnergyContainerInfo(tList, tTileEntity);
+ addOwnerInfo(tList, tTileEntity);
+ addDeviceInfo(tList, tTileEntity);
+
+ rEUAmount += addIC2CropInfo(tList, tTileEntity);
+
+ rEUAmount += addForestryLeavesInfo(tList, tTileEntity);
+ }
+
+ final Chunk currentChunk = aWorld.getChunkFromBlockCoords(aX, aZ);
+ addUndergroundFluidInfo(aPlayer, tList, currentChunk);
+ addPollutionInfo(tList, currentChunk);
+
+ rEUAmount += addDebuggableBlockInfo(aPlayer, aX, aY, aZ, tList, tBlock);
+
+ final BlockScanningEvent tEvent = new BlockScanningEvent(
+ aWorld,
+ aPlayer,
+ aX,
+ aY,
+ aZ,
+ side,
+ aScanLevel,
+ tBlock,
+ tTileEntity,
+ tList,
+ aClickX,
+ aClickY,
+ aClickZ);
+ tEvent.mEUCost = rEUAmount;
+ MinecraftForge.EVENT_BUS.post(tEvent);
+ if (!tEvent.isCanceled()) aList.addAll(tList);
+ return tEvent.mEUCost;
+ }
+
+ private static void addBaseInfo(EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, ArrayList<String> tList,
+ TileEntity tTileEntity, Block tBlock) {
+ tList.add(
+ "----- X: " + EnumChatFormatting.AQUA
+ + formatNumbers(aX)
+ + EnumChatFormatting.RESET
+ + " Y: "
+ + EnumChatFormatting.AQUA
+ + formatNumbers(aY)
+ + EnumChatFormatting.RESET
+ + " Z: "
+ + EnumChatFormatting.AQUA
+ + formatNumbers(aZ)
+ + EnumChatFormatting.RESET
+ + " D: "
+ + EnumChatFormatting.AQUA
+ + aWorld.provider.dimensionId
+ + EnumChatFormatting.RESET
+ + " -----");
+ try {
+ tList.add(
+ GT_Utility.trans("162", "Name: ") + EnumChatFormatting.BLUE
+ + ((tTileEntity instanceof IInventory inv) ? inv.getInventoryName() : tBlock.getUnlocalizedName())
+ + EnumChatFormatting.RESET
+ + GT_Utility.trans("163", " MetaData: ")
+ + EnumChatFormatting.AQUA
+ + aWorld.getBlockMetadata(aX, aY, aZ)
+ + EnumChatFormatting.RESET);
+ tList.add(
+ GT_Utility.trans("164", "Hardness: ") + EnumChatFormatting.YELLOW
+ + tBlock.getBlockHardness(aWorld, aX, aY, aZ)
+ + EnumChatFormatting.RESET
+ + GT_Utility.trans("165", " Blast Resistance: ")
+ + EnumChatFormatting.YELLOW
+ + tBlock
+ .getExplosionResistance(aPlayer, aWorld, aX, aY, aZ, aPlayer.posX, aPlayer.posY, aPlayer.posZ)
+ + EnumChatFormatting.RESET);
+ if (tBlock.isBeaconBase(aWorld, aX, aY, aZ, aX, aY + 1, aZ)) tList.add(
+ EnumChatFormatting.GOLD + GT_Utility.trans("166", "Is valid Beacon Pyramid Material")
+ + EnumChatFormatting.RESET);
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ private static int addFluidHandlerInfo(ForgeDirection side, ArrayList<String> tList, TileEntity tTileEntity) {
+ int rEUAmount = 0;
+ try {
+ if (tTileEntity instanceof IFluidHandler fluidHandler) {
+ rEUAmount += 500;
+ final FluidTankInfo[] tTanks = fluidHandler.getTankInfo(side);
+ if (tTanks != null) for (byte i = 0; i < tTanks.length; i++) {
+ tList.add(
+ GT_Utility.trans("167", "Tank ") + i
+ + ": "
+ + EnumChatFormatting.GREEN
+ + formatNumbers((tTanks[i].fluid == null ? 0 : tTanks[i].fluid.amount))
+ + EnumChatFormatting.RESET
+ + " L / "
+ + EnumChatFormatting.YELLOW
+ + formatNumbers(tTanks[i].capacity)
+ + EnumChatFormatting.RESET
+ + " L "
+ + EnumChatFormatting.GOLD
+ + getFluidName(tTanks[i].fluid, true)
+ + EnumChatFormatting.RESET);
+ }
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return rEUAmount;
+ }
+
+ private static int addDebuggableBlockInfo(EntityPlayer aPlayer, int aX, int aY, int aZ, ArrayList<String> tList,
+ Block tBlock) {
+ int rEUAmount = 0;
+ try {
+ if (tBlock instanceof IDebugableBlock debugableBlock) {
+ rEUAmount += 500;
+ final ArrayList<String> temp = debugableBlock.getDebugInfo(aPlayer, aX, aY, aZ, 3);
+ if (temp != null) tList.addAll(temp);
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return rEUAmount;
+ }
+
+ private static void addPollutionInfo(ArrayList<String> tList, Chunk currentChunk) {
+ if (GT_Pollution.hasPollution(currentChunk)) {
+ tList.add(
+ GT_Utility.trans("202", "Pollution in Chunk: ") + EnumChatFormatting.RED
+ + formatNumbers(GT_Pollution.getPollution(currentChunk))
+ + EnumChatFormatting.RESET
+ + GT_Utility.trans("203", " gibbl"));
+ } else {
+ tList.add(
+ EnumChatFormatting.GREEN + GT_Utility.trans("204", "No Pollution in Chunk! HAYO!")
+ + EnumChatFormatting.RESET);
+ }
+ }
+
+ private static void addUndergroundFluidInfo(EntityPlayer aPlayer, ArrayList<String> tList, Chunk currentChunk) {
+ if (aPlayer.capabilities.isCreativeMode) {
+ final FluidStack tFluid = undergroundOilReadInformation(currentChunk); // -# to only read
+ if (tFluid != null) tList.add(
+ EnumChatFormatting.GOLD + tFluid.getLocalizedName()
+ + EnumChatFormatting.RESET
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + formatNumbers(tFluid.amount)
+ + EnumChatFormatting.RESET
+ + " L");
+ else tList.add(
+ EnumChatFormatting.GOLD + GT_Utility.trans("201", "Nothing")
+ + EnumChatFormatting.RESET
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + '0'
+ + EnumChatFormatting.RESET
+ + " L");
+ }
+ }
+
+ private static int addForestryLeavesInfo(ArrayList<String> tList, TileEntity tTileEntity) {
+ int rEUAmount = 0;
+ try {
+ if (tTileEntity instanceof forestry.arboriculture.tiles.TileLeaves tileLeaves) {
+ final forestry.api.arboriculture.ITree tree = tileLeaves.getTree();
+ if (tree != null) {
+ rEUAmount += 1000;
+ if (!tree.isAnalyzed()) tree.analyze();
+ tree.addTooltip(tList);
+ }
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return rEUAmount;
+ }
+
+ private static int addIC2CropInfo(ArrayList<String> tList, TileEntity tTileEntity) {
+ int rEUAmount = 0;
+ try {
+ if (tTileEntity instanceof ic2.api.crops.ICropTile crop) {
+ rEUAmount += 1000;
+ if (crop.getScanLevel() < 4) crop.setScanLevel((byte) 4);
+ if (crop.getCrop() != null) {
+ tList.add(
+ GT_Utility.trans("187", "Type -- Crop-Name: ") + crop.getCrop()
+ .name()
+ + GT_Utility.trans("188", " Growth: ")
+ + crop.getGrowth()
+ + GT_Utility.trans("189", " Gain: ")
+ + crop.getGain()
+ + GT_Utility.trans("190", " Resistance: ")
+ + crop.getResistance());
+ }
+ tList.add(
+ GT_Utility.trans("191", "Plant -- Fertilizer: ") + crop.getNutrientStorage()
+ + GT_Utility.trans("192", " Water: ")
+ + crop.getHydrationStorage()
+ + GT_Utility.trans("193", " Weed-Ex: ")
+ + crop.getWeedExStorage()
+ + GT_Utility.trans("194", " Scan-Level: ")
+ + crop.getScanLevel());
+ tList.add(
+ GT_Utility.trans("195", "Environment -- Nutrients: ") + crop.getNutrients()
+ + GT_Utility.trans("196", " Humidity: ")
+ + crop.getHumidity()
+ + GT_Utility.trans("197", " Air-Quality: ")
+ + crop.getAirQuality());
+ if (crop.getCrop() != null) {
+ final StringBuilder tStringB = new StringBuilder();
+ for (final String tAttribute : crop.getCrop()
+ .attributes()) {
+ tStringB.append(", ")
+ .append(tAttribute);
+ }
+ final String tString = tStringB.toString();
+ tList.add(GT_Utility.trans("198", "Attributes:") + tString.replaceFirst(",", E));
+ tList.add(
+ GT_Utility.trans("199", "Discovered by: ") + crop.getCrop()
+ .discoveredBy());
+ }
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return rEUAmount;
+ }
+
+ private static void addDeviceInfo(ArrayList<String> tList, TileEntity tTileEntity) {
+ try {
+ if (tTileEntity instanceof IGregTechDeviceInformation info && info.isGivingInformation()) {
+ tList.addAll(Arrays.asList(info.getInfoData()));
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ private static void addOwnerInfo(ArrayList<String> tList, TileEntity tTileEntity) {
+ try {
+ if (tTileEntity instanceof IGregTechTileEntity gtTE) {
+ tList.add(
+ GT_Utility.trans("186", "Owned by: ") + EnumChatFormatting.BLUE
+ + gtTE.getOwnerName()
+ + EnumChatFormatting.RESET);
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ private static void addEnergyContainerInfo(ArrayList<String> tList, TileEntity tTileEntity) {
+ try {
+ if (tTileEntity instanceof IBasicEnergyContainer energyContainer && energyContainer.getEUCapacity() > 0) {
+ tList.add(
+ GT_Utility.trans("179", "Max IN: ") + EnumChatFormatting.RED
+ + formatNumbers(energyContainer.getInputVoltage())
+ + " ("
+ + GT_Values.VN[getTier(energyContainer.getInputVoltage())]
+ + ") "
+ + EnumChatFormatting.RESET
+ + GT_Utility.trans("182", " EU at ")
+ + EnumChatFormatting.RED
+ + formatNumbers(energyContainer.getInputAmperage())
+ + EnumChatFormatting.RESET
+ + GT_Utility.trans("183", " A"));
+ tList.add(
+ GT_Utility.trans("181", "Max OUT: ") + EnumChatFormatting.RED
+ + formatNumbers(energyContainer.getOutputVoltage())
+ + " ("
+ + GT_Values.VN[getTier(energyContainer.getOutputVoltage())]
+ + ") "
+ + EnumChatFormatting.RESET
+ + GT_Utility.trans("182", " EU at ")
+ + EnumChatFormatting.RED
+ + formatNumbers(energyContainer.getOutputAmperage())
+ + EnumChatFormatting.RESET
+ + GT_Utility.trans("183", " A"));
+ tList.add(
+ GT_Utility.trans("184", "Energy: ") + EnumChatFormatting.GREEN
+ + formatNumbers(energyContainer.getStoredEU())
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + formatNumbers(energyContainer.getEUCapacity())
+ + EnumChatFormatting.RESET
+ + " EU");
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ private static int addCoverableInfo(ForgeDirection side, ArrayList<String> tList, TileEntity tTileEntity) {
+ int rEUAmount = 0;
+ try {
+ if (tTileEntity instanceof ICoverable coverable) {
+ rEUAmount += 300;
+ final String tString = coverable.getCoverInfoAtSide(side)
+ .getBehaviorDescription();
+ if (tString != null && !tString.equals(E)) tList.add(tString);
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return rEUAmount;
+ }
+
+ private static int addMachineProgressInfo(ArrayList<String> tList, TileEntity tTileEntity) {
+ int rEUAmount = 0;
+ try {
+ if (tTileEntity instanceof IMachineProgress progress) {
+ if (progress.isAllowedToWork() && !progress.hasThingsToDo()) {
+ tList.add(EnumChatFormatting.RED + "Disabled." + EnumChatFormatting.RESET);
+ }
+ if (progress.wasShutdown() && isStringValid(
+ progress.getLastShutDownReason()
+ .getDisplayString())) {
+ tList.add(
+ progress.getLastShutDownReason()
+ .getDisplayString());
+ }
+ rEUAmount += 400;
+ int tValue = 0;
+ if (0 < (tValue = progress.getMaxProgress())) tList.add(
+ GT_Utility.trans("178", "Progress/Load: ") + EnumChatFormatting.GREEN
+ + formatNumbers(progress.getProgress())
+ + EnumChatFormatting.RESET
+ + " / "
+ + EnumChatFormatting.YELLOW
+ + formatNumbers(tValue)
+ + EnumChatFormatting.RESET);
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return rEUAmount;
+ }
+
+ private static int addUpgradableMachineInfo(ArrayList<String> tList, TileEntity tTileEntity) {
+ int rEUAmount = 0;
+ try {
+ if (tTileEntity instanceof IUpgradableMachine upgradableMachine) {
+ rEUAmount += 500;
+ if (upgradableMachine.hasMufflerUpgrade()) tList.add(
+ EnumChatFormatting.GREEN + GT_Utility.trans("177", "Has Muffler Upgrade")
+ + EnumChatFormatting.RESET);
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return rEUAmount;
+ }
+
+ private static int addIC2EnergyStorageInfo(ArrayList<String> tList, TileEntity tTileEntity) {
+ int rEUAmount = 0;
+ try {
+ if (tTileEntity instanceof ic2.api.tile.IEnergyStorage storage) {
+ rEUAmount += 200;
+ tList.add(
+ GT_Utility.trans("176", "Contained Energy: ") + EnumChatFormatting.YELLOW
+ + formatNumbers(storage.getStored())
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + formatNumbers(storage.getCapacity())
+ + EnumChatFormatting.RESET
+ + " EU");
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return rEUAmount;
+ }
+
+ private static int addIC2EnergyConductorInfo(ArrayList<String> tList, TileEntity tTileEntity) {
+ int rEUAmount = 0;
+ try {
+ if (tTileEntity instanceof ic2.api.energy.tile.IEnergyConductor conductor) {
+ rEUAmount += 200;
+ tList.add(
+ GT_Utility.trans("175", "Conduction Loss: ") + EnumChatFormatting.YELLOW
+ + conductor.getConductionLoss()
+ + EnumChatFormatting.RESET);
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return rEUAmount;
+ }
+
+ private static int addIC2WrenchableInfo(EntityPlayer aPlayer, ArrayList<String> tList, TileEntity tTileEntity) {
+ int rEUAmount = 0;
+ try {
+ if (tTileEntity instanceof ic2.api.tile.IWrenchable wrenchable) {
+ rEUAmount += 100;
+ tList.add(
+ GT_Utility.trans("171", "Facing: ") + EnumChatFormatting.GREEN
+ + wrenchable.getFacing()
+ + EnumChatFormatting.RESET
+ + GT_Utility.trans("172", " / Chance: ")
+ + EnumChatFormatting.YELLOW
+ + (wrenchable.getWrenchDropRate() * 100)
+ + EnumChatFormatting.RESET
+ + "%");
+ tList.add(
+ wrenchable.wrenchCanRemove(aPlayer)
+ ? EnumChatFormatting.GREEN + GT_Utility.trans("173", "You can remove this with a Wrench")
+ + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + GT_Utility.trans("174", "You can NOT remove this with a Wrench")
+ + EnumChatFormatting.RESET);
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return rEUAmount;
+ }
+
+ private static int addAlignmentInfo(ArrayList<String> tList, TileEntity tTileEntity) {
+ int rEUAmount = 0;
+ try {
+ if (tTileEntity instanceof IAlignmentProvider alignmentProvider) {
+ final IAlignment tAlignment = alignmentProvider.getAlignment();
+ if (tAlignment != null) {
+ rEUAmount += 100;
+ tList.add(
+ GT_Utility.trans("219", "Extended Facing: ") + EnumChatFormatting.GREEN
+ + tAlignment.getExtendedFacing()
+ + EnumChatFormatting.RESET);
+ }
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return rEUAmount;
+ }
+
+ private static int addReactorInfo(ArrayList<String> tList, TileEntity tTileEntity) {
+ int rEUAmount = 0;
+ try {
+ if (tTileEntity instanceof ic2.api.reactor.IReactor reactor) {
+ rEUAmount += 500;
+ tList.add(
+ GT_Utility.trans("168", "Heat: ") + EnumChatFormatting.GREEN
+ + formatNumbers(reactor.getHeat())
+ + EnumChatFormatting.RESET
+ + " / "
+ + EnumChatFormatting.YELLOW
+ + formatNumbers(reactor.getMaxHeat())
+ + EnumChatFormatting.RESET);
+ tList.add(
+ GT_Utility.trans("169", "HEM: ") + EnumChatFormatting.YELLOW
+ + reactor.getHeatEffectModifier()
+ + EnumChatFormatting.RESET);
+ }
+ } catch (Throwable e) {
+ if (D1) e.printStackTrace(GT_Log.err);
+ }
+ return rEUAmount;
+ }
+
+ public static String trans(String aKey, String aEnglish) {
+ return GT_LanguageManager.addStringLocalization("Interaction_DESCRIPTION_Index_" + aKey, aEnglish);
+ }
+
+ public static String getTrans(String aKey) {
+ return GT_LanguageManager.getTranslation("Interaction_DESCRIPTION_Index_" + aKey);
+ }
+
+ /**
+ * @return an Array containing the X and the Y Coordinate of the clicked Point, with the top left Corner as Origin,
+ * like on the Texture Sheet. return values should always be between [0.0F and 0.99F].
+ */
+ // TODO: use clamp()
+ public static float[] getClickedFacingCoords(ForgeDirection side, float aX, float aY, float aZ) {
+ return switch (side) {
+ case DOWN -> new float[] { Math.min(0.99F, Math.max(0, 1 - aX)), Math.min(0.99F, Math.max(0, aZ)) };
+ case UP -> new float[] { Math.min(0.99F, Math.max(0, aX)), Math.min(0.99F, Math.max(0, aZ)) };
+ case NORTH -> new float[] { Math.min(0.99F, Math.max(0, 1 - aX)), Math.min(0.99F, Math.max(0, 1 - aY)) };
+ case SOUTH -> new float[] { Math.min(0.99F, Math.max(0, aX)), Math.min(0.99F, Math.max(0, 1 - aY)) };
+ case WEST -> new float[] { Math.min(0.99F, Math.max(0, aZ)), Math.min(0.99F, Math.max(0, 1 - aY)) };
+ case EAST -> new float[] { Math.min(0.99F, Math.max(0, 1 - aZ)), Math.min(0.99F, Math.max(0, 1 - aY)) };
+ default -> new float[] { 0.5F, 0.5F };
+ };
+ }
+
+ /**
+ * This Function determines the direction a Block gets when being Wrenched. returns -1 if invalid. Even though that
+ * could never happen.
+ */
+ public static ForgeDirection determineWrenchingSide(ForgeDirection side, float aX, float aY, float aZ) {
+ ForgeDirection tBack = side.getOpposite();
+ switch (side) {
+ case DOWN, UP -> {
+ if (aX < 0.25) {
+ if (aZ < 0.25) return tBack;
+ if (aZ > 0.75) return tBack;
+ return WEST;
+ }
+ if (aX > 0.75) {
+ if (aZ < 0.25) return tBack;
+ if (aZ > 0.75) return tBack;
+ return EAST;
+ }
+ if (aZ < 0.25) return NORTH;
+ if (aZ > 0.75) return SOUTH;
+ return side;
+ }
+ case NORTH, SOUTH -> {
+ if (aX < 0.25) {
+ if (aY < 0.25) return tBack;
+ if (aY > 0.75) return tBack;
+ return WEST;
+ }
+ if (aX > 0.75) {
+ if (aY < 0.25) return tBack;
+ if (aY > 0.75) return tBack;
+ return EAST;
+ }
+ if (aY < 0.25) return DOWN;
+ if (aY > 0.75) return UP;
+ return side;
+ }
+ case WEST, EAST -> {
+ if (aZ < 0.25) {
+ if (aY < 0.25) return tBack;
+ if (aY > 0.75) return tBack;
+ return NORTH;
+ }
+ if (aZ > 0.75) {
+ if (aY < 0.25) return tBack;
+ if (aY > 0.75) return tBack;
+ return SOUTH;
+ }
+ if (aY < 0.25) return DOWN;
+ if (aY > 0.75) return UP;
+ return side;
+ }
+ }
+ return UNKNOWN;
+ }
+
+ private static DecimalFormat getDecimalFormat() {
+ return decimalFormatters.computeIfAbsent(Locale.getDefault(Locale.Category.FORMAT), locale -> {
+ DecimalFormat numberFormat = new DecimalFormat(); // uses the necessary locale inside anyway
+ numberFormat.setGroupingUsed(true);
+ numberFormat.setMaximumFractionDigits(2);
+ numberFormat.setRoundingMode(RoundingMode.HALF_UP);
+ DecimalFormatSymbols decimalFormatSymbols = numberFormat.getDecimalFormatSymbols();
+ decimalFormatSymbols.setGroupingSeparator(','); // Use sensible separator for best clarity.
+ numberFormat.setDecimalFormatSymbols(decimalFormatSymbols);
+ return numberFormat;
+ });
+ }
+
+ public static String formatNumbers(BigInteger aNumber) {
+ return getDecimalFormat().format(aNumber);
+ }
+
+ public static String formatNumbers(long aNumber) {
+ return getDecimalFormat().format(aNumber);
+ }
+
+ public static String formatNumbers(double aNumber) {
+ return getDecimalFormat().format(aNumber);
+ }
+
+ /*
+ * Check if stack has enough items of given type and subtract from stack, if there's no creative or 111 stack.
+ */
+ public static boolean consumeItems(EntityPlayer player, ItemStack stack, Item item, int count) {
+ if (stack != null && stack.getItem() == item && stack.stackSize >= count) {
+ if ((!player.capabilities.isCreativeMode) && (stack.stackSize != 111)) stack.stackSize -= count;
+ return true;
+ }
+ return false;
+ }
+
+ /*
+ * Check if stack has enough items of given gregtech material (will be oredicted) and subtract from stack, if
+ * there's no creative or 111 stack.
+ */
+ public static boolean consumeItems(EntityPlayer player, ItemStack stack, gregtech.api.enums.Materials mat,
+ int count) {
+ if (stack != null && GT_OreDictUnificator.getItemData(stack).mMaterial.mMaterial == mat
+ && stack.stackSize >= count) {
+ if ((!player.capabilities.isCreativeMode) && (stack.stackSize != 111)) stack.stackSize -= count;
+ return true;
+ }
+ return false;
+ }
+
+ public static ArrayList<String> sortByValueToList(Map<String, Integer> map) {
+ List<Map.Entry<String, Integer>> list = new LinkedList<>(map.entrySet());
+ list.sort((o1, o2) -> o2.getValue() - o1.getValue());
+
+ ArrayList<String> result = new ArrayList<>();
+ for (Map.Entry<String, Integer> e : list) result.add(e.getKey());
+ return result;
+ }
+
+ public static String joinListToString(List<String> list) {
+ StringBuilder result = new StringBuilder(32);
+ for (String s : list) result.append(result.length() == 0 ? s : '|' + s);
+ return result.toString();
+ }
+
+ public static ItemStack getIntegratedCircuit(int config) {
+ return ItemList.Circuit_Integrated.getWithDamage(0, config);
+ }
+
+ public static float getBlockHardnessAt(World aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlock(aX, aY, aZ)
+ .getBlockHardness(aWorld, aX, aY, aZ);
+ }
+
+ public static FakePlayer getFakePlayer(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (aBaseMetaTileEntity.getWorld() instanceof WorldServer) {
+ return FakePlayerFactory.get(
+ (WorldServer) aBaseMetaTileEntity.getWorld(),
+ new GameProfile(aBaseMetaTileEntity.getOwnerUuid(), aBaseMetaTileEntity.getOwnerName()));
+ }
+ return null;
+ }
+
+ public static boolean eraseBlockByFakePlayer(FakePlayer aPlayer, int aX, int aY, int aZ, boolean isSimulate) {
+ if (aPlayer == null) return false;
+ World aWorld = aPlayer.worldObj;
+ BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(
+ aX,
+ aY,
+ aZ,
+ aWorld,
+ aWorld.getBlock(aX, aY, aZ),
+ aWorld.getBlockMetadata(aX, aY, aZ),
+ aPlayer);
+ MinecraftForge.EVENT_BUS.post(event);
+ if (!event.isCanceled()) {
+ if (!isSimulate) return aWorld.setBlockToAir(aX, aY, aZ);
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean setBlockByFakePlayer(FakePlayer aPlayer, int aX, int aY, int aZ, Block aBlock, int aMeta,
+ boolean isSimulate) {
+ if (aPlayer == null) return false;
+ World aWorld = aPlayer.worldObj;
+ BlockEvent.PlaceEvent event = ForgeEventFactory
+ .onPlayerBlockPlace(aPlayer, new BlockSnapshot(aWorld, aX, aY, aZ, aBlock, aMeta), UNKNOWN);
+ if (!event.isCanceled()) {
+ if (!isSimulate) return aWorld.setBlock(aX, aY, aZ, aBlock, aMeta, 3);
+ return true;
+ }
+ return false;
+ }
+
+ public static int findMatchingStackInList(List<ItemStack> aStacks, ItemStack aStack) {
+ if (isStackInvalid(aStack)) return -1;
+ for (int i = 0, aStacksSize = aStacks.size(); i < aStacksSize; i++) {
+ ItemStack tStack = aStacks.get(i);
+ if (areStacksEqual(aStack, tStack)) return i;
+ }
+ return -1;
+ }
+
+ /**
+ * @return Supplied collection that doesn't contain invalid MetaTileEntities
+ */
+ public static <T extends Collection<E>, E extends MetaTileEntity> T filterValidMTEs(T metaTileEntities) {
+ metaTileEntities.removeIf(mte -> mte == null || !mte.isValid());
+ return metaTileEntities;
+ }
+
+ public static class ItemNBT {
+
+ public static void setNBT(ItemStack aStack, NBTTagCompound aNBT) {
+ if (aNBT == null) {
+ aStack.setTagCompound(null);
+ return;
+ }
+ ArrayList<String> tTagsToRemove = new ArrayList<>();
+ for (String tKey : aNBT.func_150296_c()) {
+ NBTBase tValue = aNBT.getTag(tKey);
+ if (tValue == null || (tValue instanceof NBTPrimitive && ((NBTPrimitive) tValue).func_150291_c() == 0)
+ || (tValue instanceof NBTTagString && isStringInvalid(((NBTTagString) tValue).func_150285_a_())))
+ tTagsToRemove.add(tKey);
+ }
+ for (String tKey : tTagsToRemove) aNBT.removeTag(tKey);
+ aStack.setTagCompound(aNBT.hasNoTags() ? null : aNBT);
+ }
+
+ public static NBTTagCompound getNBT(ItemStack aStack) {
+ NBTTagCompound rNBT = aStack.getTagCompound();
+ return rNBT == null ? new NBTTagCompound() : rNBT;
+ }
+
+ public static void setPunchCardData(ItemStack aStack, String aPunchCardData) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setString("GT.PunchCardData", aPunchCardData);
+ setNBT(aStack, tNBT);
+ }
+
+ public static String getPunchCardData(ItemStack aStack) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ return tNBT.getString("GT.PunchCardData");
+ }
+
+ public static void setLighterFuel(ItemStack aStack, long aFuel) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setLong("GT.LighterFuel", aFuel);
+ setNBT(aStack, tNBT);
+ }
+
+ public static long getLighterFuel(ItemStack aStack) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ return tNBT.getLong("GT.LighterFuel");
+ }
+
+ public static void setMapID(ItemStack aStack, short aMapID) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setShort("map_id", aMapID);
+ setNBT(aStack, tNBT);
+ }
+
+ public static short getMapID(ItemStack aStack) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ if (!tNBT.hasKey("map_id")) return -1;
+ return tNBT.getShort("map_id");
+ }
+
+ public static void setBookTitle(ItemStack aStack, String aTitle) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setString("title", aTitle);
+ setNBT(aStack, tNBT);
+ }
+
+ public static String getBookTitle(ItemStack aStack) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ return tNBT.getString("title");
+ }
+
+ public static void setBookAuthor(ItemStack aStack, String aAuthor) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ tNBT.setString("author", aAuthor);
+ setNBT(aStack, tNBT);
+ }
+
+ public static String getBookAuthor(ItemStack aStack) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ return tNBT.getString("author");
+ }
+
+ public static void setProspectionData(ItemStack aStack, int aX, int aY, int aZ, int aDim, FluidStack aFluid,
+ String... aOres) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ StringBuilder tData = new StringBuilder(aX + "," + aY + "," + aZ + "," + aDim + ",");
+ if (aFluid != null) tData.append(aFluid.amount)
+ .append(",")
+ .append(aFluid.getLocalizedName())
+ .append(","); // TODO
+ // CHECK
+ // IF
+ // THAT
+ // /5000
+ // is
+ // needed
+ // (Not
+ // needed)
+ for (String tString : aOres) {
+ tData.append(tString)
+ .append(",");
+ }
+ tNBT.setString("prospection", tData.toString());
+ setNBT(aStack, tNBT);
+ }
+
+ public static void setAdvancedProspectionData(byte aTier, ItemStack aStack, int aX, short aY, int aZ, int aDim,
+ ArrayList<String> aOils, ArrayList<String> aOres, int aRadius) {
+
+ setBookTitle(aStack, "Raw Prospection Data");
+
+ NBTTagCompound tNBT = getNBT(aStack);
+
+ tNBT.setByte("prospection_tier", aTier);
+ tNBT.setString("prospection_pos", "Dim: " + aDim + "\nX: " + aX + " Y: " + aY + " Z: " + aZ);
+
+ // ores
+ Collections.sort(aOres);
+ tNBT.setString("prospection_ores", joinListToString(aOres));
+
+ // oils
+ ArrayList<String> tOilsTransformed = new ArrayList<>(aOils.size());
+ for (String aStr : aOils) {
+ String[] aStats = aStr.split(",");
+ tOilsTransformed.add(aStats[0] + ": " + aStats[1] + "L " + aStats[2]);
+ }
+
+ tNBT.setString("prospection_oils", joinListToString(tOilsTransformed));
+
+ String tOilsPosStr = "X: " + Math.floorDiv(aX, 16 * 8) * 16 * 8
+ + " Z: "
+ + Math.floorDiv(aZ, 16 * 8) * 16 * 8
+ + "\n";
+ int xOff = aX - Math.floorDiv(aX, 16 * 8) * 16 * 8;
+ xOff = xOff / 16;
+ int xOffRemain = 7 - xOff;
+
+ int zOff = aZ - Math.floorDiv(aZ, 16 * 8) * 16 * 8;
+ zOff = zOff / 16;
+ int zOffRemain = 7 - zOff;
+
+ for (; zOff > 0; zOff--) {
+ tOilsPosStr = tOilsPosStr.concat("--------\n");
+ }
+ for (; xOff > 0; xOff--) {
+ tOilsPosStr = tOilsPosStr.concat("-");
+ }
+
+ tOilsPosStr = tOilsPosStr.concat("P");
+
+ for (; xOffRemain > 0; xOffRemain--) {
+ tOilsPosStr = tOilsPosStr.concat("-");
+ }
+ tOilsPosStr = tOilsPosStr.concat("\n");
+ for (; zOffRemain > 0; zOffRemain--) {
+ tOilsPosStr = tOilsPosStr.concat("--------\n");
+ }
+ tOilsPosStr = tOilsPosStr.concat(
+ " X: " + (Math.floorDiv(aX, 16 * 8) + 1) * 16 * 8
+ + " Z: "
+ + (Math.floorDiv(aZ, 16 * 8) + 1) * 16 * 8); // +1 oilfied to find bottomright of [5]
+
+ tNBT.setString("prospection_oils_pos", tOilsPosStr);
+
+ tNBT.setString("prospection_radius", String.valueOf(aRadius));
+
+ setNBT(aStack, tNBT);
+ }
+
+ public static void convertProspectionData(ItemStack aStack) {
+ NBTTagCompound tNBT = getNBT(aStack);
+ byte tTier = tNBT.getByte("prospection_tier");
+
+ if (tTier == 0) { // basic prospection data
+ String tData = tNBT.getString("prospection");
+ String[] tDataArray = tData.split(",");
+ if (tDataArray.length > 6) {
+ tNBT.setString(
+ "author",
+ " Dim: " + tDataArray[3]
+ + "X: "
+ + tDataArray[0]
+ + " Y: "
+ + tDataArray[1]
+ + " Z: "
+ + tDataArray[2]);
+ NBTTagList tNBTList = new NBTTagList();
+ StringBuilder tOres = new StringBuilder(" Prospected Ores: ");
+ for (int i = 6; tDataArray.length > i; i++) {
+ tOres.append(tDataArray[i])
+ .append(" ");
+ }
+ tNBTList.appendTag(
+ new NBTTagString(
+ "Tier " + tTier
+ + " Prospecting Data From: X"
+ + tDataArray[0]
+ + " Z:"
+ + tDataArray[2]
+ + " Dim:"
+ + tDataArray[3]
+ + " Produces "
+ + tDataArray[4]
+ + "L "
+ + tDataArray[5]
+ + " "
+ + tOres));
+ tNBT.setTag("pages", tNBTList);
+ }
+ } else { // advanced prospection data
+ String tPos = tNBT.getString("prospection_pos");
+ String tRadius = tNBT.getString("prospection_radius");
+
+ String tOresStr = tNBT.getString("prospection_ores");
+ String tOilsStr = tNBT.getString("prospection_oils");
+ String tOilsPosStr = tNBT.getString("prospection_oils_pos");
+
+ String[] tOres = tOresStr.isEmpty() ? null : tOresStr.split("\\|");
+ String[] tOils = tOilsStr.isEmpty() ? null : tOilsStr.split("\\|");
+
+ NBTTagList tNBTList = new NBTTagList();
+
+ String tPageText = "Prospector report\n" + tPos
+ + "\n\n"
+ + "Oils: "
+ + (tOils != null ? tOils.length : 0)
+ + "\n\n"
+ + "Ores within "
+ + tRadius
+ + " blocks\n\n"
+ + "Location is center of orevein\n\n"
+ + "Check NEI to confirm orevein type";
+ tNBTList.appendTag(new NBTTagString(tPageText));
+
+ if (tOres != null) fillBookWithList(tNBTList, "Ores Found %s\n\n", "\n", 7, tOres);
+
+ if (tOils != null) fillBookWithList(tNBTList, "Oils%s\n\n", "\n", 9, tOils);
+
+ tPageText = """
+ Oil notes
+
+ Prospects from NW to SE 576 chunks(9 8x8 oilfields)
+ around and gives min-max amount
+
+ [1][2][3]
+ [4][5][6]
+ [7][8][9]
+
+ [5] - Prospector in this 8x8 area""";
+ tNBTList.appendTag(new NBTTagString(tPageText));
+
+ tPageText = "Corners of [5] are \n" + tOilsPosStr + "\n" + "P - Prospector in 8x8 field";
+ tNBTList.appendTag(new NBTTagString(tPageText));
+
+ tNBT.setString("author", tPos.replace("\n", " "));
+ tNBT.setTag("pages", tNBTList);
+ }
+ setNBT(aStack, tNBT);
+ }
+
+ public static void fillBookWithList(NBTTagList aBook, String aPageHeader, String aListDelimiter,
+ int aItemsPerPage, String[] list) {
+ String aPageFormatter = " %d/%d";
+ int tTotalPages = list.length / aItemsPerPage + (list.length % aItemsPerPage > 0 ? 1 : 0);
+ int tPage = 0;
+ StringBuilder tPageText;
+ do {
+ tPageText = new StringBuilder();
+ for (int i = tPage * aItemsPerPage; i < (tPage + 1) * aItemsPerPage && i < list.length; i += 1)
+ tPageText.append((tPageText.length() == 0) ? "" : aListDelimiter)
+ .append(list[i]);
+
+ if (tPageText.length() > 0) {
+ String tPageCounter = tTotalPages > 1 ? String.format(aPageFormatter, tPage + 1, tTotalPages) : "";
+ NBTTagString tPageTag = new NBTTagString(String.format(aPageHeader, tPageCounter) + tPageText);
+ aBook.appendTag(tPageTag);
+ }
+
+ ++tPage;
+ } while (tPageText.length() > 0);
+ }
+
+ public static void addEnchantment(ItemStack aStack, Enchantment aEnchantment, int aLevel) {
+ NBTTagCompound tNBT = getNBT(aStack), tEnchantmentTag;
+ if (!tNBT.hasKey("ench", 9)) tNBT.setTag("ench", new NBTTagList());
+ NBTTagList tList = tNBT.getTagList("ench", 10);
+
+ boolean temp = true;
+
+ for (int i = 0; i < tList.tagCount(); i++) {
+ tEnchantmentTag = tList.getCompoundTagAt(i);
+ if (tEnchantmentTag.getShort("id") == aEnchantment.effectId) {
+ tEnchantmentTag.setShort("id", (short) aEnchantment.effectId);
+ tEnchantmentTag.setShort("lvl", (byte) aLevel);
+ temp = false;
+ break;
+ }
+ }
+
+ if (temp) {
+ tEnchantmentTag = new NBTTagCompound();
+ tEnchantmentTag.setShort("id", (short) aEnchantment.effectId);
+ tEnchantmentTag.setShort("lvl", (byte) aLevel);
+ tList.appendTag(tEnchantmentTag);
+ }
+ aStack.setTagCompound(tNBT);
+ }
+ }
+
+ /**
+ * THIS IS BULLSHIT!!! WHY DO I HAVE TO DO THIS SHIT JUST TO HAVE ENCHANTS PROPERLY!?!
+ */
+ public static class GT_EnchantmentHelper {
+
+ private static final BullshitIteratorA mBullshitIteratorA = new BullshitIteratorA();
+ private static final BullshitIteratorB mBullshitIteratorB = new BullshitIteratorB();
+
+ private static void applyBullshit(IBullshit aBullshitModifier, ItemStack aStack) {
+ if (aStack != null) {
+ NBTTagList nbttaglist = aStack.getEnchantmentTagList();
+ if (nbttaglist != null) {
+ try {
+ for (int i = 0; i < nbttaglist.tagCount(); ++i) {
+ short short1 = nbttaglist.getCompoundTagAt(i)
+ .getShort("id");
+ short short2 = nbttaglist.getCompoundTagAt(i)
+ .getShort("lvl");
+ if (Enchantment.enchantmentsList[short1] != null)
+ aBullshitModifier.calculateModifier(Enchantment.enchantmentsList[short1], short2);
+ }
+ } catch (Throwable e) {
+ /**/
+ }
+ }
+ }
+ }
+
+ private static void applyArrayOfBullshit(IBullshit aBullshitModifier, ItemStack[] aStacks) {
+ for (ItemStack itemstack : aStacks) {
+ applyBullshit(aBullshitModifier, itemstack);
+ }
+ }
+
+ public static void applyBullshitA(EntityLivingBase aPlayer, Entity aEntity, ItemStack aStack) {
+ mBullshitIteratorA.mPlayer = aPlayer;
+ mBullshitIteratorA.mEntity = aEntity;
+ if (aPlayer != null) applyArrayOfBullshit(mBullshitIteratorA, aPlayer.getLastActiveItems());
+ if (aStack != null) applyBullshit(mBullshitIteratorA, aStack);
+ }
+
+ public static void applyBullshitB(EntityLivingBase aPlayer, Entity aEntity, ItemStack aStack) {
+ mBullshitIteratorB.mPlayer = aPlayer;
+ mBullshitIteratorB.mEntity = aEntity;
+ if (aPlayer != null) applyArrayOfBullshit(mBullshitIteratorB, aPlayer.getLastActiveItems());
+ if (aStack != null) applyBullshit(mBullshitIteratorB, aStack);
+ }
+
+ interface IBullshit {
+
+ void calculateModifier(Enchantment aEnchantment, int aLevel);
+ }
+
+ static final class BullshitIteratorA implements IBullshit {
+
+ public EntityLivingBase mPlayer;
+ public Entity mEntity;
+
+ BullshitIteratorA() {}
+
+ @Override
+ public void calculateModifier(Enchantment aEnchantment, int aLevel) {
+ aEnchantment.func_151367_b(mPlayer, mEntity, aLevel);
+ }
+ }
+
+ static final class BullshitIteratorB implements IBullshit {
+
+ public EntityLivingBase mPlayer;
+ public Entity mEntity;
+
+ BullshitIteratorB() {}
+
+ @Override
+ public void calculateModifier(Enchantment aEnchantment, int aLevel) {
+ aEnchantment.func_151368_a(mPlayer, mEntity, aLevel);
+ }
+ }
+ }
+
+ public static String toSubscript(long no) {
+ char[] chars = Long.toString(no)
+ .toCharArray();
+ for (int i = 0; i < chars.length; i++) {
+ chars[i] += 8272;
+ }
+ return new String(chars);
+ }
+
+ public static boolean isPartOfMaterials(ItemStack aStack, Materials aMaterials) {
+ return GT_OreDictUnificator.getAssociation(aStack) != null
+ && GT_OreDictUnificator.getAssociation(aStack).mMaterial.mMaterial.equals(aMaterials);
+ }
+
+ public static boolean isPartOfOrePrefix(ItemStack aStack, OrePrefixes aPrefix) {
+ return GT_OreDictUnificator.getAssociation(aStack) != null
+ && GT_OreDictUnificator.getAssociation(aStack).mPrefix.equals(aPrefix);
+ }
+
+ public static final ImmutableSet<String> ORE_BLOCK_CLASSES = ImmutableSet.of(
+ "com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_Ores",
+ "com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_SmallOres",
+ "gtPlusPlus.core.block.base.BlockBaseOre");
+
+ public static boolean isOre(Block aBlock, int aMeta) {
+ return (aBlock instanceof GT_Block_Ores_Abstract) || isOre(new ItemStack(aBlock, 1, aMeta))
+ || ORE_BLOCK_CLASSES.contains(
+ aBlock.getClass()
+ .getName());
+ }
+
+ public static boolean isOre(ItemStack aStack) {
+ int tItem = GT_Utility.stackToInt(aStack);
+ if (sOreTable.containsKey(tItem)) {
+ return sOreTable.get(tItem);
+ }
+ for (int id : OreDictionary.getOreIDs(aStack)) {
+ if (OreDictionary.getOreName(id)
+ .startsWith("ore")) {
+ sOreTable.put(tItem, true);
+ return true;
+ }
+ }
+ sOreTable.put(tItem, false);
+ return false;
+ }
+
+ /**
+ * Do <b>NOT</b> mutate the returned {@code ItemStack}! We return {@code ItemStack} instead of {@code Block} so that
+ * we can include metadata.
+ */
+ public static ItemStack getCobbleForOre(Block ore, short metaData) {
+ // We need to convert small ores to regular ores because small ores don't have associated ItemData.
+ // We take the modulus of the metadata by 16000 because that is the magic number to convert small ores to
+ // regular ores.
+ // See: GT_TileEntity_Ores.java
+ ItemData association = GT_OreDictUnificator
+ .getAssociation(new ItemStack(Item.getItemFromBlock(ore), 1, metaData % 16000));
+ if (association != null) {
+ Supplier<ItemStack> supplier = sOreToCobble.get(association.mPrefix);
+ if (supplier != null) {
+ return supplier.get();
+ }
+ }
+ return new ItemStack(Blocks.cobblestone);
+ }
+
+ public static Optional<GT_Recipe> reverseShapelessRecipe(ItemStack output, Object... aRecipe) {
+ if (output == null) {
+ return Optional.empty();
+ }
+
+ List<ItemStack> inputs = new ArrayList<>();
+
+ for (Object o : aRecipe) {
+ if (o instanceof ItemStack) {
+ ItemStack toAdd = ((ItemStack) o).copy();
+ inputs.add(toAdd);
+ } else if (o instanceof String) {
+ ItemStack stack = GT_OreDictUnificator.get(o, 1);
+ if (stack == null) {
+ Optional<ItemStack> oStack = OreDictionary.getOres((String) o)
+ .stream()
+ .findAny();
+ if (oStack.isPresent()) {
+ ItemStack copy = oStack.get()
+ .copy();
+ inputs.add(copy);
+ }
+ } else {
+ ItemStack copy = stack.copy();
+ inputs.add(copy);
+ }
+ } else if (o instanceof Item) inputs.add(new ItemStack((Item) o));
+ else if (o instanceof Block) inputs.add(new ItemStack((Block) o));
+ else throw new IllegalStateException("A Recipe contains an invalid input! Output: " + output);
+ }
+
+ inputs.removeIf(x -> x.getItem() instanceof GT_MetaGenerated_Tool);
+
+ return Optional.of(
+ new GT_Recipe(
+ false,
+ new ItemStack[] { output },
+ inputs.toArray(new ItemStack[0]),
+ null,
+ null,
+ null,
+ null,
+ 300,
+ 30,
+ 0));
+ }
+
+ public static Optional<GT_Recipe> reverseShapedRecipe(ItemStack output, Object... aRecipe) {
+ if (output == null) {
+ return Optional.empty();
+ }
+
+ Map<Object, Integer> recipeAsMap = new HashMap<>();
+ Map<Character, Object> ingridients = new HashMap<>();
+ Map<Character, Integer> amounts = new HashMap<>();
+ boolean startFound = false;
+ for (int i = 0, aRecipeLength = aRecipe.length; i < aRecipeLength; i++) {
+ Object o = aRecipe[i];
+ if (!startFound) {
+ if (o instanceof String) {
+ for (Character c : ((String) o).toCharArray()) amounts.merge(c, 1, (a, b) -> ++a);
+ } else if (o instanceof Character) startFound = true;
+ } else if (!(o instanceof Character)) ingridients.put((Character) aRecipe[i - 1], o);
+ }
+ for (Map.Entry<Character, Object> characterObjectEntry : ingridients.entrySet()) {
+ for (Map.Entry<Character, Integer> characterIntegerEntry : amounts.entrySet()) {
+ if (characterObjectEntry.getKey() != characterIntegerEntry.getKey()) continue;
+ recipeAsMap.put(characterObjectEntry.getValue(), characterIntegerEntry.getValue());
+ }
+ }
+ List<ItemStack> inputs = new ArrayList<>();
+
+ for (Map.Entry<Object, Integer> o : recipeAsMap.entrySet()) {
+ final int amount = o.getValue();
+ if (o.getKey() instanceof ItemStack) {
+ ItemStack toAdd = ((ItemStack) o.getKey()).copy();
+ toAdd.stackSize = amount;
+ inputs.add(toAdd);
+ } else if (o.getKey() instanceof String dictName) {
+ // Do not register tools dictName in inputs
+ if (ToolDictNames.contains(dictName)) continue;
+ ItemStack stack = GT_OreDictUnificator.get(dictName, null, amount, false, true);
+ if (stack == null) {
+ Optional<ItemStack> oStack = OreDictionary.getOres(dictName)
+ .stream()
+ .findAny();
+ if (oStack.isPresent()) {
+ ItemStack copy = oStack.get()
+ .copy();
+ copy.stackSize = amount;
+ inputs.add(copy);
+ }
+ } else {
+ ItemStack copy = stack.copy();
+ copy.stackSize = amount;
+ inputs.add(copy);
+ }
+ } else if (o.getKey() instanceof Item) inputs.add(new ItemStack((Item) o.getKey(), amount));
+ else if (o.getKey() instanceof Block) inputs.add(new ItemStack((Block) o.getKey(), amount));
+ else throw new IllegalStateException("A Recipe contains an invalid input! Output: " + output);
+ }
+
+ // Remove tools from inputs in case a recipe has one as a direct Item or ItemStack reference
+ inputs.removeIf(x -> x.getItem() instanceof GT_MetaGenerated_Tool);
+
+ return Optional.of(
+ new GT_Recipe(
+ false,
+ new ItemStack[] { output },
+ inputs.toArray(new ItemStack[0]),
+ null,
+ null,
+ null,
+ null,
+ 300,
+ 30,
+ 0));
+ }
+
+ /**
+ * Add an itemstack to player inventory, or drop on ground if full. Can be called on client but it probably won't
+ * work very well.
+ */
+ public static void addItemToPlayerInventory(EntityPlayer aPlayer, ItemStack aStack) {
+ if (isStackInvalid(aStack)) return;
+ if (!aPlayer.inventory.addItemStackToInventory(aStack) && !aPlayer.worldObj.isRemote) {
+ EntityItem dropItem = aPlayer.entityDropItem(aStack, 0);
+ dropItem.delayBeforeCanPickup = 0;
+ }
+ }
+
+ public static long getNonnullElementCount(Object[] tArray) {
+ return Arrays.stream(tArray)
+ .filter(Objects::nonNull)
+ .count();
+ }
+
+ public static int clamp(int val, int lo, int hi) {
+ return MathHelper.clamp_int(val, lo, hi);
+ }
+
+ public static int ceilDiv(int lhs, int rhs) {
+ return (lhs + rhs - 1) / rhs;
+ }
+
+ public static long ceilDiv(long lhs, long rhs) {
+ return (lhs + rhs - 1) / rhs;
+ }
+
+ /**
+ * Hash an item stack for the purpose of storing hash across launches
+ */
+ public static int persistentHash(ItemStack aStack, boolean aUseStackSize, boolean aUseNBT) {
+ if (aStack == null) return 0;
+ int result = Objects.hashCode(GameRegistry.findUniqueIdentifierFor(aStack.getItem()));
+ result = result * 31 + Items.feather.getDamage(aStack);
+
+ if (aUseStackSize) result = result * 31 + aStack.stackSize;
+ if (aUseNBT) result = result * 31 + Objects.hashCode(aStack.stackTagCompound);
+ return result;
+ }
+
+ /**
+ * Hash an item stack for the purpose of storing hash across launches
+ */
+ public static int persistentHash(FluidStack aStack, boolean aUseStackSize, boolean aUseNBT) {
+ if (aStack == null) return 0;
+ int base = Objects.hashCode(
+ aStack.getFluid()
+ .getName());
+
+ if (aUseStackSize) base = base * 31 + aStack.amount;
+ if (aUseNBT) base = base * 31 + Objects.hashCode(aStack.tag);
+ return base;
+ }
+
+ public static int getCasingTextureIndex(Block block, int meta) {
+ if (block instanceof IHasIndexedTexture) return ((IHasIndexedTexture) block).getTextureIndex(meta);
+ return Textures.BlockIcons.ERROR_TEXTURE_INDEX;
+ }
+
+ public static boolean isCellEmpty(ItemStack itemStack) {
+ if (itemStack == null) return false;
+ ItemStack tStack = ItemList.Cell_Empty.get(1);
+ tStack.stackSize = itemStack.stackSize;
+ return GT_Utility.areStacksEqual(itemStack, tStack);
+ }
+
+ /**
+ * Convert a cell to fluid. If given itemstack does not contain any fluid, return null. Will correctly multiple
+ * output fluid amount if input stack size is greater than 1.
+ */
+ public static FluidStack convertCellToFluid(ItemStack itemStack) {
+ if (itemStack == null) return null;
+ if (getFluidForFilledItem(itemStack, true) != null) {
+ FluidStack fluidStack = getFluidForFilledItem(itemStack, true);
+ if (fluidStack != null) fluidStack.amount = fluidStack.amount * itemStack.stackSize;
+ return fluidStack;
+ }
+ return null;
+ }
+
+ /**
+ * @deprecated typo in method name. use {@link #isAnyIntegratedCircuit(ItemStack)} instead.
+ */
+ @Deprecated
+ public static boolean checkIfSameIntegratedCircuit(ItemStack itemStack) {
+ if (itemStack == null) return false;
+ for (int i = 0; i < 25; i++) if (itemStack.isItemEqual(GT_Utility.getIntegratedCircuit(i))) return true;
+ return false;
+ }
+
+ public static boolean isAnyIntegratedCircuit(ItemStack itemStack) {
+ if (itemStack == null) return false;
+ return itemStack.getItem() == ItemList.Circuit_Integrated.getItem() && 0 <= itemStack.getItemDamage()
+ && itemStack.getItemDamage() < 25;
+ }
+
+ public static byte convertRatioToRedstone(long used, long max, int threshold, boolean inverted) {
+ byte signal;
+ if (used <= 0) { // Empty
+ signal = 0;
+ } else if (used >= max) { // Full
+ signal = 15;
+ } else { // Range 1-14
+ signal = (byte) (1 + (14 * used) / max);
+ }
+
+ if (inverted) {
+ signal = (byte) (15 - signal);
+ }
+
+ if (threshold > 0) {
+ if (inverted && used >= threshold) {
+ return 0;
+ } else if (!inverted && used < threshold) {
+ return 0;
+ }
+ }
+
+ return signal;
+ }
+
+ public static ItemStack getNaniteAsCatalyst(Materials material) {
+ ItemStack aItem = material.getNanite(1);
+ return new ItemStack(aItem.getItem(), 0, aItem.getItemDamage());
+ }
+
+ public static Stream<NBTTagCompound> streamCompounds(NBTTagList list) {
+ if (list == null) return Stream.empty();
+ return IntStream.range(0, list.tagCount())
+ .mapToObj(list::getCompoundTagAt);
+ }
+
+ public static boolean equals(ItemStack[] a, ItemStack[] b) {
+ // because stupid mojang didn't override equals for us
+ if (a == null && b == null) return true;
+ if ((a == null) != (b == null)) return false;
+ if (a.length != b.length) return false;
+ for (int i = 0; i < a.length; i++) {
+ if (!areStacksEqual(a[i], b[i], false)) return false;
+ }
+ return true;
+ }
+
+ /**
+ * Guava ImmutableMap variant of Collectors.toMap. Optimized for serial streams.
+ */
+ public static <T, K, U> Collector<T, ?, ImmutableMap<K, U>> toImmutableMapSerial(
+ Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper) {
+ // petty type inference cannot work out the correct type parameter
+ return Collector.<T, ImmutableMap.Builder<K, U>, ImmutableMap<K, U>>of(
+ ImmutableMap::builder,
+ (b, t) -> b.put(keyMapper.apply(t), valueMapper.apply(t)),
+ (b1, b2) -> b1.putAll(b2.build()),
+ ImmutableMap.Builder::build);
+ }
+
+ public static boolean isArrayEmptyOrNull(Object[] arr) {
+ return arr == null || arr.length == 0;
+ }
+
+ public static boolean isArrayOfLength(Object[] arr, int expectedLength) {
+ return arr != null && arr.length == expectedLength;
+ }
+
+ @SafeVarargs
+ public static <E> Collection<E> concat(Collection<E>... colls) {
+ return concat(Arrays.asList(colls));
+ }
+
+ public static <E> Collection<E> concat(Collection<Collection<E>> colls) {
+ return new ConcatCollection<>(colls);
+ }
+
+ private static class ConcatCollection<E> extends AbstractCollection<E> {
+
+ private final Collection<Collection<E>> colls;
+ private final int size;
+
+ public ConcatCollection(Collection<Collection<E>> lists) {
+ Collection<Collection<E>> colls1 = null;
+ for (Collection<E> list : lists) {
+ if (list == null || list.isEmpty()) {
+ colls1 = lists.stream()
+ .filter(c -> c != null && !c.isEmpty())
+ .collect(Collectors.toList());
+ break;
+ }
+ }
+ if (colls1 == null) colls1 = lists;
+ colls = colls1;
+ int sum = 0;
+ for (Collection<E> list : colls) {
+ sum += list.size();
+ }
+ size = sum;
+ }
+
+ @Nonnull
+ @Override
+ public Iterator<E> iterator() {
+ return colls.stream()
+ .flatMap(Collection::stream)
+ .iterator();
+ }
+
+ @Override
+ public int size() {
+ return size;
+ }
+ }
+
+ @AutoValue
+ public abstract static class ItemId {
+
+ public static ItemId create(NBTTagCompound tag) {
+ return new AutoValue_GT_Utility_ItemId(
+ Item.getItemById(tag.getShort("item")),
+ tag.getShort("meta"),
+ tag.hasKey("tag", Constants.NBT.TAG_COMPOUND) ? tag.getCompoundTag("tag") : null);
+ }
+
+ /**
+ * This method copies NBT, as it is mutable.
+ */
+ public static ItemId create(ItemStack itemStack) {
+ NBTTagCompound nbt = itemStack.getTagCompound();
+ if (nbt != null) {
+ nbt = (NBTTagCompound) nbt.copy();
+ }
+
+ return new AutoValue_GT_Utility_ItemId(itemStack.getItem(), Items.feather.getDamage(itemStack), nbt);
+ }
+
+ /**
+ * This method copies NBT, as it is mutable.
+ */
+ public static ItemId create(Item item, int metaData, @Nullable NBTTagCompound nbt) {
+ if (nbt != null) {
+ nbt = (NBTTagCompound) nbt.copy();
+ }
+ return new AutoValue_GT_Utility_ItemId(item, metaData, nbt);
+ }
+
+ /**
+ * This method stores metadata as wildcard and NBT as null.
+ */
+ public static ItemId createAsWildcard(ItemStack itemStack) {
+ return new AutoValue_GT_Utility_ItemId(itemStack.getItem(), W, null);
+ }
+
+ /**
+ * This method stores NBT as null.
+ */
+ public static ItemId createWithoutNBT(ItemStack itemStack) {
+ return new AutoValue_GT_Utility_ItemId(itemStack.getItem(), Items.feather.getDamage(itemStack), null);
+ }
+
+ /**
+ * This method does not copy NBT in order to save time. Make sure not to mutate it!
+ */
+ public static ItemId createNoCopy(ItemStack itemStack) {
+ return new AutoValue_GT_Utility_ItemId(
+ itemStack.getItem(),
+ Items.feather.getDamage(itemStack),
+ itemStack.getTagCompound());
+ }
+
+ /**
+ * This method does not copy NBT in order to save time. Make sure not to mutate it!
+ */
+ public static ItemId createNoCopy(Item item, int metaData, @Nullable NBTTagCompound nbt) {
+ return new AutoValue_GT_Utility_ItemId(item, metaData, nbt);
+ }
+
+ protected abstract Item item();
+
+ protected abstract int metaData();
+
+ @Nullable
+ protected abstract NBTTagCompound nbt();
+
+ public NBTTagCompound writeToNBT() {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setShort("item", (short) Item.getIdFromItem(item()));
+ tag.setShort("meta", (short) metaData());
+ if (nbt() != null) tag.setTag("tag", nbt());
+ return tag;
+ }
+
+ public ItemStack getItemStack() {
+ ItemStack itemStack = new ItemStack(item(), 1, metaData());
+ itemStack.setTagCompound(nbt());
+ return itemStack;
+ }
+ }
+
+ public static int getPlasmaFuelValueInEUPerLiterFromMaterial(Materials material) {
+ return getPlasmaFuelValueInEUPerLiterFromFluid(material.getPlasma(1));
+ }
+
+ public static int getPlasmaFuelValueInEUPerLiterFromFluid(FluidStack aLiquid) {
+ if (aLiquid == null) return 0;
+ GT_Recipe tFuel = RecipeMaps.plasmaFuels.getBackend()
+ .findFuel(aLiquid);
+ if (tFuel != null) return tFuel.mSpecialValue;
+ return 0;
+ }
+
+ public static MovingObjectPosition getPlayerLookingTarget() {
+ // Basically copied from waila, thanks Caedis for such challenge
+ Minecraft mc = Minecraft.getMinecraft();
+ EntityLivingBase viewpoint = mc.renderViewEntity;
+ if (viewpoint == null) return null;
+
+ float reachDistance = mc.playerController.getBlockReachDistance();
+ Vec3 posVec = viewpoint.getPosition(0);
+ Vec3 lookVec = viewpoint.getLook(0);
+ Vec3 modifiedPosVec = posVec
+ .addVector(lookVec.xCoord * reachDistance, lookVec.yCoord * reachDistance, lookVec.zCoord * reachDistance);
+
+ return viewpoint.worldObj.rayTraceBlocks(posVec, modifiedPosVec);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_UtilityClient.java b/src/main/java/gregtech/api/util/GT_UtilityClient.java
new file mode 100644
index 0000000000..398c1f6b41
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_UtilityClient.java
@@ -0,0 +1,52 @@
+package gregtech.api.util;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import com.google.common.collect.Lists;
+
+import cpw.mods.fml.relauncher.ReflectionHelper;
+
+public class GT_UtilityClient {
+
+ private static final Field isDrawingField = ReflectionHelper
+ .findField(Tessellator.class, "isDrawing", "field_78415_z");
+
+ public static boolean isDrawing(Tessellator tess) {
+ try {
+ return isDrawingField.getBoolean(tess);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ public static List<String> getTooltip(ItemStack aStack, boolean aGuiStyle) {
+ try {
+ List<String> tooltip = aStack.getTooltip(
+ Minecraft.getMinecraft().thePlayer,
+ Minecraft.getMinecraft().gameSettings.advancedItemTooltips);
+ if (aGuiStyle) {
+ tooltip.set(
+ 0,
+ (aStack.getRarity() == null ? EnumRarity.common : aStack.getRarity()).rarityColor + tooltip.get(0));
+ for (int i = 1; i < tooltip.size(); i++) {
+ tooltip.set(i, EnumChatFormatting.GRAY + tooltip.get(i));
+ }
+ }
+ return tooltip;
+ } catch (RuntimeException e) {
+ // Collections.singletonList() can not be added to. we don't want that
+ if (aGuiStyle) return Lists.newArrayList(
+ (aStack.getRarity() == null ? EnumRarity.common : aStack.getRarity()).rarityColor
+ + aStack.getDisplayName());
+ return Lists.newArrayList(aStack.getDisplayName());
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_Waila.java b/src/main/java/gregtech/api/util/GT_Waila.java
new file mode 100644
index 0000000000..aaa68ba4c7
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_Waila.java
@@ -0,0 +1,23 @@
+package gregtech.api.util;
+
+public abstract class GT_Waila {
+
+ public static String getMachineProgressString(boolean isActive, int maxProgresstime, int progresstime) {
+ return getMachineProgressString(isActive, (long) maxProgresstime, (long) progresstime);
+ }
+
+ public static String getMachineProgressString(boolean isActive, long maxProgresstime, long progresstime) {
+
+ if (!isActive) return "Idle";
+
+ StringBuilder ret = new StringBuilder("In progress: ")
+ .append(String.format("%,.2f", (double) progresstime / 20))
+ .append("s / ")
+ .append(String.format("%,.2f", (double) maxProgresstime / 20))
+ .append("s (")
+ .append(GT_Utility.formatNumbers((Math.round((double) progresstime / maxProgresstime * 1000) / 10.0)))
+ .append("%)");
+
+ return ret.toString();
+ }
+}
diff --git a/src/main/java/gregtech/api/util/IGT_HatchAdder.java b/src/main/java/gregtech/api/util/IGT_HatchAdder.java
new file mode 100644
index 0000000000..21796f172e
--- /dev/null
+++ b/src/main/java/gregtech/api/util/IGT_HatchAdder.java
@@ -0,0 +1,28 @@
+package gregtech.api.util;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public interface IGT_HatchAdder<T> {
+
+ /**
+ * Callback to add hatch, needs to check if hatch is valid (and add it)
+ *
+ * @param iGregTechTileEntity hatch
+ * @param aShort requested texture index, or null if not...
+ * @return managed to add hatch (structure still valid)
+ */
+ boolean apply(T t, IGregTechTileEntity iGregTechTileEntity, Short aShort);
+
+ /**
+ * hack to work around java generic issues.
+ */
+ @SuppressWarnings("unchecked")
+ default <T2 extends T> IGT_HatchAdder<T2> rebrand() {
+ return (IGT_HatchAdder<T2>) this;
+ }
+
+ default IGT_HatchAdder<T> orElse(IGT_HatchAdder<? super T> fallback) {
+ return (t, iGregTechTileEntity, aShort) -> IGT_HatchAdder.this.apply(t, iGregTechTileEntity, aShort)
+ || fallback.apply(t, iGregTechTileEntity, aShort);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/ISerializableObject.java b/src/main/java/gregtech/api/util/ISerializableObject.java
new file mode 100644
index 0000000000..7f1626bac5
--- /dev/null
+++ b/src/main/java/gregtech/api/util/ISerializableObject.java
@@ -0,0 +1,159 @@
+package gregtech.api.util;
+
+import java.io.IOException;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.CompressedStreamTools;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTSizeTracker;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagInt;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import io.netty.buffer.ByteBuf;
+
+/**
+ * We could well have used {@link java.io.Serializable}, but that's too slow and should generally be avoided
+ *
+ * @author glease
+ */
+public interface ISerializableObject {
+
+ @Nonnull
+ ISerializableObject copy();
+
+ /**
+ * If you are overriding this, you must <b>NOT</b> return {@link NBTTagInt} here! That return type is how we tell
+ * that we are loading legacy data, and only {@link LegacyCoverData} is allowed to return it. You probably want to
+ * return {@link NBTTagCompound} anyway.
+ */
+ @Nonnull
+ NBTBase saveDataToNBT();
+
+ /**
+ * Write data to given ByteBuf The data saved this way is intended to be stored for short amount of time over
+ * network. DO NOT store it to disks.
+ */
+ // the NBT is an unfortunate piece of tech. everything uses it but its API is not as efficient as could be
+ void writeToByteBuf(ByteBuf aBuf);
+
+ void loadDataFromNBT(NBTBase aNBT);
+
+ /**
+ * Read data from given parameter and return this. The data read this way is intended to be stored for short amount
+ * of time over network.
+ *
+ * @param aPlayer the player who is sending this packet to server. null if it's client reading data.
+ */
+ // the NBT is an unfortunate piece of tech. everything uses it but its API is not as efficient as could be
+ @Nonnull
+ ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer);
+
+ /**
+ * Reverse engineered and adapted {@link cpw.mods.fml.common.network.ByteBufUtils#readTag(ByteBuf)} Given buffer
+ * must contain a serialized NBTTagCompound in minecraft encoding
+ */
+ static NBTTagCompound readCompoundTagFromGreggyByteBuf(ByteArrayDataInput aBuf) {
+ short size = aBuf.readShort();
+ if (size < 0) return null;
+ else {
+ byte[] buf = new byte[size]; // this is shit, how many copies have we been doing?
+ aBuf.readFully(buf);
+ try {
+ return CompressedStreamTools.func_152457_a(buf, new NBTSizeTracker(2097152L));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ /**
+ * Reverse engineered and adapted {@link cpw.mods.fml.common.network.ByteBufUtils#readItemStack(ByteBuf)} Given
+ * buffer must contain a serialized ItemStack in minecraft encoding
+ */
+ static ItemStack readItemStackFromGreggyByteBuf(ByteArrayDataInput aBuf) {
+ ItemStack stack = null;
+ short id = aBuf.readShort();
+ if (id >= 0) {
+ byte size = aBuf.readByte();
+ short meta = aBuf.readShort();
+ stack = new ItemStack(Item.getItemById(id), size, meta);
+ stack.stackTagCompound = readCompoundTagFromGreggyByteBuf(aBuf);
+ }
+ return stack;
+ }
+
+ final class LegacyCoverData implements ISerializableObject {
+
+ private int mData;
+
+ public LegacyCoverData() {}
+
+ public LegacyCoverData(int mData) {
+ this.mData = mData;
+ }
+
+ @Override
+ @Nonnull
+ public ISerializableObject copy() {
+ return new LegacyCoverData(mData);
+ }
+
+ @Override
+ @Nonnull
+ public NBTBase saveDataToNBT() {
+ return new NBTTagInt(mData);
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ aBuf.writeInt(mData);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ mData = aNBT instanceof NBTTagInt ? ((NBTTagInt) aNBT).func_150287_d() : 0;
+ }
+
+ @Override
+ @Nonnull
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ mData = aBuf.readInt();
+ return this;
+ }
+
+ public int get() {
+ return mData;
+ }
+
+ public void set(int mData) {
+ this.mData = mData;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ LegacyCoverData that = (LegacyCoverData) o;
+
+ return mData == that.mData;
+ }
+
+ @Override
+ public int hashCode() {
+ return mData;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(mData);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/LightingHelper.java b/src/main/java/gregtech/api/util/LightingHelper.java
new file mode 100644
index 0000000000..ad2510e937
--- /dev/null
+++ b/src/main/java/gregtech/api/util/LightingHelper.java
@@ -0,0 +1,1434 @@
+/*
+ * LightingHelper - Derived and adapted from @Mineshopper / carpentersblocks Copyright (c) 2013-2021. This library is
+ * free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation version 2.1 of the License. This library is distributed in the hope that it
+ * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of
+ * the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package gregtech.api.util;
+
+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.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+@SuppressWarnings("unused")
+@SideOnly(Side.CLIENT)
+public class LightingHelper {
+
+ public static final int NORMAL_BRIGHTNESS = 0xff00ff;
+ public static final int MAX_BRIGHTNESS = 0xf000f0;
+ public static final float NO_Z_FIGHT_OFFSET = 1.0F / 1024.0F;
+ protected static final float[] LIGHTNESS = { 0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F };
+ private final RenderBlocks renderBlocks;
+ /**
+ * Brightness for side.
+ */
+ private int brightness;
+ /**
+ * Ambient occlusion values for all four corners of side.
+ */
+ private float aoTopLeft, aoBottomLeft, aoBottomRight, aoTopRight;
+
+ private boolean hasLightnessOverride;
+ private float lightnessOverride;
+ private boolean hasBrightnessOverride;
+ private int brightnessOverride;
+ private boolean hasColorOverride;
+ private int colorOverride = 0xffffff;
+
+ /**
+ * Class constructor specifying the {@link RenderBlocks}.
+ *
+ * @param renderBlocks the {@link RenderBlocks}
+ */
+ public LightingHelper(RenderBlocks renderBlocks) {
+ this.renderBlocks = renderBlocks;
+ if (renderBlocks.useInventoryTint) {
+ // Block will be rendered in an inventory, so it needs its lightness maxed
+ setLightnessOverride(1.0F);
+ }
+ }
+
+ /**
+ * Gets average brightness from two brightness values.
+ *
+ * @param brightnessA the first brightness value
+ * @param brightnessB the second brightness value
+ * @return the mixed brightness
+ */
+ public static int getAverageBrightness(int brightnessA, int brightnessB) {
+ int sectionA1 = brightnessA >> 16 & 0xff;
+ int sectionA2 = brightnessA & 255;
+
+ int sectionB1 = brightnessB >> 16 & 0xff;
+ int sectionB2 = brightnessB & 255;
+
+ int difference1 = (int) ((sectionA1 + sectionB1) / 2.0F);
+ int difference2 = (int) ((sectionA2 + sectionB2) / 2.0F);
+
+ return difference1 << 16 | difference2;
+ }
+
+ /**
+ * Gets rgb color from RGBA array.
+ *
+ * @param color the integer color
+ * @return a float array with rgb values
+ */
+ public static float[] getRGB(short[] color) {
+ float red = color[0] / 255.0F;
+ float green = color[1] / 255.0F;
+ float blue = color[2] / 255.0F;
+
+ return new float[] { red, green, blue };
+ }
+
+ /**
+ * Clears brightness override.
+ */
+ public void clearBrightnessOverride() {
+ hasBrightnessOverride = false;
+ }
+
+ /**
+ * Clears color override.
+ */
+ public void clearColorOverride() {
+ hasColorOverride = false;
+ }
+
+ /**
+ * Clears lightness override.
+ */
+ public void clearLightnessOverride() {
+ hasLightnessOverride = false;
+ }
+
+ /**
+ * @return the Ambient Occlusion for Bottom-Left corner
+ */
+ public float getAoBottomLeft() {
+ return aoBottomLeft;
+ }
+
+ /**
+ * @return the Ambient Occlusion for Bottom-Right corner
+ */
+ public float getAoBottomRight() {
+ return aoBottomRight;
+ }
+
+ /**
+ * @return the Ambient Occlusion for Top-Left corner
+ */
+ public float getAoTopLeft() {
+ return aoTopLeft;
+ }
+
+ /**
+ * @return the Ambient Occlusion for Top-Right corner
+ */
+ public float getAoTopRight() {
+ return aoTopRight;
+ }
+
+ /**
+ * Sets brightness override.
+ *
+ * @param brightness the brightness override
+ * @return the {@link LightingHelper}
+ */
+ public LightingHelper setBrightnessOverride(int brightness) {
+ hasBrightnessOverride = true;
+ brightnessOverride = brightness;
+ return this;
+ }
+
+ public LightingHelper setColorOverride(short[] color) {
+ return setColorOverride(getColor(color));
+ }
+
+ /**
+ * Sets color override.
+ *
+ * @param color the color override
+ * @return the {@link LightingHelper}
+ */
+ public LightingHelper setColorOverride(int color) {
+ hasColorOverride = true;
+ colorOverride = color;
+ return this;
+ }
+
+ /**
+ * Gets int color from RGBA array.
+ *
+ * @param rgba the short RGBA color array
+ * @return int color
+ */
+ public static int getColor(short[] rgba) {
+ return (rgba[2] & 0xff) | (rgba[1] & 0xff) << 8 | (rgba[0] & 0xff) << 16;
+ }
+
+ /**
+ * Sets lightness override.
+ *
+ * @param lightness the lightness override
+ * @return the {@link LightingHelper}
+ */
+ public LightingHelper setLightnessOverride(float lightness) {
+ hasLightnessOverride = true;
+ lightnessOverride = lightness;
+ return this;
+ }
+
+ /**
+ * Sets up the color using lightness, brightness, and the primary color value (usually the dye color) for the side.
+ *
+ * @param side the side
+ * @param rgba the primary short[] RGBA color array
+ */
+ public void setupColor(ForgeDirection side, short[] rgba) {
+ setupColor(side, getColor(rgba));
+ }
+
+ /**
+ * Sets up the color using lightness, brightness, and the primary color value (usually the dye color) for the side.
+ *
+ * @param side the side
+ * @param hexColor the primary color
+ */
+ public void setupColor(ForgeDirection side, int hexColor) {
+ Tessellator tessellator = Tessellator.instance;
+ float lightness = hasLightnessOverride ? lightnessOverride : LIGHTNESS[side.ordinal()];
+ float[] rgb = getRGB(hexColor);
+
+ if (hasColorOverride && !renderBlocks.hasOverrideBlockTexture()) {
+ rgb = getRGB(colorOverride);
+ }
+
+ applyAnaglyph(rgb);
+
+ if (renderBlocks.enableAO) {
+ tessellator.setBrightness(hasBrightnessOverride ? brightnessOverride : brightness);
+
+ if (renderBlocks.hasOverrideBlockTexture()) {
+
+ renderBlocks.colorRedTopLeft = renderBlocks.colorRedBottomLeft = renderBlocks.colorRedBottomRight = renderBlocks.colorRedTopRight = rgb[0];
+ renderBlocks.colorGreenTopLeft = renderBlocks.colorGreenBottomLeft = renderBlocks.colorGreenBottomRight = renderBlocks.colorGreenTopRight = rgb[1];
+ renderBlocks.colorBlueTopLeft = renderBlocks.colorBlueBottomLeft = renderBlocks.colorBlueBottomRight = renderBlocks.colorBlueTopRight = rgb[2];
+
+ } else {
+
+ renderBlocks.colorRedTopLeft = renderBlocks.colorRedBottomLeft = renderBlocks.colorRedBottomRight = renderBlocks.colorRedTopRight = rgb[0]
+ * lightness;
+ renderBlocks.colorGreenTopLeft = renderBlocks.colorGreenBottomLeft = renderBlocks.colorGreenBottomRight = renderBlocks.colorGreenTopRight = rgb[1]
+ * lightness;
+ renderBlocks.colorBlueTopLeft = renderBlocks.colorBlueBottomLeft = renderBlocks.colorBlueBottomRight = renderBlocks.colorBlueTopRight = rgb[2]
+ * lightness;
+
+ renderBlocks.colorRedTopLeft *= aoTopLeft;
+ renderBlocks.colorGreenTopLeft *= aoTopLeft;
+ renderBlocks.colorBlueTopLeft *= aoTopLeft;
+ renderBlocks.colorRedBottomLeft *= aoBottomLeft;
+ renderBlocks.colorGreenBottomLeft *= aoBottomLeft;
+ renderBlocks.colorBlueBottomLeft *= aoBottomLeft;
+ renderBlocks.colorRedBottomRight *= aoBottomRight;
+ renderBlocks.colorGreenBottomRight *= aoBottomRight;
+ renderBlocks.colorBlueBottomRight *= aoBottomRight;
+ renderBlocks.colorRedTopRight *= aoTopRight;
+ renderBlocks.colorGreenTopRight *= aoTopRight;
+ renderBlocks.colorBlueTopRight *= aoTopRight;
+ }
+
+ } else {
+
+ if (hasBrightnessOverride) tessellator.setBrightness(brightnessOverride);
+ tessellator.setColorOpaque_F(rgb[0] * lightness, rgb[1] * lightness, rgb[2] * lightness);
+ }
+ }
+
+ /**
+ * Gets rgb color from integer.
+ *
+ * @param color the integer color
+ * @return a float array with rgb values
+ */
+ public static float[] getRGB(int color) {
+ float red = (color >> 16 & 0xff) / 255.0F;
+ float green = (color >> 8 & 0xff) / 255.0F;
+ float blue = (color & 0xff) / 255.0F;
+
+ return new float[] { red, green, blue };
+ }
+
+ /**
+ * Will apply anaglyph color multipliers to RGB float array.
+ * <p>
+ * If {@link EntityRenderer#anaglyphEnable} is false, will do nothing.
+ *
+ * @param rgb array containing red, green and blue float values
+ */
+ public void applyAnaglyph(float[] rgb) {
+ if (EntityRenderer.anaglyphEnable) {
+ rgb[0] = (rgb[0] * 30.0F + rgb[1] * 59.0F + rgb[2] * 11.0F) / 100.0F;
+ rgb[1] = (rgb[0] * 30.0F + rgb[1] * 70.0F) / 100.0F;
+ rgb[2] = (rgb[0] * 30.0F + rgb[2] * 70.0F) / 100.0F;
+ }
+ }
+
+ /**
+ * Gets mixed ambient occlusion value from two inputs, with a ratio applied to the final result.
+ *
+ * @param ao1 the first ambient occlusion value
+ * @param ao2 the second ambient occlusion value
+ * @param ratio the ratio for mixing
+ * @return the mixed red, green, blue float values
+ */
+ public static float getMixedAo(float ao1, float ao2, double ratio) {
+ float diff = (float) (Math.abs(ao1 - ao2) * (1.0F - ratio));
+
+ return ao1 > ao2 ? ao1 - diff : ao1 + diff;
+ }
+
+ /**
+ * @see #setupLightingXNeg(Block, int, int, int)
+ * @see #setupLightingYNeg(Block, int, int, int)
+ * @see #setupLightingZNeg(Block, int, int, int)
+ * @see #setupLightingXPos(Block, int, int, int)
+ * @see #setupLightingYPos(Block, int, int, int)
+ * @see #setupLightingZPos(Block, int, int, int)
+ */
+ public LightingHelper setupLighting(Block block, int x, int y, int z, ForgeDirection facing) {
+ return switch (facing) {
+ case DOWN -> setupLightingYNeg(block, x, y, z);
+ case UP -> setupLightingYPos(block, x, y, z);
+ case NORTH -> setupLightingZNeg(block, x, y, z);
+ case SOUTH -> setupLightingZPos(block, x, y, z);
+ case WEST -> setupLightingXNeg(block, x, y, z);
+ case EAST -> setupLightingXPos(block, x, y, z);
+ default -> throw new IllegalArgumentException("Unknown side: " + facing);
+ };
+ }
+
+ /**
+ * Sets up lighting for the West face and returns the {@link LightingHelper}.
+ * <p>
+ * This is a consolidated <code>method</code> that sets side shading with respect to the following attributes:
+ * <p>
+ * <ul>
+ * <li>{@link RenderBlocks#enableAO}</li>
+ * <li>{@link RenderBlocks#partialRenderBounds}</li>
+ * </ul>
+ *
+ * @param block the block {@link Block}
+ * @param x the x coordinate
+ * @param y the y coordinate
+ * @param z the z coordinate
+ * @return the {@link LightingHelper}
+ */
+ public LightingHelper setupLightingXNeg(Block block, int x, int y, int z) {
+
+ if (renderBlocks.enableAO) {
+
+ int xOffset = renderBlocks.renderMinX > 0.0F + NO_Z_FIGHT_OFFSET ? x : x - 1;
+
+ int mixedBrightness = block.getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y, z);
+ brightness = mixedBrightness;
+
+ float ratio = (float) (1.0F - renderBlocks.renderMinX);
+ float aoLightValue = renderBlocks.blockAccess.getBlock(x - 1, y, z)
+ .getAmbientOcclusionLightValue();
+
+ renderBlocks.aoBrightnessXYNN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y - 1, z);
+ renderBlocks.aoBrightnessXZNN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y, z - 1);
+ renderBlocks.aoBrightnessXZNP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y, z + 1);
+ renderBlocks.aoBrightnessXYNP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y + 1, z);
+ renderBlocks.aoBrightnessXYZNNN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y - 1, z - 1);
+ renderBlocks.aoBrightnessXYZNNP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y - 1, z + 1);
+ renderBlocks.aoBrightnessXYZNPN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y + 1, z - 1);
+ renderBlocks.aoBrightnessXYZNPP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y + 1, z + 1);
+ renderBlocks.aoLightValueScratchXYNN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y - 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y - 1, z)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXZNN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y, z - 1)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXZNP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y, z + 1)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYNP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y + 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y + 1, z)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYZNNN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y - 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y - 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYZNNP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y - 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y - 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYZNPN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y + 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y + 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYZNPP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y + 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y + 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+
+ int brightnessMixedXYZNPN = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXZNN,
+ renderBlocks.aoBrightnessXYZNPN,
+ renderBlocks.aoBrightnessXYNP,
+ mixedBrightness);
+ int brightnessMixedXYZNNN = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXYZNNN,
+ renderBlocks.aoBrightnessXYNN,
+ renderBlocks.aoBrightnessXZNN,
+ mixedBrightness);
+ int brightnessMixedXYZNNP = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXYNN,
+ renderBlocks.aoBrightnessXYZNNP,
+ renderBlocks.aoBrightnessXZNP,
+ mixedBrightness);
+ int brightnessMixedXYZNPP = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXZNP,
+ renderBlocks.aoBrightnessXYNP,
+ renderBlocks.aoBrightnessXYZNPP,
+ mixedBrightness);
+
+ float aoMixedXYZNPN = (renderBlocks.aoLightValueScratchXZNN + aoLightValue
+ + renderBlocks.aoLightValueScratchXYZNPN
+ + renderBlocks.aoLightValueScratchXYNP) / 4.0F;
+ float aoMixedXYZNNN = (renderBlocks.aoLightValueScratchXYZNNN + renderBlocks.aoLightValueScratchXYNN
+ + renderBlocks.aoLightValueScratchXZNN
+ + aoLightValue) / 4.0F;
+ float aoMixedXYZNNP = (renderBlocks.aoLightValueScratchXYNN + renderBlocks.aoLightValueScratchXYZNNP
+ + aoLightValue
+ + renderBlocks.aoLightValueScratchXZNP) / 4.0F;
+ float aoMixedXYZNPP = (aoLightValue + renderBlocks.aoLightValueScratchXZNP
+ + renderBlocks.aoLightValueScratchXYNP
+ + renderBlocks.aoLightValueScratchXYZNPP) / 4.0F;
+
+ aoTopLeft = (float) (aoMixedXYZNPP * renderBlocks.renderMaxY * renderBlocks.renderMaxZ
+ + aoMixedXYZNPN * renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMaxZ)
+ + aoMixedXYZNNN * (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMaxZ)
+ + aoMixedXYZNNP * (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMaxZ);
+ aoBottomLeft = (float) (aoMixedXYZNPP * renderBlocks.renderMaxY * renderBlocks.renderMinZ
+ + aoMixedXYZNPN * renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMinZ)
+ + aoMixedXYZNNN * (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMinZ)
+ + aoMixedXYZNNP * (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMinZ);
+ aoBottomRight = (float) (aoMixedXYZNPP * renderBlocks.renderMinY * renderBlocks.renderMinZ
+ + aoMixedXYZNPN * renderBlocks.renderMinY * (1.0D - renderBlocks.renderMinZ)
+ + aoMixedXYZNNN * (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMinZ)
+ + aoMixedXYZNNP * (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMinZ);
+ aoTopRight = (float) (aoMixedXYZNPP * renderBlocks.renderMinY * renderBlocks.renderMaxZ
+ + aoMixedXYZNPN * renderBlocks.renderMinY * (1.0D - renderBlocks.renderMaxZ)
+ + aoMixedXYZNNN * (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMaxZ)
+ + aoMixedXYZNNP * (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMaxZ);
+
+ renderBlocks.brightnessTopLeft = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPP,
+ brightnessMixedXYZNPN,
+ brightnessMixedXYZNNN,
+ brightnessMixedXYZNNP,
+ renderBlocks.renderMaxY * renderBlocks.renderMaxZ,
+ renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMaxZ),
+ (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMaxZ),
+ (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMaxZ);
+ renderBlocks.brightnessBottomLeft = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPP,
+ brightnessMixedXYZNPN,
+ brightnessMixedXYZNNN,
+ brightnessMixedXYZNNP,
+ renderBlocks.renderMaxY * renderBlocks.renderMinZ,
+ renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMinZ),
+ (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMinZ),
+ (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMinZ);
+ renderBlocks.brightnessBottomRight = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPP,
+ brightnessMixedXYZNPN,
+ brightnessMixedXYZNNN,
+ brightnessMixedXYZNNP,
+ renderBlocks.renderMinY * renderBlocks.renderMinZ,
+ renderBlocks.renderMinY * (1.0D - renderBlocks.renderMinZ),
+ (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMinZ),
+ (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMinZ);
+ renderBlocks.brightnessTopRight = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPP,
+ brightnessMixedXYZNPN,
+ brightnessMixedXYZNNN,
+ brightnessMixedXYZNNP,
+ renderBlocks.renderMinY * renderBlocks.renderMaxZ,
+ renderBlocks.renderMinY * (1.0D - renderBlocks.renderMaxZ),
+ (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMaxZ),
+ (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMaxZ);
+ }
+
+ return this;
+ }
+
+ /**
+ * Sets up lighting for the East face and returns the {@link LightingHelper}.
+ * <p>
+ * This is a consolidated <code>method</code> that sets side shading with respect to the following attributes:
+ * <p>
+ * <ul>
+ * <li>{@link RenderBlocks#enableAO}</li>
+ * <li>{@link RenderBlocks#partialRenderBounds}</li>
+ * </ul>
+ *
+ * @param block the block {@link Block}
+ * @param x the x coordinate
+ * @param y the y coordinate
+ * @param z the z coordinate
+ * @return the {@link LightingHelper}
+ */
+ public LightingHelper setupLightingXPos(Block block, int x, int y, int z) {
+
+ if (renderBlocks.enableAO) {
+
+ int xOffset = renderBlocks.renderMaxX < 1.0F - NO_Z_FIGHT_OFFSET ? x : x + 1;
+
+ int mixedBrightness = block.getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y, z);
+ brightness = mixedBrightness;
+
+ float aoLightValue = renderBlocks.blockAccess.getBlock(x + 1, y, z)
+ .getAmbientOcclusionLightValue();
+
+ renderBlocks.aoBrightnessXYPN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y - 1, z);
+ renderBlocks.aoBrightnessXZPN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y, z - 1);
+ renderBlocks.aoBrightnessXZPP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y, z + 1);
+ renderBlocks.aoBrightnessXYPP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y + 1, z);
+ renderBlocks.aoBrightnessXYZPNN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y - 1, z - 1);
+ renderBlocks.aoBrightnessXYZPNP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y - 1, z + 1);
+ renderBlocks.aoBrightnessXYZPPN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y + 1, z - 1);
+ renderBlocks.aoBrightnessXYZPPP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, xOffset, y + 1, z + 1);
+ renderBlocks.aoLightValueScratchXYPN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y - 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y - 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxX);
+ renderBlocks.aoLightValueScratchXZPN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxX);
+ renderBlocks.aoLightValueScratchXZPP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxX);
+ renderBlocks.aoLightValueScratchXYPP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y + 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y + 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxX);
+ renderBlocks.aoLightValueScratchXYZPNN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y - 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y - 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxX);
+ renderBlocks.aoLightValueScratchXYZPNP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y - 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y - 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxX);
+ renderBlocks.aoLightValueScratchXYZPPN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y + 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y + 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxX);
+ renderBlocks.aoLightValueScratchXYZPPP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y + 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y + 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxX);
+
+ int brightnessMixedXYZPPP = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXZPP,
+ renderBlocks.aoBrightnessXYPP,
+ renderBlocks.aoBrightnessXYZPPP,
+ mixedBrightness);
+ int brightnessMixedXYZPNP = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXYPN,
+ renderBlocks.aoBrightnessXYZPNP,
+ renderBlocks.aoBrightnessXZPP,
+ mixedBrightness);
+ int brightnessMixedXYZPNN = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXYZPNN,
+ renderBlocks.aoBrightnessXYPN,
+ renderBlocks.aoBrightnessXZPN,
+ mixedBrightness);
+ int brightnessMixedXYZPPN = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXZPN,
+ renderBlocks.aoBrightnessXYZPPN,
+ renderBlocks.aoBrightnessXYPP,
+ mixedBrightness);
+
+ float aoMixedXYZPPP = (aoLightValue + renderBlocks.aoLightValueScratchXZPP
+ + renderBlocks.aoLightValueScratchXYPP
+ + renderBlocks.aoLightValueScratchXYZPPP) / 4.0F;
+ float aoMixedXYZPNP = (renderBlocks.aoLightValueScratchXYPN + renderBlocks.aoLightValueScratchXYZPNP
+ + aoLightValue
+ + renderBlocks.aoLightValueScratchXZPP) / 4.0F;
+ float aoMixedXYZPNN = (renderBlocks.aoLightValueScratchXYZPNN + renderBlocks.aoLightValueScratchXYPN
+ + renderBlocks.aoLightValueScratchXZPN
+ + aoLightValue) / 4.0F;
+ float aoMixedXYZPPN = (renderBlocks.aoLightValueScratchXZPN + aoLightValue
+ + renderBlocks.aoLightValueScratchXYZPPN
+ + renderBlocks.aoLightValueScratchXYPP) / 4.0F;
+
+ aoTopLeft = (float) (aoMixedXYZPNP * (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMaxZ
+ + aoMixedXYZPNN * (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMaxZ)
+ + aoMixedXYZPPN * renderBlocks.renderMinY * (1.0D - renderBlocks.renderMaxZ)
+ + aoMixedXYZPPP * renderBlocks.renderMinY * renderBlocks.renderMaxZ);
+ aoBottomLeft = (float) (aoMixedXYZPNP * (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMinZ
+ + aoMixedXYZPNN * (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMinZ)
+ + aoMixedXYZPPN * renderBlocks.renderMinY * (1.0D - renderBlocks.renderMinZ)
+ + aoMixedXYZPPP * renderBlocks.renderMinY * renderBlocks.renderMinZ);
+ aoBottomRight = (float) (aoMixedXYZPNP * (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMinZ
+ + aoMixedXYZPNN * (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMinZ)
+ + aoMixedXYZPPN * renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMinZ)
+ + aoMixedXYZPPP * renderBlocks.renderMaxY * renderBlocks.renderMinZ);
+ aoTopRight = (float) (aoMixedXYZPNP * (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMaxZ
+ + aoMixedXYZPNN * (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMaxZ)
+ + aoMixedXYZPPN * renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMaxZ)
+ + aoMixedXYZPPP * renderBlocks.renderMaxY * renderBlocks.renderMaxZ);
+
+ renderBlocks.brightnessTopLeft = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZPNP,
+ brightnessMixedXYZPNN,
+ brightnessMixedXYZPPN,
+ brightnessMixedXYZPPP,
+ (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMaxZ,
+ (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMaxZ),
+ renderBlocks.renderMinY * (1.0D - renderBlocks.renderMaxZ),
+ renderBlocks.renderMinY * renderBlocks.renderMaxZ);
+ renderBlocks.brightnessBottomLeft = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZPNP,
+ brightnessMixedXYZPNN,
+ brightnessMixedXYZPPN,
+ brightnessMixedXYZPPP,
+ (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMinZ,
+ (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMinZ),
+ renderBlocks.renderMinY * (1.0D - renderBlocks.renderMinZ),
+ renderBlocks.renderMinY * renderBlocks.renderMinZ);
+ renderBlocks.brightnessBottomRight = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZPNP,
+ brightnessMixedXYZPNN,
+ brightnessMixedXYZPPN,
+ brightnessMixedXYZPPP,
+ (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMinZ,
+ (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMinZ),
+ renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMinZ),
+ renderBlocks.renderMaxY * renderBlocks.renderMinZ);
+ renderBlocks.brightnessTopRight = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZPNP,
+ brightnessMixedXYZPNN,
+ brightnessMixedXYZPPN,
+ brightnessMixedXYZPPP,
+ (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMaxZ,
+ (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMaxZ),
+ renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMaxZ),
+ renderBlocks.renderMaxY * renderBlocks.renderMaxZ);
+ }
+
+ return this;
+ }
+
+ /**
+ * Sets up lighting for the bottom face and returns the {@link LightingHelper}.
+ * <p>
+ * This is a consolidated <code>method</code> that sets side shading with respect to the following attributes:
+ * <p>
+ * <ul>
+ * <li>{@link RenderBlocks#enableAO}</li>
+ * <li>{@link RenderBlocks#partialRenderBounds}</li>
+ * </ul>
+ *
+ * @param block the block {@link Block}
+ * @param x the x coordinate
+ * @param y the y coordinate
+ * @param z the z coordinate
+ * @return the {@link LightingHelper}
+ */
+ public LightingHelper setupLightingYNeg(Block block, int x, int y, int z) {
+
+ if (renderBlocks.enableAO) {
+
+ int yOffset = renderBlocks.renderMinY > 0.0F + NO_Z_FIGHT_OFFSET ? y : y - 1;
+
+ int mixedBrightness = block.getMixedBrightnessForBlock(renderBlocks.blockAccess, x, yOffset, z);
+ brightness = mixedBrightness;
+
+ float ratio = (float) (1.0F - renderBlocks.renderMinY);
+ float aoLightValue = renderBlocks.blockAccess.getBlock(x, y - 1, z)
+ .getAmbientOcclusionLightValue();
+
+ renderBlocks.aoBrightnessXYNN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x - 1, yOffset, z);
+ renderBlocks.aoBrightnessYZNN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x, yOffset, z - 1);
+ renderBlocks.aoBrightnessYZNP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x, yOffset, z + 1);
+ renderBlocks.aoBrightnessXYPN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x + 1, yOffset, z);
+ renderBlocks.aoBrightnessXYZNNN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x - 1, yOffset, z - 1);
+ renderBlocks.aoBrightnessXYZNNP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x - 1, yOffset, z + 1);
+ renderBlocks.aoBrightnessXYZPNN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x + 1, yOffset, z - 1);
+ renderBlocks.aoBrightnessXYZPNP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x + 1, yOffset, z + 1);
+ renderBlocks.aoLightValueScratchXYNN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y - 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x - 1, y, z)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchYZNN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x, y - 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y, z - 1)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchYZNP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x, y - 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y, z + 1)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYPN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y - 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x + 1, y, z)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYZNNN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y - 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x - 1, y, z - 1)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYZNNP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y - 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x - 1, y, z + 1)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYZPNN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y - 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x + 1, y, z - 1)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYZPNP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y - 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x + 1, y, z + 1)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+
+ int brightnessMixedXYZPNP = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessYZNP,
+ renderBlocks.aoBrightnessXYZPNP,
+ renderBlocks.aoBrightnessXYPN,
+ mixedBrightness);
+ int brightnessMixedXYZPNN = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessYZNN,
+ renderBlocks.aoBrightnessXYPN,
+ renderBlocks.aoBrightnessXYZPNN,
+ mixedBrightness);
+ int brightnessMixedXYZNNN = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXYNN,
+ renderBlocks.aoBrightnessXYZNNN,
+ renderBlocks.aoBrightnessYZNN,
+ mixedBrightness);
+ int brightnessMixedXYZNNP = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXYZNNP,
+ renderBlocks.aoBrightnessXYNN,
+ renderBlocks.aoBrightnessYZNP,
+ mixedBrightness);
+
+ float aoMixedXYZPNP = (renderBlocks.aoLightValueScratchYZNP + aoLightValue
+ + renderBlocks.aoLightValueScratchXYZPNP
+ + renderBlocks.aoLightValueScratchXYPN) / 4.0F;
+ float aoMixedXYZPNN = (aoLightValue + renderBlocks.aoLightValueScratchYZNN
+ + renderBlocks.aoLightValueScratchXYPN
+ + renderBlocks.aoLightValueScratchXYZPNN) / 4.0F;
+ float aoMixedXYZNNN = (renderBlocks.aoLightValueScratchXYNN + renderBlocks.aoLightValueScratchXYZNNN
+ + aoLightValue
+ + renderBlocks.aoLightValueScratchYZNN) / 4.0F;
+ float aoMixedXYZNNP = (renderBlocks.aoLightValueScratchXYZNNP + renderBlocks.aoLightValueScratchXYNN
+ + renderBlocks.aoLightValueScratchYZNP
+ + aoLightValue) / 4.0F;
+
+ aoTopLeft = (float) (aoMixedXYZNNP * renderBlocks.renderMaxZ * (1.0D - renderBlocks.renderMinX)
+ + aoMixedXYZPNP * renderBlocks.renderMaxZ * renderBlocks.renderMinX
+ + aoMixedXYZPNN * (1.0D - renderBlocks.renderMaxZ) * renderBlocks.renderMinX
+ + aoMixedXYZNNN * (1.0D - renderBlocks.renderMaxZ) * (1.0D - renderBlocks.renderMinX));
+ aoBottomLeft = (float) (aoMixedXYZNNP * renderBlocks.renderMinZ * (1.0D - renderBlocks.renderMinX)
+ + aoMixedXYZPNP * renderBlocks.renderMinZ * renderBlocks.renderMinX
+ + aoMixedXYZPNN * (1.0D - renderBlocks.renderMinZ) * renderBlocks.renderMinX
+ + aoMixedXYZNNN * (1.0D - renderBlocks.renderMinZ) * (1.0D - renderBlocks.renderMinX));
+ aoBottomRight = (float) (aoMixedXYZNNP * renderBlocks.renderMinZ * (1.0D - renderBlocks.renderMaxX)
+ + aoMixedXYZPNP * renderBlocks.renderMinZ * renderBlocks.renderMaxX
+ + aoMixedXYZPNN * (1.0D - renderBlocks.renderMinZ) * renderBlocks.renderMaxX
+ + aoMixedXYZNNN * (1.0D - renderBlocks.renderMinZ) * (1.0D - renderBlocks.renderMaxX));
+ aoTopRight = (float) (aoMixedXYZNNP * renderBlocks.renderMaxZ * (1.0D - renderBlocks.renderMaxX)
+ + aoMixedXYZPNP * renderBlocks.renderMaxZ * renderBlocks.renderMaxX
+ + aoMixedXYZPNN * (1.0D - renderBlocks.renderMaxZ) * renderBlocks.renderMaxX
+ + aoMixedXYZNNN * (1.0D - renderBlocks.renderMaxZ) * (1.0D - renderBlocks.renderMaxX));
+
+ renderBlocks.brightnessTopLeft = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNNP,
+ brightnessMixedXYZPNP,
+ brightnessMixedXYZPNN,
+ brightnessMixedXYZNNN,
+ renderBlocks.renderMaxZ * (1.0D - renderBlocks.renderMinX),
+ renderBlocks.renderMaxZ * renderBlocks.renderMinX,
+ (1.0D - renderBlocks.renderMaxZ) * renderBlocks.renderMinX,
+ (1.0D - renderBlocks.renderMaxZ) * (1.0D - renderBlocks.renderMinX));
+ renderBlocks.brightnessBottomLeft = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNNP,
+ brightnessMixedXYZPNP,
+ brightnessMixedXYZPNN,
+ brightnessMixedXYZNNN,
+ renderBlocks.renderMinZ * (1.0D - renderBlocks.renderMinX),
+ renderBlocks.renderMinZ * renderBlocks.renderMinX,
+ (1.0D - renderBlocks.renderMinZ) * renderBlocks.renderMinX,
+ (1.0D - renderBlocks.renderMinZ) * (1.0D - renderBlocks.renderMinX));
+ renderBlocks.brightnessBottomRight = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNNP,
+ brightnessMixedXYZPNP,
+ brightnessMixedXYZPNN,
+ brightnessMixedXYZNNN,
+ renderBlocks.renderMinZ * (1.0D - renderBlocks.renderMaxX),
+ renderBlocks.renderMinZ * renderBlocks.renderMaxX,
+ (1.0D - renderBlocks.renderMinZ) * renderBlocks.renderMaxX,
+ (1.0D - renderBlocks.renderMinZ) * (1.0D - renderBlocks.renderMaxX));
+ renderBlocks.brightnessTopRight = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNNP,
+ brightnessMixedXYZPNP,
+ brightnessMixedXYZPNN,
+ brightnessMixedXYZNNN,
+ renderBlocks.renderMaxZ * (1.0D - renderBlocks.renderMaxX),
+ renderBlocks.renderMaxZ * renderBlocks.renderMaxX,
+ (1.0D - renderBlocks.renderMaxZ) * renderBlocks.renderMaxX,
+ (1.0D - renderBlocks.renderMaxZ) * (1.0D - renderBlocks.renderMaxX));
+ }
+
+ return this;
+ }
+
+ /**
+ * Sets up lighting for the top face and returns the {@link LightingHelper}.
+ * <p>
+ * This is a consolidated <code>method</code> that sets side shading with respect to the following attributes:
+ * <p>
+ * <ul>
+ * <li>{@link RenderBlocks#enableAO}</li>
+ * <li>{@link RenderBlocks#partialRenderBounds}</li>
+ * </ul>
+ *
+ * @param block the block {@link Block}
+ * @param x the x coordinate
+ * @param y the y coordinate
+ * @param z the z coordinate
+ * @return the {@link LightingHelper}
+ */
+ public LightingHelper setupLightingYPos(Block block, int x, int y, int z) {
+
+ if (renderBlocks.enableAO) {
+
+ int yOffset = renderBlocks.renderMaxY < 1.0F - NO_Z_FIGHT_OFFSET ? y : y + 1;
+
+ int mixedBrightness = block.getMixedBrightnessForBlock(renderBlocks.blockAccess, x, yOffset, z);
+ brightness = mixedBrightness;
+
+ float aoLightValue = renderBlocks.blockAccess.getBlock(x, y + 1, z)
+ .getAmbientOcclusionLightValue();
+
+ renderBlocks.aoBrightnessXYNP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x - 1, yOffset, z);
+ renderBlocks.aoBrightnessXYPP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x + 1, yOffset, z);
+ renderBlocks.aoBrightnessYZPN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x, yOffset, z - 1);
+ renderBlocks.aoBrightnessYZPP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x, yOffset, z + 1);
+ renderBlocks.aoBrightnessXYZNPN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x - 1, yOffset, z - 1);
+ renderBlocks.aoBrightnessXYZPPN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x + 1, yOffset, z - 1);
+ renderBlocks.aoBrightnessXYZNPP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x - 1, yOffset, z + 1);
+ renderBlocks.aoBrightnessXYZPPP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x + 1, yOffset, z + 1);
+ renderBlocks.aoLightValueScratchXYNP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y + 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x - 1, y, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxY);
+ renderBlocks.aoLightValueScratchXYPP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y + 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x + 1, y, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxY);
+ renderBlocks.aoLightValueScratchYZPN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x, y + 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxY);
+ renderBlocks.aoLightValueScratchYZPP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x, y + 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxY);
+ renderBlocks.aoLightValueScratchXYZNPN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y + 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x - 1, y, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxY);
+ renderBlocks.aoLightValueScratchXYZPPN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y + 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x + 1, y, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxY);
+ renderBlocks.aoLightValueScratchXYZNPP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y + 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x - 1, y, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxY);
+ renderBlocks.aoLightValueScratchXYZPPP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y + 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x + 1, y, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxY);
+
+ int brightnessMixedXYZPPP = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessYZPP,
+ renderBlocks.aoBrightnessXYZPPP,
+ renderBlocks.aoBrightnessXYPP,
+ mixedBrightness);
+ int brightnessMixedXYZPPN = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessYZPN,
+ renderBlocks.aoBrightnessXYPP,
+ renderBlocks.aoBrightnessXYZPPN,
+ mixedBrightness);
+ int brightnessMixedXYZNPN = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXYNP,
+ renderBlocks.aoBrightnessXYZNPN,
+ renderBlocks.aoBrightnessYZPN,
+ mixedBrightness);
+ int brightnessMixedXYZNPP = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXYZNPP,
+ renderBlocks.aoBrightnessXYNP,
+ renderBlocks.aoBrightnessYZPP,
+ mixedBrightness);
+
+ float aoMixedXYZPPP = (renderBlocks.aoLightValueScratchYZPP + aoLightValue
+ + renderBlocks.aoLightValueScratchXYZPPP
+ + renderBlocks.aoLightValueScratchXYPP) / 4.0F;
+ float aoMixedXYZPPN = (aoLightValue + renderBlocks.aoLightValueScratchYZPN
+ + renderBlocks.aoLightValueScratchXYPP
+ + renderBlocks.aoLightValueScratchXYZPPN) / 4.0F;
+ float aoMixedXYZNPN = (renderBlocks.aoLightValueScratchXYNP + renderBlocks.aoLightValueScratchXYZNPN
+ + aoLightValue
+ + renderBlocks.aoLightValueScratchYZPN) / 4.0F;
+ float aoMixedXYZNPP = (renderBlocks.aoLightValueScratchXYZNPP + renderBlocks.aoLightValueScratchXYNP
+ + renderBlocks.aoLightValueScratchYZPP
+ + aoLightValue) / 4.0F;
+
+ aoTopLeft /* SE */ = (float) (aoMixedXYZNPP * renderBlocks.renderMaxZ * (1.0D - renderBlocks.renderMaxX)
+ + aoMixedXYZPPP * renderBlocks.renderMaxZ * renderBlocks.renderMaxX
+ + aoMixedXYZPPN * (1.0D - renderBlocks.renderMaxZ) * renderBlocks.renderMaxX
+ + aoMixedXYZNPN * (1.0D - renderBlocks.renderMaxZ) * (1.0D - renderBlocks.renderMaxX));
+ aoBottomLeft /* NE */ = (float) (aoMixedXYZNPP * renderBlocks.renderMinZ * (1.0D - renderBlocks.renderMaxX)
+ + aoMixedXYZPPP * renderBlocks.renderMinZ * renderBlocks.renderMaxX
+ + aoMixedXYZPPN * (1.0D - renderBlocks.renderMinZ) * renderBlocks.renderMaxX
+ + aoMixedXYZNPN * (1.0D - renderBlocks.renderMinZ) * (1.0D - renderBlocks.renderMaxX));
+ aoBottomRight /* NW */ = (float) (aoMixedXYZNPP * renderBlocks.renderMinZ * (1.0D - renderBlocks.renderMinX)
+ + aoMixedXYZPPP * renderBlocks.renderMinZ * renderBlocks.renderMinX
+ + aoMixedXYZPPN * (1.0D - renderBlocks.renderMinZ) * renderBlocks.renderMinX
+ + aoMixedXYZNPN * (1.0D - renderBlocks.renderMinZ) * (1.0D - renderBlocks.renderMinX));
+ aoTopRight /* SW */ = (float) (aoMixedXYZNPP * renderBlocks.renderMaxZ * (1.0D - renderBlocks.renderMinX)
+ + aoMixedXYZPPP * renderBlocks.renderMaxZ * renderBlocks.renderMinX
+ + aoMixedXYZPPN * (1.0D - renderBlocks.renderMaxZ) * renderBlocks.renderMinX
+ + aoMixedXYZNPN * (1.0D - renderBlocks.renderMaxZ) * (1.0D - renderBlocks.renderMinX));
+
+ renderBlocks.brightnessTopLeft = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPP,
+ brightnessMixedXYZPPP,
+ brightnessMixedXYZPPN,
+ brightnessMixedXYZNPN,
+ renderBlocks.renderMaxZ * (1.0D - renderBlocks.renderMaxX),
+ renderBlocks.renderMaxZ * renderBlocks.renderMaxX,
+ (1.0D - renderBlocks.renderMaxZ) * renderBlocks.renderMaxX,
+ (1.0D - renderBlocks.renderMaxZ) * (1.0D - renderBlocks.renderMaxX));
+ renderBlocks.brightnessBottomLeft = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPP,
+ brightnessMixedXYZPPP,
+ brightnessMixedXYZPPN,
+ brightnessMixedXYZNPN,
+ renderBlocks.renderMinZ * (1.0D - renderBlocks.renderMaxX),
+ renderBlocks.renderMinZ * renderBlocks.renderMaxX,
+ (1.0D - renderBlocks.renderMinZ) * renderBlocks.renderMaxX,
+ (1.0D - renderBlocks.renderMinZ) * (1.0D - renderBlocks.renderMaxX));
+ renderBlocks.brightnessBottomRight = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPP,
+ brightnessMixedXYZPPP,
+ brightnessMixedXYZPPN,
+ brightnessMixedXYZNPN,
+ renderBlocks.renderMinZ * (1.0D - renderBlocks.renderMinX),
+ renderBlocks.renderMinZ * renderBlocks.renderMinX,
+ (1.0D - renderBlocks.renderMinZ) * renderBlocks.renderMinX,
+ (1.0D - renderBlocks.renderMinZ) * (1.0D - renderBlocks.renderMinX));
+ renderBlocks.brightnessTopRight = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPP,
+ brightnessMixedXYZPPP,
+ brightnessMixedXYZPPN,
+ brightnessMixedXYZNPN,
+ renderBlocks.renderMaxZ * (1.0D - renderBlocks.renderMinX),
+ renderBlocks.renderMaxZ * renderBlocks.renderMinX,
+ (1.0D - renderBlocks.renderMaxZ) * renderBlocks.renderMinX,
+ (1.0D - renderBlocks.renderMaxZ) * (1.0D - renderBlocks.renderMinX));
+ }
+
+ return this;
+ }
+
+ /**
+ * Sets up lighting for the North face and returns the {@link LightingHelper}.
+ * <p>
+ * This is a consolidated <code>method</code> that sets side shading with respect to the following attributes:
+ * <p>
+ * <ul>
+ * <li>{@link RenderBlocks#enableAO}</li>
+ * <li>{@link RenderBlocks#partialRenderBounds}</li>
+ * </ul>
+ *
+ * @param block the block {@link Block}
+ * @param x the x coordinate
+ * @param y the y coordinate
+ * @param z the z coordinate
+ * @return the {@link LightingHelper}
+ */
+ public LightingHelper setupLightingZNeg(Block block, int x, int y, int z) {
+
+ if (renderBlocks.enableAO) {
+
+ int zOffset = renderBlocks.renderMinZ > 0.0F + NO_Z_FIGHT_OFFSET ? z : z - 1;
+
+ int mixedBrightness = block.getMixedBrightnessForBlock(renderBlocks.blockAccess, x, y, zOffset);
+ brightness = mixedBrightness;
+
+ float ratio = (float) (1.0F - renderBlocks.renderMinZ);
+ float aoLightValue = renderBlocks.blockAccess.getBlock(x, y, z - 1)
+ .getAmbientOcclusionLightValue();
+
+ renderBlocks.aoBrightnessXZNN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x - 1, y, zOffset);
+ renderBlocks.aoBrightnessYZNN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x, y - 1, zOffset);
+ renderBlocks.aoBrightnessYZPN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x, y + 1, zOffset);
+ renderBlocks.aoBrightnessXZPN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x + 1, y, zOffset);
+ renderBlocks.aoBrightnessXYZNNN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x - 1, y - 1, zOffset);
+ renderBlocks.aoBrightnessXYZNPN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x - 1, y + 1, zOffset);
+ renderBlocks.aoBrightnessXYZPNN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x + 1, y - 1, zOffset);
+ renderBlocks.aoBrightnessXYZPPN = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x + 1, y + 1, zOffset);
+ renderBlocks.aoLightValueScratchXZNN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x - 1, y, z)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchYZNN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x, y - 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y - 1, z)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchYZPN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x, y + 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y + 1, z)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXZPN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x + 1, y, z)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYZNNN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y - 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x - 1, y - 1, z)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYZNPN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y + 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x - 1, y + 1, z)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYZPNN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y - 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x + 1, y - 1, z)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+ renderBlocks.aoLightValueScratchXYZPPN = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y + 1, z - 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x + 1, y + 1, z)
+ .getAmbientOcclusionLightValue(),
+ ratio);
+
+ int brightnessMixedXYZPPN = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessYZPN,
+ renderBlocks.aoBrightnessXZPN,
+ renderBlocks.aoBrightnessXYZPPN,
+ mixedBrightness);
+ int brightnessMixedXYZPNN = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessYZNN,
+ renderBlocks.aoBrightnessXYZPNN,
+ renderBlocks.aoBrightnessXZPN,
+ mixedBrightness);
+ int brightnessMixedXYZNNN = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXYZNNN,
+ renderBlocks.aoBrightnessXZNN,
+ renderBlocks.aoBrightnessYZNN,
+ mixedBrightness);
+ int brightnessMixedXYZNPN = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXZNN,
+ renderBlocks.aoBrightnessXYZNPN,
+ renderBlocks.aoBrightnessYZPN,
+ mixedBrightness);
+
+ float aoMixedXYZPPN = (aoLightValue + renderBlocks.aoLightValueScratchYZPN
+ + renderBlocks.aoLightValueScratchXZPN
+ + renderBlocks.aoLightValueScratchXYZPPN) / 4.0F;
+ float aoMixedXYZPNN = (renderBlocks.aoLightValueScratchYZNN + aoLightValue
+ + renderBlocks.aoLightValueScratchXYZPNN
+ + renderBlocks.aoLightValueScratchXZPN) / 4.0F;
+ float aoMixedXYZNNN = (renderBlocks.aoLightValueScratchXYZNNN + renderBlocks.aoLightValueScratchXZNN
+ + renderBlocks.aoLightValueScratchYZNN
+ + aoLightValue) / 4.0F;
+ float aoMixedXYZNPN = (renderBlocks.aoLightValueScratchXZNN + renderBlocks.aoLightValueScratchXYZNPN
+ + aoLightValue
+ + renderBlocks.aoLightValueScratchYZPN) / 4.0F;
+
+ aoTopLeft = (float) (aoMixedXYZNPN * renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMinX)
+ + aoMixedXYZPPN * renderBlocks.renderMaxY * renderBlocks.renderMinX
+ + aoMixedXYZPNN * (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMinX
+ + aoMixedXYZNNN * (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMinX));
+ aoBottomLeft = (float) (aoMixedXYZNPN * renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMaxX)
+ + aoMixedXYZPPN * renderBlocks.renderMaxY * renderBlocks.renderMaxX
+ + aoMixedXYZPNN * (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMaxX
+ + aoMixedXYZNNN * (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMaxX));
+ aoBottomRight = (float) (aoMixedXYZNPN * renderBlocks.renderMinY * (1.0D - renderBlocks.renderMaxX)
+ + aoMixedXYZPPN * renderBlocks.renderMinY * renderBlocks.renderMaxX
+ + aoMixedXYZPNN * (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMaxX
+ + aoMixedXYZNNN * (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMaxX));
+ aoTopRight = (float) (aoMixedXYZNPN * renderBlocks.renderMinY * (1.0D - renderBlocks.renderMinX)
+ + aoMixedXYZPPN * renderBlocks.renderMinY * renderBlocks.renderMinX
+ + aoMixedXYZPNN * (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMinX
+ + aoMixedXYZNNN * (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMinX));
+
+ renderBlocks.brightnessTopLeft = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPN,
+ brightnessMixedXYZPPN,
+ brightnessMixedXYZPNN,
+ brightnessMixedXYZNNN,
+ renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMinX),
+ renderBlocks.renderMaxY * renderBlocks.renderMinX,
+ (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMinX,
+ (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMinX));
+ renderBlocks.brightnessBottomLeft = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPN,
+ brightnessMixedXYZPPN,
+ brightnessMixedXYZPNN,
+ brightnessMixedXYZNNN,
+ renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMaxX),
+ renderBlocks.renderMaxY * renderBlocks.renderMaxX,
+ (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMaxX,
+ (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMaxX));
+ renderBlocks.brightnessBottomRight = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPN,
+ brightnessMixedXYZPPN,
+ brightnessMixedXYZPNN,
+ brightnessMixedXYZNNN,
+ renderBlocks.renderMinY * (1.0D - renderBlocks.renderMaxX),
+ renderBlocks.renderMinY * renderBlocks.renderMaxX,
+ (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMaxX,
+ (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMaxX));
+ renderBlocks.brightnessTopRight = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPN,
+ brightnessMixedXYZPPN,
+ brightnessMixedXYZPNN,
+ brightnessMixedXYZNNN,
+ renderBlocks.renderMinY * (1.0D - renderBlocks.renderMinX),
+ renderBlocks.renderMinY * renderBlocks.renderMinX,
+ (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMinX,
+ (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMinX));
+ }
+
+ return this;
+ }
+
+ /**
+ * Sets up lighting for the South face and returns the {@link LightingHelper}.
+ * <p>
+ * This is a consolidated <code>method</code> that sets side shading with respect to the following attributes:
+ * <p>
+ * <ul>
+ * <li>{@link RenderBlocks#enableAO}</li>
+ * <li>{@link RenderBlocks#partialRenderBounds}</li>
+ * </ul>
+ *
+ * @param block the block {@link Block}
+ * @param x the x coordinate
+ * @param y the y coordinate
+ * @param z the z coordinate
+ * @return the {@link LightingHelper}
+ */
+ public LightingHelper setupLightingZPos(Block block, int x, int y, int z) {
+
+ if (renderBlocks.enableAO) {
+
+ int zOffset = renderBlocks.renderMaxZ < 1.0F - NO_Z_FIGHT_OFFSET ? z : z + 1;
+
+ int mixedBrightness = block.getMixedBrightnessForBlock(renderBlocks.blockAccess, x, y, zOffset);
+ brightness = mixedBrightness;
+
+ float aoLightValue = renderBlocks.blockAccess.getBlock(x, y, z + 1)
+ .getAmbientOcclusionLightValue();
+
+ renderBlocks.aoBrightnessXZNP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x - 1, y, zOffset);
+ renderBlocks.aoBrightnessXZPP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x + 1, y, zOffset);
+ renderBlocks.aoBrightnessYZNP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x, y - 1, zOffset);
+ renderBlocks.aoBrightnessYZPP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x, y + 1, zOffset);
+ renderBlocks.aoBrightnessXYZNNP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x - 1, y - 1, zOffset);
+ renderBlocks.aoBrightnessXYZNPP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x - 1, y + 1, zOffset);
+ renderBlocks.aoBrightnessXYZPNP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x + 1, y - 1, zOffset);
+ renderBlocks.aoBrightnessXYZPPP = block
+ .getMixedBrightnessForBlock(renderBlocks.blockAccess, x + 1, y + 1, zOffset);
+ renderBlocks.aoLightValueScratchXZNP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x - 1, y, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxZ);
+ renderBlocks.aoLightValueScratchXZPP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x + 1, y, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxZ);
+ renderBlocks.aoLightValueScratchYZNP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x, y - 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y - 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxZ);
+ renderBlocks.aoLightValueScratchYZPP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x, y + 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x, y + 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxZ);
+ renderBlocks.aoLightValueScratchXYZNNP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y - 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x - 1, y - 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxZ);
+ renderBlocks.aoLightValueScratchXYZNPP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x - 1, y + 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x - 1, y + 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxZ);
+ renderBlocks.aoLightValueScratchXYZPNP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y - 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x + 1, y - 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxZ);
+ renderBlocks.aoLightValueScratchXYZPPP = getMixedAo(
+ renderBlocks.blockAccess.getBlock(x + 1, y + 1, z + 1)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.blockAccess.getBlock(x + 1, y + 1, z)
+ .getAmbientOcclusionLightValue(),
+ renderBlocks.renderMaxZ);
+
+ int brightnessMixedXYZNPP = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXZNP,
+ renderBlocks.aoBrightnessXYZNPP,
+ renderBlocks.aoBrightnessYZPP,
+ mixedBrightness);
+ int brightnessMixedXYZNNP = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessXYZNNP,
+ renderBlocks.aoBrightnessXZNP,
+ renderBlocks.aoBrightnessYZNP,
+ mixedBrightness);
+ int brightnessMixedXYZPNP = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessYZNP,
+ renderBlocks.aoBrightnessXYZPNP,
+ renderBlocks.aoBrightnessXZPP,
+ mixedBrightness);
+ int brightnessMixedXYZPPP = renderBlocks.getAoBrightness(
+ renderBlocks.aoBrightnessYZPP,
+ renderBlocks.aoBrightnessXZPP,
+ renderBlocks.aoBrightnessXYZPPP,
+ mixedBrightness);
+
+ float aoMixedXYZNPP = (renderBlocks.aoLightValueScratchXZNP + renderBlocks.aoLightValueScratchXYZNPP
+ + aoLightValue
+ + renderBlocks.aoLightValueScratchYZPP) / 4.0F;
+ float aoMixedXYZNNP = (renderBlocks.aoLightValueScratchXYZNNP + renderBlocks.aoLightValueScratchXZNP
+ + renderBlocks.aoLightValueScratchYZNP
+ + aoLightValue) / 4.0F;
+ float aoMixedXYZPNP = (renderBlocks.aoLightValueScratchYZNP + aoLightValue
+ + renderBlocks.aoLightValueScratchXYZPNP
+ + renderBlocks.aoLightValueScratchXZPP) / 4.0F;
+ float aoMixedXYZPPP = (aoLightValue + renderBlocks.aoLightValueScratchYZPP
+ + renderBlocks.aoLightValueScratchXZPP
+ + renderBlocks.aoLightValueScratchXYZPPP) / 4.0F;
+
+ aoTopLeft = (float) (aoMixedXYZNPP * renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMinX)
+ + aoMixedXYZPPP * renderBlocks.renderMaxY * renderBlocks.renderMinX
+ + aoMixedXYZPNP * (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMinX
+ + aoMixedXYZNNP * (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMinX));
+ aoBottomLeft = (float) (aoMixedXYZNPP * renderBlocks.renderMinY * (1.0D - renderBlocks.renderMinX)
+ + aoMixedXYZPPP * renderBlocks.renderMinY * renderBlocks.renderMinX
+ + aoMixedXYZPNP * (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMinX
+ + aoMixedXYZNNP * (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMinX));
+ aoBottomRight = (float) (aoMixedXYZNPP * renderBlocks.renderMinY * (1.0D - renderBlocks.renderMaxX)
+ + aoMixedXYZPPP * renderBlocks.renderMinY * renderBlocks.renderMaxX
+ + aoMixedXYZPNP * (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMaxX
+ + aoMixedXYZNNP * (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMaxX));
+ aoTopRight = (float) (aoMixedXYZNPP * renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMaxX)
+ + aoMixedXYZPPP * renderBlocks.renderMaxY * renderBlocks.renderMaxX
+ + aoMixedXYZPNP * (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMaxX
+ + aoMixedXYZNNP * (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMaxX));
+
+ renderBlocks.brightnessTopLeft = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPP,
+ brightnessMixedXYZNNP,
+ brightnessMixedXYZPNP,
+ brightnessMixedXYZPPP,
+ renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMinX),
+ (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMinX),
+ (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMinX,
+ renderBlocks.renderMaxY * renderBlocks.renderMinX);
+ renderBlocks.brightnessBottomLeft = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPP,
+ brightnessMixedXYZNNP,
+ brightnessMixedXYZPNP,
+ brightnessMixedXYZPPP,
+ renderBlocks.renderMinY * (1.0D - renderBlocks.renderMinX),
+ (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMinX),
+ (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMinX,
+ renderBlocks.renderMinY * renderBlocks.renderMinX);
+ renderBlocks.brightnessBottomRight = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPP,
+ brightnessMixedXYZNNP,
+ brightnessMixedXYZPNP,
+ brightnessMixedXYZPPP,
+ renderBlocks.renderMinY * (1.0D - renderBlocks.renderMaxX),
+ (1.0D - renderBlocks.renderMinY) * (1.0D - renderBlocks.renderMaxX),
+ (1.0D - renderBlocks.renderMinY) * renderBlocks.renderMaxX,
+ renderBlocks.renderMinY * renderBlocks.renderMaxX);
+ renderBlocks.brightnessTopRight = renderBlocks.mixAoBrightness(
+ brightnessMixedXYZNPP,
+ brightnessMixedXYZNNP,
+ brightnessMixedXYZPNP,
+ brightnessMixedXYZPPP,
+ renderBlocks.renderMaxY * (1.0D - renderBlocks.renderMaxX),
+ (1.0D - renderBlocks.renderMaxY) * (1.0D - renderBlocks.renderMaxX),
+ (1.0D - renderBlocks.renderMaxY) * renderBlocks.renderMaxX,
+ renderBlocks.renderMaxY * renderBlocks.renderMaxX);
+ }
+
+ return this;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/MethodsReturnNonnullByDefault.java b/src/main/java/gregtech/api/util/MethodsReturnNonnullByDefault.java
new file mode 100644
index 0000000000..2b2c310695
--- /dev/null
+++ b/src/main/java/gregtech/api/util/MethodsReturnNonnullByDefault.java
@@ -0,0 +1,22 @@
+package gregtech.api.util;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * This annotation can be applied to a package or class to indicate that
+ * the methods in that element are nonnull by default unless there is:
+ * <ul>
+ * <li>An explicit nullness annotation
+ * <li>The method overrides a method in a superclass (in which case the
+ * annotation of the corresponding method in the superclass applies)
+ * </ul>
+ */
+@Nonnull
+@TypeQualifierDefault({ ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MethodsReturnNonnullByDefault {}
diff --git a/src/main/java/gregtech/api/util/OutputHatchWrapper.java b/src/main/java/gregtech/api/util/OutputHatchWrapper.java
new file mode 100644
index 0000000000..b2e74d24cf
--- /dev/null
+++ b/src/main/java/gregtech/api/util/OutputHatchWrapper.java
@@ -0,0 +1,65 @@
+package gregtech.api.util;
+
+import java.util.function.Predicate;
+
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+
+import org.jetbrains.annotations.NotNull;
+
+import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+
+/**
+ * Wrapper for output hatch to allow multiblocks to apply specific filter.
+ */
+public class OutputHatchWrapper implements IFluidStore {
+
+ private final GT_MetaTileEntity_Hatch_Output outputHatch;
+ private final Predicate<FluidStack> filter;
+
+ public OutputHatchWrapper(GT_MetaTileEntity_Hatch_Output outputHatch, Predicate<FluidStack> filter) {
+ this.outputHatch = outputHatch;
+ this.filter = filter;
+ }
+
+ @Override
+ public FluidStack getFluid() {
+ return outputHatch.getFluid();
+ }
+
+ @Override
+ public int getFluidAmount() {
+ return outputHatch.getFluidAmount();
+ }
+
+ @Override
+ public int getCapacity() {
+ return outputHatch.getCapacity();
+ }
+
+ @Override
+ public FluidTankInfo getInfo() {
+ return outputHatch.getInfo();
+ }
+
+ @Override
+ public int fill(FluidStack resource, boolean doFill) {
+ return outputHatch.fill(resource, doFill);
+ }
+
+ @Override
+ public FluidStack drain(int maxDrain, boolean doDrain) {
+ return outputHatch.drain(maxDrain, doDrain);
+ }
+
+ @Override
+ public boolean isEmptyAndAcceptsAnyFluid() {
+ return outputHatch.isEmptyAndAcceptsAnyFluid();
+ }
+
+ @Override
+ public boolean canStoreFluid(@NotNull FluidStack fluidStack) {
+ return outputHatch.canStoreFluid(fluidStack) && filter.test(fluidStack);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/ValidationResult.java b/src/main/java/gregtech/api/util/ValidationResult.java
new file mode 100644
index 0000000000..497dfe67e5
--- /dev/null
+++ b/src/main/java/gregtech/api/util/ValidationResult.java
@@ -0,0 +1,24 @@
+package gregtech.api.util;
+
+public class ValidationResult<T> {
+
+ private final ValidationType type;
+ private final T result;
+
+ private ValidationResult(ValidationType type, T result) {
+ this.type = type;
+ this.result = result;
+ }
+
+ public ValidationType getType() {
+ return this.type;
+ }
+
+ public T getResult() {
+ return this.result;
+ }
+
+ public static <T> ValidationResult<T> of(ValidationType result, T value) {
+ return new ValidationResult<>(result, value);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/ValidationType.java b/src/main/java/gregtech/api/util/ValidationType.java
new file mode 100644
index 0000000000..4417834430
--- /dev/null
+++ b/src/main/java/gregtech/api/util/ValidationType.java
@@ -0,0 +1,6 @@
+package gregtech.api.util;
+
+public enum ValidationType {
+ VALID,
+ INVALID
+}
diff --git a/src/main/java/gregtech/api/util/VoidProtectionHelper.java b/src/main/java/gregtech/api/util/VoidProtectionHelper.java
new file mode 100644
index 0000000000..fdf47d06df
--- /dev/null
+++ b/src/main/java/gregtech/api/util/VoidProtectionHelper.java
@@ -0,0 +1,485 @@
+package gregtech.api.util;
+
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.PriorityQueue;
+import java.util.function.Function;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.gtnhlib.util.map.ItemStackMap;
+import com.gtnewhorizons.modularui.api.fluids.IFluidTankLong;
+
+import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.interfaces.tileentity.IVoidable;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+
+/**
+ * Helper class to calculate how many parallels of items / fluids can fit in the output buses / hatches.
+ */
+public class VoidProtectionHelper {
+
+ /**
+ * Machine used for calculation
+ */
+ private IVoidable machine;
+ /**
+ * Does void protection enabled for items
+ */
+ private boolean protectExcessItem;
+ /**
+ * Does void protection enabled for fluids
+ */
+ private boolean protectExcessFluid;
+ /**
+ * The maximum possible parallel possible for the multiblock
+ */
+ private int maxParallel = 1;
+ /**
+ * If item output is full.
+ */
+ private boolean isItemFull;
+ /**
+ * If fluid output is full.
+ */
+ private boolean isFluidFull;
+ /**
+ * The item outputs to check
+ */
+ private ItemStack[] itemOutputs;
+ /**
+ * The fluid outputs to check
+ */
+ private FluidStack[] fluidOutputs;
+ /**
+ * The item output inventory
+ */
+ private ItemInventoryLogic itemOutputInventory;
+ /**
+ * The fluid output inventory
+ */
+ private FluidInventoryLogic fluidOutputInventory;
+ /**
+ * Has this helper been built?
+ */
+ private boolean built;
+ /**
+ * Is this helper working for a MuTE?
+ */
+ private boolean muteMode;
+ /**
+ * Multiplier by which the output will be multiplied
+ */
+ private int outputMultiplier = 1;
+ /**
+ * Multiplier that is applied on the output chances
+ */
+ private double chanceMultiplier = 1;
+
+ private Function<Integer, Integer> chanceGetter = i -> 10000;
+
+ public VoidProtectionHelper() {}
+
+ /**
+ * Sets machine, with current configuration for void protection mode.
+ */
+ public VoidProtectionHelper setMachine(IVoidable machine) {
+ return setMachine(machine, machine.protectsExcessItem(), machine.protectsExcessFluid());
+ }
+
+ /**
+ * Sets machine, with void protection mode forcibly.
+ */
+ public VoidProtectionHelper setMachine(IVoidable machine, boolean protectExcessItem, boolean protectExcessFluid) {
+ this.protectExcessItem = protectExcessItem;
+ this.protectExcessFluid = protectExcessFluid;
+ this.machine = machine;
+ return this;
+ }
+
+ public VoidProtectionHelper setItemOutputs(ItemStack[] itemOutputs) {
+ this.itemOutputs = itemOutputs;
+ return this;
+ }
+
+ public VoidProtectionHelper setFluidOutputs(FluidStack[] fluidOutputs) {
+ this.fluidOutputs = fluidOutputs;
+ return this;
+ }
+
+ /**
+ * Sets the MaxParallel a multi can handle
+ */
+ public VoidProtectionHelper setMaxParallel(int maxParallel) {
+ this.maxParallel = maxParallel;
+ return this;
+ }
+
+ public VoidProtectionHelper setItemOutputInventory(ItemInventoryLogic itemOutputInventory) {
+ this.itemOutputInventory = itemOutputInventory;
+ return this;
+ }
+
+ public VoidProtectionHelper setFluidOutputInventory(FluidInventoryLogic fluidOutputInventory) {
+ this.fluidOutputInventory = fluidOutputInventory;
+ return this;
+ }
+
+ public VoidProtectionHelper setMuTEMode(boolean muteMode) {
+ this.muteMode = muteMode;
+ return this;
+ }
+
+ public VoidProtectionHelper setOutputMultiplier(int outputMultiplier) {
+ this.outputMultiplier = outputMultiplier;
+ return this;
+ }
+
+ public VoidProtectionHelper setChanceMultiplier(double chanceMultiplier) {
+ this.chanceMultiplier = chanceMultiplier;
+ return this;
+ }
+
+ public VoidProtectionHelper setChangeGetter(Function<Integer, Integer> getter) {
+ this.chanceGetter = getter;
+ return this;
+ }
+
+ /**
+ * Finishes the VoidProtectionHelper. Anything changed after this will not affect anything
+ */
+ public VoidProtectionHelper build() {
+ if (built) {
+ throw new IllegalStateException("Tried to build twice");
+ }
+ if (machine == null) {
+ throw new IllegalStateException("Machine is not set");
+ }
+ built = true;
+ determineParallel();
+ return this;
+ }
+
+ /**
+ * @return The current parallels possible by the multiblock
+ */
+ public int getMaxParallel() {
+ if (!built) {
+ throw new IllegalStateException("Tried to get parallels before building");
+ }
+ return maxParallel;
+ }
+
+ /**
+ * @return If the calculation resulted in item output being full.
+ */
+ public boolean isItemFull() {
+ if (!built) {
+ throw new IllegalStateException("Tried to get isItemFull before building");
+ }
+ return isItemFull;
+ }
+
+ /**
+ * @return If the calculation resulted in fluid output being full.
+ */
+ public boolean isFluidFull() {
+ if (!built) {
+ throw new IllegalStateException("Tried to get isFluidFull before building");
+ }
+ return isFluidFull;
+ }
+
+ /**
+ * Called by {@link #build()}. Determines the parallels and everything else that needs to be done at build time
+ */
+ private void determineParallel() {
+ if (itemOutputs == null) {
+ itemOutputs = new ItemStack[0];
+ }
+ if (fluidOutputs == null) {
+ fluidOutputs = new FluidStack[0];
+ }
+
+ // Don't check IVoidable#protectsExcessItem nor #protectsExcessFluid here,
+ // to allow more involved setting for void protections (see ComplexParallelProcessingLogic)
+ if (protectExcessItem && itemOutputs.length > 0 && !machine.canDumpItemToME()) {
+ maxParallel = Math.min(calculateMaxItemParallels(), maxParallel);
+ if (maxParallel <= 0) {
+ isItemFull = true;
+ return;
+ }
+ }
+ if (protectExcessFluid && fluidOutputs.length > 0 && !machine.canDumpFluidToME()) {
+ maxParallel = Math.min(calculateMaxFluidParallels(), maxParallel);
+ if (maxParallel <= 0) {
+ isFluidFull = true;
+ }
+ }
+ }
+
+ /**
+ * Calculates the max parallel for fluids if void protection is turned on
+ */
+ private int calculateMaxFluidParallels() {
+ List<? extends IFluidStore> hatches = machine.getFluidOutputSlots(fluidOutputs);
+ if (hatches.size() < fluidOutputs.length) {
+ return 0;
+ }
+
+ // A map to hold the items we will be 'inputting' into the output hatches. These fluidstacks are actually
+ // the recipe outputs.
+ Map<FluidStack, Integer> tFluidOutputMap = new HashMap<>();
+
+ // Map that keeps track of the number of parallel crafts we can accommodate for each fluid output.
+ // In the pair, we keep track of number of full crafts plus mb of fluid in a partial craft, to avoid
+ // issues with floating point math not being completely accurate when summing.
+ Map<FluidStack, ParallelData> tParallels = new HashMap<>();
+
+ // Iterate over the outputs, calculating require stack spacing they will require.
+ for (FluidStack aY : fluidOutputs) {
+ if (aY == null || aY.amount <= 0) {
+ continue;
+ }
+ tFluidOutputMap.merge(aY, aY.amount, Integer::sum);
+ tParallels.put(aY, new ParallelData(0, 0));
+ }
+
+ if (tFluidOutputMap.isEmpty()) {
+ // nothing to output, bail early
+ return maxParallel;
+ }
+
+ for (IFluidStore tHatch : hatches) {
+ int tSpaceLeft = tHatch.getCapacity() - tHatch.getFluidAmount();
+
+ // check if hatch filled
+ if (tSpaceLeft <= 0) continue;
+
+ // check if hatch is empty and unrestricted
+ if (tHatch.isEmptyAndAcceptsAnyFluid()) continue;
+
+ for (Map.Entry<FluidStack, ParallelData> entry : tParallels.entrySet()) {
+ FluidStack tFluidOutput = entry.getKey();
+ if (!tHatch.canStoreFluid(tFluidOutput)) continue;
+ // this fluid is not prevented by restrictions on output hatch
+ ParallelData tParallel = entry.getValue();
+ Integer tCraftSize = tFluidOutputMap.get(tFluidOutput);
+ tParallel.batch += (tParallel.partial + tSpaceLeft) / tCraftSize;
+ tParallel.partial = (tParallel.partial + tSpaceLeft) % tCraftSize;
+ }
+ }
+ // now that all partial/restricted hatches have been counted, create a priority queue for our outputs
+ // the lowest priority fluid is the number of complete parallel crafts we can support
+ PriorityQueue<ParallelStackInfo<FluidStack>> aParallelQueue = new PriorityQueue<>(
+ Comparator.comparing(i -> i.batch));
+ for (Map.Entry<FluidStack, ParallelData> entry : tParallels.entrySet()) {
+ aParallelQueue
+ .add(new ParallelStackInfo<>(entry.getValue().batch, entry.getValue().partial, entry.getKey()));
+ }
+ // add extra parallels for open slots as well
+ for (IFluidStore tHatch : hatches) {
+ // partially filled or restricted hatch. done in the last pass
+ if (!tHatch.isEmptyAndAcceptsAnyFluid()) continue;
+
+ ParallelStackInfo<FluidStack> tParallel = aParallelQueue.poll();
+ assert tParallel != null; // will always be true, specifying assert here to avoid IDE/compiler warnings
+ Integer tCraftSize = tFluidOutputMap.get(tParallel.stack);
+ int tSpaceLeft = tHatch.getCapacity();
+ tParallel.batch += (tParallel.partial + tSpaceLeft) / tCraftSize;
+ tParallel.partial = (tParallel.partial + tSpaceLeft) % tCraftSize;
+ aParallelQueue.add(tParallel);
+ }
+ return aParallelQueue.element().batch;
+ }
+
+ private int calculateMaxFluidParallelsMuTE() {
+ if (fluidOutputs.length > fluidOutputInventory.getInventory()
+ .getTanks()) {
+ return 0;
+ }
+
+ // A map to hold the items we will be 'inputting' into the output hatches. These fluidstacks are actually
+ // the recipe outputs.
+ Map<FluidStack, Integer> tFluidOutputMap = new HashMap<>();
+
+ // Map that keeps track of the number of parallel crafts we can accommodate for each fluid output.
+ // In the pair, we keep track of number of full crafts plus mb of fluid in a partial craft, to avoid
+ // issues with floating point math not being completely accurate when summing.
+ Map<FluidStack, ParallelData> tParallels = new HashMap<>();
+
+ // Iterate over the outputs, calculating require stack spacing they will require.
+ for (FluidStack aY : fluidOutputs) {
+ if (aY == null) continue;
+ int fluidAmount = aY.amount * outputMultiplier;
+ if (fluidAmount <= 0) continue;
+ tFluidOutputMap.merge(aY, fluidAmount, Integer::sum);
+ tParallels.put(aY, new ParallelData(0, 0));
+ }
+
+ if (tFluidOutputMap.isEmpty()) {
+ // nothing to output, bail early
+ return maxParallel;
+ }
+
+ for (int i = 0; i < fluidOutputInventory.getInventory()
+ .getTanks(); i++) {
+ IFluidTankLong tank = fluidOutputInventory.getInventory()
+ .getFluidTank(i);
+ long tSpaceLeft = tank.getCapacityLong() - tank.getFluidAmountLong();
+ // check if hatch filled
+ if (tSpaceLeft <= 0) continue;
+ // check if hatch is empty and unrestricted
+ if (tank.getStoredFluid() == null) continue;
+
+ for (Map.Entry<FluidStack, ParallelData> entry : tParallels.entrySet()) {
+ FluidStack tFluidOutput = entry.getKey();
+ if (tank.fill(tFluidOutput.getFluid(), tFluidOutput.amount, false) == tFluidOutput.amount) continue;
+ // this fluid is not prevented by restrictions on output hatch
+ ParallelData tParallel = entry.getValue();
+ Integer tCraftSize = tFluidOutputMap.get(tFluidOutput);
+ tParallel.batch += (tParallel.partial + tSpaceLeft) / tCraftSize;
+ tParallel.partial = (tParallel.partial + tSpaceLeft) % tCraftSize;
+ }
+ }
+ // now that all partial/restricted hatches have been counted, create a priority queue for our outputs
+ // the lowest priority fluid is the number of complete parallel crafts we can support
+ PriorityQueue<ParallelStackInfo<FluidStack>> aParallelQueue = new PriorityQueue<>(
+ Comparator.comparing(i -> i.batch));
+ for (Map.Entry<FluidStack, ParallelData> entry : tParallels.entrySet()) {
+ aParallelQueue
+ .add(new ParallelStackInfo<>(entry.getValue().batch, entry.getValue().partial, entry.getKey()));
+ }
+ // add extra parallels for open slots as well
+ for (int i = 0; i < fluidOutputInventory.getInventory()
+ .getTanks(); i++) {
+ IFluidTankLong tank = fluidOutputInventory.getInventory()
+ .getFluidTank(i);
+ // partially filled or restricted hatch. done in the last pass
+ if (tank.getStoredFluid() != null) continue;
+
+ ParallelStackInfo<FluidStack> tParallel = aParallelQueue.poll();
+ assert tParallel != null; // will always be true, specifying assert here to avoid IDE/compiler warnings
+ Integer tCraftSize = tFluidOutputMap.get(tParallel.stack);
+ long tSpaceLeft = tank.getCapacityLong();
+ tParallel.batch += (tParallel.partial + tSpaceLeft) / tCraftSize;
+ tParallel.partial = (tParallel.partial + tSpaceLeft) % tCraftSize;
+ aParallelQueue.add(tParallel);
+ }
+
+ return aParallelQueue.element().batch;
+ }
+
+ /**
+ * Calculates the max parallels one can do with items if void protection is on
+ */
+ private int calculateMaxItemParallels() {
+ List<ItemStack> busStacks;
+
+ if (muteMode) {
+ busStacks = itemOutputInventory.getInventory()
+ .getStacks();
+ } else {
+ busStacks = machine.getItemOutputSlots(itemOutputs);
+ }
+ // A map to hold the items we will be 'inputting' into the output buses. These itemstacks are actually the
+ // recipe outputs.
+ Map<ItemStack, Integer> tItemOutputMap = new ItemStackMap<>();
+
+ // Map that keeps track of the number of parallel crafts we can accommodate for each item output.
+ // In the pair, we keep track of number of full crafts plus number of items in a partial craft, to avoid
+ // issues with floating point math not being completely accurate when summing.
+ Map<ItemStack, ParallelData> tParallels = new ItemStackMap<>();
+ int tSlotsFree = 0;
+ int index = 0;
+ for (ItemStack tItem : itemOutputs) {
+ // GT_RecipeBuilder doesn't handle null item output
+ if (tItem == null) continue;
+ int itemStackSize = (int) (tItem.stackSize * outputMultiplier
+ * Math.ceil(chanceMultiplier * chanceGetter.apply(index++) / 10000));
+ if (itemStackSize <= 0) continue;
+ tItemOutputMap.merge(tItem, itemStackSize, Integer::sum);
+ tParallels.put(tItem, new ParallelData(0, 0));
+ }
+
+ if (tItemOutputMap.isEmpty()) {
+ // nothing to output, bail early
+ return maxParallel;
+ }
+
+ if (itemOutputs.length > 0) {
+ for (ItemStack tBusStack : busStacks) {
+ if (tBusStack == null) {
+ tSlotsFree++;
+ } else {
+ // get the real stack size
+ // we ignore the bus inventory stack limit here as no one set it to anything other than 64
+ int tMaxBusStackSize = tBusStack.getMaxStackSize();
+ if (tBusStack.stackSize >= tMaxBusStackSize)
+ // this bus stack is full. no checking
+ continue;
+ int tSpaceLeft = tMaxBusStackSize - tBusStack.stackSize;
+ Integer tCraftSize = tItemOutputMap.get(tBusStack);
+ if (tCraftSize == null) {
+ // we don't have a matching stack to output, ignore this bus stack
+ continue;
+ }
+ ParallelData tParallel = tParallels.get(tBusStack);
+ tParallel.batch += (tParallel.partial + tSpaceLeft) / tCraftSize;
+ tParallel.partial = (tParallel.partial + tSpaceLeft) % tCraftSize;
+ }
+
+ }
+ // now that all partial stacks have been counted, create a priority queue for our outputs
+ // the lowest priority item is the number of complete parallel crafts we can support
+ PriorityQueue<ParallelStackInfo<ItemStack>> aParallelQueue = new PriorityQueue<>(
+ Comparator.comparing(i -> i.batch));
+ for (Map.Entry<ItemStack, ParallelData> entry : tParallels.entrySet()) {
+ aParallelQueue
+ .add(new ParallelStackInfo<>(entry.getValue().batch, entry.getValue().partial, entry.getKey()));
+ }
+
+ while (tSlotsFree > 0) {
+ ParallelStackInfo<ItemStack> tParallel = aParallelQueue.poll();
+ assert tParallel != null; // will always be true, specifying assert here to avoid IDE/compiler warnings
+ Integer tCraftSize = tItemOutputMap.get(tParallel.stack);
+ int tStackSize = tParallel.stack.getMaxStackSize();
+ tParallel.batch += (tParallel.partial + tStackSize) / tCraftSize;
+ tParallel.partial = (tParallel.partial + tStackSize) % tCraftSize;
+ aParallelQueue.add(tParallel);
+ --tSlotsFree;
+ }
+
+ return aParallelQueue.element().batch;
+ }
+ return 0;
+ }
+
+ private static class ParallelData {
+
+ private int batch;
+ private long partial;
+
+ private ParallelData(int batch, long partial) {
+ this.batch = batch;
+ this.partial = partial;
+ }
+ }
+
+ private static class ParallelStackInfo<T> {
+
+ private int batch;
+ private long partial;
+ private final T stack;
+
+ private ParallelStackInfo(int batch, long partial, T stack) {
+ this.batch = batch;
+ this.partial = partial;
+ this.stack = stack;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/WorldSpawnedEventBuilder.java b/src/main/java/gregtech/api/util/WorldSpawnedEventBuilder.java
new file mode 100644
index 0000000000..f2bcce2bf8
--- /dev/null
+++ b/src/main/java/gregtech/api/util/WorldSpawnedEventBuilder.java
@@ -0,0 +1,678 @@
+package gregtech.api.util;
+
+import java.util.Objects;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.World;
+
+@SuppressWarnings("unused")
+public abstract class WorldSpawnedEventBuilder implements Runnable {
+
+ private static final String ILLEGAL_STATE_STR1 = "Position, identifier and world must be set";
+ /* Variables */
+
+ private World world;
+
+ /* Getters, Setters */
+
+ public World getWorld() {
+ return world;
+ }
+
+ public WorldSpawnedEventBuilder setWorld(World world) {
+ this.world = world;
+ return this;
+ }
+
+ /* Methods */
+
+ @SuppressWarnings("unchecked")
+ public <U extends WorldSpawnedEventBuilder> void times(int times, Consumer<U> action) {
+ Objects.requireNonNull(action);
+ for (int i = 0; i < times; i++) {
+ action.accept((U) this);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public <U extends WorldSpawnedEventBuilder> void times(int times, BiConsumer<U, Integer> action) {
+ Objects.requireNonNull(action);
+ for (int i = 0; i < times; i++) {
+ action.accept((U) this, i);
+ }
+ }
+
+ /* Interfaces */
+
+ private interface IPositionedWorldSpawnedEvent {
+
+ Vec3 getPosition();
+
+ IPositionedWorldSpawnedEvent setPosition(Vec3 position);
+
+ IPositionedWorldSpawnedEvent setPosition(double x, double y, double z);
+ }
+
+ private interface IEntityWorldSpawnedEvent {
+
+ Entity getEntity();
+
+ IEntityWorldSpawnedEvent setEntity(Entity entity);
+ }
+
+ private interface IEntityPlayerWorldSpawnedEvent {
+
+ EntityPlayer getEntityPlayer();
+
+ IEntityPlayerWorldSpawnedEvent setEntityPlayer(EntityPlayer entity);
+ }
+
+ private interface IStringIdentifierWorldSpawnedEvent {
+
+ String getIdentifier();
+
+ IStringIdentifierWorldSpawnedEvent setIdentifier(String identifier);
+
+ IStringIdentifierWorldSpawnedEvent setIdentifier(Enum<?> identifier);
+ }
+
+ private interface ISoundWorldSpawnedEvent {
+
+ float getPitch();
+
+ float getVolume();
+
+ ISoundWorldSpawnedEvent setPitch(float pitch);
+
+ ISoundWorldSpawnedEvent setVolume(float volume);
+ }
+
+ /* Abstract Classes */
+
+ private abstract static class EntityWorldSpawnedEventBuilder extends WorldSpawnedEventBuilder
+ implements IEntityWorldSpawnedEvent {
+
+ private Entity entity;
+
+ @Override
+ public Entity getEntity() {
+ return entity;
+ }
+
+ @Override
+ public EntityWorldSpawnedEventBuilder setEntity(Entity entity) {
+ this.entity = entity;
+ return this;
+ }
+ }
+
+ private abstract static class PositionedEntityWorldSpawnedEventBuilder extends EntityWorldSpawnedEventBuilder
+ implements IPositionedWorldSpawnedEvent {
+
+ private Vec3 position;
+
+ @Override
+ public Vec3 getPosition() {
+ return position;
+ }
+
+ @Override
+ public PositionedEntityWorldSpawnedEventBuilder setPosition(Vec3 position) {
+ this.position = position;
+ return this;
+ }
+
+ @Override
+ public PositionedEntityWorldSpawnedEventBuilder setPosition(double x, double y, double z) {
+ this.position = Vec3.createVectorHelper(x, y, z);
+ return this;
+ }
+ }
+
+ private abstract static class PositionedWorldSpawnedEventBuilder extends WorldSpawnedEventBuilder
+ implements IPositionedWorldSpawnedEvent {
+
+ private Vec3 position;
+
+ @Override
+ public Vec3 getPosition() {
+ return position;
+ }
+
+ @Override
+ public PositionedWorldSpawnedEventBuilder setPosition(Vec3 position) {
+ this.position = position;
+ return this;
+ }
+
+ @Override
+ public PositionedWorldSpawnedEventBuilder setPosition(double x, double y, double z) {
+ this.position = Vec3.createVectorHelper(x, y, z);
+ return this;
+ }
+ }
+
+ private abstract static class StringIdentifierPositionedWorldSpawnedEventBuilder
+ extends PositionedWorldSpawnedEventBuilder implements IStringIdentifierWorldSpawnedEvent {
+
+ private String identifier;
+
+ @Override
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ @Override
+ public StringIdentifierPositionedWorldSpawnedEventBuilder setIdentifier(String identifier) {
+ this.identifier = identifier;
+ return this;
+ }
+
+ @Override
+ public StringIdentifierPositionedWorldSpawnedEventBuilder setIdentifier(Enum<?> identifier) {
+ this.identifier = identifier.toString();
+ return this;
+ }
+ }
+
+ private abstract static class SoundStringIdentifierPositionedWorldSpawnedEventBuilder
+ extends StringIdentifierPositionedWorldSpawnedEventBuilder implements ISoundWorldSpawnedEvent {
+
+ private float pitch;
+ private float volume;
+
+ @Override
+ public float getPitch() {
+ return pitch;
+ }
+
+ @Override
+ public float getVolume() {
+ return volume;
+ }
+
+ @Override
+ public SoundStringIdentifierPositionedWorldSpawnedEventBuilder setPitch(float pitch) {
+ this.pitch = pitch;
+ return this;
+ }
+
+ @Override
+ public SoundStringIdentifierPositionedWorldSpawnedEventBuilder setVolume(float volume) {
+ this.volume = volume;
+ return this;
+ }
+ }
+
+ /* Implementations */
+
+ public static final class ParticleEventBuilder extends StringIdentifierPositionedWorldSpawnedEventBuilder {
+
+ private Vec3 motion;
+
+ public Vec3 getMotion() {
+ return motion;
+ }
+
+ public ParticleEventBuilder setMotion(double x, double y, double z) {
+ this.motion = Vec3.createVectorHelper(x, y, z);
+ return this;
+ }
+
+ public ParticleEventBuilder setMotion(Vec3 motion) {
+ this.motion = motion;
+ return this;
+ }
+
+ @Override
+ public ParticleEventBuilder setWorld(World world) {
+ return (ParticleEventBuilder) super.setWorld(world);
+ }
+
+ @Override
+ public ParticleEventBuilder setPosition(Vec3 position) {
+ return (ParticleEventBuilder) super.setPosition(position);
+ }
+
+ @Override
+ public ParticleEventBuilder setPosition(double x, double y, double z) {
+ return (ParticleEventBuilder) super.setPosition(x, y, z);
+ }
+
+ @Override
+ public ParticleEventBuilder setIdentifier(String identifier) {
+ return (ParticleEventBuilder) super.setIdentifier(identifier);
+ }
+
+ @Override
+ public ParticleEventBuilder setIdentifier(Enum<?> identifier) {
+ return (ParticleEventBuilder) super.setIdentifier(identifier);
+ }
+
+ @Override
+ public void run() {
+ if (getPosition() == null || getIdentifier() == null || getMotion() == null || getWorld() == null)
+ throw new IllegalStateException("Position, identifier, motion and world must be set");
+
+ getWorld().spawnParticle(
+ getIdentifier(),
+ getPosition().xCoord,
+ getPosition().yCoord,
+ getPosition().zCoord,
+ getMotion().xCoord,
+ getMotion().yCoord,
+ getMotion().zCoord);
+ }
+ }
+
+ public static final class SoundEffectEventBuilder extends SoundStringIdentifierPositionedWorldSpawnedEventBuilder {
+
+ @Override
+ public SoundEffectEventBuilder setWorld(World world) {
+ return (SoundEffectEventBuilder) super.setWorld(world);
+ }
+
+ @Override
+ public SoundEffectEventBuilder setPosition(Vec3 position) {
+ return (SoundEffectEventBuilder) super.setPosition(position);
+ }
+
+ @Override
+ public SoundEffectEventBuilder setPosition(double x, double y, double z) {
+ return (SoundEffectEventBuilder) super.setPosition(x, y, z);
+ }
+
+ @Override
+ public SoundEffectEventBuilder setIdentifier(String identifier) {
+ return (SoundEffectEventBuilder) super.setIdentifier(identifier);
+ }
+
+ @Override
+ public SoundEffectEventBuilder setIdentifier(Enum<?> identifier) {
+ return (SoundEffectEventBuilder) super.setIdentifier(identifier);
+ }
+
+ @Override
+ public SoundEffectEventBuilder setPitch(float pitch) {
+ return (SoundEffectEventBuilder) super.setPitch(pitch);
+ }
+
+ @Override
+ public SoundEffectEventBuilder setVolume(float volume) {
+ return (SoundEffectEventBuilder) super.setVolume(volume);
+ }
+
+ @Override
+ public void run() {
+ if (getPosition() == null || getIdentifier() == null || getWorld() == null)
+ throw new IllegalStateException(ILLEGAL_STATE_STR1);
+
+ getWorld().playSoundEffect(
+ getPosition().xCoord,
+ getPosition().yCoord,
+ getPosition().zCoord,
+ getIdentifier(),
+ getPitch(),
+ getVolume());
+ }
+ }
+
+ public static final class SoundEventBuilder extends SoundStringIdentifierPositionedWorldSpawnedEventBuilder {
+
+ private boolean proximity;
+
+ public boolean isProximity() {
+ return proximity;
+ }
+
+ @Override
+ public SoundEventBuilder setWorld(World world) {
+ return (SoundEventBuilder) super.setWorld(world);
+ }
+
+ @Override
+ public SoundEventBuilder setPosition(Vec3 position) {
+ return (SoundEventBuilder) super.setPosition(position);
+ }
+
+ @Override
+ public SoundEventBuilder setPosition(double x, double y, double z) {
+ return (SoundEventBuilder) super.setPosition(x, y, z);
+ }
+
+ @Override
+ public SoundEventBuilder setIdentifier(String identifier) {
+ return (SoundEventBuilder) super.setIdentifier(identifier);
+ }
+
+ @Override
+ public SoundEventBuilder setPitch(float pitch) {
+ return (SoundEventBuilder) super.setPitch(pitch);
+ }
+
+ @Override
+ public SoundEventBuilder setVolume(float volume) {
+ return (SoundEventBuilder) super.setVolume(volume);
+ }
+
+ public SoundEventBuilder setProximity(boolean proximity) {
+ this.proximity = proximity;
+ return this;
+ }
+
+ @Override
+ public void run() {
+ if (getPosition() == null || getIdentifier() == null || getWorld() == null)
+ throw new IllegalStateException(ILLEGAL_STATE_STR1);
+
+ getWorld().playSound(
+ getPosition().xCoord,
+ getPosition().yCoord,
+ getPosition().zCoord,
+ getIdentifier(),
+ getPitch(),
+ getVolume(),
+ isProximity());
+ }
+ }
+
+ /**
+ * Positional Data is rounded down due to this targeting a block.
+ */
+ public static final class RecordEffectEventBuilder extends StringIdentifierPositionedWorldSpawnedEventBuilder {
+
+ @Override
+ public RecordEffectEventBuilder setWorld(World world) {
+ return (RecordEffectEventBuilder) super.setWorld(world);
+ }
+
+ @Override
+ public RecordEffectEventBuilder setPosition(Vec3 position) {
+ return (RecordEffectEventBuilder) super.setPosition(position);
+ }
+
+ @Override
+ public RecordEffectEventBuilder setPosition(double x, double y, double z) {
+ return (RecordEffectEventBuilder) super.setPosition(x, y, z);
+ }
+
+ @Override
+ public RecordEffectEventBuilder setIdentifier(String identifier) {
+ return (RecordEffectEventBuilder) super.setIdentifier(identifier);
+ }
+
+ @Override
+ public void run() {
+ if (getPosition() == null || getIdentifier() == null || getWorld() == null)
+ throw new IllegalStateException(ILLEGAL_STATE_STR1);
+
+ getWorld().playRecord(
+ getIdentifier(),
+ (int) getPosition().xCoord,
+ (int) getPosition().yCoord,
+ (int) getPosition().zCoord);
+ }
+ }
+
+ public static final class ExplosionEffectEventBuilder extends PositionedEntityWorldSpawnedEventBuilder {
+
+ private boolean isFlaming, isSmoking;
+ private float strength;
+
+ public float getStrength() {
+ return strength;
+ }
+
+ public ExplosionEffectEventBuilder setStrength(float strength) {
+ this.strength = strength;
+ return this;
+ }
+
+ public boolean isFlaming() {
+ return isFlaming;
+ }
+
+ public ExplosionEffectEventBuilder setFlaming(boolean flaming) {
+ isFlaming = flaming;
+ return this;
+ }
+
+ public boolean isSmoking() {
+ return isSmoking;
+ }
+
+ public ExplosionEffectEventBuilder setSmoking(boolean smoking) {
+ isSmoking = smoking;
+ return this;
+ }
+
+ @Override
+ public ExplosionEffectEventBuilder setWorld(World world) {
+ return (ExplosionEffectEventBuilder) super.setWorld(world);
+ }
+
+ @Override
+ public ExplosionEffectEventBuilder setEntity(Entity entity) {
+ return (ExplosionEffectEventBuilder) super.setEntity(entity);
+ }
+
+ @Override
+ public ExplosionEffectEventBuilder setPosition(double x, double y, double z) {
+ return (ExplosionEffectEventBuilder) super.setPosition(x, y, z);
+ }
+
+ @Override
+ public void run() {
+ if (getPosition() == null || getWorld() == null)
+ throw new IllegalStateException("Position and world must be set");
+
+ getWorld().newExplosion(
+ getEntity(),
+ getPosition().xCoord,
+ getPosition().yCoord,
+ getPosition().zCoord,
+ strength,
+ isFlaming,
+ isSmoking);
+ }
+ }
+
+ /**
+ * Positional Data is rounded down due to this targeting a block.
+ */
+ public static final class ExtinguishFireEffectEventBuilder extends PositionedWorldSpawnedEventBuilder
+ implements IEntityPlayerWorldSpawnedEvent {
+
+ private int side;
+ private EntityPlayer entityPlayer;
+
+ public int getSide() {
+ return side;
+ }
+
+ public ExtinguishFireEffectEventBuilder setSide(int side) {
+ this.side = side;
+ return this;
+ }
+
+ @Override
+ public EntityPlayer getEntityPlayer() {
+ return entityPlayer;
+ }
+
+ @Override
+ public ExtinguishFireEffectEventBuilder setEntityPlayer(EntityPlayer entity) {
+ this.entityPlayer = entity;
+ return this;
+ }
+
+ @Override
+ public ExtinguishFireEffectEventBuilder setWorld(World world) {
+ return (ExtinguishFireEffectEventBuilder) super.setWorld(world);
+ }
+
+ @Override
+ public ExtinguishFireEffectEventBuilder setPosition(Vec3 position) {
+ return (ExtinguishFireEffectEventBuilder) super.setPosition(position);
+ }
+
+ @Override
+ public ExtinguishFireEffectEventBuilder setPosition(double x, double y, double z) {
+ return (ExtinguishFireEffectEventBuilder) super.setPosition(x, y, z);
+ }
+
+ @Override
+ public void run() {
+ if (getEntityPlayer() == null || getPosition() == null || getWorld() == null)
+ throw new IllegalStateException("EntityPlayer, position and world must be set");
+
+ getWorld().extinguishFire(
+ getEntityPlayer(),
+ (int) getPosition().xCoord,
+ (int) getPosition().yCoord,
+ (int) getPosition().zCoord,
+ side);
+ }
+ }
+
+ public static final class SoundAtEntityEventBuilder extends EntityWorldSpawnedEventBuilder
+ implements ISoundWorldSpawnedEvent, IStringIdentifierWorldSpawnedEvent {
+
+ private float pitch;
+ private float volume;
+ private String identifier;
+
+ @Override
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ @Override
+ public SoundAtEntityEventBuilder setIdentifier(String identifier) {
+ this.identifier = identifier;
+ return this;
+ }
+
+ @Override
+ public SoundAtEntityEventBuilder setIdentifier(Enum<?> identifier) {
+ this.identifier = identifier.toString();
+ return this;
+ }
+
+ @Override
+ public float getPitch() {
+ return pitch;
+ }
+
+ @Override
+ public float getVolume() {
+ return volume;
+ }
+
+ @Override
+ public SoundAtEntityEventBuilder setPitch(float pitch) {
+ this.pitch = pitch;
+ return this;
+ }
+
+ @Override
+ public SoundAtEntityEventBuilder setVolume(float volume) {
+ this.volume = volume;
+ return this;
+ }
+
+ @Override
+ public SoundAtEntityEventBuilder setWorld(World world) {
+ return (SoundAtEntityEventBuilder) super.setWorld(world);
+ }
+
+ @Override
+ public SoundAtEntityEventBuilder setEntity(Entity entity) {
+ return (SoundAtEntityEventBuilder) super.setEntity(entity);
+ }
+
+ @Override
+ public void run() {
+ if (getWorld() == null || getIdentifier() == null || getEntity() == null)
+ throw new IllegalStateException("World, Identifier and entity must be set!");
+
+ getWorld().playSoundAtEntity(getEntity(), getIdentifier(), volume, pitch);
+ }
+ }
+
+ public static final class SoundToNearExceptEventBuilder extends WorldSpawnedEventBuilder
+ implements ISoundWorldSpawnedEvent, IStringIdentifierWorldSpawnedEvent, IEntityPlayerWorldSpawnedEvent {
+
+ private float pitch;
+ private float volume;
+ private String identifier;
+ private EntityPlayer entityPlayer;
+
+ @Override
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ @Override
+ public SoundToNearExceptEventBuilder setIdentifier(String identifier) {
+ this.identifier = identifier;
+ return this;
+ }
+
+ @Override
+ public SoundToNearExceptEventBuilder setIdentifier(Enum<?> identifier) {
+ this.identifier = identifier.toString();
+ return this;
+ }
+
+ @Override
+ public float getPitch() {
+ return pitch;
+ }
+
+ @Override
+ public float getVolume() {
+ return volume;
+ }
+
+ @Override
+ public SoundToNearExceptEventBuilder setPitch(float pitch) {
+ this.pitch = pitch;
+ return this;
+ }
+
+ @Override
+ public SoundToNearExceptEventBuilder setVolume(float volume) {
+ this.volume = volume;
+ return this;
+ }
+
+ @Override
+ public SoundToNearExceptEventBuilder setWorld(World world) {
+ return (SoundToNearExceptEventBuilder) super.setWorld(world);
+ }
+
+ @Override
+ public void run() {
+ if (getWorld() == null || getIdentifier() == null || getEntityPlayer() == null)
+ throw new IllegalStateException("World, Identifier and EntityPlayer must be set!");
+
+ getWorld().playSoundAtEntity(getEntityPlayer(), getIdentifier(), volume, pitch);
+ }
+
+ @Override
+ public EntityPlayer getEntityPlayer() {
+ return entityPlayer;
+ }
+
+ @Override
+ public SoundToNearExceptEventBuilder setEntityPlayer(EntityPlayer entity) {
+ entityPlayer = entity;
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/extensions/ArrayExt.java b/src/main/java/gregtech/api/util/extensions/ArrayExt.java
new file mode 100644
index 0000000000..b6ebb07d38
--- /dev/null
+++ b/src/main/java/gregtech/api/util/extensions/ArrayExt.java
@@ -0,0 +1,81 @@
+package gregtech.api.util.extensions;
+
+import java.util.function.IntFunction;
+
+public class ArrayExt {
+
+ public static int[] of(int... objects) {
+ return objects;
+ }
+
+ public static float[] of(float... objects) {
+ return objects;
+ }
+
+ public static double[] of(double... objects) {
+ return objects;
+ }
+
+ public static char[] of(char... objects) {
+ return objects;
+ }
+
+ public static byte[] of(byte... objects) {
+ return objects;
+ }
+
+ public static long[] of(long... objects) {
+ return objects;
+ }
+
+ @SafeVarargs
+ public static <T> T[] of(T... objects) {
+ return objects;
+ }
+
+ @SuppressWarnings("ForLoopReplaceableByForEach")
+ public static <T> T[] withoutNulls(T[] array, IntFunction<T[]> arrayFactory) {
+ int count = 0;
+ for (int i = 0; i < array.length; i++) {
+ if (array[i] != null) {
+ count++;
+ }
+ }
+
+ T[] newArr = arrayFactory.apply(count);
+ if (count == 0) return newArr;
+
+ int j = 0;
+ for (int i = 0; i < array.length; i++) {
+ if (array[i] != null) {
+ newArr[j] = array[i];
+ j++;
+ }
+ }
+
+ return newArr;
+ }
+
+ public static <T> T[] withoutTrailingNulls(T[] array, IntFunction<T[]> arrayFactory) {
+ int firstNull = -1;
+ for (int i = array.length - 1; i >= 0; i--) {
+ if (array[i] == null) {
+ firstNull = i;
+ } else {
+ break;
+ }
+ }
+
+ if (firstNull == -1) {
+ T[] newArray = arrayFactory.apply(array.length);
+ System.arraycopy(array, 0, newArray, 0, array.length);
+ return newArray;
+ } else if (firstNull == 0) {
+ return arrayFactory.apply(0);
+ } else {
+ T[] newArray = arrayFactory.apply(firstNull);
+ System.arraycopy(array, 0, newArray, 0, firstNull);
+ return newArray;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/extensions/IteratorExt.java b/src/main/java/gregtech/api/util/extensions/IteratorExt.java
new file mode 100644
index 0000000000..3cbae1c598
--- /dev/null
+++ b/src/main/java/gregtech/api/util/extensions/IteratorExt.java
@@ -0,0 +1,13 @@
+package gregtech.api.util.extensions;
+
+import java.util.Iterator;
+
+import gregtech.api.objects.iterators.MergedIterator;
+
+public class IteratorExt {
+
+ @SafeVarargs
+ public static <T> Iterator<T> merge(Iterator<T>... iterators) {
+ return new MergedIterator<>(iterators);
+ }
+}
diff --git a/src/main/java/gregtech/api/util/item/ItemHolder.java b/src/main/java/gregtech/api/util/item/ItemHolder.java
new file mode 100644
index 0000000000..4675d0ba0e
--- /dev/null
+++ b/src/main/java/gregtech/api/util/item/ItemHolder.java
@@ -0,0 +1,79 @@
+package gregtech.api.util.item;
+
+import static net.minecraftforge.oredict.OreDictionary.getOreIDs;
+
+import java.util.Arrays;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.util.GT_Utility;
+
+public class ItemHolder {
+
+ private final Item item;
+ private final int meta;
+ private final NBTTagCompound tag;
+ private final int[] oreIDs;
+
+ public ItemHolder(@Nonnull ItemStack item) {
+ this.item = item.getItem();
+ this.meta = Items.feather.getDamage(item);
+ this.tag = item.getTagCompound();
+ this.oreIDs = getOreIDs(item);
+ }
+
+ public Item getItem() {
+ return item;
+ }
+
+ public int getMeta() {
+ return meta;
+ }
+
+ public NBTTagCompound getNBT() {
+ return tag;
+ }
+
+ public int[] getOreDictTagIDs() {
+ return oreIDs;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) return true;
+ if (!(other instanceof ItemHolder otherIH)) return false;
+ if (Arrays.stream(oreIDs)
+ .anyMatch(id -> {
+ for (int i = 0; i < otherIH.getOreDictTagIDs().length; i++) {
+ if (id == otherIH.getOreDictTagIDs()[i]) return true;
+ }
+ return false;
+ })) {
+ return true;
+ }
+
+ if (item != otherIH.getItem() || meta != otherIH.getMeta()) {
+ return false;
+ }
+ if (this.tag == null && otherIH.getNBT() == null) return true;
+ if (this.tag == null || otherIH.getNBT() == null) return false;
+ return this.tag.equals(otherIH);
+ }
+
+ @Override
+ public int hashCode() {
+ return GT_Utility.stackToInt(toStack());
+ }
+
+ @Nonnull
+ private ItemStack toStack() {
+ ItemStack item = new ItemStack(this.item, 1, meta);
+ item.stackTagCompound = tag;
+ return item;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/recipe/RecipeInputRequirements.java b/src/main/java/gregtech/api/util/recipe/RecipeInputRequirements.java
new file mode 100644
index 0000000000..590c104101
--- /dev/null
+++ b/src/main/java/gregtech/api/util/recipe/RecipeInputRequirements.java
@@ -0,0 +1,77 @@
+package gregtech.api.util.recipe;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.item.ItemHolder;
+
+public class RecipeInputRequirements {
+
+ protected Map<ItemHolder, Long> itemInputs = new HashMap<>();
+ protected Set<ItemHolder> itemInputsMet = new HashSet<>();
+ protected boolean metAllItem = false;
+ protected Map<Fluid, Long> fluidInputs = new HashMap<>();
+ protected Set<Fluid> fluidInputsMet = new HashSet<>();
+ protected boolean metAllFluid = false;
+
+ public RecipeInputRequirements(@Nonnull GT_Recipe recipe) {
+ this(recipe.mInputs, recipe.mFluidInputs);
+ }
+
+ public RecipeInputRequirements(@Nonnull ItemStack[] itemInputs, @Nonnull FluidStack[] fluidInputs) {
+ for (ItemStack item : itemInputs) {
+ if (item == null) continue;
+ ItemHolder itemIH = new ItemHolder(item);
+ this.itemInputs.put(itemIH, this.itemInputs.getOrDefault(itemIH, 0L) + item.stackSize);
+ }
+
+ for (FluidStack fluid : fluidInputs) {
+ if (fluid == null) continue;
+ this.fluidInputs.put(fluid.getFluid(), this.fluidInputs.getOrDefault(fluid.getFluid(), 0L) + fluid.amount);
+ }
+ }
+
+ /**
+ *
+ * @param itemInputs we have and want to fill this request
+ * @return {@code true} when all item inputs are met
+ */
+ public boolean tryToFillItemRequirements(Map<ItemHolder, Long> itemInputs) {
+ if (metAllItem) return metAllItem;
+ for (Entry<ItemHolder, Long> entry : itemInputs.entrySet()) {
+ if (itemInputsMet.contains(entry.getKey())) continue;
+ if (!this.itemInputs.containsKey(entry.getKey())) continue;
+ if (this.itemInputs.get(entry.getKey()) > entry.getValue()) continue;
+ itemInputsMet.add(entry.getKey());
+ }
+ metAllItem = itemInputsMet.containsAll(this.itemInputs.keySet());
+ return metAllItem;
+ }
+
+ /**
+ *
+ * @param fluidInputs we have and want to fill this request
+ * @return {@code true} when all fluid inputs are met
+ */
+ public boolean tryToFillFluidRequirements(Map<Fluid, Long> fluidInputs) {
+ if (metAllFluid) return metAllFluid;
+ for (Entry<Fluid, Long> entry : fluidInputs.entrySet()) {
+ if (fluidInputsMet.contains(entry.getKey())) continue;
+ if (!this.fluidInputs.containsKey(entry.getKey())) continue;
+ if (this.fluidInputs.get(entry.getKey()) > entry.getValue()) continue;
+ fluidInputsMet.add(entry.getKey());
+ }
+ metAllFluid = fluidInputsMet.containsAll(this.fluidInputs.keySet());
+ return metAllFluid;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/shutdown/ReasonOutOfFluid.java b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfFluid.java
new file mode 100644
index 0000000000..29b99a644a
--- /dev/null
+++ b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfFluid.java
@@ -0,0 +1,63 @@
+package gregtech.api.util.shutdown;
+
+import static gregtech.api.util.GT_ModHandler.getWater;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+
+import java.util.Objects;
+
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+public class ReasonOutOfFluid implements ShutDownReason {
+
+ private FluidStack requiredFluid;
+
+ ReasonOutOfFluid(@NotNull FluidStack requiredFluid) {
+ this.requiredFluid = requiredFluid;
+ }
+
+ @NotNull
+ @Override
+ public String getID() {
+ return "out_of_fluid";
+ }
+
+ @NotNull
+ @Override
+ public String getDisplayString() {
+ return Objects.requireNonNull(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.out_of_fluid",
+ requiredFluid.getLocalizedName(),
+ formatNumbers(requiredFluid.amount)));
+ }
+
+ @NotNull
+ @Override
+ public ShutDownReason newInstance() {
+ return new ReasonOutOfFluid(getWater(0));
+ }
+
+ @Override
+ public void encode(@NotNull PacketBuffer buffer) {
+ buffer.writeInt(requiredFluid.getFluidID());
+ buffer.writeInt(requiredFluid.amount);
+ }
+
+ @Override
+ public void decode(PacketBuffer buffer) {
+ int fluidID = buffer.readInt();
+ Fluid fluid = FluidRegistry.getFluid(fluidID);
+ requiredFluid = new FluidStack(fluid, buffer.readInt());
+ }
+
+ @Override
+ public boolean wasCritical() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/shutdown/ReasonOutOfItem.java b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfItem.java
new file mode 100644
index 0000000000..f4a46f2d30
--- /dev/null
+++ b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfItem.java
@@ -0,0 +1,62 @@
+package gregtech.api.util.shutdown;
+
+import static gregtech.api.util.GT_Utility.formatNumbers;
+
+import java.util.Objects;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.util.StatCollector;
+
+import org.jetbrains.annotations.NotNull;
+
+public class ReasonOutOfItem implements ShutDownReason {
+
+ private ItemStack requiredItem;
+
+ ReasonOutOfItem(@NotNull ItemStack requiredItem) {
+ this.requiredItem = requiredItem;
+ }
+
+ @NotNull
+ @Override
+ public String getID() {
+ return "out_of_item";
+ }
+
+ @NotNull
+ @Override
+ public String getDisplayString() {
+ return Objects.requireNonNull(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.out_of_item",
+ requiredItem.getDisplayName(),
+ formatNumbers(requiredItem.stackSize)));
+ }
+
+ @NotNull
+ @Override
+ public ShutDownReason newInstance() {
+ return new ReasonOutOfItem(new ItemStack(Items.feather, 0));
+ }
+
+ @Override
+ public void encode(@NotNull PacketBuffer buffer) {
+ try {
+ buffer.writeItemStackToBuffer(requiredItem);
+ } catch (Exception ignored) {}
+ }
+
+ @Override
+ public void decode(PacketBuffer buffer) {
+ try {
+ requiredItem = buffer.readItemStackFromBuffer();
+ } catch (Exception ignored) {}
+ }
+
+ @Override
+ public boolean wasCritical() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/shutdown/ReasonOutOfStuff.java b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfStuff.java
new file mode 100644
index 0000000000..0c3f7e0b64
--- /dev/null
+++ b/src/main/java/gregtech/api/util/shutdown/ReasonOutOfStuff.java
@@ -0,0 +1,61 @@
+package gregtech.api.util.shutdown;
+
+import static gregtech.api.util.GT_Utility.formatNumbers;
+
+import java.util.Objects;
+
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.util.StatCollector;
+
+import org.jetbrains.annotations.NotNull;
+
+public class ReasonOutOfStuff implements ShutDownReason {
+
+ private String required;
+ private int amount;
+
+ ReasonOutOfStuff(@NotNull String required, int amount) {
+ this.required = required;
+ this.amount = amount;
+ }
+
+ @NotNull
+ @Override
+ public String getID() {
+ return "out_of_stuff";
+ }
+
+ @NotNull
+ @Override
+ public String getDisplayString() {
+ return Objects.requireNonNull(
+ StatCollector.translateToLocalFormatted("GT5U.gui.text.out_of_stuff", required, formatNumbers(amount)));
+ }
+
+ @NotNull
+ @Override
+ public ShutDownReason newInstance() {
+ return new ReasonOutOfStuff("stuff", 1);
+ }
+
+ @Override
+ public void encode(@NotNull PacketBuffer buffer) {
+ buffer.writeInt(amount);
+ try {
+ buffer.writeStringToBuffer(required);
+ } catch (Exception ignored) {}
+ }
+
+ @Override
+ public void decode(PacketBuffer buffer) {
+ amount = buffer.readInt();
+ try {
+ required = buffer.readStringFromBuffer(32768);
+ } catch (Exception ignored) {}
+ }
+
+ @Override
+ public boolean wasCritical() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/api/util/shutdown/ShutDownReason.java b/src/main/java/gregtech/api/util/shutdown/ShutDownReason.java
new file mode 100644
index 0000000000..0815936a55
--- /dev/null
+++ b/src/main/java/gregtech/api/util/shutdown/ShutDownReason.java
@@ -0,0 +1,41 @@
+package gregtech.api.util.shutdown;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.network.PacketBuffer;
+
+public interface ShutDownReason {
+
+ /**
+ * @return Unique registry ID
+ */
+ @Nonnull
+ String getID();
+
+ /**
+ * @return Actual text to show on client GUI
+ */
+ @Nonnull
+ String getDisplayString();
+
+ /**
+ * Create new instance to receive packet.
+ */
+ @Nonnull
+ ShutDownReason newInstance();
+
+ /**
+ * Encode value to sync.
+ */
+ void encode(@Nonnull PacketBuffer buffer);
+
+ /**
+ * Decode synced value.
+ */
+ void decode(PacketBuffer buffer);
+
+ /**
+ * @return Whether the reason is critical.
+ */
+ boolean wasCritical();
+}
diff --git a/src/main/java/gregtech/api/util/shutdown/ShutDownReasonRegistry.java b/src/main/java/gregtech/api/util/shutdown/ShutDownReasonRegistry.java
new file mode 100644
index 0000000000..298c5db237
--- /dev/null
+++ b/src/main/java/gregtech/api/util/shutdown/ShutDownReasonRegistry.java
@@ -0,0 +1,118 @@
+package gregtech.api.util.shutdown;
+
+import static gregtech.api.util.GT_ModHandler.getWater;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+public class ShutDownReasonRegistry {
+
+ private static final Map<String, ShutDownReason> registry = new HashMap<>();
+
+ /**
+ * Registers ShutDownReason. No duplicated IDs are allowed.
+ *
+ * @param sample Sample object to register
+ */
+ public static void register(ShutDownReason sample) {
+ if (isRegistered(sample.getID())) {
+ throw new IllegalStateException(
+ String.format(
+ "ID %s is already registered for %s",
+ sample.getID(),
+ registry.get(sample.getID())
+ .getClass()
+ .getCanonicalName()));
+ }
+ registry.put(sample.getID(), sample);
+ }
+
+ public static ShutDownReason getSampleFromRegistry(String id) {
+ if (!isRegistered(id)) {
+ throw new RuntimeException("Unknown id: " + id);
+ }
+ return registry.get(id);
+ }
+
+ public static boolean isRegistered(String id) {
+ return registry.containsKey(id);
+ }
+
+ /**
+ * Shut down due to power loss.
+ */
+ @Nonnull
+ public static final ShutDownReason POWER_LOSS = SimpleShutDownReason.ofCritical("power_loss");
+ /**
+ * Failed to output the pollution.
+ */
+ @Nonnull
+ public static final ShutDownReason POLLUTION_FAIL = SimpleShutDownReason.ofCritical("pollution_fail");
+ /**
+ * Shut down due to incomplete structure.
+ */
+ @Nonnull
+ public static final ShutDownReason STRUCTURE_INCOMPLETE = SimpleShutDownReason.ofNormal("structure_incomplete");
+ /**
+ * Shut down due to machine damage.
+ */
+ @Nonnull
+ public static final ShutDownReason NO_REPAIR = SimpleShutDownReason.ofNormal("no_repair");
+ /**
+ * No valid turbine found.
+ */
+ @Nonnull
+ public static final ShutDownReason NO_TURBINE = SimpleShutDownReason.ofNormal("no_turbine");
+ /**
+ * No correct machine part in controller slot.
+ */
+ @Nonnull
+ public static final ShutDownReason NO_MACHINE_PART = SimpleShutDownReason.ofNormal("no_machine_part");
+ /**
+ * Default unknown state.
+ */
+ @Nonnull
+ public static final ShutDownReason NONE = SimpleShutDownReason.ofNormal("none");
+ /**
+ * Critical unknown state.
+ */
+ @Nonnull
+ public static final ShutDownReason CRITICAL_NONE = SimpleShutDownReason.ofCritical("none");
+
+ /**
+ * Fluid that needs to be constantly supplied are out. E.g. PCB coolant with cooling upgrades enabled.
+ */
+ @Nonnull
+ public static ShutDownReason outOfFluid(@Nonnull FluidStack required) {
+ return new ReasonOutOfFluid(required);
+ }
+
+ /**
+ * Item that needs to be constantly supplied are out.
+ */
+ @Nonnull
+ public static ShutDownReason outOfItem(@Nonnull ItemStack required) {
+ return new ReasonOutOfItem(required);
+ }
+
+ /**
+ * Stuff that needs to be constantly supplied are out.
+ */
+ @Nonnull
+ public static ShutDownReason outOfStuff(@Nonnull String required, int amount) {
+ return new ReasonOutOfStuff(required, amount);
+ }
+
+ static {
+ register(new SimpleShutDownReason("", false));
+ register(new ReasonOutOfFluid(getWater(0)));
+ register(new ReasonOutOfItem(new ItemStack(Items.feather, 1)));
+ register(new ReasonOutOfStuff("stuff", 1));
+ }
+}
diff --git a/src/main/java/gregtech/api/util/shutdown/SimpleShutDownReason.java b/src/main/java/gregtech/api/util/shutdown/SimpleShutDownReason.java
new file mode 100644
index 0000000000..92763fa431
--- /dev/null
+++ b/src/main/java/gregtech/api/util/shutdown/SimpleShutDownReason.java
@@ -0,0 +1,79 @@
+package gregtech.api.util.shutdown;
+
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.util.StatCollector;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+
+/**
+ * Simple implementation of {@link ShutDownReason}. You can create new object without registering it.
+ */
+public class SimpleShutDownReason implements ShutDownReason {
+
+ private String key;
+ private boolean wasCritical;
+
+ public SimpleShutDownReason(String key, boolean isCritical) {
+ this.key = key;
+ this.wasCritical = isCritical;
+ }
+
+ @NotNull
+ @Override
+ public String getID() {
+ return "simple_result";
+ }
+
+ @NotNull
+ @Override
+ public String getDisplayString() {
+ return Objects.requireNonNull(StatCollector.translateToLocal("GT5U.gui.text." + key));
+ }
+
+ @NotNull
+ @Override
+ public ShutDownReason newInstance() {
+ return new SimpleShutDownReason("", false);
+ }
+
+ @Override
+ public void encode(@NotNull PacketBuffer buffer) {
+ buffer.writeBoolean(wasCritical);
+ NetworkUtils.writeStringSafe(buffer, key);
+ }
+
+ @Override
+ public void decode(PacketBuffer buffer) {
+ wasCritical = buffer.readBoolean();
+ key = NetworkUtils.readStringSafe(buffer);
+ }
+
+ @Override
+ public boolean wasCritical() {
+ return wasCritical;
+ }
+
+ /**
+ * Creates new reason with critical state. Add your localized description with `GT5U.gui.text.{key}`.
+ * This is already registered to registry.
+ */
+ @Nonnull
+ public static ShutDownReason ofCritical(String key) {
+ return new SimpleShutDownReason(key, true);
+ }
+
+ /**
+ * Creates new reason with normal state. Add your localized description with `GT5U.gui.text.{key}`.
+ * This is already registered to registry.
+ */
+ @Nonnull
+ public static ShutDownReason ofNormal(String key) {
+ return new SimpleShutDownReason(key, false);
+ }
+}
diff --git a/src/main/java/gregtech/api/world/GT_Worldgen.java b/src/main/java/gregtech/api/world/GT_Worldgen.java
new file mode 100644
index 0000000000..4e9ed6229b
--- /dev/null
+++ b/src/main/java/gregtech/api/world/GT_Worldgen.java
@@ -0,0 +1,94 @@
+package gregtech.api.world;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import gregtech.api.GregTech_API;
+
+public abstract class GT_Worldgen {
+
+ public final String mWorldGenName;
+ public final boolean mEnabled;
+ private final Map<String, Boolean> mDimensionMap = new ConcurrentHashMap<>();
+
+ @SuppressWarnings({ "unchecked", "rawtypes" }) // The adding of "this" needs a List<this> which does not exist
+ public GT_Worldgen(String aName, List aList, boolean aDefault) {
+ mWorldGenName = aName;
+ mEnabled = GregTech_API.sWorldgenFile.get("worldgen", mWorldGenName, aDefault);
+ if (mEnabled) aList.add(this);
+ }
+
+ /**
+ * @param aWorld The World Object
+ * @param aRandom The Random Generator to use
+ * @param aBiome The Name of the Biome (always != null)
+ * @param aDimensionType The Type of Worldgeneration to add. -1 = Nether, 0 = Overworld, +1 = End
+ * @param aChunkX xCoord of the Chunk
+ * @param aChunkZ zCoord of the Chunk
+ * @return if the Worldgeneration has been successfully completed
+ */
+ public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ return false;
+ }
+
+ public int executeWorldgenChunkified(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, int seedX, int seedZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ return 4; // This is for the empty Orevein
+ }
+
+ /**
+ * @param aWorld The World Object
+ * @param aRandom The Random Generator to use
+ * @param aBiome The Name of the Biome (always != null)
+ * @param aDimensionType The Type of Worldgeneration to add. -1 = Nether, 0 = Overworld, +1 = End
+ * @param aChunkX xCoord of the Chunk
+ * @param aChunkZ zCoord of the Chunk
+ * @return if the Worldgeneration has been successfully completed
+ */
+ public boolean executeCavegen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ return false;
+ }
+
+ /**
+ *
+ * @param aWorld The World Object
+ * @param aDimensionType The Type of Worldgeneration to add. -1 = Nether, 0 = Overworld, +1 = End
+ * @param aAllowedDimensionType The Type of allowed Worldgeneration
+ * @return if generation for this world is allowed for MoronTech (tm) OreGen (ATM (2.0.3.1Dev) only End, Nether,
+ * Overworld, Twilight Forest and Deep Dark)
+ */
+ public boolean isGenerationAllowed(World aWorld, int aDimensionType, int aAllowedDimensionType) {
+ return isGenerationAllowed(aWorld.provider.getDimensionName(), aDimensionType, aAllowedDimensionType);
+ }
+
+ /**
+ *
+ * @param aDimName The Dimension Name
+ * @param aDimensionType The Type of Worldgeneration to add. -1 = Nether, 0 = Overworld, +1 = End
+ * @param aAllowedDimensionType The Type of allowed Worldgeneration
+ * @return if generation for this world is allowed for MoronTech (tm) OreGen (ATM (2.0.3.1Dev) only End, Nether,
+ * Overworld, Twilight Forest and Deep Dark)
+ */
+ public boolean isGenerationAllowed(String aDimName, int aDimensionType, int aAllowedDimensionType) {
+ if (!(aDimName.equalsIgnoreCase("Overworld") || aDimName.equalsIgnoreCase("Nether")
+ || aDimName.equalsIgnoreCase("The End")
+ || aDimName.equalsIgnoreCase("Twilight Forest")
+ || aDimName.equalsIgnoreCase("Underdark"))) return false;
+
+ Boolean tAllowed = mDimensionMap.get(aDimName);
+ if (tAllowed == null) {
+ boolean tValue = GregTech_API.sWorldgenFile
+ .get("worldgen." + mWorldGenName, aDimName, aDimensionType == aAllowedDimensionType);
+ mDimensionMap.put(aDimName, tValue);
+ return tValue;
+ }
+ return tAllowed;
+ }
+}
diff --git a/src/main/java/gregtech/api/world/GT_Worldgen_Ore.java b/src/main/java/gregtech/api/world/GT_Worldgen_Ore.java
new file mode 100644
index 0000000000..958adfad54
--- /dev/null
+++ b/src/main/java/gregtech/api/world/GT_Worldgen_Ore.java
@@ -0,0 +1,34 @@
+package gregtech.api.world;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import net.minecraft.block.Block;
+
+import gregtech.api.GregTech_API;
+
+public abstract class GT_Worldgen_Ore extends GT_Worldgen {
+
+ public final int mBlockMeta, mAmount, mSize, mMinY, mMaxY, mProbability, mDimensionType;
+ public final Block mBlock;
+ public final Collection<String> mBiomeList;
+ public final boolean mAllowToGenerateinVoid;
+ private final String aTextWorldgen = "worldgen.";
+
+ public GT_Worldgen_Ore(String aName, boolean aDefault, Block aBlock, int aBlockMeta, int aDimensionType,
+ int aAmount, int aSize, int aProbability, int aMinY, int aMaxY, Collection<String> aBiomeList,
+ boolean aAllowToGenerateinVoid) {
+ super(aName, GregTech_API.sWorldgenList, aDefault);
+ mDimensionType = aDimensionType;
+ mBlock = aBlock;
+ mBlockMeta = Math.min(Math.max(aBlockMeta, 0), 15);
+ mProbability = GregTech_API.sWorldgenFile.get(aTextWorldgen + mWorldGenName, "Probability", aProbability);
+ mAmount = GregTech_API.sWorldgenFile.get(aTextWorldgen + mWorldGenName, "Amount", aAmount);
+ mSize = GregTech_API.sWorldgenFile.get(aTextWorldgen + mWorldGenName, "Size", aSize);
+ mMinY = GregTech_API.sWorldgenFile.get(aTextWorldgen + mWorldGenName, "MinHeight", aMinY);
+ mMaxY = GregTech_API.sWorldgenFile.get(aTextWorldgen + mWorldGenName, "MaxHeight", aMaxY);
+ if (aBiomeList == null) mBiomeList = new ArrayList<>();
+ else mBiomeList = aBiomeList;
+ mAllowToGenerateinVoid = aAllowToGenerateinVoid;
+ }
+}
diff --git a/src/main/java/gregtech/api/world/GT_Worldgen_Ore_SingleBlock.java b/src/main/java/gregtech/api/world/GT_Worldgen_Ore_SingleBlock.java
new file mode 100644
index 0000000000..900f7808b1
--- /dev/null
+++ b/src/main/java/gregtech/api/world/GT_Worldgen_Ore_SingleBlock.java
@@ -0,0 +1,53 @@
+package gregtech.api.world;
+
+import java.util.Collection;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+public class GT_Worldgen_Ore_SingleBlock extends GT_Worldgen_Ore {
+
+ public GT_Worldgen_Ore_SingleBlock(String aName, boolean aDefault, Block aBlock, int aBlockMeta, int aDimensionType,
+ int aAmount, int aSize, int aProbability, int aMinY, int aMaxY, Collection<String> aBiomeList,
+ boolean aAllowToGenerateinVoid) {
+ super(
+ aName,
+ aDefault,
+ aBlock,
+ aBlockMeta,
+ aDimensionType,
+ aAmount,
+ aSize,
+ aProbability,
+ aMinY,
+ aMaxY,
+ aBiomeList,
+ aAllowToGenerateinVoid);
+ }
+
+ @Override
+ public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ if (isGenerationAllowed(aWorld, aDimensionType, mDimensionType)
+ && (mBiomeList.isEmpty() || mBiomeList.contains(aBiome))
+ && (mProbability <= 1 || aRandom.nextInt(mProbability) == 0)) {
+ for (int i = 0; i < mAmount; i++) {
+ int tX = aChunkX + aRandom.nextInt(16), tY = mMinY + aRandom.nextInt(mMaxY - mMinY),
+ tZ = aChunkZ + aRandom.nextInt(16);
+ Block tBlock = aWorld.getBlock(tX, tY, tZ);
+ if (((mAllowToGenerateinVoid && aWorld.getBlock(tX, tY, tZ)
+ .isAir(aWorld, tX, tY, tZ))
+ || (tBlock != null && (tBlock.isReplaceableOreGen(aWorld, tX, tY, tZ, Blocks.stone)
+ || tBlock.isReplaceableOreGen(aWorld, tX, tY, tZ, Blocks.end_stone)
+ || tBlock.isReplaceableOreGen(aWorld, tX, tY, tZ, Blocks.netherrack))))) {
+ aWorld.setBlock(tX, tY, tZ, mBlock, mBlockMeta, 0);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/api/world/GT_Worldgen_Ore_SingleBlock_UnderLava.java b/src/main/java/gregtech/api/world/GT_Worldgen_Ore_SingleBlock_UnderLava.java
new file mode 100644
index 0000000000..956cd0eb4c
--- /dev/null
+++ b/src/main/java/gregtech/api/world/GT_Worldgen_Ore_SingleBlock_UnderLava.java
@@ -0,0 +1,55 @@
+package gregtech.api.world;
+
+import java.util.Collection;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+public class GT_Worldgen_Ore_SingleBlock_UnderLava extends GT_Worldgen_Ore {
+
+ public GT_Worldgen_Ore_SingleBlock_UnderLava(String aName, boolean aDefault, Block aBlock, int aBlockMeta,
+ int aDimensionType, int aAmount, int aSize, int aProbability, int aMinY, int aMaxY,
+ Collection<String> aBiomeList, boolean aAllowToGenerateinVoid) {
+ super(
+ aName,
+ aDefault,
+ aBlock,
+ aBlockMeta,
+ aDimensionType,
+ aAmount,
+ aSize,
+ aProbability,
+ aMinY,
+ aMaxY,
+ aBiomeList,
+ aAllowToGenerateinVoid);
+ }
+
+ @Override
+ public boolean executeCavegen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ if (isGenerationAllowed(aWorld, aDimensionType, mDimensionType)
+ && (mBiomeList.isEmpty() || mBiomeList.contains(aBiome))
+ && (mProbability <= 1 || aRandom.nextInt(mProbability) == 0)) {
+ for (int i = 0; i < mAmount; i++) {
+ int tX = aChunkX + aRandom.nextInt(16), tY = mMinY + aRandom.nextInt(mMaxY - mMinY),
+ tZ = aChunkZ + aRandom.nextInt(16);
+ Block tBlock = aWorld.getBlock(tX, tY, tZ);
+ if (((mAllowToGenerateinVoid && aWorld.getBlock(tX, tY, tZ)
+ .isAir(aWorld, tX, tY, tZ))
+ || (tBlock != null && (tBlock.isReplaceableOreGen(aWorld, tX, tY, tZ, Blocks.stone)
+ || tBlock.isReplaceableOreGen(aWorld, tX, tY, tZ, Blocks.end_stone)
+ || tBlock.isReplaceableOreGen(aWorld, tX, tY, tZ, Blocks.netherrack))))) {
+ if (aWorld.getBlock(tX, tY + 1, tZ) == Blocks.lava
+ || aWorld.getBlock(tX, tY, tZ) == Blocks.flowing_lava)
+ aWorld.setBlock(tX, tY, tZ, mBlock, mBlockMeta, 0);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/client/GT_GUI_ClientConfig.java b/src/main/java/gregtech/client/GT_GUI_ClientConfig.java
new file mode 100644
index 0000000000..1e9841369b
--- /dev/null
+++ b/src/main/java/gregtech/client/GT_GUI_ClientConfig.java
@@ -0,0 +1,63 @@
+package gregtech.client;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraftforge.common.config.ConfigCategory;
+import net.minecraftforge.common.config.ConfigElement;
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.common.config.Property;
+
+import cpw.mods.fml.client.config.GuiConfig;
+import cpw.mods.fml.client.config.IConfigElement;
+import gregtech.api.GregTech_API;
+
+public class GT_GUI_ClientConfig extends GuiConfig {
+
+ public GT_GUI_ClientConfig(GuiScreen parentScreen) {
+ super(
+ parentScreen,
+ getConfigElements(),
+ GregTech.ID,
+ "client",
+ false,
+ false,
+ getAbridgedConfigPath(GregTech_API.sClientDataFile.mConfig.toString()));
+ }
+
+ @SuppressWarnings("rawtypes")
+ private static List<IConfigElement> getConfigElements() {
+ final Configuration config = GregTech_API.sClientDataFile.mConfig;
+ setLanguageKeys(config);
+ return config.getCategoryNames()
+ .stream()
+ .filter(name -> name.indexOf('.') == -1)
+ .map(name -> new ConfigElement(config.getCategory(name)))
+ .collect(Collectors.toList());
+ }
+
+ private static void setLanguageKeys(Configuration config) {
+ for (String categoryName : config.getCategoryNames()) {
+ ConfigCategory category = config.getCategory(categoryName);
+ category.setLanguageKey("GT5U.config." + categoryName);
+ for (Map.Entry<String, Property> entry : category.entrySet()) {
+ // drop the default value in name
+ String name = entry.getKey();
+ int defaultStart = name.lastIndexOf('_');
+ String realName = defaultStart >= 0 ? name.substring(0, defaultStart) : name;
+ if (categoryName.equals("nei.recipe_categories")) {
+ // reuse existing translation for RecipeCategory
+ entry.getValue()
+ .setLanguageKey(name);
+ } else {
+ entry.getValue()
+ .setLanguageKey(String.format("%s.%s", category.getLanguagekey(), realName));
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/client/GT_GuiFactory.java b/src/main/java/gregtech/client/GT_GuiFactory.java
new file mode 100644
index 0000000000..3c8e5cd52c
--- /dev/null
+++ b/src/main/java/gregtech/client/GT_GuiFactory.java
@@ -0,0 +1,29 @@
+package gregtech.client;
+
+import java.util.Set;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiScreen;
+
+import cpw.mods.fml.client.IModGuiFactory;
+
+public class GT_GuiFactory implements IModGuiFactory {
+
+ @Override
+ public void initialize(Minecraft minecraftInstance) {}
+
+ @Override
+ public Class<? extends GuiScreen> mainConfigGuiClass() {
+ return GT_GUI_ClientConfig.class;
+ }
+
+ @Override
+ public Set<RuntimeOptionCategoryElement> runtimeGuiCategories() {
+ return null;
+ }
+
+ @Override
+ public RuntimeOptionGuiHandler getHandlerFor(RuntimeOptionCategoryElement element) {
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/client/GT_SoundLoop.java b/src/main/java/gregtech/client/GT_SoundLoop.java
new file mode 100644
index 0000000000..905f2c20d3
--- /dev/null
+++ b/src/main/java/gregtech/client/GT_SoundLoop.java
@@ -0,0 +1,80 @@
+package gregtech.client;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.audio.MovingSound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.multitileentity.machine.MultiTileBasicMachine;
+
+@SideOnly(Side.CLIENT)
+public class GT_SoundLoop extends MovingSound {
+
+ private static final float VOLUME_RAMP = 0.0625f;
+ private final boolean whileActive;
+ private final boolean whileInactive;
+ private final int worldID;
+ private boolean fadeMe = false;
+
+ public GT_SoundLoop(ResourceLocation p_i45104_1_, IGregTechTileEntity base, boolean stopWhenActive,
+ boolean stopWhenInactive) {
+ super(p_i45104_1_);
+ this.whileActive = stopWhenActive;
+ this.whileInactive = stopWhenInactive;
+ xPosF = base.getXCoord();
+ yPosF = base.getYCoord();
+ zPosF = base.getZCoord();
+ worldID = base.getWorld().provider.dimensionId;
+ repeat = true;
+ volume = VOLUME_RAMP;
+ }
+
+ public GT_SoundLoop(ResourceLocation sound, MultiTileBasicMachine base, boolean stopWhenActive,
+ boolean stopWhenInactive) {
+ super(sound);
+ this.whileActive = stopWhenActive;
+ this.whileInactive = stopWhenInactive;
+ xPosF = base.getXCoord();
+ yPosF = base.getYCoord();
+ zPosF = base.getZCoord();
+ worldID = base.getWorld().provider.dimensionId;
+ repeat = true;
+ volume = VOLUME_RAMP;
+ }
+
+ @Override
+ public void update() {
+ if (donePlaying) {
+ return;
+ }
+ if (fadeMe) {
+ volume -= VOLUME_RAMP;
+ if (volume <= 0) {
+ volume = 0;
+ donePlaying = true;
+ }
+ } else if (volume < 1) {
+ volume += VOLUME_RAMP;
+ }
+ World world = Minecraft.getMinecraft().thePlayer.worldObj;
+ donePlaying = world.provider.dimensionId != worldID
+ || !world.checkChunksExist((int) xPosF, (int) yPosF, (int) zPosF, (int) xPosF, (int) yPosF, (int) zPosF);
+ if (donePlaying) return;
+ TileEntity tile = world.getTileEntity((int) xPosF, (int) yPosF, (int) zPosF);
+ if ((tile instanceof IGregTechTileEntity)) {
+ fadeMe |= ((IGregTechTileEntity) tile).isActive() ? whileActive : whileInactive;
+ return;
+ }
+
+ if ((tile instanceof MultiTileBasicMachine)) {
+ fadeMe |= ((MultiTileBasicMachine) tile).isActive() ? whileActive : whileInactive;
+ return;
+ }
+
+ donePlaying = true;
+ }
+}
diff --git a/src/main/java/gregtech/client/GT_TooltipHandler.java b/src/main/java/gregtech/client/GT_TooltipHandler.java
new file mode 100644
index 0000000000..c527729abd
--- /dev/null
+++ b/src/main/java/gregtech/client/GT_TooltipHandler.java
@@ -0,0 +1,195 @@
+package gregtech.client;
+
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.AQUA;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.BLUE;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.BOLD;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_BLUE;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_GRAY;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_GREEN;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_PURPLE;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.DARK_RED;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.GOLD;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.GRAY;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.GREEN;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.LIGHT_PURPLE;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.OBFUSCATED;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.RED;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.UNDERLINE;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.WHITE;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.YELLOW;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.addItemTooltip;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.animatedText;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.chain;
+import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.text;
+
+import java.util.function.Supplier;
+
+import net.minecraft.item.ItemStack;
+
+public class GT_TooltipHandler {
+
+ public static void registerTieredTooltip(ItemStack item, Tier tier) {
+ addItemTooltip(item, tier.tooltip);
+ }
+
+ public enum Tier {
+
+ ULV(text(WHITE + "ULV-Tier")),
+ LV(text(GRAY + "LV-Tier")),
+ MV(text(GOLD + "MV-Tier")),
+ HV(text(YELLOW + "HV-Tier")),
+ EV(text(DARK_GRAY + "EV-Tier")),
+ IV(text(GREEN + "IV-Tier")),
+ LuV(text(LIGHT_PURPLE + "LuV-Tier")),
+ ZPM(text(AQUA + "ZPM-Tier")),
+ UV(text(DARK_GREEN + "UV-Tier")),
+ UHV(text(DARK_RED + "UHV-Tier")),
+ UEV(text(DARK_PURPLE + "UEV-Tier")),
+ UIV(text(DARK_BLUE + BOLD + "UIV-Tier")),
+ UMV(text(RED + BOLD + UNDERLINE + "UMV-Tier")),
+ UXV(animatedText("UXV-Tier", 1, 100, DARK_PURPLE + BOLD + UNDERLINE, DARK_RED + UNDERLINE + BOLD)),
+ MAX(chain(
+ animatedText(
+ "X",
+ 1,
+ 100,
+ LIGHT_PURPLE + BOLD + OBFUSCATED + UNDERLINE,
+ RED + BOLD + OBFUSCATED + UNDERLINE,
+ GOLD + OBFUSCATED + BOLD + UNDERLINE,
+ YELLOW + OBFUSCATED + BOLD + UNDERLINE,
+ GREEN + OBFUSCATED + BOLD + UNDERLINE,
+ AQUA + OBFUSCATED + BOLD + UNDERLINE,
+ BLUE + OBFUSCATED + BOLD + UNDERLINE),
+ animatedText(
+ "MAX-Tier",
+ 1,
+ 100,
+ RED + BOLD + UNDERLINE,
+ GOLD + BOLD + UNDERLINE,
+ YELLOW + BOLD + UNDERLINE,
+ GREEN + BOLD + UNDERLINE,
+ AQUA + BOLD + UNDERLINE,
+ BLUE + BOLD + UNDERLINE,
+ LIGHT_PURPLE + BOLD + UNDERLINE),
+ animatedText(
+ "X",
+ 1,
+ 100,
+ GOLD + OBFUSCATED + BOLD + UNDERLINE,
+ YELLOW + OBFUSCATED + BOLD + UNDERLINE,
+ GREEN + OBFUSCATED + BOLD + UNDERLINE,
+ AQUA + OBFUSCATED + BOLD + UNDERLINE,
+ BLUE + OBFUSCATED + BOLD + UNDERLINE,
+ LIGHT_PURPLE + OBFUSCATED + BOLD + UNDERLINE,
+ RED + OBFUSCATED + BOLD + UNDERLINE))),
+ ERV(chain(
+ animatedText(
+ "E",
+ 1,
+ 100,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE),
+ animatedText(
+ "R",
+ 1,
+ 100,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE),
+ animatedText(
+ "R",
+ 1,
+ 200,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE),
+ animatedText(
+ "O",
+ 1,
+ 150,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE),
+ animatedText(
+ "R",
+ 1,
+ 150,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE),
+ animatedText(
+ "-",
+ 1,
+ 150,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE),
+ animatedText(
+ "T",
+ 1,
+ 200,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE),
+ animatedText(
+ "i",
+ 1,
+ 100,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE),
+ animatedText(
+ "e",
+ 1,
+ 150,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE),
+ animatedText(
+ "r",
+ 1,
+ 100,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_RED + BOLD + UNDERLINE,
+ DARK_GRAY + OBFUSCATED + BOLD + UNDERLINE)));
+
+ private final Supplier<String> tooltip;
+
+ Tier(Supplier<String> tooltip) {
+ this.tooltip = tooltip;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_Client.java b/src/main/java/gregtech/common/GT_Client.java
new file mode 100644
index 0000000000..4cb063b3b5
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_Client.java
@@ -0,0 +1,1096 @@
+// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
+// Jad home page: http://www.kpdus.com/jad.html
+// Decompiler options: packimports(3)
+// Source File Name: GT_Client.java
+
+package gregtech.common;
+
+import static gregtech.api.enums.GT_Values.calculateMaxPlasmaTurbineEfficiency;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GregTech;
+import static org.lwjgl.opengl.GL11.GL_LINE_LOOP;
+
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Scanner;
+import java.util.function.Function;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.GLAllocation;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.resources.IReloadableResourceManager;
+import net.minecraft.client.resources.IResourceManager;
+import net.minecraft.client.resources.IResourceManagerReloadListener;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.World;
+import net.minecraftforge.client.event.DrawBlockHighlightEvent;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL20;
+
+import com.glodblock.github.nei.recipes.FluidRecipe;
+import com.glodblock.github.nei.recipes.extractor.GregTech5RecipeExtractor;
+import com.gtnewhorizon.structurelib.alignment.IAlignment;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider;
+
+import appeng.api.util.IOrientable;
+import appeng.tile.misc.TileInterface;
+import codechicken.lib.vec.Rotation;
+import codechicken.lib.vec.Scale;
+import codechicken.lib.vec.Transformation;
+import codechicken.lib.vec.Translation;
+import cpw.mods.fml.client.event.ConfigChangedEvent;
+import cpw.mods.fml.client.registry.RenderingRegistry;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.TickEvent;
+import cpw.mods.fml.common.network.FMLNetworkEvent;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.gui.GT_GUIColorOverride;
+import gregtech.api.gui.modularui.FallbackableSteamTexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.ITurnable;
+import gregtech.api.items.GT_MetaGenerated_Item;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+import gregtech.api.net.GT_Packet_ClientPreference;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.recipe.RecipeCategory;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.ColorsMetadataSection;
+import gregtech.api.util.ColorsMetadataSectionSerializer;
+import gregtech.api.util.GT_ClientPreference;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_PlayedSound;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder;
+import gregtech.common.blocks.GT_Item_Machines;
+import gregtech.common.entities.GT_Entity_Arrow;
+import gregtech.common.entities.GT_Entity_Arrow_Potion;
+import gregtech.common.render.GT_CapeRenderer;
+import gregtech.common.render.GT_FlaskRenderer;
+import gregtech.common.render.GT_FluidDisplayStackRenderer;
+import gregtech.common.render.GT_MetaGenerated_Tool_Renderer;
+import gregtech.common.render.GT_MultiTile_Renderer;
+import gregtech.common.render.GT_PollutionRenderer;
+import gregtech.common.render.GT_RenderDrone;
+import gregtech.common.render.GT_Renderer_Block;
+import gregtech.common.render.GT_Renderer_Entity_Arrow;
+import gregtech.common.render.items.GT_MetaGenerated_Item_Renderer;
+import gregtech.common.tileentities.debug.GT_MetaTileEntity_AdvDebugStructureWriter;
+import gregtech.loaders.ExtraIcons;
+import gregtech.loaders.misc.GT_Bees;
+import gregtech.loaders.preload.GT_PreLoad;
+import gregtech.nei.NEI_GT_Config;
+import ic2.api.tile.IWrenchable;
+
+// Referenced classes of package gregtech.common:
+// GT_Proxy
+
+public class GT_Client extends GT_Proxy implements Runnable {
+
+ public static final String GTNH_CAPE_LIST_URL = "https://raw.githubusercontent.com/GTNewHorizons/CustomGTCapeHook-Cape-List/master/capes.txt";
+ public static final String GT_CAPE_LIST_URL = "http://gregtech.overminddl1.com/com/gregoriust/gregtech/supporterlist.txt";
+ private static final List<Block> ROTATABLE_VANILLA_BLOCKS;
+
+ private static final int[][] GRID_SWITCH_TABLE = new int[][] { { 0, 5, 3, 1, 2, 4 }, { 5, 0, 1, 3, 2, 4 },
+ { 1, 3, 0, 5, 2, 4 }, { 3, 1, 5, 0, 2, 4 }, { 4, 2, 3, 1, 0, 5 }, { 2, 4, 3, 1, 5, 0 }, };
+
+ // don't ask. these "just works"
+ private static final Transformation ROTATION_MARKER_TRANSFORM_CENTER = new Scale(0.5);
+ private static final Transformation[] ROTATION_MARKER_TRANSFORMS_SIDES_TRANSFORMS = {
+ new Scale(0.25).with(new Translation(0, 0, 0.375))
+ .compile(),
+ new Scale(0.25).with(new Translation(0.375, 0, 0))
+ .compile(),
+ new Scale(0.25).with(new Translation(0, 0, -0.375))
+ .compile(),
+ new Scale(0.25).with(new Translation(-0.375, 0, 0))
+ .compile(), };
+ private static final int[] ROTATION_MARKER_TRANSFORMS_SIDES = { -1, -1, 2, 0, 3, 1, -1, -1, 0, 2, 3, 1, 0, 2, -1,
+ -1, 3, 1, 2, 0, -1, -1, 3, 1, 1, 3, 2, 0, -1, -1, 3, 1, 2, 0, -1, -1 };
+ private static final Transformation[] ROTATION_MARKER_TRANSFORMS_CORNER = {
+ new Scale(0.25).with(new Translation(0.375, 0, 0.375))
+ .compile(),
+ new Scale(0.25).with(new Translation(-0.375, 0, 0.375))
+ .compile(),
+ new Scale(0.25).with(new Translation(0.375, 0, -0.375))
+ .compile(),
+ new Scale(0.25).with(new Translation(-0.375, 0, -0.375))
+ .compile(), };
+ private static int rotationMarkerDisplayList;
+ private static boolean rotationMarkerDisplayListCompiled = false;
+
+ static {
+ ROTATABLE_VANILLA_BLOCKS = Arrays.asList(
+ Blocks.piston,
+ Blocks.sticky_piston,
+ Blocks.furnace,
+ Blocks.lit_furnace,
+ Blocks.dropper,
+ Blocks.dispenser,
+ Blocks.chest,
+ Blocks.trapped_chest,
+ Blocks.ender_chest,
+ Blocks.hopper,
+ Blocks.pumpkin,
+ Blocks.lit_pumpkin);
+ }
+
+ private final HashSet<String> mCapeList = new HashSet<>();
+ public static final GT_PollutionRenderer mPollutionRenderer = new GT_PollutionRenderer();
+ private final GT_CapeRenderer mCapeRenderer;
+ private final List<Materials> mPosR;
+ private final List<Materials> mPosG;
+ private final List<Materials> mPosB;
+ private final List<Materials> mPosA = Collections.emptyList();
+ private final List<Materials> mNegR;
+ private final List<Materials> mNegG;
+ private final List<Materials> mNegB;
+ private final List<Materials> mNegA = Collections.emptyList();
+ private final List<Materials> mMoltenPosR;
+ private final List<Materials> mMoltenPosG;
+ private final List<Materials> mMoltenPosB;
+ private final List<Materials> mMoltenPosA = Collections.emptyList();
+ private final List<Materials> mMoltenNegR;
+ private final List<Materials> mMoltenNegG;
+ private final List<Materials> mMoltenNegB;
+ private final List<Materials> mMoltenNegA = Collections.emptyList();
+ private long mAnimationTick;
+ /**
+ * This is the place to def the value used below
+ **/
+ private long afterSomeTime;
+
+ private boolean mAnimationDirection;
+ private GT_ClientPreference mPreference;
+ private boolean mFirstTick = false;
+ public static final int ROTATION_MARKER_RESOLUTION = 120;
+ private int mReloadCount;
+ private float renderTickTime;
+ public static GT_MetaGenerated_Item_Renderer metaGeneratedItemRenderer;
+
+ public GT_Client() {
+ mCapeRenderer = new GT_CapeRenderer(mCapeList);
+ mAnimationTick = 0L;
+ mAnimationDirection = false;
+ mPosR = Arrays.asList(
+ Materials.Enderium,
+ Materials.Vinteum,
+ Materials.Uranium235,
+ Materials.InfusedGold,
+ Materials.Plutonium241,
+ Materials.NaquadahEnriched,
+ Materials.Naquadria,
+ Materials.InfusedOrder,
+ Materials.Force,
+ Materials.Pyrotheum,
+ Materials.Sunnarium,
+ Materials.Glowstone,
+ Materials.Thaumium,
+ Materials.InfusedVis,
+ Materials.InfusedAir,
+ Materials.InfusedFire,
+ Materials.FierySteel,
+ Materials.Firestone);
+ mPosG = Arrays.asList(
+ Materials.Enderium,
+ Materials.Vinteum,
+ Materials.Uranium235,
+ Materials.InfusedGold,
+ Materials.Plutonium241,
+ Materials.NaquadahEnriched,
+ Materials.Naquadria,
+ Materials.InfusedOrder,
+ Materials.Force,
+ Materials.Pyrotheum,
+ Materials.Sunnarium,
+ Materials.Glowstone,
+ Materials.InfusedAir,
+ Materials.InfusedEarth);
+ mPosB = Arrays.asList(
+ Materials.Enderium,
+ Materials.Vinteum,
+ Materials.Uranium235,
+ Materials.InfusedGold,
+ Materials.Plutonium241,
+ Materials.NaquadahEnriched,
+ Materials.Naquadria,
+ Materials.InfusedOrder,
+ Materials.InfusedVis,
+ Materials.InfusedWater,
+ Materials.Thaumium);
+ mNegR = Arrays.asList(Materials.InfusedEntropy, Materials.NetherStar);
+ mNegG = Arrays.asList(Materials.InfusedEntropy, Materials.NetherStar);
+ mNegB = Arrays.asList(Materials.InfusedEntropy, Materials.NetherStar);
+ mMoltenPosR = Arrays.asList(
+ Materials.Enderium,
+ Materials.NetherStar,
+ Materials.Vinteum,
+ Materials.Uranium235,
+ Materials.InfusedGold,
+ Materials.Plutonium241,
+ Materials.NaquadahEnriched,
+ Materials.Naquadria,
+ Materials.InfusedOrder,
+ Materials.Force,
+ Materials.Pyrotheum,
+ Materials.Sunnarium,
+ Materials.Glowstone,
+ Materials.Thaumium,
+ Materials.InfusedVis,
+ Materials.InfusedAir,
+ Materials.InfusedFire,
+ Materials.FierySteel,
+ Materials.Firestone);
+ mMoltenPosG = Arrays.asList(
+ Materials.Enderium,
+ Materials.NetherStar,
+ Materials.Vinteum,
+ Materials.Uranium235,
+ Materials.InfusedGold,
+ Materials.Plutonium241,
+ Materials.NaquadahEnriched,
+ Materials.Naquadria,
+ Materials.InfusedOrder,
+ Materials.Force,
+ Materials.Pyrotheum,
+ Materials.Sunnarium,
+ Materials.Glowstone,
+ Materials.InfusedAir,
+ Materials.InfusedEarth);
+ mMoltenPosB = Arrays.asList(
+ Materials.Enderium,
+ Materials.NetherStar,
+ Materials.Vinteum,
+ Materials.Uranium235,
+ Materials.InfusedGold,
+ Materials.Plutonium241,
+ Materials.NaquadahEnriched,
+ Materials.Naquadria,
+ Materials.InfusedOrder,
+ Materials.InfusedVis,
+ Materials.InfusedWater,
+ Materials.Thaumium);
+ mMoltenNegR = Collections.singletonList(Materials.InfusedEntropy);
+ mMoltenNegG = Collections.singletonList(Materials.InfusedEntropy);
+ mMoltenNegB = Collections.singletonList(Materials.InfusedEntropy);
+ }
+
+ private static boolean checkedForChicken = false;
+
+ private static void drawGrid(DrawBlockHighlightEvent aEvent, boolean showCoverConnections, boolean aIsWrench,
+ boolean aIsSneaking) {
+ if (!checkedForChicken) {
+ try {
+ Class.forName("codechicken.lib.vec.Rotation");
+ } catch (ClassNotFoundException e) {
+ return;
+ }
+ checkedForChicken = true;
+ }
+
+ GL11.glPushMatrix();
+
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+
+ // pause shader
+ int program = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM);
+ GL20.glUseProgram(0);
+
+ MovingObjectPosition target = aEvent.target;
+ EntityPlayer player = aEvent.player;
+ double camX = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) aEvent.partialTicks;
+ double camY = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) aEvent.partialTicks;
+ double camZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double) aEvent.partialTicks;
+ GL11.glTranslated(target.blockX - (int) camX, target.blockY - (int) camY, target.blockZ - (int) camZ);
+ GL11.glTranslated(0.5D - (camX - (int) camX), 0.5D - (camY - (int) camY), 0.5D - (camZ - (int) camZ));
+ final int tSideHit = target.sideHit;
+ Rotation.sideRotations[tSideHit].glApply();
+ // draw grid
+ GL11.glTranslated(0.0D, -0.502D, 0.0D);
+ GL11.glLineWidth(2.5F);
+ GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.5F);
+ GL11.glBegin(GL11.GL_LINES);
+ GL11.glVertex3d(+.50D, .0D, -.25D);
+ GL11.glVertex3d(-.50D, .0D, -.25D);
+ GL11.glVertex3d(+.50D, .0D, +.25D);
+ GL11.glVertex3d(-.50D, .0D, +.25D);
+ GL11.glVertex3d(+.25D, .0D, -.50D);
+ GL11.glVertex3d(+.25D, .0D, +.50D);
+ GL11.glVertex3d(-.25D, .0D, -.50D);
+ GL11.glVertex3d(-.25D, .0D, +.50D);
+ final TileEntity tTile = player.worldObj.getTileEntity(target.blockX, target.blockY, target.blockZ);
+ final Block block = player.worldObj.getBlock(target.blockX, target.blockY, target.blockZ);
+ final int meta = player.worldObj.getBlockMetadata(target.blockX, target.blockY, target.blockZ);
+
+ // draw connection indicators
+ int tConnections = 0;
+ if (tTile instanceof ICoverable iCoverable) {
+ if (showCoverConnections) {
+ for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) {
+ if (iCoverable.getCoverIDAtSide(tSide) != 0) tConnections |= tSide.flag;
+ }
+ } else if (tTile instanceof BaseMetaTileEntity baseMetaTile && baseMetaTile.getAlignment() == null) {
+ if (!aIsSneaking) tConnections |= baseMetaTile.getFrontFacing().flag;
+ else if (baseMetaTile.getMetaTileEntity() instanceof GT_MetaTileEntity_BasicMachine basicMachine) {
+ tConnections |= basicMachine.mMainFacing.flag;
+ }
+ } else if (tTile instanceof BaseMetaPipeEntity pipeEntity) tConnections = pipeEntity.mConnections;
+ } else if (tTile instanceof IWrenchable wrenchable) {
+ tConnections |= ForgeDirection.getOrientation(wrenchable.getFacing()).flag;
+ } else if (ROTATABLE_VANILLA_BLOCKS.contains(block)) {
+ tConnections |= ForgeDirection.getOrientation(meta).flag;
+ } else if (tTile instanceof TileInterface tileInterface) tConnections |= tileInterface.getUp()
+ .getOpposite().flag;
+
+ if (tConnections != 0) {
+ for (ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) {
+ if ((tConnections & tSide.flag) != 0) {
+ switch (GRID_SWITCH_TABLE[target.sideHit][tSide.ordinal()]) {
+ case 0 -> {
+ GL11.glVertex3d(+.25D, .0D, +.25D);
+ GL11.glVertex3d(-.25D, .0D, -.25D);
+ GL11.glVertex3d(-.25D, .0D, +.25D);
+ GL11.glVertex3d(+.25D, .0D, -.25D);
+ }
+ case 1 -> {
+ GL11.glVertex3d(-.25D, .0D, +.50D);
+ GL11.glVertex3d(+.25D, .0D, +.25D);
+ GL11.glVertex3d(-.25D, .0D, +.25D);
+ GL11.glVertex3d(+.25D, .0D, +.50D);
+ }
+ case 2 -> {
+ GL11.glVertex3d(-.50D, .0D, -.25D);
+ GL11.glVertex3d(-.25D, .0D, +.25D);
+ GL11.glVertex3d(-.50D, .0D, +.25D);
+ GL11.glVertex3d(-.25D, .0D, -.25D);
+ }
+ case 3 -> {
+ GL11.glVertex3d(-.25D, .0D, -.50D);
+ GL11.glVertex3d(+.25D, .0D, -.25D);
+ GL11.glVertex3d(-.25D, .0D, -.25D);
+ GL11.glVertex3d(+.25D, .0D, -.50D);
+ }
+ case 4 -> {
+ GL11.glVertex3d(+.50D, .0D, -.25D);
+ GL11.glVertex3d(+.25D, .0D, +.25D);
+ GL11.glVertex3d(+.50D, .0D, +.25D);
+ GL11.glVertex3d(+.25D, .0D, -.25D);
+ }
+ case 5 -> {
+ GL11.glVertex3d(+.50D, .0D, +.50D);
+ GL11.glVertex3d(+.25D, .0D, +.25D);
+ GL11.glVertex3d(+.50D, .0D, +.25D);
+ GL11.glVertex3d(+.25D, .0D, +.50D);
+ GL11.glVertex3d(+.50D, .0D, -.50D);
+ GL11.glVertex3d(+.25D, .0D, -.25D);
+ GL11.glVertex3d(+.50D, .0D, -.25D);
+ GL11.glVertex3d(+.25D, .0D, -.50D);
+ GL11.glVertex3d(-.50D, .0D, +.50D);
+ GL11.glVertex3d(-.25D, .0D, +.25D);
+ GL11.glVertex3d(-.50D, .0D, +.25D);
+ GL11.glVertex3d(-.25D, .0D, +.50D);
+ GL11.glVertex3d(-.50D, .0D, -.50D);
+ GL11.glVertex3d(-.25D, .0D, -.25D);
+ GL11.glVertex3d(-.50D, .0D, -.25D);
+ GL11.glVertex3d(-.25D, .0D, -.50D);
+ }
+ }
+ }
+ }
+ }
+ GL11.glEnd();
+ // draw turning indicator
+ Function<ForgeDirection, Transformation[]> getTransform = (ForgeDirection direction) -> {
+ try {
+ if (direction.ordinal() == tSideHit) return new Transformation[] { ROTATION_MARKER_TRANSFORM_CENTER };
+ else if (direction.getOpposite()
+ .ordinal() == tSideHit) {
+ return ROTATION_MARKER_TRANSFORMS_CORNER;
+ } else {
+ return new Transformation[] {
+ ROTATION_MARKER_TRANSFORMS_SIDES_TRANSFORMS[ROTATION_MARKER_TRANSFORMS_SIDES[tSideHit * 6
+ + direction.ordinal()]] };
+ }
+ } catch (ArrayIndexOutOfBoundsException e) {
+ return new Transformation[] {};
+ }
+
+ };
+
+ if (aIsWrench && tTile instanceof IAlignmentProvider) {
+ final IAlignment tAlignment = ((IAlignmentProvider) (tTile)).getAlignment();
+ if (tAlignment != null) {
+ for (var transform : getTransform.apply(tAlignment.getDirection())) {
+ drawExtendedRotationMarker(transform, aIsSneaking, tAlignment);
+ }
+ }
+ }
+ if (aIsWrench && tTile instanceof IOrientable orientable
+ && !(tTile instanceof TileInterface)
+ && orientable.canBeRotated()) {
+ for (var transform : getTransform.apply(aIsSneaking ? orientable.getForward() : orientable.getUp())) {
+ drawExtendedRotationMarker(transform, aIsSneaking, orientable);
+ }
+ }
+ GL20.glUseProgram(program); // resume shader
+ GL11.glPopMatrix(); // get back to player center
+ }
+
+ private static void drawExtendedRotationMarker(Transformation transform, boolean sneaking, IAlignment alignment) {
+ if (sneaking) {
+ if (alignment.isFlipChangeAllowed()) {
+ drawFlipMarker(transform);
+ }
+ } else {
+ if (alignment.isRotationChangeAllowed()) {
+ drawRotationMarker(transform);
+ }
+ }
+ }
+
+ private static void drawExtendedRotationMarker(Transformation transform, boolean sneaking, IOrientable orientable) {
+ drawRotationMarker(transform);
+ }
+
+ private static void drawRotationMarker(Transformation transform) {
+ if (!rotationMarkerDisplayListCompiled) {
+ rotationMarkerDisplayList = GLAllocation.generateDisplayLists(1);
+ compileRotationMarkerDisplayList(rotationMarkerDisplayList);
+ rotationMarkerDisplayListCompiled = true;
+ }
+ GL11.glPushMatrix();
+ transform.glApply();
+ GL11.glCallList(rotationMarkerDisplayList);
+ GL11.glPopMatrix();
+ }
+
+ private static void compileRotationMarkerDisplayList(int displayList) {
+ GL11.glNewList(displayList, GL11.GL_COMPILE);
+ GL11.glBegin(GL_LINE_LOOP);
+ for (int i = 0; i <= ROTATION_MARKER_RESOLUTION; i++) {
+ GL11.glVertex3d(
+ Math.cos(i * Math.PI * 1.75 / ROTATION_MARKER_RESOLUTION) * 0.4,
+ 0,
+ Math.sin(i * Math.PI * 1.75 / ROTATION_MARKER_RESOLUTION) * 0.4);
+ }
+ for (int i = ROTATION_MARKER_RESOLUTION; i >= 0; i--) {
+ GL11.glVertex3d(
+ Math.cos(i * Math.PI * 1.75 / ROTATION_MARKER_RESOLUTION) * 0.24,
+ 0,
+ Math.sin(i * Math.PI * 1.75 / ROTATION_MARKER_RESOLUTION) * 0.24);
+ }
+ GL11.glVertex3d(0.141114561800, 0, 0);
+ GL11.glVertex3d(0.32, 0, -0.178885438199);
+ GL11.glVertex3d(0.498885438199, 0, 0);
+ GL11.glEnd();
+ GL11.glEndList();
+ }
+
+ private static void drawFlipMarker(Transformation transform) {
+ GL11.glPushMatrix();
+ transform.glApply();
+ final Tessellator t = Tessellator.instance;
+ // right shape
+ GL11.glLineStipple(4, (short) 0xAAAA);
+ GL11.glEnable(GL11.GL_LINE_STIPPLE);
+ t.startDrawing(GL11.GL_LINE_STRIP);
+ t.addVertex(0.1d, 0d, 0.04d);
+ t.addVertex(0.1d, 0d, 0.2d);
+ t.addVertex(0.35d, 0d, 0.35d);
+ t.addVertex(0.35d, 0d, -0.35d);
+ t.addVertex(0.1d, 0d, -0.2d);
+ t.addVertex(0.1d, 0d, -0.04d);
+ t.draw();
+ GL11.glDisable(GL11.GL_LINE_STIPPLE);
+ // left shape
+ t.startDrawing(GL11.GL_LINE_STRIP);
+ t.addVertex(-0.1d, 0d, 0.04d);
+ t.addVertex(-0.1d, 0d, 0.2d);
+ t.addVertex(-0.35d, 0d, 0.35d);
+ t.addVertex(-0.35d, 0d, -0.35d);
+ t.addVertex(-0.1d, 0d, -0.2d);
+ t.addVertex(-0.1d, 0d, -0.04d);
+ t.draw();
+ // arrow
+ t.startDrawing(GL11.GL_LINE_LOOP);
+ t.addVertex(0.15d, 0d, -0.04d);
+ t.addVertex(0.15d, 0d, -0.1d);
+ t.addVertex(0.25d, 0d, 0.d);
+ t.addVertex(0.15d, 0d, 0.1d);
+ t.addVertex(0.15d, 0d, 0.04d);
+ t.addVertex(-0.15d, 0d, 0.04d);
+ t.addVertex(-0.15d, 0d, 0.1d);
+ t.addVertex(-0.25d, 0d, 0.d);
+ t.addVertex(-0.15d, 0d, -0.1d);
+ t.addVertex(-0.15d, 0d, -0.04d);
+ t.draw();
+ GL11.glPopMatrix();
+ }
+
+ @Override
+ public boolean isServerSide() {
+ return true;
+ }
+
+ @Override
+ public boolean isClientSide() {
+ return true;
+ }
+
+ @Override
+ public boolean isBukkitSide() {
+ return false;
+ }
+
+ @Override
+ public EntityPlayer getThePlayer() {
+ return Minecraft.getMinecraft().thePlayer;
+ }
+
+ @Override
+ public int addArmor(String aPrefix) {
+ return RenderingRegistry.addNewArmourRendererPrefix(aPrefix);
+ }
+
+ @Override
+ public void onPreLoad() {
+ super.onPreLoad();
+
+ MinecraftForge.EVENT_BUS.register(new ExtraIcons());
+ Minecraft.getMinecraft()
+ .getResourcePackRepository().rprMetadataSerializer
+ .registerMetadataSectionType(new ColorsMetadataSectionSerializer(), ColorsMetadataSection.class);
+
+ new GT_MetaTileEntity_AdvDebugStructureWriter.ForgeEventHandler();
+
+ final String[] arr = { "renadi", "hanakocz", "MysteryDump", "Flaver4", "x_Fame", "Peluche321",
+ "Goshen_Ithilien", "manf", "Bimgo", "leagris", "IAmMinecrafter02", "Cerous", "Devilin_Pixy", "Bkarlsson87",
+ "BadAlchemy", "CaballoCraft", "melanclock", "Resursator", "demanzke", "AndrewAmmerlaan", "Deathlycraft",
+ "Jirajha", "Axlegear", "kei_kouma", "Dracion", "dungi", "Dorfschwein", "Zero Tw0", "mattiagraz85",
+ "sebastiank30", "Plem", "invultri", "grillo126", "malcanteth", "Malevolence_", "Nicholas_Manuel", "Sirbab",
+ "kehaan", "bpgames123", "semig0d", "9000bowser", "Sovereignty89", "Kris1432", "xander_cage_", "samuraijp",
+ "bsaa", "SpwnX", "tworf", "Kadah", "kanni", "Stute", "Hegik", "Onlyme", "t3hero", "Hotchi", "jagoly",
+ "Nullav", "BH5432", "Sibmer", "inceee", "foxxx0", "Hartok", "TMSama", "Shlnen", "Carsso", "zessirb",
+ "meep310", "Seldron", "yttr1um", "hohounk", "freebug", "Sylphio", "jmarler", "Saberawr", "r00teniy",
+ "Neonbeta", "yinscape", "voooon24", "Quintine", "peach774", "lepthymo", "bildeman", "Kremnari", "Aerosalo",
+ "OndraSter", "oscares91", "mr10movie", "Daxx367x2", "EGERTRONx", "aka13_404", "Abouttabs", "Johnstaal",
+ "djshiny99", "megatronp", "DZCreeper", "Kane_Hart", "Truculent", "vidplace7", "simon6689", "MomoNasty",
+ "UnknownXLV", "goreacraft", "Fluttermine", "Daddy_Cecil", "MrMaleficus", "TigersFangs", "cublikefoot",
+ "chainman564", "NikitaBuker", "Misha999777", "25FiveDetail", "AntiCivilBoy", "michaelbrady",
+ "xXxIceFirexXx", "Speedynutty68", "GarretSidzaka", "HallowCharm977", "mastermind1919", "The_Hypersonic",
+ "diamondguy2798", "zF4ll3nPr3d4t0r", "CrafterOfMines57", "XxELIT3xSNIP3RxX", "SuterusuKusanagi",
+ "xavier0014", "adamros", "alexbegt" };
+ for (String tName : arr) {
+ mCapeList.add(tName.toLowerCase());
+ }
+ new Thread(this).start();
+
+ mPollutionRenderer.preLoad();
+
+ mPreference = new GT_ClientPreference(GregTech_API.sClientDataFile);
+
+ Materials.initClient();
+ }
+
+ @Override
+ public void onLoad() {
+ super.onLoad();
+ GT_Renderer_Block.register();
+ new GT_MultiTile_Renderer();
+ new GT_RenderDrone();
+ metaGeneratedItemRenderer = new GT_MetaGenerated_Item_Renderer();
+ for (GT_MetaGenerated_Item item : GT_MetaGenerated_Item.sInstances.values()) {
+ metaGeneratedItemRenderer.registerItem(item);
+ }
+ if (Forestry.isModLoaded()) {
+ metaGeneratedItemRenderer.registerItem(GT_Bees.combs);
+ }
+ new GT_MetaGenerated_Tool_Renderer();
+ new GT_Renderer_Entity_Arrow(GT_Entity_Arrow.class, "arrow");
+ new GT_Renderer_Entity_Arrow(GT_Entity_Arrow_Potion.class, "arrow_potions");
+ new GT_FlaskRenderer();
+ new GT_FluidDisplayStackRenderer();
+ MinecraftForge.EVENT_BUS.register(new NEI_GT_Config());
+ }
+
+ @Override
+ public void onPostLoad() {
+ super.onPostLoad();
+
+ if (GregTech_API.sClientDataFile.get("debug", "PrintMetaIDs", false)) {
+ try {
+ for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) {
+ try {
+ if (GregTech_API.METATILEENTITIES[i] != null) {
+ GregTech_API.METATILEENTITIES[i].getStackForm(1L)
+ .getTooltip(null, true);
+ GT_Log.out.println("META " + i + " " + GregTech_API.METATILEENTITIES[i].getMetaName());
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ // reobf doesn't work with lambda, so this must be a class
+ // noinspection Convert2Lambda
+ ((IReloadableResourceManager) Minecraft.getMinecraft()
+ .getResourceManager()).registerReloadListener(new IResourceManagerReloadListener() {
+
+ @Override
+ public void onResourceManagerReload(IResourceManager l) {
+ GT_GUIColorOverride.onResourceManagerReload();
+ FallbackableSteamTexture.reload();
+ GregTech_API.sCoverBehaviors.values()
+ .forEach(GT_CoverBehaviorBase::reloadColorOverride);
+ }
+ });
+ }
+
+ @Override
+ public void onLoadComplete() {
+ super.onLoadComplete();
+ for (RecipeCategory category : RecipeCategory.ALL_RECIPE_CATEGORIES.values()) {
+ if (category.recipeMap.getFrontend()
+ .getNEIProperties().registerNEI) {
+ FluidRecipe.addRecipeMap(
+ category.unlocalizedName,
+ new GregTech5RecipeExtractor(
+ category.unlocalizedName.equals("gt.recipe.scanner")
+ || category.unlocalizedName.equals("gt.recipe.fakeAssemblylineProcess")));
+ }
+ }
+ }
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Downloading Cape List.");
+ try (final Scanner tScanner = new Scanner(new URL(GT_CAPE_LIST_URL).openStream())) {
+ while (tScanner.hasNextLine()) {
+ this.mCapeList.add(
+ tScanner.nextLine()
+ .toLowerCase());
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ GT_Log.out.println("GT New Horizons: Downloading Cape List.");
+ try (final Scanner tScanner = new Scanner(new URL(GTNH_CAPE_LIST_URL).openStream())) {
+ while (tScanner.hasNextLine()) {
+ final String tName = tScanner.nextLine()
+ .toLowerCase();
+ if (tName.contains(":")) {
+ if (!this.mCapeList.contains(tName.substring(0, tName.indexOf(":")))) {
+ this.mCapeList.add(tName);
+ }
+ } else {
+ this.mCapeList.add(tName);
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Override
+ @SubscribeEvent
+ public void onClientConnectedToServerEvent(FMLNetworkEvent.ClientConnectedToServerEvent aEvent) {
+ mFirstTick = true;
+ mReloadCount++;
+ // For utility methods elsewhere.
+ calculateMaxPlasmaTurbineEfficiency();
+ }
+
+ @Override
+ public void reloadNEICache() {
+ mReloadCount++;
+ }
+
+ @Override
+ public int getNEIReloadCount() {
+ return mReloadCount;
+ }
+
+ @SubscribeEvent
+ public void receiveRenderSpecialsEvent(net.minecraftforge.client.event.RenderPlayerEvent.Specials.Pre aEvent) {
+ mCapeRenderer.receiveRenderSpecialsEvent(aEvent);
+ }
+
+ @SubscribeEvent
+ public void onPlayerTickEventClient(TickEvent.PlayerTickEvent aEvent) {
+ if ((aEvent.side.isClient()) && (aEvent.phase == TickEvent.Phase.END) && (!aEvent.player.isDead)) {
+ if (mFirstTick) {
+ mFirstTick = false;
+ GT_Values.NW.sendToServer(new GT_Packet_ClientPreference(mPreference));
+
+ if (!Minecraft.getMinecraft()
+ .isSingleplayer()) {
+ // Check for more IC2 recipes to also catch MineTweaker additions
+ GT_ModHandler.addIC2RecipesToGT(
+ GT_ModHandler.getMaceratorRecipeList(),
+ RecipeMaps.maceratorRecipes,
+ true,
+ true,
+ true);
+ GT_ModHandler.addIC2RecipesToGT(
+ GT_ModHandler.getCompressorRecipeList(),
+ RecipeMaps.compressorRecipes,
+ true,
+ true,
+ true);
+ GT_ModHandler.addIC2RecipesToGT(
+ GT_ModHandler.getExtractorRecipeList(),
+ RecipeMaps.extractorRecipes,
+ true,
+ true,
+ true);
+ GT_ModHandler.addIC2RecipesToGT(
+ GT_ModHandler.getOreWashingRecipeList(),
+ RecipeMaps.oreWasherRecipes,
+ false,
+ true,
+ true);
+ GT_ModHandler.addIC2RecipesToGT(
+ GT_ModHandler.getThermalCentrifugeRecipeList(),
+ RecipeMaps.thermalCentrifugeRecipes,
+ true,
+ true,
+ true);
+ }
+ }
+ afterSomeTime++;
+ if (afterSomeTime >= 100L) {
+ afterSomeTime = 0;
+ }
+ for (Iterator<Map.Entry<GT_PlayedSound, Integer>> iterator = GT_Utility.sPlayedSoundMap.entrySet()
+ .iterator(); iterator.hasNext();) {
+ Map.Entry<GT_PlayedSound, Integer> tEntry = iterator.next();
+ if (tEntry.getValue() < 0) {
+ iterator.remove();
+ } else {
+ tEntry.setValue(tEntry.getValue() - 1);
+ }
+ }
+ if (!GregTech_API.mServerStarted) GregTech_API.mServerStarted = true;
+ }
+ }
+
+ @SubscribeEvent
+ public void onConfigChange(ConfigChangedEvent.OnConfigChangedEvent e) {
+ if (GregTech.ID.equals(e.modID) && "client".equals(e.configID)) {
+ GregTech_API.sClientDataFile.mConfig.save();
+ // refresh client preference and send to server, since it's the only config we allow changing at runtime.
+ mPreference = new GT_ClientPreference(GregTech_API.sClientDataFile);
+ GT_PreLoad.loadClientConfig();
+ if (e.isWorldRunning) GT_Values.NW.sendToServer(new GT_Packet_ClientPreference(mPreference));
+ }
+ }
+
+ @SubscribeEvent
+ public void onDrawBlockHighlight(DrawBlockHighlightEvent aEvent) {
+ final Block aBlock = aEvent.player.worldObj
+ .getBlock(aEvent.target.blockX, aEvent.target.blockY, aEvent.target.blockZ);
+ final TileEntity aTileEntity = aEvent.player.worldObj
+ .getTileEntity(aEvent.target.blockX, aEvent.target.blockY, aEvent.target.blockZ);
+
+ if (GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sWrenchList)) {
+ if (aTileEntity instanceof ITurnable || ROTATABLE_VANILLA_BLOCKS.contains(aBlock)
+ || aTileEntity instanceof IWrenchable
+ || (aTileEntity instanceof IOrientable orientable && orientable.canBeRotated()))
+ drawGrid(aEvent, false, true, aEvent.player.isSneaking());
+ return;
+ }
+
+ if (!(aTileEntity instanceof ICoverable)) return;
+
+ if (aEvent.player.isSneaking() && aTileEntity instanceof IGregTechTileEntity gtEntity
+ && gtEntity.getMetaTileEntity() instanceof MetaPipeEntity) {
+ if (aEvent.currentItem != null && aEvent.currentItem.getItem() instanceof GT_Item_Machines
+ && GregTech_API.METATILEENTITIES[aEvent.currentItem.getItemDamage()] instanceof MetaPipeEntity) {
+ drawGrid(aEvent, false, false, false);
+ }
+ }
+
+ if (GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sWireCutterList)
+ || GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sSolderingToolList)
+ || (GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sSoftHammerList)
+ && aTileEntity instanceof MultiBlockPart) && aEvent.player.isSneaking()) {
+ if (((ICoverable) aTileEntity).getCoverIDAtSide(ForgeDirection.getOrientation(aEvent.target.sideHit)) == 0)
+ drawGrid(aEvent, false, false, aEvent.player.isSneaking());
+ return;
+ }
+
+ if ((aEvent.currentItem == null && aEvent.player.isSneaking())
+ || GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sCrowbarList)
+ || GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sScrewdriverList)) {
+ if (((ICoverable) aTileEntity).getCoverIDAtSide(ForgeDirection.getOrientation(aEvent.target.sideHit)) == 0)
+ for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) {
+ if (((ICoverable) aTileEntity).getCoverIDAtSide(tSide) > 0) {
+ drawGrid(aEvent, true, false, true);
+ return;
+ }
+ }
+ return;
+ }
+
+ if (GT_Utility.isStackInList(aEvent.currentItem, GregTech_API.sCovers.keySet())) {
+ if (((ICoverable) aTileEntity).getCoverIDAtSide(ForgeDirection.getOrientation(aEvent.target.sideHit)) == 0)
+ drawGrid(aEvent, true, false, aEvent.player.isSneaking());
+ }
+
+ if (GT_Utility.areStacksEqual(ItemList.Tool_Cover_Copy_Paste.get(1), aEvent.currentItem, true)) {
+ if (((ICoverable) aTileEntity).getCoverIDAtSide(ForgeDirection.getOrientation(aEvent.target.sideHit)) == 0)
+ drawGrid(aEvent, true, false, aEvent.player.isSneaking());
+ }
+ }
+
+ @SubscribeEvent
+ public void receiveRenderEvent(net.minecraftforge.client.event.RenderPlayerEvent.Pre aEvent) {
+ if (GT_Utility.getFullInvisibility(aEvent.entityPlayer)) {
+ aEvent.setCanceled(true);
+ }
+ }
+
+ @SubscribeEvent
+ public void onRenderStart(cpw.mods.fml.common.gameevent.TickEvent.RenderTickEvent aEvent) {
+ if (aEvent.phase == TickEvent.Phase.START) {
+ renderTickTime = aEvent.renderTickTime;
+ }
+ }
+
+ @SubscribeEvent
+ public void onClientTickEvent(cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent aEvent) {
+ if (aEvent.phase == cpw.mods.fml.common.gameevent.TickEvent.Phase.END) {
+ if (changeDetected > 0) changeDetected--;
+ final int newHideValue = shouldHeldItemHideThings();
+ if (newHideValue != hideValue) {
+ hideValue = newHideValue;
+ changeDetected = 5;
+ }
+ mAnimationTick++;
+ if (mAnimationTick % 50L == 0L) {
+ mAnimationDirection = !mAnimationDirection;
+ }
+ final int tDirection = mAnimationDirection ? 1 : -1;
+ for (Materials tMaterial : mPosR) {
+ tMaterial.mRGBa[0] = getSafeRGBValue(tMaterial.mRGBa[0], tDirection);
+ }
+
+ for (Materials tMaterial : mPosG) {
+ tMaterial.mRGBa[1] = getSafeRGBValue(tMaterial.mRGBa[1], tDirection);
+ }
+
+ for (Materials tMaterial : mPosB) {
+ tMaterial.mRGBa[2] = getSafeRGBValue(tMaterial.mRGBa[2], tDirection);
+ }
+
+ for (Materials tMaterial : mPosA) {
+ tMaterial.mRGBa[3] = getSafeRGBValue(tMaterial.mRGBa[3], tDirection);
+ }
+
+ for (Materials tMaterial : mNegR) {
+ tMaterial.mRGBa[0] = getSafeRGBValue(tMaterial.mRGBa[0], -tDirection);
+ }
+
+ for (Materials tMaterial : mNegG) {
+ tMaterial.mRGBa[1] = getSafeRGBValue(tMaterial.mRGBa[1], -tDirection);
+ }
+
+ for (Materials tMaterial : mNegB) {
+ tMaterial.mRGBa[2] = getSafeRGBValue(tMaterial.mRGBa[2], -tDirection);
+ }
+
+ for (Materials tMaterial : mNegA) {
+ tMaterial.mRGBa[3] = getSafeRGBValue(tMaterial.mRGBa[3], -tDirection);
+ }
+
+ for (Materials tMaterial : mMoltenPosR) {
+ tMaterial.mMoltenRGBa[0] = getSafeRGBValue(tMaterial.mMoltenRGBa[0], tDirection);
+ }
+
+ for (Materials tMaterial : mMoltenPosG) {
+ tMaterial.mMoltenRGBa[1] = getSafeRGBValue(tMaterial.mMoltenRGBa[1], tDirection);
+ }
+
+ for (Materials tMaterial : mMoltenPosB) {
+ tMaterial.mMoltenRGBa[2] = getSafeRGBValue(tMaterial.mMoltenRGBa[2], tDirection);
+ }
+
+ for (Materials tMaterial : mMoltenPosA) {
+ tMaterial.mMoltenRGBa[3] = getSafeRGBValue(tMaterial.mMoltenRGBa[3], tDirection);
+ }
+
+ for (Materials tMaterial : mMoltenNegR) {
+ tMaterial.mMoltenRGBa[0] = getSafeRGBValue(tMaterial.mMoltenRGBa[0], -tDirection);
+ }
+
+ for (Materials tMaterial : mMoltenNegG) {
+ tMaterial.mMoltenRGBa[1] = getSafeRGBValue(tMaterial.mMoltenRGBa[1], -tDirection);
+ }
+
+ for (Materials tMaterial : mMoltenNegB) {
+ tMaterial.mMoltenRGBa[2] = getSafeRGBValue(tMaterial.mMoltenRGBa[2], -tDirection);
+ }
+
+ for (Materials tMaterial : mMoltenNegA) {
+ tMaterial.mMoltenRGBa[3] = getSafeRGBValue(tMaterial.mMoltenRGBa[3], -tDirection);
+ }
+ }
+ }
+
+ public short getSafeRGBValue(short aRBG, int aDelta) {
+ int tmp = aRBG + aDelta;
+ if (tmp > 255) tmp = 255;
+ if (tmp < 0) tmp = 0;
+ return (short) tmp;
+ }
+
+ @Override
+ public long getAnimationTicks() {
+ return mAnimationTick;
+ }
+
+ @Override
+ public float getPartialRenderTicks() {
+ return renderTickTime;
+ }
+
+ @Override
+ public void doSonictronSound(ItemStack aStack, World aWorld, double aX, double aY, double aZ) {
+ if (GT_Utility.isStackInvalid(aStack)) return;
+ String tString = SoundResource.NOTE_HARP.toString();
+ int i = 0;
+ int j = mSoundItems.size();
+ do {
+ if (i >= j) break;
+ if (GT_Utility.areStacksEqual(mSoundItems.get(i), aStack)) {
+ tString = mSoundNames.get(i);
+ break;
+ }
+ i++;
+ } while (true);
+ if (tString.startsWith(SoundResource.RANDOM_EXPLODE.toString()))
+ if (aStack.stackSize == 3) tString = SoundResource.RANDOM_FUSE.toString();
+ else if (aStack.stackSize == 2) tString = "random.old_explode";
+ if (tString.startsWith("streaming.")) tString = switch (aStack.stackSize) {
+ case 1 -> // '\001'
+ tString + "13";
+ case 2 -> // '\002'
+ tString + "cat";
+ case 3 -> // '\003'
+ tString + "blocks";
+ case 4 -> // '\004'
+ tString + "chirp";
+ case 5 -> // '\005'
+ tString + "far";
+ case 6 -> // '\006'
+ tString + "mall";
+ case 7 -> // '\007'
+ tString + "mellohi";
+ case 8 -> // '\b'
+ tString + "stal";
+ case 9 -> // '\t'
+ tString + "strad";
+ case 10 -> // '\n'
+ tString + "ward";
+ case 11 -> // '\013'
+ tString + "11";
+ case 12 -> // '\f'
+ tString + "wait";
+ default -> tString + "wherearewenow";
+ };
+ if (tString.startsWith("streaming.")) {
+ new WorldSpawnedEventBuilder.RecordEffectEventBuilder().setIdentifier(tString.substring(10))
+ .setPosition(aX, aY, aZ)
+ .run();
+ } else {
+ new WorldSpawnedEventBuilder.SoundEventBuilder().setVolume(3f)
+ .setPitch(
+ tString.startsWith("note.") ? (float) Math.pow(2D, (double) (aStack.stackSize - 13) / 12D) : 1.0F)
+ .setIdentifier(tString)
+ .setPosition(aX, aY, aZ)
+ .run();
+ }
+ }
+
+ public static int hideValue = 0;
+
+ /**
+ * <p>
+ * Client tick counter that is set to 5 on hiding pipes and covers.
+ * </p>
+ * <p>
+ * It triggers a texture update next client tick when reaching 4, with provision for 3 more update tasks, spreading
+ * client change detection related work and network traffic on different ticks, until it reaches 0.
+ * </p>
+ */
+ public static int changeDetected = 0;
+
+ private static int shouldHeldItemHideThings() {
+ try {
+ final EntityPlayer player = Minecraft.getMinecraft().thePlayer;
+ if (player == null) return 0;
+ final ItemStack tCurrentItem = player.getCurrentEquippedItem();
+ if (tCurrentItem == null) return 0;
+ final int[] ids = OreDictionary.getOreIDs(tCurrentItem);
+ int hide = 0;
+ for (int i : ids) {
+ if (OreDictionary.getOreName(i)
+ .equals("craftingToolSolderingIron")) {
+ hide |= 0x1;
+ break;
+ }
+ }
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList)
+ || GT_Utility.isStackInList(tCurrentItem, GregTech_API.sScrewdriverList)
+ || GT_Utility.isStackInList(tCurrentItem, GregTech_API.sHardHammerList)
+ || GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSoftHammerList)
+ || GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList)
+ || GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList)
+ || GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCrowbarList)
+ || GregTech_API.sCovers.containsKey(new GT_ItemStack(tCurrentItem))
+ || (tCurrentItem.getItem() instanceof GT_Item_Machines
+ && GregTech_API.METATILEENTITIES[tCurrentItem.getItemDamage()] instanceof MetaPipeEntity
+ && player.isSneaking())) {
+ hide |= 0x2;
+ }
+ return hide;
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ public static void recieveChunkPollutionPacket(ChunkCoordIntPair chunk, int pollution) {
+ mPollutionRenderer.processPacket(chunk, pollution);
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_DummyWorld.java b/src/main/java/gregtech/common/GT_DummyWorld.java
new file mode 100644
index 0000000000..d394ad3703
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_DummyWorld.java
@@ -0,0 +1,138 @@
+package gregtech.common;
+
+import java.io.File;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.profiler.Profiler;
+import net.minecraft.world.World;
+import net.minecraft.world.WorldProvider;
+import net.minecraft.world.WorldSettings;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraft.world.chunk.IChunkProvider;
+import net.minecraft.world.chunk.storage.IChunkLoader;
+import net.minecraft.world.storage.IPlayerFileData;
+import net.minecraft.world.storage.ISaveHandler;
+import net.minecraft.world.storage.WorldInfo;
+
+public class GT_DummyWorld extends World {
+
+ public GT_IteratorRandom mRandom = new GT_IteratorRandom();
+ public ItemStack mLastSetBlock = null;
+
+ public GT_DummyWorld(ISaveHandler saveHandler, String name, WorldProvider worldProvider,
+ WorldSettings worldSettings, Profiler profiler) {
+ super(saveHandler, name, worldSettings, worldProvider, profiler);
+ this.rand = this.mRandom;
+ }
+
+ public GT_DummyWorld() {
+ this(new ISaveHandler() {
+
+ @Override
+ public void saveWorldInfoWithPlayer(WorldInfo worldInfo, NBTTagCompound nbtTagCompound) {}
+
+ @Override
+ public void saveWorldInfo(WorldInfo worldInfo) {}
+
+ @Override
+ public WorldInfo loadWorldInfo() {
+ return null;
+ }
+
+ @Override
+ public IPlayerFileData getSaveHandler() {
+ return null;
+ }
+
+ @Override
+ public File getMapFileFromName(String mapName) {
+ return null;
+ }
+
+ @Override
+ public IChunkLoader getChunkLoader(WorldProvider worldProvider) {
+ return null;
+ }
+
+ @Override
+ public void flush() {}
+
+ @Override
+ public void checkSessionLock() {}
+
+ @Override
+ public String getWorldDirectoryName() {
+ return null;
+ }
+
+ @Override
+ public File getWorldDirectory() {
+ return null;
+ }
+ }, "DUMMY_DIMENSION", null, new WorldSettings(new WorldInfo(new NBTTagCompound())), new Profiler());
+ }
+
+ @Override
+ protected IChunkProvider createChunkProvider() {
+ return null;
+ }
+
+ @Override
+ public Entity getEntityByID(int aEntityID) {
+ return null;
+ }
+
+ @Override
+ public boolean setBlock(int aX, int aY, int aZ, Block aBlock, int aMeta, int aFlags) {
+ this.mLastSetBlock = new ItemStack(aBlock, 1, aMeta);
+ return true;
+ }
+
+ @Override
+ public float getSunBrightnessFactor(float p_72967_1_) {
+ return 1.0F;
+ }
+
+ @Override
+ public BiomeGenBase getBiomeGenForCoords(int aX, int aZ) {
+ if ((aX >= 16) && (aZ >= 16) && (aX < 32) && (aZ < 32)) {
+ return BiomeGenBase.plains;
+ }
+ return BiomeGenBase.ocean;
+ }
+
+ @Override
+ public int getFullBlockLightValue(int aX, int aY, int aZ) {
+ return 10;
+ }
+
+ @Override
+ public Block getBlock(int aX, int aY, int aZ) {
+ if ((aX >= 16) && (aZ >= 16) && (aX < 32) && (aZ < 32)) {
+ return aY == 64 ? Blocks.grass : Blocks.air;
+ }
+ return Blocks.air;
+ }
+
+ @Override
+ public int getBlockMetadata(int aX, int aY, int aZ) {
+ return 0;
+ }
+
+ @Override
+ public boolean canBlockSeeTheSky(int aX, int aY, int aZ) {
+ if ((aX >= 16) && (aZ >= 16) && (aX < 32) && (aZ < 32)) {
+ return aY > 64;
+ }
+ return true;
+ }
+
+ @Override
+ protected int func_152379_p() {
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_IteratorRandom.java b/src/main/java/gregtech/common/GT_IteratorRandom.java
new file mode 100644
index 0000000000..addce0a456
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_IteratorRandom.java
@@ -0,0 +1,17 @@
+package gregtech.common;
+
+import java.util.Random;
+
+public class GT_IteratorRandom extends Random {
+
+ private static final long serialVersionUID = 1L;
+ public int mIterationStep = 2147483647;
+
+ @Override
+ public int nextInt(int aParameter) {
+ if ((this.mIterationStep == 0) || (this.mIterationStep > aParameter)) {
+ this.mIterationStep = aParameter;
+ }
+ return --this.mIterationStep;
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_Network.java b/src/main/java/gregtech/common/GT_Network.java
new file mode 100644
index 0000000000..3d081b3320
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_Network.java
@@ -0,0 +1,183 @@
+package gregtech.common;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+
+import java.util.EnumMap;
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.google.common.io.ByteStreams;
+
+import cpw.mods.fml.common.network.FMLEmbeddedChannel;
+import cpw.mods.fml.common.network.FMLOutboundHandler;
+import cpw.mods.fml.common.network.NetworkRegistry;
+import cpw.mods.fml.common.network.internal.FMLProxyPacket;
+import cpw.mods.fml.relauncher.Side;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.net.GT_Packet;
+import gregtech.api.net.GT_Packet_Block_Event;
+import gregtech.api.net.GT_Packet_ClientPreference;
+import gregtech.api.net.GT_Packet_GtTileEntityGuiRequest;
+import gregtech.api.net.GT_Packet_MultiTileEntity;
+import gregtech.api.net.GT_Packet_Pollution;
+import gregtech.api.net.GT_Packet_RequestCoverData;
+import gregtech.api.net.GT_Packet_SendCoverData;
+import gregtech.api.net.GT_Packet_SendOregenPattern;
+import gregtech.api.net.GT_Packet_SetConfigurationCircuit;
+import gregtech.api.net.GT_Packet_Sound;
+import gregtech.api.net.GT_Packet_TileEntity;
+import gregtech.api.net.GT_Packet_TileEntityCover;
+import gregtech.api.net.GT_Packet_TileEntityCoverGUI;
+import gregtech.api.net.GT_Packet_TileEntityCoverNew;
+import gregtech.api.net.GT_Packet_UpdateItem;
+import gregtech.api.net.GT_Packet_WirelessRedstoneCover;
+import gregtech.api.net.IGT_NetworkHandler;
+import gregtech.common.blocks.GT_Packet_Ores;
+import gregtech.common.net.MessageSetFlaskCapacity;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.ChannelHandler;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+import io.netty.handler.codec.MessageToMessageCodec;
+
+@ChannelHandler.Sharable
+@SuppressWarnings("deprecation")
+public class GT_Network extends MessageToMessageCodec<FMLProxyPacket, GT_Packet> implements IGT_NetworkHandler {
+
+ private final EnumMap<Side, FMLEmbeddedChannel> mChannel;
+ private final GT_Packet[] mSubChannels;
+
+ public GT_Network() {
+ this(
+ "GregTech",
+ new GT_Packet_TileEntity(), // 0
+ new GT_Packet_Sound(), // 1
+ new GT_Packet_Block_Event(), // 2
+ new GT_Packet_Ores(), // 3
+ new GT_Packet_Pollution(), // 4
+ new MessageSetFlaskCapacity(), // 5
+ new GT_Packet_TileEntityCover(), // 6
+ new GT_Packet_TileEntityCoverGUI(), // 7
+ // 8
+ new GT_Packet_ClientPreference(), // 9
+ new GT_Packet_WirelessRedstoneCover(), // 10
+ new GT_Packet_TileEntityCoverNew(), // 11
+ new GT_Packet_SetConfigurationCircuit(), // 12
+ new GT_Packet_UpdateItem(), // 13
+ // 14
+ new GT_Packet_GtTileEntityGuiRequest(), // 15
+ new GT_Packet_SendCoverData(), // 16
+ new GT_Packet_RequestCoverData(), // 17
+ new GT_Packet_MultiTileEntity(true), // 18
+ new GT_Packet_SendOregenPattern() // 19
+ );
+ }
+
+ public GT_Network(String channelName, GT_Packet... packetTypes) {
+ this.mChannel = NetworkRegistry.INSTANCE.newChannel(channelName, this, new HandlerShared());
+ final int lastPId = packetTypes[packetTypes.length - 1].getPacketID();
+ this.mSubChannels = new GT_Packet[lastPId + 1];
+ for (GT_Packet packetType : packetTypes) {
+ final int pId = packetType.getPacketID();
+ if (this.mSubChannels[pId] == null) this.mSubChannels[pId] = packetType;
+ else throw new IllegalArgumentException("Duplicate Packet ID! " + pId);
+ }
+ }
+
+ @Override
+ protected void encode(ChannelHandlerContext aContext, GT_Packet aPacket, List<Object> aOutput) {
+ final ByteBuf tBuf = Unpooled.buffer()
+ .writeByte(aPacket.getPacketID());
+ aPacket.encode(tBuf);
+ aOutput.add(
+ new FMLProxyPacket(
+ tBuf,
+ aContext.channel()
+ .attr(NetworkRegistry.FML_CHANNEL)
+ .get()));
+ }
+
+ @Override
+ protected void decode(ChannelHandlerContext aContext, FMLProxyPacket aPacket, List<Object> aOutput) {
+ final ByteArrayDataInput aData = ByteStreams.newDataInput(
+ aPacket.payload()
+ .array());
+ final GT_Packet tPacket = this.mSubChannels[aData.readByte()].decode(aData);
+ tPacket.setINetHandler(aPacket.handler());
+ aOutput.add(tPacket);
+ }
+
+ @Override
+ public void sendToPlayer(GT_Packet aPacket, EntityPlayerMP aPlayer) {
+ if (aPacket == null) {
+ GT_FML_LOGGER.info("packet null");
+ return;
+ }
+ if (aPlayer == null) {
+ GT_FML_LOGGER.info("player null");
+ return;
+ }
+ this.mChannel.get(Side.SERVER)
+ .attr(FMLOutboundHandler.FML_MESSAGETARGET)
+ .set(FMLOutboundHandler.OutboundTarget.PLAYER);
+ this.mChannel.get(Side.SERVER)
+ .attr(FMLOutboundHandler.FML_MESSAGETARGETARGS)
+ .set(aPlayer);
+ this.mChannel.get(Side.SERVER)
+ .writeAndFlush(aPacket);
+ }
+
+ @Override
+ public void sendToAllAround(GT_Packet aPacket, NetworkRegistry.TargetPoint aPosition) {
+ this.mChannel.get(Side.SERVER)
+ .attr(FMLOutboundHandler.FML_MESSAGETARGET)
+ .set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT);
+ this.mChannel.get(Side.SERVER)
+ .attr(FMLOutboundHandler.FML_MESSAGETARGETARGS)
+ .set(aPosition);
+ this.mChannel.get(Side.SERVER)
+ .writeAndFlush(aPacket);
+ }
+
+ @Override
+ public void sendToServer(GT_Packet aPacket) {
+ this.mChannel.get(Side.CLIENT)
+ .attr(FMLOutboundHandler.FML_MESSAGETARGET)
+ .set(FMLOutboundHandler.OutboundTarget.TOSERVER);
+ this.mChannel.get(Side.CLIENT)
+ .writeAndFlush(aPacket);
+ }
+
+ @Override
+ public void sendPacketToAllPlayersInRange(World aWorld, GT_Packet aPacket, int aX, int aZ) {
+ if (!aWorld.isRemote) {
+ for (Object tObject : aWorld.playerEntities) {
+ if (!(tObject instanceof EntityPlayerMP tPlayer)) {
+ break;
+ }
+ Chunk tChunk = aWorld.getChunkFromBlockCoords(aX, aZ);
+ if (tPlayer.getServerForPlayer()
+ .getPlayerManager()
+ .isPlayerWatchingChunk(tPlayer, tChunk.xPosition, tChunk.zPosition)) {
+ sendToPlayer(aPacket, tPlayer);
+ }
+ }
+ }
+ }
+
+ @ChannelHandler.Sharable
+ static final class HandlerShared extends SimpleChannelInboundHandler<GT_Packet> {
+
+ @Override
+ protected void channelRead0(ChannelHandlerContext ctx, GT_Packet aPacket) {
+ final EntityPlayer aPlayer = GT_Values.GT.getThePlayer();
+ aPacket.process(aPlayer == null ? null : aPlayer.worldObj);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_PlayerActivityLogger.java b/src/main/java/gregtech/common/GT_PlayerActivityLogger.java
new file mode 100644
index 0000000000..c60378ca5e
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_PlayerActivityLogger.java
@@ -0,0 +1,34 @@
+package gregtech.common;
+
+import java.util.ArrayList;
+
+import gregtech.GT_Mod;
+import gregtech.api.util.GT_Log;
+
+public class GT_PlayerActivityLogger implements Runnable {
+
+ @Override
+ public void run() {
+ try {
+ ArrayList<String> buffer = new ArrayList<>();
+ for (;;) {
+ if (GT_Log.pal == null) {
+ return;
+ }
+ String tLastOutput = "";
+ // Block on first element for efficiency
+ buffer.add(GT_Mod.gregtechproxy.mBufferedPlayerActivity.take());
+ GT_Mod.gregtechproxy.mBufferedPlayerActivity.drainTo(buffer);
+ for (String output : buffer) {
+ if (!output.equals(tLastOutput)) {
+ GT_Log.pal.println(output);
+ tLastOutput = output;
+ }
+ }
+ buffer.clear();
+ // TODO: swap from sleep to event bus
+ Thread.sleep(10000L);
+ }
+ } catch (Throwable ignored) {}
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_Pollution.java b/src/main/java/gregtech/common/GT_Pollution.java
new file mode 100644
index 0000000000..6a2b1e1082
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_Pollution.java
@@ -0,0 +1,507 @@
+package gregtech.common;
+
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+import static gregtech.common.GT_Proxy.dimensionWisePollution;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Consumer;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Blocks;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.ChunkPosition;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.world.ChunkDataEvent;
+import net.minecraftforge.event.world.ChunkWatchEvent;
+import net.minecraftforge.event.world.WorldEvent;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.TickEvent;
+import cpw.mods.fml.common.network.NetworkRegistry;
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.ICleanroom;
+import gregtech.api.interfaces.ICleanroomReceiver;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.net.GT_Packet_Pollution;
+import gregtech.api.util.GT_ChunkAssociatedData;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.render.GT_PollutionRenderer;
+
+public class GT_Pollution {
+
+ private static final Storage STORAGE = new Storage();
+ /**
+ * Pollution dispersion until effects start: Calculation: ((Limit * 0.01) + 2000) * (4 <- spreading rate)
+ * <p>
+ * SMOG(500k) 466.7 pollution/sec Poison(750k) 633,3 pollution/sec Dying Plants(1mio) 800 pollution/sec Sour
+ * Rain(1.5mio) 1133.3 pollution/sec
+ * <p>
+ * Pollution producers (pollution/sec) Bronze Boiler(20) Lava Boiler(20) High Pressure Boiler(20) Bronze Blast
+ * Furnace(50) Diesel Generator(40/80/160) Gas Turbine(20/40/80) Charcoal Pile(100)
+ * <p>
+ * Large Diesel Engine(320) Electric Blast Furnace(100) Implosion Compressor(2000) Large Boiler(240) Large Gas
+ * Turbine(160) Multi Smelter(100) Pyrolyse Oven(400)
+ * <p>
+ * Machine Explosion(100,000)
+ * <p>
+ * Other Random Shit: lots and lots
+ * <p>
+ * Muffler Hatch Pollution reduction: ** inaccurate ** LV (0%), MV (30%), HV (52%), EV (66%), IV (76%), LuV (84%),
+ * ZPM (89%), UV (92%), MAX (95%)
+ */
+ private List<ChunkCoordIntPair> pollutionList = new ArrayList<>(); // chunks left to process in this cycle
+
+ private final Set<ChunkCoordIntPair> pollutedChunks = new HashSet<>(); // a global list of all chunks with positive
+ // pollution
+ private int operationsPerTick = 0; // how much chunks should be processed in each cycle
+ private static final short cycleLen = 1200;
+ private final World world;
+ private boolean blank = true;
+ public static int mPlayerPollution;
+
+ private static final int POLLUTIONPACKET_MINVALUE = 1000;
+
+ private static GT_PollutionEventHandler EVENT_HANDLER;
+
+ public GT_Pollution(World world) {
+ this.world = world;
+
+ if (EVENT_HANDLER == null) {
+ EVENT_HANDLER = new GT_PollutionEventHandler();
+ MinecraftForge.EVENT_BUS.register(EVENT_HANDLER);
+ }
+ }
+
+ public static void onWorldTick(TickEvent.WorldTickEvent aEvent) { // called from proxy
+ // return if pollution disabled
+ if (!GT_Mod.gregtechproxy.mPollution) return;
+ if (aEvent.phase == TickEvent.Phase.START) return;
+ final GT_Pollution pollutionInstance = dimensionWisePollution.get(aEvent.world.provider.dimensionId);
+ if (pollutionInstance == null) return;
+ pollutionInstance.tickPollutionInWorld((int) (aEvent.world.getTotalWorldTime() % cycleLen));
+ }
+
+ private void tickPollutionInWorld(int aTickID) { // called from method above
+ // gen data set
+ if (aTickID == 0 || blank) {
+ // make a snapshot of what to work on
+ pollutionList = new ArrayList<>(pollutedChunks);
+ // set operations per tick
+ if (pollutionList.size() > 0) operationsPerTick = Math.max(1, pollutionList.size() / cycleLen);
+ else operationsPerTick = 0; // SANity
+ blank = false;
+ }
+
+ for (int chunksProcessed = 0; chunksProcessed < operationsPerTick; chunksProcessed++) {
+ if (pollutionList.size() == 0) break; // no more stuff to do
+ ChunkCoordIntPair actualPos = pollutionList.remove(pollutionList.size() - 1); // faster
+ // get pollution
+ ChunkData currentData = STORAGE.get(world, actualPos);
+ int tPollution = currentData.getAmount();
+ // remove some
+ tPollution = (int) (0.9945f * tPollution);
+
+ if (tPollution > 400000) { // Spread Pollution
+
+ ChunkCoordIntPair[] tNeighbors = new ChunkCoordIntPair[4]; // array is faster
+ tNeighbors[0] = (new ChunkCoordIntPair(actualPos.chunkXPos + 1, actualPos.chunkZPos));
+ tNeighbors[1] = (new ChunkCoordIntPair(actualPos.chunkXPos - 1, actualPos.chunkZPos));
+ tNeighbors[2] = (new ChunkCoordIntPair(actualPos.chunkXPos, actualPos.chunkZPos + 1));
+ tNeighbors[3] = (new ChunkCoordIntPair(actualPos.chunkXPos, actualPos.chunkZPos - 1));
+ for (ChunkCoordIntPair neighborPosition : tNeighbors) {
+ ChunkData neighbor = STORAGE.get(world, neighborPosition);
+ int neighborPollution = neighbor.getAmount();
+ if (neighborPollution * 6 < tPollution * 5) { // MATHEMATICS...
+ int tDiff = tPollution - neighborPollution;
+ tDiff = tDiff / 20;
+ neighborPollution = GT_Utility.safeInt((long) neighborPollution + tDiff); // tNPol += tDiff;
+ tPollution -= tDiff;
+ setChunkPollution(neighborPosition, neighborPollution);
+ }
+ }
+
+ // Create Pollution effects
+ // Smog filter TODO
+ if (tPollution > GT_Mod.gregtechproxy.mPollutionSmogLimit) {
+ AxisAlignedBB chunk = AxisAlignedBB.getBoundingBox(
+ actualPos.chunkXPos << 4,
+ 0,
+ actualPos.chunkZPos << 4,
+ (actualPos.chunkXPos << 4) + 16,
+ 256,
+ (actualPos.chunkZPos << 4) + 16);
+ List<EntityLivingBase> tEntitys = world.getEntitiesWithinAABB(EntityLivingBase.class, chunk);
+ for (EntityLivingBase tEnt : tEntitys) {
+ if (tEnt instanceof EntityPlayerMP && ((EntityPlayerMP) tEnt).capabilities.isCreativeMode)
+ continue;
+ if (!(GT_Utility.isWearingFullGasHazmat(tEnt))) {
+ switch (XSTR_INSTANCE.nextInt(3)) {
+ default:
+ tEnt.addPotionEffect(
+ new PotionEffect(
+ Potion.digSlowdown.id,
+ Math.min(tPollution / 1000, 1000),
+ tPollution / 400000));
+ case 1:
+ tEnt.addPotionEffect(
+ new PotionEffect(
+ Potion.weakness.id,
+ Math.min(tPollution / 1000, 1000),
+ tPollution / 400000));
+ case 2:
+ tEnt.addPotionEffect(
+ new PotionEffect(
+ Potion.moveSlowdown.id,
+ Math.min(tPollution / 1000, 1000),
+ tPollution / 400000));
+ }
+ }
+ }
+
+ // Poison effects
+ if (tPollution > GT_Mod.gregtechproxy.mPollutionPoisonLimit) {
+ for (EntityLivingBase tEnt : tEntitys) {
+ if (tEnt instanceof EntityPlayerMP && ((EntityPlayerMP) tEnt).capabilities.isCreativeMode)
+ continue;
+ if (!GT_Utility.isWearingFullGasHazmat(tEnt)) {
+ switch (XSTR_INSTANCE.nextInt(4)) {
+ default:
+ tEnt.addPotionEffect(new PotionEffect(Potion.hunger.id, tPollution / 500000));
+ case 1:
+ tEnt.addPotionEffect(
+ new PotionEffect(
+ Potion.confusion.id,
+ Math.min(tPollution / 2000, 1000),
+ 1));
+ case 2:
+ tEnt.addPotionEffect(
+ new PotionEffect(
+ Potion.poison.id,
+ Math.min(tPollution / 4000, 1000),
+ tPollution / 500000));
+ case 3:
+ tEnt.addPotionEffect(
+ new PotionEffect(
+ Potion.blindness.id,
+ Math.min(tPollution / 2000, 1000),
+ 1));
+ }
+ }
+ }
+
+ // killing plants
+ if (tPollution > GT_Mod.gregtechproxy.mPollutionVegetationLimit) {
+ int f = 20;
+ for (; f < (tPollution / 25000); f++) {
+ int x = (actualPos.chunkXPos << 4) + XSTR_INSTANCE.nextInt(16);
+ int y = 60 + (-f + XSTR_INSTANCE.nextInt(f * 2 + 1));
+ int z = (actualPos.chunkZPos << 4) + XSTR_INSTANCE.nextInt(16);
+ damageBlock(world, x, y, z, tPollution > GT_Mod.gregtechproxy.mPollutionSourRainLimit);
+ }
+ }
+ }
+ }
+ }
+ // Write new pollution to Hashmap !!!
+ setChunkPollution(actualPos, tPollution);
+
+ // Send new value to players nearby
+ if (tPollution > POLLUTIONPACKET_MINVALUE) {
+ NetworkRegistry.TargetPoint point = new NetworkRegistry.TargetPoint(
+ world.provider.dimensionId,
+ (actualPos.chunkXPos << 4),
+ 64,
+ (actualPos.chunkZPos << 4),
+ 256);
+ GT_Values.NW.sendToAllAround(new GT_Packet_Pollution(actualPos, tPollution), point);
+ }
+ }
+ }
+
+ private void setChunkPollution(ChunkCoordIntPair coord, int pollution) {
+ mutatePollution(world, coord.chunkXPos, coord.chunkZPos, c -> c.setAmount(pollution), pollutedChunks);
+ }
+
+ private static void damageBlock(World world, int x, int y, int z, boolean sourRain) {
+ if (world.isRemote) return;
+ Block tBlock = world.getBlock(x, y, z);
+ int tMeta = world.getBlockMetadata(x, y, z);
+ if (tBlock == Blocks.air || tBlock == Blocks.stone || tBlock == Blocks.sand || tBlock == Blocks.deadbush)
+ return;
+
+ if (tBlock == Blocks.leaves || tBlock == Blocks.leaves2 || tBlock.getMaterial() == Material.leaves)
+ world.setBlockToAir(x, y, z);
+ if (tBlock == Blocks.reeds) {
+ tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0);
+ world.setBlockToAir(x, y, z);
+ }
+ if (tBlock == Blocks.tallgrass) world.setBlock(x, y, z, Blocks.deadbush);
+ if (tBlock == Blocks.vine) {
+ tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0);
+ world.setBlockToAir(x, y, z);
+ }
+ if (tBlock == Blocks.waterlily || tBlock == Blocks.wheat
+ || tBlock == Blocks.cactus
+ || tBlock.getMaterial() == Material.cactus
+ || tBlock == Blocks.melon_block
+ || tBlock == Blocks.melon_stem) {
+ tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0);
+ world.setBlockToAir(x, y, z);
+ }
+ if (tBlock == Blocks.red_flower || tBlock == Blocks.yellow_flower
+ || tBlock == Blocks.carrots
+ || tBlock == Blocks.potatoes
+ || tBlock == Blocks.pumpkin
+ || tBlock == Blocks.pumpkin_stem) {
+ tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0);
+ world.setBlockToAir(x, y, z);
+ }
+ if (tBlock == Blocks.sapling || tBlock.getMaterial() == Material.plants)
+ world.setBlock(x, y, z, Blocks.deadbush);
+ if (tBlock == Blocks.cocoa) {
+ tBlock.dropBlockAsItem(world, x, y, z, tMeta, 0);
+ world.setBlockToAir(x, y, z);
+ }
+ if (tBlock == Blocks.mossy_cobblestone) world.setBlock(x, y, z, Blocks.cobblestone);
+ if (tBlock == Blocks.grass || tBlock.getMaterial() == Material.grass) world.setBlock(x, y, z, Blocks.dirt);
+ if (tBlock == Blocks.farmland || tBlock == Blocks.dirt) {
+ world.setBlock(x, y, z, Blocks.sand);
+ }
+
+ if (sourRain && world.isRaining()
+ && (tBlock == Blocks.gravel || tBlock == Blocks.cobblestone)
+ && world.getBlock(x, y + 1, z) == Blocks.air
+ && world.canBlockSeeTheSky(x, y, z)) {
+ if (tBlock == Blocks.cobblestone) {
+ world.setBlock(x, y, z, Blocks.gravel);
+ } else {
+ world.setBlock(x, y, z, Blocks.sand);
+ }
+ }
+ }
+
+ private static GT_Pollution getPollutionManager(World world) {
+ return dimensionWisePollution.computeIfAbsent(world.provider.dimensionId, i -> new GT_Pollution(world));
+ }
+
+ /** @see #addPollution(TileEntity, int) */
+ public static void addPollution(IGregTechTileEntity te, int aPollution) {
+ addPollution((TileEntity) te, aPollution);
+ }
+
+ /**
+ * Also pollutes cleanroom if {@code te} is an instance of {@link ICleanroomReceiver}.
+ *
+ * @see #addPollution(World, int, int, int)
+ */
+ public static void addPollution(TileEntity te, int aPollution) {
+ if (!GT_Mod.gregtechproxy.mPollution || aPollution == 0 || te.getWorldObj().isRemote) return;
+
+ if (aPollution > 0 && te instanceof ICleanroomReceiver receiver) {
+ ICleanroom cleanroom = receiver.getCleanroom();
+ if (cleanroom != null && cleanroom.isValidCleanroom()) {
+ cleanroom.pollute();
+ }
+ }
+
+ addPollution(te.getWorldObj(), te.xCoord >> 4, te.zCoord >> 4, aPollution);
+ }
+
+ /** @see #addPollution(World, int, int, int) */
+ public static void addPollution(Chunk ch, int aPollution) {
+ addPollution(ch.worldObj, ch.xPosition, ch.zPosition, aPollution);
+ }
+
+ /**
+ * Add some pollution to given chunk. Can pass in negative to remove pollution. Will clamp the final pollution
+ * number to 0 if it would be changed into negative.
+ *
+ * @param w world to modify. do nothing if it's a client world
+ * @param chunkX chunk coordinate X, i.e. blockX >> 4
+ * @param chunkZ chunk coordinate Z, i.e. blockZ >> 4
+ * @param aPollution desired delta. Positive means the pollution in chunk would go higher.
+ */
+ public static void addPollution(World w, int chunkX, int chunkZ, int aPollution) {
+ if (!GT_Mod.gregtechproxy.mPollution || aPollution == 0 || w.isRemote) return;
+ mutatePollution(w, chunkX, chunkZ, d -> d.changeAmount(aPollution), null);
+ }
+
+ private static void mutatePollution(World world, int x, int z, Consumer<ChunkData> mutator,
+ @Nullable Set<ChunkCoordIntPair> chunks) {
+ ChunkData data = STORAGE.get(world, x, z);
+ boolean hadPollution = data.getAmount() > 0;
+ mutator.accept(data);
+ boolean hasPollution = data.getAmount() > 0;
+ if (hasPollution != hadPollution) {
+ if (chunks == null) chunks = getPollutionManager(world).pollutedChunks;
+ if (hasPollution) chunks.add(new ChunkCoordIntPair(x, z));
+ else chunks.remove(new ChunkCoordIntPair(x, z));
+ }
+ }
+
+ /** @see #getPollution(World, int, int) */
+ public static int getPollution(IGregTechTileEntity te) {
+ return getPollution(te.getWorld(), te.getXCoord() >> 4, te.getZCoord() >> 4);
+ }
+
+ /** @see #getPollution(World, int, int) */
+ public static int getPollution(Chunk ch) {
+ return getPollution(ch.worldObj, ch.xPosition, ch.zPosition);
+ }
+
+ /**
+ * Get the pollution in specified chunk
+ *
+ * @param w world to look in. can be a client world, but that limits the knowledge to what server side send us
+ * @param chunkX chunk coordinate X, i.e. blockX >> 4
+ * @param chunkZ chunk coordinate Z, i.e. blockZ >> 4
+ * @return pollution amount. may be 0 if pollution is disabled, or if it's a client world and server did not send us
+ * info about this chunk
+ */
+ public static int getPollution(World w, int chunkX, int chunkZ) {
+ if (!GT_Mod.gregtechproxy.mPollution) return 0;
+ if (w.isRemote)
+ // it really should be querying the client side stuff instead
+ return GT_PollutionRenderer.getKnownPollution(chunkX << 4, chunkZ << 4);
+ return STORAGE.get(w, chunkX, chunkZ)
+ .getAmount();
+ }
+
+ @Deprecated
+ public static int getPollution(ChunkCoordIntPair aCh, int aDim) {
+ return getPollution(DimensionManager.getWorld(aDim), aCh.chunkXPos, aCh.chunkZPos);
+ }
+
+ public static boolean hasPollution(Chunk ch) {
+ if (!GT_Mod.gregtechproxy.mPollution) return false;
+ return STORAGE.isCreated(ch.worldObj, ch.getChunkCoordIntPair()) && STORAGE.get(ch)
+ .getAmount() > 0;
+ }
+
+ // Add compatibility with old code
+ @Deprecated /* Don't use it... too weird way of passing position */
+ public static void addPollution(World aWorld, ChunkPosition aPos, int aPollution) {
+ // The abuse of ChunkPosition to store block position and dim...
+ // is just bad especially when that is both used to store ChunkPos and BlockPos depending on context
+ addPollution(aWorld.getChunkFromBlockCoords(aPos.chunkPosX, aPos.chunkPosZ), aPollution);
+ }
+
+ static void migrate(ChunkDataEvent.Load e) {
+ addPollution(
+ e.getChunk(),
+ e.getData()
+ .getInteger("GTPOLLUTION"));
+ }
+
+ public static class GT_PollutionEventHandler {
+
+ @SubscribeEvent
+ public void chunkWatch(ChunkWatchEvent.Watch event) {
+ if (!GT_Mod.gregtechproxy.mPollution) return;
+ World world = event.player.worldObj;
+ if (STORAGE.isCreated(world, event.chunk)) {
+ int pollution = STORAGE.get(world, event.chunk)
+ .getAmount();
+ if (pollution > POLLUTIONPACKET_MINVALUE)
+ GT_Values.NW.sendToPlayer(new GT_Packet_Pollution(event.chunk, pollution), event.player);
+ }
+ }
+
+ @SubscribeEvent
+ public void onWorldLoad(WorldEvent.Load e) {
+ // super class loads everything lazily. We force it to load them all.
+ if (!e.world.isRemote) STORAGE.loadAll(e.world);
+ }
+ }
+
+ @ParametersAreNonnullByDefault
+ private static final class Storage extends GT_ChunkAssociatedData<ChunkData> {
+
+ private Storage() {
+ super("Pollution", ChunkData.class, 64, (byte) 0, false);
+ }
+
+ @Override
+ protected void writeElement(DataOutput output, ChunkData element, World world, int chunkX, int chunkZ)
+ throws IOException {
+ output.writeInt(element.getAmount());
+ }
+
+ @Override
+ protected ChunkData readElement(DataInput input, int version, World world, int chunkX, int chunkZ)
+ throws IOException {
+ if (version != 0) throw new IOException("Region file corrupted");
+ ChunkData data = new ChunkData(input.readInt());
+ if (data.getAmount() > 0)
+ getPollutionManager(world).pollutedChunks.add(new ChunkCoordIntPair(chunkX, chunkZ));
+ return data;
+ }
+
+ @Override
+ protected ChunkData createElement(World world, int chunkX, int chunkZ) {
+ return new ChunkData();
+ }
+
+ @Override
+ public void loadAll(World w) {
+ super.loadAll(w);
+ }
+
+ public boolean isCreated(World world, ChunkCoordIntPair coord) {
+ return isCreated(world.provider.dimensionId, coord.chunkXPos, coord.chunkZPos);
+ }
+ }
+
+ private static final class ChunkData implements GT_ChunkAssociatedData.IData {
+
+ public int amount;
+
+ private ChunkData() {
+ this(0);
+ }
+
+ private ChunkData(int amount) {
+ this.amount = Math.max(0, amount);
+ }
+
+ /**
+ * Current pollution amount.
+ */
+ public int getAmount() {
+ return amount;
+ }
+
+ public void setAmount(int amount) {
+ this.amount = Math.max(amount, 0);
+ }
+
+ public void changeAmount(int delta) {
+ this.amount = Math.max(GT_Utility.safeInt(amount + (long) delta, 0), 0);
+ }
+
+ @Override
+ public boolean isSameAsDefault() {
+ return amount == 0;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java
new file mode 100644
index 0000000000..c80414843b
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_Proxy.java
@@ -0,0 +1,3163 @@
+package gregtech.common;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.enums.FluidState.GAS;
+import static gregtech.api.enums.FluidState.LIQUID;
+import static gregtech.api.enums.FluidState.MOLTEN;
+import static gregtech.api.enums.FluidState.PLASMA;
+import static gregtech.api.enums.GT_Values.W;
+import static gregtech.api.enums.GT_Values.debugEntityCramming;
+import static gregtech.api.enums.Mods.AdvancedSolarPanel;
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.Avaritia;
+import static gregtech.api.enums.Mods.BetterLoadingScreen;
+import static gregtech.api.enums.Mods.DraconicEvolution;
+import static gregtech.api.enums.Mods.ElectroMagicTools;
+import static gregtech.api.enums.Mods.EnderIO;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GalacticraftCore;
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.GanysSurface;
+import static gregtech.api.enums.Mods.GraviSuite;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.IguanaTweaksTinkerConstruct;
+import static gregtech.api.enums.Mods.MagicalCrops;
+import static gregtech.api.enums.Mods.Names;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.enums.Mods.TaintedMagic;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.enums.Mods.ThaumicBoots;
+import static gregtech.api.enums.Mods.ThaumicTinkerer;
+import static gregtech.api.enums.Mods.TwilightForest;
+import static gregtech.api.enums.Mods.WitchingGadgets;
+import static gregtech.api.recipe.RecipeMaps.crackingRecipes;
+import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
+import static gregtech.api.recipe.RecipeMaps.wiremillRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+import static gregtech.api.util.GT_Util.LAST_BROKEN_TILEENTITY;
+import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
+
+import java.io.File;
+import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.stream.Collectors;
+
+import net.minecraft.block.Block;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.monster.EntityEnderman;
+import net.minecraft.entity.monster.EntitySkeleton;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemBow;
+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.potion.Potion;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.World;
+import net.minecraft.world.WorldSettings.GameType;
+import net.minecraft.world.gen.feature.WorldGenMinable;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.event.ForgeEventFactory;
+import net.minecraftforge.event.entity.EntityJoinWorldEvent;
+import net.minecraftforge.event.entity.living.EnderTeleportEvent;
+import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
+import net.minecraftforge.event.entity.player.ArrowLooseEvent;
+import net.minecraftforge.event.entity.player.ArrowNockEvent;
+import net.minecraftforge.event.entity.player.ItemTooltipEvent;
+import net.minecraftforge.event.entity.player.PlayerEvent;
+import net.minecraftforge.event.entity.player.PlayerInteractEvent;
+import net.minecraftforge.event.terraingen.OreGenEvent;
+import net.minecraftforge.event.world.BlockEvent;
+import net.minecraftforge.event.world.ChunkDataEvent;
+import net.minecraftforge.event.world.WorldEvent;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+import net.minecraftforge.oredict.RecipeSorter;
+import net.minecraftforge.oredict.ShapedOreRecipe;
+import net.minecraftforge.oredict.ShapelessOreRecipe;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.common.IFuelHandler;
+import cpw.mods.fml.common.Loader;
+import cpw.mods.fml.common.ModContainer;
+import cpw.mods.fml.common.ProgressManager;
+import cpw.mods.fml.common.eventhandler.Event.Result;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.TickEvent;
+import cpw.mods.fml.common.network.FMLNetworkEvent;
+import cpw.mods.fml.common.network.IGuiHandler;
+import cpw.mods.fml.common.network.NetworkRegistry;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.FluidState;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OreDictNames;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TC_Aspects.TC_AspectStack;
+import gregtech.api.enums.TierEU;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.fluid.GT_FluidFactory;
+import gregtech.api.interfaces.IBlockOnWalkOver;
+import gregtech.api.interfaces.IProjectileItem;
+import gregtech.api.interfaces.IToolStats;
+import gregtech.api.interfaces.internal.IGT_Mod;
+import gregtech.api.interfaces.internal.IThaumcraftCompat;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.objects.GT_ChunkManager;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.GT_UO_DimensionList;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.RecipeCategory;
+import gregtech.api.recipe.RecipeCategorySetting;
+import gregtech.api.util.GT_BlockMap;
+import gregtech.api.util.GT_CLS_Compat;
+import gregtech.api.util.GT_ChunkAssociatedData;
+import gregtech.api.util.GT_ClientPreference;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeRegistrator;
+import gregtech.api.util.GT_Shaped_Recipe;
+import gregtech.api.util.GT_Shapeless_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder;
+import gregtech.common.entities.GT_Entity_Arrow;
+import gregtech.common.items.GT_MetaGenerated_Item_98;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gregtech.common.misc.GlobalEnergyWorldSavedData;
+import gregtech.common.misc.GlobalMetricsCoverDatabase;
+import gregtech.common.misc.spaceprojects.SpaceProjectWorldSavedData;
+import gregtech.common.tileentities.machines.multi.drone.GT_MetaTileEntity_DroneCentre;
+
+public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
+
+ private static final EnumSet<OreGenEvent.GenerateMinable.EventType> PREVENTED_ORES = EnumSet.of(
+ OreGenEvent.GenerateMinable.EventType.COAL,
+ OreGenEvent.GenerateMinable.EventType.IRON,
+ OreGenEvent.GenerateMinable.EventType.GOLD,
+ OreGenEvent.GenerateMinable.EventType.DIAMOND,
+ OreGenEvent.GenerateMinable.EventType.REDSTONE,
+ OreGenEvent.GenerateMinable.EventType.LAPIS,
+ OreGenEvent.GenerateMinable.EventType.QUARTZ);
+ public final HashSet<ItemStack> mRegisteredOres = new HashSet<>(10000);
+ public final ArrayList<String> mSoundNames = new ArrayList<>();
+ public final ArrayList<ItemStack> mSoundItems = new ArrayList<>();
+ public final ArrayList<Integer> mSoundCounts = new ArrayList<>();
+ private final Collection<OreDictEventContainer> mEvents = new HashSet<>();
+ private final Collection<String> mIgnoredItems = new HashSet<>(
+ Arrays.asList(
+ "itemGhastTear",
+ "itemFlint",
+ "itemClay",
+ "itemBucketSaltWater",
+ "itemBucketFreshWater",
+ "itemBucketWater",
+ "itemRock",
+ "itemReed",
+ "itemArrow",
+ "itemSaw",
+ "itemKnife",
+ "itemHammer",
+ "itemChisel",
+ "itemRubber",
+ "itemEssence",
+ "itemIlluminatedPanel",
+ "itemSkull",
+ "itemRawRubber",
+ "itemBacon",
+ "itemJetpackAccelerator",
+ "itemLazurite",
+ "itemIridium",
+ "itemTear",
+ "itemClaw",
+ "itemFertilizer",
+ "itemTar",
+ "itemSlimeball",
+ "itemCoke",
+ "itemBeeswax",
+ "itemBeeQueen",
+ "itemForcicium",
+ "itemForcillium",
+ "itemRoyalJelly",
+ "itemHoneydew",
+ "itemHoney",
+ "itemPollen",
+ "itemReedTypha",
+ "itemSulfuricAcid",
+ "itemPotash",
+ "itemCompressedCarbon",
+ "itemBitumen",
+ "itemBioFuel",
+ "itemCokeSugar",
+ "itemCokeCactus",
+ "itemCharcoalSugar",
+ "itemCharcoalCactus",
+ "itemSludge",
+ "itemEnrichedAlloy",
+ "itemQuicksilver",
+ "itemMercury",
+ "itemOsmium",
+ "itemUltimateCircuit",
+ "itemEnergizedStar",
+ "itemAntimatterMolecule",
+ "itemAntimatterGlob",
+ "itemCoal",
+ "itemBoat",
+ "itemHerbalMedicineCake",
+ "itemCakeSponge",
+ "itemFishandPumpkinCakeSponge",
+ "itemSoulCleaver",
+ "itemInstantCake",
+ "itemWhippingCream",
+ "itemGlisteningWhippingCream",
+ "itemCleaver",
+ "itemHerbalMedicineWhippingCream",
+ "itemStrangeWhippingCream",
+ "itemBlazeCleaver",
+ "itemBakedCakeSponge",
+ "itemMagmaCake",
+ "itemGlisteningCake",
+ "itemOgreCleaver",
+ "itemFishandPumpkinCake",
+ "itemMagmaWhippingCream",
+ "itemMultimeter",
+ "itemSuperconductor"));
+ private final Collection<String> mIgnoredNames = new HashSet<>(
+ Arrays.asList(
+ "grubBee",
+ "chainLink",
+ "candyCane",
+ "bRedString",
+ "bVial",
+ "bFlask",
+ "anorthositeSmooth",
+ "migmatiteSmooth",
+ "slateSmooth",
+ "travertineSmooth",
+ "limestoneSmooth",
+ "orthogneissSmooth",
+ "marbleSmooth",
+ "honeyDrop",
+ "lumpClay",
+ "honeyEqualssugar",
+ "flourEqualswheat",
+ "bluestoneInsulated",
+ "blockWaterstone",
+ "blockSand",
+ "blockTorch",
+ "blockPumpkin",
+ "blockClothRock",
+ "blockStainedHardenedClay",
+ "blockQuartzPillar",
+ "blockQuartzChiselled",
+ "blockSpawner",
+ "blockCloth",
+ "mobHead",
+ "mobEgg",
+ "enderFlower",
+ "enderChest",
+ "clayHardened",
+ "dayGemMaterial",
+ "nightGemMaterial",
+ "snowLayer",
+ "bPlaceholder",
+ "hardenedClay",
+ "eternalLifeEssence",
+ "sandstone",
+ "wheatRice",
+ "transdimBlock",
+ "bambooBasket",
+ "lexicaBotania",
+ "livingwoodTwig",
+ "redstoneCrystal",
+ "pestleAndMortar",
+ "glowstone",
+ "whiteStone",
+ "stoneSlab",
+ "transdimBlock",
+ "clayBowl",
+ "clayPlate",
+ "ceramicBowl",
+ "ceramicPlate",
+ "ovenRack",
+ "clayCup",
+ "ceramicCup",
+ "batteryBox",
+ "transmutationStone",
+ "torchRedstoneActive",
+ "coal",
+ "charcoal",
+ "cloth",
+ "cobblestoneSlab",
+ "stoneBrickSlab",
+ "cobblestoneWall",
+ "stoneBrickWall",
+ "cobblestoneStair",
+ "stoneBrickStair",
+ "blockCloud",
+ "blockDirt",
+ "blockTyrian",
+ "blockCarpet",
+ "blockFft",
+ "blockLavastone",
+ "blockHolystone",
+ "blockConcrete",
+ "sunnariumPart",
+ "brSmallMachineCyaniteProcessor",
+ "meteoriteCoal",
+ "blockCobble",
+ "pressOreProcessor",
+ "crusherOreProcessor",
+ "grinderOreProcessor",
+ "blockRubber",
+ "blockHoney",
+ "blockHoneydew",
+ "blockPeat",
+ "blockRadioactive",
+ "blockSlime",
+ "blockCocoa",
+ "blockSugarCane",
+ "blockLeather",
+ "blockClayBrick",
+ "solarPanelHV",
+ "cableRedNet",
+ "stoneBowl",
+ "crafterWood",
+ "taintedSoil",
+ "brickXyEngineering",
+ "breederUranium",
+ "wireMill",
+ "chunkLazurite",
+ "aluminumNatural",
+ "aluminiumNatural",
+ "naturalAluminum",
+ "naturalAluminium",
+ "antimatterMilligram",
+ "antimatterGram",
+ "strangeMatter",
+ "coalGenerator",
+ "electricFurnace",
+ "unfinishedTank",
+ "valvePart",
+ "aquaRegia",
+ "leatherSeal",
+ "leatherSlimeSeal",
+ "hambone",
+ "slimeball",
+ "clay",
+ "enrichedUranium",
+ "camoPaste",
+ "antiBlock",
+ "burntQuartz",
+ "salmonRaw",
+ "blockHopper",
+ "blockEnderObsidian",
+ "blockIcestone",
+ "blockMagicWood",
+ "blockEnderCore",
+ "blockHeeEndium",
+ "oreHeeEndPowder",
+ "oreHeeStardust",
+ "oreHeeIgneousRock",
+ "oreHeeInstabilityOrb",
+ "crystalPureFluix",
+ "shardNether",
+ "gemFluorite",
+ "stickObsidian",
+ "caveCrystal",
+ "shardCrystal",
+ "dyeCrystal",
+ "shardFire",
+ "shardWater",
+ "shardAir",
+ "shardEarth",
+ "ingotRefinedIron",
+ "blockMarble",
+ "ingotUnstable",
+ "obsidian",
+ "dirt",
+ "gravel",
+ "grass",
+ "soulsand",
+ "paper",
+ "brick",
+ "chest"));
+ private final Collection<String> mInvalidNames = new HashSet<>(
+ Arrays.asList(
+ "diamondShard",
+ "redstoneRoot",
+ "obsidianStick",
+ "bloodstoneOre",
+ "universalCable",
+ "bronzeTube",
+ "ironTube",
+ "netherTube",
+ "obbyTube",
+ "infiniteBattery",
+ "eliteBattery",
+ "advancedBattery",
+ "10kEUStore",
+ "blueDye",
+ "MonazitOre",
+ "quartzCrystal",
+ "whiteLuminiteCrystal",
+ "darkStoneIngot",
+ "invisiumIngot",
+ "demoniteOrb",
+ "enderGem",
+ "starconiumGem",
+ "osmoniumIngot",
+ "tapaziteGem",
+ "zectiumIngot",
+ "foolsRubyGem",
+ "rubyGem",
+ "meteoriteGem",
+ "adamiteShard",
+ "sapphireGem",
+ "copperIngot",
+ "ironStick",
+ "goldStick",
+ "diamondStick",
+ "reinforcedStick",
+ "draconicStick",
+ "emeraldStick",
+ "copperStick",
+ "tinStick",
+ "silverStick",
+ "bronzeStick",
+ "steelStick",
+ "leadStick",
+ "manyullynStick",
+ "arditeStick",
+ "cobaltStick",
+ "aluminiumStick",
+ "alumiteStick",
+ "oilsandsOre",
+ "copperWire",
+ "superconductorWire",
+ "sulfuricAcid",
+ "conveyorBelt",
+ "ironWire",
+ "aluminumWire",
+ "aluminiumWire",
+ "silverWire",
+ "tinWire",
+ "dustSiliconSmall",
+ "AluminumOre",
+ "plateHeavyT2",
+ "blockWool",
+ "alloyPlateEnergizedHardened",
+ "gasWood",
+ "alloyPlateEnergized",
+ "SilverOre",
+ "LeadOre",
+ "TinOre",
+ "CopperOre",
+ "silverOre",
+ "leadOre",
+ "tinOre",
+ "copperOre",
+ "bauxiteOre",
+ "HSLivingmetalIngot",
+ "oilMoving",
+ "oilStill",
+ "oilBucket",
+ "petroleumOre",
+ "dieselFuel",
+ "diamondNugget",
+ "planks",
+ "wood",
+ "stick",
+ "sticks",
+ "naquadah",
+ "obsidianRod",
+ "stoneRod",
+ "thaumiumRod",
+ "steelRod",
+ "netherrackRod",
+ "woodRod",
+ "ironRod",
+ "cactusRod",
+ "flintRod",
+ "copperRod",
+ "cobaltRod",
+ "alumiteRod",
+ "blueslimeRod",
+ "arditeRod",
+ "manyullynRod",
+ "bronzeRod",
+ "boneRod",
+ "slimeRod",
+ "redalloyBundled",
+ "bluestoneBundled",
+ "infusedteslatiteInsulated",
+ "redalloyInsulated",
+ "infusedteslatiteBundled"));
+ private final DateFormat mDateFormat = DateFormat.getInstance();
+ public final BlockingQueue<String> mBufferedPlayerActivity = new LinkedBlockingQueue<>();
+ public final GT_BlockMap<Boolean> mCTMBlockCache = new GT_BlockMap<>();
+ public boolean mHardcoreCables = false;
+ public boolean mDisableVanillaOres = true;
+ public boolean mHardMachineCasings = true;
+ public boolean mAllowSmallBoilerAutomation = false;
+ public boolean mNerfDustCrafting = true;
+ public boolean mSortToTheEnd = true;
+ public boolean mCraftingUnification = true;
+ public boolean mInventoryUnification = true;
+ public boolean mIncreaseDungeonLoot = true;
+ public boolean mAxeWhenAdventure = true;
+ public boolean mSurvivalIntoAdventure = false;
+ public boolean mNerfedWoodPlank = true;
+ public boolean mNerfedVanillaTools = true;
+ public boolean mHardRock = false;
+ public boolean mHungerEffect = true;
+ public boolean mOnline = true;
+ public boolean mIgnoreTcon = true;
+ public boolean mDisableIC2Cables = false;
+ public boolean mAchievements = true;
+ public boolean mArcSmeltIntoAnnealed = true;
+ public boolean mMagneticraftRecipes = false;
+ public boolean mImmersiveEngineeringRecipes = false;
+ private boolean isFirstServerWorldTick = true;
+ private boolean isFirstWorldTick = true;
+ private boolean mOreDictActivated = false;
+ public boolean mChangeHarvestLevels = false;
+ public boolean mNerfedCombs = true;
+ public boolean mNerfedCrops = true;
+ public boolean mGTBees = true;
+ public boolean mHideUnusedOres = true;
+ public boolean mPollution = true;
+ public boolean mExplosionItemDrop = false;
+ public boolean mUseGreatlyShrukenReplacementList = true;
+ public int mSkeletonsShootGTArrows = 16;
+ public int mMaxEqualEntitiesAtOneSpot = 3;
+ public int mFlintChance = 30;
+ public int mItemDespawnTime = 6000;
+ public int mUpgradeCount = 4;
+ public int[] mHarvestLevel = new int[1000];
+ public int mGraniteHavestLevel = 3;
+ public int mMaxHarvestLevel = 7;
+ public int mWireHeatingTicks = 4;
+ public double replicatorExponent = 1.2D;
+ public int mPollutionSmogLimit = 550000;
+ public int mPollutionPoisonLimit = 750000;
+ public int mPollutionVegetationLimit = 1000000;
+ public int mPollutionSourRainLimit = 2000000;
+ public int mPollutionOnExplosion = 100000;
+ public int mPollutionPrimitveBlastFurnacePerSecond = 200;
+ public int mPollutionEBFPerSecond = 400;
+ public int mPollutionCharcoalPitPerSecond = 100;
+ public int mPollutionLargeCombustionEnginePerSecond = 480;
+ public int mPollutionExtremeCombustionEnginePerSecond = 3840;
+ public int mPollutionImplosionCompressorPerSecond = 10000;
+ public int mPollutionLargeBronzeBoilerPerSecond = 1000;
+ public int mPollutionLargeSteelBoilerPerSecond = 2000;
+ public int mPollutionLargeTitaniumBoilerPerSecond = 3000;
+ public int mPollutionLargeTungstenSteelBoilerPerSecond = 4000;
+ public double mPollutionReleasedByThrottle = 1.0 / 24.0; // divided by 24 because 24 circuit conf
+ public int mPollutionLargeGasTurbinePerSecond = 300;
+ public int mPollutionMultiSmelterPerSecond = 400;
+ public int mPollutionPyrolyseOvenPerSecond = 300;
+ public int mPollutionSmallCoalBoilerPerSecond = 20;
+ public int mPollutionHighPressureLavaBoilerPerSecond = 20;
+ public int mPollutionHighPressureCoalBoilerPerSecond = 30;
+ public int mPollutionBaseDieselGeneratorPerSecond = 200;
+ public double[] mPollutionDieselGeneratorReleasedByTier = new double[] { 0.1, 1.0, 0.9, 0.8 };
+ public int mPollutionBaseGasTurbinePerSecond = 200;
+ public double[] mPollutionGasTurbineReleasedByTier = new double[] { 0.1, 1.0, 0.9, 0.8, 0.7, 0.6 };
+ public final GT_UO_DimensionList mUndergroundOil = new GT_UO_DimensionList();
+ public boolean enableUndergroundGravelGen = true;
+ public boolean enableUndergroundDirtGen = true;
+ public int mTicksUntilNextCraftSound = 0;
+ public double mMagneticraftBonusOutputPercent = 0d;
+ private World mUniverse = null;
+ public boolean mTEMachineRecipes = false;
+ public boolean mEnableAllMaterials = false;
+ public boolean mEnableCleanroom = true;
+ public boolean mLowGravProcessing = false;
+ public boolean mAprilFool = false;
+ public boolean mCropNeedBlock = true;
+ @Deprecated
+ public boolean mDisableOldChemicalRecipes = false;
+ public boolean mAMHInteraction = true;
+ public boolean mForceFreeFace = true;
+ public boolean mBrickedBlastFurnace = true;
+ @Deprecated
+ public boolean mEasierIVPlusCables = false;
+ public boolean mMixedOreOnlyYieldsTwoThirdsOfPureOre = false;
+ public boolean mRichOreYieldMultiplier = true;
+ public boolean mNetherOreYieldMultiplier = true;
+ public boolean mEndOreYieldMultiplier = true;
+ public boolean enableBlackGraniteOres = true;
+ public boolean enableRedGraniteOres = true;
+ public boolean enableMarbleOres = true;
+ public boolean enableBasaltOres = true;
+ public boolean gt6Pipe = true;
+ public boolean gt6Cable = true;
+ public boolean ic2EnergySourceCompat = true;
+ public boolean costlyCableConnection = false;
+ public boolean crashOnNullRecipeInput = false;
+
+ public enum OreDropSystem {
+ Block,
+ PerDimBlock,
+ UnifiedBlock,
+ FortuneItem,
+ Item
+ }
+
+ public OreDropSystem oreDropSystem = OreDropSystem.FortuneItem;
+
+ /**
+ * This enables ambient-occlusion smooth lighting on tiles
+ */
+ public boolean mRenderTileAmbientOcclusion = true;
+
+ /**
+ * This enables rendering of glowing textures
+ */
+ public boolean mRenderGlowTextures = true;
+
+ /**
+ * Render flipped textures
+ */
+ public boolean mRenderFlippedMachinesFlipped = true;
+
+ /**
+ * This enables indicators on input/output hatches
+ */
+ public boolean mRenderIndicatorsOnHatch = true;
+
+ /**
+ * This enables the rendering of dirt particles if pollution is enabled too
+ */
+ public boolean mRenderDirtParticles = true;
+
+ /**
+ * This enables the rendering of the pollution fog if pollution is enabled too
+ */
+ public boolean mRenderPollutionFog = true;
+
+ /**
+ * This enables BaseMetaTileEntity block updates handled by BlockUpdateHandler
+ */
+ public boolean mUseBlockUpdateHandler = false;
+
+ /**
+ * This makes cover tabs visible on GregTech machines
+ */
+ public boolean mCoverTabsVisible = true;
+
+ /**
+ * This controls whether cover tabs display on the left (default) or right side of the UI
+ */
+ public boolean mCoverTabsFlipped = false;
+
+ /**
+ * How verbose should tooltips be? 0: disabled, 1: one-line, 2: normal, 3+: extended
+ */
+ public int mTooltipVerbosity = 2;
+
+ /**
+ * How verbose should tooltips be when LSHIFT is held? 0: disabled, 1: one-line, 2: normal, 3+: extended
+ */
+ public int mTooltipShiftVerbosity = 3;
+
+ /**
+ * Which style to use for title tab on machine GUI? 0: text tab split-dark, 1: text tab unified, 2: item icon tab
+ */
+ public int mTitleTabStyle = 0;
+
+ /**
+ * Whether to show seconds or ticks on NEI
+ */
+ public boolean mNEIRecipeSecondMode = true;
+
+ /**
+ * This enables "Recipe by" display on NEI
+ */
+ public boolean mNEIRecipeOwner = false;
+
+ /**
+ * This enables showing stack traces where the recipe was added. Reboot needed
+ */
+ public boolean mNEIRecipeOwnerStackTrace = false;
+
+ /**
+ * This enables showing original voltage when overclocked
+ */
+ public boolean mNEIOriginalVoltage = false;
+
+ /**
+ * This enables the green->red durability for an item's damage value
+ */
+ public boolean mRenderItemDurabilityBar = true;
+
+ /**
+ * This enables the blue charge bar for an electric item's charge
+ */
+ public boolean mRenderItemChargeBar = true;
+
+ public final Map<RecipeCategory, RecipeCategorySetting> recipeCategorySettings = new HashMap<>();
+
+ /**
+ * This enables showing voltage tier of transformer for Waila, instead of raw voltage number
+ */
+ public boolean mWailaTransformerVoltageTier = true;
+
+ /**
+ * What is the order of the circuits when they are selected?
+ */
+ public Map<String, Integer> mCircuitsOrder = new HashMap<>();
+
+ public boolean wailaAverageNS = false;
+
+ public static final int GUI_ID_COVER_SIDE_BASE = 10; // Takes GUI ID 10 - 15
+
+ public static Map<String, Integer> oreDictBurnTimes = new HashMap<>();
+
+ // Locking
+ public static ReentrantLock TICK_LOCK = new ReentrantLock();
+
+ private final ConcurrentMap<UUID, GT_ClientPreference> mClientPrefernces = new ConcurrentHashMap<>();
+
+ static {
+ oreDictBurnTimes.put("dustTinyWood", 11);
+ oreDictBurnTimes.put("dustTinySodium", 44);
+ oreDictBurnTimes.put("dustSmallWood", 25);
+ oreDictBurnTimes.put("dustSmallSodium", 100);
+ oreDictBurnTimes.put("dustWood", 100);
+ oreDictBurnTimes.put("dustTinyCoal", 177);
+ oreDictBurnTimes.put("dustTinyCharcoal", 177);
+ oreDictBurnTimes.put("dustTinyLignite", 166);
+ oreDictBurnTimes.put("plateWood", 300);
+ oreDictBurnTimes.put("dustSmallLignite", 375);
+ oreDictBurnTimes.put("dustSodium", 400);
+ oreDictBurnTimes.put("dustSmallCoal", 400);
+ oreDictBurnTimes.put("dustSmallCharcoal", 400);
+ oreDictBurnTimes.put("dustTinyLithium", 888);
+ oreDictBurnTimes.put("dustTinyCaesium", 888);
+ oreDictBurnTimes.put("gemLignite", 1200);
+ oreDictBurnTimes.put("crushedLignite", 1200);
+ oreDictBurnTimes.put("dustImpureLignite", 1200);
+ oreDictBurnTimes.put("dustLignite", 1200);
+ oreDictBurnTimes.put("dustSulfur", 1600);
+ oreDictBurnTimes.put("gemCoal", 1600);
+ oreDictBurnTimes.put("crushedCoal", 1600);
+ oreDictBurnTimes.put("dustImpureCoal", 1600);
+ oreDictBurnTimes.put("dustCoal", 1600);
+ oreDictBurnTimes.put("gemCharcoal", 1600);
+ oreDictBurnTimes.put("crushedCharcoal", 1600);
+ oreDictBurnTimes.put("dustImpureCharcoal", 1600);
+ oreDictBurnTimes.put("dustCharcoal", 1600);
+ oreDictBurnTimes.put("dustSmallLithium", 2000);
+ oreDictBurnTimes.put("dustSmallCaesium", 2000);
+ oreDictBurnTimes.put("gemSodium", 4000);
+ oreDictBurnTimes.put("crushedSodium", 4000);
+ oreDictBurnTimes.put("dustImpureSodium", 4000);
+ oreDictBurnTimes.put("gemLithium", 6000);
+ oreDictBurnTimes.put("crushedLithium", 6000);
+ oreDictBurnTimes.put("dustImpureLithium", 6000);
+ oreDictBurnTimes.put("dustLithium", 6000);
+ oreDictBurnTimes.put("gemCaesium", 6000);
+ oreDictBurnTimes.put("crushedCaesium", 6000);
+ oreDictBurnTimes.put("dustImpureCaesium", 6000);
+ oreDictBurnTimes.put("dustCaesium", 6000);
+ oreDictBurnTimes.put("blockLignite", 12000);
+ oreDictBurnTimes.put("blockCharcoal", 16000);
+ oreDictBurnTimes.put("gemDiamond", 102400);
+ oreDictBurnTimes.put("blockDiamond", 1024000);
+ oreDictBurnTimes.put("crushedDiamond", 102400);
+ oreDictBurnTimes.put("dustImpureDiamond", 102400);
+ oreDictBurnTimes.put("dustDiamond", 102400);
+ oreDictBurnTimes.put("dustSmallDiamond", 25600);
+ oreDictBurnTimes.put("dustTinyDiamond", 11378);
+ }
+
+ public GT_Proxy() {
+ GameRegistry.registerFuelHandler(this);
+ MinecraftForge.EVENT_BUS.register(this);
+ MinecraftForge.ORE_GEN_BUS.register(this);
+ FMLCommonHandler.instance()
+ .bus()
+ .register(this);
+ GregTech_API.sThaumcraftCompat = (IThaumcraftCompat) GT_Utility
+ .callConstructor("gregtech.common.GT_ThaumcraftCompat", 0, null, GT_Values.D1, new Object[0]);
+ for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry
+ .getRegisteredFluidContainerData()) {
+ onFluidContainerRegistration(new FluidContainerRegistry.FluidContainerRegisterEvent(tData));
+ }
+ try {
+ for (String tOreName : OreDictionary.getOreNames()) {
+ ItemStack tOreStack;
+ for (Iterator<ItemStack> i$ = OreDictionary.getOres(tOreName)
+ .iterator(); i$.hasNext(); registerOre(new OreDictionary.OreRegisterEvent(tOreName, tOreStack))) {
+ tOreStack = i$.next();
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ public void onPreLoad() {
+ GT_Log.out.println("GT_Mod: Preload-Phase started!");
+ GT_Log.ore.println("GT_Mod: Preload-Phase started!");
+
+ GregTech_API.sPreloadStarted = true;
+ this.mIgnoreTcon = GregTech_API.sOPStuff.get(ConfigCategories.general, "ignoreTConstruct", true);
+ this.mWireHeatingTicks = GregTech_API.sOPStuff.get(ConfigCategories.general, "WireHeatingTicks", 4);
+ this.replicatorExponent = GregTech_API.sOPStuff.get("Replicator", "Nerf Exponent", 1.2D);
+ NetworkRegistry.INSTANCE.registerGuiHandler(GT_Values.GT, this);
+ for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry
+ .getRegisteredFluidContainerData()) {
+ if ((tData.filledContainer.getItem() == Items.potionitem) && (tData.filledContainer.getItemDamage() == 0)) {
+ tData.fluid.amount = 0;
+ break;
+ }
+ }
+ GT_Log.out.println("GT_Mod: Getting required Items of other Mods.");
+
+ ItemList.RC_ShuntingWire.set(GT_ModHandler.getModItem(Railcraft.ID, "machine.delta", 1L, 0));
+ ItemList.RC_ShuntingWireFrame.set(GT_ModHandler.getModItem(Railcraft.ID, "frame", 1L, 0));
+ ItemList.RC_Rail_Standard.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 0));
+ ItemList.RC_Rail_Adv.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 1));
+ ItemList.RC_Rail_Wooden.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 2));
+ ItemList.RC_Rail_HS.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 3));
+ ItemList.RC_Rail_Reinforced.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 4));
+ ItemList.RC_Rail_Electric.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rail", 1L, 5));
+ ItemList.RC_Tie_Wood.set(GT_ModHandler.getModItem(Railcraft.ID, "part.tie", 1L, 0));
+ ItemList.RC_Tie_Stone.set(GT_ModHandler.getModItem(Railcraft.ID, "part.tie", 1L, 1));
+ ItemList.RC_Bed_Wood.set(GT_ModHandler.getModItem(Railcraft.ID, "part.railbed", 1L, 0));
+ ItemList.RC_Bed_Stone.set(GT_ModHandler.getModItem(Railcraft.ID, "part.railbed", 1L, 1));
+ ItemList.RC_Rebar.set(GT_ModHandler.getModItem(Railcraft.ID, "part.rebar", 1L));
+ ItemList.TC_Thaumometer.set(GT_ModHandler.getModItem(Thaumcraft.ID, "ItemThaumometer", 1L, 0));
+ ItemList.Tool_Sword_Steel.set(GT_ModHandler.getModItem(Railcraft.ID, "tool.steel.sword", 1L));
+ ItemList.Tool_Pickaxe_Steel.set(GT_ModHandler.getModItem(Railcraft.ID, "tool.steel.pickaxe", 1L));
+ ItemList.Tool_Shovel_Steel.set(GT_ModHandler.getModItem(Railcraft.ID, "tool.steel.shovel", 1L));
+ ItemList.Tool_Axe_Steel.set(GT_ModHandler.getModItem(Railcraft.ID, "tool.steel.axe", 1L));
+ ItemList.Tool_Hoe_Steel.set(GT_ModHandler.getModItem(Railcraft.ID, "tool.steel.hoe", 1L));
+
+ ItemList.TF_LiveRoot.set(GT_ModHandler.getModItem(TwilightForest.ID, "item.liveRoot", 1L, 0));
+ ItemList.TF_Vial_FieryBlood.set(GT_ModHandler.getModItem(TwilightForest.ID, "item.fieryBlood", 1L));
+ ItemList.TF_Vial_FieryTears.set(GT_ModHandler.getModItem(TwilightForest.ID, "item.fieryTears", 1L));
+
+ ItemList.FR_Lemon.set(GT_ModHandler.getModItem(Forestry.ID, "fruits", 1L, 3));
+ ItemList.FR_Mulch.set(GT_ModHandler.getModItem(Forestry.ID, "mulch", 1L));
+ ItemList.FR_Fertilizer.set(GT_ModHandler.getModItem(Forestry.ID, "fertilizerCompound", 1L));
+ ItemList.FR_Compost.set(GT_ModHandler.getModItem(Forestry.ID, "fertilizerBio", 1L));
+ ItemList.FR_Silk.set(GT_ModHandler.getModItem(Forestry.ID, "craftingMaterial", 1L, 2));
+ ItemList.FR_Wax.set(GT_ModHandler.getModItem(Forestry.ID, "beeswax", 1L));
+ ItemList.FR_WaxCapsule.set(GT_ModHandler.getModItem(Forestry.ID, "waxCapsule", 1L));
+ ItemList.FR_RefractoryWax.set(GT_ModHandler.getModItem(Forestry.ID, "refractoryWax", 1L));
+ ItemList.FR_RefractoryCapsule.set(GT_ModHandler.getModItem(Forestry.ID, "refractoryEmpty", 1L));
+ ItemList.FR_Bee_Drone.set(GT_ModHandler.getModItem(Forestry.ID, "beeDroneGE", 1L));
+ ItemList.FR_Bee_Princess.set(GT_ModHandler.getModItem(Forestry.ID, "beePrincessGE", 1L));
+ ItemList.FR_Bee_Queen.set(GT_ModHandler.getModItem(Forestry.ID, "beeQueenGE", 1L));
+ ItemList.FR_Tree_Sapling.set(
+ GT_ModHandler
+ .getModItem(Forestry.ID, "sapling", 1L, GT_ModHandler.getModItem(Forestry.ID, "saplingGE", 1L)));
+ ItemList.FR_Butterfly.set(GT_ModHandler.getModItem(Forestry.ID, "butterflyGE", 1L));
+ ItemList.FR_Larvae.set(GT_ModHandler.getModItem(Forestry.ID, "beeLarvaeGE", 1L));
+ ItemList.FR_Serum.set(GT_ModHandler.getModItem(Forestry.ID, "serumGE", 1L));
+ ItemList.FR_Caterpillar.set(GT_ModHandler.getModItem(Forestry.ID, "caterpillarGE", 1L));
+ ItemList.FR_PollenFertile.set(GT_ModHandler.getModItem(Forestry.ID, "pollenFertile", 1L));
+ ItemList.FR_Stick.set(GT_ModHandler.getModItem(Forestry.ID, "oakStick", 1L));
+ ItemList.FR_Casing_Impregnated.set(GT_ModHandler.getModItem(Forestry.ID, "impregnatedCasing", 1L));
+ ItemList.FR_Casing_Sturdy.set(GT_ModHandler.getModItem(Forestry.ID, "sturdyMachine", 1L));
+ ItemList.FR_Casing_Hardened.set(GT_ModHandler.getModItem(Forestry.ID, "hardenedMachine", 1L));
+
+ ItemList.Bottle_Empty.set(new ItemStack(Items.glass_bottle, 1));
+
+ ItemList.Cell_Universal_Fluid.set(GT_ModHandler.getIC2Item("FluidCell", 1L));
+ ItemList.Cell_Empty.set(
+ GT_ModHandler.getIC2Item(
+ "cell",
+ 1L,
+ GT_ModHandler.getIC2Item("cellEmpty", 1L, GT_ModHandler.getIC2Item("emptyCell", 1L))));
+ ItemList.Cell_Water.set(GT_ModHandler.getIC2Item("waterCell", 1L, GT_ModHandler.getIC2Item("cellWater", 1L)));
+ ItemList.Cell_Lava.set(GT_ModHandler.getIC2Item("lavaCell", 1L, GT_ModHandler.getIC2Item("cellLava", 1L)));
+ ItemList.Cell_Air.set(
+ GT_ModHandler.getIC2Item(
+ "airCell",
+ 1L,
+ GT_ModHandler.getIC2Item("cellAir", 1L, GT_ModHandler.getIC2Item("cellOxygen", 1L))));
+
+ ItemList.IC2_Item_Casing_Iron.set(GT_ModHandler.getIC2Item("casingiron", 1L));
+ ItemList.IC2_Item_Casing_Gold.set(GT_ModHandler.getIC2Item("casinggold", 1L));
+ ItemList.IC2_Item_Casing_Bronze.set(GT_ModHandler.getIC2Item("casingbronze", 1L));
+ ItemList.IC2_Item_Casing_Copper.set(GT_ModHandler.getIC2Item("casingcopper", 1L));
+ ItemList.IC2_Item_Casing_Tin.set(GT_ModHandler.getIC2Item("casingtin", 1L));
+ ItemList.IC2_Item_Casing_Lead.set(GT_ModHandler.getIC2Item("casinglead", 1L));
+ ItemList.IC2_Item_Casing_Steel.set(GT_ModHandler.getIC2Item("casingadviron", 1L));
+ ItemList.IC2_Spray_WeedEx.set(GT_ModHandler.getIC2Item("weedEx", 1L));
+ ItemList.IC2_Mixed_Metal_Ingot.set(GT_ModHandler.getIC2Item("mixedMetalIngot", 1L));
+ ItemList.IC2_Fertilizer.set(GT_ModHandler.getIC2Item("fertilizer", 1L));
+ ItemList.IC2_CoffeeBeans.set(GT_ModHandler.getIC2Item("coffeeBeans", 1L));
+ ItemList.IC2_CoffeePowder.set(GT_ModHandler.getIC2Item("coffeePowder", 1L));
+ ItemList.IC2_Hops.set(GT_ModHandler.getIC2Item("hops", 1L));
+ ItemList.IC2_Resin.set(GT_ModHandler.getIC2Item("resin", 1L));
+ ItemList.IC2_Plantball.set(GT_ModHandler.getIC2Item("plantBall", 1L));
+ ItemList.IC2_PlantballCompressed
+ .set(GT_ModHandler.getIC2Item("compressedPlantBall", 1L, ItemList.IC2_Plantball.get(1L)));
+ ItemList.IC2_Crop_Seeds.set(GT_ModHandler.getIC2Item("cropSeed", 1L));
+ ItemList.IC2_Grin_Powder.set(GT_ModHandler.getIC2Item("grinPowder", 1L));
+ ItemList.IC2_Energium_Dust.set(GT_ModHandler.getIC2Item("energiumDust", 1L));
+ ItemList.IC2_Scrap.set(GT_ModHandler.getIC2Item("scrap", 1L));
+ ItemList.IC2_Scrapbox.set(GT_ModHandler.getIC2Item("scrapBox", 1L));
+ ItemList.IC2_Fuel_Rod_Empty.set(GT_ModHandler.getIC2Item("fuelRod", 1L));
+ ItemList.IC2_Food_Can_Empty.set(GT_ModHandler.getIC2Item("tinCan", 1L));
+ ItemList.IC2_Food_Can_Filled.set(GT_ModHandler.getIC2Item("filledTinCan", 1L, 0));
+ ItemList.IC2_Food_Can_Spoiled.set(GT_ModHandler.getIC2Item("filledTinCan", 1L, 1));
+ ItemList.IC2_Industrial_Diamond
+ .set(GT_ModHandler.getIC2Item("industrialDiamond", 1L, new ItemStack(Items.diamond, 1)));
+ ItemList.IC2_Compressed_Coal_Ball.set(GT_ModHandler.getIC2Item("compressedCoalBall", 1L));
+ ItemList.IC2_Compressed_Coal_Chunk.set(GT_ModHandler.getIC2Item("coalChunk", 1L));
+ ItemList.IC2_ShaftIron.set(GT_ModHandler.getIC2Item("ironshaft", 1L));
+ ItemList.IC2_ShaftSteel.set(GT_ModHandler.getIC2Item("steelshaft", 1L));
+
+ ItemList.IC2_SuBattery.set(GT_ModHandler.getIC2Item("suBattery", 1L));
+ ItemList.IC2_ReBattery.set(GT_ModHandler.getIC2Item("reBattery", 1L));
+ ItemList.IC2_AdvBattery.set(GT_ModHandler.getIC2Item("advBattery", 1L));
+ ItemList.IC2_EnergyCrystal.set(GT_ModHandler.getIC2Item("energyCrystal", 1L));
+ ItemList.IC2_LapotronCrystal.set(GT_ModHandler.getIC2Item("lapotronCrystal", 1L));
+
+ ItemList.Tool_Sword_Bronze.set(GT_ModHandler.getIC2Item("bronzeSword", 1L));
+ ItemList.Tool_Pickaxe_Bronze.set(GT_ModHandler.getIC2Item("bronzePickaxe", 1L));
+ ItemList.Tool_Shovel_Bronze.set(GT_ModHandler.getIC2Item("bronzeShovel", 1L));
+ ItemList.Tool_Axe_Bronze.set(GT_ModHandler.getIC2Item("bronzeAxe", 1L));
+ ItemList.Tool_Hoe_Bronze.set(GT_ModHandler.getIC2Item("bronzeHoe", 1L));
+ ItemList.IC2_ForgeHammer.set(GT_ModHandler.getIC2Item("ForgeHammer", 1L));
+ ItemList.IC2_WireCutter.set(GT_ModHandler.getIC2Item("cutter", 1L));
+
+ ItemList.Credit_Iron.set(GT_ModHandler.getIC2Item("coin", 1L));
+
+ ItemList.Circuit_Basic.set(GT_ModHandler.getIC2Item("electronicCircuit", 1L));
+ ItemList.Circuit_Advanced.set(GT_ModHandler.getIC2Item("advancedCircuit", 1L));
+
+ ItemList.Upgrade_Overclocker.set(GT_ModHandler.getIC2Item("overclockerUpgrade", 1L));
+ ItemList.Upgrade_Battery.set(GT_ModHandler.getIC2Item("energyStorageUpgrade", 1L));
+
+ ItemList.Dye_Bonemeal.set(new ItemStack(Items.dye, 1, 15));
+ ItemList.Dye_SquidInk.set(new ItemStack(Items.dye, 1, 0));
+ ItemList.Dye_Cocoa.set(new ItemStack(Items.dye, 1, 3));
+
+ ItemList.Book_Written_00.set(new ItemStack(Items.written_book, 1, 0));
+
+ ItemList.Food_Baked_Bread.set(new ItemStack(Items.bread, 1, 0));
+ ItemList.Food_Raw_Potato.set(new ItemStack(Items.potato, 1, 0));
+ ItemList.Food_Baked_Potato.set(new ItemStack(Items.baked_potato, 1, 0));
+ ItemList.Food_Poisonous_Potato.set(new ItemStack(Items.poisonous_potato, 1, 0));
+
+ OrePrefixes.bottle.mContainerItem = ItemList.Bottle_Empty.get(1L);
+ OrePrefixes.bucket.mContainerItem = new ItemStack(Items.bucket, 1);
+ OrePrefixes.cellPlasma.mContainerItem = ItemList.Cell_Empty.get(1L);
+ OrePrefixes.cellMolten.mContainerItem = ItemList.Cell_Empty.get(1L);
+ OrePrefixes.cell.mContainerItem = ItemList.Cell_Empty.get(1L);
+
+ GT_ModHandler.sNonReplaceableItems.add(new ItemStack(Items.bow, 1, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(new ItemStack(Items.fishing_rod, 1, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(ItemList.IC2_ForgeHammer.getWithDamage(1L, 32767L));
+ GT_ModHandler.sNonReplaceableItems.add(ItemList.IC2_WireCutter.getWithDamage(1L, 32767L));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("painter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("blackPainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("redPainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("greenPainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("brownPainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("bluePainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("purplePainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("cyanPainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("lightGreyPainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("darkGreyPainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("pinkPainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("limePainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("yellowPainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("cloudPainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("magentaPainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("orangePainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("whitePainter", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("cfPack", 1L, 32767));
+ // GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("jetpack", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("treetap", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("weedEx", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("staticBoots", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("compositeArmor", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("hazmatHelmet", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("hazmatChestplate", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("hazmatLeggings", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getIC2Item("hazmatBoots", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Railcraft.ID, "part.turbine.disk", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Railcraft.ID, "part.turbine.blade", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Railcraft.ID, "part.turbine.rotor", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Railcraft.ID, "borehead.diamond", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Railcraft.ID, "borehead.steel", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Railcraft.ID, "borehead.iron", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems
+ .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.plateNaga", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(TwilightForest.ID, "item.legsNaga", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems
+ .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.arcticHelm", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems
+ .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.arcticPlate", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems
+ .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.arcticLegs", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems
+ .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.arcticBoots", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(TwilightForest.ID, "item.yetiHelm", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems
+ .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.yetiPlate", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(TwilightForest.ID, "item.yetiLegs", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems
+ .add(GT_ModHandler.getModItem(TwilightForest.ID, "item.yetiBoots", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems
+ .add(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ToolCertusQuartzCuttingKnife", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems
+ .add(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ToolNetherQuartzCuttingKnife", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "apiaristHelmet", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "apiaristChest", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "apiaristLegs", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "apiaristBoots", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "frameUntreated", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "frameImpregnated", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "frameProven", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems.add(GT_ModHandler.getModItem(Forestry.ID, "waxCast", 1L, 32767));
+ GT_ModHandler.sNonReplaceableItems
+ .add(GT_ModHandler.getModItem(GalacticraftCore.ID, "item.sensorGlasses", 1L, 32767));
+
+ RecipeSorter.register(
+ "gregtech:shaped",
+ GT_Shaped_Recipe.class,
+ RecipeSorter.Category.SHAPED,
+ "after:minecraft:shaped before:minecraft:shapeless");
+ RecipeSorter.register(
+ "gregtech:shapeless",
+ GT_Shapeless_Recipe.class,
+ RecipeSorter.Category.SHAPELESS,
+ "after:minecraft:shapeless");
+
+ // Register chunk manager with Forge
+ GT_ChunkManager.init();
+ }
+
+ public void onLoad() {
+ GT_Log.out.println("GT_Mod: Beginning Load-Phase.");
+ GT_Log.ore.println("GT_Mod: Beginning Load-Phase.");
+ if (MagicalCrops.isModLoaded()) {
+ GT_OreDictUnificator.registerOre(
+ "cropChilipepper",
+ GT_ModHandler.getModItem(MagicalCrops.ID, "magicalcrops_CropProduce", 1L, 2));
+ GT_OreDictUnificator.registerOre(
+ "cropTomato",
+ GT_ModHandler.getModItem(MagicalCrops.ID, "magicalcrops_CropProduce", 1L, 8));
+ GT_OreDictUnificator
+ .registerOre("cropGrape", GT_ModHandler.getModItem(MagicalCrops.ID, "magicalcrops_CropProduce", 1L, 4));
+ }
+ if (GanysSurface.isModLoaded()) {
+ GT_OreDictUnificator.registerOre("cropTea", GT_ModHandler.getModItem(GanysSurface.ID, "teaLeaves", 1L, 0));
+ }
+
+ // Clay buckets, which don't get registered until Iguana Tweaks pre-init
+ if (IguanaTweaksTinkerConstruct.isModLoaded()) {
+ OrePrefixes.bucketClay.mContainerItem = GT_ModHandler
+ .getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketFired", 1L, 0);
+ GT_OreDictUnificator.set(
+ OrePrefixes.bucketClay,
+ Materials.Empty,
+ GT_ModHandler.getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketFired", 1L, 0));
+ GT_OreDictUnificator.set(
+ OrePrefixes.bucketClay,
+ Materials.Water,
+ GT_ModHandler.getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketWater", 1L, 0));
+ GT_OreDictUnificator.set(
+ OrePrefixes.bucketClay,
+ Materials.Lava,
+ GT_ModHandler.getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketLava", 1L, 0));
+ GT_OreDictUnificator.set(
+ OrePrefixes.bucketClay,
+ Materials.Milk,
+ GT_ModHandler.getModItem(IguanaTweaksTinkerConstruct.ID, "clayBucketMilk", 1L, 0));
+
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ Materials.Milk.getFluid(1000L),
+ GT_OreDictUnificator.get(OrePrefixes.bucketClay, Materials.Milk, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.bucketClay, Materials.Empty, 1L)));
+ }
+
+ if (!GT_Mod.gregtechproxy.enableUndergroundGravelGen)
+ PREVENTED_ORES.add(OreGenEvent.GenerateMinable.EventType.GRAVEL);
+ if (!GT_Mod.gregtechproxy.enableUndergroundDirtGen)
+ PREVENTED_ORES.add(OreGenEvent.GenerateMinable.EventType.DIRT);
+
+ MinecraftForge.EVENT_BUS.register(new SpaceProjectWorldSavedData());
+ MinecraftForge.EVENT_BUS.register(new GlobalEnergyWorldSavedData(""));
+ MinecraftForge.EVENT_BUS.register(new GT_Worldgenerator.OregenPatternSavedData(""));
+ MinecraftForge.EVENT_BUS.register(new GlobalMetricsCoverDatabase());
+ FMLCommonHandler.instance()
+ .bus()
+ .register(new GT_Worldgenerator.OregenPatternSavedData(""));
+
+ // IC2 Hazmat
+ addFullHazmatToIC2Item("hazmatHelmet");
+ addFullHazmatToIC2Item("hazmatChestplate");
+ addFullHazmatToIC2Item("hazmatLeggings");
+ addFullHazmatToIC2Item("hazmatBoots");
+ addFullHazmatToIC2Item("nanoHelmet");
+ addFullHazmatToIC2Item("nanoBoots");
+ addFullHazmatToIC2Item("nanoLeggings");
+ addFullHazmatToIC2Item("nanoBodyarmor");
+ addFullHazmatToIC2Item("quantumHelmet");
+ addFullHazmatToIC2Item("quantumBodyarmor");
+ addFullHazmatToIC2Item("quantumLeggings");
+ addFullHazmatToIC2Item("quantumBoots");
+
+ // GT++ Hazmat
+ addFullHazmatToGeneralItem(GTPlusPlus.ID, "itemArmorHazmatHelmetEx", 1);
+ addFullHazmatToGeneralItem(GTPlusPlus.ID, "itemArmorHazmatChestplateEx", 1);
+ addFullHazmatToGeneralItem(GTPlusPlus.ID, "itemArmorHazmatLeggingsEx", 1);
+ addFullHazmatToGeneralItem(GTPlusPlus.ID, "itemArmorRubBootsEx", 1);
+
+ // GraviSuite Hazmat
+ addFullHazmatToGeneralItem(GraviSuite.ID, "graviChestPlate", 1L);
+ addFullHazmatToGeneralItem(GraviSuite.ID, "advNanoChestPlate", 1L);
+
+ // EMT Hazmat
+ addFullHazmatToGeneralItem(ElectroMagicTools.ID, "itemArmorQuantumChestplate", 1L);
+ addFullHazmatToGeneralItem(ElectroMagicTools.ID, "NanoBootsTraveller", 1L);
+ addFullHazmatToGeneralItem(ElectroMagicTools.ID, "NanosuitGogglesRevealing", 1L);
+ addFullHazmatToGeneralItem(ElectroMagicTools.ID, "QuantumBootsTraveller", 1L);
+ addFullHazmatToGeneralItem(ElectroMagicTools.ID, "QuantumGogglesRevealing", 1L);
+ addFullHazmatToGeneralItem(ElectroMagicTools.ID, "SolarHelmetRevealing", 1L);
+ addFullHazmatToGeneralItem(ElectroMagicTools.ID, "NanosuitWing", 1L);
+ addFullHazmatToGeneralItem(ElectroMagicTools.ID, "QuantumWing", 1L);
+
+ // Thaumic Boots Hazmat
+ addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemQuantumVoid", 1L);
+ addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemQuantumMeteor", 1L);
+ addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemQuantumComet", 1L);
+ addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemNanoVoid", 1L);
+ addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemNanoMeteor", 1L);
+ addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemNanoComet", 1L);
+ addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemElectricVoid", 1L);
+ addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemVoidMeteor", 1L);
+ addFullHazmatToGeneralItem(ThaumicBoots.ID, "item.ItemVoidComet", 1L);
+
+ // DraconicEvolution Hazmat
+ addFullHazmatToGeneralItem(DraconicEvolution.ID, "draconicBoots", 1L, 0);
+ addFullHazmatToGeneralItem(DraconicEvolution.ID, "draconicHelm", 1L, 0);
+ addFullHazmatToGeneralItem(DraconicEvolution.ID, "draconicLeggs", 1L, 0);
+ addFullHazmatToGeneralItem(DraconicEvolution.ID, "draconicChest", 1L, 0);
+ addFullHazmatToGeneralItem(DraconicEvolution.ID, "wyvernBoots", 1L, 0);
+ addFullHazmatToGeneralItem(DraconicEvolution.ID, "wyvernHelm", 1L, 0);
+ addFullHazmatToGeneralItem(DraconicEvolution.ID, "wyvernLeggs", 1L, 0);
+ addFullHazmatToGeneralItem(DraconicEvolution.ID, "wyvernChest", 1L, 0);
+
+ // AdvancedSolarPanel
+ addFullHazmatToGeneralItem(AdvancedSolarPanel.ID, "advanced_solar_helmet", 1L);
+ addFullHazmatToGeneralItem(AdvancedSolarPanel.ID, "hybrid_solar_helmet", 1L);
+ addFullHazmatToGeneralItem(AdvancedSolarPanel.ID, "ultimate_solar_helmet", 1L);
+
+ // TaintedMagic Hazmat
+ addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidwalkerBoots", 1L);
+ addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemShadowFortressHelmet", 1L);
+ addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemShadowFortressChestplate", 1L);
+ addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemShadowFortressLeggings", 1L);
+ addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidFortressHelmet", 1L);
+ addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidFortressChestplate", 1L);
+ addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidFortressLeggings", 1L);
+ addFullHazmatToGeneralItem(TaintedMagic.ID, "ItemVoidmetalGoggles", 1L);
+
+ // WitchingGadgets Hazmat
+ addFullHazmatToGeneralItem(WitchingGadgets.ID, "item.WG_PrimordialHelm", 1L);
+ addFullHazmatToGeneralItem(WitchingGadgets.ID, "item.WG_PrimordialChest", 1L);
+ addFullHazmatToGeneralItem(WitchingGadgets.ID, "item.WG_PrimordialLegs", 1L);
+ addFullHazmatToGeneralItem(WitchingGadgets.ID, "item.WG_PrimordialBoots", 1L);
+
+ // ThaumicTinkerer Hazmat
+ addFullHazmatToGeneralItem(ThaumicTinkerer.ID, "ichorclothChestGem", 1L);
+ addFullHazmatToGeneralItem(ThaumicTinkerer.ID, "ichorclothBootsGem", 1L);
+ addFullHazmatToGeneralItem(ThaumicTinkerer.ID, "ichorclothHelmGem", 1L);
+ addFullHazmatToGeneralItem(ThaumicTinkerer.ID, "ichorclothLegsGem", 1L);
+
+ // GalaxySpace Hazmat
+ addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_helmet", 1L);
+ addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_helmetglasses", 1L);
+ addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_plate", 1L);
+ addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_jetplate", 1L);
+ addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_leg", 1L);
+ addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_boots", 1L);
+ addFullHazmatToGeneralItem(GalaxySpace.ID, "item.spacesuit_gravityboots", 1L);
+
+ // Extra Hazmat
+ GregTech_API.sElectroHazmatList.add(new ItemStack(Items.chainmail_helmet, 1, W));
+ GregTech_API.sElectroHazmatList.add(new ItemStack(Items.chainmail_chestplate, 1, W));
+ GregTech_API.sElectroHazmatList.add(new ItemStack(Items.chainmail_leggings, 1, W));
+ GregTech_API.sElectroHazmatList.add(new ItemStack(Items.chainmail_boots, 1, W));
+
+ // Infinity Hazmat
+ addFullHazmatToGeneralItem(Avaritia.ID, "Infinity_Helm", 1L);
+ addFullHazmatToGeneralItem(Avaritia.ID, "Infinity_Chest", 1L);
+ addFullHazmatToGeneralItem(Avaritia.ID, "Infinity_Pants", 1L);
+ addFullHazmatToGeneralItem(Avaritia.ID, "Infinity_Shoes", 1L);
+
+ // EnderIO Hazmat
+ addFullHazmatToGeneralItem(EnderIO.ID, "item.endSteel_helmet", 1L);
+ addFullHazmatToGeneralItem(EnderIO.ID, "item.endSteel_chestplate", 1L);
+ addFullHazmatToGeneralItem(EnderIO.ID, "item.endSteel_leggings", 1L);
+ addFullHazmatToGeneralItem(EnderIO.ID, "item.endSteel_boots", 1L);
+ addFullHazmatToGeneralItem(EnderIO.ID, "item.stellar_helmet", 1L);
+ addFullHazmatToGeneralItem(EnderIO.ID, "item.stellar_chestplate", 1L);
+ addFullHazmatToGeneralItem(EnderIO.ID, "item.stellar_leggings", 1L);
+ addFullHazmatToGeneralItem(EnderIO.ID, "item.stellar_boots", 1L);
+
+ GregTech_API.sLoadStarted = true;
+ for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry
+ .getRegisteredFluidContainerData()) {
+ if ((tData.filledContainer.getItem() == Items.potionitem) && (tData.filledContainer.getItemDamage() == 0)) {
+ tData.fluid.amount = 0;
+ break;
+ }
+ }
+ GT_LanguageManager.writePlaceholderStrings();
+ }
+
+ public static long tBits = GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED
+ | GT_ModHandler.RecipeBits.ONLY_ADD_IF_RESULT_IS_NOT_NULL
+ | GT_ModHandler.RecipeBits.NOT_REMOVABLE;
+
+ public void onPostLoad() {
+ GT_Log.out.println("GT_Mod: Beginning PostLoad-Phase.");
+ GT_Log.ore.println("GT_Mod: Beginning PostLoad-Phase.");
+ if (GT_Log.pal != null) {
+ final Thread playerActivityLogger = new Thread(new GT_PlayerActivityLogger());
+ playerActivityLogger.setDaemon(true);
+ playerActivityLogger.setName("GT5U Player activity logger");
+ playerActivityLogger.start();
+ }
+ GregTech_API.sPostloadStarted = true;
+
+ // This needs to happen late enough that all of the fluids we need have been registered.
+ // onLoad() seems to be too early, as the New Horizons Core Mod registers some fluids in post-load.
+ GT_MetaGenerated_Item_98.init();
+
+ GT_OreDictUnificator.addItemData(new ItemStack(Items.iron_door, 1), new ItemData(Materials.Iron, 21772800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Items.wooden_door, 1, 32767), new ItemData(Materials.Wood, 21772800L));
+ for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry
+ .getRegisteredFluidContainerData()) {
+ if ((tData.filledContainer.getItem() == Items.potionitem) && (tData.filledContainer.getItemDamage() == 0)) {
+ tData.fluid.amount = 0;
+ break;
+ }
+ }
+ GT_Log.out.println("GT_Mod: Adding Configs specific for MetaTileEntities");
+ try {
+ for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) {
+ for (; i < GregTech_API.METATILEENTITIES.length; i++) {
+ if (GregTech_API.METATILEENTITIES[i] != null) {
+ GregTech_API.METATILEENTITIES[i].onConfigLoad(GregTech_API.sMachineFile);
+ }
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ GT_Log.out.println("GT_Mod: Adding Tool Usage Crafting Recipes for OreDict Items.");
+ for (Materials aMaterial : Materials.values()) {
+ if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial)) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
+ tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.crushedCentrifuged.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
+ tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.crystalline.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
+ tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.crystal.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustPure, aMaterial.mMacerateInto, 1L),
+ tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.crushedPurified.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustPure, aMaterial.mMacerateInto, 1L),
+ tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.cleanGravel.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustPure, aMaterial.mMacerateInto, 1L),
+ tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.reduced.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L),
+ tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.clump.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L),
+ tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.shard.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L),
+ tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.crushed.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L),
+ tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.dirtyGravel.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 4L),
+ tBits,
+ new Object[] { " X ", 'X', OrePrefixes.dust.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, 9L),
+ tBits,
+ new Object[] { "X ", 'X', OrePrefixes.dust.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+ tBits,
+ new Object[] { "XX", "XX", 'X', OrePrefixes.dustSmall.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+ tBits,
+ new Object[] { "XXX", "XXX", "XXX", 'X', OrePrefixes.dustTiny.get(aMaterial) });
+ }
+ }
+ }
+
+ public void onLoadComplete() {}
+
+ public void onServerAboutToStart() {
+ dimensionWisePollution.clear(); // !!! IMPORTANT for map switching...
+ GT_ChunkAssociatedData.clearAll();
+ }
+
+ public void onServerStarting() {
+ GT_Log.out.println("GT_Mod: ServerStarting-Phase started!");
+ GT_Log.ore.println("GT_Mod: ServerStarting-Phase started!");
+
+ this.mUniverse = null;
+ this.isFirstServerWorldTick = true;
+ for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry
+ .getRegisteredFluidContainerData()) {
+ if ((tData.filledContainer.getItem() == Items.potionitem) && (tData.filledContainer.getItemDamage() == 0)) {
+ tData.fluid.amount = 0;
+ break;
+ }
+ }
+ try {
+ for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) {
+ for (; i < GregTech_API.METATILEENTITIES.length; i++) {
+ if (GregTech_API.METATILEENTITIES[i] != null) {
+ GregTech_API.METATILEENTITIES[i].onServerStart();
+ }
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ public void onServerStarted() {
+ GregTech_API.sWirelessRedstone.clear();
+ GT_MetaTileEntity_DroneCentre.getCentreMap()
+ .clear();
+ GT_Log.out.println(
+ "GT_Mod: Cleaning up all OreDict Crafting Recipes, which have an empty List in them, since they are never meeting any Condition.");
+ List<IRecipe> tList = CraftingManager.getInstance()
+ .getRecipeList();
+ for (int i = 0; i < tList.size(); i++) {
+ if ((tList.get(i) instanceof ShapedOreRecipe)) {
+ for (Object tObject : ((ShapedOreRecipe) tList.get(i)).getInput()) {
+ if (((tObject instanceof List)) && (((List<?>) tObject).isEmpty())) {
+ tList.remove(i--);
+ break;
+ }
+ }
+ } else if ((tList.get(i) instanceof ShapelessOreRecipe)) {
+ for (Object tObject : ((ShapelessOreRecipe) tList.get(i)).getInput()) {
+ if (((tObject instanceof List)) && (((List<?>) tObject).isEmpty())) {
+ tList.remove(i--);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ public void onServerStopping() {
+ File tSaveDirectory = getSaveDirectory();
+ GregTech_API.sWirelessRedstone.clear();
+ if (tSaveDirectory != null) {
+ try {
+ for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) {
+ for (; i < GregTech_API.METATILEENTITIES.length; i++) {
+ if (GregTech_API.METATILEENTITIES[i] != null) {
+ GregTech_API.METATILEENTITIES[i].onWorldSave(tSaveDirectory);
+ }
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ this.mUniverse = null;
+ // GT_ChunkAssociatedData.saveAll(); todo: figure out if this is needed
+
+ }
+
+ @SubscribeEvent
+ public void onClientConnectedToServerEvent(FMLNetworkEvent.ClientConnectedToServerEvent aEvent) {}
+
+ /**
+ * Tells {@link gregtech.nei.GT_NEI_DefaultHandler} to reload recipes.
+ */
+ public void reloadNEICache() {}
+
+ /**
+ * Logging in to server or {@link #reloadNEICache} being called increases the count.
+ */
+ public int getNEIReloadCount() {
+ return 0;
+ }
+
+ @SubscribeEvent
+ public void onArrowNockEvent(ArrowNockEvent aEvent) {
+ if ((!aEvent.isCanceled()) && (GT_Utility.isStackValid(aEvent.result))
+ && (GT_Utility.getProjectile(SubTag.PROJECTILE_ARROW, aEvent.entityPlayer.inventory) != null)) {
+ aEvent.entityPlayer.setItemInUse(
+ aEvent.result,
+ aEvent.result.getItem()
+ .getMaxItemUseDuration(aEvent.result));
+ aEvent.setCanceled(true);
+ }
+ }
+
+ @SubscribeEvent
+ public void onArrowLooseEvent(ArrowLooseEvent aEvent) {
+ ItemStack aArrow = GT_Utility.getProjectile(SubTag.PROJECTILE_ARROW, aEvent.entityPlayer.inventory);
+ if ((!aEvent.isCanceled()) && (GT_Utility.isStackValid(aEvent.bow))
+ && (aArrow != null)
+ && ((aEvent.bow.getItem() instanceof ItemBow))) {
+ float tSpeed = aEvent.charge / 20.0F;
+ tSpeed = (tSpeed * tSpeed + tSpeed * 2.0F) / 3.0F;
+ if (tSpeed < 0.1D) {
+ return;
+ }
+ if (tSpeed > 1.0D) {
+ tSpeed = 1.0F;
+ }
+ EntityArrow tArrowEntity = ((IProjectileItem) aArrow.getItem()).getProjectile(
+ SubTag.PROJECTILE_ARROW,
+ aArrow,
+ aEvent.entityPlayer.worldObj,
+ aEvent.entityPlayer,
+ tSpeed * 2.0F);
+ if (tSpeed >= 1.0F) {
+ tArrowEntity.setIsCritical(true);
+ }
+ int tLevel = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, aEvent.bow);
+ if (tLevel > 0) {
+ tArrowEntity.setDamage(tArrowEntity.getDamage() + tLevel * 0.5D + 0.5D);
+ }
+ tLevel = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, aEvent.bow);
+ if (tLevel > 0) {
+ tArrowEntity.setKnockbackStrength(tLevel);
+ }
+ tLevel = EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, aEvent.bow);
+ if (tLevel > 0) {
+ tArrowEntity.setFire(tLevel * 100);
+ }
+ aEvent.bow.damageItem(1, aEvent.entityPlayer);
+ aEvent.bow.getItem();
+
+ new WorldSpawnedEventBuilder.SoundAtEntityEventBuilder().setPitch(0.64893958288F + tSpeed * 0.5F)
+ .setVolume(1f)
+ .setIdentifier(SoundResource.RANDOM_BOW)
+ .setEntity(aEvent.entityPlayer)
+ .setWorld(aEvent.entityPlayer.worldObj)
+ .run();
+
+ tArrowEntity.canBePickedUp = 1;
+ if (!aEvent.entityPlayer.capabilities.isCreativeMode) {
+ aArrow.stackSize -= 1;
+ }
+ if (aArrow.stackSize == 0) {
+ GT_Utility.removeNullStacksFromInventory(aEvent.entityPlayer.inventory);
+ }
+ if (!aEvent.entityPlayer.worldObj.isRemote) {
+ aEvent.entityPlayer.worldObj.spawnEntityInWorld(tArrowEntity);
+ }
+ aEvent.setCanceled(true);
+ }
+ }
+
+ @SubscribeEvent
+ public void onEndermanTeleportEvent(EnderTeleportEvent aEvent) {
+ if (((aEvent.entityLiving instanceof EntityEnderman))
+ && (aEvent.entityLiving.getActivePotionEffect(Potion.weakness) != null)) {
+ aEvent.setCanceled(true);
+ }
+ }
+
+ @SubscribeEvent
+ public void onEntitySpawningEvent(EntityJoinWorldEvent aEvent) {
+ if ((aEvent.entity != null) && (!aEvent.entity.worldObj.isRemote)) {
+ if ((aEvent.entity instanceof EntityItem)) {
+ ((EntityItem) aEvent.entity).setEntityItemStack(
+ GT_OreDictUnificator.get(true, ((EntityItem) aEvent.entity).getEntityItem(), true));
+ }
+ if ((this.mSkeletonsShootGTArrows > 0) && (aEvent.entity.getClass() == EntityArrow.class)
+ && (aEvent.entity.worldObj.rand.nextInt(this.mSkeletonsShootGTArrows) == 0)
+ && ((((EntityArrow) aEvent.entity).shootingEntity instanceof EntitySkeleton))) {
+ aEvent.entity.worldObj.spawnEntityInWorld(
+ new GT_Entity_Arrow(
+ (EntityArrow) aEvent.entity,
+ OrePrefixes.arrowGtWood.mPrefixedItems
+ .get(aEvent.entity.worldObj.rand.nextInt(OrePrefixes.arrowGtWood.mPrefixedItems.size()))));
+ aEvent.entity.setDead();
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void onOreGenEvent(OreGenEvent.GenerateMinable aGenerator) {
+ if ((this.mDisableVanillaOres) && ((aGenerator.generator instanceof WorldGenMinable))
+ && (PREVENTED_ORES.contains(aGenerator.type))) {
+ aGenerator.setResult(Result.DENY);
+ }
+ }
+
+ private String getDataAndTime() {
+ return this.mDateFormat.format(new Date());
+ }
+
+ @SubscribeEvent
+ public void onPlayerInteraction(PlayerInteractEvent aEvent) {
+ if ((aEvent.entityPlayer == null) || (aEvent.entityPlayer.worldObj == null)
+ || (aEvent.action == null)
+ || (aEvent.world.provider == null)) {
+ return;
+ }
+ if ((!aEvent.entityPlayer.worldObj.isRemote) && (aEvent.action != PlayerInteractEvent.Action.RIGHT_CLICK_AIR)
+ && (GT_Log.pal != null)) {
+ this.mBufferedPlayerActivity.offer(
+ getDataAndTime() + ";"
+ + aEvent.action.name()
+ + ";"
+ + aEvent.entityPlayer.getDisplayName()
+ + ";DIM:"
+ + aEvent.world.provider.dimensionId
+ + ";"
+ + aEvent.x
+ + ";"
+ + aEvent.y
+ + ";"
+ + aEvent.z
+ + ";|;"
+ + aEvent.x / 10
+ + ";"
+ + aEvent.y / 10
+ + ";"
+ + aEvent.z / 10);
+ }
+ ItemStack aStack = aEvent.entityPlayer.getCurrentEquippedItem();
+ if ((aStack != null) && (aEvent.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK)
+ && (aStack.getItem() == Items.flint_and_steel)) {
+ if ((!aEvent.world.isRemote) && (!aEvent.entityPlayer.capabilities.isCreativeMode)
+ && (aEvent.world.rand.nextInt(100) >= this.mFlintChance)) {
+ aEvent.setCanceled(true);
+ aStack.damageItem(1, aEvent.entityPlayer);
+ if (aStack.getItemDamage() >= aStack.getMaxDamage()) {
+ aStack.stackSize -= 1;
+ }
+ if (aStack.stackSize <= 0) {
+ ForgeEventFactory.onPlayerDestroyItem(aEvent.entityPlayer, aStack);
+ }
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void onBlockBreakingEvent(BlockEvent.BreakEvent event) {
+ EntityPlayer player = event.getPlayer();
+ if (player == null) return;
+
+ ItemStack item = event.getPlayer()
+ .getCurrentEquippedItem();
+ if (item == null) return;
+
+ if (!(item.getItem() instanceof GT_MetaGenerated_Tool tool)) return;
+
+ IToolStats stats = tool.getToolStats(item);
+ if (stats == null) return;
+
+ TileEntity tile = event.world.getTileEntity(event.x, event.y, event.z);
+ stats.onBreakBlock(player, event.x, event.y, event.z, event.block, (byte) event.blockMetadata, tile, event);
+ }
+
+ @SubscribeEvent
+ public void onBlockHarvestingEvent(BlockEvent.HarvestDropsEvent aEvent) {
+ if (aEvent.harvester == null) return;
+
+ if ((!aEvent.world.isRemote) && (GT_Log.pal != null)) {
+ this.mBufferedPlayerActivity.offer(
+ getDataAndTime() + ";HARVEST_BLOCK;"
+ + aEvent.harvester.getDisplayName()
+ + ";DIM:"
+ + aEvent.world.provider.dimensionId
+ + ";"
+ + aEvent.x
+ + ";"
+ + aEvent.y
+ + ";"
+ + aEvent.z
+ + ";|;"
+ + aEvent.x / 10
+ + ";"
+ + aEvent.y / 10
+ + ";"
+ + aEvent.z / 10);
+ }
+
+ ItemStack aStack = aEvent.harvester.getCurrentEquippedItem();
+ if (aStack == null) return;
+
+ if ((aStack.getItem() instanceof GT_MetaGenerated_Tool tool)) {
+ tool.onHarvestBlockEvent(
+ aEvent.drops,
+ aStack,
+ aEvent.harvester,
+ aEvent.block,
+ aEvent.x,
+ aEvent.y,
+ aEvent.z,
+ (byte) aEvent.blockMetadata,
+ aEvent.fortuneLevel,
+ aEvent.isSilkTouching,
+ aEvent);
+ }
+ if (EnchantmentHelper.getEnchantmentLevel(Enchantment.fireAspect.effectId, aStack) > 2) {
+ try {
+ for (ItemStack tDrop : aEvent.drops) {
+ ItemStack tSmeltingOutput = GT_ModHandler.getSmeltingOutput(tDrop, false, null);
+ if (tSmeltingOutput != null) {
+ tDrop.stackSize *= tSmeltingOutput.stackSize;
+ tSmeltingOutput.stackSize = tDrop.stackSize;
+ GT_Utility.setStack(tDrop, tSmeltingOutput);
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ }
+
+ @SubscribeEvent
+ public void registerOre(OreDictionary.OreRegisterEvent aEvent) {
+ ModContainer tContainer = Loader.instance()
+ .activeModContainer();
+ String aMod = tContainer == null ? "UNKNOWN" : tContainer.getModId();
+ String aOriginalMod = aMod;
+ if (GT_OreDictUnificator.isRegisteringOres()) {
+ aMod = GregTech.ID;
+ } else if (aMod.equals(GregTech.ID)) {
+ aMod = "UNKNOWN";
+ }
+ if ((aEvent == null) || (aEvent.Ore == null)
+ || (aEvent.Ore.getItem() == null)
+ || (aEvent.Name == null)
+ || (aEvent.Name.isEmpty())
+ || (aEvent.Name.replaceAll("_", "")
+ .length() - aEvent.Name.length() == 9)) {
+ if (aOriginalMod.equals(GregTech.ID)) {
+ aOriginalMod = "UNKNOWN";
+ }
+ GT_Log.ore.println(
+ aOriginalMod
+ + " did something very bad! The registration is too invalid to even be shown properly. This happens only if you register null, invalid Items, empty Strings or even nonexisting Events to the OreDict.");
+ throw new IllegalArgumentException(
+ aOriginalMod
+ + " did something very bad! The registration is too invalid to even be shown properly. This happens only if you register null, invalid Items, empty Strings or even nonexisting Events to the OreDict.");
+ }
+ try {
+ aEvent.Ore.stackSize = 1;
+ if (this.mIgnoreTcon || aEvent.Ore.getUnlocalizedName()
+ .startsWith("item.oreberry")) {
+ if ((aOriginalMod.toLowerCase(Locale.ENGLISH)
+ .contains("xycraft"))
+ || (aOriginalMod.toLowerCase(Locale.ENGLISH)
+ .contains("tconstruct"))
+ || ((aOriginalMod.toLowerCase(Locale.ENGLISH)
+ .contains("natura"))
+ && (!aOriginalMod.toLowerCase(Locale.ENGLISH)
+ .contains("natural")))) {
+ if (GT_Values.D1) {
+ GT_Log.ore.println(aMod + " -> " + aEvent.Name + " is getting ignored, because of racism. :P");
+ }
+ return;
+ }
+ }
+ String tModToName = aMod + " -> " + aEvent.Name;
+ if ((this.mOreDictActivated) || (GregTech_API.sPostloadStarted)
+ || ((this.mSortToTheEnd) && (GregTech_API.sLoadFinished))) {
+ tModToName = aOriginalMod + " --Late--> " + aEvent.Name;
+ }
+ if (((aEvent.Ore.getItem() instanceof ItemBlock))
+ || (GT_Utility.getBlockFromStack(aEvent.Ore) != Blocks.air)) {
+ GT_OreDictUnificator.addToBlacklist(aEvent.Ore);
+ }
+ this.mRegisteredOres.add(aEvent.Ore);
+ if (this.mIgnoredItems.contains(aEvent.Name)) {
+ if ((aEvent.Name.startsWith("item"))) {
+ GT_Log.ore.println(tModToName);
+ if (aEvent.Name.equals("itemCopperWire")) {
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingWireCopper, aEvent.Ore);
+ }
+ if (aEvent.Name.equals("itemRubber")) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.ingot, Materials.Rubber, aEvent.Ore);
+ }
+ return;
+ }
+ } else if (this.mIgnoredNames.contains(aEvent.Name)) {
+ GT_Log.ore.println(tModToName + " is getting ignored via hardcode.");
+ return;
+ } else if (aEvent.Name.equals("stone")) {
+ GT_OreDictUnificator.registerOre("stoneSmooth", aEvent.Ore);
+ return;
+ } else if (aEvent.Name.equals("cobblestone")) {
+ GT_OreDictUnificator.registerOre("stoneCobble", aEvent.Ore);
+ return;
+ } else if ((aEvent.Name.contains("|")) || (aEvent.Name.contains("*"))
+ || (aEvent.Name.contains(":"))
+ || (aEvent.Name.contains("."))
+ || (aEvent.Name.contains("$"))) {
+ GT_Log.ore
+ .println(tModToName + " is using a private Prefix and is therefor getting ignored properly.");
+ return;
+ } else if (aEvent.Name.equals("copperWire")) {
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingWireCopper, aEvent.Ore);
+ } else if (aEvent.Name.equals("oreHeeEndrium")) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.ore, Materials.HeeEndium, aEvent.Ore);
+ } else if (aEvent.Name.equals("sheetPlastic")) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.plate, Materials.Plastic, aEvent.Ore);
+ } else if (aEvent.Name.startsWith("shard")) {
+ switch (aEvent.Name) {
+ case "shardAir" -> {
+ GT_OreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedAir, aEvent.Ore);
+ return;
+ }
+ case "shardWater" -> {
+ GT_OreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedWater, aEvent.Ore);
+ return;
+ }
+ case "shardFire" -> {
+ GT_OreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedFire, aEvent.Ore);
+ return;
+ }
+ case "shardEarth" -> {
+ GT_OreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedEarth, aEvent.Ore);
+ return;
+ }
+ case "shardOrder" -> {
+ GT_OreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedOrder, aEvent.Ore);
+ return;
+ }
+ case "shardEntropy" -> {
+ GT_OreDictUnificator.registerOre(OrePrefixes.gem, Materials.InfusedEntropy, aEvent.Ore);
+ return;
+ }
+ }
+ } else if (aEvent.Name.equals("fieryIngot")) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.ingot, Materials.FierySteel, aEvent.Ore);
+ return;
+ } else if (aEvent.Name.equals("ironwood")) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.ingot, Materials.IronWood, aEvent.Ore);
+ return;
+ } else if (aEvent.Name.equals("steeleaf")) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.ingot, Materials.Steeleaf, aEvent.Ore);
+ return;
+ } else if (aEvent.Name.equals("knightmetal")) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.ingot, Materials.Knightmetal, aEvent.Ore);
+ return;
+ } else if (aEvent.Name.equals("compressedAluminum")) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.compressed, Materials.Aluminium, aEvent.Ore);
+ return;
+ } else if (aEvent.Name.contains(" ")) {
+ GT_Log.ore.println(
+ tModToName + " is getting re-registered because the OreDict Name containing invalid spaces.");
+ GT_OreDictUnificator
+ .registerOre(aEvent.Name.replaceAll(" ", ""), GT_Utility.copyAmount(1, aEvent.Ore));
+ aEvent.Ore.setStackDisplayName("Invalid OreDictionary Tag");
+ return;
+ } else if (this.mInvalidNames.contains(aEvent.Name)) {
+ GT_Log.ore.println(tModToName + " is wrongly registered and therefor getting ignored.");
+
+ return;
+ }
+ OrePrefixes aPrefix = OrePrefixes.getOrePrefix(aEvent.Name);
+ Materials aMaterial = Materials._NULL;
+ if ((aPrefix == OrePrefixes.nugget) && (aMod.equals(Thaumcraft.ID))
+ && (aEvent.Ore.getItem()
+ .getUnlocalizedName()
+ .contains("ItemResource"))) {
+ return;
+ }
+ if (aPrefix == null) {
+ if (aEvent.Name.toLowerCase()
+ .equals(aEvent.Name)) {
+ GT_Log.ore.println(tModToName + " is invalid due to being solely lowercased.");
+ return;
+ } else if (aEvent.Name.toUpperCase()
+ .equals(aEvent.Name)) {
+ GT_Log.ore.println(tModToName + " is invalid due to being solely uppercased.");
+ return;
+ } else if (Character.isUpperCase(aEvent.Name.charAt(0))) {
+ GT_Log.ore.println(tModToName + " is invalid due to the first character being uppercased.");
+ }
+ } else {
+ if (aPrefix.mDontUnificateActively) {
+ GT_OreDictUnificator.addToBlacklist(aEvent.Ore);
+ }
+ if (aPrefix != aPrefix.mPrefixInto) {
+ String tNewName = aEvent.Name.replaceFirst(aPrefix.toString(), aPrefix.mPrefixInto.toString());
+ if (!GT_OreDictUnificator.isRegisteringOres()) {
+ GT_Log.ore.println(
+ tModToName + " uses a depricated Prefix, and is getting re-registered as " + tNewName);
+ }
+ GT_OreDictUnificator.registerOre(tNewName, aEvent.Ore);
+ return;
+ }
+ String tName = aEvent.Name.replaceFirst(aPrefix.toString(), "");
+ if (tName.length() > 0) {
+ char firstChar = tName.charAt(0);
+ if (Character.isUpperCase(firstChar) || Character.isLowerCase(firstChar)
+ || firstChar == '_'
+ || Character.isDigit(firstChar)) {
+ if (aPrefix.mIsMaterialBased) {
+ aMaterial = Materials.get(tName);
+ if (aMaterial != aMaterial.mMaterialInto) {
+ GT_OreDictUnificator.registerOre(aPrefix, aMaterial.mMaterialInto, aEvent.Ore);
+ if (!GT_OreDictUnificator.isRegisteringOres()) {
+ GT_Log.ore.println(
+ tModToName + " uses a deprecated Material and is getting re-registered as "
+ + aPrefix.get(aMaterial.mMaterialInto));
+ }
+ return;
+ }
+ if (!aPrefix.isIgnored(aMaterial)) {
+ aPrefix.add(GT_Utility.copyAmount(1, aEvent.Ore));
+ }
+ if (aMaterial != Materials._NULL) {
+ Materials tReRegisteredMaterial;
+ for (Iterator<Materials> i$ = aMaterial.mOreReRegistrations.iterator(); i$
+ .hasNext(); GT_OreDictUnificator
+ .registerOre(aPrefix, tReRegisteredMaterial, aEvent.Ore)) {
+ tReRegisteredMaterial = i$.next();
+ }
+ aMaterial.add(GT_Utility.copyAmount(1, aEvent.Ore));
+
+ if (GregTech_API.sThaumcraftCompat != null && aPrefix.doGenerateItem(aMaterial)
+ && !aPrefix.isIgnored(aMaterial)) {
+ List<TC_AspectStack> tAspects = new ArrayList<>();
+ for (TC_AspectStack tAspect : aPrefix.mAspects) tAspect.addToAspectList(tAspects);
+ if (aPrefix.mMaterialAmount >= 3628800 || aPrefix.mMaterialAmount < 0)
+ for (TC_AspectStack tAspect : aMaterial.mAspects)
+ tAspect.addToAspectList(tAspects);
+ GregTech_API.sThaumcraftCompat.registerThaumcraftAspectsToItem(
+ GT_Utility.copyAmount(1, aEvent.Ore),
+ tAspects,
+ aEvent.Name);
+ }
+
+ switch (aPrefix) {
+ case crystal -> {
+ if ((aMaterial == Materials.CertusQuartz)
+ || (aMaterial == Materials.NetherQuartz)
+ || (aMaterial == Materials.Fluix)) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.gem, aMaterial, aEvent.Ore);
+ }
+ }
+ case gem -> {
+ if (aMaterial == Materials.Lapis || aMaterial == Materials.Sodalite) {
+ GT_OreDictUnificator.registerOre(Dyes.dyeBlue, aEvent.Ore);
+ } else if (aMaterial == Materials.Lazurite) {
+ GT_OreDictUnificator.registerOre(Dyes.dyeCyan, aEvent.Ore);
+ } else
+ if (aMaterial == Materials.InfusedAir || aMaterial == Materials.InfusedWater
+ || aMaterial == Materials.InfusedFire
+ || aMaterial == Materials.InfusedEarth
+ || aMaterial == Materials.InfusedOrder
+ || aMaterial == Materials.InfusedEntropy) {
+ GT_OreDictUnificator.registerOre(
+ aMaterial.mName.replaceFirst("Infused", "shard"),
+ aEvent.Ore);
+ } else if (aMaterial == Materials.Chocolate) {
+ GT_OreDictUnificator.registerOre(Dyes.dyeBrown, aEvent.Ore);
+ } else if (aMaterial == Materials.CertusQuartz
+ || aMaterial == Materials.NetherQuartz) {
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.item.get(aMaterial), aEvent.Ore);
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.crystal, aMaterial, aEvent.Ore);
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingQuartz, aEvent.Ore);
+ } else
+ if (aMaterial == Materials.Fluix || aMaterial == Materials.Quartz
+ || aMaterial == Materials.Quartzite) {
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.crystal,
+ aMaterial,
+ aEvent.Ore);
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingQuartz, aEvent.Ore);
+ }
+ }
+ case cableGt01 -> {
+ if (aMaterial == Materials.Tin) {
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingWireTin, aEvent.Ore);
+ } else if (aMaterial == Materials.AnyCopper) {
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingWireCopper, aEvent.Ore);
+ } else if (aMaterial == Materials.Gold) {
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingWireGold, aEvent.Ore);
+ } else if (aMaterial == Materials.AnyIron) {
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingWireIron, aEvent.Ore);
+ }
+ }
+ case lens -> {
+ if ((aMaterial.contains(SubTag.TRANSPARENT))
+ && (aMaterial.mColor != Dyes._NULL)) {
+ GT_OreDictUnificator.registerOre(
+ "craftingLens" + aMaterial.mColor.toString()
+ .replaceFirst("dye", ""),
+ aEvent.Ore);
+ }
+ }
+ case plate -> {
+ if ((aMaterial == Materials.Plastic) || (aMaterial == Materials.Rubber)) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.sheet, aMaterial, aEvent.Ore);
+ } else if (aMaterial == Materials.Silicon) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.item, aMaterial, aEvent.Ore);
+ } else if (aMaterial == Materials.Wood) {
+ GT_OreDictUnificator.addToBlacklist(aEvent.Ore);
+ GT_OreDictUnificator.registerOre(OrePrefixes.plank, aMaterial, aEvent.Ore);
+ }
+ }
+ case cell -> {
+ if (aMaterial == Materials.Empty) {
+ GT_OreDictUnificator.addToBlacklist(aEvent.Ore);
+ }
+ }
+ case gearGt -> GT_OreDictUnificator
+ .registerOre(OrePrefixes.gear, aMaterial, aEvent.Ore);
+ case stick -> {
+ if (!GT_RecipeRegistrator.sRodMaterialList.contains(aMaterial)) {
+ GT_RecipeRegistrator.sRodMaterialList.add(aMaterial);
+ } else if (aMaterial == Materials.Wood) {
+ GT_OreDictUnificator.addToBlacklist(aEvent.Ore);
+ } else if ((aMaterial == Materials.Tin) || (aMaterial == Materials.Lead)
+ || (aMaterial == Materials.SolderingAlloy)) {
+ GT_OreDictUnificator
+ .registerOre(ToolDictNames.craftingToolSolderingMetal, aEvent.Ore);
+ }
+ }
+ case dust -> {
+ if (aMaterial == Materials.Salt) {
+ GT_OreDictUnificator.registerOre("itemSalt", aEvent.Ore);
+ } else if (aMaterial == Materials.Wood) {
+ GT_OreDictUnificator.registerOre("pulpWood", aEvent.Ore);
+ } else if (aMaterial == Materials.Wheat) {
+ GT_OreDictUnificator.registerOre("foodFlour", aEvent.Ore);
+ } else if (aMaterial == Materials.Lapis) {
+ GT_OreDictUnificator.registerOre(Dyes.dyeBlue, aEvent.Ore);
+ } else if (aMaterial == Materials.Lazurite) {
+ GT_OreDictUnificator.registerOre(Dyes.dyeCyan, aEvent.Ore);
+ } else if (aMaterial == Materials.Sodalite) {
+ GT_OreDictUnificator.registerOre(Dyes.dyeBlue, aEvent.Ore);
+ } else if (aMaterial == Materials.Cocoa) {
+ GT_OreDictUnificator.registerOre(Dyes.dyeBrown, aEvent.Ore);
+ GT_OreDictUnificator.registerOre("foodCocoapowder", aEvent.Ore);
+ } else if (aMaterial == Materials.Coffee) {
+ GT_OreDictUnificator.registerOre(Dyes.dyeBrown, aEvent.Ore);
+ } else if (aMaterial == Materials.BrownLimonite) {
+ GT_OreDictUnificator.registerOre(Dyes.dyeBrown, aEvent.Ore);
+ } else if (aMaterial == Materials.YellowLimonite) {
+ GT_OreDictUnificator.registerOre(Dyes.dyeYellow, aEvent.Ore);
+ }
+ }
+ case ingot -> {
+ if (aMaterial == Materials.Rubber) {
+ GT_OreDictUnificator.registerOre("itemRubber", aEvent.Ore);
+ } else if (aMaterial == Materials.FierySteel) {
+ GT_OreDictUnificator.registerOre("fieryIngot", aEvent.Ore);
+ } else if (aMaterial == Materials.IronWood) {
+ GT_OreDictUnificator.registerOre("ironwood", aEvent.Ore);
+ } else if (aMaterial == Materials.Steeleaf) {
+ GT_OreDictUnificator.registerOre("steeleaf", aEvent.Ore);
+ } else if (aMaterial == Materials.Knightmetal) {
+ GT_OreDictUnificator.registerOre("knightmetal", aEvent.Ore);
+ } else if ((aMaterial == Materials.Brass) && (aEvent.Ore.getItemDamage() == 2)
+ && (aEvent.Ore.getUnlocalizedName()
+ .equals("item.ingotBrass"))
+ && (new ItemStack(aEvent.Ore.getItem(), 1, 0).getUnlocalizedName()
+ .contains("red"))) {
+ GT_OreDictUnificator.set(
+ OrePrefixes.ingot,
+ Materials.RedAlloy,
+ new ItemStack(aEvent.Ore.getItem(), 1, 0));
+ GT_OreDictUnificator.set(
+ OrePrefixes.ingot,
+ Materials.BlueAlloy,
+ new ItemStack(aEvent.Ore.getItem(), 1, 1));
+ GT_OreDictUnificator.set(
+ OrePrefixes.ingot,
+ Materials.Brass,
+ new ItemStack(aEvent.Ore.getItem(), 1, 2));
+ if (!mDisableIC2Cables) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("copperCableItem", 3L))
+ .itemOutputs(new ItemStack(aEvent.Ore.getItem(), 1, 8))
+ .duration(20 * SECONDS)
+ .eut(1)
+ .addTo(wiremillRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("ironCableItem", 6L))
+ .itemOutputs(new ItemStack(aEvent.Ore.getItem(), 1, 9))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(wiremillRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(aEvent.Ore.getItem(), 1, 3))
+ .itemOutputs(new ItemStack(aEvent.Ore.getItem(), 16, 4))
+ .duration(20 * SECONDS)
+ .eut(8)
+ .addTo(cutterRecipes);
+ }
+ }
+ default -> {}
+ }
+ if (aPrefix.mIsUnificatable && !aMaterial.mUnificatable) {
+ return;
+ }
+ } else {
+ for (Dyes tDye : Dyes.VALUES) {
+ if (aEvent.Name.endsWith(
+ tDye.name()
+ .replaceFirst("dye", ""))) {
+ GT_OreDictUnificator.addToBlacklist(aEvent.Ore);
+ GT_Log.ore.println(
+ tModToName
+ + " Oh man, why the fuck would anyone need a OreDictified Color for this, that is even too much for GregTech... do not report this, this is just a random Comment about how ridiculous this is.");
+ return;
+ }
+ }
+ // GT_FML_LOGGER.info("Material Name: "+aEvent.Name+ "
+ // !!!Unknown Material detected!!! Please report to GregTech Intergalactical for
+ // additional compatiblity. This is not an Error, an Issue nor a Lag Source, it is just
+ // an Information, which you should pass to me.");
+ // GT_Log.ore.println(tModToName + " uses an unknown
+ // Material. Report this to GregTech.");
+ return;
+ }
+ } else {
+ aPrefix.add(GT_Utility.copyAmount(1, aEvent.Ore));
+ }
+ }
+ } else if (aPrefix.mIsSelfReferencing) {
+ aPrefix.add(GT_Utility.copyAmount(1, aEvent.Ore));
+ } else {
+ GT_Log.ore.println(tModToName + " uses a Prefix as full OreDict Name, and is therefor invalid.");
+ aEvent.Ore.setStackDisplayName("Invalid OreDictionary Tag");
+ return;
+ }
+ switch (aPrefix) {
+ case dye -> {
+ if (GT_Utility.isStringValid(tName)) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.dye, aEvent.Ore);
+ }
+ }
+ case stoneSmooth -> GT_OreDictUnificator.registerOre("stone", aEvent.Ore);
+ case stoneCobble -> GT_OreDictUnificator.registerOre("cobblestone", aEvent.Ore);
+ case plank -> {
+ if (tName.equals("Wood")) {
+ GT_OreDictUnificator.addItemData(aEvent.Ore, new ItemData(Materials.Wood, 3628800L));
+ }
+ }
+ case slab -> {
+ if (tName.equals("Wood")) {
+ GT_OreDictUnificator.addItemData(aEvent.Ore, new ItemData(Materials.Wood, 1814400L));
+ }
+ }
+ case sheet -> {
+ if (tName.equals("Plastic")) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.plate, Materials.Plastic, aEvent.Ore);
+ } else if (tName.equals("Rubber")) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.plate, Materials.Rubber, aEvent.Ore);
+ }
+ }
+ case crafting -> {
+ switch (tName) {
+ case "ToolSolderingMetal" -> GregTech_API.registerSolderingMetal(aEvent.Ore);
+ case "IndustrialDiamond" -> GT_OreDictUnificator.addToBlacklist(aEvent.Ore);
+ case "WireCopper" -> GT_OreDictUnificator
+ .registerOre(OrePrefixes.wire, Materials.Copper, aEvent.Ore);
+ }
+ }
+ case wood -> {
+ if (tName.equals("Rubber")) {
+ GT_OreDictUnificator.registerOre("logRubber", aEvent.Ore);
+ }
+ }
+ case food -> {
+ if (tName.equals("Cocoapowder")) {
+ GT_OreDictUnificator.registerOre(OrePrefixes.dust, Materials.Cocoa, aEvent.Ore);
+ }
+ }
+ default -> {}
+ }
+ }
+ GT_Log.ore.println(tModToName);
+
+ OreDictEventContainer tOre = new OreDictEventContainer(aEvent, aPrefix, aMaterial, aMod);
+ if ((!this.mOreDictActivated) || (!GregTech_API.sUnificationEntriesRegistered)) {
+ this.mEvents.add(tOre);
+ } else {
+ this.mEvents.clear();
+ }
+ if (this.mOreDictActivated) {
+ registerRecipes(tOre);
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @SuppressWarnings("deprecated")
+ public static void stepMaterialsVanilla(Collection<GT_Proxy.OreDictEventContainer> mEvents,
+ ProgressManager.ProgressBar progressBar) {
+ int size = 5;
+ int sizeStep = mEvents.size() / 20 - 1;
+ GT_Proxy.OreDictEventContainer tEvent;
+ for (Iterator<GT_Proxy.OreDictEventContainer> i$ = mEvents.iterator(); i$.hasNext(); GT_Proxy
+ .registerRecipes(tEvent)) {
+ tEvent = i$.next();
+ sizeStep--;
+ if (sizeStep == 0) {
+ GT_FML_LOGGER.info("Baking : " + size + "%", new Object[0]);
+ sizeStep = mEvents.size() / 20 - 1;
+ size += 5;
+ }
+ progressBar.step(tEvent.mMaterial == null ? "" : tEvent.mMaterial.toString());
+ }
+ ProgressManager.pop(progressBar);
+ }
+
+ @SubscribeEvent
+ public void onLivingUpdate(LivingUpdateEvent aEvent) {
+ if (aEvent.entityLiving.onGround) {
+ int tX = MathHelper.floor_double(aEvent.entityLiving.posX),
+ tY = MathHelper.floor_double(aEvent.entityLiving.boundingBox.minY - 0.001F),
+ tZ = MathHelper.floor_double(aEvent.entityLiving.posZ);
+ Block tBlock = aEvent.entityLiving.worldObj.getBlock(tX, tY, tZ);
+ if (tBlock instanceof IBlockOnWalkOver)
+ ((IBlockOnWalkOver) tBlock).onWalkOver(aEvent.entityLiving, aEvent.entityLiving.worldObj, tX, tY, tZ);
+ }
+ }
+
+ @SubscribeEvent
+ public void onFluidContainerRegistration(FluidContainerRegistry.FluidContainerRegisterEvent aFluidEvent) {
+ if ((aFluidEvent.data.filledContainer.getItem() == Items.potionitem)
+ && (aFluidEvent.data.filledContainer.getItemDamage() == 0)) {
+ aFluidEvent.data.fluid.amount = 0;
+ }
+ GT_OreDictUnificator.addToBlacklist(aFluidEvent.data.emptyContainer);
+ GT_OreDictUnificator.addToBlacklist(aFluidEvent.data.filledContainer);
+ GT_Utility.addFluidContainerData(aFluidEvent.data);
+ }
+
+ @SubscribeEvent
+ public void onServerTickEvent(TickEvent.ServerTickEvent aEvent) {
+ if (aEvent.side.isServer()) {
+ if (aEvent.phase == TickEvent.Phase.START) {
+ TICK_LOCK.lock();
+
+ } else {
+ TICK_LOCK.unlock();
+ }
+
+ // Making sure it is being freed up in order to prevent exploits or Garbage Collection mishaps.
+ LAST_BROKEN_TILEENTITY.set(null);
+ }
+ }
+
+ @SubscribeEvent
+ public void onWorldTickEvent(TickEvent.WorldTickEvent aEvent) {
+ if (aEvent.world.provider.dimensionId == 0) mTicksUntilNextCraftSound--;
+ if (isFirstWorldTick) {
+ for (Runnable runnable : GregTech_API.sFirstWorldTick) runnable.run();
+ isFirstWorldTick = false;
+ GT_Values.worldTickHappened = true;
+ }
+ if (aEvent.side.isServer()) {
+ if (this.mUniverse == null) {
+ this.mUniverse = aEvent.world;
+ }
+ if (this.isFirstServerWorldTick) {
+ File tSaveDiretory = getSaveDirectory();
+ if (tSaveDiretory != null) {
+ this.isFirstServerWorldTick = false;
+ try {
+ for (IMetaTileEntity tMetaTileEntity : GregTech_API.METATILEENTITIES) {
+ if (tMetaTileEntity != null) {
+ tMetaTileEntity.onWorldLoad(tSaveDiretory);
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ if ((aEvent.world.getTotalWorldTime() % 100L == 0L)
+ && ((this.mItemDespawnTime != 6000) || (this.mMaxEqualEntitiesAtOneSpot > 0))) {
+ long startTime = System.nanoTime();
+ double oldX = 0, oldY = 0, oldZ = 0;
+ if (debugEntityCramming && (aEvent.world.loadedEntityList.size() != 0)) {
+ GT_Log.out.println("CRAM: Entity list size " + aEvent.world.loadedEntityList.size());
+ }
+ for (int i = 0; i < aEvent.world.loadedEntityList.size(); i++) {
+ if ((aEvent.world.loadedEntityList.get(i) instanceof Entity)) {
+ Entity tEntity = aEvent.world.loadedEntityList.get(i);
+ if (((tEntity instanceof EntityItem)) && (this.mItemDespawnTime != 6000)
+ && (((EntityItem) tEntity).lifespan == 6000)) {
+ ((EntityItem) tEntity).lifespan = this.mItemDespawnTime;
+ } else if (((tEntity instanceof EntityLivingBase)) && (this.mMaxEqualEntitiesAtOneSpot > 0)
+ && (!(tEntity instanceof EntityPlayer))
+ && (tEntity.canBePushed())
+ && (((EntityLivingBase) tEntity).getHealth() > 0.0F)) {
+ List<Entity> tList = tEntity.worldObj.getEntitiesWithinAABBExcludingEntity(
+ tEntity,
+ tEntity.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D));
+ Class<? extends Entity> tClass = tEntity.getClass();
+ int tEntityCount = 1;
+ if (tList != null) {
+ for (Object o : tList) {
+ if ((o != null) && (o.getClass() == tClass)) {
+ tEntityCount++;
+ }
+ }
+ }
+ if (tEntityCount > this.mMaxEqualEntitiesAtOneSpot) {
+ if (debugEntityCramming) {
+ // Cheeseball way of not receiving a bunch of spam caused by 1 location
+ // obviously fails if there are crammed entities in more than one spot.
+ if (tEntity.posX != oldX && tEntity.posY != oldY && tEntity.posZ != oldZ) {
+ GT_Log.out.println(
+ "CRAM: Excess entities: " + tEntityCount
+ + " at X "
+ + tEntity.posX
+ + " Y "
+ + tEntity.posY
+ + " Z "
+ + tEntity.posZ);
+ oldX = tEntity.posX;
+ oldY = tEntity.posY;
+ oldZ = tEntity.posZ;
+ }
+ }
+ tEntity.attackEntityFrom(
+ DamageSource.inWall,
+ tEntityCount - this.mMaxEqualEntitiesAtOneSpot);
+ }
+ }
+ }
+ }
+ if (debugEntityCramming && (aEvent.world.loadedEntityList.size() != 0)) {
+ GT_Log.out.println(
+ "CRAM: Time spent checking " + (System.nanoTime() - startTime) / 1000 + " microseconds");
+ }
+ }
+
+ GT_Pollution.onWorldTick(aEvent);
+ }
+ }
+
+ @SubscribeEvent
+ public void onWorldUnload(WorldEvent.Unload event) {
+ for (TileEntity tileEntity : event.world.loadedTileEntityList) {
+ if (tileEntity instanceof IGregTechTileEntity) {
+ tileEntity.onChunkUnload();
+ }
+ }
+ }
+
+ public static void registerRecipes(GT_Proxy.OreDictEventContainer aOre) {
+ if ((aOre.mEvent.Ore == null) || (aOre.mEvent.Ore.getItem() == null)) {
+ return;
+ }
+ if (aOre.mEvent.Ore.stackSize != 1) {
+ aOre.mEvent.Ore.stackSize = 1;
+ }
+ if (aOre.mPrefix != null) {
+ if (!aOre.mPrefix.isIgnored(aOre.mMaterial)) {
+ aOre.mPrefix.processOre(
+ aOre.mMaterial == null ? Materials._NULL : aOre.mMaterial,
+ aOre.mEvent.Name,
+ aOre.mModID,
+ GT_Utility.copyAmount(1, aOre.mEvent.Ore));
+ }
+ } else {
+ // GT_FML_LOGGER.info("Thingy Name: "+ aOre.mEvent.Name+ " !!!Unknown 'Thingy' detected!!! This
+ // Object seems to probably not follow a valid OreDictionary Convention, or I missed a Convention. Please
+ // report to GregTech Intergalactical for additional compatiblity. This is not an Error, an Issue nor a Lag
+ // Source, it is just an Information, which you should pass to me.");
+ }
+ }
+
+ @SubscribeEvent
+ public void onPlayerTickEventServer(TickEvent.PlayerTickEvent aEvent) {
+ if ((aEvent.side.isServer()) && (aEvent.phase == TickEvent.Phase.END) && (!aEvent.player.isDead)) {
+ if ((aEvent.player.ticksExisted % 200 == 0) && (aEvent.player.capabilities.allowEdit)
+ && (!aEvent.player.capabilities.isCreativeMode)
+ && (this.mSurvivalIntoAdventure)) {
+ aEvent.player.setGameType(GameType.ADVENTURE);
+ aEvent.player.capabilities.allowEdit = false;
+ if (this.mAxeWhenAdventure) {
+ GT_Utility.sendChatToPlayer(
+ aEvent.player,
+ GT_LanguageManager.addStringLocalization(
+ "Interaction_DESCRIPTION_Index_097",
+ "It's dangerous to go alone! Take this."));
+ aEvent.player.worldObj.spawnEntityInWorld(
+ new EntityItem(
+ aEvent.player.worldObj,
+ aEvent.player.posX,
+ aEvent.player.posY,
+ aEvent.player.posZ,
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.AXE,
+ 1,
+ Materials.Flint,
+ Materials.Wood,
+ null)));
+ }
+ }
+ final boolean tHungerEffect = (this.mHungerEffect) && (aEvent.player.ticksExisted % 2400 == 1200);
+ if (aEvent.player.ticksExisted % 120 == 0) {
+ int tCount = 64;
+ for (int i = 0; i < 36; i++) {
+ final ItemStack tStack;
+ if ((tStack = aEvent.player.inventory.getStackInSlot(i)) != null) {
+ if (!aEvent.player.capabilities.isCreativeMode) {
+ GT_Utility.applyRadioactivity(
+ aEvent.player,
+ GT_Utility.getRadioactivityLevel(tStack),
+ tStack.stackSize);
+ final float tHeat = GT_Utility.getHeatDamageFromItem(tStack);
+ if (tHeat != 0.0F) {
+ if (tHeat > 0.0F) {
+ GT_Utility.applyHeatDamageFromItem(aEvent.player, tHeat, tStack);
+ } else {
+ GT_Utility.applyFrostDamage(aEvent.player, -tHeat);
+ }
+ }
+ }
+ if (tHungerEffect) {
+ tCount += tStack.stackSize * 64 / Math.max(1, tStack.getMaxStackSize());
+ }
+ if (this.mInventoryUnification) {
+ GT_OreDictUnificator.setStack(true, tStack);
+ }
+ }
+ }
+ for (int i = 0; i < 4; i++) {
+ final ItemStack tStack;
+ if ((tStack = aEvent.player.inventory.armorInventory[i]) != null) {
+ if (!aEvent.player.capabilities.isCreativeMode) {
+ GT_Utility.applyRadioactivity(
+ aEvent.player,
+ GT_Utility.getRadioactivityLevel(tStack),
+ tStack.stackSize);
+ final float tHeat = GT_Utility.getHeatDamageFromItem(tStack);
+ if (tHeat != 0.0F) {
+ if (tHeat > 0.0F) {
+ GT_Utility.applyHeatDamageFromItem(aEvent.player, tHeat, tStack);
+ } else {
+ GT_Utility.applyFrostDamage(aEvent.player, -tHeat);
+ }
+ }
+ }
+ if (tHungerEffect) {
+ tCount += 256;
+ }
+ }
+ }
+ if (tHungerEffect) {
+ aEvent.player.addExhaustion(Math.max(1.0F, tCount / 666.6F));
+ }
+ }
+ }
+ }
+
+ public GT_ClientPreference getClientPreference(UUID aPlayerID) {
+ return mClientPrefernces.get(aPlayerID);
+ }
+
+ public void setClientPreference(UUID aPlayerID, GT_ClientPreference aPreference) {
+ mClientPrefernces.put(aPlayerID, aPreference);
+ }
+
+ @Override
+ public Object getServerGuiElement(int aID, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ) {
+ if (aID >= 1000) {
+ return null;
+ }
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if ((tTileEntity instanceof IGregTechTileEntity)) {
+ if (GUI_ID_COVER_SIDE_BASE <= aID && aID < GUI_ID_COVER_SIDE_BASE + 6) {
+ return null;
+ }
+ final IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity();
+ if (tMetaTileEntity != null && !tMetaTileEntity.useModularUI()) {
+ return tMetaTileEntity.getServerGUI(aID, aPlayer.inventory, (IGregTechTileEntity) tTileEntity);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Object getClientGuiElement(int aID, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ) {
+ if (aID >= 1000) {
+ return null;
+ }
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if ((tTileEntity instanceof IGregTechTileEntity tile)) {
+
+ if (GUI_ID_COVER_SIDE_BASE <= aID && aID < GUI_ID_COVER_SIDE_BASE + 6) {
+ final ForgeDirection side = ForgeDirection
+ .getOrientation((byte) (aID - GT_Proxy.GUI_ID_COVER_SIDE_BASE));
+ GT_CoverBehaviorBase<?> cover = tile.getCoverBehaviorAtSideNew(side);
+
+ if (cover.hasCoverGUI() && !cover.useModularUI()) {
+ return cover.getClientGUI(
+ side,
+ tile.getCoverIDAtSide(side),
+ tile.getComplexCoverDataAtSide(side),
+ tile,
+ aPlayer,
+ aWorld);
+ }
+ return null;
+ }
+ final IMetaTileEntity tMetaTileEntity = tile.getMetaTileEntity();
+ if (tMetaTileEntity != null && !tMetaTileEntity.useModularUI()) {
+ return tMetaTileEntity.getClientGUI(aID, aPlayer.inventory, tile);
+ }
+ }
+ return null;
+ }
+
+ private static List<String> getOreDictNames(ItemStack stack) {
+ return Arrays.stream(OreDictionary.getOreIDs(stack))
+ .mapToObj(OreDictionary::getOreName)
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public int getBurnTime(ItemStack aFuel) {
+ if ((aFuel == null) || (aFuel.getItem() == null)) {
+ return 0;
+ }
+ int rFuelValue = 0;
+ if ((aFuel.getItem() instanceof GT_MetaGenerated_Item)) {
+ final Short tFuelValue = ((GT_MetaGenerated_Item) aFuel.getItem()).mBurnValues
+ .get((short) aFuel.getItemDamage());
+ if (tFuelValue != null) {
+ rFuelValue = Math.max(rFuelValue, tFuelValue);
+ }
+ }
+ final NBTTagCompound tNBT = aFuel.getTagCompound();
+ if (tNBT != null) {
+ // See if we have something defined by NBT
+ final short tValue = tNBT.getShort("GT.ItemFuelValue");
+ rFuelValue = Math.max(rFuelValue, tValue);
+ } else {
+ // If not check the ore dict
+ rFuelValue = Math.max(
+ rFuelValue,
+ getOreDictNames(aFuel).stream()
+ .mapToInt(f -> oreDictBurnTimes.getOrDefault(f, 0))
+ .max()
+ .orElse(0));
+ }
+
+ // If we have something from the GT MetaGenerated_Item, ItemFuelValue, or OreDict return
+ if (rFuelValue > 0) return rFuelValue;
+
+ // Otherwise, a few more checks
+ if (GT_Utility.areStacksEqual(aFuel, new ItemStack(Blocks.wooden_button, 1))) return 150;
+ else if (GT_Utility.areStacksEqual(aFuel, new ItemStack(Blocks.ladder, 1))) return 100;
+ else if (GT_Utility.areStacksEqual(aFuel, new ItemStack(Items.sign, 1))) return 600;
+ else if (GT_Utility.areStacksEqual(aFuel, new ItemStack(Items.wooden_door, 1))) return 600;
+ else if (GT_Utility.areStacksEqual(aFuel, ItemList.Block_MSSFUEL.get(1))) return 150000;
+ else if (GT_Utility.areStacksEqual(aFuel, ItemList.Block_SSFUEL.get(1))) return 100000;
+
+ return 0;
+ }
+
+ // ------------------------ Adds all fluids corresponding to materials ------------------------
+
+ public Fluid addAutoGeneratedCorrespondingFluid(Materials aMaterial) {
+ // If the fluid is registered as custom inside the Material's constructor then to add custom fluid
+ // textures go to blocks/fluids and place the .png. File should be called fluid.fluid.{unlocalised_name}.png.
+ // All lower case.
+ final String fluidTexture = aMaterial.mIconSet.is_custom ? "fluid." + aMaterial.mName.toLowerCase()
+ : "autogenerated";
+
+ return GT_FluidFactory.builder(aMaterial.mName.toLowerCase(Locale.ENGLISH))
+ .withLocalizedName(aMaterial.mDefaultLocalName)
+ .withTextureName(fluidTexture)
+ .withColorRGBA(aMaterial.mRGBa)
+ .withStateAndTemperature(LIQUID, aMaterial.getLiquidTemperature())
+ .buildAndRegister()
+ .configureMaterials(aMaterial)
+ .registerBContainers(GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L), ItemList.Cell_Empty.get(1L))
+ .asFluid();
+ }
+
+ public Fluid addAutoGeneratedCorrespondingGas(Materials aMaterial) {
+ // If the fluid is registered as custom inside the Material's constructor then to add custom fluid
+ // textures go to blocks/fluids and place the .png. File should be called fluid.gas.{unlocalised_name}.png. All
+ // lower case.
+ final String fluidTexture = aMaterial.mIconSet.is_custom ? ("gas." + aMaterial.mName.toLowerCase())
+ : "autogenerated";
+
+ return GT_FluidFactory.builder(aMaterial.mName.toLowerCase(Locale.ENGLISH))
+ .withLocalizedName(aMaterial.mDefaultLocalName)
+ .withTextureName(fluidTexture)
+ .withColorRGBA(aMaterial.mRGBa)
+ .withStateAndTemperature(GAS, aMaterial.getGasTemperature())
+ .buildAndRegister()
+ .configureMaterials(aMaterial)
+ .registerBContainers(GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L), ItemList.Cell_Empty.get(1L))
+ .asFluid();
+ }
+
+ public Fluid addAutogeneratedPlasmaFluid(Materials aMaterial) {
+ // If the fluid is registered as custom inside the Material's constructor then to add custom fluid
+ // textures go to blocks/fluids and place the .png. File should be called fluid.plasma.{unlocalised_name}.png.
+ // All lower case.
+ final String fluidTexture = aMaterial.mIconSet.is_custom ? ("plasma." + aMaterial.mName.toLowerCase())
+ : "plasma.autogenerated";
+
+ return GT_FluidFactory.builder("plasma." + aMaterial.mName.toLowerCase(Locale.ENGLISH))
+ .withLocalizedName(aMaterial.mDefaultLocalName + " Plasma")
+ .withTextureName(fluidTexture)
+ .withColorRGBA(aMaterial.mMoltenRGBa)
+ .withStateAndTemperature(PLASMA, 10000)
+ .buildAndRegister()
+ .configureMaterials(aMaterial)
+ .registerContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cellPlasma, aMaterial, 1L),
+ ItemList.Cell_Empty.get(1L),
+ aMaterial.getMolten(1) != null ? 144 : 1000)
+ .asFluid();
+ }
+
+ public Fluid addAutogeneratedMoltenFluid(Materials aMaterial) {
+ // If the fluid is registered as custom inside the Material's constructor then to add custom fluid
+ // textures go to blocks/fluids and place the .png. File should be called fluid.molten.{unlocalised_name}.png.
+ // All lower case.
+ final String fluidTexture = aMaterial.mIconSet.is_custom ? ("molten." + aMaterial.mName.toLowerCase())
+ : "molten.autogenerated";
+
+ return GT_FluidFactory.builder("molten." + aMaterial.mName.toLowerCase(Locale.ENGLISH))
+ .withLocalizedName("Molten " + aMaterial.mDefaultLocalName)
+ .withTextureName(fluidTexture)
+ .withColorRGBA(aMaterial.mMoltenRGBa)
+ .withStateAndTemperature(MOLTEN, aMaterial.mMeltingPoint < 0 ? 1000 : aMaterial.mMeltingPoint)
+ .buildAndRegister()
+ .configureMaterials(aMaterial)
+ .registerContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cellMolten, aMaterial, 1L),
+ ItemList.Cell_Empty.get(1L),
+ 144)
+ .asFluid();
+ }
+
+ // ------------------------------------------------------------------------------------------------------------
+
+ public void addAutoGeneratedHydroCrackedFluids(Materials aMaterial) {
+ Fluid[] crackedFluids = new Fluid[3];
+ String[] namePrefixes = { "lightlyhydrocracked.", "moderatelyhydrocracked.", "severelyhydrocracked." };
+ OrePrefixes[] orePrefixes = { OrePrefixes.cellHydroCracked1, OrePrefixes.cellHydroCracked2,
+ OrePrefixes.cellHydroCracked3 };
+ final Fluid uncrackedFluid;
+ if (aMaterial.mFluid != null) {
+ uncrackedFluid = aMaterial.mFluid;
+ } else if (aMaterial.mGas != null) {
+ uncrackedFluid = aMaterial.mGas;
+ } else return;
+ for (int i = 0; i < 3; i++) {
+ crackedFluids[i] = GT_FluidFactory.builder(namePrefixes[i] + aMaterial.mName.toLowerCase(Locale.ENGLISH))
+ .withIconsFrom(uncrackedFluid)
+ .withLocalizedName(orePrefixes[i].mLocalizedMaterialPre + aMaterial.mDefaultLocalName)
+ .withColorRGBA(aMaterial.mRGBa)
+ .withStateAndTemperature(GAS, 775)
+ .buildAndRegister()
+ .registerBContainers(
+ GT_OreDictUnificator.get(orePrefixes[i], aMaterial, 1L),
+ ItemList.Cell_Empty.get(1L))
+ .asFluid();
+
+ int hydrogenAmount = 2 * i + 2;
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(i + 1))
+ .fluidInputs(new FluidStack(uncrackedFluid, 1000), Materials.Hydrogen.getGas(hydrogenAmount * 800))
+ .fluidOutputs(new FluidStack(crackedFluids[i], 1000))
+ .duration((1 + i) * SECONDS)
+ .eut(240)
+ .addTo(crackingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Hydrogen.getCells(hydrogenAmount), GT_Utility.getIntegratedCircuit(i + 1))
+ .itemOutputs(Materials.Empty.getCells(hydrogenAmount))
+ .fluidInputs(new FluidStack(uncrackedFluid, 1000))
+ .fluidOutputs(new FluidStack(crackedFluids[i], 800))
+ .duration((8 + 4 * i) * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aMaterial.getCells(1), GT_Utility.getIntegratedCircuit(i + 1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(hydrogenAmount * 1000))
+ .fluidOutputs(new FluidStack(crackedFluids[i], 800))
+ .duration((8 + 4 * i) * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+ }
+ aMaterial.setHydroCrackedFluids(crackedFluids);
+ }
+
+ public void addAutoGeneratedSteamCrackedFluids(Materials aMaterial) {
+ Fluid[] crackedFluids = new Fluid[3];
+ String[] namePrefixes = { "lightlysteamcracked.", "moderatelysteamcracked.", "severelysteamcracked." };
+ OrePrefixes[] orePrefixes = { OrePrefixes.cellSteamCracked1, OrePrefixes.cellSteamCracked2,
+ OrePrefixes.cellSteamCracked3 };
+ final Fluid uncrackedFluid;
+ if (aMaterial.mFluid != null) {
+ uncrackedFluid = aMaterial.mFluid;
+ } else if (aMaterial.mGas != null) {
+ uncrackedFluid = aMaterial.mGas;
+ } else return;
+ for (int i = 0; i < 3; i++) {
+ crackedFluids[i] = GT_FluidFactory.builder(namePrefixes[i] + aMaterial.mName.toLowerCase(Locale.ENGLISH))
+ .withIconsFrom(uncrackedFluid)
+ .withLocalizedName(orePrefixes[i].mLocalizedMaterialPre + aMaterial.mDefaultLocalName)
+ .withColorRGBA(aMaterial.mRGBa)
+ .withStateAndTemperature(GAS, 775)
+ .buildAndRegister()
+ .registerBContainers(
+ GT_OreDictUnificator.get(orePrefixes[i], aMaterial, 1L),
+ ItemList.Cell_Empty.get(1L))
+ .asFluid();
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(i + 1))
+ .fluidInputs(new FluidStack(uncrackedFluid, 1000), GT_ModHandler.getSteam(1000))
+ .fluidOutputs(new FluidStack(crackedFluids[i], 1200))
+ .duration((1 + i) * SECONDS)
+ .eut(240)
+ .addTo(crackingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("steamCell", 1L), GT_Utility.getIntegratedCircuit(i + 1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(new FluidStack(uncrackedFluid, 1000))
+ .fluidOutputs(new FluidStack(crackedFluids[i], 800))
+ .duration((8 + 4 * i) * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aMaterial.getCells(1), GT_Utility.getIntegratedCircuit(i + 1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(GT_ModHandler.getSteam(1000))
+ .fluidOutputs(new FluidStack(crackedFluids[i], 800))
+ .duration((8 + 4 * i) * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aMaterial.getCells(1), GT_Utility.getIntegratedCircuit(i + 1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(getFluidStack("ic2steam", 1000))
+ .fluidOutputs(new FluidStack(crackedFluids[i], 800))
+ .duration((8 + 4 * i) * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+ }
+ aMaterial.setSteamCrackedFluids(crackedFluids);
+ }
+
+ /**
+ * @see GT_FluidFactory#of(String, String, Materials, FluidState, int)
+ * @see GT_FluidFactory#of(String, String, FluidState, int)
+ * @deprecated use {@link GT_FluidFactory#builder}
+ */
+ @Deprecated
+ public Fluid addFluid(String aName, String aLocalized, Materials aMaterial, int aState, int aTemperatureK) {
+ return GT_FluidFactory.of(aName, aLocalized, aMaterial, FluidState.VALID_STATES[aState], aTemperatureK);
+ }
+
+ /**
+ * @deprecated use {@link GT_FluidFactory#builder}
+ */
+ @SuppressWarnings({ "MethodWithTooManyParameters" }) // Deprecated method
+ @Deprecated
+ public Fluid addFluid(String aName, String aLocalized, Materials aMaterial, int aState, int aTemperatureK,
+ ItemStack aFullContainer, ItemStack aEmptyContainer, int aFluidAmount) {
+ return GT_FluidFactory.builder(aName)
+ .withLocalizedName(aLocalized)
+ .withStateAndTemperature(FluidState.fromValue(aState), aTemperatureK)
+ .buildAndRegister()
+ .configureMaterials(aMaterial)
+ .registerContainers(aFullContainer, aEmptyContainer, aFluidAmount)
+ .asFluid();
+ }
+
+ /**
+ * @deprecated use {@link GT_FluidFactory#builder}
+ */
+ @Deprecated
+ @SuppressWarnings({ "MethodWithTooManyParameters" }) // Deprecated method
+ public Fluid addFluid(String aName, String aTexture, String aLocalized, Materials aMaterial, short[] aRGBa,
+ int aState, int aTemperatureK, ItemStack aFullContainer, ItemStack aEmptyContainer, int aFluidAmount) {
+ return GT_FluidFactory.builder(aName)
+ .withLocalizedName(aLocalized)
+ .withStillIconResourceLocation(new ResourceLocation(GregTech.ID, "fluids/fluid." + aTexture))
+ .withColorRGBA(aRGBa)
+ .withStateAndTemperature(FluidState.fromValue(aState), aTemperatureK)
+ .buildAndRegister()
+ .configureMaterials(aMaterial)
+ .registerContainers(aFullContainer, aEmptyContainer, aFluidAmount)
+ .asFluid();
+ }
+
+ public File getSaveDirectory() {
+ return this.mUniverse == null ? null
+ : this.mUniverse.getSaveHandler()
+ .getWorldDirectory();
+ }
+
+ public long getAnimationTicks() {
+ return 0L;
+ }
+
+ public float getPartialRenderTicks() {
+ return 0;
+ }
+
+ public void registerUnificationEntries() {
+ GregTech_API.sUnification.mConfig.save();
+ GregTech_API.sUnification.mConfig.load();
+ GT_OreDictUnificator.resetUnificationEntries();
+ for (OreDictEventContainer tOre : this.mEvents) {
+ if ((!(tOre.mEvent.Ore.getItem() instanceof GT_MetaGenerated_Item)) && (tOre.mPrefix != null)
+ && (tOre.mPrefix.mIsUnificatable)
+ && (tOre.mMaterial != null)) {
+ boolean checkModID = tOre.mModID != null;
+
+ if (checkModID) {
+ switch (tOre.mModID) {
+ case Names.ENDER_I_O -> {
+ if (tOre.mPrefix == OrePrefixes.ingot && tOre.mMaterial == Materials.DarkSteel) {
+ GT_OreDictUnificator
+ .addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false);
+ GT_OreDictUnificator.set(
+ tOre.mPrefix,
+ tOre.mMaterial,
+ tOre.mEvent.Ore,
+ (GregTech_API.sUnification.get(
+ ConfigCategories.specialunificationtargets + "." + tOre.mModID,
+ tOre.mEvent.Name,
+ true)),
+ true);
+ continue;
+ }
+ }
+ case Names.THERMAL_FONDATION -> {
+ if (tOre.mPrefix == OrePrefixes.dust && tOre.mMaterial == Materials.Blizz) {
+ GT_OreDictUnificator
+ .addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false);
+ GT_OreDictUnificator.set(
+ tOre.mPrefix,
+ tOre.mMaterial,
+ tOre.mEvent.Ore,
+ (GregTech_API.sUnification.get(
+ ConfigCategories.specialunificationtargets + "." + tOre.mModID,
+ tOre.mEvent.Name,
+ true)),
+ true);
+ continue;
+ } else if (tOre.mPrefix == OrePrefixes.dust && tOre.mMaterial == Materials.Pyrotheum) {
+ GT_OreDictUnificator
+ .addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false);
+ GT_OreDictUnificator.set(
+ tOre.mPrefix,
+ tOre.mMaterial,
+ tOre.mEvent.Ore,
+ (GregTech_API.sUnification.get(
+ ConfigCategories.specialunificationtargets + "." + tOre.mModID,
+ tOre.mEvent.Name,
+ true)),
+ true);
+ continue;
+ }
+ }
+ case Names.ARS_MAGICA2 -> {
+ if (tOre.mPrefix == OrePrefixes.dust && tOre.mMaterial == Materials.Vinteum) {
+ GT_OreDictUnificator
+ .addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false);
+ GT_OreDictUnificator.set(
+ tOre.mPrefix,
+ tOre.mMaterial,
+ tOre.mEvent.Ore,
+ (GregTech_API.sUnification.get(
+ ConfigCategories.specialunificationtargets + "." + tOre.mModID,
+ tOre.mEvent.Name,
+ true)),
+ true);
+ continue;
+ } else if (tOre.mPrefix == OrePrefixes.gem && tOre.mMaterial == Materials.BlueTopaz) {
+ GT_OreDictUnificator
+ .addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false);
+ GT_OreDictUnificator.set(
+ tOre.mPrefix,
+ tOre.mMaterial,
+ tOre.mEvent.Ore,
+ (GregTech_API.sUnification.get(
+ ConfigCategories.specialunificationtargets + "." + tOre.mModID,
+ tOre.mEvent.Name,
+ true)),
+ true);
+ continue;
+ } else if (tOre.mPrefix == OrePrefixes.gem && tOre.mMaterial == Materials.Chimerite) {
+ GT_OreDictUnificator
+ .addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false);
+ GT_OreDictUnificator.set(
+ tOre.mPrefix,
+ tOre.mMaterial,
+ tOre.mEvent.Ore,
+ (GregTech_API.sUnification.get(
+ ConfigCategories.specialunificationtargets + "." + tOre.mModID,
+ tOre.mEvent.Name,
+ true)),
+ true);
+ continue;
+ } else if (tOre.mPrefix == OrePrefixes.gem && tOre.mMaterial == Materials.Moonstone) {
+ GT_OreDictUnificator
+ .addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false);
+ GT_OreDictUnificator.set(
+ tOre.mPrefix,
+ tOre.mMaterial,
+ tOre.mEvent.Ore,
+ (GregTech_API.sUnification.get(
+ ConfigCategories.specialunificationtargets + "." + tOre.mModID,
+ tOre.mEvent.Name,
+ true)),
+ true);
+ continue;
+ } else if (tOre.mPrefix == OrePrefixes.gem && tOre.mMaterial == Materials.Sunstone) {
+ GT_OreDictUnificator
+ .addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false);
+ GT_OreDictUnificator.set(
+ tOre.mPrefix,
+ tOre.mMaterial,
+ tOre.mEvent.Ore,
+ (GregTech_API.sUnification.get(
+ ConfigCategories.specialunificationtargets + "." + tOre.mModID,
+ tOre.mEvent.Name,
+ true)),
+ true);
+ continue;
+ }
+ }
+ case Names.ROTARY_CRAFT -> {
+ if (tOre.mPrefix == OrePrefixes.ingot && tOre.mMaterial == Materials.HSLA) {
+ GT_OreDictUnificator
+ .addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false);
+ GT_OreDictUnificator.set(
+ tOre.mPrefix,
+ tOre.mMaterial,
+ tOre.mEvent.Ore,
+ (GregTech_API.sUnification.get(
+ ConfigCategories.specialunificationtargets + "." + tOre.mModID,
+ tOre.mEvent.Name,
+ true)),
+ true);
+ continue;
+ }
+ }
+ case Names.APPLIED_ENERGISTICS2 -> {
+ if (tOre.mPrefix == OrePrefixes.gem && tOre.mMaterial == Materials.CertusQuartz) {
+ GT_OreDictUnificator
+ .addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false);
+ GT_OreDictUnificator.set(
+ tOre.mPrefix,
+ tOre.mMaterial,
+ tOre.mEvent.Ore,
+ (GregTech_API.sUnification.get(
+ ConfigCategories.specialunificationtargets + "." + tOre.mModID,
+ tOre.mEvent.Name,
+ true)),
+ true);
+ continue;
+ } else if (tOre.mPrefix == OrePrefixes.dust && tOre.mMaterial == Materials.CertusQuartz) {
+ GT_OreDictUnificator
+ .addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false);
+ GT_OreDictUnificator.set(
+ tOre.mPrefix,
+ tOre.mMaterial,
+ tOre.mEvent.Ore,
+ (GregTech_API.sUnification.get(
+ ConfigCategories.specialunificationtargets + "." + tOre.mModID,
+ tOre.mEvent.Name,
+ true)),
+ true);
+ continue;
+ }
+ }
+ default -> {}
+ }
+ }
+ if (GT_OreDictUnificator.isBlacklisted(tOre.mEvent.Ore)) {
+ GT_OreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, true);
+ } else {
+ GT_OreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false);
+ GT_OreDictUnificator.set(
+ tOre.mPrefix,
+ tOre.mMaterial,
+ tOre.mEvent.Ore,
+ (checkModID) && (GregTech_API.sUnification.get(
+ ConfigCategories.specialunificationtargets + "." + tOre.mModID,
+ tOre.mEvent.Name,
+ false)),
+ true);
+ }
+ }
+ }
+
+ for (OreDictEventContainer tOre : this.mEvents) {
+ if (((tOre.mEvent.Ore.getItem() instanceof GT_MetaGenerated_Item)) && (tOre.mPrefix != null)
+ && (tOre.mPrefix.mIsUnificatable)
+ && (tOre.mMaterial != null)) {
+ if (GT_OreDictUnificator.isBlacklisted(tOre.mEvent.Ore)) {
+ GT_OreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, true);
+ } else {
+ GT_OreDictUnificator.addAssociation(tOre.mPrefix, tOre.mMaterial, tOre.mEvent.Ore, false);
+ GT_OreDictUnificator.set(
+ tOre.mPrefix,
+ tOre.mMaterial,
+ tOre.mEvent.Ore,
+ (tOre.mModID != null) && (GregTech_API.sUnification.get(
+ new StringBuilder().append(ConfigCategories.specialunificationtargets)
+ .append(".")
+ .append(tOre.mModID),
+ tOre.mEvent.Name,
+ false)),
+ true);
+ }
+ }
+ }
+ GregTech_API.sUnificationEntriesRegistered = true;
+ GregTech_API.sUnification.mConfig.save();
+ GT_Recipe.reInit();
+ }
+
+ @SuppressWarnings("deprecation")
+ public void activateOreDictHandler() {
+ this.mOreDictActivated = true;
+ ProgressManager.ProgressBar progressBar = ProgressManager.push("Register materials", mEvents.size());
+
+ if (BetterLoadingScreen.isModLoaded()) {
+ GT_Values.cls_enabled = true;
+ try {
+ GT_CLS_Compat.stepMaterialsCLS(mEvents, progressBar);
+ } catch (IllegalAccessException e) {
+ GT_FML_LOGGER.catching(e);
+ }
+ } else GT_Proxy.stepMaterialsVanilla(this.mEvents, progressBar);
+ }
+
+ @Deprecated
+ public static final HashMap<Integer, HashMap<ChunkCoordIntPair, int[]>> dimensionWiseChunkData = new HashMap<>(16); // stores
+ // chunk
+ // data
+ // that
+ // is
+ // loaded/saved
+
+ public static final HashMap<Integer, GT_Pollution> dimensionWisePollution = new HashMap<>(16); // stores
+ // GT_Polluttors
+ // objects
+ public static final byte GTOIL = 3, GTOILFLUID = 2, GTPOLLUTION = 1, GTMETADATA = 0, NOT_LOADED = 0, LOADED = 1; // consts
+
+ // TO get default's fast
+ @Deprecated
+ public static int[] getDefaultChunkDataOnCreation() {
+ return new int[] { NOT_LOADED, 0, -1, -1 };
+ }
+
+ @Deprecated
+ public static int[] getDefaultChunkDataOnLoad() {
+ return new int[] { LOADED, 0, -1, -1 };
+ }
+
+ @SubscribeEvent
+ public void handleChunkLoadEvent(ChunkDataEvent.Load event) {
+ GT_UndergroundOil.migrate(event);
+ GT_Pollution.migrate(event);
+ }
+
+ @SubscribeEvent
+ public void onBlockBreakSpeedEvent(PlayerEvent.BreakSpeed aEvent) {
+ if (aEvent.entityPlayer != null) {
+ ItemStack aStack = aEvent.entityPlayer.getCurrentEquippedItem();
+ if ((aStack != null) && ((aStack.getItem() instanceof GT_MetaGenerated_Tool))) {
+ aEvent.newSpeed = ((GT_MetaGenerated_Tool) aStack.getItem()).onBlockBreakSpeedEvent(
+ aEvent.newSpeed,
+ aStack,
+ aEvent.entityPlayer,
+ aEvent.block,
+ aEvent.x,
+ aEvent.y,
+ aEvent.z,
+ (byte) aEvent.metadata,
+ aEvent);
+ }
+ }
+ }
+
+ public static class OreDictEventContainer {
+
+ public final OreDictionary.OreRegisterEvent mEvent;
+ public final OrePrefixes mPrefix;
+ public final Materials mMaterial;
+ public final String mModID;
+
+ public OreDictEventContainer(OreDictionary.OreRegisterEvent aEvent, OrePrefixes aPrefix, Materials aMaterial,
+ String aModID) {
+ this.mEvent = aEvent;
+ this.mPrefix = aPrefix;
+ this.mMaterial = aMaterial;
+ this.mModID = ((aModID == null) || (aModID.equals("UNKNOWN")) ? null : aModID);
+ }
+ }
+
+ @SubscribeEvent
+ public void onBlockEvent(BlockEvent event) {
+ if (event.block.getUnlocalizedName()
+ .equals("blockAlloyGlass")) GregTech_API.causeMachineUpdate(event.world, event.x, event.y, event.z);
+ }
+
+ public static void addFullHazmatToGeneralItem(String aModID, String aItem, long aAmount, int aMeta) {
+ ItemStack item = GT_ModHandler.getModItem(aModID, aItem, aAmount, aMeta);
+ addItemToHazmatLists(item);
+ }
+
+ public static void addFullHazmatToGeneralItem(String aModID, String aItem, long aAmount) {
+ ItemStack item = GT_ModHandler.getModItem(aModID, aItem, aAmount, W);
+ addItemToHazmatLists(item);
+ }
+
+ public static void addFullHazmatToIC2Item(String aItem) {
+ ItemStack item = GT_ModHandler.getIC2Item(aItem, 1L, W);
+ addItemToHazmatLists(item);
+ }
+
+ private static void addItemToHazmatLists(ItemStack item) {
+ GregTech_API.sGasHazmatList.add(item);
+ GregTech_API.sBioHazmatList.add(item);
+ GregTech_API.sFrostHazmatList.add(item);
+ GregTech_API.sHeatHazmatList.add(item);
+ GregTech_API.sRadioHazmatList.add(item);
+ GregTech_API.sElectroHazmatList.add(item);
+ }
+
+ public static boolean providesProtection(ItemStack aStack) {
+
+ if (GT_Utility.hasHazmatEnchant(aStack)) return true;
+
+ boolean isGas = GT_Utility.isStackInList(aStack, GregTech_API.sGasHazmatList);
+ boolean isBio = GT_Utility.isStackInList(aStack, GregTech_API.sBioHazmatList);
+ boolean isFrost = GT_Utility.isStackInList(aStack, GregTech_API.sFrostHazmatList);
+ boolean isHeat = GT_Utility.isStackInList(aStack, GregTech_API.sHeatHazmatList);
+ boolean isRadio = GT_Utility.isStackInList(aStack, GregTech_API.sRadioHazmatList);
+ boolean isElectro = GT_Utility.isStackInList(aStack, GregTech_API.sElectroHazmatList);
+ return isGas && isBio && isFrost && isHeat && isRadio && isElectro;
+ }
+
+ @SubscribeEvent
+ public void onItemTooltip(ItemTooltipEvent event) {
+ if (event.itemStack != null) {
+ ItemStack aStackTemp = event.itemStack;
+ GT_ItemStack aStack = new GT_ItemStack(aStackTemp);
+ if (providesProtection(aStackTemp)) {
+ event.toolTip.add(EnumChatFormatting.LIGHT_PURPLE + "Provides full hazmat protection.");
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_RecipeAdder.java b/src/main/java/gregtech/common/GT_RecipeAdder.java
new file mode 100644
index 0000000000..d236bbc4f2
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_RecipeAdder.java
@@ -0,0 +1,3245 @@
+package gregtech.common;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.Railcraft;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.internal.IGT_RecipeAdder;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_AssemblyLineUtils;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Recipe.GT_Recipe_AssemblyLine;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.extensions.ArrayExt;
+import ic2.core.init.MainConfig;
+import ic2.core.util.ConfigUtil;
+import mods.railcraft.common.blocks.aesthetics.cube.EnumCube;
+import mods.railcraft.common.items.RailcraftToolItems;
+
+public class GT_RecipeAdder implements IGT_RecipeAdder {
+
+ @Override
+ @Deprecated
+ public boolean addFusionReactorRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, int aDuration,
+ int aEUt, int aStartEU) {
+ return false;
+ }
+
+ @Deprecated
+ @Override // Really?
+ public boolean addFusionReactorRecipe(FluidStack aInput1, FluidStack aInput2, FluidStack aOutput1, int aDuration,
+ int aEUt, int aStartEU) {
+ if (aInput1 == null || aInput2 == null || aOutput1 == null || aDuration < 1 || aEUt < 1 || aStartEU < 1) {
+ return false;
+ }
+ RecipeMaps.fusionRecipes.addRecipe(
+ null,
+ new FluidStack[] { aInput1, aInput2 },
+ new FluidStack[] { aOutput1 },
+ aDuration,
+ aEUt,
+ aStartEU);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addFusionReactorRecipe(FluidStack[] FluidInputArray, FluidStack[] FluidOutputArray,
+ int aFusionDurationInTicks, int aFusionEnergyPerTick, int aEnergyNeededForStartingFusion) {
+ if (FluidInputArray.length == 0) return false;
+
+ if (FluidOutputArray.length == 0) return false;
+
+ RecipeMaps.fusionRecipes.addRecipe(
+ null,
+ FluidInputArray,
+ FluidOutputArray,
+ aFusionDurationInTicks,
+ aFusionEnergyPerTick,
+ aEnergyNeededForStartingFusion);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addCentrifugeRecipe(ItemStack aInput1, int aInput2, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, ItemStack aOutput4, ItemStack aOutput5, ItemStack aOutput6, int aDuration) {
+ return addCentrifugeRecipe(
+ aInput1,
+ aInput2 < 0 ? null : aInput2 > 0 ? ItemList.Cell_Empty.get(aInput2) : null,
+ null,
+ null,
+ aOutput1,
+ aOutput2,
+ aOutput3,
+ aOutput4,
+ aOutput5,
+ aOutput6,
+ null,
+ aDuration,
+ 5);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addCentrifugeRecipe(ItemStack aInput1, int aInput2, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, ItemStack aOutput4, ItemStack aOutput5, ItemStack aOutput6, int aDuration, int aEUt) {
+ return addCentrifugeRecipe(
+ aInput1,
+ aInput2 < 0 ? null : aInput2 > 0 ? ItemList.Cell_Empty.get(aInput2) : null,
+ null,
+ null,
+ aOutput1,
+ aOutput2,
+ aOutput3,
+ aOutput4,
+ aOutput5,
+ aOutput6,
+ null,
+ aDuration,
+ aEUt);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addCentrifugeRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, ItemStack aOutput4,
+ ItemStack aOutput5, ItemStack aOutput6, int[] aChances, int aDuration, int aEUt) {
+ return addCentrifugeRecipe(
+ aInput1,
+ aInput2,
+ aFluidInput,
+ aFluidOutput,
+ aOutput1,
+ aOutput2,
+ aOutput3,
+ aOutput4,
+ aOutput5,
+ aOutput6,
+ aChances,
+ aDuration,
+ aEUt,
+ false);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addCentrifugeRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, ItemStack aOutput4,
+ ItemStack aOutput5, ItemStack aOutput6, int[] aChances, int aDuration, int aEUt, boolean aCleanroom) {
+ if (((aInput1 == null) && (aFluidInput == null)) || ((aOutput1 == null) && (aFluidOutput == null))) {
+ return false;
+ }
+ if ((aInput1 != null) && (aDuration <= 0)) {
+ return false;
+ }
+ if ((aFluidInput != null) && (aDuration <= 0)) {
+ return false;
+ }
+ if (!GT_Mod.gregtechproxy.mEnableCleanroom) {
+ aCleanroom = false;
+ }
+ RecipeMaps.centrifugeRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2 },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3, aOutput4, aOutput5, aOutput6, },
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ aCleanroom ? -100 : 0);
+ ItemStack[] itemInputs = { aInput1, aInput2 };
+ ItemStack[] itemOutputs = { aOutput1, aOutput2, aOutput3, aOutput4, aOutput5, aOutput6 };
+ FluidStack[] fluidInputs = { aFluidInput, null, null };
+ FluidStack[] fluidOutputs = { aFluidOutput, null, null, null, null, null, null };
+
+ byte iNumber = 0;
+ byte oNumber = 0;
+
+ for (ItemStack item : itemInputs) {
+ if (item != null) {
+ if (GT_Utility.getFluidForFilledItem(aInput1, true) != null || GT_Utility.isCellEmpty(item)) {
+ fluidInputs[iNumber + 1] = GT_Utility.convertCellToFluid(item);
+ itemInputs[iNumber] = null;
+ }
+ }
+ iNumber++;
+ }
+
+ for (ItemStack item : itemOutputs) {
+ if (item != null) {
+ if (GT_Utility.getFluidForFilledItem(item, true) != null || GT_Utility.isCellEmpty(item)) {
+ fluidOutputs[oNumber + 1] = GT_Utility.convertCellToFluid(item);
+ itemOutputs[oNumber] = null;
+ }
+ }
+ oNumber++;
+ }
+
+ RecipeMaps.centrifugeNonCellRecipes.addRecipe(
+ false,
+ itemInputs,
+ itemOutputs,
+ null,
+ aChances,
+ fluidInputs,
+ fluidOutputs,
+ aDuration,
+ aEUt,
+ aCleanroom ? -100 : 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addCompressorRecipe(ItemStack aInput1, ItemStack aOutput1, int aDuration, int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.compressorRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1 },
+ new ItemStack[] { aOutput1 },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addElectrolyzerRecipe(ItemStack aInput1, int aInput2, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, ItemStack aOutput4, ItemStack aOutput5, ItemStack aOutput6, int aDuration, int aEUt) {
+ return addElectrolyzerRecipe(
+ aInput1,
+ aInput2 < 0 ? null : aInput2 > 0 ? ItemList.Cell_Empty.get(aInput2) : null,
+ null,
+ null,
+ aOutput1,
+ aOutput2,
+ aOutput3,
+ aOutput4,
+ aOutput5,
+ aOutput6,
+ null,
+ aDuration,
+ aEUt);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addElectrolyzerRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, ItemStack aOutput4,
+ ItemStack aOutput5, ItemStack aOutput6, int[] aChances, int aDuration, int aEUt) {
+ if (((aInput1 == null) && (aFluidInput == null)) || ((aOutput1 == null) && (aFluidOutput == null))) {
+ return false;
+ }
+ if ((aInput1 != null) && (aDuration <= 0)) {
+ return false;
+ }
+ if ((aFluidInput != null) && (aDuration <= 0)) {
+ return false;
+ }
+ RecipeMaps.electrolyzerRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2 },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3, aOutput4, aOutput5, aOutput6 },
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ 0);
+ ItemStack[] itemInputs = { aInput1, aInput2 };
+ ItemStack[] itemOutputs = { aOutput1, aOutput2, aOutput3, aOutput4, aOutput5, aOutput6 };
+ FluidStack[] fluidInputs = { aFluidInput, null, null };
+ FluidStack[] fluidOutputs = { aFluidOutput, null, null, null, null, null, null };
+
+ byte iNumber = 0;
+ byte oNumber = 0;
+
+ for (ItemStack item : itemInputs) {
+ if (item != null) {
+ if (GT_Utility.getFluidForFilledItem(item, true) != null || GT_Utility.isCellEmpty(item)
+ || GT_Utility.isAnyIntegratedCircuit(item)) {
+ fluidInputs[iNumber + 1] = GT_Utility.convertCellToFluid(item);
+ itemInputs[iNumber] = null;
+ }
+ }
+ iNumber++;
+ }
+
+ for (ItemStack item : itemOutputs) {
+ if (item != null) {
+ if (GT_Utility.getFluidForFilledItem(item, true) != null || GT_Utility.isCellEmpty(item)) {
+ fluidOutputs[oNumber + 1] = GT_Utility.convertCellToFluid(item);
+ itemOutputs[oNumber] = null;
+ }
+ }
+ oNumber++;
+ }
+
+ RecipeMaps.electrolyzerNonCellRecipes
+ .addRecipe(false, itemInputs, itemOutputs, null, aChances, fluidInputs, fluidOutputs, aDuration, aEUt, 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput, int aDuration) {
+ return addChemicalRecipe(aInput1, aInput2, null, null, aOutput, aDuration);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput, int aDuration, int aEUt) {
+ return addChemicalRecipe(aInput1, aInput2, null, null, aOutput, aDuration, aEUt);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput, int aDuration) {
+ return addChemicalRecipe(aInput1, aInput2, aFluidInput, aFluidOutput, aOutput, aDuration, 30);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput, ItemStack aOutput2, int aDuration) {
+ return addChemicalRecipe(aInput1, aInput2, aFluidInput, aFluidOutput, aOutput, aOutput2, aDuration, 30);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput, int aDuration, int aEUTick) {
+ return addChemicalRecipe(
+ aInput1,
+ aInput2,
+ aFluidInput,
+ aFluidOutput,
+ aOutput,
+ GT_Values.NI,
+ aDuration,
+ aEUTick);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput, ItemStack aOutput2, int aDuration, int aEUtick) {
+ return addChemicalRecipe(
+ aInput1,
+ aInput2,
+ aFluidInput,
+ aFluidOutput,
+ aOutput,
+ aOutput2,
+ aDuration,
+ aEUtick,
+ false);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addChemicalRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput, ItemStack aOutput2, int aDuration, int aEUtick,
+ boolean aCleanroom) {
+ if (((aInput1 == null) && (aFluidInput == null))
+ || ((aOutput == null) && (aOutput2 == null) && (aFluidOutput == null))) {
+ return false;
+ }
+ if ((aOutput != null || aOutput2 != null) && (aDuration <= 0)) {
+ return false;
+ }
+ if ((aFluidOutput != null) && (aDuration <= 0)) {
+ return false;
+ }
+ if (aEUtick <= 0) {
+ return false;
+ }
+ if (!GT_Mod.gregtechproxy.mEnableCleanroom) {
+ aCleanroom = false;
+ }
+ GT_RecipeBuilder builder = stdBuilder()
+ .itemInputs(ArrayExt.withoutNulls(new ItemStack[] { aInput1, aInput2 }, ItemStack[]::new))
+ .itemOutputs(ArrayExt.withoutNulls(new ItemStack[] { aOutput, aOutput2 }, ItemStack[]::new));
+ if (aFluidInput != null) builder.fluidInputs(aFluidInput);
+ if (aFluidOutput != null) builder.fluidOutputs(aFluidOutput);
+ builder.duration(aDuration)
+ .eut(aEUtick)
+ .metadata(GT_RecipeConstants.CLEANROOM, aCleanroom)
+ .addTo(GT_RecipeConstants.UniversalChemical);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addMultiblockChemicalRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs,
+ FluidStack[] aFluidOutputs, ItemStack[] aOutputs, int aDuration, int aEUtick) {
+ if (areItemsAndFluidsBothNull(aInputs, aFluidInputs) || areItemsAndFluidsBothNull(aOutputs, aFluidOutputs)) {
+ return false;
+ }
+ if (aEUtick <= 0) {
+ return false;
+ }
+ RecipeMaps.multiblockChemicalReactorRecipes
+ .addRecipe(false, aInputs, aOutputs, null, null, aFluidInputs, aFluidOutputs, aDuration, aEUtick, 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addChemicalRecipeForBasicMachineOnly(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput,
+ FluidStack aFluidOutput, ItemStack aOutput, ItemStack aOutput2, int aDuration, int aEUtick) {
+ if (((aInput1 == null) && (aFluidInput == null))
+ || ((aOutput == null) && (aOutput2 == null) && (aFluidOutput == null))) {
+ return false;
+ }
+ if ((aOutput != null || aOutput2 != null) && (aDuration <= 0)) {
+ return false;
+ }
+ if ((aFluidOutput != null) && (aDuration <= 0)) {
+ return false;
+ }
+ if (aEUtick <= 0) {
+ return false;
+ }
+ RecipeMaps.chemicalReactorRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2 },
+ new ItemStack[] { aOutput, aOutput2 },
+ null,
+ null,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUtick,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public void addDefaultPolymerizationRecipes(Fluid aBasicMaterial, ItemStack aBasicMaterialCell, Fluid aPolymer) {
+ // Oxygen/Titaniumtetrafluoride -> +50% Output each
+ addChemicalRecipe(
+ ItemList.Cell_Air.get(1),
+ GT_Utility.getIntegratedCircuit(1),
+ new FluidStack(aBasicMaterial, 144),
+ new FluidStack(aPolymer, 144),
+ Materials.Empty.getCells(1),
+ 160);
+ addChemicalRecipe(
+ Materials.Oxygen.getCells(1),
+ GT_Utility.getIntegratedCircuit(1),
+ new FluidStack(aBasicMaterial, 144),
+ new FluidStack(aPolymer, 216),
+ Materials.Empty.getCells(1),
+ 160);
+ addChemicalRecipe(
+ aBasicMaterialCell,
+ GT_Utility.getIntegratedCircuit(1),
+ Materials.Air.getGas(14000),
+ new FluidStack(aPolymer, 1000),
+ Materials.Empty.getCells(1),
+ 1120);
+ addChemicalRecipe(
+ aBasicMaterialCell,
+ GT_Utility.getIntegratedCircuit(1),
+ Materials.Oxygen.getGas(7000),
+ new FluidStack(aPolymer, 1500),
+ Materials.Empty.getCells(1),
+ 1120);
+ addMultiblockChemicalRecipe(
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(2) },
+ new FluidStack[] { new FluidStack(aBasicMaterial, 2160), Materials.Air.getGas(7500),
+ Materials.Titaniumtetrachloride.getFluid(100) },
+ new FluidStack[] { new FluidStack(aPolymer, 3240) },
+ null,
+ 800,
+ 30);
+ addMultiblockChemicalRecipe(
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(2) },
+ new FluidStack[] { new FluidStack(aBasicMaterial, 2160), Materials.Oxygen.getGas(7500),
+ Materials.Titaniumtetrachloride.getFluid(100) },
+ new FluidStack[] { new FluidStack(aPolymer, 4320) },
+ null,
+ 800,
+ 30);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addBlastRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, ItemStack aOutput2,
+ int aDuration, int aEUt, int aLevel) {
+ return addBlastRecipe(aInput1, aInput2, null, null, aOutput1, aOutput2, aDuration, aEUt, aLevel);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addBlastRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, FluidStack aFluidOutput,
+ ItemStack aOutput1, ItemStack aOutput2, int aDuration, int aEUt, int aLevel) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.blastFurnaceRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2 },
+ new ItemStack[] { aOutput1, aOutput2 },
+ null,
+ null,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ aLevel);
+ return true;
+ }
+
+ @Deprecated
+ public boolean addBlastRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ ItemStack aOutput4, int aDuration, int aEUt, int aLevel) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.blastFurnaceRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2, aInput3, aInput4 },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3, aOutput4 },
+ null,
+ null,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ aLevel);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addPlasmaForgeRecipe(ItemStack[] ItemInputArray, FluidStack[] FluidInputArray,
+ ItemStack[] OutputItemArray, FluidStack[] FluidOutputArray, int aDuration, int aEUt, int coil_heat_level) {
+ RecipeMaps.plasmaForgeRecipes.addRecipe(
+ false,
+ ItemInputArray,
+ OutputItemArray,
+ null,
+ null,
+ FluidInputArray,
+ FluidOutputArray,
+ aDuration,
+ aEUt,
+ coil_heat_level);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addPrimitiveBlastRecipe(ItemStack aInput1, ItemStack aInput2, int aCoalAmount, ItemStack aOutput1,
+ ItemStack aOutput2, int aDuration) {
+ if ((aInput1 == null && aInput2 == null) || (aOutput1 == null && aOutput2 == null)) {
+ return false;
+ }
+ if (aCoalAmount <= 0) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ Materials[] coals = new Materials[] { Materials.Coal, Materials.Charcoal };
+ for (Materials coal : coals) {
+ RecipeMaps.primitiveBlastRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2, coal.getGems(aCoalAmount) },
+ new ItemStack[] { aOutput1, aOutput2, Materials.DarkAsh.getDustTiny(aCoalAmount) },
+ null,
+ null,
+ null,
+ null,
+ aDuration,
+ 0,
+ 0);
+ RecipeMaps.primitiveBlastRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2, coal.getDust(aCoalAmount) },
+ new ItemStack[] { aOutput1, aOutput2, Materials.DarkAsh.getDustTiny(aCoalAmount) },
+ null,
+ null,
+ null,
+ null,
+ aDuration,
+ 0,
+ 0);
+ }
+ if (Railcraft.isModLoaded()) {
+ RecipeMaps.primitiveBlastRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2, RailcraftToolItems.getCoalCoke(aCoalAmount / 2) },
+ new ItemStack[] { aOutput1, aOutput2, Materials.Ash.getDustTiny(aCoalAmount / 2) },
+ null,
+ null,
+ null,
+ null,
+ aDuration * 2 / 3,
+ 0,
+ 0);
+ }
+ if (GTPlusPlus.isModLoaded()) {
+ RecipeMaps.primitiveBlastRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2,
+ GT_ModHandler.getModItem(GTPlusPlus.ID, "itemCactusCoke", (aCoalAmount * 2L)) },
+ new ItemStack[] { aOutput1, aOutput2, Materials.Ash.getDustTiny(aCoalAmount * 2) },
+ null,
+ null,
+ null,
+ null,
+ aDuration * 2 / 3,
+ 0,
+ 0);
+ RecipeMaps.primitiveBlastRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2,
+ GT_ModHandler.getModItem(GTPlusPlus.ID, "itemSugarCoke", (aCoalAmount * 2L)) },
+ new ItemStack[] { aOutput1, aOutput2, Materials.Ash.getDustTiny(aCoalAmount * 2) },
+ null,
+ null,
+ null,
+ null,
+ aDuration * 2 / 3,
+ 0,
+ 0);
+ }
+ if ((aInput1 == null || aInput1.stackSize <= 6) && (aInput2 == null || aInput2.stackSize <= 6)
+ && (aOutput1 == null || aOutput1.stackSize <= 6)
+ && (aOutput2 == null || aOutput2.stackSize <= 6)) {
+ aInput1 = aInput1 == null ? null : GT_Utility.copyAmount(aInput1.stackSize * 10, aInput1);
+ aInput2 = aInput2 == null ? null : GT_Utility.copyAmount(aInput2.stackSize * 10, aInput2);
+ aOutput1 = aOutput1 == null ? null : GT_Utility.copyAmount(aOutput1.stackSize * 10, aOutput1);
+ aOutput2 = aOutput2 == null ? null : GT_Utility.copyAmount(aOutput2.stackSize * 10, aOutput2);
+ for (Materials coal : coals) {
+ RecipeMaps.primitiveBlastRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2, coal.getBlocks(aCoalAmount) },
+ new ItemStack[] { aOutput1, aOutput2, Materials.DarkAsh.getDust(aCoalAmount) },
+ null,
+ null,
+ null,
+ null,
+ aDuration * 10,
+ 0,
+ 0);
+ RecipeMaps.primitiveBlastRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2, coal.getBlocks(aCoalAmount) },
+ new ItemStack[] { aOutput1, aOutput2, Materials.DarkAsh.getDust(aCoalAmount) },
+ null,
+ null,
+ null,
+ null,
+ aDuration * 10,
+ 0,
+ 0);
+ }
+ if (Railcraft.isModLoaded()) {
+ RecipeMaps.primitiveBlastRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2, EnumCube.COKE_BLOCK.getItem(aCoalAmount / 2) },
+ new ItemStack[] { aOutput1, aOutput2, Materials.Ash.getDust(aCoalAmount / 2) },
+ null,
+ null,
+ null,
+ null,
+ aDuration * 20 / 3,
+ 0,
+ 0);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addCannerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, ItemStack aOutput2,
+ int aDuration, int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.cannerRecipes.addRecipe(
+ true,
+ aInput2 == null ? new ItemStack[] { aInput1 } : new ItemStack[] { aInput1, aInput2 },
+ new ItemStack[] { aOutput1, aOutput2 },
+ null,
+ null,
+ null,
+ null,
+ aDuration,
+ Math.max(aEUt, 1),
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAlloySmelterRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, int aDuration,
+ int aEUt) {
+ return addAlloySmelterRecipe(aInput1, aInput2, aOutput1, aDuration, aEUt, false);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAlloySmelterRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, int aDuration,
+ int aEUt, boolean hidden) {
+ if ((aInput1 == null) || (aOutput1 == null || Materials.Graphite.contains(aInput1))) {
+ return false;
+ }
+ if ((aInput2 == null) && ((OrePrefixes.ingot.contains(aInput1)) || (OrePrefixes.dust.contains(aInput1))
+ || (OrePrefixes.gem.contains(aInput1)))) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ GT_Recipe tRecipe = new GT_Recipe(
+ true,
+ aInput2 == null ? new ItemStack[] { aInput1 } : new ItemStack[] { aInput1, aInput2 },
+ new ItemStack[] { aOutput1 },
+ null,
+ null,
+ null,
+ null,
+ aDuration,
+ Math.max(aEUt, 1),
+ 0);
+ if (hidden) {
+ tRecipe.mHidden = true;
+ }
+ RecipeMaps.alloySmelterRecipes.addRecipe(tRecipe);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addLatheRecipe(ItemStack aInput1, ItemStack aOutput1, ItemStack aOutput2, int aDuration, int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.latheRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1 },
+ new ItemStack[] { aOutput1, aOutput2 },
+ null,
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addCutterRecipe(ItemStack aInput, FluidStack aLubricant, ItemStack aOutput1, ItemStack aOutput2,
+ int aDuration, int aEUt) {
+ if ((aInput == null) || (aLubricant == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.cutterRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput1, aOutput2 },
+ null,
+ new FluidStack[] { aLubricant },
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addCutterRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2, int aDuration, int aEUt,
+ boolean aCleanroom) {
+ return addCutterRecipe(aInput, null, aOutput1, aOutput2, aDuration, aEUt, aCleanroom);
+ }
+
+ @Deprecated
+ public boolean addCutterRecipe(ItemStack aInput, int aCircuit, ItemStack aOutput1, ItemStack aOutput2,
+ int aDuration, int aEUt) {
+ return addCutterRecipe(aInput, aCircuit, aOutput1, aOutput2, aDuration, aEUt, false);
+ }
+
+ @Deprecated
+ public boolean addCutterRecipe(ItemStack aInput, int aCircuit, ItemStack aOutput1, ItemStack aOutput2,
+ int aDuration, int aEUt, boolean aCleanroom) {
+ return addCutterRecipe(
+ aInput,
+ GT_Utility.getIntegratedCircuit(aCircuit),
+ aOutput1,
+ aOutput2,
+ aDuration,
+ aEUt,
+ aCleanroom);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addCutterRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2, int aDuration, int aEUt) {
+ return addCutterRecipe(aInput, aOutput1, aOutput2, aDuration, aEUt, false);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addCutterRecipe(ItemStack aInput, ItemStack aCircuit, ItemStack aOutput1, ItemStack aOutput2,
+ int aDuration, int aEUt) {
+ return addCutterRecipe(aInput, aCircuit, aOutput1, aOutput2, aDuration, aEUt, false);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addCutterRecipe(ItemStack aInput, ItemStack aCircuit, ItemStack aOutput1, ItemStack aOutput2,
+ int aDuration, int aEUt, boolean aCleanroom) {
+ return addCutterRecipe(
+ new ItemStack[] { aInput, aCircuit },
+ new ItemStack[] { aOutput1, aOutput2 },
+ aDuration,
+ aEUt,
+ aCleanroom ? -200 : 0);
+ }
+
+ @Deprecated
+ public boolean addCutterRecipe(ItemStack[] aInputs, ItemStack[] aOutputs, int aDuration, int aEUt,
+ boolean aCleanroom) {
+ return addCutterRecipe(aInputs, aOutputs, aDuration, aEUt, aCleanroom ? -200 : 0);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addCutterRecipe(ItemStack[] aInputs, ItemStack[] aOutputs, int aDuration, int aEUt, int aSpecial) {
+ if ((aInputs == null) || (aOutputs == null) || aInputs.length == 0 || aOutputs.length == 0) {
+ return false;
+ }
+ if (Arrays.stream(aOutputs)
+ .noneMatch(Objects::nonNull)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ if (!GT_Mod.gregtechproxy.mEnableCleanroom && aSpecial == -200) {
+ aSpecial = 0;
+ }
+ RecipeMaps.cutterRecipes.addRecipe(
+ true,
+ aInputs,
+ aOutputs,
+ null,
+ new FluidStack[] { Materials.Water.getFluid(Math.max(4, Math.min(1000, aDuration * aEUt / 320))) },
+ null,
+ aDuration * 2,
+ aEUt,
+ aSpecial);
+ RecipeMaps.cutterRecipes.addRecipe(
+ true,
+ aInputs,
+ aOutputs,
+ null,
+ new FluidStack[] { GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, aDuration * aEUt / 426))) },
+ null,
+ aDuration * 2,
+ aEUt,
+ aSpecial);
+ RecipeMaps.cutterRecipes.addRecipe(
+ true,
+ aInputs,
+ aOutputs,
+ null,
+ new FluidStack[] { Materials.Lubricant.getFluid(Math.max(1, Math.min(250, aDuration * aEUt / 1280))) },
+ null,
+ aDuration,
+ aEUt,
+ aSpecial);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAssemblerRecipe(ItemStack aInput1, Object aOreDict, int aAmount, FluidStack aFluidInput,
+ ItemStack aOutput1, int aDuration, int aEUt) {
+ for (ItemStack tStack : GT_OreDictUnificator.getOresImmutable(aOreDict)) {
+ if (GT_Utility.isStackValid(tStack)) addAssemblerRecipe(
+ aInput1,
+ GT_Utility.copyAmount(aAmount, tStack),
+ aFluidInput,
+ aOutput1,
+ aDuration,
+ aEUt);
+ }
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAssemblerRecipe(ItemStack[] aInputs, Object aOreDict, int aAmount, FluidStack aFluidInput,
+ ItemStack aOutput1, int aDuration, int aEUt) {
+ for (ItemStack tStack : GT_OreDictUnificator.getOresImmutable(aOreDict)) {
+ if (GT_Utility.isStackValid(tStack)) {
+ ItemStack[] extendedInputs = new ItemStack[aInputs.length + 1];
+ System.arraycopy(aInputs, 0, extendedInputs, 0, aInputs.length);
+ extendedInputs[aInputs.length] = GT_Utility.copyAmount(aAmount, tStack);
+ addAssemblerRecipe(extendedInputs, aFluidInput, aOutput1, aDuration, aEUt);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAssemblerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, int aDuration,
+ int aEUt) {
+ return addAssemblerRecipe(
+ new ItemStack[] { aInput1, aInput2 == null ? aInput1 : aInput2 },
+ null,
+ aOutput1,
+ aDuration,
+ aEUt,
+ false);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAssemblerRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, ItemStack aOutput1,
+ int aDuration, int aEUt) {
+ return addAssemblerRecipe(new ItemStack[] { aInput1, aInput2 }, aFluidInput, aOutput1, aDuration, aEUt);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAssemblerRecipe(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack aOutput1, int aDuration,
+ int aEUt) {
+ return addAssemblerRecipe(aInputs, aFluidInput, aOutput1, aDuration, aEUt, false);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAssemblerRecipe(ItemStack aInput1, ItemStack aInput2, FluidStack aFluidInput, ItemStack aOutput1,
+ int aDuration, int aEUt, boolean aCleanroom) {
+ if (aInput2 == null)
+ return addAssemblerRecipe(new ItemStack[] { aInput1 }, aFluidInput, aOutput1, aDuration, aEUt, aCleanroom);
+ return addAssemblerRecipe(
+ new ItemStack[] { aInput1, aInput2 },
+ aFluidInput,
+ aOutput1,
+ aDuration,
+ aEUt,
+ aCleanroom);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAssemblerRecipe(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack aOutput1, int aDuration,
+ int aEUt, boolean aCleanroom) {
+
+ if (areItemsAndFluidsBothNull(aInputs, new FluidStack[] { aFluidInput })) {
+ return false;
+ }
+
+ if (aDuration <= 0) {
+ return false;
+ }
+
+ if (!GT_Mod.gregtechproxy.mEnableCleanroom) {
+ aCleanroom = false;
+ }
+
+ if (!GT_Utility.isStackValid(aOutput1)) {
+ return false;
+ }
+
+ for (int oreID : OreDictionary.getOreIDs(aOutput1)) {
+ if (OreDictionary.getOreName(oreID)
+ .startsWith("circuit")) {
+ return this.addAssemblerRecipeNonOD(aInputs, aFluidInput, aOutput1, aDuration, aEUt, aCleanroom);
+ }
+ }
+
+ for (ItemStack aInput : aInputs) {
+ if (!GT_Utility.isStackValid(aInput)) {
+ GT_FML_LOGGER.debug("GT_RecipeAdder: Invalid input for (" + aOutput1 + ")");
+ }
+ }
+
+ RecipeMaps.assemblerRecipes.addRecipe(
+ true,
+ aInputs,
+ new ItemStack[] { aOutput1 },
+ null,
+ new FluidStack[] { aFluidInput },
+ null,
+ aDuration,
+ aEUt,
+ aCleanroom ? -200 : 0);
+
+ return true;
+ }
+
+ @Deprecated
+ public boolean addAssemblerRecipeNonOD(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack aOutput1,
+ int aDuration, int aEUt, boolean aCleanroom) {
+ if (areItemsAndFluidsBothNull(aInputs, new FluidStack[] { aFluidInput })) {
+ return false;
+ }
+
+ if (aDuration <= 0) {
+ return false;
+ }
+
+ if (!GT_Mod.gregtechproxy.mEnableCleanroom) {
+ aCleanroom = false;
+ }
+
+ if (!GT_Utility.isStackValid(aOutput1)) {
+ return false;
+ }
+
+ RecipeMaps.assemblerRecipes.addRecipe(
+ true,
+ aInputs,
+ new ItemStack[] { aOutput1 },
+ null,
+ new FluidStack[] { aFluidInput },
+ null,
+ aDuration,
+ aEUt,
+ aCleanroom ? -200 : 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addWiremillRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt) {
+ if ((aInput == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.wiremillRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addWiremillRecipe(ItemStack aInput, ItemStack aCircuit, ItemStack aOutput, int aDuration, int aEUt) {
+ if ((aInput == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.wiremillRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput, aCircuit },
+ new ItemStack[] { aOutput },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addPolarizerRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt) {
+ if ((aInput == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.polarizerRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addBenderRecipe(ItemStack aInput1, ItemStack aOutput1, int aDuration, int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.benderRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, ItemList.Circuit_Integrated.getWithDamage(0, aInput1.stackSize) },
+ new ItemStack[] { aOutput1 },
+ null,
+ null,
+ null,
+ null,
+ aDuration,
+ Math.max(aEUt, 1),
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addBenderRecipe(ItemStack aInput1, ItemStack aCircuit, ItemStack aOutput1, int aDuration, int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ GT_Recipe tRecipe = new GT_Recipe(
+ new ItemStack[] { aInput1, aCircuit },
+ new ItemStack[] { aOutput1 },
+ null,
+ null,
+ null,
+ null,
+ aDuration,
+ Math.max(aEUt, 1),
+ 0);
+ RecipeMaps.benderRecipes.addRecipe(tRecipe);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addExtruderRecipe(ItemStack aInput, ItemStack aShape, ItemStack aOutput, int aDuration, int aEUt) {
+ if ((aInput == null) || (aShape == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.extruderRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput, aShape },
+ new ItemStack[] { aOutput },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addSlicerRecipe(ItemStack aInput, ItemStack aShape, ItemStack aOutput, int aDuration, int aEUt) {
+ if ((aInput == null) || (aShape == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.slicerRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput, aShape },
+ new ItemStack[] { aOutput },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addOreWasherRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ FluidStack aFluidInput, int aDuration, int aEUt) {
+ if ((aInput == null) || (aFluidInput == null)
+ || ((aOutput1 == null) || (aOutput2 == null) || (aOutput3 == null))) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.oreWasherRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3 },
+ null,
+ new FluidStack[] { aFluidInput },
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addOreWasherRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ FluidStack aFluidInput, int[] aChances, int aDuration, int aEUt) {
+ if ((aInput == null) || (aFluidInput == null)
+ || ((aOutput1 == null) || (aOutput2 == null) || (aOutput3 == null))) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.oreWasherRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3 },
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addImplosionRecipe(ItemStack aInput1, int aInput2, ItemStack aOutput1, ItemStack aOutput2) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aInput2 <= 0) {
+ return false;
+ }
+ int tExplosives = Math.min(aInput2, 64);
+ int tGunpowder = tExplosives << 1; // Worst
+ int tDynamite = Math.max(1, tExplosives >> 1); // good
+ @SuppressWarnings("UnnecessaryLocalVariable")
+ int tTNT = tExplosives; // Slightly better
+ int tITNT = Math.max(1, tExplosives >> 2); // the best
+ // new GT_Recipe(aInput1, aInput2, aOutput1, aOutput2);
+ if (tGunpowder < 65) {
+ RecipeMaps.implosionRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, ItemList.Block_Powderbarrel.get(tGunpowder) },
+ new ItemStack[] { aOutput1, aOutput2 },
+ null,
+ null,
+ null,
+ null,
+ 20,
+ 30,
+ 0);
+ }
+ if (tDynamite < 17) {
+ RecipeMaps.implosionRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, GT_ModHandler.getIC2Item("dynamite", tDynamite, null) },
+ new ItemStack[] { aOutput1, aOutput2 },
+ null,
+ null,
+ null,
+ null,
+ 20,
+ 30,
+ 0);
+ }
+ RecipeMaps.implosionRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, new ItemStack(Blocks.tnt, tTNT) },
+ new ItemStack[] { aOutput1, aOutput2 },
+ null,
+ null,
+ null,
+ null,
+ 20,
+ 30,
+ 0);
+ RecipeMaps.implosionRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, GT_ModHandler.getIC2Item("industrialTnt", tITNT, null) },
+ new ItemStack[] { aOutput1, aOutput2 },
+ null,
+ null,
+ null,
+ null,
+ 20,
+ 30,
+ 0);
+
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addDistillationRecipe(ItemStack aInput1, int aInput2, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, ItemStack aOutput4, int aDuration, int aEUt) {
+ return false;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addUniversalDistillationRecipe(FluidStack aInput, FluidStack[] aOutputs, ItemStack aOutput2,
+ int aDuration, int aEUt) {
+ for (int i = 0; i < Math.min(aOutputs.length, 11); i++) {
+ addDistilleryRecipe(i + 1, aInput, aOutputs[i], aOutput2, aDuration * 2, aEUt / 4, false);
+ }
+
+ return addDistillationTowerRecipe(aInput, aOutputs, aOutput2, aDuration, aEUt);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addDistillationTowerRecipe(FluidStack aInput, FluidStack[] aOutputs, ItemStack aOutput2,
+ int aDuration, int aEUt) {
+ if (aInput == null || aOutputs == null || aOutputs.length < 1 || aOutputs.length > 11) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.distillationTowerRecipes.addRecipe(
+ false,
+ null,
+ new ItemStack[] { aOutput2 },
+ null,
+ new FluidStack[] { aInput },
+ aOutputs,
+ aDuration,
+ Math.max(1, aEUt),
+ 0);
+ return false;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addDistillationTowerRecipe(FluidStack aInput, ItemStack[] aCircuit, FluidStack[] aOutputs,
+ ItemStack aOutput2, int aDuration, int aEUt) {
+ if (aInput == null || aOutputs == null || aOutputs.length < 1 || aOutputs.length > 11) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.distillationTowerRecipes.addRecipe(
+ false,
+ aCircuit,
+ new ItemStack[] { aOutput2 },
+ null,
+ new FluidStack[] { aInput },
+ aOutputs,
+ aDuration,
+ Math.max(1, aEUt),
+ 0);
+ return false;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addUniversalDistillationRecipewithCircuit(FluidStack aInput, ItemStack[] aCircuit,
+ FluidStack[] aOutputs, ItemStack aOutput2, int aDuration, int aEUt) {
+ for (int i = 0; i < Math.min(aOutputs.length, 11); i++) {
+ addDistilleryRecipe(i + 1, aInput, aOutputs[i], aOutput2, aDuration * 2, aEUt / 4, false);
+ }
+ return addDistillationTowerRecipe(aInput, aCircuit, aOutputs, aOutput2, aDuration, aEUt);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addVacuumFreezerRecipe(ItemStack aInput1, ItemStack aOutput1, int aDuration, int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.vacuumFreezerRecipes.addRecipe(
+ false,
+ new ItemStack[] { aInput1 },
+ new ItemStack[] { aOutput1 },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ FluidStack tInputFluid = GT_Utility.getFluidForFilledItem(aInput1, true);
+ FluidStack tOutputFluid = GT_Utility.getFluidForFilledItem(aOutput1, true);
+ if (tInputFluid != null && tOutputFluid != null) {
+ addVacuumFreezerRecipe(tInputFluid, tOutputFluid, aDuration, aEUt);
+ }
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addVacuumFreezerRecipe(ItemStack aInput1, ItemStack aOutput1, int aDuration) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ addVacuumFreezerRecipe(aInput1, aOutput1, aDuration, 120);
+ FluidStack tInputFluid = GT_Utility.getFluidForFilledItem(aInput1, true);
+ FluidStack tOutputFluid = GT_Utility.getFluidForFilledItem(aOutput1, true);
+ if (tInputFluid != null && tOutputFluid != null) {
+ addVacuumFreezerRecipe(tInputFluid, tOutputFluid, aDuration, 120);
+ }
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addVacuumFreezerRecipe(FluidStack aInput1, FluidStack aOutput1, int aDuration, int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ RecipeMaps.vacuumFreezerRecipes.addRecipe(
+ false,
+ null,
+ null,
+ null,
+ new FluidStack[] { aInput1 },
+ new FluidStack[] { aOutput1 },
+ Math.max(1, aDuration),
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addVacuumFreezerRecipe(ItemStack[] aItemInput, FluidStack[] aFluidInput, ItemStack[] aItemOutput,
+ FluidStack[] aFluidOutput, int aDuration, int aEUt) {
+ RecipeMaps.vacuumFreezerRecipes.addRecipe(
+ false,
+ aItemInput,
+ aItemOutput,
+ null,
+ aFluidInput,
+ aFluidOutput,
+ Math.max(1, aDuration),
+ Math.max(1, aEUt),
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addGrinderRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, ItemStack aOutput4) {
+ return false;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addFuel(ItemStack aInput1, ItemStack aOutput1, int aEU, int aType) {
+ if (aInput1 == null) {
+ return false;
+ }
+ new GT_Recipe(aInput1, aOutput1, null, null, null, aEU, aType);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addSonictronSound(ItemStack aItemStack, String aSoundName) {
+ if ((aItemStack == null) || (aSoundName == null) || (aSoundName.equals(""))) {
+ return false;
+ }
+ GT_Mod.gregtechproxy.mSoundItems.add(aItemStack);
+ GT_Mod.gregtechproxy.mSoundNames.add(aSoundName);
+ if (aSoundName.startsWith("note.")) {
+ GT_Mod.gregtechproxy.mSoundCounts.add(25);
+ } else {
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ }
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addChemicalBathRecipe(ItemStack aInput, FluidStack aBathingFluid, ItemStack aOutput1,
+ ItemStack aOutput2, ItemStack aOutput3, FluidStack aFluidOutput, int[] aChances, int aDuration, int aEUt) {
+ return false;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addForgeHammerRecipe(ItemStack aInput1, ItemStack aOutput1, int aDuration, int aEUt) {
+ if ((aInput1 == null) || (aOutput1 == null)) {
+ return false;
+ }
+ RecipeMaps.hammerRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1 },
+ new ItemStack[] { aOutput1 },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addForgeHammerRecipe(ItemStack[] ItemInputArray, FluidStack[] FluidInputArray,
+ ItemStack[] ItemOutputArray, FluidStack[] FluidOutputArray, int aDuration, int aEUt) {
+
+ RecipeMaps.hammerRecipes.addRecipe(
+ true,
+ ItemInputArray,
+ ItemOutputArray,
+ null,
+ FluidInputArray,
+ FluidOutputArray,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addBoxingRecipe(ItemStack aContainedItem, ItemStack aEmptyBox, ItemStack aFullBox, int aDuration,
+ int aEUt) {
+ if ((aContainedItem == null) || (aFullBox == null)) {
+ return false;
+ }
+ RecipeMaps.packagerRecipes.addRecipe(
+ true,
+ new ItemStack[] { aContainedItem, aEmptyBox },
+ new ItemStack[] { aFullBox },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addUnboxingRecipe(ItemStack aFullBox, ItemStack aContainedItem, ItemStack aEmptyBox, int aDuration,
+ int aEUt) {
+ if ((aFullBox == null) || (aContainedItem == null)) {
+ return false;
+ }
+ RecipeMaps.unpackagerRecipes.addRecipe(
+ true,
+ new ItemStack[] { aFullBox },
+ new ItemStack[] { aContainedItem, aEmptyBox },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addThermalCentrifugeRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, int aDuration, int aEUt) {
+ if ((aInput == null) || (aOutput1 == null)) {
+ return false;
+ }
+ RecipeMaps.thermalCentrifugeRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3 },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addThermalCentrifugeRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, int[] aChances, int aDuration, int aEUt) {
+ if ((aInput == null) || (aOutput1 == null)) {
+ return false;
+ }
+ RecipeMaps.thermalCentrifugeRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3 },
+ null,
+ aChances,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAmplifier(ItemStack aAmplifierItem, int aDuration, int aAmplifierAmountOutputted) {
+ if ((aAmplifierItem == null) || (aAmplifierAmountOutputted <= 0)) {
+ return false;
+ }
+ RecipeMaps.amplifierRecipes.addRecipe(
+ true,
+ new ItemStack[] { aAmplifierItem },
+ null,
+ null,
+ null,
+ new FluidStack[] { Materials.UUAmplifier.getFluid(aAmplifierAmountOutputted) },
+ aDuration,
+ 30,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addBrewingRecipe(ItemStack aIngredient, Fluid aInput, Fluid aOutput, int aDuration, int aEUt,
+ boolean aHidden) {
+ if ((aIngredient == null) || (aInput == null) || (aOutput == null)) {
+ return false;
+ }
+ GT_Recipe tRecipe = RecipeMaps.brewingRecipes.addRecipe(
+ false,
+ new ItemStack[] { aIngredient },
+ null,
+ null,
+ new FluidStack[] { new FluidStack(aInput, 750) },
+ new FluidStack[] { new FluidStack(aOutput, 750) },
+ aDuration,
+ aEUt,
+ 0);
+ if ((aHidden) && (tRecipe != null)) {
+ tRecipe.mHidden = true;
+ }
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addBrewingRecipe(ItemStack aIngredient, Fluid aInput, Fluid aOutput, boolean aHidden) {
+ return addBrewingRecipe(aIngredient, aInput, aOutput, 128, 4, aHidden);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addBrewingRecipeCustom(ItemStack aIngredient, FluidStack aInput, FluidStack aOutput, int aDuration,
+ int aEUt, boolean aHidden) {
+ if ((aInput == null) || (aOutput == null)) {
+ return false;
+ }
+ GT_Recipe tRecipe = RecipeMaps.brewingRecipes.addRecipe(
+ false,
+ new ItemStack[] { aIngredient },
+ null,
+ null,
+ new FluidStack[] { aInput },
+ new FluidStack[] { aOutput },
+ aDuration,
+ aEUt,
+ 0);
+ if ((aHidden) && (tRecipe != null)) {
+ tRecipe.mHidden = true;
+ }
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addFermentingRecipe(FluidStack aInput, FluidStack aOutput, int aDuration, int aEUt,
+ boolean aHidden) {
+ if ((aInput == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ GT_Recipe tRecipe = RecipeMaps.fermentingRecipes.addRecipe(
+ false,
+ null,
+ null,
+ null,
+ new FluidStack[] { aInput },
+ new FluidStack[] { aOutput },
+ aDuration,
+ aEUt,
+ 0);
+ if ((aHidden) && (tRecipe != null)) {
+ tRecipe.mHidden = true;
+ }
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addFermentingRecipe(FluidStack aInput, FluidStack aOutput, int aDuration, boolean aHidden) {
+ return addFermentingRecipe(aInput, aOutput, aDuration, 2, aHidden);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addDistilleryRecipe(ItemStack aCircuit, FluidStack aInput, FluidStack aOutput,
+ ItemStack aSolidOutput, int aDuration, int aEUt, boolean aHidden) {
+ if ((aInput == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ // reduce the batch size if fluid amount is exceeding
+ int tScale = (Math.max(aInput.amount, aOutput.amount) + 999) / 1000;
+ if (tScale <= 0) tScale = 1;
+ if (tScale > 1) {
+ // trying to find whether there is a better factor
+ for (int i = tScale; i <= 5; i++) {
+ if (aInput.amount % i == 0 && aDuration % i == 0) {
+ tScale = i;
+ break;
+ }
+ }
+ for (int i = tScale; i <= 5; i++) {
+ if (aInput.amount % i == 0 && aDuration % i == 0 && aOutput.amount % i == 0) {
+ tScale = i;
+ break;
+ }
+ }
+ aInput = new FluidStack(aInput.getFluid(), (aInput.amount + tScale - 1) / tScale);
+ aOutput = new FluidStack(aOutput.getFluid(), aOutput.amount / tScale);
+ if (aSolidOutput != null) {
+ ItemData tData = GT_OreDictUnificator.getItemData(aSolidOutput);
+ if (tData != null && (tData.mPrefix == OrePrefixes.dust
+ || OrePrefixes.dust.mFamiliarPrefixes.contains(tData.mPrefix))) {
+ aSolidOutput = GT_OreDictUnificator
+ .getDust(tData.mMaterial.mMaterial, tData.mMaterial.mAmount * aSolidOutput.stackSize / tScale);
+ } else {
+ if (aSolidOutput.stackSize / tScale == 0) aSolidOutput = GT_Values.NI;
+ else aSolidOutput = new ItemStack(aSolidOutput.getItem(), aSolidOutput.stackSize / tScale);
+ }
+ }
+ aDuration = (aDuration + tScale - 1) / tScale;
+ }
+
+ GT_Recipe tRecipe = RecipeMaps.distilleryRecipes.addRecipe(
+ true,
+ new ItemStack[] { aCircuit },
+ new ItemStack[] { aSolidOutput },
+ null,
+ new FluidStack[] { aInput },
+ new FluidStack[] { aOutput },
+ aDuration,
+ aEUt,
+ 0);
+ if ((aHidden) && (tRecipe != null)) {
+ tRecipe.mHidden = true;
+ }
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addDistilleryRecipe(ItemStack aCircuit, FluidStack aInput, FluidStack aOutput, int aDuration,
+ int aEUt, boolean aHidden) {
+ return addDistilleryRecipe(aCircuit, aInput, aOutput, null, aDuration, aEUt, aHidden);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addDistilleryRecipe(int circuitConfig, FluidStack aInput, FluidStack aOutput, ItemStack aSolidOutput,
+ int aDuration, int aEUt, boolean aHidden) {
+ return addDistilleryRecipe(
+ GT_Utility.getIntegratedCircuit(circuitConfig),
+ aInput,
+ aOutput,
+ aSolidOutput,
+ aDuration,
+ aEUt,
+ aHidden);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addDistilleryRecipe(int circuitConfig, FluidStack aInput, FluidStack aOutput, int aDuration,
+ int aEUt, boolean aHidden) {
+ return addDistilleryRecipe(
+ GT_Utility.getIntegratedCircuit(circuitConfig),
+ aInput,
+ aOutput,
+ aDuration,
+ aEUt,
+ aHidden);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addFluidSolidifierRecipe(final ItemStack[] itemInputs, final FluidStack[] fluidInputs,
+ final ItemStack[] itemOutputs, final FluidStack[] fluidOutputs, final int EUPerTick,
+ final int aDurationInTicks) {
+ RecipeMaps.fluidSolidifierRecipes
+ .addRecipe(true, itemInputs, itemOutputs, null, fluidInputs, fluidOutputs, aDurationInTicks, EUPerTick, 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addFluidSolidifierRecipe(ItemStack aMold, FluidStack aInput, ItemStack aOutput, int aDuration,
+ int aEUt) {
+ if ((aMold == null) || (aInput == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aInput.isFluidEqual(Materials.PhasedGold.getMolten(144))) {
+ aInput = Materials.VibrantAlloy.getMolten(aInput.amount);
+ }
+ if (aInput.isFluidEqual(Materials.PhasedIron.getMolten(144))) {
+ aInput = Materials.PulsatingIron.getMolten(aInput.amount);
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.fluidSolidifierRecipes.addRecipe(
+ true,
+ new ItemStack[] { aMold },
+ new ItemStack[] { aOutput },
+ null,
+ new FluidStack[] { aInput },
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addFluidSmelterRecipe(ItemStack aInput, ItemStack aRemains, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt) {
+ return addFluidSmelterRecipe(aInput, aRemains, aOutput, aChance, aDuration, aEUt, false);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addFluidSmelterRecipe(ItemStack aInput, ItemStack aRemains, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt, boolean hidden) {
+ if ((aInput == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aOutput.isFluidEqual(Materials.PhasedGold.getMolten(1))) {
+ aOutput = Materials.VibrantAlloy.getMolten(aOutput.amount);
+ }
+ if (aOutput.isFluidEqual(Materials.PhasedIron.getMolten(1))) {
+ aOutput = Materials.PulsatingIron.getMolten(aOutput.amount);
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ GT_Recipe tRecipe = RecipeMaps.fluidExtractionRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aRemains },
+ null,
+ new int[] { aChance },
+ null,
+ new FluidStack[] { aOutput },
+ aDuration,
+ aEUt,
+ 0);
+ if ((hidden) && (tRecipe != null)) {
+ tRecipe.mHidden = true;
+ }
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addFluidExtractionRecipe(ItemStack aInput, ItemStack aRemains, FluidStack aOutput, int aChance,
+ int aDuration, int aEUt) {
+ if ((aInput == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aOutput.isFluidEqual(Materials.PhasedGold.getMolten(1))) {
+ aOutput = Materials.VibrantAlloy.getMolten(aOutput.amount);
+ }
+ if (aOutput.isFluidEqual(Materials.PhasedIron.getMolten(1))) {
+ aOutput = Materials.PulsatingIron.getMolten(aOutput.amount);
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.fluidExtractionRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aRemains },
+ null,
+ new int[] { aChance },
+ null,
+ new FluidStack[] { aOutput },
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addFluidCannerRecipe(ItemStack aInput, ItemStack aOutput, FluidStack aFluidInput,
+ FluidStack aFluidOutput) {
+ int aDuration = aFluidOutput == null ? aFluidInput.amount / 62 : aFluidOutput.amount / 62;
+
+ if (aInput == null || aOutput == null) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.fluidCannerRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ null,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ 1,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addFluidCannerRecipe(ItemStack aInput, ItemStack aOutput, FluidStack aFluidInput,
+ FluidStack aFluidOutput, int aDuration, int aEUt) {
+ if (aInput == null || aOutput == null) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.fluidCannerRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ null,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addChemicalBathRecipe(ItemStack aInput, FluidStack aBathingFluid, ItemStack aOutput1,
+ ItemStack aOutput2, ItemStack aOutput3, int[] aChances, int aDuration, int aEUt) {
+ if ((aInput == null) || (aBathingFluid == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.chemicalBathRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3 },
+ null,
+ aChances,
+ new FluidStack[] { aBathingFluid },
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addChemicalBathRecipe(ItemStack aInput, FluidStack aBathingFluid, FluidStack aFluidOutput,
+ ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3, int[] aChances, int aDuration, int aEUt) {
+ if ((aInput == null) || (aBathingFluid == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.chemicalBathRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3 },
+ null,
+ aChances,
+ new FluidStack[] { aBathingFluid },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addElectromagneticSeparatorRecipe(ItemStack aInput, ItemStack aOutput1, ItemStack aOutput2,
+ ItemStack aOutput3, int[] aChances, int aDuration, int aEUt) {
+ if ((aInput == null) || (aOutput1 == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.electroMagneticSeparatorRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3 },
+ null,
+ aChances,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addExtractorRecipe(ItemStack aInput, ItemStack aOutput, int aDuration, int aEUt) {
+ if ((aInput == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.extractorRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addPrinterRecipe(ItemStack aInput, FluidStack aFluid, ItemStack aSpecialSlot, ItemStack aOutput,
+ int aDuration, int aEUt) {
+ if ((aInput == null) || (aFluid == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.printerRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ new ItemStack[] { aOutput },
+ aSpecialSlot,
+ null,
+ new FluidStack[] { aFluid },
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAutoclaveRecipe(ItemStack aInput, FluidStack aFluid, ItemStack aOutput, int aChance,
+ int aDuration, int aEUt, boolean aCleanroom) {
+ return addAutoclaveRecipe(aInput, aFluid, aOutput, aChance, aDuration, aEUt);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAutoclaveRecipe(ItemStack aInput, FluidStack aFluid, ItemStack aOutput, int aChance,
+ int aDuration, int aEUt) {
+ return addAutoclaveRecipe(aInput, null, aFluid, aOutput, aChance, aDuration, aEUt, false);
+ }
+
+ @Deprecated
+ public boolean addAutoclaveRecipe(ItemStack aInput, ItemStack aCircuit, FluidStack aFluid, ItemStack aOutput,
+ int aChance, int aDuration, int aEUt) {
+ return addAutoclaveRecipe(aInput, aCircuit, aFluid, aOutput, aChance, aDuration, aEUt, false);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAutoclaveRecipe(ItemStack aInput, ItemStack aCircuit, FluidStack aFluidIn, ItemStack aOutput,
+ int aChance, int aDuration, int aEUt, boolean aCleanroom) {
+ return addAutoclaveRecipe(aInput, aCircuit, aFluidIn, null, aOutput, aChance, aDuration, aEUt, aCleanroom);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAutoclaveRecipe(ItemStack aInput, ItemStack aCircuit, FluidStack aFluidIn, FluidStack aFluidOut,
+ ItemStack aOutput, int aChance, int aDuration, int aEUt, boolean aCleanroom) {
+ if ((aInput == null) || (aFluidIn == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ if (!GT_Mod.gregtechproxy.mEnableCleanroom) {
+ aCleanroom = false;
+ }
+ RecipeMaps.autoclaveRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput, aCircuit },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] { aChance },
+ new FluidStack[] { aFluidIn },
+ new FluidStack[] { aFluidOut },
+ aDuration,
+ aEUt,
+ aCleanroom ? -200 : 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAutoclaveSpaceRecipe(ItemStack aInput, FluidStack aFluid, ItemStack aOutput, int aChance,
+ int aDuration, int aEUt, boolean aCleanroom) {
+ return addAutoclaveRecipe(aInput, aFluid, aOutput, aChance, aDuration, aEUt, aCleanroom);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAutoclaveSpaceRecipe(ItemStack aInput, ItemStack aCircuit, FluidStack aFluid, ItemStack aOutput,
+ int aChance, int aDuration, int aEUt, boolean aCleanroom) {
+ if ((aInput == null) || (aFluid == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ if (!GT_Mod.gregtechproxy.mEnableCleanroom) {
+ aCleanroom = false;
+ }
+ RecipeMaps.autoclaveRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput, aCircuit },
+ new ItemStack[] { aOutput },
+ null,
+ new int[] { aChance },
+ new FluidStack[] { aFluid },
+ null,
+ aDuration,
+ aEUt,
+ aCleanroom ? -100 : 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAutoclave4Recipe(ItemStack aInput, ItemStack aCircuit, FluidStack aFluidIn, FluidStack aFluidOut,
+ ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUt, boolean aCleanroom) {
+ if ((aInput == null) || (aFluidIn == null) || (aOutputs == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ if (!GT_Mod.gregtechproxy.mEnableCleanroom) {
+ aCleanroom = false;
+ }
+ RecipeMaps.autoclaveRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput, aCircuit },
+ aOutputs,
+ null,
+ aChances,
+ new FluidStack[] { aFluidIn },
+ new FluidStack[] { aFluidOut },
+ aDuration,
+ aEUt,
+ aCleanroom ? -200 : 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addMixerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput, int aDuration, int aEUt) {
+ return addMixerRecipe(
+ aInput1,
+ aInput2,
+ aInput3,
+ aInput4,
+ null,
+ null,
+ null,
+ null,
+ null,
+ aFluidInput,
+ aFluidOutput,
+ aOutput,
+ aDuration,
+ aEUt);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addMixerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ ItemStack aInput5, ItemStack aInput6, FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput,
+ int aDuration, int aEUt) {
+ return addMixerRecipe(
+ aInput1,
+ aInput2,
+ aInput3,
+ aInput4,
+ aInput5,
+ aInput6,
+ null,
+ null,
+ null,
+ aFluidInput,
+ aFluidOutput,
+ aOutput,
+ aDuration,
+ aEUt);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addMixerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ ItemStack aInput5, ItemStack aInput6, ItemStack aInput7, ItemStack aInput8, ItemStack aInput9,
+ FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput, int aDuration, int aEUt) {
+ if (((aInput1 == null) && (aFluidInput == null)) || ((aOutput == null) && (aFluidOutput == null))) {
+ return false;
+ }
+ if ((aOutput != null) && (aDuration <= 0)) {
+ return false;
+ }
+ if ((aFluidOutput != null) && (aDuration <= 0)) {
+ return false;
+ }
+ RecipeMaps.mixerRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2, aInput3, aInput4, aInput5, aInput6, aInput7, aInput8, aInput9 },
+ new ItemStack[] { aOutput },
+ null,
+ null,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ 0);
+ ItemStack[] itemInputs = { aInput1, aInput2, aInput3, aInput4, aInput5, aInput6, aInput7, aInput8, aInput9 };
+ ItemStack[] itemOutputs = { aOutput };
+ FluidStack[] fluidInputs = { aFluidInput, null, null, null, null, null, null, null, null, null };
+ FluidStack[] fluidOutputs = { aFluidOutput, null };
+
+ byte iNumber = 0;
+ byte oNumber = 0;
+
+ for (ItemStack item : itemInputs) {
+ if (item != null) {
+ if (GT_Utility.getFluidForFilledItem(aInput1, true) != null || GT_Utility.isCellEmpty(item)) {
+ fluidInputs[iNumber + 1] = GT_Utility.convertCellToFluid(item);
+ itemInputs[iNumber] = null;
+ }
+ }
+ iNumber++;
+ }
+
+ for (ItemStack item : itemOutputs) {
+ if (item != null) {
+ if (GT_Utility.getFluidForFilledItem(item, true) != null || GT_Utility.isCellEmpty(item)) {
+ fluidOutputs[oNumber + 1] = GT_Utility.convertCellToFluid(item);
+ itemOutputs[oNumber] = null;
+ }
+ }
+ oNumber++;
+ }
+
+ RecipeMaps.mixerNonCellRecipes
+ .addRecipe(false, itemInputs, itemOutputs, null, null, fluidInputs, fluidOutputs, aDuration, aEUt, 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addMixerRecipe(ItemStack[] ItemInputArray, FluidStack[] FluidInputArray, ItemStack[] ItemOutputArray,
+ FluidStack[] FluidOutputArray, int aDuration, int aEUt) {
+ RecipeMaps.mixerRecipes.addRecipe(
+ false,
+ ItemInputArray,
+ ItemOutputArray,
+ null,
+ null,
+ FluidInputArray,
+ FluidOutputArray,
+ aDuration,
+ aEUt,
+ 0);
+ List<ItemStack> tItemInputList;
+ if (ItemInputArray == null) {
+ tItemInputList = new ArrayList<>(1);
+ } else {
+ tItemInputList = new ArrayList<>(Arrays.asList(ItemInputArray));
+ }
+ List<FluidStack> tFluidInputList;
+ if (FluidInputArray != null) {
+ tFluidInputList = new ArrayList<>(Arrays.asList(FluidInputArray));
+ } else {
+ tFluidInputList = new ArrayList<>(1);
+ }
+ for (int i = 0; i < tItemInputList.size(); i++) {
+ if (tItemInputList.get(i) != null) {
+ if (GT_Utility.getFluidForFilledItem(tItemInputList.get(i), true) != null
+ || GT_Utility.isCellEmpty(tItemInputList.get(i))) {
+ tFluidInputList.add(GT_Utility.convertCellToFluid(tItemInputList.get(i)));
+ tItemInputList.set(i, null);
+ }
+ }
+ }
+ List<ItemStack> tItemOutputList;
+ if (ItemOutputArray == null) {
+ tItemOutputList = new ArrayList<>(1);
+ } else {
+ tItemOutputList = new ArrayList<>(Arrays.asList(ItemOutputArray));
+ }
+ List<FluidStack> tFluidOutputList;
+ if (FluidOutputArray != null) {
+ tFluidOutputList = new ArrayList<>(Arrays.asList(FluidOutputArray));
+ } else {
+ tFluidOutputList = new ArrayList<>(1);
+ }
+ for (int i = 0; i < tItemOutputList.size(); i++) {
+ if (tItemOutputList.get(i) != null) {
+ if (GT_Utility.getFluidForFilledItem(tItemOutputList.get(i), true) != null
+ || GT_Utility.isCellEmpty(tItemOutputList.get(i))) {
+ tFluidInputList.add(GT_Utility.convertCellToFluid(tItemOutputList.get(i)));
+ tItemOutputList.set(i, null);
+ }
+ }
+ }
+
+ ItemStack[] tItemInputArray = new ItemStack[tItemInputList.size()];
+ for (int i = 0; i < tItemInputArray.length; i++) tItemInputArray[i] = tItemInputList.get(i);
+
+ FluidStack[] tFluidInputArray = new FluidStack[tFluidInputList.size()];
+ for (int i = 0; i < tFluidInputArray.length; i++) tFluidInputArray[i] = tFluidInputList.get(i);
+
+ ItemStack[] tItemOutputArray = new ItemStack[tItemOutputList.size()];
+ for (int i = 0; i < tItemOutputArray.length; i++) tItemOutputArray[i] = tItemOutputList.get(i);
+
+ FluidStack[] tFluidOutputArray = new FluidStack[tFluidOutputList.size()];
+ for (int i = 0; i < tFluidOutputArray.length; i++) tFluidOutputArray[i] = tFluidOutputList.get(i);
+
+ RecipeMaps.mixerNonCellRecipes.addRecipe(
+ false,
+ tItemInputArray,
+ tItemOutputArray,
+ null,
+ null,
+ tFluidInputArray,
+ tFluidOutputArray,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addMixerRecipe(ItemStack aInput1, ItemStack aInput2, ItemStack aInput3, ItemStack aInput4,
+ ItemStack aInput5, ItemStack aInput6, ItemStack aInput7, ItemStack aInput8, ItemStack aInput9,
+ FluidStack aFluidInput, FluidStack aFluidOutput, ItemStack aOutput1, ItemStack aOutput2, ItemStack aOutput3,
+ ItemStack aOutput4, int aDuration, int aEUt) {
+ if (((aInput1 == null) && (aFluidInput == null)) || ((aOutput1 == null) && (aFluidOutput == null))) {
+ return false;
+ }
+ if ((aOutput1 != null) && (aDuration <= 0)) {
+ return false;
+ }
+ if ((aFluidOutput != null) && (aDuration <= 0)) {
+ return false;
+ }
+ RecipeMaps.mixerRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput1, aInput2, aInput3, aInput4, aInput5, aInput6, aInput7, aInput8, aInput9 },
+ new ItemStack[] { aOutput1, aOutput2, aOutput3, aOutput4 },
+ null,
+ null,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ 0);
+ ItemStack[] itemInputs = { aInput1, aInput2, aInput3, aInput4, aInput5, aInput6, aInput7, aInput8, aInput9 };
+ ItemStack[] itemOutputs = { aOutput1, aOutput2, aOutput3, aOutput4 };
+ FluidStack[] fluidInputs = { aFluidInput, null, null, null, null, null, null, null, null, null };
+ FluidStack[] fluidOutputs = { aFluidOutput, null, null, null, null };
+
+ byte iNumber = 0;
+ byte oNumber = 0;
+
+ for (ItemStack item : itemInputs) {
+ if (item != null) {
+ if (GT_Utility.getFluidForFilledItem(aInput1, true) != null || GT_Utility.isCellEmpty(item)) {
+ fluidInputs[iNumber + 1] = GT_Utility.convertCellToFluid(item);
+ itemInputs[iNumber] = null;
+ }
+ }
+ iNumber++;
+ }
+
+ for (ItemStack item : itemOutputs) {
+ if (item != null) {
+ if (GT_Utility.getFluidForFilledItem(item, true) != null || GT_Utility.isCellEmpty(item)) {
+ fluidOutputs[oNumber + 1] = GT_Utility.convertCellToFluid(item);
+ itemOutputs[oNumber] = null;
+ }
+ }
+ oNumber++;
+ }
+
+ RecipeMaps.mixerNonCellRecipes
+ .addRecipe(false, itemInputs, itemOutputs, null, null, fluidInputs, fluidOutputs, aDuration, aEUt, 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addLaserEngraverRecipe(ItemStack aItemToEngrave, ItemStack aLens, ItemStack aEngravedItem,
+ int aDuration, int aEUt) {
+ return addLaserEngraverRecipe(aItemToEngrave, aLens, aEngravedItem, aDuration, aEUt, false);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addLaserEngraverRecipe(ItemStack aItemToEngrave, ItemStack aLens, ItemStack aEngravedItem,
+ int aDuration, int aEUt, boolean aCleanroom) {
+ if ((aItemToEngrave == null) || (aLens == null) || (aEngravedItem == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ if (!GT_Mod.gregtechproxy.mEnableCleanroom) {
+ aCleanroom = false;
+ }
+ RecipeMaps.laserEngraverRecipes.addRecipe(
+ true,
+ new ItemStack[] { aItemToEngrave, aLens },
+ new ItemStack[] { aEngravedItem },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ aCleanroom ? -200 : 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addLaserEngraverRecipe(ItemStack[] ItemInputArray, FluidStack[] FluidInputArray,
+ ItemStack[] OutputItemArray, FluidStack[] FluidOutputArray, int aDuration, int aEUt, boolean aCleanroom) {
+ RecipeMaps.laserEngraverRecipes.addRecipe(
+ false,
+ ItemInputArray,
+ OutputItemArray,
+ null,
+ null,
+ FluidInputArray,
+ FluidOutputArray,
+ aDuration,
+ aEUt,
+ aCleanroom ? -200 : 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addFormingPressRecipe(ItemStack aItemToImprint, ItemStack aForm, ItemStack aImprintedItem,
+ int aDuration, int aEUt) {
+ if ((aItemToImprint == null) || (aForm == null) || (aImprintedItem == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.formingPressRecipes.addRecipe(
+ true,
+ new ItemStack[] { aItemToImprint, aForm },
+ new ItemStack[] { aImprintedItem },
+ null,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addFormingPressRecipe(ItemStack[] ItemInputArray, ItemStack[] OutputItemArray, int aDuration,
+ int aEUt) {
+ if ((ItemInputArray == null) || (OutputItemArray == null)) {
+ return false;
+ }
+ RecipeMaps.formingPressRecipes
+ .addRecipe(true, ItemInputArray, OutputItemArray, null, null, null, aDuration, aEUt, 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addFluidHeaterRecipe(ItemStack aItem, FluidStack aOutput, int aDuration, int aEUt) {
+ if ((aItem == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.fluidHeaterRecipes.addRecipe(
+ true,
+ new ItemStack[] { aItem },
+ null,
+ null,
+ null,
+ new FluidStack[] { aOutput },
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addFluidHeaterRecipe(ItemStack aCircuit, FluidStack aInput, FluidStack aOutput, int aDuration,
+ int aEUt) {
+ if ((aInput == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.fluidHeaterRecipes.addRecipe(
+ true,
+ new ItemStack[] { aCircuit },
+ null,
+ null,
+ new FluidStack[] { aInput },
+ new FluidStack[] { aOutput },
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addSifterRecipe(ItemStack aItemToSift, ItemStack[] aSiftedItems, int[] aChances, int aDuration,
+ int aEUt) {
+ if ((aItemToSift == null) || (aSiftedItems == null)) {
+ return false;
+ }
+ for (ItemStack tStack : aSiftedItems) {
+ if (tStack != null) {
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.sifterRecipes.addRecipe(
+ true,
+ new ItemStack[] { aItemToSift },
+ aSiftedItems,
+ null,
+ aChances,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addSifterRecipe(ItemStack[] ItemInputArray, FluidStack[] FluidInputArray,
+ ItemStack[] OutputItemArray, FluidStack[] FluidOutputArray, int[] aChances, int aDuration, int aEUt,
+ boolean aCleanroom) {
+ RecipeMaps.sifterRecipes.addRecipe(
+ false,
+ ItemInputArray,
+ OutputItemArray,
+ null,
+ aChances,
+ FluidInputArray,
+ FluidOutputArray,
+ aDuration,
+ aEUt,
+ aCleanroom ? -200 : 0);
+ return true;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addArcFurnaceRecipe(ItemStack aInput, ItemStack[] aOutputs, int[] aChances, int aDuration,
+ int aEUt) {
+ return addArcFurnaceRecipe(aInput, aOutputs, aChances, aDuration, aEUt, false);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addArcFurnaceRecipe(ItemStack aInput, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUt,
+ boolean hidden) {
+ if ((aInput == null) || (aOutputs == null)) {
+ return false;
+ }
+ for (ItemStack tStack : aOutputs) {
+ if (tStack != null) {
+ if (aDuration <= 0) {
+ return false;
+ }
+ GT_Recipe sRecipe = RecipeMaps.arcFurnaceRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ aOutputs,
+ null,
+ aChances,
+ new FluidStack[] { Materials.Oxygen.getGas(aDuration) },
+ null,
+ aDuration,
+ Math.max(1, aEUt),
+ 0);
+ if ((hidden) && (sRecipe != null)) {
+ sRecipe.mHidden = true;
+ }
+ for (Materials tMaterial : new Materials[] { Materials.Argon, Materials.Nitrogen }) {
+ if (tMaterial.mPlasma != null) {
+ int tPlasmaAmount = (int) Math.max(1L, aDuration / (tMaterial.getMass() * 16L));
+ GT_Recipe tRecipe = RecipeMaps.plasmaArcFurnaceRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ aOutputs,
+ null,
+ aChances,
+ new FluidStack[] { tMaterial.getPlasma(tPlasmaAmount) },
+ new FluidStack[] { tMaterial.getGas(tPlasmaAmount) },
+ Math.max(1, aDuration / 16),
+ Math.max(1, aEUt / 3),
+ 0);
+ if ((hidden) && (tRecipe != null)) {
+ tRecipe.mHidden = true;
+ }
+ }
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addSimpleArcFurnaceRecipe(ItemStack aInput, FluidStack aFluidInput, ItemStack[] aOutputs,
+ int[] aChances, int aDuration, int aEUt) {
+ if ((aInput == null) || (aOutputs == null) || aFluidInput == null) {
+ return false;
+ }
+ for (ItemStack tStack : aOutputs) {
+ if (tStack != null) {
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.arcFurnaceRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ aOutputs,
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ null,
+ aDuration,
+ Math.max(1, aEUt),
+ 0);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addPlasmaArcFurnaceRecipe(ItemStack aInput, FluidStack aFluidInput, ItemStack[] aOutputs,
+ int[] aChances, int aDuration, int aEUt) {
+ if ((aInput == null) || (aOutputs == null) || aFluidInput == null) {
+ return false;
+ }
+ for (ItemStack tStack : aOutputs) {
+ if (tStack != null) {
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.plasmaArcFurnaceRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ aOutputs,
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ null,
+ aDuration,
+ Math.max(1, aEUt),
+ 0);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addPlasmaArcFurnaceRecipe(ItemStack aInput, FluidStack aFluidInput, ItemStack[] aOutputs,
+ FluidStack aFluidOutput, int[] aChances, int aDuration, int aEUt) {
+ if ((aInput == null) || (aOutputs == null) || aFluidInput == null) {
+ return false;
+ }
+ for (ItemStack tStack : aOutputs) {
+ if (tStack != null) {
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.plasmaArcFurnaceRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ aOutputs,
+ null,
+ aChances,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ Math.max(1, aEUt),
+ 0);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Deprecated
+ @Override
+ public boolean addPulveriserRecipe(ItemStack aInput, ItemStack[] aOutputs, int[] aChances, int aDuration,
+ int aEUt) {
+ return addPulveriserRecipe(aInput, aOutputs, aChances, aDuration, aEUt, false);
+ }
+
+ @Deprecated
+ @Override
+ public boolean addPulveriserRecipe(ItemStack aInput, ItemStack[] aOutputs, int[] aChances, int aDuration, int aEUt,
+ boolean hidden) {
+ if ((aInput == null) || (aOutputs == null)) {
+ return false;
+ }
+ for (ItemStack tStack : aOutputs) {
+ if (tStack != null) {
+ if (aDuration <= 0) {
+ return false;
+ }
+ GT_Recipe tRecipe = RecipeMaps.maceratorRecipes.addRecipe(
+ true,
+ new ItemStack[] { aInput },
+ aOutputs,
+ null,
+ aChances,
+ null,
+ null,
+ aDuration,
+ aEUt,
+ 0);
+ if ((hidden) && (tRecipe != null)) {
+ tRecipe.mHidden = true;
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addPyrolyseRecipe(ItemStack aInput, FluidStack aFluidInput, int intCircuit, ItemStack aOutput,
+ FluidStack aFluidOutput, int aDuration, int aEUt) {
+ if (aInput == null) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.pyrolyseRecipes.addRecipe(
+ false,
+ new ItemStack[] { aInput, ItemList.Circuit_Integrated.getWithDamage(0L, intCircuit) },
+ new ItemStack[] { aOutput },
+ null,
+ null,
+ new FluidStack[] { aFluidInput },
+ new FluidStack[] { aFluidOutput },
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addCrackingRecipe(FluidStack aInput, FluidStack aOutput, int aDuration, int aEUt) {
+ return false;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addCrackingRecipe(int circuitConfig, FluidStack aInput, FluidStack aInput2, FluidStack aOutput,
+ int aDuration, int aEUt) {
+ if ((aInput == null && aInput2 == null) || (aOutput == null)) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ RecipeMaps.crackingRecipes.addRecipe(
+ false,
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(circuitConfig) },
+ null,
+ null,
+ null,
+ new FluidStack[] { aInput, aInput2 },
+ new FluidStack[] { aOutput },
+ aDuration,
+ aEUt,
+ 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAssemblylineRecipe(ItemStack aResearchItem, int aResearchTime, ItemStack[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt) {
+ if ((aResearchItem == null) || (aResearchTime <= 0)
+ || (aInputs == null)
+ || (aOutput == null)
+ || aInputs.length > 15
+ || aInputs.length < 4) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ for (ItemStack tItem : aInputs) {
+ if (tItem == null) {
+ GT_FML_LOGGER.info(
+ "addAssemblingLineRecipe " + aResearchItem.getDisplayName()
+ + " --> "
+ + aOutput.getUnlocalizedName()
+ + " there is some null item in that recipe");
+ }
+ }
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { aResearchItem },
+ new ItemStack[] { aOutput },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Writes Research result") },
+ null,
+ null,
+ aResearchTime,
+ 30,
+ -201);
+ RecipeMaps.assemblylineVisualRecipes.addFakeRecipe(
+ false,
+ aInputs,
+ new ItemStack[] { aOutput },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Reads Research result") },
+ aFluidInputs,
+ null,
+ aDuration,
+ aEUt,
+ 0,
+ false);
+ GT_Recipe_AssemblyLine tRecipe = new GT_Recipe_AssemblyLine(
+ aResearchItem,
+ aResearchTime,
+ aInputs,
+ aFluidInputs,
+ aOutput,
+ aDuration,
+ aEUt);
+ GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes.add(tRecipe);
+ GT_AssemblyLineUtils.addRecipeToCache(tRecipe);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addAssemblylineRecipe(ItemStack aResearchItem, int aResearchTime, Object[] aInputs,
+ FluidStack[] aFluidInputs, ItemStack aOutput, int aDuration, int aEUt) {
+ if ((aResearchItem == null) || (aResearchTime <= 0)
+ || (aInputs == null)
+ || (aOutput == null)
+ || aInputs.length > 15
+ || aInputs.length < 4) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ ItemStack[] tInputs = new ItemStack[aInputs.length];
+ ItemStack[][] tAlts = new ItemStack[aInputs.length][];
+ int tPersistentHash = 1;
+ for (int i = 0; i < aInputs.length; i++) {
+ Object obj = aInputs[i];
+ if (obj instanceof ItemStack) {
+ tInputs[i] = (ItemStack) obj;
+ tAlts[i] = null;
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(tInputs[i], true, false);
+ continue;
+ } else if (obj instanceof ItemStack[]aStacks) {
+ if (aStacks.length > 0) {
+ tInputs[i] = aStacks[0];
+ tAlts[i] = Arrays.copyOf(aStacks, aStacks.length);
+ for (ItemStack tAlt : tAlts[i]) {
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(tAlt, true, false);
+ }
+ tPersistentHash *= 31;
+ continue;
+ }
+ } else if (obj instanceof Object[]objs) {
+ List<ItemStack> tList;
+ if (objs.length >= 2 && !(tList = GT_OreDictUnificator.getOres(objs[0])).isEmpty()) {
+ try {
+ // sort the output, so the hash code is stable across launches
+ tList.sort(
+ Comparator
+ .<ItemStack, String>comparing(
+ s -> GameRegistry.findUniqueIdentifierFor(s.getItem()).modId)
+ .thenComparing(s -> GameRegistry.findUniqueIdentifierFor(s.getItem()).name)
+ .thenComparingInt(Items.feather::getDamage)
+ .thenComparingInt(s -> s.stackSize));
+ int tAmount = ((Number) objs[1]).intValue();
+ List<ItemStack> uList = new ArrayList<>();
+ for (ItemStack tStack : tList) {
+ ItemStack uStack = GT_Utility.copyAmount(tAmount, tStack);
+ if (GT_Utility.isStackValid(uStack)) {
+ uList.add(uStack);
+ if (tInputs[i] == null) tInputs[i] = uStack;
+ }
+ }
+ tAlts[i] = uList.toArray(new ItemStack[0]);
+ tPersistentHash = tPersistentHash * 31 + (objs[0] == null ? "" : objs[0].toString()).hashCode();
+ tPersistentHash = tPersistentHash * 31 + tAmount;
+ continue;
+ } catch (Exception ignored) {}
+ }
+ }
+ GT_FML_LOGGER.info(
+ "addAssemblingLineRecipe " + aResearchItem.getDisplayName()
+ + " --> "
+ + aOutput.getUnlocalizedName()
+ + " there is some null item in that recipe");
+ }
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(aResearchItem, true, false);
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(aOutput, true, false);
+ for (FluidStack tFluidInput : aFluidInputs) {
+ if (tFluidInput == null) continue;
+ tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(tFluidInput, true, false);
+ }
+ tPersistentHash = tPersistentHash * 31 + aResearchTime;
+ tPersistentHash = tPersistentHash * 31 + aDuration;
+ tPersistentHash = tPersistentHash * 31 + aEUt;
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { aResearchItem },
+ new ItemStack[] { aOutput },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Writes Research result") },
+ null,
+ null,
+ aResearchTime,
+ 30,
+ -201);
+ RecipeMaps.assemblylineVisualRecipes.addFakeRecipe(
+ false,
+ tInputs,
+ new ItemStack[] { aOutput },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Reads Research result") },
+ aFluidInputs,
+ null,
+ aDuration,
+ aEUt,
+ 0,
+ tAlts,
+ false);
+ GT_Recipe_AssemblyLine tRecipe = new GT_Recipe_AssemblyLine(
+ aResearchItem,
+ aResearchTime,
+ tInputs,
+ aFluidInputs,
+ aOutput,
+ aDuration,
+ aEUt,
+ tAlts);
+ tRecipe.setPersistentHash(tPersistentHash);
+ GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes.add(tRecipe);
+ GT_AssemblyLineUtils.addRecipeToCache(tRecipe);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addCircuitAssemblerRecipe(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack aOutput,
+ int aDuration, int aEUt) {
+ return addCircuitAssemblerRecipe(aInputs, aFluidInput, aOutput, aDuration, aEUt, false);
+ }
+
+ @Override
+ @Deprecated
+ public boolean addCircuitAssemblerRecipe(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack aOutput,
+ int aDuration, int aEUt, boolean aCleanroom) {
+
+ if (this.areItemsAndFluidsBothNull(aInputs, new FluidStack[] { aFluidInput })) {
+ return false;
+ }
+
+ if (aDuration <= 0) {
+ return false;
+ }
+
+ if (!GT_Mod.gregtechproxy.mEnableCleanroom) {
+ aCleanroom = false;
+ }
+
+ if (!GT_Utility.isStackValid(aOutput)) {
+ return false;
+ }
+
+ for (int oreID : OreDictionary.getOreIDs(aOutput)) {
+ if (OreDictionary.getOreName(oreID)
+ .startsWith("circuit")) {
+ return this
+ .addCircuitAssemblerRecipeNonOredicted(aInputs, aFluidInput, aOutput, aDuration, aEUt, aCleanroom);
+ }
+ }
+
+ RecipeMaps.circuitAssemblerRecipes.addRecipe(
+ true,
+ aInputs,
+ new ItemStack[] { aOutput },
+ null,
+ new FluidStack[] { aFluidInput },
+ null,
+ aDuration,
+ aEUt,
+ aCleanroom ? -200 : 0);
+ return true;
+ }
+
+ @Deprecated
+ public boolean addCircuitAssemblerRecipeNonOredicted(ItemStack[] aInputs, FluidStack aFluidInput, ItemStack aOutput,
+ int aDuration, int aEUt, boolean aCleanroom) {
+ if ((aInputs == null) || (aOutput == null) || aInputs.length > 6 || aInputs.length < 1) {
+ return false;
+ }
+ if (aDuration <= 0) {
+ return false;
+ }
+ if (!GT_Mod.gregtechproxy.mEnableCleanroom) {
+ aCleanroom = false;
+ }
+ RecipeMaps.circuitAssemblerRecipes.addRecipe(
+ true,
+ aInputs,
+ new ItemStack[] { aOutput },
+ null,
+ null,
+ new FluidStack[] { aFluidInput },
+ null,
+ aDuration,
+ aEUt,
+ aCleanroom ? -200 : 0);
+ return true;
+ }
+
+ @Override
+ @Deprecated
+ public boolean addNanoForgeRecipe(ItemStack[] aInputs, FluidStack[] aFluidInputs, ItemStack[] aOutputs,
+ FluidStack[] aFluidOutputs, int[] aChances, int aDuration, int aEUt, int aSpecialValue) {
+ if (aInputs == null || aOutputs == null || aSpecialValue == 0) return false;
+
+ RecipeMaps.nanoForgeRecipes.addRecipe(
+ new GT_Recipe(
+ false,
+ aInputs,
+ aOutputs,
+ null,
+ aChances,
+ aFluidInputs,
+ aFluidOutputs,
+ aDuration,
+ aEUt,
+ aSpecialValue));
+ return true;
+ }
+
+ @Override
+ public GT_Recipe addIC2ReactorBreederCell(ItemStack input, ItemStack output, boolean reflector, int heatStep,
+ int heatMultiplier, int requiredPulses) {
+ return GT_Values.RA.stdBuilder()
+ .itemInputs(input)
+ .itemOutputs(output)
+ .setNEIDesc(
+ reflector ? "Neutron reflecting Breeder" : "Heat neutral Breeder",
+ String.format("Every %d reactor hull heat", heatStep),
+ String.format("increase speed by %d00%%", heatMultiplier),
+ String.format("Required pulses: %d", requiredPulses))
+ .duration(0)
+ .eut(0)
+ .addTo(RecipeMaps.ic2NuclearFakeRecipes)
+ .stream()
+ .findFirst()
+ .orElse(null);
+ }
+
+ @Override
+ public GT_Recipe addIC2ReactorFuelCell(ItemStack input, ItemStack output, boolean aMox, float aHeat, float aEnergy,
+ int aCells) {
+ // for the mysterious constant 5.0f,
+ // see ic2.core.block.reactor.tileentity.TileEntityNuclearReactorElectric.getOfferedEnergy
+ // don't ask, just accept
+ int pulses = aCells / 2 + 1;
+ float nukePowerMult = 5.0f * ConfigUtil.getFloat(MainConfig.get(), "balance/energy/generator/nuclear");
+ return GT_Values.RA.stdBuilder()
+ .itemInputs(input)
+ .itemOutputs(output)
+ .setNEIDesc(
+ aMox ? "MOX Model" : "Uranium Model",
+ "Neutron Pulse: " + aCells,
+ aCells == 1 ? String.format("Heat: %.1f * n1 * (n1 + 1)", aHeat / 2f)
+ : String.format("Heat: %.1f * (%d + n1) * (%d + n1)", aHeat * aCells / 2f, aCells, aCells + 1),
+ String.format(
+ "Energy: %.1f + n2 * %.1f EU/t",
+ aEnergy * aCells * pulses * nukePowerMult,
+ aEnergy * nukePowerMult))
+ .duration(0)
+ .eut(0)
+ .addTo(RecipeMaps.ic2NuclearFakeRecipes)
+ .stream()
+ .findFirst()
+ .orElse(null);
+ }
+
+ private boolean areItemsAndFluidsBothNull(ItemStack[] items, FluidStack[] fluids) {
+ boolean itemsNull = true;
+ if (items != null) {
+ for (ItemStack itemStack : items) {
+ if (itemStack != null) {
+ itemsNull = false;
+ break;
+ }
+ }
+ }
+ boolean fluidsNull = true;
+ if (fluids != null) {
+ for (FluidStack fluidStack : fluids) {
+ if (fluidStack != null) {
+ fluidsNull = false;
+ break;
+ }
+ }
+ }
+ return itemsNull && fluidsNull;
+ }
+
+ @Override
+ public GT_RecipeBuilder stdBuilder() {
+ return GT_RecipeBuilder.builder();
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_Server.java b/src/main/java/gregtech/common/GT_Server.java
new file mode 100644
index 0000000000..1a2d8e6b5a
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_Server.java
@@ -0,0 +1,36 @@
+package gregtech.common;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+public class GT_Server extends GT_Proxy {
+
+ @Override
+ public boolean isServerSide() {
+ return true;
+ }
+
+ @Override
+ public boolean isClientSide() {
+ return false;
+ }
+
+ @Override
+ public boolean isBukkitSide() {
+ return false;
+ }
+
+ @Override
+ public void doSonictronSound(ItemStack aStack, World aWorld, double aX, double aY, double aZ) {}
+
+ @Override
+ public int addArmor(String aPrefix) {
+ return 0;
+ }
+
+ @Override
+ public EntityPlayer getThePlayer() {
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_ThaumcraftCompat.java b/src/main/java/gregtech/common/GT_ThaumcraftCompat.java
new file mode 100644
index 0000000000..43c3dce569
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_ThaumcraftCompat.java
@@ -0,0 +1,285 @@
+package gregtech.common;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.IRecipe;
+import net.minecraft.util.ResourceLocation;
+
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.interfaces.internal.IThaumcraftCompat;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import thaumcraft.api.ThaumcraftApi;
+import thaumcraft.api.ThaumcraftApiHelper;
+import thaumcraft.api.aspects.Aspect;
+import thaumcraft.api.aspects.AspectList;
+import thaumcraft.api.crafting.CrucibleRecipe;
+import thaumcraft.api.crafting.IArcaneRecipe;
+import thaumcraft.api.crafting.InfusionEnchantmentRecipe;
+import thaumcraft.api.crafting.InfusionRecipe;
+import thaumcraft.api.research.ResearchCategories;
+import thaumcraft.api.research.ResearchCategoryList;
+import thaumcraft.api.research.ResearchItem;
+import thaumcraft.api.research.ResearchPage;
+
+public class GT_ThaumcraftCompat implements IThaumcraftCompat {
+
+ public GT_ThaumcraftCompat() {
+ TC_Aspects.AER.mAspect = Aspect.AIR;
+ TC_Aspects.ALIENIS.mAspect = Aspect.ELDRITCH;
+ TC_Aspects.AQUA.mAspect = Aspect.WATER;
+ TC_Aspects.ARBOR.mAspect = Aspect.TREE;
+ TC_Aspects.AURAM.mAspect = Aspect.AURA;
+ TC_Aspects.BESTIA.mAspect = Aspect.BEAST;
+ TC_Aspects.COGNITIO.mAspect = Aspect.MIND;
+ TC_Aspects.CORPUS.mAspect = Aspect.FLESH;
+ TC_Aspects.EXANIMIS.mAspect = Aspect.UNDEAD;
+ TC_Aspects.FABRICO.mAspect = Aspect.CRAFT;
+ TC_Aspects.FAMES.mAspect = Aspect.HUNGER;
+ TC_Aspects.GELUM.mAspect = Aspect.COLD;
+ TC_Aspects.GRANUM.mAspect = Aspect.PLANT;
+ TC_Aspects.HERBA.mAspect = Aspect.PLANT;
+ TC_Aspects.HUMANUS.mAspect = Aspect.MAN;
+ TC_Aspects.IGNIS.mAspect = Aspect.FIRE;
+ TC_Aspects.INSTRUMENTUM.mAspect = Aspect.TOOL;
+ TC_Aspects.ITER.mAspect = Aspect.TRAVEL;
+ TC_Aspects.LIMUS.mAspect = Aspect.SLIME;
+ TC_Aspects.LUCRUM.mAspect = Aspect.GREED;
+ TC_Aspects.LUX.mAspect = Aspect.LIGHT;
+ TC_Aspects.MACHINA.mAspect = Aspect.MECHANISM;
+ TC_Aspects.MESSIS.mAspect = Aspect.CROP;
+ TC_Aspects.METALLUM.mAspect = Aspect.METAL;
+ TC_Aspects.METO.mAspect = Aspect.HARVEST;
+ TC_Aspects.MORTUUS.mAspect = Aspect.DEATH;
+ TC_Aspects.MOTUS.mAspect = Aspect.MOTION;
+ TC_Aspects.ORDO.mAspect = Aspect.ORDER;
+ TC_Aspects.PANNUS.mAspect = Aspect.CLOTH;
+ TC_Aspects.PERDITIO.mAspect = Aspect.ENTROPY;
+ TC_Aspects.PERFODIO.mAspect = Aspect.MINE;
+ TC_Aspects.PERMUTATIO.mAspect = Aspect.EXCHANGE;
+ TC_Aspects.POTENTIA.mAspect = Aspect.ENERGY;
+ TC_Aspects.PRAECANTATIO.mAspect = Aspect.MAGIC;
+ TC_Aspects.SANO.mAspect = Aspect.HEAL;
+ TC_Aspects.SENSUS.mAspect = Aspect.SENSES;
+ TC_Aspects.SPIRITUS.mAspect = Aspect.SOUL;
+ TC_Aspects.TELUM.mAspect = Aspect.WEAPON;
+ TC_Aspects.TERRA.mAspect = Aspect.EARTH;
+ TC_Aspects.TEMPESTAS.mAspect = Aspect.WEATHER;
+ TC_Aspects.TENEBRAE.mAspect = Aspect.DARKNESS;
+ TC_Aspects.TUTAMEN.mAspect = Aspect.ARMOR;
+ TC_Aspects.VACUOS.mAspect = Aspect.VOID;
+ TC_Aspects.VENENUM.mAspect = Aspect.POISON;
+ TC_Aspects.VICTUS.mAspect = Aspect.LIFE;
+ TC_Aspects.VINCULUM.mAspect = Aspect.TRAP;
+ TC_Aspects.VITIUM.mAspect = Aspect.TAINT;
+ TC_Aspects.VITREUS.mAspect = Aspect.CRYSTAL;
+ TC_Aspects.VOLATUS.mAspect = Aspect.FLIGHT;
+
+ TC_Aspects.STRONTIO.mAspect = new Aspect(
+ "strontio",
+ 0xEEC2B3,
+ new Aspect[] { Aspect.MIND, Aspect.ENTROPY },
+ new ResourceLocation("gregtech:textures/aspects/" + TC_Aspects.STRONTIO.name() + ".png"),
+ 1);
+ TC_Aspects.NEBRISUM.mAspect = new Aspect(
+ "nebrisum",
+ 0xEEEE7E,
+ new Aspect[] { Aspect.MINE, Aspect.GREED },
+ new ResourceLocation("gregtech:textures/aspects/" + TC_Aspects.NEBRISUM.name() + ".png"),
+ 1);
+ TC_Aspects.ELECTRUM.mAspect = new Aspect(
+ "electrum",
+ 0xC0EEEE,
+ new Aspect[] { Aspect.ENERGY, Aspect.MECHANISM },
+ new ResourceLocation("gregtech:textures/aspects/" + TC_Aspects.ELECTRUM.name() + ".png"),
+ 1);
+ TC_Aspects.MAGNETO.mAspect = new Aspect(
+ "magneto",
+ 0xC0C0C0,
+ new Aspect[] { Aspect.METAL, Aspect.TRAVEL },
+ new ResourceLocation("gregtech:textures/aspects/" + TC_Aspects.MAGNETO.name() + ".png"),
+ 1);
+ TC_Aspects.RADIO.mAspect = new Aspect(
+ "radio",
+ 0xC0FFC0,
+ new Aspect[] { Aspect.LIGHT, Aspect.ENERGY },
+ new ResourceLocation("gregtech:textures/aspects/" + TC_Aspects.RADIO.name() + ".png"),
+ 1);
+
+ GT_LanguageManager.addStringLocalization("tc.aspect.strontio", "Stupidness, Incompetence");
+ GT_LanguageManager.addStringLocalization("tc.aspect.nebrisum", "Cheatyness, Raiding");
+ GT_LanguageManager.addStringLocalization("tc.aspect.electrum", "Electricity, Lightning");
+ GT_LanguageManager.addStringLocalization("tc.aspect.magneto", "Magnetism, Attraction");
+ GT_LanguageManager.addStringLocalization("tc.aspect.radio", "Radiation");
+ }
+
+ private static AspectList getAspectList(List<TC_Aspects.TC_AspectStack> aAspects) {
+ AspectList rAspects = new AspectList();
+ TC_Aspects.TC_AspectStack tAspect;
+ for (Iterator<TC_Aspects.TC_AspectStack> i$ = aAspects.iterator(); i$.hasNext(); rAspects
+ .add((Aspect) tAspect.mAspect.mAspect, (int) tAspect.mAmount)) {
+ tAspect = i$.next();
+ }
+ return rAspects;
+ }
+
+ @Override
+ public Object addResearch(String aResearch, String aName, String aText, String[] aParentResearches,
+ String aCategory, ItemStack aIcon, int aComplexity, int aType, int aX, int aY,
+ List<TC_Aspects.TC_AspectStack> aAspects, ItemStack[] aResearchTriggers, Object[] aPages) {
+ ResearchCategoryList tCategory = ResearchCategories.getResearchList(aCategory);
+ if (tCategory == null) {
+ return null;
+ }
+ for (ResearchItem tResearch : tCategory.research.values()) {
+ if ((tResearch.displayColumn == aX) && (tResearch.displayRow == aY)) {
+ aX += (aX > 0 ? 5 : -5);
+ aY += (aY > 0 ? 5 : -5);
+ }
+ }
+ ResearchItem rResearch = new ResearchItem(
+ aResearch,
+ aCategory,
+ getAspectList(aAspects),
+ aX,
+ aY,
+ aComplexity,
+ aIcon);
+ ArrayList<ResearchPage> tPages = new ArrayList<>(aPages.length);
+ GT_LanguageManager.addStringLocalization("tc.research_name." + aResearch, aName);
+ GT_LanguageManager.addStringLocalization("tc.research_text." + aResearch, "[GT] " + aText);
+ for (Object tPage : aPages) {
+ if ((tPage instanceof String)) {
+ tPages.add(new ResearchPage((String) tPage));
+ } else if ((tPage instanceof IRecipe)) {
+ tPages.add(new ResearchPage((IRecipe) tPage));
+ } else if ((tPage instanceof IArcaneRecipe)) {
+ tPages.add(new ResearchPage((IArcaneRecipe) tPage));
+ } else if ((tPage instanceof CrucibleRecipe)) {
+ tPages.add(new ResearchPage((CrucibleRecipe) tPage));
+ } else if ((tPage instanceof InfusionRecipe)) {
+ tPages.add(new ResearchPage((InfusionRecipe) tPage));
+ } else if ((tPage instanceof InfusionEnchantmentRecipe)) {
+ tPages.add(new ResearchPage((InfusionEnchantmentRecipe) tPage));
+ }
+ }
+ if ((aType & 0x40) != 0) {
+ rResearch.setAutoUnlock();
+ }
+ if ((aType & 0x1) != 0) {
+ rResearch.setSecondary();
+ }
+ if ((aType & 0x20) != 0) {
+ rResearch.setSpecial();
+ }
+ if ((aType & 0x8) != 0) {
+ rResearch.setVirtual();
+ }
+ if ((aType & 0x4) != 0) {
+ rResearch.setHidden();
+ }
+ if ((aType & 0x10) != 0) {
+ rResearch.setRound();
+ }
+ if ((aType & 0x2) != 0) {
+ rResearch.setStub();
+ }
+ if (aParentResearches != null) {
+ ArrayList<String> tParentResearches = new ArrayList<>();
+ Collections.addAll(tParentResearches, aParentResearches);
+ if (tParentResearches.size() > 0) {
+ rResearch.setParents(tParentResearches.toArray(new String[0]));
+ rResearch.setConcealed();
+ }
+ }
+ if (aResearchTriggers != null) {
+ rResearch.setItemTriggers(aResearchTriggers);
+ rResearch.setHidden();
+ }
+ rResearch.setPages(tPages.toArray(new ResearchPage[0]));
+ return rResearch.registerResearchItem();
+ }
+
+ @Override
+ public Object addCrucibleRecipe(String aResearch, Object aInput, ItemStack aOutput,
+ List<TC_Aspects.TC_AspectStack> aAspects) {
+ if ((GT_Utility.isStringInvalid(aResearch)) || (aInput == null)
+ || (aOutput == null)
+ || (aAspects == null)
+ || (aAspects.isEmpty())) {
+ return null;
+ }
+ return ThaumcraftApi.addCrucibleRecipe(
+ aResearch,
+ GT_Utility.copyOrNull(aOutput),
+ ((aInput instanceof ItemStack)) || ((aInput instanceof ArrayList)) ? aInput : aInput.toString(),
+ getAspectList(aAspects));
+ }
+
+ @Override
+ public Object addInfusionRecipe(String aResearch, ItemStack aMainInput, ItemStack[] aSideInputs, ItemStack aOutput,
+ int aInstability, List<TC_Aspects.TC_AspectStack> aAspects) {
+ if ((GT_Utility.isStringInvalid(aResearch)) || (aMainInput == null)
+ || (aSideInputs == null)
+ || (aOutput == null)
+ || (aAspects == null)
+ || (aAspects.isEmpty())) {
+ return null;
+ }
+ return ThaumcraftApi.addInfusionCraftingRecipe(
+ aResearch,
+ GT_Utility.copyOrNull(aOutput),
+ aInstability,
+ getAspectList(aAspects),
+ aMainInput,
+ aSideInputs);
+ }
+
+ @Override
+ public Object addInfusionEnchantmentRecipe(String aResearch, Enchantment aEnchantment, int aInstability,
+ List<TC_Aspects.TC_AspectStack> aAspects, ItemStack[] aSideInputs) {
+ if ((GT_Utility.isStringInvalid(aResearch)) || (aSideInputs == null)
+ || (aAspects == null)
+ || (aEnchantment == null)
+ || (aAspects.isEmpty())) {
+ return null;
+ }
+ return ThaumcraftApi
+ .addInfusionEnchantmentRecipe(aResearch, aEnchantment, aInstability, getAspectList(aAspects), aSideInputs);
+ }
+
+ @Override
+ public boolean registerThaumcraftAspectsToItem(ItemStack aExampleStack, List<TC_Aspects.TC_AspectStack> aAspects,
+ String aOreDict) {
+ if (aAspects.isEmpty()) return false;
+ ThaumcraftApi.registerObjectTag(aOreDict, getAspectList(aAspects));
+ return true;
+ }
+
+ @Override
+ public boolean registerThaumcraftAspectsToItem(ItemStack aStack, List<TC_Aspects.TC_AspectStack> aAspects,
+ boolean aAdditive) {
+ if (aAspects.isEmpty()) return false;
+ if (aAdditive) {
+ ThaumcraftApi.registerComplexObjectTag(aStack, getAspectList(aAspects));
+ return true;
+ }
+ AspectList tAlreadyRegisteredAspects = ThaumcraftApiHelper.getObjectAspects(aStack);
+ if (tAlreadyRegisteredAspects == null || tAlreadyRegisteredAspects.size() <= 0) {
+ ThaumcraftApi.registerObjectTag(aStack, getAspectList(aAspects));
+ }
+ return true;
+ }
+
+ @Override
+ public boolean registerPortholeBlacklistedBlock(Block aBlock) {
+ ThaumcraftApi.portableHoleBlackList.add(aBlock);
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_UndergroundOil.java b/src/main/java/gregtech/common/GT_UndergroundOil.java
new file mode 100644
index 0000000000..17a5662c09
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_UndergroundOil.java
@@ -0,0 +1,339 @@
+package gregtech.common;
+
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.Objects;
+import java.util.WeakHashMap;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.event.world.ChunkDataEvent;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import gregtech.GT_Mod;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_UO_Dimension;
+import gregtech.api.objects.GT_UO_Fluid;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_ChunkAssociatedData;
+
+/**
+ * Created by Tec on 29.04.2017.
+ */
+public class GT_UndergroundOil {
+
+ public static final short DIVIDER = 5000;
+ private static final GT_UndergroundOilStore STORAGE = new GT_UndergroundOilStore();
+ private static final ChunkData NIL_FLUID_STACK = new ChunkData(-1, null, null, false);
+
+ /**
+ * Effectively just call {@code undergroundOil(te, -1)} for you
+ *
+ * @see #undergroundOil(World, int, int, float)
+ */
+ public static FluidStack undergroundOilReadInformation(IGregTechTileEntity te) {
+ return undergroundOil(
+ te.getWorld()
+ .getChunkFromBlockCoords(te.getXCoord(), te.getZCoord()),
+ -1);
+ }
+
+ /**
+ * Effectively just call {@code undergroundOil(chunk, -1)} for you
+ *
+ * @see #undergroundOil(World, int, int, float)
+ */
+ public static FluidStack undergroundOilReadInformation(Chunk chunk) {
+ return undergroundOil(chunk, -1);
+ }
+
+ /** @see #undergroundOil(World, int, int, float) */
+ public static FluidStack undergroundOil(IGregTechTileEntity te, float readOrDrainCoefficient) {
+ return undergroundOil(
+ te.getWorld()
+ .getChunkFromBlockCoords(te.getXCoord(), te.getZCoord()),
+ readOrDrainCoefficient);
+ }
+
+ // Returns whole content for information purposes -> when drainSpeedCoefficient < 0
+ // Else returns extracted fluidStack if amount > 0, or null otherwise
+ /** @see #undergroundOil(World, int, int, float) */
+ public static FluidStack undergroundOil(Chunk chunk, float readOrDrainCoefficient) {
+ return undergroundOil(chunk.worldObj, chunk.xPosition, chunk.zPosition, readOrDrainCoefficient);
+ }
+
+ /**
+ * Pump fluid or read info.
+ *
+ * @param w a remote World. For a WorldClient it will always tell you null
+ * @param chunkX chunk coordinate X, i.e. blockX >> 4
+ * @param chunkZ chunk coordinate Z, i.e. blockZ >> 4
+ * @param readOrDrainCoefficient how fast to pump. The higher the faster. use negative to read expected current
+ * output
+ * @return null if nothing here, or depleted already, or a client side world
+ */
+ public static FluidStack undergroundOil(World w, int chunkX, int chunkZ, float readOrDrainCoefficient) {
+ if (w.isRemote) return null; // troublemakers go away
+ ChunkData chunkData = STORAGE.get(w, chunkX, chunkZ);
+ if (chunkData.getVein() == null || chunkData.getFluid() == null) // nothing here...
+ return null;
+ // do stuff on it if needed
+ FluidStack fluidInChunk = new FluidStack(chunkData.getFluid(), 0);
+ if (readOrDrainCoefficient >= 0) {
+ int fluidExtracted = (int) Math.floor(chunkData.getAmount() * (double) readOrDrainCoefficient / DIVIDER);
+ double averageDecrease = chunkData.getVein().DecreasePerOperationAmount * (double) readOrDrainCoefficient;
+ int decrease = (int) Math.ceil(averageDecrease);
+ if (fluidExtracted <= 0 || chunkData.amount <= decrease) { // decrease - here it is max value of extraction
+ // for easy check
+ chunkData.setAmount(0);
+ } else {
+ fluidInChunk.amount = fluidExtracted; // give appropriate amount
+ if (XSTR_INSTANCE.nextFloat() < (decrease - averageDecrease)) decrease--; // use XSTR_INSTANCE to
+ // "subtract double from int"
+ // ex.
+ // averageDecrease=3.9
+ // decrease= ceil from 3.9 = 4
+ // decrease-averageDecrease=0.1 -> chance to subtract 1
+ // if XSTR_INSTANCE is < chance then subtract 1
+ chunkData.changeAmount(-decrease); // diminish amount, "randomly" adjusted to double value
+ // (averageDecrease)
+ }
+ } else { // just get info
+ if (chunkData.amount <= DIVIDER) {
+ chunkData.setAmount(0);
+ } else {
+ // get the expected current output
+ fluidInChunk.amount = (int) Math
+ .floor(chunkData.getAmount() * (double) -readOrDrainCoefficient / DIVIDER);
+ }
+ }
+ return fluidInChunk;
+ }
+
+ /**
+ * Get the deposit as if it is never exploited
+ *
+ * @return UO fluid kind and amount, or null if nothing here.
+ */
+ public static Pair<GT_UO_Fluid, Integer> getPristineAmount(World world, int chunkX, int chunkZ) {
+ int dimensionId = world.provider.dimensionId;
+ GT_UO_Dimension dimension = GT_Mod.gregtechproxy.mUndergroundOil.GetDimension(dimensionId);
+ if (dimension == null) return null;
+ // prepare RNG
+ final XSTR tVeinRNG = new XSTR(world.getSeed() + dimensionId * 2L + (chunkX >> 3) + 8267L * (chunkZ >> 3));
+ GT_UO_Fluid uoFluid = dimension.getRandomFluid(tVeinRNG);
+ // nothing here :(
+ if (uoFluid == null || uoFluid.getFluid() == null) return null;
+ // offset each chunk's fluid amount by +-25%
+ // discard random values not for current chunk
+ int veinAverage = uoFluid.getRandomAmount(tVeinRNG);
+ for (int i = 0; i < (((chunkX & 0x7) << 3) | chunkZ & 0x7); i++) {
+ tVeinRNG.next(24);
+ }
+ int amount = (int) ((float) veinAverage * (0.75f + (tVeinRNG.nextFloat() / 2f)));
+ return Pair.of(uoFluid, amount);
+ }
+
+ static void migrate(ChunkDataEvent.Load e) {
+ if (e.getData()
+ .hasKey("GTOIL")
+ && e.getData()
+ .hasKey("GTOILFLUID")) {
+ ChunkData chunkData = STORAGE.get(e.getChunk());
+ Fluid fluid = chunkData.getFluid();
+ if (fluid != null && fluid.getID() == e.getData()
+ .getInteger("GTOILFLUID")) chunkData.setAmount(
+ Math.min(
+ chunkData.getAmount(),
+ e.getData()
+ .getInteger("GTOIL")));
+ }
+ }
+
+ /**
+ * Revamped UO store.
+ * <p>
+ * Primary functionality:
+ *
+ * <ul>
+ * <li>Decouple data storage with chunk, making it possible to pump oil from unloaded chunks</li>
+ * <li>Regen detection. If fluid generation config is changed, chunk fluid will be regenerated.</li>
+ * </ul>
+ *
+ * <h2>Serialized form</h2>
+ * <p>
+ * Since the exact file layout is controlled by the super class, here we only concern how each chunk's data is
+ * written.
+ * <h3>Form A: Empty Chunk</h3>
+ * <ol>
+ * <li>4 bytes of 0</li>
+ * </ol>
+ *
+ * <h3>Form B: Normal Chunk</h3>
+ * <ol>
+ * <li>4 bytes unsigned integer. Vein Hash.</li>
+ * <li>UTF string. Vein Key.</li>
+ * <li>4 bytes signed integer. Fluid amount.</li>
+ * </ol>
+ *
+ * @author glease
+ */
+ @ParametersAreNonnullByDefault
+ private static class GT_UndergroundOilStore extends GT_ChunkAssociatedData<ChunkData> {
+
+ private static final WeakHashMap<GT_UO_Fluid, Integer> hashes = new WeakHashMap<>();
+
+ private GT_UndergroundOilStore() {
+ super("UO", GT_UndergroundOil.ChunkData.class, 64, (byte) 0, false);
+ }
+
+ @Override
+ protected void writeElement(DataOutput output, ChunkData element, World world, int chunkX, int chunkZ)
+ throws IOException {
+ /* see class javadoc for explanation */
+ output.writeInt(element.getVeinHash());
+ if (element.getVeinKey() == null) return;
+ output.writeUTF(element.getVeinKey());
+ if (element.getAmount() > 0 && element.getFluid() != null) {
+ output.writeInt(element.getAmount());
+ } else {
+ output.writeInt(-1);
+ }
+ }
+
+ @Override
+ protected GT_UndergroundOil.ChunkData readElement(DataInput input, int version, World world, int chunkX,
+ int chunkZ) throws IOException {
+ /* see class javadoc for explanation */
+ if (version != 0) throw new IOException("Region file corrupted");
+ GT_UndergroundOil.ChunkData pristine = createElement(world, chunkX, chunkZ);
+ int hash = input.readInt();
+ String veinKey = hash != 0 ? input.readUTF() : null;
+ int amount = hash != 0 ? input.readInt() : -1;
+ if (hash != pristine.veinHash || !Objects.equals(veinKey, pristine.getVeinKey())) {
+ // vein config changed. use regen-ed data.
+ return pristine;
+ }
+ if (hash == 0) return NIL_FLUID_STACK;
+ return new GT_UndergroundOil.ChunkData(
+ amount,
+ GT_Mod.gregtechproxy.mUndergroundOil.GetDimension(world.provider.dimensionId)
+ .getUOFluid(veinKey),
+ veinKey);
+ }
+
+ @Override
+ protected GT_UndergroundOil.ChunkData createElement(World world, int chunkX, int chunkZ) {
+ Pair<GT_UO_Fluid, Integer> pristine = getPristineAmount(world, chunkX, chunkZ);
+ if (pristine == null) return NIL_FLUID_STACK;
+ int dimensionId = world.provider.dimensionId;
+ GT_UO_Dimension dimension = GT_Mod.gregtechproxy.mUndergroundOil.GetDimension(dimensionId);
+ return new GT_UndergroundOil.ChunkData(
+ pristine.getRight(),
+ pristine.getLeft(),
+ dimension.getUOFluidKey(pristine.getLeft()),
+ false);
+ }
+
+ private static int hash(@Nullable GT_UO_Fluid fluid) {
+ if (fluid == null) return 0;
+ int result = fluid.Registry.hashCode();
+ result = 31 * result + fluid.MaxAmount;
+ result = 31 * result + fluid.MinAmount;
+ result = 31 * result + fluid.Chance;
+ result = 31 * result + fluid.DecreasePerOperationAmount;
+ return result == 0 ? 1 : result;
+ }
+ }
+
+ /**
+ * Represent the amount of fluid in a given chunk.
+ */
+ private static final class ChunkData implements GT_ChunkAssociatedData.IData {
+
+ private final Fluid fluid;
+
+ @Nullable
+ private final GT_UO_Fluid vein;
+
+ private final String veinKey;
+ private final int veinHash;
+ private int amount;
+ private boolean dirty;
+
+ private ChunkData(int amount, GT_UO_Fluid veinKey, String veinID) {
+ this(amount, veinKey, veinID, true);
+ }
+
+ private ChunkData(int amount, @Nullable GT_UO_Fluid vein, @Nullable String veinKey, boolean dirty) {
+ this.amount = amount;
+ this.vein = vein;
+ this.dirty = dirty;
+ if (vein == null) {
+ fluid = null;
+ this.veinKey = null;
+ veinHash = 0;
+ } else {
+ fluid = vein.getFluid();
+ this.veinKey = veinKey;
+ veinHash = GT_UndergroundOilStore.hashes.computeIfAbsent(vein, GT_UndergroundOilStore::hash);
+ }
+ }
+
+ /**
+ * The current fluid type. {@code null} if vein is generated to be empty.
+ */
+ @Nullable
+ public Fluid getFluid() {
+ return fluid;
+ }
+
+ /**
+ * Current fluid amount. Might be 0 if empty. Cannot be negative
+ */
+ public int getAmount() {
+ return amount;
+ }
+
+ public void setAmount(int amount) {
+ if (this.amount != amount) dirty = true;
+ this.amount = Math.max(0, amount);
+ }
+
+ public void changeAmount(int delta) {
+ if (delta != 0) dirty = true;
+ this.amount = Math.max(amount + delta, 0);
+ }
+
+ @Nullable
+ public GT_UO_Fluid getVein() {
+ return vein;
+ }
+
+ /**
+ * The vein ID. Might be null if generated to be empty.
+ */
+ @Nullable
+ public String getVeinKey() {
+ return veinKey;
+ }
+
+ public int getVeinHash() {
+ return veinHash;
+ }
+
+ @Override
+ public boolean isSameAsDefault() {
+ return !dirty;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_Layer.java b/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_Layer.java
new file mode 100644
index 0000000000..fd260d73a4
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_Layer.java
@@ -0,0 +1,456 @@
+package gregtech.common;
+
+import static gregtech.api.enums.GT_Values.debugOrevein;
+import static gregtech.api.enums.GT_Values.oreveinPlacerOres;
+import static gregtech.api.enums.GT_Values.oreveinPlacerOresMultiplier;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Log;
+import gregtech.api.world.GT_Worldgen;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+
+public class GT_Worldgen_GT_Ore_Layer extends GT_Worldgen {
+
+ public static ArrayList<GT_Worldgen_GT_Ore_Layer> sList = new ArrayList<>();
+ public static int sWeight = 0;
+ public final short mMinY;
+ public final short mMaxY;
+ public final short mWeight;
+ public final short mDensity;
+ public final short mSize;
+ public final short mPrimaryMeta;
+ public final short mSecondaryMeta;
+ public final short mBetweenMeta;
+ public final short mSporadicMeta;
+ // public final String mBiome;
+ public final String mRestrictBiome;
+ public final boolean mOverworld;
+ public final boolean mNether;
+ public final boolean mEnd;
+ public final boolean mEndAsteroid;
+ public static final int WRONG_BIOME = 0;
+ public static final int WRONG_DIMENSION = 1;
+ public static final int NO_ORE_IN_BOTTOM_LAYER = 2;
+ public static final int NO_OVERLAP = 3;
+ public static final int ORE_PLACED = 4;
+ public static final int NO_OVERLAP_AIR_BLOCK = 5;
+
+ public final boolean mMoon = false, mMars = false, mAsteroid = false;
+ public final String aTextWorldgen = "worldgen.";
+
+ @Deprecated
+ public GT_Worldgen_GT_Ore_Layer(String aName, boolean aDefault, int aMinY, int aMaxY, int aWeight, int aDensity,
+ int aSize, boolean aOverworld, boolean aNether, boolean aEnd, boolean GC_UNUSED1, boolean GC_UNUSED2,
+ boolean GC_UNUSED3, Materials aPrimary, Materials aSecondary, Materials aBetween, Materials aSporadic) {
+ this(
+ aName,
+ aDefault,
+ aMinY,
+ aMaxY,
+ aWeight,
+ aDensity,
+ aSize,
+ aOverworld,
+ aNether,
+ aEnd,
+ aPrimary,
+ aSecondary,
+ aBetween,
+ aSporadic);
+ }
+
+ public GT_Worldgen_GT_Ore_Layer(String aName, boolean aDefault, int aMinY, int aMaxY, int aWeight, int aDensity,
+ int aSize, boolean aOverworld, boolean aNether, boolean aEnd, Materials aPrimary, Materials aSecondary,
+ Materials aBetween, Materials aSporadic) {
+ super(aName, sList, aDefault);
+ this.mOverworld = GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "Overworld", aOverworld);
+ this.mNether = GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "Nether", aNether);
+ this.mEnd = GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "TheEnd", aEnd);
+ this.mEndAsteroid = GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "EndAsteroid", aEnd);
+ this.mMinY = ((short) GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "MinHeight", aMinY));
+ short mMaxY = ((short) GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "MaxHeight", aMaxY));
+ if (mMaxY < (this.mMinY + 9)) {
+ GT_Log.out.println("Oremix " + this.mWorldGenName + " has invalid Min/Max heights!");
+ mMaxY = (short) (this.mMinY + 9);
+ }
+ this.mMaxY = mMaxY;
+ this.mWeight = ((short) GregTech_API.sWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "RandomWeight", aWeight));
+ this.mDensity = ((short) GregTech_API.sWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "Density", aDensity));
+ this.mSize = ((short) Math
+ .max(1, GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "Size", aSize)));
+ this.mPrimaryMeta = ((short) GregTech_API.sWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "OrePrimaryLayer", aPrimary.mMetaItemSubID));
+ this.mSecondaryMeta = ((short) GregTech_API.sWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "OreSecondaryLayer", aSecondary.mMetaItemSubID));
+ this.mBetweenMeta = ((short) GregTech_API.sWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "OreSporadiclyInbetween", aBetween.mMetaItemSubID));
+ this.mSporadicMeta = ((short) GregTech_API.sWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "OreSporaticlyAround", aSporadic.mMetaItemSubID));
+ this.mRestrictBiome = GregTech_API.sWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "RestrictToBiomeName", "None");
+
+ if (this.mEnabled) {
+ sWeight += this.mWeight;
+ }
+ }
+
+ @Override
+ public int executeWorldgenChunkified(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, int aSeedX, int aSeedZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ if (mWorldGenName.equals("NoOresInVein")) {
+ if (debugOrevein) GT_Log.out.println(" NoOresInVein");
+ // Return a special empty orevein
+ return ORE_PLACED;
+ }
+ if (!isGenerationAllowed(
+ aWorld,
+ aDimensionType,
+ ((aDimensionType == -1) && (this.mNether)) || ((aDimensionType == 0) && (this.mOverworld))
+ || ((aDimensionType == 1) && (this.mEnd)) ? aDimensionType : ~aDimensionType)) {
+ // The following code can be used for debugging, but it spams in logs
+ // if (debugOrevein) { GT_Log.out.println( "Wrong dimension" ); }
+ return WRONG_DIMENSION;
+ }
+
+ if (!this.mRestrictBiome.equals("None") && !(this.mRestrictBiome.equals(aBiome))) {
+ return WRONG_BIOME;
+ }
+ // For optimal performance, this should be done upstream. Meh
+ String tDimensionName = aWorld.provider.getDimensionName();
+ boolean isUnderdark = tDimensionName.equals("Underdark");
+
+ int[] placeCount = new int[4];
+
+ int tMinY = mMinY + aRandom.nextInt(mMaxY - mMinY - 5);
+ // Determine West/East ends of orevein
+ int wXVein = aSeedX - aRandom.nextInt(mSize); // West side
+ int eXVein = aSeedX + 16 + aRandom.nextInt(mSize);
+ // Limit Orevein to only blocks present in current chunk
+ int wX = Math.max(wXVein, aChunkX + 2); // Bias placement by 2 blocks to prevent worldgen cascade.
+ int eX = Math.min(eXVein, aChunkX + 2 + 16);
+
+ // Get a block at the center of the chunk and the bottom of the orevein.
+ Block tBlock = aWorld.getBlock(aChunkX + 7, tMinY, aChunkZ + 9);
+
+ if (wX >= eX) { // No overlap between orevein and this chunk exists in X
+ if (tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.stone)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.netherrack)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.end_stone)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, GregTech_API.sBlockGranites)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, GregTech_API.sBlockStones)) {
+ // Didn't reach, but could have placed. Save orevein for future use.
+ return NO_OVERLAP;
+ } else {
+ // Didn't reach, but couldn't place in test spot anywys, try for another orevein
+ return NO_OVERLAP_AIR_BLOCK;
+ }
+ }
+ // Determine North/Sound ends of orevein
+ int nZVein = aSeedZ - aRandom.nextInt(mSize);
+ int sZVein = aSeedZ + 16 + aRandom.nextInt(mSize);
+
+ int nZ = Math.max(nZVein, aChunkZ + 2); // Bias placement by 2 blocks to prevent worldgen cascade.
+ int sZ = Math.min(sZVein, aChunkZ + 2 + 16);
+ if (nZ >= sZ) { // No overlap between orevein and this chunk exists in Z
+ if (tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.stone)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.netherrack)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, Blocks.end_stone)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, GregTech_API.sBlockGranites)
+ || tBlock.isReplaceableOreGen(aWorld, aChunkX + 7, tMinY, aChunkZ + 9, GregTech_API.sBlockStones)) {
+ // Didn't reach, but could have placed. Save orevein for future use.
+ return NO_OVERLAP;
+ } else {
+ // Didn't reach, but couldn't place in test spot anywys, try for another orevein
+ return NO_OVERLAP_AIR_BLOCK;
+ }
+ }
+
+ if (debugOrevein) {
+ GT_Log.out.print(
+ "Trying Orevein:" + this.mWorldGenName
+ + " Dimension="
+ + tDimensionName
+ + " mX="
+ + aChunkX / 16
+ + " mZ="
+ + aChunkZ / 16
+ + " oreseedX="
+ + aSeedX / 16
+ + " oreseedZ="
+ + aSeedZ / 16
+ + " cY="
+ + tMinY);
+ }
+ // Adjust the density down the more chunks we are away from the oreseed. The 5 chunks surrounding the seed
+ // should always be max density due to truncation of Math.sqrt().
+ int localDensity = Math.max(
+ 1,
+ this.mDensity / ((int) Math
+ .sqrt(2 + Math.pow(aChunkX / 16 - aSeedX / 16, 2) + Math.pow(aChunkZ / 16 - aSeedZ / 16, 2))));
+
+ // To allow for early exit due to no ore placed in the bottom layer (probably because we are in the sky), unroll
+ // 1 pass through the loop
+ // Now we do bottom-level-first oregen, and work our way upwards.
+ // Layer -1 Secondary and Sporadic
+ int level = tMinY - 1; // Dunno why, but the first layer is actually played one below tMinY. Go figure.
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math
+ .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mSecondaryMeta > 0)) {
+ if (GT_TileEntity_Ores
+ .setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, isUnderdark)) {
+ placeCount[1]++;
+ }
+ } else
+ if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate
+ if (GT_TileEntity_Ores
+ .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark))
+ placeCount[3]++;
+ }
+ }
+ }
+ if ((placeCount[1] + placeCount[3]) == 0) {
+ if (debugOrevein) GT_Log.out.println(" No ore in bottom layer");
+ return NO_ORE_IN_BOTTOM_LAYER; // Exit early, didn't place anything in the bottom layer
+ }
+ // Layers 0 & 1 Secondary and Sporadic
+ for (level = tMinY; level < (tMinY + 2); level++) {
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math.max(
+ 1,
+ Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSecondaryMeta > 0)) {
+ if (GT_TileEntity_Ores
+ .setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, isUnderdark)) {
+ placeCount[1]++;
+ }
+ } else if ((aRandom.nextInt(7) == 0)
+ && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate
+ if (GT_TileEntity_Ores
+ .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark))
+ placeCount[3]++;
+ }
+ }
+ }
+ }
+ // Layer 2 is Secondary, in-between, and sporadic
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math
+ .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mBetweenMeta > 0)) { // Between are reduce by 1/2 to compensate
+ if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, isUnderdark)) {
+ placeCount[2]++;
+ }
+ } else if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSecondaryMeta > 0)) {
+ if (GT_TileEntity_Ores
+ .setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, isUnderdark)) {
+ placeCount[1]++;
+ }
+ } else
+ if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate
+ if (GT_TileEntity_Ores
+ .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark))
+ placeCount[3]++;
+ }
+ }
+ }
+ level++; // Increment level to next layer
+ // Layer 3 is In-between, and sporadic
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math
+ .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mBetweenMeta > 0)) { // Between are reduce by 1/2 to compensate
+ if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, isUnderdark)) {
+ placeCount[2]++;
+ }
+ } else
+ if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate
+ if (GT_TileEntity_Ores
+ .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark))
+ placeCount[3]++;
+ }
+ }
+ }
+ level++; // Increment level to next layer
+ // Layer 4 is In-between, Primary and sporadic
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math
+ .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mBetweenMeta > 0)) { // Between are reduce by 1/2 to compensate
+ if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, isUnderdark)) {
+ placeCount[2]++;
+ }
+ } else
+ if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mPrimaryMeta > 0)) {
+ if (GT_TileEntity_Ores
+ .setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, isUnderdark)) {
+ placeCount[1]++;
+ }
+ } else if ((aRandom.nextInt(7) == 0)
+ && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate
+ if (GT_TileEntity_Ores
+ .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark))
+ placeCount[3]++;
+ }
+ }
+ }
+ level++; // Increment level to next layer
+ // Layer 5 is In-between, Primary and sporadic
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math
+ .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mBetweenMeta > 0)) { // Between are reduce by 1/2 to compensate
+ if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, isUnderdark)) {
+ placeCount[2]++;
+ }
+ } else
+ if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mPrimaryMeta > 0)) {
+ if (GT_TileEntity_Ores
+ .setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, isUnderdark)) {
+ placeCount[1]++;
+ }
+ } else if ((aRandom.nextInt(7) == 0)
+ && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate
+ if (GT_TileEntity_Ores
+ .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark))
+ placeCount[3]++;
+ }
+ }
+ }
+ level++; // Increment level to next layer
+ // Layer 6 is Primary and sporadic
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math
+ .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mPrimaryMeta > 0)) {
+ if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, isUnderdark)) {
+ placeCount[1]++;
+ }
+ } else
+ if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate
+ if (GT_TileEntity_Ores
+ .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark))
+ placeCount[3]++;
+ }
+ }
+ }
+ level++; // Increment level to next layer
+ // Layer 7 is Primary and sporadic
+ for (int tX = wX; tX < eX; tX++) {
+ int placeX = Math
+ .max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX)) / localDensity);
+ for (int tZ = nZ; tZ < sZ; tZ++) {
+ int placeZ = Math
+ .max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ)) / localDensity);
+ if (((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mPrimaryMeta > 0)) {
+ if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, isUnderdark)) {
+ placeCount[1]++;
+ }
+ } else
+ if ((aRandom.nextInt(7) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0))
+ && (this.mSporadicMeta > 0)) { // Sporadics are reduce by 1/7 to compensate
+ if (GT_TileEntity_Ores
+ .setOreBlock(aWorld, tX, level, tZ, this.mSporadicMeta, false, isUnderdark))
+ placeCount[3]++;
+ }
+ }
+ }
+ // Place small ores for the vein
+ if (oreveinPlacerOres) {
+ int nSmallOres = (eX - wX) * (sZ - nZ) * this.mDensity / 10 * oreveinPlacerOresMultiplier;
+ // Small ores are placed in the whole chunk in which the vein appears.
+ for (int nSmallOresCount = 0; nSmallOresCount < nSmallOres; nSmallOresCount++) {
+ int tX = aRandom.nextInt(16) + aChunkX + 2;
+ int tZ = aRandom.nextInt(16) + aChunkZ + 2;
+ int tY = aRandom.nextInt(160) + 10; // Y height can vary from 10 to 170 for small ores.
+ if (this.mPrimaryMeta > 0)
+ GT_TileEntity_Ores.setOreBlock(aWorld, tX, tY, tZ, this.mPrimaryMeta, true, isUnderdark);
+ tX = aRandom.nextInt(16) + aChunkX + 2;
+ tZ = aRandom.nextInt(16) + aChunkZ + 2;
+ tY = aRandom.nextInt(160) + 10; // Y height can vary from 10 to 170 for small ores.
+ if (this.mSecondaryMeta > 0)
+ GT_TileEntity_Ores.setOreBlock(aWorld, tX, tY, tZ, this.mSecondaryMeta, true, isUnderdark);
+ tX = aRandom.nextInt(16) + aChunkX + 2;
+ tZ = aRandom.nextInt(16) + aChunkZ + 2;
+ tY = aRandom.nextInt(160) + 10; // Y height can vary from 10 to 170 for small ores.
+ if (this.mBetweenMeta > 0)
+ GT_TileEntity_Ores.setOreBlock(aWorld, tX, tY, tZ, this.mBetweenMeta, true, isUnderdark);
+ tX = aRandom.nextInt(16) + aChunkX + 2;
+ tZ = aRandom.nextInt(16) + aChunkZ + 2;
+ tY = aRandom.nextInt(190) + 10; // Y height can vary from 10 to 200 for small ores.
+ if (this.mSporadicMeta > 0)
+ GT_TileEntity_Ores.setOreBlock(aWorld, tX, tY, tZ, this.mSporadicMeta, true, isUnderdark);
+ }
+ }
+ if (debugOrevein) {
+ GT_Log.out.println(
+ " wXVein" + wXVein
+ + " eXVein"
+ + eXVein
+ + " nZVein"
+ + nZVein
+ + " sZVein"
+ + sZVein
+ + " locDen="
+ + localDensity
+ + " Den="
+ + this.mDensity
+ + " Sec="
+ + placeCount[1]
+ + " Spo="
+ + placeCount[3]
+ + " Bet="
+ + placeCount[2]
+ + " Pri="
+ + placeCount[0]);
+ }
+ // Something (at least the bottom layer must have 1 block) must have been placed, return true
+ return ORE_PLACED;
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_SmallPieces.java b/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_SmallPieces.java
new file mode 100644
index 0000000000..c8219e8361
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_SmallPieces.java
@@ -0,0 +1,115 @@
+package gregtech.common;
+
+import static gregtech.api.enums.GT_Values.debugSmallOres;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Log;
+import gregtech.api.world.GT_Worldgen;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+
+public class GT_Worldgen_GT_Ore_SmallPieces extends GT_Worldgen {
+
+ public final short mMinY;
+ public final short mMaxY;
+ public final short mAmount;
+ public final short mMeta;
+ public final boolean mOverworld;
+ public final boolean mNether;
+ public final boolean mEnd;
+ public final boolean mMoon = false, mMars = false, mAsteroid = false;
+ public final String mBiome;
+ public final String aTextWorldgen = "worldgen.";
+ public static ArrayList<GT_Worldgen_GT_Ore_SmallPieces> sList = new ArrayList<>();
+
+ // TODO CHECK IF INSTANTIATION IS CORRECT
+ public GT_Worldgen_GT_Ore_SmallPieces(String aName, boolean aDefault, int aMinY, int aMaxY, int aAmount,
+ boolean aOverworld, boolean aNether, boolean aEnd, Materials aPrimary) {
+ super(aName, GregTech_API.sWorldgenList, aDefault);
+ this.mOverworld = GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "Overworld", aOverworld);
+ this.mNether = GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "Nether", aNether);
+ this.mEnd = GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "TheEnd", aEnd);
+ this.mMinY = ((short) GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "MinHeight", aMinY));
+ this.mMaxY = ((short) Math.max(
+ this.mMinY + 1,
+ GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "MaxHeight", aMaxY)));
+ this.mAmount = ((short) Math
+ .max(1, GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "Amount", aAmount)));
+ this.mMeta = ((short) GregTech_API.sWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "Ore", aPrimary.mMetaItemSubID));
+ this.mBiome = GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "BiomeName", "None");
+ sList.add(this);
+ }
+
+ public GT_Worldgen_GT_Ore_SmallPieces(String aName, boolean aDefault, int aMinY, int aMaxY, int aAmount,
+ boolean aOverworld, boolean aNether, boolean aEnd, boolean GC_UNUSED1, boolean GC_UNUSED2, boolean GC_UNUSED3,
+ Materials aPrimary) {
+ super(aName, GregTech_API.sWorldgenList, aDefault);
+ this.mOverworld = GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "Overworld", aOverworld);
+ this.mNether = GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "Nether", aNether);
+ this.mEnd = GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "TheEnd", aEnd);
+ this.mMinY = ((short) GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "MinHeight", aMinY));
+ this.mMaxY = ((short) Math.max(
+ this.mMinY + 1,
+ GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "MaxHeight", aMaxY)));
+ this.mAmount = ((short) Math
+ .max(1, GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "Amount", aAmount)));
+ this.mMeta = ((short) GregTech_API.sWorldgenFile
+ .get(aTextWorldgen + this.mWorldGenName, "Ore", aPrimary.mMetaItemSubID));
+ this.mBiome = GregTech_API.sWorldgenFile.get(aTextWorldgen + this.mWorldGenName, "BiomeName", "None");
+ sList.add(this);
+ }
+
+ @Override
+ public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ if (!this.mBiome.equals("None") && !(this.mBiome.equals(aBiome))) {
+ return false; // Not the correct biome for ore mix
+ }
+ if (!isGenerationAllowed(
+ aWorld,
+ aDimensionType,
+ ((aDimensionType == -1) && (this.mNether)) || ((aDimensionType == 0) && (this.mOverworld))
+ || ((aDimensionType == 1) && (this.mEnd)) ? aDimensionType : ~aDimensionType)) {
+ return false;
+ }
+ int count = 0;
+ // For optimal performance, this should be done upstream. Meh
+ String tDimensionName = aWorld.provider.getDimensionName();
+ boolean isUnderdark = tDimensionName.equals("Underdark");
+
+ if (this.mMeta > 0) {
+ int j = Math.max(1, this.mAmount / 2 + aRandom.nextInt(this.mAmount) / 2);
+ for (int i = 0; i < j; i++) {
+ GT_TileEntity_Ores.setOreBlock(
+ aWorld,
+ aChunkX + 8 + aRandom.nextInt(16),
+ this.mMinY + aRandom.nextInt(Math.max(1, this.mMaxY - this.mMinY)),
+ aChunkZ + 8 + aRandom.nextInt(16),
+ this.mMeta,
+ true,
+ isUnderdark);
+ count++;
+ }
+ }
+ if (debugSmallOres) {
+ GT_Log.out.println(
+ "Small Ore:" + this.mWorldGenName
+ + " @ dim="
+ + aDimensionType
+ + " mX="
+ + aChunkX / 16
+ + " mZ="
+ + aChunkZ / 16
+ + " ore="
+ + count);
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_Worldgen_Stone.java b/src/main/java/gregtech/common/GT_Worldgen_Stone.java
new file mode 100644
index 0000000000..835f9d5c67
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_Worldgen_Stone.java
@@ -0,0 +1,295 @@
+package gregtech.common;
+
+import static gregtech.api.enums.GT_Values.debugStones;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_Log;
+import gregtech.api.world.GT_Worldgen_Ore;
+import gregtech.common.blocks.GT_Block_Ores_Abstract;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+
+public class GT_Worldgen_Stone extends GT_Worldgen_Ore {
+
+ static final double[] sizeConversion = { 1, 1, 1.333333, 1.333333, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; // Bias
+ // the
+ // sizes
+ // towards
+ // skinnier
+ // boulders,
+ // ie
+ // more
+ // "shafts"
+ // than
+ // dikes
+ // or
+ // sills.
+
+ public Hashtable<Long, StoneSeeds> validStoneSeeds = new Hashtable<>(1024);
+
+ static class StoneSeeds {
+
+ public boolean mExists;
+
+ StoneSeeds(boolean exists) {
+ mExists = exists;
+ }
+ }
+
+ static class ValidSeeds {
+
+ public int mX;
+ public int mZ;
+
+ ValidSeeds(int x, int z) {
+ this.mX = x;
+ this.mZ = z;
+ }
+ }
+
+ public GT_Worldgen_Stone(String aName, boolean aDefault, Block aBlock, int aBlockMeta, int aDimensionType,
+ int aAmount, int aSize, int aProbability, int aMinY, int aMaxY, Collection<String> aBiomeList,
+ boolean aAllowToGenerateinVoid) {
+ super(
+ aName,
+ aDefault,
+ aBlock,
+ aBlockMeta,
+ aDimensionType,
+ aAmount,
+ aSize,
+ aProbability,
+ aMinY,
+ aMaxY,
+ aBiomeList,
+ aAllowToGenerateinVoid);
+ }
+
+ @Override
+ public boolean executeWorldgen(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX,
+ int aChunkZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) {
+ XSTR stoneRNG = new XSTR();
+ ArrayList<ValidSeeds> stones = new ArrayList<>();
+
+ if (!isGenerationAllowed(aWorld, aDimensionType, this.mDimensionType)) {
+ return false;
+ }
+ if (!(this.mBiomeList.isEmpty() || this.mBiomeList.contains(aBiome))) {
+ return false;
+ }
+ // I think the real size of the balls is mSize/8, but the original code was difficult to understand.
+ // Overall there will be less GT stones since they aren't spheres any more. /16 since this code uses it as a
+ // radius.
+ double realSize = mSize / 16;
+ int windowWidth = ((int) realSize) / 16 + 1; // Width of chunks to check for a potential stoneseed
+ // Check stone seeds to see if they have been added
+ for (int x = aChunkX / 16 - windowWidth; x < (aChunkX / 16 + windowWidth + 1); x++) {
+ for (int z = aChunkZ / 16 - windowWidth; z < (aChunkZ / 16 + windowWidth + 1); z++) {
+ long hash = (((aWorld.provider.dimensionId & 0xffL) << 56) | (((long) x & 0x000000000fffffffL) << 28)
+ | ((long) z & 0x000000000fffffffL));
+ if (!validStoneSeeds.containsKey(hash)) {
+ // Determine if RNG says to add stone at this chunk
+ stoneRNG.setSeed(
+ aWorld.getSeed() ^ hash + Math.abs(mBlockMeta)
+ + Math.abs(mSize)
+ + ((GregTech_API.sBlockGranites == mBlock) ? (32768) : (0))); // Don't judge me.
+ // Want different
+ // values for
+ // different block
+ // types
+ if ((this.mProbability <= 1) || (stoneRNG.nextInt(this.mProbability) == 0)) {
+ // Add stone at this chunk
+ validStoneSeeds.put(hash, new StoneSeeds(true));
+ // Add to generation list
+ stones.add(new ValidSeeds(x, z));
+ if (debugStones) GT_Log.out.println(
+ "New stoneseed=" + mWorldGenName + " x=" + x + " z=" + z + " realSize=" + realSize);
+ } else {
+ validStoneSeeds.put(hash, new StoneSeeds(false));
+ }
+ } else {
+ // This chunk has already been checked, check to see if a boulder exists here
+ if (validStoneSeeds.get(hash).mExists) {
+ // Add to generation list
+ stones.add(new ValidSeeds(x, z));
+ }
+ }
+ }
+ }
+
+ boolean result = stones.size() != 0;
+ // Now process each oreseed vs this requested chunk
+ for (; stones.size() != 0; stones.remove(0)) {
+ int x = stones.get(0).mX * 16;
+ int z = stones.get(0).mZ * 16;
+
+ stoneRNG.setSeed(
+ aWorld.getSeed()
+ ^ (((aWorld.provider.dimensionId & 0xffL) << 56) | (((long) x & 0x000000000fffffffL) << 28)
+ | ((long) z & 0x000000000fffffffL)) + Math.abs(mBlockMeta)
+ + Math.abs(mSize)
+ + ((GregTech_API.sBlockGranites == mBlock) ? (32768) : (0))); // Don't judge me
+ for (int i = 0; i < this.mAmount; i++) { // Not sure why you would want more than one in a chunk! Left alone
+ // though.
+ // Locate the stoneseed XYZ. Original code would request an isAir at the seed location, causing a chunk
+ // generation request.
+ // To reduce potential worldgen cascade, we just always try to place a ball and use the check inside the
+ // for loop to prevent
+ // placement instead.
+ int tX = x + stoneRNG.nextInt(16);
+ int tY = mMinY + stoneRNG.nextInt(mMaxY - mMinY);
+ int tZ = z + stoneRNG.nextInt(16);
+
+ // Determine the XYZ sizes of the stoneseed
+ double xSize = sizeConversion[stoneRNG.nextInt(sizeConversion.length)];
+ double ySize = sizeConversion[stoneRNG.nextInt(sizeConversion.length) / 2]; // Skew the ySize towards
+ // the larger sizes, more
+ // long skinny pipes
+ double zSize = sizeConversion[stoneRNG.nextInt(sizeConversion.length)];
+
+ // Equation for an ellipsoid centered around 0,0,0
+ // Sx, Sy, and Sz are size controls (size = 1/S_)
+ // 1 = full size, 1.333 = 75%, 2 = 50%, 4 = 25%
+ // (x * Sx)^2 + (y * Sy)^2 + (z * sZ)^2 <= (mSize)^2
+
+ // So, we setup the intial boundaries to be the size of the boulder plus a block in each direction
+ int tMinX = tX - (int) (realSize / xSize - 1.0);
+ int tMaxX = tX + (int) (realSize / xSize + 2.0);
+ int tMinY = tY - (int) (realSize / ySize - 1.0);
+ int tMaxY = tY + (int) (realSize / ySize + 2.0);
+ int tMinZ = tZ - (int) (realSize / zSize - 1.0);
+ int tMaxZ = tZ + (int) (realSize / zSize + 2.0);
+
+ // If the (tY-ySize) of the stoneseed is air in the current chunk, mark the seed empty and move on.
+ if (aWorld.getBlock(aChunkX + 8, tMinY, aChunkZ + 8)
+ .isAir(aWorld, aChunkX + 8, tMinY, aChunkZ + 8)) {
+ if (debugStones) GT_Log.out.println(
+ mWorldGenName + " tX="
+ + tX
+ + " tY="
+ + tY
+ + " tZ="
+ + tZ
+ + " realSize="
+ + realSize
+ + " xSize="
+ + realSize / xSize
+ + " ySize="
+ + realSize / ySize
+ + " zSize="
+ + realSize / zSize
+ + " tMinY="
+ + tMinY
+ + " tMaxY="
+ + tMaxY
+ + " - Skipped because first requesting chunk would not contain this stone");
+ long hash = (((aWorld.provider.dimensionId & 0xffL) << 56)
+ | (((long) x & 0x000000000fffffffL) << 28)
+ | ((long) z & 0x000000000fffffffL));
+ validStoneSeeds.remove(hash);
+ validStoneSeeds.put(hash, new StoneSeeds(false));
+ }
+
+ // Chop the boundaries by the parts that intersect with the current chunk
+ int wX = Math.max(tMinX, aChunkX + 8);
+ int eX = Math.min(tMaxX, aChunkX + 8 + 16);
+
+ int sZ = Math.max(tMinZ, aChunkZ + 8);
+ int nZ = Math.min(tMaxZ, aChunkZ + 8 + 16);
+
+ if (debugStones) GT_Log.out.println(
+ mWorldGenName + " tX="
+ + tX
+ + " tY="
+ + tY
+ + " tZ="
+ + tZ
+ + " realSize="
+ + realSize
+ + " xSize="
+ + realSize / xSize
+ + " ySize="
+ + realSize / ySize
+ + " zSize="
+ + realSize / zSize
+ + " wX="
+ + wX
+ + " eX="
+ + eX
+ + " tMinY="
+ + tMinY
+ + " tMaxY="
+ + tMaxY
+ + " sZ="
+ + sZ
+ + " nZ="
+ + nZ);
+
+ double rightHandSide = realSize * realSize + 1; // Precalc the right hand side
+ for (int iY = tMinY; iY < tMaxY; iY++) { // Do placement from the bottom up layer up. Maybe better on
+ // cache usage?
+ double yCalc = ((double) (iY - tY) * ySize);
+ yCalc = yCalc * yCalc; // (y*Sy)^2
+ double leftHandSize = yCalc;
+ if (leftHandSize > rightHandSide) {
+ continue; // If Y alone is larger than the RHS, skip the rest of the loops
+ }
+ for (int iX = wX; iX < eX; iX++) {
+ double xCalc = ((double) (iX - tX) * xSize);
+ xCalc = xCalc * xCalc;
+ leftHandSize = yCalc + xCalc;
+ if (leftHandSize > rightHandSide) { // Again, if X and Y is larger than the RHS, skip to the
+ // next value
+ continue;
+ }
+ for (int iZ = sZ; iZ < nZ; iZ++) {
+ double zCalc = ((double) (iZ - tZ) * zSize);
+ zCalc = zCalc * zCalc;
+ leftHandSize = zCalc + xCalc + yCalc;
+ if (leftHandSize <= rightHandSide) {
+ // Yay! We can actually place a block now. (this part copied from original code)
+ Block tTargetedBlock = aWorld.getBlock(iX, iY, iZ);
+ if (tTargetedBlock instanceof GT_Block_Ores_Abstract) {
+ TileEntity tTileEntity = aWorld.getTileEntity(iX, iY, iZ);
+ if ((tTileEntity instanceof GT_TileEntity_Ores)) {
+ if (tTargetedBlock != GregTech_API.sBlockOres1) {
+ ((GT_TileEntity_Ores) tTileEntity).convertOreBlock(aWorld, iX, iY, iZ);
+ }
+ ((GT_TileEntity_Ores) tTileEntity)
+ .overrideOreBlockMaterial(this.mBlock, (byte) this.mBlockMeta);
+ }
+ } else if (((this.mAllowToGenerateinVoid) && (aWorld.getBlock(iX, iY, iZ)
+ .isAir(aWorld, iX, iY, iZ)))
+ || ((tTargetedBlock != null) && ((tTargetedBlock
+ .isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.stone))
+ || (tTargetedBlock
+ .isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.stained_hardened_clay))
+ || (tTargetedBlock.isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.cobblestone))
+ || (tTargetedBlock.isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.end_stone))
+ || (tTargetedBlock.isReplaceableOreGen(aWorld, iX, iY, iZ, Blocks.netherrack))
+ || (tTargetedBlock
+ .isReplaceableOreGen(aWorld, iX, iY, iZ, GregTech_API.sBlockGranites))
+ || (tTargetedBlock
+ .isReplaceableOreGen(aWorld, iX, iY, iZ, GregTech_API.sBlockStones))))) {
+ aWorld.setBlock(iX, iY, iZ, this.mBlock, this.mBlockMeta, 0);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return result;
+ }
+}
diff --git a/src/main/java/gregtech/common/GT_Worldgenerator.java b/src/main/java/gregtech/common/GT_Worldgenerator.java
new file mode 100644
index 0000000000..7357f42446
--- /dev/null
+++ b/src/main/java/gregtech/common/GT_Worldgenerator.java
@@ -0,0 +1,688 @@
+package gregtech.common;
+
+import static gregtech.api.enums.GT_Values.debugOrevein;
+import static gregtech.api.enums.GT_Values.debugWorldGen;
+import static gregtech.api.enums.GT_Values.oreveinAttempts;
+import static gregtech.api.enums.GT_Values.oreveinMaxPlacementAttempts;
+import static gregtech.api.enums.GT_Values.oreveinPercentage;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Blocks;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+import net.minecraft.world.WorldSavedData;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraft.world.chunk.IChunkProvider;
+import net.minecraftforge.event.world.WorldEvent;
+
+import cpw.mods.fml.common.IWorldGenerator;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.PlayerEvent;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.net.GT_Packet_SendOregenPattern;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_Log;
+import gregtech.api.world.GT_Worldgen;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+
+public class GT_Worldgenerator implements IWorldGenerator {
+
+ private static int mEndAsteroidProbability = 300;
+ private static int mSize = 100;
+ private static int endMinSize = 50;
+ private static int endMaxSize = 200;
+ private static boolean endAsteroids = true;
+ public static List<Runnable> mList = new ArrayList<>();
+ public static HashSet<Long> ProcChunks = new HashSet<>();
+ // This is probably not going to work. Trying to create a fake orevein to put into hashtable when there will be no
+ // ores in a vein.
+ public static GT_Worldgen_GT_Ore_Layer noOresInVein = new GT_Worldgen_GT_Ore_Layer(
+ "NoOresInVein",
+ false,
+ 0,
+ 255,
+ 0,
+ 255,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Aluminium,
+ Materials.Aluminium,
+ Materials.Aluminium,
+ Materials.Aluminium);
+ public static Hashtable<Long, GT_Worldgen_GT_Ore_Layer> validOreveins = new Hashtable<>(1024);
+ public boolean mIsGenerating = false;
+ public static final Object listLock = new Object();
+ public static OregenPattern oregenPattern = OregenPattern.AXISSYMMETRICAL;
+
+ public GT_Worldgenerator() {
+ endAsteroids = GregTech_API.sWorldgenFile.get("endasteroids", "GenerateAsteroids", true);
+ endMinSize = GregTech_API.sWorldgenFile.get("endasteroids", "AsteroidMinSize", 50);
+ endMaxSize = GregTech_API.sWorldgenFile.get("endasteroids", "AsteroidMaxSize", 200);
+ mEndAsteroidProbability = GregTech_API.sWorldgenFile.get("endasteroids", "AsteroidProbability", 300);
+ GameRegistry.registerWorldGenerator(this, 1073741823);
+ if (debugWorldGen) {
+ GT_Log.out.println("GT_Worldgenerator created");
+ }
+ }
+
+ @Override
+ public void generate(Random aRandom, int aX, int aZ, World aWorld, IChunkProvider aChunkGenerator,
+ IChunkProvider aChunkProvider) {
+ synchronized (listLock) {
+ mList.add(
+ new WorldGenContainer(
+ new XSTR(Math.abs(aRandom.nextInt()) + 1),
+ aX,
+ aZ,
+ aWorld.provider.dimensionId,
+ aWorld,
+ aChunkGenerator,
+ aChunkProvider,
+ aWorld.getBiomeGenForCoords(aX * 16 + 8, aZ * 16 + 8).biomeName));
+ if (debugWorldGen) GT_Log.out.println(
+ "ADD WorldSeed:" + aWorld.getSeed()
+ + " DimId"
+ + aWorld.provider.dimensionId
+ + " chunk x:"
+ + aX
+ + " z:"
+ + aZ
+ + " SIZE: "
+ + mList.size());
+ }
+
+ if (!this.mIsGenerating) {
+ this.mIsGenerating = true;
+ int mList_sS = mList.size();
+ mList_sS = Math.min(mList_sS, 5); // Run a maximum of 5 chunks at a time through worldgen. Extra chunks get
+ // done later.
+ for (int i = 0; i < mList_sS; i++) {
+ WorldGenContainer toRun = (WorldGenContainer) mList.get(0);
+ if (debugWorldGen) GT_Log.out.println(
+ "RUN WorldSeed:" + aWorld.getSeed()
+ + " DimId"
+ + aWorld.provider.dimensionId
+ + " chunk x:"
+ + toRun.mX
+ + " z:"
+ + toRun.mZ
+ + " SIZE: "
+ + mList.size()
+ + " i: "
+ + i);
+ synchronized (listLock) {
+ mList.remove(0);
+ }
+ toRun.run();
+ }
+ this.mIsGenerating = false;
+ }
+ }
+
+ public static boolean isOreChunk(int chunkX, int chunkZ) {
+ if (oregenPattern == OregenPattern.EQUAL_SPACING) {
+ return Math.floorMod(chunkX, 3) == 1 && Math.floorMod(chunkZ, 3) == 1;
+ }
+ // add next if statement here or convert to switch when expanding OregenPattern enum
+
+ // AXISSYMMETRICAL
+ return Math.abs(chunkX) % 3 == 1 && Math.abs(chunkZ) % 3 == 1;
+ }
+
+ public static class OregenPatternSavedData extends WorldSavedData {
+
+ private static final String NAME = "GregTech_OregenPattern";
+ private static final String KEY = "oregenPattern";
+
+ public OregenPatternSavedData(String p_i2141_1_) {
+ super(p_i2141_1_);
+ }
+
+ public static void loadData(World world) {
+ if (world.getWorldInfo()
+ .getWorldTotalTime() == 0L) {
+ // The world has just been created -> use newest pattern
+ oregenPattern = OregenPattern.values()[OregenPattern.values().length - 1];
+ } else {
+ // This is an old world. Use legacy pattern for now, readFromNBT may change this if
+ // GregTech_OregenPattern.dat is present
+ oregenPattern = OregenPattern.AXISSYMMETRICAL;
+ }
+
+ // load OregenPatternSavedData
+ WorldSavedData instance = world.mapStorage
+ .loadData(OregenPatternSavedData.class, OregenPatternSavedData.NAME);
+ if (instance == null) {
+ instance = new OregenPatternSavedData(NAME);
+ world.mapStorage.setData(OregenPatternSavedData.NAME, instance);
+ }
+ instance.markDirty();
+ }
+
+ @SubscribeEvent
+ public void onWorldLoad(WorldEvent.Load event) {
+ final World world = event.world;
+ if (!world.isRemote && world.provider.dimensionId == 0) {
+ loadData(world);
+ }
+ }
+
+ @SubscribeEvent
+ public void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) {
+ if (event.player instanceof EntityPlayerMP player) {
+ GT_Values.NW.sendToPlayer(new GT_Packet_SendOregenPattern(oregenPattern), player);
+ }
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound p_76184_1_) {
+ if (p_76184_1_.hasKey(KEY)) {
+ int ordinal = p_76184_1_.getByte(KEY);
+ ordinal = MathHelper.clamp_int(ordinal, 0, OregenPattern.values().length - 1);
+ oregenPattern = OregenPattern.values()[ordinal];
+ }
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound p_76187_1_) {
+ // If we have so many different OregenPatterns that byte isn't good enough something is wrong
+ p_76187_1_.setByte(KEY, (byte) oregenPattern.ordinal());
+ }
+
+ }
+
+ public enum OregenPattern {
+ // The last value is used when creating a new world
+ AXISSYMMETRICAL,
+ EQUAL_SPACING;
+ }
+
+ public static class WorldGenContainer implements Runnable {
+
+ public final Random mRandom;
+ public final int mX;
+ public final int mZ;
+ public final int mDimensionType;
+ public final World mWorld;
+ public final IChunkProvider mChunkGenerator;
+ public final IChunkProvider mChunkProvider;
+ public final String mBiome;
+ // Used for outputting orevein weights and bins
+ // static int test=0;
+
+ // Local class to track which orevein seeds must be checked when doing chunkified worldgen
+ static class NearbySeeds {
+
+ public int mX;
+ public int mZ;
+
+ NearbySeeds(int x, int z) {
+ this.mX = x;
+ this.mZ = z;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof NearbySeeds that)) return false;
+ if (this.mX != that.mX) return false;
+ return this.mZ == that.mZ;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = this.mX;
+ result = 31 * result + this.mZ;
+ return result;
+ }
+ }
+
+ public static ArrayList<GT_Worldgenerator.WorldGenContainer.NearbySeeds> seedList = new ArrayList<>();
+
+ // aX and aZ are now the by-chunk X and Z for the chunk of interest
+ public WorldGenContainer(Random aRandom, int aX, int aZ, int aDimensionType, World aWorld,
+ IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider, String aBiome) {
+ this.mRandom = aRandom;
+ this.mX = aX;
+ this.mZ = aZ;
+ this.mDimensionType = aDimensionType;
+ this.mWorld = aWorld;
+ this.mChunkGenerator = aChunkGenerator;
+ this.mChunkProvider = aChunkProvider;
+ this.mBiome = aBiome;
+ }
+
+ // How to evaluate oregen distribution
+ // - Enable debugOreveins
+ // - Fly around for a while, or teleport jumping ~320 blocks at a time, with
+ // a 15-30s pause for worldgen to catch up
+ // - Do this across a large area, at least 2000x2000 blocks for good numbers
+ // - Open logs\gregtech.log
+ // - Using notepad++, do a Search | Find - enter "Added" for the search term
+ // - Select Find All In Current Document
+ // - In the Search window, right-click and Select All
+ // - Copy and paste to a new file
+ // - Delete extraneous stuff at top, and blank line at bottom. Line count is
+ // # of total oreveins
+ // - For simple spot checks, use Find All in Current Document for specific
+ // oremixes, ie ore.mix.diamond, to check how many appear in the list.
+ // - For more complex work, import file into Excel, and sort based on oremix
+ // column. Drag select the oremix names, in the bottom right will be how many
+ // entries to add in a seperate tab to calculate %ages.
+ //
+ // When using the ore weights, discount or remove the high altitude veins since
+ // their high weight are offset by their rareness. I usually just use zero for them.
+ // Actual spawn rates will vary based upon the average height of the stone layers
+ // in the dimension. For example veins that range above and below the average height
+ // will be less, and veins that are completely above the average height will be much less.
+
+ public void worldGenFindVein(int oreseedX, int oreseedZ) {
+ // Explanation of oreveinseed implementation.
+ // (long)this.mWorld.getSeed()<<16) Deep Dark does two oregen passes, one with getSeed set to +1 the
+ // original world seed. This pushes that +1 off the low bits of oreseedZ, so that the hashes are far apart
+ // for the two passes.
+ // ((this.mWorld.provider.dimensionId & 0xffL)<<56) Puts the dimension in the top bits of the hash, to
+ // make sure to get unique hashes per dimension
+ // ((long)oreseedX & 0x000000000fffffffL) << 28) Puts the chunk X in the bits 29-55. Cuts off the top few
+ // bits of the chunk so we have bits for dimension.
+ // ( (long)oreseedZ & 0x000000000fffffffL )) Puts the chunk Z in the bits 0-27. Cuts off the top few bits
+ // of the chunk so we have bits for dimension.
+ long oreveinSeed = (this.mWorld.getSeed() << 16)
+ ^ (((this.mWorld.provider.dimensionId & 0xffL) << 56) | (((long) oreseedX & 0x000000000fffffffL) << 28)
+ | ((long) oreseedZ & 0x000000000fffffffL)); // Use an RNG that is identical every time it is
+ // called for
+ // this oreseed.
+ XSTR oreveinRNG = new XSTR(oreveinSeed);
+ int oreveinPercentageRoll = oreveinRNG.nextInt(100); // Roll the dice, see if we get an orevein here at all
+ int noOrePlacedCount = 0;
+ String tDimensionName = "";
+ if (debugOrevein) {
+ tDimensionName = this.mWorld.provider.getDimensionName();
+ }
+
+ if (debugOrevein) GT_Log.out.println(
+ " Finding oreveins for oreveinSeed=" + oreveinSeed
+ + " mX="
+ + this.mX
+ + " mZ="
+ + this.mZ
+ + " oreseedX="
+ + oreseedX
+ + " oreseedZ="
+ + oreseedZ
+ + " worldSeed="
+ + this.mWorld.getSeed());
+
+ // Search for a valid orevein for this dimension
+ if (!validOreveins.containsKey(oreveinSeed)) {
+ if ((oreveinPercentageRoll < oreveinPercentage) && (GT_Worldgen_GT_Ore_Layer.sWeight > 0)
+ && (GT_Worldgen_GT_Ore_Layer.sList.size() > 0)) {
+ int placementAttempts = 0;
+ boolean oreveinFound = false;
+ int i;
+
+ // Used for outputting orevein weights and bins
+ /*
+ * if( test==0 ) { test = 1; GT_Log.out.println( "sWeight = " + GT_Worldgen_GT_Ore_Layer.sWeight );
+ * for (GT_Worldgen_GT_Ore_Layer tWorldGen : GT_Worldgen_GT_Ore_Layer.sList) { GT_Log.out.println( (
+ * tWorldGen).mWorldGenName + " mWeight = " + ( tWorldGen).mWeight + " mSize = " + (tWorldGen).mSize
+ * ); } }
+ */
+ for (i = 0; (i < oreveinAttempts) && (!oreveinFound)
+ && (placementAttempts < oreveinMaxPlacementAttempts); i++) {
+ int tRandomWeight = oreveinRNG.nextInt(GT_Worldgen_GT_Ore_Layer.sWeight);
+ for (GT_Worldgen_GT_Ore_Layer tWorldGen : GT_Worldgen_GT_Ore_Layer.sList) {
+ tRandomWeight -= (tWorldGen).mWeight;
+ if (tRandomWeight <= 0) {
+ try {
+ // Adjust the seed so that this layer has a series of unique random numbers.
+ // Otherwise multiple attempts at this same oreseed will get the same offset and X/Z
+ // values. If an orevein failed, any orevein with the
+ // same minimum heights would fail as well. This prevents that, giving each orevein
+ // a unique height each pass through here.
+ int placementResult = tWorldGen.executeWorldgenChunkified(
+ this.mWorld,
+ new XSTR(oreveinSeed ^ (tWorldGen.mPrimaryMeta)),
+ this.mBiome,
+ this.mDimensionType,
+ this.mX * 16,
+ this.mZ * 16,
+ oreseedX * 16,
+ oreseedZ * 16,
+ this.mChunkGenerator,
+ this.mChunkProvider);
+ switch (placementResult) {
+ case GT_Worldgen_GT_Ore_Layer.ORE_PLACED -> {
+ if (debugOrevein) GT_Log.out.println(
+ " Added near oreveinSeed=" + oreveinSeed
+ + " "
+ + (tWorldGen).mWorldGenName
+ + " tries at oremix="
+ + i
+ + " placementAttempts="
+ + placementAttempts
+ + " dimensionName="
+ + tDimensionName);
+ validOreveins.put(oreveinSeed, tWorldGen);
+ oreveinFound = true;
+ }
+ case GT_Worldgen_GT_Ore_Layer.NO_ORE_IN_BOTTOM_LAYER -> placementAttempts++;
+
+ // SHould do retry in this case until out of chances
+ case GT_Worldgen_GT_Ore_Layer.NO_OVERLAP -> {
+ if (debugOrevein) GT_Log.out.println(
+ " Added far oreveinSeed=" + oreveinSeed
+ + " "
+ + (tWorldGen).mWorldGenName
+ + " tries at oremix="
+ + i
+ + " placementAttempts="
+ + placementAttempts
+ + " dimensionName="
+ + tDimensionName);
+ validOreveins.put(oreveinSeed, tWorldGen);
+ oreveinFound = true;
+ }
+ case GT_Worldgen_GT_Ore_Layer.NO_OVERLAP_AIR_BLOCK -> {
+ if (debugOrevein) GT_Log.out.println(
+ " No overlap and air block in test spot=" + oreveinSeed
+ + " "
+ + (tWorldGen).mWorldGenName
+ + " tries at oremix="
+ + i
+ + " placementAttempts="
+ + placementAttempts
+ + " dimensionName="
+ + tDimensionName);
+ // SHould do retry in this case until out of chances
+ placementAttempts++;
+ }
+ }
+ break; // Try the next orevein
+ } catch (Throwable e) {
+ if (debugOrevein) GT_Log.out.println(
+ "Exception occurred on oreVein" + tWorldGen
+ + " oreveinSeed="
+ + oreveinSeed
+ + " mX="
+ + this.mX
+ + " mZ="
+ + this.mZ
+ + " oreseedX="
+ + oreseedX
+ + " oreseedZ="
+ + oreseedZ);
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ }
+ // Only add an empty orevein if unable to place a vein at the oreseed chunk.
+ if ((!oreveinFound) && (this.mX == oreseedX) && (this.mZ == oreseedZ)) {
+ if (debugOrevein) GT_Log.out.println(
+ " Empty oreveinSeed=" + oreveinSeed
+ + " mX="
+ + this.mX
+ + " mZ="
+ + this.mZ
+ + " oreseedX="
+ + oreseedX
+ + " oreseedZ="
+ + oreseedZ
+ + " tries at oremix="
+ + i
+ + " placementAttempts="
+ + placementAttempts
+ + " dimensionName="
+ + tDimensionName);
+ validOreveins.put(oreveinSeed, noOresInVein);
+ }
+ } else if (oreveinPercentageRoll >= oreveinPercentage) {
+ if (debugOrevein) GT_Log.out.println(
+ " Skipped oreveinSeed=" + oreveinSeed
+ + " mX="
+ + this.mX
+ + " mZ="
+ + this.mZ
+ + " oreseedX="
+ + oreseedX
+ + " oreseedZ="
+ + oreseedZ
+ + " RNG="
+ + oreveinPercentageRoll
+ + " %="
+ + oreveinPercentage
+ + " dimensionName="
+ + tDimensionName);
+ validOreveins.put(oreveinSeed, noOresInVein);
+ }
+ } else {
+ // oreseed is located in the previously processed table
+ if (debugOrevein) GT_Log.out
+ .print(" Valid oreveinSeed=" + oreveinSeed + " validOreveins.size()=" + validOreveins.size() + " ");
+ GT_Worldgen_GT_Ore_Layer tWorldGen = validOreveins.get(oreveinSeed);
+ oreveinRNG.setSeed(oreveinSeed ^ (tWorldGen.mPrimaryMeta)); // Reset RNG to only be based on oreseed X/Z
+ // and type of vein
+ int placementResult = tWorldGen.executeWorldgenChunkified(
+ this.mWorld,
+ oreveinRNG,
+ this.mBiome,
+ this.mDimensionType,
+ this.mX * 16,
+ this.mZ * 16,
+ oreseedX * 16,
+ oreseedZ * 16,
+ this.mChunkGenerator,
+ this.mChunkProvider);
+ switch (placementResult) {
+ case GT_Worldgen_GT_Ore_Layer.NO_ORE_IN_BOTTOM_LAYER -> {
+ if (debugOrevein) GT_Log.out.println(" No ore in bottom layer");
+ }
+ case GT_Worldgen_GT_Ore_Layer.NO_OVERLAP -> {
+ if (debugOrevein) GT_Log.out.println(" No overlap");
+ }
+ }
+ }
+ }
+
+ @Override
+ public void run() {
+ long startTime = System.nanoTime();
+ Chunk tChunk = this.mWorld.getChunkFromChunkCoords(this.mX, this.mZ);
+
+ int oreveinMaxSize;
+
+ // Do GT_Stones and GT_small_ores oregen for this chunk
+ try {
+ for (GT_Worldgen tWorldGen : GregTech_API.sWorldgenList) {
+ /*
+ * if (debugWorldGen) GT_Log.out.println( "tWorldGen.mWorldGenName="+tWorldGen.mWorldGenName );
+ */
+ tWorldGen.executeWorldgen(
+ this.mWorld,
+ this.mRandom,
+ this.mBiome,
+ this.mDimensionType,
+ this.mX * 16,
+ this.mZ * 16,
+ this.mChunkGenerator,
+ this.mChunkProvider);
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ long leftOverTime = System.nanoTime();
+
+ // Determine bounding box on how far out to check for oreveins affecting this chunk
+ // For now, manually reducing oreveinMaxSize when not in the Underdark for performance
+ if (this.mWorld.provider.getDimensionName()
+ .equals("Underdark")) {
+ oreveinMaxSize = 32; // Leave Deep Dark/Underdark max oregen at 32, instead of 64
+ } else {
+ oreveinMaxSize = 32;
+ }
+
+ int wXbox = this.mX - (oreveinMaxSize / 16);
+ int eXbox = this.mX + (oreveinMaxSize / 16 + 1); // Need to add 1 since it is compared using a <
+ int nZbox = this.mZ - (oreveinMaxSize / 16);
+ int sZbox = this.mZ + (oreveinMaxSize / 16 + 1);
+
+ // Search for orevein seeds and add to the list;
+ for (int x = wXbox; x < eXbox; x++) {
+ for (int z = nZbox; z < sZbox; z++) {
+ // Determine if this X/Z is an orevein seed
+ if (isOreChunk(x, z)) {
+ if (debugWorldGen) GT_Log.out.println("Adding seed x=" + x + " z=" + z);
+ seedList.add(new NearbySeeds(x, z));
+ }
+ }
+ }
+
+ // Now process each oreseed vs this requested chunk
+ for (; seedList.size() != 0; seedList.remove(0)) {
+ if (debugWorldGen)
+ GT_Log.out.println("Processing seed x=" + seedList.get(0).mX + " z=" + seedList.get(0).mZ);
+ worldGenFindVein(seedList.get(0).mX, seedList.get(0).mZ);
+ }
+
+ long oregenTime = System.nanoTime();
+
+ // Asteroid Worldgen
+ int tDimensionType = this.mWorld.provider.dimensionId;
+ // String tDimensionName = this.mWorld.provider.getDimensionName();
+ // if (((tDimensionType == 1) && endAsteroids && ((mEndAsteroidProbability <= 1) ||
+ // (aRandom.nextInt(mEndAsteroidProbability) == 0))) || ((tDimensionName.equals("Asteroids")) && gcAsteroids
+ // && ((mGCAsteroidProbability <= 1) || (aRandom.nextInt(mGCAsteroidProbability) == 0)))) {
+ if ((tDimensionType == 1 /* the end */) && endAsteroids) {
+ XSTR random = new XSTR(
+ mWorld.getSeed() + mX * mX * 91777L + mZ * mZ * 137413L + mX * mZ * 1853L + mX * 3L + mZ * 17L);
+
+ if (mEndAsteroidProbability <= 1 || random.nextInt(mEndAsteroidProbability) == 0) {
+ generateAsteroid(mWorld, random, mX, mZ);
+ }
+ }
+
+ if (tChunk != null) {
+ tChunk.isModified = true;
+ }
+ long endTime = System.nanoTime();
+ long duration = (endTime - startTime);
+ if (debugWorldGen) {
+ GT_Log.out.println(
+ " Oregen took " + (oregenTime - leftOverTime)
+ + " Leftover gen took "
+ + (leftOverTime - startTime)
+ + " Worldgen took "
+ + duration
+ + " nanoseconds");
+ }
+ }
+
+ private void generateAsteroid(World world, Random random, int chunkX, int chunkZ) {
+ short primaryMeta = 0;
+ short secondaryMeta = 0;
+ short betweenMeta = 0;
+ short sporadicMeta = 0;
+ if ((GT_Worldgen_GT_Ore_Layer.sWeight > 0) && (GT_Worldgen_GT_Ore_Layer.sList.size() > 0)) {
+ boolean temp = true;
+ int tRandomWeight;
+ for (int i = 0; (i < oreveinAttempts) && (temp); i++) {
+ tRandomWeight = random.nextInt(GT_Worldgen_GT_Ore_Layer.sWeight);
+ for (GT_Worldgen_GT_Ore_Layer tWorldGen : GT_Worldgen_GT_Ore_Layer.sList) {
+ tRandomWeight -= tWorldGen.mWeight;
+ if (tRandomWeight <= 0) {
+ try {
+ if (tWorldGen.mEndAsteroid) {
+ primaryMeta = tWorldGen.mPrimaryMeta;
+ secondaryMeta = tWorldGen.mSecondaryMeta;
+ betweenMeta = tWorldGen.mBetweenMeta;
+ sporadicMeta = tWorldGen.mSporadicMeta;
+ temp = false;
+ break;
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ }
+ }
+ // if(GT_Values.D1)GT_FML_LOGGER.info("do asteroid gen: "+this.mX+" "+this.mZ);
+ int tX = chunkX * 16 + random.nextInt(16);
+ int tY = 50 + random.nextInt(200 - 50);
+ int tZ = chunkZ * 16 + random.nextInt(16);
+ mSize = endMinSize + random.nextInt(endMaxSize - endMinSize + 1);
+
+ if ((world.getBlock(tX, tY, tZ)
+ .isAir(world, tX, tY, tZ))) {
+ float randomRadian = random.nextFloat() * (float) Math.PI;
+ double xBase = tX + 8 + MathHelper.sin(randomRadian) * mSize / 8.0F;
+ double xFactor = tX + 8 - MathHelper.sin(randomRadian) * mSize / 8.0F;
+ double zBase = tZ + 8 + MathHelper.cos(randomRadian) * mSize / 8.0F;
+ double zFactor = tZ + 8 - MathHelper.cos(randomRadian) * mSize / 8.0F;
+ double yBase = tY + random.nextInt(3) - 2;
+ double yFactor = tY + random.nextInt(3) - 2;
+
+ for (int i = 0; i <= mSize; i++) {
+ double xCenter = xBase + (xFactor - xBase) * i / mSize;
+ double yCenter = yBase + (yFactor - yBase) * i / mSize;
+ double zCenter = zBase + (zFactor - zBase) * i / mSize;
+ double randomDistance = random.nextDouble() * mSize / 16.0D;
+ double halfLength = (MathHelper.sin(i * (float) Math.PI / mSize) + 1.0F) * randomDistance + 1.0D;
+ double halfHeight = (MathHelper.sin(i * (float) Math.PI / mSize) + 1.0F) * randomDistance + 1.0D;
+ int tMinX = MathHelper.floor_double(xCenter - halfLength / 2.0D);
+ int tMinY = MathHelper.floor_double(yCenter - halfHeight / 2.0D);
+ int tMinZ = MathHelper.floor_double(zCenter - halfLength / 2.0D);
+ int tMaxX = MathHelper.floor_double(xCenter + halfLength / 2.0D);
+ int tMaxY = MathHelper.floor_double(yCenter + halfHeight / 2.0D);
+ int tMaxZ = MathHelper.floor_double(zCenter + halfLength / 2.0D);
+
+ for (int eX = tMinX; eX <= tMaxX; eX++) {
+ double xChance = (eX + 0.5D - xCenter) / (halfLength / 2.0D);
+ if (xChance * xChance < 1.0D) {
+ for (int eY = tMinY; eY <= tMaxY; eY++) {
+ double yChance = (eY + 0.5D - yCenter) / (halfHeight / 2.0D);
+ if (xChance * xChance + yChance * yChance < 1.0D) {
+ for (int eZ = tMinZ; eZ <= tMaxZ; eZ++) {
+ double zChance = (eZ + 0.5D - zCenter) / (halfLength / 2.0D);
+ if (xChance * xChance + yChance * yChance + zChance * zChance >= 1.0D) {
+ continue;
+ }
+ if (!world.getBlock(tX, tY, tZ)
+ .isAir(world, tX, tY, tZ)) {
+ continue;
+ }
+ int ranOre = random.nextInt(50);
+ if (ranOre < 3) {
+ GT_TileEntity_Ores.setOreBlock(world, eX, eY, eZ, primaryMeta, false);
+ } else if (ranOre < 6) {
+ GT_TileEntity_Ores.setOreBlock(world, eX, eY, eZ, secondaryMeta, false);
+ } else if (ranOre < 8) {
+ GT_TileEntity_Ores.setOreBlock(world, eX, eY, eZ, betweenMeta, false);
+ } else if (ranOre < 10) {
+ GT_TileEntity_Ores.setOreBlock(world, eX, eY, eZ, sporadicMeta, false);
+ } else {
+ world.setBlock(eX, eY, eZ, Blocks.end_stone, 0, 0);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/bees/GT_AlleleBeeSpecies.java b/src/main/java/gregtech/common/bees/GT_AlleleBeeSpecies.java
new file mode 100644
index 0000000000..b264737677
--- /dev/null
+++ b/src/main/java/gregtech/common/bees/GT_AlleleBeeSpecies.java
@@ -0,0 +1,53 @@
+package gregtech.common.bees;
+
+import java.awt.Color;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.apiculture.IAlleleBeeSpeciesCustom;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IClassification;
+import forestry.apiculture.genetics.alleles.AlleleBeeSpecies;
+
+public class GT_AlleleBeeSpecies extends AlleleBeeSpecies {
+
+ public GT_AlleleBeeSpecies(String uid, boolean dominant, String unlocalizedName, String authority,
+ String unlocalizedDescription, IClassification branch, String binomial, Color primaryColor,
+ Color secondaryColor) {
+ super(
+ uid,
+ unlocalizedName,
+ authority,
+ unlocalizedDescription,
+ dominant,
+ branch,
+ binomial,
+ primaryColor.getRGB(),
+ secondaryColor.getRGB());
+ AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.SPECIES);
+ }
+
+ @Override
+ public IAlleleBeeSpeciesCustom addProduct(ItemStack product, Float chance) {
+ if (product == null || product.getItem() == null) {
+ product = new ItemStack(Items.boat);
+ }
+ if (chance <= 0.0f || chance > 1.0f) {
+ chance = 0.1f;
+ }
+ return super.addProduct(product, chance);
+ }
+
+ @Override
+ public IAlleleBeeSpeciesCustom addSpecialty(ItemStack specialty, Float chance) {
+ if (specialty == null || specialty.getItem() == null) {
+ specialty = new ItemStack(Items.boat);
+ }
+ if (chance <= 0.0f || chance > 1.0f) {
+ chance = 0.1f;
+ }
+ return super.addSpecialty(specialty, chance);
+ }
+}
diff --git a/src/main/java/gregtech/common/bees/GT_AlleleHelper.java b/src/main/java/gregtech/common/bees/GT_AlleleHelper.java
new file mode 100644
index 0000000000..496aff29ca
--- /dev/null
+++ b/src/main/java/gregtech/common/bees/GT_AlleleHelper.java
@@ -0,0 +1,268 @@
+package gregtech.common.bees;
+
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.arboriculture.EnumTreeChromosome;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.EnumTolerance;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IAlleleBoolean;
+import forestry.api.genetics.IAlleleInteger;
+import forestry.api.genetics.IAlleleTolerance;
+import forestry.api.genetics.IChromosomeType;
+import forestry.api.lepidopterology.EnumButterflyChromosome;
+import forestry.apiculture.flowers.FlowerProvider;
+import forestry.core.config.Constants;
+import forestry.core.genetics.alleles.AlleleBoolean;
+import forestry.core.genetics.alleles.AlleleHelper;
+import forestry.core.genetics.alleles.AlleleInteger;
+import forestry.core.genetics.alleles.AlleleTolerance;
+import forestry.core.genetics.alleles.EnumAllele;
+import forestry.core.genetics.alleles.IAlleleValue;
+import forestry.core.utils.vect.IVect;
+import forestry.plugins.PluginManager;
+import gregtech.GT_Mod;
+
+public class GT_AlleleHelper extends AlleleHelper {
+
+ private static final String modId = Constants.ID;
+
+ private Map<Class<?>, Map<?, ? extends IAllele>> alleleMaps = new HashMap<>();
+
+ @Override
+ public void init() {
+ if (PluginManager.Module.APICULTURE.isEnabled()) {
+ createAlleles(EnumAllele.Fertility.class, EnumBeeChromosome.FERTILITY);
+ createAlleles(EnumAllele.Flowering.class, EnumBeeChromosome.FLOWERING);
+ }
+
+ if (PluginManager.Module.APICULTURE.isEnabled() || PluginManager.Module.ARBORICULTURE.isEnabled()) {
+ createAlleles(EnumAllele.Territory.class, EnumBeeChromosome.TERRITORY, EnumTreeChromosome.TERRITORY);
+
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.territoryDefault", get(EnumAllele.Territory.AVERAGE));
+ }
+
+ if (PluginManager.Module.APICULTURE.isEnabled() || PluginManager.Module.LEPIDOPTEROLOGY.isEnabled()) {
+ createAlleles(EnumAllele.Speed.class, EnumBeeChromosome.SPEED, EnumButterflyChromosome.SPEED);
+ createAlleles(EnumAllele.Lifespan.class, EnumBeeChromosome.LIFESPAN, EnumButterflyChromosome.LIFESPAN);
+ createAlleles(
+ EnumAllele.Tolerance.class,
+ EnumBeeChromosome.TEMPERATURE_TOLERANCE,
+ EnumBeeChromosome.HUMIDITY_TOLERANCE,
+ EnumButterflyChromosome.TEMPERATURE_TOLERANCE,
+ EnumButterflyChromosome.HUMIDITY_TOLERANCE);
+ createAlleles(
+ EnumAllele.Flowers.class,
+ EnumBeeChromosome.FLOWER_PROVIDER,
+ EnumButterflyChromosome.FLOWER_PROVIDER);
+
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.speedNorm", get(EnumAllele.Speed.NORMAL));
+ }
+
+ if (PluginManager.Module.ARBORICULTURE.isEnabled()) {
+ createAlleles(EnumAllele.Height.class, EnumTreeChromosome.HEIGHT);
+ createAlleles(EnumAllele.Saplings.class, EnumTreeChromosome.FERTILITY);
+ createAlleles(EnumAllele.Yield.class, EnumTreeChromosome.YIELD);
+ createAlleles(EnumAllele.Fireproof.class, EnumTreeChromosome.FIREPROOF);
+ createAlleles(EnumAllele.Maturation.class, EnumTreeChromosome.MATURATION);
+ createAlleles(EnumAllele.Sappiness.class, EnumTreeChromosome.SAPPINESS);
+
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.heightMax10", get(EnumAllele.Height.AVERAGE));
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.saplingsDefault", get(EnumAllele.Saplings.AVERAGE));
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.saplingsDouble", get(EnumAllele.Saplings.HIGH));
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.saplingsTriple", get(EnumAllele.Saplings.HIGHER));
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.yieldDefault", get(EnumAllele.Yield.AVERAGE));
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.maturitySlowest", get(EnumAllele.Maturation.SLOWEST));
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.maturitySlower", get(EnumAllele.Maturation.SLOWER));
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.maturitySlow", get(EnumAllele.Maturation.SLOW));
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.maturityAverage", get(EnumAllele.Maturation.AVERAGE));
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.maturityFast", get(EnumAllele.Maturation.FAST));
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.maturityFaster", get(EnumAllele.Maturation.FASTER));
+ AlleleManager.alleleRegistry
+ .registerDeprecatedAlleleReplacement("forestry.maturityFastest", get(EnumAllele.Maturation.FASTEST));
+ }
+
+ if (PluginManager.Module.LEPIDOPTEROLOGY.isEnabled()) {
+ createAlleles(EnumAllele.Size.class, EnumButterflyChromosome.SIZE);
+ }
+
+ Map<Integer, IAlleleInteger> integers = new HashMap<>();
+ for (int i = 1; i <= 10; i++) {
+ IAlleleInteger alleleInteger = new AlleleInteger(modId, "i", i + "d", i, true);
+ AlleleManager.alleleRegistry.registerAllele(
+ alleleInteger,
+ EnumTreeChromosome.GIRTH,
+ EnumButterflyChromosome.METABOLISM,
+ EnumButterflyChromosome.FERTILITY);
+ integers.put(i, alleleInteger);
+ }
+ alleleMaps.put(Integer.class, integers);
+
+ Map<Boolean, IAlleleBoolean> booleans = new HashMap<>();
+ booleans.put(true, new AlleleBoolean(modId, "bool", true, false));
+ booleans.put(false, new AlleleBoolean(modId, "bool", false, false));
+ for (IAlleleBoolean alleleBoolean : booleans.values()) {
+ AlleleManager.alleleRegistry.registerAllele(
+ alleleBoolean,
+ EnumBeeChromosome.NOCTURNAL,
+ EnumBeeChromosome.TOLERANT_FLYER,
+ EnumBeeChromosome.CAVE_DWELLING,
+ EnumButterflyChromosome.NOCTURNAL,
+ EnumButterflyChromosome.TOLERANT_FLYER,
+ EnumButterflyChromosome.FIRE_RESIST);
+ }
+ alleleMaps.put(Boolean.class, booleans);
+ }
+
+ @SuppressWarnings("unchecked")
+ public static void initialisation() {
+ GT_AlleleHelper helper = new GT_AlleleHelper();
+
+ try {
+ helper.alleleMaps = (Map<Class<?>, Map<?, ? extends IAllele>>) FieldUtils
+ .readField(FieldUtils.getField(AlleleHelper.class, "alleleMaps", true), AlleleHelper.instance, true);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ AlleleHelper.instance = helper;
+ // AlleleHelper.instance.init();
+ }
+
+ @Override
+ public <T extends Enum<T> & IChromosomeType> void set(IAllele[] alleles, T chromosomeType, IAllele allele) {
+
+ if (allele == null) {
+ GT_Mod.GT_FML_LOGGER.info("Allele is null!");
+ return;
+ }
+
+ if (!chromosomeType.getAlleleClass()
+ .isInstance(allele)) {
+ GT_Mod.GT_FML_LOGGER.info("chromosomeType is not an instance of allele!" + allele.getName());
+ return;
+ }
+
+ // TODO: uncomment this once all addon mods are using the allele registration with IChromosomeType
+ // Collection<IChromosomeType> validTypes = AlleleManager.alleleRegistry.getChromosomeTypes(allele);
+ // if (validTypes.size() > 0 && !validTypes.contains(chromosomeType)) {
+ // throw new IllegalArgumentException("Allele can't be applied to this Chromosome type. Expected: " + validTypes
+ // + " Got: " + chromosomeType);
+ // }
+
+ alleles[chromosomeType.ordinal()] = allele;
+ }
+
+ @Override
+ public <T extends Enum<T> & IChromosomeType> void set(IAllele[] alleles, T chromosomeType, IAlleleValue value) {
+ set(alleles, chromosomeType, get(value));
+ }
+
+ @Override
+ public <T extends Enum<T> & IChromosomeType> void set(IAllele[] alleles, T chromosomeType, boolean value) {
+ set(alleles, chromosomeType, get(value));
+ }
+
+ @Override
+ public <T extends Enum<T> & IChromosomeType> void set(IAllele[] alleles, T chromosomeType, int value) {
+ set(alleles, chromosomeType, get(value));
+ }
+
+ private IAllele get(Object value) {
+ Class<?> valueClass = value.getClass();
+ Map<?, ? extends IAllele> map = alleleMaps.get(valueClass);
+ if (map == null) {
+ throw new IllegalArgumentException("There is no IAllele type for: " + valueClass + ' ' + value);
+ }
+ IAllele allele = map.get(value);
+ if (allele == null) {
+ allele = new IAllele() {
+
+ @Override
+ public String getUID() {
+ return "NOT_FOUND";
+ }
+
+ @Override
+ public boolean isDominant() {
+ return false;
+ }
+
+ @Override
+ public String getName() {
+ return "NOT_FOUND";
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return "NOT_FOUND";
+ }
+ };
+ }
+ return allele;
+ }
+
+ private <K extends Enum<K> & IAlleleValue<V>, V> void createAlleles(Class<K> enumClass, IChromosomeType... types) {
+ String category = enumClass.getSimpleName()
+ .toLowerCase(Locale.ENGLISH);
+ EnumMap<K, IAllele> map = new EnumMap<>(enumClass);
+ for (K enumValue : enumClass.getEnumConstants()) {
+ IAllele allele = createAllele(category, enumValue, types);
+ map.put(enumValue, allele);
+ }
+ alleleMaps.put(enumClass, map);
+ }
+
+ private static <K extends IAlleleValue<V>, V> IAllele createAllele(String category, K enumValue,
+ IChromosomeType... types) {
+ V value = enumValue.getValue();
+ boolean isDominant = enumValue.isDominant();
+ String name = enumValue.toString()
+ .toLowerCase(Locale.ENGLISH);
+
+ Class<?> valueClass = value.getClass();
+ if (Float.class.isAssignableFrom(valueClass)) {
+ return AlleleManager.alleleFactory.createFloat(modId, category, name, (Float) value, isDominant, types);
+ } else if (Integer.class.isAssignableFrom(valueClass)) {
+ return AlleleManager.alleleFactory.createInteger(modId, category, name, (Integer) value, isDominant, types);
+ } else if (IVect.class.isAssignableFrom(valueClass)) {
+ IVect area = (IVect) value;
+ return AlleleManager.alleleFactory
+ .createArea(modId, category, name, area.getX(), area.getY(), area.getZ(), isDominant, types);
+ } else if (Boolean.class.isAssignableFrom(valueClass)) {
+ return AlleleManager.alleleFactory.createBoolean(modId, category, (Boolean) value, isDominant, types);
+ } else if (EnumTolerance.class.isAssignableFrom(valueClass)) {
+ IAlleleTolerance alleleTolerance = new AlleleTolerance(
+ modId,
+ category,
+ name,
+ (EnumTolerance) value,
+ isDominant);
+ AlleleManager.alleleRegistry.registerAllele(alleleTolerance, types);
+ return alleleTolerance;
+ } else if (FlowerProvider.class.isAssignableFrom(valueClass)) {
+ return AlleleManager.alleleFactory
+ .createFlowers(modId, category, name, (FlowerProvider) value, isDominant, types);
+ }
+ throw new RuntimeException("could not create allele for category: " + category + " and value " + valueClass);
+ }
+}
diff --git a/src/main/java/gregtech/common/bees/GT_Bee_Mutation.java b/src/main/java/gregtech/common/bees/GT_Bee_Mutation.java
new file mode 100644
index 0000000000..e8b2d5b8c6
--- /dev/null
+++ b/src/main/java/gregtech/common/bees/GT_Bee_Mutation.java
@@ -0,0 +1,85 @@
+package gregtech.common.bees;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.IAlleleBeeSpecies;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeHousing;
+import forestry.api.apiculture.IBeeModifier;
+import forestry.api.core.IClimateProvider;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IGenome;
+import forestry.api.genetics.IMutationCondition;
+import forestry.apiculture.genetics.BeeMutation;
+import forestry.core.genetics.mutations.Mutation;
+
+public class GT_Bee_Mutation extends BeeMutation {
+
+ private final float split;
+
+ public GT_Bee_Mutation(IAlleleBeeSpecies bee0, IAlleleBeeSpecies bee1, IAllele[] result, int chance, float split) {
+ super(bee0, bee1, result, chance);
+ this.split = split;
+ BeeManager.beeRoot.registerMutation(this);
+ }
+
+ @Override
+ public float getBaseChance() {
+ return super.getBaseChance() / split;
+ }
+
+ @Override
+ public float getChance(IBeeHousing housing, IAlleleBeeSpecies allele0, IAlleleBeeSpecies allele1,
+ IBeeGenome genome0, IBeeGenome genome1) {
+ World world = housing != null ? housing.getWorld() : null;
+ ChunkCoordinates housingCoordinates = housing != null ? housing.getCoordinates() : null;
+ int x = housingCoordinates != null ? housingCoordinates.posX : 0;
+ int y = housingCoordinates != null ? housingCoordinates.posY : 0;
+ int z = housingCoordinates != null ? housingCoordinates.posZ : 0;
+
+ float processedChance = getBasicChance(world, x, y, z, allele0, allele1, genome0, genome1, housing);
+
+ if (processedChance <= 0f) {
+ return 0f;
+ }
+
+ IBeeModifier beeHousingModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
+ IBeeModifier beeModeModifier = BeeManager.beeRoot.getBeekeepingMode(world)
+ .getBeeModifier();
+
+ processedChance *= beeHousingModifier.getMutationModifier(genome0, genome1, processedChance);
+ processedChance *= beeModeModifier.getMutationModifier(genome0, genome1, processedChance);
+
+ return processedChance;
+ }
+
+ @SuppressWarnings("unchecked")
+ private float getBasicChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
+ IGenome genome1, IClimateProvider climate) {
+ float mutationChance = this.getBaseChance();
+ List<IMutationCondition> mutationConditions = null;
+ Field f = FieldUtils.getDeclaredField(Mutation.class, "mutationConditions", true);
+ if (f == null) f = FieldUtils.getField(Mutation.class, "mutationConditions", true);
+ if (f == null) return mutationChance;
+ try {
+ mutationConditions = f.get(this) instanceof List ? (List<IMutationCondition>) f.get(this) : null;
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ if (mutationConditions != null) for (IMutationCondition mutationCondition : mutationConditions) {
+ mutationChance *= mutationCondition.getChance(world, x, y, z, allele0, allele1, genome0, genome1, climate);
+ if (mutationChance == 0) {
+ return 0;
+ }
+ }
+ return mutationChance;
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings1.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings1.java
new file mode 100644
index 0000000000..897011eba9
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Casings1.java
@@ -0,0 +1,108 @@
+package gregtech.common.blocks;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Block_Casings1 extends GT_Block_Casings_Abstract {
+
+ /**
+ * Texture Index Information Textures.BlockIcons.casingTexturePages[0][0-63] - Gregtech
+ * Textures.BlockIcons.casingTexturePages[0][64-127] - GT++ Textures.BlockIcons.casingTexturePages[1][0-127] -
+ * Gregtech Textures.BlockIcons.casingTexturePages[2][0-127] - Free Textures.BlockIcons.casingTexturePages[3][0-127]
+ * - Free Textures.BlockIcons.casingTexturePages[4][0-127] - Free Textures.BlockIcons.casingTexturePages[5][0-127] -
+ * Free Textures.BlockIcons.casingTexturePages[6][0-127] - Free Textures.BlockIcons.casingTexturePages[7][0-127] -
+ * TecTech Textures.BlockIcons.casingTexturePages[8][0-127] - TecTech
+ */
+ public GT_Block_Casings1() {
+ super(GT_Item_Casings1.class, "gt.blockcasings", GT_Material_Casings.INSTANCE, 16);
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "ULV Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "LV Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "MV Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "HV Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "EV Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "IV Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "LuV Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "ZPM Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "UV Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "UHV Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Bronze Plated Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Heat Proof Machine Casing");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".12.name", "Dimensionally Transcendent Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Dimensional Injection Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Dimensional Bridge");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Superconducting Coil Block");
+ ItemList.Casing_ULV.set(new ItemStack(this, 1, 0));
+ ItemList.Casing_LV.set(new ItemStack(this, 1, 1));
+ ItemList.Casing_MV.set(new ItemStack(this, 1, 2));
+ ItemList.Casing_HV.set(new ItemStack(this, 1, 3));
+ ItemList.Casing_EV.set(new ItemStack(this, 1, 4));
+ ItemList.Casing_IV.set(new ItemStack(this, 1, 5));
+ ItemList.Casing_LuV.set(new ItemStack(this, 1, 6));
+ ItemList.Casing_ZPM.set(new ItemStack(this, 1, 7));
+ ItemList.Casing_UV.set(new ItemStack(this, 1, 8));
+ ItemList.Casing_MAX.set(new ItemStack(this, 1, 9));
+ ItemList.Casing_BronzePlatedBricks.set(new ItemStack(this, 1, 10));
+ ItemList.Casing_HeatProof.set(new ItemStack(this, 1, 11));
+ ItemList.Casing_Dim_Trans.set(new ItemStack(this, 1, 12));
+ ItemList.Casing_Dim_Injector.set(new ItemStack(this, 1, 13));
+ ItemList.Casing_Dim_Bridge.set(new ItemStack(this, 1, 14));
+ ItemList.Casing_Coil_Superconductor.set(new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ public int getTextureIndex(int aMeta) {
+ return aMeta;
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ switch (aMeta) {
+ case 10 -> {
+ return Textures.BlockIcons.MACHINE_BRONZEPLATEDBRICKS.getIcon();
+ }
+ case 11 -> {
+ return Textures.BlockIcons.MACHINE_HEATPROOFCASING.getIcon();
+ }
+ case 12 -> {
+ return Textures.BlockIcons.MACHINE_DIM_TRANS_CASING.getIcon();
+ }
+ case 13 -> {
+ return Textures.BlockIcons.MACHINE_DIM_INJECTOR.getIcon();
+ }
+ case 14 -> {
+ return Textures.BlockIcons.MACHINE_DIM_BRIDGE.getIcon();
+ }
+ case 15 -> {
+ return Textures.BlockIcons.MACHINE_COIL_SUPERCONDUCTOR.getIcon();
+ }
+ }
+ if (ordinalSide == 0) {
+ return Textures.BlockIcons.MACHINECASINGS_BOTTOM[aMeta].getIcon();
+ }
+ if (ordinalSide == 1) {
+ return Textures.BlockIcons.MACHINECASINGS_TOP[aMeta].getIcon();
+ }
+ return Textures.BlockIcons.MACHINECASINGS_SIDE[aMeta].getIcon();
+ }
+ return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ }
+
+ @Override
+ public int colorMultiplier(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlockMetadata(aX, aY, aZ) > 9 ? super.colorMultiplier(aWorld, aX, aY, aZ)
+ : gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[0] << 16 | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[1] << 8
+ | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[2];
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings2.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings2.java
new file mode 100644
index 0000000000..f1fbc30236
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Casings2.java
@@ -0,0 +1,102 @@
+package gregtech.common.blocks;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_LanguageManager;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Block_Casings2 extends GT_Block_Casings_Abstract {
+
+ public GT_Block_Casings2() {
+ super(GT_Item_Casings2.class, "gt.blockcasings2", GT_Material_Casings.INSTANCE, 96);
+ // Special handler for Pyrolyse Oven Casing on hatches...
+ Textures.BlockIcons.casingTexturePages[0][22] = TextureFactory.of(
+ Block.getBlockFromItem(
+ ItemList.Casing_ULV.get(1)
+ .getItem()),
+ 0,
+ ForgeDirection.UNKNOWN,
+ Dyes.MACHINE_METAL.mRGBa);
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Solid Steel Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Frost Proof Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Bronze Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Steel Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Titanium Gear Box Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Assembling Line Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Processor Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Data Drive Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Containment Field Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Assembler Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Pump Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Motor Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Bronze Pipe Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Steel Pipe Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Titanium Pipe Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Tungstensteel Pipe Casing");
+ ItemList.Casing_SolidSteel.set(new ItemStack(this, 1, 0));
+ ItemList.Casing_FrostProof.set(new ItemStack(this, 1, 1));
+ ItemList.Casing_Gearbox_Bronze.set(new ItemStack(this, 1, 2));
+ ItemList.Casing_Gearbox_Steel.set(new ItemStack(this, 1, 3));
+ ItemList.Casing_Gearbox_Titanium.set(new ItemStack(this, 1, 4));
+ ItemList.Casing_Gearbox_TungstenSteel.set(new ItemStack(this, 1, 5));
+ ItemList.Casing_Processor.set(new ItemStack(this, 1, 6));
+ ItemList.Casing_DataDrive.set(new ItemStack(this, 1, 7));
+ ItemList.Casing_ContainmentField.set(new ItemStack(this, 1, 8));
+ ItemList.Casing_Assembler.set(new ItemStack(this, 1, 9));
+ ItemList.Casing_Pump.set(new ItemStack(this, 1, 10));
+ ItemList.Casing_Motor.set(new ItemStack(this, 1, 11));
+ ItemList.Casing_Pipe_Bronze.set(new ItemStack(this, 1, 12));
+ ItemList.Casing_Pipe_Steel.set(new ItemStack(this, 1, 13));
+ ItemList.Casing_Pipe_Titanium.set(new ItemStack(this, 1, 14));
+ ItemList.Casing_Pipe_TungstenSteel.set(new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ public int getTextureIndex(int aMeta) {
+ return aMeta == 6 ? ((1 << 7) + 96) : aMeta + 16;
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return switch (aMeta) {
+ case 0 -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ case 1 -> Textures.BlockIcons.MACHINE_CASING_FROST_PROOF.getIcon();
+ case 2 -> Textures.BlockIcons.MACHINE_CASING_GEARBOX_BRONZE.getIcon();
+ case 3 -> Textures.BlockIcons.MACHINE_CASING_GEARBOX_STEEL.getIcon();
+ case 4 -> Textures.BlockIcons.MACHINE_CASING_GEARBOX_TITANIUM.getIcon();
+ case 5 -> Textures.BlockIcons.MACHINE_CASING_GEARBOX_TUNGSTENSTEEL.getIcon();
+ case 6 -> Textures.BlockIcons.MACHINE_CASING_PROCESSOR.getIcon();
+ case 7 -> Textures.BlockIcons.MACHINE_CASING_DATA_DRIVE.getIcon();
+ case 8 -> Textures.BlockIcons.MACHINE_CASING_CONTAINMENT_FIELD.getIcon();
+ case 9 -> Textures.BlockIcons.MACHINE_CASING_ASSEMBLER.getIcon();
+ case 10 -> Textures.BlockIcons.MACHINE_CASING_PUMP.getIcon();
+ case 11 -> Textures.BlockIcons.MACHINE_CASING_MOTOR.getIcon();
+ case 12 -> Textures.BlockIcons.MACHINE_CASING_PIPE_BRONZE.getIcon();
+ case 13 -> Textures.BlockIcons.MACHINE_CASING_PIPE_STEEL.getIcon();
+ case 14 -> Textures.BlockIcons.MACHINE_CASING_PIPE_TITANIUM.getIcon();
+ case 15 -> Textures.BlockIcons.MACHINE_CASING_PIPE_TUNGSTENSTEEL.getIcon();
+ default -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ };
+ }
+
+ @Override
+ public float getExplosionResistance(Entity aTNT, World aWorld, int aX, int aY, int aZ, double eX, double eY,
+ double eZ) {
+ return aWorld.getBlockMetadata(aX, aY, aZ) == 8 ? Blocks.bedrock.getExplosionResistance(aTNT)
+ : super.getExplosionResistance(aTNT, aWorld, aX, aY, aZ, eX, eY, eZ);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings3.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings3.java
new file mode 100644
index 0000000000..ada77814c8
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Casings3.java
@@ -0,0 +1,82 @@
+package gregtech.common.blocks;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Block_Casings3 extends GT_Block_Casings_Abstract {
+
+ public GT_Block_Casings3() {
+ super(GT_Item_Casings3.class, "gt.blockcasings3", GT_Material_Casings.INSTANCE, 16);
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Yellow Stripes Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Yellow Stripes Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Radioactive Hazard Sign Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Bio Hazard Sign Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Explosion Hazard Sign Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Fire Hazard Sign Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Acid Hazard Sign Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Magic Hazard Sign Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Frost Hazard Sign Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Noise Hazard Sign Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Grate Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Filter Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Radiation Proof Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Bronze Firebox Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Steel Firebox Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Tungstensteel Firebox Casing");
+ ItemList.Casing_Stripes_A.set(new ItemStack(this, 1, 0));
+ ItemList.Casing_Stripes_B.set(new ItemStack(this, 1, 1));
+ ItemList.Casing_RadioactiveHazard.set(new ItemStack(this, 1, 2));
+ ItemList.Casing_BioHazard.set(new ItemStack(this, 1, 3));
+ ItemList.Casing_ExplosionHazard.set(new ItemStack(this, 1, 4));
+ ItemList.Casing_FireHazard.set(new ItemStack(this, 1, 5));
+ ItemList.Casing_AcidHazard.set(new ItemStack(this, 1, 6));
+ ItemList.Casing_MagicHazard.set(new ItemStack(this, 1, 7));
+ ItemList.Casing_FrostHazard.set(new ItemStack(this, 1, 8));
+ ItemList.Casing_NoiseHazard.set(new ItemStack(this, 1, 9));
+ ItemList.Casing_Grate.set(new ItemStack(this, 1, 10));
+ ItemList.Casing_Vent.set(new ItemStack(this, 1, 11));
+ ItemList.Casing_RadiationProof.set(new ItemStack(this, 1, 12));
+ ItemList.Casing_Firebox_Bronze.set(new ItemStack(this, 1, 13));
+ ItemList.Casing_Firebox_Steel.set(new ItemStack(this, 1, 14));
+ ItemList.Casing_Firebox_TungstenSteel.set(new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ public int getTextureIndex(int aMeta) {
+ return aMeta + 32;
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return switch (aMeta) {
+ case 0 -> Textures.BlockIcons.MACHINE_CASING_STRIPES_A.getIcon();
+ case 1 -> Textures.BlockIcons.MACHINE_CASING_STRIPES_B.getIcon();
+ case 2 -> Textures.BlockIcons.MACHINE_CASING_RADIOACTIVEHAZARD.getIcon();
+ case 3 -> Textures.BlockIcons.MACHINE_CASING_BIOHAZARD.getIcon();
+ case 4 -> Textures.BlockIcons.MACHINE_CASING_EXPLOSIONHAZARD.getIcon();
+ case 5 -> Textures.BlockIcons.MACHINE_CASING_FIREHAZARD.getIcon();
+ case 6 -> Textures.BlockIcons.MACHINE_CASING_ACIDHAZARD.getIcon();
+ case 7 -> Textures.BlockIcons.MACHINE_CASING_MAGICHAZARD.getIcon();
+ case 8 -> Textures.BlockIcons.MACHINE_CASING_FROSTHAZARD.getIcon();
+ case 9 -> Textures.BlockIcons.MACHINE_CASING_NOISEHAZARD.getIcon();
+ case 10 -> Textures.BlockIcons.MACHINE_CASING_GRATE.getIcon();
+ case 11 -> Textures.BlockIcons.MACHINE_CASING_VENT.getIcon();
+ case 12 -> Textures.BlockIcons.MACHINE_CASING_RADIATIONPROOF.getIcon();
+ case 13 -> ordinalSide > 1 ? Textures.BlockIcons.MACHINE_CASING_FIREBOX_BRONZE.getIcon()
+ : Textures.BlockIcons.MACHINE_BRONZEPLATEDBRICKS.getIcon();
+ case 14 -> ordinalSide > 1 ? Textures.BlockIcons.MACHINE_CASING_FIREBOX_STEEL.getIcon()
+ : Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ case 15 -> ordinalSide > 1 ? Textures.BlockIcons.MACHINE_CASING_FIREBOX_TUNGSTENSTEEL.getIcon()
+ : Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon();
+ default -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ };
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings4.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings4.java
new file mode 100644
index 0000000000..49c9c6c992
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Casings4.java
@@ -0,0 +1,250 @@
+package gregtech.common.blocks;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_RenderingWorld;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Block_Casings4 extends GT_Block_Casings_Abstract {
+
+ /**
+ * This mapping is used to look up which texture should be used to render the connected texture for fusion casings.
+ * <p>
+ * This mapping is computed from that giant if ladder from #getIcon in commit
+ * da3421547afadc49938b5b6a7f9a9679afa1d570 The exact meaning of these numbers are like black magic. Read the
+ * original getIcon implementation to understand why it is 0, 1, etc, if that if ladder is even intelligible.
+ */
+ private static final int[][] mapping = new int[][] {
+ { 7, 7, 7, 7, 0, 7, 0, 7, 1, 7, 1, 7, 8, 7, 8, 7, 0, 7, 0, 7, 0, 7, 0, 7, 9, 7, 9, 7, 3, 7, 3, 7, 1, 7, 1, 7,
+ 11, 7, 11, 7, 1, 7, 1, 7, 2, 7, 2, 7, 10, 7, 10, 7, 5, 7, 5, 7, 4, 7, 4, 7, 6, 7, 6, 7 },
+ { 7, 7, 7, 7, 0, 0, 7, 7, 1, 1, 7, 7, 8, 8, 7, 7, 0, 0, 7, 7, 0, 0, 7, 7, 9, 9, 7, 7, 3, 3, 7, 7, 1, 1, 7, 7,
+ 11, 11, 7, 7, 1, 1, 7, 7, 2, 2, 7, 7, 10, 10, 7, 7, 5, 5, 7, 7, 4, 4, 7, 7, 6, 6, 7, 7 },
+ { 7, 1, 1, 1, 0, 9, 10, 4, 7, 1, 1, 1, 0, 9, 10, 4, 0, 8, 11, 2, 0, 3, 5, 6, 0, 8, 11, 2, 0, 3, 5, 6, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 },
+ { 7, 1, 1, 1, 0, 8, 11, 2, 7, 7, 7, 7, 7, 7, 7, 7, 0, 9, 10, 4, 0, 3, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1,
+ 0, 8, 11, 2, 7, 7, 7, 7, 7, 7, 7, 7, 0, 9, 10, 4, 0, 3, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7 },
+ { 7, 1, 1, 1, 7, 1, 1, 1, 0, 8, 11, 2, 0, 8, 11, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 9, 10, 4,
+ 0, 9, 10, 4, 0, 3, 5, 6, 0, 3, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 },
+ { 7, 1, 1, 1, 7, 7, 7, 7, 0, 9, 10, 4, 7, 7, 7, 7, 7, 1, 1, 1, 7, 7, 7, 7, 0, 9, 10, 4, 7, 7, 7, 7, 0, 8, 11, 2,
+ 7, 7, 7, 7, 0, 3, 5, 6, 7, 7, 7, 7, 0, 8, 11, 2, 7, 7, 7, 7, 0, 3, 5, 6, 7, 7, 7, 7 }, };
+
+ public static boolean mConnectedMachineTextures = true;
+
+ public GT_Block_Casings4() {
+ super(GT_Item_Casings4.class, "gt.blockcasings4", GT_Material_Casings.INSTANCE, 16);
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".0.name", "Robust Tungstensteel Machine Casing");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".1.name", "Clean Stainless Steel Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Stable Titanium Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Titanium Firebox Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Fusion Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Fusion Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Fusion Machine Casing MK II");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Turbine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Stainless Steel Turbine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Titanium Turbine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Tungstensteel Turbine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Engine Intake Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Mining Osmiridium Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Firebricks");
+
+ ItemList.Casing_RobustTungstenSteel.set(new ItemStack(this, 1, 0));
+ ItemList.Casing_CleanStainlessSteel.set(new ItemStack(this, 1, 1));
+ ItemList.Casing_StableTitanium.set(new ItemStack(this, 1, 2));
+ ItemList.Casing_Firebox_Titanium.set(new ItemStack(this, 1, 3));
+ ItemList.Casing_Fusion.set(new ItemStack(this, 1, 6));
+ ItemList.Casing_Fusion_Coil.set(new ItemStack(this, 1, 7));
+ ItemList.Casing_Fusion2.set(new ItemStack(this, 1, 8));
+ ItemList.Casing_Turbine.set(new ItemStack(this, 1, 9));
+ ItemList.Casing_Turbine1.set(new ItemStack(this, 1, 10));
+ ItemList.Casing_Turbine2.set(new ItemStack(this, 1, 11));
+ ItemList.Casing_Turbine3.set(new ItemStack(this, 1, 12));
+ ItemList.Casing_EngineIntake.set(new ItemStack(this, 1, 13));
+ ItemList.Casing_MiningOsmiridium.set(new ItemStack(this, 1, 14));
+ ItemList.Casing_Firebricks.set(new ItemStack(this, 1, 15));
+
+ GT_Mod.gregtechproxy.mCTMBlockCache.put(this, (byte) 6, true);
+ GT_Mod.gregtechproxy.mCTMBlockCache.put(this, (byte) 8, true);
+ }
+
+ @Override
+ public int getTextureIndex(int aMeta) {
+ return aMeta + 48;
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return switch (aMeta) {
+ case 0, 12 -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon();
+ case 1, 10 -> Textures.BlockIcons.MACHINE_CASING_CLEAN_STAINLESSSTEEL.getIcon();
+ case 2, 11 -> Textures.BlockIcons.MACHINE_CASING_STABLE_TITANIUM.getIcon();
+ case 3 -> ordinalSide > 1 ? Textures.BlockIcons.MACHINE_CASING_FIREBOX_TITANIUM.getIcon()
+ : Textures.BlockIcons.MACHINE_CASING_STABLE_TITANIUM.getIcon();
+ case 4 ->
+ // Do not overwrite!
+ Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW.getIcon();
+ case 5 ->
+ // Do not overwrite!
+ Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS.getIcon();
+ case 6 -> Textures.BlockIcons.MACHINE_CASING_FUSION.getIcon();
+ case 7 -> Textures.BlockIcons.MACHINE_CASING_FUSION_COIL.getIcon();
+ case 8 -> Textures.BlockIcons.MACHINE_CASING_FUSION_2.getIcon();
+ case 9 -> Textures.BlockIcons.MACHINE_CASING_TURBINE.getIcon();
+ case 13 -> Textures.BlockIcons.MACHINE_CASING_ENGINE_INTAKE.getIcon();
+ case 14 -> Textures.BlockIcons.MACHINE_CASING_MINING_OSMIRIDIUM.getIcon();
+ case 15 -> Textures.BlockIcons.MACHINE_CASING_DENSEBRICKS.getIcon();
+ default -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ };
+ }
+
+ @Deprecated
+ public IIcon getTurbineCasing(int meta, int iconIndex, boolean active) {
+ return switch (meta) {
+ case 10 -> active ? Textures.BlockIcons.TURBINE_ACTIVE1[iconIndex].getIcon()
+ : Textures.BlockIcons.TURBINE1[iconIndex].getIcon();
+ case 11 -> active ? Textures.BlockIcons.TURBINE_ACTIVE2[iconIndex].getIcon()
+ : Textures.BlockIcons.TURBINE2[iconIndex].getIcon();
+ case 12 -> active ? Textures.BlockIcons.TURBINE_ACTIVE3[iconIndex].getIcon()
+ : Textures.BlockIcons.TURBINE3[iconIndex].getIcon();
+ default -> active ? Textures.BlockIcons.TURBINE_ACTIVE[iconIndex].getIcon()
+ : Textures.BlockIcons.TURBINE[iconIndex].getIcon();
+ };
+ }
+
+ @Deprecated
+ public IIcon getTurbineCasing(int meta, int iconIndex, boolean active, boolean hasTurbine) {
+ return switch (meta) {
+ case 10 -> active ? Textures.BlockIcons.TURBINE_ACTIVE1[iconIndex].getIcon()
+ : hasTurbine ? Textures.BlockIcons.TURBINE1[iconIndex].getIcon()
+ : Textures.BlockIcons.TURBINE_EMPTY1[iconIndex].getIcon();
+ case 11 -> active ? Textures.BlockIcons.TURBINE_ACTIVE2[iconIndex].getIcon()
+ : hasTurbine ? Textures.BlockIcons.TURBINE2[iconIndex].getIcon()
+ : Textures.BlockIcons.TURBINE_EMPTY2[iconIndex].getIcon();
+ case 12 -> active ? Textures.BlockIcons.TURBINE_ACTIVE3[iconIndex].getIcon()
+ : hasTurbine ? Textures.BlockIcons.TURBINE3[iconIndex].getIcon()
+ : Textures.BlockIcons.TURBINE_EMPTY3[iconIndex].getIcon();
+ default -> active ? Textures.BlockIcons.TURBINE_ACTIVE[iconIndex].getIcon()
+ : hasTurbine ? Textures.BlockIcons.TURBINE[iconIndex].getIcon()
+ : Textures.BlockIcons.TURBINE_EMPTY[iconIndex].getIcon();
+ };
+ }
+
+ private static int isTurbineControllerWithSide(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (!(tTileEntity instanceof IGregTechTileEntity tTile)) return 0;
+ if (tTile.getMetaTileEntity() instanceof GT_MetaTileEntity_LargeTurbine turbine && tTile.getFrontFacing()
+ .ordinal() == ordinalSide) {
+ if (turbine.isNewStyleRendering()) return 0;
+ if (tTile.isActive()) return 1;
+ return turbine.hasTurbine() ? 2 : 3;
+ }
+ return 0;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) {
+ aWorld = GT_RenderingWorld.getInstance(aWorld);
+ int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ if (tMeta != 6 && tMeta != 8 && tMeta != 9 && tMeta != 10 && tMeta != 11 && tMeta != 12
+ || !mConnectedMachineTextures) {
+ return getIcon(ordinalSide, tMeta);
+ }
+ // noinspection ConstantValue // tMeta < 13 should stay because mConnectedMachineTextures can be changed
+ if (tMeta > 8 && tMeta < 13) {
+ int tInvertLeftRightMod = ordinalSide % 2 * 2 - 1;
+ switch (ordinalSide / 2) {
+ case 0 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ int tState;
+ if ((tState = isTurbineControllerWithSide(
+ aWorld,
+ xCoord + j,
+ yCoord,
+ zCoord + i,
+ ordinalSide)) != 0) {
+ return getTurbineCasing(tMeta, 4 - i * 3 - j, tState == 1, tState == 2);
+ }
+ }
+ }
+ }
+ case 1 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ int tState;
+ if ((tState = isTurbineControllerWithSide(
+ aWorld,
+ xCoord + j,
+ yCoord + i,
+ zCoord,
+ ordinalSide)) != 0) {
+ return getTurbineCasing(
+ tMeta,
+ 4 + i * 3 - j * tInvertLeftRightMod,
+ tState == 1,
+ tState == 2);
+ }
+ }
+ }
+ }
+ case 2 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ int tState;
+ if ((tState = isTurbineControllerWithSide(
+ aWorld,
+ xCoord,
+ yCoord + i,
+ zCoord + j,
+ ordinalSide)) != 0) {
+ return getTurbineCasing(
+ tMeta,
+ 4 + i * 3 + j * tInvertLeftRightMod,
+ tState == 1,
+ tState == 2);
+ }
+ }
+ }
+ }
+ }
+ return switch (tMeta) {
+ case 10 -> Textures.BlockIcons.MACHINE_CASING_CLEAN_STAINLESSSTEEL.getIcon();
+ case 11 -> Textures.BlockIcons.MACHINE_CASING_STABLE_TITANIUM.getIcon();
+ case 12 -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon();
+ default -> Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ };
+ }
+ int tStartIndex = tMeta == 6 ? 1 : 13;
+ int tIndexIntoMapping = 0;
+ if (isSameBlock(aWorld, xCoord, yCoord - 1, zCoord, tMeta)) tIndexIntoMapping |= 1;
+ if (isSameBlock(aWorld, xCoord, yCoord + 1, zCoord, tMeta)) tIndexIntoMapping |= 1 << 1;
+ if (isSameBlock(aWorld, xCoord + 1, yCoord, zCoord, tMeta)) tIndexIntoMapping |= 1 << 2;
+ if (isSameBlock(aWorld, xCoord, yCoord, zCoord + 1, tMeta)) tIndexIntoMapping |= 1 << 3;
+ if (isSameBlock(aWorld, xCoord - 1, yCoord, zCoord, tMeta)) tIndexIntoMapping |= 1 << 4;
+ if (isSameBlock(aWorld, xCoord, yCoord, zCoord - 1, tMeta)) tIndexIntoMapping |= 1 << 5;
+ return Textures.BlockIcons.CONNECTED_HULLS[tStartIndex + mapping[ordinalSide][tIndexIntoMapping]].getIcon();
+ }
+
+ private boolean isSameBlock(IBlockAccess aWorld, int aX, int aY, int aZ, int aMeta) {
+ return aWorld.getBlock(aX, aY, aZ) == this && aWorld.getBlockMetadata(aX, aY, aZ) == aMeta;
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings5.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings5.java
new file mode 100644
index 0000000000..3a9efdbe71
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Casings5.java
@@ -0,0 +1,159 @@
+package gregtech.common.blocks;
+
+import static gregtech.api.enums.HeatingCoilLevel.EV;
+import static gregtech.api.enums.HeatingCoilLevel.HV;
+import static gregtech.api.enums.HeatingCoilLevel.IV;
+import static gregtech.api.enums.HeatingCoilLevel.LV;
+import static gregtech.api.enums.HeatingCoilLevel.LuV;
+import static gregtech.api.enums.HeatingCoilLevel.MAX;
+import static gregtech.api.enums.HeatingCoilLevel.MV;
+import static gregtech.api.enums.HeatingCoilLevel.None;
+import static gregtech.api.enums.HeatingCoilLevel.UEV;
+import static gregtech.api.enums.HeatingCoilLevel.UHV;
+import static gregtech.api.enums.HeatingCoilLevel.UIV;
+import static gregtech.api.enums.HeatingCoilLevel.UMV;
+import static gregtech.api.enums.HeatingCoilLevel.UV;
+import static gregtech.api.enums.HeatingCoilLevel.UXV;
+import static gregtech.api.enums.HeatingCoilLevel.ZPM;
+
+import java.util.function.Consumer;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IHeatingCoil;
+import gregtech.api.util.GT_LanguageManager;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Block_Casings5 extends GT_Block_Casings_Abstract implements IHeatingCoil {
+
+ public GT_Block_Casings5() {
+ super(GT_Item_Casings5.class, "gt.blockcasings5", GT_Material_Casings.INSTANCE, 16);
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Cupronickel Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Kanthal Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Nichrome Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "TPV-Alloy Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "HSS-G Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Naquadah Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Naquadah Alloy Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Electrum Flux Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Awakened Draconium Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "HSS-S Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Trinium Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Infinity Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Hypogen Coil Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Eternal Coil Block");
+
+ ItemList.Casing_Coil_Cupronickel.set(new ItemStack(this, 1, 0));
+ ItemList.Casing_Coil_Kanthal.set(new ItemStack(this, 1, 1));
+ ItemList.Casing_Coil_Nichrome.set(new ItemStack(this, 1, 2));
+ ItemList.Casing_Coil_TungstenSteel.set(new ItemStack(this, 1, 3));
+ ItemList.Casing_Coil_HSSG.set(new ItemStack(this, 1, 4));
+ ItemList.Casing_Coil_Naquadah.set(new ItemStack(this, 1, 5));
+ ItemList.Casing_Coil_NaquadahAlloy.set(new ItemStack(this, 1, 6));
+ ItemList.Casing_Coil_ElectrumFlux.set(new ItemStack(this, 1, 7));
+ ItemList.Casing_Coil_AwakenedDraconium.set(new ItemStack(this, 1, 8));
+ ItemList.Casing_Coil_HSSS.set(new ItemStack(this, 1, 9));
+ ItemList.Casing_Coil_Trinium.set(new ItemStack(this, 1, 10));
+ ItemList.Casing_Coil_Infinity.set(new ItemStack(this, 1, 11));
+ ItemList.Casing_Coil_Hypogen.set(new ItemStack(this, 1, 12));
+ ItemList.Casing_Coil_Eternal.set(new ItemStack(this, 1, 13));
+ }
+
+ @Override
+ public int getTextureIndex(int aMeta) {
+ return (1 << 7) | aMeta;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return switch (aMeta) {
+ case 0 -> Textures.BlockIcons.MACHINE_COIL_CUPRONICKEL.getIcon();
+ case 1 -> Textures.BlockIcons.MACHINE_COIL_KANTHAL.getIcon();
+ case 2 -> Textures.BlockIcons.MACHINE_COIL_NICHROME.getIcon();
+ case 3 -> Textures.BlockIcons.MACHINE_COIL_TUNGSTENSTEEL.getIcon();
+ case 4 -> Textures.BlockIcons.MACHINE_COIL_HSSG.getIcon();
+ case 5 -> Textures.BlockIcons.MACHINE_COIL_NAQUADAH.getIcon();
+ case 6 -> Textures.BlockIcons.MACHINE_COIL_NAQUADAHALLOY.getIcon();
+ case 7 -> Textures.BlockIcons.MACHINE_COIL_ELECTRUMFLUX.getIcon();
+ case 8 -> Textures.BlockIcons.MACHINE_COIL_AWAKENEDDRACONIUM.getIcon();
+ case 9 -> Textures.BlockIcons.MACHINE_COIL_HSSS.getIcon();
+ case 10 -> Textures.BlockIcons.MACHINE_COIL_TRINIUM.getIcon();
+ case 11 -> Textures.BlockIcons.MACHINE_COIL_INFINITY.getIcon();
+ case 12 -> Textures.BlockIcons.MACHINE_COIL_HYPOGEN.getIcon();
+ case 13 -> Textures.BlockIcons.MACHINE_COIL_ETERNAL.getIcon();
+ default -> Textures.BlockIcons.MACHINE_COIL_CUPRONICKEL.getIcon();
+ };
+ }
+
+ /*--------------- COIL CHECK IMPL. ------------*/
+
+ public static HeatingCoilLevel getCoilHeatFromDamage(int meta) {
+ return switch (meta) {
+ case 0 -> LV;
+ case 1 -> MV;
+ case 2 -> HV;
+ case 3 -> EV;
+ case 4 -> IV;
+ case 5 -> ZPM;
+ case 6 -> UV;
+ case 7 -> UEV;
+ case 8 -> UIV;
+ case 9 -> LuV;
+ case 10 -> UHV;
+ case 11 -> UMV;
+ case 12 -> UXV;
+ case 13 -> MAX;
+ default -> None;
+ };
+ }
+
+ public static int getMetaFromCoilHeat(HeatingCoilLevel level) {
+ return switch (level) {
+ case LV -> 0;
+ case MV -> 1;
+ case HV -> 2;
+ case EV -> 3;
+ case IV -> 4;
+ case ZPM -> 5;
+ case UV -> 6;
+ case UEV -> 7;
+ case UIV -> 8;
+ case LuV -> 9;
+ case UHV -> 10;
+ case UMV -> 11;
+ case UXV -> 12;
+ case MAX -> 13;
+ default -> 0;
+ };
+ }
+
+ @Override
+ public HeatingCoilLevel getCoilHeat(int meta) {
+ getOnCoilCheck().accept(this);
+ return getCoilHeatFromDamage(meta);
+ }
+
+ /*--------------- CALLBACK ------------*/
+
+ private Consumer<IHeatingCoil> callback = coil -> {};
+
+ @Override
+ public void setOnCoilCheck(Consumer<IHeatingCoil> callback) {
+ this.callback = callback;
+ }
+
+ @Override
+ public Consumer<IHeatingCoil> getOnCoilCheck() {
+ return this.callback;
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings6.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings6.java
new file mode 100644
index 0000000000..9bdbf256cc
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Casings6.java
@@ -0,0 +1,94 @@
+package gregtech.common.blocks;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Block_Casings6 extends GT_Block_Casings_Abstract {
+
+ public GT_Block_Casings6() {
+ super(GT_Item_Casings6.class, "gt.blockcasings6", GT_Material_Casings.INSTANCE, 16);
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Hermetic Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Hermetic Casing I");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Hermetic Casing II");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Hermetic Casing III");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Hermetic Casing IV");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Hermetic Casing V");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Hermetic Casing VI");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Hermetic Casing VII");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Hermetic Casing VIII");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Hermetic Casing IX");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Hermetic Casing X");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Hermetic Casing XI");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Hermetic Casing XII");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Hermetic Casing XIII");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Hermetic Casing XIV");
+
+ ItemList.Casing_Tank_0.set(new ItemStack(this, 1, 0));
+ ItemList.Casing_Tank_1.set(new ItemStack(this, 1, 1));
+ ItemList.Casing_Tank_2.set(new ItemStack(this, 1, 2));
+ ItemList.Casing_Tank_3.set(new ItemStack(this, 1, 3));
+ ItemList.Casing_Tank_4.set(new ItemStack(this, 1, 4));
+ ItemList.Casing_Tank_5.set(new ItemStack(this, 1, 5));
+ ItemList.Casing_Tank_6.set(new ItemStack(this, 1, 6));
+ ItemList.Casing_Tank_7.set(new ItemStack(this, 1, 7));
+ ItemList.Casing_Tank_8.set(new ItemStack(this, 1, 8));
+ ItemList.Casing_Tank_9.set(new ItemStack(this, 1, 9));
+ ItemList.Casing_Tank_10.set(new ItemStack(this, 1, 10));
+ ItemList.Casing_Tank_11.set(new ItemStack(this, 1, 11));
+ ItemList.Casing_Tank_12.set(new ItemStack(this, 1, 12));
+ ItemList.Casing_Tank_13.set(new ItemStack(this, 1, 13));
+ ItemList.Casing_Tank_14.set(new ItemStack(this, 1, 14));
+ }
+
+ @Override
+ public int getTextureIndex(int aMeta) {
+ return (8 << 7) | (aMeta + 112);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ if (ordinalSide == 0) {
+ return Textures.BlockIcons.MACHINECASINGS_BOTTOM[aMeta].getIcon();
+ }
+ if (ordinalSide == 1) {
+ return Textures.BlockIcons.MACHINECASINGS_TOP[aMeta].getIcon();
+ }
+ return switch (aMeta) {
+ case 1 -> Textures.BlockIcons.MACHINE_CASING_TANK_1.getIcon();
+ case 2 -> Textures.BlockIcons.MACHINE_CASING_TANK_2.getIcon();
+ case 3 -> Textures.BlockIcons.MACHINE_CASING_TANK_3.getIcon();
+ case 4 -> Textures.BlockIcons.MACHINE_CASING_TANK_4.getIcon();
+ case 5 -> Textures.BlockIcons.MACHINE_CASING_TANK_5.getIcon();
+ case 6 -> Textures.BlockIcons.MACHINE_CASING_TANK_6.getIcon();
+ case 7 -> Textures.BlockIcons.MACHINE_CASING_TANK_7.getIcon();
+ case 8 -> Textures.BlockIcons.MACHINE_CASING_TANK_8.getIcon();
+ case 9 -> Textures.BlockIcons.MACHINE_CASING_TANK_9.getIcon();
+ case 10 -> Textures.BlockIcons.MACHINE_CASING_TANK_10.getIcon();
+ case 11 -> Textures.BlockIcons.MACHINE_CASING_TANK_11.getIcon();
+ case 12 -> Textures.BlockIcons.MACHINE_CASING_TANK_12.getIcon();
+ case 13 -> Textures.BlockIcons.MACHINE_CASING_TANK_13.getIcon();
+ case 14 -> Textures.BlockIcons.MACHINE_CASING_TANK_14.getIcon();
+ default -> Textures.BlockIcons.MACHINE_CASING_TANK_0.getIcon();
+ };
+ }
+
+ @Override
+ public int colorMultiplier(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[0] << 16
+ | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[1] << 8
+ | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[2];
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings8.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings8.java
new file mode 100644
index 0000000000..fdef0def82
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Casings8.java
@@ -0,0 +1,199 @@
+package gregtech.common.blocks;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_RenderingWorld;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Block_Casings8 extends GT_Block_Casings_Abstract {
+
+ public static boolean mConnectedMachineTextures = true;
+
+ // WATCH OUT FOR TEXTURE ID's
+ public GT_Block_Casings8() {
+ super(GT_Item_Casings8.class, "gt.blockcasings8", GT_Material_Casings.INSTANCE, 15);
+ /*
+ * DO NOT USE INDEX 15 ! USED HERE: https://github.com/GTNewHorizons/KubaTech/pull/101
+ */
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Chemically Inert Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "PTFE Pipe Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Mining Neutronium Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Mining Black Plutonium Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Extreme Engine Intake Casing");
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + ".5.name",
+ "Europium Reinforced Radiation Proof Machine Casing");
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + ".6.name",
+ "Advanced Rhodium Plated Palladium Machine Casing");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".7.name", "Advanced Iridium Plated Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Magical Machine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "HSS-S Turbine Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Radiant Naquadah Alloy Casing");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".11.name", "Basic Photolithographic Framework Casing");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".12.name", "Reinforced Photolithographic Framework Casing");
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + ".13.name",
+ "Radiation Proof Photolithographic Framework Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Infinity Cooled Casing");
+
+ ItemList.Casing_Chemically_Inert.set(new ItemStack(this, 1, 0));
+ ItemList.Casing_Pipe_Polytetrafluoroethylene.set(new ItemStack(this, 1, 1));
+ ItemList.Casing_MiningNeutronium.set(new ItemStack(this, 1, 2));
+ ItemList.Casing_MiningBlackPlutonium.set(new ItemStack(this, 1, 3));
+ ItemList.Casing_ExtremeEngineIntake.set(new ItemStack(this, 1, 4));
+ ItemList.Casing_AdvancedRadiationProof.set(new ItemStack(this, 1, 5));
+ ItemList.Casing_Advanced_Rhodium_Palladium.set(new ItemStack(this, 1, 6));
+ ItemList.Casing_Advanced_Iridium.set(new ItemStack(this, 1, 7));
+ ItemList.Casing_Magical.set(new ItemStack(this, 1, 8));
+ ItemList.Casing_TurbineGasAdvanced.set(new ItemStack(this, 1, 9));
+ ItemList.RadiantNaquadahAlloyCasing.set(new ItemStack(this, 1, 10));
+ ItemList.BasicPhotolithographicFrameworkCasing.set(new ItemStack(this, 1, 11));
+ ItemList.ReinforcedPhotolithographicFrameworkCasing.set(new ItemStack(this, 1, 12));
+ ItemList.RadiationProofPhotolithographicFrameworkCasing.set(new ItemStack(this, 1, 13));
+ ItemList.InfinityCooledCasing.set(new ItemStack(this, 1, 14));
+ }
+
+ @Override
+ public int getTextureIndex(int aMeta) {
+ return (1 << 7) | (aMeta + 48);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return switch (aMeta) {
+ case 0 -> Textures.BlockIcons.MACHINE_CASING_CHEMICALLY_INERT.getIcon();
+ case 1 -> Textures.BlockIcons.MACHINE_CASING_PIPE_POLYTETRAFLUOROETHYLENE.getIcon();
+ case 2 -> Textures.BlockIcons.MACHINE_CASING_MINING_NEUTRONIUM.getIcon();
+ case 3 -> Textures.BlockIcons.MACHINE_CASING_MINING_BLACKPLUTONIUM.getIcon();
+ case 4 -> Textures.BlockIcons.MACHINE_CASING_EXTREME_ENGINE_INTAKE.getIcon(); // changed color in a
+ // terrible way
+ case 5 -> Textures.BlockIcons.MACHINE_CASING_ADVANCEDRADIATIONPROOF.getIcon();
+ case 6 -> Textures.BlockIcons.MACHINE_CASING_RHODIUM_PALLADIUM.getIcon();
+ case 7 -> Textures.BlockIcons.MACHINE_CASING_IRIDIUM.getIcon();
+ case 8 -> Textures.BlockIcons.MACHINE_CASING_MAGICAL.getIcon();
+ case 9 -> Textures.BlockIcons.MACHINE_CASING_ADVANCEDGAS.getIcon();
+ case 10 -> Textures.BlockIcons.MACHINE_CASING_RADIANT_NAQUADAH_ALLOY.getIcon();
+ case 11 -> Textures.BlockIcons.MACHINE_CASING_PCB_TIER_1.getIcon();
+ case 12 -> Textures.BlockIcons.MACHINE_CASING_PCB_TIER_2.getIcon();
+ case 13 -> Textures.BlockIcons.MACHINE_CASING_PCB_TIER_3.getIcon();
+ case 14 -> Textures.BlockIcons.INFINITY_COOLED_CASING.getIcon();
+ default -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon();
+ };
+ }
+
+ @Deprecated
+ public IIcon getTurbineCasing(int meta, int iconIndex, boolean active) {
+ // noinspection SwitchStatementWithTooFewBranches // "if" is harder to edit
+ return switch (meta) {
+ case 9 -> active ? Textures.BlockIcons.TURBINE_ADVGASACTIVE[iconIndex].getIcon()
+ : Textures.BlockIcons.TURBINEADVGAS[iconIndex].getIcon();
+ default -> active ? Textures.BlockIcons.TURBINE_ACTIVE[iconIndex].getIcon()
+ : Textures.BlockIcons.TURBINE[iconIndex].getIcon();
+ };
+ }
+
+ public IIcon getTurbineCasing(int meta, int iconIndex, boolean active, boolean hasTurbine) {
+ // noinspection SwitchStatementWithTooFewBranches // "if" is harder to edit
+ return switch (meta) {
+ case 9 -> active ? Textures.BlockIcons.TURBINE_ADVGASACTIVE[iconIndex].getIcon()
+ : hasTurbine ? Textures.BlockIcons.TURBINEADVGAS[iconIndex].getIcon()
+ : Textures.BlockIcons.TURBINE_ADVGASEMPTY[iconIndex].getIcon();
+ default -> active ? Textures.BlockIcons.TURBINE_ACTIVE[iconIndex].getIcon()
+ : hasTurbine ? Textures.BlockIcons.TURBINE[iconIndex].getIcon()
+ : Textures.BlockIcons.TURBINE_EMPTY[iconIndex].getIcon();
+ };
+ }
+
+ private static int isTurbineControllerWithSide(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (!(tTileEntity instanceof IGregTechTileEntity tTile)) return 0;
+ if (tTile.getMetaTileEntity() instanceof GT_MetaTileEntity_LargeTurbine turbine && tTile.getFrontFacing()
+ .ordinal() == ordinalSide) {
+ if (turbine.isNewStyleRendering()) return 0;
+ if (tTile.isActive()) return 1;
+ return turbine.hasTurbine() ? 2 : 3;
+ }
+ return 0;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) {
+ aWorld = GT_RenderingWorld.getInstance(aWorld);
+ final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+
+ if (tMeta != 9 || !mConnectedMachineTextures) {
+ return getIcon(ordinalSide, tMeta);
+ }
+
+ int tInvertLeftRightMod = ordinalSide % 2 * 2 - 1;
+
+ switch (ordinalSide / 2) {
+ case 0 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ int tState;
+ if ((tState = isTurbineControllerWithSide(aWorld, xCoord + j, yCoord, zCoord + i, ordinalSide))
+ != 0) {
+ return getTurbineCasing(tMeta, 4 - i * 3 - j, tState == 1, tState == 2);
+ }
+ }
+ }
+ }
+ case 1 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ int tState;
+ if ((tState = isTurbineControllerWithSide(aWorld, xCoord + j, yCoord + i, zCoord, ordinalSide))
+ != 0) {
+ return getTurbineCasing(
+ tMeta,
+ 4 + i * 3 - j * tInvertLeftRightMod,
+ tState == 1,
+ tState == 2);
+ }
+ }
+ }
+ }
+ case 2 -> {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ if (i == 0 && j == 0) continue;
+ int tState;
+ if ((tState = isTurbineControllerWithSide(aWorld, xCoord, yCoord + i, zCoord + j, ordinalSide))
+ != 0) {
+ return getTurbineCasing(
+ tMeta,
+ 4 + i * 3 + j * tInvertLeftRightMod,
+ tState == 1,
+ tState == 2);
+ }
+ }
+ }
+ }
+ }
+
+ return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings9.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings9.java
new file mode 100644
index 0000000000..bc6aca6255
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Casings9.java
@@ -0,0 +1,43 @@
+package gregtech.common.blocks;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Block_Casings9 extends GT_Block_Casings_Abstract {
+
+ public GT_Block_Casings9() {
+ super(GT_Item_Casings9.class, "gt.blockcasings9", GT_Material_Casings.INSTANCE, 2);
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "PBI Pipe Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Advanced Filter Casing");
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".1.tooltip", "Less than five 0.1μm particles per m^3");
+
+ ItemList.Casing_Pipe_Polybenzimidazole.set(new ItemStack(this, 1, 0));
+ ItemList.Casing_Vent_T2.set(new ItemStack(this, 1, 1));
+ }
+
+ @Override
+ public int getTextureIndex(int aMeta) {
+ return (1 << 7) | (aMeta + 64);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return switch (aMeta) {
+ case 0 -> Textures.BlockIcons.MACHINE_CASING_PIPE_POLYBENZIMIDAZOLE.getIcon();
+ case 1 -> Textures.BlockIcons.MACHINE_CASING_VENT_T2.getIcon();
+ default -> Textures.BlockIcons.MACHINE_CASING_ROBUST_TUNGSTENSTEEL.getIcon();
+ };
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Casings_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Block_Casings_Abstract.java
new file mode 100644
index 0000000000..59144666df
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Casings_Abstract.java
@@ -0,0 +1,144 @@
+package gregtech.common.blocks;
+
+import java.util.List;
+
+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.Entity;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Textures;
+import gregtech.api.items.GT_Generic_Block;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_LanguageManager;
+
+/**
+ * The base class for casings. Casings are the blocks that are mainly used to build multiblocks.
+ */
+public abstract class GT_Block_Casings_Abstract extends GT_Generic_Block
+ implements gregtech.api.interfaces.IHasIndexedTexture {
+
+ public GT_Block_Casings_Abstract(Class<? extends ItemBlock> aItemClass, String aName, Material aMaterial) {
+ super(aItemClass, aName, aMaterial);
+ setStepSound(soundTypeMetal);
+ setCreativeTab(GregTech_API.TAB_GREGTECH);
+ GregTech_API.registerMachineBlock(this, -1);
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + 32767 + ".name", "Any Sub Block of this");
+ }
+
+ public GT_Block_Casings_Abstract(Class<? extends ItemBlock> aItemClass, String aName, Material aMaterial,
+ int aMaxMeta) {
+ this(aItemClass, aName, aMaterial);
+ for (int i = 0; i < aMaxMeta; i++) {
+ Textures.BlockIcons.setCasingTextureForId(getTextureIndex(i), TextureFactory.of(this, i));
+ }
+ }
+
+ @Override
+ public String getHarvestTool(int aMeta) {
+ return "wrench";
+ }
+
+ @Override
+ public int getHarvestLevel(int aMeta) {
+ return 2;
+ }
+
+ @Override
+ public float getBlockHardness(World aWorld, int aX, int aY, int aZ) {
+ return Blocks.iron_block.getBlockHardness(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public float getExplosionResistance(Entity aTNT) {
+ return Blocks.iron_block.getExplosionResistance(aTNT);
+ }
+
+ @Override
+ protected boolean canSilkHarvest() {
+ return false;
+ }
+
+ @Override
+ public void onBlockAdded(World aWorld, int aX, int aY, int aZ) {
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return this.mUnlocalizedName;
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return StatCollector.translateToLocal(this.mUnlocalizedName + ".name");
+ }
+
+ @Override
+ public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return false;
+ }
+
+ @Override
+ public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return true;
+ }
+
+ @Override
+ public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetaData) {
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) {
+ return false;
+ }
+
+ @Override
+ public int damageDropped(int metadata) {
+ return metadata;
+ }
+
+ @Override
+ public int getDamageValue(World aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlockMetadata(aX, aY, aZ);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister aIconRegister) {}
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ for (int i = 0; i < 16; i++) {
+ ItemStack aStack = new ItemStack(aItem, 1, i);
+ if (!aStack.getDisplayName()
+ .contains(".name")) aList.add(aStack);
+ }
+ }
+
+ /**
+ * Provide a fallback to subclasses in addons.
+ */
+ @Override
+ public int getTextureIndex(int aMeta) {
+ return Textures.BlockIcons.ERROR_TEXTURE_INDEX;
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Concretes.java b/src/main/java/gregtech/common/blocks/GT_Block_Concretes.java
new file mode 100644
index 0000000000..c7b7e2bb04
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Concretes.java
@@ -0,0 +1,83 @@
+package gregtech.common.blocks;
+
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IBlockOnWalkOver;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class GT_Block_Concretes extends GT_Block_Stones_Abstract implements IBlockOnWalkOver {
+
+ public GT_Block_Concretes() {
+ super(GT_Item_Concretes.class, "gt.blockconcretes");
+ setResistance(20.0F);
+ // this.slipperiness = 0.9F;
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Dark Concrete");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Dark Concrete Cobblestone");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Mossy Dark Concrete Cobblestone");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Dark Concrete Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Cracked Dark Concrete Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Mossy Dark Concrete Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Chiseled Dark Concrete");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Smooth Dark Concrete");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Light Concrete");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Light Concrete Cobblestone");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Mossy Light Concrete Cobblestone");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Light Concrete Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Cracked Light Concrete Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Mossy Light Concrete Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Chiseled Light Concrete");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Smooth Light Concrete");
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 0));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 1));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 2));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 3));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 4));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 5));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 6));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 7));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 8));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 9));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 10));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 11));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 12));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 13));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 14));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Concrete, new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ public int getHarvestLevel(int aMeta) {
+ return 1;
+ }
+
+ @Override
+ public float getBlockHardness(World aWorld, int aX, int aY, int aZ) {
+ return this.blockHardness = Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ return gregtech.api.enums.Textures.BlockIcons.CONCRETES[aMeta].getIcon();
+ }
+ return gregtech.api.enums.Textures.BlockIcons.CONCRETES[0].getIcon();
+ }
+
+ @Override
+ public void onWalkOver(EntityLivingBase aEntity, World aWorld, int aX, int aY, int aZ) {
+ if ((aEntity.motionX != 0 || aEntity.motionZ != 0) && !aEntity.isInWater()
+ && !aEntity.isWet()
+ && !aEntity.isSneaking()) {
+ double tSpeed = (aWorld.getBlock(aX, aY - 1, aZ).slipperiness >= 0.8 ? 1.5 : 1.2);
+ aEntity.motionX *= tSpeed;
+ aEntity.motionZ *= tSpeed;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Drone.java b/src/main/java/gregtech/common/blocks/GT_Block_Drone.java
new file mode 100644
index 0000000000..81d1acc228
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Drone.java
@@ -0,0 +1,65 @@
+package gregtech.common.blocks;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.common.tileentities.render.TileDrone;
+
+public class GT_Block_Drone extends Block {
+
+ public GT_Block_Drone() {
+ super(Material.iron);
+ this.setResistance(20f);
+ this.setHardness(-1.0f);
+ this.setCreativeTab(GregTech_API.TAB_GREGTECH);
+ this.setBlockName("gt.dronerender");
+ this.setLightLevel(100.0f);
+ GameRegistry.registerBlock(this, getUnlocalizedName());
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister iconRegister) {
+ blockIcon = iconRegister.registerIcon("gregtech:iconsets/TRANSPARENT");
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public boolean canRenderInPass(int a) {
+ return true;
+ }
+
+ @Override
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean hasTileEntity(int metadata) {
+ return true;
+ }
+
+ @Override
+ public TileEntity createTileEntity(World world, int metadata) {
+ return new TileDrone();
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int meta, int fortune) {
+ return new ArrayList<>();
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Granites.java b/src/main/java/gregtech/common/blocks/GT_Block_Granites.java
new file mode 100644
index 0000000000..69ebc2e733
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Granites.java
@@ -0,0 +1,77 @@
+package gregtech.common.blocks;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.boss.EntityWither;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class GT_Block_Granites extends GT_Block_Stones_Abstract {
+
+ public GT_Block_Granites() {
+ super(GT_Item_Granites.class, "gt.blockgranites");
+ setResistance(60.0F);
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Black Granite");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Black Granite Cobblestone");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Mossy Black Granite Cobblestone");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Black Granite Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Cracked Black Granite Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Mossy Black Granite Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Chiseled Black Granite");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Smooth Black Granite");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Red Granite");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Red Granite Cobblestone");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Mossy Red Granite Cobblestone");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Red Granite Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Cracked Red Granite Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Mossy Red Granite Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Chiseled Red Granite");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Smooth Red Granite");
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 0));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 1));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 2));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 3));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 4));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 5));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 6));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteBlack, new ItemStack(this, 1, 7));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 8));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 9));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 10));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 11));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 12));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 13));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 14));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.GraniteRed, new ItemStack(this, 1, 15));
+ }
+
+ @Override
+ public int getHarvestLevel(int aMeta) {
+ return 3;
+ }
+
+ @Override
+ public float getBlockHardness(World aWorld, int aX, int aY, int aZ) {
+ return this.blockHardness = Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ) * 3.0F;
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ return gregtech.api.enums.Textures.BlockIcons.GRANITES[aMeta].getIcon();
+ }
+ return gregtech.api.enums.Textures.BlockIcons.GRANITES[0].getIcon();
+ }
+
+ @Override
+ public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) {
+ return !(entity instanceof EntityWither);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Machines.java b/src/main/java/gregtech/common/blocks/GT_Block_Machines.java
new file mode 100644
index 0000000000..3d24799746
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Machines.java
@@ -0,0 +1,703 @@
+package gregtech.common.blocks;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.ITileEntityProvider;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.Explosion;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.cricketcraft.chisel.api.IFacade;
+
+import cpw.mods.fml.common.Optional;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IDebugableBlock;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IColoredTileEntity;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IDebugableTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_Generic_Block;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.metatileentity.BaseTileEntity;
+import gregtech.api.metatileentity.CoverableTileEntity;
+import gregtech.api.util.GT_BaseCrop;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.covers.CoverInfo;
+import gregtech.common.render.GT_Renderer_Block;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_QuantumChest;
+
+@Optional.Interface(iface = "com.cricketcraft.chisel.api.IFacade", modid = "ChiselAPI")
+public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlock, ITileEntityProvider, IFacade {
+
+ private static final ThreadLocal<IGregTechTileEntity> mTemporaryTileEntity = new ThreadLocal<>();
+ private boolean renderAsNormalBlock;
+
+ public GT_Block_Machines() {
+ super(GT_Item_Machines.class, "gt.blockmachines", new GT_Material_Machines());
+ GregTech_API.registerMachineBlock(this, -1);
+ setHardness(1.0F);
+ setResistance(10.0F);
+ setStepSound(soundTypeMetal);
+ setCreativeTab(GregTech_API.TAB_GREGTECH);
+ this.isBlockContainer = true;
+ this.renderAsNormalBlock = true;
+ this.useNeighborBrightness = true;
+ }
+
+ @Override
+ public String getHarvestTool(int aMeta) {
+ if (aMeta >= 8 && aMeta <= 11) {
+ return "cutter";
+ }
+ return "wrench";
+ }
+
+ @Override
+ public int getHarvestLevel(int aMeta) {
+ return aMeta % 4;
+ }
+
+ @Override
+ protected boolean canSilkHarvest() {
+ return false;
+ }
+
+ @Override
+ public void onNeighborChange(IBlockAccess aWorld, int aX, int aY, int aZ, int aTileX, int aTileY, int aTileZ) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if ((tTileEntity instanceof BaseTileEntity)) {
+ ((BaseTileEntity) tTileEntity).onAdjacentBlockChange(aTileX, aTileY, aTileZ);
+ }
+ }
+
+ @Override
+ public void onNeighborBlockChange(World aWorld, int aX, int aY, int aZ, Block aBlock) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if ((tTileEntity instanceof BaseMetaPipeEntity)) {
+ ((BaseMetaPipeEntity) tTileEntity).onNeighborBlockChange(aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void onBlockAdded(World aWorld, int aX, int aY, int aZ) {
+ super.onBlockAdded(aWorld, aX, aY, aZ);
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return "gt.blockmachines";
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return StatCollector.translateToLocal(getUnlocalizedName() + ".name");
+ }
+
+ @Override
+ public int getFlammability(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) {
+ return 0;
+ }
+
+ @Override
+ public int getFireSpreadSpeed(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) {
+ return GregTech_API.sMachineFlammable && (aWorld.getBlockMetadata(aX, aY, aZ) == 0) ? 100 : 0;
+ }
+
+ @Override
+ public int getRenderType() {
+ if (GT_Renderer_Block.INSTANCE == null) {
+ return super.getRenderType();
+ }
+ return GT_Renderer_Block.INSTANCE.mRenderID;
+ }
+
+ @Override
+ public boolean isFireSource(World aWorld, int aX, int aY, int aZ, ForgeDirection side) {
+ return GregTech_API.sMachineFlammable && (aWorld.getBlockMetadata(aX, aY, aZ) == 0);
+ }
+
+ @Override
+ public boolean isFlammable(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection face) {
+ return GregTech_API.sMachineFlammable && (aWorld.getBlockMetadata(aX, aY, aZ) == 0);
+ }
+
+ @Override
+ public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return false;
+ }
+
+ @Override
+ public boolean canConnectRedstone(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ ForgeDirection forgeSide = switch (ordinalSide) {
+ case (-2) -> ForgeDirection.DOWN;
+ case (-1) -> ForgeDirection.UP;
+ case (0) -> ForgeDirection.NORTH;
+ case (2) -> ForgeDirection.SOUTH;
+ case (3) -> ForgeDirection.WEST;
+ case (1) -> ForgeDirection.EAST;
+ default -> ForgeDirection.UNKNOWN;
+ };
+ final TileEntity machineEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return machineEntity instanceof CoverableTileEntity cte && cte.getCoverInfoAtSide(forgeSide)
+ .getCoverID() != 0;
+ }
+
+ @Override
+ public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return false;
+ }
+
+ @Override
+ public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return false;
+ }
+
+ @Override
+ public boolean hasTileEntity(int aMeta) {
+ return true;
+ }
+
+ @Override
+ public boolean hasComparatorInputOverride() {
+ return true;
+ }
+
+ @Override
+ public boolean renderAsNormalBlock() {
+ return renderAsNormalBlock;
+ }
+
+ public GT_Block_Machines setRenderAsNormalBlock(boolean aBool) {
+ renderAsNormalBlock = aBool;
+ return this;
+ }
+
+ @Override
+ public boolean canProvidePower() {
+ return true;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(World aWorld, int aMeta) {
+ return createTileEntity(aWorld, aMeta);
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public IIcon getIcon(IBlockAccess aIBlockAccess, int aX, int aY, int aZ, int ordinalSide) {
+ return Textures.BlockIcons.MACHINE_LV_SIDE.getIcon();
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return Textures.BlockIcons.MACHINE_LV_SIDE.getIcon();
+ }
+
+ @Override
+ public boolean onBlockEventReceived(World aWorld, int aX, int aY, int aZ, int aData1, int aData2) {
+ super.onBlockEventReceived(aWorld, aX, aY, aZ, aData1, aData2);
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return tTileEntity != null && tTileEntity.receiveClientEvent(aData1, aData2);
+ }
+
+ @Override
+ public void addCollisionBoxesToList(World aWorld, int aX, int aY, int aZ, AxisAlignedBB inputAABB,
+ List<AxisAlignedBB> outputAABB, Entity collider) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity
+ && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null) {
+ ((IGregTechTileEntity) tTileEntity)
+ .addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider);
+ return;
+ }
+ super.addCollisionBoxesToList(aWorld, aX, aY, aZ, inputAABB, outputAABB, collider);
+ }
+
+ @Override
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity
+ && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null) {
+ return ((IGregTechTileEntity) tTileEntity).getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ }
+ return super.getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public AxisAlignedBB getSelectedBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity
+ && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null) {
+ return ((IGregTechTileEntity) tTileEntity).getCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ }
+ return super.getSelectedBoundingBoxFromPool(aWorld, aX, aY, aZ);
+ }
+
+ @Override // THIS
+ public void setBlockBoundsBasedOnState(IBlockAccess blockAccess, int aX, int aY, int aZ) {
+ final TileEntity tTileEntity = blockAccess.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity
+ && (((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null)) {
+ final AxisAlignedBB bbb = ((IGregTechTileEntity) tTileEntity)
+ .getCollisionBoundingBoxFromPool(((IGregTechTileEntity) tTileEntity).getWorld(), 0, 0, 0);
+ minX = bbb.minX; // This essentially sets block bounds
+ minY = bbb.minY;
+ minZ = bbb.minZ;
+ maxX = bbb.maxX;
+ maxY = bbb.maxY;
+ maxZ = bbb.maxZ;
+ return;
+ }
+ super.setBlockBoundsBasedOnState(blockAccess, aX, aY, aZ);
+ }
+
+ @Override
+ public void setBlockBoundsForItemRender() {
+ super.setBlockBounds(0, 0, 0, 1, 1, 1);
+ }
+
+ @Override
+ public void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity
+ && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() != null) {
+ ((IGregTechTileEntity) tTileEntity).onEntityCollidedWithBlock(aWorld, aX, aY, aZ, collider);
+ return;
+ }
+ super.onEntityCollidedWithBlock(aWorld, aX, aY, aZ, collider);
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void registerBlockIcons(IIconRegister aIconRegister) {
+ if (!GregTech_API.sPostloadFinished) return;
+ GT_Log.out.println("GT_Mod: Setting up Icon Register for Blocks");
+ GregTech_API.setBlockIconRegister(aIconRegister);
+
+ GT_Log.out.println("GT_Mod: Registering MetaTileEntity specific Textures");
+ try {
+ for (IMetaTileEntity tMetaTileEntity : GregTech_API.METATILEENTITIES) {
+ if (tMetaTileEntity != null) {
+ tMetaTileEntity.registerIcons(aIconRegister);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ GT_Log.out.println("GT_Mod: Registering Crop specific Textures");
+ try {
+ for (GT_BaseCrop tCrop : GT_BaseCrop.sCropList) {
+ tCrop.registerSprites(aIconRegister);
+ }
+ } catch (Exception e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ GT_Log.out.println("GT_Mod: Starting Block Icon Load Phase");
+ GT_FML_LOGGER.info("GT_Mod: Starting Block Icon Load Phase");
+ try {
+ for (Runnable tRunnable : GregTech_API.sGTBlockIconload) {
+ tRunnable.run();
+ }
+ } catch (Exception e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ GT_Log.out.println("GT_Mod: Finished Block Icon Load Phase");
+ GT_FML_LOGGER.info("GT_Mod: Finished Block Icon Load Phase");
+ }
+
+ @Override
+ public float getPlayerRelativeBlockHardness(EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ return tTileEntity instanceof BaseMetaTileEntity && ((BaseMetaTileEntity) tTileEntity).privateAccess()
+ && !((BaseMetaTileEntity) tTileEntity).playerOwnsThis(aPlayer, true) ? -1.0F
+ : super.getPlayerRelativeBlockHardness(aPlayer, aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean onBlockActivated(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer, int ordinalSide,
+ float aOffsetX, float aOffsetY, float aOffsetZ) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity == null) {
+ return false;
+ }
+ if (aPlayer.isSneaking()) {
+ final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
+ if (tCurrentItem != null && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sScrewdriverList)
+ && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList)
+ && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList)
+ && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList)
+ && !GT_Utility.isStackInList(tCurrentItem, GregTech_API.sJackhammerList)) return false;
+ }
+ if (tTileEntity instanceof IGregTechTileEntity gtTE) {
+ if (gtTE.getTimer() < 1L) {
+ return false;
+ }
+ if ((!aWorld.isRemote) && !gtTE.isUseableByPlayer(aPlayer)) {
+ return true;
+ }
+ return ((IGregTechTileEntity) tTileEntity)
+ .onRightclick(aPlayer, ForgeDirection.getOrientation(ordinalSide), aOffsetX, aOffsetY, aOffsetZ);
+ }
+ return false;
+ }
+
+ @Override
+ public void onBlockClicked(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity gtTE) {
+ gtTE.onLeftclick(aPlayer);
+ }
+ }
+
+ @Override
+ public int getDamageValue(World aWorld, int aX, int aY, int aZ) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity gtTE) {
+ return gtTE.getMetaTileID();
+ }
+ return 0;
+ }
+
+ @Override
+ public void onBlockExploded(World aWorld, int aX, int aY, int aZ, Explosion aExplosion) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof BaseMetaTileEntity baseTE) {
+ GT_Log.exp.printf(
+ "Explosion at : %d | %d | %d DIMID: %s due to near explosion!%n",
+ aX,
+ aY,
+ aZ,
+ aWorld.provider.dimensionId);
+ baseTE.doEnergyExplosion();
+ }
+ super.onBlockExploded(aWorld, aX, aY, aZ, aExplosion);
+ }
+
+ @Override
+ public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetadata) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity gtTE) {
+ gtTE.onBlockDestroyed();
+ mTemporaryTileEntity.set(gtTE);
+ if (!(gtTE.getMetaTileEntity() instanceof GT_MetaTileEntity_QuantumChest)) {
+ for (int i = 0; i < gtTE.getSizeInventory(); i++) {
+ final ItemStack tItem = gtTE.getStackInSlot(i);
+ if ((tItem != null) && (tItem.stackSize > 0) && (gtTE.isValidSlot(i)) && gtTE.shouldDropItemAt(i)) {
+ final EntityItem tItemEntity = new EntityItem(
+ aWorld,
+ aX + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F,
+ aY + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F,
+ aZ + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F,
+ new ItemStack(tItem.getItem(), tItem.stackSize, tItem.getItemDamage()));
+ if (tItem.hasTagCompound()) {
+ tItemEntity.getEntityItem()
+ .setTagCompound(
+ (NBTTagCompound) tItem.getTagCompound()
+ .copy());
+ }
+ tItemEntity.motionX = (XSTR_INSTANCE.nextGaussian() * 0.05D);
+ tItemEntity.motionY = (XSTR_INSTANCE.nextGaussian() * 0.25D);
+ tItemEntity.motionZ = (XSTR_INSTANCE.nextGaussian() * 0.05D);
+ aWorld.spawnEntityInWorld(tItemEntity);
+ tItem.stackSize = 0;
+ gtTE.setInventorySlotContents(i, null);
+ }
+ }
+ }
+ }
+ super.breakBlock(aWorld, aX, aY, aZ, aBlock, aMetadata);
+ aWorld.removeTileEntity(aX, aY, aZ);
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(World aWorld, int aX, int aY, int aZ, int aMeta, int aFortune) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity gtTE) {
+ return gtTE.getDrops();
+ }
+ final IGregTechTileEntity tGregTechTileEntity = mTemporaryTileEntity.get();
+ final ArrayList<ItemStack> tDrops;
+ if (tGregTechTileEntity == null) {
+ tDrops = new ArrayList<>();
+ } else {
+ tDrops = tGregTechTileEntity.getDrops();
+ mTemporaryTileEntity.remove();
+ }
+ return tDrops;
+ }
+
+ @Override
+ public boolean removedByPlayer(World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ, boolean aWillHarvest) {
+ // This delays deletion of the block until after getDrops
+ return aWillHarvest || super.removedByPlayer(aWorld, aPlayer, aX, aY, aZ, false);
+ }
+
+ @Override
+ public void harvestBlock(World aWorld, EntityPlayer aPlayer, int aX, int aY, int aZ, int aMeta) {
+ super.harvestBlock(aWorld, aPlayer, aX, aY, aZ, aMeta);
+ aWorld.setBlockToAir(aX, aY, aZ);
+ }
+
+ @Override
+ public int getComparatorInputOverride(World aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity gtTE) {
+ return gtTE.getComparatorValue(ForgeDirection.getOrientation(ordinalSide));
+ }
+ return 0;
+ }
+
+ @Override
+ public int isProvidingWeakPower(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ if (ordinalSide < 0 || ordinalSide > 5) {
+ return 0;
+ }
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity gtTE) {
+ return gtTE.getOutputRedstoneSignal(
+ ForgeDirection.getOrientation(ordinalSide)
+ .getOpposite());
+ }
+ return 0;
+ }
+
+ @Override
+ public int isProvidingStrongPower(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ if (ordinalSide < 0 || ordinalSide > 5) {
+ return 0;
+ }
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity gtTE) {
+ return gtTE.getStrongOutputRedstoneSignal(
+ ForgeDirection.getOrientation(ordinalSide)
+ .getOpposite());
+ }
+ return 0;
+ }
+
+ @Override
+ public void dropBlockAsItemWithChance(World aWorld, int aX, int aY, int aZ, int aMetadata, float chance,
+ int aFortune) {
+ if (!aWorld.isRemote) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity != null && (chance < 1.0F)) {
+ if (tTileEntity instanceof BaseMetaTileEntity bmte && (GregTech_API.sMachineNonWrenchExplosions)) {
+ GT_Log.exp.printf(
+ "Explosion at : %d | %d | %d DIMID: %s NonWrench picking/Rain!%n",
+ aX,
+ aY,
+ aZ,
+ aWorld.provider.dimensionId);
+ bmte.doEnergyExplosion();
+ }
+ } else {
+ super.dropBlockAsItemWithChance(aWorld, aX, aY, aZ, aMetadata, chance, aFortune);
+ }
+ }
+ }
+
+ @Override
+ public boolean isSideSolid(IBlockAccess aWorld, int aX, int aY, int aZ, ForgeDirection side) {
+ if (aWorld.getBlockMetadata(aX, aY, aZ) == 0) {
+ return true;
+ }
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity != null) {
+ if (tTileEntity instanceof BaseMetaTileEntity) {
+ return true;
+ }
+ if (tTileEntity instanceof BaseMetaPipeEntity
+ && (((BaseMetaPipeEntity) tTileEntity).mConnections & 0xFFFFFFC0) != 0) {
+ return true;
+ }
+ return tTileEntity instanceof ICoverable && ((ICoverable) tTileEntity).getCoverIDAtSide(side) != 0;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isBlockNormalCube() {
+ return true;
+ }
+
+ /**
+ * Returns the default ambient occlusion value based on block opacity
+ */
+ @SideOnly(Side.CLIENT)
+ @Override
+ public float getAmbientOcclusionLightValue() {
+ return this.renderAsNormalBlock() ? 0.2F : 0.5F;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void randomDisplayTick(World aWorld, int aX, int aY, int aZ, Random aRandom) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity) {
+ ((IGregTechTileEntity) tTileEntity).onRandomDisplayTick();
+ }
+ }
+
+ @Override
+ public int getLightOpacity(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity) {
+ return ((IGregTechTileEntity) tTileEntity).getLightOpacity();
+ }
+ return aWorld.getBlockMetadata(aX, aY, aZ) == 0 ? 255 : 0;
+ }
+
+ @Override
+ public int getLightValue(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof BaseMetaTileEntity) {
+ return ((BaseMetaTileEntity) tTileEntity).getLightValue();
+ }
+ return 0;
+ }
+
+ @Override
+ public TileEntity createTileEntity(World aWorld, int aMeta) {
+ return GregTech_API.createTileEntity(aMeta);
+ }
+
+ @Override
+ public float getExplosionResistance(Entity entity, World aWorld, int aX, int aY, int aZ, double explosionX,
+ double explosionY, double explosionZ) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IGregTechTileEntity) {
+ return ((IGregTechTileEntity) tTileEntity).getBlastResistance(ForgeDirection.UNKNOWN);
+ }
+ return 10.0F;
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void getSubBlocks(Item item, CreativeTabs aCreativeTab, List<ItemStack> outputSubBlocks) {
+ for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) {
+ if (GregTech_API.METATILEENTITIES[i] != null) {
+ outputSubBlocks.add(new ItemStack(item, 1, i));
+ }
+ }
+ }
+
+ @Override
+ public void onBlockPlacedBy(World aWorld, int aX, int aY, int aZ, EntityLivingBase aPlayer, ItemStack aStack) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (!(tTileEntity instanceof IGregTechTileEntity iGregTechTileEntity)) return;
+ iGregTechTileEntity.setFrontFacing(
+ BaseTileEntity.getSideForPlayerPlacing(aPlayer, ForgeDirection.UP, iGregTechTileEntity.getValidFacings()));
+ }
+
+ @Override
+ public ArrayList<String> getDebugInfo(EntityPlayer aPlayer, int aX, int aY, int aZ, int aLogLevel) {
+ final TileEntity tTileEntity = aPlayer.worldObj.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IDebugableTileEntity) {
+ return ((IDebugableTileEntity) tTileEntity).getDebugInfo(aPlayer, aLogLevel);
+ }
+ return new ArrayList<>();
+ }
+
+ @Override
+ public boolean recolourBlock(World aWorld, int aX, int aY, int aZ, ForgeDirection side, int aColor) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IColoredTileEntity coloredTE) {
+ if (coloredTE.getColorization() == (byte) ((~aColor) & 0xF)) {
+ return false;
+ }
+ coloredTE.setColorization((byte) ((~aColor) & 0xF));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public Block getFacade(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof CoverableTileEntity tile) {
+ final ForgeDirection dir = ForgeDirection.getOrientation(ordinalSide);
+ if (dir != ForgeDirection.UNKNOWN) {
+ final Block facadeBlock = tile.getCoverInfoAtSide(dir)
+ .getFacadeBlock();
+ if (facadeBlock != null) return facadeBlock;
+ } else {
+ // we do not allow more than one type of facade per block, so no need to check every side
+ // see comment in gregtech.common.covers.GT_Cover_FacadeBase.isCoverPlaceable
+ for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) {
+ final Block facadeBlock = tile.getCoverInfoAtSide(tSide)
+ .getFacadeBlock();
+ if (facadeBlock != null) {
+ return facadeBlock;
+ }
+ }
+ }
+ }
+ return Blocks.air;
+ }
+
+ @Override
+ public int getFacadeMetadata(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof CoverableTileEntity tile) {
+ final ForgeDirection dir = ForgeDirection.getOrientation(ordinalSide);
+ if (ordinalSide != -1) {
+ final CoverInfo coverInfo = tile.getCoverInfoAtSide(dir);
+ final Block facadeBlock = coverInfo.getFacadeBlock();
+ if (facadeBlock != null) return coverInfo.getFacadeMeta();
+ } else {
+ // we do not allow more than one type of facade per block, so no need to check every side
+ // see comment in gregtech.common.covers.GT_Cover_FacadeBase.isCoverPlaceable
+ for (final ForgeDirection d : ForgeDirection.VALID_DIRECTIONS) {
+ final CoverInfo coverInfo = tile.getCoverInfoAtSide(d);
+ final Block facadeBlock = coverInfo.getFacadeBlock();
+ if (facadeBlock != null) {
+ return coverInfo.getFacadeMeta();
+ }
+ }
+ }
+ }
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Metal.java b/src/main/java/gregtech/common/blocks/GT_Block_Metal.java
new file mode 100644
index 0000000000..753c590e51
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Metal.java
@@ -0,0 +1,68 @@
+package gregtech.common.blocks;
+
+import static gregtech.api.enums.Mods.NotEnoughItems;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class GT_Block_Metal extends GT_Block_Storage {
+
+ public Materials[] mMats;
+ public OrePrefixes mPrefix;
+ public IIconContainer[] mBlockIcons;
+ public boolean mHideBlocks;
+ public static boolean mNEIisLoaded = NotEnoughItems.isModLoaded();
+
+ public GT_Block_Metal(String aName, Materials[] aMats, OrePrefixes aPrefix, IIconContainer[] aBlockIcons) {
+ super(GT_Item_Storage.class, aName, Material.iron);
+ mMats = aMats;
+ mPrefix = aPrefix;
+ mBlockIcons = aBlockIcons;
+ mHideBlocks = mNEIisLoaded;
+
+ for (int i = 0; i < aMats.length; i++) {
+ if (aMats[i].mMetaItemSubID > 0 && aMats[i].mHasParentMod) {
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + "." + i + ".name",
+ "Block of " + (GT_LanguageManager.i18nPlaceholder ? "%material" : aMats[i].mDefaultLocalName));
+ GT_OreDictUnificator.registerOre(aPrefix, aMats[i], new ItemStack(this, 1, i));
+ }
+ }
+ if (aMats.length < 16 && mNEIisLoaded) {
+ for (int i = aMats.length; i < 16; i++) codechicken.nei.api.API.hideItem(new ItemStack(this, 1, i));
+ }
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ if ((aMeta >= 0) && (aMeta < 16) && aMeta < mMats.length) {
+ return mBlockIcons[aMeta].getIcon();
+ }
+ return null;
+ }
+
+ @Override
+ public void onBlockAdded(World aWorld, int aX, int aY, int aZ) {
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetaData) {
+ if (GregTech_API.isMachineBlock(this, aMetaData)) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Ores.java b/src/main/java/gregtech/common/blocks/GT_Block_Ores.java
new file mode 100644
index 0000000000..015baa2319
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Ores.java
@@ -0,0 +1,154 @@
+package gregtech.common.blocks;
+
+import static gregtech.api.enums.Textures.BlockIcons.BASALT_STONE;
+import static gregtech.api.enums.Textures.BlockIcons.GRANITE_BLACK_STONE;
+import static gregtech.api.enums.Textures.BlockIcons.GRANITE_RED_STONE;
+import static gregtech.api.enums.Textures.BlockIcons.MARBLE_STONE;
+
+import java.util.Arrays;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.MapColor;
+import net.minecraft.block.material.Material;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.FakePlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.render.TextureFactory;
+
+public class GT_Block_Ores extends GT_Block_Ores_Abstract {
+
+ private static final String UNLOCALIZED_NAME = "gt.blockores";
+
+ public GT_Block_Ores() {
+ super(UNLOCALIZED_NAME, 7, false, Material.rock);
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return UNLOCALIZED_NAME;
+ }
+
+ @Override
+ public OrePrefixes[] getProcessingPrefix() { // Must have 8 entries; an entry can be null to disable automatic
+ // recipes.
+ return new OrePrefixes[] { OrePrefixes.ore, OrePrefixes.oreNetherrack, OrePrefixes.oreEndstone,
+ OrePrefixes.oreBlackgranite, OrePrefixes.oreRedgranite, OrePrefixes.oreMarble, OrePrefixes.oreBasalt,
+ null };
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int ordinalSide, int meta) {
+ int index = ((meta / 1000) % 16);
+ return switch (index) {
+ case 1 -> Blocks.netherrack.getIcon(ordinalSide, 0);
+ case 2 -> Blocks.end_stone.getIcon(ordinalSide, 0);
+ case 3 -> GRANITE_BLACK_STONE.getIcon();
+ case 4 -> GRANITE_RED_STONE.getIcon();
+ case 5 -> MARBLE_STONE.getIcon();
+ case 6 -> BASALT_STONE.getIcon();
+ default -> Blocks.stone.getIcon(ordinalSide, 0);
+ };
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public boolean isFireSource(World world, int x, int y, int z, ForgeDirection side) {
+ return (side == ForgeDirection.UP && getDamageValue(world, x, y, z) / 1000 % 16 == 1);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public MapColor getMapColor(int meta) {
+ return meta == 1 ? MapColor.netherrackColor : MapColor.stoneColor;
+ }
+
+ @Override
+ public int getBaseBlockHarvestLevel(int aMeta) {
+ return switch (aMeta) {
+ case 3, 4 -> 3;
+ default -> 0;
+ };
+ }
+
+ @Override
+ public Block getDroppedBlock() {
+ return GregTech_API.sBlockOres1;
+ }
+
+ @Override
+ public Materials[] getDroppedDusts() { // Must have 8 entries; can be null.
+ return new Materials[] { Materials.Stone, Materials.Netherrack, Materials.Endstone, Materials.GraniteBlack,
+ Materials.GraniteRed, Materials.Marble, Materials.Basalt, Materials.Stone };
+ }
+
+ @Override
+ public boolean[] getEnabledMetas() {
+ return new boolean[] { true, true, true, GT_Mod.gregtechproxy.enableBlackGraniteOres,
+ GT_Mod.gregtechproxy.enableRedGraniteOres, GT_Mod.gregtechproxy.enableMarbleOres,
+ GT_Mod.gregtechproxy.enableBasaltOres, true };
+ }
+
+ @Override
+ public ITexture[] getTextureSet() {
+ final ITexture[] rTextures = new ITexture[16]; // Must have 16 entries.
+ Arrays.fill(rTextures, TextureFactory.of(Blocks.stone));
+ rTextures[1] = TextureFactory.of(Blocks.netherrack);
+ rTextures[2] = TextureFactory.of(Blocks.end_stone);
+ rTextures[3] = TextureFactory.builder()
+ .addIcon(GRANITE_BLACK_STONE)
+ .stdOrient()
+ .build();
+ rTextures[4] = TextureFactory.builder()
+ .addIcon(GRANITE_RED_STONE)
+ .stdOrient()
+ .build();
+ rTextures[5] = TextureFactory.builder()
+ .addIcon(MARBLE_STONE)
+ .stdOrient()
+ .build();
+ rTextures[6] = TextureFactory.builder()
+ .addIcon(BASALT_STONE)
+ .stdOrient()
+ .build();
+ return rTextures;
+ }
+
+ @Override
+ public void harvestBlock(World worldIn, EntityPlayer player, int x, int y, int z, int meta) {
+
+ if (EnchantmentHelper.getSilkTouchModifier(player)) {
+ GT_TileEntity_Ores.shouldSilkTouch = true;
+ super.harvestBlock(worldIn, player, x, y, z, meta);
+
+ if (GT_TileEntity_Ores.shouldSilkTouch) {
+ GT_TileEntity_Ores.shouldSilkTouch = false;
+ }
+ return;
+ }
+
+ if (!(player instanceof FakePlayer)) {
+ GT_TileEntity_Ores.shouldFortune = true;
+ }
+ super.harvestBlock(worldIn, player, x, y, z, meta);
+ if (GT_TileEntity_Ores.shouldFortune) {
+ GT_TileEntity_Ores.shouldFortune = false;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java
new file mode 100644
index 0000000000..8e68c5c39a
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java
@@ -0,0 +1,324 @@
+package gregtech.common.blocks;
+
+import static gregtech.api.enums.Mods.NotEnoughItems;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.ITileEntityProvider;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.particle.EffectRenderer;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.boss.EntityDragon;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.items.GT_Generic_Block;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.render.GT_Renderer_Block;
+
+public abstract class GT_Block_Ores_Abstract extends GT_Generic_Block implements ITileEntityProvider {
+
+ private static final String DOT_NAME = ".name";
+ private static final String DOT_TOOLTIP = ".tooltip";
+ public static ThreadLocal<GT_TileEntity_Ores> mTemporaryTileEntity = new ThreadLocal<>();
+ public static boolean FUCKING_LOCK = false;
+ public static boolean tHideOres;
+ public static Set<Materials> aBlockedOres = new HashSet<>();
+
+ protected GT_Block_Ores_Abstract(String aUnlocalizedName, int aOreMetaCount, boolean aHideFirstMeta,
+ Material aMaterial) {
+ super(GT_Item_Ores.class, aUnlocalizedName, aMaterial);
+ this.isBlockContainer = true;
+ setStepSound(soundTypeStone);
+ setCreativeTab(GregTech_API.TAB_GREGTECH_ORES);
+ tHideOres = NotEnoughItems.isModLoaded() && GT_Mod.gregtechproxy.mHideUnusedOres;
+ if (aOreMetaCount > 8 || aOreMetaCount < 0) aOreMetaCount = 8;
+
+ for (int i = 0; i < 16; i++) {
+ GT_ModHandler.addValuableOre(this, i, 1);
+ }
+ for (int i = 1; i < GregTech_API.sGeneratedMaterials.length; i++) {
+ if (GregTech_API.sGeneratedMaterials[i] != null) {
+ for (int j = 0; j < aOreMetaCount; j++) {
+ if (!this.getEnabledMetas()[j]) continue;
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + "." + (i + (j * 1000)) + DOT_NAME,
+ GT_LanguageManager.i18nPlaceholder ? getLocalizedNameFormat(GregTech_API.sGeneratedMaterials[i])
+ : getLocalizedName(GregTech_API.sGeneratedMaterials[i]));
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + "." + (i + (j * 1000)) + DOT_TOOLTIP,
+ GregTech_API.sGeneratedMaterials[i].getToolTip());
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + "." + ((i + 16000) + (j * 1000)) + DOT_NAME,
+ "Small " + (GT_LanguageManager.i18nPlaceholder
+ ? getLocalizedNameFormat(GregTech_API.sGeneratedMaterials[i])
+ : getLocalizedName(GregTech_API.sGeneratedMaterials[i])));
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + "." + ((i + 16000) + (j * 1000)) + DOT_TOOLTIP,
+ GregTech_API.sGeneratedMaterials[i].getToolTip());
+ if ((GregTech_API.sGeneratedMaterials[i].mTypes & 0x8) != 0
+ && !aBlockedOres.contains(GregTech_API.sGeneratedMaterials[i])) {
+ GT_OreDictUnificator.registerOre(
+ this.getProcessingPrefix()[j] != null
+ ? this.getProcessingPrefix()[j].get(GregTech_API.sGeneratedMaterials[i])
+ : "",
+ new ItemStack(this, 1, i + (j * 1000)));
+ if (tHideOres) {
+ if (!(j == 0 && !aHideFirstMeta)) {
+ codechicken.nei.api.API.hideItem(new ItemStack(this, 1, i + (j * 1000)));
+ }
+ codechicken.nei.api.API.hideItem(new ItemStack(this, 1, (i + 16000) + (j * 1000)));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public int getBaseBlockHarvestLevel(int aMeta) {
+ return 0;
+ }
+
+ @Override
+ public void onNeighborChange(IBlockAccess aWorld, int aX, int aY, int aZ, int aTileX, int aTileY, int aTileZ) {
+ if (!FUCKING_LOCK) {
+ FUCKING_LOCK = true;
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if ((tTileEntity instanceof GT_TileEntity_Ores)) {
+ ((GT_TileEntity_Ores) tTileEntity).onUpdated();
+ }
+ }
+ FUCKING_LOCK = false;
+ }
+
+ @Override
+ public void onNeighborBlockChange(World aWorld, int aX, int aY, int aZ, Block aBlock) {
+ if (!FUCKING_LOCK) {
+ FUCKING_LOCK = true;
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if ((tTileEntity instanceof GT_TileEntity_Ores)) {
+ ((GT_TileEntity_Ores) tTileEntity).onUpdated();
+ }
+ }
+ FUCKING_LOCK = false;
+ }
+
+ public String getLocalizedNameFormat(Materials aMaterial) {
+ return switch (aMaterial.mName) {
+ case "InfusedAir", "InfusedDull", "InfusedEarth", "InfusedEntropy", "InfusedFire", "InfusedOrder", "InfusedVis", "InfusedWater" -> "%material Infused Stone";
+ case "Vermiculite", "Bentonite", "Kaolinite", "Talc", "BasalticMineralSand", "GraniticMineralSand", "GlauconiteSand", "CassiteriteSand", "GarnetSand", "QuartzSand", "Pitchblende", "FullersEarth" -> "%material";
+ default -> "%material" + OrePrefixes.ore.mLocalizedMaterialPost;
+ };
+ }
+
+ public String getLocalizedName(Materials aMaterial) {
+ return aMaterial.getDefaultLocalizedNameForItem(getLocalizedNameFormat(aMaterial));
+ }
+
+ @Override
+ public boolean onBlockActivated(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer, int ordinalSide,
+ float aOffsetX, float aOffsetY, float aOffsetZ) {
+ if (!aPlayer.isSneaking() || !aPlayer.capabilities.isCreativeMode) {
+ return false;
+ }
+
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (!(tTileEntity instanceof GT_TileEntity_Ores)) {
+ return false;
+ }
+
+ boolean tNatural = (((GT_TileEntity_Ores) tTileEntity).mNatural = !((GT_TileEntity_Ores) tTileEntity).mNatural);
+ GT_Utility.sendChatToPlayer(aPlayer, "Ore \"mNatural\" flag set to: " + tNatural);
+ return true;
+ }
+
+ @Override
+ public boolean onBlockEventReceived(World p_149696_1_, int p_149696_2_, int p_149696_3_, int p_149696_4_,
+ int p_149696_5_, int p_149696_6_) {
+ super.onBlockEventReceived(p_149696_1_, p_149696_2_, p_149696_3_, p_149696_4_, p_149696_5_, p_149696_6_);
+ TileEntity tileentity = p_149696_1_.getTileEntity(p_149696_2_, p_149696_3_, p_149696_4_);
+ return tileentity != null && tileentity.receiveClientEvent(p_149696_5_, p_149696_6_);
+ }
+
+ @Override
+ public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) {
+ return (!(entity instanceof EntityDragon)) && (super.canEntityDestroy(world, x, y, z, entity));
+ }
+
+ @Override
+ public String getHarvestTool(int aMeta) {
+ return aMeta < 8 ? "pickaxe" : "shovel";
+ }
+
+ @Override
+ public int getHarvestLevel(int aMeta) {
+ return aMeta == 5 || aMeta == 6 ? 2 : aMeta % 8;
+ }
+
+ @Override
+ public float getBlockHardness(World aWorld, int aX, int aY, int aZ) {
+ return 1.0F + getHarvestLevel(aWorld.getBlockMetadata(aX, aY, aZ)) * 1.0F;
+ }
+
+ @Override
+ public float getExplosionResistance(Entity entity, World aWorld, int aX, int aY, int aZ, double explosionX,
+ double explosionY, double explosionZ) {
+ return 1.0F + getHarvestLevel(aWorld.getBlockMetadata(aX, aY, aZ)) * 1.0F;
+ }
+
+ @Override
+ protected boolean canSilkHarvest() {
+ return false;
+ }
+
+ @Override
+ public abstract String getUnlocalizedName();
+
+ @Override
+ public String getLocalizedName() {
+ return StatCollector.translateToLocal(getUnlocalizedName() + DOT_NAME);
+ }
+
+ @Override
+ public int getRenderType() {
+ if (GT_Renderer_Block.INSTANCE == null) {
+ return super.getRenderType();
+ }
+ return GT_Renderer_Block.INSTANCE.mRenderID;
+ }
+
+ @Override
+ public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return false;
+ }
+
+ @Override
+ public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return true;
+ }
+
+ @Override
+ public boolean hasTileEntity(int aMeta) {
+ return true;
+ }
+
+ @Override
+ public TileEntity createNewTileEntity(World aWorld, int aMeta) {
+ return createTileEntity(aWorld, aMeta);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(IBlockAccess aIBlockAccess, int aX, int aY, int aZ, int ordinalSide) {
+ return Blocks.stone.getIcon(0, 0);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return Blocks.stone.getIcon(0, 0);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister aIconRegister) {}
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean addHitEffects(World worldObj, MovingObjectPosition target, EffectRenderer effectRenderer) {
+ GT_Renderer_Block
+ .addHitEffects(effectRenderer, this, worldObj, target.blockX, target.blockY, target.blockZ, target.sideHit);
+ return true;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean addDestroyEffects(World world, int x, int y, int z, int meta, EffectRenderer effectRenderer) {
+ GT_Renderer_Block.addDestroyEffects(effectRenderer, this, world, x, y, z);
+ return true;
+ }
+
+ @Override
+ public int getDamageValue(World aWorld, int aX, int aY, int aZ) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (((tTileEntity instanceof GT_TileEntity_Ores))) {
+ return ((GT_TileEntity_Ores) tTileEntity).getMetaData();
+ }
+ return 0;
+ }
+
+ @Override
+ public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetadata) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if ((tTileEntity instanceof GT_TileEntity_Ores)) {
+ mTemporaryTileEntity.set((GT_TileEntity_Ores) tTileEntity);
+ }
+ super.breakBlock(aWorld, aX, aY, aZ, aBlock, aMetadata);
+ aWorld.removeTileEntity(aX, aY, aZ);
+ }
+
+ public abstract OrePrefixes[] getProcessingPrefix(); // Must have 8 entries; an entry can be null to disable
+ // automatic recipes.
+
+ public abstract boolean[] getEnabledMetas(); // Must have 8 entries.
+
+ public abstract Block getDroppedBlock();
+
+ public abstract Materials[] getDroppedDusts(); // Must have 8 entries; can be null.
+
+ @Override
+ public ArrayList<ItemStack> getDrops(World aWorld, int aX, int aY, int aZ, int aMeta, int aFortune) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if ((tTileEntity instanceof GT_TileEntity_Ores)) {
+ return ((GT_TileEntity_Ores) tTileEntity).getDrops(getDroppedBlock(), aFortune);
+ }
+ return mTemporaryTileEntity.get() == null ? new ArrayList<>()
+ : mTemporaryTileEntity.get()
+ .getDrops(getDroppedBlock(), aFortune);
+ }
+
+ @Override
+ public TileEntity createTileEntity(World aWorld, int aMeta) {
+ return new GT_TileEntity_Ores();
+ }
+
+ public abstract ITexture[] getTextureSet(); // Must have 16 entries.
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(Item aItem, CreativeTabs aTab, List<ItemStack> aList) {
+ for (int i = 0; i < GregTech_API.sGeneratedMaterials.length; i++) {
+ Materials tMaterial = GregTech_API.sGeneratedMaterials[i];
+ if ((tMaterial != null) && ((tMaterial.mTypes & 0x8) != 0) && !aBlockedOres.contains(tMaterial)) {
+ for (int meta = i; meta < 23000 + i; meta += 1000) {
+ if (!(new ItemStack(aItem, 1, meta).getDisplayName()
+ .contains(DOT_NAME))) aList.add(new ItemStack(aItem, 1, meta));
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Reinforced.java b/src/main/java/gregtech/common/blocks/GT_Block_Reinforced.java
new file mode 100644
index 0000000000..a78fe5b70d
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Reinforced.java
@@ -0,0 +1,409 @@
+package gregtech.common.blocks;
+
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.entity.boss.EntityWither;
+import net.minecraft.entity.item.EntityTNTPrimed;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.Explosion;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.items.GT_Generic_Block;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.WorldSpawnedEventBuilder;
+
+public class GT_Block_Reinforced extends GT_Generic_Block {
+
+ public GT_Block_Reinforced(String aName) {
+ super(GT_Item_Storage.class, aName, new GT_Material_Reinforced());
+ for (int i = 0; i < 16; i++) {
+ Textures.BlockIcons.casingTexturePages[1][i + 80] = TextureFactory.of(this, i);
+ }
+ setStepSound(soundTypeStone);
+ setCreativeTab(GregTech_API.TAB_GREGTECH);
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Bronzeplate Reinforced Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Iridium Reinforced Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Plascrete Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Tungstensteel Reinforced Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Brittle Charcoal");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Powderbarrel");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Solid Super Fuel");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Magic Solid Super Fuel");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Steel Reinforced Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Titanium Reinforced Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Naquadah Reinforced Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Neutronium Reinforced Block");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Raw Deep Dark Portal Block");
+ ItemList.Block_BronzePlate.set(
+ new ItemStack(
+ this.setHardness(60.0f)
+ .setResistance(150.0f),
+ 1,
+ 0));
+ ItemList.Block_IridiumTungstensteel.set(
+ new ItemStack(
+ this.setHardness(400.0f)
+ .setResistance(600.0f),
+ 1,
+ 1));
+ ItemList.Block_Plascrete.set(
+ new ItemStack(
+ this.setHardness(5.0f)
+ .setResistance(6.0f),
+ 1,
+ 2));
+ ItemList.Block_TungstenSteelReinforced.set(
+ new ItemStack(
+ this.setHardness(250.0f)
+ .setResistance(400.0f),
+ 1,
+ 3));
+ ItemList.Block_BrittleCharcoal.set(
+ new ItemStack(
+ this.setHardness(0.5f)
+ .setResistance(8.0f),
+ 1,
+ 4));
+ ItemList.Block_Powderbarrel.set(
+ new ItemStack(
+ this.setHardness(2.5f)
+ .setResistance(2.0f),
+ 1,
+ 5));
+ ItemList.Block_SSFUEL.set(
+ new ItemStack(
+ this.setHardness(2.5f)
+ .setResistance(2.0f),
+ 1,
+ 6));
+ ItemList.Block_MSSFUEL.set(
+ new ItemStack(
+ this.setHardness(2.5f)
+ .setResistance(2.0f),
+ 1,
+ 7));
+ ItemList.Block_SteelPlate.set(
+ new ItemStack(
+ this.setHardness(150.0f)
+ .setResistance(200.0f),
+ 1,
+ 8));
+ ItemList.Block_TitaniumPlate.set(
+ new ItemStack(
+ this.setHardness(200.0f)
+ .setResistance(300.0f),
+ 1,
+ 9));
+ ItemList.Block_NaquadahPlate.set(
+ new ItemStack(
+ this.setHardness(500.0f)
+ .setResistance(1000.0f),
+ 1,
+ 10));
+ ItemList.Block_NeutroniumPlate.set(
+ new ItemStack(
+ this.setHardness(750.0f)
+ .setResistance(2500.0f),
+ 1,
+ 11));
+ ItemList.Block_BedrockiumCompressed.set(
+ new ItemStack(
+ this.setHardness(1500.0f)
+ .setResistance(5000.0f),
+ 1,
+ 12));
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Items.coal, 1, 1),
+ new Object[] { ItemList.Block_BrittleCharcoal.get(1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Block_Powderbarrel.get(1L),
+ GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "WSW", "GGG", "WGW", 'W', OrePrefixes.plate.get(Materials.Wood), 'G',
+ new ItemStack(Items.gunpowder, 1), 'S', new ItemStack(Items.string, 1) });
+ }
+
+ @Override
+ public String getHarvestTool(int aMeta) {
+ if (aMeta == 5 || aMeta == 4 || aMeta == 6 || aMeta == 7) return "axe";
+ if (aMeta == 2) return "wrench";
+ return "pickaxe";
+ }
+
+ @Override
+ public int getHarvestLevel(int aMeta) {
+ if (aMeta == 4 || aMeta == 5 || aMeta == 6 || aMeta == 7) return 1;
+ if (aMeta == 2) return 2;
+ if (aMeta == 9 || aMeta == 3 || aMeta == 1) return 5;
+ if (aMeta == 10 || aMeta == 11) return 7;
+ return 4;
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ switch (aMeta) {
+ case 0 -> {
+ return Textures.BlockIcons.BLOCK_BRONZEPREIN.getIcon();
+ }
+ case 1 -> {
+ return Textures.BlockIcons.BLOCK_IRREIN.getIcon();
+ }
+ case 2 -> {
+ return Textures.BlockIcons.BLOCK_PLASCRETE.getIcon();
+ }
+ case 3 -> {
+ return Textures.BlockIcons.BLOCK_TSREIN.getIcon();
+ }
+ case 4, 6, 7 -> {
+ return Blocks.coal_block.getIcon(0, 0);
+ }
+ case 5 -> {
+ return Textures.BlockIcons.COVER_WOOD_PLATE.getIcon();
+ }
+ case 8 -> {
+ return Textures.BlockIcons.BLOCK_STEELPREIN.getIcon();
+ }
+ case 9 -> {
+ return Textures.BlockIcons.BLOCK_TITANIUMPREIN.getIcon();
+ }
+ case 10 -> {
+ return Textures.BlockIcons.BLOCK_NAQUADAHPREIN.getIcon();
+ }
+ case 11 -> {
+ return Textures.BlockIcons.BLOCK_NEUTRONIUMPREIN.getIcon();
+ }
+ case 12 -> {
+ return Textures.BlockIcons.BLOCK_DEEP_DARK_RAW.getIcon();
+ }
+ }
+ }
+ return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ }
+
+ @Override
+ public float getBlockHardness(World aWorld, int aX, int aY, int aZ) {
+ if (aWorld == null) {
+ return 0.0F;
+ }
+ if (aWorld.isAirBlock(aX, aY, aZ)) {
+ return 0.0F;
+ }
+ int tMeta = aWorld.getBlockMetadata(aX, aY, aZ);
+ if (tMeta == 0) {
+ return 60.0F;
+ }
+ if (tMeta == 1) {
+ return 400.0F;
+ }
+ if (tMeta == 2) {
+ return 5.0F;
+ }
+ if (tMeta == 3) {
+ return 250.0F;
+ }
+ if (tMeta == 4 || tMeta == 5 || tMeta == 6 || tMeta == 7) {
+ return 0.5F;
+ }
+ if (tMeta == 8) {
+ return 150.0F;
+ }
+ if (tMeta == 9) {
+ return 200.0F;
+ }
+ if (tMeta == 10) {
+ return 500.0F;
+ }
+ if (tMeta == 11) {
+ return 750.0F;
+ }
+ return Blocks.iron_block.getBlockHardness(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public float getExplosionResistance(Entity entity, World world, int x, int y, int z, double explosionX,
+ double explosionY, double explosionZ) {
+ if (world == null) {
+ return 0.0F;
+ }
+ int tMeta = world.getBlockMetadata(x, y, z);
+ if (tMeta == 0) {
+ return 150.0F;
+ }
+ if (tMeta == 1) {
+ return 600.0F;
+ }
+ if (tMeta == 2) {
+ return 6.0F;
+ }
+ if (tMeta == 3) {
+ return 400.0F;
+ }
+ if (tMeta == 4 || tMeta == 6 || tMeta == 7) {
+ return 8.0F;
+ }
+ if (tMeta == 5) {
+ return 1.0F;
+ }
+ if (tMeta == 8) {
+ return 200.0F;
+ }
+ if (tMeta == 9) {
+ return 300.0F;
+ }
+ if (tMeta == 10) {
+ return 1000.0F;
+ }
+ if (tMeta == 11) {
+ return 2500.0F;
+ }
+ return super.getExplosionResistance(entity, world, x, y, z, explosionX, explosionY, explosionZ);
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return this.mUnlocalizedName;
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return StatCollector.translateToLocal(this.mUnlocalizedName + ".name");
+ }
+
+ @Override
+ public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return false;
+ }
+
+ @Override
+ public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return true;
+ }
+
+ @Override
+ public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) {
+ return false;
+ }
+
+ @Override
+ public int damageDropped(int metadata) {
+ return metadata;
+ }
+
+ @Override
+ public int getDamageValue(World aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlockMetadata(aX, aY, aZ);
+ }
+
+ @Override
+ public void dropBlockAsItemWithChance(World aWorld, int aX, int aY, int aZ, int aMetadata, float chance,
+ int aFortune) {
+ if (aMetadata == 4) {
+ this.dropBlockAsItem(aWorld, aX, aY, aZ, new ItemStack(Items.coal, XSTR_INSTANCE.nextInt(2) + 1, 1));
+ } else {
+ super.dropBlockAsItemWithChance(aWorld, aX, aY, aZ, aMetadata, chance, aFortune);
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z) {
+ if (!world.isRemote && world.getBlockMetadata(x, y, z) == 5) {
+ EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, x + 0.5F, y + 0.5F, z + 0.5F, player);
+ world.spawnEntityInWorld(entitytntprimed);
+ new WorldSpawnedEventBuilder.SoundAtEntityEventBuilder().setPitch(1f)
+ .setVolume(1f)
+ .setIdentifier(SoundResource.GAME_TNT_PRIMED)
+ .setEntity(entitytntprimed)
+ .setWorld(world)
+ .run();
+ world.setBlockToAir(x, y, z);
+ return false;
+ }
+ return super.removedByPlayer(world, player, x, y, z);
+ }
+
+ @Override
+ public void onBlockAdded(World world, int x, int y, int z) {
+ super.onBlockAdded(world, x, y, z);
+ if (world.isBlockIndirectlyGettingPowered(x, y, z) && world.getBlockMetadata(x, y, z) == 5) {
+ removedByPlayer(world, null, x, y, z);
+ }
+ }
+
+ @Override
+ public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) {
+ if (world.isBlockIndirectlyGettingPowered(x, y, z) && world.getBlockMetadata(x, y, z) == 5) {
+ removedByPlayer(world, null, x, y, z);
+ }
+ }
+
+ @Override
+ public void onBlockExploded(World world, int x, int y, int z, Explosion explosion) {
+ if (!world.isRemote && world.getBlockMetadata(x, y, z) == 5) {
+ EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(
+ world,
+ x + 0.5F,
+ y + 0.5F,
+ z + 0.5F,
+ explosion.getExplosivePlacedBy());
+ entitytntprimed.fuse = (world.rand.nextInt(entitytntprimed.fuse / 4) + entitytntprimed.fuse / 8);
+ world.spawnEntityInWorld(entitytntprimed);
+ }
+ super.onBlockExploded(world, x, y, z, explosion);
+ }
+
+ @Override
+ public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int ordinalSide,
+ float xOffset, float yOffset, float zOffset) {
+ if ((player.getCurrentEquippedItem() != null) && (player.getCurrentEquippedItem()
+ .getItem() == Items.flint_and_steel) && world.getBlockMetadata(x, y, z) == 5) {
+ removedByPlayer(world, player, x, y, z);
+
+ return true;
+ }
+ return super.onBlockActivated(world, x, y, z, player, ordinalSide, xOffset, yOffset, zOffset);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister aIconRegister) {}
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ for (int i = 0; i < 16; i++) {
+ ItemStack aStack = new ItemStack(aItem, 1, i);
+ if (!aStack.getDisplayName()
+ .contains(".name")) aList.add(aStack);
+ }
+ }
+
+ @Override
+ public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) {
+ return !(entity instanceof EntityWither);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Stones.java b/src/main/java/gregtech/common/blocks/GT_Block_Stones.java
new file mode 100644
index 0000000000..4ca52aee56
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Stones.java
@@ -0,0 +1,62 @@
+package gregtech.common.blocks;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class GT_Block_Stones extends GT_Block_Stones_Abstract {
+
+ public GT_Block_Stones() {
+ super(GT_Item_Granites.class, "gt.blockstones");
+ setResistance(60.0F);
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Marble");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Marble Cobblestone");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Mossy Marble Cobblestone");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Marble Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Cracked Marble Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Mossy Marble Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Chiseled Marble");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Smooth Marble");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Basalt");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Basalt Cobblestone");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Mossy Basalt Cobblestone");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Basalt Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Cracked Basalt Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "Mossy Basalt Bricks");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "Chiseled Basalt");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Smooth Basalt");
+ for (int i = 0; i < 16; i++) {
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.stone, i < 8 ? Materials.Marble : Materials.Basalt, new ItemStack(this, 1, i));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.block, i < 8 ? Materials.Marble : Materials.Basalt, new ItemStack(this, 1, i));
+ GT_OreDictUnificator.registerOre(
+ (i < 8 ? Materials.Marble.mName.toLowerCase() : Materials.Basalt.mName.toLowerCase()),
+ new ItemStack(this, 1, i));
+ }
+ }
+
+ @Override
+ public int getHarvestLevel(int aMeta) {
+ return 2;
+ }
+
+ @Override
+ public float getBlockHardness(World aWorld, int aX, int aY, int aZ) {
+ return this.blockHardness = Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ) * 3.0F;
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ return gregtech.api.enums.Textures.BlockIcons.STONES[aMeta].getIcon();
+ }
+ return gregtech.api.enums.Textures.BlockIcons.STONES[0].getIcon();
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Stones_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Block_Stones_Abstract.java
new file mode 100644
index 0000000000..4a5bb9456e
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Stones_Abstract.java
@@ -0,0 +1,250 @@
+package gregtech.common.blocks;
+
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import java.util.List;
+
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OreDictNames;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IOreRecipeRegistrator;
+import gregtech.api.items.GT_Generic_Block;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+
+public class GT_Block_Stones_Abstract extends GT_Generic_Block implements IOreRecipeRegistrator {
+
+ public GT_Block_Stones_Abstract(Class<? extends ItemBlock> aItemClass, String aName) {
+ super(aItemClass, aName, Material.rock);
+ OrePrefixes.crafting.add(this);
+ setStepSound(soundTypeStone);
+ setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS);
+
+ this.registerSmeltingRecipes();
+ this.registerAssemblerRecipes();
+ this.registerCraftingRecipes();
+ this.registerForgeHammerRecipes();
+
+ }
+
+ private void registerSmeltingRecipes() {
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 0), new ItemStack(this, 1, 7));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 1), new ItemStack(this, 1, 0));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 2), new ItemStack(this, 1, 0));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 3), new ItemStack(this, 1, 0));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 4), new ItemStack(this, 1, 0));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 5), new ItemStack(this, 1, 0));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 6), new ItemStack(this, 1, 0));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 7), new ItemStack(this, 1, 0));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 8), new ItemStack(this, 1, 15));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 9), new ItemStack(this, 1, 8));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 10), new ItemStack(this, 1, 8));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 11), new ItemStack(this, 1, 8));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 12), new ItemStack(this, 1, 8));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 13), new ItemStack(this, 1, 8));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 14), new ItemStack(this, 1, 8));
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(this, 1, 15), new ItemStack(this, 1, 8));
+
+ }
+
+ private void registerAssemblerRecipes() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(this, 1, 0), GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(new ItemStack(this, 1, 3))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(this, 1, 8), GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(new ItemStack(this, 1, 11))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+ }
+
+ private void registerCraftingRecipes() {
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(this, 1, 6),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "f", "X", 'X', new ItemStack(this, 1, 7) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(this, 1, 14),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "f", "X", 'X', new ItemStack(this, 1, 15) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(this, 1, 4),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "h", "X", 'X', new ItemStack(this, 1, 3) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(this, 1, 12),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "h", "X", 'X', new ItemStack(this, 1, 11) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(this, 1, 1),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "h", "X", 'X', new ItemStack(this, 1, 0) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(this, 1, 9),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "h", "X", 'X', new ItemStack(this, 1, 8) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(this, 4, 3),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "XX", "XX", 'X', new ItemStack(this, 4, 0) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(this, 4, 11),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "XX", "XX", 'X', new ItemStack(this, 4, 8) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(this, 4, 3),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "XX", "XX", 'X', new ItemStack(this, 4, 7) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(this, 4, 11),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "XX", "XX", 'X', new ItemStack(this, 4, 15) });
+ }
+
+ private void registerForgeHammerRecipes() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(this, 1, 3))
+ .itemOutputs(new ItemStack(this, 1, 4))
+ .duration(16 * TICKS)
+ .eut(10)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(this, 1, 11))
+ .itemOutputs(new ItemStack(this, 1, 12))
+ .duration(16 * TICKS)
+ .eut(10)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(this, 1, 0))
+ .itemOutputs(new ItemStack(this, 1, 1))
+ .duration(16 * TICKS)
+ .eut(10)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(this, 1, 8))
+ .itemOutputs(new ItemStack(this, 1, 9))
+ .duration(16 * TICKS)
+ .eut(10)
+ .addTo(hammerRecipes);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (aOreDictName.equals(OreDictNames.craftingLensWhite.toString())) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(this, 1, 7), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(new ItemStack(this, 1, 6))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(this, 1, 15), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(new ItemStack(this, 1, 14))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(laserEngraverRecipes);
+
+ }
+ }
+
+ @Override
+ public String getHarvestTool(int aMeta) {
+ return "pickaxe";
+ }
+
+ @Override
+ public int getHarvestLevel(int aMeta) {
+ return 1;
+ }
+
+ @Override
+ public float getBlockHardness(World aWorld, int aX, int aY, int aZ) {
+ return this.blockHardness = Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ) * 3.0F;
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return this.mUnlocalizedName;
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return StatCollector.translateToLocal(this.mUnlocalizedName + ".name");
+ }
+
+ @Override
+ public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return false;
+ }
+
+ @Override
+ public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return true;
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ return gregtech.api.enums.Textures.BlockIcons.GRANITES[aMeta].getIcon();
+ }
+ return null;
+ }
+
+ @Override
+ public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) {
+ return world.getBlockMetadata(x, y, z) % 8 < 3;
+ }
+
+ @Override
+ public int damageDropped(int metadata) {
+ return metadata % 8 == 0 ? metadata + 1 : metadata;
+ }
+
+ @Override
+ public int getDamageValue(World aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlockMetadata(aX, aY, aZ);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister aIconRegister) {}
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ for (int i = 0; i < 16; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Storage.java b/src/main/java/gregtech/common/blocks/GT_Block_Storage.java
new file mode 100644
index 0000000000..ada3f01cde
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Block_Storage.java
@@ -0,0 +1,103 @@
+package gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.items.GT_Generic_Block;
+
+public class GT_Block_Storage extends GT_Generic_Block {
+
+ protected GT_Block_Storage(Class<? extends ItemBlock> aItemClass, String aName, Material aMaterial) {
+ super(aItemClass, aName, aMaterial);
+ setStepSound(soundTypeMetal);
+ setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS);
+ }
+
+ @Override
+ public String getHarvestTool(int aMeta) {
+ return "pickaxe";
+ }
+
+ @Override
+ public boolean isBeaconBase(IBlockAccess worldObj, int x, int y, int z, int beaconX, int beaconY, int beaconZ) {
+ return true;
+ }
+
+ @Override
+ public int getHarvestLevel(int aMeta) {
+ return 1;
+ }
+
+ @Override
+ public float getBlockHardness(World aWorld, int aX, int aY, int aZ) {
+ return Blocks.iron_block.getBlockHardness(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public float getExplosionResistance(Entity aTNT) {
+ return Blocks.iron_block.getExplosionResistance(aTNT);
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return this.mUnlocalizedName;
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return StatCollector.translateToLocal(this.mUnlocalizedName + ".name");
+ }
+
+ @Override
+ public boolean canBeReplacedByLeaves(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return false;
+ }
+
+ @Override
+ public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return true;
+ }
+
+ @Override
+ public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) {
+ return true;
+ }
+
+ @Override
+ public int damageDropped(int metadata) {
+ return metadata;
+ }
+
+ @Override
+ public int getDamageValue(World aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlockMetadata(aX, aY, aZ);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister aIconRegister) {}
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ for (int i = 0; i < 16; i++) {
+ if (!(new ItemStack(aItem, 1, i).getDisplayName()
+ .contains(".name"))) aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Cyclotron_Coils.java b/src/main/java/gregtech/common/blocks/GT_Cyclotron_Coils.java
new file mode 100644
index 0000000000..1a544f027f
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Cyclotron_Coils.java
@@ -0,0 +1,127 @@
+package gregtech.common.blocks;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.util.GT_LanguageManager;
+
+public class GT_Cyclotron_Coils extends GT_Block_Casings_Abstract {
+
+ public GT_Cyclotron_Coils() {
+ super(GT_Cyclotron_Item_Casings.class, "gt.blockcasings.cyclotron_coils", GT_Material_Casings.INSTANCE, 16);
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "MV Solenoid Superconductor Coil");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "HV Solenoid Superconductor Coil");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "EV Solenoid Superconductor Coil");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "IV Solenoid Superconductor Coil");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "LuV Solenoid Superconductor Coil");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "ZPM Solenoid Superconductor Coil");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "UV Solenoid Superconductor Coil");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "UHV Solenoid Superconductor Coil");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "UEV Solenoid Superconductor Coil");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "UIV Solenoid Superconductor Coil");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "UMV Solenoid Superconductor Coil");
+
+ ItemList.Superconducting_Magnet_Solenoid_MV.set(new ItemStack(this, 1, 0));
+ ItemList.Superconducting_Magnet_Solenoid_HV.set(new ItemStack(this, 1, 1));
+ ItemList.Superconducting_Magnet_Solenoid_EV.set(new ItemStack(this, 1, 2));
+ ItemList.Superconducting_Magnet_Solenoid_IV.set(new ItemStack(this, 1, 3));
+ ItemList.Superconducting_Magnet_Solenoid_LuV.set(new ItemStack(this, 1, 4));
+ ItemList.Superconducting_Magnet_Solenoid_ZPM.set(new ItemStack(this, 1, 5));
+ ItemList.Superconducting_Magnet_Solenoid_UV.set(new ItemStack(this, 1, 6));
+ ItemList.Superconducting_Magnet_Solenoid_UHV.set(new ItemStack(this, 1, 7));
+ ItemList.Superconducting_Magnet_Solenoid_UEV.set(new ItemStack(this, 1, 8));
+ ItemList.Superconducting_Magnet_Solenoid_UIV.set(new ItemStack(this, 1, 9));
+ ItemList.Superconducting_Magnet_Solenoid_UMV.set(new ItemStack(this, 1, 10));
+ }
+
+ @Override // Magic numbers...
+ public int getTextureIndex(int aMeta) {
+ return 192 + aMeta;
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ if ((aMeta >= 0) && (aMeta < 16)) {
+ switch (aMeta) {
+ case 0 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return Textures.BlockIcons.MV_TOP_CYCLOTRON_SOLENOID.getIcon();
+ }
+ return Textures.BlockIcons.MV_SIDE_CYCLOTRON_SOLENOID.getIcon();
+ }
+ case 1 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return Textures.BlockIcons.HV_TOP_CYCLOTRON_SOLENOID.getIcon();
+ }
+ return Textures.BlockIcons.HV_SIDE_CYCLOTRON_SOLENOID.getIcon();
+ }
+ case 2 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return Textures.BlockIcons.EV_TOP_CYCLOTRON_SOLENOID.getIcon();
+ }
+ return Textures.BlockIcons.EV_SIDE_CYCLOTRON_SOLENOID.getIcon();
+ }
+ case 3 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return Textures.BlockIcons.IV_TOP_CYCLOTRON_SOLENOID.getIcon();
+ }
+ return Textures.BlockIcons.IV_SIDE_CYCLOTRON_SOLENOID.getIcon();
+ }
+ case 4 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return Textures.BlockIcons.LuV_TOP_CYCLOTRON_SOLENOID.getIcon();
+ }
+ return Textures.BlockIcons.LuV_SIDE_CYCLOTRON_SOLENOID.getIcon();
+ }
+ case 5 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return Textures.BlockIcons.ZPM_TOP_CYCLOTRON_SOLENOID.getIcon();
+ }
+ return Textures.BlockIcons.ZPM_SIDE_CYCLOTRON_SOLENOID.getIcon();
+ }
+ case 6 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return Textures.BlockIcons.UV_TOP_CYCLOTRON_SOLENOID.getIcon();
+ }
+ return Textures.BlockIcons.UV_SIDE_CYCLOTRON_SOLENOID.getIcon();
+ }
+ case 7 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return Textures.BlockIcons.UHV_TOP_CYCLOTRON_SOLENOID.getIcon();
+ }
+ return Textures.BlockIcons.UHV_SIDE_CYCLOTRON_SOLENOID.getIcon();
+ }
+ case 8 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return Textures.BlockIcons.UEV_TOP_CYCLOTRON_SOLENOID.getIcon();
+ }
+ return Textures.BlockIcons.UEV_SIDE_CYCLOTRON_SOLENOID.getIcon();
+ }
+ case 9 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return Textures.BlockIcons.UIV_TOP_CYCLOTRON_SOLENOID.getIcon();
+ }
+ return Textures.BlockIcons.UIV_SIDE_CYCLOTRON_SOLENOID.getIcon();
+ }
+ case 10 -> {
+ if (ordinalSide == 0 || ordinalSide == 1) {
+ return Textures.BlockIcons.UMV_TOP_CYCLOTRON_SOLENOID.getIcon();
+ }
+ return Textures.BlockIcons.UMV_SIDE_CYCLOTRON_SOLENOID.getIcon();
+ }
+ }
+ }
+ return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ }
+
+ @Override
+ public int colorMultiplier(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlockMetadata(aX, aY, aZ) > 9 ? super.colorMultiplier(aWorld, aX, aY, aZ)
+ : gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[0] << 16 | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[1] << 8
+ | gregtech.api.enums.Dyes.MACHINE_METAL.mRGBa[2];
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Cyclotron_Item_Casings.java b/src/main/java/gregtech/common/blocks/GT_Cyclotron_Item_Casings.java
new file mode 100644
index 0000000000..f1ca45a805
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Cyclotron_Item_Casings.java
@@ -0,0 +1,10 @@
+package gregtech.common.blocks;
+
+import net.minecraft.block.Block;
+
+public class GT_Cyclotron_Item_Casings extends GT_Item_Casings_Abstract {
+
+ public GT_Cyclotron_Item_Casings(Block block) {
+ super(block);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings1.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings1.java
new file mode 100644
index 0000000000..1a86a2e534
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Casings1.java
@@ -0,0 +1,14 @@
+package gregtech.common.blocks;
+
+import net.minecraft.block.Block;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Item_Casings1 extends GT_Item_Casings_Abstract {
+
+ public GT_Item_Casings1(Block block) {
+ super(block);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings2.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings2.java
new file mode 100644
index 0000000000..f98c169c7f
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Casings2.java
@@ -0,0 +1,26 @@
+package gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Item_Casings2 extends GT_Item_Casings_Abstract {
+
+ public GT_Item_Casings2(Block block) {
+ super(block);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ if (getDamage(aStack) == 8) {
+ aList.add(this.mBlastProofTooltip);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings3.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings3.java
new file mode 100644
index 0000000000..861774d96f
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Casings3.java
@@ -0,0 +1,14 @@
+package gregtech.common.blocks;
+
+import net.minecraft.block.Block;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Item_Casings3 extends GT_Item_Casings_Abstract {
+
+ public GT_Item_Casings3(Block block) {
+ super(block);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings4.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings4.java
new file mode 100644
index 0000000000..e2badca2cb
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Casings4.java
@@ -0,0 +1,14 @@
+package gregtech.common.blocks;
+
+import net.minecraft.block.Block;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Item_Casings4 extends GT_Item_Casings_Abstract {
+
+ public GT_Item_Casings4(Block block) {
+ super(block);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings5.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings5.java
new file mode 100644
index 0000000000..3b3ab68cb1
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Casings5.java
@@ -0,0 +1,36 @@
+package gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.util.GT_LanguageManager;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Item_Casings5 extends GT_Item_Casings_Abstract {
+
+ public GT_Item_Casings5(Block block) {
+ super(block);
+ }
+
+ protected static final String mCoilHeatTooltip = GT_LanguageManager
+ .addStringLocalization("gt.coilheattooltip", "Base Heating Capacity = ");
+ protected static final String mCoilUnitTooltip = GT_LanguageManager
+ .addStringLocalization("gt.coilunittooltip", " Kelvin");
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ HeatingCoilLevel coilLevel = GT_Block_Casings5.getCoilHeatFromDamage(aStack.getItemDamage());
+ aList.add(mCoilHeatTooltip + coilLevel.getHeat() + mCoilUnitTooltip);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings6.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings6.java
new file mode 100644
index 0000000000..af533acfa8
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Casings6.java
@@ -0,0 +1,14 @@
+package gregtech.common.blocks;
+
+import net.minecraft.block.Block;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Item_Casings6 extends GT_Item_Casings_Abstract {
+
+ public GT_Item_Casings6(Block block) {
+ super(block);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings8.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings8.java
new file mode 100644
index 0000000000..e3f3bbdf97
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Casings8.java
@@ -0,0 +1,14 @@
+package gregtech.common.blocks;
+
+import net.minecraft.block.Block;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Item_Casings8 extends GT_Item_Casings_Abstract {
+
+ public GT_Item_Casings8(Block block) {
+ super(block);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings9.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings9.java
new file mode 100644
index 0000000000..678a2424be
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Casings9.java
@@ -0,0 +1,14 @@
+package gregtech.common.blocks;
+
+import net.minecraft.block.Block;
+
+/**
+ * The casings are split into separate files because they are registered as regular blocks, and a regular block can have
+ * 16 subtypes at most.
+ */
+public class GT_Item_Casings9 extends GT_Item_Casings_Abstract {
+
+ public GT_Item_Casings9(Block block) {
+ super(block);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Casings_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Item_Casings_Abstract.java
new file mode 100644
index 0000000000..46b0aba237
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Casings_Abstract.java
@@ -0,0 +1,63 @@
+package gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.util.GT_LanguageManager;
+
+public abstract class GT_Item_Casings_Abstract extends ItemBlock {
+
+ protected final String mNoMobsToolTip = GT_LanguageManager
+ .addStringLocalization("gt.nomobspawnsonthisblock", "Mobs cannot Spawn on this Block");
+ protected final String mNoTileEntityToolTip = GT_LanguageManager
+ .addStringLocalization("gt.notileentityinthisblock", "This is NOT a TileEntity!");
+ protected final String mCoil01Tooltip = GT_LanguageManager
+ .addStringLocalization("gt.coil01tooltip", "Base Heating Capacity = 1800 Kelvin");
+ protected final String mCoil02Tooltip = GT_LanguageManager
+ .addStringLocalization("gt.coil02tooltip", "Base Heating Capacity = 2700 Kelvin");
+ protected final String mCoil03Tooltip = GT_LanguageManager
+ .addStringLocalization("gt.coil03tooltip", "Base Heating Capacity = 3600 Kelvin");
+ protected final String mCoil04Tooltip = GT_LanguageManager
+ .addStringLocalization("gt.coil04tooltip", "Base Heating Capacity = 4500 Kelvin");
+ protected final String mCoil05Tooltip = GT_LanguageManager
+ .addStringLocalization("gt.coil05tooltip", "Base Heating Capacity = 5400 Kelvin");
+ protected final String mCoil06Tooltip = GT_LanguageManager
+ .addStringLocalization("gt.coil06tooltip", "Base Heating Capacity = 7200 Kelvin");
+ protected final String mCoil07Tooltip = GT_LanguageManager
+ .addStringLocalization("gt.coil07tooltip", "Base Heating Capacity = 9001 Kelvin");
+ protected final String mCoil08Tooltip = GT_LanguageManager
+ .addStringLocalization("gt.coil08tooltip", "Base Heating Capacity = 9900 Kelvin");
+ protected final String mCoil09Tooltip = GT_LanguageManager
+ .addStringLocalization("gt.coil09tooltip", "Base Heating Capacity = 10800 Kelvin");
+ protected final String mBlastProofTooltip = GT_LanguageManager
+ .addStringLocalization("gt.blastprooftooltip", "This Block is Blast Proof");
+
+ public GT_Item_Casings_Abstract(Block block) {
+ super(block);
+ setMaxDamage(0);
+ setHasSubtypes(true);
+ setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS);
+ }
+
+ @Override
+ public int getMetadata(int aMeta) {
+ return aMeta;
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack aStack) {
+ return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ aList.add(this.mNoMobsToolTip);
+ aList.add(this.mNoTileEntityToolTip);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Concretes.java b/src/main/java/gregtech/common/blocks/GT_Item_Concretes.java
new file mode 100644
index 0000000000..44c094aa41
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Concretes.java
@@ -0,0 +1,25 @@
+package gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.util.GT_LanguageManager;
+
+public class GT_Item_Concretes extends GT_Item_Stones_Abstract {
+
+ private final String mRunFasterToolTip = GT_LanguageManager
+ .addStringLocalization("gt.runfastertooltip", "You can walk faster on this Block");
+
+ public GT_Item_Concretes(Block block) {
+ super(block);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ aList.add(this.mRunFasterToolTip);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Granites.java b/src/main/java/gregtech/common/blocks/GT_Item_Granites.java
new file mode 100644
index 0000000000..6e3eb8f12c
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Granites.java
@@ -0,0 +1,10 @@
+package gregtech.common.blocks;
+
+import net.minecraft.block.Block;
+
+public class GT_Item_Granites extends GT_Item_Stones_Abstract {
+
+ public GT_Item_Granites(Block block) {
+ super(block);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_LongDistancePipe.java b/src/main/java/gregtech/common/blocks/GT_Item_LongDistancePipe.java
new file mode 100644
index 0000000000..52d0db5165
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_LongDistancePipe.java
@@ -0,0 +1,43 @@
+package gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.util.GT_LanguageManager;
+
+public class GT_Item_LongDistancePipe extends ItemBlock {
+
+ protected final String mNoMobsToolTip = GT_LanguageManager
+ .addStringLocalization("gt.nomobspawnsonthisblock", "Mobs cannot Spawn on this Block");
+ protected final String mNoTileEntityToolTip = GT_LanguageManager
+ .addStringLocalization("gt.notileentityinthisblock", "This is NOT a TileEntity!");
+
+ public GT_Item_LongDistancePipe(Block block) {
+ super(block);
+ setMaxDamage(0);
+ setHasSubtypes(true);
+ setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS);
+ }
+
+ @Override
+ public int getMetadata(int aMeta) {
+ return aMeta;
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack aStack) {
+ return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ aList.add(this.mNoMobsToolTip);
+ aList.add(this.mNoTileEntityToolTip);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Machines.java b/src/main/java/gregtech/common/blocks/GT_Item_Machines.java
new file mode 100644
index 0000000000..059a3fda94
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Machines.java
@@ -0,0 +1,430 @@
+package gregtech.common.blocks;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.ISecondaryDescribable;
+import gregtech.api.interfaces.metatileentity.IConnectable;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.CoverableTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Frame;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Item;
+import gregtech.api.util.GT_ItsNotMyFaultException;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalTankBase;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_SuperChest;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_SuperTank;
+
+public class GT_Item_Machines extends ItemBlock implements IFluidContainerItem {
+
+ public GT_Item_Machines(Block block) {
+ super(block);
+ setMaxDamage(0);
+ setHasSubtypes(true);
+ setCreativeTab(GregTech_API.TAB_GREGTECH);
+ }
+
+ public static IMetaTileEntity getMetaTileEntity(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return null;
+ if (!(aStack.getItem() instanceof GT_Item_Machines)) return null;
+ if (aStack.getItemDamage() < 0 || aStack.getItemDamage() > GregTech_API.METATILEENTITIES.length) return null;
+ return GregTech_API.METATILEENTITIES[aStack.getItemDamage()];
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ try {
+ final int tDamage = getDamage(aStack);
+ if ((tDamage <= 0) || (tDamage >= GregTech_API.METATILEENTITIES.length)) {
+ return;
+ }
+
+ if (GregTech_API.METATILEENTITIES[tDamage] != null) {
+ final IGregTechTileEntity tTileEntity = GregTech_API.METATILEENTITIES[tDamage].getBaseMetaTileEntity();
+ if (!GregTech_API.sPostloadFinished
+ && tTileEntity.getMetaTileEntity() instanceof ISecondaryDescribable) {
+ final String[] tSecondaryDescription = ((ISecondaryDescribable) tTileEntity.getMetaTileEntity())
+ .getSecondaryDescription();
+ addDescription(null, tSecondaryDescription, tDamage, "_Secondary");
+ }
+ {
+ final IMetaTileEntity tMetaTileEntity = tTileEntity.getMetaTileEntity();
+ final String tSuffix = (tMetaTileEntity instanceof ISecondaryDescribable
+ && ((ISecondaryDescribable) tMetaTileEntity).isDisplaySecondaryDescription()) ? "_Secondary"
+ : "";
+ addDescription(aList, tTileEntity.getDescription(), tDamage, tSuffix);
+ tMetaTileEntity.addAdditionalTooltipInformation(aStack, aList);
+ }
+ if (tTileEntity.getEUCapacity() > 0L) {
+ if (tTileEntity.getInputVoltage() > 0L) {
+ final byte inputTier = GT_Utility.getTier(tTileEntity.getInputVoltage());
+ aList.add(
+ GT_LanguageManager.addStringLocalization("TileEntity_EUp_IN", "Voltage IN: ")
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(tTileEntity.getInputVoltage())
+ + " ("
+ + GT_Utility.getColoredTierNameFromTier(inputTier)
+ + EnumChatFormatting.GREEN
+ + ")"
+ + EnumChatFormatting.GRAY);
+ }
+ if (tTileEntity.getOutputVoltage() > 0L) {
+ final byte outputTier = GT_Utility.getTier(tTileEntity.getOutputVoltage());
+ aList.add(
+ GT_LanguageManager.addStringLocalization("TileEntity_EUp_OUT", "Voltage OUT: ")
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(tTileEntity.getOutputVoltage())
+ + " ("
+ + GT_Utility.getColoredTierNameFromTier(outputTier)
+ + EnumChatFormatting.GREEN
+ + ")"
+ + EnumChatFormatting.GRAY);
+ }
+ if (tTileEntity.getOutputAmperage() > 1L) {
+ aList.add(
+ GT_LanguageManager.addStringLocalization("TileEntity_EUp_AMOUNT", "Amperage: ")
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(tTileEntity.getOutputAmperage())
+ + EnumChatFormatting.GRAY);
+ }
+ aList.add(
+ GT_LanguageManager.addStringLocalization("TileEntity_EUp_STORE", "Capacity: ")
+ + EnumChatFormatting.BLUE
+ + GT_Utility.formatNumbers(tTileEntity.getEUCapacity())
+ + EnumChatFormatting.GRAY
+ + " EU");
+ }
+ }
+ final NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ if (aNBT.getBoolean("mMuffler")) {
+ aList.add(GT_LanguageManager.addStringLocalization("GT_TileEntity_MUFFLER", "has Muffler Upgrade"));
+ }
+ if (aNBT.getBoolean("mSteamConverter")) {
+ aList.add(
+ GT_LanguageManager.addStringLocalization("GT_TileEntity_STEAMCONVERTER", "has Steam Upgrade"));
+ }
+ int tAmount = 0;
+ if ((tAmount = aNBT.getByte("mSteamTanks")) > 0) {
+ aList.add(
+ tAmount + " "
+ + GT_LanguageManager
+ .addStringLocalization("GT_TileEntity_STEAMTANKS", "Steam Tank Upgrades"));
+ }
+
+ CoverableTileEntity.addInstalledCoversInformation(aNBT, aList);
+ if (aNBT.hasKey("mColor") && aNBT.getByte("mColor") != -1) {
+ aList.add(
+ GT_LanguageManager.addStringLocalization("GT_TileEntity_COLORED", "Colored") + " ("
+ + Dyes.get(aNBT.getByte("mColor") - 1).formatting
+ + Dyes.get(aNBT.getByte("mColor") - 1).mName
+ + EnumChatFormatting.GRAY
+ + ")");
+ }
+ }
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("addInformation", e);
+ }
+ }
+
+ private void addDescription(@Nullable List<String> aList, @Nullable String[] aDescription, int aDamage,
+ String aSuffix) {
+ if (aDescription == null) return;
+ for (int i = 0, tLength = aDescription.length; i < tLength; i++) {
+ String tDescLine = aDescription[i];
+ if (!GT_Utility.isStringValid(tDescLine)) continue;
+
+ String tKey = String.format("TileEntity_DESCRIPTION_%05d%s_Index_%02d", aDamage, aSuffix, i);
+ if (tDescLine.contains("%%%")) {
+ final String[] tSplitStrings = tDescLine.split("%%%");
+ final StringBuilder tBuffer = new StringBuilder();
+ final String[] tRep = new String[tSplitStrings.length / 2];
+ for (int j = 0; j < tSplitStrings.length; j++) if (j % 2 == 0) tBuffer.append(tSplitStrings[j]);
+ else {
+ tBuffer.append("%s");
+ tRep[j / 2] = tSplitStrings[j];
+ }
+ final String tTranslated = String
+ .format(GT_LanguageManager.addStringLocalization(tKey, tBuffer.toString()), (Object[]) tRep);
+ if (aList != null) aList.add(tTranslated);
+ } else {
+ String tTranslated = GT_LanguageManager.addStringLocalization(tKey, tDescLine);
+ if (aList != null) aList.add(tTranslated.equals("") ? tDescLine : tTranslated);
+ }
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ public void registerDescription(int aDamage) {
+ if (aDamage >= GregTech_API.METATILEENTITIES.length) return;
+ if (GregTech_API.METATILEENTITIES[aDamage] != null) {
+ final IMetaTileEntity tMetaTileEntity = GregTech_API.METATILEENTITIES[aDamage].getBaseMetaTileEntity()
+ .getMetaTileEntity();
+ if (tMetaTileEntity instanceof ISecondaryDescribable) {
+ final String[] tSecondaryDescription = ((ISecondaryDescribable) tMetaTileEntity)
+ .getSecondaryDescription();
+ addDescription(null, tSecondaryDescription, aDamage, "_Secondary");
+ }
+ addDescription(null, tMetaTileEntity.getDescription(), aDamage, "");
+ }
+ }
+
+ @Override
+ public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z,
+ int ordinalSide, float hitX, float hitY, float hitZ) {
+ return false;
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack aStack) {
+ final short tDamage = (short) getDamage(aStack);
+ if ((tDamage < 0) || (tDamage >= GregTech_API.METATILEENTITIES.length)) {
+ return "";
+ }
+ if (GregTech_API.METATILEENTITIES[tDamage] != null) {
+ return getUnlocalizedName() + "." + GregTech_API.METATILEENTITIES[tDamage].getMetaName();
+ }
+ return "";
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ String aName = super.getItemStackDisplayName(aStack);
+ final short aDamage = (short) getDamage(aStack);
+ if (aDamage >= 0 && aDamage < GregTech_API.METATILEENTITIES.length
+ && GregTech_API.METATILEENTITIES[aDamage] != null) {
+ Materials aMaterial = null;
+ if (GregTech_API.METATILEENTITIES[aDamage] instanceof GT_MetaPipeEntity_Item) {
+ aMaterial = ((GT_MetaPipeEntity_Item) GregTech_API.METATILEENTITIES[aDamage]).mMaterial;
+ } else if (GregTech_API.METATILEENTITIES[aDamage] instanceof GT_MetaPipeEntity_Fluid) {
+ aMaterial = ((GT_MetaPipeEntity_Fluid) GregTech_API.METATILEENTITIES[aDamage]).mMaterial;
+ } else if (GregTech_API.METATILEENTITIES[aDamage] instanceof GT_MetaPipeEntity_Cable) {
+ aMaterial = ((GT_MetaPipeEntity_Cable) GregTech_API.METATILEENTITIES[aDamage]).mMaterial;
+ } else if (GregTech_API.METATILEENTITIES[aDamage] instanceof GT_MetaPipeEntity_Frame) {
+ aMaterial = ((GT_MetaPipeEntity_Frame) GregTech_API.METATILEENTITIES[aDamage]).mMaterial;
+ }
+ if (aMaterial != null) {
+ aName = aMaterial.getLocalizedNameForItem(aName);
+ }
+ }
+ return aName;
+ }
+
+ @Override
+ public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ super.onCreated(aStack, aWorld, aPlayer);
+ final short tDamage = (short) getDamage(aStack);
+ if ((tDamage < 0) || ((tDamage >= GregTech_API.METATILEENTITIES.length)
+ && (GregTech_API.METATILEENTITIES[tDamage] != null))) {
+ GregTech_API.METATILEENTITIES[tDamage].onCreated(aStack, aWorld, aPlayer);
+ }
+ }
+
+ @Override
+ public boolean placeBlockAt(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ int ordinalSide, float hitX, float hitY, float hitZ, int aMeta) {
+ final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
+ final short tDamage = (short) getDamage(aStack);
+ if (tDamage > 0) {
+ if (GregTech_API.METATILEENTITIES[tDamage] == null) {
+ return false;
+ }
+ final int tMetaData = GregTech_API.METATILEENTITIES[tDamage].getTileEntityBaseType();
+ if (!aWorld.setBlock(aX, aY, aZ, this.field_150939_a, tMetaData, 3)) {
+ return false;
+ }
+ if (aWorld.getBlock(aX, aY, aZ) != this.field_150939_a) {
+ throw new GT_ItsNotMyFaultException(
+ "Failed to place Block even though World.setBlock returned true. It COULD be MCPC/Bukkit causing that. In case you really have that installed, don't report this Bug to me, I don't know how to fix it.");
+ }
+ if (aWorld.getBlockMetadata(aX, aY, aZ) != tMetaData) {
+ throw new GT_ItsNotMyFaultException(
+ "Failed to set the MetaValue of the Block even though World.setBlock returned true. It COULD be MCPC/Bukkit causing that. In case you really have that installed, don't report this Bug to me, I don't know how to fix it.");
+ }
+ final IGregTechTileEntity tTileEntity = (IGregTechTileEntity) aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity != null) {
+ tTileEntity.setInitialValuesAsNBT(tTileEntity.isServerSide() ? aStack.getTagCompound() : null, tDamage);
+ if (aPlayer != null) {
+ tTileEntity.setOwnerName(aPlayer.getDisplayName());
+ tTileEntity.setOwnerUuid(aPlayer.getUniqueID());
+ }
+ tTileEntity.getMetaTileEntity()
+ .initDefaultModes(aStack.getTagCompound());
+ final ForgeDirection oppositeSide = side.getOpposite();
+ if (tTileEntity.getMetaTileEntity() instanceof IConnectable connectable) {
+ // If we're connectable, try connecting to whatever we're up against
+ connectable.connect(oppositeSide);
+ } else if (aPlayer != null && aPlayer.isSneaking()) {
+ // If we're being placed against something that is connectable, try telling it to connect to us
+ final IGregTechTileEntity aTileEntity = tTileEntity.getIGregTechTileEntityAtSide(oppositeSide);
+ if (aTileEntity != null && aTileEntity.getMetaTileEntity() instanceof IConnectable connectable) {
+ connectable.connect(side);
+ }
+ }
+ }
+ } else if (!aWorld.setBlock(aX, aY, aZ, this.field_150939_a, tDamage, 3)) {
+ return false;
+ }
+ if (aWorld.getBlock(aX, aY, aZ) == this.field_150939_a) {
+ this.field_150939_a.onBlockPlacedBy(aWorld, aX, aY, aZ, aPlayer, aStack);
+ this.field_150939_a.onPostBlockPlaced(aWorld, aX, aY, aZ, tDamage);
+ }
+ return true;
+ }
+
+ @Override
+ public void onUpdate(ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, boolean aIsInHand) {
+ super.onUpdate(aStack, aWorld, aPlayer, aTimer, aIsInHand);
+ final short tDamage = (short) getDamage(aStack);
+ final EntityLivingBase tPlayer = (EntityPlayer) aPlayer;
+ if (GregTech_API.METATILEENTITIES[tDamage] instanceof GT_MetaTileEntity_SuperChest
+ || GregTech_API.METATILEENTITIES[tDamage] instanceof GT_MetaTileEntity_SuperTank) {
+ final NBTTagCompound tNBT = aStack.stackTagCompound;
+ if (tNBT == null) return;
+ if (tNBT.hasNoTags()) {
+ aStack.setTagCompound(null);
+ return;
+ }
+ if ((tNBT.hasKey("mItemCount") && tNBT.getInteger("mItemCount") > 0) || (tNBT.hasKey("mFluid")
+ && FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("mFluid")).amount > 64000)) {
+ final FluidStack tFluid = FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("mFluid"));
+ int tEffectDuration = 1200;
+ if (tFluid != null) {
+ final double tFluidAmount = tFluid.amount;
+ final double tMiddlePoint = 4096000;
+ final double tSmoothingCoefficient = 2000000;
+ final int tMaxDuration = 12000;
+ final double tmp = (tFluidAmount - tMiddlePoint) / tSmoothingCoefficient;
+ tEffectDuration = (int) (Math.exp(tmp) / (Math.exp(tmp) + Math.exp(-tmp)) * tMaxDuration);
+ }
+ tPlayer.addPotionEffect(new PotionEffect(Potion.hunger.id, tEffectDuration, 1));
+ tPlayer.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, tEffectDuration, 1));
+ tPlayer.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, tEffectDuration, 1));
+ tPlayer.addPotionEffect(new PotionEffect(Potion.weakness.id, tEffectDuration, 1));
+ }
+ }
+ }
+
+ @Override
+ public FluidStack getFluid(ItemStack container) {
+ if (container != null) {
+ final NBTTagCompound tNBT = container.stackTagCompound;
+ if (tNBT != null && tNBT.hasKey("mFluid", 10)) {
+ return FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("mFluid"));
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public int getCapacity(ItemStack container) {
+ if (container != null) {
+ final int tDamage = container.getItemDamage();
+ final IMetaTileEntity tMetaTile = GregTech_API.METATILEENTITIES[tDamage];
+ if (tMetaTile != null) return tMetaTile.getCapacity();
+ }
+ return 0;
+ }
+
+ @Nullable
+ private Fluid getLockedFluid(@Nonnull ItemStack container) {
+ final NBTTagCompound tag = container.stackTagCompound;
+ if (tag == null) return null;
+ String lockedName = tag.getString("lockedFluidName");
+ if (GT_Utility.isStringInvalid(lockedName)) return null;
+ return FluidRegistry.getFluid(lockedName);
+ }
+
+ @Override
+ public int fill(ItemStack container, FluidStack resource, boolean doFill) {
+ if (container != null && resource != null) {
+ final int tDamage = container.getItemDamage();
+ final IMetaTileEntity tMetaTile = GregTech_API.METATILEENTITIES[tDamage];
+ if (!(tMetaTile instanceof GT_MetaTileEntity_DigitalTankBase)) {
+ return 0;
+ }
+ if (container.stackTagCompound == null) container.stackTagCompound = new NBTTagCompound();
+ final FluidStack tStoredFluid = getFluid(container);
+ final int tCapacity = getCapacity(container);
+ if (tCapacity <= 0) return 0;
+ final Fluid lockedFluid = getLockedFluid(container);
+ if (lockedFluid != null && resource.getFluid() != lockedFluid) {
+ return 0;
+ }
+ if (tStoredFluid != null && tStoredFluid.isFluidEqual(resource)) {
+ final int tAmount = Math.min(tCapacity - tStoredFluid.amount, resource.amount);
+ if (doFill) {
+ final FluidStack tNewFluid = new FluidStack(tStoredFluid, tAmount + tStoredFluid.amount);
+ container.stackTagCompound.setTag("mFluid", tNewFluid.writeToNBT(new NBTTagCompound()));
+ }
+ return tAmount;
+ }
+ if (tStoredFluid == null) {
+ final int tAmount = Math.min(tCapacity, resource.amount);
+ if (doFill) {
+ final FluidStack tNewFluid = new FluidStack(resource, tAmount);
+ container.stackTagCompound.setTag("mFluid", tNewFluid.writeToNBT(new NBTTagCompound()));
+ }
+ return tAmount;
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public FluidStack drain(ItemStack container, int maxDrain, boolean doDrain) {
+ if (container != null && container.hasTagCompound()) {
+ final int tDamage = container.getItemDamage();
+ final IMetaTileEntity tMetaTile = GregTech_API.METATILEENTITIES[tDamage];
+ if (!(tMetaTile instanceof GT_MetaTileEntity_DigitalTankBase)) {
+ return null;
+ }
+ final FluidStack tStoredFluid = getFluid(container);
+ if (tStoredFluid != null) {
+ final int tAmount = Math.min(maxDrain, tStoredFluid.amount);
+ final FluidStack tNewFluid = new FluidStack(tStoredFluid, tStoredFluid.amount - tAmount);
+ final FluidStack tOutputFluid = new FluidStack(tStoredFluid, tAmount);
+ if (doDrain) {
+ if (tNewFluid.amount <= 0) {
+ container.stackTagCompound.removeTag("mFluid");
+ if (container.stackTagCompound.hasNoTags()) container.setTagCompound(null);
+ } else {
+ container.stackTagCompound.setTag("mFluid", tNewFluid.writeToNBT(new NBTTagCompound()));
+ }
+ }
+ return tOutputFluid;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Ores.java b/src/main/java/gregtech/common/blocks/GT_Item_Ores.java
new file mode 100644
index 0000000000..2ba78572b3
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Ores.java
@@ -0,0 +1,81 @@
+package gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import org.apache.commons.lang3.StringUtils;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+
+public class GT_Item_Ores extends ItemBlock {
+
+ public GT_Item_Ores(Block block) {
+ super(block);
+ setMaxDamage(0);
+ setHasSubtypes(true);
+ setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS);
+ }
+
+ @Override
+ public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z,
+ int ordinalSide, float hitX, float hitY, float hitZ) {
+ return false;
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack aStack) {
+ return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ String aName = super.getItemStackDisplayName(aStack);
+ if (this.field_150939_a instanceof GT_Block_Ores_Abstract) {
+ aName = Materials.getLocalizedNameForItem(aName, aStack.getItemDamage() % 1000);
+ }
+ return aName;
+ }
+
+ @Override
+ public boolean placeBlockAt(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
+ int ordinalSide, float hitX, float hitY, float hitZ, int aMeta) {
+ short tDamage = (short) getDamage(aStack);
+ if (tDamage > 0) {
+ if (!aWorld.setBlock(
+ aX,
+ aY,
+ aZ,
+ this.field_150939_a,
+ GT_TileEntity_Ores.getHarvestData(
+ tDamage,
+ ((GT_Block_Ores_Abstract) field_150939_a).getBaseBlockHarvestLevel(aMeta % 16000 / 1000)),
+ 3)) {
+ return false;
+ }
+ GT_TileEntity_Ores tTileEntity = (GT_TileEntity_Ores) aWorld.getTileEntity(aX, aY, aZ);
+ tTileEntity.mMetaData = tDamage;
+ tTileEntity.mNatural = false;
+ } else if (!aWorld.setBlock(aX, aY, aZ, this.field_150939_a, 0, 3)) {
+ return false;
+ }
+ if (aWorld.getBlock(aX, aY, aZ) == this.field_150939_a) {
+ this.field_150939_a.onBlockPlacedBy(aWorld, aX, aY, aZ, aPlayer, aStack);
+ this.field_150939_a.onPostBlockPlaced(aWorld, aX, aY, aZ, tDamage);
+ }
+ return true;
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ String formula = StatCollector
+ .translateToLocal(field_150939_a.getUnlocalizedName() + '.' + getDamage(aStack) + ".tooltip");
+ if (!StringUtils.isBlank(formula)) aList.add(formula);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Stones_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Item_Stones_Abstract.java
new file mode 100644
index 0000000000..5b73108301
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Stones_Abstract.java
@@ -0,0 +1,42 @@
+package gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.util.GT_LanguageManager;
+
+public class GT_Item_Stones_Abstract extends ItemBlock {
+
+ private final String mNoMobsToolTip = GT_LanguageManager
+ .addStringLocalization("gt.nomobspawnsonthisblock", "Mobs cannot Spawn on this Block");
+
+ public GT_Item_Stones_Abstract(Block block) {
+ super(block);
+ setMaxDamage(0);
+ setHasSubtypes(true);
+ setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS);
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack aStack) {
+ return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack);
+ }
+
+ @Override
+ public int getMetadata(int aMeta) {
+ return aMeta;
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ if (aStack.getItemDamage() % 8 >= 3) {
+ aList.add(this.mNoMobsToolTip);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Item_Storage.java b/src/main/java/gregtech/common/blocks/GT_Item_Storage.java
new file mode 100644
index 0000000000..4ac1b9cdfd
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Item_Storage.java
@@ -0,0 +1,47 @@
+package gregtech.common.blocks;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+
+public class GT_Item_Storage extends ItemBlock {
+
+ public GT_Item_Storage(Block block) {
+ super(block);
+ setMaxDamage(0);
+ setHasSubtypes(true);
+ setCreativeTab(GregTech_API.TAB_GREGTECH_MATERIALS);
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack aStack) {
+ return this.field_150939_a.getUnlocalizedName() + "." + getDamage(aStack);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ String aName = super.getItemStackDisplayName(aStack);
+ if (this.field_150939_a instanceof GT_Block_Metal) {
+ int aDamage = aStack.getItemDamage();
+ if (aDamage >= 0 && aDamage < ((GT_Block_Metal) this.field_150939_a).mMats.length) {
+ aName = ((GT_Block_Metal) this.field_150939_a).mMats[aDamage].getLocalizedNameForItem(aName);
+ }
+ }
+ return aName;
+ }
+
+ @Override
+ public int getMetadata(int aMeta) {
+ return aMeta;
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ super.addInformation(aStack, aPlayer, aList, aF3_H);
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Material_Casings.java b/src/main/java/gregtech/common/blocks/GT_Material_Casings.java
new file mode 100644
index 0000000000..2fc839768f
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Material_Casings.java
@@ -0,0 +1,19 @@
+package gregtech.common.blocks;
+
+import net.minecraft.block.material.MapColor;
+import net.minecraft.block.material.Material;
+
+public class GT_Material_Casings extends Material {
+
+ public static final Material INSTANCE = new GT_Material_Casings();
+
+ private GT_Material_Casings() {
+ super(MapColor.ironColor);
+ setRequiresTool();
+ }
+
+ @Override
+ public boolean isOpaque() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Material_Machines.java b/src/main/java/gregtech/common/blocks/GT_Material_Machines.java
new file mode 100644
index 0000000000..df8b57226c
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Material_Machines.java
@@ -0,0 +1,19 @@
+package gregtech.common.blocks;
+
+import net.minecraft.block.material.MapColor;
+import net.minecraft.block.material.Material;
+
+public class GT_Material_Machines extends Material {
+
+ public GT_Material_Machines() {
+ super(MapColor.ironColor);
+ setRequiresTool();
+ setImmovableMobility();
+ setAdventureModeExempt();
+ }
+
+ @Override
+ public boolean isOpaque() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Material_Reinforced.java b/src/main/java/gregtech/common/blocks/GT_Material_Reinforced.java
new file mode 100644
index 0000000000..2e3301bb60
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Material_Reinforced.java
@@ -0,0 +1,18 @@
+package gregtech.common.blocks;
+
+import net.minecraft.block.material.MapColor;
+import net.minecraft.block.material.Material;
+
+public class GT_Material_Reinforced extends Material {
+
+ public GT_Material_Reinforced() {
+ super(MapColor.stoneColor);
+ setRequiresTool();
+ setAdventureModeExempt();
+ }
+
+ @Override
+ public boolean isOpaque() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_Packet_Ores.java b/src/main/java/gregtech/common/blocks/GT_Packet_Ores.java
new file mode 100644
index 0000000000..d7ab28a19e
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_Packet_Ores.java
@@ -0,0 +1,61 @@
+package gregtech.common.blocks;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.net.GT_Packet_New;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Packet_Ores extends GT_Packet_New {
+
+ private int mX;
+ private int mZ;
+ private short mY;
+ private short mMetaData;
+
+ public GT_Packet_Ores() {
+ super(true);
+ }
+
+ public GT_Packet_Ores(int aX, short aY, int aZ, short aMetaData) {
+ super(false);
+ this.mX = aX;
+ this.mY = aY;
+ this.mZ = aZ;
+ this.mMetaData = aMetaData;
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(this.mX);
+ aOut.writeShort(this.mY);
+ aOut.writeInt(this.mZ);
+ aOut.writeShort(this.mMetaData);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_Ores(aData.readInt(), aData.readShort(), aData.readInt(), aData.readShort());
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ if (aWorld != null) {
+ TileEntity tTileEntity = aWorld.getTileEntity(this.mX, this.mY, this.mZ);
+ if ((tTileEntity instanceof GT_TileEntity_Ores)) {
+ ((GT_TileEntity_Ores) tTileEntity).mMetaData = this.mMetaData;
+ }
+ if (((aWorld instanceof World)) && (((World) aWorld).isRemote)) {
+ ((World) aWorld).markBlockForUpdate(this.mX, this.mY, this.mZ);
+ }
+ }
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 3;
+ }
+}
diff --git a/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java b/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java
new file mode 100644
index 0000000000..f3d247a265
--- /dev/null
+++ b/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java
@@ -0,0 +1,485 @@
+package gregtech.common.blocks;
+
+import static gregtech.api.enums.TextureSet.SET_NONE;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.Packet;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import org.jetbrains.annotations.NotNull;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IAllSidedTexturedTileEntity;
+import gregtech.api.objects.XSTR;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class GT_TileEntity_Ores extends TileEntity implements IAllSidedTexturedTileEntity {
+
+ public short mMetaData = 0;
+ protected static boolean shouldFortune = false;
+ protected static boolean shouldSilkTouch = false;
+ public boolean mNatural = false;
+ public boolean mBlocked = true;
+ public boolean mBlockedChecked = false;
+ private short mMetadataForCachedTexture = -1;
+ private ITexture[] mCachedTexture;
+
+ public static byte getHarvestData(short aMetaData, int aBaseBlockHarvestLevel) {
+ Materials aMaterial = GregTech_API.sGeneratedMaterials[(aMetaData % 1000)];
+ byte tByte = aMaterial == null ? 0
+ : (byte) Math
+ .max(aBaseBlockHarvestLevel, Math.min(7, aMaterial.mToolQuality - (aMetaData < 16000 ? 0 : 1)));
+ if (GT_Mod.gregtechproxy.mChangeHarvestLevels) {
+ tByte = aMaterial == null ? 0
+ : (byte) Math.max(
+ aBaseBlockHarvestLevel,
+ Math.min(
+ GT_Mod.gregtechproxy.mMaxHarvestLevel,
+ GT_Mod.gregtechproxy.mHarvestLevel[aMaterial.mMetaItemSubID] - (aMetaData < 16000 ? 0 : 1)));
+ }
+ return tByte;
+ }
+
+ public static boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int aMetaData, boolean isSmallOre) {
+ return setOreBlock(aWorld, aX, aY, aZ, aMetaData, isSmallOre, true);
+ }
+
+ public static boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int aMetaData, boolean isSmallOre,
+ boolean air) {
+ if (!air) {
+ aY = Math.min(aWorld.getActualHeight(), Math.max(aY, 1));
+ }
+ Block tBlock = aWorld.getBlock(aX, aY, aZ);
+ Block tOreBlock = GregTech_API.sBlockOres1;
+ int BlockMeta = aWorld.getBlockMetadata(aX, aY, aZ);
+ String BlockName = tBlock.getUnlocalizedName();
+ aMetaData += isSmallOre ? 16000 : 0;
+ if ((aMetaData > 0) && ((tBlock != Blocks.air) || air)) {
+ if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.stone)) {
+ // Do nothing, stone background is default background.
+ // Do this comparison first since stone is most common
+ } else if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.netherrack)) {
+ aMetaData += 1000;
+ } else if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.end_stone)) {
+ aMetaData += 2000;
+ } else if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockGranites)) {
+ if (tBlock == GregTech_API.sBlockGranites) {
+ if (aWorld.getBlockMetadata(aX, aY, aZ) < 8) {
+ aMetaData += 3000;
+ } else {
+ aMetaData += 4000;
+ }
+ } else {
+ aMetaData += 3000;
+ }
+ } else if (tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockStones)) {
+ if (tBlock == GregTech_API.sBlockStones) {
+ if (aWorld.getBlockMetadata(aX, aY, aZ) < 8) {
+ aMetaData += 5000;
+ } else {
+ aMetaData += 6000;
+ }
+ } else {
+ aMetaData += 5000;
+ }
+ } else if (BlockName.equals("tile.igneousStone")) {
+ if (GregTech_API.sBlockOresUb1 != null) {
+ tOreBlock = GregTech_API.sBlockOresUb1;
+ aMetaData += (BlockMeta * 1000);
+ // GT_FML_LOGGER.info("Block changed to UB1");
+ }
+ } else if (BlockName.equals("tile.metamorphicStone")) {
+ if (GregTech_API.sBlockOresUb2 != null) {
+ tOreBlock = GregTech_API.sBlockOresUb2;
+ aMetaData += (BlockMeta * 1000);
+ // GT_FML_LOGGER.info("Block changed to UB2");
+ }
+ } else if (BlockName.equals("tile.sedimentaryStone")) {
+ if (GregTech_API.sBlockOresUb3 != null) {
+ tOreBlock = GregTech_API.sBlockOresUb3;
+ aMetaData += (BlockMeta * 1000);
+ // GT_FML_LOGGER.info("Block changed to UB3");
+ }
+ } else {
+ return false;
+ }
+ // GT_FML_LOGGER.info(tOreBlock);
+ aWorld.setBlock(
+ aX,
+ aY,
+ aZ,
+ tOreBlock,
+ getHarvestData(
+ (short) aMetaData,
+ ((GT_Block_Ores_Abstract) tOreBlock).getBaseBlockHarvestLevel(aMetaData % 16000 / 1000)),
+ 0);
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if ((tTileEntity instanceof GT_TileEntity_Ores)) {
+ ((GT_TileEntity_Ores) tTileEntity).mMetaData = ((short) aMetaData);
+ ((GT_TileEntity_Ores) tTileEntity).mNatural = true;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound aNBT) {
+ super.readFromNBT(aNBT);
+ this.mMetaData = aNBT.getShort("m");
+ this.mNatural = aNBT.getBoolean("n");
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound aNBT) {
+ super.writeToNBT(aNBT);
+ aNBT.setShort("m", this.mMetaData);
+ aNBT.setBoolean("n", this.mNatural);
+ }
+
+ public void onUpdated() {
+ if ((!this.worldObj.isRemote) && (this.mBlocked)) {
+ this.mBlocked = false;
+ GT_Values.NW.sendPacketToAllPlayersInRange(
+ this.worldObj,
+ new GT_Packet_Ores(this.xCoord, (short) this.yCoord, this.zCoord, this.mMetaData),
+ this.xCoord,
+ this.zCoord);
+ }
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ if (!this.worldObj.isRemote) {
+ boolean sendUpdate = mBlockedChecked ? !mBlocked : checkBlocked();
+ if (sendUpdate) {
+ GT_Values.NW.sendPacketToAllPlayersInRange(
+ this.worldObj,
+ new GT_Packet_Ores(this.xCoord, (short) this.yCoord, this.zCoord, this.mMetaData),
+ this.xCoord,
+ this.zCoord);
+ }
+ }
+ return null;
+ }
+
+ private boolean checkBlocked() {
+ // this is called very frequently and is performance critical. unroll the loop.
+ mBlockedChecked = true;
+ if (!worldObj.blockExists(xCoord + 1, yCoord, zCoord)) {
+ mBlockedChecked = false;
+ } else if (!GT_Utility.isOpaqueBlock(worldObj, xCoord + 1, yCoord, zCoord)) {
+ mBlocked = false;
+ return true;
+ }
+ if (!worldObj.blockExists(xCoord - 1, yCoord, zCoord)) {
+ mBlockedChecked = false;
+ } else if (!GT_Utility.isOpaqueBlock(worldObj, xCoord - 1, yCoord, zCoord)) {
+ mBlocked = false;
+ return true;
+ }
+ if (!worldObj.blockExists(xCoord, yCoord + 1, zCoord)) {
+ mBlockedChecked = false;
+ } else if (!GT_Utility.isOpaqueBlock(worldObj, xCoord, yCoord + 1, zCoord)) {
+ mBlocked = false;
+ return true;
+ }
+ if (!worldObj.blockExists(xCoord, yCoord - 1, zCoord)) {
+ mBlockedChecked = false;
+ } else if (!GT_Utility.isOpaqueBlock(worldObj, xCoord, yCoord - 1, zCoord)) {
+ mBlocked = false;
+ return true;
+ }
+ if (!worldObj.blockExists(xCoord, yCoord, zCoord + 1)) {
+ mBlockedChecked = false;
+ } else if (!GT_Utility.isOpaqueBlock(worldObj, xCoord, yCoord, zCoord + 1)) {
+ mBlocked = false;
+ return true;
+ }
+ if (!worldObj.blockExists(xCoord, yCoord, zCoord - 1)) {
+ mBlockedChecked = false;
+ } else if (!GT_Utility.isOpaqueBlock(worldObj, xCoord, yCoord, zCoord - 1)) {
+ mBlocked = false;
+ return true;
+ }
+ mBlocked = true;
+ return false;
+ }
+
+ public void overrideOreBlockMaterial(Block aOverridingStoneBlock, byte aOverridingStoneMeta) {
+ if (this.worldObj == null || blockType == null) return;
+ this.mMetaData = ((short) (int) (this.mMetaData % 1000L + this.mMetaData / 16000L * 16000L));
+ if (aOverridingStoneBlock
+ .isReplaceableOreGen(this.worldObj, this.xCoord, this.yCoord, this.zCoord, Blocks.netherrack)) {
+ this.mMetaData = ((short) (this.mMetaData + 1000));
+ } else if (aOverridingStoneBlock
+ .isReplaceableOreGen(this.worldObj, this.xCoord, this.yCoord, this.zCoord, Blocks.end_stone)) {
+ this.mMetaData = ((short) (this.mMetaData + 2000));
+ } else if (aOverridingStoneBlock.isReplaceableOreGen(
+ this.worldObj,
+ this.xCoord,
+ this.yCoord,
+ this.zCoord,
+ GregTech_API.sBlockGranites)) {
+ if (aOverridingStoneBlock == GregTech_API.sBlockGranites) {
+ if (aOverridingStoneMeta < 8) {
+ this.mMetaData = ((short) (this.mMetaData + 3000));
+ } else {
+ this.mMetaData = ((short) (this.mMetaData + 4000));
+ }
+ } else {
+ this.mMetaData = ((short) (this.mMetaData + 3000));
+ }
+ } else if (aOverridingStoneBlock.isReplaceableOreGen(
+ this.worldObj,
+ this.xCoord,
+ this.yCoord,
+ this.zCoord,
+ GregTech_API.sBlockStones)) {
+ if (aOverridingStoneBlock == GregTech_API.sBlockStones) {
+ if (aOverridingStoneMeta < 8) {
+ this.mMetaData = ((short) (this.mMetaData + 5000));
+ } else {
+ this.mMetaData = ((short) (this.mMetaData + 6000));
+ }
+ } else {
+ this.mMetaData = ((short) (this.mMetaData + 5000));
+ }
+ }
+ this.worldObj.setBlockMetadataWithNotify(
+ this.xCoord,
+ this.yCoord,
+ this.zCoord,
+ getHarvestData(
+ this.mMetaData,
+ ((GT_Block_Ores_Abstract) blockType).getBaseBlockHarvestLevel(mMetaData % 16000 / 1000)),
+ 0);
+ }
+
+ public void convertOreBlock(World aWorld, int aX, int aY, int aZ) {
+ short aMeta = ((short) (this.mMetaData % 1000 + (this.mMetaData / 16000 * 16000)));
+ aWorld.setBlock(aX, aY, aZ, GregTech_API.sBlockOres1);
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof GT_TileEntity_Ores) {
+ ((GT_TileEntity_Ores) tTileEntity).mMetaData = aMeta;
+ this.worldObj.setBlockMetadataWithNotify(
+ this.xCoord,
+ this.yCoord,
+ this.zCoord,
+ getHarvestData(
+ aMeta,
+ ((GT_Block_Ores_Abstract) tTileEntity.blockType).getBaseBlockHarvestLevel(aMeta % 16000 / 1000)),
+ 0);
+ }
+ }
+
+ public short getMetaData() {
+ return this.mMetaData;
+ }
+
+ @Override
+ public boolean canUpdate() {
+ return false;
+ }
+
+ public ArrayList<ItemStack> getDrops(Block aDroppedOre, int aFortune) {
+ ArrayList<ItemStack> rList = new ArrayList<>();
+ if (this.mMetaData <= 0) {
+ rList.add(new ItemStack(Blocks.cobblestone, 1, 0));
+ return rList;
+ }
+ Materials aOreMaterial = GregTech_API.sGeneratedMaterials[(this.mMetaData % 1000)];
+ if (this.mMetaData < 16000) {
+ boolean tIsRich = false;
+
+ // For Sake of god of balance!
+
+ // Dense ore
+
+ // NetherOre
+ if (GT_Mod.gregtechproxy.mNetherOreYieldMultiplier && !tIsRich) {
+ tIsRich = (this.mMetaData >= 1000 && this.mMetaData < 2000);
+ }
+ // EndOre
+ if (GT_Mod.gregtechproxy.mEndOreYieldMultiplier && !tIsRich) {
+ tIsRich = (this.mMetaData >= 2000 && this.mMetaData < 3000);
+ }
+
+ // Silk Touch
+ if (shouldSilkTouch) {
+ rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData));
+
+ } else {
+ switch (GT_Mod.gregtechproxy.oreDropSystem) {
+ case Item -> {
+ rList.add(GT_OreDictUnificator.get(OrePrefixes.rawOre, aOreMaterial, (tIsRich ? 2 : 1)));
+ }
+ // TODO: Test
+ case FortuneItem -> {
+ // if shouldFortune and isNatural then get fortune drops
+ // if not shouldFortune or not isNatural then get normal drops
+ // if not shouldFortune and isNatural then get normal drops
+ // if shouldFortune and not isNatural then get normal drops
+ if (shouldFortune && this.mNatural && aFortune > 0) {
+ int aMinAmount = 1;
+ // Max applicable fortune
+ if (aFortune > 3) aFortune = 3;
+ long amount = (long) new Random().nextInt(aFortune * (tIsRich ? 2 : 1)) + aMinAmount;
+ for (int i = 0; i < amount; i++) {
+ rList.add(GT_OreDictUnificator.get(OrePrefixes.rawOre, aOreMaterial, 1));
+ }
+ } else {
+ for (int i = 0; i < (tIsRich ? 2 : 1); i++) {
+ rList.add(GT_OreDictUnificator.get(OrePrefixes.rawOre, aOreMaterial, 1));
+ }
+ }
+ }
+ case UnifiedBlock -> {
+ // Unified ore
+ for (int i = 0; i < (tIsRich ? 2 : 1); i++) {
+ rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData % 1000));
+ }
+ }
+ case PerDimBlock -> {
+ // Per Dimension ore
+ if (tIsRich) {
+ rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData));
+ } else {
+ rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData % 1000));
+ }
+ }
+ case Block -> {
+ // Regular ore
+ rList.add(new ItemStack(aDroppedOre, 1, this.mMetaData));
+ }
+ }
+ }
+ return rList;
+ }
+
+ // Everyone gets a free small fortune boost
+ aFortune += 1;
+ if (!this.mNatural) {
+ aFortune = 0;
+ }
+ if (aOreMaterial != null) {
+ Random tRandom = new XSTR(this.xCoord ^ this.yCoord ^ this.zCoord);
+ ArrayList<ItemStack> tSelector = new ArrayList<>();
+
+ Materials aMaterial = aOreMaterial.mOreReplacement;
+
+ ItemStack tStack = GT_OreDictUnificator
+ .get(OrePrefixes.gemExquisite, aMaterial, GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L), 1L);
+ if (tStack != null) {
+ for (int i = 0; i < 1; i++) {
+ tSelector.add(tStack);
+ }
+ }
+ tStack = GT_OreDictUnificator
+ .get(OrePrefixes.gemFlawless, aMaterial, GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L), 1L);
+ if (tStack != null) {
+ for (int i = 0; i < 2; i++) {
+ tSelector.add(tStack);
+ }
+ }
+ tStack = GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L);
+ if (tStack != null) {
+ for (int i = 0; i < 12; i++) {
+ tSelector.add(tStack);
+ }
+ }
+ tStack = GT_OreDictUnificator.get(
+ OrePrefixes.gemFlawed,
+ aMaterial,
+ GT_OreDictUnificator.get(OrePrefixes.crushed, aMaterial, 1L),
+ 1L);
+ if (tStack != null) {
+ for (int i = 0; i < 5; i++) {
+ tSelector.add(tStack);
+ }
+ }
+ tStack = GT_OreDictUnificator.get(OrePrefixes.crushed, aMaterial, 1L);
+ if (tStack != null) {
+ for (int i = 0; i < 10; i++) {
+ tSelector.add(tStack);
+ }
+ }
+ tStack = GT_OreDictUnificator.get(
+ OrePrefixes.gemChipped,
+ aMaterial,
+ GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L),
+ 1L);
+ if (tStack != null) {
+ for (int i = 0; i < 5; i++) {
+ tSelector.add(tStack);
+ }
+ }
+ tStack = GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L);
+ if (tStack != null) {
+ for (int i = 0; i < 10; i++) {
+ tSelector.add(tStack);
+ }
+ }
+ if (!tSelector.isEmpty()) {
+ int i = 0;
+ for (int j = Math.max(
+ 1,
+ aMaterial.mOreMultiplier
+ + (aFortune > 0 ? tRandom.nextInt(1 + aFortune * aMaterial.mOreMultiplier) : 0) / 2); i
+ < j; i++) {
+ rList.add(GT_Utility.copyAmount(1, tSelector.get(tRandom.nextInt(tSelector.size()))));
+ }
+ }
+ if (tRandom.nextInt(3 + aFortune) > 1) {
+ Materials dustMat = ((GT_Block_Ores_Abstract) aDroppedOre).getDroppedDusts()[this.mMetaData / 1000
+ % 16];
+ if (dustMat != null) rList.add(
+ GT_OreDictUnificator
+ .get(tRandom.nextInt(3) > 0 ? OrePrefixes.dustImpure : OrePrefixes.dust, dustMat, 1L));
+ }
+ }
+ return rList;
+ }
+
+ @Override
+ public ITexture[] getTexture(Block aBlock) {
+ if (mMetadataForCachedTexture == mMetaData && mCachedTexture != null) return mCachedTexture;
+
+ mMetadataForCachedTexture = mMetaData;
+ mCachedTexture = getTextureInternal(aBlock);
+ return mCachedTexture;
+ }
+
+ private ITexture @NotNull [] getTextureInternal(Block aBlock) {
+ Materials aMaterial = GregTech_API.sGeneratedMaterials[(this.mMetaData % 1000)];
+ if ((aMaterial != null) && (this.mMetaData < 32000) && (aBlock instanceof GT_Block_Ores_Abstract)) {
+ ITexture iTexture = TextureFactory.builder()
+ .addIcon(
+ aMaterial.mIconSet.mTextures[this.mMetaData / 16000 == 0 ? OrePrefixes.ore.mTextureIndex
+ : OrePrefixes.oreSmall.mTextureIndex])
+ .setRGBA(aMaterial.mRGBa)
+ .stdOrient()
+ .build();
+ return new ITexture[] { ((GT_Block_Ores_Abstract) aBlock).getTextureSet()[((this.mMetaData / 1000) % 16)],
+ iTexture };
+ }
+ return new ITexture[] { TextureFactory.of(Blocks.stone, 0), TextureFactory.builder()
+ .addIcon(SET_NONE.mTextures[OrePrefixes.ore.mTextureIndex])
+ .stdOrient()
+ .build() };
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/CoverInfo.java b/src/main/java/gregtech/common/covers/CoverInfo.java
new file mode 100644
index 0000000000..3deafba899
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/CoverInfo.java
@@ -0,0 +1,335 @@
+package gregtech.common.covers;
+
+import java.lang.ref.WeakReference;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+
+public final class CoverInfo {
+
+ private static final String NBT_SIDE = "s", NBT_ID = "id", NBT_DATA = "d", NBT_TICK_RATE_ADDITION = "tra";
+
+ // One minute
+ public static final int MAX_TICK_RATE_ADDITION = 1200;
+
+ public static final CoverInfo EMPTY_INFO = new CoverInfo(ForgeDirection.UNKNOWN, null);
+ private final ForgeDirection coverSide;
+ private int coverID = 0;
+ private GT_CoverBehaviorBase<?> coverBehavior;
+ private ISerializableObject coverData;
+ private final WeakReference<ICoverable> coveredTile;
+ private boolean needsUpdate = false;
+
+ private int tickRateAddition = 0;
+
+ public CoverInfo(ForgeDirection side, ICoverable aTile) {
+ coverSide = side;
+ coveredTile = new WeakReference<>(aTile);
+ coverBehavior = GregTech_API.sNoBehavior;
+ }
+
+ public CoverInfo(ForgeDirection side, int aID, ICoverable aTile, ISerializableObject aCoverData) {
+ coverSide = side;
+ coverID = aID;
+ coverBehavior = GregTech_API.getCoverBehaviorNew(aID);
+ coverData = aCoverData == null ? coverBehavior.createDataObject() : aCoverData;
+ coveredTile = new WeakReference<>(aTile);
+ }
+
+ public CoverInfo(ICoverable aTile, NBTTagCompound aNBT) {
+ coverSide = ForgeDirection.getOrientation(aNBT.getByte(NBT_SIDE));
+ coverID = aNBT.getInteger(NBT_ID);
+ coverBehavior = GregTech_API.getCoverBehaviorNew(coverID);
+ coverData = aNBT.hasKey(NBT_DATA) ? coverBehavior.createDataObject(aNBT.getTag(NBT_DATA))
+ : coverBehavior.createDataObject();
+ coveredTile = new WeakReference<>(aTile);
+ tickRateAddition = aNBT.hasKey(NBT_TICK_RATE_ADDITION) ? aNBT.getInteger(NBT_TICK_RATE_ADDITION) : 0;
+ }
+
+ public boolean isValid() {
+ return coverID != 0 && coverSide != ForgeDirection.UNKNOWN;
+ }
+
+ public NBTTagCompound writeToNBT(NBTTagCompound aNBT) {
+ aNBT.setByte(NBT_SIDE, (byte) coverSide.ordinal());
+ aNBT.setInteger(NBT_ID, coverID);
+ aNBT.setInteger(NBT_TICK_RATE_ADDITION, tickRateAddition);
+ if (coverData != null) aNBT.setTag(NBT_DATA, coverData.saveDataToNBT());
+
+ return aNBT;
+ }
+
+ public int getCoverID() {
+ return coverID;
+ }
+
+ public boolean needsUpdate() {
+ return needsUpdate;
+ }
+
+ public void setNeedsUpdate(boolean aUpdate) {
+ needsUpdate = aUpdate;
+ }
+
+ public GT_CoverBehaviorBase<?> getCoverBehavior() {
+ return coverBehavior;
+ }
+
+ public ISerializableObject getCoverData() {
+ if (coverData != null) return coverData;
+ return GregTech_API.sNoBehavior.createDataObject();
+ }
+
+ public boolean onCoverRemoval(boolean aForced) {
+ return getCoverBehavior().onCoverRemoval(coverSide, coverID, coverData, coveredTile.get(), aForced);
+ }
+
+ public ItemStack getDrop() {
+ return getCoverBehavior().getDrop(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public ItemStack getDisplayStack() {
+ return getCoverBehavior().getDisplayStack(coverID, coverData);
+ }
+
+ public boolean isDataNeededOnClient() {
+ return getCoverBehavior().isDataNeededOnClient(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public void onDropped() {
+ getCoverBehavior().onDropped(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public void setCoverData(ISerializableObject aData) {
+ coverData = aData;
+ }
+
+ public ITexture getSpecialCoverFGTexture() {
+ return getCoverBehavior().getSpecialCoverFGTexture(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public ITexture getSpecialCoverTexture() {
+ return getCoverBehavior().getSpecialCoverTexture(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public int getTickRate() {
+ return getMinimumTickRate() + tickRateAddition;
+ }
+
+ public ForgeDirection getSide() {
+ return coverSide;
+ }
+
+ public ICoverable getTile() {
+ return coveredTile.get();
+ }
+
+ public boolean isRedstoneSensitive(long aTickTimer) {
+ return getCoverBehavior().isRedstoneSensitive(coverSide, coverID, coverData, coveredTile.get(), aTickTimer);
+ }
+
+ public ISerializableObject doCoverThings(long aTickTimer, byte aRedstone) {
+ return getCoverBehavior()
+ .doCoverThings(coverSide, aRedstone, coverID, coverData, coveredTile.get(), aTickTimer);
+ }
+
+ public void onBaseTEDestroyed() {
+ getCoverBehavior().onBaseTEDestroyed(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public void updateCoverBehavior() {
+ coverBehavior = GregTech_API.getCoverBehaviorNew(coverID);
+ }
+
+ public void preDataChanged(int aCoverID, ISerializableObject aCoverData) {
+ getCoverBehavior().preDataChanged(coverSide, coverID, aCoverID, coverData, aCoverData, coveredTile.get());
+ }
+
+ public void onDataChanged() {
+ getCoverBehavior().onDataChanged(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public String getBehaviorDescription() {
+ return getCoverBehavior().getDescription(coverSide, coverID, coverData, null);
+ }
+
+ public ModularWindow createWindow(EntityPlayer player) {
+ final GT_CoverUIBuildContext buildContext = new GT_CoverUIBuildContext(
+ player,
+ coverID,
+ coverSide,
+ coveredTile.get(),
+ true);
+ return getCoverBehavior().createWindow(buildContext);
+ }
+
+ public boolean isGUIClickable() {
+ return getCoverBehavior().isGUIClickable(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public boolean hasCoverGUI() {
+ return getCoverBehavior().hasCoverGUI();
+ }
+
+ public boolean useModularUI() {
+ return getCoverBehavior().useModularUI();
+ }
+
+ public boolean letsItemsIn(int aSlot) {
+ return getCoverBehavior().letsItemsIn(coverSide, coverID, coverData, aSlot, coveredTile.get());
+ }
+
+ public boolean letsItemsOut(int aSlot) {
+ return getCoverBehavior().letsItemsOut(coverSide, coverID, coverData, aSlot, coveredTile.get());
+ }
+
+ public boolean letsFluidIn(Fluid aFluid) {
+ return letsFluidIn(aFluid, coveredTile.get());
+ }
+
+ public boolean letsFluidOut(Fluid aFluid) {
+ return letsFluidOut(aFluid, coveredTile.get());
+ }
+
+ public boolean letsFluidIn(Fluid aFluid, ICoverable tile) {
+ return getCoverBehavior().letsFluidIn(coverSide, coverID, coverData, aFluid, tile);
+ }
+
+ public boolean letsFluidOut(Fluid aFluid, ICoverable tile) {
+ return getCoverBehavior().letsFluidOut(coverSide, coverID, coverData, aFluid, tile);
+ }
+
+ public boolean letsEnergyIn() {
+ return getCoverBehavior().letsEnergyIn(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public boolean letsEnergyOut() {
+ return getCoverBehavior().letsEnergyOut(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public boolean alwaysLookConnected() {
+ return getCoverBehavior().alwaysLookConnected(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public boolean onCoverRightClick(EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return getCoverBehavior()
+ .onCoverRightClick(coverSide, coverID, coverData, coveredTile.get(), aPlayer, aX, aY, aZ);
+ }
+
+ public boolean onCoverShiftRightClick(EntityPlayer aPlayer) {
+ return getCoverBehavior().onCoverShiftRightClick(coverSide, coverID, coverData, coveredTile.get(), aPlayer);
+ }
+
+ public ISerializableObject onCoverScrewdriverClick(EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return getCoverBehavior()
+ .onCoverScrewdriverClick(coverSide, coverID, coverData, coveredTile.get(), aPlayer, aX, aY, aZ);
+ }
+
+ public void onCoverJackhammer(EntityPlayer aPlayer) {
+ adjustTickRateMultiplier(aPlayer.isSneaking());
+
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocalFormatted("gt.cover.info.chat.tick_rate", getCurrentTickRateFormatted()));
+ }
+
+ /**
+ * Adjusts the tick rate by one step.
+ *
+ * @param isDecreasing If true, lower one step.
+ */
+ public void adjustTickRateMultiplier(final boolean isDecreasing) {
+ final int currentTickRate = getTickRate();
+ final int stepAmount = currentTickRate == 20 ? (isDecreasing ? 5 : 20) : (currentTickRate < 20 ? 5 : 20);
+
+ tickRateAddition = clamp(tickRateAddition + (isDecreasing ? -1 : 1) * stepAmount);
+ tickRateAddition = clamp(tickRateAddition - (getTickRate() % stepAmount));
+ }
+
+ /**
+ * Returns information about the cover's tick rate.
+ *
+ * @return An instance of tick rate components
+ */
+ @NotNull
+ public CoverInfo.ClientTickRateFormatter getCurrentTickRateFormatted() {
+ return new ClientTickRateFormatter(getTickRate());
+ }
+
+ public int getMinimumTickRate() {
+ return getCoverBehavior().getTickRate(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public int getTickRateAddition() {
+ return tickRateAddition;
+ }
+
+ public void setTickRateAddition(final int tickRateAddition) {
+ this.tickRateAddition = clamp(tickRateAddition);
+ }
+
+ public Block getFacadeBlock() {
+ return getCoverBehavior().getFacadeBlock(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ public int getFacadeMeta() {
+ return getCoverBehavior().getFacadeMeta(coverSide, coverID, coverData, coveredTile.get());
+ }
+
+ @NotNull
+ public List<String> getAdditionalTooltip(ISerializableObject data) {
+ return getCoverBehavior().getAdditionalTooltip(data);
+ }
+
+ private static int clamp(int input) {
+ return Math.min(MAX_TICK_RATE_ADDITION, Math.max(0, input));
+ }
+
+ public static final class ClientTickRateFormatter {
+
+ /** A translation key for the type of time units being used (e.g.: "tick", "seconds".) */
+ private final String unitI18NKey;
+ /** A number representing a quantity of time. */
+ private final int tickRate;
+
+ /**
+ * Converts a given tick rate into a human-friendly format.
+ *
+ * @param tickRate The rate at which something ticks, in ticks per operation.
+ */
+ public ClientTickRateFormatter(final int tickRate) {
+ if (tickRate < 20) {
+ this.unitI18NKey = tickRate == 1 ? "gt.time.tick.singular" : "gt.time.tick.plural";
+ this.tickRate = tickRate;
+ } else {
+ this.unitI18NKey = tickRate == 20 ? "gt.time.second.singular" : "gt.time.second.plural";
+ this.tickRate = tickRate / 20;
+ }
+ }
+
+ public String toString() {
+ return StatCollector.translateToLocalFormatted(
+ "gt.cover.info.format.tick_rate",
+ tickRate,
+ StatCollector.translateToLocal(unitI18NKey));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Arm.java b/src/main/java/gregtech/common/covers/GT_Cover_Arm.java
new file mode 100644
index 0000000000..f2440ebc44
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_Arm.java
@@ -0,0 +1,436 @@
+package gregtech.common.covers;
+
+import java.text.FieldPosition;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+
+public class GT_Cover_Arm extends GT_CoverBehavior {
+
+ public final int mTickRate;
+ // msb converted, 2nd : direction (1=export)
+ // right 14 bits: internalSlot, next 14 bits adjSlot, 0 = all, slot = -1
+ protected static final int EXPORT_MASK = 0x40000000;
+ protected static final int SLOT_ID_MASK = 0x3FFF;
+ protected static final int SLOT_ID_MIN = 0;
+ protected static final int CONVERTED_BIT = 0x80000000;
+
+ public GT_Cover_Arm(int aTickRate, ITexture coverTexture) {
+ super(coverTexture);
+ this.mTickRate = aTickRate;
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ if ((((aTileEntity instanceof IMachineProgress)) && (!((IMachineProgress) aTileEntity).isAllowedToWork()))) {
+ return aCoverVariable;
+ }
+
+ // Convert from ver. 5.09.33.50, check if 3 last bits are equal
+ if ((aCoverVariable >>> 29) == 0) {
+ aCoverVariable = CONVERTED_BIT | (((aCoverVariable + 1) & SLOT_ID_MASK) << 14) | EXPORT_MASK;
+ } else if ((aCoverVariable >>> 29) == 7) {
+ aCoverVariable = CONVERTED_BIT | Math.min(Math.abs(aCoverVariable - 1), SLOT_ID_MASK);
+ }
+
+ final TileEntity toTile;
+ final TileEntity fromTile;
+ final int toSlot;
+ final int fromSlot;
+
+ if ((aCoverVariable & EXPORT_MASK) > 0) {
+ fromTile = (TileEntity) aTileEntity;
+ toTile = aTileEntity.getTileEntityAtSide(side);
+ fromSlot = aCoverVariable & SLOT_ID_MASK;
+ toSlot = (aCoverVariable >> 14) & SLOT_ID_MASK;
+ } else {
+ fromTile = aTileEntity.getTileEntityAtSide(side);
+ toTile = (TileEntity) aTileEntity;
+ fromSlot = (aCoverVariable >> 14) & SLOT_ID_MASK;
+ toSlot = aCoverVariable & SLOT_ID_MASK;
+ }
+
+ if (fromSlot > 0 && toSlot > 0) {
+ if (fromTile instanceof IInventory fromInventory && toTile instanceof IInventory toInventory)
+ GT_Utility.moveFromSlotToSlot(
+ fromInventory,
+ toInventory,
+ fromSlot - 1,
+ toSlot - 1,
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ } else if (toSlot > 0) {
+ final ForgeDirection toSide;
+ if ((aCoverVariable & EXPORT_MASK) > 0) toSide = side;
+ else toSide = side.getOpposite();
+ GT_Utility.moveOneItemStackIntoSlot(
+ fromTile,
+ toTile,
+ toSide,
+ toSlot - 1,
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ } else if (fromSlot > 0) {
+ final ForgeDirection toSide;
+ if ((aCoverVariable & EXPORT_MASK) > 0) toSide = side;
+ else toSide = side.getOpposite();
+ if (fromTile instanceof IInventory) GT_Utility.moveFromSlotToSide(
+ (IInventory) fromTile,
+ toTile,
+ fromSlot - 1,
+ toSide,
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ } else {
+ final ForgeDirection fromSide;
+ final ForgeDirection toSide;
+ if ((aCoverVariable & EXPORT_MASK) > 0) {
+ fromSide = side;
+ toSide = side.getOpposite();
+ } else {
+ fromSide = side.getOpposite();
+ toSide = side;
+ }
+ GT_Utility.moveOneItemStack(
+ fromTile,
+ toTile,
+ fromSide,
+ toSide,
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ }
+
+ return aCoverVariable;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ int step = 0;
+ if (GT_Utility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) {
+ step += aPlayer.isSneaking() ? 256 : 16;
+ } else {
+ step -= aPlayer.isSneaking() ? 256 : 16;
+ }
+ aCoverVariable = getNewVar(aCoverVariable, step);
+ sendMessageToPlayer(aPlayer, aCoverVariable);
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX,
+ float aY, float aZ) {
+ int step = (GT_Utility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) ? 1 : -1;
+ int tCoverVariable = getNewVar(aCoverVariable.get(), step);
+ sendMessageToPlayer(aPlayer, tCoverVariable);
+ aCoverVariable.set(tCoverVariable);
+ return true;
+ }
+
+ @Override
+ @SuppressWarnings("deprecation")
+ public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ final int step = (GT_Utility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) ? 1 : -1;
+ aCoverVariable = getNewVar(aCoverVariable, step);
+ sendMessageToPlayer(aPlayer, aCoverVariable);
+ aTileEntity.setCoverDataAtSide(side, aCoverVariable);
+ return true;
+ }
+
+ @Override
+ protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ private void sendMessageToPlayer(EntityPlayer aPlayer, int var) {
+ if ((var & EXPORT_MASK) != 0) GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("001", "Puts out into adjacent Slot #") + (((var >> 14) & SLOT_ID_MASK) - 1));
+ else GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("002", "Grabs in for own Slot #") + ((var & SLOT_ID_MASK) - 1));
+ }
+
+ private int getNewVar(int var, int step) {
+ int intSlot = (var & SLOT_ID_MASK);
+ int adjSlot = (var >> 14) & SLOT_ID_MASK;
+ if ((var & EXPORT_MASK) == 0) {
+ int x = (intSlot + step);
+ if (x > SLOT_ID_MASK) return createVar(0, SLOT_ID_MASK, 0);
+ else if (x < 1) return createVar(-step - intSlot + 1, 0, EXPORT_MASK);
+ else return createVar(0, x, 0);
+ } else {
+ int x = (adjSlot - step);
+ if (x > SLOT_ID_MASK) return createVar(SLOT_ID_MASK, 0, EXPORT_MASK);
+ else if (x < 1) return createVar(0, step - adjSlot + 1, 0);
+ else return createVar(x, 0, EXPORT_MASK);
+ }
+ }
+
+ private int createVar(int adjSlot, int intSlot, int export) {
+ return CONVERTED_BIT | export | ((adjSlot & SLOT_ID_MASK) << 14) | (intSlot & SLOT_ID_MASK);
+ }
+
+ @Override
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return this.mTickRate;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new ArmUIFactory(buildContext).createWindow();
+ }
+
+ private class ArmUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ private int maxSlot;
+
+ /**
+ * Display the text "Any" instead of a number when the slot is set to -1.
+ */
+ protected static final NumberFormatMUI numberFormatAny = new NumberFormatMUI() {
+
+ @Override
+ public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
+ if (number < 0) {
+ return toAppendTo.append(GT_Utility.trans("ANY", "Any"));
+ } else {
+ return super.format(number, toAppendTo, pos);
+ }
+ }
+ };
+
+ protected ArmUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ maxSlot = getMaxSlot();
+ builder.widget(
+ new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_Arm.this).addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> getFlagExport(convert(coverData)) > 0,
+ (coverData, state) -> {
+ if (state) {
+ return new ISerializableObject.LegacyCoverData(
+ convert(coverData) | EXPORT_MASK | CONVERTED_BIT);
+ } else {
+ return new ISerializableObject.LegacyCoverData(
+ convert(coverData) & ~EXPORT_MASK | CONVERTED_BIT);
+ }
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT)
+ .addTooltip(GT_Utility.trans("006", "Export"))
+ .setPos(spaceX * 0, spaceY * 0))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> getFlagExport(convert(coverData)) == 0,
+ (coverData, state) -> {
+ if (state) {
+ return new ISerializableObject.LegacyCoverData(
+ convert(coverData) & ~EXPORT_MASK | CONVERTED_BIT);
+ } else {
+ return new ISerializableObject.LegacyCoverData(
+ convert(coverData) | EXPORT_MASK | CONVERTED_BIT);
+ }
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT)
+ .addTooltip(GT_Utility.trans("007", "Import"))
+ .setPos(spaceX * 1, spaceY * 0))
+ .addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) (getFlagInternalSlot(convert(coverData)) - 1),
+ (coverData, state) -> {
+ final int coverVariable = convert(coverData);
+ return new ISerializableObject.LegacyCoverData(
+ getFlagExport(coverVariable) | ((state.intValue() + 1) & SLOT_ID_MASK)
+ | (getFlagAdjacentSlot(coverVariable) << 14)
+ | CONVERTED_BIT);
+ },
+ widget -> widget.setBounds(-1, maxSlot)
+ .setDefaultValue(-1)
+ .setScrollValues(1, 100, 10)
+ .setNumberFormat(numberFormatAny)
+ .setPos(spaceX * 0, spaceY * 1 + 2)
+ .setSize(spaceX * 2 + 5, 12))
+ .addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) (getFlagAdjacentSlot(convert(coverData)) - 1),
+ (coverData, state) -> {
+ final int coverVariable = convert(coverData);
+ return new ISerializableObject.LegacyCoverData(
+ getFlagExport(coverVariable) | getFlagInternalSlot(coverVariable)
+ | (((state.intValue() + 1) & SLOT_ID_MASK) << 14)
+ | CONVERTED_BIT);
+ },
+ widget -> widget.setValidator(val -> {
+ // We need to check the adjacent inventory here, and can't simply set a maximum value,
+ // because it can change while this cover is alive.
+ final int adjacentMaxSlot;
+ final ICoverable tile = getUIBuildContext().getTile();
+ if (tile instanceof TileEntity && !tile.isDead()) {
+ TileEntity adj = tile.getTileEntityAtSide(getUIBuildContext().getCoverSide());
+ if (adj instanceof IInventory)
+ adjacentMaxSlot = ((IInventory) adj).getSizeInventory() - 1;
+ else adjacentMaxSlot = -1;
+ } else {
+ adjacentMaxSlot = -1;
+ }
+ return Math.min(val, adjacentMaxSlot);
+ })
+ .setMinValue(-1)
+ .setDefaultValue(-1)
+ .setScrollValues(1, 100, 10)
+ .setNumberFormat(numberFormatAny)
+ .setPos(spaceX * 0, spaceY * 2 + 2)
+ .setSize(spaceX * 2 + 5, 12))
+ .setPos(startX, startY))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> (convert(getCoverData()) & EXPORT_MASK) > 0 ? GT_Utility.trans("006", "Export")
+ : GT_Utility.trans("007", "Import"))
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 3, 4 + startY + spaceY * 0))
+ .widget(
+ new TextWidget(GT_Utility.trans("254.1", "Internal slot#")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 3, 4 + startY + spaceY * 1))
+ .widget(
+ new TextWidget(GT_Utility.trans("255", "Adjacent slot#")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 3, 4 + startY + spaceY * 2));
+ }
+
+ private int getMaxSlot() {
+ final ICoverable tile = getUIBuildContext().getTile();
+ if (tile instanceof TileEntity && !tile.isDead()) {
+ return tile.getSizeInventory() - 1;
+ } else {
+ return -1;
+ }
+ }
+
+ private int getFlagExport(int coverVariable) {
+ return coverVariable & EXPORT_MASK;
+ }
+
+ private int getFlagInternalSlot(int coverVariable) {
+ return coverVariable & SLOT_ID_MASK;
+ }
+
+ private int getFlagAdjacentSlot(int coverVariable) {
+ return (coverVariable >> 14) & SLOT_ID_MASK;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java b/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java
new file mode 100644
index 0000000000..320876568f
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java
@@ -0,0 +1,275 @@
+package gregtech.common.covers;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.covers.IControlsWorkCover;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+
+public class GT_Cover_ControlsWork extends GT_CoverBehavior implements IControlsWorkCover {
+
+ public GT_Cover_ControlsWork(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ if (!makeSureOnlyOne(side, aTileEntity)) return 0;
+ if (aTileEntity instanceof IMachineProgress machine) {
+ if (aCoverVariable < 2) {
+ if ((aInputRedstone > 0) == (aCoverVariable == 0)) {
+ if (!machine.isAllowedToWork()) machine.enableWorking();
+ } else if (machine.isAllowedToWork()) machine.disableWorking();
+ machine.setWorkDataValue(aInputRedstone);
+ } else if (aCoverVariable == 2) {
+ machine.disableWorking();
+ } else {
+ if (machine.wasShutdown() && machine.getLastShutDownReason()
+ .wasCritical()) {
+ machine.disableWorking();
+ if (!mPlayerNotified) {
+ EntityPlayer player = lastPlayer == null ? null : lastPlayer.get();
+ if (player != null) {
+ lastPlayer = null;
+ mPlayerNotified = true;
+ GT_Utility.sendChatToPlayer(
+ player,
+ aTileEntity.getInventoryName() + "at "
+ + String.format(
+ "(%d,%d,%d)",
+ aTileEntity.getXCoord(),
+ aTileEntity.getYCoord(),
+ aTileEntity.getZCoord())
+ + " shut down.");
+ }
+ }
+ return 2;
+ } else {
+ return 3 + doCoverThings(side, aInputRedstone, aCoverID, aCoverVariable - 3, aTileEntity, aTimer);
+ }
+ }
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ return aCoverVariable.get() != 2; // always off, so no redstone needed either
+ }
+
+ /**
+ * Make sure there is only one GT_Cover_ControlsWork on the aTileEntity TODO this is a migration thing. Remove this
+ * after 2.3.0 is released.
+ *
+ * @return true if the cover is the first (side) one
+ **/
+ private boolean makeSureOnlyOne(ForgeDirection side, ICoverable aTileEntity) {
+ return IControlsWorkCover.makeSureOnlyOne(side, aTileEntity);
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ boolean aForced) {
+ if ((aTileEntity instanceof IMachineProgress)) {
+ ((IMachineProgress) aTileEntity).enableWorking();
+ ((IMachineProgress) aTileEntity).setWorkDataValue((byte) 0);
+ }
+ return true;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 5;
+ if (aCoverVariable < 0) {
+ aCoverVariable = 2;
+ }
+ if (aCoverVariable == 0) {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("003", "Enable with Signal"));
+ }
+ if (aCoverVariable == 1) {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("004", "Disable with Signal"));
+ }
+ if (aCoverVariable == 2) {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("005", "Disabled"));
+ }
+ if (aCoverVariable == 3) {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("505", "Enable with Signal (Safe)"));
+ }
+ if (aCoverVariable == 4) {
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("506", "Disable with Signal (Safe)"));
+ }
+ // TODO: Set lastPlayer
+ return aCoverVariable;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 1;
+ }
+
+ @Override
+ public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) {
+ if (!super.isCoverPlaceable(side, aStack, aTileEntity)) return false;
+ for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) {
+ if (aTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof IControlsWorkCover) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new ControlsWorkUIFactory(buildContext).createWindow();
+ }
+
+ private class ControlsWorkUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ public ControlsWorkUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ builder
+ .widget(
+ new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>(
+ this::getCoverData,
+ this::setCoverData,
+ GT_Cover_ControlsWork.this,
+ (id, coverData) -> !getClickable(id, convert(coverData)),
+ (id, coverData) -> new ISerializableObject.LegacyCoverData(
+ getNewCoverVariable(id, convert(coverData))))
+ .addToggleButton(
+ 0,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_REDSTONE_ON)
+ .setPos(spaceX * 0, spaceY * 0))
+ .addToggleButton(
+ 1,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_REDSTONE_OFF)
+ .setPos(spaceX * 0, spaceY * 1))
+ .addToggleButton(
+ 2,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CROSS)
+ .setPos(spaceX * 0, spaceY * 2))
+ .setPos(startX, startY))
+ .widget(
+ new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_ControlsWork.this)
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofCheckAndCross(),
+ coverData -> convert(coverData) > 2,
+ (coverData, state) -> new ISerializableObject.LegacyCoverData(
+ adjustCoverVariable(state, convert(coverData))),
+ widget -> widget.setPos(spaceX * 0, spaceY * 3))
+ .setPos(startX, startY))
+ .widget(
+ new TextWidget(GT_Utility.trans("243", "Enable with Redstone"))
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 0))
+ .widget(
+ new TextWidget(GT_Utility.trans("244", "Disable with Redstone"))
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 1))
+ .widget(
+ new TextWidget(GT_Utility.trans("245", "Disable machine")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 2))
+ .widget(
+ new TextWidget(GT_Utility.trans("507", "Safe Mode")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 3));
+ }
+
+ private int getNewCoverVariable(int id, int coverVariable) {
+ if (coverVariable > 2) {
+ return id + 3;
+ } else {
+ return id;
+ }
+ }
+
+ private boolean getClickable(int id, int coverVariable) {
+ return ((id != coverVariable && id != coverVariable - 3) || id == 3);
+ }
+
+ private int adjustCoverVariable(boolean safeMode, int coverVariable) {
+ if (safeMode && coverVariable <= 2) {
+ coverVariable += 3;
+ }
+ if (!safeMode && coverVariable > 2) {
+ coverVariable -= 3;
+ }
+ return coverVariable;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java b/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java
new file mode 100644
index 0000000000..fcedfbe768
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java
@@ -0,0 +1,333 @@
+package gregtech.common.covers;
+
+import static gregtech.api.util.GT_Utility.moveMultipleItemStacks;
+
+import java.util.Arrays;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+
+public class GT_Cover_Conveyor extends GT_CoverBehavior {
+
+ public final int mTickRate;
+ private final int mMaxStacks;
+
+ public GT_Cover_Conveyor(int aTickRate, int maxStacks, ITexture coverTexture) {
+ super(coverTexture);
+ this.mTickRate = aTickRate;
+ this.mMaxStacks = maxStacks;
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ if ((aCoverVariable % 6 > 1) && ((aTileEntity instanceof IMachineProgress))) {
+ if (((IMachineProgress) aTileEntity).isAllowedToWork() != aCoverVariable % 6 < 4) {
+ return aCoverVariable;
+ }
+ }
+ final TileEntity tTileEntity = aTileEntity.getTileEntityAtSide(side);
+ final Object fromEntity = aCoverVariable % 2 == 0 ? aTileEntity : tTileEntity;
+ final Object toEntity = aCoverVariable % 2 != 0 ? aTileEntity : tTileEntity;
+ final ForgeDirection fromSide = aCoverVariable % 2 != 0 ? side.getOpposite() : side;
+ final ForgeDirection toSide = aCoverVariable % 2 == 0 ? side.getOpposite() : side;
+
+ moveMultipleItemStacks(
+ fromEntity,
+ toEntity,
+ fromSide,
+ toSide,
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1,
+ this.mMaxStacks);
+
+ return aCoverVariable;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 12;
+ if (aCoverVariable < 0) {
+ aCoverVariable = 11;
+ }
+ switch (aCoverVariable) {
+ case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("006", "Export"));
+ case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("007", "Import"));
+ case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("008", "Export (conditional)"));
+ case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("009", "Import (conditional)"));
+ case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("010", "Export (invert cond)"));
+ case 5 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("011", "Import (invert cond)"));
+ case 6 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("012", "Export allow Input"));
+ case 7 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("013", "Import allow Output"));
+ case 8 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("014", "Export allow Input (conditional)"));
+ case 9 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("015", "Import allow Output (conditional)"));
+ case 10 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("016", "Export allow Input (invert cond)"));
+ case 11 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("017", "Import allow Output (invert cond)"));
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return (aCoverVariable >= 6) || (aCoverVariable % 2 != 0);
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return (aCoverVariable >= 6) || (aCoverVariable % 2 == 0);
+ }
+
+ @Override
+ public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return this.mTickRate;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new ConveyorUIFactory(buildContext).createWindow();
+ }
+
+ private class ConveyorUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ private CoverDataFollower_ToggleButtonWidget<ISerializableObject.LegacyCoverData> mBlockWidget = null;
+ private CoverDataFollower_ToggleButtonWidget<ISerializableObject.LegacyCoverData> mAllowWidget = null;
+
+ public ConveyorUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ builder.widget(
+ new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>(
+ this::getCoverData,
+ this::setCoverData,
+ GT_Cover_Conveyor.this,
+ (id, coverData) -> !getClickable(id, convert(coverData)),
+ (id, coverData) -> new ISerializableObject.LegacyCoverData(
+ getNewCoverVariable(id, convert(coverData))))
+ .addToggleButton(
+ 0,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT)
+ .addTooltip(GT_Utility.trans("006", "Export"))
+ .setPos(spaceX * 0, spaceY * 0))
+ .addToggleButton(
+ 1,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT)
+ .addTooltip(GT_Utility.trans("007", "Import"))
+ .setPos(spaceX * 1, spaceY * 0))
+ .addToggleButton(
+ 2,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK)
+ .addTooltip(GT_Utility.trans("224", "Always On"))
+ .setPos(spaceX * 0, spaceY * 1))
+ .addToggleButton(
+ 3,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_USE_PROCESSING_STATE)
+ .addTooltip(GT_Utility.trans("343", "Use Machine Processing State"))
+ .setPos(spaceX * 1, spaceY * 1))
+ .addToggleButton(
+ 4,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_USE_INVERTED_PROCESSING_STATE)
+ .addTooltip(GT_Utility.trans("343.1", "Use Inverted Machine Processing State"))
+ .setPos(spaceX * 2, spaceY * 1))
+ .addToggleButton(5, CoverDataFollower_ToggleButtonWidget.ofDisableable(), widget -> {
+ mAllowWidget = widget;
+ widget.setTextureGetter(i -> {
+ ISerializableObject.LegacyCoverData coverData = getCoverData();
+ return coverData == null || coverData.get() % 2 == 0
+ ? GT_UITextures.OVERLAY_BUTTON_ALLOW_INPUT
+ : GT_UITextures.OVERLAY_BUTTON_ALLOW_OUTPUT;
+ })
+ .dynamicTooltip(() -> {
+ ISerializableObject.LegacyCoverData coverData = getCoverData();
+ return Arrays.asList(
+ coverData == null || coverData.get() % 2 == 0
+ ? GT_Utility.trans("314", "Allow Input")
+ : GT_Utility.trans("312", "Allow Output"));
+ })
+ .setPos(spaceX * 0, spaceY * 2);
+ })
+ .addToggleButton(6, CoverDataFollower_ToggleButtonWidget.ofDisableable(), widget -> {
+ mBlockWidget = widget;
+ widget.setTextureGetter(i -> {
+ ISerializableObject.LegacyCoverData coverData = getCoverData();
+ return coverData == null || coverData.get() % 2 == 0
+ ? GT_UITextures.OVERLAY_BUTTON_BLOCK_INPUT
+ : GT_UITextures.OVERLAY_BUTTON_BLOCK_OUTPUT;
+ })
+ .dynamicTooltip(() -> {
+ ISerializableObject.LegacyCoverData coverData = getCoverData();
+ return Arrays.asList(
+ coverData == null || coverData.get() % 2 == 0
+ ? GT_Utility.trans("313", "Block Input")
+ : GT_Utility.trans("311", "Block Output"));
+ })
+ .setPos(spaceX * 1, spaceY * 2);
+ })
+ .setPos(startX, startY))
+ .widget(
+ new TextWidget(GT_Utility.trans("229", "Export/Import")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 0))
+ .widget(
+ new TextWidget(GT_Utility.trans("230", "Conditional")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 1))
+ .widget(TextWidget.dynamicString(() -> {
+ ISerializableObject.LegacyCoverData coverData = getCoverData();
+ return coverData == null || coverData.get() % 2 == 0 ? GT_Utility.trans("344", "Input Blocking")
+ : GT_Utility.trans("344.1", "Output Blocking");
+ })
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 2));
+ }
+
+ private int getNewCoverVariable(int id, int coverVariable) {
+ switch (id) {
+ case 0 -> {
+ if (mBlockWidget != null) {
+ mBlockWidget.notifyTooltipChange();
+ }
+ if (mAllowWidget != null) {
+ mAllowWidget.notifyTooltipChange();
+ }
+ return coverVariable & ~0x1;
+ }
+ case 1 -> {
+ if (mBlockWidget != null) {
+ mBlockWidget.notifyTooltipChange();
+ }
+ if (mAllowWidget != null) {
+ mAllowWidget.notifyTooltipChange();
+ }
+ return coverVariable | 0x1;
+ }
+ case 2 -> {
+ if (coverVariable > 5) return 0x6 | (coverVariable & ~0xE);
+ return (coverVariable & ~0xE);
+ }
+ case 3 -> {
+ if (coverVariable > 5) return 0x8 | (coverVariable & ~0xE);
+ return 0x2 | (coverVariable & ~0xE);
+ }
+ case 4 -> {
+ if (coverVariable > 5) return 0xA | (coverVariable & ~0xE);
+ return (0x4 | (coverVariable & ~0xE));
+ }
+ case 5 -> {
+ if (coverVariable <= 5) return coverVariable + 6;
+ }
+ case 6 -> {
+ if (coverVariable > 5) return coverVariable - 6;
+ }
+ }
+ return coverVariable;
+ }
+
+ private boolean getClickable(int id, int coverVariable) {
+ if (coverVariable < 0 || 11 < coverVariable) return false;
+ return switch (id) {
+ case 0, 1 -> (0x1 & coverVariable) != id;
+ case 2 -> (coverVariable % 6) >= 2;
+ case 3 -> (coverVariable % 6) < 2 || 4 <= (coverVariable % 6);
+ case 4 -> (coverVariable % 6) < 4;
+ case 5 -> coverVariable < 6;
+ case 6 -> coverVariable >= 6;
+ default -> false;
+ };
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Crafting.java b/src/main/java/gregtech/common/covers/GT_Cover_Crafting.java
new file mode 100644
index 0000000000..f492542fa9
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_Crafting.java
@@ -0,0 +1,56 @@
+package gregtech.common.covers;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.inventory.ContainerWorkbench;
+import net.minecraft.network.play.server.S2DPacketOpenWindow;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.ISerializableObject;
+
+public class GT_Cover_Crafting extends GT_CoverBehavior {
+
+ public GT_Cover_Crafting(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if ((aPlayer instanceof EntityPlayerMP)) {
+ ((EntityPlayerMP) aPlayer).getNextWindowId();
+ ((EntityPlayerMP) aPlayer).playerNetServerHandler.sendPacket(
+ new S2DPacketOpenWindow(((EntityPlayerMP) aPlayer).currentWindowId, 1, "Crafting", 9, true));
+ aPlayer.openContainer = new ContainerWorkbench(
+ aPlayer.inventory,
+ aPlayer.worldObj,
+ aTileEntity.getXCoord(),
+ aTileEntity.getYCoord(),
+ aTileEntity.getZCoord()) {
+
+ @Override
+ public boolean canInteractWith(EntityPlayer player) {
+ return true;
+ }
+ };
+ aPlayer.openContainer.windowId = ((EntityPlayerMP) aPlayer).currentWindowId;
+ aPlayer.openContainer.addCraftingToCrafters((EntityPlayerMP) aPlayer);
+ }
+ return true;
+ }
+
+ @Override
+ protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_DoesWork.java b/src/main/java/gregtech/common/covers/GT_Cover_DoesWork.java
new file mode 100644
index 0000000000..4e32a69330
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_DoesWork.java
@@ -0,0 +1,257 @@
+package gregtech.common.covers;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+
+public class GT_Cover_DoesWork extends GT_CoverBehavior {
+
+ private static int FLAG_INVERTED = 0x1;
+ private static int FLAG_PROGRESS = 0x2;
+ private static int FLAG_ENABLED = 0x4;
+
+ public GT_Cover_DoesWork(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ if ((aTileEntity instanceof IMachineProgress)) {
+ IMachineProgress mProgress = (IMachineProgress) aTileEntity;
+ boolean inverted = isFlagSet(aCoverVariable, FLAG_INVERTED);
+ int signal = 0;
+
+ if (isFlagSet(aCoverVariable, FLAG_ENABLED)) {
+ signal = inverted == mProgress.isAllowedToWork() ? 0 : 15;
+ } else if (isFlagSet(aCoverVariable, FLAG_PROGRESS)) {
+ signal = inverted == (mProgress.getMaxProgress() == 0) ? 0 : 15;
+ } else {
+ int tScale = mProgress.getMaxProgress() / 15;
+
+ if (tScale > 0 && mProgress.hasThingsToDo()) {
+ signal = inverted ? (15 - mProgress.getProgress() / tScale) : (mProgress.getProgress() / tScale);
+ } else {
+ signal = inverted ? 15 : 0;
+ }
+ }
+
+ aTileEntity.setOutputRedstoneSignal(side, (byte) signal);
+ } else {
+ aTileEntity.setOutputRedstoneSignal(side, (byte) 0);
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 6;
+ if (aCoverVariable < 0) {
+ aCoverVariable = 5;
+ }
+ switch (aCoverVariable) {
+ case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("018", "Normal"));
+ // Progress scaled
+ case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("019", "Inverted"));
+ // ^ inverted
+ case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("020", "Ready to work"));
+ // Not Running
+ case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("021", "Not ready to work"));
+ // Running
+ case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("028", "Machine Enabled"));
+ // Enabled
+ case 5 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("029", "Machine Disabled"));
+ // Disabled
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 5;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new DoesWorkUIFactory(buildContext).createWindow();
+ }
+
+ private static boolean isFlagSet(int coverVariable, int flag) {
+ return (coverVariable & flag) == flag;
+ }
+
+ private class DoesWorkUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ public DoesWorkUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ builder
+ .widget(
+ new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>(
+ this::getCoverData,
+ this::setCoverData,
+ GT_Cover_DoesWork.this,
+ (id, coverData) -> isEnabled(id, convert(coverData)),
+ (id, coverData) -> new ISerializableObject.LegacyCoverData(
+ getNewCoverVariable(id, convert(coverData))))
+ .addToggleButton(
+ 0,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_PROGRESS)
+ .setPos(spaceX * 0, spaceY * 0))
+ .addToggleButton(
+ 1,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK)
+ .setPos(spaceX * 1, spaceY * 0))
+ .addToggleButton(
+ 2,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON)
+ .setPos(spaceX * 2, spaceY * 0))
+ .addToggleButton(
+ 3,
+ CoverDataFollower_ToggleButtonWidget.ofRedstone(),
+ widget -> widget.setPos(spaceX * 0, spaceY * 1))
+ .setPos(startX, startY))
+ .widget(TextWidget.dynamicString(() -> {
+ int coverVariable = convert(getCoverData());
+
+ if (isFlagSet(coverVariable, FLAG_ENABLED)) {
+ return GT_Utility.trans("271", "Machine enabled");
+ } else if (isFlagSet(coverVariable, FLAG_PROGRESS)) {
+ return GT_Utility.trans("242", "Machine idle");
+ } else {
+ return GT_Utility.trans("241", "Recipe progress");
+ }
+
+ })
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 3, 4 + startY + spaceY * 0))
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> isFlagSet(convert(getCoverData()), FLAG_INVERTED)
+ ? GT_Utility.trans("INVERTED", "Inverted")
+ : GT_Utility.trans("NORMAL", "Normal"))
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 3, 4 + startY + spaceY * 1));
+ }
+
+ private int getNewCoverVariable(int id, int coverVariable) {
+ switch (id) {
+ case 0 -> {
+ return (coverVariable & ~FLAG_ENABLED) & ~FLAG_PROGRESS;
+ }
+ case 1 -> {
+ return (coverVariable & ~FLAG_ENABLED) | FLAG_PROGRESS;
+ }
+ case 2 -> {
+ return (coverVariable & ~FLAG_PROGRESS) | FLAG_ENABLED;
+ }
+ case 3 -> {
+ if (isFlagSet(coverVariable, FLAG_INVERTED)) {
+ return coverVariable & ~FLAG_INVERTED;
+ } else {
+ return coverVariable | FLAG_INVERTED;
+ }
+ }
+ }
+ return coverVariable;
+ }
+
+ private boolean isEnabled(int id, int coverVariable) {
+ return switch (id) {
+ case 0 -> !isFlagSet(coverVariable, FLAG_PROGRESS) && !isFlagSet(coverVariable, FLAG_ENABLED);
+ case 1 -> isFlagSet(coverVariable, FLAG_PROGRESS);
+ case 2 -> isFlagSet(coverVariable, FLAG_ENABLED);
+ case 3 -> isFlagSet(coverVariable, FLAG_INVERTED);
+ default -> true;
+ };
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Drain.java b/src/main/java/gregtech/common/covers/GT_Cover_Drain.java
new file mode 100644
index 0000000000..2590f8e7ae
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_Drain.java
@@ -0,0 +1,140 @@
+package gregtech.common.covers;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidBlock;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+
+public class GT_Cover_Drain extends GT_CoverBehavior {
+
+ public GT_Cover_Drain(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ if ((aCoverVariable % 3 > 1) && ((aTileEntity instanceof IMachineProgress))) {
+ if (((IMachineProgress) aTileEntity).isAllowedToWork()) {
+ return aCoverVariable;
+ }
+ }
+ if (side != ForgeDirection.UNKNOWN) {
+ final Block tBlock = aTileEntity.getBlockAtSide(side);
+ if ((aCoverVariable < 3) && ((aTileEntity instanceof IFluidHandler))) {
+ if ((side == ForgeDirection.UP) && (aTileEntity.getWorld()
+ .isRaining())
+ && (aTileEntity.getWorld()
+ .getPrecipitationHeight(aTileEntity.getXCoord(), aTileEntity.getZCoord()) - 2
+ < aTileEntity.getYCoord())) {
+ int tAmount = (int) (aTileEntity.getBiome().rainfall * 10.0F);
+ if (tAmount > 0) {
+ ((IFluidHandler) aTileEntity).fill(
+ side,
+ Materials.Water.getFluid(
+ aTileEntity.getWorld()
+ .isThundering() ? tAmount * 2L : tAmount),
+ true);
+ }
+ }
+ FluidStack tLiquid = null;
+ if (tBlock != null) {
+ if (((tBlock == Blocks.water) || (tBlock == Blocks.flowing_water))
+ && (aTileEntity.getMetaIDAtSide(side) == 0)) {
+ tLiquid = Materials.Water.getFluid(1000L);
+ } else if (((tBlock == Blocks.lava) || (tBlock == Blocks.flowing_lava))
+ && (aTileEntity.getMetaIDAtSide(side) == 0)) {
+ tLiquid = Materials.Lava.getFluid(1000L);
+ } else if ((tBlock instanceof IFluidBlock)) {
+ tLiquid = ((IFluidBlock) tBlock).drain(
+ aTileEntity.getWorld(),
+ aTileEntity.getOffsetX(side, 1),
+ aTileEntity.getOffsetY(side, 1),
+ aTileEntity.getOffsetZ(side, 1),
+ false);
+ }
+ if ((tLiquid != null) && (tLiquid.getFluid() != null)
+ && ((side.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 // Horizontal
+ || ((side == ForgeDirection.DOWN) && (tLiquid.getFluid()
+ .getDensity() <= 0))
+ || ((side == ForgeDirection.UP) && (tLiquid.getFluid()
+ .getDensity() >= 0)))
+ && (((IFluidHandler) aTileEntity).fill(side, tLiquid, false) == tLiquid.amount)) {
+ ((IFluidHandler) aTileEntity).fill(side, tLiquid, true);
+ aTileEntity.getWorld()
+ .setBlockToAir(
+ aTileEntity.getXCoord() + side.offsetX,
+ aTileEntity.getYCoord() + side.offsetY,
+ aTileEntity.getZCoord() + side.offsetZ);
+ }
+ }
+ }
+ if ((aCoverVariable >= 3) && (tBlock != null)
+ && ((tBlock == Blocks.lava) || (tBlock == Blocks.flowing_lava)
+ || (tBlock == Blocks.water)
+ || (tBlock == Blocks.flowing_water)
+ || ((tBlock instanceof IFluidBlock)))) {
+ aTileEntity.getWorld()
+ .setBlock(
+ aTileEntity.getOffsetX(side, 1),
+ aTileEntity.getOffsetY(side, 1),
+ aTileEntity.getOffsetZ(side, 1),
+ Blocks.air,
+ 0,
+ 0);
+ }
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 6;
+ if (aCoverVariable < 0) {
+ aCoverVariable = 5;
+ }
+ switch (aCoverVariable) {
+ case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("022", "Import"));
+ case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("023", "Import (conditional)"));
+ case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("024", "Import (invert cond)"));
+ case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("025", "Keep Liquids Away"));
+ case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("026", "Keep Liquids Away (conditional)"));
+ case 5 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("027", "Keep Liquids Away (invert cond)"));
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return ((IMachineProgress) aTileEntity).isAllowedToWork() == aCoverVariable < 2;
+ }
+
+ @Override
+ public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return aCoverVariable < 3 ? 50 : 1;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_EUMeter.java b/src/main/java/gregtech/common/covers/GT_Cover_EUMeter.java
new file mode 100644
index 0000000000..0010f7745b
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_EUMeter.java
@@ -0,0 +1,415 @@
+package gregtech.common.covers;
+
+import java.util.function.Function;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicBatteryBuffer;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_CycleButtonWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Cover_EUMeter extends GT_CoverBehaviorBase<GT_Cover_EUMeter.EUMeterData> {
+
+ public GT_Cover_EUMeter(ITexture coverTexture) {
+ super(EUMeterData.class, coverTexture);
+ }
+
+ @Override
+ public EUMeterData createDataObject(int aLegacyData) {
+ return new EUMeterData(aLegacyData, 0);
+ }
+
+ @Override
+ public EUMeterData createDataObject() {
+ return new EUMeterData();
+ }
+
+ @Override
+ protected EUMeterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ EUMeterData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ final long stored = aCoverVariable.type.getTileEntityStoredEnergy(aTileEntity);
+ final long capacity = aCoverVariable.type.getTileEntityEnergyCapacity(aTileEntity);
+
+ byte redstoneSignal;
+
+ if (stored == 0L) {
+ // nothing
+ redstoneSignal = 0;
+ } else if (stored >= capacity) {
+ // full
+ redstoneSignal = 15;
+ } else {
+ // 1-14 range
+ redstoneSignal = (byte) (1 + (14 * stored) / capacity);
+ }
+
+ if (aCoverVariable.inverted) {
+ redstoneSignal = (byte) (15 - redstoneSignal);
+ }
+
+ if (aCoverVariable.threshold > 0) {
+ if (aCoverVariable.inverted && stored >= aCoverVariable.threshold) {
+ redstoneSignal = 0;
+ } else if (!aCoverVariable.inverted && stored < aCoverVariable.threshold) {
+ redstoneSignal = 0;
+ }
+ }
+
+ aTileEntity.setOutputRedstoneSignal(side, redstoneSignal);
+ return aCoverVariable;
+ }
+
+ @Override
+ protected EUMeterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable,
+ ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ int num = (aCoverVariable.getNum() + (aPlayer.isSneaking() ? -1 : 1) + EnergyType.values().length * 2)
+ % (EnergyType.values().length * 2);
+ switch (num) {
+ case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("031", "Normal Universal Storage"));
+ case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("032", "Inverted Universal Storage"));
+ case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("033", "Normal Electricity Storage"));
+ case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("034", "Inverted Electricity Storage"));
+ case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("035", "Normal Steam Storage"));
+ case 5 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("036", "Inverted Steam Storage"));
+ case 6 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("037", "Normal Average Electric Input"));
+ case 7 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("038", "Inverted Average Electric Input"));
+ case 8 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("039", "Normal Average Electric Output"));
+ case 9 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("040", "Inverted Average Electric Output"));
+ case 10 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("041", "Normal Electricity Storage(Including Batteries)"));
+ case 11 -> GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("042", "Inverted Electricity Storage(Including Batteries)"));
+ }
+ aCoverVariable.setNum(num);
+ return aCoverVariable;
+ }
+
+ // region Static Result Methods
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return false;
+ }
+
+ @Override
+ protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected int getTickRateImpl(ForgeDirection side, int aCoverID, EUMeterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return 20;
+ }
+ // endregion
+
+ // region GUI Stuff
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new EUMeterUIFactory(buildContext).createWindow();
+ }
+
+ private class EUMeterUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ public EUMeterUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ final String INVERTED = GT_Utility.trans("INVERTED", "Inverted");
+ final String NORMAL = GT_Utility.trans("NORMAL", "Normal");
+
+ final CoverDataFollower_NumericWidget<EUMeterData> numericWidget = new CoverDataFollower_NumericWidget<>();
+
+ builder.widget(
+ new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_EUMeter.this)
+ .addFollower(
+ new CoverDataFollower_CycleButtonWidget<>(),
+ coverData -> coverData.type.ordinal(),
+ (coverData, state) -> {
+ coverData.type = EnergyType.getEnergyType(state);
+ return coverData;
+ },
+ widget -> widget.setLength(EnergyType.values().length)
+ .addTooltip(
+ state -> EnergyType.getEnergyType(state)
+ .getTooltip())
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CYCLIC)
+ .setPos(spaceX * 0, spaceY * 0))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofRedstone(),
+ coverData -> coverData.inverted,
+ (coverData, state) -> {
+ coverData.inverted = state;
+ return coverData;
+ },
+ widget -> widget.addTooltip(0, NORMAL)
+ .addTooltip(1, INVERTED)
+ .setPos(spaceX * 0, spaceY * 1))
+ .addFollower(numericWidget, coverData -> (double) coverData.threshold, (coverData, state) -> {
+ coverData.threshold = state.longValue();
+ return coverData;
+ },
+ widget -> widget.setScrollValues(1000, 100, 100000)
+ .setFocusOnGuiOpen(true)
+ .setPos(spaceX * 0, spaceY * 2 + 2)
+ .setSize(spaceX * 8, 12))
+ .setPos(startX, startY))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(() -> getCoverData() != null ? getCoverData().type.getTitle() : "")
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX, 4 + startY))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> getCoverData() != null ? getCoverData().inverted ? INVERTED : NORMAL : "")
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX, 4 + startY + spaceY))
+ .widget(
+ new TextWidget(GT_Utility.trans("222.1", "Energy threshold")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX, startY + spaceY * 3 + 4))
+
+ .widget(
+ new FakeSyncWidget.LongSyncer(
+ () -> getCoverData() != null
+ ? getCoverData().type.getTileEntityEnergyCapacity(getUIBuildContext().getTile())
+ : Long.MAX_VALUE,
+ value -> numericWidget.setMaxValue(value)));
+ }
+ }
+
+ // endregion
+
+ public static class EUMeterData implements ISerializableObject {
+
+ private EnergyType type;
+ private boolean inverted;
+ /**
+ * The special value {@code 0} means threshold check is disabled.
+ */
+ private long threshold;
+
+ public EUMeterData() {
+ type = EnergyType.UNIVERSAL_STORAGE;
+ inverted = false;
+ threshold = 0;
+ }
+
+ public EUMeterData(EnergyType type, boolean inverted, long threshold) {
+ this.type = type;
+ this.inverted = inverted;
+ this.threshold = threshold;
+ }
+
+ public EUMeterData(int num, long threshold) {
+ this();
+ this.setNum(num);
+ this.threshold = threshold;
+ }
+
+ public int getNum() {
+ return type.ordinal() * 2 + (inverted ? 1 : 0);
+ }
+
+ public void setNum(int num) {
+ type = EnergyType.getEnergyType(num / 2);
+ inverted = num % 2 == 1;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new EUMeterData(type, inverted, threshold);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setInteger("typeOrdinal", type.ordinal());
+ tag.setBoolean("inverted", inverted);
+ tag.setLong("threshold", threshold);
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ aBuf.writeInt(type.ordinal());
+ aBuf.writeBoolean(inverted);
+ aBuf.writeLong(threshold);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ int typeOrdinal = tag.getInteger("typeOrdinal");
+ type = EnergyType.getEnergyType(typeOrdinal);
+ inverted = tag.getBoolean("inverted");
+ threshold = tag.getLong("threshold");
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) {
+ int typeOrdinal = aBuf.readInt();
+ type = EnergyType.getEnergyType(typeOrdinal);
+ inverted = aBuf.readBoolean();
+ threshold = aBuf.readLong();
+ return this;
+ }
+ }
+
+ private enum EnergyType {
+
+ UNIVERSAL_STORAGE(GT_Utility.trans("301", "Universal"), GT_Utility.trans("256", "Universal Storage"),
+ ICoverable::getUniversalEnergyStored, ICoverable::getUniversalEnergyCapacity),
+ ELECTRICITY_STORAGE(GT_Utility.trans("302", "Int. EU"), GT_Utility.trans("257", "Electricity Storage"),
+ ICoverable::getStoredEU, ICoverable::getEUCapacity),
+ STEAM_STORAGE(GT_Utility.trans("303", "Steam"), GT_Utility.trans("258", "Steam Storage"),
+ ICoverable::getStoredSteam, ICoverable::getSteamCapacity),
+ AVERAGE_ELECTRIC_INPUT(GT_Utility.trans("304", "Avg. Input"), GT_Utility.trans("259", "Average Electric Input"),
+ ICoverable::getAverageElectricInput, (te) -> te.getInputVoltage() * te.getInputAmperage()),
+ AVERAGE_ELECTRIC_OUTPUT(GT_Utility.trans("305", "Avg. Output"),
+ GT_Utility.trans("260", "Average Electric Output"), ICoverable::getAverageElectricOutput,
+ (te) -> te.getOutputVoltage() * te.getOutputAmperage()),
+ ELECTRICITY_STORAGE_INCLUDING_BATTERIES(GT_Utility.trans("306", "EU stored"),
+ GT_Utility.trans("261", "Electricity Storage(Including Batteries)"), (te) -> {
+ if (te instanceof IGregTechTileEntity) {
+ IMetaTileEntity mte = ((IGregTechTileEntity) te).getMetaTileEntity();
+ if (mte instanceof GT_MetaTileEntity_BasicBatteryBuffer buffer) {
+ return buffer.getStoredEnergy()[0];
+ }
+ }
+ return te.getStoredEU();
+ }, (te) -> {
+ if (te instanceof IGregTechTileEntity) {
+ IMetaTileEntity mte = ((IGregTechTileEntity) te).getMetaTileEntity();
+ if (mte instanceof GT_MetaTileEntity_BasicBatteryBuffer buffer) {
+ return buffer.getStoredEnergy()[1];
+ }
+ }
+ return te.getEUCapacity();
+ });
+
+ private final String title;
+ private final String tooltip;
+ private final Function<ICoverable, Long> getTileEntityStoredEnergyFunc;
+ private final Function<ICoverable, Long> getTileEntityEnergyCapacityFunc;
+
+ EnergyType(String title, String tooltip, Function<ICoverable, Long> getTileEntityStoredEnergyFunc,
+ Function<ICoverable, Long> getTileEntityEnergyCapacityFunc) {
+ this.title = title;
+ this.tooltip = tooltip;
+ this.getTileEntityStoredEnergyFunc = getTileEntityStoredEnergyFunc;
+ this.getTileEntityEnergyCapacityFunc = getTileEntityEnergyCapacityFunc;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public String getTooltip() {
+ return tooltip;
+ }
+
+ public long getTileEntityStoredEnergy(ICoverable aTileEntity) {
+ return getTileEntityStoredEnergyFunc.apply(aTileEntity);
+ }
+
+ public long getTileEntityEnergyCapacity(ICoverable aTileEntity) {
+ return getTileEntityEnergyCapacityFunc.apply(aTileEntity);
+ }
+
+ public EnergyType getNext() {
+ return values()[(ordinal() + 1) % values().length];
+ }
+
+ public static EnergyType getEnergyType(int ordinal) {
+ if (ordinal < 0 || values().length <= ordinal) {
+ ordinal = 0;
+ }
+ return values()[ordinal];
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FacadeAE.java b/src/main/java/gregtech/common/covers/GT_Cover_FacadeAE.java
new file mode 100644
index 0000000000..da6c2c9cfa
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_FacadeAE.java
@@ -0,0 +1,31 @@
+package gregtech.common.covers;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import appeng.facade.IFacadeItem;
+
+public class GT_Cover_FacadeAE extends GT_Cover_FacadeBase {
+
+ @Override
+ protected Block getTargetBlock(ItemStack aFacadeStack) {
+ if (aFacadeStack == null) return null;
+ final Item item = aFacadeStack.getItem();
+ if (!(item instanceof IFacadeItem)) return null;
+ return ((IFacadeItem) item).getBlock(aFacadeStack);
+ }
+
+ @Override
+ protected int getTargetMeta(ItemStack aFacadeStack) {
+ if (aFacadeStack == null) return 0;
+ final Item item = aFacadeStack.getItem();
+ if (!(item instanceof IFacadeItem)) return 0;
+ return ((IFacadeItem) item).getMeta(aFacadeStack);
+ }
+
+ @Override
+ protected ItemStack getDisplayStackImpl(int aCoverID, FacadeData aCoverVariable) {
+ return aCoverVariable.mStack;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java b/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java
new file mode 100644
index 0000000000..a8d853dc1b
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java
@@ -0,0 +1,401 @@
+package gregtech.common.covers;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import cpw.mods.fml.common.network.ByteBufUtils;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_RenderingWorld;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+import io.netty.buffer.ByteBuf;
+
+public abstract class GT_Cover_FacadeBase extends GT_CoverBehaviorBase<GT_Cover_FacadeBase.FacadeData> {
+
+ /**
+ * This is the Dummy, if there is a generic Cover without behavior
+ */
+ public GT_Cover_FacadeBase() {
+ super(FacadeData.class);
+ }
+
+ @Override
+ public boolean isSimpleCover() {
+ return true;
+ }
+
+ @Override
+ public FacadeData createDataObject(int aLegacyData) {
+ return new FacadeData();
+ }
+
+ @Override
+ public FacadeData createDataObject() {
+ return new FacadeData();
+ }
+
+ @Override
+ protected FacadeData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable,
+ ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable.mFlags = ((aCoverVariable.mFlags + 1) & 15);
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ ((aCoverVariable.mFlags & 1) != 0 ? GT_Utility.trans("128.1", "Redstone ") : "")
+ + ((aCoverVariable.mFlags & 2) != 0 ? GT_Utility.trans("129.1", "Energy ") : "")
+ + ((aCoverVariable.mFlags & 4) != 0 ? GT_Utility.trans("130.1", "Fluids ") : "")
+ + ((aCoverVariable.mFlags & 8) != 0 ? GT_Utility.trans("131.1", "Items ") : ""));
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable,
+ ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 1) != 0;
+ }
+
+ @Override
+ protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable,
+ ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 1) != 0;
+ }
+
+ @Override
+ protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable,
+ ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 2) != 0;
+ }
+
+ @Override
+ protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable,
+ ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 2) != 0;
+ }
+
+ @Override
+ protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 4) != 0;
+ }
+
+ @Override
+ protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 4) != 0;
+ }
+
+ @Override
+ protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 8) != 0;
+ }
+
+ @Override
+ protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return (aCoverVariable.mFlags & 8) != 0;
+ }
+
+ @Override
+ public void placeCover(ForgeDirection side, ItemStack aCover, ICoverable aTileEntity) {
+ aTileEntity.setCoverIdAndDataAtSide(
+ side,
+ GT_Utility.stackToInt(aCover),
+ new FacadeData(GT_Utility.copyAmount(1, aCover), 0));
+
+ if (aTileEntity.isClientSide()) GT_RenderingWorld.getInstance()
+ .register(
+ aTileEntity.getXCoord(),
+ aTileEntity.getYCoord(),
+ aTileEntity.getZCoord(),
+ getTargetBlock(aCover),
+ getTargetMeta(aCover));
+ }
+
+ @Override
+ protected ItemStack getDropImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable,
+ ICoverable aTileEntity) {
+ return aCoverVariable.mStack;
+ }
+
+ @Override
+ protected ITexture getSpecialCoverFGTextureImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable,
+ ICoverable aTileEntity) {
+ return getSpecialCoverTextureImpl(side, aCoverID, aCoverVariable, aTileEntity);
+ }
+
+ @Override
+ protected ITexture getSpecialCoverTextureImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable,
+ ICoverable aTileEntity) {
+ if (GT_Utility.isStackInvalid(aCoverVariable.mStack)) return Textures.BlockIcons.ERROR_RENDERING[0];
+ Block block = getTargetBlock(aCoverVariable.mStack);
+ if (block == null) return Textures.BlockIcons.ERROR_RENDERING[0];
+ // TODO: change this when *someone* made the block render in both pass
+ if (block.getRenderBlockPass() != 0) return Textures.BlockIcons.ERROR_RENDERING[0];
+ return TextureFactory.builder()
+ .setFromBlock(block, getTargetMeta(aCoverVariable.mStack))
+ .useWorldCoord()
+ .setFromSide(side)
+ .build();
+ }
+
+ @Override
+ protected Block getFacadeBlockImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable,
+ ICoverable aTileEntity) {
+ if (GT_Utility.isStackInvalid(aCoverVariable.mStack)) return null;
+ return getTargetBlock(aCoverVariable.mStack);
+ }
+
+ @Override
+ protected int getFacadeMetaImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable,
+ ICoverable aTileEntity) {
+ if (GT_Utility.isStackInvalid(aCoverVariable.mStack)) return 0;
+ return getTargetMeta(aCoverVariable.mStack);
+ }
+
+ protected abstract Block getTargetBlock(ItemStack aFacadeStack);
+
+ protected abstract int getTargetMeta(ItemStack aFacadeStack);
+
+ @Override
+ protected boolean isDataNeededOnClientImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected void onDataChangedImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable,
+ ICoverable aTileEntity) {
+ if (aTileEntity.isClientSide()) GT_RenderingWorld.getInstance()
+ .register(
+ aTileEntity.getXCoord(),
+ aTileEntity.getYCoord(),
+ aTileEntity.getZCoord(),
+ getTargetBlock(aCoverVariable.mStack),
+ getTargetMeta(aCoverVariable.mStack));
+ }
+
+ @Override
+ protected void onDroppedImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) {
+ if (aTileEntity.isClientSide()) {
+ for (final ForgeDirection iSide : ForgeDirection.VALID_DIRECTIONS) {
+ if (iSide == side) continue;
+ // since we do not allow multiple type of facade per block, this check would be enough.
+ if (aTileEntity.getCoverBehaviorAtSideNew(iSide) instanceof GT_Cover_FacadeBase) return;
+ }
+ if (aCoverVariable.mStack != null)
+ // mStack == null -> cover removed before data reach client
+ GT_RenderingWorld.getInstance()
+ .unregister(
+ aTileEntity.getXCoord(),
+ aTileEntity.getYCoord(),
+ aTileEntity.getZCoord(),
+ getTargetBlock(aCoverVariable.mStack),
+ getTargetMeta(aCoverVariable.mStack));
+ }
+ }
+
+ @Override
+ protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, FacadeData aCoverVariable,
+ ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ // in case cover data didn't hit client somehow. maybe he had a ridiculous view distance
+ aTileEntity.issueCoverUpdate(side);
+ return super.onCoverRightClickImpl(side, aCoverID, aCoverVariable, aTileEntity, aPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) {
+ // blocks that are not rendered in pass 0 are now accepted but rendered awkwardly
+ // to render it correctly require changing GT_Block_Machine to render in both pass, which is not really a good
+ // idea...
+ if (!super.isCoverPlaceable(side, aStack, aTileEntity)) return false;
+ final Block targetBlock = getTargetBlock(aStack);
+ if (targetBlock == null) return false;
+ // we allow one single type of facade on the same block for now
+ // otherwise it's not clear which block this block should impersonate
+ // this restriction can be lifted later by specifying a certain facade as dominate one as an extension to this
+ // class
+ for (final ForgeDirection iSide : ForgeDirection.VALID_DIRECTIONS) {
+ if (iSide == side) continue;
+ final CoverInfo coverInfo = aTileEntity.getCoverInfoAtSide(iSide);
+ if (!coverInfo.isValid()) continue;
+ final Block facadeBlock = coverInfo.getFacadeBlock();
+ if (facadeBlock == null) continue;
+ if (facadeBlock != targetBlock) return false;
+ if (coverInfo.getFacadeMeta() != getTargetMeta(aStack)) return false;
+ }
+ return true;
+ }
+
+ public static class FacadeData implements ISerializableObject {
+
+ ItemStack mStack;
+ int mFlags;
+
+ public FacadeData() {}
+
+ public FacadeData(ItemStack mStack, int mFlags) {
+ this.mStack = mStack;
+ this.mFlags = mFlags;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new FacadeData(mStack, mFlags);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ final NBTTagCompound tag = new NBTTagCompound();
+ if (mStack != null) tag.setTag("mStack", mStack.writeToNBT(new NBTTagCompound()));
+ tag.setByte("mFlags", (byte) mFlags);
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ ByteBufUtils.writeItemStack(aBuf, mStack);
+ aBuf.writeByte(mFlags);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ final NBTTagCompound tag = (NBTTagCompound) aNBT;
+ mStack = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("mStack"));
+ mFlags = tag.getByte("mFlags");
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ mStack = ISerializableObject.readItemStackFromGreggyByteBuf(aBuf);
+ mFlags = aBuf.readByte();
+ return this;
+ }
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new FacadeBaseUIFactory(buildContext).createWindow();
+ }
+
+ private class FacadeBaseUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ public FacadeBaseUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ builder.widget(
+ new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>(
+ this::getCoverData,
+ this::setCoverData,
+ GT_Cover_FacadeBase.this,
+ this::isEnabled,
+ (id, coverData) -> {
+ coverData.mFlags = getNewCoverVariable(id, coverData);
+ return coverData;
+ }).addToggleButton(
+ 0,
+ CoverDataFollower_ToggleButtonWidget.ofCheckAndCross(),
+ widget -> widget.setPos(spaceX * 0, spaceY * 0))
+ .addToggleButton(
+ 1,
+ CoverDataFollower_ToggleButtonWidget.ofCheckAndCross(),
+ widget -> widget.setPos(spaceX * 0, spaceY * 1))
+ .addToggleButton(
+ 2,
+ CoverDataFollower_ToggleButtonWidget.ofCheckAndCross(),
+ widget -> widget.setPos(spaceX * 0, spaceY * 2))
+ .addToggleButton(
+ 3,
+ CoverDataFollower_ToggleButtonWidget.ofCheckAndCross(),
+ widget -> widget.setPos(spaceX * 0, spaceY * 3))
+ .setPos(startX, startY))
+ .widget(
+ new ItemDrawable(() -> getCoverData() != null ? getCoverData().mStack : null).asWidget()
+ .setPos(5, 5)
+ .setSize(16, 16))
+ .widget(
+ TextWidget.dynamicString(() -> getCoverData() != null ? getCoverData().mStack.getDisplayName() : "")
+ .setSynced(false)
+ .setDefaultColor(COLOR_TITLE.get())
+ .setPos(25, 9))
+ .widget(
+ new TextWidget(GT_Utility.trans("128", "Redstone")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 0))
+ .widget(
+ new TextWidget(GT_Utility.trans("129", "Energy")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 1))
+ .widget(
+ new TextWidget(GT_Utility.trans("130", "Fluids")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 2))
+ .widget(
+ new TextWidget(GT_Utility.trans("131", "Items")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 3));
+ }
+
+ @Override
+ protected void addTitleToUI(ModularWindow.Builder builder) {}
+
+ private int getNewCoverVariable(int id, FacadeData coverVariable) {
+ return switch (id) {
+ case 0 -> coverVariable.mFlags ^ 0x1;
+ case 1 -> coverVariable.mFlags ^ 0x2;
+ case 2 -> coverVariable.mFlags ^ 0x4;
+ case 3 -> coverVariable.mFlags ^ 0x8;
+ default -> coverVariable.mFlags;
+ };
+ }
+
+ private boolean isEnabled(int id, FacadeData coverVariable) {
+ return switch (id) {
+ case 0 -> (coverVariable.mFlags & 0x1) > 0;
+ case 1 -> (coverVariable.mFlags & 0x2) > 0;
+ case 2 -> (coverVariable.mFlags & 0x4) > 0;
+ case 3 -> (coverVariable.mFlags & 0x8) > 0;
+ default -> false;
+ };
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FluidLimiter.java b/src/main/java/gregtech/common/covers/GT_Cover_FluidLimiter.java
new file mode 100644
index 0000000000..142cb875c3
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_FluidLimiter.java
@@ -0,0 +1,207 @@
+package gregtech.common.covers;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget;
+import io.netty.buffer.ByteBuf;
+
+/***
+ * @author TrainerSnow#5086
+ */
+public class GT_Cover_FluidLimiter extends GT_CoverBehaviorBase<GT_Cover_FluidLimiter.FluidLimiterData> {
+
+ public GT_Cover_FluidLimiter(ITexture coverTexture) {
+ super(FluidLimiterData.class, coverTexture);
+ }
+
+ @Override
+ protected FluidLimiterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID,
+ FluidLimiterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aTileEntity instanceof IFluidHandler) {
+ adjustThreshold(aCoverVariable, !aPlayer.isSneaking());
+ GT_Utility.sendChatToPlayer(aPlayer, String.format("Threshold: %f", aCoverVariable.threshold));
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FluidLimiterData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return allowsFluidIn(aCoverVariable, aTileEntity);
+ }
+
+ @Override
+ protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, FluidLimiterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ /*
+ * Helpers
+ */
+
+ private boolean allowsFluidIn(FluidLimiterData aCoverVariable, ICoverable c) {
+ if (c instanceof IFluidHandler) {
+ return aCoverVariable.threshold > getFillLevelInputSlots((IFluidHandler) c);
+ }
+ return false;
+ }
+
+ private void adjustThreshold(FluidLimiterData coverVariable, boolean way) {
+ if (way) {
+ if ((coverVariable.threshold + 0.05f) > 1F) {
+ coverVariable.threshold = 0F;
+ return;
+ }
+ coverVariable.threshold += 0.05F;
+ } else {
+ if ((Math.abs(coverVariable.threshold) - 0.05F) < 0F) {
+ coverVariable.threshold = 1F;
+ return;
+ }
+ coverVariable.threshold -= 0.05F;
+ }
+ }
+
+ private float getFillLevelInputSlots(IFluidHandler fh) {
+ FluidTankInfo[] tankInfo = fh.getTankInfo(ForgeDirection.UNKNOWN);
+ long tMax;
+ long tUsed;
+ if (tankInfo != null) {
+ // 0 Because we acces first slot only
+ FluidTankInfo inputSlot = tankInfo[0];
+ if (inputSlot.fluid != null) {
+ tMax = inputSlot.capacity;
+ tUsed = inputSlot.fluid.amount;
+ return (float) tUsed / (float) tMax;
+ }
+ }
+ return 0F;
+ }
+
+ /*
+ * Data
+ */
+
+ @Override
+ public FluidLimiterData createDataObject(int aLegacyData) {
+ return createDataObject();
+ }
+
+ @Override
+ public FluidLimiterData createDataObject() {
+ return new FluidLimiterData(1F);
+ }
+
+ public static class FluidLimiterData implements ISerializableObject {
+
+ private float threshold;
+
+ public FluidLimiterData(float threshold) {
+ this.threshold = threshold;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new FluidLimiterData(threshold);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setFloat("threshold", this.threshold);
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ aBuf.writeFloat(this.threshold);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ if (aNBT instanceof NBTTagCompound tag) {
+ this.threshold = tag.getFloat("threshold");
+ }
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) {
+ this.threshold = aBuf.readFloat();
+ return this;
+ }
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new FluidLimiterUIFactory(buildContext).createWindow();
+ }
+
+ private class FluidLimiterUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ public FluidLimiterUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ builder.widget(
+ new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_FluidLimiter.this)
+ .addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) Math.round(coverData.threshold * 100),
+ (coverData, val) -> {
+ coverData.threshold = val.floatValue() / 100;
+ return coverData;
+ },
+ widget -> widget.setBounds(0, 100)
+ .setFocusOnGuiOpen(true)
+ .setPos(startX, startY + spaceY * 2 - 24)
+ .setSize(spaceX * 4 - 3, 12)))
+ .widget(
+ new TextWidget("Percent threshold").setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX, startY + spaceY * 2 - 35));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java b/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java
new file mode 100644
index 0000000000..483f882e91
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_FluidRegulator.java
@@ -0,0 +1,536 @@
+package gregtech.common.covers;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.drawable.Text;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * Cover variable
+ *
+ * <pre>
+ * 1111 1111 1111 1111 1111 1111 1111 1111
+ * |- interval-| |- flow rate 2 compl. -|
+ * ^ export?
+ * </pre>
+ *
+ * Concat export and flow rate 2 compl. together to get actual flow rate. A positive actual flow rate is export, and
+ * vice versa.
+ * <p>
+ * Interval is an unsigned 11 bit integer minus 1, so the range is 1~2048. The stored bits will be flipped bitwise if
+ * speed is negative. This way, `0` means 1tick interval, while `-1` means 1 tick interval as well, preserving the
+ * legacy behavior.
+ */
+public class GT_Cover_FluidRegulator extends GT_CoverBehaviorBase<GT_Cover_FluidRegulator.FluidRegulatorData> {
+
+ private static final int SPEED_LENGTH = 20;
+ private static final int TICK_RATE_LENGTH = Integer.SIZE - SPEED_LENGTH - 1;
+ private static final int TICK_RATE_MIN = 1;
+ private static final int TICK_RATE_MAX = (-1 >>> (Integer.SIZE - TICK_RATE_LENGTH)) + TICK_RATE_MIN;
+ private static final int TICK_RATE_BITMASK = (TICK_RATE_MAX - TICK_RATE_MIN) << SPEED_LENGTH;
+
+ public final int mTransferRate;
+ private boolean allowFluid = false;
+
+ public GT_Cover_FluidRegulator(int aTransferRate, ITexture coverTexture) {
+ super(FluidRegulatorData.class, coverTexture);
+ if (aTransferRate > (-1 >>> (Integer.SIZE - SPEED_LENGTH)))
+ throw new IllegalArgumentException("aTransferRate too big: " + aTransferRate);
+ this.mTransferRate = aTransferRate;
+ }
+
+ @Override
+ public FluidRegulatorData createDataObject(int aLegacyData) {
+ return new FluidRegulatorData(aLegacyData);
+ }
+
+ @Override
+ public FluidRegulatorData createDataObject() {
+ return new FluidRegulatorData();
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return aCoverVariable.condition.isRedstoneSensitive();
+ }
+
+ @Override
+ protected FluidRegulatorData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ FluidRegulatorData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ if (aCoverVariable.speed == 0 || !aCoverVariable.condition.isAllowedToWork(side, aCoverID, aTileEntity)) {
+ return aCoverVariable;
+ }
+ if ((aTileEntity instanceof IFluidHandler)) {
+ final IFluidHandler tTank1;
+ final IFluidHandler tTank2;
+ final ForgeDirection directionFrom;
+ final ForgeDirection directionTo;
+ if (aCoverVariable.speed > 0) {
+ tTank2 = aTileEntity.getITankContainerAtSide(side);
+ tTank1 = (IFluidHandler) aTileEntity;
+ directionFrom = side;
+ directionTo = side.getOpposite();
+ } else {
+ tTank1 = aTileEntity.getITankContainerAtSide(side);
+ tTank2 = (IFluidHandler) aTileEntity;
+ directionFrom = side.getOpposite();
+ directionTo = side;
+ }
+ if (tTank1 != null && tTank2 != null) {
+ allowFluid = true;
+ GT_Utility
+ .moveFluid(tTank1, tTank2, directionFrom, Math.abs(aCoverVariable.speed), this::canTransferFluid);
+ allowFluid = false;
+ }
+ }
+ return aCoverVariable;
+ }
+
+ private void adjustSpeed(EntityPlayer aPlayer, FluidRegulatorData aCoverVariable, int scale) {
+ int tSpeed = aCoverVariable.speed;
+ tSpeed += scale;
+ int tTickRate = aCoverVariable.tickRate;
+ if (Math.abs(tSpeed) > mTransferRate * tTickRate) {
+ tSpeed = mTransferRate * tTickRate * (tSpeed > 0 ? 1 : -1);
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("316", "Pump speed limit reached!"));
+ }
+ if (tTickRate == 1) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("048", "Pump speed: ") + tSpeed
+ + GT_Utility.trans("049", "L/tick ")
+ + tSpeed * 20
+ + GT_Utility.trans("050", "L/sec"));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ String.format(
+ GT_Utility.trans("207", "Pump speed: %dL every %d ticks, %.2f L/sec on average"),
+ tSpeed,
+ tTickRate,
+ tSpeed * 20d / tTickRate));
+ }
+ }
+
+ @Override
+ public FluidRegulatorData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID,
+ FluidRegulatorData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (GT_Utility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) {
+ adjustSpeed(aPlayer, aCoverVariable, aPlayer.isSneaking() ? 256 : 16);
+ } else {
+ adjustSpeed(aPlayer, aCoverVariable, aPlayer.isSneaking() ? -256 : -16);
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable,
+ ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (GT_Utility.getClickedFacingCoords(side, aX, aY, aZ)[0] >= 0.5F) {
+ adjustSpeed(aPlayer, aCoverVariable, 1);
+ } else {
+ adjustSpeed(aPlayer, aCoverVariable, -1);
+ }
+ return true;
+ }
+
+ protected boolean canTransferFluid(FluidStack fluid) {
+ return true;
+ }
+
+ @Override
+ public boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsInImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return allowFluid;
+ }
+
+ @Override
+ public boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return allowFluid;
+ }
+
+ @Override
+ protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected int getTickRateImpl(ForgeDirection side, int aCoverID, FluidRegulatorData aCoverVariable,
+ ICoverable aTileEntity) {
+ return aCoverVariable.tickRate;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new FluidRegulatorUIFactory(buildContext).createWindow();
+ }
+
+ private class FluidRegulatorUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ private static final NumberFormatMUI numberFormat;
+ static {
+ numberFormat = new NumberFormatMUI();
+ numberFormat.setMaximumFractionDigits(2);
+ }
+
+ public FluidRegulatorUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ AtomicBoolean warn = new AtomicBoolean(false);
+
+ builder.widget(
+ new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_FluidRegulator.this)
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.speed >= 0,
+ (coverData, state) -> {
+ coverData.speed = Math.abs(coverData.speed);
+ return coverData;
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT)
+ .addTooltip(GT_Utility.trans("006", "Export"))
+ .setPos(spaceX * 0, spaceY * 0))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.speed <= 0,
+ (coverData, state) -> {
+ coverData.speed = -Math.abs(coverData.speed);
+ return coverData;
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT)
+ .addTooltip(GT_Utility.trans("007", "Import"))
+ .setPos(spaceX * 1, spaceY * 0))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.condition == Conditional.Always,
+ (coverData, state) -> {
+ coverData.condition = Conditional.Always;
+ return coverData;
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK)
+ .addTooltip(GT_Utility.trans("224", "Always On"))
+ .setPos(spaceX * 0, spaceY * 1))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.condition == Conditional.Conditional,
+ (coverData, state) -> {
+ coverData.condition = Conditional.Conditional;
+ return coverData;
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_USE_PROCESSING_STATE)
+ .addTooltip(GT_Utility.trans("343", "Use Machine Processing State"))
+ .setPos(spaceX * 1, spaceY * 1))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.condition == Conditional.Inverted,
+ (coverData, state) -> {
+ coverData.condition = Conditional.Inverted;
+ return coverData;
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_USE_INVERTED_PROCESSING_STATE)
+ .addTooltip(GT_Utility.trans("343.1", "Use Inverted Machine Processing State"))
+ .setPos(spaceX * 2, spaceY * 1))
+ .addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) coverData.speed,
+ (coverData, state) -> {
+ coverData.speed = state.intValue();
+ return coverData;
+ },
+ widget -> widget.setBounds(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY)
+ .setValidator(val -> {
+ final int tickRate = getCoverData() != null ? getCoverData().tickRate : 0;
+ final long maxFlow = (long) mTransferRate
+ * GT_Utility.clamp(tickRate, TICK_RATE_MIN, TICK_RATE_MAX);
+ warn.set(false);
+ if (val > maxFlow) {
+ val = maxFlow;
+ warn.set(true);
+ } else if (val < -maxFlow) {
+ val = -maxFlow;
+ warn.set(true);
+ }
+ return val;
+ })
+ .setScrollValues(1, 144, 1000)
+ .setFocusOnGuiOpen(true)
+ .setPos(spaceX * 0, spaceY * 2 + 2)
+ .setSize(spaceX * 4 - 3, 12))
+ .addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) coverData.tickRate,
+ (coverData, state) -> {
+ coverData.tickRate = state.intValue();
+ return coverData;
+ },
+ widget -> widget.setBounds(0, TICK_RATE_MAX)
+ .setValidator(val -> {
+ final int speed = getCoverData() != null ? getCoverData().speed : 0;
+ warn.set(false);
+ if (val > TICK_RATE_MAX) {
+ val = (long) TICK_RATE_MAX;
+ warn.set(true);
+ } else if (Math.abs(speed) > mTransferRate * val) {
+ val = (long) Math
+ .min(TICK_RATE_MAX, (Math.abs(speed) + mTransferRate - 1) / mTransferRate);
+ warn.set(true);
+ } else if (val < TICK_RATE_MIN) {
+ val = 1L;
+ }
+ return val;
+ })
+ .setPos(spaceX * 5, spaceY * 2 + 2)
+ .setSize(spaceX * 2 - 3, 12))
+ .setPos(startX, startY))
+ .widget(
+ new TextWidget(GT_Utility.trans("229", "Export/Import")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 4, 4 + startY + spaceY * 0))
+ .widget(
+ new TextWidget(GT_Utility.trans("230", "Conditional")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 4, 4 + startY + spaceY * 1))
+ .widget(
+ new TextWidget(GT_Utility.trans("208", " L")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 4, 4 + startY + spaceY * 2))
+ .widget(
+ new TextWidget(GT_Utility.trans("209", " ticks")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 7, 4 + startY + spaceY * 2))
+ .widget(new TextWidget().setTextSupplier(() -> {
+ FluidRegulatorData coverVariable = getCoverData();
+ if (coverVariable == null) return new Text("");
+ return new Text(
+ GT_Utility.trans("210.1", "Average:") + " "
+ + numberFormat.format(
+ coverVariable.tickRate == 0 ? 0 : coverVariable.speed * 20d / coverVariable.tickRate)
+ + " "
+ + GT_Utility.trans("210.2", "L/sec"))
+ .color(warn.get() ? COLOR_TEXT_WARN.get() : COLOR_TEXT_GRAY.get());
+ })
+ .setPos(startX + spaceX * 0, 4 + startY + spaceY * 3));
+ }
+ }
+
+ @Override
+ public boolean allowsTickRateAddition() {
+ return false;
+ }
+
+ public enum Conditional {
+
+ Always(false) {
+
+ @Override
+ boolean isAllowedToWork(ForgeDirection side, int aCoverID, ICoverable aTileEntity) {
+ return true;
+ }
+ },
+ Conditional(true) {
+
+ @Override
+ boolean isAllowedToWork(ForgeDirection side, int aCoverID, ICoverable aTileEntity) {
+ return !(aTileEntity instanceof IMachineProgress) || ((IMachineProgress) aTileEntity).isAllowedToWork();
+ }
+ },
+ Inverted(true) {
+
+ @Override
+ boolean isAllowedToWork(ForgeDirection side, int aCoverID, ICoverable aTileEntity) {
+ return !(aTileEntity instanceof IMachineProgress)
+ || !((IMachineProgress) aTileEntity).isAllowedToWork();
+ }
+ };
+
+ static final Conditional[] VALUES = values();
+ private final boolean redstoneSensitive;
+
+ Conditional(boolean redstoneSensitive) {
+ this.redstoneSensitive = redstoneSensitive;
+ }
+
+ abstract boolean isAllowedToWork(ForgeDirection side, int aCoverID, ICoverable aTileEntity);
+
+ boolean isRedstoneSensitive() {
+ return redstoneSensitive;
+ }
+ }
+
+ public static class FluidRegulatorData implements ISerializableObject {
+
+ private int tickRate;
+ private int speed;
+ private Conditional condition;
+
+ private static int getSpeed(int aCoverVariable) {
+ // positive or 0 -> interval bits need to be set to zero
+ // negative -> interval bits need to be set to one
+ return aCoverVariable >= 0 ? aCoverVariable & ~TICK_RATE_BITMASK : aCoverVariable | TICK_RATE_BITMASK;
+ }
+
+ private static int getTickRate(int aCoverVariable) {
+ // range: TICK_RATE_MIN ~ TICK_RATE_MAX
+ return ((Math.abs(aCoverVariable) & TICK_RATE_BITMASK) >>> SPEED_LENGTH) + TICK_RATE_MIN;
+ }
+
+ public FluidRegulatorData() {
+ this(0);
+ }
+
+ public FluidRegulatorData(int legacy) {
+ this(getTickRate(legacy), getSpeed(legacy), Conditional.Always);
+ }
+
+ public FluidRegulatorData(int tickRate, int speed, Conditional condition) {
+ this.tickRate = tickRate;
+ this.speed = speed;
+ this.condition = condition;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new FluidRegulatorData(tickRate, speed, condition);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setInteger("mSpeed", speed);
+ tag.setInteger("mTickRate", tickRate);
+ tag.setByte("mCondition", (byte) condition.ordinal());
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ aBuf.writeInt(tickRate)
+ .writeInt(speed)
+ .writeByte(condition.ordinal());
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ if (!(aNBT instanceof NBTTagCompound tag)) return; // not very good...
+ speed = tag.getInteger("mSpeed");
+ tickRate = tag.getInteger("mTickRate");
+ condition = Conditional.VALUES[tag.getByte("mCondition")];
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) {
+ return new FluidRegulatorData(aBuf.readInt(), aBuf.readInt(), Conditional.VALUES[aBuf.readUnsignedByte()]);
+ }
+
+ public int getTickRate() {
+ return tickRate;
+ }
+
+ public void setTickRate(int tickRate) {
+ this.tickRate = tickRate;
+ }
+
+ public int getSpeed() {
+ return speed;
+ }
+
+ public void setSpeed(int speed) {
+ this.speed = speed;
+ }
+
+ public Conditional getCondition() {
+ return condition;
+ }
+
+ public void setCondition(Conditional condition) {
+ this.condition = condition;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FluidStorageMonitor.java b/src/main/java/gregtech/common/covers/GT_Cover_FluidStorageMonitor.java
new file mode 100644
index 0000000000..7f9fda7cbc
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_FluidStorageMonitor.java
@@ -0,0 +1,507 @@
+package gregtech.common.covers;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR0;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR1;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR10;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR11;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR12;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR13;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR14;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR2;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR3;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR4;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR5;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR6;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR7;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR8;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR9;
+
+import java.util.Optional;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidContainerItem;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.ITextureBuilder;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalTankBase;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * TODO: Implement overlay rendering only with
+ * {@link GT_CoverBehaviorBase#getSpecialCoverFGTextureImpl(ForgeDirection, int, ISerializableObject, ICoverable)}
+ */
+public class GT_Cover_FluidStorageMonitor extends GT_CoverBehaviorBase<GT_Cover_FluidStorageMonitor.FluidStorageData> {
+
+ private static final IIconContainer[] icons = new IIconContainer[] { OVERLAY_FLUID_STORAGE_MONITOR0,
+ OVERLAY_FLUID_STORAGE_MONITOR1, OVERLAY_FLUID_STORAGE_MONITOR2, OVERLAY_FLUID_STORAGE_MONITOR3,
+ OVERLAY_FLUID_STORAGE_MONITOR4, OVERLAY_FLUID_STORAGE_MONITOR5, OVERLAY_FLUID_STORAGE_MONITOR6,
+ OVERLAY_FLUID_STORAGE_MONITOR7, OVERLAY_FLUID_STORAGE_MONITOR8, OVERLAY_FLUID_STORAGE_MONITOR9,
+ OVERLAY_FLUID_STORAGE_MONITOR10, OVERLAY_FLUID_STORAGE_MONITOR11, OVERLAY_FLUID_STORAGE_MONITOR12,
+ OVERLAY_FLUID_STORAGE_MONITOR13, OVERLAY_FLUID_STORAGE_MONITOR14, };
+
+ public GT_Cover_FluidStorageMonitor() {
+ super(FluidStorageData.class);
+ }
+
+ @Override
+ public FluidStorageData createDataObject(int aLegacyData) {
+ return new FluidStorageData();
+ }
+
+ @Override
+ public FluidStorageData createDataObject() {
+ return new FluidStorageData();
+ }
+
+ @Override
+ protected FluidStorageData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ FluidStorageData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ final FluidTankInfo[] tanks = getValidFluidTankInfosForDisplay(aTileEntity, aCoverVariable.side);
+ if (tanks == null) {
+ return aCoverVariable.disable()
+ .issueCoverUpdateIfNeeded(aTileEntity, side);
+ }
+ assert 0 < tanks.length;
+
+ if (aCoverVariable.slot < 0 || tanks.length <= aCoverVariable.slot) {
+ aCoverVariable.setSlot(0);
+ }
+
+ final FluidTankInfo tank = tanks[aCoverVariable.slot];
+ if (tank == null) {
+ return aCoverVariable.setNullTank()
+ .issueCoverUpdateIfNeeded(aTileEntity, side);
+ }
+
+ return aCoverVariable.setFluid(tank.fluid)
+ .setScale(getTankScale(tank))
+ .issueCoverUpdateIfNeeded(aTileEntity, side);
+ }
+
+ @Override
+ protected ITexture getSpecialCoverFGTextureImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable,
+ ICoverable aTileEntity) {
+ return getSpecialCoverTextureImpl(side, aCoverID, aCoverVariable, aTileEntity);
+ }
+
+ @Override
+ protected ITexture getSpecialCoverTextureImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable,
+ ICoverable aTileEntity) {
+ if (aCoverVariable.slot == -1 || aCoverVariable.fluid == null || aCoverVariable.scale == 0) {
+ return TextureFactory.of(OVERLAY_FLUID_STORAGE_MONITOR0);
+ }
+ final IIconContainer fluidIcon = new IIconContainer() {
+
+ @Override
+ public IIcon getIcon() {
+ return aCoverVariable.fluid.getStillIcon();
+ }
+
+ @Override
+ public IIcon getOverlayIcon() {
+ return null;
+ }
+
+ @Override
+ public ResourceLocation getTextureFile() {
+ return TextureMap.locationBlocksTexture;
+ }
+ };
+
+ final short[] fluidRGBA = colorToRGBA(aCoverVariable.fluid.getColor());
+ final ITextureBuilder fluidTextureBuilder = TextureFactory.builder()
+ .addIcon(fluidIcon)
+ .setRGBA(fluidRGBA);
+ if (aCoverVariable.fluid.getLuminosity() > 0) fluidTextureBuilder.glow();
+ return TextureFactory.of(fluidTextureBuilder.build(), TextureFactory.of(icons[aCoverVariable.scale]));
+ }
+
+ @Override
+ protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable,
+ ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer == null || aPlayer.worldObj == null || aPlayer.worldObj.isRemote) {
+ return false;
+ }
+ final ItemStack heldItem = aPlayer.getHeldItem();
+ if (aPlayer.isSneaking() || heldItem == null) {
+ return false;
+ }
+ final FluidTankInfo[] tanks = getValidFluidTankInfos(aTileEntity, aCoverVariable.side);
+ if (tanks == null) {
+ return false;
+ }
+ if (aCoverVariable.slot < 0 || tanks.length <= aCoverVariable.slot) {
+ return false;
+ }
+ final FluidTankInfo tank = tanks[aCoverVariable.slot];
+ if (tank == null) {
+ return false;
+ }
+ IFluidHandler tankHandler = (IFluidHandler) aTileEntity;
+
+ final ItemStack heldItemSizedOne = GT_Utility.copyAmount(1, heldItem);
+ if (heldItemSizedOne == null || heldItemSizedOne.stackSize <= 0) {
+ return false;
+ }
+
+ ItemStack result;
+ result = fillToTank(heldItemSizedOne, tankHandler, aCoverVariable.side);
+ if (result != null) {
+ replaceHeldItemStack(aPlayer, heldItem, result);
+ return true;
+ }
+ result = fillToContainer(heldItemSizedOne, tank, tankHandler, aCoverVariable.side);
+ if (result != null) {
+ replaceHeldItemStack(aPlayer, heldItem, result);
+ return true;
+ }
+ return false;
+ }
+
+ protected static ItemStack fillToTank(@Nonnull ItemStack container, @Nonnull IFluidHandler tank,
+ ForgeDirection side) {
+ final FluidStack fluidToFill = GT_Utility.getFluidForFilledItem(container, true);
+ if (fluidToFill == null || fluidToFill.getFluid() == null || fluidToFill.amount <= 0) {
+ return null;
+ }
+ if (!tank.canFill(side, fluidToFill.getFluid())) {
+ return null;
+ }
+
+ if (container.getItem() instanceof IFluidContainerItem containerItem) {
+ final int filled = tank.fill(side, fluidToFill, true);
+ if (filled == 0) {
+ return null;
+ }
+ containerItem.drain(container, filled, true);
+ return container;
+ } else {
+ final int filled = tank.fill(side, fluidToFill, false);
+ if (filled != fluidToFill.amount) {
+ return null;
+ }
+ tank.fill(side, fluidToFill, true);
+ return GT_Utility.getContainerForFilledItem(container, false);
+ }
+ }
+
+ protected static ItemStack fillToContainer(@Nonnull ItemStack container, @Nonnull FluidTankInfo tankInfo,
+ @Nonnull IFluidHandler tank, ForgeDirection side) {
+ if (tankInfo.fluid == null || tankInfo.fluid.getFluid() == null || tankInfo.fluid.amount <= 0) {
+ return null;
+ }
+ if (!tank.canDrain(side, tankInfo.fluid.getFluid())) {
+ return null;
+ }
+
+ if (container.getItem() instanceof IFluidContainerItem containerItem) {
+ final int filled = Math.min(
+ Optional
+ .ofNullable(
+ tank.drain(
+ side,
+ new FluidStack(tankInfo.fluid.getFluid(), containerItem.getCapacity(container)),
+ false))
+ .filter(fs -> GT_Utility.areFluidsEqual(fs, tankInfo.fluid))
+ .map(fs -> fs.amount)
+ .orElse(0),
+ containerItem.fill(
+ container,
+ new FluidStack(tankInfo.fluid.getFluid(), containerItem.getCapacity(container)),
+ false));
+ if (filled == 0) {
+ return null;
+ }
+ containerItem.fill(container, new FluidStack(tankInfo.fluid.getFluid(), filled), true);
+ tank.drain(side, new FluidStack(tankInfo.fluid.getFluid(), filled), true);
+ return container;
+ } else {
+ final ItemStack filledContainer = GT_Utility.fillFluidContainer(tankInfo.fluid, container, false, false);
+ if (filledContainer == null) {
+ return null;
+ }
+ final FluidStack filledFluid = GT_Utility.getFluidForFilledItem(filledContainer, false);
+ if (filledFluid == null || filledFluid.getFluid() == null || filledFluid.amount <= 0) {
+ return null;
+ }
+ if (Optional.ofNullable(tank.drain(side, filledFluid, false))
+ .filter(fs -> GT_Utility.areFluidsEqual(fs, filledFluid))
+ .map(fs -> fs.amount)
+ .orElse(0) != filledFluid.amount) {
+ return null;
+ }
+ tank.drain(side, filledFluid, true);
+ return filledContainer;
+ }
+ }
+
+ protected static void replaceHeldItemStack(@Nonnull EntityPlayer player, @Nonnull ItemStack heldItem,
+ @Nonnull ItemStack result) {
+ heldItem.stackSize--;
+ GT_Utility.addItemToPlayerInventory(player, result);
+ player.inventoryContainer.detectAndSendChanges();
+ }
+
+ @Override
+ protected FluidStorageData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID,
+ FluidStorageData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ aCoverVariable
+ .setSide(ForgeDirection.values()[(aCoverVariable.side.ordinal() + 1) % ForgeDirection.values().length])
+ .setSlot(0);
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("SIDE", "Side: ") + aCoverVariable.side.name());
+ return aCoverVariable;
+ }
+ final FluidTankInfo[] tanks = getValidFluidTankInfos(aTileEntity, aCoverVariable.side);
+ if (tanks == null) {
+ return aCoverVariable.disable();
+ }
+ assert 0 < tanks.length;
+ if (aCoverVariable.slot < 0 || tanks.length <= aCoverVariable.slot) {
+ aCoverVariable.setSlot(0);
+ } else {
+ aCoverVariable
+ .setSlot((aCoverVariable.slot + tanks.length + (aPlayer.isSneaking() ? -1 : 1)) % tanks.length);
+ }
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("053", "Slot: ") + aCoverVariable.slot);
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean isDataNeededOnClientImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected int getTickRateImpl(ForgeDirection side, int aCoverID, FluidStorageData aCoverVariable,
+ ICoverable aTileEntity) {
+ return 10;
+ }
+
+ @Nullable
+ protected static FluidTankInfo[] getValidFluidTankInfos(@Nullable ICoverable tileEntity,
+ @Nonnull ForgeDirection side) {
+ if (tileEntity instanceof IFluidHandler) {
+ final FluidTankInfo[] tanks = ((IFluidHandler) tileEntity).getTankInfo(side);
+ if (tanks != null && tanks.length > 0) {
+ return tanks;
+ }
+ }
+ return null;
+ }
+
+ @Nullable
+ protected static FluidTankInfo[] getValidFluidTankInfosForDisplay(@Nullable ICoverable tileEntity,
+ @Nonnull ForgeDirection side) {
+ if (tileEntity instanceof IGregTechTileEntity baseMetaTileEntity
+ && baseMetaTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalTankBase digitalTank) {
+ return digitalTank.getRealTankInfo(side);
+ }
+ return getValidFluidTankInfos(tileEntity, side);
+ }
+
+ protected static int getTankScale(@Nonnull FluidTankInfo tank) {
+ if (tank.fluid == null || tank.capacity <= 0) {
+ return 0;
+ }
+ return (int) Math.ceil(tank.fluid.amount / (double) tank.capacity * (icons.length - 1));
+ }
+
+ protected short[] colorToRGBA(int color) {
+ return new short[] { (short) (color >> 16 & 0xFF), (short) (color >> 8 & 0xFF), (short) (color & 0xFF),
+ (short) (0xFF) };
+ }
+
+ public static class FluidStorageData implements ISerializableObject {
+
+ private ForgeDirection side;
+ private int slot;
+ private Fluid fluid;
+ private int scale;
+ private boolean dirty;
+
+ public FluidStorageData() {
+ this(ForgeDirection.UNKNOWN, 0, null, 0, false);
+ }
+
+ public FluidStorageData(ForgeDirection side, int slot, Fluid fluid, int scale, boolean dirty) {
+ this.side = side;
+ this.slot = slot;
+ this.fluid = fluid;
+ this.scale = scale;
+ this.dirty = dirty;
+ }
+
+ public FluidStorageData setSide(ForgeDirection side) {
+ this.side = side;
+ return this;
+ }
+
+ /**
+ * @param slot 0-based index of the tank, -1 for no correct FluidTankInfo[] for the current side.
+ */
+ public FluidStorageData setSlot(int slot) {
+ if (this.slot != slot) {
+ if (this.slot == -1 || slot == -1) {
+ this.dirty = true;
+ }
+ this.slot = slot;
+ }
+ return this;
+ }
+
+ /**
+ * Means there is no correct FluidTankInfo[] for the current side.
+ */
+ public FluidStorageData disable() {
+ setSlot(-1);
+ return this;
+ }
+
+ public FluidStorageData setFluid(@Nullable Fluid fluid) {
+ if (!Util.areFluidsEqual(this.fluid, fluid)) {
+ this.fluid = fluid;
+ this.dirty = true;
+ }
+ return this;
+ }
+
+ public FluidStorageData setFluid(@Nullable FluidStack fluidStack) {
+ final Fluid fluid = fluidStack == null ? null : fluidStack.getFluid();
+ return setFluid(fluid);
+ }
+
+ public FluidStorageData setScale(int scale) {
+ if (this.scale != scale) {
+ this.scale = scale;
+ this.dirty = true;
+ }
+ return this;
+ }
+
+ public FluidStorageData setNullTank() {
+ return this.setFluid((Fluid) null)
+ .setScale(0);
+ }
+
+ public FluidStorageData issueCoverUpdateIfNeeded(ICoverable tileEntity, ForgeDirection side) {
+ if (this.dirty) {
+ tileEntity.issueCoverUpdate(side);
+ this.dirty = false;
+ }
+ return this;
+ }
+
+ // region ISerializableObject
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new FluidStorageData(side, slot, fluid, scale, dirty);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ side = ForgeDirection.getOrientation(tag.getByte("side"));
+ slot = tag.getInteger("slot");
+ fluid = Util.getFluid(tag.getString("fluidName"));
+ scale = tag.getInteger("scale");
+ dirty = tag.getBoolean("dirty");
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setByte("side", (byte) side.ordinal());
+ tag.setInteger("slot", slot);
+ tag.setString("fluidName", Util.getFluidName(fluid));
+ tag.setInteger("scale", scale);
+ tag.setBoolean("dirty", dirty);
+ return tag;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) {
+ final ForgeDirection side = ForgeDirection.getOrientation(aBuf.readByte());
+ final int slot = aBuf.readInt();
+ final Fluid fluid = Util.getFluid(aBuf.readInt());
+ final int scale = aBuf.readInt();
+ final boolean dirty = aBuf.readBoolean();
+ return new FluidStorageData(side, slot, fluid, scale, dirty);
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ aBuf.writeByte(side.ordinal());
+ aBuf.writeInt(slot);
+ aBuf.writeInt(Util.getFluidID(fluid));
+ aBuf.writeInt(scale);
+ aBuf.writeBoolean(dirty);
+ }
+ // endregion
+
+ }
+
+ protected static class Util {
+
+ public static int getFluidID(@Nullable Fluid fluid) {
+ return fluid == null ? -1 : fluid.getID();
+ }
+
+ public static String getFluidName(@Nullable Fluid fluid) {
+ return fluid == null ? "" : fluid.getName();
+ }
+
+ public static Fluid getFluid(int id) {
+ return id == -1 ? null : FluidRegistry.getFluid(id);
+ }
+
+ public static Fluid getFluid(String name) {
+ return name.isEmpty() ? null : FluidRegistry.getFluid(name);
+ }
+
+ public static boolean areFluidsEqual(@Nullable Fluid a, @Nullable Fluid b) {
+ return getFluidID(a) == getFluidID(b);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Fluidfilter.java b/src/main/java/gregtech/common/covers/GT_Cover_Fluidfilter.java
new file mode 100644
index 0000000000..5a6999e055
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_Fluidfilter.java
@@ -0,0 +1,422 @@
+package gregtech.common.covers;
+
+import static gregtech.api.enums.GT_Values.E;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.Constants.NBT;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.ModularUITextures;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_SlotWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Cover_Fluidfilter extends GT_CoverBehaviorBase<GT_Cover_Fluidfilter.FluidFilterData> {
+
+ // Uses the lower 3 bits of the cover variable, so we have 8 options to work with (0-7)
+ private final int FILTER_INPUT_DENY_OUTPUT = 0; // 000
+ private final int INVERT_INPUT_DENY_OUTPUT = 1; // 001
+ private final int FILTER_INPUT_ANY_OUTPUT = 2; // 010
+ private final int INVERT_INPUT_ANY_OUTPUT = 3; // 011
+ private final int DENY_INPUT_FILTER_OUTPUT = 4; // 100
+ private final int DENY_INPUT_INVERT_OUTPUT = 5; // 101
+ private final int ANY_INPUT_FILTER_OUTPUT = 6; // 110
+ private final int ANY_INPUT_INVERT_OUTPUT = 7; // 111
+
+ public GT_Cover_Fluidfilter(ITexture coverTexture) {
+ super(FluidFilterData.class, coverTexture);
+ }
+
+ @Override
+ public FluidFilterData createDataObject() {
+ return new FluidFilterData(-1, 0);
+ }
+
+ @Override
+ public FluidFilterData createDataObject(int aLegacyData) {
+ return new FluidFilterData(aLegacyData >>> 3, aLegacyData & 0x7);
+ }
+
+ @Override
+ protected String getDescriptionImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable,
+ ICoverable aTileEntity) {
+ final Fluid fluid = FluidRegistry.getFluid(aCoverVariable.mFluidID);
+ if (fluid == null) return E;
+
+ final FluidStack sFluid = new FluidStack(fluid, 1000);
+ return (String
+ .format("Filtering Fluid: %s - %s", sFluid.getLocalizedName(), getFilterMode(aCoverVariable.mFilterMode)));
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return false;
+ }
+
+ @Override
+ protected FluidFilterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ FluidFilterData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ return aCoverVariable;
+ }
+
+ public String getFilterMode(int aFilterMode) {
+ return switch (aFilterMode) {
+ case FILTER_INPUT_DENY_OUTPUT -> GT_Utility.trans("043", "Filter input, Deny output");
+ case INVERT_INPUT_DENY_OUTPUT -> GT_Utility.trans("044", "Invert input, Deny output");
+ case FILTER_INPUT_ANY_OUTPUT -> GT_Utility.trans("045", "Filter input, Permit any output");
+ case INVERT_INPUT_ANY_OUTPUT -> GT_Utility.trans("046", "Invert input, Permit any output");
+ case DENY_INPUT_FILTER_OUTPUT -> GT_Utility.trans("307", "Deny input, Filter output");
+ case DENY_INPUT_INVERT_OUTPUT -> GT_Utility.trans("308", "Deny input, Invert output");
+ case ANY_INPUT_FILTER_OUTPUT -> GT_Utility.trans("309", "Permit any input, Filter output");
+ case ANY_INPUT_INVERT_OUTPUT -> GT_Utility.trans("310", "Permit any input, Invert output");
+ default -> ("UNKNOWN");
+ };
+ }
+
+ @Override
+ protected FluidFilterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID,
+ FluidFilterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable.mFilterMode = (aCoverVariable.mFilterMode + (aPlayer.isSneaking() ? -1 : 1)) % 8;
+ if (aCoverVariable.mFilterMode < 0) {
+ aCoverVariable.mFilterMode = 7;
+ }
+
+ GT_Utility.sendChatToPlayer(aPlayer, getFilterMode(aCoverVariable.mFilterMode));
+
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable,
+ ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (side == ForgeDirection.UNKNOWN) return false;
+ if (((aX > 0.375D) && (aX < 0.625D)) || ((side.offsetX != 0) && ((aY > 0.375D) && (aY < 0.625D)))
+ || (side.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) != 0 && aZ > 0.375D && aZ < 0.625D
+ || (side.offsetZ != 0)) {
+ final ItemStack tStack = aPlayer.inventory.getCurrentItem();
+ if (tStack == null) return true;
+
+ final FluidStack tFluid = GT_Utility.getFluidForFilledItem(tStack, true);
+ if (tFluid != null) {
+ final int aFluid = tFluid.getFluidID();
+ aCoverVariable.mFluidID = aFluid;
+ aTileEntity.setCoverDataAtSide(side, aCoverVariable);
+ final FluidStack sFluid = new FluidStack(FluidRegistry.getFluid(aFluid), 1000);
+ GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("047", "Filter Fluid: ") + sFluid.getLocalizedName());
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsInImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ if (aFluid == null) return true;
+
+ int aFilterMode = aCoverVariable.mFilterMode;
+ int aFilterFluid = aCoverVariable.mFluidID;
+
+ if (aFilterMode == DENY_INPUT_FILTER_OUTPUT || aFilterMode == DENY_INPUT_INVERT_OUTPUT) return false;
+ else if (aFilterMode == ANY_INPUT_FILTER_OUTPUT || aFilterMode == ANY_INPUT_INVERT_OUTPUT) return true;
+ else if (aFluid.getID() == aFilterFluid)
+ return aFilterMode == FILTER_INPUT_DENY_OUTPUT || aFilterMode == FILTER_INPUT_ANY_OUTPUT;
+ else return aFilterMode == INVERT_INPUT_DENY_OUTPUT || aFilterMode == INVERT_INPUT_ANY_OUTPUT;
+ }
+
+ @Override
+ protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ if (aFluid == null) return true;
+
+ int aFilterMode = aCoverVariable.mFilterMode;
+ int aFilterFluid = aCoverVariable.mFluidID;
+
+ if (aFilterMode == FILTER_INPUT_DENY_OUTPUT || aFilterMode == INVERT_INPUT_DENY_OUTPUT) return false;
+ else if (aFilterMode == FILTER_INPUT_ANY_OUTPUT || aFilterMode == INVERT_INPUT_ANY_OUTPUT) return true;
+ else if (aFluid.getID() == aFilterFluid)
+ return aFilterMode == DENY_INPUT_FILTER_OUTPUT || aFilterMode == ANY_INPUT_FILTER_OUTPUT;
+ else return aFilterMode == DENY_INPUT_INVERT_OUTPUT || aFilterMode == ANY_INPUT_INVERT_OUTPUT;
+ }
+
+ @Override
+ protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected int getTickRateImpl(ForgeDirection side, int aCoverID, FluidFilterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return 0;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new FluidFilterUIFactory(buildContext).createWindow();
+ }
+
+ private class FluidFilterUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ public FluidFilterUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ builder.widget(
+ new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>(
+ this::getCoverData,
+ this::setCoverData,
+ GT_Cover_Fluidfilter.this,
+ (id, coverData) -> !getClickable(id, coverData),
+ (id, coverData) -> {
+ coverData.mFilterMode = getNewFilterMode(id, coverData);
+ return coverData;
+ }).addToggleButton(
+ 0,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT)
+ .addTooltip(GT_Utility.trans("232", "Filter Input"))
+ .setPos(spaceX * 0, spaceY * 0))
+ .addToggleButton(
+ 1,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT)
+ .addTooltip(GT_Utility.trans("233", "Filter Output"))
+ .setPos(spaceX * 1, spaceY * 0))
+ .addToggleButton(
+ 2,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_BLOCK_INPUT)
+ .addTooltip(GT_Utility.trans("234", "Block Output"))
+ .setPos(spaceX * 0, spaceY * 2))
+ .addToggleButton(
+ 3,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_ALLOW_INPUT)
+ .addTooltip(GT_Utility.trans("235", "Allow Output"))
+ .setPos(spaceX * 1, spaceY * 2))
+ .addToggleButton(
+ 4,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_WHITELIST)
+ .addTooltip(GT_Utility.trans("236", "Whitelist Fluid"))
+ .setPos(spaceX * 0, spaceY * 1))
+ .addToggleButton(
+ 5,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_BLACKLIST)
+ .addTooltip(GT_Utility.trans("237", "Blacklist Fluid"))
+ .setPos(spaceX * 1, spaceY * 1))
+ .addFollower(
+ new CoverDataFollower_SlotWidget<FluidFilterData>(new ItemStackHandler(), 0, true) {
+
+ @Override
+ protected void putClickedStack(ItemStack stack, int mouseButton) {
+ if (stack != null && GT_Utility.getFluidFromContainerOrFluidDisplay(stack) == null)
+ return;
+ super.putClickedStack(
+ GT_Utility.getFluidDisplayStack(
+ GT_Utility.getFluidFromContainerOrFluidDisplay(stack),
+ false),
+ mouseButton);
+ }
+ },
+ this::getFluidDisplayItem,
+ (coverData, stack) -> {
+ if (stack == null) {
+ coverData.mFluidID = -1;
+ } else {
+ FluidStack fluid = GT_Utility.getFluidFromDisplayStack(stack);
+ if (fluid != null && fluid.getFluid() != null) {
+ coverData.mFluidID = fluid.getFluid()
+ .getID();
+ }
+ }
+ return coverData;
+ },
+ widget -> widget.setBackground(ModularUITextures.FLUID_SLOT)
+ .setPos(0, spaceY * 3 + 2))
+ .setPos(startX, startY))
+ .widget(
+ new TextWidget(GT_Utility.trans("238", "Filter Direction")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 2, 3 + startY + spaceY * 0))
+ .widget(
+ new TextWidget(GT_Utility.trans("239", "Filter Type")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 2, 3 + startY + spaceY * 1))
+ .widget(
+ new TextWidget(GT_Utility.trans("240", "Block Flow")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 2, 3 + startY + spaceY * 2))
+ .widget(TextWidget.dynamicString(() -> {
+ if (getCoverData() != null) {
+ ItemStack fluidDisplay = getFluidDisplayItem(getCoverData());
+ if (fluidDisplay != null) {
+ return fluidDisplay.getDisplayName();
+ }
+ }
+ return GT_Utility.trans("315", "Filter Empty");
+ })
+ .setSynced(false)
+ .setDefaultColor(COLOR_TITLE.get())
+ .setPos(startX + spaceX + 3, 4 + startY + spaceY * 3));
+ }
+
+ private int getNewFilterMode(int id, FluidFilterData coverVariable) {
+ return switch (id) {
+ case 0 -> (coverVariable.mFilterMode & 0x3);
+ case 1 -> (coverVariable.mFilterMode | 0x4);
+ case 2 -> (coverVariable.mFilterMode & 0x5);
+ case 3 -> (coverVariable.mFilterMode | 0x2);
+ case 4 -> (coverVariable.mFilterMode & 0x6);
+ case 5 -> (coverVariable.mFilterMode | 0x1);
+ default -> coverVariable.mFilterMode;
+ };
+ }
+
+ private boolean getClickable(int id, FluidFilterData coverVariable) {
+ return switch (id) {
+ case 0, 1 -> (coverVariable.mFilterMode >> 2 & 0x1) != (id & 0x1);
+ case 2, 3 -> (coverVariable.mFilterMode >> 1 & 0x1) != (id & 0x1);
+ case 4, 5 -> (coverVariable.mFilterMode & 0x1) != (id & 0x1);
+ default -> false;
+ };
+ }
+
+ private ItemStack getFluidDisplayItem(FluidFilterData coverData) {
+ Fluid fluid = FluidRegistry.getFluid(coverData.mFluidID);
+ return GT_Utility.getFluidDisplayStack(fluid);
+ }
+ }
+
+ public static class FluidFilterData implements ISerializableObject {
+
+ private int mFluidID;
+ private int mFilterMode;
+
+ public FluidFilterData(int mFluidID, int mFilterMode) {
+ this.mFluidID = mFluidID;
+ this.mFilterMode = mFilterMode;
+ }
+
+ @Override
+ @Nonnull
+ public ISerializableObject copy() {
+ return new FluidFilterData(mFluidID, mFilterMode);
+ }
+
+ @Override
+ @Nonnull
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tNBT = new NBTTagCompound();
+ tNBT.setInteger("mFilterMode", mFilterMode);
+ if (mFluidID >= 0) tNBT.setString(
+ "mFluid",
+ FluidRegistry.getFluid(mFluidID)
+ .getName());
+ return tNBT;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ aBuf.writeByte(mFilterMode)
+ .writeInt(mFluidID);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ if (aNBT instanceof NBTTagCompound tNBT) {
+ mFilterMode = tNBT.getInteger("mFilterMode");
+ if (tNBT.hasKey("mFluid", NBT.TAG_STRING))
+ mFluidID = FluidRegistry.getFluidID(tNBT.getString("mFluid"));
+ else mFluidID = -1;
+ }
+ }
+
+ @Override
+ @Nonnull
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ mFilterMode = aBuf.readByte();
+ mFluidID = aBuf.readInt();
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java b/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java
new file mode 100644
index 0000000000..d93c4b29d1
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java
@@ -0,0 +1,303 @@
+package gregtech.common.covers;
+
+import static gregtech.api.util.GT_Utility.intToStack;
+import static gregtech.api.util.GT_Utility.moveMultipleItemStacks;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import cpw.mods.fml.common.network.ByteBufUtils;
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_SlotWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Cover_ItemFilter extends GT_CoverBehaviorBase<GT_Cover_ItemFilter.ItemFilterData> {
+
+ private final boolean mExport;
+
+ public GT_Cover_ItemFilter(boolean isExport, ITexture coverTexture) {
+ super(ItemFilterData.class, coverTexture);
+ this.mExport = isExport;
+ }
+
+ @Override
+ public ItemFilterData createDataObject(int aLegacyData) {
+ return new ItemFilterData((aLegacyData & 0x1) == 0, intToStack(aLegacyData >>> 1));
+ }
+
+ @Override
+ public ItemFilterData createDataObject() {
+ return new ItemFilterData();
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return false;
+ }
+
+ @Override
+ protected ItemFilterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ ItemFilterData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ final TileEntity tTileEntity = aTileEntity.getTileEntityAtSide(side);
+ final Object fromEntity = mExport ? aTileEntity : tTileEntity;
+ final Object toEntity = !mExport ? aTileEntity : tTileEntity;
+ final ForgeDirection fromSide = !mExport ? side.getOpposite() : side;
+ final ForgeDirection toSide = mExport ? side.getOpposite() : side;
+
+ final List<ItemStack> filter = Collections.singletonList(aCoverVariable.mFilter);
+
+ moveMultipleItemStacks(
+ fromEntity,
+ toEntity,
+ fromSide,
+ toSide,
+ filter,
+ aCoverVariable.mWhitelist,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1,
+ 64);
+
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable,
+ ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ final ItemStack tStack = aPlayer.inventory.getCurrentItem();
+ if (tStack != null) {
+ aCoverVariable.mFilter = tStack;
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("299", "Item Filter: ") + tStack.getDisplayName());
+ } else {
+ aCoverVariable.mFilter = null;
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("300", "Filter Cleared!"));
+ }
+ return true;
+ }
+
+ @Override
+ protected ItemFilterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID,
+ ItemFilterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable.mWhitelist = !aCoverVariable.mWhitelist;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ aCoverVariable.mWhitelist ? GT_Utility.trans("125.1", "Whitelist Mode")
+ : GT_Utility.trans("124.1", "Blacklist Mode"));
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean alwaysLookConnectedImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected int getTickRateImpl(ForgeDirection side, int aCoverID, ItemFilterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return 1;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new ItemFilterUIFactory(buildContext).createWindow();
+ }
+
+ private class ItemFilterUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ public ItemFilterUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ ItemStackHandler filterInvHandler = new ItemStackHandler(1);
+ if (getCoverData() != null) {
+ filterInvHandler.setStackInSlot(0, setStackSize1(getCoverData().mFilter));
+ }
+ builder.widget(
+ new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_ItemFilter.this)
+ .addFollower(
+ new CoverDataFollower_ToggleButtonWidget<>(),
+ coverData -> coverData.mWhitelist,
+ (coverData, state) -> {
+ coverData.mWhitelist = state;
+ return coverData;
+ },
+ widget -> widget
+ .setToggleTexture(
+ GT_UITextures.OVERLAY_BUTTON_BLACKLIST,
+ GT_UITextures.OVERLAY_BUTTON_WHITELIST)
+ .addTooltip(0, GT_Utility.trans("125.1", "Whitelist Mode"))
+ .addTooltip(1, GT_Utility.trans("124.1", "Blacklist Mode"))
+ .setPos(spaceX * 0, spaceY * 0))
+ .addFollower(
+ new CoverDataFollower_SlotWidget<>(filterInvHandler, 0, true),
+ coverData -> setStackSize1(coverData.mFilter),
+ (coverData, stack) -> {
+ coverData.mFilter = setStackSize1(stack);
+ return coverData;
+ },
+ widget -> widget.setBackground(GT_UITextures.SLOT_DARK_GRAY)
+ .setPos(spaceX * 0, spaceY * 2))
+ .setPos(startX, startY))
+ .widget(
+ new TextWidget(GT_Utility.trans("317", "Filter: ")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 0, 3 + startY + spaceY * 1))
+ .widget(
+ new TextWidget(GT_Utility.trans("318", "Check Mode")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 2, 3 + startY + spaceY * 0));
+ }
+
+ private ItemStack setStackSize1(ItemStack stack) {
+ if (stack != null) {
+ stack.stackSize = 1;
+ }
+ return stack;
+ }
+ }
+
+ public static class ItemFilterData implements ISerializableObject {
+
+ private boolean mWhitelist;
+ private ItemStack mFilter;
+
+ public ItemFilterData() {}
+
+ public ItemFilterData(boolean mWhitelist, ItemStack mFilter) {
+ this.mWhitelist = mWhitelist;
+ this.mFilter = mFilter;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new ItemFilterData(mWhitelist, mFilter);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setBoolean("mWhitelist", mWhitelist);
+ if (mFilter != null) tag.setTag("mFilter", mFilter.writeToNBT(new NBTTagCompound()));
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ aBuf.writeBoolean(mWhitelist);
+ ByteBufUtils.writeItemStack(aBuf, mFilter);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ mWhitelist = tag.getBoolean("mWhitelist");
+ if (tag.hasKey("mFilter", Constants.NBT.TAG_COMPOUND))
+ mFilter = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("mFilter"));
+ else mFilter = null;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ mWhitelist = aBuf.readBoolean();
+ mFilter = ISerializableObject.readItemStackFromGreggyByteBuf(aBuf);
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java b/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java
new file mode 100644
index 0000000000..bb2364cf0e
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java
@@ -0,0 +1,389 @@
+package gregtech.common.covers;
+
+import java.text.FieldPosition;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+import gregtech.common.gui.modularui.widget.ItemWatcherSlotWidget;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_OutputBus_ME;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalChestBase;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Cover_ItemMeter extends GT_CoverBehaviorBase<GT_Cover_ItemMeter.ItemMeterData> {
+
+ // Legacy data format
+ private static final int SLOT_MASK = 0x3FFFFFFF; // 0 = all, 1 = 0 ...
+ private static final int CONVERTED_BIT = 0x80000000;
+ private static final int INVERT_BIT = 0x40000000;
+
+ public GT_Cover_ItemMeter(ITexture coverTexture) {
+ super(ItemMeterData.class, coverTexture);
+ }
+
+ @Override
+ public ItemMeterData createDataObject(int aLegacyData) {
+ // Convert from ver. 5.09.33.50
+ if ((CONVERTED_BIT & aLegacyData) == 0) if (aLegacyData == 0) aLegacyData = CONVERTED_BIT;
+ else if (aLegacyData == 1) aLegacyData = CONVERTED_BIT | INVERT_BIT;
+ else if (aLegacyData > 1) aLegacyData = CONVERTED_BIT | Math.min((aLegacyData - 2), SLOT_MASK);
+
+ boolean invert = (aLegacyData & INVERT_BIT) == INVERT_BIT;
+ int slot = (aLegacyData & SLOT_MASK) - 1;
+
+ return new ItemMeterData(invert, slot, 0);
+ }
+
+ @Override
+ public ItemMeterData createDataObject() {
+ return new ItemMeterData();
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return false;
+ }
+
+ public static byte computeSignalBasedOnItems(ICoverable tileEntity, boolean inverted, int threshold, int slot,
+ int ordinalSide) {
+ long max = 0;
+ long used = 0;
+ final IMetaTileEntity mte = ((IGregTechTileEntity) tileEntity).getMetaTileEntity();
+ if (mte instanceof GT_MetaTileEntity_DigitalChestBase dc) {
+ max = dc.getMaxItemCount();
+ used = dc.getProgresstime();
+ } else if (mte instanceof GT_MetaTileEntity_Hatch_OutputBus_ME) {
+ if (((GT_MetaTileEntity_Hatch_OutputBus_ME) mte).isLastOutputFailed()) {
+ max = 64;
+ used = 64;
+ }
+ } else {
+ final int[] slots = slot >= 0 ? new int[] { slot } : tileEntity.getAccessibleSlotsFromSide(ordinalSide);
+
+ for (int i : slots) {
+ if (i >= 0 && i < tileEntity.getSizeInventory()) {
+ max += 64;
+ final ItemStack stack = tileEntity.getStackInSlot(i);
+ if (stack != null) used += ((long) stack.stackSize << 6) / stack.getMaxStackSize();
+ }
+ }
+ }
+
+ return GT_Utility.convertRatioToRedstone(used, max, threshold, inverted);
+ }
+
+ @Override
+ protected ItemMeterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ ItemMeterData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ byte signal = computeSignalBasedOnItems(
+ aTileEntity,
+ aCoverVariable.inverted,
+ aCoverVariable.threshold,
+ aCoverVariable.slot,
+ side.ordinal());
+ aTileEntity.setOutputRedstoneSignal(side, signal);
+
+ return aCoverVariable;
+ }
+
+ @Override
+ protected ItemMeterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable,
+ ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ if (aCoverVariable.inverted) {
+ aCoverVariable.inverted = false;
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("055", "Normal"));
+ } else {
+ aCoverVariable.inverted = true;
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("054", "Inverted"));
+ }
+ } else {
+ aCoverVariable.slot++;
+ if (aCoverVariable.slot > aTileEntity.getSizeInventory()) aCoverVariable.slot = -1;
+
+ if (aCoverVariable.slot == -1) GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("053", "Slot: ") + GT_Utility.trans("ALL", "All"));
+ else GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("053", "Slot: ") + aCoverVariable.slot);
+ }
+
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID,
+ ItemMeterData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected int getTickRateImpl(ForgeDirection side, int aCoverID, ItemMeterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return 5;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new ItemMeterUIFactory(buildContext).createWindow();
+ }
+
+ private class ItemMeterUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ /**
+ * Display the text "All" instead of a number when the slot is set to -1.
+ */
+ protected static final NumberFormatMUI numberFormatAll = new NumberFormatMUI() {
+
+ @Override
+ public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
+ if (number < 0) {
+ return toAppendTo.append(GT_Utility.trans("ALL", "All"));
+ } else {
+ return super.format(number, toAppendTo, pos);
+ }
+ }
+ };
+
+ private int maxSlot;
+ private int maxThreshold;
+
+ public ItemMeterUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ final String INVERTED = GT_Utility.trans("INVERTED", "Inverted");
+ final String NORMAL = GT_Utility.trans("NORMAL", "Normal");
+
+ setMaxSlot();
+ setMaxThreshold();
+
+ builder.widget(
+ new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_ItemMeter.this)
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofRedstone(),
+ coverData -> coverData.inverted,
+ (coverData, state) -> {
+ coverData.inverted = state;
+ return coverData;
+ },
+ widget -> widget.addTooltip(0, NORMAL)
+ .addTooltip(1, INVERTED)
+ .setPos(0, 0))
+ .addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) coverData.threshold,
+ (coverData, state) -> {
+ coverData.threshold = state.intValue();
+ return coverData;
+ },
+ widget -> widget.setBounds(0, maxThreshold)
+ .setScrollValues(1, 64, 1000)
+ .setFocusOnGuiOpen(true)
+ .setPos(0, 2 + spaceY)
+ .setSize(spaceX * 4 + 5, 12))
+ .addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) coverData.slot,
+ (coverData, state) -> {
+ coverData.slot = state.intValue();
+ return coverData;
+ },
+ widget -> widget.setBounds(-1, maxSlot)
+ .setDefaultValue(-1)
+ .setScrollValues(1, 100, 10)
+ .setNumberFormat(numberFormatAll)
+ .setPos(0, 2 + spaceY * 2)
+ .setSize(spaceX * 3 + 1, 12))
+ .setPos(startX, startY))
+ .widget(
+ new ItemWatcherSlotWidget().setGetter(this::getTargetItem)
+ .setPos(startX + spaceX * 3 + 8, startY + spaceY * 2))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> getCoverData() != null ? getCoverData().inverted ? INVERTED : NORMAL : "")
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX, 4 + startY))
+ .widget(
+ new TextWidget(GT_Utility.trans("254", "Detect slot #")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 4 + 9, 4 + startY + spaceY * 2))
+ .widget(
+ new TextWidget(GT_Utility.trans("221", "Item threshold")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 4 + 9, 4 + startY + spaceY));
+ }
+
+ private void setMaxSlot() {
+ final ICoverable tile = getUIBuildContext().getTile();
+ if (!tile.isDead() && tile instanceof IGregTechTileEntity gtTile
+ && !(gtTile.getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalChestBase)) {
+ maxSlot = Math.min(tile.getSizeInventory() - 1, SLOT_MASK - 1);
+ } else {
+ maxSlot = -1;
+ }
+ }
+
+ private void setMaxThreshold() {
+ final ICoverable tile = getUIBuildContext().getTile();
+ if (!tile.isDead() && tile instanceof IGregTechTileEntity gtTile
+ && gtTile.getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalChestBase) {
+ maxThreshold = gtTile.getMaxItemCount();
+ } else {
+ maxThreshold = maxSlot > 0 ? maxSlot * 64 : Integer.MAX_VALUE;
+ }
+ }
+
+ private ItemStack getTargetItem() {
+ ItemMeterData coverVariable = getCoverData();
+ if (coverVariable == null || coverVariable.slot < 0) {
+ return null;
+ }
+ ICoverable tile = getUIBuildContext().getTile();
+ if (tile instanceof TileEntity && !tile.isDead()) {
+ if (tile.getSizeInventory() >= coverVariable.slot) {
+ return tile.getStackInSlot(coverVariable.slot);
+ }
+ }
+ return null;
+ }
+ }
+
+ public static class ItemMeterData implements ISerializableObject {
+
+ private boolean inverted;
+ /** The special value {@code -1} means all slots. */
+ private int slot;
+ /** The special value {@code 0} means threshold check is disabled. */
+ private int threshold;
+
+ public ItemMeterData() {
+ inverted = false;
+ slot = -1;
+ threshold = 0;
+ }
+
+ public ItemMeterData(boolean inverted, int slot, int threshold) {
+ this.inverted = inverted;
+ this.slot = slot;
+ this.threshold = threshold;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new ItemMeterData(inverted, slot, threshold);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setBoolean("invert", inverted);
+ tag.setInteger("slot", slot);
+ tag.setInteger("threshold", threshold);
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ aBuf.writeBoolean(inverted);
+ aBuf.writeInt(slot);
+ aBuf.writeInt(threshold);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ inverted = tag.getBoolean("invert");
+ slot = tag.getInteger("slot");
+ threshold = tag.getInteger("threshold");
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ inverted = aBuf.readBoolean();
+ slot = aBuf.readInt();
+ threshold = aBuf.readInt();
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Lens.java b/src/main/java/gregtech/common/covers/GT_Cover_Lens.java
new file mode 100644
index 0000000000..94794e5892
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_Lens.java
@@ -0,0 +1,28 @@
+package gregtech.common.covers;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehavior;
+
+public class GT_Cover_Lens extends GT_CoverBehavior {
+
+ private final byte mColor;
+
+ public GT_Cover_Lens(byte aColor, ITexture coverTexture) {
+ super(coverTexture);
+ this.mColor = aColor;
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public byte getLensColor(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return this.mColor;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_LiquidMeter.java b/src/main/java/gregtech/common/covers/GT_Cover_LiquidMeter.java
new file mode 100644
index 0000000000..c3a4b4ff89
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_LiquidMeter.java
@@ -0,0 +1,297 @@
+package gregtech.common.covers;
+
+import java.util.Arrays;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalTankBase;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * TODO: Implement overlay rendering only with
+ * {@link GT_CoverBehaviorBase#getSpecialCoverFGTextureImpl(ForgeDirection, int, ISerializableObject, ICoverable)}
+ */
+public class GT_Cover_LiquidMeter extends GT_CoverBehaviorBase<GT_Cover_LiquidMeter.LiquidMeterData> {
+
+ public GT_Cover_LiquidMeter(ITexture coverTexture) {
+ super(LiquidMeterData.class, coverTexture);
+ }
+
+ @Override
+ public LiquidMeterData createDataObject(int aLegacyData) {
+ return new LiquidMeterData(aLegacyData == 0, 0);
+ }
+
+ @Override
+ public LiquidMeterData createDataObject() {
+ return new LiquidMeterData();
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return false;
+ }
+
+ public static byte computeSignalBasedOnFluid(ICoverable tileEntity, boolean inverted, int threshold) {
+ if (tileEntity instanceof IFluidHandler) {
+ FluidTankInfo[] tanks = ((IFluidHandler) tileEntity).getTankInfo(ForgeDirection.UNKNOWN);
+ long max = 0;
+ long used = 0;
+ if (tanks != null) {
+ for (FluidTankInfo tank : tanks) {
+ if (tank != null) {
+ if (tileEntity instanceof BaseMetaTileEntity && ((BaseMetaTileEntity) tileEntity)
+ .getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalTankBase) {
+ max += ((GT_MetaTileEntity_DigitalTankBase) ((BaseMetaTileEntity) tileEntity)
+ .getMetaTileEntity()).getRealCapacity();
+ } else max += tank.capacity;
+ FluidStack tLiquid = tank.fluid;
+ if (tLiquid != null) {
+ used += tLiquid.amount;
+ }
+ }
+ }
+ }
+
+ return GT_Utility.convertRatioToRedstone(used, max, threshold, inverted);
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ protected LiquidMeterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ LiquidMeterData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ byte signal = computeSignalBasedOnFluid(aTileEntity, aCoverVariable.inverted, aCoverVariable.threshold);
+ aTileEntity.setOutputRedstoneSignal(side, signal);
+
+ return aCoverVariable;
+ }
+
+ @Override
+ protected LiquidMeterData onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID,
+ LiquidMeterData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aCoverVariable.inverted) {
+ aCoverVariable.inverted = false;
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("055", "Normal"));
+ } else {
+ aCoverVariable.inverted = true;
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("054", "Inverted"));
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsFluidInImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsItemsInImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID,
+ LiquidMeterData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected int getTickRateImpl(ForgeDirection side, int aCoverID, LiquidMeterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return 5;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new LiquidMeterUIFactory(buildContext).createWindow();
+ }
+
+ private class LiquidMeterUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+ private int maxCapacity;
+
+ public LiquidMeterUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ final String INVERTED = GT_Utility.trans("INVERTED", "Inverted");
+ final String NORMAL = GT_Utility.trans("NORMAL", "Normal");
+
+ setMaxCapacity();
+
+ builder.widget(
+ new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_LiquidMeter.this)
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofRedstone(),
+ coverData -> coverData.inverted,
+ (coverData, state) -> {
+ coverData.inverted = state;
+ return coverData;
+ },
+ widget -> widget.addTooltip(0, NORMAL)
+ .addTooltip(1, INVERTED)
+ .setPos(spaceX * 0, spaceY * 0))
+ .addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) coverData.threshold,
+ (coverData, state) -> {
+ coverData.threshold = state.intValue();
+ return coverData;
+ },
+ widget -> widget.setBounds(0, maxCapacity > 0 ? maxCapacity : Integer.MAX_VALUE)
+ .setScrollValues(1000, 144, 100000)
+ .setFocusOnGuiOpen(true)
+ .setPos(spaceX * 0, spaceY * 1 + 2)
+ .setSize(spaceX * 4 + 5, 12))
+ .setPos(startX, startY))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> getCoverData() != null ? getCoverData().inverted ? INVERTED : NORMAL : "")
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 1, 4 + startY + spaceY * 0))
+ .widget(
+ new TextWidget(GT_Utility.trans("222", "Fluid threshold")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 5 - 10, startY + spaceY * 1 + 4));
+ }
+
+ private void setMaxCapacity() {
+ final ICoverable tile = getUIBuildContext().getTile();
+ if (!tile.isDead() && tile instanceof IFluidHandler) {
+ FluidTankInfo[] tanks = ((IFluidHandler) tile).getTankInfo(ForgeDirection.UNKNOWN);
+ maxCapacity = Arrays.stream(tanks)
+ .mapToInt(tank -> tank.capacity)
+ .sum();
+ } else {
+ maxCapacity = -1;
+ }
+ }
+ }
+
+ public static class LiquidMeterData implements ISerializableObject {
+
+ private boolean inverted;
+ /**
+ * The special value {@code 0} means threshold check is disabled.
+ */
+ private int threshold;
+
+ public LiquidMeterData() {
+ inverted = false;
+ threshold = 0;
+ }
+
+ public LiquidMeterData(boolean inverted, int threshold) {
+ this.inverted = inverted;
+ this.threshold = threshold;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new LiquidMeterData(inverted, threshold);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setBoolean("invert", inverted);
+ tag.setInteger("threshold", threshold);
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ aBuf.writeBoolean(inverted);
+ aBuf.writeInt(threshold);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ inverted = tag.getBoolean("invert");
+ threshold = tag.getInteger("threshold");
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ inverted = aBuf.readBoolean();
+ threshold = aBuf.readInt();
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Metrics_Transmitter.java b/src/main/java/gregtech/common/covers/GT_Cover_Metrics_Transmitter.java
new file mode 100644
index 0000000000..6d3cf529d3
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_Metrics_Transmitter.java
@@ -0,0 +1,212 @@
+package gregtech.common.covers;
+
+import java.util.List;
+import java.util.UUID;
+
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetricsExporter;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.events.MetricsCoverDataEvent;
+import gregtech.common.events.MetricsCoverSelfDestructEvent;
+import gregtech.common.misc.GlobalMetricsCoverDatabase;
+import gregtech.common.misc.GlobalMetricsCoverDatabase.State;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * Used to transmit Nuclear Control information across dimensions. The only reason this is a cover is to artificially
+ * limit the number of total machines that transmit this data, for performance reasons.
+ * <p>
+ * This cover will retrieve information, preferentially, using {@link IMetricsExporter#reportMetrics()}. Absent this
+ * method, it will resort to {@link BaseMetaTileEntity#getInfoData()} instead.
+ */
+public class GT_Cover_Metrics_Transmitter
+ extends GT_CoverBehaviorBase<GT_Cover_Metrics_Transmitter.MetricsTransmitterData> {
+
+ @SuppressWarnings("SpellCheckingInspection")
+ public static final String FREQUENCY_MSB_KEY = "gt.metricscover.freq_msb";
+ @SuppressWarnings("SpellCheckingInspection")
+ public static final String FREQUENCY_LSB_KEY = "gt.metricscover.freq_lsb";
+ public static final String MACHINE_KEY = "machine_name";
+ public static final String CARD_STATE_KEY = "card_state";
+
+ @SuppressWarnings("unused")
+ public GT_Cover_Metrics_Transmitter() {
+ this(null);
+ }
+
+ public GT_Cover_Metrics_Transmitter(ITexture coverTexture) {
+ super(MetricsTransmitterData.class, coverTexture);
+ }
+
+ @Override
+ public MetricsTransmitterData createDataObject(int aLegacyData) {
+ // As a new cover, this shouldn't fire.
+ return new MetricsTransmitterData();
+ }
+
+ @Override
+ public MetricsTransmitterData createDataObject() {
+ return new MetricsTransmitterData();
+ }
+
+ @Override
+ protected int getTickRateImpl(ForgeDirection side, int aCoverID, MetricsTransmitterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return 20;
+ }
+
+ @Override
+ public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) {
+ return aTileEntity instanceof final IGregTechDeviceInformation device && device.isGivingInformation();
+ }
+
+ @Override
+ protected MetricsTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ MetricsTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ if (aTileEntity instanceof final BaseMetaTileEntity baseMTE && baseMTE.isGivingInformation()) {
+ final List<String> payload;
+
+ if (baseMTE.getMetaTileEntity() instanceof final IMetricsExporter metricsExporter) {
+ payload = metricsExporter.reportMetrics();
+ } else {
+ payload = ImmutableList.copyOf(baseMTE.getInfoData());
+ }
+
+ MinecraftForge.EVENT_BUS.post(new MetricsCoverDataEvent(
+ aCoverVariable.frequency,
+ payload,
+ new GlobalMetricsCoverDatabase.Coordinates(
+ baseMTE.getWorld().provider.getDimensionName(),
+ baseMTE.getXCoord(),
+ baseMTE.getYCoord(),
+ baseMTE.getZCoord()
+ )
+ ));
+ }
+
+ return aCoverVariable;
+ }
+
+ @Override
+ protected void onDroppedImpl(ForgeDirection side, int aCoverID, MetricsTransmitterData aCoverVariable,
+ ICoverable aTileEntity) {
+ MinecraftForge.EVENT_BUS.post(new MetricsCoverSelfDestructEvent(aCoverVariable.frequency));
+ }
+
+ @Override
+ public void onPlayerAttach(EntityPlayer player, ItemStack aCover, ICoverable aTileEntity, ForgeDirection side) {
+ final UUID newFrequency = UUID.randomUUID();
+ final ItemStack cardStack = ItemList.NC_AdvancedSensorCard.get(1);
+
+ if (cardStack == null) {
+ return;
+ }
+
+ final NBTTagCompound tagCompound = new NBTTagCompound();
+ tagCompound.setLong(FREQUENCY_MSB_KEY, newFrequency.getMostSignificantBits());
+ tagCompound.setLong(FREQUENCY_LSB_KEY, newFrequency.getLeastSignificantBits());
+ tagCompound.setInteger(CARD_STATE_KEY, State.OPERATIONAL.getType());
+
+ if (aTileEntity instanceof final BaseMetaTileEntity baseMTE) {
+ final ItemStack baseMTEStack = baseMTE.getStackForm(1);
+ if (baseMTEStack != null) {
+ tagCompound.setTag(MACHINE_KEY, baseMTEStack.writeToNBT(new NBTTagCompound()));
+ }
+ }
+
+ cardStack.setTagCompound(tagCompound);
+ aTileEntity.getCoverInfoAtSide(side)
+ .setCoverData(new MetricsTransmitterData(newFrequency));
+
+ final EntityItem cardEntity = new EntityItem(player.worldObj, player.posX, player.posY, player.posZ, cardStack);
+ cardEntity.delayBeforeCanPickup = 0;
+ player.worldObj.spawnEntityInWorld(cardEntity);
+ }
+
+ @Override
+ public boolean allowsCopyPasteTool() {
+ return false;
+ }
+
+ @Override
+ public List<String> getAdditionalTooltipImpl(MetricsTransmitterData data) {
+ return ImmutableList.of(
+ StatCollector.translateToLocalFormatted(
+ "gt.item.adv_sensor_card.tooltip.frequency",
+ EnumChatFormatting.UNDERLINE.toString() + EnumChatFormatting.YELLOW + data.frequency.toString()));
+ }
+
+ public static class MetricsTransmitterData implements ISerializableObject {
+
+ private UUID frequency;
+
+ public MetricsTransmitterData() {
+ this.frequency = UUID.randomUUID();
+ }
+
+ public MetricsTransmitterData(@NotNull UUID frequency) {
+ this.frequency = frequency;
+ }
+
+ @NotNull
+ public UUID getFrequency() {
+ return frequency;
+ }
+
+ @NotNull
+ @Override
+ public ISerializableObject copy() {
+ return new MetricsTransmitterData(frequency);
+ }
+
+ @NotNull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setLong(FREQUENCY_MSB_KEY, frequency.getMostSignificantBits());
+ tag.setLong(FREQUENCY_LSB_KEY, frequency.getLeastSignificantBits());
+ return tag;
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ if (aNBT instanceof final NBTTagCompound tag) {
+ frequency = new UUID(tag.getLong(FREQUENCY_MSB_KEY), tag.getLong(FREQUENCY_LSB_KEY));
+ }
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ aBuf.writeLong(frequency.getMostSignificantBits());
+ aBuf.writeLong(frequency.getLeastSignificantBits());
+ }
+
+ @NotNull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, @Nullable EntityPlayerMP aPlayer) {
+ return new MetricsTransmitterData(new UUID(aBuf.readLong(), aBuf.readLong()));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_NeedMaintainance.java b/src/main/java/gregtech/common/covers/GT_Cover_NeedMaintainance.java
new file mode 100644
index 0000000000..55cae3241c
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_NeedMaintainance.java
@@ -0,0 +1,303 @@
+package gregtech.common.covers;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+
+public class GT_Cover_NeedMaintainance extends GT_CoverBehavior {
+
+ public GT_Cover_NeedMaintainance(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ public static boolean isRotor(ItemStack rotor) {
+ return (rotor != null && rotor.getItem() instanceof GT_MetaGenerated_Tool
+ && rotor.getItemDamage() >= 170
+ && rotor.getItemDamage() <= 176);
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ boolean needsRepair = false;
+ if (aTileEntity instanceof IGregTechTileEntity tTileEntity) {
+ final IMetaTileEntity mTileEntity = tTileEntity.getMetaTileEntity();
+ if (mTileEntity instanceof GT_MetaTileEntity_MultiBlockBase multi) {
+ final int ideal = multi.getIdealStatus();
+ final int real = multi.getRepairStatus();
+ final ItemStack tRotor = multi.getRealInventory()[1];
+ final int coverVar = aCoverVariable >>> 1;
+ if (coverVar < 5) {
+ if (ideal - real > coverVar) needsRepair = true;
+ } else if (coverVar == 5 || coverVar == 6) {
+ if (isRotor(tRotor)) {
+ long tMax = GT_MetaGenerated_Tool.getToolMaxDamage(tRotor);
+ long tCur = GT_MetaGenerated_Tool.getToolDamage(tRotor);
+ if (coverVar == 5) {
+ needsRepair = (tCur >= tMax * 8 / 10);
+ } else {
+ long mExpectedDamage = Math.round(
+ Math.min(
+ multi.mEUt / multi.damageFactorLow,
+ Math.pow(multi.mEUt, multi.damageFactorHigh)));
+ needsRepair = tCur + mExpectedDamage * 2 >= tMax;
+ }
+ } else {
+ needsRepair = true;
+ }
+ }
+ }
+ }
+ if (aCoverVariable % 2 == 0) {
+ needsRepair = !needsRepair;
+ }
+
+ aTileEntity.setOutputRedstoneSignal(side, (byte) (needsRepair ? 0 : 15));
+ aTileEntity.setOutputRedstoneSignal(side.getOpposite(), (byte) (needsRepair ? 0 : 15));
+ return aCoverVariable;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 14;
+ if (aCoverVariable < 0) {
+ aCoverVariable = 13;
+ }
+ switch (aCoverVariable) {
+ case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("056", "Emit if 1 Maintenance Needed"));
+ case 1 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("057", "Emit if 1 Maintenance Needed(inverted)"));
+ case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("058", "Emit if 2 Maintenance Needed"));
+ case 3 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("059", "Emit if 2 Maintenance Needed(inverted)"));
+ case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("060", "Emit if 3 Maintenance Needed"));
+ case 5 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("061", "Emit if 3 Maintenance Needed(inverted)"));
+ case 6 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("062", "Emit if 4 Maintenance Needed"));
+ case 7 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("063", "Emit if 4 Maintenance Needed(inverted)"));
+ case 8 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("064", "Emit if 5 Maintenance Needed"));
+ case 9 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("065", "Emit if 5 Maintenance Needed(inverted)"));
+ case 10 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("066", "Emit if rotor needs maintenance low accuracy mod"));
+ case 11 -> GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("067", "Emit if rotor needs maintenance low accuracy mod(inverted)"));
+ case 12 -> GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("068", "Emit if rotor needs maintenance high accuracy mod"));
+ case 13 -> GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("069", "Emit if rotor needs maintenance high accuracy mod(inverted)"));
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 60;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new NeedMaintainanceUIFactory(buildContext).createWindow();
+ }
+
+ private class NeedMaintainanceUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ public NeedMaintainanceUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ final String[] tooltipText = { GT_Utility.trans("056", "Emit if 1 Maintenance Needed"),
+ GT_Utility.trans("058", "Emit if 2 Maintenance Needed"),
+ GT_Utility.trans("060", "Emit if 3 Maintenance Needed"),
+ GT_Utility.trans("062", "Emit if 4 Maintenance Needed"),
+ GT_Utility.trans("064", "Emit if 5 Maintenance Needed"),
+ GT_Utility.trans("066", "Emit if rotor needs maintenance low accuracy mod"),
+ GT_Utility.trans("068", "Emit if rotor needs maintenance high accuracy mod"), };
+
+ final String[] buttonText = { GT_Utility.trans("247", "1 Issue"), GT_Utility.trans("248", "2 Issues"),
+ GT_Utility.trans("249", "3 Issues"), GT_Utility.trans("250", "4 Issues"),
+ GT_Utility.trans("251", "5 Issues"), GT_Utility.trans("252", "Rotor < 80%"),
+ GT_Utility.trans("253", "Rotor < 100%"), GT_Utility.trans("INVERTED", "Inverted"),
+ GT_Utility.trans("NORMAL", "Normal"), };
+
+ builder
+ .widget(
+ new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>(
+ this::getCoverData,
+ this::setCoverData,
+ GT_Cover_NeedMaintainance.this,
+ (index, coverData) -> isEnabled(index, convert(coverData)),
+ (index, coverData) -> new ISerializableObject.LegacyCoverData(
+ getNewCoverVariable(index, convert(coverData))))
+ .addToggleButton(
+ 0,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.addTooltip(tooltipText[0])
+ .setPos(spaceX * 0, spaceY * 0))
+ .addToggleButton(
+ 1,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.addTooltip(tooltipText[1])
+ .setPos(spaceX * 0, spaceY * 1))
+ .addToggleButton(
+ 2,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.addTooltip(tooltipText[2])
+ .setPos(spaceX * 0, spaceY * 2))
+ .addToggleButton(
+ 3,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.addTooltip(tooltipText[3])
+ .setPos(spaceX * 0, spaceY * 3))
+ .addToggleButton(
+ 4,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.addTooltip(tooltipText[4])
+ .setPos(spaceX * 4 + 4, spaceY * 0))
+ .addToggleButton(
+ 5,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.addTooltip(tooltipText[5])
+ .setPos(spaceX * 4 + 4, spaceY * 1))
+ .addToggleButton(
+ 6,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.addTooltip(tooltipText[6])
+ .setPos(spaceX * 4 + 4, spaceY * 2))
+ .addToggleButton(
+ 7,
+ CoverDataFollower_ToggleButtonWidget.ofRedstone(),
+ widget -> widget.setPos(spaceX * 4 + 4, spaceY * 3))
+ .setPos(startX, startY))
+ .widget(
+ new TextWidget(buttonText[0]).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 1, 4 + startY + spaceY * 0))
+ .widget(
+ new TextWidget(buttonText[1]).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 1, 4 + startY + spaceY * 1))
+ .widget(
+ new TextWidget(buttonText[2]).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 1, 4 + startY + spaceY * 2))
+ .widget(
+ new TextWidget(buttonText[3]).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 1, 4 + startY + spaceY * 3))
+ .widget(
+ new TextWidget(buttonText[4]).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 5 + 4, 4 + startY + spaceY * 0))
+ .widget(
+ new TextWidget(buttonText[5]).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 5 + 4, 4 + startY + spaceY * 1))
+ .widget(
+ new TextWidget(buttonText[6]).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 5 + 4, 4 + startY + spaceY * 2))
+ .widget(
+ TextWidget
+ .dynamicString(() -> isEnabled(7, convert(getCoverData())) ? buttonText[7] : buttonText[8])
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 5 + 4, 4 + startY + spaceY * 3));
+ }
+
+ private int getNewCoverVariable(int id, int coverVariable) {
+ final boolean checked = (coverVariable & 0x1) > 0;
+ if (id == 7) {
+ if (checked) return coverVariable & ~0x1;
+ else return coverVariable | 0x1;
+ }
+ return (coverVariable & 0x1) | (id << 1);
+ }
+
+ private boolean isEnabled(int id, int coverVariable) {
+ if (id == 7) return (coverVariable & 0x1) > 0;
+ return (coverVariable >>> 1) == id;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_PlayerDetector.java b/src/main/java/gregtech/common/covers/GT_Cover_PlayerDetector.java
new file mode 100644
index 0000000000..d358c4e578
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_PlayerDetector.java
@@ -0,0 +1,207 @@
+package gregtech.common.covers;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+
+public class GT_Cover_PlayerDetector extends GT_CoverBehavior {
+
+ private String placer = "";
+ private int range = 8;
+
+ public GT_Cover_PlayerDetector(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ boolean playerDetected = false;
+
+ if (aTileEntity instanceof IGregTechTileEntity) {
+ if (aTileEntity.isUniversalEnergyStored(20)) {
+ aTileEntity.decreaseStoredEnergyUnits(20, true);
+ range = 32;
+ } else {
+ range = 8;
+ }
+ placer = ((IGregTechTileEntity) aTileEntity).getOwnerName();
+ }
+ for (Object tObject : aTileEntity.getWorld().playerEntities) {
+ if ((tObject instanceof EntityPlayerMP tEntity)) {
+ int dist = Math.max(
+ 1,
+ (int) tEntity.getDistance(
+ aTileEntity.getXCoord() + 0.5D,
+ aTileEntity.getYCoord() + 0.5D,
+ aTileEntity.getZCoord() + 0.5D));
+ if (dist < range) {
+ if (aCoverVariable == 0) {
+ playerDetected = true;
+ break;
+ }
+ if (tEntity.getDisplayName()
+ .equalsIgnoreCase(placer)) {
+ if (aCoverVariable == 1) {
+ playerDetected = true;
+ break;
+ }
+ } else if (aCoverVariable == 2) {
+ playerDetected = true;
+ break;
+ }
+ }
+ }
+ }
+
+ aTileEntity.setOutputRedstoneSignal(side, (byte) (playerDetected ? 15 : 0));
+ return aCoverVariable;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 3;
+ if (aCoverVariable < 0) {
+ aCoverVariable = 2;
+ }
+ switch (aCoverVariable) {
+ case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("068.1", "Emit if any Player is close"));
+ case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("069.1", "Emit if other Player is close"));
+ case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("070", "Emit if you are close"));
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 20;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new PlayerDetectorUIFactory(buildContext).createWindow();
+ }
+
+ private class PlayerDetectorUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ public PlayerDetectorUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ builder
+ .widget(
+ new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>(
+ this::getCoverData,
+ this::setCoverData,
+ GT_Cover_PlayerDetector.this,
+ (index, coverData) -> index == convert(coverData),
+ (index, coverData) -> new ISerializableObject.LegacyCoverData(index))
+ .addToggleButton(
+ 0,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.addTooltip(GT_Utility.trans("068.1", "Emit if any Player is close"))
+ .setPos(spaceX * 0, spaceY * 0))
+ .addToggleButton(
+ 1,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.addTooltip(GT_Utility.trans("069.1", "Emit if other Player is close"))
+ .setPos(spaceX * 0, spaceY * 1))
+ .addToggleButton(
+ 2,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.addTooltip(GT_Utility.trans("070", "Emit if you are close"))
+ .setPos(spaceX * 0, spaceY * 2))
+ .setPos(startX, startY))
+ .widget(
+ new TextWidget(GT_Utility.trans("319", "Any player")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 1, 4 + startY + spaceY * 0))
+ .widget(
+ new TextWidget(GT_Utility.trans("320", "Other players")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 1, 4 + startY + spaceY * 1))
+ .widget(
+ new TextWidget(GT_Utility.trans("321", "Only owner")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 1, 4 + startY + spaceY * 2));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Pump.java b/src/main/java/gregtech/common/covers/GT_Cover_Pump.java
new file mode 100644
index 0000000000..e1bbf950ce
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_Pump.java
@@ -0,0 +1,339 @@
+package gregtech.common.covers;
+
+import java.util.Arrays;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+
+public class GT_Cover_Pump extends GT_CoverBehavior {
+
+ public final int mTransferRate;
+
+ public GT_Cover_Pump(int aTransferRate, ITexture coverTexture) {
+ super(coverTexture);
+ this.mTransferRate = aTransferRate;
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ if ((aCoverVariable % 6 > 1) && ((aTileEntity instanceof IMachineProgress))) {
+ if (((IMachineProgress) aTileEntity).isAllowedToWork() != aCoverVariable % 6 < 4) {
+ return aCoverVariable;
+ }
+ }
+
+ if (aTileEntity instanceof IFluidHandler current) {
+ final IFluidHandler toAccess = aTileEntity.getITankContainerAtSide(side);
+ if (toAccess == null) return aCoverVariable;
+
+ transferFluid(current, toAccess, side, aCoverVariable % 2 == 0);
+ }
+ return aCoverVariable;
+ }
+
+ protected void transferFluid(IFluidHandler current, IFluidHandler toAccess, ForgeDirection side, boolean export) {
+ IFluidHandler source = export ? current : toAccess;
+ IFluidHandler dest = export ? toAccess : current;
+ ForgeDirection drainSide = export ? side : side.getOpposite();
+ GT_Utility.moveFluid(source, dest, drainSide, mTransferRate, this::canTransferFluid);
+ }
+
+ protected boolean canTransferFluid(FluidStack fluid) {
+ return true;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 12;
+ if (aCoverVariable < 0) {
+ aCoverVariable = 11;
+ }
+ switch (aCoverVariable) {
+ case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("006", "Export"));
+ case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("007", "Import"));
+ case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("008", "Export (conditional)"));
+ case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("009", "Import (conditional)"));
+ case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("010", "Export (invert cond)"));
+ case 5 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("011", "Import (invert cond)"));
+ case 6 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("012", "Export allow Input"));
+ case 7 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("013", "Import allow Output"));
+ case 8 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("014", "Export allow Input (conditional)"));
+ case 9 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("015", "Import allow Output (conditional)"));
+ case 10 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("016", "Export allow Input (invert cond)"));
+ case 11 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("017", "Import allow Output (invert cond)"));
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ if ((aCoverVariable > 1) && ((aTileEntity instanceof IMachineProgress))) {
+ if (((IMachineProgress) aTileEntity).isAllowedToWork() != aCoverVariable % 6 < 4) {
+ return false;
+ }
+ }
+ return (aCoverVariable >= 6) || (aCoverVariable % 2 != 0);
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ if ((aCoverVariable > 1) && ((aTileEntity instanceof IMachineProgress))) {
+ if (((IMachineProgress) aTileEntity).isAllowedToWork() != aCoverVariable % 6 < 4) {
+ return false;
+ }
+ }
+ return (aCoverVariable >= 6) || (aCoverVariable % 2 == 0);
+ }
+
+ @Override
+ public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 1;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new PumpUIFactory(buildContext).createWindow();
+ }
+
+ private class PumpUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ private CoverDataFollower_ToggleButtonWidget<ISerializableObject.LegacyCoverData> mBlockWidget = null;
+ private CoverDataFollower_ToggleButtonWidget<ISerializableObject.LegacyCoverData> mAllowWidget = null;
+
+ public PumpUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ builder.widget(
+ new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>(
+ this::getCoverData,
+ this::setCoverData,
+ GT_Cover_Pump.this,
+ (id, coverData) -> !getClickable(id, convert(coverData)),
+ (id, coverData) -> new ISerializableObject.LegacyCoverData(
+ getNewCoverVariable(id, convert(coverData))))
+ .addToggleButton(
+ 0,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT)
+ .addTooltip(GT_Utility.trans("006", "Export"))
+ .setPos(spaceX * 0, spaceY * 0))
+ .addToggleButton(
+ 1,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT)
+ .addTooltip(GT_Utility.trans("007", "Import"))
+ .setPos(spaceX * 1, spaceY * 0))
+ .addToggleButton(
+ 2,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK)
+ .addTooltip(GT_Utility.trans("224", "Always On"))
+ .setPos(spaceX * 0, spaceY * 1))
+ .addToggleButton(
+ 3,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_USE_PROCESSING_STATE)
+ .addTooltip(GT_Utility.trans("343", "Use Machine Processing State"))
+ .setPos(spaceX * 1, spaceY * 1))
+ .addToggleButton(
+ 4,
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ widget -> widget
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_USE_INVERTED_PROCESSING_STATE)
+ .addTooltip(GT_Utility.trans("343.1", "Use Inverted Machine Processing State"))
+ .setPos(spaceX * 2, spaceY * 1))
+ .addToggleButton(5, CoverDataFollower_ToggleButtonWidget.ofDisableable(), widget -> {
+ mAllowWidget = widget;
+ widget.setTextureGetter(i -> {
+ ISerializableObject.LegacyCoverData coverData = getCoverData();
+ return coverData == null || coverData.get() % 2 == 0
+ ? GT_UITextures.OVERLAY_BUTTON_ALLOW_INPUT
+ : GT_UITextures.OVERLAY_BUTTON_ALLOW_OUTPUT;
+ })
+ .dynamicTooltip(() -> {
+ ISerializableObject.LegacyCoverData coverData = getCoverData();
+ return Arrays.asList(
+ coverData == null || coverData.get() % 2 == 0
+ ? GT_Utility.trans("314", "Allow Input")
+ : GT_Utility.trans("312", "Allow Output"));
+ })
+ .setPos(spaceX * 0, spaceY * 2);
+ })
+ .addToggleButton(6, CoverDataFollower_ToggleButtonWidget.ofDisableable(), widget -> {
+ mBlockWidget = widget;
+ widget.setTextureGetter(i -> {
+ ISerializableObject.LegacyCoverData coverData = getCoverData();
+ return coverData == null || coverData.get() % 2 == 0
+ ? GT_UITextures.OVERLAY_BUTTON_BLOCK_INPUT
+ : GT_UITextures.OVERLAY_BUTTON_BLOCK_OUTPUT;
+ })
+ .dynamicTooltip(() -> {
+ ISerializableObject.LegacyCoverData coverData = getCoverData();
+ return Arrays.asList(
+ coverData == null || coverData.get() % 2 == 0
+ ? GT_Utility.trans("313", "Block Input")
+ : GT_Utility.trans("311", "Block Output"));
+ })
+ .setPos(spaceX * 1, spaceY * 2);
+ })
+ .setPos(startX, startY))
+ .widget(
+ new TextWidget(GT_Utility.trans("229", "Export/Import")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 0))
+ .widget(
+ new TextWidget(GT_Utility.trans("230", "Conditional")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 1))
+ .widget(TextWidget.dynamicString(() -> {
+ ISerializableObject.LegacyCoverData coverData = getCoverData();
+ return coverData == null || coverData.get() % 2 == 0 ? GT_Utility.trans("344", "Input Blocking")
+ : GT_Utility.trans("344.1", "Output Blocking");
+ })
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 3, 4 + startY + spaceY * 2));
+ }
+
+ private int getNewCoverVariable(int id, int coverVariable) {
+ switch (id) {
+ case 0 -> {
+ if (mBlockWidget != null) {
+ mBlockWidget.notifyTooltipChange();
+ }
+ if (mAllowWidget != null) {
+ mAllowWidget.notifyTooltipChange();
+ }
+ return coverVariable & ~0x1;
+ }
+ case 1 -> {
+ if (mBlockWidget != null) {
+ mBlockWidget.notifyTooltipChange();
+ }
+ if (mAllowWidget != null) {
+ mAllowWidget.notifyTooltipChange();
+ }
+ return coverVariable | 0x1;
+ }
+ case 2 -> {
+ if (coverVariable > 5) return 0x6 | (coverVariable & ~0xE);
+ return (coverVariable & ~0xE);
+ }
+ case 3 -> {
+ if (coverVariable > 5) return 0x8 | (coverVariable & ~0xE);
+ return 0x2 | (coverVariable & ~0xE);
+ }
+ case 4 -> {
+ if (coverVariable > 5) return 0xA | (coverVariable & ~0xE);
+ return (0x4 | (coverVariable & ~0xE));
+ }
+ case 5 -> {
+ if (coverVariable <= 5) return coverVariable + 6;
+ }
+ case 6 -> {
+ if (coverVariable > 5) return coverVariable - 6;
+ }
+ }
+ return coverVariable;
+ }
+
+ private boolean getClickable(int id, int coverVariable) {
+ if (coverVariable < 0 | 11 < coverVariable) return false;
+ return switch (id) {
+ case 0, 1 -> (0x1 & coverVariable) != id;
+ case 2 -> (coverVariable % 6) >= 2;
+ case 3 -> (coverVariable % 6) < 2 | 4 <= (coverVariable % 6);
+ case 4 -> (coverVariable % 6) < 4;
+ case 5 -> coverVariable < 6;
+ case 6 -> coverVariable >= 6;
+ default -> false;
+ };
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneConductor.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneConductor.java
new file mode 100644
index 0000000000..edaec13a81
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneConductor.java
@@ -0,0 +1,101 @@
+package gregtech.common.covers;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+
+@SuppressWarnings("unused") // Legacy from GT4. TODO: Consider re-enable registration
+public class GT_Cover_RedstoneConductor extends GT_CoverBehavior {
+
+ GT_Cover_RedstoneConductor(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ if (aCoverVariable == 0) {
+ aTileEntity.setOutputRedstoneSignal(side, aTileEntity.getStrongestRedstone());
+ } else if (aCoverVariable < 7) {
+ aTileEntity.setOutputRedstoneSignal(
+ side,
+ aTileEntity.getInternalInputRedstoneSignal(ForgeDirection.getOrientation((aCoverVariable - 1))));
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 7;
+ if (aCoverVariable < 0) {
+ aCoverVariable = 6;
+ }
+ switch (aCoverVariable) {
+ case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("071", "Conducts strongest Input"));
+ case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("072", "Conducts from bottom Input"));
+ case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("073", "Conducts from top Input"));
+ case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("074", "Conducts from north Input"));
+ case 4 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("075", "Conducts from south Input"));
+ case 5 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("076", "Conducts from west Input"));
+ case 6 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("077", "Conducts from east Input"));
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 1;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverExternal.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverExternal.java
new file mode 100644
index 0000000000..eabf90f4de
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverExternal.java
@@ -0,0 +1,41 @@
+package gregtech.common.covers;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+
+public class GT_Cover_RedstoneReceiverExternal extends GT_Cover_RedstoneWirelessBase {
+
+ public GT_Cover_RedstoneReceiverExternal(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ aTileEntity.setOutputRedstoneSignal(
+ side,
+ GregTech_API.sWirelessRedstone.get(aCoverVariable) == null ? 0
+ : GregTech_API.sWirelessRedstone.get(aCoverVariable));
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 1;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverInternal.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverInternal.java
new file mode 100644
index 0000000000..3edd7f7e43
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneReceiverInternal.java
@@ -0,0 +1,46 @@
+package gregtech.common.covers;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.util.ISerializableObject;
+
+public class GT_Cover_RedstoneReceiverInternal extends GT_Cover_RedstoneWirelessBase {
+
+ public GT_Cover_RedstoneReceiverInternal(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ if (aTileEntity instanceof IMachineProgress) {
+ if (getRedstoneInput(side, aInputRedstone, aCoverID, aCoverVariable, aTileEntity) > 0)
+ ((IMachineProgress) aTileEntity).enableWorking();
+ else((IMachineProgress) aTileEntity).disableWorking();
+ ((IMachineProgress) aTileEntity).setWorkDataValue(aInputRedstone);
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ return true;
+ }
+
+ @Override
+ public byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return GregTech_API.sWirelessRedstone.get(aCoverVariable) == null ? 0
+ : GregTech_API.sWirelessRedstone.get(aCoverVariable);
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 1;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneSignalizer.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneSignalizer.java
new file mode 100644
index 0000000000..4eead134c8
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneSignalizer.java
@@ -0,0 +1,99 @@
+package gregtech.common.covers;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+
+@SuppressWarnings("unused") // TODO: Consider re-registering this
+public class GT_Cover_RedstoneSignalizer extends GT_CoverBehavior {
+
+ GT_Cover_RedstoneSignalizer(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable = (aCoverVariable + 1) % 48;
+ switch (aCoverVariable / 16) {
+ case 0 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("078", "Signal = ") + (aCoverVariable & 0xF));
+ case 1 -> GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("079", "Conditional Signal = ") + (aCoverVariable & 0xF));
+ case 2 -> GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("080", "Inverted Conditional Signal = ") + (aCoverVariable & 0xF));
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public byte getRedstoneInput(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ if (aCoverVariable < 16) {
+ return (byte) (aCoverVariable & 0xF);
+ }
+ if ((aTileEntity instanceof IMachineProgress)) {
+ if (((IMachineProgress) aTileEntity).isAllowedToWork()) {
+ if (aCoverVariable / 16 == 1) {
+ return (byte) (aCoverVariable & 0xF);
+ }
+ } else if (aCoverVariable / 16 == 2) {
+ return (byte) (aCoverVariable & 0xF);
+ }
+ return 0;
+ }
+ return (byte) (aCoverVariable & 0xF);
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java
new file mode 100644
index 0000000000..1ee0a05837
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java
@@ -0,0 +1,53 @@
+package gregtech.common.covers;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.covers.IControlsWorkCover;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.ISerializableObject;
+
+public class GT_Cover_RedstoneTransmitterExternal extends GT_Cover_RedstoneWirelessBase {
+
+ public GT_Cover_RedstoneTransmitterExternal(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ // TODO remove next line after 2.3.0
+ if (!IControlsWorkCover.makeSureOnlyOne(side, aTileEntity)) return aCoverVariable;
+ GregTech_API.sWirelessRedstone.put(aCoverVariable, aInputRedstone);
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ return true;
+ }
+
+ @Override
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 1;
+ }
+
+ @Override
+ public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) {
+ if (!super.isCoverPlaceable(side, aStack, aTileEntity)) return false;
+ for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) {
+ if (aTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof IControlsWorkCover) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterInternal.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterInternal.java
new file mode 100644
index 0000000000..a812a49990
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterInternal.java
@@ -0,0 +1,43 @@
+package gregtech.common.covers;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+
+public class GT_Cover_RedstoneTransmitterInternal extends GT_Cover_RedstoneWirelessBase {
+
+ public GT_Cover_RedstoneTransmitterInternal(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ GregTech_API.sWirelessRedstone.put(aCoverVariable, aTileEntity.getOutputRedstoneSignal(side));
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 1;
+ }
+
+ @Override
+ public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneWirelessBase.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneWirelessBase.java
new file mode 100644
index 0000000000..df298c2489
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneWirelessBase.java
@@ -0,0 +1,233 @@
+package gregtech.common.covers;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+
+public abstract class GT_Cover_RedstoneWirelessBase extends GT_CoverBehavior {
+
+ private static final int MAX_CHANNEL = 65535;
+ private static final int PRIVATE_MASK = 0xFFFE0000;
+ private static final int PUBLIC_MASK = 0x0000FFFF;
+ private static final int CHECKBOX_MASK = 0x00010000;
+
+ public GT_Cover_RedstoneWirelessBase(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ boolean aForced) {
+ GregTech_API.sWirelessRedstone.put(aCoverVariable, (byte) 0);
+ return true;
+ }
+
+ @Override
+ protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX,
+ float aY, float aZ) {
+ if (((aX > 0.375D) && (aX < 0.625D)) || ((side.offsetX != 0) && ((aY > 0.375D) && (aY < 0.625D)))) {
+ GregTech_API.sWirelessRedstone.put(aCoverVariable.get(), (byte) 0);
+ aCoverVariable.set(
+ (aCoverVariable.get() & (PRIVATE_MASK | CHECKBOX_MASK))
+ | (((Integer) GT_Utility.stackToInt(aPlayer.inventory.getCurrentItem())).hashCode() & PUBLIC_MASK));
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("081", "Frequency: ") + aCoverVariable);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ @SuppressWarnings("deprecation")
+ public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (((aX > 0.375D) && (aX < 0.625D)) || ((side.offsetX != 0) && ((aY > 0.375D) && (aY < 0.625D)))) {
+ GregTech_API.sWirelessRedstone.put(aCoverVariable, (byte) 0);
+
+ int val = GT_Utility.stackToInt(aPlayer.inventory.getCurrentItem())
+ * (1 + aPlayer.inventory.getCurrentItem()
+ .getItemDamage());
+
+ aCoverVariable = (aCoverVariable & (PRIVATE_MASK | CHECKBOX_MASK)) | (val & PUBLIC_MASK);
+
+ aTileEntity.setCoverDataAtSide(side, aCoverVariable);
+ GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("081", "Frequency: ") + (aCoverVariable & PUBLIC_MASK));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (((aX > 0.375D) && (aX < 0.625D))
+ || ((side.offsetX == 0) || (((aY > 0.375D) && (aY < 0.625D)) || ((((aZ <= 0.375D) || (aZ >= 0.625D))))))) {
+ GregTech_API.sWirelessRedstone.put(aCoverVariable, (byte) 0);
+ final float[] tCoords = GT_Utility.getClickedFacingCoords(side, aX, aY, aZ);
+
+ final short tAdjustVal = switch ((byte) ((byte) (int) (tCoords[0] * 2.0F)
+ + 2 * (byte) (int) (tCoords[1] * 2.0F))) {
+ case 0 -> -32;
+ case 1 -> 32;
+ case 2 -> -1024;
+ case 3 -> 1024;
+ default -> 0;
+ };
+
+ final int tPublicChannel = (aCoverVariable & PUBLIC_MASK) + tAdjustVal;
+
+ if (tPublicChannel < 0) {
+ aCoverVariable = aCoverVariable & ~PUBLIC_MASK;
+ } else if (tPublicChannel > MAX_CHANNEL) {
+ aCoverVariable = (aCoverVariable & (PRIVATE_MASK | CHECKBOX_MASK)) | MAX_CHANNEL;
+ } else {
+ aCoverVariable = (aCoverVariable & (PRIVATE_MASK | CHECKBOX_MASK)) | tPublicChannel;
+ }
+ }
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("081", "Frequency: ") + (aCoverVariable & PUBLIC_MASK));
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public String getDescription(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return GT_Utility.trans("081", "Frequency: ") + aCoverVariable;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 1;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new RedstoneWirelessBaseUIFactory(buildContext).createWindow();
+ }
+
+ private class RedstoneWirelessBaseUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ public RedstoneWirelessBaseUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @Override
+ protected int getGUIWidth() {
+ return 250;
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ builder
+ .widget(
+ new CoverDataControllerWidget<>(
+ this::getCoverData,
+ this::setCoverData,
+ GT_Cover_RedstoneWirelessBase.this)
+
+ .addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) getFlagFrequency(convert(coverData)),
+ (coverData, state) -> new ISerializableObject.LegacyCoverData(
+ state.intValue() | getFlagCheckbox(convert(coverData))),
+ widget -> widget.setBounds(0, MAX_CHANNEL)
+ .setScrollValues(1, 1000, 10)
+ .setFocusOnGuiOpen(true)
+ .setPos(spaceX * 0, spaceY * 0 + 2)
+ .setSize(spaceX * 4 - 3, 12))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ coverData -> getFlagCheckbox(convert(coverData)) > 0,
+ (coverData, state) -> new ISerializableObject.LegacyCoverData(
+ getFlagFrequency(convert(coverData)) | (state ? CHECKBOX_MASK : 0)),
+ widget -> widget.setPos(spaceX * 0, spaceY * 2))
+ .setPos(startX, startY))
+ .widget(
+ new TextWidget(GT_Utility.trans("246", "Frequency")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 4, 4 + startY + spaceY * 0))
+ .widget(
+ new TextWidget(GT_Utility.trans("602", "Use Private Frequency"))
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 1, startY + spaceY * 2 + 4));
+ }
+
+ private int getFlagFrequency(int coverVariable) {
+ return coverVariable & PUBLIC_MASK;
+ }
+
+ private int getFlagCheckbox(int coverVariable) {
+ return coverVariable & CHECKBOX_MASK;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Screen.java b/src/main/java/gregtech/common/covers/GT_Cover_Screen.java
new file mode 100644
index 0000000000..fab2b81b0b
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_Screen.java
@@ -0,0 +1,100 @@
+package gregtech.common.covers;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehavior;
+
+public class GT_Cover_Screen extends GT_CoverBehavior {
+
+ public GT_Cover_Screen(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public float getBlastProofLevel(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 20.0F;
+ }
+
+ @Override
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ public boolean isGUIClickable(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean manipulatesSidedRedstoneOutput(ForgeDirection side, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return false;
+ }
+
+ @Override
+ public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ boolean aForced) {
+ return true;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Shutter.java b/src/main/java/gregtech/common/covers/GT_Cover_Shutter.java
new file mode 100644
index 0000000000..670506141c
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_Shutter.java
@@ -0,0 +1,201 @@
+package gregtech.common.covers;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+
+public class GT_Cover_Shutter extends GT_CoverBehavior {
+
+ public GT_Cover_Shutter(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return aCoverVariable;
+ }
+
+ @Override
+ public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable = (aCoverVariable + (aPlayer.isSneaking() ? -1 : 1)) % 4;
+ if (aCoverVariable < 0) {
+ aCoverVariable = 3;
+ }
+ switch (aCoverVariable) {
+ case 0 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("082", "Open if work enabled"));
+ case 1 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("083", "Open if work disabled"));
+ case 2 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("084", "Only Output allowed"));
+ case 3 -> GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("085", "Only Input allowed"));
+ }
+ if (aTileEntity instanceof BaseMetaPipeEntity) {
+ ((BaseMetaPipeEntity) aTileEntity).reloadLocks();
+ }
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return aCoverVariable >= 2 ? aCoverVariable == 3
+ : !(aTileEntity instanceof IMachineProgress)
+ || (((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0));
+ }
+
+ @Override
+ public boolean letsRedstoneGoOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return aCoverVariable >= 2 ? aCoverVariable == 2
+ : !(aTileEntity instanceof IMachineProgress)
+ || (((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0));
+ }
+
+ @Override
+ public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return aCoverVariable >= 2 ? aCoverVariable == 3
+ : !(aTileEntity instanceof IMachineProgress)
+ || (((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0));
+ }
+
+ @Override
+ public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return aCoverVariable >= 2 ? aCoverVariable == 2
+ : !(aTileEntity instanceof IMachineProgress)
+ || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0);
+ }
+
+ @Override
+ public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return aCoverVariable >= 2 ? aCoverVariable == 3
+ : !(aTileEntity instanceof IMachineProgress)
+ || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0);
+ }
+
+ @Override
+ public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return aCoverVariable >= 2 ? aCoverVariable == 2
+ : !(aTileEntity instanceof IMachineProgress)
+ || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0);
+ }
+
+ @Override
+ public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return aCoverVariable >= 2 ? aCoverVariable == 3
+ : !(aTileEntity instanceof IMachineProgress)
+ || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0);
+ }
+
+ @Override
+ public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return aCoverVariable >= 2 ? aCoverVariable == 2
+ : !(aTileEntity instanceof IMachineProgress)
+ || ((IMachineProgress) aTileEntity).isAllowedToWork() == (aCoverVariable % 2 == 0);
+ }
+
+ @Override
+ public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 0;
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new ShutterUIFactory(buildContext).createWindow();
+ }
+
+ private class ShutterUIFactory extends UIFactory {
+
+ private static final int startX = 10;
+ private static final int startY = 25;
+ private static final int spaceX = 18;
+ private static final int spaceY = 18;
+
+ public ShutterUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ builder
+ .widget(
+ new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>(
+ this::getCoverData,
+ this::setCoverData,
+ GT_Cover_Shutter.this,
+ (index, coverData) -> index == convert(coverData),
+ (index, coverData) -> new ISerializableObject.LegacyCoverData(index))
+ .addToggleButton(
+ 0,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.setPos(spaceX * 0, spaceY * 0))
+ .addToggleButton(
+ 1,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.setPos(spaceX * 0, spaceY * 1))
+ .addToggleButton(
+ 2,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.setPos(spaceX * 0, spaceY * 2))
+ .addToggleButton(
+ 3,
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ widget -> widget.setPos(spaceX * 0, spaceY * 3))
+ .setPos(startX, startY))
+ .widget(
+ new TextWidget(GT_Utility.trans("082", "Open if work enabled"))
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 0))
+ .widget(
+ new TextWidget(GT_Utility.trans("083", "Open if work disabled"))
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 1))
+ .widget(
+ new TextWidget(GT_Utility.trans("084", "Only Output allowed"))
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 2))
+ .widget(
+ new TextWidget(GT_Utility.trans("085", "Only Input allowed")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 3));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_SolarPanel.java b/src/main/java/gregtech/common/covers/GT_Cover_SolarPanel.java
new file mode 100644
index 0000000000..4b88a90194
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_SolarPanel.java
@@ -0,0 +1,139 @@
+package gregtech.common.covers;
+
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+
+public class GT_Cover_SolarPanel extends GT_CoverBehavior {
+
+ private final int mVoltage;
+
+ public GT_Cover_SolarPanel(int aVoltage) {
+ this.mVoltage = aVoltage;
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ if (side != ForgeDirection.UP) return 0;
+ int coverState = aCoverVariable & 0x3;
+ int coverNum = aCoverVariable >> 2;
+ if (aTimer % 100L == 0L) {
+ if (aTileEntity.getWorld()
+ .isThundering()) {
+ return aTileEntity.getBiome().rainfall > 0.0F && aTileEntity.getSkyAtSide(side)
+ ? Math.min(20, coverNum) << 2
+ : coverNum << 2;
+ } else {
+ if (aTileEntity.getWorld()
+ .isRaining() && aTileEntity.getBiome().rainfall > 0.0F) { // really rains
+ if (aTileEntity.getSkyAtSide(side)) coverNum = Math.min(30, coverNum);
+ if (aTileEntity.getWorld().skylightSubtracted >= 4) {
+ if (aTileEntity.getWorld()
+ .isDaytime()) {
+ coverState = 2;
+ } else {
+ return coverNum << 2;
+ }
+ }
+ } else { // not rains
+ if (aTileEntity.getWorld()
+ .isDaytime()) {
+ coverState = 1;
+ } else {
+ coverState = 2;
+ }
+ }
+ }
+ }
+ if (coverState == 1) {
+ aTileEntity.injectEnergyUnits(
+ ForgeDirection.UNKNOWN,
+ ((100L - (long) coverNum) * ((long) this.mVoltage)) / 100L,
+ 1L);
+ }
+ if (aTimer % 28800L == 0L && coverNum < 100 && (coverNum > 10 || XSTR_INSTANCE.nextInt(3) == 2)) coverNum++;
+ return coverState + (coverNum << 2);
+ }
+
+ @Override
+ protected boolean onCoverRightClickImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX,
+ float aY, float aZ) {
+ if (aPlayer.capabilities.isCreativeMode) {
+ GT_Utility.sendChatToPlayer(aPlayer, "Cleaned solar panel from " + (aCoverVariable.get() >> 2) + "% dirt");
+ aCoverVariable.set(aCoverVariable.get() & 0x3);
+ return true;
+ }
+ for (int i = 0; i < aPlayer.inventory.mainInventory.length; i++) {
+ ItemStack is = aPlayer.inventory.mainInventory[i];
+ if (is == null) continue;
+ if (is.getUnlocalizedName()
+ .equals(new ItemStack(Items.water_bucket).getUnlocalizedName())) {
+ aPlayer.inventory.mainInventory[i] = new ItemStack(Items.bucket);
+ if (aPlayer.inventoryContainer != null) aPlayer.inventoryContainer.detectAndSendChanges();
+ GT_Utility
+ .sendChatToPlayer(aPlayer, "Cleaned solar panel from " + (aCoverVariable.get() >> 2) + "% dirt");
+ aCoverVariable.set(aCoverVariable.get() & 0x3);
+ return true;
+ }
+ }
+ GT_Utility.sendChatToPlayer(aPlayer, "You need water bucket in inventory to clean the panel.");
+ return false;
+ }
+
+ @Override
+ @SuppressWarnings("deprecation")
+ public boolean onCoverRightclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer.capabilities.isCreativeMode) {
+ GT_Utility.sendChatToPlayer(aPlayer, "Cleaned solar panel from " + (aCoverVariable >> 2) + "% dirt");
+ aTileEntity.setCoverDataAtSide(side, (aCoverVariable & 0x3));
+ return true;
+ }
+ for (int i = 0; i < aPlayer.inventory.mainInventory.length; i++) {
+ ItemStack is = aPlayer.inventory.mainInventory[i];
+ if (is == null) continue;
+ if (is.getUnlocalizedName()
+ .equals(new ItemStack(Items.water_bucket).getUnlocalizedName())) {
+ aPlayer.inventory.mainInventory[i] = new ItemStack(Items.bucket);
+ if (aPlayer.inventoryContainer != null) aPlayer.inventoryContainer.detectAndSendChanges();
+ GT_Utility.sendChatToPlayer(aPlayer, "Cleaned solar panel from " + (aCoverVariable >> 2) + "% dirt");
+ aTileEntity.setCoverDataAtSide(side, (aCoverVariable & 0x3));
+ return true;
+ }
+ }
+ GT_Utility.sendChatToPlayer(aPlayer, "You need water bucket in inventory to clean the panel.");
+ return false;
+ }
+
+ @Override
+ protected boolean isGUIClickableImpl(ForgeDirection side, int aCoverID,
+ ISerializableObject.LegacyCoverData aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ @Override
+ public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 1;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_SteamRegulator.java b/src/main/java/gregtech/common/covers/GT_Cover_SteamRegulator.java
new file mode 100644
index 0000000000..e67e8b05d1
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_SteamRegulator.java
@@ -0,0 +1,18 @@
+package gregtech.common.covers;
+
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.util.GT_ModHandler;
+
+public class GT_Cover_SteamRegulator extends GT_Cover_FluidRegulator {
+
+ public GT_Cover_SteamRegulator(int aTransferRate, ITexture coverTexture) {
+ super(aTransferRate, coverTexture);
+ }
+
+ @Override
+ protected boolean canTransferFluid(FluidStack fluid) {
+ return GT_ModHandler.isAnySteam(fluid) || GT_ModHandler.isSuperHeatedSteam(fluid);
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_SteamValve.java b/src/main/java/gregtech/common/covers/GT_Cover_SteamValve.java
new file mode 100644
index 0000000000..5787a99c0b
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_SteamValve.java
@@ -0,0 +1,26 @@
+package gregtech.common.covers;
+
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_ModHandler;
+
+public class GT_Cover_SteamValve extends GT_Cover_Pump {
+
+ public GT_Cover_SteamValve(int aTransferRate, ITexture coverTexture) {
+ super(aTransferRate, coverTexture);
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ protected boolean canTransferFluid(FluidStack fluid) {
+ return GT_ModHandler.isAnySteam(fluid) || GT_ModHandler.isSuperHeatedSteam(fluid);
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Vent.java b/src/main/java/gregtech/common/covers/GT_Cover_Vent.java
new file mode 100644
index 0000000000..e2be64b475
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/GT_Cover_Vent.java
@@ -0,0 +1,111 @@
+package gregtech.common.covers;
+
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.util.GT_CoverBehavior;
+import gregtech.api.util.GT_Utility;
+
+public class GT_Cover_Vent extends GT_CoverBehavior {
+
+ private final int mEfficiency;
+ private final Fluid IC2_HOT_COOLANT = FluidRegistry.getFluid("ic2hotcoolant");
+ private final Fluid IC2_COOLANT = FluidRegistry.getFluid("ic2coolant");
+
+ public GT_Cover_Vent(int aEfficiency) {
+ this.mEfficiency = aEfficiency;
+ }
+
+ @Override
+ public boolean isRedstoneSensitive(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity,
+ long aTimer) {
+ return false;
+ }
+
+ @Override
+ public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ if (side == ForgeDirection.UNKNOWN) return 0;
+ int ret = 0;
+ if (aTileEntity instanceof IFluidHandler) {
+ ret = doCoolFluid(side, aTileEntity);
+ }
+ if ((aTileEntity instanceof IMachineProgress)) {
+ ret = doProgressEfficiency(side, (IMachineProgress) aTileEntity, aCoverID);
+ }
+ return ret;
+ }
+
+ @Override
+ public boolean alwaysLookConnected(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 100;
+ }
+
+ protected int doProgressEfficiency(final ForgeDirection side, final IMachineProgress aTileEntity,
+ final int aCoverVariable) {
+ final int offsetX = aTileEntity.getOffsetX(side, 1);
+ final int offsetY = aTileEntity.getOffsetY(side, 1);
+ final int offsetZ = aTileEntity.getOffsetZ(side, 1);
+ final World world = aTileEntity.getWorld();
+ if (aTileEntity.hasThingsToDo() && aCoverVariable != aTileEntity.getProgress()
+ && !GT_Utility.hasBlockHitBox(world, offsetX, offsetY, offsetZ)) {
+ aTileEntity.increaseProgress(this.mEfficiency);
+ }
+ return aTileEntity.getProgress();
+ }
+
+ protected int doCoolFluid(final ForgeDirection side, final ICoverable aTileEntity) {
+ final int offsetX = aTileEntity.getOffsetX(side, 1);
+ final int offsetY = aTileEntity.getOffsetY(side, 1);
+ final int offsetZ = aTileEntity.getOffsetZ(side, 1);
+ final World world = aTileEntity.getWorld();
+ final IFluidHandler fluidHandler = (IFluidHandler) aTileEntity;
+ if (!fluidHandler.canDrain(ForgeDirection.UNKNOWN, IC2_HOT_COOLANT)) {
+ return 0;
+ }
+ final int chances; // 10000 = 100%
+ final Block blockAtSide = aTileEntity.getBlockAtSide(side);
+ if (blockAtSide == null) {
+ return 0;
+ }
+ if (blockAtSide == Blocks.water || blockAtSide == Blocks.flowing_water) {
+ chances = switch (mEfficiency) {
+ case 3 -> 10000; // 100% chances for Diamond reactor vent with water
+ case 2 -> 5000; // 50% chances for Gold and Overclocked reactor vents with water
+ default -> 2500; // 25% chances for Basic reactor vent with water
+ };
+ } else if (blockAtSide.isAir(world, offsetX, offsetY, offsetZ)) {
+ switch (mEfficiency) {
+ case 3 -> chances = 2500; // 25% chances for Diamond reactor vent with air
+ case 2 -> chances = 1250; // 12.5% chances for Gold and Overclocked reactor vents with air
+ default -> {
+ return 0; // Basic reactor vent cannot be used with air
+ }
+ }
+ } else {
+ return 0; // Vent cover need water or air
+ }
+ if (chances > XSTR_INSTANCE.nextInt(10000)) {
+ final FluidStack hotFluidStack = fluidHandler.drain(ForgeDirection.UNKNOWN, Integer.MAX_VALUE, true);
+ final FluidStack coldFluidStack = new FluidStack(IC2_COOLANT, hotFluidStack.amount);
+ fluidHandler.fill(ForgeDirection.UNKNOWN, coldFluidStack, true);
+ return hotFluidStack.amount;
+ }
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java
new file mode 100644
index 0000000000..afd0f67b37
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverBase.java
@@ -0,0 +1,202 @@
+package gregtech.common.covers.redstone;
+
+import java.util.Arrays;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+import io.netty.buffer.ByteBuf;
+
+public abstract class GT_Cover_AdvancedRedstoneReceiverBase
+ extends GT_Cover_AdvancedWirelessRedstoneBase<GT_Cover_AdvancedRedstoneReceiverBase.ReceiverData> {
+
+ public GT_Cover_AdvancedRedstoneReceiverBase(ITexture coverTexture) {
+ super(ReceiverData.class, coverTexture);
+ }
+
+ @Override
+ public ReceiverData createDataObject() {
+ return new ReceiverData();
+ }
+
+ @Override
+ public ReceiverData createDataObject(int aLegacyData) {
+ return createDataObject();
+ }
+
+ // GUI stuff
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new AdvancedRedstoneReceiverBaseUIFactory(buildContext).createWindow();
+ }
+
+ private class AdvancedRedstoneReceiverBaseUIFactory extends AdvancedWirelessRedstoneBaseUIFactory {
+
+ public AdvancedRedstoneReceiverBaseUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @Override
+ protected int getFrequencyRow() {
+ return 0;
+ }
+
+ @Override
+ protected int getButtonRow() {
+ return 1;
+ }
+
+ @Override
+ protected boolean isShiftPrivateLeft() {
+ return false;
+ }
+
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ super.addUIWidgets(builder);
+ builder.widget(
+ new TextWidget(GT_Utility.trans("335", "Gate Mode")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 5, 4 + startY + spaceY * 2));
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ @Override
+ protected void addUIForDataController(CoverDataControllerWidget<ReceiverData> controller) {
+ super.addUIForDataController(controller);
+ controller.addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.mode == GateMode.AND,
+ (coverData, state) -> {
+ coverData.mode = GateMode.AND;
+ return coverData;
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_GATE_AND)
+ .addTooltip(GT_Utility.trans("331", "AND Gate"))
+ .setPos(spaceX * 0, spaceY * 2))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.mode == GateMode.NAND,
+ (coverData, state) -> {
+ coverData.mode = GateMode.NAND;
+ return coverData;
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_GATE_NAND)
+ .addTooltip(GT_Utility.trans("332", "NAND Gate"))
+ .setPos(spaceX * 1, spaceY * 2))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.mode == GateMode.OR,
+ (coverData, state) -> {
+ coverData.mode = GateMode.OR;
+ return coverData;
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_GATE_OR)
+ .addTooltip(GT_Utility.trans("333", "OR Gate"))
+ .setPos(spaceX * 2, spaceY * 2))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.mode == GateMode.NOR,
+ (coverData, state) -> {
+ coverData.mode = GateMode.NOR;
+ return coverData;
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_GATE_NOR)
+ .addTooltip(GT_Utility.trans("334", "NOR Gate"))
+ .setPos(spaceX * 3, spaceY * 2))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.mode == GateMode.SINGLE_SOURCE,
+ (coverData, state) -> {
+ coverData.mode = GateMode.SINGLE_SOURCE;
+ return coverData;
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_ANALOG)
+ .addTooltips(
+ Arrays.asList(
+ "ANALOG Mode",
+ "Only use this mode with ONE transmitter in total,",
+ "no logic involved"))
+ .setPos(spaceX * 4, spaceY * 2));
+ }
+ }
+
+ public enum GateMode {
+ AND,
+ NAND,
+ OR,
+ NOR,
+ SINGLE_SOURCE
+ }
+
+ public static class ReceiverData extends GT_Cover_AdvancedWirelessRedstoneBase.WirelessData {
+
+ private GateMode mode;
+
+ public ReceiverData(int frequency, UUID uuid, GateMode mode) {
+ super(frequency, uuid);
+ this.mode = mode;
+ }
+
+ public ReceiverData() {
+ this(0, null, GateMode.AND);
+ }
+
+ public GateMode getGateMode() {
+ return mode;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new ReceiverData(frequency, uuid, mode);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT();
+ tag.setByte("mode", (byte) mode.ordinal());
+
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ super.writeToByteBuf(aBuf);
+ aBuf.writeByte(mode.ordinal());
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ super.loadDataFromNBT(aNBT);
+
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ mode = GateMode.values()[tag.getByte("mode")];
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ super.readFromPacket(aBuf, aPlayer);
+ mode = GateMode.values()[aBuf.readByte()];
+
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverExternal.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverExternal.java
new file mode 100644
index 0000000000..a8a30de9b1
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverExternal.java
@@ -0,0 +1,35 @@
+package gregtech.common.covers.redstone;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+
+public class GT_Cover_AdvancedRedstoneReceiverExternal extends GT_Cover_AdvancedRedstoneReceiverBase {
+
+ public GT_Cover_AdvancedRedstoneReceiverExternal(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public ReceiverData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ ReceiverData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ aTileEntity.setOutputRedstoneSignal(
+ side,
+ getSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), aCoverVariable.getGateMode()));
+
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, ReceiverData aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return false;
+ }
+
+ @Override
+ protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID, ReceiverData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverInternal.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverInternal.java
new file mode 100644
index 0000000000..5553cb7c9c
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneReceiverInternal.java
@@ -0,0 +1,42 @@
+package gregtech.common.covers.redstone;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+
+public class GT_Cover_AdvancedRedstoneReceiverInternal extends GT_Cover_AdvancedRedstoneReceiverBase {
+
+ public GT_Cover_AdvancedRedstoneReceiverInternal(ITexture coverTexture) {
+ super(coverTexture);
+ }
+
+ @Override
+ public ReceiverData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ ReceiverData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ if (aTileEntity instanceof IMachineProgress machine) {
+ if (getRedstoneInput(side, aInputRedstone, aCoverID, aCoverVariable, aTileEntity) > 0) {
+ machine.enableWorking();
+ } else {
+ machine.disableWorking();
+ }
+
+ machine.setWorkDataValue(aInputRedstone);
+ }
+
+ return aCoverVariable;
+ }
+
+ @Override
+ protected byte getRedstoneInputImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ ReceiverData aCoverVariable, ICoverable aTileEntity) {
+ return getSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), aCoverVariable.getGateMode());
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, ReceiverData aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java
new file mode 100644
index 0000000000..3417542bec
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterBase.java
@@ -0,0 +1,188 @@
+package gregtech.common.covers.redstone;
+
+import java.util.Objects;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+import io.netty.buffer.ByteBuf;
+
+public abstract class GT_Cover_AdvancedRedstoneTransmitterBase<T extends GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData>
+ extends GT_Cover_AdvancedWirelessRedstoneBase<T> {
+
+ public GT_Cover_AdvancedRedstoneTransmitterBase(Class<T> typeToken, ITexture coverTexture) {
+ super(typeToken, coverTexture);
+ }
+
+ private static void unregisterSignal(ForgeDirection side, TransmitterData aCoverVariable, ICoverable aTileEntity) {
+ final long hash = hashCoverCoords(aTileEntity, side);
+ removeSignalAt(aCoverVariable.uuid, aCoverVariable.frequency, hash);
+ }
+
+ @Override
+ public boolean onCoverRemovalImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable,
+ ICoverable aTileEntity, boolean aForced) {
+ unregisterSignal(side, aCoverVariable, aTileEntity);
+ return true;
+ }
+
+ @Override
+ protected void onBaseTEDestroyedImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable,
+ ICoverable aTileEntity) {
+ unregisterSignal(side, aCoverVariable, aTileEntity);
+ }
+
+ @Override
+ protected T onCoverScrewdriverClickImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity,
+ EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ aCoverVariable.invert = !aCoverVariable.invert;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ aCoverVariable.invert ? GT_Utility.trans("054", "Inverted") : GT_Utility.trans("055", "Normal"));
+
+ return aCoverVariable;
+ }
+
+ @Override
+ protected void preDataChangedImpl(ForgeDirection side, int aCoverID, int aNewCoverId, T aCoverVariable,
+ T aNewCoverVariable, ICoverable aTileEntity) {
+ if (aCoverVariable.frequency != aNewCoverVariable.frequency
+ || !Objects.equals(aCoverVariable.uuid, aNewCoverVariable.uuid)) {
+ unregisterSignal(side, aCoverVariable, aTileEntity);
+ }
+ }
+
+ public static class TransmitterData extends GT_Cover_AdvancedWirelessRedstoneBase.WirelessData {
+
+ protected boolean invert;
+
+ public TransmitterData(int frequency, UUID uuid, boolean invert) {
+ super(frequency, uuid);
+ this.invert = invert;
+ }
+
+ public TransmitterData() {
+ this(0, null, false);
+ }
+
+ public boolean isInvert() {
+ return invert;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new TransmitterData(frequency, uuid, invert);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT();
+ tag.setBoolean("invert", invert);
+
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ super.writeToByteBuf(aBuf);
+ aBuf.writeBoolean(invert);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ super.loadDataFromNBT(aNBT);
+
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ invert = tag.getBoolean("invert");
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ super.readFromPacket(aBuf, aPlayer);
+ invert = aBuf.readBoolean();
+
+ return this;
+ }
+ }
+
+ // GUI stuff
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new AdvancedRedstoneTransmitterBaseUIFactory(buildContext).createWindow();
+ }
+
+ protected class AdvancedRedstoneTransmitterBaseUIFactory extends AdvancedWirelessRedstoneBaseUIFactory {
+
+ public AdvancedRedstoneTransmitterBaseUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @Override
+ protected int getFrequencyRow() {
+ return 0;
+ }
+
+ @Override
+ protected int getButtonRow() {
+ return 1;
+ }
+
+ @Override
+ protected boolean isShiftPrivateLeft() {
+ return true;
+ }
+
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ super.addUIWidgets(builder);
+ builder.widget(TextWidget.dynamicString(() -> {
+ T coverData = getCoverData();
+ if (coverData != null) {
+ return getCoverData().invert ? GT_Utility.trans("INVERTED", "Inverted")
+ : GT_Utility.trans("NORMAL", "Normal");
+ } else {
+ return "";
+ }
+ })
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 10, 4 + startY + spaceY * getButtonRow()));
+ }
+
+ @Override
+ protected void addUIForDataController(CoverDataControllerWidget<T> controller) {
+ super.addUIForDataController(controller);
+ controller.addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofRedstone(),
+ coverData -> coverData.invert,
+ (coverData, state) -> {
+ coverData.invert = state;
+ return coverData;
+ },
+ widget -> widget.addTooltip(0, GT_Utility.trans("NORMAL", "Normal"))
+ .addTooltip(1, GT_Utility.trans("INVERTED", "Inverted"))
+ .setPos(spaceX * 9, spaceY * getButtonRow()));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java
new file mode 100644
index 0000000000..139ec64843
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterExternal.java
@@ -0,0 +1,51 @@
+package gregtech.common.covers.redstone;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+
+public class GT_Cover_AdvancedRedstoneTransmitterExternal
+ extends GT_Cover_AdvancedRedstoneTransmitterBase<GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData> {
+
+ public GT_Cover_AdvancedRedstoneTransmitterExternal(ITexture coverTexture) {
+ super(TransmitterData.class, coverTexture);
+ }
+
+ @Override
+ public TransmitterData createDataObject() {
+ return new TransmitterData();
+ }
+
+ @Override
+ public TransmitterData createDataObject(int aLegacyData) {
+ return createDataObject();
+ }
+
+ @Override
+ public TransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ TransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ byte outputRedstone = aInputRedstone;
+ if (aCoverVariable.isInvert()) {
+ if (outputRedstone > 0) outputRedstone = 0;
+ else outputRedstone = 15;
+ }
+
+ final long hash = hashCoverCoords(aTileEntity, side);
+ setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, outputRedstone);
+
+ return aCoverVariable;
+ }
+
+ @Override
+ protected boolean isRedstoneSensitiveImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable,
+ ICoverable aTileEntity, long aTimer) {
+ return true;
+ }
+
+ @Override
+ public boolean letsRedstoneGoInImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java
new file mode 100644
index 0000000000..01a46fcc86
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedRedstoneTransmitterInternal.java
@@ -0,0 +1,50 @@
+package gregtech.common.covers.redstone;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+
+public class GT_Cover_AdvancedRedstoneTransmitterInternal
+ extends GT_Cover_AdvancedRedstoneTransmitterBase<GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData> {
+
+ public GT_Cover_AdvancedRedstoneTransmitterInternal(ITexture coverTexture) {
+ super(TransmitterData.class, coverTexture);
+ }
+
+ @Override
+ public TransmitterData createDataObject() {
+ return new TransmitterData();
+ }
+
+ @Override
+ public TransmitterData createDataObject(int aLegacyData) {
+ return createDataObject();
+ }
+
+ @Override
+ public TransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ TransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ byte outputRedstone = aTileEntity.getOutputRedstoneSignal(side);
+ if (aCoverVariable.isInvert()) {
+ if (outputRedstone > 0) outputRedstone = 0;
+ else outputRedstone = 15;
+ }
+
+ final long hash = hashCoverCoords(aTileEntity, side);
+ setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, outputRedstone);
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, TransmitterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID,
+ TransmitterData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedWirelessRedstoneBase.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedWirelessRedstoneBase.java
new file mode 100644
index 0000000000..d19db38177
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_AdvancedWirelessRedstoneBase.java
@@ -0,0 +1,303 @@
+package gregtech.common.covers.redstone;
+
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+import io.netty.buffer.ByteBuf;
+
+public abstract class GT_Cover_AdvancedWirelessRedstoneBase<T extends GT_Cover_AdvancedWirelessRedstoneBase.WirelessData>
+ extends GT_CoverBehaviorBase<T> {
+
+ public GT_Cover_AdvancedWirelessRedstoneBase(Class<T> typeToken, ITexture coverTexture) {
+ super(typeToken, coverTexture);
+ }
+
+ public static Byte getSignalAt(UUID uuid, int frequency, GT_Cover_AdvancedRedstoneReceiverBase.GateMode mode) {
+ Map<Integer, Map<Long, Byte>> frequencies = GregTech_API.sAdvancedWirelessRedstone.get(String.valueOf(uuid));
+ if (frequencies == null) return 0;
+
+ Map<Long, Byte> signals = frequencies.get(frequency);
+ if (signals == null) signals = new ConcurrentHashMap<>();
+
+ switch (mode) {
+ case AND -> {
+ return (byte) (signals.values()
+ .stream()
+ .map(signal -> signal > 0)
+ .reduce(true, (signalA, signalB) -> signalA && signalB) ? 15 : 0);
+ }
+ case NAND -> {
+ return (byte) (signals.values()
+ .stream()
+ .map(signal -> signal > 0)
+ .reduce(true, (signalA, signalB) -> signalA && signalB) ? 0 : 15);
+ }
+ case OR -> {
+ return (byte) (signals.values()
+ .stream()
+ .map(signal -> signal > 0)
+ .reduce(false, (signalA, signalB) -> signalA || signalB) ? 15 : 0);
+ }
+ case NOR -> {
+ return (byte) (signals.values()
+ .stream()
+ .map(signal -> signal > 0)
+ .reduce(false, (signalA, signalB) -> signalA || signalB) ? 0 : 15);
+ }
+ case SINGLE_SOURCE -> {
+ if (signals.values()
+ .isEmpty()) {
+ return 0;
+ }
+ return signals.values()
+ .iterator()
+ .next();
+ }
+ default -> {
+ return 0;
+ }
+ }
+ }
+
+ public static void removeSignalAt(UUID uuid, int frequency, long hash) {
+ Map<Integer, Map<Long, Byte>> frequencies = GregTech_API.sAdvancedWirelessRedstone.get(String.valueOf(uuid));
+ if (frequencies == null) return;
+ frequencies.computeIfPresent(frequency, (freq, longByteMap) -> {
+ longByteMap.remove(hash);
+ return longByteMap.isEmpty() ? null : longByteMap;
+ });
+ }
+
+ public static void setSignalAt(UUID uuid, int frequency, long hash, byte value) {
+ Map<Integer, Map<Long, Byte>> frequencies = GregTech_API.sAdvancedWirelessRedstone
+ .computeIfAbsent(String.valueOf(uuid), k -> new ConcurrentHashMap<>());
+ Map<Long, Byte> signals = frequencies.computeIfAbsent(frequency, k -> new ConcurrentHashMap<>());
+ signals.put(hash, value);
+ }
+
+ /**
+ * x hashed into first 20 bytes y hashed into second 20 bytes z hashed into fifth 10 bytes dim hashed into sixth 10
+ * bytes side hashed into last 4 bytes
+ */
+ public static long hashCoverCoords(ICoverable tile, ForgeDirection side) {
+ return (((((long) tile.getXCoord() << 20) + tile.getZCoord() << 10) + tile.getYCoord() << 10)
+ + tile.getWorld().provider.dimensionId << 4) + side.ordinal();
+ }
+
+ @Override
+ public boolean letsEnergyInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsEnergyOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsFluidOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, Fluid aFluid,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsInImpl(ForgeDirection side, int aCoverID, T aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public boolean letsItemsOutImpl(ForgeDirection side, int aCoverID, T aCoverVariable, int aSlot,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public String getDescriptionImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {
+ return GT_Utility.trans("081", "Frequency: ") + aCoverVariable.frequency
+ + ", Transmission: "
+ + (aCoverVariable.uuid == null ? "Public" : "Private");
+ }
+
+ @Override
+ public int getTickRateImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity) {
+ return 5;
+ }
+
+ public abstract static class WirelessData implements ISerializableObject {
+
+ protected int frequency;
+
+ /**
+ * If UUID is set to null, the cover frequency is public, rather than private
+ **/
+ protected UUID uuid;
+
+ public WirelessData(int frequency, UUID uuid) {
+ this.frequency = frequency;
+ this.uuid = uuid;
+ }
+
+ public UUID getUuid() {
+ return uuid;
+ }
+
+ public int getFrequency() {
+ return frequency;
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setInteger("frequency", frequency);
+ if (uuid != null) {
+ tag.setString("uuid", uuid.toString());
+ }
+
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ aBuf.writeInt(frequency);
+ aBuf.writeBoolean(uuid != null);
+ if (uuid != null) {
+ aBuf.writeLong(uuid.getLeastSignificantBits());
+ aBuf.writeLong(uuid.getMostSignificantBits());
+ }
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ frequency = tag.getInteger("frequency");
+ if (tag.hasKey("uuid")) {
+ uuid = UUID.fromString(tag.getString("uuid"));
+ }
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ frequency = aBuf.readInt();
+ if (aBuf.readBoolean()) {
+ uuid = new UUID(aBuf.readLong(), aBuf.readLong());
+ }
+
+ return this;
+ }
+ }
+
+ // GUI stuff
+
+ @Override
+ public boolean hasCoverGUI() {
+ return true;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ protected abstract class AdvancedWirelessRedstoneBaseUIFactory extends UIFactory {
+
+ protected static final int startX = 10;
+ protected static final int startY = 25;
+ protected static final int spaceX = 18;
+ protected static final int spaceY = 18;
+
+ public AdvancedWirelessRedstoneBaseUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @Override
+ protected int getGUIWidth() {
+ return 250;
+ }
+
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ final int privateExtraColumn = isShiftPrivateLeft() ? 1 : 5;
+
+ CoverDataControllerWidget<T> dataController = new CoverDataControllerWidget<>(
+ this::getCoverData,
+ this::setCoverData,
+ GT_Cover_AdvancedWirelessRedstoneBase.this);
+ dataController.setPos(startX, startY);
+ addUIForDataController(dataController);
+
+ builder.widget(dataController)
+ .widget(
+ new TextWidget(GT_Utility.trans("246", "Frequency")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 5, 4 + startY + spaceY * getFrequencyRow()))
+ .widget(
+ new TextWidget(GT_Utility.trans("602", "Use Private Frequency"))
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * privateExtraColumn, 4 + startY + spaceY * getButtonRow()));
+ }
+
+ protected void addUIForDataController(CoverDataControllerWidget<T> controller) {
+ controller.addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) coverData.frequency,
+ (coverData, state) -> {
+ coverData.frequency = state.intValue();
+ return coverData;
+ },
+ widget -> widget.setScrollValues(1, 1000, 10)
+ .setBounds(0, Integer.MAX_VALUE)
+ .setPos(1, 2 + spaceY * getFrequencyRow())
+ .setSize(spaceX * 5 - 4, 12))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofCheck(),
+ coverData -> coverData.uuid != null,
+ (coverData, state) -> {
+ if (state) {
+ coverData.uuid = getUIBuildContext().getPlayer()
+ .getUniqueID();
+ } else {
+ coverData.uuid = null;
+ }
+ return coverData;
+ },
+ widget -> widget.setPos(0, spaceY * getButtonRow()));
+ }
+
+ protected abstract int getFrequencyRow();
+
+ protected abstract int getButtonRow();
+
+ protected abstract boolean isShiftPrivateLeft();
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessDoesWorkDetector.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessDoesWorkDetector.java
new file mode 100644
index 0000000000..724f12b8f8
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessDoesWorkDetector.java
@@ -0,0 +1,245 @@
+package gregtech.common.covers.redstone;
+
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IMachineProgress;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.covers.redstone.GT_Cover_WirelessDoesWorkDetector.ActivityMode;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Cover_WirelessDoesWorkDetector
+ extends GT_Cover_AdvancedRedstoneTransmitterBase<GT_Cover_WirelessDoesWorkDetector.ActivityTransmitterData> {
+
+ public GT_Cover_WirelessDoesWorkDetector(ITexture coverTexture) {
+ super(ActivityTransmitterData.class, coverTexture);
+ }
+
+ @Override
+ public ActivityTransmitterData createDataObject() {
+ return new ActivityTransmitterData();
+ }
+
+ @Override
+ public ActivityTransmitterData createDataObject(int aLegacyData) {
+ return createDataObject();
+ }
+
+ private static byte computeSignalBasedOnActivity(ActivityTransmitterData coverVariable, ICoverable tileEntity) {
+
+ if (tileEntity instanceof IMachineProgress) {
+ IMachineProgress mProgress = (IMachineProgress) tileEntity;
+ boolean inverted = coverVariable.invert;
+ int signal = 0;
+
+ switch (coverVariable.mode) {
+ case MACHINE_ENABLED -> signal = inverted == mProgress.isAllowedToWork() ? 0 : 15;
+ case MACHINE_IDLE -> signal = inverted == (mProgress.getMaxProgress() == 0) ? 0 : 15;
+ case RECIPE_PROGRESS -> {
+ int tScale = mProgress.getMaxProgress() / 15;
+
+ if (tScale > 0 && mProgress.hasThingsToDo()) {
+ signal = inverted ? (15 - mProgress.getProgress() / tScale)
+ : (mProgress.getProgress() / tScale);
+ } else {
+ signal = inverted ? 15 : 0;
+ }
+ }
+ }
+
+ return (byte) signal;
+ } else {
+ return (byte) 0;
+ }
+
+ }
+
+ @Override
+ public ActivityTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ ActivityTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ final byte signal = computeSignalBasedOnActivity(aCoverVariable, aTileEntity);
+ final long hash = hashCoverCoords(aTileEntity, side);
+ setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, signal);
+
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, ActivityTransmitterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID,
+ ActivityTransmitterData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRateImpl(ForgeDirection side, int aCoverID, ActivityTransmitterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return 5;
+ }
+
+ public enum ActivityMode {
+ RECIPE_PROGRESS,
+ MACHINE_IDLE,
+ MACHINE_ENABLED,
+ }
+
+ public static class ActivityTransmitterData extends GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData {
+
+ private ActivityMode mode;
+
+ public ActivityTransmitterData(int frequency, UUID uuid, boolean invert, ActivityMode mode) {
+ super(frequency, uuid, invert);
+ this.mode = mode;
+ }
+
+ public ActivityTransmitterData() {
+ super();
+ this.mode = ActivityMode.MACHINE_IDLE;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new ActivityTransmitterData(frequency, uuid, invert, mode);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT();
+ tag.setInteger("mode", mode.ordinal());
+
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ super.writeToByteBuf(aBuf);
+ aBuf.writeInt(mode.ordinal());
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ super.loadDataFromNBT(aNBT);
+
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ mode = ActivityMode.values()[tag.getInteger("mode")];
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ super.readFromPacket(aBuf, aPlayer);
+ mode = ActivityMode.values()[aBuf.readInt()];
+
+ return this;
+ }
+ }
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new WirelessActivityDetectorUIFactory(buildContext).createWindow();
+ }
+
+ private class WirelessActivityDetectorUIFactory extends AdvancedRedstoneTransmitterBaseUIFactory {
+
+ public WirelessActivityDetectorUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @Override
+ protected int getGUIHeight() {
+ return 107;
+ }
+
+ @Override
+ protected int getFrequencyRow() {
+ return 0;
+ }
+
+ @Override
+ protected int getButtonRow() {
+ return 1;
+ }
+
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ super.addUIWidgets(builder);
+ builder.widget(TextWidget.dynamicString(() -> {
+
+ ActivityMode mode = getCoverData().mode;
+
+ if (mode == ActivityMode.MACHINE_ENABLED) {
+ return GT_Utility.trans("271", "Machine enabled");
+ } else if (mode == ActivityMode.MACHINE_IDLE) {
+ return GT_Utility.trans("242", "Machine idle");
+ } else {
+ return GT_Utility.trans("241", "Recipe progress");
+ }
+
+ })
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 3, 4 + startY + spaceY * 2));
+ }
+
+ @Override
+ protected void addUIForDataController(CoverDataControllerWidget<ActivityTransmitterData> controller) {
+ super.addUIForDataController(controller);
+
+ controller.addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.mode == ActivityMode.RECIPE_PROGRESS,
+ (coverData, state) -> {
+ coverData.mode = ActivityMode.RECIPE_PROGRESS;
+ return coverData;
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_PROGRESS)
+ .addTooltip(GT_Utility.trans("241", "Recipe progress"))
+ .setPos(spaceX * 0, spaceY * 2))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.mode == ActivityMode.MACHINE_IDLE,
+ (coverData, state) -> {
+ coverData.mode = ActivityMode.MACHINE_IDLE;
+ return coverData;
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK)
+ .addTooltip(GT_Utility.trans("242", "Machine idle"))
+ .setPos(spaceX * 1, spaceY * 2))
+ .addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.mode == ActivityMode.MACHINE_ENABLED,
+ (coverData, state) -> {
+ coverData.mode = ActivityMode.MACHINE_ENABLED;
+ return coverData;
+ },
+ widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON)
+ .addTooltip(GT_Utility.trans("271", "Machine enabled"))
+ .setPos(spaceX * 2, spaceY * 2));
+ }
+ }
+
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessFluidDetector.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessFluidDetector.java
new file mode 100644
index 0000000000..9a9d419be6
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessFluidDetector.java
@@ -0,0 +1,186 @@
+package gregtech.common.covers.redstone;
+
+import java.util.Arrays;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.covers.GT_Cover_LiquidMeter;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Cover_WirelessFluidDetector
+ extends GT_Cover_AdvancedRedstoneTransmitterBase<GT_Cover_WirelessFluidDetector.FluidTransmitterData> {
+
+ public GT_Cover_WirelessFluidDetector(ITexture coverTexture) {
+ super(FluidTransmitterData.class, coverTexture);
+ }
+
+ @Override
+ public FluidTransmitterData createDataObject() {
+ return new FluidTransmitterData();
+ }
+
+ @Override
+ public FluidTransmitterData createDataObject(int aLegacyData) {
+ return createDataObject();
+ }
+
+ @Override
+ public FluidTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ FluidTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ final byte signal = GT_Cover_LiquidMeter
+ .computeSignalBasedOnFluid(aTileEntity, aCoverVariable.invert, aCoverVariable.threshold);
+ final long hash = hashCoverCoords(aTileEntity, side);
+ setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, signal);
+
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, FluidTransmitterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID,
+ FluidTransmitterData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ public static class FluidTransmitterData extends GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData {
+
+ /** The special value {@code 0} means threshold check is disabled. */
+ private int threshold;
+
+ public FluidTransmitterData(int frequency, UUID uuid, boolean invert, int threshold) {
+ super(frequency, uuid, invert);
+ this.threshold = threshold;
+ }
+
+ public FluidTransmitterData() {
+ super();
+ this.threshold = 0;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new FluidTransmitterData(frequency, uuid, invert, threshold);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT();
+ tag.setInteger("threshold", threshold);
+
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ super.writeToByteBuf(aBuf);
+ aBuf.writeInt(threshold);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ super.loadDataFromNBT(aNBT);
+
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ threshold = tag.getInteger("threshold");
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ super.readFromPacket(aBuf, aPlayer);
+ threshold = aBuf.readInt();
+
+ return this;
+ }
+ }
+
+ // GUI stuff
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new WirelessFluidDetectorUIFactory(buildContext).createWindow();
+ }
+
+ private class WirelessFluidDetectorUIFactory extends AdvancedRedstoneTransmitterBaseUIFactory {
+
+ private int maxCapacity;
+
+ public WirelessFluidDetectorUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @Override
+ protected int getFrequencyRow() {
+ return 0;
+ }
+
+ @Override
+ protected int getButtonRow() {
+ return 1;
+ }
+
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ setMaxCapacity();
+ super.addUIWidgets(builder);
+ builder.widget(
+ new TextWidget(GT_Utility.trans("222", "Fluid threshold")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 5, 4 + startY + spaceY * 2));
+ }
+
+ @Override
+ protected void addUIForDataController(CoverDataControllerWidget<FluidTransmitterData> controller) {
+ super.addUIForDataController(controller);
+ controller.addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) coverData.threshold,
+ (coverData, state) -> {
+ coverData.threshold = state.intValue();
+ return coverData;
+ },
+ widget -> widget.setBounds(0, maxCapacity > 0 ? maxCapacity : Integer.MAX_VALUE)
+ .setScrollValues(1000, 144, 100000)
+ .setFocusOnGuiOpen(true)
+ .setPos(1, 2 + spaceY * 2)
+ .setSize(spaceX * 5 - 4, 12));
+ }
+
+ private void setMaxCapacity() {
+ final ICoverable tile = getUIBuildContext().getTile();
+ if (!tile.isDead() && tile instanceof IFluidHandler) {
+ FluidTankInfo[] tanks = ((IFluidHandler) tile).getTankInfo(ForgeDirection.UNKNOWN);
+ maxCapacity = Arrays.stream(tanks)
+ .mapToInt(tank -> tank.capacity)
+ .sum();
+ } else {
+ maxCapacity = -1;
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessItemDetector.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessItemDetector.java
new file mode 100644
index 0000000000..3cc7f60984
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessItemDetector.java
@@ -0,0 +1,262 @@
+package gregtech.common.covers.redstone;
+
+import java.text.FieldPosition;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.covers.GT_Cover_ItemMeter;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_NumericWidget;
+import gregtech.common.gui.modularui.widget.ItemWatcherSlotWidget;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalChestBase;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Cover_WirelessItemDetector
+ extends GT_Cover_AdvancedRedstoneTransmitterBase<GT_Cover_WirelessItemDetector.ItemTransmitterData> {
+
+ public GT_Cover_WirelessItemDetector(ITexture coverTexture) {
+ super(ItemTransmitterData.class, coverTexture);
+ }
+
+ @Override
+ public ItemTransmitterData createDataObject() {
+ return new ItemTransmitterData();
+ }
+
+ @Override
+ public ItemTransmitterData createDataObject(int aLegacyData) {
+ return createDataObject();
+ }
+
+ @Override
+ public ItemTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ ItemTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ byte signal = GT_Cover_ItemMeter.computeSignalBasedOnItems(
+ aTileEntity,
+ aCoverVariable.invert,
+ aCoverVariable.threshold,
+ aCoverVariable.slot,
+ side.ordinal());
+ final long hash = hashCoverCoords(aTileEntity, side);
+ setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, signal);
+
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, ItemTransmitterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID,
+ ItemTransmitterData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ public static class ItemTransmitterData extends GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData {
+
+ /**
+ * The special value {@code -1} means all slots.
+ */
+ private int slot;
+ /**
+ * The special value {@code 0} means threshold check is disabled.
+ */
+ private int threshold;
+
+ public ItemTransmitterData(int frequency, UUID uuid, boolean invert, int threshold, int slot) {
+ super(frequency, uuid, invert);
+ this.threshold = threshold;
+ this.slot = slot;
+ }
+
+ public ItemTransmitterData() {
+ super();
+ this.threshold = 0;
+ this.slot = -1;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new ItemTransmitterData(frequency, uuid, invert, threshold, slot);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT();
+ tag.setInteger("threshold", threshold);
+ tag.setInteger("slot", slot);
+
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ super.writeToByteBuf(aBuf);
+ aBuf.writeInt(threshold);
+ aBuf.writeInt(slot);
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ super.loadDataFromNBT(aNBT);
+
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ threshold = tag.getInteger("threshold");
+ slot = tag.getInteger("slot");
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ super.readFromPacket(aBuf, aPlayer);
+ threshold = aBuf.readInt();
+ slot = aBuf.readInt();
+
+ return this;
+ }
+ }
+
+ // GUI stuff
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new WirelessItemDetectorUIFactory(buildContext).createWindow();
+ }
+
+ private class WirelessItemDetectorUIFactory extends AdvancedRedstoneTransmitterBaseUIFactory {
+
+ private int maxSlot;
+ private int maxThreshold;
+ /**
+ * Display the text "All" instead of a number when the slot is set to -1.
+ */
+ private static final NumberFormatMUI numberFormatAll = new NumberFormatMUI() {
+
+ @Override
+ public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
+ if (number < 0) {
+ return toAppendTo.append(GT_Utility.trans("ALL", "All"));
+ } else {
+ return super.format(number, toAppendTo, pos);
+ }
+ }
+ };
+
+ public WirelessItemDetectorUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @Override
+ protected int getFrequencyRow() {
+ return 0;
+ }
+
+ @Override
+ protected int getButtonRow() {
+ return 1;
+ }
+
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ setMaxSlot();
+ setMaxThreshold();
+ super.addUIWidgets(builder);
+ builder.widget(
+ new ItemWatcherSlotWidget().setGetter(this::getTargetItem)
+ .setPos(startX + spaceX * 4 - 1, startY + spaceY * 3))
+ .widget(
+ new TextWidget(GT_Utility.trans("221", "Item threshold")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 5, 4 + startY + spaceY * 2))
+ .widget(
+ new TextWidget(GT_Utility.trans("254", "Detect Slot #")).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * 5, 4 + startY + spaceY * 3));
+ }
+
+ @Override
+ protected void addUIForDataController(CoverDataControllerWidget<ItemTransmitterData> controller) {
+ super.addUIForDataController(controller);
+ controller.addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) coverData.threshold,
+ (coverData, state) -> {
+ coverData.threshold = state.intValue();
+ return coverData;
+ },
+ widget -> widget.setBounds(0, maxThreshold)
+ .setScrollValues(1, 64, 1000)
+ .setFocusOnGuiOpen(true)
+ .setPos(1, 2 + spaceY * 2)
+ .setSize(spaceX * 5 - 4, 12))
+ .addFollower(
+ new CoverDataFollower_NumericWidget<>(),
+ coverData -> (double) coverData.slot,
+ (coverData, state) -> {
+ coverData.slot = state.intValue();
+ return coverData;
+ },
+ widget -> widget.setBounds(-1, maxSlot)
+ .setDefaultValue(-1)
+ .setScrollValues(1, 100, 10)
+ .setNumberFormat(numberFormatAll)
+ .setPos(1, 2 + spaceY * 3)
+ .setSize(spaceX * 4 - 8, 12));
+ }
+
+ private void setMaxSlot() {
+ final ICoverable tile = getUIBuildContext().getTile();
+ if (!tile.isDead() && tile instanceof IGregTechTileEntity gtTile
+ && !(gtTile.getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalChestBase)) {
+ maxSlot = tile.getSizeInventory() - 1;
+ } else {
+ maxSlot = -1;
+ }
+ }
+
+ private void setMaxThreshold() {
+ final ICoverable tile = getUIBuildContext().getTile();
+ if (!tile.isDead() && tile instanceof IGregTechTileEntity gtTile
+ && gtTile.getMetaTileEntity() instanceof GT_MetaTileEntity_DigitalChestBase) {
+ maxThreshold = gtTile.getMaxItemCount();
+ } else {
+ maxThreshold = maxSlot > 0 ? maxSlot * 64 : Integer.MAX_VALUE;
+ }
+ }
+
+ private ItemStack getTargetItem() {
+ final ICoverable tile = getUIBuildContext().getTile();
+ final ItemTransmitterData coverVariable = getCoverData();
+ if (coverVariable != null && coverVariable.slot >= 0
+ && tile instanceof TileEntity
+ && !tile.isDead()
+ && tile.getSizeInventory() >= coverVariable.slot) {
+ return tile.getStackInSlot(coverVariable.slot);
+ } else {
+ return null;
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessMaintenanceDetector.java b/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessMaintenanceDetector.java
new file mode 100644
index 0000000000..d9cc765ef8
--- /dev/null
+++ b/src/main/java/gregtech/common/covers/redstone/GT_Cover_WirelessMaintenanceDetector.java
@@ -0,0 +1,242 @@
+package gregtech.common.covers.redstone;
+
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.io.ByteArrayDataInput;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.covers.GT_Cover_NeedMaintainance;
+import gregtech.common.gui.modularui.widget.CoverDataControllerWidget;
+import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget;
+import io.netty.buffer.ByteBuf;
+
+public class GT_Cover_WirelessMaintenanceDetector
+ extends GT_Cover_AdvancedRedstoneTransmitterBase<GT_Cover_WirelessMaintenanceDetector.MaintenanceTransmitterData> {
+
+ public GT_Cover_WirelessMaintenanceDetector(ITexture coverTexture) {
+ super(MaintenanceTransmitterData.class, coverTexture);
+ }
+
+ @Override
+ public MaintenanceTransmitterData createDataObject() {
+ return new MaintenanceTransmitterData();
+ }
+
+ @Override
+ public MaintenanceTransmitterData createDataObject(int aLegacyData) {
+ return createDataObject();
+ }
+
+ private static byte computeSignalBasedOnMaintenance(MaintenanceTransmitterData coverVariable,
+ ICoverable tileEntity) {
+ boolean signal = false;
+
+ if (tileEntity instanceof IGregTechTileEntity) {
+ IMetaTileEntity metaTE = ((IGregTechTileEntity) tileEntity).getMetaTileEntity();
+ if (metaTE instanceof GT_MetaTileEntity_MultiBlockBase multiTE) {
+ int ideal = multiTE.getIdealStatus();
+ int real = multiTE.getRepairStatus();
+
+ switch (coverVariable.mode) {
+ case NO_ISSUE -> signal = ideal == real;
+ case ONE_ISSUE, TWO_ISSUES, THREE_ISSUES, FOUR_ISSUES, FIVE_ISSUES -> signal = ideal - real
+ >= coverVariable.mode.ordinal();
+ case ROTOR_80, ROTOR_100 -> {
+ ItemStack rotor = multiTE.getRealInventory()[1];
+ if (GT_Cover_NeedMaintainance.isRotor(rotor)) {
+ long max = GT_MetaGenerated_Tool.getToolMaxDamage(rotor);
+ long current = GT_MetaGenerated_Tool.getToolDamage(rotor);
+
+ if (coverVariable.mode == MaintenanceMode.ROTOR_80) {
+ signal = current >= max * 8 / 10;
+ } else {
+ long expectedDamage = Math.round(
+ Math.min(
+ (double) multiTE.mEUt / multiTE.damageFactorLow,
+ Math.pow(multiTE.mEUt, multiTE.damageFactorHigh)));
+ signal = current + expectedDamage * 2 >= max;
+ }
+ } else {
+ signal = true;
+ }
+ }
+ }
+ }
+ }
+
+ if (coverVariable.invert) {
+ signal = !signal;
+ }
+
+ return (byte) (signal ? 15 : 0);
+ }
+
+ @Override
+ public MaintenanceTransmitterData doCoverThingsImpl(ForgeDirection side, byte aInputRedstone, int aCoverID,
+ MaintenanceTransmitterData aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ final byte signal = computeSignalBasedOnMaintenance(aCoverVariable, aTileEntity);
+ final long hash = hashCoverCoords(aTileEntity, side);
+ setSignalAt(aCoverVariable.getUuid(), aCoverVariable.getFrequency(), hash, signal);
+
+ return aCoverVariable;
+ }
+
+ @Override
+ public boolean letsRedstoneGoOutImpl(ForgeDirection side, int aCoverID, MaintenanceTransmitterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ protected boolean manipulatesSidedRedstoneOutputImpl(ForgeDirection side, int aCoverID,
+ MaintenanceTransmitterData aCoverVariable, ICoverable aTileEntity) {
+ return true;
+ }
+
+ @Override
+ public int getTickRateImpl(ForgeDirection side, int aCoverID, MaintenanceTransmitterData aCoverVariable,
+ ICoverable aTileEntity) {
+ return 60;
+ }
+
+ public enum MaintenanceMode {
+ NO_ISSUE,
+ ONE_ISSUE,
+ TWO_ISSUES,
+ THREE_ISSUES,
+ FOUR_ISSUES,
+ FIVE_ISSUES,
+ ROTOR_80,
+ ROTOR_100
+ }
+
+ public static class MaintenanceTransmitterData extends GT_Cover_AdvancedRedstoneTransmitterBase.TransmitterData {
+
+ private MaintenanceMode mode;
+
+ public MaintenanceTransmitterData(int frequency, UUID uuid, boolean invert, MaintenanceMode mode) {
+ super(frequency, uuid, invert);
+ this.mode = mode;
+ }
+
+ public MaintenanceTransmitterData() {
+ super();
+ this.mode = MaintenanceMode.ONE_ISSUE;
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject copy() {
+ return new MaintenanceTransmitterData(frequency, uuid, invert, mode);
+ }
+
+ @Nonnull
+ @Override
+ public NBTBase saveDataToNBT() {
+ NBTTagCompound tag = (NBTTagCompound) super.saveDataToNBT();
+ tag.setInteger("mode", mode.ordinal());
+
+ return tag;
+ }
+
+ @Override
+ public void writeToByteBuf(ByteBuf aBuf) {
+ super.writeToByteBuf(aBuf);
+ aBuf.writeInt(mode.ordinal());
+ }
+
+ @Override
+ public void loadDataFromNBT(NBTBase aNBT) {
+ super.loadDataFromNBT(aNBT);
+
+ NBTTagCompound tag = (NBTTagCompound) aNBT;
+ mode = MaintenanceMode.values()[tag.getInteger("mode")];
+ }
+
+ @Nonnull
+ @Override
+ public ISerializableObject readFromPacket(ByteArrayDataInput aBuf, EntityPlayerMP aPlayer) {
+ super.readFromPacket(aBuf, aPlayer);
+ mode = MaintenanceMode.values()[aBuf.readInt()];
+
+ return this;
+ }
+ }
+
+ // GUI stuff
+
+ private static final String[] extraTexts = new String[] { "No Issues", ">= 1 Issue", ">= 2 Issues", ">= 3 Issues",
+ ">= 4 Issues", ">= 5 Issues", "Rotor < 80%", "Rotor < 100%" };
+
+ @Override
+ public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) {
+ return new WirelessMaintenanceDetectorUIFactory(buildContext).createWindow();
+ }
+
+ private class WirelessMaintenanceDetectorUIFactory extends AdvancedRedstoneTransmitterBaseUIFactory {
+
+ public WirelessMaintenanceDetectorUIFactory(GT_CoverUIBuildContext buildContext) {
+ super(buildContext);
+ }
+
+ @Override
+ protected int getGUIHeight() {
+ return 143;
+ }
+
+ @Override
+ protected int getFrequencyRow() {
+ return 0;
+ }
+
+ @Override
+ protected int getButtonRow() {
+ return 1;
+ }
+
+ @Override
+ protected void addUIWidgets(ModularWindow.Builder builder) {
+ super.addUIWidgets(builder);
+ for (int i = 0; i < 8; i++) {
+ builder.widget(
+ new TextWidget(extraTexts[i]).setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(startX + spaceX * (i % 2 == 0 ? 1 : 7), 4 + startY + spaceY * (2 + i / 2)));
+ }
+ }
+
+ @Override
+ protected void addUIForDataController(CoverDataControllerWidget<MaintenanceTransmitterData> controller) {
+ super.addUIForDataController(controller);
+ for (int i = 0; i < 8; i++) {
+ final int index = i;
+ controller.addFollower(
+ CoverDataFollower_ToggleButtonWidget.ofDisableable(),
+ coverData -> coverData.mode == MaintenanceMode.values()[index],
+ (coverData, state) -> {
+ coverData.mode = MaintenanceMode.values()[index];
+ return coverData;
+ },
+ widget -> widget.setToggleTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK, GT_UITextures.TRANSPARENT)
+ .setPos(spaceX * (index % 2 == 0 ? 0 : 6), spaceY * (2 + index / 2)));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/entities/GT_EntityFXPollution.java b/src/main/java/gregtech/common/entities/GT_EntityFXPollution.java
new file mode 100644
index 0000000000..d5121a38ad
--- /dev/null
+++ b/src/main/java/gregtech/common/entities/GT_EntityFXPollution.java
@@ -0,0 +1,59 @@
+package gregtech.common.entities;
+
+import java.util.Random;
+
+import net.minecraft.client.particle.EntityFX;
+import net.minecraft.world.World;
+
+public class GT_EntityFXPollution extends EntityFX {
+
+ public GT_EntityFXPollution(World world, double x, double y, double z) {
+ super(world, x, y, z, 0, 0, 0);
+
+ this.particleRed = 0.25F;
+ this.particleGreen = 0.2F;
+ this.particleBlue = 0.25F;
+
+ this.motionX *= 0.1D;
+ this.motionY *= -0.1D;
+ this.motionZ *= 0.1F;
+
+ Random random = world.rand;
+ this.motionX += random.nextFloat() * -1.9D * random.nextFloat() * 0.1D;
+ this.motionY += random.nextFloat() * -0.5D * random.nextFloat() * 0.1D * 5.0D;
+ this.motionZ += random.nextFloat() * -1.9D * random.nextFloat() * 0.1D;
+
+ this.particleTextureIndexX = 0;
+ this.particleTextureIndexY = 0;
+
+ this.particleMaxAge = (int) ((double) 20 / ((double) random.nextFloat() * 0.8D + 0.2D));
+
+ this.particleScale *= 0.75F;
+ this.noClip = true;
+ }
+
+ @Override
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+
+ if (this.particleAge++ >= this.particleMaxAge) {
+ this.setDead();
+ } else {
+ this.motionY -= 5.0E-4D;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ if (this.posY == this.prevPosY) {
+ this.motionX *= 1.1D;
+ this.motionZ *= 1.1D;
+ }
+ this.motionX *= 0.96D;
+ this.motionY *= 0.96D;
+ this.motionZ *= 0.96D;
+ if (this.onGround) {
+ this.motionX *= 0.7D;
+ this.motionZ *= 0.7D;
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/entities/GT_Entity_Arrow.java b/src/main/java/gregtech/common/entities/GT_Entity_Arrow.java
new file mode 100644
index 0000000000..758888c720
--- /dev/null
+++ b/src/main/java/gregtech/common/entities/GT_Entity_Arrow.java
@@ -0,0 +1,438 @@
+package gregtech.common.entities;
+
+import java.util.List;
+import java.util.UUID;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityCreeper;
+import net.minecraft.entity.monster.EntityEnderman;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.play.server.S2BPacketChangeGameState;
+import net.minecraft.potion.Potion;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.World;
+import net.minecraft.world.WorldServer;
+import net.minecraftforge.common.util.FakePlayerFactory;
+
+import com.mojang.authlib.GameProfile;
+
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder;
+
+public class GT_Entity_Arrow extends EntityArrow {
+
+ private int mHitBlockX = -1;
+ private int mHitBlockY = -1;
+ private int mHitBlockZ = -1;
+ private Block mHitBlock = Blocks.air;
+ private int mHitBlockMeta = 0;
+ private boolean inGround = false;
+ private int mTicksAlive = 0;
+ private int ticksInAir = 0;
+ private int mKnockback = 0;
+ private ItemStack mArrow = null;
+
+ public GT_Entity_Arrow(World aWorld) {
+ super(aWorld);
+ }
+
+ public GT_Entity_Arrow(World aWorld, double aX, double aY, double aZ) {
+ super(aWorld, aX, aY, aZ);
+ }
+
+ public GT_Entity_Arrow(World aWorld, EntityLivingBase aEntity, float aSpeed) {
+ super(aWorld, aEntity, aSpeed);
+ }
+
+ public GT_Entity_Arrow(EntityArrow aArrow, ItemStack aStack) {
+ super(aArrow.worldObj);
+ NBTTagCompound tNBT = new NBTTagCompound();
+ aArrow.writeToNBT(tNBT);
+ readFromNBT(tNBT);
+ setArrowItem(aStack);
+ }
+
+ @Override
+ public void onUpdate() {
+ onEntityUpdate();
+ if ((this.mArrow == null) && (!this.worldObj.isRemote)) {
+ setDead();
+ return;
+ }
+ Entity tShootingEntity = this.shootingEntity;
+ if ((this.prevRotationPitch == 0.0F) && (this.prevRotationYaw == 0.0F)) {
+ float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.prevRotationYaw = (this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D
+ / Math.PI));
+ this.prevRotationPitch = (this.rotationPitch = (float) (Math.atan2(this.motionY, f) * 180.0D / Math.PI));
+ }
+ if (this.mTicksAlive++ == 3000) {
+ setDead();
+ }
+ Block tBlock = this.worldObj.getBlock(this.mHitBlockX, this.mHitBlockY, this.mHitBlockZ);
+ if (tBlock.getMaterial() != Material.air) {
+ tBlock.setBlockBoundsBasedOnState(this.worldObj, this.mHitBlockX, this.mHitBlockY, this.mHitBlockZ);
+ AxisAlignedBB axisalignedbb = tBlock
+ .getCollisionBoundingBoxFromPool(this.worldObj, this.mHitBlockX, this.mHitBlockY, this.mHitBlockZ);
+ if ((axisalignedbb != null)
+ && (axisalignedbb.isVecInside(Vec3.createVectorHelper(this.posX, this.posY, this.posZ)))) {
+ this.inGround = true;
+ }
+ }
+ if (this.arrowShake > 0) {
+ this.arrowShake -= 1;
+ }
+ if (this.inGround) {
+ int j = this.worldObj.getBlockMetadata(this.mHitBlockX, this.mHitBlockY, this.mHitBlockZ);
+ if ((tBlock != this.mHitBlock) || (j != this.mHitBlockMeta)) {
+ this.inGround = false;
+ this.motionX *= this.rand.nextFloat() * 0.2F;
+ this.motionY *= this.rand.nextFloat() * 0.2F;
+ this.motionZ *= this.rand.nextFloat() * 0.2F;
+ this.mTicksAlive = 0;
+ this.ticksInAir = 0;
+ }
+ } else {
+ this.ticksInAir += 1;
+ Vec3 vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ);
+ Vec3 vec3 = Vec3
+ .createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ MovingObjectPosition tVector = this.worldObj.func_147447_a(vec31, vec3, false, true, false);
+ vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ);
+ vec3 = Vec3
+ .createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ if (tVector != null) {
+ vec3 = Vec3.createVectorHelper(tVector.hitVec.xCoord, tVector.hitVec.yCoord, tVector.hitVec.zCoord);
+ }
+ Entity tHitEntity = null;
+ List<Entity> tAllPotentiallyHitEntities = this.worldObj.getEntitiesWithinAABBExcludingEntity(
+ this,
+ this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ)
+ .expand(1.0D, 1.0D, 1.0D));
+ double tLargestDistance = Double.MAX_VALUE;
+ for (Entity potentiallyHitEntity : tAllPotentiallyHitEntities) {
+ if ((potentiallyHitEntity.canBeCollidedWith())
+ && ((potentiallyHitEntity != tShootingEntity) || (this.ticksInAir >= 5))) {
+ AxisAlignedBB axisalignedbb1 = potentiallyHitEntity.boundingBox.expand(0.3D, 0.3D, 0.3D);
+ MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(vec31, vec3);
+ if (movingobjectposition1 != null) {
+ double tDistance = vec31.distanceTo(movingobjectposition1.hitVec);
+ if (tDistance < tLargestDistance) {
+ tHitEntity = potentiallyHitEntity;
+ tLargestDistance = tDistance;
+ }
+ }
+ }
+ }
+ if (tHitEntity != null) {
+ tVector = new MovingObjectPosition(tHitEntity);
+ }
+ if ((tVector != null) && ((tVector.entityHit instanceof EntityPlayer entityplayer))) {
+ if ((entityplayer.capabilities.disableDamage) || (((tShootingEntity instanceof EntityPlayer))
+ && (!((EntityPlayer) tShootingEntity).canAttackPlayer(entityplayer)))) {
+ tVector = null;
+ }
+ }
+ if (tVector != null) {
+ if (tVector.entityHit != null) {
+ ItemData tData = GT_OreDictUnificator.getItemData(this.mArrow);
+
+ float tMagicDamage = (tVector.entityHit instanceof EntityLivingBase)
+ ? EnchantmentHelper
+ .func_152377_a(this.mArrow, ((EntityLivingBase) tVector.entityHit).getCreatureAttribute())
+ : 0.0F;
+ float tDamage = MathHelper.ceiling_double_int(
+ MathHelper.sqrt_double(
+ this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ)
+ * (getDamage()
+ + ((tData != null) && (tData.mMaterial != null) && (tData.mMaterial.mMaterial != null)
+ ? tData.mMaterial.mMaterial.mToolQuality / 2.0F - 1.0F
+ : 0.0F)));
+ if (getIsCritical()) {
+ tDamage += this.rand.nextInt((int) (tDamage / 2.0D + 2.0D));
+ }
+ int tFireDamage = (isBurning() ? 5 : 0)
+ + 4 * EnchantmentHelper.getEnchantmentLevel(Enchantment.fireAspect.effectId, this.mArrow);
+ int tKnockback = this.mKnockback
+ + EnchantmentHelper.getEnchantmentLevel(Enchantment.knockback.effectId, this.mArrow);
+ int tHitTimer = -1;
+
+ int[] tDamages = onHitEntity(
+ tVector.entityHit,
+ tShootingEntity == null ? this : tShootingEntity,
+ this.mArrow == null ? new ItemStack(Items.arrow, 1) : this.mArrow,
+ (int) (tDamage * 2.0F),
+ (int) (tMagicDamage * 2.0F),
+ tKnockback,
+ tFireDamage,
+ tHitTimer);
+ if (tDamages != null) {
+ tDamage = tDamages[0] / 2.0F;
+ tMagicDamage = tDamages[1] / 2.0F;
+ tKnockback = tDamages[2];
+ tFireDamage = tDamages[3];
+ tHitTimer = tDamages[4];
+ if ((tFireDamage > 0) && (!(tVector.entityHit instanceof EntityEnderman))) {
+ tVector.entityHit.setFire(tFireDamage);
+ }
+ if ((!(tHitEntity instanceof EntityPlayer))
+ && (EnchantmentHelper.getEnchantmentLevel(Enchantment.looting.effectId, this.mArrow) > 0)) {
+ EntityPlayer tPlayer = null;
+ if ((this.worldObj instanceof WorldServer)) {
+ tPlayer = FakePlayerFactory.get(
+ (WorldServer) this.worldObj,
+ new GameProfile(
+ new UUID(0L, 0L),
+ (tShootingEntity instanceof EntityLivingBase)
+ ? tShootingEntity.getCommandSenderName()
+ : "Arrow"));
+ }
+ if (tPlayer != null) {
+ tPlayer.inventory.currentItem = 0;
+ tPlayer.inventory.setInventorySlotContents(0, getArrowItem());
+ tShootingEntity = tPlayer;
+ tPlayer.setDead();
+ }
+ }
+ DamageSource tDamageSource = DamageSource
+ .causeArrowDamage(this, tShootingEntity == null ? this : tShootingEntity);
+ if ((tDamage + tMagicDamage > 0.0F)
+ && (tVector.entityHit.attackEntityFrom(tDamageSource, tDamage + tMagicDamage))) {
+ if ((tVector.entityHit instanceof EntityLivingBase tHitLivingEntity)) {
+ if (tHitTimer >= 0) {
+ tVector.entityHit.hurtResistantTime = tHitTimer;
+ }
+ if (((tVector.entityHit instanceof EntityCreeper)) && (EnchantmentHelper
+ .getEnchantmentLevel(Enchantment.fireAspect.effectId, this.mArrow) > 0)) {
+ ((EntityCreeper) tVector.entityHit).func_146079_cb();
+ }
+ if (!this.worldObj.isRemote) {
+ tHitLivingEntity
+ .setArrowCountInEntity(tHitLivingEntity.getArrowCountInEntity() + 1);
+ }
+ if (tKnockback > 0) {
+ float tKnockbackDivider = MathHelper
+ .sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ if (tKnockbackDivider > 0.0F) {
+ tHitLivingEntity.addVelocity(
+ this.motionX * tKnockback * 0.6000000238418579D / tKnockbackDivider,
+ 0.1D,
+ this.motionZ * tKnockback * 0.6000000238418579D / tKnockbackDivider);
+ }
+ }
+ GT_Utility.GT_EnchantmentHelper.applyBullshitA(
+ tHitLivingEntity,
+ tShootingEntity == null ? this : tShootingEntity,
+ this.mArrow);
+ GT_Utility.GT_EnchantmentHelper.applyBullshitB(
+ (tShootingEntity instanceof EntityLivingBase) ? (EntityLivingBase) tShootingEntity
+ : null,
+ tHitLivingEntity,
+ this.mArrow);
+ if ((tHitLivingEntity != tShootingEntity)
+ && ((tHitLivingEntity instanceof EntityPlayer))
+ && ((tShootingEntity instanceof EntityPlayerMP))) {
+ ((EntityPlayerMP) tShootingEntity).playerNetServerHandler
+ .sendPacket(new S2BPacketChangeGameState(6, 0.0F));
+ }
+ }
+ if (((tShootingEntity instanceof EntityPlayer)) && (tMagicDamage > 0.0F)) {
+ ((EntityPlayer) tShootingEntity).onEnchantmentCritical(tVector.entityHit);
+ }
+ if ((!(tVector.entityHit instanceof EntityEnderman))
+ || (((EntityEnderman) tVector.entityHit).getActivePotionEffect(Potion.weakness)
+ != null)) {
+ if (tFireDamage > 0) {
+ tVector.entityHit.setFire(tFireDamage);
+ }
+ playSound("random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F));
+ setDead();
+ }
+ } else {
+ this.motionX *= -0.1000000014901161D;
+ this.motionY *= -0.1000000014901161D;
+ this.motionZ *= -0.1000000014901161D;
+ this.rotationYaw += 180.0F;
+ this.prevRotationYaw += 180.0F;
+ this.ticksInAir = 0;
+ }
+ }
+ } else {
+ this.mHitBlockX = tVector.blockX;
+ this.mHitBlockY = tVector.blockY;
+ this.mHitBlockZ = tVector.blockZ;
+ this.mHitBlock = this.worldObj.getBlock(this.mHitBlockX, this.mHitBlockY, this.mHitBlockZ);
+ this.mHitBlockMeta = this.worldObj
+ .getBlockMetadata(this.mHitBlockX, this.mHitBlockY, this.mHitBlockZ);
+ this.motionX = ((float) (tVector.hitVec.xCoord - this.posX));
+ this.motionY = ((float) (tVector.hitVec.yCoord - this.posY));
+ this.motionZ = ((float) (tVector.hitVec.zCoord - this.posZ));
+ float f2 = MathHelper.sqrt_double(
+ this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ);
+ this.posX -= this.motionX / f2 * 0.0500000007450581D;
+ this.posY -= this.motionY / f2 * 0.0500000007450581D;
+ this.posZ -= this.motionZ / f2 * 0.0500000007450581D;
+ playSound("random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F));
+ this.inGround = true;
+ this.arrowShake = 7;
+ setIsCritical(false);
+ if (this.mHitBlock.getMaterial() != Material.air) {
+ this.mHitBlock.onEntityCollidedWithBlock(
+ this.worldObj,
+ this.mHitBlockX,
+ this.mHitBlockY,
+ this.mHitBlockZ,
+ this);
+ }
+ if ((!this.worldObj.isRemote)
+ && (EnchantmentHelper.getEnchantmentLevel(Enchantment.fireAspect.effectId, this.mArrow) > 2)) {
+ GT_Utility
+ .setCoordsOnFire(this.worldObj, this.mHitBlockX, this.mHitBlockY, this.mHitBlockZ, true);
+ }
+ if (breaksOnImpact()) {
+ setDead();
+ }
+ }
+ }
+ WorldSpawnedEventBuilder.ParticleEventBuilder events = new WorldSpawnedEventBuilder.ParticleEventBuilder()
+ .setWorld(this.worldObj);
+
+ if (getIsCritical()) {
+ events.setIdentifier(ParticleFX.CRIT)
+ .setMotion(-this.motionX, -this.motionY + 0.2D, -this.motionZ).<WorldSpawnedEventBuilder
+ .ParticleEventBuilder>times(
+ 4,
+ (x, i) -> x
+ .setPosition(
+ this.posX + this.motionX * i / 4.0D,
+ this.posY + this.motionY * i / 4.0D,
+ this.posZ + this.motionZ * i / 4.0D)
+ .run());
+ }
+ this.posX += this.motionX;
+ this.posY += this.motionY;
+ this.posZ += this.motionZ;
+
+ this.rotationYaw = ((float) (Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI));
+ for (this.rotationPitch = ((float) (Math
+ .atan2(this.motionY, MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ))
+ * 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 tFrictionMultiplier = 0.99F;
+ if (isInWater()) {
+ events.setMotion(-this.motionX, -this.motionY + 0.2D, -this.motionZ)
+ .setIdentifier(ParticleFX.BUBBLE)
+ .setPosition(
+ this.posX - this.motionX * 0.25D,
+ this.posY - this.motionY * 0.25D,
+ this.posZ - this.motionZ * 0.25D)
+ .times(4, Runnable::run);
+ tFrictionMultiplier = 0.8F;
+ }
+ if (isWet()) {
+ extinguish();
+ }
+ this.motionX *= tFrictionMultiplier;
+ this.motionY *= tFrictionMultiplier;
+ this.motionZ *= tFrictionMultiplier;
+ this.motionY -= 0.0500000007450581D;
+ setPosition(this.posX, this.posY, this.posZ);
+ func_145775_I();
+ }
+ }
+
+ @Override
+ public void writeEntityToNBT(NBTTagCompound aNBT) {
+ super.writeEntityToNBT(aNBT);
+ aNBT.setShort("xTile", (short) this.mHitBlockX);
+ aNBT.setShort("yTile", (short) this.mHitBlockY);
+ aNBT.setShort("zTile", (short) this.mHitBlockZ);
+ aNBT.setShort("life", (short) this.mTicksAlive);
+ aNBT.setByte("inTile", (byte) Block.getIdFromBlock(this.mHitBlock));
+ aNBT.setByte("inData", (byte) this.mHitBlockMeta);
+ aNBT.setByte("shake", (byte) this.arrowShake);
+ aNBT.setByte("inGround", (byte) (this.inGround ? 1 : 0));
+ aNBT.setByte("pickup", (byte) this.canBePickedUp);
+ aNBT.setDouble("damage", getDamage());
+ aNBT.setTag("mArrow", this.mArrow == null ? null : this.mArrow.writeToNBT(new NBTTagCompound()));
+ }
+
+ @Override
+ public void readEntityFromNBT(NBTTagCompound aNBT) {
+ super.readEntityFromNBT(aNBT);
+ this.mHitBlockX = aNBT.getShort("xTile");
+ this.mHitBlockY = aNBT.getShort("yTile");
+ this.mHitBlockZ = aNBT.getShort("zTile");
+ this.mTicksAlive = aNBT.getShort("life");
+ this.mHitBlock = Block.getBlockById(aNBT.getByte("inTile") & 0xFF);
+ this.mHitBlockMeta = (aNBT.getByte("inData") & 0xFF);
+ this.arrowShake = (aNBT.getByte("shake") & 0xFF);
+ this.inGround = (aNBT.getByte("inGround") == 1);
+ setDamage(aNBT.getDouble("damage"));
+ this.canBePickedUp = aNBT.getByte("pickup");
+ this.mArrow = GT_Utility.loadItem(aNBT, "mArrow");
+ }
+
+ @Override
+ public void onCollideWithPlayer(EntityPlayer aPlayer) {
+ if ((!this.worldObj.isRemote) && (this.inGround)
+ && (this.arrowShake <= 0)
+ && (this.canBePickedUp == 1)
+ && (aPlayer.inventory.addItemStackToInventory(getArrowItem()))) {
+ playSound("random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
+ aPlayer.onItemPickup(this, 1);
+ setDead();
+ }
+ }
+
+ public int[] onHitEntity(Entity aHitEntity, Entity aShootingEntity, ItemStack aArrow, int aRegularDamage,
+ int aMagicDamage, int aKnockback, int aFireDamage, int aHitTimer) {
+ return new int[] { aRegularDamage, aMagicDamage, aKnockback, aFireDamage, aHitTimer };
+ }
+
+ public ItemStack getArrowItem() {
+ return GT_Utility.copyOrNull(this.mArrow);
+ }
+
+ public void setArrowItem(ItemStack aStack) {
+ this.mArrow = GT_Utility.updateItemStack(GT_Utility.copyAmount(1, aStack));
+ }
+
+ public boolean breaksOnImpact() {
+ return false;
+ }
+
+ @Override
+ public void setKnockbackStrength(int aKnockback) {
+ this.mKnockback = aKnockback;
+ }
+}
diff --git a/src/main/java/gregtech/common/entities/GT_Entity_Arrow_Potion.java b/src/main/java/gregtech/common/entities/GT_Entity_Arrow_Potion.java
new file mode 100644
index 0000000000..9b520831b6
--- /dev/null
+++ b/src/main/java/gregtech/common/entities/GT_Entity_Arrow_Potion.java
@@ -0,0 +1,78 @@
+package gregtech.common.entities;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.world.World;
+
+public class GT_Entity_Arrow_Potion extends GT_Entity_Arrow {
+
+ private int[] mPotions = new int[0];
+
+ public GT_Entity_Arrow_Potion(World aWorld) {
+ super(aWorld);
+ }
+
+ public GT_Entity_Arrow_Potion(World aWorld, double aX, double aY, double aZ) {
+ super(aWorld, aX, aY, aZ);
+ }
+
+ public GT_Entity_Arrow_Potion(World aWorld, EntityLivingBase aEntity, float aSpeed) {
+ super(aWorld, aEntity, aSpeed);
+ }
+
+ @Override
+ public void writeEntityToNBT(NBTTagCompound aNBT) {
+ super.writeEntityToNBT(aNBT);
+ aNBT.setIntArray("mPotions", this.mPotions);
+ }
+
+ @Override
+ public void readEntityFromNBT(NBTTagCompound aNBT) {
+ super.readEntityFromNBT(aNBT);
+ setPotions(aNBT.getIntArray("mPotions"));
+ }
+
+ @Override
+ public boolean breaksOnImpact() {
+ return true;
+ }
+
+ public int[] getPotions() {
+ return this.mPotions;
+ }
+
+ public void setPotions(int... aPotions) {
+ if (aPotions != null) {
+ this.mPotions = aPotions;
+ }
+ }
+
+ @Override
+ public int[] onHitEntity(Entity aHitEntity, Entity aShootingEntity, ItemStack aArrow, int aRegularDamage,
+ int aMagicDamage, int aKnockback, int aFireDamage, int aHitTimer) {
+ if ((aHitEntity instanceof EntityLivingBase)) {
+ for (int i = 3; i < this.mPotions.length; i += 4) {
+ if (aHitEntity.worldObj.rand.nextInt(100) < this.mPotions[i]) {
+ ((EntityLivingBase) aHitEntity).addPotionEffect(
+ new PotionEffect(
+ this.mPotions[(i - 3)],
+ this.mPotions[(i - 2)],
+ this.mPotions[(i - 1)],
+ false));
+ }
+ }
+ }
+ return super.onHitEntity(
+ aHitEntity,
+ aShootingEntity,
+ aArrow,
+ 1,
+ aMagicDamage,
+ aKnockback,
+ aFireDamage,
+ aHitTimer);
+ }
+}
diff --git a/src/main/java/gregtech/common/events/BaseMetricsCoverEvent.java b/src/main/java/gregtech/common/events/BaseMetricsCoverEvent.java
new file mode 100644
index 0000000000..953d6fbfcf
--- /dev/null
+++ b/src/main/java/gregtech/common/events/BaseMetricsCoverEvent.java
@@ -0,0 +1,21 @@
+package gregtech.common.events;
+
+import java.util.UUID;
+
+import org.jetbrains.annotations.NotNull;
+
+import cpw.mods.fml.common.eventhandler.Event;
+
+public abstract class BaseMetricsCoverEvent extends Event {
+
+ protected final UUID frequency;
+
+ public BaseMetricsCoverEvent(@NotNull UUID frequency) {
+ this.frequency = frequency;
+ }
+
+ @NotNull
+ public UUID getFrequency() {
+ return frequency;
+ }
+}
diff --git a/src/main/java/gregtech/common/events/MetricsCoverDataEvent.java b/src/main/java/gregtech/common/events/MetricsCoverDataEvent.java
new file mode 100644
index 0000000000..92a5aa663a
--- /dev/null
+++ b/src/main/java/gregtech/common/events/MetricsCoverDataEvent.java
@@ -0,0 +1,37 @@
+package gregtech.common.events;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.jetbrains.annotations.NotNull;
+
+import gregtech.common.misc.GlobalMetricsCoverDatabase;
+
+/**
+ * Event fired when the Metrics Transmitter cover sends an information packet.
+ */
+public class MetricsCoverDataEvent extends BaseMetricsCoverEvent {
+
+ @NotNull
+ private final List<String> payload;
+
+ @NotNull
+ private final GlobalMetricsCoverDatabase.Coordinates coordinates;
+
+ public MetricsCoverDataEvent(@NotNull UUID frequency, @NotNull List<String> payload,
+ @NotNull GlobalMetricsCoverDatabase.Coordinates coordinates) {
+ super(frequency);
+ this.payload = payload;
+ this.coordinates = coordinates;
+ }
+
+ @NotNull
+ public List<String> getPayload() {
+ return payload;
+ }
+
+ @NotNull
+ public GlobalMetricsCoverDatabase.Coordinates getCoordinates() {
+ return coordinates;
+ }
+}
diff --git a/src/main/java/gregtech/common/events/MetricsCoverHostDeconstructedEvent.java b/src/main/java/gregtech/common/events/MetricsCoverHostDeconstructedEvent.java
new file mode 100644
index 0000000000..490bd7d0b0
--- /dev/null
+++ b/src/main/java/gregtech/common/events/MetricsCoverHostDeconstructedEvent.java
@@ -0,0 +1,16 @@
+package gregtech.common.events;
+
+import java.util.UUID;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Event fired when the machine housing a Metrics Transmitter cover is deconstructed, but the cover remains
+ * attached.
+ */
+public class MetricsCoverHostDeconstructedEvent extends BaseMetricsCoverEvent {
+
+ public MetricsCoverHostDeconstructedEvent(@NotNull UUID frequency) {
+ super(frequency);
+ }
+}
diff --git a/src/main/java/gregtech/common/events/MetricsCoverSelfDestructEvent.java b/src/main/java/gregtech/common/events/MetricsCoverSelfDestructEvent.java
new file mode 100644
index 0000000000..d554cbcc2b
--- /dev/null
+++ b/src/main/java/gregtech/common/events/MetricsCoverSelfDestructEvent.java
@@ -0,0 +1,15 @@
+package gregtech.common.events;
+
+import java.util.UUID;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Event fired when a Metrics Transmitter cover is detached from its machine with a crowbar.
+ */
+public class MetricsCoverSelfDestructEvent extends BaseMetricsCoverEvent {
+
+ public MetricsCoverSelfDestructEvent(@NotNull UUID frequency) {
+ super(frequency);
+ }
+}
diff --git a/src/main/java/gregtech/common/fluid/GT_Fluid.java b/src/main/java/gregtech/common/fluid/GT_Fluid.java
new file mode 100644
index 0000000000..6ba8d7d23a
--- /dev/null
+++ b/src/main/java/gregtech/common/fluid/GT_Fluid.java
@@ -0,0 +1,209 @@
+package gregtech.common.fluid;
+
+import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.FluidState;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.fluid.IGT_Fluid;
+import gregtech.api.interfaces.fluid.IGT_RegisteredFluid;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+
+public class GT_Fluid extends Fluid implements IGT_Fluid, IGT_RegisteredFluid, Runnable {
+
+ private final String localizedName;
+ private final ResourceLocation stillIconResourceLocation;
+ private final ResourceLocation flowingIconResourceLocation;
+ private final short[] colorRGBA;
+ private final FluidState fluidState;
+ private final Fluid iconsFrom;
+ private Fluid registeredFluid;
+
+ /**
+ * Constructs this {@link IGT_Fluid} implementation from an {@link GT_FluidBuilder} instance
+ *
+ * @param builder The {@link GT_FluidBuilder} instance to construct this {@link IGT_Fluid} implementation
+ */
+ protected GT_Fluid(@Nonnull final GT_FluidBuilder builder) {
+ super(builder.fluidName);
+ this.localizedName = builder.localizedName;
+ this.stillIconResourceLocation = builder.stillIconResourceLocation;
+ this.flowingIconResourceLocation = builder.flowingIconResourceLocation;
+ this.iconsFrom = builder.iconsFrom;
+ this.block = builder.fluidBlock;
+ this.colorRGBA = builder.colorRGBA;
+ this.fluidState = builder.fluidState;
+ this.temperature = builder.temperature;
+ configureFromStateTemperature();
+ }
+
+ /**
+ * Adjusts this {@link Fluid}'s settings based on this {@link IGT_Fluid}'s state
+ */
+ protected void configureFromStateTemperature() {
+ switch (fluidState) {
+ case SLURRY:
+ setGaseous(false).setViscosity(10000);
+ break;
+ case GAS:
+ setGaseous(true).setDensity(-100)
+ .setViscosity(200);
+ break;
+ case PLASMA:
+ setGaseous(true).setDensity(55536)
+ .setViscosity(10)
+ .setLuminosity(15);
+ break;
+ case MOLTEN:
+ final int luminosity;
+ if (temperature >= 3500) {
+ luminosity = 15;
+ } else {
+ luminosity = temperature < 1000 ? 0 : 14 * (temperature - 1000) / 2500 + 1;
+ }
+ setLuminosity(luminosity);
+ case LIQUID:
+ default:
+ setGaseous(false).setViscosity(1000);
+ break;
+ }
+ }
+
+ // ----- Fluid implementations -----
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public int getColor() {
+ return (Math.max(0, Math.min(255, colorRGBA[0])) << 16) | (Math.max(0, Math.min(255, colorRGBA[1])) << 8)
+ | Math.max(0, Math.min(255, colorRGBA[2]));
+ }
+
+ // ----- IGT_Fluid interface implementations -----
+
+ public IGT_RegisteredFluid addFluid() {
+ if (FluidRegistry.registerFluid(GT_Fluid.this)) {
+ // Registered as a new Fluid
+ registeredFluid = this;
+ // Adds a server-side localized-name
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName(), localizedName);
+ } else {
+ // Fluid already registered, get it from the registry
+ registeredFluid = FluidRegistry.getFluid(GT_Fluid.this.fluidName);
+ // Sets temperature of already registered fluids if they use the default (temperature = 300)
+ if (registeredFluid.getTemperature() == new Fluid("test").getTemperature()) {
+ registeredFluid.setTemperature(GT_Fluid.this.temperature);
+ }
+ }
+ // Schedules the fluid for the block icons loader run() tasks
+ GregTech_API.sGTBlockIconload.add(this);
+ return this;
+ }
+
+ // ----- IGT_RegisteredFluid interface implementations -----
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_RegisteredFluid registerContainers(final ItemStack fullContainer, final ItemStack emptyContainer,
+ final int containerSize) {
+ if (fullContainer != null && emptyContainer != null) {
+ final FluidStack fluidStack = new FluidStack(registeredFluid, containerSize);
+ if (!FluidContainerRegistry.registerFluidContainer(fluidStack, fullContainer, emptyContainer)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(fullContainer)
+ .itemOutputs(GT_Utility.getContainerItem(fullContainer, false))
+ .fluidOutputs(fluidStack)
+ .duration(fluidStack.amount / 62)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+ }
+ }
+ return this;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_RegisteredFluid registerBContainers(final ItemStack fullContainer, final ItemStack emptyContainer) {
+ return registerContainers(fullContainer, emptyContainer, 1000);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_RegisteredFluid registerPContainers(final ItemStack fullContainer, final ItemStack emptyContainer) {
+ return registerContainers(fullContainer, emptyContainer, 250);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_RegisteredFluid configureMaterials(final Materials material) {
+ if (material != null) {
+ switch (fluidState) {
+ case SLURRY -> material.mSolid = registeredFluid;
+ case GAS -> material.mGas = registeredFluid;
+ case PLASMA -> material.mPlasma = registeredFluid;
+ case MOLTEN -> material.mStandardMoltenFluid = registeredFluid;
+ default -> material.mFluid = registeredFluid;
+ }
+ Materials.FLUID_MAP.put(registeredFluid, material);
+ }
+ return this;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public Fluid asFluid() {
+ return registeredFluid;
+ }
+
+ // ----- Runnable interface implementations -----
+
+ /**
+ * This {@link Runnable#run()} implementation is scheduled within the {@link GregTech_API#sGTBlockIconload} to load
+ * this {@link IGT_Fluid}'s texture icons.
+ *
+ * @see Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (iconsFrom instanceof GT_Fluid) {
+ // Needs the GT_Fluid to have registered its icons
+ ((GT_Fluid) iconsFrom).run();
+ stillIcon = iconsFrom.getStillIcon();
+ flowingIcon = iconsFrom.getFlowingIcon();
+ } else {
+ if (stillIconResourceLocation != null) {
+ stillIcon = GregTech_API.sBlockIcons.registerIcon(stillIconResourceLocation.toString());
+ }
+ if (flowingIconResourceLocation != null) {
+ flowingIcon = GregTech_API.sBlockIcons.registerIcon(flowingIconResourceLocation.toString());
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "GT_Fluid{" + "fluidName='" + fluidName + '\'' + '}';
+ }
+}
diff --git a/src/main/java/gregtech/common/fluid/GT_FluidBuilder.java b/src/main/java/gregtech/common/fluid/GT_FluidBuilder.java
new file mode 100644
index 0000000000..9a18b8d812
--- /dev/null
+++ b/src/main/java/gregtech/common/fluid/GT_FluidBuilder.java
@@ -0,0 +1,146 @@
+package gregtech.common.fluid;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.Locale;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fluids.Fluid;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.FluidState;
+import gregtech.api.interfaces.fluid.IGT_Fluid;
+import gregtech.api.interfaces.fluid.IGT_FluidBuilder;
+import gregtech.api.interfaces.fluid.IGT_RegisteredFluid;
+
+public class GT_FluidBuilder implements IGT_FluidBuilder {
+
+ final String fluidName;
+ String localizedName;
+ ResourceLocation stillIconResourceLocation = null, flowingIconResourceLocation = null;
+ short[] colorRGBA = Dyes._NULL.getRGBA();
+ Block fluidBlock = null;
+ FluidState fluidState;
+ int temperature;
+ IIcon stillIcon;
+ IIcon flowingIcon;
+ Fluid iconsFrom;
+
+ public GT_FluidBuilder(final String fluidName) {
+ this.fluidName = fluidName.toLowerCase(Locale.ENGLISH);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_FluidBuilder withColorRGBA(final short[] colorRGBA) {
+ this.colorRGBA = colorRGBA;
+ return this;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_FluidBuilder withLocalizedName(final String localizedName) {
+ this.localizedName = localizedName;
+ return this;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_FluidBuilder withStateAndTemperature(final FluidState fluidState, final int temperature) {
+ this.fluidState = fluidState;
+ this.temperature = temperature;
+ return this;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_FluidBuilder withStillIconResourceLocation(final ResourceLocation stillIconResourceLocation) {
+ this.stillIconResourceLocation = stillIconResourceLocation;
+ return this;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_FluidBuilder withFlowingIconResourceLocation(final ResourceLocation flowingIconResourceLocation) {
+ this.flowingIconResourceLocation = flowingIconResourceLocation;
+ return this;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_FluidBuilder withTextureName(final String textureName) {
+ this.stillIconResourceLocation = new ResourceLocation(GregTech.ID, "fluids/fluid." + textureName);
+ this.flowingIconResourceLocation = null;
+ return this;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_FluidBuilder withIconsFrom(@Nonnull final Fluid fromFluid) {
+ this.iconsFrom = fromFluid;
+ return this;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_FluidBuilder withFluidBlock(final Block fluidBlock) {
+ this.fluidBlock = fluidBlock;
+ return this;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_FluidBuilder withTextures(final ResourceLocation stillIconResourceLocation,
+ final ResourceLocation flowingIconResourceLocation) {
+ this.stillIconResourceLocation = stillIconResourceLocation;
+ this.flowingIconResourceLocation = flowingIconResourceLocation;
+ return this;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_Fluid build() {
+ if (colorRGBA == null) {
+ colorRGBA = Dyes._NULL.getRGBA();
+ }
+ if (stillIconResourceLocation == null) {
+ withTextureName(fluidName.toLowerCase(Locale.ENGLISH));
+ }
+ if (localizedName == null) {
+ localizedName = fluidName;
+ }
+ return new GT_Fluid(this);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public IGT_RegisteredFluid buildAndRegister() {
+ return build().addFluid();
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/ComplexParallelMachineGUIProvider.java b/src/main/java/gregtech/common/gui/ComplexParallelMachineGUIProvider.java
new file mode 100644
index 0000000000..89b42c8500
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/ComplexParallelMachineGUIProvider.java
@@ -0,0 +1,32 @@
+package gregtech.common.gui;
+
+import javax.annotation.Nonnull;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.api.gui.GUIHost;
+import gregtech.api.logic.ComplexParallelProcessingLogic;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.logic.interfaces.ProcessingLogicHost;
+
+/**
+ * Default GUI class for machines with complex parallel
+ */
+public class ComplexParallelMachineGUIProvider<T extends GUIHost & ProcessingLogicHost<? extends ComplexParallelProcessingLogic<?>> & PowerLogicHost>
+ extends MachineGUIProvider<T> {
+
+ public ComplexParallelMachineGUIProvider(@Nonnull T host) {
+ super(host);
+ }
+
+ @Override
+ protected void attachSynchHandlers(@Nonnull Builder builder, @Nonnull UIBuildContext uiContext) {
+
+ }
+
+ @Override
+ protected void addWidgets(@Nonnull Builder builder, @Nonnull UIBuildContext uiContext) {
+
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/MachineGUIProvider.java b/src/main/java/gregtech/common/gui/MachineGUIProvider.java
new file mode 100644
index 0000000000..3cc889f000
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/MachineGUIProvider.java
@@ -0,0 +1,510 @@
+package gregtech.common.gui;
+
+import static gregtech.api.metatileentity.BaseTileEntity.BUTTON_FORBIDDEN_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.util.StatCollector;
+
+import com.gtnewhorizons.modularui.api.ModularUITextures;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import com.gtnewhorizons.modularui.common.widget.TabButton;
+import com.gtnewhorizons.modularui.common.widget.TabContainer;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.enums.InventoryType;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.gui.GUIHost;
+import gregtech.api.gui.GUIProvider;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.logic.MuTEProcessingLogic;
+import gregtech.api.logic.PowerLogic;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.logic.interfaces.ProcessingLogicHost;
+
+/**
+ * Default GUI a machine will use to show its information
+ */
+public class MachineGUIProvider<T extends GUIHost & ProcessingLogicHost<? extends MuTEProcessingLogic<?>> & PowerLogicHost>
+ extends GUIProvider<T> {
+
+ private static final int LOGO_SIZE = 17;
+ @Nonnull
+ protected static final Pos2d POWER_SWITCH_BUTTON_DEFAULT_POS = new Pos2d(144, 0);
+ @Nonnull
+ protected static final Pos2d VOIDING_MODE_BUTTON_DEFAULT_POS = new Pos2d(54, 0);
+ @Nonnull
+ protected static final Pos2d INPUT_SEPARATION_BUTTON_DEFAULT_POS = new Pos2d(36, 0);
+ @Nonnull
+ protected static final Pos2d BATCH_MODE_BUTTON_DEFAULT_POS = new Pos2d(18, 0);
+ @Nonnull
+ protected static final Pos2d RECIPE_LOCKING_BUTTON_DEFAULT_POS = new Pos2d(0, 0);
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ public MachineGUIProvider(@Nonnull T host) {
+ super(host);
+ }
+
+ @Override
+ protected void attachSynchHandlers(@Nonnull Builder builder, @Nonnull UIBuildContext uiContext) {
+
+ }
+
+ @Override
+ protected void addWidgets(@Nonnull Builder builder, @Nonnull UIBuildContext uiContext) {
+ int page = 0;
+ builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
+ MultiChildWidget mainTab = new MultiChildWidget();
+ mainTab.setSize(host.getWidth(), host.getHeight());
+ createMainTab(mainTab, builder, uiContext);
+ TabContainer tabs = new TabContainer().setButtonSize(20, 24);
+ tabs.addTabButton(
+ new TabButton(page++)
+ .setBackground(
+ false,
+ ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f),
+ new ItemDrawable(host.getAsItem()).withFixedSize(16, 16)
+ .withOffset(2, 4))
+ .setBackground(
+ true,
+ ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f),
+ new ItemDrawable(host.getAsItem()).withFixedSize(16, 16)
+ .withOffset(2, 4))
+ .addTooltip(host.getMachineName())
+ .setPos(20 * (page - 1), -20))
+ .addPage(mainTab);
+ if (host.hasItemInput()) {
+ MultiChildWidget itemInputTab = new MultiChildWidget();
+ itemInputTab.setSize(host.getWidth(), host.getHeight());
+ createItemInputTab(itemInputTab, builder, uiContext);
+ tabs.addTabButton(
+ new TabButton(page++)
+ .setBackground(
+ false,
+ ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0, 1f, 0.5f),
+ GT_UITextures.PICTURE_ITEM_IN.withFixedSize(16, 16)
+ .withOffset(2, 4))
+ .setBackground(
+ true,
+ ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0.5f, 1f, 1f),
+ GT_UITextures.PICTURE_ITEM_IN.withFixedSize(16, 16)
+ .withOffset(2, 4))
+ .addTooltip("Item Input Inventory")
+ .setPos(20 * (page - 1), -20))
+ .addPage(itemInputTab.addChild(getLogo().setPos(147, 86)));
+ }
+
+ if (host.hasItemOutput()) {
+ MultiChildWidget itemOutputTab = new MultiChildWidget();
+ itemOutputTab.setSize(host.getWidth(), host.getHeight());
+ createItemOutputTab(itemOutputTab, builder, uiContext);
+ tabs.addTabButton(
+ new TabButton(page++)
+ .setBackground(
+ false,
+ ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0, 1f, 0.5f),
+ GT_UITextures.PICTURE_ITEM_OUT.withFixedSize(16, 16)
+ .withOffset(2, 4))
+ .setBackground(
+ true,
+ ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0.5f, 1f, 1f),
+ GT_UITextures.PICTURE_ITEM_OUT.withFixedSize(16, 16)
+ .withOffset(2, 4))
+ .addTooltip("Item Output Inventory")
+ .setPos(20 * (page - 1), -20))
+ .addPage(itemOutputTab.addChild(getLogo().setPos(147, 86)));
+ }
+
+ if (host.hasFluidInput()) {
+ MultiChildWidget fluidInputTab = new MultiChildWidget();
+ fluidInputTab.setSize(host.getWidth(), host.getHeight());
+ createFluidInputTab(fluidInputTab, builder, uiContext);
+ tabs.addTabButton(
+ new TabButton(page++)
+ .setBackground(
+ false,
+ ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0, 1f, 0.5f),
+ GT_UITextures.PICTURE_FLUID_IN.withFixedSize(16, 16)
+ .withOffset(2, 4))
+ .setBackground(
+ true,
+ ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0.5f, 1f, 1f),
+ GT_UITextures.PICTURE_FLUID_IN.withFixedSize(16, 16)
+ .withOffset(2, 4))
+ .addTooltip("Fluid Input Tanks")
+ .setPos(20 * (page - 1), -20))
+ .addPage(fluidInputTab.addChild(getLogo().setPos(147, 86)));
+ }
+
+ if (host.hasFluidOutput()) {
+ MultiChildWidget fluidOutputTab = new MultiChildWidget();
+ fluidOutputTab.setSize(host.getWidth(), host.getHeight());
+ createFluidOutputTab(fluidOutputTab, builder, uiContext);
+ tabs.addTabButton(
+ new TabButton(page++)
+ .setBackground(
+ false,
+ ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0, 1f, 0.5f),
+ GT_UITextures.PICTURE_FLUID_OUT.withFixedSize(16, 16)
+ .withOffset(2, 4))
+ .setBackground(
+ true,
+ ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0.5f, 1f, 1f),
+ GT_UITextures.PICTURE_FLUID_OUT.withFixedSize(16, 16)
+ .withOffset(2, 4))
+ .addTooltip("Fluid Output Tanks")
+ .setPos(20 * (page - 1), -20))
+ .addPage(fluidOutputTab.addChild(getLogo().setPos(147, 86)));
+ }
+ MultiChildWidget powerInfoTab = new MultiChildWidget();
+ powerInfoTab.setSize(host.getWidth(), host.getHeight());
+ createPowerTab(powerInfoTab, builder, uiContext);
+ tabs.addTabButton(
+ new TabButton(page++)
+ .setBackground(
+ false,
+ ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0, 1f, 0.5f),
+ GT_UITextures.PICTURE_FLUID_OUT.withFixedSize(16, 16)
+ .withOffset(2, 4))
+ .setBackground(
+ true,
+ ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0.5f, 1f, 1f),
+ GT_UITextures.PICTURE_FLUID_OUT.withFixedSize(16, 16)
+ .withOffset(2, 4))
+ .addTooltip("Power Information")
+ .setPos(20 * (page - 1), -20))
+ .addPage(powerInfoTab.addChild(getLogo().setPos(147, 86)));
+ builder.widget(tabs);
+ }
+
+ protected void createMainTab(@Nonnull MultiChildWidget tab, @Nonnull Builder builder,
+ @Nonnull UIBuildContext uiBuildContext) {
+ MultiChildWidget buttons = new MultiChildWidget();
+ buttons.setSize(16, 167)
+ .setPos(7, 86);
+ buttons.addChild(createPowerSwitchButton(builder))
+ .addChild(createVoidExcessButton(builder))
+ .addChild(createInputSeparationButton(builder))
+ .addChild(createBatchModeButton(builder))
+ .addChild(createLockToSingleRecipeButton(builder));
+ tab.addChild(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(7, 4)
+ .setSize(160, 75))
+ .addChild(buttons);
+ }
+
+ protected void createItemInputTab(@Nonnull MultiChildWidget tab, @Nonnull Builder builder,
+ @Nonnull UIBuildContext uiBuildContext) {
+ tab.addChild(
+ host.getItemLogic(InventoryType.Input, null)
+ .getGuiPart()
+ .setSize(18 * 4 + 9, 5 * 18)
+ .setPos(host.getWidth() / 2 - 2 * 18, 10));
+ }
+
+ protected void createItemOutputTab(@Nonnull MultiChildWidget tab, @Nonnull Builder builder,
+ @Nonnull UIBuildContext uiBuildContext) {
+ tab.addChild(
+ host.getItemLogic(InventoryType.Output, null)
+ .getGuiPart()
+ .setSize(18 * 4 + 9, 5 * 18)
+ .setPos(host.getWidth() / 2 - 2 * 18, 10));
+ }
+
+ protected void createFluidInputTab(@Nonnull MultiChildWidget tab, @Nonnull Builder builder,
+ @Nonnull UIBuildContext uiBuildContext) {
+ tab.addChild(
+ host.getFluidLogic(InventoryType.Input, null)
+ .getGuiPart()
+ .setSize(18 * 4 + 9, 5 * 18)
+ .setPos(host.getWidth() / 2 - 2 * 18, 10));
+ }
+
+ protected void createFluidOutputTab(@Nonnull MultiChildWidget tab, @Nonnull Builder builder,
+ @Nonnull UIBuildContext uiBuildContext) {
+ tab.addChild(
+ host.getFluidLogic(InventoryType.Output, null)
+ .getGuiPart()
+ .setSize(18 * 4 + 9, 5 * 18)
+ .setPos(host.getWidth() / 2 - 2 * 18, 10));
+ }
+
+ protected void createPowerTab(@Nonnull MultiChildWidget tab, @Nonnull Builder builder,
+ @Nonnull UIBuildContext uiBuildContext) {
+ PowerLogic power = host.getPowerLogic();
+ tab.addChild(
+ new TextWidget()
+ .setStringSupplier(
+ () -> numberFormat.format(power.getStoredEnergy()) + "/"
+ + numberFormat.format(power.getCapacity())
+ + " EU")
+ .setPos(10, 30))
+ .addChild(
+ new TextWidget()
+ .setStringSupplier(
+ () -> numberFormat.format(power.getVoltage()) + " EU/t"
+ + "("
+ + numberFormat.format(power.getMaxAmperage())
+ + " A)")
+ .setPos(10, 60));
+ }
+
+ /**
+ * Should return the logo you want to use that is pasted on each tab. Default is the GT logo.
+ */
+ @Nonnull
+ protected Widget getLogo() {
+ DrawableWidget logo = new DrawableWidget();
+ logo.setDrawable(GUITextureSet.DEFAULT.getGregTechLogo())
+ .setSize(LOGO_SIZE, LOGO_SIZE);
+ return logo;
+ }
+
+ protected Pos2d getPowerSwitchButtonPos() {
+ return POWER_SWITCH_BUTTON_DEFAULT_POS;
+ }
+
+ protected ButtonWidget createPowerSwitchButton(IWidgetBuilder<?> builder) {
+ ButtonWidget button = new ButtonWidget();
+ button.setOnClick((clickData, widget) -> {
+ if (host.isAllowedToWork()) {
+ host.disableWorking();
+ } else {
+ host.enableWorking();
+ }
+ })
+ .setPlayClickSoundResource(
+ () -> host.isAllowedToWork() ? SoundResource.GUI_BUTTON_UP.resourceLocation
+ : SoundResource.GUI_BUTTON_DOWN.resourceLocation)
+ .setBackground(() -> {
+ if (host.isAllowedToWork()) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED,
+ GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON };
+ } else {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD,
+ GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF };
+ }
+ })
+ .attachSyncer(new FakeSyncWidget.BooleanSyncer(host::isAllowedToWork, host::setAllowedToWork), builder)
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.power_switch"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(getPowerSwitchButtonPos())
+ .setSize(16, 16);
+ return button;
+ }
+
+ @Nonnull
+ protected Pos2d getVoidingModeButtonPos() {
+ return VOIDING_MODE_BUTTON_DEFAULT_POS;
+ }
+
+ @Nonnull
+ protected ButtonWidget createVoidExcessButton(IWidgetBuilder<?> builder) {
+ ButtonWidget button = new ButtonWidget();
+ button.setOnClick((clickData, widget) -> {
+ if (host.supportsVoidProtection()) {
+ Set<VoidingMode> allowed = host.getAllowedVoidingModes();
+ switch (clickData.mouseButton) {
+ case 0 -> host.setVoidingMode(
+ host.getVoidingMode()
+ .nextInCollection(allowed));
+ case 1 -> host.setVoidingMode(
+ host.getVoidingMode()
+ .previousInCollection(allowed));
+ }
+ widget.notifyTooltipChange();
+ }
+ })
+ .setPlayClickSound(host.supportsVoidProtection())
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(host.getVoidingMode().buttonTexture);
+ ret.add(host.getVoidingMode().buttonOverlay);
+ if (!host.supportsVoidProtection()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN);
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(
+ () -> host.getVoidingMode()
+ .ordinal(),
+ val -> host.setVoidingMode(VoidingMode.fromOrdinal(val))),
+ builder)
+ .dynamicTooltip(
+ () -> Arrays.asList(
+ StatCollector.translateToLocal("GT5U.gui.button.voiding_mode"),
+ StatCollector.translateToLocal(
+ host.getVoidingMode()
+ .getTransKey())))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(getVoidingModeButtonPos())
+ .setSize(16, 16);
+ if (!host.supportsVoidProtection()) {
+ button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP));
+ }
+ return button;
+ }
+
+ @Nonnull
+ protected Pos2d getInputSeparationButtonPos() {
+ return INPUT_SEPARATION_BUTTON_DEFAULT_POS;
+ }
+
+ protected ButtonWidget createInputSeparationButton(IWidgetBuilder<?> builder) {
+ ButtonWidget button = new ButtonWidget();
+ button.setOnClick((clickData, widget) -> {
+ if (host.supportsInputSeparation()) {
+ host.setInputSeparation(!host.isInputSeparated());
+ }
+ })
+ .setPlayClickSound(host.supportsInputSeparation())
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ if (host.isInputSeparated()) {
+ ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED);
+ if (host.supportsInputSeparation()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_ON_DISABLED);
+ }
+ } else {
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (host.supportsInputSeparation()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_INPUT_SEPARATION_OFF_DISABLED);
+ }
+ }
+ if (!host.supportsInputSeparation()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN);
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .attachSyncer(new FakeSyncWidget.BooleanSyncer(host::isInputSeparated, host::setInputSeparation), builder)
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.input_separation"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(getInputSeparationButtonPos())
+ .setSize(16, 16);
+ if (!host.supportsInputSeparation()) {
+ button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP));
+ }
+ return button;
+ }
+
+ @Nonnull
+ protected Pos2d getBatchModeButtonPos() {
+ return BATCH_MODE_BUTTON_DEFAULT_POS;
+ }
+
+ protected ButtonWidget createBatchModeButton(IWidgetBuilder<?> builder) {
+ ButtonWidget button = new ButtonWidget();
+ button.setOnClick((clickData, widget) -> {
+ if (host.supportsBatchMode()) {
+ host.setBatchMode(!host.isBatchModeEnabled());
+ }
+ })
+ .setPlayClickSound(host.supportsBatchMode())
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ if (host.isBatchModeEnabled()) {
+ ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED);
+ if (host.supportsBatchMode()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_ON_DISABLED);
+ }
+ } else {
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (host.supportsBatchMode()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_OFF);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_BATCH_MODE_OFF_DISABLED);
+ }
+ }
+ if (!host.supportsBatchMode()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN);
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .attachSyncer(new FakeSyncWidget.BooleanSyncer(host::isBatchModeEnabled, host::setBatchMode), builder)
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.batch_mode"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(getBatchModeButtonPos())
+ .setSize(16, 16);
+ if (!host.supportsBatchMode()) {
+ button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP));
+ }
+ return button;
+ }
+
+ @Nonnull
+ protected Pos2d getRecipeLockingButtonPos() {
+ return RECIPE_LOCKING_BUTTON_DEFAULT_POS;
+ }
+
+ protected ButtonWidget createLockToSingleRecipeButton(IWidgetBuilder<?> builder) {
+ ButtonWidget button = new ButtonWidget();
+ button.setOnClick((clickData, widget) -> {
+ if (host.supportsSingleRecipeLocking()) {
+ host.setRecipeLocking(!host.isRecipeLockingEnabled());
+ }
+ })
+ .setPlayClickSound(host.supportsSingleRecipeLocking())
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ if (host.isRecipeLockingEnabled()) {
+ ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED);
+ if (host.supportsSingleRecipeLocking()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_LOCKED);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_LOCKED_DISABLED);
+ }
+ } else {
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (host.supportsSingleRecipeLocking()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED_DISABLED);
+ }
+ }
+ if (!host.supportsSingleRecipeLocking()) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_FORBIDDEN);
+ }
+ return ret.toArray(new IDrawable[0]);
+ })
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(host::isRecipeLockingEnabled, host::setRecipeLocking),
+ builder)
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.lock_recipe"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(getRecipeLockingButtonPos())
+ .setSize(16, 16);
+ if (!host.supportsSingleRecipeLocking()) {
+ button.addTooltip(StatCollector.translateToLocal(BUTTON_FORBIDDEN_TOOLTIP));
+ }
+ return button;
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/PartGUIProvider.java b/src/main/java/gregtech/common/gui/PartGUIProvider.java
new file mode 100644
index 0000000000..7600444f71
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/PartGUIProvider.java
@@ -0,0 +1,33 @@
+package gregtech.common.gui;
+
+import javax.annotation.Nonnull;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+
+import gregtech.api.gui.GUIHost;
+import gregtech.api.gui.GUIProvider;
+import gregtech.api.logic.interfaces.FluidInventoryLogicHost;
+import gregtech.api.logic.interfaces.ItemInventoryLogicHost;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+
+public class PartGUIProvider<T extends GUIHost & ItemInventoryLogicHost & PowerLogicHost & FluidInventoryLogicHost>
+ extends GUIProvider<T> {
+
+ public PartGUIProvider(@Nonnull T host) {
+ super(host);
+ }
+
+ @Override
+ protected void attachSynchHandlers(@Nonnull Builder builder, @Nonnull UIBuildContext uiContext) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException("Unimplemented method 'attachSynchHandlers'");
+ }
+
+ @Override
+ protected void addWidgets(@Nonnull Builder builder, @Nonnull UIBuildContext uiContext) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException("Unimplemented method 'addWidgets'");
+ }
+
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/UIHelper.java b/src/main/java/gregtech/common/gui/modularui/UIHelper.java
new file mode 100644
index 0000000000..64d686d350
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/UIHelper.java
@@ -0,0 +1,200 @@
+package gregtech.common.gui.modularui;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.gui.modularui.SteamTexture;
+import gregtech.api.recipe.BasicUIProperties;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class UIHelper {
+
+ /**
+ * Iterates over candidates for slot placement.
+ */
+ @SuppressWarnings("SimplifyStreamApiCallChains")
+ public static void forEachSlots(ForEachSlot forEachItemInputSlot, ForEachSlot forEachItemOutputSlot,
+ ForEachSlot forEachSpecialSlot, ForEachSlot forEachFluidInputSlot, ForEachSlot forEachFluidOutputSlot,
+ IDrawable itemSlotBackground, IDrawable fluidSlotBackground, BasicUIProperties uiProperties, int itemInputCount,
+ int itemOutputCount, int fluidInputCount, int fluidOutputCount, SteamVariant steamVariant, Pos2d offset) {
+ List<Pos2d> itemInputPositions = uiProperties.itemInputPositionsGetter.apply(itemInputCount)
+ .stream()
+ .map(p -> p.add(offset))
+ .collect(Collectors.toList());
+ for (int i = 0; i < itemInputPositions.size(); i++) {
+ forEachItemInputSlot.accept(
+ i,
+ getBackgroundsForSlot(itemSlotBackground, uiProperties, false, false, i, false, steamVariant),
+ itemInputPositions.get(i));
+ }
+
+ List<Pos2d> itemOutputPositions = uiProperties.itemOutputPositionsGetter.apply(itemOutputCount)
+ .stream()
+ .map(p -> p.add(offset))
+ .collect(Collectors.toList());
+ for (int i = 0; i < itemOutputPositions.size(); i++) {
+ forEachItemOutputSlot.accept(
+ i,
+ getBackgroundsForSlot(itemSlotBackground, uiProperties, false, true, i, false, steamVariant),
+ itemOutputPositions.get(i));
+ }
+
+ forEachSpecialSlot.accept(
+ 0,
+ getBackgroundsForSlot(itemSlotBackground, uiProperties, false, false, 0, true, steamVariant),
+ uiProperties.specialItemPositionGetter.get()
+ .add(offset));
+
+ List<Pos2d> fluidInputPositions = uiProperties.fluidInputPositionsGetter.apply(fluidInputCount)
+ .stream()
+ .map(p -> p.add(offset))
+ .collect(Collectors.toList());
+ for (int i = 0; i < fluidInputPositions.size(); i++) {
+ forEachFluidInputSlot.accept(
+ i,
+ getBackgroundsForSlot(fluidSlotBackground, uiProperties, true, false, i, false, steamVariant),
+ fluidInputPositions.get(i));
+ }
+
+ List<Pos2d> fluidOutputPositions = uiProperties.fluidOutputPositionsGetter.apply(fluidOutputCount)
+ .stream()
+ .map(p -> p.add(offset))
+ .collect(Collectors.toList());
+ for (int i = 0; i < fluidOutputPositions.size(); i++) {
+ forEachFluidOutputSlot.accept(
+ i,
+ getBackgroundsForSlot(fluidSlotBackground, uiProperties, true, true, i, false, steamVariant),
+ fluidOutputPositions.get(i));
+ }
+ }
+
+ /**
+ * @return Display positions for GUI, including border (18x18 size)
+ */
+ public static List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return switch (itemInputCount) {
+ case 0 -> Collections.emptyList();
+ case 1 -> getGridPositions(itemInputCount, 52, 24, 1, 1);
+ case 2 -> getGridPositions(itemInputCount, 34, 24, 2, 1);
+ case 3 -> getGridPositions(itemInputCount, 16, 24, 3, 1);
+ case 4 -> getGridPositions(itemInputCount, 34, 15, 2, 2);
+ case 5, 6 -> getGridPositions(itemInputCount, 16, 15, 3, 2);
+ default -> getGridPositions(itemInputCount, 16, 6, 3);
+ };
+ }
+
+ /**
+ * @return Display positions for GUI, including border (18x18 size)
+ */
+ public static List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return switch (itemOutputCount) {
+ case 0 -> Collections.emptyList();
+ case 1 -> getGridPositions(itemOutputCount, 106, 24, 1, 1);
+ case 2 -> getGridPositions(itemOutputCount, 106, 24, 2, 1);
+ case 3 -> getGridPositions(itemOutputCount, 106, 24, 3, 1);
+ case 4 -> getGridPositions(itemOutputCount, 106, 15, 2, 2);
+ case 5, 6 -> getGridPositions(itemOutputCount, 106, 15, 3, 2);
+ default -> getGridPositions(itemOutputCount, 106, 6, 3);
+ };
+ }
+
+ /**
+ * @return Display position for GUI, including border (18x18 size)
+ */
+ public static Pos2d getSpecialItemPosition() {
+ return new Pos2d(124, 62);
+ }
+
+ /**
+ * @return Display positions for GUI, including border (18x18 size)
+ */
+ public static List<Pos2d> getFluidInputPositions(int fluidInputCount) {
+ List<Pos2d> results = new ArrayList<>();
+ int x = 52;
+ for (int i = 0; i < fluidInputCount; i++) {
+ results.add(new Pos2d(x, 62));
+ x -= 18;
+ }
+ return results;
+ }
+
+ /**
+ * @return Display positions for GUI, including border (18x18 size)
+ */
+ public static List<Pos2d> getFluidOutputPositions(int fluidOutputCount) {
+ List<Pos2d> results = new ArrayList<>();
+ int x = 106;
+ for (int i = 0; i < fluidOutputCount; i++) {
+ results.add(new Pos2d(x, 62));
+ x += 18;
+ }
+ return results;
+ }
+
+ public static List<Pos2d> getGridPositions(int totalCount, int xOrigin, int yOrigin, int xDirMaxCount,
+ int yDirMaxCount) {
+ // 18 pixels to get to a new grid for placing an item tile since they are 16x16 and have 1 pixel buffers
+ // around them.
+ int distance = 18;
+
+ List<Pos2d> results = new ArrayList<>();
+ int count = 0;
+ loop: for (int j = 0; j < yDirMaxCount; j++) {
+ for (int i = 0; i < xDirMaxCount; i++) {
+ if (count >= totalCount) break loop;
+ results.add(new Pos2d(xOrigin + i * distance, yOrigin + j * distance));
+ count++;
+ }
+ }
+ return results;
+ }
+
+ public static List<Pos2d> getGridPositions(int totalCount, int xOrigin, int yOrigin, int xDirMaxCount) {
+ return getGridPositions(totalCount, xOrigin, yOrigin, xDirMaxCount, 100);
+ }
+
+ private static IDrawable[] getBackgroundsForSlot(IDrawable base, BasicUIProperties uiProperties, boolean isFluid,
+ boolean isOutput, int index, boolean isSpecial, SteamVariant steamVariant) {
+ IDrawable overlay = getOverlay(uiProperties, isFluid, isOutput, index, isSpecial, steamVariant);
+ if (overlay != null) {
+ return new IDrawable[] { base, overlay };
+ } else {
+ return new IDrawable[] { base };
+ }
+ }
+
+ @Nullable
+ private static IDrawable getOverlay(BasicUIProperties uiProperties, boolean isFluid, boolean isOutput, int index,
+ boolean isSpecial, SteamVariant steamVariant) {
+ if (isSpecial && !uiProperties.useSpecialSlot) {
+ return null;
+ }
+ if (steamVariant != SteamVariant.NONE) {
+ SteamTexture steamTexture = uiProperties.getOverlayForSlotSteam(index, isFluid, isOutput, isSpecial);
+ if (steamTexture != null) {
+ return steamTexture.get(steamVariant);
+ } else {
+ return null;
+ }
+ } else {
+ return uiProperties.getOverlayForSlot(index, isFluid, isOutput, isSpecial);
+ }
+ }
+
+ @FunctionalInterface
+ public interface ForEachSlot {
+
+ void accept(int index, IDrawable[] backgrounds, Pos2d pos);
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/uifactory/SelectItemUIFactory.java b/src/main/java/gregtech/common/gui/modularui/uifactory/SelectItemUIFactory.java
new file mode 100644
index 0000000000..452ca36c0c
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/uifactory/SelectItemUIFactory.java
@@ -0,0 +1,229 @@
+package gregtech.common.gui.modularui.uifactory;
+
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+
+import com.gtnewhorizons.modularui.api.GlStateManager;
+import com.gtnewhorizons.modularui.api.ModularUITextures;
+import com.gtnewhorizons.modularui.api.drawable.GuiHelper;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
+import com.gtnewhorizons.modularui.api.drawable.Text;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.gui.GT_GUIColorOverride;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.util.GT_Util;
+import gregtech.api.util.GT_Utility;
+
+/**
+ * Creates UI for selecting item from given list. This is client-only UI to allow using client-preferred settings.
+ */
+public class SelectItemUIFactory {
+
+ private final String header;
+ private final ItemStack headerItem;
+ public static final int UNSELECTED = -1;
+ private static final int cols = 9;
+ private final Consumer<ItemStack> selectedCallback;
+ // passed in stack
+ private final List<ItemStack> stacks;
+ private final boolean noDeselect;
+ private int selected;
+ private boolean anotherWindow = false;
+ private AtomicBoolean dialogOpened;
+ private int guiTint = GT_Util.getRGBInt(Dyes.MACHINE_METAL.getRGBA());
+ private Supplier<ItemStack> currentGetter;
+
+ private final GT_GUIColorOverride colorOverride = GT_GUIColorOverride.get("SelectItemUIFactory");
+
+ private int getTextColorOrDefault(String textType, int defaultColor) {
+ return colorOverride.getTextColorOrDefault(textType, defaultColor);
+ }
+
+ private final Supplier<Integer> COLOR_TITLE = () -> getTextColorOrDefault("title", 0x222222);
+ private final Supplier<Integer> COLOR_TEXT_GRAY = () -> getTextColorOrDefault("text_gray", 0x555555);
+
+ public SelectItemUIFactory(String header, ItemStack headerItem, Consumer<ItemStack> selectedCallback,
+ List<ItemStack> stacks) {
+ this(header, headerItem, selectedCallback, stacks, UNSELECTED);
+ }
+
+ public SelectItemUIFactory(String header, ItemStack headerItem, Consumer<ItemStack> selectedCallback,
+ List<ItemStack> stacks, int selected) {
+ this(header, headerItem, selectedCallback, stacks, selected, false);
+ }
+
+ /**
+ * Constructor for a dialog to select an item from given list. Given callback may be called zero or more times
+ * depending on user action.
+ *
+ * @param header Header text
+ * @param headerItem ItemStack to use as Dialog icon
+ * @param selectedCallback callback upon selected
+ * @param stacks list to choose from
+ * @param selected preselected item. Use {@link #UNSELECTED} for unselected. Invalid selected will be
+ * clamped to 0 or highest index
+ * @param noDeselect true if player cannot deselect, false otherwise. If this is set to true, selectedCallback
+ * is guaranteed to be called with a nonnull stack
+ */
+ public SelectItemUIFactory(String header, ItemStack headerItem, Consumer<ItemStack> selectedCallback,
+ List<ItemStack> stacks, int selected, boolean noDeselect) {
+ this.header = header;
+ this.headerItem = headerItem;
+ this.selectedCallback = selectedCallback;
+ this.stacks = stacks;
+ this.noDeselect = noDeselect;
+ this.selected = noDeselect ? Math.max(0, selected) : selected;
+ }
+
+ /**
+ * @param anotherWindow If UI is shown on top of another window
+ * @param dialogOpened Flag to store whether this UI is opened and hence it should block duplicated creation of
+ * this UI
+ */
+ public SelectItemUIFactory setAnotherWindow(boolean anotherWindow, AtomicBoolean dialogOpened) {
+ this.anotherWindow = anotherWindow;
+ this.dialogOpened = dialogOpened;
+ return this;
+ }
+
+ public SelectItemUIFactory setGuiTint(int guiTint) {
+ this.guiTint = guiTint;
+ return this;
+ }
+
+ /**
+ * @param currentGetter Getter for "current" item displayed that may change from external reasons
+ */
+ public SelectItemUIFactory setCurrentGetter(Supplier<ItemStack> currentGetter) {
+ this.currentGetter = currentGetter;
+ return this;
+ }
+
+ public ModularWindow createWindow(UIBuildContext buildContext) {
+ ModularWindow.Builder builder = ModularWindow
+ .builder(getGUIWidth(), 53 + 18 * ((stacks.size() - 1) / cols + 1));
+ builder.setBackground(ModularUITextures.VANILLA_BACKGROUND);
+ builder.setGuiTint(guiTint);
+
+ if (headerItem != null) {
+ builder.widget(
+ new ItemDrawable(headerItem).asWidget()
+ .setPos(5, 5)
+ .setSize(16, 16));
+ }
+ builder.widget(
+ new TextWidget(header).setDefaultColor(COLOR_TITLE.get())
+ .setPos(25, 9));
+
+ int currentSlotX = 9
+ + getFontRenderer().getStringWidth(StatCollector.translateToLocal("GT5U.gui.select.current"));
+ int currentSlotY = 24;
+ builder.widget(new DrawableWidget() {
+
+ @Override
+ public void onScreenUpdate() {
+ super.onScreenUpdate();
+ if (currentGetter != null) {
+ ItemStack current = currentGetter.get();
+ selected = GT_Utility.findMatchingStackInList(stacks, current);
+ }
+ }
+ }.setDrawable(GT_UITextures.SLOT_DARK_GRAY)
+ .setPos(currentSlotX, currentSlotY)
+ .setSize(18, 18))
+ .widget(
+ new ItemDrawable(() -> getCandidate(getSelected())).asWidgetWithTooltip()
+ .setPos(currentSlotX + 1, currentSlotY + 1));
+ builder.widget(
+ new TextWidget(StatCollector.translateToLocal("GT5U.gui.select.current"))
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(8, 25 + (18 - getFontRenderer().FONT_HEIGHT) / 2));
+
+ for (int i = 0; i < stacks.size(); i++) {
+ final int index = i;
+ builder.widget(new ButtonWidget() {
+
+ @Override
+ public void draw(float partialTicks) {
+ GlStateManager.pushMatrix();
+ // so that item z levels are properly ordered
+ GlStateManager.translate(0, 0, 150 * getWindowLayer());
+ new ItemDrawable(stacks.get(index)).draw(1, 1, 16, 16, partialTicks);
+ GlStateManager.popMatrix();
+ }
+ }.setOnClick((clickData, widget) -> {
+ if (clickData.mouseButton == 0) {
+ setSelected(index);
+ } else {
+ setSelected(UNSELECTED);
+ }
+ selectedCallback.accept(getCandidate(getSelected()));
+ })
+ .setSynced(false, false)
+ .dynamicTooltip(() -> GuiHelper.getItemTooltip(stacks.get(index)))
+ .setUpdateTooltipEveryTick(true)
+ .setBackground(
+ () -> new IDrawable[] {
+ index == selected ? GT_UITextures.SLOT_DARK_GRAY : ModularUITextures.ITEM_SLOT, })
+ .setPos(7 + 18 * (index % cols), 43 + 18 * (index / cols))
+ .setSize(18, 18));
+ }
+
+ if (anotherWindow) {
+ dialogOpened.set(true);
+ builder.widget(new ButtonWidget() {
+
+ @Override
+ public void onDestroy() {
+ dialogOpened.set(false);
+ }
+ }.setOnClick(
+ (clickData, widget) -> widget.getWindow()
+ .tryClose())
+ .setSynced(false, false)
+ .setBackground(ModularUITextures.VANILLA_BACKGROUND, new Text("x"))
+ .setPos(getGUIWidth() - 15, 3)
+ .setSize(12, 12));
+ }
+
+ return builder.build();
+ }
+
+ public int getSelected() {
+ return selected;
+ }
+
+ public void setSelected(int selected) {
+ if (selected == this.selected) return;
+ int newSelected = GT_Utility.clamp(selected, UNSELECTED, stacks.size() - 1);
+ if (noDeselect && newSelected == UNSELECTED) return;
+
+ this.selected = newSelected;
+ }
+
+ private ItemStack getCandidate(int listIndex) {
+ return listIndex < 0 || listIndex >= stacks.size() ? null : stacks.get(listIndex);
+ }
+
+ private FontRenderer getFontRenderer() {
+ return Minecraft.getMinecraft().fontRenderer;
+ }
+
+ private int getGUIWidth() {
+ return 176;
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/AESlotWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/AESlotWidget.java
new file mode 100644
index 0000000000..368f219ef4
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/AESlotWidget.java
@@ -0,0 +1,64 @@
+package gregtech.common.gui.modularui.widget;
+
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.renderer.entity.RenderItem;
+import net.minecraft.client.renderer.texture.TextureManager;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.internal.wrapper.ModularGui;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import appeng.api.storage.IItemDisplayRegistry.ItemRenderHook;
+import appeng.client.render.AppEngRenderItem;
+import appeng.core.AELog;
+import appeng.util.Platform;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class AESlotWidget extends SlotWidget {
+
+ private static class HookHolder {
+
+ static ItemRenderHook SKIP_ITEM_STACK_SIZE_HOOK = new ItemRenderHook() {
+
+ @Override
+ public boolean renderOverlay(FontRenderer fr, TextureManager tm, ItemStack is, int x, int y) {
+ return true;
+ }
+
+ @Override
+ public boolean showStackSize(ItemStack is) {
+ return false;
+ }
+ };
+ }
+
+ public AESlotWidget(BaseSlot slot) {
+ super(slot);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ protected void drawSlot(Slot slotIn) {
+ final AppEngRenderItem aeRenderItem = new AppEngRenderItem();
+ AppEngRenderItem.POST_HOOKS.add(HookHolder.SKIP_ITEM_STACK_SIZE_HOOK);
+ final RenderItem pIR = this.setItemRender(aeRenderItem);
+ try {
+ aeRenderItem.setAeStack(Platform.getAEStackInSlot(slotIn));
+ super.drawSlot(slotIn, true);
+ } catch (final Exception err) {
+ AELog.warn("[AppEng] AE prevented crash while drawing slot: " + err);
+ }
+ AppEngRenderItem.POST_HOOKS.remove(HookHolder.SKIP_ITEM_STACK_SIZE_HOOK);
+ this.setItemRender(pIR);
+ }
+
+ @SideOnly(Side.CLIENT)
+ private RenderItem setItemRender(final RenderItem item) {
+ final RenderItem ri = ModularGui.getItemRenderer();
+ ModularGui.setItemRenderer(item);
+ return ri;
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CheckRecipeResultSyncer.java b/src/main/java/gregtech/common/gui/modularui/widget/CheckRecipeResultSyncer.java
new file mode 100644
index 0000000000..9028c66be8
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/CheckRecipeResultSyncer.java
@@ -0,0 +1,26 @@
+package gregtech.common.gui.modularui.widget;
+
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+
+public class CheckRecipeResultSyncer extends FakeSyncWidget<CheckRecipeResult> {
+
+ public CheckRecipeResultSyncer(Supplier<CheckRecipeResult> getter, Consumer<CheckRecipeResult> setter) {
+ super(getter, setter, (buffer, result) -> {
+ NetworkUtils.writeStringSafe(buffer, result.getID());
+ result.encode(buffer);
+ }, buffer -> {
+ String id = NetworkUtils.readStringSafe(buffer);
+ CheckRecipeResult result = CheckRecipeResultRegistry.getSampleFromRegistry(id)
+ .newInstance();
+ result.decode(buffer);
+ return result;
+ });
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverCycleButtonWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverCycleButtonWidget.java
new file mode 100644
index 0000000000..4d1c6649ae
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverCycleButtonWidget.java
@@ -0,0 +1,91 @@
+package gregtech.common.gui.modularui.widget;
+
+import org.lwjgl.opengl.GL11;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.gui.modularui.GT_UITextures;
+
+/**
+ * Fires click action on mouse release, not on press. Draws different backgrounds depending on whether the mouse is
+ * being pressed or the widget is hovered.
+ */
+public class CoverCycleButtonWidget extends CycleButtonWidget {
+
+ private static final UITexture BUTTON_NORMAL_NOT_PRESSED = GT_UITextures.BUTTON_COVER_NORMAL
+ .getSubArea(0, 0, 1, 0.5f);
+ private static final UITexture BUTTON_NORMAL_PRESSED = GT_UITextures.BUTTON_COVER_NORMAL.getSubArea(0, 0.5f, 1, 1);
+ private static final UITexture BUTTON_HOVERED_NOT_PRESSED = GT_UITextures.BUTTON_COVER_NORMAL_HOVERED
+ .getSubArea(0, 0, 1, 0.5f);
+ private static final UITexture BUTTON_HOVERED_PRESSED = GT_UITextures.BUTTON_COVER_NORMAL_HOVERED
+ .getSubArea(0, 0.5f, 1, 1);
+
+ private boolean clickPressed;
+
+ private static final int TOOLTIP_DELAY = 5;
+
+ public CoverCycleButtonWidget() {
+ setSize(16, 16);
+ setTooltipShowUpDelay(TOOLTIP_DELAY);
+ }
+
+ @Override
+ public ClickResult onClick(int buttonId, boolean doubleClick) {
+ updateState();
+ if (!canClick()) return ClickResult.REJECT;
+ clickPressed = true;
+ return ClickResult.SUCCESS;
+ }
+
+ @Override
+ public boolean onClickReleased(int buttonId) {
+ clickPressed = false;
+ updateState();
+ if (!isHovering() || !canClick()) return false;
+ return onClickImpl(buttonId);
+ }
+
+ protected boolean onClickImpl(int buttonId) {
+ super.onClick(buttonId, false);
+ return true;
+ }
+
+ @SuppressWarnings("BooleanMethodIsAlwaysInverted")
+ protected boolean canClick() {
+ return true;
+ }
+
+ @SideOnly(Side.CLIENT)
+ protected void updateState() {}
+
+ public boolean isClickPressed() {
+ return clickPressed;
+ }
+
+ @Override
+ public void drawBackground(float partialTicks) {
+ GL11.glColor4f(1, 1, 1, 1);
+ super.drawBackground(partialTicks);
+ }
+
+ @Override
+ public IDrawable[] getBackground() {
+ if (isHovering()) {
+ if (clickPressed) {
+ return new IDrawable[] { BUTTON_HOVERED_PRESSED };
+ } else {
+ return new IDrawable[] { BUTTON_HOVERED_NOT_PRESSED };
+ }
+ } else {
+ if (clickPressed) {
+ return new IDrawable[] { BUTTON_NORMAL_PRESSED };
+ } else {
+ return new IDrawable[] { BUTTON_NORMAL_NOT_PRESSED };
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataControllerWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataControllerWidget.java
new file mode 100644
index 0000000000..4543980ce1
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataControllerWidget.java
@@ -0,0 +1,133 @@
+package gregtech.common.gui.modularui.widget;
+
+import java.io.IOException;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import net.minecraft.network.PacketBuffer;
+
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+
+import gregtech.api.gui.modularui.IDataFollowerWidget;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.ISerializableObject;
+
+public class CoverDataControllerWidget<T extends ISerializableObject> extends DataControllerWidget<T> {
+
+ protected final GT_CoverBehaviorBase<T> coverBehavior;
+
+ /**
+ * @param dataGetter () -> cover data this widget handles
+ * @param dataSetter data to set -> if setting cover data is successful
+ * @param coverBehavior cover this widget handles data update
+ */
+ public CoverDataControllerWidget(Supplier<T> dataGetter, Function<T, Boolean> dataSetter,
+ GT_CoverBehaviorBase<T> coverBehavior) {
+ super(dataGetter, dataSetter);
+ this.coverBehavior = coverBehavior;
+ }
+
+ @Override
+ public <U, W extends Widget & IDataFollowerWidget<T, U>> CoverDataControllerWidget<T> addFollower(W widget,
+ Function<T, U> dataToStateGetter, BiFunction<T, U, T> dataUpdater, Consumer<W> applyForWidget) {
+ super.addFollower(widget, dataToStateGetter, dataUpdater, applyForWidget);
+ return this;
+ }
+
+ @Override
+ protected void writeToPacket(PacketBuffer buffer, T data) {
+ try {
+ NetworkUtils.writeNBTBase(buffer, data.saveDataToNBT());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ protected T readFromPacket(PacketBuffer buffer) throws IOException {
+ return coverBehavior.createDataObject(NetworkUtils.readNBTBase(buffer));
+ }
+
+ /**
+ * Uses int index to determine toggle button behaviors.
+ */
+ public static class CoverDataIndexedControllerWidget_ToggleButtons<T extends ISerializableObject>
+ extends CoverDataControllerWidget<T> {
+
+ private final BiFunction<Integer, T, Boolean> dataToStateGetter;
+ private final BiFunction<Integer, T, T> dataUpdater;
+
+ /**
+ * @param coverDataGetter () -> cover data this widget handles
+ * @param coverDataSetter data to set -> if setting cover data is successful
+ * @param coverBehavior cover this widget handles data update
+ * @param dataToStateGetter (index of button, given cover data) -> button state
+ * @param dataUpdater (index of button, current cover data) -> new cover data
+ */
+ public CoverDataIndexedControllerWidget_ToggleButtons(Supplier<T> coverDataGetter,
+ Function<T, Boolean> coverDataSetter, GT_CoverBehaviorBase<T> coverBehavior,
+ BiFunction<Integer, T, Boolean> dataToStateGetter, BiFunction<Integer, T, T> dataUpdater) {
+ super(coverDataGetter, coverDataSetter, coverBehavior);
+ this.dataToStateGetter = dataToStateGetter;
+ this.dataUpdater = dataUpdater;
+ }
+
+ /**
+ * @param index index of widget to add
+ * @param widget widget to add
+ * @param applyForWidget methods to call for widget to add
+ */
+ public <W extends CoverDataFollower_ToggleButtonWidget<T>> CoverDataIndexedControllerWidget_ToggleButtons<T> addToggleButton(
+ int index, W widget, Consumer<CoverDataFollower_ToggleButtonWidget<T>> applyForWidget) {
+ addFollower(
+ widget,
+ data -> dataToStateGetter.apply(index, data),
+ (data, state) -> dataUpdater.apply(index, data),
+ applyForWidget);
+ return this;
+ }
+ }
+
+ /**
+ * Uses int index to determine cycle button behaviors.
+ */
+ public static class CoverDataIndexedControllerWidget_CycleButtons<T extends ISerializableObject>
+ extends CoverDataControllerWidget<T> {
+
+ private final BiFunction<Integer, T, Integer> dataToStateGetter;
+ private final BiFunction<Integer, T, T> dataUpdater;
+
+ /**
+ * @param coverDataGetter () -> cover data this widget handles
+ * @param coverDataSetter data to set -> if setting cover data is successful
+ * @param coverBehavior cover this widget handles data update
+ * @param dataToStateGetter (index of button, given cover data) -> button state
+ * @param dataUpdater (index of button, current cover data) -> new cover data
+ */
+ public CoverDataIndexedControllerWidget_CycleButtons(Supplier<T> coverDataGetter,
+ Function<T, Boolean> coverDataSetter, GT_CoverBehaviorBase<T> coverBehavior,
+ BiFunction<Integer, T, Integer> dataToStateGetter, BiFunction<Integer, T, T> dataUpdater) {
+ super(coverDataGetter, coverDataSetter, coverBehavior);
+ this.dataToStateGetter = dataToStateGetter;
+ this.dataUpdater = dataUpdater;
+ }
+
+ /**
+ * @param index index of widget to add
+ * @param widget widget to add
+ * @param applyForWidget methods to call for the widget to add
+ */
+ public <W extends CoverDataFollower_CycleButtonWidget<T>> CoverDataIndexedControllerWidget_CycleButtons<T> addCycleButton(
+ int index, W widget, Consumer<CoverDataFollower_CycleButtonWidget<T>> applyForWidget) {
+ addFollower(
+ widget,
+ data -> dataToStateGetter.apply(index, data),
+ (data, state) -> dataUpdater.apply(index, data),
+ applyForWidget);
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_CycleButtonWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_CycleButtonWidget.java
new file mode 100644
index 0000000000..ec7d31ca7e
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_CycleButtonWidget.java
@@ -0,0 +1,39 @@
+package gregtech.common.gui.modularui.widget;
+
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import gregtech.api.gui.modularui.IDataFollowerWidget;
+import gregtech.api.util.ISerializableObject;
+
+/**
+ * Determines button state with cover data.
+ */
+public class CoverDataFollower_CycleButtonWidget<T extends ISerializableObject> extends CoverCycleButtonWidget
+ implements IDataFollowerWidget<T, Integer> {
+
+ private Function<T, Integer> dataToStateGetter;
+
+ public CoverDataFollower_CycleButtonWidget() {
+ super();
+ setGetter(() -> 0); // fake getter; used only for init
+ setSynced(false, false);
+ }
+
+ @Override
+ public CoverDataFollower_CycleButtonWidget<T> setDataToStateGetter(Function<T, Integer> dataToStateGetter) {
+ this.dataToStateGetter = dataToStateGetter;
+ return this;
+ }
+
+ @Override
+ public CoverDataFollower_CycleButtonWidget<T> setStateSetter(Consumer<Integer> setter) {
+ super.setSetter(setter);
+ return this;
+ }
+
+ @Override
+ public void updateState(T data) {
+ setState(dataToStateGetter.apply(data), false, false);
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_NumericWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_NumericWidget.java
new file mode 100644
index 0000000000..f641ed090b
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_NumericWidget.java
@@ -0,0 +1,60 @@
+package gregtech.common.gui.modularui.widget;
+
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.IDataFollowerWidget;
+import gregtech.api.util.ISerializableObject;
+
+public class CoverDataFollower_NumericWidget<T extends ISerializableObject> extends NumericWidget
+ implements IDataFollowerWidget<T, Double> {
+
+ private Function<T, Double> dataToStateGetter;
+
+ public CoverDataFollower_NumericWidget() {
+ super();
+ setGetter(() -> 0); // fake getter; used only for init
+ setSynced(false, false);
+ setTextColor(Color.WHITE.dark(1));
+ setTextAlignment(Alignment.CenterLeft);
+ setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2));
+ }
+
+ @Override
+ public void onPostInit() {
+ // Widget#onPostInit is called earlier than IDataFollowerWidget#onPostInit,
+ // so we make sure cursor is set after text is set
+ super.onPostInit();
+
+ // On first call #handler does not contain text.
+ // On second call, it contains correct text to update #lastText,
+ // but #shouldGetFocus call is skipped by Cursor#updateFocused,
+ // so we need to manually call this.
+ if (focusOnGuiOpen) {
+ shouldGetFocus();
+ }
+ }
+
+ @Override
+ public CoverDataFollower_NumericWidget<T> setDataToStateGetter(Function<T, Double> dataToStateGetter) {
+ this.dataToStateGetter = dataToStateGetter;
+ return this;
+ }
+
+ @Override
+ public CoverDataFollower_NumericWidget<T> setStateSetter(Consumer<Double> setter) {
+ super.setSetter(setter::accept);
+ return this;
+ }
+
+ @Override
+ public void updateState(T data) {
+ setValue(dataToStateGetter.apply(data));
+ }
+
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_SlotWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_SlotWidget.java
new file mode 100644
index 0000000000..0b827bfbc6
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_SlotWidget.java
@@ -0,0 +1,101 @@
+package gregtech.common.gui.modularui.widget;
+
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+import com.gtnewhorizons.modularui.api.widget.Interactable;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.gui.modularui.IDataFollowerWidget;
+import gregtech.api.util.ISerializableObject;
+
+public class CoverDataFollower_SlotWidget<T extends ISerializableObject> extends SlotWidget
+ implements IDataFollowerWidget<T, ItemStack> {
+
+ private Function<T, ItemStack> dataToStateGetter;
+ private Consumer<ItemStack> dataSetter;
+
+ public CoverDataFollower_SlotWidget(BaseSlot slot) {
+ super(slot);
+ }
+
+ public CoverDataFollower_SlotWidget(IItemHandlerModifiable handler, int index, boolean phantom) {
+ this(new BaseSlot(handler, index, phantom));
+ }
+
+ public CoverDataFollower_SlotWidget(IItemHandlerModifiable handler, int index) {
+ this(handler, index, false);
+ }
+
+ @Override
+ public CoverDataFollower_SlotWidget<T> setDataToStateGetter(Function<T, ItemStack> dataToStateGetter) {
+ this.dataToStateGetter = dataToStateGetter;
+ return this;
+ }
+
+ @Override
+ public CoverDataFollower_SlotWidget<T> setStateSetter(Consumer<ItemStack> setter) {
+ this.dataSetter = setter;
+ return this;
+ }
+
+ @Override
+ public void updateState(T data) {
+ getMcSlot().putStack(dataToStateGetter.apply(data));
+ }
+
+ @Override
+ public void detectAndSendChanges(boolean init) {}
+
+ // Slot sync is handled differently from other DataFollowers,
+ // so we need to also sync slot content directly to server.
+
+ @Override
+ public ClickResult onClick(int buttonId, boolean doubleClick) {
+ if (interactionDisabled) return ClickResult.REJECT;
+ if (isPhantom()) {
+ ClickData clickData = ClickData.create(buttonId, doubleClick);
+ syncToServer(2, clickData::writeToPacket);
+ phantomClick(clickData);
+ dataSetter.accept(getMcSlot().getStack());
+ return ClickResult.ACCEPT;
+ }
+ return ClickResult.REJECT;
+ }
+
+ @Override
+ public boolean onMouseScroll(int direction) {
+ if (interactionDisabled) return false;
+ if (isPhantom()) {
+ if (Interactable.hasShiftDown()) {
+ direction *= 8;
+ }
+ final int finalDirection = direction;
+ syncToServer(3, buffer -> buffer.writeVarIntToBuffer(finalDirection));
+ phantomScroll(finalDirection);
+ dataSetter.accept(getMcSlot().getStack());
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean handleDragAndDrop(ItemStack draggedStack, int button) {
+ if (interactionDisabled) return false;
+ if (!isPhantom()) return false;
+ ClickData clickData = ClickData.create(button, false);
+ syncToServer(5, buffer -> {
+ clickData.writeToPacket(buffer);
+ NetworkUtils.writeItemStack(buffer, draggedStack);
+ });
+ phantomClick(clickData, draggedStack);
+ dataSetter.accept(getMcSlot().getStack());
+ draggedStack.stackSize = 0;
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_TextFieldWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_TextFieldWidget.java
new file mode 100644
index 0000000000..1907aaf22f
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_TextFieldWidget.java
@@ -0,0 +1,134 @@
+package gregtech.common.gui.modularui.widget;
+
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import net.minecraft.client.gui.GuiScreen;
+
+import com.gtnewhorizon.gtnhlib.util.parsing.MathExpressionParser;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.IDataFollowerWidget;
+import gregtech.api.util.ISerializableObject;
+
+public class CoverDataFollower_TextFieldWidget<T extends ISerializableObject> extends TextFieldWidget
+ implements IDataFollowerWidget<T, String> {
+
+ private Function<T, String> dataToStateGetter;
+
+ public CoverDataFollower_TextFieldWidget() {
+ super();
+ setGetter(() -> ""); // fake getter; used only for init
+ setSynced(false, false);
+ setTextColor(Color.WHITE.dark(1));
+ setTextAlignment(Alignment.CenterLeft);
+ setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2));
+ }
+
+ @Override
+ public void onPostInit() {
+ // Widget#onPostInit is called earlier than IDataFollowerWidget#onPostInit,
+ // so we make sure cursor is set after text is set
+ super.onPostInit();
+
+ // On first call #handler does not contain text.
+ // On second call, it contains correct text to update #lastText,
+ // but #shouldGetFocus call is skipped by Cursor#updateFocused,
+ // so we need to manually call this.
+ if (focusOnGuiOpen) {
+ shouldGetFocus();
+ }
+ }
+
+ @Override
+ public CoverDataFollower_TextFieldWidget<T> setDataToStateGetter(Function<T, String> dataToStateGetter) {
+ this.dataToStateGetter = dataToStateGetter;
+ return this;
+ }
+
+ @Override
+ public CoverDataFollower_TextFieldWidget<T> setStateSetter(Consumer<String> setter) {
+ super.setSetter(setter);
+ return this;
+ }
+
+ @Override
+ public void updateState(T data) {
+ setText(dataToStateGetter.apply(data));
+ }
+
+ /**
+ * @deprecated Use {@link CoverDataFollower_NumericWidget}
+ */
+ @Deprecated
+ public CoverDataFollower_TextFieldWidget<T> setOnScrollNumbers(int baseStep, int ctrlStep, int shiftStep) {
+ setOnScrollNumbers((val, direction) -> {
+ int step = (GuiScreen.isShiftKeyDown() ? shiftStep : GuiScreen.isCtrlKeyDown() ? ctrlStep : baseStep)
+ * direction;
+ try {
+ val = Math.addExact(val, step);
+ } catch (ArithmeticException ignored) {
+ val = Integer.MAX_VALUE;
+ }
+ return val;
+ });
+ return this;
+ }
+
+ /**
+ * @deprecated Use {@link CoverDataFollower_NumericWidget}
+ */
+ @Deprecated
+ public CoverDataFollower_TextFieldWidget<T> setOnScrollNumbers() {
+ return setOnScrollNumbers(1, 50, 1000);
+ }
+
+ /**
+ * @deprecated Use {@link CoverDataFollower_NumericWidget}
+ */
+ @Deprecated
+ public CoverDataFollower_TextFieldWidget<T> setOnScrollText(int baseStep, int ctrlStep, int shiftStep) {
+ setOnScroll((text, direction) -> {
+ int val = (int) MathExpressionParser.parse(text);
+ int step = (GuiScreen.isShiftKeyDown() ? shiftStep : GuiScreen.isCtrlKeyDown() ? ctrlStep : baseStep)
+ * direction;
+ try {
+ val = Math.addExact(val, step);
+ } catch (ArithmeticException ignored) {
+ val = Integer.MAX_VALUE;
+ }
+ return this.getDecimalFormatter()
+ .format(val);
+ });
+ return this;
+ }
+
+ /**
+ * @deprecated Use {@link CoverDataFollower_NumericWidget}
+ */
+ @Deprecated
+ public CoverDataFollower_TextFieldWidget<T> setOnScrollText() {
+ return setOnScrollText(1, 5, 50);
+ }
+
+ /**
+ * @deprecated Use {@link CoverDataFollower_NumericWidget}
+ */
+ @Deprecated
+ public CoverDataFollower_TextFieldWidget<T> setOnScrollNumbersLong(long baseStep, long ctrlStep, long shiftStep) {
+ setOnScrollNumbersLong((val, direction) -> {
+ long step = (GuiScreen.isShiftKeyDown() ? shiftStep : GuiScreen.isCtrlKeyDown() ? ctrlStep : baseStep)
+ * direction;
+ try {
+ val = Math.addExact(val, step);
+ } catch (ArithmeticException ignored) {
+ val = Long.MAX_VALUE;
+ }
+ return val;
+ });
+ return this;
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_ToggleButtonWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_ToggleButtonWidget.java
new file mode 100644
index 0000000000..6f798a93d5
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_ToggleButtonWidget.java
@@ -0,0 +1,86 @@
+package gregtech.common.gui.modularui.widget;
+
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.IDataFollowerWidget;
+import gregtech.api.util.ISerializableObject;
+
+public class CoverDataFollower_ToggleButtonWidget<T extends ISerializableObject> extends CoverCycleButtonWidget
+ implements IDataFollowerWidget<T, Boolean> {
+
+ private Function<T, Boolean> dataToStateGetter;
+
+ public CoverDataFollower_ToggleButtonWidget() {
+ super();
+ setGetter(() -> 0); // fake getter; used only for init
+ setSynced(false, false);
+ setLength(2);
+ }
+
+ @Override
+ public CoverDataFollower_ToggleButtonWidget<T> setDataToStateGetter(Function<T, Boolean> dataToStateGetter) {
+ this.dataToStateGetter = dataToStateGetter;
+ return this;
+ }
+
+ @Override
+ public CoverDataFollower_ToggleButtonWidget<T> setStateSetter(Consumer<Boolean> setter) {
+ super.setSetter(val -> setter.accept(val == 1));
+ return this;
+ }
+
+ @Override
+ public void updateState(T data) {
+ setState(dataToStateGetter.apply(data) ? 1 : 0, false, false);
+ }
+
+ public CoverDataFollower_ToggleButtonWidget<T> setToggleTexture(IDrawable active, IDrawable inactive) {
+ setTextureGetter(state -> state == 1 ? active : inactive);
+ return this;
+ }
+
+ public static <T extends ISerializableObject> CoverDataFollower_ToggleButtonWidget<T> ofCheckAndCross() {
+ return new CoverDataFollower_ToggleButtonWidget<T>()
+ .setToggleTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK, GT_UITextures.OVERLAY_BUTTON_CROSS);
+ }
+
+ public static <T extends ISerializableObject> CoverDataFollower_ToggleButtonWidget<T> ofCheck() {
+ return new CoverDataFollower_ToggleButtonWidget<T>()
+ .setToggleTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK, GT_UITextures.TRANSPARENT);
+ }
+
+ public static <T extends ISerializableObject> CoverDataFollower_ToggleButtonWidget<T> ofRedstone() {
+ return new CoverDataFollower_ToggleButtonWidget<T>()
+ .setToggleTexture(GT_UITextures.OVERLAY_BUTTON_REDSTONE_ON, GT_UITextures.OVERLAY_BUTTON_REDSTONE_OFF);
+ }
+
+ public static <T extends ISerializableObject> CoverDataFollower_ToggleButtonWidget<T> ofDisableable() {
+ return new CoverDataFollower_DisableableToggleButtonWidget<>();
+ }
+
+ /**
+ * Disables clicking if button is already pressed.
+ */
+ public static class CoverDataFollower_DisableableToggleButtonWidget<T extends ISerializableObject>
+ extends CoverDataFollower_ToggleButtonWidget<T> {
+
+ public CoverDataFollower_DisableableToggleButtonWidget() {
+ super();
+ }
+
+ @Override
+ protected boolean canClick() {
+ return getState() == 0;
+ }
+
+ @Override
+ public IDrawable[] getBackground() {
+ if (!canClick()) return new IDrawable[] { GT_UITextures.BUTTON_COVER_NORMAL_DISABLED };
+ return super.getBackground();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/DataControllerWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/DataControllerWidget.java
new file mode 100644
index 0000000000..3717b128bb
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/DataControllerWidget.java
@@ -0,0 +1,166 @@
+package gregtech.common.gui.modularui.widget;
+
+import java.io.IOException;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import net.minecraft.network.PacketBuffer;
+
+import com.gtnewhorizons.modularui.api.widget.ISyncedWidget;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.gui.modularui.IDataFollowerWidget;
+import gregtech.api.util.ISerializableObject;
+
+/**
+ * Controls state of child widgets with specific data, and allows centralized control of multiple widgets. e.g. clicking
+ * button B will set machine mode to B, so button A, whose state is bound to the mode, will be automatically deactivated
+ * by this widget. <br>
+ * This widget wraps data and handles validation, e.g. tell client to close GUI when tile is broken or cover is removed.
+ * <br>
+ * Data can be anything, e.g. {@link ISerializableObject} or machine recipe mode.
+ *
+ * @param <T> Data type stored in this widget
+ * @see IDataFollowerWidget
+ */
+public abstract class DataControllerWidget<T> extends MultiChildWidget implements ISyncedWidget {
+
+ private final Supplier<T> dataGetter;
+ private final Function<T, Boolean> dataSetter;
+
+ protected T lastData;
+
+ private boolean needsUpdate;
+
+ /**
+ * @param dataGetter () -> data this widget handles
+ * @param dataSetter data to set -> if setting data is successful
+ */
+ public DataControllerWidget(Supplier<T> dataGetter, Function<T, Boolean> dataSetter) {
+ this.dataGetter = dataGetter;
+ this.dataSetter = dataSetter;
+ }
+
+ protected T getLastData() {
+ return lastData;
+ }
+
+ @Override
+ public void onPostInit() {
+ // client _should_ have received initial cover data from `GT_UIInfos#openCoverUI`
+ lastData = dataGetter.get();
+ if (NetworkUtils.isClient()) {
+ updateChildren(true);
+ }
+ }
+
+ @Override
+ public void detectAndSendChanges(boolean init) {
+ T actualValue = dataGetter.get();
+ if (actualValue == null) {
+ // data is in invalid state e.g. tile is broken, cover is removed
+ getWindow().tryClose();
+ return;
+ }
+ if (init || !actualValue.equals(getLastData())) {
+ // init sync or someone else edited data
+ lastData = actualValue;
+ syncDataToClient(actualValue);
+ }
+ }
+
+ protected void syncDataToClient(T data) {
+ syncToClient(0, buffer -> writeToPacket(buffer, data));
+ }
+
+ protected void syncDataToServer(T data) {
+ syncToServer(0, buffer -> writeToPacket(buffer, data));
+ updateChildren();
+ }
+
+ @Override
+ public void readOnClient(int id, PacketBuffer buf) throws IOException {
+ if (id == 0) {
+ lastData = readFromPacket(buf);
+ dataSetter.apply(getLastData());
+ updateChildren();
+ }
+ }
+
+ @Override
+ public void readOnServer(int id, PacketBuffer buf) throws IOException {
+ if (id == 0) {
+ lastData = readFromPacket(buf);
+ if (dataSetter.apply(getLastData())) {
+ markForUpdate();
+ } else {
+ getWindow().closeWindow();
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @SideOnly(Side.CLIENT)
+ protected void updateChildren(boolean postInit) {
+ for (Widget child : getChildren()) {
+ if (child instanceof IDataFollowerWidget) {
+ ((IDataFollowerWidget<T, ?>) child).updateState(getLastData());
+ if (postInit) {
+ ((IDataFollowerWidget<T, ?>) child).onPostInit();
+ }
+ }
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ protected void updateChildren() {
+ updateChildren(false);
+ }
+
+ protected abstract void writeToPacket(PacketBuffer buffer, T data);
+
+ protected abstract T readFromPacket(PacketBuffer buffer) throws IOException;
+
+ @Override
+ public void markForUpdate() {
+ needsUpdate = true;
+ }
+
+ @Override
+ public void unMarkForUpdate() {
+ needsUpdate = false;
+ }
+
+ @Override
+ public boolean isMarkedForUpdate() {
+ return needsUpdate;
+ }
+
+ /**
+ * @param widget widget to add that implements {@link IDataFollowerWidget}
+ * @param dataToStateGetter given data -> state of the widget to add
+ * @param dataUpdater (current data, state of the widget to add) -> new data to set
+ * @param applyForWidget methods to call for the widget to add
+ * @param <U> state type stored in the widget to add
+ * @param <W> widget type to add
+ */
+ public <U, W extends Widget & IDataFollowerWidget<T, U>> DataControllerWidget<T> addFollower(W widget,
+ Function<T, U> dataToStateGetter, BiFunction<T, U, T> dataUpdater, Consumer<W> applyForWidget) {
+ widget.setDataToStateGetter(dataToStateGetter);
+ widget.setStateSetter(state -> {
+ T newData = dataUpdater.apply(getLastData(), state);
+ lastData = newData;
+ dataSetter.apply(getLastData());
+ syncDataToServer(newData);
+ });
+ applyForWidget.accept(widget);
+ addChild(widget);
+ return this;
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/FluidLockWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/FluidLockWidget.java
new file mode 100644
index 0000000000..5627a4fb8b
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/FluidLockWidget.java
@@ -0,0 +1,17 @@
+package gregtech.common.gui.modularui.widget;
+
+import com.gtnewhorizons.modularui.common.widget.FluidNameHolderWidget;
+
+import gregtech.api.interfaces.metatileentity.IFluidLockable;
+
+public class FluidLockWidget extends FluidNameHolderWidget {
+
+ public FluidLockWidget(IFluidLockable fluidLockable) {
+ super(fluidLockable::getLockedFluidName, name -> {
+ if (fluidLockable.acceptsFluidLock(name)) {
+ fluidLockable.setLockedFluidName(name);
+ fluidLockable.lockFluid(name != null);
+ }
+ });
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/ItemWatcherSlotWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/ItemWatcherSlotWidget.java
new file mode 100644
index 0000000000..5200c1a416
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/ItemWatcherSlotWidget.java
@@ -0,0 +1,50 @@
+package gregtech.common.gui.modularui.widget;
+
+import java.util.function.Supplier;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.util.GT_Utility;
+
+/**
+ * Watches specific ItemStack and pulls changes from it. Player cannot interact with slot, other than viewing NEI recipe
+ * or adding bookmark.
+ */
+public class ItemWatcherSlotWidget extends SlotWidget {
+
+ private ItemStack lastItem;
+ private Supplier<ItemStack> getter;
+
+ public ItemWatcherSlotWidget() {
+ super(BaseSlot.phantom(new ItemStackHandler(), 0));
+ disableInteraction();
+ }
+
+ public ItemWatcherSlotWidget setGetter(Supplier<ItemStack> getter) {
+ this.getter = getter;
+ return this;
+ }
+
+ @Override
+ public void detectAndSendChanges(boolean init) {
+ ItemStack target = getter.get();
+ if (init || !GT_Utility.areStacksEqual(lastItem, target)) {
+ ItemStack toPut;
+ if (target != null) {
+ toPut = target.copy();
+ toPut.stackSize = 1;
+ } else {
+ toPut = null;
+ }
+ ((IItemHandlerModifiable) getMcSlot().getItemHandler()).setStackInSlot(0, toPut);
+ lastItem = target;
+ getMcSlot().onSlotChanged();
+ }
+ super.detectAndSendChanges(init);
+ }
+}
diff --git a/src/main/java/gregtech/common/gui/modularui/widget/ShutDownReasonSyncer.java b/src/main/java/gregtech/common/gui/modularui/widget/ShutDownReasonSyncer.java
new file mode 100644
index 0000000000..21c19e524c
--- /dev/null
+++ b/src/main/java/gregtech/common/gui/modularui/widget/ShutDownReasonSyncer.java
@@ -0,0 +1,26 @@
+package gregtech.common.gui.modularui.widget;
+
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+
+public class ShutDownReasonSyncer extends FakeSyncWidget<ShutDownReason> {
+
+ public ShutDownReasonSyncer(Supplier<ShutDownReason> getter, Consumer<ShutDownReason> setter) {
+ super(getter, setter, (buffer, result) -> {
+ NetworkUtils.writeStringSafe(buffer, result.getID());
+ result.encode(buffer);
+ }, buffer -> {
+ String id = NetworkUtils.readStringSafe(buffer);
+ ShutDownReason result = ShutDownReasonRegistry.getSampleFromRegistry(id)
+ .newInstance();
+ result.decode(buffer);
+ return result;
+ });
+ }
+}
diff --git a/src/main/java/gregtech/common/items/CombType.java b/src/main/java/gregtech/common/items/CombType.java
new file mode 100644
index 0000000000..96850727fd
--- /dev/null
+++ b/src/main/java/gregtech/common/items/CombType.java
@@ -0,0 +1,284 @@
+package gregtech.common.items;
+
+import java.util.Arrays;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_LanguageManager;
+
+public enum CombType {
+
+ // Organic Line
+ LIGNIE(0, "lignite", true, Materials.Lignite, 100, 0x58300B, 0x906237, ItemComb.Voltage.LV),
+ COAL(1, "coal", true, Materials.Coal, 100, 0x525252, 0x666666, ItemComb.Voltage.LV),
+ STICKY(2, "stickyresin", true, Materials._NULL, 50, 0x2E8F5B, 0xDCC289, ItemComb.Voltage.LV),
+ OIL(3, "oil", true, Materials._NULL, 100, 0x333333, 0x4C4C4C, ItemComb.Voltage.LV),
+ APATITE(4, "apatite", true, Materials.Apatite, 100, 0xc1c1f6, 0x676784, ItemComb.Voltage.LV),
+ ASH(5, "ash", true, Materials.Ash, 100, 0x1e1a18, 0xc6c6c6, ItemComb.Voltage.LV),
+
+ // IC2 Line
+ COOLANT(6, "coolant", true, Materials._NULL, 100, 0x144F5A, 0x2494A2, ItemComb.Voltage.HV),
+ ENERGY(7, "energy", true, Materials._NULL, 80, 0xC11F1F, 0xEBB9B9, ItemComb.Voltage.HV),
+ LAPOTRON(8, "lapotron", true, Materials._NULL, 60, 0x1414FF, 0x6478FF, ItemComb.Voltage.HV),
+ PYROTHEUM(9, "pyrotheum", true, Materials.Pyrotheum, 50, 0xffebc4, 0xe36400, ItemComb.Voltage.HV),
+ CRYOTHEUM(10, "cryotheum", true, Materials.Cryotheum, 50, 0x2660ff, 0x5af7ff, ItemComb.Voltage.HV),
+
+ // Alloy Line
+ REDALLOY(11, "redalloy", true, Materials.RedAlloy, 100, 0xE60000, 0xB80000, ItemComb.Voltage.LV),
+ REDSTONEALLOY(12, "redstonealloy", true, Materials.RedstoneAlloy, 90, 0xB80000, 0xA50808, ItemComb.Voltage.LV),
+ CONDUCTIVEIRON(13, "conductiveiron", true, Materials.ConductiveIron, 80, 0x817671, 0xCEADA3, ItemComb.Voltage.MV),
+ VIBRANTALLOY(14, "vibrantalloy", true, Materials.VibrantAlloy, 50, 0x86A12D, 0xC4F2AE, ItemComb.Voltage.HV),
+ ENERGETICALLOY(15, "energeticalloy", true, Materials.EnergeticAlloy, 70, 0xFF9933, 0xFFAD5C, ItemComb.Voltage.HV),
+ ELECTRICALSTEEL(16, "electricalsteel", true, Materials.ElectricalSteel, 90, 0x787878, 0xD8D8D8,
+ ItemComb.Voltage.LV),
+ DARKSTEEL(17, "darksteel", true, Materials.DarkSteel, 80, 0x252525, 0x443B44, ItemComb.Voltage.MV),
+ PULSATINGIRON(18, "pulsatingiron", true, Materials.PulsatingIron, 80, 0x006600, 0x6DD284, ItemComb.Voltage.HV),
+ STAINLESSSTEEL(19, "stainlesssteel", true, Materials.StainlessSteel, 75, 0x778899, 0xC8C8DC, ItemComb.Voltage.HV),
+ ENDERIUM(20, "enderium", true, Materials.Enderium, 40, 0x2E8B57, 0x599087, ItemComb.Voltage.HV),
+
+ // Thaumcraft Line
+ THAUMIUMDUST(21, "thaumiumdust", true, Materials.Thaumium, 100, 0x7A007A, 0x5C005C, ItemComb.Voltage.MV),
+ THAUMIUMSHARD(22, "thaumiumshard", true, Materials._NULL, 85, 0x9966FF, 0xAD85FF, ItemComb.Voltage.LV),
+ AMBER(23, "amber", true, Materials.Amber, 90, 0x774B15, 0xEE7700, ItemComb.Voltage.LV),
+ QUICKSILVER(24, "quicksilver", true, Materials.Mercury, 90, 0xc7c7ea, 0xb5b3df, ItemComb.Voltage.LV),
+ SALISMUNDUS(25, "salismundus", true, Materials._NULL, 75, 0xF7ADDE, 0x592582, ItemComb.Voltage.MV),
+ TAINTED(26, "tainted", true, Materials._NULL, 80, 0x904BB8, 0xE800FF, ItemComb.Voltage.LV),
+ MITHRIL(27, "mithril", true, Materials.Mithril, 70, 0xF0E68C, 0xFFFFD2, ItemComb.Voltage.HV),
+ ASTRALSILVER(28, "astralsilver", true, Materials.AstralSilver, 70, 0xAFEEEE, 0xE6E6FF, ItemComb.Voltage.HV),
+ THAUMINITE(29, "thauminite", true, Materials._NULL, 50, 0x2E2D79, 0x7581E0, ItemComb.Voltage.HV),
+ SHADOWMETAL(30, "shadowmetal", true, Materials.Shadow, 50, 0x100322, 0x100342, ItemComb.Voltage.HV),
+ DIVIDED(31, "divided", true, Materials.Unstable, 40, 0xF0F0F0, 0xDCDCDC, ItemComb.Voltage.HV),
+ SPARKELING(32, "sparkling", true, Materials.NetherStar, 40, 0x7A007A, 0xFFFFFF, ItemComb.Voltage.EV),
+
+ // Gem Line
+ STONE(33, "stone", true, Materials._NULL, 70, 0x808080, 0x999999, ItemComb.Voltage.LV),
+ CERTUS(34, "certus", true, Materials.CertusQuartz, 100, 0x57CFFB, 0xBBEEFF, ItemComb.Voltage.LV),
+ FLUIX(35, "fluix", true, Materials.Fluix, 100, 0xA375FF, 0xB591FF, ItemComb.Voltage.LV),
+ REDSTONE(36, "redstone", true, Materials.Redstone, 100, 0x7D0F0F, 0xD11919, ItemComb.Voltage.LV),
+ RAREEARTH(37, "rareearth", true, Materials.RareEarth, 100, 0x555643, 0x343428, ItemComb.Voltage.LV),
+ LAPIS(38, "lapis", true, Materials.Lapis, 100, 0x1947D1, 0x476CDA, ItemComb.Voltage.LV),
+ RUBY(39, "ruby", true, Materials.Ruby, 100, 0xE6005C, 0xCC0052, ItemComb.Voltage.LV),
+ REDGARNET(40, "redgarnet", true, Materials.GarnetRed, 100, 0xBD4C4C, 0xECCECE, ItemComb.Voltage.LV),
+ YELLOWGARNET(41, "yellowgarnet", true, Materials.GarnetYellow, 100, 0xA3A341, 0xEDEDCE, ItemComb.Voltage.LV),
+ SAPPHIRE(42, "sapphire", true, Materials.Sapphire, 100, 0x0033CC, 0x00248F, ItemComb.Voltage.LV),
+ DIAMOND(43, "diamond", true, Materials.Diamond, 100, 0xCCFFFF, 0xA3CCCC, ItemComb.Voltage.LV),
+ OLIVINE(44, "olivine", true, Materials.Olivine, 100, 0x248F24, 0xCCFFCC, ItemComb.Voltage.LV),
+ EMERALD(45, "emerald", true, Materials.Emerald, 100, 0x248F24, 0x2EB82E, ItemComb.Voltage.LV),
+ PYROPE(46, "pyrope", true, Materials.Pyrope, 100, 0x763162, 0x8B8B8B, ItemComb.Voltage.LV),
+ GROSSULAR(47, "grossular", true, Materials.Grossular, 100, 0x9B4E00, 0x8B8B8B, ItemComb.Voltage.LV),
+ FIRESTONE(48, "firestone", true, Materials.Firestone, 100, 0xC00000, 0xFF0000, ItemComb.Voltage.LV),
+
+ // Metals Line
+ SLAG(49, "slag", true, Materials._NULL, 50, 0xD4D4D4, 0x58300B, ItemComb.Voltage.LV),
+ COPPER(50, "copper", true, Materials.Copper, 100, 0xFF6600, 0xE65C00, ItemComb.Voltage.LV),
+ TIN(51, "tin", true, Materials.Tin, 100, 0xD4D4D4, 0xDDDDDD, ItemComb.Voltage.LV),
+ LEAD(52, "lead", true, Materials.Lead, 100, 0x666699, 0xA3A3CC, ItemComb.Voltage.LV),
+ IRON(53, "iron", true, Materials.Iron, 100, 0xDA9147, 0xDE9C59, ItemComb.Voltage.LV),
+ STEEL(54, "steel", true, Materials.Steel, 95, 0x808080, 0x999999, ItemComb.Voltage.LV),
+ NICKEL(55, "nickel", true, Materials.Nickel, 100, 0x8585AD, 0x9D9DBD, ItemComb.Voltage.LV),
+ ZINC(56, "zinc", true, Materials.Zinc, 100, 0xF0DEF0, 0xF2E1F2, ItemComb.Voltage.LV),
+ SILVER(57, "silver", true, Materials.Silver, 100, 0xC2C2D6, 0xCECEDE, ItemComb.Voltage.LV),
+ GOLD(58, "gold", true, Materials.Gold, 100, 0xE6B800, 0xCFA600, ItemComb.Voltage.LV),
+ SULFUR(59, "sulfur", true, Materials.Sulfur, 100, 0x6F6F01, 0x8B8B8B, ItemComb.Voltage.LV),
+ GALLIUM(60, "gallium", true, Materials.Gallium, 75, 0x8B8B8B, 0xC5C5E4, ItemComb.Voltage.LV),
+ ARSENIC(61, "arsenic", true, Materials.Arsenic, 75, 0x736C52, 0x292412, ItemComb.Voltage.LV),
+
+ // Rare Metals Line
+ BAUXITE(62, "bauxite", true, Materials.Bauxite, 85, 0x6B3600, 0x8B8B8B, ItemComb.Voltage.LV),
+ ALUMINIUM(63, "aluminium", true, Materials.Aluminium, 60, 0x008AB8, 0xD6D6FF, ItemComb.Voltage.LV),
+ MANGANESE(64, "manganese", true, Materials.Manganese, 30, 0xD5D5D5, 0xAAAAAA, ItemComb.Voltage.LV),
+ MAGNESIUM(65, "magnesium", true, Materials.Magnesium, 75, 0xF1D9D9, 0x8B8B8B, ItemComb.Voltage.LV),
+ TITANIUM(66, "titanium", true, Materials.Ilmenite, 100, 0xCC99FF, 0xDBB8FF, ItemComb.Voltage.IV),
+ CHROME(67, "chromium", true, Materials.Chrome, 50, 0xEBA1EB, 0xF2C3F2, ItemComb.Voltage.HV),
+ TUNGSTEN(68, "tungsten", true, Materials.Tungstate, 100, 0x62626D, 0x161620, ItemComb.Voltage.IV),
+ PLATINUM(69, "platinum", true, Materials.Platinum, 40, 0xE6E6E6, 0xFFFFCC, ItemComb.Voltage.HV),
+ IRIDIUM(70, "iridium", true, Materials.Iridium, 20, 0xDADADA, 0xD1D1E0, ItemComb.Voltage.IV),
+ MOLYBDENUM(71, "molybdenum", true, Materials.Molybdenum, 20, 0xAEAED4, 0x8B8B8B, ItemComb.Voltage.LV),
+ OSMIUM(72, "osmium", true, Materials.Osmium, 15, 0x2B2BDA, 0x8B8B8B, ItemComb.Voltage.IV),
+ LITHIUM(73, "lithium", true, Materials.Lithium, 75, 0xF0328C, 0xE1DCFF, ItemComb.Voltage.MV),
+ SALT(74, "salt", true, Materials.Salt, 90, 0xF0C8C8, 0xFAFAFA, ItemComb.Voltage.MV),
+ ELECTROTINE(75, "electrotine", true, Materials.Electrotine, 75, 0x1E90FF, 0x3CB4C8, ItemComb.Voltage.HV),
+ ALMANDINE(76, "almandine", true, Materials.Almandine, 85, 0xC60000, 0x8B8B8B, ItemComb.Voltage.LV),
+
+ // Radioactive Line
+ URANIUM(77, "uranium", true, Materials.Uranium, 50, 0x19AF19, 0x169E16, ItemComb.Voltage.IV),
+ PLUTONIUM(78, "plutonium", true, Materials.Plutonium, 10, 0x240000, 0x570000, ItemComb.Voltage.IV),
+ NAQUADAH(79, "naquadah", true, Materials.Naquadah, 10, 0x000000, 0x004400, ItemComb.Voltage.IV),
+ NAQUADRIA(80, "naquadria", true, Materials.Naquadria, 5, 0x000000, 0x002400, ItemComb.Voltage.IV),
+ DOB(81, "d-o-b", true, Materials._NULL, 50, 0x007700, 0x002400, ItemComb.Voltage.LV),
+ THORIUM(82, "thorium", true, Materials.Thorium, 75, 0x001E00, 0x005000, ItemComb.Voltage.EV),
+ LUTETIUM(83, "lutetium", true, Materials.Lutetium, 10, 0xE6FFE6, 0xFFFFFF, ItemComb.Voltage.IV),
+ AMERICIUM(84, "americium", true, Materials.Americium, 5, 0xE6E6FF, 0xC8C8C8, ItemComb.Voltage.LuV),
+ NEUTRONIUM(85, "neutronium", true, Materials.Neutronium, 2, 0xFFF0F0, 0xFAFAFA, ItemComb.Voltage.ZPM),
+
+ // Twilight
+ NAGA(86, "naga", true, Materials._NULL, 100, 0x0D5A0D, 0x28874B, ItemComb.Voltage.MV),
+ LICH(87, "lich", true, Materials._NULL, 90, 0x5C605E, 0xC5C5C5, ItemComb.Voltage.HV),
+ HYDRA(88, "hydra", true, Materials._NULL, 80, 0x872836, 0xB8132C, ItemComb.Voltage.HV),
+ URGHAST(89, "urghast", true, Materials._NULL, 70, 0x7C0618, 0xA7041C, ItemComb.Voltage.EV),
+ SNOWQUEEN(90, "snowqueen", true, Materials._NULL, 60, 0x9C0018, 0xD02001, ItemComb.Voltage.EV),
+
+ // Space
+ SPACE(91, "space", true, Materials._NULL, 100, 0x003366, 0xC0C0C0, ItemComb.Voltage.HV),
+ METEORICIRON(92, "meteoriciron", true, Materials.MeteoricIron, 100, 0x321928, 0x643250, ItemComb.Voltage.EV),
+ DESH(93, "desh", true, Materials.Desh, 90, 0x282828, 0x323232, ItemComb.Voltage.IV),
+ LEDOX(94, "ledox", true, Materials.Ledox, 75, 0x0000CD, 0x0074FF, ItemComb.Voltage.IV),
+ CALLISTOICE(95, "callistoice", true, Materials.CallistoIce, 75, 0x0074FF, 0x1EB1FF, ItemComb.Voltage.IV),
+ MYTRYL(96, "mytryl", true, Materials.Mytryl, 65, 0xDAA520, 0xF26404, ItemComb.Voltage.IV),
+ QUANTIUM(97, "quantium", true, Materials.Quantium, 50, 0x00FF00, 0x00D10B, ItemComb.Voltage.IV),
+ ORIHARUKON(98, "oriharukon", true, Materials.Oriharukon, 50, 0x228B22, 0x677D68, ItemComb.Voltage.IV),
+ MYSTERIOUSCRYSTAL(99, "mysteriouscrystal", true, Materials.MysteriousCrystal, 45, 0x3CB371, 0x16856C,
+ ItemComb.Voltage.LuV),
+ BLACKPLUTONIUM(100, "blackplutonium", true, Materials.Quantium, 25, 0x000000, 0x323232, ItemComb.Voltage.LuV),
+ TRINIUM(101, "trinium", true, Materials.Trinium, 25, 0xB0E0E6, 0xC8C8D2, ItemComb.Voltage.ZPM),
+
+ // Planet
+ MERCURY(102, "mercury", true, Materials._NULL, 65, 0x4A4033, 0xB5A288, ItemComb.Voltage.EV),
+ VENUS(103, "venus", true, Materials._NULL, 65, 0x120E07, 0x272010, ItemComb.Voltage.EV),
+ MOON(104, "moon", true, Materials._NULL, 90, 0x373735, 0x7E7E78, ItemComb.Voltage.MV),
+ MARS(105, "mars", true, Materials._NULL, 80, 0x220D05, 0x3A1505, ItemComb.Voltage.MV),
+ JUPITER(106, "jupiter", true, Materials._NULL, 75, 0x734B2E, 0xD0CBC4, ItemComb.Voltage.MV),
+ SATURN(107, "saturn", true, Materials._NULL, 55, 0xD2A472, 0xF8C37B, ItemComb.Voltage.IV),
+ URANUS(108, "uranus", true, Materials._NULL, 45, 0x75C0C9, 0x84D8EC, ItemComb.Voltage.IV),
+ NEPTUN(109, "neptun", true, Materials._NULL, 35, 0x334CFF, 0x576DFF, ItemComb.Voltage.IV),
+ PLUTO(110, "pluto", true, Materials._NULL, 25, 0x34271E, 0x69503D, ItemComb.Voltage.LuV),
+ HAUMEA(111, "haumea", true, Materials._NULL, 20, 0x1C1413, 0x392B28, ItemComb.Voltage.LuV),
+ MAKEMAKE(112, "makemake", true, Materials._NULL, 20, 0x301811, 0x120A07, ItemComb.Voltage.LuV),
+ CENTAURI(113, "centauri", true, Materials._NULL, 15, 0x2F2A14, 0xB06B32, ItemComb.Voltage.ZPM),
+ TCETI(114, "tceti", true, Materials._NULL, 10, 0x46241A, 0x7B412F, ItemComb.Voltage.ZPM),
+ BARNARDA(115, "barnarda", true, Materials._NULL, 10, 0x0D5A0D, 0xE6C18D, ItemComb.Voltage.ZPM),
+ VEGA(116, "vega", true, Materials._NULL, 10, 0x1A2036, 0xB5C0DE, ItemComb.Voltage.ZPM),
+
+ // Infinity
+ COSMICNEUTRONIUM(117, "cosmicneutronium", true, Materials.CosmicNeutronium, 5, 0x484848, 0x323232,
+ ItemComb.Voltage.UV),
+ INFINITYCATALYST(118, "infinitycatalyst", true, Materials.InfinityCatalyst, 2, 0xFFFFFF, 0xFFFFFF,
+ ItemComb.Voltage.UHV),
+ INFINITY(119, "infinity", true, Materials.Infinity, 1, 0xFFFFFF, 0xFFFFFF, ItemComb.Voltage.UEV),
+
+ // HEE
+ ENDDUST(120, "enddust", true, Materials._NULL, 50, 0x003A7D, 0xCC00FA, ItemComb.Voltage.HV),
+ ECTOPLASMA(121, "ectoplasma", true, Materials._NULL, 35, 0x381C40, 0xDCB0E5, ItemComb.Voltage.EV),
+ ARCANESHARD(122, "arcaneshard", true, Materials._NULL, 35, 0x333D82, 0x9010AD, ItemComb.Voltage.EV),
+ STARDUST(123, "stardust", true, Materials._NULL, 60, 0xDCBE13, 0xffff00, ItemComb.Voltage.HV),
+ DRAGONESSENCE(124, "dragonessence", true, Materials._NULL, 30, 0x911ECE, 0xFFA12B, ItemComb.Voltage.IV),
+ ENDERMAN(125, "enderman", true, Materials._NULL, 25, 0x6200e7, 0x161616, ItemComb.Voltage.IV),
+ SILVERFISH(126, "silverfish", true, Materials._NULL, 25, 0x0000000, 0xEE053D, ItemComb.Voltage.EV),
+ ENDIUM(127, "endium", true, Materials.HeeEndium, 50, 0x2F5A6C, 0xa0ffff, ItemComb.Voltage.HV),
+ RUNEI(128, "rune1", true, Materials._NULL, 10, 0x0104D9, 0xE31010, ItemComb.Voltage.IV),
+ RUNEII(129, "rune2", true, Materials._NULL, 10, 0xE31010, 0x0104D9, ItemComb.Voltage.IV),
+ FIREESSENSE(130, "fireessence", true, Materials._NULL, 30, 0xFFA157, 0xD41238, ItemComb.Voltage.IV),
+ CRYOLITE(131, "cryolite", true, Materials.Cryolite, 90, 0xBFEFFF, 0x73B9D0, ItemComb.Voltage.LV),
+ // (NOBLE) GAS LINE
+ HELIUM(132, "helium", true, Materials.Helium, 90, 0xFFA9FF, 0xFFFFC3, ItemComb.Voltage.HV),
+ ARGON(133, "argon", true, Materials.Argon, 95, 0x89D9E1, 0x160822, ItemComb.Voltage.MV),
+ // XENON, NEON and KRYPTON Fluid extractor Recipes are located in GT_MachineRecipeLoader.java
+ XENON(134, "xenon", true, Materials._NULL, 85, 0x160822, 0x8A97B0, ItemComb.Voltage.IV),
+ NEON(135, "neon", true, Materials._NULL, 90, 0xFF7200, 0xFFC826, ItemComb.Voltage.IV),
+ KRYPTON(136, "krypton", true, Materials._NULL, 85, 0x160822, 0x8A97B0, ItemComb.Voltage.IV),
+ NITROGEN(137, "nitrogen", true, Materials.Nitrogen, 100, 0xA52A2A, 0xFFC832, ItemComb.Voltage.MV),
+ OXYGEN(138, "oxygen", true, Materials.Oxygen, 100, 0x8F8FFF, 0xFFFFFF, ItemComb.Voltage.MV),
+ HYDROGEN(139, "hydrogen", true, Materials.Hydrogen, 100, 0xFF1493, 0xFFFFFF, ItemComb.Voltage.MV),
+ // Those are supposed to be in the organic branch, but that would require shifting all comb IDs and we don't want to
+ // risk it.
+ PHOSPHORUS(140, "phosphorus", true, Materials.Phosphorus, 100, 0xC1C1F6, 0xFFC826, ItemComb.Voltage.HV),
+ MICA(141, "mica", true, Materials.Mica, 100, 0x8A97B0, 0x2F3641, ItemComb.Voltage.HV),
+ // Seaweed is located in the planet line
+ SEAWEED(142, "seaweed", true, Materials._NULL, 90, 0x83FF83, 0xCBCBCB, ItemComb.Voltage.UV),
+ // just Walrus
+ WALRUS(143, "walrus", true, Materials._NULL, 100, 0xB5CFC9, 0xD6D580, ItemComb.Voltage.LV),
+ // TC infused Air shards line. Recipes in GT_MachineRecipeLoader.java Lines 1500+ + Nether/Endshard
+ INFUSEDAER(144, "infusedair", true, Materials._NULL, 100, 0x60602F, 0xFFFF7E, ItemComb.Voltage.LV),
+ INFUSEDTERRA(145, "infusedterra", true, Materials._NULL, 100, 0x003300, 0x008600, ItemComb.Voltage.LV),
+ INFUSEDIGNIS(146, "infusedignis", true, Materials._NULL, 100, 0x3B0E00, 0xED3801, ItemComb.Voltage.LV),
+ INFUSEDAQUA(147, "infusedaqua", true, Materials._NULL, 100, 0x002542, 0x0090FF, ItemComb.Voltage.LV),
+ INFUSEDORDO(148, "infusedordo", true, Materials._NULL, 100, 0x5C5F62, 0x8A97B0, ItemComb.Voltage.LV),
+ INFUSEDPERDITIO(149, "infusedperditio", true, Materials._NULL, 100, 0x232129, 0x2E2E41, ItemComb.Voltage.LV),
+ FLUORINE(150, "fluorine", true, Materials.Fluorine, 100, 0xFF6D00, 0x86AFF0, ItemComb.Voltage.MV),
+ BEDROCKIUM(151, "bedrockium", true, Materials.Bedrockium, 100, 0xC6C6C6, 0x0C0C0C, ItemComb.Voltage.EV),
+ NETHERSHARD(152, "nethershard", true, Materials.Netherrack, 100, 0x350211, 0xBE0135, ItemComb.Voltage.HV),
+ ENDSHARD(153, "endshard", true, Materials.EnderEye, 100, 0x232129, 0x2E2E41, ItemComb.Voltage.HV),
+ CAELESTISRED(154, "caelestisred", true, Materials._NULL, 100, 0xFF0000, 0xFF00FF, ItemComb.Voltage.LV),
+ CAELESTISGREEN(155, "caelestisgreen", true, Materials._NULL, 100, 0x00FF00, 0xB233FF, ItemComb.Voltage.LV),
+ CAELESTISBLUE(156, "caelestisblue", true, Materials._NULL, 100, 0x0000FF, 0xFF99A5, ItemComb.Voltage.LV),
+ UNKNOWNWATER(157, "unknownwater", true, Materials._NULL, 100, 0x36ABFF, 0x4333A5, ItemComb.Voltage.ZPM),
+ // ESSENTIA gets a use soon. Dont remove.
+ ESSENTIA(158, "essentia", true, Materials._NULL, 100, 0xED3601, 0xFF6D50, ItemComb.Voltage.MV),
+ INDIUM(159, "indium", true, Materials.Indium, 100, 0x8F5D99, 0xFFA9FF, ItemComb.Voltage.ZPM),
+ BLIZZ(160, "blizz", true, Materials.Blizz, 50, 0xFF99A5, 0x5af7ff, ItemComb.Voltage.MV),
+ KEVLAR(161, "kevlar", true, Materials._NULL, 50, 0xa2baa3, 0x2d542f, ItemComb.Voltage.MV),
+ DRACONIC(162, "draconium", true, Materials.Draconium, 50, 0x161616, 0x6200e7, ItemComb.Voltage.MV),
+ AWAKENEDDRACONIUM(163, "awakeneddraconium", true, Materials.DraconiumAwakened, 50, 0xD41238, 0xFFA157,
+ ItemComb.Voltage.MV),
+ PALLADIUM(164, "palladium", true, Materials.Palladium, 50, 0x8B8B8B, 0xF1D9D9, ItemComb.Voltage.MV),
+ INFUSEDGOLD(165, "infusedgold", true, Materials.InfusedGold, 50, 0x80641E, 0xFFC83C, ItemComb.Voltage.IV),
+
+ // ALWAYS KEEP _NULL AT THE BOTTOM
+ _NULL(-1, "INVALIDCOMB", false, Materials._NULL, 0, 0, 0);
+
+ public boolean showInList;
+ public final ItemComb.Voltage voltage;
+ public final Materials material;
+ public final int chance;
+
+ private final int id;
+ private final String localizedName;
+ private final int[] color;
+
+ CombType(int id, String pName, boolean show, Materials material, int chance, int color1, int color2) {
+ this(id, pName, show, material, chance, color1, color2, null);
+ }
+
+ CombType(int id, String pName, boolean show, Materials material, int chance, int color1, int color2,
+ ItemComb.Voltage voltage) {
+ if (id < 0 && !"INVALIDCOMB".equals(pName)) throw new IllegalArgumentException();
+ this.id = id;
+ this.voltage = voltage;
+ this.material = material;
+ this.chance = chance;
+ this.showInList = show;
+ this.color = new int[] { color1, color2 };
+ this.localizedName = GT_LanguageManager.addStringLocalization(
+ "comb." + pName,
+ pName.substring(0, 1)
+ .toUpperCase() + pName.substring(1)
+ + " Comb");
+ }
+
+ public void setHidden() {
+ this.showInList = false;
+ }
+
+ public String getName() {
+
+ return this.localizedName;
+ }
+
+ public int[] getColours() {
+ return color == null || color.length != 2 ? new int[] { 0, 0 } : color;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public static CombType valueOf(int id) {
+ return id < 0 || id >= Companion.VALUES.length ? _NULL : Companion.VALUES[id];
+ }
+
+ private static final class Companion {
+
+ private static final CombType[] VALUES;
+
+ static {
+ int biggestId = Arrays.stream(CombType.values())
+ .mapToInt(CombType::getId)
+ .max()
+ .getAsInt();
+ VALUES = new CombType[biggestId + 1];
+ Arrays.fill(VALUES, _NULL);
+ for (CombType type : CombType.values()) {
+ if (type != _NULL) VALUES[type.getId()] = type;
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/items/DropType.java b/src/main/java/gregtech/common/items/DropType.java
new file mode 100644
index 0000000000..64d42b2eeb
--- /dev/null
+++ b/src/main/java/gregtech/common/items/DropType.java
@@ -0,0 +1,46 @@
+package gregtech.common.items;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_LanguageManager;
+
+public enum DropType {
+
+ OIL("oil", true),
+ MUTAGEN("small mutagen catalyst", true),
+ COOLANT("coolant", true),
+ HOT_COOLANT("hot coolant", true),
+ HYDRA("hydra blood", true),
+ SNOW_QUEEN("snowqueen blood", true),
+ OXYGEN("oxygen", true),
+ LAPIS("lapis coolant", true),
+ ENDERGOO("ender goo", true);
+
+ private static final int[][] colours = new int[][] { { 0x19191B, 0x303032 }, { 0xffc100, 0x00ff11 },
+ { 0x144F5A, 0x2494A2 }, { 0xC11F1F, 0xEBB9B9 }, { 0x872836, 0xB8132C }, { 0xD02001, 0x9C0018 },
+ { 0x003366, 0x0066BB }, { 0x1727b1, 0x008ce3 }, { 0xA005E7, 0x161616 }, };
+ public boolean showInList;
+ public Materials material;
+ public int chance;
+ private final String name;
+
+ DropType(String pName, boolean show) {
+ this.name = pName;
+ this.showInList = show;
+ }
+
+ public void setHidden() {
+ this.showInList = false;
+ }
+
+ public String getName() {
+
+ return GT_LanguageManager.addStringLocalization(
+ "drop." + this.name,
+ this.name.substring(0, 1)
+ .toUpperCase() + this.name.substring(1) + " Drop");
+ }
+
+ public int[] getColours() {
+ return colours[this.ordinal()];
+ }
+}
diff --git a/src/main/java/gregtech/common/items/GT_AdvancedSensorCard_Item.java b/src/main/java/gregtech/common/items/GT_AdvancedSensorCard_Item.java
new file mode 100644
index 0000000000..ae64bea432
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_AdvancedSensorCard_Item.java
@@ -0,0 +1,327 @@
+package gregtech.common.items;
+
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.common.covers.GT_Cover_Metrics_Transmitter.CARD_STATE_KEY;
+import static gregtech.common.covers.GT_Cover_Metrics_Transmitter.FREQUENCY_LSB_KEY;
+import static gregtech.common.covers.GT_Cover_Metrics_Transmitter.FREQUENCY_MSB_KEY;
+import static gregtech.common.covers.GT_Cover_Metrics_Transmitter.MACHINE_KEY;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+import java.util.function.Predicate;
+import java.util.stream.IntStream;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+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.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableList;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.common.misc.GlobalMetricsCoverDatabase;
+import gregtech.common.misc.GlobalMetricsCoverDatabase.State;
+import shedar.mods.ic2.nuclearcontrol.api.CardState;
+import shedar.mods.ic2.nuclearcontrol.api.ICardWrapper;
+import shedar.mods.ic2.nuclearcontrol.api.IPanelDataSource;
+import shedar.mods.ic2.nuclearcontrol.api.PanelSetting;
+import shedar.mods.ic2.nuclearcontrol.api.PanelString;
+
+@SuppressWarnings("unused")
+public class GT_AdvancedSensorCard_Item extends Item implements IPanelDataSource {
+
+ public static final UUID CARD_TYPE_ID = UUID.fromString("ff952e84-7608-4c4a-85af-dd6e1aa27fc7");
+
+ // This has obfuscated formatting, so no need to localize it.
+ private static final String SELF_DESTRUCTED_OUTPUT = EnumChatFormatting.OBFUSCATED + "critical error"
+ + EnumChatFormatting.RESET;
+
+ private static final ImmutableList<String> DECONSTRUCTED_OUTPUT = ImmutableList.of(
+ StatCollector.translateToLocal("gt.item.adv_sensor_card.error.deconstructed.1"),
+ StatCollector.translateToLocal("gt.item.adv_sensor_card.error.deconstructed.2"));
+
+ private static final String NO_DATA_FOUND = StatCollector.translateToLocal("gt.item.adv_sensor_card.error.no_data");
+
+ private static final String MACHINE_NAME_KEY = "client_machine_name";
+ private static final String OUTPUT_ENTRY_KEY = "client_entry_%d";
+ private static final String OUTPUT_ENTRY_LENGTH_KEY = "client_entry_length";
+
+ private int payloadSize = 0;
+
+ @SideOnly(Side.CLIENT)
+ private IIcon normalIcon;
+ @SideOnly(Side.CLIENT)
+ private IIcon selfDestructedIcon;
+
+ @SuppressWarnings("unused")
+ public GT_AdvancedSensorCard_Item() {
+ super();
+
+ GameRegistry.registerItem(this, "gt.advancedsensorcard", GregTech.ID);
+ setUnlocalizedName("gt.advancedsensorcard");
+ setMaxStackSize(1);
+ setNoRepair();
+ }
+
+ @Override
+ public void addInformation(final ItemStack itemStack, final EntityPlayer player, final List<String> tooltip,
+ final boolean p_77624_4_) {
+ super.addInformation(itemStack, player, tooltip, p_77624_4_);
+
+ final Optional<State> cardState = getCardState(itemStack);
+ if (cardState.isPresent()) {
+ final State state = cardState.get();
+
+ if (state == State.SELF_DESTRUCTED) {
+ tooltip.add(StatCollector.translateToLocal("gt.item.adv_sensor_card.tooltip.fried.1"));
+ tooltip.add(StatCollector.translateToLocal("gt.item.adv_sensor_card.tooltip.fried.2"));
+ tooltip.add(StatCollector.translateToLocal("gt.item.adv_sensor_card.tooltip.fried.3"));
+ } else {
+ getMachineName(itemStack).ifPresent(
+ machineName -> tooltip.add(
+ StatCollector
+ .translateToLocalFormatted("gt.item.adv_sensor_card.tooltip.machine", machineName)));
+ getUUID(itemStack).ifPresent(
+ uuid -> tooltip.add(
+ StatCollector
+ .translateToLocalFormatted("gt.item.adv_sensor_card.tooltip.frequency", uuid.toString())));
+ }
+ } else {
+ tooltip.add(StatCollector.translateToLocal("gt.item.adv_sensor_card.tooltip.recipe_hint"));
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aOutputSubItems) {}
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(final IIconRegister aIconRegister) {
+ super.registerIcons(aIconRegister);
+ itemIcon = aIconRegister.registerIcon(GregTech.ID + ":gt.advancedsensorcard");
+ normalIcon = itemIcon;
+ selfDestructedIcon = aIconRegister.registerIcon(GregTech.ID + ":gt.advancedsensorcardburned");
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(final ItemStack stack, final int renderPass) {
+ return getIconIndex(stack);
+ }
+
+ @Override
+ public IIcon getIconIndex(final ItemStack itemStack) {
+ return getCardState(itemStack).filter(Predicate.isEqual(State.SELF_DESTRUCTED))
+ .map(ignored -> selfDestructedIcon)
+ .orElse(normalIcon);
+ }
+
+ @Override
+ public CardState update(TileEntity tileEntity, ICardWrapper card, int maxRange) {
+ return update(tileEntity.getWorldObj(), card, maxRange);
+ }
+
+ @Override
+ public CardState update(World world, ICardWrapper card, int maxRange) {
+ final Optional<GlobalMetricsCoverDatabase.Data> optionalData = getDataFromDatabase(card);
+
+ optionalData.ifPresent(data -> {
+ final State machineState = data.getState();
+ reconcileSelfDestructedCard(card.getItemStack(), machineState);
+ card.setInt(CARD_STATE_KEY, machineState.getType());
+
+ getMachineName(card.getItemStack())
+ .ifPresent(name -> card.setString(MACHINE_NAME_KEY, machineState == State.SELF_DESTRUCTED ? "" : name));
+
+ final ImmutableList.Builder<String> builder = ImmutableList.builder();
+ switch (machineState) {
+ case SELF_DESTRUCTED -> builder.add(SELF_DESTRUCTED_OUTPUT);
+ case HOST_DECONSTRUCTED -> builder.addAll(DECONSTRUCTED_OUTPUT);
+ case OPERATIONAL -> {
+ data.getCoordinates()
+ .ifPresent(
+ coordinates -> builder.add(
+ StatCollector.translateToLocalFormatted(
+ "gt.item.adv_sensor_card.dimension",
+ coordinates.getDimension()),
+ StatCollector.translateToLocalFormatted(
+ "gt.item.adv_sensor_card.coords",
+ coordinates.getLocalizedCoordinates())));
+
+ data.getPayload()
+ .ifPresent(builder::addAll);
+ }
+ default -> builder.add(NO_DATA_FOUND);
+ }
+
+ final List<String> payload = builder.build();
+ card.setInt(OUTPUT_ENTRY_LENGTH_KEY, payload.size());
+ for (int i = 0; i < payload.size(); i++) {
+ card.setString(String.format(OUTPUT_ENTRY_KEY, i), payload.get(i));
+ }
+ });
+
+ return CardState.OK;
+ }
+
+ @Override
+ public List<PanelString> getStringData(final int displaySettings, final ICardWrapper card,
+ final boolean showLabels) {
+ final List<PanelString> returned = new ArrayList<>();
+ final String machineName = card.getString(MACHINE_NAME_KEY);
+ final int bitmaskOffset;
+
+ payloadSize = card.getInt(OUTPUT_ENTRY_LENGTH_KEY);
+
+ if (!machineName.isEmpty() && (displaySettings & 1) != 0) {
+ returned.add(panelString(machineName, true));
+ payloadSize += 1;
+ bitmaskOffset = 1;
+ } else {
+ bitmaskOffset = 0;
+ }
+
+ // Not reusing payloadSize here because it can be conditionally mutated.
+ IntStream.range(0, card.getInt(OUTPUT_ENTRY_LENGTH_KEY))
+ .forEach(i -> {
+ if ((displaySettings & 1 << (i + bitmaskOffset)) != 0) {
+ returned.add(panelString(card.getString(String.format(OUTPUT_ENTRY_KEY, i))));
+ }
+ });
+
+ return returned;
+ }
+
+ @Override
+ public List<PanelSetting> getSettingsList() {
+ return payloadSize == 0 ? ImmutableList.of()
+ : ImmutableList.copyOf(
+ IntStream.range(0, Math.min(payloadSize, 31))
+ .mapToObj(i -> new PanelSetting(String.valueOf(i + 1), 1 << i, getCardType()))
+ .iterator());
+ }
+
+ @Override
+ public UUID getCardType() {
+ return CARD_TYPE_ID;
+ }
+
+ @Override
+ public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int slot, boolean isHeld) {
+ super.onUpdate(stack, worldIn, entityIn, slot, isHeld);
+ // At the time of this comment's writing, there are 52 matches of the regex:
+ // /% \d+0 \)?\s*== 0/ in the code base, indicating an over-reliance on events happening on either the 10th or
+ // 20th tick. Let's tick on something slightly off of that. A prime number will do nicely.
+ if ((worldIn.getWorldTime() % 20) == 13) {
+ getDataFromDatabase(stack).ifPresent(data -> {
+ reconcileSelfDestructedCard(stack, data.getState());
+ if (!stack.hasTagCompound()) {
+ stack.setTagCompound(new NBTTagCompound());
+ }
+
+ stack.getTagCompound()
+ .setInteger(
+ CARD_STATE_KEY,
+ data.getState()
+ .getType());
+ });
+ }
+ }
+
+ private void reconcileSelfDestructedCard(ItemStack stack, State newState) {
+ getUUID(stack).ifPresent(uuid -> getCardState(stack).ifPresent(oldState -> {
+ if (newState == State.SELF_DESTRUCTED && oldState != State.SELF_DESTRUCTED) {
+ GlobalMetricsCoverDatabase.clearSelfDestructedFrequency(uuid);
+ }
+ }));
+
+ }
+
+ @NotNull
+ private Optional<State> getCardState(ICardWrapper card) {
+ return getCardState(card.getItemStack());
+ }
+
+ @NotNull
+ private Optional<State> getCardState(ItemStack itemStack) {
+ if (itemStack.hasTagCompound() && itemStack.getTagCompound()
+ .hasKey(CARD_STATE_KEY)) {
+ return State.find(
+ itemStack.getTagCompound()
+ .getInteger(CARD_STATE_KEY));
+ }
+
+ return Optional.empty();
+ }
+
+ @NotNull
+ private Optional<UUID> getUUID(ItemStack stack) {
+ if (stack.hasTagCompound()) {
+ NBTTagCompound nbt = stack.getTagCompound();
+ if (nbt.hasKey(FREQUENCY_LSB_KEY) && nbt.hasKey(FREQUENCY_MSB_KEY)) {
+ return Optional.of(new UUID(nbt.getLong(FREQUENCY_MSB_KEY), nbt.getLong(FREQUENCY_LSB_KEY)));
+ }
+ }
+
+ return Optional.empty();
+ }
+
+ @NotNull
+ private Optional<String> getMachineName(ItemStack stack) {
+ if (stack.hasTagCompound() && stack.getTagCompound()
+ .hasKey(MACHINE_KEY)) {
+ try {
+ final ItemStack machine = ItemStack.loadItemStackFromNBT(
+ stack.getTagCompound()
+ .getCompoundTag(MACHINE_KEY));
+ if (machine != null) {
+ return Optional.of(machine.getDisplayName());
+ }
+ } catch (Exception ignored) {}
+ }
+
+ return Optional.empty();
+ }
+
+ @NotNull
+ private Optional<GlobalMetricsCoverDatabase.Data> getDataFromDatabase(ICardWrapper card) {
+ return getDataFromDatabase(card.getItemStack());
+ }
+
+ @NotNull
+ private Optional<GlobalMetricsCoverDatabase.Data> getDataFromDatabase(ItemStack stack) {
+ return getUUID(stack).flatMap(GlobalMetricsCoverDatabase::getData);
+ }
+
+ @NotNull
+ private static PanelString panelString(String info) {
+ return panelString(info, false);
+ }
+
+ @NotNull
+ private static PanelString panelString(String info, boolean center) {
+ final PanelString panelString = new PanelString();
+ if (center) {
+ panelString.textCenter = info;
+ } else {
+ panelString.textLeft = info;
+ }
+ return panelString;
+
+ }
+}
diff --git a/src/main/java/gregtech/common/items/GT_DepletetCell_Item.java b/src/main/java/gregtech/common/items/GT_DepletetCell_Item.java
new file mode 100644
index 0000000000..df14adc39b
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_DepletetCell_Item.java
@@ -0,0 +1,49 @@
+package gregtech.common.items;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.items.GT_RadioactiveCellIC_Item;
+import ic2.api.reactor.IReactor;
+
+public class GT_DepletetCell_Item extends GT_RadioactiveCellIC_Item {
+
+ public GT_DepletetCell_Item(String aUnlocalized, String aEnglish, int aRadiation) {
+ super(aUnlocalized, aEnglish, 1, 1, 0, aRadiation, 0, null, false);
+ }
+
+ @Override
+ public void processChamber(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2,
+ boolean paramBoolean) {}
+
+ @Override
+ public boolean acceptUraniumPulse(IReactor paramIReactor, ItemStack paramItemStack1, ItemStack paramItemStack2,
+ int paramInt1, int paramInt2, int paramInt3, int paramInt4, boolean paramBoolean) {
+ return false;
+ }
+
+ @Override
+ public boolean canStoreHeat(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2) {
+ return false;
+ }
+
+ @Override
+ public int getMaxHeat(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2) {
+ return 0;
+ }
+
+ @Override
+ public int getCurrentHeat(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2) {
+ return 0;
+ }
+
+ @Override
+ public int alterHeat(IReactor paramIReactor, ItemStack paramItemStack, int paramInt1, int paramInt2,
+ int paramInt3) {
+ return 0;
+ }
+
+ @Override
+ public float influenceExplosion(IReactor paramIReactor, ItemStack paramItemStack) {
+ return 0.0F;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/GT_FluidDisplayItem.java b/src/main/java/gregtech/common/items/GT_FluidDisplayItem.java
new file mode 100644
index 0000000000..850fe21811
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_FluidDisplayItem.java
@@ -0,0 +1,181 @@
+package gregtech.common.items;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Stream;
+
+import net.minecraft.client.Minecraft;
+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.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.items.GT_Generic_Item;
+import gregtech.api.util.GT_Utility;
+
+public class GT_FluidDisplayItem extends GT_Generic_Item {
+
+ private static final Map<Fluid, String> sFluidTooltips = new HashMap<>();
+
+ public GT_FluidDisplayItem() {
+ super("GregTech_FluidDisplay", "Fluid Display", null);
+ ItemList.Display_Fluid.set(this);
+ }
+
+ @Override
+ protected void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
+ if (FluidRegistry.getFluid(aStack.getItemDamage()) != null) {
+ String tChemicalFormula = getChemicalFormula(
+ new FluidStack(FluidRegistry.getFluid(aStack.getItemDamage()), 1));
+ if (!tChemicalFormula.isEmpty())
+ aList.add(EnumChatFormatting.YELLOW + tChemicalFormula + EnumChatFormatting.RESET);
+ }
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (GT_Values.D1 || Minecraft.getMinecraft().gameSettings.advancedItemTooltips) {
+ Fluid tFluid = FluidRegistry.getFluid(aStack.getItemDamage());
+ if (tFluid != null) {
+ aList.add("Registry: " + tFluid.getName());
+ }
+ }
+ if (aNBT != null) {
+ long tToolTipAmount = aNBT.getLong("mFluidDisplayAmount");
+ if (tToolTipAmount > 0L) {
+ aList.add(
+ EnumChatFormatting.BLUE + "Amount: "
+ + GT_Utility.formatNumbers(tToolTipAmount)
+ + " L"
+ + EnumChatFormatting.GRAY);
+ }
+ aList.add(
+ EnumChatFormatting.RED + "Temperature: "
+ + GT_Utility.formatNumbers(aNBT.getLong("mFluidDisplayHeat"))
+ + " K"
+ + EnumChatFormatting.GRAY);
+ aList.add(
+ EnumChatFormatting.GREEN
+ + String.format(transItem("018", "State: %s"), aNBT.getBoolean("mFluidState") ? "Gas" : "Liquid")
+ + EnumChatFormatting.GRAY);
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aIconRegister) {}
+
+ @Override
+ public IIcon getIconFromDamage(int aMetaData) {
+ return Stream.of(FluidRegistry.getFluid(aMetaData), FluidRegistry.WATER)
+ .filter(Objects::nonNull)
+ .map(Fluid::getStillIcon)
+ .filter(Objects::nonNull)
+ .findFirst()
+ .orElseThrow(IllegalStateException::new);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack aStack, int aRenderPass) {
+ Fluid tFluid = FluidRegistry.getFluid(aStack.getItemDamage());
+ return tFluid == null ? 16777215 : tFluid.getColor();
+ }
+
+ @Override
+ public int getSpriteNumber() {
+ return 0;
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack aStack) {
+ if (aStack != null) {
+ return GT_Utility.getFluidName(FluidRegistry.getFluid(aStack.getItemDamage()), false);
+ }
+ return "";
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ if (aStack != null) {
+ return GT_Utility.getFluidName(FluidRegistry.getFluid(aStack.getItemDamage()), true);
+ }
+ return "";
+ }
+
+ @SideOnly(Side.CLIENT)
+ public static String getChemicalFormula(FluidStack aRealFluid) {
+ return sFluidTooltips.computeIfAbsent(aRealFluid.getFluid(), fluid -> {
+ for (ItemStack tContainer : GT_Utility.getContainersFromFluid(aRealFluid)) {
+ if (isCell(tContainer)) {
+ Materials tMaterial = getMaterialFromCell(tContainer);
+ if (!tMaterial.equals(Materials._NULL)) {
+ if (tMaterial.mChemicalFormula.equals("?")) {
+ return "";
+ } else {
+ return tMaterial.mChemicalFormula;
+ }
+ } else {
+ // For GT++ Fluid Display
+ // GT++ didn't register a Material in GT, so I have too find the Chemical Formula in its cell's
+ // tooltip
+ List<String> tTooltip = tContainer.getTooltip(null, true);
+ for (String tInfo : tTooltip) {
+ if (!tInfo.contains(" ") && !tInfo.contains(":") && tTooltip.indexOf(tInfo) != 0) {
+ return tInfo;
+ }
+ }
+ }
+ }
+ }
+ return "";
+ });
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item aItem, CreativeTabs aTab, List<ItemStack> aList) {
+ if (GT_Values.D1) {
+ int i = 0;
+ for (int j = FluidRegistry.getMaxID(); i < j; i++) {
+ ItemStack tStack = GT_Utility.getFluidDisplayStack(FluidRegistry.getFluid(i));
+ if (tStack != null) {
+ aList.add(tStack);
+ }
+ }
+ }
+ }
+
+ public static boolean isCell(ItemStack tItemStack) {
+ for (int tOreDict : OreDictionary.getOreIDs(tItemStack)) {
+ String tOreDictName = OreDictionary.getOreName(tOreDict);
+ if (tOreDictName.startsWith("cell")) return true;
+ }
+ return false;
+ }
+
+ public static Materials getMaterialFromCell(ItemStack tItemStack) {
+ for (int tOreDict : OreDictionary.getOreIDs(tItemStack)) {
+ String tOreDictName = OreDictionary.getOreName(tOreDict);
+ if (tOreDictName.startsWith("cell")) {
+ return Materials.getRealMaterial(
+ tOreDictName.replace("cell", "")
+ .replace("Molten", "")
+ .replace("Plasma", ""));
+ }
+ }
+ return Materials._NULL;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java b/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java
new file mode 100644
index 0000000000..0dc5000e7a
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java
@@ -0,0 +1,328 @@
+package gregtech.common.items;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.function.Predicate;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+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.ChatComponentText;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.FakePlayer;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.gtnewhorizons.modularui.api.UIInfos;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.INetworkUpdatableItem;
+import gregtech.api.items.GT_Generic_Item;
+import gregtech.api.net.GT_Packet_UpdateItem;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.gui.modularui.uifactory.SelectItemUIFactory;
+
+public class GT_IntegratedCircuit_Item extends GT_Generic_Item implements INetworkUpdatableItem {
+
+ private static final String aTextEmptyRow = " ";
+ private static final List<ItemStack> ALL_VARIANTS = new ArrayList<>();
+ protected final IIcon[] mIconDamage = new IIcon[25];
+
+ public GT_IntegratedCircuit_Item() {
+ super("integrated_circuit", "Programmed Circuit", "");
+ setHasSubtypes(true);
+ setMaxDamage(0);
+
+ ItemList.Circuit_Integrated.set(this);
+
+ ALL_VARIANTS.add(new ItemStack(this, 0, 0));
+ for (int i = 1; i <= 24; i++) {
+ ItemStack aStack = new ItemStack(this, 0, i);
+ GregTech_API.registerConfigurationCircuit(aStack, 1);
+ ALL_VARIANTS.add(aStack);
+ }
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 0L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { OrePrefixes.circuit.get(Materials.Basic) });
+ long bits = GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE;
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 1L),
+ bits,
+ new Object[] { "d ", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 2L),
+ bits,
+ new Object[] { " d ", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 3L),
+ bits,
+ new Object[] { " d", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 4L),
+ bits,
+ new Object[] { aTextEmptyRow, " Pd", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 5L),
+ bits,
+ new Object[] { aTextEmptyRow, " P ", " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 6L),
+ bits,
+ new Object[] { aTextEmptyRow, " P ", " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 7L),
+ bits,
+ new Object[] { aTextEmptyRow, " P ", "d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 8L),
+ bits,
+ new Object[] { aTextEmptyRow, "dP ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 9L),
+ bits,
+ new Object[] { "P d", aTextEmptyRow, aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 10L),
+ bits,
+ new Object[] { "P ", " d", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 11L),
+ bits,
+ new Object[] { "P ", aTextEmptyRow, " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 12L),
+ bits,
+ new Object[] { "P ", aTextEmptyRow, " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 13L),
+ bits,
+ new Object[] { " P", aTextEmptyRow, " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 14L),
+ bits,
+ new Object[] { " P", aTextEmptyRow, " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 15L),
+ bits,
+ new Object[] { " P", aTextEmptyRow, "d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 16L),
+ bits,
+ new Object[] { " P", "d ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 17L),
+ bits,
+ new Object[] { aTextEmptyRow, aTextEmptyRow, "d P", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 18L),
+ bits,
+ new Object[] { aTextEmptyRow, "d ", " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 19L),
+ bits,
+ new Object[] { "d ", aTextEmptyRow, " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 20L),
+ bits,
+ new Object[] { " d ", aTextEmptyRow, " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 21L),
+ bits,
+ new Object[] { "d ", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 22L),
+ bits,
+ new Object[] { " d ", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 23L),
+ bits,
+ new Object[] { " d", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Circuit_Integrated.getWithDamage(1L, 24L),
+ bits,
+ new Object[] { aTextEmptyRow, " d", "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L) });
+ }
+
+ private static String getModeString(int aMetaData) {
+ return switch ((byte) (aMetaData >>> 8)) {
+ case 0 -> "==";
+ case 1 -> "<=";
+ case 2 -> ">=";
+ case 3 -> "<";
+ case 4 -> ">";
+ default -> "";
+ };
+ }
+
+ private static String getConfigurationString(int aMetaData) {
+ return getModeString(aMetaData) + " " + (byte) (aMetaData & 0xFF);
+ }
+
+ @Override
+ public void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
+ super.addAdditionalToolTips(aList, aStack, aPlayer);
+ aList.add(
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".configuration", "Configuration: ")
+ + getConfigurationString(getDamage(aStack)));
+ aList.add(
+ GT_LanguageManager
+ .addStringLocalization(getUnlocalizedName() + ".tooltip.0", "Right click to reconfigure"));
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + ".tooltip.1",
+ "Needs a screwdriver or circuit programming tool"));
+ }
+
+ @Override
+ public String getUnlocalizedName(ItemStack aStack) {
+ return getUnlocalizedName();
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void getSubItems(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ aList.add(new ItemStack(this, 1, 0));
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aIconRegister) {
+ super.registerIcons(aIconRegister);
+ for (int i = 0; i < mIconDamage.length; i++) {
+ mIconDamage[i] = aIconRegister
+ .registerIcon(GregTech.getResourcePath(GT_Config.troll ? "troll" : getUnlocalizedName() + "/" + i));
+ }
+ if (GregTech_API.sPostloadFinished) {
+ GT_Log.out.println("GT_Mod: Starting Item Icon Load Phase");
+ GT_FML_LOGGER.info("GT_Mod: Starting Item Icon Load Phase");
+ GregTech_API.sItemIcons = aIconRegister;
+ try {
+ for (Runnable tRunnable : GregTech_API.sGTItemIconload) {
+ tRunnable.run();
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ GT_Log.out.println("GT_Mod: Finished Item Icon Load Phase");
+ GT_FML_LOGGER.info("GT_Mod: Finished Item Icon Load Phase");
+ }
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int aMetaData) {
+ byte circuitMode = ((byte) (aMetaData & 0xFF)); // Mask out the MSB Comparison Mode Bits. See: getModeString
+ return mIconDamage[circuitMode < mIconDamage.length ? circuitMode : 0];
+ }
+
+ @Override
+ public boolean receive(ItemStack stack, EntityPlayerMP player, NBTTagCompound tag) {
+ int meta = tag.hasKey("meta", Constants.NBT.TAG_BYTE) ? tag.getByte("meta") : -1;
+ if (meta < 0 || meta > 24) return true;
+
+ if (!player.capabilities.isCreativeMode) {
+ Pair<Integer, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> toolIndex = findConfiguratorInInv(player);
+ if (toolIndex == null) return true;
+
+ ItemStack[] mainInventory = player.inventory.mainInventory;
+ mainInventory[toolIndex.getKey()] = toolIndex.getValue()
+ .apply(mainInventory[toolIndex.getKey()], player);
+ }
+ stack.setItemDamage(meta);
+
+ return true;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
+ // nothing on server side or fake player
+ if (player instanceof FakePlayer || !world.isRemote) return stack;
+ // check if any screwdriver
+ ItemStack configuratorStack;
+ if (player.capabilities.isCreativeMode) {
+ configuratorStack = null;
+ } else {
+ Pair<Integer, ?> configurator = findConfiguratorInInv(player);
+ if (configurator == null) {
+ int count;
+ try {
+ count = Integer
+ .parseInt(StatCollector.translateToLocal("GT5U.item.programmed_circuit.no_screwdriver.count"));
+ } catch (NumberFormatException e) {
+ player.addChatComponentMessage(
+ new ChatComponentText(
+ "Error in translation GT5U.item.programmed_circuit.no_screwdriver.count: "
+ + e.getMessage()));
+ count = 1;
+ }
+ player.addChatComponentMessage(
+ new ChatComponentTranslation(
+ "GT5U.item.programmed_circuit.no_screwdriver." + XSTR.XSTR_INSTANCE.nextInt(count)));
+ return stack;
+ }
+ configuratorStack = player.inventory.mainInventory[configurator.getKey()];
+ }
+ openSelectorGui(configuratorStack, stack.getItemDamage(), player);
+ return stack;
+ }
+
+ private void openSelectorGui(ItemStack configurator, int meta, EntityPlayer player) {
+ UIInfos.openClientUI(
+ player,
+ buildContext -> new SelectItemUIFactory(
+ StatCollector.translateToLocal("GT5U.item.programmed_circuit.select.header"),
+ configurator,
+ GT_IntegratedCircuit_Item::onConfigured,
+ ALL_VARIANTS,
+ meta,
+ true).createWindow(buildContext));
+ }
+
+ private static void onConfigured(ItemStack stack) {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setByte("meta", (byte) stack.getItemDamage());
+ GT_Values.NW.sendToServer(new GT_Packet_UpdateItem(tag));
+ }
+
+ private static Pair<Integer, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> findConfiguratorInInv(
+ EntityPlayer player) {
+ ItemStack[] mainInventory = player.inventory.mainInventory;
+ for (int j = 0, mainInventoryLength = mainInventory.length; j < mainInventoryLength; j++) {
+ ItemStack toolStack = mainInventory[j];
+
+ if (!GT_Utility.isStackValid(toolStack)) continue;
+
+ for (Map.Entry<Predicate<ItemStack>, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> p : GregTech_API.sCircuitProgrammerList
+ .entrySet())
+ if (p.getKey()
+ .test(toolStack)) return Pair.of(j, p.getValue());
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_01.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_01.java
new file mode 100644
index 0000000000..ae1d2568f7
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_01.java
@@ -0,0 +1,4627 @@
+package gregtech.common.items;
+
+import static gregtech.api.enums.Mods.GalacticraftMars;
+import static gregtech.api.enums.Textures.BlockIcons.COVER_WOOD_PLATE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ACTIVITYDETECTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ACTIVITYDETECTOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ARM;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_CONTROLLER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_CONVEYOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_CRAFTING;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DRAIN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGYDETECTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUIDDETECTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FLUID_STORAGE_MONITOR0;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ITEMDETECTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MAINTENANCE_DETECTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PUMP;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_REDSTONE_RECEIVER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_REDSTONE_TRANSMITTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SCREEN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SCREEN_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SHUTTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_VALVE;
+import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL;
+import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_8V;
+import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_EV;
+import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_HV;
+import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_IV;
+import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_LV;
+import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_LuV;
+import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_MV;
+import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_UV;
+import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_ZPM;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.cannerRecipes;
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.recipe.RecipeMaps.packagerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.client.GT_TooltipHandler.Tier.ERV;
+import static gregtech.client.GT_TooltipHandler.Tier.EV;
+import static gregtech.client.GT_TooltipHandler.Tier.HV;
+import static gregtech.client.GT_TooltipHandler.Tier.IV;
+import static gregtech.client.GT_TooltipHandler.Tier.LV;
+import static gregtech.client.GT_TooltipHandler.Tier.LuV;
+import static gregtech.client.GT_TooltipHandler.Tier.MAX;
+import static gregtech.client.GT_TooltipHandler.Tier.MV;
+import static gregtech.client.GT_TooltipHandler.Tier.ULV;
+import static gregtech.client.GT_TooltipHandler.Tier.UMV;
+import static gregtech.client.GT_TooltipHandler.Tier.UV;
+import static gregtech.client.GT_TooltipHandler.Tier.UXV;
+import static gregtech.client.GT_TooltipHandler.Tier.ZPM;
+import static gregtech.client.GT_TooltipHandler.registerTieredTooltip;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.EnumAction;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.Potion;
+import net.minecraft.util.MathHelper;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OreDictNames;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.enums.TierEU;
+import gregtech.api.interfaces.IItemBehaviour;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Item_X32;
+import gregtech.api.objects.ItemData;
+import gregtech.api.objects.MaterialStack;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_FoodStat;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.covers.GT_Cover_Arm;
+import gregtech.common.covers.GT_Cover_ControlsWork;
+import gregtech.common.covers.GT_Cover_Conveyor;
+import gregtech.common.covers.GT_Cover_Crafting;
+import gregtech.common.covers.GT_Cover_DoesWork;
+import gregtech.common.covers.GT_Cover_Drain;
+import gregtech.common.covers.GT_Cover_EUMeter;
+import gregtech.common.covers.GT_Cover_FluidLimiter;
+import gregtech.common.covers.GT_Cover_FluidRegulator;
+import gregtech.common.covers.GT_Cover_FluidStorageMonitor;
+import gregtech.common.covers.GT_Cover_Fluidfilter;
+import gregtech.common.covers.GT_Cover_ItemFilter;
+import gregtech.common.covers.GT_Cover_ItemMeter;
+import gregtech.common.covers.GT_Cover_LiquidMeter;
+import gregtech.common.covers.GT_Cover_NeedMaintainance;
+import gregtech.common.covers.GT_Cover_PlayerDetector;
+import gregtech.common.covers.GT_Cover_Pump;
+import gregtech.common.covers.GT_Cover_RedstoneReceiverExternal;
+import gregtech.common.covers.GT_Cover_RedstoneReceiverInternal;
+import gregtech.common.covers.GT_Cover_RedstoneTransmitterExternal;
+import gregtech.common.covers.GT_Cover_RedstoneTransmitterInternal;
+import gregtech.common.covers.GT_Cover_Screen;
+import gregtech.common.covers.GT_Cover_Shutter;
+import gregtech.common.covers.GT_Cover_SolarPanel;
+import gregtech.common.covers.GT_Cover_SteamRegulator;
+import gregtech.common.covers.GT_Cover_SteamValve;
+import gregtech.common.items.behaviors.Behaviour_Arrow_Potion;
+import gregtech.common.items.behaviors.Behaviour_Cover_Tool;
+import gregtech.common.items.behaviors.Behaviour_DataOrb;
+import gregtech.common.items.behaviors.Behaviour_DataStick;
+import gregtech.common.items.behaviors.Behaviour_Lighter;
+import gregtech.common.items.behaviors.Behaviour_PrintedPages;
+import gregtech.common.items.behaviors.Behaviour_Scanner;
+import gregtech.common.items.behaviors.Behaviour_SensorKit;
+import gregtech.common.items.behaviors.Behaviour_Sonictron;
+import gregtech.common.items.behaviors.Behaviour_Spray_Color;
+import gregtech.common.items.behaviors.Behaviour_Spray_Color_Remover;
+import gregtech.common.items.behaviors.Behaviour_WrittenBook;
+
+public class GT_MetaGenerated_Item_01 extends GT_MetaGenerated_Item_X32 {
+
+ public static GT_MetaGenerated_Item_01 INSTANCE;
+ private final String mToolTipPurify = GT_LanguageManager
+ .addStringLocalization("metaitem.01.tooltip.purify", "Throw into Cauldron to get clean Dust");
+ private static final String aTextArrow = " A";
+ private static final String aTextStick = " S ";
+ private static final String aTextFeather = "F ";
+ private static final String aTextEmptyRow = " ";
+ private static final String aTextShape = " P ";
+ private static final String PartCoverText = " L/t (";
+ private static final String PartCoverText2 = " L/s) as Cover";
+ private static final String PartNotCoverText = "Cannot be used as a Cover";
+ private static final String RAText = "Grabs from and inserts into specific slots";
+ private static final String FRText1 = "Configurable up to ";
+ private static final String FRText2 = " L/sec (as Cover)/n Rightclick/Screwdriver-rightclick/Shift-screwdriver-rightclick/n to adjust the pump speed by 1/16/256 L/sec per click";
+
+ public GT_MetaGenerated_Item_01() {
+ super(
+ "metaitem.01",
+ OrePrefixes.dustTiny,
+ OrePrefixes.dustSmall,
+ OrePrefixes.dust,
+ OrePrefixes.dustImpure,
+ OrePrefixes.dustPure,
+ OrePrefixes.crushed,
+ OrePrefixes.crushedPurified,
+ OrePrefixes.crushedCentrifuged,
+ OrePrefixes.gem,
+ OrePrefixes.nugget,
+ null,
+ OrePrefixes.ingot,
+ OrePrefixes.ingotHot,
+ OrePrefixes.ingotDouble,
+ OrePrefixes.ingotTriple,
+ OrePrefixes.ingotQuadruple,
+ OrePrefixes.ingotQuintuple,
+ OrePrefixes.plate,
+ OrePrefixes.plateDouble,
+ OrePrefixes.plateTriple,
+ OrePrefixes.plateQuadruple,
+ OrePrefixes.plateQuintuple,
+ OrePrefixes.plateDense,
+ OrePrefixes.stick,
+ OrePrefixes.lens,
+ OrePrefixes.round,
+ OrePrefixes.bolt,
+ OrePrefixes.screw,
+ OrePrefixes.ring,
+ OrePrefixes.foil,
+ OrePrefixes.cell,
+ OrePrefixes.cellPlasma);
+ INSTANCE = this;
+
+ int tLastID = 0;
+
+ setBurnValue(17000 + Materials.Wood.mMetaItemSubID, 1600);
+ GT_OreDictUnificator.addToBlacklist(new ItemStack(this, 1, 17000 + Materials.Wood.mMetaItemSubID));
+
+ // Compressor recipe
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 8L))
+ .itemOutputs(new ItemStack(this, 1, 17000 + Materials.Wood.mMetaItemSubID))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+ }
+
+ GregTech_API.registerCover(
+ new ItemStack(this, 1, 17000 + Materials.Wood.mMetaItemSubID),
+ TextureFactory.of(COVER_WOOD_PLATE),
+ null);
+
+ ItemStack tStack = new ItemStack(this, 1, 17000 + Materials.Wood.mMetaItemSubID);
+ tStack.setStackDisplayName("The holy Planks of Sengir");
+ GT_Utility.ItemNBT.addEnchantment(tStack, Enchantment.smite, 10);
+ GT_ModHandler.addCraftingRecipe(
+ tStack,
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "XXX", "XDX", "XXX", 'X', OrePrefixes.gem.get(Materials.NetherStar), 'D',
+ new ItemStack(Blocks.dragon_egg, 1, 32767) });
+
+ ItemList.Credit_Greg_Copper.set(addItem(tLastID = 0, "Copper GT Credit", "0.125 Credits"));
+ ItemList.Credit_Greg_Cupronickel.set(
+ addItem(tLastID = 1, "Cupronickel GT Credit", "1 Credit", new ItemData(Materials.Cupronickel, 907200L)));
+ ItemList.Credit_Greg_Silver.set(
+ addItem(
+ tLastID = 2,
+ "Silver GT Credit",
+ "8 Credits",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L)));
+ ItemList.Credit_Greg_Gold.set(addItem(tLastID = 3, "Gold GT Credit", "64 Credits"));
+ ItemList.Credit_Greg_Platinum.set(addItem(tLastID = 4, "Platinum GT Credit", "512 Credits"));
+ ItemList.Credit_Greg_Osmium.set(addItem(tLastID = 5, "Osmium GT Credit", "4,096 Credits"));
+ ItemList.Credit_Greg_Naquadah.set(addItem(tLastID = 6, "Naquadah GT Credit", "32,768 Credits"));
+ ItemList.Credit_Greg_Neutronium.set(addItem(tLastID = 7, "Neutronium GT Credit", "262,144 Credits"));
+ ItemList.Coin_Gold_Ancient.set(
+ addItem(
+ tLastID = 8,
+ "Ancient Gold Coin",
+ "Found in ancient Ruins",
+ new ItemData(Materials.Gold, 907200L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 8L)));
+ ItemList.Coin_Doge.set(
+ addItem(
+ tLastID = 9,
+ "Doge Coin",
+ "wow much coin how money so crypto plz mine v rich very currency wow",
+ new ItemData(Materials.Brass, 907200L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L)));
+ ItemList.Coin_Chocolate.set(
+ addItem(
+ tLastID = 10,
+ "Chocolate Coin",
+ "Wrapped in Gold",
+ new ItemData(Materials.Gold, OrePrefixes.foil.mMaterialAmount),
+ new GT_FoodStat(
+ 1,
+ 0.1F,
+ EnumAction.eat,
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gold, 1L),
+ true,
+ false,
+ false,
+ Potion.moveSpeed.id,
+ 200,
+ 1,
+ 100)));
+ ItemList.Credit_Copper.set(addItem(tLastID = 11, "Industrial Copper Credit", "0.125 Credits"));
+
+ ItemList.Credit_Silver.set(
+ addItem(
+ tLastID = 13,
+ "Industrial Silver Credit",
+ "8 Credits",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L)));
+ ItemList.Credit_Gold.set(addItem(tLastID = 14, "Industrial Gold Credit", "64 Credits"));
+ ItemList.Credit_Platinum.set(addItem(tLastID = 15, "Industrial Platinum Credit", "512 Credits"));
+ ItemList.Credit_Osmium.set(addItem(tLastID = 16, "Industrial Osmium Credit", "4096 Credits"));
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Coin_Chocolate.get(1L),
+ new Object[] { OrePrefixes.dust.get(Materials.Cocoa), OrePrefixes.dust.get(Materials.Milk),
+ OrePrefixes.dust.get(Materials.Sugar), OrePrefixes.foil.get(Materials.Gold) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Copper.get(8L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Iron });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Iron.get(8L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Silver });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Silver.get(8L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Gold });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Gold.get(8L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Platinum });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Platinum.get(8L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Osmium });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Iron.get(1L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Copper, ItemList.Credit_Copper, ItemList.Credit_Copper,
+ ItemList.Credit_Copper, ItemList.Credit_Copper, ItemList.Credit_Copper, ItemList.Credit_Copper,
+ ItemList.Credit_Copper });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Silver.get(1L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Iron, ItemList.Credit_Iron, ItemList.Credit_Iron, ItemList.Credit_Iron,
+ ItemList.Credit_Iron, ItemList.Credit_Iron, ItemList.Credit_Iron, ItemList.Credit_Iron });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Gold.get(1L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Silver, ItemList.Credit_Silver, ItemList.Credit_Silver,
+ ItemList.Credit_Silver, ItemList.Credit_Silver, ItemList.Credit_Silver, ItemList.Credit_Silver,
+ ItemList.Credit_Silver });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Platinum.get(1L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Gold, ItemList.Credit_Gold, ItemList.Credit_Gold, ItemList.Credit_Gold,
+ ItemList.Credit_Gold, ItemList.Credit_Gold, ItemList.Credit_Gold, ItemList.Credit_Gold });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Osmium.get(1L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Platinum, ItemList.Credit_Platinum, ItemList.Credit_Platinum,
+ ItemList.Credit_Platinum, ItemList.Credit_Platinum, ItemList.Credit_Platinum, ItemList.Credit_Platinum,
+ ItemList.Credit_Platinum });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Copper.get(8L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Cupronickel });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Cupronickel.get(8L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Silver });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Silver.get(8L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Gold });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Gold.get(8L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Platinum });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Platinum.get(8L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Osmium });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Osmium.get(8L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Naquadah });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Naquadah.get(8L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Neutronium });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Cupronickel.get(1L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper,
+ ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper,
+ ItemList.Credit_Greg_Copper, ItemList.Credit_Greg_Copper });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Silver.get(1L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel,
+ ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel,
+ ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel, ItemList.Credit_Greg_Cupronickel });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Gold.get(1L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver,
+ ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver,
+ ItemList.Credit_Greg_Silver, ItemList.Credit_Greg_Silver });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Platinum.get(1L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold,
+ ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold,
+ ItemList.Credit_Greg_Gold, ItemList.Credit_Greg_Gold });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Osmium.get(1L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum,
+ ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum,
+ ItemList.Credit_Greg_Platinum, ItemList.Credit_Greg_Platinum });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Naquadah.get(1L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium,
+ ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium,
+ ItemList.Credit_Greg_Osmium, ItemList.Credit_Greg_Osmium });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Credit_Greg_Neutronium.get(1L),
+ GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah,
+ ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah,
+ ItemList.Credit_Greg_Naquadah, ItemList.Credit_Greg_Naquadah });
+
+ ItemList.Component_Minecart_Wheels_Iron.set(
+ addItem(
+ tLastID = 100,
+ "Iron Minecart Wheels",
+ "To get things rolling",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L)));
+ ItemList.Component_Minecart_Wheels_Steel.set(
+ addItem(
+ tLastID = 101,
+ "Steel Minecart Wheels",
+ "To get things rolling",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Component_Minecart_Wheels_Iron.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { " h ", "RSR", " w ", 'R', OrePrefixes.ring.get(Materials.AnyIron), 'S',
+ OrePrefixes.stick.get(Materials.AnyIron) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Component_Minecart_Wheels_Steel.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { " h ", "RSR", " w ", 'R', OrePrefixes.ring.get(Materials.Steel), 'S',
+ OrePrefixes.stick.get(Materials.Steel) });
+
+ ItemList.CompressedFireclay.set(addItem(tLastID = 110, "Compressed Fireclay", "Brick-shaped"));
+ ItemList.Firebrick.set(addItem(tLastID = 111, "Firebrick", "Heat resistant"));
+
+ ItemList.Arrow_Head_Glass_Emtpy.set(
+ addItem(
+ tLastID = 200,
+ "Empty Glass Arrow Head",
+ "Fill with Potions before use",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L)));
+ ItemList.Arrow_Head_Glass_Poison.set(
+ addItem(
+ tLastID = 201,
+ "Poison Glass Arrow Head",
+ "Glass Arrow filled with Poison",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Head_Glass_Poison_Long.set(
+ addItem(
+ tLastID = 202,
+ "Poison Glass Arrow Head",
+ "Glass Arrow filled with stretched Poison",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Head_Glass_Poison_Strong.set(
+ addItem(
+ tLastID = 203,
+ "Poison Glass Arrow Head",
+ "Glass Arrow filled with strong Poison",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Head_Glass_Slowness.set(
+ addItem(
+ tLastID = 204,
+ "Slowness Glass Arrow Head",
+ "Glass Arrow filled with Laming Brew",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Head_Glass_Slowness_Long.set(
+ addItem(
+ tLastID = 205,
+ "Slowness Glass Arrow Head",
+ "Glass Arrow filled with stretched Laming Brew",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Head_Glass_Weakness.set(
+ addItem(
+ tLastID = 206,
+ "Weakness Glass Arrow Head",
+ "Glass Arrow filled with Weakening Brew",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Head_Glass_Weakness_Long.set(
+ addItem(
+ tLastID = 207,
+ "Weakness Glass Arrow Head",
+ "Glass Arrow filled with stretched Weakening Brew",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Head_Glass_Holy_Water.set(
+ addItem(
+ tLastID = 208,
+ "Holy Water Glass Arrow Head",
+ "Glass Arrow filled with Holy Water",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AURAM, 1L)));
+
+ ItemList.Arrow_Wooden_Glass_Emtpy.set(
+ addItem(
+ tLastID = 225,
+ "Regular Glass Vial Arrow",
+ "Empty Glass Arrow",
+ new Behaviour_Arrow_Potion(1.0F, 6.0F),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L)));
+ ItemList.Arrow_Wooden_Glass_Poison.set(
+ addItem(
+ tLastID = 226,
+ "Regular Poison Arrow",
+ "Glass Arrow filled with Poison",
+ new Behaviour_Arrow_Potion(1.0F, 6.0F, Potion.poison.id, 450, 0, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Wooden_Glass_Poison_Long.set(
+ addItem(
+ tLastID = 227,
+ "Regular Poison Arrow",
+ "Glass Arrow filled with stretched Poison",
+ new Behaviour_Arrow_Potion(1.0F, 6.0F, Potion.poison.id, 900, 0, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Wooden_Glass_Poison_Strong.set(
+ addItem(
+ tLastID = 228,
+ "Regular Poison Arrow",
+ "Glass Arrow filled with strong Poison",
+ new Behaviour_Arrow_Potion(1.0F, 6.0F, Potion.poison.id, 450, 1, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Wooden_Glass_Slowness.set(
+ addItem(
+ tLastID = 229,
+ "Regular Slowness Arrow",
+ "Glass Arrow filled with Laming Brew",
+ new Behaviour_Arrow_Potion(1.0F, 6.0F, Potion.moveSlowdown.id, 900, 0, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Wooden_Glass_Slowness_Long.set(
+ addItem(
+ tLastID = 230,
+ "Regular Slowness Arrow",
+ "Glass Arrow filled with stretched Laming Brew",
+ new Behaviour_Arrow_Potion(1.0F, 6.0F, Potion.moveSlowdown.id, 1800, 0, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Wooden_Glass_Weakness.set(
+ addItem(
+ tLastID = 231,
+ "Regular Weakness Arrow",
+ "Glass Arrow filled with Weakening Brew",
+ new Behaviour_Arrow_Potion(1.0F, 6.0F, Potion.weakness.id, 900, 0, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Wooden_Glass_Weakness_Long.set(
+ addItem(
+ tLastID = 232,
+ "Regular Weakness Arrow",
+ "Glass Arrow filled with stretched Weakening Brew",
+ new Behaviour_Arrow_Potion(1.0F, 6.0F, Potion.weakness.id, 1800, 0, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Wooden_Glass_Holy_Water.set(
+ addItem(
+ tLastID = 233,
+ "Regular Holy Water Arrow",
+ "Glass Arrow filled with Holy Water",
+ new Behaviour_Arrow_Potion(1.0F, 6.0F, Enchantment.smite, 10),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AURAM, 1L)));
+
+ ItemList.Arrow_Plastic_Glass_Emtpy.set(
+ addItem(
+ tLastID = 250,
+ "Light Glass Vial Arrow",
+ "Empty Glass Arrow",
+ new Behaviour_Arrow_Potion(1.5F, 6.0F),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L)));
+ ItemList.Arrow_Plastic_Glass_Poison.set(
+ addItem(
+ tLastID = 251,
+ "Light Poison Arrow",
+ "Glass Arrow filled with Poison",
+ new Behaviour_Arrow_Potion(1.5F, 6.0F, Potion.poison.id, 450, 0, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Plastic_Glass_Poison_Long.set(
+ addItem(
+ tLastID = 252,
+ "Light Poison Arrow",
+ "Glass Arrow filled with stretched Poison",
+ new Behaviour_Arrow_Potion(1.5F, 6.0F, Potion.poison.id, 900, 0, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Plastic_Glass_Poison_Strong.set(
+ addItem(
+ tLastID = 253,
+ "Light Poison Arrow",
+ "Glass Arrow filled with strong Poison",
+ new Behaviour_Arrow_Potion(1.5F, 6.0F, Potion.poison.id, 450, 1, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Plastic_Glass_Slowness.set(
+ addItem(
+ tLastID = 254,
+ "Light Slowness Arrow",
+ "Glass Arrow filled with Laming Brew",
+ new Behaviour_Arrow_Potion(1.5F, 6.0F, Potion.moveSlowdown.id, 900, 0, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Plastic_Glass_Slowness_Long.set(
+ addItem(
+ tLastID = 255,
+ "Light Slowness Arrow",
+ "Glass Arrow filled with stretched Laming Brew",
+ new Behaviour_Arrow_Potion(1.5F, 6.0F, Potion.moveSlowdown.id, 1800, 0, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Plastic_Glass_Weakness.set(
+ addItem(
+ tLastID = 256,
+ "Light Weakness Arrow",
+ "Glass Arrow filled with Weakening Brew",
+ new Behaviour_Arrow_Potion(1.5F, 6.0F, Potion.weakness.id, 900, 0, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Plastic_Glass_Weakness_Long.set(
+ addItem(
+ tLastID = 257,
+ "Light Weakness Arrow",
+ "Glass Arrow filled with stretched Weakening Brew",
+ new Behaviour_Arrow_Potion(1.5F, 6.0F, Potion.weakness.id, 1800, 0, 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)));
+ ItemList.Arrow_Plastic_Glass_Holy_Water.set(
+ addItem(
+ tLastID = 258,
+ "Light Holy Water Arrow",
+ "Glass Arrow filled with Holy Water",
+ new Behaviour_Arrow_Potion(1.5F, 6.0F, Enchantment.smite, 10),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AURAM, 1L)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Wooden_Glass_Emtpy.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Emtpy, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Wooden_Glass_Poison.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Poison, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Wooden_Glass_Poison_Long.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Poison_Long, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Wooden_Glass_Poison_Strong.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Poison_Strong, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Wooden_Glass_Slowness.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Slowness, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Wooden_Glass_Slowness_Long.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Slowness_Long, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Wooden_Glass_Weakness.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Weakness, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Wooden_Glass_Weakness_Long.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Weakness_Long, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Wooden_Glass_Holy_Water.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Holy_Water, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Wood) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Plastic_Glass_Emtpy.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Emtpy, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Plastic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Plastic_Glass_Poison.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Poison, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Plastic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Plastic_Glass_Poison_Long.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Poison_Long, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Plastic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Plastic_Glass_Poison_Strong.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Poison_Strong, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Plastic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Plastic_Glass_Slowness.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Slowness, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Plastic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Plastic_Glass_Slowness_Long.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Slowness_Long, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Plastic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Plastic_Glass_Weakness.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Weakness, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Plastic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Plastic_Glass_Weakness_Long.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Weakness_Long, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Plastic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Arrow_Plastic_Glass_Holy_Water.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextArrow, aTextStick, aTextFeather, 'A', ItemList.Arrow_Head_Glass_Holy_Water, 'F',
+ OreDictNames.craftingFeather, 'S', OrePrefixes.stick.get(Materials.Plastic) });
+
+ ItemList.Shape_Empty.set(
+ addItem(
+ tLastID = 300,
+ "Empty Shape Plate",
+ "Raw Plate to make Molds and Extruder Shapes",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L)));
+
+ ItemList.Shape_Mold_Plate.set(addItem(tLastID = 301, "Mold (Plate)", "Mold for making Plates"));
+ ItemList.Shape_Mold_Casing.set(addItem(tLastID = 302, "Mold (Casing)", "Mold for making Item Casings"));
+ ItemList.Shape_Mold_Gear.set(addItem(tLastID = 303, "Mold (Gear)", "Mold for making Gears"));
+ ItemList.Shape_Mold_Credit
+ .set(addItem(tLastID = 304, "Mold (Coinage)", "Secure Mold for making Coins (Don't lose it!)"));
+ ItemList.Shape_Mold_Bottle.set(addItem(tLastID = 305, "Mold (Bottle)", "Mold for making Bottles"));
+ ItemList.Shape_Mold_Ingot.set(addItem(tLastID = 306, "Mold (Ingot)", "Mold for making Ingots"));
+ ItemList.Shape_Mold_Ball.set(addItem(tLastID = 307, "Mold (Ball)", "Mold for making Balls"));
+ ItemList.Shape_Mold_Block.set(addItem(tLastID = 308, "Mold (Block)", "Mold for making Blocks"));
+ ItemList.Shape_Mold_Nugget.set(addItem(tLastID = 309, "Mold (Nuggets)", "Mold for making Nuggets"));
+ ItemList.Shape_Mold_Bun.set(addItem(tLastID = 310, "Mold (Buns)", "Mold for shaping Buns"));
+ ItemList.Shape_Mold_Bread.set(addItem(tLastID = 311, "Mold (Bread)", "Mold for shaping Breads"));
+ ItemList.Shape_Mold_Baguette.set(addItem(tLastID = 312, "Mold (Baguette)", "Mold for shaping Baguettes"));
+ ItemList.Shape_Mold_Cylinder.set(addItem(tLastID = 313, "Mold (Cylinder)", "Mold for shaping Cylinders"));
+ ItemList.Shape_Mold_Anvil.set(addItem(tLastID = 314, "Mold (Anvil)", "Mold for shaping Anvils"));
+ ItemList.Shape_Mold_Name
+ .set(addItem(tLastID = 315, "Mold (Name)", "Mold for naming Items (rename Mold with Anvil)"));
+ ItemList.Shape_Mold_Arrow.set(addItem(tLastID = 316, "Mold (Arrow Head)", "Mold for making Arrow Heads"));
+ ItemList.Shape_Mold_Gear_Small.set(addItem(tLastID = 317, "Mold (Small Gear)", "Mold for making small Gears"));
+ ItemList.Shape_Mold_Rod.set(addItem(tLastID = 318, "Mold (Rod)", "Mold for making Rods"));
+ ItemList.Shape_Mold_Bolt.set(addItem(tLastID = 319, "Mold (Bolt)", "Mold for making Bolts"));
+ ItemList.Shape_Mold_Round.set(addItem(tLastID = 320, "Mold (Round)", "Mold for making Rounds"));
+ ItemList.Shape_Mold_Screw.set(addItem(tLastID = 321, "Mold (Screw)", "Mold for making Screws"));
+ ItemList.Shape_Mold_Ring.set(addItem(tLastID = 322, "Mold (Ring)", "Mold for making Rings"));
+ ItemList.Shape_Mold_Rod_Long.set(addItem(tLastID = 323, "Mold (Long Rod)", "Mold for making Long Rods"));
+ ItemList.Shape_Mold_Rotor.set(addItem(tLastID = 324, "Mold (Rotor)", "Mold for making a Rotor"));
+ ItemList.Shape_Mold_Turbine_Blade
+ .set(addItem(tLastID = 325, "Mold (Turbine Blade)", "Mold for making a Turbine Blade"));
+ ItemList.Shape_Mold_Pipe_Tiny.set(addItem(tLastID = 326, "Mold (Tiny Pipe)", "Mold for making tiny Pipes"));
+ ItemList.Shape_Mold_Pipe_Small.set(addItem(tLastID = 327, "Mold (Small Pipe)", "Mold for making small Pipes"));
+ ItemList.Shape_Mold_Pipe_Medium.set(addItem(tLastID = 328, "Mold (Normal Pipe)", "Mold for making Pipes"));
+ ItemList.Shape_Mold_Pipe_Large.set(addItem(tLastID = 329, "Mold (Large Pipe)", "Mold for making large Pipes"));
+ ItemList.Shape_Mold_Pipe_Huge
+ .set(addItem(tLastID = 330, "Mold (Huge Pipe)", "Mold for making full Block Pipes"));
+ ItemList.Shape_Mold_ToolHeadDrill
+ .set(addItem(tLastID = 331, "Mold (Drill Head)", "Mold for making Drill Heads"));
+ GT_ModHandler.removeRecipe(
+ new ItemStack(Blocks.glass),
+ null,
+ new ItemStack(Blocks.glass),
+ null,
+ new ItemStack(Blocks.glass));
+
+ ItemList.Shape_Extruder_Plate
+ .set(addItem(tLastID = 350, "Extruder Shape (Plate)", "Extruder Shape for making Plates"));
+ ItemList.Shape_Extruder_Rod
+ .set(addItem(tLastID = 351, "Extruder Shape (Rod)", "Extruder Shape for making Rods"));
+ ItemList.Shape_Extruder_Bolt
+ .set(addItem(tLastID = 352, "Extruder Shape (Bolt)", "Extruder Shape for making Bolts"));
+ ItemList.Shape_Extruder_Ring
+ .set(addItem(tLastID = 353, "Extruder Shape (Ring)", "Extruder Shape for making Rings"));
+ ItemList.Shape_Extruder_Cell
+ .set(addItem(tLastID = 354, "Extruder Shape (Cell)", "Extruder Shape for making Cells"));
+ ItemList.Shape_Extruder_Ingot.set(
+ addItem(tLastID = 355, "Extruder Shape (Ingot)", "Extruder Shape for, wait, can't we just use a Furnace?"));
+ ItemList.Shape_Extruder_Wire
+ .set(addItem(tLastID = 356, "Extruder Shape (Wire)", "Extruder Shape for making Wires"));
+ ItemList.Shape_Extruder_Casing
+ .set(addItem(tLastID = 357, "Extruder Shape (Casing)", "Extruder Shape for making Item Casings"));
+ ItemList.Shape_Extruder_Pipe_Tiny
+ .set(addItem(tLastID = 358, "Extruder Shape (Tiny Pipe)", "Extruder Shape for making tiny Pipes"));
+ ItemList.Shape_Extruder_Pipe_Small
+ .set(addItem(tLastID = 359, "Extruder Shape (Small Pipe)", "Extruder Shape for making small Pipes"));
+ ItemList.Shape_Extruder_Pipe_Medium
+ .set(addItem(tLastID = 360, "Extruder Shape (Normal Pipe)", "Extruder Shape for making Pipes"));
+ ItemList.Shape_Extruder_Pipe_Large
+ .set(addItem(tLastID = 361, "Extruder Shape (Large Pipe)", "Extruder Shape for making large Pipes"));
+ ItemList.Shape_Extruder_Pipe_Huge
+ .set(addItem(tLastID = 362, "Extruder Shape (Huge Pipe)", "Extruder Shape for making full Block Pipes"));
+ ItemList.Shape_Extruder_Block
+ .set(addItem(tLastID = 363, "Extruder Shape (Block)", "Extruder Shape for making Blocks"));
+ ItemList.Shape_Extruder_Sword
+ .set(addItem(tLastID = 364, "Extruder Shape (Sword Blade)", "Extruder Shape for making Swords"));
+ ItemList.Shape_Extruder_Pickaxe
+ .set(addItem(tLastID = 365, "Extruder Shape (Pickaxe Head)", "Extruder Shape for making Pickaxes"));
+ ItemList.Shape_Extruder_Shovel
+ .set(addItem(tLastID = 366, "Extruder Shape (Shovel Head)", "Extruder Shape for making Shovels"));
+ ItemList.Shape_Extruder_Axe
+ .set(addItem(tLastID = 367, "Extruder Shape (Axe Head)", "Extruder Shape for making Axes"));
+ ItemList.Shape_Extruder_Hoe
+ .set(addItem(tLastID = 368, "Extruder Shape (Hoe Head)", "Extruder Shape for making Hoes"));
+ ItemList.Shape_Extruder_Hammer
+ .set(addItem(tLastID = 369, "Extruder Shape (Hammer Head)", "Extruder Shape for making Hammers"));
+ ItemList.Shape_Extruder_File
+ .set(addItem(tLastID = 370, "Extruder Shape (File Head)", "Extruder Shape for making Files"));
+ ItemList.Shape_Extruder_Saw
+ .set(addItem(tLastID = 371, "Extruder Shape (Saw Blade)", "Extruder Shape for making Saws"));
+ ItemList.Shape_Extruder_Gear
+ .set(addItem(tLastID = 372, "Extruder Shape (Gear)", "Extruder Shape for making Gears"));
+ ItemList.Shape_Extruder_Bottle
+ .set(addItem(tLastID = 373, "Extruder Shape (Bottle)", "Extruder Shape for making Bottles"));
+ ItemList.Shape_Extruder_Rotor
+ .set(addItem(tLastID = 374, "Extruder Shape (Rotor)", "Extruder Shape for a Rotor"));
+ ItemList.Shape_Extruder_Small_Gear
+ .set(addItem(tLastID = 375, "Extruder Shape (Small Gear)", "Extruder Shape for a Small Gear"));
+ ItemList.Shape_Extruder_Turbine_Blade
+ .set(addItem(tLastID = 376, "Extruder Shape (Turbine Blade)", "Extruder Shape for a Turbine Blade"));
+ ItemList.Shape_Extruder_ToolHeadDrill
+ .set(addItem(tLastID = 377, "Extruder Shape (Drill Head)", "Extruder Shape for a Drill Head"));
+
+ ItemList.Shape_Slicer_Flat.set(addItem(tLastID = 398, "Slicer Blade (Flat)", "Slicer Blade for cutting Flat"));
+ ItemList.Shape_Slicer_Stripes
+ .set(addItem(tLastID = 399, "Slicer Blade (Stripes)", "Slicer Blade for cutting Stripes"));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Shape_Slicer_Flat.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "hXS", aTextShape, "fXd", 'P', ItemList.Shape_Extruder_Block, 'X',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Shape_Slicer_Stripes.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "hXS", "XPX", "fXd", 'P', ItemList.Shape_Extruder_Block, 'X',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel) });
+
+ ItemList.Fuel_Can_Plastic_Empty.set(
+ addItem(
+ tLastID = 400,
+ "Empty Plastic Fuel Can",
+ "Used to store Fuels",
+ new ItemData(Materials.Plastic, OrePrefixes.plate.mMaterialAmount * 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L)));
+ ItemList.Fuel_Can_Plastic_Filled.set(
+ addItem(
+ tLastID = 401,
+ "Plastic Fuel Can",
+ "Burns well in Diesel Generators",
+ new ItemData(Materials.Plastic, OrePrefixes.plate.mMaterialAmount * 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Fuel_Can_Plastic_Empty.get(7L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " PP", "P P", "PPP", 'P', OrePrefixes.plate.get(Materials.Plastic) });
+
+ ItemList.Spray_Empty.set(
+ addItem(
+ tLastID = 402,
+ "Empty Spray Can",
+ "Used for making Sprays",
+ new ItemData(
+ Materials.Tin,
+ OrePrefixes.plate.mMaterialAmount * 2L,
+ Materials.Redstone,
+ OrePrefixes.dust.mMaterialAmount),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L)));
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Spray_Empty.get(1L))
+ .duration(40 * SECONDS)
+ .eut(1)
+ .addTo(assemblerRecipes);
+
+ ItemList.Crate_Empty.set(
+ addItem(
+ tLastID = 403,
+ "Empty Crate",
+ "To Package lots of Material",
+ new ItemData(Materials.Wood, 3628800L, Materials.Iron, OrePrefixes.screw.mMaterialAmount),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 2L)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Crate_Empty.get(4L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "SWS", "WdW", "SWS", 'W', OrePrefixes.plank.get(Materials.Wood), 'S',
+ OrePrefixes.screw.get(Materials.AnyIron) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Crate_Empty.get(4L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "SWS", "WdW", "SWS", 'W', OrePrefixes.plank.get(Materials.Wood), 'S',
+ OrePrefixes.screw.get(Materials.Steel) });
+
+ ItemList.ThermosCan_Empty.set(
+ addItem(
+ tLastID = 404,
+ "Empty Thermos Can",
+ "Keeping hot things hot and cold things cold",
+ new ItemData(
+ Materials.Aluminium,
+ OrePrefixes.plateDouble.mMaterialAmount * 1L + 2L * OrePrefixes.ring.mMaterialAmount),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L)));
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Aluminium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Aluminium, 2L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.ThermosCan_Empty.get(1L))
+ .duration(40 * SECONDS)
+ .eut(1)
+ .addTo(assemblerRecipes);
+
+ ItemList.Large_Fluid_Cell_Steel.set(
+ addItem(
+ tLastID = 405,
+ "Large Steel Fluid Cell",
+ "",
+ new ItemData(
+ Materials.Steel,
+ OrePrefixes.plateDouble.mMaterialAmount * 4L,
+ new MaterialStack(Materials.Bronze, OrePrefixes.ring.mMaterialAmount * 4L)),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L)));
+ setFluidContainerStats(32000 + tLastID, 8000L, 64L);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Steel, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.AnyBronze, 4L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Large_Fluid_Cell_Steel.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ ItemList.Large_Fluid_Cell_TungstenSteel.set(
+ addItem(
+ tLastID = 406,
+ "Large Tungstensteel Fluid Cell",
+ "",
+ new ItemData(
+ Materials.TungstenSteel,
+ OrePrefixes.plateDouble.mMaterialAmount * 4L,
+ new MaterialStack(Materials.Platinum, OrePrefixes.ring.mMaterialAmount * 4L)),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 9L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 7L)));
+ setFluidContainerStats(32000 + tLastID, 512000L, 32L);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.TungstenSteel, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Platinum, 4L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Large_Fluid_Cell_TungstenSteel.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ ItemList.Large_Fluid_Cell_Aluminium.set(
+ addItem(
+ tLastID = 407,
+ "Large Aluminium Fluid Cell",
+ "",
+ new ItemData(
+ Materials.Aluminium,
+ OrePrefixes.plateDouble.mMaterialAmount * 4L,
+ new MaterialStack(Materials.Silver, OrePrefixes.ring.mMaterialAmount * 4L)),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 3L)));
+ setFluidContainerStats(32000 + tLastID, 32000L, 64L);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Aluminium, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Silver, 4L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Large_Fluid_Cell_Aluminium.get(1L))
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ ItemList.Large_Fluid_Cell_StainlessSteel.set(
+ addItem(
+ tLastID = 408,
+ "Large Stainless Steel Fluid Cell",
+ "",
+ new ItemData(
+ Materials.StainlessSteel,
+ OrePrefixes.plateDouble.mMaterialAmount * 4L,
+ new MaterialStack(Materials.Electrum, OrePrefixes.ring.mMaterialAmount * 4L)),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 6L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L)));
+ setFluidContainerStats(32000 + tLastID, 64000L, 64L);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.StainlessSteel, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Electrum, 4L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Large_Fluid_Cell_StainlessSteel.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ ItemList.Large_Fluid_Cell_Titanium.set(
+ addItem(
+ tLastID = 409,
+ "Large Titanium Fluid Cell",
+ "",
+ new ItemData(
+ Materials.Titanium,
+ OrePrefixes.plateDouble.mMaterialAmount * 4L,
+ new MaterialStack(Materials.RoseGold, OrePrefixes.ring.mMaterialAmount * 4L)),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 7L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 5L)));
+ setFluidContainerStats(32000 + tLastID, 128000L, 64L);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Titanium, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.RoseGold, 4L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Large_Fluid_Cell_Titanium.get(1L))
+ .duration(10 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ ItemList.Large_Fluid_Cell_Chrome.set(
+ addItem(
+ tLastID = 410,
+ "Large Chrome Fluid Cell",
+ "",
+ new ItemData(
+ Materials.Chrome,
+ OrePrefixes.plateDouble.mMaterialAmount * 4L,
+ new MaterialStack(Materials.Palladium, OrePrefixes.ring.mMaterialAmount * 4L)),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 6L)));
+ setFluidContainerStats(32000 + tLastID, 2048000L, 8L);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Chrome, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Palladium, 4L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Large_Fluid_Cell_Chrome.get(1L))
+ .duration(10 * SECONDS)
+ .eut(1024)
+ .addTo(assemblerRecipes);
+
+ ItemList.Large_Fluid_Cell_Iridium.set(
+ addItem(
+ tLastID = 411,
+ "Large Iridium Fluid Cell",
+ "",
+ new ItemData(
+ Materials.Iridium,
+ OrePrefixes.plateDouble.mMaterialAmount * 4L,
+ new MaterialStack(Materials.Naquadah, OrePrefixes.ring.mMaterialAmount * 4L)),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 10L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 8L)));
+ setFluidContainerStats(32000 + tLastID, 8192000L, 2L);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Iridium, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Naquadah, 4L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Large_Fluid_Cell_Iridium.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ ItemList.Large_Fluid_Cell_Osmium.set(
+ addItem(
+ tLastID = 412,
+ "Large Osmium Fluid Cell",
+ "",
+ new ItemData(
+ Materials.Osmium,
+ OrePrefixes.plateDouble.mMaterialAmount * 4L,
+ new MaterialStack(Materials.ElectrumFlux, OrePrefixes.ring.mMaterialAmount * 4L)),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 11L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 9L)));
+ setFluidContainerStats(32000 + tLastID, 32768000L, 1L);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Osmium, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.ElectrumFlux, 4L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Large_Fluid_Cell_Osmium.get(1L))
+ .duration(10 * SECONDS)
+ .eut(4096)
+ .addTo(assemblerRecipes);
+
+ ItemList.Large_Fluid_Cell_Neutronium.set(
+ addItem(
+ tLastID = 413,
+ "Large Neutronium Fluid Cell",
+ "",
+ new ItemData(
+ Materials.Neutronium,
+ OrePrefixes.plateDouble.mMaterialAmount * 4L,
+ new MaterialStack(Materials.Draconium, OrePrefixes.ring.mMaterialAmount * 4L)),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 12L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 10L)));
+ setFluidContainerStats(32000 + tLastID, 131072000L, 1L);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Neutronium, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Draconium, 4L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Large_Fluid_Cell_Neutronium.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ ItemList.SPRAY_CAN_DYES[i].set(
+ addItem(
+ tLastID = 430 + 2 * i,
+ "Spray Can (" + Dyes.get(i).mName + ")",
+ "Full",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 4L)));
+ ItemList.SPRAY_CAN_DYES_USED[i].set(
+ addItem(
+ tLastID + 1,
+ "Spray Can (" + Dyes.get(i).mName + ")",
+ "Used",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 3L),
+ SubTag.INVISIBLE));
+ IItemBehaviour<GT_MetaBase_Item> tBehaviour = new Behaviour_Spray_Color(
+ ItemList.Spray_Empty.get(1L),
+ ItemList.SPRAY_CAN_DYES_USED[i].get(1L),
+ ItemList.SPRAY_CAN_DYES[i].get(1L),
+ 512L,
+ i);
+ addItemBehavior(32000 + tLastID, tBehaviour);
+ addItemBehavior(32001 + tLastID, tBehaviour);
+ }
+
+ ItemList.Spray_Color_Remover.set(
+ addItem(
+ tLastID = 465,
+ "Spray Can Solvent",
+ "Full",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 8L)));
+ ItemList.Spray_Color_Used_Remover.set(
+ addItem(
+ tLastID = 466,
+ "Spray Can Solvent",
+ "Used",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 6L),
+ SubTag.INVISIBLE));
+ IItemBehaviour<GT_MetaBase_Item> tBehaviour = new Behaviour_Spray_Color_Remover(
+ ItemList.Spray_Empty.get(1L),
+ ItemList.Spray_Color_Used_Remover.get(1L),
+ ItemList.Spray_Color_Remover.get(1L),
+ 1024L);
+ addItemBehavior(32000 + 465, tBehaviour);
+ addItemBehavior(32000 + 466, tBehaviour);
+
+ ItemList.Spray_Color_Remover_Empty.set(
+ addItem(
+ tLastID = 467,
+ "Empty Spray Can Solvent Cannister",
+ "Used for making Spray Can Solvent",
+ new ItemData(
+ Materials.Aluminium,
+ OrePrefixes.plateDouble.mMaterialAmount * 4L,
+ Materials.Redstone,
+ OrePrefixes.dust.mMaterialAmount),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L)));
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+ ItemList.Large_Fluid_Cell_Aluminium.get(1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Spray_Color_Remover_Empty.get(1L))
+ .duration(40 * SECONDS)
+ .eut(1)
+ .addTo(assemblerRecipes);
+
+ ItemList.Tool_Matches.set(
+ addItem(
+ tLastID = 471,
+ "Match",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L)));
+ ItemList.Tool_MatchBox_Used.set(
+ addItem(
+ tLastID = 472,
+ "Match Box",
+ "This is not a Car",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L),
+ SubTag.INVISIBLE));
+ ItemList.Tool_MatchBox_Full.set(
+ addItem(
+ tLastID = 473,
+ "Match Box (Full)",
+ "This is not a Car",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L)));
+
+ tBehaviour = new Behaviour_Lighter(null, ItemList.Tool_Matches.get(1L), ItemList.Tool_Matches.get(1L), 1L);
+ addItemBehavior(32471, tBehaviour);
+ tBehaviour = new Behaviour_Lighter(
+ null,
+ ItemList.Tool_MatchBox_Used.get(1L),
+ ItemList.Tool_MatchBox_Full.get(1L),
+ 16L);
+ addItemBehavior(32472, tBehaviour);
+ addItemBehavior(32473, tBehaviour);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Wood, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Phosphorus, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Tool_Matches.get(1L))
+ .duration(16 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Wood, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.TricalciumPhosphate, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Tool_Matches.get(1L))
+ .duration(16 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Wood, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Tool_Matches.get(4L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Wood, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Tool_Matches.get(4L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Tool_Matches.get(16L),
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Paper, 1L))
+ .itemOutputs(ItemList.Tool_MatchBox_Full.get(1L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(packagerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Tool_MatchBox_Full.get(1L))
+ .itemOutputs(ItemList.Tool_Matches.get(16L))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(16)
+ .addTo(packagerRecipes);
+
+ ItemList.Tool_Lighter_Invar_Empty.set(
+ addItem(
+ tLastID = 474,
+ "Lighter (Empty)",
+ "",
+ new ItemData(Materials.Invar, OrePrefixes.plate.mMaterialAmount * 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L)));
+ ItemList.Tool_Lighter_Invar_Used.set(
+ addItem(
+ tLastID = 475,
+ "Lighter",
+ "",
+ new ItemData(Materials.Invar, OrePrefixes.plate.mMaterialAmount * 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L),
+ SubTag.INVISIBLE));
+ ItemList.Tool_Lighter_Invar_Full.set(
+ addItem(
+ tLastID = 476,
+ "Lighter (Full)",
+ "",
+ new ItemData(Materials.Invar, OrePrefixes.plate.mMaterialAmount * 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L)));
+
+ tBehaviour = new Behaviour_Lighter(
+ ItemList.Tool_Lighter_Invar_Empty.get(1L),
+ ItemList.Tool_Lighter_Invar_Used.get(1L),
+ ItemList.Tool_Lighter_Invar_Full.get(1L),
+ 100L);
+ addItemBehavior(32475, tBehaviour);
+ addItemBehavior(32476, tBehaviour);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Invar, 2L),
+ new ItemStack(Items.flint, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Tool_Lighter_Invar_Empty.get(1L))
+ .duration(12 * SECONDS + 16 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ ItemList.Tool_Lighter_Platinum_Empty.set(
+ addItem(
+ tLastID = 477,
+ "Platinum Lighter (Empty)",
+ "A known Prank Master is engraved on it",
+ new ItemData(Materials.Platinum, OrePrefixes.plate.mMaterialAmount * 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L)));
+ ItemList.Tool_Lighter_Platinum_Used.set(
+ addItem(
+ tLastID = 478,
+ "Platinum Lighter",
+ "A known Prank Master is engraved on it",
+ new ItemData(Materials.Platinum, OrePrefixes.plate.mMaterialAmount * 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L),
+ SubTag.INVISIBLE));
+ ItemList.Tool_Lighter_Platinum_Full.set(
+ addItem(
+ tLastID = 479,
+ "Platinum Lighter (Full)",
+ "A known Prank Master is engraved on it",
+ new ItemData(Materials.Platinum, OrePrefixes.plate.mMaterialAmount * 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L)));
+
+ tBehaviour = new Behaviour_Lighter(
+ ItemList.Tool_Lighter_Platinum_Empty.get(1L),
+ ItemList.Tool_Lighter_Platinum_Used.get(1L),
+ ItemList.Tool_Lighter_Platinum_Full.get(1L),
+ 1000L);
+ addItemBehavior(32478, tBehaviour);
+ addItemBehavior(32479, tBehaviour);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Platinum, 2L),
+ new ItemStack(Items.flint, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Tool_Lighter_Platinum_Empty.get(1L))
+ .duration(12 * SECONDS + 16 * TICKS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ if (GalacticraftMars.isModLoaded()) {
+ ItemList.Ingot_Heavy1
+ .set(addItem(tLastID = 462, "Heavy Duty Alloy Ingot T1", "Used to make Heavy Duty Plates T1"));
+ ItemList.Ingot_Heavy2
+ .set(addItem(tLastID = 463, "Heavy Duty Alloy Ingot T2", "Used to make Heavy Duty Plates T2"));
+ ItemList.Ingot_Heavy3
+ .set(addItem(tLastID = 464, "Heavy Duty Alloy Ingot T3", "Used to make Heavy Duty Plates T3"));
+
+ }
+ ItemList.Ingot_IridiumAlloy.set(
+ addItem(
+ tLastID = 480,
+ "Iridium Alloy Ingot",
+ "Used to make Iridium Plates",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L)));
+
+ ItemList.Paper_Printed_Pages.set(
+ addItem(
+ tLastID = 481,
+ "Printed Pages",
+ "Used to make written Books",
+ new ItemData(Materials.Paper, 10886400L),
+ new Behaviour_PrintedPages(),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L)));
+ ItemList.Paper_Magic_Empty.set(
+ addItem(
+ tLastID = 482,
+ "Magic Paper",
+ "",
+ SubTag.INVISIBLE,
+ new ItemData(Materials.Paper, 3628800L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 1L)));
+ ItemList.Paper_Magic_Page.set(
+ addItem(
+ tLastID = 483,
+ "Enchanted Page",
+ "",
+ SubTag.INVISIBLE,
+ new ItemData(Materials.Paper, 3628800L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 2L)));
+ ItemList.Paper_Magic_Pages.set(
+ addItem(
+ tLastID = 484,
+ "Enchanted Pages",
+ "",
+ SubTag.INVISIBLE,
+ new ItemData(Materials.Paper, 10886400L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 4L)));
+ ItemList.Paper_Punch_Card_Empty.set(
+ addItem(
+ tLastID = 485,
+ "Punch Card",
+ "",
+ SubTag.INVISIBLE,
+ new ItemData(Materials.Paper, 7257600L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L)));
+ ItemList.Paper_Punch_Card_Encoded.set(
+ addItem(
+ tLastID = 486,
+ "Punched Card",
+ "",
+ SubTag.INVISIBLE,
+ new ItemData(Materials.Paper, 7257600L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L)));
+ ItemList.Book_Written_01.set(
+ addItem(
+ tLastID = 487,
+ "Book",
+ "",
+ new ItemData(Materials.Paper, 10886400L),
+ "bookWritten",
+ OreDictNames.craftingBook,
+ new Behaviour_WrittenBook(),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L)));
+ ItemList.Book_Written_02.set(
+ addItem(
+ tLastID = 488,
+ "Book",
+ "",
+ new ItemData(Materials.Paper, 10886400L),
+ "bookWritten",
+ OreDictNames.craftingBook,
+ new Behaviour_WrittenBook(),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L)));
+ ItemList.Book_Written_03.set(
+ addItem(
+ tLastID = 489,
+ "Book",
+ "",
+ new ItemData(Materials.Paper, 10886400L),
+ "bookWritten",
+ OreDictNames.craftingBook,
+ new Behaviour_WrittenBook(),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L)));
+
+ ItemList.Schematic.set(
+ addItem(
+ tLastID = 490,
+ "Schematic",
+ "EMPTY",
+ new ItemData(Materials.Steel, 7257600L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 1L)));
+ ItemList.Schematic_Crafting.set(
+ addItem(
+ tLastID = 491,
+ "Schematic (Crafting)",
+ "Crafts the Programmed Recipe",
+ new ItemData(Materials.Steel, 7257600L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 1L)));
+ ItemList.Schematic_1by1.set(
+ addItem(
+ tLastID = 495,
+ "Schematic (1x1)",
+ "Crafts 1 Items as 1x1 (use in Packager)",
+ new ItemData(Materials.Steel, 7257600L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 1L)));
+ ItemList.Schematic_2by2.set(
+ addItem(
+ tLastID = 496,
+ "Schematic (2x2)",
+ "Crafts 4 Items as 2x2 (use in Packager)",
+ new ItemData(Materials.Steel, 7257600L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 1L)));
+ ItemList.Schematic_3by3.set(
+ addItem(
+ tLastID = 497,
+ "Schematic (3x3)",
+ "Crafts 9 Items as 3x3 (use in Packager)",
+ new ItemData(Materials.Steel, 7257600L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 1L)));
+ ItemList.Schematic_Dust.set(
+ addItem(
+ tLastID = 498,
+ "Schematic (Dusts)",
+ "Combines Dusts (use in Packager)",
+ new ItemData(Materials.Steel, 7257600L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 1L)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Schematic_1by1.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "d ", aTextShape, aTextEmptyRow, 'P', ItemList.Schematic });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Schematic_2by2.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " d ", aTextShape, aTextEmptyRow, 'P', ItemList.Schematic });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Schematic_3by3.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " d", aTextShape, aTextEmptyRow, 'P', ItemList.Schematic });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Schematic_Dust.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { aTextEmptyRow, aTextShape, " d", 'P', ItemList.Schematic });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Schematic.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Schematic_Crafting });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Schematic.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Schematic_1by1 });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Schematic.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Schematic_2by2 });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Schematic.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Schematic_3by3 });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Schematic.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Schematic_Dust });
+
+ ItemList.Battery_Hull_LV.set(
+ addItem(
+ 500,
+ "Small Battery Hull",
+ "An empty LV Battery Hull",
+ new ItemData(Materials.BatteryAlloy, OrePrefixes.plate.mMaterialAmount * 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L)));
+ ItemList.Battery_Hull_MV.set(
+ addItem(
+ 501,
+ "Medium Battery Hull",
+ "An empty MV Battery Hull",
+ new ItemData(Materials.BatteryAlloy, OrePrefixes.plate.mMaterialAmount * 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L)));
+ ItemList.Battery_Hull_HV.set(
+ addItem(
+ 502,
+ "Large Battery Hull",
+ "An empty HV Battery Hull",
+ new ItemData(Materials.BatteryAlloy, OrePrefixes.plate.mMaterialAmount * 9L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 1L)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Hull_LV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "Cf ", "Ph ", "Ps ", 'P', OrePrefixes.plate.get(Materials.BatteryAlloy), 'C',
+ OreDictNames.craftingWireTin });
+ // GT_ModHandler.addCraftingRecipe(ItemList.Battery_Hull_MV.get(1L), GT_ModHandler.RecipeBits.NOT_REMOVABLE, new
+ // Object[]{"C C", "PPP", "PPP", 'P', OrePrefixes.plate.get(Materials.BatteryAlloy), 'C',
+ // OreDictNames.craftingWireCopper});
+
+ // ULV Batteries
+ ItemList.Battery_RE_ULV_Tantalum.set(
+ addItem(
+ tLastID = 499,
+ "Tantalum Capacitor",
+ "Reusable",
+ "batteryULV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L)));
+ setElectricStats(32000 + tLastID, 1000L, GT_Values.V[0], 0L, -3L, false);
+ registerTieredTooltip(ItemList.Battery_RE_ULV_Tantalum.get(1), ULV);
+
+ // LV Batteries
+ ItemList.Battery_SU_LV_SulfuricAcid.set(
+ addItem(
+ tLastID = 510,
+ "Small Acid Battery",
+ "Single Use",
+ "batteryLV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L)));
+ setElectricStats(32000 + tLastID, 18000L, GT_Values.V[1], 1L, -2L, true);
+ registerTieredTooltip(ItemList.Battery_SU_LV_SulfuricAcid.get(1), LV);
+
+ ItemList.Battery_SU_LV_Mercury.set(
+ addItem(
+ tLastID = 511,
+ "Small Mercury Battery",
+ "Single Use",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L)));
+ setElectricStats(32000 + tLastID, 32000L, GT_Values.V[1], 1L, -2L, true);
+ registerTieredTooltip(ItemList.Battery_SU_LV_Mercury.get(1), LV);
+
+ ItemList.Battery_RE_LV_Cadmium.set(
+ addItem(
+ tLastID = 517,
+ "Small Cadmium Battery",
+ "Reusable",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L),
+ "batteryLV"));
+ setElectricStats(32000 + tLastID, 75000L, GT_Values.V[1], 1L, -3L, true);
+ registerTieredTooltip(ItemList.Battery_RE_LV_Cadmium.get(1), LV);
+
+ ItemList.Battery_RE_LV_Lithium.set(
+ addItem(
+ tLastID = 518,
+ "Small Lithium Battery",
+ "Reusable",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L),
+ "batteryLV"));
+ setElectricStats(32000 + tLastID, 100000L, GT_Values.V[1], 1L, -3L, true);
+ registerTieredTooltip(ItemList.Battery_RE_LV_Lithium.get(1), LV);
+
+ ItemList.Battery_RE_LV_Sodium.set(
+ addItem(
+ tLastID = 519,
+ "Small Sodium Battery",
+ "Reusable",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L),
+ "batteryLV"));
+ setElectricStats(32000 + tLastID, 50000L, GT_Values.V[1], 1L, -3L, true);
+ registerTieredTooltip(ItemList.Battery_RE_LV_Sodium.get(1), LV);
+
+ // MV Batteries
+ ItemList.Battery_SU_MV_SulfuricAcid.set(
+ addItem(
+ tLastID = 520,
+ "Medium Acid Battery",
+ "Single Use",
+ "batteryMV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 4L)));
+ setElectricStats(32000 + tLastID, 72000L, GT_Values.V[2], 2L, -2L, true);
+ registerTieredTooltip(ItemList.Battery_SU_MV_SulfuricAcid.get(1), MV);
+
+ ItemList.Battery_SU_MV_Mercury.set(
+ addItem(
+ tLastID = 521,
+ "Medium Mercury Battery",
+ "Single Use",
+ "batteryMV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 4L)));
+ setElectricStats(32000 + tLastID, 128000L, GT_Values.V[2], 2L, -2L, true);
+ registerTieredTooltip(ItemList.Battery_SU_MV_Mercury.get(1), MV);
+
+ ItemList.Battery_RE_MV_Cadmium.set(
+ addItem(
+ tLastID = 527,
+ "Medium Cadmium Battery",
+ "Reusable",
+ "batteryMV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L)));
+ setElectricStats(32000 + tLastID, 300000L, GT_Values.V[2], 2L, -3L, true);
+ registerTieredTooltip(ItemList.Battery_RE_MV_Cadmium.get(1), MV);
+
+ ItemList.Battery_RE_MV_Lithium.set(
+ addItem(
+ tLastID = 528,
+ "Medium Lithium Battery",
+ "Reusable",
+ "batteryMV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L)));
+ setElectricStats(32000 + tLastID, 400000L, GT_Values.V[2], 2L, -3L, true);
+ registerTieredTooltip(ItemList.Battery_RE_MV_Lithium.get(1), MV);
+
+ ItemList.Battery_RE_MV_Sodium.set(
+ addItem(
+ tLastID = 529,
+ "Medium Sodium Battery",
+ "Reusable",
+ "batteryMV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L)));
+ setElectricStats(32000 + tLastID, 200000L, GT_Values.V[2], 2L, -3L, true);
+ registerTieredTooltip(ItemList.Battery_RE_MV_Sodium.get(1), MV);
+
+ // HV Batteries
+ ItemList.Battery_SU_HV_SulfuricAcid.set(
+ addItem(
+ tLastID = 530,
+ "Large Acid Battery",
+ "Single Use",
+ "batteryHV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 8L)));
+ setElectricStats(32000 + tLastID, 288000L, GT_Values.V[3], 3L, -2L, true);
+ registerTieredTooltip(ItemList.Battery_SU_HV_SulfuricAcid.get(1), HV);
+
+ ItemList.Battery_SU_HV_Mercury.set(
+ addItem(
+ tLastID = 531,
+ "Large Mercury Battery",
+ "Single Use",
+ "batteryHV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 8L)));
+ setElectricStats(32000 + tLastID, 512000L, GT_Values.V[3], 3L, -2L, true);
+ registerTieredTooltip(ItemList.Battery_SU_HV_Mercury.get(1), HV);
+
+ ItemList.Battery_RE_HV_Cadmium.set(
+ addItem(
+ tLastID = 537,
+ "Large Cadmium Battery",
+ "Reusable",
+ "batteryHV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 4L)));
+ setElectricStats(32000 + tLastID, 1200000L, GT_Values.V[3], 3L, -3L, true);
+ registerTieredTooltip(ItemList.Battery_RE_HV_Cadmium.get(1), HV);
+
+ ItemList.Battery_RE_HV_Lithium.set(
+ addItem(
+ tLastID = 538,
+ "Large Lithium Battery",
+ "Reusable",
+ "batteryHV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 4L)));
+ setElectricStats(32000 + tLastID, 1600000L, GT_Values.V[3], 3L, -3L, true);
+ registerTieredTooltip(ItemList.Battery_RE_HV_Lithium.get(1), HV);
+
+ ItemList.Battery_RE_HV_Sodium.set(
+ addItem(
+ tLastID = 539,
+ "Large Sodium Battery",
+ "Reusable",
+ "batteryHV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 4L)));
+ setElectricStats(32000 + tLastID, 800000L, GT_Values.V[3], 3L, -3L, true);
+ registerTieredTooltip(ItemList.Battery_RE_HV_Sodium.get(1), HV);
+
+ GT_ModHandler
+ .addExtractionRecipe(ItemList.Battery_SU_LV_SulfuricAcid.get(1L), ItemList.Battery_Hull_LV.get(1L));
+ GT_ModHandler.addExtractionRecipe(ItemList.Battery_SU_LV_Mercury.get(1L), ItemList.Battery_Hull_LV.get(1L));
+ GT_ModHandler
+ .addExtractionRecipe(ItemList.Battery_SU_MV_SulfuricAcid.get(1L), ItemList.Battery_Hull_MV.get(1L));
+ GT_ModHandler.addExtractionRecipe(ItemList.Battery_SU_MV_Mercury.get(1L), ItemList.Battery_Hull_MV.get(1L));
+ GT_ModHandler
+ .addExtractionRecipe(ItemList.Battery_SU_HV_SulfuricAcid.get(1L), ItemList.Battery_Hull_HV.get(1L));
+ GT_ModHandler.addExtractionRecipe(ItemList.Battery_SU_HV_Mercury.get(1L), ItemList.Battery_Hull_HV.get(1L));
+ GT_ModHandler.addExtractionRecipe(ItemList.Battery_RE_LV_Cadmium.get(1L), ItemList.Battery_Hull_LV.get(1L));
+ GT_ModHandler.addExtractionRecipe(ItemList.Battery_RE_LV_Lithium.get(1L), ItemList.Battery_Hull_LV.get(1L));
+ GT_ModHandler.addExtractionRecipe(ItemList.Battery_RE_LV_Sodium.get(1L), ItemList.Battery_Hull_LV.get(1L));
+ GT_ModHandler.addExtractionRecipe(ItemList.Battery_RE_MV_Cadmium.get(1L), ItemList.Battery_Hull_MV.get(1L));
+ GT_ModHandler.addExtractionRecipe(ItemList.Battery_RE_MV_Lithium.get(1L), ItemList.Battery_Hull_MV.get(1L));
+ GT_ModHandler.addExtractionRecipe(ItemList.Battery_RE_MV_Sodium.get(1L), ItemList.Battery_Hull_MV.get(1L));
+ GT_ModHandler.addExtractionRecipe(ItemList.Battery_RE_HV_Cadmium.get(1L), ItemList.Battery_Hull_HV.get(1L));
+ GT_ModHandler.addExtractionRecipe(ItemList.Battery_RE_HV_Lithium.get(1L), ItemList.Battery_Hull_HV.get(1L));
+ GT_ModHandler.addExtractionRecipe(ItemList.Battery_RE_HV_Sodium.get(1L), ItemList.Battery_Hull_HV.get(1L));
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cadmium, 2L),
+ ItemList.Battery_Hull_LV.get(1L))
+ .itemOutputs(ItemList.Battery_RE_LV_Cadmium.get(1L))
+ .duration(5 * SECONDS)
+ .eut(2)
+ .addTo(cannerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 2L),
+ ItemList.Battery_Hull_LV.get(1L))
+ .itemOutputs(ItemList.Battery_RE_LV_Lithium.get(1L))
+ .duration(5 * SECONDS)
+ .eut(2)
+ .addTo(cannerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 2L),
+ ItemList.Battery_Hull_LV.get(1L))
+ .itemOutputs(ItemList.Battery_RE_LV_Sodium.get(1L))
+ .duration(5 * SECONDS)
+ .eut(2)
+ .addTo(cannerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cadmium, 8L),
+ ItemList.Battery_Hull_MV.get(1L))
+ .itemOutputs(ItemList.Battery_RE_MV_Cadmium.get(1L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(cannerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 8L),
+ ItemList.Battery_Hull_MV.get(1L))
+ .itemOutputs(ItemList.Battery_RE_MV_Lithium.get(1L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(cannerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 8L),
+ ItemList.Battery_Hull_MV.get(1L))
+ .itemOutputs(ItemList.Battery_RE_MV_Sodium.get(1L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(cannerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cadmium, 32L),
+ ItemList.Battery_Hull_HV.get(1L))
+ .itemOutputs(ItemList.Battery_RE_HV_Cadmium.get(1L))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(2)
+ .addTo(cannerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 32L),
+ ItemList.Battery_Hull_HV.get(1L))
+ .itemOutputs(ItemList.Battery_RE_HV_Lithium.get(1L))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(2)
+ .addTo(cannerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 32L),
+ ItemList.Battery_Hull_HV.get(1L))
+ .itemOutputs(ItemList.Battery_RE_HV_Sodium.get(1L))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(2)
+ .addTo(cannerRecipes);
+
+ // IV Battery
+ ItemList.Energy_LapotronicOrb.set(
+ addItem(
+ tLastID = 597,
+ "Lapotronic Energy Orb",
+ "Reusable battery",
+ "batteryIV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 16L),
+ OrePrefixes.battery.get(Materials.Ultimate)));
+ setElectricStats(32000 + tLastID, 100000000L, GT_Values.V[5], 5L, -3L, true);
+ registerTieredTooltip(ItemList.Energy_LapotronicOrb.get(1), IV);
+
+ // ZPM Module
+ ItemList.ZPM.set(
+ addItem(
+ tLastID = 598,
+ "Zero Point Module",
+ "Single use battery",
+ "batteryZPM",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L)));
+ setElectricStats(32000 + tLastID, 2000000000000L, GT_Values.V[7], 7L, -2L, true);
+ registerTieredTooltip(ItemList.ZPM.get(1), ZPM);
+
+ // LuV Lapotron orb cluster battery
+ ItemList.Energy_LapotronicOrb2.set(
+ addItem(
+ tLastID = 599,
+ "Lapotronic Energy Orb Cluster",
+ "Reusable battery",
+ "batteryLuV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 16L),
+ OrePrefixes.battery.get(Materials.Ultimate)));
+ setElectricStats(32000 + tLastID, 1000000000L, GT_Values.V[6], 6L, -3L, true);
+ registerTieredTooltip(ItemList.Energy_LapotronicOrb2.get(1), LuV);
+
+ // UV Battery
+ ItemList.ZPM2.set(
+ addItem(
+ tLastID = 605,
+ "Ultimate Battery",
+ "Fill this to win minecraft",
+ "batteryUV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L)));
+ setElectricStats(32000 + tLastID, Long.MAX_VALUE, GT_Values.V[8], 8L, -3L, true);
+ registerTieredTooltip(ItemList.ZPM2.get(1), UV);
+
+ // UMV Battery
+ ItemList.ZPM3.set(
+ addItem(
+ tLastID = 609,
+ "Really Ultimate Battery",
+ "Fill this to be way older",
+ "batteryUMV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L)));
+ setElectricStats(32000 + tLastID, Long.MAX_VALUE, GT_Values.V[12], 12L, -3L, true);
+ registerTieredTooltip(ItemList.ZPM3.get(1), UMV);
+
+ // UXV Battery
+ ItemList.ZPM4.set(
+ addItem(
+ tLastID = 594,
+ "Extremely Ultimate Battery",
+ "Fill this to be older",
+ "batteryUXV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L)));
+ setElectricStats(32000 + tLastID, Long.MAX_VALUE, GT_Values.V[13], 13L, -3L, true);
+ registerTieredTooltip(ItemList.ZPM4.get(1), UXV);
+
+ // MAX Battery
+ ItemList.ZPM5.set(
+ addItem(
+ tLastID = 145,
+ "Insanely Ultimate Battery",
+ "Fill this for fun",
+ "batteryMAX",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L)));
+ setElectricStats(32000 + tLastID, Long.MAX_VALUE, GT_Values.V[14], 14L, -3L, true);
+ registerTieredTooltip(ItemList.ZPM5.get(1), MAX);
+
+ // ERROR Battery
+ ItemList.ZPM6.set(
+ addItem(
+ tLastID = 146,
+ "Mega Ultimate Battery",
+ "Fill the capacitor to reach enlightenment",
+ "batteryERV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L)));
+ setElectricStats(32000 + tLastID, Long.MAX_VALUE, GT_Values.V[15], 15L, -3L, true);
+ registerTieredTooltip(ItemList.ZPM6.get(1), ERV);
+
+ // ZPM Cluster
+ ItemList.Energy_Module.set(
+ addItem(
+ tLastID = 736,
+ "Energy Module",
+ "Reusable battery",
+ "batteryZPM",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 16L),
+ OrePrefixes.battery.get(Materials.Ultimate)));
+ setElectricStats(32000 + tLastID, 10000000000L, GT_Values.V[7], 7L, -3L, true);
+ registerTieredTooltip(ItemList.Energy_Module.get(1), ZPM);
+
+ // UV Cluster
+ ItemList.Energy_Cluster.set(
+ addItem(
+ tLastID = 737,
+ "Energy Cluster",
+ "Reusable battery",
+ "batteryUV",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L)));
+ setElectricStats(32000 + tLastID, 100000000000L, GT_Values.V[8], 8L, -3L, true);
+ registerTieredTooltip(ItemList.Energy_Cluster.get(1), UV);
+
+ // UIV, UMV, UXV and MAX component textures backported from gregicality.
+ ItemList.Electric_Motor_LV.set(
+ addItem(
+ 600,
+ "Electric Motor (LV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L)));
+ ItemList.Electric_Motor_MV.set(
+ addItem(
+ 601,
+ "Electric Motor (MV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L)));
+ ItemList.Electric_Motor_HV.set(
+ addItem(
+ 602,
+ "Electric Motor (HV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 4L)));
+ ItemList.Electric_Motor_EV.set(
+ addItem(
+ 603,
+ "Electric Motor (EV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 8L)));
+ ItemList.Electric_Motor_IV.set(
+ addItem(
+ 604,
+ "Electric Motor (IV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 16L)));
+ ItemList.Electric_Motor_LuV.set(
+ addItem(
+ 606,
+ "Electric Motor (LuV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 32L)));
+ ItemList.Electric_Motor_ZPM.set(
+ addItem(
+ 607,
+ "Electric Motor (ZPM)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 64L)));
+ ItemList.Electric_Motor_UV.set(
+ addItem(
+ 608,
+ "Electric Motor (UV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 128L)));
+ ItemList.Electric_Motor_UHV.set(
+ addItem(
+ 596,
+ "Electric Motor (UHV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 256L)));
+ ItemList.Electric_Motor_UEV.set(
+ addItem(
+ 595,
+ "Electric Motor (UEV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L)));
+ ItemList.Electric_Motor_UIV.set(
+ addItem(
+ 17,
+ "Electric Motor (UIV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L)));
+ ItemList.Electric_Motor_UMV.set(
+ addItem(
+ 18,
+ "Electric Motor (UMV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L)));
+ ItemList.Electric_Motor_UXV.set(
+ addItem(
+ 19,
+ "Electric Motor (UXV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L)));
+ ItemList.Electric_Motor_MAX.set(
+ addItem(
+ 20,
+ "Electric Motor (MAX)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Motor_LV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.IronMagnetic), 'R',
+ OrePrefixes.stick.get(Materials.AnyIron), 'W', OrePrefixes.wireGt01.get(Materials.AnyCopper), 'C',
+ OrePrefixes.cableGt01.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Motor_LV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R',
+ OrePrefixes.stick.get(Materials.Steel), 'W', OrePrefixes.wireGt01.get(Materials.AnyCopper), 'C',
+ OrePrefixes.cableGt01.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Motor_MV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R',
+ OrePrefixes.stick.get(Materials.Aluminium), 'W', OrePrefixes.wireGt02.get(Materials.Cupronickel), 'C',
+ OrePrefixes.cableGt01.get(Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Motor_HV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.SteelMagnetic), 'R',
+ OrePrefixes.stick.get(Materials.StainlessSteel), 'W', OrePrefixes.wireGt04.get(Materials.Electrum), 'C',
+ OrePrefixes.cableGt02.get(Materials.Silver) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Motor_EV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.NeodymiumMagnetic), 'R',
+ OrePrefixes.stick.get(Materials.Titanium), 'W', OrePrefixes.wireGt04.get(Materials.BlackSteel), 'C',
+ OrePrefixes.cableGt02.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Motor_IV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "CWR", "WIW", "RWC", 'I', OrePrefixes.stick.get(Materials.NeodymiumMagnetic), 'R',
+ OrePrefixes.stick.get(Materials.TungstenSteel), 'W', OrePrefixes.wireGt04.get(Materials.Graphene), 'C',
+ OrePrefixes.cableGt02.get(Materials.Tungsten) });
+
+ ItemList.Tesseract.set(
+ addItem(
+ 415,
+ "Raw Tesseract",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L)));
+ ItemList.GigaChad.set(
+ addItem(
+ 416,
+ "Giga Chad Token",
+ "You are worthy",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1000L)));
+ ItemList.EnergisedTesseract.set(
+ addItem(
+ 417,
+ "Energised Tesseract",
+ "Higher dimensional engineering",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 10L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L)));
+
+ ItemList.Electric_Piston_LV.set(
+ addItem(
+ 640,
+ "Electric Piston (LV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L)));
+ ItemList.Electric_Piston_MV.set(
+ addItem(
+ 641,
+ "Electric Piston (MV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L)));
+ ItemList.Electric_Piston_HV.set(
+ addItem(
+ 642,
+ "Electric Piston (HV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 4L)));
+ ItemList.Electric_Piston_EV.set(
+ addItem(
+ 643,
+ "Electric Piston (EV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 8L)));
+ ItemList.Electric_Piston_IV.set(
+ addItem(
+ 644,
+ "Electric Piston (IV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 16L)));
+ ItemList.Electric_Piston_LuV.set(
+ addItem(
+ 645,
+ "Electric Piston (LuV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 32L)));
+ ItemList.Electric_Piston_ZPM.set(
+ addItem(
+ 646,
+ "Electric Piston (ZPM)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 64L)));
+ ItemList.Electric_Piston_UV.set(
+ addItem(
+ 647,
+ "Electric Piston (UV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 128L)));
+ ItemList.Electric_Piston_UHV.set(
+ addItem(
+ 648,
+ "Electric Piston (UHV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 256L)));
+ ItemList.Electric_Piston_UEV.set(
+ addItem(
+ 649,
+ "Electric Piston (UEV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L)));
+ ItemList.Electric_Piston_UIV.set(
+ addItem(
+ 21,
+ "Electric Piston (UIV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L)));
+ ItemList.Electric_Piston_UMV.set(
+ addItem(
+ 22,
+ "Electric Piston (UMV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L)));
+ ItemList.Electric_Piston_UXV.set(
+ addItem(
+ 23,
+ "Electric Piston (UXV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L)));
+ ItemList.Electric_Piston_MAX.set(
+ addItem(
+ 24,
+ "Electric Piston (MAX)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Piston_LV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.Steel), 'S',
+ OrePrefixes.stick.get(Materials.Steel), 'G', OrePrefixes.gearGtSmall.get(Materials.Steel), 'M',
+ ItemList.Electric_Motor_LV, 'C', OrePrefixes.cableGt01.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Piston_MV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.Aluminium), 'S',
+ OrePrefixes.stick.get(Materials.Aluminium), 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'M',
+ ItemList.Electric_Motor_MV, 'C', OrePrefixes.cableGt01.get(Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Piston_HV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.StainlessSteel), 'S',
+ OrePrefixes.stick.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'M', ItemList.Electric_Motor_HV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Piston_EV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.Titanium), 'S',
+ OrePrefixes.stick.get(Materials.Titanium), 'G', OrePrefixes.gearGtSmall.get(Materials.Titanium), 'M',
+ ItemList.Electric_Motor_EV, 'C', OrePrefixes.cableGt01.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Piston_IV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "PPP", "CSS", "CMG", 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'S',
+ OrePrefixes.stick.get(Materials.TungstenSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.TungstenSteel), 'M', ItemList.Electric_Motor_IV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Tungsten) });
+
+ ItemList.Electric_Pump_LV.set(
+ addItem(
+ 610,
+ "Electric Pump (LV)",
+ GT_Utility.formatNumbers(32) + PartCoverText + GT_Utility.formatNumbers(32 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L)));
+ ItemList.Electric_Pump_MV.set(
+ addItem(
+ 611,
+ "Electric Pump (MV)",
+ GT_Utility.formatNumbers(128) + PartCoverText + GT_Utility.formatNumbers(128 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L)));
+ ItemList.Electric_Pump_HV.set(
+ addItem(
+ 612,
+ "Electric Pump (HV)",
+ GT_Utility.formatNumbers(512) + PartCoverText + GT_Utility.formatNumbers(512 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L)));
+ ItemList.Electric_Pump_EV.set(
+ addItem(
+ 613,
+ "Electric Pump (EV)",
+ GT_Utility.formatNumbers(2048) + PartCoverText + GT_Utility.formatNumbers(2048 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 8L)));
+ ItemList.Electric_Pump_IV.set(
+ addItem(
+ 614,
+ "Electric Pump (IV)",
+ GT_Utility.formatNumbers(8192) + PartCoverText + GT_Utility.formatNumbers(8192 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 16L)));
+ ItemList.Electric_Pump_LuV.set(
+ addItem(
+ 615,
+ "Electric Pump (LuV)",
+ GT_Utility.formatNumbers(32768) + PartCoverText + GT_Utility.formatNumbers(32768 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 32L)));
+ ItemList.Electric_Pump_ZPM.set(
+ addItem(
+ 616,
+ "Electric Pump (ZPM)",
+ GT_Utility.formatNumbers(131072) + PartCoverText
+ + GT_Utility.formatNumbers(131072 * 20)
+ + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 64L)));
+ ItemList.Electric_Pump_UV.set(
+ addItem(
+ 617,
+ "Electric Pump (UV)",
+ GT_Utility.formatNumbers(524288) + PartCoverText
+ + GT_Utility.formatNumbers(524288 * 20)
+ + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 128L)));
+ ItemList.Electric_Pump_UHV.set(
+ addItem(
+ 618,
+ "Electric Pump (UHV)",
+ GT_Utility.formatNumbers(1048576) + PartCoverText
+ + GT_Utility.formatNumbers(1048576 * 20)
+ + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 256L)));
+ ItemList.Electric_Pump_UEV.set(
+ addItem(
+ 619,
+ "Electric Pump (UEV)",
+ GT_Utility.formatNumbers(2097152) + PartCoverText
+ + GT_Utility.formatNumbers(2097152 * 20)
+ + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 512L)));
+ ItemList.Electric_Pump_UIV.set(
+ addItem(
+ 25,
+ "Electric Pump (UIV)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 512L)));
+ ItemList.Electric_Pump_UMV.set(
+ addItem(
+ 26,
+ "Electric Pump (UMV)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 512L)));
+ ItemList.Electric_Pump_UXV.set(
+ addItem(
+ 27,
+ "Electric Pump (UXV)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 512L)));
+ ItemList.Electric_Pump_MAX.set(
+ addItem(
+ 28,
+ "Electric Pump (MAX)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 512L)));
+
+ GregTech_API.registerCover(
+ ItemList.Electric_Pump_LV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_Pump(32, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.Electric_Pump_MV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_Pump(128, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.Electric_Pump_HV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_Pump(512, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.Electric_Pump_EV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_Pump(2048, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.Electric_Pump_IV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_Pump(8192, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.Electric_Pump_LuV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[6][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_Pump(32768, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.Electric_Pump_ZPM.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[7][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_Pump(131072, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.Electric_Pump_UV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[8][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_Pump(524288, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.Electric_Pump_UHV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[9][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_Pump(1048576, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.Electric_Pump_UEV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[10][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_Pump(2097152, TextureFactory.of(OVERLAY_PUMP)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Pump_LV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_LV, 'O',
+ OrePrefixes.ring.get(Materials.AnyRubber), 'X', OrePrefixes.rotor.get(Materials.Tin), 'S',
+ OrePrefixes.screw.get(Materials.Tin), 'W', OrePrefixes.cableGt01.get(Materials.Tin), 'P',
+ OrePrefixes.pipeMedium.get(Materials.Bronze) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Pump_MV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_MV, 'O',
+ OrePrefixes.ring.get(Materials.AnyRubber), 'X', OrePrefixes.rotor.get(Materials.Bronze), 'S',
+ OrePrefixes.screw.get(Materials.Bronze), 'W', OrePrefixes.cableGt01.get(Materials.AnyCopper), 'P',
+ OrePrefixes.pipeMedium.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Pump_HV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_HV, 'O',
+ OrePrefixes.ring.get(Materials.AnyRubber), 'X', OrePrefixes.rotor.get(Materials.Steel), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'W', OrePrefixes.cableGt01.get(Materials.Gold), 'P',
+ OrePrefixes.pipeMedium.get(Materials.StainlessSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Pump_EV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_EV, 'O',
+ OrePrefixes.ring.get(Materials.AnyRubber), 'X', OrePrefixes.rotor.get(Materials.StainlessSteel), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'W', OrePrefixes.cableGt01.get(Materials.Aluminium),
+ 'P', OrePrefixes.pipeMedium.get(Materials.Titanium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Electric_Pump_IV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "SXO", "dPw", "OMW", 'M', ItemList.Electric_Motor_IV, 'O',
+ OrePrefixes.ring.get(Materials.AnySyntheticRubber), 'X', OrePrefixes.rotor.get(Materials.TungstenSteel),
+ 'S', OrePrefixes.screw.get(Materials.TungstenSteel), 'W', OrePrefixes.cableGt01.get(Materials.Tungsten),
+ 'P', OrePrefixes.pipeMedium.get(Materials.TungstenSteel) });
+
+ ItemList.Steam_Valve_LV.set(
+ addItem(
+ 620,
+ "Steam Valve (LV)",
+ GT_Utility.formatNumbers(1024) + PartCoverText + GT_Utility.formatNumbers(1024 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L)));
+ ItemList.Steam_Valve_MV.set(
+ addItem(
+ 621,
+ "Steam Valve (MV)",
+ GT_Utility.formatNumbers(2048) + PartCoverText + GT_Utility.formatNumbers(2048 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L)));
+ ItemList.Steam_Valve_HV.set(
+ addItem(
+ 622,
+ "Steam Valve (HV)",
+ GT_Utility.formatNumbers(4096) + PartCoverText + GT_Utility.formatNumbers(4096 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L)));
+ ItemList.Steam_Valve_EV.set(
+ addItem(
+ 623,
+ "Steam Valve (EV)",
+ GT_Utility.formatNumbers(8192) + PartCoverText + GT_Utility.formatNumbers(8192 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 8L)));
+ ItemList.Steam_Valve_IV.set(
+ addItem(
+ 624,
+ "Steam Valve (IV)",
+ GT_Utility.formatNumbers(16384) + PartCoverText + GT_Utility.formatNumbers(16384 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 16L)));
+
+ GregTech_API.registerCover(
+ ItemList.Steam_Valve_LV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_VALVE)),
+ new GT_Cover_SteamValve(1024, TextureFactory.of(OVERLAY_VALVE)));
+ GregTech_API.registerCover(
+ ItemList.Steam_Valve_MV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_VALVE)),
+ new GT_Cover_SteamValve(2048, TextureFactory.of(OVERLAY_VALVE)));
+ GregTech_API.registerCover(
+ ItemList.Steam_Valve_HV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_VALVE)),
+ new GT_Cover_SteamValve(4096, TextureFactory.of(OVERLAY_VALVE)));
+ GregTech_API.registerCover(
+ ItemList.Steam_Valve_EV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_VALVE)),
+ new GT_Cover_SteamValve(8192, TextureFactory.of(OVERLAY_VALVE)));
+ GregTech_API.registerCover(
+ ItemList.Steam_Valve_IV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_VALVE)),
+ new GT_Cover_SteamValve(16384, TextureFactory.of(OVERLAY_VALVE)));
+
+ ItemList.FluidRegulator_LV
+ .set(addItem(tLastID = 660, "Fluid Regulator (LV)", FRText1 + GT_Utility.formatNumbers(640) + FRText2));
+ ItemList.FluidRegulator_MV
+ .set(addItem(tLastID = 661, "Fluid Regulator (MV)", FRText1 + GT_Utility.formatNumbers(2560) + FRText2));
+ ItemList.FluidRegulator_HV
+ .set(addItem(tLastID = 662, "Fluid Regulator (HV)", FRText1 + GT_Utility.formatNumbers(10240) + FRText2));
+ ItemList.FluidRegulator_EV
+ .set(addItem(tLastID = 663, "Fluid Regulator (EV)", FRText1 + GT_Utility.formatNumbers(40960) + FRText2));
+ ItemList.FluidRegulator_IV
+ .set(addItem(tLastID = 664, "Fluid Regulator (IV)", FRText1 + GT_Utility.formatNumbers(163840) + FRText2));
+ ItemList.FluidRegulator_LuV
+ .set(addItem(tLastID = 665, "Fluid Regulator (LuV)", FRText1 + GT_Utility.formatNumbers(655360) + FRText2));
+ ItemList.FluidRegulator_ZPM.set(
+ addItem(tLastID = 666, "Fluid Regulator (ZPM)", FRText1 + GT_Utility.formatNumbers(2621440) + FRText2));
+ ItemList.FluidRegulator_UV.set(
+ addItem(tLastID = 667, "Fluid Regulator (UV)", FRText1 + GT_Utility.formatNumbers(10485760) + FRText2));
+
+ GregTech_API.registerCover(
+ ItemList.FluidRegulator_LV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_FluidRegulator(32, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.FluidRegulator_MV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_FluidRegulator(128, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.FluidRegulator_HV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_FluidRegulator(512, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.FluidRegulator_EV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_FluidRegulator(2048, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.FluidRegulator_IV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_FluidRegulator(8192, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.FluidRegulator_LuV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[6][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_FluidRegulator(32768, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.FluidRegulator_ZPM.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[7][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_FluidRegulator(131072, TextureFactory.of(OVERLAY_PUMP)));
+ GregTech_API.registerCover(
+ ItemList.FluidRegulator_UV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[8][0], TextureFactory.of(OVERLAY_PUMP)),
+ new GT_Cover_FluidRegulator(524288, TextureFactory.of(OVERLAY_PUMP)));
+
+ ItemList.FluidFilter
+ .set(addItem(669, "Fluid Filter Cover", "Set with Fluid Container to only accept one Fluid Type"));
+ GregTech_API.registerCover(
+ ItemList.FluidFilter.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_SHUTTER)),
+ new GT_Cover_Fluidfilter(TextureFactory.of(OVERLAY_SHUTTER)));
+ ItemList.ItemFilter_Export.set(
+ addItem(
+ 270,
+ "Item Filter Cover (Export)",
+ "Right click with an item to set filter (Only supports Export Mode)"));
+ GregTech_API.registerCover(
+ ItemList.ItemFilter_Export.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_CONVEYOR)),
+ new GT_Cover_ItemFilter(true, TextureFactory.of(OVERLAY_CONVEYOR)));
+ ItemList.ItemFilter_Import.set(
+ addItem(
+ 271,
+ "Item Filter Cover (Import)",
+ "Right click with an item to set filter (Only supports Import Mode)"));
+ GregTech_API.registerCover(
+ ItemList.ItemFilter_Import.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_CONVEYOR)),
+ new GT_Cover_ItemFilter(false, TextureFactory.of(OVERLAY_CONVEYOR)));
+ ItemList.Cover_FluidLimiter
+ .set(addItem(272, "Fluid Limiter Cover", "Limits fluid input depending on fill level"));
+ GregTech_API.registerCover(
+ ItemList.Cover_FluidLimiter.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_SHUTTER)),
+ new GT_Cover_FluidLimiter(TextureFactory.of(OVERLAY_SHUTTER)));
+
+ ItemList.Conveyor_Module_LV.set(
+ addItem(
+ 630,
+ "Conveyor Module (LV)",
+ "1 stack every 20 secs (as Cover)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L)));
+ ItemList.Conveyor_Module_MV.set(
+ addItem(
+ 631,
+ "Conveyor Module (MV)",
+ "1 stack every 5 secs (as Cover)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 2L)));
+ ItemList.Conveyor_Module_HV.set(
+ addItem(
+ 632,
+ "Conveyor Module (HV)",
+ "1 stack every 1 sec (as Cover)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 4L)));
+ ItemList.Conveyor_Module_EV.set(
+ addItem(
+ 633,
+ "Conveyor Module (EV)",
+ "1 stack every 1/5 sec (as Cover)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 8L)));
+ ItemList.Conveyor_Module_IV.set(
+ addItem(
+ 634,
+ "Conveyor Module (IV)",
+ "1 stack every 1/20 sec (as Cover)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 16L)));
+ ItemList.Conveyor_Module_LuV.set(
+ addItem(
+ 635,
+ "Conveyor Module (LuV)",
+ "2 stacks every 1/20 sec (as Cover)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 32L)));
+ ItemList.Conveyor_Module_ZPM.set(
+ addItem(
+ 636,
+ "Conveyor Module (ZPM)",
+ "4 stacks every 1/20 sec (as Cover)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 64L)));
+ ItemList.Conveyor_Module_UV.set(
+ addItem(
+ 637,
+ "Conveyor Module (UV)",
+ "8 stacks every 1/20 sec (as Cover)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 128L)));
+ ItemList.Conveyor_Module_UHV.set(
+ addItem(
+ 638,
+ "Conveyor Module (UHV)",
+ "16 stacks every 1/20 sec (as Cover)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 256L)));
+ ItemList.Conveyor_Module_UEV.set(
+ addItem(
+ 639,
+ "Conveyor Module (UEV)",
+ "32 stacks every 1/20 sec (as Cover)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L)));
+ ItemList.Conveyor_Module_UIV.set(
+ addItem(
+ 29,
+ "Conveyor Module (UIV)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L)));
+ ItemList.Conveyor_Module_UMV.set(
+ addItem(
+ 30,
+ "Conveyor Module (UMV)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L)));
+ ItemList.Conveyor_Module_UXV.set(
+ addItem(
+ 31,
+ "Conveyor Module (UXV)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L)));
+ ItemList.Conveyor_Module_MAX.set(
+ addItem(
+ 32,
+ "Conveyor Module (MAX)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 512L)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Conveyor_Module_LV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_LV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Tin), 'R', OrePrefixes.plate.get(Materials.AnyRubber) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Conveyor_Module_MV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_MV, 'C',
+ OrePrefixes.cableGt01.get(Materials.AnyCopper), 'R', OrePrefixes.plate.get(Materials.AnyRubber) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Conveyor_Module_HV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_HV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Gold), 'R', OrePrefixes.plate.get(Materials.AnyRubber) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Conveyor_Module_EV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_EV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Aluminium), 'R', OrePrefixes.plate.get(Materials.AnyRubber) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Conveyor_Module_IV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "RRR", "MCM", "RRR", 'M', ItemList.Electric_Motor_IV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Tungsten), 'R',
+ OrePrefixes.plate.get(Materials.AnySyntheticRubber) });
+
+ GregTech_API.registerCover(
+ ItemList.Conveyor_Module_LV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_CONVEYOR)),
+ new GT_Cover_Conveyor(400, 1, TextureFactory.of(OVERLAY_CONVEYOR)));
+ GregTech_API.registerCover(
+ ItemList.Conveyor_Module_MV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_CONVEYOR)),
+ new GT_Cover_Conveyor(100, 1, TextureFactory.of(OVERLAY_CONVEYOR)));
+ GregTech_API.registerCover(
+ ItemList.Conveyor_Module_HV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_CONVEYOR)),
+ new GT_Cover_Conveyor(20, 1, TextureFactory.of(OVERLAY_CONVEYOR)));
+ GregTech_API.registerCover(
+ ItemList.Conveyor_Module_EV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_CONVEYOR)),
+ new GT_Cover_Conveyor(4, 1, TextureFactory.of(OVERLAY_CONVEYOR)));
+ GregTech_API.registerCover(
+ ItemList.Conveyor_Module_IV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_CONVEYOR)),
+ new GT_Cover_Conveyor(1, 1, TextureFactory.of(OVERLAY_CONVEYOR)));
+ GregTech_API.registerCover(
+ ItemList.Conveyor_Module_LuV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[6][0], TextureFactory.of(OVERLAY_CONVEYOR)),
+ new GT_Cover_Conveyor(1, 2, TextureFactory.of(OVERLAY_CONVEYOR)));
+ GregTech_API.registerCover(
+ ItemList.Conveyor_Module_ZPM.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[7][0], TextureFactory.of(OVERLAY_CONVEYOR)),
+ new GT_Cover_Conveyor(1, 4, TextureFactory.of(OVERLAY_CONVEYOR)));
+ GregTech_API.registerCover(
+ ItemList.Conveyor_Module_UV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[8][0], TextureFactory.of(OVERLAY_CONVEYOR)),
+ new GT_Cover_Conveyor(1, 8, TextureFactory.of(OVERLAY_CONVEYOR)));
+ GregTech_API.registerCover(
+ ItemList.Conveyor_Module_UHV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[9][0], TextureFactory.of(OVERLAY_CONVEYOR)),
+ new GT_Cover_Conveyor(1, 16, TextureFactory.of(OVERLAY_CONVEYOR)));
+ GregTech_API.registerCover(
+ ItemList.Conveyor_Module_UEV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[10][0], TextureFactory.of(OVERLAY_CONVEYOR)),
+ new GT_Cover_Conveyor(1, 32, TextureFactory.of(OVERLAY_CONVEYOR)));
+
+ ItemList.Robot_Arm_LV.set(
+ addItem(
+ 650,
+ "Robot Arm (LV)",
+ "1 stack every 20 secs (as Cover)/n " + RAText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L)));
+ ItemList.Robot_Arm_MV.set(
+ addItem(
+ 651,
+ "Robot Arm (MV)",
+ "1 stack every 5 secs (as Cover)/n " + RAText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L)));
+ ItemList.Robot_Arm_HV.set(
+ addItem(
+ 652,
+ "Robot Arm (HV)",
+ "1 stack every 1 sec (as Cover)/n " + RAText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 4L)));
+ ItemList.Robot_Arm_EV.set(
+ addItem(
+ 653,
+ "Robot Arm (EV)",
+ "1 stack every 1/5 sec (as Cover)/n " + RAText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 8L)));
+ ItemList.Robot_Arm_IV.set(
+ addItem(
+ 654,
+ "Robot Arm (IV)",
+ "1 stack every 1/20 sec (as Cover)/n " + RAText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 16L)));
+ ItemList.Robot_Arm_LuV.set(
+ addItem(
+ 655,
+ "Robot Arm (LuV)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 32L)));
+ ItemList.Robot_Arm_ZPM.set(
+ addItem(
+ 656,
+ "Robot Arm (ZPM)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 64L)));
+ ItemList.Robot_Arm_UV.set(
+ addItem(
+ 657,
+ "Robot Arm (UV)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 128L)));
+ ItemList.Robot_Arm_UHV.set(
+ addItem(
+ 658,
+ "Robot Arm (UHV)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 256L)));
+ ItemList.Robot_Arm_UEV.set(
+ addItem(
+ 659,
+ "Robot Arm (UEV)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1024L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 512L)));
+ ItemList.Robot_Arm_UIV.set(
+ addItem(
+ 33,
+ "Robot Arm (UIV)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1024L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 512L)));
+ ItemList.Robot_Arm_UMV.set(
+ addItem(
+ 34,
+ "Robot Arm (UMV)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1024L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 512L)));
+ ItemList.Robot_Arm_UXV.set(
+ addItem(
+ 35,
+ "Robot Arm (UXV)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1024L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 512L)));
+ ItemList.Robot_Arm_MAX.set(
+ addItem(
+ 36,
+ "Robot Arm (MAX)",
+ PartNotCoverText,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1024L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 512L)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Robot_Arm_LV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.Steel), 'M',
+ ItemList.Electric_Motor_LV, 'P', ItemList.Electric_Piston_LV, 'E',
+ OrePrefixes.circuit.get(Materials.Basic), 'C', OrePrefixes.cableGt01.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Robot_Arm_MV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.Aluminium), 'M',
+ ItemList.Electric_Motor_MV, 'P', ItemList.Electric_Piston_MV, 'E',
+ OrePrefixes.circuit.get(Materials.Good), 'C', OrePrefixes.cableGt01.get(Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Robot_Arm_HV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.StainlessSteel), 'M',
+ ItemList.Electric_Motor_HV, 'P', ItemList.Electric_Piston_HV, 'E',
+ OrePrefixes.circuit.get(Materials.Advanced), 'C', OrePrefixes.cableGt01.get(Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Robot_Arm_EV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.Titanium), 'M',
+ ItemList.Electric_Motor_EV, 'P', ItemList.Electric_Piston_EV, 'E',
+ OrePrefixes.circuit.get(Materials.Data), 'C', OrePrefixes.cableGt01.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Robot_Arm_IV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "CCC", "MSM", "PES", 'S', OrePrefixes.stick.get(Materials.TungstenSteel), 'M',
+ ItemList.Electric_Motor_IV, 'P', ItemList.Electric_Piston_IV, 'E',
+ OrePrefixes.circuit.get(Materials.Elite), 'C', OrePrefixes.cableGt01.get(Materials.Tungsten) });
+
+ GregTech_API.registerCover(
+ ItemList.Robot_Arm_LV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_ARM)),
+ new GT_Cover_Arm(400, TextureFactory.of(OVERLAY_ARM)));
+ GregTech_API.registerCover(
+ ItemList.Robot_Arm_MV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ARM)),
+ new GT_Cover_Arm(100, TextureFactory.of(OVERLAY_ARM)));
+ GregTech_API.registerCover(
+ ItemList.Robot_Arm_HV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_ARM)),
+ new GT_Cover_Arm(20, TextureFactory.of(OVERLAY_ARM)));
+ GregTech_API.registerCover(
+ ItemList.Robot_Arm_EV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_ARM)),
+ new GT_Cover_Arm(4, TextureFactory.of(OVERLAY_ARM)));
+ GregTech_API.registerCover(
+ ItemList.Robot_Arm_IV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_ARM)),
+ new GT_Cover_Arm(1, TextureFactory.of(OVERLAY_ARM)));
+
+ ItemList.QuantumEye.set(addItem(tLastID = 724, "Quantum Eye", "Improved Ender Eye"));
+ ItemList.QuantumStar.set(addItem(tLastID = 725, "Quantum Star", "Improved Nether Star"));
+ ItemList.Gravistar.set(addItem(tLastID = 726, "Gravi Star", "Ultimate Nether Star"));
+
+ ItemList.Emitter_LV.set(
+ addItem(
+ 680,
+ "Emitter (LV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 1L)));
+ ItemList.Emitter_MV.set(
+ addItem(
+ 681,
+ "Emitter (MV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 2L)));
+ ItemList.Emitter_HV.set(
+ addItem(
+ 682,
+ "Emitter (HV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 4L)));
+ ItemList.Emitter_EV.set(
+ addItem(
+ 683,
+ "Emitter (EV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 8L)));
+ ItemList.Emitter_IV.set(
+ addItem(
+ 684,
+ "Emitter (IV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 16L)));
+ ItemList.Emitter_LuV.set(
+ addItem(
+ 685,
+ "Emitter (LuV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 32L)));
+ ItemList.Emitter_ZPM.set(
+ addItem(
+ 686,
+ "Emitter (ZPM)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 64L)));
+ ItemList.Emitter_UV.set(
+ addItem(
+ 687,
+ "Emitter (UV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 128L)));
+ ItemList.Emitter_UHV.set(
+ addItem(
+ 688,
+ "Emitter (UHV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 256L)));
+ ItemList.Emitter_UEV.set(
+ addItem(
+ 689,
+ "Emitter (UEV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 512L)));
+ ItemList.Emitter_UIV.set(
+ addItem(
+ 37,
+ "Emitter (UIV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 512L)));
+ ItemList.Emitter_UMV.set(
+ addItem(
+ 38,
+ "Emitter (UMV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 512L)));
+ ItemList.Emitter_UXV.set(
+ addItem(
+ 39,
+ "Emitter (UXV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 512L)));
+ ItemList.Emitter_MAX.set(
+ addItem(
+ 40,
+ "Emitter (MAX)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 512L)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Emitter_LV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "SSC", "WQS", "CWS", 'Q', OrePrefixes.gem.get(Materials.CertusQuartz), 'S',
+ OrePrefixes.stick.get(Materials.Brass), 'C', OrePrefixes.circuit.get(Materials.Basic), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Emitter_MV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "SSC", "WQS", "CWS", 'Q', OrePrefixes.gem.get(Materials.EnderPearl), 'S',
+ OrePrefixes.stick.get(Materials.Electrum), 'C', OrePrefixes.circuit.get(Materials.Good), 'W',
+ OrePrefixes.cableGt01.get(Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Emitter_HV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "SSC", "WQS", "CWS", 'Q', OrePrefixes.gem.get(Materials.EnderEye), 'S',
+ OrePrefixes.stick.get(Materials.Chrome), 'C', OrePrefixes.circuit.get(Materials.Advanced), 'W',
+ OrePrefixes.cableGt01.get(Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Emitter_EV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "SSC", "WQS", "CWS", 'Q', ItemList.QuantumEye, 'S',
+ OrePrefixes.stick.get(Materials.Platinum), 'C', OrePrefixes.circuit.get(Materials.Data), 'W',
+ OrePrefixes.cableGt01.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Emitter_IV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "SSC", "WQS", "CWS", 'Q', ItemList.QuantumStar, 'S',
+ OrePrefixes.stick.get(Materials.Iridium), 'C', OrePrefixes.circuit.get(Materials.Elite), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tungsten) });
+
+ ItemList.Sensor_LV.set(
+ addItem(
+ 690,
+ "Sensor (LV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1L)));
+ ItemList.Sensor_MV.set(
+ addItem(
+ 691,
+ "Sensor (MV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L)));
+ ItemList.Sensor_HV.set(
+ addItem(
+ 692,
+ "Sensor (HV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 4L)));
+ ItemList.Sensor_EV.set(
+ addItem(
+ 693,
+ "Sensor (EV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 8L)));
+ ItemList.Sensor_IV.set(
+ addItem(
+ 694,
+ "Sensor (IV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 16L)));
+ ItemList.Sensor_LuV.set(
+ addItem(
+ 695,
+ "Sensor (LuV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 32L)));
+ ItemList.Sensor_ZPM.set(
+ addItem(
+ 696,
+ "Sensor (ZPM)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 64L)));
+ ItemList.Sensor_UV.set(
+ addItem(
+ 697,
+ "Sensor (UV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 128L)));
+ ItemList.Sensor_UHV.set(
+ addItem(
+ 698,
+ "Sensor (UHV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 256L)));
+ ItemList.Sensor_UEV.set(
+ addItem(
+ 699,
+ "Sensor (UEV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 512L)));
+ ItemList.Sensor_UIV.set(
+ addItem(
+ 41,
+ "Sensor (UIV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 512L)));
+ ItemList.Sensor_UMV.set(
+ addItem(
+ 42,
+ "Sensor (UMV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 512L)));
+ ItemList.Sensor_UXV.set(
+ addItem(
+ 43,
+ "Sensor (UXV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 512L)));
+ ItemList.Sensor_MAX.set(
+ addItem(
+ 44,
+ "Sensor (MAX)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 512L)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Sensor_LV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "P Q", "PS ", "CPP", 'Q', OrePrefixes.gem.get(Materials.CertusQuartz), 'S',
+ OrePrefixes.stick.get(Materials.Brass), 'P', OrePrefixes.plate.get(Materials.Steel), 'C',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Sensor_MV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "P Q", "PS ", "CPP", 'Q', OrePrefixes.gemFlawless.get(Materials.Emerald), 'S',
+ OrePrefixes.stick.get(Materials.Electrum), 'P', OrePrefixes.plate.get(Materials.Aluminium), 'C',
+ OrePrefixes.circuit.get(Materials.Good) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Sensor_HV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "P Q", "PS ", "CPP", 'Q', OrePrefixes.gem.get(Materials.EnderEye), 'S',
+ OrePrefixes.stick.get(Materials.Chrome), 'P', OrePrefixes.plate.get(Materials.StainlessSteel), 'C',
+ OrePrefixes.circuit.get(Materials.Advanced) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Sensor_EV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "P Q", "PS ", "CPP", 'Q', ItemList.QuantumEye, 'S',
+ OrePrefixes.stick.get(Materials.Platinum), 'P', OrePrefixes.plate.get(Materials.Titanium), 'C',
+ OrePrefixes.circuit.get(Materials.Data) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Sensor_IV.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "P Q", "PS ", "CPP", 'Q', ItemList.QuantumStar, 'S',
+ OrePrefixes.stick.get(Materials.Iridium), 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'C',
+ OrePrefixes.circuit.get(Materials.Elite) });
+
+ ItemList.Field_Generator_LV.set(
+ addItem(
+ 670,
+ "Field Generator (LV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1L)));
+ ItemList.Field_Generator_MV.set(
+ addItem(
+ 671,
+ "Field Generator (MV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 2L)));
+ ItemList.Field_Generator_HV.set(
+ addItem(
+ 672,
+ "Field Generator (HV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 4L)));
+ ItemList.Field_Generator_EV.set(
+ addItem(
+ 673,
+ "Field Generator (EV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 8L)));
+ ItemList.Field_Generator_IV.set(
+ addItem(
+ 674,
+ "Field Generator (IV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 16L)));
+ ItemList.Field_Generator_LuV.set(
+ addItem(
+ 675,
+ "Field Generator (LuV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 32L)));
+ ItemList.Field_Generator_ZPM.set(
+ addItem(
+ 676,
+ "Field Generator (ZPM)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 64L)));
+ ItemList.Field_Generator_UV.set(
+ addItem(
+ 677,
+ "Field Generator (UV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 128L)));
+ ItemList.Field_Generator_UHV.set(
+ addItem(
+ 678,
+ "Field Generator (UHV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 256L)));
+ ItemList.Field_Generator_UEV.set(
+ addItem(
+ 679,
+ "Field Generator (UEV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1024L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 512L)));
+ ItemList.Field_Generator_UIV.set(
+ addItem(
+ 45,
+ "Field Generator (UIV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1024L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 512L)));
+ ItemList.Field_Generator_UMV.set(
+ addItem(
+ 46,
+ "Field Generator (UMV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1024L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 512L)));
+ ItemList.Field_Generator_UXV.set(
+ addItem(
+ 47,
+ "Field Generator (UXV)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1024L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 512L)));
+ ItemList.Field_Generator_MAX.set(
+ addItem(
+ 48,
+ "Field Generator (MAX)",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1024L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 512L)));
+
+ ItemList.StableAdhesive.set(
+ addItem(
+ 427,
+ "Hyper-Stable Self-Healing Adhesive",
+ "Complete and selective adhesion, even when torn or damaged",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 30L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 20L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LIMUS, 10L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VINCULUM, 5L)));
+ ItemList.SuperconductorComposite.set(
+ addItem(
+ 428,
+ "Superconductor Rare-Earth Composite",
+ "Zero resistance to electrical and quantum flow, regardless of temperature",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 50L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 25L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 15L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 10L)));
+ ItemList.NaquadriaSupersolid.set(
+ addItem(
+ 429,
+ "Black Body Naquadria Supersolid",
+ "Flows like a fluid and reflects nothing, perfect absorption and transfer",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 100L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 60L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 40L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 20L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 10L)));
+
+ // Circuits ULV - LuV.
+ ItemList.Circuit_Primitive.set(
+ addItem(
+ tLastID = 700,
+ "Vacuum Tube",
+ "A very simple Circuit",
+ OrePrefixes.circuit.get(Materials.Primitive),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Primitive.get(1), ULV);
+ ItemList.Circuit_Basic.set(
+ addItem(
+ tLastID = 701,
+ "Integrated Logic Circuit",
+ "A Basic Circuit",
+ OrePrefixes.circuit.get(Materials.Basic),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Basic.get(1), LV);
+ ItemList.Circuit_Good.set(
+ addItem(
+ tLastID = 702,
+ "Good Electronic Circuit",
+ "A Good Circuit",
+ OrePrefixes.circuit.get(Materials.Good),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Good.get(1), MV);
+ ItemList.Circuit_Advanced.set(
+ addItem(
+ tLastID = 703,
+ "Processor Assembly",
+ "An Advanced Circuit",
+ OrePrefixes.circuit.get(Materials.Advanced),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Advanced.get(1), HV);
+ ItemList.Circuit_Data.set(
+ addItem(
+ tLastID = 704,
+ "Workstation",
+ "An Extreme Circuit",
+ OrePrefixes.circuit.get(Materials.Data),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Data.get(1), EV);
+ ItemList.Circuit_Elite.set(
+ addItem(
+ tLastID = 705,
+ "Mainframe",
+ "An Elite Circuit",
+ OrePrefixes.circuit.get(Materials.Elite),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Elite.get(1), IV);
+ ItemList.Circuit_Master.set(
+ addItem(
+ tLastID = 706,
+ "Nanoprocessor Mainframe",
+ "A Master Circuit",
+ OrePrefixes.circuit.get(Materials.Master),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Master.get(1), LuV);
+
+ // Backwards compatibility.
+ ItemList.Circuit_Parts_Vacuum_Tube.set(ItemList.Circuit_Primitive.get(1));
+ ItemList.Circuit_Computer.set(ItemList.Circuit_Advanced.get(1));
+
+ ItemList.Tool_DataOrb.set(
+ addItem(
+ tLastID = 707,
+ "Data Orb",
+ "A High Capacity Data Storage",
+ SubTag.NO_UNIFICATION,
+ new Behaviour_DataOrb()));
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Tool_DataOrb.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Tool_DataOrb.get(1L) });
+ ItemList.Tool_DataStick.set(
+ addItem(
+ tLastID = 708,
+ "Data Stick",
+ "A Low Capacity Data Storage",
+ SubTag.NO_UNIFICATION,
+ new Behaviour_DataStick()));
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Tool_DataStick.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ItemList.Tool_DataStick.get(1L) });
+ ItemList.Tool_Cover_Copy_Paste.set(
+ addItem(
+ tLastID = 709,
+ "Cover Copy/Paste tool",
+ "Set Cover Massively.",
+ Behaviour_Cover_Tool.INSTANCE,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 6L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 6L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 6L)));
+ setElectricStats(32000 + tLastID, 400000L, GT_Values.V[2], 2L, -1L, false);
+
+ ItemList.Circuit_Board_Basic.set(addItem(tLastID = 710, "Coated Circuit Board", "A Basic Board"));
+ ItemList.Circuit_Board_Coated.set(ItemList.Circuit_Board_Basic.get(1));
+ ItemList.Circuit_Board_Advanced.set(addItem(tLastID = 711, "Epoxy Circuit Board", "An Advanced Board"));
+ ItemList.Circuit_Board_Epoxy.set(ItemList.Circuit_Board_Advanced.get(1));
+ ItemList.Circuit_Board_Elite
+ .set(addItem(tLastID = 712, "Multilayer Fiber-Reinforced Circuit Board", "An Elite Board"));
+ ItemList.Circuit_Board_Multifiberglass.set(ItemList.Circuit_Board_Elite.get(1));
+ ItemList.Circuit_Parts_Crystal_Chip_Elite
+ .set(addItem(tLastID = 713, "Engraved Crystal Chip", "Needed for Circuits"));
+ ItemList.Circuit_Parts_Crystal_Chip_Master
+ .set(addItem(tLastID = 714, "Engraved Lapotron Chip", "Needed for Circuits"));
+ ItemList.Circuit_Parts_Crystal_Chip_Wetware
+ .set(addItem(tLastID = 668, "Living Crystal Chip", "Needed for Circuits"));
+ ItemList.Circuit_Parts_Advanced.set(addItem(tLastID = 715, "Diode", "Basic Electronic Component"));
+ ItemList.Circuit_Parts_Diode.set(ItemList.Circuit_Parts_Advanced.get(1));
+ ItemList.Circuit_Parts_Wiring_Basic.set(addItem(tLastID = 716, "Resistor", "Basic Electronic Component"));
+ ItemList.Circuit_Parts_Resistor.set(ItemList.Circuit_Parts_Wiring_Basic.get(1));
+ ItemList.Circuit_Parts_Wiring_Advanced.set(addItem(tLastID = 717, "Transistor", "Basic Electronic Component"));
+ ItemList.Circuit_Parts_Transistor.set(ItemList.Circuit_Parts_Wiring_Advanced.get(1));
+ ItemList.Circuit_Parts_Wiring_Elite.set(addItem(tLastID = 718, "Capacitor", "Electronic Component"));
+ ItemList.Circuit_Parts_Capacitor.set(ItemList.Circuit_Parts_Wiring_Elite.get(1));
+ ItemList.Empty_Board_Basic.set(addItem(tLastID = 719, "Phenolic Circuit Board", "A Good Board"));
+ ItemList.Circuit_Board_Phenolic.set(ItemList.Empty_Board_Basic.get(1));
+ ItemList.Empty_Board_Elite.set(addItem(tLastID = 720, "Fiber-Reinforced Circuit Board", "An Extreme Board"));
+ ItemList.Circuit_Board_Fiberglass.set(ItemList.Empty_Board_Elite.get(1));
+
+ ItemList.Component_Sawblade_Diamond.set(
+ addItem(
+ tLastID = 721,
+ "Diamond Sawblade",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L),
+ OreDictNames.craftingDiamondBlade));
+ ItemList.Component_Grinder_Diamond.set(
+ addItem(
+ tLastID = 722,
+ "Diamond Grinding Head",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 6L),
+ OreDictNames.craftingGrinder));
+ ItemList.Component_Grinder_Tungsten.set(
+ addItem(
+ tLastID = 723,
+ "Tungsten Grinding Head",
+ "",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 6L),
+ OreDictNames.craftingGrinder));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Component_Sawblade_Diamond.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { " D ", "DGD", " D ", 'D', OrePrefixes.dustSmall.get(Materials.Diamond), 'G',
+ OrePrefixes.gearGt.get(Materials.CobaltBrass) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Component_Grinder_Diamond.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "DSD", "SIS", "DSD", 'I', OrePrefixes.gem.get(Materials.Diamond), 'D',
+ OrePrefixes.dust.get(Materials.Diamond), 'S', OrePrefixes.plateDouble.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Component_Grinder_Tungsten.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "TST", "SIS", "TST", 'I', OreDictNames.craftingIndustrialDiamond, 'T',
+ OrePrefixes.plate.get(Materials.Tungsten), 'S', OrePrefixes.plateDouble.get(Materials.Steel) });
+
+ ItemList.Upgrade_Muffler.set(
+ addItem(
+ tLastID = 727,
+ "Muffler Upgrade",
+ "Makes Machines silent",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2L)));
+ ItemList.Upgrade_Lock.set(
+ addItem(
+ tLastID = 728,
+ "Lock Upgrade",
+ "Protects your Machines",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 4L)));
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 2L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Upgrade_Muffler.get(1L))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(2)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Upgrade_Muffler.get(1L))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(2)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 2L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Upgrade_Muffler.get(1L))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(2)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Upgrade_Muffler.get(1L))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(2)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 2L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Upgrade_Muffler.get(1L))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(2)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Upgrade_Muffler.get(1L))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(2)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Upgrade_Lock.get(1L))
+ .duration(5 * MINUTES + 20 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Upgrade_Lock.get(1L))
+ .duration(5 * MINUTES + 20 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Upgrade_Lock.get(1L))
+ .duration(5 * MINUTES + 20 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ ItemList.Component_Filter.set(
+ addItem(
+ tLastID = 729,
+ "Item Filter",
+ "",
+ new ItemData(Materials.Zinc, OrePrefixes.foil.mMaterialAmount * 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L),
+ OreDictNames.craftingFilter));
+
+ ItemList.Cover_Controller.set(
+ addItem(
+ tLastID = 730,
+ "Machine Controller Cover",
+ "Turns Machines ON/OFF",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L)));
+ ItemList.Cover_ActivityDetector.set(
+ addItem(
+ tLastID = 731,
+ "Activity Detector Cover",
+ "Gives out Activity as Redstone",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L)));
+ ItemList.Cover_FluidDetector.set(
+ addItem(
+ tLastID = 732,
+ "Fluid Detector Cover",
+ "Gives out Fluid Amount as Redstone",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L)));
+ ItemList.Cover_ItemDetector.set(
+ addItem(
+ tLastID = 733,
+ "Item Detector Cover",
+ "Gives out Item Amount as Redstone",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1L)));
+ ItemList.Cover_EnergyDetector.set(
+ addItem(
+ tLastID = 734,
+ "Energy Detector Cover",
+ "Gives out Energy Amount as Redstone",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L)));
+ ItemList.Cover_PlayerDetector.set(
+ addItem(
+ tLastID = 735,
+ "Player Detector Cover",
+ "Gives out close Players as Redstone",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L)));
+ ItemList.Cover_FluidStorageMonitor.set(
+ addItem(
+ tLastID = 577,
+ "Fluid Storage Monitor Cover",
+ "Displays the fluid stored in the Tank",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L)));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Sensor_EV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_PlayerDetector.get(1L))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GregTech_API.registerCover(
+ ItemList.Cover_Controller.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_CONTROLLER)),
+ new GT_Cover_ControlsWork(TextureFactory.of(OVERLAY_CONTROLLER)));
+
+ final ITexture doesWorkCoverTexture = TextureFactory.of(
+ TextureFactory.of(OVERLAY_ACTIVITYDETECTOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_ACTIVITYDETECTOR_GLOW)
+ .glow()
+ .build());
+ GregTech_API.registerCover(
+ ItemList.Cover_ActivityDetector.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], doesWorkCoverTexture),
+ new GT_Cover_DoesWork(doesWorkCoverTexture));
+ GregTech_API.registerCover(
+ ItemList.Cover_FluidDetector.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_FLUIDDETECTOR)),
+ new GT_Cover_LiquidMeter(TextureFactory.of(OVERLAY_FLUIDDETECTOR)));
+ GregTech_API.registerCover(
+ ItemList.Cover_ItemDetector.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ITEMDETECTOR)),
+ new GT_Cover_ItemMeter(TextureFactory.of(OVERLAY_ITEMDETECTOR)));
+ GregTech_API.registerCover(
+ ItemList.Cover_EnergyDetector.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ENERGYDETECTOR)),
+ new GT_Cover_EUMeter(TextureFactory.of(OVERLAY_ENERGYDETECTOR)));
+
+ final ITexture playerDectectorCoverTexture = TextureFactory.of(
+ TextureFactory.of(OVERLAY_ACTIVITYDETECTOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_ACTIVITYDETECTOR_GLOW)
+ .glow()
+ .build());
+ GregTech_API.registerCover(
+ ItemList.Cover_PlayerDetector.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], playerDectectorCoverTexture),
+ new GT_Cover_PlayerDetector(playerDectectorCoverTexture));
+ GregTech_API.registerCover(
+ ItemList.Cover_FluidStorageMonitor.get(1L),
+ TextureFactory.of(OVERLAY_FLUID_STORAGE_MONITOR0),
+ new GT_Cover_FluidStorageMonitor());
+
+ ItemList.Cover_Screen.set(
+ addItem(
+ tLastID = 740,
+ "Computer Monitor Cover",
+ "Displays Data and GUI",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUX, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L)));
+ ItemList.Cover_Crafting.set(
+ addItem(
+ tLastID = 744,
+ "Crafting Table Cover",
+ "Better than a wooden Workbench",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 4L)));
+ ItemList.Cover_Drain.set(
+ addItem(
+ tLastID = 745,
+ "Drain Module Cover",
+ "Absorbs Fluids and collects Rain",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L)));
+
+ ItemList.Cover_Shutter.set(
+ addItem(
+ tLastID = 749,
+ "Shutter Module Cover",
+ "Blocks Inventory/Tank Side. Use together with Machine Controller.",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L)));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Cover_Screen.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "AGA", "RPB", "ALA", 'A', OrePrefixes.plate.get(Materials.Aluminium), 'L',
+ OrePrefixes.dust.get(Materials.Glowstone), 'R', Dyes.dyeRed, 'G', Dyes.dyeLime, 'B', Dyes.dyeBlue, 'P',
+ OrePrefixes.plate.get(Materials.Glass) });
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
+ ItemList.Cover_Drain.get(1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_Shutter.get(1L))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+ ItemList.Cover_Drain.get(1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_Shutter.get(1L))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+ ItemList.Cover_Drain.get(1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_Shutter.get(1L))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2L),
+ new ItemStack(Blocks.iron_bars, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_Drain.get(1L))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 2L),
+ new ItemStack(Blocks.iron_bars, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_Drain.get(1L))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 2L),
+ new ItemStack(Blocks.iron_bars, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_Drain.get(1L))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
+ new ItemStack(Blocks.crafting_table, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_Crafting.get(1L))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+ new ItemStack(Blocks.crafting_table, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_Crafting.get(1L))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+ new ItemStack(Blocks.crafting_table, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_Crafting.get(1L))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Cover_Shutter.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Basic, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.FluidFilter.get(1L))
+ .duration(40 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Cover_Screen.get(1L),
+ ItemList.Cover_FluidDetector.get(1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_FluidStorageMonitor.get(1L))
+ .duration(40 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ final ITexture screenCoverTexture = TextureFactory.of(
+ TextureFactory.of(OVERLAY_SCREEN),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SCREEN_GLOW)
+ .glow()
+ .build());
+ GregTech_API.registerCover(
+ ItemList.Cover_Screen.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], screenCoverTexture),
+ new GT_Cover_Screen(screenCoverTexture));
+ GregTech_API.registerCover(
+ ItemList.Cover_Crafting.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_CRAFTING)),
+ new GT_Cover_Crafting(TextureFactory.of(OVERLAY_CRAFTING)));
+ GregTech_API.registerCover(
+ ItemList.Cover_Drain.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[0][0], TextureFactory.of(OVERLAY_DRAIN)),
+ new GT_Cover_Drain(TextureFactory.of(OVERLAY_DRAIN)));
+ GregTech_API.registerCover(
+ ItemList.Cover_Shutter.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_SHUTTER)),
+ new GT_Cover_Shutter(TextureFactory.of(OVERLAY_SHUTTER)));
+
+ ItemList.Cover_SolarPanel.set(
+ addItem(
+ tLastID = 750,
+ "Solar Panel",
+ "May the Sun be with you (Needs cleaning with right click)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 1L)));
+ ItemList.Cover_SolarPanel_8V.set(
+ addItem(
+ tLastID = 751,
+ "Solar Panel (8V)",
+ "8 Volt Solar Panel (Needs cleaning with right click)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 2L)));
+ ItemList.Cover_SolarPanel_LV.set(
+ addItem(
+ tLastID = 752,
+ "Solar Panel (LV)",
+ "Low Voltage Solar Panel (Needs cleaning with right click)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 4L)));
+ ItemList.Cover_SolarPanel_MV.set(
+ addItem(
+ tLastID = 753,
+ "Solar Panel (MV)",
+ "Medium Voltage Solar Panel (Needs cleaning with right click)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 8L)));
+ ItemList.Cover_SolarPanel_HV.set(
+ addItem(
+ tLastID = 754,
+ "Solar Panel (HV)",
+ "High Voltage Solar Panel (Needs cleaning with right click)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 16L)));
+ ItemList.Cover_SolarPanel_EV.set(
+ addItem(
+ tLastID = 755,
+ "Solar Panel (EV)",
+ "Extreme Solar Panel (Needs cleaning with right click)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 32L)));
+ ItemList.Cover_SolarPanel_IV.set(
+ addItem(
+ tLastID = 756,
+ "Solar Panel (IV)",
+ "Insane Solar Panel (Needs cleaning with right click)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 64L)));
+ ItemList.Cover_SolarPanel_LuV.set(
+ addItem(
+ tLastID = 757,
+ "Solar Panel (LuV)",
+ "Ludicrous Solar Panel (Needs cleaning with right click)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 64L)));
+ ItemList.Cover_SolarPanel_ZPM.set(
+ addItem(
+ tLastID = 758,
+ "Solar Panel (ZPM)",
+ "ZPM Voltage Solar Panel (Needs cleaning with right click)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 64L)));
+ ItemList.Cover_SolarPanel_UV.set(
+ addItem(
+ tLastID = 759,
+ "Solar Panel (UV)",
+ "Ultimate Solar Panel (Needs cleaning with right click)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 64L)));
+
+ GregTech_API.registerCover(
+ ItemList.Cover_SolarPanel.get(1L),
+ TextureFactory.of(SOLARPANEL),
+ new GT_Cover_SolarPanel(1));
+ GregTech_API.registerCover(
+ ItemList.Cover_SolarPanel_8V.get(1L),
+ TextureFactory.of(SOLARPANEL_8V),
+ new GT_Cover_SolarPanel(8));
+ GregTech_API.registerCover(
+ ItemList.Cover_SolarPanel_LV.get(1L),
+ TextureFactory.of(SOLARPANEL_LV),
+ new GT_Cover_SolarPanel(32));
+ GregTech_API.registerCover(
+ ItemList.Cover_SolarPanel_MV.get(1L),
+ TextureFactory.of(SOLARPANEL_MV),
+ new GT_Cover_SolarPanel(128));
+ GregTech_API.registerCover(
+ ItemList.Cover_SolarPanel_HV.get(1L),
+ TextureFactory.of(SOLARPANEL_HV),
+ new GT_Cover_SolarPanel(512));
+ GregTech_API.registerCover(
+ ItemList.Cover_SolarPanel_EV.get(1L),
+ TextureFactory.of(SOLARPANEL_EV),
+ new GT_Cover_SolarPanel(2048));
+ GregTech_API.registerCover(
+ ItemList.Cover_SolarPanel_IV.get(1L),
+ TextureFactory.of(SOLARPANEL_IV),
+ new GT_Cover_SolarPanel(8192));
+ GregTech_API.registerCover(
+ ItemList.Cover_SolarPanel_LuV.get(1L),
+ TextureFactory.of(SOLARPANEL_LuV),
+ new GT_Cover_SolarPanel(32768));
+ GregTech_API.registerCover(
+ ItemList.Cover_SolarPanel_ZPM.get(1L),
+ TextureFactory.of(SOLARPANEL_ZPM),
+ new GT_Cover_SolarPanel(131072));
+ GregTech_API.registerCover(
+ ItemList.Cover_SolarPanel_UV.get(1L),
+ TextureFactory.of(SOLARPANEL_UV),
+ new GT_Cover_SolarPanel(524288));
+
+ ItemList.Tool_Sonictron.set(
+ addItem(
+ tLastID = 760,
+ "Sonictron",
+ "Bring your Music with you",
+ Behaviour_Sonictron.INSTANCE,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 4L)));
+ ItemList.Tool_Cheat.set(
+ addItem(
+ tLastID = 761,
+ "Debug Scanner",
+ "Also an Infinite Energy Source",
+ Behaviour_Scanner.INSTANCE,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 64L)));
+ setElectricStats(32000 + tLastID, -2000000000L, 1000000000L, -1L, -3L, false);
+ ItemList.Tool_Scanner.set(
+ addItem(
+ tLastID = 762,
+ "Portable Scanner",
+ "Tricorder",
+ Behaviour_Scanner.INSTANCE,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 6L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 6L)));
+ setElectricStats(32000 + tLastID, 400000L, GT_Values.V[2], 2L, -1L, false);
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Tool_Scanner.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "EPR", "CSC", "PBP", 'C', OrePrefixes.circuit.get(Materials.Advanced), 'P',
+ OrePrefixes.plate.get(Materials.Aluminium), 'E', ItemList.Emitter_MV, 'R', ItemList.Sensor_MV, 'S',
+ ItemList.Cover_Screen, 'B', ItemList.Battery_RE_MV_Lithium });
+ ItemList.NC_SensorKit.set(addItem(tLastID = 763, "GregTech Sensor Kit", "", new Behaviour_SensorKit()));
+ ItemList.Duct_Tape.set(
+ addItem(
+ tLastID = 764,
+ "BrainTech Aerospace Advanced Reinforced Duct Tape FAL-84",
+ "If you can't fix it with this, use more of it!",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ OreDictNames.craftingDuctTape));
+ ItemList.McGuffium_239.set(
+ addItem(
+ tLastID = 765,
+ "Mc Guffium 239",
+ "42% better than Phlebotnium",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SPIRITUS, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AURAM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITIUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 8L)));
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Sensor_LV.get(1L), ItemList.Emitter_LV.get(1L), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.NC_SensorKit.get(1L))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(2)
+ .addTo(assemblerRecipes);
+
+ ItemList.Cover_RedstoneTransmitterExternal.set(
+ addItem(
+ tLastID = 741,
+ "Redstone Transmitter (External)",
+ "Transfers Redstone signals wireless",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L)));
+ ItemList.Cover_RedstoneTransmitterInternal.set(
+ addItem(
+ tLastID = 742,
+ "Redstone Transmitter (Internal)",
+ "Transfers Redstone signals wireless",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L)));
+ ItemList.Cover_RedstoneReceiverExternal.set(
+ addItem(
+ tLastID = 746,
+ "Redstone Receiver (External)",
+ "Transfers Redstone signals wireless",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L)));
+ ItemList.Cover_RedstoneReceiverInternal.set(
+ addItem(
+ tLastID = 747,
+ "Redstone Receiver (Internal)",
+ "Transfers Redstone signals wireless",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L)));
+
+ GregTech_API.registerCover(
+ ItemList.Cover_RedstoneTransmitterExternal.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_REDSTONE_TRANSMITTER)),
+ new GT_Cover_RedstoneTransmitterExternal(TextureFactory.of(OVERLAY_REDSTONE_TRANSMITTER)));
+ GregTech_API.registerCover(
+ ItemList.Cover_RedstoneTransmitterInternal.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_REDSTONE_TRANSMITTER)),
+ new GT_Cover_RedstoneTransmitterInternal(TextureFactory.of(OVERLAY_REDSTONE_TRANSMITTER)));
+ GregTech_API.registerCover(
+ ItemList.Cover_RedstoneReceiverExternal.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_REDSTONE_RECEIVER)),
+ new GT_Cover_RedstoneReceiverExternal(TextureFactory.of(OVERLAY_REDSTONE_RECEIVER)));
+ GregTech_API.registerCover(
+ ItemList.Cover_RedstoneReceiverInternal.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_REDSTONE_RECEIVER)),
+ new GT_Cover_RedstoneReceiverInternal(TextureFactory.of(OVERLAY_REDSTONE_RECEIVER)));
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Emitter_EV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_RedstoneTransmitterExternal.get(1L))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Sensor_EV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_RedstoneReceiverExternal.get(1L))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Cover_RedstoneTransmitterInternal.get(1L),
+ new Object[] { ItemList.Cover_RedstoneTransmitterExternal.get(1L) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Cover_RedstoneReceiverInternal.get(1L),
+ new Object[] { ItemList.Cover_RedstoneReceiverExternal.get(1L) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Cover_RedstoneTransmitterExternal.get(1L),
+ new Object[] { ItemList.Cover_RedstoneTransmitterInternal.get(1L) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Cover_RedstoneReceiverExternal.get(1L),
+ new Object[] { ItemList.Cover_RedstoneReceiverInternal.get(1L) });
+
+ ItemList.Cover_NeedsMaintainance.set(
+ addItem(
+ tLastID = 748,
+ "Needs Maintenance Cover",
+ "Attach to Multiblock Controller. Emits Redstone Signal if needs Maintenance",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L)));
+ GregTech_API.registerCover(
+ ItemList.Cover_NeedsMaintainance.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_MAINTENANCE_DETECTOR)),
+ new GT_Cover_NeedMaintainance(TextureFactory.of(OVERLAY_MAINTENANCE_DETECTOR)));
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Emitter_MV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_NeedsMaintainance.get(1L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.ItemFilter_Export.get(1L),
+ new Object[] { "SPS", "dIC", "SPS", 'P', OrePrefixes.plate.get(Materials.Tin), 'S',
+ OrePrefixes.screw.get(Materials.Iron), 'I', ItemList.Component_Filter, 'C',
+ ItemList.Conveyor_Module_LV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.ItemFilter_Import.get(1L),
+ new Object[] { "SPS", "CId", "SPS", 'P', OrePrefixes.plate.get(Materials.Tin), 'S',
+ OrePrefixes.screw.get(Materials.Iron), 'I', ItemList.Component_Filter, 'C',
+ ItemList.Conveyor_Module_LV });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.ItemFilter_Export.get(1L),
+ new Object[] { ItemList.ItemFilter_Import.get(1L) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.ItemFilter_Import.get(1L),
+ new Object[] { ItemList.ItemFilter_Export.get(1L) });
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Tin, 2L),
+ ItemList.Component_Filter.get(1L),
+ ItemList.Conveyor_Module_LV.get(1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.ItemFilter_Export.get(1L))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Tin, 2L),
+ ItemList.Component_Filter.get(1L),
+ ItemList.Conveyor_Module_LV.get(1L),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.ItemFilter_Import.get(1L))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Tool_Cover_Copy_Paste.get(1L),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "PSP", "PCP", "PBP", 'P', OrePrefixes.plate.get(Materials.Aluminium), 'S',
+ ItemList.Tool_DataStick.get(1L), 'C', ItemList.Cover_Screen.get(1L), 'B',
+ ItemList.Battery_RE_MV_Lithium.get(1L) });
+
+ ItemList.Steam_Regulator_LV.set(
+ addItem(
+ tLastID = 332,
+ "Steam Regulator (LV)",
+ GT_Utility.formatNumbers(1024) + PartCoverText + GT_Utility.formatNumbers(1024 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L)));
+ ItemList.Steam_Regulator_MV.set(
+ addItem(
+ tLastID = 333,
+ "Steam Regulator (MV)",
+ GT_Utility.formatNumbers(2048) + PartCoverText + GT_Utility.formatNumbers(2048 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L)));
+ ItemList.Steam_Regulator_HV.set(
+ addItem(
+ tLastID = 334,
+ "Steam Regulator (HV)",
+ GT_Utility.formatNumbers(4096) + PartCoverText + GT_Utility.formatNumbers(4096 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L)));
+ ItemList.Steam_Regulator_EV.set(
+ addItem(
+ tLastID = 335,
+ "Steam Regulator (EV)",
+ GT_Utility.formatNumbers(8192) + PartCoverText + GT_Utility.formatNumbers(8192 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 8L)));
+ ItemList.Steam_Regulator_IV.set(
+ addItem(
+ tLastID = 336,
+ "Steam Regulator (IV)",
+ GT_Utility.formatNumbers(16384) + PartCoverText + GT_Utility.formatNumbers(16384 * 20) + PartCoverText2,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 16L)));
+
+ GregTech_API.registerCover(
+ ItemList.Steam_Regulator_LV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[1][0], TextureFactory.of(OVERLAY_VALVE)),
+ new GT_Cover_SteamRegulator(1024, TextureFactory.of(OVERLAY_VALVE)));
+ GregTech_API.registerCover(
+ ItemList.Steam_Regulator_MV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_VALVE)),
+ new GT_Cover_SteamRegulator(2048, TextureFactory.of(OVERLAY_VALVE)));
+ GregTech_API.registerCover(
+ ItemList.Steam_Regulator_HV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[3][0], TextureFactory.of(OVERLAY_VALVE)),
+ new GT_Cover_SteamRegulator(4096, TextureFactory.of(OVERLAY_VALVE)));
+ GregTech_API.registerCover(
+ ItemList.Steam_Regulator_EV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[4][0], TextureFactory.of(OVERLAY_VALVE)),
+ new GT_Cover_SteamRegulator(8192, TextureFactory.of(OVERLAY_VALVE)));
+ GregTech_API.registerCover(
+ ItemList.Steam_Regulator_IV.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[5][0], TextureFactory.of(OVERLAY_VALVE)),
+ new GT_Cover_SteamRegulator(16384, TextureFactory.of(OVERLAY_VALVE)));
+
+ }
+
+ private static final Map<Materials, Materials> cauldronRemap = new HashMap<>();
+
+ public static void registerCauldronCleaningFor(Materials in, Materials out) {
+ cauldronRemap.put(in, out);
+ }
+
+ @Override
+ public boolean onEntityItemUpdate(EntityItem aItemEntity) {
+ int aDamage = aItemEntity.getEntityItem()
+ .getItemDamage();
+ if ((aDamage < 32000) && (aDamage >= 0) && (!aItemEntity.worldObj.isRemote)) {
+ Materials aMaterial = GregTech_API.sGeneratedMaterials[(aDamage % 1000)];
+ if ((aMaterial != null) && (aMaterial != Materials.Empty) && (aMaterial != Materials._NULL)) {
+ int tX = MathHelper.floor_double(aItemEntity.posX);
+ int tY = MathHelper.floor_double(aItemEntity.posY);
+ int tZ = MathHelper.floor_double(aItemEntity.posZ);
+ OrePrefixes aPrefix = this.mGeneratedPrefixList[(aDamage / 1000)];
+ if ((aPrefix == OrePrefixes.dustImpure) || (aPrefix == OrePrefixes.dustPure)) {
+ Block tBlock = aItemEntity.worldObj.getBlock(tX, tY, tZ);
+ byte tMetaData = (byte) aItemEntity.worldObj.getBlockMetadata(tX, tY, tZ);
+ if ((tBlock == Blocks.cauldron) && (tMetaData > 0)) {
+
+ aMaterial = cauldronRemap.getOrDefault(aMaterial, aMaterial);
+
+ aItemEntity.setEntityItemStack(
+ GT_OreDictUnificator
+ .get(OrePrefixes.dust, aMaterial, aItemEntity.getEntityItem().stackSize));
+ aItemEntity.worldObj.setBlockMetadataWithNotify(tX, tY, tZ, tMetaData - 1, 3);
+ return true;
+ }
+ } else if (aPrefix == OrePrefixes.crushed) {
+ Block tBlock = aItemEntity.worldObj.getBlock(tX, tY, tZ);
+ byte tMetaData = (byte) aItemEntity.worldObj.getBlockMetadata(tX, tY, tZ);
+ if ((tBlock == Blocks.cauldron) && (tMetaData > 0)) {
+ aItemEntity.setEntityItemStack(
+ GT_OreDictUnificator
+ .get(OrePrefixes.crushedPurified, aMaterial, aItemEntity.getEntityItem().stackSize));
+ aItemEntity.worldObj.setBlockMetadataWithNotify(tX, tY, tZ, tMetaData - 1, 3);
+ return true;
+ }
+ } else if (aPrefix == OrePrefixes.dust && aMaterial == Materials.Wheat) {
+ Block tBlock = aItemEntity.worldObj.getBlock(tX, tY, tZ);
+ byte tMetaData = (byte) aItemEntity.worldObj.getBlockMetadata(tX, tY, tZ);
+ if ((tBlock == Blocks.cauldron) && (tMetaData > 0)) {
+ aItemEntity.setEntityItemStack(ItemList.Food_Dough.get(aItemEntity.getEntityItem().stackSize));
+ aItemEntity.worldObj.setBlockMetadataWithNotify(tX, tY, tZ, tMetaData - 1, 3);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
+ super.addAdditionalToolTips(aList, aStack, aPlayer);
+ int aDamage = aStack.getItemDamage();
+ if ((aDamage < 32000) && (aDamage >= 0)) {
+ Materials aMaterial = GregTech_API.sGeneratedMaterials[(aDamage % 1000)];
+ if ((aMaterial != null) && (aMaterial != Materials.Empty) && (aMaterial != Materials._NULL)) {
+ OrePrefixes aPrefix = this.mGeneratedPrefixList[(aDamage / 1000)];
+ if ((aPrefix == OrePrefixes.dustImpure) || (aPrefix == OrePrefixes.dustPure)) {
+ aList.add(this.mToolTipPurify);
+ }
+ }
+ }
+ }
+
+ public boolean isPlasmaCellUsed(OrePrefixes aPrefix, Materials aMaterial) {
+ Collection<GT_Recipe> fusionRecipes = RecipeMaps.fusionRecipes.getAllRecipes();
+ if (aPrefix == OrePrefixes.cellPlasma && aMaterial.getPlasma(1L) != null) { // Materials has a plasma fluid
+ for (GT_Recipe recipe : fusionRecipes) { // Loop through fusion recipes
+ if (recipe.getFluidOutput(0) != null) { // Make sure fluid output can't be null (not sure if possible)
+ if (recipe.getFluidOutput(0)
+ .isFluidEqual(aMaterial.getPlasma(1L))) return true; // Fusion recipe
+ // output matches
+ // current plasma
+ // cell fluid
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) {
+ return (aDoShowAllItems) || (((aPrefix != OrePrefixes.gem) || (!aMaterial.mName.startsWith("Infused")))
+ && (aPrefix != OrePrefixes.dustTiny)
+ && (aPrefix != OrePrefixes.dustSmall)
+ && (aPrefix != OrePrefixes.dustImpure)
+ && (aPrefix != OrePrefixes.dustPure)
+ && (aPrefix != OrePrefixes.crushed)
+ && (aPrefix != OrePrefixes.crushedPurified)
+ && (aPrefix != OrePrefixes.crushedCentrifuged)
+ && (aPrefix != OrePrefixes.ingotHot)
+ && !(aPrefix == OrePrefixes.cellPlasma && !isPlasmaCellUsed(aPrefix, aMaterial)));
+ }
+
+ @Override
+ public ItemStack getContainerItem(ItemStack aStack) {
+ int aDamage = aStack.getItemDamage();
+ if (((aDamage >= 32430) && (aDamage <= 32461)) || (aDamage == 32465 || aDamage == 32466)) {
+ return ItemList.Spray_Empty.get(1L);
+ }
+ if ((aDamage == 32479) || (aDamage == 32476)) {
+ return new ItemStack(this, 1, aDamage - 2);
+ }
+ if (aDamage == 32401) {
+ return new ItemStack(this, 1, aDamage - 1);
+ }
+ return super.getContainerItem(aStack);
+ }
+
+ @Override
+ public boolean doesMaterialAllowGeneration(OrePrefixes aPrefix, Materials aMaterial) {
+ return (super.doesMaterialAllowGeneration(aPrefix, aMaterial));
+ }
+}
diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java
new file mode 100644
index 0000000000..875c4e9861
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java
@@ -0,0 +1,2831 @@
+package gregtech.common.items;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ADVANCED_REDSTONE_RECEIVER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ADVANCED_REDSTONE_TRANSMITTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_WIRELESS_ACTIVITYDETECTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_WIRELESS_FLUID_DETECTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_WIRELESS_ITEM_DETECTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_WIRELESS_MAINTENANCE_DETECTOR;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.WILDCARD;
+
+import net.minecraft.dispenser.IBlockSource;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnumEnchantmentType;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.EnumAction;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.potion.Potion;
+import net.minecraft.world.World;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.enums.TierEU;
+import gregtech.api.items.GT_MetaGenerated_Item_X32;
+import gregtech.api.objects.ItemData;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_FoodStat;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.covers.redstone.GT_Cover_AdvancedRedstoneReceiverExternal;
+import gregtech.common.covers.redstone.GT_Cover_AdvancedRedstoneReceiverInternal;
+import gregtech.common.covers.redstone.GT_Cover_AdvancedRedstoneTransmitterExternal;
+import gregtech.common.covers.redstone.GT_Cover_AdvancedRedstoneTransmitterInternal;
+import gregtech.common.covers.redstone.GT_Cover_WirelessDoesWorkDetector;
+import gregtech.common.covers.redstone.GT_Cover_WirelessFluidDetector;
+import gregtech.common.covers.redstone.GT_Cover_WirelessItemDetector;
+import gregtech.common.covers.redstone.GT_Cover_WirelessMaintenanceDetector;
+import gregtech.common.items.behaviors.Behaviour_Arrow;
+import ic2.api.crops.CropCard;
+import ic2.api.crops.Crops;
+
+public class GT_MetaGenerated_Item_02 extends GT_MetaGenerated_Item_X32 {
+
+ public static GT_MetaGenerated_Item_02 INSTANCE;
+ private static final String aTextCover = "Usable as Cover";
+
+ public GT_MetaGenerated_Item_02() {
+ super(
+ "metaitem.02",
+ OrePrefixes.toolHeadSword,
+ OrePrefixes.toolHeadPickaxe,
+ OrePrefixes.toolHeadShovel,
+ OrePrefixes.toolHeadAxe,
+ OrePrefixes.toolHeadHoe,
+ OrePrefixes.toolHeadHammer,
+ OrePrefixes.toolHeadFile,
+ OrePrefixes.toolHeadSaw,
+ OrePrefixes.toolHeadDrill,
+ OrePrefixes.toolHeadChainsaw,
+ OrePrefixes.toolHeadWrench,
+ OrePrefixes.toolHeadUniversalSpade,
+ OrePrefixes.toolHeadSense,
+ OrePrefixes.toolHeadPlow,
+ OrePrefixes.toolHeadArrow,
+ OrePrefixes.toolHeadBuzzSaw,
+ OrePrefixes.turbineBlade,
+ null,
+ OrePrefixes.itemCasing,
+ OrePrefixes.wireFine,
+ OrePrefixes.gearGtSmall,
+ OrePrefixes.rotor,
+ OrePrefixes.stickLong,
+ OrePrefixes.springSmall,
+ OrePrefixes.spring,
+ OrePrefixes.arrowGtWood,
+ OrePrefixes.arrowGtPlastic,
+ OrePrefixes.gemChipped,
+ OrePrefixes.gemFlawed,
+ OrePrefixes.gemFlawless,
+ OrePrefixes.gemExquisite,
+ OrePrefixes.gearGt);
+ INSTANCE = this;
+
+ int tLastID = 0;
+
+ ItemList.ThermosCan_Dark_Coffee.set(
+ addItem(
+ tLastID = 0,
+ "Dark Coffee",
+ "Coffee, dark, without anything else",
+ new GT_FoodStat(
+ 2,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.ThermosCan_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.moveSpeed.id,
+ 400,
+ 1,
+ 70,
+ Potion.digSpeed.id,
+ 400,
+ 1,
+ 70),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L)));
+ ItemList.ThermosCan_Dark_Cafe_au_lait.set(
+ addItem(
+ tLastID = 1,
+ "Dark Coffee au lait",
+ "Keeping you awake the whole night",
+ new GT_FoodStat(
+ 2,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.ThermosCan_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.moveSpeed.id,
+ 400,
+ 2,
+ 90,
+ Potion.digSpeed.id,
+ 400,
+ 2,
+ 90),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 3L)));
+ ItemList.ThermosCan_Coffee.set(
+ addItem(
+ tLastID = 2,
+ "Coffee",
+ "Just the regular morning Coffee",
+ new GT_FoodStat(
+ 3,
+ 0.4F,
+ EnumAction.drink,
+ ItemList.ThermosCan_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.moveSpeed.id,
+ 400,
+ 0,
+ 50,
+ Potion.digSpeed.id,
+ 400,
+ 0,
+ 50),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 1L)));
+ ItemList.ThermosCan_Cafe_au_lait.set(
+ addItem(
+ tLastID = 3,
+ "Cafe au lait",
+ "Sweet Coffee",
+ new GT_FoodStat(
+ 3,
+ 0.4F,
+ EnumAction.drink,
+ ItemList.ThermosCan_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.moveSpeed.id,
+ 400,
+ 1,
+ 70,
+ Potion.digSpeed.id,
+ 400,
+ 1,
+ 70),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 2L)));
+ ItemList.ThermosCan_Lait_au_cafe.set(
+ addItem(
+ tLastID = 4,
+ "Lait au cafe",
+ "You want Coffee to your Sugar?",
+ new GT_FoodStat(
+ 3,
+ 0.4F,
+ EnumAction.drink,
+ ItemList.ThermosCan_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.moveSpeed.id,
+ 400,
+ 2,
+ 90,
+ Potion.digSpeed.id,
+ 400,
+ 2,
+ 90),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MOTUS, 3L)));
+ ItemList.ThermosCan_Dark_Chocolate_Milk.set(
+ addItem(
+ tLastID = 5,
+ "Dark Chocolate Milk",
+ "A bit bitter, better add a bit Sugar",
+ new GT_FoodStat(
+ 3,
+ 0.4F,
+ EnumAction.drink,
+ ItemList.ThermosCan_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.regeneration.id,
+ 50,
+ 1,
+ 60),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L)));
+ ItemList.ThermosCan_Chocolate_Milk.set(
+ addItem(
+ tLastID = 6,
+ "Chocolate Milk",
+ "Sweet Goodness",
+ new GT_FoodStat(
+ 3,
+ 0.4F,
+ EnumAction.drink,
+ ItemList.ThermosCan_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.regeneration.id,
+ 50,
+ 1,
+ 90),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 2L)));
+ ItemList.ThermosCan_Tea.set(
+ addItem(
+ tLastID = 7,
+ "Tea",
+ "Keep calm and carry on",
+ new GT_FoodStat(
+ 2,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.ThermosCan_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.moveSlowdown.id,
+ 300,
+ 0,
+ 50),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L)));
+ ItemList.ThermosCan_Sweet_Tea.set(
+ addItem(
+ tLastID = 8,
+ "Sweet Tea",
+ "How about a Tea Party? In Boston?",
+ new GT_FoodStat(
+ 2,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.ThermosCan_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L)));
+ ItemList.ThermosCan_Ice_Tea.set(
+ addItem(
+ tLastID = 9,
+ "Ice Tea",
+ "Better than this purple Junk Drink from failed Potions",
+ new GT_FoodStat(
+ 2,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.ThermosCan_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.moveSlowdown.id,
+ 300,
+ 0,
+ 50),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L)));
+
+ ItemList.GelledToluene.set(addItem(tLastID = 10, "Gelled Toluene", "Raw Explosive"));
+
+ ItemList.Bottle_Purple_Drink.set(
+ addItem(
+ tLastID = 100,
+ "Purple Drink",
+ "How about Lemonade. Or some Ice Tea? I got Purple Drink!",
+ new GT_FoodStat(
+ 8,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.moveSlowdown.id,
+ 400,
+ 1,
+ 90),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VINCULUM, 1L)));
+ ItemList.Bottle_Grape_Juice.set(
+ addItem(
+ tLastID = 101,
+ "Grape Juice",
+ "This has a cleaning effect on your internals.",
+ new GT_FoodStat(
+ 4,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.hunger.id,
+ 400,
+ 1,
+ 60),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L)));
+ ItemList.Bottle_Wine.set(
+ addItem(
+ tLastID = 102,
+ "Wine",
+ "Ordinary",
+ new GT_FoodStat(
+ 2,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 400,
+ 1,
+ 60,
+ Potion.heal.id,
+ 0,
+ 0,
+ 60,
+ Potion.poison.id,
+ 200,
+ 1,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L)));
+ ItemList.Bottle_Vinegar.set(
+ addItem(
+ tLastID = 103,
+ "Vinegar",
+ "Exquisite",
+ new GT_FoodStat(
+ 2,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 400,
+ 1,
+ 90,
+ Potion.heal.id,
+ 0,
+ 1,
+ 90,
+ Potion.poison.id,
+ 200,
+ 2,
+ 10,
+ Potion.harm.id,
+ 0,
+ 2,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L)));
+ ItemList.Bottle_Potato_Juice.set(
+ addItem(
+ tLastID = 104,
+ "Potato Juice",
+ "Ever seen Potato Juice in stores? No? That has a reason.",
+ new GT_FoodStat(
+ 3,
+ 0.3F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L)));
+ ItemList.Bottle_Vodka.set(
+ addItem(
+ tLastID = 105,
+ "Vodka",
+ "Not to confuse with Water",
+ new GT_FoodStat(
+ 2,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 500,
+ 0,
+ 60,
+ Potion.damageBoost.id,
+ 500,
+ 1,
+ 60,
+ Potion.poison.id,
+ 200,
+ 1,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L)));
+ ItemList.Bottle_Leninade.set(
+ addItem(
+ tLastID = 106,
+ "Leninade",
+ "Let the Communism flow through you!",
+ new GT_FoodStat(
+ 2,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 500,
+ 1,
+ 90,
+ Potion.damageBoost.id,
+ 500,
+ 2,
+ 90,
+ Potion.poison.id,
+ 200,
+ 2,
+ 10,
+ Potion.harm.id,
+ 0,
+ 2,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 2L)));
+ ItemList.Bottle_Mineral_Water.set(
+ addItem(
+ tLastID = 107,
+ "Mineral Water",
+ "The best Stuff you can drink to stay healthy",
+ new GT_FoodStat(
+ 1,
+ 0.1F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.regeneration.id,
+ 100,
+ 1,
+ 10),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L)));
+ ItemList.Bottle_Salty_Water.set(
+ addItem(
+ tLastID = 108,
+ "Salty Water",
+ "Like Sea Water but less dirty",
+ SubTag.INVISIBLE,
+ new GT_FoodStat(
+ 1,
+ 0.0F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.hunger.id,
+ 400,
+ 2,
+ 95),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TEMPESTAS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Bottle_Reed_Water.set(
+ addItem(
+ tLastID = 109,
+ "Reed Water",
+ "I guess this tastes better when fermented",
+ new GT_FoodStat(
+ 1,
+ 0.1F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L)));
+ ItemList.Bottle_Rum.set(
+ addItem(
+ tLastID = 110,
+ "Rum",
+ "A buddle o' rum",
+ new GT_FoodStat(
+ 4,
+ 0.4F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 300,
+ 0,
+ 60,
+ Potion.damageBoost.id,
+ 300,
+ 1,
+ 60,
+ Potion.poison.id,
+ 200,
+ 1,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L)));
+ ItemList.Bottle_Pirate_Brew.set(
+ addItem(
+ tLastID = 111,
+ "Pirate Brew",
+ "Set the Sails, we are going to Torrentuga!",
+ new GT_FoodStat(
+ 4,
+ 0.4F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 300,
+ 1,
+ 90,
+ Potion.damageBoost.id,
+ 300,
+ 2,
+ 90,
+ Potion.poison.id,
+ 200,
+ 2,
+ 10,
+ Potion.harm.id,
+ 0,
+ 2,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 2L)));
+ ItemList.Bottle_Hops_Juice.set(
+ addItem(
+ tLastID = 112,
+ "Hops Juice",
+ "Every Beer has a start",
+ new GT_FoodStat(
+ 1,
+ 0.1F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L)));
+ ItemList.Bottle_Dark_Beer.set(
+ addItem(
+ tLastID = 113,
+ "Dark Beer",
+ "Dark Beer, for the real Men",
+ new GT_FoodStat(
+ 4,
+ 0.4F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 300,
+ 1,
+ 60,
+ Potion.damageBoost.id,
+ 300,
+ 1,
+ 60,
+ Potion.poison.id,
+ 200,
+ 1,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L)));
+ ItemList.Bottle_Dragon_Blood.set(
+ addItem(
+ tLastID = 114,
+ "Dragon Blood",
+ "FUS RO DAH!",
+ new GT_FoodStat(
+ 4,
+ 0.4F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 300,
+ 2,
+ 90,
+ Potion.damageBoost.id,
+ 300,
+ 2,
+ 90,
+ Potion.poison.id,
+ 200,
+ 2,
+ 10,
+ Potion.harm.id,
+ 0,
+ 2,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 2L)));
+ ItemList.Bottle_Wheaty_Juice.set(
+ addItem(
+ tLastID = 115,
+ "Wheaty Juice",
+ "Is this liquefied Bread or what?",
+ new GT_FoodStat(
+ 2,
+ 0.1F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L)));
+ ItemList.Bottle_Scotch.set(
+ addItem(
+ tLastID = 116,
+ "Scotch",
+ "Technically this is just a Whisky",
+ new GT_FoodStat(
+ 2,
+ 0.1F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 400,
+ 0,
+ 60,
+ Potion.resistance.id,
+ 400,
+ 1,
+ 60,
+ Potion.poison.id,
+ 200,
+ 1,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1L)));
+ ItemList.Bottle_Glen_McKenner.set(
+ addItem(
+ tLastID = 117,
+ "Glen McKenner",
+ "Don't hand to easily surprised people, they will shatter it.",
+ new GT_FoodStat(
+ 2,
+ 0.1F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 400,
+ 1,
+ 90,
+ Potion.resistance.id,
+ 400,
+ 2,
+ 90,
+ Potion.poison.id,
+ 200,
+ 2,
+ 10,
+ Potion.harm.id,
+ 0,
+ 2,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 2L)));
+ ItemList.Bottle_Wheaty_Hops_Juice.set(
+ addItem(
+ tLastID = 118,
+ "Wheaty Hops Juice",
+ "Also known as 'Duff-Lite'",
+ new GT_FoodStat(
+ 1,
+ 0.1F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 2L)));
+ ItemList.Bottle_Beer.set(
+ addItem(
+ tLastID = 119,
+ "Beer",
+ "Good old Beer",
+ new GT_FoodStat(
+ 6,
+ 0.4F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 400,
+ 0,
+ 60,
+ Potion.digSpeed.id,
+ 400,
+ 2,
+ 60,
+ Potion.poison.id,
+ 100,
+ 0,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 1L)));
+ ItemList.Bottle_Chilly_Sauce.set(
+ addItem(
+ tLastID = 120,
+ "Chilly Sauce",
+ "Spicy",
+ new GT_FoodStat(
+ 2,
+ 0.1F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 1000,
+ 0,
+ 10,
+ Potion.fireResistance.id,
+ 1000,
+ 0,
+ 60),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Bottle_Hot_Sauce.set(
+ addItem(
+ tLastID = 121,
+ "Hot Sauce",
+ "Very Spicy, I guess?",
+ new GT_FoodStat(
+ 2,
+ 0.1F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 2000,
+ 0,
+ 30,
+ Potion.fireResistance.id,
+ 2000,
+ 0,
+ 70),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 2L)));
+ ItemList.Bottle_Diabolo_Sauce.set(
+ addItem(
+ tLastID = 122,
+ "Diabolo Sauce",
+ "As if the Devil made this Sauce",
+ new GT_FoodStat(
+ 2,
+ 0.1F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 3000,
+ 1,
+ 50,
+ Potion.fireResistance.id,
+ 3000,
+ 0,
+ 80),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 3L)));
+ ItemList.Bottle_Diablo_Sauce.set(
+ addItem(
+ tLastID = 123,
+ "Diablo Sauce",
+ "Diablo always comes back!",
+ new GT_FoodStat(
+ 2,
+ 0.1F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 4000,
+ 1,
+ 70,
+ Potion.fireResistance.id,
+ 4000,
+ 0,
+ 90),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 4L)));
+ ItemList.Bottle_Snitches_Glitch_Sauce.set(
+ addItem(
+ tLastID = 124,
+ "Old Man Snitches glitched Diablo Sauce",
+ "[Missing No]",
+ SubTag.INVISIBLE,
+ new GT_FoodStat(
+ 2,
+ 0.1F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 9999,
+ 2,
+ 999,
+ Potion.fireResistance.id,
+ 9999,
+ 9,
+ 999),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 5L)));
+ ItemList.Bottle_Apple_Juice.set(
+ addItem(
+ tLastID = 125,
+ "Apple Juice",
+ "Made of the Apples from our best Oak Farms",
+ new GT_FoodStat(
+ 4,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.hunger.id,
+ 400,
+ 0,
+ 20),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L)));
+ ItemList.Bottle_Cider.set(
+ addItem(
+ tLastID = 126,
+ "Cider",
+ "If you have nothing better to do with your Apples",
+ new GT_FoodStat(
+ 4,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 400,
+ 0,
+ 60,
+ Potion.resistance.id,
+ 400,
+ 1,
+ 60,
+ Potion.poison.id,
+ 200,
+ 1,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1L)));
+ ItemList.Bottle_Golden_Apple_Juice.set(
+ addItem(
+ tLastID = 127,
+ "Golden Apple Juice",
+ "A golden Apple in liquid form",
+ new GT_FoodStat(
+ 4,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.hunger.id,
+ 400,
+ 0,
+ 20,
+ Potion.field_76444_x.id,
+ 2400,
+ 0,
+ 100,
+ Potion.regeneration.id,
+ 100,
+ 1,
+ 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L)));
+ ItemList.Bottle_Golden_Cider.set(
+ addItem(
+ tLastID = 128,
+ "Golden Cider",
+ "More Resistance, less Regeneration",
+ new GT_FoodStat(
+ 4,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.confusion.id,
+ 400,
+ 0,
+ 60,
+ Potion.field_76444_x.id,
+ 2400,
+ 1,
+ 95,
+ Potion.poison.id,
+ 200,
+ 1,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1L)));
+ ItemList.Bottle_Iduns_Apple_Juice.set(
+ addItem(
+ tLastID = 129,
+ "Idun's Apple Juice",
+ "So you got the Idea of using Notch Apples for a drink?",
+ new GT_FoodStat(
+ 4,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.regeneration.id,
+ 600,
+ 4,
+ 100,
+ Potion.field_76444_x.id,
+ 2400,
+ 0,
+ 100,
+ Potion.resistance.id,
+ 6000,
+ 0,
+ 100,
+ Potion.fireResistance.id,
+ 6000,
+ 0,
+ 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 9L)));
+ ItemList.Bottle_Notches_Brew.set(
+ addItem(
+ tLastID = 130,
+ "Notches Brew",
+ "This is just overpowered",
+ new GT_FoodStat(
+ 4,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.regeneration.id,
+ 700,
+ 4,
+ 95,
+ Potion.field_76444_x.id,
+ 3000,
+ 1,
+ 95,
+ Potion.resistance.id,
+ 7000,
+ 1,
+ 95,
+ Potion.fireResistance.id,
+ 7000,
+ 0,
+ 95,
+ Potion.harm.id,
+ 0,
+ 2,
+ 20),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 9L)));
+ ItemList.Bottle_Lemon_Juice.set(
+ addItem(
+ tLastID = 131,
+ "Lemon Juice",
+ "Maybe adding Sugar will make it less sour",
+ new GT_FoodStat(
+ 2,
+ 0.4F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.digSpeed.id,
+ 1200,
+ 0,
+ 60),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 1L)));
+ ItemList.Bottle_Limoncello.set(
+ addItem(
+ tLastID = 132,
+ "Limoncello",
+ "An alcoholic Drink which tastes like Lemons",
+ new GT_FoodStat(
+ 2,
+ 0.4F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.digSpeed.id,
+ 1200,
+ 0,
+ 90,
+ Potion.poison.id,
+ 200,
+ 1,
+ 5),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 1L)));
+ ItemList.Bottle_Lemonade.set(
+ addItem(
+ tLastID = 133,
+ "Lemonade",
+ "Cold and refreshing Lemonade",
+ new GT_FoodStat(
+ 4,
+ 0.3F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.digSpeed.id,
+ 900,
+ 1,
+ 90),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 1L)));
+ ItemList.Bottle_Alcopops.set(
+ addItem(
+ tLastID = 134,
+ "Alcopops",
+ "Don't let your Children drink this junk!",
+ new GT_FoodStat(
+ 2,
+ 0.2F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.digSpeed.id,
+ 900,
+ 1,
+ 90,
+ Potion.poison.id,
+ 300,
+ 2,
+ 20),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VINCULUM, 1L)));
+ ItemList.Bottle_Cave_Johnsons_Grenade_Juice.set(
+ addItem(
+ tLastID = 135,
+ "Cave Johnson's Grenade Juice",
+ "When life gives you Lemons, make Life take them Lemons back!",
+ new GT_FoodStat(
+ 0,
+ 0.0F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false).setExplosive(),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MORTUUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 1L)));
+ ItemList.Bottle_Milk.set(
+ addItem(
+ tLastID = 136,
+ "Milk",
+ "Got Milk?",
+ OrePrefixes.bottle.get(Materials.Milk),
+ new GT_FoodStat(
+ 0,
+ 0.0F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false).setMilk(),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L)));
+ ItemList.Bottle_Holy_Water.set(
+ addItem(
+ tLastID = 137,
+ "Holy Water",
+ "May the holy Planks be with you",
+ OrePrefixes.bottle.get(Materials.HolyWater),
+ new GT_FoodStat(
+ 0,
+ 0.0F,
+ EnumAction.drink,
+ ItemList.Bottle_Empty.get(1L),
+ GregTech_API.sDrinksAlwaysDrinkable,
+ false,
+ false,
+ Potion.poison.id,
+ 100,
+ 1,
+ 100).setMilk(),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AURAM, 1L)));
+
+ ItemList.Food_Potato_On_Stick.set(
+ addItem(
+ tLastID = 200,
+ "Potato on a Stick",
+ "Totally looks like a Crab Claw",
+ new GT_FoodStat(1, 0.3F, EnumAction.eat, new ItemStack(Items.stick, 1), false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ ItemList.Food_Potato_On_Stick_Roasted.set(
+ addItem(
+ tLastID = 201,
+ "Roasted Potato on a Stick",
+ "Still looks like a Crab Claw",
+ new GT_FoodStat(6, 0.6F, EnumAction.eat, new ItemStack(Items.stick, 1), false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Raw_Fries.set(
+ addItem(
+ tLastID = 202,
+ "Potato Strips",
+ "It's Potato in Stripe Form",
+ new GT_FoodStat(1, 0.3F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L)));
+ setFluidContainerStats(32000 + tLastID, 0L, 16L);
+ ItemList.Food_Fries.set(
+ addItem(
+ tLastID = 203,
+ "Fries",
+ "Not to confuse with Fry the Delivery Boy",
+ new GT_FoodStat(7, 0.5F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ setFluidContainerStats(32000 + tLastID, 0L, 16L);
+ ItemList.Food_Packaged_Fries.set(
+ addItem(
+ tLastID = 204,
+ "Fries",
+ "Ketchup not included",
+ new GT_FoodStat(
+ 7,
+ 0.5F,
+ EnumAction.eat,
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 1L),
+ false,
+ true,
+ false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Raw_PotatoChips.set(
+ addItem(
+ tLastID = 205,
+ "Potato Chips (Raw)",
+ "Just like a Potato",
+ new GT_FoodStat(1, 0.3F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L)));
+ setFluidContainerStats(32000 + tLastID, 0L, 16L);
+ ItemList.Food_PotatoChips.set(
+ addItem(
+ tLastID = 206,
+ "Potato Chips",
+ "Crunchy",
+ new GT_FoodStat(7, 0.5F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ setFluidContainerStats(32000 + tLastID, 0L, 16L);
+ ItemList.Food_ChiliChips.set(
+ addItem(
+ tLastID = 207,
+ "Chili Chips",
+ "Spicy",
+ new GT_FoodStat(7, 0.6F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ setFluidContainerStats(32000 + tLastID, 0L, 16L);
+ ItemList.Food_Packaged_PotatoChips.set(
+ addItem(
+ tLastID = 208,
+ "Bag of Potato Chips",
+ "Full of delicious Air",
+ new GT_FoodStat(
+ 7,
+ 0.5F,
+ EnumAction.eat,
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 1L),
+ false,
+ true,
+ false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Packaged_ChiliChips.set(
+ addItem(
+ tLastID = 209,
+ "Bag of Chili Chips",
+ "Stop making noises Baj!",
+ new GT_FoodStat(
+ 7,
+ 0.6F,
+ EnumAction.eat,
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 1L),
+ false,
+ true,
+ false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Chum.set(
+ addItem(
+ tLastID = 210,
+ "Chum",
+ "Chum is Fum!",
+ new GT_FoodStat(
+ 5,
+ 0.2F,
+ EnumAction.eat,
+ null,
+ true,
+ false,
+ true,
+ Potion.hunger.id,
+ 1000,
+ 4,
+ 100,
+ Potion.confusion.id,
+ 300,
+ 1,
+ 80),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Chum_On_Stick.set(
+ addItem(
+ tLastID = 211,
+ "Chum on a Stick",
+ "Don't forget to try our Chum-balaya",
+ new GT_FoodStat(
+ 5,
+ 0.2F,
+ EnumAction.eat,
+ new ItemStack(Items.stick, 1),
+ true,
+ false,
+ true,
+ Potion.hunger.id,
+ 1000,
+ 4,
+ 100,
+ Potion.confusion.id,
+ 300,
+ 1,
+ 80),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Dough_Sugar.set(
+ addItem(
+ tLastID = 212,
+ "Sugary Dough",
+ "Don't eat the Dough before it is baken",
+ new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Food_Dough_Chocolate.set(
+ addItem(
+ tLastID = 213,
+ "Chocolate Dough",
+ "I said don't eat the Dough!",
+ new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Food_Raw_Cookie.set(
+ addItem(
+ tLastID = 214,
+ "Cookie shaped Dough",
+ "For baking Cookies",
+ new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+
+ ItemList.Food_Sliced_Buns.set(
+ addItem(
+ tLastID = 220,
+ "Buns",
+ "Pre Sliced",
+ new GT_FoodStat(3, 0.5F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Burger_Veggie.set(
+ addItem(
+ tLastID = 221,
+ "Veggieburger",
+ "No matter how you call this, this is NOT a Burger!",
+ new GT_FoodStat(3, 0.5F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Burger_Cheese.set(
+ addItem(
+ tLastID = 222,
+ "Cheeseburger",
+ "Cheesy!",
+ new GT_FoodStat(3, 0.5F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new ItemData(Materials.Cheese, 907200L)));
+ ItemList.Food_Burger_Meat.set(
+ addItem(
+ tLastID = 223,
+ "Hamburger",
+ "The Mc Burger Queen Burger",
+ new GT_FoodStat(3, 0.5F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Burger_Chum.set(
+ addItem(
+ tLastID = 224,
+ "Chumburger",
+ "Fum is Chum!",
+ new GT_FoodStat(
+ 5,
+ 0.2F,
+ EnumAction.eat,
+ null,
+ true,
+ false,
+ true,
+ Potion.hunger.id,
+ 1000,
+ 4,
+ 100,
+ Potion.confusion.id,
+ 300,
+ 1,
+ 80),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+
+ ItemList.Food_Sliced_Breads.set(
+ addItem(
+ tLastID = 230,
+ "Breads",
+ "Pre Sliced",
+ new GT_FoodStat(5, 0.6F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Sandwich_Veggie.set(
+ addItem(
+ tLastID = 231,
+ "Veggie Sandwich",
+ "Meatless",
+ new GT_FoodStat(7, 0.6F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ setFluidContainerStats(32000 + tLastID, 0L, 32L);
+ ItemList.Food_Sandwich_Cheese.set(
+ addItem(
+ tLastID = 232,
+ "Cheese Sandwich",
+ "Say Cheese!",
+ new GT_FoodStat(7, 0.6F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ setFluidContainerStats(32000 + tLastID, 0L, 32L);
+ ItemList.Food_Sandwich_Bacon.set(
+ addItem(
+ tLastID = 233,
+ "Bacon Sandwich",
+ "The best Sandwich ever!",
+ new GT_FoodStat(10, 0.8F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ setFluidContainerStats(32000 + tLastID, 0L, 32L);
+ ItemList.Food_Sandwich_Steak.set(
+ addItem(
+ tLastID = 234,
+ "Steak Sandwich",
+ "Not a 'Steam Sandwich'",
+ new GT_FoodStat(10, 0.8F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ setFluidContainerStats(32000 + tLastID, 0L, 32L);
+
+ ItemList.Food_Sliced_Baguettes.set(
+ addItem(
+ tLastID = 240,
+ "Baguettes",
+ "Pre Sliced",
+ new GT_FoodStat(8, 0.5F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Large_Sandwich_Veggie.set(
+ addItem(
+ tLastID = 241,
+ "Large Veggie Sandwich",
+ "Just not worth it",
+ new GT_FoodStat(15, 0.8F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ setFluidContainerStats(32000 + tLastID, 0L, 16L);
+ ItemList.Food_Large_Sandwich_Cheese.set(
+ addItem(
+ tLastID = 242,
+ "Large Cheese Sandwich",
+ "I need another cheesy tooltip for this",
+ new GT_FoodStat(15, 0.8F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ setFluidContainerStats(32000 + tLastID, 0L, 16L);
+ ItemList.Food_Large_Sandwich_Bacon.set(
+ addItem(
+ tLastID = 243,
+ "Large Bacon Sandwich",
+ "For Men! (and manly Women)",
+ new GT_FoodStat(20, 1.0F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ setFluidContainerStats(32000 + tLastID, 0L, 16L);
+ ItemList.Food_Large_Sandwich_Steak.set(
+ addItem(
+ tLastID = 244,
+ "Large Steak Sandwich",
+ "Yes, I once accidentially called it 'Steam Sandwich'",
+ new GT_FoodStat(20, 1.0F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ setFluidContainerStats(32000 + tLastID, 0L, 16L);
+
+ ItemList.Food_Raw_Pizza_Veggie.set(
+ addItem(
+ tLastID = 250,
+ "Raw Veggie Pizza",
+ "Into the Oven with it!",
+ new GT_FoodStat(1, 0.2F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Raw_Pizza_Cheese.set(
+ addItem(
+ tLastID = 251,
+ "Raw Cheese Pizza",
+ "Into the Oven with it!",
+ new GT_FoodStat(2, 0.2F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Raw_Pizza_Meat.set(
+ addItem(
+ tLastID = 252,
+ "Raw Mince Meat Pizza",
+ "Into the Oven with it!",
+ new GT_FoodStat(2, 0.2F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+
+ ItemList.Food_Baked_Pizza_Veggie.set(
+ addItem(
+ tLastID = 260,
+ "Veggie Pizza",
+ "The next they want is Gluten Free Pizzas...",
+ new GT_FoodStat(3, 0.3F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Baked_Pizza_Cheese.set(
+ addItem(
+ tLastID = 261,
+ "Cheese Pizza",
+ "Pizza Magarita",
+ new GT_FoodStat(4, 0.4F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Baked_Pizza_Meat.set(
+ addItem(
+ tLastID = 262,
+ "Mince Meat Pizza",
+ "Emo Pizza, it cuts itself!",
+ new GT_FoodStat(5, 0.5F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+
+ ItemList.Dye_Indigo.set(
+ addItem(
+ tLastID = 410,
+ "Indigo Dye",
+ "Blue Dye",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1L),
+ Dyes.dyeBlue));
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ ItemList.DYE_ONLY_ITEMS[i].set(
+ addItem(
+ tLastID = 414 + i,
+ Dyes.get(i).mName + " Dye",
+ "",
+ Dyes.get(i)
+ .name(),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1L)));
+ }
+ ItemList.Plank_Oak
+ .set(addItem(tLastID = 470, "Oak Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Spruce.set(
+ addItem(tLastID = 471, "Spruce Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Birch.set(
+ addItem(tLastID = 472, "Birch Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Jungle.set(
+ addItem(tLastID = 473, "Jungle Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Acacia.set(
+ addItem(tLastID = 474, "Acacia Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_DarkOak.set(
+ addItem(tLastID = 475, "Dark Oak Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Larch.set(
+ addItem(tLastID = 476, "Larch Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Teak
+ .set(addItem(tLastID = 477, "Teak Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Acacia_Green.set(
+ addItem(
+ tLastID = 478,
+ "Green Acacia Plank",
+ aTextCover,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Lime
+ .set(addItem(tLastID = 479, "Lime Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Chestnut.set(
+ addItem(tLastID = 480, "Chestnut Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Wenge.set(
+ addItem(tLastID = 481, "Wenge Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Baobab.set(
+ addItem(tLastID = 482, "Baobab Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Sequoia.set(
+ addItem(tLastID = 483, "Sequoia Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Kapok.set(
+ addItem(tLastID = 484, "Kapok Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Ebony.set(
+ addItem(tLastID = 485, "Ebony Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Mahagony.set(
+ addItem(tLastID = 486, "Mahagony Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Balsa.set(
+ addItem(tLastID = 487, "Balsa Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Willow.set(
+ addItem(tLastID = 488, "Willow Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Walnut.set(
+ addItem(tLastID = 489, "Walnut Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Greenheart.set(
+ addItem(
+ tLastID = 490,
+ "Greenheart Plank",
+ aTextCover,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Cherry.set(
+ addItem(tLastID = 491, "Cherry Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Mahoe.set(
+ addItem(tLastID = 492, "Mahoe Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Poplar.set(
+ addItem(tLastID = 493, "Poplar Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Palm
+ .set(addItem(tLastID = 494, "Palm Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Papaya.set(
+ addItem(tLastID = 495, "Papaya Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Pine
+ .set(addItem(tLastID = 496, "Pine Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Plum
+ .set(addItem(tLastID = 497, "Plum Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Maple.set(
+ addItem(tLastID = 498, "Maple Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+ ItemList.Plank_Citrus.set(
+ addItem(tLastID = 499, "Citrus Plank", aTextCover, new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 75);
+
+ ItemList.SFMixture.set(addItem(tLastID = 270, "Super Fuel Binder", "Raw Material"));
+ ItemList.MSFMixture.set(addItem(tLastID = 271, "Magic Super Fuel Binder", "Raw Material"));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Plank_Oak.get(2L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 0) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Plank_Spruce.get(2L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Plank_Birch.get(2L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 2) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Plank_Jungle.get(2L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 3) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Plank_Acacia.get(2L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 4) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Plank_DarkOak.get(2L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 5) });
+
+ GregTech_API.registerCover(ItemList.Plank_Oak.get(1L), TextureFactory.of(Blocks.planks, 0), null);
+ GregTech_API.registerCover(ItemList.Plank_Spruce.get(1L), TextureFactory.of(Blocks.planks, 1), null);
+ GregTech_API.registerCover(ItemList.Plank_Birch.get(1L), TextureFactory.of(Blocks.planks, 2), null);
+ GregTech_API.registerCover(ItemList.Plank_Jungle.get(1L), TextureFactory.of(Blocks.planks, 3), null);
+ GregTech_API.registerCover(ItemList.Plank_Acacia.get(1L), TextureFactory.of(Blocks.planks, 4), null);
+ GregTech_API.registerCover(ItemList.Plank_DarkOak.get(1L), TextureFactory.of(Blocks.planks, 5), null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Larch.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 0, new ItemStack(Blocks.planks, 1, 0))),
+ 0),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Teak.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 1, new ItemStack(Blocks.planks, 1, 0))),
+ 1),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Acacia_Green.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 2, new ItemStack(Blocks.planks, 1, 0))),
+ 2),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Lime.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 3, new ItemStack(Blocks.planks, 1, 0))),
+ 3),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Chestnut.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 4, new ItemStack(Blocks.planks, 1, 0))),
+ 4),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Wenge.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 5, new ItemStack(Blocks.planks, 1, 0))),
+ 5),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Baobab.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 6, new ItemStack(Blocks.planks, 1, 0))),
+ 6),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Sequoia.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 7, new ItemStack(Blocks.planks, 1, 0))),
+ 7),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Kapok.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 8, new ItemStack(Blocks.planks, 1, 0))),
+ 8),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Ebony.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 9, new ItemStack(Blocks.planks, 1, 0))),
+ 9),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Mahagony.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 10, new ItemStack(Blocks.planks, 1, 0))),
+ 10),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Balsa.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 11, new ItemStack(Blocks.planks, 1, 0))),
+ 11),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Willow.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 12, new ItemStack(Blocks.planks, 1, 0))),
+ 12),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Walnut.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 13, new ItemStack(Blocks.planks, 1, 0))),
+ 13),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Greenheart.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 14, new ItemStack(Blocks.planks, 1, 0))),
+ 14),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Cherry.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 15, new ItemStack(Blocks.planks, 1, 0))),
+ 15),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Mahoe.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 16, new ItemStack(Blocks.planks, 1, 0))),
+ 0),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Poplar.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 17, new ItemStack(Blocks.planks, 1, 0))),
+ 1),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Palm.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 18, new ItemStack(Blocks.planks, 1, 0))),
+ 2),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Papaya.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 19, new ItemStack(Blocks.planks, 1, 0))),
+ 3),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Pine.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 20, new ItemStack(Blocks.planks, 1, 0))),
+ 4),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Plum.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 21, new ItemStack(Blocks.planks, 1, 0))),
+ 5),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Maple.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 22, new ItemStack(Blocks.planks, 1, 0))),
+ 6),
+ null);
+ GregTech_API.registerCover(
+ ItemList.Plank_Citrus.get(1L),
+ TextureFactory.of(
+ GT_Utility.getBlockFromStack(
+ GT_ModHandler.getModItem(Forestry.ID, "planks", 1L, 23, new ItemStack(Blocks.planks, 1, 0))),
+ 7),
+ null);
+
+ ItemList.Crop_Drop_Plumbilia.set(
+ addItem(
+ tLastID = 500,
+ "Plumbilia Leaf",
+ "Source of Lead",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L)));
+ ItemList.Crop_Drop_Argentia.set(
+ addItem(
+ tLastID = 501,
+ "Argentia Leaf",
+ "Source of Silver",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L)));
+ ItemList.Crop_Drop_Indigo.set(
+ addItem(
+ tLastID = 502,
+ "Indigo Blossom",
+ "Used for making Blue Dye",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 1L)));
+ ItemList.Crop_Drop_Ferru.set(
+ addItem(
+ tLastID = 503,
+ "Ferru Leaf",
+ "Source of Iron",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L)));
+ ItemList.Crop_Drop_Aurelia.set(
+ addItem(
+ tLastID = 504,
+ "Aurelia Leaf",
+ "Source of Gold",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L)));
+ ItemList.Crop_Drop_TeaLeaf.set(
+ addItem(
+ tLastID = 505,
+ "Tea Leaf",
+ "Source of Tea",
+ "cropTea",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L)));
+
+ ItemList.Crop_Drop_OilBerry.set(
+ addItem(
+ tLastID = 510,
+ "Oil Berry",
+ "Oil in Berry form",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L)));
+ ItemList.Crop_Drop_BobsYerUncleRanks.set(
+ addItem(
+ tLastID = 511,
+ "Bobs-Yer-Uncle-Berry",
+ "Source of Emeralds",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L)));
+ ItemList.Crop_Drop_UUMBerry.set(
+ addItem(
+ tLastID = 512,
+ "UUM Berry",
+ "UUM in Berry form",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L)));
+ ItemList.Crop_Drop_UUABerry.set(
+ addItem(
+ tLastID = 513,
+ "UUA Berry",
+ "UUA in Berry form",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L)));
+
+ ItemList.Crop_Drop_MilkWart.set(
+ addItem(
+ tLastID = 520,
+ "Milk Wart",
+ "Source of Milk",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L)));
+
+ ItemList.Crop_Drop_Coppon.set(
+ addItem(
+ tLastID = 530,
+ "Coppon Fiber",
+ "ORANGE WOOOOOOOL!!!",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 1L)));
+
+ ItemList.Crop_Drop_Tine.set(
+ addItem(
+ tLastID = 540,
+ "Tine Twig",
+ "Source of Tin",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 100);
+
+ ItemList.Crop_Drop_Mica.set(
+ addItem(
+ tLastID = 538,
+ "Micadia Twig",
+ "Source of Mica",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 1L)));
+ setBurnValue(32000 + tLastID, 240);
+
+ ItemList.Crop_Drop_Bauxite.set(addItem(tLastID = 521, "Bauxia Leaf", "Source of Aluminium"));
+ ItemList.Crop_Drop_Ilmenite.set(addItem(tLastID = 522, "Titania Leaf", "Source of Titanium"));
+ ItemList.Crop_Drop_Pitchblende.set(addItem(tLastID = 523, "Reactoria Leaf", "Source of Uranium"));
+ ItemList.Crop_Drop_Uraninite.set(addItem(tLastID = 524, "Uranium Leaf", "Source of Uranite"));
+ ItemList.Crop_Drop_Thorium.set(addItem(tLastID = 526, "Thunder Leaf", "Source of Thorium"));
+ ItemList.Crop_Drop_Nickel.set(addItem(tLastID = 527, "Nickelback Leaf", "Source of Nickel"));
+ ItemList.Crop_Drop_Zinc.set(addItem(tLastID = 528, "Galvania Leaf", "Source of Zinc"));
+ ItemList.Crop_Drop_Manganese.set(addItem(tLastID = 529, "Pyrolusium Leaf", "Source of Manganese"));
+ ItemList.Crop_Drop_Scheelite.set(addItem(tLastID = 531, "Scheelinium Leaf", "Source of Tungsten"));
+ ItemList.Crop_Drop_Platinum.set(addItem(tLastID = 532, "Platina Leaf", "Source of Platinum"));
+ ItemList.Crop_Drop_Iridium.set(addItem(tLastID = 533, "Quantaria Leaf", "Source of Iridium"));
+ ItemList.Crop_Drop_Osmium.set(addItem(tLastID = 534, "Quantaria Leaf", "Source of Osmium"));
+ ItemList.Crop_Drop_Naquadah.set(addItem(tLastID = 535, "Stargatium Leaf", "Source of Naquadah"));
+
+ ItemList.Crop_Drop_Chilly.set(
+ addItem(
+ tLastID = 550,
+ "Chilly Pepper",
+ "It is red and hot",
+ "cropChilipepper",
+ new GT_FoodStat(1, 0.3F, EnumAction.eat, null, false, true, false, Potion.confusion.id, 200, 1, 40),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Crop_Drop_Lemon.set(
+ addItem(
+ tLastID = 551,
+ "Lemon",
+ "Don't make Lemonade",
+ "cropLemon",
+ new GT_FoodStat(1, 0.3F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Crop_Drop_Tomato.set(
+ addItem(
+ tLastID = 552,
+ "Tomato",
+ "Solid Ketchup",
+ "cropTomato",
+ new GT_FoodStat(1, 0.2F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Crop_Drop_MTomato.set(
+ addItem(
+ tLastID = 553,
+ "Max Tomato",
+ "Full Health in one Tomato",
+ "cropTomato",
+ new GT_FoodStat(
+ 9,
+ 1.0F,
+ EnumAction.eat,
+ null,
+ false,
+ true,
+ false,
+ Potion.regeneration.id,
+ 100,
+ 100,
+ 100),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Crop_Drop_Grapes.set(
+ addItem(
+ tLastID = 554,
+ "Grapes",
+ "Source of Wine",
+ "cropGrape",
+ new GT_FoodStat(2, 0.3F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Crop_Drop_Onion.set(
+ addItem(
+ tLastID = 555,
+ "Onion",
+ "Taking over the whole Taste",
+ "cropOnion",
+ new GT_FoodStat(2, 0.2F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Crop_Drop_Cucumber.set(
+ addItem(
+ tLastID = 556,
+ "Cucumber",
+ "Not a Sea Cucumber!",
+ "cropCucumber",
+ new GT_FoodStat(1, 0.2F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Crop_Drop_Rape.set(
+ addItem(
+ tLastID = 557,
+ "Rape",
+ "Time to oil up!",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 1L)));
+
+ ItemList.Food_Cheese.set(
+ addItem(
+ tLastID = 558,
+ "Cheese",
+ "Click the Cheese",
+ "foodCheese",
+ new GT_FoodStat(3, 0.6F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 2L)));
+ ItemList.Food_Dough.set(
+ addItem(
+ tLastID = 559,
+ "Dough",
+ "For making Breads",
+ "foodDough",
+ new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Food_Flat_Dough.set(
+ addItem(
+ tLastID = 560,
+ "Flattened Dough",
+ "For making Pizza",
+ new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Food_Raw_Bread.set(
+ addItem(
+ tLastID = 561,
+ "Dough",
+ "In Bread Shape",
+ new GT_FoodStat(1, 0.2F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Food_Raw_Bun.set(
+ addItem(
+ tLastID = 562,
+ "Dough",
+ "In Bun Shape",
+ new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Food_Raw_Baguette.set(
+ addItem(
+ tLastID = 563,
+ "Dough",
+ "In Baguette Shape",
+ new GT_FoodStat(1, 0.3F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Food_Baked_Bun.set(
+ addItem(
+ tLastID = 564,
+ "Bun",
+ "Do not teleport Bread!",
+ new GT_FoodStat(3, 0.5F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Baked_Baguette.set(
+ addItem(
+ tLastID = 565,
+ "Baguette",
+ "I teleported nothing BUT Bread!!!",
+ new GT_FoodStat(8, 0.5F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Sliced_Bread.set(
+ addItem(
+ tLastID = 566,
+ "Sliced Bread",
+ "Just half a Bread",
+ new GT_FoodStat(2, 0.3F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Sliced_Bun.set(
+ addItem(
+ tLastID = 567,
+ "Sliced Bun",
+ "Just half a Bun",
+ new GT_FoodStat(1, 0.3F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Sliced_Baguette.set(
+ addItem(
+ tLastID = 568,
+ "Sliced Baguette",
+ "Just half a Baguette",
+ new GT_FoodStat(4, 0.3F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L)));
+ ItemList.Food_Raw_Cake.set(
+ addItem(
+ tLastID = 569,
+ "Cake Bottom",
+ "For making Cake",
+ new GT_FoodStat(2, 0.2F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Food_Baked_Cake.set(
+ addItem(
+ tLastID = 570,
+ "Baked Cake Bottom",
+ "I know I promised you an actual Cake, but well...",
+ new GT_FoodStat(3, 0.3F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+ ItemList.Food_Sliced_Lemon.set(
+ addItem(
+ tLastID = 571,
+ "Lemon Slice",
+ "Ideal to put on your Drink",
+ new GT_FoodStat(1, 0.075F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L)));
+ ItemList.Food_Sliced_Tomato.set(
+ addItem(
+ tLastID = 572,
+ "Tomato Slice",
+ "Solid Ketchup",
+ new GT_FoodStat(1, 0.05F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L)));
+ ItemList.Food_Sliced_Onion.set(
+ addItem(
+ tLastID = 573,
+ "Onion Slice",
+ "ONIONS, UNITE!",
+ new GT_FoodStat(1, 0.05F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L)));
+ ItemList.Food_Sliced_Cucumber.set(
+ addItem(
+ tLastID = 574,
+ "Cucumber Slice",
+ "QUEWWW-CUMMM-BERRR!!!",
+ new GT_FoodStat(1, 0.05F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 1L)));
+
+ ItemList.Food_Sliced_Cheese.set(
+ addItem(
+ tLastID = 576,
+ "Cheese Slice",
+ "ALIEN ATTACK!!!, throw the CHEEEEESE!!!",
+ new GT_FoodStat(1, 0.1F, EnumAction.eat, null, false, true, false),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FAMES, 1L)));
+
+ ItemList.Cover_AdvancedRedstoneTransmitterExternal.set(
+ addItem(
+ tLastID = 577,
+ "Advanced Redstone Transmitter (External)",
+ "Transfers Redstone signals wirelessly/n Can only connect with advanced wireless covers",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L)));
+ ItemList.Cover_AdvancedRedstoneTransmitterInternal.set(
+ addItem(
+ tLastID = 578,
+ "Advanced Redstone Transmitter (Internal)",
+ "Transfers Redstone signals wirelessly/n Can only connect with advanced wireless covers",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L)));
+ ItemList.Cover_AdvancedRedstoneReceiverExternal.set(
+ addItem(
+ tLastID = 579,
+ "Advanced Redstone Receiver (External)",
+ "Transfers Redstone signals wirelessly/n Can only connect with advanced wireless covers",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L)));
+ ItemList.Cover_AdvancedRedstoneReceiverInternal.set(
+ addItem(
+ tLastID = 580,
+ "Advanced Redstone Receiver (Internal)",
+ "Transfers Redstone signals wirelessly/n Can only connect with advanced wireless covers",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L)));
+
+ ItemList.Cover_WirelessFluidDetector.set(
+ addItem(
+ tLastID = 581,
+ "Wireless Fluid Detector Cover",
+ "Transfers Fluid Amount as Redstone wirelessly/n Can only connect with advanced wireless covers",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L)));
+ ItemList.Cover_WirelessItemDetector.set(
+ addItem(
+ tLastID = 582,
+ "Wireless Item Detector Cover",
+ "Transfers Item Amount as Redstone wirelessly/n Can only connect with advanced wireless covers",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1L)));
+
+ ItemList.Cover_WirelessNeedsMaintainance.set(
+ addItem(
+ tLastID = 583,
+ "Wireless Needs Maintenance Cover",
+ "Transfers Maintenance Issues as Redstone wirelessly/n Can only connect with advanced wireless covers",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 3L)));
+
+ ItemList.Cover_WirelessActivityDetector.set(
+ addItem(
+ tLastID = 584,
+ "Wireless Activity Detector Cover",
+ "Transfers Activity as Redstone wirelessly/n Can only connect with advanced wireless covers",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SENSUS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1L)));
+
+ GregTech_API.registerCover(
+ ItemList.Cover_AdvancedRedstoneTransmitterExternal.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_TRANSMITTER)),
+ new GT_Cover_AdvancedRedstoneTransmitterExternal(TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_TRANSMITTER)));
+
+ GregTech_API.registerCover(
+ ItemList.Cover_AdvancedRedstoneTransmitterInternal.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_TRANSMITTER)),
+ new GT_Cover_AdvancedRedstoneTransmitterInternal(TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_TRANSMITTER)));
+
+ GregTech_API.registerCover(
+ ItemList.Cover_AdvancedRedstoneReceiverExternal.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_RECEIVER)),
+ new GT_Cover_AdvancedRedstoneReceiverExternal(TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_RECEIVER)));
+
+ GregTech_API.registerCover(
+ ItemList.Cover_AdvancedRedstoneReceiverInternal.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_RECEIVER)),
+ new GT_Cover_AdvancedRedstoneReceiverInternal(TextureFactory.of(OVERLAY_ADVANCED_REDSTONE_RECEIVER)));
+
+ GregTech_API.registerCover(
+ ItemList.Cover_WirelessFluidDetector.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_WIRELESS_FLUID_DETECTOR)),
+ new GT_Cover_WirelessFluidDetector(TextureFactory.of(OVERLAY_WIRELESS_FLUID_DETECTOR)));
+
+ GregTech_API.registerCover(
+ ItemList.Cover_WirelessItemDetector.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_WIRELESS_ITEM_DETECTOR)),
+ new GT_Cover_WirelessItemDetector(TextureFactory.of(OVERLAY_WIRELESS_ITEM_DETECTOR)));
+
+ GregTech_API.registerCover(
+ ItemList.Cover_WirelessActivityDetector.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_WIRELESS_ACTIVITYDETECTOR)),
+ new GT_Cover_WirelessDoesWorkDetector(TextureFactory.of(OVERLAY_WIRELESS_ACTIVITYDETECTOR)));
+
+ GregTech_API.registerCover(
+ ItemList.Cover_WirelessNeedsMaintainance.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_WIRELESS_MAINTENANCE_DETECTOR)),
+ new GT_Cover_WirelessMaintenanceDetector(TextureFactory.of(OVERLAY_WIRELESS_MAINTENANCE_DETECTOR)));
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Cover_RedstoneTransmitterExternal.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Data, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_AdvancedRedstoneTransmitterExternal.get(1L))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Cover_RedstoneReceiverExternal.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Data, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_AdvancedRedstoneReceiverExternal.get(1L))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Cover_FluidDetector.get(1L),
+ ItemList.Emitter_EV.get(1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_WirelessFluidDetector.get(1L))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Cover_ItemDetector.get(1L),
+ ItemList.Emitter_EV.get(1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_WirelessItemDetector.get(1L))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Cover_NeedsMaintainance.get(1L),
+ ItemList.Emitter_EV.get(1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_WirelessNeedsMaintainance.get(1L))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Cover_ActivityDetector.get(1L),
+ ItemList.Emitter_EV.get(1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_WirelessActivityDetector.get(1L))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Cover_AdvancedRedstoneReceiverExternal.get(1L),
+ new Object[] { ItemList.Cover_AdvancedRedstoneReceiverInternal.get(1L) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Cover_AdvancedRedstoneReceiverInternal.get(1L),
+ new Object[] { ItemList.Cover_AdvancedRedstoneReceiverExternal.get(1L) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Cover_AdvancedRedstoneTransmitterExternal.get(1L),
+ new Object[] { ItemList.Cover_AdvancedRedstoneTransmitterInternal.get(1L) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Cover_AdvancedRedstoneTransmitterInternal.get(1L),
+ new Object[] { ItemList.Cover_AdvancedRedstoneTransmitterExternal.get(1L) });
+
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.red_flower, 1, 0), new ItemStack(Items.dye, 2, 1));
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.red_flower, 1, 1), new ItemStack(Items.dye, 2, 12));
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.red_flower, 1, 2), new ItemStack(Items.dye, 2, 13));
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.red_flower, 1, 3), new ItemStack(Items.dye, 2, 7));
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.red_flower, 1, 4), new ItemStack(Items.dye, 2, 1));
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.red_flower, 1, 5), new ItemStack(Items.dye, 2, 14));
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.red_flower, 1, 6), new ItemStack(Items.dye, 2, 7));
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.red_flower, 1, 7), new ItemStack(Items.dye, 2, 9));
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.red_flower, 1, 8), new ItemStack(Items.dye, 2, 7));
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.yellow_flower, 1, 0), new ItemStack(Items.dye, 2, 11));
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.double_plant, 1, 0), new ItemStack(Items.dye, 3, 11));
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.double_plant, 1, 1), new ItemStack(Items.dye, 3, 13));
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.double_plant, 1, 4), new ItemStack(Items.dye, 3, 1));
+ GT_ModHandler.addExtractionRecipe(new ItemStack(Blocks.double_plant, 1, 5), new ItemStack(Items.dye, 3, 9));
+ GT_ModHandler.addExtractionRecipe(
+ ItemList.Crop_Drop_Plumbilia.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lead, 1L));
+ GT_ModHandler.addExtractionRecipe(
+ ItemList.Crop_Drop_Argentia.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Silver, 1L));
+ GT_ModHandler.addExtractionRecipe(ItemList.Crop_Drop_Indigo.get(1L), ItemList.Dye_Indigo.get(1L));
+ GT_ModHandler.addExtractionRecipe(
+ ItemList.Crop_Drop_MilkWart.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Milk, 1L));
+ GT_ModHandler.addExtractionRecipe(
+ ItemList.Crop_Drop_Coppon.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Copper, 1L));
+ GT_ModHandler.addExtractionRecipe(
+ ItemList.Crop_Drop_Tine.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Tin, 1L));
+
+ // Compression recipes
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_Coppon.get(4L))
+ .itemOutputs(new ItemStack(Blocks.wool, 1, 1))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_Plumbilia.get(4L))
+ .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_Argentia.get(4L))
+ .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_Indigo.get(4L))
+ .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_Ferru.get(4L))
+ .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_Aurelia.get(4L))
+ .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_OilBerry.get(4L))
+ .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_BobsYerUncleRanks.get(4L))
+ .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_Tine.get(4L))
+ .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_Rape.get(4L))
+ .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.red_flower, 8, 32767))
+ .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.yellow_flower, 8, 32767))
+ .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Sliced_Cheese.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Cheese, 1L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Dye_Cocoa.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cocoa, 1L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_Tine.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 2L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.pumpkin, 1, 0))
+ .itemOutputs(new ItemStack(Items.pumpkin_seeds, 4, 0))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.melon, 1, 0))
+ .itemOutputs(new ItemStack(Items.melon_seeds, 1, 0))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("crop", 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.stick, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 2L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.wool, 1, WILDCARD))
+ .itemOutputs(new ItemStack(Items.string, 2), new ItemStack(Items.string, 1))
+ .outputChances(10000, 5000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Tesseract.get(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsUEVplus.TranscendentMetal, 8L))
+ .duration(5 * SECONDS)
+ .eut(32_000_000)
+ .addTo(maceratorRecipes);
+ try {
+ CropCard tCrop;
+ GT_Utility.getField(tCrop = Crops.instance.getCropList()[13], "mDrop")
+ .set(tCrop, ItemList.Crop_Drop_Ferru.get(1L));
+ GT_Utility.getField(tCrop = Crops.instance.getCropList()[14], "mDrop")
+ .set(tCrop, ItemList.Crop_Drop_Aurelia.get(1L));
+ } catch (Throwable e) {
+ if (GT_Values.D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ ItemList.Display_ITS_FREE.set(
+ addItem(
+ tLastID = 765,
+ "ITS FREE",
+ "(or at least almost free)",
+ SubTag.INVISIBLE,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L)));
+ }
+
+ @Override
+ public boolean onLeftClickEntity(ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) {
+ super.onLeftClickEntity(aStack, aPlayer, aEntity);
+ int aDamage = aStack.getItemDamage();
+ if ((aDamage >= 25000) && (aDamage < 27000)) {
+ if (aDamage >= 26000) {
+ return Behaviour_Arrow.DEFAULT_PLASTIC.onLeftClickEntity(this, aStack, aPlayer, aEntity);
+ }
+ return Behaviour_Arrow.DEFAULT_WOODEN.onLeftClickEntity(this, aStack, aPlayer, aEntity);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean hasProjectile(SubTag aProjectileType, ItemStack aStack) {
+ int aDamage = aStack.getItemDamage();
+ return ((aDamage >= 25000) && (aDamage < 27000)) || (super.hasProjectile(aProjectileType, aStack));
+ }
+
+ @Override
+ public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, double aX, double aY,
+ double aZ) {
+ int aDamage = aStack.getItemDamage();
+ if ((aDamage >= 25000) && (aDamage < 27000)) {
+ if (aDamage >= 26000) {
+ return Behaviour_Arrow.DEFAULT_PLASTIC.getProjectile(this, aProjectileType, aStack, aWorld, aX, aY, aZ);
+ }
+ return Behaviour_Arrow.DEFAULT_WOODEN.getProjectile(this, aProjectileType, aStack, aWorld, aX, aY, aZ);
+ }
+ return super.getProjectile(aProjectileType, aStack, aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, EntityLivingBase aEntity,
+ float aSpeed) {
+ int aDamage = aStack.getItemDamage();
+ if ((aDamage >= 25000) && (aDamage < 27000)) {
+ if (aDamage >= 26000) {
+ return Behaviour_Arrow.DEFAULT_PLASTIC
+ .getProjectile(this, aProjectileType, aStack, aWorld, aEntity, aSpeed);
+ }
+ return Behaviour_Arrow.DEFAULT_WOODEN.getProjectile(this, aProjectileType, aStack, aWorld, aEntity, aSpeed);
+ }
+ return super.getProjectile(aProjectileType, aStack, aWorld, aEntity, aSpeed);
+ }
+
+ @Override
+ public boolean isItemStackUsable(ItemStack aStack) {
+ int aDamage = aStack.getItemDamage();
+ Materials aMaterial = GregTech_API.sGeneratedMaterials[(aDamage % 1000)];
+ if ((aDamage >= 25000) && (aDamage < 27000) && (aMaterial != null) && (aMaterial.mEnchantmentTools != null)) {
+ Enchantment tEnchant = aMaterial.mEnchantmentTools == Enchantment.fortune ? Enchantment.looting
+ : aMaterial.mEnchantmentTools;
+ if (tEnchant.type == EnumEnchantmentType.weapon) {
+ NBTTagCompound tNBT = GT_Utility.ItemNBT.getNBT(aStack);
+ if (!tNBT.getBoolean("GT.HasBeenUpdated")) {
+ tNBT.setBoolean("GT.HasBeenUpdated", true);
+ GT_Utility.ItemNBT.setNBT(aStack, tNBT);
+ GT_Utility.ItemNBT.addEnchantment(aStack, tEnchant, aMaterial.mEnchantmentToolsLevel);
+ }
+ }
+ }
+ return super.isItemStackUsable(aStack);
+ }
+
+ @Override
+ public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) {
+ return (aDoShowAllItems) || (!aPrefix.name()
+ .startsWith("toolHead"));
+ }
+
+ @Override
+ public ItemStack onDispense(IBlockSource aSource, ItemStack aStack) {
+ int aDamage = aStack.getItemDamage();
+ if ((aDamage >= 25000) && (aDamage < 27000)) {
+ if (aDamage >= 26000) {
+ return Behaviour_Arrow.DEFAULT_PLASTIC.onDispense(this, aSource, aStack);
+ }
+ return Behaviour_Arrow.DEFAULT_WOODEN.onDispense(this, aSource, aStack);
+ }
+ return super.onDispense(aSource, aStack);
+ }
+
+ @Override
+ public final ItemStack getContainerItem(ItemStack aStack) {
+ int aDamage = aStack.getItemDamage();
+ if (aDamage < 32000) {
+ return null;
+ }
+ if (aDamage < 32100) {
+ return ItemList.ThermosCan_Empty.get(1L);
+ }
+ if (aDamage < 32200) {
+ return ItemList.Bottle_Empty.get(1L);
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_03.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_03.java
new file mode 100644
index 0000000000..3a0c4a95d8
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_03.java
@@ -0,0 +1,1087 @@
+package gregtech.common.items;
+
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_METRICS_TRANSMITTER;
+import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_UEV;
+import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_UHV;
+import static gregtech.api.enums.Textures.BlockIcons.SOLARPANEL_UIV;
+import static gregtech.client.GT_TooltipHandler.Tier.EV;
+import static gregtech.client.GT_TooltipHandler.Tier.HV;
+import static gregtech.client.GT_TooltipHandler.Tier.IV;
+import static gregtech.client.GT_TooltipHandler.Tier.LV;
+import static gregtech.client.GT_TooltipHandler.Tier.LuV;
+import static gregtech.client.GT_TooltipHandler.Tier.MAX;
+import static gregtech.client.GT_TooltipHandler.Tier.MV;
+import static gregtech.client.GT_TooltipHandler.Tier.UEV;
+import static gregtech.client.GT_TooltipHandler.Tier.UHV;
+import static gregtech.client.GT_TooltipHandler.Tier.UIV;
+import static gregtech.client.GT_TooltipHandler.Tier.ULV;
+import static gregtech.client.GT_TooltipHandler.Tier.UMV;
+import static gregtech.client.GT_TooltipHandler.Tier.UV;
+import static gregtech.client.GT_TooltipHandler.Tier.UXV;
+import static gregtech.client.GT_TooltipHandler.Tier.ZPM;
+import static gregtech.client.GT_TooltipHandler.registerTieredTooltip;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.items.GT_MetaGenerated_Item_X32;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.common.covers.GT_Cover_Metrics_Transmitter;
+import gregtech.common.covers.GT_Cover_SolarPanel;
+
+public class GT_MetaGenerated_Item_03 extends GT_MetaGenerated_Item_X32 {
+
+ public static GT_MetaGenerated_Item_03 INSTANCE;
+
+ public GT_MetaGenerated_Item_03() {
+ super(
+ "metaitem.03",
+ OrePrefixes.crateGtDust,
+ OrePrefixes.crateGtIngot,
+ OrePrefixes.crateGtGem,
+ OrePrefixes.crateGtPlate,
+ OrePrefixes.nanite,
+ OrePrefixes.rawOre);
+ INSTANCE = this;
+ Object[] o = new Object[0];
+
+ /*
+ * circuit boards tier 1-7: coated circuit board / wood plate + resin Plastic Circuit Board / Plastic + Copper
+ * Foil + Sulfuric Acid phenolic circuit board /carton+glue+chemical bath epoxy circuit board /epoxy plate +
+ * copper foil + sulfuric acid fiberglass circuit board (simple + multilayer) / glass + plastic + electrum foil
+ * + sulfuric acid wetware lifesupport board / fiberglass CB + teflon +
+ */
+ ItemList.Circuit_Board_Wetware
+ .set(addItem(6, "Wetware Lifesupport Circuit Board", "The Board that keeps life", o));
+ ItemList.Circuit_Board_Plastic.set(addItem(7, "Plastic Circuit Board", "A Good Board", o));
+ ItemList.Circuit_Board_Bio.set(addItem(8, "Bio Circuit Board", "Bio genetic mutated Board", o));
+
+ /*
+ * electronic components: vacuum tube (glass tube + red alloy cables) basic electronic circuits normal+smd coils
+ * diodes normal+smd transistors normal+smd capacitors normal+smd Glass Fibers
+ */
+ ItemList.Circuit_Parts_ResistorSMD.set(
+ addItem(
+ 11,
+ "SMD Resistor",
+ "Electronic Component",
+ OrePrefixes.componentCircuit.get(Materials.Resistor),
+ SubTag.NO_UNIFICATION));
+ ItemList.Circuit_Parts_Glass_Tube.set(addItem(12, "Glass Tube", "", o));
+ ItemList.Circuit_Parts_Coil.set(addItem(14, "Small Coil", "Basic Electronic Component", o));
+ ItemList.Circuit_Parts_DiodeSMD.set(
+ addItem(
+ 16,
+ "SMD Diode",
+ "Electronic Component",
+ OrePrefixes.componentCircuit.get(Materials.Diode),
+ SubTag.NO_UNIFICATION));
+ ItemList.Circuit_Parts_TransistorSMD.set(
+ addItem(
+ 18,
+ "SMD Transistor",
+ "Electronic Component",
+ OrePrefixes.componentCircuit.get(Materials.Transistor),
+ SubTag.NO_UNIFICATION));
+ ItemList.Circuit_Parts_CapacitorSMD.set(
+ addItem(
+ 20,
+ "SMD Capacitor",
+ "Electronic Component",
+ OrePrefixes.componentCircuit.get(Materials.Capacitor),
+ SubTag.NO_UNIFICATION));
+ ItemList.Circuit_Parts_GlassFiber
+ .set(addItem(21, "Glass Fiber", Materials.BorosilicateGlass.mChemicalFormula, o));
+ ItemList.Circuit_Parts_PetriDish.set(addItem(22, "Petri Dish", "For cultivating cells", o));
+ ItemList.Circuit_Parts_Reinforced_Glass_Tube.set(addItem(23, "Reinforced Glass Tube", "", o));
+
+ ItemList.Circuit_Parts_ResistorASMD
+ .set(addItem(24, "Advanced SMD Resistor", "Advanced Electronic Component", o));
+ ItemList.Circuit_Parts_DiodeASMD.set(addItem(25, "Advanced SMD Diode", "Advanced Electronic Component", o));
+ ItemList.Circuit_Parts_TransistorASMD
+ .set(addItem(26, "Advanced SMD Transistor", "Advanced Electronic Component", o));
+ ItemList.Circuit_Parts_CapacitorASMD
+ .set(addItem(27, "Advanced SMD Capacitor", "Advanced Electronic Component", o));
+
+ ItemList.Circuit_Parts_ResistorXSMD
+ .set(addItem(178, "Optical SMD Resistor", "Highly Advanced Electronic Component", o));
+ ItemList.Circuit_Parts_DiodeXSMD
+ .set(addItem(179, "Optical SMD Diode", "Highly Advanced Electronic Component", o));
+ ItemList.Circuit_Parts_TransistorXSMD
+ .set(addItem(180, "Optical SMD Transistor", "Highly Advanced Electronic Component", o));
+ ItemList.Circuit_Parts_CapacitorXSMD
+ .set(addItem(181, "Optical SMD Capacitor", "Highly Advanced Electronic Component", o));
+
+ ItemList.Circuit_Parts_InductorSMD.set(
+ addItem(
+ 182,
+ "SMD Inductor",
+ "Electronic Component",
+ OrePrefixes.componentCircuit.get(Materials.Inductor),
+ SubTag.NO_UNIFICATION));
+ ItemList.Circuit_Parts_InductorASMD
+ .set(addItem(183, "Advanced SMD Inductor", "Advanced Electronic Component", o));
+ ItemList.Circuit_Parts_InductorXSMD
+ .set(addItem(184, "Optical SMD Inductor", "Highly Advanced Electronic Component", o));
+
+ GT_OreDictUnificator
+ .set(OrePrefixes.componentCircuit, Materials.Resistor, ItemList.Circuit_Parts_Resistor.get(1L));
+ GT_OreDictUnificator.set(OrePrefixes.componentCircuit, Materials.Diode, ItemList.Circuit_Parts_Diode.get(1L));
+ GT_OreDictUnificator
+ .set(OrePrefixes.componentCircuit, Materials.Transistor, ItemList.Circuit_Parts_Transistor.get(1L));
+ GT_OreDictUnificator.set(OrePrefixes.componentCircuit, Materials.Inductor, ItemList.Circuit_Parts_Coil.get(1L));
+ GT_OreDictUnificator
+ .set(OrePrefixes.componentCircuit, Materials.Capacitor, ItemList.Circuit_Parts_Capacitor.get(1L));
+
+ GT_OreDictUnificator.addAssociation(
+ OrePrefixes.componentCircuit,
+ Materials.Resistor,
+ ItemList.Circuit_Parts_ResistorSMD.get(1L),
+ true);
+ GT_OreDictUnificator.addAssociation(
+ OrePrefixes.componentCircuit,
+ Materials.Diode,
+ ItemList.Circuit_Parts_DiodeSMD.get(1L),
+ true);
+ GT_OreDictUnificator.addAssociation(
+ OrePrefixes.componentCircuit,
+ Materials.Transistor,
+ ItemList.Circuit_Parts_TransistorSMD.get(1L),
+ true);
+ GT_OreDictUnificator.addAssociation(
+ OrePrefixes.componentCircuit,
+ Materials.Capacitor,
+ ItemList.Circuit_Parts_CapacitorSMD.get(1L),
+ true);
+ GT_OreDictUnificator.addAssociation(
+ OrePrefixes.componentCircuit,
+ Materials.Inductor,
+ ItemList.Circuit_Parts_InductorSMD.get(1L),
+ true);
+
+ /*
+ * ICs Lenses made from perfect crystals first instead of plates Monocrystalline silicon ingot
+ * (normal+glowstone+naquadah) EBF, normal silicon no EBF need anymore wafer(normal+glowstone+naquadah) cut mono
+ * silicon ingot in cutting machine
+ * Integrated Logic Circuit(8bit DIP) RAM NAND Memory NOR Memory CPU (4 sizes) SoCs(2 sizes, high tier cheap low
+ * tech component) Power IC/High Power IC/Ultra High power
+ * nanotube interconnected circuit (H-IC + nanotubes)
+ * quantum chips
+ */
+ ItemList.Circuit_Silicon_Ingot.set(addItem(30, "Monocrystalline Silicon Boule", "Raw Circuit", o));
+ ItemList.Circuit_Silicon_Ingot2
+ .set(addItem(31, "Phosphorus doped Monocrystalline Silicon Boule", "Raw Circuit", o));
+ ItemList.Circuit_Silicon_Ingot3
+ .set(addItem(32, "Naquadah doped Monocrystalline Silicon Boule", "Raw Circuit", o));
+ ItemList.Circuit_Silicon_Ingot4
+ .set(addItem(150, "Europium doped Monocrystalline Silicon Boule", "Raw Circuit", o));
+ ItemList.Circuit_Silicon_Ingot5
+ .set(addItem(152, "Americium doped Monocrystalline Silicon Boule", "Raw Circuit", o));
+ ItemList.Circuit_Silicon_Ingot6.set(addItem(721, "Optically Enriched Crystalline Boule", "Raw Circuit", o));
+
+ ItemList.Circuit_Silicon_Wafer.set(addItem(33, "Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Silicon_Wafer2.set(addItem(34, "Phosphorus doped Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Silicon_Wafer3.set(addItem(35, "Naquadah doped Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Silicon_Wafer4.set(addItem(151, "Europium doped Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Silicon_Wafer5.set(addItem(153, "Americium doped Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Silicon_Wafer6.set(addItem(722, "Photonically Prepared Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Silicon_Wafer7.set(addItem(723, "Photonically Enhanced Wafer", "Raw Circuit", o));
+
+ ItemList.Circuit_Wafer_ILC.set(addItem(36, "Integrated Logic Circuit (Wafer)", "Raw Circuit", o));
+ ItemList.Circuit_Chip_ILC.set(addItem(37, "Integrated Logic Circuit", "Integrated Circuit", o));
+
+ ItemList.Circuit_Wafer_Ram.set(addItem(38, "Random Access Memory Chip (Wafer)", "Raw Circuit", o));
+ ItemList.Circuit_Chip_Ram.set(addItem(39, "Random Access Memory Chip", "Integrated Circuit", o));
+
+ ItemList.Circuit_Wafer_NAND.set(addItem(40, "NAND Memory Chip (Wafer)", "Raw Circuit", o));
+ ItemList.Circuit_Chip_NAND.set(addItem(41, "NAND Memory Chip", "Integrated Circuit", o));
+
+ ItemList.Circuit_Wafer_NOR.set(addItem(42, "NOR Memory Chip (Wafer)", "Raw Circuit", o));
+ ItemList.Circuit_Chip_NOR.set(addItem(43, "NOR Memory Chip", "Integrated Circuit", o));
+
+ ItemList.Circuit_Wafer_CPU.set(addItem(44, "Central Processing Unit (Wafer)", "Raw Circuit", o));
+ ItemList.Circuit_Chip_CPU.set(addItem(45, "Central Processing Unit", "Integrated Circuit", o));
+
+ ItemList.Circuit_Wafer_SoC.set(addItem(46, "SoC Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Chip_SoC.set(addItem(47, "SoC", "System on a Chip", o));
+
+ ItemList.Circuit_Wafer_SoC2.set(addItem(48, "ASoC Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Chip_SoC2.set(addItem(49, "ASoC", "Advanced System on a Chip", o));
+
+ ItemList.Circuit_Wafer_PIC.set(addItem(50, "PIC Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Chip_PIC.set(addItem(51, "Power IC", "Power Circuit", o));
+
+ ItemList.Circuit_Wafer_HPIC.set(addItem(52, "HPIC Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Chip_HPIC.set(addItem(53, "High Power IC", "High Power Circuit", o));
+
+ ItemList.Circuit_Wafer_NanoCPU.set(addItem(54, "NanoCPU Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Chip_NanoCPU.set(addItem(55, "Nanocomponent Central Processing Unit", "Power Circuit", o));
+
+ ItemList.Circuit_Wafer_QuantumCPU.set(addItem(56, "QBit Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Chip_QuantumCPU.set(addItem(57, "QBit Processing Unit", "Quantum CPU", o));
+
+ ItemList.Circuit_Wafer_UHPIC.set(addItem(58, "UHPIC Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Chip_UHPIC.set(addItem(59, "Ultra High Power IC", "Ultra High Power Circuit", o));
+
+ ItemList.Circuit_Wafer_Simple_SoC.set(addItem(60, "Simple SoC Wafer", "Raw Primitive Circuit", o));
+ ItemList.Circuit_Chip_Simple_SoC.set(addItem(61, "Simple SoC", "Simple System on a Chip", o));
+
+ ItemList.Circuit_Wafer_ULPIC.set(addItem(62, "ULPIC Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Chip_ULPIC.set(addItem(63, "Ultra Low Power IC", "Ultra Low Power Circuit", o));
+
+ ItemList.Circuit_Wafer_LPIC.set(addItem(64, "LPIC Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Chip_LPIC.set(addItem(65, "Low Power IC", "Low Power Circuit", o));
+
+ ItemList.Circuit_Wafer_NPIC.set(addItem(160, "NPIC Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Chip_NPIC.set(addItem(161, "Nano Power IC", "Nano Power Circuit", o));
+
+ ItemList.Circuit_Wafer_PPIC.set(addItem(162, "PPIC Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Chip_PPIC.set(addItem(163, "Piko Power IC", "Piko Power Circuit", o));
+
+ ItemList.Circuit_Wafer_QPIC.set(addItem(164, "QPIC Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Chip_QPIC.set(addItem(165, "Quantum Power IC", "Quantum Power Circuit", o));
+
+ ItemList.Circuit_Wafer_Bioware.set(addItem(188, "Living Bio Wafer", "Raw Circuit", o));
+ ItemList.Circuit_Parts_Chip_Bioware.set(addItem(189, "Living Bio Chip", "Needed for Circuits", o));
+ /*
+ * Engraved Crystal Chip Engraved Lapotron Chip Crystal CPU SoCrystal stem cells (disassemble eggs)
+ */
+ ItemList.Circuit_Chip_CrystalSoC2
+ .set(addItem(68, "Raw Advanced Crystal Chip", "Raw Advanced Crystal Processor", o));
+ ItemList.Circuit_Parts_RawCrystalChip.set(addItem(69, "Raw Crystal Chip", "Raw Crystal Processor", o));
+ ItemList.Circuit_Chip_CrystalCPU.set(addItem(70, "Crystal Processing Unit", "Crystal CPU", o)); // Crystal
+ // chip
+ // elite
+ // part
+ ItemList.Circuit_Chip_CrystalSoC.set(addItem(71, "Crystal SoC", "Crystal System on a Chip", o));
+ ItemList.Circuit_Chip_NeuroCPU.set(addItem(72, "Neuro Processing Unit", "Neuro CPU", o));
+ ItemList.Circuit_Chip_Stemcell.set(addItem(73, "Stemcells", "Raw inteligence", o));
+ ItemList.Circuit_Parts_RawCrystalParts
+ .set(addItem(74, "Raw Crystal Chip Parts", "Raw Crystal Processor Parts", o));
+ ItemList.Circuit_Chip_Biocell.set(addItem(76, "Biocells", "Mutated Raw inteligence", o));
+ ItemList.Circuit_Chip_BioCPU.set(addItem(77, "Bio Processing Unit", "Bio CPU", o));
+ ItemList.Circuit_Chip_Optical.set(addItem(724, "Raw Exposed Optical Chip", "Raw Optical Chip", o));
+
+ // Nand Chip
+ ItemList.NandChip.set(
+ addItem(
+ 75,
+ "NAND Chip",
+ "A very simple Circuit",
+ OrePrefixes.circuit.get(Materials.Primitive),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.NandChip.get(1), ULV);
+ // Vacuum Tube Item01
+ // Basic Circuit IC2
+ // Good Circuit Item01
+
+ // Integrated Logic Circuit Item01
+ ItemList.Circuit_Integrated_Good.set(
+ addItem(
+ 79,
+ "Good Integrated Circuit",
+ "Good Circuit",
+ OrePrefixes.circuit.get(Materials.Good),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Integrated_Good.get(1), MV);
+ // Good Integrated Circuit Item01
+ // Advanced Circuit IC2
+
+ ItemList.Circuit_Microprocessor.set(
+ addItem(
+ 78,
+ "Microprocessor",
+ "A Basic Circuit",
+ OrePrefixes.circuit.get(Materials.Basic),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Microprocessor.get(1), LV);
+ ItemList.Circuit_Processor.set(
+ addItem(
+ 80,
+ "Integrated Processor",
+ "A Good Circuit",
+ OrePrefixes.circuit.get(Materials.Good),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Processor.get(1), MV);
+ // ItemList.Circuit_Computer.set(addItem(tLastID = 81, "Processor Assembly", "Advanced Circuit", new
+ // Object[]{OrePrefixes.circuit.get(Materials.Advanced), SubTag.NO_UNIFICATION}));
+ // Workstation/ Item01 Datacircuit
+ // Mainframe Item01 DataProcessor
+
+ ItemList.Circuit_Nanoprocessor.set(
+ addItem(
+ 82,
+ "Nanoprocessor",
+ "An Advanced Circuit",
+ OrePrefixes.circuit.get(Materials.Advanced),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Nanoprocessor.get(1), HV);
+ ItemList.Circuit_Nanocomputer.set(
+ addItem(
+ 83,
+ "Nanoprocessor Assembly",
+ "An Extreme Circuit",
+ OrePrefixes.circuit.get(Materials.Data),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Nanocomputer.get(1), EV);
+ ItemList.Circuit_Elitenanocomputer.set(
+ addItem(
+ 84,
+ "Elite Nanocomputer",
+ "An Elite Circuit",
+ OrePrefixes.circuit.get(Materials.Elite),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Elitenanocomputer.get(1), IV);
+ // Nanoprocessor Mainframe Item01 Energy Flow Circuit
+
+ // Quantum circuits
+ ItemList.Circuit_Quantumprocessor.set(
+ addItem(
+ 85,
+ "Quantumprocessor",
+ "An Extreme Circuit",
+ OrePrefixes.circuit.get(Materials.Data),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Quantumprocessor.get(1), EV);
+ ItemList.Circuit_Quantumcomputer.set(
+ addItem(
+ 86,
+ "Quantumprocessor Assembly",
+ "An Elite Circuit",
+ OrePrefixes.circuit.get(Materials.Elite),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Quantumcomputer.get(1), IV);
+ ItemList.Circuit_Masterquantumcomputer.set(
+ addItem(
+ 87,
+ "Master Quantumcomputer",
+ "A Master Circuit",
+ OrePrefixes.circuit.get(Materials.Master),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Masterquantumcomputer.get(1), LuV);
+ ItemList.Circuit_Quantummainframe.set(
+ addItem(
+ 88,
+ "Quantumprocessor Mainframe",
+ "An Ultimate Circuit",
+ OrePrefixes.circuit.get(Materials.Ultimate),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Quantummainframe.get(1), ZPM);
+
+ // Crystal circuits
+ ItemList.Circuit_Crystalprocessor.set(
+ addItem(
+ 89,
+ "Crystalprocessor",
+ "An Elite Circuit",
+ OrePrefixes.circuit.get(Materials.Elite),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Crystalprocessor.get(1), IV);
+ ItemList.Circuit_Crystalcomputer.set(
+ addItem(
+ 96,
+ "Crystalprocessor Assembly",
+ "A Master Circuit",
+ OrePrefixes.circuit.get(Materials.Master),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Crystalcomputer.get(1), LuV);
+ ItemList.Circuit_Ultimatecrystalcomputer.set(
+ addItem(
+ 90,
+ "Ultimate Crystalcomputer",
+ "An Ultimate Circuit",
+ OrePrefixes.circuit.get(Materials.Ultimate),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Ultimatecrystalcomputer.get(1), ZPM);
+ ItemList.Circuit_Crystalmainframe.set(
+ addItem(
+ 91,
+ "Crystalprocessor Mainframe",
+ "A Super Circuit",
+ OrePrefixes.circuit.get(Materials.SuperconductorUHV),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Crystalmainframe.get(1), UV);
+
+ // ???? Scared to remove.
+ ItemList.Circuit_Ultimate.set(ItemList.Circuit_Ultimatecrystalcomputer.get(1L)); // maybe should be removed
+
+ // Wetware circuits
+ ItemList.Circuit_Neuroprocessor.set(
+ addItem(
+ 92,
+ "Wetwareprocessor",
+ "A Master Circuit",
+ OrePrefixes.circuit.get(Materials.Master),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Neuroprocessor.get(1), LuV);
+ ItemList.Circuit_Wetwarecomputer.set(
+ addItem(
+ 93,
+ "Wetwareprocessor Assembly",
+ "An Ultimate Circuit",
+ OrePrefixes.circuit.get(Materials.Ultimate),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Wetwarecomputer.get(1), ZPM);
+ ItemList.Circuit_Wetwaresupercomputer.set(
+ addItem(
+ 94,
+ "Wetware Supercomputer",
+ "A Super Circuit",
+ OrePrefixes.circuit.get(Materials.SuperconductorUHV),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Wetwaresupercomputer.get(1), UV);
+ ItemList.Circuit_Wetwaremainframe.set(
+ addItem(
+ 95,
+ "Wetware Mainframe",
+ "An Infinite Circuit",
+ OrePrefixes.circuit.get(Materials.Infinite),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Wetwaremainframe.get(1), UHV);
+
+ // Bioware circuits.
+ ItemList.Circuit_Bioprocessor.set(
+ addItem(
+ 97,
+ "Bioprocessor",
+ "An Ultimate Circuit",
+ OrePrefixes.circuit.get(Materials.Ultimate),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Bioprocessor.get(1), ZPM);
+ ItemList.Circuit_Biowarecomputer.set(
+ addItem(
+ 98,
+ "Biowareprocessor Assembly",
+ "A Super Circuit",
+ OrePrefixes.circuit.get(Materials.SuperconductorUHV),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Biowarecomputer.get(1), UV);
+ ItemList.Circuit_Biowaresupercomputer.set(
+ addItem(
+ 99,
+ "Bioware Supercomputer",
+ "An Infinite Circuit",
+ OrePrefixes.circuit.get(Materials.Infinite),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Biowaresupercomputer.get(1), UHV);
+ ItemList.Circuit_Biomainframe.set(
+ addItem(
+ 120,
+ "Bio Mainframe",
+ "A Bio Circuit",
+ OrePrefixes.circuit.get(Materials.Bio),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_Biomainframe.get(1), UEV);
+
+ ItemList.Circuit_Board_Coated_Basic.set(addItem(100, "Circuit Board", "A basic Circuit Board", o));
+ ItemList.Circuit_Board_Phenolic_Good.set(addItem(101, "Good Circuit Board", "A good Circuit Board", o));
+ ItemList.Circuit_Board_Epoxy_Advanced
+ .set(addItem(102, "Advanced Circuit Board", "A advanced Circuit Board", o));
+ ItemList.Circuit_Board_Fiberglass_Advanced
+ .set(addItem(103, "More Advanced Circuit Board", "A more advanced Circuit Board", o));
+ ItemList.Circuit_Board_Multifiberglass_Elite
+ .set(addItem(104, "Elite Circuit Board", "A elite Circuit Board", o));
+ ItemList.Circuit_Board_Wetware_Extreme
+ .set(addItem(105, "Extreme Wetware Lifesupport Circuit Board", "The Board that keeps life", o));
+ ItemList.Circuit_Board_Plastic_Advanced.set(addItem(106, "Plastic Circuit Board", "A good Board", o));
+ ItemList.Circuit_Board_Bio_Ultra
+ .set(addItem(107, "Ultra Bio Mutated Circuit Board", "Bio genetic mutated Board", o));
+ ItemList.Circuit_Board_Optical.set(addItem(728, "Optical Circuit Board", "Optically Infused Board", o));
+
+ // Optical circuits
+ ItemList.Circuit_OpticalProcessor.set(
+ addItem(
+ 154,
+ "Optical Processor",
+ "An Optical Circuit",
+ OrePrefixes.circuit.get(Materials.SuperconductorUHV),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_OpticalProcessor.get(1), UV);
+ ItemList.Circuit_OpticalAssembly.set(
+ addItem(
+ 155,
+ "Optical Assembly",
+ "An Optical Circuit",
+ OrePrefixes.circuit.get(Materials.Infinite),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_OpticalAssembly.get(1), UHV);
+ ItemList.Circuit_OpticalComputer.set(
+ addItem(
+ 156,
+ "Optical Computer",
+ "An Optical Circuit",
+ OrePrefixes.circuit.get(Materials.Bio),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_OpticalComputer.get(1), UEV);
+ ItemList.Circuit_OpticalMainframe.set(
+ addItem(
+ 157,
+ "Optical Mainframe",
+ "An Optical Circuit",
+ OrePrefixes.circuit.get(Materials.Optical),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_OpticalMainframe.get(1), UIV);
+
+ // Exotic circuits
+ ItemList.Circuit_ExoticProcessor.set(
+ addItem(
+ 166,
+ "Exotic Processor",
+ "An Exotic Circuit",
+ OrePrefixes.circuit.get(Materials.Infinite),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_ExoticProcessor.get(1), UHV);
+ ItemList.Circuit_ExoticAssembly.set(
+ addItem(
+ 167,
+ "Exotic Assembly",
+ "An Exotic Circuit",
+ OrePrefixes.circuit.get(Materials.Bio),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_ExoticAssembly.get(1), UEV);
+ ItemList.Circuit_ExoticComputer.set(
+ addItem(
+ 168,
+ "Exotic Computer",
+ "An Exotic Circuit",
+ OrePrefixes.circuit.get(Materials.Optical),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_ExoticComputer.get(1), UIV);
+ ItemList.Circuit_ExoticMainframe.set(
+ addItem(
+ 169,
+ "Exotic Mainframe",
+ "An Exotic Circuit",
+ OrePrefixes.circuit.get(Materials.Exotic),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_ExoticMainframe.get(1), UMV);
+
+ // Cosmic circuits
+ ItemList.Circuit_CosmicProcessor.set(
+ addItem(
+ 170,
+ "Cosmic Processor",
+ "A Cosmic Circuit",
+ OrePrefixes.circuit.get(Materials.Bio),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_CosmicProcessor.get(1), UEV);
+ ItemList.Circuit_CosmicAssembly.set(
+ addItem(
+ 171,
+ "Cosmic Assembly",
+ "A Cosmic Circuit",
+ OrePrefixes.circuit.get(Materials.Optical),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_CosmicAssembly.get(1), UIV);
+ ItemList.Circuit_CosmicComputer.set(
+ addItem(
+ 172,
+ "Cosmic Computer",
+ "A Cosmic Circuit",
+ OrePrefixes.circuit.get(Materials.Exotic),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_CosmicComputer.get(1), UMV);
+ ItemList.Circuit_CosmicMainframe.set(
+ addItem(
+ 173,
+ "Cosmic Mainframe",
+ "A Cosmic Circuit",
+ OrePrefixes.circuit.get(Materials.Cosmic),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_CosmicMainframe.get(1), UXV);
+
+ // Transcendent circuits
+ ItemList.Circuit_TranscendentProcessor.set(
+ addItem(
+ 174,
+ "Temporally Transcendent Processor",
+ "A circuit operating outside of known spacetime",
+ OrePrefixes.circuit.get(Materials.Optical),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_TranscendentProcessor.get(1), UIV);
+ ItemList.Circuit_TranscendentAssembly.set(
+ addItem(
+ 175,
+ "Temporally Transcendent Assembly",
+ "A circuit operating outside of known spacetime",
+ OrePrefixes.circuit.get(Materials.Exotic),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_TranscendentAssembly.get(1), UMV);
+ ItemList.Circuit_TranscendentComputer.set(
+ addItem(
+ 176,
+ "Temporally Transcendent Computer",
+ "A circuit operating outside of known spacetime",
+ OrePrefixes.circuit.get(Materials.Cosmic),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_TranscendentComputer.get(1), UXV);
+ ItemList.Circuit_TranscendentMainframe.set(
+ addItem(
+ 177,
+ "Temporally Transcendent Mainframe",
+ "A circuit operating outside of known spacetime",
+ OrePrefixes.circuit.get(Materials.Transcendent),
+ SubTag.NO_UNIFICATION));
+ registerTieredTooltip(ItemList.Circuit_TranscendentMainframe.get(1), MAX);
+
+ ItemList.Tube_Wires.set(addItem(110, "Tube Wires", "For the Vacuum Tubes", o));
+
+ ItemList.Cover_SolarPanel_UHV.set(
+ addItem(
+ 130,
+ "Solar Panel (UHV)",
+ "Ultimate High Voltage Solar Panel (Needs cleaning with right click)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 128L)));
+ ItemList.Cover_SolarPanel_UEV.set(
+ addItem(
+ 131,
+ "Solar Panel (UEV)",
+ "Ultimate Extreme Voltage Solar Panel (Needs cleaning with right click)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 256L)));
+ ItemList.Cover_SolarPanel_UIV.set(
+ addItem(
+ 132,
+ "Solar Panel (UIV)",
+ "Ultimate Insane Voltage Solar Panel (Needs cleaning with right click)",
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 512L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 512L)));
+
+ GregTech_API.registerCover(
+ ItemList.Cover_SolarPanel_UHV.get(1L),
+ TextureFactory.of(SOLARPANEL_UHV),
+ new GT_Cover_SolarPanel(2097152));
+ GregTech_API.registerCover(
+ ItemList.Cover_SolarPanel_UEV.get(1L),
+ TextureFactory.of(SOLARPANEL_UEV),
+ new GT_Cover_SolarPanel(8388608));
+ GregTech_API.registerCover(
+ ItemList.Cover_SolarPanel_UIV.get(1L),
+ TextureFactory.of(SOLARPANEL_UIV),
+ new GT_Cover_SolarPanel(33554432));
+
+ ItemList.ULV_Coil.set(addItem(140, "Ultra Low Voltage Coil", "Primitive Coil", o));
+ ItemList.LV_Coil.set(addItem(141, "Low Voltage Coil", "Basic Coil", o));
+ ItemList.MV_Coil.set(addItem(142, "Medium Voltage Coil", "Good Coil", o));
+ ItemList.HV_Coil.set(addItem(143, "High Voltage Coil", "Advanced Coil", o));
+ ItemList.EV_Coil.set(addItem(144, "Extreme Voltage Coil", "Extreme Coil", o));
+ ItemList.IV_Coil.set(addItem(145, "Insane Voltage Coil", "Elite Coil", o));
+ ItemList.LuV_Coil.set(addItem(146, "Ludicrous Voltage Coil", "Master Coil", o));
+ ItemList.ZPM_Coil.set(addItem(147, "ZPM Voltage Coil", "Ultimate Coil", o));
+ ItemList.UV_Coil.set(addItem(148, "Ultimate Voltage Coil", "Super Coil", o));
+ ItemList.UHV_Coil.set(addItem(149, "Highly Ultimate Voltage Coil", "Infinite Coil", o));
+
+ ItemList.GalliumArsenideCrystal.set(addItem(190, "Gallium Arsenide Crystal", "For making boules", o));
+ ItemList.GalliumArsenideCrystalSmallPart
+ .set(addItem(191, "Small Gallium Arsenide Crystal", "For making boules", o));
+ ItemList.KevlarFiber.set(addItem(192, "Kevlar Fiber", "For making Kevlar Plates", o));
+ ItemList.WovenKevlar.set(addItem(193, "Woven Kevlar", "For making Kevlar Plates", o));
+ ItemList.Spinneret.set(addItem(194, "Spinneret", "For making Kevlar Fiber", o));
+
+ ItemList.IndustrialApiary_Upgrade_Frame.set(addItem(199, "Upgrade Frame", "Crafting component", o));
+
+ ItemList.IndustrialApiary_Upgrade_Acceleration_1.set(
+ addItem(
+ 200,
+ "Acceleration Upgrade x2",
+ "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 2x acceleration level/n * Energy Consumption +1 AMP LV",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_Acceleration_2.set(
+ addItem(
+ 201,
+ "Acceleration Upgrade x4",
+ "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 4x acceleration level/n * Energy Consumption +1 AMP MV",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_Acceleration_3.set(
+ addItem(
+ 202,
+ "Acceleration Upgrade x8",
+ "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 8x acceleration level/n * Energy Consumption +1 AMP HV",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_Acceleration_4.set(
+ addItem(
+ 203,
+ "Acceleration Upgrade x16",
+ "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 16x acceleration level/n * Energy Consumption +1 AMP EV",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_Acceleration_5.set(
+ addItem(
+ 204,
+ "Acceleration Upgrade x32",
+ "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 32x acceleration level/n * Energy Consumption +1 AMP IV",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_Acceleration_6.set(
+ addItem(
+ 205,
+ "Acceleration Upgrade x64",
+ "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 64x acceleration level/n * Energy Consumption +1 AMP LuV",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_Acceleration_7.set(
+ addItem(
+ 206,
+ "Acceleration Upgrade x128",
+ "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 128x acceleration level/n * Energy Consumption +1 AMP ZPM",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_Acceleration_8.set(
+ addItem(
+ 207,
+ "Acceleration Upgrade x256",
+ "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 256x acceleration level/n * Energy Consumption +1 AMP UV",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_Acceleration_8_Upgraded.set(
+ addItem(
+ 208,
+ "Upgraded Acceleration Upgrade x256",
+ "Acceleration upgrade for Industrial Apiary/n Maximum Installed: 1/n * Unlocks 256x acceleration level/n * Will also grant 8x production upgrade/n * Energy Consumption +1 AMP UV",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_PRODUCTION.set(
+ addItem(
+ 209,
+ "Production Upgrade",
+ "Production upgrade for Industrial Apiary/n Maximum Installed: 8/n Increases production modifier by 0.25/n Energy Consumption +40%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_PLAINS.set(
+ addItem(
+ 210,
+ "Plains Emulation Upgrade",
+ "Plains emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Plains/n * Energy Consumption +40%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_LIGHT.set(
+ addItem(
+ 211,
+ "Light Upgrade",
+ "Light upgrade for Industrial Apiary/n Maximum Installed: 1/n * Internal Lighting/n * Energy Consumption +5%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_FLOWERING.set(
+ addItem(
+ 212,
+ "Flowering Upgrade",
+ "Flowering upgrade for Industrial Apiary/n Maximum Installed: 8/n * Flowering and Pollination +20%/n * Energy Consumption +10%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_WINTER.set(
+ addItem(
+ 213,
+ "Winter Emulation Upgrade",
+ "Winter emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Taiga/n * Energy Consumption +50%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_DRYER.set(
+ addItem(
+ 214,
+ "Dryer Upgrade",
+ "Dryer upgrade for Industrial Apiary/n Maximum Installed: 16/n * Humidity -12.5%/n * Energy Consumption +2.5%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_AUTOMATION.set(
+ addItem(
+ 215,
+ "Automation Upgrade",
+ "Automation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Automation/n * Energy Consumption +10%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_HUMIDIFIER.set(
+ addItem(
+ 216,
+ "Humidifier Upgrade",
+ "Humidifier upgrade for Industrial Apiary/n Maximum Installed: 16/n * Humidity +12.5%/n * Energy Consumption +2.5%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_HELL.set(
+ addItem(
+ 217,
+ "HELL Emulation Upgrade",
+ "HELL emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: HELL/n * Energy Consumption +50%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_POLLEN.set(
+ addItem(
+ 218,
+ "Pollen Scrubber Upgrade",
+ "Pollen scrubber upgrade for Industrial Apiary/n Maximum Installed: 1/n * Flowering and Pollination -100%/n * Energy Consumption +30%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_DESERT.set(
+ addItem(
+ 219,
+ "Desert Emulation Upgrade",
+ "Desert emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Desert/n * Energy Consumption +20%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_COOLER.set(
+ addItem(
+ 220,
+ "Cooler Upgrade",
+ "Cooler upgrade for Industrial Apiary/n Maximum Installed: 16/n * Temperature -12.5%/n * Energy Consumption +2.5%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_LIFESPAN.set(
+ addItem(
+ 221,
+ "Lifespan Upgrade",
+ "Lifespan upgrade for Industrial Apiary/n Maximum Installed: 4/n * Lifespan -33%/n * Energy Consumption +5%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_SEAL.set(
+ addItem(
+ 222,
+ "Seal Upgrade",
+ "Seal upgrade for Industrial Apiary/n Maximum Installed: 1/n * Rain Protection/n * Energy Consumption +5%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_STABILIZER.set(
+ addItem(
+ 223,
+ "Genetic Stabilizer Upgrade",
+ "Genetic stabilizer upgrade for Industrial Apiary/n Maximum Installed: 1/n * Genetic Decay -100%/n * Energy Consumption +150%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_JUNGLE.set(
+ addItem(
+ 224,
+ "Jungle Emulation Upgrade",
+ "Jungle emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Jungle/n * Energy Consumption +20%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_TERRITORY.set(
+ addItem(
+ 225,
+ "Territory Upgrade",
+ "Territory upgrade for Industrial Apiary/n Maximum Installed: 4/n * Territory +50%/n * Energy Consumption +5%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_OCEAN.set(
+ addItem(
+ 226,
+ "Ocean Emulation Upgrade",
+ "Ocean emulation upgrade for Industrial Apiary/n Maximum Installed: 1/n * Biome Override: Ocean/n * Energy Consumption +20%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_SKY.set(
+ addItem(
+ 227,
+ "Open Sky Upgrade",
+ "Open sky upgrade for Industrial Apiary/n Maximum Installed: 1/n * Open Sky Simulation/n * Energy Consumption +5%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_HEATER.set(
+ addItem(
+ 228,
+ "Heater Upgrade",
+ "Heater upgrade for Industrial Apiary/n Maximum Installed: 16/n * Temperature +12.5%/n * Energy Consumption +2.5%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_SIEVE.set(
+ addItem(
+ 229,
+ "Sieve Upgrade",
+ "Sieve upgrade for Industrial Apiary/n Maximum Installed: 1/n * Pollen Collection/n * Energy Consumption +25%",
+ OrePrefixes.apiaryUpgrade.name()));
+ ItemList.IndustrialApiary_Upgrade_UNLIGHT.set(
+ addItem(
+ 231,
+ "Night Upgrade",
+ "Night upgrade for Industrial Apiary/n Maximum Installed: 1/n * Internal Darkness/n * Energy Consumption +5%",
+ OrePrefixes.apiaryUpgrade.name()));
+
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_1.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_2.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_3.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_4.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_5.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_6.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_7.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_8.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_Acceleration_8_Upgraded.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_PRODUCTION.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_PLAINS.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_LIGHT.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_FLOWERING.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_WINTER.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_DRYER.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_AUTOMATION.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_HUMIDIFIER.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_HELL.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_POLLEN.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_DESERT.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_COOLER.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_LIFESPAN.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_SEAL.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_STABILIZER.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_JUNGLE.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_TERRITORY.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_OCEAN.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_SKY.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_HEATER.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_SIEVE.get(1L));
+ OrePrefixes.apiaryUpgrade.add(ItemList.IndustrialApiary_Upgrade_UNLIGHT.get(1L));
+
+ ItemList.NuclearStar.set(
+ addItem(
+ 230,
+ "Nuclear Star",
+ "By the powers of Greg, I command this star to be really hot.",
+ SubTag.NO_UNIFICATION));
+
+ ItemList.Cover_Metrics_Transmitter.set(
+ addItem(
+ 232,
+ "Metrics Transmitter Cover",
+ String.join(
+ "/n ",
+ "Taking Information Panels to the next level!",
+ "Creates a GregTech Advanced Sensor Card when attached",
+ "Works across dimensions or if machine is dismantled",
+ "Removing this cover will destroy the linked card",
+ GT_Values.AuthorQuerns)));
+ GregTech_API.registerCover(
+ ItemList.Cover_Metrics_Transmitter.get(1L),
+ TextureFactory.of(MACHINE_CASINGS[2][0], TextureFactory.of(OVERLAY_METRICS_TRANSMITTER)),
+ new GT_Cover_Metrics_Transmitter(TextureFactory.of(OVERLAY_METRICS_TRANSMITTER)));
+
+ ItemList.Optical_Cpu_Containment_Housing.set(addItem(727, "Optical CPU Containment Housing", "CPU Housing", o));
+ ItemList.Optically_Perfected_CPU.set(addItem(726, "Optically Perfected CPU", "Perfected CPU!", o));
+ ItemList.Optically_Compatible_Memory.set(addItem(725, "Optically Compatible Memory", "Its in the name!", o));
+
+ ItemList.Timepiece.set(addItem(757, "Timepiece", "Beware of the kid with the hat", o));
+
+ int whiteDwarfIDs = 729;
+ ItemList.White_Dwarf_Shape_Extruder_Plate.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Plate)",
+ "Ultra Strong Stellar Shape for making Plates"));
+ ItemList.White_Dwarf_Shape_Extruder_Rod.set(
+ addItem(whiteDwarfIDs++, "White Dwarf Extruder Shape (Rod)", "Ultra Strong Stellar Shape for making Rods"));
+ ItemList.White_Dwarf_Shape_Extruder_Bolt.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Bolt)",
+ "Ultra Strong Stellar Shape for making Bolts"));
+ ItemList.White_Dwarf_Shape_Extruder_Ring.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Ring)",
+ "Ultra Strong Stellar Shape for making Rings"));
+ ItemList.White_Dwarf_Shape_Extruder_Cell.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Cell)",
+ "Ultra Strong Stellar Shape for making Cells"));
+ ItemList.White_Dwarf_Shape_Extruder_Ingot.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Ingot)",
+ "Ultra Strong Stellar Shape for, wait, can't we just use a Furnace?"));
+ ItemList.White_Dwarf_Shape_Extruder_Wire.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Wire)",
+ "Ultra Strong Stellar Shape for making Wires"));
+ ItemList.White_Dwarf_Shape_Extruder_Casing.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Casing)",
+ "Ultra Strong Stellar Shape for making Item Casings"));
+ ItemList.White_Dwarf_Shape_Extruder_Pipe_Tiny.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Tiny Pipe)",
+ "Ultra Strong Stellar Shape for making tiny Pipes"));
+ ItemList.White_Dwarf_Shape_Extruder_Pipe_Small.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Small Pipe)",
+ "Ultra Strong Stellar Shape for making small Pipes"));
+ ItemList.White_Dwarf_Shape_Extruder_Pipe_Medium.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Normal Pipe)",
+ "Ultra Strong Stellar Shape for making Pipes"));
+ ItemList.White_Dwarf_Shape_Extruder_Pipe_Large.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Large Pipe)",
+ "Ultra Strong Stellar Shape for making large Pipes"));
+ ItemList.White_Dwarf_Shape_Extruder_Pipe_Huge.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Huge Pipe)",
+ "Ultra Strong Stellar Shape for making full Block Pipes"));
+ ItemList.White_Dwarf_Shape_Extruder_Block.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Block)",
+ "Ultra Strong Stellar Shape for making Blocks"));
+ ItemList.White_Dwarf_Shape_Extruder_Sword.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Sword Blade)",
+ "Ultra Strong Stellar Shape for making Swords"));
+ ItemList.White_Dwarf_Shape_Extruder_Pickaxe.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Pickaxe Head)",
+ "Ultra Strong Stellar Shape for making Pickaxes"));
+ ItemList.White_Dwarf_Shape_Extruder_Shovel.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Shovel Head)",
+ "Ultra Strong Stellar Shape for making Shovels"));
+ ItemList.White_Dwarf_Shape_Extruder_Axe.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Axe Head)",
+ "Ultra Strong Stellar Shape for making Axes"));
+ ItemList.White_Dwarf_Shape_Extruder_Hoe.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Hoe Head)",
+ "Ultra Strong Stellar Shape for making Hoes"));
+ ItemList.White_Dwarf_Shape_Extruder_Hammer.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Hammer Head)",
+ "Ultra Strong Stellar Shape for making Hammers"));
+ ItemList.White_Dwarf_Shape_Extruder_File.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (File Head)",
+ "Ultra Strong Stellar Shape for making Files"));
+ ItemList.White_Dwarf_Shape_Extruder_Saw.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Saw Blade)",
+ "Ultra Strong Stellar Shape for making Saws"));
+ ItemList.White_Dwarf_Shape_Extruder_Gear.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Gear)",
+ "Ultra Strong Stellar Shape for making Gears"));
+ ItemList.White_Dwarf_Shape_Extruder_Bottle.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Bottle)",
+ "Ultra Strong Stellar Shape for making Bottles"));
+ ItemList.White_Dwarf_Shape_Extruder_Rotor.set(
+ addItem(whiteDwarfIDs++, "White Dwarf Extruder Shape (Rotor)", "Ultra Strong Stellar Shape for a Rotor"));
+ ItemList.White_Dwarf_Shape_Extruder_Small_Gear.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Small Gear)",
+ "Ultra Strong Stellar Shape for a Small Gear"));
+ ItemList.White_Dwarf_Shape_Extruder_Turbine_Blade.set(
+ addItem(
+ whiteDwarfIDs++,
+ "White Dwarf Extruder Shape (Turbine Blade)",
+ "Ultra Strong Stellar Extruder Shape for a Turbine Blade"));
+ ItemList.White_Dwarf_Shape_Extruder_ToolHeadDrill.set(
+ addItem(
+ whiteDwarfIDs,
+ "White Dwarf Extruder Shape (Drill Head)",
+ "White Dwarf Extruder Shape for a Drill Head"));
+ }
+
+ @Override
+ public boolean doesShowInCreative(OrePrefixes aPrefix, Materials aMaterial, boolean aDoShowAllItems) {
+ return aDoShowAllItems || (aPrefix.toString()
+ .toLowerCase()
+ .contains("nanite"))
+ || (aPrefix.toString()
+ .toLowerCase()
+ .contains("rawore"));
+ }
+}
diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_98.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_98.java
new file mode 100644
index 0000000000..0dab2af2cf
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_98.java
@@ -0,0 +1,352 @@
+package gregtech.common.items;
+
+import java.util.Arrays;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Item;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Util;
+import gregtech.api.util.GT_Utility;
+
+/** This class holds cells for non-GT fluids. */
+public class GT_MetaGenerated_Item_98 extends GT_MetaGenerated_Item {
+
+ public static GT_MetaGenerated_Item_98 INSTANCE;
+
+ /**
+ * Registered fluids.
+ *
+ * <p>
+ * When adding a fluid, don't forget to make sure that GregTech loads after the mod that adds that fluid!
+ *
+ * <p>
+ * In order to avoid breaking existing worlds, fluids must not have their IDs changed! The only safe modification
+ * that can be made to this enum is adding new fluids, or removing existing fluids. When removing fluids, maybe
+ * leave a comment mentioning the old ID, so that we don't re-use it for a new fluid.
+ */
+ public enum FluidCell {
+ // Next unused ID: 32
+
+ // GregTech
+ DRILLING_FLUID(5, "liquid_drillingfluid", CellType.REGULAR),
+ SQUID_INK(6, "squidink", CellType.SMALL),
+ BLUE_VITRIOL(22, "solution.bluevitriol", CellType.REGULAR),
+ NICKEL_SULFATE(23, "solution.nickelsulfate", CellType.REGULAR),
+ GREEN_VITRIOL(24, "solution.greenvitriol", CellType.REGULAR),
+ INDIUM_CONCENTRATE(25, "indiumconcentrate", CellType.REGULAR),
+ LEAD_ZINC_SOLUTION(26, "leadzincsolution", CellType.REGULAR),
+
+ // New Horizons Core Mod
+ UNKNOWN_NUTRIENT_AGAR(7, "unknownnutrientagar", CellType.REGULAR),
+ SEAWEED_BROTH(8, "seaweedbroth", CellType.REGULAR),
+ SUPER_HEAVY_RADOX(28, "superheavyradox", CellType.REGULAR),
+ HEAVY_RADOX(29, "heavyradox", CellType.REGULAR),
+ CRACKED_RADOX(30, "crackedradox", CellType.REGULAR),
+ LIGHT_RADOX(31, "lightradox", CellType.REGULAR),
+ SUPER_LIGHT_RADOX(9, "superlightradox", CellType.REGULAR),
+ SODIUM_POTASSIUM(18, "sodiumpotassium", CellType.REGULAR),
+ ENRICHED_BACTERIAL_SLUDGE(19, "enrichedbacterialsludge", CellType.REGULAR),
+ FERMENTED_BACTERIAL_SLUDGE(20, "fermentedbacterialsludge", CellType.REGULAR),
+ POLLUTION(21, "pollution", CellType.REGULAR),
+ XENOXENE(27, "xenoxene", CellType.REGULAR),
+
+ // BartWorks
+ ENZYME_SOLUTION(10, "enzymessollution", CellType.REGULAR),
+ ESCHERICHIA_COLI_FLUID(11, "escherichiakolifluid", CellType.REGULAR),
+ PENICILLIN(12, "penicillin", CellType.REGULAR),
+ FLUORESCENT_DNA(13, "fluorecentddna", CellType.REGULAR),
+ POLYMERASE(17, "polymerase", CellType.REGULAR),
+
+ // Good Generator
+ COMBUSTION_PROMOTER(14, "combustionpromotor", CellType.REGULAR),
+
+ // Galacticraft
+ BACTERIAL_SLUDGE(1, "bacterialsludge", CellType.REGULAR),
+
+ // Railcraft
+ STEAM(0, "steam", CellType.REGULAR),
+
+ // Gendustry
+ BACTERIA(15, "binnie.bacteria", CellType.REGULAR),
+ MUTAGEN(2, "mutagen", CellType.REGULAR),
+ LIQUID_DNA(16, "liquiddna", CellType.REGULAR),
+
+ // Tinker's Construct
+ LIQUID_ENDER(3, "ender", CellType.REGULAR),
+
+ // Hardcore Ender Expansion
+ ENDER_GOO(4, "endergoo", CellType.REGULAR),;
+
+ private final int mId;
+ /** This is the Forge internal fluid name. */
+ private final String mfluidName;
+
+ private final CellType mType;
+
+ @Nullable
+ private ItemStack mStack;
+
+ FluidCell(int aId, String aFluidName, CellType aType) {
+ mId = aId;
+ mfluidName = aFluidName;
+ mType = aType;
+ }
+
+ public int getId() {
+ return mId;
+ }
+
+ public String getFluidName() {
+ return mfluidName;
+ }
+
+ public CellType getDisplayType() {
+ return mType;
+ }
+
+ /**
+ * Get a copy of this stack with stack size 1.
+ * <p>
+ * Always returns non-null stack even if the fluid referenced doesn't exist, so don't assume it's always valid.
+ */
+ public ItemStack get() {
+ trySetStack();
+ return GT_Utility.copy(mStack);
+ }
+
+ /**
+ * Get a copy of this cell WITHOUT copy.
+ * <p>
+ * Always returns non-null stack even if the fluid referenced doesn't exist, so don't assume it's always valid.
+ * <p>
+ * Use with caution.
+ */
+ public ItemStack getNoCopy() {
+ trySetStack();
+ return mStack;
+ }
+
+ /**
+ * Get a copy of this cell with specified stack size.
+ * <p>
+ * Always returns non-null stack even if the fluid referenced doesn't exist, so don't assume it's always valid.
+ */
+ public ItemStack get(int aStackSize) {
+ trySetStack();
+ return GT_Utility.copyAmount(aStackSize, mStack);
+ }
+
+ private void trySetStack() {
+ if (mStack == null) {
+ mStack = new ItemStack(GT_MetaGenerated_Item_98.INSTANCE, 1, mId);
+ }
+ }
+ }
+
+ /** Cell type specifies the cell capacity, appearance, and item name format. */
+ private enum CellType {
+
+ REGULAR(1_000, OrePrefixes.cell),
+ SMALL(144, OrePrefixes.cell),
+ MOLTEN(144, OrePrefixes.cellMolten),
+ PLASMA(1_000, OrePrefixes.cellPlasma);
+
+ private final int capacity;
+ private final OrePrefixes prefix;
+
+ CellType(int capacity, OrePrefixes prefix) {
+ this.capacity = capacity;
+ this.prefix = prefix;
+ }
+ }
+
+ /** Struct class holding data that we need to properly handle a registered fluid cell item. */
+ private static class RegisteredFluidData {
+
+ private final short[] rgba;
+ private final IIconContainer iconContainer;
+
+ private RegisteredFluidData(short[] rgba, IIconContainer iconContainer) {
+ this.rgba = rgba;
+ this.iconContainer = iconContainer;
+ }
+ }
+
+ /**
+ * Map of ID to registered fluid data.
+ *
+ * <p>
+ * Only contains IDs that were successfully registered.
+ */
+ private final Map<Integer, RegisteredFluidData> registeredFluidDataMap;
+
+ private final EnumMap<CellType, IIconContainer> iconContainerMap;
+
+ private GT_MetaGenerated_Item_98() {
+ // For some reason, fluid cells will be rendered only if the metadata ID is less than the
+ // offset. So we will specify maximum offset here.
+ // See: GT_MetaGenerated_Item_Renderer.java
+ super("metaitem.98", (short) 32766, (short) 0);
+
+ registeredFluidDataMap = new HashMap<>();
+ iconContainerMap = new EnumMap<>(CellType.class);
+ }
+
+ /**
+ * Loading needs to happen after the fluids we need have been registered, which means during post-load. However,
+ * cell icons seem to be deleted some time between load and post-load, so we must pre-cache them.
+ */
+ public static synchronized void preInit() {
+ if (INSTANCE == null) INSTANCE = new GT_MetaGenerated_Item_98();
+
+ // We'll just steal the icons from Water. They are all the same anyway (except _NULL is broken for cells).
+ for (CellType cellType : CellType.values()) {
+ IIconContainer iconContainer = Materials.Water.mIconSet.mTextures[cellType.prefix.mTextureIndex];
+ INSTANCE.iconContainerMap.put(cellType, iconContainer);
+ }
+ }
+
+ public static synchronized void init() {
+ INSTANCE.createAllItems();
+ INSTANCE.registerOreDict();
+ }
+
+ private void createAllItems() {
+ for (FluidCell tCell : FluidCell.values()) {
+ tryToInitialize(tCell);
+ }
+
+ // We're not going to use these BitSets, so clear them to save memory.
+ mEnabledItems.clear();
+ mVisibleItems.clear();
+ }
+
+ private void tryToInitialize(FluidCell aCell) {
+ final boolean isStackAlreadySet = aCell.mStack != null;
+
+ int id = aCell.getId();
+ String fluidName = aCell.getFluidName();
+ CellType cellType = aCell.getDisplayType();
+
+ // We'll check for ID uniqueness. Better to throw an exception than silently overwrite some
+ // fluid cells with other fluids due to ID collision.
+ if (registeredFluidDataMap.containsKey(id)) {
+ throw new IllegalStateException("Got ID collision for ID: " + id);
+ }
+
+ aCell.trySetStack();
+
+ Fluid fluid = FluidRegistry.getFluid(fluidName);
+ if (fluid == null) {
+ // The fluid is not guaranteed to exist.
+ // These fluids are non-GT fluids, so the mod may not be present.
+ if (isStackAlreadySet) {
+ throw new RuntimeException(
+ "Cell item for fluid " + fluidName
+ + " has already been created, but the fluid doesn't exist during postload");
+ } else {
+ // fluid doesn't exist and this item has not been referenced
+ return;
+ }
+ }
+
+ FluidStack fluidStack = new FluidStack(fluid, cellType.capacity);
+
+ ItemStack emptyCell = ItemList.Cell_Empty.get(1L);
+ FluidContainerRegistry
+ .registerFluidContainer(new FluidContainerRegistry.FluidContainerData(fluidStack, aCell.mStack, emptyCell));
+
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName(aCell.mStack) + ".name",
+ cellType.prefix.mLocalizedMaterialPre + fluid.getLocalizedName(fluidStack)
+ + cellType.prefix.mLocalizedMaterialPost);
+
+ int color = fluid.getColor();
+ short[] rgba = GT_Util.getRGBaArray(color);
+
+ registeredFluidDataMap.put(id, new RegisteredFluidData(rgba, iconContainerMap.get(cellType)));
+ }
+
+ private void registerOreDict() {
+ // The GregTech ore dictionary requires an entry in the Materials enum, and since the whole
+ // point of this class is to add cell items for non-GregTech fluids, the vast majority of
+ // cell items won't have an associated material. So only a rare few cell items will need to
+ // be registered.
+
+ // Register IC2 steam cell and Railcraft steam cell as synonyms.
+ // There is no steam material, so we'll use Water.cellMolten instead.
+ GT_OreDictUnificator.add(OrePrefixes.cellMolten, Materials.Water, GT_ModHandler.getIC2Item("steamCell", 1L));
+ GT_OreDictUnificator.add(OrePrefixes.cellMolten, Materials.Water, FluidCell.STEAM.getNoCopy());
+ }
+
+ @Override
+ public short[] getRGBa(ItemStack aStack) {
+ RegisteredFluidData fluidData = registeredFluidDataMap.get(aStack.getItemDamage());
+ if (fluidData == null) {
+ return Materials._NULL.mRGBa;
+ }
+
+ return fluidData.rgba;
+ }
+
+ @Override
+ public ItemStack getContainerItem(ItemStack aStack) {
+ return ItemList.Cell_Empty.get(1L);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ Arrays.stream(FluidCell.values())
+ .filter(fluid -> FluidRegistry.getFluid(fluid.getFluidName()) != null)
+ .map(FluidCell::get)
+ .filter(Objects::nonNull)
+ .forEach(aList::add);
+ }
+
+ @Override
+ public final IIcon getIconFromDamage(int aMetaData) {
+ IIconContainer iconContainer = getIconContainer(aMetaData);
+ if (iconContainer != null) {
+ return iconContainer.getIcon();
+ }
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIconContainer(int aMetaData) {
+ RegisteredFluidData fluidData = registeredFluidDataMap.get(aMetaData);
+ if (fluidData == null) {
+ return null;
+ }
+ return fluidData.iconContainer;
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack aStack) {
+ return 64;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_99.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_99.java
new file mode 100644
index 0000000000..08d6f23164
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_99.java
@@ -0,0 +1,214 @@
+package gregtech.common.items;
+
+import static gregtech.api.enums.GT_Values.M;
+import static gregtech.api.enums.OrePrefixes.cellMolten;
+
+import java.util.BitSet;
+import java.util.List;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import com.google.common.collect.ImmutableList;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Item;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class GT_MetaGenerated_Item_99 extends GT_MetaGenerated_Item {
+
+ public static GT_MetaGenerated_Item_99 INSTANCE;
+
+ /**
+ * Ore prefixes appear in this list in the order in which they will be assigned ID blocks.
+ *
+ * <p>
+ * In order to avoid breaking existing worlds, the entries in this list must not be re-ordered! The only safe
+ * modification that can be made to this list is adding new entries to the end.
+ */
+ private static final ImmutableList<OrePrefixes> CRACKED_CELL_TYPES = ImmutableList.of(
+ OrePrefixes.cellHydroCracked1,
+ OrePrefixes.cellHydroCracked2,
+ OrePrefixes.cellHydroCracked3,
+ OrePrefixes.cellSteamCracked1,
+ OrePrefixes.cellSteamCracked2,
+ OrePrefixes.cellSteamCracked3);
+
+ private static final int NUM_CRACKED_CELL_TYPES = CRACKED_CELL_TYPES.size();
+
+ /**
+ * Assignment of metadata IDs: 0 - 999: Molten cells 10_000 - 15_999: Cracked fluid cells (# IDs used is
+ * NUM_CRACKED_CELL_TYPES * 1_000; update this if you add any)
+ */
+ private final BitSet enabled = new BitSet();
+
+ public GT_MetaGenerated_Item_99() {
+ super("metaitem.99", (short) (10_000 + NUM_CRACKED_CELL_TYPES * 1_000), (short) 0);
+
+ INSTANCE = this;
+
+ for (Materials tMaterial : GregTech_API.sGeneratedMaterials) {
+ if (tMaterial == null || tMaterial.mMetaItemSubID < 0 || tMaterial.mMetaItemSubID >= 1_000) {
+ continue;
+ }
+
+ if ((tMaterial.contains(SubTag.SMELTING_TO_FLUID)) && (!tMaterial.contains(SubTag.NO_SMELTING))
+ && !tMaterial.contains(SubTag.SMELTING_TO_GEM)) {
+ registerMolten(tMaterial, tMaterial.mMetaItemSubID);
+ if (tMaterial.mSmeltInto != tMaterial && tMaterial.mSmeltInto.mMetaItemSubID >= 0
+ && tMaterial.mSmeltInto.mMetaItemSubID < 1_000) {
+ registerMolten(tMaterial.mSmeltInto, tMaterial.mSmeltInto.mMetaItemSubID);
+ }
+ }
+
+ if (tMaterial.canBeCracked()) {
+ registerCracked(tMaterial, tMaterial.mMetaItemSubID);
+ }
+ }
+
+ // We're not going to use these BitSets, so clear them to save memory.
+ mEnabledItems.clear();
+ mVisibleItems.clear();
+ }
+
+ private void registerMolten(Materials tMaterial, int i) {
+ ItemStack tStack = new ItemStack(this, 1, i);
+ enabled.set(i);
+
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName(tStack) + ".name",
+ cellMolten.getDefaultLocalNameFormatForItem(tMaterial));
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName(tStack) + ".tooltip",
+ tMaterial.getToolTip(cellMolten.mMaterialAmount / M));
+
+ if (cellMolten.mIsUnificatable) {
+ GT_OreDictUnificator.set(cellMolten, tMaterial, tStack);
+ } else {
+ GT_OreDictUnificator.registerOre(cellMolten.get(tMaterial), tStack);
+ }
+ }
+
+ private void registerCracked(Materials tMaterial, int i) {
+ int offset = 10_000;
+ for (OrePrefixes prefix : CRACKED_CELL_TYPES) {
+ ItemStack tStack = new ItemStack(this, 1, offset + i);
+ enabled.set(offset + i);
+
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName(tStack) + ".name",
+ prefix.getDefaultLocalNameFormatForItem(tMaterial));
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName(tStack) + ".tooltip",
+ tMaterial.getToolTip(prefix.mMaterialAmount / M));
+
+ if (prefix.mIsUnificatable) {
+ GT_OreDictUnificator.set(prefix, tMaterial, tStack);
+ } else {
+ GT_OreDictUnificator.registerOre(prefix.get(tMaterial), tStack);
+ }
+
+ offset += 1_000;
+ }
+ }
+
+ /** Returns null for item damage out of bounds. */
+ private Materials getMaterial(int damage) {
+ if (damage < 0) {
+ return null;
+ }
+ return GregTech_API.sGeneratedMaterials[damage % 1_000];
+ }
+
+ /** Returns null for item damage out of bounds. */
+ private OrePrefixes getOrePrefix(int damage) {
+ if (damage < 0) {
+ return null;
+ } else if (damage < 1_000) {
+ return cellMolten;
+ } else if (damage >= 10_000 && damage < 10_000 + (NUM_CRACKED_CELL_TYPES * 1_000)) {
+ return CRACKED_CELL_TYPES.get((damage / 1_000) - 10);
+ }
+ return null;
+ }
+
+ @Override
+ public short[] getRGBa(ItemStack aStack) {
+ OrePrefixes prefix = getOrePrefix(aStack.getItemDamage());
+ Materials material = getMaterial(aStack.getItemDamage());
+ if (material == null) {
+ material = Materials._NULL;
+ }
+
+ if (prefix == cellMolten) {
+ return material.mMoltenRGBa;
+ } else {
+ return material.mRGBa;
+ }
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack aStack) {
+ String aName = super.getItemStackDisplayName(aStack);
+ Materials material = getMaterial(aStack.getItemDamage());
+ if (material != null) {
+ return material.getLocalizedNameForItem(aName);
+ }
+ return aName;
+ }
+
+ @Override
+ public ItemStack getContainerItem(ItemStack aStack) {
+ OrePrefixes prefix = getOrePrefix(aStack.getItemDamage());
+ if (prefix != null) {
+ return prefix.mContainerItem;
+ }
+ return null;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ enabled.stream()
+ .mapToObj(i -> new ItemStack(this, 1, i))
+ .forEach(aList::add);
+ }
+
+ @Override
+ public final IIcon getIconFromDamage(int aMetaData) {
+ IIconContainer iconContainer = getIconContainer(aMetaData);
+ if (iconContainer != null) {
+ return iconContainer.getIcon();
+ }
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIconContainer(int aMetaData) {
+ Materials material = getMaterial(aMetaData);
+ OrePrefixes prefix = getOrePrefix(aMetaData);
+ if (material != null && prefix != null) {
+ return material.mIconSet.mTextures[prefix.mTextureIndex];
+ }
+ return null;
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack aStack) {
+ OrePrefixes prefix = getOrePrefix(aStack.getItemDamage());
+ if (prefix != null) {
+ return prefix.mDefaultStackSize;
+ } else {
+ return 64;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Tool_01.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Tool_01.java
new file mode 100644
index 0000000000..309507f2a9
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_MetaGenerated_Tool_01.java
@@ -0,0 +1,824 @@
+package gregtech.common.items;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.common.tools.GT_Tool_Axe;
+import gregtech.common.tools.GT_Tool_BranchCutter;
+import gregtech.common.tools.GT_Tool_ButcheryKnife;
+import gregtech.common.tools.GT_Tool_BuzzSaw;
+import gregtech.common.tools.GT_Tool_Chainsaw_HV;
+import gregtech.common.tools.GT_Tool_Chainsaw_LV;
+import gregtech.common.tools.GT_Tool_Chainsaw_MV;
+import gregtech.common.tools.GT_Tool_Crowbar;
+import gregtech.common.tools.GT_Tool_Drill_HV;
+import gregtech.common.tools.GT_Tool_Drill_LV;
+import gregtech.common.tools.GT_Tool_Drill_MV;
+import gregtech.common.tools.GT_Tool_File;
+import gregtech.common.tools.GT_Tool_HardHammer;
+import gregtech.common.tools.GT_Tool_Hoe;
+import gregtech.common.tools.GT_Tool_JackHammer;
+import gregtech.common.tools.GT_Tool_Knife;
+import gregtech.common.tools.GT_Tool_Mortar;
+import gregtech.common.tools.GT_Tool_Pickaxe;
+import gregtech.common.tools.GT_Tool_Plow;
+import gregtech.common.tools.GT_Tool_Plunger;
+import gregtech.common.tools.GT_Tool_RollingPin;
+import gregtech.common.tools.GT_Tool_Saw;
+import gregtech.common.tools.GT_Tool_Scoop;
+import gregtech.common.tools.GT_Tool_Screwdriver;
+import gregtech.common.tools.GT_Tool_Screwdriver_LV;
+import gregtech.common.tools.GT_Tool_Sense;
+import gregtech.common.tools.GT_Tool_Shovel;
+import gregtech.common.tools.GT_Tool_SoftHammer;
+import gregtech.common.tools.GT_Tool_Soldering_Iron;
+import gregtech.common.tools.GT_Tool_Sword;
+import gregtech.common.tools.GT_Tool_Turbine_Huge;
+import gregtech.common.tools.GT_Tool_Turbine_Large;
+import gregtech.common.tools.GT_Tool_Turbine_Normal;
+import gregtech.common.tools.GT_Tool_Turbine_Small;
+import gregtech.common.tools.GT_Tool_UniversalSpade;
+import gregtech.common.tools.GT_Tool_WireCutter;
+import gregtech.common.tools.GT_Tool_Wrench;
+import gregtech.common.tools.GT_Tool_Wrench_HV;
+import gregtech.common.tools.GT_Tool_Wrench_LV;
+import gregtech.common.tools.GT_Tool_Wrench_MV;
+import gregtech.common.tools.pocket.GT_Tool_Pocket_BranchCutter;
+import gregtech.common.tools.pocket.GT_Tool_Pocket_File;
+import gregtech.common.tools.pocket.GT_Tool_Pocket_Knife;
+import gregtech.common.tools.pocket.GT_Tool_Pocket_Multitool;
+import gregtech.common.tools.pocket.GT_Tool_Pocket_Saw;
+import gregtech.common.tools.pocket.GT_Tool_Pocket_Screwdriver;
+import gregtech.common.tools.pocket.GT_Tool_Pocket_WireCutter;
+
+public class GT_MetaGenerated_Tool_01 extends GT_MetaGenerated_Tool {
+
+ public static final short SWORD = 0;
+ public static final short PICKAXE = 2;
+ public static final short SHOVEL = 4;
+ public static final short AXE = 6;
+ public static final short HOE = 8;
+ public static final short SAW = 10;
+ public static final short HARDHAMMER = 12;
+ public static final short SOFTMALLET = 14;
+
+ @Deprecated
+ public static final short SOFTHAMMER = SOFTMALLET;
+
+ public static final short WRENCH = 16;
+ public static final short FILE = 18;
+ public static final short CROWBAR = 20;
+ public static final short SCREWDRIVER = 22;
+ public static final short MORTAR = 24;
+ public static final short WIRECUTTER = 26;
+ public static final short SCOOP = 28;
+ public static final short BRANCHCUTTER = 30;
+ public static final short UNIVERSALSPADE = 32;
+ public static final short KNIFE = 34;
+ public static final short BUTCHERYKNIFE = 36;
+
+ @Deprecated
+ public static final short SICKLE = 38;
+
+ public static final short SENSE = 40;
+ public static final short PLOW = 42;
+ public static final short PLUNGER = 44;
+ public static final short ROLLING_PIN = 46;
+ public static final short DRILL_LV = 100;
+ public static final short DRILL_MV = 102;
+ public static final short DRILL_HV = 104;
+ public static final short CHAINSAW_LV = 110;
+ public static final short CHAINSAW_MV = 112;
+ public static final short CHAINSAW_HV = 114;
+ public static final short WRENCH_LV = 120;
+ public static final short WRENCH_MV = 122;
+ public static final short WRENCH_HV = 124;
+ public static final short JACKHAMMER = 130;
+ public static final short BUZZSAW_LV = 140;
+ public static final short BUZZSAW_MV = 142;
+ public static final short BUZZSAW_HV = 144;
+
+ @Deprecated
+ public static final short BUZZSAW = BUZZSAW_LV;
+
+ public static final short SCREWDRIVER_LV = 150;
+ public static final short SCREWDRIVER_MV = 152;
+ public static final short SCREWDRIVER_HV = 154;
+ public static final short SOLDERING_IRON_LV = 160;
+ public static final short SOLDERING_IRON_MV = 162;
+ public static final short SOLDERING_IRON_HV = 164;
+ public static final short TURBINE_SMALL = 170;
+ public static final short TURBINE = 172;
+ public static final short TURBINE_LARGE = 174;
+ public static final short TURBINE_HUGE = 176;
+
+ @Deprecated
+ public static final short TURBINE_BLADE = 178;
+
+ public static final short POCKET_MULTITOOL = 180;
+ public static final short POCKET_BRANCHCUTTER = 182;
+ public static final short POCKET_FILE = 184;
+ public static final short POCKET_KNIFE = 186;
+ public static final short POCKET_SAW = 188;
+ public static final short POCKET_SCREWDRIVER = 190;
+ public static final short POCKET_WIRECUTTER = 192;
+
+ public static GT_MetaGenerated_Tool_01 INSTANCE;
+
+ public GT_MetaGenerated_Tool_01() {
+ super("metatool.01");
+ INSTANCE = this;
+ addTool(
+ SWORD,
+ "Sword",
+ "",
+ new GT_Tool_Sword(),
+ ToolDictNames.craftingToolSword,
+ ToolDictNames.craftingToolBlade,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 4L));
+ addTool(
+ PICKAXE,
+ "Pickaxe",
+ "",
+ new GT_Tool_Pickaxe(),
+ ToolDictNames.craftingToolPickaxe,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 4L));
+ addTool(
+ SHOVEL,
+ "Shovel",
+ "",
+ new GT_Tool_Shovel(),
+ ToolDictNames.craftingToolShovel,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 4L));
+ addTool(
+ AXE,
+ "Axe",
+ "",
+ new GT_Tool_Axe(),
+ ToolDictNames.craftingToolAxe,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L));
+ addTool(
+ HOE,
+ "Hoe",
+ "",
+ new GT_Tool_Hoe(),
+ ToolDictNames.craftingToolHoe,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MESSIS, 4L));
+ addTool(
+ SAW,
+ "Saw",
+ "Can also harvest Ice",
+ new GT_Tool_Saw(),
+ ToolDictNames.craftingToolSaw,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L));
+ GregTech_API.registerTool(
+ addTool(
+ HARDHAMMER,
+ "Hammer",
+ "Crushes Ores instead of harvesting them",
+ new GT_Tool_HardHammer(),
+ ToolDictNames.craftingToolHardHammer,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)),
+ GregTech_API.sHardHammerList);
+ GregTech_API.registerTool(
+ addTool(
+ SOFTMALLET,
+ "Soft Mallet",
+ "",
+ new GT_Tool_SoftHammer(),
+ ToolDictNames.craftingToolSoftHammer,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LIMUS, 4L)),
+ GregTech_API.sSoftHammerList);
+ GregTech_API.registerTool(
+ addTool(
+ WRENCH,
+ "Wrench",
+ "Hold Leftclick to dismantle Machines",
+ new GT_Tool_Wrench(),
+ ToolDictNames.craftingToolWrench,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)),
+ GregTech_API.sWrenchList);
+ addTool(
+ FILE,
+ "File",
+ "",
+ new GT_Tool_File(),
+ ToolDictNames.craftingToolFile,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L));
+ GregTech_API.registerTool(
+ addTool(
+ CROWBAR,
+ "Crowbar",
+ "Dismounts Covers and Rotates Rails",
+ new GT_Tool_Crowbar(),
+ ToolDictNames.craftingToolCrowbar,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 2L)),
+ GregTech_API.sCrowbarList);
+ GregTech_API.registerTool(
+ addTool(
+ SCREWDRIVER,
+ "Screwdriver",
+ "Adjusts Covers and Machines",
+ new GT_Tool_Screwdriver(),
+ ToolDictNames.craftingToolScrewdriver,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)),
+ GregTech_API.sScrewdriverList);
+ addTool(
+ MORTAR,
+ "Mortar",
+ "",
+ new GT_Tool_Mortar(),
+ ToolDictNames.craftingToolMortar,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2L));
+ GregTech_API.registerTool(
+ addTool(
+ WIRECUTTER,
+ "Wire Cutter",
+ "",
+ new GT_Tool_WireCutter(),
+ ToolDictNames.craftingToolWireCutter,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)),
+ GregTech_API.sWireCutterList);
+ addTool(
+ SCOOP,
+ "Scoop",
+ "",
+ new GT_Tool_Scoop(),
+ ToolDictNames.craftingToolScoop,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.BESTIA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PANNUS, 2L));
+ addTool(
+ BRANCHCUTTER,
+ "Branch Cutter",
+ "",
+ new GT_Tool_BranchCutter(),
+ ToolDictNames.craftingToolBranchCutter,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 2L));
+ GregTech_API.registerTool(
+ addTool(
+ UNIVERSALSPADE,
+ "Universal Spade",
+ "",
+ new GT_Tool_UniversalSpade(),
+ ToolDictNames.craftingToolBlade,
+ ToolDictNames.craftingToolShovel,
+ ToolDictNames.craftingToolCrowbar,
+ ToolDictNames.craftingToolSaw,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 1L)),
+ GregTech_API.sCrowbarList);
+ addTool(
+ KNIFE,
+ "Knife",
+ "",
+ new GT_Tool_Knife(),
+ ToolDictNames.craftingToolBlade,
+ ToolDictNames.craftingToolKnife,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TELUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 2L));
+ addTool(
+ BUTCHERYKNIFE,
+ "Butchery Knife",
+ "Has a slow Attack Rate",
+ new GT_Tool_ButcheryKnife(),
+ ToolDictNames.craftingToolBlade,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.CORPUS, 4L));
+
+ addTool(
+ SENSE,
+ "Sense",
+ "Because a Scythe doesn't make Sense",
+ new GT_Tool_Sense(),
+ ToolDictNames.craftingToolBlade,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.HERBA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MORTUUS, 2L));
+ addTool(
+ PLOW,
+ "Plow",
+ "Used to get rid of Snow",
+ new GT_Tool_Plow(),
+ ToolDictNames.craftingToolPlow,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 2L));
+ addTool(
+ PLUNGER,
+ "Plunger",
+ "",
+ new GT_Tool_Plunger(),
+ ToolDictNames.craftingToolPlunger,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ITER, 2L));
+ addTool(
+ ROLLING_PIN,
+ "Rolling Pin",
+ "",
+ new GT_Tool_RollingPin(),
+ ToolDictNames.craftingToolRollingPin,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LIMUS, 4L));
+
+ addTool(
+ DRILL_LV,
+ "Drill (LV)",
+ "",
+ new GT_Tool_Drill_LV(),
+ ToolDictNames.craftingToolMiningDrill,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 4L));
+ addTool(
+ DRILL_MV,
+ "Drill (MV)",
+ "",
+ new GT_Tool_Drill_MV(),
+ ToolDictNames.craftingToolMiningDrill,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 4L));
+ addTool(
+ DRILL_HV,
+ "Drill (HV)",
+ "",
+ new GT_Tool_Drill_HV(),
+ ToolDictNames.craftingToolMiningDrill,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 4L));
+ addTool(
+ CHAINSAW_LV,
+ "Chainsaw (LV)",
+ "Can also harvest Ice",
+ new GT_Tool_Chainsaw_LV(),
+ ToolDictNames.craftingToolSaw,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L));
+ addTool(
+ CHAINSAW_MV,
+ "Chainsaw (MV)",
+ "Can also harvest Ice",
+ new GT_Tool_Chainsaw_MV(),
+ ToolDictNames.craftingToolSaw,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L));
+ addTool(
+ CHAINSAW_HV,
+ "Chainsaw (HV)",
+ "Can also harvest Ice",
+ new GT_Tool_Chainsaw_HV(),
+ ToolDictNames.craftingToolSaw,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L));
+ GregTech_API.registerTool(
+ addTool(
+ WRENCH_LV,
+ "Wrench (LV)",
+ "Hold Left Button to dismantle Machines",
+ new GT_Tool_Wrench_LV(),
+ ToolDictNames.craftingToolWrench,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)),
+ GregTech_API.sWrenchList);
+ GregTech_API.registerTool(
+ addTool(
+ WRENCH_MV,
+ "Wrench (MV)",
+ "Hold Left Button to dismantle Machines",
+ new GT_Tool_Wrench_MV(),
+ ToolDictNames.craftingToolWrench,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)),
+ GregTech_API.sWrenchList);
+ GregTech_API.registerTool(
+ addTool(
+ WRENCH_HV,
+ "Wrench (HV)",
+ "Hold Left Button to dismantle Machines",
+ new GT_Tool_Wrench_HV(),
+ ToolDictNames.craftingToolWrench,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)),
+ GregTech_API.sWrenchList);
+ GregTech_API.registerTool(
+ addTool(
+ JACKHAMMER,
+ "JackHammer (HV)",
+ "Breaks Rocks into pieces",
+ new GT_Tool_JackHammer(),
+ ToolDictNames.craftingToolJackHammer,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERFODIO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERDITIO, 2L)),
+ GregTech_API.sJackhammerList);
+ addTool(
+ BUZZSAW_LV,
+ "Buzzsaw (LV)",
+ "Not suitable for harvesting Blocks",
+ new GT_Tool_BuzzSaw(),
+ ToolDictNames.craftingToolSaw,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L));
+ addTool(
+ BUZZSAW_MV,
+ "Buzzsaw (MV)",
+ "Not suitable for harvesting Blocks",
+ new GT_Tool_BuzzSaw(),
+ ToolDictNames.craftingToolSaw,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L));
+ addTool(
+ BUZZSAW_HV,
+ "Buzzsaw (HV)",
+ "Not suitable for harvesting Blocks",
+ new GT_Tool_BuzzSaw(),
+ ToolDictNames.craftingToolSaw,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 2L));
+ GregTech_API.registerTool(
+ addTool(
+ SCREWDRIVER_LV,
+ "Screwdriver (LV)",
+ "Adjusts Covers and Machines",
+ new GT_Tool_Screwdriver_LV(),
+ ToolDictNames.craftingToolScrewdriver,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)),
+ GregTech_API.sScrewdriverList);
+ GregTech_API.registerTool(
+ addTool(
+ SCREWDRIVER_MV,
+ "Screwdriver (MV)",
+ "Adjusts Covers and Machines",
+ new GT_Tool_Screwdriver_LV(),
+ ToolDictNames.craftingToolScrewdriver,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)),
+ GregTech_API.sScrewdriverList);
+ GregTech_API.registerTool(
+ addTool(
+ SCREWDRIVER_HV,
+ "Screwdriver (HV)",
+ "Adjusts Covers and Machines",
+ new GT_Tool_Screwdriver_LV(),
+ ToolDictNames.craftingToolScrewdriver,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)),
+ GregTech_API.sScrewdriverList);
+ GregTech_API.registerTool(
+ addTool(
+ SOLDERING_IRON_LV,
+ "Soldering Iron (LV)",
+ "Fixes burned out Circuits. Needs soldering materials in inventory.",
+ new GT_Tool_Soldering_Iron(),
+ ToolDictNames.craftingToolSolderingIron,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)),
+ GregTech_API.sSolderingToolList);
+ GregTech_API.registerTool(
+ addTool(
+ SOLDERING_IRON_MV,
+ "Soldering Iron (MV)",
+ "Fixes burned out Circuits. Needs soldering materials in inventory.",
+ new GT_Tool_Soldering_Iron(),
+ ToolDictNames.craftingToolSolderingIron,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)),
+ GregTech_API.sSolderingToolList);
+ GregTech_API.registerTool(
+ addTool(
+ SOLDERING_IRON_HV,
+ "Soldering Iron (HV)",
+ "Fixes burned out Circuits. Needs soldering materials in inventory.",
+ new GT_Tool_Soldering_Iron(),
+ ToolDictNames.craftingToolSolderingIron,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 2L)),
+ GregTech_API.sSolderingToolList);
+
+ addTool(TURBINE_SMALL, "Small Turbine", "Turbine Rotors for your power station", new GT_Tool_Turbine_Small());
+ addTool(TURBINE, "Turbine", "Turbine Rotors for your power station", new GT_Tool_Turbine_Normal());
+ addTool(TURBINE_LARGE, "Large Turbine", "Turbine Rotors for your power station", new GT_Tool_Turbine_Large());
+ addTool(TURBINE_HUGE, "Huge Turbine", "Turbine Rotors for your power station", new GT_Tool_Turbine_Huge());
+
+ addTool(
+ POCKET_MULTITOOL,
+ "Pocket Multitool",
+ "6 useful Tools in one!",
+ new GT_Tool_Pocket_Multitool(POCKET_KNIFE),
+ null,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3));
+ addTool(
+ POCKET_KNIFE,
+ "Pocket Multitool (Knife)",
+ "",
+ new GT_Tool_Pocket_Knife(POCKET_SAW),
+ ToolDictNames.craftingToolKnife,
+ ToolDictNames.craftingToolBlade,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3));
+ addTool(
+ POCKET_SAW,
+ "Pocket Multitool (Saw)",
+ "Can also harvest Ice",
+ new GT_Tool_Pocket_Saw(POCKET_FILE),
+ ToolDictNames.craftingToolSaw,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3));
+ addTool(
+ POCKET_FILE,
+ "Pocket Multitool (File)",
+ "",
+ new GT_Tool_Pocket_File(POCKET_SCREWDRIVER),
+ ToolDictNames.craftingToolFile,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3));
+ GregTech_API.registerTool(
+ addTool(
+ POCKET_SCREWDRIVER,
+ "Pocket Multitool (Screwdriver)",
+ "Adjusts Covers and Machines",
+ new GT_Tool_Pocket_Screwdriver(POCKET_WIRECUTTER),
+ ToolDictNames.craftingToolScrewdriver,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3)),
+ GregTech_API.sScrewdriverList);
+ GregTech_API.registerTool(
+ addTool(
+ POCKET_WIRECUTTER,
+ "Pocket Multitool (Wire Cutter)",
+ "",
+ new GT_Tool_Pocket_WireCutter(POCKET_BRANCHCUTTER),
+ ToolDictNames.craftingToolWireCutter,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3)),
+ GregTech_API.sWireCutterList);
+ addTool(
+ POCKET_BRANCHCUTTER,
+ "Pocket Multitool (Branch Cutter)",
+ "",
+ new GT_Tool_Pocket_BranchCutter(POCKET_MULTITOOL),
+ ToolDictNames.craftingToolBranchCutter,
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 6),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.FABRICO, 3),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3));
+
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.Flint, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', new ItemStack(Items.flint, 1), 'S', OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.Bronze, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Bronze), 'S', OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.Iron, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Iron), 'S', OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.Steel, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Steel), 'S', OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.WroughtIron, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.WroughtIron), 'S',
+ OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.RedSteel, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.RedSteel), 'S',
+ OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.BlueSteel, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.BlueSteel), 'S',
+ OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.BlackSteel, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.BlackSteel), 'S',
+ OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.DamascusSteel, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.DamascusSteel), 'S',
+ OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.Thaumium, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Thaumium), 'S',
+ OrePrefixes.stone });
+
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(ROLLING_PIN, 1, Materials.Wood, Materials.Wood, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " S", " I ", "S f", 'I', OrePrefixes.plank.get(Materials.Wood), 'S',
+ OrePrefixes.stick.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(ROLLING_PIN, 1, Materials.Plastic, Materials.Plastic, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.Plastic), 'S',
+ OrePrefixes.stick.get(Materials.Plastic) });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(ROLLING_PIN, 1, Materials.Aluminium, Materials.Aluminium, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.Aluminium), 'S',
+ OrePrefixes.stick.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(ROLLING_PIN, 1, Materials.StainlessSteel, Materials.StainlessSteel, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.StainlessSteel), 'S',
+ OrePrefixes.stick.get(Materials.StainlessSteel) });
+
+ if (!GregTech_API.sSpecialFile.get(ConfigCategories.general, "DisableFlintTools", false)) {
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(SWORD, 1, Materials.Flint, Materials.Wood, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "F", "F", "S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F',
+ new ItemStack(Items.flint, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(PICKAXE, 1, Materials.Flint, Materials.Wood, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "FFF", " S ", " S ", 'S', OrePrefixes.stick.get(Materials.Wood), 'F',
+ new ItemStack(Items.flint, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(SHOVEL, 1, Materials.Flint, Materials.Wood, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "F", "S", "S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F',
+ new ItemStack(Items.flint, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(AXE, 1, Materials.Flint, Materials.Wood, null),
+ GT_ModHandler.RecipeBits.MIRRORED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "FF", "FS", " S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F',
+ new ItemStack(Items.flint, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(HOE, 1, Materials.Flint, Materials.Wood, null),
+ GT_ModHandler.RecipeBits.MIRRORED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "FF", " S", " S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F',
+ new ItemStack(Items.flint, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(KNIFE, 1, Materials.Flint, Materials.Wood, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "F", "S", 'S', OrePrefixes.stick.get(Materials.Wood), 'F',
+ new ItemStack(Items.flint, 1) });
+
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.Flint, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', new ItemStack(Items.flint, 1), 'S', OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.Bronze, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Bronze), 'S',
+ OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.Iron, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Iron), 'S',
+ OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.Steel, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Steel), 'S',
+ OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.WroughtIron, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.WroughtIron), 'S',
+ OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.RedSteel, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.RedSteel), 'S',
+ OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.BlueSteel, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.BlueSteel), 'S',
+ OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.BlackSteel, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.BlackSteel), 'S',
+ OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.DamascusSteel, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.DamascusSteel), 'S',
+ OrePrefixes.stone });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(MORTAR, 1, Materials.Thaumium, Materials.Stone, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " I ", "SIS", "SSS", 'I', OrePrefixes.ingot.get(Materials.Thaumium), 'S',
+ OrePrefixes.stone });
+
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(ROLLING_PIN, 1, Materials.Wood, Materials.Wood, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " S", " I ", "S f", 'I', OrePrefixes.plank.get(Materials.Wood), 'S',
+ OrePrefixes.stick.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(ROLLING_PIN, 1, Materials.Plastic, Materials.Plastic, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.Plastic), 'S',
+ OrePrefixes.stick.get(Materials.Plastic) });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(ROLLING_PIN, 1, Materials.Aluminium, Materials.Aluminium, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.Aluminium), 'S',
+ OrePrefixes.stick.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(ROLLING_PIN, 1, Materials.StainlessSteel, Materials.StainlessSteel, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.StainlessSteel), 'S',
+ OrePrefixes.stick.get(Materials.StainlessSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ INSTANCE.getToolWithStats(ROLLING_PIN, 1, Materials.IronWood, Materials.IronWood, null),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { " S", " I ", "S f", 'I', OrePrefixes.ingot.get(Materials.IronWood), 'S',
+ OrePrefixes.stick.get(Materials.IronWood) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Items.coal, 1) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Clay, 1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Blocks.clay, 1) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Items.wheat, 1) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Items.flint, 1),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Blocks.gravel, 1) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Items.blaze_powder, 2),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { ToolDictNames.craftingToolMortar, new ItemStack(Items.blaze_rod, 1) });
+
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/items/GT_NeutronReflector_Item.java b/src/main/java/gregtech/common/items/GT_NeutronReflector_Item.java
new file mode 100644
index 0000000000..b2fd104917
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_NeutronReflector_Item.java
@@ -0,0 +1,54 @@
+package gregtech.common.items;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.items.GT_Generic_Item;
+import ic2.api.reactor.IReactor;
+import ic2.api.reactor.IReactorComponent;
+
+public class GT_NeutronReflector_Item extends GT_Generic_Item implements IReactorComponent {
+
+ public GT_NeutronReflector_Item(String aUnlocalized, String aEnglish, int aMaxDamage) {
+ super(aUnlocalized, aEnglish, "Undestructable");
+ this.setMaxStackSize(64);
+ this.setMaxDamage(aMaxDamage);
+ }
+
+ @Override
+ public boolean acceptUraniumPulse(IReactor reactor, ItemStack yourStack, ItemStack pulsingStack, int youX, int youY,
+ int pulseX, int pulseY, boolean heatrun) {
+ if (!heatrun) {
+ ((IReactorComponent) pulsingStack.getItem())
+ .acceptUraniumPulse(reactor, pulsingStack, yourStack, pulseX, pulseY, youX, youY, heatrun);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean canStoreHeat(IReactor aReactor, ItemStack aStack, int x, int y) {
+ return false;
+ }
+
+ @Override
+ public int getMaxHeat(IReactor aReactor, ItemStack aStack, int x, int y) {
+ return 0;
+ }
+
+ @Override
+ public int getCurrentHeat(IReactor aReactor, ItemStack aStack, int x, int y) {
+ return 0;
+ }
+
+ @Override
+ public float influenceExplosion(IReactor aReactor, ItemStack aStack) {
+ return -1.0F;
+ }
+
+ @Override
+ public int alterHeat(IReactor aReactor, ItemStack aStack, int x, int y, int aHeat) {
+ return aHeat;
+ }
+
+ @Override
+ public void processChamber(IReactor aReactor, ItemStack aStack, int x, int y, boolean aHeatRun) {}
+}
diff --git a/src/main/java/gregtech/common/items/GT_SensorCard_Item.java b/src/main/java/gregtech/common/items/GT_SensorCard_Item.java
new file mode 100644
index 0000000000..67e5b24a70
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_SensorCard_Item.java
@@ -0,0 +1,111 @@
+package gregtech.common.items;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+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;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation;
+import gregtech.api.items.GT_Generic_Item;
+import gregtech.api.util.GT_LanguageManager;
+import shedar.mods.ic2.nuclearcontrol.api.CardState;
+import shedar.mods.ic2.nuclearcontrol.api.ICardWrapper;
+import shedar.mods.ic2.nuclearcontrol.api.IPanelDataSource;
+import shedar.mods.ic2.nuclearcontrol.api.IRemoteSensor;
+import shedar.mods.ic2.nuclearcontrol.api.PanelSetting;
+import shedar.mods.ic2.nuclearcontrol.api.PanelString;
+
+public class GT_SensorCard_Item extends GT_Generic_Item implements IRemoteSensor, IPanelDataSource {
+
+ private static final UUID CARD_TYPE = new UUID(0L, 41L);
+
+ private int strCount;
+
+ public GT_SensorCard_Item(String aUnlocalized, String aEnglish) {
+ super(aUnlocalized, aEnglish, "Insert into Display Panel");
+ setMaxStackSize(1);
+ }
+
+ @Override
+ public void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
+ super.addAdditionalToolTips(aList, aStack, aPlayer);
+ if (aStack != null) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ aList.add(transItem("014", "Missing Coordinates!"));
+ } else {
+ aList.add(transItem("015", "Device at:"));
+ aList.add(
+ String.format(
+ "x: %d, y: %d, z: %d",
+ tNBT.getInteger("x"),
+ tNBT.getInteger("y"),
+ tNBT.getInteger("z")));
+ }
+ }
+ }
+
+ @Override
+ public CardState update(TileEntity aPanel, ICardWrapper aCard, int aMaxRange) {
+ return update(aPanel.getWorldObj(), aCard, aMaxRange);
+ }
+
+ @Override
+ public CardState update(World world, ICardWrapper aCard, int aMaxRange) {
+ ChunkCoordinates target = aCard.getTarget();
+
+ TileEntity tTileEntity = world.getTileEntity(target.posX, target.posY, target.posZ);
+ if (((tTileEntity instanceof IGregTechDeviceInformation))
+ && (((IGregTechDeviceInformation) tTileEntity).isGivingInformation())) {
+ String[] tInfoData = ((IGregTechDeviceInformation) tTileEntity).getInfoData();
+ for (int i = 0; i < tInfoData.length; i++) {
+ aCard.setString("mString" + i, tInfoData[i]);
+ }
+ aCard.setInt("mString", strCount = tInfoData.length);
+ return CardState.OK;
+ }
+ return CardState.NO_TARGET;
+ }
+
+ @Override
+ public List<PanelString> getStringData(int aSettings, ICardWrapper aCard, boolean aLabels) {
+ List<PanelString> rList = new LinkedList<>();
+ for (int i = 0; i < (strCount = aCard.getInt("mString")); i++) {
+ if ((aSettings & 1 << i) != 0) {
+ PanelString line = new PanelString();
+ line.textLeft = GT_LanguageManager.getTranslation(aCard.getString("mString" + i), "\\\\");
+ rList.add(line);
+ }
+ }
+ return rList;
+ }
+
+ @Override
+ public List<PanelSetting> getSettingsList() {
+ List<PanelSetting> rList = new ArrayList<>();
+ for (int i = 0; i < strCount; i++) {
+ rList.add(new PanelSetting(String.valueOf((i + 1)), 1 << i, getCardType()));
+ }
+ return rList;
+ }
+
+ @Override
+ public UUID getCardType() {
+ return CARD_TYPE;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aOutputSubItems) {}
+}
diff --git a/src/main/java/gregtech/common/items/GT_TierDrone.java b/src/main/java/gregtech/common/items/GT_TierDrone.java
new file mode 100644
index 0000000000..58da852d0e
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_TierDrone.java
@@ -0,0 +1,18 @@
+package gregtech.common.items;
+
+import gregtech.api.items.GT_Generic_Item;
+
+public class GT_TierDrone extends GT_Generic_Item {
+
+ private final int level;
+
+ public GT_TierDrone(String aUnlocalized, String aEnglish, String aEnglishTooltip, int level) {
+ super(aUnlocalized, aEnglish, aEnglishTooltip);
+ this.level = level;
+ this.setMaxStackSize(64);
+ }
+
+ public int getLevel() {
+ return level;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/GT_VolumetricFlask.java b/src/main/java/gregtech/common/items/GT_VolumetricFlask.java
new file mode 100644
index 0000000000..50a88f4700
--- /dev/null
+++ b/src/main/java/gregtech/common/items/GT_VolumetricFlask.java
@@ -0,0 +1,361 @@
+package gregtech.common.items;
+
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static ic2.core.util.LiquidUtil.drainContainerStack;
+import static ic2.core.util.LiquidUtil.fillContainerStack;
+import static ic2.core.util.LiquidUtil.placeFluid;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+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.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.MovingObjectPosition.MovingObjectType;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.FakePlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidBlock;
+import net.minecraftforge.fluids.IFluidContainerItem;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.gtnewhorizons.modularui.api.ModularUITextures;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.api.screen.IItemWithModularUI;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.VanillaButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.items.GT_Generic_Item;
+import gregtech.api.util.GT_Utility;
+import ic2.core.util.LiquidUtil;
+
+public class GT_VolumetricFlask extends GT_Generic_Item implements IFluidContainerItem, IItemWithModularUI {
+
+ private final int maxCapacity;
+ private final String unlocalFlaskName;
+
+ @SideOnly(Side.CLIENT)
+ public IIcon iconWindow;
+
+ public GT_VolumetricFlask(String unlocalized, String english, int maxCapacity) {
+ super(unlocalized, english, null);
+ this.maxCapacity = maxCapacity;
+ unlocalFlaskName = unlocalized;
+ setMaxStackSize(64);
+ setNoRepair();
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
+ if (!world.isRemote && isEmpty(stack) && getMovingObjectPositionFromPlayer(world, player, true) == null)
+ GT_UIInfos.openPlayerHeldItemUI(player);
+ return super.onItemRightClick(stack, world, player);
+ }
+
+ @Override
+ public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int ordinalSide,
+ float xOffset, float yOffset, float zOffset) {
+ if (player instanceof FakePlayer) {
+ return false;
+ }
+ if (world.isRemote) return false;
+ if (interactWithTank(stack, player, world, x, y, z, ordinalSide)) {
+ return true;
+ }
+ MovingObjectPosition mop = getMovingObjectPositionFromPlayer(world, player, true);
+ if (mop == null) {
+ return false;
+ }
+ if (mop.typeOfHit == MovingObjectType.BLOCK) {
+ x = mop.blockX;
+ y = mop.blockY;
+ z = mop.blockZ;
+ if (!world.canMineBlock(player, x, y, z) || !player.canPlayerEdit(x, y, z, mop.sideHit, stack)) {
+ return false;
+ }
+ if (collectFluidBlock(stack, player, world, x, y, z)) {
+ return true;
+ }
+ ForgeDirection dir = ForgeDirection.VALID_DIRECTIONS[mop.sideHit];
+ FluidStack fluidStack = drainContainerStack(stack, player, 1000, true);
+ if (placeFluid(fluidStack, world, x, y, z)
+ || (player.canPlayerEdit(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, mop.sideHit, stack)
+ && placeFluid(fluidStack, world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ))) {
+ if (!player.capabilities.isCreativeMode) drainContainerStack(stack, player, 1000, false);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isEmpty(ItemStack stack) {
+ return getFluid(stack) == null;
+ }
+
+ public int getFreeSpace(ItemStack stack) {
+ int capacity = getCapacity(stack);
+ if (capacity > 0) {
+ FluidStack fluidStack = getFluid(stack);
+ return fluidStack == null ? capacity : capacity - fluidStack.amount;
+ }
+ return 0;
+ }
+
+ public int getMaxCapacity() {
+ return this.maxCapacity;
+ }
+
+ @Override
+ public int getCapacity(ItemStack stack) {
+ int capacity = 1000;
+ if (stack.hasTagCompound()) {
+ NBTTagCompound nbt = stack.getTagCompound();
+ if (nbt.hasKey("Capacity", 3)) capacity = nbt.getInteger("Capacity");
+ }
+ return Math.min(getMaxCapacity(), capacity);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aIconRegister) {
+ super.registerIcons(aIconRegister);
+ iconWindow = aIconRegister.registerIcon(GregTech.getResourcePath("gt." + unlocalFlaskName + ".window"));
+ }
+
+ public void setCapacity(ItemStack stack, int capacity) {
+ capacity = Math.min(capacity, getMaxCapacity());
+ NBTTagCompound nbt = stack.getTagCompound();
+ if (nbt == null) {
+ stack.setTagCompound(nbt = new NBTTagCompound());
+ }
+ nbt.setInteger("Capacity", capacity);
+ }
+
+ @Override
+ public FluidStack getFluid(ItemStack stack) {
+ if (stack.hasTagCompound()) {
+ NBTTagCompound nbt = stack.getTagCompound();
+ if (nbt.hasKey("Fluid", 10)) return FluidStack.loadFluidStackFromNBT(nbt.getCompoundTag("Fluid"));
+ }
+ return null;
+ }
+
+ public void setFluid(ItemStack stack, FluidStack fluidStack) {
+ boolean removeFluid = (fluidStack == null) || (fluidStack.amount <= 0);
+ NBTTagCompound nbt = stack.getTagCompound();
+ if (nbt == null) {
+ if (removeFluid) return;
+ stack.setTagCompound(nbt = new NBTTagCompound());
+ }
+ if (removeFluid) {
+ nbt.removeTag("Fluid");
+ if (nbt.hasNoTags()) {
+ stack.setTagCompound(null);
+ }
+ } else {
+ nbt.setTag("Fluid", fluidStack.writeToNBT(new NBTTagCompound()));
+ }
+ }
+
+ @Override
+ public int fill(ItemStack stack, FluidStack resource, boolean doFill) {
+ if (stack.stackSize != 1) return 0;
+ if ((resource == null) || (resource.amount <= 0)) {
+ return 0;
+ }
+ FluidStack fluidStack = getFluid(stack);
+ if (fluidStack == null) {
+ fluidStack = new FluidStack(resource, 0);
+ } else if (!fluidStack.isFluidEqual(resource)) {
+ return 0;
+ }
+ int amount = Math.min(getCapacity(stack) - fluidStack.amount, resource.amount);
+ if ((doFill) && (amount > 0)) {
+ fluidStack.amount += amount;
+ setFluid(stack, fluidStack);
+ }
+ return amount;
+ }
+
+ @Override
+ public FluidStack drain(ItemStack stack, int maxDrain, boolean doDrain) {
+ if (stack.stackSize != 1) return null;
+ FluidStack fluidStack = getFluid(stack);
+ if (fluidStack == null) return null;
+ maxDrain = Math.min(fluidStack.amount, maxDrain);
+ if (doDrain) {
+ fluidStack.amount -= maxDrain;
+ setFluid(stack, fluidStack);
+ }
+ return new FluidStack(fluidStack, maxDrain);
+ }
+
+ @Override
+ protected void addAdditionalToolTips(List<String> info, ItemStack stack, EntityPlayer aPlayer) {
+ FluidStack fs = getFluid(stack);
+ if (fs != null) {
+ info.add(String.format("< %s, %s mB >", GT_Utility.getFluidName(fs, true), formatNumbers(fs.amount)));
+ } else {
+ info.add(String.format("< Empty, %s mB >", formatNumbers(getCapacity(stack))));
+ }
+ info.add("Rightclick on air to set volume (only while empty)");
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs creativeTabs, List<ItemStack> itemList) {
+ itemList.add(new ItemStack(this));
+ for (Fluid fluid : FluidRegistry.getRegisteredFluids()
+ .values()) {
+ if (fluid != null) {
+ ItemStack stack = new ItemStack(this);
+ setCapacity(stack, getMaxCapacity());
+ fill(stack, new FluidStack(fluid, Integer.MAX_VALUE), true);
+ itemList.add(stack);
+ }
+ }
+ }
+
+ private boolean interactWithTank(ItemStack stack, EntityPlayer player, World world, int x, int y, int z,
+ int ordinalSide) {
+ if (world.isRemote) {
+ return false;
+ }
+ TileEntity te = world.getTileEntity(x, y, z);
+ if (!(te instanceof IFluidHandler handler)) {
+ return false;
+ }
+ ForgeDirection dir = ForgeDirection.getOrientation(ordinalSide);
+ FluidStack fs = this.getFluid(stack);
+ int capacity = getCapacity(stack);
+ if (fs != null && (!player.isSneaking() || fs.amount >= capacity)) {
+ int amount = handler.fill(dir, fs, false);
+ if (amount > 0) {
+ fs = LiquidUtil.drainContainerStack(stack, player, amount, false);
+ if (fs != null && fs.amount > 0) {
+ handler.fill(dir, fs, true);
+ }
+ }
+ } else {
+ int amount = fs == null ? capacity : capacity - fs.amount;
+ FluidStack input = handler.drain(dir, amount, false);
+ if (input != null && input.amount > 0) {
+ amount = LiquidUtil.fillContainerStack(stack, player, input, false);
+ if (amount > 0) {
+ handler.drain(dir, amount, true);
+ }
+ }
+ }
+ return true;
+ }
+
+ private boolean collectFluidBlock(ItemStack stack, EntityPlayer player, World world, int x, int y, int z) {
+ Block block = world.getBlock(x, y, z);
+ if (block instanceof IFluidBlock liquid) {
+ if (liquid.canDrain(world, x, y, z)) {
+ FluidStack fluid = liquid.drain(world, x, y, z, false);
+ int amount = fillContainerStack(stack, player, fluid, true);
+ if (amount == fluid.amount) {
+ fillContainerStack(stack, player, fluid, false);
+ liquid.drain(world, x, y, z, true);
+ return true;
+ }
+ }
+ } else if (world.getBlockMetadata(x, y, z) == 0) {
+ FluidStack fluid = null;
+ if (block != Blocks.water && block != Blocks.flowing_water) {
+ if (block == Blocks.lava || block == Blocks.flowing_lava) {
+ fluid = new FluidStack(FluidRegistry.LAVA, 1000);
+ }
+ } else {
+ fluid = new FluidStack(FluidRegistry.WATER, 1000);
+ }
+
+ if (fluid != null) {
+ int amount = fillContainerStack(stack, player, fluid, true);
+ if (amount == fluid.amount) {
+ fillContainerStack(stack, player, fluid, false);
+ world.setBlockToAir(x, y, z);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public ModularWindow createWindow(UIBuildContext buildContext, ItemStack stack) {
+ if (!(stack.getItem() instanceof GT_VolumetricFlask)) return null;
+ return new VolumetricFlaskUIFactory(buildContext, stack).createWindow();
+ }
+
+ private class VolumetricFlaskUIFactory {
+
+ private final UIBuildContext buildContext;
+ private int capacity;
+ private final int maxCapacity;
+
+ public VolumetricFlaskUIFactory(UIBuildContext buildContext, ItemStack flask) {
+ this.buildContext = buildContext;
+ GT_VolumetricFlask flaskItem = (GT_VolumetricFlask) flask.getItem();
+ this.capacity = flaskItem.getCapacity(flask);
+ this.maxCapacity = flaskItem.getMaxCapacity();
+ }
+
+ public ModularWindow createWindow() {
+ ModularWindow.Builder builder = ModularWindow.builder(150, 54);
+ builder.setBackground(ModularUITextures.VANILLA_BACKGROUND);
+
+ NumericWidget capacityWidget = new NumericWidget();
+ builder.widget(
+ capacityWidget.setGetter(() -> capacity)
+ .setSetter(value -> setCapacity(getCurrentItem(), capacity = (int) value))
+ .setBounds(1, maxCapacity)
+ .setScrollValues(1, 144, 1000)
+ .setDefaultValue(capacity)
+ .setTextColor(Color.WHITE.dark(1))
+ .setTextAlignment(Alignment.CenterLeft)
+ .setFocusOnGuiOpen(true)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2))
+ .setPos(8, 8)
+ .setSize(77, 12))
+ .widget(new TextWidget("Capacity").setPos(88, 10))
+ .widget(
+ new VanillaButtonWidget().setDisplayString("Confirm")
+ .setOnClick((clickData, widget) -> {
+ capacityWidget.onRemoveFocus();
+ if (!widget.isClient()) {
+ widget.getWindow()
+ .tryClose();
+ }
+ })
+ .setPos(8, 26)
+ .setSize(48, 20));
+
+ return builder.build();
+ }
+
+ private ItemStack getCurrentItem() {
+ return buildContext.getPlayer().inventory.getCurrentItem();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/items/ItemComb.java b/src/main/java/gregtech/common/items/ItemComb.java
new file mode 100644
index 0000000000..8fd37fd0d9
--- /dev/null
+++ b/src/main/java/gregtech/common/items/ItemComb.java
@@ -0,0 +1,1908 @@
+package gregtech.common.items;
+
+import static gregtech.api.enums.GT_Values.L;
+import static gregtech.api.enums.GT_Values.NF;
+import static gregtech.api.enums.GT_Values.NI;
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.Mods.AE2FluidCraft;
+import static gregtech.api.enums.Mods.ExtraUtilities;
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.MagicBees;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.enums.Mods.ThaumicBases;
+import static gregtech.api.recipe.RecipeMaps.autoclaveRecipes;
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.CLEANROOM;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+import forestry.api.recipes.RecipeManagers;
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.render.items.GT_GeneratedMaterial_Renderer;
+import gregtech.loaders.misc.GT_Bees;
+
+public class ItemComb extends Item implements IGT_ItemWithMaterialRenderer {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public ItemComb() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gt.comb");
+ GameRegistry.registerItem(this, "gt.comb", GregTech.ID);
+ }
+
+ public ItemStack getStackForType(CombType type) {
+ return new ItemStack(this, 1, type.getId());
+ }
+
+ public ItemStack getStackForType(CombType type, int count) {
+ return new ItemStack(this, count, type.getId());
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List<ItemStack> list) {
+ for (CombType type : CombType.values()) {
+ if (type.showInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public int getRenderPasses(int meta) {
+ return 2;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister iconRegister) {
+ this.itemIcon = iconRegister.registerIcon("forestry:beeCombs.0");
+ this.secondIcon = iconRegister.registerIcon("forestry:beeCombs.1");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ CombType type = CombType.valueOf(stack.getItemDamage());
+ return type.getColours()[GT_Utility.clamp(pass, 0, 1)];
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return CombType.valueOf(stack.getItemDamage())
+ .getName();
+ }
+
+ @Override
+ public void addInformation(ItemStack stack, EntityPlayer player, List<String> tooltip, boolean debugInfo) {
+ tooltip.add(EnumChatFormatting.DARK_RED + "Forestry can't process it");
+ }
+
+ @Override
+ public boolean shouldUseCustomRenderer(int aMetaData) {
+ return CombType.valueOf(aMetaData).material.renderer != null;
+ }
+
+ @Override
+ public GT_GeneratedMaterial_Renderer getMaterialRenderer(int aMetaData) {
+ return CombType.valueOf(aMetaData).material.renderer;
+ }
+
+ @Override
+ public boolean allowMaterialRenderer(int aMetaData) {
+ return true;
+ }
+
+ @Override
+ public IIcon getIcon(int aMetaData, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @Override
+ public IIcon getOverlayIcon(int aMetaData, int pass) {
+ return null;
+ }
+
+ @Override
+ public short[] getRGBa(ItemStack aStack) {
+ return CombType.valueOf(aStack.getItemDamage()).material.mRGBa;
+ }
+
+ public void initCombsRecipes() {
+
+ // Organic
+ addProcessGT(CombType.LIGNIE, new Materials[] { Materials.Lignite }, Voltage.LV);
+ addProcessGT(CombType.COAL, new Materials[] { Materials.Coal }, Voltage.LV);
+ addCentrifugeToItemStack(
+ CombType.STICKY,
+ new ItemStack[] { ItemList.IC2_Resin.get(1), ItemList.IC2_Plantball.get(1), ItemList.FR_Wax.get(1) },
+ new int[] { 50 * 100, 15 * 100, 50 * 100 },
+ Voltage.ULV);
+ addProcessGT(CombType.OIL, new Materials[] { Materials.Oilsands }, Voltage.LV);
+ addProcessGT(CombType.APATITE, new Materials[] { Materials.Apatite }, Voltage.LV);
+ addCentrifugeToMaterial(
+ CombType.ASH,
+ new Materials[] { Materials.DarkAsh, Materials.Ash },
+ new int[] { 50 * 100, 50 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 50 * 100);
+ addCentrifugeToItemStack(
+ CombType.PHOSPHORUS,
+ new ItemStack[] { Materials.Phosphorus.getDust(1), Materials.TricalciumPhosphate.getDust(2),
+ ItemList.FR_Wax.get(1) },
+ new int[] { 100 * 100, 100 * 100, 100 * 100 },
+ Voltage.HV);
+ addCentrifugeToItemStack(
+ CombType.MICA,
+ new ItemStack[] { Materials.Mica.getDust(2), ItemList.FR_Wax.get(1) },
+ new int[] { 100 * 100, 75 * 100 },
+ Voltage.HV);
+ if (GT_Mod.gregtechproxy.mNerfedCombs) {
+ addCentrifugeToItemStack(
+ CombType.LIGNIE,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Lignite, 1),
+ ItemList.FR_Wax.get(1) },
+ new int[] { 90 * 100, 50 * 100 },
+ Voltage.ULV);
+ addCentrifugeToItemStack(
+ CombType.COAL,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 1),
+ ItemList.FR_Wax.get(1) },
+ new int[] { 5 * 100, 50 * 100 },
+ Voltage.ULV);
+ addCentrifugeToItemStack(
+ CombType.OIL,
+ new ItemStack[] { ItemList.Crop_Drop_OilBerry.get(6), GT_Bees.drop.getStackForType(DropType.OIL),
+ ItemList.FR_Wax.get(1) },
+ new int[] { 100 * 100, 100 * 100, 50 * 100 },
+ Voltage.ULV);
+ } else {
+ addCentrifugeToItemStack(
+ CombType.LIGNIE,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Lignite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lignite, 1), ItemList.FR_Wax.get(1) },
+ new int[] { 90 * 100, 100 * 100, 50 * 100 },
+ Voltage.ULV);
+ addCentrifugeToItemStack(
+ CombType.COAL,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Coal, 1), ItemList.FR_Wax.get(1) },
+ new int[] { 5 * 100, 100 * 100, 50 * 100 },
+ Voltage.ULV);
+ addCentrifugeToItemStack(
+ CombType.OIL,
+ new ItemStack[] { ItemList.Crop_Drop_OilBerry.get(6), GT_Bees.drop.getStackForType(DropType.OIL),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Oilsands, 1), ItemList.FR_Wax.get(1) },
+ new int[] { 100 * 100, 100 * 100, 100 * 100, 50 * 100 },
+ Voltage.ULV);
+ addCentrifugeToMaterial(
+ CombType.APATITE,
+ new Materials[] { Materials.Apatite, Materials.Phosphate },
+ new int[] { 100 * 100, 80 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ }
+ // ic2
+ addCentrifugeToItemStack(
+ CombType.COOLANT,
+ new ItemStack[] { GT_Bees.drop.getStackForType(DropType.COOLANT), ItemList.FR_Wax.get(1) },
+ new int[] { 100 * 100, 100 * 100 },
+ Voltage.HV,
+ 196);
+ addCentrifugeToItemStack(
+ CombType.ENERGY,
+ new ItemStack[] { GT_Bees.drop.getStackForType(DropType.HOT_COOLANT), ItemList.IC2_Energium_Dust.get(1L),
+ ItemList.FR_RefractoryWax.get(1) },
+ new int[] { 20 * 100, 20 * 100, 50 * 100 },
+ Voltage.HV,
+ 196);
+ addCentrifugeToItemStack(
+ CombType.LAPOTRON,
+ new ItemStack[] { GT_Bees.drop.getStackForType(DropType.LAPIS),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.LapotronDust", 1, 0),
+ GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 2) },
+ new int[] { 20 * 100, 100 * 100, 40 * 100 },
+ Voltage.HV,
+ 240);
+ addCentrifugeToMaterial(
+ CombType.PYROTHEUM,
+ new Materials[] { Materials.Blaze, Materials.Pyrotheum },
+ new int[] { 25 * 100, 20 * 100 },
+ new int[] {},
+ Voltage.HV,
+ NI,
+ 30 * 100);
+ addCentrifugeToItemStack(
+ CombType.CRYOTHEUM,
+ new ItemStack[] { ItemList.FR_RefractoryWax.get(1), Materials.Cryotheum.getDust(1) },
+ new int[] { 50 * 100, 100 * 100 },
+ Voltage.MV);
+ addCentrifugeToItemStack(
+ CombType.BLIZZ,
+ new ItemStack[] { ItemList.FR_RefractoryWax.get(1), Materials.Blizz.getDust(1) },
+ new int[] { 50 * 100, 100 * 100 },
+ Voltage.MV);
+ // Alloy
+ addProcessGT(CombType.REDALLOY, new Materials[] { Materials.RedAlloy }, Voltage.LV);
+ addProcessGT(CombType.REDSTONEALLOY, new Materials[] { Materials.RedstoneAlloy }, Voltage.LV);
+ addProcessGT(CombType.CONDUCTIVEIRON, new Materials[] { Materials.ConductiveIron }, Voltage.MV);
+ addProcessGT(CombType.VIBRANTALLOY, new Materials[] { Materials.VibrantAlloy }, Voltage.HV);
+ addProcessGT(CombType.ENERGETICALLOY, new Materials[] { Materials.EnergeticAlloy }, Voltage.HV);
+ addProcessGT(CombType.ELECTRICALSTEEL, new Materials[] { Materials.ElectricalSteel }, Voltage.LV);
+ addProcessGT(CombType.DARKSTEEL, new Materials[] { Materials.DarkSteel }, Voltage.MV);
+ addProcessGT(CombType.PULSATINGIRON, new Materials[] { Materials.PulsatingIron }, Voltage.HV);
+ addProcessGT(CombType.STAINLESSSTEEL, new Materials[] { Materials.StainlessSteel }, Voltage.HV);
+ addProcessGT(CombType.BEDROCKIUM, new Materials[] { Materials.Bedrockium }, Voltage.EV);
+ addCentrifugeToItemStack(
+ CombType.ENDERIUM,
+ new ItemStack[] { ItemList.FR_RefractoryWax.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.EnderiumBase, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Enderium, 1) },
+ new int[] { 50 * 100, 30 * 100, 50 * 100 },
+ Voltage.HV);
+ if (GT_Mod.gregtechproxy.mNerfedCombs) {
+ addCentrifugeToMaterial(
+ CombType.REDALLOY,
+ new Materials[] { Materials.RedAlloy },
+ new int[] { 100 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.REDSTONEALLOY,
+ new Materials[] { Materials.RedstoneAlloy },
+ new int[] { 100 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.CONDUCTIVEIRON,
+ new Materials[] { Materials.ConductiveIron },
+ new int[] { 90 * 100 },
+ new int[] {},
+ Voltage.MV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.VIBRANTALLOY,
+ new Materials[] { Materials.VibrantAlloy },
+ new int[] { 70 * 100 },
+ new int[] {},
+ Voltage.HV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.ENERGETICALLOY,
+ new Materials[] { Materials.EnergeticAlloy },
+ new int[] { 80 * 100 },
+ new int[] {},
+ Voltage.HV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.ELECTRICALSTEEL,
+ new Materials[] { Materials.ElectricalSteel },
+ new int[] { 100 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.DARKSTEEL,
+ new Materials[] { Materials.DarkSteel },
+ new int[] { 100 * 100 },
+ new int[] {},
+ Voltage.MV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.PULSATINGIRON,
+ new Materials[] { Materials.PulsatingIron },
+ new int[] { 80 * 100 },
+ new int[] {},
+ Voltage.HV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.STAINLESSSTEEL,
+ new Materials[] { Materials.StainlessSteel },
+ new int[] { 50 * 100 },
+ new int[] {},
+ Voltage.HV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.BEDROCKIUM,
+ new Materials[] { Materials.Bedrockium },
+ new int[] { 50 * 100 },
+ new int[] {},
+ Voltage.EV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+
+ } else {
+ addCentrifugeToMaterial(
+ CombType.REDALLOY,
+ new Materials[] { Materials.RedAlloy, Materials.Redstone, Materials.Copper },
+ new int[] { 100 * 100, 75 * 100, 90 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.REDSTONEALLOY,
+ new Materials[] { Materials.RedstoneAlloy, Materials.Redstone, Materials.Silicon, Materials.Coal },
+ new int[] { 100 * 100, 90 * 100, 75 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.CONDUCTIVEIRON,
+ new Materials[] { Materials.ConductiveIron, Materials.Silver, Materials.Iron },
+ new int[] { 90 * 100, 55 * 100, 65 * 100 },
+ new int[] {},
+ Voltage.MV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.VIBRANTALLOY,
+ new Materials[] { Materials.VibrantAlloy, Materials.Chrome },
+ new int[] { 70 * 100, 50 * 100 },
+ new int[] {},
+ Voltage.HV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.ENERGETICALLOY,
+ new Materials[] { Materials.EnergeticAlloy, Materials.Gold },
+ new int[] { 80 * 100, 60 * 100 },
+ new int[] {},
+ Voltage.HV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.ELECTRICALSTEEL,
+ new Materials[] { Materials.ElectricalSteel, Materials.Silicon, Materials.Coal },
+ new int[] { 100 * 100, 75 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.DARKSTEEL,
+ new Materials[] { Materials.DarkSteel, Materials.Coal },
+ new int[] { 100 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.MV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.PULSATINGIRON,
+ new Materials[] { Materials.PulsatingIron, Materials.Iron },
+ new int[] { 80 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.HV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.STAINLESSSTEEL,
+ new Materials[] { Materials.StainlessSteel, Materials.Iron, Materials.Chrome, Materials.Manganese,
+ Materials.Nickel },
+ new int[] { 50 * 100, 75 * 100, 55 * 100, 75 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.HV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.BEDROCKIUM,
+ new Materials[] { Materials.Bedrockium },
+ new int[] { 50 * 100 },
+ new int[] {},
+ Voltage.EV,
+ ItemList.FR_RefractoryWax.get(1),
+ 50 * 100);
+ }
+ // Thaumic
+ addProcessGT(CombType.THAUMIUMDUST, new Materials[] { Materials.Thaumium }, Voltage.MV);
+ addCentrifugeToItemStack(
+ CombType.THAUMIUMSHARD,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1, 1),
+ GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1, 2),
+ GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1, 3),
+ GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1, 4),
+ GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1, 5),
+ GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1, 6),
+ GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0) },
+ new int[] { 20 * 100, 20 * 100, 20 * 100, 20 * 100, 20 * 100, 20 * 100, 50 * 100 },
+ Voltage.ULV);
+ addProcessGT(CombType.AMBER, new Materials[] { Materials.Amber }, Voltage.LV);
+ addProcessGT(CombType.QUICKSILVER, new Materials[] { Materials.Cinnabar }, Voltage.LV);
+ addCentrifugeToItemStack(
+ CombType.SALISMUNDUS,
+ new ItemStack[] { GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1, 14),
+ GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0) },
+ new int[] { 100 * 100, 50 * 100 },
+ Voltage.MV);
+ addCentrifugeToItemStack(
+ CombType.TAINTED,
+ new ItemStack[] { GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1, 11),
+ GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1, 12),
+ GT_ModHandler.getModItem(Thaumcraft.ID, "blockTaintFibres", 1, 0),
+ GT_ModHandler.getModItem(Thaumcraft.ID, "blockTaintFibres", 1, 1),
+ GT_ModHandler.getModItem(Thaumcraft.ID, "blockTaintFibres", 1, 2),
+ GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0) },
+ new int[] { 15 * 100, 15 * 100, 15 * 100, 15 * 100, 15 * 100, 50 * 100 },
+ Voltage.ULV);
+ addProcessGT(CombType.MITHRIL, new Materials[] { Materials.Mithril }, Voltage.HV);
+ addProcessGT(CombType.ASTRALSILVER, new Materials[] { Materials.AstralSilver }, Voltage.HV);
+ addCentrifugeToMaterial(
+ CombType.ASTRALSILVER,
+ new Materials[] { Materials.AstralSilver, Materials.Silver },
+ new int[] { 20 * 100, (GT_Mod.gregtechproxy.mNerfedCombs ? 10 : 75) * 100 },
+ new int[] {},
+ Voltage.HV,
+ GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0),
+ 50 * 100);
+ addCentrifugeToItemStack(
+ CombType.THAUMINITE,
+ new ItemStack[] { GT_ModHandler.getModItem(ThaumicBases.ID, "resource", 1, 0),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Thaumium, 1),
+ GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0) },
+ new int[] { 20 * 100, 10 * 100, 50 * 100 },
+ Voltage.HV);
+ addProcessGT(CombType.SHADOWMETAL, new Materials[] { Materials.Shadow }, Voltage.HV);
+ addCentrifugeToMaterial(
+ CombType.SHADOWMETAL,
+ new Materials[] { Materials.Shadow, Materials.ShadowSteel },
+ new int[] { (GT_Mod.gregtechproxy.mNerfedCombs ? 20 : 75) * 100, 10 * 100 },
+ new int[] {},
+ Voltage.HV,
+ GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0),
+ 50 * 100);
+ addProcessGT(CombType.DIVIDED, new Materials[] { Materials.Diamond }, Voltage.HV);
+ addCentrifugeToItemStack(
+ CombType.DIVIDED,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0),
+ GT_ModHandler.getModItem(ExtraUtilities.ID, "unstableingot", 1, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Iron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Diamond, 1) },
+ new int[] { 50 * 100, 20 * 100, (GT_Mod.gregtechproxy.mNerfedCombs ? 10 : 75) * 100,
+ (GT_Mod.gregtechproxy.mNerfedCombs ? 5 : 55) * 100 },
+ Voltage.HV);
+ addProcessGT(CombType.SPARKELING, new Materials[] { Materials.NetherStar }, Voltage.EV);
+ addCentrifugeToItemStack(
+ CombType.SPARKELING,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0),
+ GT_ModHandler.getModItem(MagicBees.ID, "miscResources", 2, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.NetherStar, 1) },
+ new int[] { 50 * 100, 10 * 100, (GT_Mod.gregtechproxy.mNerfedCombs ? 10 : 50) * 100 },
+ Voltage.EV);
+ if (GT_Mod.gregtechproxy.mNerfedCombs) {
+ addCentrifugeToMaterial(
+ CombType.THAUMIUMDUST,
+ new Materials[] { Materials.Thaumium },
+ new int[] { 100 * 100 },
+ new int[] {},
+ Voltage.MV,
+ GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0),
+ 50 * 100);
+ addCentrifugeToItemStack(
+ CombType.QUICKSILVER,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0),
+ GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNugget", 1, 5) },
+ new int[] { 50 * 100, 100 * 100 },
+ Voltage.ULV);
+ } else {
+ addCentrifugeToMaterial(
+ CombType.THAUMIUMDUST,
+ new Materials[] { Materials.Thaumium, Materials.Iron },
+ new int[] { 100 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.MV,
+ GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0),
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.AMBER,
+ new Materials[] { Materials.Amber },
+ new int[] { 100 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0),
+ 50 * 100);
+ addCentrifugeToItemStack(
+ CombType.QUICKSILVER,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0),
+ GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNugget", 1, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Cinnabar, 1) },
+ new int[] { 50 * 100, 100 * 100, 85 * 100 },
+ Voltage.ULV);
+ addCentrifugeToMaterial(
+ CombType.MITHRIL,
+ new Materials[] { Materials.Mithril, Materials.Platinum },
+ new int[] { 75 * 100, 55 * 100 },
+ new int[] {},
+ Voltage.HV,
+ GT_ModHandler.getModItem(MagicBees.ID, "wax", 1, 0),
+ 50 * 100);
+ }
+
+ // Gem Line
+ addProcessGT(CombType.STONE, new Materials[] { Materials.Soapstone }, Voltage.LV);
+ addProcessGT(CombType.CERTUS, new Materials[] { Materials.CertusQuartz }, Voltage.LV);
+ addProcessGT(CombType.FLUIX, new Materials[] { Materials.Fluix }, Voltage.LV);
+ addProcessGT(CombType.REDSTONE, new Materials[] { Materials.Redstone }, Voltage.LV);
+ addCentrifugeToMaterial(
+ CombType.RAREEARTH,
+ new Materials[] { Materials.RareEarth },
+ new int[] { 100 * 100 },
+ new int[] { 1 },
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addProcessGT(CombType.LAPIS, new Materials[] { Materials.Lapis }, Voltage.LV);
+ addProcessGT(CombType.RUBY, new Materials[] { Materials.Ruby }, Voltage.LV);
+ addProcessGT(CombType.REDGARNET, new Materials[] { Materials.GarnetRed }, Voltage.LV);
+ addProcessGT(CombType.YELLOWGARNET, new Materials[] { Materials.GarnetYellow }, Voltage.LV);
+ addProcessGT(CombType.SAPPHIRE, new Materials[] { Materials.Sapphire }, Voltage.LV);
+ addProcessGT(CombType.DIAMOND, new Materials[] { Materials.Diamond }, Voltage.LV);
+ addProcessGT(CombType.OLIVINE, new Materials[] { Materials.Olivine }, Voltage.LV);
+ addProcessGT(CombType.EMERALD, new Materials[] { Materials.Emerald }, Voltage.LV);
+ addProcessGT(CombType.FIRESTONE, new Materials[] { Materials.Firestone }, Voltage.LV);
+ addProcessGT(CombType.PYROPE, new Materials[] { Materials.Pyrope }, Voltage.LV);
+ addProcessGT(CombType.GROSSULAR, new Materials[] { Materials.Grossular }, Voltage.LV);
+ if (GT_Mod.gregtechproxy.mNerfedCombs) {
+ addCentrifugeToMaterial(
+ CombType.STONE,
+ new Materials[] { Materials.Stone, Materials.GraniteBlack, Materials.GraniteRed, Materials.Basalt,
+ Materials.Marble, Materials.Redrock },
+ new int[] { 70 * 100, 50 * 100, 50 * 100, 50 * 100, 50 * 100, 50 * 100 },
+ new int[] { 9, 9, 9, 9, 9, 9 },
+ Voltage.ULV,
+ NI,
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.FLUIX,
+ new Materials[] { Materials.Fluix },
+ new int[] { 25 * 100 },
+ new int[] { 9 },
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ } else {
+ addCentrifugeToMaterial(
+ CombType.STONE,
+ new Materials[] { Materials.Soapstone, Materials.Talc, Materials.Apatite, Materials.Phosphate,
+ Materials.TricalciumPhosphate },
+ new int[] { 95 * 100, 90 * 100, 80 * 100, 75 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.CERTUS,
+ new Materials[] { Materials.CertusQuartz, Materials.Quartzite, Materials.Barite },
+ new int[] { 100 * 100, 80 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 50 * 100);
+ addCentrifugeToMaterial(
+ CombType.FLUIX,
+ new Materials[] { Materials.Fluix, Materials.Redstone, Materials.CertusQuartz, Materials.NetherQuartz },
+ new int[] { 25 * 100, 90 * 100, 90 * 100, 90 * 100 },
+ new int[] { 9, 1, 1, 1 },
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.REDSTONE,
+ new Materials[] { Materials.Redstone, Materials.Cinnabar },
+ new int[] { 100 * 100, 80 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.LAPIS,
+ new Materials[] { Materials.Lapis, Materials.Sodalite, Materials.Lazurite, Materials.Calcite },
+ new int[] { 100 * 100, 90 * 100, 90 * 100, 85 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.RUBY,
+ new Materials[] { Materials.Ruby, Materials.Redstone },
+ new int[] { 100 * 100, 90 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.REDGARNET,
+ new Materials[] { Materials.GarnetRed, Materials.GarnetYellow },
+ new int[] { 100 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.YELLOWGARNET,
+ new Materials[] { Materials.GarnetYellow, Materials.GarnetRed },
+ new int[] { 100 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.SAPPHIRE,
+ new Materials[] { Materials.Sapphire, Materials.GreenSapphire, Materials.Almandine, Materials.Pyrope },
+ new int[] { 100 * 100, 90 * 100, 90 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.DIAMOND,
+ new Materials[] { Materials.Diamond, Materials.Graphite },
+ new int[] { 100 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.OLIVINE,
+ new Materials[] { Materials.Olivine, Materials.Bentonite, Materials.Magnesite, Materials.Glauconite },
+ new int[] { 100 * 100, 90 * 100, 80 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.EMERALD,
+ new Materials[] { Materials.Emerald, Materials.Beryllium, Materials.Thorium },
+ new int[] { 100 * 100, 85 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.FIRESTONE,
+ new Materials[] { Materials.Firestone },
+ new int[] { 100 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ ItemList.FR_RefractoryWax.get(1),
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.PYROPE,
+ new Materials[] { Materials.Pyrope, Materials.Aluminium, Materials.Magnesium, Materials.Silicon },
+ new int[] { 100 * 100, 75 * 100, 80 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.GROSSULAR,
+ new Materials[] { Materials.Grossular, Materials.Aluminium, Materials.Silicon },
+ new int[] { 100 * 100, 75 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ }
+
+ // Metals Line
+ addProcessGT(CombType.SLAG, new Materials[] { Materials.Limestone }, Voltage.LV);
+ addProcessGT(CombType.COPPER, new Materials[] { Materials.Copper }, Voltage.LV);
+ addProcessGT(CombType.TIN, new Materials[] { Materials.Tin }, Voltage.LV);
+ addProcessGT(CombType.LEAD, new Materials[] { Materials.Lead }, Voltage.LV);
+ addProcessGT(CombType.INDIUM, new Materials[] { Materials.Indium }, Voltage.ZPM);
+ addProcessGT(CombType.NICKEL, new Materials[] { Materials.Nickel }, Voltage.LV);
+ addProcessGT(CombType.ZINC, new Materials[] { Materials.Zinc }, Voltage.LV);
+ addProcessGT(CombType.SILVER, new Materials[] { Materials.Silver }, Voltage.LV);
+ addProcessGT(CombType.CRYOLITE, new Materials[] { Materials.Cryolite }, Voltage.LV);
+ addProcessGT(CombType.GOLD, new Materials[] { Materials.Gold }, Voltage.LV);
+ addProcessGT(CombType.SULFUR, new Materials[] { Materials.Sulfur }, Voltage.LV);
+ addProcessGT(CombType.GALLIUM, new Materials[] { Materials.Gallium }, Voltage.LV);
+ addProcessGT(CombType.ARSENIC, new Materials[] { Materials.Arsenic }, Voltage.LV);
+ addProcessGT(CombType.IRON, new Materials[] { Materials.Iron }, Voltage.LV);
+ addProcessGT(CombType.STEEL, new Materials[] { Materials.Steel }, Voltage.LV);
+ if (GT_Mod.gregtechproxy.mNerfedCombs) {
+ addCentrifugeToMaterial(
+ CombType.SLAG,
+ new Materials[] { Materials.Stone, Materials.GraniteBlack, Materials.GraniteRed },
+ new int[] { 50 * 100, 20 * 100, 20 * 100 },
+ new int[] { 9, 9, 9 },
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.COPPER,
+ new Materials[] { Materials.Copper },
+ new int[] { 70 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.TIN,
+ new Materials[] { Materials.Tin },
+ new int[] { 60 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.LEAD,
+ new Materials[] { Materials.Lead },
+ new int[] { 45 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.IRON,
+ new Materials[] { Materials.Iron },
+ new int[] { 30 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.STEEL,
+ new Materials[] { Materials.Steel },
+ new int[] { 40 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.SILVER,
+ new Materials[] { Materials.Silver },
+ new int[] { 80 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.CRYOLITE,
+ new Materials[] { Materials.Cryolite },
+ new int[] { 80 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.SULFUR,
+ new Materials[] { Materials.Sulfur },
+ new int[] { 100 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ } else {
+ addCentrifugeToMaterial(
+ CombType.SLAG,
+ new Materials[] { Materials.Salt, Materials.RockSalt, Materials.Lepidolite, Materials.Spodumene,
+ Materials.Monazite },
+ new int[] { 100 * 100, 100 * 100, 100 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.COPPER,
+ new Materials[] { Materials.Copper, Materials.Tetrahedrite, Materials.Chalcopyrite, Materials.Malachite,
+ Materials.Pyrite, Materials.Stibnite },
+ new int[] { 100 * 100, 85 * 100, 95 * 100, 80 * 100, 75 * 100, 65 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.TIN,
+ new Materials[] { Materials.Tin, Materials.Cassiterite, Materials.CassiteriteSand },
+ new int[] { 100 * 100, 85 * 100, 65 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.LEAD,
+ new Materials[] { Materials.Lead, Materials.Galena },
+ new int[] { 100 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+
+ addCentrifugeToMaterial(
+ CombType.IRON,
+ new Materials[] { Materials.Iron, Materials.Magnetite, Materials.BrownLimonite,
+ Materials.YellowLimonite, Materials.VanadiumMagnetite, Materials.MeteoricIron },
+ new int[] { 100 * 100, 90 * 100, 85 * 100, 85 * 100, 80 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.LEAD,
+ new Materials[] { Materials.Steel, Materials.Magnetite, Materials.VanadiumMagnetite,
+ Materials.Molybdenite, Materials.Molybdenum, Materials.MeteoricIron },
+ new int[] { 100 * 100, 90 * 100, 80 * 100, 65 * 100, 65 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+
+ addCentrifugeToMaterial(
+ CombType.NICKEL,
+ new Materials[] { Materials.Nickel, Materials.Garnierite, Materials.Pentlandite, Materials.Cobaltite,
+ Materials.Wulfenite, Materials.Powellite },
+ new int[] { 100 * 100, 85 * 100, 85 * 100, 80 * 100, 75 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.ZINC,
+ new Materials[] { Materials.Zinc, Materials.Sphalerite, Materials.Sulfur },
+ new int[] { 100 * 100, 80 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.SILVER,
+ new Materials[] { Materials.Silver, Materials.Galena },
+ new int[] { 100 * 100, 80 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.CRYOLITE,
+ new Materials[] { Materials.Cryolite, Materials.Silver },
+ new int[] { 100 * 100, 80 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.GOLD,
+ new Materials[] { Materials.Gold },
+ new int[] { 100 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.SULFUR,
+ new Materials[] { Materials.Sulfur, Materials.Pyrite, Materials.Sphalerite },
+ new int[] { 100 * 100, 90 * 100, 80 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.GALLIUM,
+ new Materials[] { Materials.Gallium, Materials.Niobium },
+ new int[] { 80 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.ARSENIC,
+ new Materials[] { Materials.Arsenic, Materials.Bismuth, Materials.Antimony },
+ new int[] { 80 * 100, 70 * 100, 70 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ }
+
+ // Rare Metals Line
+ addProcessGT(CombType.BAUXITE, new Materials[] { Materials.Bauxite }, Voltage.LV);
+ addProcessGT(CombType.ALUMINIUM, new Materials[] { Materials.Aluminium }, Voltage.LV);
+ addProcessGT(CombType.MANGANESE, new Materials[] { Materials.Manganese }, Voltage.LV);
+ addProcessGT(CombType.TITANIUM, new Materials[] { Materials.Titanium }, Voltage.EV);
+ addProcessGT(CombType.MAGNESIUM, new Materials[] { Materials.Magnesium }, Voltage.LV);
+ addProcessGT(CombType.CHROME, new Materials[] { Materials.Chrome }, Voltage.HV);
+ addProcessGT(CombType.TUNGSTEN, new Materials[] { Materials.Tungsten }, Voltage.IV);
+ addProcessGT(CombType.PLATINUM, new Materials[] { Materials.Platinum }, Voltage.HV);
+ addProcessGT(CombType.MOLYBDENUM, new Materials[] { Materials.Molybdenum }, Voltage.LV);
+ addProcessGT(CombType.IRIDIUM, new Materials[] { Materials.Iridium }, Voltage.IV);
+ addProcessGT(CombType.PALLADIUM, new Materials[] { Materials.Palladium }, Voltage.IV);
+ addProcessGT(CombType.OSMIUM, new Materials[] { Materials.Osmium }, Voltage.IV);
+ addProcessGT(CombType.LITHIUM, new Materials[] { Materials.Lithium }, Voltage.MV);
+ addProcessGT(CombType.ELECTROTINE, new Materials[] { Materials.Electrotine }, Voltage.MV);
+ addProcessGT(CombType.DRACONIC, new Materials[] { Materials.Draconium }, Voltage.IV);
+ addProcessGT(CombType.AWAKENEDDRACONIUM, new Materials[] { Materials.DraconiumAwakened }, Voltage.ZPM);
+ if (GT_Mod.gregtechproxy.mNerfedCombs) {
+ addCentrifugeToItemStack(
+ CombType.SALT,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 6),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RockSalt, 6), ItemList.FR_Wax.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 6) },
+ new int[] { 100 * 100, 100 * 100, 50 * 100, 25 * 100 },
+ Voltage.MV,
+ 160);
+ } else {
+ addCentrifugeToMaterial(
+ CombType.BAUXITE,
+ new Materials[] { Materials.Bauxite, Materials.Aluminium },
+ new int[] { 75 * 100, 55 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.ALUMINIUM,
+ new Materials[] { Materials.Aluminium, Materials.Bauxite },
+ new int[] { 60 * 100, 80 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.MANGANESE,
+ new Materials[] { Materials.Manganese, Materials.Grossular, Materials.Spessartine, Materials.Pyrolusite,
+ Materials.Tantalite },
+ new int[] { 30 * 100, 100 * 100, 100 * 100, 100 * 100, 100 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.TITANIUM,
+ new Materials[] { Materials.Titanium, Materials.Ilmenite, Materials.Bauxite, Materials.Rutile },
+ new int[] { 90 * 100, 80 * 100, 75 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.EV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.MAGNESIUM,
+ new Materials[] { Materials.Magnesium, Materials.Magnesite },
+ new int[] { 100 * 100, 80 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.CHROME,
+ new Materials[] { Materials.Chrome, Materials.Ruby, Materials.Chromite, Materials.Redstone,
+ Materials.Neodymium, Materials.Bastnasite },
+ new int[] { 50 * 100, 100 * 100, 50 * 100, 100 * 100, 80 * 100, 80 * 100 },
+ new int[] {},
+ Voltage.HV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.TUNGSTEN,
+ new Materials[] { Materials.Tungsten, Materials.Tungstate, Materials.Scheelite, Materials.Lithium },
+ new int[] { 50 * 100, 80 * 100, 75 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.IV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.PLATINUM,
+ new Materials[] { Materials.Platinum, Materials.Cooperite, Materials.Palladium },
+ new int[] { 40 * 100, 40 * 100, 40 * 100 },
+ new int[] {},
+ Voltage.HV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.MOLYBDENUM,
+ new Materials[] { Materials.Molybdenum, Materials.Molybdenite, Materials.Powellite,
+ Materials.Wulfenite },
+ new int[] { 100 * 100, 80 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.IRIDIUM,
+ new Materials[] { Materials.Iridium, Materials.Osmium },
+ new int[] { 20 * 100, 15 * 100 },
+ new int[] {},
+ Voltage.IV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.OSMIUM,
+ new Materials[] { Materials.Osmium, Materials.Iridium },
+ new int[] { 25 * 100, 15 * 100 },
+ new int[] {},
+ Voltage.IV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.LITHIUM,
+ new Materials[] { Materials.Lithium, Materials.Aluminium },
+ new int[] { 85 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.MV,
+ NI,
+ 30 * 100);
+ addCentrifugeToItemStack(
+ CombType.SALT,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 6),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RockSalt, 6), ItemList.FR_Wax.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 6) },
+ new int[] { 100 * 100, 100 * 100, 50 * 100, 25 * 100 },
+ Voltage.MV,
+ 160);
+ }
+
+ // Radioactive Line
+ addProcessGT(CombType.ALMANDINE, new Materials[] { Materials.Almandine }, Voltage.LV);
+ addProcessGT(CombType.URANIUM, new Materials[] { Materials.Uranium }, Voltage.EV);
+ addProcessGT(CombType.PLUTONIUM, new Materials[] { Materials.Plutonium }, Voltage.EV);
+ addProcessGT(CombType.NAQUADAH, new Materials[] { Materials.Naquadah }, Voltage.IV);
+ addProcessGT(CombType.NAQUADRIA, new Materials[] { Materials.Naquadria }, Voltage.LuV);
+ addProcessGT(CombType.THORIUM, new Materials[] { Materials.Thorium }, Voltage.EV);
+ addProcessGT(CombType.LUTETIUM, new Materials[] { Materials.Lutetium }, Voltage.IV);
+ addProcessGT(CombType.AMERICIUM, new Materials[] { Materials.Americium }, Voltage.LuV);
+ addProcessGT(CombType.NEUTRONIUM, new Materials[] { Materials.Neutronium }, Voltage.UHV);
+ if (!GT_Mod.gregtechproxy.mNerfedCombs) {
+ addCentrifugeToMaterial(
+ CombType.ALMANDINE,
+ new Materials[] { Materials.Almandine, Materials.Pyrope, Materials.Sapphire, Materials.GreenSapphire },
+ new int[] { 90 * 100, 80 * 100, 75 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.ULV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.URANIUM,
+ new Materials[] { Materials.Uranium, Materials.Pitchblende, Materials.Uraninite, Materials.Uranium235 },
+ new int[] { 50 * 100, 65 * 100, 75 * 100, 50 * 100 },
+ new int[] {},
+ Voltage.EV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.PLUTONIUM,
+ new Materials[] { Materials.Plutonium, Materials.Uranium235 },
+ new int[] { 10, 5 },
+ new int[] {},
+ Voltage.EV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.NAQUADAH,
+ new Materials[] { Materials.Naquadah, Materials.NaquadahEnriched, Materials.Naquadria },
+ new int[] { 10 * 100, 5 * 100, 5 * 100 },
+ new int[] {},
+ Voltage.IV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.NAQUADRIA,
+ new Materials[] { Materials.Naquadria, Materials.NaquadahEnriched, Materials.Naquadah },
+ new int[] { 10 * 100, 10 * 100, 15 * 100 },
+ new int[] {},
+ Voltage.LuV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.THORIUM,
+ new Materials[] { Materials.Thorium, Materials.Uranium, Materials.Coal },
+ new int[] { 75 * 100, 75 * 100 * 100, 95 * 100 },
+ new int[] {},
+ Voltage.EV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.LUTETIUM,
+ new Materials[] { Materials.Lutetium, Materials.Thorium },
+ new int[] { 35 * 100, 55 * 100 },
+ new int[] {},
+ Voltage.IV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.AMERICIUM,
+ new Materials[] { Materials.Americium, Materials.Lutetium },
+ new int[] { 25 * 100, 45 * 100 },
+ new int[] {},
+ Voltage.LuV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.NEUTRONIUM,
+ new Materials[] { Materials.Neutronium, Materials.Americium },
+ new int[] { 15 * 100, 35 * 100 },
+ new int[] {},
+ Voltage.UHV,
+ NI,
+ 30 * 100);
+ }
+
+ // Twilight
+ addCentrifugeToItemStack(
+ CombType.NAGA,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 4),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.NagaScaleChip", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.NagaScaleFragment", 1L, 0),
+ ItemList.FR_Wax.get(1) },
+ new int[] { 5 * 100, 33 * 100, 8 * 100, 30 * 100 },
+ Voltage.MV);
+ addCentrifugeToItemStack(
+ CombType.LICH,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 5),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.LichBoneChip", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.LichBoneFragment", 1L, 0),
+ ItemList.FR_Wax.get(1) },
+ new int[] { 5 * 100, 33 * 100, 8 * 100, 30 * 100 },
+ Voltage.HV);
+ addCentrifugeToItemStack(
+ CombType.HYDRA,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 1),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.FieryBloodDrop", 1L, 0),
+ GT_Bees.drop.getStackForType(DropType.HYDRA), ItemList.FR_Wax.get(1) },
+ new int[] { 5 * 100, 33 * 100, 8 * 100, 30 * 100 },
+ Voltage.HV);
+ addCentrifugeToItemStack(
+ CombType.URGHAST,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 2),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CarminiteChip", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CarminiteFragment", 1L, 0),
+ ItemList.FR_Wax.get(1) },
+ new int[] { 5 * 100, 33 * 100, 8 * 100, 30 * 100 },
+ Voltage.EV);
+ addCentrifugeToItemStack(
+ CombType.SNOWQUEEN,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 3),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.SnowQueenBloodDrop", 1L, 0),
+ GT_Bees.drop.getStackForType(DropType.SNOW_QUEEN), ItemList.FR_Wax.get(1) },
+ new int[] { 5 * 100, 33 * 100, 8 * 100, 30 * 100 },
+ Voltage.EV);
+
+ // HEE
+ addCentrifugeToItemStack(
+ CombType.ENDDUST,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0),
+ GT_Bees.propolis.getStackForType(PropolisType.End), GT_Bees.drop.getStackForType(DropType.ENDERGOO),
+ Materials.Endstone.getBlocks(4) },
+ new int[] { 20 * 100, 15 * 100, 10 * 100, 100 * 100 },
+ Voltage.HV);
+ addCentrifugeToItemStack(
+ CombType.STARDUST,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0),
+ GT_Bees.propolis.getStackForType(PropolisType.Stardust),
+ GT_Bees.drop.getStackForType(DropType.ENDERGOO) },
+ new int[] { 20 * 100, 15 * 100, 10 * 100 },
+ Voltage.HV);
+ addCentrifugeToItemStack(
+ CombType.ECTOPLASMA,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0),
+ GT_Bees.propolis.getStackForType(PropolisType.Ectoplasma),
+ GT_Bees.drop.getStackForType(DropType.ENDERGOO) },
+ new int[] { 25 * 100, 10 * 100, 15 * 100 },
+ Voltage.EV);
+ addCentrifugeToItemStack(
+ CombType.ARCANESHARD,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0),
+ GT_Bees.propolis.getStackForType(PropolisType.Arcaneshard),
+ GT_Bees.drop.getStackForType(DropType.ENDERGOO) },
+ new int[] { 25 * 100, 10 * 100, 15 * 100 },
+ Voltage.EV);
+ addCentrifugeToItemStack(
+ CombType.DRAGONESSENCE,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0),
+ GT_Bees.propolis.getStackForType(PropolisType.Dragonessence),
+ GT_Bees.drop.getStackForType(DropType.ENDERGOO) },
+ new int[] { 30 * 100, (int) (7.5 * 100), 20 * 100 },
+ Voltage.IV);
+ addCentrifugeToItemStack(
+ CombType.ENDERMAN,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0),
+ GT_Bees.propolis.getStackForType(PropolisType.Enderman),
+ GT_Bees.drop.getStackForType(DropType.ENDERGOO) },
+ new int[] { 3000, 750, 2000 },
+ Voltage.IV);
+ addCentrifugeToItemStack(
+ CombType.SILVERFISH,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0),
+ GT_Bees.propolis.getStackForType(PropolisType.Silverfish),
+ GT_Bees.drop.getStackForType(DropType.ENDERGOO), new ItemStack(Items.spawn_egg, 1, 60) },
+ new int[] { 25 * 100, 10 * 100, 20 * 100, 15 * 100 },
+ Voltage.EV);
+ addProcessGT(CombType.ENDIUM, new Materials[] { Materials.HeeEndium }, Voltage.HV);
+ if (!GT_Mod.gregtechproxy.mNerfedCombs) {
+ addCentrifugeToMaterial(
+ CombType.ENDIUM,
+ new Materials[] { Materials.HeeEndium },
+ new int[] { 50 * 100 },
+ new int[] {},
+ Voltage.HV,
+ GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0),
+ 20 * 100);
+ }
+ addCentrifugeToItemStack(
+ CombType.RUNEI,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfPowerFragment", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfAgilityFragment", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfVigorFragment", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfDefenseFragment", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfMagicFragment", 1L, 0) },
+ new int[] { 25 * 100, 5 * 100, 5 * 100, 5 * 100, 5 * 100, 5 * 100 },
+ Voltage.IV);
+ addCentrifugeToItemStack(
+ CombType.RUNEII,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RuneOfVoidFragment", 1L, 0) },
+ new int[] { 50 * 100, (int) (2.5 * 100) },
+ Voltage.IV);
+ addCentrifugeToItemStack(
+ CombType.FIREESSENSE,
+ new ItemStack[] { GT_ModHandler.getModItem(MagicBees.ID, "wax", 1L, 0),
+ GT_Bees.propolis.getStackForType(PropolisType.Fireessence),
+ GT_Bees.drop.getStackForType(DropType.ENDERGOO) },
+ new int[] { 30 * 100, (int) (7.5 * 100), 20 * 100 },
+ Voltage.IV);
+ // Walrus Recipe
+ if (AE2FluidCraft.isModLoaded()) {
+ addCentrifugeToItemStack(
+ CombType.WALRUS,
+ new ItemStack[] { GT_ModHandler.getModItem(AE2FluidCraft.ID, "walrus", 1L, 0) },
+ new int[] { 100 * 100 },
+ Voltage.LV);
+ }
+ // Space Line
+ addCentrifugeToItemStack(
+ CombType.SPACE,
+ new ItemStack[] { ItemList.FR_Wax.get(1L), ItemList.FR_RefractoryWax.get(1L),
+ GT_Bees.drop.getStackForType(DropType.OXYGEN),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CoinSpace", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100, 15 * 100, 5 * 100 },
+ Voltage.HV);
+ addProcessGT(CombType.METEORICIRON, new Materials[] { Materials.MeteoricIron }, Voltage.HV);
+ addProcessGT(CombType.DESH, new Materials[] { Materials.Desh }, Voltage.EV);
+ addProcessGT(CombType.LEDOX, new Materials[] { Materials.Ledox }, Voltage.EV);
+ addProcessGT(CombType.CALLISTOICE, new Materials[] { Materials.CallistoIce }, Voltage.IV);
+ addProcessGT(CombType.MYTRYL, new Materials[] { Materials.Mytryl }, Voltage.IV);
+ addProcessGT(CombType.QUANTIUM, new Materials[] { Materials.Quantium }, Voltage.IV);
+ addProcessGT(CombType.ORIHARUKON, new Materials[] { Materials.Oriharukon }, Voltage.IV);
+ addProcessGT(CombType.INFUSEDGOLD, new Materials[] { Materials.InfusedGold }, Voltage.IV);
+ addCentrifugeToMaterial(
+ CombType.INFUSEDGOLD,
+ new Materials[] { Materials.InfusedGold, Materials.Gold },
+ new int[] { (GT_Mod.gregtechproxy.mNerfedCombs ? 20 : 50) * 100,
+ (GT_Mod.gregtechproxy.mNerfedCombs ? 10 : 30) * 100 },
+ new int[] {},
+ Voltage.IV,
+ 200,
+ NI,
+ 10 * 100);
+ addProcessGT(CombType.MYSTERIOUSCRYSTAL, new Materials[] { Materials.MysteriousCrystal }, Voltage.LuV);
+ addCentrifugeToMaterial(
+ CombType.MYSTERIOUSCRYSTAL,
+ new Materials[] { Materials.MysteriousCrystal },
+ new int[] { (GT_Mod.gregtechproxy.mNerfedCombs ? 10 : 40) * 100,
+ (GT_Mod.gregtechproxy.mNerfedCombs ? 15 : 50) * 100 },
+ new int[] {},
+ Voltage.LuV,
+ 512,
+ NI,
+ 50 * 100);
+ addProcessGT(CombType.BLACKPLUTONIUM, new Materials[] { Materials.BlackPlutonium }, Voltage.LuV);
+ addProcessGT(CombType.TRINIUM, new Materials[] { Materials.Trinium }, Voltage.ZPM);
+ if (!GT_Mod.gregtechproxy.mNerfedCombs) {
+ addCentrifugeToMaterial(
+ CombType.METEORICIRON,
+ new Materials[] { Materials.MeteoricIron, Materials.Iron },
+ new int[] { 85 * 100, 100 * 100 },
+ new int[] {},
+ Voltage.HV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.DESH,
+ new Materials[] { Materials.Desh, Materials.Titanium },
+ new int[] { 75 * 100, 50 * 100 },
+ new int[] {},
+ Voltage.EV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.LEDOX,
+ new Materials[] { Materials.Ledox, Materials.CallistoIce, Materials.Lead },
+ new int[] { 65 * 100, 55 * 100, 85 * 100 },
+ new int[] {},
+ Voltage.EV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.CALLISTOICE,
+ new Materials[] { Materials.CallistoIce, Materials.Ledox, Materials.Lead },
+ new int[] { 65 * 100, 75 * 100, 100 * 100 },
+ new int[] {},
+ Voltage.IV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.MYTRYL,
+ new Materials[] { Materials.Mytryl, Materials.Mithril },
+ new int[] { 55 * 100, 50 * 100 },
+ new int[] {},
+ Voltage.IV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.QUANTIUM,
+ new Materials[] { Materials.Quantium, Materials.Osmium },
+ new int[] { 50 * 100, 60 * 100 },
+ new int[] {},
+ Voltage.IV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.ORIHARUKON,
+ new Materials[] { Materials.Oriharukon, Materials.Lead },
+ new int[] { 50 * 100, 75 * 100 },
+ new int[] {},
+ Voltage.IV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.BLACKPLUTONIUM,
+ new Materials[] { Materials.BlackPlutonium, Materials.Plutonium },
+ new int[] { 25 * 100, 50 * 100 },
+ new int[] {},
+ Voltage.LuV,
+ NI,
+ 30 * 100);
+ addCentrifugeToMaterial(
+ CombType.TRINIUM,
+ new Materials[] { Materials.Trinium, Materials.Iridium },
+ new int[] { 35 * 100, 45 * 100 },
+ new int[] {},
+ Voltage.ZPM,
+ NI,
+ 30 * 100);
+ }
+
+ // Planet Line
+ addCentrifugeToItemStack(
+ CombType.MOON,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MoonStoneDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100 },
+ Voltage.MV,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.MARS,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MarsStoneDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100 },
+ Voltage.HV,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.JUPITER,
+ new ItemStack[] { GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.IoStoneDust", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaIceDust", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaStoneDust", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.GanymedeStoneDust", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoStoneDust", 1L, 0),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.CallistoIce, 1L), ItemList.FR_Wax.get(1L) },
+ new int[] { 30 * 100, 30 * 100, 30 * 100, 30 * 100, 30 * 100, 5 * 100, 50 * 100 },
+ Voltage.HV,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.MERCURY,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MercuryCoreDust", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MercuryStoneDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100, 30 * 100 },
+ Voltage.EV,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.VENUS,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.VenusStoneDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100 },
+ Voltage.EV,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.SATURN,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusStoneDust", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TitanStoneDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100, 30 * 100 },
+ Voltage.IV,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.URANUS,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MirandaStoneDust", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.OberonStoneDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100, 30 * 100 },
+ Voltage.IV,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.NEPTUN,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ProteusStoneDust", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TritonStoneDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100, 30 * 100 },
+ Voltage.IV,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.PLUTO,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PlutoStoneDust", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PlutoIceDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100, 30 * 100 },
+ Voltage.LuV,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.HAUMEA,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.HaumeaStoneDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100 },
+ Voltage.LuV,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.MAKEMAKE,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MakeMakeStoneDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100 },
+ Voltage.LuV,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.CENTAURI,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CentauriASurfaceDust", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CentauriAStoneDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100, 30 * 100 },
+ Voltage.ZPM,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.TCETI,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100 },
+ Voltage.ZPM,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.BARNARDA,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaEStoneDust", 1L, 0),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaFStoneDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100, 30 * 100 },
+ Voltage.ZPM,
+ 300);
+ addCentrifugeToItemStack(
+ CombType.VEGA,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.VegaBStoneDust", 1L, 0) },
+ new int[] { 50 * 100, 30 * 100 },
+ Voltage.ZPM,
+ 300);
+ if (GalaxySpace.isModLoaded()) {
+ addCentrifugeToItemStack(
+ CombType.SEAWEED,
+ new ItemStack[] { ItemList.FR_Wax.get(1L),
+ GT_ModHandler.getModItem(GalaxySpace.ID, "tcetiedandelions", 1L, 0) },
+ new int[] { 50 * 100, 100 * 100 },
+ Voltage.UV,
+ 100);
+ }
+ // Infinity Line
+ addCentrifugeToMaterial(
+ CombType.INFINITYCATALYST,
+ new Materials[] { Materials.InfinityCatalyst, Materials.Neutronium },
+ new int[] { 25 * 100, 20 * 100 },
+ new int[] {},
+ Voltage.ZPM,
+ 100,
+ NI,
+ 50 * 100);
+
+ // (Noble)gas Line
+ addFluidExtractorProcess(CombType.HELIUM, Materials.Helium.getGas(250), Voltage.HV);
+ addFluidExtractorProcess(CombType.ARGON, Materials.Argon.getGas(250), Voltage.MV);
+ addFluidExtractorProcess(CombType.NITROGEN, Materials.Nitrogen.getGas(500), Voltage.MV);
+ addFluidExtractorProcess(CombType.HYDROGEN, Materials.Hydrogen.getGas(500), Voltage.MV);
+ addFluidExtractorProcess(CombType.FLUORINE, Materials.Fluorine.getGas(250), Voltage.MV);
+ addFluidExtractorProcess(CombType.OXYGEN, Materials.Oxygen.getGas(500), Voltage.MV);
+ // Organic part 2, unknown liquid
+ // yes, unknowwater. It's not a typo, it's how it is spelled. Stupid game.
+ addFluidExtractorProcess(CombType.UNKNOWNWATER, FluidRegistry.getFluidStack("unknowwater", 250), Voltage.ZPM);
+ /*
+ * TODO: update this comment
+ * The Centrifuge Recipes for Infused Shards and Nether/End-Shard from the Infused Shard Line are below the
+ * NobleGas Lines for Xenon and co. in GT_MachineRecipeLoader.java In Lines 1525
+ */
+ }
+
+ /**
+ * Currently only used for CombType.MOLYBDENUM
+ *
+ * @param circuitNumber should not conflict with addProcessGT
+ *
+ **/
+ public void addAutoclaveProcess(CombType comb, Materials aMaterial, Voltage volt, int circuitNumber) {
+ if (GT_OreDictUnificator.get(OrePrefixes.crushedPurified, aMaterial, 4) == NI) {
+ return;
+ }
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder
+ .itemInputs(GT_Utility.copyAmount(9, getStackForType(comb)), GT_Utility.getIntegratedCircuit(circuitNumber))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.crushedPurified, aMaterial, 4))
+ .fluidInputs(Materials.UUMatter.getFluid(Math.max(1, ((aMaterial.getMass() + volt.getUUAmplifier()) / 10))))
+ .duration(((int) (aMaterial.getMass() * 128)) * TICKS)
+ .eut(volt.getAutoClaveEnergy());
+ if (volt.compareTo(Voltage.HV) > 0) {
+ recipeBuilder.requiresCleanRoom();
+ }
+ recipeBuilder.addTo(autoclaveRecipes);
+ }
+
+ public void addFluidExtractorProcess(CombType comb, FluidStack fluid, Voltage volt) {
+ if (fluid == null) {
+ return;
+ }
+
+ int duration = (fluid.getFluid()
+ .getDensity() * 128 > 0
+ ? (fluid.getFluid()
+ .getDensity() * 100)
+ : 128);
+ int eut = volt.getSimpleEnergy() / 2;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, getStackForType(comb)))
+ .fluidOutputs(fluid)
+ .duration(duration)
+ .eut(eut)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ /**
+ * this only adds Chemical and AutoClave process. If you need Centrifuge recipe. use addCentrifugeToMaterial or
+ * addCentrifugeToItemStack
+ *
+ * @param volt This determine the required Tier of process for this recipes. This decide the required aEU/t,
+ * progress time, required additional UU-Matter, requirement of cleanRoom, needed fluid stack for
+ * Chemical.
+ * @param aMaterial result of Material that should be generated by this process.
+ **/
+ public void addProcessGT(CombType comb, Materials[] aMaterial, Voltage volt) {
+ ItemStack tComb = getStackForType(comb);
+ for (Materials materials : aMaterial) {
+ if (GT_OreDictUnificator.get(OrePrefixes.crushedPurified, materials, 4) != null) {
+ ItemStack combInput;
+ ItemStack combOutput;
+ FluidStack fluidInput;
+ FluidStack fluidOutput;
+ int durationTicks;
+ int eut;
+ boolean requiresCleanroom;
+ switch (comb) {
+ case NEUTRONIUM -> {
+ combInput = GT_Utility.copyAmount(4, tComb);
+ combOutput = Materials.Neutronium.getNuggets(1);
+ fluidInput = volt.getFluidAccordingToCombTier();
+ fluidOutput = Materials.Neutronium.getMolten(576);
+ durationTicks = volt.getComplexTime() * 17;
+ eut = volt.getChemicalEnergy();
+ requiresCleanroom = volt.compareTo(Voltage.IV) > 0;
+ }
+ case OSMIUM -> {
+ combInput = GT_Utility.copyAmount(4, tComb);
+ combOutput = Materials.Osmium.getNuggets(1);
+ fluidInput = volt.getFluidAccordingToCombTier();
+ fluidOutput = Materials.Osmium.getMolten(288);
+ durationTicks = volt.getComplexTime() * 17;
+ eut = volt.getChemicalEnergy();
+ requiresCleanroom = volt.compareTo(Voltage.IV) > 0;
+ }
+ case PLATINUM -> {
+ combInput = GT_Utility.copyAmount(4, tComb);
+ combOutput = Materials.Platinum.getNuggets(1);
+ fluidInput = volt.getFluidAccordingToCombTier();
+ fluidOutput = Materials.Platinum.getMolten(288);
+ durationTicks = volt.getComplexTime() * 10;
+ eut = volt.getChemicalEnergy();
+ requiresCleanroom = volt.compareTo(Voltage.HV) > 0;
+ }
+ case IRIDIUM -> {
+ combInput = GT_Utility.copyAmount(4, tComb);
+ combOutput = Materials.Iridium.getNuggets(1);
+ fluidInput = volt.getFluidAccordingToCombTier();
+ fluidOutput = Materials.Iridium.getMolten(288);
+ durationTicks = volt.getComplexTime() * 14;
+ eut = volt.getChemicalEnergy();
+ requiresCleanroom = volt.compareTo(Voltage.EV) > 0;
+ }
+ default -> {
+ combInput = GT_Utility.copyAmount(4, tComb);
+ combOutput = GT_OreDictUnificator.get(OrePrefixes.crushedPurified, materials, 4);
+ fluidInput = volt.getFluidAccordingToCombTier();
+ fluidOutput = null;
+ durationTicks = volt.getComplexTime();
+ eut = volt.getChemicalEnergy();
+ requiresCleanroom = volt.compareTo(Voltage.IV) > 0;
+ }
+ }
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder.itemInputs(combInput)
+ .itemOutputs(combOutput)
+ .fluidInputs(fluidInput);
+ if (fluidOutput != null) {
+ recipeBuilder.fluidOutputs(fluidOutput);
+ }
+ recipeBuilder.duration(durationTicks)
+ .eut(eut)
+ .metadata(CLEANROOM, requiresCleanroom)
+ .addTo(UniversalChemical);
+ }
+ }
+ }
+
+ /**
+ * this method only adds Centrifuge based on Material. If volt is lower than MV than it will also adds forestry
+ * centrifuge recipe.
+ *
+ * @param comb BeeComb
+ * @param aMaterial resulting Material of processing. can be more than 6. but over 6 will be ignored in Gregtech
+ * Centrifuge.
+ * @param chance chance to get result, 10000 == 100%
+ * @param volt required Voltage Tier for this recipe, this also affect the duration, amount of UU-Matter, and
+ * needed liquid type and amount for chemical reactor
+ * @param stackSize This parameter can be null, in that case stack size will be just 1. This handle the stackSize of
+ * the resulting Item, and Also the Type of Item. if this value is multiple of 9, than related
+ * Material output will be dust, if this value is multiple of 4 than output will be Small dust,
+ * else the output will be Tiny dust
+ * @param beeWax if this is null, then the comb will product default Bee wax. But if aMaterial is more than 5,
+ * beeWax will be ignored in Gregtech Centrifuge.
+ * @param waxChance have same format like "chance"
+ **/
+ public void addCentrifugeToMaterial(CombType comb, Materials[] aMaterial, int[] chance, int[] stackSize,
+ Voltage volt, ItemStack beeWax, int waxChance) {
+ addCentrifugeToMaterial(comb, aMaterial, chance, stackSize, volt, volt.getSimpleTime(), beeWax, waxChance);
+ }
+
+ public void addCentrifugeToMaterial(CombType comb, Materials[] aMaterial, int[] chance, int[] stackSize,
+ Voltage volt, int duration, ItemStack beeWax, int waxChance) {
+ ItemStack[] aOutPut = new ItemStack[aMaterial.length + 1];
+ stackSize = Arrays.copyOf(stackSize, aMaterial.length);
+ chance = Arrays.copyOf(chance, aOutPut.length);
+ chance[chance.length - 1] = waxChance;
+ for (int i = 0; i < (aMaterial.length); i++) {
+ if (chance[i] == 0) {
+ continue;
+ }
+ if (Math.max(1, stackSize[i]) % 9 == 0) {
+ aOutPut[i] = GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial[i], (Math.max(1, stackSize[i]) / 9));
+ } else if (Math.max(1, stackSize[i]) % 4 == 0) {
+ aOutPut[i] = GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial[i], (Math.max(1, stackSize[i]) / 4));
+ } else {
+ aOutPut[i] = GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial[i], Math.max(1, stackSize[i]));
+ }
+ }
+ if (beeWax != NI) {
+ aOutPut[aOutPut.length - 1] = beeWax;
+ } else {
+ aOutPut[aOutPut.length - 1] = ItemList.FR_Wax.get(1);
+ }
+
+ addCentrifugeToItemStack(comb, aOutPut, chance, volt, duration);
+ }
+
+ /**
+ * @param volt required Tier of system. If it's lower than MV, it will also add forestry centrifuge.
+ * @param aItem can be more than 6. but Over 6 will be ignored in Gregtech Centrifuge.
+ **/
+ public void addCentrifugeToItemStack(CombType comb, ItemStack[] aItem, int[] chance, Voltage volt) {
+ addCentrifugeToItemStack(comb, aItem, chance, volt, volt.getSimpleTime());
+ }
+
+ public void addCentrifugeToItemStack(CombType comb, ItemStack[] aItem, int[] chance, Voltage volt, int duration) {
+ ItemStack tComb = getStackForType(comb);
+ Builder<ItemStack, Float> Product = new ImmutableMap.Builder<>();
+ for (int i = 0; i < aItem.length; i++) {
+ if (aItem[i] == NI) {
+ continue;
+ }
+ Product.put(aItem[i], chance[i] / 10000.0f);
+ }
+
+ if (volt.compareTo(Voltage.MV) < 0 || !GT_Mod.gregtechproxy.mNerfedCombs) {
+ RecipeManagers.centrifugeManager.addRecipe(40, tComb, Product.build());
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tComb)
+ .itemOutputs(aItem)
+ .outputChances(chance)
+ .duration(duration)
+ .eut(volt.getSimpleEnergy())
+ .addTo(centrifugeRecipes);
+ }
+
+ public void registerOreDict() {
+ for (CombType comb : CombType.values()) {
+ ItemStack tComb = getStackForType(comb);
+ GT_OreDictUnificator.registerOre(OrePrefixes.beeComb.name(), tComb);
+ OrePrefixes.beeComb.add(tComb);
+ if (comb.voltage != null) GT_OreDictUnificator.registerOre("comb" + comb.voltage.name(), tComb);
+ }
+ }
+
+ enum Voltage {
+
+ ULV,
+ LV,
+ MV,
+ HV,
+ EV,
+ IV,
+ LuV,
+ ZPM,
+ UV,
+ UHV,
+ UEV,
+ UIV,
+ UMV,
+ UXV,
+ MAX;
+
+ public int getVoltage() {
+ return (int) V[this.ordinal()];
+ }
+
+ /** @return aEU/t needed for chemical and autoclave process related to the Tier **/
+ public int getVoltageFromEU() {
+ return (int) Math.max(Math.floor(Math.log(2 * this.getVoltage()) / Math.log(4) - 1), 0);
+ }
+
+ /** @return Voltage tier according to EU provided. 0 = ULV, 1 = LV, 2 = MV ... **/
+ public int getChemicalEnergy() {
+ return this.getVoltage() * 3 / 4;
+ }
+
+ public int getAutoClaveEnergy() {
+ return (int) ((this.getVoltage() * 3 / 4) * (Math.max(1, Math.pow(2, 5 - this.ordinal()))));
+ }
+
+ /** @return FluidStack needed for chemical process related to the Tier **/
+ public FluidStack getComplexChemical() {
+ if (this.compareTo(Voltage.MV) < 0) {
+ return Materials.HydrofluoricAcid.getFluid((this.compareTo(Voltage.ULV) > 0) ? 1000 : 500);
+ } else if (this.compareTo(Voltage.HV) < 0) {
+ return GT_ModHandler.getDistilledWater(1000L);
+ } else if (this.compareTo(Voltage.LuV) < 0) {
+ return Materials.HydrofluoricAcid.getFluid((long) (Math.pow(2, this.compareTo(Voltage.HV)) * L));
+ } else if (this.compareTo(Voltage.UHV) < 0) {
+ return FluidRegistry.getFluidStack("mutagen", (int) (Math.pow(2, this.compareTo(Voltage.LuV)) * L));
+ } else {
+ return NF;
+ }
+ }
+
+ /** @return FluidStack needed for chemical process related to the Tier **/
+ public FluidStack getFluidAccordingToCombTier() {
+ // checking what Voltage tier the Comb is
+ // cascading from IV to UMV since all recipes use HydrofluiricAcid
+ // for later tiers, just add the corresponding tier to a case
+ int fluidAmount = this.getFluidAmount();
+ return switch (this.getVoltageFromEU()) {
+ case 0 ->
+ /* ULV */
+ Materials.Water.getFluid(fluidAmount);
+ case 1 ->
+ /* LV */
+ Materials.SulfuricAcid.getFluid(fluidAmount);
+ case 2 ->
+ /* MV */
+ Materials.HydrochloricAcid.getFluid(fluidAmount);
+ case 3 ->
+ /* HV */
+ Materials.PhosphoricAcid.getFluid(fluidAmount);
+ case 4 ->
+ /* EV */
+ Materials.HydrofluoricAcid.getFluid(this.getFluidAmount());
+ default -> Materials.PhthalicAcid.getFluid(fluidAmount);
+ };
+ }
+
+ /** @return additional required UU-Matter amount for Autoclave process related to the Tier **/
+ public int getUUAmplifier() {
+ return 9 * ((this.compareTo(Voltage.MV) < 0) ? 1 : this.compareTo(Voltage.MV));
+ }
+
+ /** @return duration needed for Chemical process related to the Tier **/
+ public int getComplexTime() {
+ return 64 + this.ordinal() * 32;
+ }
+
+ /** @return Fluid amount needed for Chemical process related to the Tier **/
+ public int getFluidAmount() {
+ return 9 * this.getSimpleTime() / 3;
+ }
+
+ /** @return duration needed for Centrifuge process related to the Tier **/
+ public int getSimpleTime() {
+ if (!GT_Mod.gregtechproxy.mNerfedCombs) {
+ return 96 + this.ordinal() * 32;
+ } else {
+ // ULV, LV needs 128ticks, MV need 256 ticks, HV need 384 ticks, EV need 512 ticks, IV need 640 ticks
+ return 128 * (Math.max(1, this.ordinal()));
+ }
+ }
+
+ /** @return aEU/t needed for Centrifuge process related to the Tier **/
+ public int getSimpleEnergy() {
+ if (this == Voltage.ULV) {
+ return 5;
+ } else {
+ return (this.getVoltage() / 16) * 15;
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/items/ItemDrop.java b/src/main/java/gregtech/common/items/ItemDrop.java
new file mode 100644
index 0000000000..5aab9dff48
--- /dev/null
+++ b/src/main/java/gregtech/common/items/ItemDrop.java
@@ -0,0 +1,241 @@
+package gregtech.common.items;
+
+import static gregtech.api.enums.Mods.ExtraBees;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.HardcoreEnderExpansion;
+import static gregtech.api.enums.Mods.MagicBees;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+import forestry.api.recipes.RecipeManagers;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_RecipeBuilder;
+
+public class ItemDrop extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public ItemDrop() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gt.drop");
+ GameRegistry.registerItem(this, "gt.drop", GregTech.ID);
+ }
+
+ public ItemStack getStackForType(DropType type) {
+ return new ItemStack(this, 1, type.ordinal());
+ }
+
+ public ItemStack getStackForType(DropType type, int count) {
+ return new ItemStack(this, count, type.ordinal());
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List<ItemStack> list) {
+ for (DropType type : DropType.values()) {
+ if (type.showInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public int getRenderPasses(int meta) {
+ return 2;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister iconRegister) {
+ this.itemIcon = iconRegister.registerIcon("forestry:honeyDrop.0");
+ this.secondIcon = iconRegister.registerIcon("forestry:honeyDrop.1");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ int meta = Math.max(0, Math.min(DropType.values().length - 1, stack.getItemDamage()));
+ int colour = DropType.values()[meta].getColours()[0];
+
+ if (pass >= 1) {
+ colour = DropType.values()[meta].getColours()[1];
+ }
+
+ return colour;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return DropType.values()[stack.getItemDamage()].getName();
+ }
+
+ public void initDropsRecipes() {
+ ItemStack tDrop;
+
+ tDrop = getStackForType(DropType.OIL);
+ addProcessLV(
+ tDrop,
+ Materials.OilHeavy.getFluid(100L),
+ GT_ModHandler.getModItem(Forestry.ID, "propolis", 1L, 0),
+ 3000,
+ 8);
+ RecipeManagers.squeezerManager.addRecipe(
+ 40,
+ new ItemStack[] { tDrop },
+ Materials.OilHeavy.getFluid(100L),
+ GT_ModHandler.getModItem(Forestry.ID, "propolis", 1L, 0),
+ 30);
+ tDrop = getStackForType(DropType.COOLANT);
+ addProcessLV(
+ tDrop,
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 100),
+ GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 0),
+ 3000,
+ 8);
+ RecipeManagers.squeezerManager.addRecipe(
+ 40,
+ new ItemStack[] { tDrop },
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 100),
+ GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 0),
+ 30);
+ tDrop = getStackForType(DropType.HOT_COOLANT);
+ addProcessLV(
+ tDrop,
+ new FluidStack(FluidRegistry.getFluid("ic2hotcoolant"), 100),
+ GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 2),
+ 3000,
+ 8);
+ RecipeManagers.squeezerManager.addRecipe(
+ 40,
+ new ItemStack[] { tDrop },
+ new FluidStack(FluidRegistry.getFluid("ic2hotcoolant"), 100),
+ GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 2),
+ 30);
+ tDrop = getStackForType(DropType.SNOW_QUEEN);
+ addProcessMV(
+ tDrop,
+ Materials.FierySteel.getFluid(200L),
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.SnowQueenBloodDrop", 1L, 0),
+ 1500,
+ 48);
+ tDrop = getStackForType(DropType.LAPIS);
+ addProcessLV(
+ tDrop,
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 200),
+ GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 3),
+ 5000,
+ 1200,
+ 2);
+ RecipeManagers.squeezerManager.addRecipe(
+ 400,
+ new ItemStack[] { tDrop },
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 100),
+ GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 3),
+ 30);
+ tDrop = getStackForType(DropType.HYDRA);
+ addProcessMV(
+ tDrop,
+ Materials.FierySteel.getFluid(50L),
+ GT_ModHandler.getModItem(MagicBees.ID, "propolis", 1L, 2),
+ 3000,
+ 8);
+ tDrop = getStackForType(DropType.OXYGEN);
+ addProcessLV(
+ tDrop,
+ new FluidStack(FluidRegistry.getFluid("liquidoxygen"), 100),
+ GT_ModHandler.getModItem(ExtraBees.ID, "propolis", 1L, 2),
+ 250,
+ 1200,
+ 8);
+ RecipeManagers.squeezerManager.addRecipe(
+ 400,
+ new ItemStack[] { tDrop },
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 100),
+ GT_ModHandler.getModItem(ExtraBees.ID, "propolis", 1L, 2),
+ 30);
+ tDrop = getStackForType(DropType.ENDERGOO);
+ if (HardcoreEnderExpansion.isModLoaded())
+ addProcessHV(tDrop, new FluidStack(FluidRegistry.getFluid("endergoo"), 500), GT_Values.NI, 1000);
+ }
+
+ public void addProcessLV(ItemStack tDrop, FluidStack aOutput, ItemStack aOutput2, int aChance, int aEUt) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tDrop)
+ .itemOutputs(aOutput2)
+ .outputChances(aChance)
+ .fluidOutputs(aOutput)
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(aEUt)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ public void addProcessLV(ItemStack tDrop, FluidStack aOutput, ItemStack aOutput2, int aChance, int aDuration,
+ int aEUt) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tDrop)
+ .itemOutputs(aOutput2)
+ .outputChances(aChance)
+ .fluidOutputs(aOutput)
+ .duration(aDuration)
+ .eut(aEUt)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ public void addProcessMV(ItemStack tDrop, FluidStack aOutput, ItemStack aOutput2, int aChance, int aEUt) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tDrop)
+ .itemOutputs(aOutput2)
+ .outputChances(aChance)
+ .fluidOutputs(aOutput)
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(aEUt)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ public void addProcessHV(ItemStack tDrop, FluidStack aOutput, ItemStack aOutput2, int aChance) {
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder.itemInputs(tDrop);
+ if (aOutput2 != GT_Values.NI) {
+ recipeBuilder.itemOutputs(aOutput2)
+ .outputChances(aChance);
+ }
+ recipeBuilder.fluidOutputs(aOutput)
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(fluidExtractionRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/common/items/ItemPollen.java b/src/main/java/gregtech/common/items/ItemPollen.java
new file mode 100644
index 0000000000..70e2d64514
--- /dev/null
+++ b/src/main/java/gregtech/common/items/ItemPollen.java
@@ -0,0 +1,89 @@
+package gregtech.common.items;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+
+public class ItemPollen extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public ItemPollen() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gt.pollen");
+ GameRegistry.registerItem(this, "gt.pollen", GregTech.ID);
+ }
+
+ public ItemStack getStackForType(PollenType type) {
+ return new ItemStack(this, 1, type.ordinal());
+ }
+
+ public ItemStack getStackForType(PollenType type, int count) {
+ return new ItemStack(this, count, type.ordinal());
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List<ItemStack> list) {
+ for (PollenType type : PollenType.values()) {
+ if (type.showInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean requiresMultipleRenderPasses() {
+ return true;
+ }
+
+ @Override
+ public int getRenderPasses(int meta) {
+ return 2;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister iconRegister) {
+ this.itemIcon = iconRegister.registerIcon("forestry:pollen.0");
+ this.secondIcon = iconRegister.registerIcon("forestry:pollen.1");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return (pass == 0) ? itemIcon : secondIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ int meta = Math.max(0, Math.min(PollenType.values().length - 1, stack.getItemDamage()));
+ int colour = PollenType.values()[meta].getColours()[0];
+
+ if (pass >= 1) {
+ colour = PollenType.values()[meta].getColours()[1];
+ }
+
+ return colour;
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return PollenType.values()[stack.getItemDamage()].getName();
+ }
+}
diff --git a/src/main/java/gregtech/common/items/ItemPropolis.java b/src/main/java/gregtech/common/items/ItemPropolis.java
new file mode 100644
index 0000000000..1c0d727bda
--- /dev/null
+++ b/src/main/java/gregtech/common/items/ItemPropolis.java
@@ -0,0 +1,141 @@
+package gregtech.common.items;
+
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.HardcoreEnderExpansion;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import forestry.api.core.Tabs;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class ItemPropolis extends Item {
+
+ @SideOnly(Side.CLIENT)
+ private IIcon secondIcon;
+
+ public ItemPropolis() {
+ super();
+ this.setCreativeTab(Tabs.tabApiculture);
+ this.setHasSubtypes(true);
+ this.setUnlocalizedName("gt.propolis");
+ GameRegistry.registerItem(this, "gt.propolis", GregTech.ID);
+ }
+
+ public ItemStack getStackForType(PropolisType type) {
+ return new ItemStack(this, 1, type.ordinal());
+ }
+
+ public ItemStack getStackForType(PropolisType type, int count) {
+ return new ItemStack(this, count, type.ordinal());
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item item, CreativeTabs tabs, List<ItemStack> list) {
+ for (PropolisType type : PropolisType.values()) {
+ if (type.showInList) {
+ list.add(this.getStackForType(type));
+ }
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister iconRegister) {
+ this.itemIcon = iconRegister.registerIcon("forestry:propolis.0");
+ }
+
+ @Override
+ public IIcon getIcon(ItemStack stack, int pass) {
+ return itemIcon;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getColorFromItemStack(ItemStack stack, int pass) {
+ int meta = Math.max(0, Math.min(PropolisType.values().length - 1, stack.getItemDamage()));
+ return PropolisType.values()[meta].getColours();
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack stack) {
+ return PropolisType.values()[stack.getItemDamage()].getName();
+ }
+
+ public void initPropolisRecipes() {
+ ItemStack tPropolis;
+
+ tPropolis = getStackForType(PropolisType.End);
+ addProcessHV(tPropolis, GT_ModHandler.getModItem(HardcoreEnderExpansion.ID, "end_powder", 1, 0));
+ tPropolis = getStackForType(PropolisType.Stardust);
+ addProcessHV(tPropolis, GT_ModHandler.getModItem(HardcoreEnderExpansion.ID, "stardust", 1, 0));
+ tPropolis = getStackForType(PropolisType.Ectoplasma);
+ addProcessEV(tPropolis, GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EctoplasmaChip", 1, 0));
+ tPropolis = getStackForType(PropolisType.Arcaneshard);
+ addProcessEV(tPropolis, GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ArcaneShardChip", 1, 0));
+ tPropolis = getStackForType(PropolisType.Dragonessence);
+ addProcessIV(tPropolis, GT_ModHandler.getModItem(HardcoreEnderExpansion.ID, "essence", 16, 0));
+ tPropolis = getStackForType(PropolisType.Enderman);
+ addProcessIV(tPropolis, GT_ModHandler.getModItem(HardcoreEnderExpansion.ID, "enderman_head", 1, 0));
+ tPropolis = getStackForType(PropolisType.Silverfish);
+ addProcessEV(tPropolis, GT_ModHandler.getModItem(HardcoreEnderExpansion.ID, "silverfish_blood", 1, 0));
+ tPropolis = getStackForType(PropolisType.Endium);
+ addProcessHV(tPropolis, GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.HeeEndium, 1));
+ tPropolis = getStackForType(PropolisType.Fireessence);
+ addProcessIV(tPropolis, GT_ModHandler.getModItem(HardcoreEnderExpansion.ID, "essence", 16, 1));
+
+ // addRecipe(tDrop, aOutput, aOutput2, aChance, aDuration, aEUt);
+ }
+
+ public void addProcessHV(ItemStack tPropolis, ItemStack aOutput2) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tPropolis)
+ .itemOutputs(aOutput2)
+ .outputChances(5000)
+ .fluidOutputs(FluidRegistry.getFluidStack("endergoo", 100))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ public void addProcessEV(ItemStack tPropolis, ItemStack aOutput2) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tPropolis)
+ .itemOutputs(aOutput2)
+ .outputChances(2500)
+ .fluidOutputs(FluidRegistry.getFluidStack("endergoo", 200))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(fluidExtractionRecipes);
+ }
+
+ public void addProcessIV(ItemStack tPropolis, ItemStack aOutput2) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tPropolis)
+ .itemOutputs(aOutput2)
+ .outputChances(1500)
+ .fluidOutputs(FluidRegistry.getFluidStack("endergoo", 300))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(fluidExtractionRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/common/items/PollenType.java b/src/main/java/gregtech/common/items/PollenType.java
new file mode 100644
index 0000000000..3cd9484b69
--- /dev/null
+++ b/src/main/java/gregtech/common/items/PollenType.java
@@ -0,0 +1,35 @@
+package gregtech.common.items;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_LanguageManager;
+
+public enum PollenType {
+
+ MATRIX("matrix", true);
+
+ private static final int[][] colours = new int[][] { { 0x19191B, 0x303032 }, };
+ public boolean showInList;
+ public Materials material;
+ public int chance;
+ private final String name;
+
+ PollenType(String pName, boolean show) {
+ this.name = pName;
+ this.showInList = show;
+ }
+
+ public void setHidden() {
+ this.showInList = false;
+ }
+
+ public String getName() {
+ return GT_LanguageManager.addStringLocalization(
+ "pollen." + this.name,
+ this.name.substring(0, 1)
+ .toUpperCase() + this.name.substring(1) + " Pollen");
+ }
+
+ public int[] getColours() {
+ return colours[this.ordinal()];
+ }
+}
diff --git a/src/main/java/gregtech/common/items/PropolisType.java b/src/main/java/gregtech/common/items/PropolisType.java
new file mode 100644
index 0000000000..e6f08b0cfa
--- /dev/null
+++ b/src/main/java/gregtech/common/items/PropolisType.java
@@ -0,0 +1,46 @@
+package gregtech.common.items;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_LanguageManager;
+
+public enum PropolisType {
+
+ End("End", true),
+ Ectoplasma("Ectoplasma", true),
+ Arcaneshard("Arcaneshard", true),
+ Stardust("Stardust", true),
+ Dragonessence("Dragonessence", true),
+ Enderman("Enderman", true),
+ Silverfish("Silverfish", true),
+ Endium("Endium", true),
+ Fireessence("Fireessence", true);
+
+ private static final int[] colours = new int[] { 0xCC00FA, 0xDCB0E5, 0x9010AD, 0xFFFF00, 0x911ECE, 0x161616,
+ 0xEE053D, 0xa0ffff, 0xD41238 };
+
+ public boolean showInList;
+ public Materials material;
+ public int chance;
+ private final String name;
+
+ PropolisType(String pName, boolean show) {
+ this.name = pName;
+ this.showInList = show;
+ }
+
+ public void setHidden() {
+ this.showInList = false;
+ }
+
+ public String getName() {
+ // return "gt.comb."+this.name;
+ return GT_LanguageManager.addStringLocalization(
+ "propolis." + this.name,
+ this.name.substring(0, 1)
+ .toUpperCase() + this.name.substring(1) + " Propolis");
+ }
+
+ public int getColours() {
+ return colours[this.ordinal()];
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Arrow.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Arrow.java
new file mode 100644
index 0000000000..8005009d14
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Arrow.java
@@ -0,0 +1,141 @@
+package gregtech.common.items.behaviors;
+
+import net.minecraft.block.BlockDispenser;
+import net.minecraft.dispenser.IBlockSource;
+import net.minecraft.dispenser.IPosition;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.world.World;
+
+import gregtech.api.enums.SubTag;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.entities.GT_Entity_Arrow;
+
+public class Behaviour_Arrow extends Behaviour_None {
+
+ public static Behaviour_Arrow DEFAULT_WOODEN = new Behaviour_Arrow(GT_Entity_Arrow.class, 1.0F, 6.0F);
+ public static Behaviour_Arrow DEFAULT_PLASTIC = new Behaviour_Arrow(GT_Entity_Arrow.class, 1.5F, 6.0F);
+ private final int mLevel;
+ private final Enchantment mEnchantment;
+ private final float mSpeedMultiplier;
+ private final float mPrecision;
+ private final Class<? extends GT_Entity_Arrow> mArrow;
+
+ public Behaviour_Arrow(Class<? extends GT_Entity_Arrow> aArrow, float aSpeed, float aPrecision) {
+ this(aArrow, aSpeed, aPrecision, null, 0);
+ }
+
+ public Behaviour_Arrow(Class<? extends GT_Entity_Arrow> aArrow, float aSpeed, float aPrecision,
+ Enchantment aEnchantment, int aLevel) {
+ this.mArrow = aArrow;
+ this.mSpeedMultiplier = aSpeed;
+ this.mPrecision = aPrecision;
+ this.mEnchantment = aEnchantment;
+ this.mLevel = aLevel;
+ }
+
+ @Override
+ public boolean onLeftClickEntity(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) {
+ if ((aEntity instanceof EntityLivingBase)) {
+ GT_Utility.GT_EnchantmentHelper.applyBullshitA((EntityLivingBase) aEntity, aPlayer, aStack);
+ GT_Utility.GT_EnchantmentHelper.applyBullshitB(aPlayer, aEntity, aStack);
+ if (!aPlayer.capabilities.isCreativeMode) {
+ aStack.stackSize -= 1;
+ }
+ if (aStack.stackSize <= 0) {
+ aPlayer.destroyCurrentEquippedItem();
+ }
+ return false;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isItemStackUsable(GT_MetaBase_Item aItem, ItemStack aStack) {
+ if ((this.mEnchantment != null) && (this.mLevel > 0)) {
+ NBTTagCompound tNBT = GT_Utility.ItemNBT.getNBT(aStack);
+ if (!tNBT.getBoolean("GT.HasBeenUpdated")) {
+ tNBT.setBoolean("GT.HasBeenUpdated", true);
+ GT_Utility.ItemNBT.setNBT(aStack, tNBT);
+ GT_Utility.ItemNBT.addEnchantment(aStack, this.mEnchantment, this.mLevel);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean canDispense(GT_MetaBase_Item aItem, IBlockSource aSource, ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public ItemStack onDispense(GT_MetaBase_Item aItem, IBlockSource aSource, ItemStack aStack) {
+ World aWorld = aSource.getWorld();
+ IPosition tPosition = BlockDispenser.func_149939_a(aSource);
+ EnumFacing tFacing = BlockDispenser.func_149937_b(aSource.getBlockMetadata());
+ GT_Entity_Arrow tEntityArrow = (GT_Entity_Arrow) getProjectile(
+ aItem,
+ SubTag.PROJECTILE_ARROW,
+ aStack,
+ aWorld,
+ tPosition.getX(),
+ tPosition.getY(),
+ tPosition.getZ());
+ if (tEntityArrow != null) {
+ tEntityArrow.setThrowableHeading(
+ tFacing.getFrontOffsetX(),
+ tFacing.getFrontOffsetY() + 0.1F,
+ tFacing.getFrontOffsetZ(),
+ this.mSpeedMultiplier * 1.1F,
+ this.mPrecision);
+ tEntityArrow.setArrowItem(aStack);
+ tEntityArrow.canBePickedUp = 1;
+ aWorld.spawnEntityInWorld(tEntityArrow);
+ if (aStack.stackSize < 100) {
+ aStack.stackSize -= 1;
+ }
+ return aStack;
+ }
+ return super.onDispense(aItem, aSource, aStack);
+ }
+
+ @Override
+ public boolean hasProjectile(GT_MetaBase_Item aItem, SubTag aProjectileType, ItemStack aStack) {
+ return aProjectileType == SubTag.PROJECTILE_ARROW;
+ }
+
+ @Override
+ public EntityArrow getProjectile(GT_MetaBase_Item aItem, SubTag aProjectileType, ItemStack aStack, World aWorld,
+ double aX, double aY, double aZ) {
+ if (!hasProjectile(aItem, aProjectileType, aStack)) {
+ return null;
+ }
+ GT_Entity_Arrow rArrow = (GT_Entity_Arrow) GT_Utility
+ .callConstructor(this.mArrow.getName(), -1, null, true, new Object[] { aWorld, aX, aY, aZ });
+ rArrow.setArrowItem(aStack);
+ return rArrow;
+ }
+
+ @Override
+ public EntityArrow getProjectile(GT_MetaBase_Item aItem, SubTag aProjectileType, ItemStack aStack, World aWorld,
+ EntityLivingBase aEntity, float aSpeed) {
+ if (!hasProjectile(aItem, aProjectileType, aStack)) {
+ return null;
+ }
+ GT_Entity_Arrow rArrow = (GT_Entity_Arrow) GT_Utility.callConstructor(
+ this.mArrow.getName(),
+ -1,
+ null,
+ true,
+ new Object[] { aWorld, aEntity, this.mSpeedMultiplier * aSpeed });
+ rArrow.setArrowItem(aStack);
+ return rArrow;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Arrow_Potion.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Arrow_Potion.java
new file mode 100644
index 0000000000..3643de7b77
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Arrow_Potion.java
@@ -0,0 +1,71 @@
+package gregtech.common.items.behaviors;
+
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.world.World;
+
+import gregtech.api.enums.SubTag;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.common.entities.GT_Entity_Arrow_Potion;
+
+public class Behaviour_Arrow_Potion extends Behaviour_Arrow {
+
+ private final int[] mPotions;
+
+ public Behaviour_Arrow_Potion(float aSpeed, float aPrecision, int... aPotions) {
+ super(GT_Entity_Arrow_Potion.class, aSpeed, aPrecision);
+ this.mPotions = aPotions;
+ }
+
+ public Behaviour_Arrow_Potion(float aSpeed, float aPrecision, Enchantment aEnchantment, int aLevel,
+ int... aPotions) {
+ super(GT_Entity_Arrow_Potion.class, aSpeed, aPrecision, aEnchantment, aLevel);
+ this.mPotions = aPotions;
+ }
+
+ @Override
+ public boolean onLeftClickEntity(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) {
+ if ((aEntity instanceof EntityLivingBase)) {
+ for (int i = 3; i < this.mPotions.length; i += 4) {
+ if (aEntity.worldObj.rand.nextInt(100) < this.mPotions[i]) {
+ ((EntityLivingBase) aEntity).addPotionEffect(
+ new PotionEffect(
+ this.mPotions[(i - 3)],
+ this.mPotions[(i - 2)],
+ this.mPotions[(i - 1)],
+ false));
+ }
+ }
+ }
+ return super.onLeftClickEntity(aItem, aStack, aPlayer, aEntity);
+ }
+
+ @Override
+ public EntityArrow getProjectile(GT_MetaBase_Item aItem, SubTag aProjectileType, ItemStack aStack, World aWorld,
+ double aX, double aY, double aZ) {
+ if (!hasProjectile(aItem, aProjectileType, aStack)) {
+ return null;
+ }
+ GT_Entity_Arrow_Potion rArrow = new GT_Entity_Arrow_Potion(aWorld, aX, aY, aZ);
+ rArrow.setArrowItem(aStack);
+ rArrow.setPotions(this.mPotions);
+ return rArrow;
+ }
+
+ @Override
+ public EntityArrow getProjectile(GT_MetaBase_Item aItem, SubTag aProjectileType, ItemStack aStack, World aWorld,
+ EntityLivingBase aEntity, float aSpeed) {
+ if (!hasProjectile(aItem, aProjectileType, aStack)) {
+ return null;
+ }
+ GT_Entity_Arrow_Potion rArrow = new GT_Entity_Arrow_Potion(aWorld, aEntity, aSpeed);
+ rArrow.setArrowItem(aStack);
+ rArrow.setPotions(this.mPotions);
+ return rArrow;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Cover_Tool.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Cover_Tool.java
new file mode 100644
index 0000000000..4241e07e4b
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Cover_Tool.java
@@ -0,0 +1,193 @@
+package gregtech.common.items.behaviors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+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;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IItemBehaviour;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+
+public class Behaviour_Cover_Tool extends Behaviour_None {
+
+ public static final IItemBehaviour<GT_MetaBase_Item> INSTANCE = new Behaviour_Cover_Tool();
+ private final String mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.cover_copy_paste", "Can copy/paste cover data.");
+
+ private ISerializableObject mStoredData = GregTech_API.sNoBehavior.createDataObject();
+ private int mCoverType;
+ private int mTickRateAddition = 0;
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ if (aWorld.isRemote) {
+ return false;
+ }
+ final NBTTagCompound tNBT = aStack.getTagCompound();
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ final boolean isCopyMode = aPlayer.isSneaking();
+ initDataFromNBT(tNBT);
+ if (((aPlayer instanceof EntityPlayerMP)) && (aItem.canUse(aStack, 100.0D))) {
+ if (isCopyMode) {
+ ArrayList<String> tList = new ArrayList<>();
+ doCopy(tTileEntity, aWorld, aX, aY, aZ, side, hitX, hitY, hitZ, tList);
+ aItem.discharge(aStack, 100.0D, Integer.MAX_VALUE, true, false, false);
+ writeListToNBT(tList, tNBT, aPlayer);
+ saveDataToNBT(tNBT);
+ } else {
+ doPaste(tTileEntity, side, hitX, hitY, hitZ, aPlayer);
+ aItem.discharge(aStack, 25.0D, Integer.MAX_VALUE, true, false, false);
+ }
+ }
+ GT_Utility.doSoundAtClient(SoundResource.IC2_TOOLS_OD_SCANNER, 1, 1.0F, aX, aY, aZ);
+ return aPlayer instanceof EntityPlayerMP;
+ }
+
+ private void initDataFromNBT(NBTTagCompound aNBT) {
+ if (aNBT != null) {
+ mCoverType = aNBT.getInteger("mCoverType");
+ GT_CoverBehaviorBase<?> tBehavior = GregTech_API.getCoverBehaviorNew(mCoverType);
+ NBTBase tData = aNBT.getTag("mCoverData");
+ if (tData != null) mStoredData = tBehavior.createDataObject(tData);
+ else mStoredData = GregTech_API.sNoBehavior.createDataObject();
+ mTickRateAddition = aNBT.hasKey("mTickRateAddition") ? aNBT.getInteger("mTickRateAddition") : 0;
+ }
+ }
+
+ private void saveDataToNBT(NBTTagCompound aNBT) {
+ aNBT.setInteger("mCoverType", mCoverType);
+ if (mStoredData == null) mStoredData = GregTech_API.sNoBehavior.createDataObject();
+ aNBT.setTag("mCoverData", mStoredData.saveDataToNBT());
+ aNBT.setInteger("mTickRateAddition", mTickRateAddition);
+ }
+
+ @SuppressWarnings("rawtypes")
+ private void writeListToNBT(List aList, NBTTagCompound aNBT, EntityPlayer aPlayer) {
+ if (aList != null && aNBT != null) {
+ int tSize = aList.size();
+ aNBT.setInteger("dataLinesCount", tSize);
+ for (int i = 0; i < tSize; i++) {
+ aNBT.setString("dataLines" + i, (String) aList.get(i));
+ GT_Utility.sendChatToPlayer(aPlayer, (String) aList.get(i));
+ }
+ }
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ private void doCopy(TileEntity aTileEntity, World aWorld, int aX, int aY, int aZ, ForgeDirection side, float hitX,
+ float hitY, float hitZ, List aList) {
+ aList.add(
+ "----- X: " + EnumChatFormatting.AQUA
+ + GT_Utility.formatNumbers(aX)
+ + EnumChatFormatting.RESET
+ + " Y: "
+ + EnumChatFormatting.AQUA
+ + GT_Utility.formatNumbers(aY)
+ + EnumChatFormatting.RESET
+ + " Z: "
+ + EnumChatFormatting.AQUA
+ + GT_Utility.formatNumbers(aZ)
+ + EnumChatFormatting.RESET
+ + " D: "
+ + EnumChatFormatting.AQUA
+ + aWorld.provider.dimensionId
+ + EnumChatFormatting.RESET
+ + " -----");
+ if (aTileEntity instanceof ICoverable tCoverable) {
+ final ForgeDirection tSide = tCoverable.getCoverItemAtSide(side) != null ? side
+ : tCoverable.getCoverItemAtSide(GT_Utility.determineWrenchingSide(side, hitX, hitY, hitZ)) != null
+ ? GT_Utility.determineWrenchingSide(side, hitX, hitY, hitZ)
+ : ForgeDirection.UNKNOWN;
+ if (tSide != ForgeDirection.UNKNOWN) {
+ if (tCoverable.getCoverBehaviorAtSideNew(tSide)
+ .allowsCopyPasteTool()) {
+ mStoredData = tCoverable.getComplexCoverDataAtSide(tSide);
+ mCoverType = tCoverable.getCoverIDAtSide(tSide);
+ mTickRateAddition = tCoverable.getCoverInfoAtSide(tSide)
+ .getTickRateAddition();
+
+ aList.add("Block Side: " + EnumChatFormatting.AQUA + tSide.name() + EnumChatFormatting.RESET);
+ aList.add(
+ "Cover Type: " + EnumChatFormatting.GREEN
+ + tCoverable.getCoverItemAtSide(tSide)
+ .getDisplayName()
+ + EnumChatFormatting.RESET);
+ } else {
+ mStoredData = GregTech_API.sNoBehavior.createDataObject();
+ mCoverType = 0;
+ mTickRateAddition = 0;
+ aList.add("Copy unavailable for this cover type");
+ }
+ } else {
+ mStoredData = GregTech_API.sNoBehavior.createDataObject();
+ mCoverType = 0;
+ mTickRateAddition = 0;
+ aList.add("No Cover Found");
+ }
+ } else {
+ mStoredData = GregTech_API.sNoBehavior.createDataObject();
+ mCoverType = 0;
+ mTickRateAddition = 0;
+ aList.add("No Cover Found");
+ }
+ }
+
+ private void doPaste(TileEntity aTileEntity, ForgeDirection side, float hitX, float hitY, float hitZ,
+ EntityPlayer aPlayer) {
+ if (aTileEntity instanceof ICoverable tCoverable) {
+ if (mCoverType == 0 || mStoredData == null) {
+ GT_Utility.sendChatToPlayer(aPlayer, "Please Copy a Valid Cover First.");
+ return;
+ }
+ final ForgeDirection tSide = tCoverable.getCoverItemAtSide(side) != null ? side
+ : tCoverable.getCoverItemAtSide(GT_Utility.determineWrenchingSide(side, hitX, hitY, hitZ)) != null
+ ? GT_Utility.determineWrenchingSide(side, hitX, hitY, hitZ)
+ : ForgeDirection.UNKNOWN;
+ if (tSide != ForgeDirection.UNKNOWN) {
+ int tCoverID = tCoverable.getCoverIDAtSide(tSide);
+ if (tCoverID == mCoverType) {
+ tCoverable.setCoverDataAtSide(tSide, mStoredData);
+ tCoverable.getCoverInfoAtSide(tSide)
+ .setTickRateAddition(mTickRateAddition);
+ GT_Utility.sendChatToPlayer(aPlayer, "Cover Data Pasted.");
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, "Not Matched Cover.");
+ }
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, "No Cover Found.");
+ }
+ }
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ try {
+ final NBTTagCompound tNBT = aStack.getTagCompound();
+ final int tSize = tNBT.getInteger("dataLinesCount");
+ if (tSize < 1) throw new Exception();
+ aList.add(EnumChatFormatting.BLUE + "Stored Cover Data:");
+ for (int i = 0; i < tSize; i++) {
+ aList.add(EnumChatFormatting.RESET + tNBT.getString("dataLines" + i));
+ }
+ } catch (Exception e) {
+ aList.add(this.mTooltip);
+ }
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Crowbar.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Crowbar.java
new file mode 100644
index 0000000000..97d3da4ca3
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Crowbar.java
@@ -0,0 +1,61 @@
+package gregtech.common.items.behaviors;
+
+import static gregtech.api.enums.Mods.Railcraft;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_Crowbar extends Behaviour_None {
+
+ private final int mVanillaCosts;
+ private final int mEUCosts;
+
+ public Behaviour_Crowbar(int aVanillaCosts, int aEUCosts) {
+ this.mVanillaCosts = aVanillaCosts;
+ this.mEUCosts = aEUCosts;
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ if (aWorld.isRemote) {
+ return false;
+ }
+ if (GT_ModHandler.getModItem(Railcraft.ID, "fluid.creosote.bucket", 1L) != null) {
+ return false;
+ }
+ Block aBlock = aWorld.getBlock(aX, aY, aZ);
+ if (aBlock == null) {
+ return false;
+ }
+ byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ);
+ if (aBlock == Blocks.rail) {
+ if (GT_ModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) {
+ aWorld.isRemote = true;
+ aWorld.setBlock(aX, aY, aZ, aBlock, (aMeta + 1) % 10, 0);
+ aWorld.isRemote = false;
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_BREAK, 1.0F, -1.0F, aX, aY, aZ);
+ }
+ return true;
+ }
+ if ((aBlock == Blocks.detector_rail) || (aBlock == Blocks.activator_rail) || (aBlock == Blocks.golden_rail)) {
+ if (GT_ModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) {
+ aWorld.isRemote = true;
+ aWorld.setBlock(aX, aY, aZ, aBlock, aMeta / 8 * 8 + (aMeta % 8 + 1) % 6, 0);
+ aWorld.isRemote = false;
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_BREAK, 1.0F, -1.0F, aX, aY, aZ);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_DataOrb.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_DataOrb.java
new file mode 100644
index 0000000000..ae0627446c
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_DataOrb.java
@@ -0,0 +1,105 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_DataOrb extends Behaviour_None {
+
+ public static void copyInventory(ItemStack[] aInventory, ItemStack[] aNewContent, int aIndexlength) {
+ for (int i = 0; i < aIndexlength; i++) {
+ if (aNewContent[i] == null) {
+ aInventory[i] = null;
+ } else {
+ aInventory[i] = GT_Utility.copyOrNull(aNewContent[i]);
+ }
+ }
+ }
+
+ public static String getDataName(ItemStack aStack) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ return "";
+ }
+ return tNBT.getString("mDataName");
+ }
+
+ public static String getDataTitle(ItemStack aStack) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ return "";
+ }
+ return tNBT.getString("mDataTitle");
+ }
+
+ public static NBTTagCompound setDataName(ItemStack aStack, String aDataName) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ }
+ tNBT.setString("mDataName", aDataName);
+ aStack.setTagCompound(tNBT);
+ return tNBT;
+ }
+
+ public static NBTTagCompound setDataTitle(ItemStack aStack, String aDataTitle) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ }
+ tNBT.setString("mDataTitle", aDataTitle);
+ aStack.setTagCompound(tNBT);
+ return tNBT;
+ }
+
+ public static ItemStack[] getNBTInventory(ItemStack aStack) {
+ ItemStack[] tInventory = new ItemStack[256];
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ return tInventory;
+ }
+ NBTTagList tNBT_ItemList = tNBT.getTagList("Inventory", 10);
+ for (int i = 0; i < tNBT_ItemList.tagCount(); i++) {
+ NBTTagCompound tag = tNBT_ItemList.getCompoundTagAt(i);
+ byte slot = tag.getByte("Slot");
+ if (slot >= 0) {
+ tInventory[slot] = GT_Utility.loadItem(tag);
+ }
+ }
+ return tInventory;
+ }
+
+ public static NBTTagCompound setNBTInventory(ItemStack aStack, ItemStack[] aInventory) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ }
+ NBTTagList tNBT_ItemList = new NBTTagList();
+ for (int i = 0; i < aInventory.length; i++) {
+ ItemStack stack = aInventory[i];
+ if (stack != null) {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setByte("Slot", (byte) i);
+ stack.writeToNBT(tag);
+ tNBT_ItemList.appendTag(tag);
+ }
+ }
+ tNBT.setTag("Inventory", tNBT_ItemList);
+ aStack.setTagCompound(tNBT);
+ return tNBT;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ if (!(getDataTitle(aStack).length() == 0)) {
+ aList.add(getDataTitle(aStack));
+ aList.add(getDataName(aStack));
+ }
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_DataStick.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_DataStick.java
new file mode 100644
index 0000000000..e9db3195c2
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_DataStick.java
@@ -0,0 +1,52 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_DataStick extends Behaviour_None {
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ String tString = GT_Utility.ItemNBT.getBookTitle(aStack);
+ if (GT_Utility.isStringValid(tString)) {
+ aList.add(tString);
+ }
+ tString = GT_Utility.ItemNBT.getBookAuthor(aStack);
+ if (GT_Utility.isStringValid(tString)) {
+ aList.add("by " + tString);
+ }
+ short tMapID = GT_Utility.ItemNBT.getMapID(aStack);
+ if (tMapID >= 0) {
+ aList.add("Map ID: " + tMapID);
+ }
+ tString = GT_Utility.ItemNBT.getPunchCardData(aStack);
+ if (GT_Utility.isStringValid(tString)) {
+ aList.add("Punch Card Data");
+ int i = 0;
+ int j = tString.length();
+ for (; i < j; i += 64) {
+ aList.add(tString.substring(i, Math.min(i + 64, j)));
+ }
+ }
+ short sTier = GT_Utility.ItemNBT.getNBT(aStack)
+ .getShort("rocket_tier");
+ if (sTier > 0 && sTier < 100) {
+ aList.add("Rocket Schematic Tier: " + sTier);
+ } else if (sTier >= 100) {
+ switch (sTier) {
+ case 100 -> aList.add("Moonbuggy Schematic");
+ case 101 -> aList.add("Cargo-Rocket Schematic");
+ case 102 -> aList.add("Astro-Miner Schematic");
+ }
+ }
+ long lastUpdate = GT_Utility.ItemNBT.getNBT(aStack)
+ .getLong("lastUpdate");
+ if (lastUpdate != 0) aList.add(String.format("Last update at: %tc", lastUpdate));
+
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Hoe.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Hoe.java
new file mode 100644
index 0000000000..167eccdf49
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Hoe.java
@@ -0,0 +1,72 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.player.UseHoeEvent;
+
+import cpw.mods.fml.common.eventhandler.Event;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder;
+
+public class Behaviour_Hoe extends Behaviour_None {
+
+ private final int mCosts;
+ private final String mTooltip = GT_LanguageManager.addStringLocalization("gt.behaviour.hoe", "Can till Dirt");
+
+ public Behaviour_Hoe(int aCosts) {
+ this.mCosts = aCosts;
+ }
+
+ @Override
+ public boolean onItemUse(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, int ordinalSide, float hitX, float hitY, float hitZ) {
+ if (!aPlayer.canPlayerEdit(aX, aY, aZ, ordinalSide, aStack)) {
+ return false;
+ }
+ UseHoeEvent event = new UseHoeEvent(aPlayer, aStack, aWorld, aX, aY, aZ);
+ if (MinecraftForge.EVENT_BUS.post(event)) {
+ return false;
+ }
+ if (event.getResult() == Event.Result.ALLOW) {
+ if (!aPlayer.capabilities.isCreativeMode) {
+ ((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts);
+ }
+ return true;
+ }
+ Block aBlock = aWorld.getBlock(aX, aY, aZ);
+ if ((ordinalSide != 0) && (GT_Utility.isBlockAir(aWorld, aX, aY + 1, aZ))
+ && ((aBlock == Blocks.grass) || (aBlock == Blocks.dirt))) {
+ new WorldSpawnedEventBuilder.SoundEventBuilder()
+ .setVolume((Blocks.farmland.stepSound.getVolume() + 1.0F) / 2.0F)
+ .setPitch(Blocks.farmland.stepSound.getPitch() * 0.8F)
+ .setIdentifier(Blocks.farmland.stepSound.getStepResourcePath())
+ .setPosition(aX + 0.5F, aY + 0.5F, aZ + 0.5F)
+ .setWorld(aWorld)
+ .run();
+ if (aWorld.isRemote) {
+ return true;
+ }
+ aWorld.setBlock(aX, aY, aZ, Blocks.farmland);
+ if (!aPlayer.capabilities.isCreativeMode) {
+ ((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Lighter.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Lighter.java
new file mode 100644
index 0000000000..a4c26e2254
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Lighter.java
@@ -0,0 +1,140 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.monster.EntityCreeper;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import codechicken.lib.math.MathHelper;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_Lighter extends Behaviour_None {
+
+ private final ItemStack mEmptyLighter;
+ private final ItemStack mUsedLighter;
+ private final ItemStack mFullLighter;
+ private final long mFuelAmount;
+ private final String mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.lighter.tooltip", "Can light things on Fire");
+ private final String mTooltipUses = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.lighter.uses", "Remaining Uses:");
+ private final String mTooltipUnstackable = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.unstackable", "Not usable when stacked!");
+
+ public Behaviour_Lighter(ItemStack aEmptyLighter, ItemStack aUsedLighter, ItemStack aFullLighter,
+ long aFuelAmount) {
+ this.mFullLighter = aFullLighter;
+ this.mUsedLighter = aUsedLighter;
+ this.mEmptyLighter = aEmptyLighter;
+ this.mFuelAmount = aFuelAmount;
+ }
+
+ @Override
+ public boolean onLeftClickEntity(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) {
+ if ((aPlayer.worldObj.isRemote) || (aStack.stackSize != 1)) {
+ return false;
+ }
+ boolean rOutput = false;
+ if ((aEntity instanceof EntityCreeper)) {
+ prepare(aStack);
+ long tFuelAmount = GT_Utility.ItemNBT.getLighterFuel(aStack);
+ if (GT_Utility.areStacksEqual(aStack, this.mUsedLighter, true)) {
+ GT_Utility.sendSoundToPlayers(
+ aPlayer.worldObj,
+ SoundResource.FIRE_IGNITE,
+ 1.0F,
+ 1.0F,
+ MathHelper.floor_double(aEntity.posX),
+ MathHelper.floor_double(aEntity.posY),
+ MathHelper.floor_double(aEntity.posZ));
+ ((EntityCreeper) aEntity).func_146079_cb();
+ if (!aPlayer.capabilities.isCreativeMode) {
+ tFuelAmount -= 1L;
+ }
+ rOutput = true;
+ }
+ GT_Utility.ItemNBT.setLighterFuel(aStack, tFuelAmount);
+ if (tFuelAmount <= 0L) {
+ useUp(aStack);
+ }
+ }
+ return rOutput;
+ }
+
+ @Override
+ public boolean onItemUse(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, int ordinalSide, float hitX, float hitY, float hitZ) {
+ return false;
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ if ((aWorld.isRemote) || (aStack.stackSize != 1)) {
+ return false;
+ }
+ boolean rOutput = false;
+
+ aX += side.offsetX;
+ aY += side.offsetY;
+ aZ += side.offsetZ;
+ if ((!GT_Utility.isBlockAir(aWorld, aX, aY, aZ))
+ || (!aPlayer.canPlayerEdit(aX, aY, aZ, side.ordinal(), aStack))) {
+ return false;
+ }
+ prepare(aStack);
+ long tFuelAmount = GT_Utility.ItemNBT.getLighterFuel(aStack);
+ if (GT_Utility.areStacksEqual(aStack, this.mUsedLighter, true)) {
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.FIRE_IGNITE, 1.0F, 1.0F, aX, aY, aZ);
+ aWorld.setBlock(aX, aY, aZ, Blocks.fire);
+ if (!aPlayer.capabilities.isCreativeMode) {
+ tFuelAmount -= 1L;
+ }
+ rOutput = true;
+ }
+ GT_Utility.ItemNBT.setLighterFuel(aStack, tFuelAmount);
+ if (tFuelAmount <= 0L) {
+ useUp(aStack);
+ }
+ return rOutput;
+ }
+
+ private void prepare(ItemStack aStack) {
+ if (GT_Utility.areStacksEqual(aStack, this.mFullLighter, true)) {
+ aStack.func_150996_a(this.mUsedLighter.getItem());
+ Items.feather.setDamage(aStack, Items.feather.getDamage(this.mUsedLighter));
+ GT_Utility.ItemNBT.setLighterFuel(aStack, this.mFuelAmount);
+ }
+ }
+
+ private void useUp(ItemStack aStack) {
+ if (this.mEmptyLighter == null) {
+ aStack.stackSize -= 1;
+ } else {
+ aStack.func_150996_a(this.mEmptyLighter.getItem());
+ Items.feather.setDamage(aStack, Items.feather.getDamage(this.mEmptyLighter));
+ }
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ long tFuelAmount = tNBT == null ? this.mFuelAmount
+ : GT_Utility.areStacksEqual(aStack, this.mFullLighter, true) ? this.mFuelAmount
+ : tNBT.getLong("GT.LighterFuel");
+ aList.add(this.mTooltipUses + " " + tFuelAmount);
+ aList.add(this.mTooltipUnstackable);
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_None.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_None.java
new file mode 100644
index 0000000000..4ce7f60da0
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_None.java
@@ -0,0 +1,96 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+import net.minecraft.block.BlockDispenser;
+import net.minecraft.dispenser.BehaviorDefaultDispenseItem;
+import net.minecraft.dispenser.IBlockSource;
+import net.minecraft.dispenser.IPosition;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.SubTag;
+import gregtech.api.interfaces.IItemBehaviour;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_None implements IItemBehaviour<GT_MetaBase_Item> {
+
+ @Override
+ public boolean onLeftClickEntity(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) {
+ return false;
+ }
+
+ @Override
+ public boolean onItemUse(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, int ordinalSide, float hitX, float hitY, float hitZ) {
+ return false;
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ return false;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(GT_MetaBase_Item aItem, ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ return aStack;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ return aList;
+ }
+
+ @Override
+ public void onUpdate(GT_MetaBase_Item aItem, ItemStack aStack, World aWorld, Entity aPlayer, int aTimer,
+ boolean aIsInHand) {}
+
+ @Override
+ public boolean isItemStackUsable(GT_MetaBase_Item aItem, ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public boolean canDispense(GT_MetaBase_Item aItem, IBlockSource aSource, ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public ItemStack onDispense(GT_MetaBase_Item aItem, IBlockSource aSource, ItemStack aStack) {
+ EnumFacing enumfacing = BlockDispenser.func_149937_b(aSource.getBlockMetadata());
+ IPosition iposition = BlockDispenser.func_149939_a(aSource);
+ ItemStack itemstack1 = aStack.splitStack(1);
+ BehaviorDefaultDispenseItem.doDispense(aSource.getWorld(), itemstack1, 6, enumfacing, iposition);
+ return aStack;
+ }
+
+ @Override
+ public boolean hasProjectile(GT_MetaBase_Item aItem, SubTag aProjectileType, ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public EntityArrow getProjectile(GT_MetaBase_Item aItem, SubTag aProjectileType, ItemStack aStack, World aWorld,
+ double aX, double aY, double aZ) {
+ return null;
+ }
+
+ @Override
+ public EntityArrow getProjectile(GT_MetaBase_Item aItem, SubTag aProjectileType, ItemStack aStack, World aWorld,
+ EntityLivingBase aEntity, float aSpeed) {
+ return null;
+ }
+
+ @Deprecated
+ public String trans(String aKey, String aEnglish) {
+ return GT_Utility.trans(aKey, aEnglish);
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Essentia.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Essentia.java
new file mode 100644
index 0000000000..867eb25103
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Essentia.java
@@ -0,0 +1,54 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+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;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import thaumcraft.api.aspects.IEssentiaTransport;
+
+public class Behaviour_Plunger_Essentia extends Behaviour_None {
+
+ private final int mCosts;
+ private final String mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.plunger.essentia", "Clears Essentia from Containers and Tubes");
+
+ public Behaviour_Plunger_Essentia(int aCosts) {
+ this.mCosts = aCosts;
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ if (aWorld.isRemote) {
+ return false;
+ }
+ TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (((aTileEntity instanceof IEssentiaTransport)) && ((aPlayer.capabilities.isCreativeMode)
+ || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts)))) {
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ);
+ for (ForgeDirection tDirection : ForgeDirection.VALID_DIRECTIONS) {
+ ((IEssentiaTransport) aTileEntity).takeEssentia(
+ ((IEssentiaTransport) aTileEntity).getEssentiaType(tDirection),
+ ((IEssentiaTransport) aTileEntity).getEssentiaAmount(tDirection),
+ tDirection);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Fluid.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Fluid.java
new file mode 100644
index 0000000000..c62cb5c4e5
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Fluid.java
@@ -0,0 +1,75 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+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;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_Plunger_Fluid extends Behaviour_None {
+
+ private final int mCosts;
+ private final String mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.plunger.fluid", "Clears 1000 Liters of Fluid from Tanks");
+
+ public Behaviour_Plunger_Fluid(int aCosts) {
+ this.mCosts = aCosts;
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ if (aWorld.isRemote) {
+ return false;
+ }
+ TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if ((aTileEntity instanceof IFluidHandler)) {
+ for (ForgeDirection tDirection : ForgeDirection.VALID_DIRECTIONS) {
+ if (((IFluidHandler) aTileEntity).drain(tDirection, 1000, false) != null) {
+ if ((aPlayer.capabilities.isCreativeMode)
+ || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) {
+ ((IFluidHandler) aTileEntity).drain(tDirection, 1000, true);
+ GT_Utility.sendSoundToPlayers(
+ aWorld,
+ SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE,
+ 1.0F,
+ -1.0F,
+ aX,
+ aY,
+ aZ);
+ return true;
+ }
+ }
+ }
+ }
+ if (aTileEntity instanceof IGregTechTileEntity tTileEntity) {
+ IMetaTileEntity mTileEntity = tTileEntity.getMetaTileEntity();
+ if (mTileEntity instanceof GT_MetaTileEntity_BasicTank machine) {
+ if (machine.mFluid != null && machine.mFluid.amount > 0)
+ machine.mFluid.amount = machine.mFluid.amount - Math.min(machine.mFluid.amount, 1000);
+ GT_Utility
+ .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Item.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Item.java
new file mode 100644
index 0000000000..a5fa868a00
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Item.java
@@ -0,0 +1,88 @@
+package gregtech.common.items.behaviors;
+
+import java.util.HashMap;
+import java.util.List;
+
+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.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntityItemPipe;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_Plunger_Item extends Behaviour_None {
+
+ private final int mCosts;
+ private final String mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.plunger.item", "Clears Items from Pipes");
+
+ public Behaviour_Plunger_Item(int aCosts) {
+ this.mCosts = aCosts;
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ if (aWorld.isRemote) {
+ return false;
+ }
+ TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (aTileEntity instanceof IGregTechTileEntity gtTE) {
+ IMetaTileEntity tMetaTileEntity = gtTE.getMetaTileEntity();
+ if ((tMetaTileEntity instanceof IMetaTileEntityItemPipe)) {
+ for (IMetaTileEntityItemPipe tTileEntity : GT_Utility
+ .sortMapByValuesAcending(
+ IMetaTileEntityItemPipe.Util
+ .scanPipes((IMetaTileEntityItemPipe) tMetaTileEntity, new HashMap<>(), 0L, false, true))
+ .keySet()) {
+ int i = 0;
+ for (int j = tTileEntity.getSizeInventory(); i < j; i++) {
+ if (tTileEntity.isValidSlot(i)) {
+ if ((tTileEntity.getStackInSlot(i) != null) && ((aPlayer.capabilities.isCreativeMode)
+ || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts)))) {
+ final ItemStack tStack = tTileEntity.decrStackSize(i, 64);
+ if (tStack != null) {
+ final EntityItem tEntity = new EntityItem(
+ aWorld,
+ gtTE.getOffsetX(side, 1) + 0.5D,
+ gtTE.getOffsetY(side, 1) + 0.5D,
+ gtTE.getOffsetZ(side, 1) + 0.5D,
+ tStack);
+ tEntity.motionX = 0.0D;
+ tEntity.motionY = 0.0D;
+ tEntity.motionZ = 0.0D;
+ aWorld.spawnEntityInWorld(tEntity);
+ GT_Utility.sendSoundToPlayers(
+ aWorld,
+ SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE,
+ 1.0F,
+ -1.0F,
+ aX,
+ aY,
+ aZ);
+ }
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_PrintedPages.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_PrintedPages.java
new file mode 100644
index 0000000000..e3c4d58525
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_PrintedPages.java
@@ -0,0 +1,39 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_PrintedPages extends Behaviour_None {
+
+ public static String getTitle(ItemStack aStack) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ return "";
+ }
+ return tNBT.getString("title");
+ }
+
+ public static String getAuthor(ItemStack aStack) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ return "";
+ }
+ return tNBT.getString("author");
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ if (GT_Utility.isStringValid(getTitle(aStack))) {
+ aList.add(getTitle(aStack));
+ }
+ if (GT_Utility.isStringValid(getAuthor(aStack))) {
+ aList.add("by " + getAuthor(aStack));
+ }
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Prospecting.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Prospecting.java
new file mode 100644
index 0000000000..e64722fb87
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Prospecting.java
@@ -0,0 +1,159 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockLiquid;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.IFluidBlock;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.objects.ItemData;
+import gregtech.api.objects.XSTR;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Block_Ores_Abstract;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+
+public class Behaviour_Prospecting extends Behaviour_None {
+
+ private final int mVanillaCosts;
+ private final int mEUCosts;
+ private final String mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.prospecting", "Usable for Prospecting");
+
+ public Behaviour_Prospecting(int aVanillaCosts, int aEUCosts) {
+ this.mVanillaCosts = aVanillaCosts;
+ this.mEUCosts = aEUCosts;
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ if (aWorld.isRemote) {
+ return false;
+ }
+ Block aBlock = aWorld.getBlock(aX, aY, aZ);
+ if (aBlock == null) {
+ return false;
+ }
+ byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ);
+
+ ItemData tAssociation = GT_OreDictUnificator.getAssociation(new ItemStack(aBlock, 1, aMeta));
+ if (tAssociation != null && tAssociation.mPrefix != null
+ && tAssociation.mMaterial != null
+ && tAssociation.mPrefix.toString()
+ .startsWith("ore")) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("100", "This is ") + tAssociation.mMaterial.mMaterial.mDefaultLocalName
+ + GT_Utility.trans("101", " Ore."));
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_ANVIL_USE, 1.0F, -1.0F, aX, aY, aZ);
+ return true;
+ }
+
+ if (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.stone)
+ || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.netherrack)
+ || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.end_stone)
+ || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockStones)
+ || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTech_API.sBlockGranites)
+ || aBlock == GregTech_API.sBlockOresUb1
+ || aBlock == GregTech_API.sBlockOresUb2
+ || aBlock == GregTech_API.sBlockOresUb3
+ || aBlock == GregTech_API.sBlockOres1) {
+ if (GT_ModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) {
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_ANVIL_USE, 1.0F, -1.0F, aX, aY, aZ);
+ int tMetaID;
+ int tQuality = aItem instanceof GT_MetaGenerated_Tool ? aItem.getHarvestLevel(aStack, "") : 0;
+ int tX = aX, tY = aY, tZ = aZ;
+ Block tBlock;
+ for (int i = 0, j = 6 + tQuality; i < j; i++) {
+ tX -= side.offsetX;
+ tY -= side.offsetY;
+ tZ -= side.offsetZ;
+
+ tBlock = aWorld.getBlock(tX, tY, tZ);
+ if (tBlock == Blocks.lava || tBlock == Blocks.flowing_lava) {
+ GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("102", "There is Lava behind this Rock."));
+ break;
+ }
+ if (tBlock instanceof BlockLiquid || tBlock instanceof IFluidBlock) {
+ GT_Utility
+ .sendChatToPlayer(aPlayer, GT_Utility.trans("103", "There is a Liquid behind this Rock."));
+ break;
+ }
+ if (tBlock == Blocks.monster_egg || !GT_Utility.hasBlockHitBox(aWorld, tX, tY, tZ)) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("104", "There is an Air Pocket behind this Rock."));
+ break;
+ }
+ if (tBlock != aBlock) {
+ if (i < 4) GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("105", "Material is changing behind this Rock."));
+ break;
+ }
+ }
+
+ final Random tRandom = new XSTR(aX ^ aY ^ aZ ^ side.ordinal());
+ for (int i = 0, j = 9 + 2 * tQuality; i < j; i++) {
+ tX = aX - 4 - tQuality + tRandom.nextInt(j);
+ tY = aY - 4 - tQuality + tRandom.nextInt(j);
+ tZ = aZ - 4 - tQuality + tRandom.nextInt(j);
+ tBlock = aWorld.getBlock(tX, tY, tZ);
+ if (tBlock instanceof GT_Block_Ores_Abstract) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(tX, tY, tZ);
+ if (tTileEntity instanceof GT_TileEntity_Ores) {
+ final Materials tMaterial = GregTech_API.sGeneratedMaterials[((GT_TileEntity_Ores) tTileEntity).mMetaData
+ % 1000];
+ if (tMaterial != null && tMaterial != Materials._NULL) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("106", "Found traces of ") + tMaterial.mDefaultLocalName
+ + GT_Utility.trans("101", " Ore."));
+ return true;
+ }
+ }
+ } else {
+ tMetaID = aWorld.getBlockMetadata(tX, tY, tZ);
+ tAssociation = GT_OreDictUnificator.getAssociation(new ItemStack(tBlock, 1, tMetaID));
+ if (tAssociation != null && tAssociation.mPrefix != null
+ && tAssociation.mMaterial != null
+ && tAssociation.mPrefix.toString()
+ .startsWith("ore")) {
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ GT_Utility.trans("106", "Found traces of ")
+ + tAssociation.mMaterial.mMaterial.mDefaultLocalName
+ + GT_Utility.trans("101", " Ore."));
+ return true;
+ }
+ }
+ }
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("107", "No Ores found."));
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Scanner.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Scanner.java
new file mode 100644
index 0000000000..22b708e384
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Scanner.java
@@ -0,0 +1,65 @@
+package gregtech.common.items.behaviors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+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.common.util.ForgeDirection;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IItemBehaviour;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_Scanner extends Behaviour_None {
+
+ public static final IItemBehaviour<GT_MetaBase_Item> INSTANCE = new Behaviour_Scanner();
+ private final String mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.scanning", "Can scan Blocks in World");
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ final NBTTagCompound tNBT = aStack.getTagCompound();
+ if (((aPlayer instanceof EntityPlayerMP)) && (aItem.canUse(aStack, 20000.0D))) {
+ final ArrayList<String> tList = new ArrayList<>();
+ if (aItem.use(
+ aStack,
+ GT_Utility.getCoordinateScan(tList, aPlayer, aWorld, 1, aX, aY, aZ, side, hitX, hitY, hitZ),
+ aPlayer)) {
+ final int tList_sS = tList.size();
+ tNBT.setInteger("dataLinesCount", tList_sS);
+ for (int i = 0; i < tList_sS; i++) {
+ tNBT.setString("dataLines" + i, tList.get(i));
+ GT_Utility.sendChatToPlayer(aPlayer, tList.get(i));
+ }
+ }
+ return true;
+ }
+ GT_Utility.doSoundAtClient(SoundResource.IC2_TOOLS_OD_SCANNER, 1, 1.0F, aX, aY, aZ);
+ // doGuiAtClient()
+ return aPlayer instanceof EntityPlayerMP;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ try {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ int lines = tNBT.getInteger("dataLinesCount");
+ if (lines < 1) throw new Exception();
+ aList.add(EnumChatFormatting.BLUE + "Block scan data result:");
+ for (int i = 0; i < lines; i++) {
+ aList.add(EnumChatFormatting.RESET + tNBT.getString("dataLines" + i));
+ }
+ } catch (Exception e) {
+ aList.add(this.mTooltip);
+ }
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Scoop.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Scoop.java
new file mode 100644
index 0000000000..65be65a96d
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Scoop.java
@@ -0,0 +1,63 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+
+import forestry.api.lepidopterology.EnumFlutterType;
+import forestry.api.lepidopterology.IButterfly;
+import forestry.api.lepidopterology.IEntityButterfly;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_LanguageManager;
+
+public class Behaviour_Scoop extends Behaviour_None {
+
+ private final int mCosts;
+ private final String mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.scoop", "Catches Butterflies on Leftclick");
+
+ public Behaviour_Scoop(int aCosts) {
+ this.mCosts = aCosts;
+ }
+
+ @Override
+ public boolean onLeftClickEntity(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) {
+ if ((aEntity instanceof IEntityButterfly)) {
+ if (aPlayer.worldObj.isRemote) {
+ return true;
+ }
+ if ((aPlayer.capabilities.isCreativeMode)
+ || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) {
+ IButterfly tButterfly = ((IEntityButterfly) aEntity).getButterfly();
+ tButterfly.getGenome()
+ .getPrimary()
+ .getRoot()
+ .getBreedingTracker(aEntity.worldObj, aPlayer.getGameProfile())
+ .registerCatch(tButterfly);
+ aPlayer.worldObj.spawnEntityInWorld(
+ new EntityItem(
+ aPlayer.worldObj,
+ aEntity.posX,
+ aEntity.posY,
+ aEntity.posZ,
+ tButterfly.getGenome()
+ .getPrimary()
+ .getRoot()
+ .getMemberStack(tButterfly.copy(), EnumFlutterType.BUTTERFLY.ordinal())));
+ aEntity.setDead();
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Screwdriver.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Screwdriver.java
new file mode 100644
index 0000000000..d940226b84
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Screwdriver.java
@@ -0,0 +1,52 @@
+package gregtech.common.items.behaviors;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_Screwdriver extends Behaviour_None {
+
+ private final int mVanillaCosts;
+ private final int mEUCosts;
+
+ public Behaviour_Screwdriver(int aVanillaCosts, int aEUCosts) {
+ this.mVanillaCosts = aVanillaCosts;
+ this.mEUCosts = aEUCosts;
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ if (aWorld.isRemote) {
+ return false;
+ }
+ Block aBlock = aWorld.getBlock(aX, aY, aZ);
+ if (aBlock == null) {
+ return false;
+ }
+ byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ);
+ if ((aBlock == Blocks.unpowered_repeater) || (aBlock == Blocks.powered_repeater)) {
+ if (GT_ModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) {
+ aWorld.setBlockMetadataWithNotify(aX, aY, aZ, aMeta / 4 * 4 + (aMeta % 4 + 1) % 4, 3);
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1.0F, aX, aY, aZ);
+ }
+ return true;
+ }
+ if ((aBlock == Blocks.unpowered_comparator) || (aBlock == Blocks.powered_comparator)) {
+ if (GT_ModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) {
+ aWorld.setBlockMetadataWithNotify(aX, aY, aZ, aMeta / 4 * 4 + (aMeta % 4 + 1) % 4, 3);
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1.0F, aX, aY, aZ);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Sense.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Sense.java
new file mode 100644
index 0000000000..b2ab0031ad
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Sense.java
@@ -0,0 +1,56 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+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;
+
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_LanguageManager;
+import ic2.api.crops.ICropTile;
+
+public class Behaviour_Sense extends Behaviour_None {
+
+ private final int mCosts;
+ private final String mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.sense", "Rightclick to harvest Crop Sticks");
+
+ public Behaviour_Sense(int aCosts) {
+ this.mCosts = aCosts;
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ if (aWorld.isRemote) {
+ return false;
+ }
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if ((tTileEntity instanceof ICropTile)) {
+ for (int i = -2; i < 3; i++) {
+ for (int j = -2; j < 3; j++) {
+ for (int k = -2; k < 3; k++) {
+ if ((aStack.stackSize > 0)
+ && (((tTileEntity = aWorld.getTileEntity(aX + i, aY + j, aZ + k)) instanceof ICropTile))
+ && (((ICropTile) tTileEntity).harvest(true))
+ && (!aPlayer.capabilities.isCreativeMode)) {
+ ((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts / 20);
+ }
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_SensorKit.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_SensorKit.java
new file mode 100644
index 0000000000..b12159d058
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_SensorKit.java
@@ -0,0 +1,56 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_SensorKit extends Behaviour_None {
+
+ private final String mTooltip = GT_LanguageManager.addStringLocalization(
+ "gt.behaviour.sensorkit.tooltip",
+ "Used to display Information using the Mod Nuclear Control");
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ if ((aPlayer instanceof EntityPlayerMP)) {
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (((tTileEntity instanceof IInventory)) && (!((IInventory) tTileEntity).isUseableByPlayer(aPlayer))) {
+ return false;
+ }
+ if (((tTileEntity instanceof IGregTechDeviceInformation))
+ && (((IGregTechDeviceInformation) tTileEntity).isGivingInformation())) {
+ GT_Utility.setStack(aStack, ItemList.NC_SensorCard.get(aStack.stackSize));
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ }
+ tNBT.setInteger("x", aX);
+ tNBT.setInteger("y", aY);
+ tNBT.setInteger("z", aZ);
+ aStack.setTagCompound(tNBT);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_SoftHammer.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_SoftHammer.java
new file mode 100644
index 0000000000..159a0c4b27
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_SoftHammer.java
@@ -0,0 +1,131 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_SoftHammer extends Behaviour_None {
+
+ private final int mCosts;
+ private final String mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.softhammer", "Activates and Deactivates Machines");
+
+ public Behaviour_SoftHammer(int aCosts) {
+ this.mCosts = aCosts;
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ if (aWorld.isRemote) {
+ return false;
+ }
+ Block aBlock = aWorld.getBlock(aX, aY, aZ);
+ if (aBlock == null) {
+ return false;
+ }
+ byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ);
+ if (aBlock == Blocks.lit_redstone_lamp) {
+ if ((aPlayer.capabilities.isCreativeMode)
+ || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) {
+ aWorld.isRemote = true;
+ aWorld.setBlock(aX, aY, aZ, Blocks.redstone_lamp, 0, 0);
+ aWorld.isRemote = false;
+ GT_Utility
+ .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ);
+ }
+ return true;
+ }
+ if (aBlock == Blocks.redstone_lamp) {
+ if ((aPlayer.capabilities.isCreativeMode)
+ || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) {
+ aWorld.isRemote = true;
+ aWorld.setBlock(aX, aY, aZ, Blocks.lit_redstone_lamp, 0, 0);
+ aWorld.isRemote = false;
+ GT_Utility
+ .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ);
+ }
+ return true;
+ }
+ if (aBlock == Blocks.golden_rail) {
+ if ((aPlayer.capabilities.isCreativeMode)
+ || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) {
+ aWorld.isRemote = true;
+ aWorld.setBlock(aX, aY, aZ, aBlock, (aMeta + 8) % 16, 0);
+ aWorld.isRemote = false;
+ GT_Utility
+ .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ);
+ }
+ return true;
+ }
+ if (aBlock == Blocks.activator_rail) {
+ if ((aPlayer.capabilities.isCreativeMode)
+ || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) {
+ aWorld.isRemote = true;
+ aWorld.setBlock(aX, aY, aZ, aBlock, (aMeta + 8) % 16, 0);
+ aWorld.isRemote = false;
+ GT_Utility
+ .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ);
+ }
+ return true;
+ }
+ if ((aBlock == Blocks.log) || (aBlock == Blocks.log2) || (aBlock == Blocks.hay_block)) {
+ if ((aPlayer.capabilities.isCreativeMode)
+ || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) {
+ aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (aMeta + 4) % 12, 3);
+ }
+ return true;
+ }
+ if ((aBlock == Blocks.piston) || (aBlock == Blocks.sticky_piston)
+ || (aBlock == Blocks.dispenser)
+ || (aBlock == Blocks.dropper)) {
+ if ((aPlayer.capabilities.isCreativeMode)
+ || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) {
+ aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (aMeta + 1) % 6, 3);
+ GT_Utility
+ .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ);
+ }
+ return true;
+ }
+ if ((aBlock == Blocks.pumpkin) || (aBlock == Blocks.lit_pumpkin)
+ || (aBlock == Blocks.furnace)
+ || (aBlock == Blocks.lit_furnace)
+ || (aBlock == Blocks.chest)
+ || (aBlock == Blocks.trapped_chest)) {
+ if ((aPlayer.capabilities.isCreativeMode)
+ || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) {
+ aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (aMeta - 1) % 4 + 2, 3);
+ GT_Utility
+ .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ);
+ }
+ return true;
+ }
+ if (aBlock == Blocks.hopper) {
+ if ((aPlayer.capabilities.isCreativeMode)
+ || (((GT_MetaGenerated_Tool) aItem).doDamage(aStack, this.mCosts))) {
+ aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (aMeta + 1) % 6 != 1 ? (aMeta + 1) % 6 : 2, 3);
+ GT_Utility
+ .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Sonictron.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Sonictron.java
new file mode 100644
index 0000000000..dbab764507
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Sonictron.java
@@ -0,0 +1,135 @@
+package gregtech.common.items.behaviors;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+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 gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.IItemBehaviour;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_Sonictron extends Behaviour_None {
+
+ public static final IItemBehaviour<GT_MetaBase_Item> INSTANCE = new Behaviour_Sonictron();
+
+ public static int getCurrentIndex(ItemStack aStack) {
+ NBTTagCompound tNBTTagCompound = aStack.getTagCompound();
+ if (tNBTTagCompound == null) {
+ tNBTTagCompound = new NBTTagCompound();
+ }
+ return tNBTTagCompound.getInteger("mCurrentIndex");
+ }
+
+ public static int getTickTimer(ItemStack aStack) {
+ NBTTagCompound tNBTTagCompound = aStack.getTagCompound();
+ if (tNBTTagCompound == null) {
+ tNBTTagCompound = new NBTTagCompound();
+ }
+ return tNBTTagCompound.getInteger("mTickTimer");
+ }
+
+ public static NBTTagCompound setCurrentIndex(ItemStack aStack, int aIndex) {
+ NBTTagCompound tNBTTagCompound = aStack.getTagCompound();
+ if (tNBTTagCompound == null) {
+ tNBTTagCompound = new NBTTagCompound();
+ }
+ tNBTTagCompound.setInteger("mCurrentIndex", aIndex);
+ return tNBTTagCompound;
+ }
+
+ public static NBTTagCompound setTickTimer(ItemStack aStack, int aTime) {
+ NBTTagCompound tNBTTagCompound = aStack.getTagCompound();
+ if (tNBTTagCompound == null) {
+ tNBTTagCompound = new NBTTagCompound();
+ }
+ tNBTTagCompound.setInteger("mTickTimer", aTime);
+ return tNBTTagCompound;
+ }
+
+ public static ItemStack[] getNBTInventory(ItemStack aStack) {
+ ItemStack[] tInventory = new ItemStack[64];
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ return tInventory;
+ }
+ NBTTagList tNBT_ItemList = tNBT.getTagList("Inventory", 10);
+ for (int i = 0; i < tNBT_ItemList.tagCount(); i++) {
+ NBTTagCompound tag = tNBT_ItemList.getCompoundTagAt(i);
+ byte slot = tag.getByte("Slot");
+ if ((slot >= 0) && (slot < tInventory.length)) {
+ tInventory[slot] = GT_Utility.loadItem(tag);
+ }
+ }
+ return tInventory;
+ }
+
+ public static NBTTagCompound setNBTInventory(ItemStack aStack, ItemStack[] aInventory) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ }
+ NBTTagList tNBT_ItemList = new NBTTagList();
+ for (int i = 0; i < aInventory.length; i++) {
+ ItemStack stack = aInventory[i];
+ if (stack != null) {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setByte("Slot", (byte) i);
+ stack.writeToNBT(tag);
+ tNBT_ItemList.appendTag(tag);
+ }
+ }
+ tNBT.setTag("Inventory", tNBT_ItemList);
+ aStack.setTagCompound(tNBT);
+ return tNBT;
+ }
+
+ public static void copyInventory(ItemStack[] aInventory, ItemStack[] aNewContent, int aIndexlength) {
+ for (int i = 0; i < aIndexlength; i++) {
+ if (aNewContent[i] == null) {
+ aInventory[i] = null;
+ } else {
+ aInventory[i] = GT_Utility.copyOrNull(aNewContent[i]);
+ }
+ }
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ setCurrentIndex(aStack, -1);
+ return false;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(GT_MetaBase_Item aItem, ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ setCurrentIndex(aStack, 0);
+ return aStack;
+ }
+
+ @Override
+ public void onUpdate(GT_MetaBase_Item aItem, ItemStack aStack, World aWorld, Entity aPlayer, int aTimer,
+ boolean aIsInHand) {
+ int tTickTimer = getTickTimer(aStack);
+ int tCurrentIndex = getCurrentIndex(aStack);
+ if ((tTickTimer++ % 2 == 0) && (tCurrentIndex > -1)) {
+ ItemStack[] tInventory = getNBTInventory(aStack);
+ GT_Values.GT.doSonictronSound(
+ tInventory[tCurrentIndex],
+ aPlayer.worldObj,
+ aPlayer.posX,
+ aPlayer.posY,
+ aPlayer.posZ);
+ tCurrentIndex++;
+ if (tCurrentIndex > 63) {
+ tCurrentIndex = -1;
+ }
+ }
+ setTickTimer(aStack, tTickTimer);
+ setCurrentIndex(aStack, tCurrentIndex);
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color.java
new file mode 100644
index 0000000000..cbc698d474
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color.java
@@ -0,0 +1,222 @@
+package gregtech.common.items.behaviors;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockColored;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import appeng.api.implementations.tiles.IColorableTile;
+import appeng.api.util.AEColor;
+import appeng.block.networking.BlockCableBus;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_Spray_Color extends Behaviour_None {
+
+ private final ItemStack mEmpty;
+ private final ItemStack mUsed;
+ private final ItemStack mFull;
+ private final long mUses;
+ private final byte mColor;
+ private final Collection<Block> mAllowedVanillaBlocks = Arrays.asList(
+ Blocks.glass,
+ Blocks.glass_pane,
+ Blocks.stained_glass,
+ Blocks.stained_glass_pane,
+ Blocks.carpet,
+ Blocks.hardened_clay);
+ protected String mTooltip;
+ private final String mTooltipUses = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.paintspray.uses", "Remaining Uses:");
+ private final String mTooltipUnstackable = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.unstackable", "Not usable when stacked!");
+ private final String mTooltipChain = GT_LanguageManager.addStringLocalization(
+ "gt.behaviour.paintspray.chain",
+ "If used while sneaking it will spray a chain of blocks");
+
+ private final String mTooltipChainAmount = GT_LanguageManager.addStringLocalization(
+ "gt.behaviour.paintspray.chain",
+ "Sprays up to %d blocks, in the direction you're looking at");
+
+ public Behaviour_Spray_Color(ItemStack aEmpty, ItemStack aUsed, ItemStack aFull, long aUses, int aColor) {
+ this.mEmpty = aEmpty;
+ this.mUsed = aUsed;
+ this.mFull = aFull;
+ this.mUses = aUses;
+ this.mColor = ((byte) aColor);
+ this.mTooltip = GT_LanguageManager.addStringLocalization(
+ "gt.behaviour.paintspray." + this.mColor + ".tooltip",
+ "Can Color things in " + Dyes.get(this.mColor).mName);
+ }
+
+ public Behaviour_Spray_Color(ItemStack aEmpty, ItemStack aUsed, ItemStack aFull, long aUses) {
+ this.mEmpty = aEmpty;
+ this.mUsed = aUsed;
+ this.mFull = aFull;
+ this.mUses = aUses;
+ this.mColor = 0;
+ mTooltip = "";
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ if ((aWorld.isRemote) || (aStack.stackSize != 1)) {
+ return false;
+ }
+ boolean rOutput = false;
+ if (!aPlayer.canPlayerEdit(aX, aY, aZ, side.ordinal(), aStack)) {
+ return false;
+ }
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ }
+ long tUses = tNBT.getLong("GT.RemainingPaint");
+ if (GT_Utility.areStacksEqual(aStack, this.mFull, true)) {
+ aStack.func_150996_a(this.mUsed.getItem());
+ Items.feather.setDamage(aStack, Items.feather.getDamage(this.mUsed));
+ tUses = this.mUses;
+ }
+ int painted = 0;
+ int maxPainted = GregTech_API.sSpecialFile.get(ConfigCategories.general, "SprayCanChainRange", 256);
+ ForgeDirection lookSide;
+ Vec3 look = aPlayer.getLookVec();
+ double absX = Math.abs(look.xCoord);
+ double absY = Math.abs(look.yCoord);
+ double absZ = Math.abs(look.zCoord);
+ if (absX > absY && absX > absZ) {
+ lookSide = look.xCoord > 0 ? ForgeDirection.EAST : ForgeDirection.WEST;
+ } else if (absY > absX && absY > absZ) {
+ lookSide = look.yCoord > 0 ? ForgeDirection.UP : ForgeDirection.DOWN;
+ } else {
+ lookSide = look.zCoord > 0 ? ForgeDirection.SOUTH : ForgeDirection.NORTH;
+ }
+ Block initialBlock = aWorld.getBlock(aX, aY, aZ);
+ int initialBlockMeta = aWorld.getBlockMetadata(aX, aY, aZ);
+ TileEntity initialTE = aWorld.getTileEntity(aX, aY, aZ);
+ while ((GT_Utility.areStacksEqual(aStack, this.mUsed, true)) && (colorize(aWorld, aX, aY, aZ, side, aPlayer))) {
+ GT_Utility.sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_PAINTER, 1.0F, 1.0F, aX, aY, aZ);
+ if (!aPlayer.capabilities.isCreativeMode) {
+ tUses -= 1L;
+ }
+ rOutput = true;
+ painted++;
+ if (painted >= maxPainted && maxPainted != -1) break;
+ if (!aPlayer.isSneaking() || tUses <= 0) break;
+ switch (lookSide) {
+ case UP -> aY += 1;
+ case DOWN -> aY -= 1;
+ case NORTH -> aZ -= 1;
+ case SOUTH -> aZ += 1;
+ case WEST -> aX -= 1;
+ case EAST -> aX += 1;
+ default -> throw new IllegalArgumentException("Unexpected value: " + lookSide);
+ }
+
+ if (aWorld.getBlock(aX, aY, aZ) != initialBlock) break;
+ if (aWorld.getBlockMetadata(aX, aY, aZ) != initialBlockMeta) break;
+
+ /*
+ * Check if the initial block had a TE and if the next one does, check if its the same kind.
+ * else one does and the other doesnt, thus stop checking.
+ */
+ TileEntity targetTE = aWorld.getTileEntity(aX, aY, aZ);
+ if (initialTE == null ^ targetTE == null) break;
+ if (initialTE != null && targetTE != null) {
+ if (!initialTE.getClass()
+ .isInstance(targetTE)) break;
+
+ if (initialTE instanceof IGregTechTileEntity currentGTTile
+ && targetTE instanceof IGregTechTileEntity targetGTTile) {
+ if (currentGTTile.getMetaTileID() != targetGTTile.getMetaTileID()) break;
+ }
+ }
+ }
+ tNBT.removeTag("GT.RemainingPaint");
+ if (tUses > 0L) {
+ tNBT.setLong("GT.RemainingPaint", tUses);
+ }
+ if (tNBT.hasNoTags()) {
+ aStack.setTagCompound(null);
+ } else {
+ aStack.setTagCompound(tNBT);
+ }
+ if (tUses <= 0L) {
+ if (this.mEmpty == null) {
+ aStack.stackSize -= 1;
+ } else {
+ aStack.func_150996_a(this.mEmpty.getItem());
+ Items.feather.setDamage(aStack, Items.feather.getDamage(this.mEmpty));
+ }
+ }
+ return rOutput;
+ }
+
+ protected boolean colorize(World aWorld, int aX, int aY, int aZ, ForgeDirection side, EntityPlayer player) {
+ final Block aBlock = aWorld.getBlock(aX, aY, aZ);
+ if (aBlock != Blocks.air) {
+ if (this.mAllowedVanillaBlocks.contains(aBlock) || aBlock instanceof BlockColored) {
+ if (aBlock == Blocks.hardened_clay) {
+ aWorld.setBlock(aX, aY, aZ, Blocks.stained_hardened_clay, (~this.mColor) & 0xF, 3);
+ return true;
+ }
+ if (aBlock == Blocks.glass_pane) {
+ aWorld.setBlock(aX, aY, aZ, Blocks.stained_glass_pane, (~this.mColor) & 0xF, 3);
+ return true;
+ }
+ if (aBlock == Blocks.glass) {
+ aWorld.setBlock(aX, aY, aZ, Blocks.stained_glass, (~this.mColor) & 0xF, 3);
+ return true;
+ }
+ if (aWorld.getBlockMetadata(aX, aY, aZ) == ((~this.mColor) & 0xF)) {
+ return false;
+ }
+ aWorld.setBlockMetadataWithNotify(aX, aY, aZ, (~this.mColor) & 0xF, 3);
+ return true;
+ }
+
+ if (aBlock instanceof IColorableTile) {
+ return ((IColorableTile) aBlock).recolourBlock(side, AEColor.values()[(~this.mColor) & 0xF], player);
+ }
+
+ if (aBlock instanceof BlockCableBus) {
+ return ((BlockCableBus) aBlock).recolourBlock(aWorld, aX, aY, aZ, side, (~this.mColor) & 0xF, player);
+ }
+ }
+ return aBlock.recolourBlock(aWorld, aX, aY, aZ, side, (~this.mColor) & 0xF);
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ aList.add(this.mTooltipChain);
+ aList.add(
+ String.format(
+ this.mTooltipChainAmount,
+ GregTech_API.sSpecialFile.get(ConfigCategories.general, "SprayCanChainRange", 256)));
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ long tRemainingPaint = tNBT == null ? this.mUses
+ : GT_Utility.areStacksEqual(aStack, this.mFull, true) ? this.mUses : tNBT.getLong("GT.RemainingPaint");
+ aList.add(this.mTooltipUses + " " + tRemainingPaint);
+ aList.add(this.mTooltipUnstackable);
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color_Remover.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color_Remover.java
new file mode 100644
index 0000000000..0b73b4f7fc
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color_Remover.java
@@ -0,0 +1,48 @@
+package gregtech.common.items.behaviors;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import appeng.api.implementations.tiles.IColorableTile;
+import appeng.api.util.AEColor;
+import appeng.block.networking.BlockCableBus;
+import gregtech.api.interfaces.tileentity.IColoredTileEntity;
+import gregtech.api.util.GT_LanguageManager;
+
+public class Behaviour_Spray_Color_Remover extends Behaviour_Spray_Color {
+
+ public Behaviour_Spray_Color_Remover(ItemStack aEmpty, ItemStack aUsed, ItemStack aFull, long aUses) {
+ super(aEmpty, aUsed, aFull, aUses);
+ this.mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.paintspray.solvent.tooltip", "Can remove paint from things");
+ }
+
+ @Override
+ protected boolean colorize(World aWorld, int aX, int aY, int aZ, ForgeDirection side, EntityPlayer player) {
+ final Block aBlock = aWorld.getBlock(aX, aY, aZ);
+ if (aBlock != Blocks.air) {
+ if (aBlock instanceof IColorableTile) {
+ return ((IColorableTile) aBlock).recolourBlock(side, AEColor.Transparent, player);
+ }
+
+ if (aBlock instanceof BlockCableBus) {
+ return ((BlockCableBus) aBlock)
+ .recolourBlock(aWorld, aX, aY, aZ, side, AEColor.Transparent.ordinal(), player);
+ }
+
+ TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IColoredTileEntity gte) {
+ if (gte.getColorization() >= 0) {
+ gte.setColorization((byte) -1);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Metadata.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Metadata.java
new file mode 100644
index 0000000000..03cf29b9dd
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Metadata.java
@@ -0,0 +1,67 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.items.GT_Generic_Block;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_Util;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_Switch_Metadata extends Behaviour_None {
+
+ public final int mSwitchIndex;
+ public final boolean mCheckTarget, mShowModeSwitchTooltip;
+
+ public Behaviour_Switch_Metadata(int aSwitchIndex) {
+ this(aSwitchIndex, false);
+ }
+
+ public Behaviour_Switch_Metadata(int aSwitchIndex, boolean aCheckTarget) {
+ this(aSwitchIndex, aCheckTarget, false);
+ }
+
+ public Behaviour_Switch_Metadata(int aSwitchIndex, boolean aCheckTarget, boolean aShowModeSwitchTooltip) {
+ mSwitchIndex = aSwitchIndex;
+ mCheckTarget = aCheckTarget;
+ mShowModeSwitchTooltip = aShowModeSwitchTooltip;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ if (mShowModeSwitchTooltip) aList.add(GT_Utility.trans("330", "Sneak Rightclick to switch Mode"));
+ return aList;
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float aHitX, float aHitY, float aHitZ) {
+ if (aStack != null && (aPlayer == null || aPlayer.isSneaking()) && !aWorld.isRemote) {
+ if (mCheckTarget) {
+ Block aBlock = aWorld.blockExists(aX, aY, aZ) ? aWorld.getBlock(aX, aY, aZ) : Blocks.air;
+ if (aBlock instanceof GT_Generic_Block) {
+ Items.feather.setDamage(aStack, (short) mSwitchIndex);
+ GT_Utility.updateItemStack(aStack);
+ return true;
+ }
+ if (GT_Util.getTileEntity(aWorld, aX, aY, aZ, true) == null) {
+ Items.feather.setDamage(aStack, (short) mSwitchIndex);
+ GT_Utility.updateItemStack(aStack);
+ return true;
+ }
+ return false;
+ }
+ Items.feather.setDamage(aStack, (short) mSwitchIndex);
+ GT_Utility.updateItemStack(aStack);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Mode.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Mode.java
new file mode 100644
index 0000000000..1e93362882
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Mode.java
@@ -0,0 +1,53 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.world.World;
+
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_Switch_Mode extends Behaviour_None {
+
+ public Behaviour_Switch_Mode() {}
+
+ @Override
+ public ItemStack onItemRightClick(GT_MetaBase_Item aItem, ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
+ if (aStack != null && (aPlayer == null || aPlayer.isSneaking()) && !aWorld.isRemote) {
+
+ GT_MetaGenerated_Tool itemTool = (GT_MetaGenerated_Tool) aItem;
+ final byte maxMode = itemTool.getToolMaxMode(aStack);
+ if (maxMode == 1) {
+ return aStack;
+ }
+
+ MovingObjectPosition mop = GT_Utility.getPlayerLookingTarget();
+ if (mop == null) {
+ byte currentMode = itemTool.getToolMode(aStack);
+ currentMode = (byte) ((currentMode + 1) % maxMode);
+ itemTool.setToolMode(aStack, currentMode);
+ }
+ return aStack;
+ }
+ return aStack;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ super.getAdditionalToolTips(aItem, aList, aStack);
+ if ((aItem instanceof GT_MetaGenerated_Tool)) {
+ GT_MetaGenerated_Tool itemTool = (GT_MetaGenerated_Tool) aItem;
+ final int maxMode = itemTool.getToolMaxMode(aStack);
+ if (maxMode > 1) {
+ aList.add("Shift+Rclick to change mode");
+ }
+ }
+
+ return aList;
+ }
+
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_Wrench.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_Wrench.java
new file mode 100644
index 0000000000..16c5c3f948
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_Wrench.java
@@ -0,0 +1,278 @@
+package gregtech.common.items.behaviors;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.BooleanSupplier;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.oredict.OreDictionary;
+
+import appeng.api.parts.IPartHost;
+import appeng.api.util.IOrientable;
+import appeng.tile.misc.TileInterface;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import ic2.api.tile.IWrenchable;
+
+public class Behaviour_Wrench extends Behaviour_None {
+
+ private final int mCosts;
+ private final String mTooltip = GT_LanguageManager
+ .addStringLocalization("gt.behaviour.wrench", "Rotates Blocks on Rightclick");
+
+ public Behaviour_Wrench(int aCosts) {
+ this.mCosts = aCosts;
+ }
+
+ @Override
+ public boolean onItemUseFirst(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) {
+ final Block aBlock = aWorld.getBlock(aX, aY, aZ);
+ if (aBlock == null) {
+ return false;
+ }
+ final int aMeta = aWorld.getBlockMetadata(aX, aY, aZ);
+ final short targetSideOrdinal = (short) GT_Utility.determineWrenchingSide(side, hitX, hitY, hitZ)
+ .ordinal();
+ final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+
+ final WrenchHandler handler = new WrenchHandler(
+ aBlock,
+ aMeta,
+ targetSideOrdinal,
+ aTileEntity,
+ aPlayer,
+ aWorld,
+ aX,
+ aY,
+ aZ,
+ aStack,
+ (GT_MetaGenerated_Tool) aItem,
+ mCosts);
+
+ try {
+ return handler.handle() && !aWorld.isRemote;
+ } catch (Throwable ignored) {}
+ return false;
+ }
+
+ /**
+ * <p>
+ * A class to simplify wrenching operation,
+ * stopping "checking creative", "trying to damage tool",
+ * "doing the logic" and "playing sound" again and again.
+ * This should have been a record, but it's not available in Java 8.
+ * </p>
+ * <p>
+ * {@link WrenchHandler#handle()} is the entry point of main logic.
+ * </p>
+ */
+ private static class WrenchHandler {
+
+ boolean handle() {
+ ForgeDirection direction = ForgeDirection.getOrientation(targetSideOrdinal);
+
+ // AE2 logic
+ // default to change the up facing
+ // sneak to change the forward facing
+ if (tileEntity instanceof IOrientable orientable) {
+ if (!orientable.canBeRotated()) return false;
+ ForgeDirection front = orientable.getForward();
+ ForgeDirection up = orientable.getUp();
+
+ // mainly for me-interfaces, whose initial orientation is UNKNOWN
+ if (front == ForgeDirection.UNKNOWN) {
+ if (direction == ForgeDirection.UP || direction == ForgeDirection.DOWN)
+ front = ForgeDirection.NORTH;
+ else front = ForgeDirection.UP;
+ }
+
+ ForgeDirection back = front.getOpposite();
+ ForgeDirection down = up.getOpposite();
+
+ if (tileEntity instanceof TileInterface) {
+ if (player.isSneaking()) return false;
+ if (direction == down) {
+ return doWrenchOperation(costs, () -> {
+ orientable.setOrientation(ForgeDirection.UNKNOWN, ForgeDirection.UNKNOWN);
+ return true;
+ });
+ }
+ // interface's up-side is opposite to the arrow on texture
+ // make it intuitive by rotating it to the opposite side.
+ direction = direction.getOpposite();
+ up = up.getOpposite();
+ } else if (direction == up || direction == front) {
+ // rotate around the direction axis
+ final var tempFront = front;
+ final var tempUp = up;
+ if (!player.isSneaking() && direction == up) return doWrenchOperation(costs, () -> {
+ orientable.setOrientation(tempFront.getRotation(tempUp), tempUp);
+ return true;
+ });
+ if (player.isSneaking() && direction == front) return doWrenchOperation(costs, () -> {
+ orientable.setOrientation(
+ tempFront,
+ tempUp.getRotation(tempFront)
+ .getRotation(tempFront));
+ return true;
+ });
+ }
+
+ if (player.isSneaking()) {
+ if (direction == up || direction == down) {
+ orientable.setOrientation(direction, down.getRotation(front.getRotation(direction)));
+ } else orientable.setOrientation(direction, up);
+ } else {
+ if (direction == front || direction == back) {
+ orientable.setOrientation(back.getRotation(up.getRotation(direction)), direction);
+ } else orientable.setOrientation(front, direction);
+ }
+
+ return damageWrench(costs);
+ }
+ if (world.isRemote) return false;
+ // IC2 Wrenchable
+ if (tileEntity instanceof IWrenchable wrenchable) {
+ if (wrenchable.wrenchCanSetFacing(player, targetSideOrdinal)) {
+ return doWrenchOperation(costs, () -> {
+ wrenchable.setFacing(targetSideOrdinal);
+ return true;
+ });
+ }
+ return false;
+ }
+
+ if (block == Blocks.powered_repeater || block == Blocks.unpowered_repeater
+ || block == Blocks.powered_comparator
+ || block == Blocks.unpowered_comparator) return setBlockMeta(costs, meta / 4 * 4 + (meta % 4 + 1) % 4);
+
+ // hopper cannot face sky
+ if (block == Blocks.hopper && targetSideOrdinal != 1) return setBlockMeta(costs, targetSideOrdinal);
+
+ if (isVanillaAllSideRotatable(block)) if (meta < 6) return setBlockMeta(costs, targetSideOrdinal);
+
+ // blocks like chests and furnaces have only four directions
+ if (isVanillaCantFaceAxisY(block)) {
+ if (targetSideOrdinal > 1) return setBlockMeta(costs, targetSideOrdinal);
+ else return false;
+ }
+ if (tileEntity instanceof IPartHost) return false;
+
+ final int logWoodId = OreDictionary.getOreID("logWood");
+ if (Arrays.stream(OreDictionary.getOreIDs(new ItemStack(block)))
+ .anyMatch(id -> id == logWoodId)) {
+ // The meta just work
+ return setBlockMeta(costs, (meta + 4) % 12);
+ }
+
+ // vanilla block rotate logic
+ if ((Arrays.asList(block.getValidRotations(world, x, y, z))
+ .contains(direction))) return rotateBlock(costs, direction);
+ return false;
+
+ // GT blocks' rotations are done by blocks themselves after this returning false
+ }
+
+ private final Block block;
+ private final short targetSideOrdinal;
+ private final TileEntity tileEntity;
+ private final EntityPlayer player;
+ private final World world;
+ private final int x, y, z, meta;
+ private final ItemStack stack;
+
+ private final GT_MetaGenerated_Tool item;
+ private final int costs;
+
+ public WrenchHandler(Block block, int meta, short targetSideOrdinal, TileEntity tileEntity, EntityPlayer player,
+ World world, int x, int y, int z, ItemStack stack, GT_MetaGenerated_Tool item, int costs) {
+ this.block = block;
+ this.meta = meta;
+ this.targetSideOrdinal = targetSideOrdinal;
+ this.tileEntity = tileEntity;
+ this.player = player;
+ this.world = world;
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ this.stack = stack;
+ this.item = item;
+ this.costs = costs;
+ }
+
+ /**
+ * this will run the operation, damage the tool and play the sound if possible (creative mode or
+ * {@link GT_MetaGenerated_Tool#canWrench(EntityPlayer, int, int, int)})
+ *
+ * @param damage damage to be applied to the wrench
+ * @param operation the real operation of the click
+ * @return true if the operation was successful
+ * @see #setBlockMeta(int, int)
+ * @see #rotateBlock(int, ForgeDirection)
+ * @see #rotateBlock(int, ForgeDirection)
+ */
+ boolean doWrenchOperation(int damage, BooleanSupplier operation) {
+ if (player.capabilities.isCreativeMode || item.canWrench(player, x, y, z)) {
+ if (operation.getAsBoolean()) {
+ item.doDamage(stack, damage);
+ GT_Utility.sendSoundToPlayers(world, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1.0F, x, y, z);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ boolean setBlockMeta(int damage, int newMeta) {
+ return doWrenchOperation(damage, () -> setBlockMetadataWithNotify(newMeta));
+ }
+
+ boolean rotateBlock(int damage, ForgeDirection direction) {
+ return doWrenchOperation(damage, () -> block.rotateBlock(world, x, y, z, direction));
+ }
+
+ boolean damageWrench(int damage) {
+ return doWrenchOperation(damage, () -> true);
+ }
+
+ private boolean setBlockMetadataWithNotify(int newMeta) {
+ return world.setBlockMetadataWithNotify(x, y, z, newMeta, 3);
+ }
+
+ }
+
+ public static boolean isVanillaRotatable(Block block) {
+ return isVanillaCantFaceAxisY(block) || isVanillaAllSideRotatable(block) || block == Blocks.hopper;
+ }
+
+ public static boolean isVanillaCantFaceAxisY(Block block) {
+ return GT_Utility.arrayContains(
+ block,
+ Blocks.pumpkin,
+ Blocks.lit_pumpkin,
+ Blocks.furnace,
+ Blocks.lit_furnace,
+ Blocks.chest,
+ Blocks.trapped_chest,
+ Blocks.ender_chest);
+ }
+
+ public static boolean isVanillaAllSideRotatable(Block block) {
+ return GT_Utility.arrayContains(block, Blocks.piston, Blocks.sticky_piston, Blocks.dispenser, Blocks.dropper);
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ aList.add(this.mTooltip);
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/items/behaviors/Behaviour_WrittenBook.java b/src/main/java/gregtech/common/items/behaviors/Behaviour_WrittenBook.java
new file mode 100644
index 0000000000..0f645a93a9
--- /dev/null
+++ b/src/main/java/gregtech/common/items/behaviors/Behaviour_WrittenBook.java
@@ -0,0 +1,40 @@
+package gregtech.common.items.behaviors;
+
+import java.util.List;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.client.gui.GuiScreenBook;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.util.GT_Utility;
+
+public class Behaviour_WrittenBook extends Behaviour_None {
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean onItemUse(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, int ordinalSide, float hitX, float hitY, float hitZ) {
+ if ((GT_Utility.isStringValid(GT_Utility.ItemNBT.getBookTitle(aStack)))
+ && ((aPlayer instanceof EntityPlayerSP))) {
+ Minecraft.getMinecraft()
+ .displayGuiScreen(new GuiScreenBook(aPlayer, aStack, false));
+ }
+ return true;
+ }
+
+ @Override
+ public List<String> getAdditionalToolTips(GT_MetaBase_Item aItem, List<String> aList, ItemStack aStack) {
+ String tTitle = GT_Utility.ItemNBT.getBookTitle(aStack);
+ if (GT_Utility.isStringValid(tTitle)) {
+ aList.add(tTitle);
+ aList.add("by " + GT_Utility.ItemNBT.getBookAuthor(aStack));
+ }
+ return aList;
+ }
+}
diff --git a/src/main/java/gregtech/common/misc/GT_ClientPollutionMap.java b/src/main/java/gregtech/common/misc/GT_ClientPollutionMap.java
new file mode 100644
index 0000000000..6e40e5860c
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/GT_ClientPollutionMap.java
@@ -0,0 +1,140 @@
+package gregtech.common.misc;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityClientPlayerMP;
+import net.minecraft.util.MathHelper;
+
+public class GT_ClientPollutionMap {
+
+ private static final byte RADIUS = 24;
+ private static final byte DISTANCE_RELOAD_MAP = 5; // When player moved x chunks, shift the map to new center.
+ private static final byte SIZE = RADIUS * 2 + 1; // Area to keep stored.
+
+ private int x0, z0;
+ private int dim;
+
+ private boolean initialized = false;
+
+ private static short[][] chunkMatrix; // short because reasons.
+
+ public GT_ClientPollutionMap() {}
+
+ public void reset() {
+ initialized = false;
+ }
+
+ private void initialize(int playerChunkX, int playerChunkZ, int dimension) {
+ initialized = true;
+ chunkMatrix = new short[SIZE][SIZE];
+ x0 = playerChunkX;
+ z0 = playerChunkZ;
+ dim = dimension;
+ }
+
+ public void addChunkPollution(int chunkX, int chunkZ, int pollution) {
+ EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer;
+ if (player == null || player.worldObj == null) return;
+
+ int playerXChunk = MathHelper.floor_double(player.posX) >> 4;
+ int playerZChunk = MathHelper.floor_double(player.posZ) >> 4; // posX/Z seems to be always loaded,
+
+ if (!initialized) {
+ initialize(playerXChunk, playerZChunk, player.dimension);
+ }
+
+ if (dim != player.dimension) {
+ initialize(playerXChunk, playerZChunk, player.dimension);
+ }
+
+ if (Math.abs(x0 - playerXChunk) > DISTANCE_RELOAD_MAP || Math.abs(z0 - playerZChunk) > DISTANCE_RELOAD_MAP)
+ shiftCenter(playerXChunk, playerZChunk);
+
+ int relX = chunkX - x0 + RADIUS;
+ if (relX >= SIZE || relX < 0) // out of bounds
+ return;
+ int relZ = chunkZ - z0 + RADIUS;
+ if (relZ >= SIZE || relZ < 0) // out of bounds
+ return;
+
+ pollution = pollution / 225;
+ if (pollution > Short.MAX_VALUE) // Sanity
+ chunkMatrix[relX][relZ] = Short.MAX_VALUE; // Max pollution = 7,3mill
+ else if (pollution < 0) chunkMatrix[relX][relZ] = 0;
+ else chunkMatrix[relX][relZ] = (short) (pollution);
+ }
+
+ // xy interpolation, between 4 chunks as corners, unknown treated as 0.
+ public int getPollution(double fx, double fz) {
+ if (!initialized) return 0;
+ int x = MathHelper.floor_double(fx);
+ int z = MathHelper.floor_double(fz);
+ int xDiff = ((x - 8) >> 4) - x0;
+ int zDiff = ((z - 8) >> 4) - z0;
+
+ if (xDiff < -RADIUS || zDiff < -RADIUS || xDiff >= RADIUS || zDiff >= RADIUS) return 0;
+
+ // coordinates in shifted chunk.
+ x = (x - 8) % 16;
+ z = (z - 8) % 16;
+ if (x < 0) x = 16 + x;
+ if (z < 0) z = 16 + z;
+
+ int xi = 15 - x;
+ int zi = 15 - z;
+
+ // read pollution in 4 corner chunks
+ int offsetX = RADIUS + xDiff;
+ int offsetZ = RADIUS + zDiff;
+
+ int c00 = chunkMatrix[offsetX][offsetZ];
+ int c10 = chunkMatrix[offsetX + 1][offsetZ];
+ int c01 = chunkMatrix[offsetX][offsetZ + 1];
+ int c11 = chunkMatrix[offsetX + 1][offsetZ + 1];
+
+ // Is divided by 15*15 but is handled when storing chunk data.
+ return c00 * xi * zi + c10 * x * zi + c01 * xi * z + c11 * x * z;
+ }
+
+ // shift the matrix to fit new center
+ private void shiftCenter(int chunkX, int chunkZ) {
+ int xDiff = chunkX - x0;
+ int zDiff = chunkZ - z0;
+ boolean[] allEmpty = new boolean[SIZE]; // skip check z row if its empty.
+ if (xDiff > 0) for (byte x = 0; x < SIZE; x++) {
+ int xOff = x + xDiff;
+ if (xOff < SIZE) {
+ chunkMatrix[x] = chunkMatrix[xOff].clone();
+ } else {
+ chunkMatrix[x] = new short[SIZE];
+ allEmpty[x] = true;
+ }
+ }
+ else if (xDiff < 0) for (byte x = SIZE - 1; x >= 0; x--) {
+ int xOff = x + xDiff;
+ if (xOff > 0) {
+ chunkMatrix[x] = chunkMatrix[xOff].clone();
+ } else {
+ chunkMatrix[x] = new short[SIZE];
+ allEmpty[x] = true;
+ }
+ }
+
+ if (zDiff > 0) for (byte x = 0; x < SIZE; x++) {
+ if (allEmpty[x]) continue;
+ for (int z = 0; z < SIZE; z++) {
+ int zOff = z + zDiff;
+ chunkMatrix[x][z] = (zOff < SIZE) ? chunkMatrix[x][zOff] : 0;
+ }
+ }
+ else if (zDiff < 0) for (byte x = 0; x < SIZE; x++) {
+ if (allEmpty[x]) continue;
+ for (int z = SIZE - 1; z >= 0; z--) {
+ int zOff = z + zDiff;
+ chunkMatrix[x][z] = (zOff > 0) ? chunkMatrix[x][zOff] : 0;
+ }
+ }
+
+ x0 = chunkX;
+ z0 = chunkZ;
+ }
+}
diff --git a/src/main/java/gregtech/common/misc/GT_Command.java b/src/main/java/gregtech/common/misc/GT_Command.java
new file mode 100644
index 0000000000..3bf73b6300
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/GT_Command.java
@@ -0,0 +1,340 @@
+package gregtech.common.misc;
+
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.getUserEU;
+import static gregtech.common.misc.WirelessNetworkManager.setUserEU;
+
+import java.lang.reflect.Field;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Stream;
+
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.util.EnumChatFormatting;
+
+import com.gtnewhorizon.structurelib.StructureLib;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.objects.GT_ChunkManager;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Pollution;
+import gregtech.common.misc.spaceprojects.SpaceProjectManager;
+
+public final class GT_Command extends CommandBase {
+
+ @Override
+ public String getCommandName() {
+ return "gt";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender sender) {
+ return "Usage: gt <subcommand>. Valid subcommands are: toggle, chunks, pollution.";
+ }
+
+ private void printHelp(ICommandSender sender) {
+ sender.addChatMessage(
+ new ChatComponentText(
+ "Usage: gt <toggle|chunks|pollution|global_energy_add|global_energy_set|global_energy_join>"));
+ sender.addChatMessage(new ChatComponentText("\"toggle D1\" - toggles general.Debug (D1)"));
+ sender.addChatMessage(new ChatComponentText("\"toggle D2\" - toggles general.Debug2 (D2)"));
+ sender.addChatMessage(new ChatComponentText("\"toggle debugCleanroom\" - toggles cleanroom debug log"));
+ sender.addChatMessage(new ChatComponentText("\"toggle debugDriller\" - toggles oil drill debug log"));
+ sender.addChatMessage(new ChatComponentText("\"toggle debugBlockPump\" - Possible issues with pumps"));
+ sender.addChatMessage(new ChatComponentText("\"toggle debugBlockMiner\" - Possible issues with miners"));
+ sender.addChatMessage(
+ new ChatComponentText("\"toggle debugEntityCramming\" - How long it takes and how many entities it finds"));
+ sender.addChatMessage(new ChatComponentText("\"toggle debugWorldGen\" - toggles generic worldgen debug"));
+ sender.addChatMessage(new ChatComponentText("\"toggle debugOrevein\" - toggles worldgen ore vein debug"));
+ sender.addChatMessage(new ChatComponentText("\"toggle debugSmallOres\" - toggles worldgen small vein debug"));
+ sender.addChatMessage(new ChatComponentText("\"toggle debugStones\" - toggles worldgen stones debug"));
+ sender.addChatMessage(new ChatComponentText("\"toggle debugChunkloaders\" - toggles chunkloaders debug"));
+ sender.addChatMessage(new ChatComponentText("\"toggle debugMulti\" - toggles structurelib debug"));
+ sender.addChatMessage(new ChatComponentText("\"chunks\" - print a list of the force loaded chunks"));
+ sender.addChatMessage(
+ new ChatComponentText(
+ "\"pollution <amount>\" - adds the <amount> of the pollution to the current chunk, "
+ + "\n if <amount> isnt specified, will add"
+ + GT_Mod.gregtechproxy.mPollutionSmogLimit
+ + "gibbl."));
+ sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + " --- Global wireless EU controls ---"));
+ sender.addChatMessage(new ChatComponentText("Allows you to set the amount of EU in a users wireless network."));
+ sender.addChatMessage(
+ new ChatComponentText(
+ "Usage:" + EnumChatFormatting.RED
+ + " global_energy_set "
+ + EnumChatFormatting.BLUE
+ + "[Name] "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + "[EU]"));
+ sender.addChatMessage(
+ new ChatComponentText("Allows you to add EU to a users wireless network. Also accepts negative numbers."));
+ sender.addChatMessage(
+ new ChatComponentText(
+ "Usage:" + EnumChatFormatting.RED
+ + " global_energy_add "
+ + EnumChatFormatting.BLUE
+ + "[Name] "
+ + EnumChatFormatting.LIGHT_PURPLE
+ + "[EU]"));
+ sender.addChatMessage(
+ new ChatComponentText(
+ "Allows you to join two users together into one network. Can be undone by writing the users name twice."));
+ sender.addChatMessage(
+ new ChatComponentText(
+ "Usage:" + EnumChatFormatting.RED
+ + " global_energy_join "
+ + EnumChatFormatting.BLUE
+ + "[User joining] [User to join]"));
+ sender.addChatMessage(new ChatComponentText("Shows the amount of EU in a users energy network."));
+ sender.addChatMessage(
+ new ChatComponentText(
+ "Usage:" + EnumChatFormatting.RED + " global_energy_display " + EnumChatFormatting.BLUE + "[Name]"));
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] ss) {
+ List<String> l = new ArrayList<>();
+ String test = ss.length == 0 ? "" : ss[0].trim();
+ if (ss.length == 0 || ss.length == 1 && (test.isEmpty() || Stream
+ .of(
+ "toggle",
+ "chunks",
+ "pollution",
+ "global_energy_add",
+ "global_energy_set",
+ "global_energy_join",
+ "global_energy_display")
+ .anyMatch(s -> s.startsWith(test)))) {
+ Stream
+ .of(
+ "toggle",
+ "chunks",
+ "pollution",
+ "global_energy_add",
+ "global_energy_set",
+ "global_energy_join",
+ "global_energy_display")
+ .filter(s -> test.isEmpty() || s.startsWith(test))
+ .forEach(l::add);
+ } else if (test.equals("toggle")) {
+ String test1 = ss[1].trim();
+ Stream
+ .of(
+ "D1",
+ "D2",
+ "debugCleanroom",
+ "debugDriller",
+ "debugBlockPump",
+ "debugBlockMiner",
+ "debugWorldGen",
+ "debugEntityCramming",
+ "debugOrevein",
+ "debugSmallOres",
+ "debugStones",
+ "debugChunkloaders",
+ "debugMulti",
+ "debugWorldData")
+ .filter(s -> test1.isEmpty() || s.startsWith(test1))
+ .forEach(l::add);
+ }
+ return l;
+ }
+
+ @Override
+ public void processCommand(ICommandSender sender, String[] strings) {
+ if (strings.length < 1) {
+ printHelp(sender);
+ return;
+ }
+ switch (strings[0]) {
+ case "toggle" -> {
+ if (strings.length < 2) {
+ printHelp(sender);
+ return;
+ }
+ if ("debugMulti".equals(strings[1])) {
+ StructureLib.DEBUG_MODE = !StructureLib.DEBUG_MODE;
+ sender.addChatMessage(
+ new ChatComponentText(strings[1] + " = " + (StructureLib.DEBUG_MODE ? "true" : "false")));
+ return;
+ }
+ try {
+ Field field = GT_Values.class.getDeclaredField(strings[1]);
+ if (field.getType() != boolean.class) {
+ sender.addChatMessage(new ChatComponentText("Wrong variable: " + strings[1]));
+ return;
+ }
+ boolean b = !field.getBoolean(null);
+ field.setBoolean(null, b);
+ sender.addChatMessage(new ChatComponentText(strings[1] + " = " + (b ? "true" : "false")));
+ } catch (Exception e) {
+ sender.addChatMessage(new ChatComponentText("No such variable: " + strings[0]));
+ }
+ }
+ case "chunks" -> {
+ GT_ChunkManager.printTickets();
+ sender.addChatMessage(new ChatComponentText("Forced chunks logged to GregTech.log"));
+ }
+ case "pollution" -> {
+ ChunkCoordinates coordinates = sender.getPlayerCoordinates();
+ int amount = (strings.length < 2) ? GT_Mod.gregtechproxy.mPollutionSmogLimit
+ : Integer.parseInt(strings[1]);
+ GT_Pollution.addPollution(
+ sender.getEntityWorld()
+ .getChunkFromBlockCoords(coordinates.posX, coordinates.posZ),
+ amount);
+ }
+ case "global_energy_add" -> {
+ String username = strings[1];
+ String formatted_username = EnumChatFormatting.BLUE + username + EnumChatFormatting.RESET;
+ UUID uuid = SpaceProjectManager.getPlayerUUIDFromName(username);
+
+ String EU_String = strings[2];
+
+ // Usage is /gt global_energy_add username EU
+
+ String EU_string_formatted = EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(new BigInteger(EU_String))
+ + EnumChatFormatting.RESET;
+
+ if (addEUToGlobalEnergyMap(uuid, new BigInteger(EU_String))) sender.addChatMessage(
+ new ChatComponentText(
+ "Successfully added " + EU_string_formatted
+ + "EU to the global energy network of "
+ + formatted_username
+ + "."));
+ else sender.addChatMessage(
+ new ChatComponentText(
+ "Failed to add " + EU_string_formatted
+ + "EU to the global energy map of "
+ + formatted_username
+ + ". Insufficient energy in network. "));
+
+ sender.addChatMessage(
+ new ChatComponentText(
+ formatted_username + " currently has "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(new BigInteger(getUserEU(uuid).toString()))
+ + EnumChatFormatting.RESET
+ + "EU in their network."));
+
+ }
+ case "global_energy_set" -> {
+
+ // Usage is /gt global_energy_set username EU
+
+ String username = strings[1];
+ String formatted_username = EnumChatFormatting.BLUE + username + EnumChatFormatting.RESET;
+ UUID uuid = SpaceProjectManager.getPlayerUUIDFromName(username);
+
+ String EU_String_0 = strings[2];
+
+ if ((new BigInteger(EU_String_0).compareTo(BigInteger.ZERO)) < 0) {
+ sender.addChatMessage(
+ new ChatComponentText("Cannot set a users energy network to a negative value."));
+ break;
+ }
+
+ setUserEU(uuid, new BigInteger(EU_String_0));
+
+ sender.addChatMessage(
+ new ChatComponentText(
+ "Successfully set " + formatted_username
+ + "'s global energy network to "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(new BigInteger(EU_String_0))
+ + EnumChatFormatting.RESET
+ + "EU."));
+
+ }
+ case "global_energy_join" -> {
+
+ // Usage is /gt global_energy_join username_of_you username_to_join
+
+ String usernameSubject = strings[1];
+ String usernameTeam = strings[2];
+
+ String formattedUsernameSubject = EnumChatFormatting.BLUE + usernameSubject + EnumChatFormatting.RESET;
+ String formattedUsernameTeam = EnumChatFormatting.BLUE + usernameTeam + EnumChatFormatting.RESET;
+
+ UUID uuidSubject = SpaceProjectManager.getPlayerUUIDFromName(usernameSubject);
+ UUID uuidTeam = SpaceProjectManager.getLeader(SpaceProjectManager.getPlayerUUIDFromName(usernameTeam));
+
+ if (uuidSubject.equals(uuidTeam)) {
+ // leave team
+ SpaceProjectManager.putInTeam(uuidSubject, uuidSubject);
+ sender.addChatMessage(
+ new ChatComponentText(
+ "User " + formattedUsernameSubject + " has rejoined their own global energy network."));
+ break;
+ }
+
+ // join other's team
+
+ if (uuidSubject.equals(uuidTeam)) {
+ sender.addChatMessage(new ChatComponentText("They are already in the same network!"));
+ break;
+ }
+
+ SpaceProjectManager.putInTeam(uuidSubject, uuidTeam);
+
+ sender.addChatMessage(
+ new ChatComponentText(
+ "Success! " + formattedUsernameSubject + " has joined " + formattedUsernameTeam + "."));
+ sender.addChatMessage(
+ new ChatComponentText(
+ "To undo this simply join your own network again with /gt global_energy_join "
+ + formattedUsernameSubject
+ + " "
+ + formattedUsernameSubject
+ + "."));
+
+ }
+ case "global_energy_display" -> {
+
+ // Usage is /gt global_energy_display username.
+
+ String username = strings[1];
+ String formatted_username = EnumChatFormatting.BLUE + username + EnumChatFormatting.RESET;
+ UUID userUUID = SpaceProjectManager.getPlayerUUIDFromName(username);
+
+ if (!SpaceProjectManager.isInTeam(userUUID)) {
+ sender.addChatMessage(
+ new ChatComponentText("User " + formatted_username + " has no global energy network."));
+ break;
+ }
+ UUID teamUUID = SpaceProjectManager.getLeader(userUUID);
+
+ sender.addChatMessage(
+ new ChatComponentText(
+ "User " + formatted_username
+ + " has "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(getUserEU(userUUID))
+ + EnumChatFormatting.RESET
+ + "EU in their network."));
+ if (!userUUID.equals(teamUUID)) sender.addChatMessage(
+ new ChatComponentText(
+ "User " + formatted_username
+ + " is currently in network of "
+ + EnumChatFormatting.BLUE
+ + SpaceProjectManager.getPlayerNameFromUUID(teamUUID)
+ + EnumChatFormatting.RESET
+ + "."));
+
+ }
+ default -> {
+ sender
+ .addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Invalid command/syntax detected."));
+ printHelp(sender);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/misc/GT_DrillingLogicDelegate.java b/src/main/java/gregtech/common/misc/GT_DrillingLogicDelegate.java
new file mode 100644
index 0000000000..9cf7fd7cf8
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/GT_DrillingLogicDelegate.java
@@ -0,0 +1,266 @@
+package gregtech.common.misc;
+
+import static gregtech.api.enums.GT_Values.debugBlockMiner;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.FakePlayer;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+
+/** @author Relvl on 27.01.2022 */
+@SuppressWarnings("ObjectEquality")
+public class GT_DrillingLogicDelegate {
+
+ public static final ItemStack MINING_PIPE_STACK = GT_ModHandler.getIC2Item("miningPipe", 0);
+ public static final Block MINING_PIPE_BLOCK = GT_Utility.getBlockFromStack(MINING_PIPE_STACK);
+ public static final Block MINING_PIPE_TIP_BLOCK = GT_Utility
+ .getBlockFromStack(GT_ModHandler.getIC2Item("miningPipeTip", 0));
+
+ /** The owner machine pointer */
+ private final GT_IDrillingLogicDelegateOwner owner;
+
+ /** Is pipe retracting process done and halts? */
+ private boolean isRetractDone;
+ /** Is machine ran out of mining pipes in its inventory and halts? */
+ private boolean isWaitingForPipeItem;
+ /** Pipe tip depth (relative to machine Y position, NEGATIVE). */
+ private int tipDepth;
+ /** Cached fake player */
+ private FakePlayer mFakePlayer;
+
+ public GT_DrillingLogicDelegate(GT_IDrillingLogicDelegateOwner owner) {
+ this.owner = owner;
+ }
+
+ /** Descents a pipe tip one plock deeper. */
+ public boolean descent(IGregTechTileEntity te) {
+ if (!te.isAllowedToWork()) {
+ return false;
+ }
+
+ int xCoord = te.getXCoord();
+ int zCoord = te.getZCoord();
+ int yCoord = te.getYCoord();
+ int checkY = yCoord + tipDepth - 1;
+ boolean isHitsTheVoid = checkY < 0;
+ boolean isHitsBedrock = GT_Utility.getBlockHardnessAt(te.getWorld(), xCoord, checkY, zCoord) < 0;
+ boolean isFakePlayerAllowed = canFakePlayerInteract(te, xCoord, checkY, zCoord);
+
+ if (isHitsTheVoid || isHitsBedrock || !isFakePlayerAllowed) {
+ // Disable and start retracting process.
+ te.disableWorking();
+ if (debugBlockMiner) {
+ if (isHitsTheVoid) {
+ GT_Log.out.println("MINER: Hit bottom");
+ }
+ if (isHitsBedrock) {
+ GT_Log.out.println("MINER: Hit block with -1 hardness");
+ }
+ if (!isFakePlayerAllowed) {
+ GT_Log.out.println("MINER: Unable to set mining pipe tip");
+ }
+ }
+ return false;
+ }
+
+ // Replace the tip onto pipe
+ if (te.getBlockOffset(0, tipDepth, 0) == MINING_PIPE_TIP_BLOCK) {
+ te.getWorld()
+ .setBlock(xCoord, yCoord + tipDepth, zCoord, MINING_PIPE_BLOCK);
+ }
+ // Get and decrease pipe from the machine
+ boolean pipeTaken = owner.pullInputs(MINING_PIPE_STACK.getItem(), 1, false);
+ if (!pipeTaken) {
+ // If there was nothing - waiting for the pipes (just for prevent unnecessary checks)
+ isWaitingForPipeItem = true;
+ return false;
+ }
+
+ // If there is something - mine it
+ Block block = te.getBlockOffset(0, tipDepth - 1, 0);
+ if (!block.isAir(te.getWorld(), xCoord, yCoord, zCoord)) {
+ mineBlock(te, block, xCoord, yCoord + tipDepth - 1, zCoord);
+ }
+
+ // Descent the pipe tip
+ te.getWorld()
+ .setBlock(xCoord, yCoord + tipDepth - 1, zCoord, MINING_PIPE_TIP_BLOCK);
+ tipDepth--;
+ return true;
+ }
+
+ public void onOwnerPostTick(IGregTechTileEntity te, long tick) {
+ // If the machine was disabled - try to retract pipe
+ if (!te.isAllowedToWork()) {
+ onPostTickRetract(te, tick);
+ return;
+ }
+ // If the machine was re-enabled - we should reset the retracting process
+ isRetractDone = false;
+ }
+
+ /** If the machine are disabled - tried to retract pipe. */
+ private void onPostTickRetract(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (isRetractDone) {
+ return;
+ }
+ // If retracting process just touch the miner
+ if (tipDepth == 0) {
+ isRetractDone = true;
+ return;
+ }
+ // Once per N ticks (depends on tier)
+ if ((aTick % (owner.getMachineSpeed() / 5)) != 0) {
+ return;
+ }
+
+ // Check we can push pipe back to machine (inputs allowed for this case!)
+ boolean canPush = owner.pushOutputs(MINING_PIPE_STACK, 1, true, true);
+ if (!canPush) {
+ return;
+ }
+
+ // Inspect target block - it should be a pipe tip, else something went wrong.
+ Block targetBlock = aBaseMetaTileEntity.getBlockOffset(0, tipDepth, 0);
+ if (targetBlock != MINING_PIPE_TIP_BLOCK && targetBlock != MINING_PIPE_BLOCK) {
+ return;
+ }
+
+ // Retract the pipe/tip
+ int xCoord = aBaseMetaTileEntity.getXCoord();
+ int yCoord = aBaseMetaTileEntity.getYCoord();
+ int zCoord = aBaseMetaTileEntity.getZCoord();
+ int actualDrillY = yCoord + tipDepth;
+ // Move the pipe tip position
+ if (actualDrillY < yCoord - 1) {
+ owner.getBaseMetaTileEntity()
+ .getWorld()
+ .setBlock(xCoord, actualDrillY + 1, zCoord, MINING_PIPE_TIP_BLOCK);
+ }
+ // Remove the old pipe tip
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(xCoord, actualDrillY, zCoord, Blocks.air, 0, /* send to client without neighbour updates */ 2);
+
+ // Return the pipe back to the machine (inputs allowed for this case!)
+ owner.pushOutputs(MINING_PIPE_STACK, 1, false, true);
+
+ tipDepth++;
+ }
+
+ /** Minings the block if it is possible. */
+ public void mineBlock(IGregTechTileEntity te, Block block, int x, int y, int z) {
+ if (!GT_Utility.eraseBlockByFakePlayer(getFakePlayer(te), x, y, z, true)) {
+ return;
+ }
+
+ List<ItemStack> drops = getBlockDrops(block, x, y, z);
+
+ boolean canFitDrops = true;
+ for (ItemStack drop : drops) {
+ canFitDrops &= owner.pushOutputs(drop, drop.stackSize, true, false);
+ }
+ if (!canFitDrops) {
+ return;
+ }
+ for (ItemStack drop : drops) {
+ owner.pushOutputs(drop, drop.stackSize, false, false);
+ }
+
+ short metaData = 0;
+ TileEntity tTileEntity = owner.getBaseMetaTileEntity()
+ .getTileEntity(x, y, z);
+ if (tTileEntity instanceof GT_TileEntity_Ores) {
+ metaData = ((GT_TileEntity_Ores) tTileEntity).mMetaData;
+ }
+
+ ItemStack cobble = GT_Utility.getCobbleForOre(block, metaData);
+ te.getWorld()
+ .setBlock(
+ x,
+ y,
+ z,
+ Block.getBlockFromItem(cobble.getItem()),
+ cobble.getItemDamage(), /* cause updates(1) + send to client(2) */
+ 3);
+ }
+
+ /**
+ * Returns NEGATIVE (eg -5) depth of current drilling Y world level. RELATIVELY TO MINER ENTITY! This means '(miner
+ * world Y) + depth = (actual world Y)'.
+ */
+ public int getTipDepth() {
+ return tipDepth;
+ }
+
+ /** Looking for the lowest continuous pipe. */
+ public void findTipDepth() {
+ IGregTechTileEntity ownerTe = owner.getBaseMetaTileEntity();
+ if (!ownerTe.isServerSide()) {
+ return;
+ }
+ while (true) {
+ Block block = ownerTe.getBlockOffset(0, tipDepth - 1, 0);
+ if (block != MINING_PIPE_BLOCK && block != MINING_PIPE_TIP_BLOCK) {
+ return;
+ }
+ tipDepth--;
+ }
+ }
+
+ /**
+ * Creates and provides the Fake Player for owners. todo maybe will provide player owner uuid? im sure some servers
+ * not allow to fakers, in griefing reasons.
+ */
+ public FakePlayer getFakePlayer(IGregTechTileEntity te) {
+ if (mFakePlayer == null) {
+ mFakePlayer = GT_Utility.getFakePlayer(te);
+ }
+ if (mFakePlayer != null) {
+ mFakePlayer.setWorld(te.getWorld());
+ mFakePlayer.setPosition(te.getXCoord(), te.getYCoord(), te.getZCoord());
+ }
+ return mFakePlayer;
+ }
+
+ public boolean canFakePlayerInteract(IGregTechTileEntity te, int xCoord, int yCoord, int zCoord) {
+ return GT_Utility
+ .setBlockByFakePlayer(getFakePlayer(te), xCoord, yCoord, zCoord, MINING_PIPE_TIP_BLOCK, 0, true);
+ }
+
+ /** Get target block drops. We need to encapsulate everyting of mining in this class. */
+ private List<ItemStack> getBlockDrops(final Block oreBlock, int posX, int posY, int posZ) {
+ return oreBlock.getDrops(
+ owner.getBaseMetaTileEntity()
+ .getWorld(),
+ posX,
+ posY,
+ posZ,
+ owner.getBaseMetaTileEntity()
+ .getMetaID(posX, posY, posZ),
+ owner.getMachineTier());
+ }
+
+ /** Can the owner continue doing its work? If we await new pipes - it cannot. */
+ public boolean canContinueDrilling(long tick) {
+ if (isWaitingForPipeItem) {
+ if (tick % 5 != 0) {
+ return false;
+ }
+ boolean hasPipe = owner.pullInputs(MINING_PIPE_STACK.getItem(), 1, true);
+ if (hasPipe) {
+ isWaitingForPipeItem = false;
+ }
+ return hasPipe;
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/misc/GT_IDrillingLogicDelegateOwner.java b/src/main/java/gregtech/common/misc/GT_IDrillingLogicDelegateOwner.java
new file mode 100644
index 0000000000..9b10b6fcf0
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/GT_IDrillingLogicDelegateOwner.java
@@ -0,0 +1,22 @@
+package gregtech.common.misc;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+
+/** @author Relvl on 27.01.2022 */
+public interface GT_IDrillingLogicDelegateOwner extends IMetaTileEntity {
+
+ /** Returns the machine actual tier. */
+ int getMachineTier();
+
+ /** Returns the machine current processing speed. */
+ int getMachineSpeed();
+
+ /** Pulls (or check can pull) items from an input slots. */
+ boolean pullInputs(Item item, int count, boolean simulate);
+
+ /** Pushes (or check can push) item to output slots. */
+ boolean pushOutputs(ItemStack stack, int count, boolean simulate, boolean allowInputSlots);
+}
diff --git a/src/main/java/gregtech/common/misc/GlobalEnergyWorldSavedData.java b/src/main/java/gregtech/common/misc/GlobalEnergyWorldSavedData.java
new file mode 100644
index 0000000000..1a03012649
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/GlobalEnergyWorldSavedData.java
@@ -0,0 +1,125 @@
+package gregtech.common.misc;
+
+import static gregtech.common.misc.GlobalVariableStorage.GlobalEnergy;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.math.BigInteger;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraft.world.WorldSavedData;
+import net.minecraft.world.storage.MapStorage;
+import net.minecraftforge.event.world.WorldEvent;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.common.misc.spaceprojects.SpaceProjectManager;
+
+public class GlobalEnergyWorldSavedData extends WorldSavedData {
+
+ public static GlobalEnergyWorldSavedData INSTANCE;
+
+ private static final String DATA_NAME = "GregTech_WirelessEUWorldSavedData";
+
+ private static final String GlobalEnergyNBTTag = "GregTech_GlobalEnergy_MapNBTTag";
+ private static final String GlobalEnergyTeamNBTTag = "GregTech_GlobalEnergyTeam_MapNBTTag";
+
+ private static void loadInstance(World world) {
+
+ GlobalEnergy.clear();
+
+ MapStorage storage = world.mapStorage;
+ INSTANCE = (GlobalEnergyWorldSavedData) storage.loadData(GlobalEnergyWorldSavedData.class, DATA_NAME);
+ if (INSTANCE == null) {
+ INSTANCE = new GlobalEnergyWorldSavedData();
+ storage.setData(DATA_NAME, INSTANCE);
+ }
+ INSTANCE.markDirty();
+ }
+
+ @SuppressWarnings("unused")
+ @SubscribeEvent
+ public void onWorldLoad(WorldEvent.Load event) {
+ if (!event.world.isRemote && event.world.provider.dimensionId == 0) {
+ loadInstance(event.world);
+ }
+ }
+
+ public GlobalEnergyWorldSavedData() {
+ super(DATA_NAME);
+ }
+
+ @SuppressWarnings("unused")
+ public GlobalEnergyWorldSavedData(String name) {
+ super(name);
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void readFromNBT(NBTTagCompound nbtTagCompound) {
+
+ try {
+ byte[] ba = nbtTagCompound.getByteArray(GlobalEnergyNBTTag);
+ InputStream byteArrayInputStream = new ByteArrayInputStream(ba);
+ ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
+ Object data = objectInputStream.readObject();
+ HashMap<Object, BigInteger> hashData = (HashMap<Object, BigInteger>) data;
+ for (Map.Entry<Object, BigInteger> entry : hashData.entrySet()) {
+ try {
+ GlobalEnergy.put(
+ UUID.fromString(
+ entry.getKey()
+ .toString()),
+ entry.getValue());
+ } catch (RuntimeException ignored) {
+ // probably a malformed uuid. in any case, try carry on with the load
+ }
+ }
+ } catch (IOException | ClassNotFoundException exception) {
+ System.out.println(GlobalEnergyNBTTag + " FAILED");
+ exception.printStackTrace();
+ }
+ try {
+ if (!nbtTagCompound.hasKey(GlobalEnergyTeamNBTTag)) return;
+ byte[] ba = nbtTagCompound.getByteArray(GlobalEnergyTeamNBTTag);
+ InputStream byteArrayInputStream = new ByteArrayInputStream(ba);
+ ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
+ Object data = objectInputStream.readObject();
+ HashMap<String, String> oldTeams = (HashMap<String, String>) data;
+ for (String member : oldTeams.keySet()) {
+ String leader = oldTeams.get(member);
+ try {
+ SpaceProjectManager.putInTeam(UUID.fromString(member), UUID.fromString(leader));
+ } catch (RuntimeException ignored) {
+ // probably a malformed uuid. in any case, try carry on with the load
+ }
+ }
+ } catch (IOException | ClassNotFoundException exception) {
+ System.out.println(GlobalEnergyTeamNBTTag + " FAILED");
+ exception.printStackTrace();
+ }
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound nbtTagCompound) {
+
+ try {
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
+ objectOutputStream.writeObject(GlobalEnergy);
+ objectOutputStream.flush();
+ byte[] data = byteArrayOutputStream.toByteArray();
+ nbtTagCompound.setByteArray(GlobalEnergyNBTTag, data);
+ } catch (IOException exception) {
+ System.out.println(GlobalEnergyNBTTag + " SAVE FAILED");
+ exception.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/misc/GlobalMetricsCoverDatabase.java b/src/main/java/gregtech/common/misc/GlobalMetricsCoverDatabase.java
new file mode 100644
index 0000000000..33e8198bd6
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/GlobalMetricsCoverDatabase.java
@@ -0,0 +1,492 @@
+package gregtech.common.misc;
+
+import static net.minecraftforge.common.util.Constants.NBT.TAG_BYTE_ARRAY;
+import static net.minecraftforge.common.util.Constants.NBT.TAG_COMPOUND;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagByteArray;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.WorldSavedData;
+import net.minecraft.world.storage.MapStorage;
+import net.minecraftforge.common.ForgeHooks;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.item.ItemExpireEvent;
+import net.minecraftforge.event.world.BlockEvent;
+import net.minecraftforge.event.world.ExplosionEvent.Detonate;
+import net.minecraftforge.event.world.WorldEvent;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.covers.CoverInfo;
+import gregtech.common.covers.GT_Cover_Metrics_Transmitter;
+import gregtech.common.events.MetricsCoverDataEvent;
+import gregtech.common.events.MetricsCoverHostDeconstructedEvent;
+import gregtech.common.events.MetricsCoverSelfDestructEvent;
+
+/**
+ * Catches and provides data transmitted from deployed Metrics Transmitter covers. Only stores one result per frequency
+ * at a time. Metrics covers are intended to overwrite an old result every time they emit a new event.
+ * <br />
+ * <br />
+ * This information is only partially persisted; frequencies that are in a non-operational state will be written to
+ * disk, while operational frequencies are volatile. The assumption is that any frequency with a broadcasting card will,
+ * fairly quickly, re-assert its presence. Conversely, one-time events like deconstruction or self-destruction can occur
+ * while the card is in a container, rotting on the ground, etc.
+ */
+public class GlobalMetricsCoverDatabase extends WorldSavedData {
+
+ private static GlobalMetricsCoverDatabase INSTANCE;
+
+ /** Holds received metrics. */
+ private static final Map<UUID, Data> DATABASE = new ConcurrentHashMap<>();
+ /** Used to speed up event handlers dealing with block breaking and explosions. Not persisted. */
+ private static final Map<Coordinates, Set<UUID>> REVERSE_LOOKUP = new ConcurrentHashMap<>();
+
+ private static final String DATA_NAME = "GregTech_MetricsCoverDatabase";
+ private static final String DECONSTRUCTED_KEY = "GregTech_MetricsCoverDatabase_Deconstructed";
+ private static final String SELF_DESTRUCTED_KEY = "GregTech_MetricsCoverDatabase_SelfDestructed";
+
+ public GlobalMetricsCoverDatabase() {
+ this(DATA_NAME);
+ }
+
+ public GlobalMetricsCoverDatabase(String name) {
+ super(name);
+ }
+
+ @SuppressWarnings("unused")
+ @SubscribeEvent
+ public void receiveMetricsData(MetricsCoverDataEvent event) {
+ final Coordinates coordinates = event.getCoordinates();
+ store(event.getFrequency(), State.OPERATIONAL, event.getPayload(), coordinates);
+
+ if (!REVERSE_LOOKUP.containsKey(coordinates)) {
+ REVERSE_LOOKUP.put(coordinates, new HashSet<>());
+ }
+ REVERSE_LOOKUP.get(coordinates)
+ .add(event.getFrequency());
+ }
+
+ @SuppressWarnings("unused")
+ @SubscribeEvent
+ public void receiveHostDeconstructed(MetricsCoverHostDeconstructedEvent event) {
+ cullReverseLookupEntry(event.getFrequency());
+ store(event.getFrequency(), State.HOST_DECONSTRUCTED);
+ }
+
+ @SuppressWarnings("unused")
+ @SubscribeEvent
+ public void receiveSelfDestruct(MetricsCoverSelfDestructEvent event) {
+ cullReverseLookupEntry(event.getFrequency());
+ store(event.getFrequency(), State.SELF_DESTRUCTED);
+ }
+
+ @SuppressWarnings("unused")
+ @SubscribeEvent
+ public void onWorldLoad(WorldEvent.Load event) {
+ if (event.world.isRemote || event.world.provider.dimensionId != 0) {
+ return;
+ }
+
+ DATABASE.clear();
+
+ final MapStorage storage = event.world.mapStorage;
+ INSTANCE = (GlobalMetricsCoverDatabase) storage.loadData(GlobalMetricsCoverDatabase.class, DATA_NAME);
+ if (INSTANCE == null) {
+ INSTANCE = new GlobalMetricsCoverDatabase();
+ storage.setData(DATA_NAME, INSTANCE);
+ }
+
+ INSTANCE.markDirty();
+ }
+
+ @SuppressWarnings("unused")
+ @SubscribeEvent
+ public void onBlockBreak(BlockEvent.BreakEvent event) {
+ final Coordinates coords = new Coordinates(event.world.provider.getDimensionName(), event.x, event.y, event.z);
+ // In case someone else wants to listen to these, go the roundabout way.
+ final Set<UUID> uuids = REVERSE_LOOKUP.get(coords);
+ if (uuids != null) {
+ uuids.forEach(
+ uuid -> MinecraftForge.EVENT_BUS.post(
+ ForgeHooks.canHarvestBlock(event.block, event.getPlayer(), event.blockMetadata)
+ && !event.getPlayer().capabilities.isCreativeMode ? new MetricsCoverHostDeconstructedEvent(uuid)
+ : new MetricsCoverSelfDestructEvent(uuid)));
+ }
+ }
+
+ @SuppressWarnings("unused")
+ @SubscribeEvent
+ public void onExplosion(Detonate event) {
+ final String dimensionName = event.world.provider.getDimensionName();
+
+ event.getAffectedBlocks()
+ .forEach(chunkPosition -> {
+ final Set<UUID> uuids = REVERSE_LOOKUP.get(
+ new Coordinates(
+ dimensionName,
+ chunkPosition.chunkPosX,
+ chunkPosition.chunkPosY,
+ chunkPosition.chunkPosZ));
+
+ if (uuids != null) {
+ uuids.forEach(uuid -> MinecraftForge.EVENT_BUS.post(new MetricsCoverSelfDestructEvent(uuid)));
+ }
+ });
+
+ event.getAffectedEntities().forEach(entity -> {
+ if (entity instanceof final EntityItem entityItem) {
+ getCoverUUIDsFromItemStack(entityItem.getEntityItem())
+ .forEach(uuid -> MinecraftForge.EVENT_BUS.post(new MetricsCoverSelfDestructEvent(uuid)));
+ }
+ });
+ }
+
+ @SuppressWarnings("unused")
+ @SubscribeEvent
+ public void onItemExpiration(ItemExpireEvent event) {
+ getCoverUUIDsFromItemStack(event.entityItem.getEntityItem())
+ .forEach(uuid -> MinecraftForge.EVENT_BUS.post(new MetricsCoverSelfDestructEvent(uuid)));
+ }
+
+ /**
+ * Get the data for a frequency, if it exists.
+ *
+ * @param frequency The UUID corresponding to the frequency to retrieve.
+ * @return An Optional with the frequency's data, or an empty Optional if it doesn't exist.
+ */
+ @NotNull
+ public static Optional<Data> getData(UUID frequency) {
+ return Optional.ofNullable(DATABASE.get(frequency));
+ }
+
+ /**
+ * Once a card has received the fact that it has self-destructed, this method can be called to free up its spot
+ * in the database. Does nothing if the frequency is missing or is not in a self-destructed state.
+ *
+ * @param frequency The UUID corresponding to the frequency to possibly cull.
+ */
+ public static void clearSelfDestructedFrequency(UUID frequency) {
+ getData(frequency).ifPresent(data -> {
+ if (data.getState() == State.SELF_DESTRUCTED) {
+ DATABASE.remove(frequency);
+ tryMarkDirty();
+ }
+ });
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound nbtTagCompound) {
+ final NBTTagList deconstructed = nbtTagCompound.getTagList(DECONSTRUCTED_KEY, TAG_BYTE_ARRAY);
+ final NBTTagList selfDestructed = nbtTagCompound.getTagList(SELF_DESTRUCTED_KEY, TAG_BYTE_ARRAY);
+
+ for (int i = 0; i < deconstructed.tagCount(); i++) {
+ final NBTTagByteArray byteArray = (NBTTagByteArray) deconstructed.removeTag(0);
+ reconstituteUUID(byteArray.func_150292_c())
+ .ifPresent(uuid -> DATABASE.put(uuid, new Data(State.HOST_DECONSTRUCTED)));
+ }
+
+ for (int i = 0; i < selfDestructed.tagCount(); i++) {
+ final NBTTagByteArray byteArray = (NBTTagByteArray) selfDestructed.removeTag(0);
+ reconstituteUUID(byteArray.func_150292_c())
+ .ifPresent(uuid -> DATABASE.put(uuid, new Data(State.SELF_DESTRUCTED)));
+ }
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound nbtTagCompound) {
+ // We only care about persisting frequencies that aren't operational.
+ final NBTTagList deconstructed = new NBTTagList();
+ final NBTTagList selfDestructed = new NBTTagList();
+ DATABASE.forEach((uuid, data) -> {
+ switch (data.getState()) {
+ case HOST_DECONSTRUCTED -> deconstructed.appendTag(new NBTTagByteArray(dumpUUID(uuid)));
+ case SELF_DESTRUCTED -> selfDestructed.appendTag(new NBTTagByteArray(dumpUUID(uuid)));
+ }
+ });
+
+ if (deconstructed.tagCount() > 0) {
+ nbtTagCompound.setTag(DECONSTRUCTED_KEY, deconstructed);
+ }
+ if (selfDestructed.tagCount() > 0) {
+ nbtTagCompound.setTag(SELF_DESTRUCTED_KEY, selfDestructed);
+ }
+ }
+
+ /**
+ * Stores the new result and flag the static {@link MapStorage} instance as dirty if the information updated. Will
+ * not flag dirty for any data in the {@link State#OPERATIONAL OPERATIONAL} state since they aren't stored.
+ *
+ * @param frequency Maps to a unique deployed cover.
+ * @param state The new cover state.
+ */
+ private static void store(@NotNull UUID frequency, @NotNull State state) {
+ store(frequency, state, null, null);
+ }
+
+ /**
+ * Stores the new result and flag the static {@link MapStorage} instance as dirty if the information updated. Will
+ * not flag dirty for any data in the {@link State#OPERATIONAL OPERATIONAL} state since they aren't stored.
+ *
+ * @param frequency Maps to a unique deployed cover.
+ * @param state The new cover state.
+ * @param payload A list of strings to display on the information panel, if the card is slotted properly.
+ * @param coordinates Coordinates of the active machine (including dimension.)
+ */
+ private static void store(@NotNull UUID frequency, @NotNull State state, @Nullable List<String> payload,
+ @Nullable Coordinates coordinates) {
+ final Data newData = new Data(state, payload, coordinates);
+ final Data oldData = DATABASE.put(frequency, newData);
+
+ if (state != State.OPERATIONAL && (oldData == null || oldData != newData)) {
+ tryMarkDirty();
+ }
+ }
+
+ private static void tryMarkDirty() {
+ if (INSTANCE != null) {
+ INSTANCE.markDirty();
+ }
+ }
+
+ private static byte[] dumpUUID(UUID uuid) {
+ ByteBuffer buffer = ByteBuffer.wrap(new byte[16]);
+ buffer.putLong(uuid.getMostSignificantBits());
+ buffer.putLong(uuid.getLeastSignificantBits());
+ return buffer.array();
+ }
+
+ @NotNull
+ private static Optional<UUID> reconstituteUUID(byte[] bytes) throws IllegalArgumentException {
+ if (bytes.length != 16) {
+ return Optional.empty();
+ }
+
+ ByteBuffer buffer = ByteBuffer.wrap(bytes);
+ return Optional.of(new UUID(buffer.getLong(), buffer.getLong()));
+ }
+
+ private static void cullReverseLookupEntry(UUID frequency) {
+ getData(frequency).ifPresent(data -> {
+ if (data.state == State.OPERATIONAL && REVERSE_LOOKUP.containsKey(data.coordinates)) {
+ final Set<UUID> set = REVERSE_LOOKUP.get(data.coordinates);
+ set.remove(frequency);
+ if (set.isEmpty()) {
+ REVERSE_LOOKUP.remove(data.coordinates);
+ }
+ }
+ });
+ }
+
+ private static Stream<UUID> getCoverUUIDsFromItemStack(final ItemStack stack) {
+ if (stack.hasTagCompound() && stack.getTagCompound()
+ .hasKey(GT_Values.NBT.COVERS, TAG_COMPOUND)) {
+ final NBTTagList tagList = stack.getTagCompound()
+ .getTagList(GT_Values.NBT.COVERS, TAG_COMPOUND);
+ return IntStream.range(0, tagList.tagCount())
+ .mapToObj(tagList::getCompoundTagAt)
+ .map(nbt -> new CoverInfo(null, nbt).getCoverData())
+ .filter(
+ serializableObject -> serializableObject instanceof GT_Cover_Metrics_Transmitter.MetricsTransmitterData)
+ .map(data -> ((GT_Cover_Metrics_Transmitter.MetricsTransmitterData) data).getFrequency());
+ }
+ return Stream.empty();
+ }
+
+ /**
+ * Data transmitted by a Metrics Transmitter cover.
+ * <p>
+ * Since only negative states ({@link State#HOST_DECONSTRUCTED HOST_DECONSTRUCTED} and
+ * {@link State#SELF_DESTRUCTED SELF DESTRUCTED}) are persisted, additional fields can be added to this data with
+ * little consequence. Ensure that any new fields are nullable, and make any getter for these fields return an
+ * {@link Optional}.
+ */
+ public static class Data {
+
+ @NotNull
+ private final State state;
+ @Nullable
+ private final List<String> payload;
+ @Nullable
+ private final Coordinates coordinates;
+
+ public Data(@NotNull State state) {
+ this.state = state;
+ this.payload = null;
+ this.coordinates = null;
+ }
+
+ public Data(@NotNull State state, @Nullable List<String> payload) {
+ this.state = state;
+ this.payload = payload;
+ this.coordinates = null;
+ }
+
+ public Data(@NotNull State state, @Nullable List<String> payload, @Nullable Coordinates coordinates) {
+ this.state = state;
+ this.payload = payload;
+ this.coordinates = coordinates;
+
+ }
+
+ /**
+ * Retrieves the payload for this data. Only present if the frequency is in an
+ * {@link State#OPERATIONAL operational} state. Will be cleared if the frequency goes into a
+ * {@link State#HOST_DECONSTRUCTED host-deconstructed} or {@link State#SELF_DESTRUCTED self-destructed} state.
+ *
+ * @return The data if present, or an empty Optional otherwise.
+ */
+ @NotNull
+ public Optional<List<String>> getPayload() {
+ return Optional.ofNullable(payload);
+ }
+
+ /**
+ * Gets the state of the frequency.
+ *
+ * @return The state
+ */
+ @NotNull
+ public State getState() {
+ return state;
+ }
+
+ /**
+ * Gets the last known coordinates for the machine broadcasting metrics. Will only be present in an
+ * {@link State#OPERATIONAL operational} state.
+ *
+ * @return The coordinates
+ */
+ @NotNull
+ public Optional<Coordinates> getCoordinates() {
+ return Optional.ofNullable(coordinates);
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ final Data data = (Data) o;
+ return state == data.state && Objects.equals(payload, data.payload)
+ && Objects.equals(coordinates, data.coordinates);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(state, payload, coordinates);
+ }
+ }
+
+ @SuppressWarnings("ClassCanBeRecord")
+ public static class Coordinates {
+
+ private final String dimension;
+ private final int x;
+ private final int y;
+ private final int z;
+
+ public Coordinates(final String dimension, final int x, final int y, final int z) {
+ this.dimension = dimension;
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ }
+
+ public int getX() {
+ return x;
+ }
+
+ public int getY() {
+ return y;
+ }
+
+ public int getZ() {
+ return z;
+ }
+
+ public String getDimension() {
+ return dimension;
+ }
+
+ public String getLocalizedCoordinates() {
+ return StatCollector.translateToLocalFormatted(
+ "gt.db.metrics_cover.coords",
+ GT_Utility.formatNumbers(x),
+ GT_Utility.formatNumbers(y),
+ GT_Utility.formatNumbers(z));
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ final Coordinates that = (Coordinates) o;
+ return x == that.x && y == that.y && z == that.z && Objects.equals(dimension, that.dimension);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(dimension, x, y, z);
+ }
+ }
+
+ public enum State {
+ // NOTE: type cannot be 0, as NuclearControl returns a 0 when querying for an integer from an item stack's NBT
+ // data when it really means null.
+
+ /** The machine is online and broadcasting metrics. */
+ OPERATIONAL(1),
+ /**
+ * The machine was picked up, but the cover is still attached. Will transition to operational state if the
+ * machine is placed back down and started up again.
+ */
+ HOST_DECONSTRUCTED(2),
+ /**
+ * Cover was removed from its host machine, or machine was destroyed (in the limited number of ways we can
+ * detect.) Any frequency in this state will no longer get updates nor leave this state.
+ */
+ SELF_DESTRUCTED(3);
+
+ private static final Map<Integer, State> VALID_TYPE_INTEGERS = Arrays.stream(State.values())
+ .collect(Collectors.toMap(State::getType, Function.identity()));
+ private final int type;
+
+ State(final int type) {
+ if (type <= 0) {
+ throw new IllegalArgumentException("A state must have a positive, nonzero type parameter.");
+ }
+ this.type = type;
+ }
+
+ @NotNull
+ public static Optional<State> find(int candidate) {
+ return Optional.ofNullable(VALID_TYPE_INTEGERS.get(candidate));
+ }
+
+ public int getType() {
+ return type;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/misc/GlobalVariableStorage.java b/src/main/java/gregtech/common/misc/GlobalVariableStorage.java
new file mode 100644
index 0000000000..27aad0a11f
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/GlobalVariableStorage.java
@@ -0,0 +1,15 @@
+package gregtech.common.misc;
+
+import java.math.BigInteger;
+import java.util.HashMap;
+import java.util.UUID;
+
+public abstract class GlobalVariableStorage {
+ // --------------------- NEVER access these maps! Use the methods provided! ---------------------
+
+ // Global EU map.
+ public static HashMap<UUID, BigInteger> GlobalEnergy = new HashMap<>(100, 0.9f);
+
+ // ----------------------------------------------------------------------------------------------
+
+}
diff --git a/src/main/java/gregtech/common/misc/WirelessNetworkManager.java b/src/main/java/gregtech/common/misc/WirelessNetworkManager.java
new file mode 100644
index 0000000000..17107b4e50
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/WirelessNetworkManager.java
@@ -0,0 +1,93 @@
+package gregtech.common.misc;
+
+import static gregtech.common.misc.GlobalVariableStorage.GlobalEnergy;
+
+import java.math.BigInteger;
+import java.util.UUID;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.common.misc.spaceprojects.SpaceProjectManager;
+
+public class WirelessNetworkManager {
+
+ private WirelessNetworkManager() {}
+
+ public static void strongCheckOrAddUser(UUID user_uuid) {
+ SpaceProjectManager.checkOrCreateTeam(user_uuid);
+ if (!GlobalEnergy.containsKey(user_uuid)) {
+ GlobalEnergy.put(SpaceProjectManager.getLeader(user_uuid), BigInteger.ZERO);
+ }
+ }
+
+ // ------------------------------------------------------------------------------------
+ // Add EU to the users global energy. You can enter a negative number to subtract it.
+ // If the value goes below 0 it will return false and not perform the operation.
+ // BigIntegers have much slower operations than longs/ints. You should call these methods
+ // as infrequently as possible and bulk store values to add to the global map.
+ public static boolean addEUToGlobalEnergyMap(UUID user_uuid, BigInteger EU) {
+ // Mark the data as dirty and in need of saving.
+ try {
+ GlobalEnergyWorldSavedData.INSTANCE.markDirty();
+ } catch (Exception exception) {
+ System.out.println("COULD NOT MARK GLOBAL ENERGY AS DIRTY IN ADD EU");
+ exception.printStackTrace();
+ }
+
+ // Get the team UUID. Users are by default in a team with a UUID equal to their player UUID.
+ UUID teamUUID = SpaceProjectManager.getLeader(user_uuid);
+
+ // Get the teams total energy stored. If they are not in the map, return 0 EU.
+ BigInteger totalEU = GlobalEnergy.getOrDefault(teamUUID, BigInteger.ZERO);
+ totalEU = totalEU.add(EU);
+
+ // If there is sufficient EU then complete the operation and return true.
+ if (totalEU.signum() >= 0) {
+ GlobalEnergy.put(teamUUID, totalEU);
+ return true;
+ }
+
+ // There is insufficient EU so cancel the operation and return false.
+ return false;
+ }
+
+ public static boolean addEUToGlobalEnergyMap(UUID user_uuid, long EU) {
+ return addEUToGlobalEnergyMap(user_uuid, BigInteger.valueOf(EU));
+ }
+
+ public static boolean addEUToGlobalEnergyMap(UUID user_uuid, int EU) {
+ return addEUToGlobalEnergyMap(user_uuid, BigInteger.valueOf(EU));
+ }
+
+ // ------------------------------------------------------------------------------------
+
+ public static BigInteger getUserEU(UUID user_uuid) {
+ return GlobalEnergy.getOrDefault(SpaceProjectManager.getLeader(user_uuid), BigInteger.ZERO);
+ }
+
+ // This overwrites the EU in the network. Only use this if you are absolutely sure you know what you are doing.
+ public static void setUserEU(UUID user_uuid, BigInteger EU) {
+ // Mark the data as dirty and in need of saving.
+ try {
+ GlobalEnergyWorldSavedData.INSTANCE.markDirty();
+ } catch (Exception exception) {
+ System.out.println("COULD NOT MARK GLOBAL ENERGY AS DIRTY IN SET EU");
+ exception.printStackTrace();
+ }
+
+ GlobalEnergy.put(SpaceProjectManager.getLeader(user_uuid), EU);
+ }
+
+ public static void clearGlobalEnergyInformationMaps() {
+ // Do not use this unless you are 100% certain you know what you are doing.
+ GlobalEnergy.clear();
+ }
+
+ public static UUID processInitialSettings(final IGregTechTileEntity machine) {
+
+ // UUID and username of the owner.
+ final UUID UUID = machine.getOwnerUuid();
+
+ SpaceProjectManager.checkOrCreateTeam(UUID);
+ return UUID;
+ }
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/SpaceProjectManager.java b/src/main/java/gregtech/common/misc/spaceprojects/SpaceProjectManager.java
new file mode 100644
index 0000000000..323b22e20a
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/SpaceProjectManager.java
@@ -0,0 +1,309 @@
+package gregtech.common.misc.spaceprojects;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.server.MinecraftServer;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Recipe;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceBody;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject;
+
+/**
+ * @author BlueWeabo
+ */
+public class SpaceProjectManager {
+
+ /**
+ * Do not use! Only meant to be used in SpaceProjectWorldSavedData.java
+ */
+ public static Map<UUID, Map<Pair<ISpaceBody, String>, ISpaceProject>> spaceTeamProjects = new HashMap<>();
+ /**
+ * Do not use! Only meant to be used in SpaceProjectWorldSavedData.java Stores a Players UUID to the Leader UUID,
+ * players in lone groups give back their own UUID.
+ */
+ public static Map<UUID, UUID> spaceTeams = new HashMap<>();
+
+ /**
+ * Stores all the locations to a hash map to be accessed easier instead of through an enum
+ */
+ private static final HashMap<String, ISpaceBody> spaceLocations = new HashMap<>();
+
+ /**
+ * Stores all projects that have been made. Only adds them to this map if {@link #addProject(ISpaceProject)} has
+ * been used
+ */
+ private static final Map<String, ISpaceProject> spaceProjects = new HashMap<>();
+
+ // #region Space Project Team Helper methods
+
+ /**
+ * Used to get a specific project of the team dependent on the location and the project's name
+ */
+ public static ISpaceProject getTeamProject(UUID member, ISpaceBody location, String projectName) {
+ Map<Pair<ISpaceBody, String>, ISpaceProject> map = spaceTeamProjects.get(getLeader(member));
+ if (map == null) {
+ return null;
+ }
+ return map.get(Pair.of(location, projectName));
+ }
+
+ /**
+ * Makes a new Map for the teams if they don't have one. Adds a project to the team's project map.
+ *
+ * @param member Member of the team.
+ * @param location The location of where the project will belong to.
+ * @param projectName The name of the project being added.
+ * @param project Project which will be added to the team.
+ * @return Returns true when a project was added to the map of the player. Returns false otherwise.
+ */
+ public static boolean addTeamProject(UUID member, ISpaceBody location, String projectName, ISpaceProject project) {
+ if (!spaceTeamProjects.containsKey(getLeader(member)) || spaceTeamProjects.get(getLeader(member)) == null) {
+ spaceTeamProjects.put(getLeader(member), new HashMap<>());
+ }
+
+ Map<Pair<ISpaceBody, String>, ISpaceProject> map = spaceTeamProjects.get(getLeader(member));
+ if (map.containsKey(Pair.of(location, projectName))) {
+ return false;
+ }
+
+ project.setProjectLocation(location);
+ map.put(Pair.of(location, projectName), project);
+ if (SpaceProjectWorldSavedData.INSTANCE != null) {
+ SpaceProjectWorldSavedData.INSTANCE.markDirty();
+ }
+ return true;
+ }
+
+ /**
+ * Check whether a team has a project or not
+ *
+ * @param member Member of the team
+ * @param project The project, which you are checking for. This only compares the internal names of the project.
+ * @return True if the team has said project, false otherwise
+ */
+ public static boolean teamHasProject(UUID member, ISpaceProject project) {
+ Map<Pair<ISpaceBody, String>, ISpaceProject> map = spaceTeamProjects.get(getLeader(member));
+ if (map == null) {
+ return false;
+ }
+
+ return map.containsValue(project);
+ }
+
+ /**
+ * Used to handle when 2 players want to join together in a team. Player A can join player B's team. If player C
+ * gets an invite from A, C will join player B's team.
+ *
+ * @param teamMember Member which is joining the teamLeader
+ * @param teamLeader Leader of the party
+ */
+ public static void putInTeam(UUID teamMember, UUID teamLeader) {
+ if (teamMember.equals(teamLeader)) {
+ spaceTeams.put(teamMember, teamLeader);
+ } else if (!spaceTeams.get(teamLeader)
+ .equals(teamLeader)) {
+ putInTeam(teamMember, spaceTeams.get(teamLeader));
+ } else {
+ spaceTeams.put(teamMember, teamLeader);
+ }
+
+ if (SpaceProjectWorldSavedData.INSTANCE != null) {
+ SpaceProjectWorldSavedData.INSTANCE.markDirty();
+ }
+ }
+
+ /**
+ * Used to give back the UUID of the team leader.
+ *
+ * @return The UUID of the team leader.
+ */
+ public static UUID getLeader(UUID teamMember) {
+ checkOrCreateTeam(teamMember);
+ return spaceTeams.get(teamMember);
+ }
+
+ /**
+ * Used the multiblocks to check whether a given player has a team or not. If they don't have a team create one
+ * where they are their own leader.
+ *
+ * @param teamMember Member to check for.
+ */
+ public static void checkOrCreateTeam(UUID teamMember) {
+ if (spaceTeams.containsKey(teamMember)) {
+ return;
+ }
+
+ spaceTeams.put(teamMember, teamMember);
+ if (SpaceProjectWorldSavedData.INSTANCE != null) {
+ SpaceProjectWorldSavedData.INSTANCE.markDirty();
+ }
+ }
+
+ public static boolean isInTeam(UUID member) {
+ return spaceTeams.containsKey(member);
+ }
+
+ /**
+ * Will give back all the projects a team has made or is making.
+ *
+ * @param member UUID of the team member, used to find the leader of the team.
+ * @return All the projects a team has.
+ */
+ public static Collection<ISpaceProject> getTeamSpaceProjects(UUID member) {
+ Map<Pair<ISpaceBody, String>, ISpaceProject> map = spaceTeamProjects.get(getLeader(member));
+ if (map == null) {
+ return null;
+ }
+
+ return map.values();
+ }
+
+ /**
+ * Getting the project of a Team or a new copy.
+ *
+ * @param member UUID of the team member, which is used to find the team leader.
+ * @param projectName The name of the project, which needs to be found.
+ * @param location The location at which the project is found at.
+ * @return the project that the team has or a copy of a project.
+ */
+ public static ISpaceProject getTeamProjectOrCopy(UUID member, String projectName, ISpaceBody location) {
+ Map<Pair<ISpaceBody, String>, ISpaceProject> map = spaceTeamProjects.get(getLeader(member));
+ if (map == null) {
+ return getProject(projectName);
+ }
+
+ return map.getOrDefault(Pair.of(location, projectName), getProject(projectName));
+ }
+
+ // #endregion
+
+ // #region Project Helper methods
+
+ public static class FakeSpaceProjectRecipe extends GT_Recipe {
+
+ public final String projectName;
+
+ public FakeSpaceProjectRecipe(boolean aOptimize, ItemStack[] aInputs, FluidStack[] aFluidInputs, int aDuration,
+ int aEUt, int aSpecialValue, String projectName) {
+ super(aOptimize, aInputs, null, null, null, aFluidInputs, null, aDuration, aEUt, aSpecialValue);
+ this.projectName = projectName;
+ }
+ }
+
+ /**
+ * Used to add projects to the internal map.
+ *
+ * @param project Newly created project.
+ */
+ public static void addProject(ISpaceProject project) {
+ spaceProjects.put(project.getProjectName(), project);
+ RecipeMaps.spaceProjectFakeRecipes.add(
+ new FakeSpaceProjectRecipe(
+ false,
+ project.getTotalItemsCost(),
+ project.getTotalFluidsCost(),
+ project.getProjectBuildTime(),
+ (int) project.getProjectVoltage(),
+ project.getTotalStages(),
+ project.getProjectName()));
+ }
+
+ /**
+ * @param projectName Internal name of the project.
+ * @return a copy of the stored project.
+ */
+ public static ISpaceProject getProject(String projectName) {
+ ISpaceProject tProject = spaceProjects.get(projectName);
+ return tProject != null ? tProject.copy() : null;
+ }
+
+ /**
+ * Should only be used for GUIs!
+ *
+ * @return The Map that the projects are stored at.
+ */
+ public static Map<String, ISpaceProject> getProjectsMap() {
+ return spaceProjects;
+ }
+
+ /**
+ * Should only be used for GUIs!
+ *
+ * @return A Collection of all the projects contained in the map.
+ */
+ public static Collection<ISpaceProject> getAllProjects() {
+ return spaceProjects.values();
+ }
+
+ // #endregion
+
+ // #region Location Helper methods
+
+ /**
+ * Adds a location to the internal map. For it to be used later
+ *
+ * @param location to add to the internal map
+ */
+ public static void addLocation(ISpaceBody location) {
+ spaceLocations.put(location.getName(), location);
+ }
+
+ /**
+ *
+ * @return a Collection of all locations, which have been registered.
+ */
+ public static Collection<ISpaceBody> getLocations() {
+ return spaceLocations.values();
+ }
+
+ /**
+ *
+ * @return a Collection fo all location names, which have been registered
+ */
+ public static Collection<String> getLocationNames() {
+ return spaceLocations.keySet();
+ }
+
+ /**
+ *
+ * @param locationName Name used to search for the location
+ * @return The location, which has been registered with said name
+ */
+ public static ISpaceBody getLocation(String locationName) {
+ return spaceLocations.get(locationName);
+ }
+
+ // #endregion
+
+ // #region General Helper methods
+
+ /**
+ * Gets the UUID using the player's username
+ */
+ public static UUID getPlayerUUIDFromName(String playerName) {
+ return MinecraftServer.getServer()
+ .func_152358_ax()
+ .func_152655_a(playerName)
+ .getId();
+ }
+
+ /**
+ * Gets the player's name using their UUID
+ */
+ public static String getPlayerNameFromUUID(UUID playerUUID) {
+ return MinecraftServer.getServer()
+ .func_152358_ax()
+ .func_152652_a(playerUUID)
+ .getName();
+ }
+
+ // #endregion
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/SpaceProjectWorldSavedData.java b/src/main/java/gregtech/common/misc/spaceprojects/SpaceProjectWorldSavedData.java
new file mode 100644
index 0000000000..12f0005aea
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/SpaceProjectWorldSavedData.java
@@ -0,0 +1,343 @@
+package gregtech.common.misc.spaceprojects;
+
+import static gregtech.common.misc.spaceprojects.SpaceProjectManager.spaceTeamProjects;
+import static gregtech.common.misc.spaceprojects.SpaceProjectManager.spaceTeams;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.MAP_MAP;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.MAP_PAIR;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.MAP_PROJECT;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.MAP_UUID;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.PAIR_LEFT;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.PAIR_RIGHT;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.PROJECT_CURRENT_STAGE;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.PROJECT_CURRENT_UPGRADE;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.PROJECT_LOCATION;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.PROJECT_NAME;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.PROJECT_UPGRADES_BUILT;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.UPGRADE_CURRENT_STAGE;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.UPGRADE_NAME;
+import static gregtech.common.misc.spaceprojects.enums.JsonVariables.UPGRADE_PROJECT_PARENT;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.UUID;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraft.world.WorldSavedData;
+import net.minecraft.world.storage.MapStorage;
+import net.minecraftforge.event.world.WorldEvent;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.common.misc.spaceprojects.enums.SolarSystem;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceBody;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject.ISP_Upgrade;
+
+/**
+ * This class is used so that I can write and read to a json file before the world is opened. On server starting is too
+ * late for this as the data stored in the files is needed before entities load their nbt data
+ *
+ * @author BlueWeabo
+ */
+public class SpaceProjectWorldSavedData extends WorldSavedData {
+
+ public static SpaceProjectWorldSavedData INSTANCE;
+
+ private static final Gson GSON_SPACE_PROJECT = new GsonBuilder().serializeNulls()
+ .enableComplexMapKeySerialization()
+ .registerTypeAdapter(spaceTeamProjects.getClass(), new SpaceTeamProjectsMapAdapter())
+ .registerTypeAdapter(Map.class, new SpaceTeamProjectsMapAdapter())
+ .registerTypeAdapter(
+ Pair.of((ISpaceBody) SolarSystem.Ariel, "")
+ .getClass(),
+ new PairAdapter())
+ .registerTypeAdapter(Pair.class, new PairAdapter())
+ .registerTypeAdapter(ISpaceProject.class, new SpaceProjectAdapter())
+ .registerTypeAdapter(ISP_Upgrade.class, new SP_UpgradeAdapter())
+ .registerTypeHierarchyAdapter(ISpaceProject.class, new SpaceProjectAdapter())
+ .registerTypeHierarchyAdapter(ISP_Upgrade.class, new SP_UpgradeAdapter())
+ .create();
+ private static final Gson GSON_TEAMS = new GsonBuilder().serializeNulls()
+ .create();
+
+ private static final String DATA_NAME = "GT_SpaceProjectData";
+
+ private static final String SPACE_TEAM_PROJECTS_JSON = "spaceTeamProject.json";
+
+ private static final String SPACE_TEAMS_JSON = "spaceTeams.json";
+
+ private static File spaceTeamsFile;
+ private static File teamProjectsFile;
+
+ public SpaceProjectWorldSavedData() {
+ super(DATA_NAME);
+ }
+
+ public SpaceProjectWorldSavedData(String aData) {
+ super(aData);
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound aNBT) {
+ try (JsonReader reader = new JsonReader(new FileReader(teamProjectsFile))) {
+ spaceTeamProjects = GSON_SPACE_PROJECT.fromJson(reader, spaceTeamProjects.getClass());
+ } catch (Exception e) {
+ System.out.print("FAILED TO LOAD: " + SPACE_TEAM_PROJECTS_JSON);
+ e.printStackTrace();
+ }
+
+ try (JsonReader reader = new JsonReader(new FileReader(spaceTeamsFile))) {
+ HashMap<UUID, UUID> jsonMap = GSON_TEAMS.fromJson(reader, spaceTeams.getClass());
+ for (UUID member : jsonMap.keySet()) {
+ spaceTeams.put(member, jsonMap.get(member));
+ }
+ } catch (Exception e) {
+ System.out.print("FAILED TO LOAD: " + SPACE_TEAMS_JSON);
+ e.printStackTrace();
+ }
+
+ if (spaceTeamProjects == null) {
+ spaceTeamProjects = new HashMap<>();
+ }
+
+ if (spaceTeams == null) {
+ spaceTeams = new HashMap<>();
+ }
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound aNBT) {
+ if (spaceTeamProjects != null) {
+ try (JsonWriter writer = new JsonWriter(new FileWriter(teamProjectsFile))) {
+ GSON_SPACE_PROJECT.toJson(spaceTeamProjects, spaceTeamProjects.getClass(), writer);
+ } catch (Exception ex) {
+ System.out.print("FAILED TO SAVE: " + SPACE_TEAM_PROJECTS_JSON);
+ ex.printStackTrace();
+ }
+ }
+
+ if (spaceTeams != null) {
+ try (JsonWriter writer = new JsonWriter(new FileWriter(spaceTeamsFile))) {
+ GSON_TEAMS.toJson(spaceTeams, spaceTeams.getClass(), writer);
+ } catch (Exception ex) {
+ System.out.print("FAILED TO SAVE: " + SPACE_TEAMS_JSON);
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ private static void loadInstance(World aWorld) {
+ if (spaceTeamProjects != null) {
+ spaceTeamProjects.clear();
+ } else {
+ spaceTeamProjects = new HashMap<>();
+ }
+ if (spaceTeams != null) {
+ spaceTeams.clear();
+ } else {
+ spaceTeams = new HashMap<>();
+ }
+ spaceTeamsFile = new File(
+ aWorld.getSaveHandler()
+ .getWorldDirectory(),
+ SPACE_TEAMS_JSON);
+ teamProjectsFile = new File(
+ aWorld.getSaveHandler()
+ .getWorldDirectory(),
+ SPACE_TEAM_PROJECTS_JSON);
+ MapStorage tStorage = aWorld.mapStorage;
+ INSTANCE = (SpaceProjectWorldSavedData) tStorage.loadData(SpaceProjectWorldSavedData.class, DATA_NAME);
+ if (INSTANCE == null) {
+ INSTANCE = new SpaceProjectWorldSavedData();
+ tStorage.setData(DATA_NAME, INSTANCE);
+ }
+ INSTANCE.markDirty();
+ }
+
+ @SubscribeEvent
+ public void onWorldLoad(WorldEvent.Load aEvent) {
+ if (!aEvent.world.isRemote && aEvent.world.provider.dimensionId == 0) {
+ loadInstance(aEvent.world);
+ }
+ }
+
+ private static class PairAdapter
+ implements JsonSerializer<Pair<ISpaceBody, String>>, JsonDeserializer<Pair<ISpaceBody, String>> {
+
+ @Override
+ public JsonElement serialize(Pair<ISpaceBody, String> src, Type typeOfSrc, JsonSerializationContext context) {
+ JsonObject pair = new JsonObject();
+ pair.addProperty(
+ PAIR_LEFT,
+ src.getLeft()
+ .getName());
+ pair.addProperty(PAIR_RIGHT, src.getRight());
+ return pair;
+ }
+
+ @Override
+ public Pair<ISpaceBody, String> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+ throws JsonParseException {
+ Pair<ISpaceBody, String> pair = null;
+ if (json.isJsonObject()) {
+ JsonObject obj = json.getAsJsonObject();
+ pair = Pair.of(
+ SpaceProjectManager.getLocation(
+ obj.get(PAIR_LEFT)
+ .getAsString()),
+ obj.get(PAIR_RIGHT)
+ .getAsString());
+ }
+ return pair;
+ }
+ }
+
+ private static class SpaceProjectAdapter implements JsonSerializer<ISpaceProject>, JsonDeserializer<ISpaceProject> {
+
+ @Override
+ public JsonElement serialize(ISpaceProject src, Type typeOfSrc, JsonSerializationContext context) {
+ JsonObject obj = new JsonObject();
+ obj.addProperty(PROJECT_NAME, src.getProjectName());
+ obj.addProperty(PROJECT_CURRENT_STAGE, src.getCurrentStage());
+ obj.addProperty(
+ PROJECT_LOCATION,
+ src.getProjectLocation()
+ .getName());
+ obj.add(PROJECT_CURRENT_UPGRADE, context.serialize(src.getUpgradeBeingBuilt()));
+ obj.add(PROJECT_UPGRADES_BUILT, context.serialize(src.getAllBuiltUpgrades()));
+ return obj;
+ }
+
+ @Override
+ public ISpaceProject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+ throws JsonParseException {
+ if (!json.isJsonObject()) {
+ return null;
+ }
+ JsonObject obj = json.getAsJsonObject();
+ String projectName = obj.get(PROJECT_NAME)
+ .getAsString();
+ ISpaceProject project = SpaceProjectManager.getProject(projectName);
+ int projectCurrentStage = obj.get(PROJECT_CURRENT_STAGE)
+ .getAsInt();
+ ISP_Upgrade[] projectUpgradesBuilt = new ISP_Upgrade[0];
+ projectUpgradesBuilt = context
+ .deserialize(obj.get(PROJECT_UPGRADES_BUILT), projectUpgradesBuilt.getClass());
+ ISP_Upgrade projectCurrentUpgrade = context
+ .deserialize(obj.get(PROJECT_CURRENT_UPGRADE), ISP_Upgrade.class);
+ ISpaceBody projectLocation = SpaceProjectManager.getLocation(
+ obj.get(PROJECT_LOCATION)
+ .getAsString());
+ project.setBuiltUpgrade(projectUpgradesBuilt);
+ project.setProjectLocation(projectLocation);
+ project.setProjectCurrentStage(projectCurrentStage);
+ project.setCurrentUpgradeBeingBuilt(projectCurrentUpgrade);
+ return project;
+ }
+ }
+
+ private static class SP_UpgradeAdapter implements JsonSerializer<ISP_Upgrade>, JsonDeserializer<ISP_Upgrade> {
+
+ @Override
+ public JsonElement serialize(ISP_Upgrade src, Type typeOfSrc, JsonSerializationContext context) {
+ JsonObject obj = new JsonObject();
+ obj.addProperty(UPGRADE_NAME, src.getUpgradeName());
+ obj.addProperty(
+ UPGRADE_PROJECT_PARENT,
+ src.getParentProject()
+ .getProjectName());
+ obj.addProperty(UPGRADE_CURRENT_STAGE, src.getCurrentStage());
+ return obj;
+ }
+
+ @Override
+ public ISP_Upgrade deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+ throws JsonParseException {
+ if (!json.isJsonObject()) {
+ return null;
+ }
+ JsonObject obj = json.getAsJsonObject();
+ String projectName = obj.get(UPGRADE_PROJECT_PARENT)
+ .getAsString();
+ ISpaceProject project = SpaceProjectManager.getProject(projectName);
+ ISP_Upgrade upgrade = project.getUpgrade(
+ obj.get(UPGRADE_NAME)
+ .getAsString());
+ if (upgrade == null) {
+ return null;
+ }
+ upgrade = upgrade.copy();
+ upgrade.setUpgradeCurrentStage(
+ obj.get(UPGRADE_CURRENT_STAGE)
+ .getAsInt());
+ return upgrade;
+ }
+ }
+
+ private static class SpaceTeamProjectsMapAdapter
+ implements JsonSerializer<Map<UUID, Map<Pair<ISpaceBody, String>, ISpaceProject>>>,
+ JsonDeserializer<Map<UUID, Map<Pair<ISpaceBody, String>, ISpaceProject>>> {
+
+ @Override
+ public JsonElement serialize(Map<UUID, Map<Pair<ISpaceBody, String>, ISpaceProject>> src, Type typeOfSrc,
+ JsonSerializationContext context) {
+ JsonArray map = new JsonArray();
+ for (Entry<UUID, Map<Pair<ISpaceBody, String>, ISpaceProject>> firstEntry : src.entrySet()) {
+ JsonObject teamMap = new JsonObject();
+ teamMap.add(MAP_UUID, context.serialize(firstEntry.getKey()));
+ JsonArray teamProjectMap = new JsonArray();
+ for (Entry<Pair<ISpaceBody, String>, ISpaceProject> secondEntry : firstEntry.getValue()
+ .entrySet()) {
+ JsonObject projectMap = new JsonObject();
+ projectMap.add(MAP_PAIR, context.serialize(secondEntry.getKey()));
+ projectMap.add(MAP_PROJECT, context.serialize(secondEntry.getValue()));
+ teamProjectMap.add(projectMap);
+ }
+ teamMap.add(MAP_MAP, teamProjectMap);
+ map.add(teamMap);
+ }
+ return map;
+ }
+
+ @Override
+ public Map<UUID, Map<Pair<ISpaceBody, String>, ISpaceProject>> deserialize(JsonElement json, Type typeOfT,
+ JsonDeserializationContext context) throws JsonParseException {
+ JsonArray mapArray = json.getAsJsonArray();
+ Map<UUID, Map<Pair<ISpaceBody, String>, ISpaceProject>> map = new HashMap<>();
+ for (JsonElement teamMapElement : mapArray) {
+ JsonObject teamMap = teamMapElement.getAsJsonObject();
+ UUID uuid = context.deserialize(teamMap.get(MAP_UUID), UUID.class);
+ Map<Pair<ISpaceBody, String>, ISpaceProject> projectMap = new HashMap<>();
+ for (JsonElement teamProjectMapElement : teamMap.get(MAP_MAP)
+ .getAsJsonArray()) {
+ JsonObject teamProjectMap = teamProjectMapElement.getAsJsonObject();
+ Pair<ISpaceBody, String> pair = context.deserialize(teamProjectMap.get(MAP_PAIR), Pair.class);
+ ISpaceProject project = context.deserialize(teamProjectMap.get(MAP_PROJECT), ISpaceProject.class);
+ projectMap.put(pair, project);
+ }
+ map.put(uuid, projectMap);
+ }
+ return map;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Requirements.java b/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Requirements.java
new file mode 100644
index 0000000000..b910b5e344
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Requirements.java
@@ -0,0 +1,74 @@
+package gregtech.common.misc.spaceprojects.base;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import gregtech.common.misc.spaceprojects.enums.SpaceBodyType;
+import gregtech.common.misc.spaceprojects.enums.StarType;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject.ISP_Requirements;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject.ISP_Upgrade;
+
+/**
+ * @author BlueWeabo
+ */
+public class SP_Requirements implements ISP_Requirements {
+
+ // #region Variables
+
+ protected SpaceBodyType spaceBody = SpaceBodyType.NONE;
+ protected StarType star = StarType.NotAStar;
+ protected List<ISpaceProject> spaceProjects = new ArrayList<>();
+ protected List<ISP_Upgrade> upgrades = new ArrayList<>();
+
+ // #endregion
+
+ // #region Getters
+
+ @Override
+ public SpaceBodyType getBodyType() {
+ return spaceBody;
+ }
+
+ @Override
+ public StarType getStarType() {
+ return star;
+ }
+
+ @Override
+ public List<ISpaceProject> getProjects() {
+ return spaceProjects;
+ }
+
+ @Override
+ public List<ISP_Upgrade> getUpgrades() {
+ return upgrades;
+ }
+
+ // #endregion
+
+ // #region Setters/Builder
+
+ public SP_Requirements setSpaceBodyType(SpaceBodyType spaceBodyType) {
+ spaceBody = spaceBodyType;
+ return this;
+ }
+
+ public SP_Requirements setStarType(StarType starType) {
+ star = starType;
+ return this;
+ }
+
+ public SP_Requirements setUpgrades(ISP_Upgrade... requirementUpgrades) {
+ upgrades.addAll(Arrays.asList(requirementUpgrades));
+ return this;
+ }
+
+ public SP_Requirements setSpaceProjects(ISpaceProject... requirementProjects) {
+ spaceProjects.addAll(Arrays.asList(requirementProjects));
+ return this;
+ }
+
+ // #endregion
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Upgrade.java b/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Upgrade.java
new file mode 100644
index 0000000000..835a57f277
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/base/SP_Upgrade.java
@@ -0,0 +1,362 @@
+package gregtech.common.misc.spaceprojects.base;
+
+import java.util.UUID;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.common.misc.spaceprojects.SpaceProjectManager;
+import gregtech.common.misc.spaceprojects.enums.SpaceBodyType;
+import gregtech.common.misc.spaceprojects.enums.UpgradeStatus;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject.ISP_Upgrade;
+
+/**
+ * @author BlueWeabo
+ */
+public class SP_Upgrade implements ISP_Upgrade {
+
+ // #region Variables
+
+ protected String name;
+ protected String unlocalizedName;
+ protected ItemStack[] itemsCost;
+ protected FluidStack[] fluidsCost;
+ protected int totalStages;
+ protected int currentStage;
+ protected int buildTime;
+ protected long voltage;
+ protected SP_Requirements requirements;
+ protected ISpaceProject projectBelongingTo;
+
+ // #endregion
+
+ // #region Getters
+
+ @Override
+ public String getUpgradeName() {
+ return name;
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return unlocalizedName;
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return StatCollector.translateToLocal(unlocalizedName);
+ }
+
+ @Override
+ public ItemStack[] getItemsCostPerStage() {
+ return itemsCost;
+ }
+
+ @Override
+ public ItemStack getItemCostPerStage(int index) {
+ if (itemsCost == null || index < 0 || index >= itemsCost.length) {
+ return null;
+ }
+
+ return itemsCost[index];
+ }
+
+ @Override
+ public ItemStack[] getCurrentItemsProgress() {
+ ItemStack[] currentItemsProgress = new ItemStack[itemsCost.length];
+ int index = 0;
+ for (ItemStack item : itemsCost) {
+ ItemStack copy = item.copy();
+ copy.stackSize *= getCurrentStage();
+ currentItemsProgress[index++] = copy;
+ }
+
+ return currentItemsProgress;
+ }
+
+ @Override
+ public ItemStack getCurrentItemProgress(int index) {
+ if (itemsCost == null || index < 0 || index >= itemsCost.length || itemsCost[index] == null) {
+ return null;
+ }
+
+ ItemStack item = itemsCost[index].copy();
+ item.stackSize *= getCurrentStage();
+ return item;
+ }
+
+ @Override
+ public ItemStack[] getTotalItemsCost() {
+ ItemStack[] totalItemsCost = new ItemStack[itemsCost.length];
+ int index = 0;
+ for (ItemStack item : itemsCost) {
+ ItemStack copy = item.copy();
+ copy.stackSize *= getTotalStages();
+ totalItemsCost[index++] = copy;
+ }
+
+ return totalItemsCost;
+ }
+
+ @Override
+ public ItemStack getTotalItemCost(int index) {
+ if (itemsCost == null || index < 0 || index >= itemsCost.length || itemsCost[index] == null) {
+ return null;
+ }
+
+ ItemStack item = itemsCost[index].copy();
+ item.stackSize *= getTotalStages();
+ return item;
+ }
+
+ @Override
+ public FluidStack[] getFluidsCostPerStage() {
+ return fluidsCost;
+ }
+
+ @Override
+ public FluidStack getFluidCostPerStage(int index) {
+ if (fluidsCost == null || index < 0 || index >= fluidsCost.length) {
+ return null;
+ }
+
+ return fluidsCost[index];
+ }
+
+ @Override
+ public FluidStack[] getCurrentFluidsProgress() {
+ if (fluidsCost == null) {
+ return null;
+ }
+
+ FluidStack[] currentFluidsProgress = new FluidStack[fluidsCost.length];
+ int index = 0;
+ for (FluidStack fluid : fluidsCost) {
+ FluidStack copy = fluid.copy();
+ copy.amount *= getCurrentStage();
+ currentFluidsProgress[index++] = copy;
+ }
+
+ return currentFluidsProgress;
+ }
+
+ @Override
+ public FluidStack getCurrentFluidProgress(int index) {
+ if (fluidsCost == null || index < 0 || index >= fluidsCost.length || fluidsCost[index] == null) {
+ return null;
+ }
+
+ FluidStack fluid = fluidsCost[index].copy();
+ fluid.amount *= getCurrentStage();
+ return fluid;
+ }
+
+ @Override
+ public FluidStack[] getTotalFluidsCost() {
+ if (fluidsCost == null) {
+ return null;
+ }
+
+ FluidStack[] totalFluidsCost = new FluidStack[fluidsCost.length];
+ int index = 0;
+ for (FluidStack fluid : fluidsCost) {
+ FluidStack copy = fluid.copy();
+ copy.amount *= getTotalStages();
+ totalFluidsCost[index++] = copy;
+ }
+
+ return totalFluidsCost;
+ }
+
+ @Override
+ public FluidStack getTotalFluidCost(int index) {
+ if (fluidsCost == null || index < 0 || index >= fluidsCost.length || fluidsCost[index] == null) {
+ return null;
+ }
+
+ FluidStack fluid = fluidsCost[index].copy();
+ fluid.amount *= getTotalStages();
+ return fluid;
+ }
+
+ @Override
+ public int getTotalStages() {
+ return totalStages;
+ }
+
+ @Override
+ public int getUpgradeBuildTime() {
+ return buildTime;
+ }
+
+ @Override
+ public int getCurrentStage() {
+ return currentStage;
+ }
+
+ @Override
+ public float getCurrentProgress() {
+ return currentStage / totalStages * 100.0f;
+ }
+
+ @Override
+ public long getVoltage() {
+ return voltage;
+ }
+
+ @Override
+ public UpgradeStatus getStatus() {
+ if (requirements == null) {
+ return UpgradeStatus.Unlocked;
+ }
+
+ if (isFinished()) {
+ return UpgradeStatus.Finished;
+ }
+ return UpgradeStatus.Locked;
+ }
+
+ @Override
+ public SP_Requirements getUpgradeRequirements() {
+ return requirements;
+ }
+
+ @Override
+ public ISpaceProject getParentProject() {
+ return projectBelongingTo;
+ }
+
+ // #endregion
+
+ // #region Setter/Builder
+
+ public SP_Upgrade() {}
+
+ public SP_Upgrade setUpgradeName(String upgradeName) {
+ name = upgradeName;
+ return this;
+ }
+
+ public SP_Upgrade setUpgradeUnlocalizedName(String upgradeUnlocalizedName) {
+ unlocalizedName = upgradeUnlocalizedName;
+ return this;
+ }
+
+ public SP_Upgrade setUpgradeItemsCost(ItemStack... upgradeItemsCost) {
+ itemsCost = upgradeItemsCost;
+ return this;
+ }
+
+ public SP_Upgrade setUpgradeFluidsCost(FluidStack... upgradeFluidsCost) {
+ fluidsCost = upgradeFluidsCost;
+ return this;
+ }
+
+ public SP_Upgrade setUpgradeRequirements(SP_Requirements upgradeRequirements) {
+ requirements = upgradeRequirements;
+ return this;
+ }
+
+ public SP_Upgrade setUpgradeTotalStages(int upgradeTotalStages) {
+ totalStages = upgradeTotalStages;
+ return this;
+ }
+
+ public SP_Upgrade setUpgradeBuildTime(int upgradeBuildTime) {
+ buildTime = upgradeBuildTime;
+ return this;
+ }
+
+ public SP_Upgrade setUpgradeVoltage(long upgradeVoltage) {
+ voltage = upgradeVoltage;
+ return this;
+ }
+
+ @Override
+ public void setUpgradeProject(ISpaceProject project) {
+ projectBelongingTo = project;
+ }
+
+ @Override
+ public void setUpgradeCurrentStage(int stage) {
+ currentStage = stage;
+ }
+
+ // #endregion
+
+ // #region Other
+
+ @Override
+ public boolean meetsRequirements(UUID aTeam) {
+ if (requirements == null) {
+ return true;
+ }
+
+ if (requirements.getBodyType() != null && !requirements.getBodyType()
+ .equals(SpaceBodyType.NONE)) {
+ if (!requirements.getBodyType()
+ .equals(
+ projectBelongingTo.getProjectLocation()
+ .getType())) {
+ return false;
+ }
+ }
+
+ if (requirements.getStarType() != null) {
+ if (!requirements.getStarType()
+ .equals(
+ projectBelongingTo.getProjectLocation()
+ .getStarType())) {
+ return false;
+ }
+ }
+
+ if (requirements.getProjects() != null) {
+ for (ISpaceProject tProject : requirements.getProjects()) {
+ if (!SpaceProjectManager.teamHasProject(aTeam, tProject)) {
+ return false;
+ }
+ }
+ }
+
+ if (requirements.getUpgrades() != null) {
+ for (ISP_Upgrade upgrade : requirements.getUpgrades()) {
+ if (!projectBelongingTo.hasUpgrade(upgrade.getUpgradeName())) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public SP_Upgrade copy() {
+ return new SP_Upgrade().setUpgradeName(name)
+ .setUpgradeUnlocalizedName(unlocalizedName)
+ .setUpgradeBuildTime(buildTime)
+ .setUpgradeFluidsCost(fluidsCost)
+ .setUpgradeItemsCost(itemsCost)
+ .setUpgradeRequirements(requirements)
+ .setUpgradeTotalStages(totalStages)
+ .setUpgradeVoltage(voltage);
+ }
+
+ @Override
+ public void goToNextStage() {
+ currentStage++;
+ if (isFinished()) {
+ projectBelongingTo.setBuiltUpgrade(this);
+ }
+ }
+
+ @Override
+ public boolean isFinished() {
+ return currentStage == totalStages;
+ }
+
+ // #endregion
+
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/base/SpaceProject.java b/src/main/java/gregtech/common/misc/spaceprojects/base/SpaceProject.java
new file mode 100644
index 0000000000..201b7c27a9
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/base/SpaceProject.java
@@ -0,0 +1,451 @@
+package gregtech.common.misc.spaceprojects.base;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+import gregtech.common.misc.spaceprojects.SpaceProjectManager;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceBody;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject;
+
+/**
+ * @author BlueWeabo
+ */
+public class SpaceProject implements ISpaceProject {
+
+ // #region Variables
+
+ protected String name;
+ protected String unlocalizedName;
+ protected long voltage;
+ protected int buildTime;
+ protected int projectTier;
+ protected int currentStage;
+ protected int totalStage;
+ protected Map<String, ISP_Upgrade> upgradesAvailable = new HashMap<>();
+ protected Map<String, ISP_Upgrade> upgradesInstalled = new HashMap<>();
+ protected ISP_Requirements requirements;
+ protected ISP_Upgrade currentUpgrade;
+ protected ItemStack[] itemsCost;
+ protected FluidStack[] fluidsCost;
+ protected ISpaceBody location;
+ protected UITexture texture;
+
+ // #endregion
+
+ // #region Getters
+
+ @Override
+ public String getProjectName() {
+ return name;
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return unlocalizedName;
+ }
+
+ public String getLocalizedName() {
+ return StatCollector.translateToLocal(unlocalizedName);
+ }
+
+ @Override
+ public long getProjectVoltage() {
+ return voltage;
+ }
+
+ @Override
+ public int getProjectBuildTime() {
+ return buildTime;
+ }
+
+ @Override
+ public float getProjectCurrentProgress() {
+ return currentStage / totalStage * 100.0f;
+ }
+
+ @Override
+ public int getProjectTier() {
+ return projectTier;
+ }
+
+ @Override
+ public int getCurrentStage() {
+ return currentStage;
+ }
+
+ @Override
+ public int getTotalStages() {
+ return totalStage;
+ }
+
+ @Override
+ public Collection<ISP_Upgrade> getAllUpgrades() {
+ return upgradesAvailable.values();
+ }
+
+ @Override
+ public Map<String, ISP_Upgrade> getUpgradesBuiltMap() {
+ return upgradesInstalled;
+ }
+
+ @Override
+ public Collection<ISP_Upgrade> getAllBuiltUpgrades() {
+ return upgradesInstalled.values();
+ }
+
+ @Override
+ public ISP_Upgrade getUpgrade(String upgradeName) {
+ return upgradesAvailable.get(upgradeName);
+ }
+
+ @Override
+ public ItemStack[] getItemsCostPerStage() {
+ return itemsCost;
+ }
+
+ @Override
+ public ItemStack getItemCostPerStage(int index) {
+ if (itemsCost == null || index < 0 || index >= itemsCost.length) {
+ return null;
+ }
+
+ return itemsCost[index];
+ }
+
+ @Override
+ public ItemStack[] getCurrentItemsProgress() {
+ ItemStack[] currentItemsProgress = new ItemStack[itemsCost.length];
+ int index = 0;
+ for (ItemStack item : itemsCost) {
+ if (item == null) {
+ currentItemsProgress[index++] = null;
+ continue;
+ }
+ ItemStack copy = item.copy();
+ copy.stackSize *= getCurrentStage();
+ currentItemsProgress[index++] = copy;
+ }
+
+ return currentItemsProgress;
+ }
+
+ @Override
+ public ItemStack getCurrentItemProgress(int index) {
+ if (itemsCost == null || index < 0 || index >= itemsCost.length || itemsCost[index] == null) {
+ return null;
+ }
+
+ ItemStack item = itemsCost[index].copy();
+ item.stackSize *= getCurrentStage();
+ return item;
+ }
+
+ @Override
+ public ItemStack[] getTotalItemsCost() {
+ ItemStack[] totalItemsCost = new ItemStack[itemsCost.length];
+ int index = 0;
+ for (ItemStack item : itemsCost) {
+ if (item == null) {
+ totalItemsCost[index++] = null;
+ continue;
+ }
+ ItemStack copy = item.copy();
+ copy.stackSize *= getTotalStages();
+ totalItemsCost[index++] = copy;
+ }
+
+ return totalItemsCost;
+ }
+
+ @Override
+ public ItemStack getTotalItemCost(int index) {
+ if (itemsCost == null || index < 0 || index >= itemsCost.length || itemsCost[index] == null) {
+ return null;
+ }
+
+ ItemStack item = itemsCost[index].copy();
+ item.stackSize *= getTotalStages();
+ return item;
+ }
+
+ @Override
+ public FluidStack[] getFluidsCostPerStage() {
+ return fluidsCost;
+ }
+
+ @Override
+ public FluidStack getFluidCostPerStage(int index) {
+ if (fluidsCost == null || index < 0 || index >= fluidsCost.length || fluidsCost[index] == null) {
+ return null;
+ }
+
+ return fluidsCost[index];
+ }
+
+ @Override
+ public FluidStack[] getCurrentFluidsProgress() {
+ if (fluidsCost == null) {
+ return null;
+ }
+
+ FluidStack[] currentFluidsProgress = new FluidStack[fluidsCost.length];
+ int index = 0;
+ for (FluidStack fluid : fluidsCost) {
+ if (fluid == null) {
+ currentFluidsProgress[index++] = null;
+ continue;
+ }
+ FluidStack copy = fluid.copy();
+ copy.amount *= getCurrentStage();
+ currentFluidsProgress[index++] = copy;
+ }
+
+ return currentFluidsProgress;
+ }
+
+ @Override
+ public FluidStack getCurrentFluidProgress(int index) {
+ if (fluidsCost == null || index < 0 || index >= fluidsCost.length || fluidsCost[index] == null) {
+ return null;
+ }
+
+ FluidStack fluid = fluidsCost[index].copy();
+ fluid.amount *= getCurrentStage();
+ return fluid;
+ }
+
+ @Override
+ public FluidStack[] getTotalFluidsCost() {
+ if (fluidsCost == null) {
+ return null;
+ }
+
+ FluidStack[] totalFluidsCost = new FluidStack[fluidsCost.length];
+ int index = 0;
+ for (FluidStack fluid : fluidsCost) {
+ if (fluid == null) {
+ totalFluidsCost[index++] = null;
+ continue;
+ }
+ FluidStack copy = fluid.copy();
+ copy.amount *= getTotalStages();
+ totalFluidsCost[index++] = copy;
+ }
+
+ return totalFluidsCost;
+ }
+
+ @Override
+ public FluidStack getTotalFluidCost(int index) {
+ if (fluidsCost == null || index < 0 || index >= fluidsCost.length) {
+ return null;
+ }
+
+ FluidStack fluid = fluidsCost[index].copy();
+ fluid.amount *= getTotalStages();
+ return fluid;
+ }
+
+ @Override
+ public ISP_Upgrade getUpgradeBeingBuilt() {
+ return currentUpgrade;
+ }
+
+ @Override
+ public ISpaceBody getProjectLocation() {
+ return location;
+ }
+
+ @Override
+ public UITexture getTexture() {
+ return texture;
+ }
+
+ // #endregion
+
+ // #region Setter/Builder
+
+ public SpaceProject setProjectName(String spaceProjectName) {
+ name = spaceProjectName;
+ return this;
+ }
+
+ public SpaceProject setProjectUnlocalizedName(String spaceProjectUnlocalizedName) {
+ unlocalizedName = spaceProjectUnlocalizedName;
+ return this;
+ }
+
+ public SpaceProject setProjectVoltage(long spaceProjectVoltage) {
+ voltage = spaceProjectVoltage;
+ return this;
+ }
+
+ public SpaceProject setProjectBuildTime(int spaceProjectBuildTime) {
+ buildTime = spaceProjectBuildTime;
+ return this;
+ }
+
+ public SpaceProject setProjectStages(int spaceProjectTotalStages) {
+ totalStage = spaceProjectTotalStages;
+ return this;
+ }
+
+ public SpaceProject setProjectItemsCost(ItemStack... spaceProjectItemsCost) {
+ itemsCost = spaceProjectItemsCost;
+ return this;
+ }
+
+ public SpaceProject setProjectFluidsCost(FluidStack... spaceProjectFluidsCost) {
+ fluidsCost = spaceProjectFluidsCost;
+ return this;
+ }
+
+ public SpaceProject setProjectUpgrades(ISP_Upgrade... spaceProjectUpgrades) {
+ for (ISP_Upgrade upgrade : spaceProjectUpgrades) {
+ upgrade.setUpgradeProject(this);
+ upgradesAvailable.put(upgrade.getUpgradeName(), upgrade);
+ }
+ return this;
+ }
+
+ public SpaceProject setProjectTexture(UITexture projectTexture) {
+ texture = projectTexture;
+ return this;
+ }
+
+ public SpaceProject setProjectRequirements(ISP_Requirements projectRequirements) {
+ requirements = projectRequirements;
+ return this;
+ }
+
+ @Override
+ public void setCurrentUpgradeBeingBuilt(ISP_Upgrade newCurrentUpgrade) {
+ if (newCurrentUpgrade == null) {
+ return;
+ }
+
+ if (totalStage == currentStage) {
+ currentUpgrade = newCurrentUpgrade.copy();
+ currentUpgrade.setUpgradeProject(this);
+ }
+ }
+
+ @Override
+ public void setProjectCurrentStage(int newCurrentStage) {
+ currentStage = newCurrentStage;
+ }
+
+ @Override
+ public void setProjectLocation(ISpaceBody newLocation) {
+ location = newLocation;
+ }
+
+ @Override
+ public void setBuiltUpgrade(ISP_Upgrade... upgrades) {
+ if (upgrades == null) {
+ return;
+ }
+
+ for (ISP_Upgrade upgrade : upgrades) {
+ if (upgrade.equals(currentUpgrade)) {
+ currentUpgrade = null;
+ }
+ upgradesInstalled.put(upgrade.getUpgradeName(), upgrade);
+ }
+ }
+
+ // #endregion
+
+ // #region Other
+
+ @Override
+ public ISpaceProject copy() {
+ SpaceProject copy = new SpaceProject().setProjectName(name)
+ .setProjectUnlocalizedName(unlocalizedName)
+ .setProjectVoltage(voltage)
+ .setProjectBuildTime(buildTime)
+ .setProjectItemsCost(itemsCost)
+ .setProjectFluidsCost(fluidsCost)
+ .setProjectStages(totalStage)
+ .setProjectTexture(texture)
+ .setProjectRequirements(requirements);
+ if (upgradesAvailable != null) {
+ ISP_Upgrade[] upgrades = new SP_Upgrade[upgradesAvailable.size()];
+ int index = 0;
+ for (ISP_Upgrade upgrade : upgradesAvailable.values()) {
+ upgrades[index++] = upgrade.copy();
+ }
+ copy.setProjectUpgrades(upgrades);
+ }
+ return copy;
+ }
+
+ @Override
+ public void goToNextStage() {
+ currentStage++;
+ }
+
+ @Override
+ public boolean meetsRequirements(UUID team) {
+ return meetsRequirements(team, true);
+ }
+
+ @Override
+ public boolean meetsRequirements(UUID team, boolean checkLocation) {
+ if (requirements == null) {
+ return true;
+ }
+
+ if (requirements.getBodyType() != null && checkLocation) {
+ if (!requirements.getBodyType()
+ .equals(location.getType())) {
+ return false;
+ }
+ }
+
+ if (requirements.getStarType() != null && checkLocation) {
+ if (!requirements.getStarType()
+ .equals(location.getStarType())) {
+ return false;
+ }
+ }
+
+ if (requirements.getProjects() != null) {
+ for (ISpaceProject project : requirements.getProjects()) {
+ if (!SpaceProjectManager.teamHasProject(team, project)) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof SpaceProject)) {
+ return false;
+ }
+ return getProjectName().equals(((SpaceProject) obj).getProjectName());
+ }
+
+ @Override
+ public boolean isFinished() {
+ return currentStage == totalStage;
+ }
+
+ @Override
+ public boolean hasUpgrade(String upgradeName) {
+ return upgradesInstalled.containsKey(upgradeName);
+ }
+
+ // #endregion
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/commands/SPM_Command.java b/src/main/java/gregtech/common/misc/spaceprojects/commands/SPM_Command.java
new file mode 100644
index 0000000000..896c7e1052
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/commands/SPM_Command.java
@@ -0,0 +1,288 @@
+package gregtech.common.misc.spaceprojects.commands;
+
+import static gregtech.common.misc.spaceprojects.SpaceProjectManager.getLocation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.util.ChatComponentText;
+
+import gregtech.common.misc.spaceprojects.SpaceProjectManager;
+import gregtech.common.misc.spaceprojects.SpaceProjectWorldSavedData;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceProject;
+
+/**
+ * @author BlueWeabo
+ */
+public class SPM_Command extends CommandBase {
+
+ private static final String RESET = "reset";
+ private static final String UNLOCK = "unlock";
+ private static final String UNLOCK_UPGRADE = "unlock_upgrade";
+ private static final String LOCK = "lock";
+ private static final String LIST = "list";
+ private static final String ALL = "-all";
+ private static final String AVAILABLE = "-available";
+ private static final String UNLOCKED = "-unlocked";
+ private static final String COPY = "copy";
+
+ @Override
+ public String getCommandName() {
+ return "spm";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender sender) {
+ return "/" + this.getCommandName() + " <subCommand>. Available subCommands: reset, unlock, lock, list, copy";
+ }
+
+ @Override
+ public void processCommand(ICommandSender sender, String[] arguments) {
+ if (arguments.length < 1) {
+ printHelp(sender);
+ return;
+ }
+ switch (arguments[0]) {
+ case RESET:
+ if (!sender.canCommandSenderUseCommand(4, getCommandName())) {
+ sender.addChatMessage(
+ new ChatComponentText("You don't have the permissions to execute this command"));
+ return;
+ }
+ processReset(sender, arguments.length >= 2 ? arguments[1] : sender.getCommandSenderName());
+ break;
+ case UNLOCK:
+ if (!sender.canCommandSenderUseCommand(4, getCommandName())) {
+ sender.addChatMessage(
+ new ChatComponentText("You don't have the permissions to execute this command"));
+ return;
+ }
+ if (arguments.length < 3) {
+ sender.addChatMessage(
+ new ChatComponentText("Not enough arguments. Needs to mention a project and a location"));
+ return;
+ }
+ processUnlock(
+ sender,
+ arguments[1],
+ arguments[2],
+ arguments.length >= 4 ? arguments[3] : sender.getCommandSenderName());
+ break;
+ case UNLOCK_UPGRADE:
+ if (!sender.canCommandSenderUseCommand(4, getCommandName())) {
+ sender.addChatMessage(
+ new ChatComponentText("You don't have the permissions to execute this command"));
+ return;
+ }
+ if (arguments.length < 4) {
+ sender.addChatMessage(
+ new ChatComponentText(
+ "Not enough arguments. Needs to mention a project a location and an upgrade name"));
+ return;
+ }
+ processUnlock(
+ sender,
+ arguments[1],
+ arguments[2],
+ arguments[3],
+ arguments.length >= 5 ? arguments[4] : sender.getCommandSenderName());
+ break;
+ case LOCK:
+ if (!sender.canCommandSenderUseCommand(4, getCommandName())) {
+ sender.addChatMessage(
+ new ChatComponentText("You don't have the permissions to execute this command"));
+ return;
+ }
+ if (arguments.length < 3) {
+ sender.addChatMessage(
+ new ChatComponentText("Not enough arguments. Needs to mention a project and a location"));
+ return;
+ }
+ processLock(
+ sender,
+ arguments[1],
+ arguments[2],
+ arguments.length >= 4 ? arguments[3] : sender.getCommandSenderName());
+ case LIST:
+ if (arguments.length < 2) {
+ sender.addChatMessage(
+ new ChatComponentText(
+ "No Argument for list subCommand. Usage /spm list -all, -available or -unlocked"));
+ return;
+ }
+ processList(sender, arguments[1], arguments.length >= 3 ? arguments[2] : sender.getCommandSenderName());
+ break;
+ case COPY:
+ if (!sender.canCommandSenderUseCommand(4, getCommandName())) {
+ sender.addChatMessage(
+ new ChatComponentText("You don't have the permissions to execute this command"));
+ return;
+ }
+ if (arguments.length < 3) {
+ sender.addChatMessage(new ChatComponentText("Not enough arguments. Needs to mention 2 players"));
+ return;
+ }
+ processCopy(sender, arguments[1], arguments[2]);
+ break;
+ }
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] arguments) {
+ List<String> autoComplete = new ArrayList<>();
+ String filter = arguments.length == 0 ? "" : arguments[0].trim();
+ switch (arguments.length) {
+ case 1 -> autoComplete.addAll(Arrays.asList(getSubCommands()));
+ case 2 -> {
+ filter = arguments[1].trim();
+ if (arguments[0].equals(LIST)) {
+ autoComplete.addAll(Arrays.asList(getListArguments()));
+ } else if (arguments[0].equals(COPY) || arguments[0].equals(RESET)) {
+ autoComplete.addAll(Arrays.asList(getPlayers()));
+ } else {
+ autoComplete.addAll(Arrays.asList(getProjects()));
+ }
+ }
+ case 3 -> {
+ filter = arguments[2].trim();
+ if (arguments[1].equals(ALL)) {} else if (arguments[0].equals(LIST)) {
+ autoComplete.addAll(Arrays.asList(getPlayers()));
+ } else {
+ autoComplete.addAll(Arrays.asList(getLocations()));
+ }
+ }
+ case 4 -> {
+ filter = arguments[3].trim();
+ if (arguments[0].equals(UNLOCK_UPGRADE)) {
+ ISpaceProject project = SpaceProjectManager.getProject(arguments[2]);
+ if (project != null) {
+ autoComplete.addAll(
+ project.getAllUpgrades()
+ .stream()
+ .map(ISpaceProject.ISP_Upgrade::getUnlocalizedName)
+ .collect(Collectors.toList()));
+ }
+ } else {
+ autoComplete.addAll(Arrays.asList(getPlayers()));
+ }
+ }
+ }
+ String finalFilter = filter;
+ return autoComplete.stream()
+ .filter(s -> finalFilter.isEmpty() || s.startsWith(finalFilter))
+ .collect(Collectors.toList());
+ }
+
+ private String[] getPlayers() {
+ return MinecraftServer.getServer()
+ .getAllUsernames();
+ }
+
+ private String[] getLocations() {
+ return SpaceProjectManager.getLocationNames()
+ .toArray(new String[0]);
+ }
+
+ private String[] getProjects() {
+ return SpaceProjectManager.getProjectsMap()
+ .keySet()
+ .toArray(new String[0]);
+ }
+
+ private String[] getSubCommands() {
+ return new String[] { RESET, COPY, UNLOCK, UNLOCK_UPGRADE, LOCK, LIST };
+ }
+
+ private String[] getListArguments() {
+ return new String[] { ALL, AVAILABLE, UNLOCKED };
+ }
+
+ private void processReset(ICommandSender sender, String playerName) {
+ UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName);
+ SpaceProjectManager.spaceTeamProjects.put(tID, null);
+ SpaceProjectWorldSavedData.INSTANCE.markDirty();
+ sender.addChatMessage(new ChatComponentText("Cleared away map"));
+ }
+
+ private void processLock(ICommandSender sender, String projectName, String location, String playerName) {
+ UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName);
+ SpaceProjectManager.addTeamProject(tID, getLocation(location), projectName, null);
+ sender.addChatMessage(new ChatComponentText("Project locked"));
+ }
+
+ private void processUnlock(ICommandSender sender, String projectName, String location, String playerName) {
+ UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName);
+ ISpaceProject tProject = SpaceProjectManager.getTeamProjectOrCopy(tID, projectName, getLocation(location));
+ if (tProject != null) {
+ tProject.setProjectCurrentStage(tProject.getTotalStages());
+ SpaceProjectManager.addTeamProject(tID, getLocation(location), projectName, tProject);
+ sender.addChatMessage(new ChatComponentText("Project unlocked"));
+ } else {
+ sender.addChatMessage(new ChatComponentText("Incorrect internal project name. Try again"));
+ }
+ }
+
+ private void processUnlock(ICommandSender sender, String projectName, String location, String upgradeName,
+ String playerName) {
+ UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName);
+ ISpaceProject tProject = SpaceProjectManager.getTeamProjectOrCopy(tID, projectName, getLocation(location));
+ if (tProject != null) {
+ ISpaceProject.ISP_Upgrade upgrade = tProject.getUpgrade(upgradeName);
+ if (upgrade == null) {
+ sender.addChatMessage(new ChatComponentText("Incorrect internal project upgrade name. Try again"));
+ return;
+ }
+ if (!tProject.isFinished()) {
+ tProject.setProjectCurrentStage(tProject.getTotalStages());
+ SpaceProjectManager.addTeamProject(tID, getLocation(location), projectName, tProject);
+ }
+ tProject.setBuiltUpgrade(upgrade);
+ sender.addChatMessage(new ChatComponentText("Project Upgrade unlocked"));
+ } else {
+ sender.addChatMessage(new ChatComponentText("Incorrect internal project name. Try again"));
+ }
+ }
+
+ private void processList(ICommandSender sender, String argument, String playerName) {
+ UUID tID = SpaceProjectManager.getPlayerUUIDFromName(playerName);
+ switch (argument) {
+ case ALL -> {
+ for (String project : SpaceProjectManager.getProjectsMap()
+ .keySet()) {
+ sender.addChatMessage(new ChatComponentText(project));
+ }
+ }
+ case AVAILABLE -> {
+ for (ISpaceProject project : SpaceProjectManager.getAllProjects()) {
+ if (project.meetsRequirements(tID, false)) {
+ sender.addChatMessage(new ChatComponentText(project.getProjectName()));
+ }
+ }
+ }
+ case UNLOCKED -> {
+ for (ISpaceProject project : SpaceProjectManager.getTeamSpaceProjects(tID)) {
+ sender.addChatMessage(new ChatComponentText(project.getProjectName()));
+ }
+ }
+ }
+ }
+
+ private void processCopy(ICommandSender sender, String playerToCopyFrom, String playerCopyingTo) {
+ // This will take a while
+ }
+
+ private void printHelp(ICommandSender sender) {
+
+ }
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/commands/SP_Command.java b/src/main/java/gregtech/common/misc/spaceprojects/commands/SP_Command.java
new file mode 100644
index 0000000000..3c4ad00932
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/commands/SP_Command.java
@@ -0,0 +1,166 @@
+package gregtech.common.misc.spaceprojects.commands;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.WeakHashMap;
+import java.util.stream.Collectors;
+
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.util.EnumChatFormatting;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import gregtech.api.util.GT_Utility;
+import gregtech.common.misc.spaceprojects.SpaceProjectManager;
+
+/**
+ * @author BlueWeabo
+ */
+public class SP_Command extends CommandBase {
+
+ private static final Set<Pair<EntityPlayerMP, EntityPlayerMP>> invite = Collections
+ .newSetFromMap(new WeakHashMap<>());
+ private static final Set<EntityPlayerMP> confirm = Collections.newSetFromMap(new WeakHashMap<>());
+
+ private static final String INVITE = "invite";
+ private static final String ACCEPT = "accept";
+ private static final String LEAVE = "leave";
+ private static final String CONFIRM = "confirm";
+
+ @Override
+ public String getCommandName() {
+ return "sp";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender sender) {
+ return "/" + getCommandName() + "<subCommand> [PlayerName]";
+ }
+
+ @Override
+ public void processCommand(ICommandSender sender, String[] arguments) {
+ if (arguments.length < 1) {
+ return;
+ }
+ switch (arguments[0]) {
+ case INVITE -> {
+ if (arguments.length < 2) {
+ return;
+ }
+ processInvite(sender, arguments[1]);
+ }
+ case ACCEPT -> {
+ if (arguments.length < 2) {
+ return;
+ }
+ processAccept(sender, arguments[1]);
+ }
+ case LEAVE -> processLeave(sender);
+ case CONFIRM -> processConfirm(sender);
+ }
+ }
+
+ private void processInvite(ICommandSender sender, String playerInvited) {
+ EntityPlayerMP teamLeader = getCommandSenderAsPlayer(sender);
+ EntityPlayerMP teamMember = getPlayer(sender, playerInvited);
+ invite.add(Pair.of(teamMember, teamLeader));
+ String message = EnumChatFormatting.GOLD + teamLeader.getCommandSenderName()
+ + EnumChatFormatting.RESET
+ + " has sent you an invite to join their team. Accept it with"
+ + EnumChatFormatting.GOLD
+ + " /sp accept "
+ + teamLeader.getCommandSenderName();
+ GT_Utility.sendChatToPlayer(teamMember, message);
+ }
+
+ private void processAccept(ICommandSender sender, String playerInviter) {
+ EntityPlayerMP teamMember = getCommandSenderAsPlayer(sender);
+ EntityPlayerMP teamLeader = getPlayer(sender, playerInviter);
+ if (invite.contains(Pair.of(teamMember, teamLeader))) {
+ String message = EnumChatFormatting.GOLD + teamMember.getCommandSenderName()
+ + EnumChatFormatting.RESET
+ + " has accepted the invite.";
+ SpaceProjectManager.putInTeam(teamMember.getUniqueID(), teamLeader.getUniqueID());
+ GT_Utility.sendChatToPlayer(teamLeader, message);
+ invite.remove(Pair.of(teamMember, teamLeader));
+ }
+ }
+
+ private void processLeave(ICommandSender sender) {
+ EntityPlayerMP player = getCommandSenderAsPlayer(sender);
+ String message = "Are you sure you want to leave the team. You will lose all progress. Use "
+ + EnumChatFormatting.GOLD
+ + "/sp confirm"
+ + EnumChatFormatting.RESET
+ + " to confirm this. This does nothing if you are the team leader.";
+ GT_Utility.sendChatToPlayer(player, message);
+ confirm.add(player);
+ }
+
+ private void processConfirm(ICommandSender sender) {
+ EntityPlayerMP player = getCommandSenderAsPlayer(sender);
+ if (confirm.contains(player)) {
+ String message = "Successfully left the team.";
+ SpaceProjectManager.putInTeam(player.getUniqueID(), player.getUniqueID());
+ GT_Utility.sendChatToPlayer(player, message);
+ confirm.remove(player);
+ }
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] arguments) {
+ List<String> autoComplete = new ArrayList<>();
+ String filter = arguments.length == 0 ? "" : arguments[0].trim();
+ switch (arguments.length) {
+ case 1 -> autoComplete.addAll(Arrays.asList(getSubCommands()));
+ case 2 -> {
+ filter = arguments[1].trim();
+ if (arguments[0].equals(INVITE)) {
+ autoComplete.addAll(Arrays.asList(getPlayers()));
+ break;
+ }
+
+ if (arguments[0].equals(CONFIRM)) {
+ Optional<Pair<EntityPlayerMP, EntityPlayerMP>> pairOpt = invite.stream()
+ .filter(
+ (e) -> e.getKey()
+ .getUniqueID() == getCommandSenderAsPlayer(sender).getUniqueID())
+ .findFirst();
+ if (pairOpt.isPresent()) {
+ autoComplete.add(
+ SpaceProjectManager.getPlayerNameFromUUID(
+ pairOpt.get()
+ .getRight()
+ .getUniqueID()));
+ }
+ }
+ }
+ }
+ String finalFilter = filter;
+ return autoComplete.stream()
+ .filter(s -> finalFilter.isEmpty() || s.startsWith(finalFilter))
+ .collect(Collectors.toList());
+ }
+
+ private String[] getPlayers() {
+ return MinecraftServer.getServer()
+ .getAllUsernames();
+ }
+
+ private String[] getSubCommands() {
+ return new String[] { INVITE, ACCEPT, LEAVE, CONFIRM };
+ }
+
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/enums/JsonVariables.java b/src/main/java/gregtech/common/misc/spaceprojects/enums/JsonVariables.java
new file mode 100644
index 0000000000..665f15af74
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/enums/JsonVariables.java
@@ -0,0 +1,22 @@
+package gregtech.common.misc.spaceprojects.enums;
+
+public class JsonVariables {
+
+ public static final String PAIR_LEFT = "pairLeft";
+ public static final String PAIR_RIGHT = "pairRight";
+
+ public static final String MAP_UUID = "mapUUID";
+ public static final String MAP_MAP = "mapMap";
+ public static final String MAP_PAIR = "mapPair";
+ public static final String MAP_PROJECT = "mapProject";
+
+ public static final String PROJECT_NAME = "projectName";
+ public static final String PROJECT_CURRENT_STAGE = "projectCurrentStage";
+ public static final String PROJECT_UPGRADES_BUILT = "projectUpgradesBuilt";
+ public static final String PROJECT_LOCATION = "projectLocation";
+ public static final String PROJECT_CURRENT_UPGRADE = "projectCurrentUpgrade";
+
+ public static final String UPGRADE_NAME = "upgradeName";
+ public static final String UPGRADE_CURRENT_STAGE = "upgradeCurrentStage";
+ public static final String UPGRADE_PROJECT_PARENT = "upgradeProjectParent";
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/enums/SolarSystem.java b/src/main/java/gregtech/common/misc/spaceprojects/enums/SolarSystem.java
new file mode 100644
index 0000000000..70dee3269d
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/enums/SolarSystem.java
@@ -0,0 +1,104 @@
+package gregtech.common.misc.spaceprojects.enums;
+
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.common.misc.spaceprojects.enums.SpaceBodyType.AsteroidBelt;
+import static gregtech.common.misc.spaceprojects.enums.SpaceBodyType.DwarfPlanet;
+import static gregtech.common.misc.spaceprojects.enums.SpaceBodyType.GasGiant;
+import static gregtech.common.misc.spaceprojects.enums.SpaceBodyType.IceGiant;
+import static gregtech.common.misc.spaceprojects.enums.SpaceBodyType.NaturalSatellite;
+import static gregtech.common.misc.spaceprojects.enums.SpaceBodyType.Planet;
+import static gregtech.common.misc.spaceprojects.enums.SpaceBodyType.Star;
+import static gregtech.common.misc.spaceprojects.enums.StarType.GClass;
+import static gregtech.common.misc.spaceprojects.enums.StarType.NotAStar;
+
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+import gregtech.common.misc.spaceprojects.SpaceProjectManager;
+import gregtech.common.misc.spaceprojects.interfaces.ISpaceBody;
+
+/**
+ * An enum of all space bodies in the Sol Solar System. Or to be exact the more important ones
+ *
+ * @author BlueWeabo
+ */
+public enum SolarSystem implements ISpaceBody {
+
+ Sol(Star, GClass),
+ Overworld(Planet),
+ Moon(NaturalSatellite),
+ Mars(Planet),
+ Deimos(NaturalSatellite),
+ Phobos(NaturalSatellite),
+ Mercury(Planet),
+ Venus(Planet),
+ Jupiter(GasGiant),
+ Io(NaturalSatellite),
+ Ganymede(NaturalSatellite),
+ Europa(NaturalSatellite),
+ Callisto(NaturalSatellite),
+ Saturn(GasGiant),
+ Mimas(NaturalSatellite),
+ Enceladus(NaturalSatellite),
+ Tethys(NaturalSatellite),
+ Rhea(NaturalSatellite),
+ Titan(NaturalSatellite),
+ Hyperion(NaturalSatellite),
+ Iapetus(NaturalSatellite),
+ Phoebe(NaturalSatellite),
+ Uranus(IceGiant),
+ Miranda(NaturalSatellite),
+ Ariel(NaturalSatellite),
+ Umbriel(NaturalSatellite),
+ Titania(NaturalSatellite),
+ Oberon(NaturalSatellite),
+ Neptune(IceGiant),
+ Proteus(NaturalSatellite),
+ Triton(NaturalSatellite),
+ Nereid(NaturalSatellite),
+ Ceres(DwarfPlanet),
+ Pluto(DwarfPlanet),
+ Arrokoth(DwarfPlanet),
+ MakeMake(DwarfPlanet),
+ KuiperBelt(AsteroidBelt),
+ NONE(SpaceBodyType.NONE);
+
+ private final SpaceBodyType spaceBody;
+ private final StarType star;
+ private final UITexture texture;
+
+ SolarSystem(SpaceBodyType aType) {
+ this(aType, NotAStar);
+ }
+
+ SolarSystem(SpaceBodyType aType, StarType aStarType) {
+ star = aStarType;
+ spaceBody = aType;
+ texture = UITexture.fullImage(GregTech.ID, "solarsystem/" + getName());
+ SpaceProjectManager.addLocation(this);
+ }
+
+ @Override
+ public StarType getStarType() {
+ return star;
+ }
+
+ @Override
+ public SpaceBodyType getType() {
+ return spaceBody;
+ }
+
+ @Override
+ public String getName() {
+ return name();
+ }
+
+ @Override
+ public UITexture getTexture() {
+ return texture;
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return "gt.solar.system." + getName().toLowerCase();
+ }
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/enums/SpaceBodyType.java b/src/main/java/gregtech/common/misc/spaceprojects/enums/SpaceBodyType.java
new file mode 100644
index 0000000000..8ca8b663da
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/enums/SpaceBodyType.java
@@ -0,0 +1,17 @@
+package gregtech.common.misc.spaceprojects.enums;
+
+/**
+ * @author BlueWeabo
+ */
+public enum SpaceBodyType {
+ Star,
+ NeutronStar,
+ Planet,
+ NaturalSatellite,
+ AsteroidBelt,
+ BlackHole,
+ GasGiant,
+ DwarfPlanet,
+ IceGiant,
+ NONE
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/enums/StarType.java b/src/main/java/gregtech/common/misc/spaceprojects/enums/StarType.java
new file mode 100644
index 0000000000..7585c95aa0
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/enums/StarType.java
@@ -0,0 +1,32 @@
+package gregtech.common.misc.spaceprojects.enums;
+
+/**
+ * @author BlueWeabo
+ */
+public enum StarType {
+
+ OClass(30000, 100),
+ BClass(10000, 20),
+ AClass(20, 5),
+ FClass(4, 2),
+ GClass(1, 1),
+ KClass(0.4, 0.5f),
+ MClass(0.08, 0.1f),
+ NotAStar(0, 0);
+
+ private final double solarLuminosity;
+ private final float costMultiplier;
+
+ StarType(double solarLuminosity, float costMultiplier) {
+ this.solarLuminosity = solarLuminosity;
+ this.costMultiplier = costMultiplier;
+ }
+
+ public double getSolarLuminosity() {
+ return solarLuminosity;
+ }
+
+ public float getCostMultiplier() {
+ return costMultiplier;
+ }
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/enums/UpgradeStatus.java b/src/main/java/gregtech/common/misc/spaceprojects/enums/UpgradeStatus.java
new file mode 100644
index 0000000000..3e662720ac
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/enums/UpgradeStatus.java
@@ -0,0 +1,11 @@
+package gregtech.common.misc.spaceprojects.enums;
+
+/**
+ * @author BlueWeabo
+ */
+public enum UpgradeStatus {
+ Locked,
+ Unlocked,
+ InProgress,
+ Finished
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/interfaces/ISpaceBody.java b/src/main/java/gregtech/common/misc/spaceprojects/interfaces/ISpaceBody.java
new file mode 100644
index 0000000000..79eba4c968
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/interfaces/ISpaceBody.java
@@ -0,0 +1,37 @@
+package gregtech.common.misc.spaceprojects.interfaces;
+
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+import gregtech.common.misc.spaceprojects.enums.SpaceBodyType;
+import gregtech.common.misc.spaceprojects.enums.StarType;
+
+/**
+ * @author BlueWeabo
+ */
+public interface ISpaceBody {
+
+ /**
+ * @return The star type of the space body, if its a star
+ */
+ StarType getStarType();
+
+ /**
+ * @return The type of space body it is
+ */
+ SpaceBodyType getType();
+
+ /**
+ * @return The internal name of the space body
+ */
+ String getName();
+
+ /**
+ * @return The texture of the space body used for UI
+ */
+ UITexture getTexture();
+
+ /**
+ * @return The Unlocalized name for this body
+ */
+ String getUnlocalizedName();
+}
diff --git a/src/main/java/gregtech/common/misc/spaceprojects/interfaces/ISpaceProject.java b/src/main/java/gregtech/common/misc/spaceprojects/interfaces/ISpaceProject.java
new file mode 100644
index 0000000000..51ae03ff30
--- /dev/null
+++ b/src/main/java/gregtech/common/misc/spaceprojects/interfaces/ISpaceProject.java
@@ -0,0 +1,430 @@
+package gregtech.common.misc.spaceprojects.interfaces;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+import gregtech.common.misc.spaceprojects.enums.SpaceBodyType;
+import gregtech.common.misc.spaceprojects.enums.StarType;
+import gregtech.common.misc.spaceprojects.enums.UpgradeStatus;
+
+/**
+ * @author BlueWeabo
+ */
+public interface ISpaceProject {
+
+ /**
+ * @return the internal name of the project.
+ */
+ String getProjectName();
+
+ /**
+ * @return Unlocalized name of the project.
+ */
+ String getUnlocalizedName();
+
+ /**
+ * @return Localized name of the project using StatCollect#translateToLocal.
+ */
+ String getLocalizedName();
+
+ /**
+ * @return The voltage the project requires to be built at. Used by the project manager.
+ */
+ long getProjectVoltage();
+
+ /**
+ * @return The duration it takes to build out one(1) stage of the project. The time returned is in ticks
+ */
+ int getProjectBuildTime();
+
+ /**
+ * @return The Current Progress of the project in percentage form. 1 being 100% and 0 being 0%.
+ */
+ float getProjectCurrentProgress();
+
+ /**
+ * @return Currently unused, but this is the project's tier. Will be used to determine the min-tier motors needed on
+ * the Space Elevator
+ */
+ int getProjectTier();
+
+ /**
+ * @return The Current stage of the project
+ */
+ int getCurrentStage();
+
+ /**
+ * @return The Total amount of stages the project has
+ */
+ int getTotalStages();
+
+ /**
+ * @return a Collection of all upgrades the project has
+ */
+ Collection<ISP_Upgrade> getAllUpgrades();
+
+ /**
+ * @return a Map of all upgrades that have been built.
+ */
+ Map<String, ISP_Upgrade> getUpgradesBuiltMap();
+
+ /**
+ * @return all built upgrades
+ */
+ Collection<ISP_Upgrade> getAllBuiltUpgrades();
+
+ /**
+ * @param upgradeName The name of the upgrade wanted
+ * @return The upgrade with the appropriate name found in the available upgrades for the project
+ */
+ ISP_Upgrade getUpgrade(String upgradeName);
+
+ /**
+ * @return The Items cost required per stage in an array form. Used for making the recipe.
+ */
+ ItemStack[] getItemsCostPerStage();
+
+ /**
+ * @param index Index at which the itemstack is found at
+ * @return an item's cost at the appropriate index. Null otherwise if it goes above the index or there are no item
+ * costs
+ */
+ ItemStack getItemCostPerStage(int index);
+
+ /**
+ * @return The Items current progress in an array form.
+ */
+ ItemStack[] getCurrentItemsProgress();
+
+ /**
+ * @param index Index at which the itemstack is found at
+ * @return an item's current progress at the appropriate index. Null otherwise if it goes above the index or there
+ * are no item costs
+ */
+ ItemStack getCurrentItemProgress(int index);
+
+ /**
+ * @return The items total cost required in an array form.
+ */
+ ItemStack[] getTotalItemsCost();
+
+ /**
+ * @param index Index at which the itemstack is found at
+ * @return an item's total cost at the appropriate index. Null otherwise if it goes above the index or there are no
+ * item costs
+ */
+ ItemStack getTotalItemCost(int index);
+
+ /**
+ * @return The fluids cost required per stage in an array form. Used for making the recipe.
+ */
+ FluidStack[] getFluidsCostPerStage();
+
+ /**
+ * @param index Index at which the fluidstack is found at
+ * @return a fluid's cost at the appropriate index. Null otherwise if it goes above the index or there are no fluid
+ * costs
+ */
+ FluidStack getFluidCostPerStage(int index);
+
+ /**
+ * @return The fluids current progress in an array form. Null if there are no fluid costs
+ */
+ FluidStack[] getCurrentFluidsProgress();
+
+ /**
+ * @param index Index at which the fluidstack is found at
+ * @return a fluid's current progress at the appropriate index. Null otherwise if it goes above the index or there
+ * are no fluid costs
+ */
+ FluidStack getCurrentFluidProgress(int index);
+
+ /**
+ * @return The fluids total cost required in an array form. Null if there are no fluid costs
+ */
+ FluidStack[] getTotalFluidsCost();
+
+ /**
+ * @param index Index at which the fluidstack is found at
+ * @return a fluid's total cost at the appropriate index. Null otherwise if it goes above the index or there are no
+ * fluid costs
+ */
+ FluidStack getTotalFluidCost(int index);
+
+ /**
+ * @return The current upgrade for this project, which is being built
+ */
+ ISP_Upgrade getUpgradeBeingBuilt();
+
+ /**
+ * @return The location of the project
+ */
+ ISpaceBody getProjectLocation();
+
+ /**
+ * @return The texture used in GUIs for the project
+ */
+ UITexture getTexture();
+
+ /**
+ * Sets the current stage of the project
+ */
+ void setProjectCurrentStage(int stage);
+
+ /**
+ * Sets the current upgrade, which needs to be built
+ */
+ void setCurrentUpgradeBeingBuilt(ISP_Upgrade upgrade);
+
+ /**
+ * Sets the project's location when it starts being built
+ */
+ void setProjectLocation(ISpaceBody newLocation);
+
+ /**
+ * Sets the project's upgrades, which have been built
+ */
+ void setBuiltUpgrade(ISP_Upgrade... upgrades);
+
+ /**
+ * Goes to the next stage of the project
+ */
+ void goToNextStage();
+
+ /**
+ * Creates a copy of the space project
+ */
+ ISpaceProject copy();
+
+ /**
+ * Checks if the project meets all requirements with its current location
+ *
+ * @param team Team wanting said project and checking their projects
+ * @return true if all requirements met, false otherwise
+ */
+ boolean meetsRequirements(UUID team);
+
+ /**
+ * Checks if the project meets requirements if it requires other projects, unless {@code checkLocation} is true,
+ * then it also checks for the location
+ *
+ * @param team Team wanting said project and checking their projects
+ * @param checkLocation If the location position should be checked
+ * @return true if all requirements met, false otherwise
+ */
+ boolean meetsRequirements(UUID team, boolean checkLocation);
+
+ /**
+ * Checks if the projects is finished
+ */
+ boolean isFinished();
+
+ /**
+ * Checks if the project has a certain upgrade installed or not
+ *
+ * @param upgradeName Upgrade being searched for
+ * @return True if that upgrade has been installed, false otherwise
+ */
+ boolean hasUpgrade(String upgradeName);
+
+ /**
+ * @author BlueWeabo
+ */
+ interface ISP_Upgrade {
+
+ /**
+ * @return internal name of the upgrade
+ */
+ String getUpgradeName();
+
+ /**
+ * @return unlocalized name of the upgrade
+ */
+ String getUnlocalizedName();
+
+ /**
+ * @return localized name of the upgrade
+ */
+ String getLocalizedName();
+
+ /**
+ * @return The Items cost required per stage in an array form. Used for making the recipe.
+ */
+ ItemStack[] getItemsCostPerStage();
+
+ /**
+ * @param index Index at which the itemstack is found at
+ * @return an item's cost at the appropriate index. Null otherwise if it goes above the index or there are no
+ * item costs
+ */
+ ItemStack getItemCostPerStage(int index);
+
+ /**
+ * @return The Items current progress in an array form.
+ */
+ ItemStack[] getCurrentItemsProgress();
+
+ /**
+ * @param index Index at which the itemstack is found at
+ * @return an item's current progress at the appropriate index. Null otherwise if it goes above the index or
+ * there are no item costs
+ */
+ ItemStack getCurrentItemProgress(int index);
+
+ /**
+ * @return The items total cost required in an array form.
+ */
+ ItemStack[] getTotalItemsCost();
+
+ /**
+ * @param index Index at which the itemstack is found at
+ * @return an item's total cost at the appropriate index. Null otherwise if it goes above the index or there are
+ * no item costs
+ */
+ ItemStack getTotalItemCost(int index);
+
+ /**
+ * @return The fluids cost required per stage in an array form. Used for making the recipe.
+ */
+ FluidStack[] getFluidsCostPerStage();
+
+ /**
+ * @param index Index at which the fluidstack is found at
+ * @return a fluid's cost at the appropriate index. Null otherwise if it goes above the index or there are no
+ * fluid costs
+ */
+ FluidStack getFluidCostPerStage(int index);
+
+ /**
+ * @return The fluids current progress in an array form. Null if there are no fluid costs
+ */
+ FluidStack[] getCurrentFluidsProgress();
+
+ /**
+ * @param index Index at which the fluidstack is found at
+ * @return a fluid's current progress at the appropriate index. Null otherwise if it goes above the index or
+ * there are no fluid costs
+ */
+ FluidStack getCurrentFluidProgress(int index);
+
+ /**
+ * @return The fluids total cost required in an array form. Null if there are no fluid costs
+ */
+ FluidStack[] getTotalFluidsCost();
+
+ /**
+ * @param index Index at which the fluidstack is found at
+ * @return a fluid's total cost at the appropriate index. Null otherwise if it goes above the index or there are
+ * no fluid costs
+ */
+ FluidStack getTotalFluidCost(int index);
+
+ /**
+ * @return the total stages an upgrade has
+ */
+ int getTotalStages();
+
+ /**
+ * @return the build time for the upgrade to go to its next stage
+ */
+ int getUpgradeBuildTime();
+
+ /**
+ * @return current stage of the upgrade
+ */
+ int getCurrentStage();
+
+ /**
+ * @return The Current Progress of the upgrade in percentage form. 1 being 100% and 0 being 0%.
+ */
+ float getCurrentProgress();
+
+ /**
+ * @return The voltage at which the upgrade requires to be build at.
+ */
+ long getVoltage();
+
+ /**
+ * Unused, unsure if it will get a sure
+ */
+ UpgradeStatus getStatus();
+
+ /**
+ * @return the requirements the upgrade has
+ */
+ ISP_Requirements getUpgradeRequirements();
+
+ /**
+ * @return the parent project, which the upgrade belongs to
+ */
+ ISpaceProject getParentProject();
+
+ /**
+ * @param project The project the upgrade belongs to
+ */
+ void setUpgradeProject(ISpaceProject project);
+
+ /**
+ * Sets the current stage of the upgrade
+ *
+ * @param stage the stage to set
+ */
+ void setUpgradeCurrentStage(int stage);
+
+ /**
+ * Checks if the team has met all requirements to be able to build said upgrade
+ *
+ * @param team The one starting the upgrade
+ * @return true if all requirements are met, false otherwise
+ */
+ boolean meetsRequirements(UUID team);
+
+ /**
+ * Creates a copy of the upgrade
+ */
+ ISP_Upgrade copy();
+
+ /**
+ * Goes to the next stage of the upgrade
+ */
+ void goToNextStage();
+
+ /**
+ * @return true if the upgrade has finished all of its stages, false otherwise
+ */
+ boolean isFinished();
+ }
+
+ /**
+ * @author BlueWeabo
+ */
+ interface ISP_Requirements {
+
+ /**
+ * @return Space Body Type required by the project/upgrade
+ */
+ SpaceBodyType getBodyType();
+
+ /**
+ * @return Star Type required by the project/upgrade
+ */
+ StarType getStarType();
+
+ /**
+ * @return a list of all project required for the team to have to unlock it
+ */
+ List<ISpaceProject> getProjects();
+
+ /**
+ * @return a list of all upgrades an upgrade can have as required.
+ */
+ List<ISP_Upgrade> getUpgrades();
+ }
+}
diff --git a/src/main/java/gregtech/common/net/MessageSetFlaskCapacity.java b/src/main/java/gregtech/common/net/MessageSetFlaskCapacity.java
new file mode 100644
index 0000000000..6c51663c47
--- /dev/null
+++ b/src/main/java/gregtech/common/net/MessageSetFlaskCapacity.java
@@ -0,0 +1,67 @@
+package gregtech.common.net;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+
+import com.google.common.io.ByteArrayDataInput;
+
+import gregtech.api.net.GT_Packet_New;
+import gregtech.common.items.GT_VolumetricFlask;
+import io.netty.buffer.ByteBuf;
+
+@Deprecated
+public final class MessageSetFlaskCapacity extends GT_Packet_New {
+
+ private int capacity, dimID, playerID;
+
+ public MessageSetFlaskCapacity() {
+ super(true);
+ }
+
+ public MessageSetFlaskCapacity(int capacity, int dimID, int playerID) {
+ super(false);
+ this.capacity = capacity;
+ this.dimID = dimID;
+ this.playerID = playerID;
+ }
+
+ public MessageSetFlaskCapacity(int capacity, EntityPlayer p) {
+ super(false);
+ this.capacity = capacity;
+ this.dimID = p.worldObj.provider.dimensionId;
+ this.playerID = p.getEntityId();
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 5;
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(capacity);
+ aOut.writeInt(dimID);
+ aOut.writeInt(playerID);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new MessageSetFlaskCapacity(aData.readInt(), aData.readInt(), aData.readInt());
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ World w = DimensionManager.getWorld(dimID);
+ if (w != null && w.getEntityByID(playerID) instanceof EntityPlayer) {
+ ItemStack stack = ((EntityPlayer) w.getEntityByID(playerID)).getHeldItem();
+ if ((stack != null) && (stack.stackSize > 0)) {
+ Item item = stack.getItem();
+ if ((item instanceof GT_VolumetricFlask)) ((GT_VolumetricFlask) item).setCapacity(stack, capacity);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BasicLogic.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BasicLogic.java
new file mode 100644
index 0000000000..34093a95de
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BasicLogic.java
@@ -0,0 +1,137 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_BasicLogic extends GT_CircuitryBehavior {
+
+ public GT_Circuit_BasicLogic(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 0) {
+ aCircuitData[0] = 0;
+ }
+ if (aCircuitData[0] > 13) {
+ aCircuitData[0] = 13;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 2) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) (aCircuitData[0] % 2 == (getAnyRedstone(aRedstoneCircuitBlock) ? 0 : 1) ? 15 : 0),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 4) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) (aCircuitData[0] % 2 == (getOneRedstone(aRedstoneCircuitBlock) ? 0 : 1) ? 15 : 0),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 6) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) (aCircuitData[0] % 2 == (getAllRedstone(aRedstoneCircuitBlock) ? 0 : 1) ? 15 : 0),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 7) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) (15 - getStrongestRedstone(aRedstoneCircuitBlock)),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 9) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) ((aCircuitData[0] % 2 == 0 ? 15 : 0)
+ ^ (getStrongestRedstone(aRedstoneCircuitBlock) | getWeakestRedstone(aRedstoneCircuitBlock))),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 11) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) ((aCircuitData[0] % 2 == 0 ? 15 : 0) ^ getStrongestRedstone(aRedstoneCircuitBlock)
+ ^ getWeakestRedstone(aRedstoneCircuitBlock)),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 13) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) ((aCircuitData[0] % 2 == 0 ? 15 : 0)
+ ^ getStrongestRedstone(aRedstoneCircuitBlock) & getWeakestRedstone(aRedstoneCircuitBlock)),
+ aRedstoneCircuitBlock.getOutputFacing());
+ } else if (aCircuitData[0] < 14) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) (getStrongestRedstone(aRedstoneCircuitBlock) ^ 0xF),
+ aRedstoneCircuitBlock.getOutputFacing());
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "Basic Logic";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Regular Logic Gates";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex == 0) {
+ switch (aCircuitData[0]) {
+ case 0 -> {
+ return "OR";
+ }
+ case 1 -> {
+ return "NOR";
+ }
+ case 2 -> {
+ return "XOR";
+ }
+ case 3 -> {
+ return "XNOR";
+ }
+ case 4 -> {
+ return "AND";
+ }
+ case 5 -> {
+ return "NAND";
+ }
+ case 6 -> {
+ return "INVERT";
+ }
+ case 7 -> {
+ return "BIT_OR";
+ }
+ case 8 -> {
+ return "BIT_NOR";
+ }
+ case 9 -> {
+ return "BIT_XOR";
+ }
+ case 10 -> {
+ return "BIT_XNOR";
+ }
+ case 11 -> {
+ return "BIT_AND";
+ }
+ case 12 -> {
+ return "BIT_NAND";
+ }
+ case 13 -> {
+ return "BIT_INVERT";
+ }
+ }
+ }
+ return "";
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ return "";
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BitAnd.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BitAnd.java
new file mode 100644
index 0000000000..f5f83a7e10
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_BitAnd.java
@@ -0,0 +1,81 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_BitAnd extends GT_CircuitryBehavior {
+
+ public GT_Circuit_BitAnd(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 0;
+ aCircuitData[1] = 0;
+ aCircuitData[2] = 0;
+ aCircuitData[3] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 0) {
+ aCircuitData[0] = 0;
+ }
+ if (aCircuitData[1] < 0) {
+ aCircuitData[1] = 0;
+ }
+ if (aCircuitData[2] < 0) {
+ aCircuitData[2] = 0;
+ }
+ if (aCircuitData[3] < 0) {
+ aCircuitData[3] = 0;
+ }
+ if (aCircuitData[0] > 1) {
+ aCircuitData[0] = 1;
+ }
+ if (aCircuitData[1] > 1) {
+ aCircuitData[1] = 1;
+ }
+ if (aCircuitData[2] > 1) {
+ aCircuitData[2] = 1;
+ }
+ if (aCircuitData[3] > 1) {
+ aCircuitData[3] = 1;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) ((getStrongestRedstone(aRedstoneCircuitBlock)
+ & (aCircuitData[0] | aCircuitData[1] << 1 | aCircuitData[2] << 2 | aCircuitData[3] << 3)) != 0 ? 15
+ : 0),
+ aRedstoneCircuitBlock.getOutputFacing());
+ }
+
+ @Override
+ public String getName() {
+ return "Hardcode Bit-AND";
+ }
+
+ @Override
+ public String getDescription() {
+ return "( signal & this ) != 0";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return "Bit " + aCircuitDataIndex + ":";
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ return aCircuitData[aCircuitDataIndex] == 0 ? "OFF" : "ON";
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_CombinationLock.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_CombinationLock.java
new file mode 100644
index 0000000000..67d8527606
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_CombinationLock.java
@@ -0,0 +1,109 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_CombinationLock extends GT_CircuitryBehavior {
+
+ public GT_Circuit_CombinationLock(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 1;
+ aCircuitData[1] = 0;
+ aCircuitData[2] = 0;
+ aCircuitData[3] = 0;
+ aCircuitData[4] = 0;
+ aCircuitData[5] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 1) {
+ aCircuitData[0] = 1;
+ }
+ if (aCircuitData[1] < 0) {
+ aCircuitData[1] = 0;
+ }
+ if (aCircuitData[2] < 0) {
+ aCircuitData[2] = 0;
+ }
+ if (aCircuitData[3] < 0) {
+ aCircuitData[3] = 0;
+ }
+ if (aCircuitData[0] > 15) {
+ aCircuitData[0] = 15;
+ }
+ if (aCircuitData[1] > 15) {
+ aCircuitData[1] = 15;
+ }
+ if (aCircuitData[2] > 15) {
+ aCircuitData[2] = 15;
+ }
+ if (aCircuitData[3] > 15) {
+ aCircuitData[3] = 15;
+ }
+ if (aCircuitData[4] < 0) {
+ aCircuitData[4] = 0;
+ }
+ if (aCircuitData[4] > 3) {
+ aCircuitData[4] = 3;
+ }
+ if (aCircuitData[5] < 0) {
+ aCircuitData[5] = 0;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ while ((aCircuitData[aCircuitData[4]] == 0) && (aCircuitData[4] < 4)) {
+ aCircuitData[4] += 1;
+ }
+ if (aCircuitData[4] < 4) {
+ int tRedstone = getStrongestRedstone(aRedstoneCircuitBlock);
+ if (tRedstone > 0) {
+ if (aCircuitData[5] == 0) {
+ if (tRedstone == aCircuitData[aCircuitData[4]]) {
+ aCircuitData[4] += 1;
+ } else {
+ aCircuitData[4] = 0;
+ }
+ }
+ aCircuitData[5] = 1;
+ } else {
+ aCircuitData[5] = 0;
+ }
+ aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing());
+ } else {
+ aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing());
+ aCircuitData[4] = 0;
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "Combination Lock";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Checks Combinations";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return "Power " + aCircuitDataIndex;
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Equals.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Equals.java
new file mode 100644
index 0000000000..9e9af183e8
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Equals.java
@@ -0,0 +1,73 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_Equals extends GT_CircuitryBehavior {
+
+ public GT_Circuit_Equals(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 0;
+ aCircuitData[1] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 0) {
+ aCircuitData[0] = 0;
+ }
+ if (aCircuitData[0] > 15) {
+ aCircuitData[0] = 15;
+ }
+ if (aCircuitData[1] < 0) {
+ aCircuitData[3] = 0;
+ }
+ if (aCircuitData[1] > 1) {
+ aCircuitData[3] = 1;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aRedstoneCircuitBlock.setRedstone(
+ ((byte) (((aCircuitData[1] != 0) == (getStrongestRedstone(aRedstoneCircuitBlock) == aCircuitData[0])) ? 0
+ : 15)),
+ aRedstoneCircuitBlock.getOutputFacing());
+ }
+
+ @Override
+ public String getName() {
+ return "Equals";
+ }
+
+ @Override
+ public String getDescription() {
+ return "signal == this";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return switch (aCircuitDataIndex) {
+ case 0 -> "Signal";
+ case 1 -> aCircuitData[1] == 0 ? "Equal" : "Unequal";
+ default -> "";
+ };
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex > 0) {
+ return "";
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Pulser.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Pulser.java
new file mode 100644
index 0000000000..c54d0be060
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Pulser.java
@@ -0,0 +1,92 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_Pulser extends GT_CircuitryBehavior {
+
+ public GT_Circuit_Pulser(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 1;
+ aCircuitData[1] = 16;
+ aCircuitData[4] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 1) {
+ aCircuitData[0] = 1;
+ }
+ if (aCircuitData[1] < 0) {
+ aCircuitData[1] = 0;
+ }
+ if (aCircuitData[1] > 16) {
+ aCircuitData[1] = 16;
+ }
+ if (aCircuitData[4] < 0) {
+ aCircuitData[4] = 0;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ byte redstoneSignal = aCircuitData[1] == 0 ? getWeakestNonZeroRedstone(aRedstoneCircuitBlock)
+ : getStrongestRedstone(aRedstoneCircuitBlock);
+ if (aCircuitData[4] == 0) {
+ aCircuitData[5] = redstoneSignal;
+ }
+ if ((redstoneSignal > 0) || (aCircuitData[4] > 0)) {
+ int index = 4;
+ int tmp42_41 = aCircuitData[index];
+ aCircuitData[index] = (tmp42_41 + 1);
+ if ((tmp42_41 >= aCircuitData[0]) && (redstoneSignal <= 0)) {
+ aCircuitData[4] = 0;
+ }
+ }
+ aRedstoneCircuitBlock.setRedstone(
+ (aCircuitData[4] > 0) && (aCircuitData[4] <= aCircuitData[0]) ? (byte) aCircuitData[1]
+ : (aCircuitData[1] <= 0) || (aCircuitData[1] > 15) ? (byte) aCircuitData[5] : 0,
+ aRedstoneCircuitBlock.getOutputFacing());
+ }
+
+ @Override
+ public String getName() {
+ return "Pulser";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Limits&Enlengths";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return switch (aCircuitDataIndex) {
+ case 0 -> "Length";
+ case 1 -> "RS Out";
+ default -> "";
+ };
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex == 1) {
+ if (aCircuitData[aCircuitDataIndex] == 16) {
+ return "HIGHEST";
+ }
+ if (aCircuitData[aCircuitDataIndex] == 0) {
+ return "LOWEST";
+ }
+ }
+ return aCircuitDataIndex > 1 ? "" : null;
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Randomizer.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Randomizer.java
new file mode 100644
index 0000000000..336bf9928d
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Randomizer.java
@@ -0,0 +1,86 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_Randomizer extends GT_CircuitryBehavior {
+
+ public GT_Circuit_Randomizer(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 1;
+ aCircuitData[4] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 1) {
+ aCircuitData[0] = 1;
+ }
+ if (aCircuitData[3] < 0) {
+ aCircuitData[3] = 0;
+ }
+ if (aCircuitData[3] > 1) {
+ aCircuitData[3] = 1;
+ }
+ if (aCircuitData[4] < 0) {
+ aCircuitData[4] = 0;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[3] == 1) {
+ if (getAnyRedstone(aRedstoneCircuitBlock)) {
+ aCircuitData[4] += 1;
+ } else {
+ aCircuitData[4] = 0;
+ }
+ } else if (getAnyRedstone(aRedstoneCircuitBlock)) {
+ aCircuitData[4] = 0;
+ } else {
+ aCircuitData[4] += 1;
+ }
+ if (aCircuitData[4] >= aCircuitData[0]) {
+ aCircuitData[4] = 0;
+ aRedstoneCircuitBlock
+ .setRedstone((byte) aRedstoneCircuitBlock.getRandom(16), aRedstoneCircuitBlock.getOutputFacing());
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "Randomizer";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Randomizes Redstone";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return switch (aCircuitDataIndex) {
+ case 0 -> "Delay";
+ case 3 -> aCircuitData[aCircuitDataIndex] == 1 ? "RS => ON" : "RS => OFF";
+ case 4 -> "Status";
+ default -> "";
+ };
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex != 0) {
+ return "";
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_RedstoneMeter.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_RedstoneMeter.java
new file mode 100644
index 0000000000..4db261fcf0
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_RedstoneMeter.java
@@ -0,0 +1,94 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_RedstoneMeter extends GT_CircuitryBehavior {
+
+ public GT_Circuit_RedstoneMeter(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 1;
+ aCircuitData[1] = 15;
+ aCircuitData[2] = 0;
+ aCircuitData[3] = 15;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 0) {
+ aCircuitData[0] = 0;
+ }
+ if (aCircuitData[0] > 15) {
+ aCircuitData[0] = 15;
+ }
+ if (aCircuitData[1] < 0) {
+ aCircuitData[1] = 0;
+ }
+ if (aCircuitData[1] > 15) {
+ aCircuitData[1] = 15;
+ }
+ if (aCircuitData[1] < aCircuitData[0]) {
+ aCircuitData[1] = aCircuitData[0];
+ }
+ if (aCircuitData[2] < 0) {
+ aCircuitData[2] = 0;
+ }
+ if (aCircuitData[2] > 1) {
+ aCircuitData[2] = 1;
+ }
+ if (aCircuitData[3] < 0) {
+ aCircuitData[3] = 0;
+ }
+ if (aCircuitData[3] > 15) {
+ aCircuitData[3] = 15;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ byte tRedstone = getStrongestRedstone(aRedstoneCircuitBlock);
+ aRedstoneCircuitBlock
+ .setRedstone(
+ ((tRedstone >= aCircuitData[0]) && (tRedstone <= aCircuitData[1]) ? 1 : 0)
+ != (aCircuitData[2] != 0 ? 1 : 0) ? (byte) aCircuitData[3] : 0,
+ aRedstoneCircuitBlock.getOutputFacing());
+ }
+
+ @Override
+ public String getName() {
+ return "Redstone Meter";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Checks Boundaries";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return switch (aCircuitDataIndex) {
+ case 0 -> "Lower";
+ case 1 -> "Upper";
+ case 2 -> "Invert:";
+ case 3 -> "RS Out:";
+ default -> "";
+ };
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex == 2) {
+ return aCircuitData[2] == 0 ? "OFF" : "ON";
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Repeater.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Repeater.java
new file mode 100644
index 0000000000..b96762d73b
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Repeater.java
@@ -0,0 +1,86 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_Repeater extends GT_CircuitryBehavior {
+
+ public GT_Circuit_Repeater(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 1;
+ aCircuitData[4] = 0;
+ aCircuitData[5] = -1;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 1) {
+ aCircuitData[0] = 1;
+ }
+ if (aCircuitData[4] < 0) {
+ aCircuitData[4] = 0;
+ }
+ if (aCircuitData[5] < -1) {
+ aCircuitData[5] = -1;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (getAnyRedstone(aRedstoneCircuitBlock)) {
+ aCircuitData[4] += 1;
+ if (aCircuitData[5] < 0) {
+ aCircuitData[5] = 0;
+ }
+ }
+ if ((aCircuitData[5] >= 0) && (aCircuitData[5] < aCircuitData[0])) {
+ aCircuitData[5] += 1;
+ }
+ if (aCircuitData[4] > 0) {
+ if (aCircuitData[5] >= aCircuitData[0]) {
+ aCircuitData[4] -= 1;
+ aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing());
+ } else {
+ aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing());
+ }
+ } else {
+ aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing());
+ aCircuitData[5] = -1;
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "Repeater";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Delays RS-Signal";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex == 0) {
+ return "Delay";
+ }
+ return "";
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex > 0) {
+ return "";
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Timer.java b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Timer.java
new file mode 100644
index 0000000000..026c83dfbc
--- /dev/null
+++ b/src/main/java/gregtech/common/redstonecircuits/GT_Circuit_Timer.java
@@ -0,0 +1,108 @@
+package gregtech.common.redstonecircuits;
+
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import gregtech.api.util.GT_CircuitryBehavior;
+
+public class GT_Circuit_Timer extends GT_CircuitryBehavior {
+
+ public GT_Circuit_Timer(int aIndex) {
+ super(aIndex);
+ }
+
+ @Override
+ public void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ aCircuitData[0] = 2;
+ aCircuitData[1] = 1;
+ aCircuitData[2] = 2;
+ aCircuitData[4] = 0;
+ }
+
+ @Override
+ public void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[0] < 2) {
+ aCircuitData[0] = 2;
+ }
+ if (aCircuitData[1] < 1) {
+ aCircuitData[1] = 1;
+ }
+ if (aCircuitData[2] < 2) {
+ aCircuitData[2] = 2;
+ }
+ if (aCircuitData[3] < 0) {
+ aCircuitData[3] = 0;
+ }
+ if (aCircuitData[3] > 1) {
+ aCircuitData[3] = 1;
+ }
+ if (aCircuitData[4] < 0) {
+ aCircuitData[4] = 0;
+ }
+ }
+
+ @Override
+ public void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (aCircuitData[3] == 1) {
+ if (getAnyRedstone(aRedstoneCircuitBlock)) {
+ aCircuitData[4] += 1;
+ } else {
+ aCircuitData[4] = 0;
+ }
+ } else if (getAnyRedstone(aRedstoneCircuitBlock)) {
+ aCircuitData[4] = 0;
+ } else {
+ aCircuitData[4] += 1;
+ }
+ if (aCircuitData[4] >= aCircuitData[0]) {
+ if (aCircuitData[1] > 1) {
+ if (aCircuitData[4] >= aCircuitData[0] + (aCircuitData[1] - 1) * aCircuitData[2]) {
+ aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing());
+ aCircuitData[4] = 0;
+ } else {
+ aRedstoneCircuitBlock.setRedstone(
+ (byte) ((aCircuitData[4] - aCircuitData[0]) % aCircuitData[2] == 0 ? 15 : 0),
+ aRedstoneCircuitBlock.getOutputFacing());
+ }
+ } else {
+ aRedstoneCircuitBlock.setRedstone((byte) 15, aRedstoneCircuitBlock.getOutputFacing());
+ aCircuitData[4] = 0;
+ }
+ } else {
+ aRedstoneCircuitBlock.setRedstone((byte) 0, aRedstoneCircuitBlock.getOutputFacing());
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "Timer";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Pulses Redstone";
+ }
+
+ @Override
+ public String getDataDescription(int[] aCircuitData, int aCircuitDataIndex) {
+ return switch (aCircuitDataIndex) {
+ case 0 -> "Delay";
+ case 1 -> "Pulses";
+ case 2 -> "Length";
+ case 3 -> aCircuitData[aCircuitDataIndex] == 1 ? "RS => ON" : "RS => OFF";
+ case 4 -> "Time";
+ default -> "";
+ };
+ }
+
+ @Override
+ public boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex) {
+ return false;
+ }
+
+ @Override
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ if (aCircuitDataIndex == 3) {
+ return "";
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_CapeRenderer.java b/src/main/java/gregtech/common/render/GT_CapeRenderer.java
new file mode 100644
index 0000000000..ec9ef2880c
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_CapeRenderer.java
@@ -0,0 +1,148 @@
+package gregtech.common.render;
+
+import java.util.Collection;
+
+import net.minecraft.client.entity.AbstractClientPlayer;
+import net.minecraft.client.model.ModelBiped;
+import net.minecraft.client.renderer.entity.RenderManager;
+import net.minecraft.client.renderer.entity.RenderPlayer;
+import net.minecraft.potion.Potion;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.event.RenderPlayerEvent;
+
+import org.lwjgl.opengl.GL11;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+
+public class GT_CapeRenderer extends RenderPlayer {
+
+ private final ResourceLocation[] mCapes = { new ResourceLocation("gregtech:textures/BrainTechCape.png"),
+ new ResourceLocation("gregtech:textures/GregTechCape.png"),
+ new ResourceLocation("gregtech:textures/MrBrainCape.png"),
+ new ResourceLocation("gregtech:textures/GregoriusCape.png"),
+ new ResourceLocation("gregtech:textures/DonorCape.png"), new ResourceLocation("gregtech:textures/DevCape.png"),
+ new ResourceLocation("gregtech:textures/Steam.png"), new ResourceLocation("gregtech:textures/Titanium.png"),
+ new ResourceLocation("gregtech:textures/Neutronium.png"),
+ new ResourceLocation("gregtech:textures/Stargate.png") };
+ private final Collection<String> mCapeList;
+
+ public GT_CapeRenderer(Collection<String> aCapeList) {
+ this.mCapeList = aCapeList;
+ setRenderManager(RenderManager.instance);
+ }
+
+ public void receiveRenderSpecialsEvent(RenderPlayerEvent.Specials.Pre aEvent) {
+ AbstractClientPlayer aPlayer = (AbstractClientPlayer) aEvent.entityPlayer;
+ if (GT_Utility.getFullInvisibility(aPlayer)) {
+ aEvent.setCanceled(true);
+ return;
+ }
+ float aPartialTicks = aEvent.partialRenderTick;
+ if (aPlayer.isInvisible()) {
+ return;
+ }
+ if (GT_Utility.getPotion(aPlayer, Potion.invisibility.id)) {
+ return;
+ }
+ try {
+ ResourceLocation tResource = aPlayer.getLocationCape();
+ if (aPlayer.getDisplayName()
+ .equalsIgnoreCase("Friedi4321")) {
+ tResource = this.mCapes[0];
+ }
+ if (this.mCapeList.contains(
+ aPlayer.getDisplayName()
+ .toLowerCase())) {
+ tResource = this.mCapes[1];
+ }
+ if (aPlayer.getDisplayName()
+ .equalsIgnoreCase("Mr_Brain")) {
+ tResource = this.mCapes[2];
+ }
+ if (aPlayer.getDisplayName()
+ .equalsIgnoreCase("GregoriusT")) {
+ tResource = this.mCapes[3];
+ }
+ if (this.mCapeList.contains(
+ aPlayer.getDisplayName()
+ .toLowerCase() + ":capedonor")) {
+ tResource = this.mCapes[4];
+ }
+ if (this.mCapeList.contains(
+ aPlayer.getDisplayName()
+ .toLowerCase() + ":capedev")) {
+ tResource = this.mCapes[5];
+ }
+ if (this.mCapeList.contains(
+ aPlayer.getDisplayName()
+ .toLowerCase() + ":cape_steam")) {
+ tResource = this.mCapes[6];
+ }
+ if (this.mCapeList.contains(
+ aPlayer.getDisplayName()
+ .toLowerCase() + ":cape_titanium")) {
+ tResource = this.mCapes[7];
+ }
+ if (this.mCapeList.contains(
+ aPlayer.getDisplayName()
+ .toLowerCase() + ":cape_neutronium")) {
+ tResource = this.mCapes[8];
+ }
+ if (this.mCapeList.contains(
+ aPlayer.getDisplayName()
+ .toLowerCase() + ":cape_stargate")) {
+ tResource = this.mCapes[9];
+ }
+
+ if ((tResource != null) && (!aPlayer.getHideCape())) {
+ bindTexture(tResource);
+ GL11.glPushMatrix();
+ GL11.glTranslatef(0.0F, 0.0F, 0.125F);
+ double d0 = aPlayer.field_71091_bM + (aPlayer.field_71094_bP - aPlayer.field_71091_bM) * aPartialTicks
+ - (aPlayer.prevPosX + (aPlayer.posX - aPlayer.prevPosX) * aPartialTicks);
+ double d1 = aPlayer.field_71096_bN + (aPlayer.field_71095_bQ - aPlayer.field_71096_bN) * aPartialTicks
+ - (aPlayer.prevPosY + (aPlayer.posY - aPlayer.prevPosY) * aPartialTicks);
+ double d2 = aPlayer.field_71097_bO + (aPlayer.field_71085_bR - aPlayer.field_71097_bO) * aPartialTicks
+ - (aPlayer.prevPosZ + (aPlayer.posZ - aPlayer.prevPosZ) * aPartialTicks);
+ float f6 = aPlayer.prevRenderYawOffset
+ + (aPlayer.renderYawOffset - aPlayer.prevRenderYawOffset) * aPartialTicks;
+ double d3 = MathHelper.sin(f6 * (float) Math.PI / 180.0F);
+ double d4 = -MathHelper.cos(f6 * (float) Math.PI / 180.0F);
+ float f7 = (float) d1 * 10.0F;
+ float f8 = (float) (d0 * d3 + d2 * d4) * 100.0F;
+ float f9 = (float) (d0 * d4 - d2 * d3) * 100.0F;
+ if (f7 < -6.0F) {
+ f7 = -6.0F;
+ }
+ if (f7 > 32.0F) {
+ f7 = 32.0F;
+ }
+ if (f8 < 0.0F) {
+ f8 = 0.0F;
+ }
+ float f10 = aPlayer.prevCameraYaw + (aPlayer.cameraYaw - aPlayer.prevCameraYaw) * aPartialTicks;
+ f7 += MathHelper.sin(
+ (aPlayer.prevDistanceWalkedModified
+ + (aPlayer.distanceWalkedModified - aPlayer.prevDistanceWalkedModified) * aPartialTicks) * 6.0F)
+ * 32.0F
+ * f10;
+ if (aPlayer.isSneaking()) {
+ f7 += 25.0F;
+ }
+ GL11.glRotatef(6.0F + f8 / 2.0F + f7, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(f9 / 2.0F, 0.0F, 0.0F, 1.0F);
+ GL11.glRotatef(-f9 / 2.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
+ ((ModelBiped) this.mainModel).renderCloak(0.0625F);
+ GL11.glPopMatrix();
+ }
+ } catch (Throwable e) {
+ if (GT_Values.D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_CopiedBlockTexture.java b/src/main/java/gregtech/common/render/GT_CopiedBlockTexture.java
new file mode 100644
index 0000000000..937c1a994f
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_CopiedBlockTexture.java
@@ -0,0 +1,112 @@
+package gregtech.common.render;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.IBlockContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.util.LightingHelper;
+
+public class GT_CopiedBlockTexture extends GT_TextureBase implements ITexture, IBlockContainer {
+
+ private final Block mBlock;
+ private final byte mSide, mMeta;
+
+ protected GT_CopiedBlockTexture(Block aBlock, int ordinalSide, int aMeta, short[] aRGBa, boolean allowAlpha) {
+ if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_CopiedBlockTexture");
+ mBlock = aBlock;
+ mSide = (byte) ordinalSide;
+ mMeta = (byte) aMeta;
+ }
+
+ @Override
+ public boolean isOldTexture() {
+ return false;
+ }
+
+ private IIcon getIcon(int ordinalSide) {
+ if (mSide == 6) return mBlock.getIcon(ordinalSide, mMeta);
+ return mBlock.getIcon(mSide, mMeta);
+ }
+
+ @Override
+ public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ final IIcon aIcon = getIcon(ForgeDirection.EAST.ordinal());
+ aRenderer.field_152631_f = true;
+ startDrawingQuads(aRenderer, 1.0f, 0.0f, 0.0f);
+ new LightingHelper(aRenderer).setupLightingXPos(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.EAST, 0xffffff);
+ aRenderer.renderFaceXPos(aBlock, aX, aY, aZ, aIcon);
+ draw(aRenderer);
+ aRenderer.field_152631_f = false;
+ }
+
+ @Override
+ public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, -1.0f, 0.0f, 0.0f);
+ final IIcon aIcon = getIcon(ForgeDirection.WEST.ordinal());
+ new LightingHelper(aRenderer).setupLightingXNeg(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.WEST, 0xffffff);
+ aRenderer.renderFaceXNeg(aBlock, aX, aY, aZ, aIcon);
+ draw(aRenderer);
+ }
+
+ @Override
+ public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, 0.0f, 1.0f, 0.0f);
+ final IIcon aIcon = getIcon(ForgeDirection.UP.ordinal());
+ new LightingHelper(aRenderer).setupLightingYPos(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.UP, 0xffffff);
+ aRenderer.renderFaceYPos(aBlock, aX, aY, aZ, aIcon);
+ draw(aRenderer);
+ }
+
+ @Override
+ public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, 0.0f, -1.0f, 0.0f);
+ final IIcon aIcon = getIcon(ForgeDirection.DOWN.ordinal());
+ new LightingHelper(aRenderer).setupLightingYNeg(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.DOWN, 0xffffff);
+ aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, aIcon);
+ draw(aRenderer);
+ }
+
+ @Override
+ public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, 0.0f, 0.0f, 1.0f);
+ final IIcon aIcon = getIcon(ForgeDirection.SOUTH.ordinal());
+ new LightingHelper(aRenderer).setupLightingZPos(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.SOUTH, 0xffffff);
+ aRenderer.renderFaceZPos(aBlock, aX, aY, aZ, aIcon);
+ draw(aRenderer);
+ }
+
+ @Override
+ public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, 0.0f, 0.0f, -1.0f);
+ final IIcon aIcon = getIcon(ForgeDirection.NORTH.ordinal());
+ aRenderer.field_152631_f = true;
+ new LightingHelper(aRenderer).setupLightingZNeg(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.NORTH, 0xffffff);
+ aRenderer.renderFaceZNeg(aBlock, aX, aY, aZ, aIcon);
+ draw(aRenderer);
+ aRenderer.field_152631_f = false;
+ }
+
+ @Override
+ public boolean isValidTexture() {
+ return mBlock != null;
+ }
+
+ @Override
+ public Block getBlock() {
+ return mBlock;
+ }
+
+ @Override
+ public byte getMeta() {
+ return mMeta;
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_CopiedCTMBlockTexture.java b/src/main/java/gregtech/common/render/GT_CopiedCTMBlockTexture.java
new file mode 100644
index 0000000000..17fa9ac8ff
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_CopiedCTMBlockTexture.java
@@ -0,0 +1,118 @@
+package gregtech.common.render;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.IBlockContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.util.GT_RenderingWorld;
+import gregtech.api.util.LightingHelper;
+
+class GT_CopiedCTMBlockTexture extends GT_TextureBase implements ITexture, IBlockContainer {
+
+ private final Block mBlock;
+ private final byte mSide, mMeta;
+
+ GT_CopiedCTMBlockTexture(Block aBlock, int ordinalSide, int aMeta, short[] aRGBa, boolean allowAlpha) {
+ if (aRGBa.length != 4)
+ throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_CopiedCTMBlockTexture");
+ mBlock = aBlock;
+ mSide = (byte) ordinalSide;
+ mMeta = (byte) aMeta;
+ }
+
+ @Override
+ public boolean isOldTexture() {
+ return false;
+ }
+
+ private IIcon getIcon(int ordinalSide, int aX, int aY, int aZ, RenderBlocks aRenderer) {
+ final int tSide = mSide == 6 ? ordinalSide : mSide;
+ return mBlock.getIcon(getBlockAccess(aRenderer), aX, aY, aZ, tSide);
+ }
+
+ private GT_RenderingWorld getBlockAccess(RenderBlocks aRenderer) {
+ return GT_RenderingWorld.getInstance(aRenderer.blockAccess);
+ }
+
+ @Override
+ public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ final IIcon aIcon = getIcon(ForgeDirection.EAST.ordinal(), aX, aY, aZ, aRenderer);
+ aRenderer.field_152631_f = true;
+ startDrawingQuads(aRenderer, 1.0f, 0.0f, 0.0f);
+ new LightingHelper(aRenderer).setupLightingXPos(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.EAST, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ));
+ aRenderer.renderFaceXPos(aBlock, aX, aY, aZ, aIcon);
+ draw(aRenderer);
+ aRenderer.field_152631_f = false;
+ }
+
+ @Override
+ public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, -1.0f, 0.0f, 0.0f);
+ final IIcon aIcon = getIcon(ForgeDirection.WEST.ordinal(), aX, aY, aZ, aRenderer);
+ new LightingHelper(aRenderer).setupLightingXNeg(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.WEST, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ));
+ aRenderer.renderFaceXNeg(aBlock, aX, aY, aZ, aIcon);
+ draw(aRenderer);
+ }
+
+ @Override
+ public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, 0.0f, 1.0f, 0.0f);
+ final IIcon aIcon = getIcon(ForgeDirection.UP.ordinal(), aX, aY, aZ, aRenderer);
+ new LightingHelper(aRenderer).setupLightingYPos(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.UP, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ));
+ aRenderer.renderFaceYPos(aBlock, aX, aY, aZ, aIcon);
+ draw(aRenderer);
+ }
+
+ @Override
+ public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, 0.0f, -1.0f, 0.0f);
+ final IIcon aIcon = getIcon(ForgeDirection.DOWN.ordinal(), aX, aY, aZ, aRenderer);
+ new LightingHelper(aRenderer).setupLightingYNeg(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.DOWN, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ));
+ aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, aIcon);
+ draw(aRenderer);
+ }
+
+ @Override
+ public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, 0.0f, 0.0f, 1.0f);
+ final IIcon aIcon = getIcon(ForgeDirection.SOUTH.ordinal(), aX, aY, aZ, aRenderer);
+ new LightingHelper(aRenderer).setupLightingZPos(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.SOUTH, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ));
+ aRenderer.renderFaceZPos(aBlock, aX, aY, aZ, aIcon);
+ draw(aRenderer);
+ }
+
+ @Override
+ public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, 0.0f, 0.0f, -1.0f);
+ final IIcon aIcon = getIcon(ForgeDirection.NORTH.ordinal(), aX, aY, aZ, aRenderer);
+ aRenderer.field_152631_f = true;
+ new LightingHelper(aRenderer).setupLightingZNeg(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.NORTH, mBlock.colorMultiplier(getBlockAccess(aRenderer), aX, aY, aZ));
+ aRenderer.renderFaceZNeg(aBlock, aX, aY, aZ, aIcon);
+ draw(aRenderer);
+ aRenderer.field_152631_f = false;
+ }
+
+ @Override
+ public boolean isValidTexture() {
+ return mBlock != null;
+ }
+
+ @Override
+ public Block getBlock() {
+ return mBlock;
+ }
+
+ @Override
+ public byte getMeta() {
+ return mMeta;
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_FlaskRenderer.java b/src/main/java/gregtech/common/render/GT_FlaskRenderer.java
new file mode 100644
index 0000000000..addcb1cf70
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_FlaskRenderer.java
@@ -0,0 +1,71 @@
+package gregtech.common.render;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.client.MinecraftForgeClient;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.ItemList;
+import gregtech.common.items.GT_VolumetricFlask;
+
+@SideOnly(Side.CLIENT)
+public final class GT_FlaskRenderer implements IItemRenderer {
+
+ public GT_FlaskRenderer() {
+ MinecraftForgeClient.registerItemRenderer(ItemList.VOLUMETRIC_FLASK.getItem(), this);
+ }
+
+ @Override
+ public boolean handleRenderType(ItemStack item, ItemRenderType type) {
+ return type != ItemRenderType.FIRST_PERSON_MAP;
+ }
+
+ @Override
+ public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
+ return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING
+ || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics);
+ }
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
+ GT_VolumetricFlask cell = (GT_VolumetricFlask) item.getItem();
+ IIcon icon = item.getIconIndex();
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ GT_RenderUtil.applyStandardItemTransform(type);
+
+ FluidStack fs = cell != null ? cell.getFluid(item) : null;
+ if (fs != null) {
+ IIcon iconWindow = cell.iconWindow;
+ Fluid fluid = fs.getFluid();
+ IIcon fluidIcon = fluid.getIcon(fs);
+ int fluidColor = fluid.getColor(fs);
+
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
+ GL11.glBlendFunc(GL11.GL_ZERO, GL11.GL_ONE);
+ GT_RenderUtil.renderItem(type, iconWindow);
+
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glDepthFunc(GL11.GL_EQUAL);
+ GL11.glColor3ub((byte) (fluidColor >> 16), (byte) (fluidColor >> 8), (byte) fluidColor);
+ GT_RenderUtil.renderItem(type, fluidIcon);
+ GL11.glColor3ub((byte) -1, (byte) -1, (byte) -1);
+ GL11.glDepthFunc(GL11.GL_LEQUAL);
+ }
+
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GT_RenderUtil.renderItem(type, icon);
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glDisable(GL11.GL_BLEND);
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_FluidDisplayStackRenderer.java b/src/main/java/gregtech/common/render/GT_FluidDisplayStackRenderer.java
new file mode 100644
index 0000000000..9a35f6bc57
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_FluidDisplayStackRenderer.java
@@ -0,0 +1,98 @@
+package gregtech.common.render;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.renderer.OpenGlHelper;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.client.MinecraftForgeClient;
+
+import org.lwjgl.opengl.GL11;
+
+import appeng.util.ReadableNumberConverter;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.common.items.GT_FluidDisplayItem;
+
+@SideOnly(Side.CLIENT)
+public class GT_FluidDisplayStackRenderer implements IItemRenderer {
+
+ public GT_FluidDisplayStackRenderer() {
+ MinecraftForgeClient.registerItemRenderer(ItemList.Display_Fluid.getItem(), this);
+ }
+
+ @Override
+ public boolean handleRenderType(ItemStack item, ItemRenderType type) {
+ if (!item.hasTagCompound()) return false;
+ return type == ItemRenderType.INVENTORY;
+ }
+
+ @Override
+ public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
+ // not sure what this does.
+ return false;
+ }
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
+ if (item == null || item.getItem() == null || !(item.getItem() instanceof GT_FluidDisplayItem)) return;
+
+ OpenGlHelper.glBlendFunc(770, 771, 1, 0);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+
+ Materials associatedFluidMaterial = Materials.get(item.stackTagCompound.getString("mFluidMaterialName"));
+ if (associatedFluidMaterial.renderer == null
+ || !associatedFluidMaterial.renderer.renderFluidDisplayItem(type, item, data)) {
+ IIcon icon = item.getItem()
+ .getIconFromDamage(item.getItemDamage());
+ Tessellator tess = Tessellator.instance;
+ tess.startDrawingQuads();
+ // draw a simple rectangle for the inventory icon
+ final float x_min = icon.getMinU();
+ final float x_max = icon.getMaxU();
+ final float y_min = icon.getMinV();
+ final float y_max = icon.getMaxV();
+ tess.addVertexWithUV(0, 16, 0, x_min, y_max);
+ tess.addVertexWithUV(16, 16, 0, x_max, y_max);
+ tess.addVertexWithUV(16, 0, 0, x_max, y_min);
+ tess.addVertexWithUV(0, 0, 0, x_min, y_min);
+ tess.draw();
+ }
+
+ if (item.getTagCompound() == null) {
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ return;
+ }
+
+ // Render Fluid amount text
+ long fluidAmount = item.getTagCompound()
+ .getLong("mFluidDisplayAmount");
+ if (fluidAmount > 0L && !item.getTagCompound()
+ .getBoolean("mHideStackSize")) {
+ String amountString;
+
+ if (fluidAmount < 10_000) {
+ amountString = "" + fluidAmount + "L";
+ } else {
+ amountString = ReadableNumberConverter.INSTANCE.toWideReadableForm(fluidAmount) + "L";
+ }
+
+ FontRenderer fontRender = Minecraft.getMinecraft().fontRenderer;
+ float smallTextScale = fontRender.getUnicodeFlag() ? 3F / 4F : 1F / 2F;
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glPushMatrix();
+ GL11.glScalef(smallTextScale, smallTextScale, 1.0f);
+
+ fontRender
+ .drawString(amountString, 0, (int) (16 / smallTextScale) - fontRender.FONT_HEIGHT + 1, 0xFFFFFF, true);
+ GL11.glPopMatrix();
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_IconFlipped.java b/src/main/java/gregtech/common/render/GT_IconFlipped.java
new file mode 100644
index 0000000000..8258e74ffa
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_IconFlipped.java
@@ -0,0 +1,91 @@
+package gregtech.common.render;
+
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class GT_IconFlipped implements IIcon {
+
+ private final IIcon baseIcon;
+ private final boolean flipU;
+ private final boolean flipV;
+
+ public GT_IconFlipped(IIcon baseIcon, boolean flipU, boolean flipV) {
+ this.baseIcon = baseIcon;
+ this.flipU = flipU;
+ this.flipV = flipV;
+ }
+
+ /**
+ * Returns the width of the icon, in pixels.
+ */
+ @Override
+ public int getIconWidth() {
+ return this.baseIcon.getIconWidth();
+ }
+
+ /**
+ * Returns the height of the icon, in pixels.
+ */
+ @Override
+ public int getIconHeight() {
+ return this.baseIcon.getIconHeight();
+ }
+
+ /**
+ * Returns the minimum U coordinate to use when rendering with this icon.
+ */
+ @Override
+ public float getMinU() {
+ return this.flipU ? this.baseIcon.getMaxU() : this.baseIcon.getMinU();
+ }
+
+ /**
+ * Returns the maximum U coordinate to use when rendering with this icon.
+ */
+ @Override
+ public float getMaxU() {
+ return this.flipU ? this.baseIcon.getMinU() : this.baseIcon.getMaxU();
+ }
+
+ /**
+ * Gets a U coordinate on the icon. 0 returns uMin and 16 returns uMax. Other arguments return in-between values.
+ */
+ @Override
+ public float getInterpolatedU(double p_94214_1_) {
+ final float f = this.getMaxU() - this.getMinU();
+ return this.getMinU() + f * ((float) p_94214_1_ / 16.0F);
+ }
+
+ /**
+ * Returns the minimum V coordinate to use when rendering with this icon.
+ */
+ @Override
+ public float getMinV() {
+ return this.flipV ? this.baseIcon.getMaxV() : this.baseIcon.getMinV();
+ }
+
+ /**
+ * Returns the maximum V coordinate to use when rendering with this icon.
+ */
+ @Override
+ public float getMaxV() {
+ return this.flipV ? this.baseIcon.getMinV() : this.baseIcon.getMaxV();
+ }
+
+ /**
+ * Gets a V coordinate on the icon. 0 returns vMin and 16 returns vMax. Other arguments return in-between values.
+ */
+ @Override
+ public float getInterpolatedV(double p_94207_1_) {
+ final float f = this.getMaxV() - this.getMinV();
+ return this.getMinV() + f * ((float) p_94207_1_ / 16.0F);
+ }
+
+ @Override
+ public String getIconName() {
+ return this.baseIcon.getIconName();
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_MetaGenerated_Tool_Renderer.java b/src/main/java/gregtech/common/render/GT_MetaGenerated_Tool_Renderer.java
new file mode 100644
index 0000000000..96285a3fc1
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_MetaGenerated_Tool_Renderer.java
@@ -0,0 +1,130 @@
+package gregtech.common.render;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.client.MinecraftForgeClient;
+
+import org.lwjgl.opengl.GL11;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.IToolStats;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+
+public class GT_MetaGenerated_Tool_Renderer implements IItemRenderer {
+
+ public GT_MetaGenerated_Tool_Renderer() {
+ for (GT_MetaGenerated_Tool tItem : GT_MetaGenerated_Tool.sInstances.values()) {
+ if (tItem != null) {
+ MinecraftForgeClient.registerItemRenderer(tItem, this);
+ }
+ }
+ }
+
+ @Override
+ public boolean handleRenderType(ItemStack stack, ItemRenderType type) {
+ return (type == ItemRenderType.EQUIPPED_FIRST_PERSON) || (type == ItemRenderType.INVENTORY)
+ || (type == ItemRenderType.EQUIPPED)
+ || (type == ItemRenderType.ENTITY);
+ }
+
+ @Override
+ public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack stack, ItemRendererHelper helper) {
+ return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING
+ || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics);
+ }
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack stack, Object... data) {
+ GT_MetaGenerated_Tool item = (GT_MetaGenerated_Tool) stack.getItem();
+ GL11.glEnable(GL11.GL_BLEND);
+ GT_RenderUtil.applyStandardItemTransform(type);
+ GL11.glColor3f(1.0F, 1.0F, 1.0F);
+
+ IToolStats toolStats = item != null ? item.getToolStats(stack) : null;
+ if (toolStats != null) {
+ renderToolPart(type, stack, toolStats, false);
+ renderToolPart(type, stack, toolStats, true);
+
+ if ((type == ItemRenderType.INVENTORY)
+ && (GT_MetaGenerated_Tool.getPrimaryMaterial(stack) != Materials._NULL)) {
+ if (GT_Mod.gregtechproxy.mRenderItemDurabilityBar) {
+ IIconContainer iconContainer;
+ long damage = GT_MetaGenerated_Tool.getToolDamage(stack);
+ long maxDamage = GT_MetaGenerated_Tool.getToolMaxDamage(stack);
+ if (damage <= 0L) {
+ iconContainer = Textures.ItemIcons.DURABILITY_BAR[8];
+ } else if (damage >= maxDamage) {
+ iconContainer = Textures.ItemIcons.DURABILITY_BAR[0];
+ } else {
+ iconContainer = Textures.ItemIcons.DURABILITY_BAR[((int) Math
+ .max(0L, Math.min(7L, (maxDamage - damage) * 8L / maxDamage)))];
+ }
+ renderIcon(iconContainer);
+ }
+
+ if (GT_Mod.gregtechproxy.mRenderItemChargeBar) {
+ IIconContainer iconContainer;
+ Long[] stats = item.getElectricStats(stack);
+ if ((stats != null) && (stats[3] < 0L)) {
+ long tCharge = item.getRealCharge(stack);
+ if (tCharge <= 0L) {
+ iconContainer = Textures.ItemIcons.ENERGY_BAR[0];
+ } else if (tCharge >= stats[0]) {
+ iconContainer = Textures.ItemIcons.ENERGY_BAR[8];
+ } else {
+ iconContainer = Textures.ItemIcons.ENERGY_BAR[(7
+ - (int) Math.max(0L, Math.min(6L, (stats[0] - tCharge) * 7L / stats[0])))];
+ }
+ } else {
+ iconContainer = null;
+ }
+ renderIcon(iconContainer);
+ }
+ }
+ }
+ GL11.glDisable(GL11.GL_BLEND);
+ }
+
+ private void renderIcon(IIconContainer iconContainer) {
+ if (iconContainer != null) {
+ IIcon icon = iconContainer.getIcon();
+ IIcon overlay = iconContainer.getOverlayIcon();
+ if (icon != null) {
+ Minecraft.getMinecraft().renderEngine.bindTexture(iconContainer.getTextureFile());
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GT_RenderUtil.renderItemIcon(icon, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F);
+ }
+ if (overlay != null) {
+ Minecraft.getMinecraft().renderEngine.bindTexture(iconContainer.getTextureFile());
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GT_RenderUtil.renderItemIcon(overlay, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F);
+ }
+ }
+ }
+
+ private static void renderToolPart(ItemRenderType type, ItemStack stack, IToolStats toolStats, boolean isToolHead) {
+ IIconContainer iconContainer = toolStats.getIcon(isToolHead, stack);
+ if (iconContainer != null) {
+ IIcon icon = iconContainer.getIcon();
+ IIcon overlay = iconContainer.getOverlayIcon();
+ if (icon != null) {
+ Minecraft.getMinecraft().renderEngine.bindTexture(iconContainer.getTextureFile());
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ short[] modulation = toolStats.getRGBa(isToolHead, stack);
+ GL11.glColor3f(modulation[0] / 255.0F, modulation[1] / 255.0F, modulation[2] / 255.0F);
+ GT_RenderUtil.renderItem(type, icon);
+ GL11.glColor3f(1.0F, 1.0F, 1.0F);
+ }
+ if (overlay != null) {
+ Minecraft.getMinecraft().renderEngine.bindTexture(iconContainer.getTextureFile());
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GT_RenderUtil.renderItem(type, overlay);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_MultiTexture.java b/src/main/java/gregtech/common/render/GT_MultiTexture.java
new file mode 100644
index 0000000000..d3cff271cb
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_MultiTexture.java
@@ -0,0 +1,69 @@
+package gregtech.common.render;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+
+import gregtech.GT_Mod;
+import gregtech.api.interfaces.ITexture;
+
+/**
+ * <p>
+ * Lets Multiple ITextures Render overlay over each other.<
+ * </p>
+ * <p>
+ * I should have done this much earlier...
+ * </p>
+ */
+public class GT_MultiTexture extends GT_TextureBase implements ITexture {
+
+ protected final ITexture[] mTextures;
+
+ public static GT_MultiTexture get(ITexture... aTextures) {
+ return GT_Mod.instance.isClientSide() ? new GT_MultiTexture(aTextures) : null;
+ }
+
+ protected GT_MultiTexture(ITexture... aTextures) {
+ mTextures = aTextures;
+ }
+
+ @Override
+ public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ for (ITexture tTexture : mTextures)
+ if (tTexture != null && tTexture.isValidTexture()) tTexture.renderXPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+
+ @Override
+ public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ for (ITexture tTexture : mTextures)
+ if (tTexture != null && tTexture.isValidTexture()) tTexture.renderXNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+
+ @Override
+ public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ for (ITexture tTexture : mTextures)
+ if (tTexture != null && tTexture.isValidTexture()) tTexture.renderYPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+
+ @Override
+ public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ for (ITexture tTexture : mTextures)
+ if (tTexture != null && tTexture.isValidTexture()) tTexture.renderYNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+
+ @Override
+ public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ for (ITexture tTexture : mTextures)
+ if (tTexture != null && tTexture.isValidTexture()) tTexture.renderZPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+
+ @Override
+ public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ for (ITexture tTexture : mTextures)
+ if (tTexture != null && tTexture.isValidTexture()) tTexture.renderZNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+
+ @Override
+ public boolean isValidTexture() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_MultiTile_Renderer.java b/src/main/java/gregtech/common/render/GT_MultiTile_Renderer.java
new file mode 100644
index 0000000000..4d55979658
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_MultiTile_Renderer.java
@@ -0,0 +1,181 @@
+package gregtech.common.render;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
+import cpw.mods.fml.client.registry.RenderingRegistry;
+import gregtech.GT_Mod;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.logic.ModelRenderLogic;
+import gregtech.api.logic.interfaces.ModelRenderLogicHost;
+import gregtech.api.multitileentity.MultiTileEntityBlockInternal;
+import gregtech.api.multitileentity.MultiTileEntityClassContainer;
+import gregtech.api.multitileentity.MultiTileEntityRegistry;
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.multiblock.base.MultiBlockPart;
+
+public class GT_MultiTile_Renderer implements ISimpleBlockRenderingHandler {
+
+ private final int renderID;
+ public static GT_MultiTile_Renderer INSTANCE;
+
+ public GT_MultiTile_Renderer() {
+ this.renderID = RenderingRegistry.getNextAvailableRenderId();
+ INSTANCE = this;
+ RenderingRegistry.registerBlockHandler(this);
+ }
+
+ @Override
+ public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
+ if (!(block instanceof MultiTileEntityBlockInternal)) {
+ return;
+ }
+
+ GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+
+ MultiTileEntityBlockInternal mteBlock = (MultiTileEntityBlockInternal) block;
+ MultiTileEntityRegistry registry = mteBlock.getRegistry();
+ if (registry == null) return;
+ MultiTileEntityClassContainer classContainer = registry.getClassContainer(metadata);
+ if (classContainer == null) return;
+ renderer.setRenderBoundsFromBlock(mteBlock);
+
+ for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ ITexture texture = classContainer.mCanonicalTileEntity.getTexture(side);
+ if (texture == null) continue;
+ switch (side) {
+ case DOWN -> renderYNegative(null, renderer, 0, 0, 0, block, texture, side);
+ case UP -> renderYPositive(null, renderer, 0, 0, 0, block, texture, side);
+ case WEST -> renderXNegative(null, renderer, 0, 0, 0, block, texture, side);
+ case EAST -> renderXPositive(null, renderer, 0, 0, 0, block, texture, side);
+ case NORTH -> renderZNegative(null, renderer, 0, 0, 0, block, texture, side);
+ case SOUTH -> renderZPositive(null, renderer, 0, 0, 0, block, texture, side);
+ default -> {
+ // Do nothing
+ }
+ }
+ }
+
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ }
+
+ @Override
+ public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
+ RenderBlocks renderer) {
+ TileEntity entity = world.getTileEntity(x, y, z);
+ if (entity == null) {
+ return false;
+ }
+
+ renderer.enableAO = Minecraft.isAmbientOcclusionEnabled() && GT_Mod.gregtechproxy.mRenderTileAmbientOcclusion;
+ renderer.useInventoryTint = false;
+
+ if (entity instanceof ModelRenderLogicHost modelEntity && modelEntity.shouldRenderModel()) {
+ ModelRenderLogic renderLogic = modelEntity.getRenderLogic();
+ return true;
+ }
+
+ if (!(entity instanceof MultiTileBasicRender)) {
+ return false;
+ }
+
+ if (entity instanceof MultiBlockPart) {
+ IMultiBlockController controller = ((MultiBlockPart) entity).getTarget(false);
+ if (controller instanceof ModelRenderLogicHost && ((ModelRenderLogicHost) controller).shouldRenderModel()) {
+ return false;
+ }
+ }
+
+ MultiTileBasicRender renderedEntity = (MultiTileBasicRender) entity;
+
+ for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ ITexture texture = renderedEntity.getTexture(side);
+ if (texture == null) continue;
+ switch (side) {
+ case DOWN -> renderYNegative(world, renderer, x, y, z, block, texture, side);
+ case UP -> renderYPositive(world, renderer, x, y, z, block, texture, side);
+ case WEST -> renderXNegative(world, renderer, x, y, z, block, texture, side);
+ case EAST -> renderXPositive(world, renderer, x, y, z, block, texture, side);
+ case NORTH -> renderZNegative(world, renderer, x, y, z, block, texture, side);
+ case SOUTH -> renderZPositive(world, renderer, x, y, z, block, texture, side);
+ default -> {
+ // Do nothing
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean shouldRender3DInInventory(int modelId) {
+ return true;
+ }
+
+ @Override
+ public int getRenderId() {
+ return renderID;
+ }
+
+ private static void renderYNegative(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block,
+ ITexture texture, ForgeDirection side) {
+ if (world != null) {
+ if (!block.shouldSideBeRendered(world, x, y - 1, z, side.ordinal())) return;
+ Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x, y - 1, z));
+ }
+ texture.renderYNeg(renderer, block, x, y, z);
+ }
+
+ private static void renderZNegative(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block,
+ ITexture texture, ForgeDirection side) {
+ if (world != null) {
+ if (!block.shouldSideBeRendered(world, x, y, z - 1, side.ordinal())) return;
+ Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z - 1));
+ }
+ texture.renderZNeg(renderer, block, x, y, z);
+ }
+
+ private static void renderXNegative(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block,
+ ITexture texture, ForgeDirection side) {
+ if (world != null) {
+ if (!block.shouldSideBeRendered(world, x - 1, y, z, side.ordinal())) return;
+ Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x - 1, y, z));
+ }
+ texture.renderXNeg(renderer, block, x, y, z);
+ }
+
+ private static void renderYPositive(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block,
+ ITexture texture, ForgeDirection side) {
+ if (world != null) {
+ if (!block.shouldSideBeRendered(world, x, y + 1, z, side.ordinal())) return;
+ Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x, y + 1, z));
+ }
+ texture.renderYPos(renderer, block, x, y, z);
+ }
+
+ private static void renderXPositive(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block,
+ ITexture texture, ForgeDirection side) {
+ if (world != null) {
+ if (!block.shouldSideBeRendered(world, x + 1, y, z, side.ordinal())) return;
+ Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x + 1, y, z));
+ }
+ texture.renderXPos(renderer, block, x, y, z);
+ }
+
+ private static void renderZPositive(IBlockAccess world, RenderBlocks renderer, int x, int y, int z, Block block,
+ ITexture texture, ForgeDirection side) {
+ if (world != null) {
+ if (!block.shouldSideBeRendered(world, x, y, z + 1, side.ordinal())) return;
+ Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z + 1));
+ }
+ texture.renderZPos(renderer, block, x, y, z);
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_PollutionRenderer.java b/src/main/java/gregtech/common/render/GT_PollutionRenderer.java
new file mode 100644
index 0000000000..ee87b2b5d1
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_PollutionRenderer.java
@@ -0,0 +1,251 @@
+package gregtech.common.render;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityClientPlayerMP;
+import net.minecraft.client.particle.EntityFX;
+import net.minecraft.client.renderer.OpenGlHelper;
+import net.minecraft.potion.Potion;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.World;
+import net.minecraftforge.client.event.EntityViewRenderEvent;
+import net.minecraftforge.event.world.WorldEvent;
+
+import org.lwjgl.opengl.GL11;
+
+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.TickEvent;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.common.entities.GT_EntityFXPollution;
+import gregtech.common.misc.GT_ClientPollutionMap;
+
+@SideOnly(Side.CLIENT)
+public class GT_PollutionRenderer {
+
+ private static GT_ClientPollutionMap pollutionMap;
+ private static int playerPollution = 0;
+
+ private static final boolean DEBUG = false;
+
+ // PARTICLES_POLLUTION_START + PARTICLES_POLLUTION_END -> Max Particles
+ private static final int PARTICLES_MAX_NUM = 100;
+ private static final int PARTICLES_POLLUTION_START = 400000;
+ private static final int PARTICLES_POLLUTION_END = 3500000;
+
+ private static final int FOG_START_AT_POLLUTION = 400000;
+ private static final int FOG_MAX_AT_POLLUTION = 7000000;
+ // jump from linear to exponential fog. x*FOG_MAX_AT_POLLUTION+FOG_START_AT_POLLUTION
+ private static final double FOG_START_EXP_RATIO = 0.02D;
+
+ private static final float[] fogColor = { 0.3f, 0.25f, 0.1f };
+ private static final short[] grassColor = { 230, 180, 40 };
+ private static final short[] leavesColor = { 160, 80, 15 };
+ private static final short[] liquidColor = { 160, 200, 10 };
+ private static final short[] foliageColor = { 160, 80, 15 };
+
+ // TODO need to soft update some blocks, grass and leaves does more often than liquid it looks like.
+
+ public GT_PollutionRenderer() {
+ pollutionMap = new GT_ClientPollutionMap();
+ }
+
+ public void preLoad() {
+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.register(this);
+ FMLCommonHandler.instance()
+ .bus()
+ .register(this);
+ }
+
+ public void processPacket(ChunkCoordIntPair chunk, int pollution) {
+ pollutionMap.addChunkPollution(chunk.chunkXPos, chunk.chunkZPos, pollution);
+ }
+
+ @SubscribeEvent(priority = EventPriority.HIGH)
+ public void enteredWorld(WorldEvent.Load event) {
+ EntityClientPlayerMP p = Minecraft.getMinecraft().thePlayer;
+ if (!event.world.isRemote || p == null) return;
+ pollutionMap.reset();
+ }
+
+ private static int color(int color, int pollution, int low, float high, short[] colors) {
+ if (pollution < low) return color;
+
+ int r = (color >> 16) & 0xFF;
+ int g = (color >> 8) & 0xFF;
+ int b = color & 0xFF;
+ float p = (pollution - low) / high;
+ if (p > 1) p = 1;
+ float pi = 1 - p;
+
+ r = ((int) (r * pi + p * colors[0])) & 0xFF;
+ g = ((int) (g * pi + p * colors[1])) & 0xFF;
+ b = ((int) (b * pi + p * colors[2])) & 0xFF;
+
+ return (r & 0xFF) << 16 | (g & 0xFF) << 8 | b & 0xFF;
+ }
+
+ // Methods for hodgepodge to color grass / foliage blocks etc.
+ public static int colorGrass(int oColor, int x, int z) {
+ return color(oColor, pollutionMap.getPollution(x, z) / 1000, 350, 600, grassColor);
+ }
+
+ public static int colorLeaves(int oColor, int x, int z) {
+ return color(oColor, pollutionMap.getPollution(x, z) / 1000, 300, 500, leavesColor);
+ }
+
+ public static int colorLiquid(int oColor, int x, int z) {
+ return color(oColor, pollutionMap.getPollution(x, z) / 1000, 300, 500, liquidColor);
+ }
+
+ public static int colorFoliage(int oColor, int x, int z) {
+ return color(oColor, pollutionMap.getPollution(x, z) / 1000, 300, 500, foliageColor);
+ }
+
+ public static int getKnownPollution(int x, int z) {
+ return pollutionMap.getPollution(x, z);
+ }
+
+ @SubscribeEvent(priority = EventPriority.LOW)
+ public void manipulateColor(EntityViewRenderEvent.FogColors event) {
+ if (!DEBUG && Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode) return;
+
+ if (event.block.getMaterial() == Material.water || event.block.getMaterial() == Material.lava) return;
+
+ float x = fogIntensityLastTick > 1 ? 1F : (float) fogIntensityLastTick;
+ float xi = 1 - x;
+
+ event.red = xi * event.red + x * fogColor[0];
+ event.green = xi * event.green + x * fogColor[1];
+ event.blue = xi * event.blue + x * fogColor[2];
+ }
+
+ private static final int END_MAX_DISTANCE = 192 - 1;
+ private static double fogIntensityLastTick = 0;
+
+ @SubscribeEvent(priority = EventPriority.LOWEST)
+ public void renderGTPollutionFog(EntityViewRenderEvent.RenderFogEvent event) {
+ if (!GT_Mod.gregtechproxy.mRenderPollutionFog) return;
+
+ if ((!DEBUG && Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode)
+ || (fogIntensityLastTick <= 0 && fogIntensityLastTick >= FOG_START_EXP_RATIO)) return;
+
+ if (event.fogMode == 0) {
+ double v = 1 - fogIntensityLastTick / FOG_START_EXP_RATIO;
+ // trying to smooth out jump from linear to exponential
+ GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
+ GL11.glFogf(GL11.GL_FOG_START, (float) ((END_MAX_DISTANCE - 20) * 0.75F * v + 20));
+ GL11.glFogf(GL11.GL_FOG_END, (float) (END_MAX_DISTANCE * (0.75F + v * 0.25F)));
+ }
+ // else if ( event.fogMode < 0) { }
+ }
+
+ @SubscribeEvent(priority = EventPriority.LOWEST)
+ public void renderGTPollutionFog(EntityViewRenderEvent.FogDensity event) {
+ if (!GT_Mod.gregtechproxy.mRenderPollutionFog) return;
+
+ if (!DEBUG && Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode) return;
+
+ if (event.entity.isPotionActive(Potion.blindness) || (fogIntensityLastTick < FOG_START_EXP_RATIO)
+ || event.block.getMaterial() == Material.water
+ || event.block.getMaterial() == Material.lava) return;
+
+ GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP2);
+ event.density = (float) Math.pow(fogIntensityLastTick - FOG_START_EXP_RATIO, .75F) / 5 + 0.01F;
+ event.setCanceled(true);
+ }
+
+ private double lastUpdate = 0;
+
+ @SubscribeEvent(priority = EventPriority.HIGHEST)
+ public void onRenderTick(TickEvent.RenderTickEvent event) {
+ Minecraft mc = Minecraft.getMinecraft();
+ if (mc == null) return;
+ EntityClientPlayerMP player = mc.thePlayer;
+ if (player == null) return;
+
+ if (event.phase == TickEvent.Phase.START) {
+ if (event.renderTickTime < lastUpdate) lastUpdate = lastUpdate - 1;
+ float step = (float) ((event.renderTickTime - lastUpdate) / 50);
+ lastUpdate = event.renderTickTime;
+
+ float fogIntensity = (playerPollution - FOG_START_AT_POLLUTION) / (float) FOG_MAX_AT_POLLUTION;
+ if (fogIntensity > 1) fogIntensity = 1;
+ else if (fogIntensity < 0) fogIntensity = 0;
+
+ double e = fogIntensity - fogIntensityLastTick;
+ if (e != 0) {
+ if (e > 0.2) e = 0.2D;
+ else if (e < -0.5) e = -0.5D;
+
+ if (e > 0.001D || e < -0.001D) fogIntensityLastTick += step * e;
+ else fogIntensityLastTick = fogIntensity;
+ }
+ } else if (DEBUG) {
+ drawPollution("Intensity: " + (fogIntensityLastTick * 10000), 0);
+ drawPollution(
+ "Pollution: " + pollutionMap.getPollution(
+ Minecraft.getMinecraft().thePlayer.lastTickPosX,
+ Minecraft.getMinecraft().thePlayer.lastTickPosZ),
+ 20);
+ drawPollution(
+ "Density: "
+ + ((float) (Math.pow(fogIntensityLastTick - FOG_START_EXP_RATIO, .75F) / 5 + 0.01F) * 10000),
+ 40);
+ }
+ }
+
+ // Adding dirt particles in the air
+ @SubscribeEvent(priority = EventPriority.HIGHEST)
+ public void onClientTick(TickEvent.ClientTickEvent event) {
+ if (!GT_Mod.gregtechproxy.mRenderDirtParticles) return;
+ Minecraft mc = Minecraft.getMinecraft();
+ if (mc == null) return;
+ EntityClientPlayerMP player = mc.thePlayer;
+ if (player == null || (player.capabilities.isCreativeMode && !DEBUG)) return;
+
+ World w = player.worldObj;
+ playerPollution = pollutionMap.getPollution(player.lastTickPosX, player.lastTickPosZ);
+
+ float intensity = ((float) playerPollution - PARTICLES_POLLUTION_START) / PARTICLES_POLLUTION_END;
+ if (intensity < 0) return;
+ else if (intensity > 1) intensity = 1;
+ else intensity *= intensity;
+
+ int x = MathHelper.floor_double(player.posX);
+ int y = MathHelper.floor_double(player.posY);
+ int z = MathHelper.floor_double(player.posZ);
+
+ int numParticles = Math.round(intensity * PARTICLES_MAX_NUM);
+
+ for (int l = 0; l < numParticles; ++l) {
+ int i1 = x + w.rand.nextInt(16) - w.rand.nextInt(16);
+ int j1 = y + w.rand.nextInt(16) - w.rand.nextInt(16);
+ int k1 = z + w.rand.nextInt(16) - w.rand.nextInt(16);
+ Block block = w.getBlock(i1, j1, k1);
+
+ if (block.getMaterial() == Material.air) {
+ EntityFX fx = new GT_EntityFXPollution(
+ w,
+ (float) i1 + w.rand.nextFloat(),
+ (float) j1 + w.rand.nextFloat(),
+ (float) k1 + w.rand.nextFloat());
+ mc.effectRenderer.addEffect(fx);
+ }
+ }
+ }
+
+ private void drawPollution(String text, int off) {
+ GL11.glPushMatrix();
+ GL11.glEnable(GL11.GL_BLEND);
+ OpenGlHelper.glBlendFunc(770, 771, 1, 0);
+ Minecraft.getMinecraft().fontRenderer.drawStringWithShadow(text, 0, off, 0xFFFFFFFF);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glPopMatrix();
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_RenderDrone.java b/src/main/java/gregtech/common/render/GT_RenderDrone.java
new file mode 100644
index 0000000000..af1336a219
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_RenderDrone.java
@@ -0,0 +1,93 @@
+package gregtech.common.render;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraft.client.renderer.OpenGlHelper;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.model.AdvancedModelLoader;
+import net.minecraftforge.client.model.IModelCustom;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.registry.ClientRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.common.tileentities.render.TileDrone;
+
+@SideOnly(Side.CLIENT)
+public class GT_RenderDrone extends TileEntitySpecialRenderer {
+
+ private static final ResourceLocation DroneTexture = new ResourceLocation(GregTech.ID, "textures/model/drone.png");
+ private static final IModelCustom Drone = AdvancedModelLoader
+ .loadModel(new ResourceLocation(GregTech.ID, "textures/model/drone.obj"));
+
+ public GT_RenderDrone() {
+ ClientRegistry.bindTileEntitySpecialRenderer(TileDrone.class, this);
+ }
+
+ @Override
+ public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) {
+ if (!(tile instanceof TileDrone drone)) return;
+ final float size = 1.0f;
+ GL11.glPushMatrix();
+ GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5);
+ renderDrone(size);
+ renderBlade(drone, size);
+ GL11.glPopMatrix();
+ }
+
+ private void renderDrone(double size) {
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_CULL_FACE);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ this.bindTexture(DroneTexture);
+ GL11.glScaled(size, size, size);
+ OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240f, 240f);
+ Drone.renderOnly("drone", "box", "main");
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ GL11.glEnable(GL11.GL_LIGHTING);
+ }
+
+ private void renderBlade(TileDrone drone, double size) {
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_CULL_FACE);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ this.bindTexture(DroneTexture);
+ GL11.glScaled(size, size, size);
+ OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240f, 240f);
+ GL11.glPushMatrix();
+ GL11.glTranslated(-0.7d * size, -1 * size, -0.7 * size);
+ GL11.glRotated(drone.rotation, 0, 1, 0);
+ GL11.glTranslated(0.7d * size, 1 * size, 0.7 * size);
+ Drone.renderOnly("blade2");
+ GL11.glPopMatrix();
+ GL11.glPushMatrix();
+ GL11.glTranslated(-0.7d * size, -1 * size, 0.7 * size);
+ GL11.glRotated(drone.rotation, 0, 1, 0);
+ GL11.glTranslated(0.7d * size, 1 * size, -0.7 * size);
+ Drone.renderOnly("blade3");
+ GL11.glPopMatrix();
+ GL11.glPushMatrix();
+ GL11.glTranslated(0.7d * size, -1 * size, -0.7 * size);
+ GL11.glRotated(drone.rotation, 0, 1, 0);
+ GL11.glTranslated(-0.7d * size, 1 * size, 0.7 * size);
+ Drone.renderOnly("blade1");
+ GL11.glPopMatrix();
+ GL11.glPushMatrix();
+ GL11.glTranslated(0.7d * size, -1 * size, 0.7 * size);
+ GL11.glRotated(drone.rotation, 0, 1, 0);
+ GL11.glTranslated(-0.7d * size, 1 * size, -0.7 * size);
+ Drone.renderOnly("blade4");
+ GL11.glPopMatrix();
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ GL11.glEnable(GL11.GL_LIGHTING);
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_RenderUtil.java b/src/main/java/gregtech/common/render/GT_RenderUtil.java
new file mode 100644
index 0000000000..68195513fe
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_RenderUtil.java
@@ -0,0 +1,141 @@
+package gregtech.common.render;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.ItemRenderer;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.entity.RenderItem;
+import net.minecraft.client.renderer.entity.RenderManager;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.lwjgl.opengl.GL11;
+
+import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer;
+
+public class GT_RenderUtil {
+
+ public static void colorGTItem(ItemStack aStack) {
+ if (aStack.getItem() instanceof IGT_ItemWithMaterialRenderer aItem) {
+
+ short[] tModulation = aItem.getRGBa(aStack);
+ GL11.glColor4f(tModulation[0] / 255.0F, tModulation[1] / 255.0F, tModulation[2] / 255.0F, 255.0f);
+ } else {
+ System.out.println("WARNING: " + aStack.getDisplayName() + " does not have an associated GT colour.");
+ }
+ }
+
+ public static void renderBlockIcon(RenderBlocks aRenderer, Block aBlock, double aX, double aY, double aZ,
+ IIcon aIcon, ForgeDirection side) {
+ switch (side) {
+ case DOWN -> aRenderer.renderFaceYNeg(aBlock, aX, aY, aZ, aIcon);
+ case UP -> aRenderer.renderFaceYPos(aBlock, aX, aY, aZ, aIcon);
+ case NORTH -> aRenderer.renderFaceZNeg(aBlock, aX, aY, aZ, aIcon);
+ case SOUTH -> aRenderer.renderFaceZPos(aBlock, aX, aY, aZ, aIcon);
+ case WEST -> aRenderer.renderFaceXNeg(aBlock, aX, aY, aZ, aIcon);
+ case EAST -> aRenderer.renderFaceXPos(aBlock, aX, aY, aZ, aIcon);
+ }
+ }
+
+ public static void renderItemIcon(IIcon icon, double size, double z, float nx, float ny, float nz) {
+ renderItemIcon(icon, 0.0D, 0.0D, size, size, z, nx, ny, nz);
+ }
+
+ public static void renderItemIcon(IIcon icon, double xStart, double yStart, double xEnd, double yEnd, double z,
+ float nx, float ny, float nz) {
+ if (icon == null) {
+ return;
+ }
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(nx, ny, nz);
+ if (nz > 0.0F) {
+ Tessellator.instance.addVertexWithUV(xStart, yStart, z, icon.getMinU(), icon.getMinV());
+ Tessellator.instance.addVertexWithUV(xEnd, yStart, z, icon.getMaxU(), icon.getMinV());
+ Tessellator.instance.addVertexWithUV(xEnd, yEnd, z, icon.getMaxU(), icon.getMaxV());
+ Tessellator.instance.addVertexWithUV(xStart, yEnd, z, icon.getMinU(), icon.getMaxV());
+ } else {
+ Tessellator.instance.addVertexWithUV(xStart, yEnd, z, icon.getMinU(), icon.getMaxV());
+ Tessellator.instance.addVertexWithUV(xEnd, yEnd, z, icon.getMaxU(), icon.getMaxV());
+ Tessellator.instance.addVertexWithUV(xEnd, yStart, z, icon.getMaxU(), icon.getMinV());
+ Tessellator.instance.addVertexWithUV(xStart, yStart, z, icon.getMinU(), icon.getMinV());
+ }
+ Tessellator.instance.draw();
+ }
+
+ @SuppressWarnings("RedundantLabeledSwitchRuleCodeBlock")
+ public static void renderItem(IItemRenderer.ItemRenderType type, IIcon icon) {
+ Tessellator tessellator = Tessellator.instance;
+ float maxU = icon.getMaxU();
+ float minV = icon.getMinV();
+ float minU = icon.getMinU();
+ float maxV = icon.getMaxV();
+
+ switch (type) {
+ case ENTITY -> {
+ if (Minecraft.getMinecraft().gameSettings.fancyGraphics) {
+ ItemRenderer.renderItemIn2D(
+ tessellator,
+ maxU,
+ minV,
+ minU,
+ maxV,
+ icon.getIconWidth(),
+ icon.getIconHeight(),
+ 0.0625F);
+ } else {
+ GL11.glPushMatrix();
+
+ if (!RenderItem.renderInFrame) {
+ GL11.glRotatef(180.0F - RenderManager.instance.playerViewY, 0.0F, 1.0F, 0.0F);
+ }
+
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, 1.0F, 0.0F);
+ tessellator.addVertexWithUV(0.0F - 0.5F, 0.0F - 0.25F, 0.0D, minU, maxV);
+ tessellator.addVertexWithUV(1.0F - 0.5F, 0.0F - 0.25F, 0.0D, maxU, maxV);
+ tessellator.addVertexWithUV(1.0F - 0.5F, 1.0F - 0.25F, 0.0D, maxU, minV);
+ tessellator.addVertexWithUV(0.0F - 0.5F, 1.0F - 0.25F, 0.0D, minU, minV);
+ tessellator.draw();
+
+ GL11.glPopMatrix();
+ }
+ }
+ case EQUIPPED, EQUIPPED_FIRST_PERSON -> {
+ ItemRenderer.renderItemIn2D(
+ tessellator,
+ maxU,
+ minV,
+ minU,
+ maxV,
+ icon.getIconWidth(),
+ icon.getIconHeight(),
+ 0.0625F);
+ }
+ case INVENTORY -> {
+ renderItemIcon(icon, 16.0D, 0.001, 0.0F, 0.0F, -1.0F);
+ }
+ default -> {}
+ }
+ }
+
+ public static void applyStandardItemTransform(IItemRenderer.ItemRenderType type) {
+ if (type == IItemRenderer.ItemRenderType.ENTITY) {
+ if (RenderItem.renderInFrame) {
+ // Magic numbers calculated from vanilla code
+ GL11.glScalef(1.025641F, 1.025641F, 1.025641F);
+ GL11.glTranslatef(0.0F, -0.05F, 0.0F);
+ }
+
+ if (Minecraft.getMinecraft().gameSettings.fancyGraphics) {
+ if (RenderItem.renderInFrame) {
+ GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
+ }
+ // Magic numbers calculated from vanilla code
+ GL11.glTranslatef(-0.5F, -0.25F, 0.0421875F);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_RenderedTexture.java b/src/main/java/gregtech/common/render/GT_RenderedTexture.java
new file mode 100644
index 0000000000..afaf3b290c
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_RenderedTexture.java
@@ -0,0 +1,395 @@
+package gregtech.common.render;
+
+import static gregtech.api.util.LightingHelper.MAX_BRIGHTNESS;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignment;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider;
+import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
+import com.gtnewhorizon.structurelib.alignment.enumerable.Flip;
+import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation;
+
+import gregtech.GT_Mod;
+import gregtech.api.interfaces.IColorModulationContainer;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.LightingHelper;
+
+public class GT_RenderedTexture extends GT_TextureBase implements ITexture, IColorModulationContainer {
+
+ protected final IIconContainer mIconContainer;
+ private final short[] mRGBa;
+ private final boolean glow;
+ private final boolean stdOrient;
+ private final boolean useExtFacing;
+
+ protected GT_RenderedTexture(IIconContainer aIcon, short[] aRGBa, boolean allowAlpha, boolean glow,
+ boolean stdOrient, boolean extFacing) {
+ if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_RenderedTexture");
+ mIconContainer = aIcon;
+ mRGBa = aRGBa;
+ this.glow = glow;
+ this.stdOrient = stdOrient;
+ this.useExtFacing = extFacing;
+ }
+
+ @Override
+ public boolean isOldTexture() {
+ return false;
+ }
+
+ @Override
+ public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, 1.0f, 0.0f, 0.0f);
+ final boolean enableAO = aRenderer.enableAO;
+ final LightingHelper lighting = new LightingHelper(aRenderer);
+ if (glow) {
+ if (!GT_Mod.gregtechproxy.mRenderGlowTextures) {
+ draw(aRenderer);
+ return;
+ }
+ aRenderer.enableAO = false;
+ lighting.setLightnessOverride(1.0F);
+ if (enableAO) lighting.setBrightnessOverride(MAX_BRIGHTNESS);
+ }
+ lighting.setupLightingXPos(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.EAST, mRGBa);
+ final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ);
+ renderFaceXPos(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation);
+ if (mIconContainer.getOverlayIcon() != null) {
+ lighting.setupColor(ForgeDirection.EAST, 0xffffff);
+ renderFaceXPos(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation);
+ }
+ aRenderer.enableAO = enableAO;
+ draw(aRenderer);
+ }
+
+ @Override
+ public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, -1.0f, 0.0f, 0.0f);
+ final boolean enableAO = aRenderer.enableAO;
+ final LightingHelper lighting = new LightingHelper(aRenderer);
+ if (glow) {
+ if (!GT_Mod.gregtechproxy.mRenderGlowTextures) {
+ draw(aRenderer);
+ return;
+ }
+ aRenderer.enableAO = false;
+ lighting.setLightnessOverride(1.0F);
+ lighting.setBrightnessOverride(MAX_BRIGHTNESS);
+ }
+ lighting.setupLightingXNeg(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.WEST, mRGBa);
+ final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ);
+ renderFaceXNeg(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation);
+ if (mIconContainer.getOverlayIcon() != null) {
+ lighting.setupColor(ForgeDirection.WEST, 0xffffff);
+ renderFaceXNeg(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation);
+ }
+ aRenderer.enableAO = enableAO;
+ draw(aRenderer);
+ }
+
+ @Override
+ public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, 0.0f, 1.0f, 0.0f);
+ final boolean enableAO = aRenderer.enableAO;
+ final LightingHelper lighting = new LightingHelper(aRenderer);
+ if (glow) {
+ if (!GT_Mod.gregtechproxy.mRenderGlowTextures) {
+ draw(aRenderer);
+ return;
+ }
+ aRenderer.enableAO = false;
+ lighting.setLightnessOverride(1.0F);
+ lighting.setBrightnessOverride(MAX_BRIGHTNESS);
+ }
+ lighting.setupLightingYPos(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.UP, mRGBa);
+ final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ);
+ renderFaceYPos(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation);
+ if (mIconContainer.getOverlayIcon() != null) {
+ lighting.setupColor(ForgeDirection.UP, 0xffffff);
+ renderFaceYPos(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation);
+ }
+ aRenderer.enableAO = enableAO;
+ draw(aRenderer);
+ }
+
+ @Override
+ public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, 0.0f, -1.0f, 0.0f);
+ final boolean enableAO = aRenderer.enableAO;
+ final LightingHelper lighting = new LightingHelper(aRenderer);
+ if (glow) {
+ if (!GT_Mod.gregtechproxy.mRenderGlowTextures) {
+ draw(aRenderer);
+ return;
+ }
+ aRenderer.enableAO = false;
+ lighting.setLightnessOverride(1.0F);
+ lighting.setBrightnessOverride(MAX_BRIGHTNESS);
+ }
+ lighting.setupLightingYNeg(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.DOWN, mRGBa);
+ final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ);
+ renderFaceYNeg(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation);
+ if (mIconContainer.getOverlayIcon() != null) {
+ Tessellator.instance.setColorRGBA(255, 255, 255, 255);
+ renderFaceYNeg(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation);
+ }
+ aRenderer.enableAO = enableAO;
+ draw(aRenderer);
+ }
+
+ @Override
+ public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, 0.0f, 0.0f, 1.0f);
+ final boolean enableAO = aRenderer.enableAO;
+ final LightingHelper lighting = new LightingHelper(aRenderer);
+ if (glow) {
+ if (!GT_Mod.gregtechproxy.mRenderGlowTextures) {
+ draw(aRenderer);
+ return;
+ }
+ aRenderer.enableAO = false;
+ lighting.setLightnessOverride(1.0F);
+ lighting.setBrightnessOverride(MAX_BRIGHTNESS);
+ }
+ lighting.setupLightingZPos(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.SOUTH, mRGBa);
+ final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ);
+ renderFaceZPos(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation);
+ if (mIconContainer.getOverlayIcon() != null) {
+ lighting.setupColor(ForgeDirection.SOUTH, 0xffffff);
+ renderFaceZPos(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation);
+ }
+ aRenderer.enableAO = enableAO;
+ draw(aRenderer);
+ }
+
+ @Override
+ public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ startDrawingQuads(aRenderer, 0.0f, 0.0f, -1.0f);
+ final boolean enableAO = aRenderer.enableAO;
+ final LightingHelper lighting = new LightingHelper(aRenderer);
+ if (glow) {
+ if (!GT_Mod.gregtechproxy.mRenderGlowTextures) {
+ draw(aRenderer);
+ return;
+ }
+ aRenderer.enableAO = false;
+ lighting.setLightnessOverride(1.0F);
+ lighting.setBrightnessOverride(MAX_BRIGHTNESS);
+ }
+ lighting.setupLightingZNeg(aBlock, aX, aY, aZ)
+ .setupColor(ForgeDirection.NORTH, mRGBa);
+ final ExtendedFacing rotation = getExtendedFacing(aX, aY, aZ);
+ renderFaceZNeg(aRenderer, aX, aY, aZ, mIconContainer.getIcon(), rotation);
+ if (mIconContainer.getOverlayIcon() != null) {
+ lighting.setupColor(ForgeDirection.NORTH, 0xffffff);
+ renderFaceZNeg(aRenderer, aX, aY, aZ, mIconContainer.getOverlayIcon(), rotation);
+ }
+ aRenderer.enableAO = enableAO;
+ draw(aRenderer);
+ }
+
+ @Override
+ public short[] getRGBA() {
+ return mRGBa;
+ }
+
+ @Override
+ public boolean isValidTexture() {
+ return mIconContainer != null;
+ }
+
+ /**
+ * Renders the given texture to the bottom face of the block. Args: block, x, y, z, texture
+ */
+ protected void renderFaceYNeg(RenderBlocks aRenderer, double x, double y, double z, IIcon icon,
+ ExtendedFacing extendedFacing) {
+
+ switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) {
+ case COUNTER_CLOCKWISE -> aRenderer.uvRotateBottom = 2;
+ case CLOCKWISE -> aRenderer.uvRotateBottom = 1;
+ case UPSIDE_DOWN -> aRenderer.uvRotateBottom = 3;
+ default -> aRenderer.uvRotateBottom = 0;
+ }
+
+ final Flip aFlip = extendedFacing.getFlip();
+ aRenderer.renderFaceYNeg(
+ Blocks.air,
+ x,
+ y,
+ z,
+ useExtFacing && GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped
+ ? new GT_IconFlipped(icon, aFlip.isHorizontallyFlipped() ^ !stdOrient, aFlip.isVerticallyFliped())
+ : new GT_IconFlipped(icon, !stdOrient, false));
+ aRenderer.uvRotateBottom = 0;
+ }
+
+ /**
+ * Renders the given texture to the top face of the block. Args: block, x, y, z, texture
+ */
+ protected void renderFaceYPos(RenderBlocks aRenderer, double x, double y, double z, IIcon icon,
+ ExtendedFacing extendedFacing) {
+
+ switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) {
+ case COUNTER_CLOCKWISE -> aRenderer.uvRotateTop = 2;
+ case CLOCKWISE -> aRenderer.uvRotateTop = 1;
+ case UPSIDE_DOWN -> aRenderer.uvRotateTop = 3;
+ default -> aRenderer.uvRotateTop = 0;
+ }
+
+ final Flip aFlip = extendedFacing.getFlip();
+ aRenderer.renderFaceYPos(
+ Blocks.air,
+ x,
+ y,
+ z,
+ useExtFacing && GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped
+ ? new GT_IconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped())
+ : icon);
+ aRenderer.uvRotateTop = 0;
+ }
+
+ /**
+ * Renders the given texture to the north (z-negative) face of the block. Args: block, x, y, z, texture
+ */
+ protected void renderFaceZNeg(RenderBlocks aRenderer, double x, double y, double z, IIcon icon,
+ ExtendedFacing extendedFacing) {
+ aRenderer.field_152631_f = true;
+ // **NOT A BUG**: aRenderer.uvRotateEast REALLY CONTROLS THE ROTATION OF THE NORTH SIDE
+ switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) {
+ case COUNTER_CLOCKWISE -> aRenderer.uvRotateEast = 2;
+ case CLOCKWISE -> aRenderer.uvRotateEast = 1;
+ case UPSIDE_DOWN -> aRenderer.uvRotateEast = 3;
+ default -> aRenderer.uvRotateEast = 0;
+ }
+
+ final Flip aFlip = extendedFacing.getFlip();
+ aRenderer.renderFaceZNeg(
+ Blocks.air,
+ x,
+ y,
+ z,
+ useExtFacing && GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped
+ ? new GT_IconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped())
+ : icon);
+ aRenderer.uvRotateEast = 0;
+ aRenderer.field_152631_f = false;
+ }
+
+ /**
+ * Renders the given texture to the south (z-positive) face of the block. Args: block, x, y, z, texture
+ */
+ protected void renderFaceZPos(RenderBlocks aRenderer, double x, double y, double z, IIcon icon,
+ ExtendedFacing extendedFacing) {
+ // **NOT A BUG**: aRenderer.uvRotateWest REALLY CONTROLS THE ROTATION OF THE SOUTH SIDE
+ switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) {
+ case COUNTER_CLOCKWISE -> aRenderer.uvRotateWest = 2;
+ case CLOCKWISE -> aRenderer.uvRotateWest = 1;
+ case UPSIDE_DOWN -> aRenderer.uvRotateWest = 3;
+ default -> aRenderer.uvRotateWest = 0;
+ }
+
+ final Flip aFlip = extendedFacing.getFlip();
+ aRenderer.renderFaceZPos(
+ Blocks.air,
+ x,
+ y,
+ z,
+ useExtFacing && GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped
+ ? new GT_IconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped())
+ : icon);
+ aRenderer.uvRotateWest = 0;
+ }
+
+ /**
+ * Renders the given texture to the west (x-negative) face of the block. Args: block, x, y, z, texture
+ */
+ protected void renderFaceXNeg(RenderBlocks aRenderer, double x, double y, double z, IIcon icon,
+ ExtendedFacing extendedFacing) {
+ // **NOT A BUG**: aRenderer.uvRotateNorth REALLY CONTROLS THE ROTATION OF THE WEST SIDE
+ switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) {
+ case COUNTER_CLOCKWISE -> aRenderer.uvRotateNorth = 2;
+ case CLOCKWISE -> aRenderer.uvRotateNorth = 1;
+ case UPSIDE_DOWN -> aRenderer.uvRotateNorth = 3;
+ default -> aRenderer.uvRotateNorth = 0;
+ }
+
+ final Flip aFlip = extendedFacing.getFlip();
+ aRenderer.renderFaceXNeg(
+ Blocks.air,
+ x,
+ y,
+ z,
+ useExtFacing && GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped
+ ? new GT_IconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped())
+ : icon);
+ aRenderer.uvRotateNorth = 0;
+ }
+
+ /**
+ * Renders the given texture to the east (x-positive) face of the block. Args: block, x, y, z, texture
+ */
+ protected void renderFaceXPos(RenderBlocks aRenderer, double x, double y, double z, IIcon icon,
+ ExtendedFacing extendedFacing) {
+ aRenderer.field_152631_f = true;
+ // **NOT A BUG**: aRenderer.uvRotateSouth REALLY CONTROLS THE ROTATION OF THE EAST SIDE
+ switch (useExtFacing ? extendedFacing.getRotation() : Rotation.NORMAL) {
+ case COUNTER_CLOCKWISE -> aRenderer.uvRotateSouth = 2;
+ case CLOCKWISE -> aRenderer.uvRotateSouth = 1;
+ case UPSIDE_DOWN -> aRenderer.uvRotateSouth = 3;
+ default -> aRenderer.uvRotateSouth = 0;
+ }
+
+ final Flip aFlip = extendedFacing.getFlip();
+ aRenderer.renderFaceXPos(
+ Blocks.air,
+ x,
+ y,
+ z,
+ useExtFacing && GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped
+ ? new GT_IconFlipped(icon, aFlip.isHorizontallyFlipped(), aFlip.isVerticallyFliped())
+ : icon);
+ aRenderer.uvRotateSouth = 0;
+ aRenderer.field_152631_f = false;
+ }
+
+ private ExtendedFacing getExtendedFacing(int x, int y, int z) {
+ if (stdOrient) return ExtendedFacing.DEFAULT;
+ final EntityPlayer player = GT_Mod.gregtechproxy.getThePlayer();
+ if (player == null) return ExtendedFacing.DEFAULT;
+ final World w = player.getEntityWorld();
+ if (w == null) return ExtendedFacing.DEFAULT;
+ final TileEntity te = w.getTileEntity(x, y, z);
+ IAlignment alignment = null;
+ if (te instanceof IGregTechTileEntity) {
+ final IMetaTileEntity meta = ((IGregTechTileEntity) te).getMetaTileEntity();
+ if (meta instanceof IAlignmentProvider) {
+ alignment = ((IAlignmentProvider) meta).getAlignment();
+ } else if (meta != null) {
+ return ExtendedFacing.of(
+ meta.getBaseMetaTileEntity()
+ .getFrontFacing());
+ }
+ } else if (te instanceof IAlignmentProvider) {
+ alignment = ((IAlignmentProvider) te).getAlignment();
+ }
+ if (alignment != null) return alignment.getExtendedFacing();
+ return ExtendedFacing.DEFAULT;
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_Renderer_Block.java b/src/main/java/gregtech/common/render/GT_Renderer_Block.java
new file mode 100644
index 0000000000..da0d68d555
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_Renderer_Block.java
@@ -0,0 +1,747 @@
+package gregtech.common.render;
+
+import static gregtech.api.enums.GT_Values.SIDE_DOWN;
+import static gregtech.api.enums.GT_Values.SIDE_EAST;
+import static gregtech.api.enums.GT_Values.SIDE_NORTH;
+import static gregtech.api.enums.GT_Values.SIDE_SOUTH;
+import static gregtech.api.enums.GT_Values.SIDE_UP;
+import static gregtech.api.enums.GT_Values.SIDE_WEST;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_DOWN;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_EAST;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_NORTH;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_SOUTH;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_UP;
+import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_WEST;
+import static gregtech.api.interfaces.metatileentity.IConnectable.HAS_FRESHFOAM;
+import static gregtech.api.interfaces.metatileentity.IConnectable.HAS_HARDENEDFOAM;
+import static gregtech.api.interfaces.metatileentity.IConnectable.NO_CONNECTION;
+import static net.minecraftforge.common.util.ForgeDirection.DOWN;
+import static net.minecraftforge.common.util.ForgeDirection.EAST;
+import static net.minecraftforge.common.util.ForgeDirection.NORTH;
+import static net.minecraftforge.common.util.ForgeDirection.SOUTH;
+import static net.minecraftforge.common.util.ForgeDirection.UP;
+import static net.minecraftforge.common.util.ForgeDirection.VALID_DIRECTIONS;
+import static net.minecraftforge.common.util.ForgeDirection.WEST;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.particle.EffectRenderer;
+import net.minecraft.client.particle.EntityDiggingFX;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.lwjgl.opengl.GL11;
+
+import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
+
+import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
+import cpw.mods.fml.client.registry.RenderingRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IAllSidedTexturedTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IPipeRenderedTileEntity;
+import gregtech.api.interfaces.tileentity.ITexturedTileEntity;
+import gregtech.api.metatileentity.MetaPipeEntity;
+import gregtech.api.objects.XSTR;
+import gregtech.common.blocks.GT_Block_Machines;
+import gregtech.common.blocks.GT_Block_Ores_Abstract;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+
+@ThreadSafeISBRH(perThread = true)
+public class GT_Renderer_Block implements ISimpleBlockRenderingHandler {
+
+ public static final float blockMin = 0.0F;
+ public static final float blockMax = 1.0F;
+ private static final float coverThickness = blockMax / 8.0F;
+ private static final float coverInnerMin = blockMin + coverThickness;
+ private static final float coverInnerMax = blockMax - coverThickness;
+
+ @Deprecated
+ public static GT_Renderer_Block INSTANCE;
+ public static int mRenderID;
+
+ public static void register() {
+ mRenderID = RenderingRegistry.getNextAvailableRenderId();
+ INSTANCE = new GT_Renderer_Block();
+ RenderingRegistry.registerBlockHandler(INSTANCE);
+ }
+
+ private final ITexture[][] textureArray = new ITexture[6][];
+
+ public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock,
+ RenderBlocks aRenderer) {
+ final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tTileEntity instanceof IPipeRenderedTileEntity pipeRenderedTileEntity) {
+ textureArray[0] = pipeRenderedTileEntity.getTextureCovered(DOWN);
+ textureArray[1] = pipeRenderedTileEntity.getTextureCovered(UP);
+ textureArray[2] = pipeRenderedTileEntity.getTextureCovered(NORTH);
+ textureArray[3] = pipeRenderedTileEntity.getTextureCovered(SOUTH);
+ textureArray[4] = pipeRenderedTileEntity.getTextureCovered(WEST);
+ textureArray[5] = pipeRenderedTileEntity.getTextureCovered(EAST);
+ return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, textureArray);
+ }
+ if (tTileEntity instanceof IAllSidedTexturedTileEntity allSidedTexturedTileEntity) {
+ ITexture[] texture = allSidedTexturedTileEntity.getTexture(aBlock);
+ textureArray[0] = texture;
+ textureArray[1] = texture;
+ textureArray[2] = texture;
+ textureArray[3] = texture;
+ textureArray[4] = texture;
+ textureArray[5] = texture;
+ return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, textureArray);
+ }
+ if (tTileEntity instanceof ITexturedTileEntity texturedTileEntity) {
+ textureArray[0] = texturedTileEntity.getTexture(aBlock, DOWN);
+ textureArray[1] = texturedTileEntity.getTexture(aBlock, UP);
+ textureArray[2] = texturedTileEntity.getTexture(aBlock, NORTH);
+ textureArray[3] = texturedTileEntity.getTexture(aBlock, SOUTH);
+ textureArray[4] = texturedTileEntity.getTexture(aBlock, WEST);
+ textureArray[5] = texturedTileEntity.getTexture(aBlock, EAST);
+ return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, textureArray);
+ }
+ return false;
+ }
+
+ public boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock,
+ RenderBlocks aRenderer, ITexture[][] aTextures) {
+ aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_DOWN], true);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_UP], true);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_NORTH], true);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_SOUTH], true);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_WEST], true);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, aTextures[SIDE_EAST], true);
+ return true;
+ }
+
+ final ITexture[][] tIcons = new ITexture[VALID_DIRECTIONS.length][];
+ final ITexture[][] tCovers = new ITexture[VALID_DIRECTIONS.length][];
+ final boolean[] tIsCovered = new boolean[VALID_DIRECTIONS.length];
+
+ public boolean renderPipeBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock,
+ IPipeRenderedTileEntity aTileEntity, RenderBlocks aRenderer) {
+ final byte aConnections = aTileEntity.getConnections();
+ if ((aConnections & (HAS_FRESHFOAM | HAS_HARDENEDFOAM)) != 0) {
+ return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer);
+ }
+ final float thickness = aTileEntity.getThickNess();
+ if (thickness >= 0.99F) {
+ return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer);
+ }
+ // Range of block occupied by pipe
+ final float pipeMin = (blockMax - thickness) / 2.0F;
+ final float pipeMax = blockMax - pipeMin;
+
+ for (int i = 0; i < VALID_DIRECTIONS.length; i++) {
+ final ForgeDirection iSide = VALID_DIRECTIONS[i];
+ tIsCovered[i] = (aTileEntity.getCoverIDAtSide(iSide) != 0);
+ tCovers[i] = aTileEntity.getTexture(aBlock, iSide);
+ tIcons[i] = aTileEntity.getTextureUncovered(iSide);
+
+ }
+
+ switch (aConnections) {
+ case NO_CONNECTION -> {
+ aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false);
+ }
+ case CONNECTED_EAST | CONNECTED_WEST -> {
+ // EAST - WEST Pipe Sides
+ aBlock.setBlockBounds(blockMin, pipeMin, pipeMin, blockMax, pipeMax, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false);
+
+ // EAST - WEST Pipe Ends
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false);
+ }
+ case CONNECTED_DOWN | CONNECTED_UP -> {
+ // UP - DOWN Pipe Sides
+ aBlock.setBlockBounds(pipeMin, blockMin, pipeMin, pipeMax, blockMax, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false);
+
+ // UP - DOWN Pipe Ends
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false);
+ }
+ case CONNECTED_NORTH | CONNECTED_SOUTH -> {
+ // NORTH - SOUTH Pipe Sides
+ aBlock.setBlockBounds(pipeMin, pipeMin, blockMin, pipeMax, pipeMax, blockMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false);
+
+ // NORTH - SOUTH Pipe Ends
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false);
+ }
+ default -> {
+ if ((aConnections & CONNECTED_WEST) == 0) {
+ aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ } else {
+ aBlock.setBlockBounds(blockMin, pipeMin, pipeMin, pipeMin, pipeMax, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false);
+ }
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false);
+ if ((aConnections & CONNECTED_EAST) == 0) {
+ aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ } else {
+ aBlock.setBlockBounds(pipeMax, pipeMin, pipeMin, blockMax, pipeMax, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false);
+ }
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false);
+ if ((aConnections & CONNECTED_DOWN) == 0) {
+ aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ } else {
+ aBlock.setBlockBounds(pipeMin, blockMin, pipeMin, pipeMax, pipeMin, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false);
+ }
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false);
+ if ((aConnections & CONNECTED_UP) == 0) {
+ aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ } else {
+ aBlock.setBlockBounds(pipeMin, pipeMax, pipeMin, pipeMax, blockMax, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false);
+ }
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false);
+ if ((aConnections & CONNECTED_NORTH) == 0) {
+ aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ } else {
+ aBlock.setBlockBounds(pipeMin, pipeMin, blockMin, pipeMax, pipeMax, pipeMin);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false);
+ }
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_NORTH], false);
+ if ((aConnections & CONNECTED_SOUTH) == 0) {
+ aBlock.setBlockBounds(pipeMin, pipeMin, pipeMin, pipeMax, pipeMax, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ } else {
+ aBlock.setBlockBounds(pipeMin, pipeMin, pipeMax, pipeMax, pipeMax, blockMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_DOWN], false);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_UP], false);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_WEST], false);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_EAST], false);
+ }
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tIcons[SIDE_SOUTH], false);
+ }
+ }
+
+ // Render covers on pipes
+ if (tIsCovered[SIDE_DOWN]) {
+ aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, coverInnerMin, blockMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!tIsCovered[SIDE_NORTH]) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false);
+ }
+ if (!tIsCovered[SIDE_SOUTH]) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false);
+ }
+ if (!tIsCovered[SIDE_WEST]) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false);
+ }
+ if (!tIsCovered[SIDE_EAST]) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false);
+ }
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false);
+ if ((aConnections & CONNECTED_DOWN) != 0) {
+ // Split outer face to leave hole for pipe
+ // Lower panel
+ aRenderer.setRenderBounds(blockMin, blockMin, blockMin, blockMax, blockMin, pipeMin);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false);
+ // Upper panel
+ aRenderer.setRenderBounds(blockMin, blockMin, pipeMax, blockMax, blockMin, blockMax);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false);
+ // Middle left panel
+ aRenderer.setRenderBounds(blockMin, blockMin, pipeMin, pipeMin, blockMin, pipeMax);
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false);
+ // Middle right panel
+ aRenderer.setRenderBounds(pipeMax, blockMin, pipeMin, blockMax, blockMin, pipeMax);
+ }
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_DOWN], false);
+ }
+
+ if (tIsCovered[SIDE_UP]) {
+ aBlock.setBlockBounds(blockMin, coverInnerMax, blockMin, blockMax, blockMax, blockMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!tIsCovered[SIDE_NORTH]) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false);
+ }
+ if (!tIsCovered[SIDE_SOUTH]) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false);
+ }
+ if (!tIsCovered[SIDE_WEST]) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false);
+ }
+ if (!tIsCovered[SIDE_EAST]) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false);
+ }
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false);
+ if ((aConnections & CONNECTED_UP) != 0) {
+ // Split outer face to leave hole for pipe
+ // Lower panel
+ aRenderer.setRenderBounds(blockMin, blockMax, blockMin, blockMax, blockMax, pipeMin);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false);
+ // Upper panel
+ aRenderer.setRenderBounds(blockMin, blockMax, pipeMax, blockMax, blockMax, blockMax);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false);
+ // Middle left panel
+ aRenderer.setRenderBounds(blockMin, blockMax, pipeMin, pipeMin, blockMax, pipeMax);
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false);
+ // Middle right panel
+ aRenderer.setRenderBounds(pipeMax, blockMax, pipeMin, blockMax, blockMax, pipeMax);
+ }
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_UP], false);
+ }
+
+ if (tIsCovered[SIDE_NORTH]) {
+ aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, coverInnerMin);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!tIsCovered[SIDE_DOWN]) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false);
+ }
+ if (!tIsCovered[SIDE_UP]) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false);
+ }
+ if (!tIsCovered[SIDE_WEST]) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false);
+ }
+ if (!tIsCovered[SIDE_EAST]) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false);
+ }
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false);
+ if ((aConnections & CONNECTED_NORTH) != 0) {
+ // Split outer face to leave hole for pipe
+ // Lower panel
+ aRenderer.setRenderBounds(blockMin, blockMin, blockMin, blockMax, pipeMin, blockMin);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false);
+ // Upper panel
+ aRenderer.setRenderBounds(blockMin, pipeMax, blockMin, blockMax, blockMax, blockMin);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false);
+ // Middle left panel
+ aRenderer.setRenderBounds(blockMin, pipeMin, blockMin, pipeMin, pipeMax, blockMin);
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false);
+ // Middle right panel
+ aRenderer.setRenderBounds(pipeMax, pipeMin, blockMin, blockMax, pipeMax, blockMin);
+ }
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_NORTH], false);
+ }
+
+ if (tIsCovered[SIDE_SOUTH]) {
+ aBlock.setBlockBounds(blockMin, blockMin, coverInnerMax, blockMax, blockMax, blockMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!tIsCovered[SIDE_DOWN]) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false);
+ }
+ if (!tIsCovered[SIDE_UP]) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false);
+ }
+ if (!tIsCovered[SIDE_WEST]) {
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false);
+ }
+ if (!tIsCovered[SIDE_EAST]) {
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false);
+ }
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false);
+ if ((aConnections & CONNECTED_SOUTH) != 0) {
+ // Split outer face to leave hole for pipe
+ // Lower panel
+ aRenderer.setRenderBounds(blockMin, blockMin, blockMax, blockMax, pipeMin, blockMax);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false);
+ // Upper panel
+ aRenderer.setRenderBounds(blockMin, pipeMax, blockMax, blockMax, blockMax, blockMax);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false);
+ // Middle left panel
+ aRenderer.setRenderBounds(blockMin, pipeMin, blockMax, pipeMin, pipeMax, blockMax);
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false);
+ // Middle right panel
+ aRenderer.setRenderBounds(pipeMax, pipeMin, blockMax, blockMax, pipeMax, blockMax);
+ }
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_SOUTH], false);
+ }
+
+ if (tIsCovered[SIDE_WEST]) {
+ aBlock.setBlockBounds(blockMin, blockMin, blockMin, coverInnerMin, blockMax, blockMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!tIsCovered[SIDE_DOWN]) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false);
+ }
+ if (!tIsCovered[SIDE_UP]) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false);
+ }
+ if (!tIsCovered[SIDE_NORTH]) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false);
+ }
+ if (!tIsCovered[SIDE_SOUTH]) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false);
+ }
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false);
+ if ((aConnections & CONNECTED_WEST) != 0) {
+ // Split outer face to leave hole for pipe
+ // Lower panel
+ aRenderer.setRenderBounds(blockMin, blockMin, blockMin, blockMin, pipeMin, blockMax);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false);
+ // Upper panel
+ aRenderer.setRenderBounds(blockMin, pipeMax, blockMin, blockMin, blockMax, blockMax);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false);
+ // Middle left panel
+ aRenderer.setRenderBounds(blockMin, pipeMin, blockMin, blockMin, pipeMax, pipeMin);
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false);
+ // Middle right panel
+ aRenderer.setRenderBounds(blockMin, pipeMin, pipeMax, blockMin, pipeMax, blockMax);
+ }
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_WEST], false);
+ }
+
+ if (tIsCovered[SIDE_EAST]) {
+ aBlock.setBlockBounds(coverInnerMax, blockMin, blockMin, blockMax, blockMax, blockMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ if (!tIsCovered[SIDE_DOWN]) {
+ renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false);
+ }
+ if (!tIsCovered[SIDE_UP]) {
+ renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false);
+ }
+ if (!tIsCovered[SIDE_NORTH]) {
+ renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false);
+ }
+ if (!tIsCovered[SIDE_SOUTH]) {
+ renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false);
+ }
+ renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false);
+
+ if ((aConnections & CONNECTED_EAST) != 0) {
+ // Split outer face to leave hole for pipe
+ // Lower panel
+ aRenderer.setRenderBounds(blockMax, blockMin, blockMin, blockMax, pipeMin, blockMax);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false);
+ // Upper panel
+ aRenderer.setRenderBounds(blockMax, pipeMax, blockMin, blockMax, blockMax, blockMax);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false);
+ // Middle left panel
+ aRenderer.setRenderBounds(blockMax, pipeMin, blockMin, blockMax, pipeMax, pipeMin);
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false);
+ // Middle right panel
+ aRenderer.setRenderBounds(blockMax, pipeMin, pipeMax, blockMax, pipeMax, blockMax);
+ }
+ renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tCovers[SIDE_EAST], false);
+ }
+ aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+
+ return true;
+ }
+
+ @SideOnly(Side.CLIENT)
+ public static void addHitEffects(EffectRenderer effectRenderer, Block block, World world, int x, int y, int z,
+ int ordinalSide) {
+ double rX = x + XSTR.XSTR_INSTANCE.nextDouble() * 0.8 + 0.1;
+ double rY = y + XSTR.XSTR_INSTANCE.nextDouble() * 0.8 + 0.1;
+ double rZ = z + XSTR.XSTR_INSTANCE.nextDouble() * 0.8 + 0.1;
+ if (ordinalSide == 0) {
+ rY = y - 0.1;
+ } else if (ordinalSide == 1) {
+ rY = y + 1.1;
+ } else if (ordinalSide == 2) {
+ rZ = z - 0.1;
+ } else if (ordinalSide == 3) {
+ rZ = z + 1.1;
+ } else if (ordinalSide == 4) {
+ rX = x - 0.1;
+ } else if (ordinalSide == 5) {
+ rX = x + 1.1;
+ }
+ effectRenderer.addEffect(
+ (new EntityDiggingFX(
+ world,
+ rX,
+ rY,
+ rZ,
+ 0.0,
+ 0.0,
+ 0.0,
+ block,
+ block.getDamageValue(world, x, y, z),
+ ordinalSide)).applyColourMultiplier(x, y, z)
+ .multiplyVelocity(0.2F)
+ .multipleParticleScaleBy(0.6F));
+ }
+
+ @SideOnly(Side.CLIENT)
+ public static void addDestroyEffects(EffectRenderer effectRenderer, Block block, World world, int x, int y, int z) {
+ for (int iX = 0; iX < 4; ++iX) {
+ for (int iY = 0; iY < 4; ++iY) {
+ for (int iZ = 0; iZ < 4; ++iZ) {
+ final double bX = x + (iX + 0.5) / 4.0;
+ final double bY = y + (iY + 0.5) / 4.0;
+ final double bZ = z + (iZ + 0.5) / 4.0;
+ effectRenderer.addEffect(
+ (new EntityDiggingFX(
+ world,
+ bX,
+ bY,
+ bZ,
+ bX - x - 0.5,
+ bY - y - 0.5,
+ bZ - z - 0.5,
+ block,
+ block.getDamageValue(world, x, y, z))).applyColourMultiplier(x, y, z));
+ }
+ }
+ }
+ }
+
+ final GT_TileEntity_Ores tTileEntity = new GT_TileEntity_Ores();
+
+ @Override
+ public void renderInventoryBlock(Block aBlock, int aMeta, int aModelID, RenderBlocks aRenderer) {
+ aRenderer.enableAO = false;
+ aRenderer.useInventoryTint = true;
+
+ GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ if (aBlock instanceof GT_Block_Ores_Abstract) {
+ tTileEntity.mMetaData = ((short) aMeta);
+
+ aBlock.setBlockBoundsForItemRender();
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ // spotless:off
+ ITexture[] texture = tTileEntity.getTexture(aBlock);
+ renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true);
+ renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true);
+ renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true);
+ renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true);
+ renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true);
+ renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true);
+ // spotless:on
+ } else if (aMeta > 0 && (aMeta < GregTech_API.METATILEENTITIES.length)
+ && aBlock instanceof GT_Block_Machines
+ && (GregTech_API.METATILEENTITIES[aMeta] != null)
+ && (!GregTech_API.METATILEENTITIES[aMeta].renderInInventory(aBlock, aMeta, aRenderer))) {
+ renderNormalInventoryMetaTileEntity(aBlock, aMeta, aRenderer);
+ }
+ aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax);
+
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ aRenderer.useInventoryTint = false;
+ }
+
+ private static void renderNormalInventoryMetaTileEntity(Block aBlock, int aMeta, RenderBlocks aRenderer) {
+ if ((aMeta <= 0) || (aMeta >= GregTech_API.METATILEENTITIES.length)) {
+ return;
+ }
+ final IMetaTileEntity tMetaTileEntity = GregTech_API.METATILEENTITIES[aMeta];
+ if (tMetaTileEntity == null) {
+ return;
+ }
+ aBlock.setBlockBoundsForItemRender();
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+
+ final IGregTechTileEntity iGregTechTileEntity = tMetaTileEntity.getBaseMetaTileEntity();
+
+ // spotless:off
+ if ((iGregTechTileEntity instanceof IPipeRenderedTileEntity renderedPipe)
+ && (tMetaTileEntity instanceof MetaPipeEntity pipeEntity)) {
+ final float tThickness = renderedPipe.getThickNess();
+ final float pipeMin = (blockMax - tThickness) / 2.0F;
+ final float pipeMax = blockMax - pipeMin;
+
+ aBlock.setBlockBounds(blockMin, pipeMin, pipeMin, blockMax, pipeMax, pipeMax);
+ aRenderer.setRenderBoundsFromBlock(aBlock);
+ renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, DOWN, (CONNECTED_WEST | CONNECTED_EAST), -1, false, false), true);
+ renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, UP, (CONNECTED_WEST | CONNECTED_EAST), -1, false, false), true);
+ renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, NORTH, (CONNECTED_WEST | CONNECTED_EAST), -1, false, false), true);
+ renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, SOUTH, (CONNECTED_WEST | CONNECTED_EAST), -1, false, false), true);
+ renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, WEST, (CONNECTED_WEST | CONNECTED_EAST), -1, true, false), true);
+ renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, pipeEntity.getTexture(iGregTechTileEntity, EAST, (CONNECTED_WEST | CONNECTED_EAST), -1, true, false), true);
+ } else {
+ renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, DOWN, WEST, -1, true, false), true);
+ renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, UP, WEST, -1, true, false), true);
+ renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, NORTH, WEST, -1, true, false), true);
+ renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, SOUTH, WEST, -1, true, false), true);
+ renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, WEST, WEST, -1, true, false), true);
+ renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, tMetaTileEntity.getTexture(iGregTechTileEntity, EAST, WEST, -1, true, false), true);
+ }
+ // spotless:on
+ }
+
+ public static void renderNegativeYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY - 1, aZ, 0))) return;
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY - 1 : aY, aZ));
+ }
+ if (aIcon == null) return;
+ for (final ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderYNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ public static void renderPositiveYFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY + 1, aZ, 1))) return;
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aFullBlock ? aY + 1 : aY, aZ));
+ }
+ if (aIcon == null) return;
+ for (final ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderYPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ public static void renderNegativeZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ - 1, 2))) return;
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ - 1 : aZ));
+ }
+ if (aIcon == null) return;
+ for (final ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderZNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ public static void renderPositiveZFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX, aY, aZ + 1, 3))) return;
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aX, aY, aFullBlock ? aZ + 1 : aZ));
+ }
+ if (aIcon == null) return;
+ for (final ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderZPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ public static void renderNegativeXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX - 1, aY, aZ, 4))) return;
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX - 1 : aX, aY, aZ));
+ }
+ if (aIcon == null) return;
+ for (final ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderXNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ public static void renderPositiveXFacing(IBlockAccess aWorld, RenderBlocks aRenderer, Block aBlock, int aX, int aY,
+ int aZ, ITexture[] aIcon, boolean aFullBlock) {
+ if (aWorld != null) {
+ if ((aFullBlock) && (!aBlock.shouldSideBeRendered(aWorld, aX + 1, aY, aZ, 5))) return;
+ Tessellator.instance
+ .setBrightness(aBlock.getMixedBrightnessForBlock(aWorld, aFullBlock ? aX + 1 : aX, aY, aZ));
+ }
+ if (aIcon == null) return;
+ for (final ITexture iTexture : aIcon) {
+ if (iTexture != null) {
+ iTexture.renderXPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+ }
+ }
+
+ @Override
+ public boolean renderWorldBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, int aModelID,
+ RenderBlocks aRenderer) {
+ aRenderer.enableAO = Minecraft.isAmbientOcclusionEnabled() && GT_Mod.gregtechproxy.mRenderTileAmbientOcclusion;
+ aRenderer.useInventoryTint = false;
+
+ final TileEntity tileEntity = aWorld.getTileEntity(aX, aY, aZ);
+ if (tileEntity == null) return false;
+ if (tileEntity instanceof IGregTechTileEntity) {
+ final IMetaTileEntity metaTileEntity;
+ if ((metaTileEntity = ((IGregTechTileEntity) tileEntity).getMetaTileEntity()) != null
+ && metaTileEntity.renderInWorld(aWorld, aX, aY, aZ, aBlock, aRenderer)) {
+ aRenderer.enableAO = false;
+ return true;
+ }
+ }
+ if (tileEntity instanceof IPipeRenderedTileEntity
+ && renderPipeBlock(aWorld, aX, aY, aZ, aBlock, (IPipeRenderedTileEntity) tileEntity, aRenderer)) {
+ aRenderer.enableAO = false;
+ return true;
+ }
+ if (renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer)) {
+ aRenderer.enableAO = false;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean shouldRender3DInInventory(int aModel) {
+ return true;
+ }
+
+ @Override
+ public int getRenderId() {
+ return this.mRenderID;
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_Renderer_Entity_Arrow.java b/src/main/java/gregtech/common/render/GT_Renderer_Entity_Arrow.java
new file mode 100644
index 0000000000..e72a79514e
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_Renderer_Entity_Arrow.java
@@ -0,0 +1,23 @@
+package gregtech.common.render;
+
+import net.minecraft.client.renderer.entity.RenderArrow;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.util.ResourceLocation;
+
+import cpw.mods.fml.client.registry.RenderingRegistry;
+
+public class GT_Renderer_Entity_Arrow extends RenderArrow {
+
+ private final ResourceLocation mTexture;
+
+ public GT_Renderer_Entity_Arrow(Class<? extends EntityArrow> aArrowClass, String aTextureName) {
+ this.mTexture = new ResourceLocation("gregtech:textures/entity/" + aTextureName + ".png");
+ RenderingRegistry.registerEntityRenderingHandler(aArrowClass, this);
+ }
+
+ @Override
+ protected ResourceLocation getEntityTexture(Entity p_110775_1_) {
+ return this.mTexture;
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_SidedTexture.java b/src/main/java/gregtech/common/render/GT_SidedTexture.java
new file mode 100644
index 0000000000..7a851fd1e7
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_SidedTexture.java
@@ -0,0 +1,78 @@
+package gregtech.common.render;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+
+import gregtech.api.interfaces.IColorModulationContainer;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.render.TextureFactory;
+
+public class GT_SidedTexture extends GT_TextureBase implements ITexture, IColorModulationContainer {
+
+ protected final ITexture[] mTextures;
+ /**
+ * DO NOT MANIPULATE THE VALUES INSIDE THIS ARRAY!!!
+ * <p/>
+ * Just set this variable to another different Array instead. Otherwise some colored things will get Problems.
+ */
+ private final short[] mRGBa;
+
+ protected GT_SidedTexture(IIconContainer aIcon0, IIconContainer aIcon1, IIconContainer aIcon2,
+ IIconContainer aIcon3, IIconContainer aIcon4, IIconContainer aIcon5, short[] aRGBa, boolean aAllowAlpha) {
+ if (aRGBa.length != 4) throw new IllegalArgumentException("RGBa doesn't have 4 Values @ GT_RenderedTexture");
+ mTextures = new ITexture[] { TextureFactory.of(aIcon0, aRGBa, aAllowAlpha),
+ TextureFactory.of(aIcon1, aRGBa, aAllowAlpha), TextureFactory.of(aIcon2, aRGBa, aAllowAlpha),
+ TextureFactory.of(aIcon3, aRGBa, aAllowAlpha), TextureFactory.of(aIcon4, aRGBa, aAllowAlpha),
+ TextureFactory.of(aIcon5, aRGBa, aAllowAlpha) };
+ mRGBa = aRGBa;
+ }
+
+ @Override
+ public boolean isOldTexture() {
+ return false;
+ }
+
+ @Override
+ public void renderXPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ mTextures[5].renderXPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+
+ @Override
+ public void renderXNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ mTextures[4].renderXNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+
+ @Override
+ public void renderYPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ mTextures[1].renderYPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+
+ @Override
+ public void renderYNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ mTextures[0].renderYNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+
+ @Override
+ public void renderZPos(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ mTextures[3].renderZPos(aRenderer, aBlock, aX, aY, aZ);
+ }
+
+ @Override
+ public void renderZNeg(RenderBlocks aRenderer, Block aBlock, int aX, int aY, int aZ) {
+ mTextures[2].renderZNeg(aRenderer, aBlock, aX, aY, aZ);
+ }
+
+ @Override
+ public short[] getRGBA() {
+ return mRGBa;
+ }
+
+ @Override
+ public boolean isValidTexture() {
+ for (ITexture renderedTexture : mTextures) {
+ if (!renderedTexture.isValidTexture()) return false;
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_TextureBase.java b/src/main/java/gregtech/common/render/GT_TextureBase.java
new file mode 100644
index 0000000000..20188e2e01
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_TextureBase.java
@@ -0,0 +1,31 @@
+package gregtech.common.render;
+
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.util.GT_UtilityClient;
+
+public abstract class GT_TextureBase implements ITexture {
+
+ protected boolean isDrawing = false;
+
+ @Override
+ public void startDrawingQuads(RenderBlocks aRenderer, float aNormalX, float aNormalY, float aNormalZ) {
+ if (aRenderer.useInventoryTint && (!isOldTexture() || !GT_UtilityClient.isDrawing(Tessellator.instance))) {
+ // Draw if we're not an old texture OR we are an old texture AND we're not already drawing
+ isDrawing = true;
+ Tessellator.instance.startDrawingQuads();
+ Tessellator.instance.setNormal(aNormalX, aNormalY, aNormalZ);
+ }
+ }
+
+ @Override
+ public void draw(RenderBlocks aRenderer) {
+ if (aRenderer.useInventoryTint && (!isOldTexture() || isDrawing)) {
+ // Draw if we're not an old texture OR we initiated the drawing
+ isDrawing = false;
+ Tessellator.instance.draw();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/render/GT_TextureBuilder.java b/src/main/java/gregtech/common/render/GT_TextureBuilder.java
new file mode 100644
index 0000000000..af8a590fc1
--- /dev/null
+++ b/src/main/java/gregtech/common/render/GT_TextureBuilder.java
@@ -0,0 +1,151 @@
+package gregtech.common.render;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.ITextureBuilder;
+
+@SuppressWarnings({ "unused", "ClassWithTooManyFields" })
+public class GT_TextureBuilder implements ITextureBuilder {
+
+ private final List<IIconContainer> iconContainerList;
+ private final List<ITexture> textureLayers;
+ private Block fromBlock;
+ private int fromMeta;
+ private ForgeDirection fromSide;
+ private short[] rgba;
+ private boolean allowAlpha;
+ private boolean stdOrient;
+ private boolean extFacing;
+ private boolean glow;
+ private Boolean worldCoord = null;
+
+ public GT_TextureBuilder() {
+ textureLayers = new ArrayList<>();
+ iconContainerList = new ArrayList<>();
+ rgba = Dyes._NULL.mRGBa;
+ allowAlpha = true;
+ stdOrient = false;
+ glow = false;
+ }
+
+ @Override
+ public ITextureBuilder setFromBlock(final Block block, final int meta) {
+ this.fromBlock = block;
+ this.fromMeta = meta;
+ this.fromSide = ForgeDirection.UNKNOWN;
+ return this;
+ }
+
+ @Override
+ public ITextureBuilder setFromSide(final ForgeDirection side) {
+ this.fromSide = side;
+ return this;
+ }
+
+ @Override
+ public ITextureBuilder addIcon(final IIconContainer... iconContainers) {
+ this.iconContainerList.addAll(Arrays.asList(iconContainers));
+ return this;
+ }
+
+ @Override
+ public ITextureBuilder setRGBA(final short[] rgba) {
+ this.rgba = rgba;
+ return this;
+ }
+
+ @Override
+ public ITextureBuilder addLayer(final ITexture... iTextures) {
+ this.textureLayers.addAll(Arrays.asList(iTextures));
+ return this;
+ }
+
+ @Override
+ public ITextureBuilder setAllowAlpha(final boolean allowAlpha) {
+ this.allowAlpha = allowAlpha;
+ return this;
+ }
+
+ @Override
+ public ITextureBuilder stdOrient() {
+ this.stdOrient = true;
+ return this;
+ }
+
+ @Override
+ public ITextureBuilder useWorldCoord() {
+ this.worldCoord = true;
+ return this;
+ }
+
+ @Override
+ public ITextureBuilder noWorldCoord() {
+ this.worldCoord = false;
+ return this;
+ }
+
+ @Override
+ public ITextureBuilder extFacing() {
+ this.extFacing = true;
+ return this;
+ }
+
+ @Override
+ public ITextureBuilder glow() {
+ glow = true;
+ return this;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public ITexture build() {
+ if (fromBlock != null) {
+ if (worldCoord == Boolean.TRUE || worldCoord == null && isCTMBlock(fromBlock, fromMeta))
+ return new GT_CopiedCTMBlockTexture(fromBlock, fromSide.ordinal(), fromMeta, rgba, allowAlpha);
+ else return new GT_CopiedBlockTexture(fromBlock, fromSide.ordinal(), fromMeta, rgba, allowAlpha);
+ }
+ if (worldCoord != null) throw new IllegalStateException("worldCoord without from block");
+ if (!textureLayers.isEmpty()) return new GT_MultiTexture(textureLayers.toArray(new ITexture[0]));
+ return switch (iconContainerList.size()) {
+ case 1 -> new GT_RenderedTexture(iconContainerList.get(0), rgba, allowAlpha, glow, stdOrient, extFacing);
+ case 6 -> new GT_SidedTexture(
+ iconContainerList.get(ForgeDirection.DOWN.ordinal()),
+ iconContainerList.get(ForgeDirection.UP.ordinal()),
+ iconContainerList.get(ForgeDirection.NORTH.ordinal()),
+ iconContainerList.get(ForgeDirection.SOUTH.ordinal()),
+ iconContainerList.get(ForgeDirection.WEST.ordinal()),
+ iconContainerList.get(ForgeDirection.EAST.ordinal()),
+ rgba,
+ allowAlpha);
+ default -> throw new IllegalStateException("Invalid sideIconContainer count");
+ };
+ }
+
+ private boolean isCTMBlock(Block fromBlock, int fromMeta) {
+ return GT_Mod.gregtechproxy.mCTMBlockCache
+ .computeIfAbsent(fromBlock, (byte) fromMeta, GT_TextureBuilder::apply);
+ }
+
+ private static Boolean apply(Block b, Byte m) {
+ Class<?> clazz = b.getClass();
+ while (clazz != Block.class) {
+ final String className = clazz.getName();
+ if (GT_Values.mCTMDisabledBlock.contains(className)) return false;
+ if (GT_Values.mCTMEnabledBlock.contains(className)) return true;
+ clazz = clazz.getSuperclass();
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/common/render/IRenderedBlock.java b/src/main/java/gregtech/common/render/IRenderedBlock.java
new file mode 100644
index 0000000000..16268de750
--- /dev/null
+++ b/src/main/java/gregtech/common/render/IRenderedBlock.java
@@ -0,0 +1,114 @@
+package gregtech.common.render;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+
+public interface IRenderedBlock {
+
+ /** @return the Textures to be rendered */
+ @SideOnly(Side.CLIENT)
+ ITexture[] getTexture(Block aBlock, ForgeDirection side, int aRenderPass, boolean[] aShouldSideBeRendered);
+
+ @SideOnly(Side.CLIENT)
+ ITexture[] getTexture(Block aBlock, ForgeDirection side, boolean isActive, int aRenderPass);
+
+ /** gets the Amount of Render Passes for this TileEntity or similar Handler. Only gets called once per Rendering. */
+ @SideOnly(Side.CLIENT)
+ int getRenderPasses(Block aBlock);
+
+ /** if this uses said Render Pass or if it can be skipped entirely. */
+ @SideOnly(Side.CLIENT)
+ boolean usesRenderPass(int aRenderPass);
+
+ /** sets the Block Size rendered; return false for letting it select the normal Block Bounds. */
+ @SideOnly(Side.CLIENT)
+ boolean setBlockBounds(Block aBlock, int aRenderPass);
+
+ /** returning true stops all the other Rendering from happening. */
+ @SideOnly(Side.CLIENT)
+ default boolean renderItem(Block aBlock, RenderBlocks aRenderer) {
+ return false;
+ }
+
+ /** returning true stops all the other Rendering from happening. */
+ @SideOnly(Side.CLIENT)
+ default boolean renderBlock(Block aBlock, RenderBlocks aRenderer, IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return false;
+ }
+
+ /** if this Block lets the TileEntity or a similar Handler do all the Inventory Render work. */
+ @SideOnly(Side.CLIENT)
+ IRenderedBlock passRenderingToObject(ItemStack aStack);
+
+ /** if this Block lets the TileEntity or a similar Handler do all the World Render work. */
+ @SideOnly(Side.CLIENT)
+ IRenderedBlock passRenderingToObject(IBlockAccess aWorld, int aX, int aY, int aZ);
+
+ class ErrorRenderer implements IRenderedBlockSideCheck, IRenderedBlock {
+
+ public static final ErrorRenderer INSTANCE = new ErrorRenderer();
+ public ITexture[] mErrorTexture = Textures.BlockIcons.ERROR_RENDERING;
+
+ @Override
+ public ITexture[] getTexture(Block aBlock, ForgeDirection side, int aRenderPass,
+ boolean[] aShouldSideBeRendered) {
+ return mErrorTexture;
+ }
+
+ @Override
+ public ITexture[] getTexture(Block aBlock, ForgeDirection side, boolean isActive, int aRenderPass) {
+ return mErrorTexture;
+ }
+
+ @Override
+ public int getRenderPasses(Block aBlock) {
+ return 1;
+ }
+
+ @Override
+ public boolean usesRenderPass(int aRenderPass) {
+ return true;
+ }
+
+ @Override
+ public boolean setBlockBounds(Block aBlock, int aRenderPass) {
+ aBlock.setBlockBounds(-0.25F, -0.25F, -0.25F, 1.25F, 1.25F, 1.25F);
+ return true;
+ }
+
+ @Override
+ public boolean renderFullBlockSide(Block aBlock, RenderBlocks aRenderer, ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public IRenderedBlock passRenderingToObject(ItemStack aStack) {
+ return this;
+ }
+
+ @Override
+ public IRenderedBlock passRenderingToObject(IBlockAccess aWorld, int aX, int aY, int aZ) {
+ return this;
+ }
+
+ @Override
+ public boolean renderBlock(Block aBlock, RenderBlocks aRenderer, IBlockAccess aWorld, int aX, int aY, int aZ) {
+ aBlock.setBlockBounds(-0.25F, -0.25F, -0.25F, 1.25F, 1.25F, 1.25F);
+ GT_Renderer_Block.renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false);
+ GT_Renderer_Block.renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false);
+ GT_Renderer_Block.renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false);
+ GT_Renderer_Block.renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false);
+ GT_Renderer_Block.renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false);
+ GT_Renderer_Block.renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, mErrorTexture, false);
+ return true;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/render/IRenderedBlockSideCheck.java b/src/main/java/gregtech/common/render/IRenderedBlockSideCheck.java
new file mode 100644
index 0000000000..8feb69b2f5
--- /dev/null
+++ b/src/main/java/gregtech/common/render/IRenderedBlockSideCheck.java
@@ -0,0 +1,15 @@
+package gregtech.common.render;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public interface IRenderedBlockSideCheck {
+
+ /** returning false stops all the other Rendering from happening on that Side. */
+ @SideOnly(Side.CLIENT)
+ boolean renderFullBlockSide(Block aBlock, RenderBlocks aRenderer, ForgeDirection side);
+}
diff --git a/src/main/java/gregtech/common/render/MultiTileBasicRender.java b/src/main/java/gregtech/common/render/MultiTileBasicRender.java
new file mode 100644
index 0000000000..be41739401
--- /dev/null
+++ b/src/main/java/gregtech/common/render/MultiTileBasicRender.java
@@ -0,0 +1,10 @@
+package gregtech.common.render;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+
+public interface MultiTileBasicRender {
+
+ ITexture getTexture(ForgeDirection side);
+}
diff --git a/src/main/java/gregtech/common/render/items/CosmicNeutroniumRenderer.java b/src/main/java/gregtech/common/render/items/CosmicNeutroniumRenderer.java
new file mode 100644
index 0000000000..acb830de58
--- /dev/null
+++ b/src/main/java/gregtech/common/render/items/CosmicNeutroniumRenderer.java
@@ -0,0 +1,109 @@
+package gregtech.common.render.items;
+
+import static gregtech.common.render.GT_RenderUtil.colorGTItem;
+
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.entity.RenderItem;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.IItemRenderer;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+
+import gregtech.api.enums.Textures;
+import gregtech.common.render.GT_RenderUtil;
+
+public class CosmicNeutroniumRenderer extends GT_GeneratedMaterial_Renderer {
+
+ // spotless:off
+ private static final Pos2d point0 = new Pos2d(0 - 10, 0 - 10);
+ private static final Pos2d point1 = new Pos2d(17 + 10, 0 - 10);
+ private static final Pos2d point2 = new Pos2d(17 + 10, 17 + 10);
+ private static final Pos2d point3 = new Pos2d(0 - 10, 17 + 10);
+ // spotless:on
+
+ // TODO: Render halo outside of inventory.
+ private void drawHalo(ItemRenderType type) {
+ // Because when this class is instantiated, making this a static field will cause it to set to null.
+ final IIcon haloFuzzy = Textures.ItemIcons.HALO_FUZZY.getIcon();
+
+ if (haloFuzzy == null) {
+ return;
+ }
+
+ markNeedsAnimationUpdate(haloFuzzy);
+ GL11.glPushMatrix();
+
+ // Ideally this magic haloColour number should scale depending on the # of transparent pixels,
+ // but I'm not sure how to determine this with OpenGL.
+ // This is from Avaritia code, but modified to untangle the interfaces.
+ int haloColour = 0x4DFFFFFF;
+ float ca = (float) (haloColour >> 24 & 255) / 255.0F;
+ float cr = (float) (0x99FFFFFF >> 16 & 255) / 255.0F;
+ float cg = (float) (0x99FFFFFF >> 8 & 255) / 255.0F;
+ float cb = (float) (0x99FFFFFF & 255) / 255.0F;
+ GL11.glColor4f(cr, cg, cb, ca);
+
+ // spotless:off
+ // For those following in my footsteps, this may be of use - Colen 25th dec 2022.
+ // http://greyminecraftcoder.blogspot.com/2013/08/the-tessellator.html
+
+ Tessellator t = Tessellator.instance;
+
+ if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) {
+ t.startDrawingQuads();
+ t.addVertexWithUV(point0.x, point0.y, 0, haloFuzzy.getMinU(), haloFuzzy.getMinV());
+ t.addVertexWithUV(point3.x, point3.y, 0, haloFuzzy.getMinU(), haloFuzzy.getMaxV());
+ t.addVertexWithUV(point2.x, point2.y, 0, haloFuzzy.getMaxU(), haloFuzzy.getMaxV());
+ t.addVertexWithUV(point1.x, point1.y, 0, haloFuzzy.getMaxU(), haloFuzzy.getMinV());
+ t.draw();
+ }
+
+ GL11.glPopMatrix();
+ }
+
+ @Override
+ protected void renderRegularItem(ItemRenderType type, ItemStack item, IIcon icon, boolean shouldModulateColor, int pass, Object... data) {
+ RenderItem r = RenderItem.getInstance();
+
+ GL11.glPushMatrix();
+
+ if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) {
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ }
+
+ if (pass == 0) {
+ drawHalo(type);
+ }
+
+ //spotless:on
+ {
+ // Draw actual cosmic Nt item.
+ GL11.glPushMatrix();
+
+ colorGTItem(item);
+
+ if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) {
+ GT_RenderUtil.renderItemIcon(icon, 16.0D, 0.001D, 0.0F, 0.0F, -1.0F);
+ } else {
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ GT_RenderUtil.renderItem(type, icon);
+ }
+ GL11.glPopMatrix();
+ }
+
+ // GL11.glEnable(GL11.GL_ALPHA_TEST);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+
+ r.renderWithColor = true;
+
+ GL11.glPopMatrix();
+ }
+}
diff --git a/src/main/java/gregtech/common/render/items/GT_DataStick_Renderer.java b/src/main/java/gregtech/common/render/items/GT_DataStick_Renderer.java
new file mode 100644
index 0000000000..668b1daa6c
--- /dev/null
+++ b/src/main/java/gregtech/common/render/items/GT_DataStick_Renderer.java
@@ -0,0 +1,42 @@
+package gregtech.common.render.items;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.RenderHelper;
+import net.minecraft.client.renderer.entity.RenderItem;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.client.IItemRenderer;
+
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.opengl.GL11;
+
+import gregtech.api.util.GT_AssemblyLineUtils;
+
+// borrow form ae2
+
+public class GT_DataStick_Renderer implements IItemRenderer {
+
+ private final RenderItem ri = new RenderItem();
+
+ @Override
+ public boolean handleRenderType(ItemStack item, ItemRenderType type) {
+ final boolean isShiftHeld = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT);
+ return type == ItemRenderType.INVENTORY && isShiftHeld;
+ }
+
+ @Override
+ public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
+ return false;
+ }
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
+ final ItemStack is = GT_AssemblyLineUtils.getDataStickOutput(item);
+ final Minecraft mc = Minecraft.getMinecraft();
+
+ GL11.glPushAttrib(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT);
+ RenderHelper.enableGUIStandardItemLighting();
+ this.ri.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), is, 0, 0);
+ RenderHelper.disableStandardItemLighting();
+ GL11.glPopAttrib();
+ }
+}
diff --git a/src/main/java/gregtech/common/render/items/GT_GeneratedItem_Renderer.java b/src/main/java/gregtech/common/render/items/GT_GeneratedItem_Renderer.java
new file mode 100644
index 0000000000..84045446c2
--- /dev/null
+++ b/src/main/java/gregtech/common/render/items/GT_GeneratedItem_Renderer.java
@@ -0,0 +1,166 @@
+package gregtech.common.render.items;
+
+import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Aluminium;
+import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Chrome;
+import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Iridium;
+import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Neutronium;
+import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Osmium;
+import static gregtech.api.enums.ItemList.Large_Fluid_Cell_StainlessSteel;
+import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Steel;
+import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Titanium;
+import static gregtech.api.enums.ItemList.Large_Fluid_Cell_TungstenSteel;
+import static gregtech.api.enums.Mods.HodgePodge;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.lwjgl.opengl.GL11;
+
+import com.mitchej123.hodgepodge.textures.IPatchedTextureAtlasSprite;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.items.GT_MetaGenerated_Item;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.render.GT_RenderUtil;
+import gregtech.loaders.ExtraIcons;
+
+public class GT_GeneratedItem_Renderer implements IItemRenderer {
+
+ @Override
+ public boolean handleRenderType(ItemStack item, ItemRenderType type) {
+ return type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON
+ || type == ItemRenderType.INVENTORY
+ || type == ItemRenderType.ENTITY;
+ }
+
+ @Override
+ public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
+ return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING
+ || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics);
+ }
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) {
+ short aMetaData = (short) aStack.getItemDamage();
+ if (!(aStack.getItem() instanceof GT_MetaGenerated_Item aItem)) return;
+
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glColor3f(1.0F, 1.0F, 1.0F);
+ IIcon tIcon;
+ if (aItem.mIconList[(aMetaData - aItem.mOffset)].length > 1) {
+ Long[] tStats = aItem.mElectricStats.get(aMetaData);
+
+ if ((tStats != null) && (tStats[3] < 0L)) {
+ long tCharge = aItem.getRealCharge(aStack);
+
+ if (tCharge <= 0L) {
+ tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][1];
+ } else {
+
+ if (tCharge >= tStats[0]) {
+ tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][8];
+ } else {
+ tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][(7
+ - (int) Math.max(0L, Math.min(5L, (tStats[0] - tCharge) * 6L / tStats[0])))];
+ }
+ }
+ } else {
+ tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][0];
+ }
+ } else {
+ tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][0];
+ }
+
+ if (tIcon == null) tIcon = Textures.ItemIcons.RENDERING_ERROR.getIcon();
+
+ markNeedsAnimationUpdate(tIcon);
+
+ ItemList largeFluidCell = getLargeFluidCell(aStack);
+ if (largeFluidCell != null) {
+ renderLargeFluidCellExtraParts(type, largeFluidCell, aStack);
+ }
+
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GT_RenderUtil.renderItem(type, tIcon);
+ GL11.glDisable(GL11.GL_BLEND);
+ }
+
+ @Nullable
+ private static ItemList getLargeFluidCell(ItemStack stack) {
+ if (isSame(Large_Fluid_Cell_Steel, stack)) return Large_Fluid_Cell_Steel;
+ if (isSame(Large_Fluid_Cell_Aluminium, stack)) return Large_Fluid_Cell_Aluminium;
+ if (isSame(Large_Fluid_Cell_TungstenSteel, stack)) return Large_Fluid_Cell_TungstenSteel;
+ if (isSame(Large_Fluid_Cell_StainlessSteel, stack)) return Large_Fluid_Cell_StainlessSteel;
+ if (isSame(Large_Fluid_Cell_Titanium, stack)) return Large_Fluid_Cell_Titanium;
+ if (isSame(Large_Fluid_Cell_Chrome, stack)) return Large_Fluid_Cell_Chrome;
+ if (isSame(Large_Fluid_Cell_Iridium, stack)) return Large_Fluid_Cell_Iridium;
+ if (isSame(Large_Fluid_Cell_Osmium, stack)) return Large_Fluid_Cell_Osmium;
+ if (isSame(Large_Fluid_Cell_Neutronium, stack)) return Large_Fluid_Cell_Neutronium;
+
+ return null;
+ }
+
+ private void renderLargeFluidCellExtraParts(IItemRenderer.ItemRenderType type, ItemList item, ItemStack stack) {
+
+ IIcon inner = switch (item) {
+ case Large_Fluid_Cell_Steel -> ExtraIcons.steelLargeCellInner;
+ case Large_Fluid_Cell_Aluminium -> ExtraIcons.aluminiumLargeCellInner;
+ case Large_Fluid_Cell_StainlessSteel -> ExtraIcons.stainlesssteelLargeCellInner;
+ case Large_Fluid_Cell_Titanium -> ExtraIcons.titaniumLargeCellInner;
+ case Large_Fluid_Cell_TungstenSteel -> ExtraIcons.tungstensteelLargeCellInner;
+ case Large_Fluid_Cell_Iridium -> ExtraIcons.iridiumLargeCellInner;
+ case Large_Fluid_Cell_Osmium -> ExtraIcons.osmiumLargeCellInner;
+ case Large_Fluid_Cell_Chrome -> ExtraIcons.chromiumLargeCellInner;
+ case Large_Fluid_Cell_Neutronium -> ExtraIcons.neutroniumLargeCellInner;
+ default -> Textures.ItemIcons.RENDERING_ERROR.getIcon();
+ };
+
+ // Empty inner side
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
+ markNeedsAnimationUpdate(inner);
+ GT_RenderUtil.renderItem(type, inner);
+
+ FluidStack fluidStack = GT_Utility.getFluidForFilledItem(stack, true);
+
+ if (fluidStack != null && fluidStack.getFluid() != null) {
+ IIcon fluidIcon = fluidStack.getFluid()
+ .getIcon(fluidStack);
+ if (fluidIcon == null) {
+ fluidIcon = Textures.ItemIcons.RENDERING_ERROR.getIcon();
+ }
+ int fluidColor = fluidStack.getFluid()
+ .getColor(fluidStack);
+
+ Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture);
+ markNeedsAnimationUpdate(fluidIcon);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glDepthFunc(GL11.GL_EQUAL);
+ GL11.glColor3ub((byte) (fluidColor >> 16), (byte) (fluidColor >> 8), (byte) fluidColor);
+ GT_RenderUtil.renderItem(type, fluidIcon);
+
+ GL11.glColor3ub((byte) -1, (byte) -1, (byte) -1);
+ GL11.glDepthFunc(GL11.GL_LEQUAL);
+ }
+ }
+
+ private static boolean isSame(ItemList item, ItemStack stack) {
+ ItemStack internal = item.getInternalStack_unsafe();
+ if (GT_Utility.isStackInvalid(internal)) return false;
+
+ return internal.getItem() == stack.getItem() && internal.getItemDamage() == stack.getItemDamage();
+ }
+
+ protected void markNeedsAnimationUpdate(IIcon icon) {
+ if (HodgePodge.isModLoaded() && icon instanceof IPatchedTextureAtlasSprite) {
+ ((IPatchedTextureAtlasSprite) icon).markNeedsAnimationUpdate();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/render/items/GT_GeneratedMaterial_Renderer.java b/src/main/java/gregtech/common/render/items/GT_GeneratedMaterial_Renderer.java
new file mode 100644
index 0000000000..a67d5512ed
--- /dev/null
+++ b/src/main/java/gregtech/common/render/items/GT_GeneratedMaterial_Renderer.java
@@ -0,0 +1,130 @@
+package gregtech.common.render.items;
+
+import static gregtech.api.enums.Mods.HodgePodge;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.lwjgl.opengl.GL11;
+
+import com.mitchej123.hodgepodge.textures.IPatchedTextureAtlasSprite;
+
+import codechicken.lib.render.TextureUtils;
+import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.render.GT_RenderUtil;
+
+public class GT_GeneratedMaterial_Renderer implements IItemRenderer {
+
+ @Override
+ public boolean handleRenderType(ItemStack item, ItemRenderType type) {
+ return type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON
+ || type == ItemRenderType.INVENTORY
+ || type == ItemRenderType.ENTITY;
+ }
+
+ @Override
+ public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
+ return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING
+ || (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics);
+ }
+
+ /**
+ * Handle special fluid display rendering. Return false if does not need such kind of handling. Note: annotations
+ * should not be rendered here. Only render the fluid texture. Parameters are values passed from
+ * {@link IItemRenderer#renderItem(ItemRenderType, ItemStack, Object...)} verbatim. Do not modify the argument.
+ * <p>
+ * While this is called, BLEND and ALPHA_TEST is on. It is expected that these remain enabled while exit.
+ *
+ * @return true if did special fluid display rendering. false otherwise.
+ */
+ public boolean renderFluidDisplayItem(ItemRenderType type, ItemStack aStack, Object... data) {
+ return false;
+ }
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) {
+ short aMetaData = (short) aStack.getItemDamage();
+ if (!(aStack.getItem() instanceof IGT_ItemWithMaterialRenderer aItem)) return;
+
+ int passes = 1;
+ if (aItem.requiresMultipleRenderPasses()) {
+ passes = aItem.getRenderPasses(aMetaData);
+ }
+
+ for (int pass = 0; pass < passes; pass++) {
+ IIcon tIcon = aItem.getIcon(aMetaData, pass);
+ IIcon tOverlay = aItem.getOverlayIcon(aMetaData, pass);
+ FluidStack aFluid = GT_Utility.getFluidForFilledItem(aStack, true);
+
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+
+ if (tIcon != null) {
+ markNeedsAnimationUpdate(tIcon);
+ renderRegularItem(type, aStack, tIcon, aFluid == null, pass, data);
+ }
+
+ if (tOverlay != null && aFluid != null && aFluid.getFluid() != null) {
+ IIcon fluidIcon = aFluid.getFluid()
+ .getIcon(aFluid);
+ if (fluidIcon != null) {
+ markNeedsAnimationUpdate(fluidIcon);
+ // Adds colour to a cells fluid. Does not colour full fluid icons as shown in NEI etc.
+ renderContainedFluid(type, aFluid, fluidIcon);
+ }
+ }
+
+ if (tOverlay != null) {
+ GL11.glColor3f(1.0F, 1.0F, 1.0F);
+ TextureUtils.bindAtlas(aItem.getSpriteNumber());
+ markNeedsAnimationUpdate(tOverlay);
+ renderItemOverlay(type, tOverlay);
+ }
+
+ GL11.glDisable(GL11.GL_BLEND);
+ }
+ }
+
+ protected void renderRegularItem(ItemRenderType type, ItemStack aStack, IIcon icon, boolean shouldModulateColor,
+ int pass, Object... data) {
+ renderRegularItem(type, aStack, icon, shouldModulateColor);
+ }
+
+ protected void renderRegularItem(ItemRenderType type, ItemStack aStack, IIcon icon, boolean shouldModulateColor) {
+ if (!(aStack.getItem() instanceof IGT_ItemWithMaterialRenderer aItem)) return;
+
+ if (shouldModulateColor) {
+ short[] tModulation = aItem.getRGBa(aStack);
+ GL11.glColor3f(tModulation[0] / 255.0F, tModulation[1] / 255.0F, tModulation[2] / 255.0F);
+ }
+
+ GT_RenderUtil.renderItem(type, icon);
+ }
+
+ protected void renderContainedFluid(ItemRenderType type, FluidStack aFluidStack, IIcon fluidIcon) {
+ Fluid aFluid = aFluidStack.getFluid();
+ int tColor = aFluid.getColor(aFluidStack);
+ GL11.glColor3f((tColor >> 16 & 0xFF) / 255.0F, (tColor >> 8 & 0xFF) / 255.0F, (tColor & 0xFF) / 255.0F);
+ TextureUtils.bindAtlas(aFluid.getSpriteNumber());
+
+ GL11.glDepthFunc(GL11.GL_EQUAL);
+ GT_RenderUtil.renderItem(type, fluidIcon);
+ GL11.glDepthFunc(GL11.GL_LEQUAL);
+ }
+
+ protected void renderItemOverlay(ItemRenderType type, IIcon overlay) {
+ GT_RenderUtil.renderItem(type, overlay);
+ }
+
+ protected void markNeedsAnimationUpdate(IIcon icon) {
+ if (HodgePodge.isModLoaded() && icon instanceof IPatchedTextureAtlasSprite) {
+ ((IPatchedTextureAtlasSprite) icon).markNeedsAnimationUpdate();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/render/items/GT_MetaGenerated_Item_Renderer.java b/src/main/java/gregtech/common/render/items/GT_MetaGenerated_Item_Renderer.java
new file mode 100644
index 0000000000..d7425c2fcb
--- /dev/null
+++ b/src/main/java/gregtech/common/render/items/GT_MetaGenerated_Item_Renderer.java
@@ -0,0 +1,85 @@
+package gregtech.common.render.items;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.client.MinecraftForgeClient;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.render.GT_RenderUtil;
+
+public class GT_MetaGenerated_Item_Renderer implements IItemRenderer {
+
+ private final IItemRenderer mItemRenderer = new GT_GeneratedItem_Renderer();
+ private final IItemRenderer mMaterialRenderer = new GT_GeneratedMaterial_Renderer();
+
+ private final IItemRenderer mDataStickRenderer = new GT_DataStick_Renderer();
+
+ public GT_MetaGenerated_Item_Renderer() {}
+
+ public <T extends Item & IGT_ItemWithMaterialRenderer> void registerItem(T item) {
+ MinecraftForgeClient.registerItemRenderer(item, this);
+ }
+
+ @Override
+ public boolean handleRenderType(ItemStack aStack, ItemRenderType aType) {
+ if ((GT_Utility.isStackInvalid(aStack)) || (aStack.getItemDamage() < 0)
+ || !(aStack.getItem() instanceof IGT_ItemWithMaterialRenderer)
+ || !((IGT_ItemWithMaterialRenderer) aStack.getItem()).shouldUseCustomRenderer(aStack.getItemDamage())) {
+ return false;
+ }
+ return getRendererForItemStack(aStack).handleRenderType(aStack, aType);
+ }
+
+ @Override
+ public boolean shouldUseRenderHelper(ItemRenderType aType, ItemStack aStack, ItemRendererHelper aHelper) {
+ if (GT_Utility.isStackInvalid(aStack)) {
+ return false;
+ }
+ return getRendererForItemStack(aStack).shouldUseRenderHelper(aType, aStack, aHelper);
+ }
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) {
+ GT_RenderUtil.applyStandardItemTransform(type);
+
+ IItemRenderer itemRenderer = getRendererForItemStack(aStack);
+ itemRenderer.renderItem(type, aStack, data);
+ }
+
+ private IItemRenderer getRendererForItemStack(ItemStack aStack) {
+ short aMetaData = (short) aStack.getItemDamage();
+ IGT_ItemWithMaterialRenderer aItem = (IGT_ItemWithMaterialRenderer) aStack.getItem();
+
+ if (aItem != null && aItem.allowMaterialRenderer(aMetaData)) {
+ IItemRenderer aMaterialRenderer = aItem.getMaterialRenderer(aMetaData);
+
+ // Handle fluid rendering.
+ if (aMaterialRenderer == null) {
+ ItemData itemData = GT_OreDictUnificator.getAssociation(aStack);
+ if (itemData != null) {
+ Materials material = itemData.mMaterial.mMaterial;
+ if (material.renderer != null) {
+ aMaterialRenderer = material.renderer;
+ }
+ }
+ }
+
+ return aMaterialRenderer != null ? aMaterialRenderer : mMaterialRenderer;
+ }
+
+ // handle data stick
+ if (aStack.getItem() == ItemList.Tool_DataStick.getItem() && aStack.hasTagCompound()
+ && aStack.getTagCompound()
+ .hasKey("output")) {
+ return mDataStickRenderer;
+ }
+
+ return mItemRenderer;
+ }
+}
diff --git a/src/main/java/gregtech/common/render/items/GaiaSpiritRenderer.java b/src/main/java/gregtech/common/render/items/GaiaSpiritRenderer.java
new file mode 100644
index 0000000000..08663adf4d
--- /dev/null
+++ b/src/main/java/gregtech/common/render/items/GaiaSpiritRenderer.java
@@ -0,0 +1,27 @@
+package gregtech.common.render.items;
+
+import java.awt.Color;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import org.lwjgl.opengl.GL11;
+
+import gregtech.GT_Mod;
+import gregtech.common.render.GT_RenderUtil;
+
+public class GaiaSpiritRenderer extends GT_GeneratedMaterial_Renderer {
+
+ @Override
+ protected void renderRegularItem(ItemRenderType type, ItemStack aStack, IIcon icon, boolean shouldModulateColor) {
+ long animationTicks = GT_Mod.gregtechproxy.getAnimationTicks();
+ float partialTicks = GT_Mod.gregtechproxy.getPartialRenderTicks();
+
+ if (shouldModulateColor) {
+ Color color = Color.getHSBColor((animationTicks % 360 + partialTicks) % 180 / 180f, 0.4f, 0.9f);
+ GL11.glColor3f(color.getRed() / 255.0F, color.getGreen() / 255.0F, color.getBlue() / 255.0F);
+ }
+
+ GT_RenderUtil.renderItem(type, icon);
+ }
+}
diff --git a/src/main/java/gregtech/common/render/items/InfinityRenderer.java b/src/main/java/gregtech/common/render/items/InfinityRenderer.java
new file mode 100644
index 0000000000..3a98898b8a
--- /dev/null
+++ b/src/main/java/gregtech/common/render/items/InfinityRenderer.java
@@ -0,0 +1,139 @@
+package gregtech.common.render.items;
+
+import java.util.Random;
+
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.lwjgl.opengl.GL11;
+
+import codechicken.lib.render.TextureUtils;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer;
+import gregtech.api.util.GT_Utility;
+
+// TODO: Render effects outside inventory.
+
+public class InfinityRenderer extends GT_GeneratedMaterial_Renderer {
+
+ public Random rand = new Random();
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) {
+ short aMetaData = (short) aStack.getItemDamage();
+ if (!(aStack.getItem() instanceof IGT_ItemWithMaterialRenderer aItem)) return;
+
+ int passes = 1;
+ if (aItem.requiresMultipleRenderPasses()) {
+ passes = aItem.getRenderPasses(aMetaData);
+ }
+
+ for (int pass = 0; pass < passes; pass++) {
+ IIcon tIcon = aItem.getIcon(aMetaData, pass);
+ IIcon tOverlay = aItem.getOverlayIcon(aMetaData, pass);
+ FluidStack aFluid = GT_Utility.getFluidForFilledItem(aStack, true);
+
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+
+ if (type == ItemRenderType.INVENTORY) {
+ if (pass == 0) {
+ renderHalo();
+ }
+ renderPulse(tOverlay, tIcon);
+ }
+
+ // Workaround for cell and comb:
+ // 1. BW capsule needs `renderContainedFluid` call as it doesn't have
+ // `materialicons/CUSTOM/infinity/capsuleMolten`
+ // 2. Without these 2 GL calls fluid texture leaks out of the cell / capsule
+ // 3. Comb texture doesn't like depth enabled
+ if (passes == 1) {
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ }
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+
+ if (tIcon != null) {
+ markNeedsAnimationUpdate(tIcon);
+ renderRegularItem(type, aStack, tIcon, aFluid == null);
+ }
+
+ if (tOverlay != null && aFluid != null && aFluid.getFluid() != null) {
+ IIcon fluidIcon = aFluid.getFluid()
+ .getIcon(aFluid);
+ if (fluidIcon != null) {
+ markNeedsAnimationUpdate(fluidIcon);
+ // Adds colour to a cells fluid. Does not colour full fluid icons as shown in NEI etc.
+ renderContainedFluid(type, aFluid, fluidIcon);
+ }
+ }
+
+ if (tOverlay != null) {
+ GL11.glColor3f(1.0F, 1.0F, 1.0F);
+ TextureUtils.bindAtlas(aItem.getSpriteNumber());
+ markNeedsAnimationUpdate(tOverlay);
+ renderItemOverlay(type, tOverlay);
+ }
+
+ GL11.glDisable(GL11.GL_BLEND);
+ }
+ }
+
+ private void renderHalo() {
+ GL11.glPushMatrix();
+ IIcon halo = Textures.ItemIcons.HALO.getIcon();
+
+ int spread = 10;
+ int haloAlpha = 0xFF000000;
+
+ if (halo == null) {
+ return;
+ }
+
+ Tessellator t = Tessellator.instance;
+
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+
+ GL11.glColor4f(20 / 255.0f, 20 / 255.0f, 20 / 255.0f, (float) (haloAlpha >> 24 & 255) / 255.0F);
+
+ t.startDrawingQuads();
+ t.addVertexWithUV(-spread, -spread, 0, halo.getMinU(), halo.getMinV());
+ t.addVertexWithUV(-spread, 16 + spread, 0, halo.getMinU(), halo.getMaxV());
+ t.addVertexWithUV(16 + spread, 16 + spread, 0, halo.getMaxU(), halo.getMaxV());
+ t.addVertexWithUV(16 + spread, -spread, 0, halo.getMaxU(), halo.getMinV());
+ t.draw();
+ GL11.glPopMatrix();
+ }
+
+ private void renderPulse(IIcon... icons) {
+ Tessellator t = Tessellator.instance;
+ double random = rand.nextGaussian();
+ double scale = (random * 0.15) + 0.95;
+ double offset = (1.0 - scale) / 2.0;
+
+ for (IIcon icon : icons) {
+ if (icon == null) continue;
+ GL11.glPushMatrix();
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glTranslated(offset * 16.0, offset * 16.0, 1.0);
+ GL11.glScaled(scale, scale, 1.0);
+
+ t.startDrawingQuads();
+ t.setColorRGBA_F(1.0f, 1.0f, 1.0f, 0.6f);
+ t.addVertexWithUV(0 - offset, 0 - offset, 0, icon.getMinU(), icon.getMinV());
+ t.addVertexWithUV(0 - offset, 16 + offset, 0, icon.getMinU(), icon.getMaxV());
+ t.addVertexWithUV(16 + offset, 16 + offset, 0, icon.getMaxU(), icon.getMaxV());
+ t.addVertexWithUV(16 + offset, 0 - offset, 0, icon.getMaxU(), icon.getMinV());
+ t.draw();
+
+ GL11.glPopMatrix();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/render/items/TranscendentMetalRenderer.java b/src/main/java/gregtech/common/render/items/TranscendentMetalRenderer.java
new file mode 100644
index 0000000000..8583033e0f
--- /dev/null
+++ b/src/main/java/gregtech/common/render/items/TranscendentMetalRenderer.java
@@ -0,0 +1,145 @@
+package gregtech.common.render.items;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.ItemRenderer;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.entity.RenderItem;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.IItemRenderer;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.lwjgl.opengl.GL11;
+
+import codechicken.lib.render.TextureUtils;
+import gregtech.GT_Mod;
+import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer;
+import gregtech.api.util.GT_Util;
+
+public class TranscendentMetalRenderer extends GT_GeneratedMaterial_Renderer {
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) {
+ if (type == ItemRenderType.ENTITY) {
+ // Pretend fancy graphics is enabled
+ if (!Minecraft.getMinecraft().gameSettings.fancyGraphics) {
+ if (RenderItem.renderInFrame) {
+ GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
+ }
+ // Magic numbers calculated from vanilla code
+ GL11.glTranslatef(-0.5F, -0.25F, 0.0421875F);
+ }
+ }
+ super.renderItem(type, aStack, data);
+ }
+
+ @Override
+ protected void renderRegularItem(ItemRenderType type, ItemStack itemStack, IIcon icon,
+ boolean shouldModulateColor) {
+
+ if (!(itemStack.getItem() instanceof final IGT_ItemWithMaterialRenderer itemRenderer)) return;
+
+ GL11.glPushMatrix();
+ applyEffect(type, itemRenderer.getRGBa(itemStack), shouldModulateColor);
+
+ if (shouldModulateColor) {
+ short[] tModulation = itemRenderer.getRGBa(itemStack);
+ GL11.glColor3f(tModulation[0] / 255.0F, tModulation[1] / 255.0F, tModulation[2] / 255.0F);
+ }
+
+ if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) {
+ GL11.glScalef(16, 16, 32);
+ }
+ ItemRenderer.renderItemIn2D(
+ Tessellator.instance,
+ icon.getMaxU(),
+ icon.getMinV(),
+ icon.getMinU(),
+ icon.getMaxV(),
+ icon.getIconWidth(),
+ icon.getIconHeight(),
+ 0.0625F);
+
+ GL11.glPopMatrix();
+ }
+
+ @Override
+ protected void renderContainedFluid(ItemRenderType type, FluidStack fluidStack, IIcon fluidIcon) {
+ GL11.glPushMatrix();
+
+ Fluid fluid = fluidStack.getFluid();
+ applyEffect(type, GT_Util.getRGBaArray(fluid.getColor()), true);
+
+ TextureUtils.bindAtlas(fluid.getSpriteNumber());
+ GL11.glDepthFunc(GL11.GL_EQUAL);
+ if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) {
+ GL11.glScalef(16, 16, 32);
+ }
+
+ ItemRenderer.renderItemIn2D(
+ Tessellator.instance,
+ fluidIcon.getMaxU(),
+ fluidIcon.getMinV(),
+ fluidIcon.getMinU(),
+ fluidIcon.getMaxV(),
+ fluidIcon.getIconWidth(),
+ fluidIcon.getIconHeight(),
+ 0.0625F);
+
+ GL11.glDepthFunc(GL11.GL_LEQUAL);
+ GL11.glPopMatrix();
+ }
+
+ @Override
+ protected void renderItemOverlay(ItemRenderType type, IIcon overlay) {
+ GL11.glPushMatrix();
+ applyEffect(type, null, false);
+
+ if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) {
+ GL11.glScalef(16, 16, 32);
+ }
+ ItemRenderer.renderItemIn2D(
+ Tessellator.instance,
+ overlay.getMaxU(),
+ overlay.getMinV(),
+ overlay.getMinU(),
+ overlay.getMaxV(),
+ overlay.getIconWidth(),
+ overlay.getIconHeight(),
+ 0.0625F);
+
+ GL11.glPopMatrix();
+ }
+
+ private void applyEffect(ItemRenderType type, short[] modulation, boolean shouldModulateColor) {
+ if (RenderItem.renderInFrame) {
+ // Float in front of item frame
+ GL11.glTranslatef(0.0f, 0.0f, -0.5f);
+ }
+
+ if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) {
+ GL11.glTranslatef(8f, 8f, 0f);
+ } else {
+ GL11.glTranslatef(0.5f, 0.5f, 0.0f);
+ }
+
+ GL11.glRotatef((GT_Mod.gregtechproxy.getAnimationTicks() * 3.5f) % 360, 0.3f, 0.5f, 0.2f);
+ GL11.glRotatef(180, 0.5f, 0.0f, 0.0f);
+
+ if (type.equals(IItemRenderer.ItemRenderType.INVENTORY)) {
+ GL11.glTranslatef(-8f, -8f, 0f);
+ } else {
+ GL11.glTranslatef(-0.5f, -0.5f, 0.0f);
+ }
+
+ // Center on point of rotation
+ GL11.glTranslatef(0.0f, 0.0f, 0.03125F);
+
+ if (shouldModulateColor) {
+ GL11.glColor4f(modulation[0] / 255.0F, modulation[1] / 255.0F, modulation[2] / 255.0F, 255);
+ } else {
+ GL11.glColor4f(1f, 1f, 1f, 255);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/render/items/UniversiumRenderer.java b/src/main/java/gregtech/common/render/items/UniversiumRenderer.java
new file mode 100644
index 0000000000..92b86071cf
--- /dev/null
+++ b/src/main/java/gregtech/common/render/items/UniversiumRenderer.java
@@ -0,0 +1,197 @@
+package gregtech.common.render.items;
+
+import static gregtech.api.enums.Mods.Avaritia;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.RenderHelper;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.entity.RenderItem;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.ResourceLocation;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+import org.lwjgl.opengl.GL20;
+
+import codechicken.lib.render.TextureUtils;
+import fox.spiteful.avaritia.render.CosmicRenderShenanigans;
+import gregtech.api.enums.ItemList;
+import gregtech.api.interfaces.IGT_ItemWithMaterialRenderer;
+import gregtech.common.render.GT_RenderUtil;
+
+@SuppressWarnings("RedundantLabeledSwitchRuleCodeBlock")
+public class UniversiumRenderer extends GT_GeneratedMaterial_Renderer {
+
+ private static final float cosmicOpacity = 2.5f;
+
+ @Override
+ public boolean renderFluidDisplayItem(ItemRenderType type, ItemStack aStack, Object... data) {
+ Item item = aStack.getItem();
+ if (item == null) return false;
+
+ magicRenderMethod(
+ type,
+ ItemList.Emitter_UEV.get(1), // hack to make it render correctly
+ item.getIconFromDamage(aStack.getItemDamage()),
+ true,
+ data);
+ return true;
+ }
+
+ @Override
+ public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) {
+ short aMetaData = (short) aStack.getItemDamage();
+ if (!(aStack.getItem() instanceof IGT_ItemWithMaterialRenderer aItem)) return;
+
+ int passes = 1;
+ if (aItem.requiresMultipleRenderPasses()) {
+ passes = aItem.getRenderPasses(aMetaData);
+ }
+
+ for (int pass = 0; pass < passes; pass++) {
+ IIcon tIcon = aItem.getIcon(aMetaData, pass);
+ IIcon tOverlay = aItem.getOverlayIcon(aMetaData, pass);
+
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+
+ if (tIcon != null) {
+ markNeedsAnimationUpdate(tIcon);
+ magicRenderMethod(type, aStack, tIcon, false, data);
+ }
+
+ GL11.glDisable(GL11.GL_LIGHTING);
+
+ if (tOverlay != null) {
+ GL11.glColor3f(1.0F, 1.0F, 1.0F);
+ TextureUtils.bindAtlas(aItem.getSpriteNumber());
+ markNeedsAnimationUpdate(tOverlay);
+ renderItemOverlay(type, tOverlay);
+ }
+
+ GL11.glDisable(GL11.GL_BLEND);
+ }
+ }
+
+ private void magicRenderMethod(ItemRenderType type, ItemStack aStack, IIcon tIcon, boolean fluidDisplay,
+ Object... data) {
+ if (!Avaritia.isModLoaded()) {
+ return;
+ }
+
+ RenderItem r = RenderItem.getInstance();
+ Minecraft mc = Minecraft.getMinecraft();
+ Tessellator t = Tessellator.instance;
+ float minU = tIcon.getMinU();
+ float maxU = tIcon.getMaxU();
+ float minV = tIcon.getMinV();
+ float maxV = tIcon.getMaxV();
+
+ processLightLevel(type, data);
+
+ GL11.glPushMatrix();
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+
+ if (type == ItemRenderType.INVENTORY) {
+ RenderHelper.enableGUIStandardItemLighting();
+
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+
+ if (fluidDisplay) {
+ // this somehow makes shader render correctly
+ ResourceLocation resourcelocation = mc.getTextureManager()
+ .getResourceLocation(aStack.getItemSpriteNumber());
+ mc.getTextureManager()
+ .bindTexture(resourcelocation);
+ } else {
+ GT_RenderUtil.renderItem(type, tIcon);
+ }
+
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ RenderHelper.enableGUIStandardItemLighting();
+
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+
+ if (fluidDisplay) {
+ GL11.glDisable(GL11.GL_BLEND);
+ }
+
+ CosmicRenderShenanigans.cosmicOpacity = cosmicOpacity;
+ CosmicRenderShenanigans.inventoryRender = true;
+ CosmicRenderShenanigans.useShader();
+
+ GL11.glColor4d(1, 1, 1, 1);
+
+ // Draw cosmic overlay
+ GT_RenderUtil.renderItem(type, tIcon);
+
+ CosmicRenderShenanigans.releaseShader();
+ CosmicRenderShenanigans.inventoryRender = false;
+
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ } else {
+ // RENDER ITEM
+ GT_RenderUtil.renderItem(type, tIcon);
+
+ int program = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM);
+
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glDepthFunc(GL11.GL_EQUAL);
+ CosmicRenderShenanigans.cosmicOpacity = cosmicOpacity;
+ CosmicRenderShenanigans.useShader();
+
+ // RENDER COSMIC OVERLAY
+ GT_RenderUtil.renderItem(type, tIcon);
+ CosmicRenderShenanigans.releaseShader();
+ GL11.glDepthFunc(GL11.GL_LEQUAL);
+
+ GL20.glUseProgram(program);
+ }
+
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glPopMatrix();
+ }
+
+ private void processLightLevel(ItemRenderType type, Object... data) {
+ switch (type) {
+ case ENTITY -> {
+ EntityItem ent = (EntityItem) (data[1]);
+ if (ent != null) {
+ CosmicRenderShenanigans.setLightFromLocation(
+ ent.worldObj,
+ MathHelper.floor_double(ent.posX),
+ MathHelper.floor_double(ent.posY),
+ MathHelper.floor_double(ent.posZ));
+ }
+ }
+ case EQUIPPED, EQUIPPED_FIRST_PERSON -> {
+ EntityLivingBase ent = (EntityLivingBase) (data[1]);
+ if (ent != null) {
+ CosmicRenderShenanigans.setLightFromLocation(
+ ent.worldObj,
+ MathHelper.floor_double(ent.posX),
+ MathHelper.floor_double(ent.posY),
+ MathHelper.floor_double(ent.posZ));
+ }
+ }
+ case INVENTORY -> {
+ CosmicRenderShenanigans.setLightLevel(10.2f);
+ }
+ default -> {
+ CosmicRenderShenanigans.setLightLevel(1.0f);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ChestBuffer.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ChestBuffer.java
new file mode 100644
index 0000000000..67c38fad9e
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ChestBuffer.java
@@ -0,0 +1,137 @@
+package gregtech.common.tileentities.automation;
+
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_CHESTBUFFER;
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_CHESTBUFFER_GLOW;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Buffer;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_ChestBuffer extends GT_MetaTileEntity_Buffer {
+
+ private static final int[] tickRate = { 400, 200, 100, 20, 4, 1, 1, 1, 1, 1, 1, 1, 1 };
+ private static final int[] maxStacks = { 1, 1, 1, 1, 1, 1, 2, 4, 8, 16, 32, 64, 128 };
+
+ public GT_MetaTileEntity_ChestBuffer(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 28,
+ new String[] { "Buffers up to 27 Item Stacks", "Use Screwdriver to regulate output stack size",
+ getTickRateDesc(aTier) });
+ }
+
+ public GT_MetaTileEntity_ChestBuffer(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription);
+ }
+
+ public GT_MetaTileEntity_ChestBuffer(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String[] aDescription) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription);
+ }
+
+ public GT_MetaTileEntity_ChestBuffer(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_ChestBuffer(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ChestBuffer(
+ this.mName,
+ this.mTier,
+ this.mInventory.length,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture getOverlayIcon() {
+ return TextureFactory.of(
+ TextureFactory.of(AUTOMATION_CHESTBUFFER),
+ TextureFactory.builder()
+ .addIcon(AUTOMATION_CHESTBUFFER_GLOW)
+ .glow()
+ .build());
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex < this.mInventory.length - 1;
+ }
+
+ @Override
+ protected void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aTimer % tickRate[mTier] > 0) return;
+
+ // mSuccess will be negative if the call is caused by the %200 aTimer, always try to push. Otherwise it will be
+ // positive.
+ // For the first 6 ticks after a successful move (49->44), push every tick. Then go to every 5 ticks.
+ if ((mSuccess <= 0) || (mSuccess > 43) || ((mSuccess % 5) == 0)) {
+ super.moveItems(aBaseMetaTileEntity, aTimer, Math.min(MAX, maxStacks[mTier]));
+ }
+
+ if (mSuccess < 0) {
+ mSuccess = 0;
+ }
+ }
+
+ protected static String getTickRateDesc(int tier) {
+ int tickRate = getTickRate(tier);
+ String timeStr = "";
+ String numStr = "";
+ if (maxStacks[tier] > 1) {
+ numStr = maxStacks[tier] + " items";
+ } else {
+ numStr = "1 item";
+ }
+ if (tickRate < 20) timeStr = "1/" + 20 / tickRate + " ";
+ else if (tickRate > 20) {
+ timeStr = (tickRate / 20) + "th ";
+ }
+ return "Moves " + numStr + " every " + timeStr + "second";
+ }
+
+ protected static int getTickRate(int tier) {
+ if (tier > 9) return 1;
+ return tickRate[tier];
+ }
+
+ protected static int getMaxStacks(int tier) {
+ // Included higher tiers on the off chance they actually work without blowing things up lmao
+ return tier > 9 ? MAX : Math.min(maxStacks[tier], MAX);
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ addSortStacksButton(builder);
+ addEmitRedstoneIfFullButton(builder);
+ addInvertRedstoneButton(builder);
+ addStockingModeButton(builder);
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_22_RED.apply(69, true))
+ .setPos(98, 60)
+ .setSize(51, 22));
+ addMainUI(builder);
+ }
+
+ protected void addMainUI(ModularWindow.Builder builder) {
+ addInventorySlots(builder);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Filter.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Filter.java
new file mode 100644
index 0000000000..b6f1d53604
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Filter.java
@@ -0,0 +1,144 @@
+package gregtech.common.tileentities.automation;
+
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_FILTER;
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_FILTER_GLOW;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_FilterBase;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Filter extends GT_MetaTileEntity_FilterBase {
+
+ private static final int NUM_FILTER_SLOTS = 9;
+ private static final String IGNORE_NBT_TOOLTIP = "GT5U.machines.ignore_nbt.tooltip";
+ private boolean ignoreNbt = false;
+
+ public GT_MetaTileEntity_Filter(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 19,
+ new String[] { "Filters up to 9 different Items", "Use Screwdriver to regulate output stack size" });
+ }
+
+ public GT_MetaTileEntity_Filter(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Filter(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Filter(
+ this.mName,
+ this.mTier,
+ this.mInventory.length,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture getOverlayIcon() {
+ return TextureFactory.of(
+ TextureFactory.of(AUTOMATION_FILTER),
+ TextureFactory.builder()
+ .addIcon(AUTOMATION_FILTER_GLOW)
+ .glow()
+ .build());
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("bIgnoreNBT", this.ignoreNbt);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.ignoreNbt = aNBT.getBoolean("bIgnoreNBT");
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (!super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack)) {
+ return false;
+ }
+ if (this.invertFilter) {
+ for (int i = 0; i < NUM_FILTER_SLOTS; i++) {
+ if (GT_Utility.areStacksEqual(this.mInventory[FILTER_SLOT_INDEX + i], aStack, this.ignoreNbt)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return GT_Utility.areStacksEqual(this.mInventory[(FILTER_SLOT_INDEX + aIndex)], aStack, this.ignoreNbt);
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ addAllowNbtButton(builder);
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_WHITE.apply(9, false))
+ .setPos(6, 19)
+ .setSize(9, 24))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_BLUE.apply(24, true))
+ .setPos(71, 19)
+ .setSize(24, 24))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_24_RED.apply(19, true))
+ .setPos(152, 19)
+ .setSize(19, 24))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SLOTS_HOLO_3BY3)
+ .setPos(16, 4)
+ .setSize(54, 54))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .startFromSlot(FILTER_SLOT_INDEX)
+ .endAtSlot(FILTER_SLOT_INDEX + NUM_FILTER_SLOTS - 1)
+ .phantom(true)
+ .applyForWidget(
+ widget -> widget.disableShiftInsert()
+ .setBackground(GT_UITextures.TRANSPARENT))
+ .build()
+ .setPos(16, 4))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .startFromSlot(0)
+ .endAtSlot(NUM_INVENTORY_SLOTS - 1)
+ .build()
+ .setPos(97, 4));
+ }
+
+ private void addAllowNbtButton(ModularWindow.Builder builder) {
+ builder.widget(
+ createToggleButton(
+ () -> ignoreNbt,
+ val -> ignoreNbt = val,
+ GT_UITextures.OVERLAY_BUTTON_NBT,
+ () -> mTooltipCache.getData(IGNORE_NBT_TOOLTIP)));
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ItemDistributor.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ItemDistributor.java
new file mode 100644
index 0000000000..58b7fa57df
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ItemDistributor.java
@@ -0,0 +1,204 @@
+package gregtech.common.tileentities.automation;
+
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_ITEMDISTRIBUTOR;
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_ITEMDISTRIBUTOR_GLOW;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Buffer;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_ItemDistributor extends GT_MetaTileEntity_Buffer {
+
+ private byte[] itemsPerSide = new byte[6];
+ private ForgeDirection currentSide = ForgeDirection.DOWN;
+ private byte currentSideItemCount = 0;
+
+ public GT_MetaTileEntity_ItemDistributor(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 28,
+ new String[] { "Distributes Items between different Machine Sides", "Default Items per Machine Side: 0",
+ "Use Screwdriver to increase/decrease Items per Side" });
+ }
+
+ public GT_MetaTileEntity_ItemDistributor(int aID, String aName, String aNameRegional, int aTier, int aInvSlotCount,
+ String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription);
+ }
+
+ public GT_MetaTileEntity_ItemDistributor(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_ItemDistributor(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ItemDistributor(
+ this.mName,
+ this.mTier,
+ this.mInventory.length,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture getOverlayIcon() {
+ return TextureFactory.of(
+ TextureFactory.of(AUTOMATION_ITEMDISTRIBUTOR),
+ TextureFactory.builder()
+ .addIcon(AUTOMATION_ITEMDISTRIBUTOR_GLOW)
+ .glow()
+ .build());
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == aBaseMetaTileEntity.getFrontFacing();
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ return mTextures[0][colorIndex + 1];
+ } else {
+ return mTextures[1][colorIndex + 1];
+ }
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] returnTextures = new ITexture[2][17][];
+ ITexture baseIcon = getOverlayIcon(), pipeIcon = TextureFactory.of(Textures.BlockIcons.OVERLAY_PIPE_OUT);
+ for (int i = 0; i < 17; i++) {
+ returnTextures[0][i] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i], baseIcon };
+ returnTextures[1][i] = new ITexture[] { Textures.BlockIcons.MACHINE_CASINGS[mTier][i], pipeIcon, baseIcon };
+ }
+ return returnTextures;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return getBaseMetaTileEntity().getFrontFacing() == side || itemsPerSide[side.ordinal()] == 0;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return getBaseMetaTileEntity().getFrontFacing() != side && itemsPerSide[side.ordinal()] > 0;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex < this.mInventory.length - 1;
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ itemsPerSide = aNBT.getByteArray("mItemsPerSide");
+ if (itemsPerSide.length != 6) {
+ itemsPerSide = new byte[6];
+ }
+ currentSide = ForgeDirection.getOrientation(aNBT.getByte("mCurrentSide"));
+ currentSideItemCount = aNBT.getByte("mCurrentSideItemCount");
+ }
+
+ @Override
+ protected void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ int currentSideOrdinal = currentSide.ordinal();
+ fillStacksIntoFirstSlots();
+ int movedItems;
+ TileEntity adjacentTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(currentSide);
+ int inspectedSides = 0;
+ while (itemsPerSide[currentSideOrdinal] == 0) {
+ currentSideOrdinal = ((currentSideOrdinal + 1) % 6);
+ currentSide = ForgeDirection.getOrientation(currentSideOrdinal);
+ currentSideItemCount = 0;
+ adjacentTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(currentSide);
+ inspectedSides += 1;
+ if (inspectedSides == 6) {
+ return;
+ }
+ }
+ movedItems = GT_Utility.moveOneItemStack(
+ aBaseMetaTileEntity,
+ adjacentTileEntity,
+ currentSide,
+ currentSide.getOpposite(),
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) (itemsPerSide[currentSideOrdinal] - currentSideItemCount),
+ (byte) 1);
+ currentSideItemCount += movedItems;
+ if (currentSideItemCount >= itemsPerSide[currentSideOrdinal]) {
+ currentSideOrdinal = ((currentSideOrdinal + 1) % 6);
+ currentSide = ForgeDirection.getOrientation(currentSideOrdinal);
+ currentSideItemCount = 0;
+ }
+ if (movedItems > 0 || aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ mSuccess = 50;
+ }
+ fillStacksIntoFirstSlots();
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ final int ordinalSide = side.ordinal();
+ // Adjust items per side by 1 or -1, constrained to the cyclic interval [0, 127]
+ itemsPerSide[ordinalSide] += aPlayer.isSneaking() ? -1 : 1;
+ itemsPerSide[ordinalSide] = (byte) ((itemsPerSide[ordinalSide] + 128) % 128);
+ GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("211", "Items per side: ") + itemsPerSide[ordinalSide]);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setByteArray("mItemsPerSide", itemsPerSide);
+ aNBT.setByte("mCurrentSide", (byte) currentSide.ordinal());
+ aNBT.setByte("mCurrentSideItemCount", currentSideItemCount);
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ super.setItemNBT(aNBT);
+ aNBT.setByteArray("mItemsPerSide", itemsPerSide);
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ addEmitRedstoneIfFullButton(builder);
+ addInvertRedstoneButton(builder);
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_22_RED.apply(87, true))
+ .setPos(62, 60)
+ .setSize(87, 22));
+ addInventorySlots(builder);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_RecipeFilter.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_RecipeFilter.java
new file mode 100644
index 0000000000..05128ee255
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_RecipeFilter.java
@@ -0,0 +1,328 @@
+package gregtech.common.tileentities.automation;
+
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_RECIPEFILTER;
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_RECIPEFILTER_GLOW;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.Constants;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizons.modularui.api.drawable.Text;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import codechicken.nei.recipe.RecipeCatalysts;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.RecipeMapWorkable;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_SpecialFilter;
+import gregtech.api.multitileentity.MultiTileEntityContainer;
+import gregtech.api.multitileentity.MultiTileEntityItemInternal;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Item_Machines;
+import gregtech.loaders.preload.GT_Loader_MultiTileEntities;
+
+public class GT_MetaTileEntity_RecipeFilter extends GT_MetaTileEntity_SpecialFilter {
+
+ private static final String TT_machineType = "GT5U.MBTT.MachineType";
+ private static final String REPRESENTATION_SLOT_TOOLTIP = "GT5U.recipe_filter.representation_slot.tooltip";
+ private static final String EMPTY_REPRESENTATION_SLOT_TOOLTIP = "GT5U.recipe_filter.empty_representation_slot.tooltip";
+ public RecipeMap<?> mRecipeMap;
+ private List<ItemStack> filteredMachines = new ArrayList<>();
+ public int mRotationIndex = 0;
+
+ public GT_MetaTileEntity_RecipeFilter(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ new String[] { "Filters 1 Recipe Type", "Use Screwdriver to regulate output stack size" });
+ }
+
+ public GT_MetaTileEntity_RecipeFilter(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_RecipeFilter(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ private static RecipeMap<?> getItemStackMachineRecipeMap(ItemStack stack) {
+ if (stack != null) {
+ IMetaTileEntity metaTileEntity = GT_Item_Machines.getMetaTileEntity(stack);
+ if (metaTileEntity != null) {
+ return getMetaTileEntityRecipeMap(metaTileEntity);
+ } else if (stack.getItem() instanceof MultiTileEntityItemInternal) {
+ return getMuTeRecipeMap(stack);
+ }
+ }
+ return null;
+ }
+
+ private static RecipeMap<?> getMetaTileEntityRecipeMap(IMetaTileEntity metaTileEntity) {
+ if (metaTileEntity instanceof RecipeMapWorkable recipeMapWorkable) {
+ return recipeMapWorkable.getRecipeMap();
+ }
+ return null;
+ }
+
+ private static RecipeMap<?> getMuTeRecipeMap(@NotNull ItemStack stack) {
+ MultiTileEntityContainer muTeEntityContainer = GT_Loader_MultiTileEntities.MACHINE_REGISTRY
+ .getNewTileEntityContainer(stack);
+ if (muTeEntityContainer != null
+ && muTeEntityContainer.mTileEntity instanceof RecipeMapWorkable recipeMapWorkable) {
+ return recipeMapWorkable.getRecipeMap();
+ }
+ return null;
+ }
+
+ private static List<ItemStack> getFilteredMachines(RecipeMap<?> recipeMap) {
+ return RecipeCatalysts.getRecipeCatalysts(
+ recipeMap.getFrontend()
+ .getUIProperties().neiTransferRectId)
+ .stream()
+ .map(positionedStack -> positionedStack.item)
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ if ((!getBaseMetaTileEntity().isServerSide()) || ((aTick % 8L != 0L) && mRotationIndex != -1)) return;
+ if (this.filteredMachines.isEmpty()) {
+ return;
+ }
+ this.mInventory[FILTER_SLOT_INDEX] = GT_Utility.copyAmount(
+ 1,
+ this.filteredMachines.get(this.mRotationIndex = (this.mRotationIndex + 1) % this.filteredMachines.size()));
+ if (this.mInventory[FILTER_SLOT_INDEX] == null) return;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_RecipeFilter(
+ this.mName,
+ this.mTier,
+ this.mInventory.length,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture getOverlayIcon() {
+ return TextureFactory.of(
+ TextureFactory.of(AUTOMATION_RECIPEFILTER),
+ TextureFactory.builder()
+ .addIcon(AUTOMATION_RECIPEFILTER_GLOW)
+ .glow()
+ .build());
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ if (mRecipeMap != null) {
+ aNBT.setString("mRecipeMap", this.mRecipeMap.unlocalizedName);
+ }
+ NBTTagList tagList = new NBTTagList();
+ for (ItemStack filteredMachine : filteredMachines) {
+ tagList.appendTag(filteredMachine.writeToNBT(new NBTTagCompound()));
+ }
+ aNBT.setTag("filteredMachines", tagList);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mRecipeMap = RecipeMap.getFromOldIdentifier(aNBT.getString("mRecipeMap"));
+ filteredMachines.clear();
+ NBTTagList tagList = aNBT.getTagList("filteredMachines", Constants.NBT.TAG_COMPOUND);
+ for (int i = 0; i < tagList.tagCount(); i++) {
+ ItemStack readStack = ItemStack.loadItemStackFromNBT(tagList.getCompoundTagAt(i));
+ if (readStack != null) {
+ filteredMachines.add(readStack);
+ }
+ }
+ }
+
+ @Override
+ protected boolean isStackAllowed(ItemStack aStack) {
+ return mRecipeMap != null && mRecipeMap.containsInput(aStack);
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(
+ new FakeSyncWidget.StringSyncer(
+ () -> this.mRecipeMap == null ? "" : this.mRecipeMap.unlocalizedName,
+ id -> this.mRecipeMap = RecipeMap.ALL_RECIPE_MAPS.get(id)));
+ }
+
+ @Override
+ protected List<Text> getEmptySlotTooltip() {
+ return Collections.singletonList(Text.localised(EMPTY_REPRESENTATION_SLOT_TOOLTIP));
+ }
+
+ @Override
+ public Function<List<String>, List<String>> getItemStackReplacementTooltip() {
+ if (mRecipeMap != null) {
+ List<String> tooltip = assembleItemStackReplacementTooltip(mRecipeMap);
+ return list -> tooltip;
+ }
+ return super.getItemStackReplacementTooltip();
+ }
+
+ @NotNull
+ private List<String> assembleItemStackReplacementTooltip(RecipeMap<?> recipeMap) {
+ List<String> tooltip = new ArrayList<>();
+ tooltip.add(
+ StatCollector.translateToLocal(TT_machineType) + ": "
+ + EnumChatFormatting.YELLOW
+ + StatCollector.translateToLocal(recipeMap.unlocalizedName)
+ + EnumChatFormatting.RESET);
+ int recipeSize = recipeMap.getAllRecipes()
+ .size();
+ if (recipeSize > 0) {
+ tooltip.add("Filter size: §e" + recipeSize + "§r");
+ }
+ tooltip.addAll(mTooltipCache.getData(REPRESENTATION_SLOT_TOOLTIP).text);
+ return tooltip;
+ }
+
+ @Override
+ protected SlotWidget createFilterIconSlot(BaseSlot slot) {
+ return new RecipeFilterIconSlotWidget(slot);
+ }
+
+ private class RecipeFilterIconSlotWidget extends FilterIconSlotWidget {
+
+ private static final int SYNC_RECIPEMAP_C2S = 98;
+ private static final int REQUEST_FILTERED_MACHINES_S2C = 99;
+
+ public RecipeFilterIconSlotWidget(BaseSlot slot) {
+ super(slot);
+ }
+
+ @Override
+ protected void phantomClick(ClickData clickData, ItemStack cursorStack) {}
+
+ // region client
+
+ @Override
+ public ClickResult onClick(int buttonId, boolean doubleClick) {
+ updateAndSendRecipeMapToServer(
+ getContext().getCursor()
+ .getItemStack());
+ return ClickResult.SUCCESS;
+ }
+
+ @Override
+ public boolean handleDragAndDrop(ItemStack draggedStack, int button) {
+ updateAndSendRecipeMapToServer(draggedStack);
+ draggedStack.stackSize = 0;
+ return true;
+ }
+
+ private void updateAndSendRecipeMapToServer(ItemStack stack) {
+ mRecipeMap = getItemStackMachineRecipeMap(stack);
+ updateAndSendRecipeMapToServer(mRecipeMap);
+ }
+
+ private void updateAndSendRecipeMapToServer(RecipeMap<?> recipeMap) {
+ if (recipeMap != null) {
+ filteredMachines = getFilteredMachines(recipeMap);
+ } else {
+ filteredMachines = new ArrayList<>();
+ mInventory[FILTER_SLOT_INDEX] = null;
+ }
+ mRotationIndex = -1;
+ syncToServer(SYNC_RECIPEMAP_C2S, buffer -> {
+ NetworkUtils.writeStringSafe(buffer, recipeMap != null ? recipeMap.unlocalizedName : null);
+ buffer.writeVarIntToBuffer(filteredMachines.size());
+ for (ItemStack filteredMachine : filteredMachines) {
+ NetworkUtils.writeItemStack(buffer, filteredMachine);
+ }
+ });
+ }
+
+ @Override
+ public void readOnClient(int id, PacketBuffer buf) {
+ if (id != REQUEST_FILTERED_MACHINES_S2C) {
+ super.readOnClient(id, buf);
+ return;
+ }
+
+ String recipeMapName = NetworkUtils.readStringSafe(buf);
+ mRecipeMap = recipeMapName != null ? RecipeMap.ALL_RECIPE_MAPS.get(recipeMapName) : null;
+ if (mRecipeMap != null) {
+ updateAndSendRecipeMapToServer(mRecipeMap);
+ }
+ }
+
+ // endregion
+
+ // region server
+
+ @Override
+ public void readOnServer(int id, PacketBuffer buf) throws IOException {
+ if (id != SYNC_RECIPEMAP_C2S) {
+ super.readOnServer(id, buf);
+ return;
+ }
+
+ String recipeMapName = NetworkUtils.readStringSafe(buf);
+ mRecipeMap = recipeMapName != null ? RecipeMap.getFromOldIdentifier(recipeMapName) : null;
+ mRotationIndex = -1;
+ mInventory[FILTER_SLOT_INDEX] = null;
+ filteredMachines.clear();
+
+ if (mRecipeMap != null) {
+ int filteredMachineSize = buf.readVarIntFromBuffer();
+ filteredMachineSize = Math.min(filteredMachineSize, 256); // Prevent storing too many items
+ for (int i = 0; i < filteredMachineSize; i++) {
+ ItemStack stack = NetworkUtils.readItemStack(buf);
+ if (stack != null) {
+ filteredMachines.add(stack);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void detectAndSendChanges(boolean init) {
+ super.detectAndSendChanges(init);
+ if (init && mRecipeMap != null && filteredMachines.isEmpty()) {
+ // backward compatibility: This machine used to store only mRecipeMap, not filteredMachines
+ syncToClient(
+ REQUEST_FILTERED_MACHINES_S2C,
+ buffer -> NetworkUtils.writeStringSafe(buffer, mRecipeMap.unlocalizedName));
+ }
+ }
+
+ // endregion
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Regulator.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Regulator.java
new file mode 100644
index 0000000000..08d3d32512
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_Regulator.java
@@ -0,0 +1,228 @@
+package gregtech.common.tileentities.automation;
+
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_REGULATOR;
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_REGULATOR_GLOW;
+
+import java.util.Collections;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Buffer;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Regulator extends GT_MetaTileEntity_Buffer {
+
+ public int[] mTargetSlots = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ private boolean charge = false, decharge = false;
+
+ public GT_MetaTileEntity_Regulator(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 20,
+ new String[] { "Filters up to 9 different Items", "Allows Item-specific output stack size",
+ "Allows Item-specific output slot" });
+ }
+
+ public GT_MetaTileEntity_Regulator(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Regulator(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Regulator(
+ this.mName,
+ this.mTier,
+ this.mInventory.length,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture getOverlayIcon() {
+ return TextureFactory.of(
+ TextureFactory.of(AUTOMATION_REGULATOR),
+ TextureFactory.builder()
+ .addIcon(AUTOMATION_REGULATOR_GLOW)
+ .glow()
+ .build());
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex < 9 || aIndex == rechargerSlotStartIndex();
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mTargetSlot1", this.mTargetSlots[0]);
+ aNBT.setInteger("mTargetSlot2", this.mTargetSlots[1]);
+ aNBT.setInteger("mTargetSlot3", this.mTargetSlots[2]);
+ aNBT.setInteger("mTargetSlot4", this.mTargetSlots[3]);
+ aNBT.setInteger("mTargetSlot5", this.mTargetSlots[4]);
+ aNBT.setInteger("mTargetSlot6", this.mTargetSlots[5]);
+ aNBT.setInteger("mTargetSlot7", this.mTargetSlots[6]);
+ aNBT.setInteger("mTargetSlot8", this.mTargetSlots[7]);
+ aNBT.setInteger("mTargetSlot9", this.mTargetSlots[8]);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mTargetSlots[0] = aNBT.getInteger("mTargetSlot1");
+ this.mTargetSlots[1] = aNBT.getInteger("mTargetSlot2");
+ this.mTargetSlots[2] = aNBT.getInteger("mTargetSlot3");
+ this.mTargetSlots[3] = aNBT.getInteger("mTargetSlot4");
+ this.mTargetSlots[4] = aNBT.getInteger("mTargetSlot5");
+ this.mTargetSlots[5] = aNBT.getInteger("mTargetSlot6");
+ this.mTargetSlots[6] = aNBT.getInteger("mTargetSlot7");
+ this.mTargetSlots[7] = aNBT.getInteger("mTargetSlot8");
+ this.mTargetSlots[8] = aNBT.getInteger("mTargetSlot9");
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ // Regulation per Screwdriver is overridden by GUI regulation.
+ }
+
+ @Override
+ public void moveItems(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ for (int i = 0, tCosts; i < 9; i++) {
+ if (this.mInventory[(i + 9)] != null) {
+ tCosts = GT_Utility.moveOneItemStackIntoSlot(
+ getBaseMetaTileEntity(),
+ getBaseMetaTileEntity().getTileEntityAtSide(getBaseMetaTileEntity().getBackFacing()),
+ getBaseMetaTileEntity().getBackFacing(),
+ this.mTargetSlots[i],
+ Collections.singletonList(this.mInventory[(i + 9)]),
+ false,
+ (byte) this.mInventory[(i + 9)].stackSize,
+ (byte) this.mInventory[(i + 9)].stackSize,
+ (byte) 64,
+ (byte) 1) * 3;
+ if (tCosts > 0) {
+ this.mSuccess = 50;
+ break;
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack) && aIndex >= 0
+ && aIndex <= 8
+ && GT_Utility.areStacksEqual(aStack, this.mInventory[(aIndex + 9)]);
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 19;
+ }
+
+ @Override
+ public int dechargerSlotStartIndex() {
+ return 19;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return charge ? 1 : 0;
+ }
+
+ @Override
+ public int dechargerSlotCount() {
+ return decharge ? 1 : 0;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+ charge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3;
+ decharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3;
+ }
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(createChargerSlot(43, 62));
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_22_RED.apply(84, true))
+ .setPos(65, 60)
+ .setSize(84, 22))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .startFromSlot(0)
+ .endAtSlot(8)
+ .build()
+ .setPos(7, 5))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SLOTS_HOLO_3BY3)
+ .setPos(62, 5)
+ .setSize(54, 54))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .phantom(true)
+ .startFromSlot(9)
+ .endAtSlot(17)
+ .applyForWidget(
+ widget -> widget.setControlsAmount(true)
+ .setBackground(GT_UITextures.TRANSPARENT))
+ .build()
+ .setPos(62, 5))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SLOTS_HOLO_3BY3)
+ .setPos(117, 5)
+ .setSize(54, 54));
+
+ int xBase = 117, yBase = 5;
+ for (int i = 0; i < mTargetSlots.length; i++) {
+ final int index = i;
+ int xPos = xBase + (i % 3) * 18, yPos = yBase + (i / 3) * 18;
+ builder.widget(new SlotWidget(BaseSlot.empty()) {
+
+ @Override
+ protected void phantomClick(ClickData clickData, ItemStack cursorStack) {
+ mTargetSlots[index] = Math.min(
+ 99,
+ Math.max(
+ 0,
+ mTargetSlots[index] + (clickData.mouseButton == 0 ? -1 : 1) * (clickData.shift ? 16 : 1)));
+ }
+ }.setBackground(GT_UITextures.TRANSPARENT)
+ .setPos(xPos, yPos))
+ .widget(
+ TextWidget.dynamicString(() -> String.valueOf(mTargetSlots[index]))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(xPos + 2 + (i % 3 == 0 ? 1 : 0), yPos + 3 + (i / 3 == 0 ? 1 : 0)));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_SuperBuffer.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_SuperBuffer.java
new file mode 100644
index 0000000000..9a1d2d7dcf
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_SuperBuffer.java
@@ -0,0 +1,105 @@
+package gregtech.common.tileentities.automation;
+
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_SUPERBUFFER;
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_SUPERBUFFER_GLOW;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_SuperBuffer extends GT_MetaTileEntity_ChestBuffer {
+
+ public GT_MetaTileEntity_SuperBuffer(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 257,
+ new String[] { "Buffers up to 256 Item Stacks", "Use Screwdriver to regulate output stack size",
+ getTickRateDesc(aTier) });
+ }
+
+ public GT_MetaTileEntity_SuperBuffer(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_SuperBuffer(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_SuperBuffer(
+ this.mName,
+ this.mTier,
+ this.mInventory.length,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture getOverlayIcon() {
+ return TextureFactory.of(
+ TextureFactory.of(AUTOMATION_SUPERBUFFER),
+ TextureFactory.builder()
+ .addIcon(AUTOMATION_SUPERBUFFER_GLOW)
+ .glow()
+ .build());
+ }
+
+ @Override
+ protected void fillStacksIntoFirstSlots() {
+ // no order, this is super buffer
+ HashMap<GT_Utility.ItemId, Integer> slots = new HashMap<>(mInventory.length);
+ HashMap<GT_Utility.ItemId, ItemStack> stacks = new HashMap<>(mInventory.length);
+ List<Integer> validSlots = new ArrayList<>(mInventory.length);
+ // List<String> order = new ArrayList<>(mInventory.length);
+ for (int i = 0; i < mInventory.length - 1; i++) {
+ if (!isValidSlot(i)) continue;
+ validSlots.add(i);
+ ItemStack s = mInventory[i];
+ if (s == null) continue;
+ GT_Utility.ItemId sID = GT_Utility.ItemId.createNoCopy(s);
+ slots.merge(sID, s.stackSize, Integer::sum);
+ if (!stacks.containsKey(sID)) stacks.put(sID, s);
+ // order.add(sID);
+ mInventory[i] = null;
+ }
+ int i = 0;
+ for (Map.Entry<GT_Utility.ItemId, Integer> entry : slots.entrySet()) {
+ do {
+ int slot = validSlots.get(i);
+ mInventory[slot] = stacks.get(entry.getKey())
+ .copy();
+ int toSet = Math.min(entry.getValue(), mInventory[slot].getMaxStackSize());
+ mInventory[slot].stackSize = toSet;
+ entry.setValue(entry.getValue() - toSet);
+ i++;
+ } while (entry.getValue() > 0);
+ }
+ }
+
+ @Override
+ protected void addMainUI(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SUPER_BUFFER)
+ .setPos(61, 4)
+ .setSize(54, 54));
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_TypeFilter.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_TypeFilter.java
new file mode 100644
index 0000000000..be4a2226a1
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_TypeFilter.java
@@ -0,0 +1,213 @@
+package gregtech.common.tileentities.automation;
+
+import static gregtech.api.enums.GT_Values.W;
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_TYPEFILTER;
+import static gregtech.api.enums.Textures.BlockIcons.AUTOMATION_TYPEFILTER_GLOW;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_SpecialFilter;
+import gregtech.api.objects.ItemData;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_TypeFilter extends GT_MetaTileEntity_SpecialFilter {
+
+ private static final String REPRESENTATION_SLOT_TOOLTIP = "GT5U.type_filter.representation_slot.tooltip";
+ public int mRotationIndex = 0;
+ public OrePrefixes mPrefix = OrePrefixes.ore;
+
+ public static ImmutableList<OrePrefixes> OREBLOCK_PREFIXES = ImmutableList.of(
+ OrePrefixes.oreBlackgranite,
+ OrePrefixes.oreDense,
+ OrePrefixes.oreEnd,
+ OrePrefixes.oreEndstone,
+ OrePrefixes.oreNether,
+ OrePrefixes.oreNetherrack,
+ OrePrefixes.oreNormal,
+ OrePrefixes.orePoor,
+ OrePrefixes.oreRedgranite,
+ OrePrefixes.oreRich,
+ OrePrefixes.oreSmall,
+ OrePrefixes.oreBasalt,
+ OrePrefixes.oreMarble);
+
+ public GT_MetaTileEntity_TypeFilter(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ new String[] { "Filters 1 Item Type", "Use Screwdriver to regulate output stack size" });
+ }
+
+ public GT_MetaTileEntity_TypeFilter(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_TypeFilter(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TypeFilter(
+ this.mName,
+ this.mTier,
+ this.mInventory.length,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture getOverlayIcon() {
+ return TextureFactory.of(
+ TextureFactory.of(AUTOMATION_TYPEFILTER),
+ TextureFactory.builder()
+ .addIcon(AUTOMATION_TYPEFILTER_GLOW)
+ .glow()
+ .build());
+ }
+
+ public void clickTypeIcon(boolean aRightClick, ItemStack aHandStack) {
+ if (getBaseMetaTileEntity().isServerSide()) {
+ if (aHandStack != null) {
+ copyHeldItemPrefix(aHandStack);
+ } else {
+ cyclePrefix(aRightClick);
+ }
+ }
+ }
+
+ private void copyHeldItemPrefix(ItemStack handStack) {
+ ItemData data = GT_OreDictUnificator.getAssociation(handStack);
+ if (data != null && data.hasValidPrefixData()) {
+ this.mPrefix = data.mPrefix;
+ this.mRotationIndex = -1;
+ }
+ }
+
+ private void cyclePrefix(boolean aRightClick) {
+ for (int i = 0; i < OrePrefixes.values().length; i++) {
+ if (this.mPrefix == OrePrefixes.values()[i]) {
+ for (this.mPrefix = null; this.mPrefix == null; this.mPrefix = OrePrefixes.values()[i]) {
+ if (aRightClick) {
+ do {
+ i--;
+ if (i < 0) {
+ i = OrePrefixes.values().length - 1;
+ }
+ } while (OrePrefixes.values()[i].mPrefixedItems.isEmpty());
+ } else {
+ do {
+ i++;
+ if (i >= OrePrefixes.values().length) {
+ i = 0;
+ }
+ } while (OrePrefixes.values()[i].mPrefixedItems.isEmpty());
+ }
+ if (!OrePrefixes.values()[i].mPrefixedItems.isEmpty()
+ && OrePrefixes.values()[i].mPrefixInto == OrePrefixes.values()[i])
+ mPrefix = OrePrefixes.values()[i];
+ }
+ }
+ this.mRotationIndex = -1;
+ }
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ if ((!getBaseMetaTileEntity().isServerSide()) || ((aTick % 8L != 0L) && mRotationIndex != -1)) return;
+ if (this.mPrefix.mPrefixedItems.isEmpty()) {
+ this.mInventory[FILTER_SLOT_INDEX] = null;
+ return;
+ }
+ this.mInventory[FILTER_SLOT_INDEX] = GT_Utility.copyAmount(
+ 1,
+ this.mPrefix.mPrefixedItems
+ .get(this.mRotationIndex = (this.mRotationIndex + 1) % this.mPrefix.mPrefixedItems.size()));
+ if (this.mInventory[FILTER_SLOT_INDEX] == null) return;
+ if (this.mInventory[FILTER_SLOT_INDEX].getItemDamage() == W) this.mInventory[9].setItemDamage(0);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setString("mPrefix", this.mPrefix.toString());
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mPrefix = OrePrefixes.getPrefix(aNBT.getString("mPrefix"), this.mPrefix);
+ }
+
+ @Override
+ protected boolean isStackAllowed(ItemStack aStack) {
+ if (this.mPrefix == OrePrefixes.ore) {
+ ItemData data = GT_OreDictUnificator.getItemData(aStack);
+ if (data != null && data.mPrefix != null && OREBLOCK_PREFIXES.contains(data.mPrefix)) {
+ return true;
+ }
+ }
+ return this.mPrefix.contains(aStack);
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(
+ new FakeSyncWidget.StringSyncer(
+ () -> this.mPrefix.toString(),
+ (prefix) -> this.mPrefix = OrePrefixes.getPrefix(prefix, this.mPrefix)));
+ }
+
+ @Override
+ protected Function<List<String>, List<String>> getItemStackReplacementTooltip() {
+ return (itemTooltip) -> {
+ List<String> replacementTooltip = new ArrayList<>();
+ replacementTooltip.add("Filter set to " + mPrefix.mRegularLocalName);
+ replacementTooltip.add("Ore prefix: §e" + mPrefix + "§r");
+ replacementTooltip.add("Filter size: §e" + mPrefix.mPrefixedItems.size() + "§r");
+ replacementTooltip.addAll(mTooltipCache.getData(REPRESENTATION_SLOT_TOOLTIP).text);
+ return replacementTooltip;
+ };
+ }
+
+ @Override
+ protected SlotWidget createFilterIconSlot(BaseSlot slot) {
+ return new TypeFilterIconSlotWidget(slot);
+ }
+
+ private class TypeFilterIconSlotWidget extends FilterIconSlotWidget {
+
+ public TypeFilterIconSlotWidget(BaseSlot slot) {
+ super(slot);
+ }
+
+ @Override
+ protected void phantomClick(ClickData clickData, ItemStack cursorStack) {
+ clickTypeIcon(clickData.mouseButton != 0, cursorStack);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler.java b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler.java
new file mode 100644
index 0000000000..6b245a9da1
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler.java
@@ -0,0 +1,516 @@
+package gregtech.common.tileentities.boilers;
+
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.modularui.IGetTitleColor;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder;
+import gregtech.common.GT_Pollution;
+
+public abstract class GT_MetaTileEntity_Boiler extends GT_MetaTileEntity_BasicTank
+ implements IGetTitleColor, IAddUIWidgets {
+
+ public static final byte SOUND_EVENT_LET_OFF_EXCESS_STEAM = 1;
+ public int mTemperature = 20;
+ public int mProcessingEnergy = 0;
+ public int mLossTimer = 0;
+ public FluidStack mSteam = null;
+ public boolean mHadNoWater = false;
+ private int mExcessWater = 0;
+
+ public GT_MetaTileEntity_Boiler(int aID, String aName, String aNameRegional, String aDescription,
+ ITexture... aTextures) {
+ super(aID, aName, aNameRegional, 0, 4, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Boiler(int aID, String aName, String aNameRegional, String[] aDescription,
+ ITexture... aTextures) {
+ super(aID, aName, aNameRegional, 0, 4, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Boiler(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Boiler(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ ITexture[] tmp;
+ if ((sideDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) { // Horizontal
+ if (sideDirection != facingDirection) tmp = mTextures[2][colorIndex + 1];
+ else tmp = mTextures[(byte) (active ? 4 : 3)][colorIndex + 1];
+ } else {
+ tmp = mTextures[sideDirection.ordinal()][colorIndex + 1];
+ }
+ if (sideDirection != facingDirection && tmp.length == 2) {
+ tmp = new ITexture[] { tmp[0] };
+ }
+ return tmp;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facingDirection) {
+ return (facingDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return this.mTemperature;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return 500;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ return true;
+ }
+ if (aPlayer != null) {
+ if (GT_Utility.areStacksEqual(aPlayer.getCurrentEquippedItem(), new ItemStack(Items.water_bucket, 1))) {
+ fill(Materials.Water.getFluid(1000L * (long) aPlayer.getCurrentEquippedItem().stackSize), true);
+
+ if (!aPlayer.capabilities.isCreativeMode) {
+ aPlayer.getCurrentEquippedItem()
+ .func_150996_a(Items.bucket);
+ }
+ } else {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return GT_ModHandler.isWater(aFluid);
+ }
+
+ @Override
+ public FluidStack getDrainableStack() {
+ return this.mSteam;
+ }
+
+ @Override
+ public FluidStack setDrainableStack(FluidStack aFluid) {
+ this.mSteam = aFluid;
+ return this.mSteam;
+ }
+
+ @Override
+ public boolean isDrainableStackSeparate() {
+ return true;
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCover) {
+ return GregTech_API.getCoverBehaviorNew(aCover.toStack())
+ .isSimpleCover();
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mLossTimer", this.mLossTimer);
+ aNBT.setInteger("mTemperature", this.mTemperature);
+ aNBT.setInteger("mProcessingEnergy", this.mProcessingEnergy);
+ aNBT.setInteger("mExcessWater", this.mExcessWater);
+ if (this.mSteam == null) {
+ return;
+ }
+ try {
+ aNBT.setTag("mSteam", this.mSteam.writeToNBT(new NBTTagCompound()));
+ } catch (Throwable ignored) {}
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.mLossTimer = aNBT.getInteger("mLossTimer");
+ this.mTemperature = aNBT.getInteger("mTemperature");
+ this.mProcessingEnergy = aNBT.getInteger("mProcessingEnergy");
+ this.mExcessWater = aNBT.getInteger("mExcessWater");
+ this.mSteam = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mSteam"));
+ }
+
+ /**
+ * Produce some steam. Assume water is present.
+ */
+ protected void produceSteam(int aAmount) {
+ mExcessWater -= aAmount;
+ if (mExcessWater < 0) {
+ int tWaterToConsume = -mExcessWater / GT_Values.STEAM_PER_WATER;
+ mFluid.amount -= tWaterToConsume;
+ mExcessWater += GT_Values.STEAM_PER_WATER * tWaterToConsume;
+ }
+ if (GT_ModHandler.isSteam(this.mSteam)) {
+ this.mSteam.amount += aAmount;
+ } else {
+ this.mSteam = GT_ModHandler.getSteam(aAmount);
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ pollute(aTick);
+
+ if (isNotAllowedToWork(aBaseMetaTileEntity, aTick)) return;
+
+ calculateCooldown();
+ pushSteamToInventories(aBaseMetaTileEntity);
+
+ if (canNotCreateSteam(aBaseMetaTileEntity, aTick)) {
+ pollute(aTick);
+ return;
+ }
+
+ ventSteamIfTankIsFull();
+ updateFuelTimed(aBaseMetaTileEntity, aTick);
+ calculateHeatUp(aBaseMetaTileEntity, aTick);
+ }
+
+ private boolean isNotAllowedToWork(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ return (!aBaseMetaTileEntity.isServerSide()) || (aTick <= 20L);
+ }
+
+ private void pollute(long aTick) {
+ if (this.mProcessingEnergy > 0 && (aTick % 20L == 0L)) {
+ GT_Pollution.addPollution(getBaseMetaTileEntity(), getPollution());
+ }
+ }
+
+ private void calculateHeatUp(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if ((this.mTemperature < getMaxTemperature()) && (this.mProcessingEnergy > 0)
+ && (aTick % getHeatUpRate() == 0L)) {
+ this.mProcessingEnergy -= getEnergyConsumption();
+ this.mTemperature += getHeatUpAmount();
+ }
+ aBaseMetaTileEntity.setActive(this.mProcessingEnergy > 0);
+ }
+
+ private void updateFuelTimed(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if ((this.mProcessingEnergy <= 0) && (aBaseMetaTileEntity.isAllowedToWork()))
+ updateFuel(aBaseMetaTileEntity, aTick);
+ }
+
+ protected void ventSteamIfTankIsFull() {
+ if ((this.mSteam != null) && (this.mSteam.amount > getSteamCapacity())) {
+ sendSound(SOUND_EVENT_LET_OFF_EXCESS_STEAM);
+ this.mSteam.amount = getSteamCapacity() * 3 / 4;
+ }
+ }
+
+ private boolean canNotCreateSteam(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aTick % 10L != 0L) {
+ return false;
+ }
+
+ if (this.mTemperature > 100) {
+ if ((!GT_ModHandler.isWater(this.mFluid)) || (this.mFluid.amount <= 0)) {
+ this.mHadNoWater = true;
+ } else {
+ if (this.mHadNoWater) {
+ GT_Log.exp.println("Boiler " + this.mName + " had no Water!");
+ onDangerousWaterLack(aBaseMetaTileEntity, aTick);
+ return true;
+ }
+ produceSteam(getProductionPerSecond() / 2);
+ }
+ } else {
+ this.mHadNoWater = false;
+ }
+ return false;
+ }
+
+ protected void onDangerousWaterLack(IGregTechTileEntity tile, long ignoredTicks) {
+ tile.doExplosion(2048L);
+ }
+
+ /**
+ * Pushes Steam to a Side of this Boiler
+ *
+ * @param aBaseMetaTileEntity The tile-entity instance of this Boiler
+ * @param side The direction of the side to push Steam to
+ */
+ protected final void pushSteamToSide(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side) {
+ if (mSteam == null || mSteam.amount == 0) return;
+ final IFluidHandler tTileEntity = aBaseMetaTileEntity.getITankContainerAtSide(side);
+ if (tTileEntity == null) return;
+ GT_Utility.moveFluid(aBaseMetaTileEntity, tTileEntity, side, Math.max(1, this.mSteam.amount / 2), null);
+ }
+
+ /**
+ * Pushes steam to Fluid inventories at all sides except Front and Bottom.
+ *
+ * @param aBaseMetaTileEntity The tile-entity instance of this Boiler
+ */
+ protected void pushSteamToInventories(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (mSteam == null || mSteam.amount == 0) return;
+ for (final ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
+ if (direction == aBaseMetaTileEntity.getFrontFacing() || direction == ForgeDirection.DOWN) continue;
+ if (this.mSteam == null) break;
+ pushSteamToSide(aBaseMetaTileEntity, direction);
+ }
+ }
+
+ private void calculateCooldown() {
+ if (this.mTemperature <= 20) {
+ this.mTemperature = 20;
+ this.mLossTimer = 0;
+ } else if (++this.mLossTimer > getCooldownInterval()) {
+ // only loss temperature if hot
+ this.mTemperature -= 1;
+ this.mLossTimer = 0;
+ }
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return GT_Mod.gregtechproxy.mAllowSmallBoilerAutomation;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return GT_Mod.gregtechproxy.mAllowSmallBoilerAutomation;
+ }
+
+ @Override
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ if (aIndex == GT_MetaTileEntity_Boiler.SOUND_EVENT_LET_OFF_EXCESS_STEAM) {
+ GT_Utility.doSoundAtClient(SoundResource.RANDOM_FIZZ, 2, 1.0F, aX, aY, aZ);
+
+ new ParticleEventBuilder().setIdentifier(ParticleFX.CLOUD)
+ .setWorld(getBaseMetaTileEntity().getWorld())
+ .setMotion(0D, 0D, 0D)
+ .<ParticleEventBuilder>times(
+ 8,
+ x -> x.setPosition(aX - 0.5D + XSTR_INSTANCE.nextFloat(), aY, aZ - 0.5D + XSTR_INSTANCE.nextFloat())
+ .run());
+ }
+ }
+
+ @Override
+ public int getTankPressure() {
+ return 100;
+ }
+
+ protected abstract int getPollution();
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ protected int getSteamCapacity() {
+ return getCapacity();
+ }
+
+ protected abstract int getProductionPerSecond();
+
+ protected abstract int getMaxTemperature();
+
+ protected abstract int getEnergyConsumption();
+
+ protected abstract int getCooldownInterval();
+
+ protected int getHeatUpRate() {
+ return 12;
+ }
+
+ protected int getHeatUpAmount() {
+ return 1;
+ }
+
+ protected abstract void updateFuel(IGregTechTileEntity aBaseMetaTileEntity, long aTick);
+
+ @Override
+ public SteamVariant getSteamVariant() {
+ return SteamVariant.BRONZE;
+ }
+
+ protected IDrawable[] getFuelSlotBackground() {
+ return new IDrawable[] { getGUITextureSet().getItemSlot(),
+ GT_UITextures.OVERLAY_SLOT_COAL_STEAM.get(getSteamVariant()) };
+ }
+
+ protected IDrawable[] getAshSlotBackground() {
+ return new IDrawable[] { getGUITextureSet().getItemSlot(),
+ GT_UITextures.OVERLAY_SLOT_DUST_STEAM.get(getSteamVariant()) };
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new SlotWidget(inventoryHandler, 0).setPos(43, 25)
+ .setBackground(getGUITextureSet().getItemSlot(), getOverlaySlotIn()))
+ .widget(
+ new SlotWidget(inventoryHandler, 1).setPos(43, 61)
+ .setBackground(getGUITextureSet().getItemSlot(), getOverlaySlotOut()))
+ .widget(createFuelSlot())
+ .widget(createAshSlot())
+ .widget(
+ new ProgressBar().setProgress(() -> mSteam == null ? 0 : (float) mSteam.amount / getSteamCapacity())
+ .setTexture(getProgressbarEmpty(), GT_UITextures.PROGRESSBAR_BOILER_STEAM, 10)
+ .setDirection(ProgressBar.Direction.UP)
+ .setPos(70, 25)
+ .setSize(10, 54))
+ .widget(
+ new ProgressBar().setProgress(() -> mFluid == null ? 0 : (float) mFluid.amount / getCapacity())
+ .setTexture(getProgressbarEmpty(), GT_UITextures.PROGRESSBAR_BOILER_WATER, 10)
+ .setDirection(ProgressBar.Direction.UP)
+ .setPos(83, 25)
+ .setSize(10, 54))
+ .widget(
+ new ProgressBar().setProgress(() -> (float) mTemperature / maxProgresstime())
+ .setTexture(getProgressbarEmpty(), GT_UITextures.PROGRESSBAR_BOILER_HEAT, 10)
+ .setDirection(ProgressBar.Direction.UP)
+ .setPos(96, 25)
+ .setSize(10, 54))
+ .widget(
+ new ProgressBar()
+ // cap minimum so that one can easily see there's fuel remaining
+ .setProgress(() -> mProcessingEnergy > 0 ? Math.max((float) mProcessingEnergy / 1000, 1f / 5) : 0)
+ .setTexture(getProgressbarFuel(), 14)
+ .setDirection(ProgressBar.Direction.UP)
+ .setPos(116, 45)
+ .setSize(14, 14))
+ .widget(
+ new DrawableWidget().setDrawable(getOverlaySlotCanister())
+ .setPos(43, 43)
+ .setSize(18, 18));
+ }
+
+ protected SlotWidget createFuelSlot() {
+ return (SlotWidget) new SlotWidget(inventoryHandler, 2).setPos(115, 61)
+ .setBackground(getFuelSlotBackground());
+ }
+
+ protected SlotWidget createAshSlot() {
+ return (SlotWidget) new SlotWidget(inventoryHandler, 3).setAccess(true, false)
+ .setPos(115, 25)
+ .setBackground(getAshSlotBackground());
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return GUITextureSet.STEAM.apply(getSteamVariant());
+ }
+
+ @Override
+ public int getTitleColor() {
+ return getSteamVariant() == SteamVariant.BRONZE ? COLOR_TITLE.get() : COLOR_TITLE_WHITE.get();
+ }
+
+ // for GT++
+
+ protected IDrawable getOverlaySlotIn() {
+ return GT_UITextures.OVERLAY_SLOT_IN_STEAM.get(getSteamVariant());
+ }
+
+ protected IDrawable getOverlaySlotOut() {
+ return GT_UITextures.OVERLAY_SLOT_OUT_STEAM.get(getSteamVariant());
+ }
+
+ protected IDrawable getOverlaySlotCanister() {
+ return GT_UITextures.OVERLAY_SLOT_CANISTER_STEAM.get(getSteamVariant());
+ }
+
+ protected UITexture getProgressbarEmpty() {
+ return GT_UITextures.PROGRESSBAR_BOILER_EMPTY_STEAM.get(getSteamVariant());
+ }
+
+ protected UITexture getProgressbarFuel() {
+ return GT_UITextures.PROGRESSBAR_FUEL_STEAM.get(getSteamVariant());
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Bronze.java b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Bronze.java
new file mode 100644
index 0000000000..9e746dc5e9
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Bronze.java
@@ -0,0 +1,311 @@
+package gregtech.common.tileentities.boilers;
+
+import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT;
+import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import net.minecraft.block.Block;
+import net.minecraft.tileentity.TileEntityFurnace;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.XSTR;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder;
+import gregtech.common.GT_Pollution;
+
+public class GT_MetaTileEntity_Boiler_Bronze extends GT_MetaTileEntity_Boiler {
+
+ public GT_MetaTileEntity_Boiler_Bronze(int aID, String aName, String aNameRegional) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ new String[] { "An early way to get Steam Power", "Produces 120L of Steam per second",
+ "Causes " + GT_Mod.gregtechproxy.mPollutionSmallCoalBoilerPerSecond + " Pollution per second" });
+ }
+
+ public GT_MetaTileEntity_Boiler_Bronze(int aID, String aName, String aNameRegional, String[] aDescription) {
+ super(aID, aName, aNameRegional, aDescription);
+ }
+
+ public GT_MetaTileEntity_Boiler_Bronze(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Boiler_Bronze(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[5][17][];
+ final ITexture[] texBottom = { TextureFactory.of(MACHINE_BRONZEBRICKS_BOTTOM) },
+ texTop = { TextureFactory.of(MACHINE_BRONZEBRICKS_TOP), TextureFactory.of(OVERLAY_PIPE) },
+ texSide = { TextureFactory.of(MACHINE_BRONZEBRICKS_SIDE), TextureFactory.of(OVERLAY_PIPE) },
+ texFront = { TextureFactory.of(MACHINE_BRONZEBRICKS_SIDE), TextureFactory.of(BOILER_FRONT),
+ TextureFactory.builder()
+ .addIcon(BOILER_FRONT_GLOW)
+ .glow()
+ .build() },
+ texFrontActive = { TextureFactory.of(MACHINE_BRONZEBRICKS_SIDE), TextureFactory.of(BOILER_FRONT_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(BOILER_FRONT_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ for (int i = 0; i < 17; i++) {
+ rTextures[0][i] = texBottom;
+ rTextures[1][i] = texTop;
+ rTextures[2][i] = texSide;
+ rTextures[3][i] = texFront;
+ rTextures[4][i] = texFrontActive;
+ }
+ return rTextures;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return 500;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boiler_Bronze(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ /**
+ * Draws random flames and smoke particles in front of active boiler
+ *
+ * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick}
+ */
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (aBaseMetaTileEntity.isActive()) {
+
+ final ForgeDirection frontFacing = aBaseMetaTileEntity.getFrontFacing();
+
+ if ((frontFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0
+ && aBaseMetaTileEntity.getCoverIDAtSide(frontFacing) == 0
+ && !aBaseMetaTileEntity.getOpacityAtSide(frontFacing)) {
+
+ final double oX = aBaseMetaTileEntity.getOffsetX(frontFacing, 1) + 8D / 16D;
+ final double oY = aBaseMetaTileEntity.getOffsetY(frontFacing, 1);
+ final double oZ = aBaseMetaTileEntity.getOffsetZ(frontFacing, 1) + 8D / 16D;
+ final double offset = -0.48D;
+ final double horizontal = XSTR_INSTANCE.nextFloat() * 10D / 16D - 5D / 16D;
+
+ final double x, y, z;
+
+ y = oY + XSTR_INSTANCE.nextFloat() * 6D / 16D;
+
+ if (frontFacing == ForgeDirection.WEST) {
+ x = oX - offset;
+ z = oZ + horizontal;
+ } else if (frontFacing == ForgeDirection.EAST) {
+ x = oX + offset;
+ z = oZ + horizontal;
+ } else if (frontFacing == ForgeDirection.NORTH) {
+ x = oX + horizontal;
+ z = oZ - offset;
+ } else // if (frontFacing == ForgeDirection.SOUTH)
+ {
+ x = oX + horizontal;
+ z = oZ + offset;
+ }
+
+ ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(0D, 0D, 0D)
+ .setPosition(x, y, z)
+ .setWorld(getBaseMetaTileEntity().getWorld());
+ particleEventBuilder.setIdentifier(ParticleFX.SMOKE)
+ .run();
+ particleEventBuilder.setIdentifier(ParticleFX.FLAME)
+ .run();
+ }
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if ((aBaseMetaTileEntity.isServerSide()) && (aTick > 20L)
+ && this.mProcessingEnergy > 0
+ && (aTick % 20L == 0L)) {
+ GT_Pollution.addPollution(getBaseMetaTileEntity(), getPollution());
+ }
+ }
+
+ @Override
+ protected int getPollution() {
+ return GT_Mod.gregtechproxy.mPollutionSmallCoalBoilerPerSecond;
+ }
+
+ @Override
+ protected int getProductionPerSecond() {
+ return 120;
+ }
+
+ @Override
+ protected int getMaxTemperature() {
+ return 500;
+ }
+
+ @Override
+ protected int getEnergyConsumption() {
+ return 1;
+ }
+
+ @Override
+ protected int getCooldownInterval() {
+ return 45;
+ }
+
+ @Override
+ protected void updateFuel(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (this.mInventory[2] == null) return;
+ if ((GT_Utility.isPartOfMaterials(this.mInventory[2], Materials.Coal)
+ && !GT_Utility.isPartOfOrePrefix(this.mInventory[2], OrePrefixes.block))
+ || (GT_Utility.isPartOfMaterials(this.mInventory[2], Materials.Charcoal)
+ && !GT_Utility.isPartOfOrePrefix(this.mInventory[2], OrePrefixes.block))
+ || (GT_Utility.isPartOfMaterials(this.mInventory[2], Materials.Lignite)
+ && !GT_Utility.isPartOfOrePrefix(this.mInventory[2], OrePrefixes.block))
+ || (GT_Utility.isPartOfMaterials(this.mInventory[2], Materials.Diamond)
+ && !GT_Utility.isPartOfOrePrefix(this.mInventory[2], OrePrefixes.block))
+ || GT_OreDictUnificator.isItemStackInstanceOf(this.mInventory[2], "fuelCoke")
+ || GT_OreDictUnificator.isItemStackInstanceOf(this.mInventory[2], "fuelCactusCharcoal")
+ || GT_OreDictUnificator.isItemStackInstanceOf(this.mInventory[2], "fuelCactusCoke")
+ || GT_OreDictUnificator.isItemStackInstanceOf(this.mInventory[2], "fuelSugarCharcoal")
+ || GT_OreDictUnificator.isItemStackInstanceOf(this.mInventory[2], "fuelSugarCoke")) {
+ if ((TileEntityFurnace.getItemBurnTime(this.mInventory[2]) / 10) > 0) {
+ this.mProcessingEnergy += (TileEntityFurnace.getItemBurnTime(this.mInventory[2]) / 10);
+ if (XSTR.XSTR_INSTANCE.nextInt(
+ GT_Utility.isPartOfMaterials(this.mInventory[2], Materials.Coal)
+ || GT_Utility.isPartOfMaterials(this.mInventory[2], Materials.Charcoal) ? 3
+ : GT_Utility.isPartOfMaterials(this.mInventory[2], Materials.Lignite) ? 8 : 2)
+ == 0) {
+ aBaseMetaTileEntity.addStackToSlot(
+ 3,
+ GT_OreDictUnificator.get(
+ OrePrefixes.dustTiny,
+ (GT_Utility.isPartOfMaterials(this.mInventory[2], Materials.Lignite)
+ || GT_Utility.isPartOfMaterials(this.mInventory[2], Materials.Coal)) ? Materials.DarkAsh
+ : Materials.Ash,
+ 1L));
+ }
+ aBaseMetaTileEntity.decrStackSize(2, 1);
+ }
+ } else if (
+ // If its a block of the following materials
+ GT_OreDictUnificator.isItemStackInstanceOf(this.mInventory[2], OrePrefixes.block.get(Materials.Coal))
+ || GT_OreDictUnificator.isItemStackInstanceOf(this.mInventory[2], OrePrefixes.block.get(Materials.Lignite))
+ || GT_OreDictUnificator.isItemStackInstanceOf(this.mInventory[2], OrePrefixes.block.get(Materials.Charcoal))
+ || GT_OreDictUnificator.isItemStackInstanceOf(this.mInventory[2], OrePrefixes.block.get(Materials.Diamond))
+ ||
+
+ // if its either a Railcraft Coke Block or a custom GTNH compressed Coal/charcoal/lignite/coke block
+ (Block.getBlockFromItem(this.mInventory[2].getItem()) != null && // check if the block exists
+ (Block.getBlockFromItem(this.mInventory[2].getItem())
+ .getUnlocalizedName()
+ .toLowerCase()
+ .contains("tile") && // check if the block is a tile -> block
+ (
+ // If the name of the block contains these names
+ Block.getBlockFromItem(this.mInventory[2].getItem())
+ .getUnlocalizedName()
+ .toLowerCase()
+ .contains("charcoal")
+ || Block.getBlockFromItem(this.mInventory[2].getItem())
+ .getUnlocalizedName()
+ .toLowerCase()
+ .contains("coal")
+ || Block.getBlockFromItem(this.mInventory[2].getItem())
+ .getUnlocalizedName()
+ .toLowerCase()
+ .contains("diamond")
+ || Block.getBlockFromItem(this.mInventory[2].getItem())
+ .getUnlocalizedName()
+ .toLowerCase()
+ .contains("coke")
+ || Block.getBlockFromItem(this.mInventory[2].getItem())
+ .getUnlocalizedName()
+ .toLowerCase()
+ .contains("railcraft.cube")
+ || Block.getBlockFromItem(this.mInventory[2].getItem())
+ .getUnlocalizedName()
+ .toLowerCase()
+ .contains("lignite"))))) {
+ // try to add 10% of the burnvalue as Processing energy, no boost
+ // for coal coke here
+ if ((TileEntityFurnace.getItemBurnTime(this.mInventory[2]) / 10) > 0) {
+ this.mProcessingEnergy += (TileEntityFurnace.getItemBurnTime(this.mInventory[2])
+ / 10);
+ aBaseMetaTileEntity.addStackToSlot(
+ 3,
+ GT_OreDictUnificator.get(
+ OrePrefixes.dust,
+ (GT_Utility.isPartOfMaterials(this.mInventory[2], Materials.Lignite)
+ || GT_Utility.isPartOfMaterials(this.mInventory[2], Materials.Coal)
+ || Block.getBlockFromItem(this.mInventory[2].getItem())
+ .getUnlocalizedName()
+ .toLowerCase()
+ .contains("coal")
+ || Block.getBlockFromItem(this.mInventory[2].getItem())
+ .getUnlocalizedName()
+ .toLowerCase()
+ .contains("lignite")) ? Materials.DarkAsh : Materials.Ash,
+ 1L));
+ aBaseMetaTileEntity.decrStackSize(2, 1);
+ }
+ // enables every other fuel with at least 2000 burntime as a fuel,
+ // i.e. peat, Magic/Solid Super Fuel, Coal
+ // Singularities, Nitor, while bucket of creosite should be blocked
+ // same goes for lava
+ } else
+ if ((TileEntityFurnace.getItemBurnTime(this.mInventory[2])) >= 2000
+ && !(this.mInventory[2].getUnlocalizedName()
+ .toLowerCase()
+ .contains("bucket")
+ || this.mInventory[2].getUnlocalizedName()
+ .toLowerCase()
+ .contains("cell"))) {
+ this.mProcessingEnergy += (TileEntityFurnace.getItemBurnTime(this.mInventory[2]) / 10);
+ // adds tiny pile of ash for burntime under 10k, small pile for
+ // under 100k and pile for
+ // bigger values
+ if (XSTR.XSTR_INSTANCE.nextInt(2) == 0)
+ aBaseMetaTileEntity.addStackToSlot(
+ 3,
+ GT_OreDictUnificator.get(
+ (TileEntityFurnace.getItemBurnTime(this.mInventory[2]) >= 10000
+ ? TileEntityFurnace.getItemBurnTime(this.mInventory[2]) >= 100000
+ ? OrePrefixes.dust
+ : OrePrefixes.dustSmall
+ : OrePrefixes.dustTiny),
+ Materials.Ash,
+ 1L));
+ aBaseMetaTileEntity.decrStackSize(2, 1);
+ }
+ }
+
+ @Override
+ public SteamVariant getSteamVariant() {
+ return SteamVariant.BRONZE;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Lava.java b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Lava.java
new file mode 100644
index 0000000000..7fe3a3f4bb
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Lava.java
@@ -0,0 +1,524 @@
+package gregtech.common.tileentities.boilers;
+
+import static gregtech.api.enums.Textures.BlockIcons.BOILER_LAVA_FRONT;
+import static gregtech.api.enums.Textures.BlockIcons.BOILER_LAVA_FRONT_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.BOILER_LAVA_FRONT_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.BOILER_LAVA_FRONT_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.FLUID_IN_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.FLUID_OUT_SIGN;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DRAIN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import net.minecraft.block.Block;
+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.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTank;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidContainerItem;
+import net.minecraftforge.fluids.IFluidHandler;
+import net.minecraftforge.fluids.IFluidTank;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder;
+
+public class GT_MetaTileEntity_Boiler_Lava extends GT_MetaTileEntity_Boiler {
+
+ public static final int COOLDOWN_INTERVAL = 20;
+ public static final int ENERGY_PER_LAVA = 1;
+ public static final int CONSUMPTION_PER_HEATUP = 3;
+ public static final int PRODUCTION_PER_SECOND = 600;
+ private final FluidTank lavaTank = new LavaTank(null, getCapacity());
+ private int mCooledLava = 0;
+
+ public GT_MetaTileEntity_Boiler_Lava(int aID, String aName, String aNameRegional) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ new String[] { "A Boiler running off Lava", "Produces " + PRODUCTION_PER_SECOND + "L of Steam per second",
+ "Causes " + GT_Mod.gregtechproxy.mPollutionHighPressureLavaBoilerPerSecond + " Pollution per second",
+ "Consumes " + ((double) CONSUMPTION_PER_HEATUP / ENERGY_PER_LAVA)
+ + "L of Lava every "
+ + COOLDOWN_INTERVAL
+ + " ticks when fully heat up" });
+ }
+
+ public GT_MetaTileEntity_Boiler_Lava(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Boiler_Lava(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ final ForgeDirection rearDirection = facingDirection.getOpposite();
+ final ITexture[] tmp;
+ if ((sideDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) {
+ if (sideDirection == facingDirection) {
+ if (active) tmp = mTextures[4][colorIndex + 1];
+ else tmp = mTextures[3][colorIndex + 1];
+ } else if (sideDirection == rearDirection) {
+ tmp = mTextures[5][colorIndex + 1];
+ } else {
+ tmp = mTextures[2][colorIndex + 1];
+ }
+ } else tmp = mTextures[sideDirection.ordinal()][colorIndex + 1];
+ if (sideDirection != facingDirection && tmp.length == 2) {
+ return new ITexture[] { tmp[0] };
+ }
+ return tmp;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[6][17][];
+ for (byte color = -1; color < 16; color++) {
+ int i = color + 1;
+ short[] colorModulation = Dyes.getModulation(color, Dyes._NULL.mRGBa);
+ rTextures[0][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_BOTTOM, colorModulation) };
+ rTextures[1][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_TOP, colorModulation),
+ TextureFactory.of(OVERLAY_DRAIN), TextureFactory.of(FLUID_IN_SIGN) };
+ rTextures[2][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_SIDE, colorModulation),
+ TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(FLUID_IN_SIGN) };
+ rTextures[3][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_SIDE, colorModulation),
+ TextureFactory.of(BOILER_LAVA_FRONT, colorModulation), TextureFactory.of(BOILER_LAVA_FRONT_GLOW) };
+ rTextures[4][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_SIDE, colorModulation),
+ TextureFactory.of(BOILER_LAVA_FRONT_ACTIVE), TextureFactory.builder()
+ .addIcon(BOILER_LAVA_FRONT_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ rTextures[5][i] = new ITexture[] { TextureFactory.of(MACHINE_STEELBRICKS_SIDE, colorModulation),
+ TextureFactory.of(OVERLAY_PIPE_OUT), TextureFactory.of(FLUID_OUT_SIGN) };
+ }
+ return rTextures;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return 1000;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 32000;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boiler_Lava(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ protected int getPollution() {
+ return GT_Mod.gregtechproxy.mPollutionHighPressureLavaBoilerPerSecond;
+ }
+
+ @Override
+ protected int getProductionPerSecond() {
+ return PRODUCTION_PER_SECOND;
+ }
+
+ @Override
+ protected int getMaxTemperature() {
+ return 1000;
+ }
+
+ @Override
+ protected int getEnergyConsumption() {
+ this.mCooledLava += CONSUMPTION_PER_HEATUP;
+ return CONSUMPTION_PER_HEATUP;
+ }
+
+ @Override
+ protected int getCooldownInterval() {
+ return COOLDOWN_INTERVAL;
+ }
+
+ /**
+ * Attempts to fill an {@link IFluidTank} from the {@link FluidStack} content of an {@link ItemStack}
+ *
+ * @param destinationIFluidTank The destination {@link IFluidTank} to fill
+ * @param SourceItemStack The source {@link ItemStack} containing the Fluid
+ * @return The {@link ItemStack} of the Empty version of the source {@link ItemStack} or {@code null} if none
+ */
+ public static ItemStack fillIFluidTankFromItemStack(IFluidTank destinationIFluidTank, ItemStack SourceItemStack) {
+ if (destinationIFluidTank == null || SourceItemStack == null) return null;
+
+ final FluidStack containedFluidStack = GT_Utility.getFluidForFilledItem(SourceItemStack, true);
+ if (containedFluidStack == null || containedFluidStack.amount == 0) return null;
+
+ final int fillableAmount = destinationIFluidTank.fill(containedFluidStack, false);
+ if (fillableAmount <= 0) return null;
+
+ final Item containerItem = SourceItemStack.getItem();
+ if (containerItem instanceof IFluidContainerItem equippedIFluidContainerItem) {
+ destinationIFluidTank.fill(equippedIFluidContainerItem.drain(SourceItemStack, fillableAmount, true), true);
+ return null;
+ } else {
+ final ItemStack emptyContainerItemStack = GT_Utility.getContainerForFilledItem(SourceItemStack, false);
+ destinationIFluidTank.fill(containedFluidStack, true);
+ return emptyContainerItemStack;
+ }
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide() || aPlayer == null) return true;
+
+ final ItemStack equippedItemStack = aPlayer.getCurrentEquippedItem();
+ final FluidStack equippedContainerFluidStack = GT_Utility.getFluidForFilledItem(equippedItemStack, true);
+ final ItemStack returnedItemStack;
+ final IFluidTank tank;
+
+ if (GT_ModHandler.isWater(equippedContainerFluidStack)) {
+ tank = this;
+ } else if (GT_ModHandler.isLava(equippedContainerFluidStack)) {
+ tank = lavaTank;
+ } else {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+ returnedItemStack = fillIFluidTankFromItemStack(tank, equippedItemStack);
+ if (returnedItemStack != null && !aPlayer.capabilities.isCreativeMode) {
+ if (equippedItemStack.stackSize > 1) {
+ if (!aPlayer.inventory.addItemStackToInventory(returnedItemStack)) {
+ aBaseMetaTileEntity.getWorld()
+ .spawnEntityInWorld(
+ new EntityItem(
+ aBaseMetaTileEntity.getWorld(),
+ (double) aBaseMetaTileEntity.getXCoord() + 0.5D,
+ (double) aBaseMetaTileEntity.getYCoord() + 1.5D,
+ (double) aBaseMetaTileEntity.getZCoord() + 0.5D,
+ equippedItemStack));
+ } else if (aPlayer instanceof EntityPlayerMP) {
+ ((EntityPlayerMP) aPlayer).sendContainerToPlayer(aPlayer.inventoryContainer);
+ }
+ aPlayer.inventory.decrStackSize(aPlayer.inventory.currentItem, 1);
+ } else {
+ aPlayer.inventory.setInventorySlotContents(aPlayer.inventory.currentItem, returnedItemStack);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ if (lavaTank.getFluid() != null) aNBT.setTag(
+ "mLava",
+ lavaTank.getFluid()
+ .writeToNBT(new NBTTagCompound()));
+ aNBT.setInteger("mCooledLava", this.mCooledLava);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ lavaTank.setFluid(FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mLava")));
+ this.mCooledLava = aNBT.getInteger("mCooledLava");
+ }
+
+ /**
+ * Pushes steam to Fluid inventory at the rear.
+ *
+ * @param aBaseMetaTileEntity The tile-entity instance of this Lava Boiler
+ */
+ @Override
+ protected void pushSteamToInventories(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (mSteam == null || mSteam.amount == 0) return;
+ pushSteamToSide(
+ aBaseMetaTileEntity,
+ aBaseMetaTileEntity.getFrontFacing()
+ .getOpposite());
+ }
+
+ /**
+ * Drains Lava from Fluid inventory on top
+ *
+ * @param aBaseMetaTileEntity The tile-entity instance of this Lava Boiler
+ */
+ protected void drainLava(IGregTechTileEntity aBaseMetaTileEntity) {
+ final IFluidHandler upTank = aBaseMetaTileEntity.getITankContainerAtSide(ForgeDirection.UP);
+ if (upTank == null) return;
+ // Simulates drain of maximum lava amount up to 1000L that can fit the internal tank
+ final FluidStack drainableLavaStack = upTank.drain(
+ ForgeDirection.DOWN,
+ FluidRegistry.getFluidStack(
+ "lava",
+ Math.min(
+ this.lavaTank.getCapacity()
+ - (this.lavaTank.getFluid() != null ? this.lavaTank.getFluid().amount : 0),
+ 1000)),
+ false);
+ if (!GT_ModHandler.isLava(drainableLavaStack) || drainableLavaStack.amount <= 0) return;
+ // Performs actual drain up and fill internal tank
+ this.lavaTank.fill(upTank.drain(ForgeDirection.DOWN, drainableLavaStack, true), true);
+ }
+
+ /**
+ * Processes cooled Lava into Obsidian
+ *
+ * @return success | failure when cannot output
+ */
+ private boolean lavaToObsidian() {
+ if (this.mCooledLava >= 1000) {
+ if (getBaseMetaTileEntity().addStackToSlot(3, new ItemStack(Blocks.obsidian, 1))) {
+ this.mCooledLava -= 1000;
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Draws random flames and smoke particles in front of this Lava Boiler when it is active
+ *
+ * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick}
+ */
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (aBaseMetaTileEntity.isActive()) {
+
+ final ForgeDirection frontFacing = aBaseMetaTileEntity.getFrontFacing();
+
+ if ((frontFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0
+ && aBaseMetaTileEntity.getCoverIDAtSide(frontFacing) == 0
+ && !aBaseMetaTileEntity.getOpacityAtSide(frontFacing)) {
+
+ final double oX = aBaseMetaTileEntity.getOffsetX(frontFacing, 1) + 8D / 16D;
+ final double oY = aBaseMetaTileEntity.getOffsetY(frontFacing, 1);
+ final double oZ = aBaseMetaTileEntity.getOffsetZ(frontFacing, 1) + 8D / 16D;
+ final double offset = -0.48D;
+ final double horizontal = XSTR_INSTANCE.nextFloat() * 10D / 16D - 5D / 16D;
+
+ final double x, y, z;
+
+ y = oY + XSTR_INSTANCE.nextFloat() * 6D / 16D;
+
+ switch (frontFacing) {
+ case WEST -> {
+ x = oX - offset;
+ z = oZ + horizontal;
+ }
+ case EAST -> {
+ x = oX + offset;
+ z = oZ + horizontal;
+ }
+ case NORTH -> {
+ x = oX + horizontal;
+ z = oZ - offset;
+ }
+ default -> { // case SOUTH:
+ x = oX + horizontal;
+ z = oZ + offset;
+ }
+ }
+
+ ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(0D, 0D, 0D)
+ .setPosition(x, y, z)
+ .setWorld(getBaseMetaTileEntity().getWorld());
+ particleEventBuilder.setIdentifier(ParticleFX.SMOKE)
+ .run();
+ particleEventBuilder.setIdentifier(ParticleFX.FLAME)
+ .run();
+ }
+ }
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return GT_ModHandler.isWater(aFluid) || GT_ModHandler.isLava(aFluid);
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (!aBaseMetaTileEntity.isServerSide()) return;
+ final FluidStack containedFluidStack = GT_Utility.getFluidForFilledItem(mInventory[getInputSlot()], true);
+ if (GT_ModHandler.isWater(containedFluidStack)) super.onPreTick(aBaseMetaTileEntity, aTick);
+ if (GT_ModHandler.isLava(containedFluidStack)
+ && lavaTank.fill(containedFluidStack, false) == containedFluidStack.amount
+ && aBaseMetaTileEntity.addStackToSlot(
+ getOutputSlot(),
+ GT_Utility.getContainerForFilledItem(mInventory[getInputSlot()], true),
+ 1)) {
+ lavaTank.fill(containedFluidStack, true);
+ aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1);
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aTick % 20 == 0) drainLava(aBaseMetaTileEntity);
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ if (aIndex != GT_MetaTileEntity_Boiler.SOUND_EVENT_LET_OFF_EXCESS_STEAM) return;
+
+ final ForgeDirection rearDirection = getBaseMetaTileEntity().getFrontFacing()
+ .getOpposite();
+ GT_Utility.doSoundAtClient(
+ SoundResource.RANDOM_FIZZ,
+ 2,
+ 1.0F,
+ // Sound emitted from center of rear face (Steam Output)
+ aX + 0.5 * rearDirection.offsetX,
+ aY,
+ aZ + 0.5 * rearDirection.offsetZ);
+
+ new ParticleEventBuilder().setIdentifier(ParticleFX.CLOUD)
+ .setWorld(getBaseMetaTileEntity().getWorld())
+ // Particles emitted with a 1 block/s velocity toward rear
+ .setMotion(rearDirection.offsetX / 20D, 0D, rearDirection.offsetZ / 20D)
+ .<ParticleEventBuilder>times(
+ 8,
+ // Particles emitted from center of rear face (Steam Output)
+ x -> x.setPosition(aX + rearDirection.offsetX / 2D, aY, aZ + rearDirection.offsetZ / 2D)
+ .run());
+ }
+
+ @Override
+ protected void updateFuel(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (!lavaToObsidian()) return;
+ if (lavaTank.getFluid() == null || lavaTank.getFluid().amount <= 0) return;
+ final int amountToDrain = Math.min(lavaTank.getFluid().amount, 1000);
+ final FluidStack drainedLava = lavaTank.drain(amountToDrain, false);
+ if (drainedLava == null || drainedLava.amount == 0) return;
+ lavaTank.drain(amountToDrain, true);
+ this.mProcessingEnergy += drainedLava.amount * ENERGY_PER_LAVA;
+ }
+
+ @Override
+ public SteamVariant getSteamVariant() {
+ return SteamVariant.STEEL;
+ }
+
+ @Override
+ public int fill(FluidStack aFluid, boolean doFill) {
+ if (GT_ModHandler.isWater(aFluid)) return super.fill(aFluid, doFill);
+ if (GT_ModHandler.isLava(aFluid)) return lavaTank.fill(aFluid, doFill);
+ return 0;
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection side) {
+ return new FluidTankInfo[] { super.getTankInfo(side)[0],
+ new FluidTankInfo(this.lavaTank.getFluid(), this.lavaTank.getCapacity()),
+ new FluidTankInfo(getDrainableStack(), getSteamCapacity()) };
+ }
+
+ @Override
+ protected IDrawable[] getAshSlotBackground() {
+ return new IDrawable[] { getGUITextureSet().getItemSlot(),
+ GT_UITextures.OVERLAY_SLOT_BLOCK_STEAM.get(getSteamVariant()) };
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new SlotWidget(inventoryHandler, 0).setPos(43, 25)
+ .setBackground(getGUITextureSet().getItemSlot(), getOverlaySlotIn()))
+ .widget(
+ new SlotWidget(inventoryHandler, 1).setAccess(true, false)
+ .setPos(43, 61)
+ .setBackground(getGUITextureSet().getItemSlot(), getOverlaySlotOut()))
+ .widget(
+ new FluidSlotWidget(lavaTank).setBackground(getGUITextureSet().getFluidSlot(), getOverlaySlotIn())
+ .setPos(115, 61))
+ .widget(createAshSlot())
+ .widget(
+ new ProgressBar().setProgress(() -> mSteam == null ? 0 : (float) mSteam.amount / getSteamCapacity())
+ .setTexture(getProgressbarEmpty(), GT_UITextures.PROGRESSBAR_BOILER_STEAM, 10)
+ .setDirection(ProgressBar.Direction.UP)
+ .setPos(70, 25)
+ .setSize(10, 54))
+ .widget(
+ new ProgressBar().setProgress(() -> mFluid == null ? 0 : (float) mFluid.amount / getCapacity())
+ .setTexture(getProgressbarEmpty(), GT_UITextures.PROGRESSBAR_BOILER_WATER, 10)
+ .setDirection(ProgressBar.Direction.UP)
+ .setPos(83, 25)
+ .setSize(10, 54))
+ .widget(
+ new ProgressBar().setProgress(() -> (float) mTemperature / maxProgresstime())
+ .setTexture(getProgressbarEmpty(), GT_UITextures.PROGRESSBAR_BOILER_HEAT, 10)
+ .setDirection(ProgressBar.Direction.UP)
+ .setPos(96, 25)
+ .setSize(10, 54))
+ .widget(
+ new ProgressBar()
+ // cap minimum so that one can easily see there's fuel remaining
+ .setProgress(() -> mProcessingEnergy > 0 ? Math.max((float) mProcessingEnergy / 1000, 1f / 5) : 0)
+ .setTexture(getProgressbarFuel(), 14)
+ .setDirection(ProgressBar.Direction.UP)
+ .setPos(116, 45)
+ .setSize(14, 14))
+ .widget(
+ new DrawableWidget().setDrawable(getOverlaySlotCanister())
+ .setPos(43, 43)
+ .setSize(18, 18));
+ }
+
+ static class LavaTank extends FluidTank {
+
+ public LavaTank(FluidStack stack, int capacity) {
+ super(stack, capacity);
+ }
+
+ @Override
+ public int fill(FluidStack resource, boolean doFill) {
+ return GT_ModHandler.isLava(resource) ? super.fill(resource, doFill) : 0;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar.java b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar.java
new file mode 100644
index 0000000000..f5c59330ed
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar.java
@@ -0,0 +1,381 @@
+package gregtech.common.tileentities.boilers;
+
+import static gregtech.api.GregTech_API.sMachineFile;
+import static gregtech.api.enums.ConfigCategories.machineconfig;
+import static mcp.mobius.waila.api.SpecialChars.GOLD;
+import static mcp.mobius.waila.api.SpecialChars.RESET;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+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;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GT_MetaTileEntity_Boiler_Solar extends GT_MetaTileEntity_Boiler {
+
+ public static final String LPS_FMT = "%s L/s";
+ private static final String localizedDescFormat = GT_LanguageManager.addStringLocalization(
+ "gt.blockmachines.boiler.solar.desc.format",
+ "Steam Power by the Sun%n" + "Produces %sL of Steam per second%n"
+ + "Calcifies over time, reducing Steam output to %sL/s%n"
+ + "Break and replace to descale");
+ protected final Config mConfig;
+ protected final int basicTemperatureMod = 5; // Base Celsius gain or loss
+ private int mRunTimeTicks = 0;
+
+ public GT_MetaTileEntity_Boiler_Solar(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, new String[0]);
+ mConfig = createConfig();
+ }
+
+ public GT_MetaTileEntity_Boiler_Solar(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ mConfig = createConfig();
+ }
+
+ public GT_MetaTileEntity_Boiler_Solar(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ mConfig = createConfig();
+ }
+
+ protected GT_MetaTileEntity_Boiler_Solar(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures,
+ Config aConfig) {
+ super(aName, aTier, aDescription, aTextures);
+ mConfig = aConfig;
+ }
+
+ protected Config createConfig() {
+ return new Config(machineconfig + ".boiler.solar.bronze", 1080000, 40, 120, 45);
+ }
+
+ public int getMaxOutputPerSecond() {
+ return mConfig.getMaxOutputPerSecond();
+ }
+
+ @Override
+ public String[] getDescription() {
+ return String
+ .format(
+ localizedDescFormat,
+ GT_Utility.formatNumbers(getMaxOutputPerSecond()),
+ GT_Utility.formatNumbers(getMinOutputPerSecond()))
+ .split("\\R");
+ }
+
+ public int getMinOutputPerSecond() {
+ return mConfig.getMinOutputPerSecond();
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[4][17][];
+ for (int color = -1; color < 16; color++) {
+ int i = color + 1;
+ short[] colorModulation = Dyes.getModulation(color, Dyes._NULL.mRGBa);
+ rTextures[0][i] = new ITexture[] {
+ TextureFactory.of(BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM, colorModulation) };
+ rTextures[1][i] = new ITexture[] { TextureFactory.of(BlockIcons.MACHINE_BRONZEBRICKS_TOP, colorModulation),
+ TextureFactory.of(BlockIcons.BOILER_SOLAR) };
+ rTextures[2][i] = new ITexture[] {
+ TextureFactory.of(BlockIcons.MACHINE_BRONZEBRICKS_SIDE, colorModulation) };
+ rTextures[3][i] = new ITexture[] { TextureFactory.of(BlockIcons.MACHINE_BRONZEBRICKS_SIDE, colorModulation),
+ TextureFactory.of(BlockIcons.OVERLAY_PIPE) };
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ final int i = colorIndex + 1;
+ if ((sideDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0) { // Horizontal
+ if (sideDirection != facingDirection) return mTextures[2][i];
+ return mTextures[3][i];
+ }
+ return mTextures[sideDirection.ordinal()][i];
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return 500;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mRunTime", mRunTimeTicks);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mRunTimeTicks = aNBT.getInteger("mRunTime");
+ }
+
+ @Override
+ protected void produceSteam(int aAmount) {
+ super.produceSteam(aAmount);
+ // Disable calcification when using distilled water
+ if (mFluid.isFluidEqual(GT_ModHandler.getWater(1))) {
+ // produceSteam is getting called every 10 ticks
+ if (mRunTimeTicks >= 0 && mRunTimeTicks < (Integer.MAX_VALUE - 10)) mRunTimeTicks += 10;
+ else mRunTimeTicks = Integer.MAX_VALUE; // Prevent Integer overflow wrap
+ }
+ }
+
+ @Override
+ protected void pushSteamToInventories(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (mSteam == null || mSteam.amount == 0) return;
+ pushSteamToSide(aBaseMetaTileEntity, aBaseMetaTileEntity.getFrontFacing());
+ }
+
+ @Override
+ protected int getPollution() {
+ return 0;
+ }
+
+ @Override
+ public int getProductionPerSecond() {
+ if (mTemperature < 100) {
+ return 0;
+ }
+ if (mRunTimeTicks > mConfig.getMaxRuntimeTicks()) {
+ return mConfig.getMinOutputPerSecond();
+ } else if (mRunTimeTicks > mConfig.getCalcificationTicks()) {
+ /*
+ * When reaching calcification ticks; discount the proportion of run-time spent on calcification from the
+ * maximum output per second, and return this or the minimum output per second
+ */
+ return mConfig.getMaxOutputPerSecond()
+ - mConfig.getMaxOutputPerSecond() * (mRunTimeTicks - mConfig.getCalcificationTicks())
+ / mConfig.getCalcificationTicks();
+ } else {
+ return mConfig.getMaxOutputPerSecond();
+ }
+ }
+
+ @Override
+ protected int getMaxTemperature() {
+ return 500;
+ }
+
+ @Override
+ protected int getEnergyConsumption() {
+ return basicTemperatureMod;
+ }
+
+ @Override
+ protected int getCooldownInterval() {
+ return mConfig.getCoolDownTicks() / basicTemperatureMod;
+ }
+
+ @Override
+ protected int getHeatUpAmount() {
+ return basicTemperatureMod;
+ }
+
+ @Override
+ protected void updateFuel(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ World world = aBaseMetaTileEntity.getWorld();
+ // Heat-up every 12s (240 ticks), has to be multiple of 20 ticks
+ if ((aTick % 240L != 0L) || (world.isThundering())) {
+ return;
+ }
+ if (!aBaseMetaTileEntity.getSkyAtSide(ForgeDirection.UP)) {
+ return;
+ }
+ boolean weatherClear = !world.isRaining() || aBaseMetaTileEntity.getBiome().rainfall == 0.0F;
+ if (!weatherClear && world.skylightSubtracted >= 4) {
+ return;
+ }
+ if (weatherClear) {
+ if (world.isDaytime()) {
+ mProcessingEnergy += 8 * basicTemperatureMod;
+ } else {
+ mProcessingEnergy += basicTemperatureMod;
+ }
+ } else {
+ mProcessingEnergy += basicTemperatureMod;
+ }
+ }
+
+ @Override
+ public SteamVariant getSteamVariant() {
+ return SteamVariant.BRONZE;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return String
+ .format(
+ "Heat Capacity: " + EnumChatFormatting.GREEN
+ + "%s %%"
+ + EnumChatFormatting.RESET
+ + " Hot time: "
+ + EnumChatFormatting.RED
+ + "%s s"
+ + EnumChatFormatting.RESET
+ + "%n"
+ + "Min output: "
+ + EnumChatFormatting.RED
+ + LPS_FMT
+ + EnumChatFormatting.RESET
+ + " Max output: "
+ + EnumChatFormatting.RED
+ + LPS_FMT
+ + EnumChatFormatting.RESET
+ + "%n"
+ + "Current Output: "
+ + EnumChatFormatting.YELLOW
+ + LPS_FMT
+ + EnumChatFormatting.RESET,
+ GT_Utility.formatNumbers(getHeatCapacityPercent()),
+ GT_Utility.formatNumbers(getHotTimeSeconds()),
+ GT_Utility.formatNumbers(getMinOutputPerSecond()),
+ GT_Utility.formatNumbers(getMaxOutputPerSecond()),
+ GT_Utility.formatNumbers(getProductionPerSecond()))
+ .split("\\R");
+ }
+
+ public int getHeatCapacityPercent() {
+ return mTemperature * 100 / maxProgresstime();
+ }
+
+ public int getHotTimeSeconds() {
+ return mRunTimeTicks / 20;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boiler_Solar(mName, mTier, mDescriptionArray, mTextures, mConfig);
+ }
+
+ @Override
+ protected IDrawable[] getFuelSlotBackground() {
+ return new IDrawable[] { GT_UITextures.TRANSPARENT };
+ }
+
+ @Override
+ protected IDrawable[] getAshSlotBackground() {
+ return new IDrawable[] { GT_UITextures.TRANSPARENT };
+ }
+
+ @Override
+ protected SlotWidget createFuelSlot() {
+ // todo: remove this slot after some time
+ return super.createFuelSlot().setAccess(true, false);
+ }
+
+ @Override
+ protected SlotWidget createAshSlot() {
+ // todo: remove this slot after some time
+ return super.createAshSlot().setAccess(true, false);
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ final NBTTagCompound tag = accessor.getNBTData();
+ currentTip.add(
+ String.format(
+ (GOLD + "Solar Boiler Output: " + RESET + "%d/%d L/s"),
+ tag.getInteger("calcificationOutput"),
+ tag.getInteger("maxCalcificationOutput")));
+
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ tag.setInteger("calcificationOutput", (getProductionPerSecond()));
+ tag.setInteger("maxCalcificationOutput", (getMaxOutputPerSecond()));
+ }
+
+ protected static class Config {
+
+ private final int calcificationTicks;
+ private final int minOutputPerSecond;
+ private final int maxOutputPerSecond;
+ private final int coolDownTicks;
+ private final int maxRuntimeTicks;
+
+ public Config(String aCategory, int aDefaultCalcificationTicks, int aDefaultMinOutputPerSecond,
+ int aDefaultMaxOutputPerSecond, int aDefaultCoolDownTicks) {
+ calcificationTicks = get(
+ aCategory,
+ "CalcificationTicks",
+ aDefaultCalcificationTicks,
+ "Number of run-time ticks before boiler starts calcification.",
+ "100% calcification and minimal output will be reached at 2 times this.");
+ minOutputPerSecond = get(aCategory, "MinOutputPerSecond", aDefaultMinOutputPerSecond);
+ maxOutputPerSecond = get(aCategory, "MaxOutputPerSecond", aDefaultMaxOutputPerSecond);
+ coolDownTicks = get(
+ aCategory,
+ "CoolDownTicks",
+ aDefaultCoolDownTicks,
+ "Number of ticks it takes to lose 1°C.");
+ // After which min output is reached.
+ maxRuntimeTicks = (getMaxOutputPerSecond() - getMinOutputPerSecond()) * getCalcificationTicks()
+ / getMaxOutputPerSecond() + getCalcificationTicks();
+ }
+
+ protected int get(final String aCategory, final String aKey, final int aDefaultValue,
+ final String... aComments) {
+ final StringBuilder tCommentBuilder = new StringBuilder();
+ for (String tComment : aComments) tCommentBuilder.append(tComment)
+ .append('\n');
+ tCommentBuilder.append("Default: ")
+ .append(aDefaultValue);
+ return sMachineFile.mConfig.get(aCategory, aKey, aDefaultValue, tCommentBuilder.toString())
+ .getInt();
+ }
+
+ public int getCalcificationTicks() {
+ return calcificationTicks;
+ }
+
+ public int getMinOutputPerSecond() {
+ return minOutputPerSecond;
+ }
+
+ public int getMaxOutputPerSecond() {
+ return maxOutputPerSecond;
+ }
+
+ public int getCoolDownTicks() {
+ return coolDownTicks;
+ }
+
+ public int getMaxRuntimeTicks() {
+ return maxRuntimeTicks;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar_Steel.java b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar_Steel.java
new file mode 100644
index 0000000000..c20ea4018a
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Solar_Steel.java
@@ -0,0 +1,77 @@
+package gregtech.common.tileentities.boilers;
+
+import static gregtech.api.enums.ConfigCategories.machineconfig;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_Boiler_Solar_Steel extends GT_MetaTileEntity_Boiler_Solar {
+
+ public GT_MetaTileEntity_Boiler_Solar_Steel(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_Boiler_Solar_Steel(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Boiler_Solar_Steel(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Boiler_Solar_Steel(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures, Config aConfig) {
+ super(aName, aTier, aDescription, aTextures, aConfig);
+ }
+
+ @Override
+ protected Config createConfig() {
+ return new Config(machineconfig + ".boiler.solar.steel", 1080000, 120, 360, 75);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+
+ ITexture[][][] rTextures = new ITexture[4][17][];
+ for (int color = -1; color < 16; color++) {
+ int i = color + 1;
+ short[] colorModulation = Dyes.getModulation(color, Dyes._NULL.mRGBa);
+ rTextures[0][i] = new ITexture[] {
+ TextureFactory.of(BlockIcons.MACHINE_STEELBRICKS_BOTTOM, colorModulation) };
+ rTextures[1][i] = new ITexture[] { TextureFactory.of(BlockIcons.MACHINE_STEELBRICKS_TOP, colorModulation),
+ TextureFactory.of(BlockIcons.BOILER_SOLAR) };
+ rTextures[2][i] = new ITexture[] {
+ TextureFactory.of(BlockIcons.MACHINE_STEELBRICKS_SIDE, colorModulation) };
+ rTextures[3][i] = new ITexture[] { TextureFactory.of(BlockIcons.MACHINE_STEELBRICKS_SIDE, colorModulation),
+ TextureFactory.of(BlockIcons.OVERLAY_PIPE) };
+ }
+ return rTextures;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 32000;
+ }
+
+ @Override
+ public SteamVariant getSteamVariant() {
+ return SteamVariant.STEEL;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boiler_Solar_Steel(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures,
+ this.mConfig);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Steel.java b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Steel.java
new file mode 100644
index 0000000000..12374c3313
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/boilers/GT_MetaTileEntity_Boiler_Steel.java
@@ -0,0 +1,108 @@
+package gregtech.common.tileentities.boilers;
+
+import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT;
+import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.BOILER_FRONT_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEELBRICKS_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_Boiler_Steel extends GT_MetaTileEntity_Boiler_Bronze {
+
+ public GT_MetaTileEntity_Boiler_Steel(int aID, String aName, String aNameRegional) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ new String[] { "Faster than the Bronze Boiler", "Produces 300L of Steam per second",
+ "Causes " + GT_Mod.gregtechproxy.mPollutionHighPressureCoalBoilerPerSecond + " Pollution per second" });
+ }
+
+ public GT_MetaTileEntity_Boiler_Steel(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Boiler_Steel(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[5][17][];
+ final ITexture[] texBottom = { TextureFactory.of(MACHINE_STEELBRICKS_BOTTOM) },
+ texTop = { TextureFactory.of(MACHINE_STEELBRICKS_TOP), TextureFactory.of(OVERLAY_PIPE) },
+ texSide = { TextureFactory.of(MACHINE_STEELBRICKS_SIDE), TextureFactory.of(OVERLAY_PIPE) },
+ texFront = { TextureFactory.of(MACHINE_STEELBRICKS_SIDE), TextureFactory.of(BOILER_FRONT),
+ TextureFactory.builder()
+ .addIcon(BOILER_FRONT_GLOW)
+ .glow()
+ .build() },
+ texFrontActive = { TextureFactory.of(MACHINE_STEELBRICKS_SIDE), TextureFactory.of(BOILER_FRONT_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(BOILER_FRONT_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ for (int i = 0; i < 17; i++) {
+ rTextures[0][i] = texBottom;
+ rTextures[1][i] = texTop;
+ rTextures[2][i] = texSide;
+ rTextures[3][i] = texFront;
+ rTextures[4][i] = texFrontActive;
+ }
+ return rTextures;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return 1000;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boiler_Steel(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ protected int getPollution() {
+ return GT_Mod.gregtechproxy.mPollutionHighPressureCoalBoilerPerSecond;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 32000;
+ }
+
+ @Override
+ protected int getProductionPerSecond() {
+ return 300;
+ }
+
+ @Override
+ protected int getMaxTemperature() {
+ return 1000;
+ }
+
+ @Override
+ protected int getEnergyConsumption() {
+ return 2;
+ }
+
+ @Override
+ protected int getCooldownInterval() {
+ return 40;
+ }
+
+ @Override
+ public SteamVariant getSteamVariant() {
+ return SteamVariant.STEEL;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/functional/Conveyor.java b/src/main/java/gregtech/common/tileentities/casings/functional/Conveyor.java
new file mode 100644
index 0000000000..31dea4cf38
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/functional/Conveyor.java
@@ -0,0 +1,16 @@
+package gregtech.common.tileentities.casings.functional;
+
+import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
+
+public class Conveyor extends FunctionalCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.conveyor";
+ }
+
+ @Override
+ public float getPartModifier() {
+ return 1.1f;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/functional/Emitter.java b/src/main/java/gregtech/common/tileentities/casings/functional/Emitter.java
new file mode 100644
index 0000000000..cce660ace4
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/functional/Emitter.java
@@ -0,0 +1,16 @@
+package gregtech.common.tileentities.casings.functional;
+
+import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
+
+public class Emitter extends FunctionalCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.emitter";
+ }
+
+ @Override
+ public float getPartModifier() {
+ return 1.3f;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/functional/FieldGenerator.java b/src/main/java/gregtech/common/tileentities/casings/functional/FieldGenerator.java
new file mode 100644
index 0000000000..3787d45af8
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/functional/FieldGenerator.java
@@ -0,0 +1,16 @@
+package gregtech.common.tileentities.casings.functional;
+
+import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
+
+public class FieldGenerator extends FunctionalCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.field.generator";
+ }
+
+ @Override
+ public float getPartModifier() {
+ return 2f;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/functional/Motor.java b/src/main/java/gregtech/common/tileentities/casings/functional/Motor.java
new file mode 100644
index 0000000000..cddb293cc2
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/functional/Motor.java
@@ -0,0 +1,16 @@
+package gregtech.common.tileentities.casings.functional;
+
+import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
+
+public class Motor extends FunctionalCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.motor";
+ }
+
+ @Override
+ public float getPartModifier() {
+ return 1;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/functional/Piston.java b/src/main/java/gregtech/common/tileentities/casings/functional/Piston.java
new file mode 100644
index 0000000000..2255fbf8a2
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/functional/Piston.java
@@ -0,0 +1,16 @@
+package gregtech.common.tileentities.casings.functional;
+
+import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
+
+public class Piston extends FunctionalCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.piston";
+ }
+
+ @Override
+ public float getPartModifier() {
+ return 1.1f;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/functional/Pump.java b/src/main/java/gregtech/common/tileentities/casings/functional/Pump.java
new file mode 100644
index 0000000000..3acddbe9dc
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/functional/Pump.java
@@ -0,0 +1,16 @@
+package gregtech.common.tileentities.casings.functional;
+
+import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
+
+public class Pump extends FunctionalCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.pump";
+ }
+
+ @Override
+ public float getPartModifier() {
+ return 1.1f;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/functional/RobotArm.java b/src/main/java/gregtech/common/tileentities/casings/functional/RobotArm.java
new file mode 100644
index 0000000000..2273705397
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/functional/RobotArm.java
@@ -0,0 +1,16 @@
+package gregtech.common.tileentities.casings.functional;
+
+import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
+
+public class RobotArm extends FunctionalCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.robot.arm";
+ }
+
+ @Override
+ public float getPartModifier() {
+ return 1.5f;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/functional/Sensor.java b/src/main/java/gregtech/common/tileentities/casings/functional/Sensor.java
new file mode 100644
index 0000000000..e88060e902
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/functional/Sensor.java
@@ -0,0 +1,16 @@
+package gregtech.common.tileentities.casings.functional;
+
+import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
+
+public class Sensor extends FunctionalCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.sensor";
+ }
+
+ @Override
+ public float getPartModifier() {
+ return 1.3f;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Ampere.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Ampere.java
new file mode 100644
index 0000000000..1644f8fde0
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Ampere.java
@@ -0,0 +1,47 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+import gregtech.api.util.GT_Utility;
+
+public class Ampere extends UpgradeCasing {
+
+ private long amperage;
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.amperage";
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound aNBT) {
+ super.readMultiTileNBT(aNBT);
+ amperage = aNBT.getInteger(GT_Values.NBT.UPGRADE_AMPERAGE);
+ }
+
+ @Override
+ protected void customWork(IMultiBlockController target) {
+ target.setMaxAmperage(amperage);
+ }
+
+ @Override
+ public boolean breakBlock() {
+ final IMultiBlockController controller = getTarget(false);
+ if (controller != null) {
+ controller.setMaxAmperage(2);
+ }
+ return super.breakBlock();
+ }
+
+ @Override
+ public void addToolTips(List<String> list, ItemStack stack, boolean f3_h) {
+ super.addToolTips(list, stack, f3_h);
+ list.add("Increases allowed amperage to " + GT_Utility.formatNumbers(amperage));
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Cleanroom.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Cleanroom.java
new file mode 100644
index 0000000000..641327b427
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Cleanroom.java
@@ -0,0 +1,26 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+
+public class Cleanroom extends UpgradeCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.cleanroom";
+ }
+
+ @Override
+ protected void customWork(IMultiBlockController target) {
+ target.setCleanroom(true);
+ }
+
+ @Override
+ public boolean breakBlock() {
+ final IMultiBlockController controller = getTarget(false);
+ if (controller != null) {
+ controller.setCleanroom(false);
+ }
+ return super.breakBlock();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Heater.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Heater.java
new file mode 100644
index 0000000000..6d8bd81d0f
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Heater.java
@@ -0,0 +1,21 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.interfaces.UpgradableModularMuTE;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+import gregtech.api.util.GT_StructureUtilityMuTE.UpgradeCasings;
+
+public class Heater extends UpgradeCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.modular.heater";
+ }
+
+ @Override
+ protected void customWork(IMultiBlockController target) {
+ if (target instanceof UpgradableModularMuTE upgradable) {
+ upgradable.increaseMucCount(UpgradeCasings.Heater, this.tier);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Insulator.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Insulator.java
new file mode 100644
index 0000000000..6cb0b630d6
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Insulator.java
@@ -0,0 +1,22 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.interfaces.UpgradableModularMuTE;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+import gregtech.api.util.GT_StructureUtilityMuTE.UpgradeCasings;
+
+public class Insulator extends UpgradeCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.modular.insulator";
+ }
+
+ @Override
+ protected void customWork(IMultiBlockController target) {
+ if (target instanceof UpgradableModularMuTE upgradable) {
+ upgradable.increaseMucCount(UpgradeCasings.Insulator, this.tier);
+ }
+ }
+
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java
new file mode 100644
index 0000000000..31294c7002
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Inventory.java
@@ -0,0 +1,123 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import java.util.List;
+import java.util.UUID;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
+
+import gregtech.api.enums.GT_Values.NBT;
+import gregtech.api.enums.InventoryType;
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+
+public class Inventory extends UpgradeCasing {
+
+ public UUID inventoryID;
+
+ private String inventoryName = "inventory";
+ private int inventorySize;
+ private InventoryType type = InventoryType.Both;
+
+ public String getCustomInventoryName() {
+ return inventoryName;
+ }
+
+ public String getInventoryID() {
+ return inventoryID.toString();
+ }
+
+ public void setInventoryName(String aInventoryName) {
+ inventoryName = aInventoryName;
+ }
+
+ public InventoryType getType() {
+ return type;
+ }
+
+ @Override
+ protected void customWork(IMultiBlockController target) {
+ int invSize = inventorySize;
+ if (type == InventoryType.Both) {
+ invSize /= 2;
+ }
+ target.registerItemInventory(invSize, tier, type, true);
+ if (isServerSide()) {
+ issueClientUpdate();
+ }
+ }
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.inventory";
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound aNBT) {
+ super.readMultiTileNBT(aNBT);
+ if (aNBT.hasKey(NBT.UPGRADE_INVENTORY_NAME)) {
+ inventoryName = aNBT.getString(NBT.UPGRADE_INVENTORY_NAME);
+ } else {
+ inventoryName = "inventory";
+ }
+ inventorySize = aNBT.getInteger(NBT.UPGRADE_INVENTORY_SIZE);
+ }
+
+ @Override
+ public void writeMultiTileNBT(NBTTagCompound aNBT) {
+ super.writeMultiTileNBT(aNBT);
+ aNBT.setString(NBT.UPGRADE_INVENTORY_UUID, inventoryID.toString());
+ aNBT.setString(NBT.UPGRADE_INVENTORY_NAME, inventoryName);
+ }
+
+ @Override
+ public boolean breakBlock() {
+ final IMultiBlockController controller = getTarget(false);
+ if (controller != null) {
+ controller.unregisterItemInventory(inventoryID, type);
+ }
+ return super.breakBlock();
+ }
+
+ @Override
+ public boolean hasGui(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new TextFieldWidget().setGetter(() -> inventoryName)
+ .setSetter((val) -> {
+ inventoryName = val;
+ final IMultiBlockController controller = getTarget(false);
+ if (controller != null) {
+ controller.changeItemInventoryDisplayName(inventoryID, inventoryName, type);
+ }
+ })
+ .setSize(100, 25)
+ .setPos(50, 30));
+ }
+
+ @Override
+ protected boolean canOpenControllerGui() {
+ return false;
+ }
+
+ @Override
+ public void addToolTips(List<String> list, ItemStack stack, boolean f3_h) {
+ super.addToolTips(list, stack, f3_h);
+ list.add("Adds another item inventory");
+ list.add("Inventory size: " + inventorySize);
+ list.add("Inventory Type: " + type);
+ }
+
+ public void setInventoryId(String inventoryID) {
+ this.inventoryID = UUID.fromString(inventoryID);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Laser.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Laser.java
new file mode 100644
index 0000000000..ab66281f54
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Laser.java
@@ -0,0 +1,26 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+
+public class Laser extends UpgradeCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.laser";
+ }
+
+ @Override
+ protected void customWork(IMultiBlockController target) {
+ target.setLaserSupport(true);
+ }
+
+ @Override
+ public boolean breakBlock() {
+ final IMultiBlockController controller = getTarget(false);
+ if (controller != null) {
+ controller.setLaserSupport(false);
+ }
+ return super.breakBlock();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Tank.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Tank.java
new file mode 100644
index 0000000000..ebc84be38a
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Tank.java
@@ -0,0 +1,61 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import java.util.List;
+import java.util.UUID;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+import gregtech.api.util.GT_Utility;
+
+public class Tank extends UpgradeCasing {
+
+ private int tankCount;
+ private int tankCapacity;
+ public UUID tankID;
+ public static final int INPUT = 0;
+ public static final int OUTPUT = 1;
+ public static final int BOTH = 2;
+ private String tankName = "tank";
+ private int type = BOTH;
+
+ @Override
+ protected void customWork(IMultiBlockController aTarget) {
+
+ }
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.tank";
+ }
+
+ public String getCustomTankName() {
+ return tankName;
+ }
+
+ public String getTankID() {
+ return tankID.toString();
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound aNBT) {
+ super.readMultiTileNBT(aNBT);
+ tankCount = aNBT.getInteger(GT_Values.NBT.UPGRADE_TANK_COUNT);
+ tankCapacity = aNBT.getInteger(GT_Values.NBT.UPGRADE_TANK_CAPACITY);
+ }
+
+ @Override
+ public void addToolTips(List<String> list, ItemStack stack, boolean f3_h) {
+ super.addToolTips(list, stack, f3_h);
+ list.add("Adds another tank inventory");
+ list.add("Number of tanks: " + tankCount);
+ list.add("Tank capacity: " + GT_Utility.formatNumbers(tankCapacity) + " L");
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/casings/upgrade/Wireless.java b/src/main/java/gregtech/common/tileentities/casings/upgrade/Wireless.java
new file mode 100644
index 0000000000..0cb6a595bf
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/casings/upgrade/Wireless.java
@@ -0,0 +1,26 @@
+package gregtech.common.tileentities.casings.upgrade;
+
+import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+
+public class Wireless extends UpgradeCasing {
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.functional.wireless";
+ }
+
+ @Override
+ protected void customWork(IMultiBlockController target) {
+ target.setWirelessSupport(true);
+ }
+
+ @Override
+ public boolean breakBlock() {
+ final IMultiBlockController controller = getTarget(false);
+ if (controller != null) {
+ controller.setWirelessSupport(false);
+ }
+ return super.breakBlock();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/debug/GT_MetaTileEntity_AdvDebugStructureWriter.java b/src/main/java/gregtech/common/tileentities/debug/GT_MetaTileEntity_AdvDebugStructureWriter.java
new file mode 100644
index 0000000000..f143ec556e
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/debug/GT_MetaTileEntity_AdvDebugStructureWriter.java
@@ -0,0 +1,439 @@
+package gregtech.common.tileentities.debug;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.HashMap;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraftforge.client.event.RenderWorldLastEvent;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.lwjgl.opengl.GL11;
+
+import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_AdvDebugStructureWriter extends GT_MetaTileEntity_TieredMachineBlock
+ implements IAddGregtechLogo, IAddUIWidgets {
+
+ private static final HashMap<GT_MetaTileEntity_AdvDebugStructureWriter, BoundHighlighter> bondingBoxes = new HashMap<>(
+ 1);
+ private final BoundHighlighter boundingBox = new BoundHighlighter();
+ private final short[] numbers = new short[6];
+ private boolean transpose = false;
+ private boolean showHighlightBox = true;
+ private String[] result = new String[] { "Undefined" };
+
+ public GT_MetaTileEntity_AdvDebugStructureWriter(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, 0, "");
+ }
+
+ public GT_MetaTileEntity_AdvDebugStructureWriter(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_AdvDebugStructureWriter(mName, mTier, "", mTextures);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ return new ITexture[] {
+ Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], sideDirection != facingDirection
+ ? TextureFactory.of(
+ TextureFactory.builder()
+ .addIcon(Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE)
+ .glow()
+ .build())
+ : TextureFactory.of(
+ TextureFactory.builder()
+ .addIcon(Textures.BlockIcons.STRUCTURE_MARK)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return null;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection b,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection b,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ for (int i = 0; i < numbers.length; i++) {
+ aNBT.setShort("eData" + i, numbers[i]);
+ }
+ aNBT.setBoolean("Transpose", transpose);
+ aNBT.setBoolean("HighlightBox", showHighlightBox);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ for (int i = 0; i < numbers.length; i++) {
+ numbers[i] = aNBT.getShort("eData" + i);
+ }
+ transpose = aNBT.getBoolean("Transpose");
+ showHighlightBox = aNBT.getBoolean("HighlightBox");
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ bondingBoxes.put(this, boundingBox);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ ExtendedFacing writerFacing = ExtendedFacing.of(aBaseMetaTileEntity.getFrontFacing());
+ double[] abc = new double[3];
+ double[] xyz = new double[3];
+ boundingBox.dim = aBaseMetaTileEntity.getWorld().provider.dimensionId;
+ boundingBox.showHighlightBox = showHighlightBox;
+ abc[0] = -numbers[0] - 0.5;
+ abc[1] = -numbers[1] - 0.5;
+ abc[2] = -numbers[2] - 0.5;
+ writerFacing.getWorldOffset(abc, xyz);
+ boundingBox.pos1 = new Vec3Impl(
+ aBaseMetaTileEntity.getXCoord() + (int) (xyz[0] + 0.5),
+ aBaseMetaTileEntity.getYCoord() + (int) (xyz[1] + 0.5),
+ aBaseMetaTileEntity.getZCoord() + (int) (xyz[2] + 0.5));
+ abc[0] = -numbers[0] + numbers[3] - 0.5;
+ abc[1] = -numbers[1] + numbers[4] - 0.5;
+ abc[2] = -numbers[2] + numbers[5] - 0.5;
+ writerFacing.getWorldOffset(abc, xyz);
+ boundingBox.pos2 = new Vec3Impl(
+ aBaseMetaTileEntity.getXCoord() + (int) (xyz[0] + 0.5),
+ aBaseMetaTileEntity.getYCoord() + (int) (xyz[1] + 0.5),
+ aBaseMetaTileEntity.getZCoord() + (int) (xyz[2] + 0.5));
+ }
+ }
+
+ @Override
+ public void onRemoval() {
+ bondingBoxes.remove(this);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ IGregTechTileEntity aBaseMetaTileEntity = getBaseMetaTileEntity();
+ printStructure(aPlayer);
+ aBaseMetaTileEntity.disableWorking();
+ }
+
+ public void printStructure(EntityPlayer aPlayer) {
+ IGregTechTileEntity aBaseMetaTileEntity = getBaseMetaTileEntity();
+ String pseudoJavaCode = StructureUtility.getPseudoJavaCode(
+ aBaseMetaTileEntity.getWorld(),
+ ExtendedFacing.of(aBaseMetaTileEntity.getFrontFacing()),
+ aBaseMetaTileEntity.getXCoord(),
+ aBaseMetaTileEntity.getYCoord(),
+ aBaseMetaTileEntity.getZCoord(),
+ numbers[0],
+ numbers[1],
+ numbers[2],
+ te -> te.getClass()
+ .getCanonicalName(),
+ numbers[3],
+ numbers[4],
+ numbers[5],
+ transpose);
+ GT_FML_LOGGER.info(pseudoJavaCode);
+ result = pseudoJavaCode.split("\\n");
+ aPlayer.addChatMessage(
+ new ChatComponentTranslation(translateToLocal("GT5U.machines.advdebugstructurewriter.printed")));
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return false;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { translateToLocal("GT5U.machines.advdebugstructurewriter.tooltip"), // Scans Blocks Around
+ translateToLocal("GT5U.machines.advdebugstructurewriter.tooltip.1"), // Prints Multiblock NonTE
+ // structure check code
+ translateToLocal("GT5U.machines.advdebugstructurewriter.tooltip.2") // ABC axes aligned to machine front
+ };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return result;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setSize(90, 112)
+ .setPos(43, 4))
+ .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (getBaseMetaTileEntity().isServerSide()) {
+ printStructure(
+ widget.getContext()
+ .getPlayer());
+ }
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_PRINT)
+ .setSize(18, 18)
+ .setPos(11, 128)
+ .addTooltip(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.print.tooltip")))
+ .widget(
+ new CycleButtonWidget().setToggle(() -> transpose, aBoolean -> transpose = aBoolean)
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_TRANSPOSE)
+ .setSize(18, 18)
+ .setPos(32, 128)
+ .addTooltip(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.transpose.tooltip")))
+ .widget(
+ new CycleButtonWidget().setToggle(() -> showHighlightBox, aBoolean -> showHighlightBox = aBoolean)
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_BOUNDING_BOX)
+ .setSize(18, 18)
+ .setPos(53, 128)
+ .addTooltip(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.highlight.tooltip")))
+ .widget(
+ new MultiChildWidget()
+ .addChild(
+ new TextWidget(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.origin"))
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 0))
+ .addChild(
+ TextWidget.dynamicString(() -> "A: " + numbers[0])
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 10))
+ .addChild(
+ TextWidget.dynamicString(() -> "B: " + numbers[1])
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 18))
+ .addChild(
+ TextWidget.dynamicString(() -> "C: " + numbers[2])
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 26))
+ .addChild(
+ new TextWidget(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.size"))
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 52))
+ .addChild(
+ TextWidget.dynamicString(() -> "A: " + numbers[3])
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 62))
+ .addChild(
+ TextWidget.dynamicString(() -> "B: " + numbers[4])
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 70))
+ .addChild(
+ TextWidget.dynamicString(() -> "C: " + numbers[5])
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 78))
+ .setPos(46, 8));
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, -512, -64, 7);
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, -16, -1, 25);
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, 16, 1, 133);
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, 512, 64, 151);
+ }
+
+ private void addChangeNumberButtons(ModularWindow.Builder builder, IDrawable overlay, int addNumberShift,
+ int addNumber, int xPos) {
+ int[] yPos = new int[] { 4, 22, 40, 62, 80, 98 };
+ for (int i = 0; i < yPos.length; i++) {
+ final int index = i; // needed for lambda
+ builder.widget(
+ new ButtonWidget()
+ .setOnClick((clickData, widget) -> numbers[index] += clickData.shift ? addNumberShift : addNumber)
+ .setBackground(GT_UITextures.BUTTON_STANDARD, overlay)
+ .setSize(18, 18)
+ .setPos(xPos, yPos[index]));
+ }
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return new GUITextureSet().setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY);
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(113, 96));
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+
+ public static class ForgeEventHandler {
+
+ public ForgeEventHandler() {
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @SuppressWarnings("unused")
+ @SideOnly(Side.CLIENT)
+ @SubscribeEvent
+ public void onRenderWorldLast(RenderWorldLastEvent e) {
+ for (BoundHighlighter boundingBox : bondingBoxes.values()) {
+ boundingBox.renderHighlightedBlock(e);
+ }
+ }
+ }
+
+ private static class BoundHighlighter {
+
+ public Vec3Impl pos1;
+ public Vec3Impl pos2;
+ public boolean showHighlightBox;
+ public int dim;
+
+ @SideOnly(Side.CLIENT)
+ private void renderHighlightedBlock(RenderWorldLastEvent event) {
+ if (pos1 == null || pos2 == null || !showHighlightBox) {
+ return;
+ }
+ Minecraft mc = Minecraft.getMinecraft();
+ int dimension = mc.theWorld.provider.dimensionId;
+
+ if (dimension != dim) {
+ pos1 = null;
+ pos2 = null;
+ return;
+ }
+
+ EntityPlayerSP p = mc.thePlayer;
+ double doubleX = p.lastTickPosX + (p.posX - p.lastTickPosX) * event.partialTicks;
+ double doubleY = p.lastTickPosY + (p.posY - p.lastTickPosY) * event.partialTicks;
+ double doubleZ = p.lastTickPosZ + (p.posZ - p.lastTickPosZ) * event.partialTicks;
+
+ GL11.glPushMatrix();
+ GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GL11.glLineWidth(3);
+ GL11.glTranslated(-doubleX, -doubleY, -doubleZ);
+
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+
+ GL11.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
+ renderHighLightedArenaOutline(pos1.get0(), pos1.get1(), pos1.get2(), pos2.get0(), pos2.get1(), pos2.get2());
+
+ GL11.glPopAttrib();
+ GL11.glPopMatrix();
+ }
+
+ @SideOnly(Side.CLIENT)
+ static void renderHighLightedArenaOutline(double x1, double y1, double z1, double x2, double y2, double z2) {
+ GL11.glBegin(GL11.GL_LINE_STRIP);
+
+ GL11.glVertex3d(x1, y1, z1);
+ GL11.glVertex3d(x1, y2, z1);
+ GL11.glVertex3d(x1, y2, z2);
+ GL11.glVertex3d(x1, y1, z2);
+ GL11.glVertex3d(x1, y1, z1);
+
+ GL11.glVertex3d(x2, y1, z1);
+ GL11.glVertex3d(x2, y2, z1);
+ GL11.glVertex3d(x2, y2, z2);
+ GL11.glVertex3d(x2, y1, z2);
+ GL11.glVertex3d(x2, y1, z1);
+
+ GL11.glVertex3d(x1, y1, z1);
+ GL11.glVertex3d(x2, y1, z1);
+ GL11.glVertex3d(x2, y1, z2);
+ GL11.glVertex3d(x1, y1, z2);
+ GL11.glVertex3d(x1, y2, z2);
+ GL11.glVertex3d(x2, y2, z2);
+ GL11.glVertex3d(x2, y2, z1);
+ GL11.glVertex3d(x2, y1, z1);
+ GL11.glVertex3d(x1, y1, z1);
+ GL11.glVertex3d(x2, y1, z1);
+ GL11.glVertex3d(x2, y2, z1);
+ GL11.glVertex3d(x1, y2, z1);
+ GL11.glVertex3d(x1, y2, z2);
+ GL11.glVertex3d(x2, y2, z2);
+ GL11.glVertex3d(x2, y1, z2);
+ GL11.glVertex3d(x1, y1, z2);
+
+ GL11.glEnd();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_DieselGenerator.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_DieselGenerator.java
new file mode 100644
index 0000000000..5047cb7624
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_DieselGenerator.java
@@ -0,0 +1,283 @@
+package gregtech.common.tileentities.generators;
+
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BACK;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BACK_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BACK_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BACK_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_BOTTOM_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_FRONT;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_FRONT_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_FRONT_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_FRONT_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_SIDE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_SIDE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_SIDE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_TOP_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_TOP_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.DIESEL_GENERATOR_TOP_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder;
+
+public class GT_MetaTileEntity_DieselGenerator extends GT_MetaTileEntity_BasicGenerator {
+
+ public int mEfficiency;
+
+ public GT_MetaTileEntity_DieselGenerator(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ new String[] { "Requires liquid Fuel",
+ "Causes "
+ + (int) (GT_Mod.gregtechproxy.mPollutionBaseDieselGeneratorPerSecond
+ * GT_Mod.gregtechproxy.mPollutionDieselGeneratorReleasedByTier[aTier])
+ + " Pollution per second" });
+ onConfigLoad();
+ }
+
+ public GT_MetaTileEntity_DieselGenerator(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ onConfigLoad();
+ }
+
+ public GT_MetaTileEntity_DieselGenerator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ onConfigLoad();
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_DieselGenerator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.dieselFuels;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile.get(
+ ConfigCategories.machineconfig,
+ "DieselGenerator.efficiency.tier." + this.mTier,
+ (100 - this.mTier * 5));
+ }
+
+ @Override
+ public int getEfficiency() {
+ return this.mEfficiency;
+ }
+
+ @Override
+ public int getFuelValue(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack) || getRecipeMap() == null) return 0;
+ long rValue = super.getFuelValue(aStack);
+ if (ItemList.Fuel_Can_Plastic_Filled.isStackEqual(aStack, false, true)) {
+ rValue = Math.max(rValue, GameRegistry.getFuelValue(aStack) * 3L);
+ }
+ if (rValue > Integer.MAX_VALUE) {
+ throw new ArithmeticException("Integer LOOPBACK!");
+ }
+ return (int) rValue;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aTick % 100 == 0 && mFluid != null && mFluid.amount > this.getCapacity()) {
+ GT_Log.err.println(
+ "Dupe Abuse: " + aBaseMetaTileEntity.getOwnerName()
+ + " Coords: "
+ + aBaseMetaTileEntity.getXCoord()
+ + " "
+ + aBaseMetaTileEntity.getYCoord()
+ + " "
+ + aBaseMetaTileEntity.getZCoord());
+ aBaseMetaTileEntity.setToFire();
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ /**
+ * Draws random smoke particles on top when active
+ *
+ * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick}
+ */
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (aBaseMetaTileEntity.isActive()) {
+
+ if (aBaseMetaTileEntity.getCoverIDAtSide(ForgeDirection.UP) == 0
+ && !aBaseMetaTileEntity.getOpacityAtSide(ForgeDirection.UP)) {
+
+ final double x = aBaseMetaTileEntity.getOffsetX(ForgeDirection.UP, 1) + 2D / 16D
+ + XSTR_INSTANCE.nextFloat() * 14D / 16D;
+ final double y = aBaseMetaTileEntity.getOffsetY(ForgeDirection.UP, 1) + 1D / 32D;
+ final double z = aBaseMetaTileEntity.getOffsetZ(ForgeDirection.UP, 1) + 2D / 16D
+ + XSTR_INSTANCE.nextFloat() * 14D / 16D;
+
+ new ParticleEventBuilder().setMotion(0D, 0D, 0D)
+ .setPosition(x, y, z)
+ .setWorld(getBaseMetaTileEntity().getWorld())
+ .setIdentifier(ParticleFX.SMOKE)
+ .run();
+ }
+ }
+ }
+
+ @Override
+ public ITexture[] getFront(byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(DIESEL_GENERATOR_FRONT),
+ TextureFactory.builder()
+ .addIcon(DIESEL_GENERATOR_FRONT_GLOW)
+ .glow()
+ .build()),
+ OVERLAYS_ENERGY_OUT[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBack(byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(DIESEL_GENERATOR_BACK),
+ TextureFactory.builder()
+ .addIcon(DIESEL_GENERATOR_BACK_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getBottom(byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(DIESEL_GENERATOR_BOTTOM),
+ TextureFactory.builder()
+ .addIcon(DIESEL_GENERATOR_BOTTOM_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getTop(byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(DIESEL_GENERATOR_TOP),
+ TextureFactory.builder()
+ .addIcon(DIESEL_GENERATOR_TOP_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getSides(byte aColor) {
+ return new ITexture[] { super.getSides(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(DIESEL_GENERATOR_SIDE),
+ TextureFactory.builder()
+ .addIcon(DIESEL_GENERATOR_SIDE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(DIESEL_GENERATOR_FRONT_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(DIESEL_GENERATOR_FRONT_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ OVERLAYS_ENERGY_OUT[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBackActive(byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(DIESEL_GENERATOR_BACK_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(DIESEL_GENERATOR_BACK_ACTIVE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(DIESEL_GENERATOR_BOTTOM_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(DIESEL_GENERATOR_BOTTOM_ACTIVE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(DIESEL_GENERATOR_TOP_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(DIESEL_GENERATOR_TOP_ACTIVE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(byte aColor) {
+ return new ITexture[] { super.getSidesActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(DIESEL_GENERATOR_SIDE_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(DIESEL_GENERATOR_SIDE_ACTIVE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public int getPollution() {
+ return (int) (GT_Mod.gregtechproxy.mPollutionBaseDieselGeneratorPerSecond
+ * GT_Mod.gregtechproxy.mPollutionDieselGeneratorReleasedByTier[mTier]);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_GasTurbine.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_GasTurbine.java
new file mode 100644
index 0000000000..e18bc00b51
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_GasTurbine.java
@@ -0,0 +1,216 @@
+package gregtech.common.tileentities.generators;
+
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BACK;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BACK_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BACK_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BACK_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BOTTOM_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BOTTOM_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_BOTTOM_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_FRONT;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_FRONT_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_FRONT_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_FRONT_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_SIDE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_SIDE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_SIDE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_TOP_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_TOP_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.GAS_TURBINE_TOP_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_GasTurbine extends GT_MetaTileEntity_BasicGenerator {
+
+ public int mEfficiency;
+
+ public GT_MetaTileEntity_GasTurbine(int aID, String aName, String aNameRegional, int aTier, int mEfficiency) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ new String[] { "Requires flammable Gasses",
+ "Causes "
+ + (int) (GT_Mod.gregtechproxy.mPollutionBaseGasTurbinePerSecond
+ * GT_Mod.gregtechproxy.mPollutionGasTurbineReleasedByTier[aTier])
+ + " Pollution per second" });
+ this.mEfficiency = mEfficiency;
+ onConfigLoad();
+ }
+
+ public GT_MetaTileEntity_GasTurbine(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures,
+ int mEfficiency) {
+ super(aName, aTier, aDescription, aTextures);
+ this.mEfficiency = mEfficiency;
+ onConfigLoad();
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_GasTurbine(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures,
+ this.mEfficiency);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.gasTurbineFuels;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "GasTurbine.efficiency.tier." + this.mTier, this.mEfficiency);
+ }
+
+ @Override
+ public int getEfficiency() {
+ return this.mEfficiency;
+ }
+
+ @Override
+ public ITexture[] getFront(byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(GAS_TURBINE_FRONT),
+ TextureFactory.builder()
+ .addIcon(GAS_TURBINE_FRONT_GLOW)
+ .glow()
+ .build()),
+ OVERLAYS_ENERGY_OUT[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBack(byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(GAS_TURBINE_BACK),
+ TextureFactory.builder()
+ .addIcon(GAS_TURBINE_BACK_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getBottom(byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(GAS_TURBINE_BOTTOM),
+ TextureFactory.builder()
+ .addIcon(GAS_TURBINE_BOTTOM_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getTop(byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(GAS_TURBINE_TOP),
+ TextureFactory.builder()
+ .addIcon(GAS_TURBINE_TOP_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getSides(byte aColor) {
+ return new ITexture[] { super.getSides(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(GAS_TURBINE_SIDE),
+ TextureFactory.builder()
+ .addIcon(GAS_TURBINE_SIDE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(GAS_TURBINE_FRONT_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(GAS_TURBINE_FRONT_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ OVERLAYS_ENERGY_OUT[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBackActive(byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(GAS_TURBINE_BACK_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(GAS_TURBINE_BACK_ACTIVE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(GAS_TURBINE_BOTTOM_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(GAS_TURBINE_BOTTOM_ACTIVE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(GAS_TURBINE_TOP_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(GAS_TURBINE_TOP_ACTIVE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(byte aColor) {
+ return new ITexture[] { super.getSidesActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(GAS_TURBINE_SIDE_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(GAS_TURBINE_SIDE_ACTIVE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public int getPollution() {
+ return (int) (GT_Mod.gregtechproxy.mPollutionBaseGasTurbinePerSecond
+ * GT_Mod.gregtechproxy.mPollutionGasTurbineReleasedByTier[mTier]);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_LightningRod.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_LightningRod.java
new file mode 100644
index 0000000000..9809dba278
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_LightningRod.java
@@ -0,0 +1,169 @@
+package gregtech.common.tileentities.generators;
+
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import net.minecraft.entity.effect.EntityLightningBolt;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_LightningRod extends GT_MetaTileEntity_TieredMachineBlock {
+
+ public GT_MetaTileEntity_LightningRod(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, 0, "Generates EU From Lightning Bolts");
+ }
+
+ public GT_MetaTileEntity_LightningRod(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_LightningRod(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ if (sideDirection != ForgeDirection.UP) {
+ return new ITexture[] { BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1],
+ BlockIcons.OVERLAYS_ENERGY_OUT_POWER[mTier] };
+ }
+ if (!active) return new ITexture[] { BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1],
+ TextureFactory.of(BlockIcons.MACHINE_CASING_FUSION_GLASS) };
+ return new ITexture[] { BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1],
+ TextureFactory.of(BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW), TextureFactory.builder()
+ .addIcon(BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return null;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_LightningRod(
+ this.mName,
+ this.mTier,
+ this.mInventory.length,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ World aWorld = aBaseMetaTileEntity.getWorld();
+ if (!aWorld.isRemote) {
+ if (aBaseMetaTileEntity.getStoredEU() > 0) {
+ aBaseMetaTileEntity.setActive(true);
+ aBaseMetaTileEntity.decreaseStoredEnergyUnits(aBaseMetaTileEntity.getStoredEU() / 100 + 1, false);
+ } else {
+ aBaseMetaTileEntity.setActive(false);
+ }
+
+ if (aTick % 256 == 0 && (aWorld.isThundering() || (aWorld.isRaining() && XSTR_INSTANCE.nextInt(10) == 0))) {
+ int aRodValue = 0;
+ boolean isRodValid = true;
+ int aX = aBaseMetaTileEntity.getXCoord();
+ int aY = aBaseMetaTileEntity.getYCoord();
+ int aZ = aBaseMetaTileEntity.getZCoord();
+
+ for (int i = aBaseMetaTileEntity.getYCoord() + 1; i < aWorld.getHeight() - 1; i++) {
+ if (isRodValid && aBaseMetaTileEntity.getBlock(aX, i, aZ)
+ .getUnlocalizedName()
+ .equals("blockFenceIron")) {
+ aRodValue++;
+ } else {
+ isRodValid = false;
+ if (aBaseMetaTileEntity.getBlock(aX, i, aZ) != Blocks.air) {
+ aRodValue = 0;
+ break;
+ }
+ }
+ }
+ if (!aWorld.isThundering() && ((aY + aRodValue) < 128)) aRodValue = 0;
+ if (XSTR_INSTANCE.nextInt(4 * aWorld.getHeight()) < (aRodValue * (aY + aRodValue))) {
+ aBaseMetaTileEntity
+ .increaseStoredEnergyUnits(maxEUStore() - aBaseMetaTileEntity.getStoredEU(), false);
+ aWorld.addWeatherEffect(new EntityLightningBolt(aWorld, aX, aY + aRodValue, aZ));
+ // randomly break a rod
+ if (aWorld.isThundering()) {
+ aWorld.setBlockToAir(aX, aY + XSTR_INSTANCE.nextInt(aRodValue) + 1, aZ);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return facing == ForgeDirection.UP;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetOutput() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return false;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 50000000;
+ }
+
+ @Override
+ public long maxEUOutput() {
+ return GT_Values.V[mTier];
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return 512;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {}
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {}
+}
diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicEnergyConverter.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicEnergyConverter.java
new file mode 100644
index 0000000000..7317180b5d
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicEnergyConverter.java
@@ -0,0 +1,178 @@
+package gregtech.common.tileentities.generators;
+
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_MagicEnergyConverter extends GT_MetaTileEntity_BasicGenerator {
+
+ public int mEfficiency;
+
+ public GT_MetaTileEntity_MagicEnergyConverter(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, "Put your strange stuff in here");
+ onConfigLoad();
+ }
+
+ public GT_MetaTileEntity_MagicEnergyConverter(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ onConfigLoad();
+ }
+
+ public GT_MetaTileEntity_MagicEnergyConverter(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ onConfigLoad();
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_MagicEnergyConverter(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.magicFuels;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile.get(
+ ConfigCategories.machineconfig,
+ "MagicEnergyConverter.efficiency.tier." + this.mTier,
+ 100 - this.mTier * 5);
+ }
+
+ @Override
+ public int getEfficiency() {
+ return this.mEfficiency;
+ }
+
+ @Override
+ public ITexture[] getFront(byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_GLOW)
+ .glow()
+ .build(),
+ OVERLAYS_ENERGY_OUT[mTier] };
+ }
+
+ @Override
+ public ITexture[] getBack(byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_FRONT),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_FRONT_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottom(byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTop(byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSides(byte aColor) {
+ return new ITexture[] { super.getSides(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW)
+ .glow()
+ .build(),
+ OVERLAYS_ENERGY_OUT[mTier] };
+ }
+
+ @Override
+ public ITexture[] getBackActive(byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_FRONT_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopActive(byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(byte aColor) {
+ return new ITexture[] { super.getSidesActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public int getPollution() {
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicalEnergyAbsorber.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicalEnergyAbsorber.java
new file mode 100644
index 0000000000..8dc3417a84
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_MagicalEnergyAbsorber.java
@@ -0,0 +1,817 @@
+package gregtech.common.tileentities.generators;
+
+import static gregtech.api.enums.ConfigCategories.machineconfig;
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_DRAGONEGG;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_DRAGONEGG_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_FRONT_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_MAGIC_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+import static net.minecraft.util.EnumChatFormatting.GRAY;
+import static net.minecraft.util.EnumChatFormatting.GREEN;
+import static net.minecraft.util.EnumChatFormatting.LIGHT_PURPLE;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.EnumChatFormatting.UNDERLINE;
+import static net.minecraft.util.EnumChatFormatting.YELLOW;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockDragonEgg;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.entity.item.EntityEnderCrystal;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemEnchantedBook;
+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.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.base.Enums;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder;
+import thaumcraft.api.aspects.Aspect;
+import thaumcraft.api.aspects.AspectList;
+import thaumcraft.api.aspects.AspectSourceHelper;
+import thaumcraft.api.aspects.IAspectContainer;
+import thaumcraft.api.visnet.VisNetHandler;
+
+interface MagicalEnergyBBListener {
+
+ void onMagicalEnergyBBUpdate();
+}
+
+public class GT_MetaTileEntity_MagicalEnergyAbsorber extends GT_MetaTileEntity_BasicGenerator
+ implements MagicalEnergyBBListener {
+
+ private static final boolean THAUMCRAFT_LOADED = Thaumcraft.isModLoaded();
+ private static final ConcurrentHashMap<UUID, GT_MetaTileEntity_MagicalEnergyAbsorber> sSubscribedCrystals = new ConcurrentHashMap<>(
+ 4);
+ private static final List<Aspect> sPrimalAspects = (THAUMCRAFT_LOADED) ? Aspect.getPrimalAspects()
+ : new ArrayList<>();
+ private static final Map<Aspect, Integer> sAspectsEnergy = new HashMap<>();
+ private static boolean sAllowMultipleEggs = false;
+ private static GT_MetaTileEntity_MagicalEnergyAbsorber sActiveSiphon = null;
+ private static int sEnergyPerEndercrystal = 512;
+ private static int sEnergyFromVis = 20;
+ private static int sEnergyPerEssentia = 320;
+ private static int sDragonEggEnergyPerTick = 2048;
+ private static int sCreeperEggEnergyPerTick = 512;
+ private final MagicalEnergyBB mMagicalEnergyBB = new MagicalEnergyBB(this, mTier, mTier + 2);
+ private int mEfficiency;
+ private int mMaxVisPerDrain;
+ private long mNextGenerateTickRate = 1;
+ private int mNoGenerationTicks = 0;
+ private boolean mUsingEssentia = true;
+
+ public GT_MetaTileEntity_MagicalEnergyAbsorber(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, "Feasts on magic close to it:");
+ onConfigLoad(GregTech_API.sMachineFile);
+ }
+
+ private GT_MetaTileEntity_MagicalEnergyAbsorber(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ onConfigLoad(GregTech_API.sMachineFile);
+ }
+
+ /**
+ * Populates static variables dependant on config settings
+ *
+ * @param aConfig GT_Config
+ */
+ private static void sharedConfigLoad(GT_Config aConfig) {
+ sAllowMultipleEggs = aConfig.get(machineconfig, "MagicEnergyAbsorber.AllowMultipleEggs", false);
+ sDragonEggEnergyPerTick = aConfig.get(machineconfig, "MagicEnergyAbsorber.EnergyPerTick.DragonEgg", 2048);
+ sCreeperEggEnergyPerTick = aConfig.get(machineconfig, "MagicEnergyAbsorber.EnergyPerTick.CreeperEgg", 512);
+ sEnergyPerEndercrystal = aConfig.get(machineconfig, "MagicEnergyAbsorber.EnergyPerTick.EnderCrystal", 512);
+ if (THAUMCRAFT_LOADED) {
+ sEnergyFromVis = aConfig.get(machineconfig, "MagicEnergyAbsorber.EnergyPerVis", 20);
+ sEnergyPerEssentia = aConfig.get(machineconfig, "MagicEnergyAbsorber.EnergyPerEssentia", 320);
+ for (Aspect tAspect : Aspect.aspects.values()) {
+ // noinspection UnstableApiUsage
+ sAspectsEnergy.put(
+ tAspect,
+ Enums.getIfPresent(
+ TC_Aspects.class,
+ tAspect.getTag()
+ .toUpperCase(Locale.ENGLISH))
+ .or(TC_Aspects.AER).mValue * sEnergyPerEssentia);
+ }
+ }
+ }
+
+ private static void setActiveSiphon(GT_MetaTileEntity_MagicalEnergyAbsorber aSiphon) {
+ sActiveSiphon = aSiphon;
+ }
+
+ @Override
+ public void onConfigLoad(GT_Config aConfig) {
+ sharedConfigLoad(aConfig);
+ mEfficiency = aConfig.get(machineconfig, "MagicEnergyAbsorber.efficiency.tier." + mTier, 100 - mTier * 10);
+ mMaxVisPerDrain = (int) Math.round(
+ Math.sqrt((double) (V[mTier] * 10000) / (sEnergyFromVis * (getEfficiency() != 0 ? getEfficiency() : 100))));
+ if (Math.pow(mMaxVisPerDrain, 2) * sEnergyFromVis * (getEfficiency() != 0 ? getEfficiency() : 100) < V[mTier]) {
+ mMaxVisPerDrain += 1;
+ }
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) mMagicalEnergyBB.decreaseTier();
+ else mMagicalEnergyBB.increaseTier();
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ String.format(
+ GT_LanguageManager.addStringLocalization(
+ "Interaction_DESCRIPTION_MagicalEnergyAbsorber_Screwdriver",
+ "Absorption range: %s blocks"),
+ mMagicalEnergyBB.getRange(),
+ true));
+ mMagicalEnergyBB.update();
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (!aBaseMetaTileEntity.isServerSide()) return;
+ mMagicalEnergyBB.update();
+ }
+
+ @Override
+ public void onRemoval() {
+ super.onRemoval();
+ releaseEgg();
+ unsubscribeCrystals();
+ }
+
+ private void releaseEgg() {
+ if (sActiveSiphon == this) {
+ setActiveSiphon(null);
+ }
+ }
+
+ private void unsubscribeCrystals() {
+ for (UUID tCrystalID : sSubscribedCrystals.keySet()) {
+ sSubscribedCrystals.remove(tCrystalID, this);
+ }
+ }
+
+ /**
+ * Call-back from the Bounding Box when its content is updated
+ */
+ @Override
+ public void onMagicalEnergyBBUpdate() {
+ List<UUID> tCrystalIDsInRange = mMagicalEnergyBB.getLivingCrystalIDs();
+ // Release unreachable Crystals subscriptions
+ for (UUID tSubscribedCrystalID : sSubscribedCrystals.keySet()) {
+ if (!tCrystalIDsInRange.contains(tSubscribedCrystalID)) {
+ sSubscribedCrystals.remove(tSubscribedCrystalID, this);
+ }
+ }
+ // Subscribe to available and not already subscribed Crystals
+ for (UUID tCrystalID : tCrystalIDsInRange) {
+ sSubscribedCrystals.putIfAbsent(tCrystalID, this);
+ }
+ }
+
+ @Override
+ public String[] getDescription() {
+ final String LI = "- %%%";
+ final String EU_PER = "%%%EU per ";
+ List<String> description = new ArrayList<>();
+ description
+ .add(UNDERLINE + "Feasts on " + LIGHT_PURPLE + UNDERLINE + "magic" + GRAY + UNDERLINE + " close to it:");
+ description.add(
+ LI + (sAllowMultipleEggs ? "A " : "An " + YELLOW + UNDERLINE + "EXCLUSIVE" + RESET)
+ + GRAY
+ + " "
+ + LIGHT_PURPLE
+ + "Dragon Egg"
+ + GRAY
+ + " atop");
+ if (sEnergyPerEndercrystal > 0) {
+ description.add(LI + sEnergyPerEndercrystal + EU_PER + LIGHT_PURPLE + "Ender Crystal" + GRAY + " in range");
+ }
+ if (THAUMCRAFT_LOADED) {
+ description.add(LI + mMaxVisPerDrain + "%%%CV/t from an " + LIGHT_PURPLE + "Energised Node" + GRAY);
+ description.add(
+ LI + (sEnergyPerEssentia * getEfficiency()) / 100
+ + EU_PER
+ + LIGHT_PURPLE
+ + "Essentia"
+ + GRAY
+ + " Aspect-Value from containers in range");
+ }
+ description.add(" ");
+ description.add(UNDERLINE + "Lookup range (Use Screwdriver to change):");
+ description.add("Default: %%%" + GREEN + mMagicalEnergyBB.getDefaultRange());
+ description.add("Max: %%%" + GREEN + mMagicalEnergyBB.getMaxRange());
+ description.add(" ");
+ description
+ .add(UNDERLINE + "Fuels on " + LIGHT_PURPLE + UNDERLINE + "enchantments" + GRAY + UNDERLINE + " input:");
+ description.add(
+ "- Item: %%%" + (10000 * getEfficiency()) / 100
+ + EU_PER
+ + LIGHT_PURPLE
+ + "enchant"
+ + GRAY
+ + " weight × level / max");
+ description.add("- Book: %%%" + 10000 + EU_PER + LIGHT_PURPLE + "enchant" + GRAY + " weight × level / max");
+ description.add(" ");
+ description.add("Efficiency: %%%" + GREEN + getEfficiency() + "%");
+ return description.toArray(new String[0]);
+ }
+
+ @Override
+ public ITexture[] getFront(byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_GLOW)
+ .glow()
+ .build(),
+ OVERLAYS_ENERGY_OUT[mTier] };
+ }
+
+ @Override
+ public ITexture[] getBack(byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_FRONT),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_FRONT_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottom(byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTop(byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0], TextureFactory.of(MACHINE_CASING_DRAGONEGG) };
+ }
+
+ @Override
+ public ITexture[] getSides(byte aColor) {
+ return new ITexture[] { super.getSides(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW)
+ .glow()
+ .build(),
+ OVERLAYS_ENERGY_OUT[mTier] };
+ }
+
+ @Override
+ public ITexture[] getBackActive(byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_FRONT_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopActive(byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0], TextureFactory.of(MACHINE_CASING_DRAGONEGG),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_DRAGONEGG_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(byte aColor) {
+ return new ITexture[] { super.getSidesActive(aColor)[0], TextureFactory.of(MACHINE_CASING_MAGIC_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_MAGIC_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(getEUVar(), V[mTier] * 16000 + getMinimumStoredEU());
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (!aBaseMetaTileEntity.isServerSide()) return;
+ if (!aBaseMetaTileEntity.isAllowedToWork()) return;
+ if ((aBaseMetaTileEntity.getUniversalEnergyStored() >= aBaseMetaTileEntity.getEUCapacity())) return;
+
+ long tGeneratedEU;
+
+ if (aTick % 100 == 0 && mUsingEssentia) mMagicalEnergyBB.update();
+
+ // Adaptive EU Generation Ticking
+ if (aTick % mNextGenerateTickRate == 0) {
+ tGeneratedEU = generateEU();
+ if (tGeneratedEU > 0) {
+ mNoGenerationTicks = 0;
+ if (tGeneratedEU >= 2 * V[mTier])
+ mNextGenerateTickRate = (long) (1.0D / ((2.0D * (double) (V[mTier])) / (double) tGeneratedEU));
+ else mNextGenerateTickRate = 1;
+ mInventory[getStackDisplaySlot()] = new ItemStack(Blocks.fire, 1);
+ mInventory[getStackDisplaySlot()].setStackDisplayName("Generating: " + tGeneratedEU + " EU");
+ } else {
+ mInventory[getStackDisplaySlot()] = null;
+ mNoGenerationTicks += 1;
+ }
+ if (mNoGenerationTicks > 20) {
+ mNoGenerationTicks = 0;
+ mNextGenerateTickRate = 20;
+ }
+ aBaseMetaTileEntity.increaseStoredEnergyUnits(tGeneratedEU, true);
+ aBaseMetaTileEntity.setActive(
+ aBaseMetaTileEntity.isAllowedToWork()
+ && aBaseMetaTileEntity.getUniversalEnergyStored() >= maxEUOutput() + getMinimumStoredEU());
+ }
+ }
+
+ /**
+ * Draws random portal particles on top when active with an egg on top
+ *
+ * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick}
+ */
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) {
+
+ if (aBaseMetaTileEntity.isActive()) {
+
+ if (isEgg(aBaseMetaTileEntity.getBlockAtSide(ForgeDirection.UP))) {
+
+ final double oX = aBaseMetaTileEntity.getXCoord() + 8D / 16D;
+ final double oY = aBaseMetaTileEntity.getYCoord() + 17D / 32D;
+ final double oZ = aBaseMetaTileEntity.getZCoord() + 8D / 16D;
+
+ final ParticleEventBuilder particleEventBuilder = new ParticleEventBuilder()
+ .setWorld(getBaseMetaTileEntity().getWorld())
+ .setIdentifier(ParticleFX.PORTAL);
+
+ for (int i = 0; i < 9; i++) {
+ final double dX = (XSTR_INSTANCE.nextFloat() - 0.5D) / 2D;
+ final double dY = XSTR_INSTANCE.nextFloat() * 1.5;
+ final double dZ = (XSTR_INSTANCE.nextFloat() - 0.5D) / 2D;
+
+ final double x = oX + dX;
+ final double y = oY + dY;
+ final double z = oZ + dZ;
+
+ final double mX = dX * 4D;
+ final double dXZ = Math.sqrt(dX * dX + dZ * dZ);
+ final double mY = -(dXZ * dY) / 4D;
+ final double mZ = dZ * 4D;
+
+ particleEventBuilder.setMotion(mX, mY, mZ)
+ .setPosition(x, y, z)
+ .run();
+ }
+ }
+ }
+ }
+
+ @Override
+ public int getPollution() {
+ return 0;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.magicFuels;
+ }
+
+ @Override
+ public int getEfficiency() {
+ return mEfficiency;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ // Restrict input to disenchantable items or enchanted books
+ return (isDisenchantableItem(aStack) || isEnchantedBook(aStack));
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ private boolean isDisenchantableItem(ItemStack aStack) {
+ return ((aStack.isItemEnchanted()) && (aStack.getItem()
+ .getItemEnchantability() > 0));
+ }
+
+ private boolean isEnchantedBook(ItemStack aStack) {
+ return (aStack.getItem() instanceof ItemEnchantedBook);
+ }
+
+ private long generateEU() {
+ long tEU;
+
+ mUsingEssentia = false;
+ if ((tEU = absorbFromEgg()) > 0) return tEU;
+ if ((tEU = absorbFromEnderCrystals()) > 0) return tEU;
+ if ((tEU = absorbFromEnchantedItems()) > 0) return tEU;
+ if ((tEU = absorbFromVisNet()) > 0) return tEU;
+ mUsingEssentia = true;
+ if ((tEU = absorbFromEssentiaContainers()) > 0) return tEU;
+ return 0;
+ }
+
+ private long absorbFromEnchantedItems() {
+ ItemStack tStack = getBaseMetaTileEntity().getStackInSlot(getInputSlot());
+ if (tStack == null) return 0;
+ if (tStack.stackSize == 0) return 0;
+ if (!(isDisenchantableItem(tStack) || isEnchantedBook(tStack))) return 0;
+ long tEU = 0;
+ // Convert enchantments to their EU Value
+ Map<?, ?> tMap = EnchantmentHelper.getEnchantments(tStack);
+ for (Map.Entry<?, ?> e : tMap.entrySet()) {
+ if ((Integer) e.getKey() < Enchantment.enchantmentsList.length) {
+ Enchantment tEnchantment = Enchantment.enchantmentsList[(Integer) e.getKey()];
+ Integer tLevel = (Integer) e.getValue();
+ tEU += 1000000L * tLevel / tEnchantment.getMaxLevel() / tEnchantment.getWeight();
+ }
+ }
+
+ ItemStack tOutputStack = GT_Utility.copyAmount(1, tStack);
+ if (tOutputStack != null) {
+ if (isDisenchantableItem(tOutputStack)) {
+ tEU = tEU * getEfficiency() / 100;
+ EnchantmentHelper.setEnchantments(new HashMap<>(), tOutputStack);
+ } else if (isEnchantedBook(tOutputStack)) {
+ tOutputStack = new ItemStack(Items.book, 1);
+ }
+ }
+
+ // Only consume input when it can store EU and push output
+ if ((getBaseMetaTileEntity().getStoredEU() + tEU) < getBaseMetaTileEntity().getEUCapacity()
+ && getBaseMetaTileEntity().addStackToSlot(getOutputSlot(), tOutputStack)) {
+ decrStackSize(getInputSlot(), 1);
+ } else {
+ tEU = 0;
+ }
+ return tEU;
+ }
+
+ private boolean hasEgg() {
+ Block above = getBaseMetaTileEntity().getBlockOffset(0, 1, 0);
+ return isEgg(above);
+ }
+
+ private long absorbFromEgg() {
+ if (!hasEgg()) return 0;
+ if (!sAllowMultipleEggs) {
+ if (sActiveSiphon != null && sActiveSiphon != this
+ && sActiveSiphon.getBaseMetaTileEntity() != null
+ && !sActiveSiphon.getBaseMetaTileEntity()
+ .isInvalidTileEntity()
+ && sActiveSiphon.isChunkLoaded()
+ && sActiveSiphon.hasEgg()) {
+ getBaseMetaTileEntity().doExplosion(Integer.MAX_VALUE);
+ } else {
+ setActiveSiphon(this);
+ }
+ }
+ Block egg = getBaseMetaTileEntity().getBlockOffset(0, 1, 0);
+ if (egg == Blocks.dragon_egg) {
+ return sDragonEggEnergyPerTick;
+ } else if (egg.getUnlocalizedName()
+ .contains("creeperEgg")) {
+ return sCreeperEggEnergyPerTick;
+ }
+ return 0;
+ }
+
+ private long absorbFromEnderCrystals() {
+ if (sEnergyPerEndercrystal <= 0) return 0;
+ long tEU = 0;
+ for (GT_MetaTileEntity_MagicalEnergyAbsorber tSubscriber : sSubscribedCrystals.values()) {
+ if (tSubscriber == this) { // This Crystal is for me
+ tEU += sEnergyPerEndercrystal;
+ }
+ }
+ return tEU;
+ }
+
+ private long absorbFromVisNet() {
+ if (!THAUMCRAFT_LOADED) return 0;
+
+ long tEU;
+ IGregTechTileEntity tBaseMetaTileEntity = getBaseMetaTileEntity();
+ World tWorld = tBaseMetaTileEntity.getWorld();
+ int tX = tBaseMetaTileEntity.getXCoord();
+ int tY = tBaseMetaTileEntity.getYCoord();
+ int tZ = tBaseMetaTileEntity.getZCoord();
+
+ // Attempt to drain as much Vis as needed for max EU/t, from all primal aspects.
+ int toDrain = mMaxVisPerDrain;
+
+ for (int i = sPrimalAspects.size() - 1; i >= 0 && toDrain > 0; i--) {
+ toDrain -= VisNetHandler.drainVis(tWorld, tX, tY, tZ, sPrimalAspects.get(i), toDrain);
+ }
+
+ int drained = mMaxVisPerDrain - toDrain;
+ tEU = (long) Math.min(maxEUOutput(), (Math.pow(drained, 2) * sEnergyFromVis * getEfficiency() / 10000));
+
+ return tEU;
+ }
+
+ private long absorbFromEssentiaContainers() {
+ if (!THAUMCRAFT_LOADED) return 0;
+
+ long tEU = 0;
+
+ long tEUtoGen = getBaseMetaTileEntity().getEUCapacity() - getBaseMetaTileEntity().getUniversalEnergyStored();
+ List<Aspect> mAvailableEssentiaAspects = mMagicalEnergyBB.getAvailableAspects();
+
+ // try to drain 1 of whatever aspect available in containers within RANGE
+ for (int i = mAvailableEssentiaAspects.size() - 1; i >= 0 && tEUtoGen > 0; i--) {
+ Aspect aspect = mAvailableEssentiaAspects.get(i);
+ long tAspectEU = ((long) sAspectsEnergy.get(aspect) * getEfficiency()) / 100;
+ if (tAspectEU <= tEUtoGen && AspectSourceHelper.drainEssentia(
+ (TileEntity) getBaseMetaTileEntity(),
+ aspect,
+ ForgeDirection.UNKNOWN,
+ mMagicalEnergyBB.getRange())) {
+ tEUtoGen -= tAspectEU;
+ tEU += tAspectEU;
+ }
+ }
+ return tEU;
+ }
+
+ private boolean isEgg(Block aBlock) {
+ if (aBlock == null) return false;
+ if (aBlock == Blocks.air) return false;
+ if (aBlock == Blocks.dragon_egg) return true;
+ if (aBlock instanceof BlockDragonEgg) return true;
+ return (aBlock.getUnlocalizedName()
+ .equals("tile.dragonEgg"));
+ }
+
+ private boolean isChunkLoaded() {
+ IGregTechTileEntity tBaseMetaTileEntity = getBaseMetaTileEntity();
+ int tX = tBaseMetaTileEntity.getXCoord();
+ int tY = tBaseMetaTileEntity.getYCoord();
+ World tWorld = tBaseMetaTileEntity.getWorld();
+ Chunk tChunk = tWorld.getChunkFromBlockCoords(tX, tY);
+ return tChunk.isChunkLoaded;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_MagicalEnergyAbsorber(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mMagicalEnergyBBTier", mMagicalEnergyBB.getTier());
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mMagicalEnergyBB.setTier(aNBT.getInteger("mMagicalEnergyBBTier"));
+ }
+
+ /**
+ * Handles Bounding Box ranged operations for Magic sources
+ */
+ static class MagicalEnergyBB {
+
+ private final GT_MetaTileEntity_MagicalEnergyAbsorber mAbsorber;
+ private final MagicalEnergyBBListener mListener;
+ private final int mDefaultTier;
+ private int mTier;
+ private final int mMaxTier;
+ private final List<UUID> mLivingCrystalIDs = new ArrayList<>();
+ private List<Aspect> mAvailableAspects;
+
+ /**
+ * @param aAbsorber user and subscriber for updated BB content
+ * @param aDefaultTier Initial tier value
+ * @param aMaxTier Maximum allowed tier
+ */
+ MagicalEnergyBB(GT_MetaTileEntity_MagicalEnergyAbsorber aAbsorber, int aDefaultTier, int aMaxTier) {
+ mAbsorber = aAbsorber;
+ mListener = aAbsorber;
+ mMaxTier = Math.max(Math.max(aMaxTier, 0), Math.max(aDefaultTier, 0));
+ mDefaultTier = Math.min(aDefaultTier, mMaxTier);
+ mTier = mDefaultTier;
+ if (THAUMCRAFT_LOADED) mAvailableAspects = new ArrayList<>(Aspect.aspects.size());
+ }
+
+ int getTier() {
+ return mTier;
+ }
+
+ /**
+ * Set Bounding Box Tier within allowed bounds
+ *
+ * @param aTier new tier value
+ * @return effective new tier
+ */
+ int setTier(int aTier) {
+ if (aTier >= 0) {
+ mTier = Math.min(aTier, mMaxTier);
+ } else {
+ mTier = 0;
+ }
+ return mTier;
+ }
+
+ int getRange() {
+ return getRange(mTier);
+ }
+
+ int getRange(int aTier) {
+ return 1 << aTier;
+ }
+
+ int getDefaultTier() {
+ return mDefaultTier;
+ }
+
+ int getDefaultRange() {
+ return getRange(getDefaultTier());
+ }
+
+ int getMaxTier() {
+ return mMaxTier;
+ }
+
+ int getMaxRange() {
+ return getRange(getMaxTier());
+ }
+
+ private AxisAlignedBB getAxisAlignedBB() {
+ double tRange = getRange();
+ IGregTechTileEntity tBaseMetaTileEntity = mAbsorber.getBaseMetaTileEntity();
+ double tX = tBaseMetaTileEntity.getXCoord();
+ double tY = tBaseMetaTileEntity.getYCoord();
+ double tZ = tBaseMetaTileEntity.getZCoord();
+ return AxisAlignedBB
+ .getBoundingBox(tX - tRange, tY - tRange, tZ - tRange, tX + tRange, tY + tRange, tZ + tRange);
+ }
+
+ private void scanLivingCrystals() {
+ World tWorld = mAbsorber.getBaseMetaTileEntity()
+ .getWorld();
+ mLivingCrystalIDs.clear();
+ for (EntityEnderCrystal o : tWorld.getEntitiesWithinAABB(EntityEnderCrystal.class, getAxisAlignedBB())) {
+ if (o.isEntityAlive()) {
+ mLivingCrystalIDs.add(o.getPersistentID());
+ }
+ }
+ }
+
+ private void scanAvailableAspects() {
+ if (!THAUMCRAFT_LOADED) return;
+ IGregTechTileEntity tBaseMetaTileEntity = mAbsorber.getBaseMetaTileEntity();
+ if (tBaseMetaTileEntity.isInvalidTileEntity()) return;
+ int tRange = getRange();
+ int tY = tBaseMetaTileEntity.getYCoord();
+ int tMaxY = tBaseMetaTileEntity.getWorld()
+ .getHeight() - 1;
+ // Make sure relative Y range stays between 0 and world max Y
+ int rYMin = (tY - tRange >= 0) ? -tRange : -(tY);
+ int rYMax = (((tY + tRange) <= tMaxY) ? tRange : tMaxY - tY);
+ mAvailableAspects.clear();
+ for (int rX = -tRange; rX <= tRange; rX++) {
+ for (int rZ = -tRange; rZ <= tRange; rZ++) {
+ // rY < rYMax is not a bug. See: thaumcraft.common.lib.events.EssentiaHandler.getSources()
+ for (int rY = rYMin; rY < rYMax; rY++) {
+ TileEntity tTile = tBaseMetaTileEntity.getTileEntityOffset(rX, rY, rZ);
+ if (tTile instanceof IAspectContainer) {
+ AspectList tAspectList = ((IAspectContainer) tTile).getAspects();
+ if (tAspectList == null || tAspectList.aspects.isEmpty()) continue;
+ Set<Aspect> tAspects = tAspectList.aspects.keySet();
+ mAvailableAspects.addAll(tAspects);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @return List of Living Ender Crystal Entity IDs in range
+ */
+ List<UUID> getLivingCrystalIDs() {
+ return mLivingCrystalIDs;
+ }
+
+ /**
+ * @return List of drainable Essentia Aspects from containers in range
+ */
+ List<Aspect> getAvailableAspects() {
+ return mAvailableAspects;
+ }
+
+ /**
+ * Scan range for magic sources
+ */
+ void update() {
+ if (mAbsorber == null) return;
+ if (mAbsorber.getBaseMetaTileEntity() == null) return;
+ if (mAbsorber.getBaseMetaTileEntity()
+ .isInvalidTileEntity()) return;
+ if (mAbsorber.getBaseMetaTileEntity()
+ .getWorld() == null) return;
+ scanLivingCrystals();
+ scanAvailableAspects();
+ if (mListener != null) {
+ mListener.onMagicalEnergyBBUpdate();
+ }
+ }
+
+ void increaseTier() {
+ offsetTier(1);
+ }
+
+ void decreaseTier() {
+ offsetTier(-1);
+ }
+
+ /**
+ * Change the Bounding Box tier relatively to offset with wrapping at tier limits
+ *
+ * @param aOffset relative tier change
+ */
+ void offsetTier(int aOffset) {
+ int tNumTiers = mMaxTier + 1;
+ int tTier = (mTier + aOffset + tNumTiers) % tNumTiers;
+ int tTrueTier = setTier(tTier);
+ if (tTier != tTrueTier) {
+ GT_Log.out.format("Absorber's BB Tier set to %d was capped to %d", tTier, tTrueTier);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_NaquadahReactor.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_NaquadahReactor.java
new file mode 100644
index 0000000000..ba5aaf4c64
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_NaquadahReactor.java
@@ -0,0 +1,208 @@
+package gregtech.common.tileentities.generators;
+
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BACK;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BACK_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BACK_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BACK_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_BOTTOM_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_FRONT;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_FRONT_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_SIDE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.NAQUADAH_REACTOR_SOLID_TOP_GLOW;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_NaquadahReactor extends GT_MetaTileEntity_BasicGenerator {
+
+ private int mEfficiency;
+
+ public GT_MetaTileEntity_NaquadahReactor(int aID, String aName, String[] aDescription, String aNameRegional,
+ int aTier) {
+ super(aID, aName, aNameRegional, aTier, aDescription);
+ if (aTier > 8 || aTier < 4) {
+ new Exception("Tier without Recipe Map!").printStackTrace();
+ }
+ onConfigLoad();
+ }
+
+ public GT_MetaTileEntity_NaquadahReactor(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ if (aTier > 8 || aTier < 4) {
+ new Exception("Tier without Recipe Map!").printStackTrace();
+ }
+ onConfigLoad();
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ if (side == ForgeDirection.UNKNOWN) return false;
+ return ((side.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0)
+ && (side != getBaseMetaTileEntity().getFrontFacing())
+ && (side != getBaseMetaTileEntity().getBackFacing());
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_NaquadahReactor(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ RecipeMap<?> ret;
+ switch (mTier) {
+ case 4 -> ret = RecipeMaps.smallNaquadahReactorFuels;
+ case 5 -> ret = RecipeMaps.largeNaquadahReactorFuels;
+ case 6 -> ret = RecipeMaps.hugeNaquadahReactorFuels;
+ case 7 -> ret = RecipeMaps.extremeNaquadahReactorFuels;
+ case 8 -> ret = RecipeMaps.ultraHugeNaquadahReactorFuels;
+ default -> ret = null;
+ }
+ return ret;
+ }
+
+ @Override
+ public int getCapacity() {
+ return getRecipeMap() != null ? getRecipeMap().getBackend()
+ .getProperties().minFluidInputs > 0 ? 8000 * (mTier + 1) : 0 : 0;
+ }
+
+ @Override
+ public int getEfficiency() {
+ return mEfficiency == 0 ? onConfigLoad() : mEfficiency;
+ }
+
+ private int getBaseEff() {
+ return mTier == 4 ? 80 : 100 + (50 * (mTier - 5));
+ }
+
+ public int onConfigLoad() {
+ return mEfficiency = GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "SolidNaquadah.efficiency.tier." + mTier, getBaseEff());
+ }
+
+ @Override
+ public ITexture[] getFront(byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(NAQUADAH_REACTOR_SOLID_FRONT),
+ TextureFactory.builder()
+ .addIcon(NAQUADAH_REACTOR_SOLID_FRONT_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getBack(byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(NAQUADAH_REACTOR_SOLID_BACK),
+ TextureFactory.builder()
+ .addIcon(NAQUADAH_REACTOR_SOLID_BACK_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getBottom(byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(NAQUADAH_REACTOR_SOLID_BOTTOM),
+ TextureFactory.builder()
+ .addIcon(NAQUADAH_REACTOR_SOLID_BOTTOM_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getTop(byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(NAQUADAH_REACTOR_SOLID_TOP),
+ TextureFactory.builder()
+ .addIcon(NAQUADAH_REACTOR_SOLID_TOP_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getSides(byte aColor) {
+ return new ITexture[] { super.getSides(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(NAQUADAH_REACTOR_SOLID_SIDE),
+ TextureFactory.builder()
+ .addIcon(NAQUADAH_REACTOR_SOLID_SIDE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0], TextureFactory.of(NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBackActive(byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0], TextureFactory.of(NAQUADAH_REACTOR_SOLID_BACK_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(NAQUADAH_REACTOR_SOLID_BACK_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0],
+ TextureFactory.of(NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE), TextureFactory.builder()
+ .addIcon(NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopActive(byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0], TextureFactory.of(NAQUADAH_REACTOR_SOLID_TOP_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(NAQUADAH_REACTOR_SOLID_TOP_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(byte aColor) {
+ return new ITexture[] { super.getSidesActive(aColor)[0], TextureFactory.of(NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public int getPollution() {
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_PlasmaGenerator.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_PlasmaGenerator.java
new file mode 100644
index 0000000000..603c1439ba
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_PlasmaGenerator.java
@@ -0,0 +1,147 @@
+package gregtech.common.tileentities.generators;
+
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_PlasmaGenerator extends GT_MetaTileEntity_BasicGenerator {
+
+ public int mEfficiency;
+
+ public GT_MetaTileEntity_PlasmaGenerator(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, "Plasma into energy");
+ onConfigLoad();
+ }
+
+ public GT_MetaTileEntity_PlasmaGenerator(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ onConfigLoad();
+ }
+
+ public GT_MetaTileEntity_PlasmaGenerator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ onConfigLoad();
+ }
+
+ @Override
+ public ITexture[] getFront(byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS),
+ OVERLAYS_ENERGY_OUT[mTier] };
+ }
+
+ @Override
+ public ITexture[] getBack(byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS) };
+ }
+
+ @Override
+ public ITexture[] getBottom(byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS) };
+ }
+
+ @Override
+ public ITexture[] getTop(byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS) };
+ }
+
+ @Override
+ public ITexture[] getSides(byte aColor) {
+ return new ITexture[] { super.getSides(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW)
+ .glow()
+ .build(),
+ OVERLAYS_ENERGY_OUT[mTier] };
+ }
+
+ @Override
+ public ITexture[] getBackActive(byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopActive(byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(byte aColor) {
+ return new ITexture[] { super.getSidesActive(aColor)[0], TextureFactory.of(MACHINE_CASING_FUSION_GLASS_YELLOW),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.plasmaFuels;
+ }
+
+ @Override
+ public int getEfficiency() {
+ return this.mEfficiency;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 16000;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_PlasmaGenerator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile.get(
+ ConfigCategories.machineconfig,
+ "PlasmaGenerator.efficiency.tier." + this.mTier,
+ Math.max(10, 10 + Math.min(90, this.mTier * 10)));
+ }
+
+ @Override
+ public int getPollution() {
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_SteamTurbine.java b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_SteamTurbine.java
new file mode 100644
index 0000000000..3c9a89815a
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/generators/GT_MetaTileEntity_SteamTurbine.java
@@ -0,0 +1,245 @@
+package gregtech.common.tileentities.generators;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BACK;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BACK_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BACK_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BACK_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BOTTOM;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BOTTOM_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BOTTOM_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_BOTTOM_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_FRONT;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_FRONT_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_FRONT_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_FRONT_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_SIDE;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_SIDE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_SIDE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_SIDE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_TOP;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_TOP_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_TOP_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.STEAM_TURBINE_TOP_GLOW;
+
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicGenerator;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+
+public class GT_MetaTileEntity_SteamTurbine extends GT_MetaTileEntity_BasicGenerator {
+
+ public int mEfficiency;
+
+ public GT_MetaTileEntity_SteamTurbine(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ new String[] { "Converts Steam into EU", "Base rate: 2L of Steam -> 1 EU" });
+ onConfigLoad();
+ }
+
+ public GT_MetaTileEntity_SteamTurbine(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ onConfigLoad();
+ }
+
+ public GT_MetaTileEntity_SteamTurbine(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ onConfigLoad();
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_SteamTurbine(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return null;
+ }
+
+ @Override
+ public String[] getDescription() {
+ String[] desc = new String[mDescriptionArray.length + 2];
+ System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length);
+ desc[mDescriptionArray.length] = "Fuel Efficiency: " + (600 / getEfficiency()) + "%";
+ desc[mDescriptionArray.length + 1] = String.format(
+ "Consumes up to %sL of Steam per second",
+ (int) (4000 * (8 * Math.pow(4, mTier) + Math.pow(2, Math.max(mTier - 1, 0))) / (600 / getEfficiency())));
+ return desc;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 24000 * this.mTier;
+ }
+
+ public void onConfigLoad() {
+ this.mEfficiency = GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "SteamTurbine.efficiency.tier." + this.mTier, 6 + this.mTier);
+ }
+
+ @Override
+ public int getEfficiency() {
+ return this.mEfficiency;
+ }
+
+ @Override
+ public long getFuelValue(FluidStack aLiquid, boolean aLong) {
+ return getFuelValue(aLiquid);
+ }
+
+ @Override
+ public int getFuelValue(FluidStack aLiquid) {
+ if (aLiquid == null) return 0;
+ return GT_ModHandler.isAnySteam(aLiquid) ? 3 : 0;
+ }
+
+ @Override
+ public int consumedFluidPerOperation(FluidStack aLiquid) {
+ return this.mEfficiency;
+ }
+
+ @Override
+ public ITexture[] getFront(byte aColor) {
+ return new ITexture[] { super.getFront(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(STEAM_TURBINE_FRONT),
+ TextureFactory.builder()
+ .addIcon(STEAM_TURBINE_FRONT_GLOW)
+ .glow()
+ .build()),
+ OVERLAYS_ENERGY_OUT[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBack(byte aColor) {
+ return new ITexture[] { super.getBack(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(STEAM_TURBINE_BACK),
+ TextureFactory.builder()
+ .addIcon(STEAM_TURBINE_BACK_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getBottom(byte aColor) {
+ return new ITexture[] { super.getBottom(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(STEAM_TURBINE_BOTTOM),
+ TextureFactory.builder()
+ .addIcon(STEAM_TURBINE_BOTTOM_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getTop(byte aColor) {
+ return new ITexture[] { super.getTop(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(STEAM_TURBINE_TOP),
+ TextureFactory.builder()
+ .addIcon(STEAM_TURBINE_TOP_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getSides(byte aColor) {
+ return new ITexture[] { super.getSides(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(STEAM_TURBINE_SIDE),
+ TextureFactory.builder()
+ .addIcon(STEAM_TURBINE_SIDE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getFrontActive(byte aColor) {
+ return new ITexture[] { super.getFrontActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(STEAM_TURBINE_FRONT_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(STEAM_TURBINE_FRONT_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ OVERLAYS_ENERGY_OUT[this.mTier] };
+ }
+
+ @Override
+ public ITexture[] getBackActive(byte aColor) {
+ return new ITexture[] { super.getBackActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(STEAM_TURBINE_BACK_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(STEAM_TURBINE_BACK_ACTIVE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getBottomActive(byte aColor) {
+ return new ITexture[] { super.getBottomActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(STEAM_TURBINE_BOTTOM_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(STEAM_TURBINE_BOTTOM_ACTIVE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getTopActive(byte aColor) {
+ return new ITexture[] { super.getTopActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(STEAM_TURBINE_TOP_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(STEAM_TURBINE_TOP_ACTIVE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[] getSidesActive(byte aColor) {
+ return new ITexture[] { super.getSidesActive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(STEAM_TURBINE_SIDE_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(STEAM_TURBINE_SIDE_ACTIVE_GLOW)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public int getPollution() {
+ return 0;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ if (GT_ModHandler.isSuperHeatedSteam(aFluid)) {
+ aFluid.amount = 0;
+ aFluid = null;
+ return false;
+ }
+ return super.isFluidInputAllowed(aFluid);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Bronze.java
new file mode 100644
index 0000000000..252cc6a5b8
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Bronze.java
@@ -0,0 +1,45 @@
+package gregtech.common.tileentities.machines;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull_NonElectric;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_BasicHull_Bronze extends GT_MetaTileEntity_BasicHull_NonElectric {
+
+ public GT_MetaTileEntity_BasicHull_Bronze(int aID, String aName, String aNameRegional, int aTier,
+ String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aDescription);
+ }
+
+ public GT_MetaTileEntity_BasicHull_Bronze(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicHull_Bronze(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_BasicHull_Bronze(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[3][17][];
+ for (byte i = -1; i < 16; i = (byte) (i + 1)) {
+ rTextures[0][(i + 1)] = new ITexture[] {
+ TextureFactory.of(Textures.BlockIcons.MACHINE_BRONZE_BOTTOM, Dyes.getModulation(i, Dyes._NULL.mRGBa)) };
+ rTextures[1][(i + 1)] = new ITexture[] {
+ TextureFactory.of(Textures.BlockIcons.MACHINE_BRONZE_TOP, Dyes.getModulation(i, Dyes._NULL.mRGBa)) };
+ rTextures[2][(i + 1)] = new ITexture[] {
+ TextureFactory.of(Textures.BlockIcons.MACHINE_BRONZE_SIDE, Dyes.getModulation(i, Dyes._NULL.mRGBa)) };
+ }
+ return rTextures;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_BronzeBricks.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_BronzeBricks.java
new file mode 100644
index 0000000000..ee788ba8c0
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_BronzeBricks.java
@@ -0,0 +1,53 @@
+package gregtech.common.tileentities.machines;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull_NonElectric;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_BasicHull_BronzeBricks extends GT_MetaTileEntity_BasicHull_NonElectric {
+
+ public GT_MetaTileEntity_BasicHull_BronzeBricks(int aID, String aName, String aNameRegional, int aTier,
+ String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aDescription);
+ }
+
+ public GT_MetaTileEntity_BasicHull_BronzeBricks(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicHull_BronzeBricks(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_BasicHull_BronzeBricks(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[3][17][];
+ for (byte i = -1; i < 16; i = (byte) (i + 1)) {
+ ITexture[] tmp0 = { TextureFactory
+ .of(Textures.BlockIcons.MACHINE_BRONZEBRICKS_BOTTOM, Dyes.getModulation(i, Dyes._NULL.mRGBa)) };
+ rTextures[0][(i + 1)] = tmp0;
+ ITexture[] tmp1 = { TextureFactory
+ .of(Textures.BlockIcons.MACHINE_BRONZEBRICKS_TOP, Dyes.getModulation(i, Dyes._NULL.mRGBa)) };
+ rTextures[1][(i + 1)] = tmp1;
+ ITexture[] tmp2 = { TextureFactory
+ .of(Textures.BlockIcons.MACHINE_BRONZEBRICKS_SIDE, Dyes.getModulation(i, Dyes._NULL.mRGBa)) };
+ rTextures[2][(i + 1)] = tmp2;
+ }
+ return rTextures;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Steel.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Steel.java
new file mode 100644
index 0000000000..85e461bf47
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_Steel.java
@@ -0,0 +1,47 @@
+package gregtech.common.tileentities.machines;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull_NonElectric;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_BasicHull_Steel extends GT_MetaTileEntity_BasicHull_NonElectric {
+
+ public GT_MetaTileEntity_BasicHull_Steel(int aID, String aName, String aNameRegional, int aTier,
+ String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aDescription);
+ }
+
+ public GT_MetaTileEntity_BasicHull_Steel(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicHull_Steel(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_BasicHull_Steel(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[3][17][];
+ for (byte i = -1; i < 16; i = (byte) (i + 1)) {
+ ITexture[] tmp0 = {
+ TextureFactory.of(Textures.BlockIcons.MACHINE_STEEL_BOTTOM, Dyes.getModulation(i, Dyes._NULL.mRGBa)) };
+ rTextures[0][(i + 1)] = tmp0;
+ ITexture[] tmp1 = {
+ TextureFactory.of(Textures.BlockIcons.MACHINE_STEEL_TOP, Dyes.getModulation(i, Dyes._NULL.mRGBa)) };
+ rTextures[1][(i + 1)] = tmp1;
+ ITexture[] tmp2 = {
+ TextureFactory.of(Textures.BlockIcons.MACHINE_STEEL_SIDE, Dyes.getModulation(i, Dyes._NULL.mRGBa)) };
+ rTextures[2][(i + 1)] = tmp2;
+ }
+ return rTextures;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_SteelBricks.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_SteelBricks.java
new file mode 100644
index 0000000000..cd5f547d22
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_BasicHull_SteelBricks.java
@@ -0,0 +1,53 @@
+package gregtech.common.tileentities.machines;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull_NonElectric;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_BasicHull_SteelBricks extends GT_MetaTileEntity_BasicHull_NonElectric {
+
+ public GT_MetaTileEntity_BasicHull_SteelBricks(int aID, String aName, String aNameRegional, int aTier,
+ String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aDescription);
+ }
+
+ public GT_MetaTileEntity_BasicHull_SteelBricks(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_BasicHull_SteelBricks(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_BasicHull_SteelBricks(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[3][17][];
+ for (byte i = -1; i < 16; i = (byte) (i + 1)) {
+ ITexture[] tmp0 = { TextureFactory
+ .of(Textures.BlockIcons.MACHINE_STEELBRICKS_BOTTOM, Dyes.getModulation(i, Dyes._NULL.mRGBa)) };
+ rTextures[0][(i + 1)] = tmp0;
+ ITexture[] tmp1 = { TextureFactory
+ .of(Textures.BlockIcons.MACHINE_STEELBRICKS_TOP, Dyes.getModulation(i, Dyes._NULL.mRGBa)) };
+ rTextures[1][(i + 1)] = tmp1;
+ ITexture[] tmp2 = { TextureFactory
+ .of(Textures.BlockIcons.MACHINE_STEELBRICKS_SIDE, Dyes.getModulation(i, Dyes._NULL.mRGBa)) };
+ rTextures[2][(i + 1)] = tmp2;
+ }
+ return rTextures;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_ME.java
new file mode 100644
index 0000000000..f7ba3af5f0
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_ME.java
@@ -0,0 +1,1039 @@
+package gregtech.common.tileentities.machines;
+
+import static gregtech.api.enums.GT_Values.TIER_COLORS;
+import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_CRAFTING_INPUT_BUFFER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_CRAFTING_INPUT_BUS;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.InventoryCrafting;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.event.ForgeEventFactory;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.jetbrains.annotations.NotNull;
+
+import com.glodblock.github.common.item.ItemFluidPacket;
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Size;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import appeng.api.AEApi;
+import appeng.api.implementations.ICraftingPatternItem;
+import appeng.api.implementations.IPowerChannelState;
+import appeng.api.networking.GridFlags;
+import appeng.api.networking.IGridNode;
+import appeng.api.networking.crafting.ICraftingPatternDetails;
+import appeng.api.networking.crafting.ICraftingProvider;
+import appeng.api.networking.crafting.ICraftingProviderHelper;
+import appeng.api.networking.events.MENetworkCraftingPatternChange;
+import appeng.api.networking.security.BaseActionSource;
+import appeng.api.networking.security.IActionHost;
+import appeng.api.networking.security.MachineSource;
+import appeng.api.storage.IMEMonitor;
+import appeng.api.storage.data.IAEFluidStack;
+import appeng.api.storage.data.IAEItemStack;
+import appeng.api.util.AECableType;
+import appeng.api.util.DimensionalCoord;
+import appeng.api.util.IInterfaceViewable;
+import appeng.core.AppEng;
+import appeng.core.sync.GuiBridge;
+import appeng.helpers.ICustomNameObject;
+import appeng.items.misc.ItemEncodedPattern;
+import appeng.items.tools.quartz.ToolQuartzCuttingKnife;
+import appeng.me.GridAccessException;
+import appeng.me.helpers.AENetworkProxy;
+import appeng.me.helpers.IGridProxyable;
+import appeng.util.IWideReadableNumberConverter;
+import appeng.util.Platform;
+import appeng.util.ReadableNumberConverter;
+import gregtech.GT_Mod;
+import gregtech.api.enums.ItemList;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.extensions.ArrayExt;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GT_MetaTileEntity_Hatch_CraftingInput_ME extends GT_MetaTileEntity_Hatch_InputBus
+ implements IConfigurationCircuitSupport, IAddGregtechLogo, IAddUIWidgets, IPowerChannelState, ICraftingProvider,
+ IGridProxyable, IDualInputHatch, ICustomNameObject, IInterfaceViewable {
+
+ // Each pattern slot in the crafting input hatch has its own internal inventory
+ public static class PatternSlot implements IDualInputInventory {
+
+ public interface SharedItemGetter {
+
+ ItemStack[] getSharedItem();
+ }
+
+ private final ItemStack pattern;
+ private final ICraftingPatternDetails patternDetails;
+ private final List<ItemStack> itemInventory;
+ private final List<FluidStack> fluidInventory;
+ private final SharedItemGetter sharedItemGetter;
+
+ public PatternSlot(ItemStack pattern, World world, SharedItemGetter getter) {
+ this.pattern = pattern;
+ this.patternDetails = ((ICraftingPatternItem) Objects.requireNonNull(pattern.getItem()))
+ .getPatternForItem(pattern, world);
+ this.itemInventory = new ArrayList<>();
+ this.fluidInventory = new ArrayList<>();
+ this.sharedItemGetter = getter;
+ }
+
+ public PatternSlot(ItemStack pattern, NBTTagCompound nbt, World world, SharedItemGetter getter) {
+ this.pattern = pattern;
+ this.patternDetails = ((ICraftingPatternItem) Objects.requireNonNull(pattern.getItem()))
+ .getPatternForItem(pattern, world);
+ this.itemInventory = new ArrayList<>();
+ this.fluidInventory = new ArrayList<>();
+ this.sharedItemGetter = getter;
+ NBTTagList inv = nbt.getTagList("inventory", Constants.NBT.TAG_COMPOUND);
+ for (int i = 0; i < inv.tagCount(); i++) {
+ NBTTagCompound tagItemStack = inv.getCompoundTagAt(i);
+ var item = GT_Utility.loadItem(tagItemStack);
+ if (item != null) {
+ if (item.stackSize > 0) {
+ itemInventory.add(item);
+ }
+ } else {
+ GT_Mod.GT_FML_LOGGER.warn(
+ "An error occurred while loading contents of ME Crafting Input Bus. This item has been voided: "
+ + tagItemStack);
+ }
+ }
+ NBTTagList fluidInv = nbt.getTagList("fluidInventory", Constants.NBT.TAG_COMPOUND);
+ for (int i = 0; i < fluidInv.tagCount(); i++) {
+ NBTTagCompound tagFluidStack = fluidInv.getCompoundTagAt(i);
+ var fluid = FluidStack.loadFluidStackFromNBT(tagFluidStack);
+ if (fluid != null) {
+ if (fluid.amount > 0) {
+ fluidInventory.add(fluid);
+ }
+ } else {
+ GT_Mod.GT_FML_LOGGER.warn(
+ "An error occurred while loading contents of ME Crafting Input Bus. This fluid has been voided: "
+ + tagFluidStack);
+ }
+ }
+ }
+
+ public boolean hasChanged(ItemStack newPattern, World world) {
+ return newPattern == null
+ || (!ItemStack.areItemStacksEqual(pattern, newPattern) && !this.patternDetails.equals(
+ ((ICraftingPatternItem) Objects.requireNonNull(pattern.getItem()))
+ .getPatternForItem(newPattern, world)));
+ }
+
+ private boolean isEmpty() {
+ // if one item / fluid is empty then it should be safe to assume all other is empty,
+ // or at least won't require a recipe check, as long as the pattern is sane
+ if (!itemInventory.isEmpty()) {
+ return itemInventory.get(0) == null || itemInventory.get(0).stackSize <= 0;
+ }
+
+ if (!fluidInventory.isEmpty()) {
+ return fluidInventory.get(0) == null || fluidInventory.get(0).amount <= 0;
+ }
+ return true;
+ }
+
+ @Override
+ public ItemStack[] getItemInputs() {
+ if (isEmpty()) return new ItemStack[0];
+ return ArrayUtils.addAll(itemInventory.toArray(new ItemStack[0]), sharedItemGetter.getSharedItem());
+ }
+
+ @Override
+ public FluidStack[] getFluidInputs() {
+ if (isEmpty()) return new FluidStack[0];
+ return fluidInventory.toArray(new FluidStack[0]);
+ }
+
+ public ICraftingPatternDetails getPatternDetails() {
+ return patternDetails;
+ }
+
+ public void refund(AENetworkProxy proxy, BaseActionSource src) throws GridAccessException {
+ IMEMonitor<IAEItemStack> sg = proxy.getStorage()
+ .getItemInventory();
+ for (ItemStack itemStack : itemInventory) {
+ if (itemStack == null || itemStack.stackSize == 0) continue;
+ IAEItemStack rest = Platform.poweredInsert(
+ proxy.getEnergy(),
+ sg,
+ AEApi.instance()
+ .storage()
+ .createItemStack(itemStack),
+ src);
+ itemStack.stackSize = rest != null && rest.getStackSize() > 0 ? (int) rest.getStackSize() : 0;
+ }
+ IMEMonitor<IAEFluidStack> fsg = proxy.getStorage()
+ .getFluidInventory();
+ for (FluidStack fluidStack : fluidInventory) {
+ if (fluidStack == null || fluidStack.amount == 0) continue;
+ IAEFluidStack rest = Platform.poweredInsert(
+ proxy.getEnergy(),
+ fsg,
+ AEApi.instance()
+ .storage()
+ .createFluidStack(fluidStack),
+ src);
+ fluidStack.amount = rest != null && rest.getStackSize() > 0 ? (int) rest.getStackSize() : 0;
+ }
+ }
+
+ public boolean insertItemsAndFluids(InventoryCrafting inventoryCrafting) {
+ int errorIndex = -1; // overflow may occur at this index
+ for (int i = 0; i < inventoryCrafting.getSizeInventory(); ++i) {
+ ItemStack itemStack = inventoryCrafting.getStackInSlot(i);
+ if (itemStack == null) continue;
+
+ boolean inserted = false;
+ if (itemStack.getItem() instanceof ItemFluidPacket) { // insert fluid
+ var fluidStack = ItemFluidPacket.getFluidStack(itemStack);
+ if (fluidStack == null) continue;
+ for (var fluid : fluidInventory) {
+ if (!fluid.isFluidEqual(fluidStack)) continue;
+ if (Integer.MAX_VALUE - fluidStack.amount < fluid.amount) {
+ // Overflow detected
+ errorIndex = i;
+ break;
+ }
+ fluid.amount += fluidStack.amount;
+ inserted = true;
+ break;
+ }
+ if (errorIndex != -1) break;
+ if (!inserted) {
+ fluidInventory.add(fluidStack);
+ }
+ } else { // insert item
+ for (var item : itemInventory) {
+ if (!itemStack.isItemEqual(item)) continue;
+ if (Integer.MAX_VALUE - itemStack.stackSize < item.stackSize) {
+ // Overflow detected
+ errorIndex = i;
+ break;
+ }
+ item.stackSize += itemStack.stackSize;
+ inserted = true;
+ break;
+ }
+ if (errorIndex != -1) break;
+ if (!inserted) {
+ itemInventory.add(itemStack);
+ }
+ }
+ }
+ if (errorIndex != -1) { // need to rollback
+ // Clean up the inserted items/liquids
+ for (int i = 0; i < errorIndex; ++i) {
+ var itemStack = inventoryCrafting.getStackInSlot(i);
+ if (itemStack == null) continue;
+ if (itemStack.getItem() instanceof ItemFluidPacket) { // remove fluid
+ var fluidStack = ItemFluidPacket.getFluidStack(itemStack);
+ if (fluidStack == null) continue;
+ for (var fluid : fluidInventory) {
+ if (fluid.isFluidEqual(fluidStack)) {
+ fluid.amount -= fluidStack.amount;
+ break;
+ }
+ }
+ } else { // remove item
+ for (var item : itemInventory) {
+ if (item.isItemEqual(itemStack)) {
+ item.stackSize -= itemStack.stackSize;
+ break;
+ }
+ }
+ }
+ }
+ return false;
+ }
+ return true;
+ }
+
+ public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
+ nbt.setTag("pattern", pattern.writeToNBT(new NBTTagCompound()));
+
+ NBTTagList itemInventoryNbt = new NBTTagList();
+ for (ItemStack itemStack : this.itemInventory) {
+ itemInventoryNbt.appendTag(GT_Utility.saveItem(itemStack));
+ }
+ nbt.setTag("inventory", itemInventoryNbt);
+
+ NBTTagList fluidInventoryNbt = new NBTTagList();
+ for (FluidStack fluidStack : fluidInventory) {
+ fluidInventoryNbt.appendTag(fluidStack.writeToNBT(new NBTTagCompound()));
+ }
+ nbt.setTag("fluidInventory", fluidInventoryNbt);
+
+ return nbt;
+ }
+ }
+
+ // mInventory is used for storing patterns, circuit and manual slot (typically NC items)
+ private static final int MAX_PATTERN_COUNT = 4 * 9;
+ private static final int SLOT_MANUAL_SIZE = 9;
+ private static final int MAX_INV_COUNT = MAX_PATTERN_COUNT + SLOT_MANUAL_SIZE + 1;
+ private static final int SLOT_CIRCUIT = MAX_PATTERN_COUNT;
+ private static final int SLOT_MANUAL_START = SLOT_CIRCUIT + 1;
+ private static final int MANUAL_SLOT_WINDOW = 10;
+ private BaseActionSource requestSource = null;
+ private @Nullable AENetworkProxy gridProxy = null;
+
+ // holds all internal inventories
+ private PatternSlot[] internalInventory = new PatternSlot[MAX_PATTERN_COUNT];
+
+ // a hash map for faster lookup of pattern slots, not necessarily all valid.
+ private Map<ICraftingPatternDetails, PatternSlot> patternDetailsPatternSlotMap = new HashMap<>(MAX_PATTERN_COUNT);
+
+ private boolean needPatternSync = true;
+ private boolean justHadNewItems = false;
+
+ private String customName = null;
+ private boolean supportFluids;
+ private boolean additionalConnection = false;
+
+ public GT_MetaTileEntity_Hatch_CraftingInput_ME(int aID, String aName, String aNameRegional,
+ boolean supportFluids) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ supportFluids ? 11 : 6,
+ MAX_INV_COUNT,
+ new String[] { "Advanced item input for Multiblocks",
+ "Hatch Tier: " + TIER_COLORS[supportFluids ? 11 : 6] + VN[supportFluids ? 11 : 6],
+ "Processes patterns directly from ME",
+ supportFluids ? "It supports patterns including fluids"
+ : "It does not support patterns including fluids",
+ "Change ME connection behavior by right-clicking with wire cutter" });
+ disableSort = true;
+ this.supportFluids = supportFluids;
+ }
+
+ public GT_MetaTileEntity_Hatch_CraftingInput_ME(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures, boolean supportFluids) {
+ super(aName, aTier, MAX_INV_COUNT, aDescription, aTextures);
+ this.supportFluids = supportFluids;
+ disableSort = true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_CraftingInput_ME(mName, mTier, mDescriptionArray, mTextures, supportFluids);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return getTexturesInactive(aBaseTexture);
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture,
+ TextureFactory.of(supportFluids ? OVERLAY_ME_CRAFTING_INPUT_BUFFER : OVERLAY_ME_CRAFTING_INPUT_BUS) };
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+
+ if (getBaseMetaTileEntity().isServerSide()) {
+ if (needPatternSync && aTimer % 10 == 0) {
+ needPatternSync = !postMEPatternChange();
+ }
+ if (aTimer % 20 == 0) {
+ getBaseMetaTileEntity().setActive(isActive());
+ }
+ }
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ getProxy().onReady();
+ }
+
+ @Override
+ public IGridNode getGridNode(ForgeDirection dir) {
+ return getProxy().getNode();
+ }
+
+ @Override
+ public AECableType getCableConnectionType(ForgeDirection forgeDirection) {
+ return isOutputFacing(forgeDirection) ? AECableType.SMART : AECableType.NONE;
+ }
+
+ private void updateValidGridProxySides() {
+ if (additionalConnection) {
+ getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN)));
+ } else {
+ getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing()));
+ }
+ }
+
+ @Override
+ public void onFacingChange() {
+ updateValidGridProxySides();
+ }
+
+ @Override
+ public void securityBreak() {}
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ additionalConnection = !additionalConnection;
+ updateValidGridProxySides();
+ aPlayer.addChatComponentMessage(
+ new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection));
+ return true;
+ }
+
+ @Override
+ public AENetworkProxy getProxy() {
+ if (gridProxy == null) {
+ gridProxy = new AENetworkProxy(this, "proxy", ItemList.Hatch_CraftingInput_Bus_ME.get(1), true);
+ gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL);
+ updateValidGridProxySides();
+ if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner(
+ getBaseMetaTileEntity().getWorld()
+ .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName()));
+ }
+
+ return this.gridProxy;
+ }
+
+ @Override
+ public DimensionalCoord getLocation() {
+ return new DimensionalCoord(
+ getBaseMetaTileEntity().getWorld(),
+ getBaseMetaTileEntity().getXCoord(),
+ getBaseMetaTileEntity().getYCoord(),
+ getBaseMetaTileEntity().getZCoord());
+ }
+
+ @Override
+ public int rows() {
+ return 4;
+ }
+
+ @Override
+ public int rowSize() {
+ return 9;
+ }
+
+ @Override
+ public IInventory getPatterns() {
+ return this;
+ }
+
+ @Override
+ public String getName() {
+ if (hasCustomName()) {
+ return getCustomName();
+ }
+ StringBuilder name = new StringBuilder();
+ if (getCrafterIcon() != null) {
+ name.append(getCrafterIcon().getDisplayName());
+ } else {
+ name.append(getLocalName());
+ }
+
+ if (mInventory[SLOT_CIRCUIT] != null) {
+ name.append(" - ");
+ name.append(mInventory[SLOT_CIRCUIT].getItemDamage());
+ }
+ if (mInventory[SLOT_MANUAL_START] != null) {
+ name.append(" - ");
+ name.append(mInventory[SLOT_MANUAL_START].getDisplayName());
+ }
+ return name.toString();
+ }
+
+ @Override
+ public TileEntity getTileEntity() {
+ return (TileEntity) getBaseMetaTileEntity();
+ }
+
+ @Override
+ public boolean shouldDisplay() {
+ return true;
+ }
+
+ @Override
+ public void gridChanged() {
+ needPatternSync = true;
+ }
+
+ @Override
+ public boolean isPowered() {
+ return getProxy() != null && getProxy().isPowered();
+ }
+
+ @Override
+ public boolean isActive() {
+ return getProxy() != null && getProxy().isActive();
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+
+ // save internalInventory
+ NBTTagList internalInventoryNBT = new NBTTagList();
+ for (int i = 0; i < internalInventory.length; i++) {
+ if (internalInventory[i] != null) {
+ NBTTagCompound internalInventorySlotNBT = new NBTTagCompound();
+ internalInventorySlotNBT.setInteger("patternSlot", i);
+ internalInventorySlotNBT
+ .setTag("patternSlotNBT", internalInventory[i].writeToNBT(new NBTTagCompound()));
+ internalInventoryNBT.appendTag(internalInventorySlotNBT);
+ }
+ }
+ aNBT.setTag("internalInventory", internalInventoryNBT);
+ if (customName != null) aNBT.setString("customName", customName);
+ aNBT.setBoolean("additionalConnection", additionalConnection);
+ getProxy().writeToNBT(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ // load internalInventory
+ NBTTagList internalInventoryNBT = aNBT.getTagList("internalInventory", Constants.NBT.TAG_COMPOUND);
+ for (int i = 0; i < internalInventoryNBT.tagCount(); i++) {
+ NBTTagCompound internalInventorySlotNBT = internalInventoryNBT.getCompoundTagAt(i);
+ int patternSlot = internalInventorySlotNBT.getInteger("patternSlot");
+ NBTTagCompound patternSlotNBT = internalInventorySlotNBT.getCompoundTag("patternSlotNBT");
+ ItemStack pattern = ItemStack.loadItemStackFromNBT(patternSlotNBT.getCompoundTag("pattern"));
+ if (pattern != null) {
+ internalInventory[patternSlot] = new PatternSlot(
+ pattern,
+ patternSlotNBT,
+ getBaseMetaTileEntity().getWorld(),
+ this::getSharedItems);
+ } else {
+ GT_Mod.GT_FML_LOGGER.warn(
+ "An error occurred while loading contents of ME Crafting Input Bus. This pattern has been voided: "
+ + patternSlotNBT);
+ }
+ }
+
+ // Migrate from 4x8 to 4x9 pattern inventory
+ int oldPatternCount = 4 * 8;
+ int oldSlotManual = oldPatternCount + 1;
+ int oldSlotCircuit = oldPatternCount;
+
+ if (internalInventory[oldSlotManual] == null && mInventory[oldSlotManual] != null) {
+ mInventory[SLOT_MANUAL_START] = mInventory[oldSlotManual];
+ mInventory[oldSlotManual] = null;
+ }
+ if (internalInventory[oldSlotCircuit] == null && mInventory[oldSlotCircuit] != null) {
+ mInventory[SLOT_CIRCUIT] = mInventory[oldSlotCircuit];
+ mInventory[oldSlotCircuit] = null;
+ }
+
+ // reconstruct patternDetailsPatternSlotMap
+ patternDetailsPatternSlotMap.clear();
+ for (PatternSlot patternSlot : internalInventory) {
+ if (patternSlot != null) {
+ patternDetailsPatternSlotMap.put(patternSlot.getPatternDetails(), patternSlot);
+ }
+ }
+
+ if (aNBT.hasKey("customName")) customName = aNBT.getString("customName");
+ additionalConnection = aNBT.getBoolean("additionalConnection");
+
+ getProxy().readFromNBT(aNBT);
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ private String describePattern(ICraftingPatternDetails patternDetails) {
+ return Arrays.stream(patternDetails.getCondensedOutputs())
+ .map(
+ aeItemStack -> aeItemStack.getItem()
+ .getItemStackDisplayName(aeItemStack.getItemStack()))
+ .collect(Collectors.joining(", "));
+ }
+
+ @Override
+ public String[] getInfoData() {
+ var ret = new ArrayList<String>();
+ ret.add(
+ "The bus is " + ((getProxy() != null && getProxy().isActive()) ? EnumChatFormatting.GREEN + "online"
+ : EnumChatFormatting.RED + "offline" + getAEDiagnostics()) + EnumChatFormatting.RESET);
+ ret.add("Internal Inventory: ");
+ var i = 0;
+ for (var slot : internalInventory) {
+ if (slot == null) continue;
+ IWideReadableNumberConverter nc = ReadableNumberConverter.INSTANCE;
+
+ i += 1;
+ ret.add(
+ "Slot " + i
+ + " "
+ + EnumChatFormatting.BLUE
+ + describePattern(slot.patternDetails)
+ + EnumChatFormatting.RESET);
+ for (var item : slot.itemInventory) {
+ if (item == null || item.stackSize == 0) continue;
+ ret.add(
+ item.getItem()
+ .getItemStackDisplayName(item) + ": "
+ + EnumChatFormatting.GOLD
+ + nc.toWideReadableForm(item.stackSize)
+ + EnumChatFormatting.RESET);
+ }
+ for (var fluid : slot.fluidInventory) {
+ if (fluid == null || fluid.amount == 0) continue;
+ ret.add(
+ fluid.getLocalizedName() + ": "
+ + EnumChatFormatting.AQUA
+ + nc.toWideReadableForm(fluid.amount)
+ + EnumChatFormatting.RESET);
+ }
+ }
+ return ret.toArray(new String[0]);
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int getCircuitSlot() {
+ return SLOT_CIRCUIT;
+ }
+
+ @Override
+ public int getCircuitSlotX() {
+ return 170;
+ }
+
+ @Override
+ public int getCircuitSlotY() {
+ return 64;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public int getGUIWidth() {
+ return super.getGUIWidth() + 16;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.@NotNull Builder builder, UIBuildContext buildContext) {
+ buildContext.addSyncedWindow(MANUAL_SLOT_WINDOW, this::createSlotManualWindow);
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 9)
+ .startFromSlot(0)
+ .endAtSlot(MAX_PATTERN_COUNT - 1)
+ .phantom(false)
+ .background(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_PATTERN_ME)
+ .widgetCreator(slot -> new SlotWidget(slot) {
+
+ @Override
+ protected ItemStack getItemStackForRendering(Slot slotIn) {
+ var stack = slot.getStack();
+ if (stack == null || !(stack.getItem() instanceof ItemEncodedPattern patternItem)) {
+ return stack;
+ }
+ var output = patternItem.getOutput(stack);
+ return output != null ? output : stack;
+ }
+ }.setFilter(itemStack -> itemStack.getItem() instanceof ICraftingPatternItem)
+ .setChangeListener(() -> onPatternChange(slot.getSlotIndex(), slot.getStack())))
+ .build()
+ .setPos(7, 9))
+ .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (clickData.mouseButton == 0) {
+ widget.getContext()
+ .openSyncedWindow(MANUAL_SLOT_WINDOW);
+ }
+ })
+ .setPlayClickSound(true)
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE)
+ .addTooltips(ImmutableList.of("Place manual items"))
+ .setSize(16, 16)
+ .setPos(170, 45))
+ .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (clickData.mouseButton == 0) {
+ refundAll();
+ }
+ })
+ .setPlayClickSound(true)
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_EXPORT)
+ .addTooltips(ImmutableList.of("Return all internally stored items back to AE"))
+ .setSize(16, 16)
+ .setPos(170, 28));
+ }
+
+ @Override
+ public void updateSlots() {
+ for (int slotId = SLOT_MANUAL_START; slotId < SLOT_MANUAL_START + SLOT_MANUAL_SIZE; ++slotId) {
+ if (mInventory[slotId] != null && mInventory[slotId].stackSize <= 0) mInventory[slotId] = null;
+ }
+ }
+
+ private BaseActionSource getRequest() {
+ if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity());
+ return requestSource;
+ }
+
+ private void onPatternChange(int index, ItemStack newItem) {
+ if (!getBaseMetaTileEntity().isServerSide()) return;
+
+ var world = getBaseMetaTileEntity().getWorld();
+
+ // remove old if applicable
+ var originalPattern = internalInventory[index];
+ if (originalPattern != null) {
+ if (originalPattern.hasChanged(newItem, world)) {
+ try {
+ originalPattern.refund(getProxy(), getRequest());
+ } catch (GridAccessException ignored) {}
+ internalInventory[index] = null;
+ needPatternSync = true;
+ } else {
+ return; // nothing has changed
+ }
+ }
+
+ // original does not exist or has changed
+ if (newItem == null || !(newItem.getItem() instanceof ICraftingPatternItem)) return;
+
+ var patternSlot = new PatternSlot(newItem, world, this::getSharedItems);
+ internalInventory[index] = patternSlot;
+ patternDetailsPatternSlotMap.put(patternSlot.getPatternDetails(), patternSlot);
+
+ needPatternSync = true;
+ }
+
+ public ItemStack[] getSharedItems() {
+ ItemStack[] sharedItems = new ItemStack[SLOT_MANUAL_SIZE + 1];
+ sharedItems[0] = mInventory[SLOT_CIRCUIT];
+ System.arraycopy(mInventory, SLOT_MANUAL_START, sharedItems, 1, SLOT_MANUAL_SIZE);
+ return ArrayExt.withoutNulls(sharedItems, ItemStack[]::new);
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ NBTTagCompound tag = accessor.getNBTData();
+ if (tag.hasKey("name"))
+ currenttip.add(EnumChatFormatting.AQUA + tag.getString("name") + EnumChatFormatting.RESET);
+ if (tag.hasKey("inventory")) {
+ var inventory = tag.getTagList("inventory", Constants.NBT.TAG_COMPOUND);
+ for (int i = 0; i < inventory.tagCount(); ++i) {
+ var item = inventory.getCompoundTagAt(i);
+ var name = item.getString("name");
+ var amount = item.getLong("amount");
+ currenttip.add(
+ name + ": "
+ + EnumChatFormatting.GOLD
+ + ReadableNumberConverter.INSTANCE.toWideReadableForm(amount)
+ + EnumChatFormatting.RESET);
+ }
+ }
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+
+ NBTTagList inventory = new NBTTagList();
+ HashMap<String, Long> nameToAmount = new HashMap<>();
+ for (Iterator<PatternSlot> it = inventories(); it.hasNext();) {
+ var i = it.next();
+ for (var item : i.itemInventory) {
+ if (item != null && item.stackSize > 0) {
+ var name = item.getDisplayName();
+ var amount = nameToAmount.getOrDefault(name, 0L);
+ nameToAmount.put(name, amount + item.stackSize);
+ }
+ }
+ for (var fluid : i.fluidInventory) {
+ if (fluid != null && fluid.amount > 0) {
+ var name = fluid.getLocalizedName();
+ var amount = nameToAmount.getOrDefault(name, 0L);
+ nameToAmount.put(name, amount + fluid.amount);
+ }
+ }
+ }
+ for (var entry : nameToAmount.entrySet()) {
+ var item = new NBTTagCompound();
+ item.setString("name", entry.getKey());
+ item.setLong("amount", entry.getValue());
+ inventory.appendTag(item);
+ }
+
+ tag.setTag("inventory", inventory);
+ if (!Objects.equals(getName(), getLocalName())) {
+ tag.setString("name", getName());
+ }
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ }
+
+ @Override
+ public void provideCrafting(ICraftingProviderHelper craftingTracker) {
+ if (!isActive()) return;
+
+ for (PatternSlot slot : internalInventory) {
+ if (slot == null) continue;
+ ICraftingPatternDetails details = slot.getPatternDetails();
+ if (details == null) {
+ GT_Mod.GT_FML_LOGGER.warn(
+ "Found an invalid pattern at " + getBaseMetaTileEntity().getCoords()
+ + " in dim "
+ + getBaseMetaTileEntity().getWorld().provider.dimensionId);
+ continue;
+ }
+ craftingTracker.addCraftingOption(this, details);
+ }
+ }
+
+ @Override
+ public boolean pushPattern(ICraftingPatternDetails patternDetails, InventoryCrafting table) {
+ if (!isActive()) return false;
+
+ if (!supportFluids) {
+ for (int i = 0; i < table.getSizeInventory(); ++i) {
+ ItemStack itemStack = table.getStackInSlot(i);
+ if (itemStack == null) continue;
+ if (itemStack.getItem() instanceof ItemFluidPacket) return false;
+ }
+ }
+ if (!patternDetailsPatternSlotMap.get(patternDetails)
+ .insertItemsAndFluids(table)) {
+ return false;
+ }
+ justHadNewItems = true;
+ return true;
+ }
+
+ @Override
+ public boolean isBusy() {
+ return false;
+ }
+
+ @Override
+ public Iterator<PatternSlot> inventories() {
+ return Arrays.stream(internalInventory)
+ .filter(Objects::nonNull)
+ .iterator();
+ }
+
+ @Override
+ public void onBlockDestroyed() {
+ refundAll();
+ super.onBlockDestroyed();
+ }
+
+ private void refundAll() {
+ for (var slot : internalInventory) {
+ if (slot == null) continue;
+ try {
+ slot.refund(getProxy(), getRequest());
+ } catch (GridAccessException ignored) {}
+ }
+ }
+
+ @Override
+ public boolean justUpdated() {
+ var ret = justHadNewItems;
+ justHadNewItems = false;
+ return ret;
+ }
+
+ @Override
+ public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (!(aPlayer instanceof EntityPlayerMP)) return;
+
+ ItemStack dataStick = aPlayer.inventory.getCurrentItem();
+ if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) return;
+
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setString("type", "CraftingInputBuffer");
+ tag.setInteger("x", aBaseMetaTileEntity.getXCoord());
+ tag.setInteger("y", aBaseMetaTileEntity.getYCoord());
+ tag.setInteger("z", aBaseMetaTileEntity.getZCoord());
+
+ dataStick.stackTagCompound = tag;
+ dataStick.setStackDisplayName(
+ "Crafting Input Buffer Link Data Stick (" + aBaseMetaTileEntity
+ .getXCoord() + ", " + aBaseMetaTileEntity.getYCoord() + ", " + aBaseMetaTileEntity.getZCoord() + ")");
+ aPlayer.addChatMessage(new ChatComponentText("Saved Link Data to Data Stick"));
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ final ItemStack is = aPlayer.inventory.getCurrentItem();
+ if (is != null && is.getItem() instanceof ToolQuartzCuttingKnife) {
+ if (ForgeEventFactory.onItemUseStart(aPlayer, is, 1) <= 0) return false;
+ var te = getBaseMetaTileEntity();
+ aPlayer.openGui(
+ AppEng.instance(),
+ GuiBridge.GUI_RENAMER.ordinal() << 5 | (side.ordinal()),
+ te.getWorld(),
+ te.getXCoord(),
+ te.getYCoord(),
+ te.getZCoord());
+ return true;
+ }
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ }
+
+ @Override
+ public ItemStack getCrafterIcon() {
+ return getMachineCraftingIcon();
+ }
+
+ private boolean postMEPatternChange() {
+ // don't post until it's active
+ if (!getProxy().isActive()) return false;
+ try {
+ getProxy().getGrid()
+ .postEvent(new MENetworkCraftingPatternChange(this, getProxy().getNode()));
+ } catch (GridAccessException ignored) {
+ return false;
+ }
+ return true;
+ }
+
+ protected ModularWindow createSlotManualWindow(final EntityPlayer player) {
+ final int WIDTH = 68;
+ final int HEIGHT = 68;
+ final int PARENT_WIDTH = getGUIWidth();
+ final int PARENT_HEIGHT = getGUIHeight();
+ ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT);
+ builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
+ builder.setGuiTint(getGUIColorization());
+ builder.setDraggable(true);
+ // make sure the manual window is within the parent window
+ // otherwise picking up manual items would toss them
+ // See GuiContainer.java flag1
+ builder.setPos(
+ (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT))
+ .add(Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT))));
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .startFromSlot(SLOT_MANUAL_START)
+ .endAtSlot(SLOT_MANUAL_START + SLOT_MANUAL_SIZE - 1)
+ .phantom(false)
+ .background(getGUITextureSet().getItemSlot())
+ .build()
+ .setPos(7, 7));
+ return builder.build();
+ }
+
+ @Override
+ public void setInventorySlotContents(int aIndex, ItemStack aStack) {
+ super.setInventorySlotContents(aIndex, aStack);
+ if (aIndex >= MAX_PATTERN_COUNT) return;
+ onPatternChange(aIndex, aStack);
+ needPatternSync = true;
+ }
+
+ @Override
+ public String getCustomName() {
+ return customName;
+ }
+
+ @Override
+ public boolean hasCustomName() {
+ return customName != null;
+ }
+
+ @Override
+ public void setCustomName(String name) {
+ customName = name;
+ }
+
+ @Override
+ public Optional<IDualInputInventory> getFirstNonEmptyInventory() {
+ for (PatternSlot slot : internalInventory) {
+ if (slot != null && !slot.isEmpty()) return Optional.of(slot);
+ }
+ return Optional.empty();
+ }
+
+ @Override
+ public boolean supportsFluids() {
+ return this.supportFluids;
+ }
+
+ @Override
+ public List<ItemStack> getItemsForHoloGlasses() {
+ List<ItemStack> list = new ArrayList<>();
+ for (PatternSlot slot : internalInventory) {
+ if (slot == null) continue;
+
+ IAEItemStack[] outputs = slot.getPatternDetails()
+ .getCondensedOutputs();
+ list.add(outputs[0].getItemStack());
+ }
+ return list;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_Slave.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_Slave.java
new file mode 100644
index 0000000000..ee53e9494a
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_Slave.java
@@ -0,0 +1,262 @@
+package gregtech.common.tileentities.machines;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_CRAFTING_INPUT_SLAVE;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Optional;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.render.TextureFactory;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GT_MetaTileEntity_Hatch_CraftingInput_Slave extends GT_MetaTileEntity_Hatch_InputBus
+ implements IDualInputHatch {
+
+ private GT_MetaTileEntity_Hatch_CraftingInput_ME master; // use getMaster() to access
+ private int masterX, masterY, masterZ;
+ private boolean masterSet = false; // indicate if values of masterX, masterY, masterZ are valid
+
+ public GT_MetaTileEntity_Hatch_CraftingInput_Slave(int aID, String aName, String aNameRegional) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ 6,
+ 0,
+ new String[] { "Slave for Crafting Input Buffer/Bus",
+ "Link with Crafting Input Buffer/Bus using Data Stick to share inventory",
+ "Left click on the Crafting Input Buffer/Bus, then right click on this block to link them", });
+ disableSort = true;
+ }
+
+ public GT_MetaTileEntity_Hatch_CraftingInput_Slave(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ disableSort = true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_CraftingInput_Slave(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return getTexturesInactive(aBaseTexture);
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_CRAFTING_INPUT_SLAVE) };
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ if (aTimer % 100 == 0 && masterSet && getMaster() == null) {
+ trySetMasterFromCoord(masterX, masterY, masterZ);
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+
+ if (aNBT.hasKey("master")) {
+ NBTTagCompound masterNBT = aNBT.getCompoundTag("master");
+ masterX = masterNBT.getInteger("x");
+ masterY = masterNBT.getInteger("y");
+ masterZ = masterNBT.getInteger("z");
+ masterSet = true;
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ if (masterSet) {
+ NBTTagCompound masterNBT = new NBTTagCompound();
+ masterNBT.setInteger("x", masterX);
+ masterNBT.setInteger("y", masterY);
+ masterNBT.setInteger("z", masterZ);
+ aNBT.setTag("master", masterNBT);
+ }
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ var ret = new ArrayList<String>();
+ if (getMaster() != null) {
+ ret.add(
+ "This bus is linked to the Crafting Input Buffer at " + masterX
+ + ", "
+ + masterY
+ + ", "
+ + masterZ
+ + ".");
+ ret.addAll(Arrays.asList(getMaster().getInfoData()));
+ } else ret.add("This bus is not linked to any Crafting Input Buffer.");
+ return ret.toArray(new String[0]);
+ }
+
+ public GT_MetaTileEntity_Hatch_CraftingInput_ME getMaster() {
+ if (master == null) return null;
+ if (master.getBaseMetaTileEntity() == null) { // master disappeared
+ master = null;
+ }
+ return master;
+ }
+
+ @Override
+ public byte getTierForStructure() {
+ return getMaster() == null ? super.getTierForStructure() : getMaster().getTierForStructure();
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public Iterator<GT_MetaTileEntity_Hatch_CraftingInput_ME.PatternSlot> inventories() {
+ return getMaster() != null ? getMaster().inventories() : Collections.emptyIterator();
+ }
+
+ @Override
+ public Optional<IDualInputInventory> getFirstNonEmptyInventory() {
+ return getMaster() != null ? getMaster().getFirstNonEmptyInventory() : Optional.empty();
+ }
+
+ @Override
+ public boolean supportsFluids() {
+ return getMaster() != null && getMaster().supportsFluids();
+ }
+
+ @Override
+ public boolean justUpdated() {
+ return getMaster() != null && getMaster().justUpdated();
+ }
+
+ public GT_MetaTileEntity_Hatch_CraftingInput_ME trySetMasterFromCoord(int x, int y, int z) {
+ var tileEntity = getBaseMetaTileEntity().getWorld()
+ .getTileEntity(x, y, z);
+ if (tileEntity == null) return null;
+ if (!(tileEntity instanceof IGregTechTileEntity gtTileEntity)) return null;
+ var metaTileEntity = gtTileEntity.getMetaTileEntity();
+ if (!(metaTileEntity instanceof GT_MetaTileEntity_Hatch_CraftingInput_ME)) return null;
+ masterX = x;
+ masterY = y;
+ masterZ = z;
+ masterSet = true;
+ master = (GT_MetaTileEntity_Hatch_CraftingInput_ME) metaTileEntity;
+ return master;
+ }
+
+ private boolean tryLinkDataStick(EntityPlayer aPlayer) {
+ ItemStack dataStick = aPlayer.inventory.getCurrentItem();
+
+ if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) {
+ return false;
+ }
+ if (!dataStick.hasTagCompound() || !dataStick.stackTagCompound.getString("type")
+ .equals("CraftingInputBuffer")) {
+ return false;
+ }
+
+ NBTTagCompound nbt = dataStick.stackTagCompound;
+ int x = nbt.getInteger("x");
+ int y = nbt.getInteger("y");
+ int z = nbt.getInteger("z");
+ if (trySetMasterFromCoord(x, y, z) != null) {
+ aPlayer.addChatMessage(new ChatComponentText("Link successful"));
+ return true;
+ }
+ aPlayer.addChatMessage(new ChatComponentText("Link failed"));
+ return true;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (!(aPlayer instanceof EntityPlayerMP)) {
+ return false;
+ }
+ if (tryLinkDataStick(aPlayer)) {
+ return true;
+ }
+ var master = getMaster();
+ if (master != null) {
+ return master.onRightclick(master.getBaseMetaTileEntity(), aPlayer);
+ }
+ return false;
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ NBTTagCompound tag = accessor.getNBTData();
+ currenttip.add((tag.getBoolean("linked") ? "Linked" : "Not linked"));
+
+ if (tag.hasKey("masterX")) {
+ currenttip.add(
+ "Bound to " + tag
+ .getInteger("masterX") + ", " + tag.getInteger("masterY") + ", " + tag.getInteger("masterZ"));
+ }
+
+ if (tag.hasKey("masterName")) {
+ currenttip.add(EnumChatFormatting.GOLD + tag.getString("masterName") + EnumChatFormatting.RESET);
+ }
+
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+
+ tag.setBoolean("linked", getMaster() != null);
+ if (masterSet) {
+ tag.setInteger("masterX", masterX);
+ tag.setInteger("masterY", masterY);
+ tag.setInteger("masterZ", masterZ);
+ }
+ if (getMaster() != null) tag.setString("masterName", getMaster().getName());
+
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ }
+
+ @Override
+ public List<ItemStack> getItemsForHoloGlasses() {
+ return getMaster() != null ? getMaster().getItemsForHoloGlasses() : null;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_InputBus_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_InputBus_ME.java
new file mode 100644
index 0000000000..6b5ce10387
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_InputBus_ME.java
@@ -0,0 +1,804 @@
+package gregtech.common.tileentities.machines;
+
+import static gregtech.api.enums.GT_Values.TIER_COLORS;
+import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_HATCH;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_HATCH_ACTIVE;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+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.nbt.NBTTagList;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.ModularUITextures;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.api.math.Size;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
+
+import appeng.api.config.Actionable;
+import appeng.api.config.PowerMultiplier;
+import appeng.api.implementations.IPowerChannelState;
+import appeng.api.networking.GridFlags;
+import appeng.api.networking.security.BaseActionSource;
+import appeng.api.networking.security.IActionHost;
+import appeng.api.networking.security.MachineSource;
+import appeng.api.storage.IMEMonitor;
+import appeng.api.storage.data.IAEItemStack;
+import appeng.api.util.AECableType;
+import appeng.core.localization.WailaText;
+import appeng.me.GridAccessException;
+import appeng.me.helpers.AENetworkProxy;
+import appeng.me.helpers.IGridProxyable;
+import appeng.util.item.AEItemStack;
+import gregtech.api.enums.ItemList;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gregtech.common.gui.modularui.widget.AESlotWidget;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GT_MetaTileEntity_Hatch_InputBus_ME extends GT_MetaTileEntity_Hatch_InputBus implements
+ IConfigurationCircuitSupport, IRecipeProcessingAwareHatch, IAddGregtechLogo, IAddUIWidgets, IPowerChannelState {
+
+ private static final int SLOT_COUNT = 16;
+ private BaseActionSource requestSource = null;
+ private @Nullable AENetworkProxy gridProxy = null;
+ private final ItemStack[] shadowInventory = new ItemStack[SLOT_COUNT];
+ private final int[] savedStackSizes = new int[SLOT_COUNT];
+ private boolean processingRecipe = false;
+ private final boolean autoPullAvailable;
+ private boolean autoPullItemList = false;
+ private int minAutoPullStackSize = 1;
+ private int autoPullRefreshTime = 100;
+ private static final int CONFIG_WINDOW_ID = 10;
+ private boolean additionalConnection = false;
+
+ public GT_MetaTileEntity_Hatch_InputBus_ME(int aID, boolean autoPullAvailable, String aName, String aNameRegional) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ autoPullAvailable ? 6 : 3,
+ SLOT_COUNT * 2 + 2,
+ getDescriptionArray(autoPullAvailable));
+ this.autoPullAvailable = autoPullAvailable;
+ disableSort = true;
+ }
+
+ public GT_MetaTileEntity_Hatch_InputBus_ME(String aName, boolean autoPullAvailable, int aTier,
+ String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, SLOT_COUNT * 2 + 2, aDescription, aTextures);
+ this.autoPullAvailable = autoPullAvailable;
+ disableSort = true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_InputBus_ME(mName, autoPullAvailable, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_HATCH_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_HATCH) };
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (getBaseMetaTileEntity().isServerSide()) {
+ if (aTimer % autoPullRefreshTime == 0 && autoPullItemList) {
+ refreshItemList();
+ }
+ if (aTimer % 20 == 0) {
+ getBaseMetaTileEntity().setActive(isActive());
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ getProxy().onReady();
+ }
+
+ @Override
+ public AECableType getCableConnectionType(ForgeDirection forgeDirection) {
+ return isOutputFacing(forgeDirection) ? AECableType.SMART : AECableType.NONE;
+ }
+
+ private void updateValidGridProxySides() {
+ if (additionalConnection) {
+ getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN)));
+ } else {
+ getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing()));
+ }
+ }
+
+ @Override
+ public void onFacingChange() {
+ updateValidGridProxySides();
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ additionalConnection = !additionalConnection;
+ updateValidGridProxySides();
+ aPlayer.addChatComponentMessage(
+ new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection));
+ return true;
+ }
+
+ @Override
+ public AENetworkProxy getProxy() {
+ if (gridProxy == null) {
+ if (getBaseMetaTileEntity() instanceof IGridProxyable) {
+ gridProxy = new AENetworkProxy(
+ (IGridProxyable) getBaseMetaTileEntity(),
+ "proxy",
+ autoPullAvailable ? ItemList.Hatch_Input_Bus_ME_Advanced.get(1)
+ : ItemList.Hatch_Input_Bus_ME.get(1),
+ true);
+ gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL);
+ updateValidGridProxySides();
+ if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner(
+ getBaseMetaTileEntity().getWorld()
+ .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName()));
+ }
+ }
+ return this.gridProxy;
+ }
+
+ @Override
+ public boolean isPowered() {
+ return getProxy() != null && getProxy().isPowered();
+ }
+
+ @Override
+ public boolean isActive() {
+ return getProxy() != null && getProxy().isActive();
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ int[] sizes = new int[16];
+ for (int i = 0; i < 16; ++i) sizes[i] = mInventory[i + 16] == null ? 0 : mInventory[i + 16].stackSize;
+ aNBT.setIntArray("sizes", sizes);
+ aNBT.setBoolean("autoStock", autoPullItemList);
+ aNBT.setInteger("minAutoPullStackSize", minAutoPullStackSize);
+ aNBT.setBoolean("additionalConnection", additionalConnection);
+ aNBT.setInteger("refreshTime", autoPullRefreshTime);
+ getProxy().writeToNBT(aNBT);
+ }
+
+ private void setAutoPullItemList(boolean pullItemList) {
+ if (!autoPullAvailable) {
+ return;
+ }
+
+ autoPullItemList = pullItemList;
+ if (!autoPullItemList) {
+ for (int i = 0; i < SLOT_COUNT; i++) {
+ mInventory[i] = null;
+ }
+ } else {
+ refreshItemList();
+ }
+ updateAllInformationSlots();
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("sizes")) {
+ int[] sizes = aNBT.getIntArray("sizes");
+ if (sizes.length == 16) {
+ for (int i = 0; i < 16; ++i) {
+ if (sizes[i] != 0 && mInventory[i] != null) {
+ ItemStack s = mInventory[i].copy();
+ s.stackSize = sizes[i];
+ mInventory[i + 16] = s;
+ }
+ }
+ }
+ }
+ autoPullItemList = aNBT.getBoolean("autoStock");
+ minAutoPullStackSize = aNBT.getInteger("minAutoPullStackSize");
+ additionalConnection = aNBT.getBoolean("additionalConnection");
+ if (aNBT.hasKey("refreshTime")) {
+ autoPullRefreshTime = aNBT.getInteger("refreshTime");
+ }
+ getProxy().readFromNBT(aNBT);
+
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] {
+ "The bus is " + ((getProxy() != null && getProxy().isActive()) ? EnumChatFormatting.GREEN + "online"
+ : EnumChatFormatting.RED + "offline" + getAEDiagnostics()) + EnumChatFormatting.RESET };
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (!autoPullAvailable) {
+ return;
+ }
+
+ setAutoPullItemList(!autoPullItemList);
+ aPlayer.addChatMessage(
+ new ChatComponentTranslation(
+ "GT5U.machines.stocking_bus.auto_pull_toggle." + (autoPullItemList ? "enabled" : "disabled")));
+ }
+
+ @Override
+ public void updateSlots() {
+ if (mInventory[getManualSlot()] != null && mInventory[getManualSlot()].stackSize <= 0)
+ mInventory[getManualSlot()] = null;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ if (!(aPlayer instanceof EntityPlayerMP))
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ ItemStack dataStick = aPlayer.inventory.getCurrentItem();
+ if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true))
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ if (!dataStick.hasTagCompound() || !"stockingBus".equals(dataStick.stackTagCompound.getString("type")))
+ return false;
+
+ NBTTagCompound nbt = dataStick.stackTagCompound;
+
+ ItemStack circuit = GT_Utility.loadItem(dataStick.stackTagCompound, "circuit");
+ if (GT_Utility.isStackInvalid(circuit)) circuit = null;
+
+ if (autoPullAvailable) {
+ setAutoPullItemList(nbt.getBoolean("autoPull"));
+ minAutoPullStackSize = nbt.getInteger("minStackSize");
+ autoPullRefreshTime = nbt.getInteger("refreshTime");
+ }
+
+ additionalConnection = nbt.getBoolean("additionalConnection");
+ if (!autoPullItemList) {
+ NBTTagList stockingItems = nbt.getTagList("itemsToStock", 10);
+ for (int i = 0; i < stockingItems.tagCount(); i++) {
+ this.mInventory[i] = GT_Utility.loadItem(stockingItems.getCompoundTagAt(i));
+ }
+ }
+ setInventorySlotContents(getCircuitSlot(), circuit);
+ updateValidGridProxySides();
+ aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.stocking_bus.loaded"));
+ return true;
+ }
+
+ @Override
+ public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (!(aPlayer instanceof EntityPlayerMP)) return;
+
+ ItemStack dataStick = aPlayer.inventory.getCurrentItem();
+ if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) return;
+
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setString("type", "stockingBus");
+ tag.setBoolean("autoPull", autoPullItemList);
+ tag.setInteger("minStackSize", minAutoPullStackSize);
+ tag.setInteger("refreshTime", autoPullRefreshTime);
+ tag.setBoolean("additionalConnection", additionalConnection);
+ tag.setTag("circuit", GT_Utility.saveItem(getStackInSlot(getCircuitSlot())));
+
+ NBTTagList stockingItems = new NBTTagList();
+
+ if (!autoPullItemList) {
+ for (int index = 0; index < SLOT_COUNT; index++) {
+ stockingItems.appendTag(GT_Utility.saveItem(mInventory[index]));
+ }
+ tag.setTag("itemsToStock", stockingItems);
+ }
+ dataStick.stackTagCompound = tag;
+ dataStick.setStackDisplayName("Stocking Input Bus Configuration");
+ aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.stocking_bus.saved"));
+ }
+
+ private int getManualSlot() {
+ return SLOT_COUNT * 2 + 1;
+ }
+
+ @Override
+ public int getCircuitSlot() {
+ return SLOT_COUNT * 2;
+ }
+
+ @Override
+ public int getCircuitSlotX() {
+ return 80;
+ }
+
+ @Override
+ public int getCircuitSlotY() {
+ return 64;
+ }
+
+ @Override
+ public boolean setStackToZeroInsteadOfNull(int aIndex) {
+ return aIndex != getManualSlot();
+ }
+
+ @Override
+ public ItemStack getStackInSlot(int aIndex) {
+ if (!processingRecipe) return super.getStackInSlot(aIndex);
+ if (aIndex < 0 || aIndex > mInventory.length) return null;
+ if (aIndex >= SLOT_COUNT && aIndex < SLOT_COUNT * 2)
+ // Display slots
+ return null;
+ if (aIndex == getCircuitSlot() || aIndex == getManualSlot()) return mInventory[aIndex];
+ if (mInventory[aIndex] != null) {
+ AENetworkProxy proxy = getProxy();
+ if (proxy == null || !proxy.isActive()) {
+ return null;
+ }
+ try {
+ IMEMonitor<IAEItemStack> sg = proxy.getStorage()
+ .getItemInventory();
+ IAEItemStack request = AEItemStack.create(mInventory[aIndex]);
+ request.setStackSize(Integer.MAX_VALUE);
+ IAEItemStack result = sg.extractItems(request, Actionable.SIMULATE, getRequestSource());
+ if (result != null) {
+ this.shadowInventory[aIndex] = result.getItemStack();
+ this.savedStackSizes[aIndex] = this.shadowInventory[aIndex].stackSize;
+ this.setInventorySlotContents(aIndex + SLOT_COUNT, this.shadowInventory[aIndex]);
+ return this.shadowInventory[aIndex];
+ } else {
+ // Request failed
+ this.setInventorySlotContents(aIndex + SLOT_COUNT, null);
+ return null;
+ }
+ } catch (final GridAccessException ignored) {}
+ return null;
+ } else {
+ // AE available but no items requested
+ this.setInventorySlotContents(aIndex + SLOT_COUNT, null);
+ }
+ return mInventory[aIndex];
+ }
+
+ private BaseActionSource getRequestSource() {
+ if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity());
+ return requestSource;
+ }
+
+ @Override
+ public void onExplosion() {
+ for (int i = 0; i < SLOT_COUNT; i++) {
+ mInventory[i] = null;
+ }
+ }
+
+ @Override
+ public void startRecipeProcessing() {
+ processingRecipe = true;
+ updateAllInformationSlots();
+ }
+
+ private void refreshItemList() {
+ AENetworkProxy proxy = getProxy();
+ try {
+ IMEMonitor<IAEItemStack> sg = proxy.getStorage()
+ .getItemInventory();
+ Iterator<IAEItemStack> iterator = sg.getStorageList()
+ .iterator();
+ int index = 0;
+ while (iterator.hasNext() && index < SLOT_COUNT) {
+ IAEItemStack currItem = iterator.next();
+ if (currItem.getStackSize() >= minAutoPullStackSize) {
+ ItemStack itemstack = GT_Utility.copyAmount(1, currItem.getItemStack());
+ this.mInventory[index] = itemstack;
+ index++;
+ }
+ }
+ for (int i = index; i < SLOT_COUNT; i++) {
+ mInventory[i] = null;
+ }
+
+ } catch (final GridAccessException ignored) {}
+ }
+
+ private void updateAllInformationSlots() {
+ for (int index = 0; index < SLOT_COUNT; index++) {
+ updateInformationSlot(index, mInventory[index]);
+ }
+ }
+
+ @Override
+ public CheckRecipeResult endRecipeProcessing(GT_MetaTileEntity_MultiBlockBase controller) {
+ CheckRecipeResult checkRecipeResult = CheckRecipeResultRegistry.SUCCESSFUL;
+ for (int i = 0; i < SLOT_COUNT; ++i) {
+ if (savedStackSizes[i] != 0) {
+ ItemStack oldStack = shadowInventory[i];
+ if (oldStack == null || oldStack.stackSize < savedStackSizes[i]) {
+ AENetworkProxy proxy = getProxy();
+ try {
+ IMEMonitor<IAEItemStack> sg = proxy.getStorage()
+ .getItemInventory();
+ IAEItemStack request = AEItemStack.create(mInventory[i]);
+ int toExtract = savedStackSizes[i] - (oldStack == null ? 0 : oldStack.stackSize);
+ request.setStackSize(toExtract);
+ IAEItemStack result = sg.extractItems(request, Actionable.MODULATE, getRequestSource());
+ proxy.getEnergy()
+ .extractAEPower(request.getStackSize(), Actionable.MODULATE, PowerMultiplier.CONFIG);
+ setInventorySlotContents(i + SLOT_COUNT, oldStack);
+ if (result == null || result.getStackSize() != toExtract) {
+ controller.stopMachine(ShutDownReasonRegistry.CRITICAL_NONE);
+ checkRecipeResult = SimpleCheckRecipeResult
+ .ofFailurePersistOnShutdown("stocking_bus_fail_extraction");
+ }
+ } catch (final GridAccessException ignored) {
+ controller.stopMachine(ShutDownReasonRegistry.CRITICAL_NONE);
+ checkRecipeResult = SimpleCheckRecipeResult
+ .ofFailurePersistOnShutdown("stocking_hatch_fail_extraction");
+ }
+ }
+ savedStackSizes[i] = 0;
+ shadowInventory[i] = null;
+ if (mInventory[i + SLOT_COUNT] != null && mInventory[i + SLOT_COUNT].stackSize <= 0) {
+ mInventory[i + SLOT_COUNT] = null;
+ }
+ }
+ }
+ processingRecipe = false;
+ return checkRecipeResult;
+ }
+
+ public ItemStack updateInformationSlot(int aIndex, ItemStack aStack) {
+ if (aIndex >= 0 && aIndex < SLOT_COUNT) {
+ if (aStack == null) {
+ super.setInventorySlotContents(aIndex + SLOT_COUNT, null);
+ } else {
+ AENetworkProxy proxy = getProxy();
+ if (!proxy.isActive()) {
+ super.setInventorySlotContents(aIndex + SLOT_COUNT, null);
+ return null;
+ }
+ try {
+ IMEMonitor<IAEItemStack> sg = proxy.getStorage()
+ .getItemInventory();
+ IAEItemStack request = AEItemStack.create(mInventory[aIndex]);
+ request.setStackSize(Integer.MAX_VALUE);
+ IAEItemStack result = sg.extractItems(request, Actionable.SIMULATE, getRequestSource());
+ ItemStack s = (result != null) ? result.getItemStack() : null;
+ setInventorySlotContents(aIndex + SLOT_COUNT, s);
+ return s;
+ } catch (final GridAccessException ignored) {}
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Used to avoid slot update.
+ */
+ public ItemStack getShadowItemStack(int index) {
+ if (index < 0 || index >= shadowInventory.length) {
+ return null;
+ }
+ return shadowInventory[index];
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex == getManualSlot();
+ }
+
+ @Override
+ public int getGUIHeight() {
+ return 179;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ final SlotWidget[] aeSlotWidgets = new SlotWidget[16];
+
+ if (autoPullAvailable) {
+ buildContext.addSyncedWindow(CONFIG_WINDOW_ID, this::createStackSizeConfigurationWindow);
+ }
+
+ builder.widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 4)
+ .startFromSlot(0)
+ .endAtSlot(15)
+ .phantom(true)
+ .slotCreator(index -> new BaseSlot(inventoryHandler, index, true) {
+
+ @Override
+ public boolean isEnabled() {
+ return !autoPullItemList && super.isEnabled();
+ }
+ })
+ .widgetCreator(slot -> (SlotWidget) new SlotWidget(slot) {
+
+ @Override
+ protected void phantomClick(ClickData clickData, ItemStack cursorStack) {
+ if (clickData.mouseButton != 0 || !getMcSlot().isEnabled()) return;
+ final int aSlotIndex = getMcSlot().getSlotIndex();
+ if (cursorStack == null) {
+ getMcSlot().putStack(null);
+ } else {
+ if (containsSuchStack(cursorStack)) return;
+ getMcSlot().putStack(GT_Utility.copyAmount(1, cursorStack));
+ }
+ if (getBaseMetaTileEntity().isServerSide()) {
+ final ItemStack newInfo = updateInformationSlot(aSlotIndex, cursorStack);
+ aeSlotWidgets[getMcSlot().getSlotIndex()].getMcSlot()
+ .putStack(newInfo);
+ }
+ }
+
+ @Override
+ public IDrawable[] getBackground() {
+ IDrawable slot;
+ if (autoPullItemList) {
+ slot = GT_UITextures.SLOT_DARK_GRAY;
+ } else {
+ slot = ModularUITextures.ITEM_SLOT;
+ }
+ return new IDrawable[] { slot, GT_UITextures.OVERLAY_SLOT_ARROW_ME };
+ }
+
+ @Override
+ public List<String> getExtraTooltip() {
+ if (autoPullItemList) {
+ return Collections.singletonList(
+ StatCollector.translateToLocal("GT5U.machines.stocking_bus.cannot_set_slot"));
+ } else {
+ return Collections
+ .singletonList(StatCollector.translateToLocal("modularui.phantom.single.clear"));
+ }
+ }
+
+ private boolean containsSuchStack(ItemStack tStack) {
+ for (int i = 0; i < 16; ++i) {
+ if (GT_Utility.areStacksEqual(mInventory[i], tStack, false)) return true;
+ }
+ return false;
+ }
+ }.dynamicTooltip(() -> {
+ if (autoPullItemList) {
+ return Collections.singletonList(
+ StatCollector.translateToLocal("GT5U.machines.stocking_bus.cannot_set_slot"));
+ } else {
+ return Collections.emptyList();
+ }
+ })
+ .setUpdateTooltipEveryTick(true))
+ .build()
+ .setPos(7, 9))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 4)
+ .startFromSlot(16)
+ .endAtSlot(31)
+ .phantom(true)
+ .background(GT_UITextures.SLOT_DARK_GRAY)
+ .widgetCreator(
+ slot -> aeSlotWidgets[slot.getSlotIndex() - 16] = new AESlotWidget(slot).disableInteraction())
+ .build()
+ .setPos(97, 9))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_DOUBLE)
+ .setPos(82, 30)
+ .setSize(12, 12));
+
+ if (autoPullAvailable) {
+ builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (clickData.mouseButton == 0) {
+ setAutoPullItemList(!autoPullItemList);
+ } else if (clickData.mouseButton == 1 && !widget.isClient()) {
+ widget.getContext()
+ .openSyncedWindow(CONFIG_WINDOW_ID);
+ }
+ })
+ .setBackground(() -> {
+ if (autoPullItemList) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED,
+ GT_UITextures.OVERLAY_BUTTON_AUTOPULL_ME };
+ } else {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD,
+ GT_UITextures.OVERLAY_BUTTON_AUTOPULL_ME_DISABLED };
+ }
+ })
+ .addTooltips(
+ Arrays.asList(
+ StatCollector.translateToLocal("GT5U.machines.stocking_bus.auto_pull.tooltip.1"),
+ StatCollector.translateToLocal("GT5U.machines.stocking_bus.auto_pull.tooltip.2")))
+ .setSize(16, 16)
+ .setPos(80, 10))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> autoPullItemList, this::setAutoPullItemList));
+ }
+
+ builder.widget(TextWidget.dynamicString(() -> {
+ boolean isActive = isActive();
+ boolean isPowered = isPowered();
+ boolean isBooting = isBooting();
+ EnumChatFormatting color = (isActive && isPowered) ? EnumChatFormatting.GREEN : EnumChatFormatting.DARK_RED;
+ return color + WailaText.getPowerState(isActive, isPowered, isBooting);
+ })
+ .setTextAlignment(Alignment.Center)
+ .setSize(90, 9)
+ .setPos(43, 84))
+ .widget(
+ new SlotWidget(inventoryHandler, getManualSlot())
+ // ghost slots are prioritized over manual slot
+ .setShiftClickPriority(11)
+ .setPos(79, 45));
+ }
+
+ protected ModularWindow createStackSizeConfigurationWindow(final EntityPlayer player) {
+ final int WIDTH = 78;
+ final int HEIGHT = 80;
+ final int PARENT_WIDTH = getGUIWidth();
+ final int PARENT_HEIGHT = getGUIHeight();
+ ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT);
+ builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
+ builder.setGuiTint(getGUIColorization());
+ builder.setDraggable(true);
+ builder.setPos(
+ (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT))
+ .add(
+ Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT))
+ .add(WIDTH - 3, 0)));
+ builder.widget(
+ TextWidget.localised("GT5U.machines.stocking_bus.min_stack_size")
+ .setPos(3, 2)
+ .setSize(74, 14))
+ .widget(
+ new NumericWidget().setSetter(val -> minAutoPullStackSize = (int) val)
+ .setGetter(() -> minAutoPullStackSize)
+ .setBounds(1, Integer.MAX_VALUE)
+ .setScrollValues(1, 4, 64)
+ .setTextAlignment(Alignment.Center)
+ .setTextColor(Color.WHITE.normal)
+ .setSize(70, 18)
+ .setPos(3, 18)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD));
+ builder.widget(
+ TextWidget.localised("GT5U.machines.stocking_bus.refresh_time")
+ .setPos(3, 42)
+ .setSize(74, 14))
+ .widget(
+ new NumericWidget().setSetter(val -> autoPullRefreshTime = (int) val)
+ .setGetter(() -> autoPullRefreshTime)
+ .setBounds(1, Integer.MAX_VALUE)
+ .setScrollValues(1, 4, 64)
+ .setTextAlignment(Alignment.Center)
+ .setTextColor(Color.WHITE.normal)
+ .setSize(70, 18)
+ .setPos(3, 58)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD));
+ return builder.build();
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(80, 63));
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ if (!autoPullAvailable) {
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ return;
+ }
+
+ NBTTagCompound tag = accessor.getNBTData();
+ boolean autopull = tag.getBoolean("autoPull");
+ int minSize = tag.getInteger("minStackSize");
+ currenttip.add(
+ StatCollector.translateToLocal("GT5U.waila.stocking_bus.auto_pull." + (autopull ? "enabled" : "disabled")));
+ if (autopull) {
+ currenttip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.stocking_bus.min_stack_size",
+ GT_Utility.formatNumbers(minSize)));
+ }
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ if (!autoPullAvailable) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ return;
+ }
+
+ tag.setBoolean("autoPull", autoPullItemList);
+ tag.setInteger("minStackSize", minAutoPullStackSize);
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ }
+
+ private static String[] getDescriptionArray(boolean autoPullAvailable) {
+ List<String> strings = new ArrayList<>(8);
+ strings.add("Advanced item input for Multiblocks");
+ strings.add("Hatch Tier: " + TIER_COLORS[autoPullAvailable ? 6 : 3] + VN[autoPullAvailable ? 6 : 3]);
+ strings.add("Retrieves directly from ME");
+ strings.add("Keeps 16 item types in stock");
+
+ if (autoPullAvailable) {
+ strings.add(
+ "Auto-Pull from ME mode will automatically stock the first 16 items in the ME system, updated every 5 seconds.");
+ strings.add("Toggle by right-clicking with screwdriver, or use the GUI.");
+ strings
+ .add("Use the GUI to limit the minimum stack size for Auto-Pulling and adjust the slot refresh timer.");
+ }
+
+ strings.add("Change ME connection behavior by right-clicking with wire cutter.");
+ strings.add("Configuration data can be copy+pasted using a data stick.");
+ return strings.toArray(new String[0]);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Input_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Input_ME.java
new file mode 100644
index 0000000000..18d4d669d1
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Input_ME.java
@@ -0,0 +1,884 @@
+package gregtech.common.tileentities.machines;
+
+import static gregtech.api.enums.GT_Values.TIER_COLORS;
+import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_FLUID_HATCH;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import javax.annotation.Nullable;
+
+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.nbt.NBTTagList;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizons.modularui.api.ModularUITextures;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.Text;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.math.Size;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.api.widget.Interactable;
+import com.gtnewhorizons.modularui.common.fluid.FluidStackTank;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
+
+import appeng.api.config.Actionable;
+import appeng.api.config.PowerMultiplier;
+import appeng.api.implementations.IPowerChannelState;
+import appeng.api.networking.GridFlags;
+import appeng.api.networking.security.BaseActionSource;
+import appeng.api.networking.security.IActionHost;
+import appeng.api.networking.security.MachineSource;
+import appeng.api.storage.IMEMonitor;
+import appeng.api.storage.data.IAEFluidStack;
+import appeng.api.util.AECableType;
+import appeng.core.localization.WailaText;
+import appeng.me.GridAccessException;
+import appeng.me.helpers.AENetworkProxy;
+import appeng.me.helpers.IGridProxyable;
+import appeng.util.item.AEFluidStack;
+import gregtech.api.enums.ItemList;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GT_MetaTileEntity_Hatch_Input_ME extends GT_MetaTileEntity_Hatch_Input
+ implements IPowerChannelState, IAddGregtechLogo, IAddUIWidgets, IRecipeProcessingAwareHatch {
+
+ private static final int SLOT_COUNT = 16;
+
+ protected final FluidStack[] storedFluids = new FluidStack[SLOT_COUNT];
+ protected final FluidStack[] storedInformationFluids = new FluidStack[SLOT_COUNT];
+
+ // these two fields should ALWAYS be mutated simultaneously
+ // in most cases, you should call setSavedFluid() instead of trying to write to the array directly
+ // a desync of these two fields can lead to catastrophe
+ protected final FluidStack[] shadowStoredFluids = new FluidStack[SLOT_COUNT];
+ private final int[] savedStackSizes = new int[SLOT_COUNT];
+
+ private boolean additionalConnection = false;
+
+ protected BaseActionSource requestSource = null;
+
+ @Nullable
+ protected AENetworkProxy gridProxy = null;
+
+ private final boolean autoPullAvailable;
+ protected boolean autoPullFluidList = false;
+ protected int minAutoPullAmount = 1;
+ private int autoPullRefreshTime = 100;
+ protected boolean processingRecipe = false;
+
+ protected static final int CONFIG_WINDOW_ID = 10;
+
+ protected static final FluidStack[] EMPTY_FLUID_STACK = new FluidStack[0];
+
+ public GT_MetaTileEntity_Hatch_Input_ME(int aID, boolean autoPullAvailable, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, autoPullAvailable ? 10 : 8, 1, getDescriptionArray(autoPullAvailable));
+ this.autoPullAvailable = autoPullAvailable;
+ }
+
+ public GT_MetaTileEntity_Hatch_Input_ME(String aName, boolean autoPullAvailable, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, 1, aTier, aDescription, aTextures);
+ this.autoPullAvailable = autoPullAvailable;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Input_ME(mName, autoPullAvailable, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_INPUT_FLUID_HATCH) };
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (getBaseMetaTileEntity().isServerSide()) {
+ if (aTimer % autoPullRefreshTime == 0 && autoPullFluidList) {
+ refreshFluidList();
+ }
+ if (aTimer % 20 == 0) {
+ getBaseMetaTileEntity().setActive(isActive());
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ }
+
+ private void refreshFluidList() {
+ AENetworkProxy proxy = getProxy();
+ if (proxy == null || !proxy.isActive()) {
+ return;
+ }
+
+ try {
+ IMEMonitor<IAEFluidStack> sg = proxy.getStorage()
+ .getFluidInventory();
+ Iterator<IAEFluidStack> iterator = sg.getStorageList()
+ .iterator();
+
+ int index = 0;
+ while (iterator.hasNext() && index < SLOT_COUNT) {
+ IAEFluidStack currItem = iterator.next();
+ if (currItem.getStackSize() >= minAutoPullAmount) {
+ FluidStack fluidStack = GT_Utility.copyAmount(1, currItem.getFluidStack());
+ storedFluids[index] = fluidStack;
+ index++;
+ }
+ }
+
+ for (int i = index; i < SLOT_COUNT; i++) {
+ storedFluids[i] = null;
+ }
+ } catch (final GridAccessException ignored) {}
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return true;
+ }
+
+ protected void setSavedFluid(int i, FluidStack stack) {
+ shadowStoredFluids[i] = stack;
+ savedStackSizes[i] = stack == null ? 0 : stack.amount;
+ }
+
+ public FluidStack[] getStoredFluids() {
+ if (!processingRecipe) {
+ return EMPTY_FLUID_STACK;
+ }
+
+ AENetworkProxy proxy = getProxy();
+ if (proxy == null || !proxy.isActive()) {
+ return EMPTY_FLUID_STACK;
+ }
+
+ updateAllInformationSlots();
+
+ for (int i = 0; i < SLOT_COUNT; i++) {
+ if (storedFluids[i] == null) {
+ setSavedFluid(i, null);
+ continue;
+ }
+
+ FluidStack fluidStackWithAmount = storedInformationFluids[i];
+ // Nothing in stock, no need to save anything
+ if (fluidStackWithAmount == null) continue;
+
+ setSavedFluid(i, fluidStackWithAmount);
+ }
+
+ return shadowStoredFluids;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, FluidStack aFluid, boolean doDrain) {
+ // this is an ME input hatch. allowing draining via logistics would be very wrong (and against
+ // canTankBeEmptied()) but we do need to support draining from controller, which uses the UNKNOWN direction.
+ if (side != ForgeDirection.UNKNOWN) return null;
+ FluidStack stored = getMatchingFluidStack(aFluid);
+ if (stored == null) return null;
+ FluidStack drained = GT_Utility.copyAmount(Math.min(stored.amount, aFluid.amount), stored);
+ if (doDrain) {
+ stored.amount -= drained.amount;
+ }
+ return drained;
+ }
+
+ @Override
+ public void startRecipeProcessing() {
+ processingRecipe = true;
+ updateAllInformationSlots();
+ }
+
+ @Override
+ public CheckRecipeResult endRecipeProcessing(GT_MetaTileEntity_MultiBlockBase controller) {
+ CheckRecipeResult checkRecipeResult = CheckRecipeResultRegistry.SUCCESSFUL;
+ AENetworkProxy proxy = getProxy();
+
+ for (int i = 0; i < SLOT_COUNT; ++i) {
+ FluidStack oldStack = shadowStoredFluids[i];
+ int toExtract = savedStackSizes[i] - (oldStack != null ? oldStack.amount : 0);
+ if (toExtract <= 0) continue;
+
+ try {
+ IMEMonitor<IAEFluidStack> sg = proxy.getStorage()
+ .getFluidInventory();
+
+ IAEFluidStack request = AEFluidStack.create(storedFluids[i]);
+ request.setStackSize(toExtract);
+ IAEFluidStack extractionResult = sg.extractItems(request, Actionable.MODULATE, getRequestSource());
+ proxy.getEnergy()
+ .extractAEPower(toExtract, Actionable.MODULATE, PowerMultiplier.CONFIG);
+
+ if (extractionResult == null || extractionResult.getStackSize() != toExtract) {
+ controller.stopMachine(ShutDownReasonRegistry.CRITICAL_NONE);
+ checkRecipeResult = SimpleCheckRecipeResult
+ .ofFailurePersistOnShutdown("stocking_hatch_fail_extraction");
+ }
+ } catch (GridAccessException ignored) {
+ controller.stopMachine(ShutDownReasonRegistry.CRITICAL_NONE);
+ checkRecipeResult = SimpleCheckRecipeResult
+ .ofFailurePersistOnShutdown("stocking_hatch_fail_extraction");
+ }
+ setSavedFluid(i, null);
+ if (storedInformationFluids[i] != null && storedInformationFluids[i].amount <= 0) {
+ storedInformationFluids[i] = null;
+ }
+ }
+
+ processingRecipe = false;
+ return checkRecipeResult;
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ getProxy().onReady();
+ }
+
+ @Override
+ public AECableType getCableConnectionType(ForgeDirection forgeDirection) {
+ return isOutputFacing(forgeDirection) ? AECableType.SMART : AECableType.NONE;
+ }
+
+ private void updateValidGridProxySides() {
+ if (additionalConnection) {
+ getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN)));
+ } else {
+ getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing()));
+ }
+ }
+
+ @Override
+ public void onFacingChange() {
+ updateValidGridProxySides();
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ additionalConnection = !additionalConnection;
+ updateValidGridProxySides();
+ aPlayer.addChatComponentMessage(
+ new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection));
+ return true;
+ }
+
+ @Override
+ public AENetworkProxy getProxy() {
+ if (gridProxy == null) {
+ if (getBaseMetaTileEntity() instanceof IGridProxyable) {
+ gridProxy = new AENetworkProxy(
+ (IGridProxyable) getBaseMetaTileEntity(),
+ "proxy",
+ autoPullAvailable ? ItemList.Hatch_Input_ME_Advanced.get(1) : ItemList.Hatch_Input_ME.get(1),
+ true);
+ gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL);
+ updateValidGridProxySides();
+ if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner(
+ getBaseMetaTileEntity().getWorld()
+ .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName()));
+ }
+ }
+ return this.gridProxy;
+ }
+
+ @Override
+ public boolean isPowered() {
+ return getProxy() != null && getProxy().isPowered();
+ }
+
+ @Override
+ public boolean isActive() {
+ return getProxy() != null && getProxy().isActive();
+ }
+
+ private void setAutoPullFluidList(boolean pullFluidList) {
+ if (!autoPullAvailable) {
+ return;
+ }
+
+ autoPullFluidList = pullFluidList;
+ if (!autoPullFluidList) {
+ Arrays.fill(storedFluids, null);
+ } else {
+ refreshFluidList();
+ }
+ updateAllInformationSlots();
+ }
+
+ private void updateAllInformationSlots() {
+ for (int index = 0; index < SLOT_COUNT; index++) {
+ updateInformationSlot(index);
+ }
+ }
+
+ public void updateInformationSlot(int index) {
+ if (index < 0 || index >= SLOT_COUNT) {
+ return;
+ }
+
+ FluidStack fluidStack = storedFluids[index];
+ if (fluidStack == null) {
+ storedInformationFluids[index] = null;
+ return;
+ }
+
+ AENetworkProxy proxy = getProxy();
+ if (proxy == null || !proxy.isActive()) {
+ storedInformationFluids[index] = null;
+ return;
+ }
+
+ try {
+ IMEMonitor<IAEFluidStack> sg = proxy.getStorage()
+ .getFluidInventory();
+ IAEFluidStack request = AEFluidStack.create(fluidStack);
+ request.setStackSize(Integer.MAX_VALUE);
+ IAEFluidStack result = sg.extractItems(request, Actionable.SIMULATE, getRequestSource());
+ FluidStack resultFluid = (result != null) ? result.getFluidStack() : null;
+ storedInformationFluids[index] = resultFluid;
+ } catch (final GridAccessException ignored) {}
+ }
+
+ private BaseActionSource getRequestSource() {
+ if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity());
+ return requestSource;
+ }
+
+ public FluidStack getMatchingFluidStack(FluidStack fluidStack) {
+ if (fluidStack == null) return null;
+
+ AENetworkProxy proxy = getProxy();
+ if (proxy == null || !proxy.isActive()) {
+ return null;
+ }
+
+ for (int i = 0; i < storedFluids.length; i++) {
+ if (storedFluids[i] == null) {
+ continue;
+ }
+
+ if (GT_Utility.areFluidsEqual(fluidStack, storedFluids[i], false)) {
+ updateInformationSlot(i);
+ if (storedInformationFluids[i] != null) {
+ setSavedFluid(i, storedInformationFluids[i]);
+ return shadowStoredFluids[i];
+ }
+
+ setSavedFluid(i, null);
+ return null;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Used to avoid slot update.
+ */
+ public FluidStack getShadowFluidStack(int index) {
+ if (index < 0 || index >= storedFluids.length) {
+ return null;
+ }
+
+ return shadowStoredFluids[index];
+ }
+
+ public int getFluidSlot(FluidStack fluidStack) {
+ if (fluidStack == null) return -1;
+
+ for (int i = 0; i < storedFluids.length; i++) {
+ if (storedFluids[i] == null) {
+ continue;
+ }
+
+ if (GT_Utility.areFluidsEqual(fluidStack, storedFluids[i], false)) {
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+
+ NBTTagList nbtTagList = new NBTTagList();
+ for (int i = 0; i < SLOT_COUNT; i++) {
+ FluidStack fluidStack = storedFluids[i];
+ if (fluidStack == null) {
+ continue;
+ }
+ NBTTagCompound fluidTag = fluidStack.writeToNBT(new NBTTagCompound());
+ if (storedInformationFluids[i] != null)
+ fluidTag.setInteger("informationAmount", storedInformationFluids[i].amount);
+ nbtTagList.appendTag(fluidTag);
+ }
+
+ aNBT.setTag("storedFluids", nbtTagList);
+ aNBT.setBoolean("autoPull", autoPullFluidList);
+ aNBT.setInteger("minAmount", minAutoPullAmount);
+ aNBT.setBoolean("additionalConnection", additionalConnection);
+ aNBT.setInteger("refreshTime", autoPullRefreshTime);
+ getProxy().writeToNBT(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("storedFluids")) {
+ NBTTagList nbtTagList = aNBT.getTagList("storedFluids", 10);
+ int c = Math.min(nbtTagList.tagCount(), SLOT_COUNT);
+ for (int i = 0; i < c; i++) {
+ NBTTagCompound nbtTagCompound = nbtTagList.getCompoundTagAt(i);
+ FluidStack fluidStack = GT_Utility.loadFluid(nbtTagCompound);
+ storedFluids[i] = fluidStack;
+
+ if (nbtTagCompound.hasKey("informationAmount")) {
+ int informationAmount = nbtTagCompound.getInteger("informationAmount");
+ storedInformationFluids[i] = GT_Utility.copyAmount(informationAmount, fluidStack);
+ }
+ }
+ }
+
+ minAutoPullAmount = aNBT.getInteger("minAmount");
+ autoPullFluidList = aNBT.getBoolean("autoPull");
+ additionalConnection = aNBT.getBoolean("additionalConnection");
+ if (aNBT.hasKey("refreshTime")) {
+ autoPullRefreshTime = aNBT.getInteger("refreshTime");
+ }
+ getProxy().readFromNBT(aNBT);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (!autoPullAvailable) {
+ return;
+ }
+
+ setAutoPullFluidList(!autoPullFluidList);
+ aPlayer.addChatMessage(
+ new ChatComponentTranslation(
+ "GT5U.machines.stocking_hatch.auto_pull_toggle." + (autoPullFluidList ? "enabled" : "disabled")));
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ if (!(aPlayer instanceof EntityPlayerMP))
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ ItemStack dataStick = aPlayer.inventory.getCurrentItem();
+ if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true))
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ if (!dataStick.hasTagCompound() || !"stockingHatch".equals(dataStick.stackTagCompound.getString("type")))
+ return false;
+
+ NBTTagCompound nbt = dataStick.stackTagCompound;
+
+ if (autoPullAvailable) {
+ setAutoPullFluidList(nbt.getBoolean("autoPull"));
+ minAutoPullAmount = nbt.getInteger("minAmount");
+ autoPullRefreshTime = nbt.getInteger("refreshTime");
+ }
+ additionalConnection = nbt.getBoolean("additionalConnection");
+
+ if (!autoPullFluidList) {
+ NBTTagList stockingFluids = nbt.getTagList("fluidsToStock", 10);
+ for (int i = 0; i < stockingFluids.tagCount(); i++) {
+ storedFluids[i] = GT_Utility.loadFluid(stockingFluids.getCompoundTagAt(i));
+ }
+ }
+
+ updateValidGridProxySides();
+ aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.stocking_bus.loaded"));
+ return true;
+ }
+
+ @Override
+ public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (!(aPlayer instanceof EntityPlayerMP)) return;
+
+ ItemStack dataStick = aPlayer.inventory.getCurrentItem();
+ if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) return;
+
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setString("type", "stockingHatch");
+ tag.setBoolean("autoPull", autoPullFluidList);
+ tag.setInteger("minAmount", minAutoPullAmount);
+ tag.setBoolean("additionalConnection", additionalConnection);
+ tag.setInteger("refreshTime", autoPullRefreshTime);
+
+ NBTTagList stockingFluids = new NBTTagList();
+ if (!autoPullFluidList) {
+ for (int index = 0; index < SLOT_COUNT; index++) {
+ FluidStack fluidStack = storedFluids[index];
+ if (fluidStack == null) {
+ continue;
+ }
+ stockingFluids.appendTag(fluidStack.writeToNBT(new NBTTagCompound()));
+ }
+ tag.setTag("fluidsToStock", stockingFluids);
+ }
+ dataStick.stackTagCompound = tag;
+ dataStick.setStackDisplayName("Stocking Input Hatch Configuration");
+ aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.stocking_bus.saved"));
+ }
+
+ @Override
+ public void onExplosion() {
+ for (int i = 0; i < SLOT_COUNT; i++) {
+ mInventory[i] = null;
+ }
+ }
+
+ public boolean containsSuchStack(FluidStack tStack) {
+ for (int i = 0; i < 16; ++i) {
+ if (GT_Utility.areFluidsEqual(storedFluids[i], tStack, false)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int getGUIHeight() {
+ return 179;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (autoPullAvailable) {
+ buildContext.addSyncedWindow(CONFIG_WINDOW_ID, this::createStackSizeConfigurationWindow);
+ }
+
+ builder.widget(
+ SlotGroup.ofFluidTanks(
+ IntStream.range(0, SLOT_COUNT)
+ .mapToObj(index -> createTankForFluidStack(storedFluids, index, 1))
+ .collect(Collectors.toList()),
+ 4)
+ .phantom(true)
+ .widgetCreator((slotIndex, h) -> (FluidSlotWidget) new FluidSlotWidget(h) {
+
+ @Override
+ protected void tryClickPhantom(ClickData clickData, ItemStack cursorStack) {
+ if (clickData.mouseButton != 0 || autoPullFluidList) return;
+
+ FluidStack heldFluid = getFluidForPhantomItem(cursorStack);
+ if (cursorStack == null) {
+ storedFluids[slotIndex] = null;
+ } else {
+ if (containsSuchStack(heldFluid)) return;
+ storedFluids[slotIndex] = heldFluid;
+ }
+ if (getBaseMetaTileEntity().isServerSide()) {
+ updateInformationSlot(slotIndex);
+ detectAndSendChanges(false);
+ }
+ }
+
+ @Override
+ protected void tryScrollPhantom(int direction) {}
+
+ @Override
+ public IDrawable[] getBackground() {
+ IDrawable slot;
+ if (autoPullFluidList) {
+ slot = GT_UITextures.SLOT_DARK_GRAY;
+ } else {
+ slot = ModularUITextures.FLUID_SLOT;
+ }
+ return new IDrawable[] { slot, GT_UITextures.OVERLAY_SLOT_ARROW_ME };
+ }
+
+ @Override
+ public void buildTooltip(List<Text> tooltip) {
+ FluidStack fluid = getContent();
+ if (fluid != null) {
+ addFluidNameInfo(tooltip, fluid);
+
+ if (!autoPullFluidList) {
+ tooltip.add(Text.localised("modularui.phantom.single.clear"));
+ }
+ } else {
+ tooltip.add(
+ Text.localised("modularui.fluid.empty")
+ .format(EnumChatFormatting.WHITE));
+ }
+
+ if (autoPullFluidList) {
+ tooltip.add(Text.localised("GT5U.machines.stocking_bus.cannot_set_slot"));
+ }
+ }
+ }.setUpdateTooltipEveryTick(true))
+ .build()
+ .setPos(new Pos2d(7, 9)));
+
+ builder.widget(
+ SlotGroup.ofFluidTanks(
+ IntStream.range(0, SLOT_COUNT)
+ .mapToObj(index -> createTankForFluidStack(storedInformationFluids, index, Integer.MAX_VALUE))
+ .collect(Collectors.toList()),
+ 4)
+ .phantom(true)
+ .widgetCreator((slotIndex, h) -> (FluidSlotWidget) new FluidSlotWidget(h) {
+
+ @Override
+ protected void tryClickPhantom(ClickData clickData, ItemStack cursorStack) {}
+
+ @Override
+ protected void tryScrollPhantom(int direction) {}
+
+ @Override
+ public void buildTooltip(List<Text> tooltip) {
+ FluidStack fluid = getContent();
+ if (fluid != null) {
+ addFluidNameInfo(tooltip, fluid);
+ tooltip.add(Text.localised("modularui.fluid.phantom.amount", fluid.amount));
+ addAdditionalFluidInfo(tooltip, fluid);
+ if (!Interactable.hasShiftDown()) {
+ tooltip.add(Text.EMPTY);
+ tooltip.add(Text.localised("modularui.tooltip.shift"));
+ }
+ } else {
+ tooltip.add(
+ Text.localised("modularui.fluid.empty")
+ .format(EnumChatFormatting.WHITE));
+ }
+ }
+ }.setUpdateTooltipEveryTick(true))
+ .background(GT_UITextures.SLOT_DARK_GRAY)
+ .controlsAmount(true)
+ .build()
+ .setPos(new Pos2d(97, 9)));
+
+ if (autoPullAvailable) {
+ builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (clickData.mouseButton == 0) {
+ setAutoPullFluidList(!autoPullFluidList);
+ } else if (clickData.mouseButton == 1 && !widget.isClient()) {
+ widget.getContext()
+ .openSyncedWindow(CONFIG_WINDOW_ID);
+ }
+ })
+ .setPlayClickSound(true)
+ .setBackground(() -> {
+ if (autoPullFluidList) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED,
+ GT_UITextures.OVERLAY_BUTTON_AUTOPULL_ME };
+ } else {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD,
+ GT_UITextures.OVERLAY_BUTTON_AUTOPULL_ME_DISABLED };
+ }
+ })
+ .addTooltips(
+ Arrays.asList(
+ StatCollector.translateToLocal("GT5U.machines.stocking_hatch.auto_pull.tooltip.1"),
+ StatCollector.translateToLocal("GT5U.machines.stocking_hatch.auto_pull.tooltip.2")))
+ .setSize(16, 16)
+ .setPos(80, 10))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> autoPullFluidList, this::setAutoPullFluidList));
+ }
+
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_DOUBLE)
+ .setPos(82, 30)
+ .setSize(12, 12))
+ .widget(TextWidget.dynamicString(() -> {
+ boolean isActive = isActive();
+ boolean isPowered = isPowered();
+ boolean isBooting = isBooting();
+ EnumChatFormatting color = (isActive && isPowered) ? EnumChatFormatting.GREEN
+ : EnumChatFormatting.DARK_RED;
+ return color + WailaText.getPowerState(isActive, isPowered, isBooting);
+ })
+ .setTextAlignment(Alignment.Center)
+ .setSize(90, 9)
+ .setPos(43, 84));
+ }
+
+ private FluidStackTank createTankForFluidStack(FluidStack[] fluidStacks, int slotIndex, int capacity) {
+ return new FluidStackTank(() -> fluidStacks[slotIndex], (stack) -> {
+ if (getBaseMetaTileEntity().isServerSide()) {
+ return;
+ }
+
+ fluidStacks[slotIndex] = stack;
+ }, capacity);
+ }
+
+ protected ModularWindow createStackSizeConfigurationWindow(final EntityPlayer player) {
+ final int WIDTH = 78;
+ final int HEIGHT = 80;
+ final int PARENT_WIDTH = getGUIWidth();
+ final int PARENT_HEIGHT = getGUIHeight();
+ ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT);
+ builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
+ builder.setGuiTint(getGUIColorization());
+ builder.setDraggable(true);
+ builder.setPos(
+ (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT))
+ .add(
+ Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT))
+ .add(WIDTH - 3, 0)));
+ builder.widget(
+ TextWidget.localised("GT5U.machines.stocking_hatch.min_amount")
+ .setPos(3, 2)
+ .setSize(74, 14))
+ .widget(
+ new NumericWidget().setSetter(val -> minAutoPullAmount = (int) val)
+ .setGetter(() -> minAutoPullAmount)
+ .setBounds(1, Integer.MAX_VALUE)
+ .setScrollValues(1, 4, 64)
+ .setTextAlignment(Alignment.Center)
+ .setTextColor(Color.WHITE.normal)
+ .setSize(70, 18)
+ .setPos(3, 18)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD));
+ builder.widget(
+ TextWidget.localised("GT5U.machines.stocking_bus.refresh_time")
+ .setPos(3, 42)
+ .setSize(74, 14))
+ .widget(
+ new NumericWidget().setSetter(val -> autoPullRefreshTime = (int) val)
+ .setGetter(() -> autoPullRefreshTime)
+ .setBounds(1, Integer.MAX_VALUE)
+ .setScrollValues(1, 4, 64)
+ .setTextAlignment(Alignment.Center)
+ .setTextColor(Color.WHITE.normal)
+ .setSize(70, 18)
+ .setPos(3, 58)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD));
+ return builder.build();
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(80, 63));
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ if (!autoPullAvailable) {
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ return;
+ }
+
+ NBTTagCompound tag = accessor.getNBTData();
+ boolean autopull = tag.getBoolean("autoPull");
+ int minSize = tag.getInteger("minAmount");
+ currenttip.add(
+ StatCollector.translateToLocal("GT5U.waila.stocking_bus.auto_pull." + (autopull ? "enabled" : "disabled")));
+ if (autopull) {
+ currenttip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.stocking_hatch.min_amount",
+ GT_Utility.formatNumbers(minSize)));
+ }
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ if (!autoPullAvailable) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ return;
+ }
+
+ tag.setBoolean("autoPull", autoPullFluidList);
+ tag.setInteger("minAmount", minAutoPullAmount);
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ }
+
+ private static String[] getDescriptionArray(boolean autoPullAvailable) {
+ List<String> strings = new ArrayList<>(8);
+ strings.add("Advanced fluid input for Multiblocks");
+ strings.add("Hatch Tier: " + TIER_COLORS[autoPullAvailable ? 10 : 8] + VN[autoPullAvailable ? 10 : 8]);
+ strings.add("Retrieves directly from ME");
+ strings.add("Keeps 16 fluid types in stock");
+
+ if (autoPullAvailable) {
+ strings.add(
+ "Auto-Pull from ME mode will automatically stock the first 16 fluid in the ME system, updated every 5 seconds.");
+ strings.add("Toggle by right-clicking with screwdriver, or use the GUI.");
+ strings
+ .add("Use the GUI to limit the minimum stack size for Auto-Pulling and adjust the slot refresh timer.");
+ }
+
+ strings.add("Change ME connection behavior by right-clicking with wire cutter.");
+ strings.add("Configuration data can be copy+pasted using a data stick.");
+ return strings.toArray(new String[0]);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_OutputBus_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_OutputBus_ME.java
new file mode 100644
index 0000000000..16817e1a9c
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_OutputBus_ME.java
@@ -0,0 +1,327 @@
+package gregtech.common.tileentities.machines;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_HATCH;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_HATCH_ACTIVE;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import appeng.api.AEApi;
+import appeng.api.implementations.IPowerChannelState;
+import appeng.api.networking.GridFlags;
+import appeng.api.networking.security.BaseActionSource;
+import appeng.api.networking.security.IActionHost;
+import appeng.api.networking.security.MachineSource;
+import appeng.api.storage.IMEMonitor;
+import appeng.api.storage.data.IAEItemStack;
+import appeng.api.storage.data.IItemList;
+import appeng.api.util.AECableType;
+import appeng.me.GridAccessException;
+import appeng.me.helpers.AENetworkProxy;
+import appeng.me.helpers.IGridProxyable;
+import appeng.util.IWideReadableNumberConverter;
+import appeng.util.Platform;
+import appeng.util.ReadableNumberConverter;
+import gregtech.GT_Mod;
+import gregtech.api.enums.ItemList;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Hatch_OutputBus_ME extends GT_MetaTileEntity_Hatch_OutputBus
+ implements IPowerChannelState {
+
+ private BaseActionSource requestSource = null;
+ private @Nullable AENetworkProxy gridProxy = null;
+ final IItemList<IAEItemStack> itemCache = AEApi.instance()
+ .storage()
+ .createItemList();
+ long lastOutputTick = 0;
+ long tickCounter = 0;
+ boolean lastOutputFailed = false;
+ boolean infiniteCache = true;
+ boolean additionalConnection = false;
+
+ public GT_MetaTileEntity_Hatch_OutputBus_ME(int aID, String aName, String aNameRegional) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ 3,
+ new String[] { "Item Output for Multiblocks", "Stores directly into ME",
+ "Can cache infinite amount of items.", "Change cache behavior by right-clicking with screwdriver.",
+ "Change ME connection behavior by right-clicking with wire cutter" },
+ 0);
+ }
+
+ public GT_MetaTileEntity_Hatch_OutputBus_ME(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_OutputBus_ME(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_HATCH_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_HATCH) };
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ getProxy().onReady();
+ }
+
+ @Override
+ public boolean storeAll(ItemStack aStack) {
+ aStack.stackSize = store(aStack);
+ return aStack.stackSize == 0;
+ }
+
+ /**
+ * Attempt to store items in connected ME network. Returns how many items did not fit (if the network was down e.g.)
+ *
+ * @param stack input stack
+ * @return amount of items left over
+ */
+ public int store(final ItemStack stack) {
+ if (!infiniteCache && lastOutputFailed) return stack.stackSize;
+ itemCache.add(
+ AEApi.instance()
+ .storage()
+ .createItemStack(stack));
+ return 0;
+ }
+
+ private BaseActionSource getRequest() {
+ if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity());
+ return requestSource;
+ }
+
+ @Override
+ public AECableType getCableConnectionType(ForgeDirection forgeDirection) {
+ return isOutputFacing(forgeDirection) ? AECableType.SMART : AECableType.NONE;
+ }
+
+ private void updateValidGridProxySides() {
+ if (additionalConnection) {
+ getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN)));
+ } else {
+ getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing()));
+ }
+ }
+
+ @Override
+ public void onFacingChange() {
+ updateValidGridProxySides();
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ return false;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (!getBaseMetaTileEntity().getCoverInfoAtSide(side)
+ .isGUIClickable()) return;
+ infiniteCache = !infiniteCache;
+ aPlayer.addChatComponentMessage(new ChatComponentTranslation("GT5U.hatch.infiniteCache." + infiniteCache));
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ additionalConnection = !additionalConnection;
+ updateValidGridProxySides();
+ aPlayer.addChatComponentMessage(
+ new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection));
+ return true;
+ }
+
+ @Override
+ public AENetworkProxy getProxy() {
+ if (gridProxy == null) {
+ if (getBaseMetaTileEntity() instanceof IGridProxyable) {
+ gridProxy = new AENetworkProxy(
+ (IGridProxyable) getBaseMetaTileEntity(),
+ "proxy",
+ ItemList.Hatch_Output_Bus_ME.get(1),
+ true);
+ gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL);
+ updateValidGridProxySides();
+ if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner(
+ getBaseMetaTileEntity().getWorld()
+ .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName()));
+ }
+ }
+ return this.gridProxy;
+ }
+
+ private void flushCachedStack() {
+ lastOutputFailed = false;
+ AENetworkProxy proxy = getProxy();
+ if (proxy == null) {
+ lastOutputFailed = true;
+ return;
+ }
+ try {
+ IMEMonitor<IAEItemStack> sg = proxy.getStorage()
+ .getItemInventory();
+ for (IAEItemStack s : itemCache) {
+ if (s.getStackSize() == 0) continue;
+ IAEItemStack rest = Platform.poweredInsert(proxy.getEnergy(), sg, s, getRequest());
+ if (rest != null && rest.getStackSize() > 0) {
+ lastOutputFailed = true;
+ s.setStackSize(rest.getStackSize());
+ break;
+ }
+ s.setStackSize(0);
+ }
+ } catch (final GridAccessException ignored) {
+ lastOutputFailed = true;
+ }
+ lastOutputTick = tickCounter;
+ }
+
+ @Override
+ public boolean isPowered() {
+ return getProxy() != null && getProxy().isPowered();
+ }
+
+ @Override
+ public boolean isActive() {
+ return getProxy() != null && getProxy().isActive();
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (getBaseMetaTileEntity().isServerSide()) {
+ tickCounter = aTick;
+ if (tickCounter > (lastOutputTick + 40)) flushCachedStack();
+ if (tickCounter % 20 == 0) getBaseMetaTileEntity().setActive(isActive());
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+
+ NBTTagList items = new NBTTagList();
+ for (IAEItemStack s : itemCache) {
+ if (s.getStackSize() == 0) continue;
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setTag("itemStack", GT_Utility.saveItem(s.getItemStack()));
+ tag.setLong("size", s.getStackSize());
+ items.appendTag(tag);
+ }
+ aNBT.setBoolean("infiniteCache", infiniteCache);
+ aNBT.setBoolean("additionalConnection", additionalConnection);
+ aNBT.setTag("cachedItems", items);
+ getProxy().writeToNBT(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+
+ NBTBase t = aNBT.getTag("cachedStack"); // legacy
+ if (t instanceof NBTTagCompound) itemCache.add(
+ AEApi.instance()
+ .storage()
+ .createItemStack(GT_Utility.loadItem((NBTTagCompound) t)));
+ t = aNBT.getTag("cachedItems");
+ if (t instanceof NBTTagList l) {
+ for (int i = 0; i < l.tagCount(); ++i) {
+ NBTTagCompound tag = l.getCompoundTagAt(i);
+ if (!tag.hasKey("itemStack")) { // legacy #868
+ itemCache.add(
+ AEApi.instance()
+ .storage()
+ .createItemStack(GT_Utility.loadItem(l.getCompoundTagAt(i))));
+ continue;
+ }
+ NBTTagCompound tagItemStack = tag.getCompoundTag("itemStack");
+ final IAEItemStack s = AEApi.instance()
+ .storage()
+ .createItemStack(GT_Utility.loadItem(tagItemStack));
+ if (s != null) {
+ s.setStackSize(tag.getLong("size"));
+ itemCache.add(s);
+ } else {
+ GT_Mod.GT_FML_LOGGER.warn(
+ "An error occurred while loading contents of ME Output Bus. This item has been voided: "
+ + tagItemStack);
+ }
+ }
+ }
+ if (aNBT.hasKey("infiniteCache")) {
+ infiniteCache = aNBT.getBoolean("infiniteCache");
+ }
+ additionalConnection = aNBT.getBoolean("additionalConnection");
+ getProxy().readFromNBT(aNBT);
+ }
+
+ public boolean isLastOutputFailed() {
+ return lastOutputFailed;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ List<String> ss = new ArrayList<>();
+ ss.add(
+ "The bus is " + ((getProxy() != null && getProxy().isActive()) ? EnumChatFormatting.GREEN + "online"
+ : EnumChatFormatting.RED + "offline" + getAEDiagnostics()) + EnumChatFormatting.RESET);
+ if (itemCache.isEmpty()) {
+ ss.add("The bus has no cached items");
+ } else {
+ IWideReadableNumberConverter nc = ReadableNumberConverter.INSTANCE;
+ ss.add(String.format("The bus contains %d cached stacks: ", itemCache.size()));
+ int counter = 0;
+ for (IAEItemStack s : itemCache) {
+ ss.add(
+ s.getItem()
+ .getItemStackDisplayName(s.getItemStack()) + ": "
+ + EnumChatFormatting.GOLD
+ + nc.toWideReadableForm(s.getStackSize())
+ + EnumChatFormatting.RESET);
+ if (++counter > 100) break;
+ }
+ }
+ return ss.toArray(new String[itemCache.size() + 2]);
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Output_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Output_ME.java
new file mode 100644
index 0000000000..4df8ff68c5
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Output_ME.java
@@ -0,0 +1,383 @@
+package gregtech.common.tileentities.machines;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_FLUID_HATCH;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_FLUID_HATCH_ACTIVE;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import appeng.api.AEApi;
+import appeng.api.config.Actionable;
+import appeng.api.config.PowerMultiplier;
+import appeng.api.implementations.IPowerChannelState;
+import appeng.api.networking.GridFlags;
+import appeng.api.networking.energy.IEnergySource;
+import appeng.api.networking.security.BaseActionSource;
+import appeng.api.networking.security.IActionHost;
+import appeng.api.networking.security.MachineSource;
+import appeng.api.networking.security.PlayerSource;
+import appeng.api.storage.IMEInventory;
+import appeng.api.storage.IMEMonitor;
+import appeng.api.storage.data.IAEFluidStack;
+import appeng.api.storage.data.IItemList;
+import appeng.api.util.AECableType;
+import appeng.core.stats.Stats;
+import appeng.me.GridAccessException;
+import appeng.me.helpers.AENetworkProxy;
+import appeng.me.helpers.IGridProxyable;
+import appeng.util.IWideReadableNumberConverter;
+import appeng.util.ReadableNumberConverter;
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Hatch_Output_ME extends GT_MetaTileEntity_Hatch_Output implements IPowerChannelState {
+
+ private BaseActionSource requestSource = null;
+ private @Nullable AENetworkProxy gridProxy = null;
+ final IItemList<IAEFluidStack> fluidCache = AEApi.instance()
+ .storage()
+ .createFluidList();
+ long lastOutputTick = 0;
+ long tickCounter = 0;
+ boolean lastOutputFailed = false;
+ boolean infiniteCache = true;
+ boolean additionalConnection = false;
+
+ public GT_MetaTileEntity_Hatch_Output_ME(int aID, String aName, String aNameRegional) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ 3,
+ new String[] { "Fluid Output for Multiblocks", "Stores directly into ME",
+ "Can cache infinite amount of fluids.", "Change cache behavior by right-clicking with screwdriver.",
+ "Change ME connection behavior by right-clicking with wire cutter" },
+ 0);
+ }
+
+ public GT_MetaTileEntity_Hatch_Output_ME(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_Output_ME(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_FLUID_HATCH_ACTIVE) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(OVERLAY_ME_FLUID_HATCH) };
+ }
+
+ @Override
+ public byte getTierForStructure() {
+ return (byte) (GT_Values.V.length - 2);
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ getProxy().onReady();
+ }
+
+ @Override
+ public int fill(FluidStack aFluid, boolean doFill) {
+ if (doFill) {
+ return tryFillAE(aFluid);
+ } else {
+ if ((!infiniteCache && lastOutputFailed) || aFluid == null) return 0;
+ return aFluid.amount;
+ }
+ }
+
+ /**
+ * Attempt to store fluid in connected ME network. Returns how much fluid is accepted (if the network was down e.g.)
+ *
+ * @param aFluid input fluid
+ * @return amount of fluid filled
+ */
+ public int tryFillAE(final FluidStack aFluid) {
+ if ((!infiniteCache && lastOutputFailed) || aFluid == null) return 0;
+ fluidCache.add(
+ AEApi.instance()
+ .storage()
+ .createFluidStack(aFluid));
+ return aFluid.amount;
+ }
+
+ private BaseActionSource getRequest() {
+ if (requestSource == null) requestSource = new MachineSource((IActionHost) getBaseMetaTileEntity());
+ return requestSource;
+ }
+
+ @Override
+ public AECableType getCableConnectionType(ForgeDirection side) {
+ return isOutputFacing(side) ? AECableType.SMART : AECableType.NONE;
+ }
+
+ private void updateValidGridProxySides() {
+ if (additionalConnection) {
+ getProxy().setValidSides(EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN)));
+ } else {
+ getProxy().setValidSides(EnumSet.of(getBaseMetaTileEntity().getFrontFacing()));
+ }
+ }
+
+ @Override
+ public void onFacingChange() {
+ updateValidGridProxySides();
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ return false;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ // Don't allow to lock fluid in me fluid hatch
+ if (!getBaseMetaTileEntity().getCoverInfoAtSide(side)
+ .isGUIClickable()) return;
+ infiniteCache = !infiniteCache;
+ aPlayer.addChatComponentMessage(new ChatComponentTranslation("GT5U.hatch.infiniteCacheFluid." + infiniteCache));
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ additionalConnection = !additionalConnection;
+ updateValidGridProxySides();
+ aPlayer.addChatComponentMessage(
+ new ChatComponentTranslation("GT5U.hatch.additionalConnection." + additionalConnection));
+ return true;
+ }
+
+ @Override
+ public AENetworkProxy getProxy() {
+ if (gridProxy == null) {
+ if (getBaseMetaTileEntity() instanceof IGridProxyable) {
+ gridProxy = new AENetworkProxy(
+ (IGridProxyable) getBaseMetaTileEntity(),
+ "proxy",
+ ItemList.Hatch_Output_ME.get(1),
+ true);
+ gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL);
+ updateValidGridProxySides();
+ if (getBaseMetaTileEntity().getWorld() != null) gridProxy.setOwner(
+ getBaseMetaTileEntity().getWorld()
+ .getPlayerEntityByName(getBaseMetaTileEntity().getOwnerName()));
+ }
+ }
+ return this.gridProxy;
+ }
+
+ private void flushCachedStack() {
+ if (fluidCache.isEmpty()) return;
+ lastOutputFailed = true;
+ AENetworkProxy proxy = getProxy();
+ if (proxy == null) {
+ lastOutputFailed = true;
+ return;
+ }
+ try {
+ IMEMonitor<IAEFluidStack> sg = proxy.getStorage()
+ .getFluidInventory();
+ for (IAEFluidStack s : fluidCache) {
+ if (s.getStackSize() == 0) continue;
+ IAEFluidStack rest = fluidAEInsert(proxy.getEnergy(), sg, s, getRequest());
+ if (rest != null && rest.getStackSize() > 0) {
+ s.setStackSize(rest.getStackSize());
+ continue;
+ }
+ lastOutputFailed = false;
+ s.setStackSize(0);
+ }
+ } catch (final GridAccessException ignored) {
+ lastOutputFailed = true;
+ }
+ lastOutputTick = tickCounter;
+ }
+
+ @Override
+ public boolean isPowered() {
+ return getProxy() != null && getProxy().isPowered();
+ }
+
+ @Override
+ public boolean isActive() {
+ return getProxy() != null && getProxy().isActive();
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (getBaseMetaTileEntity().isServerSide()) {
+ tickCounter = aTick;
+ if (tickCounter > (lastOutputTick + 40)) flushCachedStack();
+ if (tickCounter % 20 == 0) getBaseMetaTileEntity().setActive(isActive());
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ NBTTagList fluids = new NBTTagList();
+ for (IAEFluidStack s : fluidCache) {
+ if (s.getStackSize() == 0) continue;
+ NBTTagCompound tag = new NBTTagCompound();
+ NBTTagCompound tagFluidStack = new NBTTagCompound();
+ s.getFluidStack()
+ .writeToNBT(tagFluidStack);
+ tag.setTag("fluidStack", tagFluidStack);
+ tag.setLong("size", s.getStackSize());
+ fluids.appendTag(tag);
+ }
+ aNBT.setTag("cachedFluids", fluids);
+ aNBT.setBoolean("infiniteCache", infiniteCache);
+ aNBT.setBoolean("additionalConnection", additionalConnection);
+ getProxy().writeToNBT(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ NBTBase t = aNBT.getTag("cachedFluids");
+ if (t instanceof NBTTagList l) {
+ for (int i = 0; i < l.tagCount(); ++i) {
+ NBTTagCompound tag = l.getCompoundTagAt(i);
+ NBTTagCompound tagFluidStack = tag.getCompoundTag("fluidStack");
+ final IAEFluidStack s = AEApi.instance()
+ .storage()
+ .createFluidStack(GT_Utility.loadFluid(tagFluidStack));
+ if (s != null) {
+ s.setStackSize(tag.getLong("size"));
+ fluidCache.add(s);
+ } else {
+ GT_Mod.GT_FML_LOGGER.warn(
+ "An error occurred while loading contents of ME Output Hatch. This fluid has been voided: "
+ + tagFluidStack);
+ }
+ }
+ }
+ if (aNBT.hasKey("infiniteCache")) {
+ infiniteCache = aNBT.getBoolean("infiniteCache");
+ }
+ additionalConnection = aNBT.getBoolean("additionalConnection");
+ getProxy().readFromNBT(aNBT);
+ }
+
+ public boolean isLastOutputFailed() {
+ return lastOutputFailed;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ List<String> ss = new ArrayList<>();
+ ss.add(
+ "The hatch is " + ((getProxy() != null && getProxy().isActive()) ? EnumChatFormatting.GREEN + "online"
+ : EnumChatFormatting.RED + "offline" + getAEDiagnostics()) + EnumChatFormatting.RESET);
+ if (fluidCache.isEmpty()) {
+ ss.add("The bus has no cached fluids");
+ } else {
+ IWideReadableNumberConverter nc = ReadableNumberConverter.INSTANCE;
+ ss.add(String.format("The hatch contains %d cached fluids: ", fluidCache.size()));
+ int counter = 0;
+ for (IAEFluidStack s : fluidCache) {
+ ss.add(
+ s.getFluidStack()
+ .getLocalizedName() + ": "
+ + EnumChatFormatting.GOLD
+ + nc.toWideReadableForm(s.getStackSize())
+ + " mB"
+ + EnumChatFormatting.RESET);
+ if (++counter > 100) break;
+ }
+ }
+ return ss.toArray(new String[fluidCache.size() + 2]);
+ }
+
+ public static IAEFluidStack fluidAEInsert(final IEnergySource energy, final IMEInventory<IAEFluidStack> cell,
+ final IAEFluidStack input, final BaseActionSource src) {
+ final IAEFluidStack possible = cell.injectItems(input.copy(), Actionable.SIMULATE, src);
+
+ long stored = input.getStackSize();
+ if (possible != null) {
+ stored -= possible.getStackSize();
+ }
+ // 1000 mb fluid will be considered as 1 item
+ long power = Math.max(1, stored / 1000);
+
+ final double availablePower = energy.extractAEPower(power, Actionable.SIMULATE, PowerMultiplier.CONFIG);
+
+ final long itemToAdd = Math.min((long) (availablePower + 0.9) * 1000, stored);
+
+ if (itemToAdd > 0) {
+ energy.extractAEPower(power, Actionable.MODULATE, PowerMultiplier.CONFIG);
+
+ if (itemToAdd < input.getStackSize()) {
+ final long original = input.getStackSize();
+ final IAEFluidStack split = input.copy();
+ split.decStackSize(itemToAdd);
+ input.setStackSize(itemToAdd);
+ split.add(cell.injectItems(input, Actionable.MODULATE, src));
+
+ if (src.isPlayer()) {
+ final long diff = original - split.getStackSize();
+ Stats.ItemsInserted.addToPlayer(((PlayerSource) src).player, (int) diff);
+ }
+
+ return split;
+ }
+
+ final IAEFluidStack ret = cell.injectItems(input, Actionable.MODULATE, src);
+
+ if (src.isPlayer()) {
+ final long diff = ret == null ? input.getStackSize() : input.getStackSize() - ret.getStackSize();
+ Stats.ItemsInserted.addToPlayer(((PlayerSource) src).player, (int) diff);
+ }
+
+ return ret;
+ }
+
+ return input;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/IDualInputHatch.java b/src/main/java/gregtech/common/tileentities/machines/IDualInputHatch.java
new file mode 100644
index 0000000000..c89aaaff40
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/IDualInputHatch.java
@@ -0,0 +1,21 @@
+package gregtech.common.tileentities.machines;
+
+import java.util.Iterator;
+import java.util.Optional;
+
+import net.minecraft.item.ItemStack;
+
+public interface IDualInputHatch {
+
+ boolean justUpdated();
+
+ Iterator<? extends IDualInputInventory> inventories();
+
+ void updateTexture(int id);
+
+ void updateCraftingIcon(ItemStack icon);
+
+ Optional<IDualInputInventory> getFirstNonEmptyInventory();
+
+ public boolean supportsFluids();
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/IDualInputInventory.java b/src/main/java/gregtech/common/tileentities/machines/IDualInputInventory.java
new file mode 100644
index 0000000000..01649fe181
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/IDualInputInventory.java
@@ -0,0 +1,11 @@
+package gregtech.common.tileentities.machines;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+public interface IDualInputInventory {
+
+ ItemStack[] getItemInputs();
+
+ FluidStack[] getFluidInputs();
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/IRecipeProcessingAwareHatch.java b/src/main/java/gregtech/common/tileentities/machines/IRecipeProcessingAwareHatch.java
new file mode 100644
index 0000000000..c7a97ce969
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/IRecipeProcessingAwareHatch.java
@@ -0,0 +1,26 @@
+package gregtech.common.tileentities.machines;
+
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.recipe.check.CheckRecipeResult;
+
+/**
+ * Implement this interface for {@link gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch}
+ * if it does special stuff while multiblock controller is processing recipe.
+ */
+public interface IRecipeProcessingAwareHatch {
+
+ /**
+ * Called when multiblock controller starts processing.
+ * {@link #endRecipeProcessing} is called on the same tick.
+ */
+ void startRecipeProcessing();
+
+ /**
+ * Called when multiblock controller ends processing. {@link #startRecipeProcessing} is called on the same tick.
+ *
+ * @param controller Caller of this method.
+ * @return Result of the process of this method. {@code !wasSuccessful()} means the returned result should
+ * overwrite the result calculated on multiblock whatever the reason is.
+ */
+ CheckRecipeResult endRecipeProcessing(GT_MetaTileEntity_MultiBlockBase controller);
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_AdvSeismicProspector.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_AdvSeismicProspector.java
new file mode 100644
index 0000000000..78ed9982fc
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_AdvSeismicProspector.java
@@ -0,0 +1,309 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_GLOW;
+import static gregtech.common.GT_UndergroundOil.undergroundOilReadInformation;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.objects.ItemData;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Block_Ores_Abstract;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+import ic2.core.Ic2Items;
+
+public class GT_MetaTileEntity_AdvSeismicProspector extends GT_MetaTileEntity_BasicMachine {
+
+ boolean ready = false;
+ final int radius;
+ final int step;
+ int cX;
+ int cZ;
+
+ public GT_MetaTileEntity_AdvSeismicProspector(int aID, String aName, String aNameRegional, int aTier, int aRadius,
+ int aStep) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 1, // amperage
+ "",
+ 1, // input slot count
+ 1, // output slot count
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_ROCK_BREAKER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_ROCK_BREAKER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_ROCK_BREAKER_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_ROCK_BREAKER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_ROCK_BREAKER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_ROCK_BREAKER_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ROCK_BREAKER_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_ROCK_BREAKER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_ROCK_BREAKER_GLOW)
+ .glow()
+ .build()));
+ radius = aRadius;
+ step = aStep;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { "Place, activate with explosives",
+ "2 Powderbarrels, " + "4 Glyceryl Trinitrate, " + "16 TNT, or " + "8 ITNT",
+ "Use Data Stick, Scan Data Stick, Print Data Stick, Bind Pages into Book",
+ "Ore prospecting area = " + radius * 2 + "x" + radius * 2 + " ONLY blocks below prospector",
+ "Oil prospecting area 3x3 oilfields, each is 8x8 chunks" };
+ }
+
+ protected GT_MetaTileEntity_AdvSeismicProspector(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures, int aRadius, int aStep) {
+ super(aName, aTier, 1, aDescription, aTextures, 1, 1);
+ radius = aRadius;
+ step = aStep;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_AdvSeismicProspector(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures,
+ this.radius,
+ this.step);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ ItemStack aStack = aPlayer.getCurrentEquippedItem();
+
+ if (!ready && (GT_Utility.consumeItems(aPlayer, aStack, Item.getItemFromBlock(Blocks.tnt), 16)
+ || GT_Utility.consumeItems(aPlayer, aStack, Ic2Items.industrialTnt.getItem(), 8)
+ || GT_Utility.consumeItems(aPlayer, aStack, Materials.Glyceryl, 4)
+ || GT_Utility.consumeItems(aPlayer, aStack, ItemList.Block_Powderbarrel.getItem(), 2))) {
+
+ this.ready = true;
+ this.mMaxProgresstime = (aPlayer.capabilities.isCreativeMode ? 20 : 800);
+
+ } else if (ready && mMaxProgresstime == 0
+ && aStack != null
+ && aStack.stackSize == 1
+ && aStack.getItem() == ItemList.Tool_DataStick.getItem()) {
+ this.ready = false;
+
+ // prospecting ores
+ HashMap<String, Integer> tOres = new HashMap<>(36);
+
+ prospectOres(tOres);
+
+ // prospecting oils
+ ArrayList<String> tOils = new ArrayList<>();
+ prospectOils(tOils);
+
+ GT_Utility.ItemNBT.setAdvancedProspectionData(
+ mTier,
+ aStack,
+ this.getBaseMetaTileEntity()
+ .getXCoord(),
+ this.getBaseMetaTileEntity()
+ .getYCoord(),
+ this.getBaseMetaTileEntity()
+ .getZCoord(),
+ this.getBaseMetaTileEntity()
+ .getWorld().provider.dimensionId,
+ tOils,
+ GT_Utility.sortByValueToList(tOres),
+ radius);
+ }
+ }
+
+ return true;
+ }
+
+ private void prospectOils(ArrayList<String> aOils) {
+
+ int xChunk = (getBaseMetaTileEntity().getXCoord() >> 7) << 3; // oil field aligned chunk coords
+ int zChunk = (getBaseMetaTileEntity().getZCoord() >> 7) << 3;
+
+ LinkedHashMap<ChunkCoordIntPair, FluidStack> tFluids = new LinkedHashMap<>();
+ int oilFieldCount = 0;
+
+ try {
+ final int oilfieldSize = 8;
+ for (int z = -1; z <= 1; ++z) {
+ for (int x = -1; x <= 1; ++x) {
+ ChunkCoordIntPair cInts = new ChunkCoordIntPair(x, z);
+ int min = Integer.MAX_VALUE;
+ int max = Integer.MIN_VALUE;
+
+ for (int i = 0; i < oilfieldSize; i++) {
+ for (int j = 0; j < oilfieldSize; j++) {
+ Chunk tChunk = getBaseMetaTileEntity().getWorld()
+ .getChunkFromChunkCoords(xChunk + i + x * oilfieldSize, zChunk + j + z * oilfieldSize);
+ FluidStack tFluid = undergroundOilReadInformation(tChunk);
+ if (tFluid != null) {
+ if (tFluid.amount > max) max = tFluid.amount;
+ if (tFluid.amount < min) min = tFluid.amount;
+ if (!tFluids.containsKey(cInts)) {
+ tFluids.put(cInts, tFluid);
+ }
+ }
+ }
+ }
+
+ aOils.add(
+ ++oilFieldCount + ","
+ + min
+ + "-"
+ + max
+ + ","
+ + tFluids.get(cInts)
+ .getLocalizedName());
+ }
+ }
+ } catch (Exception ignored) {}
+ }
+
+ private void prospectOres(Map<String, Integer> aOres) {
+ int tLeftXBound = this.getBaseMetaTileEntity()
+ .getXCoord() - radius;
+ int tRightXBound = tLeftXBound + 2 * radius;
+
+ int tLeftZBound = this.getBaseMetaTileEntity()
+ .getZCoord() - radius;
+ int tRightZBound = tLeftZBound + 2 * radius;
+
+ for (int i = tLeftXBound; i <= tRightXBound; i += step) {
+ if (Math.abs(i >> 4) % 3 != 1) continue;
+ for (int k = tLeftZBound; k <= tRightZBound; k += step) {
+ if (Math.abs(k >> 4) % 3 != 1) continue;
+
+ cX = (i >> 4) << 4;
+ cZ = (k >> 4) << 4;
+
+ String separator = (cX + 8) + "," + (cZ + 8) + " --------";
+ aOres.put(separator, 1);
+ prospectHole(i, k, aOres);
+ }
+ }
+ }
+
+ private void prospectHole(int i, int k, Map<String, Integer> aOres) {
+ String tFoundOre;
+ for (int j = this.getBaseMetaTileEntity()
+ .getYCoord(); j > 0; j--) {
+ tFoundOre = checkForOre(i, j, k);
+ if (tFoundOre != null) countOre(aOres, tFoundOre, cX, cZ);
+ }
+ }
+
+ private String checkForOre(int x, int y, int z) {
+ Block tBlock = this.getBaseMetaTileEntity()
+ .getBlock(x, y, z);
+
+ if (tBlock instanceof GT_Block_Ores_Abstract) {
+ TileEntity tTileEntity = getBaseMetaTileEntity().getWorld()
+ .getTileEntity(x, y, z);
+
+ if ((tTileEntity instanceof GT_TileEntity_Ores) && (((GT_TileEntity_Ores) tTileEntity).mMetaData < 16000)) { // Filtering
+ // small
+ // ores
+ Materials tMaterial = GregTech_API.sGeneratedMaterials[((GT_TileEntity_Ores) tTileEntity).mMetaData
+ % 1000];
+
+ if ((tMaterial != null) && (tMaterial != Materials._NULL)) return tMaterial.mDefaultLocalName;
+ }
+ } else {
+ int tMetaID = getBaseMetaTileEntity().getWorld()
+ .getBlockMetadata(x, y, z);
+ ItemStack is = new ItemStack(tBlock, 1, tMetaID);
+ ItemData association = GT_OreDictUnificator.getAssociation(is);
+ if ((association != null) && (association.mPrefix.toString()
+ .startsWith("ore"))) return association.mMaterial.mMaterial.mDefaultLocalName;
+ else if (GT_Utility.isOre(tBlock, tMetaID)) return tBlock.getLocalizedName();
+ }
+ return null;
+ }
+
+ private static void countOre(Map<String, Integer> map, String ore, int cCX, int cCZ) {
+ ore = (cCX + 8) + "," + (cCZ + 8) + " has " + ore;
+ Integer oldCount = map.get(ore);
+ oldCount = (oldCount == null) ? 0 : oldCount;
+
+ map.put(ore, oldCount + 1);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Boxinator.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Boxinator.java
new file mode 100644
index 0000000000..6c908aadac
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Boxinator.java
@@ -0,0 +1,231 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_BOXINATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_BOXINATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_BOXINATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_BOXINATOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_BOXINATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_BOXINATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_BOXINATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_BOXINATOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_BOXINATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_BOXINATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_BOXINATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_BOXINATOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_BOXINATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_BOXINATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_BOXINATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_BOXINATOR_GLOW;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.MachineType;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Boxinator extends GT_MetaTileEntity_BasicMachine {
+
+ ItemStack aInputCache;
+ ItemStack aOutputCache;
+ int aTypeCache = 0;
+
+ public GT_MetaTileEntity_Boxinator(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 1,
+ MachineType.PACKAGER.tooltipDescription(),
+ 2,
+ 1,
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_BOXINATOR_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_BOXINATOR_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_BOXINATOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_BOXINATOR_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_BOXINATOR_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_BOXINATOR_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_BOXINATOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_BOXINATOR_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_BOXINATOR_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_BOXINATOR_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_BOXINATOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_BOXINATOR_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_BOXINATOR_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_BOXINATOR_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_BOXINATOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_BOXINATOR_GLOW)
+ .glow()
+ .build()));
+ }
+
+ public GT_MetaTileEntity_Boxinator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures, 2, 1);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Boxinator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.packagerRecipes;
+ }
+
+ private boolean hasValidCache(ItemStack mItem, int mType, boolean mClearOnFailure) {
+ if (aInputCache != null && aOutputCache != null
+ && aTypeCache == mType
+ && aInputCache.isItemEqual(mItem)
+ && ItemStack.areItemStackTagsEqual(mItem, aInputCache)) return true;
+ // clear cache if it was invalid
+ if (mClearOnFailure) {
+ aInputCache = null;
+ aOutputCache = null;
+ aTypeCache = 0;
+ }
+ return false;
+ }
+
+ private void cacheItem(ItemStack mInputItem, ItemStack mOutputItem, int mType) {
+ aTypeCache = mType;
+ aOutputCache = mOutputItem.copy();
+ aInputCache = mInputItem.copy();
+ }
+
+ @Override
+ public int checkRecipe() {
+ int tCheck = super.checkRecipe();
+ if (tCheck != DID_NOT_FIND_RECIPE) {
+ return tCheck;
+ }
+ ItemStack tSlot0 = getInputAt(0);
+ ItemStack tSlot1 = getInputAt(1);
+ if ((GT_Utility.isStackValid(tSlot0)) && (GT_Utility.isStackValid(tSlot1))
+ && (GT_Utility.getContainerItem(tSlot0, true) == null)) {
+ if ((ItemList.Schematic_1by1.isStackEqual(tSlot1)) && (tSlot0.stackSize >= 1)) {
+ boolean tIsCached = hasValidCache(tSlot0, 1, true);
+ this.mOutputItems[0] = tIsCached ? aOutputCache.copy() : GT_ModHandler.getRecipeOutput(tSlot0);
+ if (this.mOutputItems[0] != null) {
+ if (canOutput(this.mOutputItems[0])) {
+ tSlot0.stackSize -= 1;
+ calculateOverclockedNess(30, 16);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ if (!tIsCached) cacheItem(tSlot0, this.mOutputItems[0], 1);
+ return FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ }
+ }
+ return DID_NOT_FIND_RECIPE;
+ }
+ if ((ItemList.Schematic_2by2.isStackEqual(tSlot1)) && (getInputAt(0).stackSize >= 4)) {
+ boolean tIsCached = hasValidCache(tSlot0, 2, true);
+ this.mOutputItems[0] = tIsCached ? aOutputCache.copy()
+ : GT_ModHandler.getRecipeOutput(tSlot0, tSlot0, null, tSlot0, tSlot0);
+ if (this.mOutputItems[0] != null) {
+ if (canOutput(this.mOutputItems[0])) {
+ getInputAt(0).stackSize -= 4;
+ calculateOverclockedNess(30, 32);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ if (!tIsCached) cacheItem(tSlot0, this.mOutputItems[0], 2);
+ return FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ }
+ }
+ return DID_NOT_FIND_RECIPE;
+ }
+ if ((ItemList.Schematic_3by3.isStackEqual(tSlot1)) && (getInputAt(0).stackSize >= 9)) {
+ boolean tIsCached = hasValidCache(tSlot0, 3, true);
+ this.mOutputItems[0] = tIsCached ? aOutputCache.copy()
+ : GT_ModHandler
+ .getRecipeOutput(tSlot0, tSlot0, tSlot0, tSlot0, tSlot0, tSlot0, tSlot0, tSlot0, tSlot0);
+ if (this.mOutputItems[0] != null) {
+ if (canOutput(this.mOutputItems[0])) {
+ getInputAt(0).stackSize -= 9;
+ calculateOverclockedNess(30, 64);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ if (!tIsCached) cacheItem(tSlot0, this.mOutputItems[0], 3);
+ return FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ }
+ }
+ return DID_NOT_FIND_RECIPE;
+ }
+ }
+ return DID_NOT_FIND_RECIPE;
+ }
+
+ @Override
+ protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (!super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)) {
+ return false;
+ }
+ ItemStack tInput1 = getInputAt(1);
+ if ((ItemList.Schematic_1by1.isStackEqual(tInput1)) || (ItemList.Schematic_2by2.isStackEqual(tInput1))
+ || (ItemList.Schematic_3by3.isStackEqual(tInput1))) {
+ if (hasValidCache(aStack, aTypeCache, false)) return true;
+ if (RecipeMaps.packagerRecipes.findRecipe(
+ getBaseMetaTileEntity(),
+ true,
+ gregtech.api.enums.GT_Values.V[mTier],
+ null,
+ GT_Utility.copyAmount(64, aStack),
+ tInput1) != null) {
+ return true;
+ }
+ if (ItemList.Schematic_1by1.isStackEqual(getInputAt(1)) && GT_ModHandler.getRecipeOutput(aStack) != null)
+ return true;
+ if (ItemList.Schematic_2by2.isStackEqual(getInputAt(1))
+ && GT_ModHandler.getRecipeOutput(aStack, aStack, null, aStack, aStack) != null) {
+ return true;
+ }
+ return ItemList.Schematic_3by3.isStackEqual(getInputAt(1)) && (GT_ModHandler
+ .getRecipeOutput(aStack, aStack, aStack, aStack, aStack, aStack, aStack, aStack, aStack) != null);
+ } else {
+ return RecipeMaps.packagerRecipes.containsInput(aStack);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Charger.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Charger.java
new file mode 100644
index 0000000000..de43fd715e
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Charger.java
@@ -0,0 +1,110 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicBatteryBuffer;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Charger extends GT_MetaTileEntity_BasicBatteryBuffer {
+
+ public GT_MetaTileEntity_Charger(int aID, String aName, String aNameRegional, int aTier, String aDescription,
+ int aSlotCount) {
+ super(aID, aName, aNameRegional, aTier, aDescription, aSlotCount);
+ }
+
+ public GT_MetaTileEntity_Charger(String aName, int aTier, String aDescription, ITexture[][][] aTextures,
+ int aSlotCount) {
+ super(aName, aTier, aDescription, aTextures, aSlotCount);
+ }
+
+ public GT_MetaTileEntity_Charger(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures,
+ int aSlotCount) {
+ super(aName, aTier, aDescription, aTextures, aSlotCount);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Charger(mName, mTier, mDescriptionArray, mTextures, mInventory.length);
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return V[mTier] * 64L * mInventory.length;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return V[mTier] * 256L * mInventory.length;
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return Math.max(mChargeableCount * 8L, 4L);
+ }
+
+ @Override
+ public long maxAmperesOut() {
+ return Math.max(mBatteryCount * 4L, 2L);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (this.getBaseMetaTileEntity() instanceof BaseMetaTileEntity) {
+ BaseMetaTileEntity mBaseMetaTileEntity = (BaseMetaTileEntity) getBaseMetaTileEntity();
+ if (mBaseMetaTileEntity.getMetaTileEntity() instanceof MetaTileEntity mMetaTileEntity) {
+ // for (int t = 0; t < 6; t++) {
+ if (mMetaTileEntity.dechargerSlotCount() > 0
+ && mBaseMetaTileEntity.getStoredEU() < mBaseMetaTileEntity.getEUCapacity()) {
+ for (int i = mMetaTileEntity.dechargerSlotStartIndex(),
+ k = mMetaTileEntity.dechargerSlotCount() + i; i < k; i++) {
+ if (mMetaTileEntity.mInventory[i] != null
+ && mBaseMetaTileEntity.getStoredEU() < mBaseMetaTileEntity.getEUCapacity()) {
+ mBaseMetaTileEntity.increaseStoredEnergyUnits(
+ GT_ModHandler.dischargeElectricItem(
+ mMetaTileEntity.mInventory[i],
+ GT_Utility.safeInt(
+ Math.min(
+ V[mTier] * 15,
+ mBaseMetaTileEntity.getEUCapacity()
+ - mBaseMetaTileEntity.getStoredEU())),
+ (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getInputTier()),
+ true,
+ false,
+ false),
+ true);
+ if (mMetaTileEntity.mInventory[i].stackSize <= 0) mMetaTileEntity.mInventory[i] = null;
+ }
+ }
+ }
+ if (mMetaTileEntity.rechargerSlotCount() > 0 && mBaseMetaTileEntity.getStoredEU() > 0) {
+ for (int i = mMetaTileEntity.rechargerSlotStartIndex(),
+ k = mMetaTileEntity.rechargerSlotCount() + i; i < k; i++) {
+ if (mBaseMetaTileEntity.getStoredEU() > 0 && mMetaTileEntity.mInventory[i] != null) {
+ mBaseMetaTileEntity
+ .decreaseStoredEU(
+ GT_ModHandler.chargeElectricItem(
+ mMetaTileEntity.mInventory[i],
+ GT_Utility
+ .safeInt(Math.min(V[mTier] * 15, mBaseMetaTileEntity.getStoredEU())),
+ (int) Math.min(Integer.MAX_VALUE, mMetaTileEntity.getOutputTier()),
+ true,
+ false),
+ true);
+ if (mMetaTileEntity.mInventory[i].stackSize <= 0) mMetaTileEntity.mInventory[i] = null;
+ }
+ }
+ // }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_IndustrialApiary.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_IndustrialApiary.java
new file mode 100644
index 0000000000..50f544334c
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_IndustrialApiary.java
@@ -0,0 +1,1560 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.GT_Values.AuthorKuba;
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_INDUSTRIAL_APIARY;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_INDUSTRIAL_APIARY_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_APIARY;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_INDUSTRIAL_APIARY_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_INDUSTRIAL_APIARY;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_INDUSTRIAL_APIARY_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_INDUSTRIAL_APIARY;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_INDUSTRIAL_APIARY_GLOW;
+import static gregtech.api.metatileentity.BaseTileEntity.STALLED_STUTTERING_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.util.GT_Utility.moveMultipleItemStacks;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.World;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.collect.ImmutableSet;
+import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularUIContext;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.builder.UIInfo;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.internal.wrapper.ModularUIContainer;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import com.mojang.authlib.GameProfile;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.apiculture.EnumBeeType;
+import forestry.api.apiculture.FlowerManager;
+import forestry.api.apiculture.IAlleleBeeAcceleratableEffect;
+import forestry.api.apiculture.IAlleleBeeEffect;
+import forestry.api.apiculture.IAlleleBeeSpecies;
+import forestry.api.apiculture.IApiaristTracker;
+import forestry.api.apiculture.IBee;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeHousing;
+import forestry.api.apiculture.IBeeHousingInventory;
+import forestry.api.apiculture.IBeeListener;
+import forestry.api.apiculture.IBeeModifier;
+import forestry.api.apiculture.IBeeRoot;
+import forestry.api.apiculture.IBeekeepingLogic;
+import forestry.api.apiculture.IBeekeepingMode;
+import forestry.api.arboriculture.EnumGermlingType;
+import forestry.api.core.BiomeHelper;
+import forestry.api.core.EnumHumidity;
+import forestry.api.core.EnumTemperature;
+import forestry.api.core.ForestryAPI;
+import forestry.api.core.IErrorLogic;
+import forestry.api.core.IErrorState;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IEffectData;
+import forestry.api.genetics.IIndividual;
+import forestry.apiculture.genetics.Bee;
+import forestry.apiculture.genetics.alleles.AlleleEffectThrottled;
+import forestry.core.errors.EnumErrorCode;
+import forestry.plugins.PluginApiculture;
+import gregtech.GT_Mod;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.recipe.BasicUIProperties;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ApiaryModifier;
+import gregtech.api.util.GT_ApiaryUpgrade;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Client;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GT_MetaTileEntity_IndustrialApiary extends GT_MetaTileEntity_BasicMachine
+ implements IBeeHousing, IBeeHousingInventory, IErrorLogic, IBeeModifier, IBeeListener, IAddUIWidgets {
+
+ public static final int beeCycleLength = 550;
+ public static final int baseEUtUsage = 37;
+ private static final int queen = 5;
+ private static final int drone = 6;
+ private static final int upgradeSlot = drone + 1;
+ private static final int upgradeSlotCount = 4;
+ private static Field AlleleBeeEffectThrottledField;
+
+ final IBeeRoot beeRoot = (IBeeRoot) AlleleManager.alleleRegistry.getSpeciesRoot("rootBees");
+
+ public int mSpeed = 0;
+ public boolean mLockedSpeed = true;
+ public boolean mAutoQueen = true;
+
+ private ItemStack usedQueen = null;
+ private IBee usedQueenBee = null;
+ private IEffectData[] effectData = new IEffectData[2];
+
+ public GT_MetaTileEntity_IndustrialApiary(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 4,
+ new String[] { "BEES GOES BRRRR", EnumChatFormatting.GRAY + AuthorKuba,
+ "Effective production chance as a percent is", "2.8 * b^0.52 * (p + t)^0.52 * s^0.37",
+ "where b is the base production chance as a percent,",
+ "p is the production modifier (2 w/o upgrades, or 4 * 1.2^n with n production upgrades),",
+ "t is 8 for the industrial apiary, and", "s is the speed value for the bee",
+ "Outputs are generated at the end of every bee tick (...)",
+ "Primary outputs are rolled once with base chance, once with half base" },
+ 6,
+ 9,
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_INDUSTRIAL_APIARY),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_INDUSTRIAL_APIARY_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_INDUSTRIAL_APIARY),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_INDUSTRIAL_APIARY_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_INDUSTRIAL_APIARY),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_INDUSTRIAL_APIARY_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_INDUSTRIAL_APIARY),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_INDUSTRIAL_APIARY_GLOW)
+ .glow()
+ .build()));
+ }
+
+ public GT_MetaTileEntity_IndustrialApiary(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures, 6, 9);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_IndustrialApiary(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) return true;
+ if (!GT_Mod.gregtechproxy.mForceFreeFace) {
+ openGUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+ for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
+ if (aBaseMetaTileEntity.getAirAtSide(side)) {
+ openGUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+ }
+ GT_Utility.sendChatToPlayer(aPlayer, "No free Side!");
+ return true;
+ }
+
+ private void openGUI(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ IndustrialApiaryUI.open(
+ aPlayer,
+ aBaseMetaTileEntity.getWorld(),
+ aBaseMetaTileEntity.getXCoord(),
+ aBaseMetaTileEntity.getYCoord(),
+ aBaseMetaTileEntity.getZCoord());
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mSpeed", mSpeed);
+ aNBT.setBoolean("mLockedSpeed", mLockedSpeed);
+ aNBT.setBoolean("mAutoQueen", mAutoQueen);
+ if (usedQueen != null) aNBT.setTag("usedQueen", usedQueen.writeToNBT(new NBTTagCompound()));
+ aNBT.setBoolean("retrievingPollenInThisOperation", retrievingPollenInThisOperation);
+ aNBT.setInteger("pollinationDelay", pollinationDelay);
+ aNBT.setFloat("usedBeeLife", usedBeeLife);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mSpeed = aNBT.getInteger("mSpeed");
+ mLockedSpeed = aNBT.getBoolean("mLockedSpeed");
+ if (aNBT.hasKey("mAutoQueen")) mAutoQueen = aNBT.getBoolean("mAutoQueen");
+ if (aNBT.hasKey("usedQueen")) usedQueen = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag("usedQueen"));
+ retrievingPollenInThisOperation = aNBT.getBoolean("retrievingPollenInThisOperation");
+ pollinationDelay = aNBT.getInteger("pollinationDelay");
+ usedBeeLife = aNBT.getFloat("usedBeeLife");
+ }
+
+ boolean retrievingPollenInThisOperation = false;
+ IIndividual retrievedpollen = null;
+ int pollinationDelay = 100;
+ float usedBeeLife = 0f;
+
+ @Override
+ public int checkRecipe() {
+ updateModifiers();
+ if (canWork()) {
+
+ final ItemStack queen = getQueen();
+ usedQueen = queen.copy();
+ if (beeRoot.getType(queen) == EnumBeeType.QUEEN) {
+ final IBee bee = beeRoot.getMember(queen);
+ usedQueenBee = bee;
+
+ // LIFE CYCLES
+
+ float mod = this.getLifespanModifier(null, null, 1.f);
+ final IBeekeepingMode mode = beeRoot.getBeekeepingMode(this.getWorld());
+ final IBeeModifier beemodifier = mode.getBeeModifier();
+ mod *= beemodifier.getLifespanModifier(null, null, 1.f);
+ final int h = bee.getHealth();
+ mod = 1.f / mod;
+ final float cycles = h / mod;
+
+ // PRODUCTS
+
+ final HashMap<GT_Utility.ItemId, ItemStack> pollen = new HashMap<>();
+
+ if (isRetrievingPollen && floweringMod > 0f) {
+ final int icycles = (int) cycles
+ + (getWorld().rand.nextFloat() < (cycles - (float) ((int) cycles)) ? 1 : 0);
+ for (int z = 0; z < icycles; z++) {
+ final IIndividual p = bee.retrievePollen(this);
+ if (p != null) {
+ final ItemStack s = p.getGenome()
+ .getSpeciesRoot()
+ .getMemberStack(p, EnumGermlingType.POLLEN.ordinal());
+ if (s != null) {
+ final GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(s);
+ pollen.computeIfAbsent(id, k -> {
+ final ItemStack ns = s.copy();
+ ns.stackSize = 0;
+ return ns;
+ });
+ pollen.get(id).stackSize += s.stackSize;
+ }
+ }
+ }
+ }
+
+ retrievedpollen = null;
+ retrievingPollenInThisOperation = isRetrievingPollen;
+
+ final IBeeGenome genome = bee.getGenome();
+ final IAlleleBeeSpecies primary = genome.getPrimary();
+ final IAlleleBeeSpecies secondary = genome.getSecondary();
+
+ final float speed = genome.getSpeed();
+ final float prodMod = getProductionModifier(null, 0f) + beemodifier.getProductionModifier(null, 0f);
+
+ final HashMap<GT_Utility.ItemId, Float> drops = new HashMap<>();
+ final HashMap<GT_Utility.ItemId, ItemStack> dropstacks = new HashMap<>();
+
+ for (Map.Entry<ItemStack, Float> entry : primary.getProductChances()
+ .entrySet()) {
+ final GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(entry.getKey());
+ drops.merge(
+ id,
+ Bee.getFinalChance(entry.getValue(), speed, prodMod, 8f) * (float) entry.getKey().stackSize
+ * cycles,
+ Float::sum);
+ dropstacks.computeIfAbsent(id, k -> entry.getKey());
+ }
+ for (Map.Entry<ItemStack, Float> entry : secondary.getProductChances()
+ .entrySet()) {
+ final GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(entry.getKey());
+ drops.merge(
+ id,
+ Bee.getFinalChance(entry.getValue() / 2f, speed, prodMod, 8f) * (float) entry.getKey().stackSize
+ * cycles,
+ Float::sum);
+ dropstacks.computeIfAbsent(id, k -> entry.getKey());
+ }
+ if (primary.isJubilant(genome, this) && secondary.isJubilant(genome, this))
+ for (Map.Entry<ItemStack, Float> entry : primary.getSpecialtyChances()
+ .entrySet()) {
+ final GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(entry.getKey());
+ drops.merge(
+ id,
+ Bee.getFinalChance(entry.getValue(), speed, prodMod, 8f)
+ * (float) entry.getKey().stackSize
+ * cycles,
+ Float::sum);
+ dropstacks.computeIfAbsent(id, k -> entry.getKey());
+ }
+
+ int i = 0;
+ final int imax = mOutputItems.length;
+
+ final IApiaristTracker breedingTracker = beeRoot.getBreedingTracker(getWorld(), getOwner());
+
+ if (!bee.canSpawn()) {
+ final ItemStack convert = new ItemStack(PluginApiculture.items.beePrincessGE);
+ final NBTTagCompound nbttagcompound = new NBTTagCompound();
+ queen.writeToNBT(nbttagcompound);
+ convert.setTagCompound(nbttagcompound);
+ this.mOutputItems[i++] = convert;
+ } else {
+ final IBee b = bee.spawnPrincess(this);
+ if (b != null) {
+ final ItemStack princess = beeRoot.getMemberStack(b, EnumBeeType.PRINCESS.ordinal());
+ breedingTracker.registerPrincess(b);
+ this.mOutputItems[i++] = princess;
+ }
+ final IBee[] d = bee.spawnDrones(this);
+ if (d != null && d.length > 0) {
+ final HashMap<GT_Utility.ItemId, ItemStack> drones = new HashMap<>(d.length);
+ for (IBee dr : d) {
+ final ItemStack drone = beeRoot.getMemberStack(dr, EnumBeeType.DRONE.ordinal());
+ breedingTracker.registerDrone(dr);
+ final GT_Utility.ItemId drid = GT_Utility.ItemId.createNoCopy(drone);
+ if (drones.containsKey(drid)) drones.get(drid).stackSize += drone.stackSize;
+ else {
+ this.mOutputItems[i++] = drone;
+ drones.put(drid, drone);
+ }
+ }
+ }
+ }
+
+ final int imin = i;
+
+ setQueen(null);
+
+ for (Map.Entry<GT_Utility.ItemId, Float> entry : drops.entrySet()) {
+ final ItemStack s = dropstacks.get(entry.getKey())
+ .copy();
+ s.stackSize = entry.getValue()
+ .intValue()
+ + (getWorld().rand.nextFloat() < (entry.getValue() - (float) entry.getValue()
+ .intValue()) ? 1 : 0);
+ if (s.stackSize > 0 && i < imax) while (true) {
+ if (s.stackSize <= s.getMaxStackSize()) {
+ this.mOutputItems[i++] = s;
+ break;
+ } else this.mOutputItems[i++] = s.splitStack(s.getMaxStackSize());
+ if (i >= imax) break;
+ }
+ }
+
+ for (ItemStack s : pollen.values()) if (i < imax) this.mOutputItems[i++] = s;
+ else break;
+
+ // Overclock
+
+ usedBeeLife = cycles * (float) beeCycleLength;
+ this.mMaxProgresstime = (int) usedBeeLife;
+ final int timemaxdivider = this.mMaxProgresstime / 100;
+ final int useddivider = 1 << this.mSpeed;
+ int actualdivider = useddivider;
+ this.mMaxProgresstime /= Math.min(actualdivider, timemaxdivider);
+ actualdivider /= Math.min(actualdivider, timemaxdivider);
+ for (i--; i >= imin; i--) this.mOutputItems[i].stackSize *= actualdivider;
+
+ pollinationDelay = Math.max((int) (this.mMaxProgresstime / cycles), 20); // don't run too often
+
+ this.mProgresstime = 0;
+ this.mEUt = (int) ((float) baseEUtUsage * this.energyMod * useddivider);
+ if (useddivider == 2) this.mEUt += 32;
+ else if (useddivider > 2) this.mEUt += (32 * (useddivider << (this.mSpeed - 2)));
+ } else {
+ // Breeding time
+
+ retrievingPollenInThisOperation = true; // Don't pollinate when breeding
+
+ this.mMaxProgresstime = 100;
+ this.mProgresstime = 0;
+ final int useddivider = Math.min(100, 1 << this.mSpeed);
+ this.mMaxProgresstime /= useddivider;
+ this.mEUt = (int) ((float) baseEUtUsage * this.energyMod * useddivider);
+ if (useddivider == 2) this.mEUt += 32;
+ else if (useddivider > 2) this.mEUt += (32 * (useddivider << (this.mSpeed - 2)));
+
+ final IBee princess = beeRoot.getMember(getQueen());
+ usedQueenBee = princess;
+ final IBee drone = beeRoot.getMember(getDrone());
+ princess.mate(drone);
+ final NBTTagCompound nbttagcompound = new NBTTagCompound();
+ princess.writeToNBT(nbttagcompound);
+ this.mOutputItems[0] = new ItemStack(PluginApiculture.items.beeQueenGE);
+ this.mOutputItems[0].setTagCompound(nbttagcompound);
+ beeRoot.getBreedingTracker(getWorld(), getOwner())
+ .registerQueen(princess);
+
+ setQueen(null);
+ getDrone().stackSize -= 1;
+ if (getDrone().stackSize == 0) setDrone(null);
+ }
+
+ return FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ }
+
+ return DID_NOT_FIND_RECIPE;
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ updateModifiers();
+ }
+
+ @Override
+ protected boolean hasEnoughEnergyToCheckRecipe() {
+ return getBaseMetaTileEntity().isUniversalEnergyStored(V[mSpeed] * 8L);
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 4L;
+ }
+
+ private void doEffect() {
+ final IBeeGenome genome = usedQueenBee.getGenome();
+ final IAlleleBeeEffect effect = genome.getEffect();
+ if (!(effect instanceof IAlleleBeeAcceleratableEffect)) {
+ effectData[0] = effect.validateStorage(effectData[0]);
+ effect.doEffect(genome, effectData[0], this);
+ }
+
+ if (!effect.isCombinable()) return;
+
+ final IAlleleBeeEffect secondary = (IAlleleBeeEffect) genome.getInactiveAllele(EnumBeeChromosome.EFFECT);
+ if (!secondary.isCombinable()) return;
+
+ if (!(secondary instanceof IAlleleBeeAcceleratableEffect)) {
+ effectData[1] = secondary.validateStorage(effectData[1]);
+ secondary.doEffect(genome, effectData[1], this);
+ }
+ }
+
+ private void doAcceleratedEffects() {
+ final IBeeGenome genome = usedQueenBee.getGenome();
+ final IAlleleBeeEffect effect = genome.getEffect();
+ try {
+ if (AlleleBeeEffectThrottledField == null) {
+ AlleleBeeEffectThrottledField = AlleleEffectThrottled.class.getDeclaredField("throttle");
+ AlleleBeeEffectThrottledField.setAccessible(true);
+ }
+ if (effect instanceof IAlleleBeeAcceleratableEffect) {
+ effectData[0] = effect.validateStorage(effectData[0]);
+ effectData[0] = ((IAlleleBeeAcceleratableEffect) effect).doEffectAccelerated(
+ genome,
+ effectData[0],
+ this,
+ usedBeeLife / (effect instanceof AlleleEffectThrottled
+ ? (float) AlleleBeeEffectThrottledField.getInt(effect)
+ : 1f));
+ }
+
+ if (!effect.isCombinable()) return;
+
+ final IAlleleBeeEffect secondary = (IAlleleBeeEffect) genome.getInactiveAllele(EnumBeeChromosome.EFFECT);
+ if (!secondary.isCombinable()) return;
+
+ if (secondary instanceof IAlleleBeeAcceleratableEffect) {
+ effectData[1] = secondary.validateStorage(effectData[1]);
+ effectData[1] = ((IAlleleBeeAcceleratableEffect) secondary).doEffectAccelerated(
+ genome,
+ effectData[0],
+ this,
+ usedBeeLife / (secondary instanceof AlleleEffectThrottled
+ ? (float) AlleleBeeEffectThrottledField.getInt(secondary)
+ : 1f));
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isClientSide()) {
+ if (GT_Client.changeDetected == 4) {
+ /*
+ * Client tick counter that is set to 5 on hiding pipes and covers. It triggers a texture update next
+ * client tick when reaching 4, with provision for 3 more update tasks, spreading client change
+ * detection related work and network traffic on different ticks, until it reaches 0.
+ */
+ aBaseMetaTileEntity.issueTextureUpdate();
+ }
+ if (aBaseMetaTileEntity.isActive()) {
+ if (usedQueen != null) {
+ if (aTick % 2 == 0) {
+ // FX on client, effect on server
+ final IBee bee = beeRoot.getMember(usedQueen);
+ effectData = bee.doFX(effectData, this);
+ }
+ }
+ }
+ }
+ if (aBaseMetaTileEntity.isServerSide()) {
+
+ mCharge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3;
+ mDecharge = aBaseMetaTileEntity.getStoredEU() < aBaseMetaTileEntity.getEUCapacity() / 3;
+
+ doDisplayThings();
+
+ if (!aBaseMetaTileEntity.isActive()) {
+ if (aBaseMetaTileEntity.isAllowedToWork()
+ && (aBaseMetaTileEntity.hasInventoryBeenModified() || aTick % 600 == 0
+ || aBaseMetaTileEntity.hasWorkJustBeenEnabled())
+ && hasEnoughEnergyToCheckRecipe()) {
+ final int check = checkRecipe();
+ if (check == FOUND_AND_SUCCESSFULLY_USED_RECIPE) {
+ aBaseMetaTileEntity.setActive(true);
+ }
+ }
+ } else {
+
+ if (this.mProgresstime < 0) {
+ this.mProgresstime++;
+ return;
+ }
+ if (this.mStuttering) {
+ if (!aBaseMetaTileEntity.isAllowedToWork()) return;
+ if (aTick % 100 == 0) this.mStuttering = false;
+ return;
+ }
+ if (this.hasErrors()) {
+ if (!aBaseMetaTileEntity.isAllowedToWork()) return;
+ if (aTick % 100 == 0) if (!canWork(usedQueen)) this.stutterProcess();
+ return;
+ }
+
+ if (!drainEnergyForProcess(this.mEUt)) {
+ this.mStuttering = true;
+ this.stutterProcess();
+ return;
+ }
+ this.mProgresstime++;
+ if (usedQueen != null) {
+ if (usedQueenBee == null) usedQueenBee = beeRoot.getMember(usedQueen);
+ doEffect();
+ if (!retrievingPollenInThisOperation && floweringMod > 0f
+ && this.mProgresstime % pollinationDelay == 0) {
+ if (retrievedpollen == null) retrievedpollen = usedQueenBee.retrievePollen(this);
+ if (retrievedpollen != null && (usedQueenBee.pollinateRandom(this, retrievedpollen)
+ || this.mProgresstime % (pollinationDelay * 5) == 0)) retrievedpollen = null;
+ }
+ }
+
+ if (this.mProgresstime % 100 == 0) {
+ if (!canWork(usedQueen)) {
+ this.stutterProcess();
+ return;
+ }
+ }
+
+ if (this.mProgresstime >= this.mMaxProgresstime) {
+ if (usedQueenBee != null) doAcceleratedEffects();
+ updateModifiers();
+ for (int i = 0; i < mOutputItems.length; i++)
+ if (mOutputItems[i] != null) for (int j = 0; j < mOutputItems.length; j++) {
+ if (j == 0 && isAutomated) {
+ if (beeRoot.isMember(mOutputItems[i], EnumBeeType.QUEEN.ordinal())
+ || beeRoot.isMember(mOutputItems[i], EnumBeeType.PRINCESS.ordinal())) {
+ if (aBaseMetaTileEntity.addStackToSlot(queen, mOutputItems[i])) break;
+ } else if (beeRoot.isMember(mOutputItems[i], EnumBeeType.DRONE.ordinal()))
+ if (aBaseMetaTileEntity.addStackToSlot(drone, mOutputItems[i])) break;
+ } else if (mAutoQueen && i == 0
+ && j == 0
+ && beeRoot.isMember(mOutputItems[0], EnumBeeType.QUEEN.ordinal())
+ && aBaseMetaTileEntity.addStackToSlot(queen, mOutputItems[0])) break;
+ if (aBaseMetaTileEntity
+ .addStackToSlot(getOutputSlot() + ((j + i) % mOutputItems.length), mOutputItems[i]))
+ break;
+ }
+ Arrays.fill(mOutputItems, null);
+ mEUt = 0;
+ mProgresstime = 0;
+ mMaxProgresstime = 0;
+ mStuttering = false;
+ aBaseMetaTileEntity.setActive(false);
+
+ if (doesAutoOutput() && !isOutputEmpty() && aBaseMetaTileEntity.getFrontFacing() != mMainFacing) {
+ final TileEntity tTileEntity2 = aBaseMetaTileEntity
+ .getTileEntityAtSide(aBaseMetaTileEntity.getFrontFacing());
+ final long tStoredEnergy = aBaseMetaTileEntity.getUniversalEnergyStored();
+ int tMaxStacks = (int) (tStoredEnergy / 64L);
+ if (tMaxStacks > mOutputItems.length) tMaxStacks = mOutputItems.length;
+
+ moveMultipleItemStacks(
+ aBaseMetaTileEntity,
+ tTileEntity2,
+ aBaseMetaTileEntity.getFrontFacing(),
+ aBaseMetaTileEntity.getBackFacing(),
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1,
+ tMaxStacks);
+ }
+
+ if (aBaseMetaTileEntity.isAllowedToWork() && checkRecipe() == FOUND_AND_SUCCESSFULLY_USED_RECIPE)
+ aBaseMetaTileEntity.setActive(true);
+ }
+ }
+ }
+ }
+
+ public void cancelProcess() {
+ if (this.getBaseMetaTileEntity()
+ .isActive()
+ && this.getBaseMetaTileEntity()
+ .isServerSide()
+ && usedQueen != null
+ && beeRoot.isMember(usedQueen, EnumBeeType.QUEEN.ordinal())) {
+ Arrays.fill(mOutputItems, null);
+ mEUt = 0;
+ mProgresstime = 0;
+ mMaxProgresstime = 0;
+ mStuttering = false;
+ this.getBaseMetaTileEntity()
+ .setActive(false);
+ setQueen(usedQueen);
+ this.getBaseMetaTileEntity()
+ .disableWorking();
+ }
+ }
+
+ @Override
+ public boolean isItemValidForSlot(int aIndex, ItemStack aStack) {
+ if (aStack == null) return false;
+ if (aIndex < getInputSlot()) return true;
+ if (aIndex == queen) return beeRoot.isMember(aStack, EnumBeeType.QUEEN.ordinal())
+ || beeRoot.isMember(aStack, EnumBeeType.PRINCESS.ordinal());
+ else if (aIndex == drone) return beeRoot.isMember(aStack, EnumBeeType.DRONE.ordinal());
+ else if (aIndex < getOutputSlot()) {
+ if (!GT_ApiaryUpgrade.isUpgrade(aStack)) return false;
+ for (int i = upgradeSlot; i < upgradeSlot + upgradeSlotCount; i++) {
+ if (aIndex == i) continue;
+ final ItemStack s = getStackInSlot(i);
+ if (s == null) continue;
+ if (GT_Utility.areStacksEqual(getStackInSlot(i), aStack)) return false;
+ if (GT_ApiaryUpgrade.isUpgrade(aStack)) {
+ if (!GT_ApiaryUpgrade.getUpgrade(aStack)
+ .isAllowedToWorkWith(getStackInSlot(i))) return false;
+ } else if (GT_ApiaryUpgrade.isUpgrade(s)) {
+ if (!GT_ApiaryUpgrade.getUpgrade(s)
+ .isAllowedToWorkWith(aStack)) return false;
+ }
+ }
+ return true;
+ } else return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (!super.allowPutStack(aBaseMetaTileEntity, aIndex, side, aStack)) return false;
+ return isItemValidForSlot(aIndex, aStack);
+ }
+
+ @Override
+ public void setInventorySlotContents(int aIndex, ItemStack aStack) {
+ if (aIndex == queen && aStack != null && getBaseMetaTileEntity().isClientSide()) usedQueen = aStack.copy();
+ super.setInventorySlotContents(aIndex, aStack);
+ }
+
+ // Gets called on slot click //
+ public void onInventoryUpdate(int aIndex) {
+ if (aIndex > drone && aIndex < getOutputSlot()) updateModifiers();
+ }
+
+ public ItemStack getUsedQueen() {
+ return usedQueen;
+ }
+
+ // region IBeeHousing
+
+ @Override
+ public Iterable<IBeeModifier> getBeeModifiers() {
+ return Collections.singletonList(this);
+ }
+
+ @Override
+ public Iterable<IBeeListener> getBeeListeners() {
+ return Collections.singletonList(this);
+ }
+
+ @Override
+ public IBeeHousingInventory getBeeInventory() {
+ return this;
+ }
+
+ @Override
+ public IBeekeepingLogic getBeekeepingLogic() {
+ return dummylogic;
+ }
+
+ @Override
+ public int getBlockLightValue() {
+ return this.getBaseMetaTileEntity()
+ .getLightLevelAtSide(ForgeDirection.UP);
+ }
+
+ @Override
+ public boolean canBlockSeeTheSky() {
+ return this.getBaseMetaTileEntity()
+ .getSkyAtSide(ForgeDirection.UP);
+ }
+
+ @Override
+ public World getWorld() {
+ return this.getBaseMetaTileEntity()
+ .getWorld();
+ }
+
+ GameProfile owner = null;
+
+ @Override
+ public GameProfile getOwner() {
+ if (owner == null) owner = new GameProfile(
+ this.getBaseMetaTileEntity()
+ .getOwnerUuid(),
+ this.getBaseMetaTileEntity()
+ .getOwnerName());
+ return owner;
+ }
+
+ @Override
+ public Vec3 getBeeFXCoordinates() {
+ return Vec3.createVectorHelper(
+ getBaseMetaTileEntity().getXCoord() + 0.5,
+ getBaseMetaTileEntity().getYCoord() + 0.5,
+ getBaseMetaTileEntity().getZCoord() + 0.5);
+ }
+
+ @Override
+ public BiomeGenBase getBiome() {
+ if (biomeOverride == null) return this.getBaseMetaTileEntity()
+ .getBiome();
+ return biomeOverride;
+ }
+
+ @Override
+ public EnumTemperature getTemperature() {
+ if (BiomeHelper.isBiomeHellish(getBiome())) return EnumTemperature.HELLISH;
+ return EnumTemperature.getFromValue(getBiome().temperature + temperatureMod);
+ }
+
+ @Override
+ public EnumHumidity getHumidity() {
+ return EnumHumidity.getFromValue(getBiome().rainfall + humidityMod);
+ }
+
+ @Override
+ public IErrorLogic getErrorLogic() {
+ return this;
+ }
+
+ @Override
+ public ChunkCoordinates getCoordinates() {
+ return this.getBaseMetaTileEntity()
+ .getCoords();
+ }
+
+ // endregion
+
+ // region IBeeHousingInventory
+ @Override
+ public ItemStack getQueen() {
+ return getStackInSlot(queen);
+ }
+
+ @Override
+ public ItemStack getDrone() {
+ return getStackInSlot(drone);
+ }
+
+ @Override
+ public void setQueen(ItemStack itemStack) {
+ setInventorySlotContents(queen, itemStack);
+ }
+
+ @Override
+ public void setDrone(ItemStack itemStack) {
+ setInventorySlotContents(drone, itemStack);
+ }
+
+ @Override
+ public boolean addProduct(ItemStack itemStack, boolean b) {
+ throw new RuntimeException("Should not happen :F");
+ }
+ // endregion
+
+ // region IErrorLogic
+
+ public HashSet<IErrorState> mErrorStates = new HashSet<>();
+
+ @Override
+ public boolean setCondition(boolean b, IErrorState iErrorState) {
+ if (b) mErrorStates.add(iErrorState);
+ else mErrorStates.remove(iErrorState);
+ return b;
+ }
+
+ @Override
+ public boolean contains(IErrorState iErrorState) {
+ return mErrorStates.contains(iErrorState);
+ }
+
+ @Override
+ public boolean hasErrors() {
+ return !mErrorStates.isEmpty();
+ }
+
+ @Override
+ public void clearErrors() {
+ mErrorStates.clear();
+ }
+
+ @Override
+ public void writeData(DataOutputStream dataOutputStream) throws IOException {
+ dataOutputStream.write(mErrorStates.size());
+ for (IErrorState s : mErrorStates) dataOutputStream.writeUTF(s.getUniqueName());
+ }
+
+ @Override
+ public void readData(DataInputStream dataInputStream) throws IOException {
+ for (int i = dataInputStream.readInt(); i > 0; i--)
+ mErrorStates.add(ForestryAPI.errorStateRegistry.getErrorState(dataInputStream.readUTF()));
+ }
+
+ @Override
+ public ImmutableSet<IErrorState> getErrorStates() {
+ return ImmutableSet.copyOf(mErrorStates);
+ }
+
+ private String flowerType = "";
+ private ChunkCoordinates flowercoords = null;
+ private Block flowerBlock;
+ private int flowerBlockMeta;
+
+ private boolean checkFlower(IBee bee) {
+ final String flowerType = bee.getGenome()
+ .getFlowerProvider()
+ .getFlowerType();
+ if (!this.flowerType.equals(flowerType)) flowercoords = null;
+ if (flowercoords != null) {
+ if (getWorld().getBlock(flowercoords.posX, flowercoords.posY, flowercoords.posZ) != flowerBlock
+ || getWorld().getBlockMetadata(flowercoords.posX, flowercoords.posY, flowercoords.posZ)
+ != flowerBlockMeta)
+ if (!FlowerManager.flowerRegistry
+ .isAcceptedFlower(flowerType, getWorld(), flowercoords.posX, flowercoords.posY, flowercoords.posZ))
+ flowercoords = null;
+ else {
+ flowerBlock = getWorld().getBlock(flowercoords.posX, flowercoords.posY, flowercoords.posZ);
+ flowerBlockMeta = getWorld()
+ .getBlockMetadata(flowercoords.posX, flowercoords.posY, flowercoords.posZ);
+ }
+ }
+ if (flowercoords == null) {
+ flowercoords = FlowerManager.flowerRegistry.getAcceptedFlowerCoordinates(this, bee, flowerType);
+ if (flowercoords != null) {
+ flowerBlock = getWorld().getBlock(flowercoords.posX, flowercoords.posY, flowercoords.posZ);
+ flowerBlockMeta = getWorld().getBlockMetadata(flowercoords.posX, flowercoords.posY, flowercoords.posZ);
+ this.flowerType = flowerType;
+ }
+ }
+ return flowercoords != null;
+ }
+
+ private boolean canWork(ItemStack queen) {
+ clearErrors();
+ if (queen == null) return true; // Reloaded the chunk ?
+ if (beeRoot.isMember(queen, EnumBeeType.PRINCESS.ordinal())) return true;
+ final IBee bee = beeRoot.getMember(queen);
+ for (IErrorState err : bee.getCanWork(this)) setCondition(true, err);
+ setCondition(!checkFlower(bee), EnumErrorCode.NO_FLOWER);
+ return !hasErrors();
+ }
+
+ private boolean canWork() {
+ clearErrors();
+ final EnumBeeType beeType = beeRoot.getType(getQueen());
+ if (beeType == EnumBeeType.PRINCESS) {
+ setCondition(!beeRoot.isDrone(getDrone()), EnumErrorCode.NO_DRONE);
+ return !hasErrors();
+ }
+ if (beeType == EnumBeeType.QUEEN) {
+ final IBee bee = beeRoot.getMember(getQueen());
+ for (IErrorState err : bee.getCanWork(this)) setCondition(true, err);
+ setCondition(!checkFlower(bee), EnumErrorCode.NO_FLOWER);
+ return !hasErrors();
+ } else {
+ setCondition(true, EnumErrorCode.NO_QUEEN);
+ return false;
+ }
+ }
+
+ // endregion
+
+ // region IBeeModifier
+
+ private float terrorityMod = 1f;
+ private float mutationMod = 1f;
+ private float lifespanMod = 1f;
+ private float productionMod = 2f;
+ private float floweringMod = 1f;
+ private float geneticDecayMod = 1f;
+ private float energyMod = 1f;
+ private boolean sealedMod = false;
+ private boolean selfLightedMod = false;
+ private boolean selfUnlightedMod = false;
+ private boolean sunlightSimulatedMod = false;
+ private BiomeGenBase biomeOverride = null;
+ private float humidityMod = 0f;
+ private float temperatureMod = 0f;
+ private boolean isAutomated = false;
+ private boolean isRetrievingPollen = false;
+ private int maxspeed = 0;
+
+ public void updateModifiers() {
+ final GT_ApiaryModifier mods = new GT_ApiaryModifier();
+ for (int i = 0; i < upgradeSlotCount; i++) {
+ final ItemStack s = getStackInSlot(upgradeSlot + i);
+ if (s == null) continue;
+ if (GT_ApiaryUpgrade.isUpgrade(s)) {
+ final GT_ApiaryUpgrade upgrade = GT_ApiaryUpgrade.getUpgrade(s);
+ upgrade.applyModifiers(mods, s);
+ }
+ }
+
+ terrorityMod = mods.territory;
+ mutationMod = mods.mutation;
+ lifespanMod = mods.lifespan;
+ productionMod = mods.production;
+ floweringMod = mods.flowering;
+ geneticDecayMod = mods.geneticDecay;
+ energyMod = mods.energy;
+ sealedMod = mods.isSealed;
+ selfLightedMod = mods.isSelfLighted;
+ selfUnlightedMod = mods.isSelfUnlighted;
+ sunlightSimulatedMod = mods.isSunlightSimulated;
+ biomeOverride = mods.biomeOverride;
+ humidityMod = mods.humidity;
+ temperatureMod = mods.temperature;
+ isAutomated = mods.isAutomated;
+ isRetrievingPollen = mods.isCollectingPollen;
+ maxspeed = mods.maxSpeed;
+
+ if (mLockedSpeed) mSpeed = maxspeed;
+ else mSpeed = Math.min(mSpeed, maxspeed);
+ }
+
+ /** Tries to move as much of [stack] into a possible upgrade slot */
+ public void addUpgrade(ItemStack stack) {
+ if (stack == null || !GT_ApiaryUpgrade.isUpgrade(stack)) return;
+
+ int amount = stack.stackSize;
+ for (int i = upgradeSlot; i < upgradeSlot + upgradeSlotCount; i++) {
+ if (!isItemValidForSlot(i, stack)) continue;
+
+ int maxStackSize = GT_ApiaryUpgrade.getUpgrade(stack)
+ .getMaxNumber();
+ ItemStack stackInSlot = getStackInSlot(i);
+
+ // Push into empty slot
+ if (stackInSlot == null) {
+ amount = Math.min(amount, maxStackSize);
+ setInventorySlotContents(i, stack.splitStack(amount));
+ return;
+ }
+
+ if (!GT_Utility.areStacksEqual(stack, stackInSlot)) continue;
+ amount = Math.max(Math.min(amount, maxStackSize - stackInSlot.stackSize), 0);
+ if (amount == 0) return;
+ stackInSlot.stackSize += amount;
+ stack.stackSize -= amount;
+ return;
+ }
+ }
+
+ /** Returns installed upgrade in slot 0 <= [index] < getMaxUpgradeCount() */
+ public ItemStack getUpgrade(int index) {
+ if (index < 0 || index >= upgradeSlotCount) return null;
+ return getStackInSlot(upgradeSlot + index);
+ }
+
+ /** Tries to remove [amount] or less of the upgrade installed in slot [index]. Returns the removed ItemStack */
+ public ItemStack removeUpgrade(int index, int amount) {
+ if (index < 0 || index >= upgradeSlotCount || amount <= 0) return null;
+
+ ItemStack stackInSlot = getUpgrade(index);
+ if (stackInSlot == null) return null;
+
+ amount = Math.min(amount, stackInSlot.stackSize);
+ ItemStack result = stackInSlot.splitStack(amount);
+ if (stackInSlot.stackSize <= 0) setInventorySlotContents(upgradeSlot + index, null);
+ return result;
+ }
+
+ public static int getMaxUpgradeCount() {
+ return upgradeSlotCount;
+ }
+
+ @Override
+ public float getTerritoryModifier(IBeeGenome iBeeGenome, float v) {
+ return Math.min(5, terrorityMod);
+ }
+
+ @Override
+ public float getMutationModifier(IBeeGenome iBeeGenome, IBeeGenome iBeeGenome1, float v) {
+ return mutationMod;
+ }
+
+ @Override
+ public float getLifespanModifier(IBeeGenome iBeeGenome, IBeeGenome iBeeGenome1, float v) {
+ return lifespanMod;
+ }
+
+ @Override
+ public float getProductionModifier(IBeeGenome iBeeGenome, float v) {
+ return productionMod;
+ }
+
+ @Override
+ public float getFloweringModifier(IBeeGenome iBeeGenome, float v) {
+ return floweringMod;
+ }
+
+ @Override
+ public float getGeneticDecay(IBeeGenome iBeeGenome, float v) {
+ return geneticDecayMod;
+ }
+
+ public float getEnergyModifier() {
+ return energyMod;
+ }
+
+ @Override
+ public boolean isSealed() {
+ return sealedMod;
+ }
+
+ @Override
+ public boolean isSelfLighted() {
+ return selfLightedMod;
+ }
+
+ @Override
+ public boolean isSelfUnlighted() {
+ return selfUnlightedMod;
+ }
+
+ @Override
+ public boolean isSunlightSimulated() {
+ return sunlightSimulatedMod;
+ }
+
+ @Override
+ public boolean isHellish() {
+ return getBiome() == BiomeGenBase.hell;
+ }
+
+ public int getMaxSpeed() {
+ return maxspeed;
+ }
+
+ // endregion
+
+ // region IBeeListener
+
+ @Override
+ public void wearOutEquipment(int i) {}
+
+ @Override
+ public void onQueenDeath() {}
+
+ @Override
+ public boolean onPollenRetrieved(IIndividual iIndividual) {
+ return false;
+ }
+
+ // endregion
+
+ static final IBeekeepingLogic dummylogic = new IBeekeepingLogic() {
+
+ @Override
+ public boolean canWork() {
+ return true;
+ }
+
+ @Override
+ public void doWork() {}
+
+ @Override
+ public void syncToClient() {}
+
+ @Override
+ public void syncToClient(EntityPlayerMP entityPlayerMP) {}
+
+ @Override
+ public int getBeeProgressPercent() {
+ return 0;
+ }
+
+ @Override
+ public boolean canDoBeeFX() {
+ return false;
+ }
+
+ @Override
+ public void doBeeFX() {}
+
+ @Override
+ public void readFromNBT(NBTTagCompound nbtTagCompound) {}
+
+ @Override
+ public void writeToNBT(NBTTagCompound nbtTagCompound) {}
+ };
+
+ private static final String POWER_SOURCE_POWER = "GT5U.machines.powersource.power",
+ CANCEL_PROCESS_TOOLTIP = "GT5U.machines.industrialapiary.cancel.tooltip",
+ SPEED_TOOLTIP = "GT5U.machines.industrialapiary.speed.tooltip",
+ SPEED_LOCKED_TOOLTIP = "GT5U.machines.industrialapiary.speedlocked.tooltip",
+ INFO_TOOLTIP = "GT5U.machines.industrialapiary.info.tooltip",
+ INFO_WITH_BEE_TOOLTIP = "GT5U.machines.industrialapiary.infoextended.tooltip",
+ UPGRADE_TOOLTIP = "GT5U.machines.industrialapiary.upgradeslot.tooltip",
+ AUTOQUEEN_TOOLTIP = "GT5U.machines.industrialapiary.autoqueen.tooltip";
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder
+ .widget(
+ new SlotWidget(new ApiarySlot(inventoryHandler, queen))
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_BEE_QUEEN)
+ .setPos(36, 21))
+ .widget(
+ new SlotWidget(new ApiarySlot(inventoryHandler, drone))
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_BEE_DRONE)
+ .setPos(36, 41))
+ .widget(
+ SlotGroup.ofItemHandler(inventoryHandler, 2)
+ .startFromSlot(7)
+ .endAtSlot(10)
+ .slotCreator(i -> new ApiarySlot(inventoryHandler, i))
+ .applyForWidget(
+ widget -> widget.setGTTooltip(() -> mTooltipCache.getData(UPGRADE_TOOLTIP))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .build()
+ .setPos(61, 23));
+
+ super.addUIWidgets(builder, buildContext);
+
+ builder.widget(
+ new ButtonWidget().setOnClick((clickData, widget) -> cancelProcess())
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_CROSS)
+ .setGTTooltip(() -> mTooltipCache.getData(CANCEL_PROCESS_TOOLTIP))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(7, 26)
+ .setSize(18, 18))
+ .widget(
+ new CycleButtonWidget().setToggle(() -> mAutoQueen, x -> mAutoQueen = x)
+ .setTextureGetter(
+ i -> i == 0 ? GT_UITextures.OVERLAY_BUTTON_CROSS : GT_UITextures.OVERLAY_BUTTON_CHECKMARK)
+ .setGTTooltip(() -> mTooltipCache.getData(AUTOQUEEN_TOOLTIP))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(7, 44)
+ .setSize(18, 18)
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_SLOT_BEE_QUEEN))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_INFORMATION)
+ .setGTTooltip(() -> {
+ final String energyreq = GT_Utility.formatNumbers(
+ (int) ((float) GT_MetaTileEntity_IndustrialApiary.baseEUtUsage * getEnergyModifier()
+ * getAcceleration()) + getAdditionalEnergyUsage());
+ final String Temp = StatCollector.translateToLocal(getTemperature().getName());
+ final String Hum = StatCollector.translateToLocal(getHumidity().getName());
+ if (getUsedQueen() != null
+ && BeeManager.beeRoot.isMember(getUsedQueen(), EnumBeeType.QUEEN.ordinal())) {
+ final IBee bee = BeeManager.beeRoot.getMember(getUsedQueen());
+ if (bee.isAnalyzed()) {
+ final IBeeGenome genome = bee.getGenome();
+ final IBeeModifier mod = BeeManager.beeRoot.getBeekeepingMode(getWorld())
+ .getBeeModifier();
+ final float tmod = getTerritoryModifier(null, 1f) * mod.getTerritoryModifier(null, 1f);
+ final int[] t = Arrays.stream(genome.getTerritory())
+ .map(i -> (int) ((float) i * tmod))
+ .toArray();
+ return mTooltipCache.getUncachedTooltipData(
+ INFO_WITH_BEE_TOOLTIP,
+ energyreq,
+ Temp,
+ Hum,
+ genome.getSpeed(),
+ getProductionModifier(null, 0f) + mod.getProductionModifier(null, 0f),
+ Math.round(
+ getFloweringModifier(null, 1f) * genome.getFlowering()
+ * mod.getFloweringModifier(null, 1f)),
+ Math.round(
+ getLifespanModifier(null, null, 1f) * genome.getLifespan()
+ * mod.getLifespanModifier(null, null, 1f)),
+ t[0],
+ t[1],
+ t[2]);
+ }
+ }
+ return mTooltipCache.getUncachedTooltipData(INFO_TOOLTIP, energyreq, Temp, Hum);
+ })
+ .attachSyncer(
+ new FakeSyncWidget.ItemStackSyncer(() -> usedQueen, val -> usedQueen = val),
+ builder,
+ (widget, val) -> widget.notifyTooltipChange())
+ .setPos(163, 5)
+ .setSize(7, 18))
+ .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (clickData.mouseButton == 0) {
+ if (mLockedSpeed) return;
+ if (!clickData.shift) {
+ mSpeed++;
+ if (mSpeed > getMaxSpeed()) mSpeed = 0;
+ } else {
+ mSpeed--;
+ if (mSpeed < 0) mSpeed = getMaxSpeed();
+ }
+ } else if (clickData.mouseButton == 1) {
+ mLockedSpeed = !mLockedSpeed;
+ if (mLockedSpeed) mSpeed = getMaxSpeed();
+ }
+ })
+ .setGTTooltip(
+ () -> mTooltipCache.getUncachedTooltipData(
+ mLockedSpeed ? SPEED_LOCKED_TOOLTIP : SPEED_TOOLTIP,
+ getAcceleration(),
+ GT_Utility.formatNumbers(getAdditionalEnergyUsage())))
+ .attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(() -> mSpeed, val -> mSpeed = val),
+ builder,
+ (widget, val) -> widget.notifyTooltipChange())
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(() -> mLockedSpeed, val -> mLockedSpeed = val),
+ builder,
+ (widget, val) -> widget.notifyTooltipChange())
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setBackground(GT_UITextures.PICTURE_SQUARE_LIGHT_GRAY)
+ .setPos(25, 62)
+ .setSize(18, 18))
+ .widget(
+ new TextWidget("x").setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(30, 63))
+ .widget(
+ TextWidget.dynamicString(() -> String.valueOf(1 << mSpeed))
+ // mSpeed is already synced
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(26, 72));
+ }
+
+ private static final FallbackableUITexture progressBarTexture = GT_UITextures
+ .fallbackableProgressbar("iapiary", GT_UITextures.PROGRESSBAR_ARROW);
+
+ @Override
+ protected BasicUIProperties getUIProperties() {
+ return super.getUIProperties().toBuilder()
+ .progressBarTexture(progressBarTexture)
+ .progressBarPos(new Pos2d(70, 3))
+ .build();
+ }
+
+ @Override
+ protected SlotWidget createItemInputSlot(int index, IDrawable[] backgrounds, Pos2d pos) {
+ // we have custom input slots
+ return null;
+ }
+
+ @Override
+ protected CycleButtonWidget createItemAutoOutputButton() {
+ return (CycleButtonWidget) super.createItemAutoOutputButton().setPos(7, 62);
+ }
+
+ @Override
+ protected CycleButtonWidget createFluidAutoOutputButton() {
+ return null;
+ }
+
+ @Override
+ protected SlotWidget createChargerSlot(int x, int y, String tooltipKey, Object[] tooltipArgs) {
+ return (SlotWidget) super.createChargerSlot(x, y, tooltipKey, tooltipArgs).setPos(79, 62);
+ }
+
+ @Override
+ protected DrawableWidget createErrorStatusArea(ModularWindow.Builder builder, IDrawable picture) {
+ return (DrawableWidget) super.createErrorStatusArea(builder, picture).setPos(100, 62)
+ .attachSyncer(
+ new FakeSyncWidget.ListSyncer<>(() -> Arrays.asList(mErrorStates.toArray(new IErrorState[0])), val -> {
+ mErrorStates.clear();
+ mErrorStates.addAll(new HashSet<>(val));
+ },
+ (buffer, val) -> buffer.writeShort(val.getID()),
+ buffer -> ForestryAPI.errorStateRegistry.getErrorState(buffer.readShort())),
+ builder,
+ (widget, val) -> widget.notifyTooltipChange());
+ }
+
+ @Override
+ protected List<String> getErrorDescriptions() {
+ if (!mErrorStates.isEmpty()) {
+ return mErrorStates.stream()
+ .map(state -> EnumChatFormatting.RED + StatCollector.translateToLocal("for." + state.getDescription()))
+ .collect(Collectors.toList());
+ } else if (mStuttering) {
+ return mTooltipCache
+ .getData(STALLED_STUTTERING_TOOLTIP, StatCollector.translateToLocal(POWER_SOURCE_POWER)).text;
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ @Override
+ protected List<String> getErrorDescriptionsShift() {
+ // Don't show shift tooltip of "Progress was lost"
+ // as this machine does not lose progress
+ return getErrorDescriptions();
+ }
+
+ private int getAcceleration() {
+ return 1 << mSpeed;
+ }
+
+ private int getAdditionalEnergyUsage() {
+ final int accelerated = getAcceleration();
+ int energyusage = 0;
+ if (accelerated == 2) energyusage = 32;
+ else if (accelerated > 2) energyusage = 32 * accelerated << (mSpeed - 2);
+ return energyusage;
+ }
+
+ private class ApiarySlot extends BaseSlot {
+
+ public ApiarySlot(IItemHandlerModifiable inventory, int index) {
+ super(inventory, index);
+ }
+
+ @Override
+ public boolean isItemValidPhantom(ItemStack stack) {
+ return super.isItemValidPhantom(stack) && getBaseMetaTileEntity().isItemValidForSlot(getSlotIndex(), stack);
+ }
+
+ @Override
+ public void onSlotChanged() {
+ super.onSlotChanged();
+ onInventoryUpdate(getSlotIndex());
+ }
+ }
+
+ private static final UIInfo<?, ?> IndustrialApiaryUI = GT_UIInfos.GTTileEntityUIFactory
+ .apply(GT_ModularUIContainer_IndustrialApiary::new);
+
+ private static class GT_ModularUIContainer_IndustrialApiary extends ModularUIContainer {
+
+ public GT_ModularUIContainer_IndustrialApiary(ModularUIContext context, ModularWindow mainWindow) {
+ super(context, mainWindow);
+ }
+
+ private final int playerInventorySlot = 36;
+
+ @Override
+ public ItemStack slotClick(int aSlotNumber, int aMouseclick, int aShifthold, EntityPlayer aPlayer) {
+ if (!(aSlotNumber >= playerInventorySlot + 2 && aSlotNumber < playerInventorySlot + 2 + 4))
+ return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer);
+ if (aShifthold == 5) return null;
+ if (aShifthold != 0) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer);
+ if (aMouseclick > 1) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer);
+ final ItemStack s = aPlayer.inventory.getItemStack();
+ if (s == null) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer);
+ final Slot slot = getSlot(aSlotNumber);
+ final ItemStack slotStack = slot.getStack();
+ if (slotStack != null && !GT_Utility.areStacksEqual(slotStack, s)) return null; // super would replace item
+ if (slotStack == null && !slot.isItemValid(s))
+ return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer);
+ if (!GT_ApiaryUpgrade.isUpgrade(s)) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer);
+ int max = GT_ApiaryUpgrade.getUpgrade(s)
+ .getMaxNumber();
+ if (slotStack != null) max = Math.max(0, max - slotStack.stackSize);
+ max = Math.min(max, s.stackSize);
+ if (max == 0) return null;
+ if (aMouseclick == 1) max = 1;
+ if (max == s.stackSize) return super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer);
+ final ItemStack newStack = s.splitStack(s.stackSize - max);
+ final ItemStack result = super.slotClick(aSlotNumber, aMouseclick, aShifthold, aPlayer);
+ aPlayer.inventory.setItemStack(newStack);
+ return result;
+ }
+
+ @Override
+ public ItemStack transferStackInSlot(EntityPlayer aPlayer, int aSlotIndex) {
+ final Slot s = getSlot(aSlotIndex);
+ if (s == null) return super.transferStackInSlot(aPlayer, aSlotIndex);
+ if (aSlotIndex >= playerInventorySlot) return super.transferStackInSlot(aPlayer, aSlotIndex);
+ final ItemStack aStack = s.getStack();
+ if (aStack == null) return super.transferStackInSlot(aPlayer, aSlotIndex);
+ if (!GT_ApiaryUpgrade.isUpgrade(aStack)) return super.transferStackInSlot(aPlayer, aSlotIndex);
+ for (int i = playerInventorySlot + 2; i < playerInventorySlot + 2 + 4; i++) {
+ final Slot iSlot = getSlot(i);
+ final ItemStack iStack = iSlot.getStack();
+ if (iStack == null) {
+ if (!iSlot.isItemValid(aStack)) continue;
+ } else {
+ if (!GT_Utility.areStacksEqual(aStack, iStack)) continue;
+ }
+ int max = GT_ApiaryUpgrade.getUpgrade(aStack)
+ .getMaxNumber();
+ if (iStack == null) {
+ max = Math.min(max, aStack.stackSize);
+ final ItemStack newstack = aStack.splitStack(max);
+ iSlot.putStack(newstack);
+ } else {
+ max = Math.max(0, max - iStack.stackSize);
+ max = Math.min(max, aStack.stackSize);
+ iStack.stackSize += max;
+ aStack.stackSize -= max;
+ iSlot.onSlotChanged();
+ }
+ if (aStack.stackSize == 0) s.putStack(null);
+ else s.onSlotChanged();
+ break;
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ final NBTTagCompound tag = accessor.getNBTData();
+ if (tag.hasKey("queen")) {
+ currenttip.add(
+ "Current Queen: " + EnumChatFormatting.GREEN + StatCollector.translateToLocal(tag.getString("queen")));
+ }
+ if (tag.hasKey("dummyProduction")) {
+ currenttip.add(
+ "Effective Production: " + EnumChatFormatting.AQUA
+ + String.format("b^0.52 * %.2f", tag.getFloat("dummyProduction")));
+ }
+ if (tag.hasKey("errors")) {
+ NBTTagCompound errorNbt = tag.getCompoundTag("errors");
+ for (int i = 0; i < errorNbt.getInteger("size"); i++) {
+ currenttip.add(
+ "Error: " + EnumChatFormatting.RED
+ + StatCollector.translateToLocal("for." + errorNbt.getString("e" + i)));
+ }
+ }
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ if (usedQueen != null) {
+ IBeeGenome genome = beeRoot.getMember(usedQueen)
+ .getGenome();
+ tag.setString(
+ "queen",
+ genome.getPrimary()
+ .getUnlocalizedName());
+ float prodModifier = getProductionModifier(genome, 0f);
+ prodModifier += beeRoot.getBeekeepingMode(world)
+ .getBeeModifier()
+ .getProductionModifier(genome, prodModifier);
+ float dummyProduction = 100f * Bee.getFinalChance(0.01f, genome.getSpeed(), prodModifier, 8f);
+ tag.setFloat("dummyProduction", dummyProduction);
+ }
+ if (hasErrors()) {
+ NBTTagCompound errorNbt = new NBTTagCompound();
+ int errorCounter = 0;
+ for (IErrorState error : mErrorStates) {
+ errorNbt.setString("e" + errorCounter++, error.getDescription());
+ }
+ errorNbt.setInteger("size", errorCounter);
+ tag.setTag("errors", errorNbt);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Massfabricator.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Massfabricator.java
new file mode 100644
index 0000000000..07e9977429
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Massfabricator.java
@@ -0,0 +1,243 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_MASSFAB_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MASSFAB;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MASSFAB_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MASSFAB_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MASSFAB_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_MASSFAB;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_MASSFAB_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_MASSFAB_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_MASSFAB_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_MASSFAB;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_MASSFAB_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_MASSFAB_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_MASSFAB_GLOW;
+
+import java.util.Arrays;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraftforge.fluids.FluidStack;
+
+import com.google.common.primitives.Ints;
+
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.MachineType;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.objects.overclockdescriber.EUOverclockDescriber;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+public class GT_MetaTileEntity_Massfabricator extends GT_MetaTileEntity_BasicMachine {
+
+ public static int sUUAperUUM = 1;
+ public static int sUUASpeedBonus = 4;
+ public static int sDurationMultiplier = 3215;
+ public static boolean sRequiresUUA = false;
+ public static int BASE_EUT = 256;
+ public static GT_Recipe nonUUARecipe;
+ public static GT_Recipe uuaRecipe;
+
+ public GT_MetaTileEntity_Massfabricator(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 8,
+ MachineType.MATTER_FABRICATOR.tooltipDescription(),
+ 1,
+ 1,
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_MASSFAB_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_MASSFAB_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_MASSFAB),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_MASSFAB_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_MASSFAB_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_MASSFAB_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_MASSFAB),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_MASSFAB_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_MASSFAB_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_MASSFAB_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_MASSFAB),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_MASSFAB_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_MASSFAB_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_MASSFAB_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_MASSFAB),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_MASSFAB_GLOW)
+ .glow()
+ .build()));
+ }
+
+ public GT_MetaTileEntity_Massfabricator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 8, aDescription, aTextures, 1, 1);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Massfabricator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean allowSelectCircuit() {
+ return true;
+ }
+
+ @Override
+ protected OverclockDescriber createOverclockDescriber() {
+ return new MassfabricatorOverclockDescriber(mTier, mAmperage);
+ }
+
+ @Override
+ public void onConfigLoad(GT_Config aConfig) {
+ super.onConfigLoad(aConfig);
+ sDurationMultiplier = aConfig
+ .get(ConfigCategories.machineconfig, "Massfabricator.UUM_Duration_Multiplier", sDurationMultiplier);
+ sUUAperUUM = aConfig.get(ConfigCategories.machineconfig, "Massfabricator.UUA_per_UUM", sUUAperUUM);
+ sUUASpeedBonus = aConfig.get(ConfigCategories.machineconfig, "Massfabricator.UUA_Speed_Bonus", sUUASpeedBonus);
+ sRequiresUUA = aConfig.get(ConfigCategories.machineconfig, "Massfabricator.UUA_Requirement", sRequiresUUA);
+ Materials.UUAmplifier.mChemicalFormula = ("Mass Fabricator Eff/Speed Bonus: x" + sUUASpeedBonus);
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 10;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return V[mTier] * 512L;
+ }
+
+ @Override
+ public int checkRecipe() {
+ FluidStack tFluid = getDrainableStack();
+ if ((tFluid == null) || (tFluid.amount < getCapacity())) {
+ this.mOutputFluid = Materials.UUMatter.getFluid(1L);
+ calculateCustomOverclock(containsUUA(getFillableStack()) ? uuaRecipe : nonUUARecipe);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ if (containsUUA(tFluid = getFillableStack())) {
+ tFluid.amount -= sUUAperUUM;
+ return FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ }
+ return sRequiresUUA || Arrays.stream(getAllInputs())
+ .anyMatch(s -> ItemList.Circuit_Integrated.isStackEqual(s, true, true))
+ ? FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS
+ : FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ }
+ return DID_NOT_FIND_RECIPE;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.massFabFakeRecipes;
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return aFluid.isFluidEqual(Materials.UUAmplifier.getFluid(1L));
+ }
+
+ @Override
+ public int getCapacity() {
+ return Math.max(sUUAperUUM, 1000);
+ }
+
+ private boolean containsUUA(FluidStack aFluid) {
+ return aFluid != null && aFluid.amount >= sUUAperUUM && aFluid.isFluidEqual(Materials.UUAmplifier.getFluid(1L));
+ }
+
+ @ParametersAreNonnullByDefault
+ @MethodsReturnNonnullByDefault
+ protected class MassfabricatorOverclockDescriber extends EUOverclockDescriber {
+
+ protected MassfabricatorOverclockDescriber(byte tier, int amperage) {
+ super(tier, amperage);
+ }
+
+ @Override
+ public GT_OverclockCalculator createCalculator(GT_OverclockCalculator template, GT_Recipe recipe) {
+ return super.createCalculator(template, recipe).setEUt(Ints.saturatedCast(V[tier] * amperage))
+ .setEUtIncreasePerOC(1)
+ .limitOverclockCount(tier - 1)
+ .setOneTickDiscount(false);
+ }
+
+ @Override
+ protected boolean shouldShowAmperage(GT_OverclockCalculator calculator) {
+ return true;
+ }
+
+ @Override
+ protected String getVoltageString(GT_OverclockCalculator calculator) {
+ // standard amperage calculation doesn't work here
+ return decorateWithOverclockLabel(GT_Utility.formatNumbers(V[mTier]) + " EU/t", calculator)
+ + GT_Utility.getTierNameWithParentheses(V[mTier]);
+ }
+
+ @Override
+ protected String getAmperageString(GT_OverclockCalculator calculator) {
+ int amperage = this.amperage;
+ int denominator = 1;
+ for (int i = 1; i < mTier; i++) {
+ amperage >>= 1;
+ if (amperage == 0) {
+ denominator <<= 1;
+ }
+ }
+ if (amperage > 0) {
+ return GT_Utility.formatNumbers(amperage);
+ } else {
+ return "1/" + denominator;
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MicrowaveEnergyTransmitter.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MicrowaveEnergyTransmitter.java
new file mode 100644
index 0000000000..fc6afbd06f
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MicrowaveEnergyTransmitter.java
@@ -0,0 +1,501 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_GLOW;
+
+import java.util.function.Consumer;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Materials;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IEnergyConnected;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_MicrowaveEnergyTransmitter extends GT_MetaTileEntity_BasicTank
+ implements IAddGregtechLogo, IAddUIWidgets {
+
+ private static boolean sInterDimensionalTeleportAllowed = true;
+ private static int mMaxLoss = 50;
+ private static int mMaxLossDistance = 10000;
+ private static boolean mPassiveEnergyUse = true;
+ public int mTargetX = 0;
+ public int mTargetY = 0;
+ public int mTargetZ = 0;
+ public int mTargetD = 0;
+ public boolean mDebug = false;
+ public boolean hasBlock = false;
+ public int tTargetX = 0;
+ public int tTargetY = 0;
+ public int tTargetZ = 0;
+ public int tTargetD = 0;
+ public TileEntity tTile = null;
+
+ public GT_MetaTileEntity_MicrowaveEnergyTransmitter(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 3,
+ new String[] { "Transmits Energy Wirelessly", "Use Nitrogen Plasma", "for Inter-dimensional transmission",
+ "0.004EU Loss per 100 Blocks" });
+ }
+
+ public GT_MetaTileEntity_MicrowaveEnergyTransmitter(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_MicrowaveEnergyTransmitter(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) return true;
+ this.hasBlock = checkForBlock();
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_MicrowaveEnergyTransmitter(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { "Coordinates:",
+ "X: " + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.mTargetX) + EnumChatFormatting.RESET,
+ "Y: " + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.mTargetY) + EnumChatFormatting.RESET,
+ "Z: " + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.mTargetZ) + EnumChatFormatting.RESET,
+ "Dimension: " + EnumChatFormatting.GREEN + this.mTargetD + EnumChatFormatting.RESET,
+ "Dimension Valid: " + (GT_Utility.isRealDimension(this.mTargetD)
+ ? EnumChatFormatting.GREEN + "Yes" + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + "No" + EnumChatFormatting.RESET),
+ "Dimension Registered: " + (DimensionManager.isDimensionRegistered(this.mTargetD)
+ ? EnumChatFormatting.GREEN + "Yes" + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + "No" + EnumChatFormatting.RESET) };
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == ForgeDirection.DOWN) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1] };
+ if (aActive) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1],
+ TextureFactory.of(OVERLAY_TELEPORTER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_TELEPORTER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_TELEPORTER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TELEPORTER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ if (mFluid != null) aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound()));
+ aNBT.setInteger("mTargetX", this.mTargetX);
+ aNBT.setInteger("mTargetY", this.mTargetY);
+ aNBT.setInteger("mTargetZ", this.mTargetZ);
+ aNBT.setInteger("mTargetD", this.mTargetD);
+ aNBT.setBoolean("mDebug", this.mDebug);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid"));
+ this.mTargetX = aNBT.getInteger("mTargetX");
+ this.mTargetY = aNBT.getInteger("mTargetY");
+ this.mTargetZ = aNBT.getInteger("mTargetZ");
+ this.mTargetD = aNBT.getInteger("mTargetD");
+ this.mDebug = aNBT.getBoolean("mDebug");
+ }
+
+ @Override
+ public void onConfigLoad(GT_Config aConfig) {
+ sInterDimensionalTeleportAllowed = aConfig
+ .get(ConfigCategories.machineconfig, "Teleporter.Interdimensional", true);
+ mMaxLoss = Math.max(aConfig.get(ConfigCategories.machineconfig, "MicrowaveTransmitter.MaxLoss", 50), 11);
+ mMaxLossDistance = aConfig.get(ConfigCategories.machineconfig, "MicrowaveTransmitter.MaxLossDistance", 10000);
+ mPassiveEnergyUse = aConfig.get(ConfigCategories.machineconfig, "MicrowaveTransmitter.PassiveEnergy", true);
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if ((this.mTargetX == 0) && (this.mTargetY == 0) && (this.mTargetZ == 0) && (this.mTargetD == 0)) {
+ this.mTargetX = aBaseMetaTileEntity.getXCoord();
+ this.mTargetY = aBaseMetaTileEntity.getYCoord();
+ this.mTargetZ = aBaseMetaTileEntity.getZCoord();
+ this.mTargetD = aBaseMetaTileEntity.getWorld().provider.dimensionId;
+ }
+ this.hasBlock = checkForBlock();
+ }
+ }
+
+ public boolean checkForBlock() {
+ for (byte i = -5; i <= 5; i = (byte) (i + 1)) {
+ for (byte j = -5; j <= 5; j = (byte) (j + 1)) {
+ for (byte k = -5; k <= 5; k = (byte) (k + 1)) {
+ if (getBaseMetaTileEntity().getBlockOffset(i, j, k) == GregTech_API.sBlockMetal5
+ && getBaseMetaTileEntity().getMetaIDOffset(i, j, k) == 8) { // require osmiridium block
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean hasDimensionalTeleportCapability() {
+ return this.mDebug || (sInterDimensionalTeleportAllowed && (this.hasBlock
+ || mFluid != null && mFluid.isFluidEqual(Materials.Nitrogen.getPlasma(1)) && mFluid.amount >= 1000));
+ }
+
+ public boolean isDimensionalTeleportAvailable() {
+ return this.mDebug || (hasDimensionalTeleportCapability() && GT_Utility.isRealDimension(this.mTargetD)
+ && GT_Utility.isRealDimension(getBaseMetaTileEntity().getWorld().provider.dimensionId));
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (mFluid == null) {
+ mFluid = Materials.Nitrogen.getPlasma(0);
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (getBaseMetaTileEntity().isServerSide()) {
+ if (getBaseMetaTileEntity().getTimer() % 100L == 50L) {
+ this.hasBlock = checkForBlock();
+ }
+ if ((getBaseMetaTileEntity().isAllowedToWork()) && (getBaseMetaTileEntity().getRedstone())) {
+ if (getBaseMetaTileEntity().getStoredEU() > (V[mTier] * 16)) {
+ if (mPassiveEnergyUse) {
+ getBaseMetaTileEntity().decreaseStoredEnergyUnits(2L << (mTier - 1), false);
+ }
+ if (hasDimensionalTeleportCapability()
+ && this.mTargetD != getBaseMetaTileEntity().getWorld().provider.dimensionId
+ && mFluid.isFluidEqual(Materials.Nitrogen.getPlasma(1))) {
+ mFluid.amount--;
+ if (mFluid.amount < 1) {
+ mFluid = null;
+ }
+ }
+ if (tTargetD != mTargetD || tTargetX != mTargetX || tTargetY != mTargetY || tTargetZ != mTargetZ) {
+ tTargetD = mTargetD;
+ tTargetX = mTargetX;
+ tTargetY = mTargetY;
+ tTargetZ = mTargetZ;
+ if (this.mTargetD == getBaseMetaTileEntity().getWorld().provider.dimensionId) {
+ tTile = getBaseMetaTileEntity().getTileEntity(this.mTargetX, this.mTargetY, this.mTargetZ);
+ } else {
+ World tWorld = DimensionManager.getWorld(this.mTargetD);
+ if (tWorld != null) {
+ tTile = tWorld.getTileEntity(this.mTargetX, this.mTargetY, this.mTargetZ);
+ }
+ }
+ }
+ int tDistance = distanceCalculation();
+ if (tTile != null) {
+ if (tTile instanceof IEnergyConnected) {
+ long packetSize = V[mTier];
+ if (tTile instanceof IGregTechTileEntity) {
+ IMetaTileEntity mte = ((IGregTechTileEntity) tTile).getMetaTileEntity();
+ if (mte instanceof BaseMetaTileEntity) {
+ packetSize = ((BaseMetaTileEntity) mte).getMaxSafeInput();
+ }
+ }
+ long energyUse = 10;
+ if (mMaxLossDistance != 0) {
+ energyUse = GT_Utility
+ .safeInt(10L + (tDistance * Math.max(mMaxLoss - 10L, 0) / mMaxLossDistance));
+ }
+ energyUse = packetSize + ((V[mTier] * energyUse) / 100);
+ if (getBaseMetaTileEntity().isUniversalEnergyStored(energyUse)) {
+ if (((IEnergyConnected) tTile).injectEnergyUnits(ForgeDirection.UNKNOWN, packetSize, 1)
+ > 0) {
+ getBaseMetaTileEntity().decreaseStoredEnergyUnits(energyUse, false);
+ }
+ }
+ }
+ }
+ }
+ getBaseMetaTileEntity().setActive(true);
+ } else {
+ getBaseMetaTileEntity().setActive(false);
+ }
+ }
+ }
+
+ private int distanceCalculation() {
+ return Math.abs(
+ ((this.mTargetD != getBaseMetaTileEntity().getWorld().provider.dimensionId)
+ && (isDimensionalTeleportAvailable()) ? 100 : 1)
+ * (int) Math.sqrt(
+ Math.pow(getBaseMetaTileEntity().getXCoord() - this.mTargetX, 2.0D)
+ + Math.pow(getBaseMetaTileEntity().getYCoord() - this.mTargetY, 2.0D)
+ + Math.pow(getBaseMetaTileEntity().getZCoord() - this.mTargetZ, 2.0D)));
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return V[mTier] * 16;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return V[mTier] * 256;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxSteamStore() {
+ return maxEUStore();
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 3;
+ }
+
+ @Override
+ public int getStackDisplaySlot() {
+ return 2;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public int getInputSlot() {
+ return 0;
+ }
+
+ @Override
+ public int getOutputSlot() {
+ return 0;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 64000;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return null;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setSize(90, 72)
+ .setPos(43, 4))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "X: " + numberFormat.format(mTargetX))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 8))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "Y: " + numberFormat.format(mTargetY))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 16))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "Z: " + numberFormat.format(mTargetZ))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 24))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "Dim: " + numberFormat.format(mTargetD))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 32))
+ .widget(
+ TextWidget.dynamicString(() -> "Dim Valid: " + (GT_Utility.isRealDimension(mTargetD) ? "Yes" : "No"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> hasDimensionalTeleportCapability())
+ .setPos(46, 40))
+ .widget(new FakeSyncWidget.FluidStackSyncer(() -> mFluid, val -> mFluid = val));
+
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, -512, -64, 7);
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, -16, -1, 25);
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, 16, 1, 133);
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, 512, 64, 151);
+
+ addChangeNumberButton(
+ builder,
+ GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE,
+ val -> mTargetD += val,
+ -16,
+ -8,
+ 7,
+ 58);
+ addChangeNumberButton(
+ builder,
+ GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL,
+ val -> mTargetD += val,
+ -4,
+ -1,
+ 25,
+ 58);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> mTargetD += val, 4, 1, 133, 58);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> mTargetD += val, 16, 8, 151, 58);
+ }
+
+ private void addChangeNumberButtons(ModularWindow.Builder builder, IDrawable overlay, int addNumberShift,
+ int addNumber, int xPos) {
+ addChangeNumberButton(builder, overlay, val -> mTargetX += val, addNumberShift, addNumber, xPos, 4);
+ addChangeNumberButton(builder, overlay, val -> mTargetY += val, addNumberShift, addNumber, xPos, 22);
+ addChangeNumberButton(builder, overlay, val -> mTargetZ += val, addNumberShift, addNumber, xPos, 40);
+ }
+
+ private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer<Integer> setter,
+ int addNumberShift, int addNumber, int xPos, int yPos) {
+ builder.widget(
+ new ButtonWidget()
+ .setOnClick((clickData, widget) -> setter.accept(clickData.shift ? addNumberShift : addNumber))
+ .setBackground(GT_UITextures.BUTTON_STANDARD, overlay)
+ .setSize(18, 18)
+ .setPos(xPos, yPos));
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return new GUITextureSet().setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY);
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(113, 56));
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java
new file mode 100644
index 0000000000..2acaea8050
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java
@@ -0,0 +1,412 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.GT_Values.debugBlockMiner;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+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.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.ChunkPosition;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.recipe.BasicUIProperties;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Block_Ores_Abstract;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+import gregtech.common.misc.GT_DrillingLogicDelegate;
+import gregtech.common.misc.GT_IDrillingLogicDelegateOwner;
+
+public class GT_MetaTileEntity_Miner extends GT_MetaTileEntity_BasicMachine
+ implements GT_IDrillingLogicDelegateOwner, IAddUIWidgets {
+
+ static final int[] RADIUS = { 8, 8, 16, 24, 32 }; // Miner radius per tier
+ static final int[] SPEED = { 160, 160, 80, 40, 20 }; // Miner cycle time per tier
+ static final int[] ENERGY = { 8, 8, 32, 128, 512 }; // Miner energy consumption per tier
+
+ /** Miner configured radius */
+ private int radiusConfig;
+ /** Found ore blocks cache of current drill depth */
+ private final ArrayList<ChunkPosition> oreBlockPositions = new ArrayList<>();
+
+ /** General pipe accessor */
+ private final GT_DrillingLogicDelegate pipe = new GT_DrillingLogicDelegate(this);
+
+ private final int mSpeed;
+
+ public GT_MetaTileEntity_Miner(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 1,
+ new String[] { "Digging ore instead of you", "Use Screwdriver to regulate work area",
+ "Use Soft Mallet to disable and retract the pipe",
+ String.format("%d EU/t, %d sec per block, no stuttering", ENERGY[aTier], SPEED[aTier] / 20),
+ String.format("Maximum work area %dx%d", (RADIUS[aTier] * 2 + 1), (RADIUS[aTier] * 2 + 1)),
+ String.format("Fortune bonus of %d", aTier) },
+ 2,
+ 2,
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_ACTIVE")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_ACTIVE_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_ACTIVE")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_ACTIVE_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_ACTIVE")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_ACTIVE_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_ACTIVE")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_ACTIVE_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_GLOW"))
+ .glow()
+ .build()));
+ mSpeed = SPEED[aTier];
+ radiusConfig = RADIUS[mTier];
+ }
+
+ public GT_MetaTileEntity_Miner(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures, 2, 2);
+ mSpeed = SPEED[aTier];
+ radiusConfig = RADIUS[mTier];
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Miner(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ pipe.findTipDepth();
+ fillOreList(aBaseMetaTileEntity);
+ }
+
+ @Override
+ protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack) //
+ && aStack.getItem() == GT_DrillingLogicDelegate.MINING_PIPE_STACK.getItem();
+ }
+
+ /** Both output slots must be free to work */
+ public boolean hasFreeSpace() {
+ for (int i = getOutputSlot(); i < getOutputSlot() + 2; i++) {
+ if (mInventory[i] != null) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ if (side != getBaseMetaTileEntity().getFrontFacing() && side != mMainFacing) {
+ if (aPlayer.isSneaking()) {
+ if (radiusConfig >= 0) {
+ radiusConfig--;
+ }
+ if (radiusConfig < 0) {
+ radiusConfig = RADIUS[mTier];
+ }
+ } else {
+ if (radiusConfig <= RADIUS[mTier]) {
+ radiusConfig++;
+ }
+ if (radiusConfig > RADIUS[mTier]) {
+ radiusConfig = 0;
+ }
+ }
+
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ String.format(
+ "%s %dx%d",
+ StatCollector.translateToLocal("GT5U.machines.workareaset"),
+ (radiusConfig * 2 + 1),
+ (radiusConfig * 2 + 1)));
+
+ // Rebuild ore cache after change config
+ fillOreList(getBaseMetaTileEntity());
+ }
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+
+ if (!aBaseMetaTileEntity.isServerSide()) {
+ return;
+ }
+
+ // Pipe workaround
+ pipe.onOwnerPostTick(aBaseMetaTileEntity, aTick);
+
+ if (!aBaseMetaTileEntity.isAllowedToWork()) {
+ mMaxProgresstime = 0;
+ if (debugBlockMiner) {
+ GT_Log.out.println("MINER: Disabled");
+ }
+ return;
+ }
+
+ if (!hasFreeSpace()) {
+ mMaxProgresstime = 0;
+ if (debugBlockMiner) {
+ GT_Log.out.println("MINER: No free space");
+ }
+ return;
+ }
+
+ if (!aBaseMetaTileEntity.isUniversalEnergyStored((long) ENERGY[mTier] * (mSpeed - mProgresstime))) {
+ mMaxProgresstime = 0;
+ if (debugBlockMiner) {
+ GT_Log.out.println(
+ "MINER: Not enough energy yet, want " + (ENERGY[mTier] * mSpeed)
+ + " have "
+ + aBaseMetaTileEntity.getUniversalEnergyStored());
+ }
+ return;
+ }
+
+ /* Checks if machine are waiting new mining pipe item */
+ if (!pipe.canContinueDrilling(aTick)) {
+ mMaxProgresstime = 0;
+ return;
+ }
+
+ mMaxProgresstime = mSpeed;
+
+ aBaseMetaTileEntity.decreaseStoredEnergyUnits(ENERGY[mTier], true);
+
+ // Real working only when progress done. TODO some legacy code... refactorings needed
+ if (mProgresstime == mSpeed - 1) {
+ if (pipe.getTipDepth() == 0 || oreBlockPositions.isEmpty()) {
+ boolean descends = pipe.descent(aBaseMetaTileEntity);
+ if (descends) {
+ fillOreList(aBaseMetaTileEntity);
+ }
+ } else {
+ int x;
+ int y;
+ int z;
+ Block oreBlock;
+ boolean isOre;
+ do {
+ ChunkPosition oreBlockPos = oreBlockPositions.remove(0);
+ oreBlock = aBaseMetaTileEntity
+ .getBlockOffset(oreBlockPos.chunkPosX, oreBlockPos.chunkPosY, oreBlockPos.chunkPosZ);
+ x = aBaseMetaTileEntity.getXCoord() + oreBlockPos.chunkPosX;
+ y = aBaseMetaTileEntity.getYCoord() + oreBlockPos.chunkPosY;
+ z = aBaseMetaTileEntity.getZCoord() + oreBlockPos.chunkPosZ;
+ isOre = GT_Utility.isOre(
+ oreBlock,
+ aBaseMetaTileEntity.getWorld()
+ .getBlockMetadata(x, y, z));
+ } // someone else might have removed the block
+ while (!isOre && !oreBlockPositions.isEmpty());
+
+ if (isOre) {
+ pipe.mineBlock(aBaseMetaTileEntity, oreBlock, x, y, z);
+ }
+ }
+ }
+ }
+
+ /** Finds the ores in current drill Y level */
+ private void fillOreList(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (pipe.getTipDepth() == 0) {
+ return;
+ }
+ oreBlockPositions.clear();
+ for (int z = -radiusConfig; z <= radiusConfig; ++z) {
+ for (int x = -radiusConfig; x <= radiusConfig; ++x) {
+ Block block = aBaseMetaTileEntity.getBlockOffset(x, pipe.getTipDepth(), z);
+ int blockMeta = aBaseMetaTileEntity.getMetaIDOffset(x, pipe.getTipDepth(), z);
+
+ // todo some weird checks. refactorings needed
+ if (block instanceof GT_Block_Ores_Abstract) {
+ TileEntity oreEntity = aBaseMetaTileEntity.getTileEntityOffset(x, pipe.getTipDepth(), z);
+ if (oreEntity instanceof GT_TileEntity_Ores && ((GT_TileEntity_Ores) oreEntity).mNatural) {
+ oreBlockPositions.add(new ChunkPosition(x, pipe.getTipDepth(), z));
+ }
+ } else if (GT_Utility.isOre(block, blockMeta)) {
+ oreBlockPositions.add(new ChunkPosition(x, pipe.getTipDepth(), z));
+ }
+ }
+ }
+ }
+
+ /** Pulls (or check can pull) items from an input slots. */
+ @Override
+ public boolean pullInputs(Item item, int count, boolean simulate) {
+ for (int i = 0; i < mInputSlotCount; i++) {
+ ItemStack stack = getInputAt(i);
+ if (stack != null && stack.getItem() == item && stack.stackSize >= count) {
+ if (simulate) {
+ return true;
+ }
+ stack.stackSize -= count;
+ if (stack.stackSize == 0) {
+ mInventory[getInputSlot() + i] = null;
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /** Pushes (or check can push) item to output slots. */
+ @Override
+ public boolean pushOutputs(ItemStack stack, int count, boolean simulate, boolean allowInputSlots) {
+ return allowInputSlots && pushOutput(getInputSlot(), getInputSlot() + mInputSlotCount, stack, count, simulate)
+ || pushOutput(getOutputSlot(), getOutputSlot() + mOutputItems.length, stack, count, simulate);
+ }
+
+ private boolean pushOutput(int startIndex, int endIndex, ItemStack stack, int count, boolean simulate) {
+ for (int i = startIndex; i < endIndex; i++) {
+ ItemStack slot = mInventory[i];
+ if (slot == null || slot.stackSize == 0) {
+ if (!simulate) {
+ ItemStack copy = stack.copy();
+ copy.stackSize = count;
+ mInventory[i] = copy;
+ }
+ return true;
+ } else if (GT_Utility.areStacksEqual(slot, stack) && slot.stackSize <= slot.getMaxStackSize() - count) {
+ if (!simulate) {
+ slot.stackSize += count;
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return Math.max(V[mTier] * 64, 4096);
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ super.setItemNBT(aNBT);
+ aNBT.setInteger("radiusConfig", radiusConfig);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("radiusConfig", radiusConfig);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("radiusConfig")) {
+ int newRadius = aNBT.getInteger("radiusConfig");
+ if (RADIUS[mTier] <= newRadius && newRadius > 0) {
+ radiusConfig = newRadius;
+ }
+ }
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] {
+ String.format(
+ "%s%s%s",
+ EnumChatFormatting.BLUE,
+ StatCollector.translateToLocal("GT5U.machines.miner"),
+ EnumChatFormatting.RESET),
+ String.format(
+ "%s: %s%d%s %s",
+ StatCollector.translateToLocal("GT5U.machines.workarea"),
+ EnumChatFormatting.GREEN,
+ (radiusConfig * 2 + 1),
+ EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.machines.blocks")) };
+ }
+
+ @Override
+ public int getMachineTier() {
+ return mTier;
+ }
+
+ @Override
+ public int getMachineSpeed() {
+ return mSpeed;
+ }
+
+ public GT_DrillingLogicDelegate getPipe() {
+ return pipe;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ private static final FallbackableUITexture progressBarTexture = GT_UITextures
+ .fallbackableProgressbar("miner", GT_UITextures.PROGRESSBAR_CANNER);
+
+ @Override
+ protected BasicUIProperties getUIProperties() {
+ return super.getUIProperties().toBuilder()
+ .progressBarTexture(progressBarTexture)
+ .build();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MonsterRepellent.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MonsterRepellent.java
new file mode 100644
index 0000000000..fde78cfa2e
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MonsterRepellent.java
@@ -0,0 +1,182 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_GLOW;
+
+import java.util.Arrays;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_SpawnEventHandler;
+
+public class GT_MetaTileEntity_MonsterRepellent extends GT_MetaTileEntity_TieredMachineBlock {
+
+ public int mRange = 16;
+
+ public GT_MetaTileEntity_MonsterRepellent(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 0,
+ "Repels nasty Creatures. Range: " + (4 + (12 * aTier))
+ + " unpowered / "
+ + (16 + (48 * aTier))
+ + " powered. Costs "
+ + (1L << (aTier * 2))
+ + " EU/t");
+ }
+
+ public GT_MetaTileEntity_MonsterRepellent(String aName, int aTier, int aInvSlotCount, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_MonsterRepellent(String aName, int aTier, int aInvSlotCount, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_MonsterRepellent(
+ this.mName,
+ this.mTier,
+ this.mInventory.length,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ if (sideDirection != ForgeDirection.UP) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1] };
+ if (active) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1],
+ TextureFactory.of(OVERLAY_TELEPORTER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_TELEPORTER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_TELEPORTER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TELEPORTER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ if (aBaseMetaTileEntity.isAllowedToWork() && aBaseMetaTileEntity.isServerSide()) {
+ int[] tCoords = { aBaseMetaTileEntity.getXCoord(), aBaseMetaTileEntity.getYCoord(),
+ aBaseMetaTileEntity.getZCoord(), aBaseMetaTileEntity.getWorld().provider.dimensionId };
+ if ((aTimer % 600 == 0) && !GT_SpawnEventHandler.mobReps.contains(tCoords)) {
+ GT_SpawnEventHandler.mobReps.add(tCoords);
+ }
+ if (aBaseMetaTileEntity.isUniversalEnergyStored(getMinimumStoredEU())
+ && aBaseMetaTileEntity.decreaseStoredEnergyUnits(1L << (this.mTier * 2), false)) {
+ mRange = GT_SpawnEventHandler.getPoweredRepellentRange(mTier);
+ } else {
+ mRange = GT_SpawnEventHandler.getUnpoweredRepellentRange(mTier);
+ }
+ }
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ int[] tCoords = { aBaseMetaTileEntity.getXCoord(), aBaseMetaTileEntity.getYCoord(),
+ aBaseMetaTileEntity.getZCoord(), aBaseMetaTileEntity.getWorld().provider.dimensionId };
+ GT_SpawnEventHandler.mobReps.add(tCoords);
+ }
+
+ @Override
+ public void onRemoval() {
+ int[] tCoords = { this.getBaseMetaTileEntity()
+ .getXCoord(),
+ this.getBaseMetaTileEntity()
+ .getYCoord(),
+ this.getBaseMetaTileEntity()
+ .getZCoord(),
+ this.getBaseMetaTileEntity()
+ .getWorld().provider.dimensionId };
+ GT_SpawnEventHandler.mobReps.removeIf(coords -> Arrays.equals(coords, tCoords));
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return 512L;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 512L + V[mTier] * 50;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 2;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return null;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {}
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {}
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_PotionBrewer.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_PotionBrewer.java
new file mode 100644
index 0000000000..15150abf67
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_PotionBrewer.java
@@ -0,0 +1,235 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_POTIONBREWER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_POTIONBREWER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_POTIONBREWER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_POTIONBREWER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_POTIONBREWER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_POTIONBREWER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_POTIONBREWER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_POTIONBREWER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_POTIONBREWER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_POTIONBREWER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_POTIONBREWER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_POTIONBREWER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_POTIONBREWER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_POTIONBREWER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_POTIONBREWER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_POTIONBREWER_GLOW;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.MachineType;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_PotionBrewer extends GT_MetaTileEntity_BasicMachine {
+
+ public GT_MetaTileEntity_PotionBrewer(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 1,
+ MachineType.BREWERY.tooltipDescription(),
+ 1,
+ 0,
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_POTIONBREWER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_POTIONBREWER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_POTIONBREWER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_POTIONBREWER_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_POTIONBREWER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_POTIONBREWER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_POTIONBREWER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_POTIONBREWER_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_POTIONBREWER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_POTIONBREWER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_POTIONBREWER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_POTIONBREWER_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_POTIONBREWER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_POTIONBREWER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_POTIONBREWER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_POTIONBREWER_GLOW)
+ .glow()
+ .build()));
+ }
+
+ public GT_MetaTileEntity_PotionBrewer(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures, 1, 0);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_PotionBrewer(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.brewingRecipes;
+ }
+
+ @Override
+ public int checkRecipe() {
+ int tCheck = super.checkRecipe();
+ if (tCheck != DID_NOT_FIND_RECIPE) {
+ return tCheck;
+ }
+
+ calculateOverclockedNess(4, 128);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+
+ FluidStack aFluid = getFillableStack();
+ if ((getDrainableStack() == null) && (aFluid != null) && (getInputAt(0) != null)) {
+ String tInputName = aFluid.getFluid()
+ .getName();
+ if (tInputName.startsWith("potion.")) {
+ tInputName = tInputName.replaceFirst("potion.", "");
+ int tFirstDot = tInputName.indexOf('.') + 1;
+ String tModifier = tFirstDot <= 0 ? "" : tInputName.substring(tFirstDot);
+ if (!tModifier.isEmpty()) {
+ tInputName = tInputName.replaceFirst("." + tModifier, "");
+ }
+ if (GT_Utility.areStacksEqual(new ItemStack(Items.fermented_spider_eye, 1, 0), getInputAt(0))) {
+ if (tInputName.equals("poison")) {
+ return setOutput("potion.damage" + tModifier);
+ }
+ if (tInputName.equals("health")) {
+ return setOutput("potion.damage" + tModifier);
+ }
+ if (tInputName.equals("waterbreathing")) {
+ return setOutput("potion.damage" + tModifier);
+ }
+ if (tInputName.equals("nightvision")) {
+ return setOutput("potion.invisibility" + tModifier);
+ }
+ if (tInputName.equals("fireresistance")) {
+ return setOutput("potion.slowness" + tModifier);
+ }
+ if (tInputName.equals("speed")) {
+ return setOutput("potion.slowness" + tModifier);
+ }
+ if (tInputName.equals("strength")) {
+ return setOutput("potion.weakness" + tModifier);
+ }
+ if (tInputName.equals("regen")) {
+ return setOutput("potion.poison" + tModifier);
+ }
+ return setOutput("potion.weakness");
+ }
+ if (GT_Utility.areStacksEqual(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L),
+ getInputAt(0))) {
+ if (!tModifier.startsWith("strong")) {
+ return setOutput(
+ "potion." + tInputName + ".strong" + (tModifier.isEmpty() ? "" : "." + tModifier));
+ }
+ if (tModifier.startsWith("long")) {
+ return setOutput("potion." + tInputName + tModifier.replaceFirst("long", ""));
+ }
+ return setOutput("potion.thick");
+ }
+ if (GT_Utility.areStacksEqual(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+ getInputAt(0))) {
+ if (!tModifier.startsWith("long")) {
+ return setOutput(
+ "potion." + tInputName + ".long" + (tModifier.isEmpty() ? "" : "." + tModifier));
+ }
+ if (tModifier.startsWith("strong")) {
+ return setOutput("potion." + tInputName + tModifier.replaceFirst("strong", ""));
+ }
+ return setOutput("potion.mundane");
+ }
+ if (GT_Utility.areStacksEqual(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1L),
+ getInputAt(0))) {
+ if (!tInputName.endsWith(".splash")) {
+ return setOutput("potion." + tInputName + ".splash");
+ }
+ return setOutput("potion.mundane");
+ }
+ }
+ }
+ return 0;
+ }
+
+ private int setOutput(String aFluidName) {
+ if (getFillableStack().amount < 750) {
+ return 0;
+ }
+
+ this.mOutputFluid = FluidRegistry.getFluidStack(aFluidName, 750);
+ if (this.mOutputFluid == null) {
+ this.mOutputFluid = FluidRegistry.getFluidStack("potion.mundane", getFillableStack().amount);
+ }
+
+ getInputAt(0).stackSize -= 1;
+ getFillableStack().amount -= 750;
+ return 2;
+ }
+
+ @Override
+ public boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)
+ && getRecipeMap().containsInput(aStack);
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return (aFluid.getFluid()
+ .getName()
+ .startsWith("potion.")) || (super.isFluidInputAllowed(aFluid));
+ }
+
+ @Override
+ public int getCapacity() {
+ return getCapacityForTier(mTier);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Pump.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Pump.java
new file mode 100644
index 0000000000..8cac0c3df7
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Pump.java
@@ -0,0 +1,851 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.GT_Values.debugBlockPump;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.ChunkPosition;
+import net.minecraftforge.common.util.FakePlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.IFluidBlock;
+
+import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.BaseTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.recipe.BasicUIProperties;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.misc.GT_DrillingLogicDelegate;
+
+public class GT_MetaTileEntity_Pump extends GT_MetaTileEntity_BasicMachine {
+
+ private static final ItemStack MINING_PIPE = GT_ModHandler.getIC2Item("miningPipe", 0);
+
+ private static final ItemStack MINING_PIPE_ONE = GT_ModHandler.getIC2Item("miningPipe", 1);
+ private static final Block MINING_PIPE_BLOCK = GT_Utility.getBlockFromStack(MINING_PIPE);
+ private static final Block MINING_PIPE_TIP_BLOCK = GT_Utility
+ .getBlockFromStack(GT_ModHandler.getIC2Item("miningPipeTip", 0));
+
+ public static int getMaxDistanceForTier(int aTier) {
+ return (10 * ((int) Math.pow(1.6D, aTier)));
+ }
+
+ public static long getEuUsagePerTier(int aTier) {
+ return (16 * ((long) Math.pow(4, aTier)));
+ }
+
+ public ArrayDeque<ChunkPosition> mPumpList = new ArrayDeque<>();
+ public boolean wasPumping = false;
+ public int mPumpTimer = 0;
+ public int mPumpCountBelow = 0;
+ public Block mPrimaryPumpedBlock = null;
+ public Block mSecondaryPumpedBlock = null;
+
+ private int radiusConfig; // Pump configured radius
+ private boolean mRetractDone = false;
+
+ private boolean mDisallowRetract = true;
+
+ public GT_MetaTileEntity_Pump(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 1,
+ new String[] { "The best way to empty Oceans!",
+ getEuUsagePerTier(aTier) + " EU/operation, "
+ + GT_Utility.safeInt(160 / 20 / (long) Math.pow(2, aTier))
+ + " sec per bucket, no stuttering",
+ "Maximum pumping area: " + (getMaxDistanceForTier(aTier) * 2 + 1)
+ + "x"
+ + (getMaxDistanceForTier(aTier) * 2 + 1),
+ "Use Screwdriver to regulate pumping area", "Use Soft Mallet to disable and retract the pipe",
+ "Disable the bottom pump to retract the pipe!",
+ "Use Soldering Iron to auto retract the pipe when hitting a rock", },
+ 2,
+ 2,
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_SIDE_ACTIVE")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_SIDE_ACTIVE_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_SIDE")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_SIDE_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_FRONT_ACTIVE")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_FRONT_ACTIVE_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_FRONT")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_FRONT_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_TOP_ACTIVE")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_TOP_ACTIVE_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_TOP")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_TOP_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_BOTTOM_ACTIVE")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_BOTTOM_ACTIVE_GLOW"))
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_BOTTOM")),
+ TextureFactory.builder()
+ .addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/pump/OVERLAY_BOTTOM_GLOW"))
+ .glow()
+ .build()));
+
+ radiusConfig = getMaxDistanceForTier(mTier);
+ }
+
+ public GT_MetaTileEntity_Pump(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures, 2, 2);
+ radiusConfig = getMaxDistanceForTier(mTier);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Pump(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ private static final FallbackableUITexture progressBarTexture = GT_UITextures
+ .fallbackableProgressbar("pump", GT_UITextures.PROGRESSBAR_CANNER);
+
+ @Override
+ protected BasicUIProperties getUIProperties() {
+ return BasicUIProperties.builder()
+ .maxItemInputs(2)
+ .maxItemOutputs(2)
+ .slotOverlays((index, isFluid, isOutput, isSpecial) -> {
+ if (!isFluid && !isOutput && !isSpecial) {
+ return GT_UITextures.OVERLAY_SLOT_MINING_PIPE;
+ } else {
+ return null;
+ }
+ })
+ .maxFluidInputs(0)
+ .maxFluidOutputs(1)
+ .progressBarTexture(progressBarTexture)
+ .build();
+ }
+
+ @Override
+ public int getCapacity() {
+ return getCapacityForTier(mTier);
+ }
+
+ @Override
+ protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)
+ && aStack.getItem() == GT_DrillingLogicDelegate.MINING_PIPE_STACK.getItem();
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ boolean wasPumping = this.wasPumping || !this.mPumpList.isEmpty();
+ if (debugBlockPump) {
+ GT_Log.out.println(
+ "PUMP: NBT:Save - WasPumping - " + wasPumping
+ + " blocks ("
+ + this.mPrimaryPumpedBlock
+ + ", "
+ + this.mSecondaryPumpedBlock
+ + ")");
+ }
+ super.saveNBTData(aNBT);
+ aNBT.setString(
+ "mPumpedBlock1",
+ this.mPrimaryPumpedBlock == null ? "" : Block.blockRegistry.getNameForObject(this.mPrimaryPumpedBlock));
+ aNBT.setString(
+ "mPumpedBlock2",
+ this.mSecondaryPumpedBlock == null ? "" : Block.blockRegistry.getNameForObject(this.mSecondaryPumpedBlock));
+ aNBT.setBoolean("wasPumping", wasPumping);
+ aNBT.setInteger("radiusConfig", radiusConfig);
+ aNBT.setBoolean("mRetractDone", mRetractDone);
+ aNBT.setBoolean("mDisallowRetract", mDisallowRetract);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ this.wasPumping = aNBT.getBoolean("wasPumping");
+ if (aNBT.hasKey("radiusConfig")) this.radiusConfig = aNBT.getInteger("radiusConfig");
+ this.mPrimaryPumpedBlock = Block.getBlockFromName(aNBT.getString("mPumpedBlock1"));
+ this.mSecondaryPumpedBlock = Block.getBlockFromName(aNBT.getString("mPumpedBlock2"));
+ this.mRetractDone = aNBT.getBoolean("mRetractDone");
+ this.mDisallowRetract = aNBT.getBoolean("mDisallowRetract");
+
+ // Transition from old TE which was derived from GT_MetaTileEntity_Hatch
+ if (!aNBT.hasKey("mEUt")) {
+ // Output of old pump always faces up.
+ getBaseMetaTileEntity().setFrontFacing(ForgeDirection.UP);
+
+ // Automatic output on.
+ mFluidTransfer = true;
+
+ // Fluid was stored in the hatch, now needs to go to the output.
+ if (mFluid != null && mFluid.amount > 0) {
+ fluidOutputTank.fill(mFluid, true);
+ mFluid = null;
+ }
+
+ // Move pipes (or other things) from old slots to new ones.
+ if (mInventory[1] != null && mInventory[1].stackSize > 0) {
+ mInventory[getInputSlot() + 1] = mInventory[1];
+ mInventory[1] = null;
+ }
+
+ if (mInventory[0] != null && mInventory[0].stackSize > 0) {
+ mInventory[getInputSlot()] = mInventory[0];
+ mInventory[0] = null;
+ }
+ }
+
+ if (debugBlockPump) {
+ GT_Log.out.println(
+ "PUMP: NBT:Load - WasPumping - " + this.wasPumping
+ + "("
+ + aNBT.getString("mPumpedBlock1")
+ + ") "
+ + this.mPrimaryPumpedBlock);
+ }
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ super.setItemNBT(aNBT);
+ aNBT.setInteger("radiusConfig", radiusConfig);
+ aNBT.setBoolean("mDisallowRetract", mDisallowRetract);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+
+ if (side == getBaseMetaTileEntity().getFrontFacing() || side == mMainFacing) {
+ // Configuring "input from output side allowed".
+ return;
+ }
+
+ int max = getMaxPumpableDistance();
+ if (aPlayer.isSneaking()) {
+ if (radiusConfig >= 0) {
+ radiusConfig--;
+ }
+ if (radiusConfig < 0) radiusConfig = max;
+ } else {
+ if (radiusConfig <= max) {
+ radiusConfig++;
+ }
+ if (radiusConfig > max) radiusConfig = 0;
+ }
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.machines.workareaset") + " "
+ + (radiusConfig * 2 + 1)
+ + "x"
+ + (radiusConfig * 2 + 1)); // TODO Add translation support
+
+ clearQueue(false);
+ }
+
+ @Override
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide,
+ EntityPlayer entityPlayer, float aX, float aY, float aZ) {
+ if (super.onSolderingToolRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ)) return true;
+ mDisallowRetract = !mDisallowRetract;
+ GT_Utility.sendChatToPlayer(
+ entityPlayer,
+ StatCollector.translateToLocal(
+ mDisallowRetract ? "GT5U.machines.autoretract.disabled" : "GT5U.machines.autoretract.enabled"));
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+
+ if (getBaseMetaTileEntity().isServerSide()) {
+ this.mPumpTimer -= 1;
+ if ((getBaseMetaTileEntity() instanceof BaseTileEntity)) {
+ ((BaseTileEntity) getBaseMetaTileEntity()).ignoreUnloadedChunks = false;
+ }
+ this.doTickProfilingInThisTick = true;
+ this.mPumpCountBelow = 0;
+
+ IGregTechTileEntity tTileEntity;
+ for (int i = 1; (i < 21)
+ && ((tTileEntity = getBaseMetaTileEntity()
+ .getIGregTechTileEntityAtSideAndDistance(ForgeDirection.DOWN, i)) != null)
+ && ((tTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_Pump)); i++) {
+ // Apparently someone might stack 21 pumps on top of each other, so let's check for that
+ getBaseMetaTileEntity().setActive(tTileEntity.isActive());
+ this.mPumpCountBelow += 1;
+ // The more pumps we have stacked, the faster the ones below go
+ ((GT_MetaTileEntity_Pump) tTileEntity.getMetaTileEntity()).mPumpTimer -= 1;
+ ((GT_MetaTileEntity_Pump) tTileEntity.getMetaTileEntity()).mProgresstime += 1;
+ }
+ if (debugBlockPump && (this.mPumpCountBelow != 0)) {
+ GT_Log.out.println("PUMP: Detected " + this.mPumpCountBelow + " pumps below this pump.");
+ }
+ if (this.mPumpCountBelow <= 0) {
+ // Only the bottom most pump does anything
+ if (getBaseMetaTileEntity().isAllowedToWork()) {
+ mRetractDone = false;
+ if ((getBaseMetaTileEntity().isUniversalEnergyStored(this.getEuUsagePerAction()))
+ && (fluidOutputTank.getFluidAmount() + 1000 <= fluidOutputTank.getCapacity())) {
+ boolean tMovedOneDown = false;
+ if ((this.mPumpList.isEmpty()) && (getBaseMetaTileEntity().getTimer() % 100L == 0L)) {
+ if (!this.wasPumping) {
+ tMovedOneDown = moveOneDown();
+ if (!tMovedOneDown) {
+ if (canMoveDown(
+ getBaseMetaTileEntity().getXCoord(),
+ Math.max(getYOfPumpHead() - 1, 1),
+ getBaseMetaTileEntity().getZCoord())) {
+ if (debugBlockPump) {
+ GT_Log.out.println("PUMP: No pipe left. Idle for a little longer.");
+ }
+ this.mPumpTimer = 160;
+ } else {
+ getBaseMetaTileEntity().disableWorking();
+ if (debugBlockPump) {
+ GT_Log.out.println("PUMP: Can't move. Retracting in next few ticks");
+ }
+ }
+ } else if (debugBlockPump) {
+ GT_Log.out.println("PUMP: Moved down");
+ }
+ } else if (debugBlockPump) {
+ GT_Log.out.println("PUMP: Was pumping, didn't move down");
+ }
+ }
+ int x = getBaseMetaTileEntity().getXCoord(), z = getBaseMetaTileEntity().getZCoord();
+
+ if (!this.hasValidFluid()) {
+ // We don't have a valid block, let's try to find one
+ int y = getYOfPumpHead();
+
+ if (debugBlockPump && this.mPrimaryPumpedBlock != null) {
+ GT_Log.out.println(
+ "PUMP: Had an invalid pump block. Trying to find a fluid at Y: " + y
+ + " Previous blocks 1: "
+ + this.mPrimaryPumpedBlock
+ + " 2: "
+ + this.mSecondaryPumpedBlock);
+ }
+ // First look down
+ checkForFluidToPump(x, y - 1, z);
+
+ // Then look all around
+ checkForFluidToPump(x, y, z + 1);
+ checkForFluidToPump(x, y, z - 1);
+ checkForFluidToPump(x + 1, y, z);
+ checkForFluidToPump(x - 1, y, z);
+ this.clearQueue(false);
+
+ if (this.hasValidFluid()) {
+ // Don't move down and rebuild the queue if we now have a valid fluid
+ this.wasPumping = true;
+ }
+
+ } else if (getYOfPumpHead() < getBaseMetaTileEntity().getYCoord()) {
+ // We didn't just look for a block, and the pump head is below the pump
+ if ((tMovedOneDown) || this.wasPumping
+ || ((this.mPumpList.isEmpty()) && (getBaseMetaTileEntity().getTimer() % 200L == 100L))
+ || (getBaseMetaTileEntity().getTimer() % 72000L == 100L)) {
+ // Rebuild the list to pump if any of the following conditions are true:
+ // 1) We just moved down
+ // 2) We were previously pumping (and possibly just reloaded)
+ // 3) We have an empty queue and enough time has passed
+ // 4) A long while has passed
+ if (debugBlockPump) {
+ GT_Log.out.println(
+ "PUMP: Rebuilding pump list - Size " + this.mPumpList.size()
+ + " WasPumping: "
+ + this.wasPumping
+ + " Timer "
+ + getBaseMetaTileEntity().getTimer());
+ }
+ int yPump = getBaseMetaTileEntity().getYCoord() - 1, yHead = getYOfPumpHead();
+
+ this.rebuildPumpQueue(x, yPump, z, yHead);
+
+ if (debugBlockPump) {
+ GT_Log.out.println("PUMP: Rebuilt pump list - Size " + this.mPumpList.size());
+ }
+ }
+ if ((!tMovedOneDown) && (this.mPumpTimer <= 0)) {
+ while ((!this.mPumpList.isEmpty())) {
+ ChunkPosition pos = this.mPumpList.pollLast();
+ if (consumeFluid(pos.chunkPosX, pos.chunkPosY, pos.chunkPosZ)) {
+ // Keep trying until we consume something, or the list is empty
+ break;
+ }
+ }
+ this.mPumpTimer = GT_Utility.safeInt(160 / (long) Math.pow(2, this.mTier));
+ this.mPumpTimer = mPumpTimer == 0 ? 1 : mPumpTimer;
+
+ mMaxProgresstime = mPumpTimer;
+ mProgresstime = 0;
+ }
+ } else {
+ // We somehow have a valid fluid, but the head of the pump isn't below the pump. Perhaps
+ // someone broke some pipes
+ // -- Clear the queue and we should try to move down until we can find a valid fluid
+ this.clearQueue(false);
+ }
+ } else if (debugBlockPump) {
+ GT_Log.out.println("PUMP: Not enough energy? Free space?");
+ }
+ } else {
+ mMaxProgresstime = 0;
+
+ if (!mRetractDone && ((aTick % 5) == 0) && canOutput(MINING_PIPE_ONE)) {
+ // try retract if all of these conditions are met
+ // 1. not retracted yet
+ // 2. once per 5 tick
+ // 3. can hold retracted pipe in inventory
+ int tHeadY = getYOfPumpHead();
+ if (tHeadY < this.getBaseMetaTileEntity()
+ .getYCoord()) {
+ final int tXCoord = this.getBaseMetaTileEntity()
+ .getXCoord();
+ final int tZCoord = this.getBaseMetaTileEntity()
+ .getZCoord();
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .setBlockToAir(tXCoord, tHeadY, tZCoord);
+ if (tHeadY < this.getBaseMetaTileEntity()
+ .getYCoord() - 1) {
+ getBaseMetaTileEntity().getWorld()
+ .setBlock(tXCoord, tHeadY + 1, tZCoord, MINING_PIPE_TIP_BLOCK);
+ }
+
+ for (int i = 0; i < mOutputItems.length; ++i) {
+ if (aBaseMetaTileEntity.addStackToSlot(getOutputSlot() + i, MINING_PIPE_ONE.copy())) {
+ break;
+ }
+ }
+
+ if (debugBlockPump) {
+ GT_Log.out.println("PUMP: Retracted one pipe");
+ }
+ } else {
+ mRetractDone = true;
+ if (debugBlockPump) {
+ GT_Log.out.println("PUMP: Retract done");
+ }
+ }
+ }
+ }
+ if (!mDisallowRetract) getBaseMetaTileEntity().setActive(!this.mPumpList.isEmpty());
+ }
+ }
+ }
+
+ private int getMaxPumpableDistance() {
+ return getMaxDistanceForTier(this.mTier);
+ }
+
+ private long getEuUsagePerAction() {
+ return getEuUsagePerTier(this.mTier);
+ }
+
+ private boolean hasValidFluid() {
+ return mPrimaryPumpedBlock != null && mSecondaryPumpedBlock != null;
+ }
+
+ private boolean moveOneDown() {
+ boolean foundPipe = false;
+
+ for (int i = 0; i < mInputSlotCount; i++) {
+ ItemStack stack = getInputAt(i);
+ if (stack != null && GT_Utility.areStacksEqual(stack, MINING_PIPE) && stack.stackSize > 0) {
+ foundPipe = true;
+ break;
+ }
+ }
+
+ if (!foundPipe) {
+ // No mining pipes
+ if (debugBlockPump) {
+ GT_Log.out.println("PUMP: No mining pipes");
+ }
+ return false;
+ }
+
+ int yHead = getYOfPumpHead();
+ if (yHead <= 1) {
+ // Let's not punch through bedrock
+ if (debugBlockPump) {
+ GT_Log.out.println("PUMP: At bottom");
+ }
+ return false;
+ }
+
+ int x = getBaseMetaTileEntity().getXCoord(), z = getBaseMetaTileEntity().getZCoord();
+
+ Block aBlock = getBaseMetaTileEntity().getBlock(x, yHead - 1, z);
+ boolean canReplaceBlock = aBlock.isReplaceable(getBaseMetaTileEntity().getWorld(), x, yHead - 1, z);
+
+ // We specifically allow replacing water even if we can't consume it
+ // (e.g. pump holds a different fluid) to help avoid getting stuck on random water pockets.
+ if (!canReplaceBlock || (isFluid(aBlock) && !consumeFluid(x, yHead - 1, z) && !isWater(aBlock))) {
+ // Either we didn't consume a fluid, or it's a non-replaceable block, or it's water.
+ if (debugBlockPump) {
+ GT_Log.out.println("PUMP: Did not consume fluid, or non-replaceable block found");
+ }
+ return false;
+ }
+ // Try to set the block below us to a tip
+ if (!GT_Utility.setBlockByFakePlayer(
+ getFakePlayer(getBaseMetaTileEntity()),
+ x,
+ yHead - 1,
+ z,
+ MINING_PIPE_TIP_BLOCK,
+ 0,
+ false)) {
+ if (debugBlockPump) {
+ GT_Log.out.println("PUMP: Could not set block below to new tip");
+ }
+ return false;
+ }
+ // And change the previous block to a pipe -- as long as it isn't the pump itself!
+ if (yHead != getBaseMetaTileEntity().getYCoord()) {
+ getBaseMetaTileEntity().getWorld()
+ .setBlock(x, yHead, z, MINING_PIPE_BLOCK);
+ }
+
+ // Remove pipe from inputs.
+ foundPipe = false;
+
+ for (int i = 0; i < mInputSlotCount; i++) {
+ ItemStack stack = getInputAt(i);
+ if (stack != null && GT_Utility.areStacksEqual(stack, MINING_PIPE) && stack.stackSize > 0) {
+ foundPipe = true;
+ stack.stackSize -= 1;
+ if (stack.stackSize == 0) {
+ mInventory[getInputSlot() + i] = null;
+ }
+ break;
+ }
+ }
+
+ if (debugBlockPump) {
+ if (foundPipe) {
+ GT_Log.out.println("PUMP: Using 1 pipe");
+ } else {
+ GT_Log.err.println("PUMP: Lowered pipe but could not find pipe in input");
+ }
+ }
+
+ return true;
+ }
+
+ private int getYOfPumpHead() {
+ // Let's play find the pump head!
+
+ // TODO: Handle pipe|pipe|head|pipe|pipe
+ int y = getBaseMetaTileEntity().getYCoord() - 1, x = getBaseMetaTileEntity().getXCoord(),
+ z = getBaseMetaTileEntity().getZCoord();
+
+ while (y > 0) {
+ Block curBlock = getBaseMetaTileEntity().getBlock(x, y, z);
+ if (curBlock == MINING_PIPE_BLOCK) {
+ y--;
+ } else if (curBlock == MINING_PIPE_TIP_BLOCK) {
+ Block nextBlock = getBaseMetaTileEntity().getBlock(x, y - 1, z);
+ if (nextBlock == MINING_PIPE_BLOCK || nextBlock == MINING_PIPE_TIP_BLOCK) {
+ // We're running into an existing set of pipes -- Turn this block into a pipe and keep going
+ this.clearQueue(true);
+ getBaseMetaTileEntity().getWorld()
+ .setBlock(x, y, z, MINING_PIPE_BLOCK);
+ if (debugBlockPump) {
+ GT_Log.out.println("PUMP: Hit pipes already in place, trying to merge");
+ }
+ }
+ y--;
+
+ } else {
+ break;
+ }
+ }
+
+ if (getBaseMetaTileEntity().getBlock(x, y, z) != MINING_PIPE_TIP_BLOCK) {
+ if (y != getBaseMetaTileEntity().getYCoord() - 1
+ && getBaseMetaTileEntity().getBlock(x, y + 1, z) == MINING_PIPE_BLOCK) {
+ // We're below the pump at the bottom of the pipes, we haven't found a tip; make the previous pipe a
+ // tip!
+ this.clearQueue(true);
+ getBaseMetaTileEntity().getWorld()
+ .setBlock(x, y + 1, z, MINING_PIPE_TIP_BLOCK);
+ if (debugBlockPump) {
+ GT_Log.out.println("PUMP: Did not find a tip at bottom, setting last pipe as tip");
+ }
+ }
+ return y + 1;
+ }
+ return y;
+ }
+
+ private void clearQueue(boolean checkPumping) {
+ if (checkPumping) {
+ this.wasPumping = !this.mPumpList.isEmpty();
+ } else {
+ this.wasPumping = false;
+ }
+ this.mPumpList.clear();
+ }
+
+ private void rebuildPumpQueue(int aX, int yStart, int aZ, int yEnd) {
+ int mDist = this.radiusConfig;
+ doTickProfilingInThisTick = false;
+ ArrayDeque<ChunkPosition> fluidsToSearch = new ArrayDeque<>();
+ ArrayDeque<ChunkPosition> fluidsFound = new ArrayDeque<>();
+ Set<ChunkPosition> checked = new HashSet<>();
+ this.clearQueue(false);
+
+ for (int aY = yStart; this.mPumpList.isEmpty() && aY >= yEnd; aY--) {
+ // Start at the top (presumably the block below the pump), and work our way down to the end (presumably the
+ // location of the pump Head)
+ // and build up a queue of fluids to pump
+ fluidsToSearch.add(new ChunkPosition(aX, aY, aZ));
+
+ while (!fluidsToSearch.isEmpty()) {
+ for (ChunkPosition tPos : fluidsToSearch) {
+ // Look all around
+ if (tPos.chunkPosX < aX + mDist)
+ queueFluid(tPos.chunkPosX + 1, tPos.chunkPosY, tPos.chunkPosZ, fluidsFound, checked);
+ if (tPos.chunkPosX > aX - mDist)
+ queueFluid(tPos.chunkPosX - 1, tPos.chunkPosY, tPos.chunkPosZ, fluidsFound, checked);
+ if (tPos.chunkPosZ < aZ + mDist)
+ queueFluid(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ + 1, fluidsFound, checked);
+ if (tPos.chunkPosZ > aZ - mDist)
+ queueFluid(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ - 1, fluidsFound, checked);
+
+ // And then look up
+ queueFluid(tPos.chunkPosX, tPos.chunkPosY + 1, tPos.chunkPosZ, this.mPumpList, checked);
+ }
+ this.mPumpList.addAll(fluidsFound);
+ fluidsToSearch = fluidsFound;
+ fluidsFound = new ArrayDeque<>();
+ }
+
+ // Make sure we don't have the pipe location in the queue
+ this.mPumpList.remove(new ChunkPosition(aX, aY, aZ));
+ }
+ }
+
+ private boolean queueFluid(int aX, int aY, int aZ, ArrayDeque<ChunkPosition> fluidsFound,
+ Set<ChunkPosition> checked) {
+ // If we haven't already looked at this coordinate set, and it's not already in the list of fluids found, see if
+ // there is
+ // a valid fluid and add it to the fluids found
+ ChunkPosition tCoordinate = new ChunkPosition(aX, aY, aZ);
+ if (checked.add(tCoordinate) && !fluidsFound.contains(tCoordinate)) {
+ Block aBlock = getBaseMetaTileEntity().getBlock(aX, aY, aZ);
+ if ((this.mPrimaryPumpedBlock == aBlock) || (this.mSecondaryPumpedBlock == aBlock)) {
+ fluidsFound.addFirst(tCoordinate);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void checkForFluidToPump(int aX, int aY, int aZ) {
+ // If we don't currently have a valid fluid to pump, try pumping the fluid at the given coordinates
+ if (this.hasValidFluid()) return;
+
+ Block aBlock = getBaseMetaTileEntity().getBlock(aX, aY, aZ);
+ if (aBlock != null) {
+ if (isWater(aBlock)) {
+ this.mPrimaryPumpedBlock = Blocks.water;
+ this.mSecondaryPumpedBlock = Blocks.flowing_water;
+ return;
+ }
+ if (isLava(aBlock)) {
+ this.mPrimaryPumpedBlock = Blocks.lava;
+ this.mSecondaryPumpedBlock = Blocks.flowing_lava;
+ return;
+ }
+ if ((aBlock instanceof IFluidBlock)) {
+ this.mPrimaryPumpedBlock = aBlock;
+ this.mSecondaryPumpedBlock = aBlock;
+ return;
+ }
+ }
+ this.mPrimaryPumpedBlock = null;
+ this.mSecondaryPumpedBlock = null;
+ }
+
+ /** only check if block below can be replaced with pipe tip. pipe stockpile condition is ignored */
+ private boolean canMoveDown(int aX, int aY, int aZ) {
+ if (!GT_Utility.eraseBlockByFakePlayer(getFakePlayer(getBaseMetaTileEntity()), aX, aY, aZ, true)) return false;
+
+ Block aBlock = getBaseMetaTileEntity().getBlock(aX, aY, aZ);
+
+ return aBlock != null && aBlock.isReplaceable(getBaseMetaTileEntity().getWorld(), aX, aY, aZ);
+ }
+
+ private boolean consumeFluid(int aX, int aY, int aZ) {
+ // Try to consume a fluid at a location
+ // Returns true if something was consumed, otherwise false
+ if (!GT_Utility.eraseBlockByFakePlayer(getFakePlayer(getBaseMetaTileEntity()), aX, aY, aZ, true)) return false;
+
+ Block aBlock = getBaseMetaTileEntity().getBlock(aX, aY, aZ);
+ if (!isFluid(aBlock)) {
+ return false;
+ }
+
+ if (aBlock != null && ((this.mPrimaryPumpedBlock == aBlock) || (this.mSecondaryPumpedBlock == aBlock))) {
+ boolean isWaterOrLava = ((this.mPrimaryPumpedBlock == Blocks.water
+ || this.mPrimaryPumpedBlock == Blocks.lava));
+
+ if (isWaterOrLava && getBaseMetaTileEntity().getMetaID(aX, aY, aZ) != 0) {
+ // Water/Lava that isn't a source block - do nothing here, but set the block to air and consume energy
+ // below
+ if (debugBlockPump) {
+ GT_Log.out.println("PUMP: Water/Lava - Not a source block");
+ }
+
+ } else if (getDrainableStack() == null) {
+ // The pump has no internal fluid
+ if (this.mPrimaryPumpedBlock == Blocks.water) setDrainableStack(GT_ModHandler.getWater(1000L));
+ else if (this.mPrimaryPumpedBlock == Blocks.lava) setDrainableStack(GT_ModHandler.getLava(1000L));
+ else {
+ // Not water or lava; try to drain and set to air
+ setDrainableStack(
+ ((IFluidBlock) aBlock).drain(getBaseMetaTileEntity().getWorld(), aX, aY, aZ, true));
+ }
+
+ } else if (GT_ModHandler.isWater(getDrainableStack()) || GT_ModHandler.isLava(getDrainableStack())
+ || getDrainableStack().isFluidEqual(
+ ((IFluidBlock) aBlock).drain(getBaseMetaTileEntity().getWorld(), aX, aY, aZ, false))) {
+ if (!isWaterOrLava) {
+ // Only set Block to Air for non lava/water fluids
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .setBlockToAir(aX, aY, aZ);
+ }
+ getDrainableStack().amount += 1000;
+
+ } else {
+ if (debugBlockPump) {
+ GT_Log.out.println("PUMP: Couldn't consume " + aBlock);
+ }
+ // We didn't do anything
+ return false;
+ }
+
+ getBaseMetaTileEntity().decreaseStoredEnergyUnits(this.getEuUsagePerAction(), true);
+ getBaseMetaTileEntity().getWorld()
+ .setBlock(aX, aY, aZ, Blocks.air, 0, 2);
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean isWater(Block aBlock) {
+ return aBlock == Blocks.water || aBlock == Blocks.flowing_water;
+ }
+
+ private static boolean isLava(Block aBlock) {
+ return aBlock == Blocks.lava || aBlock == Blocks.flowing_lava;
+ }
+
+ private static boolean isFluid(Block aBlock) {
+ return isWater(aBlock) || isLava(aBlock) || aBlock instanceof IFluidBlock;
+ }
+
+ @Override
+ public ArrayList<String> getSpecialDebugInfo(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer,
+ int aLogLevel, ArrayList<String> aList) {
+ aList.addAll(
+ Arrays.asList(
+ EnumChatFormatting.BLUE + StatCollector.translateToLocal("GT5U.machines.pump")
+ + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.machines.workarea") + ": "
+ + EnumChatFormatting.GREEN
+ + (radiusConfig * 2 + 1)
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.machines.blocks"),
+ "Primary pumping fluid: "
+ + (this.mPrimaryPumpedBlock != null ? this.mPrimaryPumpedBlock.getLocalizedName() : "None"),
+ "Secondary pumping fluid: "
+ + (this.mSecondaryPumpedBlock != null ? this.mSecondaryPumpedBlock.getLocalizedName() : "None"),
+ "Pumps below: " + mPumpCountBelow,
+ "Queue size: " + mPumpList.size(),
+ "Pump head at Y: " + getYOfPumpHead(),
+ "Pump timer: " + mPumpTimer,
+ "Meta Entity Timer: " + getBaseMetaTileEntity().getTimer()));
+ return aList;
+ }
+
+ private FakePlayer mFakePlayer = null;
+
+ protected FakePlayer getFakePlayer(IGregTechTileEntity aBaseTile) {
+ if (mFakePlayer == null) mFakePlayer = GT_Utility.getFakePlayer(aBaseTile);
+ mFakePlayer.setWorld(aBaseTile.getWorld());
+ mFakePlayer.setPosition(aBaseTile.getXCoord(), aBaseTile.getYCoord(), aBaseTile.getZCoord());
+ return mFakePlayer;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] {
+ EnumChatFormatting.BLUE + StatCollector.translateToLocal("GT5U.machines.pump") + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.machines.workarea") + ": "
+ + EnumChatFormatting.GREEN
+ + (radiusConfig * 2 + 1)
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.machines.blocks") };
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Replicator.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Replicator.java
new file mode 100644
index 0000000000..a15d5b7f6d
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Replicator.java
@@ -0,0 +1,127 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_REPLICATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_REPLICATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_REPLICATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_REPLICATOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_REPLICATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_REPLICATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_REPLICATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_REPLICATOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_REPLICATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_REPLICATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_REPLICATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_REPLICATOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_REPLICATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_REPLICATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_REPLICATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_REPLICATOR_GLOW;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.MachineType;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_Replicator extends GT_MetaTileEntity_BasicMachine {
+
+ public GT_MetaTileEntity_Replicator(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 1,
+ MachineType.REPLICATOR.tooltipDescription(),
+ 1,
+ 1,
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_REPLICATOR_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_REPLICATOR_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_REPLICATOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_REPLICATOR_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_REPLICATOR_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_REPLICATOR_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_REPLICATOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_REPLICATOR_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_REPLICATOR_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_REPLICATOR_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_REPLICATOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_REPLICATOR_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_REPLICATOR_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_REPLICATOR_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_REPLICATOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_REPLICATOR_GLOW)
+ .glow()
+ .build()));
+ }
+
+ public GT_MetaTileEntity_Replicator(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures, 1, 1);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Replicator(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.replicatorRecipes;
+ }
+
+ @Override
+ protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)
+ && ItemList.Cell_Empty.isStackEqual(aStack);
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return aFluid.isFluidEqual(Materials.UUMatter.getFluid(1L));
+ }
+
+ @Override
+ public int getCapacity() {
+ return 3000;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_RockBreaker.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_RockBreaker.java
new file mode 100644
index 0000000000..e632f4eeda
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_RockBreaker.java
@@ -0,0 +1,169 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_GLOW;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.MachineType;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_RockBreaker extends GT_MetaTileEntity_BasicMachine {
+
+ public GT_MetaTileEntity_RockBreaker(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 1,
+ MachineType.ROCKBREAKER.tooltipDescription(),
+ 1,
+ 1,
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_ROCK_BREAKER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_ROCK_BREAKER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_ROCK_BREAKER_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ROCK_BREAKER_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_ROCK_BREAKER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_ROCK_BREAKER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_ROCK_BREAKER_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_ROCK_BREAKER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_ROCK_BREAKER_GLOW)
+ .glow()
+ .build()));
+ }
+
+ public GT_MetaTileEntity_RockBreaker(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures, 1, 1);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_RockBreaker(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.rockBreakerFakeRecipes;
+ }
+
+ @Override
+ protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)
+ && getRecipeMap().containsInput(aStack);
+ }
+
+ @Override
+ public boolean allowSelectCircuit() {
+ return true;
+ }
+
+ @Override
+ public int checkRecipe() {
+ IGregTechTileEntity aBaseMetaTileEntity = getBaseMetaTileEntity();
+ if ((aBaseMetaTileEntity.getBlockOffset(0, 0, 1) == Blocks.water)
+ || (aBaseMetaTileEntity.getBlockOffset(0, 0, -1) == Blocks.water)
+ || (aBaseMetaTileEntity.getBlockOffset(-1, 0, 0) == Blocks.water)
+ || (aBaseMetaTileEntity.getBlockOffset(1, 0, 0) == Blocks.water)) {
+ ItemStack tOutput = null;
+ if (aBaseMetaTileEntity.getBlockOffset(0, 1, 0) == Blocks.lava) {
+ tOutput = new ItemStack(Blocks.stone, 1);
+ } else if ((aBaseMetaTileEntity.getBlockOffset(0, 0, 1) == Blocks.lava)
+ || (aBaseMetaTileEntity.getBlockOffset(0, 0, -1) == Blocks.lava)
+ || (aBaseMetaTileEntity.getBlockOffset(-1, 0, 0) == Blocks.lava)
+ || (aBaseMetaTileEntity.getBlockOffset(1, 0, 0) == Blocks.lava)) {
+ tOutput = new ItemStack(Blocks.cobblestone, 1);
+ }
+ if (tOutput != null) {
+ if (GT_Utility.areStacksEqual(getStackInSlot(getCircuitSlot()), GT_Utility.getIntegratedCircuit(1))) {
+ if (GT_Utility.areStacksEqual(
+ getInputAt(0),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L))) {
+ tOutput = new ItemStack(Blocks.obsidian, 1);
+ if (canOutput(tOutput)) {
+ getInputAt(0).stackSize -= 1;
+ calculateOverclockedNess(30, 128);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ this.mOutputItems[0] = tOutput;
+ return 2;
+ }
+ }
+ } else if (canOutput(tOutput)) {
+ calculateOverclockedNess(30, 16);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ this.mOutputItems[0] = tOutput;
+ return 2;
+ }
+ }
+ }
+ return 0;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Scanner.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Scanner.java
new file mode 100644
index 0000000000..ba00be67f8
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Scanner.java
@@ -0,0 +1,425 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.GT_Values.D1;
+import static gregtech.api.enums.Mods.GalacticraftCore;
+import static gregtech.api.enums.Mods.GalacticraftMars;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_SCANNER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_SCANNER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_SCANNER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_SCANNER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_SCANNER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_SCANNER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_SCANNER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_SCANNER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_SCANNER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_SCANNER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_SCANNER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_SCANNER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_SCANNER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_SCANNER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_SCANNER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_SCANNER_GLOW;
+import static gregtech.api.recipe.RecipeMaps.scannerFakeRecipes;
+
+import java.util.Objects;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IIndividual;
+import gregtech.GT_Mod;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.MachineType;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_AssemblyLineUtils;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.items.behaviors.Behaviour_DataOrb;
+
+public class GT_MetaTileEntity_Scanner extends GT_MetaTileEntity_BasicMachine {
+
+ public GT_MetaTileEntity_Scanner(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 1,
+ MachineType.SCANNER.tooltipDescription(),
+ 1,
+ 1,
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_SCANNER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_SCANNER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_SIDE_SCANNER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_SCANNER_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_SCANNER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_SCANNER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_FRONT_SCANNER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_SCANNER_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_SCANNER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_SCANNER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_SCANNER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_SCANNER_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_SCANNER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_SCANNER_ACTIVE_GLOW)
+ .glow()
+ .build()),
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_SCANNER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_SCANNER_GLOW)
+ .glow()
+ .build()));
+ }
+
+ public GT_MetaTileEntity_Scanner(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures, 1, 1);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Scanner(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public int checkRecipe() {
+ ItemStack aStack = getInputAt(0);
+ if (getOutputAt(0) != null) {
+ this.mOutputBlocked += 1;
+ } else if ((GT_Utility.isStackValid(aStack)) && (aStack.stackSize > 0)) {
+ if ((getFillableStack() != null) && (getFillableStack().containsFluid(Materials.Honey.getFluid(100L)))) {
+ try {
+ IIndividual tIndividual = AlleleManager.alleleRegistry.getIndividual(aStack);
+ if (tIndividual != null) {
+ if (tIndividual.analyze()) {
+ getFillableStack().amount -= 100;
+ this.mOutputItems[0] = GT_Utility.copyOrNull(aStack);
+ aStack.stackSize = 0;
+ NBTTagCompound tNBT = new NBTTagCompound();
+ tIndividual.writeToNBT(tNBT);
+ this.mOutputItems[0].setTagCompound(tNBT);
+ calculateOverclockedNess(2, 500);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ return 2;
+ }
+ this.mOutputItems[0] = GT_Utility.copyOrNull(aStack);
+ aStack.stackSize = 0;
+ this.mMaxProgresstime = 1;
+ this.mEUt = 1;
+ return 2;
+ }
+ } catch (Throwable e) {
+ if (D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+ if (ItemList.IC2_Crop_Seeds.isStackEqual(aStack, true, true)) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ }
+ if (tNBT.getByte("scan") < 4) {
+ tNBT.setByte("scan", (byte) 4);
+ calculateOverclockedNess(8, 160);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ } else {
+ this.mMaxProgresstime = 1;
+ this.mEUt = 1;
+ }
+ aStack.stackSize -= 1;
+ this.mOutputItems[0] = GT_Utility.copyAmount(1, aStack);
+ assert this.mOutputItems[0] != null;
+ this.mOutputItems[0].setTagCompound(tNBT);
+ return 2;
+ }
+ if (ItemList.Tool_DataOrb.isStackEqual(getSpecialSlot(), false, true)) {
+ if (ItemList.Tool_DataOrb.isStackEqual(aStack, false, true)) {
+ aStack.stackSize -= 1;
+ this.mOutputItems[0] = GT_Utility.copyAmount(1, getSpecialSlot());
+ calculateOverclockedNess(30, 512);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ return 2;
+ }
+ ItemData tData = GT_OreDictUnificator.getAssociation(aStack);
+ if ((tData != null) && ((tData.mPrefix == OrePrefixes.dust) || (tData.mPrefix == OrePrefixes.cell))
+ && (tData.mMaterial.mMaterial.mElement != null)
+ && (!tData.mMaterial.mMaterial.mElement.mIsIsotope)
+ && (tData.mMaterial.mMaterial != Materials.Magic)
+ && (tData.mMaterial.mMaterial.getMass() > 0L)) {
+ getSpecialSlot().stackSize -= 1;
+ aStack.stackSize -= 1;
+
+ this.mOutputItems[0] = ItemList.Tool_DataOrb.get(1L);
+ Behaviour_DataOrb.setDataTitle(this.mOutputItems[0], "Elemental-Scan");
+ Behaviour_DataOrb.setDataName(this.mOutputItems[0], tData.mMaterial.mMaterial.mElement.name());
+ calculateOverclockedNess(30, GT_Utility.safeInt(tData.mMaterial.mMaterial.getMass() * 8192L));
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ return 2;
+ }
+ }
+ if (ItemList.Tool_DataStick.isStackEqual(getSpecialSlot(), false, true)) {
+ if (ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) {
+ aStack.stackSize -= 1;
+ this.mOutputItems[0] = GT_Utility.copyAmount(1, getSpecialSlot());
+ calculateOverclockedNess(30, 128);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ return 2;
+ }
+ if (aStack.getItem() == Items.written_book) {
+ getSpecialSlot().stackSize -= 1;
+ aStack.stackSize -= 1;
+
+ this.mOutputItems[0] = GT_Utility.copyAmount(1, getSpecialSlot());
+ assert this.mOutputItems[0] != null;
+ this.mOutputItems[0].setTagCompound(aStack.getTagCompound());
+ calculateOverclockedNess(30, 128);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ return 2;
+ }
+ if (aStack.getItem() == Items.filled_map) {
+ getSpecialSlot().stackSize -= 1;
+ aStack.stackSize -= 1;
+
+ this.mOutputItems[0] = GT_Utility.copyAmount(1, getSpecialSlot());
+ assert this.mOutputItems[0] != null;
+ this.mOutputItems[0].setTagCompound(
+ GT_Utility
+ .getNBTContainingShort(new NBTTagCompound(), "map_id", (short) aStack.getItemDamage()));
+ calculateOverclockedNess(30, 128);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ return 2;
+ }
+
+ if ((aStack.getItem()
+ .getUnlocalizedName()
+ .contains("Schematic")
+ || aStack.getItem()
+ .getUnlocalizedName()
+ .contains("schematic"))
+ && !aStack.getItem()
+ .getUnlocalizedName()
+ .contains("Schematics")) {
+ if (mTier < 3) return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ String sTier = "";
+
+ int stackItemID = Item.getIdFromItem(aStack.getItem());
+ int stackItemDamage = aStack.getItemDamage();
+ if (stackItemID == Item.getIdFromItem(
+ Objects.requireNonNull(GT_ModHandler.getModItem(GalacticraftCore.ID, "item.schematic", 1L, 0))
+ .getItem())) {
+ if (stackItemDamage == 0 && aStack.toString()
+ .equals(
+ Objects
+ .requireNonNull(
+ GT_ModHandler.getModItem(GalacticraftCore.ID, "item.schematic", 1L, 0))
+ .copy()
+ .toString()))
+ sTier = "100";
+ else if (stackItemDamage == 1 && aStack.toString()
+ .equals(
+ Objects
+ .requireNonNull(
+ GT_ModHandler.getModItem(GalacticraftCore.ID, "item.schematic", 1L, 1))
+ .copy()
+ .toString()))
+ sTier = "2";
+ } else {
+ if (stackItemID == Item.getIdFromItem(
+ Objects
+ .requireNonNull(GT_ModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1L, 0))
+ .getItem())) {
+ if (stackItemDamage == 0 && aStack.toString()
+ .equals(
+ Objects
+ .requireNonNull(
+ GT_ModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1L, 0))
+ .copy()
+ .toString()))
+ sTier = "3";
+ else if (stackItemDamage == 1 && aStack.toString()
+ .equals(
+ Objects
+ .requireNonNull(
+ GT_ModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1L, 1))
+ .copy()
+ .toString()))
+ sTier = "101";
+ else if (stackItemDamage == 2 && aStack.toString()
+ .equals(
+ Objects
+ .requireNonNull(
+ GT_ModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1L, 2))
+ .copy()
+ .toString()))
+ sTier = "102";
+ } else if (aStack.getUnlocalizedName()
+ .matches(".*\\d+.*"))
+ sTier = aStack.getUnlocalizedName()
+ .split("(?<=\\D)(?=\\d)")[1].substring(0, 1);
+ else sTier = "1";
+ }
+
+ getSpecialSlot().stackSize -= 1;
+ aStack.stackSize -= 1;
+
+ this.mOutputItems[0] = GT_Utility.copyAmount(1, getSpecialSlot());
+ assert this.mOutputItems[0] != null;
+ this.mOutputItems[0].setTagCompound(
+ GT_Utility.getNBTContainingShort(new NBTTagCompound(), "rocket_tier", Short.parseShort(sTier)));
+
+ calculateOverclockedNess(480, 36000);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ return 2;
+ }
+ }
+ if (getSpecialSlot() == null && ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) {
+ if (GT_Utility.ItemNBT.getBookTitle(aStack)
+ .equals("Raw Prospection Data")) {
+ GT_Utility.ItemNBT.setBookTitle(aStack, "Analyzed Prospection Data");
+ GT_Utility.ItemNBT.convertProspectionData(aStack);
+ aStack.stackSize -= 1;
+
+ this.mOutputItems[0] = GT_Utility.copyAmount(1, aStack);
+ calculateOverclockedNess(30, 1000);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ return 2;
+ }
+ }
+ if (ItemList.Tool_DataStick.isStackEqual(getSpecialSlot(), false, true)) {
+ for (GT_Recipe.GT_Recipe_AssemblyLine tRecipe : GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes) {
+ if (GT_Utility.areStacksEqual(tRecipe.mResearchItem, aStack, true)) {
+ boolean failScanner = true;
+ for (GT_Recipe scannerRecipe : scannerFakeRecipes.getAllRecipes()) {
+ if (GT_Utility.areStacksEqual(scannerRecipe.mInputs[0], aStack, true)) {
+ failScanner = false;
+ break;
+ }
+ }
+ if (failScanner) {
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ }
+
+ this.mOutputItems[0] = GT_Utility.copyAmount(1, getSpecialSlot());
+
+ // Use Assline Utils
+ if (GT_AssemblyLineUtils.setAssemblyLineRecipeOnDataStick(this.mOutputItems[0], tRecipe)) {
+ aStack.stackSize -= 1;
+ calculateOverclockedNess(30, tRecipe.mResearchTime);
+ // In case recipe is too OP for that machine
+ if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ getSpecialSlot().stackSize -= 1;
+ return 2;
+ }
+ }
+ }
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (mProgresstime >= (mMaxProgresstime - 1)) {
+ if ((this.mOutputItems[0] != null) && (this.mOutputItems[0].getUnlocalizedName()
+ .equals("gt.metaitem.01.32707"))) {
+ GT_Mod.achievements.issueAchievement(
+ aBaseMetaTileEntity.getWorld()
+ .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()),
+ "scanning");
+ }
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return scannerFakeRecipes;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 1000;
+ }
+
+ @Override
+ protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)
+ && getRecipeMap().containsInput(aStack);
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_MAGNETIZER_LOOP, 10, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startProcess() {
+ sendLoopStart((byte) 1);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Teleporter.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Teleporter.java
new file mode 100644
index 0000000000..0666c55ac4
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Teleporter.java
@@ -0,0 +1,609 @@
+package gregtech.common.tileentities.machines.basic;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_SIDES;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TELEPORTER_SIDES_GLOW;
+
+import java.util.List;
+import java.util.function.Consumer;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityHanging;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.boss.EntityDragonPart;
+import net.minecraft.entity.effect.EntityWeatherEffect;
+import net.minecraft.entity.item.EntityBoat;
+import net.minecraft.entity.item.EntityEnderCrystal;
+import net.minecraft.entity.item.EntityEnderEye;
+import net.minecraft.entity.item.EntityFireworkRocket;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.item.EntityMinecart;
+import net.minecraft.entity.item.EntityTNTPrimed;
+import net.minecraft.entity.item.EntityXPOrb;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.entity.projectile.EntityFireball;
+import net.minecraft.entity.projectile.EntityFishHook;
+import net.minecraft.entity.projectile.EntityThrowable;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Teleporter extends GT_MetaTileEntity_BasicTank
+ implements IAddGregtechLogo, IAddUIWidgets {
+
+ private static boolean sInterDimensionalTeleportAllowed = true;
+ private static int sPassiveEnergyDrain = 2048;
+ private static int sPowerMultiplyer = 100;
+ private static double sFPowerMultiplyer = 1.0;
+ public int mTargetX = 0;
+ public int mTargetY = 0;
+ public int mTargetZ = 0;
+ public int mTargetD = Integer.MIN_VALUE;
+ public boolean mDebug = false;
+
+ public GT_MetaTileEntity_Teleporter(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 3,
+ new String[] { "Teleport long distances with this little device.", "Use a Dragon Egg or Nitrogen Plasma",
+ "for Inter-dimensional transmission" });
+ }
+
+ public GT_MetaTileEntity_Teleporter(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Teleporter(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ private static float calculateWeight(Entity aEntity) {
+ if ((aEntity instanceof EntityFishHook)) {
+ return -1.0F;
+ }
+ if ((aEntity instanceof EntityDragonPart)) {
+ return -1.0F;
+ }
+ if ((aEntity instanceof EntityWeatherEffect)) {
+ return -1.0F;
+ }
+ if ((aEntity instanceof EntityPlayer tPlayer)) {
+ int tCount = 64;
+ for (int i = 0; i < 36; i++) {
+ if (tPlayer.inventory.getStackInSlot(i) != null) {
+ tCount += (tPlayer.inventory.getStackInSlot(i)
+ .getMaxStackSize() > 1 ? tPlayer.inventory.getStackInSlot(i).stackSize : 64);
+ }
+ }
+ for (int i = 0; i < 4; i++) {
+ if (tPlayer.inventory.armorInventory[i] != null) {
+ tCount += 256;
+ }
+ }
+ return Math.min(5.0F, tCount / 666.6F);
+ }
+ if (GT_Utility.getClassName(aEntity)
+ .equals("EntityItnt")) {
+ return 5.0F;
+ }
+ if (GT_Utility.getClassName(aEntity)
+ .equals("EntityNuke")) {
+ return 50.0F;
+ }
+ if ((aEntity instanceof EntityArrow)) {
+ return 0.001F;
+ }
+ if ((aEntity instanceof EntityBoat)) {
+ return 0.1F;
+ }
+ if ((aEntity instanceof EntityEnderCrystal)) {
+ return 2.0F;
+ }
+ if ((aEntity instanceof EntityEnderEye)) {
+ return 0.001F;
+ }
+ if ((aEntity instanceof EntityFireball)) {
+ return 0.001F;
+ }
+ if ((aEntity instanceof EntityFireworkRocket)) {
+ return 0.001F;
+ }
+ if ((aEntity instanceof EntityHanging)) {
+ return 0.005F;
+ }
+ if ((aEntity instanceof EntityItem)) {
+ return 0.001F;
+ }
+ if ((aEntity instanceof EntityLiving)) {
+ return 0.5F;
+ }
+ if ((aEntity instanceof EntityMinecart)) {
+ return 0.1F;
+ }
+ if ((aEntity instanceof EntityThrowable)) {
+ return 0.001F;
+ }
+ if ((aEntity instanceof EntityTNTPrimed)) {
+ return 5.0F;
+ }
+ if ((aEntity instanceof EntityXPOrb)) {
+ return 0.001F;
+ }
+ return -1.0F;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) return true;
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Teleporter(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] { "Coordinates:",
+ "X: " + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.mTargetX) + EnumChatFormatting.RESET,
+ "Y: " + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.mTargetY) + EnumChatFormatting.RESET,
+ "Z: " + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(this.mTargetZ) + EnumChatFormatting.RESET,
+ "Dimension: " + EnumChatFormatting.GREEN + this.mTargetD + EnumChatFormatting.RESET,
+ "Dimension Valid: " + (GT_Utility.isRealDimension(this.mTargetD)
+ ? EnumChatFormatting.GREEN + "Yes" + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + "No" + EnumChatFormatting.RESET),
+ "Dimension Registered: " + (DimensionManager.isDimensionRegistered(this.mTargetD)
+ ? EnumChatFormatting.GREEN + "Yes" + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + "No" + EnumChatFormatting.RESET) };
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side != this.getBaseMetaTileEntity()
+ .getFrontFacing())
+ return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_TELEPORTER_SIDES),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TELEPORTER_SIDES_GLOW)
+ .glow()
+ .build() };
+ if (aActive) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1],
+ TextureFactory.of(OVERLAY_TELEPORTER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_TELEPORTER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_TELEPORTER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TELEPORTER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ if (mFluid != null) aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound()));
+ aNBT.setInteger("mTargetX", this.mTargetX);
+ aNBT.setInteger("mTargetY", this.mTargetY);
+ aNBT.setInteger("mTargetZ", this.mTargetZ);
+ aNBT.setInteger("mTargetD", this.mTargetD);
+ aNBT.setBoolean("mDebug", this.mDebug);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ mFluid = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid"));
+ this.mTargetX = aNBT.getInteger("mTargetX");
+ this.mTargetY = aNBT.getInteger("mTargetY");
+ this.mTargetZ = aNBT.getInteger("mTargetZ");
+ this.mTargetD = aNBT.getInteger("mTargetD");
+ this.mDebug = aNBT.getBoolean("mDebug");
+ }
+
+ @Override
+ public void onConfigLoad(GT_Config aConfig) {
+ sInterDimensionalTeleportAllowed = aConfig
+ .get(ConfigCategories.machineconfig, "Teleporter.Interdimensional", true);
+ sPassiveEnergyDrain = aConfig
+ .get(ConfigCategories.machineconfig, "Teleporter.PassiveDrain", sPassiveEnergyDrain);
+ sPowerMultiplyer = aConfig.get(ConfigCategories.machineconfig, "Teleporter.PowerMultipler", sPowerMultiplyer);
+ sFPowerMultiplyer = sPowerMultiplyer / 100.0;
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (getBaseMetaTileEntity().isServerSide()) {
+ if ((this.mTargetX == 0) && (this.mTargetY == 0)
+ && (this.mTargetZ == 0)
+ && (this.mTargetD == Integer.MIN_VALUE)) {
+ this.mTargetX = aBaseMetaTileEntity.getXCoord();
+ this.mTargetY = aBaseMetaTileEntity.getYCoord();
+ this.mTargetZ = aBaseMetaTileEntity.getZCoord();
+ this.mTargetD = aBaseMetaTileEntity.getWorld().provider.dimensionId;
+ }
+ }
+ }
+
+ public boolean hasDimensionalTeleportCapability() {
+ return this.mDebug || sInterDimensionalTeleportAllowed;
+ }
+
+ public boolean isDimensionalTeleportAvailable() {
+ return this.mDebug || (hasDimensionalTeleportCapability() && GT_Utility.isRealDimension(this.mTargetD)
+ && GT_Utility.isRealDimension(getBaseMetaTileEntity().getWorld().provider.dimensionId));
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+
+ if (mFluid != null) { // Was if null -> Materials.Nitrogen.getPlasma(0);
+ mFluid = null;
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (getBaseMetaTileEntity().isServerSide()) {
+ if ((getBaseMetaTileEntity().isAllowedToWork()) && (getBaseMetaTileEntity().getRedstone())) {
+ if (getBaseMetaTileEntity().decreaseStoredEnergyUnits(sPassiveEnergyDrain, false)) {
+ int tDistance = distanceCalculation();
+ if (mInventory[0] != null) {
+ TileEntity tTile = null;
+ if (this.mTargetD == getBaseMetaTileEntity().getWorld().provider.dimensionId) {
+ tTile = getBaseMetaTileEntity().getTileEntity(this.mTargetX, this.mTargetY, this.mTargetZ);
+ } else {
+ World tWorld = DimensionManager.getWorld(this.mTargetD);
+ if (tWorld != null) {
+ tTile = tWorld.getTileEntity(this.mTargetX, this.mTargetY, this.mTargetZ);
+ }
+ }
+ if (tTile instanceof IInventory) {
+ int tStacksize = mInventory[0].stackSize;
+ GT_Utility.moveOneItemStack(
+ this,
+ tTile,
+ ForgeDirection.DOWN,
+ ForgeDirection.DOWN,
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1);
+ if (mInventory[0] == null || mInventory[0].stackSize < tStacksize) {
+ getBaseMetaTileEntity().decreaseStoredEnergyUnits(
+ (long) (Math.pow(tDistance, 1.5) * tDistance
+ * (tStacksize - (mInventory[0] == null ? 0 : mInventory[0].stackSize))
+ * sFPowerMultiplyer),
+ false);
+ }
+ }
+ }
+ List<Entity> entities_in_box = getBaseMetaTileEntity().getWorld()
+ .getEntitiesWithinAABB(
+ Entity.class,
+ AxisAlignedBB.getBoundingBox(
+ getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 2) - 1,
+ getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 2) - 1,
+ getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 2) - 1,
+ getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 2) + 2,
+ getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 2) + 2,
+ getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 2) + 2));
+
+ for (Object tObject : entities_in_box) {
+ if (((tObject instanceof Entity tEntity)) && (!((Entity) tObject).isDead)) {
+ if (getBaseMetaTileEntity().decreaseStoredEnergyUnits(
+ (long) (Math.pow(tDistance, 1.5) * calculateWeight(tEntity) * sFPowerMultiplyer),
+ false)) {
+
+ if (tEntity.ridingEntity != null) {
+ tEntity.mountEntity(null);
+ }
+ if (tEntity.riddenByEntity != null) {
+ tEntity.riddenByEntity.mountEntity(null);
+ }
+ if ((this.mTargetD == getBaseMetaTileEntity().getWorld().provider.dimensionId)
+ || (!isDimensionalTeleportAvailable())
+ || (!GT_Utility.moveEntityToDimensionAtCoords(
+ tEntity,
+ this.mTargetD,
+ this.mTargetX + 0.5D,
+ this.mTargetY + 0.5D,
+ this.mTargetZ + 0.5D))) {
+ if ((tEntity instanceof EntityLivingBase)) {
+ ((EntityLivingBase) tEntity).setPositionAndUpdate(
+ this.mTargetX + 0.5D,
+ this.mTargetY + 0.5D,
+ this.mTargetZ + 0.5D);
+ } else {
+ tEntity.setPosition(
+ this.mTargetX + 0.5D,
+ this.mTargetY + 0.5D,
+ this.mTargetZ + 0.5D);
+ }
+ }
+ }
+ }
+ }
+ }
+ getBaseMetaTileEntity().setActive(true);
+ } else {
+ getBaseMetaTileEntity().setActive(false);
+ }
+ }
+ }
+
+ private int distanceCalculation() {
+ return Math.abs(
+ ((this.mTargetD != getBaseMetaTileEntity().getWorld().provider.dimensionId)
+ && (isDimensionalTeleportAvailable())
+ ? 4000
+ : (int) Math.sqrt(
+ Math.pow(getBaseMetaTileEntity().getXCoord() - this.mTargetX, 2.0D)
+ + Math.pow(getBaseMetaTileEntity().getYCoord() - this.mTargetY, 2.0D)
+ + Math.pow(getBaseMetaTileEntity().getZCoord() - this.mTargetZ, 2.0D))));
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isOverclockerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isTransformerUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long getMinimumStoredEU() {
+ return V[mTier] * 16;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 100000000;
+ }
+
+ @Override
+ public long maxEUInput() {
+ return V[mTier];
+ }
+
+ @Override
+ public long maxSteamStore() {
+ return maxEUStore();
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return 2;
+ }
+
+ @Override
+ public int getStackDisplaySlot() {
+ return 2;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public int getInputSlot() {
+ return 0;
+ }
+
+ @Override
+ public int getOutputSlot() {
+ return 0;
+ }
+
+ @Override
+ public int getCapacity() {
+ return 64000;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return false;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return false;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return null;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setSize(90, 72)
+ .setPos(43, 4))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "X: " + numberFormat.format(mTargetX))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 8))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "Y: " + numberFormat.format(mTargetY))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 16))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "Z: " + numberFormat.format(mTargetZ))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 24))
+ .widget(
+ new TextWidget().setStringSupplier(() -> "Dim: " + numberFormat.format(mTargetD))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(46, 32))
+ .widget(
+ TextWidget.dynamicString(() -> "Dim Valid: " + (GT_Utility.isRealDimension(mTargetD) ? "Yes" : "No"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> hasDimensionalTeleportCapability())
+ .setPos(46, 40))
+ .widget(new FakeSyncWidget.FluidStackSyncer(() -> mFluid, val -> mFluid = val));
+
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, -512, -64, 7);
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, -16, -1, 25);
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, 16, 1, 133);
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, 512, 64, 151);
+
+ addChangeNumberButton(
+ builder,
+ GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE,
+ val -> mTargetD += val,
+ -16,
+ -8,
+ 7,
+ 58);
+ addChangeNumberButton(
+ builder,
+ GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL,
+ val -> mTargetD += val,
+ -4,
+ -1,
+ 25,
+ 58);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> mTargetD += val, 4, 1, 133, 58);
+ addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> mTargetD += val, 16, 8, 151, 58);
+ }
+
+ private void addChangeNumberButtons(ModularWindow.Builder builder, IDrawable overlay, int addNumberShift,
+ int addNumber, int xPos) {
+ addChangeNumberButton(builder, overlay, val -> mTargetX += val, addNumberShift, addNumber, xPos, 4);
+ addChangeNumberButton(builder, overlay, val -> mTargetY += val, addNumberShift, addNumber, xPos, 22);
+ addChangeNumberButton(builder, overlay, val -> mTargetZ += val, addNumberShift, addNumber, xPos, 40);
+ }
+
+ private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer<Integer> setter,
+ int addNumberShift, int addNumber, int xPos, int yPos) {
+ builder.widget(
+ new ButtonWidget()
+ .setOnClick((clickData, widget) -> setter.accept(clickData.shift ? addNumberShift : addNumber))
+ .setBackground(GT_UITextures.BUTTON_STANDARD, overlay)
+ .setSize(18, 18)
+ .setPos(xPos, yPos));
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return new GUITextureSet().setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY);
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(113, 56));
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineBase.java b/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineBase.java
new file mode 100644
index 0000000000..ff3048f4b2
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineBase.java
@@ -0,0 +1,415 @@
+/**
+ *
+ * Inspired/ported from GregTech 6 under the LGPL license
+ *
+ * Copyright (c) 2020 GregTech-6 Team
+ *
+ * This file is part of GregTech.
+ *
+ * GregTech is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * GregTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along with GregTech. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+package gregtech.common.tileentities.machines.long_distance;
+
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static mcp.mobius.waila.api.SpecialChars.BLUE;
+import static mcp.mobius.waila.api.SpecialChars.GOLD;
+import static mcp.mobius.waila.api.SpecialChars.GREEN;
+import static mcp.mobius.waila.api.SpecialChars.RED;
+import static mcp.mobius.waila.api.SpecialChars.RESET;
+import static mcp.mobius.waila.api.SpecialChars.YELLOW;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+
+import net.minecraft.block.Block;
+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.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_Block_LongDistancePipe;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull_NonElectric;
+import gregtech.api.util.GT_Utility;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public abstract class GT_MetaTileEntity_LongDistancePipelineBase extends GT_MetaTileEntity_BasicHull_NonElectric {
+
+ protected static final int INPUT_INDEX = 0;
+ protected static final int OUTPUT_INDEX = 1;
+ protected static final int SIDE_UP_DOWN_INDEX = 2;
+ protected static final int SIDE_LEFT_RIGHT_INDEX = 3;
+
+ public static int minimalDistancePoints = 64;
+
+ protected GT_MetaTileEntity_LongDistancePipelineBase mTarget = null;
+ // these two are updated by machine block update thread, so must be volatile
+ protected volatile GT_MetaTileEntity_LongDistancePipelineBase mSender = null;
+ protected volatile ChunkCoordinates mTargetPos = null;
+ protected GT_MetaTileEntity_LongDistancePipelineBase mTooCloseTarget = null, mTooCloseSender = null;
+
+ public GT_MetaTileEntity_LongDistancePipelineBase(int aID, String aName, String aNameRegional, int aTier,
+ String aDescription) {
+ super(aID, aName, aNameRegional, aTier, aDescription);
+ }
+
+ public GT_MetaTileEntity_LongDistancePipelineBase(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { "Only one Input and Output are allowed per pipeline",
+ "Only Input and Output have to be chunkloaded", "Transfer rate is solely limited by input rate",
+ "Minimum distance: " + minimalDistancePoints + " blocks" };
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ if (mTargetPos != null && mTarget != this) {
+ aNBT.setBoolean("target", true);
+ aNBT.setInteger("target.x", mTargetPos.posX);
+ aNBT.setInteger("target.y", mTargetPos.posY);
+ aNBT.setInteger("target.z", mTargetPos.posZ);
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("target")) {
+ mTargetPos = new ChunkCoordinates(
+ aNBT.getInteger("target.x"),
+ aNBT.getInteger("target.y"),
+ aNBT.getInteger("target.z"));
+ if (getDistanceToSelf(mTargetPos) < minimalDistancePoints) mTargetPos = null;
+ }
+ }
+
+ public boolean isSameClass(GT_MetaTileEntity_LongDistancePipelineBase other) {
+ return false;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isClientSide()) return true;
+ ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
+ if (tCurrentItem != null) {
+ if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSoftHammerList)) {
+ scanPipes();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isDead() {
+ return getBaseMetaTileEntity() == null || getBaseMetaTileEntity().isDead();
+ }
+
+ public boolean checkTarget() {
+ final IGregTechTileEntity gt_tile = getBaseMetaTileEntity();
+ if (gt_tile == null || !gt_tile.isAllowedToWork() || gt_tile.isClientSide()) return false;
+ World world = gt_tile.getWorld();
+ if (world == null) return false;
+
+ if (mTargetPos == null) {
+ // We don't have a target position, scan the pipes
+ scanPipes();
+ } else if (mTarget == null || mTarget.isDead()) {
+ // We don't have a target, or it's dead. Try checking the target position
+ mTarget = null;
+ if (world.blockExists(mTargetPos.posX, mTargetPos.posY, mTargetPos.posZ)) {
+ // Only check if the target position is loaded
+ TileEntity te = world.getTileEntity(mTargetPos.posX, mTargetPos.posY, mTargetPos.posZ);
+ final IMetaTileEntity tMeta;
+ if (te instanceof BaseMetaTileEntity
+ && ((tMeta = ((BaseMetaTileEntity) te)
+ .getMetaTileEntity()) instanceof GT_MetaTileEntity_LongDistancePipelineBase)
+ && isSameClass((GT_MetaTileEntity_LongDistancePipelineBase) tMeta)) {
+ // It's the right type!
+ mTarget = (GT_MetaTileEntity_LongDistancePipelineBase) tMeta;
+ } else if (te != null) {
+ // It isn't the right type, kill the target position
+ mTargetPos = null;
+ }
+ }
+ }
+ if (mTooCloseTarget != null && mTooCloseTarget.mSender == null) mTooCloseTarget.mTooCloseSender = this;
+ if (mTooCloseSender != null && (mTooCloseSender.isDead() || mTooCloseSender.mTarget != null))
+ mTooCloseSender = null;
+ if (mTarget == null || mTarget == this) return false;
+ if (mTarget.mSender == null || mTarget.mSender.isDead()
+ || mTarget.mSender.mTarget == null
+ || mTarget.mSender.mTarget.isDead()) {
+ mTarget.mSender = this;
+ mTarget.mTooCloseSender = null;
+ }
+
+ return mTarget.mSender == this;
+ }
+
+ @Override
+ public ArrayList<String> getSpecialDebugInfo(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer,
+ int aLogLevel, ArrayList<String> aList) {
+ if (mSender != null && !mSender.isDead() && mSender.mTarget == this) {
+ final ChunkCoordinates coords = mSender.getCoords();
+ aList.addAll(
+ Arrays.asList(
+ "Is Pipeline Output",
+ "Pipeline Input is at: X: " + coords.posX + " Y: " + coords.posY + " Z: " + coords.posZ));
+ } else {
+ aList.addAll(
+ Arrays.asList(
+ checkTarget() ? "Is connected to Pipeline Output" : "Pipeline Output is not connected/chunkloaded",
+ "Pipeline Output should be around: X: " + mTargetPos.posX
+ + " Y: "
+ + mTargetPos.posY
+ + " Z: "
+ + mTargetPos.posZ));
+ }
+
+ return aList;
+ }
+
+ // What meta should the pipes for this pipeline have
+ public abstract int getPipeMeta();
+
+ protected void scanPipes() {
+ if (mSender != null && !mSender.isDead() && mSender.mTarget == this) return;
+
+ // Check if we need to scan anything
+ final IGregTechTileEntity gtTile = getBaseMetaTileEntity();
+ if (gtTile == null) return;
+
+ final World world = gtTile.getWorld();
+ if (world == null) return;
+
+ mTargetPos = getCoords();
+ mTarget = this;
+ mSender = null;
+
+ // Start scanning from the output side
+ Block aBlock = gtTile.getBlockAtSide(gtTile.getBackFacing());
+
+ if (aBlock instanceof GT_Block_LongDistancePipe) {
+ byte aMetaData = gtTile.getMetaIDAtSide(gtTile.getBackFacing());
+ if (aMetaData != getPipeMeta()) return;
+
+ HashSet<ChunkCoordinates> tVisited = new HashSet<>(Collections.singletonList(getCoords())),
+ tWires = new HashSet<>();
+ Queue<ChunkCoordinates> tQueue = new LinkedList<>(
+ Collections.singletonList(getFacingOffset(gtTile, gtTile.getBackFacing())));
+
+ while (!tQueue.isEmpty()) {
+ final ChunkCoordinates aCoords = tQueue.poll();
+
+ if (world.getBlock(aCoords.posX, aCoords.posY, aCoords.posZ) == aBlock
+ && world.getBlockMetadata(aCoords.posX, aCoords.posY, aCoords.posZ) == aMetaData) {
+ // We've got another pipe/wire block
+ // TODO: Make sure it's the right type of pipe/wire via meta
+ ChunkCoordinates tCoords;
+ tWires.add(aCoords);
+
+ // For each direction, if we haven't already visited that coordinate, add it to the end of the
+ // queue
+ if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX + 1, aCoords.posY, aCoords.posZ)))
+ tQueue.add(tCoords);
+ if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX - 1, aCoords.posY, aCoords.posZ)))
+ tQueue.add(tCoords);
+ if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY + 1, aCoords.posZ)))
+ tQueue.add(tCoords);
+ if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY - 1, aCoords.posZ)))
+ tQueue.add(tCoords);
+ if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY, aCoords.posZ + 1)))
+ tQueue.add(tCoords);
+ if (tVisited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY, aCoords.posZ - 1)))
+ tQueue.add(tCoords);
+ } else {
+ // It's not a block - let's see if it's a tile entity
+ TileEntity tTileEntity = world.getTileEntity(aCoords.posX, aCoords.posY, aCoords.posZ);
+ if (tTileEntity != gtTile && tTileEntity instanceof BaseMetaTileEntity
+ && ((BaseMetaTileEntity) tTileEntity)
+ .getMetaTileEntity() instanceof GT_MetaTileEntity_LongDistancePipelineBase tGtTile) {
+ if (isSameClass(tGtTile) && tWires.contains(
+ tGtTile.getFacingOffset(
+ (BaseMetaTileEntity) tTileEntity,
+ ((BaseMetaTileEntity) tTileEntity).getFrontFacing()))) {
+ // If it's the same class, and we've scanned a wire in front of it (the input side), we've
+ // found our target
+ // still need to check if it's distant enough
+ int distance = getDistanceToSelf(aCoords);
+ if (distance > minimalDistancePoints) {
+ mTarget = tGtTile;
+ mTargetPos = tGtTile.getCoords();
+ mTooCloseTarget = null;
+ return;
+ } else {
+ if (mTooCloseTarget == null) {
+ mTooCloseTarget = tGtTile;
+ }
+ }
+ }
+
+ // Remove this block from the visited because we might end up back here from another wire that
+ // IS connected to the
+ // input side
+ tVisited.remove(aCoords);
+ }
+ }
+ }
+ }
+ }
+
+ protected int getDistanceToSelf(ChunkCoordinates aCoords) {
+ return Math.abs(getBaseMetaTileEntity().getXCoord() - aCoords.posX)
+ + Math.abs(getBaseMetaTileEntity().getYCoord() - aCoords.posY) / 2
+ + Math.abs(getBaseMetaTileEntity().getZCoord() - aCoords.posZ);
+ }
+
+ public ChunkCoordinates getFacingOffset(IGregTechTileEntity gt_tile, ForgeDirection side) {
+ return new ChunkCoordinates(
+ gt_tile.getOffsetX(side, 1),
+ gt_tile.getOffsetY(side, 1),
+ gt_tile.getOffsetZ(side, 1));
+ }
+
+ public ChunkCoordinates getCoords() {
+ final IGregTechTileEntity gt_tile = getBaseMetaTileEntity();
+ return new ChunkCoordinates(gt_tile.getXCoord(), gt_tile.getYCoord(), gt_tile.getZCoord());
+ }
+
+ @Override
+ public void onMachineBlockUpdate() {
+ mTargetPos = null;
+ mSender = null;
+ }
+
+ @Override
+ public boolean shouldTriggerBlockUpdate() {
+ return true;
+ }
+
+ abstract public ITexture[] getTextureOverlays();
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[4][17][];
+ ITexture[] overlays = getTextureOverlays();
+ for (int i = 0; i < rTextures[0].length; i++) {
+ rTextures[INPUT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], overlays[INPUT_INDEX] };
+ rTextures[OUTPUT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i], overlays[OUTPUT_INDEX] };
+ rTextures[SIDE_UP_DOWN_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i],
+ overlays[SIDE_UP_DOWN_INDEX] };
+ rTextures[SIDE_LEFT_RIGHT_INDEX][i] = new ITexture[] { MACHINE_CASINGS[mTier][i],
+ overlays[SIDE_LEFT_RIGHT_INDEX] };
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ colorIndex += 1;
+ if (sideDirection == facingDirection) return mTextures[INPUT_INDEX][colorIndex];
+ else if (sideDirection == facingDirection.getOpposite()) return mTextures[OUTPUT_INDEX][colorIndex];
+ else {
+ switch (facingDirection) {
+ case UP, DOWN -> {
+ return mTextures[SIDE_UP_DOWN_INDEX][colorIndex];
+ }
+ case NORTH -> {
+ switch (sideDirection) {
+ case DOWN, UP -> {
+ return mTextures[SIDE_UP_DOWN_INDEX][colorIndex];
+ }
+ case EAST, WEST -> {
+ return mTextures[SIDE_LEFT_RIGHT_INDEX][colorIndex];
+ }
+ default -> {}
+ }
+ }
+ case SOUTH -> {
+ switch (sideDirection) {
+ case DOWN, UP -> {
+ return mTextures[SIDE_UP_DOWN_INDEX][colorIndex];
+ }
+ case EAST, WEST -> {
+ return mTextures[SIDE_LEFT_RIGHT_INDEX][colorIndex];
+ }
+ default -> {}
+ }
+ }
+ case EAST, WEST -> {
+ return mTextures[SIDE_LEFT_RIGHT_INDEX][colorIndex];
+ }
+ default -> {}
+ }
+ }
+ return mTextures[INPUT_INDEX][colorIndex]; // dummy
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ final ForgeDirection facing = getBaseMetaTileEntity().getFrontFacing();
+ final ForgeDirection side = accessor.getSide();
+
+ final NBTTagCompound tag = accessor.getNBTData();
+ final boolean hasInput = tag.getBoolean("hasInput");
+ final boolean hasInputTooClose = tag.getBoolean("hasInputTooClose");
+ final boolean hasOutput = tag.getBoolean("hasOutput");
+ final boolean hasOutputTooClose = tag.getBoolean("hasOutputTooClose");
+
+ if (side == facing) currentTip.add(GOLD + "Pipeline Input" + RESET);
+ else if (side == facing.getOpposite()) currentTip.add(BLUE + "Pipeline Output" + RESET);
+ else currentTip.add("Pipeline Side");
+
+ if (!hasInput && !hasInputTooClose && !hasOutput && !hasOutputTooClose) {
+ currentTip.add(YELLOW + "Not connected" + RESET);
+ }
+
+ if (hasInput) currentTip.add(GREEN + "Connected to " + GOLD + "Input" + RESET);
+ else if (hasInputTooClose) currentTip.add(RED + "Connected Input too close" + RESET);
+ else if (hasOutput) currentTip.add(GREEN + "Connected to " + BLUE + "Output" + RESET);
+ else if (hasOutputTooClose) currentTip.add(RED + "Connected Output too close" + RESET);
+
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+
+ tag.setBoolean("hasInput", mSender != null);
+ tag.setBoolean("hasInputTooClose", mTooCloseSender != null);
+ tag.setBoolean("hasOutput", mTarget != null && mTarget != this);
+ tag.setBoolean("hasOutputTooClose", mTooCloseTarget != null);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineFluid.java b/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineFluid.java
new file mode 100644
index 0000000000..70e295f3ad
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineFluid.java
@@ -0,0 +1,125 @@
+/**
+ *
+ * Inspired/ported from GregTech 6 under the LGPL license
+ *
+ * Copyright (c) 2020 GregTech-6 Team
+ *
+ * This file is part of GregTech.
+ *
+ * GregTech is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * GregTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along with GregTech. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+package gregtech.common.tileentities.machines.long_distance;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_BACK;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_FRONT;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN_GLOW;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_LongDistancePipelineFluid extends GT_MetaTileEntity_LongDistancePipelineBase {
+
+ static final FluidTankInfo[] emptyTank = { new FluidTankInfo(null, Integer.MAX_VALUE) };
+
+ public GT_MetaTileEntity_LongDistancePipelineFluid(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, "Sends fluids over long distances");
+ }
+
+ public GT_MetaTileEntity_LongDistancePipelineFluid(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean isSameClass(GT_MetaTileEntity_LongDistancePipelineBase other) {
+ return other instanceof GT_MetaTileEntity_LongDistancePipelineFluid;
+ }
+
+ @Override
+ public int getPipeMeta() {
+ return 0;
+ }
+
+ public IFluidHandler getTank() {
+ final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity();
+ TileEntity tankTile = tTile.getTileEntityAtSide(tTile.getBackFacing());
+ if (tankTile instanceof IFluidHandler) return (IFluidHandler) tankTile;
+ else return null;
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection side) {
+ if (checkTarget()) {
+ final IFluidHandler tankTile = getTank();
+ if (tankTile != null) return tankTile.getTankInfo(side);
+ }
+
+ return emptyTank;
+ }
+
+ @Override
+ public int fill(ForgeDirection side, FluidStack aFluid, boolean aDoFill) {
+ if (checkTarget()) {
+ final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity();
+ final IFluidHandler tankTile = getTank();
+ if (tankTile != null) return tankTile.fill(tTile.getFrontFacing(), aFluid, aDoFill);
+ }
+ return 0;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, FluidStack aFluid, boolean aDoDrain) {
+ return null;
+ }
+
+ @Override
+ public FluidStack drain(ForgeDirection side, int aMaxDrain, boolean aDoDrain) {
+ return null;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_LongDistancePipelineFluid(mName, mTier, getDescription()[0], mTextures);
+ }
+
+ @Override
+ public ITexture[] getTextureOverlays() {
+ ITexture[] overlays = new ITexture[4];
+ overlays[INPUT_INDEX] = TextureFactory.of(OVERLAY_PIPELINE_FLUID_FRONT);
+ overlays[OUTPUT_INDEX] = TextureFactory.of(OVERLAY_PIPELINE_FLUID_BACK);
+ overlays[SIDE_UP_DOWN_INDEX] = TextureFactory.of(
+ TextureFactory.of(OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN_GLOW)
+ .glow()
+ .build());
+ overlays[SIDE_LEFT_RIGHT_INDEX] = TextureFactory.of(
+ TextureFactory.of(OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT_GLOW)
+ .glow()
+ .build());
+
+ return overlays;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineItem.java b/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineItem.java
new file mode 100644
index 0000000000..e1510f4d3d
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/long_distance/GT_MetaTileEntity_LongDistancePipelineItem.java
@@ -0,0 +1,214 @@
+/**
+ *
+ * Inspired/ported from GregTech 6 under the LGPL license
+ *
+ * Copyright (c) 2020 GregTech-6 Team
+ *
+ * This file is part of GregTech.
+ *
+ * GregTech is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * GregTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along with GregTech. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+package gregtech.common.tileentities.machines.long_distance;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_BACK;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_FRONT;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN_GLOW;
+
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_LongDistancePipelineItem extends GT_MetaTileEntity_LongDistancePipelineBase {
+
+ public GT_MetaTileEntity_LongDistancePipelineItem(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, "Sends Items over long distances");
+ }
+
+ public GT_MetaTileEntity_LongDistancePipelineItem(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public boolean isSameClass(GT_MetaTileEntity_LongDistancePipelineBase other) {
+ return other instanceof GT_MetaTileEntity_LongDistancePipelineItem;
+ }
+
+ @Override
+ public int getPipeMeta() {
+ return 1;
+ }
+
+ public IInventory getInventory() {
+ final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity();
+ TileEntity invTile = tTile.getTileEntityAtSide(tTile.getBackFacing());
+ if (invTile instanceof IInventory) return (IInventory) invTile;
+ else return null;
+ }
+
+ @Override
+ public ItemStack decrStackSize(int aSlot, int aDecrement) {
+ if (checkTarget()) {
+ IInventory iInventory = getInventory();
+ if (iInventory != null) return iInventory.decrStackSize(aSlot, aDecrement);
+ }
+ return null;
+ }
+
+ @Override
+ public ItemStack getStackInSlotOnClosing(int aSlot) {
+ if (checkTarget()) {
+ IInventory iInventory = getInventory();
+ if (iInventory != null) return iInventory.getStackInSlotOnClosing(aSlot);
+ }
+ return null;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(int aSlot) {
+ if (checkTarget()) {
+ IInventory iInventory = getInventory();
+ if (iInventory != null) return iInventory.getStackInSlot(aSlot);
+ }
+ return null;
+ }
+
+ @Override
+ public String getInventoryName() {
+ if (checkTarget()) {
+ IInventory iInventory = getInventory();
+ if (iInventory != null) return iInventory.getInventoryName();
+ }
+ return super.getInventoryName();
+ }
+
+ @Override
+ public int getSizeInventory() {
+ if (checkTarget()) {
+ IInventory iInventory = getInventory();
+ if (iInventory != null) return iInventory.getSizeInventory();
+ }
+ return 0;
+ }
+
+ @Override
+ public int getInventoryStackLimit() {
+ if (checkTarget()) {
+ IInventory iInventory = getInventory();
+ if (iInventory != null) return iInventory.getInventoryStackLimit();
+ }
+ return 0;
+ }
+
+ @Override
+ public void setInventorySlotContents(int aSlot, ItemStack aStack) {
+ if (checkTarget()) {
+ IInventory iInventory = getInventory();
+ if (iInventory != null) iInventory.setInventorySlotContents(aSlot, aStack);
+ }
+ }
+
+ @Override
+ public boolean hasCustomInventoryName() {
+ if (checkTarget()) {
+ IInventory iInventory = getInventory();
+ if (iInventory != null) return iInventory.hasCustomInventoryName();
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isItemValidForSlot(int aSlot, ItemStack aStack) {
+ if (checkTarget()) {
+ IInventory iInventory = getInventory();
+ if (iInventory != null) return iInventory.isItemValidForSlot(aSlot, aStack);
+ }
+ return false;
+ }
+
+ // // Relay Sided Inventories
+ //
+
+ @Override
+ public int[] getAccessibleSlotsFromSide(int ordinalSide) {
+ if (checkTarget()) {
+ final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity();
+ final IInventory iInventory = getInventory();
+ if (iInventory instanceof ISidedInventory inv) return inv.getAccessibleSlotsFromSide(
+ tTile.getFrontFacing()
+ .ordinal());
+ if (iInventory != null) {
+ final int[] tReturn = new int[iInventory.getSizeInventory()];
+ for (int i = 0; i < tReturn.length; i++) tReturn[i] = i;
+ return tReturn;
+ }
+ }
+
+ return GT_Values.emptyIntArray;
+ }
+
+ @Override
+ public boolean canInsertItem(int aSlot, ItemStack aStack, int ordinalSide) {
+ if (checkTarget()) {
+ final IGregTechTileEntity tTile = mTarget.getBaseMetaTileEntity();
+ IInventory iInventory = getInventory();
+ if (iInventory instanceof ISidedInventory iSidedInventory) return iSidedInventory.canInsertItem(
+ aSlot,
+ aStack,
+ tTile.getFrontFacing()
+ .ordinal());
+ return iInventory != null;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canExtractItem(int aSlot, ItemStack aStack, int ordinalSide) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_LongDistancePipelineItem(mName, mTier, getDescription()[0], mTextures);
+ }
+
+ @Override
+ public ITexture[] getTextureOverlays() {
+ ITexture[] overlays = new ITexture[4];
+ overlays[INPUT_INDEX] = TextureFactory.of(OVERLAY_PIPELINE_ITEM_FRONT);
+ overlays[OUTPUT_INDEX] = TextureFactory.of(OVERLAY_PIPELINE_ITEM_BACK);
+ overlays[SIDE_UP_DOWN_INDEX] = TextureFactory.of(
+ TextureFactory.of(OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN_GLOW)
+ .glow()
+ .build());
+ overlays[SIDE_LEFT_RIGHT_INDEX] = TextureFactory.of(
+ TextureFactory.of(OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT_GLOW)
+ .glow()
+ .build());
+
+ return overlays;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AbstractMultiFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AbstractMultiFurnace.java
new file mode 100644
index 0000000000..0c91951e28
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AbstractMultiFurnace.java
@@ -0,0 +1,48 @@
+package gregtech.common.tileentities.machines.multi;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+
+public abstract class GT_MetaTileEntity_AbstractMultiFurnace<T extends GT_MetaTileEntity_AbstractMultiFurnace<T>>
+ extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<T> {
+
+ private HeatingCoilLevel mCoilLevel;
+
+ protected GT_MetaTileEntity_AbstractMultiFurnace(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ protected GT_MetaTileEntity_AbstractMultiFurnace(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ public HeatingCoilLevel getCoilLevel() {
+ return mCoilLevel;
+ }
+
+ public void setCoilLevel(HeatingCoilLevel aCoilLevel) {
+ mCoilLevel = aCoilLevel;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java
new file mode 100644
index 0000000000..7c7c27c880
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java
@@ -0,0 +1,505 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_GLOW;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess;
+import gregtech.api.multitileentity.multiblock.casing.Glasses;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_AssemblyLineUtils;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe.GT_Recipe_AssemblyLine;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.IGT_HatchAdder;
+
+public class GT_MetaTileEntity_AssemblyLine extends
+ GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GT_MetaTileEntity_AssemblyLine> implements ISurvivalConstructable {
+
+ public ArrayList<GT_MetaTileEntity_Hatch_DataAccess> mDataAccessHatches = new ArrayList<>();
+ private static final String STRUCTURE_PIECE_FIRST = "first";
+ private static final String STRUCTURE_PIECE_LATER = "later";
+ private static final String STRUCTURE_PIECE_LAST = "last";
+ private static final IStructureDefinition<GT_MetaTileEntity_AssemblyLine> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_AssemblyLine>builder()
+ .addShape(
+ STRUCTURE_PIECE_FIRST,
+ transpose(new String[][] { { " ", "e", " " }, { "~", "l", "G" }, { "g", "m", "g" }, { "b", "i", "b" }, }))
+ .addShape(
+ STRUCTURE_PIECE_LATER,
+ transpose(new String[][] { { " ", "e", " " }, { "d", "l", "d" }, { "g", "m", "g" }, { "b", "I", "b" }, }))
+ .addShape(
+ STRUCTURE_PIECE_LAST,
+ transpose(new String[][] { { " ", "e", " " }, { "d", "l", "d" }, { "g", "m", "g" }, { "o", "i", "b" }, }))
+ .addElement('G', ofBlock(GregTech_API.sBlockCasings3, 10)) // grate machine casing
+ .addElement('l', ofBlock(GregTech_API.sBlockCasings2, 9)) // assembler machine casing
+ .addElement('m', ofBlock(GregTech_API.sBlockCasings2, 5)) // assembling line casing
+ .addElement('g', Glasses.chainAllGlasses())
+ .addElement(
+ 'e',
+ ofChain(
+ Energy.newAny(16, 1, ForgeDirection.UP, ForgeDirection.NORTH, ForgeDirection.SOUTH),
+ ofBlock(GregTech_API.sBlockCasings2, 0)))
+ .addElement(
+ 'd',
+ buildHatchAdder(GT_MetaTileEntity_AssemblyLine.class).atLeast(DataHatchElement.DataAccess)
+ .dot(2)
+ .casingIndex(42)
+ .allowOnly(ForgeDirection.NORTH)
+ .buildAndChain(GregTech_API.sBlockCasings3, 10))
+ .addElement(
+ 'b',
+ buildHatchAdder(GT_MetaTileEntity_AssemblyLine.class)
+ .atLeast(InputHatch, InputHatch, InputHatch, InputHatch, Maintenance)
+ .casingIndex(16)
+ .dot(3)
+ .allowOnly(ForgeDirection.DOWN)
+ .buildAndChain(
+ ofBlock(GregTech_API.sBlockCasings2, 0),
+ ofHatchAdder(GT_MetaTileEntity_AssemblyLine::addOutputToMachineList, 16, 4)))
+ .addElement(
+ 'I',
+ ofChain(
+ // all blocks nearby use solid steel casing, so let's use the texture of that
+ InputBus.newAny(16, 5, ForgeDirection.DOWN),
+ ofHatchAdder(GT_MetaTileEntity_AssemblyLine::addOutputToMachineList, 16, 4)))
+ .addElement('i', InputBus.newAny(16, 5, ForgeDirection.DOWN))
+ .addElement('o', OutputBus.newAny(16, 4, ForgeDirection.DOWN))
+ .build();
+
+ public GT_MetaTileEntity_AssemblyLine(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_AssemblyLine(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_AssemblyLine(this.mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Assembling Line")
+ .addInfo("Controller block for the Assembling Line")
+ .addInfo("Used to make complex machine parts (LuV+)")
+ .addInfo("Does not make Assembler items")
+ .addInfo("Recipe tier is at most Energy Hatch tier + 1.")
+ .addSeparator()
+ .beginVariableStructureBlock(5, 16, 4, 4, 3, 3, false) // ?
+ .addStructureInfo("From Bottom to Top, Left to Right")
+ .addStructureInfo(
+ "Layer 1 - Solid Steel Machine Casing, Input Bus (last can be Output Bus), Solid Steel Machine Casing")
+ .addStructureInfo(
+ "Layer 2 - Borosilicate Glass(any)/Warded Glass/Reinforced Glass, Assembling Line Casing, Reinforced Glass")
+ .addStructureInfo("Layer 3 - Grate Machine Casing, Assembler Machine Casing, Grate Machine Casing")
+ .addStructureInfo("Layer 4 - Empty, Solid Steel Machine Casing, Empty")
+ .addStructureInfo("Up to 16 repeating slices, each one allows for 1 more item in recipes")
+ .addController("Either Grate on layer 3 of the first slice")
+ .addEnergyHatch("Any layer 4 casing", 1)
+ .addMaintenanceHatch("Any layer 1 casing", 3)
+ .addInputBus("As specified on layer 1", 4, 5)
+ .addInputHatch("Any layer 1 casing", 3)
+ .addOutputBus("Replaces Input Bus on final slice or on any solid steel casing on layer 1", 4)
+ .addOtherStructurePart("Data Access Hatch", "Optional, next to controller", 2)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ if (sideDirection == facingDirection) {
+ if (active) return new ITexture[] { BlockIcons.casingTexturePages[0][16], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { BlockIcons.casingTexturePages[0][16], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][16] };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.assemblylineVisualRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Start ALine recipe check");
+ }
+ CheckRecipeResult result = CheckRecipeResultRegistry.NO_DATA_STICKS;
+
+ ArrayList<ItemStack> tDataStickList = getDataItems(2);
+ if (tDataStickList.isEmpty()) {
+ return result;
+ }
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Stick accepted, " + tDataStickList.size() + " Data Sticks found");
+ }
+
+ int[] tStacks = new int[0];
+ FluidStack[] tFluids = new FluidStack[0];
+ long averageVoltage = getAverageInputVoltage();
+ long maxAmp = mEnergyHatches.size() <= 1 ? 1 : getMaxInputAmps();
+ int maxParallel = 1;
+ Map<GT_Utility.ItemId, ItemStack> inputsFromME = getStoredInputsFromME();
+ Map<Fluid, FluidStack> fluidsFromME = getStoredFluidsFromME();
+
+ for (ItemStack tDataStick : tDataStickList) {
+ GT_AssemblyLineUtils.LookupResult tLookupResult = GT_AssemblyLineUtils
+ .findAssemblyLineRecipeFromDataStick(tDataStick, false);
+
+ if (tLookupResult.getType() == GT_AssemblyLineUtils.LookupResultType.INVALID_STICK) {
+ result = CheckRecipeResultRegistry.NO_RECIPE;
+ continue;
+ }
+
+ GT_Recipe_AssemblyLine tRecipe = tLookupResult.getRecipe();
+ // Check if the recipe on the data stick is the current recipe for it's given output, if not we update it
+ // and continue to next.
+ if (tLookupResult.getType() != GT_AssemblyLineUtils.LookupResultType.VALID_STACK_AND_VALID_HASH) {
+ tRecipe = GT_AssemblyLineUtils.processDataStick(tDataStick);
+ if (tRecipe == null) {
+ result = CheckRecipeResultRegistry.NO_RECIPE;
+ continue;
+ }
+ }
+
+ // Void protection check.
+ if (!canOutputAll(new ItemStack[] { tRecipe.mOutput })) {
+ result = CheckRecipeResultRegistry.ITEM_OUTPUT_FULL;
+ continue;
+ }
+
+ // So here we check against the recipe found on the data stick.
+ // If we run into missing buses/hatches or bad inputs, we go to the next data stick.
+ // This check only happens if we have a valid up-to-date data stick.
+
+ // first validate we have enough input busses and input hatches for this recipe
+ if (mInputBusses.size() < tRecipe.mInputs.length || mInputHatches.size() < tRecipe.mFluidInputs.length) {
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info(
+ "Not enough sources: Need ({}, {}), has ({}, {})",
+ mInputBusses.size(),
+ tRecipe.mInputs.length,
+ mInputHatches.size(),
+ tRecipe.mFluidInputs.length);
+ }
+ result = CheckRecipeResultRegistry.NO_RECIPE;
+ continue;
+ }
+
+ // Check Inputs allign
+ int[] itemConsumptions = GT_Recipe_AssemblyLine.getItemConsumptionAmountArray(mInputBusses, tRecipe);
+ if (itemConsumptions == null || itemConsumptions.length == 0) {
+ result = CheckRecipeResultRegistry.NO_RECIPE;
+ continue;
+ }
+ maxParallel = (int) GT_Recipe_AssemblyLine
+ .maxParallelCalculatedByInputItems(mInputBusses, maxParallel, itemConsumptions, inputsFromME);
+ if (maxParallel <= 0) {
+ result = CheckRecipeResultRegistry.NO_RECIPE;
+ continue;
+ }
+ tStacks = itemConsumptions;
+
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("All Items accepted");
+ }
+
+ // Check Fluid Inputs allign
+ if (tRecipe.mFluidInputs.length > 0) {
+ maxParallel = (int) GT_Recipe_AssemblyLine
+ .maxParallelCalculatedByInputFluids(mInputHatches, maxParallel, tRecipe.mFluidInputs, fluidsFromME);
+ if (maxParallel <= 0) {
+ result = CheckRecipeResultRegistry.NO_RECIPE;
+ continue;
+ }
+ tFluids = tRecipe.mFluidInputs;
+ }
+
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("All fluids accepted");
+ }
+
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Check overclock");
+ }
+
+ // Recipe tier is limited to hatch tier + 1.
+ if (tRecipe.mEUt > averageVoltage * 4) {
+ result = CheckRecipeResultRegistry.insufficientPower(tRecipe.mEUt);
+ continue;
+ }
+
+ // Insufficient power check.
+ if (tRecipe.mEUt > maxAmp * averageVoltage) {
+ result = CheckRecipeResultRegistry.insufficientPower(tRecipe.mEUt);
+ continue;
+ }
+
+ calculateOverclockedNessMultiInternal(tRecipe.mEUt, tRecipe.mDuration, (int) maxAmp, averageVoltage, false);
+ // In case recipe is too OP for that machine
+ if (lEUt == Long.MAX_VALUE) {
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Recipe too OP");
+ }
+ result = CheckRecipeResultRegistry.POWER_OVERFLOW;
+ continue;
+ }
+
+ if (mMaxProgresstime == Integer.MAX_VALUE) {
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Recipe too OP");
+ }
+ result = CheckRecipeResultRegistry.DURATION_OVERFLOW;
+ continue;
+ }
+
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Find available recipe");
+ }
+ result = CheckRecipeResultRegistry.SUCCESSFUL;
+ mOutputItems = new ItemStack[] { tRecipe.mOutput };
+ break;
+ }
+
+ if (!result.wasSuccessful()) {
+ return result;
+ }
+
+ // Must be something wrong here...
+ if (tStacks.length == 0 || maxParallel <= 0) {
+ return CheckRecipeResultRegistry.INTERNAL_ERROR;
+ }
+
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("All checked start consuming inputs");
+ }
+
+ GT_Recipe_AssemblyLine.consumeInputItems(mInputBusses, maxParallel, tStacks, inputsFromME);
+ GT_Recipe_AssemblyLine.consumeInputFluids(mInputHatches, maxParallel, tFluids, fluidsFromME);
+
+ if (this.lEUt > 0) {
+ this.lEUt = -this.lEUt;
+ }
+ this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
+ this.mEfficiencyIncrease = 10000;
+ updateSlots();
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Recipe successful");
+ }
+ return result;
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ for (GT_MetaTileEntity_Hatch_DataAccess hatch_dataAccess : mDataAccessHatches) {
+ hatch_dataAccess.setActive(true);
+ }
+ return super.onRunningTick(aStack);
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_AssemblyLine> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mDataAccessHatches.clear();
+ if (!checkPiece(STRUCTURE_PIECE_FIRST, 0, 1, 0)) return false;
+ return checkMachine(true) || checkMachine(false);
+ }
+
+ private boolean checkMachine(boolean leftToRight) {
+ for (int i = 1; i < 16; i++) {
+ if (!checkPiece(STRUCTURE_PIECE_LATER, leftToRight ? -i : i, 1, 0)) return false;
+ if (!mOutputBusses.isEmpty())
+ return !mEnergyHatches.isEmpty() && mMaintenanceHatches.size() == 1 && mDataAccessHatches.size() <= 1;
+ }
+ return false;
+ }
+
+ /**
+ * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb
+ */
+ private boolean isCorrectDataItem(ItemStack aStack, int state) {
+ if ((state & 1) != 0 && ItemList.Circuit_Integrated.isStackEqual(aStack, true, true)) return true;
+ if ((state & 2) != 0 && ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) return true;
+ return (state & 4) != 0 && ItemList.Tool_DataOrb.isStackEqual(aStack, false, true);
+ }
+
+ /**
+ * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb
+ */
+ public ArrayList<ItemStack> getDataItems(int state) {
+ ArrayList<ItemStack> rList = new ArrayList<>();
+ if (GT_Utility.isStackValid(mInventory[1]) && isCorrectDataItem(mInventory[1], state)) {
+ rList.add(mInventory[1]);
+ }
+ for (GT_MetaTileEntity_Hatch_DataAccess tHatch : filterValidMTEs(mDataAccessHatches)) {
+ for (int i = 0; i < tHatch.getBaseMetaTileEntity()
+ .getSizeInventory(); i++) {
+ if (tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i) != null && isCorrectDataItem(
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i),
+ state))
+ rList.add(
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i));
+ }
+ }
+ return rList;
+ }
+
+ public boolean addDataAccessToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DataAccess) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mDataAccessHatches.add((GT_MetaTileEntity_Hatch_DataAccess) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_FIRST, stackSize, hintsOnly, 0, 1, 0);
+ int tLength = Math.min(stackSize.stackSize + 1, 16);
+ for (int i = 1; i < tLength; i++) {
+ buildPiece(STRUCTURE_PIECE_LATER, stackSize, hintsOnly, -i, 1, 0);
+ }
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int build = survivialBuildPiece(STRUCTURE_PIECE_FIRST, stackSize, 0, 1, 0, elementBudget, env, false, true);
+ if (build >= 0) return build;
+ int tLength = Math.min(stackSize.stackSize + 1, 16);
+ for (int i = 1; i < tLength - 1; i++) {
+ build = survivialBuildPiece(STRUCTURE_PIECE_LATER, stackSize, -i, 1, 0, elementBudget, env, false, true);
+ if (build >= 0) return build;
+ }
+ return survivialBuildPiece(STRUCTURE_PIECE_LAST, stackSize, 1 - tLength, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public Set<VoidingMode> getAllowedVoidingModes() {
+ return VoidingMode.ITEM_ONLY_MODES;
+ }
+
+ private enum DataHatchElement implements IHatchElement<GT_MetaTileEntity_AssemblyLine> {
+
+ DataAccess;
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return Collections.singletonList(GT_MetaTileEntity_Hatch_DataAccess.class);
+ }
+
+ @Override
+ public IGT_HatchAdder<GT_MetaTileEntity_AssemblyLine> adder() {
+ return GT_MetaTileEntity_AssemblyLine::addDataAccessToMachineList;
+ }
+
+ @Override
+ public long count(GT_MetaTileEntity_AssemblyLine t) {
+ return t.mDataAccessHatches.size();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_BrickedBlastFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_BrickedBlastFurnace.java
new file mode 100644
index 0000000000..a9cb7708cf
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_BrickedBlastFurnace.java
@@ -0,0 +1,155 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.util.GT_Waila.getMachineProgressString;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.lwjgl.input.Keyboard;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.interfaces.ISecondaryDescribable;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GT_MetaTileEntity_BrickedBlastFurnace extends GT_MetaTileEntity_PrimitiveBlastFurnace
+ implements ISecondaryDescribable {
+
+ private static final ITexture[] FACING_SIDE = { TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_DENSEBRICKS) };
+ private static final ITexture[] FACING_FRONT = {
+ TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_BRICKEDBLASTFURNACE_INACTIVE) };
+ private static final ITexture[] FACING_ACTIVE = {
+ TextureFactory.of(Textures.BlockIcons.MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE), TextureFactory.builder()
+ .addIcon(BlockIcons.MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ private GT_Multiblock_Tooltip_Builder tooltipBuilder;
+
+ public GT_MetaTileEntity_BrickedBlastFurnace(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_BrickedBlastFurnace(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return getCurrentDescription();
+ }
+
+ @Override
+ public boolean isDisplaySecondaryDescription() {
+ return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT);
+ }
+
+ public String[] getPrimaryDescription() {
+ return getTooltip().getInformation();
+ }
+
+ public String[] getSecondaryDescription() {
+ return getTooltip().getStructureInformation();
+ }
+
+ protected GT_Multiblock_Tooltip_Builder getTooltip() {
+ if (tooltipBuilder == null) {
+ tooltipBuilder = new GT_Multiblock_Tooltip_Builder();
+ tooltipBuilder.addMachineType("Blast Furnace")
+ .addInfo("Controller Block for the Bricked Blast Furnace")
+ .addInfo("Usable for Steel and general Pyrometallurgy")
+ .addInfo("Has a useful interface, unlike other gregtech multis")
+ .addPollutionAmount(GT_Mod.gregtechproxy.mPollutionPrimitveBlastFurnacePerSecond)
+ .addSeparator()
+ .beginStructureBlock(3, 4, 3, true)
+ .addController("Front center")
+ .addOtherStructurePart("Firebricks", "Everything except the controller")
+ .addStructureInfo("The top block is also empty")
+ .addStructureInfo("You can share the walls of GT multis, so")
+ .addStructureInfo("each additional one costs less, up to 4")
+ .toolTipFinisher("Gregtech");
+ }
+ return tooltipBuilder;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ return aActive ? FACING_ACTIVE : FACING_FRONT;
+ }
+ return FACING_SIDE;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_BrickedBlastFurnace(this.mName);
+ }
+
+ @Override
+ protected Block getCasingBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ @Override
+ protected int getCasingMetaID() {
+ return 15;
+ }
+
+ @Override
+ public String getName() {
+ return "Bricked Blast Furnace";
+ }
+
+ @Override
+ public SteamVariant getSteamVariant() {
+ return SteamVariant.PRIMITIVE;
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ if (!this.getBaseMetaTileEntity()
+ .isInvalidTileEntity()) {
+ NBTTagCompound nbt = accessor.getNBTData();
+ currenttip.add(
+ getMachineProgressString(
+ this.getBaseMetaTileEntity()
+ .isActive(),
+ nbt.getInteger("mMaxProgressTime"),
+ nbt.getInteger("mProgressTime")));
+ }
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ if (!this.getBaseMetaTileEntity()
+ .isInvalidTileEntity()) {
+ tag.setInteger("mProgressTime", this.getProgresstime());
+ tag.setInteger("mMaxProgressTime", this.maxProgresstime());
+ }
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return getTooltip().getStructureHint();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Charcoal_Pit.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Charcoal_Pit.java
new file mode 100644
index 0000000000..1af65465c1
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Charcoal_Pit.java
@@ -0,0 +1,313 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import java.util.ArrayList;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.ChunkPosition;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.interfaces.ISecondaryDescribable;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TooltipMultiBlockBase;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.WorldSpawnedEventBuilder;
+import gregtech.common.GT_Pollution;
+
+public class GT_MetaTileEntity_Charcoal_Pit extends GT_MetaTileEntity_TooltipMultiBlockBase
+ implements ISecondaryDescribable {
+
+ private boolean running = false;
+
+ public GT_MetaTileEntity_Charcoal_Pit(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_Charcoal_Pit(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return (facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ // No GUI, do not capture right-click so it does not interfere when placing logs
+ return false;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Nonnull
+ @Override
+ public CheckRecipeResult checkProcessing() {
+ if (!checkRecursiveBlocks()) {
+ mEfficiency = 0;
+ mEfficiencyIncrease = 0;
+ mMaxProgresstime = 0;
+ running = false;
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ if (mEfficiency == 0) {
+ mEfficiency = 10000;
+ mEfficiencyIncrease = 10000;
+ mMaxProgresstime = Math.max(1, mMaxProgresstime);
+
+ // adds all the pollution at once when the recipe starts
+ GT_Pollution.addPollution(getBaseMetaTileEntity(), mMaxProgresstime * getPollutionPerTick(null));
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ } else {
+ mEfficiency = 0;
+ mEfficiencyIncrease = 0;
+ mMaxProgresstime = 0;
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+ }
+
+ private boolean checkRecursiveBlocks() {
+ ArrayList<ChunkPosition> tList1 = new ArrayList<>();
+ ArrayList<ChunkPosition> tList2 = new ArrayList<>();
+
+ Block tBlock = getBaseMetaTileEntity().getBlockOffset(0, -1, 0);
+ if (isWoodLog(tBlock, getBaseMetaTileEntity().getMetaIDOffset(0, -1, 0))) {
+ tList2.add(new ChunkPosition(0, -1, 0));
+ } else return false;
+ while (!tList2.isEmpty()) {
+ ChunkPosition tPos = tList2.get(0);
+ tList2.remove(0);
+ if (!checkAllBlockSides(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ, tList1, tList2)) {
+ return false;
+ }
+ }
+ if (running) {
+ for (ChunkPosition tPos : tList1) {
+ if (isWoodLog(
+ getBaseMetaTileEntity().getBlockOffset(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ),
+ getBaseMetaTileEntity().getMetaIDOffset(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ)))
+ getBaseMetaTileEntity().getWorld()
+ .setBlock(
+ getBaseMetaTileEntity().getXCoord() + tPos.chunkPosX,
+ getBaseMetaTileEntity().getYCoord() + tPos.chunkPosY,
+ getBaseMetaTileEntity().getZCoord() + tPos.chunkPosZ,
+ GregTech_API.sBlockReinforced,
+ 4,
+ 3);
+ }
+ running = false;
+ return false;
+ } else {
+ mMaxProgresstime = (int) Math.sqrt(tList1.size() * 240000);
+ }
+ running = true;
+ return true;
+ }
+
+ private boolean isWoodLog(Block log, int meta) {
+ for (int id : OreDictionary.getOreIDs(new ItemStack(log, 1, meta))) {
+ if (OreDictionary.getOreName(id)
+ .equals("logWood")) return true;
+ }
+ String tTool = log.getHarvestTool(meta);
+ return OrePrefixes.log.contains(new ItemStack(log, 1, meta)) && ("axe".equals(tTool))
+ && (log.getMaterial() == Material.wood);
+ }
+
+ private boolean checkAllBlockSides(int aX, int aY, int aZ, ArrayList<? super ChunkPosition> aList1,
+ ArrayList<? super ChunkPosition> aList2) {
+ boolean expandToChunkXPos = false;
+ boolean expandToChunkXNeg = false;
+ boolean expandToChunkYPos = false;
+ boolean expandToChunkYNeg = false;
+ boolean expandToChunkZPos = false;
+ boolean expandToChunkZNeg = false;
+
+ Block blockXPos = getBaseMetaTileEntity().getBlockOffset(aX + 1, aY, aZ);
+ if (aX + 1 < 6 && (isWoodLog(blockXPos, getBaseMetaTileEntity().getMetaIDOffset(aX + 1, aY, aZ)))) {
+ if (!aList1.contains(new ChunkPosition(aX + 1, aY, aZ))
+ && (!aList2.contains(new ChunkPosition(aX + 1, aY, aZ)))) expandToChunkXPos = true;
+ } else if (!(blockXPos == Blocks.dirt || blockXPos == Blocks.grass)) {
+ return false;
+ }
+
+ Block blockXNeg = getBaseMetaTileEntity().getBlockOffset(aX - 1, aY, aZ);
+ if (aX - 1 > -6 && (isWoodLog(blockXNeg, getBaseMetaTileEntity().getMetaIDOffset(aX - 1, aY, aZ)))) {
+ if (!aList1.contains(new ChunkPosition(aX - 1, aY, aZ))
+ && (!aList2.contains(new ChunkPosition(aX - 1, aY, aZ)))) expandToChunkXNeg = true;
+ } else if (!(blockXNeg == Blocks.dirt || blockXNeg == Blocks.grass)) {
+ return false;
+ }
+
+ Block blockYPos = getBaseMetaTileEntity().getBlockOffset(aX, aY + 1, aZ);
+ if (aY + 1 < 1 && (isWoodLog(blockYPos, getBaseMetaTileEntity().getMetaIDOffset(aX, aY + 1, aZ)))) {
+ if (!aList1.contains(new ChunkPosition(aX, aY + 1, aZ))
+ && (!aList2.contains(new ChunkPosition(aX, aY + 1, aZ)))) expandToChunkYPos = true;
+ } else if (!(blockYPos == Blocks.dirt || blockYPos == Blocks.grass
+ || (aX == 0 && aY == -1 && aZ == 0 && blockYPos == GregTech_API.sBlockMachines))) {
+ return false;
+ }
+
+ Block blockYNeg = getBaseMetaTileEntity().getBlockOffset(aX, aY - 1, aZ);
+ if (aY - 1 > -6 && (isWoodLog(blockYNeg, getBaseMetaTileEntity().getMetaIDOffset(aX, aY - 1, aZ)))) {
+ if (!aList1.contains(new ChunkPosition(aX, aY - 1, aZ))
+ && (!aList2.contains(new ChunkPosition(aX, aY - 1, aZ)))) expandToChunkYNeg = true;
+ } else if (blockYNeg != Blocks.brick_block) {
+ return false;
+ }
+
+ Block blockZPos = getBaseMetaTileEntity().getBlockOffset(aX, aY, aZ + 1);
+ if (aZ + 1 < 6 && (isWoodLog(blockZPos, getBaseMetaTileEntity().getMetaIDOffset(aX, aY, aZ + 1)))) {
+ if (!aList1.contains(new ChunkPosition(aX, aY, aZ + 1))
+ && (!aList2.contains(new ChunkPosition(aX, aY, aZ + 1)))) expandToChunkZPos = true;
+ } else if (!(blockZPos == Blocks.dirt || blockZPos == Blocks.grass)) {
+ return false;
+ }
+
+ Block blockZNeg = getBaseMetaTileEntity().getBlockOffset(aX, aY, aZ - 1);
+ if (aZ - 1 > -6 && (isWoodLog(blockZNeg, getBaseMetaTileEntity().getMetaIDOffset(aX, aY, aZ - 1)))) {
+ if (!aList1.contains(new ChunkPosition(aX, aY, aZ - 1))
+ && (!aList2.contains(new ChunkPosition(aX, aY, aZ - 1)))) expandToChunkZNeg = true;
+ } else if (!(blockZNeg == Blocks.dirt || blockZNeg == Blocks.grass)) {
+ return false;
+ }
+ aList1.add(new ChunkPosition(aX, aY, aZ));
+ if (expandToChunkXPos) aList2.add(new ChunkPosition(aX + 1, aY, aZ));
+ if (expandToChunkXNeg) aList2.add(new ChunkPosition(aX - 1, aY, aZ));
+ if (expandToChunkYPos) aList2.add(new ChunkPosition(aX, aY + 1, aZ));
+ if (expandToChunkYNeg) aList2.add(new ChunkPosition(aX, aY - 1, aZ));
+ if (expandToChunkZPos) aList2.add(new ChunkPosition(aX, aY, aZ + 1));
+ if (expandToChunkZNeg) aList2.add(new ChunkPosition(aX, aY, aZ - 1));
+ return true;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mWrench = true;
+ mScrewdriver = true;
+ mSoftHammer = true;
+ mHardHammer = true;
+ mSolderingTool = true;
+ mCrowbar = true;
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return GT_Mod.gregtechproxy.mPollutionCharcoalPitPerSecond;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return null;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Charcoal_Pit(mName);
+ }
+
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Charcoal Pile Igniter")
+ .addInfo("Controller for the Charcoal Pit")
+ .addInfo("Converts Logs into Brittle Charcoal blocks")
+ .addInfo("Will automatically start when valid")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginVariableStructureBlock(3, 13, 3, 7, 3, 13, false)
+ .addStructureInfo("Can be up to 13x7x13 in size, including the dirt; shape doesn't matter")
+ .addOtherStructurePart("Controller", "Top layer, directly touching a wood log")
+ .addOtherStructurePart("Dirt/Grass", "Top and middle layers, covering wood logs")
+ .addOtherStructurePart("Bricks", "Bottom layer, under all wood logs")
+ .addOtherStructurePart("Wood Logs", "Up to 5 layers, inside the previously mentioned blocks")
+ .addStructureInfo("No air between logs allowed.")
+ .addStructureInfo(
+ "All logs must be within 6 x/z of the controller, so it must be dead-center for a full 11x11 square of wood.")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == ForgeDirection.UP) {
+ if (aActive) return new ITexture[] { casingTexturePages[0][10],
+ TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ return new ITexture[] { casingTexturePages[0][10], TextureFactory.of(OVERLAY_FRONT_ROCK_BREAKER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ROCK_BREAKER_GLOW)
+ .glow()
+ .build(), };
+ }
+ return new ITexture[] { casingTexturePages[0][10] };
+ }
+
+ @Override
+ public boolean polluteEnvironment(int aPollutionLevel) {
+ // Do nothing and don't choke on pollution. This is fine because we add
+ // all the pollution at once when the recipe starts
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ super.onPostTick(aBaseMetaTileEntity, aTimer);
+ if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())) {
+
+ new WorldSpawnedEventBuilder.ParticleEventBuilder().setMotion(0D, 0.3D, 0D)
+ .setIdentifier(ParticleFX.LARGE_SMOKE)
+ .setPosition(
+ aBaseMetaTileEntity.getOffsetX(ForgeDirection.UP, 1) + XSTR_INSTANCE.nextFloat(),
+ aBaseMetaTileEntity.getOffsetY(ForgeDirection.UP, 1),
+ aBaseMetaTileEntity.getOffsetZ(ForgeDirection.UP, 1) + XSTR_INSTANCE.nextFloat())
+ .setWorld(getBaseMetaTileEntity().getWorld())
+ .run();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java
new file mode 100644
index 0000000000..cd31b9cc1e
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_Cleanroom.java
@@ -0,0 +1,514 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.GT_Values.debugCleanroom;
+import static gregtech.api.enums.Textures.BlockIcons.BLOCK_PLASCRETE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_CLEANROOM;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_CLEANROOM_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_CLEANROOM_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_CLEANROOM_GLOW;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.config.ConfigCategory;
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.TierEU;
+import gregtech.api.interfaces.ICleanroom;
+import gregtech.api.interfaces.ICleanroomReceiver;
+import gregtech.api.interfaces.ISecondaryDescribable;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TooltipMultiBlockBase;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_Cleanroom extends GT_MetaTileEntity_TooltipMultiBlockBase
+ implements IConstructable, ISecondaryDescribable, ICleanroom {
+
+ private final Set<ICleanroomReceiver> cleanroomReceivers = new HashSet<>();
+ private int mHeight = -1;
+
+ public GT_MetaTileEntity_Cleanroom(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_Cleanroom(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Cleanroom(mName);
+ }
+
+ @Override
+ public int getCleanness() {
+ return mEfficiency;
+ }
+
+ @Override
+ public boolean isValidCleanroom() {
+ return isValid() && mMachine;
+ }
+
+ @Override
+ public void pollute() {
+ mEfficiency = 0;
+ mWrench = false;
+ mScrewdriver = false;
+ mSoftHammer = false;
+ mHardHammer = false;
+ mSolderingTool = false;
+ mCrowbar = false;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Cleanroom")
+ .addInfo("Controller block for the Cleanroom")
+ .addInfo("Consumes 40 EU/t when first turned on")
+ .addInfo("and 4 EU/t once at 100% efficiency")
+ .addInfo("If you use an LV energy hatch, it will actually accept 2A instead of just 1A.")
+ .addInfo(
+ "MV+ energy hatches just accept 1A as usual. For HV+ the cleanroom will overclock and gain efficiency faster.")
+ .addInfo("Time required to reach full efficiency is proportional to")
+ .addInfo("the height of empty space within")
+ .addInfo("Machines that cause pollution aren't allowed to be put in.")
+ .addSeparator()
+ .beginVariableStructureBlock(3, 15, 4, 15, 3, 15, true)
+ .addController("Top center")
+ .addCasingInfoRange("Plascrete", 20, 1007, false)
+ .addStructureInfo(
+ GT_Values.cleanroomGlass
+ + "% of the Plascrete can be replaced with Reinforced Glass (not counting the top layer)")
+ .addStructureInfo(
+ "Other material can be used in place of Plascrete, even in higher percentages. See config for detail")
+ .addOtherStructurePart("Filter Machine Casing", "Top besides controller and edges")
+ .addEnergyHatch("Any casing except top layer. Exactly one.")
+ .addMaintenanceHatch("Any casing except top layer")
+ .addStructureInfo("0-2x Reinforced Door (keep closed or efficiency will reduce)")
+ .addStructureInfo("Up to 1 Elevator, Rotating Elevator, and Travel Anchor each")
+ .addStructureInfo("Up to 10 Machine Hulls for Item & Energy transfer through walls")
+ .addStructureInfo("You can also use Diodes for more power")
+ .addStructureInfo("Diodes also count towards 10 Machine Hulls count limit")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack itemStack) {
+ return new String[] { "The base can be rectangular." };
+ }
+
+ @Nonnull
+ @Override
+ public CheckRecipeResult checkProcessing() {
+ mEfficiencyIncrease = 100;
+ final long inputVoltage = getMaxInputVoltage();
+
+ // only allow LV+ energy hatches
+ if (inputVoltage < TierEU.LV) {
+ return CheckRecipeResultRegistry.insufficientPower(40);
+ }
+
+ // use the standard overclock mechanism to determine duration and estimate a maximum consumption
+ // if the cleanroom is powered by an LV energy hatch, it will actually accept 2A instead of just 1A.
+ calculateOverclockedNessMultiInternal(
+ 40,
+ 45 * Math.max(1, mHeight - 1),
+ inputVoltage == TierEU.LV ? 2 : 1,
+ inputVoltage,
+ false);
+ // negate it to trigger the special energy consumption function. divide by 10 to get the actual final
+ // consumption.
+ mEUt /= -10;
+ return SimpleCheckRecipeResult.ofSuccess("cleanroom_running");
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return (facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ int x = 1;
+ int z = 1;
+ int y = 1;
+ int mDoorCount = 0;
+ int mHullCount = 0;
+ int mPlascreteCount = 0;
+ final HashMap<String, Integer> otherBlocks = new HashMap<>();
+ boolean doorState = false;
+ this.mUpdate = 100;
+ cleanroomReceivers.forEach(r -> r.setCleanroom(null));
+ cleanroomReceivers.clear();
+
+ if (debugCleanroom) {
+ GT_Log.out.println("Cleanroom: Checking machine");
+ }
+ for (int i = 1; i < 8; i++) {
+ final Block tBlock = aBaseMetaTileEntity.getBlockOffset(i, 0, 0);
+ final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(i, 0, 0);
+ if (tBlock != GregTech_API.sBlockCasings3 || tMeta != 11) {
+ if (tBlock == GregTech_API.sBlockReinforced || tMeta == 2) {
+ x = i;
+ break;
+ } else {
+ if (debugCleanroom) {
+ GT_Log.out.println("Cleanroom: Unable to detect room X edge?");
+ }
+ return false;
+ }
+ }
+ }
+ for (int i = 1; i < 8; i++) {
+ final Block tBlock = aBaseMetaTileEntity.getBlockOffset(0, 0, i);
+ final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(0, 0, i);
+ if (tBlock != GregTech_API.sBlockCasings3 || tMeta != 11) {
+ if (tBlock == GregTech_API.sBlockReinforced || tMeta == 2) {
+ z = i;
+ break;
+ } else {
+ if (debugCleanroom) {
+ GT_Log.out.println("Cleanroom: Unable to detect room Z edge?");
+ }
+ return false;
+ }
+ }
+ }
+ // detect rectangular area of filters
+ for (int i = -x + 1; i < x; i++) {
+ for (int j = -z + 1; j < z; j++) {
+ if (i == 0 && j == 0) continue;
+ final Block tBlock = aBaseMetaTileEntity.getBlockOffset(i, 0, j);
+ final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(i, 0, j);
+ if (tBlock != GregTech_API.sBlockCasings3 && tMeta != 11) {
+ if (debugCleanroom) {
+ GT_Log.out.println("Cleanroom: This is not a filter.");
+ }
+ return false;
+ }
+ }
+ }
+
+ for (int i = -1; i > -16; i--) {
+ final Block tBlock = aBaseMetaTileEntity.getBlockOffset(x, i, z);
+ final int tMeta = aBaseMetaTileEntity.getMetaIDOffset(x, i, z);
+ if (tBlock != GregTech_API.sBlockReinforced || tMeta != 2) {
+ y = i + 1;
+ break;
+ }
+ }
+ if (y > -2) {
+ if (debugCleanroom) {
+ GT_Log.out.println("Cleanroom: Room not tall enough?");
+ }
+ return false;
+ }
+ for (int dX = -x; dX <= x; dX++) {
+ for (int dZ = -z; dZ <= z; dZ++) {
+ for (int dY = 0; dY >= y; dY--) {
+ if (dX == -x || dX == x || dY == 0 || dY == y || dZ == -z || dZ == z) {
+ Block tBlock = aBaseMetaTileEntity.getBlockOffset(dX, dY, dZ);
+ int tMeta = aBaseMetaTileEntity.getMetaIDOffset(dX, dY, dZ);
+ if (dY == 0) { // TOP
+ if (dX == -x || dX == x || dZ == -z || dZ == z) { // Top Border
+ if (tBlock != GregTech_API.sBlockReinforced || tMeta != 2) {
+ if (debugCleanroom) {
+ GT_Log.out.println("Cleanroom: Non reinforced block on top edge? tMeta != 2");
+ }
+ return false;
+ }
+ } else if (dX != 0 || dZ != 0) { // Top Inner exclude center
+ if (tBlock != GregTech_API.sBlockCasings3 || tMeta != 11) {
+ if (debugCleanroom) {
+ GT_Log.out.println(
+ "Cleanroom: Non reinforced block on top face interior? tMeta != 11");
+ }
+ return false;
+ }
+ }
+ } else if (tBlock == GregTech_API.sBlockReinforced && tMeta == 2) {
+ mPlascreteCount++;
+ } else {
+ final IGregTechTileEntity tTileEntity = aBaseMetaTileEntity
+ .getIGregTechTileEntityOffset(dX, dY, dZ);
+ if ((!this.addMaintenanceToMachineList(tTileEntity, 210))
+ && (!this.addEnergyInputToMachineList(tTileEntity, 210))) {
+ if (tBlock instanceof ic2.core.block.BlockIC2Door) {
+ if ((tMeta & 8) == 0) {
+ // let's not fiddle with bits anymore.
+ if (Math.abs(dZ) < z) // on side parallel to z axis
+ doorState = tMeta == 1 || tMeta == 3 || tMeta == 4 || tMeta == 6;
+ else if (Math.abs(dX) < x) // on side parallel to x axis
+ doorState = tMeta == 0 || tMeta == 2 || tMeta == 5 || tMeta == 7;
+ // corners ignored
+ }
+ mDoorCount++;
+ } else {
+ if (tTileEntity != null) {
+ final IMetaTileEntity aMetaTileEntity = tTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) {
+ if (debugCleanroom) {
+ GT_Log.out.println("Cleanroom: Missing block? Not a aMetaTileEntity");
+ }
+ return false;
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_BasicHull) {
+ mHullCount++;
+ } else {
+ if (debugCleanroom) {
+ GT_Log.out.println(
+ "Cleanroom: Incorrect GT block? " + tBlock.getUnlocalizedName());
+ }
+ return false;
+ }
+ } else {
+ String key = tBlock.getUnlocalizedName() + ":" + tMeta;
+ if (config.containsKey(key)) { // check with meta first
+ otherBlocks.compute(key, (k, v) -> v == null ? 1 : v + 1);
+ } else {
+ key = tBlock.getUnlocalizedName();
+ if (config.containsKey(key)) {
+ otherBlocks.compute(key, (k, v) -> v == null ? 1 : v + 1);
+ } else {
+ if (debugCleanroom) {
+ GT_Log.out.println(
+ "Cleanroom: not allowed block " + tBlock.getUnlocalizedName());
+ }
+ return false;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if (this.mMaintenanceHatches.size() != 1 || this.mEnergyHatches.size() != 1
+ || mDoorCount > 4
+ || mHullCount > 10) {
+ if (debugCleanroom) {
+ GT_Log.out.println("Cleanroom: Incorrect number of doors, hulls, or hatches.");
+ }
+ return false;
+ }
+ if (mPlascreteCount < 20) {
+ if (debugCleanroom) {
+ GT_Log.out.println("Cleanroom: Could not find 20 Plascrete.");
+ }
+ return false;
+ }
+ final float ratio = (((float) mPlascreteCount) / 100f);
+ for (Map.Entry<String, Integer> e : otherBlocks.entrySet()) {
+ final ConfigEntry ce = config.get(e.getKey());
+ if (ce.allowedCount > 0) { // count has priority
+ if (e.getValue() > ce.allowedCount) {
+ if (debugCleanroom) {
+ GT_Log.out.println("Cleanroom: Absolute count too high for a block.");
+ }
+ return false;
+ }
+ } else if (e.getValue() > ratio * ce.percentage) {
+ if (debugCleanroom) {
+ GT_Log.out.println("Cleanroom: Relative count too high for a block.");
+ }
+ return false;
+ }
+ }
+
+ setCleanroomReceivers(x, y, z, aBaseMetaTileEntity);
+
+ if (doorState) {
+ this.mEfficiency = Math.max(0, this.mEfficiency - 200);
+ }
+ for (final ForgeDirection tSide : ForgeDirection.VALID_DIRECTIONS) {
+ final byte t = (byte) Math.max(1, (byte) (15 / (10000f / this.mEfficiency)));
+ aBaseMetaTileEntity.setInternalOutputRedstoneSignal(tSide, t);
+ }
+ this.mHeight = -y;
+ if (debugCleanroom) {
+ GT_Log.out.println("Cleanroom: Check successful.");
+ }
+ return true;
+ }
+
+ private void setCleanroomReceivers(int x, int y, int z, IGregTechTileEntity aBaseMetaTileEntity) {
+ for (int dX = -x + 1; dX <= x - 1; dX++) {
+ for (int dZ = -z + 1; dZ <= z - 1; dZ++) for (int dY = -1; dY >= y + 1; dY--) {
+ TileEntity tTileEntity = aBaseMetaTileEntity.getTileEntityOffset(dX, dY, dZ);
+ if (tTileEntity instanceof ICleanroomReceiver receiver) {
+ receiver.setCleanroom(this);
+ cleanroomReceivers.add(receiver);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean allowGeneralRedstoneOutput() {
+ return true;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ if ((sideDirection.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) != 0) {
+ return new ITexture[] { TextureFactory.of(BLOCK_PLASCRETE), active
+ ? TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_CLEANROOM_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_CLEANROOM_ACTIVE_GLOW)
+ .glow()
+ .build())
+ : TextureFactory.of(
+ TextureFactory.of(OVERLAY_TOP_CLEANROOM),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_CLEANROOM_GLOW)
+ .glow()
+ .build()) };
+ }
+ return new ITexture[] { TextureFactory.of(BLOCK_PLASCRETE) };
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void construct(ItemStack itemStack, boolean b) {
+ int i = Math.min(itemStack.stackSize, 7);
+ IGregTechTileEntity baseEntity = this.getBaseMetaTileEntity();
+ World world = baseEntity.getWorld();
+ int x = baseEntity.getXCoord();
+ int y = baseEntity.getYCoord();
+ int z = baseEntity.getZCoord();
+ int yoff = Math.max(i * 2, 3);
+ for (int X = x - i; X <= x + i; X++) for (int Y = y; Y >= y - yoff; Y--) for (int Z = z - i; Z <= z + i; Z++) {
+ if (X == x && Y == y && Z == z) continue;
+ if (X == x - i || X == x + i || Z == z - i || Z == z + i || Y == y - yoff) {
+ if (b) StructureLibAPI.hintParticle(world, X, Y, Z, GregTech_API.sBlockReinforced, 2);
+ else world.setBlock(X, Y, Z, GregTech_API.sBlockReinforced, 2, 2);
+ } else if (Y == y) {
+ if (b) StructureLibAPI.hintParticle(world, X, Y, Z, GregTech_API.sBlockCasings3, 11);
+ else world.setBlock(X, Y, Z, GregTech_API.sBlockCasings3, 11, 2);
+ }
+ }
+ }
+
+ private static class ConfigEntry {
+
+ final int percentage;
+ final int allowedCount;
+
+ ConfigEntry(int percentage, int count) {
+ this.percentage = percentage;
+ this.allowedCount = count;
+ }
+ }
+
+ private static final HashMap<String, ConfigEntry> config = new HashMap<>();
+ private static final String category = "cleanroom_allowed_blocks";
+
+ private static void setDefaultConfigValues(Configuration cfg) {
+ cfg.get("cleanroom_allowed_blocks.manaGlass", "Name", "tile.manaGlass");
+ cfg.get("cleanroom_allowed_blocks.manaGlass", "Percentage", 50);
+ cfg.get("cleanroom_allowed_blocks.elfGlass", "Name", "tile.elfGlass");
+ cfg.get("cleanroom_allowed_blocks.elfGlass", "Percentage", 50);
+ cfg.get("cleanroom_allowed_blocks.reinforced_glass", "Name", "blockAlloyGlass");
+ cfg.get("cleanroom_allowed_blocks.reinforced_glass", "Percentage", 5);
+ cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass_0", "Name", "BW_GlasBlocks");
+ cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass_0", "Percentage", 50);
+ cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass_0", "Meta", 0);
+ cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass", "Name", "BW_GlasBlocks");
+ cfg.get("cleanroom_allowed_blocks.bw_reinforced_glass", "Percentage", 100);
+ cfg.get("cleanroom_allowed_blocks.elevator", "Name", "tile.openblocks.elevator");
+ cfg.get("cleanroom_allowed_blocks.elevator", "Count", 1);
+ cfg.get("cleanroom_allowed_blocks.travel_anchor", "Name", "tile.blockTravelAnchor");
+ cfg.get("cleanroom_allowed_blocks.travel_anchor", "Count", 1);
+ cfg.get("cleanroom_allowed_blocks.warded_glass", "Name", "tile.blockCosmeticOpaque");
+ cfg.get("cleanroom_allowed_blocks.warded_glass", "Meta", 2);
+ cfg.get("cleanroom_allowed_blocks.warded_glass", "Percentage", 50);
+ }
+
+ public static void loadConfig(Configuration cfg) {
+ if (!cfg.hasCategory(category)) setDefaultConfigValues(cfg);
+ for (ConfigCategory cc : cfg.getCategory(category)
+ .getChildren()) {
+ final String name = cc.get("Name")
+ .getString();
+ if (cc.containsKey("Count")) {
+ if (cc.containsKey("Meta")) config.put(
+ name + ":"
+ + cc.get("Meta")
+ .getInt(),
+ new ConfigEntry(
+ 0,
+ cc.get("Count")
+ .getInt()));
+ else config.put(
+ name,
+ new ConfigEntry(
+ 0,
+ cc.get("Count")
+ .getInt()));
+ } else if (cc.containsKey("Percentage")) {
+ if (cc.containsKey("Meta")) config.put(
+ name + ":"
+ + cc.get("Meta")
+ .getInt(),
+ new ConfigEntry(
+ cc.get("Percentage")
+ .getInt(),
+ 0));
+ else config.put(
+ name,
+ new ConfigEntry(
+ cc.get("Percentage")
+ .getInt(),
+ 0));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller1.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller1.java
new file mode 100644
index 0000000000..e61cfc0feb
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller1.java
@@ -0,0 +1,53 @@
+package gregtech.common.tileentities.machines.multi;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_ConcreteBackfiller1 extends GT_MetaTileEntity_ConcreteBackfillerBase {
+
+ public GT_MetaTileEntity_ConcreteBackfiller1(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_ConcreteBackfiller1(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ return createTooltip("Concrete Backfiller");
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ConcreteBackfiller1(mName);
+ }
+
+ @Override
+ protected ItemList getCasingBlockItem() {
+ return ItemList.Casing_SolidSteel;
+ }
+
+ @Override
+ protected Materials getFrameMaterial() {
+ return Materials.Steel;
+ }
+
+ @Override
+ protected int getCasingTextureIndex() {
+ return 16;
+ }
+
+ @Override
+ protected int getRadius() {
+ return 16;
+ }
+
+ @Override
+ protected int getMinTier() {
+ return 2;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller2.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller2.java
new file mode 100644
index 0000000000..c175d73cb1
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller2.java
@@ -0,0 +1,54 @@
+package gregtech.common.tileentities.machines.multi;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_ConcreteBackfiller2 extends GT_MetaTileEntity_ConcreteBackfillerBase {
+
+ public GT_MetaTileEntity_ConcreteBackfiller2(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_ConcreteBackfiller2(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ return createTooltip("Advanced Concrete Backfiller");
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ConcreteBackfiller2(mName);
+ }
+
+ @Override
+ protected ItemList getCasingBlockItem() {
+ return ItemList.Casing_StableTitanium;
+ }
+
+ @Override
+ protected Materials getFrameMaterial() {
+ return Materials.Titanium;
+ }
+
+ @Override
+ protected int getCasingTextureIndex() {
+ return 50;
+ }
+
+ @Override
+ protected int getRadius() {
+ int tConfig = getTotalConfigValue() * 2;
+ return tConfig >= 128 ? 128 : tConfig <= 0 ? 64 : tConfig;
+ }
+
+ @Override
+ protected int getMinTier() {
+ return 4;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java
new file mode 100644
index 0000000000..e520b87e43
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java
@@ -0,0 +1,180 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_Values.VN;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+
+public abstract class GT_MetaTileEntity_ConcreteBackfillerBase extends GT_MetaTileEntity_DrillerBase {
+
+ private int mLastXOff = 0, mLastZOff = 0;
+
+ /** Used to drive the readout in the GUI for the backfiller's current y-level. */
+ private int clientYHead;
+
+ public GT_MetaTileEntity_ConcreteBackfillerBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ initRecipeResults();
+ }
+
+ public GT_MetaTileEntity_ConcreteBackfillerBase(String aName) {
+ super(aName);
+ initRecipeResults();
+ }
+
+ private void initRecipeResults() {
+ addResultMessage(STATE_UPWARD, true, "backfiller_working");
+ }
+
+ protected GT_Multiblock_Tooltip_Builder createTooltip(String aStructureName) {
+ String casings = getCasingBlockItem().get(0)
+ .getDisplayName();
+
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Concrete Backfiller")
+ .addInfo("Controller Block for the " + aStructureName)
+ .addInfo("Will fill in areas below it with light concrete. This goes through walls")
+ .addInfo("Use it to remove any spawning locations beneath your base to reduce lag")
+ .addInfo("Will pull back the pipes after it finishes that layer")
+ .addInfo("Radius is " + getRadius() + " blocks")
+ .addSeparator()
+ .beginStructureBlock(3, 7, 3, false)
+ .addController("Front bottom")
+ .addOtherStructurePart(casings, "form the 3x1x3 Base")
+ .addOtherStructurePart(casings, "1x3x1 pillar above the center of the base (2 minimum total)")
+ .addOtherStructurePart(getFrameMaterial().mName + " Frame Boxes", "Each pillar's side and 1x3x1 on top")
+ .addEnergyHatch("1x " + VN[getMinTier()] + "+, Any base casing", 1)
+ .addMaintenanceHatch("Any base casing", 1)
+ .addInputBus("Mining Pipes, optional, any base casing", 1)
+ .addInputHatch("GT Concrete, any base casing", 1)
+ .addOutputBus("Mining Pipes, optional, any base casing", 1)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ protected abstract int getRadius();
+
+ @Override
+ protected boolean checkHatches() {
+ return !mMaintenanceHatches.isEmpty() && !mInputHatches.isEmpty() && mEnergyHatches.size() == 1;
+ }
+
+ @Override
+ protected List<IHatchElement<? super GT_MetaTileEntity_DrillerBase>> getAllowedHatches() {
+ return ImmutableList.of(InputHatch, InputBus, Maintenance, Energy);
+ }
+
+ @Override
+ protected void setElectricityStats() {
+ this.mEfficiency = getCurrentEfficiency(null);
+ this.mEfficiencyIncrease = 10000;
+ int tier = Math.max(1, GT_Utility.getTier(getMaxInputVoltage()));
+ this.mEUt = -6 * (1 << (tier << 1));
+ this.mMaxProgresstime = (workState == STATE_UPWARD ? 240 : 80) / (1 << tier);
+ this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime);
+ }
+
+ @Override
+ protected boolean workingUpward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe,
+ int yHead, int oldYHead) {
+ if (isRefillableBlock(xPipe, yHead - 1, zPipe)) return tryRefillBlock(xPipe, yHead - 1, zPipe);
+ int radius = getRadius();
+ if (mLastXOff == 0 && mLastZOff == 0) {
+ mLastXOff = -radius;
+ mLastZOff = -radius;
+ }
+ if (yHead != yDrill) {
+ for (int i = mLastXOff; i <= radius; i++) {
+ for (int j = (i == mLastXOff ? mLastZOff : -radius); j <= radius; j++) {
+ if (isRefillableBlock(xPipe + i, yHead, zPipe + j)) {
+ mLastXOff = i;
+ mLastZOff = j;
+ return tryRefillBlock(xPipe + i, yHead, zPipe + j);
+ }
+ }
+ }
+ }
+
+ if (tryPickPipe()) {
+ mLastXOff = 0;
+ mLastZOff = 0;
+ return true;
+ } else {
+ workState = STATE_DOWNWARD;
+ stopMachine(ShutDownReasonRegistry.NONE);
+ setShutdownReason(StatCollector.translateToLocal("GT5U.gui.text.backfiller_finished"));
+ return false;
+ }
+ }
+
+ private boolean isRefillableBlock(int aX, int aY, int aZ) {
+ IGregTechTileEntity aBaseTile = getBaseMetaTileEntity();
+ if (!aBaseTile.getBlock(aX, aY, aZ)
+ .isAir(aBaseTile.getWorld(), aX, aY, aZ) || aBaseTile.getBlock(aX, aY, aZ)
+ .getMaterial()
+ .isSolid())
+ return false;
+ return GT_Utility
+ .setBlockByFakePlayer(getFakePlayer(aBaseTile), aX, aY, aZ, GregTech_API.sBlockConcretes, 8, true);
+ }
+
+ private boolean tryRefillBlock(int aX, int aY, int aZ) {
+ if (!tryConsumeFluid()) {
+ setRuntimeFailureReason(CheckRecipeResultRegistry.BACKFILLER_NO_CONCRETE);
+ return false;
+ }
+ getBaseMetaTileEntity().getWorld()
+ .setBlock(aX, aY, aZ, GregTech_API.sBlockConcretes, 8, 3);
+ return true;
+ }
+
+ private boolean tryConsumeFluid() {
+ if (!depleteInput(Materials.Concrete.getMolten(144L))) {
+ mMaxProgresstime = 0;
+ return false;
+ }
+ return true;
+ }
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ @Override
+ protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) {
+ super.drawTexts(screenElements, inventorySlot);
+ screenElements
+ .widget(
+ TextWidget
+ .dynamicString(
+ () -> StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.backfiller_current_area",
+ numberFormat.format(clientYHead)))
+ .setSynced(false)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setEnabled(widget -> getBaseMetaTileEntity().isActive() && workState == STATE_UPWARD))
+ .widget(new FakeSyncWidget.IntegerSyncer(this::getYHead, newInt -> clientYHead = newInt))
+ .widget(new FakeSyncWidget.IntegerSyncer(() -> workState, newInt -> workState = newInt));
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DieselEngine.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DieselEngine.java
new file mode 100644
index 0000000000..6c77dc7f0d
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DieselEngine.java
@@ -0,0 +1,416 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DIESEL_ENGINE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.recipe.maps.FuelBackend;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_DieselEngine
+ extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_DieselEngine> implements ISurvivalConstructable {
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final ClassValue<IStructureDefinition<GT_MetaTileEntity_DieselEngine>> STRUCTURE_DEFINITION = new ClassValue<>() {
+
+ @Override
+ protected IStructureDefinition<GT_MetaTileEntity_DieselEngine> computeValue(Class<?> type) {
+ return StructureDefinition.<GT_MetaTileEntity_DieselEngine>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(
+ new String[][] { { "---", "iii", "chc", "chc", "ccc", }, { "---", "i~i", "hgh", "hgh", "cdc", },
+ { "---", "iii", "chc", "chc", "ccc", }, }))
+ .addElement('i', lazy(t -> ofBlock(t.getIntakeBlock(), t.getIntakeMeta())))
+ .addElement('c', lazy(t -> ofBlock(t.getCasingBlock(), t.getCasingMeta())))
+ .addElement('g', lazy(t -> ofBlock(t.getGearboxBlock(), t.getGearboxMeta())))
+ .addElement('d', lazy(t -> Dynamo.newAny(t.getCasingTextureIndex(), 2)))
+ .addElement(
+ 'h',
+ lazy(
+ t -> buildHatchAdder(GT_MetaTileEntity_DieselEngine.class)
+ .atLeast(InputHatch, InputHatch, InputHatch, Muffler, Maintenance)
+ .casingIndex(t.getCasingTextureIndex())
+ .dot(1)
+ .buildAndChain(t.getCasingBlock(), t.getCasingMeta())))
+ .build();
+ }
+ };
+ protected int fuelConsumption = 0;
+ protected int fuelValue = 0;
+ protected int fuelRemaining = 0;
+ protected boolean boostEu = false;
+
+ public GT_MetaTileEntity_DieselEngine(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_DieselEngine(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Combustion Generator")
+ .addInfo("Controller block for the Large Combustion Engine")
+ .addInfo("Supply Diesel Fuels and 1000L of Lubricant per hour to run")
+ .addInfo("Supply 40L/s of Oxygen to boost output (optional)")
+ .addInfo("Default: Produces 2048EU/t at 100% fuel efficiency")
+ .addInfo("Boosted: Produces 6144EU/t at 150% fuel efficiency")
+ .addInfo("You need to wait for it to reach 300% to output full power")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 4, false)
+ .addController("Front center")
+ .addCasingInfoRange("Stable Titanium Machine Casing", 16, 22, false)
+ .addOtherStructurePart("Titanium Gear Box Machine Casing", "Inner 2 blocks")
+ .addOtherStructurePart("Engine Intake Machine Casing", "8x, ring around controller")
+ .addStructureInfo("Engine Intake Casings must not be obstructed in front (only air blocks)")
+ .addDynamoHatch("Back center", 2)
+ .addMaintenanceHatch("One of the casings next to a Gear Box", 1)
+ .addMufflerHatch("Top middle back, above the rear Gear Box", 1)
+ .addInputHatch("Diesel Fuel, next to a Gear Box", 1)
+ .addInputHatch("Lubricant, next to a Gear Box", 1)
+ .addInputHatch("Oxygen, optional, next to a Gear Box", 1)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ if (aActive) return new ITexture[] { casingTexturePages[0][50], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { casingTexturePages[0][50], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_DIESEL_ENGINE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_DIESEL_ENGINE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { casingTexturePages[0][50] };
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return getMaxEfficiency(aStack) > 0;
+ }
+
+ @Override
+ public RecipeMap<FuelBackend> getRecipeMap() {
+ return RecipeMaps.dieselFuels;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ /**
+ * The nominal energy output This can be further multiplied by {@link #getMaxEfficiency(ItemStack)} when boosted
+ */
+ protected int getNominalOutput() {
+ return 2048;
+ }
+
+ protected Materials getBooster() {
+ return Materials.Oxygen;
+ }
+
+ /**
+ * x times fuel will be consumed when boosted This will however NOT increase power output Go tweak
+ * {@link #getMaxEfficiency(ItemStack)} and {@link #getNominalOutput()} instead
+ */
+ protected int getBoostFactor() {
+ return 2;
+ }
+
+ /**
+ * x times of additive will be consumed when boosted
+ */
+ protected int getAdditiveFactor() {
+ return 1;
+ }
+
+ /**
+ * Efficiency will increase by this amount every tick
+ */
+ protected int getEfficiencyIncrease() {
+ return 15;
+ }
+
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ ArrayList<FluidStack> tFluids = getStoredFluids();
+
+ // fast track lookup
+ if (!tFluids.isEmpty()) {
+ double boostedFuelValue = 0;
+ double boostedOutput = 0;
+ double extraFuelFraction = 0;
+ for (FluidStack tFluid : tFluids) {
+ GT_Recipe tRecipe = getRecipeMap().getBackend()
+ .findFuel(tFluid);
+ if (tRecipe == null) continue;
+ fuelValue = tRecipe.mSpecialValue;
+
+ FluidStack tLiquid = tFluid.copy();
+ if (boostEu) {
+ boostedFuelValue = GT_Utility.safeInt((long) (fuelValue * 1.5));
+ boostedOutput = getNominalOutput() * 3;
+
+ fuelConsumption = tLiquid.amount = getBoostFactor() * getNominalOutput() / fuelValue;
+
+ // HOG consumption rate is normally 1 L/t, when it's supposed to be around 1.64 L/t
+ // This code increases fuel consumption by 1 at random, but with a weighted chance
+ if (boostedFuelValue * 2 > boostedOutput) {
+ extraFuelFraction = boostedOutput / boostedFuelValue;
+ extraFuelFraction = extraFuelFraction - (int) extraFuelFraction;
+ double rand = Math.random();
+ if (rand < extraFuelFraction) {
+ tLiquid.amount += 1;
+ }
+ }
+
+ } else {
+ fuelConsumption = tLiquid.amount = getNominalOutput() / fuelValue;
+ }
+
+ // Deplete that amount
+ if (!depleteInput(tLiquid)) return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ boostEu = depleteInput(getBooster().getGas(2L * getAdditiveFactor()));
+
+ // Check to prevent burning HOG without consuming it, if not boosted
+ if (!boostEu && fuelValue > getNominalOutput()) {
+ return SimpleCheckRecipeResult.ofFailure("fuel_quality_too_high");
+ }
+
+ // Deplete Lubricant. 1000L should = 1 hour of runtime (if baseEU = 2048)
+ if ((mRuntime % 72 == 0 || mRuntime == 0)
+ && !depleteInput(Materials.Lubricant.getFluid((boostEu ? 2L : 1L) * getAdditiveFactor())))
+ return SimpleCheckRecipeResult.ofFailure("no_lubricant");
+
+ fuelRemaining = tFluid.amount; // Record available fuel
+ this.mEUt = mEfficiency < 2000 ? 0 : getNominalOutput(); // Output 0 if startup is less than 20%
+ this.mProgresstime = 1;
+ this.mMaxProgresstime = 1;
+ this.mEfficiencyIncrease = getEfficiencyIncrease();
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+ }
+ this.mEUt = 0;
+ this.mEfficiency = 0;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_DieselEngine> getStructureDefinition() {
+ return STRUCTURE_DEFINITION.get(getClass());
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ return checkPiece(STRUCTURE_PIECE_MAIN, 1, 1, 1) && !mMufflerHatches.isEmpty()
+ && mMaintenanceHatches.size() == 1;
+ }
+
+ public Block getCasingBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ public byte getCasingMeta() {
+ return 2;
+ }
+
+ public Block getIntakeBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ public byte getIntakeMeta() {
+ return 13;
+ }
+
+ public Block getGearboxBlock() {
+ return GregTech_API.sBlockCasings2;
+ }
+
+ public byte getGearboxMeta() {
+ return 4;
+ }
+
+ public byte getCasingTextureIndex() {
+ return 50;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_DieselEngine(this.mName);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return boostEu ? 30000 : 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return GT_Mod.gregtechproxy.mPollutionLargeCombustionEnginePerSecond;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ int mPollutionReduction = 0;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction);
+ }
+
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ return new String[] { EnumChatFormatting.BLUE + "Diesel Engine" + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ getIdealStatus() == getRepairStatus()
+ ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false")
+ + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true")
+ + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.engine.output") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(((long) mEUt * mEfficiency / 10000))
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ StatCollector.translateToLocal("GT5U.engine.consumption") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(fuelConsumption)
+ + EnumChatFormatting.RESET
+ + " L/t",
+ StatCollector.translateToLocal("GT5U.engine.value") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(fuelValue)
+ + EnumChatFormatting.RESET
+ + " EU/L",
+ StatCollector.translateToLocal("GT5U.turbine.fuel") + ": "
+ + EnumChatFormatting.GOLD
+ + GT_Utility.formatNumbers(fuelRemaining)
+ + EnumChatFormatting.RESET
+ + " L",
+ StatCollector.translateToLocal("GT5U.engine.efficiency") + ": "
+ + EnumChatFormatting.YELLOW
+ + (mEfficiency / 100F)
+ + EnumChatFormatting.YELLOW
+ + " %",
+ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": "
+ + EnumChatFormatting.GREEN
+ + mPollutionReduction
+ + EnumChatFormatting.RESET
+ + " %" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 1, 1);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 1, 1, elementBudget, env, false, true);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java
new file mode 100644
index 0000000000..dfc3a4928d
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DistillationTower.java
@@ -0,0 +1,367 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.isAir;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_DISTILLATION_TOWER_GLOW;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Output_ME;
+
+public class GT_MetaTileEntity_DistillationTower extends
+ GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_DistillationTower> implements ISurvivalConstructable {
+
+ protected static final int CASING_INDEX = 49;
+ protected static final String STRUCTURE_PIECE_BASE = "base";
+ protected static final String STRUCTURE_PIECE_LAYER = "layer";
+ protected static final String STRUCTURE_PIECE_LAYER_HINT = "layerHint";
+ protected static final String STRUCTURE_PIECE_TOP_HINT = "topHint";
+ private static final IStructureDefinition<GT_MetaTileEntity_DistillationTower> STRUCTURE_DEFINITION;
+
+ static {
+ IHatchElement<GT_MetaTileEntity_DistillationTower> layeredOutputHatch = OutputHatch
+ .withCount(GT_MetaTileEntity_DistillationTower::getCurrentLayerOutputHatchCount)
+ .withAdder(GT_MetaTileEntity_DistillationTower::addLayerOutputHatch);
+ STRUCTURE_DEFINITION = StructureDefinition.<GT_MetaTileEntity_DistillationTower>builder()
+ .addShape(STRUCTURE_PIECE_BASE, transpose(new String[][] { { "b~b", "bbb", "bbb" }, }))
+ .addShape(STRUCTURE_PIECE_LAYER, transpose(new String[][] { { "lll", "lcl", "lll" }, }))
+ .addShape(STRUCTURE_PIECE_LAYER_HINT, transpose(new String[][] { { "lll", "l-l", "lll" }, }))
+ .addShape(STRUCTURE_PIECE_TOP_HINT, transpose(new String[][] { { "LLL", "LLL", "LLL" }, }))
+ .addElement(
+ 'b',
+ ofChain(
+ buildHatchAdder(GT_MetaTileEntity_DistillationTower.class)
+ .atLeast(Energy, OutputBus, InputHatch, InputBus, Maintenance)
+ .casingIndex(CASING_INDEX)
+ .dot(1)
+ .build(),
+ onElementPass(
+ GT_MetaTileEntity_DistillationTower::onCasingFound,
+ ofBlock(GregTech_API.sBlockCasings4, 1))))
+ .addElement(
+ 'l',
+ ofChain(
+ buildHatchAdder(GT_MetaTileEntity_DistillationTower.class).atLeast(layeredOutputHatch)
+ .casingIndex(CASING_INDEX)
+ .dot(2)
+ .disallowOnly(ForgeDirection.UP, ForgeDirection.DOWN)
+ .build(),
+ ofHatchAdder(GT_MetaTileEntity_DistillationTower::addEnergyInputToMachineList, CASING_INDEX, 2),
+ ofHatchAdder(GT_MetaTileEntity_DistillationTower::addLayerOutputHatch, CASING_INDEX, 2),
+ ofHatchAdder(GT_MetaTileEntity_DistillationTower::addMaintenanceToMachineList, CASING_INDEX, 2),
+ onElementPass(
+ GT_MetaTileEntity_DistillationTower::onCasingFound,
+ ofBlock(GregTech_API.sBlockCasings4, 1))))
+ // hint element only used in top layer
+ .addElement(
+ 'L',
+ buildHatchAdder(GT_MetaTileEntity_DistillationTower.class).atLeast(layeredOutputHatch)
+ .casingIndex(CASING_INDEX)
+ .dot(2)
+ .disallowOnly(ForgeDirection.UP)
+ .buildAndChain(GregTech_API.sBlockCasings4, 1))
+ .addElement(
+ 'c',
+ ofChain(
+ onElementPass(
+ t -> t.onTopLayerFound(false),
+ ofHatchAdder(GT_MetaTileEntity_DistillationTower::addOutputToMachineList, CASING_INDEX, 3)),
+ onElementPass(
+ t -> t.onTopLayerFound(false),
+ ofHatchAdder(
+ GT_MetaTileEntity_DistillationTower::addMaintenanceToMachineList,
+ CASING_INDEX,
+ 3)),
+ onElementPass(t -> t.onTopLayerFound(true), ofBlock(GregTech_API.sBlockCasings4, 1)),
+ isAir()))
+ .build();
+ }
+
+ protected final List<List<GT_MetaTileEntity_Hatch_Output>> mOutputHatchesByLayer = new ArrayList<>();
+ protected int mHeight;
+ protected int mCasing;
+ protected boolean mTopLayerFound;
+
+ public GT_MetaTileEntity_DistillationTower(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_DistillationTower(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_DistillationTower(this.mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Distillery")
+ .addInfo("Controller block for the Distillation Tower")
+ .addInfo("Fluids are only put out at the correct height")
+ .addInfo("The correct height equals the slot number in the NEI recipe")
+ .addSeparator()
+ .beginVariableStructureBlock(3, 3, 3, 12, 3, 3, true)
+ .addController("Front bottom")
+ .addOtherStructurePart("Clean Stainless Steel Machine Casing", "7 x h - 5 (minimum)")
+ .addEnergyHatch("Any casing except top centre", 1, 2)
+ .addMaintenanceHatch("Any casing", 1, 2, 3)
+ .addInputHatch("Any bottom layer casing", 1)
+ .addOutputBus("Any bottom layer casing", 1)
+ .addOutputHatch("2-11x Output Hatches (At least one per layer except bottom layer)", 2, 3)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ if (sideDirection == facingDirection) {
+ if (active) return new ITexture[] { BlockIcons.getCasingTextureForId(CASING_INDEX), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { BlockIcons.getCasingTextureForId(CASING_INDEX), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX) };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.distillationTowerRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic();
+ }
+
+ protected void onCasingFound() {
+ mCasing++;
+ }
+
+ protected void onTopLayerFound(boolean aIsCasing) {
+ mTopLayerFound = true;
+ if (aIsCasing) onCasingFound();
+ }
+
+ protected int getCurrentLayerOutputHatchCount() {
+ return mOutputHatchesByLayer.size() < mHeight || mHeight <= 0 ? 0
+ : mOutputHatchesByLayer.get(mHeight - 1)
+ .size();
+ }
+
+ protected boolean addLayerOutputHatch(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null || aTileEntity.isDead()
+ || !(aTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_Hatch_Output tHatch)) return false;
+ while (mOutputHatchesByLayer.size() < mHeight) mOutputHatchesByLayer.add(new ArrayList<>());
+ tHatch.updateTexture(aBaseCasingIndex);
+ return mOutputHatchesByLayer.get(mHeight - 1)
+ .add(tHatch);
+ }
+
+ @Override
+ public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
+ return getFluidOutputSlotsByLayer(toOutput, mOutputHatchesByLayer);
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ // don't rotate a freaking tower, it won't work
+ return (d, r, f) -> (d.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 && r.isNotRotated()
+ && !f.isVerticallyFliped();
+ }
+
+ @Override
+ public boolean isRotationChangeAllowed() {
+ return false;
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_DistillationTower> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ // reset
+ mOutputHatchesByLayer.forEach(List::clear);
+ mHeight = 1;
+ mTopLayerFound = false;
+ mCasing = 0;
+
+ // check base
+ if (!checkPiece(STRUCTURE_PIECE_BASE, 1, 0, 0)) return false;
+
+ // check each layer
+ while (mHeight < 12) {
+ if (!checkPiece(STRUCTURE_PIECE_LAYER, 1, mHeight, 0)) {
+ return false;
+ }
+ if (mOutputHatchesByLayer.size() < mHeight || mOutputHatchesByLayer.get(mHeight - 1)
+ .isEmpty())
+ // layer without output hatch
+ return false;
+ if (mTopLayerFound) {
+ break;
+ }
+ // not top
+ mHeight++;
+ }
+
+ // validate final invariants... (actual height is mHeight+1)
+ return mCasing >= 7 * (mHeight + 1) - 5 && mHeight + 1 >= 3
+ && mTopLayerFound
+ && mMaintenanceHatches.size() == 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ protected void addFluidOutputs(FluidStack[] mOutputFluids2) {
+ for (int i = 0; i < mOutputFluids2.length && i < mOutputHatchesByLayer.size(); i++) {
+ final FluidStack fluidStack = mOutputFluids2[i];
+ if (fluidStack == null) continue;
+ FluidStack tStack = fluidStack.copy();
+ if (!dumpFluid(mOutputHatchesByLayer.get(i), tStack, true))
+ dumpFluid(mOutputHatchesByLayer.get(i), tStack, false);
+ }
+ }
+
+ @Override
+ public boolean canDumpFluidToME() {
+ // All fluids can be dumped to ME only if each layer contains a ME Output Hatch.
+ return this.mOutputHatchesByLayer.stream()
+ .allMatch(
+ tLayerOutputHatches -> tLayerOutputHatches.stream()
+ .anyMatch(tHatch -> tHatch instanceof GT_MetaTileEntity_Hatch_Output_ME));
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_BASE, stackSize, hintsOnly, 1, 0, 0);
+ int tTotalHeight = Math.min(12, stackSize.stackSize + 2); // min 2 output layer, so at least 1 + 2 height
+ for (int i = 1; i < tTotalHeight - 1; i++) {
+ buildPiece(STRUCTURE_PIECE_LAYER_HINT, stackSize, hintsOnly, 1, i, 0);
+ }
+ buildPiece(STRUCTURE_PIECE_TOP_HINT, stackSize, hintsOnly, 1, tTotalHeight - 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ mHeight = 0;
+ int built = survivialBuildPiece(STRUCTURE_PIECE_BASE, stackSize, 1, 0, 0, elementBudget, env, false, true);
+ if (built >= 0) return built;
+ int tTotalHeight = Math.min(12, stackSize.stackSize + 2); // min 2 output layer, so at least 1 + 2 height
+ for (int i = 1; i < tTotalHeight - 1; i++) {
+ mHeight = i;
+ built = survivialBuildPiece(
+ STRUCTURE_PIECE_LAYER_HINT,
+ stackSize,
+ 1,
+ i,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ if (built >= 0) return built;
+ }
+ mHeight = tTotalHeight - 1;
+ return survivialBuildPiece(
+ STRUCTURE_PIECE_TOP_HINT,
+ stackSize,
+ 1,
+ tTotalHeight - 1,
+ 0,
+ elementBudget,
+ env,
+ false,
+ true);
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.GT_MACHINES_DISTILLERY_LOOP;
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java
new file mode 100644
index 0000000000..db58a1152e
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java
@@ -0,0 +1,985 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.GT_Values.W;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.getCasingTextureForId;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofFrame;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraftforge.common.util.FakePlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.widgets.GT_LockedWhileActiveButton;
+import gregtech.api.interfaces.IChunkLoader;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.objects.GT_ChunkManager;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.IGT_HatchAdder;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+
+public abstract class GT_MetaTileEntity_DrillerBase
+ extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_DrillerBase>
+ implements IChunkLoader, ISurvivalConstructable {
+
+ private static final ItemStack miningPipe = GT_ModHandler.getIC2Item("miningPipe", 0);
+ private static final ItemStack miningPipeTip = GT_ModHandler.getIC2Item("miningPipeTip", 0);
+ private static final Block miningPipeBlock = GT_Utility.getBlockFromStack(miningPipe);
+ private static final Block miningPipeTipBlock = GT_Utility.getBlockFromStack(miningPipeTip);
+ protected static final String STRUCTURE_PIECE_MAIN = "main";
+ protected static final ClassValue<IStructureDefinition<GT_MetaTileEntity_DrillerBase>> STRUCTURE_DEFINITION = new ClassValue<>() {
+
+ @Override
+ protected IStructureDefinition<GT_MetaTileEntity_DrillerBase> computeValue(Class<?> type) {
+ return StructureDefinition.<GT_MetaTileEntity_DrillerBase>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(
+ new String[][] { { " ", " f ", " " }, { " ", " f ", " " }, { " ", " f ", " " },
+ { " f ", "fcf", " f " }, { " f ", "fcf", " f " }, { " f ", "fcf", " f " },
+ { "b~b", "bbb", "bbb" }, }))
+ .addElement('f', lazy(t -> ofFrame(t.getFrameMaterial())))
+ .addElement(
+ 'c',
+ lazy(
+ t -> ofBlock(
+ t.getCasingBlockItem()
+ .getBlock(),
+ t.getCasingBlockItem()
+ .get(0)
+ .getItemDamage())))
+ .addElement(
+ 'b',
+ lazy(
+ t -> buildHatchAdder(GT_MetaTileEntity_DrillerBase.class).atLeastList(t.getAllowedHatches())
+ .adder(GT_MetaTileEntity_DrillerBase::addToMachineList)
+ .casingIndex(t.casingTextureIndex)
+ .dot(1)
+ .buildAndChain(
+ t.getCasingBlockItem()
+ .getBlock(),
+ t.getCasingBlockItem()
+ .get(0)
+ .getItemDamage())))
+ .build();
+ }
+ };
+
+ private Block casingBlock;
+ private int casingMeta;
+ private int frameMeta;
+ protected int casingTextureIndex;
+ protected boolean isPickingPipes;
+
+ private ForgeDirection back;
+
+ private int xDrill, yDrill, zDrill, xPipe, zPipe, yHead;
+
+ protected int getXDrill() {
+ return xDrill;
+ }
+
+ protected int getZDrill() {
+ return zDrill;
+ }
+
+ protected int getYHead() {
+ return yHead;
+ }
+
+ protected int workState;
+ protected static final int STATE_DOWNWARD = 0, STATE_AT_BOTTOM = 1, STATE_UPWARD = 2, STATE_ABORT = 3;
+
+ protected boolean mChunkLoadingEnabled = true;
+ protected ChunkCoordIntPair mCurrentChunk = null;
+ protected boolean mWorkChunkNeedsReload = true;
+
+ /** Stores default result messages for success/failures of each work state. */
+ private final Map<ResultRegistryKey, CheckRecipeResult> resultRegistry = new HashMap<>();
+
+ /** Allows inheritors to supply custom runtime failure messages. */
+ private CheckRecipeResult runtimeFailure = null;
+ private CheckRecipeResult lastRuntimeFailure = null;
+
+ /** Allows inheritors to supply custom shutdown failure messages. */
+ private @NotNull String shutdownReason = "";
+
+ /** Allows inheritors to suppress wiping the last error if the machine is forcibly turned off. */
+ protected boolean suppressErrorWipe = false;
+
+ public GT_MetaTileEntity_DrillerBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ initFields();
+ }
+
+ public GT_MetaTileEntity_DrillerBase(String aName) {
+ super(aName);
+ initFields();
+ }
+
+ private void initFields() {
+ casingBlock = getCasingBlockItem().getBlock();
+ casingMeta = getCasingBlockItem().get(0)
+ .getItemDamage();
+ int frameId = 4096 + getFrameMaterial().mMetaItemSubID;
+ frameMeta = GregTech_API.METATILEENTITIES[frameId] != null
+ ? GregTech_API.METATILEENTITIES[frameId].getTileEntityBaseType()
+ : W;
+ casingTextureIndex = getCasingTextureIndex();
+ workState = STATE_DOWNWARD;
+
+ // Inheritors can overwrite these to add custom operating messages.
+ addResultMessage(STATE_DOWNWARD, true, "deploying_pipe");
+ addResultMessage(STATE_DOWNWARD, false, "extracting_pipe");
+ addResultMessage(STATE_AT_BOTTOM, true, "drilling");
+ addResultMessage(STATE_AT_BOTTOM, false, "no_mining_pipe");
+ addResultMessage(STATE_UPWARD, true, "retracting_pipe");
+ addResultMessage(STATE_UPWARD, false, "drill_generic_finished");
+ addResultMessage(STATE_ABORT, true, "retracting_pipe");
+ addResultMessage(STATE_ABORT, false, "drill_retract_pipes_finished");
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ if (sideDirection == facingDirection) {
+ if (active) return new ITexture[] { getCasingTextureForId(casingTextureIndex), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ORE_DRILL_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ORE_DRILL_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { getCasingTextureForId(casingTextureIndex), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ORE_DRILL)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ORE_DRILL_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { getCasingTextureForId(casingTextureIndex) };
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("workState", workState);
+ aNBT.setBoolean("chunkLoadingEnabled", mChunkLoadingEnabled);
+ aNBT.setBoolean("isChunkloading", mCurrentChunk != null);
+ if (mCurrentChunk != null) {
+ aNBT.setInteger("loadedChunkXPos", mCurrentChunk.chunkXPos);
+ aNBT.setInteger("loadedChunkZPos", mCurrentChunk.chunkZPos);
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ workState = aNBT.getInteger("workState");
+ if (aNBT.hasKey("isPickingPipes"))
+ workState = aNBT.getBoolean("isPickingPipes") ? STATE_UPWARD : STATE_DOWNWARD;
+ if (aNBT.hasKey("chunkLoadingEnabled")) mChunkLoadingEnabled = aNBT.getBoolean("chunkLoadingEnabled");
+ if (aNBT.getBoolean("isChunkloading")) {
+ mCurrentChunk = new ChunkCoordIntPair(
+ aNBT.getInteger("loadedChunkXPos"),
+ aNBT.getInteger("loadedChunkZPos"));
+ }
+ }
+
+ @Override
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide,
+ EntityPlayer entityPlayer, float aX, float aY, float aZ) {
+ if (side == getBaseMetaTileEntity().getFrontFacing()) {
+ mChunkLoadingEnabled = !mChunkLoadingEnabled;
+ GT_Utility.sendChatToPlayer(
+ entityPlayer,
+ mChunkLoadingEnabled ? GT_Utility.trans("502", "Mining chunk loading enabled")
+ : GT_Utility.trans("503", "Mining chunk loading disabled"));
+ return true;
+ }
+ return super.onSolderingToolRightClick(side, wrenchingSide, entityPlayer, aX, aY, aZ);
+ }
+
+ @Override
+ public void onRemoval() {
+ if (mChunkLoadingEnabled) GT_ChunkManager.releaseTicket((TileEntity) getBaseMetaTileEntity());
+ super.onRemoval();
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide() && mCurrentChunk != null
+ && !mWorkChunkNeedsReload
+ && !aBaseMetaTileEntity.isAllowedToWork()) {
+ // if machine has stopped, stop chunkloading
+ GT_ChunkManager.releaseTicket((TileEntity) aBaseMetaTileEntity);
+ mWorkChunkNeedsReload = true;
+ }
+ }
+
+ protected boolean tryPickPipe() {
+ if (yHead == yDrill) return isPickingPipes = false;
+ if (tryOutputPipe()) {
+ if (checkBlockAndMeta(xPipe, yHead + 1, zPipe, miningPipeBlock, W)) getBaseMetaTileEntity().getWorld()
+ .setBlock(xPipe, yHead + 1, zPipe, miningPipeTipBlock);
+ getBaseMetaTileEntity().getWorld()
+ .setBlockToAir(xPipe, yHead, zPipe);
+ return isPickingPipes = true;
+ }
+ return isPickingPipes = false;
+ }
+
+ /**
+ * Added for compability reasons
+ *
+ * @return true if the state is 0 false otherwise.
+ * @deprecated compatibility reason
+ */
+ @Deprecated
+ protected boolean tryLowerPipe() {
+ return tryLowerPipeState(false) == 0;
+ }
+
+ /**
+ * @return 0 for succeeded, 1 for invalid block, 2 for not having mining pipes, 3 for event canceled.
+ */
+ protected int tryLowerPipeState() {
+ return tryLowerPipeState(false);
+ }
+
+ /**
+ * @return 0 for succeeded, 1 for invalid block, 2 for not having mining pipes, 3 for event canceled.
+ */
+ protected int tryLowerPipeState(boolean isSimulating) {
+ if (!isHasMiningPipes()) return 2;
+ switch (canLowerPipe()) {
+ case 1 -> {
+ return 1;
+ }
+ case 2 -> {
+ return 3;
+ }
+ }
+
+ Block b = getBaseMetaTileEntity().getBlock(xPipe, yHead - 1, zPipe);
+ if (b != miningPipeTipBlock && !GT_Utility.setBlockByFakePlayer(
+ getFakePlayer(getBaseMetaTileEntity()),
+ xPipe,
+ yHead - 1,
+ zPipe,
+ miningPipeTipBlock,
+ 0,
+ isSimulating)) return 3;
+ if (!isSimulating) {
+ if (yHead != yDrill) getBaseMetaTileEntity().getWorld()
+ .setBlock(xPipe, yHead, zPipe, miningPipeBlock);
+ if (b != miningPipeBlock && b != miningPipeTipBlock) getBaseMetaTileEntity().decrStackSize(1, 1);
+ }
+
+ return 0;
+ }
+
+ private void putMiningPipesFromInputsInController() {
+ int maxPipes = miningPipe.getMaxStackSize();
+ if (isHasMiningPipes(maxPipes)) return;
+
+ ItemStack pipes = getStackInSlot(1);
+ if (pipes != null && !pipes.isItemEqual(miningPipe)) return;
+ for (ItemStack storedItem : getStoredInputs()) {
+ if (!storedItem.isItemEqual(miningPipe)) continue;
+
+ if (pipes == null) {
+ setInventorySlotContents(1, GT_Utility.copyOrNull(miningPipe));
+ pipes = getStackInSlot(1);
+ }
+
+ if (pipes.stackSize == maxPipes) break;
+
+ int needPipes = maxPipes - pipes.stackSize;
+ int transferPipes = Math.min(storedItem.stackSize, needPipes);
+
+ pipes.stackSize += transferPipes;
+ storedItem.stackSize -= transferPipes;
+ }
+ updateSlots();
+ }
+
+ private boolean tryOutputPipe() {
+ if (!getBaseMetaTileEntity().addStackToSlot(1, GT_Utility.copyAmount(1, miningPipe)))
+ mOutputItems = new ItemStack[] { GT_Utility.copyAmount(1, miningPipe) };
+ return true;
+ }
+
+ /**
+ * @return 0 for available, 1 for invalid block, 2 for event canceled.
+ */
+ protected int canLowerPipe() {
+ IGregTechTileEntity aBaseTile = getBaseMetaTileEntity();
+ if (yHead > 0 && GT_Utility.getBlockHardnessAt(aBaseTile.getWorld(), xPipe, yHead - 1, zPipe) >= 0) {
+ return GT_Utility.eraseBlockByFakePlayer(getFakePlayer(aBaseTile), xPipe, yHead - 1, zPipe, true) ? 0 : 2;
+ }
+ return 1;
+ }
+
+ protected boolean reachingVoidOrBedrock() {
+ return yHead <= 0 || checkBlockAndMeta(xPipe, yHead - 1, zPipe, Blocks.bedrock, W);
+ }
+
+ private boolean isHasMiningPipes() {
+ return isHasMiningPipes(1);
+ }
+
+ private boolean isHasMiningPipes(int minCount) {
+ ItemStack pipe = getStackInSlot(1);
+ return pipe != null && pipe.stackSize > minCount - 1 && pipe.isItemEqual(miningPipe);
+ }
+
+ /**
+ * @deprecated Readded for compability
+ * @return if no pipes are present
+ */
+ @Deprecated
+ protected boolean waitForPipes() {
+ return !isHasMiningPipes();
+ }
+
+ private boolean isEnergyEnough() {
+ long requiredEnergy = 512 + getMaxInputVoltage() * 4;
+ for (GT_MetaTileEntity_Hatch_Energy energyHatch : mEnergyHatches) {
+ requiredEnergy -= energyHatch.getEUVar();
+ if (requiredEnergy <= 0) return true;
+ }
+ return false;
+ }
+
+ protected boolean workingDownward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe,
+ int yHead, int oldYHead) {
+ switch (tryLowerPipeState()) {
+ case 2 -> {
+ mMaxProgresstime = 0;
+ setRuntimeFailureReason(CheckRecipeResultRegistry.MISSING_MINING_PIPE);
+ return false;
+ }
+ case 3 -> {
+ workState = STATE_UPWARD;
+ return true;
+ }
+ case 1 -> {
+ workState = STATE_AT_BOTTOM;
+ return true;
+ }
+ default -> {
+ return true;
+ }
+ }
+ }
+
+ protected boolean workingAtBottom(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe,
+ int yHead, int oldYHead) {
+ if (tryLowerPipeState(true) == 0) {
+ workState = STATE_DOWNWARD;
+ return true;
+ }
+ workState = STATE_UPWARD;
+ return true;
+ }
+
+ protected boolean workingUpward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe,
+ int yHead, int oldYHead) {
+ if (tryPickPipe()) {
+ return true;
+ } else {
+ workState = STATE_DOWNWARD;
+ stopMachine(ShutDownReasonRegistry.NONE);
+ return false;
+ }
+ }
+
+ /** Called once when the abort button is clicked. Use to perform any needed cleanup (e.g. unloading chunks.) */
+ protected void onAbort() {}
+
+ protected void abortDrilling() {
+ if (workState != STATE_ABORT) {
+ workState = STATE_ABORT;
+ onAbort();
+ setShutdownReason("");
+
+ if (!isAllowedToWork()) {
+ enableWorking();
+ }
+ }
+ }
+
+ // This is a distinct state from workingUpward, because some inheritors (like concrete backfiller) operate
+ // exclusively on the workingUpward phase. It also allows for more distinct status messages.
+ protected boolean workingToAbortOperation(@NotNull ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe,
+ int zPipe, int yHead, int oldYHead) {
+ if (tryPickPipe()) {
+ return true;
+ } else {
+ workState = STATE_DOWNWARD;
+ stopMachine(ShutDownReasonRegistry.NONE);
+ return false;
+ }
+ }
+
+ @Override
+ public void enableWorking() {
+ super.enableWorking();
+ shutdownReason = "";
+ }
+
+ @Override
+ public void onDisableWorking() {
+ if (suppressErrorWipe) {
+ suppressErrorWipe = false;
+ } else {
+ super.onDisableWorking();
+ }
+ }
+
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ ItemStack controllerStack = getControllerSlot();
+ // Public pipe actions
+ setElectricityStats();
+ int oldYHead = yHead;
+ if (!checkPipesAndSetYHead()) {
+ stopMachine(ShutDownReasonRegistry.NONE);
+ return SimpleCheckRecipeResult.ofFailure("no_mining_pipe");
+ } else if (!isEnergyEnough()) {
+ stopMachine(ShutDownReasonRegistry.NONE);
+ return SimpleCheckRecipeResult.ofFailure("not_enough_energy");
+ }
+ putMiningPipesFromInputsInController();
+
+ final boolean wasSuccessful;
+ switch (workState) {
+ case STATE_DOWNWARD -> wasSuccessful = workingDownward(
+ controllerStack,
+ xDrill,
+ yDrill,
+ zDrill,
+ xPipe,
+ zPipe,
+ yHead,
+ oldYHead);
+ case STATE_AT_BOTTOM -> wasSuccessful = workingAtBottom(
+ controllerStack,
+ xDrill,
+ yDrill,
+ zDrill,
+ xPipe,
+ zPipe,
+ yHead,
+ oldYHead);
+ case STATE_UPWARD -> wasSuccessful = workingUpward(
+ controllerStack,
+ xDrill,
+ yDrill,
+ zDrill,
+ xPipe,
+ zPipe,
+ yHead,
+ oldYHead);
+ case STATE_ABORT -> wasSuccessful = workingToAbortOperation(
+ controllerStack,
+ xDrill,
+ yDrill,
+ zDrill,
+ xPipe,
+ zPipe,
+ yHead,
+ oldYHead);
+ default -> wasSuccessful = false;
+ }
+
+ if (runtimeFailure == null) {
+ if (wasSuccessful) {
+ lastRuntimeFailure = null;
+ }
+
+ return resultRegistry.getOrDefault(
+ new ResultRegistryKey(workState, wasSuccessful),
+ SimpleCheckRecipeResult.ofFailure("no_mining_pipe"));
+ } else {
+ final CheckRecipeResult result;
+ result = lastRuntimeFailure = runtimeFailure;
+ runtimeFailure = null;
+ return result;
+ }
+ }
+
+ /**
+ * Allow drills to set a specific failure reason specific to their situation. E.g.: out of drilling fluid.
+ * Should be used when the machine doesn't turn off due to the failure.
+ *
+ * @param newFailureReason A new failure reason
+ */
+ protected void setRuntimeFailureReason(@NotNull CheckRecipeResult newFailureReason) {
+ runtimeFailure = newFailureReason;
+ }
+
+ /**
+ * Gets a reason for why the drill turned off, for use in UIs and such.
+ *
+ * @return A reason, or empty if the machine is active or there is no message set yet.
+ */
+ @NotNull
+ protected Optional<String> getFailureReason() {
+ if (getBaseMetaTileEntity().isActive()) {
+ return Optional.empty();
+ }
+
+ if (!shutdownReason.isEmpty()) {
+ return Optional.of(shutdownReason);
+ }
+
+ return Optional.ofNullable(lastRuntimeFailure)
+ .map(CheckRecipeResult::getDisplayString);
+ }
+
+ /**
+ * Sets a line in the UI to explain why the drill shut down. E.g.: operation finished.
+ * Should be used when the machine has been turned off due to an operating issue or completion.
+ *
+ * @param newReason The reason for the machine shutdown
+ */
+ protected void setShutdownReason(@NotNull String newReason) {
+ shutdownReason = newReason;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> (d.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 && r.isNotRotated()
+ && !f.isVerticallyFliped();
+ }
+
+ @Override
+ public boolean isRotationChangeAllowed() {
+ return false;
+ }
+
+ @Override
+ public final IStructureDefinition<GT_MetaTileEntity_DrillerBase> getStructureDefinition() {
+ return STRUCTURE_DEFINITION.get(getClass());
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ updateCoordinates();
+ return checkPiece(STRUCTURE_PIECE_MAIN, 1, 6, 0) && checkHatches()
+ && GT_Utility.getTier(getMaxInputVoltage()) >= getMinTier()
+ && mMaintenanceHatches.size() == 1;
+ }
+
+ private void updateCoordinates() {
+ xDrill = getBaseMetaTileEntity().getXCoord();
+ yDrill = getBaseMetaTileEntity().getYCoord();
+ zDrill = getBaseMetaTileEntity().getZCoord();
+ back = getBaseMetaTileEntity().getBackFacing();
+ xPipe = xDrill + back.offsetX;
+ zPipe = zDrill + back.offsetZ;
+ }
+
+ private boolean checkPipesAndSetYHead() {
+ yHead = yDrill - 1;
+ while (checkBlockAndMeta(xPipe, yHead, zPipe, miningPipeBlock, W)) yHead--; // skip pipes
+ // is pipe tip OR is controller layer
+ if (checkBlockAndMeta(xPipe, yHead, zPipe, miningPipeTipBlock, W) || ++yHead == yDrill) return true;
+ // pipe column is broken - try fix
+ getBaseMetaTileEntity().getWorld()
+ .setBlock(xPipe, yHead, zPipe, miningPipeTipBlock);
+ return true;
+ }
+
+ @Deprecated
+ protected boolean checkCasingBlock(int xOff, int yOff, int zOff) {
+ return checkBlockAndMetaOffset(xOff, yOff, zOff, casingBlock, casingMeta);
+ }
+
+ // meta of frame is getTileEntityBaseType; frame should be checked using its drops (possible a high weight
+ // operation)
+ @Deprecated
+ protected boolean checkFrameBlock(int xOff, int yOff, int zOff) {
+ return checkBlockAndMetaOffset(xOff, yOff, zOff, GregTech_API.sBlockMachines, frameMeta);
+ }
+
+ @Deprecated
+ protected boolean checkBlockAndMetaOffset(int xOff, int yOff, int zOff, Block block, int meta) {
+ return checkBlockAndMeta(xDrill + xOff, yDrill + yOff, zDrill + zOff, block, meta);
+ }
+
+ private boolean checkBlockAndMeta(int x, int y, int z, Block block, int meta) {
+ return (meta == W || getBaseMetaTileEntity().getMetaID(x, y, z) == meta)
+ && getBaseMetaTileEntity().getBlock(x, y, z) == block;
+ }
+
+ private FakePlayer mFakePlayer = null;
+
+ protected FakePlayer getFakePlayer(IGregTechTileEntity aBaseTile) {
+ if (mFakePlayer == null) mFakePlayer = GT_Utility.getFakePlayer(aBaseTile);
+ mFakePlayer.setWorld(aBaseTile.getWorld());
+ mFakePlayer.setPosition(aBaseTile.getXCoord(), aBaseTile.getYCoord(), aBaseTile.getZCoord());
+ return mFakePlayer;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ protected abstract ItemList getCasingBlockItem();
+
+ @Deprecated
+ protected String getCasingName() {
+ return null;
+ }
+
+ protected abstract Materials getFrameMaterial();
+
+ protected abstract int getCasingTextureIndex();
+
+ protected abstract int getMinTier();
+
+ protected abstract boolean checkHatches();
+
+ protected abstract void setElectricityStats();
+
+ public int getTotalConfigValue() {
+ int config = 0;
+ ArrayList<ItemStack> tCircuitList = getDataItems(1);
+ for (ItemStack tCircuit : tCircuitList) config += tCircuit.getItemDamage();
+ return config;
+ }
+
+ public ArrayList<GT_MetaTileEntity_Hatch_DataAccess> mDataAccessHatches = new ArrayList<>();
+
+ /**
+ * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb
+ */
+ private boolean isCorrectDataItem(ItemStack aStack, int state) {
+ if ((state & 1) != 0 && ItemList.Circuit_Integrated.isStackEqual(aStack, true, true)) return true;
+ if ((state & 2) != 0 && ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) return true;
+ return (state & 4) != 0 && ItemList.Tool_DataOrb.isStackEqual(aStack, false, true);
+ }
+
+ /**
+ * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb
+ */
+ public ArrayList<ItemStack> getDataItems(int state) {
+ ArrayList<ItemStack> rList = new ArrayList<>();
+ if (GT_Utility.isStackValid(mInventory[1]) && isCorrectDataItem(mInventory[1], state)) {
+ rList.add(mInventory[1]);
+ }
+ for (GT_MetaTileEntity_Hatch_DataAccess tHatch : filterValidMTEs(mDataAccessHatches)) {
+ for (int i = 0; i < tHatch.getBaseMetaTileEntity()
+ .getSizeInventory(); i++) {
+ if (tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i) != null && isCorrectDataItem(
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i),
+ state))
+ rList.add(
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i));
+ }
+ }
+ return rList;
+ }
+
+ @Override
+ public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ return super.addToMachineList(aTileEntity, aBaseCasingIndex)
+ || addDataAccessToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+
+ public boolean addDataAccessToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DataAccess) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture((byte) aBaseCasingIndex);
+ return mDataAccessHatches.add((GT_MetaTileEntity_Hatch_DataAccess) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ @Override
+ public ChunkCoordIntPair getActiveChunk() {
+ return mCurrentChunk;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 6, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 6, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) {
+ super.drawTexts(screenElements, inventorySlot);
+ screenElements.widget(
+ TextWidget.dynamicString(() -> shutdownReason)
+ .setSynced(false)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setEnabled(widget -> !(getBaseMetaTileEntity().isActive() || shutdownReason.isEmpty())))
+ .widget(new FakeSyncWidget.StringSyncer(() -> shutdownReason, newString -> shutdownReason = newString));
+ }
+
+ @Override
+ protected boolean showRecipeTextInGUI() {
+ return false;
+ }
+
+ /**
+ * Adds additional buttons to the main button row. You do not need to set the position.
+ *
+ * @param builder Only use to attach SyncWidgets.
+ * @param buildContext Context for things like the player.
+ */
+ protected List<ButtonWidget> getAdditionalButtons(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ return ImmutableList.of();
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ final int BUTTON_Y_LEVEL = 91;
+
+ builder.widget(
+ new GT_LockedWhileActiveButton(this.getBaseMetaTileEntity(), builder)
+ .setOnClick((clickData, widget) -> mChunkLoadingEnabled = !mChunkLoadingEnabled)
+ .setPlayClickSound(true)
+ .setBackground(() -> {
+ if (mChunkLoadingEnabled) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED,
+ GT_UITextures.OVERLAY_BUTTON_CHUNK_LOADING };
+ }
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD,
+ GT_UITextures.OVERLAY_BUTTON_CHUNK_LOADING_OFF };
+ })
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(
+ () -> mChunkLoadingEnabled,
+ newBoolean -> mChunkLoadingEnabled = newBoolean),
+ builder,
+ (widget, val) -> widget.notifyTooltipChange())
+ .dynamicTooltip(
+ () -> ImmutableList.of(
+ StatCollector.translateToLocal(
+ mChunkLoadingEnabled ? "GT5U.gui.button.chunk_loading_on"
+ : "GT5U.gui.button.chunk_loading_off")))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(new Pos2d(80, BUTTON_Y_LEVEL))
+ .setSize(16, 16))
+ .widget(
+ new ButtonWidget().setOnClick((clickData, widget) -> abortDrilling())
+ .setPlayClickSound(true)
+ .setBackground(() -> {
+ if (workState == STATE_ABORT) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED,
+ GT_UITextures.OVERLAY_BUTTON_RETRACT_PIPE, GT_UITextures.OVERLAY_BUTTON_LOCKED };
+ }
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD,
+ GT_UITextures.OVERLAY_BUTTON_RETRACT_PIPE };
+ })
+ .attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(() -> workState, (newInt) -> workState = newInt),
+ builder,
+ (widget, integer) -> widget.notifyTooltipChange())
+ .dynamicTooltip(
+ () -> ImmutableList.of(
+ StatCollector.translateToLocalFormatted(
+ workState == STATE_ABORT ? "GT5U.gui.button.drill_retract_pipes_active"
+ : "GT5U.gui.button.drill_retract_pipes")))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(new Pos2d(174, 130))
+ .setSize(16, 16));
+
+ int left = 98;
+ for (ButtonWidget button : getAdditionalButtons(builder, buildContext)) {
+ button.setPos(new Pos2d(left, BUTTON_Y_LEVEL))
+ .setSize(16, 16);
+ builder.widget(button);
+ left += 18;
+ }
+ }
+
+ protected List<IHatchElement<? super GT_MetaTileEntity_DrillerBase>> getAllowedHatches() {
+ return ImmutableList.of(
+ InputHatch,
+ OutputHatch,
+ InputBus,
+ OutputBus,
+ Muffler,
+ Maintenance,
+ Energy,
+ DataHatchElement.DataAccess);
+ }
+
+ protected enum DataHatchElement implements IHatchElement<GT_MetaTileEntity_DrillerBase> {
+
+ DataAccess;
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return Collections.singletonList(GT_MetaTileEntity_Hatch_DataAccess.class);
+ }
+
+ @Override
+ public IGT_HatchAdder<GT_MetaTileEntity_DrillerBase> adder() {
+ return GT_MetaTileEntity_DrillerBase::addDataAccessToMachineList;
+ }
+
+ @Override
+ public long count(GT_MetaTileEntity_DrillerBase t) {
+ return t.mDataAccessHatches.size();
+ }
+ }
+
+ /**
+ * Sets or overrides the {@link CheckRecipeResult} for a given work state
+ *
+ * @param state A work state like {@link #STATE_DOWNWARD}.
+ * @param result A previously registered recipe result.
+ */
+ protected void addResultMessage(final int state, @NotNull final CheckRecipeResult result) {
+ resultRegistry.put(new ResultRegistryKey(state, result.wasSuccessful()), result);
+ }
+
+ /**
+ * Sets or overrides the {@link CheckRecipeResult} for a given work state and operation success type.
+ *
+ * @param state A work state like {@link #STATE_DOWNWARD}.
+ * @param wasSuccessful Whether the operation was successful.
+ * @param resultKey An I18N key for the message.
+ */
+ protected void addResultMessage(final int state, final boolean wasSuccessful, @NotNull final String resultKey) {
+ addResultMessage(
+ state,
+ wasSuccessful ? SimpleCheckRecipeResult.ofSuccess(resultKey)
+ : SimpleCheckRecipeResult.ofFailure(resultKey));
+ }
+
+ @SuppressWarnings("ClassCanBeRecord")
+ private final static class ResultRegistryKey {
+
+ private final int state;
+ private final boolean successful;
+
+ public ResultRegistryKey(final int state, final boolean successful) {
+ this.state = state;
+ this.successful = successful;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof ResultRegistryKey other)) {
+ return false;
+ }
+
+ return (state == other.state && successful == other.successful);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(state, successful);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java
new file mode 100644
index 0000000000..8913e8fedd
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ElectricBlastFurnace.java
@@ -0,0 +1,401 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_ElectricBlastFurnace extends
+ GT_MetaTileEntity_AbstractMultiFurnace<GT_MetaTileEntity_ElectricBlastFurnace> implements ISurvivalConstructable {
+
+ private int mHeatingCapacity = 0;
+ protected final ArrayList<GT_MetaTileEntity_Hatch_Output> mPollutionOutputHatches = new ArrayList<>();
+ protected final FluidStack[] pollutionFluidStacks = { Materials.CarbonDioxide.getGas(1000),
+ Materials.CarbonMonoxide.getGas(1000), Materials.SulfurDioxide.getGas(1000) };
+
+ protected static final int CASING_INDEX = 11;
+ protected static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final IStructureDefinition<GT_MetaTileEntity_ElectricBlastFurnace> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_ElectricBlastFurnace>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(
+ new String[][] { { "ttt", "tmt", "ttt" }, { "CCC", "C-C", "CCC" }, { "CCC", "C-C", "CCC" },
+ { "b~b", "bbb", "bbb" } }))
+ .addElement(
+ 't',
+ buildHatchAdder(GT_MetaTileEntity_ElectricBlastFurnace.class)
+ .atLeast(
+ OutputHatch.withAdder(GT_MetaTileEntity_ElectricBlastFurnace::addOutputHatchToTopList)
+ .withCount(t -> t.mPollutionOutputHatches.size()))
+ .casingIndex(CASING_INDEX)
+ .dot(1)
+ .buildAndChain(GregTech_API.sBlockCasings1, CASING_INDEX))
+ .addElement('m', Muffler.newAny(CASING_INDEX, 2))
+ .addElement(
+ 'C',
+ ofCoil(
+ GT_MetaTileEntity_ElectricBlastFurnace::setCoilLevel,
+ GT_MetaTileEntity_ElectricBlastFurnace::getCoilLevel))
+ .addElement(
+ 'b',
+ buildHatchAdder(GT_MetaTileEntity_ElectricBlastFurnace.class)
+ .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy)
+ .casingIndex(CASING_INDEX)
+ .dot(1)
+ .buildAndChain(GregTech_API.sBlockCasings1, CASING_INDEX))
+ .build();
+
+ public GT_MetaTileEntity_ElectricBlastFurnace(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_ElectricBlastFurnace(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ElectricBlastFurnace(this.mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Blast Furnace")
+ .addInfo("Controller block for the Electric Blast Furnace")
+ .addInfo("You can use some fluids to reduce recipe time. Place the circuit in the Input Bus")
+ .addInfo("Each 900K over the min. Heat required reduces power consumption by 5% (multiplicatively)")
+ .addInfo("Each 1800K over the min. Heat allows for an overclock to be upgraded to a perfect overclock.")
+ .addInfo("That means the EBF will reduce recipe time by a factor 4 instead of 2 (giving 100% efficiency).")
+ .addInfo("Additionally gives +100K for every tier past MV")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 4, 3, true)
+ .addController("Front bottom")
+ .addCasingInfoRange("Heat Proof Machine Casing", 0, 15, false)
+ .addOtherStructurePart("Heating Coils", "Two middle Layers")
+ .addEnergyHatch("Any bottom layer casing", 3)
+ .addMaintenanceHatch("Any bottom layer casing", 3)
+ .addMufflerHatch("Top middle", 2)
+ .addInputBus("Any bottom layer casing", 3)
+ .addInputHatch("Any bottom layer casing", 3)
+ .addOutputBus("Any bottom layer casing", 3)
+ .addOutputHatch("Fluid outputs, Any bottom layer casing")
+ .addOutputHatch("Pollution gases (CO2/CO/SO2), Any top layer casing", 1)
+ .addStructureInfo("Pollution gas output amount scales with Muffler Hatch tier")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ if (aActive) return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { casingTexturePages[0][CASING_INDEX] };
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return GT_Mod.gregtechproxy.mPollutionEBFPerSecond;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.blastFurnaceRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_ElectricBlastFurnace> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setRecipeHeat(recipe.mSpecialValue)
+ .setMachineHeat(mHeatingCapacity)
+ .setHeatOC(true)
+ .setHeatDiscount(true);
+ }
+
+ @Override
+ protected @Nonnull CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ return recipe.mSpecialValue <= mHeatingCapacity ? CheckRecipeResultRegistry.SUCCESSFUL
+ : CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
+ }
+ };
+ }
+
+ public boolean addOutputHatchToTopList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mPollutionOutputHatches.add((GT_MetaTileEntity_Hatch_Output) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ this.mHeatingCapacity = 0;
+
+ setCoilLevel(HeatingCoilLevel.None);
+
+ mPollutionOutputHatches.clear();
+
+ if (!checkPiece(STRUCTURE_PIECE_MAIN, 1, 3, 0)) return false;
+
+ if (getCoilLevel() == HeatingCoilLevel.None) return false;
+
+ if (mMaintenanceHatches.size() != 1) return false;
+
+ this.mHeatingCapacity = (int) getCoilLevel().getHeat() + 100 * (GT_Utility.getTier(getMaxInputVoltage()) - 2);
+ return true;
+ }
+
+ @Override
+ public boolean addOutput(FluidStack aLiquid) {
+ if (aLiquid == null) return false;
+ FluidStack tLiquid = aLiquid.copy();
+ ArrayList<GT_MetaTileEntity_Hatch_Output> tOutputHatches;
+ if (isPollutionFluid(tLiquid)) {
+ tOutputHatches = this.mPollutionOutputHatches;
+ multiplyPollutionFluidAmount(tLiquid);
+ } else {
+ tOutputHatches = this.mOutputHatches;
+ }
+ return dumpFluid(tOutputHatches, tLiquid, true) || dumpFluid(tOutputHatches, tLiquid, false);
+ }
+
+ protected boolean isPollutionFluid(@Nullable FluidStack fluidStack) {
+ if (fluidStack == null) return false;
+ for (FluidStack pollutionFluidStack : pollutionFluidStacks) {
+ if (!fluidStack.isFluidEqual(pollutionFluidStack)) continue;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
+ if (Arrays.stream(toOutput)
+ .anyMatch(this::isPollutionFluid)) {
+ return filterValidMTEs(mPollutionOutputHatches);
+ }
+ return filterValidMTEs(mOutputHatches);
+ }
+
+ /**
+ * @return 100 -> all released to air, 0 -> all dumped to hatch
+ */
+ public int getPollutionReduction() {
+ int reduction = 100;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ reduction = Math.min(tHatch.calculatePollutionReduction(100), reduction);
+ }
+ return reduction;
+ }
+
+ protected void multiplyPollutionFluidAmount(@Nonnull FluidStack fluid) {
+ fluid.amount = fluid.amount * Math.min(100 - getPollutionReduction(), 100) / 100;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ int mPollutionReduction = getPollutionReduction();
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ return new String[] {
+ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s",
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(-mEUt)
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getMaxInputVoltage())
+ + EnumChatFormatting.RESET
+ + " EU/t(*2A) "
+ + StatCollector.translateToLocal("GT5U.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + VN[GT_Utility.getTier(getMaxInputVoltage())]
+ + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": "
+ + EnumChatFormatting.RED
+ + (getIdealStatus() - getRepairStatus())
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.multiblock.efficiency")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + mEfficiency / 100.0F
+ + EnumChatFormatting.RESET
+ + " %",
+ StatCollector.translateToLocal("GT5U.EBF.heat") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mHeatingCapacity)
+ + EnumChatFormatting.RESET
+ + " K",
+ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": "
+ + EnumChatFormatting.GREEN
+ + mPollutionReduction
+ + EnumChatFormatting.RESET
+ + " %" };
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ inputSeparation = !inputSeparation;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("isBussesSeparate")) {
+ // backward compatibility
+ inputSeparation = aNBT.getBoolean("isBussesSeparate");
+ }
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ExtremeDieselEngine.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ExtremeDieselEngine.java
new file mode 100644
index 0000000000..dace58a492
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ExtremeDieselEngine.java
@@ -0,0 +1,237 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EXTREME_DIESEL_ENGINE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.maps.FuelBackend;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_ExtremeDieselEngine extends GT_MetaTileEntity_DieselEngine {
+
+ public GT_MetaTileEntity_ExtremeDieselEngine(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_ExtremeDieselEngine(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Combustion Generator")
+ .addInfo("Controller block for the Extreme Combustion Engine")
+ .addInfo("Supply high rating fuel and 8000L of Lubricant per hour to run")
+ .addInfo("Supply 40L/s of Liquid Oxygen to boost output (optional)")
+ .addInfo("Default: Produces 10900EU/t at 100% fuel efficiency")
+ .addInfo("Boosted: Produces 32700EU/t at 150% fuel efficiency")
+ .addInfo("You need to wait for it to reach 300% to output full power")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 4, false)
+ .addController("Front center")
+ .addCasingInfoRange("Robust Tungstensteel Machine Casing", 16, 22, false)
+ .addOtherStructurePart("Titanium Gear Box Machine Casing", "Inner 2 blocks")
+ .addOtherStructurePart("Extreme Engine Intake Machine Casing", "8x, ring around controller")
+ .addStructureInfo("Extreme Engine Intake Casings must not be obstructed in front (only air blocks)")
+ .addDynamoHatch("Back center", 2)
+ .addMaintenanceHatch("One of the casings next to a Gear Box", 1)
+ .addMufflerHatch("Top middle back, above the rear Gear Box", 1)
+ .addInputHatch("HOG, next to a Gear Box", 1)
+ .addInputHatch("Lubricant, next to a Gear Box", 1)
+ .addInputHatch("Liquid Oxygen, optional, next to a Gear Box", 1)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public RecipeMap<FuelBackend> getRecipeMap() {
+ return RecipeMaps.extremeDieselFuels;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ if (aActive) return new ITexture[] { casingTexturePages[0][60], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { casingTexturePages[0][60], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_EXTREME_DIESEL_ENGINE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { casingTexturePages[0][60] };
+ }
+
+ @Override
+ public Block getCasingBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ @Override
+ public byte getCasingMeta() {
+ return 0;
+ }
+
+ @Override
+ public Block getIntakeBlock() {
+ return GregTech_API.sBlockCasings8;
+ }
+
+ @Override
+ public byte getIntakeMeta() {
+ return 4;
+ }
+
+ @Override
+ public Block getGearboxBlock() {
+ return GregTech_API.sBlockCasings2;
+ }
+
+ @Override
+ public byte getGearboxMeta() {
+ return 4;
+ }
+
+ @Override
+ public byte getCasingTextureIndex() {
+ return 60;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ExtremeDieselEngine(this.mName);
+ }
+
+ @Override
+ protected int getNominalOutput() {
+ return 10900;
+ }
+
+ @Override
+ protected int getBoostFactor() {
+ return 2;
+ }
+
+ @Override
+ protected Materials getBooster() {
+ return Materials.LiquidOxygen;
+ }
+
+ @Override
+ protected int getAdditiveFactor() {
+ return 1;
+ }
+
+ @Override
+ protected int getEfficiencyIncrease() {
+ return 20;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return boostEu ? 30000 : 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return GT_Mod.gregtechproxy.mPollutionExtremeCombustionEnginePerSecond;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ int mPollutionReduction = 0;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction);
+ }
+
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ return new String[] { EnumChatFormatting.BLUE + "Extreme Diesel Engine" + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ getIdealStatus() == getRepairStatus()
+ ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false")
+ + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true")
+ + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.engine.output") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers((long) -mEUt * mEfficiency / 10000)
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ StatCollector.translateToLocal("GT5U.engine.consumption") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(fuelConsumption)
+ + EnumChatFormatting.RESET
+ + " L/t",
+ StatCollector.translateToLocal("GT5U.engine.value") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(fuelValue)
+ + EnumChatFormatting.RESET
+ + " EU/L",
+ StatCollector.translateToLocal("GT5U.turbine.fuel") + ": "
+ + EnumChatFormatting.GOLD
+ + GT_Utility.formatNumbers(fuelRemaining)
+ + EnumChatFormatting.RESET
+ + " L",
+ StatCollector.translateToLocal("GT5U.engine.efficiency") + ": "
+ + EnumChatFormatting.YELLOW
+ + (mEfficiency / 100F)
+ + EnumChatFormatting.YELLOW
+ + " %",
+ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": "
+ + EnumChatFormatting.GREEN
+ + mPollutionReduction
+ + EnumChatFormatting.RESET
+ + " %" };
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer.java
new file mode 100644
index 0000000000..493546211c
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer.java
@@ -0,0 +1,656 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.filterByMTETier;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableMap;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IOverclockDescriptionProvider;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.objects.overclockdescriber.FusionOverclockDescriber;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+
+public abstract class GT_MetaTileEntity_FusionComputer
+ extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_FusionComputer>
+ implements ISurvivalConstructable, IAddUIWidgets, IOverclockDescriptionProvider {
+
+ private final OverclockDescriber overclockDescriber;
+
+ public static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final ClassValue<IStructureDefinition<GT_MetaTileEntity_FusionComputer>> STRUCTURE_DEFINITION = new ClassValue<>() {
+
+ @Override
+ protected IStructureDefinition<GT_MetaTileEntity_FusionComputer> computeValue(Class<?> type) {
+ return StructureDefinition.<GT_MetaTileEntity_FusionComputer>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(
+ new String[][] {
+ { " ", " ihi ", " hh hh ", " h h ",
+ " h h ", " h h ", " i i ", " h h ",
+ " i i ", " h h ", " h h ", " h h ",
+ " hh hh ", " ihi ", " ", },
+ { " xhx ", " hhccchh ", " eccxhxcce ", " eceh hece ",
+ " hce ech ", " hch hch ", "xcx xcx", "hch hch",
+ "xcx xcx", " hch hch ", " hce ech ", " eceh hece ",
+ " eccx~xcce ", " hhccchh ", " xhx ", },
+ { " ", " ihi ", " hh hh ", " h h ",
+ " h h ", " h h ", " i i ", " h h ",
+ " i i ", " h h ", " h h ", " h h ",
+ " hh hh ", " ihi ", " ", } }))
+ .addElement('c', lazy(t -> ofBlock(t.getFusionCoil(), t.getFusionCoilMeta())))
+ .addElement('h', lazy(t -> ofBlock(t.getCasing(), t.getCasingMeta())))
+ .addElement(
+ 'i',
+ lazy(
+ t -> buildHatchAdder(GT_MetaTileEntity_FusionComputer.class)
+ .atLeast(
+ ImmutableMap.of(InputHatch.withAdder(GT_MetaTileEntity_FusionComputer::addInjector), 2))
+ .hatchItemFilterAnd(t2 -> filterByMTETier(t2.tier(), Integer.MAX_VALUE))
+ .casingIndex(53)
+ .dot(1)
+ .buildAndChain(t.getCasing(), t.getCasingMeta())))
+ .addElement(
+ 'e',
+ lazy(
+ t -> buildHatchAdder(GT_MetaTileEntity_FusionComputer.class).atLeast(
+ ImmutableMap.of(Energy.withAdder(GT_MetaTileEntity_FusionComputer::addEnergyInjector), 16))
+ .hatchItemFilterAnd(t2 -> filterByMTETier(t2.tier(), Integer.MAX_VALUE))
+ .casingIndex(53)
+ .dot(2)
+ .buildAndChain(t.getCasing(), t.getCasingMeta())))
+ .addElement(
+ 'x',
+ lazy(
+ t -> buildHatchAdder(GT_MetaTileEntity_FusionComputer.class)
+ .atLeast(OutputHatch.withAdder(GT_MetaTileEntity_FusionComputer::addExtractor))
+ .hatchItemFilterAnd(t2 -> filterByMTETier(t2.tier(), Integer.MAX_VALUE))
+ .casingIndex(53)
+ .dot(3)
+ .buildAndChain(t.getCasing(), t.getCasingMeta())))
+ .build();
+ }
+ };
+ public GT_Recipe mLastRecipe;
+ public long mEUStore;
+
+ static {
+ Textures.BlockIcons.setCasingTextureForId(
+ 52,
+ TextureFactory.of(
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW)
+ .extFacing()
+ .glow()
+ .build()));
+ }
+
+ public GT_MetaTileEntity_FusionComputer(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ this.overclockDescriber = createOverclockDescriber();
+ }
+
+ public GT_MetaTileEntity_FusionComputer(String aName) {
+ super(aName);
+ this.overclockDescriber = createOverclockDescriber();
+ }
+
+ protected OverclockDescriber createOverclockDescriber() {
+ return new FusionOverclockDescriber((byte) tier(), capableStartupCanonical());
+ }
+
+ @Nonnull
+ @Override
+ public OverclockDescriber getOverclockDescriber() {
+ return overclockDescriber;
+ }
+
+ public abstract int tier();
+
+ @Override
+ public abstract long maxEUStore();
+
+ /**
+ * Unlike {@link #maxEUStore()}, this provides theoretical limit of startup EU, without considering the amount of
+ * hatches nor the room for extra energy. Intended for simulation.
+ */
+ public abstract long capableStartupCanonical();
+
+ @Override
+ public abstract MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity);
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) {
+
+ return side != getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (mEUt > 0) {
+ mEUt = -mEUt;
+ }
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_FusionComputer> getStructureDefinition() {
+ return STRUCTURE_DEFINITION.get(getClass());
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addController("Fusion Reactor")
+ .addInfo("Some kind of fusion reactor, maybe")
+ .addSeparator()
+ .addInfo("Some kind of fusion reactor, maybe")
+ .addStructureInfo("Should probably be built similar to other fusions")
+ .addStructureInfo("See controller tooltip for details")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ if (checkPiece(STRUCTURE_PIECE_MAIN, 7, 1, 12) && mInputHatches.size() > 1
+ && !mOutputHatches.isEmpty()
+ && !mEnergyHatches.isEmpty()) {
+ mWrench = true;
+ mScrewdriver = true;
+ mSoftHammer = true;
+ mHardHammer = true;
+ mSolderingTool = true;
+ mCrowbar = true;
+ return true;
+ }
+ return false;
+ }
+
+ private boolean addEnergyInjector(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (!(aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy tHatch)) return false;
+ if (tHatch.mTier < tier()) return false;
+ tHatch.updateTexture(aBaseCasingIndex);
+ return mEnergyHatches.add(tHatch);
+ }
+
+ private boolean addInjector(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) {
+ IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (!(aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input tHatch)) return false;
+ if (tHatch.getTierForStructure() < tier()) return false;
+ tHatch.updateTexture(aBaseCasingIndex);
+ tHatch.mRecipeMap = getRecipeMap();
+ return mInputHatches.add(tHatch);
+ }
+
+ private boolean addExtractor(IGregTechTileEntity aBaseMetaTileEntity, int aBaseCasingIndex) {
+ if (aBaseMetaTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aBaseMetaTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (!(aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output tHatch)) return false;
+ if (tHatch.getTierForStructure() < tier()) return false;
+ tHatch.updateTexture(aBaseCasingIndex);
+ return mOutputHatches.add(tHatch);
+ }
+
+ public abstract Block getCasing();
+
+ public abstract int getCasingMeta();
+
+ public abstract Block getFusionCoil();
+
+ public abstract int getFusionCoilMeta();
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) return new ITexture[] { TextureFactory.builder()
+ .addIcon(MACHINE_CASING_FUSION_GLASS)
+ .extFacing()
+ .build(), getTextureOverlay() };
+ if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(52) };
+ return new ITexture[] { TextureFactory.builder()
+ .addIcon(MACHINE_CASING_FUSION_GLASS)
+ .extFacing()
+ .build() };
+ }
+
+ /**
+ * @return The list of textures overlay
+ */
+ public abstract ITexture getTextureOverlay();
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.fusionRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected GT_ParallelHelper createParallelHelper(@NotNull GT_Recipe recipe) {
+ // When the fusion first loads and is still processing, it does the recipe check without consuming.
+ return super.createParallelHelper(recipe).setConsumption(!mRunningOnLoad);
+ }
+
+ @NotNull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@NotNull GT_Recipe recipe) {
+ return overclockDescriber.createCalculator(super.createOverclockCalculator(recipe), recipe);
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@NotNull GT_Recipe recipe) {
+ if (!mRunningOnLoad && recipe.mSpecialValue > maxEUStore()) {
+ return CheckRecipeResultRegistry.insufficientStartupPower(recipe.mSpecialValue);
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ CheckRecipeResult result = super.process();
+ if (mRunningOnLoad) mRunningOnLoad = false;
+ turnCasingActive(result.wasSuccessful());
+ if (result.wasSuccessful()) {
+ mLastRecipe = lastRecipe;
+ } else {
+ mLastRecipe = null;
+ }
+ return result;
+ }
+ };
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(GT_Values.V[tier()]);
+ logic.setAvailableAmperage(1);
+ logic.setAmperageOC(false);
+ }
+
+ public boolean turnCasingActive(boolean status) {
+ if (this.mEnergyHatches != null) {
+ for (GT_MetaTileEntity_Hatch_Energy hatch : this.mEnergyHatches) {
+ hatch.updateTexture(status ? 52 : 53);
+ }
+ }
+ if (this.mOutputHatches != null) {
+ for (GT_MetaTileEntity_Hatch_Output hatch : this.mOutputHatches) {
+ hatch.updateTexture(status ? 52 : 53);
+ }
+ }
+ if (this.mInputHatches != null) {
+ for (GT_MetaTileEntity_Hatch_Input hatch : this.mInputHatches) {
+ hatch.updateTexture(status ? 52 : 53);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (mEfficiency < 0) mEfficiency = 0;
+ if (mRunningOnLoad && checkMachine(aBaseMetaTileEntity, mInventory[1])) {
+ this.mEUStore = aBaseMetaTileEntity.getStoredEU();
+ checkRecipe();
+ }
+ if (mUpdated) {
+ mUpdate = 50;
+ mUpdated = false;
+ }
+ if (--mUpdate == 0 || --mStartUpCheck == 0) {
+ checkStructure(true, aBaseMetaTileEntity);
+ }
+ if (mStartUpCheck < 0) {
+ if (mMachine) {
+ this.mEUStore = aBaseMetaTileEntity.getStoredEU();
+ if (this.mEnergyHatches != null) {
+ for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) {
+ long energyToMove = GT_Values.V[tier()] / 16;
+ if (aBaseMetaTileEntity.getStoredEU() + energyToMove < maxEUStore()
+ && tHatch.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(energyToMove, false)) {
+ aBaseMetaTileEntity.increaseStoredEnergyUnits(energyToMove, true);
+ }
+ }
+ }
+ if (this.mEUStore <= 0 && mMaxProgresstime > 0) {
+ stopMachine(ShutDownReasonRegistry.POWER_LOSS);
+ }
+ if (mMaxProgresstime > 0) {
+ this.getBaseMetaTileEntity()
+ .decreaseStoredEnergyUnits(-mEUt, true);
+ if (mMaxProgresstime > 0 && ++mProgresstime >= mMaxProgresstime) {
+ if (mOutputItems != null)
+ for (ItemStack tStack : mOutputItems) if (tStack != null) addOutput(tStack);
+ if (mOutputFluids != null)
+ for (FluidStack tStack : mOutputFluids) if (tStack != null) addOutput(tStack);
+ mEfficiency = Math
+ .max(0, Math.min(mEfficiency + mEfficiencyIncrease, getMaxEfficiency(mInventory[1])));
+ mOutputItems = null;
+ mProgresstime = 0;
+ mMaxProgresstime = 0;
+ mEfficiencyIncrease = 0;
+ if (mOutputFluids != null && mOutputFluids.length > 0) {
+ try {
+ GT_Mod.achievements.issueAchivementHatchFluid(
+ aBaseMetaTileEntity.getWorld()
+ .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()),
+ mOutputFluids[0]);
+ } catch (Exception ignored) {}
+ }
+ this.mEUStore = aBaseMetaTileEntity.getStoredEU();
+ if (aBaseMetaTileEntity.isAllowedToWork()) checkRecipe();
+ }
+ } else {
+ if (aTick % 100 == 0 || aBaseMetaTileEntity.hasWorkJustBeenEnabled()
+ || aBaseMetaTileEntity.hasInventoryBeenModified()) {
+ turnCasingActive(mMaxProgresstime > 0);
+ if (aBaseMetaTileEntity.isAllowedToWork()) {
+ this.mEUStore = aBaseMetaTileEntity.getStoredEU();
+ if (checkRecipe()) {
+ if (this.mEUStore < this.mLastRecipe.mSpecialValue + this.mEUt) {
+ stopMachine(ShutDownReasonRegistry.POWER_LOSS);
+ }
+ aBaseMetaTileEntity
+ .decreaseStoredEnergyUnits(this.mLastRecipe.mSpecialValue + this.mEUt, true);
+ }
+ }
+ if (mMaxProgresstime <= 0) mEfficiency = Math.max(0, mEfficiency - 1000);
+ }
+ }
+ } else if (aBaseMetaTileEntity.isAllowedToWork()) {
+ this.mLastRecipe = null;
+ stopMachine(ShutDownReasonRegistry.STRUCTURE_INCOMPLETE);
+ }
+ }
+ aBaseMetaTileEntity
+ .setErrorDisplayID((aBaseMetaTileEntity.getErrorDisplayID() & ~127) | (mMachine ? 0 : 64));
+ aBaseMetaTileEntity.setActive(mMaxProgresstime > 0);
+ }
+ }
+
+ @Override
+ public boolean drainEnergyInput(long aEU) {
+ return false;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void stopMachine(@NotNull ShutDownReason reason) {
+ super.stopMachine(reason);
+ turnCasingActive(false);
+ }
+
+ @Override
+ public String[] getInfoData() {
+ String tier = tier() == 6 ? EnumChatFormatting.RED + "I" + EnumChatFormatting.RESET
+ : tier() == 7 ? EnumChatFormatting.YELLOW + "II" + EnumChatFormatting.RESET
+ : tier() == 8 ? EnumChatFormatting.GRAY + "III" + EnumChatFormatting.RESET : "IV";
+ float plasmaOut = 0;
+ int powerRequired = 0;
+ if (this.mLastRecipe != null) {
+ powerRequired = this.mLastRecipe.mEUt;
+ if (this.mLastRecipe.getFluidOutput(0) != null) {
+ plasmaOut = (float) this.mLastRecipe.getFluidOutput(0).amount / (float) this.mLastRecipe.mDuration;
+ }
+ }
+
+ return new String[] { EnumChatFormatting.BLUE + "Fusion Reactor MK " + EnumChatFormatting.RESET + tier,
+ StatCollector.translateToLocal("GT5U.fusion.req") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(powerRequired)
+ + EnumChatFormatting.RESET
+ + "EU/t",
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mEUStore)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEUStore())
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("GT5U.fusion.plasma") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(plasmaOut)
+ + EnumChatFormatting.RESET
+ + "L/t" };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 7, 1, 12);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 7, 1, 12, elementBudget, env, false, true);
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.GT_MACHINES_FUSION_LOOP;
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(155, 145));
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return new GUITextureSet().setMainBackground(GT_UITextures.BACKGROUND_FUSION_COMPUTER);
+ }
+
+ @Override
+ public int getGUIWidth() {
+ return 176;
+ }
+
+ @Override
+ public int getGUIHeight() {
+ return 166;
+ }
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+ protected long clientEU;
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder
+ .widget(
+ new TextWidget(GT_Utility.trans("138", "Incomplete Structure.")).setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mMachine)
+ .setPos(10, 8))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mMachine, val -> mMachine = val))
+ .widget(
+ new TextWidget("Hit with Soft Mallet to (re-)start the Machine if it doesn't start.")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setTextAlignment(Alignment.Center)
+ .setEnabled(
+ widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0
+ && !getBaseMetaTileEntity().isActive())
+ .setPos(-getGUIWidth() / 2, 170)
+ .setSize(getGUIWidth() * 2, 9))
+ .widget(
+ new FakeSyncWidget.IntegerSyncer(
+ () -> getBaseMetaTileEntity().getErrorDisplayID(),
+ val -> getBaseMetaTileEntity().setErrorDisplayID(val)))
+ .widget(
+ new FakeSyncWidget.BooleanSyncer(
+ () -> getBaseMetaTileEntity().isActive(),
+ val -> getBaseMetaTileEntity().setActive(val)))
+ .widget(
+ new TextWidget("Running perfectly.").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setTextAlignment(Alignment.Center)
+ .setEnabled(
+ widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0
+ && getBaseMetaTileEntity().isActive())
+ .setPos(0, 170)
+ .setSize(getGUIWidth(), 9))
+ .widget(
+ new FakeSyncWidget.IntegerSyncer(
+ () -> getBaseMetaTileEntity().getErrorDisplayID(),
+ val -> getBaseMetaTileEntity().setErrorDisplayID(val)))
+ .widget(
+ new ProgressBar()
+ .setProgress(
+ () -> (float) getBaseMetaTileEntity().getStoredEU() / getBaseMetaTileEntity().getEUCapacity())
+ .setDirection(ProgressBar.Direction.RIGHT)
+ .setTexture(GT_UITextures.PROGRESSBAR_STORED_EU, 147)
+ .setPos(5, 156)
+ .setSize(147, 5))
+ .widget(new TextWidget().setStringSupplier(() -> {
+ if (clientEU > 160_000_000L && clientEU < 160_010_000L) {
+ clientEU = 160_000_000L;
+ }
+ if (clientEU > 320_000_000L && clientEU < 320_010_000L) {
+ clientEU = 320_000_000L;
+ }
+ if (clientEU > 640_000_000L && clientEU < 640_010_000L) {
+ clientEU = 640_000_000L;
+ }
+ if (clientEU > 5_120_000_000L && clientEU < 5_120_080_000L) {
+ clientEU = 5_120_000_000L;
+ }
+ return numberFormat.format(clientEU) + " EU";
+ })
+ .setDefaultColor(COLOR_TEXT_RED.get())
+ .setTextAlignment(Alignment.Center)
+ .setScale(0.5f)
+ .setPos(5, 157)
+ .setSize(147, 5))
+ .widget(new FakeSyncWidget.LongSyncer(() -> getBaseMetaTileEntity().getStoredEU(), val -> clientEU = val))
+ .widget(
+ new ButtonWidget().setNEITransferRect(
+ RecipeMaps.fusionRecipes.getFrontend()
+ .getUIProperties().neiTransferRectId)
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_NEI)
+ .setPos(154, 4)
+ .setSize(18, 18));
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public Set<VoidingMode> getAllowedVoidingModes() {
+ return VoidingMode.FLUID_ONLY_MODES;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer1.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer1.java
new file mode 100644
index 0000000000..e3a2432bf9
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer1.java
@@ -0,0 +1,103 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION1;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION1_GLOW;
+
+import net.minecraft.block.Block;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_FusionComputer1 extends GT_MetaTileEntity_FusionComputer {
+
+ private static final ITexture textureOverlay = TextureFactory.of(
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FUSION1)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FUSION1_GLOW)
+ .extFacing()
+ .glow()
+ .build());
+
+ public GT_MetaTileEntity_FusionComputer1(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_FusionComputer1(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public int tier() {
+ return 6;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 160003000L * (Math.min(16, this.mEnergyHatches.size())) / 16L;
+ }
+
+ @Override
+ public long capableStartupCanonical() {
+ return 160_000_000;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_FusionComputer1(mName);
+ }
+
+ @Override
+ public Block getCasing() {
+ return GregTech_API.sBlockCasings1;
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 6;
+ }
+
+ @Override
+ public Block getFusionCoil() {
+ return GregTech_API.sBlockCasings1;
+ }
+
+ @Override
+ public int getFusionCoilMeta() {
+ return 15;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Fusion Reactor")
+ .addInfo("It's over 9000!!!")
+ .addInfo("Controller block for the Fusion Reactor Mk I")
+ .addInfo("2048EU/t and 10M EU capacity per Energy Hatch")
+ .addInfo("If the recipe has a startup cost greater than the")
+ .addInfo("number of energy hatches * cap, you can't do it")
+ .addSeparator()
+ .beginStructureBlock(15, 3, 15, false)
+ .addController("See diagram when placed")
+ .addCasingInfoRange("LuV Machine Casing", 79, 123, false)
+ .addStructureInfo("Cover the coils with casing")
+ .addOtherStructurePart("Superconducting Coil Block", "Center part of the ring")
+ .addEnergyHatch("1-16, Specified casings", 2)
+ .addInputHatch("2-16, Specified casings", 1)
+ .addOutputHatch("1-16, Specified casings", 3)
+ .addStructureInfo("ALL Hatches must be LuV or better")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public ITexture getTextureOverlay() {
+ return textureOverlay;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer2.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer2.java
new file mode 100644
index 0000000000..0b1f10158b
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer2.java
@@ -0,0 +1,103 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION2;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION2_GLOW;
+
+import net.minecraft.block.Block;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_FusionComputer2 extends GT_MetaTileEntity_FusionComputer {
+
+ private static final ITexture textureOverlay = TextureFactory.of(
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FUSION2)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FUSION2_GLOW)
+ .extFacing()
+ .glow()
+ .build());
+
+ public GT_MetaTileEntity_FusionComputer2(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_FusionComputer2(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public int tier() {
+ return 7;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 320006000L * (Math.min(16, this.mEnergyHatches.size())) / 16L;
+ }
+
+ @Override
+ public long capableStartupCanonical() {
+ return 320_000_000;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_FusionComputer2(mName);
+ }
+
+ @Override
+ public Block getCasing() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 6;
+ }
+
+ @Override
+ public Block getFusionCoil() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ @Override
+ public int getFusionCoilMeta() {
+ return 7;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Fusion Reactor")
+ .addInfo("It's over 9000!!!")
+ .addInfo("Controller block for the Fusion Reactor Mk II")
+ .addInfo("8192EU/t and 20M EU capacity per Energy Hatch")
+ .addInfo("If the recipe has a startup cost greater than the")
+ .addInfo("number of energy hatches * cap, you can't do it")
+ .addSeparator()
+ .beginStructureBlock(15, 3, 15, false)
+ .addController("See diagram when placed")
+ .addCasingInfoRange("Fusion Machine Casing", 79, 123, false)
+ .addStructureInfo("Cover the coils with casing")
+ .addOtherStructurePart("Fusion Coil Block", "Center part of the ring")
+ .addEnergyHatch("1-16, Specified casings", 2)
+ .addInputHatch("2-16, Specified casings", 1)
+ .addOutputHatch("1-16, Specified casings", 3)
+ .addStructureInfo("ALL Hatches must be ZPM or better")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public ITexture getTextureOverlay() {
+ return textureOverlay;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer3.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer3.java
new file mode 100644
index 0000000000..64d92ccc99
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_FusionComputer3.java
@@ -0,0 +1,103 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION3;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION3_GLOW;
+
+import net.minecraft.block.Block;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_FusionComputer3 extends GT_MetaTileEntity_FusionComputer {
+
+ private static final ITexture textureOverlay = TextureFactory.of(
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FUSION3)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FUSION3_GLOW)
+ .extFacing()
+ .glow()
+ .build());
+
+ public GT_MetaTileEntity_FusionComputer3(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_FusionComputer3(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public int tier() {
+ return 8;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return 640010000L * (Math.min(16, this.mEnergyHatches.size())) / 16L;
+ }
+
+ @Override
+ public long capableStartupCanonical() {
+ return 640_000_000;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_FusionComputer3(mName);
+ }
+
+ @Override
+ public Block getCasing() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 8;
+ }
+
+ @Override
+ public Block getFusionCoil() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ @Override
+ public int getFusionCoilMeta() {
+ return 7;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Fusion Reactor")
+ .addInfo("A SUN DOWN ON EARTH")
+ .addInfo("Controller block for the Fusion Reactor Mk III")
+ .addInfo("32768EU/t and 40M EU capacity per Energy Hatch")
+ .addInfo("If the recipe has a startup cost greater than the")
+ .addInfo("number of energy hatches * cap, you can't do it")
+ .addSeparator()
+ .beginStructureBlock(15, 3, 15, false)
+ .addController("See diagram when placed")
+ .addCasingInfoRange("Fusion Machine Casing Mk II", 79, 123, false)
+ .addStructureInfo("Cover the coils with casing")
+ .addOtherStructurePart("Fusion Coil Block", "Center part of the ring")
+ .addEnergyHatch("1-16, Specified casings", 2)
+ .addInputHatch("2-16, Specified casings", 1)
+ .addOutputHatch("1-16, Specified casings", 3)
+ .addStructureInfo("ALL Hatches must be UV or better")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public ITexture getTextureOverlay() {
+ return textureOverlay;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_HeatExchanger.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_HeatExchanger.java
new file mode 100644
index 0000000000..70e8079b5b
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_HeatExchanger.java
@@ -0,0 +1,416 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_HEAT_EXCHANGER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_HeatExchanger extends
+ GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_HeatExchanger> implements ISurvivalConstructable {
+
+ private int dryHeatCounter = 0; // Counts up to dryHeatMaximum to check for explosion conditions
+ private static final int dryHeatMaximum = 2000; // 2000 ticks = 100 seconds
+ private static final int CASING_INDEX = 50;
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final IStructureDefinition<GT_MetaTileEntity_HeatExchanger> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_HeatExchanger>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(
+ new String[][] { { "ccc", "cCc", "ccc" }, { "ccc", "cPc", "ccc" }, { "ccc", "cPc", "ccc" },
+ { "c~c", "cHc", "ccc" }, }))
+ .addElement('P', ofBlock(GregTech_API.sBlockCasings2, 14))
+ .addElement(
+ 'C',
+ OutputHatch.withAdder(GT_MetaTileEntity_HeatExchanger::addColdFluidOutputToMachineList)
+ .withCount(t -> t.mOutputColdFluidHatch.isValid() ? 1 : 0)
+ .newAny(CASING_INDEX, 3))
+ .addElement(
+ 'H',
+ InputHatch.withAdder(GT_MetaTileEntity_HeatExchanger::addHotFluidInputToMachineList)
+ .withCount(t -> t.mInputHotFluidHatch.isValid() ? 1 : 0)
+ .newAny(CASING_INDEX, 3))
+ .addElement(
+ 'c',
+ buildHatchAdder(GT_MetaTileEntity_HeatExchanger.class)
+ .atLeast(InputBus, InputHatch, OutputBus, OutputHatch, Maintenance)
+ .casingIndex(CASING_INDEX)
+ .dot(1)
+ .buildAndChain(
+ onElementPass(
+ GT_MetaTileEntity_HeatExchanger::onCasingAdded,
+ ofBlock(GregTech_API.sBlockCasings4, (byte) 2))))
+ .build();
+ public static float penalty_per_config = 0.015f; // penalize 1.5% efficiency per circuitry level (1-25)
+
+ private GT_MetaTileEntity_Hatch_Input mInputHotFluidHatch;
+ private GT_MetaTileEntity_Hatch_Output mOutputColdFluidHatch;
+ private boolean superheated = false;
+ private int superheated_threshold = 0;
+ /**
+ * How much more steam we can make without draining real water. Unit is (1L/GT_Values.STEAM_PER_WATER)
+ */
+ private int steamBudget;
+
+ private int mCasingAmount;
+
+ public GT_MetaTileEntity_HeatExchanger(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_HeatExchanger(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Heat Exchanger")
+ .addInfo("Controller Block for the Large Heat Exchanger")
+ .addInfo("More complicated than a Fusion Reactor. Seriously")
+ .addInfo("Inputs are Hot Coolant or Lava")
+ .addInfo("Outputs Coolant or Pahoehoe Lava and SH Steam/Steam")
+ .addInfo("Read the wiki article to understand how it works")
+ .addInfo("Then go to the Discord to understand the wiki")
+ .addSeparator()
+ .beginStructureBlock(3, 4, 3, false)
+ .addController("Front bottom")
+ .addCasingInfoRange("Stable Titanium Machine Casing", 20, 32, false)
+ .addOtherStructurePart("Titanium Pipe Casing", "Center 2 blocks")
+ .addMaintenanceHatch("Any casing", 1)
+ .addInputHatch("Hot fluid, bottom center", 2)
+ .addInputHatch("Distilled water, any casing", 1)
+ .addOutputHatch("Cold fluid, top center", 3)
+ .addOutputHatch("Steam/SH Steam, any casing", 1)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ superheated = aNBT.getBoolean("superheated");
+ steamBudget = aNBT.getInteger("steamBudget");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setBoolean("superheated", superheated);
+ aNBT.setInteger("steamBudget", steamBudget);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ if (aActive) return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_HEAT_EXCHANGER_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { casingTexturePages[0][CASING_INDEX] };
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> !r.isUpsideDown() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ if (mInputHotFluidHatch.getFluid() == null) return CheckRecipeResultRegistry.NO_RECIPE;
+
+ int fluidAmountToConsume = mInputHotFluidHatch.getFluidAmount(); // how much fluid is in hatch
+
+ superheated_threshold = 4000; // default: must have 4000L per second to generate superheated steam
+ float efficiency = 1f; // default: operate at 100% efficiency with no integrated circuitry
+ int shs_reduction_per_config = 150; // reduce threshold 150L/s per circuitry level (1-25)
+ float steam_output_multiplier = 20f; // default: multiply output by 4 * 10 (boosted x5)
+ float penalty = 0.0f; // penalty to apply to output based on circuitry level (1-25).
+ boolean do_lava = false;
+ boolean do_coolant = false;
+ boolean do_solarSalt = false;
+
+ // Do we have an integrated circuit with a valid configuration?
+ if (mInventory[1] != null && mInventory[1].getUnlocalizedName()
+ .startsWith("gt.integrated_circuit")) {
+ int circuit_config = mInventory[1].getItemDamage();
+ if (circuit_config >= 1 && circuit_config <= 25) {
+ // If so, apply the penalty and reduce the threshold.
+ penalty = (circuit_config - 1) * penalty_per_config;
+ superheated_threshold -= (shs_reduction_per_config * (circuit_config - 1));
+ }
+ }
+ efficiency -= penalty;
+
+ // If we're working with lava, adjust the threshold and multipliers accordingly.
+ if (GT_ModHandler.isLava(mInputHotFluidHatch.getFluid())) {
+ steam_output_multiplier /= 5f; // lava is not boosted
+ superheated_threshold /= 4f; // unchanged
+ do_lava = true;
+ } else if (mInputHotFluidHatch.getFluid()
+ .isFluidEqual(FluidRegistry.getFluidStack("ic2hotcoolant", 1))) {
+ steam_output_multiplier /= 2f; // was boosted x2 on top of x5 -> total x10 ->
+ // nerf with this code back to 5x
+ superheated_threshold /= 5f; // 10x smaller since the Hot Things production in
+ // reactor is the same.
+ do_coolant = true;
+ } else if (mInputHotFluidHatch.getFluid()
+ .isFluidEqual(FluidRegistry.getFluidStack("molten.solarsalthot", 1))) {
+ steam_output_multiplier *= 2.5f; // Solar Salt:Steam value is 5x higher than Hot
+ // Coolant's value
+ superheated_threshold /= 25f; // Given that, multiplier is 5x higher and
+ // threshold is 5x lower
+ do_solarSalt = true;
+ } else {
+ // If we're working with neither, fail out
+ superheated_threshold = 0;
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ superheated = fluidAmountToConsume >= superheated_threshold; // set the internal superheated flag if we have
+ // enough hot fluid. Used in the
+ // onRunningTick method.
+ fluidAmountToConsume = Math.min(fluidAmountToConsume, superheated_threshold * 2); // Don't consume too much hot
+ // fluid per second
+ mInputHotFluidHatch.drain(fluidAmountToConsume, true);
+ this.mMaxProgresstime = 20;
+ this.mEUt = (int) (fluidAmountToConsume * steam_output_multiplier * efficiency);
+ if (do_lava) {
+ mOutputColdFluidHatch.fill(FluidRegistry.getFluidStack("ic2pahoehoelava", fluidAmountToConsume), true);
+ } else if (do_coolant) {
+ mOutputColdFluidHatch.fill(FluidRegistry.getFluidStack("ic2coolant", fluidAmountToConsume), true);
+ } else {
+ mOutputColdFluidHatch.fill(FluidRegistry.getFluidStack("molten.solarsaltcold", fluidAmountToConsume), true);
+ }
+ this.mEfficiencyIncrease = 80;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ private int useWater(int steam) {
+ steamBudget -= steam;
+ int usage = -Math.min(0, Math.floorDiv(steamBudget, GT_Values.STEAM_PER_WATER));
+ // still subtract, because usage will be a negative number
+ steamBudget += usage * GT_Values.STEAM_PER_WATER;
+ return usage;
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (this.mEUt > 0) {
+ int tGeneratedEU = (int) (this.mEUt * 2L * this.mEfficiency / 10000L); // APPROXIMATELY how much steam to
+ // generate.
+ if (tGeneratedEU > 0) {
+
+ if (superheated) tGeneratedEU /= 2; // We produce half as much superheated steam if necessary
+
+ int distilledConsumed = useWater(tGeneratedEU); // how much distilled water to consume
+ // tGeneratedEU = distilledConsumed * 160; // EXACTLY how much steam to generate, producing a perfect
+ // 1:160 ratio with distilled water consumption
+
+ FluidStack distilledStack = GT_ModHandler.getDistilledWater(distilledConsumed);
+ startRecipeProcessing();
+ if (depleteInput(distilledStack)) // Consume the distilled water
+ {
+ if (superheated) {
+ addOutput(FluidRegistry.getFluidStack("ic2superheatedsteam", tGeneratedEU)); // Generate
+ // superheated
+ // steam
+ } else {
+ addOutput(GT_ModHandler.getSteam(tGeneratedEU)); // Generate regular steam
+ }
+ dryHeatCounter = 0;
+ } else {
+ if (dryHeatCounter < dryHeatMaximum) {
+ dryHeatCounter += 1;
+ } else {
+ GT_Log.exp.println(this.mName + " was too hot and had no more Distilled Water!");
+ explodeMultiblock(); // Generate crater
+ }
+ }
+ endRecipeProcessing();
+ }
+ return true;
+ }
+ return true;
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_HeatExchanger> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ private void onCasingAdded() {
+ mCasingAmount++;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mOutputColdFluidHatch = null;
+ mInputHotFluidHatch = null;
+ mCasingAmount = 0;
+ return checkPiece(STRUCTURE_PIECE_MAIN, 1, 3, 0) && mCasingAmount >= 20 && mMaintenanceHatches.size() == 1;
+ }
+
+ public boolean addColdFluidOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ mOutputColdFluidHatch = (GT_MetaTileEntity_Hatch_Output) aMetaTileEntity;
+ return true;
+ }
+ return false;
+ }
+
+ public boolean addHotFluidInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = getRecipeMap();
+ mInputHotFluidHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_HeatExchanger(this.mName);
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return new String[] {
+ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s",
+ StatCollector.translateToLocal("GT5U.multiblock.usage") + " "
+ + StatCollector.translateToLocal("GT5U.LHE.steam")
+ + ": "
+ + (superheated ? EnumChatFormatting.RED : EnumChatFormatting.YELLOW)
+ + GT_Utility.formatNumbers(superheated ? -2L * mEUt : -mEUt)
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": "
+ + EnumChatFormatting.RED
+ + (getIdealStatus() - getRepairStatus())
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.multiblock.efficiency")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + mEfficiency / 100.0F
+ + EnumChatFormatting.RESET
+ + " %",
+ StatCollector.translateToLocal("GT5U.LHE.superheated") + ": "
+ + (superheated ? EnumChatFormatting.RED : EnumChatFormatting.BLUE)
+ + superheated
+ + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.LHE.superheated") + " "
+ + StatCollector.translateToLocal("GT5U.LHE.threshold")
+ + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(superheated_threshold)
+ + EnumChatFormatting.RESET };
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 3, 0, elementBudget, env, false, true);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ImplosionCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ImplosionCompressor.java
new file mode 100644
index 0000000000..a1968b05d4
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ImplosionCompressor.java
@@ -0,0 +1,163 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_IMPLOSION_COMPRESSOR_GLOW;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_CubicMultiBlockBase;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_ImplosionCompressor
+ extends GT_MetaTileEntity_CubicMultiBlockBase<GT_MetaTileEntity_ImplosionCompressor> {
+
+ public GT_MetaTileEntity_ImplosionCompressor(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_ImplosionCompressor(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ImplosionCompressor(this.mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Implosion Compressor")
+ .addInfo("Explosions are fun")
+ .addInfo("Controller block for the Implosion Compressor")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoRange("Solid Steel Machine Casing", 16, 24, false)
+ .addStructureInfo("Casings can be replaced with Explosion Warning Signs")
+ .addEnergyHatch("Any casing", 1)
+ .addMaintenanceHatch("Any casing", 1)
+ .addMufflerHatch("Any casing", 1)
+ .addInputBus("Any casing", 1)
+ .addOutputBus("Any casing", 1)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ return super.addToMachineList(aTileEntity, aBaseCasingIndex)
+ || addMufflerToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ if (aActive) return new ITexture[] { BlockIcons.casingTexturePages[0][16], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { BlockIcons.casingTexturePages[0][16], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_IMPLOSION_COMPRESSOR)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_IMPLOSION_COMPRESSOR_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][16] };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.implosionRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic();
+ }
+
+ @Override
+ protected int getTimeBetweenProcessSounds() {
+ return 10;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.RANDOM_EXPLODE;
+ }
+
+ @Override
+ protected IStructureElement<GT_MetaTileEntity_CubicMultiBlockBase<?>> getCasingElement() {
+ return ofChain(ofBlock(GregTech_API.sBlockCasings2, 0), ofBlock(GregTech_API.sBlockCasings3, 4));
+ }
+
+ @Override
+ protected int getHatchTextureIndex() {
+ return 16;
+ }
+
+ @Override
+ protected int getRequiredCasingCount() {
+ return 16;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return GT_Mod.gregtechproxy.mPollutionImplosionCompressorPerSecond;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IntegratedOreFactory.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IntegratedOreFactory.java
new file mode 100644
index 0000000000..48ab5a10f5
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_IntegratedOreFactory.java
@@ -0,0 +1,831 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_GLOW;
+import static gregtech.api.enums.TickTime.SECOND;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofFrame;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Random;
+import java.util.stream.Collectors;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.multitileentity.multiblock.casing.Glasses;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GT_MetaTileEntity_IntegratedOreFactory
+ extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GT_MetaTileEntity_IntegratedOreFactory>
+ implements ISurvivalConstructable {
+
+ private static final int CASING_INDEX1 = 183;
+ private static final int CASING_INDEX2 = 49;
+ private static final int MAX_PARA = 1024;
+ private static final long RECIPE_EUT = 30;
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final IStructureDefinition<GT_MetaTileEntity_IntegratedOreFactory> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_IntegratedOreFactory>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(
+ new String[][] {
+ { " ", " ", " WWW ", " WWW ", " ", " " },
+ { " ", " sss ", " sppps", " sppps", " sss ", " " },
+ { " ", " sss ", " s s", " s s", " sss ", " " },
+ { " ", " sss ", " sppps", " sppps", " sss ", " " },
+ { " ", " sss ", " s s", " s s", " sss ", " " },
+ { " ", " sss ", " sppps", " sppps", " sss ", " " },
+ { "iiiiii ", "iIIIIiisssi", "iIIIIis s", "iIIIIis s", "iIIIIiisssi", "iiiiii " },
+ { "iggggi ", "gt t isssi", "g xx sppps", "g xx sppps", "gt t isssi", "iggggi " },
+ { "iggggi ", "gt t isssi", "g xx s s", "g xx s s", "gt t isssi", "iggggi " },
+ { "iggggi ", "gt t is~si", "g xx spppO", "g xx spppO", "gt t isssi", "iggggi " },
+ { "iggggi ", "gt t isssi", "g xx s O", "g xx s O", "gt t isssi", "iggggi " },
+ { "EEEEEE ", "EEEEEEEEEEE", "EEEEEEEEEEE", "EEEEEEEEEEE", "EEEEEEEEEEE", "EEEEEE " } }))
+ .addElement('i', ofBlock(GregTech_API.sBlockCasings8, 7))
+ .addElement('s', ofBlock(GregTech_API.sBlockCasings4, 1))
+ .addElement('g', Glasses.chainAllGlasses())
+ .addElement('x', ofBlock(GregTech_API.sBlockCasings2, 3))
+ .addElement('p', ofBlock(GregTech_API.sBlockCasings2, 15))
+ .addElement('t', ofFrame(Materials.TungstenSteel))
+ .addElement(
+ 'E',
+ buildHatchAdder(GT_MetaTileEntity_IntegratedOreFactory.class).atLeast(Energy, Maintenance)
+ .casingIndex(CASING_INDEX1)
+ .dot(1)
+ .buildAndChain(GregTech_API.sBlockCasings8, 7))
+ .addElement(
+ 'I',
+ buildHatchAdder(GT_MetaTileEntity_IntegratedOreFactory.class).atLeast(InputBus)
+ .casingIndex(CASING_INDEX1)
+ .dot(2)
+ .buildAndChain(GregTech_API.sBlockCasings8, 7))
+ .addElement(
+ 'W',
+ buildHatchAdder(GT_MetaTileEntity_IntegratedOreFactory.class).atLeast(InputHatch, Muffler)
+ .casingIndex(CASING_INDEX2)
+ .dot(3)
+ .buildAndChain(GregTech_API.sBlockCasings4, 1))
+ .addElement(
+ 'O',
+ buildHatchAdder(GT_MetaTileEntity_IntegratedOreFactory.class).atLeast(OutputBus, OutputHatch)
+ .casingIndex(CASING_INDEX2)
+ .dot(4)
+ .buildAndChain(GregTech_API.sBlockCasings4, 1))
+ .build();
+
+ private static final HashSet<Integer> isCrushedOre = new HashSet<>();
+ private static final HashSet<Integer> isCrushedPureOre = new HashSet<>();
+ private static final HashSet<Integer> isPureDust = new HashSet<>();
+ private static final HashSet<Integer> isImpureDust = new HashSet<>();
+ private static final HashSet<Integer> isThermal = new HashSet<>();
+ private static final HashSet<Integer> isOre = new HashSet<>();
+ private static boolean isInit = false;
+ private ItemStack[] sMidProduct;
+ private int sMode = 0;
+ private boolean sVoidStone = false;
+ private int currentParallelism = 0;
+
+ private static void initHash() {
+ for (String name : OreDictionary.getOreNames()) {
+ if (name == null || name.isEmpty()) continue;
+ if (name.startsWith("crushedPurified")) {
+ for (ItemStack stack : OreDictionary.getOres(name)) {
+ isCrushedPureOre.add(GT_Utility.stackToInt(stack));
+ }
+ } else if (name.startsWith("crushedCentrifuged")) {
+ for (ItemStack stack : OreDictionary.getOres(name)) {
+ isThermal.add(GT_Utility.stackToInt(stack));
+ }
+ } else if (name.startsWith("crushed")) {
+ for (ItemStack stack : OreDictionary.getOres(name)) {
+ isCrushedOre.add(GT_Utility.stackToInt(stack));
+ }
+ } else if (name.startsWith("dustImpure")) {
+ for (ItemStack stack : OreDictionary.getOres(name)) {
+ isImpureDust.add(GT_Utility.stackToInt(stack));
+ }
+ } else if (name.startsWith("dustPure")) {
+ for (ItemStack stack : OreDictionary.getOres(name)) {
+ isPureDust.add(GT_Utility.stackToInt(stack));
+ }
+ } else if (name.startsWith("ore")) {
+ for (ItemStack stack : OreDictionary.getOres(name)) {
+ isOre.add(GT_Utility.stackToInt(stack));
+ }
+ } else if (name.startsWith("rawOre")) {
+ for (ItemStack stack : OreDictionary.getOres(name)) {
+ isOre.add(GT_Utility.stackToInt(stack));
+ }
+ }
+ }
+ }
+
+ public GT_MetaTileEntity_IntegratedOreFactory(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_IntegratedOreFactory(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_IntegratedOreFactory> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Ore Processor")
+ .addInfo("Controller Block for the Integrated Ore Factory")
+ .addInfo("It is OP. I mean ore processor.")
+ .addInfo("Do all ore processing in one step.")
+ .addInfo("Can process up to 1024 ores at a time.")
+ .addInfo("Every ore costs 30EU/t, 2L lubricant, 200L distilled water.")
+ .addInfo("Processing time is dependent on mode.")
+ .addInfo("Use a screwdriver to switch mode.")
+ .addInfo("Sneak click with screwdriver to void the stone dust.")
+ .addSeparator()
+ .beginStructureBlock(6, 12, 11, false)
+ .addController("The third layer")
+ .addStructureInfo("128 Advanced Iridium Plated Machine Casing")
+ .addStructureInfo("105 Clean Stainless Steel Machine Casing")
+ .addStructureInfo("48 Reinforced Glass")
+ .addStructureInfo("30 Tungstensteel Pipe Casing")
+ .addStructureInfo("16 Tungstensteel Frame Box")
+ .addStructureInfo("16 Steel Gear Box Casing")
+ .addEnergyHatch("Any bottom Casing", 1)
+ .addMaintenanceHatch("Any bottom Casing", 1)
+ .addInputBus("Input ore/crushed ore", 2)
+ .addInputHatch("Input lubricant/distilled water/washing chemicals", 3)
+ .addMufflerHatch("Output Pollution", 3)
+ .addOutputBus("Output products", 4)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> !r.isUpsideDown() && !f.isVerticallyFliped();
+ }
+
+ @Override
+ public void construct(ItemStack itemStack, boolean b) {
+ buildPiece(STRUCTURE_PIECE_MAIN, itemStack, b, 8, 9, 1);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 8, 9, 1, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ private static int getTime(int mode) {
+ return switch (mode) {
+ case 0 -> 30 * SECOND;
+ case 1 -> 15 * SECOND;
+ case 2 -> 10 * SECOND;
+ case 3 -> 20 * SECOND;
+ case 4 -> 17 * SECOND;
+ default ->
+ // go to hell
+ 1000000000;
+ };
+ }
+
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ if (!isInit) {
+ initHash();
+ isInit = true;
+ }
+
+ List<ItemStack> tInput = getStoredInputs();
+ List<FluidStack> tInputFluid = getStoredFluids();
+ long availableEUt = getMaxInputVoltage();
+ if (availableEUt < RECIPE_EUT) {
+ return CheckRecipeResultRegistry.insufficientPower(RECIPE_EUT);
+ }
+ if (tInput.isEmpty() || tInputFluid.isEmpty()) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ int maxParallel = MAX_PARA;
+ int originalMaxParallel = maxParallel;
+
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setEUt(availableEUt)
+ .setRecipeEUt(RECIPE_EUT)
+ .setDuration(getTime(sMode));
+
+ double tickTimeAfterOC = calculator.setParallel(originalMaxParallel)
+ .calculateDurationUnderOneTick();
+
+ if (tickTimeAfterOC < 1) {
+ maxParallel = GT_Utility.safeInt((long) (maxParallel / tickTimeAfterOC), 0);
+ }
+
+ int maxParallelBeforeBatchMode = maxParallel;
+ if (isBatchModeEnabled()) {
+ maxParallel = GT_Utility.safeInt((long) maxParallel * getMaxBatchSize(), 0);
+ }
+
+ int currentParallel = (int) Math.min(maxParallel, availableEUt / RECIPE_EUT);
+ // Calculate parallel by fluids
+ int tLube = 0;
+ int tWater = 0;
+ for (FluidStack fluid : tInputFluid) {
+ if (fluid != null && fluid.equals(GT_ModHandler.getDistilledWater(1L))) {
+ tWater += fluid.amount;
+ } else if (fluid != null && fluid.equals(Materials.Lubricant.getFluid(1L))) {
+ tLube += fluid.amount;
+ }
+ }
+ currentParallel = Math.min(currentParallel, tLube / 2);
+ currentParallel = Math.min(currentParallel, tWater / 200);
+ if (currentParallel <= 0) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ // Calculate parallel by items
+ int itemParallel = 0;
+ for (ItemStack ore : tInput) {
+ int tID = GT_Utility.stackToInt(ore);
+ if (tID == 0) continue;
+ if (isPureDust.contains(tID) || isImpureDust.contains(tID)
+ || isCrushedPureOre.contains(tID)
+ || isThermal.contains(tID)
+ || isCrushedOre.contains(tID)
+ || isOre.contains(tID)) {
+ if (itemParallel + ore.stackSize <= currentParallel) {
+ itemParallel += ore.stackSize;
+ } else {
+ itemParallel = currentParallel;
+ break;
+ }
+ }
+ }
+ currentParallel = itemParallel;
+ int currentParallelBeforeBatchMode = Math.min(currentParallel, maxParallelBeforeBatchMode);
+
+ long eutUseAfterOC = calculator
+ .calculateEUtConsumptionUnderOneTick(originalMaxParallel, currentParallelBeforeBatchMode);
+ calculator.setParallel(Math.min(currentParallelBeforeBatchMode, originalMaxParallel))
+ .calculate();
+
+ double batchMultiplierMax = 1;
+ // In case batch mode enabled
+ if (currentParallel > maxParallelBeforeBatchMode && calculator.getDuration() < getMaxBatchSize()) {
+ batchMultiplierMax = (double) getMaxBatchSize() / calculator.getDuration();
+ batchMultiplierMax = Math.min(batchMultiplierMax, (double) currentParallel / maxParallelBeforeBatchMode);
+ }
+
+ int finalParallel = (int) (batchMultiplierMax * maxParallelBeforeBatchMode);
+
+ // for scanner
+ setCurrentParallelism(finalParallel);
+
+ // Consume fluids
+ depleteInput(GT_ModHandler.getDistilledWater(finalParallel * 200L));
+ depleteInput(Materials.Lubricant.getFluid(finalParallel * 2L));
+
+ // Consume items and generate outputs
+ List<ItemStack> tOres = new ArrayList<>();
+ int remainingCost = finalParallel;
+ for (ItemStack ore : tInput) {
+ int tID = GT_Utility.stackToInt(ore);
+ if (tID == 0) continue;
+ if (isPureDust.contains(tID) || isImpureDust.contains(tID)
+ || isCrushedPureOre.contains(tID)
+ || isThermal.contains(tID)
+ || isCrushedOre.contains(tID)
+ || isOre.contains(tID)) {
+ if (remainingCost >= ore.stackSize) {
+ tOres.add(GT_Utility.copy(ore));
+ remainingCost -= ore.stackSize;
+ ore.stackSize = 0;
+ } else {
+ tOres.add(GT_Utility.copyAmountUnsafe(remainingCost, ore));
+ ore.stackSize -= remainingCost;
+ break;
+ }
+ }
+ }
+ sMidProduct = tOres.toArray(new ItemStack[0]);
+ switch (sMode) {
+ case 0 -> {
+ doMac(isOre);
+ doWash(isCrushedOre);
+ doThermal(isCrushedPureOre, isCrushedOre);
+ doMac(isThermal, isOre, isCrushedOre, isCrushedPureOre);
+ }
+ case 1 -> {
+ doMac(isOre);
+ doWash(isCrushedOre);
+ doMac(isOre, isCrushedOre, isCrushedPureOre);
+ doCentrifuge(isImpureDust, isPureDust);
+ }
+ case 2 -> {
+ doMac(isOre);
+ doMac(isThermal, isOre, isCrushedOre, isCrushedPureOre);
+ doCentrifuge(isImpureDust, isPureDust);
+ }
+ case 3 -> {
+ doMac(isOre);
+ doWash(isCrushedOre);
+ doSift(isCrushedPureOre);
+ }
+ case 4 -> {
+ doMac(isOre);
+ doChemWash(isCrushedOre, isCrushedPureOre);
+ doMac(isCrushedOre, isCrushedPureOre);
+ doCentrifuge(isImpureDust, isPureDust);
+ }
+ default -> {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+ }
+
+ this.mEfficiency = 10000 - (getIdealStatus() - getRepairStatus()) * 1000;
+ this.mEfficiencyIncrease = 10000;
+ this.mOutputItems = sMidProduct;
+ this.mMaxProgresstime = (int) (calculator.getDuration() * batchMultiplierMax);
+ this.lEUt = eutUseAfterOC;
+ if (this.lEUt > 0) {
+ this.lEUt = -this.lEUt;
+ }
+ this.updateSlots();
+
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @SafeVarargs
+ private boolean checkTypes(int aID, HashSet<Integer>... aTables) {
+ for (HashSet<Integer> set : aTables) {
+ if (set.contains(aID)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ sVoidStone = !sVoidStone;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.void", sVoidStone));
+ return;
+ }
+ sMode = (sMode + 1) % 5;
+ List<String> des = getDisplayMode(sMode);
+ GT_Utility.sendChatToPlayer(aPlayer, String.join("", des));
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ sMode = aNBT.getInteger("ssMode");
+ sVoidStone = aNBT.getBoolean("ssStone");
+ currentParallelism = aNBT.getInteger("currentParallelism");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("ssMode", sMode);
+ aNBT.setBoolean("ssStone", sVoidStone);
+ aNBT.setInteger("currentParallelism", currentParallelism);
+ super.saveNBTData(aNBT);
+ }
+
+ @SafeVarargs
+ private void doMac(HashSet<Integer>... aTables) {
+ List<ItemStack> tProduct = new ArrayList<>();
+ if (sMidProduct != null) {
+ for (ItemStack aStack : sMidProduct) {
+ int tID = GT_Utility.stackToInt(aStack);
+ if (checkTypes(tID, aTables)) {
+ GT_Recipe tRecipe = RecipeMaps.maceratorRecipes
+ .findRecipe(getBaseMetaTileEntity(), false, GT_Values.V[15], null, aStack);
+ if (tRecipe != null) {
+ tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize));
+ } else {
+ tProduct.add(aStack);
+ }
+ } else {
+ tProduct.add(aStack);
+ }
+ }
+ }
+ doCompress(tProduct);
+ }
+
+ @SafeVarargs
+ private void doWash(HashSet<Integer>... aTables) {
+ List<ItemStack> tProduct = new ArrayList<>();
+ if (sMidProduct != null) {
+ for (ItemStack aStack : sMidProduct) {
+ int tID = GT_Utility.stackToInt(aStack);
+ if (checkTypes(tID, aTables)) {
+ GT_Recipe tRecipe = RecipeMaps.oreWasherRecipes.findRecipe(
+ getBaseMetaTileEntity(),
+ false,
+ GT_Values.V[15],
+ new FluidStack[] { GT_ModHandler.getDistilledWater(Integer.MAX_VALUE) },
+ aStack);
+ if (tRecipe != null) {
+ tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize));
+ } else {
+ tProduct.add(aStack);
+ }
+ } else {
+ tProduct.add(aStack);
+ }
+ }
+ }
+ doCompress(tProduct);
+ }
+
+ @SafeVarargs
+ private void doThermal(HashSet<Integer>... aTables) {
+ List<ItemStack> tProduct = new ArrayList<>();
+ if (sMidProduct != null) {
+ for (ItemStack aStack : sMidProduct) {
+ int tID = GT_Utility.stackToInt(aStack);
+ if (checkTypes(tID, aTables)) {
+ GT_Recipe tRecipe = RecipeMaps.thermalCentrifugeRecipes
+ .findRecipe(getBaseMetaTileEntity(), false, GT_Values.V[15], null, aStack);
+ if (tRecipe != null) {
+ tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize));
+ } else {
+ tProduct.add(aStack);
+ }
+ } else {
+ tProduct.add(aStack);
+ }
+ }
+ }
+ doCompress(tProduct);
+ }
+
+ @SafeVarargs
+ private void doCentrifuge(HashSet<Integer>... aTables) {
+ List<ItemStack> tProduct = new ArrayList<>();
+ if (sMidProduct != null) {
+ for (ItemStack aStack : sMidProduct) {
+ int tID = GT_Utility.stackToInt(aStack);
+ if (checkTypes(tID, aTables)) {
+ GT_Recipe tRecipe = RecipeMaps.centrifugeRecipes
+ .findRecipe(getBaseMetaTileEntity(), false, GT_Values.V[15], null, aStack);
+ if (tRecipe != null) {
+ tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize));
+ } else {
+ tProduct.add(aStack);
+ }
+ } else {
+ tProduct.add(aStack);
+ }
+ }
+ }
+ doCompress(tProduct);
+ }
+
+ @SafeVarargs
+ private void doSift(HashSet<Integer>... aTables) {
+ List<ItemStack> tProduct = new ArrayList<>();
+ if (sMidProduct != null) {
+ for (ItemStack aStack : sMidProduct) {
+ int tID = GT_Utility.stackToInt(aStack);
+ if (checkTypes(tID, aTables)) {
+ GT_Recipe tRecipe = RecipeMaps.sifterRecipes
+ .findRecipe(getBaseMetaTileEntity(), false, GT_Values.V[15], null, aStack);
+ if (tRecipe != null) {
+ tProduct.addAll(getOutputStack(tRecipe, aStack.stackSize));
+ } else {
+ tProduct.add(aStack);
+ }
+ } else {
+ tProduct.add(aStack);
+ }
+ }
+ }
+ doCompress(tProduct);
+ }
+
+ @SafeVarargs
+ private void doChemWash(HashSet<Integer>... aTables) {
+ List<ItemStack> tProduct = new ArrayList<>();
+ if (sMidProduct != null) {
+ for (ItemStack aStack : sMidProduct) {
+ int tID = GT_Utility.stackToInt(aStack);
+ if (checkTypes(tID, aTables)) {
+ GT_Recipe tRecipe = RecipeMaps.chemicalBathRecipes.findRecipe(
+ getBaseMetaTileEntity(),
+ false,
+ GT_Values.V[15],
+ getStoredFluids().toArray(new FluidStack[0]),
+ aStack);
+ if (tRecipe != null && tRecipe.getRepresentativeFluidInput(0) != null) {
+ FluidStack tInputFluid = tRecipe.getRepresentativeFluidInput(0)
+ .copy();
+ int tStored = getFluidAmount(tInputFluid);
+ int tWashed = Math.min(tStored / tInputFluid.amount, aStack.stackSize);
+ depleteInput(new FluidStack(tInputFluid.getFluid(), tWashed * tInputFluid.amount));
+ tProduct.addAll(getOutputStack(tRecipe, tWashed));
+ if (tWashed < aStack.stackSize) {
+ tProduct.add(GT_Utility.copyAmountUnsafe(aStack.stackSize - tWashed, aStack));
+ }
+ } else {
+ tProduct.add(aStack);
+ }
+ } else {
+ tProduct.add(aStack);
+ }
+ }
+ }
+ doCompress(tProduct);
+ }
+
+ private int getFluidAmount(FluidStack aFluid) {
+ int tAmt = 0;
+ if (aFluid == null) return 0;
+ for (FluidStack fluid : getStoredFluids()) {
+ if (aFluid.isFluidEqual(fluid)) {
+ tAmt += fluid.amount;
+ }
+ }
+ return tAmt;
+ }
+
+ private List<ItemStack> getOutputStack(GT_Recipe aRecipe, int aTime) {
+ List<ItemStack> tOutput = new ArrayList<>();
+ for (int i = 0; i < aRecipe.mOutputs.length; i++) {
+ if (aRecipe.getOutput(i) == null) {
+ continue;
+ }
+ int tChance = aRecipe.getOutputChance(i);
+ if (tChance == 10000) {
+ tOutput.add(GT_Utility.copyAmountUnsafe(aTime * aRecipe.getOutput(i).stackSize, aRecipe.getOutput(i)));
+ } else {
+ // Use Normal Distribution
+ double u = aTime * (tChance / 10000D);
+ double e = aTime * (tChance / 10000D) * (1 - (tChance / 10000D));
+ Random random = new Random();
+ int tAmount = (int) Math.ceil(Math.sqrt(e) * random.nextGaussian() + u);
+ tOutput
+ .add(GT_Utility.copyAmountUnsafe(tAmount * aRecipe.getOutput(i).stackSize, aRecipe.getOutput(i)));
+ }
+ }
+ return tOutput.stream()
+ .filter(i -> (i != null && i.stackSize > 0))
+ .collect(Collectors.toList());
+ }
+
+ private void doCompress(List<ItemStack> aList) {
+ HashMap<Integer, Integer> rProduct = new HashMap<>();
+ for (ItemStack stack : aList) {
+ int tID = GT_Utility.stackToInt(stack);
+ if (sVoidStone) {
+ if (GT_Utility.areStacksEqual(Materials.Stone.getDust(1), stack)) {
+ continue;
+ }
+ }
+ if (tID != 0) {
+ if (rProduct.containsKey(tID)) {
+ rProduct.put(tID, rProduct.get(tID) + stack.stackSize);
+ } else {
+ rProduct.put(tID, stack.stackSize);
+ }
+ }
+ }
+ sMidProduct = new ItemStack[rProduct.size()];
+ int cnt = 0;
+ for (Integer id : rProduct.keySet()) {
+ ItemStack stack = GT_Utility.intToStack(id);
+ sMidProduct[cnt] = GT_Utility.copyAmountUnsafe(rProduct.get(id), stack);
+ cnt++;
+ }
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ return checkPiece(STRUCTURE_PIECE_MAIN, 8, 9, 1) && mMaintenanceHatches.size() <= 1
+ && !mMufflerHatches.isEmpty();
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 200;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_IntegratedOreFactory(mName);
+ }
+
+ private void setCurrentParallelism(int parallelism) {
+ this.currentParallelism = parallelism;
+ }
+
+ private int getCurrentParallelism() {
+ return this.currentParallelism;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ List<String> informationData = new ArrayList<>(Arrays.asList(super.getInfoData()));
+ String parallelism = StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": "
+ + EnumChatFormatting.BLUE
+ + getCurrentParallelism()
+ + EnumChatFormatting.RESET;
+ informationData.add(parallelism);
+ informationData.add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.void", sVoidStone));
+ informationData.addAll(getDisplayMode(sMode));
+ return informationData.toArray(new String[0]);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX2),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX2), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX2) };
+ }
+
+ private static List<String> getDisplayMode(int mode) {
+ final EnumChatFormatting AQUA = EnumChatFormatting.AQUA;
+ final String CRUSH = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Macerate");
+ final String WASH = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Ore_Washer")
+ .replace(" ", " " + AQUA);
+ final String THERMAL = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Thermal_Centrifuge")
+ .replace(" ", " " + AQUA);
+ final String CENTRIFUGE = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Centrifuge");
+ final String SIFTER = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Sifter");
+ final String CHEM_WASH = StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.Chemical_Bathing")
+ .replace(" ", " " + AQUA);
+ final String ARROW = " " + AQUA + "-> ";
+
+ List<String> des = new ArrayList<>();
+ des.add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor1") + " ");
+
+ switch (mode) {
+ case 0 -> {
+ des.add(AQUA + CRUSH + ARROW);
+ des.add(AQUA + WASH + ARROW);
+ des.add(AQUA + THERMAL + ARROW);
+ des.add(AQUA + CRUSH + ' ');
+ }
+ case 1 -> {
+ des.add(AQUA + CRUSH + ARROW);
+ des.add(AQUA + WASH + ARROW);
+ des.add(AQUA + CRUSH + ARROW);
+ des.add(AQUA + CENTRIFUGE + ' ');
+ }
+ case 2 -> {
+ des.add(AQUA + CRUSH + ARROW);
+ des.add(AQUA + CRUSH + ARROW);
+ des.add(AQUA + CENTRIFUGE + ' ');
+ }
+ case 3 -> {
+ des.add(AQUA + CRUSH + ARROW);
+ des.add(AQUA + WASH + ARROW);
+ des.add(AQUA + SIFTER + ' ');
+ }
+ case 4 -> {
+ des.add(AQUA + CRUSH + ARROW);
+ des.add(AQUA + CHEM_WASH + ARROW);
+ des.add(AQUA + CRUSH + ARROW);
+ des.add(AQUA + CENTRIFUGE + ' ');
+ }
+ default -> des.add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.WRONG_MODE"));
+ }
+
+ des.add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor2", getTime(mode) / 20));
+
+ return des;
+
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ NBTTagCompound tag = accessor.getNBTData();
+
+ currenttip.add(
+ StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": "
+ + EnumChatFormatting.BLUE
+ + tag.getInteger("currentParallelism")
+ + EnumChatFormatting.RESET);
+ currenttip.addAll(getDisplayMode(tag.getInteger("ssMode")));
+ currenttip
+ .add(StatCollector.translateToLocalFormatted("GT5U.machines.oreprocessor.void", tag.getBoolean("ssStone")));
+
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ tag.setInteger("ssMode", sMode);
+ tag.setBoolean("ssStone", sVoidStone);
+ tag.setInteger("currentParallelism", currentParallelism);
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler.java
new file mode 100644
index 0000000000..ae740447c8
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler.java
@@ -0,0 +1,504 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.GT_Values.STEAM_PER_WATER;
+import static gregtech.api.enums.ItemList.Circuit_Integrated;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_BOILER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_BOILER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_BOILER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_BOILER_GLOW;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.maps.LargeBoilerFuelBackend;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public abstract class GT_MetaTileEntity_LargeBoiler
+ extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_LargeBoiler> implements ISurvivalConstructable {
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final ClassValue<IStructureDefinition<GT_MetaTileEntity_LargeBoiler>> STRUCTURE_DEFINITION = new ClassValue<>() {
+
+ @Override
+ protected IStructureDefinition<GT_MetaTileEntity_LargeBoiler> computeValue(Class<?> type) {
+ return StructureDefinition.<GT_MetaTileEntity_LargeBoiler>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(
+ new String[][] { { "ccc", "ccc", "ccc" }, { "ccc", "cPc", "ccc" }, { "ccc", "cPc", "ccc" },
+ { "ccc", "cPc", "ccc" }, { "f~f", "fff", "fff" }, }))
+ .addElement('P', lazy(t -> ofBlock(t.getPipeBlock(), t.getPipeMeta())))
+ .addElement(
+ 'c',
+ lazy(
+ t -> buildHatchAdder(GT_MetaTileEntity_LargeBoiler.class).atLeast(OutputHatch)
+ .casingIndex(t.getCasingTextureIndex())
+ .dot(2)
+ .buildAndChain(
+ onElementPass(
+ GT_MetaTileEntity_LargeBoiler::onCasingAdded,
+ ofBlock(t.getCasingBlock(), t.getCasingMeta())))))
+ .addElement(
+ 'f',
+ lazy(
+ t -> buildHatchAdder(GT_MetaTileEntity_LargeBoiler.class)
+ .atLeast(Maintenance, InputHatch, InputBus, Muffler)
+ .casingIndex(t.getFireboxTextureIndex())
+ .dot(1)
+ .buildAndChain(
+ onElementPass(
+ GT_MetaTileEntity_LargeBoiler::onFireboxAdded,
+ ofBlock(t.getFireboxBlock(), t.getFireboxMeta())))))
+ .build();
+ }
+ };
+ private boolean firstRun = true;
+ private int mSuperEfficencyIncrease = 0;
+ private int integratedCircuitConfig = 0; // Steam output is reduced by 1000L per config
+ private int excessWater = 0; // Eliminate rounding errors for water
+ private int excessFuel = 0; // Eliminate rounding errors for fuels that burn half items
+ private int excessProjectedEU = 0; // Eliminate rounding errors from throttling the boiler
+ private int mCasingAmount;
+ private int mFireboxAmount;
+ protected int pollutionPerSecond = 1; // placeholder for the child classes
+
+ public GT_MetaTileEntity_LargeBoiler(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_LargeBoiler(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+
+ tt.addMachineType("Boiler")
+ .addInfo("Controller block for the Large " + getCasingMaterial() + " Boiler");
+ // Tooltip differs between the boilers that output Superheated Steam (Titanium and Tungstensteel) and the ones
+ // that do not (Bronze and Steel)
+ if (isSuperheated()) {
+ tt.addInfo(
+ "Produces " + formatNumbers((getEUt() * 40) * ((runtimeBoost(20) / (20f)) / superToNormalSteam))
+ + "L of Superheated Steam with 1 Coal at "
+ + formatNumbers((getEUt() * 40L) / superToNormalSteam)
+ + "L/s") // ?
+ .addInfo("A programmed circuit in the main block throttles the boiler (-1000L/s per config)")
+ .addInfo("Only some solid fuels are allowed (check the NEI Large Boiler tab for details)")
+ .addInfo("If there are any disallowed fuels in the input bus, the boiler won't run!");
+ } else {
+ tt.addInfo(
+ "Produces " + formatNumbers((getEUt() * 40) * (runtimeBoost(20) / 20f))
+ + "L of Steam with 1 Coal at "
+ + formatNumbers(getEUt() * 40L)
+ + "L/s") // ?
+ .addInfo("A programmed circuit in the main block throttles the boiler (-1000L/s per config)")
+ .addInfo("Solid Fuels with a burn value that is too high or too low will not work");
+ }
+ tt.addInfo(
+ String.format(
+ "Diesel fuels have 1/4 efficiency - Takes %s seconds to heat up",
+ formatNumbers(500.0 / getEfficiencyIncrease()))) // ? check semifluid again
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 5, 3, false)
+ .addController("Front bottom")
+ .addCasingInfoRange(getCasingMaterial() + " " + getCasingBlockType() + " Casing", 24, 31, false) // ?
+ .addOtherStructurePart(getCasingMaterial() + " Fire Boxes", "Bottom layer, 3 minimum")
+ .addOtherStructurePart(getCasingMaterial() + " Pipe Casing Blocks", "Inner 3 blocks")
+ .addMaintenanceHatch("Any firebox", 1)
+ .addMufflerHatch("Any firebox", 1)
+ .addInputBus("Solid fuel, Any firebox", 1)
+ .addInputHatch("Liquid fuel, Any firebox", 1)
+ .addStructureInfo("You can use either, or both")
+ .addInputHatch("Water, Any firebox", 1)
+ .addOutputHatch("Steam, any casing", 2)
+ .toolTipFinisher("Gregtech");
+
+ return tt;
+ }
+
+ public abstract String getCasingMaterial();
+
+ public abstract Block getCasingBlock();
+
+ public abstract String getCasingBlockType();
+
+ public abstract byte getCasingMeta();
+
+ public abstract byte getCasingTextureIndex();
+
+ public abstract Block getPipeBlock();
+
+ public abstract byte getPipeMeta();
+
+ public abstract Block getFireboxBlock();
+
+ public abstract byte getFireboxMeta();
+
+ public abstract byte getFireboxTextureIndex();
+
+ public abstract int getEUt();
+
+ public abstract int getEfficiencyIncrease();
+
+ public int getIntegratedCircuitConfig() {
+ return integratedCircuitConfig;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ // allows for 0 pollution if circuit throttle is too high
+ return Math.max(
+ 0,
+ (int) (pollutionPerSecond
+ * (1 - GT_Mod.gregtechproxy.mPollutionReleasedByThrottle * getIntegratedCircuitConfig())));
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ if (aActive) return new ITexture[] { BlockIcons.getCasingTextureForId(getCasingTextureIndex()),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_LARGE_BOILER_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_LARGE_BOILER_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { BlockIcons.getCasingTextureForId(getCasingTextureIndex()), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_LARGE_BOILER)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_LARGE_BOILER_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(getCasingTextureIndex()) };
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ boolean isFuelValid() {
+ if (!isSuperheated()) return true;
+ for (ItemStack input : getStoredInputs()) {
+ if (!LargeBoilerFuelBackend.isAllowedSolidFuel(input)
+ && !Circuit_Integrated.isStackEqual(input, true, true)) {
+ // if any item is not in ALLOWED_SOLID_FUELS, operation cannot be allowed because it might still be
+ // consumed
+ this.mMaxProgresstime = 0;
+ this.mEUt = 0;
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ // Only for visual
+ return RecipeMaps.largeBoilerFakeFuels;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ if (!isFuelValid()) return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ // Do we have an integrated circuit with a valid configuration?
+ if (Circuit_Integrated.isStackEqual(mInventory[1], true, true)) {
+ int circuit_config = mInventory[1].getItemDamage();
+ if (circuit_config >= 1 && circuit_config <= 25) {
+ // If so, overwrite the current config
+ this.integratedCircuitConfig = circuit_config;
+ }
+ } else {
+ // If not, set the config to zero
+ this.integratedCircuitConfig = 0;
+ }
+
+ this.mSuperEfficencyIncrease = 0;
+ if (!isSuperheated()) {
+ for (GT_Recipe tRecipe : RecipeMaps.dieselFuels.getAllRecipes()) {
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(tRecipe.getRepresentativeInput(0), true);
+ if (tFluid != null && tRecipe.mSpecialValue > 1) {
+ tFluid.amount = 1000;
+ if (depleteInput(tFluid)) {
+ this.mMaxProgresstime = adjustBurnTimeForConfig(runtimeBoost(tRecipe.mSpecialValue / 2));
+ this.mEUt = adjustEUtForConfig(getEUt());
+ this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease() * 4;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ }
+ }
+ for (GT_Recipe tRecipe : RecipeMaps.denseLiquidFuels.getAllRecipes()) {
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(tRecipe.getRepresentativeInput(0), true);
+ if (tFluid != null) {
+ tFluid.amount = 1000;
+ if (depleteInput(tFluid)) {
+ this.mMaxProgresstime = adjustBurnTimeForConfig(
+ Math.max(1, runtimeBoost(tRecipe.mSpecialValue * 2)));
+ this.mEUt = adjustEUtForConfig(getEUt());
+ this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease();
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ }
+ }
+ }
+
+ ArrayList<ItemStack> tInputList = getStoredInputs();
+ if (!tInputList.isEmpty()) {
+ if (isSuperheated()) {
+ for (ItemStack tInput : tInputList) {
+ if (tInput != GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Lava, 1)) {
+ if (GT_Utility.getFluidForFilledItem(tInput, true) == null
+ && (this.mMaxProgresstime = GT_ModHandler.getFuelValue(tInput) / 80) > 0) {
+ this.excessFuel += GT_ModHandler.getFuelValue(tInput) % 80;
+ this.mMaxProgresstime += this.excessFuel / 80;
+ this.excessFuel %= 80;
+ this.mMaxProgresstime = adjustBurnTimeForConfig(runtimeBoost(this.mMaxProgresstime));
+ this.mEUt = adjustEUtForConfig(getEUt());
+ this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease();
+ this.mOutputItems = new ItemStack[] { GT_Utility.getContainerItem(tInput, true) };
+ tInput.stackSize -= 1;
+ updateSlots();
+ if (this.mEfficiencyIncrease > 5000) {
+ this.mEfficiencyIncrease = 0;
+ this.mSuperEfficencyIncrease = 20;
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ }
+ }
+ } else {
+ for (ItemStack tInput : tInputList) {
+ if (tInput != GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Lava, 1)) {
+ // Solid fuels with burn values below getEUt are ignored (mostly items like sticks), and also
+ // those with very high fuel values that would cause an overflow error.
+ if (GT_Utility.getFluidForFilledItem(tInput, true) == null
+ && (this.mMaxProgresstime = GT_ModHandler.getFuelValue(tInput) / 80) > 0
+ && (GT_ModHandler.getFuelValue(tInput) * 2 / this.getEUt()) > 1
+ && GT_ModHandler.getFuelValue(tInput) < 100000000) {
+ this.excessFuel += GT_ModHandler.getFuelValue(tInput) % 80;
+ this.mMaxProgresstime += this.excessFuel / 80;
+ this.excessFuel %= 80;
+ this.mMaxProgresstime = adjustBurnTimeForConfig(runtimeBoost(this.mMaxProgresstime));
+ this.mEUt = adjustEUtForConfig(getEUt());
+ this.mEfficiencyIncrease = this.mMaxProgresstime * getEfficiencyIncrease();
+ this.mOutputItems = new ItemStack[] { GT_Utility.getContainerItem(tInput, true) };
+ tInput.stackSize -= 1;
+ updateSlots();
+ if (this.mEfficiencyIncrease > 5000) {
+ this.mEfficiencyIncrease = 0;
+ this.mSuperEfficencyIncrease = 20;
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ }
+ }
+ }
+ }
+ this.mMaxProgresstime = 0;
+ this.mEUt = 0;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+
+ abstract int runtimeBoost(int mTime);
+
+ abstract boolean isSuperheated();
+
+ private final int superToNormalSteam = 3;
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (this.mEUt > 0) {
+ if (this.mSuperEfficencyIncrease > 0) mEfficiency = Math.max(
+ 0,
+ Math.min(
+ mEfficiency + mSuperEfficencyIncrease,
+ getMaxEfficiency(mInventory[1]) - ((getIdealStatus() - getRepairStatus()) * 1000)));
+ int tGeneratedEU = (int) (this.mEUt * 2L * this.mEfficiency / 10000L);
+ if (tGeneratedEU > 0) {
+ long amount = (tGeneratedEU + STEAM_PER_WATER) / STEAM_PER_WATER;
+ excessWater += amount * STEAM_PER_WATER - tGeneratedEU;
+ amount -= excessWater / STEAM_PER_WATER;
+ excessWater %= STEAM_PER_WATER;
+ startRecipeProcessing();
+ if (isSuperheated()) {
+ // Consumes only one third of the water if producing Superheated Steam, to maintain water in the
+ // chain.
+ if (depleteInput(Materials.Water.getFluid(amount / superToNormalSteam))
+ || depleteInput(GT_ModHandler.getDistilledWater(amount / superToNormalSteam))) {
+ // Outputs Superheated Steam instead of Steam, at one third of the amount (equivalent in power
+ // output to the normal Steam amount).
+ addOutput(
+ FluidRegistry.getFluidStack("ic2superheatedsteam", tGeneratedEU / superToNormalSteam));
+ } else {
+ GT_Log.exp.println("Boiler " + this.mName + " had no Water!");
+ explodeMultiblock();
+ }
+ } else {
+ if (depleteInput(Materials.Water.getFluid(amount))
+ || depleteInput(GT_ModHandler.getDistilledWater(amount))) {
+ addOutput(GT_ModHandler.getSteam(tGeneratedEU));
+ } else {
+ GT_Log.exp.println("Boiler " + this.mName + " had no Water!");
+ explodeMultiblock();
+ }
+ }
+ endRecipeProcessing();
+ }
+ return true;
+ }
+ return true;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("excessFuel", excessFuel);
+ aNBT.setInteger("excessWater", excessWater);
+ aNBT.setInteger("excessProjectedEU", excessProjectedEU);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ excessFuel = aNBT.getInteger("excessFuel");
+ excessWater = aNBT.getInteger("excessWater");
+ excessProjectedEU = aNBT.getInteger("excessProjectedEU");
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (mProgresstime > 0 && firstRun) {
+ firstRun = false;
+ GT_Mod.achievements.issueAchievement(
+ aBaseMetaTileEntity.getWorld()
+ .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()),
+ "extremepressure");
+ }
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_LargeBoiler> getStructureDefinition() {
+ return STRUCTURE_DEFINITION.get(getClass());
+ }
+
+ private void onCasingAdded() {
+ mCasingAmount++;
+ }
+
+ private void onFireboxAdded() {
+ mFireboxAmount++;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasingAmount = 0;
+ mFireboxAmount = 0;
+ return checkPiece(STRUCTURE_PIECE_MAIN, 1, 4, 0) && mCasingAmount >= 24
+ && mFireboxAmount >= 3
+ && mMaintenanceHatches.size() == 1
+ && !mMufflerHatches.isEmpty();
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ private int adjustEUtForConfig(int rawEUt) {
+ int adjustedSteamOutput = rawEUt - (isSuperheated() ? 75 : 25) * integratedCircuitConfig;
+ return Math.max(adjustedSteamOutput, 25);
+ }
+
+ private int adjustBurnTimeForConfig(int rawBurnTime) {
+ if (mEfficiency < getMaxEfficiency(mInventory[1]) - ((getIdealStatus() - getRepairStatus()) * 1000)) {
+ return rawBurnTime;
+ }
+ int adjustedEUt = Math.max(25, getEUt() - (isSuperheated() ? 75 : 25) * integratedCircuitConfig);
+ int adjustedBurnTime = rawBurnTime * getEUt() / adjustedEUt;
+ this.excessProjectedEU += getEUt() * rawBurnTime - adjustedEUt * adjustedBurnTime;
+ adjustedBurnTime += this.excessProjectedEU / adjustedEUt;
+ this.excessProjectedEU %= adjustedEUt;
+ return adjustedBurnTime;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 4, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 4, 0, elementBudget, env, false, true);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Bronze.java
new file mode 100644
index 0000000000..2effcf7966
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Bronze.java
@@ -0,0 +1,96 @@
+package gregtech.common.tileentities.machines.multi;
+
+import net.minecraft.block.Block;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public class GT_MetaTileEntity_LargeBoiler_Bronze extends GT_MetaTileEntity_LargeBoiler {
+
+ public GT_MetaTileEntity_LargeBoiler_Bronze(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeBronzeBoilerPerSecond;
+ }
+
+ public GT_MetaTileEntity_LargeBoiler_Bronze(String aName) {
+ super(aName);
+ pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeBronzeBoilerPerSecond;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_LargeBoiler_Bronze(this.mName);
+ }
+
+ @Override
+ public String getCasingMaterial() {
+ return "Bronze";
+ }
+
+ @Override
+ public String getCasingBlockType() {
+ return "Plated Bricks";
+ }
+
+ @Override
+ public Block getCasingBlock() {
+ return GregTech_API.sBlockCasings1;
+ }
+
+ @Override
+ public byte getCasingMeta() {
+ return 10;
+ }
+
+ @Override
+ public byte getCasingTextureIndex() {
+ return 10;
+ }
+
+ @Override
+ public Block getPipeBlock() {
+ return GregTech_API.sBlockCasings2;
+ }
+
+ @Override
+ public byte getPipeMeta() {
+ return 12;
+ }
+
+ @Override
+ public Block getFireboxBlock() {
+ return GregTech_API.sBlockCasings3;
+ }
+
+ @Override
+ public byte getFireboxMeta() {
+ return 13;
+ }
+
+ @Override
+ public byte getFireboxTextureIndex() {
+ return 45;
+ }
+
+ @Override
+ public int getEUt() {
+ return 400;
+ }
+
+ @Override
+ public int getEfficiencyIncrease() {
+ return 16;
+ }
+
+ @Override
+ int runtimeBoost(int mTime) {
+ return mTime * 2;
+ }
+
+ @Override
+ boolean isSuperheated() {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Steel.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Steel.java
new file mode 100644
index 0000000000..c7bd766945
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Steel.java
@@ -0,0 +1,96 @@
+package gregtech.common.tileentities.machines.multi;
+
+import net.minecraft.block.Block;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public class GT_MetaTileEntity_LargeBoiler_Steel extends GT_MetaTileEntity_LargeBoiler {
+
+ public GT_MetaTileEntity_LargeBoiler_Steel(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeSteelBoilerPerSecond;
+ }
+
+ public GT_MetaTileEntity_LargeBoiler_Steel(String aName) {
+ super(aName);
+ pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeSteelBoilerPerSecond;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_LargeBoiler_Steel(this.mName);
+ }
+
+ @Override
+ public String getCasingMaterial() {
+ return "Steel";
+ }
+
+ @Override
+ public String getCasingBlockType() {
+ return "Machine Casings";
+ }
+
+ @Override
+ public Block getCasingBlock() {
+ return GregTech_API.sBlockCasings2;
+ }
+
+ @Override
+ public byte getCasingMeta() {
+ return 0;
+ }
+
+ @Override
+ public byte getCasingTextureIndex() {
+ return 16;
+ }
+
+ @Override
+ public Block getPipeBlock() {
+ return GregTech_API.sBlockCasings2;
+ }
+
+ @Override
+ public byte getPipeMeta() {
+ return 13;
+ }
+
+ @Override
+ public Block getFireboxBlock() {
+ return GregTech_API.sBlockCasings3;
+ }
+
+ @Override
+ public byte getFireboxMeta() {
+ return 14;
+ }
+
+ @Override
+ public byte getFireboxTextureIndex() {
+ return 46;
+ }
+
+ @Override
+ public int getEUt() {
+ return 1000;
+ }
+
+ @Override
+ public int getEfficiencyIncrease() {
+ return 12;
+ }
+
+ @Override
+ int runtimeBoost(int mTime) {
+ return mTime;
+ }
+
+ @Override
+ boolean isSuperheated() {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Titanium.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Titanium.java
new file mode 100644
index 0000000000..61f2756622
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_Titanium.java
@@ -0,0 +1,96 @@
+package gregtech.common.tileentities.machines.multi;
+
+import net.minecraft.block.Block;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public class GT_MetaTileEntity_LargeBoiler_Titanium extends GT_MetaTileEntity_LargeBoiler {
+
+ public GT_MetaTileEntity_LargeBoiler_Titanium(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeTitaniumBoilerPerSecond;
+ }
+
+ public GT_MetaTileEntity_LargeBoiler_Titanium(String aName) {
+ super(aName);
+ pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeTitaniumBoilerPerSecond;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_LargeBoiler_Titanium(this.mName);
+ }
+
+ @Override
+ public String getCasingMaterial() {
+ return "Titanium";
+ }
+
+ @Override
+ public String getCasingBlockType() {
+ return "Machine Casings";
+ }
+
+ @Override
+ public Block getCasingBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ @Override
+ public byte getCasingMeta() {
+ return 2;
+ }
+
+ @Override
+ public byte getCasingTextureIndex() {
+ return 50;
+ }
+
+ @Override
+ public Block getPipeBlock() {
+ return GregTech_API.sBlockCasings2;
+ }
+
+ @Override
+ public byte getPipeMeta() {
+ return 14;
+ }
+
+ @Override
+ public Block getFireboxBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ @Override
+ public byte getFireboxMeta() {
+ return 3;
+ }
+
+ @Override
+ public byte getFireboxTextureIndex() {
+ return 51;
+ }
+
+ @Override
+ public int getEUt() {
+ return 4000;
+ }
+
+ @Override
+ public int getEfficiencyIncrease() {
+ return 8;
+ }
+
+ @Override
+ int runtimeBoost(int mTime) {
+ return mTime * 130 / 400;
+ }
+
+ @Override
+ boolean isSuperheated() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_TungstenSteel.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_TungstenSteel.java
new file mode 100644
index 0000000000..f00ea287b2
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeBoiler_TungstenSteel.java
@@ -0,0 +1,96 @@
+package gregtech.common.tileentities.machines.multi;
+
+import net.minecraft.block.Block;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public class GT_MetaTileEntity_LargeBoiler_TungstenSteel extends GT_MetaTileEntity_LargeBoiler {
+
+ public GT_MetaTileEntity_LargeBoiler_TungstenSteel(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeTungstenSteelBoilerPerSecond;
+ }
+
+ public GT_MetaTileEntity_LargeBoiler_TungstenSteel(String aName) {
+ super(aName);
+ pollutionPerSecond = GT_Mod.gregtechproxy.mPollutionLargeTungstenSteelBoilerPerSecond;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_LargeBoiler_TungstenSteel(this.mName);
+ }
+
+ @Override
+ public String getCasingMaterial() {
+ return "TungstenSteel";
+ }
+
+ @Override
+ public String getCasingBlockType() {
+ return "Machine Casings";
+ }
+
+ @Override
+ public Block getCasingBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ @Override
+ public byte getCasingMeta() {
+ return 0;
+ }
+
+ @Override
+ public byte getCasingTextureIndex() {
+ return 48;
+ }
+
+ @Override
+ public Block getPipeBlock() {
+ return GregTech_API.sBlockCasings2;
+ }
+
+ @Override
+ public byte getPipeMeta() {
+ return 15;
+ }
+
+ @Override
+ public Block getFireboxBlock() {
+ return GregTech_API.sBlockCasings3;
+ }
+
+ @Override
+ public byte getFireboxMeta() {
+ return 15;
+ }
+
+ @Override
+ public byte getFireboxTextureIndex() {
+ return 47;
+ }
+
+ @Override
+ public int getEUt() {
+ return 16000;
+ }
+
+ @Override
+ public int getEfficiencyIncrease() {
+ return 4;
+ }
+
+ @Override
+ int runtimeBoost(int mTime) {
+ return mTime * 120 / 750;
+ }
+
+ @Override
+ boolean isSuperheated() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeChemicalReactor.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeChemicalReactor.java
new file mode 100644
index 0000000000..8e4b5ec650
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeChemicalReactor.java
@@ -0,0 +1,298 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment;
+import com.gtnewhorizon.structurelib.structure.IItemSource;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+import com.gtnewhorizon.structurelib.util.ItemStackPredicate;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.interfaces.IHeatingCoil;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_LargeChemicalReactor extends
+ GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_LargeChemicalReactor> implements ISurvivalConstructable {
+
+ private static final int CASING_INDEX = 176;
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final IStructureDefinition<GT_MetaTileEntity_LargeChemicalReactor> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_LargeChemicalReactor>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(new String[][] { { "ccc", "cxc", "ccc" }, { "c~c", "xPx", "cxc" }, { "ccc", "cxc", "ccc" }, }))
+ .addElement('P', ofBlock(GregTech_API.sBlockCasings8, 1))
+ .addElement(
+ 'c',
+ buildHatchAdder(GT_MetaTileEntity_LargeChemicalReactor.class)
+ .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy)
+ .casingIndex(CASING_INDEX)
+ .dot(1)
+ .buildAndChain(
+ onElementPass(
+ GT_MetaTileEntity_LargeChemicalReactor::onCasingAdded,
+ ofBlock(GregTech_API.sBlockCasings8, 0))))
+ .addElement(
+ 'x',
+ buildHatchAdder(GT_MetaTileEntity_LargeChemicalReactor.class)
+ .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy)
+ .casingIndex(CASING_INDEX)
+ .dot(1)
+ .buildAndChain(
+ CoilStructureElement.INSTANCE,
+ onElementPass(
+ GT_MetaTileEntity_LargeChemicalReactor::onCasingAdded,
+ ofBlock(GregTech_API.sBlockCasings8, 0))))
+ .build();
+
+ private int mCasingAmount;
+ private int mCoilAmount;
+
+ public GT_MetaTileEntity_LargeChemicalReactor(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_LargeChemicalReactor(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_LargeChemicalReactor(this.mName);
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Chemical Reactor")
+ .addInfo("Controller block for the Large Chemical Reactor")
+ .addInfo("Does not lose efficiency when overclocked")
+ .addInfo("Accepts fluids instead of fluid cells")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, false)
+ .addController("Front center")
+ .addCasingInfoRange("Chemically Inert Machine Casing", 8, 22, false)
+ .addOtherStructurePart("PTFE Pipe Machine Casing", "Center")
+ .addOtherStructurePart("Heating Coil", "Adjacent to the PTFE Pipe Machine Casing", 1)
+ .addEnergyHatch("Any casing", 1, 2)
+ .addMaintenanceHatch("Any casing", 1, 2)
+ .addInputBus("Any casing", 1, 2)
+ .addInputHatch("Any casing", 1, 2)
+ .addOutputBus("Any casing", 1, 2)
+ .addOutputHatch("Any casing", 1, 2)
+ .addStructureInfo("You can have multiple hatches/busses")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ if (aActive) return new ITexture[] { casingTexturePages[1][48], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { casingTexturePages[1][48], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { casingTexturePages[1][48] };
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public boolean supportsSingleRecipeLocking() {
+ return true;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.multiblockChemicalReactorRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic().enablePerfectOverclock();
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_LargeChemicalReactor> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ private void onCasingAdded() {
+ mCasingAmount++;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasingAmount = 0;
+ mCoilAmount = 0;
+ return checkPiece(STRUCTURE_PIECE_MAIN, 1, 1, 0) && mCasingAmount >= 8
+ && mCoilAmount == 1
+ && !mEnergyHatches.isEmpty()
+ && mMaintenanceHatches.size() == 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ mCoilAmount = 0;
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ mCoilAmount = 0;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ private enum CoilStructureElement implements IStructureElement<GT_MetaTileEntity_LargeChemicalReactor> {
+
+ INSTANCE;
+
+ @Override
+ public boolean check(GT_MetaTileEntity_LargeChemicalReactor t, World world, int x, int y, int z) {
+ Block block = world.getBlock(x, y, z);
+ if (block instanceof IHeatingCoil
+ && ((IHeatingCoil) block).getCoilHeat(world.getBlockMetadata(x, y, z)) != HeatingCoilLevel.None) {
+ return t.mCoilAmount++ == 0;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean spawnHint(GT_MetaTileEntity_LargeChemicalReactor t, World world, int x, int y, int z,
+ ItemStack trigger) {
+ StructureLibAPI.hintParticle(world, x, y, z, GregTech_API.sBlockCasings5, 0);
+ return true;
+ }
+
+ @Override
+ public boolean placeBlock(GT_MetaTileEntity_LargeChemicalReactor t, World world, int x, int y, int z,
+ ItemStack trigger) {
+ if (t.mCoilAmount > 0) return false;
+ boolean b = world.setBlock(x, y, z, GregTech_API.sBlockCasings5, 0, 3);
+ if (b) t.mCoilAmount++;
+ return b;
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(GT_MetaTileEntity_LargeChemicalReactor t, World world, int x, int y,
+ int z, ItemStack trigger, IItemSource s, EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
+ return survivalPlaceBlock(t, world, x, y, z, trigger, AutoPlaceEnvironment.fromLegacy(s, actor, chatter));
+ }
+
+ @Override
+ public BlocksToPlace getBlocksToPlace(
+ GT_MetaTileEntity_LargeChemicalReactor gt_metaTileEntity_largeChemicalReactor, World world, int x, int y,
+ int z, ItemStack trigger, AutoPlaceEnvironment env) {
+ return BlocksToPlace.create(
+ IntStream.range(0, 8)
+ .mapToObj(i -> new ItemStack(GregTech_API.sBlockCasings5, 1, i))
+ .collect(Collectors.toList()));
+ }
+
+ @Override
+ public PlaceResult survivalPlaceBlock(GT_MetaTileEntity_LargeChemicalReactor t, World world, int x, int y,
+ int z, ItemStack trigger, AutoPlaceEnvironment env) {
+ if (t.mCoilAmount > 0) return PlaceResult.SKIP;
+ if (check(t, world, x, y, z)) return PlaceResult.SKIP;
+ if (!StructureLibAPI.isBlockTriviallyReplaceable(world, x, y, z, env.getActor())) return PlaceResult.REJECT;
+ ItemStack result = env.getSource()
+ .takeOne(ItemStackPredicate.from(GregTech_API.sBlockCasings5), true);
+ if (result == null) return PlaceResult.REJECT;
+ PlaceResult ret = StructureUtility.survivalPlaceBlock(
+ result,
+ ItemStackPredicate.NBTMode.EXACT,
+ null,
+ true,
+ world,
+ x,
+ y,
+ z,
+ env.getSource(),
+ env.getActor(),
+ env.getChatter());
+ if (ret == PlaceResult.ACCEPT) t.mCoilAmount++;
+ return ret;
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine.java
new file mode 100644
index 0000000000..54ad5939f8
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine.java
@@ -0,0 +1,492 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Dynamo;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.Textures.BlockIcons.TURBINE_NEW;
+import static gregtech.api.enums.Textures.BlockIcons.TURBINE_NEW_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.TURBINE_NEW_EMPTY;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.IBlockAccess;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
+import com.gtnewhorizon.structurelib.alignment.enumerable.Flip;
+import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.LightingHelper;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gregtech.common.render.GT_RenderUtil;
+
+public abstract class GT_MetaTileEntity_LargeTurbine
+ extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_LargeTurbine> implements ISurvivalConstructable {
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final ClassValue<IStructureDefinition<GT_MetaTileEntity_LargeTurbine>> STRUCTURE_DEFINITION = new ClassValue<>() {
+
+ @Override
+ protected IStructureDefinition<GT_MetaTileEntity_LargeTurbine> computeValue(Class<?> type) {
+ return StructureDefinition.<GT_MetaTileEntity_LargeTurbine>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(
+ new String[][] { { " ", " ", " ", " ", " ", },
+ { " --- ", " ccc ", " hhh ", " hhh ", " hhh ", },
+ { " --- ", " c~c ", " h-h ", " h-h ", " hdh ", },
+ { " --- ", " ccc ", " hhh ", " hhh ", " hhh ", },
+ { " ", " ", " ", " ", " ", }, }))
+ .addElement('c', lazy(t -> ofBlock(t.getCasingBlock(), t.getCasingMeta())))
+ .addElement('d', lazy(t -> Dynamo.newAny(t.getCasingTextureIndex(), 1)))
+ .addElement(
+ 'h',
+ lazy(
+ t -> buildHatchAdder(GT_MetaTileEntity_LargeTurbine.class)
+ .atLeast(Maintenance, InputHatch, OutputHatch, OutputBus, InputBus, Muffler)
+ .casingIndex(t.getCasingTextureIndex())
+ .dot(2)
+ .buildAndChain(t.getCasingBlock(), t.getCasingMeta())))
+ .build();
+ }
+ };
+
+ protected int baseEff = 0;
+ protected int optFlow = 0;
+ protected double realOptFlow = 0;
+ protected int storedFluid = 0;
+ protected int counter = 0;
+ protected boolean looseFit = false;
+ protected int overflowMultiplier = 0;
+ protected final float[] flowMultipliers = new float[] { 1, 1, 1 };
+
+ // client side stuff
+ protected boolean mHasTurbine;
+ // mMachine got overwritten by StructureLib extended facing query response
+ // so we use a separate field for this
+ protected boolean mFormed;
+
+ public GT_MetaTileEntity_LargeTurbine(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_LargeTurbine(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return getMaxEfficiency(aStack) > 0;
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_LargeTurbine> getStructureDefinition() {
+ return STRUCTURE_DEFINITION.get(getClass());
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ return (d, r, f) -> r.isNotRotated() && f.isNotFlipped();
+ }
+
+ @Override
+ protected ExtendedFacing getCorrectedAlignment(ExtendedFacing aOldFacing) {
+ return aOldFacing.with(Flip.NONE)
+ .with(Rotation.NORMAL);
+ }
+
+ @Override
+ public boolean isFlipChangeAllowed() {
+ return false;
+ }
+
+ @Override
+ public boolean isRotationChangeAllowed() {
+ return false;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ return checkPiece(STRUCTURE_PIECE_MAIN, 2, 2, 1) && mMaintenanceHatches.size() == 1
+ && mMufflerHatches.isEmpty() == (getPollutionPerTick(null) == 0);
+ }
+
+ public abstract Block getCasingBlock();
+
+ public abstract byte getCasingMeta();
+
+ public abstract int getCasingTextureIndex();
+
+ public boolean isNewStyleRendering() {
+ return false;
+ }
+
+ public IIconContainer[] getTurbineTextureActive() {
+ return TURBINE_NEW_ACTIVE;
+ }
+
+ public IIconContainer[] getTurbineTextureFull() {
+ return TURBINE_NEW;
+ }
+
+ public IIconContainer[] getTurbineTextureEmpty() {
+ return TURBINE_NEW_EMPTY;
+ }
+
+ @Override
+ public boolean renderInWorld(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, RenderBlocks aRenderer) {
+ if (!isNewStyleRendering() || !mFormed) return false;
+ int[] tABCCoord = new int[] { -1, -1, 0 };
+ int[] tXYZOffset = new int[3];
+ final ForgeDirection tFacing = getBaseMetaTileEntity().getFrontFacing();
+ final ExtendedFacing tExtendedFacing = getExtendedFacing();
+ final ForgeDirection tDirection = tExtendedFacing.getDirection();
+ final LightingHelper tLighting = new LightingHelper(aRenderer);
+
+ // for some reason +x and -z need this field set to true, but not any other sides
+ if (tFacing == ForgeDirection.NORTH || tFacing == ForgeDirection.EAST) aRenderer.field_152631_f = true;
+ final Block tBlock = getCasingBlock();
+
+ IIconContainer[] tTextures;
+ if (getBaseMetaTileEntity().isActive()) tTextures = getTurbineTextureActive();
+ else if (hasTurbine()) tTextures = getTurbineTextureFull();
+ else tTextures = getTurbineTextureEmpty();
+
+ assert tTextures != null && tTextures.length == tABCCoord.length;
+
+ for (int i = 0; i < 9; i++) {
+ if (i != 4) { // do not draw ourselves again.
+ tExtendedFacing.getWorldOffset(tABCCoord, tXYZOffset);
+ // since structure check passed, we can assume it is turbine casing
+ int tX = tXYZOffset[0] + aX;
+ int tY = tXYZOffset[1] + aY;
+ int tZ = tXYZOffset[2] + aZ;
+ // we skip the occlusion test, as we always require a working turbine to have a block of air before it
+ // so the front face cannot be occluded whatsoever in the most cases.
+ Tessellator.instance.setBrightness(
+ tBlock.getMixedBrightnessForBlock(
+ aWorld,
+ aX + tDirection.offsetX,
+ tY + tDirection.offsetY,
+ aZ + tDirection.offsetZ));
+ tLighting.setupLighting(tBlock, tX, tY, tZ, tFacing)
+ .setupColor(tFacing, Dyes._NULL.mRGBa);
+ GT_RenderUtil.renderBlockIcon(
+ aRenderer,
+ tBlock,
+ tX + tDirection.offsetX * 0.01,
+ tY + tDirection.offsetY * 0.01,
+ tZ + tDirection.offsetZ * 0.01,
+ tTextures[i].getIcon(),
+ tFacing);
+ }
+ if (++tABCCoord[0] == 2) {
+ tABCCoord[0] = -1;
+ tABCCoord[1]++;
+ }
+ }
+
+ aRenderer.field_152631_f = false;
+ return false;
+ }
+
+ @Override
+ public void onValueUpdate(byte aValue) {
+ mHasTurbine = (aValue & 0x1) != 0;
+ mFormed = (aValue & 0x2) != 0;
+ super.onValueUpdate(aValue);
+ }
+
+ @Override
+ public byte getUpdateData() {
+ return (byte) ((hasTurbine() ? 1 : 0) | (mMachine ? 2 : 0));
+ }
+
+ @Override
+ public boolean addToMachineList(IGregTechTileEntity tTileEntity, int aBaseCasingIndex) {
+ return addMaintenanceToMachineList(tTileEntity, getCasingTextureIndex())
+ || addInputToMachineList(tTileEntity, getCasingTextureIndex())
+ || addOutputToMachineList(tTileEntity, getCasingTextureIndex())
+ || addMufflerToMachineList(tTileEntity, getCasingTextureIndex());
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ ItemStack controllerSlot = getControllerSlot();
+ if ((counter & 7) == 0
+ && (controllerSlot == null || !(controllerSlot.getItem() instanceof GT_MetaGenerated_Tool)
+ || controllerSlot.getItemDamage() < 170
+ || controllerSlot.getItemDamage() > 179)) {
+ stopMachine(ShutDownReasonRegistry.NO_TURBINE);
+ return CheckRecipeResultRegistry.NO_TURBINE_FOUND;
+ }
+ ArrayList<FluidStack> tFluids = getStoredFluids();
+ if (!tFluids.isEmpty()) {
+
+ if (baseEff == 0 || optFlow == 0
+ || counter >= 512
+ || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()
+ || this.getBaseMetaTileEntity()
+ .hasInventoryBeenModified()) {
+ counter = 0;
+ baseEff = GT_Utility.safeInt(
+ (long) ((5F
+ + ((GT_MetaGenerated_Tool) controllerSlot.getItem()).getToolCombatDamage(controllerSlot))
+ * 1000F));
+ optFlow = GT_Utility.safeInt(
+ (long) Math.max(
+ Float.MIN_NORMAL,
+ ((GT_MetaGenerated_Tool) controllerSlot.getItem()).getToolStats(controllerSlot)
+ .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mToolSpeed
+ * 50));
+
+ overflowMultiplier = getOverflowMultiplier(controllerSlot);
+
+ flowMultipliers[0] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mSteamMultiplier;
+ flowMultipliers[1] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mGasMultiplier;
+ flowMultipliers[2] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mPlasmaMultiplier;
+
+ if (optFlow <= 0 || baseEff <= 0) {
+ stopMachine(ShutDownReasonRegistry.NONE); // in case the turbine got removed
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+ } else {
+ counter++;
+ }
+ }
+
+ int newPower = fluidIntoPower(tFluids, optFlow, baseEff, overflowMultiplier, flowMultipliers); // How much the
+ // turbine should
+ // be producing
+ // with this flow
+ int difference = newPower - this.mEUt; // difference between current output and new output
+
+ // Magic numbers: can always change by at least 10 eu/t, but otherwise by at most 1 percent of the difference in
+ // power level (per tick)
+ // This is how much the turbine can actually change during this tick
+ int maxChangeAllowed = Math.max(10, GT_Utility.safeInt((long) Math.abs(difference) / 100));
+
+ if (Math.abs(difference) > maxChangeAllowed) { // If this difference is too big, use the maximum allowed change
+ int change = maxChangeAllowed * (difference > 0 ? 1 : -1); // Make the change positive or negative.
+ this.mEUt += change; // Apply the change
+ } else this.mEUt = newPower;
+
+ if (this.mEUt <= 0) {
+ // stopMachine();
+ this.mEUt = 0;
+ this.mEfficiency = 0;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ } else {
+ this.mMaxProgresstime = 1;
+ this.mEfficiencyIncrease = 10;
+ // Overvoltage is handled inside the MultiBlockBase when pushing out to dynamos. no need to do it here.
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+ }
+
+ abstract int fluidIntoPower(ArrayList<FluidStack> aFluids, int aOptFlow, int aBaseEff, int overflowMultiplier,
+ float[] flowMultipliers);
+
+ abstract float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier);
+
+ // Gets the maximum output that the turbine currently can handle. Going above this will cause the turbine to explode
+ public long getMaximumOutput() {
+ long aTotal = 0;
+ for (GT_MetaTileEntity_Hatch_Dynamo aDynamo : filterValidMTEs(mDynamoHatches)) {
+ long aVoltage = aDynamo.maxEUOutput();
+ aTotal = aDynamo.maxAmperesOut() * aVoltage;
+ }
+ return aTotal;
+ }
+
+ public int getOverflowMultiplier(ItemStack aStack) {
+ int aOverflowMultiplier = 0;
+ int toolQualityLevel = GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mToolQuality;
+ if (toolQualityLevel >= 6) {
+ aOverflowMultiplier = 3;
+ } else if (toolQualityLevel >= 3) {
+ aOverflowMultiplier = 2;
+ } else {
+ aOverflowMultiplier = 1;
+ }
+ return aOverflowMultiplier;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 1;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) {
+ return 0;
+ }
+ if (aStack.getItem() instanceof GT_MetaGenerated_Tool_01) {
+ return 10000;
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ int mPollutionReduction = 0;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction);
+ }
+
+ String tRunning = mMaxProgresstime > 0
+ ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.running.true")
+ + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.running.false")
+ + EnumChatFormatting.RESET;
+ String tMaintainance = getIdealStatus() == getRepairStatus()
+ ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false")
+ + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true")
+ + EnumChatFormatting.RESET;
+ int tDura = 0;
+
+ if (mInventory[1] != null && mInventory[1].getItem() instanceof GT_MetaGenerated_Tool_01) {
+ tDura = GT_Utility.safeInt(
+ (long) (100.0f / GT_MetaGenerated_Tool.getToolMaxDamage(mInventory[1])
+ * (GT_MetaGenerated_Tool.getToolDamage(mInventory[1])) + 1));
+ }
+
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+ String[] ret = new String[] {
+ // 8 Lines available for information panels
+ tRunning + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(((long) mEUt * mEfficiency) / 10000)
+ + EnumChatFormatting.RESET
+ + " EU/t", /* 1 */
+ tMaintainance, /* 2 */
+ StatCollector.translateToLocal("GT5U.turbine.efficiency") + ": "
+ + EnumChatFormatting.YELLOW
+ + (mEfficiency / 100F)
+ + EnumChatFormatting.RESET
+ + "%", /* 2 */
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + /* 3 */ EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("GT5U.turbine.flow") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(GT_Utility.safeInt((long) realOptFlow))
+ + EnumChatFormatting.RESET
+ + " L/t"
+ + /* 4 */ EnumChatFormatting.YELLOW
+ + " ("
+ + (looseFit ? StatCollector.translateToLocal("GT5U.turbine.loose")
+ : StatCollector.translateToLocal("GT5U.turbine.tight"))
+ + ")", /* 5 */
+ StatCollector.translateToLocal("GT5U.turbine.fuel") + ": "
+ + EnumChatFormatting.GOLD
+ + GT_Utility.formatNumbers(storedFluid)
+ + EnumChatFormatting.RESET
+ + "L", /* 6 */
+ StatCollector.translateToLocal(
+ "GT5U.turbine.dmg") + ": " + EnumChatFormatting.RED + tDura + EnumChatFormatting.RESET + "%", /* 7 */
+ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": "
+ + EnumChatFormatting.GREEN
+ + mPollutionReduction
+ + EnumChatFormatting.RESET
+ + " %" /* 8 */
+ };
+ if (!this.getClass()
+ .getName()
+ .contains("Steam"))
+ ret[4] = StatCollector.translateToLocal("GT5U.turbine.flow") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.safeInt((long) realOptFlow)
+ + EnumChatFormatting.RESET
+ + " L/t";
+ return ret;
+ }
+
+ public boolean hasTurbine() {
+ return getBaseMetaTileEntity() != null && getBaseMetaTileEntity().isClientSide() ? mHasTurbine
+ : this.getMaxEfficiency(mInventory[1]) > 0;
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 2, 1);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 2, 2, 1, elementBudget, env, false, true);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Gas.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Gas.java
new file mode 100644
index 0000000000..e84c695d68
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Gas.java
@@ -0,0 +1,222 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_LargeTurbine_Gas extends GT_MetaTileEntity_LargeTurbine {
+
+ public GT_MetaTileEntity_LargeTurbine_Gas(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_LargeTurbine_Gas(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1],
+ aFacing == side ? (aActive ? TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW_ACTIVE5)
+ .build()
+ : hasTurbine() ? TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW5)
+ .build()
+ : TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW_EMPTY5)
+ .build())
+ : casingTexturePages[0][58] };
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Gas Turbine")
+ .addInfo("Controller block for the Large Gas Turbine")
+ .addInfo("Needs a Turbine, place inside controller")
+ .addInfo("Warning: Will be capped at 8192 EU/t in a future update")
+ .addInfo("See the Advanced Large Gas Turbine as the next, uncapped, option")
+ // .addInfo("The excess fuel that gets consumed will be voided!")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 4, true)
+ .addController("Front center")
+ .addCasingInfoRange("Stainless Steel Turbine Casing", 8, 30, false)
+ .addDynamoHatch("Back center", 1)
+ .addMaintenanceHatch("Side centered", 2)
+ .addMufflerHatch("Side centered", 2)
+ .addInputHatch("Gas Fuel, Side centered", 2)
+ .addOtherStructurePart("Air", "3x3 area in front of controller")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ public int getFuelValue(FluidStack aLiquid) {
+ if (aLiquid == null) return 0;
+ GT_Recipe tFuel = RecipeMaps.gasTurbineFuels.getBackend()
+ .findFuel(aLiquid);
+ if (tFuel != null) return tFuel.mSpecialValue;
+ return 0;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_LargeTurbine_Gas(mName);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.gasTurbineFuels;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ public Block getCasingBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ @Override
+ public byte getCasingMeta() {
+ return 10;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 58;
+ }
+
+ @Override
+ public boolean isNewStyleRendering() {
+ return true;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return GT_Mod.gregtechproxy.mPollutionLargeGasTurbinePerSecond;
+ }
+
+ @Override
+ int fluidIntoPower(ArrayList<FluidStack> aFluids, int aOptFlow, int aBaseEff, int overflowMultiplier,
+ float[] flowMultipliers) {
+ if (aFluids.size() >= 1) {
+ int tEU = 0;
+ int actualOptimalFlow = 0;
+
+ FluidStack firstFuelType = new FluidStack(aFluids.get(0), 0); // Identify a SINGLE type of fluid to process.
+ // Doesn't matter which one. Ignore the rest!
+ int fuelValue = getFuelValue(firstFuelType);
+
+ if (aOptFlow < fuelValue) {
+ // turbine too weak and/or fuel too powerful
+ // at least consume 1L
+ this.realOptFlow = 1;
+ // wastes the extra fuel and generate aOptFlow directly
+ depleteInput(new FluidStack(firstFuelType, 1));
+ this.storedFluid += 1;
+ return GT_Utility.safeInt((long) aOptFlow * (long) aBaseEff / 10000L);
+ }
+
+ actualOptimalFlow = GT_Utility.safeInt((long) (aOptFlow * flowMultipliers[1] / fuelValue));
+ this.realOptFlow = actualOptimalFlow;
+
+ // Allowed to use up to 450% optimal flow rate, depending on the value of overflowMultiplier.
+ // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula
+ // used
+ // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow
+ // rate):
+ // - 150% if it is 1
+ // - 300% if it is 2
+ // - 450% if it is 3
+ // Variable required outside of loop for multi-hatch scenarios.
+ int remainingFlow = GT_Utility.safeInt((long) (actualOptimalFlow * (1.5f * overflowMultiplier)));
+ int flow = 0;
+ int totalFlow = 0;
+
+ storedFluid = 0;
+ for (FluidStack aFluid : aFluids) {
+ if (aFluid.isFluidEqual(firstFuelType)) {
+ flow = Math.min(aFluid.amount, remainingFlow); // try to use up to the max flow defined just above
+ depleteInput(new FluidStack(aFluid, flow)); // deplete that amount
+ this.storedFluid += aFluid.amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = GT_Utility.safeInt((long) totalFlow * fuelValue);
+
+ if (totalFlow != actualOptimalFlow) {
+ float efficiency = getOverflowEfficiency(totalFlow, actualOptimalFlow, overflowMultiplier);
+ tEU *= efficiency;
+ }
+ tEU = GT_Utility.safeInt((long) tEU * (long) aBaseEff / 10000L);
+
+ // EU/t output cap to properly tier the LGT against the Advanced LGT, will be implemented in a future dev
+ // update
+ /*
+ * if (tEU > 8192) { tEU = 8192; }
+ */
+
+ // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the
+ // turbine
+ // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow
+ // When the max fuel consumption rate was increased, turbines could explode on world load
+ if (tEU > getMaximumOutput()) {
+ tEU = GT_Utility.safeInt(getMaximumOutput());
+ }
+ return tEU;
+ }
+ return 0;
+ }
+
+ @Override
+ float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) {
+ // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value
+ // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of
+ // fuel used
+ // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value
+ // Gases are the second most efficient in this regard, with plasma being the most efficient
+ float efficiency = 0;
+
+ if (totalFlow > actualOptimalFlow) {
+ efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow))
+ / ((float) actualOptimalFlow * ((overflowMultiplier * 3) - 1));
+ } else {
+ efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow);
+ }
+
+ return efficiency;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_GasAdvanced.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_GasAdvanced.java
new file mode 100644
index 0000000000..4926655476
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_GasAdvanced.java
@@ -0,0 +1,219 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_LargeTurbine_GasAdvanced extends GT_MetaTileEntity_LargeTurbine {
+
+ public GT_MetaTileEntity_LargeTurbine_GasAdvanced(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_LargeTurbine_GasAdvanced(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1],
+ aFacing == side ? (aActive ? TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW_ACTIVE5)
+ .build()
+ : hasTurbine() ? TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW5)
+ .build()
+ : TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW_EMPTY5)
+ .build())
+ : casingTexturePages[1][57] };
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Gas Turbine")
+ .addInfo("Warning: This is an experimental multiblock, subject to changes ")
+ .addInfo("Controller block for the Large Advanced Gas Turbine")
+ .addInfo("Needs a Turbine, place inside controller")
+ .addInfo("Only accepts gases above 800k EU/bucket")
+ .addInfo("Has no maximum EU/t output, only depends on the Dynamo Hatch")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 4, true)
+ .addController("Front center")
+ .addCasingInfoRange("Advanced Gas Turbine Casing", 8, 30, false)
+ .addDynamoHatch("Back center", 1)
+ .addMaintenanceHatch("Side centered", 2)
+ .addMufflerHatch("Side centered", 2)
+ .addInputHatch("Gas Fuel, Side centered", 2)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ public int getFuelValue(FluidStack aLiquid) {
+ if (aLiquid == null) return 0;
+ GT_Recipe tFuel = RecipeMaps.gasTurbineFuels.getBackend()
+ .findFuel(aLiquid);
+ if (tFuel != null) return tFuel.mSpecialValue;
+ return 0;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_LargeTurbine_GasAdvanced(mName);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.gasTurbineFuels;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -2;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ public Block getCasingBlock() {
+ return GregTech_API.sBlockCasings8;
+ }
+
+ @Override
+ public byte getCasingMeta() {
+ return 9;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 185;
+ }
+
+ @Override
+ public boolean isNewStyleRendering() {
+ return true;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return GT_Mod.gregtechproxy.mPollutionLargeGasTurbinePerSecond;
+ }
+
+ @Override
+ int fluidIntoPower(ArrayList<FluidStack> aFluids, int aOptFlow, int aBaseEff, int overflowMultiplier,
+ float[] flowMultipliers) {
+ if (aFluids.size() >= 1) {
+ int tEU = 0;
+ int actualOptimalFlow = 0;
+
+ FluidStack firstFuelType = new FluidStack(aFluids.get(0), 0); // Identify a SINGLE type of fluid to process.
+ // Doesn't matter which one. Ignore the rest!
+ int fuelValue = getFuelValue(firstFuelType);
+
+ if (fuelValue < 100) {
+ return 0;
+ }
+
+ if (aOptFlow < fuelValue) {
+ // turbine too weak and/or fuel too powerful
+ // at least consume 1L
+ this.realOptFlow = 1;
+ // wastes the extra fuel and generate aOptFlow directly
+ depleteInput(new FluidStack(firstFuelType, 1));
+ this.storedFluid += 1;
+ return GT_Utility.safeInt((long) aOptFlow * (long) aBaseEff / 10000L);
+ }
+
+ actualOptimalFlow = GT_Utility.safeInt((long) (aOptFlow * flowMultipliers[1] / fuelValue));
+ this.realOptFlow = actualOptimalFlow;
+
+ // Allowed to use up to 450% optimal flow rate, depending on the value of overflowMultiplier.
+ // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula
+ // used
+ // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow
+ // rate):
+ // - 150% if it is 1
+ // - 300% if it is 2
+ // - 450% if it is 3
+ // Variable required outside of loop for multi-hatch scenarios.
+ int remainingFlow = GT_Utility.safeInt((long) (actualOptimalFlow * (1.5f * overflowMultiplier)));
+ int flow = 0;
+ int totalFlow = 0;
+
+ storedFluid = 0;
+ for (FluidStack aFluid : aFluids) {
+ if (aFluid.isFluidEqual(firstFuelType)) {
+ flow = Math.min(aFluid.amount, remainingFlow); // try to use up to the max flow defined just above
+ depleteInput(new FluidStack(aFluid, flow)); // deplete that amount
+ this.storedFluid += aFluid.amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = GT_Utility.safeInt((long) totalFlow * fuelValue);
+
+ if (totalFlow != actualOptimalFlow) {
+ float efficiency = getOverflowEfficiency(totalFlow, actualOptimalFlow, overflowMultiplier);
+ tEU *= efficiency;
+ }
+ tEU = GT_Utility.safeInt((long) tEU * (long) aBaseEff / 10000L);
+
+ // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the
+ // turbine
+ // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow
+ // When the max fuel consumption rate was increased, turbines could explode on world load
+ if (tEU > getMaximumOutput()) {
+ tEU = GT_Utility.safeInt(getMaximumOutput());
+ }
+ return tEU;
+ }
+ return 0;
+ }
+
+ @Override
+ float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) {
+ // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value
+ // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of
+ // fuel used
+ // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value
+ // Gases are the second most efficient in this regard, with plasma being the most efficient
+ float efficiency = 0;
+
+ if (totalFlow > actualOptimalFlow) {
+ efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow))
+ / ((float) actualOptimalFlow * ((overflowMultiplier * 3) - 1));
+ } else {
+ efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow);
+ }
+
+ return efficiency;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_HPSteam.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_HPSteam.java
new file mode 100644
index 0000000000..d61e75eac3
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_HPSteam.java
@@ -0,0 +1,232 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+import static gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_Steam.calculateLooseFlow;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_LargeTurbine_HPSteam extends GT_MetaTileEntity_LargeTurbine {
+
+ public boolean achievement = false;
+ private boolean looseFit = false;
+
+ public GT_MetaTileEntity_LargeTurbine_HPSteam(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_LargeTurbine_HPSteam(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1],
+ aFacing == side ? (aActive ? TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW_ACTIVE5)
+ .build()
+ : hasTurbine() ? TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW5)
+ .build()
+ : TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW_EMPTY5)
+ .build())
+ : casingTexturePages[0][59] };
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Steam Turbine")
+ .addInfo("Controller block for the Large High Pressure Steam Turbine")
+ .addInfo("Needs a Turbine, place inside controller")
+ .addInfo("Outputs Steam as well as producing power")
+ .addInfo("Power output depends on turbine and fitting")
+ .addInfo("Use screwdriver to adjust fitting of turbine")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 4, true)
+ .addController("Front center")
+ .addCasingInfoRange("Titanium Turbine Casing", 8, 31, false)
+ .addDynamoHatch("Back center", 1)
+ .addMaintenanceHatch("Side centered", 2)
+ .addInputHatch("Superheated Steam, Side centered", 2)
+ .addOutputHatch("Steam, Side centered", 2)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_LargeTurbine_HPSteam(mName);
+ }
+
+ @Override
+ public Block getCasingBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ @Override
+ public byte getCasingMeta() {
+ return 11;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 59;
+ }
+
+ @Override
+ public boolean isNewStyleRendering() {
+ return true;
+ }
+
+ @Override
+ int fluidIntoPower(ArrayList<FluidStack> aFluids, int aOptFlow, int aBaseEff, int overflowEfficiency,
+ float[] flowMultipliers) {
+ if (looseFit) {
+ float[] calculatedFlow = calculateLooseFlow(aOptFlow, aBaseEff);
+ aOptFlow = GT_Utility.safeInt((long) calculatedFlow[0]);
+ aBaseEff = GT_Utility.safeInt((long) calculatedFlow[1]);
+ }
+ int tEU = 0;
+ int totalFlow = 0; // Byproducts are based on actual flow
+ int flow = 0;
+
+ // Allowed to use up to 300% optimal flow rate, depending on the value of overflowMultiplier.
+ // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula
+ // used
+ // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow
+ // rate):
+ // - 200% if it is 1
+ // - 250% if it is 2
+ // - 300% if it is 3
+ // Variable required outside of loop for multi-hatch scenarios.
+ this.realOptFlow = aOptFlow * flowMultipliers[0];
+ int remainingFlow = GT_Utility.safeInt((long) (realOptFlow * (0.5f * overflowMultiplier + 1.5)));
+
+ storedFluid = 0;
+ for (int i = 0; i < aFluids.size() && remainingFlow > 0; i++) {
+ final FluidStack aFluidStack = aFluids.get(i);
+ if (GT_ModHandler.isSuperHeatedSteam(aFluidStack)) {
+ flow = Math.min(aFluidStack.amount, remainingFlow); // try to use up to the max flow defined just above
+ depleteInput(new FluidStack(aFluidStack, flow)); // deplete that amount
+ this.storedFluid += aFluidStack.amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ if (!achievement) {
+ try {
+ GT_Mod.achievements.issueAchievement(
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .getPlayerEntityByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName()),
+ "efficientsteam");
+ } catch (Exception ignored) {}
+ achievement = true;
+ }
+ } else if (GT_ModHandler.isAnySteam(aFluidStack)) {
+ depleteInput(new FluidStack(aFluidStack, aFluidStack.amount));
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = totalFlow;
+ addOutput(GT_ModHandler.getSteam(totalFlow));
+ if (totalFlow == (GT_Utility.safeInt((long) realOptFlow))) {
+ tEU = GT_Utility.safeInt((long) tEU * (long) aBaseEff / 10000L);
+ } else {
+ float efficiency = getOverflowEfficiency(
+ totalFlow,
+ (GT_Utility.safeInt((long) realOptFlow)),
+ overflowMultiplier);
+ tEU *= efficiency;
+ tEU = Math.max(1, GT_Utility.safeInt((long) tEU * (long) aBaseEff / 10000L));
+ }
+
+ // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the
+ // turbine
+ // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow rate can
+ // explode turbines on world load
+ if (tEU > getMaximumOutput()) {
+ tEU = GT_Utility.safeInt(getMaximumOutput());
+ }
+
+ return tEU;
+ }
+
+ @Override
+ float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) {
+ // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value
+ // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of
+ // fuel used
+ // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value
+ // Superheated steam is the second least efficient out of all turbine fuels in this regard, with steam being the
+ // least efficient
+ float efficiency = 0;
+
+ if (totalFlow > actualOptimalFlow) {
+ efficiency = 1.0f
+ - Math.abs((totalFlow - actualOptimalFlow)) / ((float) actualOptimalFlow * (overflowMultiplier + 2));
+ } else {
+ efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow);
+ }
+
+ return efficiency;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (side == getBaseMetaTileEntity().getFrontFacing()) {
+ looseFit ^= true;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ looseFit ? GT_Utility.trans("500", "Fitting: Loose - More Flow")
+ : GT_Utility.trans("501", "Fitting: Tight - More Efficiency"));
+ }
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return (looseFit && XSTR_INSTANCE.nextInt(4) == 0) ? 0 : 1;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ super.looseFit = looseFit;
+ return super.getInfoData();
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("turbineFitting", looseFit);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ looseFit = aNBT.getBoolean("turbineFitting");
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Plasma.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Plasma.java
new file mode 100644
index 0000000000..2ecc79cd3b
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Plasma.java
@@ -0,0 +1,391 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+
+public class GT_MetaTileEntity_LargeTurbine_Plasma extends GT_MetaTileEntity_LargeTurbine {
+
+ public GT_MetaTileEntity_LargeTurbine_Plasma(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_LargeTurbine_Plasma(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1],
+ aFacing == side ? (aActive ? TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW_ACTIVE5)
+ .build()
+ : hasTurbine() ? TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW5)
+ .build()
+ : TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW_EMPTY5)
+ .build())
+ : casingTexturePages[0][60] };
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Plasma Turbine")
+ .addInfo("Controller block for the Large Plasma Generator")
+ .addInfo("Needs a Turbine, place inside controller")
+ .addInfo("Use your Fusion Reactor to produce the Plasma")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 4, true)
+ .addController("Front center")
+ .addCasingInfoRange("Tungstensteel Turbine Casing", 8, 31, false)
+ .addDynamoHatch("Back center", 1)
+ .addMaintenanceHatch("Side centered", 2)
+ .addInputHatch("Plasma Fluid, Side centered", 2)
+ .addOutputHatch("Molten Fluid, optional, Side centered", 2)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ public int getFuelValue(FluidStack aLiquid) {
+ if (aLiquid == null) return 0;
+ GT_Recipe tFuel = RecipeMaps.plasmaFuels.getBackend()
+ .findFuel(aLiquid);
+ if (tFuel != null) return tFuel.mSpecialValue;
+ return 0;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_LargeTurbine_Plasma(mName);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.plasmaFuels;
+ }
+
+ @Override
+ public int getRecipeCatalystPriority() {
+ return -1;
+ }
+
+ @Override
+ protected boolean filtersFluid() {
+ return false;
+ }
+
+ @Override
+ public Block getCasingBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ @Override
+ public byte getCasingMeta() {
+ return 12;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 60;
+ }
+
+ @Override
+ public boolean isNewStyleRendering() {
+ return true;
+ }
+
+ @Override
+ int fluidIntoPower(ArrayList<FluidStack> aFluids, int aOptFlow, int aBaseEff, int overflowMultiplier,
+ float[] flowMultipliers) {
+ if (aFluids.size() >= 1) {
+ aOptFlow *= 800; // CHANGED THINGS HERE, check recipe runs once per 20 ticks
+ int tEU = 0;
+
+ int actualOptimalFlow = 0;
+
+ FluidStack firstFuelType = new FluidStack(aFluids.get(0), 0); // Identify a SINGLE type of fluid to process.
+ // Doesn't matter which one. Ignore the rest!
+ int fuelValue = getFuelValue(firstFuelType);
+ actualOptimalFlow = GT_Utility
+ .safeInt((long) Math.ceil((double) aOptFlow * flowMultipliers[2] / (double) fuelValue));
+ this.realOptFlow = actualOptimalFlow; // For scanner info
+
+ // Allowed to use up to 550% optimal flow rate, depending on the value of overflowMultiplier.
+ // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula
+ // used
+ // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow
+ // rate):
+ // - 250% if it is 1
+ // - 400% if it is 2
+ // - 550% if it is 3
+ // Variable required outside of loop for multi-hatch scenarios.
+ int remainingFlow = GT_Utility.safeInt((long) (actualOptimalFlow * (1.5f * overflowMultiplier + 1)));
+ int flow = 0;
+ int totalFlow = 0;
+
+ storedFluid = 0;
+ for (FluidStack aFluid : aFluids) {
+ if (aFluid.isFluidEqual(firstFuelType)) {
+ flow = Math.min(aFluid.amount, remainingFlow); // try to use up to the max flow defined just above
+ depleteInput(new FluidStack(aFluid, flow)); // deplete that amount
+ this.storedFluid += aFluid.amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ }
+ }
+ String fn = FluidRegistry.getFluidName(firstFuelType);
+ String[] nameSegments = fn.split("\\.", 2);
+ if (nameSegments.length == 2) {
+ String outputName = nameSegments[1];
+ FluidStack output = FluidRegistry.getFluidStack(outputName, totalFlow);
+ if (output == null) {
+ output = FluidRegistry.getFluidStack("molten." + outputName, totalFlow);
+ }
+ if (output != null) {
+ addOutput(output);
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = GT_Utility.safeInt((long) ((fuelValue / 20D) * (double) totalFlow));
+
+ // GT_FML_LOGGER.info(totalFlow+" : "+fuelValue+" : "+aOptFlow+" : "+actualOptimalFlow+" : "+tEU);
+
+ if (totalFlow != actualOptimalFlow) {
+ float efficiency = getOverflowEfficiency(totalFlow, actualOptimalFlow, overflowMultiplier);
+ tEU = (int) (tEU * efficiency);
+ }
+ tEU = GT_Utility.safeInt((long) (aBaseEff / 10000D * tEU));
+
+ // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the
+ // turbine
+ // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow rate
+ // can explode turbines on world load
+ if (tEU > getMaximumOutput()) {
+ tEU = GT_Utility.safeInt(getMaximumOutput());
+ }
+
+ return tEU;
+ }
+ return 0;
+ }
+
+ @Override
+ float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) {
+ // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value
+ // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of
+ // fuel used
+ // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value
+ // Plasmas are the most efficient out of all turbine fuels in this regard
+ float efficiency = 0;
+
+ if (totalFlow > actualOptimalFlow) {
+ efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow))
+ / ((float) actualOptimalFlow * ((overflowMultiplier * 3) + 1));
+ } else {
+ efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow);
+ }
+
+ return efficiency;
+ }
+
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ ItemStack controllerSlot = getControllerSlot();
+ if ((counter & 7) == 0
+ && (controllerSlot == null || !(controllerSlot.getItem() instanceof GT_MetaGenerated_Tool)
+ || controllerSlot.getItemDamage() < 170
+ || controllerSlot.getItemDamage() > 179)) {
+ stopMachine(ShutDownReasonRegistry.NO_TURBINE);
+ return CheckRecipeResultRegistry.NO_TURBINE_FOUND;
+ }
+ ArrayList<FluidStack> tFluids = getStoredFluids();
+ if (!tFluids.isEmpty()) {
+ if (baseEff == 0 || optFlow == 0
+ || counter >= 512
+ || this.getBaseMetaTileEntity()
+ .hasWorkJustBeenEnabled()
+ || this.getBaseMetaTileEntity()
+ .hasInventoryBeenModified()) {
+ counter = 0;
+ baseEff = GT_Utility.safeInt(
+ (long) ((5F
+ + ((GT_MetaGenerated_Tool) controllerSlot.getItem()).getToolCombatDamage(controllerSlot))
+ * 1000F));
+ optFlow = GT_Utility.safeInt(
+ (long) Math.max(
+ Float.MIN_NORMAL,
+ ((GT_MetaGenerated_Tool) controllerSlot.getItem()).getToolStats(controllerSlot)
+ .getSpeedMultiplier() * GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mToolSpeed
+ * 50));
+ overflowMultiplier = getOverflowMultiplier(controllerSlot);
+
+ flowMultipliers[0] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mSteamMultiplier;
+ flowMultipliers[1] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mGasMultiplier;
+ flowMultipliers[2] = GT_MetaGenerated_Tool.getPrimaryMaterial(controllerSlot).mPlasmaMultiplier;
+
+ if (optFlow <= 0 || baseEff <= 0) {
+ stopMachine(ShutDownReasonRegistry.NONE); // in case the turbine got removed
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ }
+ } else {
+ counter++;
+ }
+ }
+
+ int newPower = fluidIntoPower(tFluids, optFlow, baseEff, overflowMultiplier, flowMultipliers); // How much the
+ // turbine should
+ // be producing
+ // with this flow
+
+ int difference = newPower - this.mEUt; // difference between current output and new output
+
+ // Magic numbers: can always change by at least 10 eu/t, but otherwise by at most 1 percent of the difference in
+ // power level (per tick)
+ // This is how much the turbine can actually change during this tick
+ int maxChangeAllowed = Math.max(200, GT_Utility.safeInt((long) Math.abs(difference) / 5));
+
+ if (Math.abs(difference) > maxChangeAllowed) { // If this difference is too big, use the maximum allowed change
+ int change = maxChangeAllowed * (difference > 0 ? 1 : -1); // Make the change positive or negative.
+ this.mEUt += change; // Apply the change
+ } else this.mEUt = newPower;
+
+ if (this.mEUt <= 0) {
+ // stopMachine();
+ this.mEUt = 0;
+ this.mEfficiency = 0;
+ return CheckRecipeResultRegistry.NO_FUEL_FOUND;
+ } else {
+ this.mMaxProgresstime = 20;
+ this.mEfficiencyIncrease = 200;
+ // Overvoltage is handled inside the MultiBlockBase when pushing out to dynamos. no need to do it here.
+
+ return CheckRecipeResultRegistry.GENERATING;
+ }
+ }
+
+ @Override
+ public String[] getInfoData() {
+ int mPollutionReduction = 0;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction);
+ }
+
+ String tRunning = mMaxProgresstime > 0
+ ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.running.true")
+ + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.running.false")
+ + EnumChatFormatting.RESET;
+ String tMaintainance = getIdealStatus() == getRepairStatus()
+ ? EnumChatFormatting.GREEN + StatCollector.translateToLocal("GT5U.turbine.maintenance.false")
+ + EnumChatFormatting.RESET
+ : EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.turbine.maintenance.true")
+ + EnumChatFormatting.RESET;
+ int tDura = 0;
+
+ if (mInventory[1] != null && mInventory[1].getItem() instanceof GT_MetaGenerated_Tool_01) {
+ tDura = GT_Utility.safeInt(
+ (long) (100.0f / GT_MetaGenerated_Tool.getToolMaxDamage(mInventory[1])
+ * (GT_MetaGenerated_Tool.getToolDamage(mInventory[1])) + 1));
+ }
+
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+ String[] ret = new String[] {
+ // 8 Lines available for information panels
+ tRunning + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(((long) mEUt * mEfficiency) / 10000)
+ + EnumChatFormatting.RESET
+ + " EU/t", /* 1 */
+ tMaintainance, /* 2 */
+ StatCollector.translateToLocal("GT5U.turbine.efficiency") + ": "
+ + EnumChatFormatting.YELLOW
+ + (mEfficiency / 100F)
+ + EnumChatFormatting.RESET
+ + "%", /* 2 */
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + /* 3 */ EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("GT5U.turbine.flow") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(GT_Utility.safeInt((long) realOptFlow))
+ + EnumChatFormatting.RESET
+ + " L/s"
+ + /* 4 */ EnumChatFormatting.YELLOW
+ + " ("
+ + (looseFit ? StatCollector.translateToLocal("GT5U.turbine.loose")
+ : StatCollector.translateToLocal("GT5U.turbine.tight"))
+ + ")", /* 5 */
+ StatCollector.translateToLocal("GT5U.turbine.fuel") + ": "
+ + EnumChatFormatting.GOLD
+ + GT_Utility.formatNumbers(storedFluid)
+ + EnumChatFormatting.RESET
+ + "L", /* 6 */
+ StatCollector.translateToLocal(
+ "GT5U.turbine.dmg") + ": " + EnumChatFormatting.RED + tDura + EnumChatFormatting.RESET + "%", /* 7 */
+ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": "
+ + EnumChatFormatting.GREEN
+ + mPollutionReduction
+ + EnumChatFormatting.RESET
+ + " %" /* 8 */
+ };
+ if (!this.getClass()
+ .getName()
+ .contains("Steam"))
+ ret[4] = StatCollector.translateToLocal("GT5U.turbine.flow") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.safeInt((long) realOptFlow)
+ + EnumChatFormatting.RESET
+ + " L/s";
+ return ret;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Steam.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Steam.java
new file mode 100644
index 0000000000..849d0af462
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_LargeTurbine_Steam.java
@@ -0,0 +1,273 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.GT_Values.STEAM_PER_WATER;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_ACTIVE5;
+import static gregtech.api.enums.Textures.BlockIcons.LARGETURBINE_NEW_EMPTY5;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_LargeTurbine_Steam extends GT_MetaTileEntity_LargeTurbine {
+
+ private int excessWater;
+ private boolean achievement = false;
+ private boolean looseFit = false;
+
+ public GT_MetaTileEntity_LargeTurbine_Steam(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_LargeTurbine_Steam(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ return new ITexture[] { MACHINE_CASINGS[1][colorIndex + 1],
+ aFacing == side ? (aActive ? TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW_ACTIVE5)
+ .build()
+ : hasTurbine() ? TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW5)
+ .build()
+ : TextureFactory.builder()
+ .addIcon(LARGETURBINE_NEW_EMPTY5)
+ .build())
+ : casingTexturePages[0][57] };
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Steam Turbine")
+ .addInfo("Controller block for the Large Steam Turbine")
+ .addInfo("Needs a Turbine, place inside controller")
+ .addInfo("Outputs Distilled Water as well as producing power")
+ .addInfo("Power output depends on turbine and fitting")
+ .addInfo("Use screwdriver to adjust fitting of turbine")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 4, true)
+ .addController("Front center")
+ .addCasingInfoRange("Turbine Casing", 8, 31, false)
+ .addDynamoHatch("Back center", 1)
+ .addMaintenanceHatch("Side centered", 2)
+ .addInputHatch("Steam, Side centered", 2)
+ .addOutputHatch("Distilled Water, Side centered", 2)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_LargeTurbine_Steam(mName);
+ }
+
+ @Override
+ public Block getCasingBlock() {
+ return GregTech_API.sBlockCasings4;
+ }
+
+ @Override
+ public byte getCasingMeta() {
+ return 9;
+ }
+
+ @Override
+ public int getCasingTextureIndex() {
+ return 16;
+ }
+
+ @Override
+ public boolean isNewStyleRendering() {
+ return true;
+ }
+
+ private int condenseSteam(int steam) {
+ excessWater += steam;
+ int water = excessWater / STEAM_PER_WATER;
+ excessWater %= STEAM_PER_WATER;
+ return water;
+ }
+
+ @Override
+ int fluidIntoPower(ArrayList<FluidStack> aFluids, int aOptFlow, int aBaseEff, int overflowEfficiency,
+ float[] flowMultipliers) {
+ if (looseFit) {
+ float[] calculatedFlow = calculateLooseFlow(aOptFlow, aBaseEff);
+ aOptFlow = GT_Utility.safeInt((long) calculatedFlow[0]);
+ aBaseEff = GT_Utility.safeInt((long) calculatedFlow[1]);
+ }
+ int tEU = 0;
+ int totalFlow = 0; // Byproducts are based on actual flow
+ int flow = 0;
+
+ // Allowed to use up to 250% optimal flow rate, depending on the value of overflowMultiplier.
+ // This value is chosen because the highest EU/t possible depends on the overflowMultiplier, and the formula
+ // used
+ // makes it so the flow rate for that max, per value of overflowMultiplier, is (percentage of optimal flow
+ // rate):
+ // - 150% if it is 1
+ // - 200% if it is 2
+ // - 250% if it is 3
+ // Variable required outside of loop for multi-hatch scenarios.
+ this.realOptFlow = aOptFlow * flowMultipliers[0];
+ int remainingFlow = GT_Utility.safeInt((long) (realOptFlow * (0.5f * overflowMultiplier + 1)));
+
+ storedFluid = 0;
+ for (int i = 0; i < aFluids.size() && remainingFlow > 0; i++) { // loop through each hatch; extract inputs and
+ // track totals.
+ final FluidStack aFluidStack = aFluids.get(i);
+ if (GT_ModHandler.isAnySteam(aFluidStack)) {
+ flow = Math.min(aFluidStack.amount, remainingFlow); // try to use up to the max flow defined just above
+ depleteInput(new FluidStack(aFluidStack, flow)); // deplete that amount
+ this.storedFluid += aFluidStack.amount;
+ remainingFlow -= flow; // track amount we're allowed to continue depleting from hatches
+ totalFlow += flow; // track total input used
+ if (!achievement) {
+ GT_Mod.achievements.issueAchievement(
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .getPlayerEntityByName(
+ this.getBaseMetaTileEntity()
+ .getOwnerName()),
+ "muchsteam");
+ achievement = true;
+ }
+ } else if (GT_ModHandler.isSuperHeatedSteam(aFluidStack)) {
+ depleteInput(new FluidStack(aFluidStack, aFluidStack.amount));
+ }
+ }
+ if (totalFlow <= 0) return 0;
+ tEU = totalFlow;
+ int waterToOutput = condenseSteam(totalFlow);
+ addOutput(GT_ModHandler.getDistilledWater(waterToOutput));
+ if (totalFlow == (GT_Utility.safeInt((long) realOptFlow))) {
+ tEU = GT_Utility.safeInt((long) tEU * (long) aBaseEff / 20000L);
+ } else {
+ float efficiency = getOverflowEfficiency(
+ totalFlow,
+ (GT_Utility.safeInt((long) realOptFlow)),
+ overflowMultiplier);
+ tEU *= efficiency;
+ tEU = Math.max(1, GT_Utility.safeInt((long) tEU * (long) aBaseEff / 20000L));
+ }
+
+ // If next output is above the maximum the dynamo can handle, set it to the maximum instead of exploding the
+ // turbine
+ // Raising the maximum allowed flow rate to account for the efficiency changes beyond the optimal flow rate can
+ // explode turbines on world load
+ if (tEU > getMaximumOutput()) {
+ tEU = GT_Utility.safeInt(getMaximumOutput());
+ }
+
+ return tEU;
+ }
+
+ @Override
+ float getOverflowEfficiency(int totalFlow, int actualOptimalFlow, int overflowMultiplier) {
+ // overflowMultiplier changes how quickly the turbine loses efficiency after flow goes beyond the optimal value
+ // At the default value of 1, any flow will generate less EU/t than optimal flow, regardless of the amount of
+ // fuel used
+ // The bigger this number is, the slower efficiency loss happens as flow moves beyond the optimal value
+ // Steam is the least efficient out of all turbine fuels in this regard
+ float efficiency = 0;
+
+ if (totalFlow > actualOptimalFlow) {
+ efficiency = 1.0f
+ - Math.abs((totalFlow - actualOptimalFlow)) / ((float) actualOptimalFlow * (overflowMultiplier + 1));
+ } else {
+ efficiency = 1.0f - Math.abs((totalFlow - actualOptimalFlow) / (float) actualOptimalFlow);
+ }
+
+ return efficiency;
+ }
+
+ public static float[] calculateLooseFlow(float aOptFlow, float aBaseEff) {
+ aOptFlow *= 4f;
+ if (aBaseEff >= 26000f) {
+ aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 8000f) / 10000f) * 20f);
+ aBaseEff = aBaseEff * 0.6f;
+ } else if (aBaseEff > 22000f) {
+ aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 7000f) / 10000f) * 20f);
+ aBaseEff = aBaseEff * 0.65f;
+ } else if (aBaseEff > 18000f) {
+ aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 6000f) / 10000f) * 20f);
+ aBaseEff = aBaseEff * 0.70f;
+ } else if (aBaseEff > 14000f) {
+ aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 5000f) / 10000f) * 20f);
+ aBaseEff = aBaseEff * 0.75f;
+ } else if (aBaseEff > 10000f) {
+ aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 4000f) / 10000f) * 20f);
+ aBaseEff = aBaseEff * 0.8f;
+ } else if (aBaseEff > 6000f) {
+ aOptFlow = aOptFlow * (float) Math.pow(1.1f, ((aBaseEff - 3000f) / 10000f) * 20f);
+ aBaseEff = aBaseEff * 0.85f;
+ } else {
+ aBaseEff = aBaseEff * 0.9f;
+ }
+
+ if (aBaseEff % 100 != 0) {
+ aBaseEff -= aBaseEff % 100;
+ }
+
+ float[] looseFlow = new float[2];
+ looseFlow[0] = aOptFlow;
+ looseFlow[1] = aBaseEff;
+ return looseFlow;
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (side == getBaseMetaTileEntity().getFrontFacing()) {
+ looseFit ^= true;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ looseFit ? GT_Utility.trans("500", "Fitting: Loose - More Flow")
+ : GT_Utility.trans("501", "Fitting: Tight - More Efficiency"));
+ }
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return (looseFit && XSTR_INSTANCE.nextInt(4) == 0) ? 0 : 1;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ super.looseFit = looseFit;
+ return super.getInfoData();
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("turbineFitting", looseFit);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ looseFit = aNBT.getBoolean("turbineFitting");
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiFurnace.java
new file mode 100644
index 0000000000..0dba58092e
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_MultiFurnace.java
@@ -0,0 +1,377 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_SMELTER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_StructureUtility;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_MultiFurnace
+ extends GT_MetaTileEntity_AbstractMultiFurnace<GT_MetaTileEntity_MultiFurnace> implements ISurvivalConstructable {
+
+ private int mLevel = 0;
+ private int mCostDiscount = 1;
+
+ private static final long RECIPE_EUT = 4;
+ private static final int RECIPE_DURATION = 512;
+ private static final int CASING_INDEX = 11;
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final IStructureDefinition<GT_MetaTileEntity_MultiFurnace> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_MultiFurnace>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(new String[][] { { "ccc", "cmc", "ccc" }, { "CCC", "C-C", "CCC" }, { "b~b", "bbb", "bbb" } }))
+ .addElement('c', ofBlock(GregTech_API.sBlockCasings1, CASING_INDEX))
+ .addElement('m', Muffler.newAny(CASING_INDEX, 2))
+ .addElement(
+ 'C',
+ GT_StructureUtility
+ .ofCoil(GT_MetaTileEntity_MultiFurnace::setCoilLevel, GT_MetaTileEntity_MultiFurnace::getCoilLevel))
+ .addElement(
+ 'b',
+ ofChain(
+ GT_StructureUtility.<GT_MetaTileEntity_MultiFurnace>buildHatchAdder()
+ .atLeast(Maintenance, InputBus, OutputBus, Energy)
+ .casingIndex(CASING_INDEX)
+ .dot(1)
+ .build(),
+ ofBlock(GregTech_API.sBlockCasings1, CASING_INDEX)))
+ .build();
+
+ public GT_MetaTileEntity_MultiFurnace(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_MultiFurnace(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_MultiFurnace(this.mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Furnace")
+ .addInfo("Controller Block for the Multi Smelter")
+ .addInfo("Smelts up to 8-8192 items at once")
+ .addInfo("Items smelted increases with coil tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front bottom")
+ .addCasingInfoRange("Heat Proof Machine Casing", 8, 14, false)
+ .addOtherStructurePart("Heating Coils", "Middle layer")
+ .addEnergyHatch("Any bottom casing", 1)
+ .addMaintenanceHatch("Any bottom casing", 1)
+ .addMufflerHatch("Top Middle", 2)
+ .addInputBus("Any bottom casing", 1)
+ .addOutputBus("Any bottom casing", 1)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ if (sideDirection != facingDirection) return new ITexture[] { casingTexturePages[0][CASING_INDEX] };
+ if (active) return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_MULTI_SMELTER_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_MULTI_SMELTER_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_MULTI_SMELTER)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_MULTI_SMELTER_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.furnaceRecipes;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return GT_Mod.gregtechproxy.mPollutionMultiSmelterPerSecond;
+ }
+
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ ArrayList<ItemStack> tInputList = getAllStoredInputs();
+ if (tInputList.isEmpty()) return CheckRecipeResultRegistry.NO_RECIPE;
+
+ int mVoltage = GT_Utility.safeInt(getMaxInputVoltage());
+
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setEUt(mVoltage)
+ .setRecipeEUt(RECIPE_EUT)
+ .setDuration(RECIPE_DURATION);
+ int maxParallel = this.mLevel;
+ int originalMaxParallel = maxParallel;
+ double tickTimeAfterOC = calculator.calculateDurationUnderOneTick();
+ if (tickTimeAfterOC < 1) {
+ maxParallel = GT_Utility.safeInt((long) (maxParallel / tickTimeAfterOC), 0);
+ }
+
+ int maxParallelBeforeBatchMode = maxParallel;
+ if (isBatchModeEnabled()) {
+ maxParallel = GT_Utility.safeInt((long) maxParallel * getMaxBatchSize(), 0);
+ }
+
+ // Calculate parallel
+ int tCurrentParallel = 0;
+ for (ItemStack item : tInputList) {
+ ItemStack smeltedOutput = GT_ModHandler.getSmeltingOutput(item, false, null);
+ if (smeltedOutput != null) {
+ if (item.stackSize <= (maxParallel - tCurrentParallel)) {
+ tCurrentParallel += item.stackSize;
+ } else {
+ tCurrentParallel = maxParallel;
+ break;
+ }
+ }
+ }
+ if (tCurrentParallel <= 0) {
+ return CheckRecipeResultRegistry.NO_RECIPE;
+ }
+ int currentParallelBeforeBatchMode = Math.min(tCurrentParallel, maxParallelBeforeBatchMode);
+
+ long eutUseAfterOC = calculator.calculateEUtConsumptionUnderOneTick(
+ 1,
+ (int) Math.ceil((double) currentParallelBeforeBatchMode / originalMaxParallel));
+ calculator
+ .setParallel(Math.min((int) Math.ceil((double) currentParallelBeforeBatchMode / originalMaxParallel), 1))
+ .calculate();
+
+ double batchMultiplierMax = 1;
+ // In case batch mode enabled
+ if (tCurrentParallel > maxParallelBeforeBatchMode && calculator.getDuration() < getMaxBatchSize()) {
+ batchMultiplierMax = (double) getMaxBatchSize() / calculator.getDuration();
+ batchMultiplierMax = Math.min(batchMultiplierMax, (double) tCurrentParallel / maxParallelBeforeBatchMode);
+ }
+ int finalParallel = (int) (batchMultiplierMax * maxParallelBeforeBatchMode);
+
+ // Consume inputs and generate outputs
+ ArrayList<ItemStack> smeltedOutputs = new ArrayList<>();
+ int remainingCost = finalParallel;
+ for (ItemStack item : tInputList) {
+ ItemStack smeltedOutput = GT_ModHandler.getSmeltingOutput(item, false, null);
+ if (smeltedOutput != null) {
+ if (remainingCost >= item.stackSize) {
+ remainingCost -= item.stackSize;
+ smeltedOutput.stackSize *= item.stackSize;
+ item.stackSize = 0;
+ smeltedOutputs.add(smeltedOutput);
+ } else {
+ smeltedOutput.stackSize *= remainingCost;
+ item.stackSize -= remainingCost;
+ smeltedOutputs.add(smeltedOutput);
+ break;
+ }
+ }
+ }
+ this.mOutputItems = smeltedOutputs.toArray(new ItemStack[0]);
+
+ this.mEfficiency = 10000 - (getIdealStatus() - getRepairStatus()) * 1000;
+ this.mEfficiencyIncrease = 10000;
+ this.mMaxProgresstime = (int) (calculator.getDuration() * batchMultiplierMax);
+ this.lEUt = eutUseAfterOC;
+
+ if (this.lEUt > 0) this.lEUt = -this.lEUt;
+
+ updateSlots();
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_MultiFurnace> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ this.mLevel = 0;
+ this.mCostDiscount = 1;
+
+ replaceDeprecatedCoils(aBaseMetaTileEntity);
+
+ setCoilLevel(HeatingCoilLevel.None);
+
+ if (!checkPiece(STRUCTURE_PIECE_MAIN, 1, 2, 0)) return false;
+
+ if (getCoilLevel() == HeatingCoilLevel.None) return false;
+
+ if (mMaintenanceHatches.size() != 1) return false;
+
+ if (getCoilLevel().getHeat() < 9000) {
+ this.mLevel = 8 * getCoilLevel().getLevel();
+ } else {
+ this.mLevel = 1 << (getCoilLevel().getTier());
+ }
+ this.mCostDiscount = getCoilLevel().getCostDiscount();
+ return true;
+ }
+
+ private void replaceDeprecatedCoils(IGregTechTileEntity aBaseMetaTileEntity) {
+ final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX;
+ final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ;
+ final int tX = aBaseMetaTileEntity.getXCoord() + xDir;
+ final int tY = aBaseMetaTileEntity.getYCoord();
+ final int tZ = aBaseMetaTileEntity.getZCoord() + zDir;
+ int tUsedMeta;
+ for (int xPos = tX - 1; xPos <= tX + 1; xPos++) for (int zPos = tZ - 1; zPos <= tZ + 1; zPos++) {
+ if ((xPos == tX) && (zPos == tZ)) continue;
+ tUsedMeta = aBaseMetaTileEntity.getMetaID(xPos, tY + 1, zPos);
+ if (tUsedMeta >= 12 && tUsedMeta <= 14
+ && aBaseMetaTileEntity.getBlock(xPos, tY + 1, zPos) == GregTech_API.sBlockCasings1)
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(xPos, tY + 1, zPos, GregTech_API.sBlockCasings5, tUsedMeta - 12, 3);
+ }
+ }
+
+ @Override
+ public String[] getInfoData() {
+ int mPollutionReduction = 0;
+ for (final GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches))
+ mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction);
+
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (final GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ return new String[] {
+ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s",
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(-mEUt)
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getMaxInputVoltage())
+ + EnumChatFormatting.RESET
+ + " EU/t(*2A) "
+ + StatCollector.translateToLocal("GT5U.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + VN[GT_Utility.getTier(getMaxInputVoltage())]
+ + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": "
+ + EnumChatFormatting.RED
+ + (getIdealStatus() - getRepairStatus())
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.multiblock.efficiency")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + mEfficiency / 100.0F
+ + EnumChatFormatting.RESET
+ + " %",
+ StatCollector.translateToLocal("GT5U.MS.multismelting") + ": "
+ + EnumChatFormatting.GREEN
+ + mLevel
+ + EnumChatFormatting.RESET
+ + " Discount: (EU/t) / "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mCostDiscount)
+ + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": "
+ + EnumChatFormatting.GREEN
+ + mPollutionReduction
+ + EnumChatFormatting.RESET
+ + " %" };
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 1, 2, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 2, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java
new file mode 100644
index 0000000000..4b0dc16943
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_NanoForge.java
@@ -0,0 +1,467 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.ExoticEnergy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_Values.AuthorBlueWeabo;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_GLOW;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofFrame;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Block_Casings8;
+
+public class GT_MetaTileEntity_NanoForge extends
+ GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GT_MetaTileEntity_NanoForge> implements ISurvivalConstructable {
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final String STRUCTURE_PIECE_TIER2 = "tier2";
+ private static final String STRUCTURE_PIECE_TIER3 = "tier3";
+ private static final IStructureDefinition<GT_MetaTileEntity_NanoForge> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_NanoForge>builder()
+ // spotless:off
+ .addShape(STRUCTURE_PIECE_MAIN, transpose(new String[][] {
+ {" "," "," F "," C "," C "," C "," C "," F "," "," "},
+ {" "," "," F "," C "," C "," C "," C "," F "," "," "},
+ {" "," "," F "," C "," C "," C "," C "," F "," "," "},
+ {" "," "," F "," C "," C "," C "," C "," F "," "," "},
+ {" "," "," F "," C "," C "," C "," C "," F "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "},
+ {" C "," FCF "," CC CC "," C C "," C C "," C C "," C C "," CC CC "," FCF "," C "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," FCF "," FC CF "," C C "," C C "," C C "," C C "," FC CF "," FCF "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," "," FCF "," C C "," C C "," C C "," C C "," FCF "," "," "},
+ {" "," BB~BB "," BBBBBBB ","BBBBBBBBB","BBBBBBBBB","BBBBBBBBB","BBBBBBBBB"," BBBBBBB "," BBBBB "," "}
+ }))
+ .addShape(STRUCTURE_PIECE_TIER2, transpose(new String[][] {
+ {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "},
+ {" ", " ", " AA ", " ACCA ", " ACCA ", " AA ", " ", " "},
+ {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "},
+ {" ", " ", " AA ", " ACCA ", " ACCA ", " AA ", " ", " "},
+ {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" ", " ", " ", " CC ", " CC ", " ", " ", " "},
+ {" CCCCCC ", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", " CCCCCC "}
+ }))
+ .addShape(STRUCTURE_PIECE_TIER3, transpose(new String[][] {
+ {" ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " "},
+ {" ", " ", " FFAA ", " ACCA ", " ACCA ", " AAFF ", " ", " "},
+ {" ", " ", "F CC ", "F CCCC ", " CCCC F", " CC F", " ", " "},
+ {" ", " ", " F", " CC F", "F CC ", "F ", " ", " "},
+ {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "},
+ {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "},
+ {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "},
+ {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "},
+ {" ", " ", "F ", "F CC ", " CC F", " F", " ", " "},
+ {" ", " ", " CC F", " CCCC F", "F CCCC ", "F CC ", " ", " "},
+ {" ", " F ", " CC ", " CCCC ", " CCCC ", " CC ", " F ", " "},
+ {" FF ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " FF "},
+ {" FF ", " ", " CC ", " CCCC ", " CCCC ", " CC ", " ", " FF "},
+ {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "},
+ {" ", " ", "F ", "F CC ", " CC F", " F", " ", " "},
+ {" ", " ", " F", " CC F", "F CC ", "F ", " ", " "},
+ {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "},
+ {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "},
+ {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "},
+ {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "},
+ {" ", " ", "F CC ", "F CCCC ", " CCCC F", " CC F", " ", " "},
+ {" ", " ", " AA F", " ACCA F", "F ACCA ", "F AA ", " ", " "},
+ {" ", " F ", " CC ", " CCCC ", " CCCC ", " CC ", " F ", " "},
+ {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "},
+ {" FF ", " ", " ", " CC ", " CC ", " ", " ", " FF "},
+ {" ", " F ", " ", " CC ", " CC ", " ", " F ", " "},
+ {" CCCCCC ", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", "CCCCCCCC", " CCCCCC "}
+ }))
+ //spotless:on
+ .addElement('F', ofFrame(Materials.StellarAlloy))
+ .addElement('C', ofBlock(GregTech_API.sBlockCasings8, 10))
+ .addElement('A', ofBlock(GregTech_API.sBlockCasings2, 5))
+ .addElement(
+ 'B',
+ buildHatchAdder(GT_MetaTileEntity_NanoForge.class)
+ .atLeast(InputHatch, OutputBus, InputBus, Maintenance, Energy.or(ExoticEnergy))
+ .dot(1)
+ .casingIndex(((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(10))
+ .buildAndChain(GregTech_API.sBlockCasings8, 10))
+ .build();
+ private byte mSpecialTier = 0;
+
+ public GT_MetaTileEntity_NanoForge(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_NanoForge(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.nanoForgeRecipes;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 4, 37, 1);
+ if (stackSize.stackSize > 1) {
+ buildPiece(STRUCTURE_PIECE_TIER2, stackSize, hintsOnly, -7, 14, 4);
+ }
+ if (stackSize.stackSize > 2) {
+ buildPiece(STRUCTURE_PIECE_TIER3, stackSize, hintsOnly, 14, 26, 4);
+ }
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_NanoForge(this.mName);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ if (sideDirection == facingDirection) {
+ if (active) return new ITexture[] {
+ BlockIcons.getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 10)),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] {
+ BlockIcons.getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 10)),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] {
+ BlockIcons.getCasingTextureForId(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 10)) };
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_NanoForge> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Override
+ protected @Nonnull CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ return recipe.mSpecialValue <= mSpecialTier ? CheckRecipeResultRegistry.SUCCESSFUL
+ : CheckRecipeResultRegistry.NO_RECIPE;
+ }
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe)
+ .setDurationDecreasePerOC(mSpecialTier > recipe.mSpecialValue ? 2 : 1);
+ }
+ };
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(getMaxInputEu());
+ logic.setAvailableAmperage(1);
+ logic.setAmperageOC(false);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+ // TODO: Look for proper fix
+ // Updates every 10 sec
+ if (mUpdate <= -150) mUpdate = 50;
+ }
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mSpecialTier = 0;
+ if (checkPiece(STRUCTURE_PIECE_MAIN, 4, 37, 1) && aStack != null) {
+ if (aStack.isItemEqual(Materials.Carbon.getNanite(1))) {
+ mSpecialTier = 1;
+ }
+
+ if (aStack.isItemEqual(Materials.Neutronium.getNanite(1)) && checkPiece(STRUCTURE_PIECE_TIER2, -7, 14, 4)) {
+ mSpecialTier = 2;
+ }
+
+ if (aStack.isItemEqual(MaterialsUEVplus.TranscendentMetal.getNanite(1))
+ && checkPiece(STRUCTURE_PIECE_TIER2, -7, 14, 4)
+ && checkPiece(STRUCTURE_PIECE_TIER3, 14, 26, 4)) {
+ mSpecialTier = 3;
+ }
+ }
+
+ if (mMaintenanceHatches.size() != 1) {
+ return false;
+ }
+
+ if (!checkExoticAndNormalEnergyHatches()) {
+ return false;
+ }
+
+ return mSpecialTier > 0;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int built = survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 4, 37, 1, elementBudget, env, false, true);
+ if (built >= 0) return built;
+ if (stackSize.stackSize > 1) {
+ built += survivialBuildPiece(STRUCTURE_PIECE_TIER2, stackSize, -7, 14, 4, elementBudget, env, false, true);
+ }
+ if (stackSize.stackSize > 2) {
+ built += survivialBuildPiece(STRUCTURE_PIECE_TIER3, stackSize, 14, 26, 4, elementBudget, env, false, true);
+ }
+ return built;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setByte("mSpecialTier", mSpecialTier);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("mSeparate")) {
+ // backward compatibility
+ inputSeparation = aNBT.getBoolean("mSeparate");
+ }
+ mSpecialTier = aNBT.getByte("mSpecialTier");
+ }
+
+ @Override
+ protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) {
+ super.drawTexts(screenElements, inventorySlot);
+ screenElements
+ .widget(
+ new TextWidget(StatCollector.translateToLocal("GT5U.gui.button.tier") + " " + mSpecialTier)
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0))
+ .widget(
+ new FakeSyncWidget.IntegerSyncer(
+ () -> (int) mSpecialTier,
+ val -> mSpecialTier = (byte) (val % Byte.MAX_VALUE)));
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Nanite Fabricator")
+ .addInfo("Controller block for the Nano Forge")
+ .addInfo("Requires insane amounts of power to create nanites. Each tier")
+ .addInfo("the multi gains a new building next to it. The nanite in the")
+ .addInfo("controller slot controls the tier.")
+ .addInfo("--------------------------------------------")
+ .addInfo("Requires a Carbon Nanite to use tier " + EnumChatFormatting.DARK_PURPLE + 1)
+ .addInfo("Requires a Neutronium Nanite to use tier " + EnumChatFormatting.DARK_PURPLE + 2)
+ .addInfo("Requires a Transcendent Metal Nanite to use tier " + EnumChatFormatting.DARK_PURPLE + 3)
+ .addInfo("--------------------------------------------")
+ .addInfo("If a recipe's tier is lower than the tier of the Nano Forge")
+ .addInfo("it gains " + EnumChatFormatting.RED + "perfect overclock" + EnumChatFormatting.GRAY + ".")
+ .addInfo(AuthorBlueWeabo)
+ .addSeparator()
+ .beginStructureBlock(30, 38, 13, false)
+ .addStructureInfo("Nano Forge Structure is too complex! See schematic for details.")
+ .addStructureInfo("--------------------------------------------")
+ .addStructureInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 1 + EnumChatFormatting.GRAY)
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "527" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "171" + EnumChatFormatting.GRAY + " Stellar Alloy Frame Box")
+ .addStructureInfo("--------------------------------------------")
+ .addStructureInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 2 + EnumChatFormatting.GRAY)
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "148" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "16" + EnumChatFormatting.GRAY + " Assembling Line Casing")
+ .addStructureInfo("--------------------------------------------")
+ .addStructureInfo("Tier " + EnumChatFormatting.DARK_PURPLE + 3 + EnumChatFormatting.GRAY)
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "228" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "84" + EnumChatFormatting.GRAY + " Stellar Alloy Frame Box")
+ .addStructureInfo(EnumChatFormatting.GOLD + "16" + EnumChatFormatting.GRAY + " Assembling Line Casing")
+ .addStructureInfo("--------------------------------------------")
+ .addStructureInfo(
+ "Requires " + EnumChatFormatting.GOLD
+ + "1"
+ + EnumChatFormatting.GRAY
+ + "-"
+ + EnumChatFormatting.GOLD
+ + "2"
+ + EnumChatFormatting.GRAY
+ + " energy hatches or "
+ + EnumChatFormatting.GOLD
+ + "1"
+ + EnumChatFormatting.GRAY
+ + " TT energy hatch.")
+ .addStructureInfo(
+ "Requires " + EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + " maintenance hatch.")
+ .addStructureInfo(
+ "Requires " + EnumChatFormatting.GOLD
+ + 1
+ + EnumChatFormatting.GRAY
+ + "+"
+ + EnumChatFormatting.GRAY
+ + " input hatches.")
+ .addStructureInfo(
+ "Requires " + EnumChatFormatting.GOLD
+ + 0
+ + EnumChatFormatting.GRAY
+ + "+"
+ + EnumChatFormatting.GRAY
+ + " output hatches.")
+ .addStructureInfo(
+ "Requires " + EnumChatFormatting.GOLD
+ + 1
+ + EnumChatFormatting.GRAY
+ + "+"
+ + EnumChatFormatting.GRAY
+ + " input busses.")
+ .addStructureInfo(
+ "Requires " + EnumChatFormatting.GOLD
+ + 1
+ + EnumChatFormatting.GRAY
+ + "+"
+ + EnumChatFormatting.GRAY
+ + " output busses.")
+ .addStructureInfo("--------------------------------------------")
+ .toolTipFinisher("GregTech");
+ return tt;
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ inputSeparation = !inputSeparation;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation);
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilCracker.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilCracker.java
new file mode 100644
index 0000000000..9ca671aa49
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilCracker.java
@@ -0,0 +1,423 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_CRACKER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_CRACKER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_CRACKER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_CRACKER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_HatchElement;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.maps.OilCrackerBackend;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Input_ME;
+import gregtech.common.tileentities.machines.IRecipeProcessingAwareHatch;
+
+public class GT_MetaTileEntity_OilCracker extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_OilCracker>
+ implements ISurvivalConstructable {
+
+ private static final byte CASING_INDEX = 49;
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final IStructureDefinition<GT_MetaTileEntity_OilCracker> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_OilCracker>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(
+ new String[][] { { "lcmcr", "lcmcr", "lcmcr" }, { "lc~cr", "l---r", "lcmcr" },
+ { "lcmcr", "lcmcr", "lcmcr" }, }))
+ .addElement('c', ofCoil(GT_MetaTileEntity_OilCracker::setCoilLevel, GT_MetaTileEntity_OilCracker::getCoilLevel))
+ .addElement(
+ 'l',
+ buildHatchAdder(GT_MetaTileEntity_OilCracker.class)
+ .atLeast(
+ GT_HatchElement.InputHatch.withAdder(GT_MetaTileEntity_OilCracker::addLeftHatchToMachineList),
+ GT_HatchElement.Energy,
+ GT_HatchElement.Maintenance)
+ .dot(2)
+ .casingIndex(CASING_INDEX)
+ .buildAndChain(
+ onElementPass(
+ GT_MetaTileEntity_OilCracker::onCasingAdded,
+ ofBlock(GregTech_API.sBlockCasings4, 1))))
+ .addElement(
+ 'r',
+ buildHatchAdder(GT_MetaTileEntity_OilCracker.class)
+ .atLeast(
+ GT_HatchElement.OutputHatch.withAdder(GT_MetaTileEntity_OilCracker::addRightHatchToMachineList),
+ GT_HatchElement.Energy,
+ GT_HatchElement.Maintenance)
+ .dot(3)
+ .casingIndex(CASING_INDEX)
+ .buildAndChain(
+ onElementPass(
+ GT_MetaTileEntity_OilCracker::onCasingAdded,
+ ofBlock(GregTech_API.sBlockCasings4, 1))))
+ .addElement(
+ 'm',
+ buildHatchAdder(GT_MetaTileEntity_OilCracker.class)
+ .atLeast(
+ GT_HatchElement.InputHatch.withAdder(GT_MetaTileEntity_OilCracker::addMiddleInputToMachineList)
+ .withCount(t -> t.mMiddleInputHatches.size()),
+ GT_HatchElement.InputBus,
+ GT_HatchElement.Energy,
+ GT_HatchElement.Maintenance)
+ .dot(1)
+ .casingIndex(CASING_INDEX)
+ .buildAndChain(
+ onElementPass(
+ GT_MetaTileEntity_OilCracker::onCasingAdded,
+ ofBlock(GregTech_API.sBlockCasings4, 1))))
+ .build();
+ private HeatingCoilLevel heatLevel;
+ protected final List<GT_MetaTileEntity_Hatch_Input> mMiddleInputHatches = new ArrayList<>();
+ // 0 -> left, 1 -> right, any other -> not found
+ protected int mInputOnSide;
+ protected int mOutputOnSide;
+ protected int mCasingAmount;
+
+ public GT_MetaTileEntity_OilCracker(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_OilCracker(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Cracker")
+ .addInfo("Controller block for the Oil Cracking Unit")
+ .addInfo("Thermally cracks heavy hydrocarbons into lighter fractions")
+ .addInfo("More efficient than the Chemical Reactor")
+ .addInfo("Gives different benefits whether it hydro or steam-cracks:")
+ .addInfo("Hydro - Consumes 20% less Hydrogen and outputs 25% more cracked fluid")
+ .addInfo("Steam - Outputs 50% more cracked fluid")
+ .addInfo("(Values compared to cracking in the Chemical Reactor)")
+ .addInfo("Place the appropriate circuit in the controller or an input bus")
+ .addSeparator()
+ .beginStructureBlock(5, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoRange("Clean Stainless Steel Machine Casing", 18, 21, false)
+ .addOtherStructurePart("2 Rings of 8 Coils", "Each side of the controller")
+ .addInfo("Gets 10% EU/t reduction per coil tier, up to a maximum of 50%")
+ .addEnergyHatch("Any casing", 1, 2, 3)
+ .addMaintenanceHatch("Any casing", 1, 2, 3)
+ .addInputHatch("For cracking fluid (Steam/Hydrogen/etc.) ONLY, Any middle ring casing", 1)
+ .addInputHatch("Any left/right side casing", 2, 3)
+ .addOutputHatch("Any right/left side casing", 2, 3)
+ .addStructureInfo("Input/Output Hatches must be on opposite sides!")
+ .addInputBus("Any middle ring casing, optional for programmed circuit automation")
+ .addStructureHint("GT5U.cracker.io_side")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ if (sideDirection == facingDirection) {
+ if (active) return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_OIL_CRACKER_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_OIL_CRACKER_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { casingTexturePages[0][CASING_INDEX], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_OIL_CRACKER)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_OIL_CRACKER_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { casingTexturePages[0][CASING_INDEX] };
+ }
+
+ @Override
+ public RecipeMap<OilCrackerBackend> getRecipeMap() {
+ return RecipeMaps.crackingRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Nonnull
+ @Override
+ public CheckRecipeResult process() {
+ setEuModifier(1.0F - Math.min(0.1F * (heatLevel.getTier() + 1), 0.5F));
+ return super.process();
+ }
+ };
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_OilCracker> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ public HeatingCoilLevel getCoilLevel() {
+ return heatLevel;
+ }
+
+ public void setCoilLevel(HeatingCoilLevel aCoilLevel) {
+ heatLevel = aCoilLevel;
+ }
+
+ private boolean addMiddleInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input tHatch) {
+ tHatch.updateTexture(aBaseCasingIndex);
+ tHatch.mRecipeMap = getRecipeMap();
+ return mMiddleInputHatches.add(tHatch);
+ }
+ return false;
+ }
+
+ private boolean addLeftHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input tHatch) {
+ if (mInputOnSide == 1) return false;
+ mInputOnSide = 0;
+ mOutputOnSide = 1;
+ tHatch.updateTexture(aBaseCasingIndex);
+ tHatch.mRecipeMap = getRecipeMap();
+ return mInputHatches.add(tHatch);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output tHatch) {
+ if (mOutputOnSide == 1) return false;
+ mInputOnSide = 1;
+ mOutputOnSide = 0;
+ tHatch.updateTexture(aBaseCasingIndex);
+ return mOutputHatches.add(tHatch);
+ }
+ return false;
+ }
+
+ private boolean addRightHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input tHatch) {
+ if (mInputOnSide == 0) return false;
+ mInputOnSide = 1;
+ mOutputOnSide = 0;
+ tHatch.updateTexture(aBaseCasingIndex);
+ tHatch.mRecipeMap = getRecipeMap();
+ return mInputHatches.add(tHatch);
+ }
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output tHatch) {
+ if (mOutputOnSide == 0) return false;
+ mInputOnSide = 0;
+ mOutputOnSide = 1;
+ tHatch.updateTexture(aBaseCasingIndex);
+ return mOutputHatches.add(tHatch);
+ }
+ return false;
+ }
+
+ private void onCasingAdded() {
+ mCasingAmount++;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ setCoilLevel(HeatingCoilLevel.None);
+ mCasingAmount = 0;
+ mMiddleInputHatches.clear();
+ mInputOnSide = -1;
+ mOutputOnSide = -1;
+ replaceDeprecatedCoils(aBaseMetaTileEntity);
+ return checkPiece(STRUCTURE_PIECE_MAIN, 2, 1, 0) && mInputOnSide != -1
+ && mOutputOnSide != -1
+ && mCasingAmount >= 18
+ && mMaintenanceHatches.size() == 1
+ && !mMiddleInputHatches.isEmpty();
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_OilCracker(this.mName);
+ }
+
+ private void replaceDeprecatedCoils(IGregTechTileEntity aBaseMetaTileEntity) {
+ final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX;
+ final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ;
+ final int tX = aBaseMetaTileEntity.getXCoord() + xDir;
+ final int tY = aBaseMetaTileEntity.getYCoord();
+ final int tZ = aBaseMetaTileEntity.getZCoord() + zDir;
+ for (int xPos = tX - 1; xPos <= tX + 1; xPos += (xDir != 0 ? 1 : 2))
+ for (int yPos = tY - 1; yPos <= tY + 1; yPos++)
+ for (int zPos = tZ - 1; zPos <= tZ + 1; zPos += (xDir != 0 ? 2 : 1)) {
+ if ((yPos == tY) && (xPos == tX || zPos == tZ)) continue;
+ final byte tUsedMeta = aBaseMetaTileEntity.getMetaID(xPos, yPos, zPos);
+ if (tUsedMeta < 12) continue;
+ if (tUsedMeta > 14) continue;
+ if (aBaseMetaTileEntity.getBlock(xPos, yPos, zPos) != GregTech_API.sBlockCasings1) continue;
+
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(xPos, yPos, zPos, GregTech_API.sBlockCasings5, tUsedMeta - 12, 3);
+ }
+ }
+
+ @Override
+ public ArrayList<FluidStack> getStoredFluids() {
+ final ArrayList<FluidStack> rList = new ArrayList<>();
+ Map<Fluid, FluidStack> inputsFromME = new HashMap<>();
+ for (final GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) {
+ tHatch.mRecipeMap = getRecipeMap();
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) {
+ for (FluidStack tFluid : meHatch.getStoredFluids()) {
+ if (tFluid != null && !getRecipeMap().getBackend()
+ .isValidCatalystFluid(tFluid)) {
+ inputsFromME.put(tFluid.getFluid(), tFluid);
+ }
+ }
+ } else if (tHatch instanceof GT_MetaTileEntity_Hatch_MultiInput) {
+ for (final FluidStack tFluid : ((GT_MetaTileEntity_Hatch_MultiInput) tHatch).getStoredFluid()) {
+ if (tFluid != null && !getRecipeMap().getBackend()
+ .isValidCatalystFluid(tFluid)) {
+ rList.add(tFluid);
+ }
+ }
+ } else {
+ if (tHatch.getFillableStack() != null) {
+ if (!getRecipeMap().getBackend()
+ .isValidCatalystFluid(tHatch.getFillableStack())) rList.add(tHatch.getFillableStack());
+ }
+ }
+ }
+ for (final GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mMiddleInputHatches)) {
+ tHatch.mRecipeMap = getRecipeMap();
+ if (tHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) {
+ for (FluidStack tFluid : meHatch.getStoredFluids()) {
+ if (tFluid != null && getRecipeMap().getBackend()
+ .isValidCatalystFluid(tFluid)) {
+ inputsFromME.put(tFluid.getFluid(), tFluid);
+ }
+ }
+ } else if (tHatch instanceof GT_MetaTileEntity_Hatch_MultiInput) {
+ for (final FluidStack tFluid : ((GT_MetaTileEntity_Hatch_MultiInput) tHatch).getStoredFluid()) {
+ if (tFluid != null && getRecipeMap().getBackend()
+ .isValidCatalystFluid(tFluid)) {
+ rList.add(tFluid);
+ }
+ }
+ } else {
+ if (tHatch.getFillableStack() != null) {
+ final FluidStack tStack = tHatch.getFillableStack();
+ if (getRecipeMap().getBackend()
+ .isValidCatalystFluid(tStack)) {
+ rList.add(tStack);
+ }
+ }
+ }
+ }
+ if (!inputsFromME.isEmpty()) {
+ rList.addAll(inputsFromME.values());
+ }
+ return rList;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 2, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 2, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ protected void startRecipeProcessing() {
+ for (GT_MetaTileEntity_Hatch_Input hatch : filterValidMTEs(mMiddleInputHatches)) {
+ if (hatch instanceof IRecipeProcessingAwareHatch aware) {
+ aware.startRecipeProcessing();
+ }
+ }
+ super.startRecipeProcessing();
+ }
+
+ @Override
+ protected void endRecipeProcessing() {
+ super.endRecipeProcessing();
+ for (GT_MetaTileEntity_Hatch_Input hatch : filterValidMTEs(mMiddleInputHatches)) {
+ if (hatch instanceof IRecipeProcessingAwareHatch aware) {
+ setResultIfFailure(aware.endRecipeProcessing(this));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill1.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill1.java
new file mode 100644
index 0000000000..1e37dcbac9
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill1.java
@@ -0,0 +1,53 @@
+package gregtech.common.tileentities.machines.multi;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_OilDrill1 extends GT_MetaTileEntity_OilDrillBase {
+
+ public GT_MetaTileEntity_OilDrill1(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_OilDrill1(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ return createTooltip("I");
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_OilDrill1(mName);
+ }
+
+ @Override
+ protected ItemList getCasingBlockItem() {
+ return ItemList.Casing_SolidSteel;
+ }
+
+ @Override
+ protected Materials getFrameMaterial() {
+ return Materials.Steel;
+ }
+
+ @Override
+ protected int getCasingTextureIndex() {
+ return 16;
+ }
+
+ @Override
+ protected int getRangeInChunks() {
+ return 1;
+ }
+
+ @Override
+ protected int getMinTier() {
+ return 2;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill2.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill2.java
new file mode 100644
index 0000000000..10a64a6b1d
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill2.java
@@ -0,0 +1,55 @@
+package gregtech.common.tileentities.machines.multi;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_OilDrill2 extends GT_MetaTileEntity_OilDrillBase {
+
+ public GT_MetaTileEntity_OilDrill2(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_OilDrill2(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ return createTooltip("II");
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_OilDrill2(mName);
+ }
+
+ @Override
+ protected ItemList getCasingBlockItem() {
+ return ItemList.Casing_CleanStainlessSteel;
+ }
+
+ @Override
+ protected Materials getFrameMaterial() {
+ return Materials.StainlessSteel;
+ }
+
+ @Override
+ protected int getCasingTextureIndex() {
+ return GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 1);
+ }
+
+ @Override
+ protected int getRangeInChunks() {
+ return 2;
+ }
+
+ @Override
+ protected int getMinTier() {
+ return 3;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill3.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill3.java
new file mode 100644
index 0000000000..bcbe42d794
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill3.java
@@ -0,0 +1,55 @@
+package gregtech.common.tileentities.machines.multi;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_OilDrill3 extends GT_MetaTileEntity_OilDrillBase {
+
+ public GT_MetaTileEntity_OilDrill3(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_OilDrill3(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ return createTooltip("III");
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_OilDrill3(mName);
+ }
+
+ @Override
+ protected ItemList getCasingBlockItem() {
+ return ItemList.Casing_StableTitanium;
+ }
+
+ @Override
+ protected Materials getFrameMaterial() {
+ return Materials.Titanium;
+ }
+
+ @Override
+ protected int getCasingTextureIndex() {
+ return GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 2);
+ }
+
+ @Override
+ protected int getRangeInChunks() {
+ return 4;
+ }
+
+ @Override
+ protected int getMinTier() {
+ return 4;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill4.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill4.java
new file mode 100644
index 0000000000..802e9f1c5c
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill4.java
@@ -0,0 +1,55 @@
+package gregtech.common.tileentities.machines.multi;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_OilDrill4 extends GT_MetaTileEntity_OilDrillBase {
+
+ public GT_MetaTileEntity_OilDrill4(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_OilDrill4(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ return createTooltip("IV");
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_OilDrill4(mName);
+ }
+
+ @Override
+ protected ItemList getCasingBlockItem() {
+ return ItemList.Casing_RobustTungstenSteel;
+ }
+
+ @Override
+ protected Materials getFrameMaterial() {
+ return Materials.TungstenSteel;
+ }
+
+ @Override
+ protected int getCasingTextureIndex() {
+ return GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings4, 0);
+ }
+
+ @Override
+ protected int getRangeInChunks() {
+ return 8;
+ }
+
+ @Override
+ protected int getMinTier() {
+ return 5;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillBase.java
new file mode 100644
index 0000000000..075b4e19a1
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillBase.java
@@ -0,0 +1,489 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.enums.GT_Values.debugDriller;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.getCasingTextureForId;
+import static gregtech.common.GT_UndergroundOil.undergroundOil;
+import static gregtech.common.GT_UndergroundOil.undergroundOilReadInformation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.Nonnegative;
+
+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.util.StatCollector;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetricsExporter;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.objects.GT_ChunkManager;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ValidationResult;
+import gregtech.api.util.ValidationType;
+
+public abstract class GT_MetaTileEntity_OilDrillBase extends GT_MetaTileEntity_DrillerBase implements IMetricsExporter {
+
+ private final ArrayList<Chunk> mOilFieldChunks = new ArrayList<>();
+ private int mOilId = 0;
+ private int mOilFlow = 0;
+
+ private int chunkRangeConfig = getRangeInChunks();
+
+ public GT_MetaTileEntity_OilDrillBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_OilDrillBase(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ if (aActive) return new ITexture[] { getCasingTextureForId(casingTextureIndex), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_OIL_DRILL_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_OIL_DRILL_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { getCasingTextureForId(casingTextureIndex), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_OIL_DRILL)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_OIL_DRILL_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { getCasingTextureForId(casingTextureIndex) };
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("mOilId", mOilId);
+ aNBT.setInteger("chunkRangeConfig", chunkRangeConfig);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mOilId = aNBT.getInteger("mOilId");
+ if (aNBT.hasKey("chunkRangeConfig")) chunkRangeConfig = aNBT.getInteger("chunkRangeConfig");
+ }
+
+ protected GT_Multiblock_Tooltip_Builder createTooltip(String tierSuffix) {
+ String casings = getCasingBlockItem().get(0)
+ .getDisplayName();
+
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Pump")
+ .addInfo("Controller Block for the Oil/Gas/Fluid Drilling Rig " + (tierSuffix != null ? tierSuffix : ""))
+ .addInfo("Works on " + getRangeInChunks() + "x" + getRangeInChunks() + " chunks")
+ .addInfo("Use a Screwdriver to configure range")
+ .addInfo("Use Programmed Circuits to ignore near exhausted oil field")
+ .addInfo("If total circuit # is greater than output amount it will halt. If it worked right.") // doesn't
+ // work
+ .addSeparator()
+ .beginStructureBlock(3, 7, 3, false)
+ .addController("Front bottom")
+ .addOtherStructurePart(casings, "form the 3x1x3 Base")
+ .addOtherStructurePart(casings, "1x3x1 pillar above the center of the base (2 minimum total)")
+ .addOtherStructurePart(getFrameMaterial().mName + " Frame Boxes", "Each pillar's side and 1x3x1 on top")
+ .addEnergyHatch("1x " + VN[getMinTier()] + "+, Any base casing", 1)
+ .addMaintenanceHatch("Any base casing", 1)
+ .addInputBus("Mining Pipes or Circuits, optional, any base casing", 1)
+ .addOutputHatch("Any base casing", 1)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ protected abstract int getRangeInChunks();
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ int oldChunkRange = chunkRangeConfig;
+ if (aPlayer.isSneaking()) {
+ if (chunkRangeConfig > 0) {
+ chunkRangeConfig--;
+ }
+ if (chunkRangeConfig == 0) chunkRangeConfig = getRangeInChunks();
+ } else {
+ if (chunkRangeConfig <= getRangeInChunks()) {
+ chunkRangeConfig++;
+ }
+ if (chunkRangeConfig > getRangeInChunks()) chunkRangeConfig = 1;
+ }
+ if (oldChunkRange != chunkRangeConfig) mOilFieldChunks.clear();
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.machines.workareaset") + " "
+ + chunkRangeConfig
+ + "x"
+ + chunkRangeConfig
+ + StatCollector.translateToLocal("GT5U.machines.chunks")); // TODO Add translation support
+ }
+
+ @Override
+ protected boolean checkHatches() {
+ return !mMaintenanceHatches.isEmpty() && !mOutputHatches.isEmpty() && mEnergyHatches.size() == 1;
+ }
+
+ @Override
+ protected List<IHatchElement<? super GT_MetaTileEntity_DrillerBase>> getAllowedHatches() {
+ return ImmutableList.of(InputBus, OutputHatch, Maintenance, Energy);
+ }
+
+ @Override
+ protected void setElectricityStats() {
+ this.mEfficiency = getCurrentEfficiency(null);
+ this.mEfficiencyIncrease = 10000;
+ int tier = Math.max(0, GT_Utility.getTier(getMaxInputVoltage()));
+ this.mEUt = -7 << (tier << 1); // (1/4) A of current tier when at bottom (7/8) A of current tier while mining
+ this.mMaxProgresstime = Math.max(
+ 1,
+ (workState == STATE_AT_BOTTOM ? (64 * (chunkRangeConfig * chunkRangeConfig)) >> (getMinTier() - 1) : 120)
+ >> tier);
+ }
+
+ protected float computeSpeed() {
+ return .5F + (GT_Utility.getTier(getMaxInputVoltage()) - getMinTier()) * .25F;
+ }
+
+ @Override
+ protected boolean workingAtBottom(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe,
+ int yHead, int oldYHead) {
+ switch (tryLowerPipeState(true)) {
+ case 0 -> {
+ workState = STATE_DOWNWARD;
+ setElectricityStats();
+ return true;
+ }
+ case 3 -> {
+ workState = STATE_UPWARD;
+ return true;
+ }
+ }
+
+ if (reachingVoidOrBedrock() && tryFillChunkList()) {
+ if (mWorkChunkNeedsReload) {
+ mCurrentChunk = new ChunkCoordIntPair(xDrill >> 4, zDrill >> 4);
+ GT_ChunkManager.requestChunkLoad((TileEntity) getBaseMetaTileEntity(), null);
+ mWorkChunkNeedsReload = false;
+ }
+ float speed = computeSpeed();
+ ValidationResult<FluidStack> pumpResult = tryPumpOil(speed);
+ if (pumpResult.getType() != ValidationType.VALID) {
+ mEUt = 0;
+ mMaxProgresstime = 0;
+ setRuntimeFailureReason(CheckRecipeResultRegistry.FLUID_OUTPUT_FULL);
+ return false;
+ }
+ FluidStack tFluid = pumpResult.getResult();
+ if (tFluid != null && tFluid.amount > getTotalConfigValue()) {
+ this.mOutputFluids = new FluidStack[] { tFluid };
+ return true;
+ }
+ }
+ GT_ChunkManager.releaseTicket((TileEntity) getBaseMetaTileEntity());
+ workState = STATE_UPWARD;
+ setShutdownReason(StatCollector.translateToLocal("GT5U.gui.text.drill_exhausted"));
+ return true;
+ }
+
+ private boolean tryFillChunkList() {
+ FluidStack tFluid, tOil;
+ if (mOilId <= 0) {
+ tFluid = undergroundOilReadInformation(getBaseMetaTileEntity());
+ if (tFluid == null) return false;
+ mOilId = tFluid.getFluidID();
+ }
+ if (debugDriller) {
+ GT_Log.out.println(" Driller on fluid = " + mOilId);
+ }
+
+ tOil = new FluidStack(FluidRegistry.getFluid(mOilId), 0);
+
+ if (mOilFieldChunks.isEmpty()) {
+ Chunk tChunk = getBaseMetaTileEntity().getWorld()
+ .getChunkFromBlockCoords(getBaseMetaTileEntity().getXCoord(), getBaseMetaTileEntity().getZCoord());
+ int range = chunkRangeConfig;
+ int xChunk = Math.floorDiv(tChunk.xPosition, range) * range; // Java was written by idiots. For negative
+ // values, / returns rounded towards zero.
+ // Fucking morons.
+ int zChunk = Math.floorDiv(tChunk.zPosition, range) * range;
+ if (debugDriller) {
+ GT_Log.out.println(
+ "tChunk.xPosition = " + tChunk.xPosition
+ + " tChunk.zPosition = "
+ + tChunk.zPosition
+ + " xChunk = "
+ + xChunk
+ + " zChunk = "
+ + zChunk);
+ }
+ for (int i = 0; i < range; i++) {
+ for (int j = 0; j < range; j++) {
+ if (debugDriller) {
+ GT_Log.out.println(" getChunkX = " + (xChunk + i) + " getChunkZ = " + (zChunk + j));
+ }
+ tChunk = getBaseMetaTileEntity().getWorld()
+ .getChunkFromChunkCoords(xChunk + i, zChunk + j);
+ tFluid = undergroundOilReadInformation(tChunk);
+ if (debugDriller) {
+ GT_Log.out.println(
+ " Fluid in chunk = " + tFluid.getFluid()
+ .getID());
+ }
+ if (tOil.isFluidEqual(tFluid) && tFluid.amount > 0) {
+ mOilFieldChunks.add(tChunk);
+ if (debugDriller) {
+ GT_Log.out.println(" Matching fluid, quantity = " + tFluid.amount);
+ }
+ }
+ }
+ }
+ }
+ if (debugDriller) {
+ GT_Log.out.println("mOilFieldChunks.size = " + mOilFieldChunks.size());
+ }
+ return !mOilFieldChunks.isEmpty();
+ }
+
+ /**
+ * Tries to pump oil, accounting for output space if void protection is enabled.
+ * <p>
+ * If pumped fluid will not fit in output hatches, it returns a result with INVALID.
+ * <p>
+ * If vein is depleted, it returns a result with VALID and null fluid.
+ */
+ protected ValidationResult<FluidStack> tryPumpOil(float speed) {
+ if (mOilId <= 0) return null;
+ if (debugDriller) {
+ GT_Log.out.println(" pump speed = " + speed);
+ }
+
+ // Even though it works fine without this check,
+ // it can save tiny amount of CPU time when void protection is disabled
+ if (protectsExcessFluid()) {
+ FluidStack simulatedOil = pumpOil(speed, true);
+ if (!canOutputAll(new FluidStack[] { simulatedOil })) {
+ return ValidationResult.of(ValidationType.INVALID, null);
+ }
+ }
+
+ FluidStack pumpedOil = pumpOil(speed, false);
+ mOilFlow = pumpedOil.amount;
+ return ValidationResult.of(ValidationType.VALID, pumpedOil.amount == 0 ? null : pumpedOil);
+ }
+
+ /**
+ * @param speed Speed to pump oil
+ * @param simulate If true, it actually does not consume vein
+ * @return Fluid pumped
+ */
+ protected FluidStack pumpOil(@Nonnegative float speed, boolean simulate) {
+ if (speed < 0) {
+ throw new IllegalArgumentException("Don't pass negative speed");
+ }
+
+ ArrayList<Chunk> emptyChunks = new ArrayList<>();
+ FluidStack returnOil = new FluidStack(FluidRegistry.getFluid(mOilId), 0);
+
+ for (Chunk tChunk : mOilFieldChunks) {
+ FluidStack pumped = undergroundOil(tChunk, simulate ? -speed : speed);
+ if (debugDriller) {
+ GT_Log.out.println(
+ " chunkX = " + tChunk.getChunkCoordIntPair().chunkXPos
+ + " chunkZ = "
+ + tChunk.getChunkCoordIntPair().chunkZPos);
+ if (pumped != null) {
+ GT_Log.out.println(" Fluid pumped = " + pumped.amount);
+ } else {
+ GT_Log.out.println(" No fluid pumped ");
+ }
+ }
+ if (pumped == null || pumped.amount < 1) {
+ emptyChunks.add(tChunk);
+ continue;
+ }
+ if (returnOil.isFluidEqual(pumped)) {
+ returnOil.amount += pumped.amount;
+ }
+ }
+ for (Chunk tChunk : emptyChunks) {
+ mOilFieldChunks.remove(tChunk);
+ }
+ return returnOil;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_PUMP_OP;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ List<String> l = new ArrayList<>(
+ Arrays.asList(
+ EnumChatFormatting.BLUE + StatCollector.translateToLocal("GT5U.machines.oilfluidpump")
+ + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.machines.workarea") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(chunkRangeConfig)
+ + " x "
+ + GT_Utility.formatNumbers(chunkRangeConfig)
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.machines.chunks"),
+ "Drilling fluid: " + EnumChatFormatting.GREEN + getFluidName() + EnumChatFormatting.RESET,
+ "Drilling flow: " + EnumChatFormatting.GREEN
+ + getFlowRatePerTick()
+ + EnumChatFormatting.RESET
+ + " L/t"));
+ l.addAll(Arrays.asList(super.getInfoData()));
+ return l.toArray(new String[0]);
+ }
+
+ @Override
+ public @NotNull List<String> reportMetrics() {
+ final boolean machineIsActive = getBaseMetaTileEntity().isActive();
+ final String failureReason = getFailureReason()
+ .map(reason -> StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_offline_reason", reason))
+ .orElseGet(() -> StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_offline_generic"));
+
+ if (workState == STATE_AT_BOTTOM) {
+ final ImmutableList.Builder<String> builder = ImmutableList.builder();
+ builder.add(StatCollector.translateToLocalFormatted("GT5U.gui.text.pump_fluid_type", getFluidName()));
+
+ if (machineIsActive) {
+ builder.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.pump_rate.1",
+ EnumChatFormatting.AQUA + numberFormat.format(getFlowRatePerTick()))
+ + StatCollector.translateToLocal("GT5U.gui.text.pump_rate.2"),
+ mOilFlow + StatCollector.translateToLocal("GT5U.gui.text.pump_recovery.2"));
+ } else {
+ builder.add(failureReason);
+ }
+
+ return builder.build();
+ }
+
+ if (machineIsActive) {
+ return switch (workState) {
+ case STATE_DOWNWARD -> ImmutableList.of(StatCollector.translateToLocal("GT5U.gui.text.deploying_pipe"));
+ case STATE_UPWARD, STATE_ABORT -> ImmutableList
+ .of(StatCollector.translateToLocal("GT5U.gui.text.retracting_pipe"));
+ default -> ImmutableList.of();
+ };
+ }
+
+ return ImmutableList.of(failureReason);
+ }
+
+ protected int getFlowRatePerTick() {
+ return this.mMaxProgresstime > 0 ? (mOilFlow / this.mMaxProgresstime) : 0;
+ }
+
+ @NotNull
+ private String getFluidName() {
+ if (mOilId > 0) {
+ final Fluid fluid = FluidRegistry.getFluid(mOilId);
+ return fluid.getLocalizedName(new FluidStack(fluid, 0));
+ }
+ return "None";
+ }
+
+ private @NotNull String clientFluidType = "";
+ private int clientFlowPerTick = 0;
+ private int clientFlowPerOperation = 0;
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ @Override
+ protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) {
+ super.drawTexts(screenElements, inventorySlot);
+ screenElements
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> EnumChatFormatting.GRAY
+ + StatCollector.translateToLocalFormatted("GT5U.gui.text.pump_fluid_type", clientFluidType))
+ .setTextAlignment(Alignment.CenterLeft)
+ .setEnabled(widget -> getBaseMetaTileEntity().isActive() && workState == STATE_AT_BOTTOM))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> EnumChatFormatting.GRAY
+ + StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.pump_rate.1",
+ EnumChatFormatting.AQUA + numberFormat.format(clientFlowPerTick))
+ + EnumChatFormatting.GRAY
+ + StatCollector.translateToLocal("GT5U.gui.text.pump_rate.2"))
+ .setTextAlignment(Alignment.CenterLeft)
+ .setEnabled(widget -> getBaseMetaTileEntity().isActive() && workState == STATE_AT_BOTTOM))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> EnumChatFormatting.GRAY
+ + StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.pump_recovery.1",
+ EnumChatFormatting.AQUA + numberFormat.format(clientFlowPerOperation))
+ + EnumChatFormatting.GRAY
+ + StatCollector.translateToLocal("GT5U.gui.text.pump_recovery.2"))
+ .setTextAlignment(Alignment.CenterLeft)
+ .setEnabled(widget -> getBaseMetaTileEntity().isActive() && workState == STATE_AT_BOTTOM))
+ .widget(new FakeSyncWidget.IntegerSyncer(() -> workState, newInt -> workState = newInt))
+ .widget(new FakeSyncWidget.StringSyncer(this::getFluidName, newString -> clientFluidType = newString))
+ .widget(new FakeSyncWidget.IntegerSyncer(this::getFlowRatePerTick, newInt -> clientFlowPerTick = newInt))
+ .widget(new FakeSyncWidget.IntegerSyncer(() -> mOilFlow, newInt -> clientFlowPerOperation = newInt));
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillInfinite.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillInfinite.java
new file mode 100644
index 0000000000..056577e8e8
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillInfinite.java
@@ -0,0 +1,87 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.GT_Values.VN;
+
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_OilDrillInfinite extends GT_MetaTileEntity_OilDrillBase {
+
+ public GT_MetaTileEntity_OilDrillInfinite(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_OilDrillInfinite(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ String casings = getCasingBlockItem().get(0)
+ .getDisplayName();
+
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Pump")
+ .addInfo("Controller Block for the Infinite Oil/Gas/Fluid Drilling Rig ")
+ .addInfo("Works on " + getRangeInChunks() + "x" + getRangeInChunks() + " chunks")
+ .addSeparator()
+ .beginStructureBlock(3, 7, 3, false)
+ .addController("Front bottom")
+ .addOtherStructurePart(casings, "form the 3x1x3 Base")
+ .addOtherStructurePart(casings, "1x3x1 pillar above the center of the base (2 minimum total)")
+ .addOtherStructurePart(getFrameMaterial().mName + " Frame Boxes", "Each pillar's side and 1x3x1 on top")
+ .addEnergyHatch("1x " + VN[getMinTier()] + "+, Any base casing", 1)
+ .addMaintenanceHatch("Any base casing", 1)
+ .addInputBus("Mining Pipes or Circuits, optional, any base casing", 1)
+ .addOutputHatch("Any base casing", 1)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_OilDrillInfinite(mName);
+ }
+
+ @Override
+ protected FluidStack pumpOil(float speed, boolean simulate) {
+ // always simulate to not deplete vein
+ return super.pumpOil(speed, true);
+ }
+
+ @Override
+ protected ItemList getCasingBlockItem() {
+ return ItemList.Casing_MiningNeutronium;
+ }
+
+ @Override
+ protected Materials getFrameMaterial() {
+ return Materials.Neutronium;
+ }
+
+ @Override
+ protected int getCasingTextureIndex() {
+ return 178;
+ }
+
+ @Override
+ protected int getRangeInChunks() {
+ return 8;
+ }
+
+ @Override
+ protected float computeSpeed() {
+ return .5F + (GT_Utility.getTier(getMaxInputVoltage()) - getMinTier() + 5) * .25F;
+ }
+
+ @Override
+ protected int getMinTier() {
+ return 9;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant1.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant1.java
new file mode 100644
index 0000000000..50edf8928a
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant1.java
@@ -0,0 +1,60 @@
+package gregtech.common.tileentities.machines.multi;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_OreDrillingPlant1 extends GT_MetaTileEntity_OreDrillingPlantBase {
+
+ public GT_MetaTileEntity_OreDrillingPlant1(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ mTier = 1;
+ }
+
+ public GT_MetaTileEntity_OreDrillingPlant1(String aName) {
+ super(aName);
+ mTier = 1;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ return createTooltip("I");
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_OreDrillingPlant1(mName);
+ }
+
+ @Override
+ protected ItemList getCasingBlockItem() {
+ return ItemList.Casing_SolidSteel;
+ }
+
+ @Override
+ protected Materials getFrameMaterial() {
+ return Materials.Steel;
+ }
+
+ @Override
+ protected int getCasingTextureIndex() {
+ return 16;
+ }
+
+ @Override
+ protected int getRadiusInChunks() {
+ return 3;
+ }
+
+ @Override
+ protected int getMinTier() {
+ return 2;
+ }
+
+ @Override
+ protected int getBaseProgressTime() {
+ return 960;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant2.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant2.java
new file mode 100644
index 0000000000..6a80c96d26
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant2.java
@@ -0,0 +1,60 @@
+package gregtech.common.tileentities.machines.multi;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_OreDrillingPlant2 extends GT_MetaTileEntity_OreDrillingPlantBase {
+
+ public GT_MetaTileEntity_OreDrillingPlant2(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ mTier = 2;
+ }
+
+ public GT_MetaTileEntity_OreDrillingPlant2(String aName) {
+ super(aName);
+ mTier = 2;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ return createTooltip("II");
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_OreDrillingPlant2(mName);
+ }
+
+ @Override
+ protected ItemList getCasingBlockItem() {
+ return ItemList.Casing_StableTitanium;
+ }
+
+ @Override
+ protected Materials getFrameMaterial() {
+ return Materials.Titanium;
+ }
+
+ @Override
+ protected int getCasingTextureIndex() {
+ return 50;
+ }
+
+ @Override
+ protected int getRadiusInChunks() {
+ return 4;
+ }
+
+ @Override
+ protected int getMinTier() {
+ return 3;
+ }
+
+ @Override
+ protected int getBaseProgressTime() {
+ return 800;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant3.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant3.java
new file mode 100644
index 0000000000..2bb25b2254
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant3.java
@@ -0,0 +1,60 @@
+package gregtech.common.tileentities.machines.multi;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_OreDrillingPlant3 extends GT_MetaTileEntity_OreDrillingPlantBase {
+
+ public GT_MetaTileEntity_OreDrillingPlant3(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ mTier = 3;
+ }
+
+ public GT_MetaTileEntity_OreDrillingPlant3(String aName) {
+ super(aName);
+ mTier = 3;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ return createTooltip("III");
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_OreDrillingPlant3(mName);
+ }
+
+ @Override
+ protected ItemList getCasingBlockItem() {
+ return ItemList.Casing_RobustTungstenSteel;
+ }
+
+ @Override
+ protected Materials getFrameMaterial() {
+ return Materials.TungstenSteel;
+ }
+
+ @Override
+ protected int getCasingTextureIndex() {
+ return 48;
+ }
+
+ @Override
+ protected int getRadiusInChunks() {
+ return 6;
+ }
+
+ @Override
+ protected int getMinTier() {
+ return 4;
+ }
+
+ @Override
+ protected int getBaseProgressTime() {
+ return 640;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant4.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant4.java
new file mode 100644
index 0000000000..7ba26b9500
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant4.java
@@ -0,0 +1,60 @@
+package gregtech.common.tileentities.machines.multi;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_OreDrillingPlant4 extends GT_MetaTileEntity_OreDrillingPlantBase {
+
+ public GT_MetaTileEntity_OreDrillingPlant4(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ mTier = 4;
+ }
+
+ public GT_MetaTileEntity_OreDrillingPlant4(String aName) {
+ super(aName);
+ mTier = 4;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ return createTooltip("IV");
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_OreDrillingPlant4(mName);
+ }
+
+ @Override
+ protected ItemList getCasingBlockItem() {
+ return ItemList.Casing_MiningOsmiridium;
+ }
+
+ @Override
+ protected Materials getFrameMaterial() {
+ return Materials.Osmiridium;
+ }
+
+ @Override
+ protected int getCasingTextureIndex() {
+ return 62;
+ }
+
+ @Override
+ protected int getRadiusInChunks() {
+ return 9;
+ }
+
+ @Override
+ protected int getMinTier() {
+ return 5;
+ }
+
+ @Override
+ protected int getBaseProgressTime() {
+ return 480;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java
new file mode 100644
index 0000000000..9c15d2b6eb
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java
@@ -0,0 +1,745 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_Values.TIER_COLORS;
+import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+
+import net.minecraft.block.Block;
+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.util.StatCollector;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraft.world.ChunkPosition;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.widgets.GT_LockedWhileActiveButton;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.metatileentity.IMetricsExporter;
+import gregtech.api.objects.GT_ChunkManager;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Block_Ores_Abstract;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+
+public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTileEntity_DrillerBase
+ implements IMetricsExporter {
+
+ private final List<ChunkPosition> oreBlockPositions = new ArrayList<>();
+ protected int mTier = 1;
+ private int chunkRadiusConfig = getRadiusInChunks();
+ private boolean replaceWithCobblestone = true;
+
+ /** Used to drive the remaining ores count in the UI. */
+ private int clientOreListSize = 0;
+
+ /** Used to drive the current chunk number in the UI. */
+ private int clientCurrentChunk = 0;
+
+ /** Used to drive the total chunk count in the UI. */
+ private int clientTotalChunks = 0;
+
+ /** Used to drive the drill's y-level in the UI. */
+ private int clientYHead = 0;
+
+ GT_MetaTileEntity_OreDrillingPlantBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ GT_MetaTileEntity_OreDrillingPlantBase(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("chunkRadiusConfig", chunkRadiusConfig);
+ aNBT.setBoolean("replaceWithCobblestone", replaceWithCobblestone);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("chunkRadiusConfig")) {
+ chunkRadiusConfig = aNBT.getInteger("chunkRadiusConfig");
+ }
+ if (aNBT.hasKey("replaceWithCobblestone")) {
+ replaceWithCobblestone = aNBT.getBoolean("replaceWithCobblestone");
+ }
+ }
+
+ private void adjustChunkRadius(boolean increase) {
+ if (increase) {
+ if (chunkRadiusConfig <= getRadiusInChunks()) {
+ chunkRadiusConfig++;
+ }
+ if (chunkRadiusConfig > getRadiusInChunks()) chunkRadiusConfig = 1;
+ } else {
+ if (chunkRadiusConfig > 0) {
+ chunkRadiusConfig--;
+ }
+ if (chunkRadiusConfig == 0) chunkRadiusConfig = getRadiusInChunks();
+ }
+
+ if (mCurrentChunk != null && mChunkLoadingEnabled) {
+ GT_ChunkManager.releaseChunk((TileEntity) getBaseMetaTileEntity(), mCurrentChunk);
+ }
+
+ oreBlockPositions.clear();
+ createInitialWorkingChunk();
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+
+ if (getBaseMetaTileEntity().isActive()) {
+ GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("GT5U.machines.workarea_fail"));
+ } else {
+ adjustChunkRadius(!aPlayer.isSneaking());
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.machines.workareaset") + " "
+ + GT_Utility.formatNumbers((long) chunkRadiusConfig << 4)
+ + " "
+ + StatCollector.translateToLocal("GT5U.machines.radius"));
+ }
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ replaceWithCobblestone = !replaceWithCobblestone;
+ GT_Utility.sendChatToPlayer(aPlayer, "Replace with cobblestone " + replaceWithCobblestone);
+ return true;
+ }
+
+ @Override
+ protected boolean workingDownward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe,
+ int yHead, int oldYHead) {
+ if (yHead != oldYHead) oreBlockPositions.clear();
+
+ if (mWorkChunkNeedsReload && mChunkLoadingEnabled) { // ask to load machine itself
+ GT_ChunkManager.requestChunkLoad((TileEntity) getBaseMetaTileEntity(), null);
+ mWorkChunkNeedsReload = false;
+ }
+ fillMineListIfEmpty(xDrill, yDrill, zDrill, xPipe, zPipe, yHead);
+ if (oreBlockPositions.isEmpty()) {
+ switch (tryLowerPipeState()) {
+ case 2 -> {
+ mMaxProgresstime = 0;
+ setRuntimeFailureReason(CheckRecipeResultRegistry.MISSING_MINING_PIPE);
+ return false;
+ }
+ case 3 -> {
+ workState = STATE_UPWARD;
+ return true;
+ }
+ case 1 -> {
+ workState = STATE_AT_BOTTOM;
+ return true;
+ }
+ }
+ // new layer - fill again
+ fillMineListIfEmpty(xDrill, yDrill, zDrill, xPipe, zPipe, yHead);
+ }
+ return tryProcessOreList();
+ }
+
+ private boolean tryProcessOreList() {
+ // Even though it works fine without this check,
+ // it can save tiny amount of CPU time when void protection is disabled
+ if (protectsExcessItem()) {
+ boolean simulateResult = processOreList(true);
+ if (!simulateResult) {
+ mEUt = 0;
+ mMaxProgresstime = 0;
+ return false;
+ }
+ }
+
+ boolean result = processOreList(false);
+ if (!result) {
+ mEUt = 0;
+ mMaxProgresstime = 0;
+ return false;
+ }
+ return true;
+ }
+
+ private boolean processOreList(boolean simulate) {
+ ChunkPosition oreBlockPos = null;
+ List<ChunkPosition> oreBlockPositions = simulate ? copyOreBlockPositions(this.oreBlockPositions)
+ : this.oreBlockPositions;
+ int x = 0, y = 0, z = 0;
+ Block oreBlock = null;
+ int oreBlockMetadata = 0;
+
+ while ((oreBlock == null || !GT_Utility.isOre(oreBlock, oreBlockMetadata)) && !oreBlockPositions.isEmpty()) {
+ oreBlockPos = oreBlockPositions.remove(0);
+ x = oreBlockPos.chunkPosX;
+ y = oreBlockPos.chunkPosY;
+ z = oreBlockPos.chunkPosZ;
+ if (GT_Utility.eraseBlockByFakePlayer(getFakePlayer(getBaseMetaTileEntity()), x, y, z, true))
+ oreBlock = getBaseMetaTileEntity().getBlock(x, y, z);
+ oreBlockMetadata = getBaseMetaTileEntity().getWorld()
+ .getBlockMetadata(x, y, z);
+ }
+
+ if (!tryConsumeDrillingFluid(simulate)) {
+ oreBlockPositions.add(0, oreBlockPos);
+ setRuntimeFailureReason(CheckRecipeResultRegistry.NO_DRILLING_FLUID);
+ return false;
+ }
+ if (oreBlock != null && GT_Utility.isOre(oreBlock, oreBlockMetadata)) {
+ short metaData = 0;
+ TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntity(x, y, z);
+ if (tTileEntity instanceof GT_TileEntity_Ores) {
+ metaData = ((GT_TileEntity_Ores) tTileEntity).mMetaData;
+ }
+
+ Collection<ItemStack> oreBlockDrops = getBlockDrops(oreBlock, x, y, z);
+ ItemStack cobble = GT_Utility.getCobbleForOre(oreBlock, metaData);
+ if (!simulate) {
+ if (replaceWithCobblestone) {
+ getBaseMetaTileEntity().getWorld()
+ .setBlock(x, y, z, Block.getBlockFromItem(cobble.getItem()), cobble.getItemDamage(), 3);
+ } else {
+ getBaseMetaTileEntity().getWorld()
+ .setBlockToAir(oreBlockPos.chunkPosX, oreBlockPos.chunkPosY, oreBlockPos.chunkPosZ);
+ }
+ }
+ ItemStack[] toOutput = getOutputByDrops(oreBlockDrops);
+ if (simulate && !canOutputAll(toOutput)) {
+ setRuntimeFailureReason(CheckRecipeResultRegistry.ITEM_OUTPUT_FULL);
+ return false;
+ }
+ mOutputItems = toOutput;
+ }
+ return true;
+ }
+
+ private static List<ChunkPosition> copyOreBlockPositions(List<ChunkPosition> oreBlockPositions) {
+ List<ChunkPosition> ret = new ArrayList<>();
+ for (ChunkPosition chunkPosition : oreBlockPositions) {
+ ret.add(new ChunkPosition(chunkPosition.chunkPosX, chunkPosition.chunkPosY, chunkPosition.chunkPosZ));
+ }
+ return ret;
+ }
+
+ @Override
+ protected boolean workingAtBottom(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe,
+ int yHead, int oldYHead) {
+ if (!mChunkLoadingEnabled)
+ return super.workingAtBottom(aStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead);
+
+ if (mCurrentChunk == null) {
+ createInitialWorkingChunk();
+ return true;
+ }
+
+ if (mWorkChunkNeedsReload) {
+ GT_ChunkManager.requestChunkLoad((TileEntity) getBaseMetaTileEntity(), mCurrentChunk);
+ mWorkChunkNeedsReload = false;
+ return true;
+ }
+ if (oreBlockPositions.isEmpty()) {
+ fillChunkMineList(yHead, yDrill);
+ if (oreBlockPositions.isEmpty()) {
+ GT_ChunkManager.releaseChunk((TileEntity) getBaseMetaTileEntity(), mCurrentChunk);
+ if (!moveToNextChunk(xDrill >> 4, zDrill >> 4)) workState = STATE_UPWARD;
+ return true;
+ }
+ }
+ return tryProcessOreList();
+ }
+
+ private void createInitialWorkingChunk() {
+ mCurrentChunk = getTopLeftChunkCoords();
+ if (mChunkLoadingEnabled) {
+ GT_ChunkManager.requestChunkLoad((TileEntity) getBaseMetaTileEntity(), mCurrentChunk);
+ mWorkChunkNeedsReload = false;
+ }
+ }
+
+ @NotNull
+ private ChunkCoordIntPair getTopLeftChunkCoords() {
+ return getCornerCoords(-1, -1);
+ }
+
+ @NotNull
+ private ChunkCoordIntPair getBottomRightChunkCoords() {
+ return getCornerCoords(1, 1);
+ }
+
+ @NotNull
+ private ChunkCoordIntPair getCornerCoords(int xMultiplier, int zMultiplier) {
+ final ChunkCoordIntPair drillPos = getDrillCoords();
+ // use corner closest to the drill as mining area center
+ return new ChunkCoordIntPair(
+ drillPos.chunkXPos + xMultiplier * chunkRadiusConfig
+ + ((getXDrill() - (drillPos.chunkXPos << 4)) < 8 ? 0 : 1),
+ drillPos.chunkZPos + zMultiplier * chunkRadiusConfig
+ + ((getZDrill() - (drillPos.chunkZPos << 4)) < 8 ? 0 : 1));
+ }
+
+ @NotNull
+ private ChunkCoordIntPair getDrillCoords() {
+ return new ChunkCoordIntPair(getXDrill() >> 4, getZDrill() >> 4);
+ }
+
+ private int getTotalChunkCount() {
+ final ChunkCoordIntPair topLeft = getTopLeftChunkCoords();
+ final ChunkCoordIntPair bottomRight = getBottomRightChunkCoords();
+ return (bottomRight.chunkXPos - topLeft.chunkXPos) * (bottomRight.chunkZPos - topLeft.chunkZPos);
+ }
+
+ /**
+ * Returns a number corresponding to which chunk the drill is operating on. Only really useful for driving outputs
+ * in the controller UI.
+ *
+ * @return 0 if the miner is not in operation, positive integer corresponding to the chunk currently being drilled
+ */
+ @SuppressWarnings("ExtractMethodRecommender")
+ private int getChunkNumber() {
+ if (mCurrentChunk == null) {
+ return 0;
+ }
+
+ final ChunkCoordIntPair topLeft = getTopLeftChunkCoords();
+ final ChunkCoordIntPair drillPos = getDrillCoords();
+
+ if (workState == STATE_DOWNWARD) {
+ return 1;
+ } else if (workState == STATE_UPWARD) {
+ // Technically, the miner isn't mining anything now; it's retracting the pipes in preparation to end
+ // operation.
+ return 0;
+ }
+
+ int chunkNumber = (chunkRadiusConfig * 2) * (mCurrentChunk.chunkZPos - topLeft.chunkZPos)
+ + mCurrentChunk.chunkXPos
+ - topLeft.chunkXPos
+ + 1;
+
+ // Drills mine the chunk they're in first, so if we're not there yet, bump the number to indicate that it
+ // was already mined.
+ if (mCurrentChunk.chunkZPos < drillPos.chunkZPos
+ || (mCurrentChunk.chunkZPos == drillPos.chunkZPos && mCurrentChunk.chunkXPos < drillPos.chunkXPos)) {
+ chunkNumber += 1;
+ }
+ return chunkNumber;
+ }
+
+ @Override
+ protected boolean workingUpward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe,
+ int yHead, int oldYHead) {
+ boolean result;
+ if (!mChunkLoadingEnabled || oreBlockPositions.isEmpty()) {
+ result = super.workingUpward(aStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead);
+ } else {
+ result = tryProcessOreList();
+ if (oreBlockPositions.isEmpty()) GT_ChunkManager.releaseTicket((TileEntity) getBaseMetaTileEntity());
+ }
+
+ if (!result) {
+ setShutdownReason(StatCollector.translateToLocal("GT5U.gui.text.drill_exhausted"));
+ }
+
+ return result;
+ }
+
+ @Override
+ protected void onAbort() {
+ oreBlockPositions.clear();
+ if (mCurrentChunk != null) {
+ GT_ChunkManager.releaseChunk((TileEntity) getBaseMetaTileEntity(), mCurrentChunk);
+ }
+ mCurrentChunk = null;
+ }
+
+ private boolean moveToNextChunk(int centerX, int centerZ) {
+ if (mCurrentChunk == null) return false;
+ // use corner closest to the drill as mining area center
+ final int left = centerX - chunkRadiusConfig + ((getXDrill() - (centerX << 4)) < 8 ? 0 : 1);
+ final int right = left + chunkRadiusConfig * 2;
+ final int bottom = centerZ + chunkRadiusConfig + ((getZDrill() - (centerZ << 4)) < 8 ? 0 : 1);
+
+ int nextChunkX = mCurrentChunk.chunkXPos + 1;
+ int nextChunkZ = mCurrentChunk.chunkZPos;
+
+ // step to the next chunk
+ if (nextChunkX >= right) {
+ nextChunkX = left;
+ ++nextChunkZ;
+ }
+ // skip center chunk - dug in workingDownward()
+ if (nextChunkX == centerX && nextChunkZ == centerZ) {
+ ++nextChunkX;
+
+ if (nextChunkX >= right) {
+ nextChunkX = left;
+ ++nextChunkZ;
+ }
+ }
+
+ if (nextChunkZ >= bottom) {
+ mCurrentChunk = null;
+ return false;
+ }
+ mCurrentChunk = new ChunkCoordIntPair(nextChunkX, nextChunkZ);
+ GT_ChunkManager
+ .requestChunkLoad((TileEntity) getBaseMetaTileEntity(), new ChunkCoordIntPair(nextChunkX, nextChunkZ));
+ return true;
+ }
+
+ @Override
+ protected boolean checkHatches() {
+ return !mMaintenanceHatches.isEmpty() && !mInputHatches.isEmpty()
+ && !mOutputBusses.isEmpty()
+ && !mEnergyHatches.isEmpty();
+ }
+
+ @Override
+ protected List<IHatchElement<? super GT_MetaTileEntity_DrillerBase>> getAllowedHatches() {
+ return ImmutableList.of(InputHatch, InputBus, OutputBus, Maintenance, Energy);
+ }
+
+ @Override
+ protected void setElectricityStats() {
+ this.mEfficiency = getCurrentEfficiency(null);
+ this.mEfficiencyIncrease = 10000;
+ int tier = Math.max(1, GT_Utility.getTier(getMaxInputVoltage()));
+ this.mEUt = -3 * (1 << (tier << 1));
+ this.mMaxProgresstime = calculateMaxProgressTime(tier);
+ }
+
+ private int calculateMaxProgressTime(int tier) {
+ return Math.max(
+ 1,
+ ((workState == STATE_DOWNWARD || workState == STATE_AT_BOTTOM) ? getBaseProgressTime() : 80) / (1 << tier));
+ }
+
+ private ItemStack[] getOutputByDrops(Collection<ItemStack> oreBlockDrops) {
+ long voltage = getMaxInputVoltage();
+ Collection<ItemStack> outputItems = new HashSet<>();
+ oreBlockDrops.forEach(currentItem -> {
+ if (!doUseMaceratorRecipe(currentItem)) {
+ outputItems.add(multiplyStackSize(currentItem));
+ return;
+ }
+ GT_Recipe tRecipe = RecipeMaps.maceratorRecipes
+ .findRecipe(getBaseMetaTileEntity(), false, voltage, null, currentItem);
+ if (tRecipe == null) {
+ outputItems.add(currentItem);
+ return;
+ }
+ for (int i = 0; i < tRecipe.mOutputs.length; i++) {
+ ItemStack recipeOutput = tRecipe.mOutputs[i].copy();
+ if (getBaseMetaTileEntity().getRandomNumber(10000) < tRecipe.getOutputChance(i))
+ multiplyStackSize(recipeOutput);
+ outputItems.add(recipeOutput);
+ }
+ });
+ return outputItems.toArray(new ItemStack[0]);
+ }
+
+ private boolean doUseMaceratorRecipe(ItemStack currentItem) {
+ ItemData itemData = GT_OreDictUnificator.getItemData(currentItem);
+ return itemData == null || itemData.mPrefix != OrePrefixes.crushed && itemData.mPrefix != OrePrefixes.dustImpure
+ && itemData.mPrefix != OrePrefixes.dust
+ && itemData.mPrefix != OrePrefixes.gem
+ && itemData.mPrefix != OrePrefixes.gemChipped
+ && itemData.mPrefix != OrePrefixes.gemExquisite
+ && itemData.mPrefix != OrePrefixes.gemFlawed
+ && itemData.mPrefix != OrePrefixes.gemFlawless
+ && itemData.mMaterial.mMaterial != Materials.Oilsands;
+ }
+
+ private ItemStack multiplyStackSize(ItemStack itemStack) {
+ itemStack.stackSize *= getBaseMetaTileEntity().getRandomNumber(4) + 1;
+ return itemStack;
+ }
+
+ private Collection<ItemStack> getBlockDrops(final Block oreBlock, int posX, int posY, int posZ) {
+ final int blockMeta = getBaseMetaTileEntity().getMetaID(posX, posY, posZ);
+ if (oreBlock.canSilkHarvest(getBaseMetaTileEntity().getWorld(), null, posX, posY, posZ, blockMeta)) {
+ return Collections.singleton(new ItemStack(oreBlock, 1, blockMeta));
+ }
+ if (oreBlock instanceof GT_Block_Ores_Abstract) {
+ TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntity(posX, posY, posZ);
+ if (tTileEntity instanceof GT_TileEntity_Ores && ((GT_TileEntity_Ores) tTileEntity).mMetaData >= 16000) {
+ // GT_Log.out.println("Running Small Ore");
+ return oreBlock.getDrops(getBaseMetaTileEntity().getWorld(), posX, posY, posZ, blockMeta, mTier + 3);
+ }
+ }
+ // GT_Log.out.println("Running Normal Ore");
+ return oreBlock.getDrops(getBaseMetaTileEntity().getWorld(), posX, posY, posZ, blockMeta, 0);
+ }
+
+ private boolean tryConsumeDrillingFluid(boolean simulate) {
+ return depleteInput(new FluidStack(ItemList.sDrillingFluid, 2000), simulate);
+ }
+
+ private void fillChunkMineList(int yHead, int yDrill) {
+ if (mCurrentChunk == null || !oreBlockPositions.isEmpty()) return;
+ final int minX = mCurrentChunk.chunkXPos << 4;
+ final int maxX = minX + 16;
+ final int minZ = mCurrentChunk.chunkZPos << 4;
+ final int maxZ = minZ + 16;
+ for (int x = minX; x < maxX; ++x)
+ for (int z = minZ; z < maxZ; ++z) for (int y = yHead; y < yDrill; ++y) tryAddOreBlockToMineList(x, y, z);
+ }
+
+ private void fillMineListIfEmpty(int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, int yHead) {
+ if (!oreBlockPositions.isEmpty()) return;
+
+ tryAddOreBlockToMineList(xPipe, yHead - 1, zPipe);
+ if (yHead == yDrill) return; // skip controller block layer
+
+ if (mChunkLoadingEnabled) {
+ int startX = (xDrill >> 4) << 4;
+ int startZ = (zDrill >> 4) << 4;
+ for (int x = startX; x < (startX + 16); ++x)
+ for (int z = startZ; z < (startZ + 16); ++z) tryAddOreBlockToMineList(x, yHead, z);
+ } else {
+ int radius = chunkRadiusConfig << 4;
+ for (int xOff = -radius; xOff <= radius; xOff++) for (int zOff = -radius; zOff <= radius; zOff++)
+ tryAddOreBlockToMineList(xDrill + xOff, yHead, zDrill + zOff);
+ }
+ }
+
+ private void tryAddOreBlockToMineList(int x, int y, int z) {
+ Block block = getBaseMetaTileEntity().getBlock(x, y, z);
+ int blockMeta = getBaseMetaTileEntity().getMetaID(x, y, z);
+ ChunkPosition blockPos = new ChunkPosition(x, y, z);
+ if (!oreBlockPositions.contains(blockPos)) {
+ if (block instanceof GT_Block_Ores_Abstract) {
+ TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntity(x, y, z);
+ if (tTileEntity instanceof GT_TileEntity_Ores && ((GT_TileEntity_Ores) tTileEntity).mNatural)
+ oreBlockPositions.add(blockPos);
+ } else if (GT_Utility.isOre(block, blockMeta)) oreBlockPositions.add(blockPos);
+ }
+ }
+
+ protected abstract int getRadiusInChunks();
+
+ protected abstract int getBaseProgressTime();
+
+ protected GT_Multiblock_Tooltip_Builder createTooltip(String tierSuffix) {
+ String casings = getCasingBlockItem().get(0)
+ .getDisplayName();
+
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ final int baseCycleTime = calculateMaxProgressTime(getMinTier());
+ tt.addMachineType("Miner")
+ .addInfo("Controller Block for the Ore Drilling Plant " + (tierSuffix != null ? tierSuffix : ""))
+ .addInfo("Use a Screwdriver to configure block radius")
+ .addInfo("Maximum radius is " + GT_Utility.formatNumbers((long) getRadiusInChunks() << 4) + " blocks")
+ .addInfo("Use Soldering iron to turn off chunk mode")
+ .addInfo("Use Wire Cutter to toggle replacing mined blocks with cobblestone")
+ .addInfo("In chunk mode, working area center is the chunk corner nearest to the drill")
+ .addInfo("Gives ~3x as much crushed ore vs normal processing")
+ .addInfo("Fortune bonus of " + GT_Utility.formatNumbers(mTier + 3) + ". Only works on small ores")
+ .addInfo("Minimum energy hatch tier: " + TIER_COLORS[getMinTier()] + VN[getMinTier()])
+ .addInfo(
+ "Base cycle time: " + (baseCycleTime < 20 ? GT_Utility.formatNumbers(baseCycleTime) + " ticks"
+ : GT_Utility.formatNumbers(baseCycleTime / 20) + " seconds"))
+ .addSeparator()
+ .beginStructureBlock(3, 7, 3, false)
+ .addController("Front bottom")
+ .addOtherStructurePart(casings, "form the 3x1x3 Base")
+ .addOtherStructurePart(casings, "1x3x1 pillar above the center of the base (2 minimum total)")
+ .addOtherStructurePart(getFrameMaterial().mName + " Frame Boxes", "Each pillar's side and 1x3x1 on top")
+ .addEnergyHatch(VN[getMinTier()] + "+, Any base casing", 1)
+ .addMaintenanceHatch("Any base casing", 1)
+ .addInputBus("Mining Pipes, optional, any base casing", 1)
+ .addInputHatch("Drilling Fluid, any base casing", 1)
+ .addOutputBus("Any base casing", 1)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ @Override
+ protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) {
+ super.drawTexts(screenElements, inventorySlot);
+ screenElements
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> EnumChatFormatting.GRAY + StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.drill_ores_left_chunk",
+ numberFormat.format(clientOreListSize)))
+ .setTextAlignment(Alignment.CenterLeft)
+ .setEnabled(
+ widget -> getBaseMetaTileEntity().isActive() && clientOreListSize > 0
+ && workState == STATE_AT_BOTTOM))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> EnumChatFormatting.GRAY + StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.drill_ores_left_layer",
+ numberFormat.format(clientYHead),
+ numberFormat.format(clientOreListSize)))
+ .setTextAlignment(Alignment.CenterLeft)
+ .setEnabled(
+ widget -> getBaseMetaTileEntity().isActive() && clientYHead > 0 && workState == STATE_DOWNWARD))
+ .widget(
+ new TextWidget()
+ .setStringSupplier(
+ () -> EnumChatFormatting.GRAY + StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.drill_chunks_left",
+ numberFormat.format(clientCurrentChunk),
+ numberFormat.format(clientTotalChunks)))
+ .setTextAlignment(Alignment.CenterLeft)
+ .setEnabled(
+ widget -> getBaseMetaTileEntity().isActive() && clientCurrentChunk > 0
+ && workState == STATE_AT_BOTTOM))
+ .widget(new FakeSyncWidget.IntegerSyncer(oreBlockPositions::size, (newInt) -> clientOreListSize = newInt))
+ .widget(new FakeSyncWidget.IntegerSyncer(this::getTotalChunkCount, (newInt) -> clientTotalChunks = newInt))
+ .widget(new FakeSyncWidget.IntegerSyncer(this::getChunkNumber, (newInt) -> clientCurrentChunk = newInt))
+ .widget(new FakeSyncWidget.IntegerSyncer(() -> workState, (newInt) -> workState = newInt))
+ .widget(new FakeSyncWidget.IntegerSyncer(this::getYHead, (newInt) -> clientYHead = newInt));
+ }
+
+ @Override
+ protected List<ButtonWidget> getAdditionalButtons(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ return ImmutableList.of(
+ (ButtonWidget) new GT_LockedWhileActiveButton(this.getBaseMetaTileEntity(), builder)
+ .setOnClick((clickData, widget) -> adjustChunkRadius(clickData.mouseButton == 0))
+ .setPlayClickSound(true)
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_WORK_AREA)
+ .attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(() -> chunkRadiusConfig, (val) -> chunkRadiusConfig = val),
+ builder,
+ (widget, val) -> widget.notifyTooltipChange())
+ .dynamicTooltip(
+ () -> ImmutableList.of(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.gui.button.ore_drill_radius_1",
+ GT_Utility.formatNumbers((long) chunkRadiusConfig << 4)),
+ StatCollector.translateToLocal("GT5U.gui.button.ore_drill_radius_2")))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setSize(16, 16),
+ (ButtonWidget) new GT_LockedWhileActiveButton(this.getBaseMetaTileEntity(), builder)
+ .setOnClick((clickData, widget) -> replaceWithCobblestone = !replaceWithCobblestone)
+ .setPlayClickSound(true)
+ .setBackground(() -> {
+ if (replaceWithCobblestone) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED,
+ GT_UITextures.OVERLAY_BUTTON_REPLACE_COBBLE_ON };
+ }
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD,
+ GT_UITextures.OVERLAY_BUTTON_REPLACE_COBBLE_OFF };
+ })
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(
+ () -> replaceWithCobblestone,
+ (val) -> replaceWithCobblestone = val),
+ builder,
+ (widget, val) -> widget.notifyTooltipChange())
+ .dynamicTooltip(
+ () -> ImmutableList.of(
+ StatCollector.translateToLocal(
+ replaceWithCobblestone ? "GT5U.gui.button.ore_drill_cobblestone_on"
+ : "GT5U.gui.button.ore_drill_cobblestone_off")))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setSize(16, 16));
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_MINER_OP;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ final String diameter = GT_Utility.formatNumbers(chunkRadiusConfig * 2L);
+ return new String[] {
+ EnumChatFormatting.BLUE + StatCollector.translateToLocal("GT5U.machines.minermulti")
+ + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.machines.workarea") + ": "
+ + EnumChatFormatting.GREEN
+ + diameter
+ + "x"
+ + diameter
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.machines.chunks") };
+ }
+
+ @Override
+ public @NotNull List<String> reportMetrics() {
+ if (getBaseMetaTileEntity().isActive()) {
+ return switch (workState) {
+ case STATE_AT_BOTTOM -> ImmutableList.of(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.drill_ores_left_chunk",
+ GT_Utility.formatNumbers(oreBlockPositions.size())),
+ StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.drill_chunks_left",
+ GT_Utility.formatNumbers(getChunkNumber()),
+ GT_Utility.formatNumbers(getTotalChunkCount())));
+ case STATE_DOWNWARD -> ImmutableList.of(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.gui.text.drill_ores_left_layer",
+ getYHead(),
+ GT_Utility.formatNumbers(oreBlockPositions.size())));
+ case STATE_UPWARD, STATE_ABORT -> ImmutableList
+ .of(StatCollector.translateToLocal("GT5U.gui.text.retracting_pipe"));
+
+ default -> ImmutableList.of();
+ };
+ }
+
+ return ImmutableList.of(
+ getFailureReason()
+ .map(reason -> StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_offline_reason", reason))
+ .orElseGet(() -> StatCollector.translateToLocalFormatted("GT5U.gui.text.drill_offline_generic")));
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java
new file mode 100644
index 0000000000..3616baf742
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PCBFactory.java
@@ -0,0 +1,1276 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.ExoticEnergy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_Values.AuthorBlueWeabo;
+import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_ASSEMBLY_LINE_GLOW;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofFrame;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
+import com.gtnewhorizon.structurelib.alignment.enumerable.Flip;
+import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.Text;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedRow;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.GregTechTileClientEvents;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.multitileentity.multiblock.casing.Glasses;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.recipe.metadata.PCBFactoryTierKey;
+import gregtech.api.recipe.metadata.PCBFactoryUpgrade;
+import gregtech.api.recipe.metadata.PCBFactoryUpgradeKey;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gregtech.common.blocks.GT_Block_Casings8;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class GT_MetaTileEntity_PCBFactory extends
+ GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GT_MetaTileEntity_PCBFactory> implements ISurvivalConstructable {
+
+ private static final String tier1 = "tier1";
+ private static final String tier2 = "tier2";
+ private static final String tier3 = "tier3";
+ private static final String bioUpgrade = "bioUpgrade";
+ private static final String ocTier1Upgrade = "ocTier1Upgrade";
+ private static final String ocTier2Upgrade = "ocTier2Upgrade";
+ private float mRoughnessMultiplier = 1;
+ private int mTier = 1, mSetTier = 1, mUpgradesInstalled = 0, mCurrentParallel = 0, mMaxParallel = 0;
+ private boolean mBioUpgrade = false, mBioRotate = false, mOCTier1 = false, mOCTier2 = false;
+ private final int[] mBioOffsets = new int[] { -5, -1 };
+ private final int[] mOCTier1Offsets = new int[] { 2, -11 };
+ private final int[] mOCTier2Offsets = new int[] { 2, -11 };
+ private GT_MetaTileEntity_Hatch_Input mCoolantInputHatch;
+ private static final int mBioRotateBitMap = 0b1000000;
+ private static final int mOCTier2BitMap = 0b100000;
+ private static final int mOCTier1BitMap = 0b10000;
+ private static final int mBioBitMap = 0b1000;
+ private static final int mTier3BitMap = 0b100;
+ private static final int mTier2BitMap = 0b10;
+ private static final int mTier1BitMap = 0b1;
+ private static final int COOLANT_CONSUMED_PER_SEC = 10;
+ private static final IStructureDefinition<GT_MetaTileEntity_PCBFactory> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_PCBFactory>builder()
+ .addShape(
+ tier1,
+ transpose(
+ new String[][] {
+ // spotless:off
+ {" ","E E","E E","EEEEEEE","E E","E E"," "},
+ {"EEEEEEE","CAAAAAC","CAAAAAC","CCCCCCC","CCCCCCC","CCCCCCC","E E"},
+ {"EAAAAAE","C-----C","C-----C","C-----C","C-----C","C-----C","ECCCCCE"},
+ {"EAAAAAE","C-----C","B-----B","B-----B","B-----B","C-----C","ECCCCCE"},
+ {"EAAAAAE","C-----C","B-FFF-B","B-FFF-B","B-FFF-B","C-----C","EPPPPPE"},
+ {"ECC~CCE","CDDDDDC","CDDDDDC","CDDDDDC","CDDDDDC","CDDDDDC","EPPPPPE"}
+ //spotless:on
+ }))
+ .addShape(
+ tier2,
+ transpose(
+ new String[][] {
+ // spotless:off
+ {" "," "," ","HGGH","HGGH","HGGH","HGGH","HGGH"," "," "," "},
+ {" "," ","HGGH","GGGG","GGGG","GGGG","GGGG","GGGG","HGGH"," "," "},
+ {" ","HGGH","GGGG","G G","G G","G G","G G","G G","GGGG","HGGH"," "},
+ {" ","HGGH","G G","G G","G G","G G","G G","G G","G G","HGGH"," "},
+ {"HGGH","G G","G G","G G","G G","G G","G G","G G","G G","G G","HGGH"},
+ {"HGGH","G G","G G","G G","G G","G G","G G","G G","G G","G G","HGGH"},
+ {"HGGH","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","GGGG","HGGH"}
+ //spotless:on
+ }))
+ .addShape(
+ tier3,
+ transpose(
+ new String[][] {
+ // spotless:off
+ {" "," "," "," "," I "," I "," "," "," "," "},
+ {" "," "," "," I "," I "," I "," I "," "," "," "},
+ {" "," "," KKK "," KIK "," K K "," K K "," I "," "," "," "},
+ {" "," "," KKK "," K K "," K K "," K K "," I "," "," "," "},
+ {" "," III "," I I "," I I "," I I "," K K "," I "," "," "," "},
+ {" "," III "," I I "," I I "," I I "," K K "," I "," "," "," "},
+ {" "," III "," I I "," I I "," I I "," K K "," KIK "," "," "," "},
+ {" "," I I "," I K I "," I I "," I I "," K K "," KIK "," "," "," "},
+ {" "," I I "," I K I "," I I "," I I "," K K "," K K "," KKK "," "," "},
+ {" "," I I "," I K I "," I I "," I I "," K K "," K K "," KKK "," "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" "," III "," I I "," K K "," K K "," K K "," K K "," I I "," III "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" "," "," KKK "," K K "," K K "," I I "," I I "," I I "," III "," "},
+ {" "," "," KKK "," K K "," K K "," I I "," I I "," I I "," III "," "},
+ {" "," "," KKK "," K K "," K K "," I I "," I I "," I I "," III "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" "," III "," I I "," I I "," I I "," I I "," I I "," I I "," III "," "},
+ {" II~II ","IIJJJII","IJJJJJI","IJJJJJI","IJJJJJI","IJJJJJI","IJJJJJI","IJJJJJI","IIJJJII"," IIIII "}
+ //spotless:on
+ }))
+ .addShape(
+ bioUpgrade,
+ transpose(
+ new String[][] {
+ // spotless:off
+ {" "," "," LLLLLL "," "," "},
+ {" "," "," L L "," "," "},
+ {"E E E E"," LLL LLL "," LLL LLL "," LLL LLL ","E E E E"},
+ {"EAAAE EAAAE","A A A A","A A A A","A A A A","EAAAE EAAAE"},
+ {"EAAAE EAAAE","A A A A","A A A A","A A A A","EAAAE EAAAE"},
+ {"EAAAE EAAAE","A A A A","A A A A","A A A A","EAAAE EAAAE"},
+ {"ELLLE ELLLE","LLLLL LLLLL","LLLLL LLLLL","LLLLL LLLLL","ELLLE ELLLE"}
+ //spotless:on
+ }))
+ .addShape(
+ ocTier1Upgrade,
+ transpose(
+ new String[][] {
+ // spotless:off
+ {"EKKKE","K K","K K","K K","EKKKE"},
+ {"E E"," KKK "," K K "," KKK ","E E"},
+ {"E E"," NNN "," N N "," NNN ","E E"},
+ {"E E"," KKK "," K K "," KKK ","E E"},
+ {"E E"," KKK "," K K "," KKK ","E E"},
+ {"EOOOE","OKKKO","OK KO","OKKKO","EOOOE"},
+ {"E E"," KKK "," K K "," KKK ","E E"},
+ {"E E"," KKK "," K K "," KKK ","E E"},
+ {"ENNNE","NKKKN","NK KN","NKKKN","ENNNE"},
+ {"EGGGE","GGGGG","GGMGG","GGGGG","EGGGE"}
+ //spotless:on
+ }))
+ .addShape(
+ ocTier2Upgrade,
+ transpose(
+ new String[][] {
+ // spotless:off
+ {"RGGGR","G G","G G","G G","RGGGR"},
+ {"R R"," GGG "," GTG "," GGG ","R R"},
+ {"R R"," NNN "," NTN "," NNN ","R R"},
+ {"R R"," QQQ "," QTQ "," QQQ ","R R"},
+ {"R R"," QQQ "," QTQ "," QQQ ","R R"},
+ {"R R"," QQQ "," QTQ "," QQQ ","R R"},
+ {"R R"," QQQ "," QTQ "," QQQ ","R R"},
+ {"R R"," QQQ "," QTQ "," QQQ ","R R"},
+ {"RNNNR","NQQQN","NQTQN","NQQQN","RNNNR"},
+ {"RGGGR","GGGGG","GGSGG","GGGGG","RGGGR"}
+ //spotless:on
+ }))
+ .addElement('E', ofFrame(Materials.DamascusSteel))
+ .addElement('C', ofBlock(GregTech_API.sBlockCasings8, 11))
+ .addElement('D', ofBlock(GregTech_API.sBlockReinforced, 2))
+ .addElement('A', Glasses.chainAllGlasses())
+ .addElement('B', ofBlock(GregTech_API.sBlockCasings3, 10))
+ .addElement('F', ofFrame(Materials.VibrantAlloy))
+ .addElement(
+ 'P',
+ buildHatchAdder(GT_MetaTileEntity_PCBFactory.class)
+ .atLeast(InputHatch, OutputBus, InputBus, Maintenance, Energy.or(ExoticEnergy))
+ .dot(1)
+ .casingIndex(((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(11))
+ .buildAndChain(GregTech_API.sBlockCasings8, 11))
+ .addElement('H', ofFrame(Materials.Duranium))
+ .addElement('G', ofBlock(GregTech_API.sBlockCasings8, 12))
+ .addElement('I', ofBlock(GregTech_API.sBlockCasings8, 13))
+ .addElement('K', ofBlock(GregTech_API.sBlockCasings8, 10))
+ .addElement(
+ 'J',
+ buildHatchAdder(GT_MetaTileEntity_PCBFactory.class)
+ .atLeast(InputHatch, OutputBus, InputBus, Maintenance, Energy.or(ExoticEnergy))
+ .dot(1)
+ .casingIndex(((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(13))
+ .buildAndChain(GregTech_API.sBlockCasings8, 13))
+ .addElement('L', ofBlock(GregTech_API.sBlockCasings4, 1))
+ .addElement(
+ 'M',
+ buildHatchAdder(GT_MetaTileEntity_PCBFactory.class).hatchClass(GT_MetaTileEntity_Hatch_Input.class)
+ .adder(GT_MetaTileEntity_PCBFactory::addCoolantInputToMachineList)
+ .casingIndex(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 12))
+ .dot(2)
+ .buildAndChain(GregTech_API.sBlockCasings8, 12))
+ .addElement('N', ofBlock(GregTech_API.sBlockCasings2, 15))
+ .addElement('O', ofBlock(GregTech_API.sBlockCasings8, 4))
+ .addElement(
+ 'S',
+ buildHatchAdder(GT_MetaTileEntity_PCBFactory.class).hatchClass(GT_MetaTileEntity_Hatch_Input.class)
+ .adder(GT_MetaTileEntity_PCBFactory::addCoolantInputToMachineList)
+ .casingIndex(GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 12))
+ .dot(2)
+ .buildAndChain(GregTech_API.sBlockCasings8, 12))
+ .addElement('R', ofFrame(Materials.Americium))
+ .addElement('Q', ofBlock(GregTech_API.sBlockCasings8, 14))
+ .addElement('T', ofBlock(GregTech_API.sBlockCasings1, 15))
+ .build();
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ if (mSetTier < 3) {
+ buildPiece(tier1, stackSize, hintsOnly, 3, 5, 0);
+ if (mSetTier == 2) {
+ buildPiece(tier2, stackSize, hintsOnly, 7, 6, 2);
+ }
+ } else {
+ buildPiece(tier3, stackSize, hintsOnly, 3, 21, 0);
+ }
+
+ if (mBioUpgrade) {
+ if (mBioRotate) {
+ final IGregTechTileEntity tTile = getBaseMetaTileEntity();
+ getStructureDefinition().buildOrHints(
+ this,
+ stackSize,
+ bioUpgrade,
+ tTile.getWorld(),
+ transformFacing(getExtendedFacing()),
+ tTile.getXCoord(),
+ tTile.getYCoord(),
+ tTile.getZCoord(),
+ mBioOffsets[1],
+ 6,
+ mBioOffsets[0],
+ hintsOnly);
+ } else {
+ buildPiece(bioUpgrade, stackSize, hintsOnly, mBioOffsets[0], 6, mBioOffsets[1]);
+ }
+ }
+
+ if (mOCTier1 && !mOCTier2) {
+ buildPiece(ocTier1Upgrade, stackSize, hintsOnly, mOCTier1Offsets[0], 9, mOCTier1Offsets[1]);
+ }
+
+ if (!mOCTier1 && mOCTier2) {
+ buildPiece(ocTier2Upgrade, stackSize, hintsOnly, mOCTier2Offsets[0], 9, mOCTier2Offsets[1]);
+ }
+ }
+
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int built = 0;
+ if (mSetTier < 3) {
+ built += survivialBuildPiece(tier1, stackSize, 3, 5, 0, elementBudget, env, false, true);
+ if (mSetTier == 2) {
+ built += survivialBuildPiece(tier2, stackSize, 7, 6, 2, elementBudget, env, false, true);
+ }
+ } else {
+ built += survivialBuildPiece(tier3, stackSize, 3, 21, 0, elementBudget, env, false, true);
+ }
+
+ if (mBioUpgrade) {
+ if (mBioRotate) {
+ final IGregTechTileEntity tTile = getBaseMetaTileEntity();
+ getStructureDefinition().survivalBuild(
+ this,
+ stackSize,
+ bioUpgrade,
+ tTile.getWorld(),
+ transformFacing(getExtendedFacing()),
+ tTile.getXCoord(),
+ tTile.getYCoord(),
+ tTile.getZCoord(),
+ mBioOffsets[1],
+ 6,
+ mBioOffsets[0],
+ elementBudget,
+ env,
+ false);
+ } else {
+ built += survivialBuildPiece(
+ bioUpgrade,
+ stackSize,
+ mBioOffsets[0],
+ 6,
+ mBioOffsets[1],
+ elementBudget,
+ env,
+ false,
+ true);
+ }
+ }
+
+ if (mOCTier1 && !mOCTier2) {
+ built += survivialBuildPiece(
+ ocTier1Upgrade,
+ stackSize,
+ mOCTier1Offsets[0],
+ 9,
+ mOCTier1Offsets[1],
+ elementBudget,
+ env,
+ false,
+ true);
+ }
+ if (!mOCTier1 && mOCTier2) {
+ built += survivialBuildPiece(
+ ocTier2Upgrade,
+ stackSize,
+ mOCTier2Offsets[0],
+ 9,
+ mOCTier2Offsets[1],
+ elementBudget,
+ env,
+ false,
+ true);
+ }
+
+ return built;
+ }
+
+ public GT_MetaTileEntity_PCBFactory(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_PCBFactory(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_PCBFactory(this.mName);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ if (sideDirection == facingDirection) {
+ if (active)
+ return new ITexture[] {
+ BlockIcons.getCasingTextureForId(
+ getTier() < 3 ? GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 11)
+ : GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 13)),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] {
+ BlockIcons.getCasingTextureForId(
+ getTier() < 3 ? GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 11)
+ : GT_Utility.getCasingTextureIndex(GregTech_API.sBlockCasings8, 13)),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ASSEMBLY_LINE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { BlockIcons.getCasingTextureForId(
+ mSetTier < 3 ? ((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(11)
+ : ((GT_Block_Casings8) GregTech_API.sBlockCasings8).getTextureIndex(13)) };
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_PCBFactory> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mTier = 0;
+ mUpgradesInstalled = 0;
+ mCoolantInputHatch = null;
+ if (mSetTier < 3) {
+ if (!checkPiece(tier1, 3, 5, 0)) {
+ return false;
+ }
+ if (mSetTier == 2) {
+ if (!checkPiece(tier2, 7, 6, 2)) {
+ return false;
+ }
+ mTier = 2;
+ } else {
+ mTier = 1;
+ }
+ } else {
+ if (!checkPiece(tier3, 3, 21, 0)) {
+ return false;
+ }
+ mTier = 3;
+ }
+
+ if (mBioUpgrade) {
+ if (mBioRotate) {
+ final IGregTechTileEntity tTile = getBaseMetaTileEntity();
+ if (!getStructureDefinition().check(
+ this,
+ bioUpgrade,
+ tTile.getWorld(),
+ transformFacing(getExtendedFacing()),
+ tTile.getXCoord(),
+ tTile.getYCoord(),
+ tTile.getZCoord(),
+ mBioOffsets[1],
+ 6,
+ mBioOffsets[0],
+ !mMachine)) {
+ return false;
+ }
+ } else {
+ if (!checkPiece(bioUpgrade, mBioOffsets[0], 6, mBioOffsets[1])) {
+ return false;
+ }
+ }
+ mUpgradesInstalled++;
+ }
+
+ if (mOCTier1 && !mOCTier2) {
+ if (!checkPiece(ocTier1Upgrade, mOCTier1Offsets[0], 9, mOCTier1Offsets[1])) {
+ return false;
+ }
+ if (mCoolantInputHatch == null) {
+ return false;
+ }
+ mUpgradesInstalled++;
+ }
+
+ if (mOCTier2 && !mOCTier1) {
+ if (!checkPiece(ocTier2Upgrade, mOCTier2Offsets[0], 9, mOCTier2Offsets[1])) {
+ return false;
+ }
+ if (mCoolantInputHatch == null) {
+ return false;
+ }
+ mUpgradesInstalled++;
+ }
+
+ getBaseMetaTileEntity().sendBlockEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, getUpdateData());
+
+ if (mMaintenanceHatches.size() != 1) {
+ return false;
+ }
+
+ if (!checkExoticAndNormalEnergyHatches()) {
+ return false;
+ }
+
+ return mTier > 0;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.pcbFactoryRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ // Here we check the dynamic parallels, which depend on the recipe
+ int numberOfNanites = 0;
+ ItemStack aNanite = recipe.getRepresentativeInput(1);
+ ItemData naniteData = GT_OreDictUnificator.getAssociation(aNanite);
+ if (naniteData != null && naniteData.mPrefix != null && naniteData.mPrefix.equals(OrePrefixes.nanite)) {
+ for (ItemStack aItem : inputItems) {
+ if (aItem != null && aItem.isItemEqual(aNanite)) {
+ numberOfNanites += aItem.stackSize;
+ }
+ }
+ }
+ maxParallel = (int) Math.max(Math.ceil(Math.log(numberOfNanites) / Math.log(2) + 0.00001), 1);
+ mMaxParallel = maxParallel;
+
+ PCBFactoryUpgrade requiredUpgrade = recipe.getMetadata(PCBFactoryUpgradeKey.INSTANCE);
+ if (requiredUpgrade == PCBFactoryUpgrade.BIO && !mBioUpgrade)
+ return SimpleCheckRecipeResult.ofFailure("bio_upgrade_missing");
+
+ int requiredPCBTier = recipe.getMetadataOrDefault(PCBFactoryTierKey.INSTANCE, 1);
+ if (requiredPCBTier > mTier) return CheckRecipeResultRegistry.insufficientMachineTier(requiredPCBTier);
+
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setNoOverclock(isNoOC())
+ .setEUtDiscount((float) Math.sqrt(mUpgradesInstalled == 0 ? 1 : mUpgradesInstalled))
+ .setSpeedBoost(getDurationMultiplierFromRoughness())
+ .setDurationDecreasePerOC(mOCTier2 ? 2 : 1);
+ }
+
+ @Nonnull
+ @Override
+ protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) {
+ return super.createParallelHelper(recipe)
+ .setEUtModifier((float) Math.sqrt(mUpgradesInstalled == 0 ? 1 : mUpgradesInstalled))
+ .setChanceMultiplier(mRoughnessMultiplier);
+ }
+ };
+ }
+
+ private boolean isNoOC() {
+ return !mOCTier1 && !mOCTier2;
+ }
+
+ private float getDurationMultiplierFromRoughness() {
+ return (float) Math.pow(mRoughnessMultiplier, 2);
+ }
+
+ private int ticker = 0;
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (!super.onRunningTick(aStack)) {
+ return false;
+ }
+
+ if (ticker % 20 == 0) {
+ if (!isNoOC()) {
+ FluidStack tFluid = mOCTier1 ? GT_ModHandler.getDistilledWater(COOLANT_CONSUMED_PER_SEC)
+ : Materials.SuperCoolant.getFluid(COOLANT_CONSUMED_PER_SEC);
+ if (!drain(mCoolantInputHatch, tFluid, true)) {
+ stopMachine(ShutDownReasonRegistry.outOfFluid(tFluid));
+ return false;
+ }
+ }
+ ticker = 0;
+ }
+
+ ticker++;
+
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+ // TODO: Look for proper fix
+ // Updates every 10 sec
+ if (mUpdate <= -150) mUpdate = 50;
+ }
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return (int) (10000f * mRoughnessMultiplier);
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ private int getTier() {
+ return mSetTier;
+ }
+
+ @Override
+ public void receiveClientEvent(byte aEventID, byte aValue) {
+ if (aEventID == 1) {
+ if ((aValue & mTier1BitMap) == mTier1BitMap) {
+ mSetTier = 1;
+ }
+
+ if ((aValue & mTier2BitMap) == mTier2BitMap) {
+ mSetTier = 2;
+ }
+
+ if ((aValue & mTier3BitMap) == mTier3BitMap) {
+ mSetTier = 3;
+ }
+
+ if ((aValue & mBioBitMap) == mBioBitMap) {
+ mBioUpgrade = true;
+ }
+
+ if ((aValue & mBioRotateBitMap) == mBioRotateBitMap) {
+ mBioRotate = true;
+ }
+
+ if ((aValue & mOCTier1BitMap) == mOCTier1BitMap) {
+ mOCTier1 = true;
+ }
+
+ if ((aValue & mOCTier2BitMap) == mOCTier2BitMap) {
+ mOCTier2 = true;
+ }
+ }
+ }
+
+ private ExtendedFacing transformFacing(ExtendedFacing facing) {
+ ForgeDirection curDirection = facing.getDirection();
+ Rotation curRotation = facing.getRotation();
+ Flip curFlip = facing.getFlip();
+ ForgeDirection newDirection = curDirection;
+ Rotation newRotation = curRotation;
+ Flip newFlip = curFlip;
+
+ if (curDirection == ForgeDirection.UP || curDirection == ForgeDirection.DOWN) {
+ switch (curRotation) {
+ case CLOCKWISE, COUNTER_CLOCKWISE -> {
+ newFlip = curFlip == Flip.NONE ? Flip.HORIZONTAL : Flip.NONE;
+ newDirection = curDirection == ForgeDirection.UP ? ForgeDirection.NORTH : ForgeDirection.SOUTH;
+ }
+ case NORMAL -> {
+ newRotation = curDirection == ForgeDirection.UP ? Rotation.CLOCKWISE : Rotation.COUNTER_CLOCKWISE;
+ newDirection = curDirection == ForgeDirection.UP ? ForgeDirection.EAST : ForgeDirection.WEST;
+ newFlip = Flip.NONE;
+ }
+ case UPSIDE_DOWN -> {
+ newRotation = curDirection == ForgeDirection.UP ? Rotation.COUNTER_CLOCKWISE : Rotation.CLOCKWISE;
+ newDirection = curDirection == ForgeDirection.UP ? ForgeDirection.EAST : ForgeDirection.WEST;
+ newFlip = Flip.NONE;
+ }
+ }
+ } else if (curRotation == Rotation.CLOCKWISE || curRotation == Rotation.COUNTER_CLOCKWISE) {
+ newFlip = curRotation == Rotation.CLOCKWISE ? curFlip == Flip.NONE ? Flip.NONE : Flip.HORIZONTAL
+ : curFlip != Flip.NONE ? Flip.NONE : Flip.HORIZONTAL;
+ newDirection = curRotation == Rotation.CLOCKWISE ? ForgeDirection.UP : ForgeDirection.DOWN;
+ } else {
+ newDirection = switch (curDirection) {
+ case EAST -> ForgeDirection.SOUTH;
+ case NORTH -> ForgeDirection.EAST;
+ case WEST -> ForgeDirection.NORTH;
+ case SOUTH -> ForgeDirection.WEST;
+ default -> curDirection;
+ };
+ }
+
+ if (curRotation == Rotation.UPSIDE_DOWN) {
+ if (curDirection != ForgeDirection.UP && curDirection != ForgeDirection.DOWN) {
+ newFlip = curFlip == Flip.NONE ? Flip.HORIZONTAL : Flip.NONE;
+ }
+ }
+
+ return ExtendedFacing.of(newDirection, newRotation, newFlip);
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ public boolean addCoolantInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = null;
+ mCoolantInputHatch = (GT_MetaTileEntity_Hatch_Input) aMetaTileEntity;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected long getActualEnergyUsage() {
+ return (-this.lEUt * 10000) / Math.min(Math.max(1000, mEfficiency), 10000);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ inputSeparation = !inputSeparation;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation);
+ }
+
+ @Override
+ public String[] getInfoData() {
+ int mPollutionReduction = 0;
+ for (GT_MetaTileEntity_Hatch_Muffler tHatch : filterValidMTEs(mMufflerHatches)) {
+ mPollutionReduction = Math.max(tHatch.calculatePollutionReduction(100), mPollutionReduction);
+ }
+
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : getExoticAndNormalEnergyHatchList()) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+ long voltage = getAverageInputVoltage();
+ long amps = getMaxInputAmps();
+
+ return new String[] {
+ /* 1 */ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s",
+ /* 2 */ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ /* 3 */ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(getActualEnergyUsage())
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ /* 4 */ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(voltage)
+ + EnumChatFormatting.RESET
+ + " EU/t(*"
+ + amps
+ + " A)"
+ + StatCollector.translateToLocal("GT5U.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + VN[GT_Utility.getTier(voltage)]
+ + EnumChatFormatting.RESET,
+ /* 5 */ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": "
+ + EnumChatFormatting.RED
+ + (getIdealStatus() - getRepairStatus())
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.multiblock.efficiency")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + mEfficiency / 100.0F
+ + EnumChatFormatting.RESET
+ + " %",
+ /* 6 */ StatCollector.translateToLocal("GT5U.multiblock.pollution") + ": "
+ + EnumChatFormatting.GREEN
+ + mPollutionReduction
+ + EnumChatFormatting.RESET
+ + " %",
+ /* 7 */ StatCollector.translateToLocal("GT5U.multiblock.parallelism") + ": "
+ + EnumChatFormatting.GREEN
+ + mMaxParallel,
+ /* 8 */ StatCollector.translateToLocal("GT5U.multiblock.curparallelism") + ": "
+ + EnumChatFormatting.GREEN
+ + mCurrentParallel };
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Circuit Board Fabricator")
+ .addInfo("Controller for the PCB Factory")
+ .addInfo(
+ EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD
+ + "IMPORTANT!"
+ + " Check the configuration menu before building.")
+ .addInfo("Tier of the machine determines the available recipes.")
+ .addInfo("Machine tier (1-3) is set in the controller GUI.")
+ .addInfo("The configuration menu can be used to add upgrades.")
+ .addInfo("Each tier and upgrade requires additional structures.")
+ .addInfo("Power consumption is multiplied by Sqrt(structures).")
+ .addInfo("Tier 2 and 3 allow parallel by using extra nanites.")
+ .addInfo("Every doubling of nanites adds one parallel.")
+ .addInfo("1x->1, 2x->2, 4x->3, 8x->4 with no limit.")
+ .addInfo("Recipes require a cooling upgrade to be overclocked.")
+ .addInfo("Liquid Cooling uses 10 L/s of distilled water and enables default overclocks.")
+ .addInfo("Thermosink uses 10 L/s of Super Coolant and enables perfect overclocks.")
+ .addInfo("Trace size can be changed to modify the material usage and machine speed.")
+ .addInfo(AuthorBlueWeabo)
+ .beginStructureBlock(30, 38, 13, false)
+ .addSeparator()
+ .addMaintenanceHatch(EnumChatFormatting.GOLD + "1", 1)
+ .addEnergyHatch(
+ EnumChatFormatting.GOLD + "1"
+ + EnumChatFormatting.GRAY
+ + "-"
+ + EnumChatFormatting.GOLD
+ + "2"
+ + EnumChatFormatting.GRAY
+ + " or "
+ + EnumChatFormatting.GOLD
+ + "1"
+ + EnumChatFormatting.GRAY
+ + " TT energy hatch.",
+ 1)
+ .addInputBus(EnumChatFormatting.GOLD + "0" + EnumChatFormatting.GRAY + "+", 1)
+ .addOutputBus(EnumChatFormatting.GOLD + "0" + EnumChatFormatting.GRAY + "+", 1)
+ .addInputHatch(EnumChatFormatting.GOLD + "0" + EnumChatFormatting.GRAY + "+", 1)
+ .addStructureInfo(
+ "Coolant Hatch (Input Hatch): " + EnumChatFormatting.GOLD
+ + "1"
+ + EnumChatFormatting.GRAY
+ + " Center of the Liquid Cooling/Thermosink")
+ .addStructureInfo(
+ EnumChatFormatting.BLUE + "Base Multi (Tier "
+ + EnumChatFormatting.DARK_PURPLE
+ + 1
+ + EnumChatFormatting.BLUE
+ + "):")
+ .addStructureInfo(EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Damascus Steel Frame Box")
+ .addStructureInfo(EnumChatFormatting.GOLD + "9" + EnumChatFormatting.GRAY + " Vibrant Alloy Frame Box")
+ .addStructureInfo(EnumChatFormatting.GOLD + "25" + EnumChatFormatting.GRAY + " Reinforced Glass")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "77" + EnumChatFormatting.GRAY + " Basic Photolithography Framework Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "12" + EnumChatFormatting.GRAY + " Grate Machine Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "25" + EnumChatFormatting.GRAY + " Plascrete Block")
+ .addStructureInfo(
+ EnumChatFormatting.BLUE + "Tier "
+ + EnumChatFormatting.DARK_PURPLE
+ + 2
+ + EnumChatFormatting.BLUE
+ + " (Adds to Tier "
+ + EnumChatFormatting.DARK_PURPLE
+ + 1
+ + EnumChatFormatting.BLUE
+ + "):")
+ .addStructureInfo(EnumChatFormatting.GOLD + "34" + EnumChatFormatting.GRAY + " Duranium Frame Box")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "158"
+ + EnumChatFormatting.GRAY
+ + " Reinforced Photolithography Framework Casing")
+ .addStructureInfo(
+ EnumChatFormatting.BLUE + "Tier " + EnumChatFormatting.DARK_PURPLE + 3 + EnumChatFormatting.BLUE + ":")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "292"
+ + EnumChatFormatting.GRAY
+ + " Radiation Proof Photolithography Framework Casing")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "76" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing")
+ .addStructureInfo(EnumChatFormatting.BLUE + "Biochamber Upgrade")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "68" + EnumChatFormatting.GRAY + " Clean Stainless Steel Machine Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Damascus Steel Frame Box")
+ .addStructureInfo(EnumChatFormatting.GOLD + "72" + EnumChatFormatting.GRAY + " Reinforced Glass")
+ .addStructureInfo(
+ EnumChatFormatting.BLUE + "Liquid Cooling Tower (Tier "
+ + EnumChatFormatting.DARK_PURPLE
+ + 1
+ + EnumChatFormatting.BLUE
+ + "):")
+ .addStructureInfo(EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Damascus Steel Frame Box")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "68" + EnumChatFormatting.GRAY + " Radiant Naquadah Alloy Casing")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "12" + EnumChatFormatting.GRAY + " Extreme Engine Intake Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "20" + EnumChatFormatting.GRAY + " Tungstensteel Pipe Casing")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "21"
+ + EnumChatFormatting.GRAY
+ + " Reinforced Photolithography Framework Casing")
+ .addStructureInfo(
+ EnumChatFormatting.BLUE + "Thermosink Radiator(Tier "
+ + EnumChatFormatting.DARK_PURPLE
+ + 2
+ + EnumChatFormatting.BLUE
+ + "):")
+ .addStructureInfo(EnumChatFormatting.GOLD + "40" + EnumChatFormatting.GRAY + " Americium Frame Box")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "41"
+ + EnumChatFormatting.GRAY
+ + " Reinforced Photolithography Framework Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "8" + EnumChatFormatting.GRAY + " Superconducting Coil Block")
+ .addStructureInfo(EnumChatFormatting.GOLD + "20" + EnumChatFormatting.GRAY + " Tungstensteel Pipe Casing")
+ .addStructureInfo(EnumChatFormatting.GOLD + "48" + EnumChatFormatting.GRAY + " Infinity Cooled Casing")
+ .toolTipFinisher("GregTech");
+ return tt;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mBioUpgrade", mBioUpgrade);
+ aNBT.setBoolean("mBioRotate", mBioRotate);
+ aNBT.setInteger("mBioOffsetX", mBioOffsets[0]);
+ aNBT.setInteger("mBioOffsetZ", mBioOffsets[1]);
+ aNBT.setBoolean("mOCTier1Upgrade", mOCTier1);
+ aNBT.setInteger("mOCTier1OffsetX", mOCTier1Offsets[0]);
+ aNBT.setInteger("mOCTier1OffsetZ", mOCTier1Offsets[1]);
+ aNBT.setBoolean("mOCTier2Upgrade", mOCTier2);
+ aNBT.setInteger("mOCTier2OffsetX", mOCTier2Offsets[0]);
+ aNBT.setInteger("mOCTier2OffsetZ", mOCTier2Offsets[1]);
+ aNBT.setFloat("mRoughnessMultiplier", mRoughnessMultiplier);
+ aNBT.setInteger("mSetTier", mSetTier);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("mSeparate")) {
+ // backward compatibility
+ inputSeparation = aNBT.getBoolean("mSeparate");
+ }
+ mBioUpgrade = aNBT.getBoolean("mBioUpgrade");
+ mBioRotate = aNBT.getBoolean("mBioRotate");
+ mBioOffsets[0] = aNBT.getInteger("mBioOffsetX");
+ mBioOffsets[1] = aNBT.getInteger("mBioOffsetZ");
+ mOCTier1 = aNBT.getBoolean("mOCTier1Upgrade");
+ mOCTier1Offsets[0] = aNBT.getInteger("mOCTier1OffsetX");
+ mOCTier1Offsets[1] = aNBT.getInteger("mOCTier1OffsetZ");
+ mOCTier2 = aNBT.getBoolean("mOCTier2Upgrade");
+ mOCTier2Offsets[0] = aNBT.getInteger("mOCTier2OffsetX");
+ mOCTier2Offsets[1] = aNBT.getInteger("mOCTier2OffsetZ");
+ mRoughnessMultiplier = aNBT.getFloat("mRoughnessMultiplier");
+ mSetTier = aNBT.getInteger("mSetTier");
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected SoundResource getProcessStartSound() {
+ return SoundResource.IC2_MACHINES_MAGNETIZER_LOOP;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public byte getUpdateData() {
+ byte data = 0;
+ if (mSetTier == 1) {
+ data += mTier1BitMap;
+ } else if (mSetTier == 2) {
+ data += mTier2BitMap;
+ } else {
+ data += mTier3BitMap;
+ }
+
+ if (mBioUpgrade) {
+ data += mBioBitMap;
+ }
+
+ if (mBioRotate) {
+ data += mBioRotateBitMap;
+ }
+
+ if (mOCTier1) {
+ data += mOCTier1BitMap;
+ }
+
+ if (mOCTier2) {
+ data += mOCTier2BitMap;
+ }
+
+ return data;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ buildContext.addSyncedWindow(10, this::createConfigurationWindow);
+ builder.widget(
+ new ButtonWidget().setOnClick(
+ (clickData, widget) -> {
+ if (!widget.isClient()) widget.getContext()
+ .openSyncedWindow(10);
+ })
+ .setSize(16, 16)
+ .setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ ret.add(GT_UITextures.OVERLAY_BUTTON_CYCLIC);
+ return ret.toArray(new IDrawable[0]);
+ })
+ .addTooltip("Configuration Menu")
+ .setPos(174, 130))
+ .widget(
+ new TextWidget(new Text("Tier")).setTextAlignment(Alignment.Center)
+ .setScale(0.91f)
+ .setSize(20, 16)
+ .setPos(173, 98))
+ .widget(
+ new NumericWidget().setGetter(() -> mSetTier)
+ .setSetter(val -> mSetTier = (int) val)
+ .setBounds(1, 3)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("PCB Factory Tier")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(18, 18)
+ .setPos(173, 110));
+ }
+
+ protected ModularWindow createConfigurationWindow(final EntityPlayer player) {
+ ModularWindow.Builder builder = ModularWindow.builder(200, 160);
+ builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
+ builder.setGuiTint(getGUIColorization());
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC)
+ .setPos(5, 5)
+ .setSize(16, 16))
+ .widget(new TextWidget("Configuration Menu").setPos(25, 9))
+ .widget(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(185, 3))
+ .widget(
+ new DynamicPositionedColumn().setSynced(false)
+ .widget(
+ new MultiChildWidget().addChild(new CycleButtonWidget().setToggle(() -> mBioUpgrade, val -> {
+ mBioUpgrade = val;
+ if (!mBioUpgrade) {
+ GT_Utility
+ .sendChatToPlayer(player, GT_Utility.trans("339.1", "Biochamber Upgrade Disabled"));
+ } else {
+ GT_Utility
+ .sendChatToPlayer(player, GT_Utility.trans("339", "Biochamber Upgrade Enabled"));
+ }
+ })
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setSize(90, 18)
+ .addTooltip(
+ "Enables nanites to construct organic circuitry. Required for Bioware and Wetware boards."))
+ .addChild(
+ new DrawableWidget().setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC)
+ .setSize(18, 18))
+ .addChild(
+ new TextWidget("Biochamber").setTextAlignment(Alignment.Center)
+ .setPos(23, 5))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(new MultiChildWidget().addChild(new CycleButtonWidget().setToggle(() -> mBioRotate, val -> {
+ mBioRotate = val;
+ if (!mBioRotate) {
+ GT_Utility
+ .sendChatToPlayer(player, GT_Utility.trans("340.1", "Rotated biochamber disabled"));
+ } else {
+ GT_Utility.sendChatToPlayer(player, GT_Utility.trans("340", "Rotated biochamber enabled"));
+ }
+ })
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setSize(90, 18)
+ .addTooltip("Rotates the biochamber by 90 degrees."))
+ .addChild(
+ new DrawableWidget().setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC)
+ .setSize(18, 18))
+ .addChild(
+ new TextWidget("Bio Rotation").setTextAlignment(Alignment.Center)
+ .setPos(23, 5))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(new MultiChildWidget().addChild(new CycleButtonWidget().setToggle(() -> mOCTier1, val -> {
+ mOCTier1 = val;
+ mOCTier2 = false;
+ if (!mOCTier1) {
+ GT_Utility.sendChatToPlayer(player, GT_Utility.trans("341.1", "Tier 1 cooling disabled"));
+ } else {
+ GT_Utility.sendChatToPlayer(player, GT_Utility.trans("341", "Tier 1 cooling enabled"));
+ }
+ })
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setSize(90, 18)
+ .addTooltip(
+ "Allows for overclocking. Requires 10 L/s of distilled water. Cooling upgrades are mutually exclusive."))
+ .addChild(
+ new DrawableWidget().setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC)
+ .setSize(18, 18))
+ .addChild(
+ new TextWidget("Liquid Cooling").setTextAlignment(Alignment.Center)
+ .setPos(20, 5))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(new MultiChildWidget().addChild(new CycleButtonWidget().setToggle(() -> mOCTier2, val -> {
+ mOCTier2 = val;
+ mOCTier1 = false;
+ if (!mOCTier2) {
+ GT_Utility.sendChatToPlayer(player, GT_Utility.trans("342.1", "Tier 2 cooling disabled"));
+ } else {
+ GT_Utility.sendChatToPlayer(player, GT_Utility.trans("342", "Tier 2 cooling enabled"));
+ }
+ })
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setSize(90, 18)
+ .addTooltip(
+ "Enables perfect overclocking by allowing nanites to work with extreme speed and efficiency. Uses 10 L/s of Super Coolant."))
+ .addChild(
+ new DrawableWidget().setDrawable(GT_UITextures.OVERLAY_BUTTON_CYCLIC)
+ .setSize(18, 18))
+ .addChild(
+ new TextWidget("Thermosink").setTextAlignment(Alignment.Center)
+ .setPos(20, 5))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(
+ new TextWidget(new Text("Trace Size")).setSize(90, 18)
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive())
+ .setPos(0, 4))
+ .widget(
+ new NumericWidget().setGetter(() -> (int) ((1f / mRoughnessMultiplier) * 100f))
+ .setSetter(val -> mRoughnessMultiplier = 100f / (int) val)
+ .setBounds(50, 200)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip(
+ "Set the trace size. Smaller traces allow material savings but take longer to fabricate. Larger traces waste material but are fast. 50-200 μm.")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(90, 16))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.OVERLAY_BUTTON_CROSS)
+ .setSize(18, 18)
+ .addTooltip(new Text("Can't change configuration when running !").color(Color.RED.dark(3)))
+ .setEnabled(widget -> getBaseMetaTileEntity().isActive()))
+ .setPos(10, 25))
+ .widget(
+ new DynamicPositionedColumn().setSynced(false)
+ .widget(
+ new TextWidget(new Text("Bio Upgrade Offsets")).setSize(72, 18)
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(
+ new DynamicPositionedRow().setSynced(false)
+ .widget(
+ new NumericWidget().setGetter(() -> mBioOffsets[0])
+ .setSetter(val -> mBioOffsets[0] = (int) val)
+ .setBounds(-16, 16)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("X Offset")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(36, 18))
+ .widget(
+ new NumericWidget().setGetter(() -> mBioOffsets[1])
+ .setSetter(val -> mBioOffsets[1] = (int) val)
+ .setBounds(-16, 16)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("Z Offset")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(36, 18))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(
+ new TextWidget(new Text("Cooler Tier 1 Offsets")).setSize(72, 18)
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(
+ new DynamicPositionedRow().setSynced(false)
+ .widget(
+ new NumericWidget().setGetter(() -> mOCTier1Offsets[0])
+ .setSetter(val -> mOCTier1Offsets[0] = (int) val)
+ .setBounds(-16, 16)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("X Offset")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(36, 18))
+ .widget(
+ new NumericWidget().setGetter(() -> mOCTier1Offsets[1])
+ .setSetter(val -> mOCTier1Offsets[1] = (int) val)
+ .setBounds(-16, 16)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("Z Offset")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(36, 18))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(
+ new TextWidget(new Text("Cooler Tier 2 Offsets")).setSize(72, 18)
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .widget(
+ new DynamicPositionedRow().setSynced(false)
+ .widget(
+ new NumericWidget().setGetter(() -> mOCTier2Offsets[0])
+ .setSetter(val -> mOCTier2Offsets[0] = (int) val)
+ .setBounds(-16, 16)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("X Offset")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(36, 18))
+ .widget(
+ new NumericWidget().setGetter(() -> mOCTier2Offsets[1])
+ .setSetter(val -> mOCTier2Offsets[1] = (int) val)
+ .setBounds(-16, 16)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("Z Offset")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(36, 18))
+ .setEnabled(widget -> !getBaseMetaTileEntity().isActive()))
+ .setPos(110, 25));
+ return builder.build();
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsSingleRecipeLocking() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java
new file mode 100644
index 0000000000..1eef27c8f1
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PlasmaForge.java
@@ -0,0 +1,986 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.ExoticEnergy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.GT_Values.AuthorColen;
+import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DTPF_OFF;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DTPF_ON;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION1_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.ChunkCoordIntPair;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.objects.GT_ChunkManager;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_PlasmaForge extends
+ GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GT_MetaTileEntity_PlasmaForge> implements ISurvivalConstructable {
+
+ // 3600 seconds in an hour, 8 hours, 20 ticks in a second.
+ private static final double max_efficiency_time_in_ticks = 3600d * 8d * 20d;
+ // Multiplier for the efficiency decay rate
+ private static final double efficiency_decay_rate = 100;
+ private static final double maximum_discount = 0.5d;
+
+ // Valid fuels which the discount will get applied to.
+ private static final FluidStack[] valid_fuels = { MaterialsUEVplus.ExcitedDTEC.getFluid(1L),
+ MaterialsUEVplus.ExcitedDTRC.getFluid(1L), MaterialsUEVplus.ExcitedDTPC.getFluid(1L),
+ MaterialsUEVplus.ExcitedDTCC.getFluid(1L), MaterialsUEVplus.ExcitedDTSC.getFluid(1L) };
+
+ private static final int min_input_hatch = 0;
+ private static final int max_input_hatch = 7;
+ private static final int min_output_hatch = 0;
+ private static final int max_output_hatch = 2;
+ private static final int min_input_bus = 0;
+ private static final int max_input_bus = 6;
+ private static final int min_output_bus = 0;
+ private static final int max_output_bus = 1;
+
+ // Current discount rate. 1 = 0%, 0 = 100%.
+ private double discount = 1;
+ private int mHeatingCapacity = 0;
+ private long running_time = 0;
+ private HeatingCoilLevel mCoilLevel;
+
+ @SuppressWarnings("SpellCheckingInspection")
+ private static final String[][] structure_string = new String[][] { { " ",
+ " N N N N ", " N N N N ", " N N N N ",
+ " ", " ", " ",
+ " N N N N ", " N N N N ", " NNN NNN N N NNN NNN ",
+ " ", " ", " ",
+ " NNN NNN NNN NNN ", " ", " ",
+ " ", " ", " ",
+ " NNN NNN NNN NNN ", " ", " ",
+ " ", " NNN NNN NNN NNN " },
+ { " N N N N ", " bCCCb bCCCb ", " bCCCb bCCCb ",
+ " bCCCb bCCCb ", " N N N N ",
+ " ", " N N N N ",
+ " bCCCb bCCCb ", " bCCCb bCCCb ",
+ "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CCC CCC N N CCC CCC ",
+ " CCC CCC CCC CCC ", " CCC CCC CCC CCC ",
+ "NbbbN NbbbN NbbbN NbbbN", " N N N N ",
+ " N N N N ", " ",
+ " N N N N ", " N N N N ",
+ "NbbbN NbbbN NbbbN NbbbN", " CCC CCC CCC CCC ",
+ " CCC CCC CCC CCC ", " CCC CCC CCC CCC ",
+ "NbbbN NbbbN N N NbbbN NbbbN", },
+ { " N N N N ", " bCCCb bCCCb ", " NNNbbbbbNNsNNbbbbbNNN ",
+ " ss bCCCb bCCCb ss ", " s N N N N s ",
+ " s s ", " N N N N N N ",
+ " N bCCCb bCCCb N ", " N sbbbbbNNsNNbbbbbs N ",
+ "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CbC CbC N N CbC CbC ",
+ " CbC CbC CbC CbC ", " CbC CbC CbC CbC ",
+ "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ",
+ " NNN NNN NNN NNN ", " s s s s ",
+ " NNN NNN NNN NNN ", " NNN NNN NNN NNN ",
+ "NbbbN NbbbN NbbbN NbbbN", " CbC CbC CbC CbC ",
+ " CbC CbC CbC CbC ", " CbC CbC CbC CbC ",
+ "NbbbN NbbbNNNNNsNsNNNNNbbbN NbbbN", },
+ { " N N N N ", " bCCCb bCCCb ", " ss bCCCb bCCCb ss ",
+ " bCCCb bCCCb ", " s NCCCN NCCCN s ",
+ " s NCCCN NCCCN s ", " NCCCN NCCCN ",
+ " bCCCb bCCCb ", " bCCCb bCCCb ",
+ "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " CCCCCCCCC N N CCCCCCCCC ",
+ " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ",
+ "NbbbNNNbbbN NbbbNNNbbbN", " N N N N ",
+ " N N N N ", " ",
+ " N N N N ", " N N N N ",
+ "NbbbNNNbbbN NbbbNNNbbbN", " CCCCCCCCC CCCCCCCCC ",
+ " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ",
+ "NbbbNNNbbbN NbN NbbbNNNbbbN", },
+ { " ", " N N N N ", " s N N N N s ",
+ " s NCCCN NCCCN s ", " ",
+ " ", " ",
+ " NCCCN NCCCN ", " N N N N ",
+ " NNN NN N N NN NNN ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " NNN NNN NNN NNN ", " ",
+ " ", " ",
+ " ", " ",
+ " NNN NNN NNN NNN ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " NNN NNN NbN NNN NNN ", },
+ { " ", " ", " s s ",
+ " s NCCCN NCCCN s ", " ",
+ " ", " ",
+ " NCCCN NCCCN ", " ",
+ " N N N N ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " N N N N ", " ",
+ " ", " ",
+ " ", " ",
+ " N N N N ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " N N NbN N N ", },
+ { " ", " N N N N ", " N N N N N N ",
+ " NCCCN NCCCN ", " ",
+ " ", " ",
+ " NCCCN NCCCN ", " N N N N ",
+ " NNN NN N N NN NNN ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " NNN NNN NNN NNN ", " ",
+ " ", " ",
+ " ", " ",
+ " NNN NNN NNN NNN ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " NNN NNN NbN NNN NNN ", },
+ { " N N N N ", " bCCCb bCCCb ", " N bCCCb bCCCb N ",
+ " bCCCb bCCCb ", " NCCCN NCCCN ",
+ " NCCCN NCCCN ", " NCCCN NCCCN ",
+ " bCCCb bCCCb ", " bCCCb bCCCb ",
+ "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " CCCCCCCCC N N CCCCCCCCC ",
+ " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ",
+ "NbbbNNNbbbN NbbbNNNbbbN", " N N N N ",
+ " N N N N ", " ",
+ " N N N N ", " N N N N ",
+ "NbbbNNNbbbN NbbbNNNbbbN", " CCCCCCCCC CCCCCCCCC ",
+ " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ",
+ "NbbbNNNbbbN NbN NbbbNNNbbbN", },
+ { " N N N N ", " bCCCb bCCCb ", " N sbbbbbNNsNNbbbbbs N ",
+ " bCCCb bCCCb ", " N N N N ",
+ " ", " N N N N ",
+ " bCCCb bCCCb ", " s sbbbbbNNsNNbbbbbs s ",
+ "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CbC CbC N N CbC CbC ",
+ " CbC CbC CbC CbC ", " CbC CbC CbC CbC ",
+ "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ",
+ " NNN NNN NNN NNN ", " s s s s ",
+ " NNN NNN NNN NNN ", " NNN NNN NNN NNN ",
+ "NbbbN NbbbN NbbbN NbbbN", " CbC CbC CbC CbC ",
+ " CbC CbC CbC CbC ", " CbC CbC CbC CbC ",
+ "NbbbN NbbbNNNNNsNsNNNNNbbbN NbbbN", },
+ { " NNN NNN N N NNN NNN ", "NbbbN NbbNCCCb bCCCNbbN NbbbN", "NbbbN NbbNCCCb bCCCNbbN NbbbN",
+ "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " NNN NNN N N NNN NNN ",
+ " N N N N ", " NNN NNN N N NNN NNN ",
+ "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", "NbbbN NbbNCCCb bCCCNbbN NbbbN",
+ "NNNN NNNCCCb bCCCNNN NNNN", " CCC CCC N N CCC CCC ",
+ " CCC CCC CCC CCC ", " CCC CCC CCC CCC ",
+ "NbbbN NbbbN NbbbN NbbbN", " N N N N ",
+ " N N N N ", " ",
+ " N N N N ", " N N N N ",
+ "NbbbN NbbbN NbbbN NbbbN", " CCC CCC CCC CCC ",
+ " CCC CCC CCC CCC ", " CCC CCC CCC CCC ",
+ "NbbbN NbbbN NbN NbbbN NbbbN", },
+ { " ", " CCC CCC N N CCC CCC ", " CbC CbC N N CbC CbC ",
+ " CCCCCCCCC N N CCCCCCCCC ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " CCCCCCCCC N N CCCCCCCCC ", " CbC CbC N N CbC CbC ",
+ " CCC CCC N N CCC CCC ", " ",
+ " ", " ",
+ " NNN NNN NNN NNN ", " ",
+ " ", " ",
+ " ", " ",
+ " NNN NNN NNN NNN ", " ",
+ " ", " ",
+ " NNN NNN NbN NNN NNN ", },
+ { " ", " CCC CCC CCC CCC ", " CbC CbC CbC CbC ",
+ " CCCCCCCCC CCCCCCCCC ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " CCCCCCCCC CCCCCCCCC ", " CbC CbC CbC CbC ",
+ " CCC CCC CCC CCC ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " N N NbN N N ", },
+ { " ", " CCC CCC CCC CCC ", " CbC CbC CbC CbC ",
+ " CCCCCCCCC CCCCCCCCC ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " CCCCCCCCC CCCCCCCCC ", " CbC CbC CbC CbC ",
+ " CCC CCC CCC CCC ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " N N NbN N N ", },
+ { " NNN NNN NNN NNN ", "NbbbN NbbbN NbbbN NbbbN", "NbbbN NbbbN NbbbN NbbbN",
+ "NbbbNNNbbbN NbbbNNNbbbN", " NNN NNN NNN NNN ",
+ " N N N N ", " NNN NNN NNN NNN ",
+ "NbbbNNNbbbN NbbbNNNbbbN", "NbbbN NbbbN NbbbN NbbbN",
+ "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " N N NsNsN N N ", },
+ { " ", " ", " N N N N ",
+ " ", " ",
+ " ", " ",
+ " ", " N N N N ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " N N NbbbbbN N N ", },
+ { " ", " ", " N N N N ",
+ " ", " ",
+ " ", " ",
+ " ", " N N N N ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " N ",
+ " NsNNNNNsNNNNsbbbbbsNNNNsNNNNNsN ", },
+ { " ", " ", " s s s s ",
+ " ", " ",
+ " ", " ",
+ " ", " s s s s ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ~ ", " NNN ",
+ " NbbbbbNbbbbNbbbbbNbbbbNbbbbbN ", },
+ { " ", " ", " N N N N ",
+ " ", " ",
+ " ", " ",
+ " ", " N N N N ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " N ",
+ " NsNNNNNsNNNNsbbbbbsNNNNsNNNNNsN ", },
+ { " ", " ", " N N N N ",
+ " ", " ",
+ " ", " ",
+ " ", " N N N N ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " N N NbbbbbN N N ", },
+ { " NNN NNN NNN NNN ", "NbbbN NbbbN NbbbN NbbbN", "NbbbN NbbbN NbbbN NbbbN",
+ "NbbbNNNbbbN NbbbNNNbbbN", " NNN NNN NNN NNN ",
+ " N N N N ", " NNN NNN NNN NNN ",
+ "NbbbNNNbbbN NbbbNNNbbbN", "NbbbN NbbbN NbbbN NbbbN",
+ "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " N N NsNsN N N ", },
+ { " ", " CCC CCC CCC CCC ", " CbC CbC CbC CbC ",
+ " CCCCCCCCC CCCCCCCCC ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " CCCCCCCCC CCCCCCCCC ", " CbC CbC CbC CbC ",
+ " CCC CCC CCC CCC ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " N N NbN N N ", },
+ { " ", " CCC CCC CCC CCC ", " CbC CbC CbC CbC ",
+ " CCCCCCCCC CCCCCCCCC ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " CCCCCCCCC CCCCCCCCC ", " CbC CbC CbC CbC ",
+ " CCC CCC CCC CCC ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " ", " ",
+ " N N NbN N N ", },
+ { " ", " CCC CCC N N CCC CCC ", " CbC CbC N N CbC CbC ",
+ " CCCCCCCCC N N CCCCCCCCC ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " CCCCCCCCC N N CCCCCCCCC ", " CbC CbC N N CbC CbC ",
+ " CCC CCC N N CCC CCC ", " ",
+ " ", " ",
+ " NNN NNN NNN NNN ", " ",
+ " ", " ",
+ " ", " ",
+ " NNN NNN NNN NNN ", " ",
+ " ", " ",
+ " NNN NNN NbN NNN NNN ", },
+ { " NNN NNN N N NNN NNN ", "NbbbN NbbNCCCb bCCCNbbN NbbbN", "NbbbN NbbNCCCb bCCCNbbN NbbbN",
+ "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " NNN NNN N N NNN NNN ",
+ " N N N N ", " NNN NNN N N NNN NNN ",
+ "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", "NbbbN NbbNCCCb bCCCNbbN NbbbN",
+ "NNNN NNNCCCb bCCCNNN NNNN", " CCC CCC N N CCC CCC ",
+ " CCC CCC CCC CCC ", " CCC CCC CCC CCC ",
+ "NbbbN NbbbN NbbbN NbbbN", " N N N N ",
+ " N N N N ", " ",
+ " N N N N ", " N N N N ",
+ "NbbbN NbbbN NbbbN NbbbN", " CCC CCC CCC CCC ",
+ " CCC CCC CCC CCC ", " CCC CCC CCC CCC ",
+ "NbbbN NbbbN NbN NbbbN NbbbN", },
+ { " N N N N ", " bCCCb bCCCb ", " N sbbbbbNNsNNbbbbbs N ",
+ " bCCCb bCCCb ", " N N N N ",
+ " ", " N N N N ",
+ " bCCCb bCCCb ", " s sbbbbbNNsNNbbbbbs s ",
+ "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CbC CbC N N CbC CbC ",
+ " CbC CbC CbC CbC ", " CbC CbC CbC CbC ",
+ "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ",
+ " NNN NNN NNN NNN ", " s s s s ",
+ " NNN NNN NNN NNN ", " NNN NNN NNN NNN ",
+ "NbbbN NbbbN NbbbN NbbbN", " CbC CbC CbC CbC ",
+ " CbC CbC CbC CbC ", " CbC CbC CbC CbC ",
+ "NbbbN NbbbNNNNNsNsNNNNNbbbN NbbbN", },
+ { " N N N N ", " bCCCb bCCCb ", " N bCCCb bCCCb N ",
+ " bCCCb bCCCb ", " NCCCN NCCCN ",
+ " NCCCN NCCCN ", " NCCCN NCCCN ",
+ " bCCCb bCCCb ", " bCCCb bCCCb ",
+ "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " CCCCCCCCC N N CCCCCCCCC ",
+ " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ",
+ "NbbbNNNbbbN NbbbNNNbbbN", " N N N N ",
+ " N N N N ", " ",
+ " N N N N ", " N N N N ",
+ "NbbbNNNbbbN NbbbNNNbbbN", " CCCCCCCCC CCCCCCCCC ",
+ " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ",
+ "NbbbNNNbbbN NbN NbbbNNNbbbN", },
+ { " ", " N N N N ", " N N N N N N ",
+ " NCCCN NCCCN ", " ",
+ " ", " ",
+ " NCCCN NCCCN ", " N N N N ",
+ " NNN NN N N NN NNN ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " NNN NNN NNN NNN ", " ",
+ " ", " ",
+ " ", " ",
+ " NNN NNN NNN NNN ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " NNN NNN NbN NNN NNN ", },
+ { " ", " ", " s s ",
+ " s NCCCN NCCCN s ", " ",
+ " ", " ",
+ " NCCCN NCCCN ", " ",
+ " N N N N ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " N N N N ", " ",
+ " ", " ",
+ " ", " ",
+ " N N N N ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " N N NbN N N ", },
+ { " ", " N N N N ", " s N N N N s ",
+ " s NCCCN NCCCN s ", " ",
+ " ", " ",
+ " NCCCN NCCCN ", " N N N N ",
+ " NNN NN N N NN NNN ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " NNN NNN NNN NNN ", " ",
+ " ", " ",
+ " ", " ",
+ " NNN NNN NNN NNN ", " C C C C ",
+ " C C C C ", " C C C C ",
+ " NNN NNN NbN NNN NNN ", },
+ { " N N N N ", " bCCCb bCCCb ", " ss bCCCb bCCCb ss ",
+ " bCCCb bCCCb ", " s NCCCN NCCCN s ",
+ " s NCCCN NCCCN s ", " NCCCN NCCCN ",
+ " bCCCb bCCCb ", " bCCCb bCCCb ",
+ "NbbbNNNbbNCCCb bCCCNbbNNNbbbN", " CCCCCCCCC N N CCCCCCCCC ",
+ " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ",
+ "NbbbNNNbbbN NbbbNNNbbbN", " N N N N ",
+ " N N N N ", " ",
+ " N N N N ", " N N N N ",
+ "NbbbNNNbbbN NbbbNNNbbbN", " CCCCCCCCC CCCCCCCCC ",
+ " CCCCCCCCC CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ",
+ "NbbbNNNbbbN NbN NbbbNNNbbbN", },
+ { " N N N N ", " bCCCb bCCCb ", " NNNbbbbbNNsNNbbbbbNNN ",
+ " ss bCCCb bCCCb ss ", " s N N N N s ",
+ " s s ", " N N N N N N ",
+ " N bCCCb bCCCb N ", " N sbbbbbNNsNNbbbbbs N ",
+ "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CbC CbC N N CbC CbC ",
+ " CbC CbC CbC CbC ", " CbC CbC CbC CbC ",
+ "NbbbN NbbbN NbbbN NbbbN", " NNN NNN NNN NNN ",
+ " NNN NNN NNN NNN ", " s s s s ",
+ " NNN NNN NNN NNN ", " NNN NNN NNN NNN ",
+ "NbbbN NbbbN NbbbN NbbbN", " CbC CbC CbC CbC ",
+ " CbC CbC CbC CbC ", " CbC CbC CbC CbC ",
+ "NbbbN NbbbNNNNNsNsNNNNNbbbN NbbbN", },
+ { " N N N N ", " bCCCb bCCCb ", " bCCCb bCCCb ",
+ " bCCCb bCCCb ", " N N N N ",
+ " ", " N N N N ",
+ " bCCCb bCCCb ", " bCCCb bCCCb ",
+ "NbbbN NbbNCCCb bCCCNbbN NbbbN", " CCC CCC N N CCC CCC ",
+ " CCC CCC CCC CCC ", " CCC CCC CCC CCC ",
+ "NbbbN NbbbN NbbbN NbbbN", " N N N N ",
+ " N N N N ", " ",
+ " N N N N ", " N N N N ",
+ "NbbbN NbbbN NbbbN NbbbN", " CCC CCC CCC CCC ",
+ " CCC CCC CCC CCC ", " CCC CCC CCC CCC ",
+ "NbbbN NbbbN N N NbbbN NbbbN", },
+ { " ", " N N N N ", " N N N N ",
+ " N N N N ", " ",
+ " ", " ",
+ " N N N N ", " N N N N ",
+ " NNN NNN N N NNN NNN ", " ",
+ " ", " ",
+ " NNN NNN NNN NNN ", " ",
+ " ", " ",
+ " ", " ",
+ " NNN NNN NNN NNN ", " ",
+ " ", " ",
+ " NNN NNN NNN NNN ", } };
+
+ protected static final int DIM_TRANS_CASING = 12;
+ protected static final int DIM_INJECTION_CASING = 13;
+ protected static final int DIM_BRIDGE_CASING = 14;
+
+ private boolean isMultiChunkloaded = true;
+
+ protected static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final IStructureDefinition<GT_MetaTileEntity_PlasmaForge> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_PlasmaForge>builder()
+ .addShape(STRUCTURE_PIECE_MAIN, structure_string)
+ .addElement(
+ 'C',
+ ofCoil(GT_MetaTileEntity_PlasmaForge::setCoilLevel, GT_MetaTileEntity_PlasmaForge::getCoilLevel))
+ .addElement(
+ 'b',
+ buildHatchAdder(GT_MetaTileEntity_PlasmaForge.class)
+ .atLeast(InputHatch, OutputHatch, InputBus, OutputBus, Energy, ExoticEnergy, Maintenance)
+ .casingIndex(DIM_INJECTION_CASING)
+ .dot(3)
+ .buildAndChain(GregTech_API.sBlockCasings1, DIM_INJECTION_CASING))
+ .addElement('N', ofBlock(GregTech_API.sBlockCasings1, DIM_TRANS_CASING))
+ .addElement('s', ofBlock(GregTech_API.sBlockCasings1, DIM_BRIDGE_CASING))
+ .build();
+
+ public GT_MetaTileEntity_PlasmaForge(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_PlasmaForge(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_PlasmaForge(mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addInfo("Transcending Dimensional Boundaries.")
+ .addInfo(
+ "Takes " + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(max_efficiency_time_in_ticks / (3600 * 20))
+ + EnumChatFormatting.GRAY
+ + " hours of continuous run time to fully breach dimensional")
+ .addInfo("boundaries and achieve maximum efficiency. This reduces fuel")
+ .addInfo(
+ "consumption by up to " + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(100 * maximum_discount)
+ + "%"
+ + EnumChatFormatting.GRAY
+ + ". Supports overclocking beyond MAX voltage.")
+ .addInfo(
+ "When no recipe is running, fuel discount decays x" + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(efficiency_decay_rate)
+ + EnumChatFormatting.GRAY
+ + " as fast as it builds up.")
+ .addInfo(AuthorColen)
+ .addSeparator()
+ .beginStructureBlock(33, 24, 33, false)
+ .addStructureInfo("DTPF Structure is too complex! See schematic for details.")
+ .addStructureInfo(EnumChatFormatting.GOLD + "2,112" + EnumChatFormatting.GRAY + " Heating coils required.")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "120" + EnumChatFormatting.GRAY + " Dimensional bridge blocks required.")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "1,270"
+ + EnumChatFormatting.GRAY
+ + " Dimensional injection casings required.")
+ .addStructureInfo(
+ EnumChatFormatting.GOLD + "2,121"
+ + EnumChatFormatting.GRAY
+ + " Dimensionally transcendent casings required.")
+ .addStructureInfo("--------------------------------------------")
+ .addStructureInfo(
+ "Requires " + EnumChatFormatting.GOLD
+ + "1"
+ + EnumChatFormatting.GRAY
+ + "-"
+ + EnumChatFormatting.GOLD
+ + "2"
+ + EnumChatFormatting.GRAY
+ + " energy hatches or "
+ + EnumChatFormatting.GOLD
+ + "1"
+ + EnumChatFormatting.GRAY
+ + " TT energy hatch.")
+ .addStructureInfo(
+ "Requires " + EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + " maintenance hatch.")
+ .addStructureInfo(
+ "Requires " + EnumChatFormatting.GOLD
+ + min_input_hatch
+ + EnumChatFormatting.GRAY
+ + "-"
+ + EnumChatFormatting.GOLD
+ + max_input_hatch
+ + EnumChatFormatting.GRAY
+ + " input hatches.")
+ .addStructureInfo(
+ "Requires " + EnumChatFormatting.GOLD
+ + min_output_hatch
+ + EnumChatFormatting.GRAY
+ + "-"
+ + EnumChatFormatting.GOLD
+ + max_output_hatch
+ + EnumChatFormatting.GRAY
+ + " output hatches.")
+ .addStructureInfo(
+ "Requires " + EnumChatFormatting.GOLD
+ + min_input_bus
+ + EnumChatFormatting.GRAY
+ + "-"
+ + EnumChatFormatting.GOLD
+ + max_input_bus
+ + EnumChatFormatting.GRAY
+ + " input busses.")
+ .addStructureInfo(
+ "Requires " + EnumChatFormatting.GOLD
+ + min_output_bus
+ + EnumChatFormatting.GRAY
+ + "-"
+ + EnumChatFormatting.GOLD
+ + max_input_bus
+ + EnumChatFormatting.GRAY
+ + " output busses.")
+ .addStructureInfo("--------------------------------------------")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ boolean exotic = addExoticEnergyInputToMachineList(aTileEntity, aBaseCasingIndex);
+ return super.addToMachineList(aTileEntity, aBaseCasingIndex) || exotic;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ if (aActive) return new ITexture[] { casingTexturePages[0][DIM_BRIDGE_CASING], TextureFactory.builder()
+ .addIcon(OVERLAY_DTPF_ON)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FUSION1_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { casingTexturePages[0][DIM_BRIDGE_CASING], TextureFactory.builder()
+ .addIcon(OVERLAY_DTPF_OFF)
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { casingTexturePages[0][DIM_BRIDGE_CASING] };
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.plasmaForgeRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_PlasmaForge> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ CheckRecipeResult recipe_process = super.checkProcessing();
+ if (recipe_process.wasSuccessful()) {
+ running_time = Math.min(running_time + mMaxProgresstime, (long) max_efficiency_time_in_ticks);
+ }
+ return recipe_process;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setRecipeHeat(recipe.mSpecialValue)
+ .setMachineHeat(mHeatingCapacity);
+ }
+
+ @NotNull
+ @Override
+ protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) {
+ return super.createParallelHelper(recipeAfterDiscount(recipe));
+ }
+
+ @Override
+ protected @Nonnull CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ return recipe.mSpecialValue <= mHeatingCapacity ? CheckRecipeResultRegistry.SUCCESSFUL
+ : CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
+ }
+ };
+ }
+
+ @Nonnull
+ protected GT_Recipe recipeAfterDiscount(@Nonnull GT_Recipe recipe) {
+ GT_Recipe tRecipe = recipe.copy();
+ outside: for (int i = 0; i < recipe.mFluidInputs.length; i++) {
+ for (FluidStack fuel : valid_fuels) {
+ if (tRecipe.mFluidInputs[i].isFluidEqual(fuel)) {
+ recalculateDiscount();
+ tRecipe.mFluidInputs[i].amount = (int) Math.round(tRecipe.mFluidInputs[i].amount * discount);
+ break outside;
+ }
+ }
+ }
+ return tRecipe;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+
+ // Reset heating capacity.
+ mHeatingCapacity = 0;
+
+ // Get heating capacity from coils in structure.
+ setCoilLevel(HeatingCoilLevel.None);
+
+ // Check the main structure
+ if (!checkPiece(STRUCTURE_PIECE_MAIN, 16, 21, 16)) return false;
+
+ if (getCoilLevel() == HeatingCoilLevel.None) return false;
+
+ // Item input bus check.
+ if (mInputBusses.size() > max_input_bus) return false;
+
+ // Item output bus check.
+ if (mOutputBusses.size() > max_output_bus) return false;
+
+ // Fluid input hatch check.
+ if (mInputHatches.size() > max_input_hatch) return false;
+
+ // Fluid output hatch check.
+ if (mOutputHatches.size() > max_output_hatch) return false;
+
+ // If there is more than 1 TT energy hatch, the structure check will fail.
+ // If there is a TT hatch and a normal hatch, the structure check will fail.
+ if (mExoticEnergyHatches.size() > 0) {
+ if (mEnergyHatches.size() > 0) return false;
+ if (mExoticEnergyHatches.size() > 1) return false;
+ }
+
+ // If there is 0 or more than 2 energy hatches structure check will fail.
+ if (mEnergyHatches.size() > 0) {
+ if (mEnergyHatches.size() > 2) return false;
+
+ // Check will also fail if energy hatches are not of the same tier.
+ byte tier_of_hatch = mEnergyHatches.get(0).mTier;
+ for (GT_MetaTileEntity_Hatch_Energy energyHatch : mEnergyHatches) {
+ if (energyHatch.mTier != tier_of_hatch) {
+ return false;
+ }
+ }
+ }
+
+ // If there are no energy hatches or TT energy hatches, structure will fail to form.
+ if ((mEnergyHatches.size() == 0) && (mExoticEnergyHatches.size() == 0)) return false;
+
+ // One maintenance hatch only. Mandatory.
+ if (mMaintenanceHatches.size() != 1) return false;
+
+ // Heat capacity of coils used on multi. No free heat from extra EU!
+ mHeatingCapacity = (int) getCoilLevel().getHeat();
+
+ // All structure checks passed, return true.
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public void clearHatches() {
+ super.clearHatches();
+ mExoticEnergyHatches.clear();
+ }
+
+ @Override
+ public boolean addOutput(FluidStack aLiquid) {
+ if (aLiquid == null) return false;
+ FluidStack tLiquid = aLiquid.copy();
+
+ return dumpFluid(mOutputHatches, tLiquid, true) || dumpFluid(mOutputHatches, tLiquid, false);
+ }
+
+ @Override
+ public String[] getInfoData() {
+
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mExoticEnergyHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+ long voltage = getAverageInputVoltage();
+ long amps = getMaxInputAmps();
+
+ // Calculate discount to make sure it is shown properly even when machine is off but decaying
+ recalculateDiscount();
+
+ return new String[] { "------------ Critical Information ------------",
+ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mProgresstime)
+ + EnumChatFormatting.RESET
+ + "t / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime)
+ + EnumChatFormatting.RESET
+ + "t",
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(getActualEnergyUsage())
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(voltage)
+ + EnumChatFormatting.RESET
+ + " EU/t(*"
+ + EnumChatFormatting.YELLOW
+ + amps
+ + EnumChatFormatting.RESET
+ + "A) "
+ + StatCollector.translateToLocal("GT5U.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + VN[GT_Utility.getTier(voltage)]
+ + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.EBF.heat") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mHeatingCapacity)
+ + EnumChatFormatting.RESET
+ + " K",
+ "Ticks run: " + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(running_time)
+ + EnumChatFormatting.RESET
+ + ", Fuel Discount: "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(100 * (1 - discount))
+ + EnumChatFormatting.RESET
+ + "%",
+ "-----------------------------------------" };
+ }
+
+ private void recalculateDiscount() {
+ double time_percentage = running_time / max_efficiency_time_in_ticks;
+ time_percentage = Math.min(time_percentage, 1.0d);
+ // Multiplied by 0.5 because that is the maximum achievable discount
+ discount = 1 - time_percentage * 0.5;
+ discount = Math.max(maximum_discount, discount);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide() && !aBaseMetaTileEntity.isAllowedToWork()) {
+ // If machine has stopped, stop chunkloading.
+ GT_ChunkManager.releaseTicket((TileEntity) aBaseMetaTileEntity);
+ isMultiChunkloaded = false;
+ } else if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && !isMultiChunkloaded) {
+ // Load a 3x3 area centered on controller when machine is running.
+ GT_ChunkManager.releaseTicket((TileEntity) aBaseMetaTileEntity);
+
+ int ControllerXCoordinate = ((TileEntity) aBaseMetaTileEntity).xCoord;
+ int ControllerZCoordinate = ((TileEntity) aBaseMetaTileEntity).zCoord;
+
+ GT_ChunkManager.requestChunkLoad(
+ (TileEntity) aBaseMetaTileEntity,
+ new ChunkCoordIntPair(ControllerXCoordinate, ControllerZCoordinate));
+ GT_ChunkManager.requestChunkLoad(
+ (TileEntity) aBaseMetaTileEntity,
+ new ChunkCoordIntPair(ControllerXCoordinate + 16, ControllerZCoordinate));
+ GT_ChunkManager.requestChunkLoad(
+ (TileEntity) aBaseMetaTileEntity,
+ new ChunkCoordIntPair(ControllerXCoordinate - 16, ControllerZCoordinate));
+ GT_ChunkManager.requestChunkLoad(
+ (TileEntity) aBaseMetaTileEntity,
+ new ChunkCoordIntPair(ControllerXCoordinate, ControllerZCoordinate + 16));
+ GT_ChunkManager.requestChunkLoad(
+ (TileEntity) aBaseMetaTileEntity,
+ new ChunkCoordIntPair(ControllerXCoordinate, ControllerZCoordinate - 16));
+ GT_ChunkManager.requestChunkLoad(
+ (TileEntity) aBaseMetaTileEntity,
+ new ChunkCoordIntPair(ControllerXCoordinate + 16, ControllerZCoordinate + 16));
+ GT_ChunkManager.requestChunkLoad(
+ (TileEntity) aBaseMetaTileEntity,
+ new ChunkCoordIntPair(ControllerXCoordinate + 16, ControllerZCoordinate - 16));
+ GT_ChunkManager.requestChunkLoad(
+ (TileEntity) aBaseMetaTileEntity,
+ new ChunkCoordIntPair(ControllerXCoordinate - 16, ControllerZCoordinate + 16));
+ GT_ChunkManager.requestChunkLoad(
+ (TileEntity) aBaseMetaTileEntity,
+ new ChunkCoordIntPair(ControllerXCoordinate - 16, ControllerZCoordinate - 16));
+
+ isMultiChunkloaded = true;
+ }
+
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (mMaxProgresstime == 0) {
+ running_time = Math.max(0, running_time - (long) efficiency_decay_rate);
+ }
+ }
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, 16, 21, 16);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5);
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 16, 21, 16, realBudget, env, false, true);
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ protected ResourceLocation getActivitySoundLoop() {
+ return SoundResource.GT_MACHINES_PLASMAFORGE_LOOP.resourceLocation;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setLong("eRunningTime", running_time);
+ aNBT.setDouble("eLongDiscountValue", discount);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ running_time = aNBT.getLong("eRunningTime");
+ discount = aNBT.getDouble("eLongDiscountValue");
+ super.loadNBTData(aNBT);
+ }
+
+ public HeatingCoilLevel getCoilLevel() {
+ return mCoilLevel;
+ }
+
+ public void setCoilLevel(HeatingCoilLevel aCoilLevel) {
+ mCoilLevel = aCoilLevel;
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PrimitiveBlastFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PrimitiveBlastFurnace.java
new file mode 100644
index 0000000000..e69d2c2921
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PrimitiveBlastFurnace.java
@@ -0,0 +1,526 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.isAir;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.StructureLibAPI;
+import com.gtnewhorizon.structurelib.alignment.IAlignment;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.modularui.IGetTitleColor;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.RecipeMapWorkable;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder;
+import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder;
+import gregtech.common.GT_Pollution;
+
+public abstract class GT_MetaTileEntity_PrimitiveBlastFurnace extends MetaTileEntity
+ implements IAlignment, ISurvivalConstructable, RecipeMapWorkable, IAddUIWidgets, IGetTitleColor {
+
+ public static final int INPUT_SLOTS = 3, OUTPUT_SLOTS = 3;
+ private static final ClassValue<IStructureDefinition<GT_MetaTileEntity_PrimitiveBlastFurnace>> STRUCTURE_DEFINITION = new ClassValue<>() {
+
+ @Override
+ protected IStructureDefinition<GT_MetaTileEntity_PrimitiveBlastFurnace> computeValue(Class<?> type) {
+ return IStructureDefinition.<GT_MetaTileEntity_PrimitiveBlastFurnace>builder()
+ .addShape(
+ "main",
+ transpose(
+ new String[][] { { "ccc", "c-c", "ccc" }, { "ccc", "clc", "ccc" }, { "c~c", "clc", "ccc" },
+ { "ccc", "ccc", "ccc" }, }))
+ .addElement('c', lazy(t -> ofBlock(t.getCasingBlock(), t.getCasingMetaID())))
+ .addElement(
+ 'l',
+ ofChain(isAir(), ofBlockAnyMeta(Blocks.lava, 1), ofBlockAnyMeta(Blocks.flowing_lava, 1)))
+ .build();
+ }
+ };
+
+ public int mMaxProgresstime = 0;
+ private volatile boolean mUpdated;
+ public int mUpdate = 5;
+ public int mProgresstime = 0;
+ public boolean mMachine = false;
+
+ public ItemStack[] mOutputItems = new ItemStack[OUTPUT_SLOTS];
+
+ public GT_MetaTileEntity_PrimitiveBlastFurnace(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, INPUT_SLOTS + OUTPUT_SLOTS);
+ }
+
+ public GT_MetaTileEntity_PrimitiveBlastFurnace(String aName) {
+ super(aName, INPUT_SLOTS + OUTPUT_SLOTS);
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return (facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return this.mProgresstime;
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return this.mMaxProgresstime;
+ }
+
+ @Override
+ public int increaseProgress(int aProgress) {
+ this.mProgresstime += aProgress;
+ return this.mMaxProgresstime - this.mProgresstime;
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aCoverID) {
+ return (GregTech_API.getCoverBehaviorNew(aCoverID.toStack())
+ .isSimpleCover()) && (super.allowCoverOnSide(side, aCoverID));
+ }
+
+ @Override
+ public abstract MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity);
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mProgresstime", this.mProgresstime);
+ aNBT.setInteger("mMaxProgresstime", this.mMaxProgresstime);
+ if (this.mOutputItems != null) {
+ for (int i = 0; i < mOutputItems.length; i++) {
+ if (this.mOutputItems[i] != null) {
+ NBTTagCompound tNBT = new NBTTagCompound();
+ this.mOutputItems[i].writeToNBT(tNBT);
+ aNBT.setTag("mOutputItem" + i, tNBT);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ this.mUpdate = 5;
+ this.mProgresstime = aNBT.getInteger("mProgresstime");
+ this.mMaxProgresstime = aNBT.getInteger("mMaxProgresstime");
+ this.mOutputItems = new ItemStack[OUTPUT_SLOTS];
+ for (int i = 0; i < OUTPUT_SLOTS; i++) {
+ this.mOutputItems[i] = GT_Utility.loadItem(aNBT, "mOutputItem" + i);
+ }
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public ExtendedFacing getExtendedFacing() {
+ return ExtendedFacing.of(getBaseMetaTileEntity().getFrontFacing());
+ }
+
+ @Override
+ public void setExtendedFacing(ExtendedFacing alignment) {
+ getBaseMetaTileEntity().setFrontFacing(alignment.getDirection());
+ }
+
+ @Override
+ public IAlignmentLimits getAlignmentLimits() {
+ return (d, r, f) -> (d.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 && r.isNotRotated()
+ && f.isNotFlipped();
+ }
+
+ private boolean checkMachine() {
+ return STRUCTURE_DEFINITION.get(this.getClass())
+ .check(
+ this,
+ "main",
+ getBaseMetaTileEntity().getWorld(),
+ getExtendedFacing(),
+ getBaseMetaTileEntity().getXCoord(),
+ getBaseMetaTileEntity().getYCoord(),
+ getBaseMetaTileEntity().getZCoord(),
+ 1,
+ 2,
+ 0,
+ !mMachine);
+ }
+
+ protected abstract Block getCasingBlock();
+
+ protected abstract int getCasingMetaID();
+
+ @Override
+ public void onMachineBlockUpdate() {
+ mUpdated = true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+ final int lavaX = aBaseMetaTileEntity.getOffsetX(aBaseMetaTileEntity.getBackFacing(), 1);
+ final int lavaZ = aBaseMetaTileEntity.getOffsetZ(aBaseMetaTileEntity.getBackFacing(), 1);
+ if ((aBaseMetaTileEntity.isClientSide()) && (aBaseMetaTileEntity.isActive())) {
+
+ new WorldSpawnedEventBuilder.ParticleEventBuilder().setMotion(0D, 0.3D, 0D)
+ .setIdentifier(ParticleFX.LARGE_SMOKE)
+ .setPosition(
+ lavaX + XSTR_INSTANCE.nextFloat(),
+ aBaseMetaTileEntity.getOffsetY(aBaseMetaTileEntity.getBackFacing(), 1),
+ lavaZ + XSTR_INSTANCE.nextFloat())
+ .setWorld(getBaseMetaTileEntity().getWorld())
+ .run();
+ }
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (mUpdated) {
+ // duct tape fix for too many updates on an overloaded server, causing the structure check to not run
+ if (mUpdate < 0) mUpdate = 5;
+ mUpdated = false;
+ }
+ if (this.mUpdate-- == 0) {
+ this.mMachine = checkMachine();
+ }
+ if (this.mMachine) {
+ if (this.mMaxProgresstime > 0) {
+ if (++this.mProgresstime >= this.mMaxProgresstime) {
+ addOutputProducts();
+ this.mOutputItems = null;
+ this.mProgresstime = 0;
+ this.mMaxProgresstime = 0;
+ GT_Mod.achievements.issueAchievement(
+ aBaseMetaTileEntity.getWorld()
+ .getPlayerEntityByName(aBaseMetaTileEntity.getOwnerName()),
+ "steel");
+ }
+ } else if (aBaseMetaTileEntity.isAllowedToWork()) {
+ checkRecipe();
+ }
+ }
+ if (this.mMaxProgresstime > 0 && (aTimer % 20L == 0L)) {
+ GT_Pollution.addPollution(
+ this.getBaseMetaTileEntity(),
+ GT_Mod.gregtechproxy.mPollutionPrimitveBlastFurnacePerSecond);
+ }
+
+ aBaseMetaTileEntity.setActive((this.mMaxProgresstime > 0) && (this.mMachine));
+ final short lavaY = aBaseMetaTileEntity.getYCoord();
+ if (aBaseMetaTileEntity.isActive()) {
+ if (aBaseMetaTileEntity.getAir(lavaX, lavaY, lavaZ)) {
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(lavaX, lavaY, lavaZ, Blocks.lava, 1, 2);
+ this.mUpdate = 1;
+ }
+ if (aBaseMetaTileEntity.getAir(lavaX, lavaY + 1, lavaZ)) {
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(lavaX, lavaY + 1, lavaZ, Blocks.lava, 1, 2);
+ this.mUpdate = 1;
+ }
+ } else {
+ Block lowerLava = aBaseMetaTileEntity.getBlock(lavaX, lavaY, lavaZ);
+ Block upperLava = aBaseMetaTileEntity.getBlock(lavaX, lavaY + 1, lavaZ);
+ if (lowerLava == Blocks.lava) {
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(lavaX, lavaY, lavaZ, Blocks.air, 0, 2);
+ this.mUpdate = 1;
+ }
+ if (upperLava == Blocks.lava) {
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(lavaX, lavaY + 1, lavaZ, Blocks.air, 0, 2);
+ this.mUpdate = 1;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ if (aBaseMetaTileEntity.isClientSide())
+ StructureLibAPI.queryAlignment((IAlignmentProvider) aBaseMetaTileEntity);
+ }
+
+ /**
+ * Draws random flames and smoke particles in front of Primitive Blast Furnace when active
+ *
+ * @param aBaseMetaTileEntity The entity that will handle the {@link Block#randomDisplayTick}
+ */
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ if (aBaseMetaTileEntity.isActive()) {
+
+ final ForgeDirection frontFacing = aBaseMetaTileEntity.getFrontFacing();
+
+ final double oX = aBaseMetaTileEntity.getOffsetX(frontFacing, 1) + 0.5D;
+ final double oY = aBaseMetaTileEntity.getOffsetY(frontFacing, 1);
+ final double oZ = aBaseMetaTileEntity.getOffsetZ(frontFacing, 1) + 0.5D;
+ final double offset = -0.48D;
+ final double horizontal = XSTR_INSTANCE.nextFloat() * 8D / 16D - 4D / 16D;
+
+ final double x, y, z;
+
+ y = oY + XSTR_INSTANCE.nextFloat() * 10D / 16D + 5D / 16D;
+
+ if (frontFacing == ForgeDirection.WEST) {
+ x = oX - offset;
+ z = oZ + horizontal;
+ } else if (frontFacing == ForgeDirection.EAST) {
+ x = oX + offset;
+ z = oZ + horizontal;
+ } else if (frontFacing == ForgeDirection.NORTH) {
+ x = oX + horizontal;
+ z = oZ - offset;
+ } else // if (frontFacing == ForgeDirection.SOUTH.ordinal())
+ {
+ x = oX + horizontal;
+ z = oZ + offset;
+ }
+
+ ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(0D, 0D, 0D)
+ .setPosition(x, y, z)
+ .setWorld(getBaseMetaTileEntity().getWorld());
+ particleEventBuilder.setIdentifier(ParticleFX.SMOKE)
+ .run();
+ particleEventBuilder.setIdentifier(ParticleFX.FLAME)
+ .run();
+ }
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.primitiveBlastRecipes;
+ }
+
+ private void addOutputProducts() {
+ if (this.mOutputItems == null) {
+ return;
+ }
+ int limit = Math.min(mOutputItems.length, OUTPUT_SLOTS);
+ for (int i = 0; i < limit; i++) {
+ int absi = INPUT_SLOTS + i;
+ if (this.mInventory[absi] == null) {
+ this.mInventory[absi] = GT_Utility.copyOrNull(this.mOutputItems[i]);
+ } else if (GT_Utility.areStacksEqual(this.mInventory[absi], this.mOutputItems[i])) {
+ this.mInventory[absi].stackSize = Math.min(
+ this.mInventory[absi].getMaxStackSize(),
+ this.mInventory[absi].stackSize + this.mOutputItems[i].stackSize);
+ }
+ }
+ }
+
+ private boolean spaceForOutput(ItemStack outputStack, int relativeOutputSlot) {
+ int absoluteSlot = relativeOutputSlot + INPUT_SLOTS;
+ if (this.mInventory[absoluteSlot] == null || outputStack == null) {
+ return true;
+ }
+ return ((this.mInventory[absoluteSlot].stackSize + outputStack.stackSize
+ <= this.mInventory[absoluteSlot].getMaxStackSize())
+ && (GT_Utility.areStacksEqual(this.mInventory[absoluteSlot], outputStack)));
+ }
+
+ private boolean checkRecipe() {
+ if (!this.mMachine) {
+ return false;
+ }
+ ItemStack[] inputs = new ItemStack[INPUT_SLOTS];
+ System.arraycopy(mInventory, 0, inputs, 0, INPUT_SLOTS);
+ GT_Recipe recipe = getRecipeMap().findRecipe(getBaseMetaTileEntity(), false, 0, null, inputs);
+ if (recipe == null) {
+ this.mOutputItems = null;
+ return false;
+ }
+ for (int i = 0; i < OUTPUT_SLOTS; i++) {
+ if (!spaceForOutput(recipe.getOutput(i), i)) {
+ this.mOutputItems = null;
+ return false;
+ }
+ }
+
+ if (!recipe.isRecipeInputEqual(true, null, inputs)) {
+ this.mOutputItems = null;
+ return false;
+ }
+ for (int i = 0; i < INPUT_SLOTS; i++) {
+ if (mInventory[i] != null && mInventory[i].stackSize == 0) {
+ mInventory[i] = null;
+ }
+ }
+
+ this.mMaxProgresstime = recipe.mDuration;
+ this.mOutputItems = recipe.mOutputs;
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return aIndex > INPUT_SLOTS;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return !GT_Utility.areStacksEqual(aStack, this.mInventory[0]);
+ }
+
+ @Override
+ public byte getTileEntityBaseType() {
+ return 0;
+ }
+
+ public abstract String getName();
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return STRUCTURE_DEFINITION.get(getClass())
+ .survivalBuild(
+ this,
+ stackSize,
+ "main",
+ getBaseMetaTileEntity().getWorld(),
+ getExtendedFacing(),
+ getBaseMetaTileEntity().getXCoord(),
+ getBaseMetaTileEntity().getYCoord(),
+ getBaseMetaTileEntity().getZCoord(),
+ 1,
+ 2,
+ 0,
+ elementBudget,
+ env,
+ false);
+ }
+
+ @Override
+ public IStructureDefinition<?> getStructureDefinition() {
+ return STRUCTURE_DEFINITION.get(getClass());
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ STRUCTURE_DEFINITION.get(getClass())
+ .buildOrHints(
+ this,
+ stackSize,
+ "main",
+ getBaseMetaTileEntity().getWorld(),
+ getExtendedFacing(),
+ getBaseMetaTileEntity().getXCoord(),
+ getBaseMetaTileEntity().getYCoord(),
+ getBaseMetaTileEntity().getZCoord(),
+ 1,
+ 2,
+ 0,
+ hintsOnly);
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder
+ .widget(
+ new SlotWidget(inventoryHandler, 0)
+ .setBackground(
+ getGUITextureSet().getItemSlot(),
+ GT_UITextures.OVERLAY_SLOT_INGOT_STEAM.get(getSteamVariant()))
+ .setPos(33, 15))
+ .widget(
+ new SlotWidget(inventoryHandler, 1)
+ .setBackground(
+ getGUITextureSet().getItemSlot(),
+ GT_UITextures.OVERLAY_SLOT_DUST_STEAM.get(getSteamVariant()))
+ .setPos(33, 33))
+ .widget(
+ new SlotWidget(inventoryHandler, 2)
+ .setBackground(
+ getGUITextureSet().getItemSlot(),
+ GT_UITextures.OVERLAY_SLOT_FURNACE_STEAM.get(getSteamVariant()))
+ .setPos(33, 51))
+ .widget(
+ new SlotWidget(inventoryHandler, 3).setAccess(true, false)
+ .setBackground(
+ getGUITextureSet().getItemSlot(),
+ GT_UITextures.OVERLAY_SLOT_INGOT_STEAM.get(getSteamVariant()))
+ .setPos(85, 24))
+ .widget(
+ new SlotWidget(inventoryHandler, 4).setAccess(true, false)
+ .setBackground(
+ getGUITextureSet().getItemSlot(),
+ GT_UITextures.OVERLAY_SLOT_DUST_STEAM.get(getSteamVariant()))
+ .setPos(103, 24))
+ .widget(
+ new SlotWidget(inventoryHandler, 5).setAccess(true, false)
+ .setBackground(
+ getGUITextureSet().getItemSlot(),
+ GT_UITextures.OVERLAY_SLOT_DUST_STEAM.get(getSteamVariant()))
+ .setPos(121, 24))
+ .widget(
+ new ProgressBar().setTexture(GT_UITextures.PROGRESSBAR_ARROW_2_STEAM.get(getSteamVariant()), 20)
+ .setProgress(() -> (float) mProgresstime / mMaxProgresstime)
+ .setNEITransferRect(
+ getRecipeMap().getFrontend()
+ .getUIProperties().neiTransferRectId)
+ .setPos(58, 24)
+ .setSize(20, 18));
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return GUITextureSet.STEAM.apply(getSteamVariant());
+ }
+
+ @Override
+ public int getTitleColor() {
+ return getSteamVariant() == SteamVariant.BRONZE ? COLOR_TITLE.get() : COLOR_TITLE_WHITE.get();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java
new file mode 100644
index 0000000000..5f818c075b
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ProcessingArray.java
@@ -0,0 +1,545 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.lazy;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.ExoticEnergy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PROCESSING_ARRAY_GLOW;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine.isValidForLowGravity;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ExoticEnergyInputHelper;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_ProcessingArray_Manager;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_StructureUtility;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Item_Machines;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+@Deprecated
+public class GT_MetaTileEntity_ProcessingArray extends
+ GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GT_MetaTileEntity_ProcessingArray> implements ISurvivalConstructable {
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final IStructureDefinition<GT_MetaTileEntity_ProcessingArray> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_ProcessingArray>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ transpose(new String[][] { { "hhh", "hhh", "hhh" }, { "h~h", "h-h", "hhh" }, { "hhh", "hhh", "hhh" }, }))
+ .addElement(
+ 'h',
+ ofChain(
+ lazy(
+ t -> GT_StructureUtility.<GT_MetaTileEntity_ProcessingArray>buildHatchAdder()
+ .atLeastList(t.getAllowedHatches())
+ .casingIndex(48)
+ .dot(1)
+ .build()),
+ onElementPass(t -> t.mCasingAmount++, ofBlock(GregTech_API.sBlockCasings4, 0))))
+ .build();
+
+ private int mCasingAmount = 0;
+
+ private RecipeMap<?> mLastRecipeMap;
+ private ItemStack lastControllerStack;
+ private int tTier = 0;
+ private int mMult = 0;
+ private boolean downtierUEV = true;
+
+ public GT_MetaTileEntity_ProcessingArray(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_ProcessingArray(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ProcessingArray(this.mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Processing Array")
+ .addInfo("Runs supplied machines as if placed in the world")
+ .addInfo("Place up to 64 singleblock GT machines into the controller")
+ .addInfo("Note that you still need to supply power to them all")
+ .addInfo("Use a screwdriver to enable separate input busses")
+ .addInfo("Use a wire cutter to disable UEV+ downtiering")
+ .addInfo("Doesn't work on certain machines, deal with it")
+ .addInfo("Use it if you hate GT++, or want even more speed later on")
+ .addInfo(
+ EnumChatFormatting.GOLD
+ + "On the way to be slowly removed. Use it strictly if you have no alternative.")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoRange("Robust Tungstensteel Machine Casing", 14, 24, false)
+ .addEnergyHatch("Any casing", 1)
+ .addMaintenanceHatch("Any casing", 1)
+ .addInputBus("Any casing", 1)
+ .addInputHatch("Any casing", 1)
+ .addOutputBus("Any casing", 1)
+ .addOutputHatch("Any casing", 1)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ return super.addToMachineList(aTileEntity, aBaseCasingIndex)
+ || addExoticEnergyInputToMachineList(aTileEntity, aBaseCasingIndex);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ if (aActive) return new ITexture[] { BlockIcons.casingTexturePages[0][48], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { BlockIcons.casingTexturePages[0][48], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_PROCESSING_ARRAY_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][48] };
+ }
+
+ private RecipeMap<?> fetchRecipeMap() {
+ if (isCorrectMachinePart(getControllerSlot())) {
+ // Gets the recipe map for the given machine through its unlocalized name
+ return GT_ProcessingArray_Manager
+ .giveRecipeMap(GT_ProcessingArray_Manager.getMachineName(getControllerSlot()));
+ }
+ return null;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return mLastRecipeMap;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return aStack != null && aStack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.");
+ }
+
+ @Override
+ protected void sendStartMultiBlockSoundLoop() {
+ SoundResource sound = GT_ProcessingArray_Manager
+ .getSoundResource(GT_ProcessingArray_Manager.getMachineName(getControllerSlot()));
+ if (sound != null) {
+ sendLoopStart((byte) sound.id);
+ }
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ SoundResource sound = SoundResource.get(aIndex < 0 ? aIndex + 256 : 0);
+ if (sound != null) {
+ GT_Utility.doSoundAtClient(sound, getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ if (!GT_Utility.areStacksEqual(lastControllerStack, getControllerSlot())) {
+ // controller slot has changed
+ lastControllerStack = getControllerSlot();
+ mLastRecipeMap = fetchRecipeMap();
+ setTierAndMult();
+ }
+ if (mLastRecipeMap == null) return SimpleCheckRecipeResult.ofFailure("no_machine");
+ if (mLockedToSingleRecipe && mSingleRecipeCheck != null) {
+ if (mSingleRecipeCheck.getRecipeMap() != mLastRecipeMap) {
+ return SimpleCheckRecipeResult.ofFailure("machine_mismatch");
+ }
+ }
+
+ return super.checkProcessing();
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Nonnull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ if (GT_Mod.gregtechproxy.mLowGravProcessing && recipe.mSpecialValue == -100
+ && !isValidForLowGravity(recipe, getBaseMetaTileEntity().getWorld().provider.dimensionId)) {
+ return SimpleCheckRecipeResult.ofFailure("high_gravity");
+ }
+ if (recipe.mEUt > availableVoltage) return CheckRecipeResultRegistry.insufficientPower(recipe.mEUt);
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ }.setMaxParallelSupplier(this::getMaxParallel);
+ }
+
+ @Override
+ protected boolean canUseControllerSlotForRecipe() {
+ return false;
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(GT_Values.V[tTier] * (mLastRecipeMap != null ? mLastRecipeMap.getAmperage() : 1));
+ logic.setAvailableAmperage(getMaxParallel());
+ logic.setAmperageOC(false);
+ }
+
+ private void setTierAndMult() {
+ IMetaTileEntity aMachine = GT_Item_Machines.getMetaTileEntity(getControllerSlot());
+ if (aMachine instanceof GT_MetaTileEntity_TieredMachineBlock) {
+ tTier = ((GT_MetaTileEntity_TieredMachineBlock) aMachine).mTier;
+ } else {
+ tTier = 0;
+ }
+ mMult = 0;
+ if (downtierUEV && tTier > 9) {
+ tTier--; // Lowers down the tier by 1 to allow for bigger parallel
+ mMult = 2; // Multiplies Parallels by 4x, keeping the energy cost
+ }
+ }
+
+ private int getMaxParallel() {
+ if (getControllerSlot() == null) {
+ return 0;
+ }
+ return getControllerSlot().stackSize << mMult;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (mMachine && aTick % 20 == 0) {
+ for (GT_MetaTileEntity_Hatch_InputBus tInputBus : mInputBusses) {
+ tInputBus.mRecipeMap = mLastRecipeMap;
+ }
+ for (GT_MetaTileEntity_Hatch_Input tInputHatch : mInputHatches) {
+ tInputHatch.mRecipeMap = mLastRecipeMap;
+ }
+ }
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_ProcessingArray> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack aStack, boolean aHintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, aStack, aHintsOnly, 1, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 1, 1, 0, elementBudget, env, false, true);
+ }
+
+ private boolean checkHatches() {
+ return mMaintenanceHatches.size() == 1;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("downtierUEV", downtierUEV);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey("mSeparate")) {
+ // backward compatibility
+ inputSeparation = aNBT.getBoolean("mSeparate");
+ }
+ if (aNBT.hasKey("mUseMultiparallelMode")) {
+ // backward compatibility
+ batchMode = aNBT.getBoolean("mUseMultiparallelMode");
+ }
+ downtierUEV = aNBT.getBoolean("downtierUEV");
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ // Lock to single recipe
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ } else {
+ inputSeparation = !inputSeparation;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.machines.separatebus") + " " + inputSeparation);
+ }
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ batchMode = !batchMode;
+ if (batchMode) {
+ GT_Utility.sendChatToPlayer(aPlayer, "Batch recipes");
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, "Don't batch recipes");
+ }
+ } else {
+ downtierUEV = !downtierUEV;
+ GT_Utility.sendChatToPlayer(aPlayer, "Treat UEV+ machines as multiple UHV " + downtierUEV);
+ }
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ private List<IHatchElement<? super GT_MetaTileEntity_ProcessingArray>> getAllowedHatches() {
+ return ImmutableList.of(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy, ExoticEnergy);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mExoticEnergyHatches.clear();
+ mCasingAmount = 0;
+ return checkPiece(STRUCTURE_PIECE_MAIN, 1, 1, 0) && mCasingAmount >= 14 && checkHatches();
+ }
+
+ @Override
+ public String[] getInfoData() {
+ long storedEnergy = 0;
+ long maxEnergy = 0;
+ for (GT_MetaTileEntity_Hatch tHatch : filterValidMTEs(mExoticEnergyHatches)) {
+ storedEnergy += tHatch.getBaseMetaTileEntity()
+ .getStoredEU();
+ maxEnergy += tHatch.getBaseMetaTileEntity()
+ .getEUCapacity();
+ }
+
+ return new String[] {
+ StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + EnumChatFormatting.RESET
+ + " s",
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(storedEnergy)
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(maxEnergy)
+ + EnumChatFormatting.RESET
+ + " EU",
+ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(-lEUt)
+ + EnumChatFormatting.RESET
+ + " EU/t",
+ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(
+ GT_ExoticEnergyInputHelper.getMaxInputVoltageMulti(getExoticAndNormalEnergyHatchList()))
+ + EnumChatFormatting.RESET
+ + " EU/t(*"
+ + GT_Utility
+ .formatNumbers(GT_ExoticEnergyInputHelper.getMaxInputAmpsMulti(getExoticAndNormalEnergyHatchList()))
+ + "A) "
+ + StatCollector.translateToLocal("GT5U.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + VN[GT_Utility
+ .getTier(GT_ExoticEnergyInputHelper.getMaxInputVoltageMulti(getExoticAndNormalEnergyHatchList()))]
+ + EnumChatFormatting.RESET,
+ StatCollector.translateToLocal("GT5U.multiblock.problems") + ": "
+ + EnumChatFormatting.RED
+ + (getIdealStatus() - getRepairStatus())
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.multiblock.efficiency")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + mEfficiency / 100.0F
+ + EnumChatFormatting.RESET
+ + " %",
+ StatCollector.translateToLocal("GT5U.PA.machinetier") + ": "
+ + EnumChatFormatting.GREEN
+ + tTier
+ + EnumChatFormatting.RESET
+ + " "
+ + StatCollector.translateToLocal("GT5U.PA.discount")
+ + ": "
+ + EnumChatFormatting.GREEN
+ + 1
+ + EnumChatFormatting.RESET
+ + " x",
+ StatCollector.translateToLocal("GT5U.PA.parallel") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(getMaxParallel())
+ + EnumChatFormatting.RESET };
+ }
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsSingleRecipeLocking() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+
+ builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ downtierUEV = !downtierUEV;
+ setTierAndMult();
+ })
+ .setPlayClickSound(true)
+ .setBackground(() -> {
+ if (downtierUEV) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED,
+ GT_UITextures.OVERLAY_BUTTON_DOWN_TIERING_ON };
+ } else {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD,
+ GT_UITextures.OVERLAY_BUTTON_DOWN_TIERING_OFF };
+ }
+ })
+ .setPos(80, 91)
+ .setSize(16, 16)
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.down_tier"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> downtierUEV, val -> downtierUEV = val));
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ if (mLastRecipeMap != null && getControllerSlot() != null) {
+ tag.setString("type", getControllerSlot().getDisplayName());
+ }
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ final NBTTagCompound tag = accessor.getNBTData();
+ if (tag.hasKey("type")) {
+ currentTip.add("Machine: " + EnumChatFormatting.YELLOW + tag.getString("type"));
+ } else {
+ currentTip.add("Machine: " + EnumChatFormatting.YELLOW + "None");
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PyrolyseOven.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PyrolyseOven.java
new file mode 100644
index 0000000000..ff84a69b44
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PyrolyseOven.java
@@ -0,0 +1,263 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockUnlocalizedName;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.Muffler;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PYROLYSE_OVEN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_PYROLYSE_OVEN_GLOW;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofCoil;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.Textures.BlockIcons;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_PyrolyseOven
+ extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_PyrolyseOven> implements ISurvivalConstructable {
+
+ private HeatingCoilLevel coilHeat;
+ private static final int CASING_INDEX = 1090;
+ private static final IStructureDefinition<GT_MetaTileEntity_PyrolyseOven> STRUCTURE_DEFINITION = createStructureDefinition();
+
+ private static IStructureDefinition<GT_MetaTileEntity_PyrolyseOven> createStructureDefinition() {
+ IStructureElement<GT_MetaTileEntity_PyrolyseOven> tCasingElement = NewHorizonsCoreMod.isModLoaded()
+ ? ofBlockUnlocalizedName(NewHorizonsCoreMod.ID, "gt.blockcasingsNH", 2)
+ : ofBlock(GregTech_API.sBlockCasings1, 0);
+
+ return StructureDefinition.<GT_MetaTileEntity_PyrolyseOven>builder()
+ .addShape(
+ "main",
+ transpose(
+ new String[][] { { "ccccc", "ctttc", "ctttc", "ctttc", "ccccc" },
+ { "ccccc", "c---c", "c---c", "c---c", "ccccc" },
+ { "ccccc", "c---c", "c---c", "c---c", "ccccc" },
+ { "bb~bb", "bCCCb", "bCCCb", "bCCCb", "bbbbb" }, }))
+ .addElement('c', onElementPass(GT_MetaTileEntity_PyrolyseOven::onCasingAdded, tCasingElement))
+ .addElement(
+ 'C',
+ ofCoil(GT_MetaTileEntity_PyrolyseOven::setCoilLevel, GT_MetaTileEntity_PyrolyseOven::getCoilLevel))
+ .addElement(
+ 'b',
+ buildHatchAdder(GT_MetaTileEntity_PyrolyseOven.class)
+ .atLeast(OutputBus, OutputHatch, Energy, Maintenance)
+ .casingIndex(CASING_INDEX)
+ .dot(1)
+ .buildAndChain(onElementPass(GT_MetaTileEntity_PyrolyseOven::onCasingAdded, tCasingElement)))
+ .addElement(
+ 't',
+ buildHatchAdder(GT_MetaTileEntity_PyrolyseOven.class).atLeast(InputBus, InputHatch, Muffler)
+ .casingIndex(CASING_INDEX)
+ .dot(1)
+ .buildAndChain(onElementPass(GT_MetaTileEntity_PyrolyseOven::onCasingAdded, tCasingElement)))
+ .build();
+ }
+
+ private int mCasingAmount;
+
+ public GT_MetaTileEntity_PyrolyseOven(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_PyrolyseOven(String aName) {
+ super(aName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Coke Oven")
+ .addInfo("Controller block for the Pyrolyse Oven")
+ .addInfo("Industrial Charcoal producer")
+ .addInfo("Processing speed scales linearly with Coil tier:")
+ .addInfo("CuNi: 50%, FeAlCr: 100%, Ni4Cr: 150%, TPV: 200%, etc.")
+ .addInfo("EU/t is not affected by Coil tier")
+ .addPollutionAmount(getPollutionPerSecond(null))
+ .addSeparator()
+ .beginStructureBlock(5, 4, 5, true)
+ .addController("Front center")
+ .addCasingInfoRange("Pyrolyse Oven Casing", 60, 80, false)
+ .addOtherStructurePart("Heating Coils", "Center 3x1x3 of the bottom layer")
+ .addEnergyHatch("Any bottom layer casing", 1)
+ .addMaintenanceHatch("Any bottom layer casing", 1)
+ .addMufflerHatch("Center 3x1x3 area in top layer", 2)
+ .addInputBus("Center 3x1x3 area in top layer", 2)
+ .addInputHatch("Center 3x1x3 area in top layer", 2)
+ .addOutputBus("Any bottom layer casing", 1)
+ .addOutputHatch("Any bottom layer casing", 1)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ if (sideDirection == facingDirection) {
+ if (active) return new ITexture[] { BlockIcons.casingTexturePages[8][66], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { BlockIcons.casingTexturePages[8][66], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_PYROLYSE_OVEN)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_PYROLYSE_OVEN_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[8][66] };
+ }
+
+ @Override
+ public boolean supportsSingleRecipeLocking() {
+ return true;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.pyrolyseRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ public CheckRecipeResult process() {
+ setSpeedBonus(2f / (1 + coilHeat.getTier()));
+ return super.process();
+ }
+ };
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_PyrolyseOven> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ private void onCasingAdded() {
+ mCasingAmount++;
+ }
+
+ public HeatingCoilLevel getCoilLevel() {
+ return coilHeat;
+ }
+
+ private void setCoilLevel(HeatingCoilLevel aCoilLevel) {
+ coilHeat = aCoilLevel;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ coilHeat = HeatingCoilLevel.None;
+ mCasingAmount = 0;
+ replaceDeprecatedCoils(aBaseMetaTileEntity);
+ return checkPiece("main", 2, 3, 0) && mCasingAmount >= 60
+ && mMaintenanceHatches.size() == 1
+ && !mMufflerHatches.isEmpty();
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getPollutionPerSecond(ItemStack aStack) {
+ return GT_Mod.gregtechproxy.mPollutionPyrolyseOvenPerSecond;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_PyrolyseOven(this.mName);
+ }
+
+ private void replaceDeprecatedCoils(IGregTechTileEntity aBaseMetaTileEntity) {
+ final int xDir = aBaseMetaTileEntity.getBackFacing().offsetX;
+ final int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ;
+ final int tX = aBaseMetaTileEntity.getXCoord() + xDir * 2;
+ final int tY = aBaseMetaTileEntity.getYCoord();
+ final int tZ = aBaseMetaTileEntity.getZCoord() + zDir * 2;
+ for (int xPos = tX - 1; xPos <= tX + 1; xPos++) {
+ for (int zPos = tZ - 1; zPos <= tZ + 1; zPos++) {
+ if (aBaseMetaTileEntity.getBlock(xPos, tY, zPos) == GregTech_API.sBlockCasings1
+ && aBaseMetaTileEntity.getMetaID(xPos, tY, zPos) == 13) {
+ aBaseMetaTileEntity.getWorld()
+ .setBlock(xPos, tY, zPos, GregTech_API.sBlockCasings5, 1, 3);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece("main", stackSize, hintsOnly, 2, 3, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece("main", stackSize, 2, 3, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java
new file mode 100644
index 0000000000..7d038666d6
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_TranscendentPlasmaMixer.java
@@ -0,0 +1,288 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.GT_Values.AuthorColen;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DTPF_OFF;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DTPF_ON;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FUSION1_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.getUserEU;
+import static gregtech.common.misc.WirelessNetworkManager.processInitialSettings;
+import static gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PlasmaForge.DIM_BRIDGE_CASING;
+import static gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PlasmaForge.DIM_INJECTION_CASING;
+import static gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PlasmaForge.DIM_TRANS_CASING;
+import static java.lang.Math.max;
+import static net.minecraft.util.EnumChatFormatting.GOLD;
+import static net.minecraft.util.EnumChatFormatting.GRAY;
+
+import java.math.BigInteger;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.common.items.GT_IntegratedCircuit_Item;
+
+public class GT_MetaTileEntity_TranscendentPlasmaMixer
+ extends GT_MetaTileEntity_EnhancedMultiBlockBase<GT_MetaTileEntity_TranscendentPlasmaMixer>
+ implements ISurvivalConstructable {
+
+ private static final String[][] structure = new String[][] {
+ { " CAC ", " ABA ", " ABA ", " A~A ", " ABA ", " ABA ", " CAC " },
+ { "CBBBC", "A A", "A A", "A A", "A A", "A A", "CBBBC" },
+ { "ABBBA", "B B", "B B", "B B", "B B", "B B", "ABBBA" },
+ { "CBBBC", "A A", "A A", "A A", "A A", "A A", "CBBBC" },
+ { " CAC ", " ABA ", " ABA ", " ABA ", " ABA ", " ABA ", " CAC " } };
+
+ private static final String STRUCTURE_PIECE_MAIN = "MAIN";
+ private static final IStructureDefinition<GT_MetaTileEntity_TranscendentPlasmaMixer> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_TranscendentPlasmaMixer>builder()
+ .addShape(STRUCTURE_PIECE_MAIN, structure)
+ .addElement(
+ 'B',
+ buildHatchAdder(GT_MetaTileEntity_TranscendentPlasmaMixer.class)
+ .atLeast(InputHatch, OutputHatch, InputBus, Maintenance)
+ .casingIndex(DIM_INJECTION_CASING)
+ .dot(1)
+ .buildAndChain(GregTech_API.sBlockCasings1, DIM_INJECTION_CASING))
+ .addElement('A', ofBlock(GregTech_API.sBlockCasings1, DIM_TRANS_CASING))
+ .addElement('C', ofBlock(GregTech_API.sBlockCasings1, DIM_BRIDGE_CASING))
+ .build();
+
+ private UUID ownerUUID;
+
+ public GT_MetaTileEntity_TranscendentPlasmaMixer(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_TranscendentPlasmaMixer(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_TranscendentPlasmaMixer> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Transcendent Mixer")
+ .addInfo("Assisting in all your DTPF needs.")
+ .addInfo("This multiblock will run in parallel according to the circuit provided to the")
+ .addInfo("controller slot. E.g. 3x Circuit #16 = 48x parallel. All inputs will scale,")
+ .addInfo("except time. All EU is deducted from wireless EU networks only.")
+ .addInfo(AuthorColen)
+ .addInfo("Controller slot and circuit slot are separate.")
+ .addSeparator()
+ .beginStructureBlock(5, 7, 5, false)
+ .addStructureInfo(GOLD + "1+ " + GRAY + "Input Hatch")
+ .addStructureInfo(GOLD + "1+ " + GRAY + "Output Hatch")
+ .addStructureInfo(GOLD + "1+ " + GRAY + "Input Bus")
+ .addStructureInfo(GOLD + "1 " + GRAY + "Maintenance Hatch")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_TranscendentPlasmaMixer(mName);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ if (aActive) return new ITexture[] { casingTexturePages[0][DIM_TRANS_CASING], TextureFactory.builder()
+ .addIcon(OVERLAY_DTPF_ON)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FUSION1_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { casingTexturePages[0][DIM_TRANS_CASING], TextureFactory.builder()
+ .addIcon(OVERLAY_DTPF_OFF)
+ .extFacing()
+ .build() };
+ }
+
+ return new ITexture[] { casingTexturePages[0][DIM_TRANS_CASING] };
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ int multiplier = 1;
+ long mWirelessEUt = 0;
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.transcendentPlasmaMixerRecipes;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ mWirelessEUt = 10L * (long) recipe.mEUt * (long) multiplier;
+ if (getUserEU(ownerUUID).compareTo(BigInteger.valueOf(mWirelessEUt * recipe.mDuration)) < 0) {
+ return CheckRecipeResultRegistry.insufficientPower(mWirelessEUt * recipe.mDuration);
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) {
+ mWirelessEUt = 10L * (long) recipe.mEUt * (long) multiplier;
+ // This will void the inputs if wireless energy has dropped
+ // below the required amount between validateRecipe and here.
+ if (!addEUToGlobalEnergyMap(ownerUUID, -mWirelessEUt * recipe.mDuration)) {
+ return CheckRecipeResultRegistry.insufficientPower(mWirelessEUt * recipe.mDuration);
+ }
+ // Energy consumed all at once from wireless net.
+ setCalculatedEut(0);
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return GT_OverclockCalculator.ofNoOverclock(recipe);
+ }
+ }.setMaxParallelSupplier(() -> {
+ ItemStack controllerStack = getControllerSlot();
+ if (controllerStack != null && controllerStack.getItem() instanceof GT_IntegratedCircuit_Item) {
+ multiplier = controllerStack.stackSize * max(1, controllerStack.getItemDamage());
+ }
+ return multiplier;
+ });
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ // The voltage is only used for recipe finding
+ logic.setAvailableVoltage(Long.MAX_VALUE);
+ logic.setAvailableAmperage(1);
+ logic.setAmperageOC(false);
+ }
+
+ @Override
+ protected long getActualEnergyUsage() {
+ return mWirelessEUt;
+ }
+
+ private static final int HORIZONTAL_OFFSET = 2;
+ private static final int VERTICAL_OFFSET = 3;
+ private static final int DEPTH_OFFSET = 0;
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_MAIN, stackSize, hintsOnly, HORIZONTAL_OFFSET, VERTICAL_OFFSET, DEPTH_OFFSET);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ return survivialBuildPiece(
+ STRUCTURE_PIECE_MAIN,
+ stackSize,
+ HORIZONTAL_OFFSET,
+ VERTICAL_OFFSET,
+ DEPTH_OFFSET,
+ elementBudget,
+ env,
+ false,
+ true);
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+
+ // Check the main structure
+ if (!checkPiece(STRUCTURE_PIECE_MAIN, HORIZONTAL_OFFSET, VERTICAL_OFFSET, DEPTH_OFFSET)) {
+ return false;
+ }
+
+ return (mMaintenanceHatches.size() == 1);
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+
+ if (aBaseMetaTileEntity.isServerSide() && (aTick == 1)) {
+ // Adds player to the wireless network if they do not already exist on it.
+ ownerUUID = processInitialSettings(aBaseMetaTileEntity);
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("eMultiplier", multiplier);
+ super.saveNBTData(aNBT);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound aNBT) {
+ multiplier = aNBT.getInteger("eMultiplier");
+ super.loadNBTData(aNBT);
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_VacuumFreezer.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_VacuumFreezer.java
new file mode 100644
index 0000000000..499da54bc3
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_VacuumFreezer.java
@@ -0,0 +1,163 @@
+package gregtech.common.tileentities.machines.multi;
+
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_VACUUM_FREEZER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizon.structurelib.structure.IStructureElement;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_CubicMultiBlockBase;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+
+public class GT_MetaTileEntity_VacuumFreezer
+ extends GT_MetaTileEntity_CubicMultiBlockBase<GT_MetaTileEntity_VacuumFreezer> {
+
+ public GT_MetaTileEntity_VacuumFreezer(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_VacuumFreezer(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_VacuumFreezer(this.mName);
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Vacuum Freezer")
+ .addInfo("Controller Block for the Vacuum Freezer")
+ .addInfo("Cools hot ingots and cells")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 3, true)
+ .addController("Front center")
+ .addCasingInfoRange("Frost Proof Machine Casing", 16, 24, false)
+ .addEnergyHatch("Any casing", 1)
+ .addMaintenanceHatch("Any casing", 1)
+ .addInputHatch("Any casing", 1)
+ .addOutputHatch("Any casing", 1)
+ .addInputBus("Any casing", 1)
+ .addOutputBus("Any casing", 1)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ ITexture[] rTexture;
+ if (side == aFacing) {
+ if (aActive) {
+ rTexture = new ITexture[] { casingTexturePages[0][17], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ } else {
+ rTexture = new ITexture[] { casingTexturePages[0][17], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_VACUUM_FREEZER)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_VACUUM_FREEZER_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ } else {
+ rTexture = new ITexture[] { casingTexturePages[0][17] };
+ }
+ return rTexture;
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.vacuumFreezerRecipes;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic();
+ }
+
+ @Override
+ protected IStructureElement<GT_MetaTileEntity_CubicMultiBlockBase<?>> getCasingElement() {
+ return StructureUtility.ofBlock(GregTech_API.sBlockCasings2, 1);
+ }
+
+ @Override
+ protected List<IHatchElement<? super GT_MetaTileEntity_CubicMultiBlockBase<?>>> getAllowedHatches() {
+ return ImmutableList.of(InputHatch, OutputHatch, InputBus, OutputBus, Maintenance, Energy);
+ }
+
+ @Override
+ protected int getHatchTextureIndex() {
+ return 17;
+ }
+
+ @Override
+ protected int getRequiredCasingCount() {
+ return 16;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/drone/DroneConnection.java b/src/main/java/gregtech/common/tileentities/machines/multi/drone/DroneConnection.java
new file mode 100644
index 0000000000..92b1c65032
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/drone/DroneConnection.java
@@ -0,0 +1,143 @@
+package gregtech.common.tileentities.machines.multi.drone;
+
+import static gregtech.GT_Mod.gregtechproxy;
+
+import java.util.Optional;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Util;
+import gregtech.api.util.GT_Utility;
+
+public class DroneConnection {
+
+ String customName;
+ String unlocalizedName;
+ GT_MetaTileEntity_MultiBlockBase machine;
+ ItemStack machineItem;
+ ChunkCoordinates machineCoord;
+ GT_MetaTileEntity_DroneCentre centre;
+ ChunkCoordinates centreCoord;
+ World world;
+
+ public DroneConnection(GT_MetaTileEntity_MultiBlockBase machine, GT_MetaTileEntity_DroneCentre centre) {
+ this.machine = machine;
+ this.machineItem = machine.getStackForm(1);
+ machineCoord = machine.getBaseMetaTileEntity()
+ .getCoords();
+ this.centre = centre;
+ centreCoord = centre.getBaseMetaTileEntity()
+ .getCoords();
+ this.world = centre.getBaseMetaTileEntity()
+ .getWorld();
+ unlocalizedName = machine.mName;
+ customName = Optional.ofNullable(centre.tempNameList.remove(machineCoord.toString()))
+ .orElse(machine.getLocalName());
+ }
+
+ public DroneConnection(NBTTagCompound aNBT) {
+ NBTTagCompound machineTag = aNBT.getCompoundTag("machine");
+ NBTTagCompound centreTag = aNBT.getCompoundTag("centre");
+ if (!gregtechproxy.isClientSide()) {
+ this.world = DimensionManager.getWorld(aNBT.getInteger("worldID"));
+ } else {
+ this.world = Minecraft.getMinecraft().thePlayer.worldObj;
+ }
+ machineItem = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag("item"));
+ machineCoord = new ChunkCoordinates(
+ machineTag.getInteger("x"),
+ machineTag.getInteger("y"),
+ machineTag.getInteger("z"));
+ this.machine = getLoadedGT_BaseMachineAt(machineCoord, world, true);
+ centreCoord = new ChunkCoordinates(
+ centreTag.getInteger("x"),
+ centreTag.getInteger("y"),
+ centreTag.getInteger("z"));
+ this.centre = (GT_MetaTileEntity_DroneCentre) getLoadedGT_BaseMachineAt(centreCoord, world, true);
+ this.customName = aNBT.getString("name");
+ this.unlocalizedName = aNBT.getString("unlocalizedName");
+ }
+
+ public GT_MetaTileEntity_MultiBlockBase getMachine() {
+ return machine;
+ }
+
+ public boolean reCheckConnection() {
+ if (machine == null) this.machine = getLoadedGT_BaseMachineAt(machineCoord, world, true);
+ if (centre == null)
+ this.centre = (GT_MetaTileEntity_DroneCentre) getLoadedGT_BaseMachineAt(centreCoord, world, true);
+ if (machine != null && centre != null
+ && !centre.getConnectionList()
+ .contains(this))
+ centre.getConnectionList()
+ .add(this);
+ return isValid();
+ }
+
+ public String getCustomName(boolean localized) {
+ if (localized) return GT_LanguageManager.getTranslation("gt.blockmachines." + unlocalizedName + ".name");
+ return customName;
+ }
+
+ public float getDistanceSquared() {
+ return centreCoord.getDistanceSquaredToChunkCoordinates(machineCoord);
+ }
+
+ public void setCustomName(String name) {
+ customName = name;
+ }
+
+ public boolean isMachineShutdown() {
+ return machine != null && machine.shouldDisplayShutDownReason()
+ && !machine.getBaseMetaTileEntity()
+ .isActive()
+ && GT_Utility.isStringValid(
+ machine.getBaseMetaTileEntity()
+ .getLastShutDownReason()
+ .getDisplayString())
+ && machine.getBaseMetaTileEntity()
+ .wasShutdown();
+ }
+
+ public NBTTagCompound transConnectionToNBT() {
+ NBTTagCompound aNBT = new NBTTagCompound();
+ aNBT.setTag("machine", transCoordsToNBT(machineCoord));
+ aNBT.setTag("centre", transCoordsToNBT(centreCoord));
+ aNBT.setTag("item", machineItem.writeToNBT(new NBTTagCompound()));
+ aNBT.setInteger(
+ "worldID",
+ centre.getBaseMetaTileEntity()
+ .getWorld().provider.dimensionId);
+ aNBT.setString("name", getCustomName(false));
+ aNBT.setString("unlocalizedName", unlocalizedName);
+ return aNBT;
+ }
+
+ public GT_MetaTileEntity_MultiBlockBase getLoadedGT_BaseMachineAt(ChunkCoordinates coords, World world,
+ boolean isLoaded) {
+ TileEntity te = GT_Util.getTileEntity(world, coords, isLoaded);
+ if (te == null) return null;
+ return (GT_MetaTileEntity_MultiBlockBase) ((IGregTechTileEntity) te).getMetaTileEntity();
+ }
+
+ private NBTTagCompound transCoordsToNBT(ChunkCoordinates coord) {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setInteger("x", coord.posX);
+ tag.setInteger("y", coord.posY);
+ tag.setInteger("z", coord.posZ);
+ return tag;
+ }
+
+ public boolean isValid() {
+ return machine != null && machine.isValid() && centre != null && centre.isValid();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_DroneCentre.java b/src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_DroneCentre.java
new file mode 100644
index 0000000000..2bb224cdb7
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_DroneCentre.java
@@ -0,0 +1,912 @@
+package gregtech.common.tileentities.machines.multi.drone;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_Values.AuthorSilverMoon;
+import static gregtech.api.multitileentity.multiblock.casing.Glasses.chainAllGlasses;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+
+import java.io.IOException;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import net.minecraft.client.Minecraft;
+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.nbt.NBTTagCompound;
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.google.common.collect.HashMultimap;
+import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.api.math.MainAxisAlignment;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedRow;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.Scrollable;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
+
+import appeng.api.util.DimensionalCoord;
+import appeng.api.util.WorldCoord;
+import appeng.client.render.BlockPosHighlighter;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.api.util.shutdown.ShutDownReasonRegistry;
+import gregtech.common.gui.modularui.widget.ShutDownReasonSyncer;
+import gregtech.common.items.GT_TierDrone;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GT_MetaTileEntity_DroneCentre extends
+ GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GT_MetaTileEntity_DroneCentre> implements ISurvivalConstructable {
+
+ private static final IIconContainer ACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/DRONE_CENTRE_ACTIVE");
+ private static final IIconContainer FACE = new Textures.BlockIcons.CustomIcon("iconsets/DRONE_CENTRE_FACE");
+ private static final IIconContainer INACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/DRONE_CENTRE_INACTIVE");
+ private final int MACHINE_LIST_WINDOW_ID = 10;
+ private final int CUSTOM_NAME_WINDOW_ID = 11;
+ private static final int CASINGS_MIN = 85;
+ private int mCasingAmount = 0;
+ private Vec3Impl centreCoord;
+ private int droneLevel = 0;
+ private int buttonID;
+ private String searchFilter = "";
+ private boolean useRender = true;
+ private boolean showLocalizedName = false;
+ private String sort = "distance";
+ private List<DroneConnection> connectionList = new ArrayList<>();
+ public HashMap<String, String> tempNameList = new HashMap<>();
+ // Save centre by dimID
+ private static final HashMultimap<Integer, GT_MetaTileEntity_DroneCentre> droneMap = HashMultimap.create();
+ // spotless off
+ private static final IStructureDefinition<GT_MetaTileEntity_DroneCentre> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_DroneCentre>builder()
+ .addShape(
+ "main",
+ transpose(
+ new String[][] { { " ", " ", " ", " ", "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" },
+ { "CC~CC", "C C", "C C", "C C", "CAAAC", "CCCCC", "CAAAC", "C C", "CCCCC" },
+ { "CCCCC", "CBBBC", "CBDBC", "CBBBC", "CCCCC", "CCCCC", "CCCCC", "CCCCC", "CCCCC" },
+ { "C C", " ", " ", " ", " ", " ", " ", " ", "C C" } }))
+ .addElement(
+ 'C',
+ buildHatchAdder(GT_MetaTileEntity_DroneCentre.class).atLeast(InputBus)
+ .casingIndex(59)
+ .dot(1)
+ .buildAndChain(
+ onElementPass(
+ GT_MetaTileEntity_DroneCentre::onCasingAdded,
+ ofBlock(GregTech_API.sBlockCasings4, 2))))
+ .addElement('A', chainAllGlasses())
+ .addElement('B', ofBlock(GregTech_API.sBlockCasings1, 11))
+ .addElement('D', ofBlock(GregTech_API.sBlockCasings4, 0))
+ .build();
+
+ // spotless on
+ public GT_MetaTileEntity_DroneCentre(String name) {
+ super(name);
+ }
+
+ public GT_MetaTileEntity_DroneCentre(int ID, String Name, String NameRegional) {
+ super(ID, Name, NameRegional);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_DroneCentre(super.mName);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ if (getBaseMetaTileEntity().isActive()) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(59), TextureFactory.builder()
+ .addIcon(ACTIVE)
+ .extFacing()
+ .build() };
+ } else {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(59), TextureFactory.builder()
+ .addIcon(INACTIVE)
+ .extFacing()
+ .build() };
+ }
+ } else if (side == aFacing.getOpposite()) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(59), TextureFactory.builder()
+ .addIcon(FACE)
+ .extFacing()
+ .build() };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(59) };
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_DroneCentre> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Drone Centre")
+ .addInfo("Drone Center Controller")
+ .addInfo(EnumChatFormatting.AQUA + "Drone #10032, cleared for takeoff!")
+ .addInfo("Monitors multiblock machines in range.")
+ .addInfo("Replace maintenance hatch on other multi with drone downlink module.")
+ .addInfo("Provides maintenance, power control, monitoring and etc.")
+ .addInfo("Range is determined by drone tier: T1-128, T2-512, T3-4096")
+ .addInfo("Place drones in input bus; only one needed to operate.")
+ .addInfo("Automatically upgrade based on the drone level in the input bus.")
+ .addInfo("There is a chance per second that the drone will crash.")
+ .addInfo("Chance is determined by drone tier: T1-1/28800, T2-1/172800, T3-0")
+ .addInfo("If machine is too far, remote control would not available")
+ .addInfo(AuthorSilverMoon)
+ .addSeparator()
+ .beginStructureBlock(5, 4, 9, false)
+ .addController("Front center")
+ .addCasingInfoRange("Stable Titanium Machine Casing", CASINGS_MIN, 91, false)
+ .addCasingInfoExactly("Heat Proof Machine Casing", 8, false)
+ .addCasingInfoExactly("Robust Tungstensteel Machine Casing", 1, false)
+ .addCasingInfoExactly("Any tiered glass", 6, false)
+ .addInputBus("Any Titanium Casing", 1)
+ .addStructureInfo("No maintenance hatch needed")
+ .addSeparator()
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece("main", stackSize, hintsOnly, 2, 1, 0);
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stack, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ return survivialBuildPiece("main", stack, 2, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ protected IAlignmentLimits getInitialAlignmentLimits() {
+ // I don't think a drone can take off HORIZONTALLY!
+ return (d, r, f) -> (d.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0 && r.isNotRotated()
+ && !f.isVerticallyFliped();
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ private void onCasingAdded() {
+ mCasingAmount++;
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ mCasingAmount = 0;
+ return checkPiece("main", 2, 1, 0) && mCasingAmount >= CASINGS_MIN;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ);
+ useRender = !useRender;
+ aPlayer.addChatComponentMessage(
+ new ChatComponentTranslation(
+ "GT5U.machines.dronecentre." + (useRender ? "enableRender" : "disableRender")));
+ if (useRender) {
+ createRenderBlock();
+ } else {
+ destroyRenderBlock();
+ }
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public void stopMachine(@NotNull ShutDownReason reason) {
+ destroyRenderBlock();
+ super.stopMachine(reason);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ fixAll();
+ if (aTick % 20 == 0) {
+ if (switch (droneLevel) {
+ case 1 -> getBaseMetaTileEntity().getRandomNumber(28800);
+ case 2 -> getBaseMetaTileEntity().getRandomNumber(172800);
+ default -> 1;
+ } == 0) {
+ droneLevel = 0;
+ startRecipeProcessing();
+ if (!tryConsumeDrone()) stopMachine(ShutDownReasonRegistry.outOfStuff("Any Drone", 1));
+ endRecipeProcessing();
+ }
+ }
+ // Clean invalid connections every 4 seconds
+ if (aTick % 80 == 0) connectionList.removeIf(v -> !v.isValid());
+ }
+ if (mMaxProgresstime > 0 && mMaxProgresstime - mProgresstime == 1) destroyRenderBlock();
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ droneLevel = aNBT.getInteger("drone");
+ useRender = aNBT.getBoolean("useRender");
+ sort = aNBT.getString("sort");
+ NBTTagCompound nameList = aNBT.getCompoundTag("conList");
+ for (String s : nameList.func_150296_c()) {
+ tempNameList.put(s, nameList.getString(s));
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setInteger("drone", droneLevel);
+ aNBT.setBoolean("useRender", useRender);
+ aNBT.setString("sort", sort);
+ NBTTagCompound conList = new NBTTagCompound();
+ for (DroneConnection con : connectionList) {
+ if (!con.customName.equals(con.machine.getLocalName()))
+ conList.setString(con.machineCoord.toString(), con.customName);
+ }
+ aNBT.setTag("conList", conList);
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ tag.setInteger("connectionCount", connectionList.size());
+ if (droneLevel != 0) tag.setInteger("droneLevel", droneLevel);
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ NBTTagCompound tag = accessor.getNBTData();
+ currenttip.add(
+ EnumChatFormatting.AQUA + StatCollector.translateToLocal("GT5U.waila.drone_downlink.droneLevel")
+ + tag.getInteger("droneLevel"));
+ currenttip.add(
+ StatCollector.translateToLocal("GT5U.waila.drone_downlink.connectionCount")
+ + tag.getInteger("connectionCount"));
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ }
+
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ if (droneLevel == 0) {
+ if (!tryConsumeDrone()) return SimpleCheckRecipeResult.ofFailure("drone_noDrone");
+ }
+ if (droneLevel == 1 || droneLevel == 2) tryUpdateDrone();
+ mMaxProgresstime = 200 * droneLevel;
+ createRenderBlock();
+ return SimpleCheckRecipeResult.ofSuccess("drone_operating");
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (droneMap.containsValue(this)) return;
+ centreCoord = new Vec3Impl(
+ getBaseMetaTileEntity().getXCoord(),
+ getBaseMetaTileEntity().getYCoord(),
+ getBaseMetaTileEntity().getZCoord());
+ droneMap.put(getBaseMetaTileEntity().getWorld().provider.dimensionId, this);
+ }
+ }
+
+ @Override
+ public void onBlockDestroyed() {
+ destroyRenderBlock();
+ connectionList.clear();
+ if (droneLevel != 0) spawnDroneItem();
+ super.onBlockDestroyed();
+ }
+
+ private void spawnDroneItem() {
+ ItemStack insideDrone = new ItemStack(switch (droneLevel) {
+ case 1:
+ yield ItemList.TierdDrone0.getItem();
+ case 2:
+ yield ItemList.TierdDrone1.getItem();
+ case 3:
+ yield ItemList.TierdDrone2.getItem();
+ default:
+ yield null;
+ }, 1);
+ final EntityItem tItemEntity = new EntityItem(
+ getBaseMetaTileEntity().getWorld(),
+ getBaseMetaTileEntity().getXCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F,
+ getBaseMetaTileEntity().getYCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F,
+ getBaseMetaTileEntity().getZCoord() + XSTR_INSTANCE.nextFloat() * 0.8F + 0.1F,
+ insideDrone);
+ tItemEntity.motionX = (XSTR_INSTANCE.nextGaussian() * 0.05D);
+ tItemEntity.motionY = (XSTR_INSTANCE.nextGaussian() * 0.25D);
+ tItemEntity.motionZ = (XSTR_INSTANCE.nextGaussian() * 0.05D);
+ getBaseMetaTileEntity().getWorld()
+ .spawnEntityInWorld(tItemEntity);
+ }
+
+ @Override
+ public void onRemoval() {
+ droneMap.remove(getBaseMetaTileEntity().getWorld().provider.dimensionId, this);
+ }
+
+ public List<DroneConnection> getConnectionList() {
+ return connectionList;
+ }
+
+ public int getRange() {
+ return switch (droneLevel) {
+ case 1 -> 128;
+ case 2 -> 512;
+ case 3 -> 4096;
+ default -> 0;
+ };
+ }
+
+ public Vec3Impl getCoords() {
+ return centreCoord;
+ }
+
+ private boolean tryConsumeDrone() {
+ List<ItemStack> inputs = getStoredInputs();
+ if (inputs.isEmpty()) return false;
+ for (ItemStack item : inputs) {
+ if (item != null && item.getItem() instanceof GT_TierDrone drone) {
+ this.droneLevel = drone.getLevel();
+ item.stackSize--;
+ updateSlots();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void tryUpdateDrone() {
+ List<ItemStack> inputs = getStoredInputs();
+ if (inputs.isEmpty()) return;
+ for (ItemStack item : inputs) {
+ if (item != null && item.getItem() instanceof GT_TierDrone drone) {
+ if (drone.getLevel() <= this.droneLevel) continue;
+ this.droneLevel = drone.getLevel();
+ item.stackSize--;
+ updateSlots();
+ return;
+ }
+ }
+ }
+
+ private void createRenderBlock() {
+ if (!useRender) return;
+ int x = getBaseMetaTileEntity().getXCoord();
+ int y = getBaseMetaTileEntity().getYCoord();
+ int z = getBaseMetaTileEntity().getZCoord();
+
+ double xOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetX;
+ double zOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
+ double yOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetY;
+
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air);
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), GregTech_API.sDroneRender);
+ }
+
+ private void destroyRenderBlock() {
+ int x = getBaseMetaTileEntity().getXCoord();
+ int y = getBaseMetaTileEntity().getYCoord();
+ int z = getBaseMetaTileEntity().getZCoord();
+
+ double xOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetX;
+ double zOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
+ double yOffset = 2 * getExtendedFacing().getRelativeBackInWorld().offsetY;
+
+ this.getBaseMetaTileEntity()
+ .getWorld()
+ .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air);
+ }
+
+ private void fixAll() {
+ this.mWrench = this.mScrewdriver = this.mSoftHammer = this.mHardHammer = this.mCrowbar = this.mSolderingTool = true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ buildContext.addSyncedWindow(MACHINE_LIST_WINDOW_ID, this::createMachineListWindow);
+ buildContext.addSyncedWindow(CUSTOM_NAME_WINDOW_ID, this::createCustomNameWindow);
+ builder.widget(// Machine List
+ new ButtonWidget().setOnClick(
+ (clickData, widget) -> {
+ if (!widget.isClient()) widget.getContext()
+ .openSyncedWindow(MACHINE_LIST_WINDOW_ID);
+ })
+ .setSize(16, 16)
+ .setBackground(() -> {
+ List<UITexture> UI = new ArrayList<>();
+ UI.add(GT_UITextures.BUTTON_STANDARD);
+ UI.add(GT_UITextures.OVERLAY_BUTTON_WHITELIST);
+ return UI.toArray(new IDrawable[0]);
+ })
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_open_list"))
+ .setPos(94, 91)
+ .setEnabled(var -> getBaseMetaTileEntity().isActive()))
+ .widget(// Turn on ALL machines
+ new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (!widget.isClient()) {
+ if (!getBaseMetaTileEntity().isActive()) {
+ widget.getContext()
+ .getPlayer()
+ .addChatComponentMessage(
+ new ChatComponentTranslation("GT5U.machines.dronecentre.shutdown"));
+ return;
+ }
+ for (DroneConnection mte : connectionList) {
+ mte.machine.getBaseMetaTileEntity()
+ .enableWorking();
+ }
+ widget.getContext()
+ .getPlayer()
+ .addChatComponentMessage(new ChatComponentTranslation("GT5U.machines.dronecentre.turnon"));
+ widget.getContext()
+ .getPlayer()
+ .closeScreen();
+ }
+ })
+ .setSize(16, 16)
+ .setBackground(() -> {
+ List<UITexture> UI = new ArrayList<>();
+ UI.add(GT_UITextures.BUTTON_STANDARD);
+ UI.add(GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON);
+ return UI.toArray(new IDrawable[0]);
+ })
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_poweron_all"))
+ .setPos(146, 91)
+ .setEnabled(var -> getBaseMetaTileEntity().isActive()))
+ .widget(// Turn off ALL machines
+ new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (!widget.isClient()) {
+ if (!getBaseMetaTileEntity().isActive()) {
+ widget.getContext()
+ .getPlayer()
+ .addChatComponentMessage(
+ new ChatComponentTranslation("GT5U.machines.dronecentre.shutdown"));
+ return;
+ }
+ for (DroneConnection mte : connectionList) {
+ mte.machine.getBaseMetaTileEntity()
+ .disableWorking();
+ }
+ widget.getContext()
+ .getPlayer()
+ .addChatComponentMessage(new ChatComponentTranslation("GT5U.machines.dronecentre.turnoff"));
+ widget.getContext()
+ .getPlayer()
+ .closeScreen();
+ }
+ })
+ .setSize(16, 16)
+ .setBackground(() -> {
+ List<UITexture> UI = new ArrayList<>();
+ UI.add(GT_UITextures.BUTTON_STANDARD);
+ UI.add(GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF);
+ return UI.toArray(new IDrawable[0]);
+ })
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_poweroff_all"))
+ .setPos(120, 91)
+ .setEnabled(var -> getBaseMetaTileEntity().isActive()))
+ .widget(new FakeSyncWidget.ListSyncer<>(() -> connectionList, var1 -> {
+ connectionList.clear();
+ connectionList.addAll(var1);
+ }, (buffer, j) -> {
+ try {
+ buffer.writeNBTTagCompoundToBuffer(j.transConnectionToNBT());
+ } catch (IOException e) {
+ GT_Log.err.println(e.getCause());
+ }
+ }, buffer -> {
+ try {
+ return new DroneConnection(buffer.readNBTTagCompoundFromBuffer());
+ } catch (IOException e) {
+ GT_Log.err.println(e.getCause());
+ }
+ return null;
+ }));
+ }
+
+ protected ModularWindow createMachineListWindow(final EntityPlayer player) {
+ int heightCoff = getBaseMetaTileEntity().isServerSide() ? 0
+ : Minecraft.getMinecraft().currentScreen.height - 40;
+ ModularWindow.Builder builder = ModularWindow.builder(260, heightCoff);
+ builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
+ builder.setGuiTint(getGUIColorization());
+ builder.widget(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(245, 3));
+ builder.widget(
+ new TextWidget(EnumChatFormatting.BOLD + StatCollector.translateToLocal("GT5U.gui.text.drone_title"))
+ .setScale(2)
+ .setTextAlignment(Alignment.Center)
+ .setPos(0, 10)
+ .setSize(260, 8));
+ // SearchBar
+ builder.widget(new TextFieldWidget() {
+
+ @Override
+ public void onRemoveFocus() {
+ super.onRemoveFocus();
+ syncToServer(2, buffer -> {});
+ }
+
+ // Refresh
+ @Override
+ public void readOnServer(int id, PacketBuffer buf) {
+ switch (id) {
+ case 1 -> super.readOnServer(id, buf);
+ case 2 -> {
+ getContext().closeWindow(MACHINE_LIST_WINDOW_ID);
+ getContext().openSyncedWindow(MACHINE_LIST_WINDOW_ID);
+ }
+ }
+ }
+ }.setGetter(() -> searchFilter)
+ .setSetter(var -> searchFilter = var)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setTextColor(Color.WHITE.dark(1))
+ .setFocusOnGuiOpen(false)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD_LIGHT_GRAY.withOffset(-1, -1, 2, 2))
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.text.drone_search"))
+ .setPos(50, 30)
+ .setSize(200, 16))
+ // Sort button
+ .widget(new ButtonWidget() {
+
+ @Override
+ public ClickResult onClick(int buttonId, boolean doubleClick) {
+ ClickResult result = super.onClick(buttonId, doubleClick);
+ syncToServer(2, buffer -> {});
+ return result;
+ }
+
+ @Override
+ public void readOnServer(int id, PacketBuffer buf) {
+ switch (id) {
+ case 1 -> super.readOnServer(id, buf);
+ case 2 -> {
+ getContext().closeWindow(MACHINE_LIST_WINDOW_ID);
+ getContext().openSyncedWindow(MACHINE_LIST_WINDOW_ID);
+ }
+ }
+ }
+ }.setOnClick((clickData, widget) -> {
+ switch (sort) {
+ case "name" -> sort = "distance";
+ case "distance" -> sort = "error";
+ case "error" -> sort = "name";
+ }
+ })
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_" + sort))
+ .setBackground(
+ () -> new IDrawable[] { GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_SORTING_MODE })
+ .setPos(10, 30)
+ .setSize(16, 16))
+ .widget(new FakeSyncWidget.StringSyncer(() -> sort, var1 -> sort = var1))
+ // Localized Button
+ .widget(new ButtonWidget() {
+
+ @Override
+ public ClickResult onClick(int buttonId, boolean doubleClick) {
+ ClickResult result = super.onClick(buttonId, doubleClick);
+ syncToServer(2, buffer -> {});
+ return result;
+ }
+
+ @Override
+ public void readOnServer(int id, PacketBuffer buf) {
+ switch (id) {
+ case 1 -> super.readOnServer(id, buf);
+ case 2 -> {
+ getContext().closeWindow(MACHINE_LIST_WINDOW_ID);
+ getContext().openSyncedWindow(MACHINE_LIST_WINDOW_ID);
+ }
+ }
+ }
+ }.setOnClick((clickData, widget) -> showLocalizedName = !showLocalizedName)
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_showLocalName"))
+ .setBackground(
+ () -> new IDrawable[] {
+ showLocalizedName ? GT_UITextures.BUTTON_STANDARD_PRESSED : GT_UITextures.BUTTON_STANDARD,
+ GT_UITextures.OVERLAY_BUTTON_CYCLIC })
+ .setPos(30, 30)
+ .setSize(16, 16));
+ // Sort first
+ switch (sort) {
+ case "name" -> connectionList = connectionList.stream()
+ .sorted(
+ (o1, o2) -> Collator.getInstance(Locale.UK)
+ .compare(o1.getCustomName(false), o2.getCustomName(false)))
+ .collect(Collectors.toList());
+ case "distance" -> connectionList = connectionList.stream()
+ .sorted(Comparator.comparing(DroneConnection::getDistanceSquared))
+ .collect(Collectors.toList());
+ case "error" -> connectionList = connectionList.stream()
+ .sorted(
+ Comparator.comparing(DroneConnection::isMachineShutdown)
+ .reversed()
+ .thenComparing(DroneConnection::getDistanceSquared))
+ .collect(Collectors.toList());
+ }
+
+ Scrollable MachineContainer = new Scrollable().setVerticalScroll();
+ int posY = 0;
+ for (int i = 0; i < connectionList.size(); i++) {
+ DroneConnection connection = connectionList.get(i);
+ if (!connection.customName.toLowerCase()
+ .contains(searchFilter.toLowerCase())) continue;
+ ItemStackHandler drawitem = new ItemStackHandler(1);
+ drawitem.setStackInSlot(0, connection.machineItem);
+ DynamicPositionedRow row = new DynamicPositionedRow().setSynced(false);
+ GT_MetaTileEntity_MultiBlockBase coreMachine = connection.machine;
+ int finalI = i;
+ row.widget(
+ SlotWidget.phantom(drawitem, 0)
+ .disableInteraction()
+ .setPos(0, 0))
+ .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ buttonID = finalI;
+ if (!widget.isClient()) widget.getContext()
+ .openSyncedWindow(CUSTOM_NAME_WINDOW_ID);
+ })
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_setname"))
+ .setBackground(
+ () -> new IDrawable[] { GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_PRINT })
+ .setSize(16, 16));
+ // Client can't handle unloaded machines
+ row.widget(
+ new ButtonWidget().setOnClick(
+ (clickData, widget) -> Optional.ofNullable(coreMachine)
+ .ifPresent(machine -> {
+ if (!getBaseMetaTileEntity().isActive()) {
+ player.addChatComponentMessage(
+ new ChatComponentTranslation("GT5U.machines.dronecentre.shutdown"));
+ return;
+ }
+ if (machine.isAllowedToWork()) {
+ machine.disableWorking();
+ } else {
+ machine.enableWorking();
+ }
+ }))
+ .setPlayClickSoundResource(
+ () -> Optional.ofNullable(coreMachine)
+ .filter(GT_MetaTileEntity_MultiBlockBase::isAllowedToWork)
+ .map(var -> SoundResource.GUI_BUTTON_UP.resourceLocation)
+ .orElse(SoundResource.GUI_BUTTON_DOWN.resourceLocation))
+ .setBackground(
+ () -> Optional.ofNullable(coreMachine)
+ .map(
+ machine -> machine.isAllowedToWork()
+ ? new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED,
+ GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON }
+ : new IDrawable[] { GT_UITextures.BUTTON_STANDARD,
+ GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF })
+ .orElse(new IDrawable[] { GT_UITextures.OVERLAY_BUTTON_CROSS }))
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(
+ () -> Optional.ofNullable(coreMachine)
+ .map(GT_MetaTileEntity_MultiBlockBase::isAllowedToWork)
+ .orElse(false),
+ var -> Optional.ofNullable(coreMachine)
+ .ifPresent(machine -> {
+ if (var) machine.enableWorking();
+ else machine.disableWorking();
+ })),
+ builder)
+ .addTooltip(
+ coreMachine != null ? StatCollector.translateToLocal("GT5U.gui.button.power_switch")
+ : StatCollector.translateToLocal("GT5U.gui.button.drone_outofrange"))
+ .setSize(16, 16))
+ .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (widget.isClient()) {
+ highlightMachine(player, connection.machineCoord);
+ player.closeScreen();
+ }
+ })
+ .addTooltip(StatCollector.translateToLocal("GT5U.gui.button.drone_highlight"))
+ .setBackground(
+ new IDrawable[] { GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_INVERT_REDSTONE })
+ .setSize(16, 16));
+ // Show the reason why the machine shutdown
+ row.widget(
+ new DrawableWidget().dynamicTooltip(
+ () -> Collections.singletonList(
+ Optional.ofNullable(coreMachine)
+ .map(
+ machine -> machine.getBaseMetaTileEntity()
+ .getLastShutDownReason()
+ .getDisplayString())
+ .orElse("")))
+ .setBackground(GT_UITextures.PICTURE_STALLED_ELECTRICITY)
+ .setSize(16, 16)
+ .setEnabled(
+ var -> coreMachine != null && coreMachine.shouldDisplayShutDownReason()
+ && !coreMachine.getBaseMetaTileEntity()
+ .isActive()
+ && GT_Utility.isStringValid(
+ coreMachine.getBaseMetaTileEntity()
+ .getLastShutDownReason()
+ .getDisplayString())
+ && coreMachine.getBaseMetaTileEntity()
+ .wasShutdown())
+ .attachSyncer(
+ new ShutDownReasonSyncer(
+ () -> Optional.ofNullable(coreMachine)
+ .map(
+ var -> coreMachine.getBaseMetaTileEntity()
+ .getLastShutDownReason())
+ .orElse(ShutDownReasonRegistry.NONE),
+ reason -> Optional.ofNullable(coreMachine)
+ .ifPresent(
+ machine -> coreMachine.getBaseMetaTileEntity()
+ .setShutDownReason(reason))),
+ builder)
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(
+ () -> Optional.ofNullable(coreMachine)
+ .map(
+ var -> coreMachine.getBaseMetaTileEntity()
+ .wasShutdown())
+ .orElse(false),
+ wasShutDown -> Optional.ofNullable(coreMachine)
+ .ifPresent(
+ machine -> coreMachine.getBaseMetaTileEntity()
+ .setShutdownStatus(wasShutDown))),
+ builder));
+ row.widget(
+ new TextWidget(
+ connectionList.get(i)
+ .getCustomName(showLocalizedName)).setTextAlignment(Alignment.CenterLeft)
+ .setPos(0, 4));
+ MachineContainer.widget(
+ row.setAlignment(MainAxisAlignment.SPACE_BETWEEN)
+ .setSpace(4)
+ .setPos(0, posY));
+ posY += 20;
+ }
+ return builder.widget(
+ MachineContainer.setPos(10, 50)
+ .setSize(240, heightCoff - 60))
+ .setDraggable(false)
+ .build();
+ }
+
+ protected ModularWindow createCustomNameWindow(final EntityPlayer player) {
+ ModularWindow.Builder builder = ModularWindow.builder(150, 40);
+ builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
+ builder.setGuiTint(getGUIColorization());
+ return builder.widget(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(135, 3))
+ .widget(
+ new TextWidget(StatCollector.translateToLocal("GT5U.gui.text.drone_custom_name"))
+ .setTextAlignment(Alignment.Center)
+ .setPos(0, 5)
+ .setSize(150, 8))
+ .widget(new TextFieldWidget() {
+
+ @Override
+ public void onDestroy() {
+ if (isClient()) return;
+ getContext().closeWindow(MACHINE_LIST_WINDOW_ID);
+ getContext().openSyncedWindow(MACHINE_LIST_WINDOW_ID);
+ }
+ }.setGetter(
+ () -> connectionList.get(buttonID)
+ .getCustomName(false))
+ .setSetter(
+ var -> connectionList.get(buttonID)
+ .setCustomName(var))
+ .setTextAlignment(Alignment.CenterLeft)
+ .setTextColor(Color.WHITE.dark(1))
+ .setFocusOnGuiOpen(true)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD_LIGHT_GRAY.withOffset(-1, -1, 2, 2))
+ .setPos(10, 16)
+ .setSize(130, 16))
+ .build();
+ }
+
+ // Just like HIGHLIGHT_INTERFACE (and exactly from it)
+ private void highlightMachine(EntityPlayer player, ChunkCoordinates machineCoord) {
+ DimensionalCoord blockPos = new DimensionalCoord(
+ machineCoord.posX,
+ machineCoord.posY,
+ machineCoord.posZ,
+ player.dimension);
+ WorldCoord blockPos2 = new WorldCoord((int) player.posX, (int) player.posY, (int) player.posZ);
+ BlockPosHighlighter.highlightBlock(
+ blockPos,
+ System.currentTimeMillis() + 500 * WorldCoord.getTaxicabDistance(blockPos, blockPos2));
+ }
+
+ public static HashMultimap<Integer, GT_MetaTileEntity_DroneCentre> getCentreMap() {
+ return droneMap;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_Hatch_DroneDownLink.java b/src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_Hatch_DroneDownLink.java
new file mode 100644
index 0000000000..959b6874ba
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multi/drone/GT_MetaTileEntity_Hatch_DroneDownLink.java
@@ -0,0 +1,340 @@
+package gregtech.common.tileentities.machines.multi.drone;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+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.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.FakePlayer;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.render.TextureFactory;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GT_MetaTileEntity_Hatch_DroneDownLink extends GT_MetaTileEntity_Hatch_Maintenance {
+
+ private Vec3Impl downlinkCoord;
+ private DroneConnection connection;
+ // This has to be existed for doing random damage.
+ private GT_MetaTileEntity_MultiBlockBase machine;
+ private static final IIconContainer moduleActive = new Textures.BlockIcons.CustomIcon(
+ "iconsets/OVERLAY_DRONE_MODULE_ACTIVE");
+
+ public GT_MetaTileEntity_Hatch_DroneDownLink(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_Hatch_DroneDownLink(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures, false);
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { "Built-in powerful navigation beacon!" };
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ super.registerIcons(aBlockIconRegister);
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(moduleActive) };
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return new ITexture[] { aBaseTexture, TextureFactory.of(moduleActive) };
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Hatch_DroneDownLink(
+ this.mName,
+ this.mTier,
+ this.mDescriptionArray,
+ this.mTextures);
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ downlinkCoord = new Vec3Impl(
+ getBaseMetaTileEntity().getXCoord(),
+ getBaseMetaTileEntity().getYCoord(),
+ getBaseMetaTileEntity().getZCoord());
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (hasConnection()) {
+ if (connection.centre.getBaseMetaTileEntity()
+ .isActive()) {
+ doNormalMaintain();
+ } else {
+ // Centre offline? ...do nothing.
+ // doRandomIssue();
+ }
+ } else {
+ // If the connection invalid, set it to null.
+ // Find connection every 10 second
+ if (aTick % 200 == 0) {
+ connection = null;
+ tryFindConnection();
+ // Let's have some "surprise". Sorry, surprise party is over.
+ // if (this.machine != null && this.machine.isValid()) {
+ // doRandomIssue();
+ }
+ }
+ }
+ }
+
+ private void doNormalMaintain() {
+ this.mWrench = this.mScrewdriver = this.mSoftHammer = this.mHardHammer = this.mCrowbar = this.mSolderingTool = true;
+ connection.machine.mWrench = connection.machine.mScrewdriver = connection.machine.mSoftHammer = connection.machine.mHardHammer = connection.machine.mCrowbar = connection.machine.mSolderingTool = true;
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ if (aBaseMetaTileEntity.isClientSide()) return true;
+ if (side == aBaseMetaTileEntity.getFrontFacing()) {
+ if (aPlayer instanceof FakePlayer) return false;
+ if (connection == null || !connection.isValid()) {
+ aPlayer.addChatComponentMessage(new ChatComponentTranslation("GT5U.machines.dronecentre.noconnection"));
+ return false;
+ }
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void onRemoval() {
+ if (hasConnection()) connection.machine = null;
+ }
+
+ private boolean hasConnection() {
+ if (connection == null) return false;
+ if (connection.isValid()) return true;
+ return connection.reCheckConnection();
+ }
+
+ /**
+ * Find a drone connection. This will search for all DC in the same dimension, then find one in range.
+ */
+ private void tryFindConnection() {
+ if (GT_MetaTileEntity_DroneCentre.getCentreMap()
+ .containsKey(getBaseMetaTileEntity().getWorld().provider.dimensionId)) {
+ List<GT_MetaTileEntity_DroneCentre> target = GT_MetaTileEntity_DroneCentre.getCentreMap()
+ .get(getBaseMetaTileEntity().getWorld().provider.dimensionId)
+ .stream()
+ .collect(Collectors.toList());
+ for (GT_MetaTileEntity_DroneCentre centre : target) {
+ if (centre.getCoords()
+ .withinDistance(this.downlinkCoord, centre.getRange())
+ && centre.getBaseMetaTileEntity()
+ .isActive()) {
+ GT_MetaTileEntity_MultiBlockBase machine = tryFindCoreGTMultiBlock();
+ if (machine != null && machine.isValid()) {
+ this.machine = machine;
+ connection = new DroneConnection(machine, centre);
+ connection.centre.getConnectionList()
+ .add(connection);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ private void doRandomIssue() {
+ switch (getBaseMetaTileEntity().getRandomNumber(6)) {
+ case 0 -> machine.mWrench = !machine.mWrench;
+ case 1 -> machine.mScrewdriver = !machine.mScrewdriver;
+ case 2 -> machine.mSoftHammer = !machine.mSoftHammer;
+ case 3 -> machine.mCrowbar = !machine.mCrowbar;
+ case 4 -> machine.mSolderingTool = !connection.machine.mSolderingTool;
+ case 5 -> machine.mHardHammer = !connection.machine.mHardHammer;
+ }
+ }
+
+ // Find mainframe. Mainly from a method in GT_API——This will cause performance issue! Do not call it frequently.
+ private GT_MetaTileEntity_MultiBlockBase tryFindCoreGTMultiBlock() {
+ Queue<ChunkCoordinates> tQueue = new LinkedList<>();
+ Set<ChunkCoordinates> visited = new HashSet<>(80);
+ tQueue.add(
+ this.getBaseMetaTileEntity()
+ .getCoords());
+ World world = this.getBaseMetaTileEntity()
+ .getWorld();
+ while (!tQueue.isEmpty()) {
+ final ChunkCoordinates aCoords = tQueue.poll();
+ final TileEntity tTileEntity;
+ final boolean isMachineBlock;
+ tTileEntity = world.getTileEntity(aCoords.posX, aCoords.posY, aCoords.posZ);
+ Block block = world.getBlock(aCoords.posX, aCoords.posY, aCoords.posZ);
+ // Plascrete block isn't registered as machineBlock, therefore we have to check it manually so that drone
+ // can work with cleanroom.
+ // Todo: loading cleanroom's config for other blocks
+ isMachineBlock = GregTech_API
+ .isMachineBlock(block, world.getBlockMetadata(aCoords.posX, aCoords.posY, aCoords.posZ))
+ || (block == GregTech_API.sBlockReinforced
+ && world.getBlockMetadata(aCoords.posX, aCoords.posY, aCoords.posZ) == 2);
+ // See if the block itself is MultiBlock, also the one we need.
+ if (tTileEntity instanceof IGregTechTileEntity te
+ && te.getMetaTileEntity() instanceof GT_MetaTileEntity_MultiBlockBase mte)
+ if (mte.mMaintenanceHatches.contains(this)) return mte;
+
+ // Now see if we should add the nearby blocks to the queue:
+ // 1) If we've visited less than 5 blocks, then yes
+ // 2) If the tile says we should recursively update (pipes don't, machine blocks do)
+ // 3) If the block at the coordinates is marked as a machine block
+ if (visited.size() < 5
+ || (tTileEntity instanceof IMachineBlockUpdateable
+ && ((IMachineBlockUpdateable) tTileEntity).isMachineBlockUpdateRecursive())
+ || isMachineBlock) {
+ ChunkCoordinates tCoords;
+
+ if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX + 1, aCoords.posY, aCoords.posZ)))
+ tQueue.add(tCoords);
+ if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX - 1, aCoords.posY, aCoords.posZ)))
+ tQueue.add(tCoords);
+ if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY + 1, aCoords.posZ)))
+ tQueue.add(tCoords);
+ if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY - 1, aCoords.posZ)))
+ tQueue.add(tCoords);
+ if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY, aCoords.posZ + 1)))
+ tQueue.add(tCoords);
+ if (visited.add(tCoords = new ChunkCoordinates(aCoords.posX, aCoords.posY, aCoords.posZ - 1)))
+ tQueue.add(tCoords);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+
+ @Override
+ public int getGUIWidth() {
+ return 150;
+ }
+
+ @Override
+ public int getGUIHeight() {
+ return 40;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
+ builder.setGuiTint(getGUIColorization());
+ builder.widget(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(135, 3))
+ .widget(
+ new TextWidget(StatCollector.translateToLocal("GT5U.gui.text.drone_custom_name"))
+ .setTextAlignment(Alignment.Center)
+ .setPos(0, 5)
+ .setSize(150, 8))
+ .widget(
+ new TextFieldWidget().setGetter(() -> connection == null ? "" : connection.getCustomName(false))
+ .setSetter(var -> { if (connection != null) connection.setCustomName(var); })
+ .setTextAlignment(Alignment.CenterLeft)
+ .setTextColor(Color.WHITE.dark(1))
+ .setFocusOnGuiOpen(true)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD_LIGHT_GRAY.withOffset(-1, -1, 2, 2))
+ .setPos(10, 16)
+ .setSize(130, 16))
+ .build();
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ tag.setBoolean("connection", connection == null);
+ if (connection != null) {
+ tag.setInteger("x", connection.centreCoord.posX);
+ tag.setInteger("y", connection.centreCoord.posY);
+ tag.setInteger("z", connection.centreCoord.posZ);
+ tag.setString("name", connection.customName);
+ }
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ NBTTagCompound tag = accessor.getNBTData();
+ if (tag.getBoolean("connection")) {
+ currenttip
+ .add(EnumChatFormatting.RED + StatCollector.translateToLocal("GT5U.waila.drone_downlink.noConnection"));
+ } else {
+ currenttip.add(
+ EnumChatFormatting.AQUA + StatCollector.translateToLocal("GT5U.waila.drone_downlink.connection")
+ + tag.getInteger("x")
+ + " "
+ + tag.getInteger("y")
+ + " "
+ + tag.getInteger("z"));
+ currenttip.add(EnumChatFormatting.YELLOW + tag.getString("name"));
+ }
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalProcessor.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalProcessor.java
new file mode 100644
index 0000000000..87e986f941
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/AdvChemicalProcessor.java
@@ -0,0 +1,508 @@
+package gregtech.common.tileentities.machines.multiblock;
+
+import static com.google.common.primitives.Ints.saturatedCast;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ENERGY_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_OUT;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_OUT;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.NOTHING;
+import static gregtech.api.util.GT_StructureUtilityMuTE.MOTOR_CASINGS;
+import static gregtech.api.util.GT_StructureUtilityMuTE.ofMuTECasings;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidTank;
+
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.Materials;
+import gregtech.api.fluid.FluidTankGT;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.multitileentity.enums.GT_MultiTileCasing;
+import gregtech.api.multitileentity.multiblock.base.ComplexParallelController;
+import gregtech.api.multitileentity.multiblock.casing.Glasses;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_StructureUtility;
+import gregtech.api.util.GT_StructureUtilityMuTE;
+import gregtech.common.tileentities.machines.multiblock.logic.AdvChemicalProcessorProcessingLogic;
+
+public class AdvChemicalProcessor
+ extends ComplexParallelController<AdvChemicalProcessor, AdvChemicalProcessorProcessingLogic> {
+
+ private static IStructureDefinition<AdvChemicalProcessor> STRUCTURE_DEFINITION = null;
+ protected static final String STRUCTURE_PIECE_T1 = "T1";
+ protected static final String STRUCTURE_PIECE_T2 = "T2";
+ protected static final String STRUCTURE_PIECE_T3 = "T3";
+ protected static final String STRUCTURE_PIECE_T4 = "T4";
+ protected static final String STRUCTURE_PIECE_T5_6 = "T5_6";
+ protected static final String STRUCTURE_PIECE_T7_8 = "T7_8";
+ protected static final Vec3Impl STRUCTURE_OFFSET_T1 = new Vec3Impl(3, 1, 0);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T2 = new Vec3Impl(1, 4, -3);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T3 = new Vec3Impl(8, 0, 5);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T4 = new Vec3Impl(-14, 0, 0);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T5 = new Vec3Impl(14, 0, -6);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T6 = new Vec3Impl(-16, 0, 0);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T7 = new Vec3Impl(16, 0, 15);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T8 = new Vec3Impl(-16, 0, 0);
+ protected static final int PROCESS_WINDOW_BASE_ID = 100;
+ protected static final int ITEM_WHITELIST_SLOTS = 8;
+ protected static final int FLUID_WHITELIST_SLOTS = 8;
+ protected static final int MAX_PROCESSES = 8;
+ protected HeatingCoilLevel coilTier;
+ protected final ArrayList<HashSet<String>> processWhitelists = new ArrayList<>(MAX_PROCESSES);
+ protected final ArrayList<ItemStackHandler> processWhitelistInventoryHandlers = new ArrayList<>(MAX_PROCESSES);
+ protected final ArrayList<ArrayList<IFluidTank>> processFluidWhiteLists = new ArrayList<>(MAX_PROCESSES);
+ protected boolean wasWhitelistOpened = false;
+
+ public AdvChemicalProcessor() {
+ super();
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ processWhitelists.add(null);
+ processWhitelistInventoryHandlers.add(new ItemStackHandler(ITEM_WHITELIST_SLOTS));
+ ArrayList<IFluidTank> processFluidTanks = new ArrayList<>(FLUID_WHITELIST_SLOTS);
+ for (int j = 0; j < FLUID_WHITELIST_SLOTS; j++) {
+ processFluidTanks.add(new FluidTankGT());
+ }
+ processFluidWhiteLists.add(processFluidTanks);
+ }
+ setMaxComplexParallels(1, false);
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound nbt) {
+ super.readMultiTileNBT(nbt);
+ setMaxComplexParallels(nbt.getInteger("processors"), false);
+ final NBTTagCompound processWhiteLists = nbt.getCompoundTag("whiteLists");
+ long capacity = 1000;
+ if (nbt.hasKey(GT_Values.NBT.TANK_CAPACITY)) {
+ capacity = saturatedCast(nbt.getLong(GT_Values.NBT.TANK_CAPACITY));
+ }
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+
+ if (processWhiteLists == null) {
+ continue;
+ }
+
+ final NBTTagCompound itemList = processWhiteLists.getCompoundTag("items" + i);
+ if (itemList != null) {
+ processWhitelistInventoryHandlers.get(i)
+ .deserializeNBT(itemList);
+ }
+ final NBTTagList fluidList = processWhiteLists.getTagList("fluids" + i, Constants.NBT.TAG_COMPOUND);
+
+ if (fluidList == null) {
+ continue;
+ }
+
+ for (int j = 0; j < fluidList.tagCount(); j++) {
+ final NBTTagCompound fluid = fluidList.getCompoundTagAt(j);
+
+ if (fluid == null) {
+ continue;
+ }
+
+ short index = fluid.getShort("s");
+ FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(fluid);
+ if (fluidStack != null) {
+ processFluidWhiteLists.get(i)
+ .get(index)
+ .fill(fluidStack, true);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void writeMultiTileNBT(NBTTagCompound nbt) {
+ super.writeMultiTileNBT(nbt);
+ nbt.setInteger("processors", maxComplexParallels);
+ final NBTTagCompound processWhiteLists = new NBTTagCompound();
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ processWhiteLists.setTag(
+ "items" + i,
+ processWhitelistInventoryHandlers.get(i)
+ .serializeNBT());
+ final NBTTagList fluidList = new NBTTagList();
+ for (int j = 0; j < FLUID_WHITELIST_SLOTS; j++) {
+ final FluidStack fluidStack = processFluidWhiteLists.get(i)
+ .get(j)
+ .getFluid();
+ if (fluidStack != null) {
+ final NBTTagCompound tag = new NBTTagCompound();
+ tag.setByte("s", (byte) j);
+ fluidStack.writeToNBT(tag);
+ fluidList.appendTag(tag);
+ }
+ }
+ processWhiteLists.setTag("fluids" + i, fluidList);
+ }
+ nbt.setTag("whiteLists", processWhiteLists);
+ }
+
+ @Override
+ public short getCasingRegistryID() {
+ return GT_MultiTileCasing.Chemical.getRegistryId();
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return GT_MultiTileCasing.Chemical.getId();
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Chemical Reactor")
+ .addInfo("Controller block for the Advanced Chemical Processor")
+ .addInfo("Does not lose efficiency when overclocked")
+ .addInfo("Accepts fluids instead of fluid cells")
+ .addInfo("Can do multiple different recipes at once")
+ .addInfo("By using the whitelist filter a recipe can push its output")
+ .addInfo("to a different recipes input to chain them")
+ .addInfo("Disclaimer: Still WIP - Use at your own risk")
+ .addInfo(GT_Values.Authorminecraft7771)
+ .addSeparator()
+ .beginStructureBlock(5, 3, 3, false)
+ .addController("Front center")
+ .addCasingInfoExactly("PTFE Pipe Machine Casing", 8, false)
+ .addCasingInfoExactly("Heating Coils", 3, true)
+ .addCasingInfoExactly("EV+ Glass", 3, true)
+ .addCasingInfoExactly("Motor Casing", 3, true)
+ .addCasingInfoExactly("Chemical Casing", 27, false)
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public Vec3Impl getStartingStructureOffset() {
+ return STRUCTURE_OFFSET_T1;
+ }
+
+ @Override
+ public boolean checkMachine() {
+ setCoilTier(HeatingCoilLevel.None);
+ buildState.startBuilding(getStartingStructureOffset());
+ if (!checkPiece(STRUCTURE_PIECE_T1, buildState.getCurrentOffset())) return buildState.failBuilding();
+ if (maxComplexParallels > 1) {
+ buildState.addOffset(STRUCTURE_OFFSET_T2);
+ if (!checkPiece(STRUCTURE_PIECE_T2, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 2) {
+ buildState.addOffset(STRUCTURE_OFFSET_T3);
+ if (!checkPiece(STRUCTURE_PIECE_T3, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 3) {
+ buildState.addOffset(STRUCTURE_OFFSET_T4);
+ if (!checkPiece(STRUCTURE_PIECE_T4, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 4) {
+ buildState.addOffset(STRUCTURE_OFFSET_T5);
+ if (!checkPiece(STRUCTURE_PIECE_T5_6, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 5) {
+ buildState.addOffset(STRUCTURE_OFFSET_T6);
+ if (!checkPiece(STRUCTURE_PIECE_T5_6, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 6) {
+ buildState.addOffset(STRUCTURE_OFFSET_T7);
+ if (!checkPiece(STRUCTURE_PIECE_T7_8, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 7) {
+ buildState.addOffset(STRUCTURE_OFFSET_T8);
+ if (!checkPiece(STRUCTURE_PIECE_T7_8, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ buildState.stopBuilding();
+ return super.checkMachine();
+ }
+
+ @Override
+ public void construct(ItemStack trigger, boolean hintsOnly) {
+ buildState.startBuilding(getStartingStructureOffset());
+ buildPiece(STRUCTURE_PIECE_T1, trigger, hintsOnly, buildState.getCurrentOffset());
+ if (maxComplexParallels > 1) {
+ buildState.addOffset(STRUCTURE_OFFSET_T2);
+ buildPiece(STRUCTURE_PIECE_T2, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 2) {
+ buildState.addOffset(STRUCTURE_OFFSET_T3);
+ buildPiece(STRUCTURE_PIECE_T3, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 3) {
+ buildState.addOffset(STRUCTURE_OFFSET_T4);
+ buildPiece(STRUCTURE_PIECE_T4, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 4) {
+ buildState.addOffset(STRUCTURE_OFFSET_T5);
+ buildPiece(STRUCTURE_PIECE_T5_6, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 5) {
+ buildState.addOffset(STRUCTURE_OFFSET_T6);
+ buildPiece(STRUCTURE_PIECE_T5_6, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 6) {
+ buildState.addOffset(STRUCTURE_OFFSET_T7);
+ buildPiece(STRUCTURE_PIECE_T7_8, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 7) {
+ buildState.addOffset(STRUCTURE_OFFSET_T8);
+ buildPiece(STRUCTURE_PIECE_T7_8, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+
+ buildState.stopBuilding();
+ }
+
+ @Override
+ public IStructureDefinition<AdvChemicalProcessor> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<AdvChemicalProcessor>builder()
+ .addShape(
+ STRUCTURE_PIECE_T1,
+ transpose(
+ new String[][] { { "CPCPC", "CCCCC", "CPCPC" }, { "CGC~C", "GWWWU", "CGCCC" },
+ { "CPCPC", "CTTTC", "CPCPC" } }))
+ .addShape(
+ STRUCTURE_PIECE_T2,
+ new String[][] { { " ", " ", " ", " ", " ", " F F ", " B B " },
+ { " ", " ", " ", " ", " ", " F F ", " B B " },
+ { " ", " ", " ", " ", " ", " F F ", " BBB " },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C C ", "BCPPPCB" },
+ { " CBBBC ", " G W G ", " G W G ", " G W G ", " G W G ", " G W G ", "BCPCPCB" },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C C ", "BCPPPCB" },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " ", " ", " ", " ", " ", " ", " BBB " } })
+ .addShape(
+ STRUCTURE_PIECE_T3,
+ new String[][] {
+ { " ", " ", " ", " ", " ", " ", " BBB " },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C CFFF", "BCPPPCBBB" },
+ { " CBBBC ", " G W G ", " G W G ", " G W G ", " G W G ", " G W G ", "BCPCPCB " },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C CFFF", "BCPPPCBBB" },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " ", " ", " ", " ", " ", " ", " BBB " } })
+ .addShape(
+ STRUCTURE_PIECE_T4,
+ new String[][] {
+ { " ", " ", " ", " ", " ", " ", " BBB " },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", "FFFC C ", "BBBCPPPCB" },
+ { " CBBBC ", " G W G ", " G W G ", " G W G ", " G W G ", " G W G ", " BCPCPCB" },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", "FFFC C ", "BBBCPPPCB" },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " ", " ", " ", " ", " ", " ", " BBB " } })
+ .addShape(
+ STRUCTURE_PIECE_T5_6,
+ new String[][] { { " ", " ", " ", " ", " ", " F F ", " " },
+ { " ", " ", " ", " ", " ", " F F ", " B B " },
+ { " ", " ", " ", " ", " ", " F F ", " B B " },
+ { " ", " ", " ", " ", " ", " F F ", " BBB " },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C C ", "BCPPPCB" },
+ { " CBBBC ", " G W G ", " G W G ", " G W G ", " G W G ", " G W G ", "BCPCPCB" },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C C ", "BCPPPCB" },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " ", " ", " ", " ", " ", " ", " BBB " } })
+ .addShape(
+ STRUCTURE_PIECE_T7_8,
+ new String[][] { { " ", " ", " ", " ", " ", " ", " BBB " },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C C ", "BCPPPCB" },
+ { " CBBBC ", " G W G ", " G W G ", " G W G ", " G W G ", " G W G ", "BCPCPCB" },
+ { " BBB ", " C C ", " C C ", " C C ", " C C ", " C C ", "BCPPPCB" },
+ { " C ", " CGC ", " CGC ", " CGC ", " CGC ", " CGC ", " BCCCB " },
+ { " ", " ", " ", " ", " ", " F F ", " BBB " },
+ { " ", " ", " ", " ", " ", " F F ", " B B " },
+ { " ", " ", " ", " ", " ", " F F ", " B B " },
+ { " ", " ", " ", " ", " ", " F F ", " " } })
+ .addElement(
+ 'C',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.Chemical.getCasing()))
+ .addElement('P', ofBlock(GregTech_API.sBlockCasings8, 1))
+ .addElement('T', ofMuTECasings(NOTHING, MOTOR_CASINGS))
+ .addElement(
+ 'W',
+ GT_StructureUtility.ofCoil(AdvChemicalProcessor::setCoilTier, AdvChemicalProcessor::getCoilTier))
+ .addElement('G', Glasses.chainAllGlasses())
+ .addElement('B', ofBlock(GregTech_API.sBlockCasings4, 1))
+ .addElement('F', GT_StructureUtility.ofFrame(Materials.Steel))
+ .addElement(
+ 'U',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.Chemical.getCasing(),
+ GT_StructureUtilityMuTE.INVENTORY_CASINGS))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ protected void setMaxComplexParallels(int parallel, boolean stopMachine) {
+ super.setMaxComplexParallels(parallel, stopMachine);
+ onStructureChange();
+ }
+
+ protected MultiChildWidget createMainPage(IWidgetBuilder<?> builder) {
+ MultiChildWidget child = new MultiChildWidget();
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ final int processIndex = i;
+ child.addChild(
+ new ButtonWidget().setPlayClickSound(true)
+ .setOnClick(
+ (clickData, widget) -> {
+ if (!widget.isClient()) widget.getContext()
+ .openSyncedWindow(PROCESS_WINDOW_BASE_ID + processIndex);
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_WHITELIST)
+ .setSize(18, 18)
+ .setEnabled((widget -> processIndex < maxComplexParallels))
+ .setPos(20 * (i % 4) + 18, 18 + (i / 4) * 20));
+ }
+ child.addChild(
+ new NumericWidget().setGetter(() -> maxComplexParallels)
+ .setSetter(parallel -> setMaxComplexParallels((int) parallel, true))
+ .setBounds(1, MAX_PROCESSES)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("Tier")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(18, 18)
+ .setPos(130, 85));
+ return child;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ final int processIndex = i;
+ buildContext.addSyncedWindow(
+ PROCESS_WINDOW_BASE_ID + i,
+ (player) -> createProcessConfigWindow(player, processIndex));
+ }
+ buildContext.addCloseListener(() -> {
+ // Reset HashSet, we will let it re-generate on next item output
+ if (wasWhitelistOpened) {
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ processWhitelists.set(i, null);
+ }
+ wasWhitelistOpened = false;
+ }
+ });
+ }
+
+ protected ModularWindow createProcessConfigWindow(final EntityPlayer player, final int processIndex) {
+ wasWhitelistOpened = true;
+ ModularWindow.Builder builder = ModularWindow.builder(86, 100);
+ builder.widget(
+ new TextWidget("Process " + processIndex).setTextAlignment(Alignment.Center)
+ .setPos(13, 7));
+ builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
+ builder.widget(
+ SlotGroup.ofItemHandler(processWhitelistInventoryHandlers.get(processIndex), 4)
+ .startFromSlot(0)
+ .endAtSlot(ITEM_WHITELIST_SLOTS - 1)
+ .phantom(true)
+ .background(getGUITextureSet().getItemSlot())
+ .build()
+ .setPos(7, 19));
+ builder.widget(
+ SlotGroup.ofFluidTanks(processFluidWhiteLists.get(processIndex), 4)
+ .startFromSlot(0)
+ .endAtSlot(FLUID_WHITELIST_SLOTS - 1)
+ .phantom(true)
+ .build()
+ .setPos(7, 55));
+ return builder.build();
+ }
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.advchemicalprocessor";
+ }
+
+ @Override
+ public String getLocalName() {
+ return "Advanced Chemical Processor";
+ }
+
+ public void setCoilTier(HeatingCoilLevel coilTier) {
+ this.coilTier = coilTier;
+ }
+
+ public HeatingCoilLevel getCoilTier() {
+ return coilTier;
+ }
+
+ @Override
+ protected boolean hasPerfectOverclock() {
+ return true;
+ }
+
+ protected void generateWhitelist(int processIndex) {
+ HashSet<String> whitelist = new HashSet<>();
+ for (ItemStack itemStack : processWhitelistInventoryHandlers.get(processIndex)
+ .getStacks()) {
+ if (itemStack != null) {
+ whitelist.add(getWhitelistString(itemStack));
+ }
+ }
+ for (IFluidTank tank : processFluidWhiteLists.get(processIndex)) {
+ if (tank.getFluid() != null) {
+ whitelist.add(getWhitelistString(tank.getFluid()));
+ }
+ }
+ processWhitelists.set(processIndex, whitelist);
+ }
+
+ protected String getWhitelistString(ItemStack itemStack) {
+ if (itemStack != null) {
+ return itemStack.getUnlocalizedName();
+ }
+ return null;
+ }
+
+ protected String getWhitelistString(FluidStack fluidStack) {
+ if (fluidStack != null) {
+ return fluidStack.getUnlocalizedName();
+ }
+ return null;
+ }
+
+ @Override
+ @Nonnull
+ protected AdvChemicalProcessorProcessingLogic createProcessingLogic() {
+ return new AdvChemicalProcessorProcessingLogic();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/CokeOven.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/CokeOven.java
new file mode 100644
index 0000000000..06fc7b42b1
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/CokeOven.java
@@ -0,0 +1,153 @@
+package gregtech.common.tileentities.machines.multiblock;
+
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_OUT;
+import static gregtech.api.util.GT_StructureUtilityMuTE.ofMuTECasings;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.multitileentity.enums.GT_MultiTileCasing;
+import gregtech.api.multitileentity.multiblock.base.Controller;
+import gregtech.api.task.tasks.PollutionTask;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.common.tileentities.machines.multiblock.logic.CokeOvenProcessingLogic;
+
+public class CokeOven extends Controller<CokeOven, CokeOvenProcessingLogic> {
+
+ private static IStructureDefinition<CokeOven> STRUCTURE_DEFINITION = null;
+ private static final Vec3Impl OFFSET = new Vec3Impl(1, 1, 0);
+ private static final String MAIN = "Main";
+ private static final int POLLUTION_AMOUNT = 10;
+
+ public CokeOven() {
+ super();
+ setElectric(false);
+ new PollutionTask<>(this).setPollutionPerSecond(POLLUTION_AMOUNT);
+ }
+
+ @Override
+ public void construct(ItemStack trigger, boolean hintsOnly) {
+ buildState.startBuilding(getStartingStructureOffset());
+ buildPiece(MAIN, trigger, hintsOnly, buildState.stopBuilding());
+ }
+
+ @Override
+ public boolean checkMachine() {
+ buildState.startBuilding(getStartingStructureOffset());
+ return checkPiece(MAIN, buildState.stopBuilding());
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack trigger, int elementBudget, ISurvivalBuildEnvironment env) {
+ buildState.startBuilding(getStartingStructureOffset());
+ return survivalBuildPiece(MAIN, trigger, buildState.stopBuilding(), elementBudget, env, false);
+ }
+
+ @Override
+ public short getCasingRegistryID() {
+ return 0;
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return GT_MultiTileCasing.CokeOven.getId();
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Coke Oven")
+ .addInfo("Used for charcoal")
+ .beginStructureBlock(3, 3, 3, true)
+ .addCasingInfoExactly("Coke Oven Bricks", 25, false)
+ .addPollutionAmount(POLLUTION_AMOUNT)
+ .toolTipFinisher(GT_Values.AuthorBlueWeabo);
+ return tt;
+ }
+
+ @Override
+ public Vec3Impl getStartingStructureOffset() {
+ return OFFSET;
+ }
+
+ @Override
+ public IStructureDefinition<CokeOven> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<CokeOven>builder()
+ .addShape(
+ MAIN,
+ new String[][] { { "AAA", "A~A", "AAA" }, { "AAA", "A-A", "AAA" }, { "AAA", "AAA", "AAA" } })
+ .addElement('A', ofMuTECasings(ITEM_IN | ITEM_OUT, GT_MultiTileCasing.CokeOven.getCasing()))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public boolean hasFluidInput() {
+ return false;
+ }
+
+ @Override
+ protected void addTitleTextStyle(ModularWindow.Builder builder, String title) {
+ final int TAB_PADDING = 3;
+ final int TITLE_PADDING = 2;
+ int titleWidth = 0, titleHeight = 0;
+ if (NetworkUtils.isClient()) {
+ final FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
+ final List<String> titleLines = fontRenderer
+ .listFormattedStringToWidth(title, getGUIWidth() - (TAB_PADDING + TITLE_PADDING) * 2);
+ titleWidth = titleLines.size() > 1 ? getGUIWidth() - (TAB_PADDING + TITLE_PADDING) * 2
+ : fontRenderer.getStringWidth(title);
+ titleHeight = titleLines.size() * fontRenderer.FONT_HEIGHT + (titleLines.size() - 1);
+ }
+
+ final DrawableWidget tab = new DrawableWidget();
+ final TextWidget text = new TextWidget(title).setDefaultColor(getTitleColor())
+ .setTextAlignment(Alignment.CenterLeft)
+ .setMaxWidth(titleWidth);
+ if (GT_Mod.gregtechproxy.mTitleTabStyle == 1) {
+ tab.setDrawable(getGUITextureSet().getTitleTabAngular())
+ .setPos(0, -(titleHeight + TAB_PADDING) + 1)
+ .setSize(getGUIWidth(), titleHeight + TAB_PADDING * 2);
+ text.setPos(TAB_PADDING + TITLE_PADDING, -titleHeight + TAB_PADDING);
+ } else {
+ tab.setDrawable(getGUITextureSet().getTitleTabDark())
+ .setPos(0, -(titleHeight + TAB_PADDING * 2) + 1)
+ .setSize(titleWidth + (TAB_PADDING + TITLE_PADDING) * 2, titleHeight + TAB_PADDING * 2 - 1);
+ text.setPos(TAB_PADDING + TITLE_PADDING, -titleHeight);
+ }
+ builder.widget(tab)
+ .widget(text);
+ }
+
+ @Override
+ public String getLocalName() {
+ return StatCollector.translateToLocal("gt.multiBlock.controller.cokeOven");
+ }
+
+ @Override
+ @Nonnull
+ protected CokeOvenProcessingLogic createProcessingLogic() {
+ return new CokeOvenProcessingLogic();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java
new file mode 100644
index 0000000000..326bfcc9ee
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java
@@ -0,0 +1,174 @@
+package gregtech.common.tileentities.machines.multiblock;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.*;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.*;
+import static gregtech.api.util.GT_StructureUtilityMuTE.MOTOR_CASINGS;
+import static gregtech.api.util.GT_StructureUtilityMuTE.ofMuTECasings;
+
+import javax.annotation.Nonnull;
+
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.enums.Materials;
+import gregtech.api.multitileentity.enums.GT_MultiTileCasing;
+import gregtech.api.multitileentity.multiblock.base.StackableController;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_StructureUtility;
+import gregtech.common.tileentities.machines.multiblock.logic.DistillationTowerProcessingLogic;
+
+public class DistillationTower extends StackableController<DistillationTower, DistillationTowerProcessingLogic> {
+
+ private static IStructureDefinition<DistillationTower> STRUCTURE_DEFINITION_MEGA = null;
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA = new Vec3Impl(8, 3, 0);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_START = new Vec3Impl(0, 3, 0);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_STOP = new Vec3Impl(0, 5, 0);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_STACK = new Vec3Impl(0, 3, 0);
+ private static final String STACKABLE_MIDDLE_1 = "STACKABLE_MIDDLE_1";
+ private static final String STACKABLE_MIDDLE_2 = "STACKABLE_MIDDLE_2";
+ private boolean isMega = true;
+
+ @Override
+ public short getCasingRegistryID() {
+ return 0;
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return GT_MultiTileCasing.Distillation.getId();
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Distillation Tower")
+ .addInfo("Controller block for the Distillation Tower")
+ .addInfo("Can be specialised to be a mega structure")
+ .addInfo(GT_Values.Authorminecraft7771)
+ .addSeparator()
+ .beginStructureBlock(5, 3, 3, false)
+ .addController("Front center")
+ .toolTipFinisher("Gregtech");
+ return tt;
+ }
+
+ @Override
+ public Vec3Impl getStartingStructureOffset() {
+ return STRUCTURE_OFFSET_MEGA;
+ }
+
+ @Override
+ public IStructureDefinition<DistillationTower> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION_MEGA == null) {
+ STRUCTURE_DEFINITION_MEGA = StructureDefinition.<DistillationTower>builder()
+ .addShape(
+ STACKABLE_START,
+ transpose(
+ // spotless:off
+ new String[][]{
+ {" "," "," "," "," "," ECCCCCE "," CCCCCCC "," C C "," EC CE "," CC CC "," CC CC ABA "," CC CC B B "," CC CC ABA "," CC CC "," EC CE "," C C "," CCCCCCC "," ECCCCCE "," "},
+ {" "," EEE "," E "," E "," E "," E E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" CCCCC "," CCCCC "," CCCCC "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" CXC~C "," BDDDB "," CBCBC "," B B "," B B "," E B B E "," CCCCCCC "," C C "," EC CE "," C C "," C C AAA "," C C A A "," C C AAA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" CCCCC "," CCCCC "," CCCCC "," "," CCCCCCCCCCC "," CAAAAAAAAAC ","CCCACCCCCCCACCC ","CAACAAAAAAACAAC ","CACAADDDDDAACAC ","CACADDDDDDDACACCCCC","CACADDAAADDACACCCCC","CACADDAAADDACACCCCC","CACADDAAADDACACCCCC","CACADDDDDDDACACCCCC","CACAADDDDDAACAC ","CAACAAAAAAACAAC ","CCCACCCCCCCACCC "," CAAAAAAAAAC "," CCCCCCCCCCC "}
+ }))
+ .addShape(
+ STACKABLE_STOP,
+ transpose(
+ new String[][]{
+ {" "," "," "," "," "," "," "," "," "," "," CCC "," CCC "," CCC "," "," "," "," "," "," "},
+ {" "," "," "," "," "," E E "," E E "," E E "," EEEEAAAAAEEEE "," AAAAAAA "," AA AA "," AA AA "," AA AA "," AAAAAAA "," EEEEAAAAAEEEE "," E E "," E E "," E E "," "},
+ {" "," "," "," "," "," ECCCCCE "," CCCCCCCCC "," CCCCCCCCCCC "," ECCC CCCE "," CCC CCC "," CCC CCC "," CCC CCC "," CCC CCC "," CCC CCC "," ECCC CCCE "," CCCCCCCCCCC "," CCCCCCCCC "," ECCCCCE "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C "," C C "," C C "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C CAAAAA "," C CABBBA "," C CAAAAA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" "," "," "," "," "," ECCCCCE "," CCCCCCC "," C C "," EC CE "," CC CC "," CC CABBBA "," CC C B "," CC CABBBA "," CC CC "," EC CE "," C C "," CCCCCCC "," ECCCCCE "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C CAAABA "," C CAAA B "," C CAAABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C A B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ }))
+ .addShape(
+ STACKABLE_MIDDLE_1,
+ transpose(
+ new String[][]{
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ }))
+ .addShape(
+ STACKABLE_MIDDLE_2,
+ transpose(
+ new String[][]{
+ {" "," "," "," "," "," ECCCCCE "," CCCCCCC "," C C "," EC CE "," CC CC "," CC CC ABA "," CC CC B B "," CC CC ABA "," CC CC "," EC CE "," C C "," CCCCCCC "," ECCCCCE "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ {" "," "," "," "," "," E E "," CCCCCCC "," C C "," EC CE "," C C "," C C ABA "," C C B B "," C C ABA "," C C "," EC CE "," C C "," CCCCCCC "," E E "," "},
+ }))
+ // spotless:on
+ .addElement(
+ 'C',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.Distillation.getCasing()))
+ .addElement('E', GT_StructureUtility.ofFrame(Materials.StainlessSteel))
+ .addElement('A', ofBlock(GregTech_API.sBlockCasings2, 0))
+ .addElement('B', ofBlock(GregTech_API.sBlockCasings2, 13))
+ .addElement('X', ofMuTECasings(NOTHING, MOTOR_CASINGS))
+ .addElement('D', GT_StructureUtility.ofCoil((tile, meta) -> {}, (tile) -> HeatingCoilLevel.None))
+ .build();
+ }
+ return STRUCTURE_DEFINITION_MEGA;
+ }
+
+ @Override
+ public int getFluidOutputCount() {
+ return 12;
+ }
+
+ @Override
+ public int getMinStacks() {
+ return 0;
+ }
+
+ @Override
+ public int getMaxStacks() {
+ return 9;
+ }
+
+ @Override
+ public Vec3Impl getStartingStackOffset() {
+ return STRUCTURE_OFFSET_MEGA_START;
+ }
+
+ @Override
+ public Vec3Impl getPerStackOffset() {
+ return STRUCTURE_OFFSET_MEGA_STACK;
+ }
+
+ @Override
+ public Vec3Impl getAfterLastStackOffset() {
+ return STRUCTURE_OFFSET_MEGA_STOP;
+ }
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.distillationtower";
+ }
+
+ @Override
+ public String getLocalName() {
+ return "Distillation Tower";
+ }
+
+ @Override
+ protected String getStackableMiddle(int stackIndex) {
+ return stackIndex % 2 == 0 ? STACKABLE_MIDDLE_1 : STACKABLE_MIDDLE_2;
+ }
+
+ @Override
+ @Nonnull
+ protected DistillationTowerProcessingLogic createProcessingLogic() {
+ return new DistillationTowerProcessingLogic();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/LaserEngraver.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/LaserEngraver.java
new file mode 100644
index 0000000000..d4a7283f3e
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/LaserEngraver.java
@@ -0,0 +1,305 @@
+package gregtech.common.tileentities.machines.multiblock;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.*;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockUnlocalizedName;
+import static gregtech.api.enums.Mods.*;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.*;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ENERGY_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_OUT;
+import static gregtech.api.util.GT_StructureUtilityMuTE.*;
+
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.multitileentity.enums.GT_MultiTileCasing;
+import gregtech.api.multitileentity.multiblock.base.ComplexParallelController;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_StructureUtility;
+import gregtech.common.tileentities.machines.multiblock.logic.LaserEngraverProcessingLogic;
+
+public class LaserEngraver extends ComplexParallelController<LaserEngraver, LaserEngraverProcessingLogic> {
+
+ private static IStructureDefinition<LaserEngraver> STRUCTURE_DEFINITION = null;
+ protected static final String STRUCTURE_MAIN = "Main";
+ protected static final String STRUCTURE_PIECE_T1 = "T1";
+ protected static final String STRUCTURE_PIECE_T2 = "T2";
+ protected static final String STRUCTURE_PIECE_T3 = "T3";
+ protected static final String STRUCTURE_PIECE_T4 = "T4";
+ protected static final String STRUCTURE_PIECE_T5 = "T5";
+ protected static final String STRUCTURE_PIECE_T6 = "T6";
+ protected static final int PROCESS_WINDOW_BASE_ID = 100;
+ protected static final Vec3Impl STRUCTURE_OFFSET_T1 = new Vec3Impl(3, 1, 0);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T2 = new Vec3Impl(1, 3, 0);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T3 = new Vec3Impl(-6, 0, -5);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T4 = new Vec3Impl(18, 0, 0);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T5 = new Vec3Impl(-18, 0, 9);
+ protected static final Vec3Impl STRUCTURE_OFFSET_T6 = new Vec3Impl(18, 0, 0);
+ protected static final int MAX_PROCESSES = 6;
+ protected RecipeMap<?> recipeMap;
+ private UUID LaserEngraver;
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.laserengraver";
+ }
+
+ @Override
+ public Vec3Impl getStartingStructureOffset() {
+ return STRUCTURE_OFFSET_T1;
+ }
+
+ @Override
+ public boolean checkMachine() {
+ buildState.startBuilding(getStartingStructureOffset());
+ if (!checkPiece(STRUCTURE_PIECE_T1, buildState.getCurrentOffset())) return buildState.failBuilding();
+ if (maxComplexParallels > 1) {
+ buildState.addOffset(STRUCTURE_OFFSET_T2);
+ if (!checkPiece(STRUCTURE_PIECE_T2, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 2) {
+ buildState.addOffset(STRUCTURE_OFFSET_T3);
+ if (!checkPiece(STRUCTURE_PIECE_T3, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 3) {
+ buildState.addOffset(STRUCTURE_OFFSET_T4);
+ if (!checkPiece(STRUCTURE_PIECE_T4, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 4) {
+ buildState.addOffset(STRUCTURE_OFFSET_T5);
+ if (!checkPiece(STRUCTURE_PIECE_T5, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ if (maxComplexParallels > 5) {
+ buildState.addOffset(STRUCTURE_OFFSET_T6);
+ if (!checkPiece(STRUCTURE_PIECE_T6, buildState.getCurrentOffset())) return buildState.failBuilding();
+ }
+ buildState.stopBuilding();
+ return super.checkMachine();
+ }
+
+ @Override
+ public void construct(ItemStack trigger, boolean hintsOnly) {
+ buildState.startBuilding(getStartingStructureOffset());
+ buildPiece(STRUCTURE_PIECE_T1, trigger, hintsOnly, buildState.getCurrentOffset());
+ if (maxComplexParallels > 1) {
+ buildState.addOffset(STRUCTURE_OFFSET_T2);
+ buildPiece(STRUCTURE_PIECE_T2, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 2) {
+ buildState.addOffset(STRUCTURE_OFFSET_T3);
+ buildPiece(STRUCTURE_PIECE_T3, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 3) {
+ buildState.addOffset(STRUCTURE_OFFSET_T4);
+ buildPiece(STRUCTURE_PIECE_T4, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 4) {
+ buildState.addOffset(STRUCTURE_OFFSET_T5);
+ buildPiece(STRUCTURE_PIECE_T5, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ if (maxComplexParallels > 5) {
+ buildState.addOffset(STRUCTURE_OFFSET_T6);
+ buildPiece(STRUCTURE_PIECE_T6, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ buildState.stopBuilding();
+ }
+
+ @Override
+ public IStructureDefinition<LaserEngraver> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<LaserEngraver>builder()
+ .addShape(
+ STRUCTURE_PIECE_T1,
+ transpose(
+ // spotless:off
+ new String[][]{{"ACADA", "AAAAA", "AAAAA"}, {"GGA~A", "H I", "GGAAA"},
+ {"AAAAA", "ABBBA", "AAAAA"}}))
+ .addShape(
+ STRUCTURE_PIECE_T2,
+ new String[][]{{" ", " ", " ", " ", " ", " "},
+ {" K ", " K ", " K ", " ", " ", " "},
+ {" K ", " ", " ", " ", " ", " "},
+ {" K ", " ", " ", " ", " ", " "},
+ {" K ", " ", " ", " ", " ", " "},
+ {" K ", "FBF FBF", " G G ", " G G ", " G G ", "FBF FBF"},
+ {" KKKKK ", "BIB BIB", "G G G G", "G G G G", "G G G G", "BHB BHB"},
+ {" K K ", "FBF FBF", " G G ", " G G ", " G G ", "FBF FBF"},
+ {" K K ", " ", " ", " ", " ", " "},
+ {" K K ", "FBF FBF", " G G ", " G G ", " G G ", "FBF FBF"},
+ {" KKKKK ", "BIB BIB", "G G G G", "G G G G", "G G G G", "BHB BHB"},
+ {" ", "FBF FBF", " G G ", " G G ", " G G ", "FBF FBF",}})
+ .addShape(
+ STRUCTURE_PIECE_T3,
+ new String[][]{
+ {" ", " BBBBB FBF ", " BGGGB G ", " BGGGB G ", " BMLMB G ", " BBBBB FBF "},
+ {" KKKKKKK ", " BBAAABB BIB ", " B B G G ", " B B G G ", " B B G G ", " BBBBBBB BHB "},
+ {" K ", " BABBBAB FBF ", " G G G ", " G G G ", " M HHH M G ", " BBBBBBB FBF "},
+ {"KKKKKK ", " BABIBAB ", " G G ", " G G ", " L HHH L ", " BBBBBBB "},
+ {" K ", " BABBBAB FBF ", " G G G ", " G G G ", " M HHH M G ", " BBBBBBB FBF "},
+ {" KKKKKKK ", " BBAAABB BIB ", " B B G G ", " B B G G ", " B B G G ", " BBBBBBB BHB "},
+ {" ", " BBBBB FBF ", " BGGGB G ", " BGGGB G ", " BMLMB G ", " BBBBB FBF "}})
+ .addShape(
+ STRUCTURE_PIECE_T4,
+ new String[][]{
+ {" ", "FBF BBBBB ", " G BGGGB ", " G BGGGB ", " G BNLNB ", "FBF BBBBB "},
+ {" KKKKKKK ", "BIB BBAAABB ", "G G B B ", "G G B B ", "G G B B ", "BHB BBBBBBB "},
+ {" K ", "FBF BABBBAB ", " G G G ", " G G G ", " G N HHH N ", "FBF BBBBBBB "},
+ {" KKKKKK", " BABIBAB ", " G G ", " G G ", " L HHH L ", " BBBBBBB "},
+ {" K ", "FBF BABBBAB ", " G G G ", " G G G ", " G N HHH N ", "FBF BBBBBBB "},
+ {" KKKKKKK ", "BIB BBAAABB ", "G G B B ", "G G B B ", "G G B B ", "BHB BBBBBBB "},
+ {" ", "FBF BBBBB ", " G BGGGB ", " G BGGGB ", " G BNLNB ", "FBF BBBBB "}})
+ .addShape(
+ STRUCTURE_PIECE_T5,
+ new String[][]{
+ {" ", " BBBBB FBF ", " BGGGB G ", " BGGGB G ", " BOLOB G ", " BBBBB FBF "},
+ {" KKKKKKK ", " BBAAABB BIB ", " B B G G ", " B B G G ", " B B G G ", " BBBBBBB BHB "},
+ {" K ", " BABBBAB FBF ", " G G G ", " G G G ", " O HHH O G ", " BBBBBBB FBF "},
+ {" K ", " BABIBAB ", " G G ", " G G ", " L HHH L ", " BBBBBBB "},
+ {" K ", " BABBBAB FBF ", " G G G ", " G G G ", " O HHH O G ", " BBBBBBB FBF "},
+ {" KKKKKKK ", " BBAAABB BIB ", " B B G G ", " B B G G ", " B B G G ", " BBBBBBB BHB "},
+ {" K ", " BBBBB FBF ", " BGGGB G ", " BGGGB G ", " BOLOB G ", " BBBBB FBF "},
+ {" K ", " ", " ", " ", " "},
+ {" K ", " ", " ", " ", " "},
+ {" K ", " ", " ", " ", " "}})
+ .addShape(
+ STRUCTURE_PIECE_T6,
+ new String[][]{
+ {" ", "FBF BBBBB ", " G BGGGB ", " G BGGGB ", " G BPLPB ", "FBF BBBBB "},
+ {" KKKKKKK ", "BIB BBAAABB ", "G G B B ", "G G B B ", "G G B B ", "BHB BBBBBBB "},
+ {" K ", "FBF BABBBAB ", " G G G ", " G G G ", " G P HHH P ", "FBF BBBBBBB "},
+ {" K ", " BABIBAB ", " G G ", " G G ", " L HHH L ", " BBBBBBB "},
+ {" K ", "FBF BABBBAB ", " G G G ", " G G G ", " G P HHH P ", "FBF BBBBBBB "},
+ {" KKKKKKK ", "BIB BBAAABB ", "G G B B ", "G G B B ", "G G B B ", "BHB BBBBBBB "},
+ {" K ", "FBF BBBBB ", " G BGGGB ", " G BGGGB ", " G BPLPB ", "FBF BBBBB "},
+ {" K ", " ", " ", " ", " "},
+ {" K ", " ", " ", " ", " "},
+ {" K ", " ", " ", " ", " "}})
+ // spotless:on
+ .addElement(
+ 'A',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.LaserEngraver.getCasing()))
+ .addElement(
+ 'B',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.BlackLaserEngraverCasing.getCasing()))
+ .addElement(
+ 'C',
+ ofMuTECasings(NOTHING, CLEANROOM_CASINGS, GT_MultiTileCasing.LaserEngraver.getCasing()))
+ .addElement('D', ofMuTECasings(NOTHING, WIRELESS_CASINGS, GT_MultiTileCasing.LaserEngraver.getCasing()))
+ .addElement('E', ofMuTECasings(NOTHING, MOTOR_CASINGS))
+ .addElement('F', GT_StructureUtility.ofFrame(Materials.Naquadah)
+
+ )
+ .addElement('H', ofMuTECasings(NOTHING, GT_MultiTileCasing.Mirror.getCasing()))
+
+ .addElement(
+ 'G',
+ ofChain(
+ ofBlockUnlocalizedName(IndustrialCraft2.ID, "blockAlloyGlass", 0, true),
+ ofBlockUnlocalizedName(BartWorks.ID, "BW_GlasBlocks", 0, true),
+ ofBlockUnlocalizedName(BartWorks.ID, "BW_GlasBlocks2", 0, true),
+ ofBlockUnlocalizedName(Thaumcraft.ID, "blockCosmeticOpaque", 2, false)))
+ .addElement('I', ofMuTECasings(NOTHING, EMITTER_CASINGS))
+ .addElement('K', ofBlock(GregTech_API.sBlockCasings3, 11))
+ .addElement('L', ofMuTECasings(NOTHING, ROBOT_ARM_CASINGS))
+ .addElement('M', ofMuTECasings(NOTHING, GT_MultiTileCasing.LaserEngraverUpgrade1.getCasing()))
+ .addElement('N', ofMuTECasings(NOTHING, GT_MultiTileCasing.LaserEngraverUpgrade2.getCasing()))
+ .addElement('O', ofMuTECasings(NOTHING, GT_MultiTileCasing.LaserEngraverUpgrade3.getCasing()))
+ .addElement('P', ofMuTECasings(NOTHING, GT_MultiTileCasing.LaserEngraverUpgrade4.getCasing()))
+ .build();
+ buildState.stopBuilding();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ protected MultiChildWidget createMainPage(IWidgetBuilder<?> builder) {
+ MultiChildWidget child = new MultiChildWidget();
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ final int processIndex = i;
+ child.addChild(
+ new ButtonWidget().setPlayClickSound(true)
+ .setOnClick(
+ (clickData, widget) -> {
+ if (!widget.isClient()) widget.getContext()
+ .openSyncedWindow(PROCESS_WINDOW_BASE_ID + processIndex);
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_WHITELIST)
+ .setSize(18, 18)
+ .setEnabled((widget -> processIndex < maxComplexParallels))
+ .setPos(20 * (i % 4) + 18, 18 + (i / 4) * 20));
+ }
+ child.addChild(
+ new NumericWidget().setGetter(() -> maxComplexParallels)
+ .setSetter(parallel -> setMaxComplexParallels((int) parallel, true))
+ .setBounds(1, MAX_PROCESSES)
+ .setTextColor(Color.WHITE.normal)
+ .setTextAlignment(Alignment.Center)
+ .addTooltip("Tier")
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setSize(18, 18)
+ .setPos(130, 85));
+ return child;
+ }
+
+ @Override
+ public short getCasingRegistryID() {
+ return 0;
+ }
+
+ @Override
+ public void readMultiTileNBT(NBTTagCompound nbt) {
+ super.readMultiTileNBT(nbt);
+ setMaxComplexParallels(nbt.getInteger("processors"), false);
+ }
+
+ @Override
+ public void writeMultiTileNBT(NBTTagCompound nbt) {
+ super.writeMultiTileNBT(nbt);
+ nbt.setInteger("processors", maxComplexParallels);
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return GT_MultiTileCasing.LaserEngraver.getId();
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Laser Engraver")
+ .addInfo("Used for Engraving")
+ .addSeparator()
+ .beginStructureBlock(3, 3, 5, true)
+ .addController("Front right center")
+ .toolTipFinisher(GT_Values.AuthorTheEpicGamer274);
+ return tt;
+ }
+
+ @Override
+ @Nonnull
+ protected LaserEngraverProcessingLogic createProcessingLogic() {
+ return new LaserEngraverProcessingLogic();
+ }
+
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/LayeredCokeBattery.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/LayeredCokeBattery.java
new file mode 100644
index 0000000000..3b00708e40
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/LayeredCokeBattery.java
@@ -0,0 +1,295 @@
+package gregtech.common.tileentities.machines.multiblock;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.*;
+import static gregtech.api.enums.Mods.*;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ENERGY_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_OUT;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_OUT;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.NOTHING;
+import static gregtech.api.util.GT_StructureUtilityMuTE.AMPERAGE_CASINGS;
+import static gregtech.api.util.GT_StructureUtilityMuTE.HEATER_CASINGS;
+import static gregtech.api.util.GT_StructureUtilityMuTE.INSULATOR_CASINGS;
+import static gregtech.api.util.GT_StructureUtilityMuTE.MOTOR_CASINGS;
+import static gregtech.api.util.GT_StructureUtilityMuTE.ofMuTECasings;
+
+import java.util.Arrays;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.multitileentity.enums.GT_MultiTileCasing;
+import gregtech.api.multitileentity.multiblock.base.StackableModularController;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_StructureUtility;
+import gregtech.api.util.GT_StructureUtilityMuTE.UpgradeCasings;
+import gregtech.common.tileentities.machines.multiblock.logic.LayeredCokeBatteryProcessingLogic;
+
+public class LayeredCokeBattery
+ extends StackableModularController<LayeredCokeBattery, LayeredCokeBatteryProcessingLogic> {
+
+ private static IStructureDefinition<LayeredCokeBattery> STRUCTURE_DEFINITION_MEGA = null;
+ protected static final String STRUCTURE_PIECE_BASE = "T1";
+ private static final Vec3Impl STRUCTURE_OFFSET_BASE = new Vec3Impl(2, 2, 0);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_POSITION = new Vec3Impl(4, 7, -4);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_START = new Vec3Impl(0, 0, -3);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_STACK = new Vec3Impl(0, 0, -2);
+ private static final Vec3Impl STRUCTURE_OFFSET_MEGA_STOP = new Vec3Impl(0, 0, -1);
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.layeredcokebattery";
+ }
+
+ @Override
+ public String getLocalName() {
+ return "Layered Coke Battery";
+ }
+
+ @Override
+ public Vec3Impl getStartingStructureOffset() {
+ return STRUCTURE_OFFSET_BASE;
+ }
+
+ public UpgradeCasings getBaseMucType() {
+ return UpgradeCasings.Heater;
+ }
+
+ public int getParallelFactor() {
+ return 2;
+ }
+
+ @Override
+ public void construct(ItemStack trigger, boolean hintsOnly) {
+ final int blueprintCount = (trigger.stackSize - 1) + getMinStacks();
+ final int stackCount = Math.min(blueprintCount, getMaxStacks());
+
+ buildState.startBuilding(getStartingStructureOffset());
+ buildPiece(STRUCTURE_PIECE_BASE, trigger, hintsOnly, buildState.getCurrentOffset());
+ buildState.addOffset(getMegaPositionOffset());
+
+ if (stackCount >= 1) {
+ buildPiece(STACKABLE_START, trigger, hintsOnly, buildState.getCurrentOffset());
+ buildState.addOffset(getStartingStackOffset());
+
+ for (int i = 0; i < stackCount; i++) {
+ buildPiece(STACKABLE_MIDDLE, trigger, hintsOnly, buildState.getCurrentOffset());
+ buildState.addOffset(getPerStackOffset());
+ }
+ if (hasTop()) {
+ buildPiece(STACKABLE_STOP, trigger, hintsOnly, buildState.getCurrentOffset());
+ }
+ }
+
+ buildState.stopBuilding();
+ }
+
+ @Override
+ public IStructureDefinition<LayeredCokeBattery> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION_MEGA == null) {
+ STRUCTURE_DEFINITION_MEGA = StructureDefinition.<LayeredCokeBattery>builder()
+ .addShape(
+ STRUCTURE_PIECE_BASE,
+ transpose(
+ new String[][] { { " AAA ", "AAAAA", "AEEEP", "AAAAA" }, { " AAA ", "A A", "A A", "AAAAA" },
+ { " A~A ", "A A", "A A", "AAAAA" }, { " AAA ", "A A", "A A", "AAAAA" },
+ { " AAA ", "AAAAA", "AAAAA", "AAAAA" } }))
+ .addShape(
+ STACKABLE_STOP,
+ transpose(
+ new String[][] { { "AHFFFFAFFFFHA", "AAAAAAAAAAAAA" }, { " B B B B B B ", "AFAFAFAFAFAFA" },
+ { "HB B B B B BH", "AFAFAFAFAFAFA" }, { " B B B B B B ", "AFAFAFAFAFAFA" },
+ { " B B B B B B ", "AFAFAFAFAFAFA" }, { " B B B B B B ", "AFAFAFAFAFAFA" },
+ { " B B B B B B ", "AFAFAFAFAFAFA" }, { " B B B B B B ", "AFAFAFAFAFAFA" },
+ { " B B B B B B ", "AFAFAFAFAFAFA" }, { "HB B B B B BH", "AFAFAFAFAFAFA" },
+ { " B B B B B B ", "AFAFAFAFAFAFA" }, { "AAAAAAAAAAAAA", "AAAAAAAAAAAAA" } }))
+ .addShape(
+ STACKABLE_MIDDLE,
+ transpose(
+ new String[][] { { "AHFFFFAFFFFHA", "AAAAAAAAAAAAA" }, { " B A B ", "AAAAAAAAAAAAA" },
+ { "HB A BH", "AAAAAAAAAAAAA" }, { " B A B ", "AAAAAAAAAAAAA" },
+ { " B A B ", "AAAAAAAAAAAAA" }, { " B A B ", "AAAAAAAAAAAAA" },
+ { " B A B ", "AAAAAAAAAAAAA" }, { " B A B ", "AAAAAAAAAAAAA" },
+ { " B A B ", "AAAAAAAAAAAAA" }, { "HB A BH", "AAAAAAAAAAAAA" },
+ { " B A B ", "AAAAAAAAAAAAA" }, { "AAAAAAAAAAAAA", "AAAAAAAAAAAAA" } }))
+ .addShape(
+ STACKABLE_START,
+ transpose(
+ new String[][] { { "AAAAAAAAAAAAA", "AHFFFFAFFFFHA", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", "HB B B B B BH", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", "HB B B B B BH", "AAAAAAAAAAAAA" },
+ { "AFAFAFAFAFAFA", " B B B B B B ", "AAAAAAAAAAAAA" },
+ { "AAAAAAAAAAAAA", "AAAAAAAAAAAAA", "AAAAAAAAAAAAA" } }))
+ .addElement(
+ 'A',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.Chemical.getCasing()))
+ .addElement(
+ 'B',
+ ofMuTECasings(
+ FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT | ENERGY_IN,
+ GT_MultiTileCasing.Distillation.getCasing()))
+ .addElement('C', ofBlock(GregTech_API.sBlockCasings4, 1))
+ .addElement('D', GT_StructureUtility.ofFrame(Materials.Steel))
+ .addElement('E', ofMuTECasings(NOTHING, MOTOR_CASINGS))
+ .addElement(
+ 'F',
+ ofChain(
+ ofBlockUnlocalizedName(IndustrialCraft2.ID, "blockAlloyGlass", 0, true),
+ ofBlockUnlocalizedName(BartWorks.ID, "BW_GlasBlocks", 0, true),
+ ofBlockUnlocalizedName(BartWorks.ID, "BW_GlasBlocks2", 0, true),
+ ofBlockUnlocalizedName(Thaumcraft.ID, "blockCosmeticOpaque", 2, false)))
+ .addElement('H', ofMuTECasings(NOTHING, HEATER_CASINGS, INSULATOR_CASINGS))
+ .addElement('P', ofMuTECasings(NOTHING, AMPERAGE_CASINGS))
+ .build();
+ }
+ return STRUCTURE_DEFINITION_MEGA;
+ }
+
+ public boolean checkMachine() {
+ stackCount = 0;
+ resetMucCount();
+
+ buildState.startBuilding(getStartingStructureOffset());
+ if (!checkPiece(STRUCTURE_PIECE_BASE, buildState.getCurrentOffset())) return buildState.failBuilding();
+
+ buildState.addOffset(getMegaPositionOffset());
+ if (!checkPiece(STACKABLE_START, buildState.getCurrentOffset())) {
+ return buildState.failBuilding();
+ }
+
+ buildState.addOffset(getStartingStackOffset());
+ for (int i = 0; i < getMaxStacks(); i++) {
+ if (!checkPiece(getStackableMiddle(i), buildState.getCurrentOffset())) {
+ break;
+ }
+
+ buildState.addOffset(getPerStackOffset());
+ stackCount++;
+ }
+ if (stackCount < getMinStacks()) return buildState.failBuilding();
+
+ if (!checkPiece(getStackableStop(), buildState.stopBuilding())) {
+ return buildState.failBuilding();
+ }
+
+ calculateTier();
+ if (!calculateMucMultipliers()) {
+ return false;
+ }
+ calculateParallels();
+ updatePowerLogic();
+ return tier > 0;
+ }
+
+ protected boolean calculateMucMultipliers() {
+ Map<UpgradeCasings, int[]> mucMap = getMucMap();
+ int[] heaterList = mucMap.get(UpgradeCasings.Heater);
+ int[] insulatorList = mucMap.get(UpgradeCasings.Insulator);
+ int totalHeaterCount = Arrays.stream(heaterList)
+ .sum();
+ int totalInsulatorCount = Arrays.stream(insulatorList)
+ .sum();
+ if (totalHeaterCount + totalInsulatorCount < stackCount || totalInsulatorCount > totalHeaterCount) {
+ return false;
+ }
+ if (totalInsulatorCount > 0) {
+ // To be improved later, when more MUCs are added
+ // durationMultiplier = 1.0 / totalHeaterCount;
+ euTickMultiplier = 1.0 / totalInsulatorCount;
+ }
+ return true;
+ }
+
+ @Override
+ public short getCasingRegistryID() {
+ return 0;
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return GT_MultiTileCasing.Distillation.getId();
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Coke Oven")
+ .addInfo("Controller for the Layered Coke Battery")
+ .addSeparator()
+ .beginVariableStructureBlock(7, 9, 2 + getMinStacks(), 2 + getMaxStacks(), 7, 9, true)
+ .addController("Bottom Front Center")
+ .addCasingInfoExactly("Test Casing", 60, false)
+ .addEnergyHatch("Any bottom layer casing")
+ .addInputHatch("Any non-optional external facing casing on the stacks")
+ .addInputBus("Any non-optional external facing casing on the stacks")
+ .addOutputHatch("Any non-optional external facing casing on the stacks")
+ .addOutputBus("Any non-optional external facing casing on the stacks")
+ .addStructureInfo(
+ String.format("Stackable middle stacks between %d-%d time(s).", getMinStacks(), getMaxStacks()))
+ .toolTipFinisher("Wildcard");
+ return tt;
+ }
+
+ @Override
+ public int getMinStacks() {
+ return 0;
+ }
+
+ @Override
+ public int getMaxStacks() {
+ return 20;
+ }
+
+ public Vec3Impl getMegaPositionOffset() {
+ return STRUCTURE_OFFSET_MEGA_POSITION;
+ }
+
+ @Override
+ public Vec3Impl getStartingStackOffset() {
+ return STRUCTURE_OFFSET_MEGA_START;
+ }
+
+ @Override
+ public Vec3Impl getPerStackOffset() {
+ return STRUCTURE_OFFSET_MEGA_STACK;
+ }
+
+ @Override
+ public Vec3Impl getAfterLastStackOffset() {
+ return STRUCTURE_OFFSET_MEGA_STOP;
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ protected ResourceLocation getActivitySoundLoop() {
+ return SoundResource.IC2_MACHINES_MACERATOR_OP.resourceLocation;
+ }
+
+ @Override
+ @Nonnull
+ protected LayeredCokeBatteryProcessingLogic createProcessingLogic() {
+ return new LayeredCokeBatteryProcessingLogic();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/Macerator.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/Macerator.java
new file mode 100644
index 0000000000..dfdacfe7f2
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/Macerator.java
@@ -0,0 +1,132 @@
+package gregtech.common.tileentities.machines.multiblock;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ENERGY_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.FLUID_OUT;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_IN;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.ITEM_OUT;
+import static gregtech.api.multitileentity.multiblock.base.MultiBlockPart.NOTHING;
+import static gregtech.api.util.GT_StructureUtilityMuTE.*;
+
+import javax.annotation.Nonnull;
+
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+
+import gregtech.api.multitileentity.enums.GT_MultiTileCasing;
+import gregtech.api.multitileentity.multiblock.base.StackableController;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.common.tileentities.machines.multiblock.logic.MaceratorProcessingLogic;
+
+public class Macerator extends StackableController<Macerator, MaceratorProcessingLogic> {
+
+ private static IStructureDefinition<Macerator> STRUCTURE_DEFINITION = null;
+
+ public Macerator() {
+ super();
+ }
+
+ @Override
+ public String getTileEntityName() {
+ return "gt.multitileentity.multiblock.macerator";
+ }
+
+ @Override
+ public IStructureDefinition<Macerator> getStructureDefinition() {
+ if (STRUCTURE_DEFINITION == null) {
+ STRUCTURE_DEFINITION = StructureDefinition.<Macerator>builder()
+ .addShape(
+ STACKABLE_STOP,
+ transpose(new String[][] { { " CCC ", "CCCCC", "CCCCC", "CCCCC", " CCC " }, }))
+ .addShape(
+ STACKABLE_MIDDLE,
+ transpose(new String[][] { { " BBB ", " B---B ", "DC---CD", " B---B ", " BBB " }, }))
+ .addShape(
+ STACKABLE_START,
+ transpose(new String[][] { { " G~F ", "AAAAA", "AAAAA", "AAAAA", " AAA " }, }))
+ .addElement('A', ofMuTECasings(ENERGY_IN, GT_MultiTileCasing.Macerator.getCasing()))
+ .addElement(
+ 'B',
+ ofMuTECasings(FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT, GT_MultiTileCasing.Macerator.getCasing()))
+ .addElement('C', ofMuTECasings(NOTHING, GT_MultiTileCasing.Macerator.getCasing()))
+ .addElement('D', ofMuTECasings(NOTHING, GT_MultiTileCasing.Macerator.getCasing()))
+ .addElement('F', ofMuTECasings(NOTHING, MOTOR_CASINGS))
+ .addElement('G', ofMuTECasings(NOTHING, INVENTORY_CASINGS))
+ .build();
+ }
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public short getCasingRegistryID() {
+ return 0;
+ }
+
+ @Override
+ public int getCasingMeta() {
+ return 18000;
+ }
+
+ @Override
+ public boolean hasTop() {
+ return true;
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Macerator")
+ .addInfo("Controller for the Macerator")
+ .addSeparator()
+ .beginVariableStructureBlock(7, 9, 2 + getMinStacks(), 2 + getMaxStacks(), 7, 9, true)
+ .addController("Bottom Front Center")
+ .addCasingInfoExactly("Test Casing", 60, false)
+ .addEnergyHatch("Any bottom layer casing")
+ .addInputHatch("Any non-optional external facing casing on the stacks")
+ .addInputBus("Any non-optional external facing casing on the stacks")
+ .addOutputHatch("Any non-optional external facing casing on the stacks")
+ .addOutputBus("Any non-optional external facing casing on the stacks")
+ .addStructureInfo(
+ String.format("Stackable middle stacks between %d-%d time(s).", getMinStacks(), getMaxStacks()))
+ .toolTipFinisher("Wildcard");
+ return tt;
+ }
+
+ @Override
+ public int getMinStacks() {
+ return 1;
+ }
+
+ @Override
+ public int getMaxStacks() {
+ return 10;
+ }
+
+ @Override
+ public Vec3Impl getStartingStructureOffset() {
+ return new Vec3Impl(2, 0, 0);
+ }
+
+ @Override
+ public Vec3Impl getStartingStackOffset() {
+ return new Vec3Impl(1, 1, 0);
+ }
+
+ @Override
+ public Vec3Impl getPerStackOffset() {
+ return new Vec3Impl(0, 1, 0);
+ }
+
+ @Override
+ public Vec3Impl getAfterLastStackOffset() {
+ return new Vec3Impl(-1, 0, 0);
+ }
+
+ @Override
+ @Nonnull
+ protected MaceratorProcessingLogic createProcessingLogic() {
+ return new MaceratorProcessingLogic();
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/AdvChemicalProcessorProcessingLogic.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/AdvChemicalProcessorProcessingLogic.java
new file mode 100644
index 0000000000..59879e30c7
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/AdvChemicalProcessorProcessingLogic.java
@@ -0,0 +1,12 @@
+package gregtech.common.tileentities.machines.multiblock.logic;
+
+import gregtech.api.logic.ComplexParallelProcessingLogic;
+import gregtech.api.recipe.RecipeMaps;
+
+public class AdvChemicalProcessorProcessingLogic
+ extends ComplexParallelProcessingLogic<AdvChemicalProcessorProcessingLogic> {
+
+ public AdvChemicalProcessorProcessingLogic() {
+ setRecipeMap(RecipeMaps.multiblockChemicalReactorRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java
new file mode 100644
index 0000000000..1534b05bc3
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/CokeOvenProcessingLogic.java
@@ -0,0 +1,79 @@
+package gregtech.common.tileentities.machines.multiblock.logic;
+
+import static gregtech.api.enums.Mods.Railcraft;
+import static net.minecraftforge.oredict.OreDictionary.getOreID;
+import static net.minecraftforge.oredict.OreDictionary.getOreIDs;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.logic.MuTEProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class CokeOvenProcessingLogic extends MuTEProcessingLogic<CokeOvenProcessingLogic> {
+
+ private static final int NORMAL_RECIPE_TIME = 1800;
+ private static final int WOOD_ORE_ID = getOreID("logWood");
+ private static final int COAL_ORE_ID = getOreID("coal");
+ private static final int COAL_BLOCK_ORE_ID = getOreID("blockCoal");
+ private static final int SUGARCANE_ORE_ID = getOreID("sugarcane");
+ private static final int CACTUS_ORE_ID = getOreID("blockCactus");
+ private static final int CACTUS_CHARCOAL_ORE_ID = getOreID("itemCharcoalCactus");
+ private static final int SUGAR_CHARCOAL_ORE_ID = getOreID("itemCharcoalSugar");
+ private int timeMultiplier = 1;
+
+ @Nonnull
+ @Override
+ protected Object findRecipe(@Nullable RecipeMap<?> map, @Nonnull ItemInventoryLogic itemInput,
+ @Nonnull FluidInventoryLogic fluidInput) {
+ for (ItemStack item : itemInput.getStoredItems()) {
+ ItemStack output = findRecipe(item);
+ if (output != null) {
+ ItemStack input = item.copy();
+ input.stackSize = 1;
+ return null;
+ // return FindRecipeResult.ofSuccess(
+ // GT_Values.RA.stdBuilder()
+ // .itemInputs(input)
+ // .itemOutputs(output)
+ // .noFluidInputs()
+ // .noFluidOutputs()
+ // .duration(NORMAL_RECIPE_TIME * timeMultiplier)
+ // .eut(0)
+ // .build()
+ // .get());
+ }
+ }
+ return null;
+ }
+
+ @Nullable
+ private ItemStack findRecipe(@Nonnull ItemStack input) {
+ for (int oreId : getOreIDs(input)) {
+ if (oreId == COAL_ORE_ID) {
+ return GT_OreDictUnificator.get("fuelCoke", null, 1);
+ } else if (oreId == COAL_BLOCK_ORE_ID) {
+ timeMultiplier = 9;
+ return GT_ModHandler.getModItem(Railcraft.ID, "cube", 1, 0);
+ } else if (oreId == WOOD_ORE_ID) {
+ return new ItemStack(Items.coal, 1, 1);
+ } else if (oreId == SUGARCANE_ORE_ID) {
+ return GT_OreDictUnificator.get("itemCharcoalSugar", null, 1);
+ } else if (oreId == SUGAR_CHARCOAL_ORE_ID) {
+ return GT_OreDictUnificator.get("itemCokeSugar", null, 1);
+ } else if (oreId == CACTUS_ORE_ID) {
+ return GT_OreDictUnificator.get("itemCharcoalCactus", null, 1);
+ } else if (oreId == CACTUS_CHARCOAL_ORE_ID) {
+ return GT_OreDictUnificator.get("itemCokeCactus", null, 1);
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/DistillationTowerProcessingLogic.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/DistillationTowerProcessingLogic.java
new file mode 100644
index 0000000000..6f27c9a0e6
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/DistillationTowerProcessingLogic.java
@@ -0,0 +1,7 @@
+package gregtech.common.tileentities.machines.multiblock.logic;
+
+import gregtech.api.logic.ComplexParallelProcessingLogic;
+
+public class DistillationTowerProcessingLogic extends ComplexParallelProcessingLogic<DistillationTowerProcessingLogic> {
+
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LaserEngraverProcessingLogic.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LaserEngraverProcessingLogic.java
new file mode 100644
index 0000000000..3f4a6bfe70
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LaserEngraverProcessingLogic.java
@@ -0,0 +1,7 @@
+package gregtech.common.tileentities.machines.multiblock.logic;
+
+import gregtech.api.logic.ComplexParallelProcessingLogic;
+
+public class LaserEngraverProcessingLogic extends ComplexParallelProcessingLogic<LaserEngraverProcessingLogic> {
+
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LayeredCokeBatteryProcessingLogic.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LayeredCokeBatteryProcessingLogic.java
new file mode 100644
index 0000000000..b2e43b6fa9
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/LayeredCokeBatteryProcessingLogic.java
@@ -0,0 +1,7 @@
+package gregtech.common.tileentities.machines.multiblock.logic;
+
+import gregtech.api.logic.MuTEProcessingLogic;
+
+public class LayeredCokeBatteryProcessingLogic extends MuTEProcessingLogic<LayeredCokeBatteryProcessingLogic> {
+
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/MaceratorProcessingLogic.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/MaceratorProcessingLogic.java
new file mode 100644
index 0000000000..3f7d8a25f7
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/logic/MaceratorProcessingLogic.java
@@ -0,0 +1,7 @@
+package gregtech.common.tileentities.machines.multiblock.logic;
+
+import gregtech.api.logic.MuTEProcessingLogic;
+
+public class MaceratorProcessingLogic extends MuTEProcessingLogic<MaceratorProcessingLogic> {
+
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_AlloySmelter_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_AlloySmelter_Bronze.java
new file mode 100644
index 0000000000..9b2c6b3ada
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_AlloySmelter_Bronze.java
@@ -0,0 +1,139 @@
+package gregtech.common.tileentities.machines.steam;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Bronze;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_AlloySmelter_Bronze extends GT_MetaTileEntity_BasicMachine_Bronze {
+
+ public GT_MetaTileEntity_AlloySmelter_Bronze(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, "Combination Smelter", 2, 1, false);
+ }
+
+ public GT_MetaTileEntity_AlloySmelter_Bronze(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aDescription, aTextures, 2, 1, false);
+ }
+
+ @Override
+ protected boolean isBricked() {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_AlloySmelter_Bronze(mName, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.alloySmelterRecipes;
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_INDUCTION_LOOP, 10, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startProcess() {
+ sendLoopStart((byte) 1);
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { super.getSideFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { super.getSideFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_ALLOY_SMELTER), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_ALLOY_SMELTER), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { super.getTopFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { super.getTopFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_TOP_STEAM_ALLOY_SMELTER), TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW)
+ .glow()
+ .build() };
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_AlloySmelter_Steel.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_AlloySmelter_Steel.java
new file mode 100644
index 0000000000..8b96906da1
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_AlloySmelter_Steel.java
@@ -0,0 +1,139 @@
+package gregtech.common.tileentities.machines.steam;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Steel;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_AlloySmelter_Steel extends GT_MetaTileEntity_BasicMachine_Steel {
+
+ public GT_MetaTileEntity_AlloySmelter_Steel(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, "Combination Smelter", 2, 1, true);
+ }
+
+ public GT_MetaTileEntity_AlloySmelter_Steel(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aDescription, aTextures, 2, 1, true);
+ }
+
+ @Override
+ protected boolean isBricked() {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_AlloySmelter_Steel(mName, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.alloySmelterRecipes;
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_INDUCTION_LOOP, 10, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startProcess() {
+ sendLoopStart((byte) 1);
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { super.getSideFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { super.getSideFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_ALLOY_SMELTER), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_ALLOY_SMELTER), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { super.getTopFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { super.getTopFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_TOP_STEAM_ALLOY_SMELTER), TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW)
+ .glow()
+ .build() };
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Bronze.java
new file mode 100644
index 0000000000..ef91ed5baf
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Bronze.java
@@ -0,0 +1,134 @@
+package gregtech.common.tileentities.machines.steam;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_GLOW;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Bronze;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Compressor_Bronze extends GT_MetaTileEntity_BasicMachine_Bronze {
+
+ public GT_MetaTileEntity_Compressor_Bronze(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, "Compressing Items", 1, 1, false);
+ }
+
+ public GT_MetaTileEntity_Compressor_Bronze(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aDescription, aTextures, 1, 1, false);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Compressor_Bronze(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.compressorRecipes;
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_COMPRESSOR_OP, 10, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startProcess() {
+ sendLoopStart((byte) 1);
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { super.getSideFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { super.getSideFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_COMPRESSOR), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_COMPRESSOR), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { super.getTopFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_COMPRESSOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_COMPRESSOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_COMPRESSOR), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW)
+ .glow()
+ .build() };
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Steel.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Steel.java
new file mode 100644
index 0000000000..c213cf04f5
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Compressor_Steel.java
@@ -0,0 +1,134 @@
+package gregtech.common.tileentities.machines.steam;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_COMPRESSOR_GLOW;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Steel;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Compressor_Steel extends GT_MetaTileEntity_BasicMachine_Steel {
+
+ public GT_MetaTileEntity_Compressor_Steel(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, "Compressing Items", 1, 1, true);
+ }
+
+ public GT_MetaTileEntity_Compressor_Steel(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aDescription, aTextures, 1, 1, true);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Compressor_Steel(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.compressorRecipes;
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_COMPRESSOR_OP, 10, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startProcess() {
+ sendLoopStart((byte) 1);
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { super.getSideFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { super.getSideFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_COMPRESSOR), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_COMPRESSOR), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { super.getTopFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_COMPRESSOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_COMPRESSOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_COMPRESSOR), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW)
+ .glow()
+ .build() };
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Bronze.java
new file mode 100644
index 0000000000..6e986992f3
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Bronze.java
@@ -0,0 +1,134 @@
+package gregtech.common.tileentities.machines.steam;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_GLOW;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Bronze;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Extractor_Bronze extends GT_MetaTileEntity_BasicMachine_Bronze {
+
+ public GT_MetaTileEntity_Extractor_Bronze(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, "Extracting your first Rubber", 1, 1, false);
+ }
+
+ public GT_MetaTileEntity_Extractor_Bronze(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aDescription, aTextures, 1, 1, false);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Extractor_Bronze(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.extractorRecipes;
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_EXTRACTOR_OP, 10, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startProcess() {
+ sendLoopStart((byte) 1);
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { super.getSideFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_EXTRACTOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_EXTRACTOR), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { super.getTopFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_EXTRACTOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_EXTRACTOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_EXTRACTOR), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW)
+ .glow()
+ .build() };
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Steel.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Steel.java
new file mode 100644
index 0000000000..6a3d024e25
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Extractor_Steel.java
@@ -0,0 +1,134 @@
+package gregtech.common.tileentities.machines.steam;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_EXTRACTOR_GLOW;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Steel;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Extractor_Steel extends GT_MetaTileEntity_BasicMachine_Steel {
+
+ public GT_MetaTileEntity_Extractor_Steel(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, "Extracting your first Rubber", 1, 1, true);
+ }
+
+ public GT_MetaTileEntity_Extractor_Steel(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aDescription, aTextures, 1, 1, true);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Extractor_Steel(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.extractorRecipes;
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_EXTRACTOR_OP, 10, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startProcess() {
+ sendLoopStart((byte) 1);
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { super.getSideFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_EXTRACTOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_EXTRACTOR), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { super.getTopFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_EXTRACTOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_EXTRACTOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_EXTRACTOR), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW)
+ .glow()
+ .build() };
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Bronze.java
new file mode 100644
index 0000000000..b7d25ac172
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Bronze.java
@@ -0,0 +1,202 @@
+package gregtech.common.tileentities.machines.steam;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_GLOW;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Bronze;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder;
+
+public class GT_MetaTileEntity_ForgeHammer_Bronze extends GT_MetaTileEntity_BasicMachine_Bronze {
+
+ public GT_MetaTileEntity_ForgeHammer_Bronze(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, "Forge Hammer", 1, 1, false);
+ }
+
+ public GT_MetaTileEntity_ForgeHammer_Bronze(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aDescription, aTextures, 1, 1, false);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ForgeHammer_Bronze(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.hammerRecipes;
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.RANDOM_ANVIL_USE, 10, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startProcess() {
+ sendLoopStart((byte) 1);
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { super.getSideFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_HAMMER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_HAMMER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_HAMMER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_HAMMER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_FRONT_STEAM_HAMMER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_HAMMER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { super.getTopFacingActive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_HAMMER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_HAMMER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_HAMMER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_HAMMER), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_HAMMER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ /**
+ * Handles {@link Block#randomDisplayTick}. Draws Random Sparkles at main face.
+ *
+ * @param aBaseMetaTileEntity The entity that will handle the {@see Block#randomDisplayTick}
+ */
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) {
+
+ // Random Sparkles at main face
+ if (aBaseMetaTileEntity.isActive() && XSTR_INSTANCE.nextInt(3) == 0) {
+
+ final ForgeDirection mainFacing = this.mMainFacing;
+
+ if ((mainFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0
+ && aBaseMetaTileEntity.getCoverIDAtSide(mainFacing) == 0
+ && !aBaseMetaTileEntity.getOpacityAtSide(mainFacing)) {
+
+ final double oX = aBaseMetaTileEntity.getXCoord();
+ final double oY = aBaseMetaTileEntity.getYCoord();
+ final double oZ = aBaseMetaTileEntity.getZCoord();
+ final double offset = 0.02D;
+ final double horizontal = 0.5D + XSTR_INSTANCE.nextFloat() * 8D / 16D - 4D / 16D;
+
+ final double x, y, z, mX, mZ;
+
+ y = oY + XSTR_INSTANCE.nextFloat() * 10D / 16D + 5D / 16D;
+
+ if (mainFacing == ForgeDirection.WEST) {
+ x = oX - offset;
+ mX = -.05D;
+ z = oZ + horizontal;
+ mZ = 0D;
+ } else if (mainFacing == ForgeDirection.EAST) {
+ x = oX + offset;
+ mX = .05D;
+ z = oZ + horizontal;
+ mZ = 0D;
+ } else if (mainFacing == ForgeDirection.NORTH) {
+ x = oX + horizontal;
+ mX = 0D;
+ z = oZ - offset;
+ mZ = -.05D;
+ } else // if (frontFacing == ForgeDirection.SOUTH.ordinal())
+ {
+ x = oX + horizontal;
+ mX = 0D;
+ z = oZ + offset;
+ mZ = .05D;
+ }
+
+ ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(mX, 0, mZ)
+ .setPosition(x, y, z)
+ .setWorld(getBaseMetaTileEntity().getWorld());
+ particleEventBuilder.setIdentifier(ParticleFX.LAVA)
+ .run();
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Steel.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Steel.java
new file mode 100644
index 0000000000..25785f3fa3
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_ForgeHammer_Steel.java
@@ -0,0 +1,202 @@
+package gregtech.common.tileentities.machines.steam;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_HAMMER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_HAMMER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_HAMMER_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_HAMMER_GLOW;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import net.minecraft.block.Block;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Steel;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder;
+
+public class GT_MetaTileEntity_ForgeHammer_Steel extends GT_MetaTileEntity_BasicMachine_Steel {
+
+ public GT_MetaTileEntity_ForgeHammer_Steel(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, "Forge Hammer", 1, 1, true);
+ }
+
+ public GT_MetaTileEntity_ForgeHammer_Steel(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aDescription, aTextures, 1, 1, true);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_ForgeHammer_Steel(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.hammerRecipes;
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.RANDOM_ANVIL_USE, 10, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startProcess() {
+ sendLoopStart((byte) 1);
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { super.getSideFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_HAMMER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_HAMMER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_HAMMER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_HAMMER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_FRONT_STEAM_HAMMER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_HAMMER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { super.getTopFacingActive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_HAMMER_ACTIVE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_HAMMER),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_HAMMER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_HAMMER), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_HAMMER_GLOW)
+ .glow()
+ .build() };
+ }
+
+ /**
+ * Handles {@link Block#randomDisplayTick}. Draws Random Sparkles at main face.
+ *
+ * @param aBaseMetaTileEntity The entity that will handle the {@see Block#randomDisplayTick}
+ */
+ @SideOnly(Side.CLIENT)
+ @Override
+ public void onRandomDisplayTick(IGregTechTileEntity aBaseMetaTileEntity) {
+
+ // Random Sparkles at main face
+ if (aBaseMetaTileEntity.isActive() && XSTR_INSTANCE.nextInt(3) == 0) {
+
+ final ForgeDirection mainFacing = this.mMainFacing;
+
+ if ((mainFacing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0
+ && aBaseMetaTileEntity.getCoverIDAtSide(mainFacing) == 0
+ && !aBaseMetaTileEntity.getOpacityAtSide(mainFacing)) {
+
+ final double oX = aBaseMetaTileEntity.getXCoord();
+ final double oY = aBaseMetaTileEntity.getYCoord();
+ final double oZ = aBaseMetaTileEntity.getZCoord();
+ final double offset = 0.02D;
+ final double horizontal = 0.5D + XSTR_INSTANCE.nextFloat() * 8D / 16D - 4D / 16D;
+
+ final double x, y, z, mX, mZ;
+
+ y = oY + XSTR_INSTANCE.nextFloat() * 10D / 16D + 5D / 16D;
+
+ if (mainFacing == ForgeDirection.WEST) {
+ x = oX - offset;
+ mX = -.05D;
+ z = oZ + horizontal;
+ mZ = 0D;
+ } else if (mainFacing == ForgeDirection.EAST) {
+ x = oX + offset;
+ mX = .05D;
+ z = oZ + horizontal;
+ mZ = 0D;
+ } else if (mainFacing == ForgeDirection.NORTH) {
+ x = oX + horizontal;
+ mX = 0D;
+ z = oZ - offset;
+ mZ = -.05D;
+ } else // if (frontFacing == ForgeDirection.SOUTH.ordinal())
+ {
+ x = oX + horizontal;
+ mX = 0D;
+ z = oZ + offset;
+ mZ = .05D;
+ }
+
+ ParticleEventBuilder particleEventBuilder = (new ParticleEventBuilder()).setMotion(mX, 0, mZ)
+ .setPosition(x, y, z)
+ .setWorld(getBaseMetaTileEntity().getWorld());
+ particleEventBuilder.setIdentifier(ParticleFX.LAVA)
+ .run();
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Bronze.java
new file mode 100644
index 0000000000..51a91874a0
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Bronze.java
@@ -0,0 +1,161 @@
+package gregtech.common.tileentities.machines.steam;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE_GLOW;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Bronze;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Furnace_Bronze extends GT_MetaTileEntity_BasicMachine_Bronze {
+
+ public GT_MetaTileEntity_Furnace_Bronze(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, "Smelting things with compressed Steam", 1, 1, false);
+ }
+
+ public GT_MetaTileEntity_Furnace_Bronze(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aDescription, aTextures, 1, 1, false);
+ }
+
+ @Override
+ protected boolean isBricked() {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Furnace_Bronze(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.furnaceRecipes;
+ }
+
+ @Override
+ public int checkRecipe() {
+ if (null != (this.mOutputItems[0] = GT_ModHandler.getSmeltingOutput(getInputAt(0), true, getOutputAt(0)))) {
+ this.mEUt = 4;
+ this.mMaxProgresstime = 256;
+ return FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ }
+ return DID_NOT_FIND_RECIPE;
+ }
+
+ @Override
+ protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)
+ && GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(64, aStack), false, null) != null;
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, 10, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startProcess() {
+ sendLoopStart((byte) 1);
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { super.getSideFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_FURNACE_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_FURNACE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_FURNACE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_FURNACE_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_FRONT_STEAM_FURNACE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_FURNACE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { super.getTopFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_TOP_STEAM_FURNACE_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_FURNACE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_FURNACE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingInactive(aColor)[0],
+ TextureFactory.of(
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_FURNACE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_GLOW)
+ .glow()
+ .build()) };
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Steel.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Steel.java
new file mode 100644
index 0000000000..a151c724f3
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Furnace_Steel.java
@@ -0,0 +1,159 @@
+package gregtech.common.tileentities.machines.steam;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_FURNACE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_FURNACE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_FURNACE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_FURNACE_GLOW;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Steel;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_Furnace_Steel extends GT_MetaTileEntity_BasicMachine_Steel {
+
+ public GT_MetaTileEntity_Furnace_Steel(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, "Smelting things with compressed Steam", 1, 1, true);
+ }
+
+ public GT_MetaTileEntity_Furnace_Steel(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aDescription, aTextures, 1, 1, true);
+ }
+
+ @Override
+ protected boolean isBricked() {
+ return true;
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Furnace_Steel(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.furnaceRecipes;
+ }
+
+ @Override
+ public int checkRecipe() {
+ if (null != (this.mOutputItems[0] = GT_ModHandler.getSmeltingOutput(getInputAt(0), true, getOutputAt(0)))) {
+ this.mEUt = 8;
+ this.mMaxProgresstime = 128;
+ return FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ }
+ return DID_NOT_FIND_RECIPE;
+ }
+
+ @Override
+ protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)
+ && GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(64, aStack), false, null) != null;
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP, 10, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startProcess() {
+ sendLoopStart((byte) 1);
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { super.getSideFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_FURNACE_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_FURNACE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_FURNACE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_FURNACE_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_FRONT_STEAM_FURNACE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_FURNACE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { super.getTopFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_TOP_STEAM_FURNACE_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_FURNACE),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_FURNACE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_FURNACE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_FURNACE_GLOW)
+ .glow()
+ .build() };
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Bronze.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Bronze.java
new file mode 100644
index 0000000000..cdbf9f2123
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Bronze.java
@@ -0,0 +1,189 @@
+package gregtech.common.tileentities.machines.steam;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_GLOW;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TierEU;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Bronze;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder.ParticleEventBuilder;
+
+public class GT_MetaTileEntity_Macerator_Bronze extends GT_MetaTileEntity_BasicMachine_Bronze {
+
+ public GT_MetaTileEntity_Macerator_Bronze(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, "Macerating your Ores", 1, 1, false);
+ }
+
+ public GT_MetaTileEntity_Macerator_Bronze(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aDescription, aTextures, 1, 1, false);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Macerator_Bronze(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isClientSide() && aBaseMetaTileEntity.isActive()) {
+
+ if (aBaseMetaTileEntity.getFrontFacing() != ForgeDirection.UP
+ && aBaseMetaTileEntity.getCoverIDAtSide(ForgeDirection.UP) == 0
+ && !aBaseMetaTileEntity.getOpacityAtSide(ForgeDirection.UP)) {
+
+ new ParticleEventBuilder().setMotion(0.0D, 0.0D, 0.0D)
+ .setIdentifier(ParticleFX.SMOKE)
+ .setPosition(
+ aBaseMetaTileEntity.getXCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F,
+ aBaseMetaTileEntity.getYCoord() + 0.9F + XSTR_INSTANCE.nextFloat() * 0.2F,
+ aBaseMetaTileEntity.getZCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F)
+ .setWorld(getBaseMetaTileEntity().getWorld())
+ .run();
+ }
+ }
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.maceratorRecipes;
+ }
+
+ @Override
+ public int checkRecipe() {
+ GT_Recipe tRecipe = getRecipeMap()
+ .findRecipe(getBaseMetaTileEntity(), mLastRecipe, false, TierEU.LV, null, null, getAllInputs());
+ if (tRecipe == null) return DID_NOT_FIND_RECIPE;
+ if (tRecipe.mCanBeBuffered) mLastRecipe = tRecipe;
+ if (!canOutput(tRecipe)) {
+ mOutputBlocked++;
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ }
+
+ if (!tRecipe.isRecipeInputEqual(true, new FluidStack[] { getFillableStack() }, getAllInputs()))
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ if (tRecipe.getOutput(0) != null) mOutputItems[0] = tRecipe.getOutput(0);
+ calculateCustomOverclock(tRecipe);
+ return FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ }
+
+ @Override
+ protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)
+ && RecipeMaps.maceratorRecipes.containsInput(GT_Utility.copyAmount(64, aStack));
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_MACERATOR_OP, 10, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startProcess() {
+ sendLoopStart((byte) 1);
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { super.getSideFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_MACERATOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_MACERATOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_MACERATOR), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_MACERATOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { super.getTopFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_TOP_STEAM_MACERATOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_MACERATOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_MACERATOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_MACERATOR), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW)
+ .glow()
+ .build() };
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Steel.java b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Steel.java
new file mode 100644
index 0000000000..95d510ffa3
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/steam/GT_MetaTileEntity_Macerator_Steel.java
@@ -0,0 +1,188 @@
+package gregtech.common.tileentities.machines.steam;
+
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_STEAM_MACERATOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SIDE_STEAM_MACERATOR_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_TOP_STEAM_MACERATOR_GLOW;
+import static gregtech.api.objects.XSTR.XSTR_INSTANCE;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.ParticleFX;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TierEU;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Steel;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.WorldSpawnedEventBuilder;
+
+public class GT_MetaTileEntity_Macerator_Steel extends GT_MetaTileEntity_BasicMachine_Steel {
+
+ public GT_MetaTileEntity_Macerator_Steel(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, "Macerating your Ores", 1, 1, true);
+ }
+
+ public GT_MetaTileEntity_Macerator_Steel(String aName, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aDescription, aTextures, 1, 1, true);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Macerator_Steel(this.mName, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isClientSide() && aBaseMetaTileEntity.isActive()) {
+ if (aBaseMetaTileEntity.getFrontFacing() != ForgeDirection.UP
+ && aBaseMetaTileEntity.getCoverIDAtSide(ForgeDirection.UP) == 0
+ && !aBaseMetaTileEntity.getOpacityAtSide(ForgeDirection.UP)) {
+
+ new WorldSpawnedEventBuilder.ParticleEventBuilder().setMotion(0.0D, 0.0D, 0.0D)
+ .setIdentifier(ParticleFX.SMOKE)
+ .setPosition(
+ aBaseMetaTileEntity.getXCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F,
+ aBaseMetaTileEntity.getYCoord() + 0.9F + XSTR_INSTANCE.nextFloat() * 0.2F,
+ aBaseMetaTileEntity.getZCoord() + 0.8F - XSTR_INSTANCE.nextFloat() * 0.6F)
+ .setWorld(getBaseMetaTileEntity().getWorld())
+ .run();
+ }
+ }
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.maceratorRecipes;
+ }
+
+ @Override
+ public int checkRecipe() {
+ GT_Recipe tRecipe = getRecipeMap()
+ .findRecipe(getBaseMetaTileEntity(), mLastRecipe, false, TierEU.LV, null, null, getAllInputs());
+ if (tRecipe == null) return DID_NOT_FIND_RECIPE;
+ if (tRecipe.mCanBeBuffered) mLastRecipe = tRecipe;
+ if (!canOutput(tRecipe)) {
+ mOutputBlocked++;
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ }
+
+ if (!tRecipe.isRecipeInputEqual(true, new FluidStack[] { getFillableStack() }, getAllInputs()))
+ return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
+ if (tRecipe.getOutput(0) != null) mOutputItems[0] = tRecipe.getOutput(0);
+ calculateCustomOverclock(tRecipe);
+ return FOUND_AND_SUCCESSFULLY_USED_RECIPE;
+ }
+
+ @Override
+ public boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, side, aStack)
+ && RecipeMaps.maceratorRecipes.containsInput(GT_Utility.copyAmount(64, aStack));
+ }
+
+ @Override
+ public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
+ super.startSoundLoop(aIndex, aX, aY, aZ);
+ if (aIndex == 1) {
+ GT_Utility.doSoundAtClient(SoundResource.IC2_MACHINES_MACERATOR_OP, 10, 1.0F, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void startProcess() {
+ sendLoopStart((byte) 1);
+ }
+
+ @Override
+ public ITexture[] getSideFacingActive(byte aColor) {
+ return new ITexture[] { super.getSideFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getSideFacingInactive(byte aColor) {
+ return new ITexture[] { super.getSideFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_SIDE_STEAM_MACERATOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SIDE_STEAM_MACERATOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingActive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getFrontFacingInactive(byte aColor) {
+ return new ITexture[] { super.getFrontFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_FRONT_STEAM_MACERATOR), TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_STEAM_MACERATOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingActive(byte aColor) {
+ return new ITexture[] { super.getTopFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_TOP_STEAM_MACERATOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getTopFacingInactive(byte aColor) {
+ return new ITexture[] { super.getTopFacingInactive(aColor)[0], TextureFactory.of(OVERLAY_TOP_STEAM_MACERATOR),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_TOP_STEAM_MACERATOR_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingActive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingActive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public ITexture[] getBottomFacingInactive(byte aColor) {
+ return new ITexture[] { super.getBottomFacingInactive(aColor)[0],
+ TextureFactory.of(OVERLAY_BOTTOM_STEAM_MACERATOR), TextureFactory.builder()
+ .addIcon(OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW)
+ .glow()
+ .build() };
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/render/TileDrone.java b/src/main/java/gregtech/common/tileentities/render/TileDrone.java
new file mode 100644
index 0000000000..625157ff37
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/render/TileDrone.java
@@ -0,0 +1,24 @@
+package gregtech.common.tileentities.render;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+
+public class TileDrone extends TileEntity {
+
+ public double rotation = 0;
+
+ @Override
+ public AxisAlignedBB getRenderBoundingBox() {
+ return INFINITE_EXTENT_AABB;
+ }
+
+ @Override
+ public double getMaxRenderDistanceSquared() {
+ return 65536;
+ }
+
+ @Override
+ public void updateEntity() {
+ rotation = (rotation + 50) % 360d;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalChestBase.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalChestBase.java
new file mode 100644
index 0000000000..3d59aca28f
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalChestBase.java
@@ -0,0 +1,564 @@
+package gregtech.common.tileentities.storage;
+
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SCHEST;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_SCHEST_GLOW;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import appeng.api.storage.IMEMonitor;
+import appeng.api.storage.IMEMonitorHandlerReceiver;
+import appeng.api.storage.StorageChannel;
+import appeng.api.storage.data.IAEItemStack;
+import appeng.api.storage.data.IItemList;
+import appeng.util.item.AEItemStack;
+import appeng.util.item.ItemList;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.objects.AE2DigitalChestHandler;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public abstract class GT_MetaTileEntity_DigitalChestBase extends GT_MetaTileEntity_TieredMachineBlock
+ implements IMEMonitor<IAEItemStack>, IAddUIWidgets {
+
+ protected boolean mVoidOverflow = false;
+ protected boolean mDisableFilter;
+ private Map<IMEMonitorHandlerReceiver<IAEItemStack>, Object> listeners = null;
+
+ public GT_MetaTileEntity_DigitalChestBase(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 3,
+ new String[] { "This Chest stores " + GT_Utility.formatNumbers(commonSizeCompute(aTier)) + " Blocks",
+ "Use a screwdriver to enable", "voiding items on overflow", "Will keep its contents when harvested", });
+ }
+
+ protected static int commonSizeCompute(int tier) {
+ return switch (tier) {
+ case 1 -> 4000000;
+ case 2 -> 8000000;
+ case 3 -> 16000000;
+ case 4 -> 32000000;
+ case 5 -> 64000000;
+ case 6 -> 128000000;
+ case 7 -> 256000000;
+ case 8 -> 512000000;
+ case 9 -> 1024000000;
+ case 10 -> 2147483640;
+ default -> 0;
+ };
+ }
+
+ public GT_MetaTileEntity_DigitalChestBase(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_DigitalChestBase(String aName, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {
+ if (stack.hasTagCompound() && stack.stackTagCompound.hasKey("mItemStack")) {
+ final ItemStack tContents = ItemStack
+ .loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("mItemStack"));
+ final int tSize = stack.stackTagCompound.getInteger("mItemCount");
+ if (tContents != null && tSize > 0) {
+ tooltip.add(
+ GT_LanguageManager.addStringLocalization("TileEntity_CHEST_INFO", "Contains Item: ")
+ + EnumChatFormatting.YELLOW
+ + tContents.getDisplayName()
+ + EnumChatFormatting.GRAY);
+ tooltip.add(
+ GT_LanguageManager.addStringLocalization("TileEntity_CHEST_AMOUNT", "Item Amount: ")
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(tSize)
+ + EnumChatFormatting.GRAY);
+ }
+ }
+ }
+
+ public static void registerAEIntegration() {
+ appeng.api.AEApi.instance()
+ .registries()
+ .externalStorage()
+ .addExternalStorageInterface(new AE2DigitalChestHandler());
+ }
+
+ @Override
+ public void addListener(IMEMonitorHandlerReceiver<IAEItemStack> imeMonitorHandlerReceiver, Object o) {
+ if (listeners == null) listeners = new HashMap<>();
+ listeners.put(imeMonitorHandlerReceiver, o);
+ }
+
+ @Override
+ public void removeListener(IMEMonitorHandlerReceiver<IAEItemStack> imeMonitorHandlerReceiver) {
+ if (listeners == null) listeners = new HashMap<>();
+ listeners.remove(imeMonitorHandlerReceiver);
+ }
+
+ @Override
+ public appeng.api.config.AccessRestriction getAccess() {
+ return appeng.api.config.AccessRestriction.READ_WRITE;
+ }
+
+ @Override
+ public boolean isPrioritized(IAEItemStack iaeItemStack) {
+ ItemStack s = getItemStack();
+ if (s == null || iaeItemStack == null) return false;
+ return iaeItemStack.isSameType(s);
+ }
+
+ @Override
+ public boolean canAccept(IAEItemStack iaeItemStack) {
+ ItemStack s = getItemStack();
+ if (s == null || iaeItemStack == null) return true;
+ return iaeItemStack.isSameType(s);
+ }
+
+ @Override
+ public int getPriority() {
+ return 0;
+ }
+
+ @Override
+ public int getSlot() {
+ return 0;
+ }
+
+ @Override
+ public boolean validForPass(int i) {
+ return true;
+ }
+
+ protected abstract ItemStack getItemStack();
+
+ protected abstract void setItemStack(ItemStack s);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public IItemList<IAEItemStack> getAvailableItems(final IItemList out) {
+ ItemStack storedStack = getItemStack();
+ if (storedStack != null) {
+ AEItemStack s = AEItemStack.create(storedStack);
+ s.setStackSize(getItemCount());
+ out.add(s);
+ }
+ return out;
+ }
+
+ @Override
+ public IItemList<IAEItemStack> getStorageList() {
+ IItemList<IAEItemStack> res = new ItemList();
+ ItemStack storedStack = getItemStack();
+ if (storedStack != null) {
+ AEItemStack s = AEItemStack.create(storedStack);
+ s.setStackSize(getItemCount());
+ res.add(s);
+ }
+ return res;
+ }
+
+ protected abstract int getItemCount();
+
+ @Override
+ public abstract void setItemCount(int aCount);
+
+ @Override
+ public int getMaxItemCount() {
+ return commonSizeCompute(mTier);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return new ITexture[0][0][0];
+ }
+
+ @Override
+ public IAEItemStack injectItems(final IAEItemStack input, final appeng.api.config.Actionable mode,
+ final appeng.api.networking.security.BaseActionSource src) {
+ if (getBaseMetaTileEntity() == null) return input;
+
+ final ItemStack inputStack = input.getItemStack();
+ final int maxCapacity = getMaxItemCount();
+ final int itemCount = getItemCount();
+ final long toAdd = input.getStackSize();
+ final ItemStack storedStack = getItemStack();
+
+ if (storedStack != null && !GT_Utility.areStacksEqual(storedStack, inputStack)) {
+ // Can't stack with existing item, just return the input.
+ return input;
+ }
+
+ // Number of items not added because there's too much to add.
+ final long notAdded = itemCount + toAdd - maxCapacity;
+
+ if (mode == appeng.api.config.Actionable.MODULATE) {
+ final int newCount = (int) Math.min((long) maxCapacity, itemCount + toAdd);
+
+ if (storedStack == null) {
+ setItemStack(inputStack.copy());
+ }
+ setItemCount(newCount);
+ getBaseMetaTileEntity().markDirty();
+ }
+ if (mVoidOverflow || notAdded <= 0) {
+ return null;
+ } else {
+ return input.copy()
+ .setStackSize(notAdded);
+ }
+ }
+
+ @Override
+ public IAEItemStack extractItems(final IAEItemStack request, final appeng.api.config.Actionable mode,
+ final appeng.api.networking.security.BaseActionSource src) {
+ if (request.isSameType(getItemStack())) {
+ if (getBaseMetaTileEntity() == null) return null;
+ if (mode != appeng.api.config.Actionable.SIMULATE) getBaseMetaTileEntity().markDirty();
+ if (request.getStackSize() >= getItemCount()) {
+ AEItemStack result = AEItemStack.create(getItemStack());
+ result.setStackSize(getItemCount());
+ if (mode != appeng.api.config.Actionable.SIMULATE) setItemCount(0);
+ return result;
+ } else {
+ if (mode != appeng.api.config.Actionable.SIMULATE)
+ setItemCount(getItemCount() - (int) request.getStackSize());
+ return request.copy();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public StorageChannel getChannel() {
+ return StorageChannel.ITEMS;
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ mVoidOverflow = !mVoidOverflow;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal(
+ mVoidOverflow ? "GT5U.machines.digitalchest.voidoverflow.enabled"
+ : "GT5U.machines.digitalchest.voidoverflow.disabled"));
+ }
+
+ @Override
+ public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ if (super.onSolderingToolRightClick(side, wrenchingSide, aPlayer, aX, aY, aZ)) return true;
+ mDisableFilter = !mDisableFilter;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal(
+ mDisableFilter ? "GT5U.machines.digitalchest.inputfilter.disabled"
+ : "GT5U.machines.digitalchest.inputfilter.enabled"));
+ return true;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
+
+ if (getBaseMetaTileEntity().isServerSide() && getBaseMetaTileEntity().isAllowedToWork()) {
+ if ((getItemCount() <= 0)) {
+ setItemStack(null);
+ setItemCount(0);
+ }
+ if (getItemStack() == null && mInventory[0] != null) {
+ setItemStack(mInventory[0].copy());
+ }
+ int count = getItemCount();
+ ItemStack stack = getItemStack();
+ int savedCount = count;
+
+ if ((mInventory[0] != null) && ((count < getMaxItemCount()) || mVoidOverflow)
+ && GT_Utility.areStacksEqual(mInventory[0], stack)) {
+ count += mInventory[0].stackSize;
+ if (count <= getMaxItemCount()) {
+ mInventory[0] = null;
+ } else {
+ if (mVoidOverflow) {
+ mInventory[0] = null;
+ } else {
+ mInventory[0].stackSize = (count - getMaxItemCount());
+ }
+ count = getMaxItemCount();
+ }
+ }
+ if (mInventory[1] == null && stack != null) {
+ mInventory[1] = stack.copy();
+ mInventory[1].stackSize = Math.min(stack.getMaxStackSize(), count);
+ count -= mInventory[1].stackSize;
+ } else if ((count > 0) && GT_Utility.areStacksEqual(mInventory[1], stack)
+ && mInventory[1].getMaxStackSize() > mInventory[1].stackSize) {
+ int tmp = Math.min(count, mInventory[1].getMaxStackSize() - mInventory[1].stackSize);
+ mInventory[1].stackSize += tmp;
+ count -= tmp;
+ }
+ setItemCount(count);
+ if (stack != null) {
+ mInventory[2] = stack.copy();
+ mInventory[2].stackSize = Math.min(stack.getMaxStackSize(), count);
+ } else {
+ mInventory[2] = null;
+ }
+
+ notifyListeners(count - savedCount, stack);
+ if (count != savedCount) getBaseMetaTileEntity().markDirty();
+ }
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return aIndex != 2;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public int getProgresstime() {
+ return getItemCount() + (mInventory[0] == null ? 0 : mInventory[0].stackSize)
+ + (mInventory[1] == null ? 0 : mInventory[1].stackSize);
+ }
+
+ @Override
+ public int maxProgresstime() {
+ return getMaxItemCount();
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+
+ if (getItemStack() == null) {
+ return new String[] { EnumChatFormatting.BLUE + chestName() + EnumChatFormatting.RESET, "Stored Items:",
+ EnumChatFormatting.GOLD + "No Items" + EnumChatFormatting.RESET,
+ EnumChatFormatting.GREEN + "0"
+ + EnumChatFormatting.RESET
+ + " "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getMaxItemCount())
+ + EnumChatFormatting.RESET };
+ }
+ return new String[] { EnumChatFormatting.BLUE + chestName() + EnumChatFormatting.RESET, "Stored Items:",
+ EnumChatFormatting.GOLD + getItemStack().getDisplayName() + EnumChatFormatting.RESET,
+ EnumChatFormatting.GREEN + GT_Utility.formatNumbers(getItemCount())
+ + EnumChatFormatting.RESET
+ + " "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getMaxItemCount())
+ + EnumChatFormatting.RESET };
+ }
+
+ @Override
+ public ItemStack[] getStoredItemData() {
+ return mInventory;
+ }
+
+ protected abstract String chestName();
+
+ private void notifyListeners(int count, ItemStack stack) {
+ if (listeners == null) {
+ listeners = new HashMap<>();
+ return;
+ }
+ if (count == 0 || stack == null) return;
+ ItemList change = new ItemList();
+ AEItemStack s = AEItemStack.create(stack);
+ s.setStackSize(count);
+ change.add(s);
+ listeners.forEach((l, o) -> {
+ if (l.isValid(o)) l.postChange(this, change, null);
+ else removeListener(l);
+ });
+ }
+
+ private boolean hasActiveMEConnection() {
+ if (listeners == null || listeners.isEmpty()) return false;
+ for (Map.Entry<IMEMonitorHandlerReceiver<IAEItemStack>, Object> e : listeners.entrySet()) {
+ if ((e.getKey() instanceof appeng.api.parts.IPart)) {
+ appeng.api.networking.IGridNode n = ((appeng.api.parts.IPart) e.getKey()).getGridNode();
+ if (n != null && n.isActive()) return true;
+ }
+ }
+ // if there are no active storage buses - clear the listeners
+ listeners.clear();
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setInteger("mItemCount", getItemCount());
+ if (getItemStack() != null) aNBT.setTag("mItemStack", getItemStack().writeToNBT(new NBTTagCompound()));
+ aNBT.setBoolean("mVoidOverflow", mVoidOverflow);
+ aNBT.setBoolean("mDisableFilter", mDisableFilter);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ if (aNBT.hasKey("mItemCount")) setItemCount(aNBT.getInteger("mItemCount"));
+ if (aNBT.hasKey("mItemStack"))
+ setItemStack(ItemStack.loadItemStackFromNBT((NBTTagCompound) aNBT.getTag("mItemStack")));
+ mVoidOverflow = aNBT.getBoolean("mVoidOverflow");
+ mDisableFilter = aNBT.getBoolean("mDisableFilter");
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (GT_Values.disableDigitalChestsExternalAccess && hasActiveMEConnection()) return false;
+ return aIndex == 1;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ if (GT_Values.disableDigitalChestsExternalAccess && hasActiveMEConnection()) return false;
+ if (aIndex != 0) return false;
+ if ((mInventory[0] != null && !GT_Utility.areStacksEqual(mInventory[0], aStack))) return false;
+ if (mDisableFilter) return true;
+ if (getItemStack() == null) return mInventory[1] == null || GT_Utility.areStacksEqual(mInventory[1], aStack);
+ return GT_Utility.areStacksEqual(getItemStack(), aStack);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side != aFacing) return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1] };
+ return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_SCHEST),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_SCHEST_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ final NBTTagCompound tag = accessor.getNBTData();
+ if (tag.hasKey("itemType", Constants.NBT.TAG_COMPOUND)) {
+ currenttip.add("Item Count: " + GT_Utility.parseNumberToString(tag.getInteger("itemCount")));
+ currenttip.add(
+ "Item Type: " + ItemStack.loadItemStackFromNBT(tag.getCompoundTag("itemType"))
+ .getDisplayName());
+ } else {
+ currenttip.add("Chest Empty");
+ }
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ ItemStack is = getItemStack();
+ if (GT_Utility.isStackInvalid(is)) return;
+ int realItemCount = getItemCount();
+ if (GT_Utility.isStackValid(mInventory[1]) && GT_Utility.areStacksEqual(mInventory[1], is))
+ realItemCount += mInventory[1].stackSize;
+ tag.setInteger("itemCount", realItemCount);
+ tag.setTag("itemType", is.writeToNBT(new NBTTagCompound()));
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+ protected int clientItemCount;
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(7, 16)
+ .setSize(71, 45))
+ .widget(
+ new SlotWidget(inventoryHandler, 0)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_IN)
+ .setPos(79, 16))
+ .widget(
+ new SlotWidget(inventoryHandler, 1).setAccess(true, false)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_OUT)
+ .setPos(79, 52))
+ .widget(
+ SlotWidget.phantom(inventoryHandler, 2)
+ .disableInteraction()
+ .setBackground(GT_UITextures.TRANSPARENT)
+ .setPos(59, 42))
+ .widget(
+ new TextWidget("Item Amount").setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 20))
+ .widget(
+ new TextWidget().setStringSupplier(() -> numberFormat.format(clientItemCount))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 30))
+ .widget(
+ new FakeSyncWidget.IntegerSyncer(
+ () -> this instanceof GT_MetaTileEntity_QuantumChest
+ ? ((GT_MetaTileEntity_QuantumChest) this).mItemCount
+ : 0,
+ value -> clientItemCount = value));
+
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java
new file mode 100644
index 0000000000..e94458c116
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java
@@ -0,0 +1,699 @@
+package gregtech.common.tileentities.storage;
+
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_QTANK;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_QTANK_GLOW;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidHandler;
+
+import com.gtnewhorizons.modularui.api.NumberFormatMUI;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IFluidLockable;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.gui.modularui.widget.FluidLockWidget;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public abstract class GT_MetaTileEntity_DigitalTankBase extends GT_MetaTileEntity_BasicTank
+ implements IFluidLockable, IAddUIWidgets, IAddGregtechLogo {
+
+ public boolean mOutputFluid = false, mVoidFluidPart = false, mVoidFluidFull = false, mLockFluid = false;
+ protected String lockedFluidName = null;
+ public boolean mAllowInputFromOutputSide = false;
+
+ public GT_MetaTileEntity_DigitalTankBase(int aID, String aName, String aNameRegional, int aTier) {
+ super(
+ aID,
+ aName,
+ aNameRegional,
+ aTier,
+ 3,
+ new String[] {
+ StatCollector.translateToLocalFormatted(
+ "GT5U.machines.digitaltank.tooltip",
+ formatNumbers(commonSizeCompute(aTier))),
+ StatCollector.translateToLocal("GT5U.machines.digitaltank.tooltip1"), });
+ }
+
+ protected static int commonSizeCompute(int tier) {
+ return switch (tier) {
+ case 1 -> 4000000;
+ case 2 -> 8000000;
+ case 3 -> 16000000;
+ case 4 -> 32000000;
+ case 5 -> 64000000;
+ case 6 -> 128000000;
+ case 7 -> 256000000;
+ case 8 -> 512000000;
+ case 9 -> 1024000000;
+ case 10 -> 2147483640;
+ default -> 0;
+ };
+ }
+
+ private static int tierPump(int tier) {
+ return switch (tier) {
+ case 1 -> 2;
+ case 2 -> 3;
+ case 3 -> 3;
+ case 4 -> 4;
+ case 5 -> 4;
+ case 6 -> 5;
+ case 7 -> 5;
+ case 8 -> 6;
+ case 9 -> 7;
+ case 10 -> 8;
+ default -> 0;
+ };
+ }
+
+ public GT_MetaTileEntity_DigitalTankBase(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_DigitalTankBase(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 3, aDescription, aTextures);
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return new ITexture[0][0][0];
+ }
+
+ @Override
+ public void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {
+ if (stack.hasTagCompound()
+ && (stack.stackTagCompound.hasKey("mFluid") || stack.stackTagCompound.hasKey("lockedFluidName"))) {
+ final FluidStack tContents = FluidStack
+ .loadFluidStackFromNBT(stack.stackTagCompound.getCompoundTag("mFluid"));
+ if (tContents != null && tContents.amount > 0) {
+ tooltip.add(
+ GT_LanguageManager.addStringLocalization("TileEntity_TANK_INFO", "Contains Fluid: ")
+ + EnumChatFormatting.YELLOW
+ + tContents.getLocalizedName()
+ + EnumChatFormatting.GRAY);
+ tooltip.add(
+ GT_LanguageManager.addStringLocalization("TileEntity_TANK_AMOUNT", "Fluid Amount: ")
+ + EnumChatFormatting.GREEN
+ + formatNumbers(tContents.amount)
+ + " L"
+ + EnumChatFormatting.GRAY);
+ } else if (stack.stackTagCompound.hasKey("lockedFluidName")) {
+ String fluidName = stack.stackTagCompound.getString("lockedFluidName");
+ Fluid fluid = FluidRegistry.getFluid(fluidName);
+ if (fluid == null) return;
+ // noinspection deprecation
+ tooltip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.item.tank.locked_to",
+ EnumChatFormatting.YELLOW + fluid.getLocalizedName()));
+ }
+ }
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ if (mFluid != null && mFluid.amount >= 0) {
+ aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound()));
+ }
+ if (mOutputFluid) aNBT.setBoolean("mOutputFluid", true);
+ if (mVoidFluidPart) aNBT.setBoolean("mVoidOverflow", true);
+ if (mVoidFluidFull) aNBT.setBoolean("mVoidFluidFull", true);
+ if (mLockFluid) aNBT.setBoolean("mLockFluid", true);
+ if (mLockFluid && GT_Utility.isStringValid(lockedFluidName)) aNBT.setString("lockedFluidName", lockedFluidName);
+ if (this.mAllowInputFromOutputSide) aNBT.setBoolean("mAllowInputFromOutputSide", true);
+
+ super.setItemNBT(aNBT);
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setBoolean("mOutputFluid", this.mOutputFluid);
+ aNBT.setBoolean("mVoidOverflow", this.mVoidFluidPart);
+ aNBT.setBoolean("mVoidFluidFull", this.mVoidFluidFull);
+ aNBT.setBoolean("mLockFluid", mLockFluid);
+ if (mLockFluid && GT_Utility.isStringValid(lockedFluidName)) aNBT.setString("lockedFluidName", lockedFluidName);
+ else aNBT.removeTag("lockedFluidName");
+ aNBT.setBoolean("mAllowInputFromOutputSide", this.mAllowInputFromOutputSide);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ mOutputFluid = aNBT.getBoolean("mOutputFluid");
+ mVoidFluidPart = aNBT.getBoolean("mVoidOverflow");
+ mVoidFluidFull = aNBT.getBoolean("mVoidFluidFull");
+ mLockFluid = aNBT.getBoolean("mLockFluid");
+ if (mLockFluid) {
+ setLockedFluidName(aNBT.getString("lockedFluidName"));
+ } else {
+ setLockedFluidName(null);
+ }
+ mAllowInputFromOutputSide = aNBT.getBoolean("mAllowInputFromOutputSide");
+ }
+
+ @Override
+ public boolean isFluidInputAllowed(FluidStack aFluid) {
+ return !mLockFluid || lockedFluidName == null
+ || lockedFluidName.equals(
+ aFluid.getFluid()
+ .getName());
+ }
+
+ @Override
+ public boolean isFluidChangingAllowed() {
+ return !mLockFluid || lockedFluidName == null;
+ }
+
+ @Override
+ public void onEmptyingContainerWhenEmpty() {
+ if (this.lockedFluidName == null && this.mFluid != null && isFluidLocked()) {
+ setLockedFluidName(
+ this.mFluid.getFluid()
+ .getName());
+ }
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean doesFillContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean doesEmptyContainers() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeFilled() {
+ return true;
+ }
+
+ @Override
+ public boolean canTankBeEmptied() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysItemStack() {
+ return true;
+ }
+
+ @Override
+ public boolean displaysStackSize() {
+ return false;
+ }
+
+ @Override
+ public void setLockedFluidName(String lockedFluidName) {
+ lockedFluidName = GT_Utility.isStringInvalid(lockedFluidName) ? null : lockedFluidName;
+ this.lockedFluidName = lockedFluidName;
+ if (lockedFluidName != null) {
+ Fluid fluid = FluidRegistry.getFluid(lockedFluidName);
+ if (fluid != null) {
+ // create new FluidStack, otherwise existing 0-amount FluidStack will
+ // prevent new fluid from being locked
+ setFillableStack(new FluidStack(fluid, getFluidAmount()));
+ mLockFluid = true;
+ }
+ }
+ // Don't unlock if lockedFluidName == null,
+ // as player might explicitly enable fluid locking with no fluid contained
+ }
+
+ @Override
+ public String getLockedFluidName() {
+ return this.lockedFluidName;
+ }
+
+ @Override
+ public void lockFluid(boolean lock) {
+ this.mLockFluid = lock;
+ if (!lock) {
+ setLockedFluidName(null);
+ }
+ }
+
+ @Override
+ public boolean isFluidLocked() {
+ return this.mLockFluid;
+ }
+
+ @Override
+ public boolean acceptsFluidLock(String name) {
+ if (name == null || getFluidAmount() == 0) return true;
+ return mFluid != null && mFluid.getFluid()
+ .getName()
+ .equals(name);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ if (sideDirection != ForgeDirection.UP) {
+ if (sideDirection == baseMetaTileEntity.getFrontFacing()) {
+ return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_PIPE) };
+ } else return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1] };
+ }
+ return new ITexture[] { MACHINE_CASINGS[mTier][colorIndex + 1], TextureFactory.of(OVERLAY_QTANK),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_QTANK_GLOW)
+ .glow()
+ .build() };
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (side == getBaseMetaTileEntity().getFrontFacing()) {
+ mAllowInputFromOutputSide = !mAllowInputFromOutputSide;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ mAllowInputFromOutputSide ? GT_Utility.getTrans("095") : GT_Utility.getTrans("096"));
+ }
+ }
+
+ @Override
+ public FluidStack setFillableStack(FluidStack aFluid) {
+ mFluid = aFluid;
+ if (mFluid != null) {
+ mFluid.amount = Math.min(mFluid.amount, getRealCapacity());
+ }
+ return mFluid;
+ }
+
+ @Override
+ public FluidStack setDrainableStack(FluidStack aFluid) {
+ mFluid = aFluid;
+ if (mFluid != null) {
+ mFluid.amount = Math.min(mFluid.amount, getRealCapacity());
+ }
+ return mFluid;
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (isFluidChangingAllowed() && getFillableStack() != null && getFillableStack().amount <= 0)
+ setFillableStack(null);
+
+ if (mVoidFluidFull && getFillableStack() != null) {
+ mVoidFluidPart = false;
+ mLockFluid = false;
+ setFillableStack(null);
+ }
+
+ if (doesEmptyContainers()) {
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(mInventory[getInputSlot()], true);
+ if (tFluid != null && isFluidInputAllowed(tFluid)) {
+ if (getFillableStack() == null) {
+ if (isFluidInputAllowed(tFluid)) {
+ if ((tFluid.amount <= getRealCapacity()) || mVoidFluidPart) {
+ tFluid = tFluid.copy();
+ if (aBaseMetaTileEntity.addStackToSlot(
+ getOutputSlot(),
+ GT_Utility.getContainerForFilledItem(mInventory[getInputSlot()], true),
+ 1)) {
+ setFillableStack(tFluid);
+ this.onEmptyingContainerWhenEmpty();
+ aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1);
+ }
+ }
+ }
+ } else {
+ if (tFluid.isFluidEqual(getFillableStack())) {
+ if ((((long) tFluid.amount + getFillableStack().amount) <= (long) getRealCapacity())
+ || mVoidFluidPart
+ || mVoidFluidFull) {
+ if (aBaseMetaTileEntity.addStackToSlot(
+ getOutputSlot(),
+ GT_Utility.getContainerForFilledItem(mInventory[getInputSlot()], true),
+ 1)) {
+ getFillableStack().amount += Math
+ .min(tFluid.amount, getRealCapacity() - getFillableStack().amount);
+ aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (doesFillContainers()) {
+ ItemStack tOutput = GT_Utility
+ .fillFluidContainer(getDrainableStack(), mInventory[getInputSlot()], false, true);
+ if (tOutput != null && aBaseMetaTileEntity.addStackToSlot(getOutputSlot(), tOutput, 1)) {
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(tOutput, true);
+ aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1);
+ if (tFluid != null) getDrainableStack().amount -= tFluid.amount;
+ if (getDrainableStack().amount <= 0 && isFluidChangingAllowed()) setDrainableStack(null);
+ }
+ }
+ }
+ }
+
+ @Override
+ public int fill(FluidStack aFluid, boolean doFill) {
+ if (aFluid == null || aFluid.getFluid()
+ .getID() <= 0 || aFluid.amount <= 0 || !canTankBeFilled() || !isFluidInputAllowed(aFluid)) return 0;
+ if (getFillableStack() != null && !getFillableStack().isFluidEqual(aFluid)) {
+ return 0;
+ }
+
+ FluidStack fillableStack = getFillableStack();
+ if (fillableStack == null) {
+ fillableStack = aFluid.copy();
+ fillableStack.amount = 0;
+ }
+
+ int amount = Math.min(aFluid.amount, getRealCapacity() - fillableStack.amount);
+ if (doFill) {
+ fillableStack.amount += amount;
+ if (getFillableStack() == null) setFillableStack(fillableStack);
+ getBaseMetaTileEntity().markDirty();
+ }
+ return (mVoidFluidPart || mVoidFluidFull) ? aFluid.amount : amount;
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (mOutputFluid && getDrainableStack() != null && (aTick % 20 == 0)) {
+ IFluidHandler tTank = aBaseMetaTileEntity.getITankContainerAtSide(aBaseMetaTileEntity.getFrontFacing());
+ if (tTank != null) {
+ FluidStack tDrained = drain(20 * (1 << (3 + 2 * tierPump(mTier))), false);
+ if (tDrained != null) {
+ int tFilledAmount = tTank.fill(aBaseMetaTileEntity.getBackFacing(), tDrained, false);
+ if (tFilledAmount > 0)
+ tTank.fill(aBaseMetaTileEntity.getBackFacing(), drain(tFilledAmount, true), true);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isOutputFacing(ForgeDirection side) {
+ return false;
+ }
+
+ @Override
+ public boolean isLiquidInput(ForgeDirection side) {
+ return mAllowInputFromOutputSide || side != getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean isLiquidOutput(ForgeDirection side) {
+ return true;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public int getTankPressure() {
+ return 100;
+ }
+
+ public boolean allowOverflow() {
+ return mVoidFluidPart || mVoidFluidFull;
+ }
+
+ @Override
+ public int getCapacity() {
+ return allowOverflow() ? Integer.MAX_VALUE : getRealCapacity();
+ }
+
+ @Override
+ public int getRealCapacity() {
+ return commonSizeCompute(mTier);
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public FluidTankInfo getInfo() {
+ return new FluidTankInfo(getFluid(), getCapacity());
+ }
+
+ @Override
+ public FluidTankInfo[] getTankInfo(ForgeDirection side) {
+ return new FluidTankInfo[] { getInfo() };
+ }
+
+ @Nonnull
+ public FluidTankInfo[] getRealTankInfo(ForgeDirection side) {
+ return new FluidTankInfo[] { new FluidTankInfo(getFluid(), getRealCapacity()) };
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+
+ NBTTagCompound tag = accessor.getNBTData();
+ FluidStack fluid = tag.hasKey("mFluid") ? FluidStack.loadFluidStackFromNBT(tag.getCompoundTag("mFluid")) : null;
+ if (fluid != null && fluid.amount >= 0) {
+ currenttip.remove(0);
+ currenttip.add(
+ 0,
+ formatNumbers(fluid.amount) + " / "
+ + formatNumbers(getRealCapacity())
+ + " L "
+ + fluid.getLocalizedName());
+ } else {
+ currenttip.add(0, "Tank Empty");
+ }
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ FluidStack fluid = getFluid();
+ if (fluid != null) tag.setTag("mFluid", fluid.writeToNBT(new NBTTagCompound()));
+ else if (tag.hasKey("mFluid")) tag.removeTag("mFluid");
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ protected static final NumberFormatMUI numberFormat = new NumberFormatMUI();
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ fluidTank.setAllowOverflow(allowOverflow());
+ fluidTank.setPreventDraining(mLockFluid);
+
+ FluidSlotWidget fluidSlotWidget = new FluidSlotWidget(fluidTank);
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(7, 16)
+ .setSize(71, 45))
+ .widget(
+ new SlotWidget(inventoryHandler, getInputSlot())
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_IN)
+ .setPos(79, 16))
+ .widget(
+ new SlotWidget(inventoryHandler, getOutputSlot()).setAccess(true, false)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_OUT)
+ .setPos(79, 43))
+ .widget(
+ fluidSlotWidget.setOnClickContainer(widget -> onEmptyingContainerWhenEmpty())
+ .setBackground(GT_UITextures.TRANSPARENT)
+ .setPos(58, 41))
+ .widget(
+ new TextWidget(StatCollector.translateToLocal("GT5U.machines.digitaltank.fluid.amount"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 20))
+ .widget(
+ new TextWidget().setStringSupplier(() -> numberFormat.format(mFluid != null ? mFluid.amount : 0))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 30))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(98, 16)
+ .setSize(71, 45))
+ .widget(new FluidLockWidget(this).setPos(149, 41))
+ .widget(
+ new TextWidget(StatCollector.translateToLocal("GT5U.machines.digitaltank.lockfluid.label"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(101, 20))
+ .widget(TextWidget.dynamicString(() -> {
+ FluidStack fluidStack = FluidRegistry.getFluidStack(lockedFluidName, 1);
+ return fluidStack != null ? fluidStack.getLocalizedName()
+ : StatCollector.translateToLocal("GT5U.machines.digitaltank.lockfluid.empty");
+ })
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setTextAlignment(Alignment.CenterLeft)
+ .setMaxWidth(65)
+ .setPos(101, 30))
+ .widget(new CycleButtonWidget().setToggle(() -> mOutputFluid, val -> {
+ mOutputFluid = val;
+ if (!mOutputFluid) {
+ GT_Utility.sendChatToPlayer(
+ buildContext.getPlayer(),
+ GT_Utility.trans("262", "Fluid Auto Output Disabled"));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ buildContext.getPlayer(),
+ GT_Utility.trans("263", "Fluid Auto Output Enabled"));
+ }
+ })
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_AUTOOUTPUT_FLUID)
+ .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.autooutput.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(7, 63)
+ .setSize(18, 18))
+ .widget(new CycleButtonWidget().setToggle(() -> mLockFluid, val -> {
+ lockFluid(val);
+ fluidTank.setPreventDraining(mLockFluid);
+
+ String inBrackets;
+ if (mLockFluid) {
+ if (mFluid == null) {
+ setLockedFluidName(null);
+ inBrackets = GT_Utility
+ .trans("264", "currently none, will be locked to the next that is put in");
+ } else {
+ setLockedFluidName(
+ getDrainableStack().getFluid()
+ .getName());
+ inBrackets = getDrainableStack().getLocalizedName();
+ }
+ GT_Utility.sendChatToPlayer(
+ buildContext.getPlayer(),
+ String.format("%s (%s)", GT_Utility.trans("265", "1 specific Fluid"), inBrackets));
+ } else {
+ fluidTank.drain(0, true);
+ GT_Utility.sendChatToPlayer(
+ buildContext.getPlayer(),
+ GT_Utility.trans("266", "Lock Fluid Mode Disabled"));
+ }
+ fluidSlotWidget.notifyTooltipChange();
+ })
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_LOCK)
+ .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.lockfluid.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(25, 63)
+ .setSize(18, 18))
+ .widget(new CycleButtonWidget().setToggle(() -> mAllowInputFromOutputSide, val -> {
+ mAllowInputFromOutputSide = val;
+ if (!mAllowInputFromOutputSide) {
+ GT_Utility.sendChatToPlayer(buildContext.getPlayer(), GT_Utility.getTrans("096"));
+ } else {
+ GT_Utility.sendChatToPlayer(buildContext.getPlayer(), GT_Utility.getTrans("095"));
+ }
+ })
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_INPUT_FROM_OUTPUT_SIDE)
+ .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.inputfromoutput.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(43, 63)
+ .setSize(18, 18))
+ .widget(new CycleButtonWidget().setToggle(() -> mVoidFluidPart, val -> {
+ mVoidFluidPart = val;
+ fluidTank.setAllowOverflow(allowOverflow());
+ if (!mVoidFluidPart) {
+ GT_Utility.sendChatToPlayer(
+ buildContext.getPlayer(),
+ GT_Utility.trans("267", "Overflow Voiding Mode Disabled"));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ buildContext.getPlayer(),
+ GT_Utility.trans("268", "Overflow Voiding Mode Enabled"));
+ }
+ })
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_TANK_VOID_EXCESS)
+ .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.voidoverflow.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(98, 63)
+ .setSize(18, 18))
+ .widget(new CycleButtonWidget().setToggle(() -> mVoidFluidFull, val -> {
+ mVoidFluidFull = val;
+ fluidTank.setAllowOverflow(allowOverflow());
+ if (!mVoidFluidFull) {
+ GT_Utility
+ .sendChatToPlayer(buildContext.getPlayer(), GT_Utility.trans("269", "Void Full Mode Disabled"));
+ } else {
+ GT_Utility
+ .sendChatToPlayer(buildContext.getPlayer(), GT_Utility.trans("270", "Void Full Mode Enabled"));
+ }
+ })
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_TANK_VOID_ALL)
+ .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.digitaltank.voidfull.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(116, 63)
+ .setSize(18, 18));
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_Locker.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_Locker.java
new file mode 100644
index 0000000000..abce9514de
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_Locker.java
@@ -0,0 +1,283 @@
+package gregtech.common.tileentities.storage;
+
+import static gregtech.api.enums.Textures.BlockIcons.LOCKERS;
+import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_IN;
+import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_LOCKER;
+
+import java.util.List;
+
+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.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.objects.GT_ItemStack;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+public class GT_MetaTileEntity_Locker extends GT_MetaTileEntity_TieredMachineBlock {
+
+ private static final String CHARGE_SLOT_WAILA_TAG = "charge_slot_";
+ public byte mType = 0;
+
+ public GT_MetaTileEntity_Locker(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, 4, "Stores and recharges Armor");
+ }
+
+ public GT_MetaTileEntity_Locker(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Locker(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 4, aDescription, aTextures);
+ }
+
+ @Override
+ public String[] getDescription() {
+ String[] desc = new String[mDescriptionArray.length + 1];
+ System.arraycopy(mDescriptionArray, 0, desc, 0, mDescriptionArray.length);
+ desc[mDescriptionArray.length] = "Click with Screwdriver to change Style";
+ return desc;
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ ITexture[][][] rTextures = new ITexture[3][17][];
+ for (byte i = -1; i < 16; i = (byte) (i + 1)) {
+ ITexture[] tmp0 = { MACHINE_CASINGS[this.mTier][(i + 1)] };
+ rTextures[0][(i + 1)] = tmp0;
+ ITexture[] tmp1 = { MACHINE_CASINGS[this.mTier][(i + 1)], OVERLAYS_ENERGY_IN[this.mTier] };
+ rTextures[1][(i + 1)] = tmp1;
+ ITexture[] tmp2 = { MACHINE_CASINGS[this.mTier][(i + 1)], TextureFactory.of(OVERLAY_LOCKER) };
+ rTextures[2][(i + 1)] = tmp2;
+ }
+ return rTextures;
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection aFacing,
+ int colorIndex, boolean aActive, boolean redstoneLevel) {
+ if (side == aFacing) {
+ return new ITexture[] { this.mTextures[2][(colorIndex + 1)][0], this.mTextures[2][(colorIndex + 1)][1],
+ LOCKERS[Math.abs(this.mType % LOCKERS.length)] };
+ }
+ return this.mTextures[0][(colorIndex + 1)];
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_Locker(this.mName, this.mTier, this.mDescriptionArray, this.mTextures);
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return true;
+ }
+
+ @Override
+ public boolean isValidSlot(int aIndex) {
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return (facing.flag & (ForgeDirection.UP.flag | ForgeDirection.DOWN.flag)) == 0;
+ }
+
+ @Override
+ public boolean isEnetInput() {
+ return true;
+ }
+
+ @Override
+ public boolean isInputFacing(ForgeDirection side) {
+ return side == getBaseMetaTileEntity().getBackFacing();
+ }
+
+ @Override
+ public boolean isTeleporterCompatible() {
+ return false;
+ }
+
+ @Override
+ public long maxEUStore() {
+ return gregtech.api.enums.GT_Values.V[this.mTier] * maxAmperesIn();
+ }
+
+ @Override
+ public long maxEUInput() {
+ return gregtech.api.enums.GT_Values.V[this.mTier];
+ }
+
+ @Override
+ public long maxAmperesIn() {
+ return this.mInventory.length * 2L;
+ }
+
+ @Override
+ public int rechargerSlotStartIndex() {
+ return 0;
+ }
+
+ @Override
+ public int rechargerSlotCount() {
+ return getBaseMetaTileEntity().isAllowedToWork() ? this.mInventory.length : 0;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ aNBT.setByte("mType", this.mType);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ this.mType = aNBT.getByte("mType");
+ }
+
+ @Override
+ public void onValueUpdate(byte aValue) {
+ this.mType = aValue;
+ }
+
+ @Override
+ public byte getUpdateData() {
+ return this.mType;
+ }
+
+ @Override
+ public void doSound(byte aIndex, double aX, double aY, double aZ) {
+ if (aIndex == 16) {
+ GT_Utility.doSoundAtClient(SoundResource.RANDOM_CLICK, 1, 1.0F);
+ }
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (side == getBaseMetaTileEntity().getFrontFacing()) {
+ this.mType = ((byte) (this.mType + 1));
+ }
+ }
+
+ @Override
+ public boolean allowCoverOnSide(ForgeDirection side, GT_ItemStack aStack) {
+ return side != getBaseMetaTileEntity().getFrontFacing();
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ if ((aBaseMetaTileEntity.isServerSide()) && (side == aBaseMetaTileEntity.getFrontFacing())) {
+ for (int i = 0; i < 4; i++) {
+ ItemStack tSwapStack = this.mInventory[i];
+ this.mInventory[i] = aPlayer.inventory.armorInventory[i];
+ aPlayer.inventory.armorInventory[i] = tSwapStack;
+ }
+ aPlayer.inventoryContainer.detectAndSendChanges();
+ sendSound((byte) 16);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ for (int i = 0; i < 4; i++) {
+ final ItemStack itemStack = this.mInventory[3 - i];
+
+ if (itemStack != null) {
+ tag.setTag(CHARGE_SLOT_WAILA_TAG + i, itemStack.writeToNBT(new NBTTagCompound()));
+ }
+ }
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+
+ final NBTTagCompound tag = accessor.getNBTData();
+
+ for (int i = 0; i < 4; i++) {
+ final String index = GT_Utility.formatNumbers(i + 1);
+
+ if (tag.hasKey(CHARGE_SLOT_WAILA_TAG + i)) {
+ final ItemStack slotItem = ItemStack
+ .loadItemStackFromNBT(tag.getCompoundTag(CHARGE_SLOT_WAILA_TAG + i));
+ assert slotItem != null;
+
+ currentTip.add(
+ GT_ModHandler.getElectricItemCharge(slotItem)
+ .map(chargeInfo -> {
+ final float ratio = (float) chargeInfo[0] / (float) chargeInfo[1];
+ final EnumChatFormatting chargeFormat;
+
+ if (ratio == 0L) {
+ chargeFormat = EnumChatFormatting.GRAY;
+ } else if (ratio < 0.25) {
+ chargeFormat = EnumChatFormatting.RED;
+ } else if (ratio < 0.5) {
+ chargeFormat = EnumChatFormatting.GOLD;
+ } else if (ratio < 0.75) {
+ chargeFormat = EnumChatFormatting.YELLOW;
+ } else if (ratio < 1L) {
+ chargeFormat = EnumChatFormatting.GREEN;
+ } else {
+ chargeFormat = EnumChatFormatting.AQUA;
+ }
+
+ return StatCollector.translateToLocalFormatted(
+ "gt.locker.waila_armor_slot_charged",
+ index,
+ slotItem.getDisplayName(),
+ chargeFormat,
+ GT_Utility.formatNumbers(ratio * 100));
+ })
+ .orElseGet(
+ // Lazy initialization
+ () -> StatCollector.translateToLocalFormatted(
+ "gt.locker.waila_armor_slot_generic",
+ index,
+ slotItem.getDisplayName())));
+ } else {
+ currentTip.add(StatCollector.translateToLocalFormatted("gt.locker.waila_armor_slot_none", index));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumChest.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumChest.java
new file mode 100644
index 0000000000..c830cd4e52
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumChest.java
@@ -0,0 +1,102 @@
+package gregtech.common.tileentities.storage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+public class GT_MetaTileEntity_QuantumChest extends GT_MetaTileEntity_DigitalChestBase {
+
+ public int mItemCount = 0;
+ public ItemStack mItemStack = null;
+ NBTTagList mInvData = null;
+
+ public GT_MetaTileEntity_QuantumChest(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_QuantumChest(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_QuantumChest(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_QuantumChest(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public void setItemNBT(NBTTagCompound aNBT) {
+ mInvData = new NBTTagList();
+ for (int i = 0; i < 3; i++) {
+ if (mInventory[i] != null) {
+ NBTTagCompound tNBT = new NBTTagCompound();
+ tNBT.setByte("Count", (byte) mInventory[i].stackSize);
+ tNBT.setShort("Damage", (short) mInventory[i].getItemDamage());
+ tNBT.setShort("id", (short) Item.getIdFromItem(mInventory[i].getItem()));
+ tNBT.setInteger("IntSlot", i);
+ if (mInventory[i].hasTagCompound()) {
+ tNBT.setTag("tag", mInventory[i].getTagCompound());
+ }
+ mInvData.appendTag(tNBT);
+ }
+ }
+ if (mItemStack != null) aNBT.setTag("mItemStack", getItemStack().writeToNBT(new NBTTagCompound()));
+ aNBT.setTag("Inventory", mInvData);
+ aNBT.setInteger("mItemCount", getItemCount());
+ aNBT.setBoolean("mVoidOverflow", mVoidOverflow);
+
+ super.setItemNBT(aNBT);
+ }
+
+ @Override
+ protected String chestName() {
+ return "Quantum Chest";
+ }
+
+ @Override
+ protected int getItemCount() {
+ return mItemCount;
+ }
+
+ @Override
+ public void setItemCount(int aCount) {
+ mItemCount = aCount;
+ }
+
+ @Override
+ protected ItemStack getItemStack() {
+ return mItemStack;
+ }
+
+ @Override
+ protected void setItemStack(ItemStack s) {
+ mItemStack = s;
+ }
+
+ @Nullable
+ @Override
+ public List<ItemStack> getItemsForHoloGlasses() {
+ List<ItemStack> ret = new ArrayList<>();
+ ret.add(getStackInSlot(0));
+ ret.add(getStackInSlot(1));
+ if (mItemStack != null) {
+ ItemStack copy = mItemStack.copy();
+ copy.stackSize = mItemCount;
+ ret.add(copy);
+ }
+ return ret;
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumTank.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumTank.java
new file mode 100644
index 0000000000..4d51d0b634
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_QuantumTank.java
@@ -0,0 +1,55 @@
+package gregtech.common.tileentities.storage;
+
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_QuantumTank extends GT_MetaTileEntity_DigitalTankBase {
+
+ public GT_MetaTileEntity_QuantumTank(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_QuantumTank(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_QuantumTank(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_QuantumTank(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public String[] getInfoData() {
+
+ if (mFluid == null) {
+ return new String[] { EnumChatFormatting.BLUE + "Quantum Tank" + EnumChatFormatting.RESET, "Stored Fluid:",
+ EnumChatFormatting.GOLD + "No Fluid" + EnumChatFormatting.RESET,
+ EnumChatFormatting.GREEN + Integer.toString(0)
+ + " L"
+ + EnumChatFormatting.RESET
+ + " "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getCapacity())
+ + " L"
+ + EnumChatFormatting.RESET };
+ }
+ return new String[] { EnumChatFormatting.BLUE + "Quantum Tank" + EnumChatFormatting.RESET, "Stored Fluid:",
+ EnumChatFormatting.GOLD + mFluid.getLocalizedName() + EnumChatFormatting.RESET,
+ EnumChatFormatting.GREEN + GT_Utility.formatNumbers(mFluid.amount)
+ + " L"
+ + EnumChatFormatting.RESET
+ + " "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getCapacity())
+ + " L"
+ + EnumChatFormatting.RESET };
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperChest.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperChest.java
new file mode 100644
index 0000000000..271402f0de
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperChest.java
@@ -0,0 +1,30 @@
+package gregtech.common.tileentities.storage;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+
+public class GT_MetaTileEntity_SuperChest extends GT_MetaTileEntity_QuantumChest {
+
+ public GT_MetaTileEntity_SuperChest(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_SuperChest(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_SuperChest(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ protected String chestName() {
+ return "Super Chest";
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_SuperChest(mName, mTier, mDescriptionArray, mTextures);
+ }
+}
diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperTank.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperTank.java
new file mode 100644
index 0000000000..4f0bdbc237
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_SuperTank.java
@@ -0,0 +1,54 @@
+package gregtech.common.tileentities.storage;
+
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_SuperTank extends GT_MetaTileEntity_DigitalTankBase {
+
+ public GT_MetaTileEntity_SuperTank(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier);
+ }
+
+ public GT_MetaTileEntity_SuperTank(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_SuperTank(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_SuperTank(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public String[] getInfoData() {
+
+ if (mFluid == null) {
+ return new String[] { EnumChatFormatting.BLUE + "Super Tank" + EnumChatFormatting.RESET, "Stored Fluid:",
+ EnumChatFormatting.GOLD + "No Fluid" + EnumChatFormatting.RESET,
+ EnumChatFormatting.GREEN + "0 L"
+ + EnumChatFormatting.RESET
+ + " "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getCapacity())
+ + " L"
+ + EnumChatFormatting.RESET };
+ }
+ return new String[] { EnumChatFormatting.BLUE + "Super Tank" + EnumChatFormatting.RESET, "Stored Fluid:",
+ EnumChatFormatting.GOLD + mFluid.getLocalizedName() + EnumChatFormatting.RESET,
+ EnumChatFormatting.GREEN + GT_Utility.formatNumbers(mFluid.amount)
+ + " L"
+ + EnumChatFormatting.RESET
+ + " "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(getCapacity())
+ + " L"
+ + EnumChatFormatting.RESET };
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool.java b/src/main/java/gregtech/common/tools/GT_Tool.java
new file mode 100644
index 0000000000..cb637a1bd5
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool.java
@@ -0,0 +1,196 @@
+package gregtech.common.tools;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.stats.AchievementList;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.EntityDamageSource;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.world.World;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.api.damagesources.GT_DamageSources;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IToolStats;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+
+public abstract class GT_Tool implements IToolStats {
+
+ public static final Enchantment[] FORTUNE_ENCHANTMENT = { Enchantment.fortune };
+ public static final Enchantment[] LOOTING_ENCHANTMENT = { Enchantment.looting };
+ public static final Enchantment[] ZERO_ENCHANTMENTS = new Enchantment[0];
+ public static final int[] ZERO_ENCHANTMENT_LEVELS = new int[0];
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 800;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) {
+ return aOriginalHurtResistance;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return null;
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getBreakingSound() {
+ return SoundResource.RANDOM_BREAK.toString();
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isGrafter() {
+ return false;
+ }
+
+ @Override
+ public boolean isChainsaw() {
+ return false;
+ }
+
+ @Override
+ public boolean isWrench() {
+ return false;
+ }
+
+ @Override
+ public boolean isWeapon() {
+ return false;
+ }
+
+ @Override
+ public boolean isRangedWeapon() {
+ return false;
+ }
+
+ @Override
+ public boolean isMiningTool() {
+ return true;
+ }
+
+ @Override
+ public DamageSource getDamageSource(EntityLivingBase aPlayer, Entity aEntity) {
+ return GT_DamageSources.getCombatDamage(
+ (aPlayer instanceof EntityPlayer) ? "player" : "mob",
+ aPlayer,
+ (aEntity instanceof EntityLivingBase) ? getDeathMessage(aPlayer, (EntityLivingBase) aEntity) : null);
+ }
+
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new EntityDamageSource((aPlayer instanceof EntityPlayer) ? "player" : "mob", aPlayer)
+ .func_151519_b(aEntity);
+ }
+
+ @Override
+ public int convertBlockDrops(List<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX,
+ int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) {
+ return 0;
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public Enchantment[] getEnchantments(ItemStack aStack) {
+ return ZERO_ENCHANTMENTS;
+ }
+
+ @Override
+ public int[] getEnchantmentLevels(ItemStack aStack) {
+ return ZERO_ENCHANTMENT_LEVELS;
+ }
+
+ @Override
+ public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) {
+ aPlayer.triggerAchievement(AchievementList.openInventory);
+ aPlayer.triggerAchievement(AchievementList.mineWood);
+ aPlayer.triggerAchievement(AchievementList.buildWorkBench);
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {}
+
+ @Override
+ public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack,
+ EntityPlayer aPlayer) {
+ return aOriginalDamage;
+ }
+
+ @Override
+ public float getMagicDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack,
+ EntityPlayer aPlayer) {
+ return aOriginalDamage;
+ }
+
+ @Override
+ public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World worldObj,
+ int aX, int aY, int aZ) {
+ return aDefault;
+ }
+
+ @Override
+ public String getToolTypeName() {
+ return "tool";
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Axe.java b/src/main/java/gregtech/common/tools/GT_Tool_Axe.java
new file mode 100644
index 0000000000..c54ebac3c9
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Axe.java
@@ -0,0 +1,175 @@
+package gregtech.common.tools;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.world.World;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+
+public class GT_Tool_Axe extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 3.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 2.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return null;
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isWeapon() {
+ return true;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "axe")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.wood)
+ || GT_ToolHarvestHelper.isSpecialBlock(aBlock, Blocks.ladder);
+ }
+
+ @Override
+ public int convertBlockDrops(List<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX,
+ int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) {
+ int rAmount = 0;
+ if ((GregTech_API.sTimber) && (!aPlayer.isSneaking())
+ && (OrePrefixes.log.contains(new ItemStack(aBlock, 1, aMetaData)))) {
+ int tY = aY + 1;
+ for (int tH = aPlayer.worldObj.getHeight(); tY < tH; tY++) {
+ if ((aPlayer.worldObj.getBlock(aX, tY, aZ) != aBlock)
+ || (!aPlayer.worldObj.func_147480_a(aX, tY, aZ, true))) {
+ break;
+ }
+ rAmount++;
+ }
+ }
+ return rAmount;
+ }
+
+ @Override
+ public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World aWorld,
+ int aX, int aY, int aZ) {
+
+ if (aBlock.isWood(aPlayer.worldObj, aX, aY, aZ)
+ && OrePrefixes.log.contains(new ItemStack(aBlock, 1, aMetaData))) {
+ float rAmount = 1.0F;
+ float tIncrement = 1.0F;
+ if ((GregTech_API.sTimber) && !aPlayer.isSneaking()) {
+ int tY = aY + 1;
+ for (int tH = aPlayer.worldObj.getHeight(); (tY < tH)
+ && (aPlayer.worldObj.getBlock(aX, tY, aZ) == aBlock); tY++) {
+ tIncrement += 0.1F;
+ rAmount += tIncrement;
+ }
+ }
+ return 2.0F * aDefault / rAmount;
+ }
+
+ return (aBlock.getMaterial() == Material.leaves) || (aBlock.getMaterial() == Material.vine)
+ || (aBlock.getMaterial() == Material.plants)
+ || (aBlock.getMaterial() == Material.gourd) ? aDefault / 4.0F : aDefault;
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mIconSet.mTextures[OrePrefixes.toolHeadAxe.mTextureIndex]
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mIconSet.mTextures[OrePrefixes.stick.mTextureIndex];
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {}
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " has been chopped by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_BranchCutter.java b/src/main/java/gregtech/common/tools/GT_Tool_BranchCutter.java
new file mode 100644
index 0000000000..a8b83a0221
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_BranchCutter.java
@@ -0,0 +1,101 @@
+package gregtech.common.tools;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_ToolHarvestHelper;
+import gregtech.api.util.GT_Utility;
+
+public class GT_Tool_BranchCutter extends GT_Tool {
+
+ @Override
+ public float getBaseDamage() {
+ return 2.5F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 0.25F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 0.25F;
+ }
+
+ @Override
+ public boolean isGrafter() {
+ return true;
+ }
+
+ @Override
+ public int convertBlockDrops(List<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX,
+ int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) {
+ if (aBlock.getMaterial() == Material.leaves) {
+ aEvent.dropChance = Math.min(
+ 1.0F,
+ Math.max(
+ aEvent.dropChance,
+ (aStack.getItem()
+ .getHarvestLevel(aStack, "") + 1) * 0.2F));
+ if (aBlock == Blocks.leaves) {
+ aDrops.clear();
+ if (((aMetaData & 0x3) == 0) && (aPlayer.worldObj.rand.nextInt(9) <= aFortune * 2)) {
+ aDrops.add(new ItemStack(Items.apple, 1, 0));
+ } else {
+ aDrops.add(new ItemStack(Blocks.sapling, 1, aMetaData & 0x3));
+ }
+ } else if (aBlock == Blocks.leaves2) {
+ aDrops.clear();
+ aDrops.add(new ItemStack(Blocks.sapling, 1, (aMetaData & 0x3) + 4));
+ } else if (aBlock == GT_Utility.getBlockFromStack(GT_ModHandler.getIC2Item("rubberLeaves", 1L))) {
+ aDrops.clear();
+ aDrops.add(GT_ModHandler.getIC2Item("rubberSapling", 1L));
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "grafter")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.leaves);
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.GRAFTER : null;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " has been trimmed by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_ButcheryKnife.java b/src/main/java/gregtech/common/tools/GT_Tool_ButcheryKnife.java
new file mode 100644
index 0000000000..bdfe66401a
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_ButcheryKnife.java
@@ -0,0 +1,104 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+
+public class GT_Tool_ButcheryKnife extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 200;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 3.0F;
+ }
+
+ @Override
+ public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) {
+ return aOriginalHurtResistance * 2;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 0.1F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public boolean isWeapon() {
+ return true;
+ }
+
+ @Override
+ public boolean isMiningTool() {
+ return false;
+ }
+
+ @Override
+ public Enchantment[] getEnchantments(ItemStack aStack) {
+ return LOOTING_ENCHANTMENT;
+ }
+
+ @Override
+ public int[] getEnchantmentLevels(ItemStack aStack) {
+ return new int[] { (2 + GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mToolQuality) / 2 };
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.BUTCHERYKNIFE : null;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.GREEN + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " has butchered "
+ + EnumChatFormatting.RED
+ + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_BuzzSaw.java b/src/main/java/gregtech/common/tools/GT_Tool_BuzzSaw.java
new file mode 100644
index 0000000000..4d7192ce93
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_BuzzSaw.java
@@ -0,0 +1,81 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+
+public class GT_Tool_BuzzSaw extends GT_Tool_Saw {
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 300;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_TWO.toString();
+ }
+
+ @Override
+ public String getMiningSound() {
+ return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE.toString();
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return false;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return !aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadBuzzSaw.mTextureIndex]
+ : Textures.ItemIcons.HANDLE_BUZZSAW;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " got buzzed by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_HV.java b/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_HV.java
new file mode 100644
index 0000000000..38c1d3acb8
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_HV.java
@@ -0,0 +1,57 @@
+package gregtech.common.tools;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+
+public class GT_Tool_Chainsaw_HV extends GT_Tool_Chainsaw_LV {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 800;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 1600;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 12800;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 3200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 1;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 4.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? gregtech.api.items.GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadChainsaw.mTextureIndex]
+ : Textures.ItemIcons.POWER_UNIT_HV;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_LV.java b/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_LV.java
new file mode 100644
index 0000000000..142b0c50d2
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_LV.java
@@ -0,0 +1,185 @@
+package gregtech.common.tools;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.world.World;
+import net.minecraftforge.common.IShearable;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+
+public class GT_Tool_Chainsaw_LV extends GT_Tool_Saw {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 800;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 3.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 2.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_TWO.toString();
+ }
+
+ @Override
+ public String getMiningSound() {
+ return SoundResource.IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE.toString();
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isChainsaw() {
+ return true;
+ }
+
+ @Override
+ public boolean isWeapon() {
+ return true;
+ }
+
+ @Override
+ public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) {
+ super.onToolCrafted(aStack, aPlayer);
+ try {
+ GT_Mod.achievements.issueAchievement(aPlayer, "brrrr");
+ GT_Mod.achievements.issueAchievement(aPlayer, "buildChainsaw");
+ } catch (Exception ignored) {}
+ }
+
+ @Override
+ public int convertBlockDrops(List<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX,
+ int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) {
+ int rAmount = 0;
+ if ((aBlock.getMaterial() == Material.leaves) && ((aBlock instanceof IShearable))) {
+ aPlayer.worldObj.setBlock(aX, aY, aZ, aBlock, aMetaData, 0);
+ if (((IShearable) aBlock).isShearable(aStack, aPlayer.worldObj, aX, aY, aZ)) {
+ ((IShearable) aBlock).onSheared(aStack, aPlayer.worldObj, aX, aY, aZ, aFortune);
+ aDrops.clear();
+ }
+ aPlayer.worldObj.setBlock(aX, aY, aZ, Blocks.air, 0, 0);
+ } else if (((aBlock.getMaterial() == Material.ice) || (aBlock.getMaterial() == Material.packedIce))
+ && (aDrops.isEmpty())) {
+ aDrops.add(new ItemStack(aBlock, 1, aMetaData));
+ aPlayer.worldObj.setBlockToAir(aX, aY, aZ);
+ aEvent.dropChance = 1.0F;
+ return 1;
+ }
+ if ((GregTech_API.sTimber) && (!aPlayer.isSneaking())
+ && (OrePrefixes.log.contains(new ItemStack(aBlock, 1, aMetaData)))) {
+ int tY = aY + 1;
+ for (int tH = aPlayer.worldObj.getHeight(); tY < tH; tY++) {
+ if ((aPlayer.worldObj.getBlock(aX, tY, aZ) != aBlock)
+ || (!aPlayer.worldObj.func_147480_a(aX, tY, aZ, true))) {
+ break;
+ }
+ rAmount++;
+ }
+ }
+ return rAmount;
+ }
+
+ @Override
+ public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World aWorld,
+ int aX, int aY, int aZ) {
+ if (aBlock.isWood(aPlayer.worldObj, aX, aY, aZ)
+ && OrePrefixes.log.contains(new ItemStack(aBlock, 1, aMetaData))) {
+ float rAmount = 1.0F;
+ float tIncrement = 1.0F;
+ if ((GregTech_API.sTimber) && !aPlayer.isSneaking()) {
+ int tY = aY + 1;
+ for (int tH = aPlayer.worldObj.getHeight(); (tY < tH)
+ && (aPlayer.worldObj.getBlock(aX, tY, aZ) == aBlock); tY++) {
+ tIncrement += 0.1F;
+ rAmount += tIncrement;
+ }
+ }
+ return 2.0F * aDefault / rAmount;
+ }
+ return (aBlock.getMaterial() == Material.leaves) || (aBlock.getMaterial() == Material.vine)
+ || (aBlock.getMaterial() == Material.plants)
+ || (aBlock.getMaterial() == Material.gourd) ? aDefault / 4.0F : aDefault;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadChainsaw.mTextureIndex]
+ : Textures.ItemIcons.POWER_UNIT_LV;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " was massacred by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_MV.java b/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_MV.java
new file mode 100644
index 0000000000..6c88895e48
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Chainsaw_MV.java
@@ -0,0 +1,57 @@
+package gregtech.common.tools;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+
+public class GT_Tool_Chainsaw_MV extends GT_Tool_Chainsaw_LV {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 200;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 3200;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 800;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 1;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 3.5F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 3.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 2.0F;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? gregtech.api.items.GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadChainsaw.mTextureIndex]
+ : Textures.ItemIcons.POWER_UNIT_MV;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Crowbar.java b/src/main/java/gregtech/common/tools/GT_Tool_Crowbar.java
new file mode 100644
index 0000000000..761784284d
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Crowbar.java
@@ -0,0 +1,140 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import com.google.common.base.Strings;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.IToolStats;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gregtech.common.items.behaviors.Behaviour_Crowbar;
+
+public class GT_Tool_Crowbar extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 2.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.RANDOM_BREAK.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return SoundResource.RANDOM_BREAK.toString();
+ }
+
+ @Override
+ public String getMiningSound() {
+ return SoundResource.RANDOM_BREAK.toString();
+ }
+
+ @Override
+ public boolean canBlock() {
+ return true;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return true;
+ }
+
+ @Override
+ public boolean isWeapon() {
+ return true;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ if (aBlock.getMaterial() == Material.circuits) {
+ return true;
+ }
+ String tTool = aBlock.getHarvestTool(aMetaData);
+ if (Strings.isNullOrEmpty(tTool)) {
+ for (IToolStats i : GT_MetaGenerated_Tool_01.INSTANCE.mToolStats.values()) {
+ if (i instanceof GT_Tool_Crowbar && i != this && !i.isMinableBlock(aBlock, aMetaData)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return tTool.equals("crowbar");
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.CROWBAR : null;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa : null;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ aItem.addItemBehavior(aID, new Behaviour_Crowbar(1, 1000));
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " was removed by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Drill_HV.java b/src/main/java/gregtech/common/tools/GT_Tool_Drill_HV.java
new file mode 100644
index 0000000000..3731f578db
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Drill_HV.java
@@ -0,0 +1,68 @@
+package gregtech.common.tools;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+
+public class GT_Tool_Drill_HV extends GT_Tool_Drill_LV {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return GT_Mod.gregtechproxy.mHardRock ? 400 : 800;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 1600;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 12800;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 3200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 1;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 3.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 9.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) {
+ super.onToolCrafted(aStack, aPlayer);
+ try {
+ GT_Mod.achievements.issueAchievement(aPlayer, "highpowerdrill");
+ GT_Mod.achievements.issueAchievement(aPlayer, "buildDDrill");
+ } catch (Exception ignored) {}
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? gregtech.api.items.GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadDrill.mTextureIndex]
+ : Textures.ItemIcons.POWER_UNIT_HV;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Drill_LV.java b/src/main/java/gregtech/common/tools/GT_Tool_Drill_LV.java
new file mode 100644
index 0000000000..911374dc15
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Drill_LV.java
@@ -0,0 +1,152 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+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.stats.AchievementList;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+
+public class GT_Tool_Drill_LV extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return GT_Mod.gregtechproxy.mHardRock ? 25 : 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 2.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 3.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT.toString();
+ }
+
+ @Override
+ public String getBreakingSound() {
+ return SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT.toString();
+ }
+
+ @Override
+ public String getMiningSound() {
+ return SoundResource.IC2_TOOLS_DRILL_DRILL_SOFT.toString();
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "pickaxe", "shovel")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(
+ aBlock,
+ Material.rock,
+ Material.iron,
+ Material.anvil,
+ Material.sand,
+ Material.grass,
+ Material.ground,
+ Material.snow,
+ Material.clay,
+ Material.glass);
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadDrill.mTextureIndex]
+ : Textures.ItemIcons.POWER_UNIT_LV;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {}
+
+ @Override
+ public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) {
+ super.onToolCrafted(aStack, aPlayer);
+ aPlayer.triggerAchievement(AchievementList.buildPickaxe);
+ aPlayer.triggerAchievement(AchievementList.buildBetterPickaxe);
+ try {
+ GT_Mod.achievements.issueAchievement(aPlayer, "driltime");
+ GT_Mod.achievements.issueAchievement(aPlayer, "buildDrill");
+ } catch (Exception ignored) {}
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " got the Drill! (by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + ")");
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Drill_MV.java b/src/main/java/gregtech/common/tools/GT_Tool_Drill_MV.java
new file mode 100644
index 0000000000..02e7a08dfc
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Drill_MV.java
@@ -0,0 +1,58 @@
+package gregtech.common.tools;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+
+public class GT_Tool_Drill_MV extends GT_Tool_Drill_LV {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return GT_Mod.gregtechproxy.mHardRock ? 100 : 200;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 3200;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 800;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 1;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 2.5F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 6.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 2.0F;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? gregtech.api.items.GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadDrill.mTextureIndex]
+ : Textures.ItemIcons.POWER_UNIT_MV;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_File.java b/src/main/java/gregtech/common/tools/GT_Tool_File.java
new file mode 100644
index 0000000000..0a8610a462
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_File.java
@@ -0,0 +1,124 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+
+public class GT_Tool_File extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 1.5F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return null;
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return true;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isMiningTool() {
+ return false;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "file");
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return !aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadFile.mTextureIndex]
+ : Textures.ItemIcons.HANDLE_FILE;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {}
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " has been filed D for 'Dead' by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_HardHammer.java b/src/main/java/gregtech/common/tools/GT_Tool_HardHammer.java
new file mode 100644
index 0000000000..066abd48b8
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_HardHammer.java
@@ -0,0 +1,203 @@
+package gregtech.common.tools;
+
+import static gregtech.GT_Mod.MAX_IC2;
+
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityIronGolem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_ToolHarvestHelper;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.items.behaviors.Behaviour_Prospecting;
+
+public class GT_Tool_HardHammer extends GT_Tool {
+
+ public static final List<String> mEffectiveList = Arrays
+ .asList(EntityIronGolem.class.getName(), "EntityTowerGuardian");
+
+ @Override
+ public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack,
+ EntityPlayer aPlayer) {
+ String tName = aEntity.getClass()
+ .getName();
+ tName = tName.substring(tName.lastIndexOf('.') + 1);
+ return (mEffectiveList.contains(tName)) || (tName.contains("Golem")) ? aOriginalDamage * 2.0F : aOriginalDamage;
+ }
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 200;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 3.0F;
+ }
+
+ @Override
+ public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) {
+ return aOriginalHurtResistance * 2;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 0.75F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.RANDOM_ANVIL_USE.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getBreakingSound() {
+ return SoundResource.RANDOM_ANVIL_BREAK.toString();
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return true;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isWeapon() {
+ return true;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "hammer", "pickaxe")
+ || GT_ToolHarvestHelper
+ .isAppropriateMaterial(aBlock, Material.rock, Material.glass, Material.ice, Material.packedIce)
+ || RecipeMaps.hammerRecipes.containsInput(new ItemStack(aBlock, 1, aMetaData));
+ }
+
+ @Override
+ public int convertBlockDrops(List<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX,
+ int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) {
+ int rConversions = 0;
+ GT_Recipe tRecipe = RecipeMaps.hammerRecipes
+ .findRecipe(null, true, MAX_IC2, null, new ItemStack(aBlock, 1, aMetaData));
+ if ((tRecipe == null) || (aBlock.hasTileEntity(aMetaData))) {
+ for (ItemStack tDrop : aDrops) {
+ tRecipe = RecipeMaps.hammerRecipes
+ .findRecipe(null, true, MAX_IC2, null, GT_Utility.copyAmount(1, tDrop));
+ if (tRecipe != null) {
+ ItemStack tHammeringOutput = tRecipe.getOutput(0);
+ if (tHammeringOutput != null) {
+ rConversions += tDrop.stackSize;
+ tDrop.stackSize *= tHammeringOutput.stackSize;
+ tHammeringOutput.stackSize = tDrop.stackSize;
+ GT_Utility.setStack(tDrop, tHammeringOutput);
+ }
+ }
+ }
+ } else {
+ aDrops.clear();
+ aDrops.add(tRecipe.getOutput(0));
+ rConversions++;
+ }
+ return rConversions;
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadHammer.mTextureIndex]
+ : GT_MetaGenerated_Tool
+ .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex];
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ aItem.addItemBehavior(aID, new Behaviour_Prospecting(1, 1000));
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " was squashed by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+
+ @Override
+ public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) {
+ super.onToolCrafted(aStack, aPlayer);
+ try {
+ GT_Mod.achievements.issueAchievement(aPlayer, "tools");
+ } catch (Exception ignored) {}
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Hoe.java b/src/main/java/gregtech/common/tools/GT_Tool_Hoe.java
new file mode 100644
index 0000000000..2dc5496176
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Hoe.java
@@ -0,0 +1,132 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+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.stats.AchievementList;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+import gregtech.common.items.behaviors.Behaviour_Hoe;
+
+public class GT_Tool_Hoe extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 1.75F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return null;
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "hoe")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.gourd);
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool
+ .getPrimaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadHoe.mTextureIndex]
+ : GT_MetaGenerated_Tool
+ .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex];
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ aItem.addItemBehavior(aID, new Behaviour_Hoe(100));
+ }
+
+ @Override
+ public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) {
+ super.onToolCrafted(aStack, aPlayer);
+ aPlayer.triggerAchievement(AchievementList.buildHoe);
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " has been called a stupid Hoe by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_JackHammer.java b/src/main/java/gregtech/common/tools/GT_Tool_JackHammer.java
new file mode 100644
index 0000000000..2621ff8ef7
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_JackHammer.java
@@ -0,0 +1,128 @@
+package gregtech.common.tools;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+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.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_ToolHarvestHelper;
+import gregtech.api.util.GT_Utility;
+
+public class GT_Tool_JackHammer extends GT_Tool_Drill_LV {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return GT_Mod.gregtechproxy.mHardRock ? 200 : 400;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 3200;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 800;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 1;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 3.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 12.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 2.0F;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "pickaxe") //
+ || GT_ToolHarvestHelper.isAppropriateMaterial(
+ aBlock, //
+ Material.rock, //
+ Material.glass, //
+ Material.ice, //
+ Material.packedIce //
+ );
+ }
+
+ @Override
+ public int convertBlockDrops(List<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX,
+ int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) {
+ int rConversions = 0;
+ GT_Recipe tRecipe = RecipeMaps.hammerRecipes
+ .findRecipe(null, true, 2147483647L, null, new ItemStack(aBlock, 1, aMetaData));
+ if ((tRecipe == null) || (aBlock.hasTileEntity(aMetaData))) {
+ for (ItemStack tDrop : aDrops) {
+ tRecipe = RecipeMaps.hammerRecipes
+ .findRecipe(null, true, 2147483647L, null, GT_Utility.copyAmount(1, tDrop));
+ if (tRecipe != null) {
+ ItemStack tHammeringOutput = tRecipe.getOutput(0);
+ if (tHammeringOutput != null) {
+ rConversions += tDrop.stackSize;
+ tDrop.stackSize *= tHammeringOutput.stackSize;
+ tHammeringOutput.stackSize = tDrop.stackSize;
+ GT_Utility.setStack(tDrop, tHammeringOutput);
+ }
+ }
+ }
+ } else {
+ aDrops.clear();
+ aDrops.add(tRecipe.getOutput(0));
+ rConversions++;
+ }
+ return rConversions;
+ }
+
+ @Override
+ public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) {
+ super.onToolCrafted(aStack, aPlayer);
+ try {
+ GT_Mod.achievements.issueAchievement(aPlayer, "hammertime");
+ } catch (Exception ignored) {}
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.JACKHAMMER : null;
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " has been jackhammered into pieces by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Knife.java b/src/main/java/gregtech/common/tools/GT_Tool_Knife.java
new file mode 100644
index 0000000000..152476fa2d
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Knife.java
@@ -0,0 +1,76 @@
+package gregtech.common.tools;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+
+public class GT_Tool_Knife extends GT_Tool_Sword {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 600;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 0F;
+ }
+
+ @Override
+ public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) {
+ return aOriginalHurtResistance * 3;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 0.5F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.KNIFE : null;
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ "<" + EnumChatFormatting.RED
+ + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + "> "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " what are you doing?, "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + "?!? STAHP!!!");
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Mortar.java b/src/main/java/gregtech/common/tools/GT_Tool_Mortar.java
new file mode 100644
index 0000000000..8e74d3bcc1
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Mortar.java
@@ -0,0 +1,120 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+
+public class GT_Tool_Mortar extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 2.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return null;
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isMiningTool() {
+ return false;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return false;
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.MORTAR : null;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa : Dyes._NULL.mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {}
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " was grounded by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Pickaxe.java b/src/main/java/gregtech/common/tools/GT_Tool_Pickaxe.java
new file mode 100644
index 0000000000..e2857e4af1
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Pickaxe.java
@@ -0,0 +1,139 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+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.stats.AchievementList;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.GT_Mod;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+
+public class GT_Tool_Pickaxe extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return GT_Mod.gregtechproxy.mHardRock ? 25 : 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 1.5F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return null;
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "pickaxe") //
+ || GT_ToolHarvestHelper.isAppropriateMaterial(
+ aBlock, //
+ Material.rock,
+ Material.iron,
+ Material.anvil,
+ Material.glass);
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadPickaxe.mTextureIndex]
+ : GT_MetaGenerated_Tool
+ .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex];
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {}
+
+ @Override
+ public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) {
+ super.onToolCrafted(aStack, aPlayer);
+ aPlayer.triggerAchievement(AchievementList.buildPickaxe);
+ aPlayer.triggerAchievement(AchievementList.buildBetterPickaxe);
+ try {
+ GT_Mod.achievements.issueAchievement(aPlayer, "flintpick");
+ } catch (Exception ignored) {}
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " got mined by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Plow.java b/src/main/java/gregtech/common/tools/GT_Tool_Plow.java
new file mode 100644
index 0000000000..b6f4be25b5
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Plow.java
@@ -0,0 +1,110 @@
+package gregtech.common.tools;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntitySnowman;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.world.World;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+
+public class GT_Tool_Plow extends GT_Tool {
+
+ private final ThreadLocal<Object> sIsHarvestingRightNow = new ThreadLocal<>();
+
+ @Override
+ public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack,
+ EntityPlayer aPlayer) {
+ return (aEntity instanceof EntitySnowman) ? aOriginalDamage * 4.0F : aOriginalDamage;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 1.0F;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "plow")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.snow, Material.craftedSnow);
+ }
+
+ @Override
+ public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World worldObj,
+ int aX, int aY, int aZ) {
+ // Speed nerf for using AOE tools to break single block
+ if (aPlayer != null && aPlayer.isSneaking()) {
+ return aDefault / 2;
+ }
+ return super.getMiningSpeed(aBlock, aMetaData, aDefault, aPlayer, worldObj, aX, aY, aZ);
+ }
+
+ @Override
+ public int convertBlockDrops(List<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX,
+ int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) {
+ int rConversions = 0;
+ if ((this.sIsHarvestingRightNow.get() == null) && ((aPlayer instanceof EntityPlayerMP))) {
+ this.sIsHarvestingRightNow.set(this);
+
+ if (!aPlayer.isSneaking()) {
+ for (int i = -1; i < 2; i++) {
+ for (int j = -1; j < 2; j++) {
+ for (int k = -1; k < 2; k++) {
+ if (((i != 0) || (j != 0) || (k != 0)) && (aStack.getItem()
+ .getDigSpeed(
+ aStack,
+ aPlayer.worldObj.getBlock(aX + i, aY + j, aZ + k),
+ aPlayer.worldObj.getBlockMetadata(aX + i, aY + j, aZ + k))
+ > 0.0F)
+ && (((EntityPlayerMP) aPlayer).theItemInWorldManager
+ .tryHarvestBlock(aX + i, aY + j, aZ + k))) {
+ rConversions++;
+ }
+ }
+ }
+ }
+ }
+
+ this.sIsHarvestingRightNow.set(null);
+ }
+ return rConversions;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadPlow.mTextureIndex]
+ : GT_MetaGenerated_Tool
+ .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex];
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.GREEN + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " plew through the yard of "
+ + EnumChatFormatting.RED
+ + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Plunger.java b/src/main/java/gregtech/common/tools/GT_Tool_Plunger.java
new file mode 100644
index 0000000000..76c1ccbc24
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Plunger.java
@@ -0,0 +1,92 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.interfaces.IItemBehaviour;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.items.behaviors.Behaviour_Plunger_Fluid;
+import gregtech.common.items.behaviors.Behaviour_Plunger_Item;
+
+public class GT_Tool_Plunger extends GT_Tool {
+
+ @Override
+ public float getBaseDamage() {
+ return 1.25F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 0.25F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString();
+ }
+
+ @Override
+ public String getMiningSound() {
+ return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString();
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "plunger");
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.PLUNGER : null;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked") // the IItemBehaviour cast cannot be expressed strictly via generics
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ aItem.addItemBehavior(aID, new Behaviour_Plunger_Item(getToolDamagePerDropConversion()));
+ aItem.addItemBehavior(aID, new Behaviour_Plunger_Fluid(getToolDamagePerDropConversion()));
+ try {
+ Object tObject = GT_Utility.callConstructor(
+ "gregtech.common.items.behaviors.Behaviour_Plunger_Essentia",
+ 0,
+ null,
+ false,
+ getToolDamagePerDropConversion());
+ if ((tObject instanceof IItemBehaviour)) {
+ aItem.addItemBehavior(aID, (IItemBehaviour<GT_MetaBase_Item>) tObject);
+ }
+ } catch (Throwable ignored) {}
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " got stuck trying to escape through a Pipe while fighting "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_RollingPin.java b/src/main/java/gregtech/common/tools/GT_Tool_RollingPin.java
new file mode 100644
index 0000000000..9933c4eb13
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_RollingPin.java
@@ -0,0 +1,70 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+
+public class GT_Tool_RollingPin extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 2.0F;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return false;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa : Dyes._NULL.mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {}
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.ROLLING_PIN : null;
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " got flattened by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Saw.java b/src/main/java/gregtech/common/tools/GT_Tool_Saw.java
new file mode 100644
index 0000000000..b2c85e2a5e
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Saw.java
@@ -0,0 +1,149 @@
+package gregtech.common.tools;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraftforge.common.IShearable;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+
+public class GT_Tool_Saw extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 200;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 1.75F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return null;
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public int convertBlockDrops(List<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX,
+ int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) {
+ if ((aBlock.getMaterial() == Material.leaves) && ((aBlock instanceof IShearable))) {
+ aPlayer.worldObj.setBlock(aX, aY, aZ, aBlock, aMetaData, 0);
+ if (((IShearable) aBlock).isShearable(aStack, aPlayer.worldObj, aX, aY, aZ)) {
+ ArrayList<ItemStack> tDrops = ((IShearable) aBlock)
+ .onSheared(aStack, aPlayer.worldObj, aX, aY, aZ, aFortune);
+ aDrops.clear();
+ aDrops.addAll(tDrops);
+ aEvent.dropChance = 1.0F;
+ }
+ aPlayer.worldObj.setBlock(aX, aY, aZ, Blocks.air, 0, 0);
+ } else if (((aBlock.getMaterial() == Material.ice) || (aBlock.getMaterial() == Material.packedIce))
+ && (aDrops.isEmpty())) {
+ aDrops.add(new ItemStack(aBlock, 1, aMetaData));
+ aPlayer.worldObj.setBlockToAir(aX, aY, aZ);
+ aEvent.dropChance = 1.0F;
+ return 1;
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "axe", "saw")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(
+ aBlock,
+ Material.leaves,
+ Material.vine,
+ Material.wood,
+ Material.cactus,
+ Material.ice,
+ Material.packedIce)
+ || GT_ToolHarvestHelper.isSpecialBlock(aBlock, Blocks.ladder);
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool
+ .getPrimaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadSaw.mTextureIndex]
+ : Textures.ItemIcons.HANDLE_SAW;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {}
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " was getting cut down by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Scoop.java b/src/main/java/gregtech/common/tools/GT_Tool_Scoop.java
new file mode 100644
index 0000000000..3181e108bf
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Scoop.java
@@ -0,0 +1,130 @@
+package gregtech.common.tools;
+
+import static gregtech.api.enums.Mods.Forestry;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+import gregtech.common.items.behaviors.Behaviour_None;
+import gregtech.common.items.behaviors.Behaviour_Scoop;
+
+public class GT_Tool_Scoop extends GT_Tool {
+
+ public static Material sBeeHiveMaterial;
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 200;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 200;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return null;
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "scoop")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, sBeeHiveMaterial);
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.SCOOP : null;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ if (Forestry.isModLoaded()) {
+ aItem.addItemBehavior(aID, new Behaviour_Scoop(200));
+ } else {
+ aItem.addItemBehavior(aID, new Behaviour_None());
+ }
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " got scooped up by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Screwdriver.java b/src/main/java/gregtech/common/tools/GT_Tool_Screwdriver.java
new file mode 100644
index 0000000000..1d7f4e655d
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Screwdriver.java
@@ -0,0 +1,160 @@
+package gregtech.common.tools;
+
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityCaveSpider;
+import net.minecraft.entity.monster.EntitySpider;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+import gregtech.common.items.behaviors.Behaviour_Screwdriver;
+
+public class GT_Tool_Screwdriver extends GT_Tool {
+
+ public static final List<String> mEffectiveList = Arrays.asList(
+ EntityCaveSpider.class.getName(),
+ EntitySpider.class.getName(),
+ "EntityTFHedgeSpider",
+ "EntityTFKingSpider",
+ "EntityTFSwarmSpider",
+ "EntityTFTowerBroodling");
+
+ @Override
+ public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack,
+ EntityPlayer aPlayer) {
+ String tName = aEntity.getClass()
+ .getName();
+ tName = tName.substring(tName.lastIndexOf('.') + 1);
+ return mEffectiveList.contains(tName) ? aOriginalDamage * 2.0F : aOriginalDamage;
+ }
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 200;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 1.5F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.IC2_TOOLS_WRENCH.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return true;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isMiningTool() {
+ return false;
+ }
+
+ @Override
+ public boolean isScrewdriver() {
+ return true;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "screwdriver")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.circuits);
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return !aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadScrewdriver.mTextureIndex]
+ : Textures.ItemIcons.HANDLE_SCREWDRIVER;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ aItem.addItemBehavior(aID, new Behaviour_Screwdriver(1, 200));
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " is screwed! (by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + ")");
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Screwdriver_LV.java b/src/main/java/gregtech/common/tools/GT_Tool_Screwdriver_LV.java
new file mode 100644
index 0000000000..e49e020b7b
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Screwdriver_LV.java
@@ -0,0 +1,34 @@
+package gregtech.common.tools;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+
+public class GT_Tool_Screwdriver_LV extends GT_Tool_Screwdriver {
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 200;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return !aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadScrewdriver.mTextureIndex]
+ : Textures.ItemIcons.HANDLE_ELECTRIC_SCREWDRIVER;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Sense.java b/src/main/java/gregtech/common/tools/GT_Tool_Sense.java
new file mode 100644
index 0000000000..013c0f800c
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Sense.java
@@ -0,0 +1,114 @@
+package gregtech.common.tools;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.world.World;
+import net.minecraftforge.event.world.BlockEvent;
+
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+import gregtech.common.items.behaviors.Behaviour_Sense;
+
+public class GT_Tool_Sense extends GT_Tool {
+
+ private final ThreadLocal<Object> sIsHarvestingRightNow = new ThreadLocal<>();
+
+ @Override
+ public float getBaseDamage() {
+ return 3.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "sense", "scythe")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.plants, Material.leaves);
+ }
+
+ @Override
+ public float getMiningSpeed(Block aBlock, byte aMetaData, float aDefault, EntityPlayer aPlayer, World worldObj,
+ int aX, int aY, int aZ) {
+ // Speed nerf for using AOE tools to break single block
+ if (aPlayer != null && aPlayer.isSneaking()) {
+ return aDefault / 2;
+ }
+ return super.getMiningSpeed(aBlock, aMetaData, aDefault, aPlayer, worldObj, aX, aY, aZ);
+ }
+
+ @Override
+ public int convertBlockDrops(List<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX,
+ int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) {
+ int rConversions = 0;
+ if ((this.sIsHarvestingRightNow.get() == null) && ((aPlayer instanceof EntityPlayerMP))) {
+ this.sIsHarvestingRightNow.set(this);
+
+ if (!aPlayer.isSneaking()) {
+ for (int i = -2; i < 3; i++) {
+ for (int j = -2; j < 3; j++) {
+ for (int k = -2; k < 3; k++) {
+ if (((i != 0) || (j != 0) || (k != 0)) && (aStack.getItem()
+ .getDigSpeed(
+ aStack,
+ aPlayer.worldObj.getBlock(aX + i, aY + j, aZ + k),
+ aPlayer.worldObj.getBlockMetadata(aX + i, aY + j, aZ + k))
+ > 0.0F)
+ && (((EntityPlayerMP) aPlayer).theItemInWorldManager
+ .tryHarvestBlock(aX + i, aY + j, aZ + k))) {
+ rConversions++;
+ }
+ }
+ }
+ }
+ }
+
+ this.sIsHarvestingRightNow.set(null);
+ }
+ return rConversions;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadSense.mTextureIndex]
+ : GT_MetaGenerated_Tool
+ .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex];
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ aItem.addItemBehavior(aID, new Behaviour_Sense(getToolDamagePerBlockBreak()));
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.GREEN + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " has taken the Soul of "
+ + EnumChatFormatting.RED
+ + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Shovel.java b/src/main/java/gregtech/common/tools/GT_Tool_Shovel.java
new file mode 100644
index 0000000000..886ca126e0
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Shovel.java
@@ -0,0 +1,127 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+
+public class GT_Tool_Shovel extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 1.5F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return null;
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "shovel")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(
+ aBlock,
+ Material.sand,
+ Material.grass,
+ Material.ground,
+ Material.snow,
+ Material.clay);
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadShovel.mTextureIndex]
+ : GT_MetaGenerated_Tool
+ .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex];
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {}
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " got dug up by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_SoftHammer.java b/src/main/java/gregtech/common/tools/GT_Tool_SoftHammer.java
new file mode 100644
index 0000000000..cc3f5e738b
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_SoftHammer.java
@@ -0,0 +1,139 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+import gregtech.common.items.behaviors.Behaviour_SoftHammer;
+
+public class GT_Tool_SoftHammer extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 800;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 3.0F;
+ }
+
+ @Override
+ public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) {
+ return aOriginalHurtResistance * 2;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 0.1F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 8.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString();
+ }
+
+ @Override
+ public String getMiningSound() {
+ return SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE.toString();
+ }
+
+ @Override
+ public boolean canBlock() {
+ return true;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isMiningTool() {
+ return false;
+ }
+
+ @Override
+ public boolean isWeapon() {
+ return true;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "softhammer");
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadMallet.mTextureIndex]
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.handleMallet.mTextureIndex];
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ aItem.addItemBehavior(aID, new Behaviour_SoftHammer(100));
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " was hammered to death by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Soldering_Iron.java b/src/main/java/gregtech/common/tools/GT_Tool_Soldering_Iron.java
new file mode 100644
index 0000000000..9b5ef3a638
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Soldering_Iron.java
@@ -0,0 +1,153 @@
+package gregtech.common.tools;
+
+import java.util.Arrays;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityCaveSpider;
+import net.minecraft.entity.monster.EntitySpider;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+import gregtech.common.items.behaviors.Behaviour_Screwdriver;
+
+public class GT_Tool_Soldering_Iron extends GT_Tool {
+
+ public static final List<String> mEffectiveList = Arrays.asList(
+ EntityCaveSpider.class.getName(),
+ EntitySpider.class.getName(),
+ "EntityTFHedgeSpider",
+ "EntityTFKingSpider",
+ "EntityTFSwarmSpider",
+ "EntityTFTowerBroodling");
+
+ @Override
+ public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack,
+ EntityPlayer aPlayer) {
+ String tName = aEntity.getClass()
+ .getName();
+ tName = tName.substring(tName.lastIndexOf('.') + 1);
+ return mEffectiveList.contains(tName) ? aOriginalDamage * 2.0F : aOriginalDamage;
+ }
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 1000;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 500;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 1000;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 500;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 1.5F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.IC2_TOOLS_WRENCH.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return true;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isMiningTool() {
+ return false;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "soldering_iron")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(aBlock, Material.circuits);
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mIconSet.mTextures[49]
+ : Textures.ItemIcons.HANDLE_SOLDERING;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ aItem.addItemBehavior(aID, new Behaviour_Screwdriver(1, 200));
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " got soldert! (by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + ")");
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Sword.java b/src/main/java/gregtech/common/tools/GT_Tool_Sword.java
new file mode 100644
index 0000000000..7bfaaee797
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Sword.java
@@ -0,0 +1,128 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.stats.AchievementList;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+
+public class GT_Tool_Sword extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 200;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 100;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 4.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return null;
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return true;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isWeapon() {
+ return true;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "sword")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(
+ aBlock,
+ Material.leaves,
+ Material.gourd,
+ Material.vine,
+ Material.web,
+ Material.cloth,
+ Material.carpet,
+ Material.plants,
+ Material.cactus,
+ Material.cake,
+ Material.tnt,
+ Material.sponge);
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return !aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadSword.mTextureIndex]
+ : Textures.ItemIcons.HANDLE_SWORD;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return !aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) {
+ super.onToolCrafted(aStack, aPlayer);
+ aPlayer.triggerAchievement(AchievementList.buildSword);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Turbine.java b/src/main/java/gregtech/common/tools/GT_Tool_Turbine.java
new file mode 100644
index 0000000000..daaf2c4438
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Turbine.java
@@ -0,0 +1,58 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+
+public abstract class GT_Tool_Turbine extends GT_Tool {
+
+ @Override
+ public abstract float getBaseDamage();
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return false;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? getTurbineIcon() : null;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa : null;
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.GREEN + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " put "
+ + EnumChatFormatting.RED
+ + aEntity.getCommandSenderName()
+ + "s"
+ + EnumChatFormatting.WHITE
+ + " head into a turbine");
+ }
+
+ public abstract IIconContainer getTurbineIcon();
+
+ @Override
+ public abstract float getSpeedMultiplier();
+
+ @Override
+ public abstract float getMaxDurabilityMultiplier();
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Huge.java b/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Huge.java
new file mode 100644
index 0000000000..46b0de72d9
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Huge.java
@@ -0,0 +1,27 @@
+package gregtech.common.tools;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+
+public class GT_Tool_Turbine_Huge extends GT_Tool_Turbine {
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 7.5F;
+ }
+
+ @Override
+ public IIconContainer getTurbineIcon() {
+ return Textures.ItemIcons.TURBINE_HUGE;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Large.java b/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Large.java
new file mode 100644
index 0000000000..7e8307f6b0
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Large.java
@@ -0,0 +1,27 @@
+package gregtech.common.tools;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+
+public class GT_Tool_Turbine_Large extends GT_Tool_Turbine {
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 3.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 3.0F;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 5.0F;
+ }
+
+ @Override
+ public IIconContainer getTurbineIcon() {
+ return Textures.ItemIcons.TURBINE_LARGE;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Normal.java b/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Normal.java
new file mode 100644
index 0000000000..ac2fc29a89
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Normal.java
@@ -0,0 +1,27 @@
+package gregtech.common.tools;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+
+public class GT_Tool_Turbine_Normal extends GT_Tool_Turbine {
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 2.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 2.0F;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 2.5F;
+ }
+
+ @Override
+ public IIconContainer getTurbineIcon() {
+ return Textures.ItemIcons.TURBINE;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Small.java b/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Small.java
new file mode 100644
index 0000000000..fab527386e
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Turbine_Small.java
@@ -0,0 +1,27 @@
+package gregtech.common.tools;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+
+public class GT_Tool_Turbine_Small extends GT_Tool_Turbine {
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 0.0F;
+ }
+
+ @Override
+ public IIconContainer getTurbineIcon() {
+ return Textures.ItemIcons.TURBINE_SMALL;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_UniversalSpade.java b/src/main/java/gregtech/common/tools/GT_Tool_UniversalSpade.java
new file mode 100644
index 0000000000..184d506872
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_UniversalSpade.java
@@ -0,0 +1,160 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+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.stats.AchievementList;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.GT_Mod;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+import gregtech.common.items.behaviors.Behaviour_Crowbar;
+
+public class GT_Tool_UniversalSpade extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 100;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 3.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 0.75F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return null;
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return null;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return true;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return true;
+ }
+
+ @Override
+ public boolean isWeapon() {
+ return true;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "shovel", "axe", "saw", "sword", "crowbar")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(
+ aBlock,
+ Material.sand,
+ Material.grass,
+ Material.ground,
+ Material.snow,
+ Material.clay,
+ Material.leaves,
+ Material.vine,
+ Material.wood,
+ Material.cactus,
+ Material.circuits,
+ Material.gourd,
+ Material.web,
+ Material.cloth,
+ Material.carpet,
+ Material.plants,
+ Material.cake,
+ Material.tnt,
+ Material.sponge);
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadUniversalSpade.mTextureIndex]
+ : GT_MetaGenerated_Tool
+ .getSecondaryMaterial(aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.stick.mTextureIndex];
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ aItem.addItemBehavior(aID, new Behaviour_Crowbar(2, 2000));
+ }
+
+ @Override
+ public void onToolCrafted(ItemStack aStack, EntityPlayer aPlayer) {
+ super.onToolCrafted(aStack, aPlayer);
+ aPlayer.triggerAchievement(AchievementList.buildSword);
+ try {
+ GT_Mod.achievements.issueAchievement(aPlayer, "unitool");
+ } catch (Exception ignored) {}
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.RED + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " has been digged by "
+ + EnumChatFormatting.GREEN
+ + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_WireCutter.java b/src/main/java/gregtech/common/tools/GT_Tool_WireCutter.java
new file mode 100644
index 0000000000..54b76e6d81
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_WireCutter.java
@@ -0,0 +1,117 @@
+package gregtech.common.tools;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+
+public class GT_Tool_WireCutter extends GT_Tool {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 1.25F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.IC2_TOOLS_INSULATION_CUTTERS.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return SoundResource.IC2_TOOLS_INSULATION_CUTTERS.toString();
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(aBlock, aMetaData, "cutter");
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.WIRE_CUTTER : null;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {}
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.GREEN + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " has cut the Cable for the Life Support Machine of "
+ + EnumChatFormatting.RED
+ + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Wrench.java b/src/main/java/gregtech/common/tools/GT_Tool_Wrench.java
new file mode 100644
index 0000000000..4dad749997
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Wrench.java
@@ -0,0 +1,272 @@
+package gregtech.common.tools;
+
+import static gregtech.api.items.GT_MetaGenerated_Tool.getPrimaryMaterial;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityIronGolem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.world.World;
+import net.minecraftforge.event.world.BlockEvent;
+
+import appeng.api.parts.IPartHost;
+import appeng.block.AEBaseTileBlock;
+import appeng.parts.PartPlacement;
+import appeng.util.Platform;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.api.util.GT_ToolHarvestHelper;
+import gregtech.common.items.behaviors.Behaviour_Switch_Mode;
+import gregtech.common.items.behaviors.Behaviour_Wrench;
+import ic2.api.tile.IWrenchable;
+
+public class GT_Tool_Wrench extends GT_Tool {
+
+ public static final List<String> mEffectiveList = Arrays
+ .asList(EntityIronGolem.class.getName(), "EntityTowerGuardian");
+
+ @Override
+ public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack,
+ EntityPlayer aPlayer) {
+ String tName = aEntity.getClass()
+ .getName();
+ tName = tName.substring(tName.lastIndexOf('.') + 1);
+ return (mEffectiveList.contains(tName)) || (tName.contains("Golem")) ? aOriginalDamage * 2.0F : aOriginalDamage;
+ }
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 800;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 3.0F;
+ }
+
+ @Override
+ public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) {
+ return aOriginalHurtResistance * 2;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.IC2_TOOLS_WRENCH.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return SoundResource.IC2_TOOLS_WRENCH.toString();
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isWrench() {
+ return true;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block block, byte aMetaData) {
+ return GT_ToolHarvestHelper.isAppropriateTool(block, aMetaData, "wrench")
+ || GT_ToolHarvestHelper.isAppropriateMaterial(block, Material.piston)
+ || block instanceof AEBaseTileBlock
+ || GT_ToolHarvestHelper.isSpecialBlock(block, Blocks.crafting_table, Blocks.bookshelf)
+ || Behaviour_Wrench.isVanillaRotatable(block)
+ || GT_ToolHarvestHelper.isIC2Wrenchable(block);
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.WRENCH : null;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? getPrimaryMaterial(aStack).mRGBa : null;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ aItem.addItemBehavior(aID, new Behaviour_Switch_Mode());
+ aItem.addItemBehavior(aID, new Behaviour_Wrench(100));
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.GREEN + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " threw a Monkey Wrench into the Plans of "
+ + EnumChatFormatting.RED
+ + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+
+ /**
+ * <p>
+ * holding drop from {@link IWrenchable#getWrenchDrop(EntityPlayer)}
+ * </p>
+ * Since no tile available during
+ * {@link #convertBlockDrops(List, ItemStack, EntityPlayer, Block, int, int, int, byte, int, boolean, BlockEvent.HarvestDropsEvent)},
+ * this is filled during
+ * {@link #onBreakBlock(EntityPlayer, int, int, int, Block, byte, TileEntity, BlockEvent.BreakEvent)}
+ */
+ private ItemStack wrenchableDrop = null;
+ /**
+ * <p>
+ * drop rate from {@link IWrenchable#getWrenchDropRate()}
+ * </p>
+ * see {@link #wrenchableDrop}
+ */
+ private float wrenchableDropRate = 0.0f;
+
+ /**
+ * <p>
+ * prevent recursion from
+ * {@link AEBaseTileBlock#onBlockActivated(World, int, int, int, EntityPlayer, int, float, float, float)}
+ * </p>
+ */
+ private boolean LastEventFromThis = false;
+
+ @Override
+ public void onBreakBlock(@Nonnull EntityPlayer player, int x, int y, int z, @Nonnull Block block, byte metadata,
+ TileEntity tile, @Nonnull BlockEvent.BreakEvent event) {
+ if (tile instanceof IWrenchable wrenchable) {
+ if (!wrenchable.wrenchCanRemove(player)) {
+ event.setCanceled(true);
+ return;
+ }
+ wrenchableDrop = wrenchable.getWrenchDrop(player);
+ wrenchableDropRate = wrenchable.getWrenchDropRate();
+ }
+ if (block instanceof AEBaseTileBlock aeBaseTileBlock) {
+ if (LastEventFromThis) {
+ return;
+ }
+ final boolean sneak = player.isSneaking();
+ try {
+ LastEventFromThis = true;
+ player.setSneaking(true);
+ final int sideHit = Platform.rayTrace(player, true, false).sideHit;
+ if (tile instanceof IPartHost) {
+ if (sneak && PartPlacement.place(
+ player.getHeldItem(),
+ x,
+ y,
+ z,
+ sideHit,
+ player,
+ player.worldObj,
+ PartPlacement.PlaceType.INTERACT_FIRST_PASS,
+ 0)) {
+ event.setCanceled(true);
+ }
+ return;
+ }
+ if (aeBaseTileBlock.onBlockActivated(event.world, x, y, z, player, sideHit, x, y, z)) {
+ event.setCanceled(true);
+ }
+ } finally {
+ LastEventFromThis = false;
+ player.setSneaking(sneak);
+ }
+ }
+ }
+
+ @Override
+ public int convertBlockDrops(List<ItemStack> drops, ItemStack Stack, EntityPlayer player, Block block, int x, int y,
+ int z, byte metaData, int fortune, boolean silkTouch, BlockEvent.HarvestDropsEvent event) {
+ ItemStack drop = null;
+ int modified = 0;
+ if (wrenchableDrop != null) {
+ drop = wrenchableDrop;
+ wrenchableDrop = null;
+ modified = wrenchableDropRate == 1.0f ? 3 : 10;
+ wrenchableDropRate = 0.0f;
+ } else if (block == Blocks.bookshelf || block == Blocks.ender_chest) {
+ drop = new ItemStack(block);
+ modified = 1;
+ }
+
+ if (drop != null) {
+ event.dropChance = 1.0f;
+ drops.clear();
+ drops.add(drop);
+ }
+ return modified;
+ }
+
+ @Override
+ public byte getMaxMode() {
+ return 2;
+ }
+
+ @Override
+ public String getToolTypeName() {
+ return "wrench";
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Wrench_HV.java b/src/main/java/gregtech/common/tools/GT_Tool_Wrench_HV.java
new file mode 100644
index 0000000000..7a7c725f8f
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Wrench_HV.java
@@ -0,0 +1,69 @@
+package gregtech.common.tools;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+
+public class GT_Tool_Wrench_HV extends GT_Tool_Wrench_LV {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 800;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 1600;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 12800;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 3200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 1;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 2.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadWrench.mTextureIndex]
+ : Textures.ItemIcons.POWER_UNIT_HV;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Wrench_LV.java b/src/main/java/gregtech/common/tools/GT_Tool_Wrench_LV.java
new file mode 100644
index 0000000000..5f82a7d5b1
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Wrench_LV.java
@@ -0,0 +1,77 @@
+package gregtech.common.tools;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+
+public class GT_Tool_Wrench_LV extends GT_Tool_Wrench {
+
+ @Override
+ public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack,
+ EntityPlayer aPlayer) {
+ return aOriginalDamage;
+ }
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 800;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 2.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadWrench.mTextureIndex]
+ : Textures.ItemIcons.POWER_UNIT_LV;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/GT_Tool_Wrench_MV.java b/src/main/java/gregtech/common/tools/GT_Tool_Wrench_MV.java
new file mode 100644
index 0000000000..cc5b649647
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/GT_Tool_Wrench_MV.java
@@ -0,0 +1,69 @@
+package gregtech.common.tools;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+
+public class GT_Tool_Wrench_MV extends GT_Tool_Wrench_LV {
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 200;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 400;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 3200;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 800;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 1;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 1.5F;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 3.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 2.0F;
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead
+ ? GT_MetaGenerated_Tool.getPrimaryMaterial(
+ aStack).mIconSet.mTextures[gregtech.api.enums.OrePrefixes.toolHeadWrench.mTextureIndex]
+ : Textures.ItemIcons.POWER_UNIT_MV;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa
+ : GT_MetaGenerated_Tool.getSecondaryMaterial(aStack).mRGBa;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_BranchCutter.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_BranchCutter.java
new file mode 100644
index 0000000000..b831306df9
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_BranchCutter.java
@@ -0,0 +1,39 @@
+package gregtech.common.tools.pocket;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.common.items.behaviors.Behaviour_Switch_Metadata;
+import gregtech.common.tools.GT_Tool_BranchCutter;
+
+public class GT_Tool_Pocket_BranchCutter extends GT_Tool_BranchCutter {
+
+ public final int mSwitchIndex;
+
+ public GT_Tool_Pocket_BranchCutter(int aSwitchIndex) {
+ mSwitchIndex = aSwitchIndex;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_BRANCHCUTTER : Textures.ItemIcons.VOID;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ super.onStatsAddedToTool(aItem, aID);
+ aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true));
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_File.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_File.java
new file mode 100644
index 0000000000..84372b1d98
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_File.java
@@ -0,0 +1,39 @@
+package gregtech.common.tools.pocket;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.common.items.behaviors.Behaviour_Switch_Metadata;
+import gregtech.common.tools.GT_Tool_File;
+
+public class GT_Tool_Pocket_File extends GT_Tool_File {
+
+ public final int mSwitchIndex;
+
+ public GT_Tool_Pocket_File(int aSwitchIndex) {
+ mSwitchIndex = aSwitchIndex;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_FILE : Textures.ItemIcons.VOID;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ super.onStatsAddedToTool(aItem, aID);
+ aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true));
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Knife.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Knife.java
new file mode 100644
index 0000000000..2b43984c51
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Knife.java
@@ -0,0 +1,39 @@
+package gregtech.common.tools.pocket;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.common.items.behaviors.Behaviour_Switch_Metadata;
+import gregtech.common.tools.GT_Tool_Knife;
+
+public class GT_Tool_Pocket_Knife extends GT_Tool_Knife {
+
+ public final int mSwitchIndex;
+
+ public GT_Tool_Pocket_Knife(int aSwitchIndex) {
+ mSwitchIndex = aSwitchIndex;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_KNIFE : Textures.ItemIcons.VOID;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ super.onStatsAddedToTool(aItem, aID);
+ aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true));
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Multitool.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Multitool.java
new file mode 100644
index 0000000000..16ab9229c6
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Multitool.java
@@ -0,0 +1,50 @@
+package gregtech.common.tools.pocket;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.common.items.behaviors.Behaviour_Switch_Metadata;
+import gregtech.common.tools.GT_Tool;
+
+public class GT_Tool_Pocket_Multitool extends GT_Tool {
+
+ public final int mSwitchIndex;
+
+ public GT_Tool_Pocket_Multitool(int aSwitchIndex) {
+ mSwitchIndex = aSwitchIndex;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_CLOSED : Textures.ItemIcons.VOID;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ super.onStatsAddedToTool(aItem, aID);
+ aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true));
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 0;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block aBlock, byte aMetaData) {
+ return false;
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Saw.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Saw.java
new file mode 100644
index 0000000000..579f809f2a
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Saw.java
@@ -0,0 +1,39 @@
+package gregtech.common.tools.pocket;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.common.items.behaviors.Behaviour_Switch_Metadata;
+import gregtech.common.tools.GT_Tool_Saw;
+
+public class GT_Tool_Pocket_Saw extends GT_Tool_Saw {
+
+ public final int mSwitchIndex;
+
+ public GT_Tool_Pocket_Saw(int aSwitchIndex) {
+ mSwitchIndex = aSwitchIndex;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_SAW : Textures.ItemIcons.VOID;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ super.onStatsAddedToTool(aItem, aID);
+ aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true));
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Screwdriver.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Screwdriver.java
new file mode 100644
index 0000000000..ce04ba2d15
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_Screwdriver.java
@@ -0,0 +1,39 @@
+package gregtech.common.tools.pocket;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.common.items.behaviors.Behaviour_Switch_Metadata;
+import gregtech.common.tools.GT_Tool_Screwdriver;
+
+public class GT_Tool_Pocket_Screwdriver extends GT_Tool_Screwdriver {
+
+ public final int mSwitchIndex;
+
+ public GT_Tool_Pocket_Screwdriver(int aSwitchIndex) {
+ mSwitchIndex = aSwitchIndex;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_SCREWDRIVER : Textures.ItemIcons.VOID;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ super.onStatsAddedToTool(aItem, aID);
+ aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true));
+ }
+}
diff --git a/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_WireCutter.java b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_WireCutter.java
new file mode 100644
index 0000000000..6907ff6735
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/pocket/GT_Tool_Pocket_WireCutter.java
@@ -0,0 +1,39 @@
+package gregtech.common.tools.pocket;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.GT_MetaGenerated_Tool;
+import gregtech.common.items.behaviors.Behaviour_Switch_Metadata;
+import gregtech.common.tools.GT_Tool_WireCutter;
+
+public class GT_Tool_Pocket_WireCutter extends GT_Tool_WireCutter {
+
+ public final int mSwitchIndex;
+
+ public GT_Tool_Pocket_WireCutter(int aSwitchIndex) {
+ mSwitchIndex = aSwitchIndex;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 4.0F;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.POCKET_MULTITOOL_WIRECUTTER : Textures.ItemIcons.VOID;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return GT_MetaGenerated_Tool.getPrimaryMaterial(aStack).mRGBa;
+ }
+
+ @Override
+ public void onStatsAddedToTool(GT_MetaGenerated_Tool aItem, int aID) {
+ super.onStatsAddedToTool(aItem, aID);
+ aItem.addItemBehavior(aID, new Behaviour_Switch_Metadata(mSwitchIndex, true, true));
+ }
+}
diff --git a/src/main/java/gregtech/crossmod/holoinventory/GT_InventoryDecoder.java b/src/main/java/gregtech/crossmod/holoinventory/GT_InventoryDecoder.java
new file mode 100644
index 0000000000..7f3651990d
--- /dev/null
+++ b/src/main/java/gregtech/crossmod/holoinventory/GT_InventoryDecoder.java
@@ -0,0 +1,38 @@
+package gregtech.crossmod.holoinventory;
+
+import static net.dries007.holoInventory.util.NBTKeys.NBT_KEY_COUNT;
+
+import java.util.List;
+
+import net.dries007.holoInventory.compat.InventoryDecoder;
+import net.dries007.holoInventory.compat.InventoryDecoderRegistry;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+
+import gregtech.api.metatileentity.BaseTileEntity;
+
+public class GT_InventoryDecoder extends InventoryDecoder {
+
+ public GT_InventoryDecoder() {
+ super(BaseTileEntity.class);
+ }
+
+ @Override
+ public NBTTagList toNBT(IInventory inv) {
+ List<ItemStack> items = ((BaseTileEntity) inv).getItemsForHoloGlasses();
+ if (items == null) {
+ return InventoryDecoderRegistry.DEFAULT.toNBT(inv);
+ }
+ NBTTagList tagList = new NBTTagList();
+ for (ItemStack stack : items) {
+ if (stack != null) {
+ NBTTagCompound tag = stack.writeToNBT(new NBTTagCompound());
+ tag.setInteger(NBT_KEY_COUNT, stack.stackSize);
+ tagList.appendTag(tag);
+ }
+ }
+ return tagList;
+ }
+}
diff --git a/src/main/java/gregtech/crossmod/holoinventory/HoloInventory.java b/src/main/java/gregtech/crossmod/holoinventory/HoloInventory.java
new file mode 100644
index 0000000000..d7dcdcf4b5
--- /dev/null
+++ b/src/main/java/gregtech/crossmod/holoinventory/HoloInventory.java
@@ -0,0 +1,10 @@
+package gregtech.crossmod.holoinventory;
+
+import net.dries007.holoInventory.compat.InventoryDecoderRegistry;
+
+public class HoloInventory {
+
+ public static void init() {
+ InventoryDecoderRegistry.register(new GT_InventoryDecoder());
+ }
+}
diff --git a/src/main/java/gregtech/crossmod/waila/GregtechWailaDataProvider.java b/src/main/java/gregtech/crossmod/waila/GregtechWailaDataProvider.java
new file mode 100644
index 0000000000..7012bc68fe
--- /dev/null
+++ b/src/main/java/gregtech/crossmod/waila/GregtechWailaDataProvider.java
@@ -0,0 +1,55 @@
+package gregtech.crossmod.waila;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import gregtech.api.interfaces.tileentity.IGregtechWailaProvider;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+import mcp.mobius.waila.api.IWailaDataProvider;
+
+public class GregtechWailaDataProvider implements IWailaDataProvider {
+
+ @Override
+ public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) {
+ return null;
+ }
+
+ @Override
+ public List<String> getWailaHead(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ return currenttip;
+ }
+
+ @Override
+ public List<String> getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ final TileEntity tile = accessor.getTileEntity();
+ if (tile instanceof IGregtechWailaProvider) {
+ ((IGregtechWailaProvider) tile).getWailaBody(itemStack, currenttip, accessor, config);
+ }
+
+ return currenttip;
+ }
+
+ @Override
+ public List<String> getWailaTail(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ return currenttip;
+ }
+
+ @Override
+ public NBTTagCompound getNBTData(final EntityPlayerMP player, final TileEntity tile, final NBTTagCompound tag,
+ final World world, int x, int y, int z) {
+ if (tile instanceof IGregtechWailaProvider) {
+ ((IGregtechWailaProvider) tile).getWailaNBTData(player, tile, tag, world, x, y, z);
+ }
+
+ return tag;
+ }
+}
diff --git a/src/main/java/gregtech/crossmod/waila/Waila.java b/src/main/java/gregtech/crossmod/waila/Waila.java
new file mode 100644
index 0000000000..50b2b5cb57
--- /dev/null
+++ b/src/main/java/gregtech/crossmod/waila/Waila.java
@@ -0,0 +1,32 @@
+package gregtech.crossmod.waila;
+
+import cpw.mods.fml.common.event.FMLInterModComms;
+import gregtech.api.enums.Mods;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.multitileentity.base.MultiTileEntity;
+import mcp.mobius.waila.api.IWailaDataProvider;
+import mcp.mobius.waila.api.IWailaRegistrar;
+
+public class Waila {
+
+ public static void callbackRegister(IWailaRegistrar register) {
+ final IWailaDataProvider multiBlockProvider = new GregtechWailaDataProvider();
+
+ register.registerBodyProvider(multiBlockProvider, BaseMetaTileEntity.class);
+ register.registerBodyProvider(multiBlockProvider, BaseMetaPipeEntity.class);
+ register.registerBodyProvider(multiBlockProvider, MultiTileEntity.class);
+
+ register.registerNBTProvider(multiBlockProvider, BaseMetaTileEntity.class);
+ register.registerNBTProvider(multiBlockProvider, BaseMetaPipeEntity.class);
+ register.registerNBTProvider(multiBlockProvider, MultiTileEntity.class);
+
+ register.registerTailProvider(multiBlockProvider, BaseMetaTileEntity.class);
+ register.registerTailProvider(multiBlockProvider, BaseMetaPipeEntity.class);
+ register.registerTailProvider(multiBlockProvider, MultiTileEntity.class);
+ }
+
+ public static void init() {
+ FMLInterModComms.sendMessage(Mods.Waila.ID, "register", Waila.class.getName() + ".callbackRegister");
+ }
+}
diff --git a/src/main/java/gregtech/loaders/ExtraIcons.java b/src/main/java/gregtech/loaders/ExtraIcons.java
new file mode 100644
index 0000000000..e682ec6046
--- /dev/null
+++ b/src/main/java/gregtech/loaders/ExtraIcons.java
@@ -0,0 +1,46 @@
+package gregtech.loaders;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.client.event.TextureStitchEvent;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+
+public class ExtraIcons {
+
+ private static final String LARGE_FLUID_CELL_CUSTOM = "large_fluid_cell_custom";
+ public static IIcon steelLargeCellInner;
+ public static IIcon aluminiumLargeCellInner;
+ public static IIcon stainlesssteelLargeCellInner;
+ public static IIcon tungstensteelLargeCellInner;
+ public static IIcon titaniumLargeCellInner;
+ public static IIcon chromiumLargeCellInner;
+ public static IIcon iridiumLargeCellInner;
+ public static IIcon osmiumLargeCellInner;
+ public static IIcon neutroniumLargeCellInner;
+
+ @SubscribeEvent
+ public void regIcons(TextureStitchEvent.Pre event) {
+ TextureMap reg = event.map;
+ if (reg.getTextureType() == 1) { // are for items
+ steelLargeCellInner = reg.registerIcon(GregTech.getResourcePath(LARGE_FLUID_CELL_CUSTOM, "steel_inner"));
+ aluminiumLargeCellInner = reg
+ .registerIcon(GregTech.getResourcePath(LARGE_FLUID_CELL_CUSTOM, "aluminium_inner"));
+ stainlesssteelLargeCellInner = reg
+ .registerIcon(GregTech.getResourcePath(LARGE_FLUID_CELL_CUSTOM, "stainlesssteel_inner"));
+ tungstensteelLargeCellInner = reg
+ .registerIcon(GregTech.getResourcePath(LARGE_FLUID_CELL_CUSTOM, "tungstensteel_inner"));
+ titaniumLargeCellInner = reg
+ .registerIcon(GregTech.getResourcePath(LARGE_FLUID_CELL_CUSTOM, "titanium_inner"));
+ chromiumLargeCellInner = reg
+ .registerIcon(GregTech.getResourcePath(LARGE_FLUID_CELL_CUSTOM, "chromium_inner"));
+ iridiumLargeCellInner = reg
+ .registerIcon(GregTech.getResourcePath(LARGE_FLUID_CELL_CUSTOM, "iridium_inner"));
+ osmiumLargeCellInner = reg.registerIcon(GregTech.getResourcePath(LARGE_FLUID_CELL_CUSTOM, "osmium_inner"));
+ neutroniumLargeCellInner = reg
+ .registerIcon(GregTech.getResourcePath(LARGE_FLUID_CELL_CUSTOM, "neutronium_inner"));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/load/GT_CoverBehaviorLoader.java b/src/main/java/gregtech/loaders/load/GT_CoverBehaviorLoader.java
new file mode 100644
index 0000000000..37f626ef90
--- /dev/null
+++ b/src/main/java/gregtech/loaders/load/GT_CoverBehaviorLoader.java
@@ -0,0 +1,11 @@
+package gregtech.loaders.load;
+
+import gregtech.api.util.GT_Log;
+
+public class GT_CoverBehaviorLoader implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Adding Cover Behaviors");
+ }
+}
diff --git a/src/main/java/gregtech/loaders/load/GT_FuelLoader.java b/src/main/java/gregtech/loaders/load/GT_FuelLoader.java
new file mode 100644
index 0000000000..0343362c77
--- /dev/null
+++ b/src/main/java/gregtech/loaders/load/GT_FuelLoader.java
@@ -0,0 +1,180 @@
+package gregtech.loaders.load;
+
+import static gregtech.api.enums.Mods.BloodMagic;
+import static gregtech.api.enums.Mods.EnderIO;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.FluidState;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.fluid.GT_FluidFactory;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeConstants;
+
+public class GT_FuelLoader implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Initializing various Fuels.");
+ ItemList.sBlueVitriol = GT_FluidFactory
+ .of("solution.bluevitriol", "Blue Vitriol water solution", null, FluidState.LIQUID, 295);
+ ItemList.sNickelSulfate = GT_FluidFactory
+ .of("solution.nickelsulfate", "Nickel sulfate water solution", null, FluidState.LIQUID, 295);
+ ItemList.sGreenVitriol = GT_FluidFactory
+ .of("solution.greenvitriol", "Green Vitriol water solution", null, FluidState.LIQUID, 295);
+ ItemList.sIndiumConcentrate = GT_FluidFactory
+ .of("indiumconcentrate", "Indium Concentrate", null, FluidState.LIQUID, 295); // TODO CHECK NEW x3
+ ItemList.sLeadZincSolution = GT_FluidFactory
+ .of("leadzincsolution", "Lead-Zinc solution", null, FluidState.LIQUID, 295);
+ ItemList.sRocketFuel = GT_FluidFactory.of("rocket_fuel", "Rocket Fuel", null, FluidState.LIQUID, 295);
+ new GT_Recipe(
+ new ItemStack(Items.lava_bucket),
+ new ItemStack(Blocks.obsidian),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Electrum, 1L),
+ 30,
+ 2);
+
+ RecipeMaps.smallNaquadahReactorFuels.addRecipe(
+ true,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.NaquadahEnriched, 1L) },
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Naquadah, 1L) },
+ null,
+ null,
+ null,
+ 0,
+ 0,
+ 50000);
+ RecipeMaps.largeNaquadahReactorFuels.addRecipe(
+ true,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stick, Materials.NaquadahEnriched, 1L) },
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Naquadah, 1L) },
+ null,
+ null,
+ null,
+ 0,
+ 0,
+ 250000);
+ RecipeMaps.hugeNaquadahReactorFuels.addRecipe(
+ true,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.NaquadahEnriched, 1L) },
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Naquadah, 1L) },
+ null,
+ null,
+ null,
+ 0,
+ 0,
+ 500000);
+ RecipeMaps.extremeNaquadahReactorFuels.addRecipe(
+ true,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Naquadria, 1L) },
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Naquadah, 1L) },
+ null,
+ null,
+ null,
+ 0,
+ 0,
+ 250000);
+ RecipeMaps.ultraHugeNaquadahReactorFuels.addRecipe(
+ true,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Naquadria, 1L) },
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Naquadah, 1L) },
+ null,
+ null,
+ null,
+ 0,
+ 0,
+ 1000000);
+ RecipeMaps.fluidNaquadahReactorFuels.addRecipe(
+ true,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cell, Materials.NaquadahEnriched, 1L) },
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Naquadah, 1L) },
+ null,
+ null,
+ null,
+ 0,
+ 0,
+ 1400000);
+
+ // BloodMagic
+ RecipeMaps.magicFuels.addRecipe(
+ true,
+ new ItemStack[] { GT_ModHandler.getModItem(BloodMagic.ID, "reinforcedSlate", 1L) },
+ new ItemStack[] { GT_ModHandler.getModItem(BloodMagic.ID, "blankSlate", 1L) },
+ null,
+ null,
+ null,
+ 0,
+ 0,
+ 400);
+ RecipeMaps.magicFuels.addRecipe(
+ true,
+ new ItemStack[] { GT_ModHandler.getModItem(BloodMagic.ID, "imbuedSlate", 1L) },
+ new ItemStack[] { GT_ModHandler.getModItem(BloodMagic.ID, "reinforcedSlate", 1L) },
+ null,
+ null,
+ null,
+ 0,
+ 0,
+ 1000);
+ RecipeMaps.magicFuels.addRecipe(
+ true,
+ new ItemStack[] { GT_ModHandler.getModItem(BloodMagic.ID, "demonicSlate", 1L) },
+ new ItemStack[] { GT_ModHandler.getModItem(BloodMagic.ID, "imbuedSlate", 1L) },
+ null,
+ null,
+ null,
+ 0,
+ 0,
+ 8000);
+ RecipeMaps.magicFuels.addRecipe(
+ true,
+ new ItemStack[] { GT_ModHandler.getModItem(BloodMagic.ID, "bloodMagicBaseItems", 1L, 27) },
+ new ItemStack[] { GT_ModHandler.getModItem(BloodMagic.ID, "demonicSlate", 1L) },
+ null,
+ null,
+ null,
+ 0,
+ 0,
+ 20000);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 4))
+ .metadata(FUEL_VALUE, 4)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.experience_bottle, 1))
+ .metadata(FUEL_VALUE, 10)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.ghast_tear, 1))
+ .metadata(FUEL_VALUE, 50)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.beacon, 1))
+ .metadata(FUEL_VALUE, Materials.NetherStar.mFuelPower * 2)
+ .metadata(FUEL_TYPE, Materials.NetherStar.mFuelType)
+ .addTo(GT_RecipeConstants.Fuel);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getModItem(EnderIO.ID, "bucketRocket_fuel", 1))
+ .metadata(FUEL_VALUE, 250)
+ .metadata(FUEL_TYPE, 1)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/load/GT_ItemIterator.java b/src/main/java/gregtech/loaders/load/GT_ItemIterator.java
new file mode 100644
index 0000000000..26534f5414
--- /dev/null
+++ b/src/main/java/gregtech/loaders/load/GT_ItemIterator.java
@@ -0,0 +1,309 @@
+package gregtech.loaders.load;
+
+import static gregtech.api.recipe.RecipeMaps.cannerRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.WILDCARD;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemFood;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.IFluidContainerItem;
+
+import buildcraft.api.tools.IToolWrench;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OreDictNames;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.items.GT_Generic_Item;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_Utility;
+import mods.railcraft.api.core.items.IToolCrowbar;
+
+public class GT_ItemIterator implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Scanning for certain kinds of compatible Machineblocks.");
+ ItemStack tStack2 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L);
+ ItemStack tStack = GT_ModHandler
+ .getRecipeOutput(tStack2, tStack2, tStack2, tStack2, null, tStack2, tStack2, tStack2, tStack2);
+
+ if (null != tStack) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tStack)
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 8L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_ModHandler.addSmeltingRecipe(tStack, GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 8L));
+ }
+ tStack2 = GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Bronze, 1L);
+ tStack = GT_ModHandler
+ .getRecipeOutput(tStack2, tStack2, tStack2, tStack2, null, tStack2, tStack2, tStack2, tStack2);
+
+ if (null != tStack) {
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingRawMachineTier00, tStack);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tStack)
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 8L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ GT_ModHandler.addSmeltingRecipe(tStack, GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 8L));
+ }
+
+ ItemStack tStack3 = new ItemStack(Blocks.glass, 1, 0);
+ tStack2 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L);
+ tStack = GT_ModHandler.getRecipeOutput(
+ tStack2,
+ tStack3,
+ tStack2,
+ tStack3,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Gold, 1L),
+ tStack3,
+ tStack2,
+ tStack3,
+ tStack2);
+
+ if (null != (tStack)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tStack)
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1L))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ }
+
+ tStack2 = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L);
+ tStack3 = new ItemStack(Blocks.glass, 1, 0);
+ tStack = GT_ModHandler.getRecipeOutput(
+ tStack2,
+ tStack3,
+ tStack2,
+ tStack3,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Gold, 1L),
+ tStack3,
+ tStack2,
+ tStack3,
+ tStack2);
+ if (null != tStack) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tStack)
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1L))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ }
+ GT_Log.out.println("GT_Mod: Registering various Tools to be usable on GregTech Machines");
+ GregTech_API.registerScrewdriver(
+ GT_ModHandler
+ .getRecipeOutput(null, new ItemStack(Items.iron_ingot, 1), null, new ItemStack(Items.stick, 1)));
+ GregTech_API.registerScrewdriver(
+ GT_ModHandler
+ .getRecipeOutput(new ItemStack(Items.iron_ingot, 1), null, null, null, new ItemStack(Items.stick, 1)));
+
+ GT_Log.out.println(
+ "GT_Mod: Adding Food Recipes to the Automatic Canning Machine. (also during the following Item Iteration)");
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.rotten_flesh, 2, WILDCARD), ItemList.IC2_Food_Can_Empty.get(1L))
+ .itemOutputs(ItemList.IC2_Food_Can_Spoiled.get(1L))
+ .duration(10 * SECONDS)
+ .eut(1)
+ .addTo(cannerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.spider_eye, 2, WILDCARD), ItemList.IC2_Food_Can_Empty.get(1L))
+ .itemOutputs(ItemList.IC2_Food_Can_Spoiled.get(1L))
+ .duration(5 * SECONDS)
+ .eut(1)
+ .addTo(cannerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Poisonous_Potato.get(2L), ItemList.IC2_Food_Can_Empty.get(1L))
+ .itemOutputs(ItemList.IC2_Food_Can_Spoiled.get(1L))
+ .duration(5 * SECONDS)
+ .eut(1)
+ .addTo(cannerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.cake, 1, WILDCARD), ItemList.IC2_Food_Can_Empty.get(12L))
+ .itemOutputs(ItemList.IC2_Food_Can_Filled.get(12L))
+ .duration(30 * SECONDS)
+ .eut(1)
+ .addTo(cannerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.mushroom_stew, 1, WILDCARD), ItemList.IC2_Food_Can_Empty.get(6L))
+ .itemOutputs(ItemList.IC2_Food_Can_Filled.get(6L), new ItemStack(Items.bowl, 1))
+ .duration(15 * SECONDS)
+ .eut(1)
+ .addTo(cannerRecipes);
+
+ GT_Log.out.println("GT_Mod: Scanning ItemList.");
+
+ try {
+ /* (tName.equals("tile.sedimentaryStone")) || **/
+ for (Object o : Item.itemRegistry) {
+ Object tObject;
+
+ if (!(((tObject = o) instanceof Item) && (!(tObject instanceof GT_Generic_Item)))) {
+ continue;
+ }
+
+ Item tItem = (Item) tObject;
+ String tName;
+ if ((tName = tItem.getUnlocalizedName()) == null) {
+ continue;
+ }
+
+ if ((tItem instanceof IToolCrowbar)) {
+ if ((tItem.isDamageable()) || (GT_ModHandler.isElectricItem(new ItemStack(tItem, 1, 0)))) {
+ if (GregTech_API.registerCrowbar(new ItemStack(tItem, 1, WILDCARD))) {
+ GT_Log.out.println("GT_Mod: Registered valid RC Crowbar: " + tName);
+ }
+ }
+ }
+ if ((tItem instanceof IToolWrench)) {
+ if ((tItem.isDamageable()) || (GT_ModHandler.isElectricItem(new ItemStack(tItem, 1, 0)))) {
+ if (GregTech_API.registerWrench(new ItemStack(tItem, 1, WILDCARD))) {
+ GT_Log.out.println("GT_Mod: Registered valid BC Wrench: " + tName);
+ }
+ }
+ }
+ Block tBlock = GT_Utility.getBlockFromStack(new ItemStack(tItem, 1, 0));
+ if (tBlock != null) {
+ if (tName.endsWith("beehives")) {
+ tBlock.setHarvestLevel("scoop", 0);
+ gregtech.common.tools.GT_Tool_Scoop.sBeeHiveMaterial = tBlock.getMaterial();
+ }
+ if (OrePrefixes.stone.mDefaultStackSize < tItem.getItemStackLimit(new ItemStack(tItem, 1, 0))) {
+ if ((tBlock.isReplaceableOreGen(GT_Values.DW, 0, 0, 0, Blocks.stone))
+ || (tBlock.isReplaceableOreGen(GT_Values.DW, 0, 0, 0, Blocks.netherrack))
+ || (tBlock.isReplaceableOreGen(GT_Values.DW, 0, 0, 0, Blocks.end_stone))) {
+ tItem.setMaxStackSize(OrePrefixes.stone.mDefaultStackSize);
+ }
+ }
+ }
+ if (((tItem instanceof ItemFood)) && (tItem != ItemList.IC2_Food_Can_Filled.getItem())
+ && (tItem != ItemList.IC2_Food_Can_Spoiled.getItem())) {
+ int tFoodValue = ((ItemFood) tItem).func_150905_g(new ItemStack(tItem, 1, 0));
+ if (tFoodValue > 0) {
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder
+ .itemInputs(new ItemStack(tItem, 1, WILDCARD), ItemList.IC2_Food_Can_Empty.get(tFoodValue));
+ if (GT_Utility.getContainerItem(new ItemStack(tItem, 1, 0), true) == null) {
+ recipeBuilder.itemOutputs(ItemList.IC2_Food_Can_Filled.get(tFoodValue));
+ } else {
+ recipeBuilder.itemOutputs(
+ ItemList.IC2_Food_Can_Filled.get(tFoodValue),
+ GT_Utility.getContainerItem(new ItemStack(tItem, 1, 0), true));
+ }
+ recipeBuilder.duration(tFoodValue * 5 * SECONDS)
+ .eut(1)
+ .addTo(cannerRecipes);
+ }
+ }
+ if ((tItem instanceof IFluidContainerItem)) {
+ GT_OreDictUnificator.addToBlacklist(new ItemStack(tItem, 1, WILDCARD));
+ }
+
+ switch (tName) {
+ // twilight forest
+ case "item.fieryBlood", "item.fieryTears" -> GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(tItem, 1, 0))
+ .metadata(FUEL_VALUE, 2048)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ // twilight forest
+ case "tile.TFRoots" -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(tItem, 1, 0))
+ .itemOutputs(new ItemStack(Items.stick, 2), new ItemStack(Items.stick, 1))
+ .outputChances(10000, 3000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ GT_ModHandler.addSawmillRecipe(
+ new ItemStack(tItem, 1, 0),
+ new ItemStack(Items.stick, 4),
+ new ItemStack(Items.stick, 2));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(tItem, 1, 1))
+ .itemOutputs(new ItemStack(Items.stick, 4))
+ .metadata(FUEL_VALUE, 32)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+
+ // tinker construct
+ case "item.tconstruct.manual" -> GT_OreDictUnificator
+ .registerOre("bookTinkersManual", new ItemStack(tItem, 1, WILDCARD));
+
+ // buildcraft
+ case "item.blueprintItem" -> GT_OreDictUnificator
+ .registerOre("paperBlueprint", new ItemStack(tItem, 1, WILDCARD));
+
+ // Thaumcraft
+ case "item.ItemThaumonomicon" -> GT_OreDictUnificator
+ .registerOre("bookThaumonomicon", new ItemStack(tItem, 1, WILDCARD));
+
+ // BoP
+ case "tile.bop.redRocks" -> {
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.stone, Materials.Redrock, new ItemStack(tItem, 1, 0));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.stone, Materials.Redrock, new ItemStack(tItem, 1, 1));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.stone, Materials.Redrock, new ItemStack(tItem, 1, 2));
+ }
+
+ // Thaumcraft
+ case "tile.blockCosmeticSolid" -> {
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.stone, Materials.Obsidian, new ItemStack(tItem, 1, 0));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.stone, Materials.Obsidian, new ItemStack(tItem, 1, 1));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.block, Materials.Thaumium, new ItemStack(tItem, 1, 4));
+ }
+
+ // minecraft
+ case "tile.enderchest" -> GT_OreDictUnificator
+ .registerOre(OreDictNames.enderChest, new ItemStack(tItem, 1, WILDCARD));
+
+ // buildcraft
+ case "tile.autoWorkbenchBlock" -> GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingWorkBench, new ItemStack(tItem, 1, 0));
+
+ // buildcraft
+ case "tile.pumpBlock" -> GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingPump, new ItemStack(tItem, 1, 0));
+
+ // buildcraft
+ case "tile.tankBlock" -> GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingTank, new ItemStack(tItem, 1, 0));
+
+ }
+ }
+ } catch (Throwable e) {
+ /**/
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/load/GT_Loader_MetaTileEntities_Recipes.java b/src/main/java/gregtech/loaders/load/GT_Loader_MetaTileEntities_Recipes.java
new file mode 100644
index 0000000000..6fe3d273f6
--- /dev/null
+++ b/src/main/java/gregtech/loaders/load/GT_Loader_MetaTileEntities_Recipes.java
@@ -0,0 +1,7148 @@
+package gregtech.loaders.load;
+
+import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.ALLOY_SMELTER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.ARC_FURNACE_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.AUTOCLAVE_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.BENDING_MACHINE_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.CANNER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.CANNER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.CANNER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.CANNER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.CANNER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.CENTRIFUGE_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_BATH_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEMICAL_REACTOR_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.CIRCUIT_ASSEMBLER_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.COMPRESSOR_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.CUTTING_MACHINE_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.DISTILLERY_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTRIC_FURNACE_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYSER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYSER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYSER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYSER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTROLYSER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.ELECTROMAGNETIC_SEPARATOR_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.EXTRACTOR_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.EXTRUDER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.FERMENTER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_CANNER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_EXTRACTOR_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_HEATER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.FLUID_SOLIDIFIER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.FORGE_HAMMER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.FORMING_PRESS_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.LASER_ENGRAVER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.LASER_ENGRAVER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.LASER_ENGRAVER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.LASER_ENGRAVER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.LASER_ENGRAVER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.LATHE_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.LATHE_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.LATHE_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.LATHE_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.LATHE_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.MACERATOR_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.MATTER_AMPLIFIER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_OVEN_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_OVEN_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_OVEN_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_OVEN_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_OVEN_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.MIXER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.MIXER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.MIXER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.MIXER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.MIXER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.ORE_WASHER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.OVEN_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.OVEN_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.OVEN_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.OVEN_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.OVEN_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_ARC_FURNACE_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.POLARIZER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.PRINTER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.PRINTER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.PRINTER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.PRINTER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.PRINTER_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.PRINTER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.PRINTER_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.PRINTER_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECYCLER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.SIFTER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.SIFTER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.SIFTER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.SIFTER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.SIFTER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.SLICER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.SLICER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.SLICER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.SLICER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.SLICER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.THERMAL_CENTRIFUGE_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.UNPACKAGER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.UNPACKAGER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.UNPACKAGER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.UNPACKAGER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.UNPACKAGER_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.UNPACKAGER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.UNPACKAGER_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.UNPACKAGER_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIREMILL_MV;
+import static gregtech.api.enums.Mods.BuildCraftFactory;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GalacticraftCore;
+import static gregtech.api.enums.Mods.Gendustry;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.enums.Mods.NotEnoughItems;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import codechicken.nei.api.API;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.MachineType;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OreDictNames;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.TierEU;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.ExternalMaterials;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.loaders.postload.GT_PCBFactoryMaterialLoader;
+import gregtech.loaders.postload.GT_ProcessingArrayRecipeLoader;
+import ic2.core.Ic2Items;
+
+public class GT_Loader_MetaTileEntities_Recipes implements Runnable {
+
+ private static final String aTextPlate = "PPP";
+ private static final String aTextPlateWrench = "PwP";
+ private static final String aTextPlateMotor = "PMP";
+ private static final String aTextCableHull = "CMC";
+ private static final String aTextWireHull = "WMW";
+ private static final String aTextWireChest = "WTW";
+ private static final String aTextWireCoil = "WCW";
+ private static final String aTextMotorWire = "EWE";
+ private static final String aTextWirePump = "WPW";
+
+ private static final long bits = GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED;
+ private static final long bitsd = GT_ModHandler.RecipeBits.DISMANTLEABLE | bits;
+
+ private static void registerMachineTypes() {
+ registerAlloySmelter();
+ registerArcFurnace();
+ registerAutoclave();
+ registerAssembler();
+ registerBendingMachine();
+ registerCanner();
+ registerCentrifuge();
+ registerCompressor();
+ registerChemicalBath();
+ registerChemicalReactor();
+ registerCircuitAssembler();
+ registerCuttingMachine();
+ registerDistillery();
+ registerElectricFurnace();
+ registerElectrolyser();
+ registerElectromagneticSeparator();
+ registerExtractor();
+ registerExtruder();
+ registerFermenter();
+ registerFluidCanner();
+ registerFluidExtractor();
+ registerFluidHeater();
+ registerFluidSolidifier();
+ registerForgeHammer();
+ registerFormingPress();
+ registerLathe();
+ registerLaserEngraver();
+ registerMacerator();
+ registerMatterAmplifier();
+ registerMicrowave();
+ registerMixer();
+ registerOreWasher();
+ registerOven();
+ registerPlasmaArcFurnace();
+ registerPolarizer();
+ registerPrinter();
+ registerRecycler();
+ registerSifter();
+ registerSlicer();
+ registerThermalCentrifuge();
+ registerUnpackager();
+ registerWiremill();
+ }
+
+ private static void registerAlloySmelter() {
+ ItemList.Machine_LV_AlloySmelter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ALLOY_SMELTER_LV.ID,
+ "basicmachine.alloysmelter.tier.01",
+ "Basic Alloy Smelter",
+ 1,
+ MachineType.ALLOY_SMELTER.tooltipDescription(),
+ RecipeMaps.alloySmelterRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "ALLOY_SMELTER",
+ new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ ItemList.Machine_MV_AlloySmelter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ALLOY_SMELTER_MV.ID,
+ "basicmachine.alloysmelter.tier.02",
+ "Advanced Alloy Smelter",
+ 2,
+ MachineType.ALLOY_SMELTER.tooltipDescription(),
+ RecipeMaps.alloySmelterRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "ALLOY_SMELTER",
+ new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ ItemList.Machine_HV_AlloySmelter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ALLOY_SMELTER_HV.ID,
+ "basicmachine.alloysmelter.tier.03",
+ "Advanced Alloy Smelter II",
+ 3,
+ MachineType.ALLOY_SMELTER.tooltipDescription(),
+ RecipeMaps.alloySmelterRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "ALLOY_SMELTER",
+ new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ ItemList.Machine_EV_AlloySmelter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ALLOY_SMELTER_EV.ID,
+ "basicmachine.alloysmelter.tier.04",
+ "Advanced Alloy Smelter III",
+ 4,
+ MachineType.ALLOY_SMELTER.tooltipDescription(),
+ RecipeMaps.alloySmelterRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "ALLOY_SMELTER",
+ new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ ItemList.Machine_IV_AlloySmelter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ALLOY_SMELTER_IV.ID,
+ "basicmachine.alloysmelter.tier.05",
+ "Advanced Alloy Smelter IV",
+ 5,
+ MachineType.ALLOY_SMELTER.tooltipDescription(),
+ RecipeMaps.alloySmelterRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "ALLOY_SMELTER",
+ new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ }
+
+ private static void registerArcFurnace() {
+ ItemList.Machine_LV_ArcFurnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ARC_FURNACE_LV.ID,
+ "basicmachine.arcfurnace.tier.01",
+ "Basic Arc Furnace",
+ 1,
+ MachineType.ARC_FURNACE.tooltipDescription(),
+ RecipeMaps.arcFurnaceRecipes,
+ 1,
+ 4,
+ true,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "ARC_FURNACE",
+ new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL,
+ 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) })
+ .getStackForm(1L));
+
+ ItemList.Machine_MV_ArcFurnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ARC_FURNACE_MV.ID,
+ "basicmachine.arcfurnace.tier.02",
+ "Advanced Arc Furnace",
+ 2,
+ MachineType.ARC_FURNACE.tooltipDescription(),
+ RecipeMaps.arcFurnaceRecipes,
+ 1,
+ 4,
+ true,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "ARC_FURNACE",
+ new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL,
+ 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) })
+ .getStackForm(1L));
+ ItemList.Machine_HV_ArcFurnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ARC_FURNACE_HV.ID,
+ "basicmachine.arcfurnace.tier.03",
+ "Advanced Arc Furnace II",
+ 3,
+ MachineType.ARC_FURNACE.tooltipDescription(),
+ RecipeMaps.arcFurnaceRecipes,
+ 1,
+ 4,
+ true,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "ARC_FURNACE",
+ new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL,
+ 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) })
+ .getStackForm(1L));
+
+ ItemList.Machine_EV_ArcFurnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ARC_FURNACE_EV.ID,
+ "basicmachine.arcfurnace.tier.04",
+ "Advanced Arc Furnace III",
+ 4,
+ MachineType.ARC_FURNACE.tooltipDescription(),
+ RecipeMaps.arcFurnaceRecipes,
+ 1,
+ 9,
+ true,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "ARC_FURNACE",
+ new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL,
+ 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) })
+ .getStackForm(1L));
+
+ ItemList.Machine_IV_ArcFurnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ARC_FURNACE_IV.ID,
+ "basicmachine.arcfurnace.tier.05",
+ "Advanced Arc Furnace IV",
+ 5,
+ MachineType.ARC_FURNACE.tooltipDescription(),
+ RecipeMaps.arcFurnaceRecipes,
+ 1,
+ 9,
+ true,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "ARC_FURNACE",
+ new Object[] { "WGW", aTextCableHull, aTextPlate, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL,
+ 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'G', OrePrefixes.cell.get(Materials.Graphite) })
+ .getStackForm(1L));
+ }
+
+ private static void registerAssembler() {
+ ItemList.Machine_LV_Assembler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ASSEMBLER_LV.ID,
+ "basicmachine.assembler.tier.01",
+ "Basic Assembling Machine",
+ 1,
+ MachineType.ASSEMBLER.tooltipDescription(),
+ RecipeMaps.assemblerRecipes,
+ 6,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ASSEMBLER",
+ new Object[] { "ACA", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_MV_Assembler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ASSEMBLER_MV.ID,
+ "basicmachine.assembler.tier.02",
+ "Advanced Assembling Machine",
+ 2,
+ MachineType.ASSEMBLER.tooltipDescription(),
+ RecipeMaps.assemblerRecipes,
+ 9,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ASSEMBLER",
+ new Object[] { "ACA", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_HV_Assembler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ASSEMBLER_HV.ID,
+ "basicmachine.assembler.tier.03",
+ "Advanced Assembling Machine II",
+ 3,
+ MachineType.ASSEMBLER.tooltipDescription(),
+ RecipeMaps.assemblerRecipes,
+ 9,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ASSEMBLER",
+ new Object[] { "ACA", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_EV_Assembler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ASSEMBLER_EV.ID,
+ "basicmachine.assembler.tier.04",
+ "Advanced Assembling Machine III",
+ 4,
+ MachineType.ASSEMBLER.tooltipDescription(),
+ RecipeMaps.assemblerRecipes,
+ 9,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ASSEMBLER",
+ new Object[] { "ACA", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_IV_Assembler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ASSEMBLER_IV.ID,
+ "basicmachine.assembler.tier.05",
+ "Advanced Assembling Machine IV",
+ 5,
+ MachineType.ASSEMBLER.tooltipDescription(),
+ RecipeMaps.assemblerRecipes,
+ 9,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ASSEMBLER",
+ new Object[] { "ACA", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ }
+
+ private static void registerAutoclave() {
+ ItemList.Machine_LV_Autoclave.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ AUTOCLAVE_LV.ID,
+ "basicmachine.autoclave.tier.01",
+ "Basic Autoclave",
+ 1,
+ MachineType.AUTOCLAVE.tooltipDescription(),
+ RecipeMaps.autoclaveRecipes,
+ 2,
+ 2,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "AUTOCLAVE",
+ new Object[] { "IGI", "IMI", "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_MV_Autoclave.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ AUTOCLAVE_MV.ID,
+ "basicmachine.autoclave.tier.02",
+ "Advanced Autoclave",
+ 2,
+ MachineType.AUTOCLAVE.tooltipDescription(),
+ RecipeMaps.autoclaveRecipes,
+ 2,
+ 2,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "AUTOCLAVE",
+ new Object[] { "IGI", "IMI", "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_HV_Autoclave.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ AUTOCLAVE_HV.ID,
+ "basicmachine.autoclave.tier.03",
+ "Advanced Autoclave II",
+ 3,
+ MachineType.AUTOCLAVE.tooltipDescription(),
+ RecipeMaps.autoclaveRecipes,
+ 2,
+ 3,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "AUTOCLAVE",
+ new Object[] { "IGI", "IMI", "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_EV_Autoclave.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ AUTOCLAVE_EV.ID,
+ "basicmachine.autoclave.tier.04",
+ "Advanced Autoclave III",
+ 4,
+ MachineType.AUTOCLAVE.tooltipDescription(),
+ RecipeMaps.autoclaveRecipes,
+ 2,
+ 4,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "AUTOCLAVE",
+ new Object[] { "IGI", "IMI", "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_IV_Autoclave.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ AUTOCLAVE_IV.ID,
+ "basicmachine.autoclave.tier.05",
+ "Advanced Autoclave IV",
+ 5,
+ MachineType.AUTOCLAVE.tooltipDescription(),
+ RecipeMaps.autoclaveRecipes,
+ 2,
+ 4,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "AUTOCLAVE",
+ new Object[] { "IGI", "IMI", "CPC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ }
+
+ private static void registerBendingMachine() {
+ ItemList.Machine_LV_Bender.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ BENDING_MACHINE_LV.ID,
+ "basicmachine.bender.tier.01",
+ "Basic Bending Machine",
+ 1,
+ MachineType.BENDING_MACHINE.tooltipDescription(),
+ RecipeMaps.benderRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "BENDER",
+ new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_MV_Bender.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ BENDING_MACHINE_MV.ID,
+ "basicmachine.bender.tier.02",
+ "Advanced Bending Machine",
+ 2,
+ MachineType.BENDING_MACHINE.tooltipDescription(),
+ RecipeMaps.benderRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "BENDER",
+ new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_HV_Bender.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ BENDING_MACHINE_HV.ID,
+ "basicmachine.bender.tier.03",
+ "Advanced Bending Machine II",
+ 3,
+ MachineType.BENDING_MACHINE.tooltipDescription(),
+ RecipeMaps.benderRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "BENDER",
+ new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_EV_Bender.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ BENDING_MACHINE_EV.ID,
+ "basicmachine.bender.tier.04",
+ "Advanced Bending Machine III",
+ 4,
+ MachineType.BENDING_MACHINE.tooltipDescription(),
+ RecipeMaps.benderRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "BENDER",
+ new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_IV_Bender.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ BENDING_MACHINE_IV.ID,
+ "basicmachine.bender.tier.05",
+ "Advanced Bending Machine IV",
+ 5,
+ MachineType.BENDING_MACHINE.tooltipDescription(),
+ RecipeMaps.benderRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "BENDER",
+ new Object[] { aTextPlateWrench, aTextCableHull, aTextMotorWire, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ }
+
+ private static void registerCanner() {
+ ItemList.Machine_LV_Canner.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CANNER_LV.ID,
+ "basicmachine.canner.tier.01",
+ "Basic Canning Machine",
+ 1,
+ MachineType.CANNER.tooltipDescription(),
+ RecipeMaps.cannerRecipes,
+ 2,
+ 2,
+ false,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "CANNER",
+ new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_MV_Canner.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CANNER_MV.ID,
+ "basicmachine.canner.tier.02",
+ "Advanced Canning Machine",
+ 2,
+ MachineType.CANNER.tooltipDescription(),
+ RecipeMaps.cannerRecipes,
+ 2,
+ 2,
+ false,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "CANNER",
+ new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_HV_Canner.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CANNER_HV.ID,
+ "basicmachine.canner.tier.03",
+ "Advanced Canning Machine II",
+ 3,
+ MachineType.CANNER.tooltipDescription(),
+ RecipeMaps.cannerRecipes,
+ 2,
+ 2,
+ false,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "CANNER",
+ new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_EV_Canner.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CANNER_EV.ID,
+ "basicmachine.canner.tier.04",
+ "Advanced Canning Machine III",
+ 4,
+ MachineType.CANNER.tooltipDescription(),
+ RecipeMaps.cannerRecipes,
+ 2,
+ 2,
+ false,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "CANNER",
+ new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_IV_Canner.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CANNER_IV.ID,
+ "basicmachine.canner.tier.05",
+ "Advanced Canning Machine IV",
+ 5,
+ MachineType.CANNER.tooltipDescription(),
+ RecipeMaps.cannerRecipes,
+ 2,
+ 2,
+ false,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "CANNER",
+ new Object[] { aTextWirePump, aTextCableHull, "GGG", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ }
+
+ private static void registerCentrifuge() {
+ ItemList.Machine_LV_Centrifuge.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CENTRIFUGE_LV.ID,
+ "basicmachine.centrifuge.tier.01",
+ "Basic Centrifuge",
+ 1,
+ MachineType.CENTRIFUGE.tooltipDescription(),
+ RecipeMaps.centrifugeRecipes,
+ 2,
+ 6,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CENTRIFUGE",
+ new Object[] { "CEC", aTextWireHull, "CEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_MV_Centrifuge.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CENTRIFUGE_MV.ID,
+ "basicmachine.centrifuge.tier.02",
+ "Advanced Centrifuge",
+ 2,
+ MachineType.CENTRIFUGE.tooltipDescription(),
+ RecipeMaps.centrifugeRecipes,
+ 2,
+ 6,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CENTRIFUGE",
+ new Object[] { "CEC", aTextWireHull, "CEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_HV_Centrifuge.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CENTRIFUGE_HV.ID,
+ "basicmachine.centrifuge.tier.03",
+ "Turbo Centrifuge",
+ 3,
+ MachineType.CENTRIFUGE.tooltipDescription(),
+ RecipeMaps.centrifugeRecipes,
+ 2,
+ 6,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CENTRIFUGE",
+ new Object[] { "CEC", aTextWireHull, "CEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_EV_Centrifuge.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CENTRIFUGE_EV.ID,
+ "basicmachine.centrifuge.tier.04",
+ "Molecular Separator",
+ 4,
+ MachineType.CENTRIFUGE.tooltipDescription(),
+ RecipeMaps.centrifugeRecipes,
+ 2,
+ 6,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CENTRIFUGE",
+ new Object[] { "CEC", aTextWireHull, "CEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_IV_Centrifuge.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CENTRIFUGE_IV.ID,
+ "basicmachine.centrifuge.tier.05",
+ "Molecular Cyclone",
+ 5,
+ MachineType.CENTRIFUGE.tooltipDescription(),
+ RecipeMaps.centrifugeRecipes,
+ 2,
+ 6,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CENTRIFUGE",
+ new Object[] { "CEC", aTextWireHull, "CEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ }
+
+ private static void registerChemicalBath() {
+ ItemList.Machine_LV_ChemicalBath.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CHEMICAL_BATH_LV.ID,
+ "basicmachine.chemicalbath.tier.01",
+ "Basic Chemical Bath",
+ 1,
+ MachineType.CHEMICAL_BATH.tooltipDescription(),
+ RecipeMaps.chemicalBathRecipes,
+ 1,
+ 3,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CHEMICAL_BATH",
+ new Object[] { "VGW", "PGV", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_MV_ChemicalBath.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CHEMICAL_BATH_MV.ID,
+ "basicmachine.chemicalbath.tier.02",
+ "Advanced Chemical Bath",
+ 2,
+ MachineType.CHEMICAL_BATH.tooltipDescription(),
+ RecipeMaps.chemicalBathRecipes,
+ 1,
+ 3,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CHEMICAL_BATH",
+ new Object[] { "VGW", "PGV", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_HV_ChemicalBath.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CHEMICAL_BATH_HV.ID,
+ "basicmachine.chemicalbath.tier.03",
+ "Advanced Chemical Bath II",
+ 3,
+ MachineType.CHEMICAL_BATH.tooltipDescription(),
+ RecipeMaps.chemicalBathRecipes,
+ 1,
+ 3,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CHEMICAL_BATH",
+ new Object[] { "VGW", "PGV", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_EV_ChemicalBath.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CHEMICAL_BATH_EV.ID,
+ "basicmachine.chemicalbath.tier.04",
+ "Advanced Chemical Bath III",
+ 4,
+ MachineType.CHEMICAL_BATH.tooltipDescription(),
+ RecipeMaps.chemicalBathRecipes,
+ 1,
+ 3,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CHEMICAL_BATH",
+ new Object[] { "VGW", "PGV", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_IV_ChemicalBath.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CHEMICAL_BATH_IV.ID,
+ "basicmachine.chemicalbath.tier.05",
+ "Advanced Chemical Bath IV",
+ 5,
+ MachineType.CHEMICAL_BATH.tooltipDescription(),
+ RecipeMaps.chemicalBathRecipes,
+ 1,
+ 3,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CHEMICAL_BATH",
+ new Object[] { "VGW", "PGV", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ }
+
+ private static void registerChemicalReactor() {
+ ItemList.Machine_LV_ChemicalReactor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CHEMICAL_REACTOR_LV.ID,
+ "basicmachine.chemicalreactor.tier.01",
+ "Basic Chemical Reactor",
+ 1,
+ MachineType.CHEMICAL_REACTOR.tooltipDescription(),
+ RecipeMaps.chemicalReactorRecipes,
+ 2,
+ 2,
+ true,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "CHEMICAL_REACTOR",
+ new Object[] { "GRG", "WEW", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_MV_ChemicalReactor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CHEMICAL_REACTOR_MV.ID,
+ "basicmachine.chemicalreactor.tier.02",
+ "Advanced Chemical Reactor",
+ 2,
+ MachineType.CHEMICAL_REACTOR.tooltipDescription(),
+ RecipeMaps.chemicalReactorRecipes,
+ 2,
+ 2,
+ true,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "CHEMICAL_REACTOR",
+ new Object[] { "GRG", "WEW", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_HV_ChemicalReactor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CHEMICAL_REACTOR_HV.ID,
+ "basicmachine.chemicalreactor.tier.03",
+ "Advanced Chemical Reactor II",
+ 3,
+ MachineType.CHEMICAL_REACTOR.tooltipDescription(),
+ RecipeMaps.chemicalReactorRecipes,
+ 2,
+ 2,
+ true,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "CHEMICAL_REACTOR",
+ new Object[] { "GRG", "WEW", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ OrePrefixes.pipeMedium.get(Materials.Plastic) }).getStackForm(1L));
+ ItemList.Machine_EV_ChemicalReactor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CHEMICAL_REACTOR_EV.ID,
+ "basicmachine.chemicalreactor.tier.04",
+ "Advanced Chemical Reactor III",
+ 4,
+ MachineType.CHEMICAL_REACTOR.tooltipDescription(),
+ RecipeMaps.chemicalReactorRecipes,
+ 2,
+ 2,
+ true,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "CHEMICAL_REACTOR",
+ new Object[] { "GRG", "WEW", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ OrePrefixes.pipeLarge.get(Materials.Plastic) }).getStackForm(1L));
+ ItemList.Machine_IV_ChemicalReactor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CHEMICAL_REACTOR_IV.ID,
+ "basicmachine.chemicalreactor.tier.05",
+ "Advanced Chemical Reactor IV",
+ 5,
+ MachineType.CHEMICAL_REACTOR.tooltipDescription(),
+ RecipeMaps.chemicalReactorRecipes,
+ 2,
+ 2,
+ true,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "CHEMICAL_REACTOR",
+ new Object[] { "GRG", "WEW", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.pipeHuge.get(Materials.Plastic) })
+ .getStackForm(1L));
+ }
+
+ private static void registerCircuitAssembler() {
+ ItemList.Machine_LV_CircuitAssembler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CIRCUIT_ASSEMBLER_LV.ID,
+ "basicmachine.circuitassembler.tier.01",
+ "Basic Circuit Assembler",
+ 1,
+ MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(),
+ RecipeMaps.circuitAssemblerRecipes,
+ 6,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CIRCUITASSEMBLER",
+ new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }).getStackForm(1L));
+ ItemList.Machine_MV_CircuitAssembler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CIRCUIT_ASSEMBLER_MV.ID,
+ "basicmachine.circuitassembler.tier.02",
+ "Advanced Circuit Assembler",
+ 2,
+ MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(),
+ RecipeMaps.circuitAssemblerRecipes,
+ 6,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CIRCUITASSEMBLER",
+ new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }).getStackForm(1L));
+ ItemList.Machine_HV_CircuitAssembler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CIRCUIT_ASSEMBLER_HV.ID,
+ "basicmachine.circuitassembler.tier.03",
+ "Advanced Circuit Assembler II",
+ 3,
+ MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(),
+ RecipeMaps.circuitAssemblerRecipes,
+ 6,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CIRCUITASSEMBLER",
+ new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }).getStackForm(1L));
+ ItemList.Machine_EV_CircuitAssembler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CIRCUIT_ASSEMBLER_EV.ID,
+ "basicmachine.circuitassembler.tier.04",
+ "Advanced Circuit Assembler III",
+ 4,
+ MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(),
+ RecipeMaps.circuitAssemblerRecipes,
+ 6,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CIRCUITASSEMBLER",
+ new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }).getStackForm(1L));
+ ItemList.Machine_IV_CircuitAssembler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CIRCUIT_ASSEMBLER_IV.ID,
+ "basicmachine.circuitassembler.tier.05",
+ "Advanced Circuit Assembler IV",
+ 5,
+ MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(),
+ RecipeMaps.circuitAssemblerRecipes,
+ 6,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CIRCUITASSEMBLER",
+ new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }).getStackForm(1L));
+ ItemList.Machine_LuV_CircuitAssembler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CIRCUIT_ASSEMBLER_LuV.ID,
+ "basicmachine.circuitassembler.tier.06",
+ "Advanced Circuit Assembler V",
+ 6,
+ MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(),
+ RecipeMaps.circuitAssemblerRecipes,
+ 6,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CIRCUITASSEMBLER",
+ new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }).getStackForm(1L));
+ ItemList.Machine_ZPM_CircuitAssembler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CIRCUIT_ASSEMBLER_ZPM.ID,
+ "basicmachine.circuitassembler.tier.07",
+ "Advanced Circuit Assembler VI",
+ 7,
+ MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(),
+ RecipeMaps.circuitAssemblerRecipes,
+ 6,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CIRCUITASSEMBLER",
+ new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }).getStackForm(1L));
+ ItemList.Machine_UV_CircuitAssembler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CIRCUIT_ASSEMBLER_UV.ID,
+ "basicmachine.circuitassembler.tier.08",
+ "Advanced Circuit Assembler VII",
+ 8,
+ MachineType.CIRCUIT_ASSEMBLER.tooltipDescription(),
+ RecipeMaps.circuitAssemblerRecipes,
+ 6,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CIRCUITASSEMBLER",
+ new Object[] { "ACE", "VMV", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'A',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER }).getStackForm(1L));
+ }
+
+ private static void registerCompressor() {
+ ItemList.Machine_LV_Compressor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ COMPRESSOR_LV.ID,
+ "basicmachine.compressor.tier.01",
+ "Basic Compressor",
+ 1,
+ MachineType.COMPRESSOR.tooltipDescription(),
+ RecipeMaps.compressorRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "COMPRESSOR",
+ new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_MV_Compressor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ COMPRESSOR_MV.ID,
+ "basicmachine.compressor.tier.02",
+ "Advanced Compressor",
+ 2,
+ MachineType.COMPRESSOR.tooltipDescription(),
+ RecipeMaps.compressorRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "COMPRESSOR",
+ new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_HV_Compressor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ COMPRESSOR_HV.ID,
+ "basicmachine.compressor.tier.03",
+ "Advanced Compressor II",
+ 3,
+ MachineType.COMPRESSOR.tooltipDescription(),
+ RecipeMaps.compressorRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "COMPRESSOR",
+ new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_EV_Compressor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ COMPRESSOR_EV.ID,
+ "basicmachine.compressor.tier.04",
+ "Advanced Compressor III",
+ 4,
+ MachineType.COMPRESSOR.tooltipDescription(),
+ RecipeMaps.compressorRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "COMPRESSOR",
+ new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_IV_Compressor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ COMPRESSOR_IV.ID,
+ "basicmachine.compressor.tier.05",
+ "Singularity Compressor",
+ 5,
+ MachineType.COMPRESSOR.tooltipDescription(),
+ RecipeMaps.compressorRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "COMPRESSOR",
+ new Object[] { aTextWireCoil, aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ }
+
+ private static void registerCuttingMachine() {
+ ItemList.Machine_LV_Cutter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CUTTING_MACHINE_LV.ID,
+ "basicmachine.cutter.tier.01",
+ "Basic Cutting Machine",
+ 1,
+ MachineType.CUTTING_MACHINE.tooltipDescription(),
+ RecipeMaps.cutterRecipes,
+ 1,
+ 2,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CUTTER",
+ new Object[] { "WCG", "VMB", "CWE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B', OreDictNames.craftingDiamondBlade })
+ .getStackForm(1L));
+ ItemList.Machine_MV_Cutter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CUTTING_MACHINE_MV.ID,
+ "basicmachine.cutter.tier.02",
+ "Advanced Cutting Machine",
+ 2,
+ MachineType.CUTTING_MACHINE.tooltipDescription(),
+ RecipeMaps.cutterRecipes,
+ 2,
+ 2,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CUTTER",
+ new Object[] { "WCG", "VMB", "CWE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B', OreDictNames.craftingDiamondBlade })
+ .getStackForm(1L));
+ ItemList.Machine_HV_Cutter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CUTTING_MACHINE_HV.ID,
+ "basicmachine.cutter.tier.03",
+ "Advanced Cutting Machine II",
+ 3,
+ MachineType.CUTTING_MACHINE.tooltipDescription(),
+ RecipeMaps.cutterRecipes,
+ 2,
+ 4,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CUTTER",
+ new Object[] { "WCG", "VMB", "CWE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B', OreDictNames.craftingDiamondBlade })
+ .getStackForm(1L));
+ ItemList.Machine_EV_Cutter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CUTTING_MACHINE_EV.ID,
+ "basicmachine.cutter.tier.04",
+ "Advanced Cutting Machine III",
+ 4,
+ MachineType.CUTTING_MACHINE.tooltipDescription(),
+ RecipeMaps.cutterRecipes,
+ 2,
+ 4,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CUTTER",
+ new Object[] { "WCG", "VMB", "CWE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B', OreDictNames.craftingDiamondBlade })
+ .getStackForm(1L));
+ ItemList.Machine_IV_Cutter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ CUTTING_MACHINE_IV.ID,
+ "basicmachine.cutter.tier.05",
+ "Advanced Cutting Machine IV",
+ 5,
+ MachineType.CUTTING_MACHINE.tooltipDescription(),
+ RecipeMaps.cutterRecipes,
+ 2,
+ 4,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "CUTTER",
+ new Object[] { "WCG", "VMB", "CWE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B', OreDictNames.craftingDiamondBlade })
+ .getStackForm(1L));
+ }
+
+ private static void registerDistillery() {
+ ItemList.Machine_LV_Distillery.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ DISTILLERY_LV.ID,
+ "basicmachine.distillery.tier.01",
+ "Basic Distillery",
+ 1,
+ MachineType.DISTILLERY.tooltipDescription(),
+ RecipeMaps.distilleryRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.GT_MACHINES_DISTILLERY_LOOP,
+ SpecialEffects.NONE,
+ "DISTILLERY",
+ new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'B',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_MV_Distillery.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ DISTILLERY_MV.ID,
+ "basicmachine.distillery.tier.02",
+ "Advanced Distillery",
+ 2,
+ MachineType.DISTILLERY.tooltipDescription(),
+ RecipeMaps.distilleryRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.GT_MACHINES_DISTILLERY_LOOP,
+ SpecialEffects.NONE,
+ "DISTILLERY",
+ new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'B',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_HV_Distillery.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ DISTILLERY_HV.ID,
+ "basicmachine.distillery.tier.03",
+ "Advanced Distillery II",
+ 3,
+ MachineType.DISTILLERY.tooltipDescription(),
+ RecipeMaps.distilleryRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.GT_MACHINES_DISTILLERY_LOOP,
+ SpecialEffects.NONE,
+ "DISTILLERY",
+ new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'B',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_EV_Distillery.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ DISTILLERY_EV.ID,
+ "basicmachine.distillery.tier.04",
+ "Advanced Distillery III",
+ 4,
+ MachineType.DISTILLERY.tooltipDescription(),
+ RecipeMaps.distilleryRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.GT_MACHINES_DISTILLERY_LOOP,
+ SpecialEffects.NONE,
+ "DISTILLERY",
+ new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'B',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_IV_Distillery.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ DISTILLERY_IV.ID,
+ "basicmachine.distillery.tier.05",
+ "Advanced Distillery IV",
+ 5,
+ MachineType.DISTILLERY.tooltipDescription(),
+ RecipeMaps.distilleryRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.GT_MACHINES_DISTILLERY_LOOP,
+ SpecialEffects.NONE,
+ "DISTILLERY",
+ new Object[] { "GBG", aTextCableHull, aTextWirePump, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'B',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ }
+
+ private static void registerElectricFurnace() {
+ ItemList.Machine_LV_E_Furnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTRIC_FURNACE_LV.ID,
+ "basicmachine.e_furnace.tier.01",
+ "Basic Electric Furnace",
+ 1,
+ MachineType.ELECTRIC_FURNACE.tooltipDescription(),
+ RecipeMaps.furnaceRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "ELECTRIC_FURNACE",
+ new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }).setProgressBarTextureName("E_Furnace")
+ .getStackForm(1L));
+ ItemList.Machine_MV_E_Furnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTRIC_FURNACE_MV.ID,
+ "basicmachine.e_furnace.tier.02",
+ "Advanced Electric Furnace",
+ 2,
+ MachineType.ELECTRIC_FURNACE.tooltipDescription(),
+ RecipeMaps.furnaceRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "ELECTRIC_FURNACE",
+ new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }).setProgressBarTextureName("E_Furnace")
+ .getStackForm(1L));
+ ItemList.Machine_HV_E_Furnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTRIC_FURNACE_HV.ID,
+ "basicmachine.e_furnace.tier.03",
+ "Advanced Electric Furnace II",
+ 3,
+ MachineType.ELECTRIC_FURNACE.tooltipDescription(),
+ RecipeMaps.furnaceRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "ELECTRIC_FURNACE",
+ new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }).setProgressBarTextureName("E_Furnace")
+ .getStackForm(1L));
+ ItemList.Machine_EV_E_Furnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTRIC_FURNACE_EV.ID,
+ "basicmachine.e_furnace.tier.04",
+ "Advanced Electric Furnace III",
+ 4,
+ MachineType.ELECTRIC_FURNACE.tooltipDescription(),
+ RecipeMaps.furnaceRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "ELECTRIC_FURNACE",
+ new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }).setProgressBarTextureName("E_Furnace")
+ .getStackForm(1L));
+ ItemList.Machine_IV_E_Furnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTRIC_FURNACE_IV.ID,
+ "basicmachine.e_furnace.tier.05",
+ "Electron Exitement Processor",
+ 5,
+ MachineType.ELECTRIC_FURNACE.tooltipDescription(),
+ RecipeMaps.furnaceRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "ELECTRIC_FURNACE",
+ new Object[] { "ECE", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }).setProgressBarTextureName("E_Furnace")
+ .getStackForm(1L));
+
+ }
+
+ private static void registerElectrolyser() {
+ ItemList.Machine_LV_Electrolyzer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTROLYSER_LV.ID,
+ "basicmachine.electrolyzer.tier.01",
+ "Basic Electrolyzer",
+ 1,
+ MachineType.ELECTROLYZER.tooltipDescription(),
+ RecipeMaps.electrolyzerRecipes,
+ 2,
+ 6,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ELECTROLYZER",
+ new Object[] { "IGI", "IMI", "CWC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.Gold), 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_MV_Electrolyzer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTROLYSER_MV.ID,
+ "basicmachine.electrolyzer.tier.02",
+ "Advanced Electrolyzer",
+ 2,
+ MachineType.ELECTROLYZER.tooltipDescription(),
+ RecipeMaps.electrolyzerRecipes,
+ 2,
+ 6,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ELECTROLYZER",
+ new Object[] { "IGI", "IMI", "CWC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.Silver),
+ 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_HV_Electrolyzer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTROLYSER_HV.ID,
+ "basicmachine.electrolyzer.tier.03",
+ "Advanced Electrolyzer II",
+ 3,
+ MachineType.ELECTROLYZER.tooltipDescription(),
+ RecipeMaps.electrolyzerRecipes,
+ 2,
+ 6,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ELECTROLYZER",
+ new Object[] { "IGI", "IMI", "CWC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.Electrum),
+ 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_EV_Electrolyzer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTROLYSER_EV.ID,
+ "basicmachine.electrolyzer.tier.04",
+ "Advanced Electrolyzer III",
+ 4,
+ MachineType.ELECTROLYZER.tooltipDescription(),
+ RecipeMaps.electrolyzerRecipes,
+ 2,
+ 6,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ELECTROLYZER",
+ new Object[] { "IGI", "IMI", "CWC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.Platinum),
+ 'G', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_IV_Electrolyzer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTROLYSER_IV.ID,
+ "basicmachine.electrolyzer.tier.05",
+ "Molecular Disintegrator E-4908",
+ 5,
+ MachineType.ELECTROLYZER.tooltipDescription(),
+ RecipeMaps.electrolyzerRecipes,
+ 2,
+ 6,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ELECTROLYZER",
+ new Object[] { "IGI", "IMI", "CWC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'I', OrePrefixes.wireGt01.get(Materials.HSSG), 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ }
+
+ private static void registerElectromagneticSeparator() {
+ ItemList.Machine_LV_ElectromagneticSeparator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTROMAGNETIC_SEPARATOR_LV.ID,
+ "basicmachine.electromagneticseparator.tier.01",
+ "Basic Electromagnetic Separator",
+ 1,
+ MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(),
+ RecipeMaps.electroMagneticSeparatorRecipes,
+ 1,
+ 3,
+ false,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "ELECTROMAGNETIC_SEPARATOR",
+ new Object[] { "VWZ", "WMS", "CWZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_MV_ElectromagneticSeparator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTROMAGNETIC_SEPARATOR_MV.ID,
+ "basicmachine.electromagneticseparator.tier.02",
+ "Advanced Electromagnetic Separator",
+ 2,
+ MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(),
+ RecipeMaps.electroMagneticSeparatorRecipes,
+ 1,
+ 3,
+ false,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "ELECTROMAGNETIC_SEPARATOR",
+ new Object[] { "VWZ", "WMS", "CWZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_HV_ElectromagneticSeparator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTROMAGNETIC_SEPARATOR_HV.ID,
+ "basicmachine.electromagneticseparator.tier.03",
+ "Advanced Electromagnetic Separator II",
+ 3,
+ MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(),
+ RecipeMaps.electroMagneticSeparatorRecipes,
+ 1,
+ 3,
+ false,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "ELECTROMAGNETIC_SEPARATOR",
+ new Object[] { "VWZ", "WMS", "CWZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_EV_ElectromagneticSeparator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTROMAGNETIC_SEPARATOR_EV.ID,
+ "basicmachine.electromagneticseparator.tier.04",
+ "Advanced Electromagnetic Separator III",
+ 4,
+ MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(),
+ RecipeMaps.electroMagneticSeparatorRecipes,
+ 1,
+ 3,
+ false,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "ELECTROMAGNETIC_SEPARATOR",
+ new Object[] { "VWZ", "WMS", "CWZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_IV_ElectromagneticSeparator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ELECTROMAGNETIC_SEPARATOR_IV.ID,
+ "basicmachine.electromagneticseparator.tier.05",
+ "Advanced Electromagnetic Separator IV",
+ 5,
+ MachineType.ELECTROMAGNETIC_SEPARATOR.tooltipDescription(),
+ RecipeMaps.electroMagneticSeparatorRecipes,
+ 1,
+ 3,
+ false,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "ELECTROMAGNETIC_SEPARATOR",
+ new Object[] { "VWZ", "WMS", "CWZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ }
+
+ private static void registerExtractor() {
+ ItemList.Machine_LV_Extractor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ EXTRACTOR_LV.ID,
+ "basicmachine.extractor.tier.01",
+ "Basic Extractor",
+ 1,
+ MachineType.EXTRACTOR.tooltipDescription(),
+ RecipeMaps.extractorRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "EXTRACTOR",
+ new Object[] { "GCG", "EMP", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_MV_Extractor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ EXTRACTOR_MV.ID,
+ "basicmachine.extractor.tier.02",
+ "Advanced Extractor",
+ 2,
+ MachineType.EXTRACTOR.tooltipDescription(),
+ RecipeMaps.extractorRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "EXTRACTOR",
+ new Object[] { "GCG", "EMP", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_HV_Extractor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ EXTRACTOR_HV.ID,
+ "basicmachine.extractor.tier.03",
+ "Advanced Extractor II",
+ 3,
+ MachineType.EXTRACTOR.tooltipDescription(),
+ RecipeMaps.extractorRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "EXTRACTOR",
+ new Object[] { "GCG", "EMP", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_EV_Extractor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ EXTRACTOR_EV.ID,
+ "basicmachine.extractor.tier.04",
+ "Advanced Extractor III",
+ 4,
+ MachineType.EXTRACTOR.tooltipDescription(),
+ RecipeMaps.extractorRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "EXTRACTOR",
+ new Object[] { "GCG", "EMP", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_IV_Extractor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ EXTRACTOR_IV.ID,
+ "basicmachine.extractor.tier.05",
+ "Vacuum Extractor",
+ 5,
+ MachineType.EXTRACTOR.tooltipDescription(),
+ RecipeMaps.extractorRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "EXTRACTOR",
+ new Object[] { "GCG", "EMP", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ }
+
+ private static void registerExtruder() {
+ ItemList.Machine_LV_Extruder.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ EXTRUDER_LV.ID,
+ "basicmachine.extruder.tier.01",
+ "Basic Extruder",
+ 1,
+ MachineType.EXTRUDER.tooltipDescription(),
+ RecipeMaps.extruderRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "EXTRUDER",
+ new Object[] { "CCE", "XMP", "CCE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'X',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ ItemList.Machine_MV_Extruder.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ EXTRUDER_MV.ID,
+ "basicmachine.extruder.tier.02",
+ "Advanced Extruder",
+ 2,
+ MachineType.EXTRUDER.tooltipDescription(),
+ RecipeMaps.extruderRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "EXTRUDER",
+ new Object[] { "CCE", "XMP", "CCE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'X',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ ItemList.Machine_HV_Extruder.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ EXTRUDER_HV.ID,
+ "basicmachine.extruder.tier.03",
+ "Advanced Extruder II",
+ 3,
+ MachineType.EXTRUDER.tooltipDescription(),
+ RecipeMaps.extruderRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "EXTRUDER",
+ new Object[] { "CCE", "XMP", "CCE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'X',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ ItemList.Machine_EV_Extruder.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ EXTRUDER_EV.ID,
+ "basicmachine.extruder.tier.04",
+ "Advanced Extruder III",
+ 4,
+ MachineType.EXTRUDER.tooltipDescription(),
+ RecipeMaps.extruderRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "EXTRUDER",
+ new Object[] { "CCE", "XMP", "CCE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'X',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ ItemList.Machine_IV_Extruder.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ EXTRUDER_IV.ID,
+ "basicmachine.extruder.tier.05",
+ "Advanced Extruder IV",
+ 5,
+ MachineType.EXTRUDER.tooltipDescription(),
+ RecipeMaps.extruderRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "EXTRUDER",
+ new Object[] { "CCE", "XMP", "CCE", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'X',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PIPE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ }
+
+ private static void registerFermenter() {
+ ItemList.Machine_LV_Fermenter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FERMENTER_LV.ID,
+ "basicmachine.fermenter.tier.01",
+ "Basic Fermenter",
+ 1,
+ MachineType.FERMENTER.tooltipDescription(),
+ RecipeMaps.fermentingRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FERMENTER",
+ new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_MV_Fermenter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FERMENTER_MV.ID,
+ "basicmachine.fermenter.tier.02",
+ "Advanced Fermenter",
+ 2,
+ MachineType.FERMENTER.tooltipDescription(),
+ RecipeMaps.fermentingRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FERMENTER",
+ new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_HV_Fermenter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FERMENTER_HV.ID,
+ "basicmachine.fermenter.tier.03",
+ "Advanced Fermenter II",
+ 3,
+ MachineType.FERMENTER.tooltipDescription(),
+ RecipeMaps.fermentingRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FERMENTER",
+ new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_EV_Fermenter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FERMENTER_EV.ID,
+ "basicmachine.fermenter.tier.04",
+ "Advanced Fermenter III",
+ 4,
+ MachineType.FERMENTER.tooltipDescription(),
+ RecipeMaps.fermentingRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FERMENTER",
+ new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_IV_Fermenter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FERMENTER_IV.ID,
+ "basicmachine.fermenter.tier.05",
+ "Advanced Fermenter IV",
+ 5,
+ MachineType.FERMENTER.tooltipDescription(),
+ RecipeMaps.fermentingRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FERMENTER",
+ new Object[] { aTextWirePump, "GMG", aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ }
+
+ private static void registerFluidCanner() {
+ ItemList.Machine_LV_FluidCanner.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_CANNER_LV.ID,
+ "basicmachine.fluidcanner.tier.01",
+ "Basic Fluid Canner",
+ 1,
+ MachineType.FLUID_CANNER.tooltipDescription(),
+ RecipeMaps.fluidCannerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_CANNER",
+ new Object[] { "GCG", "GMG", "WPW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_MV_FluidCanner.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_CANNER_MV.ID,
+ "basicmachine.fluidcanner.tier.02",
+ "Advanced Fluid Canner",
+ 2,
+ MachineType.FLUID_CANNER.tooltipDescription(),
+ RecipeMaps.fluidCannerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_CANNER",
+ new Object[] { "GCG", "GMG", "WPW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_HV_FluidCanner.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_CANNER_HV.ID,
+ "basicmachine.fluidcanner.tier.03",
+ "Quick Fluid Canner",
+ 3,
+ MachineType.FLUID_CANNER.tooltipDescription(),
+ RecipeMaps.fluidCannerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_CANNER",
+ new Object[] { "GCG", "GMG", "WPW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_EV_FluidCanner.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_CANNER_EV.ID,
+ "basicmachine.fluidcanner.tier.04",
+ "Turbo Fluid Canner",
+ 4,
+ MachineType.FLUID_CANNER.tooltipDescription(),
+ RecipeMaps.fluidCannerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_CANNER",
+ new Object[] { "GCG", "GMG", "WPW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_IV_FluidCanner.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_CANNER_IV.ID,
+ "basicmachine.fluidcanner.tier.05",
+ "Instant Fluid Canner",
+ 5,
+ MachineType.FLUID_CANNER.tooltipDescription(),
+ RecipeMaps.fluidCannerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_CANNER",
+ new Object[] { "GCG", "GMG", "WPW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ }
+
+ private static void registerFluidExtractor() {
+ ItemList.Machine_LV_FluidExtractor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_EXTRACTOR_LV.ID,
+ "basicmachine.fluidextractor.tier.01",
+ "Basic Fluid Extractor",
+ 1,
+ MachineType.FLUID_EXTRACTOR.tooltipDescription(),
+ RecipeMaps.fluidExtractionRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "FLUID_EXTRACTOR",
+ new Object[] { "GEG", "TPT", "CMC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'T',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_MV_FluidExtractor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_EXTRACTOR_MV.ID,
+ "basicmachine.fluidextractor.tier.02",
+ "Advanced Fluid Extractor",
+ 2,
+ MachineType.FLUID_EXTRACTOR.tooltipDescription(),
+ RecipeMaps.fluidExtractionRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "FLUID_EXTRACTOR",
+ new Object[] { "GEG", "TPT", "CMC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'T',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_HV_FluidExtractor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_EXTRACTOR_HV.ID,
+ "basicmachine.fluidextractor.tier.03",
+ "Advanced Fluid Extractor II",
+ 3,
+ MachineType.FLUID_EXTRACTOR.tooltipDescription(),
+ RecipeMaps.fluidExtractionRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "FLUID_EXTRACTOR",
+ new Object[] { "GEG", "TPT", "CMC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'T',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_EV_FluidExtractor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_EXTRACTOR_EV.ID,
+ "basicmachine.fluidextractor.tier.04",
+ "Advanced Fluid Extractor III",
+ 4,
+ MachineType.FLUID_EXTRACTOR.tooltipDescription(),
+ RecipeMaps.fluidExtractionRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "FLUID_EXTRACTOR",
+ new Object[] { "GEG", "TPT", "CMC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'T',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_IV_FluidExtractor.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_EXTRACTOR_IV.ID,
+ "basicmachine.fluidextractor.tier.05",
+ "Advanced Fluid Extractor IV",
+ 5,
+ MachineType.FLUID_EXTRACTOR.tooltipDescription(),
+ RecipeMaps.fluidExtractionRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "FLUID_EXTRACTOR",
+ new Object[] { "GEG", "TPT", "CMC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'T',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+
+ }
+
+ private static void registerFluidHeater() {
+ ItemList.Machine_LV_FluidHeater.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_HEATER_LV.ID,
+ "basicmachine.fluidheater.tier.01",
+ "Basic Fluid Heater",
+ 1,
+ MachineType.FLUID_HEATER.tooltipDescription(),
+ RecipeMaps.fluidHeaterRecipes,
+ 1,
+ 0,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_HEATER",
+ new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_MV_FluidHeater.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_HEATER_MV.ID,
+ "basicmachine.fluidheater.tier.02",
+ "Advanced Fluid Heater",
+ 2,
+ MachineType.FLUID_HEATER.tooltipDescription(),
+ RecipeMaps.fluidHeaterRecipes,
+ 1,
+ 0,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_HEATER",
+ new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_HV_FluidHeater.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_HEATER_HV.ID,
+ "basicmachine.fluidheater.tier.03",
+ "Advanced Fluid Heater II",
+ 3,
+ MachineType.FLUID_HEATER.tooltipDescription(),
+ RecipeMaps.fluidHeaterRecipes,
+ 1,
+ 0,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_HEATER",
+ new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_EV_FluidHeater.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_HEATER_EV.ID,
+ "basicmachine.fluidheater.tier.04",
+ "Advanced Fluid Heater III",
+ 4,
+ MachineType.FLUID_HEATER.tooltipDescription(),
+ RecipeMaps.fluidHeaterRecipes,
+ 1,
+ 0,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_HEATER",
+ new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_IV_FluidHeater.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_HEATER_IV.ID,
+ "basicmachine.fluidheater.tier.05",
+ "Advanced Fluid Heater IV",
+ 5,
+ MachineType.FLUID_HEATER.tooltipDescription(),
+ RecipeMaps.fluidHeaterRecipes,
+ 1,
+ 0,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_HEATER",
+ new Object[] { "OGO", aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ }
+
+ private static void registerFluidSolidifier() {
+ ItemList.Machine_LV_FluidSolidifier.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_SOLIDIFIER_LV.ID,
+ "basicmachine.fluidsolidifier.tier.01",
+ "Basic Fluid Solidifier",
+ 1,
+ MachineType.FLUID_SOLIDIFIER.tooltipDescription(),
+ RecipeMaps.fluidSolidifierRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_SOLIDIFIER",
+ new Object[] { "PGP", aTextWireHull, "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B', OreDictNames.craftingChest })
+ .getStackForm(1L));
+ ItemList.Machine_MV_FluidSolidifier.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_SOLIDIFIER_MV.ID,
+ "basicmachine.fluidsolidifier.tier.02",
+ "Advanced Fluid Solidifier",
+ 2,
+ MachineType.FLUID_SOLIDIFIER.tooltipDescription(),
+ RecipeMaps.fluidSolidifierRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_SOLIDIFIER",
+ new Object[] { "PGP", aTextWireHull, "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B', OreDictNames.craftingChest })
+ .getStackForm(1L));
+ ItemList.Machine_HV_FluidSolidifier.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_SOLIDIFIER_HV.ID,
+ "basicmachine.fluidsolidifier.tier.03",
+ "Advanced Fluid Solidifier II",
+ 3,
+ MachineType.FLUID_SOLIDIFIER.tooltipDescription(),
+ RecipeMaps.fluidSolidifierRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_SOLIDIFIER",
+ new Object[] { "PGP", aTextWireHull, "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B', OreDictNames.craftingChest })
+ .getStackForm(1L));
+ ItemList.Machine_EV_FluidSolidifier.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_SOLIDIFIER_EV.ID,
+ "basicmachine.fluidsolidifier.tier.04",
+ "Advanced Fluid Solidifier III",
+ 4,
+ MachineType.FLUID_SOLIDIFIER.tooltipDescription(),
+ RecipeMaps.fluidSolidifierRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_SOLIDIFIER",
+ new Object[] { "PGP", aTextWireHull, "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B', OreDictNames.craftingChest })
+ .getStackForm(1L));
+ ItemList.Machine_IV_FluidSolidifier.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FLUID_SOLIDIFIER_IV.ID,
+ "basicmachine.fluidsolidifier.tier.05",
+ "Advanced Fluid Solidifier IV",
+ 5,
+ MachineType.FLUID_SOLIDIFIER.tooltipDescription(),
+ RecipeMaps.fluidSolidifierRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "FLUID_SOLIDIFIER",
+ new Object[] { "PGP", aTextWireHull, "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B', OreDictNames.craftingChest })
+ .getStackForm(1L));
+ }
+
+ private static void registerForgeHammer() {
+ ItemList.Machine_LV_Hammer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FORGE_HAMMER_LV.ID,
+ "basicmachine.hammer.tier.01",
+ "Basic Forge Hammer",
+ 1,
+ MachineType.FORGE_HAMMER.tooltipDescription(),
+ RecipeMaps.hammerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.RANDOM_ANVIL_USE,
+ SpecialEffects.MAIN_RANDOM_SPARKS,
+ "HAMMER",
+ new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'A', OreDictNames.craftingAnvil })
+ .getStackForm(1L));
+ ItemList.Machine_MV_Hammer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FORGE_HAMMER_MV.ID,
+ "basicmachine.hammer.tier.02",
+ "Advanced Forge Hammer",
+ 2,
+ MachineType.FORGE_HAMMER.tooltipDescription(),
+ RecipeMaps.hammerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.RANDOM_ANVIL_USE,
+ SpecialEffects.MAIN_RANDOM_SPARKS,
+ "HAMMER",
+ new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'A', OreDictNames.craftingAnvil })
+ .getStackForm(1L));
+ ItemList.Machine_HV_Hammer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FORGE_HAMMER_HV.ID,
+ "basicmachine.hammer.tier.03",
+ "Advanced Forge Hammer II",
+ 3,
+ MachineType.FORGE_HAMMER.tooltipDescription(),
+ RecipeMaps.hammerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.RANDOM_ANVIL_USE,
+ SpecialEffects.MAIN_RANDOM_SPARKS,
+ "HAMMER",
+ new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'A', OreDictNames.craftingAnvil })
+ .getStackForm(1L));
+ ItemList.Machine_EV_Hammer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FORGE_HAMMER_EV.ID,
+ "basicmachine.hammer.tier.04",
+ "Advanced Forge Hammer III",
+ 4,
+ MachineType.FORGE_HAMMER.tooltipDescription(),
+ RecipeMaps.hammerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.RANDOM_ANVIL_USE,
+ SpecialEffects.MAIN_RANDOM_SPARKS,
+ "HAMMER",
+ new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'A', OreDictNames.craftingAnvil })
+ .getStackForm(1L));
+ ItemList.Machine_IV_Hammer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FORGE_HAMMER_IV.ID,
+ "basicmachine.hammer.tier.05",
+ "Advanced Forge Hammer IV",
+ 5,
+ MachineType.FORGE_HAMMER.tooltipDescription(),
+ RecipeMaps.hammerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.RANDOM_ANVIL_USE,
+ SpecialEffects.MAIN_RANDOM_SPARKS,
+ "HAMMER",
+ new Object[] { aTextWirePump, aTextCableHull, "WAW", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE, 'A', OreDictNames.craftingAnvil })
+ .getStackForm(1L));
+ }
+
+ private static void registerFormingPress() {
+ ItemList.Machine_LV_Press.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FORMING_PRESS_LV.ID,
+ "basicmachine.press.tier.01",
+ "Basic Forming Press",
+ 1,
+ MachineType.FORMING_PRESS.tooltipDescription(),
+ RecipeMaps.formingPressRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "PRESS",
+ new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_MV_Press.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FORMING_PRESS_MV.ID,
+ "basicmachine.press.tier.02",
+ "Advanced Forming Press",
+ 2,
+ MachineType.FORMING_PRESS.tooltipDescription(),
+ RecipeMaps.formingPressRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "PRESS",
+ new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_HV_Press.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FORMING_PRESS_HV.ID,
+ "basicmachine.press.tier.03",
+ "Advanced Forming Press II",
+ 3,
+ MachineType.FORMING_PRESS.tooltipDescription(),
+ RecipeMaps.formingPressRecipes,
+ 4,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "PRESS",
+ new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_EV_Press.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FORMING_PRESS_EV.ID,
+ "basicmachine.press.tier.04",
+ "Advanced Forming Press III",
+ 4,
+ MachineType.FORMING_PRESS.tooltipDescription(),
+ RecipeMaps.formingPressRecipes,
+ 4,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "PRESS",
+ new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_IV_Press.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ FORMING_PRESS_IV.ID,
+ "basicmachine.press.tier.05",
+ "Advanced Forming Press IV",
+ 5,
+ MachineType.FORMING_PRESS.tooltipDescription(),
+ RecipeMaps.formingPressRecipes,
+ 6,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.NONE,
+ "PRESS",
+ new Object[] { aTextWirePump, aTextCableHull, aTextWirePump, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ }
+
+ private static void registerLaserEngraver() {
+ ItemList.Machine_LV_LaserEngraver.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ LASER_ENGRAVER_LV.ID,
+ "basicmachine.laserengraver.tier.01",
+ "Basic Precision Laser Engraver",
+ 1,
+ MachineType.LASER_ENGRAVER.tooltipDescription(),
+ RecipeMaps.laserEngraverRecipes,
+ 2,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "LASER_ENGRAVER",
+ new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_MV_LaserEngraver.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ LASER_ENGRAVER_MV.ID,
+ "basicmachine.laserengraver.tier.02",
+ "Advanced Precision Laser Engraver",
+ 2,
+ MachineType.LASER_ENGRAVER.tooltipDescription(),
+ RecipeMaps.laserEngraverRecipes,
+ 2,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "LASER_ENGRAVER",
+ new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_HV_LaserEngraver.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ LASER_ENGRAVER_HV.ID,
+ "basicmachine.laserengraver.tier.03",
+ "Advanced Precision Laser Engraver II",
+ 3,
+ MachineType.LASER_ENGRAVER.tooltipDescription(),
+ RecipeMaps.laserEngraverRecipes,
+ 2,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "LASER_ENGRAVER",
+ new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_EV_LaserEngraver.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ LASER_ENGRAVER_EV.ID,
+ "basicmachine.laserengraver.tier.04",
+ "Advanced Precision Laser Engraver III",
+ 4,
+ MachineType.LASER_ENGRAVER.tooltipDescription(),
+ RecipeMaps.laserEngraverRecipes,
+ 4,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "LASER_ENGRAVER",
+ new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_IV_LaserEngraver.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ LASER_ENGRAVER_IV.ID,
+ "basicmachine.laserengraver.tier.05",
+ "Advanced Precision Laser Engraver IV",
+ 5,
+ MachineType.LASER_ENGRAVER.tooltipDescription(),
+ RecipeMaps.laserEngraverRecipes,
+ 4,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "LASER_ENGRAVER",
+ new Object[] { "PEP", aTextCableHull, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ }
+
+ private static void registerLathe() {
+ ItemList.Machine_LV_Lathe.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ LATHE_LV.ID,
+ "basicmachine.lathe.tier.01",
+ "Basic Lathe",
+ 1,
+ MachineType.LATHE.tooltipDescription(),
+ RecipeMaps.latheRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "LATHE",
+ new Object[] { aTextWireCoil, "EMD", "CWP", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'D', OrePrefixes.gem.get(Materials.Diamond) })
+ .getStackForm(1L));
+ ItemList.Machine_MV_Lathe.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ LATHE_MV.ID,
+ "basicmachine.lathe.tier.02",
+ "Advanced Lathe",
+ 2,
+ MachineType.LATHE.tooltipDescription(),
+ RecipeMaps.latheRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "LATHE",
+ new Object[] { aTextWireCoil, "EMD", "CWP", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'D',
+ OrePrefixes.gemFlawless.get(Materials.Diamond) }).getStackForm(1L));
+ ItemList.Machine_HV_Lathe.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ LATHE_HV.ID,
+ "basicmachine.lathe.tier.03",
+ "Advanced Lathe II",
+ 3,
+ MachineType.LATHE.tooltipDescription(),
+ RecipeMaps.latheRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "LATHE",
+ new Object[] { aTextWireCoil, "EMD", "CWP", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'D', OreDictNames.craftingIndustrialDiamond })
+ .getStackForm(1L));
+ ItemList.Machine_EV_Lathe.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ LATHE_EV.ID,
+ "basicmachine.lathe.tier.04",
+ "Advanced Lathe III",
+ 4,
+ MachineType.LATHE.tooltipDescription(),
+ RecipeMaps.latheRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "LATHE",
+ new Object[] { aTextWireCoil, "EMD", "CWP", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'D', OreDictNames.craftingIndustrialDiamond })
+ .getStackForm(1L));
+ ItemList.Machine_IV_Lathe.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ LATHE_IV.ID,
+ "basicmachine.lathe.tier.05",
+ "Advanced Lathe IV",
+ 5,
+ MachineType.LATHE.tooltipDescription(),
+ RecipeMaps.latheRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "LATHE",
+ new Object[] { aTextWireCoil, "EMD", "CWP", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'D', OreDictNames.craftingIndustrialDiamond })
+ .getStackForm(1L));
+ }
+
+ private static void registerMacerator() {
+ ItemList.Machine_LV_Macerator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MACERATOR_LV.ID,
+ "basicmachine.macerator.tier.01",
+ "Basic Macerator",
+ 1,
+ MachineType.MACERATOR.tooltipDescription(),
+ RecipeMaps.maceratorRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_MACERATOR_OP,
+ SpecialEffects.TOP_SMOKE,
+ "MACERATOR",
+ new Object[] { "PEG", "WWM", "CCW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.gem.get(Materials.Diamond) })
+ .getStackForm(1L));
+ ItemList.Machine_MV_Macerator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MACERATOR_MV.ID,
+ "basicmachine.macerator.tier.02",
+ "Advanced Macerator",
+ 2,
+ MachineType.MACERATOR.tooltipDescription(),
+ RecipeMaps.maceratorRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_MACERATOR_OP,
+ SpecialEffects.TOP_SMOKE,
+ "MACERATOR",
+ new Object[] { "PEG", "WWM", "CCW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ OrePrefixes.gemFlawless.get(Materials.Diamond) }).getStackForm(1L));
+ ItemList.Machine_HV_Macerator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MACERATOR_HV.ID,
+ "basicmachine.macerator.tier.03",
+ "Universal Macerator",
+ 3,
+ MachineType.MACERATOR_PULVERIZER.tooltipDescription(),
+ RecipeMaps.maceratorRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.IC2_MACHINES_MACERATOR_OP,
+ SpecialEffects.TOP_SMOKE,
+ "PULVERIZER",
+ new Object[] { "PEG", "WWM", "CCW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OreDictNames.craftingGrinder })
+ .getStackForm(1L));
+ ItemList.Machine_EV_Macerator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MACERATOR_EV.ID,
+ "basicmachine.macerator.tier.04",
+ "Universal Pulverizer",
+ 4,
+ MachineType.MACERATOR_PULVERIZER.tooltipDescription(),
+ RecipeMaps.maceratorRecipes,
+ 1,
+ 3,
+ false,
+ SoundResource.IC2_MACHINES_MACERATOR_OP,
+ SpecialEffects.TOP_SMOKE,
+ "PULVERIZER",
+ new Object[] { "PEG", "WWM", "CCW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OreDictNames.craftingGrinder })
+ .getStackForm(1L));
+ ItemList.Machine_IV_Macerator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MACERATOR_IV.ID,
+ "basicmachine.macerator.tier.05",
+ "Blend-O-Matic 9001",
+ 5,
+ MachineType.MACERATOR_PULVERIZER.tooltipDescription(),
+ RecipeMaps.maceratorRecipes,
+ 1,
+ 4,
+ false,
+ SoundResource.IC2_MACHINES_MACERATOR_OP,
+ SpecialEffects.TOP_SMOKE,
+ "PULVERIZER",
+ new Object[] { "PEG", "WWM", "CCW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OreDictNames.craftingGrinder })
+ .getStackForm(1L));
+ }
+
+ private static void registerMatterAmplifier() {
+ ItemList.Machine_LV_Amplifab.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MATTER_AMPLIFIER_LV.ID,
+ "basicmachine.amplifab.tier.01",
+ "Basic Amplifabricator",
+ 1,
+ MachineType.MATTER_AMPLIFIER.tooltipDescription(),
+ RecipeMaps.amplifierRecipes,
+ 1,
+ 1,
+ 1000,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "AMPLIFAB",
+ new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4 }).getStackForm(1L));
+ ItemList.Machine_MV_Amplifab.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MATTER_AMPLIFIER_MV.ID,
+ "basicmachine.amplifab.tier.02",
+ "Advanced Amplifabricator",
+ 2,
+ MachineType.MATTER_AMPLIFIER.tooltipDescription(),
+ RecipeMaps.amplifierRecipes,
+ 1,
+ 1,
+ 1000,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "AMPLIFAB",
+ new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4 }).getStackForm(1L));
+ ItemList.Machine_HV_Amplifab.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MATTER_AMPLIFIER_HV.ID,
+ "basicmachine.amplifab.tier.03",
+ "Advanced Amplifabricator II",
+ 3,
+ MachineType.MATTER_AMPLIFIER.tooltipDescription(),
+ RecipeMaps.amplifierRecipes,
+ 1,
+ 1,
+ 1000,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "AMPLIFAB",
+ new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4 }).getStackForm(1L));
+ ItemList.Machine_EV_Amplifab.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MATTER_AMPLIFIER_EV.ID,
+ "basicmachine.amplifab.tier.04",
+ "Advanced Amplifabricator III",
+ 4,
+ MachineType.MATTER_AMPLIFIER.tooltipDescription(),
+ RecipeMaps.amplifierRecipes,
+ 1,
+ 1,
+ 1000,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "AMPLIFAB",
+ new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4 }).getStackForm(1L));
+ ItemList.Machine_IV_Amplifab.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MATTER_AMPLIFIER_IV.ID,
+ "basicmachine.amplifab.tier.05",
+ "Advanced Amplifabricator IV",
+ 5,
+ MachineType.MATTER_AMPLIFIER.tooltipDescription(),
+ RecipeMaps.amplifierRecipes,
+ 1,
+ 1,
+ 1000,
+ SoundResource.IC2_MACHINES_EXTRACTOR_OP,
+ SpecialEffects.NONE,
+ "AMPLIFAB",
+ new Object[] { aTextWirePump, aTextPlateMotor, "CPC", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4 }).getStackForm(1L));
+ }
+
+ private static void registerMicrowave() {
+ ItemList.Machine_LV_Microwave.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MICROWAVE_OVEN_LV.ID,
+ "basicmachine.microwave.tier.01",
+ "Basic Microwave",
+ 1,
+ MachineType.MICROWAVE.tooltipDescription(),
+ RecipeMaps.microwaveRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "MICROWAVE",
+ new Object[] { "LWC", "LMR", "LEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'L', OrePrefixes.plate.get(Materials.Lead) })
+ .getStackForm(1L));
+ ItemList.Machine_MV_Microwave.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MICROWAVE_OVEN_MV.ID,
+ "basicmachine.microwave.tier.02",
+ "Advanced Microwave",
+ 2,
+ MachineType.MICROWAVE.tooltipDescription(),
+ RecipeMaps.microwaveRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "MICROWAVE",
+ new Object[] { "LWC", "LMR", "LEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'L', OrePrefixes.plate.get(Materials.Lead) })
+ .getStackForm(1L));
+ ItemList.Machine_HV_Microwave.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MICROWAVE_OVEN_HV.ID,
+ "basicmachine.microwave.tier.03",
+ "Advanced Microwave II",
+ 3,
+ MachineType.MICROWAVE.tooltipDescription(),
+ RecipeMaps.microwaveRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "MICROWAVE",
+ new Object[] { "LWC", "LMR", "LEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'L', OrePrefixes.plate.get(Materials.Lead) })
+ .getStackForm(1L));
+ ItemList.Machine_EV_Microwave.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MICROWAVE_OVEN_EV.ID,
+ "basicmachine.microwave.tier.04",
+ "Advanced Microwave III",
+ 4,
+ MachineType.MICROWAVE.tooltipDescription(),
+ RecipeMaps.microwaveRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "MICROWAVE",
+ new Object[] { "LWC", "LMR", "LEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'L', OrePrefixes.plate.get(Materials.Lead) })
+ .getStackForm(1L));
+ ItemList.Machine_IV_Microwave.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MICROWAVE_OVEN_IV.ID,
+ "basicmachine.microwave.tier.05",
+ "Advanced Microwave IV",
+ 5,
+ MachineType.MICROWAVE.tooltipDescription(),
+ RecipeMaps.microwaveRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "MICROWAVE",
+ new Object[] { "LWC", "LMR", "LEC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.EMITTER, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'L', OrePrefixes.plate.get(Materials.Lead) })
+ .getStackForm(1L));
+ }
+
+ private static void registerMixer() {
+ ItemList.Machine_LV_Mixer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MIXER_LV.ID,
+ "basicmachine.mixer.tier.01",
+ "Basic Mixer",
+ 1,
+ MachineType.MIXER.tooltipDescription(),
+ RecipeMaps.mixerRecipes,
+ 6,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "MIXER",
+ new Object[] { "GRG", "GEG", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_MV_Mixer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MIXER_MV.ID,
+ "basicmachine.mixer.tier.02",
+ "Advanced Mixer",
+ 2,
+ MachineType.MIXER.tooltipDescription(),
+ RecipeMaps.mixerRecipes,
+ 6,
+ 1,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "MIXER",
+ new Object[] { "GRG", "GEG", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_HV_Mixer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MIXER_HV.ID,
+ "basicmachine.mixer.tier.03",
+ "Advanced Mixer II",
+ 3,
+ MachineType.MIXER.tooltipDescription(),
+ RecipeMaps.mixerRecipes,
+ 6,
+ 4,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "MIXER",
+ new Object[] { "GRG", "GEG", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_EV_Mixer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MIXER_EV.ID,
+ "basicmachine.mixer.tier.04",
+ "Advanced Mixer III",
+ 4,
+ MachineType.MIXER.tooltipDescription(),
+ RecipeMaps.mixerRecipes,
+ 9,
+ 4,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "MIXER",
+ new Object[] { "GRG", "GEG", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ ItemList.Machine_IV_Mixer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ MIXER_IV.ID,
+ "basicmachine.mixer.tier.05",
+ "Advanced Mixer IV",
+ 5,
+ MachineType.MIXER.tooltipDescription(),
+ RecipeMaps.mixerRecipes,
+ 9,
+ 4,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "MIXER",
+ new Object[] { "GRG", "GEG", aTextCableHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS }).getStackForm(1L));
+ }
+
+ private static void registerOreWasher() {
+ ItemList.Machine_LV_OreWasher.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ORE_WASHER_LV.ID,
+ "basicmachine.orewasher.tier.01",
+ "Basic Ore Washing Plant",
+ 1,
+ MachineType.ORE_WASHER.tooltipDescription(),
+ RecipeMaps.oreWasherRecipes,
+ 1,
+ 3,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ORE_WASHER",
+ new Object[] { "RGR", "CEC", aTextWireHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP }).getStackForm(1L));
+ ItemList.Machine_MV_OreWasher.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ORE_WASHER_MV.ID,
+ "basicmachine.orewasher.tier.02",
+ "Advanced Ore Washing Plant",
+ 2,
+ MachineType.ORE_WASHER.tooltipDescription(),
+ RecipeMaps.oreWasherRecipes,
+ 1,
+ 3,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ORE_WASHER",
+ new Object[] { "RGR", "CEC", aTextWireHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP }).getStackForm(1L));
+ ItemList.Machine_HV_OreWasher.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ORE_WASHER_HV.ID,
+ "basicmachine.orewasher.tier.03",
+ "Advanced Ore Washing Plant II",
+ 3,
+ MachineType.ORE_WASHER.tooltipDescription(),
+ RecipeMaps.oreWasherRecipes,
+ 1,
+ 3,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ORE_WASHER",
+ new Object[] { "RGR", "CEC", aTextWireHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP }).getStackForm(1L));
+ ItemList.Machine_EV_OreWasher.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ORE_WASHER_EV.ID,
+ "basicmachine.orewasher.tier.04",
+ "Advanced Ore Washing Plant III",
+ 4,
+ MachineType.ORE_WASHER.tooltipDescription(),
+ RecipeMaps.oreWasherRecipes,
+ 1,
+ 3,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ORE_WASHER",
+ new Object[] { "RGR", "CEC", aTextWireHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP }).getStackForm(1L));
+ ItemList.Machine_IV_OreWasher.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ ORE_WASHER_IV.ID,
+ "basicmachine.orewasher.tier.05",
+ "Repurposed Laundry-Washer I-360",
+ 5,
+ MachineType.ORE_WASHER.tooltipDescription(),
+ RecipeMaps.oreWasherRecipes,
+ 1,
+ 3,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "ORE_WASHER",
+ new Object[] { "RGR", "CEC", aTextWireHull, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROTOR, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP }).getStackForm(1L));
+ }
+
+ private static void registerOven() {
+ ItemList.Machine_LV_Oven.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ OVEN_LV.ID,
+ "basicmachine.e_oven.tier.01",
+ "Basic Electric Oven",
+ 1,
+ MachineType.OVEN.tooltipDescription(),
+ RecipeMaps.furnaceRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "ELECTRIC_OVEN",
+ new Object[] { "CEC", aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }).setProgressBarTextureName("E_Oven")
+ .getStackForm(1L));
+ ItemList.Machine_MV_Oven.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ OVEN_MV.ID,
+ "basicmachine.e_oven.tier.02",
+ "Advanced Electric Oven",
+ 2,
+ MachineType.OVEN.tooltipDescription(),
+ RecipeMaps.furnaceRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "ELECTRIC_OVEN",
+ new Object[] { "CEC", aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }).setProgressBarTextureName("E_Oven")
+ .getStackForm(1L));
+ ItemList.Machine_HV_Oven.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ OVEN_HV.ID,
+ "basicmachine.e_oven.tier.03",
+ "Advanced Electric Oven II",
+ 3,
+ MachineType.OVEN.tooltipDescription(),
+ RecipeMaps.furnaceRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "ELECTRIC_OVEN",
+ new Object[] { "CEC", aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }).setProgressBarTextureName("E_Oven")
+ .getStackForm(1L));
+ ItemList.Machine_EV_Oven.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ OVEN_EV.ID,
+ "basicmachine.e_oven.tier.04",
+ "Advanced Electric Oven III",
+ 4,
+ MachineType.OVEN.tooltipDescription(),
+ RecipeMaps.furnaceRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "ELECTRIC_OVEN",
+ new Object[] { "CEC", aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }).setProgressBarTextureName("E_Oven")
+ .getStackForm(1L));
+ ItemList.Machine_IV_Oven.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ OVEN_IV.ID,
+ "basicmachine.e_oven.tier.05",
+ "Advanced Electric Oven IV",
+ 5,
+ MachineType.OVEN.tooltipDescription(),
+ RecipeMaps.furnaceRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP,
+ SpecialEffects.NONE,
+ "ELECTRIC_OVEN",
+ new Object[] { "CEC", aTextCableHull, "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING }).setProgressBarTextureName("E_Oven")
+ .getStackForm(1L));
+ }
+
+ private static void registerPlasmaArcFurnace() {
+ ItemList.Machine_LV_PlasmaArcFurnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ PLASMA_ARC_FURNACE_LV.ID,
+ "basicmachine.plasmaarcfurnace.tier.01",
+ "Basic Plasma Arc Furnace",
+ 1,
+ MachineType.PLASMA_ARC_FURNACE.tooltipDescription(),
+ RecipeMaps.plasmaArcFurnaceRecipes,
+ 1,
+ 4,
+ true,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "PLASMA_ARC_FURNACE",
+ new Object[] { "WGW", aTextCableHull, "TPT", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'T',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'G', OrePrefixes.cell.get(Materials.Graphite) })
+ .getStackForm(1L));
+ ItemList.Machine_MV_PlasmaArcFurnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ PLASMA_ARC_FURNACE_MV.ID,
+ "basicmachine.plasmaarcfurnace.tier.02",
+ "Advanced Plasma Arc Furnace",
+ 2,
+ MachineType.PLASMA_ARC_FURNACE.tooltipDescription(),
+ RecipeMaps.plasmaArcFurnaceRecipes,
+ 1,
+ 4,
+ true,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "PLASMA_ARC_FURNACE",
+ new Object[] { "WGW", aTextCableHull, "TPT", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'T',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'G', OrePrefixes.cell.get(Materials.Graphite) })
+ .getStackForm(1L));
+ ItemList.Machine_HV_PlasmaArcFurnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ PLASMA_ARC_FURNACE_HV.ID,
+ "basicmachine.plasmaarcfurnace.tier.03",
+ "Advanced Plasma Arc Furnace II",
+ 3,
+ MachineType.PLASMA_ARC_FURNACE.tooltipDescription(),
+ RecipeMaps.plasmaArcFurnaceRecipes,
+ 1,
+ 4,
+ true,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "PLASMA_ARC_FURNACE",
+ new Object[] { "WGW", aTextCableHull, "TPT", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'T',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'G', OrePrefixes.cell.get(Materials.Graphite) })
+ .getStackForm(1L));
+ ItemList.Machine_EV_PlasmaArcFurnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ PLASMA_ARC_FURNACE_EV.ID,
+ "basicmachine.plasmaarcfurnace.tier.04",
+ "Advanced Plasma Arc Furnace III",
+ 4,
+ MachineType.PLASMA_ARC_FURNACE.tooltipDescription(),
+ RecipeMaps.plasmaArcFurnaceRecipes,
+ 1,
+ 9,
+ true,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "PLASMA_ARC_FURNACE",
+ new Object[] { "WGW", aTextCableHull, "TPT", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'T',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'G', OrePrefixes.cell.get(Materials.Graphite) })
+ .getStackForm(1L));
+ ItemList.Machine_IV_PlasmaArcFurnace.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ PLASMA_ARC_FURNACE_IV.ID,
+ "basicmachine.plasmaarcfurnace.tier.05",
+ "Advanced Plasma Arc Furnace IV",
+ 5,
+ MachineType.PLASMA_ARC_FURNACE.tooltipDescription(),
+ RecipeMaps.plasmaArcFurnaceRecipes,
+ 1,
+ 9,
+ true,
+ SoundResource.IC2_MACHINES_INDUCTION_LOOP,
+ SpecialEffects.NONE,
+ "PLASMA_ARC_FURNACE",
+ new Object[] { "WGW", aTextCableHull, "TPT", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PLATE, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.BETTER_CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE4, 'T',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'G', OrePrefixes.cell.get(Materials.Graphite) })
+ .getStackForm(1L));
+ }
+
+ private static void registerPolarizer() {
+ ItemList.Machine_LV_Polarizer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ POLARIZER_LV.ID,
+ "basicmachine.polarizer.tier.01",
+ "Basic Polarizer",
+ 1,
+ MachineType.POLARIZER.tooltipDescription(),
+ RecipeMaps.polarizerRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "POLARIZER",
+ new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_MV_Polarizer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ POLARIZER_MV.ID,
+ "basicmachine.polarizer.tier.02",
+ "Advanced Polarizer",
+ 2,
+ MachineType.POLARIZER.tooltipDescription(),
+ RecipeMaps.polarizerRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "POLARIZER",
+ new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_HV_Polarizer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ POLARIZER_HV.ID,
+ "basicmachine.polarizer.tier.03",
+ "Advanced Polarizer II",
+ 3,
+ MachineType.POLARIZER.tooltipDescription(),
+ RecipeMaps.polarizerRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "POLARIZER",
+ new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_EV_Polarizer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ POLARIZER_EV.ID,
+ "basicmachine.polarizer.tier.04",
+ "Advanced Polarizer III",
+ 4,
+ MachineType.POLARIZER.tooltipDescription(),
+ RecipeMaps.polarizerRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "POLARIZER",
+ new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_IV_Polarizer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ POLARIZER_IV.ID,
+ "basicmachine.polarizer.tier.05",
+ "Advanced Polarizer IV",
+ 5,
+ MachineType.POLARIZER.tooltipDescription(),
+ RecipeMaps.polarizerRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_MAGNETIZER_LOOP,
+ SpecialEffects.NONE,
+ "POLARIZER",
+ new Object[] { "ZSZ", aTextWireHull, "ZSZ", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'S',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.STICK_ELECTROMAGNETIC, 'Z',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_ELECTRIC, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+
+ }
+
+ private static void registerPrinter() {
+ ItemList.Machine_LV_Printer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ PRINTER_LV.ID,
+ "basicmachine.printer.tier.01",
+ "Basic Printer",
+ 1,
+ MachineType.PRINTER.tooltipDescription(),
+ RecipeMaps.printerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.TOP_SMOKE,
+ "PRINTER",
+ new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_MV_Printer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ PRINTER_MV.ID,
+ "basicmachine.printer.tier.02",
+ "Advanced Printer",
+ 2,
+ MachineType.PRINTER.tooltipDescription(),
+ RecipeMaps.printerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.TOP_SMOKE,
+ "PRINTER",
+ new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_HV_Printer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ PRINTER_HV.ID,
+ "basicmachine.printer.tier.03",
+ "Advanced Printer II",
+ 3,
+ MachineType.PRINTER.tooltipDescription(),
+ RecipeMaps.printerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.TOP_SMOKE,
+ "PRINTER",
+ new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_EV_Printer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ PRINTER_EV.ID,
+ "basicmachine.printer.tier.04",
+ "Advanced Printer III",
+ 4,
+ MachineType.PRINTER.tooltipDescription(),
+ RecipeMaps.printerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.TOP_SMOKE,
+ "PRINTER",
+ new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_IV_Printer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ PRINTER_IV.ID,
+ "basicmachine.printer.tier.05",
+ "Advanced Printer IV",
+ 5,
+ MachineType.PRINTER.tooltipDescription(),
+ RecipeMaps.printerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.TOP_SMOKE,
+ "PRINTER",
+ new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_LuV_Printer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ PRINTER_LuV.ID,
+ "basicmachine.printer.tier.06",
+ "Advanced Printer V",
+ 6,
+ MachineType.PRINTER.tooltipDescription(),
+ RecipeMaps.printerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.TOP_SMOKE,
+ "PRINTER",
+ new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_ZPM_Printer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ PRINTER_ZPM.ID,
+ "basicmachine.printer.tier.07",
+ "Advanced Printer VI",
+ 7,
+ MachineType.PRINTER.tooltipDescription(),
+ RecipeMaps.printerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.TOP_SMOKE,
+ "PRINTER",
+ new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_UV_Printer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ PRINTER_UV.ID,
+ "basicmachine.printer.tier.08",
+ "Advanced Printer VII",
+ 8,
+ MachineType.PRINTER.tooltipDescription(),
+ RecipeMaps.printerRecipes,
+ 1,
+ 1,
+ true,
+ SoundResource.IC2_MACHINES_COMPRESSOR_OP,
+ SpecialEffects.TOP_SMOKE,
+ "PRINTER",
+ new Object[] { aTextMotorWire, aTextCableHull, "WEW", 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ }
+
+ private static void registerRecycler() {
+ ItemList.Machine_LV_Recycler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ RECYCLER_LV.ID,
+ "basicmachine.recycler.tier.01",
+ "Basic Recycler",
+ 1,
+ MachineType.RECYCLER.tooltipDescription(),
+ RecipeMaps.recyclerRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_RECYCLER_OP,
+ SpecialEffects.NONE,
+ "RECYCLER",
+ new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) })
+ .getStackForm(1L));
+ ItemList.Machine_MV_Recycler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ RECYCLER_MV.ID,
+ "basicmachine.recycler.tier.02",
+ "Advanced Recycler",
+ 2,
+ MachineType.RECYCLER.tooltipDescription(),
+ RecipeMaps.recyclerRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_RECYCLER_OP,
+ SpecialEffects.NONE,
+ "RECYCLER",
+ new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) })
+ .getStackForm(1L));
+ ItemList.Machine_HV_Recycler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ RECYCLER_HV.ID,
+ "basicmachine.recycler.tier.03",
+ "Advanced Recycler II",
+ 3,
+ MachineType.RECYCLER.tooltipDescription(),
+ RecipeMaps.recyclerRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_RECYCLER_OP,
+ SpecialEffects.NONE,
+ "RECYCLER",
+ new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) })
+ .getStackForm(1L));
+ ItemList.Machine_EV_Recycler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ RECYCLER_EV.ID,
+ "basicmachine.recycler.tier.04",
+ "Advanced Recycler III",
+ 4,
+ MachineType.RECYCLER.tooltipDescription(),
+ RecipeMaps.recyclerRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_RECYCLER_OP,
+ SpecialEffects.NONE,
+ "RECYCLER",
+ new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) })
+ .getStackForm(1L));
+ ItemList.Machine_IV_Recycler.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ RECYCLER_IV.ID,
+ "basicmachine.recycler.tier.05",
+ "The Oblitterator",
+ 5,
+ MachineType.RECYCLER.tooltipDescription(),
+ RecipeMaps.recyclerRecipes,
+ 1,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_RECYCLER_OP,
+ SpecialEffects.NONE,
+ "RECYCLER",
+ new Object[] { "GCG", aTextPlateMotor, aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G', OrePrefixes.dust.get(Materials.Glowstone) })
+ .getStackForm(1L));
+ }
+
+ private static void registerSifter() {
+ ItemList.Machine_LV_Sifter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ SIFTER_LV.ID,
+ "basicmachine.sifter.tier.01",
+ "Basic Sifting Machine",
+ 1,
+ MachineType.SIFTER.tooltipDescription(),
+ RecipeMaps.sifterRecipes,
+ 1,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SIFTER",
+ new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_MV_Sifter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ SIFTER_MV.ID,
+ "basicmachine.sifter.tier.02",
+ "Advanced Sifting Machine",
+ 2,
+ MachineType.SIFTER.tooltipDescription(),
+ RecipeMaps.sifterRecipes,
+ 1,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SIFTER",
+ new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_HV_Sifter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ SIFTER_HV.ID,
+ "basicmachine.sifter.tier.03",
+ "Advanced Sifting Machine II",
+ 3,
+ MachineType.SIFTER.tooltipDescription(),
+ RecipeMaps.sifterRecipes,
+ 1,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SIFTER",
+ new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_EV_Sifter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ SIFTER_EV.ID,
+ "basicmachine.sifter.tier.04",
+ "Advanced Sifting Machine III",
+ 4,
+ MachineType.SIFTER.tooltipDescription(),
+ RecipeMaps.sifterRecipes,
+ 1,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SIFTER",
+ new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_IV_Sifter.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ SIFTER_IV.ID,
+ "basicmachine.sifter.tier.05",
+ "Advanced Sifting Machine IV",
+ 5,
+ MachineType.SIFTER.tooltipDescription(),
+ RecipeMaps.sifterRecipes,
+ 1,
+ 9,
+ true,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SIFTER",
+ new Object[] { "WFW", aTextPlateMotor, "CFC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'F', OreDictNames.craftingFilter, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ }
+
+ private static void registerSlicer() {
+ ItemList.Machine_LV_Slicer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ SLICER_LV.ID,
+ "basicmachine.slicer.tier.01",
+ "Basic Slicing Machine",
+ 1,
+ MachineType.SLICER.tooltipDescription(),
+ RecipeMaps.slicerRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SLICER",
+ new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_MV_Slicer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ SLICER_MV.ID,
+ "basicmachine.slicer.tier.02",
+ "Advanced Slicing Machine",
+ 2,
+ MachineType.SLICER.tooltipDescription(),
+ RecipeMaps.slicerRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SLICER",
+ new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_HV_Slicer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ SLICER_HV.ID,
+ "basicmachine.slicer.tier.03",
+ "Advanced Slicing Machine II",
+ 3,
+ MachineType.SLICER.tooltipDescription(),
+ RecipeMaps.slicerRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SLICER",
+ new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_EV_Slicer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ SLICER_EV.ID,
+ "basicmachine.slicer.tier.04",
+ "Advanced Slicing Machine III",
+ 4,
+ MachineType.SLICER.tooltipDescription(),
+ RecipeMaps.slicerRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SLICER",
+ new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_IV_Slicer.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ SLICER_IV.ID,
+ "basicmachine.slicer.tier.05",
+ "Advanced Slicing Machine IV",
+ 5,
+ MachineType.SLICER.tooltipDescription(),
+ RecipeMaps.slicerRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "SLICER",
+ new Object[] { aTextWireCoil, "PMV", aTextWireCoil, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PISTON, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ }
+
+ private static void registerThermalCentrifuge() {
+ ItemList.Machine_LV_ThermalCentrifuge.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ THERMAL_CENTRIFUGE_LV.ID,
+ "basicmachine.thermalcentrifuge.tier.01",
+ "Basic Thermal Centrifuge",
+ 1,
+ MachineType.THERMAL_CENTRIFUGE.tooltipDescription(),
+ RecipeMaps.thermalCentrifugeRecipes,
+ 1,
+ 3,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "THERMAL_CENTRIFUGE",
+ new Object[] { "CEC", "OMO", "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ ItemList.Machine_MV_ThermalCentrifuge.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ THERMAL_CENTRIFUGE_MV.ID,
+ "basicmachine.thermalcentrifuge.tier.02",
+ "Advanced Thermal Centrifuge",
+ 2,
+ MachineType.THERMAL_CENTRIFUGE.tooltipDescription(),
+ RecipeMaps.thermalCentrifugeRecipes,
+ 1,
+ 3,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "THERMAL_CENTRIFUGE",
+ new Object[] { "CEC", "OMO", "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ ItemList.Machine_HV_ThermalCentrifuge.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ THERMAL_CENTRIFUGE_HV.ID,
+ "basicmachine.thermalcentrifuge.tier.03",
+ "Advanced Thermal Centrifuge II",
+ 3,
+ MachineType.THERMAL_CENTRIFUGE.tooltipDescription(),
+ RecipeMaps.thermalCentrifugeRecipes,
+ 1,
+ 3,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "THERMAL_CENTRIFUGE",
+ new Object[] { "CEC", "OMO", "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ ItemList.Machine_EV_ThermalCentrifuge.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ THERMAL_CENTRIFUGE_EV.ID,
+ "basicmachine.thermalcentrifuge.tier.04",
+ "Advanced Thermal Centrifuge III",
+ 4,
+ MachineType.THERMAL_CENTRIFUGE.tooltipDescription(),
+ RecipeMaps.thermalCentrifugeRecipes,
+ 1,
+ 3,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "THERMAL_CENTRIFUGE",
+ new Object[] { "CEC", "OMO", "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ ItemList.Machine_IV_ThermalCentrifuge.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ THERMAL_CENTRIFUGE_IV.ID,
+ "basicmachine.thermalcentrifuge.tier.05",
+ "Blaze Sweatshop T-6350",
+ 5,
+ MachineType.THERMAL_CENTRIFUGE.tooltipDescription(),
+ RecipeMaps.thermalCentrifugeRecipes,
+ 1,
+ 3,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "THERMAL_CENTRIFUGE",
+ new Object[] { "CEC", "OMO", "WEW", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'O',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.COIL_HEATING_DOUBLE }).getStackForm(1L));
+ }
+
+ private static void registerUnpackager() {
+ ItemList.Machine_LV_Unboxinator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ UNPACKAGER_LV.ID,
+ "basicmachine.unboxinator.tier.01",
+ "Basic Unpackager",
+ 1,
+ MachineType.UNPACKAGER.tooltipDescription(),
+ RecipeMaps.unpackagerRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "UNBOXINATOR",
+ new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest })
+ .getStackForm(1L));
+ ItemList.Machine_MV_Unboxinator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ UNPACKAGER_MV.ID,
+ "basicmachine.unboxinator.tier.02",
+ "Advanced Unpackager",
+ 2,
+ MachineType.UNPACKAGER.tooltipDescription(),
+ RecipeMaps.unpackagerRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "UNBOXINATOR",
+ new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest })
+ .getStackForm(1L));
+ ItemList.Machine_HV_Unboxinator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ UNPACKAGER_HV.ID,
+ "basicmachine.unboxinator.tier.03",
+ "Advanced Unpackager II",
+ 3,
+ MachineType.UNPACKAGER.tooltipDescription(),
+ RecipeMaps.unpackagerRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "UNBOXINATOR",
+ new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest })
+ .getStackForm(1L));
+ ItemList.Machine_EV_Unboxinator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ UNPACKAGER_EV.ID,
+ "basicmachine.unboxinator.tier.04",
+ "Advanced Unpackager III",
+ 4,
+ MachineType.UNPACKAGER.tooltipDescription(),
+ RecipeMaps.unpackagerRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "UNBOXINATOR",
+ new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest })
+ .getStackForm(1L));
+ ItemList.Machine_IV_Unboxinator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ UNPACKAGER_IV.ID,
+ "basicmachine.unboxinator.tier.05",
+ "Unboxinator",
+ 5,
+ MachineType.UNPACKAGER.tooltipDescription(),
+ RecipeMaps.unpackagerRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "UNBOXINATOR",
+ new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest })
+ .getStackForm(1L));
+ ItemList.Machine_LuV_Unboxinator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ UNPACKAGER_LuV.ID,
+ "basicmachine.unboxinator.tier.06",
+ "Unboxinator",
+ 6,
+ MachineType.UNPACKAGER.tooltipDescription(),
+ RecipeMaps.unpackagerRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "UNBOXINATOR",
+ new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest })
+ .getStackForm(1L));
+ ItemList.Machine_ZPM_Unboxinator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ UNPACKAGER_ZPM.ID,
+ "basicmachine.unboxinator.tier.07",
+ "Unboxinator",
+ 7,
+ MachineType.UNPACKAGER.tooltipDescription(),
+ RecipeMaps.unpackagerRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "UNBOXINATOR",
+ new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest })
+ .getStackForm(1L));
+ ItemList.Machine_UV_Unboxinator.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ UNPACKAGER_UV.ID,
+ "basicmachine.unboxinator.tier.08",
+ "Unboxinator",
+ 8,
+ MachineType.UNPACKAGER.tooltipDescription(),
+ RecipeMaps.unpackagerRecipes,
+ 1,
+ 2,
+ false,
+ SoundResource.NONE,
+ SpecialEffects.NONE,
+ "UNBOXINATOR",
+ new Object[] { "BCB", "VMR", aTextWireCoil, 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'R',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.ROBOT_ARM, 'V',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CONVEYOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'B', OreDictNames.craftingChest })
+ .getStackForm(1L));
+ }
+
+ private static void registerWiremill() {
+ ItemList.Machine_LV_Wiremill.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ WIREMILL_LV.ID,
+ "basicmachine.wiremill.tier.01",
+ "Basic Wiremill",
+ 1,
+ MachineType.WIREMILL.tooltipDescription(),
+ RecipeMaps.wiremillRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_RECYCLER_OP,
+ SpecialEffects.NONE,
+ "WIREMILL",
+ new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_MV_Wiremill.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ WIREMILL_MV.ID,
+ "basicmachine.wiremill.tier.02",
+ "Advanced Wiremill",
+ 2,
+ MachineType.WIREMILL.tooltipDescription(),
+ RecipeMaps.wiremillRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_RECYCLER_OP,
+ SpecialEffects.NONE,
+ "WIREMILL",
+ new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_HV_Wiremill.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ WIREMILL_HV.ID,
+ "basicmachine.wiremill.tier.03",
+ "Advanced Wiremill II",
+ 3,
+ MachineType.WIREMILL.tooltipDescription(),
+ RecipeMaps.wiremillRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_RECYCLER_OP,
+ SpecialEffects.NONE,
+ "WIREMILL",
+ new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_EV_Wiremill.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ WIREMILL_EV.ID,
+ "basicmachine.wiremill.tier.04",
+ "Advanced Wiremill III",
+ 4,
+ MachineType.WIREMILL.tooltipDescription(),
+ RecipeMaps.wiremillRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_RECYCLER_OP,
+ SpecialEffects.NONE,
+ "WIREMILL",
+ new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ ItemList.Machine_IV_Wiremill.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ WIREMILL_IV.ID,
+ "basicmachine.wiremill.tier.05",
+ "Advanced Wiremill IV",
+ 5,
+ MachineType.WIREMILL.tooltipDescription(),
+ RecipeMaps.wiremillRecipes,
+ 2,
+ 1,
+ false,
+ SoundResource.IC2_MACHINES_RECYCLER_OP,
+ SpecialEffects.NONE,
+ "WIREMILL",
+ new Object[] { aTextMotorWire, aTextCableHull, aTextMotorWire, 'M',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'E',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.MOTOR, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE }).getStackForm(1L));
+ }
+
+ private static void registerShapedCraftingRecipes() {
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Pipe_Polytetrafluoroethylene.get(1L),
+ bits,
+ new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Polytetrafluoroethylene), 'F',
+ OrePrefixes.frameGt.get(Materials.Polytetrafluoroethylene), 'I',
+ OrePrefixes.pipeMedium.get(Materials.Polytetrafluoroethylene) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Pipe_Polybenzimidazole.get(1L),
+ bits,
+ new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Polybenzimidazole), 'F',
+ OrePrefixes.frameGt.get(Materials.Polybenzimidazole), 'I',
+ OrePrefixes.pipeMedium.get(Materials.Polybenzimidazole) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_ULV.get(1L),
+ bits,
+ new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P',
+ OrePrefixes.plate.get(Materials.WroughtIron) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_LV.get(1L),
+ bits,
+ new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_MV.get(1L),
+ bits,
+ new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_HV.get(1L),
+ bits,
+ new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_EV.get(1L),
+ bits,
+ new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Titanium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_IV.get(1L),
+ bits,
+ new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P',
+ OrePrefixes.plate.get(Materials.TungstenSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_LuV.get(1L),
+ bits,
+ new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P',
+ OrePrefixes.plate.get(ExternalMaterials.getRhodiumPlatedPalladium()) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_ZPM.get(1L),
+ bits,
+ new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Iridium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_UV.get(1L),
+ bits,
+ new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P', OrePrefixes.plate.get(Materials.Osmium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_MAX.get(1L),
+ bits,
+ new Object[] { aTextPlate, aTextPlateWrench, aTextPlate, 'P',
+ OrePrefixes.plate.get(Materials.Neutronium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_BronzePlatedBricks.get(1L),
+ bits,
+ new Object[] { "PhP", "PBP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Bronze), 'B',
+ new ItemStack(Blocks.brick_block, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_SolidSteel.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Steel), 'F',
+ OrePrefixes.frameGt.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_StableTitanium.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Titanium), 'F',
+ OrePrefixes.frameGt.get(Materials.Titanium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_HeatProof.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Invar), 'F',
+ OrePrefixes.frameGt.get(Materials.Invar) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_FrostProof.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Aluminium), 'F',
+ OrePrefixes.frameGt.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_CleanStainlessSteel.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.StainlessSteel), 'F',
+ OrePrefixes.frameGt.get(Materials.StainlessSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_RobustTungstenSteel.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'F',
+ OrePrefixes.frameGt.get(Materials.TungstenSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_MiningOsmiridium.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Osmiridium), 'F',
+ OrePrefixes.frameGt.get(Materials.Osmiridium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_MiningNeutronium.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Neutronium), 'F',
+ OrePrefixes.frameGt.get(Materials.Neutronium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_MiningBlackPlutonium.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.BlackPlutonium), 'F',
+ OrePrefixes.frameGt.get(Materials.BlackPlutonium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Turbine.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Magnalium), 'F',
+ OrePrefixes.frameGt.get(Materials.BlueSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Turbine1.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.StainlessSteel), 'F',
+ ItemList.Casing_Turbine });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Turbine2.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Titanium), 'F',
+ ItemList.Casing_Turbine });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Turbine3.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'F',
+ ItemList.Casing_Turbine });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_TurbineGasAdvanced.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.HSSS), 'F',
+ ItemList.Casing_Turbine });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Pipe_Bronze.get(1L),
+ bits,
+ new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Bronze), 'F',
+ OrePrefixes.frameGt.get(Materials.Bronze), 'I', OrePrefixes.pipeMedium.get(Materials.Bronze) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Pipe_Steel.get(1L),
+ bits,
+ new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Steel), 'F',
+ OrePrefixes.frameGt.get(Materials.Steel), 'I', OrePrefixes.pipeMedium.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Pipe_Titanium.get(1L),
+ bits,
+ new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.Titanium), 'F',
+ OrePrefixes.frameGt.get(Materials.Titanium), 'I', OrePrefixes.pipeMedium.get(Materials.Titanium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Pipe_TungstenSteel.get(1L),
+ bits,
+ new Object[] { "PIP", "IFI", "PIP", 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'F',
+ OrePrefixes.frameGt.get(Materials.TungstenSteel), 'I',
+ OrePrefixes.pipeMedium.get(Materials.TungstenSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Gearbox_Bronze.get(1L),
+ bits,
+ new Object[] { "PhP", "GFG", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Bronze), 'F',
+ OrePrefixes.frameGt.get(Materials.Bronze), 'G', OrePrefixes.gearGt.get(Materials.Bronze) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Gearbox_Steel.get(1L),
+ bits,
+ new Object[] { "PhP", "GFG", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Steel), 'F',
+ OrePrefixes.frameGt.get(Materials.Steel), 'G', OrePrefixes.gearGt.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Gearbox_Titanium.get(1L),
+ bits,
+ new Object[] { "PhP", "GFG", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Steel), 'F',
+ OrePrefixes.frameGt.get(Materials.Titanium), 'G', OrePrefixes.gearGt.get(Materials.Titanium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Gearbox_TungstenSteel.get(1L),
+ bits,
+ new Object[] { "PhP", "GFG", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Steel), 'F',
+ OrePrefixes.frameGt.get(Materials.TungstenSteel), 'G', ItemList.Robot_Arm_IV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Grate.get(1L),
+ bits,
+ new Object[] { "PVP", "PFP", aTextPlateMotor, 'P', new ItemStack(Blocks.iron_bars, 1), 'F',
+ OrePrefixes.frameGt.get(Materials.Steel), 'M', ItemList.Electric_Motor_MV, 'V',
+ OrePrefixes.rotor.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Assembler.get(1L),
+ bits,
+ new Object[] { "PVP", "PFP", aTextPlateMotor, 'P', OrePrefixes.circuit.get(Materials.Ultimate), 'F',
+ OrePrefixes.frameGt.get(Materials.TungstenSteel), 'M', ItemList.Electric_Motor_IV, 'V',
+ OrePrefixes.circuit.get(Materials.Master) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Firebox_Bronze.get(1L),
+ bits,
+ new Object[] { "PSP", "SFS", "PSP", 'P', OrePrefixes.plate.get(Materials.Bronze), 'F',
+ OrePrefixes.frameGt.get(Materials.Bronze), 'S', OrePrefixes.stick.get(Materials.Bronze) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Firebox_Steel.get(1L),
+ bits,
+ new Object[] { "PSP", "SFS", "PSP", 'P', OrePrefixes.plate.get(Materials.Steel), 'F',
+ OrePrefixes.frameGt.get(Materials.Steel), 'S', OrePrefixes.stick.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Firebox_Titanium.get(1L),
+ bits,
+ new Object[] { "PSP", "SFS", "PSP", 'P', OrePrefixes.plate.get(Materials.Titanium), 'F',
+ OrePrefixes.frameGt.get(Materials.Titanium), 'S', OrePrefixes.stick.get(Materials.Titanium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Firebox_TungstenSteel.get(1L),
+ bits,
+ new Object[] { "PSP", "SFS", "PSP", 'P', OrePrefixes.plate.get(Materials.TungstenSteel), 'F',
+ OrePrefixes.frameGt.get(Materials.TungstenSteel), 'S',
+ OrePrefixes.stick.get(Materials.TungstenSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Stripes_A.get(1L),
+ bits,
+ new Object[] { "Y ", " M ", " B", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B',
+ Dyes.dyeBlack });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Stripes_B.get(1L),
+ bits,
+ new Object[] { " Y", " M ", "B ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B',
+ Dyes.dyeBlack });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_RadioactiveHazard.get(1L),
+ bits,
+ new Object[] { " YB", " M ", " ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B',
+ Dyes.dyeBlack });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_BioHazard.get(1L),
+ bits,
+ new Object[] { " Y ", " MB", " ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B',
+ Dyes.dyeBlack });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_ExplosionHazard.get(1L),
+ bits,
+ new Object[] { " Y ", " M ", " B", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B',
+ Dyes.dyeBlack });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_FireHazard.get(1L),
+ bits,
+ new Object[] { " Y ", " M ", " B ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B',
+ Dyes.dyeBlack });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_AcidHazard.get(1L),
+ bits,
+ new Object[] { " Y ", " M ", "B ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B',
+ Dyes.dyeBlack });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_MagicHazard.get(1L),
+ bits,
+ new Object[] { " Y ", "BM ", " ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B',
+ Dyes.dyeBlack });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_FrostHazard.get(1L),
+ bits,
+ new Object[] { "BY ", " M ", " ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B',
+ Dyes.dyeBlack });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_NoiseHazard.get(1L),
+ bits,
+ new Object[] { " ", " M ", "BY ", 'M', ItemList.Casing_SolidSteel, 'Y', Dyes.dyeYellow, 'B',
+ Dyes.dyeBlack });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Advanced_Iridium.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P', OrePrefixes.plate.get(Materials.Iridium), 'F',
+ OrePrefixes.frameGt.get(Materials.Iridium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Bricked_BlastFurnace.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "BFB", "FwF", "BFB", 'B', ItemList.Casing_Firebricks, 'F',
+ OreDictNames.craftingIronFurnace });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_Bronze.get(1L),
+ bits,
+ new Object[] { aTextPlate, "PhP", aTextPlate, 'P', OrePrefixes.plate.get(Materials.Bronze) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_Bronze_Bricks.get(1L),
+ bits,
+ new Object[] { aTextPlate, "PhP", "BBB", 'P', OrePrefixes.plate.get(Materials.Bronze), 'B',
+ new ItemStack(Blocks.brick_block, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_HP.get(1L),
+ bits,
+ new Object[] { aTextPlate, "PhP", aTextPlate, 'P', OrePrefixes.plate.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_HP_Bricks.get(1L),
+ bits,
+ new Object[] { aTextPlate, "PhP", "BBB", 'P', OrePrefixes.plate.get(Materials.WroughtIron), 'B',
+ new ItemStack(Blocks.brick_block, 1) });
+
+ // hull crafting recipes. (They can't be used for recycling as that would create an exploit loop with the
+ // assembler recipes.)
+ if (GT_Mod.gregtechproxy.mHardMachineCasings) {
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_ULV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_ULV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Lead), 'H', OrePrefixes.plate.get(Materials.WroughtIron), 'P',
+ OrePrefixes.plate.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_LV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_LV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Tin), 'H', OrePrefixes.plate.get(Materials.Steel), 'P',
+ OrePrefixes.plate.get(Materials.WroughtIron) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_MV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_MV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Copper), 'H', OrePrefixes.plate.get(Materials.Aluminium), 'P',
+ OrePrefixes.plate.get(Materials.WroughtIron) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_HV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_HV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Gold), 'H', OrePrefixes.plate.get(Materials.StainlessSteel),
+ 'P', OrePrefixes.plate.get(Materials.Plastic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_EV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_EV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Aluminium), 'H', OrePrefixes.plate.get(Materials.Titanium), 'P',
+ OrePrefixes.plate.get(Materials.Plastic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_IV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_IV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Tungsten), 'H', OrePrefixes.plate.get(Materials.TungstenSteel),
+ 'P', OrePrefixes.plate.get(Materials.Polytetrafluoroethylene) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_LuV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_LuV, 'C',
+ OrePrefixes.cableGt01.get(Materials.VanadiumGallium), 'H',
+ OrePrefixes.plate.get(ExternalMaterials.getRhodiumPlatedPalladium()), 'P',
+ OrePrefixes.plate.get(Materials.Polytetrafluoroethylene) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_ZPM.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_ZPM, 'C',
+ OrePrefixes.cableGt01.get(Materials.Naquadah), 'H', OrePrefixes.plate.get(Materials.Iridium), 'P',
+ OrePrefixes.plate.get(Materials.Polybenzimidazole) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_UV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_UV, 'C',
+ OrePrefixes.wireGt04.get(Materials.NaquadahAlloy), 'H', OrePrefixes.plate.get(Materials.Osmium),
+ 'P', OrePrefixes.plate.get(Materials.Polybenzimidazole) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_MAX.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PHP", aTextCableHull, 'M', ItemList.Casing_MAX, 'C',
+ OrePrefixes.wireGt04.get(Materials.SuperconductorUV), 'H',
+ OrePrefixes.plate.get(Materials.Neutronium), 'P',
+ OrePrefixes.plate.get(Materials.Polybenzimidazole) });
+ } else {
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_ULV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { aTextCableHull, 'M', ItemList.Casing_ULV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Lead) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_LV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { aTextCableHull, 'M', ItemList.Casing_LV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_MV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { aTextCableHull, 'M', ItemList.Casing_MV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Copper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_HV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { aTextCableHull, 'M', ItemList.Casing_HV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_EV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { aTextCableHull, 'M', ItemList.Casing_EV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_IV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { aTextCableHull, 'M', ItemList.Casing_IV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Tungsten) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_LuV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { aTextCableHull, 'M', ItemList.Casing_LuV, 'C',
+ OrePrefixes.cableGt01.get(Materials.VanadiumGallium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_ZPM.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { aTextCableHull, 'M', ItemList.Casing_ZPM, 'C',
+ OrePrefixes.cableGt01.get(Materials.Naquadah) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_UV.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { aTextCableHull, 'M', ItemList.Casing_UV, 'C',
+ OrePrefixes.wireGt04.get(Materials.NaquadahAlloy) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hull_MAX.get(1L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { aTextCableHull, 'M', ItemList.Casing_MAX, 'C',
+ OrePrefixes.wireGt04.get(Materials.SuperconductorUV) });
+ }
+ // hull recycling data
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hull_ULV.get(1L),
+ ItemList.Casing_ULV.get(1),
+ OrePrefixes.cableGt01.get(Materials.Lead),
+ OrePrefixes.cableGt01.get(Materials.Lead));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hull_LV.get(1L),
+ ItemList.Casing_LV.get(1),
+ OrePrefixes.cableGt01.get(Materials.Tin),
+ OrePrefixes.cableGt01.get(Materials.Tin));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hull_MV.get(1L),
+ ItemList.Casing_MV.get(1),
+ OrePrefixes.cableGt01.get(Materials.AnyCopper),
+ OrePrefixes.cableGt01.get(Materials.AnyCopper));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hull_HV.get(1L),
+ ItemList.Casing_HV.get(1),
+ OrePrefixes.cableGt01.get(Materials.Gold),
+ OrePrefixes.cableGt01.get(Materials.Gold));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hull_EV.get(1L),
+ ItemList.Casing_EV.get(1),
+ OrePrefixes.cableGt01.get(Materials.Aluminium),
+ OrePrefixes.cableGt01.get(Materials.Aluminium));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hull_IV.get(1L),
+ ItemList.Casing_IV.get(1),
+ OrePrefixes.cableGt01.get(Materials.Tungsten),
+ OrePrefixes.cableGt01.get(Materials.Tungsten));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hull_LuV.get(1L),
+ ItemList.Casing_LuV.get(1),
+ OrePrefixes.cableGt01.get(Materials.VanadiumGallium),
+ OrePrefixes.cableGt01.get(Materials.VanadiumGallium));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hull_ZPM.get(1L),
+ ItemList.Casing_ZPM.get(1),
+ OrePrefixes.cableGt02.get(Materials.Naquadah),
+ OrePrefixes.cableGt02.get(Materials.Naquadah));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hull_UV.get(1L),
+ ItemList.Casing_UV.get(1),
+ OrePrefixes.cableGt04.get(Materials.NaquadahAlloy),
+ OrePrefixes.cableGt04.get(Materials.NaquadahAlloy));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hull_MAX.get(1L),
+ ItemList.Casing_MAX.get(1),
+ OrePrefixes.cableGt04.get(Materials.SuperconductorUV),
+ OrePrefixes.cableGt04.get(Materials.SuperconductorUV));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Transformer_LV_ULV.get(1L),
+ bitsd,
+ new Object[] { " BB", "CM ", " BB", 'M', ItemList.Hull_ULV, 'C', OrePrefixes.cableGt01.get(Materials.Tin),
+ 'B', OrePrefixes.cableGt01.get(Materials.Lead) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Transformer_MV_LV.get(1L),
+ bitsd,
+ new Object[] { " BB", "CM ", " BB", 'M', ItemList.Hull_LV, 'C',
+ OrePrefixes.cableGt01.get(Materials.AnyCopper), 'B', OrePrefixes.cableGt01.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Transformer_HV_MV.get(1L),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_MV, 'C', OrePrefixes.cableGt01.get(Materials.Gold),
+ 'B', OrePrefixes.cableGt01.get(Materials.AnyCopper), 'K',
+ OrePrefixes.componentCircuit.get(Materials.Inductor) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Transformer_EV_HV.get(1L),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_HV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Aluminium), 'B', OrePrefixes.cableGt01.get(Materials.Gold), 'K',
+ ItemList.Circuit_Chip_ULPIC });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Transformer_IV_EV.get(1L),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_EV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Tungsten), 'B', OrePrefixes.cableGt01.get(Materials.Aluminium), 'K',
+ ItemList.Circuit_Chip_LPIC });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Transformer_LuV_IV.get(1L),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_IV, 'C',
+ OrePrefixes.cableGt01.get(Materials.VanadiumGallium), 'B',
+ OrePrefixes.cableGt01.get(Materials.Tungsten), 'K', ItemList.Circuit_Chip_PIC });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Transformer_ZPM_LuV.get(1L),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_LuV, 'C',
+ OrePrefixes.cableGt01.get(Materials.Naquadah), 'B',
+ OrePrefixes.cableGt01.get(Materials.VanadiumGallium), 'K', ItemList.Circuit_Chip_HPIC });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Transformer_UV_ZPM.get(1L),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_ZPM, 'C',
+ OrePrefixes.cableGt01.get(Materials.NaquadahAlloy), 'B', OrePrefixes.cableGt01.get(Materials.Naquadah),
+ 'K', ItemList.Circuit_Chip_UHPIC });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Transformer_MAX_UV.get(1L),
+ bitsd,
+ new Object[] { "KBB", "CM ", "KBB", 'M', ItemList.Hull_UV, 'C',
+ OrePrefixes.wireGt01.get(Materials.Bedrockium), 'B', OrePrefixes.cableGt01.get(Materials.NaquadahAlloy),
+ 'K', ItemList.Circuit_Chip_NPIC });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_Dynamo_ULV.get(1L),
+ bitsd,
+ new Object[] { "XOL", "SMP", "XOL", 'M', ItemList.Hull_ULV, 'S', OrePrefixes.spring.get(Materials.Lead),
+ 'X', OrePrefixes.circuit.get(Materials.Primitive), 'O', ItemList.ULV_Coil, 'L',
+ OrePrefixes.cell.get(Materials.Lubricant), 'P', OrePrefixes.rotor.get(Materials.Lead) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_Dynamo_LV.get(1L),
+ bitsd,
+ new Object[] { "XOL", "SMP", "XOL", 'M', ItemList.Hull_LV, 'S', OrePrefixes.spring.get(Materials.Tin), 'X',
+ OrePrefixes.circuit.get(Materials.Basic), 'O', ItemList.LV_Coil, 'L',
+ OrePrefixes.cell.get(Materials.Lubricant), 'P', ItemList.Electric_Pump_LV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_Dynamo_MV.get(1L),
+ bitsd,
+ new Object[] { "XOL", "SMP", "XOL", 'M', ItemList.Hull_MV, 'S', OrePrefixes.spring.get(Materials.Copper),
+ 'X', ItemList.Circuit_Chip_ULPIC, 'O', ItemList.MV_Coil, 'L', OrePrefixes.cell.get(Materials.Lubricant),
+ 'P', ItemList.Electric_Pump_MV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_Energy_ULV.get(1L),
+ bitsd,
+ new Object[] { "COL", "XMP", "COL", 'M', ItemList.Hull_ULV, 'C', OrePrefixes.cableGt01.get(Materials.Lead),
+ 'X', OrePrefixes.circuit.get(Materials.Primitive), 'O', ItemList.ULV_Coil, 'L',
+ OrePrefixes.cell.get(Materials.Lubricant), 'P', OrePrefixes.rotor.get(Materials.Lead) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_Energy_LV.get(1L),
+ bitsd,
+ new Object[] { "COL", "XMP", "COL", 'M', ItemList.Hull_LV, 'C', OrePrefixes.cableGt01.get(Materials.Tin),
+ 'X', OrePrefixes.circuit.get(Materials.Basic), 'O', ItemList.LV_Coil, 'L',
+ OrePrefixes.cell.get(Materials.Lubricant), 'P', ItemList.Electric_Pump_LV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_Energy_MV.get(1L),
+ bitsd,
+ new Object[] { "XOL", "CMP", "XOL", 'M', ItemList.Hull_MV, 'C', OrePrefixes.cableGt01.get(Materials.Copper),
+ 'X', ItemList.Circuit_Chip_ULPIC, 'O', ItemList.MV_Coil, 'L', OrePrefixes.cell.get(Materials.Lubricant),
+ 'P', ItemList.Electric_Pump_MV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_Maintenance.get(1L),
+ bitsd,
+ new Object[] { "dwx", "hMc", "fsr", 'M', ItemList.Hull_LV });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_DataAccess_EV.get(1L),
+ bitsd,
+ new Object[] { "COC", "OMO", "COC", 'M', ItemList.Hull_EV, 'O', ItemList.Tool_DataStick, 'C',
+ OrePrefixes.circuit.get(Materials.Elite) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_DataAccess_LuV.get(1L),
+ bitsd,
+ new Object[] { "COC", "OMO", "COC", 'M', ItemList.Hull_LuV, 'O', ItemList.Tool_DataOrb, 'C',
+ OrePrefixes.circuit.get(Materials.Ultimate) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_DataAccess_UV.get(1L),
+ bitsd,
+ new Object[] { "CRC", "OMO", "CRC", 'M', ItemList.Hull_UV, 'O', ItemList.Tool_DataOrb, 'C',
+ OrePrefixes.circuit.get(Materials.Infinite), 'R', ItemList.Robot_Arm_UV });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_AutoMaintenance.get(1L),
+ bitsd,
+ new Object[] { "CHC", "AMA", "CHC", 'M', ItemList.Hull_LuV, 'H', ItemList.Hatch_Maintenance, 'A',
+ ItemList.Robot_Arm_LuV, 'C', OrePrefixes.circuit.get(Materials.Ultimate) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_Muffler_LV.get(1L),
+ bitsd,
+ new Object[] { "MX ", "PR ", 'M', ItemList.Hull_LV, 'P', OrePrefixes.pipeMedium.get(Materials.Bronze), 'R',
+ OrePrefixes.rotor.get(Materials.Bronze), 'X', ItemList.Electric_Motor_LV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_Muffler_MV.get(1L),
+ bitsd,
+ new Object[] { "MX ", "PR ", 'M', ItemList.Hull_MV, 'P', OrePrefixes.pipeMedium.get(Materials.Steel), 'R',
+ OrePrefixes.rotor.get(Materials.Steel), 'X', ItemList.Electric_Motor_MV });
+
+ // recycling data for the other mufflers, recipes are in assembler
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hatch_Muffler_HV.get(1L),
+ ItemList.Hull_HV.get(1),
+ OrePrefixes.pipeLarge.get(Materials.StainlessSteel),
+ OrePrefixes.rotor.get(Materials.StainlessSteel),
+ ItemList.Electric_Motor_HV.get(1));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hatch_Muffler_EV.get(1L),
+ ItemList.Hull_EV.get(1),
+ OrePrefixes.pipeLarge.get(Materials.Titanium),
+ OrePrefixes.rotor.get(Materials.Titanium),
+ ItemList.Electric_Motor_EV.get(1));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hatch_Muffler_IV.get(1L),
+ ItemList.Hull_IV.get(1),
+ OrePrefixes.pipeLarge.get(Materials.TungstenSteel),
+ OrePrefixes.rotor.get(Materials.TungstenSteel),
+ ItemList.Electric_Motor_IV.get(1));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hatch_Muffler_LuV.get(1L),
+ ItemList.Hull_LuV.get(1),
+ OrePrefixes.pipeLarge.get(Materials.Enderium),
+ OrePrefixes.rotor.get(Materials.Enderium),
+ ItemList.Electric_Motor_LuV.get(1));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hatch_Muffler_ZPM.get(1L),
+ ItemList.Hull_ZPM.get(1),
+ OrePrefixes.pipeLarge.get(Materials.Naquadah),
+ OrePrefixes.rotor.get(Materials.NaquadahAlloy),
+ ItemList.Electric_Motor_ZPM.get(1));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hatch_Muffler_UV.get(1L),
+ ItemList.Hull_UV.get(1),
+ OrePrefixes.pipeLarge.get(Materials.NetherStar),
+ OrePrefixes.rotor.get(Materials.Neutronium),
+ ItemList.Electric_Motor_UV.get(1));
+ GT_OreDictUnificator.addItemDataFromInputs(
+ ItemList.Hatch_Muffler_MAX.get(1L),
+ ItemList.Hull_MAX.get(1),
+ OrePrefixes.pipeLarge.get(Materials.MysteriousCrystal),
+ OrePrefixes.rotor.get(Materials.CosmicNeutronium),
+ ItemList.Electric_Motor_UHV.get(1));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Bronze_Boiler.get(1L),
+ bitsd,
+ new Object[] { aTextPlate, "PwP", "BFB", 'F', OreDictNames.craftingIronFurnace, 'P',
+ OrePrefixes.plate.get(Materials.Bronze), 'B', new ItemStack(Blocks.brick_block, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Steel_Boiler.get(1L),
+ bitsd,
+ new Object[] { aTextPlate, "PwP", "BFB", 'F', OreDictNames.craftingIronFurnace, 'P',
+ OrePrefixes.plate.get(Materials.Steel), 'B', new ItemStack(Blocks.brick_block, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Steel_Boiler_Lava.get(1L),
+ bitsd,
+ new Object[] { aTextPlate, "PTP", aTextPlateMotor, 'M', ItemList.Hull_HP, 'P',
+ OrePrefixes.plate.get(Materials.Steel), 'T',
+ GT_ModHandler.getModItem(BuildCraftFactory.ID, "tankBlock", 1L, 0) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Bronze_Boiler_Solar.get(1L),
+ bitsd,
+ new Object[] { "GGG", "SSS", aTextPlateMotor, 'M', ItemList.Hull_Bronze_Bricks, 'P',
+ OrePrefixes.pipeSmall.get(Materials.Bronze), 'S', OrePrefixes.plateDouble.get(Materials.Silver), 'G',
+ new ItemStack(Blocks.glass, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HP_Solar.get(1L),
+ bitsd,
+ new Object[] { "GGG", "SSS", aTextPlateMotor, 'M', ItemList.Hull_HP_Bricks, 'P',
+ OrePrefixes.pipeSmall.get(Materials.Steel), 'S', OrePrefixes.plateTriple.get(Materials.Silver), 'G',
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "blockAlloyGlass", 1L) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Bronze_Furnace.get(1L),
+ bitsd,
+ new Object[] { "XXX", "XMX", "XFX", 'M', ItemList.Hull_Bronze_Bricks, 'X',
+ OrePrefixes.pipeSmall.get(Materials.Bronze), 'F', OreDictNames.craftingFurnace });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HP_Furnace.get(1L),
+ bitsd,
+ new Object[] { "XSX", "PMP", "XXX", 'M', ItemList.Machine_Bronze_Furnace, 'X',
+ OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron),
+ 'S', OrePrefixes.plate.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Bronze_Macerator.get(1L),
+ bitsd,
+ new Object[] { "DXD", "XMX", "PXP", 'M', ItemList.Hull_Bronze, 'X',
+ OrePrefixes.pipeSmall.get(Materials.Bronze), 'P', OreDictNames.craftingPiston, 'D',
+ OrePrefixes.gem.get(Materials.Diamond) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HP_Macerator.get(1L),
+ bitsd,
+ new Object[] { "PSP", "XMX", "PPP", 'M', ItemList.Machine_Bronze_Macerator, 'X',
+ OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron),
+ 'S', OrePrefixes.plate.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Bronze_Extractor.get(1L),
+ bitsd,
+ new Object[] { "XXX", "PMG", "XXX", 'M', ItemList.Hull_Bronze, 'X',
+ OrePrefixes.pipeSmall.get(Materials.Bronze), 'P', OreDictNames.craftingPiston, 'G',
+ new ItemStack(Blocks.glass, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HP_Extractor.get(1L),
+ bitsd,
+ new Object[] { "XSX", "PMP", "XXX", 'M', ItemList.Machine_Bronze_Extractor, 'X',
+ OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron),
+ 'S', OrePrefixes.plate.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Bronze_Hammer.get(1L),
+ bitsd,
+ new Object[] { "XPX", "XMX", "XAX", 'M', ItemList.Hull_Bronze, 'X',
+ OrePrefixes.pipeSmall.get(Materials.Bronze), 'P', OreDictNames.craftingPiston, 'A',
+ OreDictNames.craftingAnvil });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HP_Hammer.get(1L),
+ bitsd,
+ new Object[] { "PSP", "XMX", "PPP", 'M', ItemList.Machine_Bronze_Hammer, 'X',
+ OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron),
+ 'S', OrePrefixes.plate.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Bronze_Compressor.get(1L),
+ bitsd,
+ new Object[] { "XXX", aTextPlateMotor, "XXX", 'M', ItemList.Hull_Bronze, 'X',
+ OrePrefixes.pipeSmall.get(Materials.Bronze), 'P', OreDictNames.craftingPiston });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HP_Compressor.get(1L),
+ bitsd,
+ new Object[] { "XSX", "PMP", "XXX", 'M', ItemList.Machine_Bronze_Compressor, 'X',
+ OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron),
+ 'S', OrePrefixes.plate.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Bronze_AlloySmelter.get(1L),
+ bitsd,
+ new Object[] { "XXX", "FMF", "XXX", 'M', ItemList.Hull_Bronze_Bricks, 'X',
+ OrePrefixes.pipeSmall.get(Materials.Bronze), 'F', OreDictNames.craftingFurnace });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HP_AlloySmelter.get(1L),
+ bitsd,
+ new Object[] { "PSP", "PMP", "PXP", 'M', ItemList.Machine_Bronze_AlloySmelter, 'X',
+ OrePrefixes.pipeSmall.get(Materials.WroughtIron), 'P', OrePrefixes.plate.get(Materials.WroughtIron),
+ 'S', OrePrefixes.plate.get(Materials.Steel) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_1by1_ULV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ULV, 'W',
+ OrePrefixes.wireGt01.get(Materials.Lead), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_1by1_LV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LV, 'W',
+ OrePrefixes.wireGt01.get(Materials.Tin), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_1by1_MV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MV, 'W',
+ OrePrefixes.wireGt01.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_1by1_HV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_HV, 'W',
+ OrePrefixes.wireGt01.get(Materials.Gold), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_1by1_EV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_EV, 'W',
+ OrePrefixes.wireGt01.get(Materials.Aluminium), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_1by1_IV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_IV, 'W',
+ OrePrefixes.wireGt01.get(Materials.Tungsten), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_1by1_LuV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LuV, 'W',
+ OrePrefixes.wireGt01.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_1by1_ZPM.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ZPM, 'W',
+ OrePrefixes.wireGt01.get(Materials.Naquadah), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_1by1_UV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_UV, 'W',
+ OrePrefixes.wireGt01.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_1by1_MAX.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MAX, 'W',
+ OrePrefixes.wireGt01.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_2by2_ULV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ULV, 'W',
+ OrePrefixes.wireGt04.get(Materials.Lead), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_2by2_LV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LV, 'W',
+ OrePrefixes.wireGt04.get(Materials.Tin), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_2by2_MV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MV, 'W',
+ OrePrefixes.wireGt04.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_2by2_HV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_HV, 'W',
+ OrePrefixes.wireGt04.get(Materials.Gold), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_2by2_EV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_EV, 'W',
+ OrePrefixes.wireGt04.get(Materials.Aluminium), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_2by2_IV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_IV, 'W',
+ OrePrefixes.wireGt04.get(Materials.Tungsten), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_2by2_LuV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LuV, 'W',
+ OrePrefixes.wireGt04.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_2by2_ZPM.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ZPM, 'W',
+ OrePrefixes.wireGt04.get(Materials.Naquadah), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_2by2_UV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_UV, 'W',
+ OrePrefixes.wireGt04.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_2by2_MAX.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MAX, 'W',
+ OrePrefixes.wireGt04.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_3by3_ULV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ULV, 'W',
+ OrePrefixes.wireGt08.get(Materials.Lead), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_3by3_LV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LV, 'W',
+ OrePrefixes.wireGt08.get(Materials.Tin), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_3by3_MV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MV, 'W',
+ OrePrefixes.wireGt08.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_3by3_HV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_HV, 'W',
+ OrePrefixes.wireGt08.get(Materials.Gold), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_3by3_EV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_EV, 'W',
+ OrePrefixes.wireGt08.get(Materials.Aluminium), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_3by3_IV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_IV, 'W',
+ OrePrefixes.wireGt08.get(Materials.Tungsten), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_3by3_LuV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LuV, 'W',
+ OrePrefixes.wireGt08.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_3by3_ZPM.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ZPM, 'W',
+ OrePrefixes.wireGt08.get(Materials.Naquadah), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_3by3_UV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_UV, 'W',
+ OrePrefixes.wireGt08.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_3by3_MAX.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MAX, 'W',
+ OrePrefixes.wireGt08.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_4by4_ULV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ULV, 'W',
+ OrePrefixes.wireGt16.get(Materials.Lead), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_4by4_LV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LV, 'W',
+ OrePrefixes.wireGt16.get(Materials.Tin), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_4by4_MV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MV, 'W',
+ OrePrefixes.wireGt16.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_4by4_HV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_HV, 'W',
+ OrePrefixes.wireGt16.get(Materials.Gold), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_4by4_EV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_EV, 'W',
+ OrePrefixes.wireGt16.get(Materials.Aluminium), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_4by4_IV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_IV, 'W',
+ OrePrefixes.wireGt16.get(Materials.Tungsten), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_4by4_LuV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_LuV, 'W',
+ OrePrefixes.wireGt16.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_4by4_ZPM.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_ZPM, 'W',
+ OrePrefixes.wireGt16.get(Materials.Naquadah), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_4by4_UV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_UV, 'W',
+ OrePrefixes.wireGt16.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Buffer_4by4_MAX.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, 'M', ItemList.Hull_MAX, 'W',
+ OrePrefixes.wireGt16.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Charger_4by4_ULV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_ULV, 'W',
+ OrePrefixes.wireGt16.get(Materials.Lead), 'T', OreDictNames.craftingChest, 'B',
+ ItemList.Battery_RE_ULV_Tantalum, 'C', OrePrefixes.circuit.get(Materials.Primitive) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Charger_4by4_LV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_LV, 'W',
+ OrePrefixes.wireGt16.get(Materials.Tin), 'T', OreDictNames.craftingChest, 'B',
+ ItemList.Battery_RE_LV_Lithium, 'C', OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Charger_4by4_MV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_MV, 'W',
+ OrePrefixes.wireGt16.get(Materials.AnyCopper), 'T', OreDictNames.craftingChest, 'B',
+ ItemList.Battery_RE_MV_Lithium, 'C', OrePrefixes.circuit.get(Materials.Good) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Charger_4by4_HV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_HV, 'W',
+ OrePrefixes.wireGt16.get(Materials.Gold), 'T', OreDictNames.craftingChest, 'B',
+ ItemList.Battery_RE_HV_Lithium, 'C', OrePrefixes.circuit.get(Materials.Advanced) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Charger_4by4_EV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_EV, 'W',
+ OrePrefixes.wireGt16.get(Materials.Aluminium), 'T', OreDictNames.craftingChest, 'B',
+ OrePrefixes.battery.get(Materials.Master), 'C', OrePrefixes.circuit.get(Materials.Data) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Charger_4by4_IV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_IV, 'W',
+ OrePrefixes.wireGt16.get(Materials.Tungsten), 'T', OreDictNames.craftingChest, 'B',
+ ItemList.Energy_LapotronicOrb, 'C', OrePrefixes.circuit.get(Materials.Elite) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Charger_4by4_LuV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_LuV, 'W',
+ OrePrefixes.wireGt16.get(Materials.VanadiumGallium), 'T', OreDictNames.craftingChest, 'B',
+ ItemList.Energy_LapotronicOrb2, 'C', OrePrefixes.circuit.get(Materials.Master) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Charger_4by4_ZPM.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_ZPM, 'W',
+ OrePrefixes.wireGt16.get(Materials.Naquadah), 'T', OreDictNames.craftingChest, 'B',
+ ItemList.Energy_LapotronicOrb2, 'C', OrePrefixes.circuit.get(Materials.Ultimate) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Charger_4by4_UV.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_UV, 'W',
+ OrePrefixes.wireGt16.get(Materials.NaquadahAlloy), 'T', OreDictNames.craftingChest, 'B', ItemList.ZPM2,
+ 'C', OrePrefixes.circuit.get(Materials.SuperconductorUHV) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Battery_Charger_4by4_MAX.get(1L),
+ bitsd,
+ new Object[] { aTextWireChest, aTextWireHull, "BCB", 'M', ItemList.Hull_MAX, 'W',
+ OrePrefixes.wireGt16.get(Materials.SuperconductorUHV), 'T', OreDictNames.craftingChest, 'B',
+ ItemList.ZPM2, 'C', OrePrefixes.circuit.get(Materials.Infinite) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Locker_ULV.get(1L),
+ bitsd,
+ new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_ULV, 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Locker_LV.get(1L),
+ bitsd,
+ new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_LV, 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Locker_MV.get(1L),
+ bitsd,
+ new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_MV, 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Locker_HV.get(1L),
+ bitsd,
+ new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_HV, 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Locker_EV.get(1L),
+ bitsd,
+ new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_EV, 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Locker_IV.get(1L),
+ bitsd,
+ new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_IV, 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Locker_LuV.get(1L),
+ bitsd,
+ new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_LuV, 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Locker_ZPM.get(1L),
+ bitsd,
+ new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_ZPM, 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Locker_UV.get(1L),
+ bitsd,
+ new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_UV, 'T', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Locker_MAX.get(1L),
+ bitsd,
+ new Object[] { "T", "M", 'M', ItemList.Battery_Buffer_2by2_MAX, 'T', OreDictNames.craftingChest });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_LV_Scanner.get(1L),
+ bitsd,
+ new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_LV, 'T', ItemList.Emitter_LV, 'R',
+ ItemList.Sensor_LV, 'C', OrePrefixes.circuit.get(Materials.Good), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_MV_Scanner.get(1L),
+ bitsd,
+ new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_MV, 'T', ItemList.Emitter_MV, 'R',
+ ItemList.Sensor_MV, 'C', OrePrefixes.circuit.get(Materials.Advanced), 'W',
+ OrePrefixes.cableGt01.get(Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HV_Scanner.get(1L),
+ bitsd,
+ new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_HV, 'T', ItemList.Emitter_HV, 'R',
+ ItemList.Sensor_HV, 'C', OrePrefixes.circuit.get(Materials.Data), 'W',
+ OrePrefixes.cableGt01.get(Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_EV_Scanner.get(1L),
+ bitsd,
+ new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_EV, 'T', ItemList.Emitter_EV, 'R',
+ ItemList.Sensor_EV, 'C', OrePrefixes.circuit.get(Materials.Elite), 'W',
+ OrePrefixes.cableGt01.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_IV_Scanner.get(1L),
+ bitsd,
+ new Object[] { "CTC", aTextWireHull, "CRC", 'M', ItemList.Hull_IV, 'T', ItemList.Emitter_IV, 'R',
+ ItemList.Sensor_IV, 'C', OrePrefixes.circuit.get(Materials.Master), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tungsten) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_LV_Boxinator.get(1L),
+ bitsd,
+ new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_LV, 'R', ItemList.Robot_Arm_LV, 'V',
+ ItemList.Conveyor_Module_LV, 'C', OrePrefixes.circuit.get(Materials.Basic), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tin), 'B', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_MV_Boxinator.get(1L),
+ bitsd,
+ new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_MV, 'R', ItemList.Robot_Arm_MV, 'V',
+ ItemList.Conveyor_Module_MV, 'C', OrePrefixes.circuit.get(Materials.Good), 'W',
+ OrePrefixes.cableGt01.get(Materials.AnyCopper), 'B', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HV_Boxinator.get(1L),
+ bitsd,
+ new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_HV, 'R', ItemList.Robot_Arm_HV, 'V',
+ ItemList.Conveyor_Module_HV, 'C', OrePrefixes.circuit.get(Materials.Advanced), 'W',
+ OrePrefixes.cableGt01.get(Materials.Gold), 'B', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_EV_Boxinator.get(1L),
+ bitsd,
+ new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_EV, 'R', ItemList.Robot_Arm_EV, 'V',
+ ItemList.Conveyor_Module_EV, 'C', OrePrefixes.circuit.get(Materials.Data), 'W',
+ OrePrefixes.cableGt01.get(Materials.Aluminium), 'B', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_IV_Boxinator.get(1L),
+ bitsd,
+ new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_IV, 'R', ItemList.Robot_Arm_IV, 'V',
+ ItemList.Conveyor_Module_IV, 'C', OrePrefixes.circuit.get(Materials.Elite), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tungsten), 'B', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_LuV_Boxinator.get(1L),
+ bitsd,
+ new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_LuV, 'R', ItemList.Robot_Arm_LuV, 'V',
+ ItemList.Conveyor_Module_LuV, 'C', OrePrefixes.circuit.get(Materials.Master), 'W',
+ OrePrefixes.cableGt01.get(Materials.VanadiumGallium), 'B', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_ZPM_Boxinator.get(1L),
+ bitsd,
+ new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_ZPM, 'R', ItemList.Robot_Arm_ZPM, 'V',
+ ItemList.Conveyor_Module_ZPM, 'C', OrePrefixes.circuit.get(Materials.Ultimate), 'W',
+ OrePrefixes.cableGt01.get(Materials.Naquadah), 'B', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_UV_Boxinator.get(1L),
+ bitsd,
+ new Object[] { "BCB", "RMV", aTextWireCoil, 'M', ItemList.Hull_UV, 'R', ItemList.Robot_Arm_UV, 'V',
+ ItemList.Conveyor_Module_UV, 'C', OrePrefixes.circuit.get(Materials.SuperconductorUHV), 'W',
+ OrePrefixes.cableGt01.get(Materials.NaquadahAlloy), 'B', OreDictNames.craftingChest });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_LV_RockBreaker.get(1L),
+ bitsd,
+ new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_LV, 'D', OreDictNames.craftingGrinder, 'E',
+ ItemList.Electric_Motor_LV, 'P', ItemList.Electric_Piston_LV, 'C',
+ OrePrefixes.circuit.get(Materials.Basic), 'W', OrePrefixes.cableGt01.get(Materials.Tin), 'G',
+ new ItemStack(Blocks.glass, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_MV_RockBreaker.get(1L),
+ bitsd,
+ new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_MV, 'D', OreDictNames.craftingGrinder, 'E',
+ ItemList.Electric_Motor_MV, 'P', ItemList.Electric_Piston_MV, 'C',
+ OrePrefixes.circuit.get(Materials.Good), 'W', OrePrefixes.cableGt01.get(Materials.AnyCopper), 'G',
+ new ItemStack(Blocks.glass, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HV_RockBreaker.get(1L),
+ bitsd,
+ new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_HV, 'D', OreDictNames.craftingGrinder, 'E',
+ ItemList.Electric_Motor_HV, 'P', ItemList.Electric_Piston_HV, 'C',
+ OrePrefixes.circuit.get(Materials.Advanced), 'W', OrePrefixes.cableGt01.get(Materials.Gold), 'G',
+ new ItemStack(Blocks.glass, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_EV_RockBreaker.get(1L),
+ bitsd,
+ new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_EV, 'D', OreDictNames.craftingGrinder, 'E',
+ ItemList.Electric_Motor_EV, 'P', ItemList.Electric_Piston_EV, 'C',
+ OrePrefixes.circuit.get(Materials.Data), 'W', OrePrefixes.cableGt01.get(Materials.Aluminium), 'G',
+ new ItemStack(Blocks.glass, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_IV_RockBreaker.get(1L),
+ bitsd,
+ new Object[] { "PED", aTextWireHull, "GGG", 'M', ItemList.Hull_IV, 'D', OreDictNames.craftingGrinder, 'E',
+ ItemList.Electric_Motor_IV, 'P', ItemList.Electric_Piston_IV, 'C',
+ OrePrefixes.circuit.get(Materials.Elite), 'W', OrePrefixes.cableGt01.get(Materials.Tungsten), 'G',
+ new ItemStack(Blocks.glass, 1) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_LV_Massfab.get(1L),
+ bitsd,
+ new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_LV, 'F', ItemList.Field_Generator_LV, 'C',
+ OrePrefixes.circuit.get(Materials.Good), 'W', OrePrefixes.cableGt04.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_MV_Massfab.get(1L),
+ bitsd,
+ new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_MV, 'F', ItemList.Field_Generator_MV, 'C',
+ OrePrefixes.circuit.get(Materials.Advanced), 'W', OrePrefixes.cableGt04.get(Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HV_Massfab.get(1L),
+ bitsd,
+ new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_HV, 'F', ItemList.Field_Generator_HV, 'C',
+ OrePrefixes.circuit.get(Materials.Data), 'W', OrePrefixes.cableGt04.get(Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_EV_Massfab.get(1L),
+ bitsd,
+ new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_EV, 'F', ItemList.Field_Generator_EV, 'C',
+ OrePrefixes.circuit.get(Materials.Elite), 'W', OrePrefixes.cableGt04.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_IV_Massfab.get(1L),
+ bitsd,
+ new Object[] { "CFC", aTextWireHull, "CFC", 'M', ItemList.Hull_IV, 'F', ItemList.Field_Generator_IV, 'C',
+ OrePrefixes.circuit.get(Materials.Master), 'W', OrePrefixes.cableGt04.get(Materials.Tungsten) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_LV_Replicator.get(1L),
+ bitsd,
+ new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_LV, 'F',
+ ItemList.Field_Generator_LV, 'E', ItemList.Emitter_LV, 'C', OrePrefixes.circuit.get(Materials.Good),
+ 'W', OrePrefixes.cableGt04.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_MV_Replicator.get(1L),
+ bitsd,
+ new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_MV, 'F',
+ ItemList.Field_Generator_MV, 'E', ItemList.Emitter_MV, 'C', OrePrefixes.circuit.get(Materials.Advanced),
+ 'W', OrePrefixes.cableGt04.get(Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HV_Replicator.get(1L),
+ bitsd,
+ new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_HV, 'F',
+ ItemList.Field_Generator_HV, 'E', ItemList.Emitter_HV, 'C', OrePrefixes.circuit.get(Materials.Data),
+ 'W', OrePrefixes.cableGt04.get(Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_EV_Replicator.get(1L),
+ bitsd,
+ new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_EV, 'F',
+ ItemList.Field_Generator_EV, 'E', ItemList.Emitter_EV, 'C', OrePrefixes.circuit.get(Materials.Elite),
+ 'W', OrePrefixes.cableGt04.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_IV_Replicator.get(1L),
+ bitsd,
+ new Object[] { "EFE", aTextCableHull, aTextMotorWire, 'M', ItemList.Hull_IV, 'F',
+ ItemList.Field_Generator_IV, 'E', ItemList.Emitter_IV, 'C', OrePrefixes.circuit.get(Materials.Master),
+ 'W', OrePrefixes.cableGt04.get(Materials.Tungsten) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_LV_Brewery.get(1L),
+ bitsd,
+ new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_LV, 'P', ItemList.Electric_Pump_LV, 'B',
+ new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.Basic), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tin), 'G', new ItemStack(Blocks.glass, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_MV_Brewery.get(1L),
+ bitsd,
+ new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_MV, 'P', ItemList.Electric_Pump_MV, 'B',
+ new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.Good), 'W',
+ OrePrefixes.cableGt01.get(Materials.AnyCopper), 'G', new ItemStack(Blocks.glass, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HV_Brewery.get(1L),
+ bitsd,
+ new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_HV, 'P', ItemList.Electric_Pump_HV, 'B',
+ new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.Advanced), 'W',
+ OrePrefixes.cableGt01.get(Materials.Gold), 'G', new ItemStack(Blocks.glass, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_EV_Brewery.get(1L),
+ bitsd,
+ new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_EV, 'P', ItemList.Electric_Pump_EV, 'B',
+ new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.Data), 'W',
+ OrePrefixes.cableGt01.get(Materials.Aluminium), 'G', new ItemStack(Blocks.glass, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_IV_Brewery.get(1L),
+ bitsd,
+ new Object[] { "GPG", aTextWireHull, "CBC", 'M', ItemList.Hull_IV, 'P', ItemList.Electric_Pump_IV, 'B',
+ new ItemStack(Items.brewing_stand, 0), 'C', OrePrefixes.circuit.get(Materials.Elite), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tungsten), 'G', new ItemStack(Blocks.glass, 1) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_LV_Miner.get(1L),
+ bitsd,
+ new Object[] { "EEE", aTextWireHull, "CSC", 'M', ItemList.Hull_LV, 'E', ItemList.Electric_Motor_LV, 'C',
+ OrePrefixes.circuit.get(Materials.Basic), 'W', OrePrefixes.cableGt01.get(Materials.Tin), 'S',
+ ItemList.Sensor_LV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_MV_Miner.get(1L),
+ bitsd,
+ new Object[] { "PEP", aTextWireHull, "CSC", 'M', ItemList.Hull_MV, 'E', ItemList.Electric_Motor_MV, 'P',
+ ItemList.Electric_Piston_MV, 'C', OrePrefixes.circuit.get(Materials.Good), 'W',
+ OrePrefixes.cableGt02.get(Materials.Copper), 'S', ItemList.Sensor_MV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HV_Miner.get(1L),
+ bitsd,
+ new Object[] { "RPR", aTextWireHull, "CSC", 'M', ItemList.Hull_HV, 'E', ItemList.Electric_Motor_HV, 'P',
+ ItemList.Electric_Piston_HV, 'R', ItemList.Robot_Arm_HV, 'C',
+ OrePrefixes.circuit.get(Materials.Advanced), 'W', OrePrefixes.cableGt04.get(Materials.Gold), 'S',
+ ItemList.Sensor_HV });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_BlastFurnace.get(1L),
+ bitsd,
+ new Object[] { "FFF", aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_HeatProof, 'F',
+ OreDictNames.craftingIronFurnace, 'C', OrePrefixes.circuit.get(Materials.Basic), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_VacuumFreezer.get(1L),
+ bitsd,
+ new Object[] { aTextPlate, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_FrostProof, 'P',
+ ItemList.Electric_Pump_HV, 'C', OrePrefixes.circuit.get(Materials.Data), 'W',
+ OrePrefixes.cableGt01.get(Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_ImplosionCompressor.get(1L),
+ bitsd,
+ new Object[] { "OOO", aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_SolidSteel, 'O',
+ Ic2Items.reinforcedStone, 'C', OrePrefixes.circuit.get(Materials.Advanced), 'W',
+ OrePrefixes.cableGt01.get(Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_Furnace.get(1L),
+ bitsd,
+ new Object[] { "FFF", aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_HeatProof, 'F',
+ OreDictNames.craftingIronFurnace, 'C', OrePrefixes.circuit.get(Materials.Advanced), 'W',
+ OrePrefixes.cableGt01.get(Materials.AnnealedCopper) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_LargeBoiler_Bronze.get(1L),
+ bitsd,
+ new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Firebox_Bronze, 'C',
+ OrePrefixes.circuit.get(Materials.Good), 'W', OrePrefixes.cableGt01.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_LargeBoiler_Steel.get(1L),
+ bitsd,
+ new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Firebox_Steel, 'C',
+ OrePrefixes.circuit.get(Materials.Advanced), 'W', OrePrefixes.cableGt01.get(Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_LargeBoiler_Titanium.get(1L),
+ bitsd,
+ new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Firebox_Titanium, 'C',
+ OrePrefixes.circuit.get(Materials.Data), 'W', OrePrefixes.cableGt01.get(Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_LargeBoiler_TungstenSteel.get(1L),
+ bitsd,
+ new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Firebox_TungstenSteel,
+ 'C', OrePrefixes.circuit.get(Materials.Elite), 'W', OrePrefixes.cableGt01.get(Materials.Aluminium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Diesel_LV.get(1L),
+ bitsd,
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_LV, 'P', ItemList.Electric_Piston_LV, 'E',
+ ItemList.Electric_Motor_LV, 'C', OrePrefixes.circuit.get(Materials.Basic), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tin), 'G', OrePrefixes.gearGt.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Diesel_MV.get(1L),
+ bitsd,
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_MV, 'P', ItemList.Electric_Piston_MV, 'E',
+ ItemList.Electric_Motor_MV, 'C', OrePrefixes.circuit.get(Materials.Good), 'W',
+ OrePrefixes.cableGt01.get(Materials.AnyCopper), 'G', OrePrefixes.gearGt.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Diesel_HV.get(1L),
+ bitsd,
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_HV, 'P', ItemList.Electric_Piston_HV, 'E',
+ ItemList.Electric_Motor_HV, 'C', OrePrefixes.circuit.get(Materials.Advanced), 'W',
+ OrePrefixes.cableGt01.get(Materials.Gold), 'G', OrePrefixes.gearGt.get(Materials.StainlessSteel) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Gas_Turbine_LV.get(1L),
+ bitsd,
+ new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_LV, 'E', ItemList.Electric_Motor_LV, 'R',
+ OrePrefixes.rotor.get(Materials.Tin), 'C', OrePrefixes.circuit.get(Materials.Basic), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Gas_Turbine_MV.get(1L),
+ bitsd,
+ new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_MV, 'E', ItemList.Electric_Motor_MV, 'R',
+ OrePrefixes.rotor.get(Materials.Bronze), 'C', OrePrefixes.circuit.get(Materials.Good), 'W',
+ OrePrefixes.cableGt01.get(Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Gas_Turbine_HV.get(1L),
+ bitsd,
+ new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_HV, 'E', ItemList.Electric_Motor_HV, 'R',
+ OrePrefixes.rotor.get(Materials.Steel), 'C', OrePrefixes.circuit.get(Materials.Advanced), 'W',
+ OrePrefixes.cableGt01.get(Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Gas_Turbine_EV.get(1L),
+ bitsd,
+ new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_EV, 'E', ItemList.Electric_Motor_EV, 'R',
+ OrePrefixes.rotor.get(Materials.Titanium), 'C', OrePrefixes.circuit.get(Materials.Data), 'W',
+ OrePrefixes.cableGt01.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Gas_Turbine_IV.get(1L),
+ bitsd,
+ new Object[] { "CRC", "RMR", aTextMotorWire, 'M', ItemList.Hull_IV, 'E', ItemList.Electric_Motor_IV, 'R',
+ OrePrefixes.rotor.get(Materials.TungstenSteel), 'C', OrePrefixes.circuit.get(Materials.Elite), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tungsten) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Steam_Turbine_LV.get(1L),
+ bitsd,
+ new Object[] { "PCP", "RMR", aTextMotorWire, 'M', ItemList.Hull_LV, 'E', ItemList.Electric_Motor_LV, 'R',
+ OrePrefixes.rotor.get(Materials.Tin), 'C', OrePrefixes.circuit.get(Materials.Basic), 'W',
+ OrePrefixes.cableGt01.get(Materials.Tin), 'P', OrePrefixes.pipeMedium.get(Materials.Bronze) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Steam_Turbine_MV.get(1L),
+ bitsd,
+ new Object[] { "PCP", "RMR", aTextMotorWire, 'M', ItemList.Hull_MV, 'E', ItemList.Electric_Motor_MV, 'R',
+ OrePrefixes.rotor.get(Materials.Bronze), 'C', OrePrefixes.circuit.get(Materials.Good), 'W',
+ OrePrefixes.cableGt01.get(Materials.AnyCopper), 'P', OrePrefixes.pipeMedium.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Steam_Turbine_HV.get(1L),
+ bitsd,
+ new Object[] { "PCP", "RMR", aTextMotorWire, 'M', ItemList.Hull_HV, 'E', ItemList.Electric_Motor_HV, 'R',
+ OrePrefixes.rotor.get(Materials.Steel), 'C', OrePrefixes.circuit.get(Materials.Advanced), 'W',
+ OrePrefixes.cableGt01.get(Materials.Gold), 'P', OrePrefixes.pipeMedium.get(Materials.StainlessSteel) });
+
+ if (!Thaumcraft.isModLoaded()) {
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MagicEnergyConverter_LV.get(1L),
+ bitsd,
+ new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_LV, 'B', new ItemStack(Blocks.beacon), 'C',
+ OrePrefixes.circuit.get(Materials.Advanced), 'T', ItemList.Field_Generator_LV, 'F',
+ OrePrefixes.plate.get(Materials.Platinum) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MagicEnergyConverter_MV.get(1L),
+ bitsd,
+ new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_MV, 'B', new ItemStack(Blocks.beacon), 'C',
+ OrePrefixes.circuit.get(Materials.Data), 'T', ItemList.Field_Generator_MV, 'F',
+ OrePrefixes.plate.get(Materials.Iridium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MagicEnergyConverter_HV.get(1L),
+ bitsd,
+ new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_HV, 'B', new ItemStack(Blocks.beacon), 'C',
+ OrePrefixes.circuit.get(Materials.Elite), 'T', ItemList.Field_Generator_HV, 'F',
+ OrePrefixes.plate.get(Materials.Neutronium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MagicEnergyAbsorber_LV.get(1L),
+ bitsd,
+ new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_LV, 'B',
+ ItemList.MagicEnergyConverter_LV.get(1L), 'C', OrePrefixes.circuit.get(Materials.Advanced), 'T',
+ ItemList.Field_Generator_LV, 'F', OrePrefixes.plate.get(Materials.Platinum) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MagicEnergyAbsorber_MV.get(1L),
+ bitsd,
+ new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_MV, 'B',
+ ItemList.MagicEnergyConverter_MV.get(1L), 'C', OrePrefixes.circuit.get(Materials.Data), 'T',
+ ItemList.Field_Generator_MV, 'F', OrePrefixes.plate.get(Materials.Iridium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MagicEnergyAbsorber_HV.get(1L),
+ bitsd,
+ new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_HV, 'B',
+ ItemList.MagicEnergyConverter_MV.get(1L), 'C', OrePrefixes.circuit.get(Materials.Elite), 'T',
+ ItemList.Field_Generator_HV, 'F', OrePrefixes.plate.get(Materials.Europium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MagicEnergyAbsorber_EV.get(1L),
+ bitsd,
+ new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_HV, 'B',
+ ItemList.MagicEnergyConverter_HV.get(1L), 'C', OrePrefixes.circuit.get(Materials.Master), 'T',
+ ItemList.Field_Generator_EV, 'F', OrePrefixes.plate.get(Materials.Neutronium) });
+ }
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Fusion_Coil.get(1L),
+ bitsd,
+ new Object[] { "CTC", "FMF", "CTC", 'M', ItemList.Casing_Coil_Superconductor, 'C',
+ OrePrefixes.circuit.get(Materials.Master), 'F', ItemList.Field_Generator_MV, 'T',
+ ItemList.Neutron_Reflector });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Plasma_IV.get(1L),
+ bitsd,
+ new Object[] { "UCU", "FMF", aTextWireCoil, 'M', ItemList.Hull_LuV, 'F', ItemList.Field_Generator_HV, 'C',
+ OrePrefixes.circuit.get(Materials.Elite), 'W', OrePrefixes.cableGt04.get(Materials.Tungsten), 'U',
+ OrePrefixes.stick.get(Materials.Plutonium241) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Plasma_LuV.get(1L),
+ bitsd,
+ new Object[] { "UCU", "FMF", aTextWireCoil, 'M', ItemList.Hull_ZPM, 'F', ItemList.Field_Generator_EV, 'C',
+ OrePrefixes.circuit.get(Materials.Master), 'W', OrePrefixes.wireGt04.get(Materials.VanadiumGallium),
+ 'U', OrePrefixes.stick.get(Materials.Europium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Generator_Plasma_ZPMV.get(1L),
+ bitsd,
+ new Object[] { "UCU", "FMF", aTextWireCoil, 'M', ItemList.Hull_UV, 'F', ItemList.Field_Generator_IV, 'C',
+ OrePrefixes.circuit.get(Materials.Ultimate), 'W', OrePrefixes.wireGt04.get(Materials.Naquadah), 'U',
+ OrePrefixes.stick.get(Materials.Americium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Processing_Array.get(1L),
+ bitsd,
+ new Object[] { "CTC", "FMF", "CBC", 'M', ItemList.Hull_EV, 'B',
+ OrePrefixes.pipeLarge.get(Materials.StainlessSteel), 'C', OrePrefixes.circuit.get(Materials.Elite), 'F',
+ ItemList.Robot_Arm_EV, 'T', ItemList.Energy_LapotronicOrb });
+
+ GT_ProcessingArrayRecipeLoader.registerDefaultGregtechMaps();
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Distillation_Tower.get(1L),
+ bitsd,
+ new Object[] { "CBC", "FMF", "CBC", 'M', ItemList.Hull_HV, 'B',
+ OrePrefixes.pipeLarge.get(Materials.StainlessSteel), 'C', OrePrefixes.circuit.get(Materials.Data), 'F',
+ ItemList.Electric_Pump_HV });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.LargeSteamTurbine.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_HV, 'B',
+ OrePrefixes.pipeLarge.get(Materials.Steel), 'C', OrePrefixes.circuit.get(Materials.Advanced), 'P',
+ OrePrefixes.gearGt.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.LargeGasTurbine.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_EV, 'B',
+ OrePrefixes.pipeLarge.get(Materials.StainlessSteel), 'C', OrePrefixes.circuit.get(Materials.Data), 'P',
+ OrePrefixes.gearGt.get(Materials.StainlessSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.LargeAdvancedGasTurbine.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_IV, 'B',
+ OrePrefixes.pipeLarge.get(Materials.TungstenSteel), 'C', OrePrefixes.circuit.get(Materials.Master), 'P',
+ OrePrefixes.gearGt.get(Materials.HSSG) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Pump_LV.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_LV, 'B',
+ OrePrefixes.pipeLarge.get(Materials.Bronze), 'C', OrePrefixes.circuit.get(Materials.Basic), 'P',
+ ItemList.Electric_Pump_LV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Pump_MV.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_MV, 'B',
+ OrePrefixes.pipeLarge.get(Materials.Steel), 'C', OrePrefixes.circuit.get(Materials.Good), 'P',
+ ItemList.Electric_Pump_MV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Pump_HV.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_HV, 'B',
+ OrePrefixes.pipeLarge.get(Materials.StainlessSteel), 'C', OrePrefixes.circuit.get(Materials.Advanced),
+ 'P', ItemList.Electric_Pump_HV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Pump_EV.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_EV, 'B',
+ OrePrefixes.pipeLarge.get(Materials.Titanium), 'C', OrePrefixes.circuit.get(Materials.Data), 'P',
+ ItemList.Electric_Pump_EV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Pump_IV.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextPlateMotor, "BPB", 'M', ItemList.Hull_IV, 'B',
+ OrePrefixes.pipeLarge.get(Materials.TungstenSteel), 'C', OrePrefixes.circuit.get(Materials.Elite), 'P',
+ ItemList.Electric_Pump_IV });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MobRep_LV.get(1L),
+ bitsd,
+ new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_LV, 'E', ItemList.Emitter_LV.get(1L), 'C',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MobRep_MV.get(1L),
+ bitsd,
+ new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_MV, 'E', ItemList.Emitter_MV.get(1L), 'C',
+ OrePrefixes.circuit.get(Materials.Good) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MobRep_HV.get(1L),
+ bitsd,
+ new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_HV, 'E', ItemList.Emitter_HV.get(1L), 'C',
+ OrePrefixes.circuit.get(Materials.Advanced) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MobRep_EV.get(1L),
+ bitsd,
+ new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_EV, 'E', ItemList.Emitter_EV.get(1L), 'C',
+ OrePrefixes.circuit.get(Materials.Data) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MobRep_IV.get(1L),
+ bitsd,
+ new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_IV, 'E', ItemList.Emitter_IV.get(1L), 'C',
+ OrePrefixes.circuit.get(Materials.Elite) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MobRep_LuV.get(1L),
+ bitsd,
+ new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_LuV, 'E', ItemList.Emitter_LuV.get(1L), 'C',
+ OrePrefixes.circuit.get(Materials.Master) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MobRep_ZPM.get(1L),
+ bitsd,
+ new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_ZPM, 'E', ItemList.Emitter_ZPM.get(1L), 'C',
+ OrePrefixes.circuit.get(Materials.Ultimate) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MobRep_UV.get(1L),
+ bitsd,
+ new Object[] { "EEE", " M ", "CCC", 'M', ItemList.Hull_UV, 'E', ItemList.Emitter_UV.get(1L), 'C',
+ OrePrefixes.circuit.get(Materials.SuperconductorUHV) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_HeatExchanger.get(1L),
+ bitsd,
+ new Object[] { aTextWireCoil, aTextCableHull, aTextWireCoil, 'M', ItemList.Casing_Pipe_Titanium, 'C',
+ OrePrefixes.pipeMedium.get(Materials.Titanium), 'W', ItemList.Electric_Pump_EV });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Charcoal_Pile.get(1L),
+ bitsd,
+ new Object[] { "EXE", "EME", "hCw", 'M', ItemList.Hull_HP_Bricks, 'E',
+ OrePrefixes.plate.get(Materials.AnyBronze), 'C', new ItemStack(Items.flint_and_steel, 1), 'X',
+ OrePrefixes.rotor.get(Materials.Steel), });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Seismic_Prospector_Adv_LV.get(1L),
+ bitsd,
+ new Object[] { "WWW", "EME", "CXC", 'M', ItemList.Hull_LV, 'W',
+ OrePrefixes.plateDouble.get(Materials.Steel), 'E', OrePrefixes.circuit.get(Materials.Basic), 'C',
+ ItemList.Sensor_LV, 'X', OrePrefixes.cableGt02.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Seismic_Prospector_Adv_MV.get(1L),
+ bitsd,
+ new Object[] { "WWW", "EME", "CXC", 'M', ItemList.Hull_MV, 'W',
+ OrePrefixes.plateDouble.get(Materials.BlackSteel), 'E', OrePrefixes.circuit.get(Materials.Good), 'C',
+ ItemList.Sensor_MV, 'X', OrePrefixes.cableGt02.get(Materials.Copper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Seismic_Prospector_Adv_HV.get(1L),
+ bitsd,
+ new Object[] { "WWW", "EME", "CXC", 'M', ItemList.Hull_HV, 'W',
+ OrePrefixes.plateDouble.get(Materials.StainlessSteel), 'E', OrePrefixes.circuit.get(Materials.Advanced),
+ 'C', ItemList.Sensor_HV, 'X', OrePrefixes.cableGt04.get(Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Seismic_Prospector_Adv_EV.get(1L),
+ bitsd,
+ new Object[] { "WWW", "EME", "CXC", 'M', ItemList.Hull_EV, 'W',
+ OrePrefixes.plateDouble.get(Materials.VanadiumSteel), 'E', OrePrefixes.circuit.get(Materials.Data), 'C',
+ ItemList.Sensor_EV, 'X', OrePrefixes.cableGt04.get(Materials.Aluminium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.ConcreteBackfiller1.get(1L),
+ bitsd,
+ new Object[] { "WPW", "EME", "CQC", 'M', ItemList.Hull_MV, 'W', OrePrefixes.frameGt.get(Materials.Steel),
+ 'E', OrePrefixes.circuit.get(Materials.Good), 'C', ItemList.Electric_Motor_MV, 'P',
+ OrePrefixes.pipeLarge.get(Materials.Steel), 'Q', ItemList.Electric_Pump_MV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.ConcreteBackfiller2.get(1L),
+ bitsd,
+ new Object[] { "WPW", "EME", "CQC", 'M', ItemList.ConcreteBackfiller1, 'W',
+ OrePrefixes.frameGt.get(Materials.Titanium), 'E', OrePrefixes.circuit.get(Materials.Data), 'C',
+ ItemList.Electric_Motor_EV, 'P', OrePrefixes.pipeLarge.get(Materials.Steel), 'Q',
+ ItemList.Electric_Pump_EV });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.PyrolyseOven.get(1L),
+ bitsd,
+ new Object[] { "WEP", "EME", "WCP", 'M', ItemList.Hull_MV, 'W', ItemList.Electric_Piston_MV, 'P',
+ OrePrefixes.wireGt04.get(Materials.Cupronickel), 'E', OrePrefixes.circuit.get(Materials.Good), 'C',
+ ItemList.Electric_Pump_MV });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.OilCracker.get(1L),
+ bitsd,
+ new Object[] { aTextWireCoil, "EME", aTextWireCoil, 'M', ItemList.Hull_HV, 'W',
+ ItemList.Casing_Coil_Cupronickel, 'E', OrePrefixes.circuit.get(Materials.Advanced), 'C',
+ ItemList.Electric_Pump_HV });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MicroTransmitter_HV.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_HV, 'B', ItemList.Battery_RE_HV_Lithium,
+ 'C', ItemList.Emitter_HV, 'G', OrePrefixes.circuit.get(Materials.Advanced), 'P',
+ ItemList.Field_Generator_HV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MicroTransmitter_EV.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_EV, 'B',
+ GT_ModHandler.getIC2Item("lapotronCrystal", 1L, GT_Values.W), 'C', ItemList.Emitter_EV, 'G',
+ OrePrefixes.circuit.get(Materials.Data), 'P', ItemList.Field_Generator_EV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MicroTransmitter_IV.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_IV, 'B', ItemList.Energy_LapotronicOrb, 'C',
+ ItemList.Emitter_IV, 'G', OrePrefixes.circuit.get(Materials.Elite), 'P', ItemList.Field_Generator_IV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MicroTransmitter_LUV.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_LuV, 'B', ItemList.Energy_LapotronicOrb2,
+ 'C', ItemList.Emitter_LuV, 'G', OrePrefixes.circuit.get(Materials.Master), 'P',
+ ItemList.Field_Generator_LuV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MicroTransmitter_ZPM.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_ZPM, 'B',
+ GregTech_API.sOPStuff.get(ConfigCategories.Recipes.gregtechrecipes, "EnableZPMandUVBatteries", false)
+ ? ItemList.Energy_Module
+ : ItemList.ZPM2,
+ 'C', ItemList.Emitter_ZPM, 'G', OrePrefixes.circuit.get(Materials.Ultimate), 'P',
+ ItemList.Field_Generator_ZPM });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.MicroTransmitter_UV.get(1L),
+ bitsd,
+ new Object[] { "CPC", aTextCableHull, "GBG", 'M', ItemList.Hull_UV, 'B',
+ GregTech_API.sOPStuff.get(ConfigCategories.Recipes.gregtechrecipes, "EnableZPMandUVBatteries", false)
+ ? ItemList.Energy_Module
+ : ItemList.ZPM3,
+ 'C', ItemList.Emitter_UV, 'G', OrePrefixes.circuit.get(Materials.SuperconductorUHV), 'P',
+ ItemList.Field_Generator_UV });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_Assemblyline.get(1L),
+ bitsd,
+ new Object[] { aTextWireCoil, "EME", aTextWireCoil, 'M', ItemList.Hull_IV, 'W', ItemList.Casing_Assembler,
+ 'E', OrePrefixes.circuit.get(Materials.Elite), 'C', ItemList.Robot_Arm_IV });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_DieselEngine.get(1L),
+ bitsd,
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_EV, 'P', ItemList.Electric_Piston_EV, 'E',
+ ItemList.Electric_Motor_EV, 'C', OrePrefixes.circuit.get(Materials.Elite), 'W',
+ OrePrefixes.cableGt01.get(Materials.TungstenSteel), 'G', OrePrefixes.gearGt.get(Materials.Titanium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_EngineIntake.get(4L),
+ bitsd,
+ new Object[] { "PhP", "RFR", aTextPlateWrench, 'R', OrePrefixes.pipeMedium.get(Materials.Titanium), 'F',
+ ItemList.Casing_StableTitanium, 'P', OrePrefixes.rotor.get(Materials.Titanium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_ExtremeDieselEngine.get(1L),
+ bitsd,
+ new Object[] { "PCP", "EME", "GWG", 'M', ItemList.Hull_IV, 'P', ItemList.Electric_Piston_IV, 'E',
+ ItemList.Electric_Motor_IV, 'C', OrePrefixes.circuit.get(Materials.Master), 'W',
+ OrePrefixes.cableGt01.get(Materials.HSSG), 'G', OrePrefixes.gearGt.get(Materials.TungstenSteel) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_ExtremeEngineIntake.get(4L),
+ bitsd,
+ new Object[] { "PhP", "RFR", aTextPlateWrench, 'R', OrePrefixes.pipeMedium.get(Materials.TungstenSteel),
+ 'F', ItemList.Casing_RobustTungstenSteel, 'P', OrePrefixes.rotor.get(Materials.TungstenSteel) });
+
+ // If Cleanroom is enabled, add a recipe, else hide from NEI.
+ if (GT_Mod.gregtechproxy.mEnableCleanroom) {
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_Cleanroom.get(1L),
+ bitsd,
+ new Object[] { "FFF", "RHR", "MCM", 'H', ItemList.Hull_HV, 'F', ItemList.Component_Filter, 'R',
+ OrePrefixes.rotor.get(Materials.StainlessSteel), 'M', ItemList.Electric_Motor_HV, 'C',
+ OrePrefixes.circuit.get(Materials.Advanced) });
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1L),
+ ItemList.Component_Filter.get(2L),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.StainlessSteel, 1L),
+ ItemList.Electric_Motor_HV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Machine_Multi_Cleanroom.get(1L))
+ .fluidInputs(Materials.StainlessSteel.getMolten(864L))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ } else {
+ if (NotEnoughItems.isModLoaded()) {
+ API.hideItem(ItemList.Machine_Multi_Cleanroom.get(1L));
+ }
+ }
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_HV_LightningRod.get(1L),
+ bitsd,
+ new Object[] { "LTL", "TMT", "LTL", 'M', ItemList.Hull_LuV, 'L', ItemList.Energy_LapotronicOrb, 'T',
+ ItemList.Transformer_ZPM_LuV });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_EV_LightningRod.get(1L),
+ bitsd,
+ new Object[] { "LTL", "TMT", "LTL", 'M', ItemList.Hull_ZPM, 'L', ItemList.Energy_LapotronicOrb2, 'T',
+ ItemList.Transformer_UV_ZPM });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_IV_LightningRod.get(1L),
+ bitsd,
+ new Object[] { "LTL", "TMT", "LTL", 'M', ItemList.Hull_UV, 'L', ItemList.ZPM2, 'T',
+ ItemList.Transformer_MAX_UV });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Machine_Multi_LargeChemicalReactor.get(1L),
+ bitsd,
+ new Object[] { "CRC", "PMP", "CBC", 'C', OrePrefixes.circuit.get(Materials.Advanced), 'R',
+ OrePrefixes.rotor.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.pipeLarge.get(Materials.Polytetrafluoroethylene), 'M', ItemList.Electric_Motor_HV, 'B',
+ ItemList.Hull_HV });
+
+ // Add Drone down link hatch
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Hatch_DroneDownLink.get(1L),
+ bits,
+ new Object[] { " S ", "CMC", "RRR", 'M', ItemList.Hatch_Maintenance, 'S', ItemList.Sensor_IV, 'R',
+ new ItemStack(GregTech_API.sBlockReinforced, 1, 9), 'C', ItemList.Conveyor_Module_EV });
+
+ // And Drone Centre
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Casing_Assembler.get(1),
+ ItemList.Cover_SolarPanel_HV.get(4),
+ ItemList.Conveyor_Module_IV.get(2),
+ ItemList.Robot_Arm_IV.get(2),
+ ItemList.Sensor_IV.get(2),
+ ItemList.Energy_LapotronicOrb.get(4),
+ ItemList.Cover_WirelessNeedsMaintainance.get(1),
+ GalacticraftCore.isModLoaded() ? GT_ModHandler.getModItem(GalacticraftCore.ID, "item.basicItem", 1, 19)
+ : ItemList.Sensor_EV.get(4))
+ .itemOutputs(ItemList.Machine_Multi_DroneCentre.get(1L))
+ .fluidInputs(Materials.AdvancedGlue.getFluid(8000L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+ }
+
+ private static void registerShapelessCraftingRecipes() {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Casing_SolidSteel.get(1L),
+ bits,
+ new Object[] { ItemList.Casing_Stripes_A });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Casing_SolidSteel.get(1L),
+ bits,
+ new Object[] { ItemList.Casing_Stripes_B });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Casing_SolidSteel.get(1L),
+ bits,
+ new Object[] { ItemList.Casing_RadioactiveHazard });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Casing_SolidSteel.get(1L),
+ bits,
+ new Object[] { ItemList.Casing_BioHazard });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Casing_SolidSteel.get(1L),
+ bits,
+ new Object[] { ItemList.Casing_ExplosionHazard });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Casing_SolidSteel.get(1L),
+ bits,
+ new Object[] { ItemList.Casing_FireHazard });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Casing_SolidSteel.get(1L),
+ bits,
+ new Object[] { ItemList.Casing_AcidHazard });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Casing_SolidSteel.get(1L),
+ bits,
+ new Object[] { ItemList.Casing_MagicHazard });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Casing_SolidSteel.get(1L),
+ bits,
+ new Object[] { ItemList.Casing_FrostHazard });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Casing_SolidSteel.get(1L),
+ bits,
+ new Object[] { ItemList.Casing_NoiseHazard });
+
+ if (Forestry.isModLoaded() && Gendustry.isModLoaded()) {
+ /* Conversion recipes */
+ // TODO: Move those recipes with the other recipes
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Machine_IndustrialApiary.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "IndustrialApiary", 1, 0) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_Frame.get(1),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "UpgradeFrame", 1) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_PRODUCTION.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 0) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_PLAINS.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 17) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_LIGHT.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 11) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_FLOWERING.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 2) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_WINTER.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 20) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_DRYER.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 5) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_AUTOMATION.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 14) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_HUMIDIFIER.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 4) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_HELL.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 13) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_POLLEN.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 22) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_DESERT.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 16) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_COOLER.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 7) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_LIFESPAN.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 1) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_SEAL.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 10) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_STABILIZER.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 19) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_JUNGLE.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 18) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_TERRITORY.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 3) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_OCEAN.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 21) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_SKY.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 12) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_HEATER.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 6) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.IndustrialApiary_Upgrade_SIEVE.get(1L),
+ new Object[] { GT_ModHandler.getModItem(Gendustry.ID, "ApiaryUpgrade", 1, 15) });
+
+ }
+ }
+
+ private static void run4() {
+ long bits = GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED;
+
+ boolean bEC = !GT_Mod.gregtechproxy.mHardcoreCables;
+
+ if (!GT_Mod.gregtechproxy.mDisableIC2Cables) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("copperCableItem", 2L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "xP", 'P', OrePrefixes.plate.get(Materials.AnyCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("goldCableItem", 4L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "xP", 'P', OrePrefixes.plate.get(Materials.Gold) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("ironCableItem", 3L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "xP", 'P', OrePrefixes.plate.get(Materials.AnyIron) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("tinCableItem", 3L),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "xP", 'P', OrePrefixes.plate.get(Materials.Tin) });
+ }
+
+ // high pressure fluid pipes
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeSmall, Materials.TungstenSteel, 1L),
+ ItemList.Electric_Pump_EV.get(1L),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeSmall, Materials.Ultimate, 1L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.TungstenSteel, 1L),
+ ItemList.Electric_Pump_IV.get(1L),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Ultimate, 1L))
+ .duration(20 * SECONDS)
+ .eut(4096)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.TungstenSteel, 1L),
+ ItemList.Electric_Pump_IV.get(2L),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Ultimate, 1L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ChestBuffer_ULV.get(1L),
+ bits,
+ new Object[] { "CMV", " X ", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Primitive) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ChestBuffer_LV.get(1L),
+ bits,
+ new Object[] { "CMV", " X ", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ChestBuffer_MV.get(1L),
+ bits,
+ new Object[] { "CMV", " X ", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Good) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ChestBuffer_HV.get(1L),
+ bits,
+ new Object[] { "CMV", " X ", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Advanced) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ChestBuffer_EV.get(1L),
+ bits,
+ new Object[] { "CMV", " X ", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Data) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ChestBuffer_IV.get(1L),
+ bits,
+ new Object[] { "CMV", " X ", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Elite) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ChestBuffer_LuV.get(1L),
+ bits,
+ new Object[] { "CMV", " X ", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Master) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ChestBuffer_ZPM.get(1L),
+ bits,
+ new Object[] { "CMV", " X ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Ultimate) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ChestBuffer_UV.get(1L),
+ bits,
+ new Object[] { "CMV", " X ", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.SuperconductorUHV) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ChestBuffer_MAX.get(1L),
+ bits,
+ new Object[] { "CMV", " X ", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Infinite) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Filter_ULV.get(1L),
+ bits,
+ new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Filter_LV.get(1L),
+ bits,
+ new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Filter_MV.get(1L),
+ bits,
+ new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Filter_HV.get(1L),
+ bits,
+ new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Filter_EV.get(1L),
+ bits,
+ new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Filter_IV.get(1L),
+ bits,
+ new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Filter_LuV.get(1L),
+ bits,
+ new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Filter_ZPM.get(1L),
+ bits,
+ new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Filter_UV.get(1L),
+ bits,
+ new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Filter_MAX.get(1L),
+ bits,
+ new Object[] { " F ", "CMV", " X ", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_TypeFilter_ULV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_TypeFilter_LV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_TypeFilter_MV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_TypeFilter_HV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_TypeFilter_EV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_TypeFilter_IV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_TypeFilter_LuV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_TypeFilter_ZPM.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_TypeFilter_UV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_TypeFilter_MAX.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Regulator_ULV.get(1L),
+ bits,
+ new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_ULV, 'V', ItemList.Robot_Arm_LV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Regulator_LV.get(1L),
+ bits,
+ new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_LV, 'V', ItemList.Robot_Arm_LV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Regulator_MV.get(1L),
+ bits,
+ new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_MV, 'V', ItemList.Robot_Arm_MV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Regulator_HV.get(1L),
+ bits,
+ new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_HV, 'V', ItemList.Robot_Arm_HV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Regulator_EV.get(1L),
+ bits,
+ new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_EV, 'V', ItemList.Robot_Arm_EV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Regulator_IV.get(1L),
+ bits,
+ new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_IV, 'V', ItemList.Robot_Arm_IV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Regulator_LuV.get(1L),
+ bits,
+ new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_LuV, 'V', ItemList.Robot_Arm_LuV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Regulator_ZPM.get(1L),
+ bits,
+ new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_ZPM, 'V', ItemList.Robot_Arm_ZPM, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Regulator_UV.get(1L),
+ bits,
+ new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_UV, 'V', ItemList.Robot_Arm_UV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_Regulator_MAX.get(1L),
+ bits,
+ new Object[] { "XFX", "VMV", "XCX", 'M', ItemList.Hull_MAX, 'V', ItemList.Robot_Arm_UHV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_ULV.get(1L),
+ bits,
+ new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_ULV, 'V', ItemList.Conveyor_Module_LV, 'D',
+ ItemList.Tool_DataOrb });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_LV.get(1L),
+ bits,
+ new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_LV, 'V', ItemList.Conveyor_Module_LV, 'D',
+ ItemList.Tool_DataOrb });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_MV.get(1L),
+ bits,
+ new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_MV, 'V', ItemList.Conveyor_Module_MV, 'D',
+ ItemList.Tool_DataOrb });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_HV.get(1L),
+ bits,
+ new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_HV, 'V', ItemList.Conveyor_Module_HV, 'D',
+ ItemList.Tool_DataOrb });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_EV.get(1L),
+ bits,
+ new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_EV, 'V', ItemList.Conveyor_Module_EV, 'D',
+ ItemList.Tool_DataOrb });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_IV.get(1L),
+ bits,
+ new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_IV, 'V', ItemList.Conveyor_Module_IV, 'D',
+ ItemList.Tool_DataOrb });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_LuV.get(1L),
+ bits,
+ new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_LuV, 'V', ItemList.Conveyor_Module_LuV, 'D',
+ ItemList.Tool_DataOrb });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_ZPM.get(1L),
+ bits,
+ new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'D',
+ ItemList.Tool_DataOrb });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_UV.get(1L),
+ bits,
+ new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_UV, 'V', ItemList.Conveyor_Module_UV, 'D',
+ ItemList.Tool_DataOrb });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_MAX.get(1L),
+ bits,
+ new Object[] { "DMV", 'M', ItemList.Automation_ChestBuffer_MAX, 'V', ItemList.Conveyor_Module_UHV, 'D',
+ ItemList.Tool_DataOrb });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_ULV.get(1L),
+ bits,
+ new Object[] { "DMV", "DDD", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'D',
+ ItemList.Tool_DataStick });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_LV.get(1L),
+ bits,
+ new Object[] { "DMV", "DDD", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'D',
+ ItemList.Tool_DataStick });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_MV.get(1L),
+ bits,
+ new Object[] { "DMV", "DDD", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'D',
+ ItemList.Tool_DataStick });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_HV.get(1L),
+ bits,
+ new Object[] { "DMV", "DDD", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'D',
+ ItemList.Tool_DataStick });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_EV.get(1L),
+ bits,
+ new Object[] { "DMV", "DDD", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'D',
+ ItemList.Tool_DataStick });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_IV.get(1L),
+ bits,
+ new Object[] { "DMV", "DDD", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'D',
+ ItemList.Tool_DataStick });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_LuV.get(1L),
+ bits,
+ new Object[] { "DMV", "DDD", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'D',
+ ItemList.Tool_DataStick });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_ZPM.get(1L),
+ bits,
+ new Object[] { "DMV", "DDD", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'D',
+ ItemList.Tool_DataStick });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_UV.get(1L),
+ bits,
+ new Object[] { "DMV", "DDD", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'D',
+ ItemList.Tool_DataStick });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_SuperBuffer_MAX.get(1L),
+ bits,
+ new Object[] { "DMV", "DDD", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'D',
+ ItemList.Tool_DataStick });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ItemDistributor_ULV.get(1L),
+ bits,
+ new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_ULV, 'V', ItemList.Conveyor_Module_LV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ItemDistributor_LV.get(1L),
+ bits,
+ new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_LV, 'V', ItemList.Conveyor_Module_LV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ItemDistributor_MV.get(1L),
+ bits,
+ new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_MV, 'V', ItemList.Conveyor_Module_MV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ItemDistributor_HV.get(1L),
+ bits,
+ new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_HV, 'V', ItemList.Conveyor_Module_HV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ItemDistributor_EV.get(1L),
+ bits,
+ new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_EV, 'V', ItemList.Conveyor_Module_EV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ItemDistributor_IV.get(1L),
+ bits,
+ new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_IV, 'V', ItemList.Conveyor_Module_IV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ItemDistributor_LuV.get(1L),
+ bits,
+ new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_LuV, 'V', ItemList.Conveyor_Module_LuV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ItemDistributor_ZPM.get(1L),
+ bits,
+ new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Conveyor_Module_ZPM, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ItemDistributor_UV.get(1L),
+ bits,
+ new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_UV, 'V', ItemList.Conveyor_Module_UV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_ItemDistributor_MAX.get(1L),
+ bits,
+ new Object[] { "XCX", "VMV", " V ", 'M', ItemList.Hull_MAX, 'V', ItemList.Conveyor_Module_UHV, 'C',
+ OreDictNames.craftingChest, 'X', OrePrefixes.circuit.get(Materials.Basic) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_RecipeFilter_ULV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_ULV, 'V', ItemList.Robot_Arm_LV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_RecipeFilter_LV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_LV, 'V', ItemList.Robot_Arm_LV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_RecipeFilter_MV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_MV, 'V', ItemList.Robot_Arm_MV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_RecipeFilter_HV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_HV, 'V', ItemList.Robot_Arm_HV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_RecipeFilter_EV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_EV, 'V', ItemList.Robot_Arm_EV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_RecipeFilter_IV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_IV, 'V', ItemList.Robot_Arm_IV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_RecipeFilter_LuV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_LuV, 'V', ItemList.Robot_Arm_LuV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_RecipeFilter_ZPM.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_ZPM, 'V', ItemList.Robot_Arm_ZPM, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_RecipeFilter_UV.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_UV, 'V', ItemList.Robot_Arm_UV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Automation_RecipeFilter_MAX.get(1L),
+ bits,
+ new Object[] { " F ", "VMC", " X ", 'M', ItemList.Hull_MAX, 'V', ItemList.Robot_Arm_UHV, 'C',
+ OreDictNames.craftingChest, 'F', OreDictNames.craftingFilter, 'X',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ }
+
+ @Override
+ public void run() {
+ registerShapelessCraftingRecipes();
+ registerShapedCraftingRecipes();
+ GT_Log.out.println("GT_Mod: Recipes for MetaTileEntities.");
+ registerMachineTypes();
+ GT_PCBFactoryMaterialLoader.load();
+ run4();
+ }
+}
diff --git a/src/main/java/gregtech/loaders/load/GT_SonictronLoader.java b/src/main/java/gregtech/loaders/load/GT_SonictronLoader.java
new file mode 100644
index 0000000000..e5fb8042f7
--- /dev/null
+++ b/src/main/java/gregtech/loaders/load/GT_SonictronLoader.java
@@ -0,0 +1,159 @@
+package gregtech.loaders.load;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.util.GT_Log;
+
+public class GT_SonictronLoader implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Loading Sonictron Sounds");
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.iron_block, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_HARP.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(25);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.gold_block, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_PLING.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(25);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.stone, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_BD.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(25);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.log, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_BASSATTACK.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(25);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.planks, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_BASS.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(25);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.glass, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_HAT.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(25);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.sand, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.NOTE_BASS.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(25);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.record_cat, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add("streaming.");
+ GT_Mod.gregtechproxy.mSoundCounts.add(12);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.tnt, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_EXPLODE.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(3);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.fire, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.FIRE_FIRE.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.flint_and_steel, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.FIRE_IGNITE.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.lava, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.LIQUID_LAVAPOP.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.water, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.LIQUID_WATER.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.water_bucket, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.LIQUID_SPLASH.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.lava_bucket, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_FIZZ.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.portal, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.PORTAL_PORTAL.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.end_portal, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.PORTAL_TRAVEL.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.end_portal_frame, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.PORTAL_TRIGGER.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.glass_pane, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_GLASS.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.ender_pearl, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_ORB.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.ender_eye, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_LEVELUP.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.stone_button, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_CLICK.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.cobblestone, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.DAMAGE_FALLBIG.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.dirt, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.DAMAGE_FALLSMALL.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.iron_sword, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.DAMAGE_HURTFLESH.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.diamond_sword, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_HURT.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.bow, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BOW.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.arrow, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_DRR.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.fishing_rod, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BOWHIT.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.iron_shovel, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BREAK.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.bucket, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BREATH.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.potionitem, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_DRINK.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.glass_bottle, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_BURP.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems
+ .add(new ItemStack(Blocks.ender_chest == null ? Blocks.obsidian : Blocks.ender_chest, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_CHESTOPEN.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.chest, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_CHESTCLOSED.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.iron_door, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_DOOR_OPEN.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.wooden_door, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_DOOR_CLOSE.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Items.porkchop, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.RANDOM_EAT.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.wool, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.STEP_CLOTH.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.grass, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.STEP_GRASS.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.gravel, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.STEP_GRAVEL.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.snow, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.STEP_SNOW.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.piston, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.TILE_PISTON_OUT.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.sticky_piston, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.TILE_PISTON_IN.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.mossy_cobblestone, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.AMBIENT_CAVE_CAVE.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.lapis_block, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.AMBIENT_WEATHER_RAIN.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ GT_Mod.gregtechproxy.mSoundItems.add(new ItemStack(Blocks.diamond_block, 1));
+ GT_Mod.gregtechproxy.mSoundNames.add(SoundResource.AMBIENT_WEATHER_THUNDER.toString());
+ GT_Mod.gregtechproxy.mSoundCounts.add(1);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/materialprocessing/ProcessingConfig.java b/src/main/java/gregtech/loaders/materialprocessing/ProcessingConfig.java
new file mode 100644
index 0000000000..4fb7388367
--- /dev/null
+++ b/src/main/java/gregtech/loaders/materialprocessing/ProcessingConfig.java
@@ -0,0 +1,55 @@
+package gregtech.loaders.materialprocessing;
+
+import gregtech.api.enums.GTNH_ExtraMaterials;
+import gregtech.api.enums.Materials;
+
+public class ProcessingConfig implements gregtech.api.interfaces.IMaterialHandler {
+
+ public ProcessingConfig() {
+ new GTNH_ExtraMaterials();
+ Materials.add(this);
+ }
+
+ /**
+ * To add a new material, please see the following example:
+ * <blockquote>
+ *
+ * <pre>
+ * int numberOfMaterialSlots = GregTech_API.sMaterialProperties.get("general", "AmountOfCustomMaterialSlots", 16);
+ * for (int i = 0; i < numberOfMaterialSlots; i++) {
+ * String aID = (i < 10 ? "0" : "") + i;
+ * new Materials(
+ * -1,
+ * TextureSet.SET_METALLIC,
+ * 1.0F,
+ * 0,
+ * 0,
+ * 0,
+ * 255,
+ * 255,
+ * 255,
+ * 0,
+ * "CustomMat" + aID,
+ * "CustomMat" + aID,
+ * 0,
+ * 0,
+ * 0,
+ * 0,
+ * false,
+ * false,
+ * 1,
+ * 1,
+ * 1,
+ * Dyes._NULL,
+ * "custom",
+ * true,
+ * aID);
+ * }
+ * </pre>
+ *
+ * </blockquote>
+ */
+ @SuppressWarnings("unused")
+ @Override
+ public void onMaterialsInit() {}
+}
diff --git a/src/main/java/gregtech/loaders/materialprocessing/ProcessingModSupport.java b/src/main/java/gregtech/loaders/materialprocessing/ProcessingModSupport.java
new file mode 100644
index 0000000000..c7d5aa32e3
--- /dev/null
+++ b/src/main/java/gregtech/loaders/materialprocessing/ProcessingModSupport.java
@@ -0,0 +1,56 @@
+package gregtech.loaders.materialprocessing;
+
+import static gregtech.api.enums.Mods.Metallurgy;
+import static gregtech.api.enums.Mods.RotaryCraft;
+import static gregtech.api.enums.Mods.UndergroundBiomes;
+
+import gregtech.api.enums.Materials;
+
+public class ProcessingModSupport implements gregtech.api.interfaces.IMaterialHandler {
+
+ public static boolean aEnableThaumcraftMats = true;
+
+ public ProcessingModSupport() {
+ Materials.add(this);
+ }
+
+ @Override
+ public void onMaterialsInit() {
+ // Disable Materials if Parent Mod is not loaded
+ if (!Metallurgy.isModLoaded()) {
+ Materials.Angmallen.mHasParentMod = false;
+ Materials.Atlarus.mHasParentMod = false;
+ Materials.Carmot.mHasParentMod = false;
+ Materials.Celenegil.mHasParentMod = false;
+ Materials.Eximite.mHasParentMod = false;
+ Materials.Haderoth.mHasParentMod = false;
+ Materials.Hepatizon.mHasParentMod = false;
+ Materials.Ignatius.mHasParentMod = false;
+ Materials.Infuscolium.mHasParentMod = false;
+ Materials.Inolashite.mHasParentMod = false;
+ Materials.Kalendrite.mHasParentMod = false;
+ Materials.Lemurite.mHasParentMod = false;
+ Materials.Meutoite.mHasParentMod = false;
+ Materials.Oureclase.mHasParentMod = false;
+ Materials.Prometheum.mHasParentMod = false;
+ Materials.Sanguinite.mHasParentMod = false;
+ }
+
+ if (!UndergroundBiomes.isModLoaded()) {
+ Materials.Blueschist.mHasParentMod = false;
+ Materials.Chert.mHasParentMod = false;
+ Materials.Dacite.mHasParentMod = false;
+ Materials.Eclogite.mHasParentMod = false;
+ Materials.Gabbro.mHasParentMod = false;
+ Materials.Gneiss.mHasParentMod = false;
+ Materials.Greenschist.mHasParentMod = false;
+ Materials.Greywacke.mHasParentMod = false;
+ Materials.Komatiite.mHasParentMod = false;
+ Materials.Rhyolite.mHasParentMod = false;
+ }
+ if (!RotaryCraft.isModLoaded()) {
+ Materials.HSLA.mHasParentMod = false;
+ }
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/misc/GT_Achievements.java b/src/main/java/gregtech/loaders/misc/GT_Achievements.java
new file mode 100644
index 0000000000..8d30240012
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/GT_Achievements.java
@@ -0,0 +1,806 @@
+package gregtech.loaders.misc;
+
+import static gregtech.api.enums.Mods.Thaumcraft;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.stats.Achievement;
+import net.minecraft.stats.AchievementList;
+import net.minecraft.stats.StatBase;
+import net.minecraftforge.common.AchievementPage;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
+import net.minecraftforge.fluids.FluidStack;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent;
+import cpw.mods.fml.common.gameevent.PlayerEvent.ItemSmeltedEvent;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import ic2.core.Ic2Items;
+import thaumcraft.api.ThaumcraftApiHelper;
+
+public class GT_Achievements {
+
+ public static int oreReg = -1;
+ public static int assReg = -1;
+ public ConcurrentHashMap<String, Achievement> achievementList;
+ public ConcurrentHashMap<String, Boolean> issuedAchievements;
+ public int adjX = 5;
+ public int adjY = 9;
+
+ public GT_Achievements() {
+ this.achievementList = new ConcurrentHashMap<>();
+ this.issuedAchievements = new ConcurrentHashMap<>();
+
+ for (GT_Recipe recipe : RecipeMaps.assemblylineVisualRecipes.getAllRecipes()) {
+ registerAssAchievement(recipe);
+ }
+
+ registerAchievement(
+ "flintpick",
+ 0,
+ 0,
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(2, 1, Materials.Flint, Materials.Wood, null),
+ "",
+ false);
+ registerAchievement("crops", -4, 0, GT_ModHandler.getIC2Item("crop", 1L), "flintpick", false);
+ registerAchievement("havestlead", -4, 2, ItemList.Crop_Drop_Plumbilia.get(1), "crops", false);
+ registerAchievement("havestcopper", -2, 1, ItemList.Crop_Drop_Coppon.get(1), "crops", false);
+ registerAchievement("havesttin", -2, -1, ItemList.Crop_Drop_Tine.get(1), "crops", false);
+ registerAchievement("havestoil", -4, -4, ItemList.Crop_Drop_OilBerry.get(1), "crops", false);
+ registerAchievement("havestiron", -2, -3, ItemList.Crop_Drop_Ferru.get(1), "crops", false);
+ registerAchievement("havestgold", -2, -6, ItemList.Crop_Drop_Aurelia.get(1), "havestiron", false);
+ registerAchievement("havestsilver", -4, -5, ItemList.Crop_Drop_Argentia.get(1), "havestiron", false);
+ registerAchievement("havestemeralds", -2, -8, ItemList.Crop_Drop_BobsYerUncleRanks.get(1), "havestgold", false);
+
+ registerAchievement(
+ "tools",
+ 0,
+ 4,
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.HARDHAMMER, 1, Materials.Iron, Materials.Wood, null),
+ "flintpick",
+ false);
+ registerAchievement(
+ "driltime",
+ 2,
+ 4,
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.DRILL_LV,
+ 1,
+ Materials.BlueSteel,
+ Materials.StainlessSteel,
+ null),
+ "tools",
+ false);
+ registerAchievement(
+ "brrrr",
+ 2,
+ 6,
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.CHAINSAW_LV,
+ 1,
+ Materials.BlueSteel,
+ Materials.StainlessSteel,
+ null),
+ "driltime",
+ false);
+ registerAchievement(
+ "highpowerdrill",
+ 3,
+ 5,
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.DRILL_HV,
+ 1,
+ Materials.TungstenSteel,
+ Materials.TungstenSteel,
+ null),
+ "driltime",
+ false);
+ registerAchievement(
+ "hammertime",
+ 3,
+ 7,
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.JACKHAMMER,
+ 1,
+ Materials.TungstenSteel,
+ Materials.TungstenSteel,
+ null),
+ "highpowerdrill",
+ false);
+
+ registerAchievement(
+ "unitool",
+ -2,
+ 4,
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.UNIVERSALSPADE, 1, Materials.Steel, Materials.Iron, null),
+ "tools",
+ false);
+ registerAchievement("recycling", -4, 4, ItemList.Machine_LV_ArcFurnace.get(1), "unitool", false);
+
+ registerAchievement(
+ "crushed",
+ 0,
+ 6,
+ GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Tin, 1L),
+ "tools",
+ false);
+ registerAchievement(
+ "cleandust",
+ 0,
+ 10,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+ "crushed",
+ false);
+ registerAchievement(
+ "washing",
+ -2,
+ 6,
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Iron, 1L),
+ "crushed",
+ false);
+ registerAchievement(
+ "spinit",
+ -4,
+ 6,
+ GT_OreDictUnificator.get(OrePrefixes.crushedCentrifuged, Materials.Redstone, 1L),
+ "crushed",
+ false);
+
+ registerAchievement("newfuel", -4, 8, ItemList.ThoriumCell_4.get(1), "spinit", false);
+ registerAchievement(
+ "newmetal",
+ -4,
+ 10,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lutetium, 1L),
+ "newfuel",
+ false);
+ registerAchievement("reflect", -2, 9, ItemList.Neutron_Reflector.get(1), "newfuel", false);
+
+ registerAchievement(
+ "bronze",
+ 2,
+ 0,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 1L),
+ "flintpick",
+ false);
+ registerAchievement(
+ "simplyeco",
+ 2,
+ 2,
+ ItemList.Machine_Bronze_Boiler_Solar.get(1, ItemList.Machine_HP_Solar.get(1L)),
+ "bronze",
+ false);
+ registerAchievement("firststeam", 2, -2, ItemList.Machine_Bronze_Boiler.get(1), "bronze", false);
+ registerAchievement("alloysmelter", 2, -4, ItemList.Machine_Bronze_AlloySmelter.get(1), "firststeam", false);
+ registerAchievement("macerator", 0, -2, ItemList.Machine_Bronze_Macerator.get(1), "firststeam", false);
+ registerAchievement("extract", 0, -4, ItemList.Machine_Bronze_Extractor.get(1), "alloysmelter", false);
+
+ registerAchievement("smallparts", 0, -5, ItemList.Circuit_Primitive.get(1), "alloysmelter", false);
+ registerAchievement("gtbasiccircuit", 0, -8, Ic2Items.electronicCircuit.copy(), "smallparts", false);
+ registerAchievement("bettercircuits", 0, -9, ItemList.Circuit_Good.get(1), "gtbasiccircuit", false);
+ registerAchievement("stepforward", -2, -9, Ic2Items.advancedCircuit.copy(), "bettercircuits", false);
+ registerAchievement("gtmonosilicon", -5, -10, ItemList.Circuit_Silicon_Ingot.get(1), "stepforward", false);
+ registerAchievement("gtlogicwafer", -7, -10, ItemList.Circuit_Wafer_ILC.get(1), "gtmonosilicon", false);
+ registerAchievement("gtlogiccircuit", -9, -10, ItemList.Circuit_Basic.get(1), "gtlogicwafer", false);
+ registerAchievement("gtcleanroom", -11, -10, ItemList.Machine_Multi_Cleanroom.get(1), "gtlogiccircuit", false);
+ registerAchievement("energyflow", -13, -10, ItemList.Circuit_Nanoprocessor.get(1), "gtcleanroom", false);
+ registerAchievement(
+ "gtquantumprocessor",
+ -13,
+ -12,
+ ItemList.Circuit_Quantumprocessor.get(1),
+ "energyflow",
+ false);
+ registerAchievement(
+ "gtcrystalprocessor",
+ -11,
+ -12,
+ ItemList.Circuit_Crystalprocessor.get(1),
+ "gtquantumprocessor",
+ false);
+ registerAchievement("gtwetware", -9, -12, ItemList.Circuit_Neuroprocessor.get(1), "gtcrystalprocessor", false);
+ registerAchievement("gtwetmain", -7, -12, ItemList.Circuit_Wetwaremainframe.get(1), "gtwetware", false);
+
+ registerAchievement("orbs", -10, -14, ItemList.Energy_LapotronicOrb.get(1), "energyflow", false);
+ registerAchievement("thatspower", -8, -14, ItemList.Energy_LapotronicOrb2.get(1), "orbs", false);
+ registerAchievement("datasaving", -2, -12, ItemList.Tool_DataOrb.get(1), "stepforward", false);
+ registerAchievement("superbuffer", 0, -12, ItemList.Automation_SuperBuffer_LV.get(1), "datasaving", false);
+ registerAchievement("newstorage", -2, -14, ItemList.Quantum_Chest_HV.get(1), "superbuffer", false);
+ registerAchievement("whereistheocean", 2, -14, ItemList.Quantum_Tank_IV.get(1), "superbuffer", false);
+ registerAchievement("luck", 2, -6, ItemList.ZPM.get(1), "", false);
+
+ registerAchievement(
+ "steel",
+ 4,
+ 0,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L),
+ "bronze",
+ false);
+ registerAchievement("highpressure", 4, 2, ItemList.Machine_Steel_Boiler.get(1), "steel", false);
+ registerAchievement(
+ "extremepressure",
+ 4,
+ 4,
+ ItemList.Machine_Multi_LargeBoiler_Steel.get(1),
+ "highpressure",
+ false);
+ registerAchievement("cheapermac", 6, 1, ItemList.Machine_LV_Hammer.get(1), "steel", false);
+ registerAchievement(
+ "complexalloys",
+ 6,
+ 3,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.BlueSteel, 1L),
+ "cheapermac",
+ false);
+
+ registerAchievement(
+ "magneticiron",
+ 4,
+ -2,
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1L),
+ "steel",
+ false);
+ registerAchievement("lvmotor", 4, -6, ItemList.Electric_Motor_LV.get(1), "magneticiron", false);
+ registerAchievement("pumpcover", 2, -8, ItemList.Electric_Pump_LV.get(1), "lvmotor", false);
+ registerAchievement("closeit", 2, -10, ItemList.Cover_Shutter.get(1), "pumpcover", false);
+ registerAchievement("slurp", 2, -12, ItemList.Pump_HV.get(1), "closeit", false);
+ registerAchievement("transport", 4, -10, ItemList.Conveyor_Module_LV.get(1), "lvmotor", false);
+ registerAchievement("manipulation", 4, -12, ItemList.Cover_Controller.get(1), "transport", false);
+ registerAchievement("buffer", 4, -14, ItemList.Automation_ChestBuffer_LV.get(1), "manipulation", false);
+ registerAchievement("complexmachines", 6, -9, ItemList.Robot_Arm_LV.get(1), "lvmotor", false);
+ registerAchievement("avengers", 8, -11, ItemList.Machine_LV_Assembler.get(1), "complexmachines", false);
+ registerAchievement("filterregulate", 10, -11, ItemList.Component_Filter.get(1), "avengers", false);
+
+ registerAchievement("steampower", 6, -6, ItemList.Generator_Steam_Turbine_LV.get(1), "lvmotor", false);
+ registerAchievement("batterys", 6, -4, ItemList.Battery_Buffer_2by2_MV.get(1), "steampower", false);
+ registerAchievement("badweather", 6, -8, ItemList.Casing_FireHazard.get(1), "steampower", false);
+ registerAchievement("electricproblems", 7, -7, ItemList.Casing_ExplosionHazard.get(1), "steampower", false);
+ registerAchievement("ebf", 8, -6, ItemList.Machine_Multi_BlastFurnace.get(1), "steampower", false);
+ registerAchievement("energyhatch", 12, -6, ItemList.Hatch_Energy_LV.get(1), "ebf", false);
+
+ registerAchievement(
+ "gtaluminium",
+ 8,
+ 0,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Aluminium, 1L),
+ "steel",
+ false);
+ registerAchievement("highpowersmelt", 8, 2, ItemList.Machine_Multi_Furnace.get(1), "gtaluminium", false);
+ registerAchievement("oilplant", 8, 4, ItemList.Distillation_Tower.get(1), "highpowersmelt", false);
+ registerAchievement("factory", 8, 6, ItemList.Processing_Array.get(1), "oilplant", false);
+ registerAchievement("upgradeebf", 8, -2, ItemList.Hatch_Energy_MV.get(1), "gtaluminium", false);
+ registerAchievement("maintainance", 10, -2, ItemList.Hatch_Maintenance.get(1), "upgradeebf", false);
+
+ registerAchievement("upgrade", 10, 0, ItemList.Casing_Coil_Kanthal.get(1), "gtaluminium", false);
+ registerAchievement(
+ "titan",
+ 14,
+ 0,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Titanium, 1L),
+ "upgrade",
+ false);
+ registerAchievement("magic", 14, 3, ItemList.MagicEnergyConverter_LV.get(1), "titan", false);
+ registerAchievement("highmage", 10, 3, ItemList.MagicEnergyAbsorber_HV.get(1), "magic", false);
+ registerAchievement("artificaldia", 12, 2, ItemList.IC2_Industrial_Diamond.get(1), "titan", false);
+ registerAchievement("muchsteam", 13, 1, ItemList.LargeSteamTurbine.get(1), "titan", false);
+ registerAchievement("efficientsteam", 11, 1, ItemList.LargeSteamTurbine.get(1), "muchsteam", false);
+
+ registerAchievement("upgrade2", 16, 0, ItemList.Casing_Coil_Nichrome.get(1), "titan", false);
+ registerAchievement(
+ "tungsten",
+ 16,
+ 2,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tungsten, 1L),
+ "upgrade2",
+ false);
+ registerAchievement(
+ "osmium",
+ 16,
+ -2,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Osmium, 1L),
+ "upgrade2",
+ false);
+ registerAchievement("hightech", 15, -3, ItemList.Field_Generator_LV.get(1), "osmium", false);
+ registerAchievement("amplifier", 16, -5, ItemList.Machine_LV_Amplifab.get(1), "hightech", false);
+ registerAchievement("scanning", 13, -3, ItemList.Machine_HV_Scanner.get(1), "hightech", false);
+ registerAchievement("alienpower", 14, -5, ItemList.Generator_Naquadah_Mark_I.get(1), "hightech", false);
+ registerAchievement("universal", 15, -6, ItemList.Machine_LV_Massfab.get(1), "hightech", false);
+ registerAchievement("replication", 17, -6, ItemList.Machine_LV_Replicator.get(1), "universal", false);
+
+ registerAchievement(
+ "tungstensteel",
+ 16,
+ 4,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 1L),
+ "tungsten",
+ false);
+ registerAchievement("upgrade3", 15, 5, ItemList.Casing_Coil_TungstenSteel.get(1), "tungstensteel", false);
+ registerAchievement(
+ "hssg",
+ 13,
+ 5,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.HSSG, 1L),
+ "upgrade3",
+ false);
+ registerAchievement("upgrade4", 11, 5, ItemList.Casing_Coil_HSSG.get(1), "hssg", false);
+ registerAchievement(
+ "stargatematerial",
+ 11,
+ 7,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 1L),
+ "upgrade4",
+ false);
+ registerAchievement("conducting", 14, 6, ItemList.Casing_Coil_Superconductor.get(1), "upgrade3", false);
+ registerAchievement("fusion", 15, 7, ItemList.FusionComputer_LuV.get(1), "tungstensteel", false);
+ registerAchievement("higherefficency", 15, 9, ItemList.Generator_Plasma_IV.get(1), "fusion", false);
+ registerAchievement("advancing", 13, 7, ItemList.FusionComputer_ZPMV.get(1), "fusion", false);
+
+ registerAchievement("stargateliquid", 11, 9, ItemList.Generator_Plasma_LuV.get(1), "advancing", false);
+ registerAchievement("tothelimit", 13, 9, ItemList.Generator_Plasma_LuV.get(1), "advancing", false);
+ registerAchievement("fullefficiency", 12, 10, ItemList.Generator_Plasma_ZPMV.get(1), "tothelimit", false);
+ registerAchievement("upgrade5", 9, 9, ItemList.Casing_Coil_Naquadah.get(1), "stargateliquid", false);
+ registerAchievement(
+ "alienmetallurgy",
+ 9,
+ 7,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.NaquadahAlloy, 1L),
+ "upgrade5",
+ false);
+ registerAchievement("over9000", 7, 7, ItemList.Casing_Coil_NaquadahAlloy.get(1), "alienmetallurgy", false);
+ registerAchievement(
+ "finalpreparations",
+ 7,
+ 9,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadria, 1L),
+ "over9000",
+ false);
+ registerAchievement("denseaspossible", 6, 10, ItemList.FusionComputer_UV.get(1), "finalpreparations", false);
+ if (GregTech_API.sOPStuff.get(ConfigCategories.Recipes.gregtechrecipes, "EnableZPMandUVBatteries", false)) {
+ registerAchievement("zpmage", 8, 10, ItemList.Energy_Module.get(1), "denseaspossible", false);
+ registerAchievement("uvage", 10, 10, ItemList.Energy_Cluster.get(1), "zpmage", false);
+ registerAchievement("whatnow", 12, 10, ItemList.ZPM2.get(1), "uvage", false);
+ } else {
+ registerAchievement("whatnow", 8, 10, ItemList.ZPM2.get(1), "denseaspossible", false);
+ }
+
+ if (GT_Mod.gregtechproxy.mAchievements) {
+ AchievementPage.registerAchievementPage(
+ new AchievementPage(
+ "GregTech 5",
+ this.achievementList.values()
+ .toArray(new Achievement[0])));
+ MinecraftForge.EVENT_BUS.register(this);
+ FMLCommonHandler.instance()
+ .bus()
+ .register(this);
+ }
+ }
+
+ public static void registerOre(Materials aMaterial, int min, int max, int chance, boolean overworld, boolean nether,
+ boolean end) {}
+
+ public Achievement registerAchievement(String textId, int x, int y, ItemStack icon, Achievement requirement,
+ boolean special) {
+ if (!GT_Mod.gregtechproxy.mAchievements) {
+ return null;
+ }
+ Achievement achievement = new Achievement(textId, textId, this.adjX + x, this.adjY + y, icon, requirement);
+ if (special) {
+ achievement.setSpecial();
+ }
+ ((StatBase) achievement).registerStat();
+ if (GT_Values.D2) {
+ GT_Log.out.println("achievement." + textId + "=");
+ GT_Log.out.println("achievement." + textId + ".desc=");
+ }
+ this.achievementList.put(textId, achievement);
+ return achievement;
+ }
+
+ public Achievement registerAchievement(String textId, int x, int y, ItemStack icon, String requirement,
+ boolean special) {
+ if (!GT_Mod.gregtechproxy.mAchievements) {
+ return null;
+ }
+ Achievement achievement = new Achievement(
+ textId,
+ textId,
+ this.adjX + x,
+ this.adjY + y,
+ icon,
+ getAchievement(requirement));
+ if (special) {
+ achievement.setSpecial();
+ }
+ ((StatBase) achievement).registerStat();
+ if (GT_Values.D2) {
+ GT_Log.out.println("achievement." + textId + "=");
+ GT_Log.out.println("achievement." + textId + ".desc=");
+ }
+ this.achievementList.put(textId, achievement);
+ return achievement;
+ }
+
+ public Achievement registerOreAchievement(Materials aMaterial) {
+ return null;
+ }
+
+ public Achievement registerAssAchievement(GT_Recipe recipe) {
+ if (recipe == null) {
+ GT_Mod.GT_FML_LOGGER.error("Invalid achievement registration attempt for null recipe", new Exception());
+ return null;
+ }
+ if (recipe.getOutput(0) == null) {
+ GT_Mod.GT_FML_LOGGER
+ .error("Invalid achievement registration attempt for recipe with null output", new Exception());
+ return null;
+ }
+ if (this.achievementList.get(
+ recipe.getOutput(0)
+ .getUnlocalizedName())
+ == null) {
+ assReg++;
+ return registerAchievement(
+ recipe.getOutput(0)
+ .getUnlocalizedName(),
+ -(11 + assReg % 5),
+ ((assReg) / 5) - 8,
+ recipe.getOutput(0),
+ AchievementList.openInventory,
+ false);
+ }
+ return null;
+ }
+
+ public void issueAchievement(EntityPlayer entityplayer, String textId) {
+ if (entityplayer == null || !GT_Mod.gregtechproxy.mAchievements) {
+ return;
+ }
+ entityplayer.triggerAchievement(this.achievementList.get(textId));
+ }
+
+ public Achievement getAchievement(String textId) {
+ if (this.achievementList.containsKey(textId)) {
+ return this.achievementList.get(textId);
+ }
+ return null;
+ }
+
+ public void issueAchivementHatch(EntityPlayer player, ItemStack stack) {
+ if (player == null || stack == null) {
+ return;
+ }
+ ItemData data = GT_OreDictUnificator.getItemData(stack);
+
+ if ((data != null) && (data.mPrefix == OrePrefixes.ingot)) {
+ if (data.mMaterial.mMaterial == Materials.Aluminium) {
+ issueAchievement(player, "gtaluminium");
+ } else if (data.mMaterial.mMaterial == Materials.Titanium) {
+ issueAchievement(player, "titan");
+ } else if (data.mMaterial.mMaterial == Materials.BlueSteel) {
+ issueAchievement(player, "complexalloys");
+ } else if (data.mMaterial.mMaterial == Materials.Tungsten) {
+ issueAchievement(player, "tungsten");
+ } else if (data.mMaterial.mMaterial == Materials.Osmium) {
+ issueAchievement(player, "osmium");
+ } else if (data.mMaterial.mMaterial == Materials.TungstenSteel) {
+ issueAchievement(player, "tungstensteel");
+ } else if (data.mMaterial.mMaterial == Materials.HSSG) {
+ issueAchievement(player, "hssg");
+ } else if (data.mMaterial.mMaterial == Materials.Naquadah) {
+ issueAchievement(player, "stargatematerial");
+ } else if (data.mMaterial.mMaterial == Materials.NaquadahAlloy) {
+ issueAchievement(player, "alienmetallurgy");
+ } else if (data.mMaterial.mMaterial == Materials.Naquadria) {
+ issueAchievement(player, "finalpreparations");
+ }
+ }
+ if (stack.getUnlocalizedName()
+ .equals("ic2.itemPartIndustrialDiamond")) {
+ issueAchievement(player, "artificaldia");
+ issueAchievement(player, "buildCoalDiamond");
+ }
+ }
+
+ public void issueAchivementHatchFluid(EntityPlayer player, FluidStack fluid) {
+ if (player == null || fluid == null) {
+ return;
+ }
+ switch (fluid.getFluid()
+ .getUnlocalizedName()) {
+ case "fluid.plasma.helium" -> issueAchievement(player, "fusion");
+ case "fluid.molten.europium" -> issueAchievement(player, "advancing");
+ case "fluid.molten.naquadah" -> issueAchievement(player, "stargateliquid");
+ case "fluid.molten.americium" -> issueAchievement(player, "tothelimit");
+ case "fluid.molten.neutronium" -> issueAchievement(player, "denseaspossible");
+ case "fluid.plasma.nitrogen" -> issueAchievement(player, "higherefficency");
+ }
+ }
+
+ @SubscribeEvent
+ public void onCrafting(ItemCraftedEvent event) {
+ EntityPlayer player = event.player;
+ ItemStack stack = event.crafting;
+ if (player == null || stack == null) {
+ return;
+ }
+ ItemData data = GT_OreDictUnificator.getItemData(stack);
+ if (data != null) {
+ if (data.mPrefix == OrePrefixes.dust && data.mMaterial.mMaterial == Materials.Bronze) {
+ issueAchievement(player, "bronze");
+ }
+ }
+ switch (stack.getUnlocalizedName()) {
+ case "gt.metaitem.01.2300" -> issueAchievement(player, "bronze");
+ case "gt.metaitem.01.32700" -> issueAchievement(player, "smallparts");
+ case "gt.metaitem.01.32702" -> issueAchievement(player, "bettercircuits");
+ case "gt.metaitem.01.23354" -> issueAchievement(player, "magneticiron");
+ case "gt.metaitem.01.32600" -> {
+ issueAchievement(player, "lvmotor");
+ issueAchievement(player, "buildCable");
+ }
+ case "gt.metaitem.01.32610" -> issueAchievement(player, "pumpcover");
+ case "gt.metaitem.01.32630" -> issueAchievement(player, "transport");
+ case "gt.metaitem.01.32650" -> issueAchievement(player, "complexmachines");
+ case "gt.metaitem.01.32670" -> issueAchievement(player, "hightech");
+ case "ic2.blockCrop" -> issueAchievement(player, "crops");
+ case "ic2.itemPartCircuit" -> issueAchievement(player, "gtbasiccircuit");
+ case "ic2.itemPartCircuitAdv" -> issueAchievement(player, "stepforward");
+ case "gt.blockmachines.boiler.solar" -> issueAchievement(player, "simplyeco");
+ case "gt.blockmachines.boiler.bronze" -> issueAchievement(player, "firststeam");
+ case "gt.blockmachines.boiler.steel" -> issueAchievement(player, "highpressure");
+ case "gt.blockmachines.bronzemachine.macerator" -> {
+ issueAchievement(player, "macerator");
+ issueAchievement(player, "buildMacerator");
+ }
+ case "gt.blockmachines.bronzemachine.alloysmelter.tier.3" -> issueAchievement(player, "buildIndFurnace");
+ case "gt.blockmachines.bronzemachine.alloysmelter" -> {
+ issueAchievement(player, "alloysmelter");
+ issueAchievement(player, "buildElecFurnace");
+ }
+
+ case "gt.blockmachines.bronzemachine.extractor" -> {
+ issueAchievement(player, "extract");
+ issueAchievement(player, "buildCompressor");
+ issueAchievement(player, "buildExtractor");
+ }
+ case "gt.blockmachines.basicmachine.pump.tier.03" -> issueAchievement(player, "slurp");
+ case "gt.blockmachines.multimachine.blastfurnace" -> issueAchievement(player, "ebf");
+ case "gt.blockmachines.hatch.energy.tier.02" -> issueAchievement(player, "upgradeebf");
+ case "gt.blockmachines.multimachine.multifurnace" -> issueAchievement(player, "highpowersmelt");
+ case "gt.blockmachines.hatch.energy.tier.01" -> issueAchievement(player, "energyhatch");
+ case "gt.blockmachines.multimachine.processingarray" -> issueAchievement(player, "factory");
+ case "gt.blockmachines.basicgenerator.magicenergyconverter.tier.01" -> issueAchievement(player, "magic");
+ case "gt.blockmachines.basicgenerator.magicenergyabsorber.tier.03" -> issueAchievement(player, "highmage");
+ case "gt.blockmachines.basicgenerator.plasmagenerator.tier.07" -> issueAchievement(
+ player,
+ "fullefficiency");
+ case "gt.blockmachines.multimachine.largeturbine" -> issueAchievement(player, "muchsteam");
+ case "gt.blockmachines.multimachine.largehpturbine" -> issueAchievement(player, "efficientsteam");
+ case "gt.blockmachines.multimachine.cleanroom" -> issueAchievement(player, "gtcleanroom");
+ case "gt.neutronreflector" -> issueAchievement(player, "reflect");
+ case "gt.blockcasings5.1" -> issueAchievement(player, "upgrade");
+ case "gt.blockcasings5.2" -> issueAchievement(player, "upgrade2");
+ case "gt.blockcasings5.3" -> issueAchievement(player, "upgrade3");
+ case "gt.blockcasings5.4" -> issueAchievement(player, "upgrade4");
+ case "gt.blockcasings5.5" -> issueAchievement(player, "upgrade5");
+ case "gt.blockcasings5.6" -> issueAchievement(player, "over9000");
+ case "gt.blockcasings.15" -> issueAchievement(player, "conducting");
+ }
+
+ if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.")) {
+ if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.basicmachine.arcfurnace.tier.")) {
+ issueAchievement(player, "recycling");
+ } else if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.basicmachine.disassembler.tier.")) {
+ issueAchievement(player, "repair");
+
+ }
+
+ else if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.automation.superbuffer.tier.")) {
+ issueAchievement(player, "superbuffer");
+ } else if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.quantum.tank.tier.")) {
+ issueAchievement(player, "whereistheocean");
+ } else if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.quantum.chest.tier.")) {
+ issueAchievement(player, "newstorage");
+ } else if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.basicmachine.hammer.tier.")) {
+ issueAchievement(player, "cheapermac");
+ } else if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.automation.chestbuffer.tier.")) {
+ issueAchievement(player, "buffer");
+ issueAchievement(player, "buildBatBox");
+ if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.automation.chestbuffer.tier.3")) {
+ issueAchievement(player, "buildMFE");
+ }
+ } else if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.basicgenerator.steamturbine.tier.")) {
+ issueAchievement(player, "steampower");
+ issueAchievement(player, "buildGenerator");
+ } else if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.basicmachine.assembler.tier.")) {
+ issueAchievement(player, "avengers");
+ } else if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.batterybuffer.")) {
+ issueAchievement(player, "batterys");
+ } else if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.basicmachine.amplifab.tier.")) {
+ issueAchievement(player, "amplifier");
+ } else if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.basicmachine.massfab.tier.")) {
+ issueAchievement(player, "universal");
+ issueAchievement(player, "buildMassFab");
+ } else if (stack.getUnlocalizedName()
+ .startsWith("gt.blockmachines.basicgenerator.naquadah.tier.")) {
+ issueAchievement(player, "alienpower");
+ } else if (stack.getUnlocalizedName()
+ .startsWith(
+ "gt.blockmachines.basicmachine.replicator.tier.")) {
+ issueAchievement(player, "replication");
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void onSmelting(ItemSmeltedEvent event) {
+ EntityPlayer player = event.player;
+ ItemStack stack = event.smelting;
+ if (player == null || stack == null) {
+ return;
+ }
+ if (stack.getItem() == Items.bread) {
+ event.player.triggerAchievement(AchievementList.makeBread);
+ }
+ }
+
+ @SubscribeEvent
+ public void onItemPickup(EntityItemPickupEvent event) {
+ EntityPlayer player = event.entityPlayer;
+ ItemStack stack = event.item.getEntityItem();
+ if (player == null || stack == null) {
+ return;
+ }
+ ItemData data = GT_OreDictUnificator.getItemData(stack);
+ if (data != null && data.mPrefix != null) {
+ if (data.mPrefix == OrePrefixes.dust) {
+ if (data.mMaterial.mMaterial == Materials.Lutetium) {
+ issueAchievement(player, "newmetal");
+ }
+ if (data.mMaterial.mMaterial != Materials.Gunpowder) {
+ issueAchievement(player, "cleandust");
+ }
+ } else if (data.mPrefix.name()
+ .startsWith("ore")) {
+ int data_getAllMaterialStacks_sS = data.getAllMaterialStacks()
+ .size();
+ for (int i = 0; i < data_getAllMaterialStacks_sS; i++) {
+ issueAchievement(
+ player,
+ data.getAllMaterialStacks()
+ .get(i).mMaterial.mName);
+ if (data.getAllMaterialStacks()
+ .get(i).mMaterial == Materials.AnyIron) {
+ issueAchievement(player, "iron");
+ }
+ if (data.getAllMaterialStacks()
+ .get(i).mMaterial == Materials.Copper
+ || data.getAllMaterialStacks()
+ .get(i).mMaterial == Materials.Tin) {
+ issueAchievement(event.entityPlayer, "mineOre");
+ }
+ }
+ } else if (data.mPrefix == OrePrefixes.crushed) {
+ issueAchievement(player, "crushed");
+ } else if (data.mPrefix == OrePrefixes.crushedPurified) {
+ issueAchievement(player, "washing");
+ } else if (data.mPrefix == OrePrefixes.crushedCentrifuged) {
+ issueAchievement(player, "spinit");
+ } else if (data.mMaterial.mMaterial == Materials.Steel) {
+ if (data.mPrefix == OrePrefixes.ingot && stack.stackSize == stack.getMaxStackSize()) {
+ issueAchievement(player, "steel");
+ } else if (data.mPrefix == OrePrefixes.nugget && Thaumcraft.isModLoaded()
+ && ThaumcraftApiHelper.isResearchComplete(player.getDisplayName(), "GT_IRON_TO_STEEL")) {
+ issueAchievement(player, "steel");
+ }
+ // } else if (data.mPrefix == OrePrefixes.circuit && data.mMaterial.mMaterial ==
+ // Materials.Advanced) {
+ // issueAchievement(player, "stepforward");
+ }
+ }
+ // GT_FML_LOGGER.info(stack.getUnlocalizedName());
+ switch (stack.getUnlocalizedName()) {
+ case "gt.metaitem.02.32500" -> issueAchievement(player, "havestlead");
+ case "gt.metaitem.02.32501" -> issueAchievement(player, "havestsilver");
+ case "gt.metaitem.02.32503" -> issueAchievement(player, "havestiron");
+ case "gt.metaitem.02.32504" -> issueAchievement(player, "havestgold");
+ case "gt.metaitem.02.32530" -> issueAchievement(player, "havestcopper");
+ case "gt.metaitem.02.32540" -> issueAchievement(player, "havesttin");
+ case "gt.metaitem.02.32510" -> issueAchievement(player, "havestoil");
+ case "gt.metaitem.02.32511" -> issueAchievement(player, "havestemeralds");
+ case "gt.metaitem.03.32082" -> issueAchievement(player, "energyflow");
+ case "gt.metaitem.01.32702" -> issueAchievement(player, "bettercircuits");
+ case "gt.metaitem.01.32707" -> issueAchievement(player, "datasaving");
+ case "gt.metaitem.01.32597" -> issueAchievement(player, "orbs");
+ case "gt.metaitem.01.32599" -> issueAchievement(player, "thatspower");
+ case "gt.metaitem.01.32598" -> issueAchievement(player, "luck");
+ case "gt.metaitem.01.32749" -> issueAchievement(player, "closeit");
+ case "gt.metaitem.01.32730" -> issueAchievement(player, "manipulation");
+ case "gt.metaitem.01.32729" -> issueAchievement(player, "filterregulate");
+ case "gt.metaitem.01.32605" -> issueAchievement(player, "whatnow");
+ case "gt.metaitem.01.32736" -> issueAchievement(player, "zpmage");
+ case "gt.metaitem.01.32737" -> issueAchievement(player, "uvage");
+ case "gt.metaitem.03.32030" -> issueAchievement(player, "gtmonosilicon");
+ case "gt.metaitem.03.32036" -> issueAchievement(player, "gtlogicwafer");
+ case "gt.metaitem.01.32701" -> issueAchievement(player, "gtlogiccircuit");
+ case "gt.metaitem.03.32085" -> issueAchievement(player, "gtquantumprocessor");
+ case "gt.metaitem.03.32089" -> issueAchievement(player, "gtcrystalprocessor");
+ case "gt.metaitem.03.32092" -> issueAchievement(player, "gtwetware");
+ case "gt.metaitem.03.32095" -> issueAchievement(player, "gtwetmain");
+ case "gt.Thoriumcell" -> issueAchievement(player, "newfuel");
+ case "ic2.itemPartCircuitAdv" -> issueAchievement(player, "stepforward");
+ case "gt.blockcasings5.1" -> issueAchievement(player, "upgrade");
+ case "gt.blockcasings5.2" -> issueAchievement(player, "upgrade2");
+ case "gt.blockcasings5.3" -> issueAchievement(player, "upgrade3");
+ case "gt.blockcasings5.4" -> issueAchievement(player, "upgrade4");
+ case "gt.blockcasings5.5" -> issueAchievement(player, "upgrade5");
+ case "gt.blockcasings5.6" -> issueAchievement(player, "over9000");
+ case "gt.blockcasings.15" -> issueAchievement(player, "conducting");
+ case "gt.metaitem.01.32761" -> { // Debug Scanner pickup shows all assline recipes.
+ if (player.capabilities.isCreativeMode) {
+ for (GT_Recipe recipe : RecipeMaps.assemblylineVisualRecipes.getAllRecipes()) {
+ issueAchievement(
+ player,
+ recipe.getOutput(0)
+ .getUnlocalizedName());
+ recipe.mHidden = false;
+ }
+ }
+ }
+ }
+
+ if ((stack.getItem() == Ic2Items.quantumBodyarmor.getItem())
+ || (stack.getItem() == Ic2Items.quantumBoots.getItem())
+ || (stack.getItem() == Ic2Items.quantumHelmet.getItem())
+ || (stack.getItem() == Ic2Items.quantumLeggings.getItem())) {
+ issueAchievement(player, "buildQArmor");
+ }
+
+ for (GT_Recipe recipe : RecipeMaps.assemblylineVisualRecipes.getAllRecipes()) {
+ if (recipe.getOutput(0)
+ .getUnlocalizedName()
+ .equals(stack.getUnlocalizedName())) {
+ issueAchievement(
+ player,
+ recipe.getOutput(0)
+ .getUnlocalizedName());
+ recipe.mHidden = false;
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/misc/GT_BeeDefinition.java b/src/main/java/gregtech/loaders/misc/GT_BeeDefinition.java
new file mode 100644
index 0000000000..f1afe6c3a2
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/GT_BeeDefinition.java
@@ -0,0 +1,2766 @@
+package gregtech.loaders.misc;
+
+import static forestry.api.apiculture.EnumBeeChromosome.CAVE_DWELLING;
+import static forestry.api.apiculture.EnumBeeChromosome.EFFECT;
+import static forestry.api.apiculture.EnumBeeChromosome.FERTILITY;
+import static forestry.api.apiculture.EnumBeeChromosome.FLOWERING;
+import static forestry.api.apiculture.EnumBeeChromosome.FLOWER_PROVIDER;
+import static forestry.api.apiculture.EnumBeeChromosome.HUMIDITY_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.LIFESPAN;
+import static forestry.api.apiculture.EnumBeeChromosome.NOCTURNAL;
+import static forestry.api.apiculture.EnumBeeChromosome.SPECIES;
+import static forestry.api.apiculture.EnumBeeChromosome.SPEED;
+import static forestry.api.apiculture.EnumBeeChromosome.TEMPERATURE_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.TERRITORY;
+import static forestry.api.apiculture.EnumBeeChromosome.TOLERANT_FLYER;
+import static forestry.api.core.EnumHumidity.ARID;
+import static forestry.api.core.EnumHumidity.DAMP;
+import static forestry.api.core.EnumTemperature.COLD;
+import static forestry.api.core.EnumTemperature.HELLISH;
+import static forestry.api.core.EnumTemperature.HOT;
+import static forestry.api.core.EnumTemperature.ICY;
+import static forestry.api.core.EnumTemperature.NORMAL;
+import static forestry.api.core.EnumTemperature.WARM;
+import static forestry.core.genetics.alleles.EnumAllele.Fertility;
+import static forestry.core.genetics.alleles.EnumAllele.Flowering;
+import static forestry.core.genetics.alleles.EnumAllele.Flowers;
+import static forestry.core.genetics.alleles.EnumAllele.Lifespan;
+import static forestry.core.genetics.alleles.EnumAllele.Speed;
+import static forestry.core.genetics.alleles.EnumAllele.Territory;
+import static forestry.core.genetics.alleles.EnumAllele.Tolerance;
+import static gregtech.api.enums.Mods.AdvancedSolarPanel;
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.Avaritia;
+import static gregtech.api.enums.Mods.AvaritiaAddons;
+import static gregtech.api.enums.Mods.BiomesOPlenty;
+import static gregtech.api.enums.Mods.CropsPlusPlus;
+import static gregtech.api.enums.Mods.EnderStorage;
+import static gregtech.api.enums.Mods.ExtraBees;
+import static gregtech.api.enums.Mods.ExtraCells2;
+import static gregtech.api.enums.Mods.ExtraUtilities;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GalacticraftCore;
+import static gregtech.api.enums.Mods.GalacticraftMars;
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.HardcoreEnderExpansion;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.enums.Mods.MagicBees;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.PamsHarvestCraft;
+import static gregtech.api.enums.Mods.TaintedMagic;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.enums.Mods.ThaumicBases;
+import static gregtech.api.enums.Mods.TinkerConstruct;
+import static gregtech.loaders.misc.GT_BeeDefinitionReference.EXTRABEES;
+import static gregtech.loaders.misc.GT_BeeDefinitionReference.FORESTRY;
+import static gregtech.loaders.misc.GT_BeeDefinitionReference.GENDUSTRY;
+import static gregtech.loaders.misc.GT_BeeDefinitionReference.GREGTECH;
+import static gregtech.loaders.misc.GT_BeeDefinitionReference.MAGICBEES;
+
+import java.awt.Color;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.function.Consumer;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import org.apache.commons.lang3.text.WordUtils;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.EnumBeeType;
+import forestry.api.apiculture.IAlleleBeeEffect;
+import forestry.api.apiculture.IAlleleBeeSpecies;
+import forestry.api.apiculture.IBee;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeMutationCustom;
+import forestry.api.core.EnumHumidity;
+import forestry.api.core.EnumTemperature;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IAlleleFlowers;
+import forestry.api.genetics.IMutationCustom;
+import forestry.apiculture.genetics.Bee;
+import forestry.apiculture.genetics.IBeeDefinition;
+import forestry.apiculture.genetics.alleles.AlleleEffect;
+import forestry.core.genetics.alleles.AlleleHelper;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_JubilanceMegaApiary;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.common.bees.GT_AlleleBeeSpecies;
+import gregtech.common.bees.GT_Bee_Mutation;
+import gregtech.common.items.CombType;
+import gregtech.common.items.DropType;
+import gregtech.common.items.PropolisType;
+
+/**
+ * Bride Class for Lambdas
+ */
+class GT_BeeDefinitionReference {
+
+ protected static final byte FORESTRY = 0;
+ protected static final byte EXTRABEES = 1;
+ protected static final byte GENDUSTRY = 2;
+ protected static final byte MAGICBEES = 3;
+ protected static final byte GREGTECH = 4;
+
+ private GT_BeeDefinitionReference() {}
+}
+
+public enum GT_BeeDefinition implements IBeeDefinition {
+
+ // organic
+ CLAY(GT_BranchDefinition.ORGANIC, "Clay", true, new Color(0xC8C8DA), new Color(0x0000FF), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 0), 0.30f);
+ beeSpecies.addProduct(new ItemStack(Items.clay_ball, 1), 0.15f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(BiomesOPlenty.ID, "mudball", 1, 0), 0.05f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.VANILLA);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis
+ .registerMutation(getSpecies(FORESTRY, "Industrious"), getSpecies(FORESTRY, "Diligent"), 10);
+ tMutation.requireResource(Blocks.clay, 0); // blockStainedHardenedClay
+ }),
+ SLIMEBALL(GT_BranchDefinition.ORGANIC, "SlimeBall", true, new Color(0x4E9E55), new Color(0x00FF15), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 15), 0.30f);
+ beeSpecies.addProduct(new ItemStack(Items.slime_ball, 1), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.STICKY), 0.05f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ if (TinkerConstruct.isModLoaded()) {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(TinkerConstruct.ID, "strangeFood", 1, 0), 0.10f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(TinkerConstruct.ID, "slime.gel", 1, 2), 0.02f);
+ }
+ }, template -> {
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.MUSHROOMS);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "water"));
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Marshy"), CLAY, 7);
+ if (TinkerConstruct.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(TinkerConstruct.ID, "slime.gel"), 1);
+ }),
+ PEAT(GT_BranchDefinition.ORGANIC, "Peat", true, new Color(0x906237), new Color(0x58300B), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.LIGNIE), 0.30f);
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 0), 0.15f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(Forestry.ID, "peat", 1, 0), 0.15f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(Forestry.ID, "mulch", 1, 0), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+ }, dis -> dis.registerMutation(getSpecies(FORESTRY, "Rural"), CLAY, 10)),
+ STICKYRESIN(GT_BranchDefinition.ORGANIC, "StickyResin", true, new Color(0x2E8F5B), new Color(0xDCC289),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 0), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.STICKY), 0.15f);
+ beeSpecies.addSpecialty(ItemList.IC2_Resin.get(1), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(SLIMEBALL, PEAT, 15);
+ tMutation.requireResource("logRubber");
+ }),
+ COAL(GT_BranchDefinition.ORGANIC, "Coal", true, new Color(0x666666), new Color(0x525252), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.LIGNIE), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.COAL), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.CACTI);
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.DOWN_1);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectCreeper);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Industrious"), PEAT, 9);
+ tMutation.requireResource("blockCoal");
+ }),
+ OIL(GT_BranchDefinition.ORGANIC, "Oil", true, new Color(0x4C4C4C), new Color(0x333333), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 0), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.OIL), 0.75f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL);
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "water"));
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+ }, dis -> dis.registerMutation(COAL, STICKYRESIN, 4)),
+ SANDWICH(GT_BranchDefinition.ORGANIC, "Sandwich", true, new Color(0x32CD32), new Color(0xDAA520), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 9), 0.15f);
+ beeSpecies.addSpecialty(ItemList.Food_Sliced_Cucumber.get(1), 0.05f);
+ beeSpecies.addSpecialty(ItemList.Food_Sliced_Onion.get(1), 0.05f);
+ beeSpecies.addSpecialty(ItemList.Food_Sliced_Tomato.get(1), 0.05f);
+ beeSpecies.addSpecialty(ItemList.Food_Sliced_Cheese.get(1), 0.05f);
+ beeSpecies.addSpecialty(new ItemStack(Items.cooked_porkchop, 1, 0), 0.05f);
+ beeSpecies.addSpecialty(new ItemStack(Items.cooked_beef, 1, 0), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOW);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_2);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectFertile);
+ AlleleHelper.instance.set(template, TERRITORY, Territory.LARGE);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
+ }, dis -> dis.registerMutation(getSpecies(FORESTRY, "Agrarian"), getSpecies(MAGICBEES, "TCBatty"), 10)),
+ ASH(GT_BranchDefinition.ORGANIC, "Ash", true, new Color(0x1e1a18), new Color(0xc6c6c6), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 9), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ASH), 0.15f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.NORMAL);
+ AlleleHelper.instance.set(template, TERRITORY, Territory.LARGE);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(COAL, CLAY, 10);
+ tMutation.restrictTemperature(HELLISH);
+ }),
+ APATITE(GT_BranchDefinition.ORGANIC, "Apatite", true, new Color(0xc1c1f6), new Color(0x676784), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 9), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.APATITE), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(WARM);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(ASH, COAL, 10);
+ tMutation.requireResource("blockApatite");
+ }),
+ FERTILIZER(GT_BranchDefinition.ORGANIC, "Fertilizer", true, new Color(0x7fcef5), new Color(0x654525),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 9), 0.15f);
+ beeSpecies.addSpecialty(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Ash, 1), 0.2f);
+ beeSpecies.addSpecialty(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1), 0.2f);
+ beeSpecies.addSpecialty(ItemList.FR_Fertilizer.get(1), 0.3f);
+ beeSpecies.addSpecialty(ItemList.IC2_Fertilizer.get(1), 0.3f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(WARM);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.WHEAT);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.FASTER);
+ }, dis -> dis.registerMutation(ASH, APATITE, 8)),
+ // Phosphorus bee, Humidity: normal, Temperature: Hot, Parents: Apatite & Ash, Mutationrate: 12%, Combrate: 55%
+ PHOSPHORUS(GT_BranchDefinition.ORGANIC, "Phosphorus", false, new Color(0xFFC826), new Color(0xC1C1F6),
+ beeSpecies -> {
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.PHOSPHORUS), 0.35f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(HOT);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(APATITE, ASH, 12);
+ tMutation.restrictTemperature(HOT);
+ tMutation.requireResource(GameRegistry.findBlock(GregTech.ID, "gt.blockgem2"), 8);
+ }),
+ // Tea bee, Humidity: normal, Parents: Ash and Fertilizer, Mutationrate: 10%, combrate: 10%
+ TEA(GT_BranchDefinition.ORGANIC, "Tea", false, new Color(0x65D13A), new Color(0x9a9679), beeSpecies -> {
+ beeSpecies.addProduct(
+ GT_ModHandler.getModItem(PamsHarvestCraft.ID, "tealeafItem", 1, ItemList.Crop_Drop_TeaLeaf.get(1)),
+ 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST),
+ dis -> dis.registerMutation(FERTILIZER, ASH, 10)),
+ // Mica bee, Humidity: normal, Parents: Silicon & PEAT, Mutationrate: 15%, Combrate: 25%
+ MICA(GT_BranchDefinition.ORGANIC, "Mica", false, new Color(0xFFC826), new Color(0xC1C1F6), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MICA), 0.25f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(HOT);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(PEAT, getSpecies(MAGICBEES, "Silicon"), 15);
+ tMutation.requireResource(GameRegistry.findBlock(GregTech.ID, "gt.blockcasings5"), 0);
+ }),
+
+ // gems
+ REDSTONE(GT_BranchDefinition.GEM, "Redstone", true, new Color(0x7D0F0F), new Color(0xD11919), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.REDSTONE), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.RAREEARTH), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis
+ .registerMutation(getSpecies(FORESTRY, "Industrious"), getSpecies(FORESTRY, "Demonic"), 10);
+ tMutation.requireResource("blockRedstone");
+ }),
+ LAPIS(GT_BranchDefinition.GEM, "Lapis", true, new Color(0x1947D1), new Color(0x476CDA), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.LAPIS), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis
+ .registerMutation(getSpecies(FORESTRY, "Demonic"), getSpecies(FORESTRY, "Imperial"), 10);
+ tMutation.requireResource("blockLapis");
+ }),
+ CERTUS(GT_BranchDefinition.GEM, "CertusQuartz", true, new Color(0x57CFFB), new Color(0xBBEEFF), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.CERTUS), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Hermitic"), LAPIS, 10);
+ tMutation.requireResource(GameRegistry.findBlock(AppliedEnergistics2.ID, "tile.BlockQuartz"), 0);
+ }),
+ FLUIX(GT_BranchDefinition.GEM, "FluixDust", true, new Color(0xA375FF), new Color(0xB591FF), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.FLUIX), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, LAPIS, 7);
+ tMutation.requireResource(GameRegistry.findBlock(AppliedEnergistics2.ID, "tile.BlockFluix"), 0);
+ }),
+ DIAMOND(GT_BranchDefinition.GEM, "Diamond", false, new Color(0xCCFFFF), new Color(0xA3CCCC), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.DIAMOND), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(HOT);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(CERTUS, COAL, 3);
+ tMutation.requireResource("blockDiamond");
+ }),
+ RUBY(GT_BranchDefinition.GEM, "Ruby", false, new Color(0xE6005C), new Color(0xCC0052), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.RUBY), 0.15f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.REDGARNET), 0.05f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, DIAMOND, 5);
+ tMutation.requireResource("blockRuby");
+ }),
+ SAPPHIRE(GT_BranchDefinition.GEM, "Sapphire", true, new Color(0x0033CC), new Color(0x00248F), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SAPPHIRE), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(CERTUS, LAPIS, 5);
+ tMutation.requireResource(GregTech_API.sBlockGem2, 12);
+ }),
+ OLIVINE(GT_BranchDefinition.GEM, "Olivine", true, new Color(0x248F24), new Color(0xCCFFCC), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.OLIVINE), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.MAGNESIUM), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER),
+ dis -> dis.registerMutation(CERTUS, getSpecies(FORESTRY, "Ended"), 5)),
+ EMERALD(GT_BranchDefinition.GEM, "Emerald", false, new Color(0x248F24), new Color(0x2EB82E), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.EMERALD), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ALUMINIUM), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(OLIVINE, DIAMOND, 4);
+ tMutation.requireResource("blockEmerald");
+ }),
+ REDGARNET(GT_BranchDefinition.GEM, "RedGarnet", false, new Color(0xBD4C4C), new Color(0xECCECE), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.REDGARNET), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.PYROPE), 0.05f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(WARM);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(DIAMOND, RUBY, 4);
+ tMutation.requireResource("blockGarnetRed");
+ }),
+ YELLOWGARNET(GT_BranchDefinition.GEM, "YellowGarnet", false, new Color(0xA3A341), new Color(0xEDEDCE),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.YELLOWGARNET), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.GROSSULAR), 0.05f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(WARM);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(EMERALD, REDGARNET, 3);
+ tMutation.requireResource("blockGarnetYellow");
+ }),
+ FIRESTONE(GT_BranchDefinition.GEM, "Firestone", false, new Color(0xC00000), new Color(0xFF0000), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STONE), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.FIRESTONE), 0.15f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(WARM);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, RUBY, 4);
+ tMutation.requireResource("blockFirestone");
+ }),
+
+ // Metal Line
+ COPPER(GT_BranchDefinition.METAL, "Copper", true, new Color(0xFF6600), new Color(0xE65C00), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.COPPER), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.GOLD), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Majestic"), CLAY, 13);
+ tMutation.requireResource("blockCopper");
+ }),
+ TIN(GT_BranchDefinition.METAL, "Tin", true, new Color(0xD4D4D4), new Color(0xDDDDDD), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.TIN), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ZINC), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(CLAY, getSpecies(FORESTRY, "Diligent"), 13);
+ tMutation.requireResource("blockTin");
+ }),
+ LEAD(GT_BranchDefinition.METAL, "Lead", true, new Color(0x666699), new Color(0xA3A3CC), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.LEAD), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SULFUR), 0.05f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(WARM);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(COAL, COPPER, 13);
+ tMutation.requireResource("blockLead");
+ }),
+ IRON(GT_BranchDefinition.METAL, "Iron", true, new Color(0xDA9147), new Color(0xDE9C59), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.IRON), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.TIN), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(TIN, COPPER, 13);
+ tMutation.requireResource("blockIron");
+ }),
+ STEEL(GT_BranchDefinition.METAL, "Steel", true, new Color(0x808080), new Color(0x999999), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STEEL), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.IRON), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(WARM);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(IRON, COAL, 10);
+ tMutation.requireResource(GregTech_API.sBlockMetal6, 13);
+ }),
+ NICKEL(GT_BranchDefinition.METAL, "Nickel", true, new Color(0x8585AD), new Color(0x8585AD), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NICKEL), 0.15f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.PLATINUM), 0.02f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(IRON, COPPER, 13);
+ tMutation.requireResource("blockNickel");
+ }),
+ ZINC(GT_BranchDefinition.METAL, "Zinc", true, new Color(0xF0DEF0), new Color(0xF2E1F2), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.ZINC), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.GALLIUM), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(IRON, TIN, 13);
+ tMutation.requireResource("blockZinc");
+ }),
+ SILVER(GT_BranchDefinition.METAL, "Silver", true, new Color(0xC2C2D6), new Color(0xCECEDE), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SILVER), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SULFUR), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(COLD);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(LEAD, TIN, 10);
+ tMutation.requireResource("blockSilver");
+ }),
+ CRYOLITE(GT_BranchDefinition.METAL, "Cryolite", true, new Color(0xBFEFFF), new Color(0x73B9D0), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CRYOLITE), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SILVER), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(WARM);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.FASTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(LEAD, SILVER, 9);
+ tMutation.requireResource("blockCryolite");
+ }),
+ GOLD(GT_BranchDefinition.METAL, "Gold", true, new Color(0xEBC633), new Color(0xEDCC47), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.GOLD), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NICKEL), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(WARM);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(LEAD, COPPER, 13);
+ tMutation.requireResource("blockGold");
+ tMutation.restrictTemperature(HOT);
+ }),
+ ARSENIC(GT_BranchDefinition.METAL, "Arsenic", true, new Color(0x736C52), new Color(0x292412), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.ARSENIC), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(WARM);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(ZINC, SILVER, 10);
+ tMutation.requireResource("blockArsenic");
+ }),
+
+ // Rare Metals
+ ALUMINIUM(GT_BranchDefinition.RAREMETAL, "Aluminium", true, new Color(0xB8B8FF), new Color(0xD6D6FF),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.ALUMINIUM), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.BAUXITE), 0.05f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(NICKEL, ZINC, 9);
+ tMutation.requireResource("blockAluminium");
+ }),
+ TITANIUM(GT_BranchDefinition.RAREMETAL, "Titanium", true, new Color(0xCC99FF), new Color(0xDBB8FF), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.TITANIUM), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ALMANDINE), 0.05f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, ALUMINIUM, 5);
+ tMutation.requireResource(GregTech_API.sBlockMetal7, 9);
+ }),
+ GLOWSTONE(GT_BranchDefinition.RAREMETAL, "Glowstone", false, new Color(0xE5CA2A), new Color(0xFFBC5E),
+ beeSpecies -> {
+ beeSpecies.addSpecialty(Materials.Glowstone.getDust(1), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL),
+ dis -> dis.registerMutation(REDSTONE, GOLD, 10)),
+ SUNNARIUM(GT_BranchDefinition.RAREMETAL, "Sunnarium", false, new Color(0xFFBC5E), new Color(0xE5CA2A),
+ beeSpecies -> {
+ beeSpecies.addProduct(Materials.Glowstone.getDust(1), 0.30f);
+ beeSpecies.addSpecialty(Materials.Sunnarium.getDust(1), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(GLOWSTONE, GOLD, 5);
+ tMutation.requireResource(GameRegistry.findBlock(GregTech.ID, "gt.blockcasings"), 15);
+ }),
+ CHROME(GT_BranchDefinition.RAREMETAL, "Chrome", true, new Color(0xEBA1EB), new Color(0xF2C3F2), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CHROME), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.MAGNESIUM), 0.05f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(TITANIUM, RUBY, 5);
+ tMutation.requireResource(GregTech_API.sBlockMetal2, 3);
+ }),
+ MANGANESE(GT_BranchDefinition.RAREMETAL, "Manganese", true, new Color(0xD5D5D5), new Color(0xAAAAAA),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MANGANESE), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.IRON), 0.05f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(TITANIUM, ALUMINIUM, 5);
+ tMutation.requireResource(GregTech_API.sBlockMetal4, 6);
+ }),
+ TUNGSTEN(GT_BranchDefinition.RAREMETAL, "Tungsten", false, new Color(0x5C5C8A), new Color(0x7D7DA1), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.TUNGSTEN), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.MOLYBDENUM), 0.05f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Heroic"), MANGANESE, 5);
+ tMutation.requireResource(GregTech_API.sBlockMetal7, 11);
+ }),
+ PLATINUM(GT_BranchDefinition.RAREMETAL, "Platinum", false, new Color(0xE6E6E6), new Color(0xFFFFCC), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.PLATINUM), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.IRIDIUM), 0.02f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(DIAMOND, CHROME, 5);
+ tMutation.requireResource("blockNickel");
+ }),
+ IRIDIUM(GT_BranchDefinition.RAREMETAL, "Iridium", false, new Color(0xDADADA), new Color(0xD1D1E0), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.IRIDIUM), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.OSMIUM), 0.05f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.PALLADIUM), 0.30f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(TUNGSTEN, PLATINUM, 5);
+ tMutation.requireResource(GregTech_API.sBlockMetal3, 12);
+ }),
+ OSMIUM(GT_BranchDefinition.RAREMETAL, "Osmium", false, new Color(0x2B2BDA), new Color(0x8B8B8B), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.OSMIUM), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.IRIDIUM), 0.05f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(TUNGSTEN, PLATINUM, 5);
+ tMutation.requireResource(GregTech_API.sBlockMetal5, 9);
+ }),
+ SALTY(GT_BranchDefinition.RAREMETAL, "Salt", true, new Color(0xF0C8C8), new Color(0xFAFAFA), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SALT), 0.35f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.LITHIUM), 0.05f);
+ beeSpecies.addSpecialty(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Borax, 1L), 0.1f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(WARM);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(CLAY, ALUMINIUM, 5);
+ tMutation.requireResource("blockSalt");
+ }),
+ LITHIUM(GT_BranchDefinition.RAREMETAL, "Lithium", false, new Color(0xF0328C), new Color(0xE1DCFF), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.LITHIUM), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SALT), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(COLD);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(SALTY, ALUMINIUM, 5);
+ tMutation.requireResource("frameGtLithium");
+ }),
+ ELECTROTINE(GT_BranchDefinition.RAREMETAL, "Electrotine", false, new Color(0x1E90FF), new Color(0x3CB4C8),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ELECTROTINE), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.REDSTONE), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWER), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, GOLD, 5);
+ tMutation.requireResource("blockElectrotine");
+ }),
+ // Sulfur bee, Humidity: normal, Temperature: Hot, Parents: PEAT & Ash, Mutationrate: 15%, Combrate: 80%
+ SULFUR(GT_BranchDefinition.RAREMETAL, "Sulfur", false, new Color(0x1E90FF), new Color(0x3CB4C8), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SULFUR), 0.70f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.FIRESTONE), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.NORMAL),
+ dis -> dis.registerMutation(ASH, PEAT, 15)),
+
+ INDIUM(GT_BranchDefinition.RAREMETAL, "Indium", false, new Color(0xFFA9FF), new Color(0x8F5D99), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INDIUM), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(LEAD, OSMIUM, 1);
+ tMutation.requireResource("blockIndium");
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(39, "Venus")); // Venus Dim
+ // Harder mutation that isn't dim locked
+ tMutation = dis.registerMutation(SILVER, OSMIUM, 1);
+ tMutation.requireResource("blockCinobiteA243");
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(60, "Bedrock")); // Thaumic Tinkerer
+ // Bedrock Dim
+ }),
+
+ // IC2
+ COOLANT(GT_BranchDefinition.IC2, "Coolant", false, new Color(0x144F5A), new Color(0x2494A2), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 4), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.COOLANT), 0.15f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOW);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectGlacial);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis
+ .registerMutation(getSpecies(FORESTRY, "Icy"), getSpecies(FORESTRY, "Glacial"), 10);
+ tMutation.requireResource(
+ Block.getBlockFromItem(
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "fluidCoolant", 1)
+ .getItem()),
+ 0);
+ tMutation.restrictTemperature(ICY);
+ }),
+ ENERGY(GT_BranchDefinition.IC2, "Energy", false, new Color(0xC11F1F), new Color(0xEBB9B9), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 12), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENERGY), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(WARM);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.NETHER);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis
+ .registerMutation(getSpecies(FORESTRY, "Demonic"), getSpecies(EXTRABEES, "volcanic"), 10);
+ tMutation.requireResource(
+ Block.getBlockFromItem(
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "fluidHotCoolant", 1)
+ .getItem()),
+ 0);
+ tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(128, "Boneyard Biome")); // Boneyard Biome
+ }),
+ LAPOTRON(GT_BranchDefinition.IC2, "Lapotron", false, new Color(0x6478FF), new Color(0x1414FF), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.LAPIS), 0.20f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENERGY), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.LAPOTRON), 0.10f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(LAPIS, ENERGY, 6);
+ tMutation.requireResource("blockLapis");
+ tMutation.restrictTemperature(ICY);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(28, "Moon")); // moon dim
+ }),
+ PYROTHEUM(GT_BranchDefinition.IC2, "Pyrotheum", false, new Color(0xffebc4), new Color(0xe36400), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.ENERGY), 0.20f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.PYROTHEUM), 0.15f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.NETHER);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, ENERGY, 4);
+ tMutation.restrictTemperature(HELLISH);
+ }),
+ CRYOTHEUM(GT_BranchDefinition.IC2, "Cryotheum", false, new Color(0x2660ff), new Color(0x5af7ff), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.BLIZZ), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.CRYOTHEUM), 0.20f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectSnowing);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, COOLANT, 4);
+ tMutation.restrictTemperature(ICY);
+ }),
+ Explosive(GT_BranchDefinition.IC2, "explosive", false, new Color(0x7E270F), new Color(0x747474), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getIC2Item("industrialTnt", 1L), 0.2f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectSnowing);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(FIRESTONE, COAL, 4);
+ tMutation.requireResource(GameRegistry.findBlock(IndustrialCraft2.ID, "blockITNT"), 0);
+ }),
+ // Alloy
+ REDALLOY(GT_BranchDefinition.GTALLOY, "RedAlloy", false, new Color(0xE60000), new Color(0xB80000), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.REDALLOY), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(COPPER, REDSTONE, 10);
+ tMutation.requireResource("blockRedAlloy");
+ }),
+ REDSTONEALLOY(GT_BranchDefinition.GTALLOY, "RedStoneAlloy", false, new Color(0xA50808), new Color(0xE80000),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.REDSTONEALLOY), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(REDSTONE, REDALLOY, 8);
+ tMutation.requireResource("blockRedstoneAlloy");
+ }),
+ CONDUCTIVEIRON(GT_BranchDefinition.GTALLOY, "ConductiveIron", false, new Color(0xCEADA3), new Color(0x817671),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.CONDUCTIVEIRON), 0.15f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(WARM);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(REDSTONEALLOY, IRON, 8);
+ tMutation.requireResource("blockConductiveIron");
+ }),
+ ENERGETICALLOY(GT_BranchDefinition.GTALLOY, "EnergeticAlloy", false, new Color(0xFF9933), new Color(0xFFAD5C),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENERGETICALLOY), 0.15f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(REDSTONEALLOY, getSpecies(FORESTRY, "Demonic"), 9);
+ tMutation.requireResource("blockEnergeticAlloy");
+ }),
+ VIBRANTALLOY(GT_BranchDefinition.GTALLOY, "VibrantAlloy", false, new Color(0x86A12D), new Color(0xC4F2AE),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.VIBRANTALLOY), 0.15f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.FAST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(ENERGETICALLOY, getSpecies(FORESTRY, "Phantasmal"), 6);
+ tMutation.requireResource("blockVibrantAlloy");
+ tMutation.restrictTemperature(HOT, HELLISH);
+ }),
+ ELECTRICALSTEEL(GT_BranchDefinition.GTALLOY, "ElectricalSteel", false, new Color(0x787878), new Color(0xD8D8D8),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ELECTRICALSTEEL), 0.15f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTER);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(STEEL, getSpecies(FORESTRY, "Demonic"), 9);
+ tMutation.requireResource("blockElectricalSteel");
+ }),
+ DARKSTEEL(GT_BranchDefinition.GTALLOY, "DarkSteel", false, new Color(0x252525), new Color(0x443B44), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.DARKSTEEL), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(COLD);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(ELECTRICALSTEEL, getSpecies(FORESTRY, "Demonic"), 7);
+ tMutation.requireResource("blockDarkSteel");
+ }),
+ PULSATINGIRON(GT_BranchDefinition.GTALLOY, "PulsatingIron", false, new Color(0x6DD284), new Color(0x006600),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 7), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.PULSATINGIRON), 0.15f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(REDALLOY, getSpecies(FORESTRY, "Ended"), 9);
+ tMutation.requireResource("blockPulsatingIron");
+ }),
+ STAINLESSSTEEL(GT_BranchDefinition.GTALLOY, "StainlessSteel", false, new Color(0xC8C8DC), new Color(0x778899),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.STEEL), 0.10f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.STAINLESSSTEEL), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.CHROME), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(HOT);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(CHROME, STEEL, 9);
+ tMutation.requireResource("blockStainlessSteel");
+ }),
+ ENDERIUM(GT_BranchDefinition.GTALLOY, "Enderium", false, new Color(0x599087), new Color(0x2E8B57), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENDERIUM), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.CHROME), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(HOT);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, GT_Bees.speedBlinding);
+ AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "teleport"));
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(PLATINUM, getSpecies(FORESTRY, "Phantasmal"), 3);
+ tMutation.requireResource("blockEnderium");
+ }),
+ BEDROCKIUM(GT_BranchDefinition.GTALLOY, "Bedrockium", false, new Color(0x0C0C0C), new Color(0xC6C6C6),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.20f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.BEDROCKIUM), 0.55f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(HOT);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOW);
+ AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "gravity"));
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(Explosive, DIAMOND, 2);
+ if (ExtraUtilities.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(ExtraUtilities.ID, "block_bedrockium"), 0);
+ }),
+
+ // thaumic
+ THAUMIUMDUST(GT_BranchDefinition.THAUMIC, "ThaumiumDust", true, new Color(0x7A007A), new Color(0x5C005C),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.THAUMIUMDUST), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_2);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectExploration);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.UP_1);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.JUNGLE);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis
+ .registerMutation(getSpecies(MAGICBEES, "TCFire"), getSpecies(FORESTRY, "Edenic"), 10);
+ tMutation.requireResource("blockThaumium");
+ tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(192, "Magical Forest")); // magical
+ // forest
+ }),
+ THAUMIUMSHARD(GT_BranchDefinition.THAUMIC, "ThaumiumShard", true, new Color(0x9966FF), new Color(0xAD85FF),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.THAUMIUMDUST), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.THAUMIUMSHARD), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectGlacial);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMDUST, getSpecies(MAGICBEES, "TCWater"), 10);
+ tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(192, "Magical Forest")); // magical
+ // forest
+ }),
+ AMBER(GT_BranchDefinition.THAUMIC, "Amber", true, new Color(0xEE7700), new Color(0x774B15), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.AMBER), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMDUST, STICKYRESIN, 10);
+ tMutation.requireResource("blockAmber");
+ }),
+ QUICKSILVER(GT_BranchDefinition.THAUMIC, "Quicksilver", true, new Color(0x7A007A), new Color(0x5C005C),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.QUICKSILVER), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.UP_1);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.JUNGLE);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectMiasmic);
+ }, dis -> dis.registerMutation(THAUMIUMDUST, SILVER, 10)),
+ SALISMUNDUS(GT_BranchDefinition.THAUMIC, "SalisMundus", true, new Color(0xF7ADDE), new Color(0x592582),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SALISMUNDUS), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.UP_1);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.JUNGLE);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectMiasmic);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMDUST, THAUMIUMSHARD, 8);
+ tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(192, "Magical Forest")); // magical
+ // forest
+ }),
+ TAINTED(GT_BranchDefinition.THAUMIC, "Tainted", true, new Color(0x904BB8), new Color(0xE800FF), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 3), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.TAINTED), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ AlleleHelper.instance.set(template, CAVE_DWELLING, true);
+ AlleleHelper.instance.set(template, TOLERANT_FLYER, true);
+ AlleleHelper.instance.set(template, FERTILITY, Fertility.LOW);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMDUST, THAUMIUMSHARD, 7);
+ tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(193, "Tainted Land")); // Tainted Land
+ }),
+ MITHRIL(GT_BranchDefinition.THAUMIC, "Mithril", true, new Color(0xF0E68C), new Color(0xFFFFD2), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.PLATINUM), 0.20f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.MITHRIL), 0.125f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ AlleleHelper.instance.set(template, CAVE_DWELLING, true);
+ AlleleHelper.instance.set(template, TOLERANT_FLYER, true);
+ AlleleHelper.instance.set(template, FERTILITY, Fertility.LOW);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
+ }, new Consumer<>() {
+
+ @Override
+ public void accept(GT_BeeDefinition dis) {
+ IBeeMutationCustom tMutation = dis.registerMutation(IO, PLATINUM, 7);
+ tMutation.requireResource(GregTech_API.sBlockMetal4, 10);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(36, "IO")); // IO Dim
+ }
+ }),
+ ASTRALSILVER(GT_BranchDefinition.THAUMIC, "AstralSilver", true, new Color(0xAFEEEE), new Color(0xE6E6FF),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SILVER), 0.20f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ASTRALSILVER), 0.125f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ AlleleHelper.instance.set(template, CAVE_DWELLING, true);
+ AlleleHelper.instance.set(template, TOLERANT_FLYER, true);
+ AlleleHelper.instance.set(template, FERTILITY, Fertility.LOW);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(SILVER, IRON, 3);
+ tMutation.requireResource(GregTech_API.sBlockMetal1, 6);
+ }),
+ THAUMINITE(GT_BranchDefinition.THAUMIC, "Thauminite", true, new Color(0x2E2D79), new Color(0x7581E0),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(MagicBees.ID, "comb", 1, 19), 0.20f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.THAUMINITE), 0.125f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOW);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(MAGICBEES, "TCOrder"), THAUMIUMDUST, 8);
+ if (ThaumicBases.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(ThaumicBases.ID, "thauminiteBlock"), 0);
+ }),
+ SHADOWMETAL(GT_BranchDefinition.THAUMIC, "ShadowMetal", true, new Color(0x100322), new Color(0x100342),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(MagicBees.ID, "comb", 1, 20), 0.20f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SHADOWMETAL), 0.125f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOW);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis
+ .registerMutation(getSpecies(MAGICBEES, "TCChaos"), getSpecies(MAGICBEES, "TCVoid"), 6);
+ if (TaintedMagic.isModLoaded()) {
+ tMutation.requireResource("blockShadow");
+ }
+ }),
+ DIVIDED(GT_BranchDefinition.THAUMIC, "Unstable", true, new Color(0xF0F0F0), new Color(0xDCDCDC), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(ExtraBees.ID, "honeyComb", 1, 61), 0.20f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.DIVIDED), 0.125f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOW);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(DIAMOND, IRON, 3);
+ if (ExtraUtilities.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(ExtraUtilities.ID, "decorativeBlock1"), 5);
+ }),
+ CAELESTIS(GT_BranchDefinition.THAUMIC, "Caelestis", true, new Color(0xF0F0F0), new Color(0xDCDCDC), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CAELESTISRED), 0.60f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CAELESTISBLUE), 0.60f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CAELESTISGREEN), 0.60f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWER);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOW);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ }, dis -> dis.registerMutation(DIAMOND, DIVIDED, 10)),
+ SPARKELING(GT_BranchDefinition.THAUMIC, "NetherStar", true, new Color(0x7A007A), new Color(0xFFFFFF),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(MagicBees.ID, "miscResources", 1, 3), 0.20f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SPARKELING), 0.125f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ AlleleHelper.instance.set(template, CAVE_DWELLING, true);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.NETHER);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectAggressive);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis
+ .registerMutation(getSpecies(MAGICBEES, "Withering"), getSpecies(MAGICBEES, "Draconic"), 1);
+ tMutation.requireResource(GregTech_API.sBlockGem3, 3);
+ tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(9, "END Biome")); // sky end biome
+ }),
+
+ ESSENTIA(GT_BranchDefinition.THAUMIC, "Essentia", true, new Color(0x7A007A), new Color(0xFFFFFF), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(MagicBees.ID, "miscResources", 1, 3), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ }, template -> {
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
+ AlleleHelper.instance.set(template, CAVE_DWELLING, true);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.VANILLA);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectReanimation);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(SHADOWMETAL, SPARKELING, 5);
+ if (Thaumcraft.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 6);
+ }),
+
+ DRAKE(GT_BranchDefinition.THAUMIC, "Drake", true, new Color(0x100322), new Color(0x7A007A), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.DRACONIC), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.AWAKENEDDRACONIUM), 0.20f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
+ }, template -> {
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_3);
+ AlleleHelper.instance.set(template, CAVE_DWELLING, false);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.END);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectDrunkard);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(ESSENTIA, THAUMINITE, 5);
+ tMutation.requireResource(GameRegistry.findBlock(GregTech.ID, "gt.blockcasings5"), 8);
+ }),
+
+ // radioctive
+ URANIUM(GT_BranchDefinition.RADIOACTIVE, "Uranium", true, new Color(0x19AF19), new Color(0x169E16), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.URANIUM), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setNocturnal();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Avenging"), PLATINUM, 3);
+ tMutation.requireResource(GregTech_API.sBlockMetal7, 14);
+ }),
+ PLUTONIUM(GT_BranchDefinition.RADIOACTIVE, "Plutonium", true, new Color(0x570000), new Color(0x240000),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.LEAD), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.PLUTONIUM), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(URANIUM, EMERALD, 3);
+ tMutation.requireResource(GregTech_API.sBlockMetal5, 13);
+ }),
+ NAQUADAH(GT_BranchDefinition.RADIOACTIVE, "Naquadah", false, new Color(0x003300), new Color(0x002400),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NAQUADAH), 0.15f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(PLUTONIUM, IRIDIUM, 3);
+ tMutation.requireResource(GregTech_API.sBlockMetal4, 12);
+ }),
+ NAQUADRIA(GT_BranchDefinition.RADIOACTIVE, "Naquadria", false, new Color(0x000000), new Color(0x002400),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SLAG), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NAQUADAH), 0.20f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NAQUADRIA), 0.15f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(PLUTONIUM, IRIDIUM, 8, 10);
+ tMutation.requireResource(GregTech_API.sBlockMetal4, 15);
+ }),
+ DOB(GT_BranchDefinition.RADIOACTIVE, "DOB", false, new Color(0x003300), new Color(0x002400), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.DOB), 0.75f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(NAQUADAH, THAUMIUMSHARD, 2);
+ if (AdvancedSolarPanel.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(AdvancedSolarPanel.ID, "BlockAdvSolarPanel"), 2);
+ tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(9, "END Biome")); // sky end biome
+ }),
+ THORIUM(GT_BranchDefinition.RADIOACTIVE, "Thorium", false, new Color(0x005000), new Color(0x001E00), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.THORIUM), 0.75f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setNocturnal();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+ }, dis -> {
+ IMutationCustom tMutation = dis.registerMutation(COAL, URANIUM, 3)
+ .setIsSecret();
+ tMutation.requireResource(GregTech_API.sBlockMetal7, 5);
+ }),
+ LUTETIUM(GT_BranchDefinition.RADIOACTIVE, "Lutetium", false, new Color(0xE6FFE6), new Color(0xFFFFFF),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.LUTETIUM), 0.15f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+ }, dis -> {
+ IMutationCustom tMutation = dis.registerMutation(THORIUM, getSpecies(EXTRABEES, "rotten"), 1)
+ .setIsSecret();
+ tMutation.requireResource(GregTech_API.sBlockMetal4, 3);
+ }),
+ AMERICIUM(GT_BranchDefinition.RADIOACTIVE, "Americium", false, new Color(0xE6E6FF), new Color(0xC8C8C8),
+ beeSpecies -> {
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.AMERICIUM), 0.075f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
+ beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+ }, dis -> {
+ IMutationCustom tMutation = dis.registerMutation(LUTETIUM, CHROME, 5, 4)
+ .setIsSecret();
+ tMutation.requireResource(GregTech_API.sBlockMetal1, 2);
+ }),
+ NEUTRONIUM(GT_BranchDefinition.RADIOACTIVE, "Neutronium", false, new Color(0xFFF0F0), new Color(0xFAFAFA),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NEUTRONIUM), 0.02f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ }, dis -> {
+ IMutationCustom tMutation = dis.registerMutation(NAQUADRIA, AMERICIUM, 2, 2)
+ .setIsSecret();
+ tMutation.requireResource(GregTech_API.sBlockMetal5, 2);
+ }),
+ // Twilight
+ NAGA(GT_BranchDefinition.TWILIGHT, "Naga", true, new Color(0x0D5A0D), new Color(0x28874B), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SALISMUNDUS), 0.02f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NAGA), 0.10f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis
+ .registerMutation(getSpecies(MAGICBEES, "Eldritch"), getSpecies(FORESTRY, "Imperial"), 8);
+ tMutation.restrictHumidity(DAMP);
+ }),
+ LICH(GT_BranchDefinition.TWILIGHT, "Lich", true, new Color(0xC5C5C5), new Color(0x5C605E), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SALISMUNDUS), 0.04f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.LICH), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(MAGICBEES, "Supernatural"), NAGA, 7);
+ tMutation.restrictHumidity(ARID);
+ }),
+ HYDRA(GT_BranchDefinition.TWILIGHT, "Hydra", true, new Color(0x872836), new Color(0xB8132C), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SALISMUNDUS), 0.06f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.HYDRA), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(LICH, getSpecies(MAGICBEES, "TCFire"), 6);
+ tMutation.addMutationCondition(new GT_Bees.BiomeIDMutationCondition(138, "Undergarden")); // undergarden biome
+ }),
+ URGHAST(GT_BranchDefinition.TWILIGHT, "UrGhast", true, new Color(0xA7041C), new Color(0x7C0618), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SALISMUNDUS), 0.08f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.URGHAST), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setHasEffect();
+ beeSpecies.setNocturnal();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(HYDRA, THAUMIUMDUST, 5);
+ if (Thaumcraft.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCosmeticSolid"), 4);
+ tMutation.restrictTemperature(HELLISH);
+ }),
+ SNOWQUEEN(GT_BranchDefinition.TWILIGHT, "SnowQueen", true, new Color(0xD02001), new Color(0x9C0018), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SALISMUNDUS), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SNOWQUEEN), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setHasEffect();
+ beeSpecies.setNocturnal();
+ }, template -> {}, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(URGHAST, SALISMUNDUS, 4);
+ if (ThaumicBases.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(ThaumicBases.ID, "blockSalisMundus"), 0);
+ tMutation.restrictTemperature(ICY);
+ }),
+ // HEE
+ ENDDUST(GT_BranchDefinition.HEE, "End Dust", true, new Color(0xCC00FA), new Color(0x003A7D), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENDDUST), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Ended"), STAINLESSSTEEL, 8);
+
+ tMutation.restrictHumidity(ARID);
+ if (HardcoreEnderExpansion.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "end_powder_ore"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
+ }),
+ ENDIUM(GT_BranchDefinition.HEE, "Endium", true, new Color(0xa0ffff), new Color(0x2F5A6C), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENDIUM), 0.10f);
+ beeSpecies.addSpecialty(GT_Bees.propolis.getStackForType(PropolisType.Endium), 0.15f);
+ beeSpecies.addSpecialty(GT_Bees.drop.getStackForType(DropType.ENDERGOO), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.NORMAL), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Ended"), THAUMIUMDUST, 8);
+ tMutation.restrictHumidity(ARID);
+ if (HardcoreEnderExpansion.isModLoaded()) tMutation.requireResource("blockHeeEndium");
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
+ }),
+ STARDUST(GT_BranchDefinition.HEE, "Star Dust", true, new Color(0xffff00), new Color(0xDCBE13), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.STARDUST), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, GT_Bees.speedBlinding);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.SLOWER);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Ended"), ZINC, 8);
+ tMutation.restrictHumidity(ARID);
+ if (HardcoreEnderExpansion.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "stardust_ore"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
+ }),
+ ECTOPLASMA(GT_BranchDefinition.HEE, "Ectoplasma", true, new Color(0xDCB0E5), new Color(0x381C40), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ECTOPLASMA), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(FORESTRY, "Ended"), ENDDUST, 5);
+ tMutation.restrictHumidity(ARID);
+ if (HardcoreEnderExpansion.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "spooky_log"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
+ }),
+ ARCANESHARDS(GT_BranchDefinition.HEE, "Arcane Shards", true, new Color(0x9010AD), new Color(0x333D82),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ARCANESHARD), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONG);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(THAUMIUMSHARD, ENDDUST, 5);
+ tMutation.restrictHumidity(ARID);
+ if (HardcoreEnderExpansion.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "laboratory_floor"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
+ }),
+ DRAGONESSENCE(GT_BranchDefinition.HEE, "Dragonessence", true, new Color(0xFFA12B), new Color(0x911ECE),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.DRAGONESSENCE), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectBeatific);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_3);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_3);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(ECTOPLASMA, ARCANESHARDS, 4);
+ tMutation.restrictHumidity(ARID);
+ if (HardcoreEnderExpansion.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "essence_altar"), 1);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
+ }),
+ FIREESSENCE(GT_BranchDefinition.HEE, "Fireessence", true, new Color(0xD41238), new Color(0xFFA157), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.FIREESSENSE), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.ELONGATED);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_3);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.DOWN_3);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(FIRESTONE, ARCANESHARDS, 4);
+ tMutation.restrictHumidity(ARID);
+ if (HardcoreEnderExpansion.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "essence_altar"), 2);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
+ }),
+ ENDERMANHEAD(GT_BranchDefinition.HEE, "Enderman", true, new Color(0x161616), new Color(0x6200e7), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ENDERMAN), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+ AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "teleport"));
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.UP_1);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(ENDERIUM, STARDUST, 4);
+ tMutation.restrictHumidity(ARID);
+ if (HardcoreEnderExpansion.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "ender_goo"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
+ }),
+ SILVERFISH(GT_BranchDefinition.HEE, "Silverfisch", true, new Color(0xEE053D), new Color(0x000000), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.SILVERFISH), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+ AlleleHelper.instance.set(template, EFFECT, getEffect(MAGICBEES, "SlowSpeed"));
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.DOWN_1);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(ECTOPLASMA, STARDUST, 5);
+ tMutation.restrictHumidity(ARID);
+ if (HardcoreEnderExpansion.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(HardcoreEnderExpansion.ID, "ender_goo"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
+ }),
+ RUNE(GT_BranchDefinition.HEE, "Rune", true, new Color(0xE31010), new Color(0x0104D9), beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(Forestry.ID, "beeCombs", 1, 8), 0.30f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.RUNEI), 0.025f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.RUNEII), 0.0125f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, LIFESPAN, GT_Bees.superLife);
+ AlleleHelper.instance.set(template, EFFECT, getEffect(MAGICBEES, "SlowSpeed"));
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.NONE);
+ }, dis -> {
+ IMutationCustom tMutation = dis.registerMutation(DRAGONESSENCE, STARDUST, 2)
+ .setIsSecret();
+ tMutation.restrictHumidity(ARID);
+ if (EnderStorage.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(EnderStorage.ID, "enderChest"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(1, "End")); // End Dim
+ }),
+ // Walrus Bee, 100% Combchance, Parents: Catty and Watery
+ WALRUS(GT_BranchDefinition.PLANET, "Walrus", true, new Color(0xD6D580), new Color(0xB5CFC9), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.WALRUS), 1.00f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.FASTEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis
+ .registerMutation(getSpecies(MAGICBEES, "Watery"), getSpecies(MAGICBEES, "Catty"), 45, 2);
+ if (ExtraCells2.isModLoaded()) {
+ tMutation.requireResource(GameRegistry.findBlock(ExtraCells2.ID, "walrus"), 0);
+ }
+ }),
+ // Space Bees
+ SPACE(GT_BranchDefinition.SPACE, "Space", true, new Color(0x003366), new Color(0xC0C0C0), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.02f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ }, template -> {}, dis -> {
+ IBeeMutationCustom tMutation = dis
+ .registerMutation(getSpecies(FORESTRY, "Industrious"), getSpecies(FORESTRY, "Heroic"), 10);
+ tMutation.restrictTemperature(ICY);
+ }),
+ METEORICIRON(GT_BranchDefinition.SPACE, "MeteoricIron", true, new Color(0x321928), new Color(0x643250),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.04f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.METEORICIRON), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ beeSpecies.setNocturnal();
+ }, template -> {}, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(SPACE, IRON, 9);
+ tMutation.requireResource(GregTech_API.sBlockMetal4, 7);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(28, "Moon")); // Moon Dim
+ }),
+ DESH(GT_BranchDefinition.SPACE, "Desh", false, new Color(0x323232), new Color(0x282828), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.06f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.DESH), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ beeSpecies.setNocturnal();
+ }, template -> AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectIgnition), new Consumer<>() {
+
+ @Override
+ public void accept(GT_BeeDefinition dis) {
+ IBeeMutationCustom tMutation = dis.registerMutation(MARS, TITANIUM, 9);
+ tMutation.requireResource(GregTech_API.sBlockMetal2, 12);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(29, "Mars")); // Mars Dim
+ }
+ }),
+ LEDOX(GT_BranchDefinition.SPACE, "Ledox", false, new Color(0x0000CD), new Color(0x0074FF), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.10f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.LEDOX), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "freezing")), new Consumer<>() {
+
+ @Override
+ public void accept(GT_BeeDefinition dis) {
+ IBeeMutationCustom tMutation = dis.registerMutation(CALLISTO, LEAD, 7);
+ if (NewHorizonsCoreMod.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Ledox"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(35, "Europa")); // Europa Dim
+ }
+ }),
+ CALLISTOICE(GT_BranchDefinition.SPACE, "CallistoIce", false, new Color(0x0074FF), new Color(0x1EB1FF),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.10f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.CALLISTOICE), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "freezing")), new Consumer<>() {
+
+ @Override
+ public void accept(GT_BeeDefinition dis) {
+ IBeeMutationCustom tMutation = dis.registerMutation(CALLISTO, getSpecies(EXTRABEES, "freezing"), 7);
+ if (NewHorizonsCoreMod.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.CallistoColdIce"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(45, "Callisto")); // Callisto
+ // Dim
+ }
+ }),
+ MYTRYL(GT_BranchDefinition.SPACE, "Mytryl", false, new Color(0xDAA520), new Color(0xF26404), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.16f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.MYTRYL), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> {}, new Consumer<>() {
+
+ @Override
+ public void accept(GT_BeeDefinition dis) {
+ IBeeMutationCustom tMutation = dis.registerMutation(IO, MITHRIL, 6);
+ if (NewHorizonsCoreMod.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Mytryl"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(36, "IO")); // IO Dim
+ }
+ }),
+ QUANTIUM(GT_BranchDefinition.SPACE, "Quantium", false, new Color(0x00FF00), new Color(0x00D10B), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.16f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.QUANTIUM), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> {}, new Consumer<>() {
+
+ @Override
+ public void accept(GT_BeeDefinition dis) {
+ IBeeMutationCustom tMutation = dis.registerMutation(VENUS, OSMIUM, 6);
+ if (NewHorizonsCoreMod.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Quantinum"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(39, "Venus")); // Venus Dim
+ }
+ }),
+ ORIHARUKON(GT_BranchDefinition.SPACE, "Oriharukon", false, new Color(0x228B22), new Color(0x677D68), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.26f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.ORIHARUKON), 0.10f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setHasEffect();
+ }, template -> {}, new Consumer<>() {
+
+ @Override
+ public void accept(GT_BeeDefinition dis) {
+ IBeeMutationCustom tMutation = dis.registerMutation(LEAD, OBERON, 5);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "metalsblock"), 6);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(46, "Oberon")); // Oberon Dim
+ }
+ }),
+ INFUSEDGOLD(GT_BranchDefinition.SPACE, "Infused Gold", false, new Color(0x80641E), new Color(0xFFC83C),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.GOLD), 0.20f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.INFUSEDGOLD), 0.30f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> {}, new Consumer<>() {
+
+ @Override
+ public void accept(GT_BeeDefinition dis) {
+ IBeeMutationCustom tMutation = dis.registerMutation(GOLD, HAUMEA, 5);
+ tMutation.requireResource(GregTech_API.sBlockMetal3, 10);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(83, "Haumea")); // Haumea Dim
+ }
+ }),
+ MYSTERIOUSCRYSTAL(GT_BranchDefinition.SPACE, "MysteriousCrystal", false, new Color(0x3CB371), new Color(0x16856C),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.42f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.MYSTERIOUSCRYSTAL), 0.30f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> {}, new Consumer<>() {
+
+ @Override
+ public void accept(GT_BeeDefinition dis) {
+ IBeeMutationCustom tMutation = dis.registerMutation(ENCELADUS, EMERALD, 3);
+ if (NewHorizonsCoreMod.isModLoaded()) tMutation
+ .requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.MysteriousCrystal"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(41, "Enceladus")); // Enceladus
+ // Dim
+ }
+ }),
+ BLACKPLUTONIUM(GT_BranchDefinition.SPACE, "BlackPlutonium", false, new Color(0x000000), new Color(0x323232),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SPACE), 0.68f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.BLACKPLUTONIUM), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> {}, new Consumer<>() {
+
+ @Override
+ public void accept(GT_BeeDefinition dis) {
+ IBeeMutationCustom tMutation = dis.registerMutation(PLUTO, PLUTONIUM, 2);
+ if (NewHorizonsCoreMod.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.BlackPlutonium"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(49, "Pluto")); // Pluto Dim
+ }
+ }),
+ TRINIUM(GT_BranchDefinition.SPACE, "Trinium", false, new Color(0xB0E0E6), new Color(0xC8C8D2), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.TRINIUM), 0.75f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.QUANTIUM), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, SPEED, GT_Bees.speedBlinding), new Consumer<>() {
+
+ @Override
+ public void accept(GT_BeeDefinition dis) {
+ IBeeMutationCustom tMutation = dis.registerMutation(ENCELADUS, IRIDIUM, 4);
+ tMutation.requireResource(GregTech_API.sBlockMetal4, 9);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(41, "Enceladus")); // Enceladus Dim
+ }
+ }),
+ // Planet Line
+ MOON(GT_BranchDefinition.PLANET, "Moon", false, new Color(0x373735), new Color(0x7E7E78), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MOON), 0.35f);
+ if (NewHorizonsCoreMod.isModLoaded())
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MoonStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(SPACE, CLAY, 25);
+ if (GalacticraftCore.isModLoaded()) {
+ tMutation.requireResource(GameRegistry.findBlock(GalacticraftCore.ID, "tile.moonBlock"), 4);
+ }
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(28, "Moon")); // Moon Dim
+ }),
+ MARS(GT_BranchDefinition.PLANET, "Mars", false, new Color(0x220D05), new Color(0x3A1505), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MARS), 0.35f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MarsStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(MOON, IRON, 20);
+ if (GalacticraftMars.isModLoaded()) {
+ tMutation.requireResource(GameRegistry.findBlock(GalacticraftMars.ID, "tile.mars"), 5);
+ }
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(29, "Mars")); // Mars Dim
+ }),
+ PHOBOS(GT_BranchDefinition.PLANET, "Phobos", true, new Color(0x220D05), new Color(0x7a5706), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MARS), 0.25f);
+ if (NewHorizonsCoreMod.isModLoaded()) beeSpecies
+ .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PhobosStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ beeSpecies.setNocturnal();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(MARS, MOON, 20);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "phobosblocks"), 2);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(38, "Phobos")); // Phobos Dim
+ }),
+ DEIMOS(GT_BranchDefinition.PLANET, "Deimos", true, new Color(0x220D05), new Color(0x7a3206), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MARS), 0.25f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.DeimosStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(HOT);
+ beeSpecies.setNocturnal();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(MARS, SPACE, 20);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "deimosblocks"), 1);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(40, "Deimos")); // Deimos Dim
+ }),
+ CERES(GT_BranchDefinition.PLANET, "Ceres", true, new Color(0x3ca5b7), new Color(0x1e7267), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.JUPITER), 0.25f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CeresStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ beeSpecies.setNocturnal();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(MARS, METEORICIRON, 20);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "ceresblocks"), 1);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(42, "Ceres")); // Ceres Dim
+ }),
+ JUPITER(GT_BranchDefinition.PLANET, "Jupiter", false, new Color(0x734B2E), new Color(0xD0CBC4), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.JUPITER), 0.35f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoStoneDust", 1, 0), 0.05f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoIceDust", 1, 0), 0.05f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.IoStoneDust", 1, 0), 0.05f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaStoneDust", 1, 0), 0.05f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaIceDust", 1, 0), 0.05f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.GanymedeStoneDust", 1, 0), 0.05f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(MARS, DESH, 15);
+ if (NewHorizonsCoreMod.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Ledox"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(30, "Asteroids")); // Asteroid Dim
+ }),
+ IO(GT_BranchDefinition.PLANET, "IO", true, new Color(0x734B2E), new Color(0xe5701b), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.JUPITER), 0.25f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.IoStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HELLISH);
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, getSpecies(EXTRABEES, "volcanic"), 15);
+ tMutation.restrictTemperature(HELLISH);
+ if (GalaxySpace.isModLoaded()) tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "ioblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(36, "IO")); // IO Dim
+ }),
+ EUROPA(GT_BranchDefinition.PLANET, "Europa", true, new Color(0x5982ea), new Color(0x0b36a3), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.JUPITER), 0.25f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaStoneDust", 1, 0), 0.10f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EuropaIceDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, IRON, 15);
+ tMutation.restrictTemperature(ICY);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "europagrunt"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(35, "Europa")); // Europa Dim
+ }),
+ GANYMEDE(GT_BranchDefinition.PLANET, "Ganymede", true, new Color(0x3d1b10), new Color(0x190c07), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.JUPITER), 0.25f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.GanymedeStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(COLD);
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, TITANIUM, 15);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "ganymedeblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(43, "Ganymede")); // Ganymede Dim
+ }),
+ CALLISTO(GT_BranchDefinition.PLANET, "Callisto", true, new Color(0x0f333d), new Color(0x0d84a5), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.JUPITER), 0.25f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoStoneDust", 1, 0), 0.10f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CallistoIceDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, getSpecies(EXTRABEES, "artic"), 15);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "callistoblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(45, "Callisto")); // Callisto Dim
+ }),
+ SATURN(GT_BranchDefinition.PLANET, "Saturn", false, new Color(0xD2A472), new Color(0xF8C37B), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SATURN), 0.35f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TitanStoneDust", 1, 0), 0.05f);
+ beeSpecies
+ .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusStoneDust", 1, 0), 0.05f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusIceDust", 1, 0), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, LEDOX, 25, 2);
+ if (NewHorizonsCoreMod.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.Quantinum"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(30, "Asteriods")); // Asteriods Dim
+ }),
+ ENCELADUS(GT_BranchDefinition.PLANET, "Enceladus", true, new Color(0xD2A472), new Color(0x193fa0), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SATURN), 0.25f);
+ beeSpecies
+ .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusStoneDust", 1, 0), 0.10f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EnceladusIceDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(SATURN, CHROME, 25, 2);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "enceladusblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(41, "Enceladus")); // Enceladus Dim
+ }),
+ TITAN(GT_BranchDefinition.PLANET, "Titan", true, new Color(0xa0641b), new Color(0x7c1024), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SATURN), 0.25f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TitanStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(SATURN, NICKEL, 25, 2);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "titanblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(44, "Titan")); // Titan Dim
+ }),
+ URANUS(GT_BranchDefinition.PLANET, "Uranus", false, new Color(0x75C0C9), new Color(0x84D8EC), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.URANUS), 0.35f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MirandaStoneDust", 1, 0), 0.05f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.OberonStoneDust", 1, 0), 0.05f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(SATURN, TRINIUM, 10);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "metalsblock"), 6);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(30, "Asteroids")); // Asteroids Dim
+ }),
+ MIRANDA(GT_BranchDefinition.PLANET, "Miranda", true, new Color(0x75C0C9), new Color(0x0d211c), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.URANUS), 0.25f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MirandaStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(URANUS, TIN, 10);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "mirandablocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(86, "Miranda")); // Miranda Dim
+ }),
+ OBERON(GT_BranchDefinition.PLANET, "Oberon", true, new Color(0x4A4033), new Color(0xB5A288), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.URANUS), 0.25f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.OberonStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(ICY);
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(URANUS, IRIDIUM, 10);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "oberonblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(46, "Oberon")); // Oberon Dim
+ }),
+ NEPTUNE(GT_BranchDefinition.PLANET, "Neptune", false, new Color(0x334CFF), new Color(0x576DFF), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NEPTUN), 0.35f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ProteusStoneDust", 1, 0), 0.05f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TritonStoneDust", 1, 0), 0.05f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(URANUS, ORIHARUKON, 7);
+ if (NewHorizonsCoreMod.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(NewHorizonsCoreMod.ID, "tile.MysteriousCrystal"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(30, "Asteroids")); // Asteroids Dim
+ }),
+ PROTEUS(GT_BranchDefinition.PLANET, "Proteus", true, new Color(0x334CFF), new Color(0x592610), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NEPTUN), 0.25f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ProteusStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setNocturnal();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(NEPTUNE, COPPER, 7);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "proteusblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(47, "Proteus")); // Proteus Dim
+ }),
+ TRITON(GT_BranchDefinition.PLANET, "Triton", true, new Color(0x334CFF), new Color(0x421118), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NEPTUN), 0.25f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TritonStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(NEPTUNE, GOLD, 7);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "tritonblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(48, "Triton")); // Triton Dim
+ }),
+ PLUTO(GT_BranchDefinition.PLANET, "Pluto", false, new Color(0x34271E), new Color(0x69503D), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.PLUTO), 0.35f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PlutoStoneDust", 1, 0), 0.10f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PlutoIceDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(NEPTUNE, PLUTONIUM, 5);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "plutoblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(49, "Pluto")); // Pluto Dim
+ }),
+ HAUMEA(GT_BranchDefinition.PLANET, "Haumea", false, new Color(0x1C1413), new Color(0x392B28), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.HAUMEA), 0.35f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.HaumeaStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(ICY);
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(PLUTO, NAQUADAH, 7, 2);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "haumeablocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(83, "Haumea")); // Haumea Dim
+ }),
+ MAKEMAKE(GT_BranchDefinition.PLANET, "MakeMake", false, new Color(0x301811), new Color(0x120A07), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MAKEMAKE), 0.35f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.MakeMakeStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(PLUTO, NAQUADRIA, 7, 2);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "makemakegrunt"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(25, "MakeMake")); // MakeMake Dim
+ }),
+ CENTAURI(GT_BranchDefinition.PLANET, "Centauri", false, new Color(0x2F2A14), new Color(0xB06B32), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CENTAURI), 0.35f);
+ beeSpecies
+ .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CentauriASurfaceDust", 1, 0), 0.05f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(MAKEMAKE, DESH, 3);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "acentauribbgrunt"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(33, "Kuiper Belt")); // Kuiper Belt Dim
+ }),
+ ACENTAURI(GT_BranchDefinition.PLANET, "aCentauri", false, new Color(0x2F2A14), new Color(0xa01e14), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.CENTAURI), 0.25f);
+ beeSpecies
+ .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CentauriASurfaceDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HELLISH);
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), new Consumer<>() {
+
+ @Override
+ public void accept(GT_BeeDefinition dis) {
+ IBeeMutationCustom tMutation = dis.registerMutation(CENTAURI, INFINITYCATALYST, 3);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "acentauribbgrunt"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(31, "aCentauri")); // aCentauri Dim
+ }
+ }),
+ TCETI(GT_BranchDefinition.PLANET, "tCeti", false, new Color(0x46241A), new Color(0x7B412F), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.TCETI), 0.35f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1, 0), 0.05f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(MAKEMAKE, HAUMEA, 5, 2);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "tcetieblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(33, "Kuiper Belt")); // Kuiper Belt Dim
+ }),
+ TCETIE(GT_BranchDefinition.PLANET, "tCetiE", false, new Color(0x2d561b), new Color(0x0c0f60), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.TCETI), 0.25f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(TCETI, getSpecies(MAGICBEES, "TCWater"), 5, 2);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "tcetieblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(85, "tCeti E")); // tCeti E Dim
+ }),
+ // Parents: TCETI and TCETIE, 25% combchance, needs Damp Humidity and Normal temperature. Is Mycophilic
+ SEAWEED(GT_BranchDefinition.PLANET, "SeaWeed", true, new Color(0xCBCBCB), new Color(0x83FF83), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.SEAWEED), 0.25f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1, 0), 0.15f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(EnumTemperature.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGER);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.DOWN_1);
+ AlleleHelper.instance.set(template, HUMIDITY_TOLERANCE, Tolerance.DOWN_1);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectMycophilic);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(TCETI, TCETIE, 5, 2);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "tcetieblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(85, "tCeti E")); // tCeti E Dim
+ }),
+
+ BARNARDA(GT_BranchDefinition.PLANET, "Barnarda", false, new Color(0x0D5A0D), new Color(0xE6C18D), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.BARNARDA), 0.35f);
+ beeSpecies
+ .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaEStoneDust", 1, 0), 0.05f);
+ beeSpecies
+ .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaFStoneDust", 1, 0), 0.05f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(MAKEMAKE, THORIUM, 3, 2);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "barnardaEgrunt"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(33, "Kuiper Belt")); // Kuiper Belt Dim
+ }),
+ BARNARDAC(GT_BranchDefinition.PLANET, "BarnardaC", false, new Color(0x0D5A0D), new Color(0x473f0a), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.BARNARDA), 0.25f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ }, template -> {
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ AlleleHelper.instance.set(template, EFFECT, getEffect(GREGTECH, "Treetwister"));
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(BARNARDA, AMERICIUM, 3, 2);
+ if (GalaxySpace.isModLoaded()) {
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "barnardaEgrunt"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(32, "Barnarda C")); // Barnarda C Dim
+ }
+ }),
+ BARNARDAE(GT_BranchDefinition.PLANET, "BarnardaE", false, new Color(0x0D5A0D), new Color(0x4c1f0a), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.BARNARDA), 0.25f);
+ beeSpecies
+ .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaEStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(BARNARDA, DIVIDED, 3, 2);
+ if (GalaxySpace.isModLoaded()) {
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "barnardaEgrunt"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(81, "Barnard E")); // "Barnard E Dim
+ }
+ }),
+ BARNARDAF(GT_BranchDefinition.PLANET, "BarnardaF", false, new Color(0x0D5A0D), new Color(0x1e0b49), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.BARNARDA), 0.25f);
+ beeSpecies
+ .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.BarnardaFStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(BARNARDA, NEUTRONIUM, 3, 2);
+ if (GalaxySpace.isModLoaded()) {
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "barnardaFgrunt"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(82, "Barnard F")); // "Barnard F Dim
+ }
+ }),
+ VEGA(GT_BranchDefinition.PLANET, "Vega", false, new Color(0x1A2036), new Color(0xB5C0DE), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.VEGA), 0.35f);
+ beeSpecies.addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.VegaBStoneDust", 1, 0), 0.05f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(MAKEMAKE, NAQUADAH, 2);
+ if (GalaxySpace.isModLoaded()) {
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "vegabgrunt"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(33, "Kuiper Belt")); // Kuiper Belt
+ // Dim
+ }
+ }),
+ VEGAB(GT_BranchDefinition.PLANET, "VegaB", false, new Color(0x1A2036), new Color(0x81e261), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.VEGA), 0.35f);
+ if (NewHorizonsCoreMod.isModLoaded()) beeSpecies
+ .addSpecialty(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.VegaBStoneDust", 1, 0), 0.10f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(COLD);
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(VEGA, NAQUADRIA, 2);
+ if (GalaxySpace.isModLoaded()) {
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "vegabgrunt"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(84, "VegaB")); // VegaB Dim
+ }
+ }),
+ MERCURY(GT_BranchDefinition.PLANET, "Mercury", false, new Color(0x4A4033), new Color(0xB5A288), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.MERCURY), 0.35f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, TUNGSTEN, 25, 2);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "mercuryblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(37, "Mercury")); // Mercury Dim
+ }),
+ VENUS(GT_BranchDefinition.PLANET, "Venus", false, new Color(0x4A4033), new Color(0xB5A288), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.VENUS), 0.35f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(JUPITER, MITHRIL, 25, 2);
+ if (GalaxySpace.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(GalaxySpace.ID, "venusblocks"), 0);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(39, "Venus")); // Venus Dim
+ }),
+
+ // Infinity Line
+ COSMICNEUTRONIUM(GT_BranchDefinition.PLANET, "CosmicNeutronium", false, new Color(0x484848), new Color(0x323232),
+ beeSpecies -> {
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.COSMICNEUTRONIUM), 0.375f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
+ beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(NEUTRONIUM, BARNARDAF, 7, 10);
+ if (Avaritia.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(Avaritia.ID, "Resource_Block"), 0);
+ }),
+ INFINITYCATALYST(GT_BranchDefinition.PLANET, "InfinityCatalyst", false, new Color(0xFFFFFF), new Color(0xFFFFFF),
+ beeSpecies -> {
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.INFINITYCATALYST), 0.015f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(HELLISH);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
+ beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
+ }, template -> {
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST);
+ AlleleHelper.instance.set(template, EFFECT, getEffect(EXTRABEES, "blindness"));
+ }, dis -> {
+ IMutationCustom tMutation = dis.registerMutation(DOB, COSMICNEUTRONIUM, 3, 10)
+ .setIsSecret();
+ if (Avaritia.isModLoaded()) {
+ tMutation.requireResource(GameRegistry.findBlock(Avaritia.ID, "Resource_Block"), 1);
+ }
+ }),
+ INFINITY(GT_BranchDefinition.PLANET, "Infinity", false, new Color(0xFFFFFF), new Color(0xFFFFFF), beeSpecies -> {
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.INFINITY), 0.015f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
+ beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(INFINITYCATALYST, COSMICNEUTRONIUM, 1, 10);
+ if (AvaritiaAddons.isModLoaded()) {
+ tMutation.requireResource(GameRegistry.findBlock(AvaritiaAddons.ID, "InfinityChest"), 0);
+ }
+ }),
+ KEVLAR(GT_BranchDefinition.IC2, "Kevlar", false, new Color(0x2d542f), new Color(0xa2baa3), beeSpecies -> {
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.KEVLAR), 0.075f);
+ beeSpecies.addSpecialty(MaterialsKevlar.Kevlar.getNuggets(1), 0.01f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setTemperature(COLD);
+ beeSpecies.setHasEffect();
+ beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
+ }, template -> {
+ AlleleHelper.instance.set(template, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(template, LIFESPAN, Lifespan.LONGEST);
+ AlleleHelper.instance.set(template, EFFECT, AlleleEffect.effectSnowing);
+ AlleleHelper.instance.set(template, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(template, NOCTURNAL, true);
+ AlleleHelper.instance.set(template, FLOWER_PROVIDER, Flowers.SNOW);
+ AlleleHelper.instance.set(template, FLOWERING, Flowering.AVERAGE);
+ }, dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(OIL, INFINITYCATALYST, 4);
+ // UHV Replicator (UU-Matter)
+ GregTech_API.sGTCompleteLoad.add(() -> tMutation.requireResource(GregTech_API.sBlockMachines, 11003));
+ }),
+
+ // Noble Gas Line
+ // Helium bee, Humidity: normal, Temperature: Icy, Parents: Space & Mars, Mutationrate: 10%, Combrate: 50%
+ HELIUM(GT_BranchDefinition.NOBLEGAS, "Helium", false, new Color(0xFFA9FF), new Color(0xC8B8B4), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.HELIUM), 0.35f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(MAGICBEES, "Watery"), ENDDUST, 10);
+ tMutation.restrictTemperature(ICY);
+ }),
+ // Argon bee, Humidity: normal, Temperature: Icy, Parents: Helium & Phobos, Mutationrate: 8%, Combrate: 50%
+ ARGON(GT_BranchDefinition.NOBLEGAS, "Argon", false, new Color(0x89D9E1), new Color(0xBDA5C2), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.ARGON), 0.35f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(HELIUM, LICH, 8);
+ tMutation.restrictTemperature(ICY);
+ }),
+ // Neon bee, Humidity: normal, Temperature: Icy, Parents: Xenon & Ceres, Mutationrate: 6%, Combrate: 50%
+ NEON(GT_BranchDefinition.NOBLEGAS, "Neon", false, new Color(0xFFC826), new Color(0xFF7200), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NEON), 0.35f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(ARGON, HYDRA, 6);
+ tMutation.restrictTemperature(ICY);
+ }),
+ // Krypton bee, Humidity: normal, Temperature: Icy, Parents: Neon & Jupiter, Mutationrate: 4%, Combrate: 50%
+ KRYPTON(GT_BranchDefinition.NOBLEGAS, "Krypton", false, new Color(0x8A97B0), new Color(0x160822), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.KRYPTON), 0.35f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(NEON, URGHAST, 4);
+ tMutation.restrictTemperature(ICY);
+ }),
+ // Xenon bee, Humidity: normal, Temperature: Icy, Parents: Argon & Deimos, Mutationrate: 6%, Combrate: 50%
+ XENON(GT_BranchDefinition.NOBLEGAS, "Xenon", false, new Color(0x8A97B0), new Color(0x160822), beeSpecies -> {
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.XENON), 0.525f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ // Makes it only work in the Mega Apiary NOTE: COMB MUST BE SPECIALITY COMB
+ beeSpecies.setJubilanceProvider(GT_JubilanceMegaApiary.instance);
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(KRYPTON, SNOWQUEEN, 2);
+ tMutation.restrictTemperature(ICY);
+ }),
+ // Oxygen bee, Humidity: normal, Temperature: Icy, Parents: Space & Callisto, Mutationrate: 15%, Combrate: 50%
+ OXYGEN(GT_BranchDefinition.NOBLEGAS, "Oxygen", false, new Color(0xFFFFFF), new Color(0x8F8FFF), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.OXYGEN), 0.45f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.HYDROGEN), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(HELIUM, DRAGONESSENCE, 15);
+ tMutation.restrictTemperature(ICY);
+ }),
+ // Hydrogen bee, Humidity: normal, Temperature: Icy, Parents: Oxygen & Watery, Mutationrate: 15%, Combrate: 50%
+ HYDROGEN(GT_BranchDefinition.NOBLEGAS, "Oxygen", false, new Color(0xFFFFFF), new Color(0xFF1493), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.HYDROGEN), 0.45f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.NITROGEN), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(OXYGEN, getSpecies(MAGICBEES, "Watery"), 15);
+ tMutation.restrictTemperature(ICY);
+ }),
+ // Nitrogen bee, Humidity: normal, Temperature: Icy, Parents: Oxygen & Hydrogen, Mutationrate: 15%, Combrate: 50%
+ NITROGEN(GT_BranchDefinition.NOBLEGAS, "Nitrogen", false, new Color(0xFFC832), new Color(0xA52A2A), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NITROGEN), 0.45f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.FLUORINE), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(OXYGEN, HYDROGEN, 15);
+ tMutation.restrictTemperature(ICY);
+ }),
+ // Fluorine bee, Humidity: normal, Temperature: Icy, Parents: Nitrogen & Hydrogen, Mutationrate: 15%, Combrate: 50%
+ FLUORINE(GT_BranchDefinition.NOBLEGAS, "Fluorine", false, new Color(0x86AFF0), new Color(0xFF6D00), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.FLUORINE), 0.45f);
+ beeSpecies.addSpecialty(GT_Bees.combs.getStackForType(CombType.OXYGEN), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setTemperature(ICY);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(NITROGEN, HYDROGEN, 15);
+ tMutation.restrictTemperature(ICY);
+ }),
+ // infused Shards line
+ AIR(GT_BranchDefinition.INFUSEDSHARD, "Air", false, new Color(0xFFFF7E), new Color(0x60602F), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INFUSEDAER), 0.30f);
+ beeSpecies.setHumidity(DAMP);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis
+ .registerMutation(getSpecies(MAGICBEES, "Supernatural"), getSpecies(MAGICBEES, "Windy"), 15);
+ tMutation.restrictTemperature(HOT);
+ if (Thaumcraft.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 0);
+ }),
+ FIRE(GT_BranchDefinition.INFUSEDSHARD, "Fire", false, new Color(0xED3801), new Color(0x3B0E00), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INFUSEDIGNIS), 0.30f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(getSpecies(MAGICBEES, "Supernatural"), AIR, 15);
+ tMutation.restrictTemperature(HELLISH);
+ if (Thaumcraft.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 1);
+ }),
+ WATER(GT_BranchDefinition.INFUSEDSHARD, "Water", false, new Color(0x0090FF), new Color(0x002542), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INFUSEDAQUA), 0.30f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(FIRE, AIR, 15);
+ tMutation.restrictTemperature(ICY);
+ if (Thaumcraft.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 2);
+ }),
+ EARTH(GT_BranchDefinition.INFUSEDSHARD, "Earth", false, new Color(0x008600), new Color(0x003300), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INFUSEDTERRA), 0.30f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(WATER, FIRE, 15);
+ tMutation.restrictTemperature(WARM);
+ if (Thaumcraft.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 3);
+ }),
+ ORDER(GT_BranchDefinition.INFUSEDSHARD, "Order", false, new Color(0x8A97B0), new Color(0x5C5F62), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INFUSEDORDO), 0.30f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(EARTH, FIRE, 15);
+ tMutation.restrictTemperature(ICY);
+ if (Thaumcraft.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 4);
+ }),
+ CHAOS(GT_BranchDefinition.INFUSEDSHARD, "Chaos", false, new Color(0x2E2E41), new Color(0x232129), beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.INFUSEDPERDITIO), 0.30f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(ORDER, FIRE, 15);
+ tMutation.restrictTemperature(ICY);
+ if (Thaumcraft.isModLoaded())
+ tMutation.requireResource(GameRegistry.findBlock(Thaumcraft.ID, "blockCrystal"), 5);
+ }),
+ NETHERSHARD(GT_BranchDefinition.INFUSEDSHARD, "Nethershard", false, new Color(0xBE0135), new Color(0x350211),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.NETHERSHARD), 0.30f);
+ beeSpecies.setHumidity(ARID);
+ beeSpecies.setTemperature(HOT);
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(CHAOS, FIRE, 15);
+ tMutation.requireResource(GameRegistry.findBlock(GregTech.ID, "gt.blockgem3"), 3);
+ }),
+ ENDSHARD(GT_BranchDefinition.INFUSEDSHARD, "Endshard", false, new Color(0x2E2E41), new Color(0x232129),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.ENDSHARD), 0.30f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(NETHERSHARD, ENDDUST, 15);
+ tMutation.restrictTemperature(ICY);
+ tMutation.requireResource(GameRegistry.findBlock(GregTech.ID, "gt.blockgem1"), 7);
+ }),
+ // Organic branch 2.0
+ UNKNOWNWATER(GT_BranchDefinition.ORGANIC, "UnknownWater", false, new Color(0x4333A5), new Color(0x36ABFF),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_Bees.combs.getStackForType(CombType.UNKNOWNWATER), 0.20f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST),
+ dis -> dis.registerMutation(INFINITYCATALYST, MYSTERIOUSCRYSTAL, 5)),
+ // Endgame bees
+ JAEGERMEISTER(GT_BranchDefinition.ENDGAME, "JaegerMeister", false, new Color(0x05AD18), new Color(0xE7DAC3),
+ beeSpecies -> {
+ beeSpecies.addProduct(GT_ModHandler.getModItem(CropsPlusPlus.ID, "BppPotions", 1L, 8), 0.01f);
+ beeSpecies.setHumidity(EnumHumidity.NORMAL);
+ beeSpecies.setNocturnal();
+ beeSpecies.setHasEffect();
+ }, template -> AlleleHelper.instance.set(template, LIFESPAN, Lifespan.SHORTEST), dis -> {
+ IBeeMutationCustom tMutation = dis.registerMutation(INFINITYCATALYST, NAQUADRIA, 5);
+ tMutation.requireResource(GregTech_API.sBlockMachines, 4684);
+ tMutation.addMutationCondition(new GT_Bees.DimensionMutationCondition(100, "Deep Dark")); // Deep Dark
+ // dim
+ });
+
+ private final GT_BranchDefinition branch;
+ private final GT_AlleleBeeSpecies species;
+ private final Consumer<GT_AlleleBeeSpecies> mSpeciesProperties;
+ private final Consumer<IAllele[]> mAlleles;
+ private final Consumer<GT_BeeDefinition> mMutations;
+ private IAllele[] template;
+ private IBeeGenome genome;
+
+ GT_BeeDefinition(GT_BranchDefinition branch, String binomial, boolean dominant, Color primary, Color secondary,
+ Consumer<GT_AlleleBeeSpecies> aSpeciesProperties, Consumer<IAllele[]> aAlleles,
+ Consumer<GT_BeeDefinition> aMutations) {
+ this.mAlleles = aAlleles;
+ this.mMutations = aMutations;
+ this.mSpeciesProperties = aSpeciesProperties;
+ String lowercaseName = this.toString()
+ .toLowerCase(Locale.ENGLISH);
+ String species = WordUtils.capitalize(lowercaseName);
+
+ String uid = "gregtech.bee.species" + species;
+ String description = "for.description." + species;
+ String name = "for.bees.species." + lowercaseName;
+ GT_LanguageManager.addStringLocalization("for.bees.species." + lowercaseName, species);
+
+ this.branch = branch;
+ this.species = new GT_AlleleBeeSpecies(
+ uid,
+ dominant,
+ name,
+ "GTNH",
+ description,
+ branch.getBranch(),
+ binomial,
+ primary,
+ secondary);
+ }
+
+ public static void initBees() {
+ for (GT_BeeDefinition bee : values()) {
+ bee.init();
+ }
+ for (GT_BeeDefinition bee : values()) {
+ bee.registerMutations();
+ }
+ }
+
+ static IAlleleBeeEffect getEffect(byte modid, String name) {
+ String s = switch (modid) {
+ case EXTRABEES -> "extrabees.effect." + name;
+ case GENDUSTRY -> "gendustry.effect." + name;
+ case MAGICBEES -> "magicbees.effect" + name;
+ case GREGTECH -> "gregtech.effect" + name;
+ default -> "forestry.effect" + name;
+ };
+ return (IAlleleBeeEffect) AlleleManager.alleleRegistry.getAllele(s);
+ }
+
+ static IAlleleFlowers getFlowers(byte modid, String name) {
+ String s = switch (modid) {
+ case EXTRABEES -> "extrabees.flower." + name;
+ case GENDUSTRY -> "gendustry.flower." + name;
+ case MAGICBEES -> "magicbees.flower" + name;
+ case GREGTECH -> "gregtech.flower" + name;
+ default -> "forestry.flowers" + name;
+ };
+ return (IAlleleFlowers) AlleleManager.alleleRegistry.getAllele(s);
+ }
+
+ private static IAlleleBeeSpecies getSpecies(byte modid, String name) {
+ String s = switch (modid) {
+ case EXTRABEES -> "extrabees.species." + name;
+ case GENDUSTRY -> "gendustry.bee." + name;
+ case MAGICBEES -> "magicbees.species" + name;
+ case GREGTECH -> "gregtech.species" + name;
+ default -> "forestry.species" + name;
+ };
+ IAlleleBeeSpecies ret = (IAlleleBeeSpecies) AlleleManager.alleleRegistry.getAllele(s);
+ if (ret == null) {
+ ret = NAQUADRIA.species;
+ }
+
+ return ret;
+ }
+
+ private void setSpeciesProperties(GT_AlleleBeeSpecies beeSpecies) {
+ this.mSpeciesProperties.accept(beeSpecies);
+ }
+
+ private void setAlleles(IAllele[] template) {
+ this.mAlleles.accept(template);
+ }
+
+ private void registerMutations() {
+ this.mMutations.accept(this);
+ }
+
+ private void init() {
+ setSpeciesProperties(species);
+
+ template = branch.getTemplate();
+ AlleleHelper.instance.set(template, SPECIES, species);
+ setAlleles(template);
+
+ genome = BeeManager.beeRoot.templateAsGenome(template);
+
+ BeeManager.beeRoot.registerTemplate(template);
+ }
+
+ private IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, IAlleleBeeSpecies parent2, int chance) {
+ return registerMutation(parent1, parent2, chance, 1f);
+ }
+
+ private IBeeMutationCustom registerMutation(GT_BeeDefinition parent1, IAlleleBeeSpecies parent2, int chance) {
+ return registerMutation(parent1, parent2, chance, 1f);
+ }
+
+ private IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, GT_BeeDefinition parent2, int chance) {
+ return registerMutation(parent1, parent2, chance, 1f);
+ }
+
+ private IBeeMutationCustom registerMutation(GT_BeeDefinition parent1, GT_BeeDefinition parent2, int chance) {
+ return registerMutation(parent1, parent2, chance, 1f);
+ }
+
+ /**
+ * Diese neue Funtion erlaubt Mutationsraten unter 1%. Setze dazu die Mutationsrate als Bruch mit chance /
+ * chanceDivider This new function allows Mutation percentages under 1%. Set them as a fraction with chance /
+ * chanceDivider
+ */
+ private IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, IAlleleBeeSpecies parent2, int chance,
+ float chanceDivider) {
+ return new GT_Bee_Mutation(parent1, parent2, this.getTemplate(), chance, chanceDivider);
+ }
+
+ private IBeeMutationCustom registerMutation(GT_BeeDefinition parent1, IAlleleBeeSpecies parent2, int chance,
+ float chanceDivider) {
+ return registerMutation(parent1.species, parent2, chance, chanceDivider);
+ }
+
+ private IBeeMutationCustom registerMutation(IAlleleBeeSpecies parent1, GT_BeeDefinition parent2, int chance,
+ float chanceDivider) {
+ return registerMutation(parent1, parent2.species, chance, chanceDivider);
+ }
+
+ private IBeeMutationCustom registerMutation(GT_BeeDefinition parent1, GT_BeeDefinition parent2, int chance,
+ float chanceDivider) {
+ return registerMutation(parent1.species, parent2, chance, chanceDivider);
+ }
+
+ @Override
+ public final IAllele[] getTemplate() {
+ return Arrays.copyOf(template, template.length);
+ }
+
+ @Override
+ public final IBeeGenome getGenome() {
+ return genome;
+ }
+
+ @Override
+ public final IBee getIndividual() {
+ return new Bee(genome);
+ }
+
+ @Override
+ public final ItemStack getMemberStack(EnumBeeType beeType) {
+ return BeeManager.beeRoot.getMemberStack(getIndividual(), beeType.ordinal());
+ }
+}
diff --git a/src/main/java/gregtech/loaders/misc/GT_Bees.java b/src/main/java/gregtech/loaders/misc/GT_Bees.java
new file mode 100644
index 0000000000..497105d75c
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/GT_Bees.java
@@ -0,0 +1,201 @@
+package gregtech.loaders.misc;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.TwilightForest;
+
+import net.minecraft.world.World;
+import net.minecraft.world.biome.BiomeGenBase;
+
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.apiculture.IAlleleBeeEffect;
+import forestry.api.core.IClimateProvider;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IAlleleArea;
+import forestry.api.genetics.IAlleleFloat;
+import forestry.api.genetics.IAlleleInteger;
+import forestry.api.genetics.IGenome;
+import forestry.api.genetics.IMutationCondition;
+import forestry.core.genetics.alleles.Allele;
+import forestry.core.utils.StringUtil;
+import gregtech.GT_Mod;
+import gregtech.common.bees.GT_AlleleHelper;
+import gregtech.common.items.ItemComb;
+import gregtech.common.items.ItemDrop;
+import gregtech.common.items.ItemPollen;
+import gregtech.common.items.ItemPropolis;
+import gregtech.loaders.misc.bees.GT_AlleleEffect;
+import gregtech.loaders.misc.bees.GT_EffectTreeTwister;
+
+public class GT_Bees {
+
+ public static IAlleleInteger noFertility;
+ public static IAlleleInteger superFertility;
+
+ public static IAlleleInteger noFlowering;
+ public static IAlleleInteger superFlowering;
+
+ public static IAlleleArea noTerritory;
+ public static IAlleleArea superTerritory;
+
+ public static IAlleleFloat noWork;
+ public static IAlleleFloat speedBlinding;
+ public static IAlleleFloat superSpeed;
+
+ public static IAlleleInteger blinkLife;
+ public static IAlleleInteger superLife;
+
+ public static IAlleleBeeEffect treetwisterEffect;
+
+ public static ItemPropolis propolis;
+ public static ItemPollen pollen;
+ public static ItemDrop drop;
+ public static ItemComb combs;
+
+ public GT_Bees() {
+ if (!(Forestry.isModLoaded() && GT_Mod.gregtechproxy.mGTBees)) {
+ return;
+ }
+
+ GT_AlleleHelper.initialisation();
+ setupGTAlleles();
+ propolis = new ItemPropolis();
+ propolis.initPropolisRecipes();
+ pollen = new ItemPollen();
+ drop = new ItemDrop();
+ drop.initDropsRecipes();
+ combs = new ItemComb();
+ combs.initCombsRecipes();
+ combs.registerOreDict();
+ GT_BeeDefinition.initBees();
+
+ }
+
+ private static void setupGTAlleles() {
+
+ noFertility = new AlleleInteger("fertilitySterile", 0, false, EnumBeeChromosome.FERTILITY);
+ superFertility = new AlleleInteger("fertilityMultiply", 8, false, EnumBeeChromosome.FERTILITY);
+
+ noFlowering = new AlleleInteger("floweringNonpollinating", 0, false, EnumBeeChromosome.FLOWERING);
+ superFlowering = new AlleleInteger("floweringNaturalistic", 240, false, EnumBeeChromosome.FLOWERING);
+
+ noTerritory = new AlleleArea("areaLethargic", 1, 1, false);
+ superTerritory = new AlleleArea("areaExploratory", 32, 16, false);
+
+ noWork = new AlleleFloat("speedUnproductive", 0, false);
+ superSpeed = new AlleleFloat("speedAccelerated", 4F, false);
+ speedBlinding = AlleleManager.alleleRegistry.getAllele("magicbees.speedBlinding") == null
+ ? new AlleleFloat("speedBlinding", 2f, false)
+ : (IAlleleFloat) AlleleManager.alleleRegistry.getAllele("magicbees.speedBlinding");
+
+ blinkLife = new AlleleInteger("lifeBlink", 2, false, EnumBeeChromosome.LIFESPAN);
+ superLife = new AlleleInteger("lifeEon", 600, false, EnumBeeChromosome.LIFESPAN);
+
+ if (GalaxySpace.isModLoaded() && TwilightForest.isModLoaded()) {
+ GT_Mod.GT_FML_LOGGER.info("treetwisterEffect: GalaxySpace and TwilightForest loaded, using default impl");
+ treetwisterEffect = new GT_EffectTreeTwister();
+ } else {
+ GT_Mod.GT_FML_LOGGER
+ .info("treetwisterEffect: GalaxySpace or TwilightForest was not loaded, using fallback impl");
+ treetwisterEffect = GT_AlleleEffect.FORESTRY_BASE_EFFECT;
+ }
+ }
+
+ private static class AlleleFloat extends Allele implements IAlleleFloat {
+
+ private final float value;
+
+ public AlleleFloat(String id, float val, boolean isDominant) {
+ super("gregtech." + id, "gregtech." + id, isDominant);
+ this.value = val;
+ AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.SPEED);
+ }
+
+ @Override
+ public float getValue() {
+ return this.value;
+ }
+ }
+
+ private static class AlleleInteger extends Allele implements IAlleleInteger {
+
+ private final int value;
+
+ public AlleleInteger(String id, int val, boolean isDominant, EnumBeeChromosome c) {
+ super("gregtech." + id, "gregtech." + id, isDominant);
+ this.value = val;
+ AlleleManager.alleleRegistry.registerAllele(this, c);
+ }
+
+ @Override
+ public int getValue() {
+ return this.value;
+ }
+ }
+
+ private static class AlleleArea extends Allele implements IAlleleArea {
+
+ private final int[] value;
+
+ public AlleleArea(String id, int rangeXZ, int rangeY, boolean isDominant) {
+ super("gregtech." + id, "gregtech." + id, isDominant);
+ this.value = new int[] { rangeXZ, rangeY, rangeXZ };
+ AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.TERRITORY);
+ }
+
+ @Override
+ public int[] getValue() {
+ return this.value;
+ }
+ }
+
+ public static class DimensionMutationCondition implements IMutationCondition {
+
+ final int dimID;
+ final String dimName;
+
+ public DimensionMutationCondition(int id, String name) {
+ dimID = id;
+ dimName = name;
+ }
+
+ @Override
+ public float getChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
+ IGenome genome1, IClimateProvider climate) {
+ if (world.provider.dimensionId == dimID) return 1;
+ return 0;
+ }
+
+ @Override
+ public String getDescription() {
+ return StringUtil.localizeAndFormat("mutation.condition.dim") + " " + dimName;
+ }
+ }
+
+ public static class BiomeIDMutationCondition implements IMutationCondition {
+
+ final int biomeID;
+ final String biomeName;
+
+ public BiomeIDMutationCondition(int id, String name) {
+ biomeID = id;
+ biomeName = name;
+ }
+
+ @Override
+ public float getChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
+ IGenome genome1, IClimateProvider climate) {
+ if (climate.getBiome().biomeID == biomeID) return 1;
+ return 0;
+ }
+
+ @Override
+ public String getDescription() {
+ if (BiomeGenBase.getBiome(biomeID) != null) {
+ return StringUtil.localizeAndFormat("mutation.condition.biomeid") + " " + biomeName;
+ }
+ return "";
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/misc/GT_BranchDefinition.java b/src/main/java/gregtech/loaders/misc/GT_BranchDefinition.java
new file mode 100644
index 0000000000..3eae8c73e2
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/GT_BranchDefinition.java
@@ -0,0 +1,207 @@
+package gregtech.loaders.misc;
+
+import static forestry.api.apiculture.EnumBeeChromosome.CAVE_DWELLING;
+import static forestry.api.apiculture.EnumBeeChromosome.EFFECT;
+import static forestry.api.apiculture.EnumBeeChromosome.FERTILITY;
+import static forestry.api.apiculture.EnumBeeChromosome.FLOWERING;
+import static forestry.api.apiculture.EnumBeeChromosome.FLOWER_PROVIDER;
+import static forestry.api.apiculture.EnumBeeChromosome.HUMIDITY_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.LIFESPAN;
+import static forestry.api.apiculture.EnumBeeChromosome.NOCTURNAL;
+import static forestry.api.apiculture.EnumBeeChromosome.SPEED;
+import static forestry.api.apiculture.EnumBeeChromosome.TEMPERATURE_TOLERANCE;
+import static forestry.api.apiculture.EnumBeeChromosome.TERRITORY;
+import static forestry.api.apiculture.EnumBeeChromosome.TOLERANT_FLYER;
+import static forestry.core.genetics.alleles.EnumAllele.Fertility;
+import static forestry.core.genetics.alleles.EnumAllele.Flowering;
+import static forestry.core.genetics.alleles.EnumAllele.Flowers;
+import static forestry.core.genetics.alleles.EnumAllele.Lifespan;
+import static forestry.core.genetics.alleles.EnumAllele.Speed;
+import static forestry.core.genetics.alleles.EnumAllele.Territory;
+import static forestry.core.genetics.alleles.EnumAllele.Tolerance;
+import static gregtech.loaders.misc.GT_BeeDefinition.getEffect;
+import static gregtech.loaders.misc.GT_BeeDefinition.getFlowers;
+import static gregtech.loaders.misc.GT_BeeDefinitionReference.EXTRABEES;
+import static gregtech.loaders.misc.GT_BeeDefinitionReference.MAGICBEES;
+
+import java.util.Arrays;
+import java.util.function.Consumer;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.genetics.IAllele;
+import forestry.api.genetics.IClassification;
+import forestry.apiculture.genetics.alleles.AlleleEffect;
+import forestry.core.genetics.alleles.AlleleHelper;
+
+public enum GT_BranchDefinition {
+
+ ORGANIC("Fuelis", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_2);
+ AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.WHEAT);
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.SLOW);
+ AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORTER);
+ AlleleHelper.instance.set(alleles, SPEED, Speed.SLOWEST);
+ }),
+ IC2("Industrialis", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.UP_1);
+ AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.SNOW);
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTER);
+ AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(alleles, SPEED, Speed.SLOW);
+ }),
+ GTALLOY("Amalgamis", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+ AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.VANILLA);
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.AVERAGE);
+ AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORTEST);
+ AlleleHelper.instance.set(alleles, SPEED, Speed.FAST);
+ }),
+ THAUMIC("Arcanis", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(EXTRABEES, "book"));
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTER);
+ AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.LONGEST);
+ }),
+ GEM("Ornamentis", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.NETHER);
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.AVERAGE);
+ }),
+ METAL("Metaliferis", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
+ AlleleHelper.instance.set(alleles, CAVE_DWELLING, true);
+ AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.JUNGLE);
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.SLOWER);
+ }),
+ RAREMETAL("Mineralis", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.DOWN_1);
+ AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.CACTI);
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FAST);
+ }),
+ RADIOACTIVE("Criticalis", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.END);
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.AVERAGE);
+ AlleleHelper.instance.set(alleles, SPEED, GT_Bees.speedBlinding);
+ AlleleHelper.instance.set(alleles, SPEED, getEffect(EXTRABEES, "radioactive"));
+ }),
+ TWILIGHT("Nemoris Obscuri", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(alleles, NOCTURNAL, false);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, Flowers.VANILLA);
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTER);
+ }),
+ HEE("Finis Expansiones", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_2);
+ AlleleHelper.instance.set(alleles, HUMIDITY_TOLERANCE, Tolerance.BOTH_2);
+ AlleleHelper.instance.set(alleles, NOCTURNAL, true);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(EXTRABEES, "book"));
+ AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORT);
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.SLOW);
+ AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
+ AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGER);
+ }),
+ SPACE("Cosmicis", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.DOWN_2);
+ AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+ AlleleHelper.instance.set(alleles, NOCTURNAL, true);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
+ AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.LONGEST);
+ AlleleHelper.instance.set(alleles, SPEED, Speed.FAST);
+ AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGEST);
+ }),
+ PLANET("Planetaris", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(EXTRABEES, "rock"));
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
+ AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.NORMAL);
+ AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
+ AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGER);
+ }),
+ NOBLEGAS("Nobilis Gasorum", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_2);
+ AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
+ AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.NORMAL);
+ AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
+ AlleleHelper.instance.set(alleles, TERRITORY, Territory.AVERAGE);
+ }),
+ INFUSEDSHARD("Infusa Shard", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_1);
+ AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+ AlleleHelper.instance.set(alleles, FLOWER_PROVIDER, getFlowers(MAGICBEES, "rock"));
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
+ AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORTEST);
+ AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
+ AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGEST);
+ }),
+ ENDGAME("ENDUS GAMUS", alleles -> {
+ AlleleHelper.instance.set(alleles, TEMPERATURE_TOLERANCE, Tolerance.BOTH_5);
+ AlleleHelper.instance.set(alleles, TOLERANT_FLYER, true);
+ AlleleHelper.instance.set(alleles, FLOWERING, Flowering.FASTEST);
+ AlleleHelper.instance.set(alleles, LIFESPAN, Lifespan.SHORTEST);
+ AlleleHelper.instance.set(alleles, SPEED, Speed.FASTEST);
+ AlleleHelper.instance.set(alleles, TERRITORY, Territory.LARGEST);
+ });
+
+ private static IAllele[] defaultTemplate;
+ private final IClassification branch;
+ private final Consumer<IAllele[]> mBranchProperties;
+
+ GT_BranchDefinition(String scientific, Consumer<IAllele[]> aBranchProperties) {
+ this.branch = BeeManager.beeFactory.createBranch(
+ this.name()
+ .toLowerCase(),
+ scientific);
+ this.mBranchProperties = aBranchProperties;
+ }
+
+ private static IAllele[] getDefaultTemplate() {
+ if (defaultTemplate == null) {
+ defaultTemplate = new IAllele[EnumBeeChromosome.values().length];
+
+ AlleleHelper.instance.set(defaultTemplate, SPEED, Speed.SLOWEST);
+ AlleleHelper.instance.set(defaultTemplate, LIFESPAN, Lifespan.SHORTER);
+ AlleleHelper.instance.set(defaultTemplate, FERTILITY, Fertility.NORMAL);
+ AlleleHelper.instance.set(defaultTemplate, TEMPERATURE_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(defaultTemplate, NOCTURNAL, false);
+ AlleleHelper.instance.set(defaultTemplate, HUMIDITY_TOLERANCE, Tolerance.NONE);
+ AlleleHelper.instance.set(defaultTemplate, TOLERANT_FLYER, false);
+ AlleleHelper.instance.set(defaultTemplate, CAVE_DWELLING, false);
+ AlleleHelper.instance.set(defaultTemplate, FLOWER_PROVIDER, Flowers.VANILLA);
+ AlleleHelper.instance.set(defaultTemplate, FLOWERING, Flowering.SLOWEST);
+ AlleleHelper.instance.set(defaultTemplate, TERRITORY, Territory.AVERAGE);
+ AlleleHelper.instance.set(defaultTemplate, EFFECT, AlleleEffect.effectNone);
+ }
+ return Arrays.copyOf(defaultTemplate, defaultTemplate.length);
+ }
+
+ void setBranchProperties(IAllele[] template) {
+ this.mBranchProperties.accept(template);
+ }
+
+ public final IAllele[] getTemplate() {
+ IAllele[] template = getDefaultTemplate();
+ setBranchProperties(template);
+ return template;
+ }
+
+ public final IClassification getBranch() {
+ return branch;
+ }
+}
diff --git a/src/main/java/gregtech/loaders/misc/GT_CoverLoader.java b/src/main/java/gregtech/loaders/misc/GT_CoverLoader.java
new file mode 100644
index 0000000000..dc83202724
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/GT_CoverLoader.java
@@ -0,0 +1,42 @@
+package gregtech.loaders.misc;
+
+import static gregtech.api.enums.Textures.BlockIcons.VENT_ADVANCED;
+import static gregtech.api.enums.Textures.BlockIcons.VENT_NORMAL;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.common.covers.GT_Cover_Vent;
+
+public class GT_CoverLoader implements Runnable {
+
+ @Override
+ public void run() {
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ GregTech_API.registerCover(new ItemStack(Blocks.carpet, 1, i), TextureFactory.of(Blocks.wool, i), null);
+ }
+ GregTech_API.registerCover(
+ GT_ModHandler.getIC2Item("reactorVent", 1L, 1),
+ TextureFactory.of(VENT_NORMAL),
+ new GT_Cover_Vent(1));
+ GregTech_API.registerCover(
+ GT_ModHandler.getIC2Item("reactorVentCore", 1L, 1),
+ TextureFactory.of(VENT_NORMAL),
+ new GT_Cover_Vent(1));
+ GregTech_API.registerCover(
+ GT_ModHandler.getIC2Item("reactorVentGold", 1L, 1),
+ TextureFactory.of(VENT_ADVANCED),
+ new GT_Cover_Vent(2));
+ GregTech_API.registerCover(
+ GT_ModHandler.getIC2Item("reactorVentSpread", 1L),
+ TextureFactory.of(VENT_NORMAL),
+ new GT_Cover_Vent(2));
+ GregTech_API.registerCover(
+ GT_ModHandler.getIC2Item("reactorVentDiamond", 1L, 1),
+ TextureFactory.of(VENT_ADVANCED),
+ new GT_Cover_Vent(3));
+ }
+}
diff --git a/src/main/java/gregtech/loaders/misc/bees/GT_AlleleEffect.java b/src/main/java/gregtech/loaders/misc/bees/GT_AlleleEffect.java
new file mode 100644
index 0000000000..bb0d9eef8b
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/bees/GT_AlleleEffect.java
@@ -0,0 +1,44 @@
+package gregtech.loaders.misc.bees;
+
+import forestry.api.apiculture.EnumBeeChromosome;
+import forestry.api.apiculture.IAlleleBeeEffect;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeHousing;
+import forestry.api.genetics.AlleleManager;
+import forestry.api.genetics.IEffectData;
+import forestry.core.genetics.alleles.Allele;
+
+// helper class for implementing custom bee effects, based on MagicBees' implementation
+public abstract class GT_AlleleEffect extends Allele implements IAlleleBeeEffect {
+
+ public static final IAlleleBeeEffect FORESTRY_BASE_EFFECT = (IAlleleBeeEffect) AlleleManager.alleleRegistry
+ .getAllele("forestry.effectNone");
+ protected boolean combinable;
+
+ public GT_AlleleEffect(String id, boolean isDominant) {
+ super("gregtech." + id, "gregtech." + id, isDominant);
+ AlleleManager.alleleRegistry.registerAllele(this, EnumBeeChromosome.EFFECT);
+ combinable = false;
+ }
+
+ @Override
+ public boolean isCombinable() {
+ return combinable;
+ }
+
+ public GT_AlleleEffect setIsCombinable(boolean canCombine) {
+ combinable = canCombine;
+ return this;
+ }
+
+ @Override
+ public abstract IEffectData validateStorage(IEffectData storedData);
+
+ @Override
+ public abstract IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing);
+
+ @Override
+ public IEffectData doFX(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
+ return FORESTRY_BASE_EFFECT.doFX(genome, storedData, housing);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/misc/bees/GT_EffectTreeTwister.java b/src/main/java/gregtech/loaders/misc/bees/GT_EffectTreeTwister.java
new file mode 100644
index 0000000000..d188a3eb9b
--- /dev/null
+++ b/src/main/java/gregtech/loaders/misc/bees/GT_EffectTreeTwister.java
@@ -0,0 +1,86 @@
+package gregtech.loaders.misc.bees;
+
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.TwilightForest;
+
+import java.util.Arrays;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.world.World;
+
+import forestry.api.apiculture.BeeManager;
+import forestry.api.apiculture.IBeeGenome;
+import forestry.api.apiculture.IBeeHousing;
+import forestry.api.apiculture.IBeeModifier;
+import forestry.api.genetics.IEffectData;
+import gregtech.GT_Mod;
+import gregtech.api.util.GT_ModHandler;
+
+public class GT_EffectTreeTwister extends GT_AlleleEffect {
+
+ private static final Integer[] ALLOWED_DIMS = { 2, // spectre
+ 112, // last millenium
+ 60, // bedrock
+ 69, // pocket plane
+ };
+
+ private static final ItemStack TF_TRANS_SAPLING = GT_ModHandler
+ .getModItem(TwilightForest.ID, "tile.TFSapling", 1, 6);
+ private static final ItemStack BARN_SAPLING = GT_ModHandler.getModItem(GalaxySpace.ID, "barnardaCsapling", 1, 1);
+
+ static {
+ if (TF_TRANS_SAPLING == null) {
+ GT_Mod.GT_FML_LOGGER.info("GT_EffectTreeTwister(): Could not get ItemStack for BarnardaC sapling");
+ }
+ if (BARN_SAPLING == null) {
+ GT_Mod.GT_FML_LOGGER.info("GT_EffectTreeTwister(): Could not get ItemStack for BarnardaC sapling");
+ }
+ }
+
+ public GT_EffectTreeTwister() {
+ super("effectTreetwister", false);
+ }
+
+ public IEffectData validateStorage(IEffectData storedData) {
+ return storedData; // unused for this effect
+ }
+
+ public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
+ if (TF_TRANS_SAPLING == null || BARN_SAPLING == null) {
+ return storedData;
+ }
+ World world = housing.getWorld();
+ if (!Arrays.asList(ALLOWED_DIMS)
+ .contains(world.provider.dimensionId)) {
+ return storedData;
+ }
+ ChunkCoordinates coords = housing.getCoordinates();
+ IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
+
+ // Get random coords within territory
+ int xRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[0]);
+ int yRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[1]);
+ int zRange = (int) (beeModifier.getTerritoryModifier(genome, 1f) * genome.getTerritory()[2]);
+
+ int xCoord = coords.posX + world.rand.nextInt(xRange) - xRange / 2;
+ int yCoord = coords.posY + world.rand.nextInt(yRange) - yRange / 2;
+ int zCoord = coords.posZ + world.rand.nextInt(zRange) - zRange / 2;
+
+ ItemStack sourceBlock = new ItemStack(
+ world.getBlock(xCoord, yCoord, zCoord),
+ 1,
+ world.getBlockMetadata(xCoord, yCoord, zCoord));
+ if (TF_TRANS_SAPLING != null && BARN_SAPLING != null && TF_TRANS_SAPLING.isItemEqual(sourceBlock)) {
+ world.setBlock(
+ xCoord,
+ yCoord,
+ zCoord,
+ Block.getBlockFromItem(BARN_SAPLING.getItem()),
+ BARN_SAPLING.getItemDamage(),
+ 2);
+ }
+ return storedData;
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingAll.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingAll.java
new file mode 100644
index 0000000000..2f390b25e8
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingAll.java
@@ -0,0 +1,24 @@
+package gregtech.loaders.oreprocessing;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+
+public class ProcessingAll implements gregtech.api.interfaces.IOreRecipeRegistrator { // TODO ACTUALLY COMPARE ALL THE
+ // PROCESSING CLASSES
+
+ public ProcessingAll() {
+ for (OrePrefixes tPrefix : OrePrefixes.values()) tPrefix.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (((aStack.getItem() instanceof net.minecraft.item.ItemBlock))
+ && (aPrefix.mDefaultStackSize < aStack.getItem()
+ .getItemStackLimit(aStack)))
+ aStack.getItem()
+ .setMaxStackSize(aPrefix.mDefaultStackSize);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingArrows.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingArrows.java
new file mode 100644
index 0000000000..11d1b1e1b8
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingArrows.java
@@ -0,0 +1,135 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OreDictNames;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+
+public class ProcessingArrows implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingArrows() {
+ OrePrefixes.arrowGtWood.add(this);
+ OrePrefixes.arrowGtPlastic.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ ItemStack tOutput = GT_Utility.copyAmount(1, aStack);
+ GT_Utility.updateItemStack(tOutput);
+ GT_Utility.ItemNBT.addEnchantment(
+ tOutput,
+ Enchantment.smite,
+ EnchantmentHelper.getEnchantmentLevel(Enchantment.smite.effectId, tOutput) + 3);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(tOutput)
+ .fluidInputs(Materials.HolyWater.getFluid(25L))
+ .duration(5 * SECONDS)
+ .eut(2)
+ .addTo(chemicalBathRecipes);
+
+ tOutput = GT_Utility.copyAmount(1, aStack);
+ GT_Utility.updateItemStack(tOutput);
+ GT_Utility.ItemNBT.addEnchantment(
+ tOutput,
+ Enchantment.fireAspect,
+ EnchantmentHelper.getEnchantmentLevel(Enchantment.fireAspect.effectId, tOutput) + 3);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(tOutput)
+ .fluidInputs(Materials.FierySteel.getFluid(25L))
+ .duration(5 * SECONDS)
+ .eut(2)
+ .addTo(chemicalBathRecipes);
+
+ tOutput = GT_Utility.copyAmount(1, aStack);
+ GT_Utility.updateItemStack(tOutput);
+ GT_Utility.ItemNBT.addEnchantment(
+ tOutput,
+ Enchantment.fireAspect,
+ EnchantmentHelper.getEnchantmentLevel(Enchantment.fireAspect.effectId, tOutput) + 1);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(tOutput)
+ .fluidInputs(Materials.Blaze.getMolten(18L))
+ .duration(5 * SECONDS)
+ .eut(2)
+ .addTo(chemicalBathRecipes);
+
+ tOutput = GT_Utility.copyAmount(1, aStack);
+ GT_Utility.updateItemStack(tOutput);
+ GT_Utility.ItemNBT.addEnchantment(
+ tOutput,
+ Enchantment.knockback,
+ EnchantmentHelper.getEnchantmentLevel(Enchantment.knockback.effectId, tOutput) + 1);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(tOutput)
+ .fluidInputs(Materials.Rubber.getMolten(18L))
+ .duration(5 * SECONDS)
+ .eut(2)
+ .addTo(chemicalBathRecipes);
+
+ tOutput = GT_Utility.copyAmount(1, aStack);
+ GT_Utility.updateItemStack(tOutput);
+ GT_Utility.ItemNBT.addEnchantment(
+ tOutput,
+ gregtech.api.enchants.Enchantment_EnderDamage.INSTANCE,
+ EnchantmentHelper
+ .getEnchantmentLevel(gregtech.api.enchants.Enchantment_EnderDamage.INSTANCE.effectId, tOutput) + 1);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(tOutput)
+ .fluidInputs(Materials.Mercury.getFluid(25L))
+ .duration(5 * SECONDS)
+ .eut(2)
+ .addTo(chemicalBathRecipes);
+
+ if (!aMaterial.mUnificatable) {
+ return;
+ }
+ if (aMaterial.mMaterialInto != aMaterial) {
+ return;
+ }
+
+ if (aMaterial.contains(SubTag.NO_WORKING)) {
+ return;
+ }
+
+ switch (aPrefix) {
+ case arrowGtWood:
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.arrowGtWood, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { " A", " S ", "F ", 'S', OrePrefixes.stick.get(Materials.Wood), 'F',
+ OreDictNames.craftingFeather, 'A', OrePrefixes.toolHeadArrow.get(aMaterial) });
+ case arrowGtPlastic:
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.arrowGtPlastic, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { " A", " S ", "F ", 'S', OrePrefixes.stick.get(Materials.Plastic), 'F',
+ OreDictNames.craftingFeather, 'A', OrePrefixes.toolHeadArrow.get(aMaterial) });
+ default:
+ break;
+ }
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingBeans.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingBeans.java
new file mode 100644
index 0000000000..2fb200216e
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingBeans.java
@@ -0,0 +1,35 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingBeans implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingBeans() {
+ OrePrefixes.beans.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+
+ if (!aOreDictName.equals("beansCocoa")) {
+ return;
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cocoa, 1L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingBlock.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingBlock.java
new file mode 100644
index 0000000000..b9926b188b
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingBlock.java
@@ -0,0 +1,187 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsBotania;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingBlock implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingBlock() {
+ OrePrefixes.block.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+
+ if (aMaterial == Materials.Ichorium) {
+ return;
+ }
+
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV
+ && GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+
+ if (aMaterial == MaterialsBotania.Livingrock || aMaterial == MaterialsBotania.Livingwood
+ || aMaterial == MaterialsBotania.Dreamwood) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
+ .fluidInputs(
+ Materials.Water.getFluid(
+ Math.max(
+ 4,
+ Math.min(1000, ((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS * 30 / 320))))
+ .duration(2 * ((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
+ .fluidInputs(
+ GT_ModHandler.getDistilledWater(
+ Math.max(
+ 3,
+ Math.min(750, ((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS * 30 / 426))))
+ .duration(2 * ((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
+ .fluidInputs(
+ Materials.Lubricant.getFluid(
+ Math.max(
+ 1,
+ Math.min(250, ((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS * 30 / 1280))))
+ .duration(((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ }
+
+ else if (aMaterial != Materials.Clay && aMaterial != Materials.Basalt) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
+ .fluidInputs(
+ Materials.Water.getFluid(
+ Math.max(
+ 4,
+ Math.min(1000, ((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS * 30 / 320))))
+ .duration(2 * ((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
+ .fluidInputs(
+ GT_ModHandler.getDistilledWater(
+ Math.max(
+ 3,
+ Math.min(750, ((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS * 30 / 426))))
+ .duration(2 * ((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L))
+ .fluidInputs(
+ Materials.Lubricant.getFluid(
+ Math.max(
+ 1,
+ Math.min(250, ((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS * 30 / 1280))))
+ .duration(((int) Math.max(aMaterial.getMass() * 10L, 1L)) * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+ }
+ }
+
+ ItemStack tStack1 = GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L);
+ ItemStack tStack2 = GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L);
+ ItemStack tStack3 = GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L);
+
+ GT_ModHandler.removeRecipeDelayed(GT_Utility.copyAmount(1, aStack));
+
+ if (tStack1 != null) GT_ModHandler
+ .removeRecipeDelayed(tStack1, tStack1, tStack1, tStack1, tStack1, tStack1, tStack1, tStack1, tStack1);
+ if (tStack2 != null) GT_ModHandler
+ .removeRecipeDelayed(tStack2, tStack2, tStack2, tStack2, tStack2, tStack2, tStack2, tStack2, tStack2);
+ if (tStack3 != null) {
+ GT_ModHandler
+ .removeRecipeDelayed(tStack3, tStack3, tStack3, tStack3, tStack3, tStack3, tStack3, tStack3, tStack3);
+ }
+
+ if (aMaterial.mStandardMoltenFluid != null) {
+ if (!(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Block.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(1296L))
+ .duration(14 * SECONDS + 8 * TICKS)
+ .eut(8)
+ .addTo(fluidSolidifierRecipes);
+ }
+ }
+ }
+
+ if (tStack1 != null) tStack1.stackSize = 9;
+ if (tStack2 != null) tStack2.stackSize = 9;
+ if (tStack3 != null) tStack3.stackSize = 9;
+
+ if (tStack2 != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack)
+ .itemOutputs(tStack2)
+ .duration(5 * SECONDS)
+ .eut(24)
+ .addTo(hammerRecipes);
+ }
+
+ if (tStack2 != null && aMaterial != Materials.NetherQuartz) {
+ if (tStack3 != null)
+ GT_ModHandler.addShapelessCraftingRecipe(tStack3, new Object[] { OrePrefixes.block.get(aMaterial) });
+ GT_ModHandler.addShapelessCraftingRecipe(tStack2, new Object[] { OrePrefixes.block.get(aMaterial) });
+ if (tStack1 != null)
+ GT_ModHandler.addShapelessCraftingRecipe(tStack1, new Object[] { OrePrefixes.block.get(aMaterial) });
+ }
+
+ if (!OrePrefixes.block.isIgnored(aMaterial) && tStack1 != null) {
+ // 9 ingots -> 1 block
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 9L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
+ .duration(15 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 2))
+ .addTo(compressorRecipes);
+ }
+
+ switch (aMaterial.mName) {
+ case "Mercury" -> System.err.println(
+ "'blockQuickSilver'?, In which Ice Desert can you actually place this as a solid Block? On Pluto Greg :)");
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingBolt.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingBolt.java
new file mode 100644
index 0000000000..0d28c417a8
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingBolt.java
@@ -0,0 +1,44 @@
+package gregtech.loaders.oreprocessing;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+
+public class ProcessingBolt implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingBolt() {
+ OrePrefixes.bolt.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (aMaterial.getProcessingMaterialTierEU() >= TierEU.IV) {
+ return;
+ }
+
+ if (!aMaterial.mUnificatable) {
+ return;
+ }
+
+ if ((aMaterial.mMaterialInto != aMaterial)) {
+ return;
+ }
+
+ if (aMaterial.contains(SubTag.NO_WORKING)) {
+ return;
+ }
+
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(2, aStack),
+ GT_Proxy.tBits,
+ new Object[] { "s ", " X", 'X', OrePrefixes.stick.get(aMaterial) });
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCell.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCell.java
new file mode 100644
index 0000000000..5a6bdfcf13
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCell.java
@@ -0,0 +1,441 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.electrolyzerRecipes;
+import static gregtech.api.recipe.RecipeMaps.vacuumFreezerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.interfaces.IOreRecipeRegistrator;
+import gregtech.api.objects.MaterialStack;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingCell implements IOreRecipeRegistrator {
+
+ public ProcessingCell() {
+ OrePrefixes.cell.add(this);
+ OrePrefixes.cellPlasma.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ switch (aPrefix) {
+ case cell -> {
+ if (aMaterial == Materials.Empty) {
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+ if (aModName.equalsIgnoreCase("AtomicScience")) {
+ GT_ModHandler.addExtractionRecipe(ItemList.Cell_Empty.get(1L), aStack);
+ }
+ } else {
+ if (aMaterial.mFuelPower > 0) {
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder.itemInputs(GT_Utility.copyAmount(1, aStack));
+ if (GT_Utility.getFluidForFilledItem(aStack, true) == null
+ && GT_Utility.getContainerItem(aStack, true) != null) {
+ recipeBuilder.itemOutputs(GT_Utility.getContainerItem(aStack, true));
+ }
+ recipeBuilder.metadata(FUEL_VALUE, aMaterial.mFuelPower)
+ .metadata(FUEL_TYPE, aMaterial.mFuelType)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+ if (!((aMaterial.mMaterialList.size() > 0) && ((aMaterial.mExtraData & 0x3) != 0))) {
+ break;
+ }
+
+ int tAllAmount = 0;
+ for (MaterialStack tMat2 : aMaterial.mMaterialList) {
+ tAllAmount = (int) (tAllAmount + tMat2.mAmount);
+ }
+ long tItemAmount = 0L;
+ long tCapsuleCount = (long) GT_ModHandler
+ .getCapsuleCellContainerCountMultipliedWithStackSize(aStack) * -tAllAmount;
+ long tDensityMultiplier = aMaterial.getDensity() > 3628800L ? aMaterial.getDensity() / 3628800L
+ : 1L;
+ ArrayList<ItemStack> tList = new ArrayList<>();
+ for (MaterialStack tMat : aMaterial.mMaterialList) {
+ if (tMat.mAmount <= 0) {
+ continue;
+ }
+
+ ItemStack tStack;
+ if (tMat.mMaterial == Materials.Air) {
+ tStack = ItemList.Cell_Air.get(tMat.mAmount * tDensityMultiplier / 2L);
+ } else {
+ tStack = GT_OreDictUnificator.get(OrePrefixes.dust, tMat.mMaterial, tMat.mAmount);
+ if (tStack == null) {
+ tStack = GT_OreDictUnificator.get(OrePrefixes.cell, tMat.mMaterial, tMat.mAmount);
+ }
+ }
+ if (tItemAmount + tMat.mAmount * 3628800L > aStack.getMaxStackSize() * aMaterial.getDensity()) {
+ continue;
+ }
+
+ tItemAmount += tMat.mAmount * 3628800L;
+
+ if (tStack == null) {
+ continue;
+ }
+
+ tStack.stackSize = ((int) (tStack.stackSize * tDensityMultiplier));
+ while ((tStack.stackSize > 64)
+ && (tCapsuleCount + GT_ModHandler.getCapsuleCellContainerCount(tStack) * 64L < 0L
+ ? tList.size() < 5
+ : tList.size() < 6)
+ && (tCapsuleCount + GT_ModHandler.getCapsuleCellContainerCount(tStack) * 64L <= 64L)) {
+ tCapsuleCount += GT_ModHandler.getCapsuleCellContainerCount(tStack) * 64L;
+ tList.add(GT_Utility.copyAmount(64, tStack));
+ tStack.stackSize -= 64;
+ }
+ int tThisCapsuleCount = GT_ModHandler
+ .getCapsuleCellContainerCountMultipliedWithStackSize(tStack);
+ if (tStack.stackSize > 0 && tCapsuleCount + tThisCapsuleCount <= 64L) {
+ if (tCapsuleCount + tThisCapsuleCount < 0L ? tList.size() < 5 : tList.size() < 6) {
+ tCapsuleCount += tThisCapsuleCount;
+ tList.add(tStack);
+ }
+ }
+ }
+
+ tItemAmount = GT_Utility.ceilDiv(tItemAmount * tDensityMultiplier, aMaterial.getDensity());
+
+ if (tList.size() <= 0) {
+ break;
+ }
+
+ if ((aMaterial.mExtraData & 0x1) != 0) {
+
+ // Electrolyzer recipe
+ if (GT_Utility.getFluidForFilledItem(aStack, true) == null) {
+ // dust stuffed cell e.g. Phosphate, Phosphorous Pentoxide
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ if (tCapsuleCount > 0L) {
+ recipeBuilder.itemInputs(
+ GT_Utility.copyAmount(tItemAmount, aStack),
+ ItemList.Cell_Empty.get(tCapsuleCount));
+ } else {
+ recipeBuilder.itemInputs(GT_Utility.copyAmount(tItemAmount, aStack));
+ }
+ if (tCapsuleCount < 0L) {
+ tList.add(ItemList.Cell_Empty.get(-tCapsuleCount));
+ }
+ ItemStack[] outputsArray = tList.toArray(new ItemStack[Math.min(tList.size(), 6)]);
+ recipeBuilder.itemOutputs(outputsArray)
+ .duration(Math.max(1L, Math.abs(aMaterial.getProtons() * 2L * tItemAmount)))
+ .eut(Math.min(4, tList.size()) * 30)
+ .addTo(electrolyzerRecipes);
+ } else {
+ long tCellBalance = tCapsuleCount + tItemAmount - 1;
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ if (tCellBalance > 0L) {
+ recipeBuilder.itemInputs(aStack, ItemList.Cell_Empty.get(tCellBalance));
+ } else {
+ recipeBuilder.itemInputs(aStack);
+ }
+ if (tCellBalance < 0L) {
+ tList.add(ItemList.Cell_Empty.get(-tCellBalance));
+ }
+ ItemStack[] outputsArray = tList.toArray(new ItemStack[Math.min(tList.size(), 6)]);
+ recipeBuilder.itemOutputs(outputsArray)
+ .duration(Math.max(1L, Math.abs(aMaterial.getProtons() * 8L * tItemAmount)))
+ .eut(Math.min(4, tList.size()) * 30)
+ .addTo(electrolyzerRecipes);
+ }
+ }
+ if ((aMaterial.mExtraData & 0x2) != 0) {
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ if (tCapsuleCount > 0L) {
+ recipeBuilder.itemInputs(
+ GT_Utility.copyAmount(tItemAmount, aStack),
+ ItemList.Cell_Empty.get(tCapsuleCount));
+ } else {
+ recipeBuilder.itemInputs(GT_Utility.copyAmount(tItemAmount, aStack));
+ }
+ if (tCapsuleCount < 0L) {
+ tList.add(ItemList.Cell_Empty.get(-tCapsuleCount));
+ }
+ ItemStack[] outputsArray = tList.toArray(new ItemStack[Math.min(tList.size(), 6)]);
+ recipeBuilder.itemOutputs(outputsArray)
+ .duration(Math.max(1L, Math.abs(aMaterial.getMass() * 2L * tItemAmount)))
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ }
+ }
+ }
+ case cellPlasma -> {
+ if (aMaterial == Materials.Empty) {
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+ } else {
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder.itemInputs(GT_Utility.copyAmount(1, aStack));
+ if (GT_Utility.getFluidForFilledItem(aStack, true) == null
+ && GT_Utility.getContainerItem(aStack, true) != null) {
+ recipeBuilder.itemOutputs(GT_Utility.getContainerItem(aStack, true));
+ }
+ // Switch case to set manual values for specific plasmas and escape the formula based on mass
+ // when it doesn't make sense for powergen balance.
+ switch (aMaterial.mName) {
+ case "Aluminium" -> recipeBuilder.metadata(FUEL_VALUE, 159_744)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Americium" -> recipeBuilder.metadata(FUEL_VALUE, 501_760)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Antimony" -> recipeBuilder.metadata(FUEL_VALUE, 309_760)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Argon" -> recipeBuilder.metadata(FUEL_VALUE, 188_416)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Arsenic" -> recipeBuilder.metadata(FUEL_VALUE, 230_400)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Barium" -> recipeBuilder.metadata(FUEL_VALUE, 342_302)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Beryllium" -> recipeBuilder.metadata(FUEL_VALUE, 110_592)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Bismuth" -> recipeBuilder.metadata(FUEL_VALUE, 425_984)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Boron" -> recipeBuilder.metadata(FUEL_VALUE, 112_640)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Cadmium" -> recipeBuilder.metadata(FUEL_VALUE, 293_601)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Caesium" -> recipeBuilder.metadata(FUEL_VALUE, 332_513)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Calcium" -> recipeBuilder.metadata(FUEL_VALUE, 188_416)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Cerium" -> recipeBuilder.metadata(FUEL_VALUE, 346_931)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Chlorine" -> recipeBuilder.metadata(FUEL_VALUE, 172_032)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Chrome" -> recipeBuilder.metadata(FUEL_VALUE, 202_342)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Cobalt" -> recipeBuilder.metadata(FUEL_VALUE, 217_497)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Copper" -> recipeBuilder.metadata(FUEL_VALUE, 219_340)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Deuterium" -> recipeBuilder.metadata(FUEL_VALUE, 40_960)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Erbium" -> recipeBuilder.metadata(FUEL_VALUE, 376_217)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Europium" -> recipeBuilder.metadata(FUEL_VALUE, 355_635)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Fluorine" -> recipeBuilder.metadata(FUEL_VALUE, 147_456)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Force" -> recipeBuilder.metadata(FUEL_VALUE, 150_000)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Gadolinium" -> recipeBuilder.metadata(FUEL_VALUE, 366_551)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Gallium" -> recipeBuilder.metadata(FUEL_VALUE, 229_376)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Gold" -> recipeBuilder.metadata(FUEL_VALUE, 401_408)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Helium_3" -> recipeBuilder.metadata(FUEL_VALUE, 61_440)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Helium" -> recipeBuilder.metadata(FUEL_VALUE, 81_920)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Holmium" -> recipeBuilder.metadata(FUEL_VALUE, 376_176)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Hydrogen" -> recipeBuilder.metadata(FUEL_VALUE, 20_480)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Indium" -> recipeBuilder.metadata(FUEL_VALUE, 296_509)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Iridium" -> recipeBuilder.metadata(FUEL_VALUE, 397_148)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Iron" -> recipeBuilder.metadata(FUEL_VALUE, 206_438)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Lanthanum" -> recipeBuilder.metadata(FUEL_VALUE, 344_801)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Lead" -> recipeBuilder.metadata(FUEL_VALUE, 423_936)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Lithium" -> recipeBuilder.metadata(FUEL_VALUE, 100_352)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Lutetium" -> recipeBuilder.metadata(FUEL_VALUE, 381_296)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Magnesium" -> recipeBuilder.metadata(FUEL_VALUE, 152_371)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Manganese" -> recipeBuilder.metadata(FUEL_VALUE, 202_752)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Mercury" -> recipeBuilder.metadata(FUEL_VALUE, 409_600)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Molybdenum" -> recipeBuilder.metadata(FUEL_VALUE, 272_384)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Neodymium" -> recipeBuilder.metadata(FUEL_VALUE, 347_996)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Nickel" -> recipeBuilder.metadata(FUEL_VALUE, 213_811)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Niobium" -> recipeBuilder.metadata(FUEL_VALUE, 269_516)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Nitrogen" -> recipeBuilder.metadata(FUEL_VALUE, 129_024)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Osmium" -> recipeBuilder.metadata(FUEL_VALUE, 393_659)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Oxygen" -> recipeBuilder.metadata(FUEL_VALUE, 131_072)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Palladium" -> recipeBuilder.metadata(FUEL_VALUE, 282_214)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Phosphor" -> recipeBuilder.metadata(FUEL_VALUE, 165_888)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Platinum" -> recipeBuilder.metadata(FUEL_VALUE, 399_360)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Plutonium241" -> recipeBuilder.metadata(FUEL_VALUE, 497_664)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Plutonium" -> recipeBuilder.metadata(FUEL_VALUE, 503_808)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Potassium" -> recipeBuilder.metadata(FUEL_VALUE, 183_705)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Praseodymium" -> recipeBuilder.metadata(FUEL_VALUE, 346_931)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Promethium" -> recipeBuilder.metadata(FUEL_VALUE, 347_996)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Radon" -> recipeBuilder.metadata(FUEL_VALUE, 450_560)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Rubidium" -> recipeBuilder.metadata(FUEL_VALUE, 243_712)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Samarium" -> recipeBuilder.metadata(FUEL_VALUE, 353_280)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Scandium" -> recipeBuilder.metadata(FUEL_VALUE, 193_536)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Silicon" -> recipeBuilder.metadata(FUEL_VALUE, 160_563)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Silver" -> recipeBuilder.metadata(FUEL_VALUE, 282_685)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Sodium" -> recipeBuilder.metadata(FUEL_VALUE, 148_684)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Strontium" -> recipeBuilder.metadata(FUEL_VALUE, 249_446)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Sulfur" -> recipeBuilder.metadata(FUEL_VALUE, 170_393)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Tantalum" -> recipeBuilder.metadata(FUEL_VALUE, 384_000)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Terbium" -> recipeBuilder.metadata(FUEL_VALUE, 368_885)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Thorium" -> recipeBuilder.metadata(FUEL_VALUE, 471_040)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Thulium" -> recipeBuilder.metadata(FUEL_VALUE, 378_470)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Tin" -> recipeBuilder.metadata(FUEL_VALUE, 150_000)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Titanium" -> recipeBuilder.metadata(FUEL_VALUE, 196_608)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Tritium" -> recipeBuilder.metadata(FUEL_VALUE, 61_440)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Tungsten" -> recipeBuilder.metadata(FUEL_VALUE, 384_778)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Uranium235" -> recipeBuilder.metadata(FUEL_VALUE, 481_280)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Uranium" -> recipeBuilder.metadata(FUEL_VALUE, 487_424)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Vanadium" -> recipeBuilder.metadata(FUEL_VALUE, 198_451)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Ytterbium" -> recipeBuilder.metadata(FUEL_VALUE, 379_695)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Yttrium" -> recipeBuilder.metadata(FUEL_VALUE, 255_180)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ case "Zinc" -> recipeBuilder.metadata(FUEL_VALUE, 226_304)
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ default -> recipeBuilder
+ .metadata(FUEL_VALUE, (int) Math.max(1024L, 1024L * aMaterial.getMass()))
+ .metadata(FUEL_TYPE, 4)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L))
+ .duration(((int) Math.max(aMaterial.getMass() * 2L, 1L)) * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+ }
+ }
+ }
+ default -> {}
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCircuit.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCircuit.java
new file mode 100644
index 0000000000..c5e0e9ce0d
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCircuit.java
@@ -0,0 +1,44 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class ProcessingCircuit implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingCircuit() {
+ OrePrefixes.circuit.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (gregtech.api.util.GT_OreDictUnificator.isBlacklisted(aStack) && aModName.equals(GregTech.ID)) return;
+ switch (aMaterial.mName) {
+ case "Good", "Data", "Elite", "Master", "Ultimate", "Superconductor", "Infinite", "Bio" -> {
+ if (!GT_OreDictUnificator.isBlacklisted(aStack) && !aModName.equals(GregTech.ID))
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+ }
+ case "Primitive", "Advanced" -> GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+ case "Basic" -> {
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+ GT_ModHandler.addCraftingRecipe(
+ aStack,
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "RIR", "VBV", "CCC", 'R', ItemList.Circuit_Parts_Resistor.get(1), 'C',
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.RedAlloy, 1), 'V',
+ ItemList.Circuit_Parts_Vacuum_Tube.get(1), 'B', ItemList.Circuit_Board_Coated_Basic.get(1), 'I',
+ ItemList.IC2_Item_Casing_Steel.get(1) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_ModHandler.getIC2Item("electronicCircuit", 1L),
+ new Object[] { ItemList.Circuit_Integrated.getWildcard(1L) });
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCompressed.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCompressed.java
new file mode 100644
index 0000000000..4ef818df5b
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCompressed.java
@@ -0,0 +1,25 @@
+package gregtech.loaders.oreprocessing;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IOreRecipeRegistrator;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+
+public class ProcessingCompressed implements IOreRecipeRegistrator {
+
+ public ProcessingCompressed() {
+ OrePrefixes.compressed.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+ GregTech_API
+ .registerCover(aStack, TextureFactory.of(aMaterial.mIconSet.mTextures[72], aMaterial.mRGBa, false), null);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrafting.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrafting.java
new file mode 100644
index 0000000000..438da254a2
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrafting.java
@@ -0,0 +1,464 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.BuildCraftSilicon;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+@SuppressWarnings("RedundantLabeledSwitchRuleCodeBlock")
+public class ProcessingCrafting implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingCrafting() {
+ OrePrefixes.crafting.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ switch (aOreDictName) {
+ case "craftingQuartz" -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.redstone_torch, 3, 32767), GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(new ItemStack(net.minecraft.init.Items.comparator, 1, 0))
+ .fluidInputs(Materials.Concrete.getMolten(144L))
+ .duration(2 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+ }
+ case "craftingLensBlue" -> {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L),
+ GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 13))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L),
+ GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 13))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_LapotronCrystal.getWildcard(1L), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Parts_Crystal_Chip_Master.get(3L))
+ .requiresCleanRoom()
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Chip_CrystalCPU.get(1L), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Chip_CrystalSoC.get(1))
+ .requiresCleanRoom()
+ .duration(30 * SECONDS)
+ .eut(40000)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_PIC.get(1))
+ .requiresCleanRoom()
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_PIC.get(4))
+ .requiresCleanRoom()
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_QPIC.get(1))
+ .requiresCleanRoom()
+ .duration(2 * MINUTES)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(laserEngraverRecipes);
+
+ }
+ case "craftingLensYellow" -> {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L),
+ GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 14))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L),
+ GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 14))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_LPIC.get(1))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_LPIC.get(4))
+ .requiresCleanRoom()
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_SoC.get(1))
+ .requiresCleanRoom()
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_SoC.get(4))
+ .requiresCleanRoom()
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_SoC.get(8))
+ .requiresCleanRoom()
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(laserEngraverRecipes);
+ }
+ case "craftingLensOrange" -> {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_Simple_SoC.get(1))
+ .duration(15 * SECONDS)
+ .eut(64)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_Simple_SoC.get(4))
+ .duration(15 * SECONDS)
+ .eut(256)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_Simple_SoC.get(16))
+ .duration(15 * SECONDS)
+ .eut(1024)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_Simple_SoC.get(64))
+ .duration(15 * SECONDS)
+ .eut(4096)
+ .addTo(laserEngraverRecipes);
+
+ }
+ case "craftingLensCyan" -> {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L),
+ GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 15))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L),
+ GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 15))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_Ram.get(1))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_Ram.get(4))
+ .requiresCleanRoom()
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_Ram.get(8))
+ .requiresCleanRoom()
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_Ram.get(16))
+ .requiresCleanRoom()
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_Ram.get(32))
+ .requiresCleanRoom()
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(laserEngraverRecipes);
+
+ }
+ case "craftingLensRed" -> {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Redstone, 1L),
+ GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(GT_ModHandler.getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.RedAlloy, 1L),
+ GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.EtchedLowVoltageWiring", 1L, 0))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_ILC.get(1))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_ILC.get(4))
+ .requiresCleanRoom()
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_ILC.get(8))
+ .requiresCleanRoom()
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_NPIC.get(1))
+ .requiresCleanRoom()
+ .duration(1 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_NPIC.get(4))
+ .requiresCleanRoom()
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(laserEngraverRecipes);
+
+ }
+ case "craftingLensGreen" -> {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Parts_Crystal_Chip_Elite.get(1L), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Chip_CrystalCPU.get(1))
+ .requiresCleanRoom()
+ .duration(30 * SECONDS)
+ .eut(10000)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Chip_CrystalSoC.get(1L), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Chip_CrystalSoC2.get(1))
+ .requiresCleanRoom()
+ .duration(60 * SECONDS)
+ .eut(80000)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_ULPIC.get(2))
+ .duration(30 * SECONDS)
+ .eut(30)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_ULPIC.get(8))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_SoC2.get(1))
+ .requiresCleanRoom()
+ .duration(1 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_SoC2.get(2))
+ .requiresCleanRoom()
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_SoC2.get(4))
+ .requiresCleanRoom()
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(laserEngraverRecipes);
+ }
+ case "craftingLensWhite" -> {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L),
+ GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 19))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.WroughtIron, 1L),
+ GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 19))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.sandstone, 1, 2), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(new ItemStack(Blocks.sandstone, 1, 1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.stone, 1, 0), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(new ItemStack(Blocks.stonebrick, 1, 3))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.quartz_block, 1, 0), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(new ItemStack(Blocks.quartz_block, 1, 1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_ModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartz", 1L),
+ GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(GT_ModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartzChiseled", 1L))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_CPU.get(1))
+ .requiresCleanRoom()
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer2.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_CPU.get(4))
+ .requiresCleanRoom()
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer3.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_CPU.get(8))
+ .requiresCleanRoom()
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer4.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_CPU.get(16))
+ .requiresCleanRoom()
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Circuit_Silicon_Wafer5.get(1), GT_Utility.copyAmount(0, aStack))
+ .itemOutputs(ItemList.Circuit_Wafer_CPU.get(32))
+ .requiresCleanRoom()
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(laserEngraverRecipes);
+
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrate.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrate.java
new file mode 100644
index 0000000000..105b5c8f13
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrate.java
@@ -0,0 +1,132 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.packagerRecipes;
+import static gregtech.api.recipe.RecipeMaps.unpackagerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.common.GT_Proxy;
+
+public class ProcessingCrate implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingCrate() {
+ OrePrefixes.crateGtDust.add(this);
+ OrePrefixes.crateGtIngot.add(this);
+ OrePrefixes.crateGtGem.add(this);
+ OrePrefixes.crateGtPlate.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ boolean aSpecialRecipeReq2 = aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)
+ && !aMaterial.contains(SubTag.NO_WORKING);
+ switch (aPrefix) {
+ case crateGtDust -> {
+ if (GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 16L),
+ ItemList.Crate_Empty.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.crateGtDust, aMaterial, 1L))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(packagerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crateGtDust, aMaterial, 1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 16L),
+ ItemList.Crate_Empty.get(1L))
+ .duration(40 * SECONDS)
+ .eut(1)
+ .addTo(unpackagerRecipes);
+ }
+ if (aSpecialRecipeReq2) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 16L),
+ GT_Proxy.tBits,
+ new Object[] { "Xc", 'X', OrePrefixes.crateGtDust.get(aMaterial) });
+ }
+ case crateGtIngot -> {
+ if (GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 16L),
+ ItemList.Crate_Empty.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.crateGtIngot, aMaterial, 1L))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(packagerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crateGtIngot, aMaterial, 1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 16L),
+ ItemList.Crate_Empty.get(1L))
+ .duration(40 * SECONDS)
+ .eut(1)
+ .addTo(unpackagerRecipes);
+ }
+ if (aSpecialRecipeReq2) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 16L),
+ GT_Proxy.tBits,
+ new Object[] { "Xc", 'X', OrePrefixes.crateGtIngot.get(aMaterial) });
+ }
+ case crateGtGem -> {
+ if (GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 16L),
+ ItemList.Crate_Empty.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.crateGtGem, aMaterial, 1L))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(packagerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crateGtGem, aMaterial, 1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 16L),
+ ItemList.Crate_Empty.get(1L))
+ .duration(40 * SECONDS)
+ .eut(1)
+ .addTo(unpackagerRecipes);
+ }
+ if (aSpecialRecipeReq2) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 16L),
+ GT_Proxy.tBits,
+ new Object[] { "Xc", 'X', OrePrefixes.crateGtGem.get(aMaterial) });
+ }
+ case crateGtPlate -> {
+ if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 16L),
+ ItemList.Crate_Empty.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.crateGtPlate, aMaterial, 1L))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(packagerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crateGtPlate, aMaterial, 1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 16L),
+ ItemList.Crate_Empty.get(1L))
+ .duration(40 * SECONDS)
+ .eut(1)
+ .addTo(unpackagerRecipes);
+ }
+ if (aSpecialRecipeReq2) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 16L),
+ GT_Proxy.tBits,
+ new Object[] { "Xc", 'X', OrePrefixes.crateGtPlate.get(aMaterial) });
+ }
+ default -> {}
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrop.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrop.java
new file mode 100644
index 0000000000..92b5ae9cda
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrop.java
@@ -0,0 +1,154 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.recipe.RecipeMaps.brewingRecipes;
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.recipe.RecipeMaps.slicerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class ProcessingCrop implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingCrop() {
+ OrePrefixes.crop.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ net.minecraft.item.ItemStack aStack) {
+ // Compressor recipes
+ GT_Values.RA.stdBuilder()
+ .itemInputs(gregtech.api.util.GT_Utility.copyAmount(8, aStack))
+ .itemOutputs(ItemList.IC2_PlantballCompressed.get(1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ Fluid[] waterArray;
+
+ if (IndustrialCraft2.isModLoaded()) {
+ waterArray = new Fluid[] { FluidRegistry.WATER, GT_ModHandler.getDistilledWater(1L)
+ .getFluid() };
+ } else {
+ waterArray = new Fluid[] { FluidRegistry.WATER };
+ }
+
+ switch (aOreDictName) {
+ case "cropTea" -> {
+ for (Fluid tFluid : waterArray) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack)
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion.tea"), 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+ }
+ }
+ case "cropGrape" -> {
+ for (Fluid tFluid : waterArray) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack)
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion.grapejuice"), 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+ }
+ }
+ case "cropChilipepper" -> GT_Values.RA.stdBuilder()
+ .itemInputs(aStack)
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ case "cropCoffee" -> GT_Values.RA.stdBuilder()
+ .itemInputs(aStack)
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coffee, 1L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ case "cropPotato" -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, ItemList.Shape_Slicer_Flat.get(0))
+ .itemOutputs(ItemList.Food_Raw_PotatoChips.get(1L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(4)
+ .addTo(slicerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, ItemList.Shape_Slicer_Stripes.get(0L))
+ .itemOutputs(ItemList.Food_Raw_Fries.get(1L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(4)
+ .addTo(slicerRecipes);
+
+ for (Fluid tFluid : waterArray) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack)
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion.potatojuice"), 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+ }
+ }
+ case "cropLemon" -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, ItemList.Shape_Slicer_Flat.get(0))
+ .itemOutputs(ItemList.Food_Sliced_Lemon.get(4L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(4)
+ .addTo(slicerRecipes);
+
+ for (Fluid tFluid : waterArray) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack)
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion.lemonjuice"), 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack)
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("potion.vodka"), 750))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion.leninade"), 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+ }
+ case "cropTomato" -> GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, ItemList.Shape_Slicer_Flat.get(0))
+ .itemOutputs(ItemList.Food_Sliced_Tomato.get(4L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(4)
+ .addTo(slicerRecipes);
+ case "cropCucumber" -> GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, ItemList.Shape_Slicer_Flat.get(0))
+ .itemOutputs(ItemList.Food_Sliced_Cucumber.get(4L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(4)
+ .addTo(slicerRecipes);
+ case "cropOnion" -> GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, ItemList.Shape_Slicer_Flat.get(0))
+ .itemOutputs(ItemList.Food_Sliced_Onion.get(4L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(4)
+ .addTo(slicerRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrushedOre.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrushedOre.java
new file mode 100644
index 0000000000..a730a1849b
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrushedOre.java
@@ -0,0 +1,107 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.recipe.RecipeMaps.sifterRecipes;
+import static gregtech.api.recipe.RecipeMaps.thermalCentrifugeRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingCrushedOre implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingCrushedOre() {
+ OrePrefixes.crushedCentrifuged.add(this);
+ OrePrefixes.crushedPurified.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ switch (aPrefix) {
+ case crushedCentrifuged -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
+ GT_OreDictUnificator.get(
+ OrePrefixes.dust,
+ GT_Utility.selectItemInList(2, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
+ 1L))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ }
+ case crushedPurified -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(
+ OrePrefixes.crushedCentrifuged,
+ aMaterial.mMacerateInto,
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
+ 1L),
+ GT_OreDictUnificator.get(
+ OrePrefixes.dust,
+ GT_Utility.selectItemInList(1, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
+ 1L))
+ .outputChances(10000, 1111)
+ .duration(25 * SECONDS)
+ .eut(48)
+ .addTo(thermalCentrifugeRecipes);
+
+ ItemStack tGem = GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L);
+ if (tGem == null) {
+ break;
+ }
+
+ switch (aMaterial.mName) {
+ case "Tanzanite", "Sapphire", "Olivine", "GreenSapphire", "Opal", "Amethyst", "Emerald", "Ruby", "Amber", "Diamond", "FoolsRuby", "BlueTopaz", "GarnetRed", "Topaz", "Jasper", "GarnetYellow" -> GT_Values.RA
+ .stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, tGem, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, tGem, 1L),
+ tGem,
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, tGem, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.gemChipped, aMaterial, tGem, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, tGem, 1L))
+ .outputChances(300, 1200, 4500, 1400, 2800, 3500)
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(sifterRecipes);
+ default -> GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, tGem, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, tGem, 1L),
+ tGem,
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, tGem, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.gemChipped, aMaterial, tGem, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, tGem, 1L))
+ .outputChances(100, 400, 1500, 2000, 4000, 5000)
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(sifterRecipes);
+ }
+
+ }
+ default -> {}
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrystallized.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrystallized.java
new file mode 100644
index 0000000000..ec8fd12a74
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingCrystallized.java
@@ -0,0 +1,49 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingCrystallized implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingCrystallized() {
+ OrePrefixes.crystal.add(this);
+ OrePrefixes.crystalline.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (aMaterial.mMacerateInto == null) {
+ return;
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1) == null) {
+ return;
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingDirty.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingDirty.java
new file mode 100644
index 0000000000..b3aad4e25c
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingDirty.java
@@ -0,0 +1,136 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.recipe.RecipeMaps.thermalCentrifugeRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingDirty implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingDirty() {
+ OrePrefixes.clump.add(this);
+ OrePrefixes.shard.add(this);
+ OrePrefixes.crushed.add(this);
+ OrePrefixes.dirtyGravel.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ net.minecraft.item.ItemStack aStack) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial.mMacerateInto, 1L))
+ .duration(10)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(
+ OrePrefixes.dustImpure,
+ aMaterial.mMacerateInto,
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
+ 1L),
+ GT_OreDictUnificator.get(
+ OrePrefixes.dust,
+ GT_Utility.selectItemInList(0, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
+ 1L))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_ModHandler.addOreWasherRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ new int[] { 10000, 1111, 10000 },
+ 1000,
+ GT_OreDictUnificator.get(
+ aPrefix == OrePrefixes.crushed ? OrePrefixes.crushedPurified : OrePrefixes.dustPure,
+ aMaterial,
+ 1L),
+ GT_OreDictUnificator.get(
+ OrePrefixes.dust,
+ GT_Utility.selectItemInList(0, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
+ 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L));
+
+ OrePrefixes prefix = aPrefix == OrePrefixes.crushed ? OrePrefixes.crushedCentrifuged : OrePrefixes.dust;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(prefix, aMaterial, 1L),
+ GT_OreDictUnificator.get(
+ OrePrefixes.dust,
+ GT_Utility.selectItemInList(1, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
+ 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
+ .outputChances(10000, 1111, 10000)
+ .duration(25 * SECONDS)
+ .eut(48)
+ .addTo(thermalCentrifugeRecipes);
+
+ addChemicalBathRecipes(aMaterial, aMaterial, aStack, aPrefix);
+
+ for (Materials tMaterial : aMaterial.mOreByProducts) {
+ addChemicalBathRecipes(aMaterial, tMaterial, aStack, aPrefix);
+ }
+ }
+
+ private void addChemicalBathRecipes(Materials material, Materials byproduct, ItemStack stack, OrePrefixes prefix) {
+ OrePrefixes chemicalBathPrefix = prefix == OrePrefixes.crushed ? OrePrefixes.crushedPurified
+ : OrePrefixes.dustPure;
+
+ if (byproduct.contains(SubTag.WASHING_MERCURY)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, stack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(chemicalBathPrefix, material, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, byproduct.mMacerateInto, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
+ .outputChances(10000, 7000, 4000)
+ .fluidInputs(Materials.Mercury.getFluid(1000L))
+ .duration(40 * SECONDS)
+ .eut(8)
+ .addTo(chemicalBathRecipes);
+ }
+ if (byproduct.contains(SubTag.WASHING_MERCURY_99_PERCENT)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, stack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(chemicalBathPrefix, material, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, byproduct.mMacerateInto, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
+ .outputChances(10000, 9900, 4000)
+ .fluidInputs(Materials.Mercury.getFluid(1000L))
+ .duration(40 * SECONDS)
+ .eut(8)
+ .addTo(chemicalBathRecipes);
+ }
+ if (byproduct.contains(SubTag.WASHING_SODIUMPERSULFATE)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, stack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(chemicalBathPrefix, material, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, byproduct.mMacerateInto, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
+ .outputChances(10000, 7000, 4000)
+ .fluidInputs(Materials.SodiumPersulfate.getFluid(100L))
+ .duration(40 * SECONDS)
+ .eut(8)
+ .addTo(chemicalBathRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingDust.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingDust.java
new file mode 100644
index 0000000000..7cb26f7c36
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingDust.java
@@ -0,0 +1,630 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.autoclaveRecipes;
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.recipe.RecipeMaps.cannerRecipes;
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.recipe.RecipeMaps.electroMagneticSeparatorRecipes;
+import static gregtech.api.recipe.RecipeMaps.electrolyzerRecipes;
+import static gregtech.api.recipe.RecipeMaps.implosionRecipes;
+import static gregtech.api.recipe.RecipeMaps.packagerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+
+import java.util.ArrayList;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.objects.MaterialStack;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_RecipeRegistrator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingDust implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingDust() {
+ OrePrefixes.dust.add(this);
+ OrePrefixes.dustPure.add(this);
+ OrePrefixes.dustImpure.add(this);
+ OrePrefixes.dustRefined.add(this);
+ OrePrefixes.dustSmall.add(this);
+ OrePrefixes.dustTiny.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ switch (aPrefix) {
+ case dust -> {
+ if (aMaterial.mFuelPower > 0) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .metadata(FUEL_VALUE, aMaterial.mFuelPower)
+ .metadata(FUEL_TYPE, aMaterial.mFuelType)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+ if ((GT_Utility.getFluidForFilledItem(GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L), true)
+ == null) && (GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L) != null)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, ItemList.Cell_Empty.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, aMaterial, 1L))
+ .duration(5 * SECONDS)
+ .eut(1)
+ .addTo(cannerRecipes);
+ }
+ if (!aMaterial.mBlastFurnaceRequired) {
+ GT_RecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
+ if (aMaterial.mSmeltInto.mArcSmeltInto != aMaterial) {
+ GT_RecipeRegistrator.registerReverseArcSmelting(
+ GT_Utility.copyAmount(1, aStack),
+ aMaterial,
+ aPrefix.mMaterialAmount,
+ null,
+ null,
+ null);
+ }
+ }
+ ItemStack tDustStack;
+ if ((null != (tDustStack = GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L)))
+ && (!aMaterial.contains(SubTag.NO_SMELTING))) {
+ if (aMaterial.mBlastFurnaceRequired) {
+ GT_ModHandler.removeFurnaceSmelting(aStack);
+ if (aMaterial.mAutoGenerateBlastFurnaceRecipes) {
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1));
+ if (aMaterial.mBlastFurnaceTemp > 1750) {
+ recipeBuilder.itemOutputs(
+ GT_OreDictUnificator
+ .get(OrePrefixes.ingotHot, aMaterial.mSmeltInto, tDustStack, 1L));
+ } else {
+ recipeBuilder.itemOutputs(GT_Utility.copyAmount(1, tDustStack));
+ }
+ recipeBuilder
+ .duration(
+ (Math.max(aMaterial.getMass() / 40L, 1L) * aMaterial.mBlastFurnaceTemp) * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, (int) aMaterial.mBlastFurnaceTemp)
+ .addTo(blastFurnaceRecipes);
+ }
+ } else {
+ GT_ModHandler.addSmeltingRecipe(aStack, tDustStack);
+ }
+ } else if (!aMaterial.contains(SubTag.NO_WORKING)) {
+ if ((!OrePrefixes.block.isIgnored(aMaterial))
+ && (null == GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+ && GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L) != null) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(9, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+ }
+ // This is so disgustingly bad.
+ if (((OrePrefixes.block.isIgnored(aMaterial))
+ || (null == GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L)))
+ && (aMaterial != Materials.GraniteRed)
+ && (aMaterial != Materials.GraniteBlack)
+ && (aMaterial != Materials.Basalt)
+ && (aMaterial != Materials.Marble)
+ && (aMaterial != Materials.Glass)
+ && (aMaterial != Materials.Obsidian)
+ && (aMaterial != Materials.Glowstone)
+ && (aMaterial != Materials.Paper)
+ && (aMaterial != MaterialsUEVplus.TranscendentMetal)
+ && (aMaterial != Materials.Clay)) {
+ // compressor recipe
+ {
+ if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+ }
+ }
+ }
+ }
+ if ((aMaterial.mMaterialList.size() > 0) && ((aMaterial.mExtraData & 0x3) != 0)) {
+ long tItemAmount = 0L;
+ long tCapsuleCount = 0L;
+ long tDensityMultiplier = aMaterial.getDensity() > 3628800L ? aMaterial.getDensity() / 3628800L
+ : 1L;
+ ArrayList<ItemStack> tList = new ArrayList<>();
+ for (MaterialStack tMat : aMaterial.mMaterialList) if (tMat.mAmount > 0L) {
+ if (tMat.mMaterial == Materials.Air) {
+ tDustStack = ItemList.Cell_Air.get(tMat.mAmount / 2L);
+ } else {
+ tDustStack = GT_OreDictUnificator.get(OrePrefixes.dust, tMat.mMaterial, tMat.mAmount);
+ if (tDustStack == null)
+ tDustStack = GT_OreDictUnificator.get(OrePrefixes.cell, tMat.mMaterial, tMat.mAmount);
+ }
+ if (tItemAmount + tMat.mAmount * 3628800L
+ <= aStack.getMaxStackSize() * aMaterial.getDensity()) {
+ tItemAmount += tMat.mAmount * 3628800L;
+ if (tDustStack != null) {
+ tDustStack.stackSize = ((int) (tDustStack.stackSize * tDensityMultiplier));
+ while ((tDustStack.stackSize > 64) && (tList.size() < 6)
+ && (tCapsuleCount + GT_ModHandler.getCapsuleCellContainerCount(tDustStack) * 64L
+ <= 64L)) {
+ tCapsuleCount += GT_ModHandler.getCapsuleCellContainerCount(tDustStack) * 64L;
+ tList.add(GT_Utility.copyAmount(64, tDustStack));
+ tDustStack.stackSize -= 64;
+ }
+ if ((tDustStack.stackSize > 0) && (tList.size() < 6)
+ && (tCapsuleCount
+ + GT_ModHandler.getCapsuleCellContainerCountMultipliedWithStackSize(tDustStack)
+ <= 64L)) {
+ tCapsuleCount += GT_ModHandler
+ .getCapsuleCellContainerCountMultipliedWithStackSize(tDustStack);
+ tList.add(tDustStack);
+ }
+ }
+ }
+ }
+ tItemAmount = (tItemAmount * tDensityMultiplier % aMaterial.getDensity() > 0L ? 1 : 0)
+ + tItemAmount * tDensityMultiplier / aMaterial.getDensity();
+ if (tList.size() > 0) {
+ FluidStack tFluid = null;
+ int tList_sS = tList.size();
+ for (int i = 0; i < tList_sS; i++) {
+ if ((!ItemList.Cell_Air.isStackEqual(tList.get(i)))
+ && ((tFluid = GT_Utility.getFluidForFilledItem(tList.get(i), true)) != null)) {
+ tFluid.amount *= tList.get(i).stackSize;
+ tCapsuleCount -= GT_ModHandler
+ .getCapsuleCellContainerCountMultipliedWithStackSize(tList.get(i));
+ tList.remove(i);
+ break;
+ }
+ }
+ if ((aMaterial.mExtraData & 0x1) != 0) {
+ if (tList.size() > 0 || tFluid != null) {
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ if (tCapsuleCount > 0L) {
+ recipeBuilder.itemInputs(
+ GT_Utility.copyAmount(tItemAmount, aStack),
+ ItemList.Cell_Empty.get(tCapsuleCount));
+ } else {
+ recipeBuilder.itemInputs(GT_Utility.copyAmount(tItemAmount, aStack));
+ }
+ if (tList.size() > 0) {
+ ItemStack[] outputsArray = tList.toArray(new ItemStack[Math.min(tList.size(), 6)]);
+ recipeBuilder.itemOutputs(outputsArray);
+ }
+ if (tFluid != null) {
+ recipeBuilder.fluidOutputs(tFluid);
+ }
+ recipeBuilder
+ .duration(Math.max(1L, Math.abs(aMaterial.getProtons() * 2L * tItemAmount)))
+ .eut(Math.min(4, tList.size()) * 30)
+ .addTo(electrolyzerRecipes);
+ }
+ }
+ if ((aMaterial.mExtraData & 0x2) != 0) {
+ if (tList.size() > 0 || tFluid != null) {
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ if (tCapsuleCount > 0L) {
+ recipeBuilder.itemInputs(
+ GT_Utility.copyAmount(tItemAmount, aStack),
+ ItemList.Cell_Empty.get(tCapsuleCount));
+ } else {
+ recipeBuilder.itemInputs(GT_Utility.copyAmount(tItemAmount, aStack));
+ }
+ if (tList.size() > 0) {
+ ItemStack[] outputsArray = tList.toArray(new ItemStack[Math.min(tList.size(), 6)]);
+ recipeBuilder.itemOutputs(outputsArray);
+ }
+ if (tFluid != null) {
+ recipeBuilder.fluidOutputs(tFluid);
+ }
+ recipeBuilder.duration(Math.max(1L, Math.abs(aMaterial.getMass() * 4L * tItemAmount)))
+ .eut(Math.min(4, tList.size()) * 5)
+ .addTo(centrifugeRecipes);
+ }
+ }
+ }
+ }
+ if (aMaterial.contains(SubTag.CRYSTALLISABLE)
+ && GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+ .outputChances(7000)
+ .fluidInputs(Materials.Water.getFluid(200L))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+ .outputChances(9000)
+ .fluidInputs(GT_ModHandler.getDistilledWater(100L))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+ .outputChances(10000)
+ .fluidInputs(Materials.Void.getMolten(36L))
+ .duration(1 * MINUTES)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+ }
+ switch (aMaterial.mName) {
+ case "NULL", "Mercury", "Coal":
+ break;
+ case "Glass":
+ GT_ModHandler.addSmeltingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ new ItemStack(net.minecraft.init.Blocks.glass));
+ break;
+ case "NetherQuartz":
+ case "Quartz":
+ case "CertusQuartz":
+ GT_ModHandler.removeFurnaceSmelting(aStack);
+ break;
+ case "MeatRaw":
+ GT_ModHandler.addSmeltingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatCooked, 1L));
+ break;
+ case "Oilsands":
+ centrifugeRecipes.addRecipe(
+ true,
+ new ItemStack[] { GT_Utility.copyAmount(1, aStack) },
+ null,
+ null,
+ null,
+ new FluidStack[] { Materials.OilHeavy.getFluid(1000) },
+ 660,
+ 8,
+ 0);
+ break;
+ case "HydratedCoal":
+ GT_ModHandler.addSmeltingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L));
+ break;
+ case "Diamond": {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), ItemList.Block_Powderbarrel.get(64))
+ .itemOutputs(
+ ItemList.IC2_Industrial_Diamond.get(3L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 16L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(4, aStack),
+ GT_ModHandler.getIC2Item("dynamite", 16, null))
+ .itemOutputs(
+ ItemList.IC2_Industrial_Diamond.get(3L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 16L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), new ItemStack(Blocks.tnt, 32))
+ .itemOutputs(
+ ItemList.IC2_Industrial_Diamond.get(3L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 16L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), GT_ModHandler.getIC2Item("industrialTnt", 8))
+ .itemOutputs(
+ ItemList.IC2_Industrial_Diamond.get(3L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 16L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ }
+ break;
+ case "Opal":
+ case "Olivine":
+ case "Emerald":
+ case "Ruby":
+ case "Sapphire":
+ case "GreenSapphire":
+ case "Topaz":
+ case "BlueTopaz":
+ case "Tanzanite":
+ case "Amethyst": {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), ItemList.Block_Powderbarrel.get(48))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 12L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(4, aStack),
+ GT_ModHandler.getIC2Item("dynamite", 12, null))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 12L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), new ItemStack(Blocks.tnt, 24))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 12L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), GT_ModHandler.getIC2Item("industrialTnt", 6))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 12L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ }
+ break;
+ case "FoolsRuby":
+ case "GarnetRed":
+ case "GarnetYellow":
+ case "Jasper":
+ case "Amber":
+ case "Monazite":
+ case "Forcicium":
+ case "Forcillium":
+ case "Force": {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), ItemList.Block_Powderbarrel.get(32))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 8L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), GT_ModHandler.getIC2Item("dynamite", 8, null))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 8L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), new ItemStack(Blocks.tnt, 16))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 8L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), GT_ModHandler.getIC2Item("industrialTnt", 4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 3L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 8L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ }
+ }
+ }
+ case dustPure, dustImpure, dustRefined -> {
+ Materials tByProduct = GT_Utility.selectItemInList(
+ aPrefix == OrePrefixes.dustRefined ? 2 : aPrefix == OrePrefixes.dustPure ? 1 : 0,
+ aMaterial,
+ aMaterial.mOreByProducts);
+ if (aPrefix == OrePrefixes.dustPure) {
+ if (aMaterial.contains(SubTag.ELECTROMAGNETIC_SEPERATION_GOLD)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Gold, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Gold, 1L))
+ .outputChances(10000, 4000, 2000)
+ .duration(20 * SECONDS)
+ .eut(24)
+ .addTo(electroMagneticSeparatorRecipes);
+ }
+ if (aMaterial.contains(SubTag.ELECTROMAGNETIC_SEPERATION_IRON)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Iron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 1L))
+ .outputChances(10000, 4000, 2000)
+ .duration(20 * SECONDS)
+ .eut(24)
+ .addTo(electroMagneticSeparatorRecipes);
+ }
+ if (aMaterial.contains(SubTag.ELECTROMAGNETIC_SEPERATION_NEODYMIUM)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Neodymium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Neodymium, 1L))
+ .outputChances(10000, 4000, 2000)
+ .duration(20 * SECONDS)
+ .eut(24)
+ .addTo(electroMagneticSeparatorRecipes);
+ }
+ }
+ if (aMaterial.contains(SubTag.CRYSTALLISABLE)
+ && GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+ .outputChances(9000)
+ .fluidInputs(Materials.Water.getFluid(200L))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+ .outputChances(9500)
+ .fluidInputs(GT_ModHandler.getDistilledWater(100L))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+ .outputChances(10000)
+ .fluidInputs(Materials.Void.getMolten(36L))
+ .duration(1 * MINUTES)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+ }
+ ItemStack tImpureStack = GT_OreDictUnificator.get(
+ OrePrefixes.dustTiny,
+ tByProduct,
+ GT_OreDictUnificator.get(OrePrefixes.nugget, tByProduct, 1L),
+ 1L);
+ if (tImpureStack == null) {
+ tImpureStack = GT_OreDictUnificator.get(OrePrefixes.dustSmall, tByProduct, 1L);
+ if (tImpureStack == null) {
+ tImpureStack = GT_OreDictUnificator.get(
+ OrePrefixes.dust,
+ tByProduct,
+ GT_OreDictUnificator.get(OrePrefixes.gem, tByProduct, 1L),
+ 1L);
+ if (tImpureStack == null) {
+ tImpureStack = GT_OreDictUnificator.get(OrePrefixes.cell, tByProduct, 1L);
+ if (tImpureStack == null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+ .duration(Math.max(1L, aMaterial.getMass()))
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ } else {
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(tImpureStack, true);
+ if (tFluid == null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(9, aStack), ItemList.Cell_Empty.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 9L),
+ tImpureStack)
+ .duration(Math.max(1L, aMaterial.getMass() * 72L))
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ } else {
+ tFluid.amount /= 10;
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+ .fluidOutputs(tFluid)
+ .duration(Math.max(1L, aMaterial.getMass() * 8L))
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ }
+ }
+ } else {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(9, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 9L), tImpureStack)
+ .duration(Math.max(1L, aMaterial.getMass() * 72L))
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ }
+ } else {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 2L), tImpureStack)
+ .duration(Math.max(1L, aMaterial.getMass() * 16L))
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ }
+ } else {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+ GT_OreDictUnificator.get(
+ OrePrefixes.dust,
+ tByProduct,
+ GT_OreDictUnificator.get(OrePrefixes.nugget, tByProduct, 1L),
+ 1L))
+ .outputChances(10000, 1111)
+ .duration(Math.max(1L, aMaterial.getMass() * 8L))
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ }
+ }
+ case dustSmall -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), ItemList.Schematic_Dust.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+ .duration(1 * SECONDS)
+ .eut(4)
+ .addTo(packagerRecipes);
+ if (!aMaterial.mBlastFurnaceRequired) {
+ GT_RecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
+ if (aMaterial.mSmeltInto.mArcSmeltInto != aMaterial) {
+ GT_RecipeRegistrator.registerReverseArcSmelting(
+ GT_Utility.copyAmount(1, aStack),
+ aMaterial,
+ aPrefix.mMaterialAmount,
+ null,
+ null,
+ null);
+ }
+ }
+ }
+ case dustTiny -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(9, aStack), ItemList.Schematic_Dust.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+ .duration(1 * SECONDS)
+ .eut(4)
+ .addTo(packagerRecipes);
+ if (!aMaterial.mBlastFurnaceRequired) {
+ GT_RecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
+ if (aMaterial.mSmeltInto.mArcSmeltInto != aMaterial) {
+ GT_RecipeRegistrator.registerReverseArcSmelting(
+ GT_Utility.copyAmount(1, aStack),
+ aMaterial,
+ aPrefix.mMaterialAmount,
+ null,
+ null,
+ null);
+ }
+ }
+ if (!aMaterial.contains(SubTag.NO_SMELTING)) {
+ if (aMaterial.mBlastFurnaceRequired) {
+ GT_ModHandler.removeFurnaceSmelting(aStack);
+ }
+ }
+ }
+ default -> {}
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingDye.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingDye.java
new file mode 100644
index 0000000000..f3e82c0b0e
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingDye.java
@@ -0,0 +1,91 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+
+import java.util.Locale;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IOreRecipeRegistrator;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingDye implements IOreRecipeRegistrator {
+
+ public ProcessingDye() {
+ OrePrefixes.dye.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes prefix, Materials material, String oreDictName, String modName,
+ ItemStack stack) {
+ Dyes aDye = Dyes.get(oreDictName);
+ if ((aDye.mIndex >= 0) && (aDye.mIndex < 16) && (GT_Utility.getContainerItem(stack, true) == null)) {
+ registerAlloySmelter(stack, aDye);
+ registerMixer(stack, aDye);
+ registerChemicalReactor(stack, aDye);
+ }
+ }
+
+ public void registerMixer(ItemStack stack, Dyes dye) {
+ String fluidName = "dye.watermixed." + dye.name()
+ .toLowerCase(Locale.ENGLISH);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, stack), GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Water.getFluid(216L))
+ .fluidOutputs(FluidRegistry.getFluidStack(fluidName, 192))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, stack), GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(GT_ModHandler.getDistilledWater(288L))
+ .fluidOutputs(FluidRegistry.getFluidStack(fluidName, 216))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(mixerRecipes);
+ }
+
+ public void registerAlloySmelter(ItemStack stack, Dyes dye) {
+ GT_ModHandler.addAlloySmelterRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 8L),
+ GT_Utility.copyAmount(1, stack),
+ new ItemStack(Blocks.stained_glass, 8, 15 - dye.mIndex),
+ 200,
+ 8,
+ false);
+
+ GT_ModHandler.addAlloySmelterRecipe(
+ new ItemStack(Blocks.glass, 8, 32767),
+ GT_Utility.copyAmount(1, stack),
+ new ItemStack(Blocks.stained_glass, 8, 15 - dye.mIndex),
+ 200,
+ 8,
+ false);
+ }
+
+ public void registerChemicalReactor(ItemStack stack, Dyes dye) {
+ String fluidName = "dye.chemical." + dye.name()
+ .toLowerCase(Locale.ENGLISH);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, stack), GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 2))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(432))
+ .fluidOutputs(FluidRegistry.getFluidStack(fluidName, 288))
+ .duration(30 * SECONDS)
+ .eut(48)
+ .addTo(UniversalChemical);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingFineWire.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingFineWire.java
new file mode 100644
index 0000000000..cfd33f1ace
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingFineWire.java
@@ -0,0 +1,33 @@
+package gregtech.loaders.oreprocessing;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_RecipeRegistrator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+
+public class ProcessingFineWire implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingFineWire() {
+ OrePrefixes.wireFine.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (!aMaterial.contains(gregtech.api.enums.SubTag.NO_SMASHING)) {
+ GT_RecipeRegistrator.registerWiremillRecipes(aMaterial, 100, 4);
+ }
+ if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial)
+ && !aMaterial.contains(SubTag.NO_WORKING)) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ GT_Proxy.tBits,
+ new Object[] { "Xx", 'X', OrePrefixes.foil.get(aMaterial) });
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingFoil.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingFoil.java
new file mode 100644
index 0000000000..9b46710b71
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingFoil.java
@@ -0,0 +1,45 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.benderRecipes;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.interfaces.IOreRecipeRegistrator;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingFoil implements IOreRecipeRegistrator {
+
+ public ProcessingFoil() {
+ OrePrefixes.foil.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes prefix, Materials material, String oreDictName, String modName,
+ ItemStack stack) {
+ registerBenderRecipe(material);
+ registerCover(stack, material);
+ }
+
+ private void registerBenderRecipe(Materials material) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(1, GT_OreDictUnificator.get(OrePrefixes.plate, material, 4L)),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.foil, material, 4L))
+ .duration((int) Math.max(material.getMass(), 1L))
+ .eut(calculateRecipeEU(material, 24))
+ .addTo(benderRecipes);
+ }
+
+ private void registerCover(ItemStack stack, Materials material) {
+ GregTech_API
+ .registerCover(stack, TextureFactory.of(material.mIconSet.mTextures[70], material.mRGBa, false), null);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingFood.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingFood.java
new file mode 100644
index 0000000000..e7fc25038f
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingFood.java
@@ -0,0 +1,107 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.benderRecipes;
+import static gregtech.api.recipe.RecipeMaps.formingPressRecipes;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.recipe.RecipeMaps.slicerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingFood implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingFood() {
+ OrePrefixes.food.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ switch (aOreDictName) {
+ case "foodCheese" -> {
+ registerSlicerRecipes(aStack);
+ GT_OreDictUnificator.addItemData(aStack, new gregtech.api.objects.ItemData(Materials.Cheese, 3628800L));
+ }
+ case "foodDough" -> {
+ GT_ModHandler.removeFurnaceSmelting(aStack);
+ registerBenderRecipes(aStack);
+ registerMixerRecipes(aStack);
+ registerFormingPressRecipes(aStack);
+ }
+ }
+ }
+
+ private void registerSlicerRecipes(ItemStack stack) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(stack, ItemList.Shape_Slicer_Flat.get(0L))
+ .itemOutputs(ItemList.Food_Sliced_Cheese.get(4L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(4)
+ .addTo(slicerRecipes);
+ }
+
+ private void registerBenderRecipes(ItemStack stack) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, stack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Food_Flat_Dough.get(1L))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(benderRecipes);
+ }
+
+ private void registerMixerRecipes(ItemStack stack) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(stack, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+ .itemOutputs(ItemList.Food_Dough_Sugar.get(2L))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(stack, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cocoa, 1L))
+ .itemOutputs(ItemList.Food_Dough_Chocolate.get(2L))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(stack, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chocolate, 1L))
+ .itemOutputs(ItemList.Food_Dough_Chocolate.get(2L))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8)
+ .addTo(mixerRecipes);
+ }
+
+ private void registerFormingPressRecipes(ItemStack stack) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, stack), ItemList.Shape_Mold_Bun.get(0L))
+ .itemOutputs(ItemList.Food_Raw_Bun.get(1L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, stack), ItemList.Shape_Mold_Bread.get(0L))
+ .itemOutputs(ItemList.Food_Raw_Bread.get(1L))
+ .duration(12 * SECONDS + 16 * TICKS)
+ .eut(4)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, stack), ItemList.Shape_Mold_Baguette.get(0L))
+ .itemOutputs(ItemList.Food_Raw_Baguette.get(1L))
+ .duration(19 * SECONDS + 4 * TICKS)
+ .eut(4)
+ .addTo(formingPressRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingGear.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingGear.java
new file mode 100644
index 0000000000..aa973cddfe
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingGear.java
@@ -0,0 +1,109 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+
+public class ProcessingGear implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingGear() {
+ OrePrefixes.gearGt.add(this);
+ OrePrefixes.gearGtSmall.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ switch (aPrefix) {
+ case gearGt -> {
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+ if (aMaterial.mStandardMoltenFluid != null) {
+ if (!(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Gear.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(aPrefix, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(576L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(fluidSolidifierRecipes);
+ }
+ }
+ if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)
+ && !aMaterial.contains(SubTag.NO_WORKING)) {
+ switch (aMaterial.mName) {
+ case "Wood" -> GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "SPS", "PsP", "SPS", 'P', OrePrefixes.plank.get(aMaterial), 'S',
+ OrePrefixes.stick.get(aMaterial) });
+ case "Stone" -> GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "SPS", "PfP", "SPS", 'P', OrePrefixes.stoneSmooth, 'S',
+ new ItemStack(Blocks.stone_button, 1, 32767) });
+ default -> {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "SPS", "PwP", "SPS", 'P', OrePrefixes.plate.get(aMaterial), 'S',
+ OrePrefixes.stick.get(aMaterial) });
+ }
+ }
+ }
+ }
+ }
+ case gearGtSmall -> {
+ if (aMaterial.mStandardMoltenFluid != null) {
+ if (!(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Gear_Small.get(0L))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .fluidInputs(aMaterial.getMolten(144L))
+ .duration(16 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(fluidSolidifierRecipes);
+ }
+ }
+ if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)
+ && !aMaterial.contains(SubTag.NO_WORKING)) {
+ switch (aMaterial.mName) {
+ case "Wood" -> GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "P ", " s", 'P', OrePrefixes.plank.get(aMaterial) });
+ case "Stone" -> GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "P ", " f", 'P', OrePrefixes.stoneSmooth });
+ default -> {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { " S ", "hPx", " S ", 'S', OrePrefixes.stick.get(aMaterial), 'P',
+ OrePrefixes.plate.get(aMaterial) });
+ }
+ }
+ }
+ }
+ }
+ default -> {}
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingGem.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingGem.java
new file mode 100644
index 0000000000..35bd3b8cfd
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingGem.java
@@ -0,0 +1,612 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.benderRecipes;
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.recipe.RecipeMaps.implosionRecipes;
+import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
+import static gregtech.api.recipe.RecipeMaps.latheRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+
+public class ProcessingGem implements gregtech.api.interfaces.IOreRecipeRegistrator { // TODO COMPARE WITH GEM???
+ // generators
+
+ public ProcessingGem() {
+ OrePrefixes.gem.add(this);
+ OrePrefixes.gemChipped.add(this);
+ OrePrefixes.gemExquisite.add(this);
+ OrePrefixes.gemFlawed.add(this);
+ OrePrefixes.gemFlawless.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ long aMaterialMass = aMaterial.getMass();
+ boolean aNoSmashing = aMaterial.contains(SubTag.NO_SMASHING);
+ boolean aNoWorking = aMaterial.contains(SubTag.NO_WORKING);
+ boolean aNoSmelting = aMaterial.contains(SubTag.NO_SMELTING);
+ boolean aSpecialRecipeReq = aMaterial.contains(SubTag.MORTAR_GRINDABLE);
+ boolean aFuelPower = aMaterial.mFuelPower > 0;
+
+ switch (aPrefix) {
+ case gem -> {
+ // fuel recipes
+ if (aFuelPower) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .metadata(FUEL_VALUE, aMaterial.mFuelPower * 2)
+ .metadata(FUEL_TYPE, aMaterial.mFuelType)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+
+ if (!OrePrefixes.block.isIgnored(aMaterial)
+ && GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L) != null) {
+ // Compressor recipes
+ // need to avoid iridium exploit
+ if (aMaterial != Materials.Iridium) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(9, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, aMaterial, 1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+ }
+ }
+
+ // Smelting recipe
+ if (!aNoSmelting) {
+ GT_ModHandler.addSmeltingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L));
+ }
+
+ if (aNoSmashing) {
+ // Forge hammer recipes
+ {
+ if (GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack)
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 2L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+ }
+ }
+ } else {
+ // Forge hammer recipes
+ {
+ // need to avoid iridium exploit
+ if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null
+ && aMaterial != Materials.Iridium) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass, 1L))
+ .eut(calculateRecipeEU(aMaterial, 16))
+ .addTo(hammerRecipes);
+ }
+ }
+
+ // Bender recipes
+ if (aMaterial != Materials.Iridium) {
+ if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+ // Plate
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .duration((int) Math.max(aMaterialMass * 2L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 24))
+ .addTo(benderRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L) != null) {
+ // Double plates
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 2L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L) != null) {
+ // Triple plate
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 3L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L) != null) {
+ // Quadruple plate
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 4L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L) != null) {
+ // Quintuple plate
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(5, aStack), GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 5L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L) != null) {
+ // dense plate
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(9, aStack), GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 9L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+ }
+ }
+ if (aNoWorking) {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ // Lathe recipes
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L) != null
+ && GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 2L))
+ .duration(((int) Math.max(aMaterialMass, 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 16))
+ .addTo(latheRecipes);
+ }
+ }
+ } else {
+ if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)) {
+ // Implosion compressor recipes
+ {
+ if (GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Block_Powderbarrel.get(16))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(3, aStack),
+ GT_ModHandler.getIC2Item("dynamite", 4, null))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), new ItemStack(Blocks.tnt, 8))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(3, aStack),
+ GT_ModHandler.getIC2Item("industrialTnt", 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ }
+ }
+
+ // Crafting recipes
+ {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 2L),
+ GT_Proxy.tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.gemFlawless.get(aMaterial) });
+
+ if (aMaterial.contains(SubTag.SMELTING_TO_GEM)) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ GT_Proxy.tBits,
+ new Object[] { "XXX", "XXX", "XXX", 'X', OrePrefixes.nugget.get(aMaterial) });
+ }
+
+ if (aSpecialRecipeReq) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "X", "m", 'X', OrePrefixes.gem.get(aMaterial) });
+ }
+ }
+ }
+ }
+
+ for (ItemStack is : OreDictionary.getOres("craftingLens" + aMaterial.mColor.mName.replace(" ", ""))) { // Engraver
+ // Laser engraver recipes
+ {
+
+ if (GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1L) != null) {
+ is.stackSize = 0;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), is)
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 1L))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(laserEngraverRecipes);
+ }
+
+ }
+ }
+ }
+ case gemChipped -> {
+ // Fuel recipes
+ if (aFuelPower) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .metadata(FUEL_VALUE, aMaterial.mFuelPower / 2)
+ .metadata(FUEL_TYPE, aMaterial.mFuelType)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+
+ if (!aNoWorking) {
+ // Lathe recipes
+ if (GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null
+ && GT_OreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, 1L))
+ .duration(((int) Math.max(aMaterialMass, 1L)) * TICKS)
+ .eut(8)
+ .addTo(latheRecipes);
+ }
+
+ if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)) {
+ // Implosion compressor recipes
+ {
+ if (GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Block_Powderbarrel.get(16))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(3, aStack),
+ GT_ModHandler.getIC2Item("dynamite", 4, null))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), new ItemStack(Blocks.tnt, 8))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(3, aStack),
+ GT_ModHandler.getIC2Item("industrialTnt", 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ }
+ }
+
+ // Crafting recipes
+ {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gemChipped, aMaterial, 2L),
+ GT_Proxy.tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.gemFlawed.get(aMaterial) });
+ if (aSpecialRecipeReq) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "X", "m", 'X', OrePrefixes.gemChipped.get(aMaterial) });
+ }
+ }
+ }
+ }
+ for (ItemStack is : OreDictionary.getOres("craftingLens" + aMaterial.mColor.mName.replace(" ", ""))) { // Engraver
+ is.stackSize = 0;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), is)
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 1L))
+ .duration(30 * SECONDS)
+ .eut(30)
+ .addTo(laserEngraverRecipes);
+
+ }
+ }
+ case gemExquisite -> {
+ // Fuel recipes
+ if (aFuelPower) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .metadata(FUEL_VALUE, aMaterial.mFuelPower * 8)
+ .metadata(FUEL_TYPE, aMaterial.mFuelType)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+
+ if (!aNoWorking) {
+ if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)) {
+ // Crafting recipes
+ {
+ if (aSpecialRecipeReq) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 4L),
+ GT_Proxy.tBits,
+ new Object[] { "X", "m", 'X', OrePrefixes.gemExquisite.get(aMaterial) });
+ }
+ }
+ }
+ }
+
+ // Forge hammer recipes
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack)
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 2L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+ }
+ }
+ case gemFlawed -> {
+ // fuel recipes
+ if (aFuelPower) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .metadata(FUEL_VALUE, aMaterial.mFuelPower)
+ .metadata(FUEL_TYPE, aMaterial.mFuelType)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+
+ if (!aNoWorking) {
+ // Lathe recipes
+ if (GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null
+ && GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L))
+ .duration(((int) Math.max(aMaterialMass, 1L)) * TICKS)
+ .eut(12)
+ .addTo(latheRecipes);
+ }
+
+ if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)) {
+ // Implosion compressor recipes
+ {
+ if (GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Block_Powderbarrel.get(16))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(3, aStack),
+ GT_ModHandler.getIC2Item("dynamite", 4, null))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), new ItemStack(Blocks.tnt, 8))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(3, aStack),
+ GT_ModHandler.getIC2Item("industrialTnt", 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ }
+ }
+
+ // Crafting recipes
+ {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawed, aMaterial, 2L),
+ GT_Proxy.tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.gem.get(aMaterial) });
+ if (aSpecialRecipeReq) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 2L),
+ GT_Proxy.tBits,
+ new Object[] { "X", "m", 'X', OrePrefixes.gemFlawed.get(aMaterial) });
+ }
+ }
+ }
+ }
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack)
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gemChipped, aMaterial, 2L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ for (ItemStack is : OreDictionary.getOres("craftingLens" + aMaterial.mColor.mName.replace(" ", ""))) { // Engraver
+
+ is.stackSize = 0;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), is)
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(laserEngraverRecipes);
+
+ }
+ }
+ case gemFlawless -> {
+
+ // Fuel recipes
+ if (aFuelPower) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .metadata(FUEL_VALUE, aMaterial.mFuelPower * 4)
+ .metadata(FUEL_TYPE, aMaterial.mFuelType)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+
+ if (!aNoWorking) {
+ // Lathe recipes
+ if (GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L) != null
+ && GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L),
+ GT_OreDictUnificator.getDust(
+ aMaterial,
+ aPrefix.mMaterialAmount - OrePrefixes.stickLong.mMaterialAmount))
+ .duration(((int) Math.max(aMaterialMass * 5L, 1L)) * TICKS)
+ .eut(16)
+ .addTo(latheRecipes);
+ }
+
+ if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)) {
+ // Implosion compressor recipes
+ {
+ if (GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Block_Powderbarrel.get(16))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(3, aStack),
+ GT_ModHandler.getIC2Item("dynamite", 4, null))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), new ItemStack(Blocks.tnt, 8))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(3, aStack),
+ GT_ModHandler.getIC2Item("industrialTnt", 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 2))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ }
+ }
+
+ // Crafting recipes
+ {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gemFlawless, aMaterial, 2L),
+ GT_Proxy.tBits,
+ new Object[] { "h", "X", 'X', OrePrefixes.gemExquisite.get(aMaterial) });
+ if (aSpecialRecipeReq) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 2L),
+ GT_Proxy.tBits,
+ new Object[] { "X", "m", 'X', OrePrefixes.gemFlawless.get(aMaterial) });
+ }
+ }
+ }
+ }
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack)
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 2L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ for (ItemStack is : OreDictionary.getOres("craftingLens" + aMaterial.mColor.mName.replace(" ", ""))) { // Engraver
+
+ is.stackSize = 0;
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), is)
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1L))
+ .duration(2 * MINUTES)
+ .eut(2000)
+ .addTo(laserEngraverRecipes);
+ }
+ }
+ default -> {}
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingIngot.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingIngot.java
new file mode 100644
index 0000000000..0be31a7e1d
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingIngot.java
@@ -0,0 +1,296 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.benderRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.recipe.RecipeMaps.vacuumFreezerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_RecipeRegistrator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+
+public class ProcessingIngot implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingIngot() {
+ OrePrefixes.ingot.add(this);
+ OrePrefixes.ingotDouble.add(this);
+ OrePrefixes.ingotTriple.add(this);
+ OrePrefixes.ingotQuadruple.add(this);
+ OrePrefixes.ingotQuintuple.add(this);
+ OrePrefixes.ingotHot.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ boolean aNoSmashing = aMaterial.contains(SubTag.NO_SMASHING);
+ boolean aStretchy = aMaterial.contains(SubTag.STRETCHY);
+ boolean aNoSmelting = aMaterial.contains(SubTag.NO_SMELTING);
+ long aMaterialMass = aMaterial.getMass();
+ boolean aSpecialRecipeReq = aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)
+ && !aMaterial.contains(SubTag.NO_SMASHING);
+
+ switch (aPrefix) {
+ case ingot -> {
+ // Fuel recipe
+ if (aMaterial.mFuelPower > 0) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .metadata(FUEL_VALUE, aMaterial.mFuelPower)
+ .metadata(FUEL_TYPE, aMaterial.mFuelType)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+ if (aMaterial.mStandardMoltenFluid != null
+ && !(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
+ // Fluid solidifier recipes
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Ingot.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(144L))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(fluidSolidifierRecipes);
+ }
+ // Reverse recipes
+ {
+ GT_RecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
+ GT_RecipeRegistrator
+ .registerReverseMacerating(aStack, aMaterial, aPrefix.mMaterialAmount, null, null, null, false);
+ if (aMaterial.mSmeltInto.mArcSmeltInto != aMaterial) {
+ GT_RecipeRegistrator.registerReverseArcSmelting(
+ GT_Utility.copyAmount(1, aStack),
+ aMaterial,
+ aPrefix.mMaterialAmount,
+ null,
+ null,
+ null);
+ }
+ }
+ ItemStack tStack = GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L);
+ if ((tStack != null) && ((aMaterial.mBlastFurnaceRequired) || aNoSmelting)) {
+ GT_ModHandler.removeFurnaceSmelting(tStack);
+ }
+ if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)
+ && !aMaterial.contains(SubTag.NO_WORKING)
+ && !aMaterial.contains(SubTag.SMELTING_TO_GEM)
+ && aMaterial.contains(SubTag.MORTAR_GRINDABLE)) {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { ToolDictNames.craftingToolMortar, OrePrefixes.ingot.get(aMaterial) });
+ }
+ if (!aNoSmashing) {
+ // Forge hammer recipes
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV
+ && GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 2L))
+ .duration(Math.max(aMaterialMass, 1L))
+ .eut(calculateRecipeEU(aMaterial, 16))
+ .addTo(hammerRecipes);
+ }
+ }
+ if (!aNoSmashing || aStretchy) {
+
+ // Bender recipes
+ {
+ if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass, 1L))
+ .eut(calculateRecipeEU(aMaterial, 24))
+ .addTo(benderRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 2L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 3L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 4L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(5, aStack), GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 5L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(9, aStack), GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 9L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.foil, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.foil, aMaterial, 4L))
+ .duration(Math.max(aMaterialMass * 2L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 24))
+ .addTo(benderRecipes);
+ }
+ }
+ }
+ }
+ case ingotDouble -> {
+ if (!aNoSmashing || aStretchy) {
+ // bender recipes
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 2L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ // Enable crafting with hammer if tier is < IV.
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV && aSpecialRecipeReq) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.ingotDouble, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "I", "I", "h", 'I', OrePrefixes.ingot.get(aMaterial) });
+ }
+ }
+ }
+ case ingotTriple -> {
+ if (!aNoSmashing || aStretchy) {
+ // Bender recipes
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateTriple, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 3L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV && aSpecialRecipeReq) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.ingotTriple, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "I", "B", "h", 'I', OrePrefixes.ingotDouble.get(aMaterial), 'B',
+ OrePrefixes.ingot.get(aMaterial) });
+ }
+ }
+ }
+ case ingotQuadruple -> {
+ if (!aNoSmashing || aStretchy) {
+ // Bender recipes
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ // If tier < IV add manual crafting.
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV && aSpecialRecipeReq) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.ingotQuadruple, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "I", "B", "h", 'I', OrePrefixes.ingotTriple.get(aMaterial), 'B',
+ OrePrefixes.ingot.get(aMaterial) });
+ }
+ }
+ }
+ case ingotQuintuple -> {
+ if (!aNoSmashing || aStretchy) {
+ // Bender recipes
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuintuple, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ // Crafting recipes
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV && aSpecialRecipeReq) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.ingotQuintuple, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "I", "B", "h", 'I', OrePrefixes.ingotQuadruple.get(aMaterial), 'B',
+ OrePrefixes.ingot.get(aMaterial) });
+ }
+ }
+ }
+ case ingotHot -> {
+ if (aMaterial.mAutoGenerateVacuumFreezerRecipes
+ && GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
+ // Vacuum freezer recipes
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L))
+ .duration(((int) Math.max(aMaterialMass * 3L, 1L)) * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+ }
+ }
+ default -> {}
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingItem.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingItem.java
new file mode 100644
index 0000000000..6a132e2dba
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingItem.java
@@ -0,0 +1,45 @@
+package gregtech.loaders.oreprocessing;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class ProcessingItem implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingItem() {
+ OrePrefixes.item.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (GT_OreDictUnificator.getItemData(aStack) == null && !aOreDictName.equals("itemCertusQuartz")
+ && !aOreDictName.equals("itemNetherQuartz")) {
+ switch (aOreDictName) {
+ case "itemSilicon":
+ GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Silicon, 3628800L));
+ case "itemWheat":
+ GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Wheat, 3628800L));
+ case "itemManganese":
+ GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Manganese, 3628800L));
+ case "itemSalt":
+ GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Salt, 3628800L));
+ case "itemMagnesium":
+ GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Magnesium, 3628800L));
+ case "itemPhosphorite":
+ GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.TricalciumPhosphate, 3628800L));
+ case "itemSulfur":
+ GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Sulfur, 3628800L));
+ case "itemAluminum":
+ GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Aluminium, 3628800L));
+ case "itemSaltpeter":
+ GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Saltpeter, 3628800L));
+ case "itemUranium":
+ GT_OreDictUnificator.addItemData(aStack, new ItemData(Materials.Uranium, 3628800L));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingLens.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingLens.java
new file mode 100644
index 0000000000..c3f73f7966
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingLens.java
@@ -0,0 +1,96 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.recipe.RecipeMaps.latheRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.TierEU;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeBuilder;
+
+@SuppressWarnings("RedundantLabeledSwitchRuleCodeBlock")
+public class ProcessingLens implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingLens() {
+ OrePrefixes.lens.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ switch (aMaterial.mName) {
+ case "Diamond", "Glass" -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L))
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(latheRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 3L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+ .duration(2 * MINUTES)
+ .eut(16)
+ .addTo(latheRecipes);
+ }
+ case "ChromaticGlass" -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 16L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L))
+ .duration(10 * MINUTES)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(compressorRecipes);
+ }
+ default -> {
+ if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder.itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L));
+ if (GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L) == null) {
+ recipeBuilder.itemOutputs(GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L));
+ } else {
+ recipeBuilder.itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial, 1L));
+ }
+ recipeBuilder.duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(latheRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1L) != null) {
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder.itemInputs(GT_OreDictUnificator.get(OrePrefixes.gemExquisite, aMaterial, 1L));
+ if (GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L) == null) {
+ recipeBuilder.itemOutputs(GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L));
+ } else {
+ recipeBuilder.itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.lens, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 2L));
+ }
+ recipeBuilder.duration(2 * MINUTES)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(latheRecipes);
+ }
+ final ITexture lensCoverTexture = TextureFactory
+ .of(Textures.BlockIcons.OVERLAY_LENS, aMaterial.mRGBa, false);
+ GregTech_API.registerCover(
+ aStack,
+ TextureFactory.of(Textures.BlockIcons.MACHINE_CASINGS[2][0], lensCoverTexture),
+ new gregtech.common.covers.GT_Cover_Lens(aMaterial.mColor.mIndex, lensCoverTexture));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingLog.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingLog.java
new file mode 100644
index 0000000000..737ef4682a
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingLog.java
@@ -0,0 +1,384 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
+import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
+import static gregtech.api.recipe.RecipeMaps.extractorRecipes;
+import static gregtech.api.recipe.RecipeMaps.latheRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.recipe.RecipeMaps.pyrolyseRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingLog implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingLog() {
+ OrePrefixes.log.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (aOreDictName.equals("logRubber")) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(
+ ItemList.IC2_Resin.get(1L),
+ GT_ModHandler.getIC2Item("plantBall", 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
+ .outputChances(5000, 3750, 2500, 2500)
+ .fluidOutputs(Materials.Methane.getGas(60L))
+ .duration(10 * SECONDS)
+ .eut(20)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(extractorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 6L), ItemList.IC2_Resin.get(1L))
+ .outputChances(10000, 3300)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ } else {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(60L))
+ .duration(10 * SECONDS)
+ .eut(20)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 6L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
+ .outputChances(10000, 8000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ }
+
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Wood, 2L),
+ gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "sLf", 'L', GT_Utility.copyAmount(1, aStack) });
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Wood, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+ .duration(8 * SECONDS)
+ .eut(7)
+ .addTo(latheRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.FR_Stick.get(1L))
+ .fluidInputs(Materials.SeedOil.getFluid(50L))
+ .duration(16 * TICKS)
+ .eut(7)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(8, aStack), GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.FR_Casing_Impregnated.get(1L))
+ .fluidInputs(Materials.SeedOil.getFluid(250L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_ModHandler.getModItem(Railcraft.ID, "cube", 1L, 8))
+ .fluidInputs(Materials.Creosote.getFluid(750L))
+ .duration(16 * TICKS)
+ .eut(TierEU.ULV)
+ .addTo(chemicalBathRecipes);
+
+ short aMeta = (short) aStack.getItemDamage();
+
+ if (aMeta == Short.MAX_VALUE) {
+ if ((GT_Utility.areStacksEqual(
+ GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(1, aStack), false, null),
+ new ItemStack(Items.coal, 1, 1)))) {
+ addPyrolyeOvenRecipes(aStack);
+ GT_ModHandler.removeFurnaceSmelting(GT_Utility.copyAmount(1, aStack));
+ }
+ for (int i = 0; i < 32767; i++) {
+ if ((GT_Utility.areStacksEqual(
+ GT_ModHandler.getSmeltingOutput(new ItemStack(aStack.getItem(), 1, i), false, null),
+ new ItemStack(Items.coal, 1, 1)))) {
+ addPyrolyeOvenRecipes(aStack);
+ GT_ModHandler.removeFurnaceSmelting(new ItemStack(aStack.getItem(), 1, i));
+ }
+ ItemStack tStack = GT_ModHandler.getRecipeOutput(new ItemStack(aStack.getItem(), 1, i));
+ if (tStack == null) {
+ if (i >= 16) {
+ break;
+ }
+ } else {
+ ItemStack tPlanks = GT_Utility.copyOrNull(tStack);
+ if (tPlanks != null) {
+ tPlanks.stackSize = (tPlanks.stackSize * 3 / 2);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(aStack.getItem(), 1, i))
+ .itemOutputs(
+ GT_Utility.copyOrNull(tPlanks),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
+ .fluidInputs(Materials.Lubricant.getFluid(1L))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(cutterRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(aStack.getItem(), 1, i))
+ .itemOutputs(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+ tStack),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+ .fluidInputs(Materials.Water.getFluid(Math.min(1000, 200 * 8 / 320)))
+ .duration(20 * SECONDS)
+ .eut(8)
+ .addTo(cutterRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(aStack.getItem(), 1, i))
+ .itemOutputs(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+ tStack),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+ .fluidInputs(GT_ModHandler.getDistilledWater(3))
+ .duration(20 * SECONDS)
+ .eut(8)
+ .addTo(cutterRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(aStack.getItem(), 1, i))
+ .itemOutputs(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+ tStack),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+ .fluidInputs(Materials.Lubricant.getFluid(1))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(cutterRecipes);
+ GT_ModHandler.addSawmillRecipe(
+ new ItemStack(aStack.getItem(), 1, i),
+ tPlanks,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L));
+ GT_ModHandler.removeRecipeDelayed(new ItemStack(aStack.getItem(), 1, i));
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+ tStack),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "s", "L", 'L', new ItemStack(aStack.getItem(), 1, i) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility
+ .copyAmount(tStack.stackSize / (GT_Mod.gregtechproxy.mNerfedWoodPlank ? 2 : 1), tStack),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { new ItemStack(aStack.getItem(), 1, i) });
+ }
+ }
+ }
+ } else {
+ if ((GT_Utility.areStacksEqual(
+ GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(1, aStack), false, null),
+ new ItemStack(Items.coal, 1, 1)))) {
+ addPyrolyeOvenRecipes(aStack);
+ GT_ModHandler.removeFurnaceSmelting(GT_Utility.copyAmount(1, aStack));
+ }
+ ItemStack tStack = GT_ModHandler.getRecipeOutput(GT_Utility.copyAmount(1, aStack));
+ if (tStack != null) {
+ ItemStack tPlanks = GT_Utility.copyOrNull(tStack);
+ if (tPlanks != null) {
+ tPlanks.stackSize = (tPlanks.stackSize * 3 / 2);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_Utility.copyOrNull(tPlanks),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
+ .fluidInputs(Materials.Lubricant.getFluid(1L))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(cutterRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+ tStack),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+ .fluidInputs(Materials.Water.getFluid(Math.min(1000, 200 * 8 / 320)))
+ .duration(20 * SECONDS)
+ .eut(8)
+ .addTo(cutterRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+ tStack),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+ .fluidInputs(GT_ModHandler.getDistilledWater(3))
+ .duration(20 * SECONDS)
+ .eut(8)
+ .addTo(cutterRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+ tStack),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 2L))
+ .fluidInputs(Materials.Lubricant.getFluid(1))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(cutterRecipes);
+ GT_ModHandler.addSawmillRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ tPlanks,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L));
+ GT_ModHandler.removeRecipeDelayed(GT_Utility.copyAmount(1, aStack));
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+ tStack),
+ new Object[] { "s", "L", 'L', GT_Utility.copyAmount(1, aStack) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility
+ .copyAmount(tStack.stackSize / (GT_Mod.gregtechproxy.mNerfedWoodPlank ? 2 : 1), tStack),
+ new Object[] { GT_Utility.copyAmount(1, aStack) });
+ }
+ }
+ }
+
+ if ((GT_Utility.areStacksEqual(
+ GT_ModHandler.getSmeltingOutput(GT_Utility.copyAmount(1, aStack), false, null),
+ new ItemStack(Items.coal, 1, 1)))) {
+ addPyrolyeOvenRecipes(aStack);
+ GT_ModHandler.removeFurnaceSmelting(GT_Utility.copyAmount(1, aStack));
+ }
+ }
+
+ public static void addPyrolyeOvenRecipes(ItemStack logStack) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Charcoal.getGems(20))
+ .fluidOutputs(Materials.Creosote.getFluid(4000))
+ .duration(32 * SECONDS)
+ .eut(64)
+ .noOptimize()
+ .addTo(pyrolyseRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Charcoal.getGems(20))
+ .fluidInputs(Materials.Nitrogen.getGas(1000))
+ .fluidOutputs(Materials.Creosote.getFluid(4000))
+ .duration(16 * SECONDS)
+ .eut(96)
+ .noOptimize()
+ .addTo(pyrolyseRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(Materials.Charcoal.getGems(20))
+ .fluidOutputs(Materials.CharcoalByproducts.getGas(4000))
+ .duration(32 * SECONDS)
+ .eut(64)
+ .noOptimize()
+ .addTo(pyrolyseRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(Materials.Charcoal.getGems(20))
+ .fluidInputs(Materials.Nitrogen.getGas(1000))
+ .fluidOutputs(Materials.CharcoalByproducts.getGas(4000))
+ .duration(16 * SECONDS)
+ .eut(96)
+ .noOptimize()
+ .addTo(pyrolyseRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(Materials.Charcoal.getGems(20))
+ .fluidOutputs(Materials.WoodGas.getGas(1500))
+ .duration(32 * SECONDS)
+ .eut(64)
+ .noOptimize()
+ .addTo(pyrolyseRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(6))
+ .itemOutputs(Materials.Charcoal.getGems(20))
+ .fluidInputs(Materials.Nitrogen.getGas(1000))
+ .fluidOutputs(Materials.WoodGas.getGas(1500))
+ .duration(16 * SECONDS)
+ .eut(96)
+ .noOptimize()
+ .addTo(pyrolyseRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(7))
+ .itemOutputs(Materials.Charcoal.getGems(20))
+ .fluidOutputs(Materials.WoodVinegar.getFluid(3000))
+ .duration(32 * SECONDS)
+ .eut(64)
+ .noOptimize()
+ .addTo(pyrolyseRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(Materials.Charcoal.getGems(20))
+ .fluidInputs(Materials.Nitrogen.getGas(1000))
+ .fluidOutputs(Materials.WoodVinegar.getFluid(3000))
+ .duration(16 * SECONDS)
+ .eut(96)
+ .noOptimize()
+ .addTo(pyrolyseRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(Materials.Charcoal.getGems(20))
+ .fluidOutputs(Materials.WoodTar.getFluid(1500))
+ .duration(32 * SECONDS)
+ .eut(64)
+ .noOptimize()
+ .addTo(pyrolyseRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(Materials.Charcoal.getGems(20))
+ .fluidInputs(Materials.Nitrogen.getGas(1000))
+ .fluidOutputs(Materials.WoodTar.getFluid(1500))
+ .duration(16 * SECONDS)
+ .eut(96)
+ .noOptimize()
+ .addTo(pyrolyseRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(16, logStack), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Ash.getDust(4))
+ .fluidOutputs(Materials.OilHeavy.getFluid(200))
+ .duration(16 * SECONDS)
+ .eut(192)
+ .noOptimize()
+ .addTo(pyrolyseRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingNugget.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingNugget.java
new file mode 100644
index 0000000000..8d7ca9e518
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingNugget.java
@@ -0,0 +1,89 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.recipe.RecipeCategories;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeRegistrator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingNugget implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingNugget() {
+ OrePrefixes.nugget.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+
+ if (aMaterial.contains(SubTag.SMELTING_TO_GEM)
+ && GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(9, aStack), ItemList.Shape_Mold_Ball.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial.mSmeltInto, 1L))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 2))
+ .addTo(alloySmelterRecipes);
+ }
+
+ if ((!aMaterial.contains(SubTag.SMELTING_TO_GEM))
+ && GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L) != null
+ && aMaterial != Materials.Aluminium) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(9, aStack), ItemList.Shape_Mold_Ingot.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 2))
+ .recipeCategory(RecipeCategories.alloySmelterMolding)
+ .addTo(alloySmelterRecipes);
+ }
+
+ if (aMaterial.mStandardMoltenFluid != null) {
+ if (!(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Nugget.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(16L))
+ .duration(16 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 4))
+ .addTo(fluidSolidifierRecipes);
+ }
+ }
+
+ GT_RecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
+ GT_RecipeRegistrator
+ .registerReverseMacerating(aStack, aMaterial, aPrefix.mMaterialAmount, null, null, null, false);
+ if (!aMaterial.contains(SubTag.NO_SMELTING)
+ && GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L),
+ ItemList.Shape_Mold_Nugget.get(0L))
+ .itemOutputs(GT_Utility.copyAmount(9, aStack))
+ .duration(5 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 1))
+ .recipeCategory(RecipeCategories.alloySmelterMolding)
+ .addTo(alloySmelterRecipes);
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.nugget, aMaterial, 8L),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "sI ", 'I', OrePrefixes.ingot.get(aMaterial) });
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingOre.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingOre.java
new file mode 100644
index 0000000000..945ffae386
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingOre.java
@@ -0,0 +1,245 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingOre implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ private final ArrayList<Materials> mAlreadyListedOres = new ArrayList<>(1000);
+
+ public ProcessingOre() {
+ for (OrePrefixes tPrefix : OrePrefixes.values()) if ((tPrefix.name()
+ .startsWith("ore")) && (tPrefix != OrePrefixes.orePoor)
+ && (tPrefix != OrePrefixes.oreSmall)
+ && (tPrefix != OrePrefixes.oreRich)
+ && (tPrefix != OrePrefixes.oreNormal)) tPrefix.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ boolean tIsRich = false;
+
+ // For Sake of god of balance!
+
+ // Dense ore
+ if (GT_Mod.gregtechproxy.mRichOreYieldMultiplier) {
+ tIsRich = (aPrefix == OrePrefixes.oreRich) || (aPrefix == OrePrefixes.oreDense);
+ }
+ // NetherOre
+ if (GT_Mod.gregtechproxy.mNetherOreYieldMultiplier && !tIsRich) {
+ tIsRich = (aPrefix == OrePrefixes.oreNetherrack) || (aPrefix == OrePrefixes.oreNether);
+ }
+ // EndOre
+ if (GT_Mod.gregtechproxy.mEndOreYieldMultiplier && !tIsRich) {
+ tIsRich = (aPrefix == OrePrefixes.oreEndstone) || (aPrefix == OrePrefixes.oreEnd);
+ }
+
+ if (aMaterial == Materials.Oilsands) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(new ItemStack(net.minecraft.init.Blocks.sand, 1, 0))
+ .outputChances(tIsRich ? 2000 : 4000)
+ .fluidOutputs(Materials.OilHeavy.getFluid(tIsRich ? 4000L : 2000L))
+ .duration(tIsRich ? 30 * SECONDS : 15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(centrifugeRecipes);
+ } else {
+ registerStandardOreRecipes(
+ aPrefix,
+ aMaterial,
+ GT_Utility.copyAmount(1, aStack),
+ Math.max(
+ 1,
+ gregtech.api.GregTech_API.sOPStuff.get(
+ gregtech.api.enums.ConfigCategories.Materials.oreprocessingoutputmultiplier,
+ aMaterial.toString(),
+ 1))
+ * (tIsRich ? 2 : 1));
+ }
+ }
+
+ private boolean registerStandardOreRecipes(OrePrefixes aPrefix, Materials aMaterial, ItemStack aOreStack,
+ int aMultiplier) {
+ if ((aOreStack == null) || (aMaterial == null)) return false;
+ GT_ModHandler
+ .addValuableOre(GT_Utility.getBlockFromStack(aOreStack), aOreStack.getItemDamage(), aMaterial.mOreValue);
+ Materials tMaterial = aMaterial.mOreReplacement;
+ Materials tPrimaryByMaterial = null;
+ aMultiplier = Math.max(1, aMultiplier);
+ aOreStack = GT_Utility.copyAmount(1, aOreStack);
+ aOreStack.stackSize = 1;
+
+ ItemStack tIngot = GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mDirectSmelting, 1L);
+ ItemStack tGem = GT_OreDictUnificator.get(OrePrefixes.gem, tMaterial, 1L);
+ ItemStack tSmeltInto = tIngot
+ == null
+ ? null
+ : aMaterial.contains(SubTag.SMELTING_TO_GEM)
+ ? GT_OreDictUnificator.get(
+ OrePrefixes.gem,
+ tMaterial.mDirectSmelting,
+ GT_OreDictUnificator.get(
+ OrePrefixes.crystal,
+ tMaterial.mDirectSmelting,
+ GT_OreDictUnificator.get(
+ OrePrefixes.gem,
+ tMaterial,
+ GT_OreDictUnificator.get(OrePrefixes.crystal, tMaterial, 1L),
+ 1L),
+ 1L),
+ 1L)
+ : tIngot;
+
+ ItemStack tDust = GT_OreDictUnificator.get(OrePrefixes.dust, tMaterial, tGem, 1L);
+ ItemStack tCleaned = GT_OreDictUnificator.get(OrePrefixes.crushedPurified, tMaterial, tDust, 1L);
+ ItemStack tCrushed = GT_OreDictUnificator
+ .get(OrePrefixes.crushed, tMaterial, (long) aMaterial.mOreMultiplier * aMultiplier);
+ ItemStack tPrimaryByProduct = null;
+
+ if (tCrushed == null) {
+ tCrushed = GT_OreDictUnificator.get(
+ OrePrefixes.dustImpure,
+ tMaterial,
+ GT_Utility.copyAmount(aMaterial.mOreMultiplier * aMultiplier, tCleaned, tDust, tGem),
+ (long) aMaterial.mOreMultiplier * aMultiplier);
+ }
+
+ for (Materials tMat : aMaterial.mOreByProducts) {
+ GT_OreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
+ if (tPrimaryByProduct == null) {
+ tPrimaryByMaterial = tMat;
+ tPrimaryByProduct = GT_OreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
+ if (GT_OreDictUnificator.get(OrePrefixes.dustSmall, tMat, 1L) == null) GT_OreDictUnificator
+ .get(OrePrefixes.dustTiny, tMat, GT_OreDictUnificator.get(OrePrefixes.nugget, tMat, 2L), 2L);
+ }
+ GT_OreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
+ if (GT_OreDictUnificator.get(OrePrefixes.dustSmall, tMat, 1L) == null) GT_OreDictUnificator
+ .get(OrePrefixes.dustTiny, tMat, GT_OreDictUnificator.get(OrePrefixes.nugget, tMat, 2L), 2L);
+ }
+
+ if (tPrimaryByMaterial == null) tPrimaryByMaterial = tMaterial;
+ if (tPrimaryByProduct == null) tPrimaryByProduct = tDust;
+ boolean tHasSmelting = false;
+
+ if (tSmeltInto != null) {
+ if ((aMaterial.mBlastFurnaceRequired) || (aMaterial.mDirectSmelting.mBlastFurnaceRequired)) {
+ GT_ModHandler.removeFurnaceSmelting(aOreStack);
+ } else {
+ tHasSmelting = GT_ModHandler.addSmeltingRecipe(
+ aOreStack,
+ GT_Utility.copyAmount(aMultiplier * aMaterial.mSmeltingMultiplier, tSmeltInto));
+ }
+
+ if (aMaterial.contains(SubTag.BLASTFURNACE_CALCITE_TRIPLE)) {
+ if (aMaterial.mAutoGenerateBlastFurnaceRecipes) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aOreStack,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, aMultiplier))
+ .itemOutputs(
+ GT_Utility.mul(aMultiplier * 3 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+ .duration(tSmeltInto.stackSize * 25 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1500)
+ .addTo(blastFurnaceRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aOreStack,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quicklime, aMultiplier))
+ .itemOutputs(
+ GT_Utility.mul(aMultiplier * 3 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+ .duration(tSmeltInto.stackSize * 25 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1500)
+ .addTo(blastFurnaceRecipes);
+ }
+ } else if (aMaterial.contains(SubTag.BLASTFURNACE_CALCITE_DOUBLE)) {
+ if (aMaterial.mAutoGenerateBlastFurnaceRecipes) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aOreStack,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, aMultiplier))
+ .itemOutputs(
+ GT_Utility.mul(aMultiplier * 2 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+ .duration(tSmeltInto.stackSize * 25 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1500)
+ .addTo(blastFurnaceRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aOreStack,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quicklime, aMultiplier))
+ .itemOutputs(
+ GT_Utility.mul(aMultiplier * 2 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+ .duration(tSmeltInto.stackSize * 25 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1500)
+ .addTo(blastFurnaceRecipes);
+ }
+ }
+ }
+
+ if (!tHasSmelting) {
+ GT_ModHandler.addSmeltingRecipe(
+ aOreStack,
+ GT_OreDictUnificator.get(
+ OrePrefixes.gem,
+ tMaterial.mDirectSmelting,
+ Math.max(1, aMultiplier * aMaterial.mSmeltingMultiplier / 2)));
+ }
+
+ if (tCrushed != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aOreStack)
+ .itemOutputs(GT_Utility.copy(GT_Utility.copyAmount(tCrushed.stackSize, tGem), tCrushed))
+ .duration(10)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ int chanceOre2 = tPrimaryByProduct == null ? 0
+ : tPrimaryByProduct.stackSize * 10 * aMultiplier * aMaterial.mByProductMultiplier;
+ chanceOre2 = 100 * chanceOre2; // converting to the GT format, 100% is 10000
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aOreStack)
+ .itemOutputs(
+ GT_Utility.mul(2, tCrushed),
+ tMaterial.contains(SubTag.PULVERIZING_CINNABAR) ? GT_OreDictUnificator.get(
+ OrePrefixes.crystal,
+ Materials.Cinnabar,
+ GT_OreDictUnificator
+ .get(OrePrefixes.gem, tPrimaryByMaterial, GT_Utility.copyAmount(1, tPrimaryByProduct), 1L),
+ 1L)
+ : GT_OreDictUnificator
+ .get(OrePrefixes.gem, tPrimaryByMaterial, GT_Utility.copyAmount(1, tPrimaryByProduct), 1L),
+ GT_OreDictUnificator.getDust(aPrefix.mSecondaryMaterial))
+ .outputChances(10000, chanceOre2, 5000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingOrePoor.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingOrePoor.java
new file mode 100644
index 0000000000..ac9106d31b
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingOrePoor.java
@@ -0,0 +1,72 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingOrePoor implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingOrePoor() {
+ OrePrefixes.orePoor.add(this);
+ OrePrefixes.oreSmall.add(this);
+ OrePrefixes.oreNormal.add(this);
+ OrePrefixes.oreRich.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ int aMultiplier = 1;
+ switch (aPrefix) {
+ case oreSmall:
+ aMultiplier = 1;
+ break;
+ case orePoor:
+ aMultiplier = 2;
+ break;
+ case oreNormal:
+ aMultiplier = 3;
+ break;
+ case oreRich:
+ aMultiplier = 4;
+ default:
+ break;
+ }
+ if (aMaterial != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, aMultiplier))
+ .duration(10)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, aMaterial, 2 * aMultiplier),
+ GT_OreDictUnificator.get(
+ OrePrefixes.dustTiny,
+ GT_Utility.selectItemInList(0, aMaterial, aMaterial.mOreByProducts),
+ 1L),
+ GT_OreDictUnificator.getDust(aPrefix.mSecondaryMaterial))
+ .outputChances(10000, 100 * 5 * aMultiplier, 10000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ if (aMaterial.contains(SubTag.NO_SMELTING)) GT_ModHandler.addSmeltingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, aMaterial.mDirectSmelting, aMultiplier));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingOreSmelting.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingOreSmelting.java
new file mode 100644
index 0000000000..93458ee467
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingOreSmelting.java
@@ -0,0 +1,194 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.recipe.RecipeMaps.primitiveBlastRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.ADDITIVE_AMOUNT;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingOreSmelting implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ private final OrePrefixes[] mSmeltingPrefixes = { OrePrefixes.crushed, OrePrefixes.crushedPurified,
+ OrePrefixes.crushedCentrifuged, OrePrefixes.dust, OrePrefixes.dustImpure, OrePrefixes.dustPure,
+ OrePrefixes.dustRefined };
+
+ public ProcessingOreSmelting() {
+ for (OrePrefixes tPrefix : this.mSmeltingPrefixes) tPrefix.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ GT_ModHandler.removeFurnaceSmelting(aStack);
+ if (!aMaterial.contains(SubTag.NO_SMELTING)) {
+ if ((aMaterial.mBlastFurnaceRequired) || (aMaterial.mDirectSmelting.mBlastFurnaceRequired)) {
+ if (aMaterial.mBlastFurnaceTemp < 1000 && aMaterial.mDirectSmelting.mBlastFurnaceTemp < 1000)
+ if (aMaterial.mAutoGenerateBlastFurnaceRecipes
+ && GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1));
+ if (aMaterial.mBlastFurnaceTemp > 1750) {
+ recipeBuilder.itemOutputs(
+ GT_OreDictUnificator.get(
+ OrePrefixes.ingotHot,
+ aMaterial,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L),
+ 1L));
+ } else {
+ recipeBuilder.itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L));
+ }
+ recipeBuilder
+ .duration(Math.max(aMaterial.getMass() / 4L, 1L) * aMaterial.mBlastFurnaceTemp * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, (int) aMaterial.mBlastFurnaceTemp)
+ .addTo(blastFurnaceRecipes);
+ }
+ } else {
+ OrePrefixes outputPrefix;
+ int outputSize;
+ switch (aPrefix) {
+ case crushed:
+ case crushedPurified:
+ case crushedCentrifuged:
+ if (aMaterial.mDirectSmelting == aMaterial) {
+ outputSize = 10;
+ outputPrefix = OrePrefixes.nugget;
+ } else {
+ if (GT_Mod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre) {
+ outputSize = 6;
+ outputPrefix = OrePrefixes.nugget;
+ } else {
+ outputSize = 1;
+ outputPrefix = OrePrefixes.ingot;
+ }
+ }
+ break;
+ case dust:
+ int outputAmount = GT_Mod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre ? 2 : 3;
+ if (aMaterial.mDirectSmelting != aMaterial) {
+ if (!aMaterial.contains(SubTag.DONT_ADD_DEFAULT_BBF_RECIPE)
+ && aMaterial.mDirectSmelting.getIngots(1) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack))
+ .itemOutputs(aMaterial.mDirectSmelting.getIngots(outputAmount))
+ .duration(2 * MINUTES)
+ .metadata(ADDITIVE_AMOUNT, 2)
+ .addTo(primitiveBlastRecipes);
+ } else if (aMaterial == Materials.Chalcopyrite) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aMaterial.getDust(2), new ItemStack(Blocks.sand, 2))
+ .itemOutputs(
+ aMaterial.mDirectSmelting.getIngots(outputAmount),
+ Materials.Ferrosilite.getDustSmall(2 * outputAmount))
+ .duration(2 * MINUTES)
+ .metadata(ADDITIVE_AMOUNT, 2)
+ .addTo(primitiveBlastRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aMaterial.getDust(2), Materials.Glass.getDust(2))
+ .itemOutputs(
+ aMaterial.mDirectSmelting.getIngots(outputAmount),
+ Materials.Ferrosilite.getDustSmall(7 * outputAmount))
+ .duration(2 * MINUTES)
+ .metadata(ADDITIVE_AMOUNT, 2)
+ .addTo(primitiveBlastRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aMaterial.getDust(2), Materials.SiliconDioxide.getDust(2))
+ .itemOutputs(
+ aMaterial.mDirectSmelting.getIngots(outputAmount),
+ Materials.Ferrosilite.getDustSmall(outputAmount))
+ .duration(2 * MINUTES)
+ .metadata(ADDITIVE_AMOUNT, 2)
+ .addTo(primitiveBlastRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aMaterial.getDust(2), Materials.Quartzite.getDust(4))
+ .itemOutputs(
+ aMaterial.mDirectSmelting.getIngots(outputAmount),
+ Materials.Ferrosilite.getDustSmall(outputAmount))
+ .duration(2 * MINUTES)
+ .metadata(ADDITIVE_AMOUNT, 2)
+ .addTo(primitiveBlastRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aMaterial.getDust(2), Materials.NetherQuartz.getDust(2))
+ .itemOutputs(
+ aMaterial.mDirectSmelting.getIngots(outputAmount),
+ Materials.Ferrosilite.getDustSmall(outputAmount))
+ .duration(2 * MINUTES)
+ .metadata(ADDITIVE_AMOUNT, 2)
+ .addTo(primitiveBlastRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aMaterial.getDust(2), Materials.CertusQuartz.getDust(2))
+ .itemOutputs(
+ aMaterial.mDirectSmelting.getIngots(outputAmount),
+ Materials.Ferrosilite.getDustSmall(outputAmount))
+ .duration(2 * MINUTES)
+ .metadata(ADDITIVE_AMOUNT, 2)
+ .addTo(primitiveBlastRecipes);
+ } else if (aMaterial == Materials.Tetrahedrite) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aMaterial.getDust(2))
+ .itemOutputs(
+ aMaterial.mDirectSmelting.getIngots(outputAmount),
+ Materials.Antimony.getNuggets(3 * outputAmount))
+ .duration(2 * MINUTES)
+ .metadata(ADDITIVE_AMOUNT, 2)
+ .addTo(primitiveBlastRecipes);
+ } else if (aMaterial == Materials.Galena) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aMaterial.getDust(2))
+ .itemOutputs(
+ aMaterial.mDirectSmelting.getIngots(outputAmount),
+ Materials.Silver.getNuggets(3 * outputAmount))
+ .duration(2 * MINUTES)
+ .metadata(ADDITIVE_AMOUNT, 2)
+ .addTo(primitiveBlastRecipes);
+ }
+ }
+ case dustImpure:
+ case dustPure:
+ case dustRefined:
+ if (aMaterial.mDirectSmelting == aMaterial) {
+ outputPrefix = OrePrefixes.ingot;
+ outputSize = 1;
+ } else {
+ if (GT_Mod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre) {
+ outputSize = 6;
+ outputPrefix = OrePrefixes.nugget;
+ } else {
+ outputSize = 1;
+ outputPrefix = OrePrefixes.ingot;
+ }
+ }
+ break;
+ default:
+ outputPrefix = OrePrefixes.ingot;
+ outputSize = 1;
+ break;
+ }
+ ItemStack tStack = GT_OreDictUnificator.get(outputPrefix, aMaterial.mDirectSmelting, outputSize);
+ if (tStack == null) tStack = GT_OreDictUnificator.get(
+ aMaterial.contains(SubTag.SMELTING_TO_GEM) ? OrePrefixes.gem : OrePrefixes.ingot,
+ aMaterial.mDirectSmelting,
+ 1L);
+ if ((tStack == null) && (!aMaterial.contains(SubTag.SMELTING_TO_GEM)))
+ tStack = GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mDirectSmelting, 1L);
+ GT_ModHandler.addSmeltingRecipe(aStack, tStack);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPipe.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPipe.java
new file mode 100644
index 0000000000..1f97e1e32a
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPipe.java
@@ -0,0 +1,141 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+@SuppressWarnings("RedundantLabeledSwitchRuleCodeBlock")
+public class ProcessingPipe implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingPipe() {
+ OrePrefixes.pipeHuge.add(this);
+ OrePrefixes.pipeLarge.add(this);
+ OrePrefixes.pipeMedium.add(this);
+ OrePrefixes.pipeSmall.add(this);
+ OrePrefixes.pipeTiny.add(this);
+ OrePrefixes.pipeRestrictiveHuge.add(this);
+ OrePrefixes.pipeRestrictiveLarge.add(this);
+ OrePrefixes.pipeRestrictiveMedium.add(this);
+ OrePrefixes.pipeRestrictiveSmall.add(this);
+ OrePrefixes.pipeRestrictiveTiny.add(this);
+ OrePrefixes.pipeQuadruple.add(this);
+ OrePrefixes.pipeNonuple.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ switch (aPrefix) {
+ case pipeHuge, pipeLarge, pipeMedium, pipeSmall, pipeTiny -> {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial, 8L),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PPP", "h w", "PPP", 'P', OrePrefixes.plate.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial, 6L),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PWP", "P P", "PHP", 'P',
+ aMaterial == Materials.Wood ? OrePrefixes.plank.get(aMaterial)
+ : OrePrefixes.plate.get(aMaterial),
+ 'H',
+ aMaterial.contains(SubTag.WOOD) ? ToolDictNames.craftingToolSoftHammer
+ : ToolDictNames.craftingToolHardHammer,
+ 'W', aMaterial.contains(SubTag.WOOD) ? ToolDictNames.craftingToolSaw
+ : ToolDictNames.craftingToolWrench });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 2L),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PPP", "W H", "PPP", 'P',
+ aMaterial == Materials.Wood ? OrePrefixes.plank.get(aMaterial)
+ : OrePrefixes.plate.get(aMaterial),
+ 'H',
+ aMaterial.contains(SubTag.WOOD) ? ToolDictNames.craftingToolSoftHammer
+ : ToolDictNames.craftingToolHardHammer,
+ 'W', aMaterial.contains(SubTag.WOOD) ? ToolDictNames.craftingToolSaw
+ : ToolDictNames.craftingToolWrench });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial, 1L),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PHP", "P P", "PWP", 'P',
+ aMaterial == Materials.Wood ? OrePrefixes.plank.get(aMaterial)
+ : OrePrefixes.plate.get(aMaterial),
+ 'H',
+ aMaterial.contains(SubTag.WOOD) ? ToolDictNames.craftingToolSoftHammer
+ : ToolDictNames.craftingToolHardHammer,
+ 'W', aMaterial.contains(SubTag.WOOD) ? ToolDictNames.craftingToolSaw
+ : ToolDictNames.craftingToolWrench });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial, 1L),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "DhD", "D D", "DwD", 'D', OrePrefixes.plateDouble.get(aMaterial) });
+ }
+ }
+ case pipeRestrictiveHuge, pipeRestrictiveLarge, pipeRestrictiveMedium, pipeRestrictiveSmall, pipeRestrictiveTiny -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(
+ OrePrefixes.ring,
+ Materials.Steel,
+ aPrefix.mSecondaryMaterial.mAmount / OrePrefixes.ring.mMaterialAmount),
+ GT_OreDictUnificator.get(aOreDictName.replaceFirst("Restrictive", ""), null, 1L, false, true))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .duration(
+ ((int) (aPrefix.mSecondaryMaterial.mAmount * 400L / OrePrefixes.ring.mMaterialAmount)) * TICKS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+ }
+ case pipeQuadruple -> {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, aMaterial, 1),
+ GT_ModHandler.RecipeBits.REVERSIBLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "MM ", "MM ", " ", 'M',
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 1) });
+ }
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 4),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, aMaterial, 1))
+ .duration(3 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 4))
+ .addTo(assemblerRecipes);
+ }
+ case pipeNonuple -> {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ GT_ModHandler.RecipeBits.REVERSIBLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PPP", "PPP", "PPP", 'P', GT_OreDictUnificator
+ .get(aOreDictName.replaceFirst("Nonuple", "Small"), null, 1L, false, true) });
+ }
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial, 9),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeNonuple, aMaterial, 1))
+ .duration(3 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(assemblerRecipes);
+ }
+ default -> {}
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlank.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlank.java
new file mode 100644
index 0000000000..3b06babee6
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlank.java
@@ -0,0 +1,137 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
+import static gregtech.api.recipe.RecipeMaps.latheRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingPlank implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingPlank() {
+ OrePrefixes.plank.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (aOreDictName.startsWith("plankWood")) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2L))
+ .duration(10 * TICKS)
+ .eut(8)
+ .addTo(latheRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(1, aStack),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Iron, 1L))
+ .itemOutputs(ItemList.Crate_Empty.get(1L))
+ .duration(10 * SECONDS)
+ .eut(1)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(1, aStack),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.WroughtIron, 1L))
+ .itemOutputs(ItemList.Crate_Empty.get(1L))
+ .duration(10 * SECONDS)
+ .eut(1)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(1, aStack),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 1L))
+ .itemOutputs(ItemList.Crate_Empty.get(1L))
+ .duration(10 * SECONDS)
+ .eut(1)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(8, aStack), GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(new ItemStack(Blocks.chest, 1))
+ .duration(40 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ if (aStack.getItemDamage() == 32767) {
+ for (byte i = 0; i < 64; i = (byte) (i + 1)) {
+ ItemStack tStack = GT_Utility.copyMetaData(i, aStack);
+ // Get Recipe and Output, add recipe to delayed removal
+ ItemStack tOutput = GT_ModHandler.getRecipeOutput(tStack, tStack, tStack);
+ if ((tOutput != null) && (tOutput.stackSize >= 3)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, tStack))
+ .itemOutputs(GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput))
+ .fluidInputs(Materials.Water.getFluid(4))
+ .duration(2 * 25 * TICKS)
+ .eut(4)
+ .addTo(cutterRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, tStack))
+ .itemOutputs(GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput))
+ .fluidInputs(GT_ModHandler.getDistilledWater(3))
+ .duration(2 * 25 * TICKS)
+ .eut(4)
+ .addTo(cutterRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, tStack))
+ .itemOutputs(GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput))
+ .fluidInputs(Materials.Lubricant.getFluid(1))
+ .duration(25 * TICKS)
+ .eut(4)
+ .addTo(cutterRecipes);
+ GT_ModHandler.removeRecipeDelayed(tStack, tStack, tStack);
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "sP", 'P', tStack });
+ }
+ if ((tStack == null) && (i >= 16)) break;
+ }
+ } else {
+ ItemStack tOutput = !aModName.equalsIgnoreCase("thaumcraft")
+ ? GT_ModHandler.getRecipeOutput(aStack, aStack, aStack)
+ : GT_ModHandler.getRecipeOutputNoOreDict(aStack, aStack, aStack);
+ if ((tOutput != null) && (tOutput.stackSize >= 3)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput))
+ .fluidInputs(Materials.Water.getFluid(4))
+ .duration(2 * 25)
+ .eut(4)
+ .addTo(cutterRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput))
+ .fluidInputs(GT_ModHandler.getDistilledWater(3))
+ .duration(2 * 25)
+ .eut(4)
+ .addTo(cutterRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput))
+ .fluidInputs(Materials.Lubricant.getFluid(1))
+ .duration(25)
+ .eut(4)
+ .addTo(cutterRecipes);
+ GT_ModHandler.removeRecipeDelayed(aStack, aStack, aStack);
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(tOutput.stackSize / 3, tOutput),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "sP", 'P', aStack });
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java
new file mode 100644
index 0000000000..be8322f30c
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java
@@ -0,0 +1,604 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.enums.GT_Values.L;
+import static gregtech.api.enums.GT_Values.NI;
+import static gregtech.api.enums.GT_Values.W;
+import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.benderRecipes;
+import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
+import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
+import static gregtech.api.recipe.RecipeMaps.implosionRecipes;
+import static gregtech.api.util.GT_ModHandler.RecipeBits.BUFFERED;
+import static gregtech.api.util.GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+import static gregtech.common.GT_Proxy.tBits;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TextureSet;
+import gregtech.api.enums.TierEU;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.recipe.RecipeCategories;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_RecipeRegistrator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingPlate() {
+ OrePrefixes.plate.add(this);
+ OrePrefixes.plateDouble.add(this);
+ OrePrefixes.plateTriple.add(this);
+ OrePrefixes.plateQuadruple.add(this);
+ OrePrefixes.plateQuintuple.add(this);
+ OrePrefixes.plateDense.add(this);
+ OrePrefixes.plateAlloy.add(this);
+ OrePrefixes.itemCasing.add(this);
+ }
+
+ /**
+ * Register processes for the {@link ItemStack} with Ore Dictionary Name Prefix "plate"
+ *
+ * @param aPrefix always != null, the {@link OrePrefixes} of the {@link ItemStack}
+ * @param aMaterial always != null, and can be == _NULL if the Prefix is Self Referencing or not Material based!
+ * the {@link Materials} of the {@link ItemStack}
+ * @param aOreDictName the Ore Dictionary Name {@link String} of the {@link ItemStack}
+ * @param aModName the ModID {@link String} of the mod providing this {@link ItemStack}
+ * @param aStack always != null, the {@link ItemStack} to register
+ */
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+
+ final boolean aNoSmashing = aMaterial.contains(SubTag.NO_SMASHING);
+ final boolean aNoWorking = aMaterial.contains(SubTag.NO_WORKING);
+ final long aMaterialMass = aMaterial.getMass();
+
+ switch (aPrefix) {
+ case plate -> registerPlate(aMaterial, aStack, aNoSmashing);
+ case plateDouble -> registerPlateDouble(aMaterial, aStack, aNoSmashing, aMaterialMass);
+ case plateTriple -> registerPlateTriple(aMaterial, aStack, aNoSmashing, aMaterialMass);
+ case plateQuadruple -> registerPlateQuadruple(aMaterial, aStack, aNoSmashing, aMaterialMass, aNoWorking);
+ case plateQuintuple -> registerPlateQuintuple(aMaterial, aStack, aNoSmashing, aMaterialMass);
+ case plateDense -> registerPlateDense(aMaterial, aStack, aNoSmashing, aMaterialMass);
+ case itemCasing -> registerItemCasing(aPrefix, aMaterial, aStack, aNoSmashing);
+ case plateAlloy -> registerPlateAlloy(aOreDictName, aStack);
+ default -> {}
+ }
+ }
+
+ private void registerPlate(final Materials aMaterial, final ItemStack aStack, final boolean aNoSmashing) {
+
+ registerCover(aMaterial, aStack);
+
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+ GT_ModHandler.removeRecipeDelayed(aStack);
+
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ GT_Utility.copyAmount(9, aStack),
+ GT_ModHandler.getCompressorRecipeList(),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L));
+
+ if (aMaterial.mFuelPower > 0) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .metadata(FUEL_VALUE, aMaterial.mFuelPower)
+ .metadata(FUEL_TYPE, aMaterial.mFuelType)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+
+ if (aMaterial.mStandardMoltenFluid != null
+ && !(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Plate.get(0L))
+ .itemOutputs(aMaterial.getPlates(1))
+ .fluidInputs(aMaterial.getMolten(L))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(fluidSolidifierRecipes);
+ }
+
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.foil, aMaterial, 2L),
+ tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
+ new Object[] { "hX", 'X', OrePrefixes.plate.get(aMaterial) });
+
+ if (aMaterial == Materials.Paper) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(2, aStack),
+ BUFFERED,
+ new Object[] { "XXX", 'X', new ItemStack(Items.reeds, 1, W) });
+ }
+
+ if (aMaterial.mUnificatable && aMaterial.mMaterialInto == aMaterial) {
+
+ if (!aNoSmashing) {
+
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ aMaterial.getPlates(1),
+ tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
+ new Object[] { "h", // craftingToolHardHammer
+ "X", "X", 'X', OrePrefixes.ingot.get(aMaterial) });
+
+ // Only added if IC2 Forge Hammer is enabled in Recipes.cfg: B:ic2forgehammer_true=false
+ GT_ModHandler.addCraftingRecipe(
+ aMaterial.getPlates(1),
+ tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
+ new Object[] { "H", // craftingToolForgeHammer
+ "X", 'H', ToolDictNames.craftingToolForgeHammer, 'X', OrePrefixes.ingot.get(aMaterial) });
+
+ GT_ModHandler.addCraftingRecipe(
+ aMaterial.getPlates(1),
+ tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
+ new Object[] { "h", // craftingToolHardHammer
+ "X", 'X', OrePrefixes.gem.get(aMaterial) });
+
+ // Only added if IC2 Forge Hammer is enabled in Recipes.cfg: B:ic2forgehammer_true=false
+ GT_ModHandler.addCraftingRecipe(
+ aMaterial.getPlates(1),
+ tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
+ new Object[] { "H", // craftingToolForgeHammer
+ "X", 'H', ToolDictNames.craftingToolForgeHammer, 'X', OrePrefixes.gem.get(aMaterial) });
+ }
+ }
+
+ if (aMaterial.contains(SubTag.MORTAR_GRINDABLE)) {
+
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ aMaterial.getDust(1),
+ tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
+ new Object[] { ToolDictNames.craftingToolMortar, OrePrefixes.plate.get(aMaterial) });
+ }
+ }
+ }
+ }
+
+ private void registerPlateDouble(final Materials aMaterial, final ItemStack aStack, final boolean aNoSmashing,
+ final long aMaterialMass) {
+
+ registerCover(aMaterial, aStack);
+
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+
+ if (!aNoSmashing || aMaterial.contains(SubTag.STRETCHY)) {
+ // 2 double -> 1 quadruple plate
+ if (GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 2L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+ // 2 plates -> 1 double plate
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 2L),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .duration(Math.max(aMaterialMass * 2L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ } else {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 2L),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .fluidInputs(Materials.Glue.getFluid(10L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+ }
+
+ if (!aNoSmashing) {
+ Object aPlateStack = OrePrefixes.plate.get(aMaterial);
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
+ new Object[] { "I", "B", "h", // craftingToolHardHammer
+ 'I', aPlateStack, 'B', aPlateStack });
+ }
+ }
+ }
+
+ private void registerPlateTriple(final Materials aMaterial, final ItemStack aStack, final boolean aNoSmashing,
+ final long aMaterialMass) {
+
+ registerCover(aMaterial, aStack);
+
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+
+ if (!aNoSmashing || aMaterial.contains(SubTag.STRETCHY)) {
+ if (GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L) != null) {
+ // 3 triple plates -> 1 dense plate
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateDense, aMaterial, 1L))
+ .duration(Math.max(aMaterialMass * 3L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 3L),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .duration(Math.max(aMaterialMass * 3L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ } else {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 3L),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .fluidInputs(Materials.Glue.getFluid(20L))
+ .duration(4 * SECONDS + 16 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+ }
+
+ if (!aNoSmashing) {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ Object aPlateStack = OrePrefixes.plate.get(aMaterial);
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
+ new Object[] { "I", "B", "h", // craftingToolHardHammer
+ 'I', OrePrefixes.plateDouble.get(aMaterial), 'B', aPlateStack });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
+ new Object[] { gregtech.api.enums.ToolDictNames.craftingToolForgeHammer, aPlateStack, aPlateStack,
+ aPlateStack });
+ }
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Block_Powderbarrel.get(4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_ModHandler.getIC2Item("dynamite", 1, null))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), new ItemStack(Blocks.tnt, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_ModHandler.getIC2Item("industrialTnt", 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.compressed, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 1L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ }
+ }
+
+ private void registerPlateQuadruple(final Materials aMaterial, final ItemStack aStack, final boolean aNoSmashing,
+ final long aMaterialMass, final boolean aNoWorking) {
+
+ registerCover(aMaterial, aStack);
+
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+
+ if (!aNoSmashing || aMaterial.contains(SubTag.STRETCHY)) {
+ // Quadruple plate
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .duration(Math.max(aMaterialMass * 4L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ } else {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .fluidInputs(Materials.Glue.getFluid(30L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+ }
+ if (!aNoSmashing) {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ Object aPlateStack = OrePrefixes.plate.get(aMaterial);
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
+ new Object[] { "I", "B", "h", // craftingToolHardHammer
+ 'I', OrePrefixes.plateTriple.get(aMaterial), 'B', aPlateStack });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
+ new Object[] { gregtech.api.enums.ToolDictNames.craftingToolForgeHammer, aPlateStack, aPlateStack,
+ aPlateStack, aPlateStack });
+ }
+ }
+ }
+
+ private void registerPlateQuintuple(final Materials aMaterial, final ItemStack aStack, final boolean aNoSmashing,
+ final long aMaterialMass) {
+
+ registerCover(aMaterial, aStack);
+
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+
+ if (!aNoSmashing || aMaterial.contains(SubTag.STRETCHY)) {
+ // quintuple plate
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 5L),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .duration(Math.max(aMaterialMass * 5L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ } else {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 5L),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .fluidInputs(Materials.Glue.getFluid(40L))
+ .duration(8 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+ }
+ if (!aNoSmashing) {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ Object aPlateStack = OrePrefixes.plate.get(aMaterial);
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
+ new Object[] { "I", "B", "h", // craftingToolHardHammer
+ 'I', OrePrefixes.plateQuadruple.get(aMaterial), 'B', aPlateStack });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ DO_NOT_CHECK_FOR_COLLISIONS | BUFFERED,
+ new Object[] { ToolDictNames.craftingToolForgeHammer, aPlateStack, aPlateStack, aPlateStack,
+ aPlateStack, aPlateStack });
+ }
+ }
+ }
+
+ private void registerPlateDense(final Materials aMaterial, final ItemStack aStack, final boolean aNoSmashing,
+ final long aMaterialMass) {
+
+ registerCover(aMaterial, aStack);
+
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+
+ if (!aNoSmashing || aMaterial.contains(SubTag.STRETCHY)) {
+ // Dense plate
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 9L),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .duration(Math.max(aMaterialMass * 9L, 1L))
+ .eut(calculateRecipeEU(aMaterial, 96))
+ .addTo(benderRecipes);
+ }
+ }
+
+ private void registerItemCasing(final OrePrefixes aPrefix, final Materials aMaterial, final ItemStack aStack,
+ final boolean aNoSmashing) {
+
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+
+ if (aMaterial.mStandardMoltenFluid != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Casing.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(L / 2))
+ .duration(16 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(fluidSolidifierRecipes);
+ }
+
+ if (aMaterial.mUnificatable && aMaterial.mMaterialInto == aMaterial && !aNoSmashing) {
+
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 1L),
+ tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
+ new Object[] { "h X", 'X', OrePrefixes.plate.get(aMaterial) });
+
+ // Only added if IC2 Forge Hammer is enabled in Recipes.cfg: B:ic2forgehammer_true=false
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 1L),
+ tBits, // DO_NOT_CHECK_FOR_COLLISIONS|BUFFERED|ONLY_ADD_IF_RESULT_IS_NOT_NULL|NOT_REMOVABLE
+ new Object[] { "H X", 'H', ToolDictNames.craftingToolForgeHammer, 'X',
+ OrePrefixes.plate.get(aMaterial) });
+ }
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 2L),
+ ItemList.Shape_Mold_Casing.get(0L))
+ .itemOutputs(GT_Utility.copyAmount(3, aStack))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 15))
+ .recipeCategory(RecipeCategories.alloySmelterMolding)
+ .addTo(alloySmelterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L),
+ ItemList.Shape_Extruder_Casing.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 2L))
+ .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 45))
+ .addTo(extruderRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 2L))
+ .fluidInputs(
+ Materials.Water.getFluid(
+ Math.max(
+ 4,
+ Math.min(
+ 1000,
+ ((int) Math.max(aMaterial.getMass(), 1L)) * (calculateRecipeEU(aMaterial, 16)) / 320))))
+ .duration(2 * ((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 16))
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 2L))
+ .fluidInputs(
+ GT_ModHandler.getDistilledWater(
+ Math.max(
+ 3,
+ Math.min(
+ 750,
+ ((int) Math.max(aMaterial.getMass(), 1L)) * (calculateRecipeEU(aMaterial, 16)) / 426))))
+ .duration(2 * ((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 16))
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.itemCasing, aMaterial, 2L))
+ .fluidInputs(
+ Materials.Lubricant.getFluid(
+ Math.max(
+ 1,
+ Math.min(
+ 250,
+ ((int) Math.max(aMaterial.getMass(), 1L)) * (calculateRecipeEU(aMaterial, 16))
+ / 1280))))
+ .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 16))
+ .addTo(cutterRecipes);
+ }
+ GT_RecipeRegistrator.registerReverseFluidSmelting(aStack, aMaterial, aPrefix.mMaterialAmount, null);
+ }
+
+ private void registerPlateAlloy(final String aOreDictName, final ItemStack aStack) {
+
+ switch (aOreDictName) {
+ case "plateAlloyCarbon" -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("generator", 1L), GT_Utility.copyAmount(4, aStack))
+ .itemOutputs(GT_ModHandler.getIC2Item("windMill", 1L))
+ .duration(5 * MINUTES + 20 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), new ItemStack(Blocks.glass, 3, W))
+ .itemOutputs(GT_ModHandler.getIC2Item("reinforcedGlass", 4L))
+ .duration(20 * SECONDS)
+ .eut(4)
+ .addTo(alloySmelterRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), Materials.Glass.getDust(3))
+ .itemOutputs(GT_ModHandler.getIC2Item("reinforcedGlass", 4L))
+ .duration(20 * SECONDS)
+ .eut(4)
+ .addTo(alloySmelterRecipes);
+ }
+ case "plateAlloyAdvanced" -> {
+ GT_ModHandler.addAlloySmelterRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ new ItemStack(Blocks.glass, 3, W),
+ GT_ModHandler.getIC2Item("reinforcedGlass", 4L),
+ 400,
+ 4,
+ false);
+ GT_ModHandler.addAlloySmelterRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ Materials.Glass.getDust(3),
+ GT_ModHandler.getIC2Item("reinforcedGlass", 4L),
+ 400,
+ 4,
+ false);
+ }
+ case "plateAlloyIridium" ->
+
+ // Remove IC2 Shaped recipe for Iridium Reinforced Plate
+ GT_ModHandler.removeRecipeByOutputDelayed(aStack);
+ default -> {}
+ }
+ }
+
+ private void registerCover(final Materials aMaterial, final ItemStack aStack) {
+
+ // Get ItemStack of Block matching Materials
+ ItemStack tStack = NI;
+ // Try different prefixes to use same smooth stones as older GT5U
+ for (OrePrefixes orePrefix : new OrePrefixes[] { OrePrefixes.block, OrePrefixes.block_, OrePrefixes.stoneSmooth,
+ OrePrefixes.stone }) {
+ if ((tStack = GT_OreDictUnificator.get(orePrefix, aMaterial, 1)) != NI) break;
+ }
+
+ // Register the cover
+ GregTech_API.registerCover(
+ aStack,
+ // If there is an ItemStack of Block for Materials
+ tStack == NI ?
+ // Use Materials mRGBa dyed blocs/materialicons/MATERIALSET/block1 icons
+ TextureFactory.builder()
+ .addIcon(aMaterial.mIconSet.mTextures[TextureSet.INDEX_block1])
+ .setRGBA(aMaterial.mRGBa)
+ .stdOrient()
+ .build()
+ :
+ // or copy Block texture
+ TextureFactory.of(Block.getBlockFromItem(tStack.getItem()), tStack.getItemDamage()),
+ null);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPure.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPure.java
new file mode 100644
index 0000000000..01262d32f4
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPure.java
@@ -0,0 +1,50 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingPure implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingPure() {
+ OrePrefixes.crushedPurified.add(this);
+ OrePrefixes.cleanGravel.add(this);
+ OrePrefixes.reduced.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustPure, aMaterial.mMacerateInto, 1L))
+ .duration(10)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(
+ OrePrefixes.dustPure,
+ aMaterial.mMacerateInto,
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial.mMacerateInto, 1L),
+ 1L),
+ GT_OreDictUnificator.get(
+ OrePrefixes.dust,
+ GT_Utility.selectItemInList(1, aMaterial.mMacerateInto, aMaterial.mOreByProducts),
+ 1L))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRawOre.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRawOre.java
new file mode 100644
index 0000000000..5ece6f5315
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRawOre.java
@@ -0,0 +1,219 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingRawOre implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ private final OrePrefixes[] mRawOrePrefixes = { OrePrefixes.rawOre };
+
+ public ProcessingRawOre() {
+ for (OrePrefixes tPrefix : this.mRawOrePrefixes) tPrefix.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (aMaterial == Materials.Oilsands) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(new ItemStack(net.minecraft.init.Blocks.sand, 1, 0))
+ .outputChances(4000)
+ .fluidOutputs(Materials.OilHeavy.getFluid(2000L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(centrifugeRecipes);
+ } else {
+ registerStandardOreRecipes(
+ aPrefix,
+ aMaterial,
+ GT_Utility.copyAmount(1, aStack),
+ Math.max(
+ 1,
+ gregtech.api.GregTech_API.sOPStuff.get(
+ gregtech.api.enums.ConfigCategories.Materials.oreprocessingoutputmultiplier,
+ aMaterial.toString(),
+ 1)));
+ }
+ }
+
+ private boolean registerStandardOreRecipes(OrePrefixes aPrefix, Materials aMaterial, ItemStack aOreStack,
+ int aMultiplier) {
+ if ((aOreStack == null) || (aMaterial == null)) return false;
+ GT_ModHandler
+ .addValuableOre(GT_Utility.getBlockFromStack(aOreStack), aOreStack.getItemDamage(), aMaterial.mOreValue);
+ Materials tMaterial = aMaterial.mOreReplacement;
+ Materials tPrimaryByMaterial = null;
+ aMultiplier = Math.max(1, aMultiplier);
+ aOreStack = GT_Utility.copyAmount(1, aOreStack);
+ aOreStack.stackSize = 1;
+ ItemStack tIngot = GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mDirectSmelting, 1L);
+ ItemStack tGem = GT_OreDictUnificator.get(OrePrefixes.gem, tMaterial, 1L);
+ ItemStack tSmeltInto = tIngot
+ == null
+ ? null
+ : aMaterial.contains(SubTag.SMELTING_TO_GEM)
+ ? GT_OreDictUnificator.get(
+ OrePrefixes.gem,
+ tMaterial.mDirectSmelting,
+ GT_OreDictUnificator.get(
+ OrePrefixes.crystal,
+ tMaterial.mDirectSmelting,
+ GT_OreDictUnificator.get(
+ OrePrefixes.gem,
+ tMaterial,
+ GT_OreDictUnificator.get(OrePrefixes.crystal, tMaterial, 1L),
+ 1L),
+ 1L),
+ 1L)
+ : tIngot;
+ ItemStack tDust = GT_OreDictUnificator.get(OrePrefixes.dust, tMaterial, tGem, 1L);
+ ItemStack tCleaned = GT_OreDictUnificator.get(OrePrefixes.crushedPurified, tMaterial, tDust, 1L);
+ ItemStack tCrushed = GT_OreDictUnificator.get(OrePrefixes.crushed, tMaterial, (long) aMaterial.mOreMultiplier);
+ ItemStack tPrimaryByProduct = null;
+
+ if (tCrushed == null) {
+ tCrushed = GT_OreDictUnificator.get(
+ OrePrefixes.dustImpure,
+ tMaterial,
+ GT_Utility.copyAmount(aMaterial.mOreMultiplier, tCleaned, tDust, tGem),
+ (long) aMaterial.mOreMultiplier);
+ }
+
+ for (Materials tMat : aMaterial.mOreByProducts) {
+ GT_OreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
+ if (tPrimaryByProduct == null) {
+ tPrimaryByMaterial = tMat;
+ tPrimaryByProduct = GT_OreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
+ if (GT_OreDictUnificator.get(OrePrefixes.dustSmall, tMat, 1L) == null) GT_OreDictUnificator
+ .get(OrePrefixes.dustTiny, tMat, GT_OreDictUnificator.get(OrePrefixes.nugget, tMat, 2L), 2L);
+ }
+ GT_OreDictUnificator.get(OrePrefixes.dust, tMat, 1L);
+ if (GT_OreDictUnificator.get(OrePrefixes.dustSmall, tMat, 1L) == null) GT_OreDictUnificator
+ .get(OrePrefixes.dustTiny, tMat, GT_OreDictUnificator.get(OrePrefixes.nugget, tMat, 2L), 2L);
+ }
+
+ if (tPrimaryByMaterial == null) tPrimaryByMaterial = tMaterial;
+ if (tPrimaryByProduct == null) tPrimaryByProduct = tDust;
+ boolean tHasSmelting = false;
+
+ if (tSmeltInto != null) {
+ if ((aMaterial.mBlastFurnaceRequired) || (aMaterial.mDirectSmelting.mBlastFurnaceRequired)) {
+ GT_ModHandler.removeFurnaceSmelting(aOreStack);
+ } else {
+ tHasSmelting = GT_ModHandler
+ .addSmeltingRecipe(aOreStack, GT_Utility.copyAmount(aMaterial.mSmeltingMultiplier, tSmeltInto));
+ }
+
+ if (aMaterial.contains(SubTag.BLASTFURNACE_CALCITE_TRIPLE)) {
+ if (aMaterial.mAutoGenerateBlastFurnaceRecipes) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aOreStack,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, aMultiplier))
+ .itemOutputs(
+ GT_Utility.mul(3 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+ .duration(tSmeltInto.stackSize * 25 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1500)
+ .addTo(blastFurnaceRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aOreStack,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quicklime, aMultiplier))
+ .itemOutputs(
+ GT_Utility.mul(3 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+ .duration(tSmeltInto.stackSize * 25 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1500)
+ .addTo(blastFurnaceRecipes);
+ }
+ } else if (aMaterial.contains(SubTag.BLASTFURNACE_CALCITE_DOUBLE)) {
+ if (aMaterial.mAutoGenerateBlastFurnaceRecipes) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aOreStack,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, aMultiplier))
+ .itemOutputs(
+ GT_Utility.mul(2 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+ .duration(tSmeltInto.stackSize * 25 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1500)
+ .addTo(blastFurnaceRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aOreStack,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quicklime, aMultiplier))
+ .itemOutputs(
+ GT_Utility.mul(2 * aMaterial.mSmeltingMultiplier, tSmeltInto),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.DarkAsh, 1L))
+ .duration(tSmeltInto.stackSize * 25 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1500)
+ .addTo(blastFurnaceRecipes);
+ }
+ }
+ }
+
+ if (!tHasSmelting) {
+ GT_ModHandler.addSmeltingRecipe(
+ aOreStack,
+ GT_OreDictUnificator
+ .get(OrePrefixes.gem, tMaterial.mDirectSmelting, Math.max(1, aMaterial.mSmeltingMultiplier / 2)));
+ }
+
+ if (tCrushed != null) {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.mul(1, tCrushed),
+ new Object[] { aOreStack, ToolDictNames.craftingToolHardHammer });
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aOreStack)
+ .itemOutputs(GT_Utility.copy(GT_Utility.copyAmount(tCrushed.stackSize, tGem), tCrushed))
+ .duration(10)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ int chanceOre2 = tPrimaryByProduct == null ? 0
+ : tPrimaryByProduct.stackSize * 5 * aMaterial.mByProductMultiplier;
+ chanceOre2 = 100 * chanceOre2; // converting to the GT format, 100% is 10000
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aOreStack)
+ .itemOutputs(
+ GT_Utility.mul(2, tCrushed),
+ tMaterial.contains(SubTag.PULVERIZING_CINNABAR) ? GT_OreDictUnificator.get(
+ OrePrefixes.crystal,
+ Materials.Cinnabar,
+ GT_OreDictUnificator
+ .get(OrePrefixes.gem, tPrimaryByMaterial, GT_Utility.copyAmount(1, tPrimaryByProduct), 1L),
+ 1L)
+ : GT_OreDictUnificator
+ .get(OrePrefixes.gem, tPrimaryByMaterial, GT_Utility.copyAmount(1, tPrimaryByProduct), 1L),
+ GT_OreDictUnificator.getDust(aPrefix.mSecondaryMaterial))
+ .outputChances(10000, chanceOre2, 5000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRecycling.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRecycling.java
new file mode 100644
index 0000000000..bfa580b4c4
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRecycling.java
@@ -0,0 +1,45 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.cannerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingRecycling implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingRecycling() {
+ for (OrePrefixes tPrefix : OrePrefixes.values())
+ if ((tPrefix.mIsMaterialBased) && (tPrefix.mMaterialAmount > 0L) && (tPrefix.mIsContainer))
+ tPrefix.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if ((aMaterial != Materials.Empty) && (GT_Utility.getFluidForFilledItem(aStack, true) == null)
+ && !aMaterial.contains(SubTag.SMELTING_TO_FLUID)
+ && (GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L) != null)) {
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder.itemInputs(aStack);
+ if (GT_Utility.getContainerItem(aStack, true) == null) {
+ recipeBuilder.itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, aPrefix.mMaterialAmount / 3628800L));
+ } else {
+ recipeBuilder.itemOutputs(
+ GT_Utility.getContainerItem(aStack, true),
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, aPrefix.mMaterialAmount / 3628800L));
+ }
+ recipeBuilder.duration(((int) Math.max(aMaterial.getMass() / 2L, 1L)) * TICKS)
+ .eut(2)
+ .addTo(cannerRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java
new file mode 100644
index 0000000000..3548bd437b
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java
@@ -0,0 +1,97 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+
+public class ProcessingRotor implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingRotor() {
+ OrePrefixes.rotor.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial)
+ && !aMaterial.contains(SubTag.NO_WORKING)) {
+ ItemStack tPlate = GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L);
+ ItemStack tRing = GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L);
+ if (GT_Utility.isStackValid(tPlate) && GT_Utility.isStackValid(tRing)) {
+
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "PhP", "SRf", "PdP", 'P',
+ aMaterial == Materials.Wood ? OrePrefixes.plank.get(aMaterial)
+ : OrePrefixes.plate.get(aMaterial),
+ 'R', OrePrefixes.ring.get(aMaterial), 'S', OrePrefixes.screw.get(aMaterial) });
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tPlate.copy(), tRing.copy(), GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
+ .fluidInputs(Materials.Tin.getMolten(32))
+ .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 24))
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tPlate.copy(), tRing.copy(), GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
+ .fluidInputs(Materials.Lead.getMolten(48))
+ .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 24))
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(tPlate.copy(), tRing.copy(), GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
+ .fluidInputs(Materials.SolderingAlloy.getMolten(16))
+ .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 24))
+ .addTo(assemblerRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 5L),
+ ItemList.Shape_Extruder_Rotor.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
+ .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 24))
+ .addTo(extruderRecipes);
+ }
+ if (aMaterial.mStandardMoltenFluid != null) {
+ if (!(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Rotor.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(612L))
+ .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 24))
+ .addTo(fluidSolidifierRecipes);
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRound.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRound.java
new file mode 100644
index 0000000000..0eb2cb3dd0
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRound.java
@@ -0,0 +1,52 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.latheRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.item.ItemStack;
+
+import appeng.core.Api;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+
+public class ProcessingRound implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingRound() {
+ OrePrefixes.round.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (!aMaterial.contains(SubTag.NO_WORKING)) {
+ if (GT_OreDictUnificator.get(OrePrefixes.nugget, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.nugget, aMaterial, 1L))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .duration(((int) Math.max(aMaterial.getMass() / 4L, 1L)) * TICKS)
+ .eut(8)
+ .addTo(latheRecipes);
+ }
+
+ if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial)) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.round, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "fX", "Xh", 'X', OrePrefixes.nugget.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.round, aMaterial, 4L),
+ GT_Proxy.tBits,
+ new Object[] { "fXh", 'X', OrePrefixes.ingot.get(aMaterial) });
+ }
+ }
+ Api.INSTANCE.registries()
+ .matterCannon()
+ .registerAmmo(GT_OreDictUnificator.get(OrePrefixes.round, aMaterial, 1L), aMaterial.getMass());
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingSand.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingSand.java
new file mode 100644
index 0000000000..b1996d067f
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingSand.java
@@ -0,0 +1,36 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingSand implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingSand() {
+ OrePrefixes.sand.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (aOreDictName.equals("sandOil")) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Cell_Empty.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oil, 1L),
+ new ItemStack(Blocks.sand, 1, 0))
+ .duration(50 * SECONDS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingSaplings.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingSaplings.java
new file mode 100644
index 0000000000..f13c2aa9b5
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingSaplings.java
@@ -0,0 +1,50 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.recipe.RecipeMaps.latheRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingSaplings implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingSaplings() {
+ OrePrefixes.treeSapling.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 2L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(8, aStack))
+ .itemOutputs(ItemList.IC2_Plantball.get(1L))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Wood, 1L))
+ .duration(16 * TICKS)
+ .eut(8)
+ .addTo(latheRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingScrew.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingScrew.java
new file mode 100644
index 0000000000..afafe8525d
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingScrew.java
@@ -0,0 +1,46 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.latheRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+
+public class ProcessingScrew implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingScrew() {
+ OrePrefixes.screw.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (!aMaterial.contains(SubTag.NO_WORKING)) {
+ if (GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .duration(((int) Math.max(aMaterial.getMass() / 8L, 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 4))
+ .addTo(latheRecipes);
+ }
+ if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial))
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "fX", "X ", 'X', OrePrefixes.bolt.get(aMaterial) });
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingShaping.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingShaping.java
new file mode 100644
index 0000000000..5493aa9b8e
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingShaping.java
@@ -0,0 +1,620 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
+import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.recipe.RecipeCategories;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+
+@SuppressWarnings("RedundantLabeledSwitchRuleCodeBlock")
+public class ProcessingShaping implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingShaping() {
+ OrePrefixes.ingot.add(this);
+ OrePrefixes.dust.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (((aMaterial == Materials.Glass) || (GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null))
+ && (!aMaterial.contains(SubTag.NO_SMELTING))) {
+ long aMaterialMass = aMaterial.getMass();
+ int tAmount = (int) (aPrefix.mMaterialAmount / 3628800L);
+ if ((tAmount > 0) && (tAmount <= 64) && (aPrefix.mMaterialAmount % 3628800L == 0L)) {
+ int tVoltageMultiplier = aMaterial.mBlastFurnaceTemp >= 2800 ? 60 : 15;
+ int tTrueVoltage = aMaterial.getProcessingMaterialTierEU();
+
+ if (aMaterial.contains(SubTag.NO_SMASHING)) {
+ tVoltageMultiplier /= 4;
+ } else if (aPrefix.name()
+ .startsWith(OrePrefixes.dust.name())) {
+ return;
+ }
+
+ if (!OrePrefixes.block.isIgnored(aMaterial.mSmeltInto)
+ && (GT_OreDictUnificator.get(OrePrefixes.block, aMaterial.mSmeltInto, 1L) != null)
+ && aMaterial != Materials.Ichorium) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(9, aStack), ItemList.Shape_Extruder_Block.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, aMaterial.mSmeltInto, tAmount))
+ .duration((10 * tAmount) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+
+ // Allow creation of alloy smelter recipes for material recycling if < IV tier.
+ if (tTrueVoltage < TierEU.IV) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(9, aStack), ItemList.Shape_Mold_Block.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, aMaterial.mSmeltInto, tAmount))
+ .duration((5 * tAmount) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 4 * tVoltageMultiplier))
+ .recipeCategory(RecipeCategories.alloySmelterMolding)
+ .addTo(alloySmelterRecipes);
+ }
+ }
+ if ((aPrefix != OrePrefixes.ingot || aMaterial != aMaterial.mSmeltInto)
+ && GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Ingot.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial.mSmeltInto, tAmount))
+ .duration(10 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 4 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Pipe_Tiny.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial.mSmeltInto, tAmount * 2))
+ .duration((4 * tAmount) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Pipe_Small.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial.mSmeltInto, tAmount))
+ .duration((8 * tAmount) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Shape_Extruder_Pipe_Medium.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial.mSmeltInto, tAmount))
+ .duration((24 * tAmount) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(6, aStack), ItemList.Shape_Extruder_Pipe_Large.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial.mSmeltInto, tAmount))
+ .duration((48 * tAmount) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(12, aStack), ItemList.Shape_Extruder_Pipe_Huge.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial.mSmeltInto, tAmount))
+ .duration((96 * tAmount) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Plate.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Small_Gear.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(6, aStack), ItemList.Shape_Extruder_Turbine_Blade.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+
+ if (!(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
+ if (aMaterial.mStandardMoltenFluid != null) {
+ if (GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Ring.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(36L))
+ .duration(5 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 4 * tVoltageMultiplier))
+ .addTo(fluidSolidifierRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Screw.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(18L))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
+ .addTo(fluidSolidifierRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Rod.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(72L))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(fluidSolidifierRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Bolt.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(18L))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
+ .addTo(fluidSolidifierRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.round, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Round.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.round, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(18L))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
+ .addTo(fluidSolidifierRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Rod_Long.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(144L))
+ .duration(15 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(fluidSolidifierRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Turbine_Blade.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(864L))
+ .duration(20 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(fluidSolidifierRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Pipe_Tiny.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeTiny, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(72L))
+ .duration(1 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(fluidSolidifierRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Pipe_Small.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeSmall, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(144L))
+ .duration(2 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(fluidSolidifierRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Pipe_Medium.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeMedium, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(432L))
+ .duration(4 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(fluidSolidifierRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Pipe_Large.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeLarge, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(864L))
+ .duration(8 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(fluidSolidifierRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Pipe_Huge.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeHuge, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(1728L))
+ .duration(16 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(fluidSolidifierRecipes);
+ }
+ }
+ }
+ if (tAmount * 2 <= 64 && aMaterial != Materials.Obsidian) {
+ if (!(aMaterial == Materials.Aluminium)) {
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Rod.get(0L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mSmeltInto, tAmount * 2))
+ .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 6 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ } else {
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Rod.get(0L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mSmeltInto, tAmount * 2))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ }
+ }
+ if (tAmount * 2 <= 64) {
+ if (GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Wire.get(0L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial.mSmeltInto, tAmount * 2))
+ .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 6 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ }
+ if (tAmount * 8 <= 64) {
+ if (GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Bolt.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial.mSmeltInto, tAmount * 8))
+ .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ }
+ if (tAmount * 4 <= 64) {
+ if (GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Ring.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial.mSmeltInto, tAmount * 4))
+ .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 6 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial)
+ && !aMaterial.contains(SubTag.NO_SMASHING)) {
+ // If material tier < IV then add manual recipe.
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV
+ && GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L) != null) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "h ", "fX", 'X', OrePrefixes.stick.get(aMaterial) });
+ }
+ }
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Extruder_Sword.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Shape_Extruder_Pickaxe.get(0L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * 3L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Shovel.get(0L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * 1L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), ItemList.Shape_Extruder_Axe.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * 3L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Extruder_Hoe.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.toolHeadHammer, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(6, aStack), ItemList.Shape_Extruder_Hammer.get(0L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadHammer, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * 6L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.toolHeadFile, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Extruder_File.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadFile, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Extruder_Saw.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), ItemList.Shape_Extruder_Gear.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * 5L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8 * tVoltageMultiplier))
+ .addTo(extruderRecipes);
+ }
+
+ if (!(aMaterial == Materials.StyreneButadieneRubber || aMaterial == Materials.Silicone)) {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Plate.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
+ .recipeCategory(RecipeCategories.alloySmelterMolding)
+ .addTo(alloySmelterRecipes);
+ }
+ }
+ } else {
+ // If tier < IV then add ability to turn ingots into plates via alloy smelter.
+ if (tTrueVoltage < TierEU.IV) {
+ if (GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Mold_Plate.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * 2L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
+ .recipeCategory(RecipeCategories.alloySmelterMolding)
+ .addTo(alloySmelterRecipes);
+ }
+ }
+ }
+
+ // If tier < IV then add ability to turn ingots into gears via alloy smelter.
+ if (tTrueVoltage < TierEU.IV) {
+ if (GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial.mSmeltInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(8, aStack), ItemList.Shape_Mold_Gear.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gearGt, aMaterial.mSmeltInto, tAmount))
+ .duration(((int) Math.max(aMaterialMass * 10L * tAmount, tAmount)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 2 * tVoltageMultiplier))
+ .recipeCategory(RecipeCategories.alloySmelterMolding)
+ .addTo(alloySmelterRecipes);
+ }
+ }
+
+ switch (aMaterial.mSmeltInto.mName) {
+ case "Glass" -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Bottle.get(0L))
+ .itemOutputs(new ItemStack(Items.glass_bottle, 1))
+ .duration((tAmount * 32) * TICKS)
+ .eut(16)
+ .addTo(extruderRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Mold_Bottle.get(0L))
+ .itemOutputs(new ItemStack(Items.glass_bottle, 1))
+ .duration((tAmount * 64) * TICKS)
+ .eut(4)
+ .addTo(alloySmelterRecipes);
+ }
+ case "Steel" -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Cell.get(0L))
+ .itemOutputs(ItemList.Cell_Empty.get(tAmount))
+ .duration((tAmount * 128) * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(extruderRecipes);
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casingadviron", tAmount * 2))
+ .duration((tAmount * 32) * TICKS)
+ .eut(3 * tVoltageMultiplier)
+ .addTo(extruderRecipes);
+ }
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casingadviron", tAmount * 3))
+ .duration((tAmount * 128) * TICKS)
+ .eut(1 * tVoltageMultiplier)
+ .addTo(alloySmelterRecipes);
+ }
+ }
+ case "Iron", "WroughtIron" -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Cell.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("fuelRod", tAmount))
+ .duration((tAmount * 128) * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(extruderRecipes);
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casingiron", tAmount * 2))
+ .duration((tAmount * 32) * TICKS)
+ .eut(3 * tVoltageMultiplier)
+ .addTo(extruderRecipes);
+ }
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casingiron", tAmount * 3))
+ .duration((tAmount * 128) * TICKS)
+ .eut(1 * tVoltageMultiplier)
+ .addTo(alloySmelterRecipes);
+ }
+ if (tAmount * 31 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(31, aStack), ItemList.Shape_Mold_Anvil.get(0L))
+ .itemOutputs(new ItemStack(Blocks.anvil, 1, 0))
+ .duration((tAmount * 512) * TICKS)
+ .eut(4 * tVoltageMultiplier)
+ .addTo(alloySmelterRecipes);
+ }
+ }
+ case "Tin" -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Extruder_Cell.get(0L))
+ .itemOutputs(ItemList.Cell_Empty.get(tAmount))
+ .duration((tAmount * 128) * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(extruderRecipes);
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casingtin", tAmount * 2))
+ .duration((tAmount * 32) * TICKS)
+ .eut(3 * tVoltageMultiplier)
+ .addTo(extruderRecipes);
+ }
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casingtin", tAmount * 3))
+ .duration((tAmount * 128) * TICKS)
+ .eut(1 * tVoltageMultiplier)
+ .addTo(alloySmelterRecipes);
+ }
+ }
+ case "Lead" -> {
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casinglead", tAmount * 2))
+ .duration((tAmount * 32) * TICKS)
+ .eut(3 * tVoltageMultiplier)
+ .addTo(extruderRecipes);
+ }
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casinglead", tAmount * 3))
+ .duration((tAmount * 128) * TICKS)
+ .eut(1 * tVoltageMultiplier)
+ .addTo(alloySmelterRecipes);
+ }
+ }
+ case "Copper", "AnnealedCopper" -> {
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casingcopper", tAmount * 2))
+ .duration((tAmount * 32) * TICKS)
+ .eut(3 * tVoltageMultiplier)
+ .addTo(extruderRecipes);
+ }
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casingcopper", tAmount * 3))
+ .duration((tAmount * 128) * TICKS)
+ .eut(1 * tVoltageMultiplier)
+ .addTo(alloySmelterRecipes);
+ }
+ }
+ case "Bronze" -> {
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casingbronze", tAmount * 2))
+ .duration((tAmount * 32) * TICKS)
+ .eut(3 * tVoltageMultiplier)
+ .addTo(extruderRecipes);
+ }
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casingbronze", tAmount * 3))
+ .duration((tAmount * 128) * TICKS)
+ .eut(1 * tVoltageMultiplier)
+ .addTo(alloySmelterRecipes);
+ }
+ }
+ case "Gold" -> {
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casinggold", tAmount * 2))
+ .duration((tAmount * 32) * TICKS)
+ .eut(3 * tVoltageMultiplier)
+ .addTo(extruderRecipes);
+ }
+ if (tAmount * 2 <= 64) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), ItemList.Shape_Mold_Casing.get(0L))
+ .itemOutputs(GT_ModHandler.getIC2Item("casinggold", tAmount * 3))
+ .duration((tAmount * 128) * TICKS)
+ .eut(1 * tVoltageMultiplier)
+ .addTo(alloySmelterRecipes);
+ }
+ }
+ case "Polytetrafluoroethylene" -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), ItemList.Shape_Extruder_Cell.get(0L))
+ .itemOutputs(ItemList.Cell_Empty.get(tAmount * 4))
+ .duration((tAmount * 128) * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(extruderRecipes);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingSlab.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingSlab.java
new file mode 100644
index 0000000000..35947755d3
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingSlab.java
@@ -0,0 +1,36 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingSlab implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingSlab() {
+ OrePrefixes.slab.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (aOreDictName.startsWith("slabWood")) {
+ if (Railcraft.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack))
+ .itemOutputs(ItemList.RC_Tie_Wood.get(3L))
+ .fluidInputs(Materials.Creosote.getFluid(300L))
+ .duration(10 * SECONDS)
+ .eut(4)
+ .addTo(chemicalBathRecipes);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingStick.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStick.java
new file mode 100644
index 0000000000..e5aac7bfe7
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStick.java
@@ -0,0 +1,141 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.benderRecipes;
+import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.recipe.RecipeMaps.latheRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+
+public class ProcessingStick implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingStick() {
+ OrePrefixes.stick.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 1L),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { " s ", "fPx", 'P', OrePrefixes.stick.get(aMaterial) });
+ }
+ if (!aMaterial.contains(gregtech.api.enums.SubTag.NO_WORKING)) {
+
+ if ((aMaterial.contains(SubTag.CRYSTAL) ? GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L)
+ : GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L)) != null
+ && GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial.mMacerateInto, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aMaterial.contains(SubTag.CRYSTAL) ? GT_OreDictUnificator.get(OrePrefixes.gem, aMaterial, 1L)
+ : GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, aMaterial.mMacerateInto, 2L))
+ .duration(((int) Math.max(aMaterial.getMass() * 5L, 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 16))
+ .addTo(latheRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 1L) != null) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 4L))
+ .fluidInputs(
+ Materials.Water.getFluid(
+ Math.max(
+ 4,
+ Math.min(
+ 1000,
+ 2 * ((int) Math.max(aMaterial.getMass() * 2L, 1L))
+ * calculateRecipeEU(aMaterial, 4)
+ / 320))))
+ .duration(2 * ((int) Math.max(aMaterial.getMass() * 2L, 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 4))
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 4L))
+ .fluidInputs(
+ GT_ModHandler.getDistilledWater(
+ Math.max(
+ 3,
+ Math.min(
+ 750,
+ 2 * ((int) Math.max(aMaterial.getMass() * 2L, 1L))
+ * calculateRecipeEU(aMaterial, 4)
+ / 426))))
+ .duration(2 * ((int) Math.max(aMaterial.getMass() * 2L, 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 4))
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.bolt, aMaterial, 4L))
+ .fluidInputs(
+ Materials.Lubricant.getFluid(
+ Math.max(
+ 1,
+ Math.min(
+ 250,
+ ((int) Math.max(aMaterial.getMass() * 2L, 1L)) * calculateRecipeEU(aMaterial, 4)
+ / 1280))))
+ .duration(((int) Math.max(aMaterial.getMass() * 2L, 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 4))
+ .addTo(cutterRecipes);
+ }
+
+ if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial)) {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 2L),
+ GT_Proxy.tBits,
+ new Object[] { "s", "X", 'X', OrePrefixes.stickLong.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "f ", " X", 'X', OrePrefixes.ingot.get(aMaterial) });
+ }
+ }
+ }
+ if (!aMaterial.contains(gregtech.api.enums.SubTag.NO_SMASHING)) {
+ // bender recipe
+ {
+ if (GT_OreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 2L))
+ .duration(5 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(benderRecipes);
+ }
+ }
+
+ if (GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L))
+ .duration(Math.max(aMaterial.getMass(), 1L))
+ .eut(calculateRecipeEU(aMaterial, 16))
+ .addTo(hammerRecipes);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingStickLong.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStickLong.java
new file mode 100644
index 0000000000..1f00300264
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStickLong.java
@@ -0,0 +1,120 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.benderRecipes;
+import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+
+public class ProcessingStickLong implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingStickLong() {
+ OrePrefixes.stickLong.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.spring, aMaterial, 1L),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { " s ", "fSx", " S ", 'S', OrePrefixes.stickLong.get(aMaterial) });
+ }
+ if (!aMaterial.contains(SubTag.NO_WORKING)) {
+
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 2L))
+ .fluidInputs(
+ Materials.Water.getFluid(
+ Math.max(
+ 4,
+ Math.min(
+ 1000,
+ ((int) Math.max(aMaterial.getMass(), 1L)) * calculateRecipeEU(aMaterial, 4)
+ / 320))))
+ .duration(2 * ((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 4))
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 2L))
+ .fluidInputs(
+ GT_ModHandler.getDistilledWater(
+ Math.max(
+ 3,
+ Math.min(
+ 750,
+ ((int) Math.max(aMaterial.getMass(), 1L)) * calculateRecipeEU(aMaterial, 4)
+ / 426))))
+ .duration(2 * ((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 4))
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial, 2L))
+ .fluidInputs(
+ Materials.Lubricant.getFluid(
+ Math.max(
+ 1,
+ Math.min(
+ 250,
+ ((int) Math.max(aMaterial.getMass(), 1L)) * calculateRecipeEU(aMaterial, 4)
+ / 1280))))
+ .duration(((int) Math.max(aMaterial.getMass(), 1L)) * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 4))
+ .addTo(cutterRecipes);
+ }
+
+ if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)) {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "sf", "G ", 'G', OrePrefixes.gemFlawless.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 2L),
+ GT_Proxy.tBits,
+ new Object[] { "sf", "G ", 'G', OrePrefixes.gemExquisite.get(aMaterial) });
+ }
+ }
+ }
+ if (!aMaterial.contains(SubTag.NO_SMASHING)) {
+ // Bender recipes
+ {
+ if (GT_OreDictUnificator.get(OrePrefixes.spring, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.spring, aMaterial, 1L))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 16))
+ .addTo(benderRecipes);
+ }
+ }
+
+ if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial))
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "ShS", 'S', OrePrefixes.stick.get(aMaterial) });
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingStone.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStone.java
new file mode 100644
index 0000000000..840f49b4dd
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStone.java
@@ -0,0 +1,348 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.interfaces.IOreRecipeRegistrator;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingStone implements IOreRecipeRegistrator {
+
+ public ProcessingStone() {
+ OrePrefixes.stone.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ Block aBlock = GT_Utility.getBlockFromStack(aStack);
+ switch (aMaterial.mName) {
+ case "NULL":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(3, aStack), new ItemStack(Blocks.redstone_torch, 2))
+ .itemOutputs(new ItemStack(Items.repeater, 1))
+ .fluidInputs(Materials.Redstone.getMolten(144L))
+ .duration(5 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+ break;
+ case "Sand":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(new ItemStack(Blocks.sand, 1, 0))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "Endstone":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustImpure, Materials.Endstone, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Tungstate, 1L))
+ .outputChances(10000, 500)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "Netherrack":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustImpure, Materials.Netherrack, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Gold, 1L))
+ .outputChances(10000, 500)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "NetherBrick":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(new ItemStack(Blocks.nether_brick_fence, 1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+ break;
+ case "Obsidian":
+ if (aBlock != Blocks.air) aBlock.setResistance(20.0F);
+ break;
+ case "Concrete":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, 200 * 30 / 320))))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, 200 * 30 / 426))))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, 100 * 30 / 1280))))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "Rhyolite":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.PotassiumFeldspar, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quartz, 1L))
+ .outputChances(10000, 2000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "Komatiite":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Biotite, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Uranium, 1L))
+ .outputChances(10000, 500)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "Dacite":
+ case "Andesite":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Obsidian, 1L))
+ .outputChances(10000, 2000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "Gabbro":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.PotassiumFeldspar, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Pyrite, 1L))
+ .outputChances(10000, 2000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "Eclogite":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Rutile, 1L))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "Soapstone":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustImpure, Materials.Talc, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Chromite, 1L))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "Greenschist":
+ case "Blueschist":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Glauconite, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Basalt, 1L))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "Gneiss":
+ case "Migmatite":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustImpure, Materials.GraniteBlack, 1L))
+ .outputChances(10000, 5000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "Redrock":
+ case "Marble":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, 400 * 30 / 320))))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, 400 * 30 / 426))))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, 200 * 30 / 1280))))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+ case "Basalt":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, 400 * 30 / 320))))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, 400 * 30 / 426))))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, 200 * 30 / 1280))))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+ case "Quartzite":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1L))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "Flint":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 2L),
+ new ItemStack(Items.flint, 1))
+ .outputChances(10000, 5000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "GraniteBlack":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, 400 * 30 / 320))))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, 400 * 30 / 426))))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, 200 * 30 / 1280))))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 1L))
+ .outputChances(10000, 100)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ break;
+ case "GraniteRed":
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, 400 * 30 / 320))))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, 400 * 30 / 426))))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 1L))
+ .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, 200 * 30 / 1280))))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustImpure, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Uranium, 1L))
+ .outputChances(10000, 100)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingStoneCobble.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStoneCobble.java
new file mode 100644
index 0000000000..fb9431e8e4
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStoneCobble.java
@@ -0,0 +1,30 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingStoneCobble implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingStoneCobble() {
+ OrePrefixes.stoneCobble.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(8, aStack), GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(new ItemStack(Blocks.furnace, 1))
+ .duration(20 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingStoneVarious.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStoneVarious.java
new file mode 100644
index 0000000000..d6762a25ab
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingStoneVarious.java
@@ -0,0 +1,25 @@
+package gregtech.loaders.oreprocessing;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.OrePrefixes;
+
+public class ProcessingStoneVarious implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingStoneVarious() {
+ OrePrefixes.stone.add(this);
+ OrePrefixes.stoneCobble.add(this);
+ OrePrefixes.stoneBricks.add(this);
+ OrePrefixes.stoneChiseled.add(this);
+ OrePrefixes.stoneCracked.add(this);
+ OrePrefixes.stoneMossy.add(this);
+ OrePrefixes.stoneMossyBricks.add(this);
+ OrePrefixes.stoneSmooth.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, gregtech.api.enums.Materials aMaterial, String aOreDictName,
+ String aModName, ItemStack aStack) {
+ // no recipes currently.
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolHead.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolHead.java
new file mode 100644
index 0000000000..4b610fea8e
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolHead.java
@@ -0,0 +1,1273 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
+import static gregtech.api.recipe.RecipeMaps.formingPressRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+
+public class ProcessingToolHead implements gregtech.api.interfaces.IOreRecipeRegistrator { // TODO COMPARE WITH OLD TOOL
+ // HEAD??? generator
+
+ public ProcessingToolHead() {
+ OrePrefixes.toolHeadArrow.add(this);
+ OrePrefixes.toolHeadAxe.add(this);
+ OrePrefixes.toolHeadBuzzSaw.add(this);
+ OrePrefixes.toolHeadChainsaw.add(this);
+ OrePrefixes.toolHeadDrill.add(this);
+ OrePrefixes.toolHeadFile.add(this);
+ OrePrefixes.toolHeadHoe.add(this);
+ OrePrefixes.toolHeadPickaxe.add(this);
+ OrePrefixes.toolHeadPlow.add(this);
+ OrePrefixes.toolHeadSaw.add(this);
+ OrePrefixes.toolHeadSense.add(this);
+ OrePrefixes.toolHeadShovel.add(this);
+ OrePrefixes.toolHeadSword.add(this);
+ OrePrefixes.toolHeadUniversalSpade.add(this);
+ OrePrefixes.toolHeadWrench.add(this);
+ OrePrefixes.toolHeadHammer.add(this);
+ OrePrefixes.turbineBlade.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ boolean aSpecialRecipeReq1 = aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)
+ && !aMaterial.contains(SubTag.NO_SMASHING);
+ boolean aSpecialRecipeReq2 = aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)
+ && !aMaterial.contains(SubTag.NO_WORKING);
+ boolean aNoWorking = aMaterial.contains(SubTag.NO_WORKING);
+ boolean aProducesSoftMallet = aMaterial.contains(SubTag.BOUNCY) || aMaterial.contains(SubTag.WOOD)
+ || aMaterial.contains(SubTag.SOFT);
+ switch (aPrefix) {
+ case toolHeadArrow -> {
+ if (aMaterial.mStandardMoltenFluid != null)
+ if (!(aMaterial == Materials.AnnealedCopper || aMaterial == Materials.WroughtIron)) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Arrow.get(0L))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .fluidInputs(aMaterial.getMolten(36L))
+ .duration(16 * TICKS)
+ .eut(8)
+ .addTo(fluidSolidifierRecipes);
+ }
+ if (aSpecialRecipeReq2) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadArrow, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "Xf", 'X', OrePrefixes.gemChipped.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadArrow, aMaterial, 3L),
+ GT_Proxy.tBits,
+ new Object[] { (aMaterial.contains(SubTag.WOOD) ? 115 : 'x') + "Pf", 'P',
+ OrePrefixes.plate.get(aMaterial) });
+ }
+ }
+ case toolHeadAxe -> {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.AXE, 1, aMaterial, aMaterial.mHandleMaterial, null),
+ new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial, 1L),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.AXE,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ }
+ if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "PIh", "P ", "f ", 'P', OrePrefixes.plate.get(aMaterial), 'I',
+ OrePrefixes.ingot.get(aMaterial) });
+ if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "GG ", "G ", "f ", 'G', OrePrefixes.gem.get(aMaterial) });
+ }
+ case toolHeadBuzzSaw -> {
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.BUZZSAW_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 100000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.BUZZSAW_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 75000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.BUZZSAW_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 50000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Sodium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.BUZZSAW_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 400000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
+ 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.BUZZSAW_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 300000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
+ 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.BUZZSAW_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 200000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
+ 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Sodium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.BUZZSAW_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 1600000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.BUZZSAW_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 1200000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.BUZZSAW_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 800000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PBM", "dXG", "SGP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Sodium.get(1L) });
+ if (aSpecialRecipeReq2) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadBuzzSaw, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "wXh", "X X", "fXx", 'X', OrePrefixes.plate.get(aMaterial) });
+ }
+ case toolHeadChainsaw -> {
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.CHAINSAW_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 100000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.CHAINSAW_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 75000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.CHAINSAW_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 50000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Sodium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.CHAINSAW_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 400000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
+ 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.CHAINSAW_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 300000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
+ 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.CHAINSAW_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 200000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
+ 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Sodium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.CHAINSAW_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 1600000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.CHAINSAW_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 1200000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.CHAINSAW_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 800000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Sodium.get(1L) });
+ if (aSpecialRecipeReq2) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadChainsaw, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "SRS", "XhX", "SRS", 'X', OrePrefixes.plate.get(aMaterial), 'S',
+ OrePrefixes.plate.get(Materials.Steel), 'R', OrePrefixes.ring.get(Materials.Steel) });
+ }
+ case toolHeadDrill -> {
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.DRILL_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 100_000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.DRILL_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 75_000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.DRILL_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 50_000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Sodium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.DRILL_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 400_000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
+ 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.DRILL_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 300_000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
+ 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.DRILL_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 200_000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
+ 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Sodium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.DRILL_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 1_600_000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.DRILL_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 1_200_000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.DRILL_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 800_000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Sodium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.JACKHAMMER,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 1_600_000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "PRP", "MPB", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
+ ItemList.Electric_Piston_HV.get(1L), 'S', OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'R',
+ OrePrefixes.spring.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.JACKHAMMER,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 1_200_000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "PRP", "MPB", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
+ ItemList.Electric_Piston_HV.get(1L), 'S', OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'R',
+ OrePrefixes.spring.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.JACKHAMMER,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 800_000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "PRP", "MPB", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
+ ItemList.Electric_Piston_HV.get(1L), 'S', OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'R',
+ OrePrefixes.spring.get(Materials.StainlessSteel), 'B', ItemList.Battery_RE_HV_Sodium.get(1L) });
+ if (aSpecialRecipeReq2) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadDrill, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "XSX", "XSX", "ShS", 'X', OrePrefixes.plate.get(aMaterial), 'S',
+ OrePrefixes.plate.get(Materials.Steel) });
+ if (aMaterial.mStandardMoltenFluid != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_ToolHeadDrill.get(0))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadDrill, aMaterial, 1L))
+ .fluidInputs(aMaterial.getMolten(144 * 4))
+ .duration(5 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
+ .addTo(fluidSolidifierRecipes);
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 4L),
+ ItemList.Shape_Extruder_ToolHeadDrill.get(0))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.toolHeadDrill, aMaterial, 1L))
+ .duration(5 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
+ .addTo(extruderRecipes);
+ }
+ }
+ }
+ case toolHeadFile -> {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.FILE,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null),
+ new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+
+ if ((!aMaterial.contains(SubTag.NO_SMASHING)) && (!aMaterial.contains(SubTag.BOUNCY))) {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.FILE,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null),
+ GT_ModHandler.RecipeBits.MIRRORED | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "P", "P", "S", 'P', OrePrefixes.plate.get(aMaterial), 'S',
+ OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+ }
+ }
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadFile, aMaterial, 1L),
+ GT_Utility.getIntegratedCircuit(15))
+ .itemOutputs(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.FILE,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
+ .addTo(assemblerRecipes);
+ }
+ }
+ case toolHeadHoe -> {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.HOE,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null),
+ new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial, 1L),
+ GT_Utility.getIntegratedCircuit(16))
+ .itemOutputs(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.HOE,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
+ .addTo(assemblerRecipes);
+ }
+ if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "PIh", "f ", 'P', OrePrefixes.plate.get(aMaterial), 'I',
+ OrePrefixes.ingot.get(aMaterial) });
+ if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "GG ", "f ", " ", 'G', OrePrefixes.gem.get(aMaterial) });
+ }
+ case toolHeadPickaxe -> {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.PICKAXE,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null),
+ new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+
+ if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "PII", "f h", 'P', OrePrefixes.plate.get(aMaterial), 'I',
+ OrePrefixes.ingot.get(aMaterial) });
+
+ if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "GGG", "f ", 'G', OrePrefixes.gem.get(aMaterial) });
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, aMaterial, 1L),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.PICKAXE,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
+ .addTo(assemblerRecipes);
+ }
+ }
+ case toolHeadPlow -> {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.PLOW,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null),
+ new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+
+ if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPlow, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "PP", "PP", "hf", 'P', OrePrefixes.plate.get(aMaterial) });
+
+ if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPlow, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "GG", "GG", " f", 'G', OrePrefixes.gem.get(aMaterial) });
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPlow, aMaterial, 1L),
+ GT_Utility.getIntegratedCircuit(6))
+ .itemOutputs(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.PLOW,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
+ .addTo(assemblerRecipes);
+ }
+ }
+ case toolHeadSaw -> {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SAW,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null),
+ new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+
+ if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "PP ", "fh ", 'P', OrePrefixes.plate.get(aMaterial), 'I',
+ OrePrefixes.ingot.get(aMaterial) });
+
+ if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "GGf", 'G', OrePrefixes.gem.get(aMaterial) });
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSaw, aMaterial, 1L),
+ GT_Utility.getIntegratedCircuit(7))
+ .itemOutputs(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SAW,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
+ .addTo(assemblerRecipes);
+ }
+ }
+ case toolHeadSense -> {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SENSE,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null),
+ new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+
+ if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSense, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "PPI", "hf ", 'P', OrePrefixes.plate.get(aMaterial), 'I',
+ OrePrefixes.ingot.get(aMaterial) });
+
+ if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSense, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "GGG", " f ", " ", 'G', OrePrefixes.gem.get(aMaterial) });
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSense, aMaterial, 1L),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SENSE,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
+ .addTo(assemblerRecipes);
+ }
+ }
+ case toolHeadShovel -> {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SHOVEL,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null),
+ new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial, 1L),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SHOVEL,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
+ .addTo(assemblerRecipes);
+ }
+ if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "fPh", 'P', OrePrefixes.plate.get(aMaterial), 'I',
+ OrePrefixes.ingot.get(aMaterial) });
+ if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "fG", 'G', OrePrefixes.gem.get(aMaterial) });
+ }
+ case toolHeadSword -> {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SWORD,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null),
+ new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+
+ if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { " P ", "fPh", 'P', OrePrefixes.plate.get(aMaterial), 'I',
+ OrePrefixes.ingot.get(aMaterial) });
+
+ if (!aNoWorking) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { " G", "fG", 'G', OrePrefixes.gem.get(aMaterial) });
+ }
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, aMaterial, 1L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SWORD,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
+ .addTo(assemblerRecipes);
+ }
+ }
+ case toolHeadUniversalSpade -> {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.UNIVERSALSPADE, 1, aMaterial, aMaterial, null),
+ new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial), OrePrefixes.screw.get(aMaterial),
+ ToolDictNames.craftingToolScrewdriver });
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null
+ && GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadUniversalSpade, aMaterial, 1L),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.UNIVERSALSPADE,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
+ .addTo(assemblerRecipes);
+ }
+ if (aSpecialRecipeReq2) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadUniversalSpade, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "fX", 'X', OrePrefixes.toolHeadShovel.get(aMaterial) });
+ }
+ case toolHeadWrench -> {
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.WRENCH_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 100000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.WRENCH_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 75000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.WRENCH_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 50000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_LV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'P', OrePrefixes.plate.get(Materials.Steel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Steel), 'B', ItemList.Battery_RE_LV_Sodium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.WRENCH_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 400000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
+ 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.WRENCH_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 300000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
+ 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.WRENCH_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 200000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_MV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.Aluminium), 'P', OrePrefixes.plate.get(Materials.Aluminium),
+ 'G', OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Sodium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.WRENCH_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 1600000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.WRENCH_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 1200000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.WRENCH_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 800000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SXd", "GMG", "PBP", 'X', aOreDictName, 'M', ItemList.Electric_Motor_HV.get(1L), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Sodium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SCREWDRIVER_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 100000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
+ ItemList.Electric_Motor_LV.get(1L), 'S', OrePrefixes.screw.get(Materials.Steel), 'P',
+ OrePrefixes.plate.get(Materials.Steel), 'G', OrePrefixes.gearGtSmall.get(Materials.Steel), 'B',
+ ItemList.Battery_RE_LV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SCREWDRIVER_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 75000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
+ ItemList.Electric_Motor_LV.get(1L), 'S', OrePrefixes.screw.get(Materials.Steel), 'P',
+ OrePrefixes.plate.get(Materials.Steel), 'G', OrePrefixes.gearGtSmall.get(Materials.Steel), 'B',
+ ItemList.Battery_RE_LV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SCREWDRIVER_LV,
+ 1,
+ aMaterial,
+ Materials.Steel,
+ new long[] { 50000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
+ ItemList.Electric_Motor_LV.get(1L), 'S', OrePrefixes.screw.get(Materials.Steel), 'P',
+ OrePrefixes.plate.get(Materials.Steel), 'G', OrePrefixes.gearGtSmall.get(Materials.Steel), 'B',
+ ItemList.Battery_RE_LV_Sodium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SCREWDRIVER_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 400000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
+ ItemList.Electric_Motor_MV.get(1L), 'S', OrePrefixes.screw.get(Materials.Aluminium), 'P',
+ OrePrefixes.plate.get(Materials.Aluminium), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SCREWDRIVER_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 300000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
+ ItemList.Electric_Motor_MV.get(1L), 'S', OrePrefixes.screw.get(Materials.Aluminium), 'P',
+ OrePrefixes.plate.get(Materials.Aluminium), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B',
+ ItemList.Battery_RE_MV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SCREWDRIVER_MV,
+ 1,
+ aMaterial,
+ Materials.Aluminium,
+ new long[] { 200000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
+ ItemList.Electric_Motor_MV.get(1L), 'S', OrePrefixes.screw.get(Materials.Aluminium), 'P',
+ OrePrefixes.plate.get(Materials.Aluminium), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.Aluminium), 'B', ItemList.Battery_RE_MV_Sodium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SCREWDRIVER_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 1600000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
+ ItemList.Electric_Motor_HV.get(1L), 'S', OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SCREWDRIVER_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 1200000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
+ ItemList.Electric_Motor_HV.get(1L), 'S', OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Cadmium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SCREWDRIVER_HV,
+ 1,
+ aMaterial,
+ Materials.StainlessSteel,
+ new long[] { 800000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS
+ | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PdX", "MGS", "GBP", 'X', OrePrefixes.stickLong.get(aMaterial), 'M',
+ ItemList.Electric_Motor_HV.get(1L), 'S', OrePrefixes.screw.get(Materials.StainlessSteel), 'P',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'G',
+ OrePrefixes.gearGtSmall.get(Materials.StainlessSteel), 'B',
+ ItemList.Battery_RE_HV_Sodium.get(1L) });
+ if (aSpecialRecipeReq2) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadWrench, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "hXW", "XRX", "WXd", 'X', OrePrefixes.plate.get(aMaterial), 'S',
+ OrePrefixes.plate.get(Materials.Steel), 'R', OrePrefixes.ring.get(Materials.Steel), 'W',
+ OrePrefixes.screw.get(Materials.Steel) });
+ }
+ case toolHeadHammer, toolHeadMallet -> {
+ if (GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, aMaterial.mHandleMaterial, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadHammer, aMaterial, 1L),
+ GT_Utility.getIntegratedCircuit(14))
+ .itemOutputs(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ aProducesSoftMallet ? GT_MetaGenerated_Tool_01.SOFTMALLET
+ : GT_MetaGenerated_Tool_01.HARDHAMMER,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, (int) TierEU.RECIPE_MV))
+ .addTo(assemblerRecipes);
+ }
+ if ((aMaterial != Materials.Stone) && (aMaterial != Materials.Flint)) {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ aProducesSoftMallet ? GT_MetaGenerated_Tool_01.SOFTMALLET
+ : GT_MetaGenerated_Tool_01.HARDHAMMER,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { aOreDictName, OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ aProducesSoftMallet ? GT_MetaGenerated_Tool_01.SOFTMALLET
+ : GT_MetaGenerated_Tool_01.HARDHAMMER,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "XX ", "XXS", "XX ", 'X',
+ aMaterial == Materials.Wood ? OrePrefixes.plank.get(Materials.Wood)
+ : OrePrefixes.ingot.get(aMaterial),
+ 'S', OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ aProducesSoftMallet ? GT_MetaGenerated_Tool_01.SOFTMALLET
+ : GT_MetaGenerated_Tool_01.HARDHAMMER,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "XX ", "XXS", "XX ", 'X',
+ aMaterial == Materials.Wood ? OrePrefixes.plank.get(Materials.Wood)
+ : OrePrefixes.gem.get(aMaterial),
+ 'S', OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+ }
+ if (aPrefix == OrePrefixes.toolHeadHammer) if (aSpecialRecipeReq1) GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadHammer, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "II ", "IIh", "II ", 'P', OrePrefixes.plate.get(aMaterial), 'I',
+ OrePrefixes.ingot.get(aMaterial) });
+ }
+ case turbineBlade -> {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Magnalium, 1L))
+ .itemOutputs(GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(170, 1, aMaterial, aMaterial, null))
+ .duration(8 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 100))
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Titanium, 1L))
+ .itemOutputs(GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(172, 1, aMaterial, aMaterial, null))
+ .duration(16 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 400))
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 12L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.TungstenSteel, 1L))
+ .itemOutputs(GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(174, 1, aMaterial, aMaterial, null))
+ .duration(32 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 1600))
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 16L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Americium, 1L))
+ .itemOutputs(GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(176, 1, aMaterial, aMaterial, null))
+ .duration(1 * MINUTES + 4 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 6400))
+ .addTo(assemblerRecipes);
+ if (aSpecialRecipeReq2) {
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "fPd", "SPS", " P ", 'P',
+ aMaterial == Materials.Wood ? OrePrefixes.plank.get(aMaterial)
+ : OrePrefixes.plateDouble.get(aMaterial),
+ 'R', OrePrefixes.ring.get(aMaterial), 'S', OrePrefixes.screw.get(aMaterial) });
+ }
+
+ // Turbine blades
+ if (GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 1L) != null
+ && GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, aMaterial, 3L),
+ GT_OreDictUnificator.get(OrePrefixes.screw, aMaterial, 2L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.turbineBlade, aMaterial, 1L))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 60))
+ .addTo(formingPressRecipes);
+ }
+ }
+ }
+ default -> {}
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolOther.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolOther.java
new file mode 100644
index 0000000000..a0e282dc1b
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingToolOther.java
@@ -0,0 +1,137 @@
+package gregtech.loaders.oreprocessing;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+
+public class ProcessingToolOther implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingToolOther() {
+ OrePrefixes.toolHeadHammer.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if ((aMaterial == Materials.Stone) || (aMaterial == Materials.Flint)) {
+ return;
+ }
+
+ if (aMaterial != Materials.Rubber) {
+ // Crafting recipes
+ {
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.PLUNGER, 1, aMaterial, aMaterial, null),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "xRR", " SR", "S f", 'S', OrePrefixes.stick.get(aMaterial), 'R',
+ OrePrefixes.plate.get(Materials.AnyRubber) });
+ }
+ }
+
+ if ((!aMaterial.contains(SubTag.WOOD)) && (!aMaterial.contains(SubTag.BOUNCY))
+ && (!aMaterial.contains(SubTag.NO_SMASHING))) {
+ // Crafting recipes
+ {
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.WRENCH, 1, aMaterial, aMaterial, null),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "IhI", "III", " I ", 'I', OrePrefixes.ingot.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.CROWBAR, 1, aMaterial, aMaterial, null),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "hDS", "DSD", "SDf", 'S', OrePrefixes.stick.get(aMaterial), 'D', Dyes.dyeBlue });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SCREWDRIVER,
+ 1,
+ aMaterial,
+ aMaterial.mHandleMaterial,
+ null),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { " fS", " Sh", "W ", 'S', OrePrefixes.stick.get(aMaterial), 'W',
+ OrePrefixes.stick.get(aMaterial.mHandleMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.WIRECUTTER, 1, aMaterial, aMaterial, null),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PfP", "hPd", "STS", 'S', OrePrefixes.stick.get(aMaterial), 'P',
+ OrePrefixes.plate.get(aMaterial), 'T', OrePrefixes.screw.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.SCOOP, 1, aMaterial, aMaterial, null),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SWS", "SSS", "xSh", 'S', OrePrefixes.stick.get(aMaterial), 'W',
+ new ItemStack(Blocks.wool, 1, 32767) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.BRANCHCUTTER, 1, aMaterial, aMaterial, null),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PfP", "PdP", "STS", 'S', OrePrefixes.stick.get(aMaterial), 'P',
+ OrePrefixes.plate.get(aMaterial), 'T', OrePrefixes.screw.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.KNIFE, 1, aMaterial, aMaterial, null),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "fPh", " S ", 'S', OrePrefixes.stick.get(aMaterial), 'P',
+ OrePrefixes.plate.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.BUTCHERYKNIFE, 1, aMaterial, aMaterial, null),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PPf", "PP ", "Sh ", 'S', OrePrefixes.stick.get(aMaterial), 'P',
+ OrePrefixes.plate.get(aMaterial) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SOLDERING_IRON_LV,
+ 1,
+ aMaterial,
+ Materials.Rubber,
+ new long[] { 100000L, 32L, 1L, -1L }),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "LBf", "Sd ", "P ", 'B', OrePrefixes.bolt.get(aMaterial), 'P',
+ OrePrefixes.plate.get(Materials.AnyRubber), 'S', OrePrefixes.stick.get(Materials.Iron), 'L',
+ ItemList.Battery_RE_LV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SOLDERING_IRON_MV,
+ 1,
+ aMaterial,
+ Materials.Rubber,
+ new long[] { 400000L, 128L, 2L, -1L }),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "LBf", "Sd ", "P ", 'B', OrePrefixes.bolt.get(aMaterial), 'P',
+ OrePrefixes.plate.get(Materials.AnyRubber), 'S', OrePrefixes.stick.get(Materials.Steel), 'L',
+ ItemList.Battery_RE_MV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(
+ GT_MetaGenerated_Tool_01.SOLDERING_IRON_HV,
+ 1,
+ aMaterial,
+ Materials.AnySyntheticRubber,
+ new long[] { 1600000L, 512L, 3L, -1L }),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "LBf", "Sd ", "P ", 'B', OrePrefixes.bolt.get(aMaterial), 'P',
+ OrePrefixes.plate.get(Materials.AnySyntheticRubber), 'S',
+ OrePrefixes.stick.get(Materials.StainlessSteel), 'L', ItemList.Battery_RE_HV_Lithium.get(1L) });
+ GT_ModHandler.addCraftingRecipe(
+ (GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(GT_MetaGenerated_Tool_01.POCKET_MULTITOOL, 1, aMaterial, aMaterial, null)),
+ GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "ABC", "DEF", "CFG", 'A', OrePrefixes.stickLong.get(aMaterial), 'B',
+ OrePrefixes.toolHeadSaw.get(aMaterial), 'C', OrePrefixes.ring.get(aMaterial), 'D',
+ OrePrefixes.toolHeadFile.get(aMaterial), 'E', OrePrefixes.plate.get(aMaterial), 'F',
+ OrePrefixes.toolHeadSword.get(aMaterial), 'G', Dyes.dyeBlue });
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingTransforming.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingTransforming.java
new file mode 100644
index 0000000000..4e3febc469
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingTransforming.java
@@ -0,0 +1,176 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
+import static gregtech.api.recipe.RecipeMaps.polarizerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.interfaces.IOreRecipeRegistrator;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingTransforming implements IOreRecipeRegistrator {
+
+ public ProcessingTransforming() {
+ for (OrePrefixes tPrefix : OrePrefixes.values())
+ if (((tPrefix.mMaterialAmount > 0L) && (!tPrefix.mIsContainer) && (!tPrefix.mIsEnchantable))
+ || (tPrefix == OrePrefixes.plank)) tPrefix.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+
+ if (aPrefix == OrePrefixes.plank) {
+ aPrefix = OrePrefixes.plate;
+ }
+
+ switch (aMaterial.mName) {
+ case "Wood" ->
+ // Chemical bath recipes
+ {
+ if (GT_OreDictUnificator.get(aPrefix, Materials.WoodSealed, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.WoodSealed, 1L))
+ .fluidInputs(
+ Materials.SeedOil
+ .getFluid(GT_Utility.translateMaterialToAmount(aPrefix.mMaterialAmount, 120L, true)))
+ .duration(5 * SECONDS)
+ .eut(TierEU.ULV)
+ .addTo(chemicalBathRecipes);
+ }
+
+ }
+ case "Iron" -> {
+ // Chemical bath recipes
+ {
+ if (GT_OreDictUnificator.get(aPrefix, Materials.FierySteel, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.FierySteel, 1L))
+ .fluidInputs(
+ Materials.FierySteel.getFluid(
+ GT_Utility.translateMaterialToAmount(aPrefix.mMaterialAmount, 250L, true)))
+ .duration(5 * SECONDS)
+ .eut(TierEU.ULV)
+ .addTo(chemicalBathRecipes);
+ }
+ }
+
+ // Polarizer recipes
+ {
+ if (GT_OreDictUnificator.get(aPrefix, Materials.IronMagnetic, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.IronMagnetic, 1L))
+ .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GT_Values.M)) * TICKS)
+ .eut((int) TierEU.LV / 2)
+ .addTo(polarizerRecipes);
+ }
+ }
+ }
+ case "WroughtIron" -> {
+ // Chemical bath recipes
+ {
+ if (GT_OreDictUnificator.get(aPrefix, Materials.FierySteel, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.FierySteel, 1L))
+ .fluidInputs(
+ Materials.FierySteel.getFluid(
+ GT_Utility.translateMaterialToAmount(aPrefix.mMaterialAmount, 225L, true)))
+ .duration(5 * SECONDS)
+ .eut(TierEU.ULV)
+ .addTo(chemicalBathRecipes);
+ }
+ }
+
+ // Polarizer recipes
+ {
+ if (GT_OreDictUnificator.get(aPrefix, Materials.IronMagnetic, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.IronMagnetic, 1L))
+ .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GT_Values.M)) * TICKS)
+ .eut((int) TierEU.LV / 2)
+ .addTo(polarizerRecipes);
+ }
+ }
+ }
+ case "Steel" -> {
+ // Chemical Bath recipes
+ {
+ if (GT_OreDictUnificator.get(aPrefix, Materials.FierySteel, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.FierySteel, 1L))
+ .fluidInputs(
+ Materials.FierySteel.getFluid(
+ GT_Utility.translateMaterialToAmount(aPrefix.mMaterialAmount, 200L, true)))
+ .duration(5 * SECONDS)
+ .eut(TierEU.ULV)
+ .addTo(chemicalBathRecipes);
+ }
+ }
+
+ // Polarizer recipes
+ {
+ if (GT_OreDictUnificator.get(aPrefix, Materials.SteelMagnetic, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.SteelMagnetic, 1L))
+ .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GT_Values.M)) * TICKS)
+ .eut((int) TierEU.LV / 2)
+ .addTo(polarizerRecipes);
+ }
+ }
+ }
+ case "Neodymium" ->
+ // Polarizer recipes
+ {
+ if (GT_OreDictUnificator.get(aPrefix, Materials.NeodymiumMagnetic, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.NeodymiumMagnetic, 1L))
+ .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GT_Values.M)) * TICKS)
+ .eut((int) TierEU.HV / 2)
+ .addTo(polarizerRecipes);
+ }
+ }
+ case "Samarium" ->
+ // Polarizer recipes
+ {
+ if (GT_OreDictUnificator.get(aPrefix, Materials.SamariumMagnetic, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.SamariumMagnetic, 1L))
+ .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GT_Values.M)) * TICKS)
+ .eut((int) TierEU.IV / 2)
+ .addTo(polarizerRecipes);
+ }
+ }
+
+ case "TengamPurified" ->
+ // Polarizer recipes
+ {
+ if (GT_OreDictUnificator.get(aPrefix, Materials.TengamAttuned, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .itemOutputs(GT_OreDictUnificator.get(aPrefix, Materials.TengamAttuned, 1L))
+ .duration(((int) Math.max(16L, aPrefix.mMaterialAmount * 128L / GT_Values.M)) * TICKS)
+ .eut((int) TierEU.RECIPE_UHV)
+ .addTo(polarizerRecipes);
+ }
+ }
+
+ default -> { /* NO-OP */ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingWax.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingWax.java
new file mode 100644
index 0000000000..7635546d23
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingWax.java
@@ -0,0 +1,31 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_Utility;
+
+public class ProcessingWax implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ public ProcessingWax() {
+ OrePrefixes.wax.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (aOreDictName.equals("waxMagical")) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack))
+ .metadata(FUEL_VALUE, 6)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingWire.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingWire.java
new file mode 100644
index 0000000000..1f5bd5f1c2
--- /dev/null
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingWire.java
@@ -0,0 +1,506 @@
+package gregtech.loaders.oreprocessing;
+
+import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.RecipeMaps.benderRecipes;
+import static gregtech.api.recipe.RecipeMaps.packagerRecipes;
+import static gregtech.api.recipe.RecipeMaps.unpackagerRecipes;
+import static gregtech.api.recipe.RecipeMaps.wiremillRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_Utility.calculateRecipeEU;
+
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+
+import appeng.api.config.TunnelType;
+import appeng.core.Api;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+
+public class ProcessingWire implements gregtech.api.interfaces.IOreRecipeRegistrator {
+
+ private final Materials[] dielectrics = { Materials.PolyvinylChloride, Materials.Polydimethylsiloxane };
+ private final Materials[] syntheticRubbers = { Materials.StyreneButadieneRubber, Materials.Silicone };
+
+ private static Object tt;
+
+ public ProcessingWire() {
+ OrePrefixes.wireGt01.add(this);
+ OrePrefixes.wireGt02.add(this);
+ OrePrefixes.wireGt04.add(this);
+ OrePrefixes.wireGt08.add(this);
+ OrePrefixes.wireGt12.add(this);
+ OrePrefixes.wireGt16.add(this);
+ }
+
+ @Override
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName,
+ ItemStack aStack) {
+ if (tt == TunnelType.ME) {
+ try {
+ tt = TunnelType.valueOf("GT_POWER");
+ } catch (IllegalArgumentException ignored) {
+ tt = TunnelType.IC2_POWER;
+ }
+ }
+
+ int cableWidth;
+ OrePrefixes correspondingCable;
+
+ switch (aPrefix) {
+ case wireGt01 -> {
+ cableWidth = 1;
+ correspondingCable = OrePrefixes.cableGt01;
+ if (!aMaterial.contains(SubTag.NO_SMASHING)) {
+ // Bender recipes
+ {
+ if (GT_OreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.springSmall, aMaterial, 2L))
+ .duration(5 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(benderRecipes);
+ }
+ }
+
+ // Wiremill Recipes
+ {
+ if (GT_OreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(1, aStack), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireFine, aMaterial, 4L))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(wiremillRecipes);
+ }
+ }
+ }
+
+ // crafting recipe
+ if (aMaterial.mUnificatable && (aMaterial.mMaterialInto == aMaterial)
+ && !aMaterial.contains(SubTag.NO_WORKING)
+ && (aMaterial.getProcessingMaterialTierEU() < TierEU.IV)) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 1L),
+ GT_Proxy.tBits,
+ new Object[] { "Xx", 'X', OrePrefixes.plate.get(aMaterial) });
+
+ }
+
+ // Assembler recipes
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(2, aStack), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt02, aMaterial, 1L))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt04, aMaterial, 1L))
+ .duration(10 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(8, aStack), GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt08, aMaterial, 1L))
+ .duration(15 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(12, aStack), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt12, aMaterial, 1L))
+ .duration(20 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(16, aStack), GT_Utility.getIntegratedCircuit(16))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt16, aMaterial, 1L))
+ .duration(25 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(assemblerRecipes);
+ }
+ }
+ case wireGt02 -> {
+ cableWidth = 2;
+ correspondingCable = OrePrefixes.cableGt02;
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ // Shapeless crafting recipes
+ {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 2L),
+ new Object[] { aOreDictName });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ new Object[] { OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial) });
+ }
+ }
+ }
+ case wireGt04 -> {
+ cableWidth = 4;
+ correspondingCable = OrePrefixes.cableGt04;
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ // Shapeless crafting recipes
+ {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 4L),
+ new Object[] { aOreDictName });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ new Object[] { OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial),
+ OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ new Object[] { OrePrefixes.wireGt02.get(aMaterial), OrePrefixes.wireGt02.get(aMaterial) });
+ }
+ }
+ }
+ case wireGt08 -> {
+ cableWidth = 8;
+ correspondingCable = OrePrefixes.cableGt08;
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ // Shapeless crafting recipes
+ {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 8L),
+ new Object[] { aOreDictName });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ new Object[] { OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial),
+ OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial),
+ OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial),
+ OrePrefixes.wireGt01.get(aMaterial), OrePrefixes.wireGt01.get(aMaterial) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ new Object[] { OrePrefixes.wireGt04.get(aMaterial), OrePrefixes.wireGt04.get(aMaterial) });
+ }
+ }
+ }
+ case wireGt12 -> {
+ cableWidth = 12;
+ correspondingCable = OrePrefixes.cableGt12;
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ // Shapeless crafting recipes
+ {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 12L),
+ new Object[] { aOreDictName });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ new Object[] { OrePrefixes.wireGt08.get(aMaterial), OrePrefixes.wireGt04.get(aMaterial) });
+ }
+ }
+ }
+ case wireGt16 -> {
+ cableWidth = 16;
+ correspondingCable = OrePrefixes.cableGt16;
+ if (aMaterial.getProcessingMaterialTierEU() < TierEU.IV) {
+ // Shapeless crafting recipes
+ {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 16L),
+ new Object[] { aOreDictName });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ new Object[] { OrePrefixes.wireGt08.get(aMaterial), OrePrefixes.wireGt08.get(aMaterial) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_Utility.copyAmount(1, aStack),
+ new Object[] { OrePrefixes.wireGt12.get(aMaterial), OrePrefixes.wireGt04.get(aMaterial) });
+ }
+
+ AE2addNewAttunement(aStack);
+ }
+ }
+ default -> {
+ GT_Log.err.println(
+ "OrePrefix " + aPrefix.name() + " cannot be registered as a cable for Material " + aMaterial.mName);
+ return;
+ }
+ }
+
+ int costMultiplier = cableWidth / 4 + 1;
+
+ switch (aMaterial.mName) {
+ case "RedAlloy", "Cobalt", "Lead", "Tin", "Zinc", "SolderingAlloy" -> {
+ ArrayList<Object> craftingListRubber = new ArrayList<>();
+ craftingListRubber.add(aOreDictName);
+ for (int i = 0; i < costMultiplier; i++) {
+ craftingListRubber.add(OrePrefixes.plate.get(Materials.Rubber));
+ }
+
+ // shapeless crafting
+ if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L),
+ craftingListRubber.toArray());
+ }
+
+ // Packer recipe
+ if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(1, aStack),
+ GT_OreDictUnificator.get(OrePrefixes.plate.get(Materials.Rubber), costMultiplier))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(packagerRecipes);
+ }
+ // alloy smelter recipes
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, aMaterial, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cableGt01, aMaterial, 1L))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(alloySmelterRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, aMaterial, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cableGt02, aMaterial, 1L))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(alloySmelterRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, aMaterial, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cableGt04, aMaterial, 1L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(alloySmelterRecipes);
+ }
+ // Assembler recipes
+ {
+ if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .fluidInputs(Materials.Rubber.getMolten(144L * costMultiplier))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .fluidInputs(Materials.StyreneButadieneRubber.getMolten(108L * costMultiplier))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .fluidInputs(Materials.Silicone.getMolten(72L * costMultiplier))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ for (Materials dielectric : dielectrics) {
+ for (Materials syntheticRubber : syntheticRubbers) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), dielectric.getDust(costMultiplier))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 4L))
+ .fluidInputs(syntheticRubber.getMolten(costMultiplier * 144L))
+ .duration(20 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, dielectric.getDustSmall(costMultiplier))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .fluidInputs(syntheticRubber.getMolten(costMultiplier * 36L))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+ }
+ }
+ }
+ }
+ }
+ case "Iron", "Nickel", "Cupronickel", "Copper", "AnnealedCopper", "Kanthal", "Gold", "Electrum", "Silver", "Nichrome", "Steel", "BlackSteel", "Titanium", "Aluminium", "BlueAlloy", "NetherStar", "RedstoneAlloy" -> {
+
+ if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) == null) {
+ break;
+ }
+ // Assembler recipes
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .fluidInputs(Materials.Rubber.getMolten(144 * costMultiplier))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .fluidInputs(Materials.StyreneButadieneRubber.getMolten(108 * costMultiplier))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .fluidInputs(Materials.Silicone.getMolten(72 * costMultiplier))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ for (Materials dielectric : dielectrics) {
+ for (Materials syntheticRubber : syntheticRubbers) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(4, aStack), dielectric.getDust(costMultiplier))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 4L))
+ .fluidInputs(syntheticRubber.getMolten(costMultiplier * 144L))
+ .duration(20 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aStack, dielectric.getDustSmall(costMultiplier))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .fluidInputs(syntheticRubber.getMolten(costMultiplier * 36L))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+ }
+ }
+ }
+
+ default -> {
+ if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) == null) {
+ break;
+ }
+
+ // Assembler recipes
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aStack,
+ GT_OreDictUnificator.get(OrePrefixes.foil, aMaterial, costMultiplier),
+ GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .fluidInputs(Materials.Silicone.getMolten(costMultiplier * 72))
+ .duration(5 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aStack,
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.PolyphenyleneSulfide, costMultiplier),
+ GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .fluidInputs(Materials.Silicone.getMolten(costMultiplier * 72))
+ .duration(5 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(assemblerRecipes);
+
+ for (Materials dielectric : dielectrics) {
+ for (Materials syntheticRubber : syntheticRubbers) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(4, aStack),
+ dielectric.getDust(costMultiplier),
+ GT_OreDictUnificator.get(OrePrefixes.foil, aMaterial, costMultiplier * 4L))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 4L))
+ .fluidInputs(syntheticRubber.getMolten(costMultiplier * 144L))
+ .duration(20 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(4, aStack),
+ dielectric.getDust(costMultiplier),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.PolyphenyleneSulfide, costMultiplier * 4L))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 4L))
+ .fluidInputs(syntheticRubber.getMolten(costMultiplier * 144L))
+ .duration(20 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aStack,
+ dielectric.getDustSmall(costMultiplier),
+ GT_OreDictUnificator.get(OrePrefixes.foil, aMaterial, costMultiplier))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .fluidInputs(syntheticRubber.getMolten(costMultiplier * 36L))
+ .duration(5 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ aStack,
+ dielectric.getDustSmall(costMultiplier),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.PolyphenyleneSulfide, costMultiplier))
+ .itemOutputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .fluidInputs(syntheticRubber.getMolten(costMultiplier * 36L))
+ .duration(5 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(assemblerRecipes);
+ }
+ }
+ }
+ }
+
+ if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L))
+ .itemOutputs(GT_Utility.copyAmount(1, aStack))
+ .duration(5 * SECONDS)
+ .eut(calculateRecipeEU(aMaterial, 8))
+ .addTo(unpackagerRecipes);
+ }
+
+ if (GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L) != null) {
+ AE2AddNetAttunementCable(aStack, correspondingCable, aMaterial);
+ }
+ }
+
+ // region AE2 compat
+ static {
+ setAE2Field();
+ }
+
+ private static void setAE2Field() {
+ tt = TunnelType.ME;
+ }
+
+ private void AE2addNewAttunement(ItemStack aStack) {
+ Api.INSTANCE.registries()
+ .p2pTunnel()
+ .addNewAttunement(aStack, (TunnelType) tt);
+ }
+
+ private void AE2AddNetAttunementCable(ItemStack aStack, OrePrefixes correspondingCable, Materials aMaterial) {
+ Api.INSTANCE.registries()
+ .p2pTunnel()
+ .addNewAttunement(aStack, (TunnelType) tt);
+ Api.INSTANCE.registries()
+ .p2pTunnel()
+ .addNewAttunement(GT_OreDictUnificator.get(correspondingCable, aMaterial, 1L), (TunnelType) tt);
+ }
+ // end region
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_BlockResistanceLoader.java b/src/main/java/gregtech/loaders/postload/GT_BlockResistanceLoader.java
new file mode 100644
index 0000000000..204d8f53a0
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_BlockResistanceLoader.java
@@ -0,0 +1,52 @@
+package gregtech.loaders.postload;
+
+import java.util.Set;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemAxe;
+import net.minecraft.item.ItemPickaxe;
+
+import gregtech.GT_Mod;
+import gregtech.api.util.GT_Utility;
+
+public class GT_BlockResistanceLoader implements Runnable {
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void run() {
+ if (GT_Mod.gregtechproxy.mHardRock) {
+ Blocks.stone.setHardness(16.0F);
+ Blocks.brick_block.setHardness(32.0F);
+ Blocks.hardened_clay.setHardness(32.0F);
+ Blocks.stained_hardened_clay.setHardness(32.0F);
+ Blocks.cobblestone.setHardness(12.0F);
+ Blocks.stonebrick.setHardness(24.0F);
+ }
+ Blocks.stone.setResistance(10.0F);
+ Blocks.cobblestone.setResistance(10.0F);
+ Blocks.stonebrick.setResistance(10.0F);
+ Blocks.brick_block.setResistance(20.0F);
+ Blocks.hardened_clay.setResistance(15.0F);
+ Blocks.stained_hardened_clay.setResistance(15.0F);
+
+ Blocks.bed.setHarvestLevel("axe", 0);
+ Blocks.hay_block.setHarvestLevel("axe", 0);
+ Blocks.tnt.setHarvestLevel("pickaxe", 0);
+ Blocks.sponge.setHarvestLevel("axe", 0);
+ Blocks.monster_egg.setHarvestLevel("pickaxe", 0);
+
+ GT_Utility.callMethod(Material.tnt, "func_85158_p", true, false, false);
+ GT_Utility.callMethod(Material.tnt, "setAdventureModeExempt", true, false, false);
+
+ Set<Block> tSet = (Set<Block>) GT_Utility.getFieldContent(ItemAxe.class, "field_150917_c", true, true);
+ tSet.add(Blocks.bed);
+ tSet.add(Blocks.hay_block);
+ tSet.add(Blocks.sponge);
+
+ tSet = (Set<Block>) GT_Utility.getFieldContent(ItemPickaxe.class, "field_150915_c", true, true);
+ tSet.add(Blocks.monster_egg);
+ tSet.add(Blocks.tnt);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_BookAndLootLoader.java b/src/main/java/gregtech/loaders/postload/GT_BookAndLootLoader.java
new file mode 100644
index 0000000000..71c8d67741
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_BookAndLootLoader.java
@@ -0,0 +1,433 @@
+package gregtech.loaders.postload;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.WeightedRandomChestContent;
+import net.minecraftforge.common.ChestGenHooks;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class GT_BookAndLootLoader implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Adding worldgenerated Chest Content.");
+ if (GT_Mod.gregtechproxy.mIncreaseDungeonLoot) {
+ ChestGenHooks tChest = ChestGenHooks.getInfo("bonusChest");
+ tChest.setMax(tChest.getMax() + 8);
+ tChest.setMin(tChest.getMin() + 4);
+ tChest = ChestGenHooks.getInfo("dungeonChest");
+ tChest.setMax(tChest.getMax() + 6);
+ tChest.setMin(tChest.getMin() + 3);
+ tChest = ChestGenHooks.getInfo("pyramidDesertyChest");
+ tChest.setMax(tChest.getMax() + 8);
+ tChest.setMin(tChest.getMin() + 4);
+ tChest = ChestGenHooks.getInfo("pyramidJungleChest");
+ tChest.setMax(tChest.getMax() + 16);
+ tChest.setMin(tChest.getMin() + 8);
+ tChest = ChestGenHooks.getInfo("pyramidJungleDispenser");
+ tChest.setMax(tChest.getMax() + 2);
+ tChest.setMin(tChest.getMin() + 1);
+ tChest = ChestGenHooks.getInfo("mineshaftCorridor");
+ tChest.setMax(tChest.getMax() + 4);
+ tChest.setMin(tChest.getMin() + 2);
+ tChest = ChestGenHooks.getInfo("villageBlacksmith");
+ tChest.setMax(tChest.getMax() + 12);
+ tChest.setMin(tChest.getMin() + 6);
+ tChest = ChestGenHooks.getInfo("strongholdCrossing");
+ tChest.setMax(tChest.getMax() + 8);
+ tChest.setMin(tChest.getMin() + 4);
+ tChest = ChestGenHooks.getInfo("strongholdCorridor");
+ tChest.setMax(tChest.getMax() + 6);
+ tChest.setMin(tChest.getMin() + 3);
+ tChest = ChestGenHooks.getInfo("strongholdLibrary");
+ tChest.setMax(tChest.getMax() + 16);
+ tChest.setMin(tChest.getMin() + 8);
+ }
+ ChestGenHooks
+ .addItem("bonusChest", new WeightedRandomChestContent(ItemList.Bottle_Purple_Drink.get(1L), 8, 16, 2));
+
+ ChestGenHooks
+ .addItem("dungeonChest", new WeightedRandomChestContent(ItemList.Bottle_Holy_Water.get(1L), 4, 8, 20));
+ ChestGenHooks
+ .addItem("dungeonChest", new WeightedRandomChestContent(ItemList.Bottle_Purple_Drink.get(1L), 8, 16, 80));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1L),
+ 1,
+ 6,
+ 120));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Lead, 1L), 1, 6, 30));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L), 1, 6, 60));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L),
+ 1,
+ 6,
+ 60));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Manganese, 1L),
+ 1,
+ 6,
+ 60));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.DamascusSteel, 1L),
+ 1,
+ 6,
+ 10));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Emerald, 1L), 1, 6, 20));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L), 1, 6, 20));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L),
+ 1,
+ 6,
+ 20));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L),
+ 1,
+ 6,
+ 20));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), 1, 6, 20));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetRed, 1L),
+ 1,
+ 6,
+ 40));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetYellow, 1L),
+ 1,
+ 6,
+ 40));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Neodymium, 1L),
+ 1,
+ 6,
+ 40));
+ ChestGenHooks.addItem(
+ "dungeonChest",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1L), 1, 3, 40));
+
+ ChestGenHooks.addItem(
+ "pyramidDesertyChest",
+ new WeightedRandomChestContent(ItemList.Bottle_Holy_Water.get(1L), 4, 8, 2));
+ ChestGenHooks.addItem(
+ "pyramidDesertyChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1L),
+ 4,
+ 16,
+ 12));
+ ChestGenHooks.addItem(
+ "pyramidDesertyChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Platinum, 1L),
+ 2,
+ 8,
+ 4));
+ ChestGenHooks.addItem(
+ "pyramidDesertyChest",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L), 2, 8, 2));
+ ChestGenHooks.addItem(
+ "pyramidDesertyChest",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L), 2, 8, 2));
+ ChestGenHooks.addItem(
+ "pyramidDesertyChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L),
+ 2,
+ 8,
+ 2));
+ ChestGenHooks.addItem(
+ "pyramidDesertyChest",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), 2, 8, 2));
+ ChestGenHooks.addItem(
+ "pyramidDesertyChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetRed, 1L),
+ 2,
+ 8,
+ 4));
+ ChestGenHooks.addItem(
+ "pyramidDesertyChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetYellow, 1L),
+ 2,
+ 8,
+ 4));
+
+ ChestGenHooks.addItem(
+ "pyramidJungleChest",
+ new WeightedRandomChestContent(ItemList.Coin_Gold_Ancient.get(1L), 16, 64, 10));
+ ChestGenHooks.addItem(
+ "pyramidJungleChest",
+ new WeightedRandomChestContent(ItemList.ZPM.getWithCharge(1L, 2147483647), 1, 1, 1));
+ ChestGenHooks.addItem(
+ "pyramidJungleChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L),
+ 4,
+ 16,
+ 12));
+ ChestGenHooks.addItem(
+ "pyramidJungleChest",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L), 2, 8, 2));
+ ChestGenHooks.addItem(
+ "pyramidJungleChest",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L), 2, 8, 2));
+ ChestGenHooks.addItem(
+ "pyramidJungleChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L),
+ 2,
+ 8,
+ 2));
+ ChestGenHooks.addItem(
+ "pyramidJungleChest",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), 2, 8, 2));
+ ChestGenHooks.addItem(
+ "pyramidJungleChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetRed, 1L),
+ 2,
+ 8,
+ 4));
+ ChestGenHooks.addItem(
+ "pyramidJungleChest",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetYellow, 1L),
+ 2,
+ 8,
+ 4));
+
+ ChestGenHooks.addItem(
+ "pyramidJungleDispenser",
+ new WeightedRandomChestContent(new ItemStack(Items.fire_charge, 1), 2, 8, 30));
+ ChestGenHooks.addItem(
+ "pyramidJungleDispenser",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.arrowGtWood, Materials.DamascusSteel, 1L),
+ 8,
+ 16,
+ 20));
+
+ ChestGenHooks.addItem(
+ "mineshaftCorridor",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1L),
+ 1,
+ 4,
+ 12));
+ ChestGenHooks.addItem(
+ "mineshaftCorridor",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Lead, 1L), 1, 4, 3));
+ ChestGenHooks.addItem(
+ "mineshaftCorridor",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L), 1, 4, 6));
+ ChestGenHooks.addItem(
+ "mineshaftCorridor",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L), 1, 4, 6));
+ ChestGenHooks.addItem(
+ "mineshaftCorridor",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L), 1, 4, 2));
+ ChestGenHooks.addItem(
+ "mineshaftCorridor",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L),
+ 1,
+ 4,
+ 2));
+ ChestGenHooks.addItem(
+ "mineshaftCorridor",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), 1, 4, 2));
+ ChestGenHooks.addItem(
+ "mineshaftCorridor",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetRed, 1L),
+ 1,
+ 4,
+ 4));
+ ChestGenHooks.addItem(
+ "mineshaftCorridor",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GarnetYellow, 1L),
+ 1,
+ 4,
+ 4));
+ ChestGenHooks.addItem(
+ "mineshaftCorridor",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L), 1, 4, 2));
+ ChestGenHooks.addItem(
+ "mineshaftCorridor",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Emerald, 1L), 1, 4, 2));
+ ChestGenHooks.addItem(
+ "mineshaftCorridor",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.DamascusSteel, 1L),
+ 1,
+ 4,
+ 1));
+ ChestGenHooks.addItem(
+ "mineshaftCorridor",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.DamascusSteel, 1L),
+ 1,
+ 4,
+ 1));
+
+ ChestGenHooks
+ .addItem("villageBlacksmith", new WeightedRandomChestContent(ItemList.McGuffium_239.get(1L), 1, 1, 1));
+ ChestGenHooks.addItem(
+ "villageBlacksmith",
+ new WeightedRandomChestContent(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1L), 1, 4, 6));
+ ChestGenHooks.addItem(
+ "villageBlacksmith",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Neodymium, 1L),
+ 2,
+ 8,
+ 6));
+ ChestGenHooks.addItem(
+ "villageBlacksmith",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Manganese, 1L),
+ 2,
+ 8,
+ 12));
+ ChestGenHooks.addItem(
+ "villageBlacksmith",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L),
+ 4,
+ 12,
+ 12));
+ ChestGenHooks.addItem(
+ "villageBlacksmith",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L),
+ 4,
+ 12,
+ 12));
+ ChestGenHooks.addItem(
+ "villageBlacksmith",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Brass, 1L),
+ 4,
+ 12,
+ 12));
+ ChestGenHooks.addItem(
+ "villageBlacksmith",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.DamascusSteel, 1L),
+ 4,
+ 12,
+ 1));
+
+ ChestGenHooks
+ .addItem("strongholdCrossing", new WeightedRandomChestContent(ItemList.Bottle_Holy_Water.get(1L), 4, 8, 6));
+ ChestGenHooks
+ .addItem("strongholdCrossing", new WeightedRandomChestContent(ItemList.McGuffium_239.get(1L), 1, 1, 10));
+
+ ChestGenHooks.addItem(
+ "strongholdCrossing",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.crateGtIngot, Materials.DamascusSteel, 1L),
+ 4,
+ 8,
+ 6));
+ ChestGenHooks.addItem(
+ "strongholdCrossing",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.crateGtIngot, Materials.Steel, 1L),
+ 8,
+ 16,
+ 12));
+ ChestGenHooks.addItem(
+ "strongholdCrossing",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.crateGtIngot, Materials.Bronze, 1L),
+ 8,
+ 16,
+ 12));
+ ChestGenHooks.addItem(
+ "strongholdCrossing",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.crateGtIngot, Materials.Manganese, 1L),
+ 4,
+ 8,
+ 12));
+ ChestGenHooks.addItem(
+ "strongholdCrossing",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.crateGtDust, Materials.Neodymium, 1L),
+ 4,
+ 8,
+ 6));
+ ChestGenHooks.addItem(
+ "strongholdCrossing",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.crateGtDust, Materials.Chrome, 1L),
+ 2,
+ 4,
+ 6));
+
+ ChestGenHooks.addItem(
+ "strongholdCorridor",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.DamascusSteel, 1L),
+ 1,
+ 4,
+ 6));
+ ChestGenHooks.addItem(
+ "strongholdCorridor",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.DamascusSteel, 1L),
+ 1,
+ 4,
+ 6));
+ ChestGenHooks.addItem(
+ "strongholdCorridor",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.arrowGtWood, Materials.DamascusSteel, 1L),
+ 16,
+ 48,
+ 6));
+ ChestGenHooks.addItem(
+ "strongholdCorridor",
+ new WeightedRandomChestContent(
+ GT_OreDictUnificator.get(OrePrefixes.arrowGtWood, Materials.SterlingSilver, 1L),
+ 8,
+ 24,
+ 6));
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java
new file mode 100644
index 0000000000..da749e5b31
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java
@@ -0,0 +1,2053 @@
+package gregtech.loaders.postload;
+
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GraviSuite;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.enums.Mods.NotEnoughItems;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OreDictNames;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import ic2.core.Ic2Items;
+
+public class GT_CraftingRecipeLoader implements Runnable {
+
+ private static final String aTextIron1 = "X X";
+ private static final String aTextIron2 = "XXX";
+ private static final long bits_no_remove_buffered = GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.BUFFERED;
+ private static final long bits = GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.BUFFERED;
+ private static final String aTextPlateWrench = "PwP";
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Adding nerfed Vanilla Recipes.");
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.bucket, 1),
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+ new Object[] { "XhX", " X ", 'X', OrePrefixes.plate.get(Materials.AnyIron) });
+ ItemStack tMat = new ItemStack(Items.iron_ingot);
+ {
+ ItemStack tStack;
+ if (null != (tStack = GT_ModHandler.removeRecipe(tMat, tMat, null, null, null, null, null, null, null))) {
+ GT_ModHandler.addCraftingRecipe(
+ tStack,
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+ new Object[] { "ShS", "XZX", "SdS", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'Z', OrePrefixes.spring.get(Materials.Steel) });
+ }
+ }
+ {
+ ItemStack tStack;
+ if (null != (tStack = GT_ModHandler.removeRecipe(tMat, tMat, null, tMat, tMat, null, tMat, tMat, null))) {
+ GT_ModHandler.addCraftingRecipe(
+ tStack,
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+ new Object[] { "XX ", "XXh", "XX ", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'S',
+ OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron) });
+ }
+ }
+ {
+ ItemStack tStack;
+ if (null != (tStack = GT_ModHandler.removeRecipe(tMat, null, tMat, tMat, null, tMat, tMat, tMat, tMat))) {
+ GT_ModHandler.addCraftingRecipe(
+ tStack,
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+ new Object[] { aTextIron1, "XhX", aTextIron2, 'X', OrePrefixes.plate.get(Materials.AnyIron), 'S',
+ OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron) });
+ }
+ }
+ {
+ ItemStack tStack;
+ if (null != (tStack = GT_ModHandler
+ .removeRecipe(tMat, null, tMat, tMat, new ItemStack(Blocks.chest, 1, 0), tMat, null, tMat, null))) {
+ GT_ModHandler.addCraftingRecipe(
+ tStack,
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+ new Object[] { "XwX", "XCX", " X ", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'S',
+ OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron), 'C',
+ "craftingChest" });
+ }
+ }
+ {
+ ItemStack tStack;
+ if (null != (tStack = GT_ModHandler.removeRecipe(tMat, tMat, tMat, tMat, tMat, tMat, null, null, null))) {
+ tStack.stackSize /= 2;
+ GT_ModHandler.addCraftingRecipe(
+ tStack,
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+ new Object[] { " w ", aTextIron2, aTextIron2, 'X', OrePrefixes.stick.get(Materials.AnyIron), 'S',
+ OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron) });
+ }
+ }
+
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("ironFence", 6L),
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { aTextIron2, aTextIron2, " w ", 'X', OrePrefixes.stick.get(Materials.AnyIron), 'S',
+ OrePrefixes.stick.get(Materials.Wood), 'I', OrePrefixes.ingot.get(Materials.AnyIron) });
+
+ tMat = new ItemStack(Items.gold_ingot);
+ {
+ ItemStack tStack;
+ if (null != (tStack = GT_ModHandler.removeRecipe(tMat, tMat, null, null, null, null, null, null, null))) {
+ GT_ModHandler.addCraftingRecipe(
+ tStack,
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+ new Object[] { "ShS", "XZX", "SdS", 'X', OrePrefixes.plate.get(Materials.Gold), 'S',
+ OrePrefixes.screw.get(Materials.Steel), 'Z', OrePrefixes.spring.get(Materials.Steel) });
+ }
+ }
+ tMat = GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 1L);
+ {
+ ItemStack tStack;
+ if (null != (tStack = GT_ModHandler.removeRecipe(tMat, tMat, tMat, tMat, tMat, tMat, null, null, null))) {
+ GT_ModHandler.addCraftingRecipe(
+ tStack,
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_RECIPES,
+ new Object[] { aTextIron2, aTextIron2, 'X', OrePrefixes.plate.get(Materials.Rubber) });
+ }
+ }
+ GT_ModHandler.removeRecipeByOutputDelayed(ItemList.Bottle_Empty.get(1L));
+ GT_ModHandler.removeRecipeByOutputDelayed(ItemList.IC2_Spray_WeedEx.get(1L));
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("reBattery", 1L));
+ GT_ModHandler.removeRecipeByOutputDelayed(new ItemStack(Blocks.tnt));
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("dynamite", 1L));
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("industrialTnt", 1L));
+
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 0));
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 1));
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 2));
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 3));
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 4));
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 5));
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "stamps", 1L, 6));
+
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "engine", 1L, 0));
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "engine", 1L, 1));
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "engine", 1L, 2));
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getModItem(Forestry.ID, "engine", 1L, 4));
+
+ ItemStack tStack = GT_ModHandler
+ .removeRecipe(new ItemStack(Blocks.planks, 1, 0), null, null, new ItemStack(Blocks.planks, 1, 0));
+ if (tStack != null) {
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize : tStack.stackSize * 5 / 4,
+ tStack),
+ bits_no_remove_buffered,
+ new Object[] { "s", "P", "P", 'P', OrePrefixes.plank.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_Utility.copyAmount(
+ GT_Mod.gregtechproxy.mNerfedWoodPlank ? tStack.stackSize / 2 : tStack.stackSize,
+ tStack),
+ bits_no_remove_buffered,
+ new Object[] { "P", "P", 'P', OrePrefixes.plank.get(Materials.Wood) });
+ }
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.stone_button, 2, 0),
+ bits_no_remove_buffered,
+ new Object[] { "S", "S", 'S', OrePrefixes.stone });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.stone_button, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.stone });
+
+ GT_Log.out.println("GT_Mod: Adding Vanilla Convenience Recipes.");
+
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.stonebrick, 1, 3),
+ bits_no_remove_buffered,
+ new Object[] { "f", "X", 'X', new ItemStack(Blocks.double_stone_slab, 1, 8) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.gravel, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { "h", "X", 'X', new ItemStack(Blocks.cobblestone, 1, 0) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.sand, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { "h", "X", 'X', new ItemStack(Blocks.gravel, 1, 0) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.cobblestone, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { "h", "X", 'X', new ItemStack(Blocks.stone, 1, 0) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.stonebrick, 1, 2),
+ bits_no_remove_buffered,
+ new Object[] { "h", "X", 'X', new ItemStack(Blocks.stonebrick, 1, 0) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.double_stone_slab, 1, 8),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.double_stone_slab, 1, 0) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.double_stone_slab, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.double_stone_slab, 1, 8) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.double_stone_slab, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 0) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.cobblestone, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 3) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.brick_block, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 4) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.stonebrick, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 5) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.nether_brick, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 6) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.quartz_block, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 7) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.double_stone_slab, 1, 8),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.stone_slab, 1, 8) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.planks, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 0) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.planks, 1, 1),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.planks, 1, 2),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 2) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.planks, 1, 3),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 3) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.planks, 1, 4),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 4) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.planks, 1, 5),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 5) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.planks, 1, 6),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 6) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.planks, 1, 7),
+ bits_no_remove_buffered,
+ new Object[] { "B", "B", 'B', new ItemStack(Blocks.wooden_slab, 1, 7) });
+
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.stick, 2, 0),
+ bits_no_remove_buffered,
+ new Object[] { "s", "X", 'X', new ItemStack(Blocks.deadbush, 1, 32767) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.stick, 2, 0),
+ bits_no_remove_buffered,
+ new Object[] { "s", "X", 'X', new ItemStack(Blocks.tallgrass, 1, 0) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.stick, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { "s", "X", 'X', OrePrefixes.treeSapling });
+
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.comparator, 1, 0),
+ bits_no_remove_buffered,
+ new Object[] { " T ", "TQT", "SSS", 'Q', OreDictNames.craftingQuartz, 'S', OrePrefixes.stoneSmooth, 'T',
+ OreDictNames.craftingRedstoneTorch });
+
+ GT_Log.out.println("GT_Mod: Adding Tool Recipes.");
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.minecart, 1),
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+ new Object[] { " h ", "PwP", "WPW", 'P', OrePrefixes.plate.get(Materials.AnyIron), 'W',
+ ItemList.Component_Minecart_Wheels_Iron });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.minecart, 1),
+ bits_no_remove_buffered,
+ new Object[] { " h ", "PwP", "WPW", 'P', OrePrefixes.plate.get(Materials.Steel), 'W',
+ ItemList.Component_Minecart_Wheels_Steel });
+
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.chest_minecart, 1),
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+ new Object[] { "X", "C", 'C', new ItemStack(Items.minecart, 1), 'X', OreDictNames.craftingChest });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.furnace_minecart, 1),
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+ new Object[] { "X", "C", 'C', new ItemStack(Items.minecart, 1), 'X', OreDictNames.craftingFurnace });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.hopper_minecart, 1),
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+ new Object[] { "X", "C", 'C', new ItemStack(Items.minecart, 1), 'X',
+ new ItemStack(Blocks.hopper, 1, 32767) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.tnt_minecart, 1),
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+ new Object[] { "X", "C", 'C', new ItemStack(Items.minecart, 1), 'X', new ItemStack(Blocks.tnt, 1, 32767) });
+
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.chainmail_helmet, 1),
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+ new Object[] { "RRR", "RhR", 'R', OrePrefixes.ring.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.chainmail_chestplate, 1),
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+ new Object[] { "RhR", "RRR", "RRR", 'R', OrePrefixes.ring.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.chainmail_leggings, 1),
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+ new Object[] { "RRR", "RhR", "R R", 'R', OrePrefixes.ring.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.chainmail_boots, 1),
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.REVERSIBLE
+ | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+ new Object[] { "R R", "RhR", 'R', OrePrefixes.ring.get(Materials.Steel) });
+
+ GT_Log.out.println("GT_Mod: Adding Wool and Color releated Recipes.");
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 1),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeOrange });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 2),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeMagenta });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 3),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeLightBlue });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 4),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeYellow });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 5),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeLime });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 6),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyePink });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 7),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeGray });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 8),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeLightGray });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 9),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeCyan });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 10),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyePurple });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 11),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeBlue });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 12),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeBrown });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 13),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeGreen });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 14),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeRed });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Blocks.wool, 1, 15),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.wool, 1, 0), Dyes.dyeBlack });
+
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.stained_glass, 8, 0),
+ bits_no_remove_buffered,
+ new Object[] { "GGG", "GDG", "GGG", 'G', new ItemStack(Blocks.glass, 1), 'D', Dyes.dyeWhite });
+
+ GT_Log.out.println("GT_Mod: Putting a Potato on a Stick.");
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Packaged_PotatoChips.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.foil.get(Materials.Aluminium), ItemList.Food_PotatoChips });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Packaged_ChiliChips.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.foil.get(Materials.Aluminium), ItemList.Food_ChiliChips });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Packaged_Fries.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.plateDouble.get(Materials.Paper), ItemList.Food_Fries });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Chum_On_Stick.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.stick.get(Materials.Wood), ItemList.Food_Chum });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Potato_On_Stick.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.stick.get(Materials.Wood), ItemList.Food_Raw_Potato });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Potato_On_Stick_Roasted.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.stick.get(Materials.Wood), ItemList.Food_Baked_Potato });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Dough.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.bucket.get(Materials.Water), OrePrefixes.dust.get(Materials.Wheat) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Dough_Sugar.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "foodDough", OrePrefixes.dust.get(Materials.Sugar) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Dough_Chocolate.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "foodDough", OrePrefixes.dust.get(Materials.Cocoa) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Dough_Chocolate.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "foodDough", OrePrefixes.dust.get(Materials.Chocolate) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Flat_Dough.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "foodDough", ToolDictNames.craftingToolRollingPin });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Raw_Bun.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "foodDough" });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Raw_Bread.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "foodDough", "foodDough" });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Raw_Baguette.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "foodDough", "foodDough", "foodDough" });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Raw_Cake.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Dough_Sugar, ItemList.Food_Dough_Sugar, ItemList.Food_Dough_Sugar,
+ ItemList.Food_Dough_Sugar });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_ChiliChips.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_PotatoChips, OrePrefixes.dust.get(Materials.Chili) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sliced_Buns.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sliced_Breads.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sliced_Baguettes.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sliced_Bun.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Buns });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sliced_Bread.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Breads });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sliced_Baguette.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Baguettes });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Burger_Veggie.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Buns, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato,
+ ItemList.Food_Sliced_Onion });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Burger_Cheese.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Buns, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+ ItemList.Food_Sliced_Cheese });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Burger_Meat.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Buns, OrePrefixes.dust.get(Materials.MeatCooked) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Burger_Chum.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Buns, ItemList.Food_Chum });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Burger_Veggie.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Cucumber,
+ ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Onion });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Burger_Cheese.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Cheese,
+ ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Burger_Meat.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun,
+ OrePrefixes.dust.get(Materials.MeatCooked) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Burger_Chum.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Bun, ItemList.Food_Sliced_Bun, ItemList.Food_Chum });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sandwich_Veggie.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Breads, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Cucumber,
+ ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Onion });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sandwich_Cheese.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Breads, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+ ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sandwich_Bacon.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Breads, new ItemStack(Items.cooked_porkchop, 1) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sandwich_Steak.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Breads, new ItemStack(Items.cooked_beef, 1) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sandwich_Veggie.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Cucumber,
+ ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Tomato,
+ ItemList.Food_Sliced_Onion });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sandwich_Cheese.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Cheese,
+ ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+ ItemList.Food_Sliced_Cheese });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sandwich_Bacon.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread,
+ new ItemStack(Items.cooked_porkchop, 1) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Sandwich_Steak.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Bread, ItemList.Food_Sliced_Bread,
+ new ItemStack(Items.cooked_beef, 1) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Large_Sandwich_Veggie.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Baguettes, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Cucumber,
+ ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Tomato,
+ ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Onion });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Large_Sandwich_Cheese.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Baguettes, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+ ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+ ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Large_Sandwich_Bacon.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Baguettes, new ItemStack(Items.cooked_porkchop, 1),
+ new ItemStack(Items.cooked_porkchop, 1) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Large_Sandwich_Steak.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Baguettes, new ItemStack(Items.cooked_beef, 1),
+ new ItemStack(Items.cooked_beef, 1) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Large_Sandwich_Veggie.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Cucumber,
+ ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato,
+ ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Tomato, ItemList.Food_Sliced_Onion });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Large_Sandwich_Cheese.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Cheese,
+ ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+ ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Large_Sandwich_Bacon.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette,
+ new ItemStack(Items.cooked_porkchop, 1), new ItemStack(Items.cooked_porkchop, 1) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Large_Sandwich_Steak.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Sliced_Baguette, ItemList.Food_Sliced_Baguette,
+ new ItemStack(Items.cooked_beef, 1), new ItemStack(Items.cooked_beef, 1) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Raw_Pizza_Veggie.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Flat_Dough, ItemList.Food_Sliced_Cucumber, ItemList.Food_Sliced_Tomato,
+ ItemList.Food_Sliced_Onion });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Raw_Pizza_Cheese.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Flat_Dough, ItemList.Food_Sliced_Cheese, ItemList.Food_Sliced_Cheese,
+ ItemList.Food_Sliced_Cheese });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ ItemList.Food_Raw_Pizza_Meat.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { ItemList.Food_Flat_Dough, OrePrefixes.dust.get(Materials.MeatCooked) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Food_Sliced_Cheese.get(4L),
+ bits_no_remove_buffered,
+ new Object[] { "kX", 'X', "foodCheese" });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Food_Sliced_Lemon.get(4L),
+ bits_no_remove_buffered,
+ new Object[] { "kX", 'X', "cropLemon" });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Food_Sliced_Tomato.get(4L),
+ bits_no_remove_buffered,
+ new Object[] { "kX", 'X', "cropTomato" });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Food_Sliced_Onion.get(4L),
+ bits_no_remove_buffered,
+ new Object[] { "kX", 'X', "cropOnion" });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Food_Sliced_Cucumber.get(4L),
+ bits_no_remove_buffered,
+ new Object[] { "kX", 'X', "cropCucumber" });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Food_Sliced_Bun.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "kX", 'X', ItemList.Food_Baked_Bun });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Food_Sliced_Bread.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "kX", 'X', ItemList.Food_Baked_Bread });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Food_Sliced_Baguette.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "kX", 'X', ItemList.Food_Baked_Baguette });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Food_Raw_PotatoChips.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "kX", 'X', "cropPotato" });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Food_Raw_Cookie.get(4L),
+ bits_no_remove_buffered,
+ new Object[] { "kX", 'X', ItemList.Food_Dough_Chocolate });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Food_Raw_Fries.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "k", "X", 'X', "cropPotato" });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.bowl, 1),
+ bits_no_remove_buffered,
+ new Object[] { "k", "X", 'X', OrePrefixes.plank.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Rubber, 1L),
+ bits_no_remove_buffered,
+ new Object[] { "k", "X", 'X', OrePrefixes.plate.get(Materials.Rubber) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadArrow, Materials.Flint, 1L),
+ bits_no_remove_buffered,
+ new Object[] { "f", "X", 'X', new ItemStack(Items.flint, 1, 32767) });
+
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.arrow, 1),
+ bits_no_remove_buffered | GT_ModHandler.RecipeBits.DELETE_ALL_OTHER_SHAPED_RECIPES,
+ new Object[] { " H", " S ", "F ", 'H', new ItemStack(Items.flint, 1, 32767), 'S',
+ OrePrefixes.stick.get(Materials.Wood), 'F', OreDictNames.craftingFeather });
+
+ GT_ModHandler.removeRecipe(
+ new ItemStack(Blocks.planks),
+ null,
+ new ItemStack(Blocks.planks),
+ null,
+ new ItemStack(Blocks.planks));
+ GT_ModHandler.removeRecipeByOutputDelayed(ItemList.Food_Baked_Bread.get(1L));
+ GT_ModHandler.removeRecipeByOutputDelayed(new ItemStack(Items.cookie, 1));
+ GT_ModHandler.removeRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L));
+ if (null != GT_Utility.setStack(
+ GT_ModHandler.getRecipeOutput(
+ true,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L),
+ null,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L)),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 1L))) {
+ GT_Log.out.println("GT_Mod: Changed Forestrys Bronze Recipe");
+ }
+ tStack = GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 1L);
+
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getRecipeOutput(
+ null,
+ new ItemStack(Blocks.sand, 1, 0),
+ null,
+ null,
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Apatite, 1L),
+ null,
+ null,
+ new ItemStack(Blocks.sand, 1, 0),
+ null),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "S", "A", "S", 'A', OrePrefixes.dust.get(Materials.Apatite), 'S',
+ new ItemStack(Blocks.sand, 1, 32767) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getRecipeOutput(
+ tStack,
+ tStack,
+ tStack,
+ tStack,
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Apatite, 1L),
+ tStack,
+ tStack,
+ tStack,
+ tStack),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SSS", "SAS", "SSS", 'A', OrePrefixes.dust.get(Materials.Apatite), 'S',
+ OrePrefixes.dust.get(Materials.Ash) });
+
+ GT_Log.out.println("GT_Mod: Adding Mixed Metal Ingot Recipes.");
+ GT_ModHandler.removeRecipeByOutputDelayed(ItemList.IC2_Mixed_Metal_Ingot.get(1L));
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.AnyIron), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(1L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Nickel), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Invar), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(2L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Steel), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(4L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(4L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.StainlessSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(4L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(4L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Titanium), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(4L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(3L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(4L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Tungsten), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(5L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(5L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(6L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Bronze), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(5L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(5L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(6L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Brass), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(8L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(8L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(8L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+ OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(10L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.Tin) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(10L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.Zinc) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(10L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.TungstenSteel), 'Y',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.Aluminium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(12L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
+ OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.AnnealedCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(12L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
+ OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(12L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
+ OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(14L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'Z',
+ OrePrefixes.plate.get(Materials.AnnealedCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(14L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(14L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Iridium), 'Y',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(16L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSG), 'Y',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'Z',
+ OrePrefixes.plate.get(Materials.AnnealedCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(16L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSG), 'Y',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(16L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSG), 'Y',
+ OrePrefixes.plate.get(Materials.StainlessSteel), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(18L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSE), 'Y',
+ OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.AnnealedCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(18L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSE), 'Y',
+ OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(18L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSE), 'Y',
+ OrePrefixes.plate.get(Materials.Chrome), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(20L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSS), 'Y',
+ OrePrefixes.plate.get(Materials.TungstenSteel), 'Z', OrePrefixes.plate.get(Materials.AnnealedCopper) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(20L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSS), 'Y',
+ OrePrefixes.plate.get(Materials.TungstenSteel), 'Z', OrePrefixes.plate.get(Materials.RoseGold) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(20L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.HSSS), 'Y',
+ OrePrefixes.plate.get(Materials.TungstenSteel), 'Z', OrePrefixes.plate.get(Materials.AstralSilver) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Long_Distance_Pipeline_Fluid.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "GPG", "IwI", "GPG", 'G', GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Steel, 1L),
+ 'P', GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L), 'I',
+ GT_OreDictUnificator.get(OrePrefixes.pipeHuge, Materials.Steel, 1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Long_Distance_Pipeline_Item.get(1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "GPG", "IwI", "GPG", 'G', GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Steel, 1L),
+ 'P', GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L), 'I',
+ GT_OreDictUnificator.get(OrePrefixes.pipeHuge, Materials.Tin, 1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Long_Distance_Pipeline_Fluid_Pipe.get(32L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "PPP", "IwI", "PPP", 'P', GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L),
+ 'I', GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Steel, 1L) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Long_Distance_Pipeline_Item_Pipe.get(32L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE,
+ new Object[] { "PPP", "IwI", "PPP", 'P', GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L),
+ 'I', GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Tin, 1L) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(22L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Naquadah), 'Y',
+ OrePrefixes.plate.get(Materials.Iridium), 'Z', OrePrefixes.plate.get(Materials.HSSG) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(24L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Naquadah), 'Y',
+ OrePrefixes.plate.get(Materials.Iridium), 'Z', OrePrefixes.plate.get(Materials.HSSE) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(26L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Naquadah), 'Y',
+ OrePrefixes.plate.get(Materials.Iridium), 'Z', OrePrefixes.plate.get(Materials.HSSS) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(28L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.NaquadahAlloy), 'Y',
+ OrePrefixes.plate.get(Materials.Osmiridium), 'Z', OrePrefixes.plate.get(Materials.HSSE) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(30L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.NaquadahAlloy), 'Y',
+ OrePrefixes.plate.get(Materials.Osmiridium), 'Z', OrePrefixes.plate.get(Materials.HSSG) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(32L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.NaquadahAlloy), 'Y',
+ OrePrefixes.plate.get(Materials.Osmiridium), 'Z', OrePrefixes.plate.get(Materials.HSSS) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(34L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Neutronium), 'Y',
+ OrePrefixes.plate.get(Materials.EnergeticAlloy), 'Z', OrePrefixes.plate.get(Materials.Naquadah) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(36L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Neutronium), 'Y',
+ OrePrefixes.plate.get(Materials.EnergeticAlloy), 'Z', OrePrefixes.plate.get(Materials.NaquadahAlloy) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(38L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.Neutronium), 'Y',
+ OrePrefixes.plate.get(Materials.EnergeticAlloy), 'Z', OrePrefixes.plate.get(Materials.Draconium) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(40L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.BlackPlutonium), 'Y',
+ OrePrefixes.plate.get(Materials.Sunnarium), 'Z', OrePrefixes.plate.get(Materials.Naquadah) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(42L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.BlackPlutonium), 'Y',
+ OrePrefixes.plate.get(Materials.Sunnarium), 'Z', OrePrefixes.plate.get(Materials.NaquadahAlloy) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(44L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.BlackPlutonium), 'Y',
+ OrePrefixes.plate.get(Materials.Sunnarium), 'Z', OrePrefixes.plate.get(Materials.Draconium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(48L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.DraconiumAwakened), 'Y',
+ OrePrefixes.plate.get(Materials.Neutronium), 'Z', OrePrefixes.plate.get(Materials.HSSS) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(52L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.DraconiumAwakened), 'Y',
+ OrePrefixes.plate.get(Materials.Neutronium), 'Z', OrePrefixes.plate.get(Materials.Naquadah) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(56L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.DraconiumAwakened), 'Y',
+ OrePrefixes.plate.get(Materials.Neutronium), 'Z', OrePrefixes.plate.get(Materials.NaquadahAlloy) });
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.IC2_Mixed_Metal_Ingot.get(64L),
+ bits_no_remove_buffered,
+ new Object[] { "X", "Y", "Z", 'X', OrePrefixes.plate.get(Materials.DraconiumAwakened), 'Y',
+ OrePrefixes.plate.get(Materials.Neutronium), 'Z', OrePrefixes.plate.get(Materials.BlackPlutonium) });
+
+ GT_Log.out.println("GT_Mod: Beginning to add regular Crafting Recipes.");
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("scaffold", 4L),
+ bits_no_remove_buffered,
+ new Object[] { "WWW", " S ", "S S", 'W', OrePrefixes.plank.get(Materials.Wood), 'S',
+ OrePrefixes.stick.get(Materials.Wood) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.stick.get(Materials.AnyIron), OrePrefixes.dust.get(Materials.Redstone),
+ OrePrefixes.dust.get(Materials.Redstone), OrePrefixes.dust.get(Materials.Redstone),
+ OrePrefixes.dust.get(Materials.Redstone) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Paper, 1L),
+ bits_no_remove_buffered,
+ new Object[] { "PPk", 'P', OrePrefixes.plate.get(Materials.Paper) });
+
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.torch, 2),
+ bits_no_remove_buffered,
+ new Object[] { "C", "S", 'C', OrePrefixes.dust.get(Materials.Sulfur), 'S',
+ OrePrefixes.stick.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.torch, 6),
+ bits_no_remove_buffered,
+ new Object[] { "C", "S", 'C', OrePrefixes.dust.get(Materials.TricalciumPhosphate), 'S',
+ OrePrefixes.stick.get(Materials.Wood) });
+
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.piston, 1),
+ bits_no_remove_buffered,
+ new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
+ OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
+ OrePrefixes.ingot.get(Materials.AnyIron) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.piston, 1),
+ bits_no_remove_buffered,
+ new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
+ OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
+ OrePrefixes.ingot.get(Materials.AnyBronze) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.piston, 1),
+ bits_no_remove_buffered,
+ new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
+ OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
+ OrePrefixes.ingot.get(Materials.Aluminium) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.piston, 1),
+ bits_no_remove_buffered,
+ new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
+ OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
+ OrePrefixes.ingot.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.piston, 1),
+ bits_no_remove_buffered,
+ new Object[] { "WWW", "CBC", "CRC", 'W', OrePrefixes.plank.get(Materials.Wood), 'C',
+ OrePrefixes.stoneCobble, 'R', OrePrefixes.dust.get(Materials.Redstone), 'B',
+ OrePrefixes.ingot.get(Materials.Titanium) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("reactorVent", 1L, 1),
+ bits_no_remove_buffered,
+ new Object[] { "AIA", "I I", "AIA", 'I', new ItemStack(Blocks.iron_bars, 1), 'A',
+ OrePrefixes.plate.get(Materials.Aluminium) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_ModHandler.getIC2Item("reactorPlatingExplosive", 1L),
+ bits_no_remove_buffered,
+ new Object[] { GT_ModHandler.getIC2Item("reactorPlating", 1L), OrePrefixes.plate.get(Materials.Lead) });
+ if (!Materials.Steel.mBlastFurnaceRequired) {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 1L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Iron), OrePrefixes.dust.get(Materials.Coal),
+ OrePrefixes.dust.get(Materials.Coal) });
+ }
+ if (GT_Mod.gregtechproxy.mNerfDustCrafting) {
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 1L));
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 3L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
+ OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.Zinc) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Brass, 9L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Tetrahedrite),
+ OrePrefixes.dust.get(Materials.Tetrahedrite), OrePrefixes.dust.get(Materials.Tetrahedrite),
+ OrePrefixes.dust.get(Materials.Zinc) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 3L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
+ OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.Tin) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Bronze, 9L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Tetrahedrite),
+ OrePrefixes.dust.get(Materials.Tetrahedrite), OrePrefixes.dust.get(Materials.Tetrahedrite),
+ OrePrefixes.dust.get(Materials.Tin) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Invar, 9L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Iron), OrePrefixes.dust.get(Materials.Iron),
+ OrePrefixes.dust.get(Materials.Nickel) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Cupronickel, 6L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Nickel), OrePrefixes.dust.get(Materials.AnyCopper) });
+ } else {
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 4L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
+ OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.Zinc) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 3L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Tetrahedrite),
+ OrePrefixes.dust.get(Materials.Tetrahedrite), OrePrefixes.dust.get(Materials.Tetrahedrite),
+ OrePrefixes.dust.get(Materials.Zinc) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 4L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
+ OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.Tin) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 3L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Tetrahedrite),
+ OrePrefixes.dust.get(Materials.Tetrahedrite), OrePrefixes.dust.get(Materials.Tetrahedrite),
+ OrePrefixes.dust.get(Materials.Tin) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Invar, 3L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Iron), OrePrefixes.dust.get(Materials.Iron),
+ OrePrefixes.dust.get(Materials.Nickel) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cupronickel, 2L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Nickel), OrePrefixes.dust.get(Materials.AnyCopper) });
+
+ }
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RoseGold, 4L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Gold), OrePrefixes.dust.get(Materials.Gold),
+ OrePrefixes.dust.get(Materials.Gold), OrePrefixes.dust.get(Materials.Gold),
+ OrePrefixes.dust.get(Materials.AnyCopper) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SterlingSilver, 4L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Silver), OrePrefixes.dust.get(Materials.Silver),
+ OrePrefixes.dust.get(Materials.Silver), OrePrefixes.dust.get(Materials.Silver),
+ OrePrefixes.dust.get(Materials.AnyCopper) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackBronze, 4L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Gold), OrePrefixes.dust.get(Materials.Silver),
+ OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
+ OrePrefixes.dust.get(Materials.AnyCopper) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BismuthBronze, 4L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Bismuth), OrePrefixes.dust.get(Materials.Zinc),
+ OrePrefixes.dust.get(Materials.AnyCopper), OrePrefixes.dust.get(Materials.AnyCopper),
+ OrePrefixes.dust.get(Materials.AnyCopper) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CobaltBrass, 8L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Brass), OrePrefixes.dust.get(Materials.Brass),
+ OrePrefixes.dust.get(Materials.Brass), OrePrefixes.dust.get(Materials.Brass),
+ OrePrefixes.dust.get(Materials.Brass), OrePrefixes.dust.get(Materials.Brass),
+ OrePrefixes.dust.get(Materials.Brass), OrePrefixes.dust.get(Materials.Aluminium),
+ OrePrefixes.dust.get(Materials.Cobalt) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DamascusSteel, 2L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Steel), OrePrefixes.dustSmall.get(Materials.Nickel),
+ OrePrefixes.dustSmall.get(Materials.Nickel), OrePrefixes.dustSmall.get(Materials.Nickel),
+ OrePrefixes.dustTiny.get(Materials.Coal), OrePrefixes.dustTiny.get(Materials.Silicon),
+ OrePrefixes.dustTiny.get(Materials.Manganese), OrePrefixes.dustTiny.get(Materials.Chrome),
+ OrePrefixes.dustTiny.get(Materials.Molybdenum) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DamascusSteel, 2L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Steel), OrePrefixes.dustSmall.get(Materials.Manganese),
+ OrePrefixes.dustSmall.get(Materials.Manganese), OrePrefixes.dustSmall.get(Materials.Chrome),
+ OrePrefixes.dustSmall.get(Materials.Chrome), OrePrefixes.dustTiny.get(Materials.Coal),
+ OrePrefixes.dustTiny.get(Materials.Silicon), OrePrefixes.dustTiny.get(Materials.Vanadium) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RedstoneAlloy, 2L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Redstone), OrePrefixes.dust.get(Materials.Silicon),
+ OrePrefixes.dust.get(Materials.Coal) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CrudeSteel, 2L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Clay), OrePrefixes.dust.get(Materials.Flint),
+ OrePrefixes.dust.get(Materials.Stone) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.ConductiveIron, 2L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.RedstoneAlloy), OrePrefixes.dust.get(Materials.Iron),
+ OrePrefixes.dust.get(Materials.Silver) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.EnergeticAlloy, 2L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.ConductiveIron), OrePrefixes.dust.get(Materials.Gold),
+ OrePrefixes.dust.get(Materials.BlackSteel) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.EnergeticSilver, 2L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.ConductiveIron), OrePrefixes.dust.get(Materials.Silver),
+ OrePrefixes.dust.get(Materials.BlackSteel) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.ElectricalSteel, 2L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Steel), OrePrefixes.dust.get(Materials.Coal),
+ OrePrefixes.dust.get(Materials.Silicon) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Soularium, 2L),
+ bits_no_remove_buffered,
+ new Object[] { new ItemStack(Blocks.soul_sand, 1, 32767), OrePrefixes.dust.get(Materials.Gold),
+ OrePrefixes.dust.get(Materials.Ash) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkSteel, 2L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.ElectricalSteel), OrePrefixes.dust.get(Materials.Coal),
+ OrePrefixes.dust.get(Materials.Obsidian) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Manyullyn, 3L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Ardite), OrePrefixes.dust.get(Materials.Ardite),
+ OrePrefixes.dust.get(Materials.Ardite), OrePrefixes.dust.get(Materials.Ardite),
+ OrePrefixes.dust.get(Materials.Cobalt), OrePrefixes.dust.get(Materials.Cobalt),
+ OrePrefixes.dust.get(Materials.Cobalt), OrePrefixes.dust.get(Materials.Cobalt) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Haderoth, 1L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Rubracium), OrePrefixes.dust.get(Materials.Mithril) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Celenegil, 1L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Platinum), OrePrefixes.dust.get(Materials.Orichalcum) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.IronWood, 2L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Iron), OrePrefixes.dust.get(Materials.LiveRoot),
+ OrePrefixes.dustTiny.get(Materials.Gold) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Hepatizon, 3L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Copper), OrePrefixes.dust.get(Materials.Copper),
+ OrePrefixes.dust.get(Materials.Copper), OrePrefixes.dustTiny.get(Materials.Gold),
+ OrePrefixes.dustTiny.get(Materials.Gold), OrePrefixes.dustTiny.get(Materials.Gold),
+ OrePrefixes.dustTiny.get(Materials.Silver), OrePrefixes.dustTiny.get(Materials.Silver),
+ OrePrefixes.dustTiny.get(Materials.Silver) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Angmallen, 2L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Iron), OrePrefixes.dust.get(Materials.Gold) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Inolashite, 1L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Alduorite), OrePrefixes.dust.get(Materials.Ceruclase) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Items.gunpowder, 6),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Coal), OrePrefixes.dust.get(Materials.Coal),
+ OrePrefixes.dust.get(Materials.Coal), OrePrefixes.dust.get(Materials.Sulfur),
+ OrePrefixes.dust.get(Materials.Saltpeter), OrePrefixes.dust.get(Materials.Saltpeter) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Items.gunpowder, 6),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Charcoal), OrePrefixes.dust.get(Materials.Charcoal),
+ OrePrefixes.dust.get(Materials.Charcoal), OrePrefixes.dust.get(Materials.Sulfur),
+ OrePrefixes.dust.get(Materials.Saltpeter), OrePrefixes.dust.get(Materials.Saltpeter) });
+ GT_ModHandler.addShapelessCraftingRecipe(
+ new ItemStack(Items.gunpowder, 6),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Carbon), OrePrefixes.dust.get(Materials.Carbon),
+ OrePrefixes.dust.get(Materials.Carbon), OrePrefixes.dust.get(Materials.Sulfur),
+ OrePrefixes.dust.get(Materials.Saltpeter), OrePrefixes.dust.get(Materials.Saltpeter) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.IndiumGalliumPhosphide, 3L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Indium), OrePrefixes.dust.get(Materials.Gallium),
+ OrePrefixes.dust.get(Materials.Phosphorus) });
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 5L),
+ bits_no_remove_buffered,
+ new Object[] { OrePrefixes.dust.get(Materials.Potassium), OrePrefixes.cell.get(Materials.Nitrogen),
+ OrePrefixes.cell.get(Materials.Oxygen), OrePrefixes.cell.get(Materials.Oxygen),
+ OrePrefixes.cell.get(Materials.Oxygen) });
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("carbonFiber", 1L));
+
+ ItemStack[] tChestAndTank = new ItemStack[] { ItemList.Super_Chest_EV.get(1), ItemList.Super_Chest_IV.get(1),
+ ItemList.Super_Chest_HV.get(1), ItemList.Super_Chest_MV.get(1), ItemList.Super_Chest_LV.get(1),
+ ItemList.Quantum_Chest_EV.get(1), ItemList.Quantum_Chest_IV.get(1), ItemList.Quantum_Chest_HV.get(1),
+ ItemList.Quantum_Chest_MV.get(1), ItemList.Quantum_Chest_LV.get(1), ItemList.Super_Tank_EV.get(1),
+ ItemList.Super_Tank_IV.get(1), ItemList.Super_Tank_HV.get(1), ItemList.Super_Tank_MV.get(1),
+ ItemList.Super_Tank_LV.get(1), ItemList.Quantum_Tank_EV.get(1), ItemList.Quantum_Tank_IV.get(1),
+ ItemList.Quantum_Tank_HV.get(1), ItemList.Quantum_Tank_MV.get(1), ItemList.Quantum_Tank_LV.get(1) };
+ for (ItemStack tItem : tChestAndTank) {
+ GT_ModHandler.addShapelessCraftingRecipe(tItem, new Object[] { tItem });
+ }
+
+ if (GT_Mod.gregtechproxy.mDisableIC2Cables) {
+
+ List<ItemStack> iToRemoveAndHide = Arrays.stream(
+ new String[] { "copperCableItem", "insulatedCopperCableItem", "goldCableItem", "insulatedGoldCableItem",
+ "insulatedIronCableItem", "glassFiberCableItem", "tinCableItem", "ironCableItem",
+ "insulatedTinCableItem", "detectorCableItem", "splitterCableItem", "electrolyzer", "cutter" })
+ .map(x -> GT_ModHandler.getIC2Item(x, 1L))
+ .collect(Collectors.toList());
+
+ if (NotEnoughItems.isModLoaded()) {
+ iToRemoveAndHide.forEach(item -> {
+ codechicken.nei.api.API.hideItem(item);
+ GT_ModHandler.removeRecipeByOutputDelayed(item);
+ });
+ }
+
+ Arrays.stream(
+ new String[] { "batBox", "mfeUnit", "lvTransformer", "mvTransformer", "hvTransformer", "evTransformer",
+ "cesuUnit", "luminator", "teleporter", "energyOMat", "advBattery", "boatElectric", "cropnalyzer",
+ "coil", "powerunit", "powerunitsmall", "remote", "odScanner", "ovScanner", "solarHelmet",
+ "staticBoots", "ecMeter", "obscurator", "overclockerUpgrade", "transformerUpgrade",
+ "energyStorageUpgrade", "ejectorUpgrade", "suBattery", "frequencyTransmitter", "pullingUpgrade" })
+ .map(x -> GT_ModHandler.getIC2Item(x, 1L))
+ .forEach(GT_ModHandler::removeRecipeByOutputDelayed);
+
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("batBox", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "PCP", "BBB", "PPP", 'C', OrePrefixes.cableGt01.get(Materials.Tin), 'P',
+ OrePrefixes.plank.get(Materials.Wood), 'B', OrePrefixes.battery.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("mfeUnit", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "CEC", "EME", "CEC", 'C', OrePrefixes.cableGt01.get(Materials.Gold), 'E',
+ OrePrefixes.battery.get(Materials.Elite), 'M', GT_ModHandler.getIC2Item("machine", 1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("lvTransformer", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "PCP", "POP", "PCP", 'C', OrePrefixes.cableGt01.get(Materials.Tin), 'O',
+ GT_ModHandler.getIC2Item("coil", 1L), 'P', OrePrefixes.plank.get(Materials.Wood) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("mvTransformer", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "CMC", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'M',
+ GT_ModHandler.getIC2Item("machine", 1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("hvTransformer", 1L),
+ bits_no_remove_buffered,
+ new Object[] { " C ", "IMB", " C ", 'C', OrePrefixes.cableGt01.get(Materials.Gold), 'M',
+ GT_ModHandler.getIC2Item("mvTransformer", 1L), 'I', OrePrefixes.circuit.get(Materials.Basic), 'B',
+ OrePrefixes.battery.get(Materials.Advanced) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("evTransformer", 1L),
+ bits_no_remove_buffered,
+ new Object[] { " C ", "IMB", " C ", 'C', OrePrefixes.cableGt01.get(Materials.Aluminium), 'M',
+ GT_ModHandler.getIC2Item("hvTransformer", 1L), 'I', OrePrefixes.circuit.get(Materials.Advanced),
+ 'B', OrePrefixes.battery.get(Materials.Master) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("cesuUnit", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "PCP", "BBB", "PPP", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'P',
+ OrePrefixes.plate.get(Materials.Bronze), 'B', OrePrefixes.battery.get(Materials.Advanced) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("teleporter", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "GFG", "CMC", "GDG", 'C', OrePrefixes.cableGt01.get(Materials.Platinum), 'G',
+ OrePrefixes.circuit.get(Materials.Advanced), 'D', OrePrefixes.gem.get(Materials.Diamond), 'M',
+ GT_ModHandler.getIC2Item("machine", 1L), 'F',
+ GT_ModHandler.getIC2Item("frequencyTransmitter", 1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("energyOMat", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "RBR", "CMC", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'R',
+ OrePrefixes.dust.get(Materials.Redstone), 'B', OrePrefixes.battery.get(Materials.Basic), 'M',
+ GT_ModHandler.getIC2Item("machine", 1L) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("boatElectric", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "CCC", "XWX", aTextIron2, 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'X',
+ OrePrefixes.plate.get(Materials.Iron), 'W', GT_ModHandler.getIC2Item("waterMill", 1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("cropnalyzer", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "CC ", "RGR", "RIR", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'R',
+ OrePrefixes.dust.get(Materials.Redstone), 'G', OrePrefixes.block.get(Materials.Glass), 'I',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("coil", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "CCC", "CXC", "CCC", 'C', OrePrefixes.wireGt01.get(Materials.Copper), 'X',
+ OrePrefixes.ingot.get(Materials.AnyIron) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("powerunit", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "BCA", "BIM", "BCA", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'B',
+ OrePrefixes.battery.get(Materials.Basic), 'A', GT_ModHandler.getIC2Item("casingiron", 1L), 'I',
+ OrePrefixes.circuit.get(Materials.Basic), 'M', GT_ModHandler.getIC2Item("elemotor", 1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("powerunitsmall", 1L),
+ bits_no_remove_buffered,
+ new Object[] { " CA", "BIM", " CA", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'B',
+ OrePrefixes.battery.get(Materials.Basic), 'A', GT_ModHandler.getIC2Item("casingiron", 1L), 'I',
+ OrePrefixes.circuit.get(Materials.Basic), 'M', GT_ModHandler.getIC2Item("elemotor", 1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("remote", 1L),
+ bits_no_remove_buffered,
+ new Object[] { " C ", "TLT", " F ", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'L',
+ OrePrefixes.dust.get(Materials.Lapis), 'T', GT_ModHandler.getIC2Item("casingtin", 1L), 'F',
+ GT_ModHandler.getIC2Item("frequencyTransmitter", 1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("odScanner", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "PGP", "CBC", "WWW", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'G',
+ OrePrefixes.dust.get(Materials.Glowstone), 'B', OrePrefixes.battery.get(Materials.Advanced), 'C',
+ OrePrefixes.circuit.get(Materials.Advanced), 'P', GT_ModHandler.getIC2Item("casinggold", 1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("ovScanner", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "PDP", "GCG", "WSW", 'W', OrePrefixes.cableGt01.get(Materials.Gold), 'G',
+ OrePrefixes.dust.get(Materials.Glowstone), 'D', OrePrefixes.battery.get(Materials.Elite), 'C',
+ OrePrefixes.circuit.get(Materials.Advanced), 'P', GT_ModHandler.getIC2Item("casinggold", 1L), 'S',
+ GT_ModHandler.getIC2Item("odScanner", 1L) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("staticBoots", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "I I", "IWI", "CCC", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'I',
+ OrePrefixes.ingot.get(Materials.Iron), 'W', new ItemStack(Blocks.wool) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("ecMeter", 1L),
+ bits_no_remove_buffered,
+ new Object[] { " G ", "CIC", "C C", 'C', OrePrefixes.cableGt01.get(Materials.Copper), 'G',
+ OrePrefixes.dust.get(Materials.Glowstone), 'I', OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("obscurator", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "RER", "CAC", "RRR", 'C', OrePrefixes.cableGt01.get(Materials.Gold), 'R',
+ OrePrefixes.dust.get(Materials.Redstone), 'E', OrePrefixes.battery.get(Materials.Advanced), 'A',
+ OrePrefixes.circuit.get(Materials.Advanced) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("overclockerUpgrade", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "CCC", "WEW", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'C',
+ GT_ModHandler.getIC2Item("reactorCoolantSimple", 1L, 1), 'E',
+ OrePrefixes.circuit.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("transformerUpgrade", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "GGG", "WTW", "GEG", 'W', OrePrefixes.cableGt01.get(Materials.Gold), 'T',
+ GT_ModHandler.getIC2Item("mvTransformer", 1L), 'E', OrePrefixes.circuit.get(Materials.Basic), 'G',
+ OrePrefixes.block.get(Materials.Glass) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("energyStorageUpgrade", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "PPP", "WBW", "PEP", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'E',
+ OrePrefixes.circuit.get(Materials.Basic), 'P', OrePrefixes.plank.get(Materials.Wood), 'B',
+ OrePrefixes.battery.get(Materials.Basic) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("ejectorUpgrade", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "PHP", "WEW", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'E',
+ OrePrefixes.circuit.get(Materials.Basic), 'P', new ItemStack(Blocks.piston), 'H',
+ new ItemStack(Blocks.hopper) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("suBattery", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "W", "C", "R", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'C',
+ OrePrefixes.dust.get(Materials.HydratedCoal), 'R', OrePrefixes.dust.get(Materials.Redstone) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("pullingUpgrade", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "PHP", "WEW", 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'P',
+ new ItemStack(Blocks.sticky_piston), 'R', new ItemStack(Blocks.hopper), 'E',
+ OrePrefixes.circuit.get(Materials.Basic) });
+
+ } else {
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("glassFiberCableItem", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "GGG", "EDE", "GGG", 'G', new ItemStack(Blocks.glass, 1, 32767), 'D',
+ OrePrefixes.dust.get(Materials.Silver), 'E', ItemList.IC2_Energium_Dust.get(1L) });
+ }
+
+ if (NotEnoughItems.isModLoaded()) {
+ codechicken.nei.api.API.hideItem(GT_ModHandler.getIC2Item("reactorUraniumSimple", 1L, 1));
+ codechicken.nei.api.API.hideItem(GT_ModHandler.getIC2Item("reactorUraniumDual", 1L, 1));
+ codechicken.nei.api.API.hideItem(GT_ModHandler.getIC2Item("reactorUraniumQuad", 1L, 1));
+ codechicken.nei.api.API.hideItem(GT_ModHandler.getIC2Item("reactorMOXSimple", 1L, 1));
+ codechicken.nei.api.API.hideItem(GT_ModHandler.getIC2Item("reactorMOXDual", 1L, 1));
+ codechicken.nei.api.API.hideItem(GT_ModHandler.getIC2Item("reactorMOXQuad", 1L, 1));
+ }
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("UranFuel", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "UUU", "NNN", "UUU", 'U', OrePrefixes.ingot.get(Materials.Uranium), 'N',
+ OrePrefixes.nugget.get(Materials.Uranium235) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("MOXFuel", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "UUU", "NNN", "UUU", 'U', OrePrefixes.ingot.get(Materials.Uranium), 'N',
+ OrePrefixes.ingot.get(Materials.Plutonium) });
+
+ GT_ModHandler.removeRecipeByOutputDelayed(Ic2Items.miningLaser.copy());
+ GT_ModHandler.addCraftingRecipe(
+ Ic2Items.miningLaser.copy(),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PPP", "GEC", "SBd", 'P', OrePrefixes.plate.get(Materials.Titanium), 'G',
+ OrePrefixes.gemExquisite.get(Materials.Diamond), 'E', ItemList.Emitter_HV, 'C',
+ OrePrefixes.circuit.get(Materials.Elite), 'S', OrePrefixes.screw.get(Materials.Titanium), 'B',
+ new ItemStack(
+ Ic2Items.chargingEnergyCrystal.copy()
+ .getItem(),
+ 1,
+ GT_Values.W) });
+ GT_ModHandler.addCraftingRecipe(
+ Ic2Items.miningLaser.copy(),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PPP", "GEC", "SBd", 'P', OrePrefixes.plate.get(Materials.Titanium), 'G',
+ OrePrefixes.gemExquisite.get(Materials.Ruby), 'E', ItemList.Emitter_HV, 'C',
+ OrePrefixes.circuit.get(Materials.Elite), 'S', OrePrefixes.screw.get(Materials.Titanium), 'B',
+ new ItemStack(
+ Ic2Items.chargingEnergyCrystal.copy()
+ .getItem(),
+ 1,
+ GT_Values.W) });
+ GT_ModHandler.addCraftingRecipe(
+ Ic2Items.miningLaser.copy(),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PPP", "GEC", "SBd", 'P', OrePrefixes.plate.get(Materials.Titanium), 'G',
+ OrePrefixes.gemExquisite.get(Materials.Jasper), 'E', ItemList.Emitter_HV, 'C',
+ OrePrefixes.circuit.get(Materials.Elite), 'S', OrePrefixes.screw.get(Materials.Titanium), 'B',
+ new ItemStack(
+ Ic2Items.chargingEnergyCrystal.copy()
+ .getItem(),
+ 1,
+ GT_Values.W) });
+ GT_ModHandler.addCraftingRecipe(
+ Ic2Items.miningLaser.copy(),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "PPP", "GEC", "SBd", 'P', OrePrefixes.plate.get(Materials.Titanium), 'G',
+ OrePrefixes.gemExquisite.get(Materials.GarnetRed), 'E', ItemList.Emitter_HV, 'C',
+ OrePrefixes.circuit.get(Materials.Elite), 'S', OrePrefixes.screw.get(Materials.Titanium), 'B',
+ new ItemStack(
+ Ic2Items.chargingEnergyCrystal.copy()
+ .getItem(),
+ 1,
+ GT_Values.W) });
+
+ GT_ModHandler.removeRecipeDelayed(GT_ModHandler.getIC2Item("miningPipe", 8));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("miningPipe", 1),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "hPf", 'P', OrePrefixes.pipeSmall.get(Materials.Steel) });
+
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("luminator", 16L),
+ bits_no_remove_buffered,
+ new Object[] { "RTR", "GHG", "GGG", 'H', OrePrefixes.cell.get(Materials.Helium), 'T',
+ OrePrefixes.ingot.get(Materials.Tin), 'R', OrePrefixes.ingot.get(Materials.AnyIron), 'G',
+ new ItemStack(Blocks.glass, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("luminator", 16L),
+ bits_no_remove_buffered,
+ new Object[] { "RTR", "GHG", "GGG", 'H', OrePrefixes.cell.get(Materials.Mercury), 'T',
+ OrePrefixes.ingot.get(Materials.Tin), 'R', OrePrefixes.ingot.get(Materials.AnyIron), 'G',
+ new ItemStack(Blocks.glass, 1) });
+
+ GT_ModHandler.removeRecipeDelayed(
+ tStack = GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L),
+ tStack,
+ tStack,
+ tStack,
+ new ItemStack(Items.coal, 1, 0),
+ tStack,
+ tStack,
+ tStack,
+ tStack);
+ GT_ModHandler.removeRecipeDelayed(
+ tStack = GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L),
+ tStack,
+ tStack,
+ tStack,
+ new ItemStack(Items.coal, 1, 1),
+ tStack,
+ tStack,
+ tStack,
+ tStack);
+ GT_ModHandler.removeRecipeDelayed(
+ null,
+ tStack = new ItemStack(Items.coal, 1),
+ null,
+ tStack,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L),
+ tStack,
+ null,
+ tStack,
+ null);
+
+ GT_ModHandler.removeFurnaceSmelting(new ItemStack(Blocks.hopper));
+
+ GT_Log.out.println("GT_Mod: Applying harder Recipes for several Blocks."); // TODO: Not Buffered
+
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("reactorReflectorThick", 1L, 1));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("reactorReflectorThick", 1L, 1),
+ bits_no_remove_buffered,
+ new Object[] { " N ", "NBN", " N ", 'B', OrePrefixes.plateDouble.get(Materials.Beryllium), 'N',
+ GT_ModHandler.getIC2Item("reactorReflector", 1L, 1) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("reactorReflectorThick", 1L, 1),
+ bits_no_remove_buffered,
+ new Object[] { " B ", "NCN", " B ", 'B', OrePrefixes.plate.get(Materials.Beryllium), 'N',
+ GT_ModHandler.getIC2Item("reactorReflector", 1L, 1), 'C',
+ OrePrefixes.plate.get(Materials.TungstenCarbide) });
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("reactorReflector", 1L, 1));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("reactorReflector", 1L, 1),
+ bits_no_remove_buffered,
+ new Object[] { "TGT", "GSG", "TGT", 'T', OrePrefixes.plate.get(Materials.Tin), 'G',
+ OrePrefixes.dust.get(Materials.Graphite), 'S', OrePrefixes.plateDouble.get(Materials.Steel) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("reactorReflector", 1L, 1),
+ bits_no_remove_buffered,
+ new Object[] { "TTT", "GSG", "TTT", 'T', OrePrefixes.plate.get(Materials.TinAlloy), 'G',
+ OrePrefixes.dust.get(Materials.Graphite), 'S', OrePrefixes.plate.get(Materials.Beryllium) });
+
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("crophavester", 1L));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("crophavester", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "ACA", "PMS", "WOW", 'M', ItemList.Hull_MV, 'C', OrePrefixes.circuit.get(Materials.Good),
+ 'A', ItemList.Robot_Arm_LV, 'P', ItemList.Electric_Piston_LV, 'S', ItemList.Sensor_LV, 'W',
+ OrePrefixes.toolHeadSense.get(Materials.Aluminium), 'O', ItemList.Conveyor_Module_LV });
+
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("RTGenerator", 1L));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("RTGenerator", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "III", "IMI", "ICI", 'I', OrePrefixes.itemCasing.get(Materials.Steel), 'C',
+ OrePrefixes.circuit.get(Materials.Master), 'M', ItemList.Hull_IV });
+
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("RTHeatGenerator", 1L));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("RTHeatGenerator", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "III", "IMB", "ICI", 'I', OrePrefixes.itemCasing.get(Materials.Steel), 'C',
+ OrePrefixes.circuit.get(Materials.Master), 'M', ItemList.Hull_IV, 'B',
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Copper, 1) });
+
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("carbonrotor", 1L));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("carbonrotor", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "dBS", "BTB", "SBw", 'B', GT_ModHandler.getIC2Item("carbonrotorblade", 1), 'S',
+ OrePrefixes.screw.get(Materials.Iridium), 'T', GT_ModHandler.getIC2Item("steelshaft", 1) });
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("steelrotor", 1L));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("steelrotor", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "dBS", "BTB", "SBw", 'B', GT_ModHandler.getIC2Item("steelrotorblade", 1), 'S',
+ OrePrefixes.screw.get(Materials.StainlessSteel), 'T', GT_ModHandler.getIC2Item("ironshaft", 1) });
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("ironrotor", 1L));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("ironrotor", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "dBS", "BTB", "SBw", 'B', GT_ModHandler.getIC2Item("ironrotorblade", 1), 'S',
+ OrePrefixes.screw.get(Materials.WroughtIron), 'T', GT_ModHandler.getIC2Item("ironshaft", 1) });
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("woodrotor", 1L));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("woodrotor", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "dBS", "BTB", "SBw", 'B', GT_ModHandler.getIC2Item("woodrotorblade", 1), 'S',
+ OrePrefixes.screw.get(Materials.WroughtIron), 'T', OrePrefixes.stickLong.get(Materials.WroughtIron) });
+
+ if (GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Diamond, 1L) != null) {
+ tStack = GT_ModHandler.getRecipeOutput(
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Iron, 1L),
+ new ItemStack(Items.redstone, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Iron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Gold, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Iron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Gold, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Diamond, 1L),
+ new ItemStack(Items.diamond_pickaxe, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Diamond, 1L));
+ GT_ModHandler.removeRecipeByOutputDelayed(tStack);
+ GT_ModHandler.addCraftingRecipe(
+ tStack,
+ bits_no_remove_buffered,
+ new Object[] { "ICI", "GIG", "DPD", 'C', OrePrefixes.circuit.get(Materials.Advanced), 'D',
+ OrePrefixes.gear.get(Materials.Diamond), 'G', OrePrefixes.gear.get(Materials.Gold), 'I',
+ OrePrefixes.gear.get(Materials.Steel), 'P', GT_ModHandler.getIC2Item("diamondDrill", 1L, 32767) });
+ }
+
+ GT_ModHandler.removeRecipeByOutputDelayed(new ItemStack(Items.paper));
+ GT_ModHandler.removeRecipeByOutputDelayed(new ItemStack(Items.sugar));
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Paper, 2),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "SSS", " m ", 'S', new ItemStack(Items.reeds) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "Sm ", 'S', new ItemStack(Items.reeds) });
+ GT_ModHandler.addCraftingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.paper, Materials.Empty, 2),
+ GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { " C ", "SSS", " C ", 'S', GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Paper, 1),
+ 'C', new ItemStack(Blocks.stone_slab) });
+
+ GT_Log.out.println("GT_Mod: Applying Recipes for Tools");
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("nanoSaber", 1L));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("nanoSaber", 1L),
+ bits_no_remove_buffered,
+ new Object[] { "PI ", "PI ", "CLC", 'L', OrePrefixes.battery.get(Materials.Master), 'I',
+ OrePrefixes.plateAlloy.get("Iridium"), 'P', OrePrefixes.plate.get(Materials.Platinum), 'C',
+ OrePrefixes.circuit.get(Materials.Elite) });
+
+ GT_ModHandler.removeRecipeByOutputDelayed(new ItemStack(Items.flint_and_steel, 1));
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Items.flint_and_steel, 1),
+ bits_no_remove_buffered,
+ new Object[] { "S ", " F", 'F', new ItemStack(Items.flint, 1), 'S', "nuggetSteel" });
+
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("diamondDrill", 1L));
+
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("miningDrill", 1L));
+
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("chainsaw", 1L));
+
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("electricHoe", 1L));
+
+ GT_ModHandler.removeRecipeByOutputDelayed(GT_ModHandler.getIC2Item("electricTreetap", 1L));
+
+ if (GraviSuite.isModLoaded()) {
+ GT_ModHandler.removeRecipeByOutputDelayed(
+ GT_ModHandler.getModItem(GraviSuite.ID, "advNanoChestPlate", 1, GT_Values.W));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getModItem(GraviSuite.ID, "advNanoChestPlate", 1, GT_Values.W),
+ bits_no_remove_buffered,
+ new Object[] { "CJC", "TNT", "WPW", 'C', OrePrefixes.plateAlloy.get(Materials.Advanced), 'T',
+ OrePrefixes.plate.get(Materials.TungstenSteel), 'J',
+ GT_ModHandler.getModItem(GraviSuite.ID, "advJetpack", 1, GT_Values.W), 'N',
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemArmorNanoChestplate", 1, GT_Values.W), 'W',
+ OrePrefixes.wireGt12.get(Materials.Platinum), 'P', OrePrefixes.circuit.get(Materials.Elite) });
+
+ GT_ModHandler
+ .removeRecipeByOutputDelayed(GT_ModHandler.getModItem(GraviSuite.ID, "advLappack", 1, GT_Values.W));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getModItem(GraviSuite.ID, "advLappack", 1, GT_Values.W),
+ bits_no_remove_buffered,
+ new Object[] { "CEC", "EJE", "WPW", 'C', OrePrefixes.plateAlloy.get(Materials.Carbon), 'J',
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemArmorEnergypack", 1L, GT_Values.W), 'E',
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemBatCrystal", 1L, GT_Values.W), 'W',
+ OrePrefixes.wireGt04.get(Materials.Platinum), 'P', OrePrefixes.circuit.get(Materials.Data) });
+
+ GT_ModHandler
+ .removeRecipeByOutputDelayed(GT_ModHandler.getModItem(GraviSuite.ID, "advJetpack", 1, GT_Values.W));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getModItem(GraviSuite.ID, "advJetpack", 1, GT_Values.W),
+ bits_no_remove_buffered,
+ new Object[] { "CJC", "EXE", "YZY", 'C', OrePrefixes.plateAlloy.get(Materials.Carbon), 'J',
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemArmorJetpackElectric", 1, GT_Values.W), 'E',
+ OrePrefixes.plate.get(Materials.Titanium), 'X',
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemArmorAlloyChestplate", 1L), 'Z',
+ OrePrefixes.circuit.get(Materials.Data), 'Y', OrePrefixes.wireGt02.get(Materials.Platinum) });
+ }
+
+ GT_ModHandler.addShapelessCraftingRecipe(
+ Materials.Fireclay.getDust(2),
+ new Object[] { Materials.Brick.getDust(1), Materials.Clay.getDust(1) });
+
+ if (BartWorks.isModLoaded()) {
+ GT_ModHandler.addCraftingRecipe(
+ ItemList.Casing_Advanced_Rhodium_Palladium.get(1L),
+ bits,
+ new Object[] { "PhP", "PFP", aTextPlateWrench, 'P',
+ GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedplate", 1L, 88), 'F',
+ OrePrefixes.frameGt.get(Materials.Chrome) });
+ }
+
+ if (Forestry.isModLoaded()) {
+ ItemStack[] coverIDs = { ItemList.Plank_Larch.get(2L), ItemList.Plank_Teak.get(2L),
+ ItemList.Plank_Acacia_Green.get(2L), ItemList.Plank_Lime.get(2L), ItemList.Plank_Chestnut.get(2L),
+ ItemList.Plank_Wenge.get(2L), ItemList.Plank_Baobab.get(2L), ItemList.Plank_Sequoia.get(2L),
+ ItemList.Plank_Kapok.get(2L), ItemList.Plank_Ebony.get(2L), ItemList.Plank_Mahagony.get(2L),
+ ItemList.Plank_Balsa.get(2L), ItemList.Plank_Willow.get(2L), ItemList.Plank_Walnut.get(2L),
+ ItemList.Plank_Greenheart.get(2L), ItemList.Plank_Cherry.get(2L), ItemList.Plank_Mahoe.get(2L),
+ ItemList.Plank_Poplar.get(2L), ItemList.Plank_Palm.get(2L), ItemList.Plank_Papaya.get(2L),
+ ItemList.Plank_Pine.get(2L), ItemList.Plank_Plum.get(2L), ItemList.Plank_Maple.get(2L),
+ ItemList.Plank_Citrus.get(2L) };
+ for (int i = 0; i < coverIDs.length; i++) {
+ ItemStack slabWood = getModItem(Forestry.ID, "slabs", 1, i);
+ ItemStack slabWoodFireproof = getModItem(Forestry.ID, "slabsFireproof", 1, i);
+
+ GT_ModHandler.addCraftingRecipe(
+ coverIDs[i],
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "s ", " P", 'P', slabWood });
+
+ GT_ModHandler.addCraftingRecipe(
+ coverIDs[i],
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "s ", " P", 'P', slabWoodFireproof });
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_CropLoader.java b/src/main/java/gregtech/loaders/postload/GT_CropLoader.java
new file mode 100644
index 0000000000..e6608a52b6
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_CropLoader.java
@@ -0,0 +1,1055 @@
+package gregtech.loaders.postload;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_BaseCrop;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class GT_CropLoader implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Register Crops to IC2.");
+ try {
+ /*
+ * Tags: Vines = Tendrilly Edible = Food
+ */
+ ItemStack[] tI = { ItemList.Crop_Drop_Indigo.get(4L), ItemList.Crop_Drop_MilkWart.get(4L),
+ new ItemStack(Blocks.brown_mushroom, 4), new ItemStack(Blocks.red_mushroom, 4) };
+ new GT_BaseCrop(
+ 124,
+ "Indigo",
+ "Eloraam",
+ tI[0],
+ 2,
+ 4,
+ 0,
+ 1,
+ 4,
+ 1,
+ 1,
+ 0,
+ 4,
+ 0,
+ new String[] { "Flower", "Blue", "Ingredient" },
+ ItemList.Crop_Drop_Indigo.get(1L),
+ null);
+ new GT_BaseCrop(
+ 125,
+ "Flax",
+ "Eloraam",
+ null,
+ 2,
+ 4,
+ 0,
+ 1,
+ 4,
+ 1,
+ 1,
+ 2,
+ 0,
+ 1,
+ new String[] { "Silk", "Tendrilly", "Addictive" },
+ new ItemStack(Items.string, 1),
+ null);
+ new GT_BaseCrop(
+ 126,
+ "Oilberries",
+ "Spacetoad",
+ null,
+ 9,
+ 4,
+ 0,
+ 1,
+ 4,
+ 6,
+ 1,
+ 2,
+ 1,
+ 12,
+ new String[] { "Fire", "Dark", "Reed", "Rotten", "Coal", "Oil" },
+ ItemList.Crop_Drop_OilBerry.get(1L),
+ null);
+ new GT_BaseCrop(
+ 127,
+ "Bobsyeruncleranks",
+ "GenerikB",
+ null,
+ 11,
+ 4,
+ 0,
+ 1,
+ 4,
+ 4,
+ 0,
+ 8,
+ 2,
+ 9,
+ new String[] { "Shiny", "Tendrilly", "Emerald", "Berylium", "Crystal" },
+ Materials.Emerald,
+ ItemList.Crop_Drop_BobsYerUncleRanks.get(1L),
+ new ItemStack[] { new ItemStack(Items.emerald, 1) });
+ new GT_BaseCrop(
+ 128,
+ "Diareed",
+ "Direwolf20",
+ null,
+ 12,
+ 4,
+ 0,
+ 1,
+ 4,
+ 5,
+ 0,
+ 10,
+ 2,
+ 10,
+ new String[] { "Fire", "Shiny", "Reed", "Coal", "Diamond", "Crystal" },
+ Materials.Diamond,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1L),
+ new ItemStack[] { new ItemStack(Items.diamond, 1) });
+ new GT_BaseCrop(
+ 129,
+ "Withereed",
+ "CovertJaguar",
+ null,
+ 8,
+ 4,
+ 0,
+ 1,
+ 4,
+ 2,
+ 0,
+ 4,
+ 1,
+ 3,
+ new String[] { "Fire", "Undead", "Reed", "Coal", "Rotten", "Wither" },
+ Materials.Coal,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L),
+ new ItemStack[] { new ItemStack(Items.coal, 1), new ItemStack(Items.coal, 1) });
+ new GT_BaseCrop(
+ 130,
+ "Blazereed",
+ "Mr. Brain",
+ null,
+ 6,
+ 4,
+ 0,
+ 1,
+ 4,
+ 0,
+ 4,
+ 1,
+ 0,
+ 0,
+ new String[] { "Fire", "Blaze", "Reed", "Sulfur" },
+ new ItemStack(Items.blaze_powder, 1),
+ new ItemStack[] { new ItemStack(Items.blaze_rod, 1) });
+ new GT_BaseCrop(
+ 131,
+ "Eggplant",
+ "Link",
+ null,
+ 6,
+ 3,
+ 900,
+ 2,
+ 3,
+ 0,
+ 4,
+ 1,
+ 0,
+ 0,
+ new String[] { "Chicken", "Egg", "Food", "Feather", "Flower", "Addictive" },
+ new ItemStack(Items.egg, 1),
+ new ItemStack[] { new ItemStack(Items.chicken, 1), new ItemStack(Items.feather, 1),
+ new ItemStack(Items.feather, 1), new ItemStack(Items.feather, 1) });
+ new GT_BaseCrop(
+ 132,
+ "Corium",
+ "Gregorius Techneticies",
+ null,
+ 6,
+ 4,
+ 0,
+ 1,
+ 4,
+ 0,
+ 2,
+ 3,
+ 1,
+ 0,
+ new String[] { "Cow", "Silk", "Tendrilly" },
+ new ItemStack(Items.leather, 1),
+ null);
+ new GT_BaseCrop(
+ 133,
+ "Corpseplant",
+ "Mr. Kenny",
+ null,
+ 5,
+ 4,
+ 0,
+ 1,
+ 4,
+ 0,
+ 2,
+ 1,
+ 0,
+ 3,
+ new String[] { "Toxic", "Undead", "Tendrilly", "Food", "Rotten" },
+ new ItemStack(Items.rotten_flesh, 1),
+ new ItemStack[] { ItemList.Dye_Bonemeal.get(1L), ItemList.Dye_Bonemeal.get(1L),
+ new ItemStack(Items.bone, 1) });
+ new GT_BaseCrop(
+ 134,
+ "Creeperweed",
+ "General Spaz",
+ null,
+ 7,
+ 4,
+ 0,
+ 1,
+ 4,
+ 3,
+ 0,
+ 5,
+ 1,
+ 3,
+ new String[] { "Creeper", "Tendrilly", "Explosive", "Fire", "Sulfur", "Saltpeter", "Coal" },
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1L),
+ null);
+ new GT_BaseCrop(
+ 135,
+ "Enderbloom",
+ "RichardG",
+ null,
+ 10,
+ 4,
+ 0,
+ 1,
+ 4,
+ 5,
+ 0,
+ 2,
+ 1,
+ 6,
+ new String[] { "Ender", "Flower", "Shiny" },
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.EnderPearl, 1L),
+ new ItemStack[] { new ItemStack(Items.ender_pearl, 1), new ItemStack(Items.ender_pearl, 1),
+ new ItemStack(Items.ender_eye, 1) });
+ new GT_BaseCrop(
+ 136,
+ "Meatrose",
+ "VintageBeef",
+ null,
+ 7,
+ 4,
+ 1500,
+ 1,
+ 4,
+ 0,
+ 4,
+ 1,
+ 3,
+ 0,
+ new String[] { "Food", "Flower", "Cow", "Fish", "Chicken", "Pig" },
+ new ItemStack(Items.dye, 1, 9),
+ new ItemStack[] { new ItemStack(Items.beef, 1), new ItemStack(Items.porkchop, 1),
+ new ItemStack(Items.chicken, 1), new ItemStack(Items.fish, 1) });
+ new GT_BaseCrop(
+ 137,
+ "Milkwart",
+ "Mr. Brain",
+ tI[1],
+ 6,
+ 3,
+ 900,
+ 1,
+ 3,
+ 0,
+ 3,
+ 0,
+ 1,
+ 0,
+ new String[] { "Food", "Milk", "Cow" },
+ ItemList.Crop_Drop_MilkWart.get(1L),
+ null);
+ new GT_BaseCrop(
+ 138,
+ "Slimeplant",
+ "Neowulf",
+ null,
+ 6,
+ 4,
+ 0,
+ 3,
+ 4,
+ 3,
+ 0,
+ 0,
+ 0,
+ 2,
+ new String[] { "Slime", "Bouncy", "Sticky", "Bush" },
+ new ItemStack(Items.slime_ball, 1),
+ null);
+ new GT_BaseCrop(
+ 139,
+ "Spidernip",
+ "Mr. Kenny",
+ null,
+ 4,
+ 4,
+ 600,
+ 1,
+ 4,
+ 2,
+ 1,
+ 4,
+ 1,
+ 3,
+ new String[] { "Toxic", "Silk", "Spider", "Flower", "Ingredient", "Addictive" },
+ new ItemStack(Items.string, 1),
+ new ItemStack[] { new ItemStack(Items.spider_eye, 1), new ItemStack(Blocks.web, 1) });
+ new GT_BaseCrop(
+ 140,
+ "Tearstalks",
+ "Neowulf",
+ null,
+ 8,
+ 4,
+ 0,
+ 1,
+ 4,
+ 1,
+ 2,
+ 0,
+ 0,
+ 0,
+ new String[] { "Healing", "Nether", "Ingredient", "Reed", "Ghast" },
+ new ItemStack(Items.ghast_tear, 1),
+ null);
+ new GT_BaseCrop(
+ 141,
+ "Tine",
+ "Gregorius Techneticies",
+ null,
+ 5,
+ 3,
+ 0,
+ 2,
+ 3,
+ 2,
+ 0,
+ 3,
+ 0,
+ 0,
+ new String[] { "Shiny", "Metal", "Pine", "Tin", "Bush" },
+ Materials.Tin,
+ ItemList.Crop_Drop_Tine.get(1L),
+ null);
+ new GT_BaseCrop(
+ 142,
+ "Coppon",
+ "Mr. Brain",
+ null,
+ 6,
+ 3,
+ 0,
+ 2,
+ 3,
+ 2,
+ 0,
+ 1,
+ 1,
+ 1,
+ new String[] { "Shiny", "Metal", "Cotton", "Copper", "Bush" },
+ Materials.Copper,
+ ItemList.Crop_Drop_Coppon.get(1L),
+ null);
+ new GT_BaseCrop(
+ 143,
+ "Brown Mushrooms",
+ "Mr. Brain",
+ tI[2],
+ 1,
+ 3,
+ 0,
+ 1,
+ 3,
+ 0,
+ 2,
+ 0,
+ 0,
+ 2,
+ new String[] { "Food", "Mushroom", "Ingredient" },
+ new ItemStack(Blocks.brown_mushroom, 1),
+ null);
+ new GT_BaseCrop(
+ 144,
+ "Red Mushrooms",
+ "Mr. Kenny",
+ tI[3],
+ 1,
+ 3,
+ 0,
+ 1,
+ 3,
+ 0,
+ 1,
+ 3,
+ 0,
+ 2,
+ new String[] { "Toxic", "Mushroom", "Ingredient" },
+ new ItemStack(Blocks.red_mushroom, 1),
+ null);
+ new GT_BaseCrop(
+ 145,
+ "Argentia",
+ "Eloraam",
+ null,
+ 7,
+ 4,
+ 0,
+ 3,
+ 4,
+ 2,
+ 0,
+ 1,
+ 0,
+ 0,
+ new String[] { "Shiny", "Metal", "Silver", "Reed" },
+ Materials.Silver,
+ ItemList.Crop_Drop_Argentia.get(1L),
+ null);
+ new GT_BaseCrop(
+ 146,
+ "Plumbilia",
+ "KingLemming",
+ null,
+ 6,
+ 4,
+ 0,
+ 3,
+ 4,
+ 2,
+ 0,
+ 3,
+ 1,
+ 1,
+ new String[] { "Heavy", "Metal", "Lead", "Reed" },
+ Materials.Lead,
+ ItemList.Crop_Drop_Plumbilia.get(1L),
+ null);
+ new GT_BaseCrop(
+ 147,
+ "Steeleafranks",
+ "Benimatic",
+ null,
+ 10,
+ 4,
+ 0,
+ 1,
+ 4,
+ 3,
+ 0,
+ 7,
+ 2,
+ 8,
+ new String[] { "Metal", "Tendrilly", "Iron" },
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steeleaf, 1L),
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steeleaf, 1L) });
+ new GT_BaseCrop(
+ 148,
+ "Liveroots",
+ "Benimatic",
+ null,
+ 8,
+ 4,
+ 0,
+ 1,
+ 4,
+ 2,
+ 0,
+ 5,
+ 2,
+ 6,
+ new String[] { "Wood", "Tendrilly" },
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.LiveRoot, 1L),
+ new ItemStack[] { ItemList.TF_LiveRoot.get(1L) });
+ new GT_BaseCrop(
+ 149,
+ "Trollplant",
+ "unknown",
+ null,
+ 6,
+ 5,
+ 1000,
+ 1,
+ 4,
+ 0,
+ 0,
+ 5,
+ 2,
+ 8,
+ new String[] { "Troll", "Bad", "Scrap" },
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.FoolsRuby, 1L),
+ new ItemStack[] { ItemList.IC2_Plantball.get(1), ItemList.IC2_Scrap.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium241, 1L) });
+ new GT_BaseCrop(
+ 150,
+ "Lazulia",
+ "unknown",
+ null,
+ 7,
+ 4,
+ 0,
+ 2,
+ 4,
+ 4,
+ 2,
+ 5,
+ 7,
+ 4,
+ new String[] { "Shiny", "Bad", "Crystal", "Lapis" },
+ Materials.Lapis,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lapis, 1L),
+ null);
+ new GT_BaseCrop(
+ 151,
+ "Glowheat",
+ "unknown",
+ null,
+ 10,
+ 7,
+ 0,
+ 5,
+ 7,
+ 3,
+ 3,
+ 3,
+ 5,
+ 4,
+ new String[] { "Light", "Shiny", "Crystal" },
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L),
+ null);
+ new GT_BaseCrop(
+ 153,
+ "Fertilia",
+ "unknown",
+ null,
+ 3,
+ 4,
+ 0,
+ 1,
+ 4,
+ 2,
+ 3,
+ 5,
+ 4,
+ 8,
+ new String[] { "Growth", "Healing", "Flower" },
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1L),
+ new ItemStack[] { ItemList.IC2_Fertilizer.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1L) });
+ new GT_BaseCrop(
+ 154,
+ "Bauxia",
+ "unknown",
+ null,
+ 6,
+ 3,
+ 0,
+ 2,
+ 3,
+ 5,
+ 0,
+ 2,
+ 3,
+ 3,
+ new String[] { "Metal", "Aluminium", "Reed", "Aluminium" },
+ Materials.Aluminium,
+ ItemList.Crop_Drop_Bauxite.get(1),
+ null);
+ new GT_BaseCrop(
+ 155,
+ "Titania",
+ "unknown",
+ null,
+ 9,
+ 3,
+ 0,
+ 2,
+ 3,
+ 5,
+ 0,
+ 3,
+ 3,
+ 1,
+ new String[] { "Metal", "Heavy", "Reed", "Titanium" },
+ Materials.Titanium,
+ ItemList.Crop_Drop_Ilmenite.get(1),
+ null);
+ new GT_BaseCrop(
+ 156,
+ "Reactoria",
+ "unknown",
+ null,
+ 12,
+ 4,
+ 0,
+ 2,
+ 4,
+ 4,
+ 0,
+ 1,
+ 2,
+ 1,
+ new String[] { "Radioactive", "Metal", "Danger", "Uranium" },
+ Materials.Uranium,
+ ItemList.Crop_Drop_Pitchblende.get(1),
+ new ItemStack[] { ItemList.Crop_Drop_Uraninite.get(1) });
+ new GT_BaseCrop(
+ 157,
+ "God of Thunder",
+ "unknown",
+ null,
+ 9,
+ 4,
+ 0,
+ 2,
+ 4,
+ 3,
+ 0,
+ 5,
+ 1,
+ 2,
+ new String[] { "Radioactive", "Metal", "Coal", "Thorium" },
+ Materials.Thorium,
+ ItemList.Crop_Drop_Thorium.get(1),
+ null);
+ new GT_BaseCrop(
+ 158,
+ "Transformium",
+ "unknown",
+ null,
+ 12,
+ 4,
+ 2500,
+ 1,
+ 4,
+ 6,
+ 2,
+ 1,
+ 6,
+ 1,
+ new String[] { "Transform", "Coal", "Reed" },
+ ItemList.Crop_Drop_UUABerry.get(1L),
+ new ItemStack[] { ItemList.Crop_Drop_UUABerry.get(1L), ItemList.Crop_Drop_UUABerry.get(1L),
+ ItemList.Crop_Drop_UUABerry.get(1L), ItemList.Crop_Drop_UUABerry.get(1L),
+ ItemList.Crop_Drop_UUMBerry.get(1L) });
+ new GT_BaseCrop(
+ 159,
+ "Starwart",
+ "unknown",
+ null,
+ 12,
+ 4,
+ 4000,
+ 1,
+ 4,
+ 2,
+ 0,
+ 0,
+ 1,
+ 0,
+ new String[] { "Wither", "Nether", "Undead", "Netherstar" },
+ Materials.NetherStar,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L),
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 1L),
+ new ItemStack(Items.skull, 1), new ItemStack(Items.skull, 1, 1), new ItemStack(Items.skull, 1, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherStar, 1L) });
+ new GT_BaseCrop(
+ 160,
+ "Zomplant",
+ "unknown",
+ null,
+ 3,
+ 4,
+ 0,
+ 1,
+ 4,
+ 1,
+ 3,
+ 4,
+ 2,
+ 6,
+ new String[] { "Zombie", "Rotten", "Undead" },
+ new ItemStack(Items.rotten_flesh),
+ null);
+ new GT_BaseCrop(
+ 161,
+ "Nickelback",
+ "unknown",
+ null,
+ 5,
+ 3,
+ 0,
+ 2,
+ 3,
+ 3,
+ 0,
+ 1,
+ 2,
+ 2,
+ new String[] { "Metal", "Fire", "Alloy" },
+ Materials.Nickel,
+ ItemList.Crop_Drop_Nickel.get(1),
+ null);
+ new GT_BaseCrop(
+ 162,
+ "Galvania",
+ "unknown",
+ null,
+ 6,
+ 3,
+ 0,
+ 2,
+ 3,
+ 3,
+ 0,
+ 2,
+ 2,
+ 3,
+ new String[] { "Metal", "Alloy", "Bush" },
+ Materials.Zinc,
+ ItemList.Crop_Drop_Zinc.get(1),
+ null);
+ new GT_BaseCrop(
+ 163,
+ "Evil Ore",
+ "unknown",
+ null,
+ 8,
+ 4,
+ 0,
+ 3,
+ 4,
+ 4,
+ 0,
+ 2,
+ 1,
+ 3,
+ new String[] { "Crystal", "Fire", "Nether" },
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 1L),
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 1L), });
+ new GT_BaseCrop(
+ 164,
+ "Olivia",
+ "unknown",
+ null,
+ 2,
+ 4,
+ 0,
+ 3,
+ 4,
+ 1,
+ 0,
+ 1,
+ 4,
+ 0,
+ new String[] { "Crystal", "Shiny", "Processing", "Olivine" },
+ Materials.Olivine,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Olivine, 1L),
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L), });
+ new GT_BaseCrop(
+ 165,
+ "Sapphirum",
+ "unknown",
+ null,
+ 4,
+ 4,
+ 0,
+ 3,
+ 4,
+ 1,
+ 0,
+ 1,
+ 5,
+ 0,
+ new String[] { "Crystal", "Shiny", "Metal", "Sapphire" },
+ Materials.Sapphire,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sapphire, 1L),
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L), });
+ new GT_BaseCrop(
+ 166,
+ "Pyrolusium",
+ "unknown",
+ null,
+ 12,
+ 3,
+ 0,
+ 2,
+ 3,
+ 1,
+ 0,
+ 1,
+ 1,
+ 0,
+ new String[] { "Metal", "Clean", "Bush", "Manganese" },
+ Materials.Manganese,
+ ItemList.Crop_Drop_Manganese.get(1),
+ null);
+ new GT_BaseCrop(
+ 167,
+ "Scheelinium",
+ "unknown",
+ null,
+ 12,
+ 3,
+ 0,
+ 2,
+ 3,
+ 3,
+ 0,
+ 1,
+ 1,
+ 0,
+ new String[] { "Metal", "Hard", "Bush", "Tungsten" },
+ Materials.Tungsten,
+ ItemList.Crop_Drop_Scheelite.get(1),
+ null);
+ new GT_BaseCrop(
+ 168,
+ "Platina",
+ "unknown",
+ null,
+ 11,
+ 4,
+ 0,
+ 1,
+ 4,
+ 3,
+ 0,
+ 0,
+ 3,
+ 0,
+ new String[] { "Metal", "Shiny", "Reed", "Platinum" },
+ Materials.Platinum,
+ ItemList.Crop_Drop_Platinum.get(1),
+ null);
+ new GT_BaseCrop(
+ 169,
+ "Quantaria",
+ "unknown",
+ null,
+ 12,
+ 4,
+ 1000,
+ 1,
+ 4,
+ 4,
+ 0,
+ 0,
+ 1,
+ 0,
+ new String[] { "Metal", "Iridium", "Reed" },
+ Materials.Iridium,
+ ItemList.Crop_Drop_Iridium.get(1),
+ new ItemStack[] { ItemList.Crop_Drop_Osmium.get(1) });
+ new GT_BaseCrop(
+ 170,
+ "Stargatium",
+ "unknown",
+ null,
+ 12,
+ 4,
+ 1500,
+ 1,
+ 4,
+ 4,
+ 0,
+ 0,
+ 2,
+ 0,
+ new String[] { "Metal", "Heavy", "Alien", "Naquadah" },
+ Materials.Naquadah,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 1L),
+ new ItemStack[] { ItemList.Crop_Drop_Naquadah.get(1) });
+ new GT_BaseCrop(
+ 171,
+ "Lemon",
+ "unknown",
+ null,
+ 4,
+ 4,
+ 0,
+ 1,
+ 4,
+ 1,
+ 1,
+ 0,
+ 2,
+ 0,
+ new String[] { "Food", "Yellow", "Sour" },
+ ItemList.Crop_Drop_Lemon.get(1),
+ null);
+ new GT_BaseCrop(
+ 172,
+ "Chilly",
+ "unknown",
+ null,
+ 4,
+ 4,
+ 0,
+ 1,
+ 4,
+ 1,
+ 1,
+ 0,
+ 2,
+ 0,
+ new String[] { "Food", "Red", "Spicy" },
+ ItemList.Crop_Drop_Chilly.get(1),
+ null);
+ new GT_BaseCrop(
+ 173,
+ "Tomato",
+ "unknown",
+ null,
+ 4,
+ 4,
+ 0,
+ 1,
+ 4,
+ 1,
+ 1,
+ 0,
+ 2,
+ 0,
+ new String[] { "Food", "Red" },
+ ItemList.Crop_Drop_Tomato.get(1),
+ new ItemStack[] { ItemList.Crop_Drop_MTomato.get(1) });
+ new GT_BaseCrop(
+ 174,
+ "Grape",
+ "unknown",
+ null,
+ 4,
+ 4,
+ 0,
+ 1,
+ 4,
+ 1,
+ 1,
+ 0,
+ 2,
+ 0,
+ new String[] { "Food", "Purple" },
+ ItemList.Crop_Drop_Grapes.get(1),
+ null);
+ new GT_BaseCrop(
+ 175,
+ "Onion",
+ "unknown",
+ null,
+ 4,
+ 4,
+ 0,
+ 1,
+ 4,
+ 1,
+ 1,
+ 0,
+ 2,
+ 0,
+ new String[] { "Food", "Brown" },
+ ItemList.Crop_Drop_Onion.get(1),
+ null);
+ new GT_BaseCrop(
+ 176,
+ "Cucumber",
+ "unknown",
+ null,
+ 4,
+ 4,
+ 0,
+ 1,
+ 4,
+ 1,
+ 1,
+ 0,
+ 2,
+ 0,
+ new String[] { "Food", "Green" },
+ ItemList.Crop_Drop_Cucumber.get(1),
+ null);
+ new GT_BaseCrop(
+ 177,
+ "Tea",
+ "unknown",
+ null,
+ 4,
+ 4,
+ 0,
+ 1,
+ 4,
+ 1,
+ 1,
+ 0,
+ 2,
+ 0,
+ new String[] { "Food", "Green", "Ingredient" },
+ ItemList.Crop_Drop_TeaLeaf.get(1),
+ null);
+ new GT_BaseCrop(
+ 178,
+ "Rape",
+ "unknown",
+ null,
+ 4,
+ 4,
+ 0,
+ 1,
+ 4,
+ 1,
+ 1,
+ 0,
+ 2,
+ 0,
+ new String[] { "Food", "Yellow", "Oil" },
+ ItemList.Crop_Drop_Rape.get(1),
+ null);
+ new GT_BaseCrop(
+ 179,
+ "Micadia",
+ "bartimaeusnek",
+ null,
+ 9,
+ 3,
+ 0,
+ 2,
+ 3,
+ 2,
+ 0,
+ 3,
+ 0,
+ 0,
+ new String[] { "Metal", "Pine", "Mica", "Bush" },
+ Materials.Mica,
+ ItemList.Crop_Drop_Mica.get(1L),
+ null);
+ } catch (Throwable e) {
+ GT_Log.err.println("GT_Mod: Failed to register Crops to IC2.");
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_FakeRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_FakeRecipeLoader.java
new file mode 100644
index 0000000000..92221025bd
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_FakeRecipeLoader.java
@@ -0,0 +1,18 @@
+package gregtech.loaders.postload;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_ModHandler;
+
+public class GT_FakeRecipeLoader implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.addIC2ReactorBreederCell(
+ GT_ModHandler.getIC2Item("reactorLithiumCell", 1),
+ GT_ModHandler.getIC2Item("TritiumCell", 1),
+ true,
+ 3000,
+ 1,
+ 10000);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_ItemMaxStacksizeLoader.java b/src/main/java/gregtech/loaders/postload/GT_ItemMaxStacksizeLoader.java
new file mode 100644
index 0000000000..67f7f00d87
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_ItemMaxStacksizeLoader.java
@@ -0,0 +1,138 @@
+package gregtech.loaders.postload;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_Log;
+
+public class GT_ItemMaxStacksizeLoader implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Changing maximum Stacksizes if configured.");
+
+ ItemList.Upgrade_Overclocker.getItem()
+ .setMaxStackSize(GT_Mod.gregtechproxy.mUpgradeCount);
+ Items.cake.setMaxStackSize(64);
+ Items.wooden_door.setMaxStackSize(8);
+ Items.iron_door.setMaxStackSize(8);
+ Items.ender_pearl.setMaxStackSize(64);
+ Items.egg.setMaxStackSize(64);
+ Items.snowball.setMaxStackSize(64);
+ Items.mushroom_stew.setMaxStackSize(64);
+ if (OrePrefixes.plank.mDefaultStackSize < 64) {
+ Item.getItemFromBlock(Blocks.wooden_slab)
+ .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.double_wooden_slab)
+ .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.oak_stairs)
+ .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.jungle_stairs)
+ .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.birch_stairs)
+ .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.spruce_stairs)
+ .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.acacia_stairs)
+ .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.dark_oak_stairs)
+ .setMaxStackSize(OrePrefixes.plank.mDefaultStackSize);
+ }
+ if (OrePrefixes.block.mDefaultStackSize < 64) {
+ Item.getItemFromBlock(Blocks.stone_slab)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.double_stone_slab)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.brick_stairs)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.nether_brick_stairs)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.sandstone_stairs)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.stone_stairs)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.stone_brick_stairs)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.packed_ice)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.ice)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.soul_sand)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.glowstone)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.snow)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.snow)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.iron_block)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.gold_block)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.emerald_block)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.lapis_block)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.diamond_block)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.clay)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.redstone_lamp)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.dirt)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.grass)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.mycelium)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.gravel)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.sand)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.brick_block)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.wool)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.melon_block)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.pumpkin)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.lit_pumpkin)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.dispenser)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.obsidian)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.piston)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.sticky_piston)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.crafting_table)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.glass)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.jukebox)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.anvil)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.chest)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.trapped_chest)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.noteblock)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.mob_spawner)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.bookshelf)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.furnace)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ Item.getItemFromBlock(Blocks.lit_furnace)
+ .setMaxStackSize(OrePrefixes.block.mDefaultStackSize);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java
new file mode 100644
index 0000000000..7280bccdff
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java
@@ -0,0 +1,124 @@
+package gregtech.loaders.postload;
+
+import gregtech.api.enums.Materials;
+import gregtech.loaders.postload.chains.GT_BauxiteRefineChain;
+import gregtech.loaders.postload.chains.GT_NaniteChain;
+import gregtech.loaders.postload.chains.GT_PCBFactoryRecipes;
+import gregtech.loaders.postload.recipes.AlloySmelterRecipes;
+import gregtech.loaders.postload.recipes.ArcFurnaceRecipes;
+import gregtech.loaders.postload.recipes.AssemblerRecipes;
+import gregtech.loaders.postload.recipes.AssemblyLineRecipes;
+import gregtech.loaders.postload.recipes.AutoclaveRecipes;
+import gregtech.loaders.postload.recipes.BenderRecipes;
+import gregtech.loaders.postload.recipes.BlastFurnaceRecipes;
+import gregtech.loaders.postload.recipes.BreweryRecipes;
+import gregtech.loaders.postload.recipes.CannerRecipes;
+import gregtech.loaders.postload.recipes.CentrifugeRecipes;
+import gregtech.loaders.postload.recipes.ChemicalBathRecipes;
+import gregtech.loaders.postload.recipes.ChemicalRecipes;
+import gregtech.loaders.postload.recipes.CircuitAssemblerRecipes;
+import gregtech.loaders.postload.recipes.CompressorRecipes;
+import gregtech.loaders.postload.recipes.CropProcessingRecipes;
+import gregtech.loaders.postload.recipes.CuttingRecipes;
+import gregtech.loaders.postload.recipes.DistilleryRecipes;
+import gregtech.loaders.postload.recipes.ElectrolyzerRecipes;
+import gregtech.loaders.postload.recipes.ElectromagneticSeparatorRecipes;
+import gregtech.loaders.postload.recipes.ExtractorRecipes;
+import gregtech.loaders.postload.recipes.ExtruderRecipes;
+import gregtech.loaders.postload.recipes.FermenterRecipes;
+import gregtech.loaders.postload.recipes.FluidCannerRecipes;
+import gregtech.loaders.postload.recipes.FluidExtractorRecipes;
+import gregtech.loaders.postload.recipes.FluidHeaterRecipes;
+import gregtech.loaders.postload.recipes.FluidSolidifierRecipes;
+import gregtech.loaders.postload.recipes.ForgeHammerRecipes;
+import gregtech.loaders.postload.recipes.FormingPressRecipes;
+import gregtech.loaders.postload.recipes.FuelRecipes;
+import gregtech.loaders.postload.recipes.FusionReactorRecipes;
+import gregtech.loaders.postload.recipes.ImplosionCompressorRecipes;
+import gregtech.loaders.postload.recipes.LaserEngraverRecipes;
+import gregtech.loaders.postload.recipes.LatheRecipes;
+import gregtech.loaders.postload.recipes.MatterAmplifierRecipes;
+import gregtech.loaders.postload.recipes.MixerRecipes;
+import gregtech.loaders.postload.recipes.NEIHiding;
+import gregtech.loaders.postload.recipes.OreDictUnification;
+import gregtech.loaders.postload.recipes.PackagerRecipes;
+import gregtech.loaders.postload.recipes.PlasmaForgeRecipes;
+import gregtech.loaders.postload.recipes.PrinterRecipes;
+import gregtech.loaders.postload.recipes.Pulverizer;
+import gregtech.loaders.postload.recipes.PyrolyseRecipes;
+import gregtech.loaders.postload.recipes.RecipeRemover;
+import gregtech.loaders.postload.recipes.SifterRecipes;
+import gregtech.loaders.postload.recipes.SlicerRecipes;
+import gregtech.loaders.postload.recipes.SmelterRecipes;
+import gregtech.loaders.postload.recipes.ThaumcraftRecipes;
+import gregtech.loaders.postload.recipes.ThermalCentrifugeRecipes;
+import gregtech.loaders.postload.recipes.TranscendentPlasmaMixerRecipes;
+import gregtech.loaders.postload.recipes.VacuumFreezerRecipes;
+import gregtech.loaders.postload.recipes.WiremillRecipes;
+
+public class GT_MachineRecipeLoader implements Runnable {
+
+ public static final String aTextTCGTPage = "gt.research.page.1.";
+
+ public static final Materials[] solderingMats = new Materials[] { Materials.Lead, Materials.SolderingAlloy,
+ Materials.Tin };
+
+ @Override
+ public void run() {
+ new AlloySmelterRecipes().run();
+ new ArcFurnaceRecipes().run();
+ new AssemblerRecipes().run();
+ new AssemblyLineRecipes().run();
+ new AutoclaveRecipes().run();
+ new BenderRecipes().run();
+ new BlastFurnaceRecipes().run();
+ new BreweryRecipes().run();
+ new CannerRecipes().run();
+ new CentrifugeRecipes().run();
+ new ChemicalBathRecipes().run();
+ new ChemicalRecipes().run();
+ new CircuitAssemblerRecipes().run();
+ new CompressorRecipes().run();
+ new CropProcessingRecipes().run();
+ new CuttingRecipes().run();
+ new DistilleryRecipes().run();
+ new ElectrolyzerRecipes().run();
+ new ElectromagneticSeparatorRecipes().run();
+ new ExtractorRecipes().run();
+ new ExtruderRecipes().run();
+ new FermenterRecipes().run();
+ new FluidCannerRecipes().run();
+ new FluidExtractorRecipes().run();
+ new FluidHeaterRecipes().run();
+ new FluidSolidifierRecipes().run();
+ new ForgeHammerRecipes().run();
+ new FormingPressRecipes().run();
+ new FuelRecipes().run();
+ new FusionReactorRecipes().run();
+ new ImplosionCompressorRecipes().run();
+ new LaserEngraverRecipes().run();
+ new LatheRecipes().run();
+ new MatterAmplifierRecipes().run();
+ new MixerRecipes().run();
+ new NEIHiding().run();
+ new OreDictUnification().run();
+ new PackagerRecipes().run();
+ new PlasmaForgeRecipes().run();
+ new PrinterRecipes().run();
+ new Pulverizer().run();
+ new PyrolyseRecipes().run();
+ new RecipeRemover().run();
+ new SifterRecipes().run();
+ new SlicerRecipes().run();
+ new SmelterRecipes().run();
+ new ThaumcraftRecipes().run();
+ new ThermalCentrifugeRecipes().run();
+ new VacuumFreezerRecipes().run();
+ new WiremillRecipes().run();
+ new TranscendentPlasmaMixerRecipes().run();
+
+ GT_BauxiteRefineChain.run();
+ GT_NaniteChain.run();
+ GT_PCBFactoryRecipes.load();
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_MachineTooltipsLoader.java b/src/main/java/gregtech/loaders/postload/GT_MachineTooltipsLoader.java
new file mode 100644
index 0000000000..d18ccd6c83
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_MachineTooltipsLoader.java
@@ -0,0 +1,36 @@
+package gregtech.loaders.postload;
+
+import static gregtech.api.enums.GT_Values.GT;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.common.blocks.GT_Item_Machines;
+
+public class GT_MachineTooltipsLoader implements Runnable {
+
+ @Override
+ public void run() {
+ if (!GT.isClientSide()) return;
+ GT_Log.out.println("GT Mod: Register Block Machine's tooltips");
+ for (int i = 0; i < 32768; i++) {
+ ItemStack tStack = new ItemStack(GregTech_API.sBlockMachines, 1, i);
+ if (tStack.getItem() != null && tStack.getItem() instanceof GT_Item_Machines) {
+ ((GT_Item_Machines) tStack.getItem()).registerDescription(i);
+ }
+ }
+ GT_LanguageManager.addStringLocalization("TileEntity_EUp_IN", "Voltage IN: ");
+ GT_LanguageManager.addStringLocalization("TileEntity_EUp_OUT", "Voltage OUT: ");
+ GT_LanguageManager.addStringLocalization("TileEntity_EUp_AMOUNT", "Amperage: ");
+ GT_LanguageManager.addStringLocalization("TileEntity_EUp_STORE", "Capacity: ");
+ GT_LanguageManager.addStringLocalization("TileEntity_TANK_INFO", "Contains Fluid: ");
+ GT_LanguageManager.addStringLocalization("TileEntity_TANK_AMOUNT", "Fluid Amount: ");
+ GT_LanguageManager.addStringLocalization("TileEntity_CHEST_INFO", "Contains Item: ");
+ GT_LanguageManager.addStringLocalization("TileEntity_CHEST_AMOUNT", "Item Amount: ");
+ GT_LanguageManager.addStringLocalization("GT_TileEntity_MUFFLER", "has Muffler Upgrade");
+ GT_LanguageManager.addStringLocalization("GT_TileEntity_STEAMCONVERTER", "has Steam Upgrade");
+ GT_LanguageManager.addStringLocalization("GT_TileEntity_STEAMTANKS", "Steam Tank Upgrades");
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_MinableRegistrator.java b/src/main/java/gregtech/loaders/postload/GT_MinableRegistrator.java
new file mode 100644
index 0000000000..afa98e0b38
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_MinableRegistrator.java
@@ -0,0 +1,16 @@
+package gregtech.loaders.postload;
+
+import net.minecraft.init.Blocks;
+
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+
+public class GT_MinableRegistrator implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Adding Blocks to the Miners Valuable List.");
+ GT_ModHandler.addValuableOre(Blocks.glowstone, 0, 1);
+ GT_ModHandler.addValuableOre(Blocks.soul_sand, 0, 1);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_PCBFactoryMaterialLoader.java b/src/main/java/gregtech/loaders/postload/GT_PCBFactoryMaterialLoader.java
new file mode 100644
index 0000000000..95732076d9
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_PCBFactoryMaterialLoader.java
@@ -0,0 +1,19 @@
+package gregtech.loaders.postload;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.util.GT_PCBFactoryManager;
+
+public class GT_PCBFactoryMaterialLoader {
+
+ public static void load() {
+ // add Plastics
+ GT_PCBFactoryManager.addPlasticTier(Materials.Plastic, 1);
+ GT_PCBFactoryManager.addPlasticTier(Materials.PolyvinylChloride, 2);
+ GT_PCBFactoryManager.addPlasticTier(Materials.Polytetrafluoroethylene, 3);
+ GT_PCBFactoryManager.addPlasticTier(Materials.Epoxid, 4);
+ GT_PCBFactoryManager.addPlasticTier(Materials.EpoxidFiberReinforced, 5);
+ GT_PCBFactoryManager.addPlasticTier(Materials.Polybenzimidazole, 6);
+ GT_PCBFactoryManager.addPlasticTier(MaterialsKevlar.Kevlar, 7);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_PostLoad.java b/src/main/java/gregtech/loaders/postload/GT_PostLoad.java
new file mode 100644
index 0000000000..5ec4391d71
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_PostLoad.java
@@ -0,0 +1,526 @@
+package gregtech.loaders.postload;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GalacticraftCore;
+import static gregtech.api.enums.Mods.GalacticraftMars;
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.google.common.base.Stopwatch;
+
+import cpw.mods.fml.common.ProgressManager;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_CLS_Compat;
+import gregtech.api.util.GT_Forestry_Compat;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_RecipeConstants;
+import gregtech.api.util.GT_RecipeRegistrator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gregtech.common.items.behaviors.Behaviour_DataOrb;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Massfabricator;
+import ic2.api.recipe.IRecipeInput;
+import ic2.api.recipe.RecipeOutput;
+
+@SuppressWarnings("deprecation")
+public class GT_PostLoad {
+
+ public static void activateOreDictHandler() {
+ @SuppressWarnings("UnstableApiUsage") // Stable enough for this project
+ Stopwatch stopwatch = Stopwatch.createStarted();
+ GT_Mod.gregtechproxy.activateOreDictHandler();
+
+ // noinspection UnstableApiUsage// Stable enough for this project
+ GT_Mod.GT_FML_LOGGER
+ .info("Congratulations, you have been waiting long enough (" + stopwatch.stop() + "). Have a Cake.");
+ GT_Log.out.println(
+ "GT_Mod: List of Lists of Tool Recipes: "
+ + GT_ModHandler.sSingleNonBlockDamagableRecipeList_list.toString());
+ GT_Log.out.println(
+ "GT_Mod: Vanilla Recipe List -> Outputs null or stackSize <=0: "
+ + GT_ModHandler.sVanillaRecipeList_warntOutput.toString());
+ GT_Log.out.println(
+ "GT_Mod: Single Non Block Damageable Recipe List -> Outputs null or stackSize <=0: "
+ + GT_ModHandler.sSingleNonBlockDamagableRecipeList_warntOutput.toString());
+ }
+
+ public static void removeIc2Recipes(Map<IRecipeInput, RecipeOutput> aMaceratorRecipeList,
+ Map<IRecipeInput, RecipeOutput> aCompressorRecipeList, Map<IRecipeInput, RecipeOutput> aExtractorRecipeList,
+ Map<IRecipeInput, RecipeOutput> aOreWashingRecipeList,
+ Map<IRecipeInput, RecipeOutput> aThermalCentrifugeRecipeList) {
+ @SuppressWarnings("UnstableApiUsage") // Stable enough for this project
+ Stopwatch stopwatch = Stopwatch.createStarted();
+ // remove gemIridium exploit
+ ItemStack iridiumOre = GT_ModHandler.getIC2Item("iridiumOre", 1);
+ aCompressorRecipeList.entrySet()
+ .parallelStream()
+ .filter(
+ e -> e.getKey()
+ .getInputs()
+ .size() == 1 && e.getKey()
+ .getInputs()
+ .get(0)
+ .isItemEqual(iridiumOre))
+ .findAny()
+ .ifPresent(e -> aCompressorRecipeList.remove(e.getKey()));
+ // Add default IC2 recipe to GT
+ GT_ModHandler.addIC2RecipesToGT(aMaceratorRecipeList, RecipeMaps.maceratorRecipes, true, true, true);
+ GT_ModHandler.addIC2RecipesToGT(aCompressorRecipeList, RecipeMaps.compressorRecipes, true, true, true);
+ GT_ModHandler.addIC2RecipesToGT(aExtractorRecipeList, RecipeMaps.extractorRecipes, true, true, true);
+ GT_ModHandler.addIC2RecipesToGT(aOreWashingRecipeList, RecipeMaps.oreWasherRecipes, false, true, true);
+ GT_ModHandler
+ .addIC2RecipesToGT(aThermalCentrifugeRecipeList, RecipeMaps.thermalCentrifugeRecipes, true, true, true);
+ // noinspection UnstableApiUsage// Stable enough for this project
+ GT_Mod.GT_FML_LOGGER.info("IC2 Removal (" + stopwatch.stop() + "). Have a Cake.");
+ }
+
+ public static void registerFluidCannerRecipes() {
+ for (FluidContainerRegistry.FluidContainerData tData : FluidContainerRegistry
+ .getRegisteredFluidContainerData()) {
+ // lava clay bucket is registered with empty container with 0 stack size
+ ItemStack emptyContainer = tData.emptyContainer.copy();
+ emptyContainer.stackSize = 1;
+ GT_Values.RA.stdBuilder()
+ .itemInputs(emptyContainer)
+ .itemOutputs(tData.filledContainer)
+ .fluidInputs(tData.fluid)
+ .duration((tData.fluid.amount / 62) * TICKS)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+ GT_RecipeBuilder builder = GT_Values.RA.stdBuilder()
+ .itemInputs(tData.filledContainer);
+ if (tData.emptyContainer.stackSize > 0) {
+ builder.itemOutputs(tData.emptyContainer);
+ }
+ builder.fluidOutputs(tData.fluid)
+ .duration((tData.fluid.amount / 62) * TICKS)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+ }
+ }
+
+ public static void addFakeRecipes() {
+ GT_Log.out.println("GT_Mod: Adding Fake Recipes for NEI");
+
+ if (Forestry.isModLoaded()) {
+ GT_Forestry_Compat.populateFakeNeiRecipes();
+ }
+
+ if (ItemList.IC2_Crop_Seeds.get(1L) != null) {
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.IC2_Crop_Seeds.getWildcard(1L) },
+ new ItemStack[] { ItemList.IC2_Crop_Seeds.getWithName(1L, "Scanned Seeds") },
+ null,
+ null,
+ null,
+ 160,
+ 8,
+ 0);
+ }
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { new ItemStack(Items.written_book, 1, 32767) },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Scanned Book Data") },
+ ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"),
+ null,
+ null,
+ 128,
+ 30,
+ 0);
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { new ItemStack(Items.filled_map, 1, 32767) },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Scanned Map Data") },
+ ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"),
+ null,
+ null,
+ 128,
+ 30,
+ 0);
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.Tool_DataOrb.getWithName(1L, "Orb to overwrite") },
+ new ItemStack[] { ItemList.Tool_DataOrb.getWithName(1L, "Copy of the Orb") },
+ ItemList.Tool_DataOrb.getWithName(0L, "Orb to copy"),
+ null,
+ null,
+ 512,
+ 30,
+ 0);
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Stick to overwrite") },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Copy of the Stick") },
+ ItemList.Tool_DataStick.getWithName(0L, "Stick to copy"),
+ null,
+ null,
+ 128,
+ 30,
+ 0);
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Raw Prospection Data") },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Analyzed Prospection Data") },
+ null,
+ null,
+ null,
+ 1000,
+ 30,
+ 0);
+ if (GalacticraftCore.isModLoaded()) {
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { Objects
+ .requireNonNull(GT_ModHandler.getModItem(GalacticraftCore.ID, "item.schematic", 1, Short.MAX_VALUE))
+ .setStackDisplayName("Any Schematic") },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Scanned Schematic") },
+ ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"),
+ null,
+ null,
+ 36000,
+ 480,
+ 0);
+ if (GalacticraftMars.isModLoaded()) RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { Objects
+ .requireNonNull(GT_ModHandler.getModItem(GalacticraftMars.ID, "item.schematic", 1, Short.MAX_VALUE))
+ .setStackDisplayName("Any Schematic") },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Scanned Schematic") },
+ ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"),
+ null,
+ null,
+ 36000,
+ 480,
+ 0);
+ if (GalaxySpace.isModLoaded()) {
+ for (int i = 4; i < 9; i++) {
+ RecipeMaps.scannerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { GT_ModHandler.getModItem(GalaxySpace.ID, "item.SchematicTier" + i, 1)
+ .setStackDisplayName("Any Schematic") },
+ new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Scanned Schematic") },
+ ItemList.Tool_DataStick.getWithName(1L, "Stick to save it to"),
+ null,
+ null,
+ 36000,
+ 480,
+ 0);
+ }
+ }
+ }
+ Materials.getMaterialsMap()
+ .values()
+ .forEach(tMaterial -> {
+ if ((tMaterial.mElement != null) && (!tMaterial.mElement.mIsIsotope)
+ && (tMaterial != Materials.Magic)
+ && (tMaterial.getMass() > 0L)) {
+ ItemStack dataOrb = ItemList.Tool_DataOrb.get(1L);
+ Behaviour_DataOrb.setDataTitle(dataOrb, "Elemental-Scan");
+ Behaviour_DataOrb.setDataName(dataOrb, tMaterial.mElement.name());
+ ItemStack dustItem = GT_OreDictUnificator.get(OrePrefixes.dust, tMaterial, 1L);
+ if (dustItem != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(dustItem)
+ .itemOutputs(dataOrb)
+ .special(ItemList.Tool_DataOrb.get(1L))
+ .duration((int) (tMaterial.getMass() * 8192L))
+ .eut(TierEU.RECIPE_LV)
+ .fake()
+ .ignoreCollision()
+ .addTo(RecipeMaps.scannerFakeRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemOutputs(dustItem)
+ .special(dataOrb)
+ .metadata(GT_RecipeConstants.MATERIAL, tMaterial)
+ .addTo(RecipeMaps.replicatorRecipes);
+ return;
+ }
+ ItemStack cellItem = GT_OreDictUnificator.get(OrePrefixes.cell, tMaterial, 1L);
+ if (cellItem != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(cellItem)
+ .itemOutputs(dataOrb)
+ .special(ItemList.Tool_DataOrb.get(1L))
+ .duration((int) (tMaterial.getMass() * 8192L))
+ .eut(TierEU.RECIPE_LV)
+ .fake()
+ .ignoreCollision()
+ .addTo(RecipeMaps.scannerFakeRecipes);
+ FluidStack fluidStack = GT_Utility.getFluidForFilledItem(cellItem, false);
+ GT_RecipeBuilder builder = GT_Values.RA.stdBuilder();
+ if (fluidStack != null) {
+ builder.fluidOutputs(fluidStack);
+ } else {
+ builder.itemInputs(Materials.Empty.getCells(1))
+ .itemOutputs(cellItem);
+ }
+ builder.special(dataOrb)
+ .metadata(GT_RecipeConstants.MATERIAL, tMaterial)
+ .addTo(RecipeMaps.replicatorRecipes);
+ }
+ }
+ });
+
+ if (!GT_MetaTileEntity_Massfabricator.sRequiresUUA) {
+ GT_MetaTileEntity_Massfabricator.nonUUARecipe = RecipeMaps.massFabFakeRecipes.addFakeRecipe(
+ false,
+ null,
+ null,
+ null,
+ null,
+ new FluidStack[] { Materials.UUMatter.getFluid(1L) },
+ GT_MetaTileEntity_Massfabricator.sDurationMultiplier,
+ GT_MetaTileEntity_Massfabricator.BASE_EUT,
+ 0);
+ }
+ GT_MetaTileEntity_Massfabricator.uuaRecipe = RecipeMaps.massFabFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+ null,
+ null,
+ new FluidStack[] { Materials.UUAmplifier.getFluid(GT_MetaTileEntity_Massfabricator.sUUAperUUM) },
+ new FluidStack[] { Materials.UUMatter.getFluid(1L) },
+ GT_MetaTileEntity_Massfabricator.sDurationMultiplier / GT_MetaTileEntity_Massfabricator.sUUASpeedBonus,
+ GT_MetaTileEntity_Massfabricator.BASE_EUT,
+ 0);
+ RecipeMaps.rockBreakerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.Display_ITS_FREE.getWithName(1L, "IT'S FREE! Place Lava on Side") },
+ new ItemStack[] { new ItemStack(Blocks.cobblestone, 1) },
+ null,
+ null,
+ null,
+ 16,
+ 30,
+ 0);
+ RecipeMaps.rockBreakerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { ItemList.Display_ITS_FREE.getWithName(1L, "IT'S FREE! Place Lava on Top") },
+ new ItemStack[] { new ItemStack(Blocks.stone, 1) },
+ null,
+ null,
+ null,
+ 16,
+ 30,
+ 0);
+ RecipeMaps.rockBreakerFakeRecipes.addFakeRecipe(
+ false,
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+ GT_Utility.getIntegratedCircuit(1) },
+ new ItemStack[] { new ItemStack(Blocks.obsidian, 1) },
+ null,
+ null,
+ null,
+ 128,
+ 30,
+ 0);
+ }
+
+ public static void nerfVanillaTools() {
+ if (!GT_Mod.gregtechproxy.mNerfedVanillaTools) {
+ return;
+ }
+
+ GT_Log.out.println("GT_Mod: Nerfing Vanilla Tool Durability");
+ Items.wooden_sword.setMaxDamage(12);
+ Items.wooden_pickaxe.setMaxDamage(12);
+ Items.wooden_shovel.setMaxDamage(12);
+ Items.wooden_axe.setMaxDamage(12);
+ Items.wooden_hoe.setMaxDamage(12);
+
+ Items.stone_sword.setMaxDamage(48);
+ Items.stone_pickaxe.setMaxDamage(48);
+ Items.stone_shovel.setMaxDamage(48);
+ Items.stone_axe.setMaxDamage(48);
+ Items.stone_hoe.setMaxDamage(48);
+
+ Items.iron_sword.setMaxDamage(256);
+ Items.iron_pickaxe.setMaxDamage(256);
+ Items.iron_shovel.setMaxDamage(256);
+ Items.iron_axe.setMaxDamage(256);
+ Items.iron_hoe.setMaxDamage(256);
+
+ Items.golden_sword.setMaxDamage(24);
+ Items.golden_pickaxe.setMaxDamage(24);
+ Items.golden_shovel.setMaxDamage(24);
+ Items.golden_axe.setMaxDamage(24);
+ Items.golden_hoe.setMaxDamage(24);
+
+ Items.diamond_sword.setMaxDamage(768);
+ Items.diamond_pickaxe.setMaxDamage(768);
+ Items.diamond_shovel.setMaxDamage(768);
+ Items.diamond_axe.setMaxDamage(768);
+ Items.diamond_hoe.setMaxDamage(768);
+
+ }
+
+ public static void replaceVanillaMaterials() {
+ @SuppressWarnings("UnstableApiUsage") // Stable enough for this project
+ Stopwatch stopwatch = Stopwatch.createStarted();
+ GT_Mod.GT_FML_LOGGER.info("Replacing Vanilla Materials in recipes, please wait.");
+ Set<Materials> replaceVanillaItemsSet = GT_Mod.gregtechproxy.mUseGreatlyShrukenReplacementList
+ ? Arrays.stream(Materials.values())
+ .filter(GT_RecipeRegistrator::hasVanillaRecipes)
+ .collect(Collectors.toSet())
+ : new HashSet<>(Arrays.asList(Materials.values()));
+
+ ProgressManager.ProgressBar progressBar = ProgressManager
+ .push("Register materials", replaceVanillaItemsSet.size());
+ if (GT_Values.cls_enabled) {
+ try {
+ GT_CLS_Compat.doActualRegistrationCLS(progressBar, replaceVanillaItemsSet);
+ GT_CLS_Compat.pushToDisplayProgress();
+ } catch (InvocationTargetException | IllegalAccessException e) {
+ GT_Mod.GT_FML_LOGGER.catching(e);
+ }
+ } else {
+ replaceVanillaItemsSet.forEach(m -> {
+ progressBar.step(m.mDefaultLocalName);
+ doActualRegistration(m);
+ });
+ }
+ ProgressManager.pop(progressBar);
+ // noinspection UnstableApiUsage// stable enough for project
+ GT_Mod.GT_FML_LOGGER.info("Replaced Vanilla Materials (" + stopwatch.stop() + "). Have a Cake.");
+ }
+
+ public static void doActualRegistration(Materials m) {
+ String plateName = OrePrefixes.plate.get(m)
+ .toString();
+ boolean noSmash = !m.contains(SubTag.NO_SMASHING);
+ if ((m.mTypes & 2) != 0) GT_RecipeRegistrator.registerUsagesForMaterials(plateName, noSmash, m.getIngots(1));
+ if ((m.mTypes & 4) != 0) GT_RecipeRegistrator.registerUsagesForMaterials(plateName, noSmash, m.getGems(1));
+ if (m.getBlocks(1) != null) GT_RecipeRegistrator.registerUsagesForMaterials(null, noSmash, m.getBlocks(1));
+ }
+
+ public static void createGTtoolsCreativeTab() {
+ new CreativeTabs("GTtools") {
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public ItemStack getIconItemStack() {
+ return ItemList.Tool_Cheat.get(1, new ItemStack(Blocks.iron_block, 1));
+ }
+
+ @SideOnly(Side.CLIENT)
+ @Override
+ public Item getTabIconItem() {
+ return ItemList.Circuit_Integrated.getItem();
+ }
+
+ @Override
+ public void displayAllReleventItems(List<ItemStack> aList) {
+
+ for (int i = 0; i < 32766; i += 2) {
+ if (GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolStats(new ItemStack(GT_MetaGenerated_Tool_01.INSTANCE, 1, i)) == null) {
+ continue;
+ }
+
+ ItemStack tStack = new ItemStack(GT_MetaGenerated_Tool_01.INSTANCE, 1, i);
+ GT_MetaGenerated_Tool_01.INSTANCE.isItemStackUsable(tStack);
+ aList.add(
+ GT_MetaGenerated_Tool_01.INSTANCE.getToolWithStats(i, 1, Materials.Lead, Materials.Lead, null));
+ aList.add(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(i, 1, Materials.Nickel, Materials.Nickel, null));
+ aList.add(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(i, 1, Materials.Cobalt, Materials.Cobalt, null));
+ aList.add(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(i, 1, Materials.Osmium, Materials.Osmium, null));
+ aList.add(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(i, 1, Materials.Adamantium, Materials.Adamantium, null));
+ aList.add(
+ GT_MetaGenerated_Tool_01.INSTANCE
+ .getToolWithStats(i, 1, Materials.Neutronium, Materials.Neutronium, null));
+
+ }
+ super.displayAllReleventItems(aList);
+ }
+ };
+ }
+
+ public static void addSolidFakeLargeBoilerFuels() {
+ RecipeMaps.largeBoilerFakeFuels.getBackend()
+ .addSolidRecipes(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Charcoal, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Charcoal, 1),
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 1),
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
+ GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Coal, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lignite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Lignite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Lignite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.log, Materials.Wood, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plank, Materials.Wood, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+ GT_OreDictUnificator.get(OrePrefixes.slab, Materials.Wood, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Caesium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+ GT_OreDictUnificator.get(ItemList.Block_SSFUEL.get(1)),
+ GT_OreDictUnificator.get(ItemList.Block_MSSFUEL.get(1)),
+ GT_OreDictUnificator.get(OrePrefixes.rod, Materials.Blaze, 1));
+ if (Thaumcraft.isModLoaded()) {
+ RecipeMaps.largeBoilerFakeFuels.getBackend()
+ .addSolidRecipe(GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1));
+ }
+ }
+
+ public static void identifyAnySteam() {
+ final String[] steamCandidates = { "steam", "ic2steam" };
+ final String[] superHeatedSteamCandidates = { "ic2superheatedsteam" };
+
+ GT_ModHandler.sAnySteamFluidIDs = Arrays.stream(steamCandidates)
+ .map(FluidRegistry::getFluid)
+ .filter(Objects::nonNull)
+ .map(FluidRegistry::getFluidID)
+ .collect(Collectors.toList());
+ GT_ModHandler.sSuperHeatedSteamFluidIDs = Arrays.stream(superHeatedSteamCandidates)
+ .map(FluidRegistry::getFluid)
+ .filter(Objects::nonNull)
+ .map(FluidRegistry::getFluidID)
+ .collect(Collectors.toList());
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_ProcessingArrayRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_ProcessingArrayRecipeLoader.java
new file mode 100644
index 0000000000..0ff53d0424
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_ProcessingArrayRecipeLoader.java
@@ -0,0 +1,168 @@
+package gregtech.loaders.postload;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_ProcessingArray_Manager;
+
+public class GT_ProcessingArrayRecipeLoader {
+
+ public static void registerDefaultGregtechMaps() {
+
+ // Alloy Smelter
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.alloysmelter", RecipeMaps.alloySmelterRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.alloysmelter", SoundResource.IC2_MACHINES_INDUCTION_LOOP);
+ // Arc Furnace
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.arcfurnace", RecipeMaps.arcFurnaceRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.arcfurnace", SoundResource.IC2_MACHINES_INDUCTION_LOOP);
+ // Assembler
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.assembler", RecipeMaps.assemblerRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.assembler", SoundResource.NONE);
+ // Autoclave
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.autoclave", RecipeMaps.autoclaveRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.autoclave", SoundResource.NONE);
+ // Bender
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.bender", RecipeMaps.benderRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.bender", SoundResource.IC2_MACHINES_COMPRESSOR_OP);
+ // Boxinator
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.boxinator", RecipeMaps.packagerRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.boxinator", SoundResource.NONE);
+ // Brewery
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.brewery", RecipeMaps.brewingRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.brewery", SoundResource.NONE);
+ // Canner
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.canner", RecipeMaps.cannerRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.canner", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
+ // Centrifuge
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.centrifuge", RecipeMaps.centrifugeNonCellRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.centrifuge", SoundResource.NONE);
+ // Chemical Bath
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.chemicalbath", RecipeMaps.chemicalBathRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.chemicalbath", SoundResource.NONE);
+ // Chemical Reactor
+ GT_ProcessingArray_Manager
+ .addRecipeMapToPA("basicmachine.chemicalreactor", RecipeMaps.multiblockChemicalReactorRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.chemicalreactor", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
+ // Circuit Assembler
+ GT_ProcessingArray_Manager
+ .addRecipeMapToPA("basicmachine.circuitassembler", RecipeMaps.circuitAssemblerRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.circuitassembler", SoundResource.NONE);
+ // Compressor
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.compressor", RecipeMaps.compressorRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.compressor", SoundResource.IC2_MACHINES_COMPRESSOR_OP);
+ // Cutting Machine
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.cutter", RecipeMaps.cutterRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.cutter", SoundResource.NONE);
+ // Distillery
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.distillery", RecipeMaps.distilleryRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.distillery", SoundResource.GT_MACHINES_DISTILLERY_LOOP);
+ // Electrolyzer
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.electrolyzer", RecipeMaps.electrolyzerNonCellRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.electrolyzer", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
+ // Extractor
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.extractor", RecipeMaps.extractorRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.extractor", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
+ // Extruder
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.extruder", RecipeMaps.extruderRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.extruder", SoundResource.IC2_MACHINES_INDUCTION_LOOP);
+ // Fermenter
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.fermenter", RecipeMaps.fermentingRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.fermenter", SoundResource.NONE);
+ // Fluid Canner
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.fluidcanner", RecipeMaps.fluidCannerRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.fluidcanner", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
+ // Fluid Extractor
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.fluidextractor", RecipeMaps.fluidExtractionRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.fluidextractor", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
+ // Fluid Heater
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.fluidheater", RecipeMaps.fluidHeaterRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.fluidheater", SoundResource.NONE);
+ // Fluid Solidifier
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.fluidsolidifier", RecipeMaps.fluidSolidifierRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.fluidsolidifier", SoundResource.NONE);
+ // Forge Hammer
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.hammer", RecipeMaps.hammerRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.hammer", SoundResource.RANDOM_ANVIL_USE);
+ // Forming Press
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.press", RecipeMaps.formingPressRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.press", SoundResource.IC2_MACHINES_COMPRESSOR_OP);
+ // Laser Engraver
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.laserengraver", RecipeMaps.laserEngraverRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.laserengraver", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
+ // Lathe
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.lathe", RecipeMaps.latheRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.lathe", SoundResource.NONE);
+ // Macerator
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.macerator", RecipeMaps.maceratorRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.macerator", SoundResource.IC2_MACHINES_MACERATOR_OP);
+ // Magnetic Separator
+ GT_ProcessingArray_Manager
+ .addRecipeMapToPA("basicmachine.electromagneticseparator", RecipeMaps.electroMagneticSeparatorRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.electromagneticseparator", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
+ // Matter Amplifier
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.amplifab", RecipeMaps.amplifierRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.amplifab", SoundResource.IC2_MACHINES_EXTRACTOR_OP);
+ // Microwave
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.microwave", RecipeMaps.microwaveRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.microwave", SoundResource.IC2_MACHINES_ELECTROFURNACE_LOOP);
+ // Mixer
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.mixer", RecipeMaps.mixerNonCellRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.mixer", SoundResource.NONE);
+ // Ore Washer
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.orewasher", RecipeMaps.oreWasherRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.orewasher", SoundResource.NONE);
+ // Plasma Arc Furnace
+ GT_ProcessingArray_Manager
+ .addRecipeMapToPA("basicmachine.plasmaarcfurnace", RecipeMaps.plasmaArcFurnaceRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.plasmaarcfurnace", SoundResource.IC2_MACHINES_INDUCTION_LOOP);
+ // Polarizer
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.polarizer", RecipeMaps.polarizerRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.polarizer", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
+ // Printer
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.printer", RecipeMaps.printerRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.printer", SoundResource.IC2_MACHINES_COMPRESSOR_OP);
+ // Recycler
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.recycler", RecipeMaps.recyclerRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.recycler", SoundResource.IC2_MACHINES_RECYCLER_OP);
+ // Scanner
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.scanner", RecipeMaps.scannerFakeRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.scanner", SoundResource.IC2_MACHINES_MAGNETIZER_LOOP);
+ // Sifter
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.sifter", RecipeMaps.sifterRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.sifter", SoundResource.NONE);
+ // Slicer
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.slicer", RecipeMaps.slicerRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.slicer", SoundResource.NONE);
+ // Thermal Centrifuge
+ GT_ProcessingArray_Manager
+ .addRecipeMapToPA("basicmachine.thermalcentrifuge", RecipeMaps.thermalCentrifugeRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.thermalcentrifuge", SoundResource.NONE);
+ // Unboxinator
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.unboxinator", RecipeMaps.unpackagerRecipes);
+ GT_ProcessingArray_Manager.addSoundResourceToPA("basicmachine.unboxinator", SoundResource.NONE);
+ // Wiremill
+ GT_ProcessingArray_Manager.addRecipeMapToPA("basicmachine.wiremill", RecipeMaps.wiremillRecipes);
+ GT_ProcessingArray_Manager
+ .addSoundResourceToPA("basicmachine.wiremill", SoundResource.IC2_MACHINES_RECYCLER_OP);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_RecyclerBlacklistLoader.java b/src/main/java/gregtech/loaders/postload/GT_RecyclerBlacklistLoader.java
new file mode 100644
index 0000000000..35b18769f0
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_RecyclerBlacklistLoader.java
@@ -0,0 +1,106 @@
+package gregtech.loaders.postload;
+
+import static gregtech.api.util.GT_ModHandler.addToRecyclerBlackList;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import com.glodblock.github.loader.ItemAndBlockHolder;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Mods;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+
+public class GT_RecyclerBlacklistLoader implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Adding Stuff to the Recycler Blacklist.");
+ addToRecyclerBlackList(new ItemStack(Items.arrow, 1, 0));
+ addToRecyclerBlackList(new ItemStack(Items.bone, 1, 0));
+ addToRecyclerBlackList(ItemList.Dye_Bonemeal.get(1L));
+
+ addToRecyclerBlackList(new ItemStack(Items.rotten_flesh, 1, 0));
+
+ addToRecyclerBlackList(new ItemStack(Items.string, 1, 0));
+
+ addToRecyclerBlackList(new ItemStack(Items.egg, 1, 0));
+ ItemStack tStack = new ItemStack(Blocks.cobblestone, 1, 0);
+ while (tStack != null) {
+ addToRecyclerBlackList(tStack);
+ tStack = GT_ModHandler
+ .getRecipeOutput(tStack, tStack, tStack, tStack, tStack, tStack, tStack, tStack, tStack);
+ }
+ addToRecyclerBlackList(new ItemStack(Blocks.gravel, 1, 32767));
+ addToRecyclerBlackList(new ItemStack(Items.flint, 1, 32767));
+ addToRecyclerBlackList(new ItemStack(Blocks.cobblestone_wall, 1, 32767));
+ addToRecyclerBlackList(new ItemStack(Blocks.sandstone_stairs, 1, 32767));
+ addToRecyclerBlackList(new ItemStack(Blocks.stone_stairs, 1, 32767));
+ addToRecyclerBlackList(new ItemStack(Blocks.stone_brick_stairs, 1, 32767));
+ addToRecyclerBlackList(GT_ModHandler.getSmeltingOutput(new ItemStack(Blocks.stone, 1, 0), false, null));
+ addToRecyclerBlackList(
+ GT_ModHandler
+ .getRecipeOutput(new ItemStack(Blocks.glass, 1, 0), null, null, new ItemStack(Blocks.glass, 1, 0)));
+ addToRecyclerBlackList(
+ GT_ModHandler
+ .getRecipeOutput(new ItemStack(Blocks.stone, 1, 0), null, null, new ItemStack(Blocks.stone, 1, 0)));
+ addToRecyclerBlackList(
+ GT_ModHandler.getRecipeOutput(
+ new ItemStack(Blocks.cobblestone, 1, 0),
+ null,
+ null,
+ new ItemStack(Blocks.cobblestone, 1, 0)));
+ addToRecyclerBlackList(
+ GT_ModHandler.getRecipeOutput(
+ new ItemStack(Blocks.stone, 1, 0),
+ null,
+ new ItemStack(Blocks.stone, 1, 0),
+ null,
+ new ItemStack(Blocks.stone, 1, 0)));
+ addToRecyclerBlackList(
+ GT_ModHandler.getRecipeOutput(
+ new ItemStack(Blocks.stone, 1, 0),
+ new ItemStack(Blocks.glass, 1, 0),
+ new ItemStack(Blocks.stone, 1, 0)));
+ addToRecyclerBlackList(
+ GT_ModHandler.getRecipeOutput(
+ new ItemStack(Blocks.cobblestone, 1, 0),
+ new ItemStack(Blocks.glass, 1, 0),
+ new ItemStack(Blocks.cobblestone, 1, 0)));
+ addToRecyclerBlackList(
+ GT_ModHandler.getRecipeOutput(
+ new ItemStack(Blocks.sandstone, 1, 0),
+ new ItemStack(Blocks.glass, 1, 0),
+ new ItemStack(Blocks.sandstone, 1, 0)));
+ addToRecyclerBlackList(
+ GT_ModHandler.getRecipeOutput(
+ new ItemStack(Blocks.sand, 1, 0),
+ new ItemStack(Blocks.glass, 1, 0),
+ new ItemStack(Blocks.sand, 1, 0)));
+ addToRecyclerBlackList(
+ GT_ModHandler.getRecipeOutput(
+ new ItemStack(Blocks.sandstone, 1, 0),
+ new ItemStack(Blocks.sandstone, 1, 0),
+ new ItemStack(Blocks.sandstone, 1, 0),
+ new ItemStack(Blocks.sandstone, 1, 0),
+ new ItemStack(Blocks.sandstone, 1, 0),
+ new ItemStack(Blocks.sandstone, 1, 0)));
+ addToRecyclerBlackList(GT_ModHandler.getRecipeOutput(new ItemStack(Blocks.glass, 1, 0)));
+ addToRecyclerBlackList(
+ GT_ModHandler.getRecipeOutput(new ItemStack(Blocks.glass, 1, 0), new ItemStack(Blocks.glass, 1, 0)));
+ if (Mods.Chisel.isModLoaded()) {
+ for (int i = 1; i <= 15; i++) {
+ addToRecyclerBlackList(GT_ModHandler.getModItem("chisel", "cobblestone", 1, i));
+ }
+ for (int i = 0; i <= 15; i++) {
+ addToRecyclerBlackList(GT_ModHandler.getModItem("chisel", "stonebricksmooth", 1, i));
+ }
+ }
+ if (Mods.AE2FluidCraft.isModLoaded()) {
+ addToRecyclerBlackList(new ItemStack(ItemAndBlockHolder.DROP));
+ addToRecyclerBlackList(new ItemStack(ItemAndBlockHolder.PACKET));
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_ScrapboxDropLoader.java b/src/main/java/gregtech/loaders/postload/GT_ScrapboxDropLoader.java
new file mode 100644
index 0000000000..b4621df6b6
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_ScrapboxDropLoader.java
@@ -0,0 +1,105 @@
+package gregtech.loaders.postload;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class GT_ScrapboxDropLoader implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: (re-)adding Scrapbox Drops.");
+
+ GT_ModHandler.addScrapboxDrop(9.5F, new ItemStack(Items.wooden_hoe));
+ GT_ModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.wooden_axe));
+ GT_ModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.wooden_sword));
+ GT_ModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.wooden_shovel));
+ GT_ModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.wooden_pickaxe));
+ GT_ModHandler.addScrapboxDrop(2.0F, new ItemStack(Items.sign));
+ GT_ModHandler.addScrapboxDrop(9.5F, new ItemStack(Items.stick));
+ GT_ModHandler.addScrapboxDrop(5.0F, new ItemStack(Blocks.dirt));
+ GT_ModHandler.addScrapboxDrop(3.0F, new ItemStack(Blocks.grass));
+ GT_ModHandler.addScrapboxDrop(3.0F, new ItemStack(Blocks.gravel));
+ GT_ModHandler.addScrapboxDrop(0.5F, new ItemStack(Blocks.pumpkin));
+ GT_ModHandler.addScrapboxDrop(1.0F, new ItemStack(Blocks.soul_sand));
+ GT_ModHandler.addScrapboxDrop(2.0F, new ItemStack(Blocks.netherrack));
+ GT_ModHandler.addScrapboxDrop(1.0F, new ItemStack(Items.bone));
+ GT_ModHandler.addScrapboxDrop(9.0F, new ItemStack(Items.rotten_flesh));
+ GT_ModHandler.addScrapboxDrop(0.4F, new ItemStack(Items.cooked_porkchop));
+ GT_ModHandler.addScrapboxDrop(0.4F, new ItemStack(Items.cooked_beef));
+ GT_ModHandler.addScrapboxDrop(0.4F, new ItemStack(Items.cooked_chicken));
+ GT_ModHandler.addScrapboxDrop(0.5F, new ItemStack(Items.apple));
+ GT_ModHandler.addScrapboxDrop(0.5F, new ItemStack(Items.bread));
+ GT_ModHandler.addScrapboxDrop(0.1F, new ItemStack(Items.cake));
+ GT_ModHandler.addScrapboxDrop(1.0F, ItemList.IC2_Food_Can_Filled.get(1L));
+ GT_ModHandler.addScrapboxDrop(2.0F, ItemList.IC2_Food_Can_Spoiled.get(1L));
+ GT_ModHandler.addScrapboxDrop(0.2F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1L));
+ GT_ModHandler.addScrapboxDrop(1.0F, GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1L));
+ GT_ModHandler.addScrapboxDrop(2.0F, ItemList.Cell_Empty.get(1L));
+ GT_ModHandler.addScrapboxDrop(5.0F, GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 1L));
+ GT_ModHandler.addScrapboxDrop(1.0F, new ItemStack(Items.leather));
+ GT_ModHandler.addScrapboxDrop(1.0F, new ItemStack(Items.feather));
+ GT_ModHandler.addScrapboxDrop(0.7F, GT_ModHandler.getIC2Item("plantBall", 1L));
+ GT_ModHandler.addScrapboxDrop(3.8F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L));
+ GT_ModHandler.addScrapboxDrop(0.6F, new ItemStack(Items.slime_ball));
+ GT_ModHandler.addScrapboxDrop(0.8F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Rubber, 1L));
+ GT_ModHandler.addScrapboxDrop(2.7F, GT_ModHandler.getIC2Item("suBattery", 1L));
+ GT_ModHandler.addScrapboxDrop(3.6F, ItemList.Circuit_Primitive.get(1L));
+ GT_ModHandler.addScrapboxDrop(0.8F, ItemList.Circuit_Parts_Advanced.get(1L));
+ GT_ModHandler.addScrapboxDrop(1.8F, ItemList.Circuit_Board_Basic.get(1L));
+ GT_ModHandler.addScrapboxDrop(0.4F, ItemList.Circuit_Board_Advanced.get(1L));
+ GT_ModHandler.addScrapboxDrop(0.2F, ItemList.Circuit_Board_Elite.get(1L));
+ if (!GT_Mod.gregtechproxy.mDisableIC2Cables) {
+ GT_ModHandler.addScrapboxDrop(2.0F, GT_ModHandler.getIC2Item("insulatedCopperCableItem", 1L));
+ GT_ModHandler.addScrapboxDrop(0.4F, GT_ModHandler.getIC2Item("insulatedGoldCableItem", 1L));
+ }
+ GT_ModHandler.addScrapboxDrop(0.9F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L));
+ GT_ModHandler.addScrapboxDrop(0.8F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L));
+ GT_ModHandler.addScrapboxDrop(0.8F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L));
+ GT_ModHandler.addScrapboxDrop(2.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Charcoal, 1L));
+ GT_ModHandler.addScrapboxDrop(1.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1L));
+ GT_ModHandler.addScrapboxDrop(1.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1L));
+ GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1L));
+ GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Electrum, 1L));
+ GT_ModHandler.addScrapboxDrop(1.2F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1L));
+ GT_ModHandler.addScrapboxDrop(1.2F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1L));
+ GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bauxite, 1L));
+ GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1L));
+ GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lead, 1L));
+ GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1L));
+ GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1L));
+ GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 1L));
+ GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 1L));
+ GT_ModHandler.addScrapboxDrop(1.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Obsidian, 1L));
+ GT_ModHandler.addScrapboxDrop(1.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L));
+ GT_ModHandler.addScrapboxDrop(2.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1L));
+ GT_ModHandler.addScrapboxDrop(2.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lazurite, 1L));
+ GT_ModHandler.addScrapboxDrop(2.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Pyrite, 1L));
+ GT_ModHandler.addScrapboxDrop(2.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1L));
+ GT_ModHandler.addScrapboxDrop(2.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodalite, 1L));
+ GT_ModHandler.addScrapboxDrop(4.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Netherrack, 1L));
+ GT_ModHandler.addScrapboxDrop(4.0F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Flint, 1L));
+ GT_ModHandler.addScrapboxDrop(0.03F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 1L));
+ GT_ModHandler.addScrapboxDrop(0.03F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungsten, 1L));
+ GT_ModHandler.addScrapboxDrop(0.03F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1L));
+ GT_ModHandler.addScrapboxDrop(0.03F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 1L));
+ GT_ModHandler.addScrapboxDrop(0.03F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 1L));
+ GT_ModHandler.addScrapboxDrop(0.03F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 1L));
+ GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GarnetRed, 1L));
+ GT_ModHandler.addScrapboxDrop(0.5F, GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GarnetYellow, 1L));
+ GT_ModHandler.addScrapboxDrop(0.05F, GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Olivine, 1L));
+ GT_ModHandler.addScrapboxDrop(0.05F, GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Ruby, 1L));
+ GT_ModHandler.addScrapboxDrop(0.05F, GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Sapphire, 1L));
+ GT_ModHandler.addScrapboxDrop(0.05F, GT_OreDictUnificator.get(OrePrefixes.gem, Materials.GreenSapphire, 1L));
+ GT_ModHandler.addScrapboxDrop(0.05F, GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Emerald, 1L));
+ GT_ModHandler.addScrapboxDrop(0.05F, GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Diamond, 1L));
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/GT_Worldgenloader.java b/src/main/java/gregtech/loaders/postload/GT_Worldgenloader.java
new file mode 100644
index 0000000000..8213013bfc
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/GT_Worldgenloader.java
@@ -0,0 +1,2384 @@
+package gregtech.loaders.postload;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.util.GT_Log;
+import gregtech.common.GT_Worldgen_GT_Ore_Layer;
+import gregtech.common.GT_Worldgen_GT_Ore_SmallPieces;
+import gregtech.common.GT_Worldgen_Stone;
+import gregtech.common.GT_Worldgenerator;
+
+public class GT_Worldgenloader implements Runnable {
+
+ public void run() {
+
+ new GT_Worldgenerator();
+
+ new GT_Worldgen_Stone(
+ "overworld.stone.blackgranite.tiny",
+ true,
+ GregTech_API.sBlockGranites,
+ 0,
+ 0,
+ 1,
+ 75,
+ 5,
+ 0,
+ 180,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.blackgranite.small",
+ true,
+ GregTech_API.sBlockGranites,
+ 0,
+ 0,
+ 1,
+ 100,
+ 10,
+ 0,
+ 180,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.blackgranite.medium",
+ true,
+ GregTech_API.sBlockGranites,
+ 0,
+ 0,
+ 1,
+ 200,
+ 10,
+ 0,
+ 180,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.blackgranite.large",
+ true,
+ GregTech_API.sBlockGranites,
+ 0,
+ 0,
+ 1,
+ 300,
+ 70,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.blackgranite.huge",
+ true,
+ GregTech_API.sBlockGranites,
+ 0,
+ 0,
+ 1,
+ 400,
+ 150,
+ 0,
+ 120,
+ null,
+ false);
+
+ new GT_Worldgen_Stone(
+ "overworld.stone.redgranite.tiny",
+ true,
+ GregTech_API.sBlockGranites,
+ 8,
+ 0,
+ 1,
+ 75,
+ 5,
+ 0,
+ 180,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.redgranite.small",
+ true,
+ GregTech_API.sBlockGranites,
+ 8,
+ 0,
+ 1,
+ 100,
+ 10,
+ 0,
+ 180,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.redgranite.medium",
+ true,
+ GregTech_API.sBlockGranites,
+ 8,
+ 0,
+ 1,
+ 200,
+ 10,
+ 0,
+ 180,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.redgranite.large",
+ true,
+ GregTech_API.sBlockGranites,
+ 8,
+ 0,
+ 1,
+ 300,
+ 70,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.redgranite.huge",
+ true,
+ GregTech_API.sBlockGranites,
+ 8,
+ 0,
+ 1,
+ 400,
+ 150,
+ 0,
+ 120,
+ null,
+ false);
+
+ new GT_Worldgen_Stone(
+ "overworld.stone.marble.tiny",
+ true,
+ GregTech_API.sBlockStones,
+ 0,
+ 0,
+ 1,
+ 75,
+ 5,
+ 0,
+ 180,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.marble.small",
+ true,
+ GregTech_API.sBlockStones,
+ 0,
+ 0,
+ 1,
+ 100,
+ 10,
+ 0,
+ 180,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.marble.medium",
+ true,
+ GregTech_API.sBlockStones,
+ 0,
+ 0,
+ 1,
+ 200,
+ 10,
+ 0,
+ 180,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.marble.large",
+ true,
+ GregTech_API.sBlockStones,
+ 0,
+ 0,
+ 1,
+ 300,
+ 70,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.marble.huge",
+ true,
+ GregTech_API.sBlockStones,
+ 0,
+ 0,
+ 1,
+ 400,
+ 150,
+ 0,
+ 120,
+ null,
+ false);
+
+ new GT_Worldgen_Stone(
+ "overworld.stone.basalt.tiny",
+ true,
+ GregTech_API.sBlockStones,
+ 8,
+ 0,
+ 1,
+ 75,
+ 5,
+ 0,
+ 180,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.basalt.small",
+ true,
+ GregTech_API.sBlockStones,
+ 8,
+ 0,
+ 1,
+ 100,
+ 10,
+ 0,
+ 180,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.basalt.medium",
+ true,
+ GregTech_API.sBlockStones,
+ 8,
+ 0,
+ 1,
+ 200,
+ 10,
+ 0,
+ 180,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.basalt.large",
+ true,
+ GregTech_API.sBlockStones,
+ 8,
+ 0,
+ 1,
+ 300,
+ 70,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "overworld.stone.basalt.huge",
+ true,
+ GregTech_API.sBlockStones,
+ 8,
+ 0,
+ 1,
+ 400,
+ 150,
+ 0,
+ 120,
+ null,
+ false);
+
+ new GT_Worldgen_Stone(
+ "nether.stone.blackgranite.tiny",
+ false,
+ GregTech_API.sBlockGranites,
+ 0,
+ -1,
+ 1,
+ 50,
+ 45,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.blackgranite.small",
+ false,
+ GregTech_API.sBlockGranites,
+ 0,
+ -1,
+ 1,
+ 100,
+ 60,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.blackgranite.medium",
+ false,
+ GregTech_API.sBlockGranites,
+ 0,
+ -1,
+ 1,
+ 200,
+ 80,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.blackgranite.large",
+ false,
+ GregTech_API.sBlockGranites,
+ 0,
+ -1,
+ 1,
+ 300,
+ 70,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.blackgranite.huge",
+ false,
+ GregTech_API.sBlockGranites,
+ 0,
+ -1,
+ 1,
+ 400,
+ 150,
+ 0,
+ 120,
+ null,
+ false);
+
+ new GT_Worldgen_Stone(
+ "nether.stone.redgranite.tiny",
+ false,
+ GregTech_API.sBlockGranites,
+ 8,
+ -1,
+ 1,
+ 50,
+ 45,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.redgranite.small",
+ false,
+ GregTech_API.sBlockGranites,
+ 8,
+ -1,
+ 1,
+ 100,
+ 60,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.redgranite.medium",
+ false,
+ GregTech_API.sBlockGranites,
+ 8,
+ -1,
+ 1,
+ 200,
+ 80,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.redgranite.large",
+ false,
+ GregTech_API.sBlockGranites,
+ 8,
+ -1,
+ 1,
+ 300,
+ 70,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.redgranite.huge",
+ false,
+ GregTech_API.sBlockGranites,
+ 8,
+ -1,
+ 1,
+ 400,
+ 150,
+ 0,
+ 120,
+ null,
+ false);
+
+ new GT_Worldgen_Stone(
+ "nether.stone.marble.tiny",
+ false,
+ GregTech_API.sBlockStones,
+ 0,
+ -1,
+ 1,
+ 50,
+ 45,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.marble.small",
+ false,
+ GregTech_API.sBlockStones,
+ 0,
+ -1,
+ 1,
+ 100,
+ 60,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.marble.medium",
+ false,
+ GregTech_API.sBlockStones,
+ 0,
+ -1,
+ 1,
+ 200,
+ 80,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.marble.large",
+ false,
+ GregTech_API.sBlockStones,
+ 0,
+ -1,
+ 1,
+ 300,
+ 70,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.marble.huge",
+ false,
+ GregTech_API.sBlockStones,
+ 0,
+ -1,
+ 1,
+ 400,
+ 150,
+ 0,
+ 120,
+ null,
+ false);
+
+ new GT_Worldgen_Stone(
+ "nether.stone.basalt.tiny",
+ false,
+ GregTech_API.sBlockStones,
+ 8,
+ -1,
+ 1,
+ 50,
+ 45,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.basalt.small",
+ false,
+ GregTech_API.sBlockStones,
+ 8,
+ -1,
+ 1,
+ 100,
+ 60,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.basalt.medium",
+ false,
+ GregTech_API.sBlockStones,
+ 8,
+ -1,
+ 1,
+ 200,
+ 80,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.basalt.large",
+ false,
+ GregTech_API.sBlockStones,
+ 8,
+ -1,
+ 1,
+ 300,
+ 70,
+ 0,
+ 120,
+ null,
+ false);
+ new GT_Worldgen_Stone(
+ "nether.stone.basalt.huge",
+ false,
+ GregTech_API.sBlockStones,
+ 8,
+ -1,
+ 1,
+ 400,
+ 150,
+ 0,
+ 120,
+ null,
+ false);
+
+ // GT Default Small Ores
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.copper",
+ true,
+ 60,
+ 180,
+ 32,
+ true,
+ true,
+ true,
+ true,
+ true,
+ false,
+ Materials.Copper);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.tin",
+ true,
+ 80,
+ 220,
+ 32,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ Materials.Tin);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.bismuth",
+ true,
+ 80,
+ 120,
+ 8,
+ false,
+ true,
+ false,
+ true,
+ true,
+ false,
+ Materials.Bismuth);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.coal",
+ true,
+ 120,
+ 250,
+ 24,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ Materials.Coal);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.iron",
+ true,
+ 40,
+ 100,
+ 16,
+ true,
+ true,
+ true,
+ true,
+ true,
+ false,
+ Materials.Iron);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.lead",
+ true,
+ 40,
+ 180,
+ 16,
+ false,
+ true,
+ true,
+ true,
+ true,
+ true,
+ Materials.Lead);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.zinc",
+ true,
+ 80,
+ 210,
+ 24,
+ true,
+ true,
+ true,
+ true,
+ true,
+ false,
+ Materials.Zinc);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.gold",
+ true,
+ 20,
+ 60,
+ 8,
+ true,
+ false,
+ true,
+ true,
+ true,
+ true,
+ Materials.Gold);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.silver",
+ true,
+ 20,
+ 60,
+ 20,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ Materials.Silver);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.nickel",
+ true,
+ 80,
+ 150,
+ 8,
+ true,
+ false,
+ true,
+ true,
+ true,
+ true,
+ Materials.Nickel);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.lapis",
+ true,
+ 10,
+ 50,
+ 4,
+ true,
+ false,
+ false,
+ true,
+ false,
+ true,
+ Materials.Lapis);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.diamond",
+ true,
+ 5,
+ 15,
+ 2,
+ true,
+ false,
+ false,
+ true,
+ true,
+ true,
+ Materials.Diamond);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.emerald",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.Emerald);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.ruby",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.Ruby);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.sapphire",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.Sapphire);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.greensapphire",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.GreenSapphire);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.olivine",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.Olivine);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.topaz",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.Topaz);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.tanzanite",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.Tanzanite);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.amethyst",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.Amethyst);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.opal",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.Opal);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.jasper",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.Jasper);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.bluetopaz",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.BlueTopaz);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.amber",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.Amber);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.foolsruby",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.FoolsRuby);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.garnetred",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.GarnetRed);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.garnetyellow",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ Materials.GarnetYellow);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.redstone",
+ true,
+ 5,
+ 25,
+ 8,
+ true,
+ true,
+ false,
+ true,
+ true,
+ true,
+ Materials.Redstone);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.netherquartz",
+ true,
+ 30,
+ 120,
+ 64,
+ false,
+ true,
+ false,
+ false,
+ false,
+ false,
+ Materials.NetherQuartz);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.saltpeter",
+ true,
+ 10,
+ 60,
+ 8,
+ false,
+ true,
+ false,
+ false,
+ false,
+ false,
+ Materials.Saltpeter);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.sulfur",
+ true,
+ 5,
+ 60,
+ 40,
+ false,
+ true,
+ false,
+ false,
+ false,
+ false,
+ Materials.Sulfur);
+
+ // TODO: GTNH Custom Small Ores
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.titanium",
+ true,
+ 10,
+ 180,
+ 32,
+ false,
+ false,
+ false,
+ Materials.Titanium);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.tungsten",
+ true,
+ 10,
+ 120,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Tungsten);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.meteoriciron",
+ true,
+ 50,
+ 70,
+ 8,
+ false,
+ false,
+ false,
+ Materials.MeteoricIron);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.firestone",
+ true,
+ 5,
+ 15,
+ 2,
+ false,
+ false,
+ false,
+ Materials.Firestone);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.neutronium",
+ true,
+ 5,
+ 15,
+ 8,
+ false,
+ false,
+ false,
+ Materials.Neutronium);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.chromite",
+ true,
+ 20,
+ 40,
+ 8,
+ false,
+ false,
+ false,
+ Materials.Chromite);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.tungstate",
+ true,
+ 20,
+ 40,
+ 8,
+ false,
+ false,
+ false,
+ Materials.Tungstate);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.naquadah",
+ true,
+ 5,
+ 25,
+ 8,
+ false,
+ false,
+ false,
+ Materials.Naquadah);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.quantium",
+ true,
+ 5,
+ 25,
+ 6,
+ false,
+ false,
+ false,
+ Materials.Quantium);
+ new GT_Worldgen_GT_Ore_SmallPieces("ore.small.mythril", true, 5, 25, 6, false, false, false, Materials.Mytryl);
+ new GT_Worldgen_GT_Ore_SmallPieces("ore.small.ledox", true, 40, 60, 4, false, false, false, Materials.Ledox);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.oriharukon",
+ true,
+ 20,
+ 40,
+ 6,
+ false,
+ false,
+ false,
+ Materials.Oriharukon);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.draconium",
+ true,
+ 5,
+ 15,
+ 4,
+ false,
+ false,
+ false,
+ Materials.Draconium);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.awdraconium",
+ true,
+ 5,
+ 15,
+ 2,
+ false,
+ false,
+ false,
+ Materials.DraconiumAwakened);
+ new GT_Worldgen_GT_Ore_SmallPieces("ore.small.desh", true, 10, 30, 6, false, false, false, Materials.Desh);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.blackplutonium",
+ true,
+ 25,
+ 45,
+ 6,
+ false,
+ false,
+ false,
+ Materials.BlackPlutonium);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.infinitycatalyst",
+ true,
+ 40,
+ 80,
+ 6,
+ false,
+ false,
+ false,
+ Materials.InfinityCatalyst);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.infinity",
+ true,
+ 2,
+ 40,
+ 2,
+ false,
+ false,
+ false,
+ Materials.Infinity);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.bedrockium",
+ true,
+ 5,
+ 25,
+ 6,
+ false,
+ false,
+ false,
+ Materials.Bedrockium);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.realgar",
+ true,
+ 15,
+ 85,
+ 32,
+ false,
+ true,
+ false,
+ Materials.Realgar);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.certusquartz",
+ true,
+ 5,
+ 115,
+ 16,
+ false,
+ true,
+ false,
+ Materials.CertusQuartz);
+ new GT_Worldgen_GT_Ore_SmallPieces("ore.small.jade", true, 5, 35, 2, false, false, false, Materials.Jade);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.deepiron",
+ true,
+ 5,
+ 40,
+ 8,
+ false,
+ false,
+ false,
+ Materials.DeepIron);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.redgarnet",
+ true,
+ 5,
+ 35,
+ 2,
+ false,
+ false,
+ false,
+ Materials.GarnetRed);
+ new GT_Worldgen_GT_Ore_SmallPieces(
+ "ore.small.chargedcertus",
+ true,
+ 5,
+ 115,
+ 4,
+ false,
+ false,
+ false,
+ Materials.CertusQuartzCharged);
+
+ // GT Default Veins
+
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.naquadah",
+ true,
+ 10,
+ 90,
+ 30,
+ 4,
+ 32,
+ false,
+ false,
+ false,
+ Materials.Naquadah,
+ Materials.Naquadah,
+ Materials.Naquadah,
+ Materials.NaquadahEnriched);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.lignite",
+ true,
+ 80,
+ 210,
+ 160,
+ 7,
+ 32,
+ true,
+ false,
+ false,
+ Materials.Lignite,
+ Materials.Lignite,
+ Materials.Lignite,
+ Materials.Coal);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.coal",
+ true,
+ 30,
+ 80,
+ 80,
+ 5,
+ 32,
+ true,
+ false,
+ false,
+ Materials.Coal,
+ Materials.Coal,
+ Materials.Coal,
+ Materials.Lignite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.magnetite",
+ true,
+ 60,
+ 180,
+ 160,
+ 2,
+ 32,
+ true,
+ false,
+ false,
+ Materials.Magnetite,
+ Materials.Magnetite,
+ Materials.Iron,
+ Materials.VanadiumMagnetite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.gold",
+ true,
+ 30,
+ 60,
+ 160,
+ 2,
+ 32,
+ true,
+ false,
+ true,
+ Materials.Magnetite,
+ Materials.Magnetite,
+ Materials.VanadiumMagnetite,
+ Materials.Gold);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.iron",
+ true,
+ 10,
+ 40,
+ 120,
+ 3,
+ 24,
+ true,
+ true,
+ false,
+ Materials.BrownLimonite,
+ Materials.YellowLimonite,
+ Materials.BandedIron,
+ Materials.Malachite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.cassiterite",
+ true,
+ 60,
+ 220,
+ 50,
+ 4,
+ 24,
+ true,
+ false,
+ true,
+ Materials.Tin,
+ Materials.Tin,
+ Materials.Cassiterite,
+ Materials.Tin);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.tetrahedrite",
+ true,
+ 80,
+ 120,
+ 70,
+ 3,
+ 24,
+ false,
+ true,
+ true,
+ Materials.Tetrahedrite,
+ Materials.Tetrahedrite,
+ Materials.Copper,
+ Materials.Stibnite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.netherquartz",
+ true,
+ 40,
+ 80,
+ 80,
+ 4,
+ 24,
+ false,
+ true,
+ false,
+ Materials.NetherQuartz,
+ Materials.NetherQuartz,
+ Materials.NetherQuartz,
+ Materials.Quartzite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.sulfur",
+ true,
+ 5,
+ 20,
+ 100,
+ 4,
+ 24,
+ false,
+ true,
+ false,
+ Materials.Sulfur,
+ Materials.Sulfur,
+ Materials.Pyrite,
+ Materials.Sphalerite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.copper",
+ true,
+ 5,
+ 60,
+ 80,
+ 3,
+ 24,
+ true,
+ true,
+ true,
+ Materials.Chalcopyrite,
+ Materials.Iron,
+ Materials.Pyrite,
+ Materials.Copper);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.bauxite",
+ true,
+ 10,
+ 80,
+ 80,
+ 3,
+ 24,
+ false,
+ false,
+ false,
+ Materials.Bauxite,
+ Materials.Ilmenite,
+ Materials.Aluminium,
+ Materials.Ilmenite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.salts",
+ true,
+ 50,
+ 70,
+ 50,
+ 2,
+ 24,
+ true,
+ false,
+ false,
+ Materials.RockSalt,
+ Materials.Salt,
+ Materials.Lepidolite,
+ Materials.Spodumene);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.redstone",
+ true,
+ 5,
+ 40,
+ 60,
+ 2,
+ 24,
+ true,
+ true,
+ false,
+ Materials.Redstone,
+ Materials.Redstone,
+ Materials.Ruby,
+ Materials.Cinnabar);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.soapstone",
+ true,
+ 20,
+ 50,
+ 40,
+ 2,
+ 16,
+ true,
+ false,
+ false,
+ Materials.Soapstone,
+ Materials.Talc,
+ Materials.Glauconite,
+ Materials.Pentlandite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.nickel",
+ true,
+ 10,
+ 40,
+ 40,
+ 2,
+ 16,
+ false,
+ false,
+ true,
+ Materials.Garnierite,
+ Materials.Nickel,
+ Materials.Cobaltite,
+ Materials.Pentlandite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.platinum",
+ true,
+ 40,
+ 50,
+ 5,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Cooperite,
+ Materials.Palladium,
+ Materials.Platinum,
+ Materials.Iridium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.pitchblende",
+ true,
+ 30,
+ 60,
+ 40,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Pitchblende,
+ Materials.Pitchblende,
+ Materials.Uraninite,
+ Materials.Uraninite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.monazite",
+ true,
+ 20,
+ 40,
+ 30,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Bastnasite,
+ Materials.Bastnasite,
+ Materials.Monazite,
+ Materials.Neodymium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.molybdenum",
+ true,
+ 20,
+ 50,
+ 5,
+ 2,
+ 16,
+ false,
+ true,
+ true,
+ Materials.Wulfenite,
+ Materials.Molybdenite,
+ Materials.Molybdenum,
+ Materials.Powellite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.tungstate",
+ true,
+ 20,
+ 60,
+ 10,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Scheelite,
+ Materials.Scheelite,
+ Materials.Tungstate,
+ Materials.Lithium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.sapphire",
+ true,
+ 10,
+ 40,
+ 60,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Almandine,
+ Materials.Pyrope,
+ Materials.Sapphire,
+ Materials.GreenSapphire);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.manganese",
+ true,
+ 20,
+ 30,
+ 20,
+ 2,
+ 16,
+ true,
+ true,
+ false,
+ Materials.Grossular,
+ Materials.Spessartine,
+ Materials.Pyrolusite,
+ Materials.Tantalite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.quartz",
+ true,
+ 80,
+ 120,
+ 30,
+ 2,
+ 16,
+ false,
+ true,
+ false,
+ Materials.Quartzite,
+ Materials.Barite,
+ Materials.CertusQuartz,
+ Materials.CertusQuartz);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.diamond",
+ true,
+ 5,
+ 20,
+ 40,
+ 1,
+ 16,
+ true,
+ false,
+ false,
+ Materials.Graphite,
+ Materials.Graphite,
+ Materials.Diamond,
+ Materials.Coal);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.olivine",
+ true,
+ 10,
+ 40,
+ 60,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Bentonite,
+ Materials.Magnesite,
+ Materials.Olivine,
+ Materials.Glauconite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.apatite",
+ true,
+ 40,
+ 60,
+ 60,
+ 2,
+ 16,
+ true,
+ false,
+ false,
+ Materials.Apatite,
+ Materials.Apatite,
+ Materials.TricalciumPhosphate,
+ Materials.Pyrochlore);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.galena",
+ true,
+ 5,
+ 45,
+ 40,
+ 4,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Galena,
+ Materials.Galena,
+ Materials.Silver,
+ Materials.Lead);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.lapis",
+ true,
+ 20,
+ 50,
+ 40,
+ 4,
+ 16,
+ true,
+ false,
+ false,
+ Materials.Lazurite,
+ Materials.Sodalite,
+ Materials.Lapis,
+ Materials.Calcite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.beryllium",
+ true,
+ 5,
+ 30,
+ 30,
+ 2,
+ 16,
+ false,
+ true,
+ true,
+ Materials.Beryllium,
+ Materials.Beryllium,
+ Materials.Emerald,
+ Materials.Thorium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.uranium",
+ true,
+ 20,
+ 30,
+ 20,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Uraninite,
+ Materials.Uraninite,
+ Materials.Uranium,
+ Materials.Uranium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.oilsand",
+ true,
+ 50,
+ 80,
+ 40,
+ 5,
+ 16,
+ true,
+ false,
+ false,
+ Materials.Oilsands,
+ Materials.Oilsands,
+ Materials.Oilsands,
+ Materials.Oilsands);
+
+ /*
+ * TODO: custom GTNH OreMixes WARNING: NO DUPLICATES IN aName OR DEPRECATED MATERIALS IN HERE. Materials can be
+ * used unlimited, since achievements for Ores are turned off.
+ */
+
+ // aName, aDefault, aMinY, aMaxY, aWeight, aDensity, aSize, aOverworld, aNether, aEnd, aPrimary, aSecondary,
+ // aBetween, aSporadic
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.neutronium",
+ true,
+ 5,
+ 30,
+ 10,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Neutronium,
+ Materials.Adamantium,
+ Materials.Naquadah,
+ Materials.Titanium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.aquaignis",
+ true,
+ 5,
+ 35,
+ 16,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.InfusedWater,
+ Materials.InfusedFire,
+ Materials.Amber,
+ Materials.Cinnabar);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.terraaer",
+ true,
+ 5,
+ 35,
+ 16,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.InfusedEarth,
+ Materials.InfusedAir,
+ Materials.Amber,
+ Materials.Cinnabar);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.perditioordo",
+ true,
+ 5,
+ 35,
+ 16,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.InfusedEntropy,
+ Materials.InfusedOrder,
+ Materials.Amber,
+ Materials.Cinnabar);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.coppertin",
+ true,
+ 80,
+ 200,
+ 80,
+ 3,
+ 24,
+ true,
+ false,
+ false,
+ Materials.Chalcopyrite,
+ Materials.Vermiculite,
+ Materials.Cassiterite,
+ Materials.Alunite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.titaniumchrome",
+ true,
+ 10,
+ 70,
+ 16,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Ilmenite,
+ Materials.Chromite,
+ Materials.Uvarovite,
+ Materials.Perlite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.mineralsand",
+ true,
+ 50,
+ 60,
+ 80,
+ 3,
+ 24,
+ true,
+ false,
+ false,
+ Materials.BasalticMineralSand,
+ Materials.GraniticMineralSand,
+ Materials.FullersEarth,
+ Materials.Gypsum);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.garnettin",
+ true,
+ 50,
+ 60,
+ 80,
+ 3,
+ 24,
+ true,
+ false,
+ false,
+ Materials.CassiteriteSand,
+ Materials.GarnetSand,
+ Materials.Asbestos,
+ Materials.Diatomite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.kaolinitezeolite",
+ true,
+ 50,
+ 70,
+ 60,
+ 4,
+ 16,
+ true,
+ false,
+ false,
+ Materials.Kaolinite,
+ Materials.Zeolite,
+ Materials.FullersEarth,
+ Materials.GlauconiteSand);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.mica",
+ true,
+ 20,
+ 40,
+ 20,
+ 2,
+ 16,
+ true,
+ false,
+ false,
+ Materials.Kyanite,
+ Materials.Mica,
+ Materials.Cassiterite,
+ Materials.Pollucite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.dolomite",
+ true,
+ 150,
+ 200,
+ 40,
+ 4,
+ 24,
+ true,
+ false,
+ false,
+ Materials.Dolomite,
+ Materials.Wollastonite,
+ Materials.Trona,
+ Materials.Andradite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.platinumchrome",
+ true,
+ 5,
+ 30,
+ 10,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Platinum,
+ Materials.Chrome,
+ Materials.Cooperite,
+ Materials.Palladium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.iridiummytryl",
+ true,
+ 15,
+ 40,
+ 10,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Nickel,
+ Materials.Iridium,
+ Materials.Palladium,
+ Materials.Mithril);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.osmium",
+ true,
+ 5,
+ 30,
+ 10,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Nickel,
+ Materials.Osmium,
+ Materials.Iridium,
+ Materials.Nickel);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.saltpeterelectrotine",
+ true,
+ 5,
+ 45,
+ 40,
+ 3,
+ 16,
+ false,
+ true,
+ false,
+ Materials.Saltpeter,
+ Materials.Diatomite,
+ Materials.Electrotine,
+ Materials.Alunite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.desh",
+ true,
+ 5,
+ 40,
+ 30,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Desh,
+ Materials.Desh,
+ Materials.Scheelite,
+ Materials.Tungstate);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.draconium",
+ true,
+ 20,
+ 40,
+ 40,
+ 1,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Draconium,
+ Materials.Electrotine,
+ Materials.Jade,
+ Materials.Vinteum);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.quantium",
+ true,
+ 5,
+ 25,
+ 30,
+ 3,
+ 24,
+ false,
+ false,
+ false,
+ Materials.Quantium,
+ Materials.Amethyst,
+ Materials.Rutile,
+ Materials.Ardite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.callistoice",
+ true,
+ 40,
+ 60,
+ 40,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.CallistoIce,
+ Materials.Topaz,
+ Materials.BlueTopaz,
+ Materials.Alduorite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.mytryl",
+ true,
+ 10,
+ 30,
+ 40,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Mytryl,
+ Materials.Jasper,
+ Materials.Ceruclase,
+ Materials.Vulcanite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.ledox",
+ true,
+ 55,
+ 65,
+ 30,
+ 2,
+ 24,
+ false,
+ false,
+ false,
+ Materials.Ledox,
+ Materials.Opal,
+ Materials.Orichalcum,
+ Materials.Rubracium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.oriharukon",
+ true,
+ 30,
+ 60,
+ 40,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Oriharukon,
+ Materials.Tanzanite,
+ Materials.Vyroxeres,
+ Materials.Mirabilite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.blackplutonium",
+ true,
+ 5,
+ 25,
+ 40,
+ 2,
+ 24,
+ false,
+ false,
+ false,
+ Materials.BlackPlutonium,
+ Materials.GarnetRed,
+ Materials.GarnetYellow,
+ Materials.Borax);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.infusedgold",
+ true,
+ 15,
+ 40,
+ 30,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Gold,
+ Materials.Gold,
+ Materials.InfusedGold,
+ Materials.Platinum);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.niobium",
+ true,
+ 5,
+ 30,
+ 60,
+ 2,
+ 24,
+ false,
+ false,
+ false,
+ Materials.Niobium,
+ Materials.Yttrium,
+ Materials.Gallium,
+ Materials.Gallium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.tungstenirons",
+ true,
+ 5,
+ 25,
+ 16,
+ 2,
+ 30,
+ false,
+ false,
+ false,
+ Materials.Tungsten,
+ Materials.Silicon,
+ Materials.DeepIron,
+ Materials.ShadowIron);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.uraniumgtnh",
+ true,
+ 10,
+ 30,
+ 60,
+ 2,
+ 24,
+ false,
+ false,
+ false,
+ Materials.Thorium,
+ Materials.Uranium,
+ Materials.Plutonium241,
+ Materials.Uranium235);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.vanadiumgold",
+ true,
+ 10,
+ 50,
+ 60,
+ 2,
+ 24,
+ false,
+ false,
+ false,
+ Materials.Vanadium,
+ Materials.Magnetite,
+ Materials.Gold,
+ Materials.Chrome);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.netherstar",
+ true,
+ 20,
+ 60,
+ 60,
+ 2,
+ 24,
+ false,
+ false,
+ false,
+ Materials.GarnetSand,
+ Materials.NetherStar,
+ Materials.GarnetRed,
+ Materials.GarnetYellow);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.garnet",
+ true,
+ 10,
+ 30,
+ 40,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.GarnetRed,
+ Materials.GarnetYellow,
+ Materials.Chrysotile,
+ Materials.Realgar);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.rareearth",
+ true,
+ 30,
+ 60,
+ 40,
+ 2,
+ 24,
+ false,
+ false,
+ false,
+ Materials.Cadmium,
+ Materials.Caesium,
+ Materials.Lanthanum,
+ Materials.Cerium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.richnuclear",
+ true,
+ 55,
+ 120,
+ 5,
+ 2,
+ 8,
+ false,
+ false,
+ false,
+ Materials.Uranium,
+ Materials.Plutonium,
+ Materials.Thorium,
+ Materials.Thorium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.heavypentele",
+ true,
+ 40,
+ 60,
+ 60,
+ 5,
+ 32,
+ false,
+ false,
+ false,
+ Materials.Arsenic,
+ Materials.Bismuth,
+ Materials.Antimony,
+ Materials.Antimony);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.europa",
+ true,
+ 55,
+ 65,
+ 110,
+ 4,
+ 24,
+ false,
+ false,
+ false,
+ Materials.Magnesite,
+ Materials.BandedIron,
+ Materials.Sulfur,
+ Materials.Opal);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.europacore",
+ true,
+ 5,
+ 15,
+ 5,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Chrome,
+ Materials.Tungstate,
+ Materials.Molybdenum,
+ Materials.Manganese);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.secondlanthanid",
+ true,
+ 10,
+ 40,
+ 10,
+ 3,
+ 24,
+ false,
+ false,
+ false,
+ Materials.Samarium,
+ Materials.Neodymium,
+ Materials.Tartarite,
+ Materials.Tartarite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.quartzspace",
+ true,
+ 40,
+ 80,
+ 20,
+ 3,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Quartzite,
+ Materials.Barite,
+ Materials.CertusQuartz,
+ Materials.CertusQuartz);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.rutile",
+ true,
+ 5,
+ 20,
+ 8,
+ 4,
+ 12,
+ false,
+ false,
+ false,
+ Materials.Rutile,
+ Materials.Titanium,
+ Materials.Bauxite,
+ Materials.MeteoricIron);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.tfgalena",
+ true,
+ 5,
+ 35,
+ 40,
+ 4,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Galena,
+ Materials.Silver,
+ Materials.Lead,
+ Materials.Cryolite);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.luvtantalite",
+ true,
+ 20,
+ 30,
+ 10,
+ 4,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Pyrolusite,
+ Materials.Apatite,
+ Materials.Tantalite,
+ Materials.Pyrochlore);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.certusquartz",
+ true,
+ 40,
+ 80,
+ 60,
+ 5,
+ 32,
+ false,
+ false,
+ false,
+ Materials.CertusQuartz,
+ Materials.CertusQuartz,
+ Materials.CertusQuartzCharged,
+ Materials.QuartzSand);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.infinitycatalyst",
+ true,
+ 5,
+ 20,
+ 15,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Neutronium,
+ Materials.Adamantium,
+ Materials.InfinityCatalyst,
+ Materials.Bedrockium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.cosmicneutronium",
+ true,
+ 5,
+ 20,
+ 15,
+ 2,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Neutronium,
+ Materials.CosmicNeutronium,
+ Materials.BlackPlutonium,
+ Materials.Bedrockium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.dilithium",
+ true,
+ 30,
+ 100,
+ 30,
+ 3,
+ 24,
+ false,
+ false,
+ false,
+ Materials.Dilithium,
+ Materials.Dilithium,
+ Materials.MysteriousCrystal,
+ Materials.Vinteum);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.naquadria",
+ true,
+ 10,
+ 90,
+ 40,
+ 4,
+ 24,
+ false,
+ false,
+ false,
+ Materials.Naquadah,
+ Materials.NaquadahEnriched,
+ Materials.Naquadria,
+ Materials.Trinium);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.awakeneddraconium",
+ true,
+ 20,
+ 40,
+ 20,
+ 3,
+ 16,
+ false,
+ false,
+ false,
+ Materials.Draconium,
+ Materials.Draconium,
+ Materials.DraconiumAwakened,
+ Materials.NetherStar);
+ new GT_Worldgen_GT_Ore_Layer(
+ "ore.mix.tengam",
+ true,
+ 30,
+ 180,
+ 80,
+ 2,
+ 32,
+ false,
+ false,
+ false,
+ Materials.TengamRaw,
+ Materials.TengamRaw,
+ Materials.Electrotine,
+ Materials.Samarium);
+
+ // DO NOT DELETE V THIS V - this is needed so that gregtech generates its Ore Layer's first (the ones up there),
+ // which can then be transformed into "GT_Worldgen_GT_Ore_Layer_Space". Also, Reflexion is slow.
+ try {
+ Class<?> clazz = Class.forName("bloodasp.galacticgreg.WorldGenGaGT");
+ Constructor<?> constructor = clazz.getConstructor();
+ Method method = clazz.getMethod("run");
+ method.invoke(constructor.newInstance());
+ GT_Log.out.println("Started Galactic Greg ore gen code");
+ // this function calls Galactic Greg and enables its generation.
+ } catch (Exception e) {
+ // ClassNotFound is expected if Galactic Greg is absent, so only report if other problem
+ if (!(e instanceof ClassNotFoundException)) {
+ GT_Log.err.println("Unable to start Galactic Greg ore gen code");
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ // DO NOT DELETE ^ THIS ^
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/PartP2PGTPower.java b/src/main/java/gregtech/loaders/postload/PartP2PGTPower.java
new file mode 100644
index 0000000000..389ac1cc57
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/PartP2PGTPower.java
@@ -0,0 +1,104 @@
+package gregtech.loaders.postload;
+
+import java.lang.reflect.Field;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import appeng.api.networking.IGridNode;
+import appeng.api.networking.ticking.IGridTickable;
+import appeng.api.networking.ticking.TickRateModulation;
+import appeng.api.networking.ticking.TickingRequest;
+import appeng.parts.AEBasePart;
+import appeng.parts.p2p.PartP2PIC2Power;
+import gregtech.api.interfaces.tileentity.IEnergyConnected;
+import gregtech.api.util.GT_Log;
+
+public class PartP2PGTPower extends PartP2PIC2Power implements IGridTickable {
+
+ public PartP2PGTPower(ItemStack is) {
+ super(is);
+ }
+
+ public final World getWorld() {
+ return getTile().getWorldObj();
+ }
+
+ public final int getXCoord() {
+ return getTile().xCoord;
+ }
+
+ public final short getYCoord() {
+ return (short) getTile().yCoord;
+ }
+
+ public final int getZCoord() {
+ return getTile().zCoord;
+ }
+
+ public final int getOffsetX(ForgeDirection side, int aMultiplier) {
+ return getXCoord() + side.offsetX * aMultiplier;
+ }
+
+ public final short getOffsetY(ForgeDirection side, int aMultiplier) {
+ return (short) (getYCoord() + side.offsetY * aMultiplier);
+ }
+
+ public final int getOffsetZ(ForgeDirection side, int aMultiplier) {
+ return getZCoord() + side.offsetZ * aMultiplier;
+ }
+
+ public final TileEntity getTileEntity(int aX, int aY, int aZ) {
+ return getWorld().getTileEntity(aX, aY, aZ);
+ }
+
+ public final TileEntity getTileEntityAtSide(ForgeDirection side) {
+ final int tX = getOffsetX(side, 1);
+ final int tY = getOffsetY(side, 1);
+ final int tZ = getOffsetZ(side, 1);
+ return getWorld().getTileEntity(tX, tY, tZ);
+ }
+
+ public boolean outputEnergy() {
+ if (getOfferedEnergy() == 0) {
+ return false;
+ }
+ final TileEntity te = getTileEntityAtSide(getSide());
+ if (te instanceof IEnergyConnected energyConnected) {
+ long voltage = 8L << (getSourceTier() * 2);
+ if (voltage > getOfferedEnergy()) {
+ voltage = (long) getOfferedEnergy();
+ }
+ if (energyConnected.injectEnergyUnits(getSide().getOpposite(), voltage, 1) > 0) {
+ drawEnergy(voltage);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public TickingRequest getTickingRequest(IGridNode iGridNode) {
+ return new TickingRequest(1, 20, false, false);
+ }
+
+ @Override
+ public TickRateModulation tickingRequest(IGridNode iGridNode, int i) {
+ return outputEnergy() ? TickRateModulation.FASTER : TickRateModulation.SLOWER;
+ }
+
+ @Override
+ public ForgeDirection getSide() {
+ try {
+ Field fSide = AEBasePart.class.getDeclaredField("side");
+ fSide.setAccessible(true);
+ return (ForgeDirection) fSide.get(this);
+ } catch (Exception e) {
+ GT_Log.out.println("A fatal error occured at the P2P tunnel for GT electricity");
+ e.printStackTrace(GT_Log.out);
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/chains/GT_BauxiteRefineChain.java b/src/main/java/gregtech/loaders/postload/chains/GT_BauxiteRefineChain.java
new file mode 100644
index 0000000000..aaf25812e4
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/chains/GT_BauxiteRefineChain.java
@@ -0,0 +1,297 @@
+package gregtech.loaders.postload.chains;
+
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
+import static gregtech.api.recipe.RecipeMaps.crackingRecipes;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.recipe.RecipeMaps.multiblockChemicalReactorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsOreAlum;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class GT_BauxiteRefineChain {
+
+ public static void run() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Bauxite, 32),
+ Materials.SodiumHydroxide.getDust(9),
+ Materials.Quicklime.getDust(4),
+ GT_Utility.getIntegratedCircuit(8))
+ .fluidInputs(Materials.Water.getFluid(5000))
+ .fluidOutputs(MaterialsOreAlum.BauxiteSlurry.getFluid(8000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Bauxite, 32),
+ Materials.SodiumHydroxide.getDust(9),
+ Materials.Quicklime.getDust(4),
+ GT_Utility.getIntegratedCircuit(8))
+ .fluidInputs(Materials.Water.getFluid(5000))
+ .fluidOutputs(MaterialsOreAlum.BauxiteSlurry.getFluid(8000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(MaterialsOreAlum.BauxiteSlurry.getFluid(32000), GT_ModHandler.getSteam(2000))
+ .fluidOutputs(MaterialsOreAlum.HeatedBauxiteSlurry.getFluid(32000))
+ .duration(8 * SECONDS)
+ .eut(400)
+ .addTo(crackingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Aluminiumhydroxide.getDust(1))
+ .itemOutputs(
+ Materials.Aluminiumoxide.getDust(64),
+ Materials.Aluminiumoxide.getDust(16),
+ Materials.SodiumCarbonate.getDust(9),
+ Materials.Calcite.getDust(10),
+ MaterialsOreAlum.BauxiteSlag.getDust(16))
+ .fluidInputs(Materials.CarbonDioxide.getGas(5000), MaterialsOreAlum.HeatedBauxiteSlurry.getFluid(8000))
+ .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(5000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(MaterialsOreAlum.BauxiteSlag.getDust(1))
+ .itemOutputs(
+ Materials.Rutile.getDust(1),
+ Materials.Gallium.getDust(1),
+ Materials.Quicklime.getDust(1),
+ Materials.SiliconDioxide.getDust(1),
+ Materials.Iron.getDust(1))
+ .outputChances(10000, 3000, 2000, 9000, 8000)
+ .duration(2 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Ilmenite, 1))
+ .itemOutputs(Materials.Rutile.getDust(2), MaterialsOreAlum.IlmeniteSlag.getDust(1))
+ .outputChances(10000, 3000)
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .fluidOutputs(new FluidStack(ItemList.sGreenVitriol, 2000))
+ .duration(21 * SECONDS)
+ .eut(1000)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Ilmenite, 1))
+ .itemOutputs(Materials.Rutile.getDust(2), MaterialsOreAlum.IlmeniteSlag.getDust(1))
+ .outputChances(10000, 6000)
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .fluidOutputs(new FluidStack(ItemList.sGreenVitriol, 2000))
+ .duration(21 * SECONDS)
+ .eut(1000)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(MaterialsOreAlum.IlmeniteSlag.getDust(1))
+ .itemOutputs(
+ Materials.Iron.getDust(1),
+ Materials.Niobium.getDust(1),
+ Materials.Tantalum.getDust(1),
+ Materials.Manganese.getDust(1),
+ Materials.Magnesium.getDust(1))
+ .outputChances(8000, 500, 2000, 5000, 6000)
+ .duration(2 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(centrifugeRecipes);
+
+ OrePrefixes[] washable = new OrePrefixes[] { OrePrefixes.crushed, OrePrefixes.crushedPurified,
+ OrePrefixes.dustImpure, OrePrefixes.dustPure };
+
+ for (OrePrefixes ore : washable) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(ore, Materials.Sapphire, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.SodiumHydroxide, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(MaterialsOreAlum.SapphireJuice.getFluid(1000))
+ .duration(2 * SECONDS)
+ .eut(100)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(ore, Materials.GreenSapphire, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.SodiumHydroxide, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(MaterialsOreAlum.GreenSapphireJuice.getFluid(1000))
+ .duration(2 * SECONDS)
+ .eut(100)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(ore, Materials.Ruby, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.SodiumHydroxide, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(MaterialsOreAlum.RubyJuice.getFluid(1000))
+ .duration(2 * SECONDS)
+ .eut(100)
+ .addTo(mixerRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(
+ Materials.Aluminiumhydroxide.getDust(3),
+ Materials.Iron.getDust(1),
+ Materials.Vanadium.getDust(1),
+ Materials.Magnesium.getDust(1))
+ .outputChances(10000, 300, 200, 200)
+ .fluidInputs(MaterialsOreAlum.SapphireJuice.getFluid(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(2 * SECONDS + 5 * TICKS)
+ .eut(100)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(
+ Materials.Aluminiumhydroxide.getDust(3),
+ Materials.Iron.getDust(1),
+ Materials.Vanadium.getDust(1),
+ Materials.Manganese.getDust(1),
+ Materials.Beryllium.getDust(1))
+ .outputChances(10000, 300, 200, 200, 200)
+ .fluidInputs(MaterialsOreAlum.GreenSapphireJuice.getFluid(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(2 * SECONDS + 5 * TICKS)
+ .eut(100)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(
+ Materials.Aluminiumhydroxide.getDust(3),
+ Materials.Chrome.getDust(1),
+ Materials.Iron.getDust(1),
+ Materials.Vanadium.getDust(1),
+ Materials.Magnesium.getDust(1))
+ .outputChances(10000, 5000, 300, 200, 200)
+ .fluidInputs(MaterialsOreAlum.RubyJuice.getFluid(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(2 * SECONDS + 5 * TICKS)
+ .eut(100)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Pyrope.getDust(1))
+ .itemOutputs(
+ Materials.Aluminiumoxide.getDust(1),
+ Materials.Magnesia.getDust(1),
+ Materials.Silver.getDust(1),
+ Materials.Iron.getDust(1),
+ Materials.Calcite.getDust(1),
+ Materials.Vanadium.getDust(1))
+ .outputChances(5000, 4000, 300, 300, 300, 200)
+ .fluidInputs(Materials.NitricAcid.getFluid(10))
+ .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
+ .duration(2 * SECONDS + 5 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Almandine.getDust(1))
+ .itemOutputs(
+ Materials.Aluminiumoxide.getDust(1),
+ Materials.Iron.getDust(1),
+ Materials.Gold.getDust(1),
+ Materials.Calcite.getDust(1),
+ Materials.Chrome.getDust(1),
+ Materials.Vanadium.getDust(1))
+ .outputChances(5000, 4000, 300, 300, 200, 200)
+ .fluidInputs(Materials.NitricAcid.getFluid(10))
+ .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
+ .duration(2 * SECONDS + 5 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Spessartine.getDust(1))
+ .itemOutputs(
+ Materials.Aluminiumoxide.getDust(1),
+ Materials.Pyrolusite.getDust(1),
+ Materials.Iron.getDust(1),
+ Materials.Calcite.getDust(1),
+ Materials.Magnesium.getDust(1),
+ Materials.Tantalum.getDust(1))
+ .outputChances(5000, 4000, 300, 300, 300, 200)
+ .fluidInputs(Materials.NitricAcid.getFluid(10))
+ .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
+ .duration(2 * SECONDS + 5 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Andradite.getDust(1))
+ .itemOutputs(
+ Materials.Quicklime.getDust(1),
+ Materials.Iron.getDust(1),
+ Materials.Aluminiumoxide.getDust(1),
+ Materials.Gold.getDust(1),
+ Materials.Vanadium.getDust(1),
+ Materials.Rutile.getDust(1))
+ .outputChances(5000, 4000, 300, 300, 200, 600)
+ .fluidInputs(Materials.NitricAcid.getFluid(10))
+ .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
+ .duration(2 * SECONDS + 5 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Uvarovite.getDust(1))
+ .itemOutputs(
+ Materials.Quicklime.getDust(1),
+ Materials.Chrome.getDust(1),
+ Materials.Iron.getDust(1),
+ Materials.Silver.getDust(1),
+ Materials.Aluminiumoxide.getDust(1),
+ Materials.Manganese.getDust(1))
+ .outputChances(5000, 1000, 300, 300, 200, 200)
+ .fluidInputs(Materials.NitricAcid.getFluid(10))
+ .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
+ .duration(2 * SECONDS + 5 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Grossular.getDust(1))
+ .itemOutputs(
+ Materials.Quicklime.getDust(1),
+ Materials.Aluminiumoxide.getDust(1),
+ Materials.Iron.getDust(1),
+ Materials.Gold.getDust(1),
+ Materials.Calcite.getDust(1),
+ Materials.Vanadium.getDust(1))
+ .outputChances(5000, 4000, 300, 300, 300, 200)
+ .fluidInputs(Materials.NitricAcid.getFluid(10))
+ .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(10))
+ .duration(2 * SECONDS + 5 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(centrifugeRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/chains/GT_NaniteChain.java b/src/main/java/gregtech/loaders/postload/chains/GT_NaniteChain.java
new file mode 100644
index 0000000000..dabcd93a8d
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/chains/GT_NaniteChain.java
@@ -0,0 +1,240 @@
+package gregtech.loaders.postload.chains;
+
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GoodGenerator;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.HOURS;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.AssemblyLine;
+import static gregtech.api.util.GT_RecipeConstants.RESEARCH_ITEM;
+import static gregtech.api.util.GT_RecipeConstants.RESEARCH_TIME;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeBuilder;
+
+public class GT_NaniteChain {
+
+ public static void run() {
+
+ ItemStack aUVTierLens = getModItem(NewHorizonsCoreMod.ID, "item.MysteriousCrystalLens", 0);
+ ItemStack aUHVTierLens = getModItem(NewHorizonsCoreMod.ID, "item.ChromaticLens", 0);
+ ItemStack aUEVTierLens = getModItem(NewHorizonsCoreMod.ID, "item.RadoxPolymerLens", 0);
+ ItemStack aUIVTierLens = ItemList.EnergisedTesseract.get(0);
+ ItemStack aUMVTierLens = GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Dilithium, 0, false);
+
+ // Carbon Nanite Recipe Before Nano Forge
+ Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null
+ ? FluidRegistry.getFluid("molten.indalloy140")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, Materials.Carbon.getNanite(1))
+ .metadata(RESEARCH_TIME, 1 * HOURS)
+ .itemInputs(
+ ItemList.Hull_UV.get(16),
+ Materials.Carbon.getNanite(16),
+ ItemList.Field_Generator_ZPM.get(16),
+ ItemList.Conveyor_Module_UV.get(16),
+ ItemList.Electric_Motor_UV.get(32),
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 16 },
+ GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 32))
+ .fluidInputs(
+ new FluidStack(solderIndalloy, 144 * 32),
+ Materials.HSSS.getMolten(144L * 32),
+ Materials.Osmiridium.getMolten(144L * 16))
+ .itemOutputs(ItemList.NanoForge.get(1))
+ .eut(TierEU.RECIPE_ZPM)
+ .duration(5 * MINUTES)
+ .addTo(AssemblyLine);
+
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Circuit_Crystalmainframe.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 16 },
+ ItemList.Robot_Arm_UV.get(16),
+ ItemList.Circuit_Chip_Stemcell.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.NaquadahAlloy, 32),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.NaquadahAlloy, 16),
+ Materials.Carbon.getDust(64))
+ .fluidInputs(Materials.UUMatter.getFluid(10000), new FluidStack(solderIndalloy, 144 * 32))
+ .itemOutputs(Materials.Carbon.getNanite(2))
+ .eut(TierEU.RECIPE_UV)
+ .duration(50 * SECONDS)
+ .addTo(AssemblyLine);
+
+ /*
+ * General Rules for making nanite recipes: 1. Never make a nanite that takes a long time to make and only gives
+ * 1, just to be consumed. 2. Nanites meant to be consumed should either have a short duration or a big output.
+ * 3. Nanites which aren't consumed should have a long duration and output less than 16. 4. Nanites should
+ * always take UUM as a fluid and a lot of power to make.
+ */
+
+ // Carbon Nanites - Used to make more Nano Forge Controllers
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] { aUVTierLens, getModItem(BartWorks.ID, "bw.werkstoffblockscasingadvanced.01", 8, 31776),
+ ItemList.Circuit_Chip_SoC.get(64) },
+ new FluidStack[] { Materials.UUMatter.getFluid(200_000) },
+ new ItemStack[] { Materials.Carbon.getNanite(64), },
+ null,
+ null,
+ 500 * 20,
+ 10_000_000,
+ 1);
+
+ // Silver Nanites - Used in Tier 2 PCB Factory to improve board production
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] { aUEVTierLens, Materials.Silver.getBlocks(8), ItemList.Circuit_Chip_SoC.get(16) },
+ new FluidStack[] { Materials.UUMatter.getFluid(200000) },
+ new ItemStack[] { Materials.Silver.getNanite(1) },
+ null,
+ null,
+ 750 * 20,
+ 10_000_000,
+ 2);
+
+ // Neutronium Nanites - Used to upgrade the Nano Forge to Tier 2
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] { aUHVTierLens, Materials.Neutronium.getBlocks(8), ItemList.Circuit_Chip_SoC2.get(64),
+ ItemList.Circuit_Chip_SoC2.get(32) },
+ new FluidStack[] { Materials.UUMatter.getFluid(200000) },
+ new ItemStack[] { Materials.Neutronium.getNanite(1) },
+ null,
+ null,
+ 100 * 20,
+ 100_000_000,
+ 1);
+
+ // Glowstone Nanites - Used in the optical circuit line
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] { aUEVTierLens, getModItem(GTPlusPlus.ID, "blockCompressedObsidian", 8, 7), // Double
+ // compressed
+ // glowstone
+ // blocks
+ // (yes, it's
+ // not
+ // obsidian)
+ ItemList.Circuit_Chip_SoC2.get(64) },
+ new FluidStack[] { Materials.UUMatter.getFluid(50000) },
+ new ItemStack[] { Materials.Glowstone.getNanite(64) },
+ null,
+ null,
+ 200 * 20,
+ 50_000_000,
+ 2);
+
+ // Gold Nanites - Used in Tier 3 PCB Factory to improve board production
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] { aUMVTierLens, Materials.Gold.getBlocks(8), ItemList.Circuit_Chip_SoC.get(16) },
+ new FluidStack[] { Materials.UUMatter.getFluid(300000) },
+ new ItemStack[] { Materials.Gold.getNanite(1) },
+ null,
+ null,
+ 1_000 * 20,
+ 100_000_000,
+ 3);
+
+ // Transcendent Metal Nanites - Used to upgrade the Nano Forge to Tier 3
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] { aUIVTierLens, MaterialsUEVplus.TranscendentMetal.getBlocks(8),
+ ItemList.Circuit_Chip_SoC2.get(64), ItemList.Circuit_Chip_SoC2.get(64),
+ ItemList.Circuit_Chip_SoC2.get(64) },
+ new FluidStack[] { Materials.UUMatter.getFluid(2000000) },
+ new ItemStack[] { MaterialsUEVplus.TranscendentMetal.getNanite(1) },
+ null,
+ null,
+ 750 * 20,
+ 1_000_000_000,
+ 2);
+
+ // White Dwarf Matter Nanites. Used to make Magnetohydrodynamically constrained star matter.
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] { aUMVTierLens, getModItem(BartWorks.ID, "gt.bwMetaGeneratedlens", 0, 36), // Magneto
+ // lens
+ getModItem(GTPlusPlus.ID, "MU-metaitem.01", 0, 32105), // Quantum Anomaly, couldn't find any
+ // better naming
+ MaterialsUEVplus.WhiteDwarfMatter.getBlocks(8), getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 32),
+ getModItem(GoodGenerator.ID, "huiCircuit", 1, 4) // Paradox circuit
+ },
+ new FluidStack[] { Materials.UUMatter.getFluid(500_000), MaterialsUEVplus.RawStarMatter.getFluid(50_000),
+ MaterialsUEVplus.Space.getMolten(720), },
+ new ItemStack[] { MaterialsUEVplus.WhiteDwarfMatter.getNanite(4) },
+ null,
+ null,
+ 750 * 20,
+ 2_000_000_000,
+ 3);
+
+ // Black Dwarf Matter Nanites. Used to make Magnetohydrodynamically constrained star matter.
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] { aUMVTierLens, getModItem(BartWorks.ID, "gt.bwMetaGeneratedlens", 0, 36), // Magneto
+ // lens
+ getModItem(GTPlusPlus.ID, "MU-metaitem.01", 0, 32105), // Quantum Anomaly, couldn't find any
+ // better naming
+ MaterialsUEVplus.BlackDwarfMatter.getBlocks(8), getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 32),
+ getModItem(GoodGenerator.ID, "huiCircuit", 1, 4) // Paradox circuit
+ },
+ new FluidStack[] { Materials.UUMatter.getFluid(500_000), MaterialsUEVplus.RawStarMatter.getFluid(50_000),
+ MaterialsUEVplus.Time.getMolten(720), },
+ new ItemStack[] { MaterialsUEVplus.BlackDwarfMatter.getNanite(4) },
+ null,
+ null,
+ 750 * 20,
+ 2_000_000_000,
+ 3);
+
+ // Universium nanites.
+ GT_Values.RA.addNanoForgeRecipe(
+ new ItemStack[] { aUMVTierLens,
+ // Quantum Anomaly, couldn't find any better naming.
+ getModItem(GTPlusPlus.ID, "MU-metaitem.01", 0, 32105), MaterialsUEVplus.Universium.getBlocks(8),
+
+ ItemList.Optically_Perfected_CPU.get(16), ItemList.Optically_Compatible_Memory.get(16),
+ getModItem(GoodGenerator.ID, "huiCircuit", 1, 4) // Paradox circuit
+ },
+ new FluidStack[] { MaterialsUEVplus.SpaceTime.getMolten(144), Materials.Infinity.getMolten(576),
+ MaterialsUEVplus.PrimordialMatter.getFluid(64_000), },
+ new ItemStack[] { MaterialsUEVplus.Universium.getNanite(2) },
+ null,
+ null,
+ 750 * 20,
+ 2_000_000_000,
+ 3);
+
+ // Eternity nanites
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Forcicium, 0, false),
+ // Quantum Anomaly
+ getModItem(GTPlusPlus.ID, "MU-metaitem.01", 0, 32105),
+ MaterialsUEVplus.TranscendentMetal.getNanite(1),
+ MaterialsUEVplus.Eternity.getBlocks(8),
+ getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 32),
+ ItemList.Timepiece.get(4))
+ .itemOutputs(MaterialsUEVplus.Eternity.getNanite(4))
+ .fluidInputs(
+ MaterialsUEVplus.Space.getMolten(1152),
+ MaterialsUEVplus.ExcitedDTSC.getFluid(50000),
+ MaterialsUEVplus.PrimordialMatter.getFluid(64_000))
+ .duration(750 * GT_RecipeBuilder.SECONDS)
+ .eut(TierEU.RECIPE_MAX)
+ .specialValue(3)
+ .addTo(RecipeMaps.nanoForgeRecipes);
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/chains/GT_PCBFactoryRecipes.java b/src/main/java/gregtech/loaders/postload/chains/GT_PCBFactoryRecipes.java
new file mode 100644
index 0000000000..392e6fa154
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/chains/GT_PCBFactoryRecipes.java
@@ -0,0 +1,702 @@
+package gregtech.loaders.postload.chains;
+
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.recipe.metadata.PCBFactoryUpgrade.BIO;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.AssemblyLine;
+import static gregtech.api.util.GT_RecipeConstants.RESEARCH_ITEM;
+import static gregtech.api.util.GT_RecipeConstants.RESEARCH_TIME;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.metadata.PCBFactoryTierKey;
+import gregtech.api.recipe.metadata.PCBFactoryUpgradeKey;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_PCBFactoryManager;
+import gregtech.api.util.GT_Utility;
+
+@SuppressWarnings("SpellCheckingInspection")
+public class GT_PCBFactoryRecipes {
+
+ private static final PCBFactoryTierKey TIER = PCBFactoryTierKey.INSTANCE;
+ private static final PCBFactoryUpgradeKey UPGRADE = PCBFactoryUpgradeKey.INSTANCE;
+
+ public static void load() {
+ final Fluid solderLuV = FluidRegistry.getFluid("molten.indalloy140") != null
+ ? FluidRegistry.getFluid("molten.indalloy140")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+
+ // Load Multi Recipes
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Circuit_Board_Wetware.get(1))
+ .metadata(RESEARCH_TIME, 3 * MINUTES)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 32),
+ ItemList.Machine_ZPM_CircuitAssembler.get(4),
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 16 },
+ ItemList.Robot_Arm_ZPM.get(8))
+ .fluidInputs(new FluidStack(solderLuV, 144 * 36), Materials.Naquadah.getMolten(144 * 18))
+ .itemOutputs(ItemList.PCBFactory.get(1))
+ .eut(TierEU.RECIPE_UV)
+ .duration(5 * MINUTES)
+ .addTo(AssemblyLine);
+
+ if (GTPlusPlus.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1),
+ Materials.get("Artherium-Sn")
+ .getPlates(6))
+ .itemOutputs(ItemList.BasicPhotolithographicFrameworkCasing.get(1))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Infinity, 1),
+ Materials.EnrichedHolmium.getPlates(6))
+ .itemOutputs(ItemList.ReinforcedPhotolithographicFrameworkCasing.get(1))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_ModHandler.getModItem(GTPlusPlus.ID, "blockFrameGtCelestialTungsten", 1),
+ Materials.get("Quantum")
+ .getPlates(6))
+ .itemOutputs(ItemList.RadiationProofPhotolithographicFrameworkCasing.get(1))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_UIV)
+ .addTo(assemblerRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_ModHandler.getModItem(GTPlusPlus.ID, "blockFrameGtHypogen", 1),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Infinity, 2),
+ Materials.Thulium.getPlates(6))
+ .itemOutputs(ItemList.InfinityCooledCasing.get(1))
+ .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(8 * 144))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(assemblerRecipes);
+ }
+
+ // Load CircuitBoard Recipes
+
+ // Plastic Circuit Board
+ for (int tier = 1; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 1))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(64));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.AnnealedCopper, (long) (16 * (Math.sqrt(tier)))),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Copper, (long) (16 * (Math.sqrt(tier)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier)))),
+ Materials.IronIIIChloride.getFluid((long) (250 * (Math.sqrt(tier)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 1.5))))
+ .eut((int) GT_Values.VP[tier] * 3 / 4)
+ .metadata(TIER, 1)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 1; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 0.5))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(64));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(2),
+ GT_Utility.getNaniteAsCatalyst(Materials.Silver),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.AnnealedCopper, (long) (16 * (Math.sqrt(tier)))),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Copper, (long) (16 * (Math.sqrt(tier)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier)))),
+ Materials.IronIIIChloride.getFluid((long) (250 * (Math.sqrt(tier)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 1.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 2)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 1; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(64));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Plastic_Advanced.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(3),
+ GT_Utility.getNaniteAsCatalyst(Materials.Gold),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.AnnealedCopper, (long) (16 * (Math.sqrt(tier)))),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Copper, (long) (16 * (Math.sqrt(tier)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier)))),
+ Materials.IronIIIChloride.getFluid((long) (250 * (Math.sqrt(tier)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 1.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 3)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+
+ // Advanced Circuit Board
+ for (int tier = 2; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 2))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gold, (long) (16 * (Math.sqrt(tier - 1)))),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, (long) (16 * (Math.sqrt(tier - 1)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 1)))),
+ Materials.IronIIIChloride.getFluid((long) (500 * (Math.sqrt(tier - 1)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 2.5))))
+ .eut((int) GT_Values.VP[tier] * 3 / 4)
+ .metadata(TIER, 1)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 2; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 1.5))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(2),
+ GT_Utility.getNaniteAsCatalyst(Materials.Silver),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gold, (long) (16 * (Math.sqrt(tier - 1)))),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, (long) (16 * (Math.sqrt(tier - 1)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 1)))),
+ Materials.IronIIIChloride.getFluid((long) (500 * (Math.sqrt(tier - 1)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 2.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 2)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 2; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 1))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Epoxy_Advanced.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(3),
+ GT_Utility.getNaniteAsCatalyst(Materials.Gold),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gold, (long) (16 * (Math.sqrt(tier - 1)))),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, (long) (16 * (Math.sqrt(tier - 1)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 1)))),
+ Materials.IronIIIChloride.getFluid((long) (500 * (Math.sqrt(tier - 1)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 2.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 3)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+
+ // More Advanced Circuit Board
+ for (int tier = 3; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 3))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.Aluminium, (long) (16 * (Math.sqrt(tier - 2)))),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.EnergeticAlloy, (long) (16 * (Math.sqrt(tier - 2)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 2)))),
+ Materials.IronIIIChloride.getFluid((long) (1000 * (Math.sqrt(tier - 2)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 3.5))))
+ .eut((int) GT_Values.VP[tier] * 3 / 4)
+ .metadata(TIER, 1)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 3; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 2.5))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(2),
+ GT_Utility.getNaniteAsCatalyst(Materials.Silver),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.Aluminium, (long) (16 * (Math.sqrt(tier - 2)))),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.EnergeticAlloy, (long) (16 * (Math.sqrt(tier - 2)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 2)))),
+ Materials.IronIIIChloride.getFluid((long) (1000 * (Math.sqrt(tier - 2)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 3.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 2)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 3; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 2))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Fiberglass_Advanced.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(3),
+ GT_Utility.getNaniteAsCatalyst(Materials.Gold),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.Aluminium, (long) (16 * (Math.sqrt(tier - 2)))),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.EnergeticAlloy, (long) (16 * (Math.sqrt(tier - 2)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 2)))),
+ Materials.IronIIIChloride.getFluid((long) (1000 * (Math.sqrt(tier - 2)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 3.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 3)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+
+ // Elite Circuit Board
+ for (int tier = 4; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 4))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.Palladium, (long) (16 * (Math.sqrt(tier - 3)))),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Platinum, (long) (16 * (Math.sqrt(tier - 3)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 3)))),
+ Materials.IronIIIChloride.getFluid((long) (2000 * (Math.sqrt(tier - 3)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 4.5))))
+ .eut((int) GT_Values.VP[tier] * 3 / 4)
+ .metadata(TIER, 1)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 4; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 3.5))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(2),
+ GT_Utility.getNaniteAsCatalyst(Materials.Silver),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.Palladium, (long) (16 * (Math.sqrt(tier - 3)))),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Platinum, (long) (16 * (Math.sqrt(tier - 3)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 3)))),
+ Materials.IronIIIChloride.getFluid((long) (2000 * (Math.sqrt(tier - 3)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 4.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 2)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 4; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 3))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Multifiberglass_Elite.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(3),
+ GT_Utility.getNaniteAsCatalyst(Materials.Gold),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.Palladium, (long) (16 * (Math.sqrt(tier - 3)))),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Platinum, (long) (16 * (Math.sqrt(tier - 3)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 3)))),
+ Materials.IronIIIChloride.getFluid((long) (2000 * (Math.sqrt(tier - 3)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 4.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 3)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+
+ // Wetware Circuit Board
+ for (int tier = 5; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 5))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.EnrichedHolmium, (long) (16 * (Math.sqrt(tier - 4)))),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.NiobiumTitanium, (long) (16 * (Math.sqrt(tier - 4)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 4)))),
+ Materials.IronIIIChloride.getFluid((long) (5000 * (Math.sqrt(tier - 4)))),
+ Materials.GrowthMediumSterilized.getFluid((long) (2000 * (Math.sqrt(tier - 4)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
+ .eut((int) GT_Values.VP[tier] * 3 / 4)
+ .metadata(TIER, 1)
+ .metadata(UPGRADE, BIO)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 5; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 4.5))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(2),
+ GT_Utility.getNaniteAsCatalyst(Materials.Silver),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.EnrichedHolmium, (long) (16 * (Math.sqrt(tier - 4)))),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.NiobiumTitanium, (long) (16 * (Math.sqrt(tier - 4)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 4)))),
+ Materials.IronIIIChloride.getFluid((long) (5000 * (Math.sqrt(tier - 4)))),
+ Materials.GrowthMediumSterilized.getFluid((long) (2000 * (Math.sqrt(tier - 4)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 2)
+ .metadata(UPGRADE, BIO)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 5; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 4))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Wetware_Extreme.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(3),
+ GT_Utility.getNaniteAsCatalyst(Materials.Gold),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.EnrichedHolmium, (long) (16 * (Math.sqrt(tier - 4)))),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.NiobiumTitanium, (long) (16 * (Math.sqrt(tier - 4)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 4)))),
+ Materials.IronIIIChloride.getFluid((long) (5000 * (Math.sqrt(tier - 4)))),
+ Materials.GrowthMediumSterilized.getFluid((long) (2000 * (Math.sqrt(tier - 4)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 3)
+ .metadata(UPGRADE, BIO)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+
+ // Bioware Circuit Board
+ for (int tier = 6; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 6))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil,
+ Materials.Longasssuperconductornameforuvwire,
+ (long) (16 * (Math.sqrt(tier - 5)))),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.Neutronium, (long) (16 * (Math.sqrt(tier - 5)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 5)))),
+ Materials.IronIIIChloride.getFluid((long) (7500 * (Math.sqrt(tier - 5)))),
+ Materials.BioMediumSterilized.getFluid((long) (4000 * (Math.sqrt(tier - 5)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
+ .eut((int) GT_Values.VP[tier] * 3 / 4)
+ .metadata(TIER, 1)
+ .metadata(UPGRADE, BIO)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 6; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 5.5))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(2),
+ GT_Utility.getNaniteAsCatalyst(Materials.Silver),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil,
+ Materials.Longasssuperconductornameforuvwire,
+ (long) (16 * (Math.sqrt(tier - 5)))),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.Neutronium, (long) (16 * (Math.sqrt(tier - 5)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 5)))),
+ Materials.IronIIIChloride.getFluid((long) (7500 * (Math.sqrt(tier - 5)))),
+ Materials.BioMediumSterilized.getFluid((long) (4000 * (Math.sqrt(tier - 5)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 6.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 2)
+ .metadata(UPGRADE, BIO)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 6; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 5))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Bio_Ultra.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(3),
+ GT_Utility.getNaniteAsCatalyst(Materials.Gold),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.foil,
+ Materials.Longasssuperconductornameforuvwire,
+ (long) (16 * (Math.sqrt(tier - 5)))),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.Neutronium, (long) (16 * (Math.sqrt(tier - 5)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 5)))),
+ Materials.IronIIIChloride.getFluid((long) (7500 * (Math.sqrt(tier - 5)))),
+ Materials.BioMediumSterilized.getFluid((long) (4000 * (Math.sqrt(tier - 5)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 6.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 3)
+ .metadata(UPGRADE, BIO)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+
+ if (GTPlusPlus.isModLoaded()) {
+ // Optical Circuit Board
+ for (int tier = 7; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 7))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Optical.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Optical.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_ModHandler.getModItem(
+ BartWorks.ID,
+ "gt.bwMetaGeneratedfoil",
+ (long) (16 * (Math.sqrt(tier - 6))),
+ 10106),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.InfinityCatalyst, (long) (16 * (Math.sqrt(tier - 6)))),
+ GT_ModHandler
+ .getModItem("miscutils", "itemFoilChromaticGlass", (long) (16 * (Math.sqrt(tier - 6)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 6)))),
+ Materials.IronIIIChloride.getFluid((long) (12500 * (Math.sqrt(tier - 6)))),
+ Materials.MysteriousCrystal.getMolten((long) (2880 * (Math.sqrt(tier - 6)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(600 / Math.sqrt(Math.pow(1.5, tier - 5.5))))
+ .eut((int) GT_Values.VP[tier] * 3 / 4)
+ .metadata(TIER, 1)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 7; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 6.5))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Optical.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Optical.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(2),
+ GT_Utility.getNaniteAsCatalyst(Materials.Silver),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_ModHandler.getModItem(
+ BartWorks.ID,
+ "gt.bwMetaGeneratedfoil",
+ (long) (16 * (Math.sqrt(tier - 6))),
+ 10106),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.InfinityCatalyst, (long) (16 * (Math.sqrt(tier - 6)))),
+ GT_ModHandler
+ .getModItem("miscutils", "itemFoilChromaticGlass", (long) (16 * (Math.sqrt(tier - 6)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 6)))),
+ Materials.IronIIIChloride.getFluid((long) (12500 * (Math.sqrt(tier - 6)))),
+ Materials.MysteriousCrystal.getMolten((long) (2880 * (Math.sqrt(tier - 6)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(500 / Math.sqrt(Math.pow(1.5, tier - 6.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 2)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ for (int tier = 7; tier <= GT_PCBFactoryManager.mTiersOfPlastics; tier++) {
+ int amountOfBoards = (int) Math.ceil(8 * (Math.sqrt(Math.pow(2, tier - 6))));
+ List<ItemStack> aBoards = new ArrayList<>();
+ for (int i = amountOfBoards; i > 64; i -= 64) {
+ aBoards.add(ItemList.Circuit_Board_Optical.get(i));
+ amountOfBoards -= 64;
+ }
+ aBoards.add(ItemList.Circuit_Board_Optical.get(amountOfBoards));
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(3),
+ GT_Utility.getNaniteAsCatalyst(Materials.Gold),
+ GT_PCBFactoryManager.getPlasticMaterialFromTier(tier)
+ .getPlates(1),
+ GT_ModHandler.getModItem(
+ BartWorks.ID,
+ "gt.bwMetaGeneratedfoil",
+ (long) (16 * (Math.sqrt(tier - 6))),
+ 10106),
+ GT_OreDictUnificator
+ .get(OrePrefixes.foil, Materials.InfinityCatalyst, (long) (16 * (Math.sqrt(tier - 6)))),
+ GT_ModHandler
+ .getModItem("miscutils", "itemFoilChromaticGlass", (long) (16 * (Math.sqrt(tier - 6)))))
+ .fluidInputs(
+ Materials.SulfuricAcid.getFluid((long) (500 * (Math.sqrt(tier - 6)))),
+ Materials.IronIIIChloride.getFluid((long) (12500 * (Math.sqrt(tier - 6)))),
+ Materials.MysteriousCrystal.getMolten((long) (2880 * (Math.sqrt(tier - 6)))))
+ .itemOutputs(aBoards.toArray(new ItemStack[0]))
+ .duration((int) Math.ceil(400 / Math.sqrt(Math.pow(1.5, tier - 6.5))))
+ .eut((int) GT_Values.VP[tier + 1] * 3 / 4)
+ .metadata(TIER, 3)
+ .addTo(RecipeMaps.pcbFactoryRecipes);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/AlloySmelterRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/AlloySmelterRecipes.java
new file mode 100644
index 0000000000..a9e587a145
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/AlloySmelterRecipes.java
@@ -0,0 +1,116 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.alloySmelterRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.objects.MaterialStack;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class AlloySmelterRecipes implements Runnable {
+
+ private final MaterialStack[][] mAlloySmelterList = {
+ { new MaterialStack(Materials.Tetrahedrite, 3L), new MaterialStack(Materials.Tin, 1L),
+ new MaterialStack(Materials.Bronze, 3L) },
+ { new MaterialStack(Materials.Tetrahedrite, 3L), new MaterialStack(Materials.Zinc, 1L),
+ new MaterialStack(Materials.Brass, 3L) },
+ { new MaterialStack(Materials.Copper, 3L), new MaterialStack(Materials.Tin, 1L),
+ new MaterialStack(Materials.Bronze, 4L) },
+ { new MaterialStack(Materials.Copper, 3L), new MaterialStack(Materials.Zinc, 1L),
+ new MaterialStack(Materials.Brass, 4L) },
+ { new MaterialStack(Materials.Copper, 1L), new MaterialStack(Materials.Nickel, 1L),
+ new MaterialStack(Materials.Cupronickel, 2L) },
+ { new MaterialStack(Materials.Copper, 1L), new MaterialStack(Materials.Redstone, 4L),
+ new MaterialStack(Materials.RedAlloy, 1L) },
+ { new MaterialStack(Materials.AnnealedCopper, 3L), new MaterialStack(Materials.Tin, 1L),
+ new MaterialStack(Materials.Bronze, 4L) },
+ { new MaterialStack(Materials.AnnealedCopper, 3L), new MaterialStack(Materials.Zinc, 1L),
+ new MaterialStack(Materials.Brass, 4L) },
+ { new MaterialStack(Materials.AnnealedCopper, 1L), new MaterialStack(Materials.Nickel, 1L),
+ new MaterialStack(Materials.Cupronickel, 2L) },
+ { new MaterialStack(Materials.AnnealedCopper, 1L), new MaterialStack(Materials.Redstone, 4L),
+ new MaterialStack(Materials.RedAlloy, 1L) },
+ { new MaterialStack(Materials.Iron, 1L), new MaterialStack(Materials.Tin, 1L),
+ new MaterialStack(Materials.TinAlloy, 2L) },
+ { new MaterialStack(Materials.WroughtIron, 1L), new MaterialStack(Materials.Tin, 1L),
+ new MaterialStack(Materials.TinAlloy, 2L) },
+ { new MaterialStack(Materials.Iron, 2L), new MaterialStack(Materials.Nickel, 1L),
+ new MaterialStack(Materials.Invar, 3L) },
+ { new MaterialStack(Materials.WroughtIron, 2L), new MaterialStack(Materials.Nickel, 1L),
+ new MaterialStack(Materials.Invar, 3L) },
+ { new MaterialStack(Materials.Tin, 9L), new MaterialStack(Materials.Antimony, 1L),
+ new MaterialStack(Materials.SolderingAlloy, 10L) },
+ { new MaterialStack(Materials.Lead, 4L), new MaterialStack(Materials.Antimony, 1L),
+ new MaterialStack(Materials.BatteryAlloy, 5L) },
+ { new MaterialStack(Materials.Gold, 1L), new MaterialStack(Materials.Silver, 1L),
+ new MaterialStack(Materials.Electrum, 2L) },
+ { new MaterialStack(Materials.Magnesium, 1L), new MaterialStack(Materials.Aluminium, 2L),
+ new MaterialStack(Materials.Magnalium, 3L) },
+ { new MaterialStack(Materials.Silver, 1L), new MaterialStack(Materials.Electrotine, 4L),
+ new MaterialStack(Materials.BlueAlloy, 1L) },
+ { new MaterialStack(Materials.Boron, 1L), new MaterialStack(Materials.Glass, 7L),
+ new MaterialStack(Materials.BorosilicateGlass, 8L) } };
+
+ @Override
+ public void run() {
+ for (MaterialStack[] materials : mAlloySmelterList) {
+ ItemStack dust1 = GT_OreDictUnificator.get(OrePrefixes.dust, materials[0].mMaterial, materials[0].mAmount);
+ ItemStack dust2 = GT_OreDictUnificator.get(OrePrefixes.dust, materials[1].mMaterial, materials[1].mAmount);
+ ItemStack ingot1 = GT_OreDictUnificator
+ .get(OrePrefixes.ingot, materials[0].mMaterial, materials[0].mAmount);
+ ItemStack ingot2 = GT_OreDictUnificator
+ .get(OrePrefixes.ingot, materials[1].mMaterial, materials[1].mAmount);
+ ItemStack outputIngot = GT_OreDictUnificator
+ .get(OrePrefixes.ingot, materials[2].mMaterial, materials[2].mAmount);
+ if (outputIngot != GT_Values.NI) {
+ if (ingot1 != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ingot1, dust2)
+ .itemOutputs(outputIngot)
+ .duration((int) materials[2].mAmount * 50)
+ .eut(16)
+ .addTo(alloySmelterRecipes);
+ if (ingot2 != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ingot1, ingot2)
+ .itemOutputs(outputIngot)
+ .duration((int) materials[2].mAmount * 50)
+ .eut(16)
+ .addTo(alloySmelterRecipes);
+ }
+ }
+
+ if (ingot2 != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(dust1, ingot2)
+ .itemOutputs(outputIngot)
+ .duration((int) materials[2].mAmount * 50)
+ .eut(16)
+ .addTo(alloySmelterRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(dust1, dust2)
+ .itemOutputs(outputIngot)
+ .duration((int) materials[2].mAmount * 50)
+ .eut(16)
+ .addTo(alloySmelterRecipes);
+
+ }
+ }
+
+ // We use rubber
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 3L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 1L))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(alloySmelterRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ArcFurnaceRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ArcFurnaceRecipes.java
new file mode 100644
index 0000000000..755e5ab885
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/ArcFurnaceRecipes.java
@@ -0,0 +1,477 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.recipe.RecipeMaps.arcFurnaceRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.RECYCLE;
+import static gregtech.api.util.GT_RecipeConstants.UniversalArcFurnace;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class ArcFurnaceRecipes implements Runnable {
+
+ @Override
+ public void run() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Block_TungstenSteelReinforced.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Concrete, 1))
+ .duration(8 * SECONDS)
+ .eut(96)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Long_Distance_Pipeline_Fluid.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 19L))
+ .duration(9 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Long_Distance_Pipeline_Item.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 12L),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 7L))
+ .duration(9 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Long_Distance_Pipeline_Fluid_Pipe.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 2L))
+ .duration(10 * TICKS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Long_Distance_Pipeline_Item_Pipe.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Tin, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 1L))
+ .duration(10 * TICKS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_Cupronickel.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Cupronickel, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 2))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_Kanthal.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Kanthal, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Cupronickel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_Nichrome.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Nichrome, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Kanthal, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 4))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_TungstenSteel.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TPV, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Nichrome, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 5))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_HSSG.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.HSSG, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TPV, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 6))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_HSSS.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.HSSS, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.HSSG, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 7))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_Naquadah.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.HSSS, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 8))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_NaquadahAlloy.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.NaquadahAlloy, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 9))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_Trinium.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Trinium, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.NaquadahAlloy, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 10))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_ElectrumFlux.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.ElectrumFlux, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Trinium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 11))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_AwakenedDraconium.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.DraconiumAwakened, 8),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.ElectrumFlux, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 12))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 0))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 2L))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(90)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(90)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Bronze, 12L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 6))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(90)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 13))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 2L))
+ .duration(9 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 14))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(9 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 15))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 12L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 6L))
+ .duration(9 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 0))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Aluminium, 2L))
+ .duration(10 * SECONDS + 10 * TICKS)
+ .eut(150)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Aluminium, 3))
+ .duration(10 * SECONDS + 10 * TICKS)
+ .eut(150)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 12L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Aluminium, 6L))
+ .duration(10 * SECONDS + 10 * TICKS)
+ .eut(150)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.StainlessSteel, 2L))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.StainlessSteel, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 5))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.StainlessSteel, 12L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.StainlessSteel, 6L))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 6))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Titanium, 2L))
+ .duration(13 * SECONDS + 10 * TICKS)
+ .eut(210)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 7))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Titanium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(13 * SECONDS + 10 * TICKS)
+ .eut(210)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 8))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Titanium, 12L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Titanium, 6L))
+ .duration(13 * SECONDS + 10 * TICKS)
+ .eut(210)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 2L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 10))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 11))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.TungstenSteel, 12L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.TungstenSteel, 6L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 12))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Palladium, 2L))
+ .duration(16 * SECONDS + 10 * TICKS)
+ .eut(270)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 13))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Palladium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(16 * SECONDS + 10 * TICKS)
+ .eut(270)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 14))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.NiobiumTitanium, 12L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Chrome, 6L))
+ .duration(16 * SECONDS + 10 * TICKS)
+ .eut(270)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 0))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iridium, 2L))
+ .duration(18 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iridium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(18 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Enderium, 12L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iridium, 6L))
+ .duration(18 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Osmium, 2L))
+ .duration(18 * SECONDS)
+ .eut(330)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Osmium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(18 * SECONDS)
+ .eut(330)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 5))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 12L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Osmium, 6L))
+ .duration(18 * SECONDS)
+ .eut(330)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 6))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Neutronium, 2L))
+ .duration(18 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 7))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Neutronium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(18 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 8))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Neutronium, 12L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Neutronium, 6L))
+ .duration(18 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .metadata(RECYCLE, true)
+ .addTo(UniversalArcFurnace);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3))
+ .fluidInputs(Materials.Oxygen.getGas(2000L))
+ .duration(60 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(arcFurnaceRecipes);
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/AssemblerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/AssemblerRecipes.java
new file mode 100644
index 0000000000..76fcbfe346
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/AssemblerRecipes.java
@@ -0,0 +1,6786 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.AvaritiaAddons;
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.BuildCraftFactory;
+import static gregtech.api.enums.Mods.ExtraUtilities;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GTNHLanthanides;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GalacticraftCore;
+import static gregtech.api.enums.Mods.GalacticraftMars;
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.IC2NuclearControl;
+import static gregtech.api.enums.Mods.IronChests;
+import static gregtech.api.enums.Mods.IronTanks;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.OpenComputers;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.enums.Mods.TinkerConstruct;
+import static gregtech.api.enums.Mods.TwilightForest;
+import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.EIGHTH_INGOT;
+import static gregtech.api.util.GT_RecipeBuilder.HALF_INGOT;
+import static gregtech.api.util.GT_RecipeBuilder.INGOTS;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.QUARTER_INGOT;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.loaders.postload.GT_MachineRecipeLoader.solderingMats;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.ExternalMaterials;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class AssemblerRecipes implements Runnable {
+
+ @Override
+ public void run() {
+
+ this.withBartWorks();
+ this.withGalacticraftMars();
+ this.withRailcraft();
+ this.withGalaxySpace();
+ this.withGTNHLanthAndGTPP();
+ this.loadInputBusesRecipes();
+ this.loadInputHatchesRecipes();
+ this.loadOutputBusesRecipes();
+ this.loadOutputHatchesRecipes();
+ this.withIC2NuclearControl();
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.FR_Stick.get(1L))
+ .fluidInputs(Materials.SeedOil.getFluid(50L))
+ .duration(16 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.BlackSteel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 1))
+ .itemOutputs(ItemList.Block_Plascrete.get(1))
+ .fluidInputs(Materials.Concrete.getMolten(144))
+ .duration(10 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.BlackSteel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 1))
+ .itemOutputs(ItemList.Block_Plascrete.get(1))
+ .fluidInputs(Materials.Concrete.getMolten(144))
+ .duration(10 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.TungstenSteel, 16),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Data), 4),
+ ItemList.Electric_Motor_IV.get(16),
+ ItemList.Emitter_EV.get(4),
+ ItemList.Duct_Tape.get(64),
+ ItemList.Energy_LapotronicOrb.get(1),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.TierdDrone0.get(4))
+ .fluidInputs(Materials.AdvancedGlue.getFluid(144))
+ .duration(10 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ for (int j = 0; j < Dyes.VALUES[i].getSizeOfFluidList(); j++) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.string, 3), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(new ItemStack(Blocks.carpet, 2, 15 - i))
+ .fluidInputs(Dyes.VALUES[i].getFluidDye(j, 24))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(assemblerRecipes);
+ }
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.PolyvinylChloride, 1),
+ ItemList.Paper_Printed_Pages.get(1))
+ .itemOutputs(new ItemStack(Items.written_book, 1, 0))
+ .fluidInputs(Materials.Glue.getFluid(20))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.PolyvinylChloride, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3))
+ .itemOutputs(new ItemStack(Items.book, 1, 0))
+ .fluidInputs(Materials.Glue.getFluid(20))
+ .duration(20 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_ModHandler.getIC2Item("carbonMesh", 4),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Zinc, 16),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Component_Filter.get(1))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Zinc, 16),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Component_Filter.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(144))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 64),
+ ItemList.Circuit_Silicon_Wafer2.get(32),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphene, 64))
+ .fluidInputs(Materials.AdvancedGlue.getFluid(500))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 64),
+ ItemList.Circuit_Silicon_Wafer3.get(8),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphene, 64))
+ .fluidInputs(Materials.AdvancedGlue.getFluid(250))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_LV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Basic), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.FluidRegulator_LV.get(1))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_MV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Good), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.FluidRegulator_MV.get(1))
+ .duration(17 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_HV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Advanced), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.FluidRegulator_HV.get(1))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_EV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Data), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.FluidRegulator_EV.get(1))
+ .duration(12 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Elite), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.FluidRegulator_IV.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Master), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.FluidRegulator_LuV.get(1))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Ultimate), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.FluidRegulator_ZPM.get(1))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.SuperconductorUHV), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.FluidRegulator_UV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(500000)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Steam_Valve_LV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Basic), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Steam_Regulator_LV.get(1))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Steam_Valve_MV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Good), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Steam_Regulator_MV.get(1))
+ .duration(17 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Steam_Valve_HV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Advanced), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Steam_Regulator_HV.get(1))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Steam_Valve_EV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Data), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Steam_Regulator_EV.get(1))
+ .duration(12 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Steam_Valve_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Elite), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Steam_Regulator_IV.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_LV.get(1),
+ ItemList.Electric_Motor_LV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.gear.get(Materials.Steel), 2),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(ItemList.Steam_Valve_LV.get(1))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_MV.get(1),
+ ItemList.Electric_Motor_MV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.gear.get(Materials.Aluminium), 2),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(ItemList.Steam_Valve_MV.get(1))
+ .duration(17 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_HV.get(1),
+ ItemList.Electric_Motor_HV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.gear.get(Materials.StainlessSteel), 2),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(ItemList.Steam_Valve_HV.get(1))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_EV.get(1),
+ ItemList.Electric_Motor_EV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.gear.get(Materials.Titanium), 2),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(ItemList.Steam_Valve_EV.get(1))
+ .duration(12 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_IV.get(1),
+ ItemList.Electric_Motor_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.gear.get(Materials.TungstenSteel), 2),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(ItemList.Steam_Valve_IV.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate.get(Materials.Steel), 4),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Basic), 4),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Schematic.get(1L))
+ .duration(30 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate.get(Materials.Aluminium), 3),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Good), 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Schematic.get(1L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate.get(Materials.StainlessSteel), 2),
+ GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Advanced), 1),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Schematic.get(1L))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 1L),
+ ItemList.Circuit_Chip_LPIC.get(2L),
+ ItemList.HV_Coil.get(2L),
+ ItemList.Reactor_Coolant_He_1.get(1L),
+ ItemList.Electric_Pump_HV.get(1L))
+ .itemOutputs(ItemList.Hatch_Energy_HV.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_EV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 1L),
+ ItemList.Circuit_Chip_PIC.get(2L),
+ ItemList.EV_Coil.get(2L),
+ ItemList.Reactor_Coolant_He_1.get(1L),
+ ItemList.Electric_Pump_EV.get(1L))
+ .itemOutputs(ItemList.Hatch_Energy_EV.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_IV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 1L),
+ ItemList.Circuit_Chip_HPIC.get(2L),
+ ItemList.IV_Coil.get(2L),
+ ItemList.Reactor_Coolant_He_3.get(1L),
+ ItemList.Electric_Pump_IV.get(1L))
+ .itemOutputs(ItemList.Hatch_Energy_IV.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 1L),
+ ItemList.Circuit_Chip_LPIC.get(2L),
+ ItemList.HV_Coil.get(2L),
+ ItemList.Reactor_Coolant_NaK_1.get(1L),
+ ItemList.Electric_Pump_HV.get(1L))
+ .itemOutputs(ItemList.Hatch_Energy_HV.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_EV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 1L),
+ ItemList.Circuit_Chip_PIC.get(2L),
+ ItemList.EV_Coil.get(2L),
+ ItemList.Reactor_Coolant_NaK_1.get(1L),
+ ItemList.Electric_Pump_EV.get(1L))
+ .itemOutputs(ItemList.Hatch_Energy_EV.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_IV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 1L),
+ ItemList.Circuit_Chip_HPIC.get(2L),
+ ItemList.IV_Coil.get(2L),
+ ItemList.Reactor_Coolant_NaK_3.get(1L),
+ ItemList.Electric_Pump_IV.get(1L))
+ .itemOutputs(ItemList.Hatch_Energy_IV.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Gold, 1L),
+ ItemList.Circuit_Chip_LPIC.get(2L),
+ ItemList.HV_Coil.get(2L),
+ ItemList.Reactor_Coolant_He_1.get(1L),
+ ItemList.Electric_Pump_HV.get(1L))
+ .itemOutputs(ItemList.Hatch_Dynamo_HV.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_EV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Aluminium, 1L),
+ ItemList.Circuit_Chip_PIC.get(2L),
+ ItemList.EV_Coil.get(2L),
+ ItemList.Reactor_Coolant_He_1.get(1L),
+ ItemList.Electric_Pump_EV.get(1L))
+ .itemOutputs(ItemList.Hatch_Dynamo_EV.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_IV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Vanadiumtriindinid, 1L),
+ ItemList.Circuit_Chip_HPIC.get(2L),
+ ItemList.IV_Coil.get(2L),
+ ItemList.Reactor_Coolant_He_3.get(1L),
+ ItemList.Electric_Pump_IV.get(1L))
+ .itemOutputs(ItemList.Hatch_Dynamo_IV.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Gold, 1L),
+ ItemList.Circuit_Chip_LPIC.get(2L),
+ ItemList.HV_Coil.get(2L),
+ ItemList.Reactor_Coolant_NaK_1.get(1L),
+ ItemList.Electric_Pump_HV.get(1L))
+ .itemOutputs(ItemList.Hatch_Dynamo_HV.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_EV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Aluminium, 1L),
+ ItemList.Circuit_Chip_PIC.get(2L),
+ ItemList.EV_Coil.get(2L),
+ ItemList.Reactor_Coolant_NaK_1.get(1L),
+ ItemList.Electric_Pump_EV.get(1L))
+ .itemOutputs(ItemList.Hatch_Dynamo_EV.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_IV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Vanadiumtriindinid, 1L),
+ ItemList.Circuit_Chip_HPIC.get(2L),
+ ItemList.IV_Coil.get(2L),
+ ItemList.Reactor_Coolant_NaK_3.get(1L),
+ ItemList.Electric_Pump_IV.get(1L))
+ .itemOutputs(ItemList.Hatch_Dynamo_IV.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeHuge, Materials.Steel, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 6L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Steel, 2L),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Long_Distance_Pipeline_Fluid.get(2L))
+ .fluidInputs(Materials.Tin.getMolten(144L))
+ .duration(15 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeHuge, Materials.Tin, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 6L),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Steel, 2L),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Long_Distance_Pipeline_Item.get(2L))
+ .fluidInputs(Materials.Tin.getMolten(144L))
+ .duration(15 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Steel, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 9L),
+ GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(ItemList.Long_Distance_Pipeline_Fluid_Pipe.get(64L))
+ .fluidInputs(Materials.Tin.getMolten(144L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Tin, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 9L),
+ GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(ItemList.Long_Distance_Pipeline_Item_Pipe.get(64L))
+ .fluidInputs(Materials.Tin.getMolten(144L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.StainlessSteel, 1L),
+ ItemList.Hull_EV.get(1L),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.Hatch_Input_Multi_2x2_EV.get(1L))
+ .fluidInputs(Materials.Glass.getMolten(2304L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.Titanium, 1L),
+ ItemList.Hull_IV.get(1L),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.Hatch_Input_Multi_2x2_IV.get(1L))
+ .fluidInputs(Materials.Glass.getMolten(2304L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.TungstenSteel, 1L),
+ ItemList.Hull_LuV.get(1L),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.Hatch_Input_Multi_2x2_LuV.get(1L))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(2304L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.NiobiumTitanium, 1L),
+ ItemList.Hull_ZPM.get(1L),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.Hatch_Input_Multi_2x2_ZPM.get(1L))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(2304L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.MysteriousCrystal, 1L),
+ ItemList.Hull_UV.get(1L),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.Hatch_Input_Multi_2x2_UV.get(1L))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(2304L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.Neutronium, 1L),
+ ItemList.Hull_MAX.get(1L),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.Hatch_Input_Multi_2x2_UHV.get(1L))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(2304L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 1L),
+ ItemList.Robot_Arm_IV.get(2L),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Casing_Gearbox_TungstenSteel.get(1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ { // limiting lifetime of the variables
+ ItemStack flask = ItemList.VOLUMETRIC_FLASK.get(1);
+ NBTTagCompound nbtFlask = new NBTTagCompound();
+ int[] capacities = new int[] { 144, 288, 576, 720, 864, 72, 648, 936, 250, 500, 1000 };
+ int[] circuitConfigurations = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 24 };
+ for (int i = 0; i < capacities.length; i++) {
+ nbtFlask.setInteger("Capacity", capacities[i]);
+ flask.setTagCompound(nbtFlask);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.VOLUMETRIC_FLASK.get(1),
+ GT_Utility.getIntegratedCircuit(circuitConfigurations[i]))
+ .itemOutputs(flask)
+ .duration(10 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ }
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Bronze, 1),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Bronze, 1),
+ ItemList.Electric_Motor_LV.get(1),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Hatch_Muffler_LV.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Steel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Steel, 1),
+ ItemList.Electric_Motor_MV.get(1),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Hatch_Muffler_MV.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.StainlessSteel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.StainlessSteel, 1),
+ ItemList.Electric_Motor_HV.get(1),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Hatch_Muffler_HV.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_EV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Titanium, 1),
+ ItemList.Electric_Motor_EV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Hatch_Muffler_EV.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.TungstenSteel, 1),
+ ItemList.Electric_Motor_IV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.TungstenSteel, 1),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Hatch_Muffler_IV.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Enderium, 1),
+ ItemList.Electric_Motor_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Enderium, 1),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Hatch_Muffler_LuV.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Naquadah, 1),
+ ItemList.Electric_Motor_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.NaquadahAlloy, 1),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Hatch_Muffler_ZPM.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.NetherStar, 1),
+ ItemList.Electric_Motor_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Neutronium, 1),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Hatch_Muffler_UV.get(1))
+ .duration(10 * SECONDS)
+ .eut(500000)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MAX.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.MysteriousCrystal, 1),
+ ItemList.Electric_Motor_UHV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.CosmicNeutronium, 1),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Hatch_Muffler_MAX.get(1))
+ .duration(10 * SECONDS)
+ .eut(2000000)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.redstone_torch, 2, 32767),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1))
+ .itemOutputs(new ItemStack(Items.repeater, 1, 0))
+ .fluidInputs(Materials.Concrete.getMolten(144))
+ .duration(4 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.leather, 1, 32767), new ItemStack(Items.lead, 1, 32767))
+ .itemOutputs(new ItemStack(Items.name_tag, 1, 0))
+ .fluidInputs(Materials.Glue.getFluid(72))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(NewHorizonsCoreMod.ID, "item.ArtificialLeather", 1L, 0),
+ new ItemStack(Items.lead, 1, 32767))
+ .itemOutputs(new ItemStack(Items.name_tag, 1, 0))
+ .fluidInputs(Materials.Glue.getFluid(72))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 8),
+ new ItemStack(Items.compass, 1, 32767))
+ .itemOutputs(new ItemStack(Items.map, 1, 0))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tantalum, 1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Manganese, 1))
+ .itemOutputs(ItemList.Battery_RE_ULV_Tantalum.get(8))
+ .fluidInputs(Materials.Plastic.getMolten(144))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(TwilightForest.ID, "item.charmOfLife1", 4L, 0), GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(getModItem(TwilightForest.ID, "item.charmOfLife2", 1L, 0))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(TwilightForest.ID, "item.charmOfKeeping1", 4L, 0),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(getModItem(TwilightForest.ID, "item.charmOfKeeping2", 1L, 0))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(TwilightForest.ID, "item.charmOfKeeping2", 4L, 0),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(getModItem(TwilightForest.ID, "item.charmOfKeeping3", 1L, 0))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(TwilightForest.ID, "item.charmOfLife2", 1L, 0), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(TwilightForest.ID, "item.charmOfLife1", 4L, 0))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(TwilightForest.ID, "item.charmOfKeeping2", 1L, 0),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(TwilightForest.ID, "item.charmOfKeeping1", 4L, 0))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(TwilightForest.ID, "item.charmOfKeeping3", 1L, 0),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(TwilightForest.ID, "item.charmOfKeeping2", 4L, 0))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 16),
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 20))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 23))
+ .fluidInputs(Materials.Redstone.getMolten(144))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 17),
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 20))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 24))
+ .fluidInputs(Materials.Redstone.getMolten(144))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 18),
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 20))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 22))
+ .fluidInputs(Materials.Redstone.getMolten(144))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 1),
+ new ItemStack(Blocks.sand, 1, 32767))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 2L, 0))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 1),
+ new ItemStack(Blocks.sand, 1, 32767))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 2L, 600))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Fluix, 1),
+ new ItemStack(Blocks.sand, 1, 32767))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 2L, 1200))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.FR_Wax.get(6), new ItemStack(Items.string, 1, 32767))
+ .itemOutputs(getModItem(Forestry.ID, "candle", 24L, 0))
+ .fluidInputs(Materials.Water.getFluid(600))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.FR_Wax.get(2), ItemList.FR_Silk.get(1))
+ .itemOutputs(getModItem(Forestry.ID, "candle", 8L, 0))
+ .fluidInputs(Materials.Water.getFluid(200))
+ .duration(16 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.FR_Silk.get(9), GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(getModItem(Forestry.ID, "craftingMaterial", 1L, 3))
+ .fluidInputs(Materials.Water.getFluid(500))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Forestry.ID, "propolis", 5L, 2), GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(getModItem(Forestry.ID, "craftingMaterial", 1L, 1))
+ .duration(16 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+ new ItemStack(Blocks.wool, 1, 32767))
+ .itemOutputs(new ItemStack(Blocks.torch, 6, 0))
+ .fluidInputs(Materials.Creosote.getFluid(1000))
+ .duration(2 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Forestry.ID, "craftingMaterial", 5L, 1), GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.EnderPearl, 1))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.piston, 1, 32767), new ItemStack(Items.slime_ball, 1, 32767))
+ .itemOutputs(new ItemStack(Blocks.sticky_piston, 1, 0))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.piston, 1, 32767), ItemList.IC2_Resin.get(1))
+ .itemOutputs(new ItemStack(Blocks.sticky_piston, 1, 0))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.piston, 1, 32767), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(new ItemStack(Blocks.sticky_piston, 1, 0))
+ .fluidInputs(Materials.Glue.getFluid(100))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Rubber, 3),
+ GT_ModHandler.getIC2Item("carbonMesh", 3),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Duct_Tape.get(1))
+ .fluidInputs(Materials.Glue.getFluid(300))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StyreneButadieneRubber, 2),
+ GT_ModHandler.getIC2Item("carbonMesh", 2),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Duct_Tape.get(1))
+ .fluidInputs(Materials.Glue.getFluid(200))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Silicone, 1),
+ GT_ModHandler.getIC2Item("carbonMesh", 1),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Duct_Tape.get(1))
+ .fluidInputs(Materials.Glue.getFluid(100))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ // Maintenance Hatch Recipes Using BrainTech + Refined Glue. Info: One BrainTech Recipe Is In GT+ü Originally.
+ // The Maintenance Hatch Recipe using SuperGlue is there.
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Hull_LV.get(1), ItemList.Duct_Tape.get(2), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Maintenance.get(1))
+ .fluidInputs(Materials.Glue.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3),
+ new ItemStack(Items.leather, 1, 32767))
+ .itemOutputs(new ItemStack(Items.book, 1, 0))
+ .fluidInputs(Materials.Glue.getFluid(20))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3),
+ getModItem(NewHorizonsCoreMod.ID, "item.ArtificialLeather", 1L, 0))
+ .itemOutputs(new ItemStack(Items.book, 1, 0))
+ .fluidInputs(Materials.Glue.getFluid(20))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3),
+ GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, Materials.Paper, 1))
+ .itemOutputs(new ItemStack(Items.book, 1, 0))
+ .fluidInputs(Materials.Glue.getFluid(20))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Paper_Printed_Pages.get(1), new ItemStack(Items.leather, 1, 32767))
+ .itemOutputs(new ItemStack(Items.written_book, 1, 0))
+ .fluidInputs(Materials.Glue.getFluid(20))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Paper_Printed_Pages.get(1),
+ getModItem(NewHorizonsCoreMod.ID, "item.ArtificialLeather", 1L, 0))
+ .itemOutputs(new ItemStack(Items.written_book, 1, 0))
+ .fluidInputs(Materials.Glue.getFluid(20))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.Tin, 4))
+ .itemOutputs(ItemList.Cell_Universal_Fluid.get(1))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Baked_Cake.get(1), new ItemStack(Items.egg, 1, 0))
+ .itemOutputs(new ItemStack(Items.cake, 1, 0))
+ .fluidInputs(Materials.Milk.getFluid(3000))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Sliced_Bun.get(2), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Food_Sliced_Buns.get(1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Sliced_Bread.get(2), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Food_Sliced_Breads.get(1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Sliced_Baguette.get(2), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Food_Sliced_Baguettes.get(1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Sliced_Buns.get(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Food_Sliced_Bun.get(2))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Sliced_Breads.get(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Food_Sliced_Bread.get(2))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Sliced_Baguettes.get(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Food_Sliced_Baguette.get(2))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Food_Sliced_Bun.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatCooked, 1))
+ .itemOutputs(ItemList.Food_Burger_Meat.get(1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Food_Sliced_Buns.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatCooked, 1))
+ .itemOutputs(ItemList.Food_Burger_Meat.get(1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Sliced_Bun.get(2), ItemList.Food_Chum.get(1))
+ .itemOutputs(ItemList.Food_Burger_Chum.get(1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Sliced_Buns.get(1), ItemList.Food_Chum.get(1))
+ .itemOutputs(ItemList.Food_Burger_Chum.get(1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Sliced_Bun.get(2), ItemList.Food_Sliced_Cheese.get(3))
+ .itemOutputs(ItemList.Food_Burger_Cheese.get(1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Sliced_Buns.get(1), ItemList.Food_Sliced_Cheese.get(3))
+ .itemOutputs(ItemList.Food_Burger_Cheese.get(1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Food_Flat_Dough.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatCooked, 1))
+ .itemOutputs(ItemList.Food_Raw_Pizza_Meat.get(1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Flat_Dough.get(1), ItemList.Food_Sliced_Cheese.get(3))
+ .itemOutputs(ItemList.Food_Raw_Pizza_Cheese.get(1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ // SC craft
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Pentacadmiummagnesiumhexaoxid, 3),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.StainlessSteel, 2),
+ ItemList.Electric_Pump_MV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorMV, 3))
+ .fluidInputs(Materials.Helium.getGas(2000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titaniumonabariumdecacoppereikosaoxid, 6),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Titanium, 4),
+ ItemList.Electric_Pump_HV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorHV, 6))
+ .fluidInputs(Materials.Helium.getGas(4000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Uraniumtriplatinid, 9),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.TungstenSteel, 6),
+ ItemList.Electric_Pump_EV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorEV, 9))
+ .fluidInputs(Materials.Helium.getGas(6000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Vanadiumtriindinid, 12),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.NiobiumTitanium, 8),
+ ItemList.Electric_Pump_IV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 12))
+ .fluidInputs(Materials.Helium.getGas(8000))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(
+ OrePrefixes.wireGt01,
+ Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid,
+ 15),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Enderium, 10),
+ ItemList.Electric_Pump_LuV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 15))
+ .fluidInputs(Materials.Helium.getGas(12000))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 18),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Naquadah, 12),
+ ItemList.Electric_Pump_ZPM.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorZPM, 18))
+ .fluidInputs(Materials.Helium.getGas(16000))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuvwire, 21),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Neutronium, 14),
+ ItemList.Electric_Pump_UV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUV, 21))
+ .fluidInputs(Materials.Helium.getGas(20000))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuhvwire, 24),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Bedrockium, 16),
+ ItemList.Electric_Pump_UHV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 24))
+ .fluidInputs(Materials.Helium.getGas(24000))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Pentacadmiummagnesiumhexaoxid, 3),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.StainlessSteel, 2),
+ ItemList.Electric_Pump_MV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorMV, 3))
+ .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(4))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titaniumonabariumdecacoppereikosaoxid, 6),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Titanium, 4),
+ ItemList.Electric_Pump_HV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorHV, 6))
+ .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(8))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Uraniumtriplatinid, 9),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.TungstenSteel, 6),
+ ItemList.Electric_Pump_EV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorEV, 9))
+ .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(12))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Vanadiumtriindinid, 12),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.NiobiumTitanium, 8),
+ ItemList.Electric_Pump_IV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 12))
+ .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(16))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(
+ OrePrefixes.wireGt01,
+ Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid,
+ 15),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Enderium, 10),
+ ItemList.Electric_Pump_LuV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 15))
+ .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(24))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 18),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Naquadah, 12),
+ ItemList.Electric_Pump_ZPM.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorZPM, 18))
+ .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(32))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuvwire, 21),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Neutronium, 14),
+ ItemList.Electric_Pump_UV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUV, 21))
+ .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(40))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuhvwire, 24),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Bedrockium, 16),
+ ItemList.Electric_Pump_UHV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 24))
+ .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(48))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEVBase, 27),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Infinity, 18),
+ ItemList.Electric_Pump_UEV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEV, 27))
+ .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(56))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_UEV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUIVBase, 30L),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, MaterialsUEVplus.TranscendentMetal, 20L),
+ ItemList.Electric_Pump_UIV.get(1L),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUIV, 30L))
+ .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(68))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_UIV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMVBase, 33),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, MaterialsUEVplus.SpaceTime, 22),
+ ItemList.Electric_Pump_UMV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, 33))
+ .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(72))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Lead, 16),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.ULV_Coil.get(1))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 16),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.LV_Coil.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SteelMagnetic, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Aluminium, 16),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.MV_Coil.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SteelMagnetic, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.EnergeticAlloy, 16),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.HV_Coil.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.NeodymiumMagnetic, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.TungstenSteel, 16),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.EV_Coil.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.NeodymiumMagnetic, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Iridium, 16),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.IV_Coil.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, ExternalMaterials.getRuridit(), 16),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.LuV_Coil.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 16),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.ZPM_Coil.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.ElectrumFlux, 16),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.UV_Coil.get(1))
+ .duration(10 * SECONDS)
+ .eut(500000)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 16),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.UHV_Coil.get(1))
+ .duration(10 * SECONDS)
+ .eut(2000000)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Wood, 6),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Wood, 2))
+ .fluidInputs(Materials.Glue.getFluid(10))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Wood, 3),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Wood, 4))
+ .fluidInputs(Materials.Glue.getFluid(20))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Wood, 1),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.pipeSmall, Materials.Wood, 6))
+ .fluidInputs(Materials.Glue.getFluid(60))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 4),
+ GT_OreDictUnificator.get(OrePrefixes.plateAlloy, Materials.Advanced, 4),
+ GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Diamond, 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Ingot_IridiumAlloy.get(1))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Steel, 1),
+ ItemList.Electric_Motor_MV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Steel, 1),
+ new ItemStack(Blocks.iron_bars, 6),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Casing_Grate.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Iridium, 1),
+ ItemList.Electric_Motor_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Iridium, 1),
+ ItemList.Component_Filter.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Iridium, 8))
+ .itemOutputs(ItemList.Casing_Vent_T2.get(1))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+ new ItemStack(Items.coal, 1, 32767))
+ .itemOutputs(new ItemStack(Blocks.torch, 4))
+ .duration(2 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Gold, 2),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Steel, 1))
+ .itemOutputs(new ItemStack(Blocks.light_weighted_pressure_plate, 1))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 2),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Steel, 1))
+ .itemOutputs(new ItemStack(Blocks.heavy_weighted_pressure_plate, 1))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 7),
+ GT_Utility.getIntegratedCircuit(7))
+ .itemOutputs(new ItemStack(Items.cauldron, 1))
+ .duration(35 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("ironFence", 1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 3),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(new ItemStack(Blocks.iron_bars, 4))
+ .duration(15 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 7),
+ GT_Utility.getIntegratedCircuit(7))
+ .itemOutputs(new ItemStack(Items.cauldron, 1))
+ .duration(35 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("ironFence", 1))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 3),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(new ItemStack(Blocks.iron_bars, 4))
+ .duration(15 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 3),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(new ItemStack(Blocks.fence, 1))
+ .duration(15 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Iron, 2))
+ .itemOutputs(new ItemStack(Blocks.tripwire_hook, 1))
+ .duration(20 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.WroughtIron, 2))
+ .itemOutputs(new ItemStack(Blocks.tripwire_hook, 1))
+ .duration(20 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 3),
+ new ItemStack(Items.string, 3, 32767))
+ .itemOutputs(new ItemStack(Items.bow, 1))
+ .duration(20 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 3),
+ ItemList.Component_Minecart_Wheels_Iron.get(2))
+ .itemOutputs(new ItemStack(Items.minecart, 1))
+ .duration(5 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 3),
+ ItemList.Component_Minecart_Wheels_Iron.get(2))
+ .itemOutputs(new ItemStack(Items.minecart, 1))
+ .duration(4 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 3),
+ ItemList.Component_Minecart_Wheels_Steel.get(2))
+ .itemOutputs(new ItemStack(Items.minecart, 1))
+ .duration(5 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Iron, 2))
+ .itemOutputs(ItemList.Component_Minecart_Wheels_Iron.get(1))
+ .duration(5 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.WroughtIron, 2))
+ .itemOutputs(ItemList.Component_Minecart_Wheels_Iron.get(1))
+ .duration(4 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Steel, 2))
+ .itemOutputs(ItemList.Component_Minecart_Wheels_Steel.get(1))
+ .duration(3 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.minecart, 1), new ItemStack(Blocks.hopper, 1, 32767))
+ .itemOutputs(new ItemStack(Items.hopper_minecart, 1))
+ .duration(20 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.minecart, 1), new ItemStack(Blocks.tnt, 1, 32767))
+ .itemOutputs(new ItemStack(Items.tnt_minecart, 1))
+ .duration(20 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.minecart, 1), new ItemStack(Blocks.chest, 1, 32767))
+ .itemOutputs(new ItemStack(Items.chest_minecart, 1))
+ .duration(20 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.minecart, 1), new ItemStack(Blocks.trapped_chest, 1, 32767))
+ .itemOutputs(new ItemStack(Items.chest_minecart, 1))
+ .duration(20 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.minecart, 1), new ItemStack(Blocks.furnace, 1, 32767))
+ .itemOutputs(new ItemStack(Items.furnace_minecart, 1))
+ .duration(20 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.tripwire_hook, 1), new ItemStack(Blocks.chest, 1, 32767))
+ .itemOutputs(new ItemStack(Blocks.trapped_chest, 1))
+ .duration(10 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.stone, 1, 0), GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(new ItemStack(Blocks.stonebrick, 1, 0))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.sandstone, 1, 0), GT_Utility.getIntegratedCircuit(23))
+ .itemOutputs(new ItemStack(Blocks.sandstone, 1, 2))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.sandstone, 1, 1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(new ItemStack(Blocks.sandstone, 1, 0))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.sandstone, 1, 2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(new ItemStack(Blocks.sandstone, 1, 0))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 8),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(GT_ModHandler.getIC2Item("machine", 1))
+ .duration(1 * SECONDS + 5 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 8),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.Casing_ULV.get(1))
+ .duration(1 * SECONDS + 5 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 8),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.Casing_LV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 8),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.Casing_MV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 8),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.Casing_HV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 8),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.Casing_EV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 8),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.Casing_IV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, ExternalMaterials.getRhodiumPlatedPalladium(), 8),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.Casing_LuV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 8),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.Casing_ZPM.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 8),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.Casing_UV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 8),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.Casing_MAX.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Invar, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Invar, 1))
+ .itemOutputs(ItemList.Casing_HeatProof.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Steel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Casing_SolidSteel.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Aluminium, 1))
+ .itemOutputs(ItemList.Casing_FrostProof.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 1))
+ .itemOutputs(ItemList.Casing_RobustTungstenSteel.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.StainlessSteel, 1))
+ .itemOutputs(ItemList.Casing_CleanStainlessSteel.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Titanium, 1))
+ .itemOutputs(ItemList.Casing_StableTitanium.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmiridium, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Osmiridium, 1))
+ .itemOutputs(ItemList.Casing_MiningOsmiridium.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1))
+ .itemOutputs(ItemList.Casing_MiningNeutronium.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BlackPlutonium, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.BlackPlutonium, 1))
+ .itemOutputs(ItemList.Casing_MiningBlackPlutonium.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 4), ItemList.Casing_LuV.get(1))
+ .itemOutputs(ItemList.Casing_Fusion.get(1))
+ .fluidInputs(Materials.HSSG.getMolten(288))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Americium, 4),
+ ItemList.Casing_Fusion.get(1))
+ .itemOutputs(ItemList.Casing_Fusion2.get(1))
+ .fluidInputs(Materials.NaquadahAlloy.getMolten(288))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Magnalium, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.BlueSteel, 1))
+ .itemOutputs(ItemList.Casing_Turbine.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 6),
+ ItemList.Casing_Turbine.get(1))
+ .itemOutputs(ItemList.Casing_Turbine1.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 6),
+ ItemList.Casing_Turbine.get(1))
+ .itemOutputs(ItemList.Casing_Turbine2.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 6),
+ ItemList.Casing_Turbine.get(1))
+ .itemOutputs(ItemList.Casing_Turbine3.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 6), ItemList.Casing_Turbine.get(1))
+ .itemOutputs(ItemList.Casing_TurbineGasAdvanced.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_SolidSteel.get(1), GT_Utility.getIntegratedCircuit(6))
+ .itemOutputs(ItemList.Casing_Chemically_Inert.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(216))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Iridium, 1))
+ .itemOutputs(ItemList.Casing_Advanced_Iridium.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ if (GT_Mod.gregtechproxy.mHardMachineCasings) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Lead, 2),
+ ItemList.Casing_ULV.get(1))
+ .itemOutputs(ItemList.Hull_ULV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(288))
+ .duration(1 * SECONDS + 5 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tin, 2),
+ ItemList.Casing_LV.get(1))
+ .itemOutputs(ItemList.Hull_LV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(288))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Copper, 2),
+ ItemList.Casing_MV.get(1))
+ .itemOutputs(ItemList.Hull_MV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(288))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.AnnealedCopper, 2),
+ ItemList.Casing_MV.get(1))
+ .itemOutputs(ItemList.Hull_MV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(288))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 2),
+ ItemList.Casing_HV.get(1))
+ .itemOutputs(ItemList.Hull_HV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(288))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 2),
+ ItemList.Casing_EV.get(1))
+ .itemOutputs(ItemList.Hull_EV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(288))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tungsten, 2),
+ ItemList.Casing_IV.get(1))
+ .itemOutputs(ItemList.Hull_IV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(288))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.VanadiumGallium, 2),
+ ItemList.Casing_LuV.get(1))
+ .itemOutputs(ItemList.Hull_LuV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(288))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 2),
+ ItemList.Casing_ZPM.get(1))
+ .itemOutputs(ItemList.Hull_ZPM.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(288))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 2),
+ ItemList.Casing_UV.get(1))
+ .itemOutputs(ItemList.Hull_UV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(288))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUV, 2),
+ ItemList.Casing_MAX.get(1))
+ .itemOutputs(ItemList.Hull_MAX.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(288))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ } else {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Lead, 2),
+ ItemList.Casing_ULV.get(1))
+ .itemOutputs(ItemList.Hull_ULV.get(1))
+ .duration(1 * SECONDS + 5 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tin, 2),
+ ItemList.Casing_LV.get(1))
+ .itemOutputs(ItemList.Hull_LV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Copper, 2),
+ ItemList.Casing_MV.get(1))
+ .itemOutputs(ItemList.Hull_MV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.AnnealedCopper, 2),
+ ItemList.Casing_MV.get(1))
+ .itemOutputs(ItemList.Hull_MV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 2),
+ ItemList.Casing_HV.get(1))
+ .itemOutputs(ItemList.Hull_HV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 2),
+ ItemList.Casing_EV.get(1))
+ .itemOutputs(ItemList.Hull_EV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tungsten, 2),
+ ItemList.Casing_IV.get(1))
+ .itemOutputs(ItemList.Hull_IV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.VanadiumGallium, 2),
+ ItemList.Casing_LuV.get(1))
+ .itemOutputs(ItemList.Hull_LuV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 2),
+ ItemList.Casing_ZPM.get(1))
+ .itemOutputs(ItemList.Hull_ZPM.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 2),
+ ItemList.Casing_UV.get(1))
+ .itemOutputs(ItemList.Hull_UV.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUV, 2),
+ ItemList.Casing_MAX.get(1))
+ .itemOutputs(ItemList.Hull_MAX.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tin, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BatteryAlloy, 1))
+ .itemOutputs(ItemList.Battery_Hull_LV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(144))
+ .duration(4 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Copper, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BatteryAlloy, 3))
+ .itemOutputs(ItemList.Battery_Hull_MV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(432))
+ .duration(16 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.AnnealedCopper, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BatteryAlloy, 3))
+ .itemOutputs(ItemList.Battery_Hull_MV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(432))
+ .duration(16 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 4),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BatteryAlloy, 9))
+ .itemOutputs(ItemList.Battery_Hull_HV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(1296))
+ .duration(1 * MINUTES + 4 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.string, 4, 32767), new ItemStack(Items.slime_ball, 1, 32767))
+ .itemOutputs(new ItemStack(Items.lead, 2))
+ .duration(2 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("batPack", 1L, 32767), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.IC2_ReBattery.get(6))
+ .duration(40 * SECONDS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("carbonFiber", 2), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_ModHandler.getIC2Item("carbonMesh", 1))
+ .duration(8 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 5),
+ new ItemStack(Blocks.chest, 1, 32767))
+ .itemOutputs(new ItemStack(Blocks.hopper))
+ .duration(8 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 5),
+ new ItemStack(Blocks.trapped_chest, 1, 32767))
+ .itemOutputs(new ItemStack(Blocks.hopper))
+ .duration(8 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 5),
+ new ItemStack(Blocks.chest, 1, 32767))
+ .itemOutputs(new ItemStack(Blocks.hopper))
+ .duration(8 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 5),
+ new ItemStack(Blocks.trapped_chest, 1, 32767))
+ .itemOutputs(new ItemStack(Blocks.hopper))
+ .duration(8 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.CobaltBrass, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1))
+ .itemOutputs(ItemList.Component_Sawblade_Diamond.get(1))
+ .duration(16 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1))
+ .itemOutputs(new ItemStack(Blocks.redstone_torch, 1))
+ .duration(1 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+ .itemOutputs(new ItemStack(Blocks.torch, 2))
+ .duration(2 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
+ .itemOutputs(new ItemStack(Blocks.torch, 6))
+ .duration(2 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1), ItemList.IC2_Resin.get(1))
+ .itemOutputs(new ItemStack(Blocks.torch, 6))
+ .duration(2 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ if (!GT_Mod.gregtechproxy.mDisableIC2Cables) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_ModHandler.getIC2Item("tinCableItem", 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 1))
+ .itemOutputs(GT_ModHandler.getIC2Item("insulatedTinCableItem", 1))
+ .duration(1 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_ModHandler.getIC2Item("copperCableItem", 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 1))
+ .itemOutputs(GT_ModHandler.getIC2Item("insulatedCopperCableItem", 1))
+ .duration(1 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_ModHandler.getIC2Item("goldCableItem", 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 2))
+ .itemOutputs(GT_ModHandler.getIC2Item("insulatedGoldCableItem", 1))
+ .duration(2 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_ModHandler.getIC2Item("ironCableItem", 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Rubber, 3))
+ .itemOutputs(GT_ModHandler.getIC2Item("insulatedIronCableItem", 1))
+ .duration(3 * SECONDS)
+ .eut(20)
+ .addTo(assemblerRecipes);
+ }
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Wood, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1))
+ .itemOutputs(new ItemStack(Items.wooden_sword, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Stone, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1))
+ .itemOutputs(new ItemStack(Items.stone_sword, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Iron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1))
+ .itemOutputs(new ItemStack(Items.iron_sword, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Gold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1))
+ .itemOutputs(new ItemStack(Items.golden_sword, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Diamond, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1))
+ .itemOutputs(new ItemStack(Items.diamond_sword, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Bronze, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1))
+ .itemOutputs(ItemList.Tool_Sword_Bronze.getUndamaged(1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadSword, Materials.Steel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 1))
+ .itemOutputs(ItemList.Tool_Sword_Steel.getUndamaged(1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Wood, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.wooden_pickaxe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Stone, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.stone_pickaxe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Iron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.iron_pickaxe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Gold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.golden_pickaxe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Diamond, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.diamond_pickaxe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Bronze, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(ItemList.Tool_Pickaxe_Bronze.getUndamaged(1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadPickaxe, Materials.Steel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(ItemList.Tool_Pickaxe_Steel.getUndamaged(1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Wood, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.wooden_shovel, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Stone, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.stone_shovel, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Iron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.iron_shovel, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Gold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.golden_shovel, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Diamond, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.diamond_shovel, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Bronze, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(ItemList.Tool_Shovel_Bronze.getUndamaged(1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadShovel, Materials.Steel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(ItemList.Tool_Shovel_Steel.getUndamaged(1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Wood, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.wooden_axe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Stone, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.stone_axe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Iron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.iron_axe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Gold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.golden_axe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Diamond, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.diamond_axe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Bronze, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(ItemList.Tool_Axe_Bronze.getUndamaged(1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadAxe, Materials.Steel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(ItemList.Tool_Axe_Steel.getUndamaged(1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Wood, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.wooden_hoe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Stone, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.stone_hoe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Iron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.iron_hoe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Gold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.golden_hoe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Diamond, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(new ItemStack(Items.diamond_hoe, 1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Bronze, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(ItemList.Tool_Hoe_Bronze.getUndamaged(1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.toolHeadHoe, Materials.Steel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Wood, 2))
+ .itemOutputs(ItemList.Tool_Hoe_Steel.getUndamaged(1))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ // fuel rod assembler recipes
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.ThoriumCell_1.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.ThoriumCell_2.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.ThoriumCell_1.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Steel, 6),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.ThoriumCell_4.get(1))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.ThoriumCell_2.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(ItemList.ThoriumCell_4.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Uraniumcell_1.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Uraniumcell_2.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Uraniumcell_1.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Steel, 6),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.Uraniumcell_4.get(1))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Uraniumcell_2.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(ItemList.Uraniumcell_4.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Moxcell_1.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Moxcell_2.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Moxcell_1.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Steel, 6),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.Moxcell_4.get(1))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Moxcell_2.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(ItemList.Moxcell_4.get(1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.NaquadahCell_1.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.NaquadahCell_2.get(1))
+ .duration(5 * SECONDS)
+ .eut(400)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.NaquadahCell_1.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.TungstenSteel, 6),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.NaquadahCell_4.get(1))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(400)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.NaquadahCell_2.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 4),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(ItemList.NaquadahCell_4.get(1))
+ .duration(5 * SECONDS)
+ .eut(400)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.MNqCell_1.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.MNqCell_2.get(1))
+ .duration(5 * SECONDS)
+ .eut(400)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.MNqCell_1.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.TungstenSteel, 6),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.MNqCell_4.get(1))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(400)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.MNqCell_2.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 4),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(ItemList.MNqCell_4.get(1))
+ .duration(5 * SECONDS)
+ .eut(400)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Neutronium, 8),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Iridium, 4))
+ .itemOutputs(ItemList.neutroniumHeatCapacitor.get(1))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ Materials.NaquadahAlloy.getPlates(8),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1))
+ .itemOutputs(ItemList.RadiantNaquadahAlloyCasing.get(1))
+ .duration(10 * TICKS)
+ .eut(400000)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.KevlarFiber.get(8), GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.WovenKevlar.get(1))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1),
+ ItemList.NC_SensorKit.get(1),
+ ItemList.Emitter_EV.get(1),
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1, 28),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Cover_Metrics_Transmitter.get(1))
+ .fluidInputs(Materials.SolderingAlloy.getMolten(INGOTS))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ ItemStack[] plates = new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L) };
+
+ for (Materials tMat : solderingMats) {
+ int tMultiplier = tMat.contains(SubTag.SOLDERING_MATERIAL_GOOD) ? 1
+ : tMat.contains(SubTag.SOLDERING_MATERIAL_BAD) ? 4 : 2;
+
+ for (ItemStack tPlate : plates) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.lever, 1, 32767), tPlate, GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_Controller.get(1))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.redstone_torch, 1, 32767),
+ tPlate,
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_ActivityDetector.get(1))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.heavy_weighted_pressure_plate, 1, 32767),
+ tPlate,
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_FluidDetector.get(1))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.light_weighted_pressure_plate, 1, 32767),
+ tPlate,
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_ItemDetector.get(1))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("ecMeter", 1), tPlate, GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cover_EnergyDetector.get(1))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+ }
+
+ }
+ }
+
+ /**
+ * Adds recipes for input buses from ULV to UHV
+ */
+ public void loadInputBusesRecipes() {
+ // ULV input bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_ULV.get(1))
+ .fluidInputs(Materials.Glue.getFluid(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_ULV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(1 * HALF_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_ULV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * EIGHTH_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_ULV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(4))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+ }
+
+ // LV input bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_LV.get(1))
+ .fluidInputs(Materials.Glue.getFluid(5 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_LV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_LV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * HALF_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_LV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(9))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ }
+
+ // MV input bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 3),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_MV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(2 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 3),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_MV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 3),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_MV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * EIGHTH_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ }
+
+ // HV input bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 0),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_HV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(3 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 0),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_HV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(2 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 0),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_HV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * QUARTER_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+
+ // EV input bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_EV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_EV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(4 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_EV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_EV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * HALF_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+ }
+
+ // IV input bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_IV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_IV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(8 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_IV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_IV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+ }
+
+ // LuV input bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LuV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_LuV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(16 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LuV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_LuV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(2 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+ }
+
+ // ZPM input bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ZPM.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 2, 5),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_ZPM.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(4 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+ }
+
+ // UV input bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_UV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 2, 6),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_UV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(8 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(assemblerRecipes);
+ }
+
+ // UHV input bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MAX.get(1),
+ getModItem(AvaritiaAddons.ID, "CompressedChest", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_Bus_MAX.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(16 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(assemblerRecipes);
+ }
+ }
+
+ /**
+ * Adds recipes for output buses from ULV to UHV
+ */
+ public void loadOutputBusesRecipes() {
+
+ /*
+ * those early exits prevents further hatches recipes from being registered, but it's probably fine, as that
+ * means we aren't in full pack
+ */
+
+ if (!NewHorizonsCoreMod.isModLoaded()) {
+ return;
+ }
+
+ // ULV output bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_ULV.get(1))
+ .fluidInputs(Materials.Glue.getFluid(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_ULV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(1 * HALF_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_ULV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * EIGHTH_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ getModItem(NewHorizonsCoreMod.ID, "BabyChest", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_ULV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(4))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+ }
+
+ // LV output bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_LV.get(1))
+ .fluidInputs(Materials.Glue.getFluid(5 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_LV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_LV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * HALF_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Hull_LV.get(1), new ItemStack(Blocks.chest), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_LV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(9))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ }
+
+ if (!IronChests.isModLoaded()) {
+ return;
+ }
+
+ // MV output bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 3),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_MV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(2 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 3),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_MV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 3),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_MV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * EIGHTH_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ }
+
+ // HV output bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 0),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_HV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(3 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 0),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_HV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(2 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 0),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_HV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * QUARTER_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+
+ // EV output bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_EV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_EV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(4 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_EV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_EV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * HALF_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+ }
+
+ // IV output bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_IV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_IV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(8 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_IV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_IV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+ }
+
+ // LuV output bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LuV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 2),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_LuV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(16 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LuV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 1, 2),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_LuV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(2 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+ }
+
+ // ZPM output bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ZPM.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 2, 5),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_ZPM.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(4 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+ }
+
+ // UV output bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_UV.get(1),
+ getModItem(IronChests.ID, "BlockIronChest", 2, 6),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_UV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(8 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(assemblerRecipes);
+ }
+
+ if (!AvaritiaAddons.isModLoaded()) {
+ return;
+ }
+
+ // UHV output bus
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MAX.get(1),
+ getModItem(AvaritiaAddons.ID, "CompressedChest", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_Bus_MAX.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(16 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(assemblerRecipes);
+ }
+ }
+
+ /**
+ * Adds recipes for input hatches from ULV to UHV
+ */
+ public void loadInputHatchesRecipes() {
+ // ULV input hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_ULV.get(1))
+ .fluidInputs(Materials.Glue.getFluid(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_ULV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(1 * HALF_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_ULV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * EIGHTH_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_ULV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(4))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+ }
+
+ /*
+ * those early exits prevents further hatches recipes from being registered, but it's probably fine, as that
+ * means we aren't in full pack
+ */
+
+ if (!BuildCraftFactory.isModLoaded()) {
+ return;
+ }
+
+ // LV input hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LV.get(1),
+ getModItem(BuildCraftFactory.ID, "tankBlock", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_LV.get(1))
+ .fluidInputs(Materials.Glue.getFluid(5 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LV.get(1),
+ getModItem(BuildCraftFactory.ID, "tankBlock", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_LV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LV.get(1),
+ getModItem(BuildCraftFactory.ID, "tankBlock", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_LV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * HALF_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LV.get(1),
+ getModItem(BuildCraftFactory.ID, "tankBlock", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_LV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(9))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ }
+
+ if (!IronTanks.isModLoaded()) {
+ return;
+ }
+
+ // MV input hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MV.get(1),
+ getModItem(IronTanks.ID, "copperTank", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_MV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(2 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MV.get(1),
+ getModItem(IronTanks.ID, "copperTank", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_MV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MV.get(1),
+ getModItem(IronTanks.ID, "copperTank", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_MV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * EIGHTH_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ }
+
+ // HV input hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1),
+ getModItem(IronTanks.ID, "ironTank", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_HV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(3 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1),
+ getModItem(IronTanks.ID, "ironTank", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_HV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(2 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1),
+ getModItem(IronTanks.ID, "ironTank", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_HV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * QUARTER_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+
+ // EV input hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_EV.get(1),
+ getModItem(IronTanks.ID, "silverTank", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_EV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(4 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_EV.get(1),
+ getModItem(IronTanks.ID, "silverTank", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_EV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * HALF_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+ }
+
+ // IV input hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_IV.get(1),
+ getModItem(IronTanks.ID, "goldTank", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_IV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(8 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_IV.get(1),
+ getModItem(IronTanks.ID, "goldTank", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_IV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+ }
+
+ // LuV input hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LuV.get(1),
+ getModItem(IronTanks.ID, "diamondTank", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_LuV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(16 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LuV.get(1),
+ getModItem(IronTanks.ID, "diamondTank", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_LuV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(2 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+ }
+
+ // ZPM input hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ZPM.get(1),
+ getModItem(IronTanks.ID, "obsidianTank", 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_ZPM.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(4 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+ }
+
+ // UV input hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Hull_UV.get(1), ItemList.Super_Tank_LV.get(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_UV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(8 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(assemblerRecipes);
+ }
+
+ // UHV input hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Hull_MAX.get(1), ItemList.Super_Tank_MV.get(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Hatch_Input_MAX.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(16 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(assemblerRecipes);
+ }
+ }
+
+ /**
+ * Adds recipes for output hatches from ULV to UHV
+ */
+ public void loadOutputHatchesRecipes() {
+ // ULV output hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_ULV.get(1))
+ .fluidInputs(Materials.Glue.getFluid(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_ULV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(1 * HALF_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_ULV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * EIGHTH_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ULV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_ULV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(4))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ULV)
+ .addTo(assemblerRecipes);
+ }
+
+ /*
+ * those early exits prevents further hatches recipes from being registered, but it's probably fine, as that
+ * means we aren't in full pack
+ */
+
+ if (!BuildCraftFactory.isModLoaded()) {
+ return;
+ }
+
+ // LV output hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LV.get(1),
+ getModItem(BuildCraftFactory.ID, "tankBlock", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_LV.get(1))
+ .fluidInputs(Materials.Glue.getFluid(5 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LV.get(1),
+ getModItem(BuildCraftFactory.ID, "tankBlock", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_LV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LV.get(1),
+ getModItem(BuildCraftFactory.ID, "tankBlock", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_LV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * HALF_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LV.get(1),
+ getModItem(BuildCraftFactory.ID, "tankBlock", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_LV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(9))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ }
+
+ if (!IronTanks.isModLoaded()) {
+ return;
+ }
+
+ // MV output hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MV.get(1),
+ getModItem(IronTanks.ID, "copperTank", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_MV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(2 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MV.get(1),
+ getModItem(IronTanks.ID, "copperTank", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_MV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_MV.get(1),
+ getModItem(IronTanks.ID, "copperTank", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_MV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * EIGHTH_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+ }
+
+ // HV output hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1),
+ getModItem(IronTanks.ID, "ironTank", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_HV.get(1))
+ .fluidInputs(Materials.Plastic.getMolten(3 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1),
+ getModItem(IronTanks.ID, "ironTank", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_HV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(2 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_HV.get(1),
+ getModItem(IronTanks.ID, "ironTank", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_HV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * QUARTER_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+
+ // EV output hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_EV.get(1),
+ getModItem(IronTanks.ID, "silverTank", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_EV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(4 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_EV.get(1),
+ getModItem(IronTanks.ID, "silverTank", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_EV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * HALF_INGOT))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+ }
+
+ // IV output hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_IV.get(1),
+ getModItem(IronTanks.ID, "goldTank", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_IV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(8 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_IV.get(1),
+ getModItem(IronTanks.ID, "goldTank", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_IV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(1 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+ }
+
+ // LuV output hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LuV.get(1),
+ getModItem(IronTanks.ID, "diamondTank", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_LuV.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(16 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_LuV.get(1),
+ getModItem(IronTanks.ID, "diamondTank", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_LuV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(2 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+ }
+
+ // ZPM output hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Hull_ZPM.get(1),
+ getModItem(IronTanks.ID, "obsidianTank", 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_ZPM.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(4 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+ }
+
+ // UV output hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Hull_UV.get(1), ItemList.Super_Tank_LV.get(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_UV.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(8 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(assemblerRecipes);
+ }
+
+ // UHV output hatch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Hull_MAX.get(1), ItemList.Super_Tank_MV.get(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Hatch_Output_MAX.get(1))
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(16 * INGOTS))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(assemblerRecipes);
+ }
+ }
+
+ /**
+ * Load all Railcraft recipes for GT Machines
+ */
+ private void withRailcraft() {
+ if (!Railcraft.isModLoaded()) return;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.stone_slab, 1, 0),
+ ItemList.RC_Rebar.get(1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_Tie_Stone.get(1))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.stone_slab, 1, 7),
+ ItemList.RC_Rebar.get(1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_Tie_Stone.get(1))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 3),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.RC_Rail_HS.get(16))
+ .fluidInputs(Materials.Blaze.getMolten(216))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 3),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(ItemList.RC_Rail_HS.get(8))
+ .fluidInputs(Materials.ConductiveIron.getMolten(432))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 3),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(ItemList.RC_Rail_HS.get(32))
+ .fluidInputs(Materials.VibrantAlloy.getMolten(216))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 3),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(ItemList.RC_Rail_HS.get(64))
+ .fluidInputs(Materials.CrystallineAlloy.getMolten(216))
+ .duration(5 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Rail_Standard.get(3),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.RC_Rail_Adv.get(8))
+ .fluidInputs(Materials.Redstone.getMolten(216))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Rail_Standard.get(3),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.RC_Rail_Adv.get(16))
+ .fluidInputs(Materials.RedAlloy.getMolten(216))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Rail_Standard.get(3),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.RC_Rail_Adv.get(32))
+ .fluidInputs(Materials.ConductiveIron.getMolten(216))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Rail_Standard.get(3),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Electrum, 3),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(ItemList.RC_Rail_Adv.get(64))
+ .fluidInputs(Materials.VibrantAlloy.getMolten(216))
+ .duration(5 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Rail_Standard.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Copper, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_Rail_Electric.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Rail_Standard.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.AnnealedCopper, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_Rail_Electric.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Rail_Standard.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Gold, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_Rail_Electric.get(2))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Rail_Standard.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Electrum, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_Rail_Electric.get(4))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Rail_Standard.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_Rail_Electric.get(8))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Rail_Standard.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.TungstenSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_Rail_Electric.get(16))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Rail_Standard.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.HSSG, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_Rail_Electric.get(32))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Rail_Standard.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Naquadah, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_Rail_Electric.get(64))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(96)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Tie_Wood.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 1),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemList.RC_Rail_Wooden.get(8))
+ .duration(6 * SECONDS + 13 * TICKS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Tie_Wood.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 1),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(ItemList.RC_Rail_Wooden.get(8))
+ .duration(6 * SECONDS + 13 * TICKS)
+ .eut(4)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Tie_Wood.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 1),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(ItemList.RC_Rail_Wooden.get(16))
+ .duration(6 * SECONDS + 13 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Tie_Wood.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.StainlessSteel, 1),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(ItemList.RC_Rail_Wooden.get(32))
+ .duration(6 * SECONDS + 13 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Tie_Wood.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(ItemList.RC_Rail_Wooden.get(64))
+ .duration(6 * SECONDS + 13 * TICKS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.RC_Tie_Wood.get(32), GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(ItemList.RC_Bed_Wood.get(24))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.RC_Tie_Wood.get(64), GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(ItemList.RC_Bed_Wood.get(48))
+ .duration(10 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.RC_Tie_Stone.get(32), GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(ItemList.RC_Bed_Stone.get(24))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.RC_Tie_Stone.get(64), GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(ItemList.RC_Bed_Stone.get(48))
+ .duration(10 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ ItemStack tRailWood = getModItem(Railcraft.ID, "track", 64, 736);
+ if (tRailWood != null) {
+ NBTTagCompound tTagWood = new NBTTagCompound();
+ tTagWood.setString("track", "railcraft:track.slow");
+ tRailWood.stackTagCompound = tTagWood;
+
+ ItemStack tRailWoodB = getModItem(Railcraft.ID, "track.slow", 16);
+ NBTTagCompound tTagWoodB = new NBTTagCompound();
+ tTagWoodB.setString("track", "railcraft:track.slow.boost");
+ tRailWoodB.stackTagCompound = tTagWoodB;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Bed_Wood.get(1),
+ ItemList.RC_Rail_Wooden.get(6),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(tRailWood)
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(tRailWoodB)
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ }
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 1, 0),
+ ItemList.RC_Rail_Adv.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(new ItemStack(Blocks.golden_rail, 16, 0))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Bed_Wood.get(1),
+ ItemList.RC_Rail_Standard.get(6),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(new ItemStack(Blocks.rail, 64, 0))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ ItemStack tRailRe = getModItem(Railcraft.ID, "track", 64);
+ NBTTagCompound tTagRe = new NBTTagCompound();
+ tTagRe.setString("track", "railcraft:track.reinforced");
+ tRailRe.stackTagCompound = tTagRe;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Bed_Stone.get(1),
+ ItemList.RC_Rail_Reinforced.get(6),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(tRailRe)
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ ItemStack tRailReB = getModItem(Railcraft.ID, "track.reinforced", 16);
+ NBTTagCompound tTagReB = new NBTTagCompound();
+ tTagReB.setString("track", "railcraft:track.reinforced.boost");
+ tRailReB.stackTagCompound = tTagReB;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(tRailReB)
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ ItemStack tRailEl = getModItem(Railcraft.ID, "track", 64);
+ NBTTagCompound tTagEl = new NBTTagCompound();
+ tTagEl.setString("track", "railcraft:track.electric");
+ tRailEl.stackTagCompound = tTagEl;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Bed_Stone.get(1),
+ ItemList.RC_Rail_Electric.get(6),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(tRailEl)
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ ItemStack tRailHs = getModItem(Railcraft.ID, "track", 64, 816);
+ if (tRailHs != null) {
+ NBTTagCompound tTagHs = new NBTTagCompound();
+ tTagHs.setString("track", "railcraft:track.speed");
+ tRailHs.stackTagCompound = tTagHs;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.RC_Bed_Stone.get(1),
+ ItemList.RC_Rail_HS.get(6),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(tRailHs)
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+ }
+ ItemStack tRailHsB = getModItem(Railcraft.ID, "track.speed", 16);
+ NBTTagCompound tTagHsB = new NBTTagCompound();
+ tTagHsB.setString("track", "railcraft:track.speed.boost");
+ tRailHsB.stackTagCompound = tTagHsB;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(tRailHsB)
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ // --- Wooden Switch Track ---
+ ItemStack tRailSS = getModItem(Railcraft.ID, "track.slow", 1, 19986);
+ if (tRailSS != null) {
+ NBTTagCompound tTagSS = new NBTTagCompound();
+ tTagSS.setString("track", "railcraft:track.slow.switch");
+ tRailSS.stackTagCompound = tTagSS;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.AnyIron, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailSS)
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Steel, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailSS))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.StainlessSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailSS))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailSS))
+ .duration(5 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.TungstenSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailSS))
+ .duration(5 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Iridium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailSS))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Osmium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailSS))
+ .duration(5 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+ }
+ // --- Wooden Wye Track ---
+ ItemStack tRailSW = getModItem(Railcraft.ID, "track.slow", 1);
+ if (tRailSW != null) {
+ NBTTagCompound tTagSW = new NBTTagCompound();
+ tTagSW.setString("track", "railcraft:track.slow.wye");
+ tRailSW.stackTagCompound = tTagSW;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.AnyIron, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailSW)
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Steel, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailSW))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.StainlessSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailSW))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailSW))
+ .duration(5 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.TungstenSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailSW))
+ .duration(5 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Iridium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailSW))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Osmium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailSW))
+ .duration(5 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+ }
+ // --- Wooden Junction Tack ---
+ ItemStack tRailSJ = getModItem(Railcraft.ID, "track.slow", 1);
+ if (tRailSJ != null) {
+ NBTTagCompound tTagSJ = new NBTTagCompound();
+ tTagSJ.setString("track", "railcraft:track.slow.junction");
+ tRailSJ.stackTagCompound = tTagSJ;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.AnyIron, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailSJ)
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailSJ))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.StainlessSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailSJ))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailSJ))
+ .duration(5 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.TungstenSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailSJ))
+ .duration(5 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Iridium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailSJ))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailWood),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Osmium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailSJ))
+ .duration(5 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+ }
+ // --- Switch Tack ---
+ ItemStack tRailNS = getModItem(Railcraft.ID, "track", 1, 4767);
+ if (tRailNS != null) {
+ NBTTagCompound tTagNS = new NBTTagCompound();
+ tTagNS.setString("track", "railcraft:track.switch");
+ tRailNS.stackTagCompound = tTagNS;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailNS)
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.StainlessSteel, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailNS))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailNS))
+ .duration(10 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.TungstenSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailNS))
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Iridium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailNS))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Osmium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailNS))
+ .duration(10 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Neutronium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailNS))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ }
+ // --- Wye Tack ---
+ ItemStack tRailNW = getModItem(Railcraft.ID, "track", 1, 2144);
+ if (tRailNW != null) {
+ NBTTagCompound tTagNW = new NBTTagCompound();
+ tTagNW.setString("track", "railcraft:track.wye");
+ tRailNW.stackTagCompound = tTagNW;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailNW)
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.StainlessSteel, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailNW))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailNW))
+ .duration(10 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.TungstenSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailNW))
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Iridium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailNW))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Osmium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailNW))
+ .duration(10 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailNW))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+ // --- Junction Tack ---
+ ItemStack tRailNJ = getModItem(Railcraft.ID, "track", 1);
+ if (tRailNJ != null) {
+ NBTTagCompound tTagNJ = new NBTTagCompound();
+ tTagNJ.setString("track", "railcraft:track.junction");
+ tRailNJ.stackTagCompound = tTagNJ;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailNJ)
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.StainlessSteel, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailNJ))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailNJ))
+ .duration(10 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.TungstenSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailNJ))
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Iridium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailNJ))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Osmium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailNJ))
+ .duration(10 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.rail, 2, 0),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailNJ))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+ // --- Reinforced Switch Track ---
+ ItemStack tRailRS = getModItem(Railcraft.ID, "track.reinforced", 1);
+ if (tRailRS != null) {
+ NBTTagCompound tTagRS = new NBTTagCompound();
+ tTagRS.setString("track", "railcraft:track.reinforced.switch");
+ tRailRS.stackTagCompound = tTagRS;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailRS)
+ .duration(15 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.StainlessSteel, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailRS))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailRS))
+ .duration(15 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.TungstenSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailRS))
+ .duration(15 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Iridium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailRS))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Osmium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailRS))
+ .duration(15 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Neutronium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailRS))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+ // --- Reinforced Wye Track ---
+ ItemStack tRailRW = getModItem(Railcraft.ID, "track.reinforced", 1);
+ if (tRailRW != null) {
+ NBTTagCompound tTagRW = new NBTTagCompound();
+ tTagRW.setString("track", "railcraft:track.reinforced.wye");
+ tRailRW.stackTagCompound = tTagRW;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailRW)
+ .duration(15 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.StainlessSteel, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailRW))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailRW))
+ .duration(15 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.TungstenSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailRW))
+ .duration(15 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Iridium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailRW))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Osmium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailRW))
+ .duration(15 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailRW))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+ // --- Reinforced Junction Track ---
+ ItemStack tRailRJ = getModItem(Railcraft.ID, "track.reinforced", 1, 764);
+ if (tRailRJ != null) {
+ NBTTagCompound tTagRJ = new NBTTagCompound();
+ tTagRJ.setString("track", "railcraft:track.reinforced.junction");
+ tRailRJ.stackTagCompound = tTagRJ;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailRJ)
+ .duration(15 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.StainlessSteel, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailRJ))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailRJ))
+ .duration(15 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.TungstenSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailRJ))
+ .duration(15 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Iridium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailRJ))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Osmium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailRJ))
+ .duration(15 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailRe),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailRJ))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+ // --- H.S. Switch Track ---
+ ItemStack tRailSSw = getModItem(Railcraft.ID, "track.speed", 1, 7916);
+ if (tRailSSw != null) {
+ NBTTagCompound tTagRSSw = new NBTTagCompound();
+ tTagRSSw.setString("track", "railcraft:track.speed.switch");
+ tRailSSw.stackTagCompound = tTagRSSw;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailSSw)
+ .duration(20 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.StainlessSteel, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailSSw))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailSSw))
+ .duration(20 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.TungstenSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailSSw))
+ .duration(20 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Iridium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailSSw))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Osmium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailSSw))
+ .duration(20 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Neutronium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailSSw))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+ // --- H.S. Wye Track ---
+ ItemStack tRailSWy = getModItem(Railcraft.ID, "track.speed", 1);
+ if (tRailSWy != null) {
+ NBTTagCompound tTagRSWy = new NBTTagCompound();
+ tTagRSWy.setString("track", "railcraft:track.speed.wye");
+ tRailSWy.stackTagCompound = tTagRSWy;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Steel, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailSWy)
+ .duration(20 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.StainlessSteel, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailSWy))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailSWy))
+ .duration(20 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.TungstenSteel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailSWy))
+ .duration(20 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Iridium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailSWy))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Osmium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailSWy))
+ .duration(20 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailSWy))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+ // --- H.S. Transition Track ---
+ ItemStack tRailSTt = getModItem(Railcraft.ID, "track.speed", 1, 26865);
+ if (tRailSTt != null) {
+ NBTTagCompound tTagRSTt = new NBTTagCompound();
+ tTagRSTt.setString("track", "railcraft:track.speed.transition");
+ tRailSTt.stackTagCompound = tTagRSTt;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ ItemList.RC_Bed_Stone.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailSTt))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ ItemList.RC_Bed_Stone.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.ConductiveIron, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailSTt))
+ .duration(20 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ ItemList.RC_Bed_Stone.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.VibrantAlloy, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailSTt))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ ItemList.RC_Bed_Stone.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CrystallineAlloy, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailSTt))
+ .duration(20 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailHs),
+ ItemList.RC_Bed_Stone.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.MelodicAlloy, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailSTt))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+ // --- Electric Switch Track ---
+ ItemStack tRailES = getModItem(Railcraft.ID, "track.electric", 1, 10488);
+ if (tRailES != null) {
+ NBTTagCompound tTagES = new NBTTagCompound();
+ tTagES.setString("track", "railcraft:track.electric.switch");
+ tRailES.stackTagCompound = tTagES;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Copper, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailES)
+ .duration(20 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Gold, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailES))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Electrum, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailES))
+ .duration(20 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailES))
+ .duration(20 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Platinum, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailES))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.VanadiumGallium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailES))
+ .duration(20 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.springSmall, Materials.Naquadah, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailES))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+ // --- Electric Wye Track ---
+ ItemStack tRailEw = getModItem(Railcraft.ID, "track.electric", 1);
+ if (tRailEw != null) {
+ NBTTagCompound tTagEw = new NBTTagCompound();
+ tTagEw.setString("track", "railcraft:track.electric.wye");
+ tRailEw.stackTagCompound = tTagEw;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Copper, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailEw)
+ .duration(20 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Gold, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailEw))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Electrum, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailEw))
+ .duration(20 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailEw))
+ .duration(20 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Platinum, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailEw))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.VanadiumGallium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailEw))
+ .duration(20 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Naquadah, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailEw))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+ // --- Electric Junction Track ---
+ ItemStack tRailEJ = getModItem(Railcraft.ID, "track.electric", 1);
+ if (tRailEJ != null) {
+ NBTTagCompound tTagREJ = new NBTTagCompound();
+ tTagREJ.setString("track", "railcraft:track.electric.junction");
+ tRailEJ.stackTagCompound = tTagREJ;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Copper, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(tRailEJ)
+ .duration(20 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Gold, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(2, tRailEJ))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Electrum, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(4, tRailEJ))
+ .duration(20 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(8, tRailEJ))
+ .duration(20 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Platinum, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(16, tRailEJ))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.VanadiumGallium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(32, tRailEJ))
+ .duration(20 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.copyAmount(2, tRailEl),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Naquadah, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_Utility.copyAmount(64, tRailEJ))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+ }
+ // Shunting Wire
+ for (Materials tMat : solderingMats) {
+ int tMultiplier = tMat.contains(SubTag.SOLDERING_MATERIAL_GOOD) ? 1
+ : tMat.contains(SubTag.SOLDERING_MATERIAL_BAD) ? 4 : 2;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Copper, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Lead, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_ShuntingWire.get(1))
+ .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.AnnealedCopper, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Lead, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_ShuntingWire.get(1))
+ .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Gold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Lead, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_ShuntingWire.get(4))
+ .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut(24)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Electrum, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Gold, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_ShuntingWire.get(8))
+ .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titanium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Electrum, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_ShuntingWire.get(16))
+ .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut(48)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Platinum, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_ShuntingWire.get(32))
+ .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.VanadiumGallium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Platinum, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.RC_ShuntingWire.get(64))
+ .fluidInputs(tMat.getMolten(16L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ // chunkloader upgrade OC
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Plastic_Advanced.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.Aluminium, 2),
+ getModItem(Railcraft.ID, "machine.alpha", 1L, 0),
+ getModItem(OpenComputers.ID, "item", 1L, 26),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(OpenComputers.ID, "item", 1L, 62))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(12 * SECONDS + 10 * TICKS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.piston, 1, 0),
+ ItemList.FR_Casing_Sturdy.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Lapis, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(NewHorizonsCoreMod.ID, "item.EngineCore", 1L, 0))
+ .fluidInputs(Materials.SeedOil.getFluid(250))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.piston, 1, 0),
+ ItemList.FR_Casing_Sturdy.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Lapis, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(NewHorizonsCoreMod.ID, "item.EngineCore", 1L, 0))
+ .fluidInputs(Materials.Lubricant.getFluid(125))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(ExtraUtilities.ID, "trashcan", 1L, 0),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Obsidian, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 11))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(NewHorizonsCoreMod.ID, "item.EngineCore", 1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.AnyCopper, 10),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 7))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(NewHorizonsCoreMod.ID, "item.EngineCore", 1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 10),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 8))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(NewHorizonsCoreMod.ID, "item.EngineCore", 1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 10),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 9))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Gold, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Diamond, 4),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.EnderPearl, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Obsidian, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 1, 0))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.AnyIron, 2),
+ GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 0))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.AnyIron, 2),
+ new ItemStack(Blocks.glass_pane, 2, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 2L, 1))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.AnyIron, 2),
+ getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 2L, 1))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Bronze, 2),
+ new ItemStack(Blocks.iron_bars, 2, 0),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 2))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 2),
+ GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 13))
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 2),
+ new ItemStack(Blocks.glass_pane, 2, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 2L, 14))
+ .duration(20 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 2),
+ getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 2L, 14))
+ .duration(20 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Steel, 2),
+ getModItem(NewHorizonsCoreMod.ID, "item.SteelBars", 2),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 15))
+ .duration(20 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2),
+ GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 0))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2),
+ new ItemStack(Blocks.glass_pane, 2, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 1))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 2),
+ getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 1))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Plastic, 2),
+ getModItem(NewHorizonsCoreMod.ID, "item.AluminiumBars", 2),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 2))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 2),
+ GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 3))
+ .duration(10 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 2),
+ new ItemStack(Blocks.glass_pane, 2, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 4))
+ .duration(20 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 2),
+ getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 4))
+ .duration(20 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.StainlessSteel, 2),
+ getModItem(NewHorizonsCoreMod.ID, "item.StainlessSteelBars", 2),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 5))
+ .duration(20 * SECONDS)
+ .eut(256)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 2),
+ GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 6))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 2),
+ new ItemStack(Blocks.glass_pane, 2, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 7))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 2),
+ getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 7))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Titanium, 2),
+ getModItem(NewHorizonsCoreMod.ID, "item.TitaniumBars", 2),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 8))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2),
+ GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 9))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2),
+ new ItemStack(Blocks.glass_pane, 2, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 10))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2),
+ getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 10))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.TungstenSteel, 2),
+ getModItem(NewHorizonsCoreMod.ID, "item.TungstenSteelBars", 2),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 11))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Palladium, 2),
+ GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 12))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Palladium, 2),
+ new ItemStack(Blocks.glass_pane, 2, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 13))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Palladium, 2),
+ getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 2L, 13))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.NiobiumTitanium, 2),
+ getModItem(NewHorizonsCoreMod.ID, "item.ChromeBars", 2),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 14))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2),
+ GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 1L, 0))
+ .duration(10 * SECONDS)
+ .eut(4096)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2),
+ new ItemStack(Blocks.glass_pane, 2, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 2L, 1))
+ .duration(20 * SECONDS)
+ .eut(4096)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2),
+ getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 2L, 1))
+ .duration(20 * SECONDS)
+ .eut(4096)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Enderium, 2),
+ getModItem(NewHorizonsCoreMod.ID, "item.IridiumBars", 2),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 1L, 2))
+ .duration(20 * SECONDS)
+ .eut(4096)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2),
+ GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 1L, 3))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2),
+ new ItemStack(Blocks.glass_pane, 2, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 2L, 4))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2),
+ getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 2L, 4))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Naquadah, 2),
+ getModItem(NewHorizonsCoreMod.ID, "item.OsmiumBars", 2),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 1L, 5))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
+ GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 1L, 6))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
+ new ItemStack(Blocks.glass_pane, 2, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 2L, 7))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
+ getModItem(TinkerConstruct.ID, "GlassPane", 2L, 0),
+ GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 2L, 7))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Neutronium, 2),
+ getModItem(NewHorizonsCoreMod.ID, "item.NeutroniumBars", 2),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.eta", 1L, 8))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ // Water Tank
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Wood, 2))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 1L, 14))
+ .fluidInputs(Materials.Glue.getFluid(36))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.IronMagnetic, 1),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Wood, 2))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 1L, 14))
+ .fluidInputs(Materials.Glue.getFluid(36))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Wood, 2))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 1L, 14))
+ .fluidInputs(Materials.Glue.getFluid(36))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Steel, 4),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Wood, 4))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 3L, 14))
+ .fluidInputs(Materials.Glue.getFluid(72))
+ .duration(20 * SECONDS)
+ .eut(30)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Steel, 2),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.WoodSealed, 1))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 3L, 14))
+ .fluidInputs(Materials.Plastic.getMolten(36))
+ .duration(20 * SECONDS)
+ .eut(30)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.StainlessSteel, 4),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.WoodSealed, 4))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.alpha", 9L, 14))
+ .fluidInputs(Materials.Plastic.getMolten(72))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ // Steam Boilers
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Item_Casing_Iron.get(6), GT_Utility.getIntegratedCircuit(6))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 3))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Item_Casing_Steel.get(6), GT_Utility.getIntegratedCircuit(6))
+ .itemOutputs(getModItem(Railcraft.ID, "machine.beta", 1L, 4))
+ .duration(20 * SECONDS)
+ .eut(64)
+ .addTo(assemblerRecipes);
+ }
+
+ public void withBartWorks() {
+ if (!BartWorks.isModLoaded()) {
+ return;
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, ExternalMaterials.getRhodiumPlatedPalladium(), 6),
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Chrome, 1))
+ .itemOutputs(ItemList.Casing_Advanced_Rhodium_Palladium.get(1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(assemblerRecipes);
+
+ }
+
+ public void withGalacticraftMars() {
+ if (!GalacticraftMars.isModLoaded()) {
+ return;
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.compressed, Materials.Bronze, 1),
+ GT_OreDictUnificator.get(OrePrefixes.compressed, Materials.Aluminium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.compressed, Materials.Steel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Ingot_Heavy1.get(1))
+ .fluidInputs(Materials.StainlessSteel.getMolten(72))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(GalacticraftCore.ID, "item.heavyPlating", 1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.MeteoricIron, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Ingot_Heavy2.get(1))
+ .fluidInputs(Materials.TungstenSteel.getMolten(72))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(GalacticraftMars.ID, "item.null", 1L, 3),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Desh, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Ingot_Heavy3.get(1))
+ .fluidInputs(Materials.Platinum.getMolten(72))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+ }
+
+ public void withGalaxySpace() {
+ if (!GalaxySpace.isModLoaded()) {
+ return;
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Pentacadmiummagnesiumhexaoxid, 3),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.StainlessSteel, 2),
+ ItemList.Electric_Pump_MV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorMV, 3))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 2000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Titaniumonabariumdecacoppereikosaoxid, 6),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Titanium, 4),
+ ItemList.Electric_Pump_HV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorHV, 6))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 4000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Uraniumtriplatinid, 9),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.TungstenSteel, 6),
+ ItemList.Electric_Pump_EV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorEV, 9))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 6000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Vanadiumtriindinid, 12),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.NiobiumTitanium, 8),
+ ItemList.Electric_Pump_IV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorIV, 12))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 8000))
+ .duration(32 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(
+ OrePrefixes.wireGt01,
+ Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid,
+ 15),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Enderium, 10),
+ ItemList.Electric_Pump_LuV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 15))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 12000))
+ .duration(32 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 18),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Naquadah, 12),
+ ItemList.Electric_Pump_ZPM.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorZPM, 18))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 16000))
+ .duration(1 * MINUTES + 4 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuvwire, 21),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Neutronium, 14),
+ ItemList.Electric_Pump_UV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUV, 21))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 20000))
+ .duration(1 * MINUTES + 4 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Longasssuperconductornameforuhvwire, 24),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Bedrockium, 16),
+ ItemList.Electric_Pump_UHV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 24))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 24000))
+ .duration(2 * MINUTES + 8 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEVBase, 27),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Infinity, 18),
+ ItemList.Electric_Pump_UEV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEV, 27))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 28000))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_UEV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMVBase, 33),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, MaterialsUEVplus.SpaceTime, 22),
+ ItemList.Electric_Pump_UMV.get(1),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, 33))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("liquid helium"), 36000))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(assemblerRecipes);
+ }
+
+ public void withGTNHLanthAndGTPP() {
+ if (!(GTNHLanthanides.isModLoaded() && GTPlusPlus.isModLoaded())) {
+ return;
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Electric_Pump_EV.get(4),
+ ItemList.Field_Generator_EV.get(4),
+ getModItem(GTPlusPlus.ID, "itemPlateInconel690", 4),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 16),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.BorosilicateGlass, 16),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Polytetrafluoroethylene, 4),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Data, 4),
+ ItemList.Shape_Extruder_Wire.get(16))
+ .itemOutputs(ItemList.Spinneret.get(1))
+ .fluidInputs(Materials.SolderingAlloy.getMolten(144))
+ .duration(2 * MINUTES)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(assemblerRecipes);
+ }
+
+ public void withIC2NuclearControl() {
+ if (!IC2NuclearControl.isModLoaded()) { // Card recycling recipes
+ return;
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(IC2NuclearControl.ID, "ItemVanillaMachineCard", 1L, 0),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(IC2NuclearControl.ID, "ItemInventoryScannerCard", 1L, 0),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(IC2NuclearControl.ID, "ItemEnergySensorLocationCard", 1L, 0),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(IC2NuclearControl.ID, "RFSensorCard", 1L, 0), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(IC2NuclearControl.ID, "ItemMultipleSensorLocationCard", 1L, 0),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ // counter
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(IC2NuclearControl.ID, "ItemMultipleSensorLocationCard", 1L, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ // liquid
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(IC2NuclearControl.ID, "ItemMultipleSensorLocationCard", 1L, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ // generator
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(IC2NuclearControl.ID, "ItemLiquidArrayLocationCard", 1L, 0),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ // 2-6 liquid
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(IC2NuclearControl.ID, "ItemEnergyArrayLocationCard", 1L, 0),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ // 2-6 energy
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(IC2NuclearControl.ID, "ItemSensorLocationCard", 1L, 0),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Good), 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ // non-fluid nuke
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(IC2NuclearControl.ID, "Item55ReactorCard", 1L, 0),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.circuit.get(Materials.Good), 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(IC2NuclearControl.ID, "CardAppeng", 1L, 0), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.NC_SensorCard.get(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("electronicCircuit", 3))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(assemblerRecipes);
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/AssemblyLineRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/AssemblyLineRecipes.java
new file mode 100644
index 0000000000..8748c96654
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/AssemblyLineRecipes.java
@@ -0,0 +1,894 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.TecTech;
+import static gregtech.api.util.GT_RecipeBuilder.HOURS;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.AssemblyLine;
+import static gregtech.api.util.GT_RecipeConstants.RESEARCH_ITEM;
+import static gregtech.api.util.GT_RecipeConstants.RESEARCH_TIME;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.ExternalMaterials;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class AssemblyLineRecipes implements Runnable {
+
+ private final Fluid solderIndalloy;
+ private final Materials LuVMat;
+
+ public AssemblyLineRecipes() {
+ solderIndalloy = GTPlusPlus.isModLoaded() ? FluidRegistry.getFluid("molten.indalloy140")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+
+ LuVMat = ExternalMaterials.getRuridit();
+ }
+
+ @Override
+ public void run() {
+ // recipe len:
+ // LUV 6 72000 600 32k
+ // ZPM 9 144000 1200 125k
+ // UV- 12 288000 1800 500k
+ // UV+/UHV- 14 360000 2100 2000k
+ // UHV+ 16 576000 2400 4000k
+
+ // addAssemblylineRecipe(ItemStack aResearchItem, int aResearchTime, ItemStack[] aInputs, FluidStack[]
+ // aFluidInputs, ItemStack aOutput1, int aDuration, int aEUt);
+
+ // indalloy and ruridit are from gt++ and bartworks which are not dependencies
+
+ // Motors
+ {
+ // LuV motor
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Electric_Motor_IV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 1),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.HSSS, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 2))
+ .fluidInputs(new FluidStack(solderIndalloy, 144), Materials.Lubricant.getFluid(250))
+ .itemOutputs(ItemList.Electric_Motor_LuV.get(1))
+ .eut(TierEU.RECIPE_IV)
+ .duration(30 * SECONDS)
+ .addTo(AssemblyLine);
+
+ // ZPM motor
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Electric_Motor_LuV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.SamariumMagnetic, 2),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.NaquadahAlloy, 4),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.NaquadahAlloy, 4),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.NaquadahAlloy, 16),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 2))
+ .fluidInputs(new FluidStack(solderIndalloy, 288), Materials.Lubricant.getFluid(750))
+ .itemOutputs(ItemList.Electric_Motor_ZPM.get(1))
+ .eut(TierEU.RECIPE_LuV)
+ .duration(30 * SECONDS)
+ .addTo(AssemblyLine);
+
+ // UV motor
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Electric_Motor_ZPM.get(1))
+ .metadata(RESEARCH_TIME, 4 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.SamariumMagnetic, 2),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Neutronium, 4),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Neutronium, 4),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.Neutronium, 16),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 2))
+ .fluidInputs(
+ Materials.Naquadria.getMolten(1296),
+ new FluidStack(solderIndalloy, 1296),
+ Materials.Lubricant.getFluid(2000))
+ .itemOutputs(ItemList.Electric_Motor_UV.get(1))
+ .eut(TierEU.RECIPE_ZPM)
+ .duration(30 * SECONDS)
+ .addTo(AssemblyLine);
+ }
+
+ // Pumps
+ {
+ // LuV Pump
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Electric_Pump_IV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ ItemList.Electric_Motor_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeSmall, Materials.NiobiumTitanium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 2),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.HSSS, 8),
+ new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 4 },
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.HSSS, 2),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 2))
+ .fluidInputs(new FluidStack(solderIndalloy, 144), Materials.Lubricant.getFluid(250))
+ .itemOutputs(ItemList.Electric_Pump_LuV.get(1))
+ .eut(TierEU.RECIPE_IV)
+ .duration(600)
+ .addTo(AssemblyLine);
+
+ // ZPM Pump
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Electric_Pump_LuV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ ItemList.Electric_Motor_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Enderium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 2),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.NaquadahAlloy, 8),
+ new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 8 },
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.NaquadahAlloy, 2),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 2))
+ .fluidInputs(new FluidStack(solderIndalloy, 288), Materials.Lubricant.getFluid(750))
+ .itemOutputs(ItemList.Electric_Pump_ZPM.get(1))
+ .eut(TierEU.RECIPE_LuV)
+ .duration(30 * SECONDS)
+ .addTo(AssemblyLine);
+
+ // UV Pump
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Electric_Pump_ZPM.get(1))
+ .metadata(RESEARCH_TIME, 4 * HOURS)
+ .itemInputs(
+ ItemList.Electric_Motor_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Naquadah, 2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 8),
+ new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 16 },
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Neutronium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 2))
+ .itemOutputs(ItemList.Electric_Pump_UV.get(1))
+ .fluidInputs(
+ Materials.Naquadria.getMolten(1296),
+ new FluidStack(solderIndalloy, 1296),
+ Materials.Lubricant.getFluid(2000))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_ZPM)
+ .addTo(AssemblyLine);
+ }
+
+ // Conveyors
+ {
+ // LuV Conveyor
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Conveyor_Module_IV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ ItemList.Electric_Motor_LuV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 2),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.HSSS, 4),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.HSSS, 32),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 2),
+ new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 10 })
+ .itemOutputs(ItemList.Conveyor_Module_LuV.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 144), Materials.Lubricant.getFluid(250))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_IV)
+ .addTo(AssemblyLine);
+
+ // ZPM Conveyor
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Conveyor_Module_LuV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ ItemList.Electric_Motor_ZPM.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 2),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.NaquadahAlloy, 4),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.NaquadahAlloy, 32),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 2),
+ new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 20 })
+ .itemOutputs(ItemList.Conveyor_Module_ZPM.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 288), Materials.Lubricant.getFluid(750))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_LuV)
+ .addTo(AssemblyLine);
+
+ // UV Conveyor
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Conveyor_Module_ZPM.get(1))
+ .metadata(RESEARCH_TIME, 4 * HOURS)
+ .itemInputs(
+ ItemList.Electric_Motor_UV.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Neutronium, 4),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.Neutronium, 32),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 2),
+ new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 40 })
+ .itemOutputs(ItemList.Conveyor_Module_UV.get(1))
+ .fluidInputs(
+ Materials.Naquadria.getMolten(1296),
+ new FluidStack(solderIndalloy, 1296),
+ Materials.Lubricant.getFluid(2000))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_ZPM)
+ .addTo(AssemblyLine);
+ }
+
+ // Pistons
+ {
+ // LuV Piston
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Electric_Piston_IV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ ItemList.Electric_Motor_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 6),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.HSSS, 4),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.HSSS, 32),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.HSSS, 4),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.HSSS, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.HSSS, 2),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 4))
+ .itemOutputs(ItemList.Electric_Piston_LuV.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 144), Materials.Lubricant.getFluid(250))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_IV)
+ .addTo(AssemblyLine);
+
+ // ZPM Pistons
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Electric_Piston_LuV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ ItemList.Electric_Motor_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 6),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.NaquadahAlloy, 4),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.NaquadahAlloy, 32),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.NaquadahAlloy, 4),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.NaquadahAlloy, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.NaquadahAlloy, 2),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 4))
+ .itemOutputs(ItemList.Electric_Piston_ZPM.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 288), Materials.Lubricant.getFluid(750))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_LuV)
+ .addTo(AssemblyLine);
+
+ // UV Piston
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Electric_Piston_ZPM.get(1))
+ .metadata(RESEARCH_TIME, 4 * HOURS)
+ .itemInputs(
+ ItemList.Electric_Motor_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 6),
+ GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Neutronium, 4),
+ GT_OreDictUnificator.get(OrePrefixes.round, Materials.Neutronium, 32),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Neutronium, 4),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Neutronium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 4))
+ .itemOutputs(ItemList.Electric_Piston_UV.get(1))
+ .fluidInputs(
+ Materials.Naquadria.getMolten(1296),
+ new FluidStack(solderIndalloy, 1296),
+ Materials.Lubricant.getFluid(2000))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_ZPM)
+ .addTo(AssemblyLine);
+ }
+
+ // RobotArms
+ {
+ // LuV Robot Arm
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Robot_Arm_IV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.HSSS, 4),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.HSSS, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.HSSS, 3),
+ ItemList.Electric_Motor_LuV.get(2),
+ ItemList.Electric_Piston_LuV.get(1),
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 2 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Elite), 4 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Data), 8 },
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 6))
+ .itemOutputs(ItemList.Robot_Arm_LuV.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 576), Materials.Lubricant.getFluid(250))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_IV)
+ .addTo(AssemblyLine);
+
+ // ZPM Robot Arm
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Robot_Arm_LuV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.NaquadahAlloy, 4),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.NaquadahAlloy, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.NaquadahAlloy, 3),
+ ItemList.Electric_Motor_ZPM.get(2),
+ ItemList.Electric_Piston_ZPM.get(1),
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 2 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 4 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Elite), 8 },
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 6))
+ .itemOutputs(ItemList.Robot_Arm_ZPM.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 1152), Materials.Lubricant.getFluid(750))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_LuV)
+ .addTo(AssemblyLine);
+
+ // UV Robot Arm
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Robot_Arm_ZPM.get(1))
+ .metadata(RESEARCH_TIME, 4 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Neutronium, 4),
+ GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Neutronium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Neutronium, 3),
+ ItemList.Electric_Motor_UV.get(2),
+ ItemList.Electric_Piston_UV.get(1),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 2 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 4 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 8 },
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 6))
+ .itemOutputs(ItemList.Robot_Arm_UV.get(1))
+ .fluidInputs(
+ Materials.Naquadria.getMolten(1296),
+ new FluidStack(solderIndalloy, 2304),
+ Materials.Lubricant.getFluid(2000))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_ZPM)
+ .addTo(AssemblyLine);
+ }
+
+ // Emitters
+ {
+ // LuV Emitter
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Emitter_IV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.HSSS, 1),
+ ItemList.Electric_Motor_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, LuVMat, 8),
+ ItemList.QuantumStar.get(1),
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 4 },
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 7))
+ .itemOutputs(ItemList.Emitter_LuV.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 576))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_IV)
+ .addTo(AssemblyLine);
+
+ // ZPM Emitter
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Emitter_LuV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1),
+ ItemList.Electric_Motor_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Osmiridium, 8),
+ ItemList.QuantumStar.get(2),
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 4 },
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 7))
+ .itemOutputs(ItemList.Emitter_ZPM.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 1152))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_LuV)
+ .addTo(AssemblyLine);
+
+ // UV Emitter
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Emitter_ZPM.get(1))
+ .metadata(RESEARCH_TIME, 4 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1),
+ ItemList.Electric_Motor_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Neutronium, 8),
+ ItemList.Gravistar.get(4),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4 },
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 7))
+ .itemOutputs(ItemList.Emitter_UV.get(1))
+ .fluidInputs(Materials.Naquadria.getMolten(1296), new FluidStack(solderIndalloy, 2304))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_ZPM)
+ .addTo(AssemblyLine);
+ }
+
+ // Sensors
+ {
+ // LuV Sensor
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Sensor_IV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.HSSS, 1),
+ ItemList.Electric_Motor_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, LuVMat, 8),
+ ItemList.QuantumStar.get(1),
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 4 },
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gallium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 7))
+ .itemOutputs(ItemList.Sensor_LuV.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 576))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_IV)
+ .addTo(AssemblyLine);
+
+ // ZPM Sensor
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Sensor_LuV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1),
+ ItemList.Electric_Motor_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmiridium, 8),
+ ItemList.QuantumStar.get(2),
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 4 },
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Trinium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 7))
+ .itemOutputs(ItemList.Sensor_ZPM.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 1152))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_LuV)
+ .addTo(AssemblyLine);
+
+ // UV Sensor
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Sensor_ZPM.get(1))
+ .metadata(RESEARCH_TIME, 4 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1),
+ ItemList.Electric_Motor_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 8),
+ ItemList.Gravistar.get(4),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4 },
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Naquadria, 64),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 7))
+ .itemOutputs(ItemList.Sensor_UV.get(1))
+ .fluidInputs(Materials.Naquadria.getMolten(1296), new FluidStack(solderIndalloy, 2304))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_ZPM)
+ .addTo(AssemblyLine);
+ }
+
+ // Field Generators
+ {
+ // LuV Field Generator
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Field_Generator_IV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.HSSS, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.HSSS, 6),
+ ItemList.QuantumStar.get(2),
+ ItemList.Emitter_LuV.get(4),
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 4 },
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, LuVMat, 64),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.YttriumBariumCuprate, 8))
+ .itemOutputs(ItemList.Field_Generator_LuV.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 576))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_IV)
+ .addTo(AssemblyLine);
+
+ // ZPM Field Generator
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Field_Generator_LuV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NaquadahAlloy, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NaquadahAlloy, 6),
+ ItemList.QuantumStar.get(2),
+ ItemList.Emitter_ZPM.get(4),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4 },
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.VanadiumGallium, 8))
+ .itemOutputs(ItemList.Field_Generator_ZPM.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 1152))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_LuV)
+ .addTo(AssemblyLine);
+
+ // UV Field Generator
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Field_Generator_ZPM.get(1))
+ .metadata(RESEARCH_TIME, 4 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 6),
+ ItemList.Gravistar.get(2),
+ ItemList.Emitter_UV.get(4),
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 4 },
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NaquadahAlloy, 8))
+ .itemOutputs(ItemList.Field_Generator_UV.get(1))
+ .fluidInputs(Materials.Naquadria.getMolten(1296), new FluidStack(solderIndalloy, 2304))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_ZPM)
+ .addTo(AssemblyLine);
+ }
+
+ // Energy Hatches
+ {
+ // LuV Energy Hatch
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Hatch_Energy_IV.get(1))
+ .metadata(RESEARCH_TIME, 60 * MINUTES)
+ .itemInputs(
+ ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 2),
+ ItemList.Circuit_Chip_UHPIC.get(2),
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 2 },
+ ItemList.LuV_Coil.get(2),
+ new ItemStack[] { ItemList.Reactor_Coolant_He_3.get(1), ItemList.Reactor_Coolant_NaK_3.get(1),
+ ItemList.Reactor_Coolant_Sp_1.get(1) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_3.get(1), ItemList.Reactor_Coolant_NaK_3.get(1),
+ ItemList.Reactor_Coolant_Sp_1.get(1) },
+ ItemList.Electric_Pump_LuV.get(1))
+ .itemOutputs(ItemList.Hatch_Energy_LuV.get(1))
+ .fluidInputs(
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000),
+ new FluidStack(solderIndalloy, 720))
+ .duration(20 * SECONDS)
+ .eut((int) TierEU.RECIPE_LuV)
+ .addTo(AssemblyLine);
+
+ // ZPM Energy Hatch
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Hatch_Energy_LuV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorZPM, 2),
+ ItemList.Circuit_Chip_NPIC.get(2),
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 2 },
+ ItemList.ZPM_Coil.get(2),
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1), ItemList.Reactor_Coolant_NaK_6.get(1),
+ ItemList.Reactor_Coolant_Sp_2.get(1) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1), ItemList.Reactor_Coolant_NaK_6.get(1),
+ ItemList.Reactor_Coolant_Sp_2.get(1) },
+ ItemList.Electric_Pump_ZPM.get(1))
+ .itemOutputs(ItemList.Hatch_Energy_ZPM.get(1))
+ .fluidInputs(
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 4000),
+ new FluidStack(solderIndalloy, 1440))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_ZPM)
+ .addTo(AssemblyLine);
+
+ // UV Energy Hatch
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Hatch_Energy_ZPM.get(1))
+ .metadata(RESEARCH_TIME, 4 * HOURS)
+ .itemInputs(
+ ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorUV, 2),
+ ItemList.Circuit_Chip_PPIC.get(2),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 2 },
+ ItemList.UV_Coil.get(2),
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1), ItemList.Reactor_Coolant_NaK_6.get(1),
+ ItemList.Reactor_Coolant_Sp_2.get(1) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1), ItemList.Reactor_Coolant_NaK_6.get(1),
+ ItemList.Reactor_Coolant_Sp_2.get(1) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1), ItemList.Reactor_Coolant_NaK_6.get(1),
+ ItemList.Reactor_Coolant_Sp_2.get(1) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1), ItemList.Reactor_Coolant_NaK_6.get(1),
+ ItemList.Reactor_Coolant_Sp_2.get(1) },
+ ItemList.Electric_Pump_UV.get(1))
+ .itemOutputs(ItemList.Hatch_Energy_UV.get(1))
+ .fluidInputs(
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 8000),
+ new FluidStack(solderIndalloy, 2880))
+ .duration(40 * SECONDS)
+ .eut((int) TierEU.RECIPE_UV)
+ .addTo(AssemblyLine);
+ }
+
+ // Dynamo Hatches
+ {
+ // LuV Dynamo Hatch
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Hatch_Dynamo_IV.get(1))
+ .metadata(RESEARCH_TIME, 60 * MINUTES)
+ .itemInputs(
+ ItemList.Hull_LuV.get(1),
+ GT_OreDictUnificator.get(
+ OrePrefixes.spring,
+ Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid,
+ 2),
+ ItemList.Circuit_Chip_UHPIC.get(2),
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 2 },
+ ItemList.LuV_Coil.get(2),
+ new ItemStack[] { ItemList.Reactor_Coolant_He_3.get(1), ItemList.Reactor_Coolant_NaK_3.get(1),
+ ItemList.Reactor_Coolant_Sp_1.get(1) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_3.get(1), ItemList.Reactor_Coolant_NaK_3.get(1),
+ ItemList.Reactor_Coolant_Sp_1.get(1) },
+ ItemList.Electric_Pump_LuV.get(1))
+ .itemOutputs(ItemList.Hatch_Dynamo_LuV.get(1))
+ .fluidInputs(
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000),
+ new FluidStack(solderIndalloy, 720))
+ .duration(20 * SECONDS)
+ .eut((int) TierEU.RECIPE_LuV)
+ .addTo(AssemblyLine);
+
+ // ZPM Dynamo Hatch
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Hatch_Dynamo_LuV.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ ItemList.Hull_ZPM.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 4),
+ ItemList.Circuit_Chip_NPIC.get(2),
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 2 },
+ ItemList.ZPM_Coil.get(2),
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1), ItemList.Reactor_Coolant_NaK_6.get(1),
+ ItemList.Reactor_Coolant_Sp_2.get(1) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1), ItemList.Reactor_Coolant_NaK_6.get(1),
+ ItemList.Reactor_Coolant_Sp_2.get(1) },
+ ItemList.Electric_Pump_ZPM.get(1))
+ .itemOutputs(ItemList.Hatch_Dynamo_ZPM.get(1))
+ .fluidInputs(
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 4000),
+ new FluidStack(solderIndalloy, 1440))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_ZPM)
+ .addTo(AssemblyLine);
+
+ // UV Dynamo Hatch
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Hatch_Dynamo_ZPM.get(1))
+ .metadata(RESEARCH_TIME, 4 * HOURS)
+ .itemInputs(
+ ItemList.Hull_UV.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Longasssuperconductornameforuvwire, 4),
+ ItemList.Circuit_Chip_PPIC.get(2),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 2 },
+ ItemList.UV_Coil.get(2),
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1), ItemList.Reactor_Coolant_NaK_6.get(1),
+ ItemList.Reactor_Coolant_Sp_2.get(1) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1), ItemList.Reactor_Coolant_NaK_6.get(1),
+ ItemList.Reactor_Coolant_Sp_2.get(1) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1), ItemList.Reactor_Coolant_NaK_6.get(1),
+ ItemList.Reactor_Coolant_Sp_2.get(1) },
+ new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1), ItemList.Reactor_Coolant_NaK_6.get(1),
+ ItemList.Reactor_Coolant_Sp_2.get(1) },
+ ItemList.Electric_Pump_UV.get(1))
+ .itemOutputs(ItemList.Hatch_Dynamo_UV.get(1))
+ .fluidInputs(
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 8000),
+ new FluidStack(solderIndalloy, 2880))
+ .duration(40 * SECONDS)
+ .eut((int) TierEU.RECIPE_UV)
+ .addTo(AssemblyLine);
+ }
+
+ // Fusion Controller
+ {
+ // mkI
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ ItemList.Casing_Fusion_Coil.get(1),
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 1 },
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.NaquadahAlloy, 4),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Osmiridium, 4),
+ ItemList.Field_Generator_LuV.get(2),
+ ItemList.Circuit_Wafer_UHPIC.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 32))
+ .itemOutputs(ItemList.FusionComputer_LuV.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 2880), Materials.VanadiumGallium.getMolten(1152))
+ .duration(50 * SECONDS)
+ .eut((int) TierEU.RECIPE_LuV)
+ .addTo(AssemblyLine);
+
+ // mkII
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, GT_OreDictUnificator.get(OrePrefixes.block, Materials.Europium, 1))
+ .metadata(RESEARCH_TIME, 4 * HOURS)
+ .itemInputs(
+ ItemList.Casing_Fusion_Coil.get(1),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 1 },
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Europium, 4),
+ ItemList.Field_Generator_ZPM.get(2),
+ ItemList.Circuit_Wafer_PPIC.get(48),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorZPM, 32))
+ .itemOutputs(ItemList.FusionComputer_ZPMV.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 2880), Materials.NiobiumTitanium.getMolten(1152))
+ .duration(50 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(AssemblyLine);
+
+ // mkIII
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, GT_OreDictUnificator.get(OrePrefixes.block, Materials.Americium, 1))
+ .metadata(RESEARCH_TIME, 6 * HOURS)
+ .itemInputs(
+ ItemList.Casing_Fusion_Coil.get(1),
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1 },
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Americium, 4),
+ ItemList.Field_Generator_UV.get(2),
+ ItemList.Circuit_Wafer_QPIC.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUV, 32))
+ .itemOutputs(ItemList.FusionComputer_UV.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 2880), Materials.ElectrumFlux.getMolten(1152))
+ .duration(50 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(AssemblyLine);
+ }
+ // Energy Module
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Energy_LapotronicOrb2.get(1))
+ .metadata(RESEARCH_TIME, 4 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Europium, 16),
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 1 },
+ ItemList.Energy_LapotronicOrb2.get(8),
+ ItemList.Field_Generator_LuV.get(2),
+ ItemList.Circuit_Wafer_SoC2.get(64),
+ ItemList.Circuit_Wafer_SoC2.get(64),
+ ItemList.Circuit_Parts_DiodeASMD.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 32))
+ .itemOutputs(ItemList.Energy_Module.get(1))
+ .fluidInputs(
+ new FluidStack(solderIndalloy, 2880),
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 16000))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut((int) TierEU.RECIPE_ZPM)
+ .addTo(AssemblyLine);
+
+ // Energy Cluster
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Energy_Module.get(1))
+ .metadata(RESEARCH_TIME, 4 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Americium, 32),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 1 },
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 1 },
+ ItemList.Energy_Module.get(8),
+ ItemList.Field_Generator_ZPM.get(2),
+ ItemList.Circuit_Wafer_HPIC.get(64),
+ ItemList.Circuit_Wafer_HPIC.get(64),
+ ItemList.Circuit_Parts_DiodeASMD.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.NaquadahAlloy, 32))
+ .itemOutputs(ItemList.Energy_Cluster.get(1))
+ .fluidInputs(
+ new FluidStack(solderIndalloy, 2880),
+ new FluidStack(FluidRegistry.getFluid("ic2coolant"), 16000))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(200000)
+ .addTo(AssemblyLine);
+
+ // Integrated Ore Factory
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.Machine_IV_OreWasher.get(1))
+ .metadata(RESEARCH_TIME, 6 * HOURS)
+ .itemInputs(
+ ItemList.Hull_MAX.get(1),
+ ItemList.Electric_Motor_UHV.get(32),
+ ItemList.Electric_Piston_UHV.get(8),
+ ItemList.Electric_Pump_UHV.get(16),
+ ItemList.Conveyor_Module_UHV.get(8),
+ ItemList.Robot_Arm_UHV.get(8),
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 4 },
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Duranium, 32),
+ GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 32) },
+ GT_OreDictUnificator.get(OrePrefixes.pipeMedium, Materials.Polybenzimidazole, 64),
+ new ItemStack[] { ItemList.Component_Grinder_Tungsten.get(64),
+ ItemList.Component_Grinder_Diamond.get(64) },
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.StainlessSteel, 32),
+ GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Chrome, 16))
+ .itemOutputs(ItemList.Ore_Processor.get(1))
+ .fluidInputs(new FluidStack(solderIndalloy, 2880), Materials.Naquadria.getMolten(1440))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(AssemblyLine);
+
+ // Drone T2
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.TierdDrone0.get(1))
+ .metadata(RESEARCH_TIME, 2 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.NaquadahAlloy, 16),
+ new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4 },
+ NewHorizonsCoreMod.isModLoaded()
+ ? GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.HeavyDutyRocketEngineTier3", 4)
+ : ItemList.Casing_Firebox_TungstenSteel.get(16),
+ ItemList.Large_Fluid_Cell_Osmium.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.pipeQuadruple, Materials.MysteriousCrystal, 1),
+ ItemList.Emitter_ZPM.get(4),
+ ItemList.Energy_Module.get(1),
+ ItemList.Cover_WirelessNeedsMaintainance.get(1))
+ .itemOutputs(ItemList.TierdDrone1.get(4))
+ .fluidInputs(
+ new FluidStack(solderIndalloy, 576),
+ FluidRegistry.getFluidStack(GTPlusPlus.isModLoaded() ? "fluid.rocketfuelmixc" : "nitrofuel", 4000))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(AssemblyLine);
+
+ // Drone T3
+ GT_Values.RA.stdBuilder()
+ .metadata(RESEARCH_ITEM, ItemList.TierdDrone1.get(1))
+ .metadata(RESEARCH_TIME, 8 * HOURS)
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Infinity, 16),
+ new Object[] { OrePrefixes.circuit.get(Materials.Bio), 4 },
+ ItemList.Field_Generator_UV.get(16),
+ ItemList.Gravistar.get(8),
+ ItemList.Emitter_UV.get(4),
+ TecTech.isModLoaded() ? GT_ModHandler.getModItem(GregTech.ID, "gt.blockmachines", 16, 15497)
+ : ItemList.Hatch_AutoMaintenance.get(64),
+ ItemList.Energy_Cluster.get(8),
+ ItemList.Cover_WirelessNeedsMaintainance.get(1))
+ .itemOutputs(ItemList.TierdDrone2.get(1))
+ .fluidInputs(
+ new FluidStack(solderIndalloy, 144000),
+ GTPlusPlus.isModLoaded() ? FluidRegistry.getFluidStack("molten.ethylcyanoacrylatesuperglue", 2000)
+ : Materials.AdvancedGlue.getFluid(256000))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(AssemblyLine);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/AutoclaveRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/AutoclaveRecipes.java
new file mode 100644
index 0000000000..519d584136
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/AutoclaveRecipes.java
@@ -0,0 +1,234 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.recipe.RecipeMaps.autoclaveRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class AutoclaveRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Energium_Dust.get(9L))
+ .itemOutputs(ItemList.IC2_EnergyCrystal.get(1L))
+ .outputChances(10000)
+ .fluidInputs(Materials.EnergeticAlloy.getMolten(288))
+ .duration(30 * SECONDS)
+ .eut(256)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Energium_Dust.get(9L))
+ .itemOutputs(ItemList.IC2_EnergyCrystal.get(1L))
+ .outputChances(10000)
+ .fluidInputs(Materials.ConductiveIron.getMolten(576))
+ .duration(60 * SECONDS)
+ .eut(256)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 0))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10))
+ .outputChances(8000)
+ .fluidInputs(Materials.Water.getFluid(200L))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 600))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11))
+ .outputChances(8000)
+ .fluidInputs(Materials.Water.getFluid(200L))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 1200))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 12))
+ .outputChances(8000)
+ .fluidInputs(Materials.Water.getFluid(200L))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 0))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10))
+ .outputChances(9000)
+ .fluidInputs(GT_ModHandler.getDistilledWater(100L))
+ .duration(50 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 600))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11))
+ .outputChances(9000)
+ .fluidInputs(GT_ModHandler.getDistilledWater(100L))
+ .duration(50 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 1200))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 12))
+ .outputChances(9000)
+ .fluidInputs(GT_ModHandler.getDistilledWater(100L))
+ .duration(50 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 0))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10))
+ .outputChances(10000)
+ .fluidInputs(Materials.Void.getMolten(36L))
+ .duration(25 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 600))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11))
+ .outputChances(10000)
+ .fluidInputs(Materials.Void.getMolten(36L))
+ .duration(25 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemCrystalSeed", 1L, 1200))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 12))
+ .outputChances(10000)
+ .fluidInputs(Materials.Void.getMolten(36L))
+ .duration(25 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 32))
+ .itemOutputs(GT_ModHandler.getIC2Item("carbonFiber", 64L))
+ .outputChances(10000)
+ .fluidInputs(Materials.Polybenzimidazole.getMolten(36L))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut((int) TierEU.RECIPE_EV)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 64))
+ .itemOutputs(GT_ModHandler.getIC2Item("carbonFiber", 64L))
+ .outputChances(10000)
+ .fluidInputs(Materials.Epoxid.getMolten(144L))
+ .duration(15 * SECONDS)
+ .eut((int) TierEU.RECIPE_HV)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 64))
+ .itemOutputs(GT_ModHandler.getIC2Item("carbonFiber", 32L))
+ .outputChances(10000)
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(288L))
+ .duration(20 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 64))
+ .itemOutputs(GT_ModHandler.getIC2Item("carbonFiber", 16L))
+ .outputChances(10000)
+ .fluidInputs(Materials.Plastic.getMolten(576L))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherStar, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherStar, 1))
+ .outputChances(3333)
+ .fluidInputs(Materials.UUMatter.getFluid(576L))
+ .duration(60 * MINUTES)
+ .eut((int) TierEU.RECIPE_HV)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(ItemList.QuantumStar.get(1L)))
+ .itemOutputs(ItemList.Gravistar.get(1L))
+ .outputChances(10000)
+ .fluidInputs(Materials.Neutronium.getMolten(288))
+ .duration(24 * SECONDS)
+ .eut((int) TierEU.RECIPE_IV)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(ItemList.Gravistar.get(16L)))
+ .itemOutputs(ItemList.NuclearStar.get(1L))
+ .outputChances(10000)
+ .fluidInputs(Materials.Infinity.getMolten(288))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_UEV)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SiliconDioxide.getDust(1))
+ .itemOutputs(Materials.Quartzite.getGems(1))
+ .outputChances(750)
+ .fluidInputs(Materials.Water.getFluid(200L))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SiliconDioxide.getDust(1))
+ .itemOutputs(Materials.Quartzite.getGems(1))
+ .outputChances(1000)
+ .fluidInputs(GT_ModHandler.getDistilledWater(100L))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SiliconDioxide.getDust(1))
+ .itemOutputs(Materials.Quartzite.getGems(1))
+ .outputChances(10000)
+ .fluidInputs(Materials.Void.getMolten(36L))
+ .duration(50 * SECONDS)
+ .eut(24)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3))
+ .outputChances(7500)
+ .fluidInputs(Materials.Water.getFluid(1000L))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(autoclaveRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3))
+ .outputChances(9000)
+ .fluidInputs(GT_ModHandler.getDistilledWater(1000L))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(autoclaveRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/BenderRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/BenderRecipes.java
new file mode 100644
index 0000000000..192422437a
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/BenderRecipes.java
@@ -0,0 +1,330 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.benderRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class BenderRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Aluminium, 20L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 48L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 32L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Bronze, 32L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 24L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.StainlessSteel, 16L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Titanium, 12L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 9L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iridium, 6L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Osmium, 3L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Osmiridium, 2L),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(ItemList.RC_Rail_Standard.get(64L))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Obsidian, 24L),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(ItemList.RC_Rail_Reinforced.get(64L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.StainlessSteel, 12L),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(ItemList.RC_Rail_Reinforced.get(64L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 6L),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(ItemList.RC_Rail_Reinforced.get(64L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iridium, 3L),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(ItemList.RC_Rail_Reinforced.get(64L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Osmium, 1L),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(ItemList.RC_Rail_Reinforced.get(64L))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Aluminium, 20L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(ItemList.RC_Rebar.get(64L))
+ .duration(10 * SECONDS)
+ .eut(200)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iron, 48L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(ItemList.RC_Rebar.get(64L))
+ .duration(10 * SECONDS)
+ .eut(200)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.WroughtIron, 24L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(ItemList.RC_Rebar.get(64L))
+ .duration(10 * SECONDS)
+ .eut(200)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Bronze, 32L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(ItemList.RC_Rebar.get(64L))
+ .duration(10 * SECONDS)
+ .eut(200)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Steel, 16L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(ItemList.RC_Rebar.get(64L))
+ .duration(10 * SECONDS)
+ .eut(200)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.StainlessSteel, 12L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(ItemList.RC_Rebar.get(64L))
+ .duration(10 * SECONDS)
+ .eut(200)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Titanium, 8),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(ItemList.RC_Rebar.get(64L))
+ .duration(10 * SECONDS)
+ .eut(200)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.TungstenSteel, 6L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(ItemList.RC_Rebar.get(64L))
+ .duration(10 * SECONDS)
+ .eut(200)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Iridium, 4L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(ItemList.RC_Rebar.get(64L))
+ .duration(10 * SECONDS)
+ .eut(200)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Osmium, 2L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(ItemList.RC_Rebar.get(64L))
+ .duration(10 * SECONDS)
+ .eut(200)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Mixed_Metal_Ingot.get(1L), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plateAlloy, Materials.Advanced, 1L))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Tin, 2L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(ItemList.Cell_Empty.get(1L))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Steel, 1L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(ItemList.Cell_Empty.get(1L))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Polytetrafluoroethylene, 1L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(ItemList.Cell_Empty.get(4L))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 3L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(new ItemStack(Items.bucket, 1, 0))
+ .duration(10 * SECONDS)
+ .eut(4)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 3L),
+ GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(new ItemStack(Items.bucket, 1, 0))
+ .duration(10 * SECONDS)
+ .eut(4)
+ .addTo(benderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.Iron, 2L),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_ModHandler.getIC2Item("fuelRod", 1L))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(benderRecipes);
+
+ if (GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.Tin, 1L) != null) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.Tin, 1L),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.IC2_Food_Can_Empty.get(1L))
+ .duration(20 * TICKS)
+ .eut((int) TierEU.RECIPE_HV)
+ .addTo(benderRecipes);
+ }
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/BlastFurnaceRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/BlastFurnaceRecipes.java
new file mode 100644
index 0000000000..b05f585950
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/BlastFurnaceRecipes.java
@@ -0,0 +1,690 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.GTNHLanthanides;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.recipe.RecipeMaps.blastFurnaceRecipes;
+import static gregtech.api.recipe.RecipeMaps.primitiveBlastRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.ADDITIVE_AMOUNT;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class BlastFurnaceRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ this.registerBlastFurnaceRecipes();
+ this.registerPrimitiveBlastFurnaceRecipes();
+ }
+
+ public void registerBlastFurnaceRecipes() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Gypsum.getDust(8))
+ .itemOutputs(Materials.Quicklime.getDust(1))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1500))
+ .duration(10 * SECONDS)
+ .eut((int) TierEU.RECIPE_HV)
+ .metadata(COIL_HEAT, 3200)
+ .addTo(blastFurnaceRecipes);
+
+ // Carbothermic Reduction
+ // Depend on real amount except real ores
+ int outputIngotAmount = GT_Mod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre ? 2 : 3;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.RoastedCopper.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Copper.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.RoastedAntimony.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Antimony.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.RoastedIron.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.RoastedNickel.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Nickel.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.RoastedZinc.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Zinc.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.RoastedCobalt.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Cobalt.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.RoastedArsenic.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Arsenic.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.RoastedLead.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Lead.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Malachite.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Copper.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(3000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.BandedIron.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDustTiny(2))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Magnetite.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.YellowLimonite.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.BrownLimonite.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.BasalticMineralSand.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.GraniticMineralSand.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Cassiterite.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Tin.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.CassiteriteSand.getDust(2), Materials.Carbon.getDust(1))
+ .itemOutputs(Materials.Tin.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SiliconDioxide.getDust(3), Materials.Carbon.getDust(2))
+ .itemOutputs(Materials.Silicon.getIngots(1), Materials.Ash.getDust(1))
+ .outputChances(10000, 1111)
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(2000))
+ .duration(4 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ if (GT_Mod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.CupricOxide.getDust(2), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Copper.getIngots(1), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Malachite.getDust(2), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Copper.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(3000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.AntimonyTrioxide.getDust(5), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Antimony.getIngots(2), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(3000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.BandedIron.getDust(5), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Iron.getIngots(2), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Magnetite.getDust(2), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.YellowLimonite.getDust(2), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.BrownLimonite.getDust(2), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.BasalticMineralSand.getDust(2), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.GraniticMineralSand.getDust(2), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Iron.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Cassiterite.getDust(2), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Tin.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.CassiteriteSand.getDust(2), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Tin.getIngots(outputIngotAmount), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Garnierite.getDust(2), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Nickel.getIngots(1), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.CobaltOxide.getDust(2), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Cobalt.getIngots(1), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.ArsenicTrioxide.getDust(5), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Arsenic.getIngots(2), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Massicot.getDust(2), Materials.Carbon.getDustSmall(4))
+ .itemOutputs(Materials.Lead.getIngots(1), Materials.Ash.getDust(1))
+ .outputChances(10000, 2222)
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 32),
+ ItemList.GalliumArsenideCrystalSmallPart.get(1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Circuit_Silicon_Ingot.get(1))
+ .duration(7 * MINUTES + 30 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1784)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 64),
+ ItemList.GalliumArsenideCrystalSmallPart.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 8),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Circuit_Silicon_Ingot2.get(1))
+ .fluidInputs(Materials.Nitrogen.getGas(8000))
+ .duration(10 * MINUTES)
+ .eut((int) TierEU.RECIPE_HV)
+ .metadata(COIL_HEAT, 2484)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.SiliconSG, 16),
+ ItemList.GalliumArsenideCrystal.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Naquadah, 1),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Circuit_Silicon_Ingot3.get(1))
+ .fluidInputs(Materials.Argon.getGas(8000))
+ .duration(12 * MINUTES + 30 * SECONDS)
+ .eut((int) TierEU.RECIPE_EV)
+ .metadata(COIL_HEAT, 4484)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.SiliconSG, 32),
+ ItemList.GalliumArsenideCrystal.get(2),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Europium, 2),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Circuit_Silicon_Ingot4.get(1))
+ .fluidInputs(Materials.Radon.getGas(8000))
+ .duration(15 * MINUTES)
+ .eut((int) TierEU.RECIPE_IV)
+ .metadata(COIL_HEAT, 6484)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.SiliconSG, 64),
+ ItemList.GalliumArsenideCrystal.get(4),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Americium, 4),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.Circuit_Silicon_Ingot5.get(1))
+ .fluidInputs(Materials.Radon.getGas(16000))
+ .duration(17 * MINUTES + 30 * SECONDS)
+ .eut((int) TierEU.RECIPE_LuV)
+ .metadata(COIL_HEAT, 9000)
+ .addTo(blastFurnaceRecipes);
+
+ // CaH2 + 2Si = CaSi2 + 2H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calciumhydride, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CalciumDisilicide, 3))
+ .fluidOutputs(Materials.Hydrogen.getGas(2000))
+ .duration(15 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1273)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUEVBase, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUEVBase, 1))
+ .duration(16 * MINUTES + 23 * SECONDS)
+ .eut((int) TierEU.RECIPE_UV)
+ .metadata(COIL_HEAT, 11800)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUEVBase, 1),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUEVBase, 1))
+ .fluidInputs(Materials.Radon.getGas(1000))
+ .duration(7 * MINUTES + 22 * SECONDS + 7 * TICKS)
+ .eut((int) TierEU.RECIPE_UV)
+ .metadata(COIL_HEAT, 11800)
+ .addTo(blastFurnaceRecipes);
+
+ // 0.45 * 19660 = 8847
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUIVBase, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUIVBase, 1))
+ .duration(16 * MINUTES + 23 * SECONDS)
+ .eut((int) TierEU.RECIPE_UHV)
+ .metadata(COIL_HEAT, 12700)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUIVBase, 1),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUIVBase, 1))
+ .fluidInputs(Materials.Radon.getGas(1000))
+ .duration(7 * MINUTES + 22 * SECONDS + 7 * TICKS)
+ .eut((int) TierEU.RECIPE_UHV)
+ .metadata(COIL_HEAT, 12700)
+ .addTo(blastFurnaceRecipes);
+
+ // 0.45 * 19660 = 8847
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUMVBase, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUMVBase, 1))
+ .duration(16 * MINUTES + 23 * SECONDS)
+ .eut((int) TierEU.RECIPE_UEV)
+ .metadata(COIL_HEAT, 13600)
+ .addTo(blastFurnaceRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SuperconductorUMVBase, 1),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUMVBase, 1))
+ .fluidInputs(Materials.Radon.getGas(1000))
+ .duration(7 * MINUTES + 22 * SECONDS + 7 * TICKS)
+ .eut((int) TierEU.RECIPE_UEV)
+ .metadata(COIL_HEAT, 13600)
+ .addTo(blastFurnaceRecipes);
+
+ // 0.45 * 19660 = 8847
+ // CaO + 3C = CaC2 + CO
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Quicklime.getDust(2), Materials.Carbon.getDust(3))
+ .itemOutputs(MaterialsKevlar.CalciumCarbide.getDust(3))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_HV)
+ .metadata(COIL_HEAT, 2573)
+ .addTo(blastFurnaceRecipes);
+
+ // Ni + 3Al = NiAl3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Nickel.getDust(1), Materials.Aluminium.getDust(3))
+ .itemOutputs(MaterialsKevlar.NickelAluminide.getIngots(4))
+ .duration(45 * SECONDS)
+ .eut((int) TierEU.RECIPE_HV)
+ .metadata(COIL_HEAT, 1688)
+ .addTo(blastFurnaceRecipes);
+
+ ItemStack[] tSiliconDioxide = new ItemStack[] { Materials.SiliconDioxide.getDust(3),
+ Materials.NetherQuartz.getDust(3), Materials.CertusQuartz.getDust(3), Materials.Quartzite.getDust(6) };
+
+ // Roasting
+
+ for (ItemStack silicon : tSiliconDioxide) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chalcopyrite.getDust(1), silicon)
+ .itemOutputs(Materials.RoastedCopper.getDust(1), Materials.Ferrosilite.getDust(5))
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(2000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Tetrahedrite.getDust(1))
+ .itemOutputs(Materials.RoastedCopper.getDust(1), Materials.RoastedAntimony.getDustTiny(3))
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(2000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Pyrite.getDust(1))
+ .itemOutputs(Materials.RoastedIron.getDust(1), Materials.Ash.getDust(1))
+ .outputChances(10000, 1111)
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(2000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Pentlandite.getDust(1))
+ .itemOutputs(Materials.RoastedNickel.getDust(1), Materials.Ash.getDust(1))
+ .outputChances(10000, 1111)
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(2000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Sphalerite.getDust(1))
+ .itemOutputs(Materials.RoastedZinc.getDust(1), Materials.Ash.getDust(1))
+ .outputChances(10000, 1111)
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Cobaltite.getDust(1))
+ .itemOutputs(Materials.RoastedCobalt.getDust(1), Materials.RoastedArsenic.getDust(1))
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Stibnite.getDust(1))
+ .itemOutputs(Materials.RoastedAntimony.getDust(1), Materials.Ash.getDust(1))
+ .outputChances(10000, 1111)
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(1500))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Galena.getDust(1))
+ .itemOutputs(Materials.RoastedLead.getDust(1), Materials.Ash.getDust(1))
+ .outputChances(10000, 1111)
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .metadata(COIL_HEAT, 1200)
+ .addTo(blastFurnaceRecipes);
+
+ if (GTNHLanthanides.isModLoaded() && GTPlusPlus.isModLoaded()) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(MaterialsUEVplus.TranscendentMetal.getDust(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, MaterialsUEVplus.TranscendentMetal, 1))
+ .fluidInputs(Materials.Tungsten.getMolten(144))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("molten.celestialtungsten"), 72))
+ .duration(3 * MINUTES)
+ .eut(32000000)
+ .metadata(COIL_HEAT, 11701)
+ .addTo(blastFurnaceRecipes);
+
+ // Rh + 3Cl = RhCl3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(BartWorks.ID, "gt.bwMetaGenerateddust", 1L, 78),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(MaterialsKevlar.RhodiumChloride.getDust(4))
+ .fluidInputs(Materials.Chlorine.getGas(3000))
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_HV)
+ .metadata(COIL_HEAT, 573)
+ .addTo(blastFurnaceRecipes);
+ }
+ }
+
+ public void registerPrimitiveBlastFurnaceRecipes() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Iron.getIngots(1))
+ .itemOutputs(Materials.Steel.getIngots(1))
+ .duration(6 * MINUTES)
+ .metadata(ADDITIVE_AMOUNT, 4)
+ .addTo(primitiveBlastRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Iron.getDust(1))
+ .itemOutputs(Materials.Steel.getIngots(1))
+ .duration(6 * MINUTES)
+ .metadata(ADDITIVE_AMOUNT, 4)
+ .addTo(primitiveBlastRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Iron.getBlocks(1))
+ .itemOutputs(Materials.Steel.getIngots(9))
+ .duration(54 * MINUTES)
+ .metadata(ADDITIVE_AMOUNT, 36)
+ .addTo(primitiveBlastRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Steel.getDust(1))
+ .itemOutputs(Materials.Steel.getIngots(1))
+ .duration(6 * MINUTES)
+ .metadata(ADDITIVE_AMOUNT, 2)
+ .addTo(primitiveBlastRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/BreweryRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/BreweryRecipes.java
new file mode 100644
index 0000000000..7538b50c6c
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/BreweryRecipes.java
@@ -0,0 +1,562 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.recipe.RecipeMaps.brewingRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class BreweryRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ ItemStack[] brewingItems = new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Talc, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Soapstone, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L) };
+
+ for (ItemStack item : brewingItems) {
+ // creosote to lubricant recipes
+ GT_Values.RA.stdBuilder()
+ .itemInputs(item)
+ .fluidInputs(getFluidStack("creosote", 750))
+ .fluidOutputs(getFluidStack("lubricant", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ // seed oil to lubricant recipes
+ GT_Values.RA.stdBuilder()
+ .itemInputs(item)
+ .fluidInputs(getFluidStack("seedoil", 750))
+ .fluidOutputs(getFluidStack("lubricant", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ // lubricant recipes
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(item)
+ .fluidInputs(getFluidStack("oil", 750))
+ .fluidOutputs(getFluidStack("lubricant", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(item)
+ .fluidInputs(getFluidStack("liquid_light_oil", 750))
+ .fluidOutputs(getFluidStack("lubricant", 500))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(item)
+ .fluidInputs(getFluidStack("liquid_medium_oil", 750))
+ .fluidOutputs(getFluidStack("lubricant", 500))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(item)
+ .fluidInputs(getFluidStack("liquid_heavy_oil", 500))
+ .fluidOutputs(getFluidStack("lubricant", 750))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+ }
+ }
+
+ // water based recipe input
+ {
+ Fluid[] waterArray;
+
+ /*
+ * if IC2 isn't loaded, getDistilledWater returns the base minecraft water, so no need to do the recipe
+ * loading twice.
+ */
+ if (IndustrialCraft2.isModLoaded()) {
+ waterArray = new Fluid[] { FluidRegistry.WATER, GT_ModHandler.getDistilledWater(1L)
+ .getFluid() };
+ } else {
+ waterArray = new Fluid[] { FluidRegistry.WATER };
+ }
+ for (Fluid tFluid : waterArray) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Milk, 1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("milk", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.wheatyjuice", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Potassium, 1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.mineralwater", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.mineralwater", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.mineralwater", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.mineralwater", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.thick", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.mundane", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.mundane", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.mundane", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.magma_cream, 1, 0))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.mundane", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.fermented_spider_eye, 1, 0))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.mundane", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.spider_eye, 1, 0))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.mundane", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.speckled_melon, 1, 0))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.mundane", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.ghast_tear, 1, 0))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.mundane", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.nether_wart, 1, 0))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.awkward", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.red_mushroom, 1, 0))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.poison", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.fish, 1, 3))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.poison.strong", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Grin_Powder.get(1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.poison.strong", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.reeds, 1, 0))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.reedwater", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.apple, 1, 0))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.applejuice", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.golden_apple, 1, 0))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.goldenapplejuice", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.golden_apple, 1, 1))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.idunsapplejuice", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Hops.get(1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.hopsjuice", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coffee, 1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.darkcoffee", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
+ .fluidInputs(new FluidStack(tFluid, 750))
+ .fluidOutputs(getFluidStack("potion.chillysauce", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ }
+ }
+
+ // potion brewing 1
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
+ .fluidInputs(getFluidStack("potion.chillysauce", 750))
+ .fluidOutputs(getFluidStack("potion.hotsauce", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
+ .fluidInputs(getFluidStack("potion.hotsauce", 750))
+ .fluidOutputs(getFluidStack("potion.diabolosauce", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1L))
+ .fluidInputs(getFluidStack("potion.diabolosauce", 750))
+ .fluidOutputs(getFluidStack("potion.diablosauce", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coffee, 1L))
+ .fluidInputs(getFluidStack("milk", 750))
+ .fluidOutputs(getFluidStack("potion.coffee", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cocoa, 1L))
+ .fluidInputs(getFluidStack("milk", 750))
+ .fluidOutputs(getFluidStack("potion.darkchocolatemilk", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Hops.get(1L))
+ .fluidInputs(getFluidStack("potion.wheatyjuice", 750))
+ .fluidOutputs(getFluidStack("potion.wheatyhopsjuice", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 1L))
+ .fluidInputs(getFluidStack("potion.hopsjuice", 750))
+ .fluidOutputs(getFluidStack("potion.wheatyhopsjuice", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+ .fluidInputs(getFluidStack("potion.tea", 750))
+ .fluidOutputs(getFluidStack("potion.sweettea", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+ .fluidInputs(getFluidStack("potion.coffee", 750))
+ .fluidOutputs(getFluidStack("potion.cafeaulait", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+ .fluidInputs(getFluidStack("potion.cafeaulait", 750))
+ .fluidOutputs(getFluidStack("potion.laitaucafe", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+ .fluidInputs(getFluidStack("potion.lemonjuice", 750))
+ .fluidOutputs(getFluidStack("potion.lemonade", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+ .fluidInputs(getFluidStack("potion.darkcoffee", 750))
+ .fluidOutputs(getFluidStack("potion.darkcafeaulait", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+ .fluidInputs(getFluidStack("potion.darkchocolatemilk", 750))
+ .fluidOutputs(getFluidStack("potion.chocolatemilk", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 1L))
+ .fluidInputs(getFluidStack("potion.tea", 750))
+ .fluidOutputs(getFluidStack("potion.icetea", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1L))
+ .fluidInputs(getFluidStack("potion.lemonade", 750))
+ .fluidOutputs(getFluidStack("potion.cavejohnsonsgrenadejuice", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L))
+ .fluidInputs(getFluidStack("potion.mundane", 750))
+ .fluidOutputs(getFluidStack("potion.purpledrink", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.fermented_spider_eye, 1, 0))
+ .fluidInputs(getFluidStack("potion.mundane", 750))
+ .fluidOutputs(getFluidStack("potion.weakness", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.fermented_spider_eye, 1, 0))
+ .fluidInputs(getFluidStack("potion.thick", 750))
+ .fluidOutputs(getFluidStack("potion.weakness", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+ }
+
+ // biomass recipes
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Forestry.ID, "fertilizerBio", 4L, 0))
+ .fluidInputs(GT_ModHandler.getWater(750L))
+ .fluidOutputs(getFluidStack("biomass", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Forestry.ID, "mulch", 16L, 0))
+ .fluidInputs(GT_ModHandler.getDistilledWater(750L))
+ .fluidOutputs(getFluidStack("biomass", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Forestry.ID, "mulch", 8L, 0))
+ .fluidInputs(getFluidStack("juice", 500))
+ .fluidOutputs(getFluidStack("biomass", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+ }
+
+ // ic2 biomass recipes
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("biochaff", 1))
+ .fluidInputs(GT_ModHandler.getWater(1000L))
+ .fluidOutputs(getFluidStack("ic2biomass", 1000))
+ .duration(8 * SECONDS + 10 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ // Would add 2 different amount of water input if IC2 isn't loaded
+ if (IndustrialCraft2.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("biochaff", 1))
+ .fluidInputs(GT_ModHandler.getDistilledWater(500L))
+ .fluidOutputs(getFluidStack("ic2biomass", 1000))
+ .duration(10 * TICKS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(brewingRecipes);
+ }
+ }
+
+ // potion brewing 2
+ {
+ this.addPotionRecipes("waterbreathing", new ItemStack(Items.fish, 1, 3));
+ this.addPotionRecipes("fireresistance", new ItemStack(Items.magma_cream, 1, 0));
+ this.addPotionRecipes("nightvision", new ItemStack(Items.golden_carrot, 1, 0));
+ this.addPotionRecipes("weakness", new ItemStack(Items.fermented_spider_eye, 1, 0));
+ this.addPotionRecipes("poison", new ItemStack(Items.spider_eye, 1, 0));
+ this.addPotionRecipes("health", new ItemStack(Items.speckled_melon, 1, 0));
+ this.addPotionRecipes("regen", new ItemStack(Items.ghast_tear, 1, 0));
+ this.addPotionRecipes("speed", GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1L));
+ this.addPotionRecipes("strength", GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1L));
+ }
+ }
+
+ public void addPotionRecipes(String aName, ItemStack aItem) {
+ // normal
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aItem)
+ .fluidInputs(getFluidStack("potion.awkward", 750))
+ .fluidOutputs(getFluidStack("potion." + aName, 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+
+ // strong
+ if (aName.equals("regen") || aName.equals("speed")
+ || aName.equals("health")
+ || aName.equals("strength")
+ || aName.equals("poison")) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aItem)
+ .fluidInputs(getFluidStack("potion.thick", 750))
+ .fluidOutputs(getFluidStack("potion." + aName + ".strong", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+ }
+
+ // long
+ if (!aName.equals("health")) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L))
+ .fluidInputs(getFluidStack("potion." + aName, 750))
+ .fluidOutputs(getFluidStack("potion." + aName + ".long", 750))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(brewingRecipes);
+ }
+
+ MixerRecipes.addMixerPotionRecipes(aName);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/CannerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/CannerRecipes.java
new file mode 100644
index 0000000000..aef837a6b3
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/CannerRecipes.java
@@ -0,0 +1,74 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.recipe.RecipeMaps.cannerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class CannerRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ // fuel rod canner recipes
+
+ if (IndustrialCraft2.isModLoaded()) {
+ // todo: remove tiny dust in this recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_ModHandler.getIC2Item("fuelRod", 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Lithium, 1L))
+ .itemOutputs(GT_ModHandler.getIC2Item("reactorLithiumCell", 1, 1))
+ .duration(16 * TICKS)
+ .eut(64)
+ .addTo(cannerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_ModHandler.getIC2Item("fuelRod", 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 3))
+ .itemOutputs(ItemList.ThoriumCell_1.get(1L))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(cannerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("fuelRod", 1), GT_ModHandler.getIC2Item("UranFuel", 1))
+ .itemOutputs(ItemList.Uraniumcell_1.get(1))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(cannerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("fuelRod", 1), GT_ModHandler.getIC2Item("MOXFuel", 1))
+ .itemOutputs(ItemList.Moxcell_1.get(1))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(cannerRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Large_Fluid_Cell_TungstenSteel.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 3))
+ .itemOutputs(ItemList.NaquadahCell_1.get(1L))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(cannerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Large_Fluid_Cell_TungstenSteel.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 3))
+ .itemOutputs(ItemList.MNqCell_1.get(1L))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(cannerRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/CentrifugeRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/CentrifugeRecipes.java
new file mode 100644
index 0000000000..b9375ebb1d
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/CentrifugeRecipes.java
@@ -0,0 +1,823 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.ExtraUtilities;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.enums.Mods.ThaumicTinkerer;
+import static gregtech.api.enums.Mods.TwilightForest;
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsOreAlum;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class CentrifugeRecipes implements Runnable {
+
+ @Override
+ public void run() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedGold, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
+ getModItem(Thaumcraft.ID, "ItemResource", 2L, 14))
+ .outputChances(10000, 10000, 9000)
+ .fluidInputs(Materials.Mercury.getFluid(200))
+ .duration(20 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Cell_Empty.get(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
+ .fluidInputs(Materials.Air.getGas(10000))
+ .fluidOutputs(Materials.Nitrogen.getGas(3900))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(8)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.PlatinumGroupSludge, 9))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 3))
+ .outputChances(10000, 10000, 10000, 9500, 9000, 8500)
+ .duration(6 * MINUTES + 45 * SECONDS)
+ .eut(30)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemOutputs(
+ Materials.Stone.getDust(1),
+ Materials.Iron.getDust(1),
+ Materials.Copper.getDust(1),
+ Materials.Tin.getDust(1),
+ Materials.Nickel.getDust(1),
+ Materials.Antimony.getDust(1))
+ .outputChances(10000, 4000, 2000, 2000, 2000, 2000)
+ .fluidInputs(MaterialsOreAlum.SluiceJuice.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(500))
+ .duration(2 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .addTo(centrifugeRecipes);
+
+ // food ->CH4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.golden_apple, 1, 1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(new ItemStack(Items.gold_ingot, 64))
+ .fluidOutputs(Materials.Methane.getGas(4608))
+ .duration(7 * MINUTES + 40 * SECONDS + 16 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.golden_apple, 1, 0), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(new ItemStack(Items.gold_ingot, 7))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(7 * MINUTES + 40 * SECONDS + 16 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.golden_carrot, 1, 0), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(new ItemStack(Items.gold_nugget, 6))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(7 * MINUTES + 40 * SECONDS + 16 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.speckled_melon, 1, 0), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(new ItemStack(Items.gold_nugget, 6))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(7 * MINUTES + 40 * SECONDS + 16 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.mushroom_stew, 16, 0), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(new ItemStack(Items.bowl, 16, 0))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.apple, 32, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.bread, 64, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.porkchop, 12, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.cooked_porkchop, 16, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.beef, 12, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.cooked_beef, 16, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.fish, 12, 32767), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.cooked_fished, 16, 32767), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.chicken, 12, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.cooked_chicken, 16, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.melon, 64, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.pumpkin, 16, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.rotten_flesh, 16, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.spider_eye, 32, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.carrot, 16, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Raw_Potato.get(16), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Poisonous_Potato.get(12), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Baked_Potato.get(24), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.cookie, 64, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.cake, 8, 0), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.brown_mushroom_block, 12, 32767), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.red_mushroom_block, 12, 32767), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.brown_mushroom, 32, 32767), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.red_mushroom, 32, 32767), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.nether_wart, 32, 32767), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("terraWart", 16), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(TwilightForest.ID, "item.meefRaw", 12L, 32767), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(TwilightForest.ID, "item.meefSteak", 16L, 32767), GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(TwilightForest.ID, "item.venisonRaw", 12L, 32767),
+ GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(TwilightForest.ID, "item.venisonCooked", 16L, 32767),
+ GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(576))
+ .duration(3 * MINUTES + 50 * SECONDS + 8 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.log, Materials.Wood, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .fluidOutputs(Materials.Methane.getGas(60))
+ .duration(10 * SECONDS)
+ .eut(20)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.sand, 1, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Diamond, 1),
+ new ItemStack(Blocks.sand, 1))
+ .outputChances(5000, 100, 5000)
+ .duration(30 * SECONDS)
+ .eut((int) TierEU.RECIPE_MV)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.dirt, 1, 32767))
+ .itemOutputs(
+ ItemList.IC2_Plantball.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Clay, 1),
+ new ItemStack(Blocks.sand, 1))
+ .outputChances(1250, 5000, 5000)
+ .duration(12 * SECONDS + 10 * TICKS)
+ .eut(30)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.grass, 1, 32767))
+ .itemOutputs(
+ ItemList.IC2_Plantball.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Clay, 1),
+ new ItemStack(Blocks.sand, 1))
+ .outputChances(2500, 5000, 5000)
+ .duration(12 * SECONDS + 10 * TICKS)
+ .eut(30)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.mycelium, 1, 32767))
+ .itemOutputs(
+ new ItemStack(Blocks.brown_mushroom, 1),
+ new ItemStack(Blocks.red_mushroom, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Clay, 1),
+ new ItemStack(Blocks.sand, 1))
+ .outputChances(2500, 2500, 5000, 5000)
+ .duration(32 * SECONDS + 10 * TICKS)
+ .eut(30)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Resin.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 3),
+ ItemList.IC2_Plantball.get(1))
+ .outputChances(10000, 1000)
+ .fluidOutputs(Materials.Glue.getFluid(100))
+ .duration(15 * SECONDS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1),
+ GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium235, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 1))
+ .outputChances(1000, 500)
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut((int) TierEU.RECIPE_HV)
+ .addTo(centrifugeRecipes);
+
+ // Uranium Enrichment in Centrifuge by adding Fluorine (Uranium Hexafluoride)
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium235, 1))
+ .outputChances(10000)
+ .fluidInputs(Materials.Fluorine.getGas(4000))
+ .duration(3 * MINUTES + 20 * SECONDS)
+ .eut((int) TierEU.RECIPE_EV)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium241, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Uranium, 1))
+ .outputChances(2000, 3000)
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(320)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 9))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 1))
+ .outputChances(5000, 1000)
+ .duration(24 * MINUTES)
+ .eut(320)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1))
+ .outputChances(2000, 3000)
+ .duration(21 * MINUTES + 20 * SECONDS)
+ .eut(640)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Hydrogen.getGas(160))
+ .fluidOutputs(Materials.Deuterium.getGas(40))
+ .duration(8 * SECONDS)
+ .eut(20)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Deuterium.getGas(160))
+ .fluidOutputs(Materials.Tritium.getGas(40))
+ .duration(8 * SECONDS)
+ .eut(80)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Helium.getGas(80))
+ .fluidOutputs(Materials.Helium_3.getGas(5))
+ .duration(8 * SECONDS)
+ .eut(80)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1))
+ .duration(48 * SECONDS + 16 * TICKS)
+ .eut(80)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 36))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungstate, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 1),
+ new ItemStack(Blocks.sand, 36))
+ .outputChances(3750, 2500, 9000)
+ .fluidOutputs(Materials.Helium.getGas(4320))
+ .duration(9 * MINUTES + 36 * SECONDS)
+ .eut(20)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Netherrack, 36))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 4),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 4),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1))
+ .outputChances(5625, 9900, 5625, 2500)
+ .duration(4 * MINUTES + 48 * SECONDS)
+ .eut(20)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(
+ Materials.SiliconDioxide.getDust(1),
+ Materials.Magnesia.getDust(1),
+ Materials.Quicklime.getDust(1),
+ Materials.Gold.getNuggets(4),
+ Materials.Sapphire.getDust(1),
+ Materials.Tantalite.getDust(1))
+ .outputChances(5000, 1000, 1000, 250, 1250, 500)
+ .fluidInputs(Materials.Lava.getFluid(400))
+ .duration(16 * SECONDS)
+ .eut(80)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(
+ Materials.SiliconDioxide.getDust(5),
+ Materials.Magnesia.getDust(1),
+ Materials.Quicklime.getDust(1),
+ Materials.Gold.getIngots(1),
+ Materials.Sapphire.getDust(3),
+ Materials.Tantalite.getDust(1))
+ .outputChances(9000, 9000, 9000, 1000, 3750, 4500)
+ .fluidInputs(Materials.Lava.getFluid(3600))
+ .duration(2 * MINUTES + 24 * SECONDS)
+ .eut(80)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.soul_sand, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1),
+ new ItemStack(Blocks.sand, 1))
+ .outputChances(1000, 700, 9000)
+ .fluidOutputs(Materials.Oil.getFluid(200))
+ .duration(10 * SECONDS)
+ .eut(12)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(10))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Copper, 1),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Tin, 1),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Silver, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Phosphorus, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Scheelite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Bauxite, 1))
+ .outputChances(2000, 1000, 250, 50, 250, 500)
+ .fluidInputs(getFluidStack("ic2pahoehoelava", 100))
+ .duration(2 * SECONDS)
+ .eut(1024)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(20))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1),
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Silver, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Scheelite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bauxite, 1))
+ .outputChances(8000, 4000, 1000, 450, 2250, 4500)
+ .fluidInputs(getFluidStack("ic2pahoehoelava", 3600))
+ .duration(16 * SECONDS + 8 * TICKS)
+ .eut(4096)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 45),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.BasalticMineralSand, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Olivine, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Obsidian, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Basalt, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Flint, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.RareEarth, 1))
+ .outputChances(2000, 2000, 2000, 2000, 2000, 2000)
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(20)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 36L, 45),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BasalticMineralSand, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Olivine, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Obsidian, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Basalt, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Flint, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RareEarth, 2))
+ .outputChances(9000, 9000, 9000, 9000, 9000, 9000)
+ .duration(25 * SECONDS + 18 * TICKS)
+ .eut(80)
+ .addTo(centrifugeRecipes);
+
+ // Ash centrifuge recipes
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ash.getDust(36))
+ .itemOutputs(
+ Materials.Quicklime.getDust(18),
+ Materials.Potash.getDust(9),
+ Materials.Magnesia.getDust(1),
+ Materials.PhosphorousPentoxide.getDust(2),
+ Materials.SodaAsh.getDust(1),
+ Materials.BandedIron.getDust(4))
+ .outputChances(6400, 6000, 4500, 10000, 10000, 10000)
+ .duration(5 * MINUTES)
+ .eut(30)
+ .addTo(centrifugeRecipes);
+
+ // Stone Dust and Metal Mixture centrifuge recipes
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Stone.getDust(36))
+ .itemOutputs(
+ Materials.Quartzite.getDust(9),
+ Materials.PotassiumFeldspar.getDust(9),
+ Materials.Marble.getDust(8),
+ Materials.Biotite.getDust(4),
+ Materials.MetalMixture.getDust(3),
+ Materials.Sodalite.getDust(2))
+ .outputChances(10000, 10000, 10000, 10000, 10000, 10000)
+ .duration(7 * MINUTES + 12 * SECONDS)
+ .eut(30)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.MetalMixture.getDust(36))
+ .itemOutputs(
+ Materials.BandedIron.getDust(9),
+ Materials.Bauxite.getDust(9),
+ Materials.Pyrolusite.getDust(8),
+ Materials.Barite.getDust(4),
+ Materials.Chromite.getDust(3),
+ Materials.Ilmenite.getDust(2))
+ .outputChances(10000, 10000, 10000, 10000, 10000, 10000)
+ .duration(10 * MINUTES + 56 * SECONDS + 5 * TICKS)
+ .eut((int) TierEU.RECIPE_EV)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Propane.getGas(320))
+ .fluidOutputs(Materials.LPG.getFluid(290))
+ .duration(20 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Butane.getGas(320))
+ .fluidOutputs(Materials.LPG.getFluid(370))
+ .duration(20 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.ElectrumFlux, 8))
+ .outputChances(10000, 10000)
+ .fluidInputs(Materials.EnrichedNaquadria.getFluid(9216))
+ .fluidOutputs(Materials.FluidNaquadahFuel.getFluid(4806))
+ .duration(30 * SECONDS)
+ .eut(2000000)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1))
+ .duration(12 * SECONDS + 10 * TICKS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.magma_cream, 1))
+ .itemOutputs(new ItemStack(Items.blaze_powder, 1), new ItemStack(Items.slime_ball, 1))
+ .duration(25 * SECONDS)
+ .eut(5)
+ .addTo(centrifugeRecipes);
+
+ if (Thaumcraft.isModLoaded()) {
+ // air
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 144), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedAir, 1))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(12)
+ .addTo(centrifugeRecipes);
+
+ // fire
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 146), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedFire, 1))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(12)
+ .addTo(centrifugeRecipes);
+
+ // aqua
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 147), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedWater, 1))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(12)
+ .addTo(centrifugeRecipes);
+
+ // terra
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 145), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedEarth, 1))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(12)
+ .addTo(centrifugeRecipes);
+
+ // ordo
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 148), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedOrder, 1))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(12)
+ .addTo(centrifugeRecipes);
+
+ // perditio
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 149), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedEntropy, 1))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(12)
+ .addTo(centrifugeRecipes);
+
+ // Nethershard
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 152), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(ThaumicTinkerer.ID, "kamiResource", 1L, 6))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(512)
+ .addTo(centrifugeRecipes);
+
+ // Endshard
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 153), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(ThaumicTinkerer.ID, "kamiResource", 1L, 7))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(512)
+ .addTo(centrifugeRecipes);
+ }
+
+ if (ExtraUtilities.isModLoaded()) {
+ // Caelestis red
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 154), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 2),
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 10),
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 14),
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 1),
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 12),
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 6))
+ .duration(25 * SECONDS + 12 * TICKS)
+ .eut(12)
+ .addTo(centrifugeRecipes);
+
+ // Caelestis green
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 155), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 13),
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 5),
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 4),
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 8),
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 0))
+ .duration(25 * SECONDS + 12 * TICKS)
+ .eut(12)
+ .addTo(centrifugeRecipes);
+
+ // Caelestis blue
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 156), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 3),
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 9),
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 11),
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 7),
+ getModItem(ExtraUtilities.ID, "greenscreen", 1L, 15))
+ .duration(25 * SECONDS + 12 * TICKS)
+ .eut(12)
+ .addTo(centrifugeRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ChemicalBathRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ChemicalBathRecipes.java
new file mode 100644
index 0000000000..8ca67db192
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/ChemicalBathRecipes.java
@@ -0,0 +1,404 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.BuildCraftTransport;
+import static gregtech.api.recipe.RecipeMaps.chemicalBathRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class ChemicalBathRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Raw_Fries.get(1))
+ .itemOutputs(ItemList.Food_Fries.get(1))
+ .fluidInputs(Materials.FryingOilHot.getFluid(10))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("dynamite", 1))
+ .itemOutputs(GT_ModHandler.getIC2Item("stickyDynamite", 1))
+ .fluidInputs(Materials.Glue.getFluid(10))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Steel, 1))
+ .itemOutputs(GT_ModHandler.getIC2Item("reinforcedStone", 1))
+ .fluidInputs(Materials.Concrete.getMolten(144))
+ .duration(10 * SECONDS)
+ .eut(4)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HydratedCoal, 1))
+ .fluidInputs(Materials.Water.getFluid(125))
+ .duration(12 * TICKS)
+ .eut(4)
+ .addTo(chemicalBathRecipes);
+
+ // paper creation recipes
+ ItemStack[] paperSources = new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Paper, 1L), new ItemStack(Items.reeds, 1, 32767) };
+ for (ItemStack paperSource : paperSources) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(paperSource)
+ .itemOutputs(new ItemStack(Items.paper, 1, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(4)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(paperSource)
+ .itemOutputs(new ItemStack(Items.paper, 1, 0))
+ .fluidInputs(GT_ModHandler.getDistilledWater(100))
+ .duration(10 * SECONDS)
+ .eut(4)
+ .addTo(chemicalBathRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HydratedCoal, 1))
+ .fluidInputs(GT_ModHandler.getDistilledWater(125))
+ .duration(12 * TICKS)
+ .eut(4)
+ .addTo(chemicalBathRecipes);
+
+ for (int i = 1; i < 16; i++) {
+ // wool cleaning recipes
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.wool, 1, i))
+ .itemOutputs(new ItemStack(Blocks.wool, 1, 0))
+ .fluidInputs(Materials.Chlorine.getGas(50))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(chemicalBathRecipes);
+
+ // carpet cleaning recipes
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.carpet, 1, 32767))
+ .itemOutputs(new ItemStack(Blocks.carpet, 1, 0))
+ .fluidInputs(Materials.Chlorine.getGas(25))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(chemicalBathRecipes);
+ }
+
+ // stained hardened clay cleaning
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.stained_hardened_clay, 1, 32767))
+ .itemOutputs(new ItemStack(Blocks.hardened_clay, 1, 0))
+ .fluidInputs(Materials.Chlorine.getGas(50))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(chemicalBathRecipes);
+
+ // stained glass cleaning
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.stained_glass, 1, 32767))
+ .itemOutputs(new ItemStack(Blocks.glass, 1, 0))
+ .fluidInputs(Materials.Chlorine.getGas(50))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(chemicalBathRecipes);
+
+ // stained glass pane cleaning
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.stained_glass_pane, 1, 32767))
+ .itemOutputs(new ItemStack(Blocks.glass_pane, 1, 0))
+ .fluidInputs(Materials.Chlorine.getGas(20))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(chemicalBathRecipes);
+
+ // light -> dark concrete recipes
+ for (int i = 0; i < 8; i++) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(GregTech_API.sBlockConcretes, 1, i + 8))
+ .itemOutputs(new ItemStack(GregTech_API.sBlockConcretes, 1, i))
+ .fluidInputs(Materials.Water.getFluid(250))
+ .duration(10 * SECONDS)
+ .eut(4)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(GregTech_API.sBlockConcretes, 1, i + 8))
+ .itemOutputs(new ItemStack(GregTech_API.sBlockConcretes, 1, i))
+ .fluidInputs(GT_ModHandler.getDistilledWater(250))
+ .duration(10 * SECONDS)
+ .eut(4)
+ .addTo(chemicalBathRecipes);
+ }
+
+ // reinforced blocks
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Bronze, 1))
+ .itemOutputs(ItemList.Block_BronzePlate.get(1))
+ .fluidInputs(Materials.Concrete.getMolten(144))
+ .duration(10 * SECONDS)
+ .eut(4)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Steel, 1))
+ .itemOutputs(ItemList.Block_SteelPlate.get(1))
+ .fluidInputs(Materials.Steel.getMolten(288))
+ .duration(12 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Titanium, 1))
+ .itemOutputs(ItemList.Block_TitaniumPlate.get(1))
+ .fluidInputs(Materials.Titanium.getMolten(144))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 1))
+ .itemOutputs(ItemList.Block_TungstenSteelReinforced.get(1))
+ .fluidInputs(Materials.TungstenSteel.getMolten(144))
+ .duration(17 * SECONDS + 10 * TICKS)
+ .eut(64)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Iridium, 1))
+ .itemOutputs(ItemList.Block_IridiumTungstensteel.get(1))
+ .fluidInputs(Materials.Iridium.getMolten(144))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Naquadah, 1))
+ .itemOutputs(ItemList.Block_NaquadahPlate.get(1))
+ .fluidInputs(Materials.Osmium.getMolten(144))
+ .duration(22 * SECONDS + 10 * TICKS)
+ .eut(256)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 1))
+ .itemOutputs(ItemList.Block_NeutroniumPlate.get(1))
+ .fluidInputs(Materials.Naquadria.getMolten(144))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.TungstenSteel, 1))
+ .itemOutputs(ItemList.Block_TungstenSteelReinforced.get(1))
+ .fluidInputs(Materials.Concrete.getMolten(144))
+ .duration(10 * SECONDS)
+ .eut(4)
+ .addTo(chemicalBathRecipes);
+ }
+
+ for (int j = 0; j < Dyes.dyeRed.getSizeOfFluidList(); j++) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.RedAlloy, 1))
+ .itemOutputs(getModItem(BuildCraftTransport.ID, "pipeWire", 4L, 0))
+ .fluidInputs(Dyes.dyeRed.getFluidDye(j, 72))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(16)
+ .addTo(chemicalBathRecipes);
+ }
+ for (int j = 0; j < Dyes.dyeBlue.getSizeOfFluidList(); j++) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.RedAlloy, 1))
+ .itemOutputs(getModItem(BuildCraftTransport.ID, "pipeWire", 4L, 1))
+ .fluidInputs(Dyes.dyeBlue.getFluidDye(j, 72))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(16)
+ .addTo(chemicalBathRecipes);
+ }
+ for (int j = 0; j < Dyes.dyeGreen.getSizeOfFluidList(); j++) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.RedAlloy, 1))
+ .itemOutputs(getModItem(BuildCraftTransport.ID, "pipeWire", 4L, 2))
+ .fluidInputs(Dyes.dyeGreen.getFluidDye(j, 72))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(16)
+ .addTo(chemicalBathRecipes);
+ }
+ for (int j = 0; j < Dyes.dyeYellow.getSizeOfFluidList(); j++) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.RedAlloy, 1))
+ .itemOutputs(getModItem(BuildCraftTransport.ID, "pipeWire", 4L, 3))
+ .fluidInputs(Dyes.dyeYellow.getFluidDye(j, 72))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(16)
+ .addTo(chemicalBathRecipes);
+ }
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ for (int j = 0; j < Dyes.VALUES[i].getSizeOfFluidList(); j++) {
+ if (i != 15) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.wool, 1, 0))
+ .itemOutputs(new ItemStack(Blocks.wool, 1, 15 - i))
+ .fluidInputs(Dyes.VALUES[i].getFluidDye(j, 72))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(chemicalBathRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.glass, 1, 0))
+ .itemOutputs(new ItemStack(Blocks.stained_glass, 1, 15 - i))
+ .fluidInputs(Dyes.VALUES[i].getFluidDye(j, 18))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.hardened_clay, 1, 0))
+ .itemOutputs(new ItemStack(Blocks.stained_hardened_clay, 1, 15 - i))
+ .fluidInputs(Dyes.VALUES[i].getFluidDye(j, 18))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(chemicalBathRecipes);
+ }
+ }
+
+ // Rn relate quantum recipe
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.EnderEye, 1))
+ .itemOutputs(ItemList.QuantumEye.get(1))
+ .fluidInputs(Materials.Radon.getGas(250))
+ .duration(24 * SECONDS)
+ .eut(384)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherStar, 1))
+ .itemOutputs(ItemList.QuantumStar.get(1))
+ .fluidInputs(Materials.Radon.getGas(1250))
+ .duration(1 * MINUTES + 36 * SECONDS)
+ .eut(384)
+ .addTo(chemicalBathRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.WovenKevlar.get(1))
+ .itemOutputs(MaterialsKevlar.Kevlar.getPlates(1))
+ .fluidInputs(MaterialsKevlar.PolyurethaneResin.getFluid(1000))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(chemicalBathRecipes);
+
+ // Na + H2O = NaOH + H
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Sodium.getDust(1))
+ .itemOutputs(Materials.SodiumHydroxide.getDust(3))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(1000))
+ .duration(5 * SECONDS)
+ .eut(4)
+ .addTo(chemicalBathRecipes);
+
+ // Custom Sodium Persulfate Ore Processing Recipes
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Tantalite, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Tantalite, 1),
+ Materials.Tantalum.getDust(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+ .outputChances(10000, 3000, 4000)
+ .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
+ .duration(40 * SECONDS)
+ .eut(8)
+ .addTo(chemicalBathRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Pyrolusite, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Pyrolusite, 1),
+ Materials.Manganese.getDust(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+ .outputChances(10000, 7000, 4000)
+ .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
+ .duration(40 * SECONDS)
+ .eut(8)
+ .addTo(chemicalBathRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Quartzite, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Quartzite, 1),
+ Materials.CertusQuartz.getDust(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+ .outputChances(10000, 3000, 4000)
+ .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
+ .duration(40 * SECONDS)
+ .eut(8)
+ .addTo(chemicalBathRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.CertusQuartz, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.CertusQuartz, 1),
+ Materials.Barium.getDust(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+ .outputChances(10000, 7000, 4000)
+ .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
+ .duration(40 * SECONDS)
+ .eut(8)
+ .addTo(chemicalBathRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Bauxite, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Bauxite, 1),
+ Materials.Rutile.getDust(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+ .outputChances(10000, 5000, 4000)
+ .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
+ .duration(40 * SECONDS)
+ .eut(8)
+ .addTo(chemicalBathRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Thorium, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Thorium, 1),
+ Materials.Uranium.getDust(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+ .outputChances(10000, 3000, 4000)
+ .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
+ .duration(40 * SECONDS)
+ .eut(8)
+ .addTo(chemicalBathRecipes);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.Stibnite, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Stibnite, 1),
+ Materials.Antimony.getDust(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+ .outputChances(10000, 5000, 4000)
+ .fluidInputs(Materials.SodiumPersulfate.getFluid(100))
+ .duration(40 * SECONDS)
+ .eut(8)
+ .addTo(chemicalBathRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ChemicalRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ChemicalRecipes.java
new file mode 100644
index 0000000000..d099157c1c
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/ChemicalRecipes.java
@@ -0,0 +1,5973 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.GTNHLanthanides;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GalaxySpace;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.recipe.RecipeMaps.chemicalReactorRecipes;
+import static gregtech.api.recipe.RecipeMaps.multiblockChemicalReactorRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ChemicalRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ singleBlockOnly();
+ multiblockOnly();
+ registerBoth();
+
+ polymerizationRecipes();
+ }
+
+ public void registerBoth() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.paper, 1), new ItemStack(Items.string, 1))
+ .itemOutputs(GT_ModHandler.getIC2Item("dynamite", 1))
+ .fluidInputs(Materials.Glyceryl.getFluid(500))
+ .duration(8 * SECONDS)
+ .eut(4)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Indium, 1))
+ .fluidInputs(new FluidStack(ItemList.sIndiumConcentrate, 8000))
+ .fluidOutputs(new FluidStack(ItemList.sLeadZincSolution, 8000))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 36),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Indium, 1))
+ .fluidInputs(new FluidStack(ItemList.sIndiumConcentrate, 72000))
+ .fluidOutputs(new FluidStack(ItemList.sLeadZincSolution, 72000))
+ .duration(22 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ // Platinum Group Sludge chain
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Pentlandite, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.PlatinumGroupSludge, 1))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .fluidOutputs(new FluidStack(ItemList.sNickelSulfate, 2000))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Chalcopyrite, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.PlatinumGroupSludge, 1))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .fluidOutputs(new FluidStack(ItemList.sBlueVitriol, 2000))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // Fe + 3HCl = FeCl3 + 3H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1), ItemList.Cell_Empty.get(3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 3))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(3000))
+ .fluidOutputs(Materials.IronIIIChloride.getFluid(1000))
+ .duration(20 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedGold, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 8))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thaumium, 16))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("ic2coolant"), 1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GalaxySpace.ID, "item.UnknowCrystal", 4), Materials.Osmiridium.getDust(2))
+ .itemOutputs(ItemList.Circuit_Chip_Stemcell.get(64))
+ .fluidInputs(Materials.GrowthMediumSterilized.getFluid(1000))
+ .fluidOutputs(getFluidStack("bacterialsludge", 1000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Chip_Stemcell.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CosmicNeutronium, 4))
+ .itemOutputs(ItemList.Circuit_Chip_Biocell.get(32))
+ .fluidInputs(Materials.BioMediumSterilized.getFluid(2000))
+ .fluidOutputs(getFluidStack("mutagen", 2000))
+ .duration(60 * SECONDS)
+ .eut(500000)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Items.sugar),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plastic, 1))
+ .itemOutputs(ItemList.GelledToluene.get(2))
+ .fluidInputs(new FluidStack(ItemList.sToluene, 133))
+ .duration(7 * SECONDS)
+ .eut(192)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.sugar, 9), GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 1))
+ .itemOutputs(ItemList.GelledToluene.get(18))
+ .fluidInputs(new FluidStack(ItemList.sToluene, 1197))
+ .duration(1 * MINUTES + 3 * SECONDS)
+ .eut(192)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.GelledToluene.get(4), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(new ItemStack(Blocks.tnt, 1))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(250))
+ .duration(10 * SECONDS)
+ .eut(24)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.GelledToluene.get(4), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("industrialTnt", 1))
+ .fluidInputs(new FluidStack(ItemList.sNitrationMixture, 200))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(150))
+ .duration(4 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
+ Materials.Empty.getCells(1))
+ .fluidInputs(Materials.NatruralGas.getGas(16000))
+ .fluidOutputs(Materials.Gas.getGas(16000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.NatruralGas, 2),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Gas, 2))
+ .fluidInputs(Materials.Hydrogen.getGas(250))
+ .fluidOutputs(Materials.HydricSulfide.getGas(125))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
+ Materials.Empty.getCells(1))
+ .fluidInputs(Materials.SulfuricGas.getGas(16000))
+ .fluidOutputs(Materials.Gas.getGas(16000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricGas, 2),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Gas, 2))
+ .fluidInputs(Materials.Hydrogen.getGas(250))
+ .fluidOutputs(Materials.HydricSulfide.getGas(125))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
+ Materials.Empty.getCells(1))
+ .fluidInputs(Materials.SulfuricNaphtha.getFluid(12000))
+ .fluidOutputs(Materials.Naphtha.getFluid(12000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricNaphtha, 3),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Naphtha, 3))
+ .fluidInputs(Materials.Hydrogen.getGas(500))
+ .fluidOutputs(Materials.HydricSulfide.getGas(250))
+ .duration(2 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
+ Materials.Empty.getCells(1))
+ .fluidInputs(Materials.SulfuricLightFuel.getFluid(12000))
+ .fluidOutputs(Materials.LightFuel.getFluid(12000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricLightFuel, 3),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 3))
+ .fluidInputs(Materials.Hydrogen.getGas(500))
+ .fluidOutputs(Materials.HydricSulfide.getGas(250))
+ .duration(2 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1),
+ Materials.Empty.getCells(1))
+ .fluidInputs(Materials.SulfuricHeavyFuel.getFluid(8000))
+ .fluidOutputs(Materials.HeavyFuel.getFluid(8000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricHeavyFuel, 1),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1))
+ .fluidInputs(Materials.Hydrogen.getGas(250))
+ .fluidOutputs(Materials.HydricSulfide.getGas(125))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Potassium, 1))
+ .fluidInputs(Materials.Naphtha.getFluid(576))
+ .fluidOutputs(Materials.Polycaprolactam.getMolten(1296))
+ .duration(32 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 9),
+ GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Potassium, 1))
+ .fluidInputs(Materials.Naphtha.getFluid(5184))
+ .fluidOutputs(Materials.Polycaprolactam.getMolten(11664))
+ .duration(4 * MINUTES + 48 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ for (Fluid tFluid : new Fluid[] { FluidRegistry.WATER, GT_ModHandler.getDistilledWater(1L)
+ .getFluid() }) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(2))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(3))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(2))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(1))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(1))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(3))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(4))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(3))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(2))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(2))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(3))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(4))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(3))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(2))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Apatite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(2))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(3))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(4))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(3))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(2))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glauconite, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(2))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(3))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TricalciumPhosphate, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(4))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphate, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(3))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 3))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(2))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GlauconiteSand, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DarkAsh, 1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(2))
+ .fluidInputs(new FluidStack(tFluid, 1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+ }
+
+ // 3quartz dust + Na + H2O = 3quartz gem (Na loss
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 3))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.CertusQuartz, 3))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Quartzite, 3))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 3))
+ .fluidInputs(GT_ModHandler.getDistilledWater(1000))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.CertusQuartz, 3))
+ .fluidInputs(GT_ModHandler.getDistilledWater(1000))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Quartzite, 3))
+ .fluidInputs(GT_ModHandler.getDistilledWater(1000))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // 3UO2 + 4Al = 3U + 2Al2O3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uraninite, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 10))
+ .duration(50 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // UO2 + 2Mg = U + 2MgO
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uraninite, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
+ .duration(50 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // Ca + C + 3O = CaCO3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 5))
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // C + 4H = CH4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Carbon.getDust(1), GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Hydrogen.getGas(4000))
+ .fluidOutputs(Materials.Methane.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // TiO2 + 2C + 4Cl = TiCl4 + 2CO
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Rutile, 3),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Carbon, 2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.CarbonMonoxide, 2))
+ .fluidInputs(Materials.Chlorine.getGas(4000))
+ .fluidOutputs(Materials.Titaniumtetrachloride.getFluid(1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Rutile, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 2))
+ .fluidInputs(Materials.Chlorine.getGas(4000))
+ .fluidOutputs(Materials.Titaniumtetrachloride.getFluid(1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Rutile, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 2))
+ .fluidInputs(Materials.Chlorine.getGas(4000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(2000), Materials.Titaniumtetrachloride.getFluid(1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 4Na + 2MgCl2 = 2Mg + 4NaCl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 4),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesiumchloride, 6))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 8))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ // rubber
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1))
+ .fluidOutputs(Materials.Rubber.getMolten(1296))
+ .duration(30 * SECONDS)
+ .eut(16)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Sulfur, 1))
+ .fluidOutputs(Materials.Rubber.getMolten(144))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(UniversalChemical);
+
+ // vanilla recipe
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Gold, 8),
+ new ItemStack(Items.melon, 1, 32767))
+ .itemOutputs(new ItemStack(Items.speckled_melon, 1, 0))
+ .duration(50)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Gold, 8),
+ new ItemStack(Items.carrot, 1, 32767))
+ .itemOutputs(new ItemStack(Items.golden_carrot, 1, 0))
+ .duration(50)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Gold, 8),
+ new ItemStack(Items.apple, 1, 32767))
+ .itemOutputs(new ItemStack(Items.golden_apple, 1, 0))
+ .duration(50)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Gold, 8),
+ new ItemStack(Items.apple, 1, 32767))
+ .itemOutputs(new ItemStack(Items.golden_apple, 1, 1))
+ .duration(50)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.EnderPearl, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.EnderEye, 1))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1),
+ new ItemStack(Items.slime_ball, 1, 32767))
+ .itemOutputs(new ItemStack(Items.magma_cream, 1, 0))
+ .duration(50)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // 1/9U +Air ==Pu== 0.1Rn
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Plutonium, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Uranium, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 8))
+ .fluidInputs(Materials.Air.getGas(1000))
+ .fluidOutputs(Materials.Radon.getGas(100))
+ .duration(10 * MINUTES)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ // Silicon Line
+ // SiO2 + 2Mg = 2MgO + Si
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 6),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesium, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Magnesia, 4))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ // 3SiF4 + 4Al = 3Si + 4AlF3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.AluminiumFluoride, 16))
+ .fluidInputs(Materials.SiliconTetrafluoride.getGas(3000))
+ .duration(30 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // SiO2 + 4HF = SiF4 + 2H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3),
+ GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.HydrofluoricAcid.getFluid(4000))
+ .fluidOutputs(Materials.SiliconTetrafluoride.getGas(1000))
+ .duration(15 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NetherQuartz, 3),
+ GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.HydrofluoricAcid.getFluid(4000))
+ .fluidOutputs(Materials.SiliconTetrafluoride.getGas(1000))
+ .duration(15 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CertusQuartz, 3),
+ GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.HydrofluoricAcid.getFluid(4000))
+ .fluidOutputs(Materials.SiliconTetrafluoride.getGas(1000))
+ .duration(15 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 6),
+ GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.HydrofluoricAcid.getFluid(4000))
+ .fluidOutputs(Materials.SiliconTetrafluoride.getGas(1000))
+ .duration(15 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // 4Na + SiCl4 = 4NaCl + Si
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Salt, 8))
+ .fluidInputs(Materials.SiliconTetrachloride.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // HSiCl3 + 2H = 3HCl + Si
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1), ItemList.Cell_Empty.get(2))
+ .fluidInputs(Materials.Trichlorosilane.getFluid(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(3000))
+ .duration(15 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Trichlorosilane, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1), ItemList.Cell_Empty.get(1))
+ .fluidInputs(Materials.Hydrogen.getGas(2000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(3000))
+ .duration(15 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // 4HSiCl3 = 3SiCl4 + SiH4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Cell_Empty.get(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Silane, 1))
+ .fluidInputs(Materials.Trichlorosilane.getFluid(4000))
+ .fluidOutputs(Materials.SiliconTetrachloride.getFluid(3000))
+ .duration(12 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // SiH4 = Si + 4H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1))
+ .fluidInputs(Materials.Silane.getGas(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(4000))
+ .duration(15 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // Ca + 2H = CaH2
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calciumhydride, 3))
+ .fluidInputs(Materials.Hydrogen.getGas(2000))
+ .duration(20 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // Si + 4Cl = SiCl4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.Chlorine.getGas(4000))
+ .fluidOutputs(Materials.SiliconTetrachloride.getFluid(1000))
+ .duration(20 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // 2Na + S = Na2S
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Sodium.getDust(2), Materials.Sulfur.getDust(1))
+ .itemOutputs(Materials.SodiumSulfide.getDust(3))
+ .duration(60)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // H2S + H2O + (O2) = 0.5H2SO4(Diluted) ( S loss
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydricSulfide.getCells(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(750))
+ .duration(3 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Water.getCells(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.HydricSulfide.getGas(1000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(750))
+ .duration(3 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // Ni + 4CO = Ni(CO)4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.CarbonMonoxide, 4))
+ .itemOutputs(ItemList.Cell_Empty.get(4))
+ .fluidOutputs(MaterialsKevlar.NickelTetracarbonyl.getFluid(1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.CarbonMonoxide.getGas(4000))
+ .fluidOutputs(MaterialsKevlar.NickelTetracarbonyl.getFluid(1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1), ItemList.Cell_Empty.get(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.NickelTetracarbonyl, 1))
+ .fluidInputs(Materials.CarbonMonoxide.getGas(4000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(UniversalChemical);
+
+ // C2H4O + H2O = C2H6O2
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.EthyleneOxide, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cell_Empty.get(1))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(MaterialsKevlar.Ethyleneglycol.getFluid(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ // C2H4 + O = C2H4O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Ethylene, 2),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.Cell_Empty.get(2))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .fluidOutputs(MaterialsKevlar.Acetaldehyde.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(ItemList.Cell_Empty.get(1))
+ .fluidInputs(Materials.Ethylene.getGas(2000))
+ .fluidOutputs(MaterialsKevlar.Acetaldehyde.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // NiAl3 + 2NaOH + 2H2O = NiAl + 2NaAlO2 + 6H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, MaterialsKevlar.NickelAluminide, 4),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 6))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.RaneyNickelActivated, 2),
+ Materials.SodiumAluminate.getDust(8))
+ .fluidInputs(Materials.Water.getFluid(2000))
+ .fluidOutputs(Materials.Hydrogen.getGas(6000))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(UniversalChemical);
+
+ // Cu + O = CuO
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CupricOxide, 2),
+ ItemList.Cell_Empty.get(1))
+ .duration(5 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CupricOxide, 2))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .duration(5 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // 2Bi + 3O = Bi2O3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bismuth, 4),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 6))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.BismuthIIIOxide, 10),
+ ItemList.Cell_Empty.get(6))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bismuth, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.BismuthIIIOxide, 10))
+ .fluidInputs(Materials.Oxygen.getGas(6000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // C4H6O2 + CNH5 = C5H9NO + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.Methylamine, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.GammaButyrolactone, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.NMethylIIPyrrolidone, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 8),
+ GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.Chlorine.getGas(16000))
+ .fluidOutputs(MaterialsKevlar.SulfurDichloride.getFluid(8000))
+ .duration(40 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // SCl2 + SO3 = SO2 + SOCl2
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfurTrioxide, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.SulfurDichloride, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.ThionylChloride, 1),
+ ItemList.Cell_Empty.get(1))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ // C8H10 + 6O =CoC22H14O4= C8H6O4 + 2H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.IVDimethylbenzene, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIINaphthenate, 41))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.TerephthalicAcid, 1))
+ .fluidInputs(Materials.Oxygen.getGas(6000))
+ .fluidOutputs(Materials.Water.getFluid(2000))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ // 2CH4 + C6H6 = C8H10 + 4H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methane.getCells(2), GT_Utility.getIntegratedCircuit(13))
+ .itemOutputs(MaterialsKevlar.IIIDimethylbenzene.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Benzene.getFluid(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(4000))
+ .duration(3 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Benzene.getCells(1), GT_Utility.getIntegratedCircuit(14))
+ .itemOutputs(MaterialsKevlar.IIIDimethylbenzene.getCells(1))
+ .fluidInputs(Materials.Methane.getGas(2000))
+ .fluidOutputs(Materials.Hydrogen.getGas(4000))
+ .duration(3 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // 2CH4 + C6H6 = C8H10 + 4H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methane.getCells(2), GT_Utility.getIntegratedCircuit(15))
+ .itemOutputs(MaterialsKevlar.IVDimethylbenzene.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Benzene.getFluid(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(4000))
+ .duration(3 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Benzene.getCells(1), GT_Utility.getIntegratedCircuit(16))
+ .itemOutputs(MaterialsKevlar.IVDimethylbenzene.getCells(1))
+ .fluidInputs(Materials.Methane.getGas(2000))
+ .fluidOutputs(Materials.Hydrogen.getGas(4000))
+ .duration(3 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(MaterialsKevlar.CobaltIIHydroxide.getDust(5), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(MaterialsKevlar.CobaltIINaphthenate.getDust(41))
+ .fluidInputs(MaterialsKevlar.NaphthenicAcid.getFluid(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(MaterialsKevlar.CobaltIIAcetate.getDust(15), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(MaterialsKevlar.CobaltIINaphthenate.getDust(41))
+ .fluidInputs(MaterialsKevlar.NaphthenicAcid.getFluid(1000))
+ .fluidOutputs(Materials.AceticAcid.getFluid(1500))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ // Co + 2HNO3 = Co(NO3)2 + 2H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Cobalt.getDust(1), Materials.NitricAcid.getCells(2))
+ .itemOutputs(
+ MaterialsKevlar.CobaltIINitrate.getDust(9),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // Co(NO3)2 + 2KOH = CoH2O2 + 2KNO3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ MaterialsKevlar.CobaltIINitrate.getDust(9),
+ getModItem(NewHorizonsCoreMod.ID, "item.PotassiumHydroxideDust", 6L, 0))
+ .itemOutputs(MaterialsKevlar.CobaltIIHydroxide.getDust(5), Materials.Saltpeter.getDust(10))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // CoO + 2C2H4O2 = CoC4H6O4 + 2H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.CobaltOxide.getDust(2), Materials.AceticAcid.getCells(2))
+ .itemOutputs(MaterialsKevlar.CobaltIIAcetate.getDust(15), ItemList.Cell_Empty.get(2))
+ .fluidOutputs(Materials.Water.getFluid(2000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Phosphorus.getDust(1), GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Chlorine.getGas(3000))
+ .fluidOutputs(MaterialsKevlar.PhosphorusTrichloride.getFluid(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Phosphorus.getDust(9), GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(Materials.Chlorine.getGas(27000))
+ .fluidOutputs(MaterialsKevlar.PhosphorusTrichloride.getFluid(9000))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // Na + H = NaH
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Sodium.getDust(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(MaterialsKevlar.SodiumHydride.getDust(2))
+ .fluidInputs(Materials.Hydrogen.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // CH3ONa + H2O = CH4O + NaOH
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(MaterialsKevlar.SodiumMethoxide.getDust(6), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.SodiumHydroxide.getDust(3))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.Methanol.getFluid(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ // K + HNO3 = KNO3 + H (not real, but gameplay
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Potassium.getDust(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Saltpeter.getDust(5))
+ .fluidInputs(Materials.NitricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(1000))
+ .duration(5 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // CH3COOH + CH3OH = CH3COOCH3 + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.AceticAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Water.getCells(1))
+ .fluidInputs(Materials.Methanol.getFluid(1000))
+ .fluidOutputs(Materials.MethylAcetate.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Water.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(1000))
+ .fluidOutputs(Materials.MethylAcetate.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.AceticAcid.getCells(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Methanol.getFluid(1000))
+ .fluidOutputs(Materials.MethylAcetate.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(1000))
+ .fluidOutputs(Materials.MethylAcetate.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.AceticAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.MethylAcetate.getCells(1))
+ .fluidInputs(Materials.Methanol.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.MethylAcetate.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.AceticAcid.getCells(1), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.MethylAcetate.getCells(1))
+ .fluidInputs(Materials.Methanol.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.MethylAcetate.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // CO and CO2 recipes
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Carbon.getDust(1), GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
+ .duration(2 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Coal.getGems(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Ash.getDustTiny(1))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
+ .duration(4 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Coal.getDust(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Ash.getDustTiny(1))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
+ .duration(4 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Charcoal.getGems(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Ash.getDustTiny(1))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
+ .duration(4 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Charcoal.getDust(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Ash.getDustTiny(1))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
+ .duration(4 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Carbon.getDust(1), GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.Oxygen.getGas(2000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(2 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Coal.getGems(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Ash.getDustTiny(1))
+ .fluidInputs(Materials.Oxygen.getGas(2000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(2 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Coal.getDust(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Ash.getDustTiny(1))
+ .fluidInputs(Materials.Oxygen.getGas(2000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(2 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Charcoal.getGems(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Ash.getDustTiny(1))
+ .fluidInputs(Materials.Oxygen.getGas(2000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(2 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Charcoal.getDust(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Ash.getDustTiny(1))
+ .fluidInputs(Materials.Oxygen.getGas(2000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(2 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Carbon.getDust(1))
+ .fluidInputs(Materials.CarbonDioxide.getGas(1000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(2000))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Coal.getGems(9), GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(Materials.Ash.getDust(1))
+ .fluidInputs(Materials.Oxygen.getGas(9000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(9000))
+ .duration(36 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Coal.getDust(9), GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(Materials.Ash.getDust(1))
+ .fluidInputs(Materials.Oxygen.getGas(9000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(9000))
+ .duration(36 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Charcoal.getGems(9), GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(Materials.Ash.getDust(1))
+ .fluidInputs(Materials.Oxygen.getGas(9000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(9000))
+ .duration(36 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Charcoal.getDust(9), GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(Materials.Ash.getDust(1))
+ .fluidInputs(Materials.Oxygen.getGas(9000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(9000))
+ .duration(36 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Coal.getGems(9), GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(Materials.Ash.getDust(1))
+ .fluidInputs(Materials.Oxygen.getGas(18000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(9000))
+ .duration(18 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Coal.getDust(9), GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(Materials.Ash.getDust(1))
+ .fluidInputs(Materials.Oxygen.getGas(18000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(9000))
+ .duration(18 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Charcoal.getGems(9), GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(Materials.Ash.getDust(1))
+ .fluidInputs(Materials.Oxygen.getGas(18000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(9000))
+ .duration(18 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Charcoal.getDust(9), GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(Materials.Ash.getDust(1))
+ .fluidInputs(Materials.Oxygen.getGas(18000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(9000))
+ .duration(18 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ // CO + 4H = CH3OH
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.CarbonMonoxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(4000))
+ .fluidOutputs(Materials.Methanol.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Hydrogen.getCells(4), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(4))
+ .fluidInputs(Materials.CarbonMonoxide.getGas(1000))
+ .fluidOutputs(Materials.Methanol.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.CarbonMonoxide.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Methanol.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(4000))
+ .duration(6 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Hydrogen.getCells(4), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Methanol.getCells(1), Materials.Empty.getCells(3))
+ .fluidInputs(Materials.CarbonMonoxide.getGas(1000))
+ .duration(6 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ // CO2 + 6H = CH3OH + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.CarbonDioxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Water.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(6000))
+ .fluidOutputs(Materials.Methanol.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Hydrogen.getCells(6), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(5))
+ .fluidInputs(Materials.CarbonDioxide.getGas(1000))
+ .fluidOutputs(Materials.Methanol.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.CarbonDioxide.getCells(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(6000))
+ .fluidOutputs(Materials.Methanol.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Hydrogen.getCells(6), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(6))
+ .fluidInputs(Materials.CarbonDioxide.getGas(1000))
+ .fluidOutputs(Materials.Methanol.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.CarbonDioxide.getCells(1), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Methanol.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(6000))
+ .duration(6 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Hydrogen.getCells(6), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Methanol.getCells(1), Materials.Empty.getCells(5))
+ .fluidInputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(6 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ // CH3OH + CO = CH3COOH
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.CarbonMonoxide.getGas(1000))
+ .fluidOutputs(Materials.AceticAcid.getFluid(1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.CarbonMonoxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Methanol.getFluid(1000))
+ .fluidOutputs(Materials.AceticAcid.getFluid(1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.AceticAcid.getCells(1))
+ .fluidInputs(Materials.CarbonMonoxide.getGas(1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.CarbonMonoxide.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.AceticAcid.getCells(1))
+ .fluidInputs(Materials.Methanol.getFluid(1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // CH2CH2 + 2O = CH3COOH
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethylene.getCells(1), GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(2000))
+ .fluidOutputs(Materials.AceticAcid.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(2), GT_Utility.getIntegratedCircuit(9))
+ .itemOutputs(Materials.Empty.getCells(2))
+ .fluidInputs(Materials.Ethylene.getGas(1000))
+ .fluidOutputs(Materials.AceticAcid.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethylene.getCells(1), GT_Utility.getIntegratedCircuit(19))
+ .itemOutputs(Materials.AceticAcid.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(2000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(2), GT_Utility.getIntegratedCircuit(19))
+ .itemOutputs(Materials.AceticAcid.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Ethylene.getGas(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // O + C2H4O2 + C2H4 = C4H6O2 + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethylene.getCells(1), Materials.AceticAcid.getCells(1))
+ .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.VinylAcetate.getFluid(1000))
+ .duration(9 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.AceticAcid.getCells(1), Materials.Oxygen.getCells(1))
+ .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Ethylene.getGas(1000))
+ .fluidOutputs(Materials.VinylAcetate.getFluid(1000))
+ .duration(9 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(1), Materials.Ethylene.getCells(1))
+ .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(1000))
+ .fluidOutputs(Materials.VinylAcetate.getFluid(1000))
+ .duration(9 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // Ethanol -> Ethylene (Intended loss for Sulfuric Acid)
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethanol.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Ethylene.getCells(1))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SulfuricAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Ethylene.getCells(1))
+ .fluidInputs(Materials.Ethanol.getFluid(1000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethanol.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.DilutedSulfuricAcid.getCells(1))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Ethylene.getGas(1000))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SulfuricAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.DilutedSulfuricAcid.getCells(1))
+ .fluidInputs(Materials.Ethanol.getFluid(1000))
+ .fluidOutputs(Materials.Ethylene.getGas(1000))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // H2O + Na = NaOH + H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Sodium.getDust(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.SodiumHydroxide.getDust(3))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // H + Cl = HCl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(3 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Hydrogen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(3 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(1000))
+ .duration(3 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Hydrogen.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(1000))
+ .duration(3 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ // C3H6 + 2Cl = HCl + C3H5Cl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Propene.getGas(1000))
+ .fluidOutputs(Materials.AllylChloride.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Propene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(2000))
+ .fluidOutputs(Materials.AllylChloride.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.AllylChloride.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Propene.getGas(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Propene.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.AllylChloride.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(2000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // 2Cl + H2O = HCl + HClO (Intended loss)
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.DilutedHydrochloricAcid.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.HypochlorousAcid.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.DilutedHydrochloricAcid.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(2000))
+ .fluidOutputs(Materials.HypochlorousAcid.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.HypochlorousAcid.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.HypochlorousAcid.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(2000))
+ .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // HClO + NaOH + C3H5Cl = C3H5ClO + NaCl·H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HypochlorousAcid.getCells(1), Materials.SodiumHydroxide.getDust(3))
+ .itemOutputs(Materials.SaltWater.getCells(1))
+ .fluidInputs(Materials.AllylChloride.getFluid(1000))
+ .fluidOutputs(Materials.Epichlorohydrin.getFluid(1000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(3), Materials.AllylChloride.getCells(1))
+ .itemOutputs(Materials.SaltWater.getCells(1))
+ .fluidInputs(Materials.HypochlorousAcid.getFluid(1000))
+ .fluidOutputs(Materials.Epichlorohydrin.getFluid(1000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrochloricAcid.getCells(1), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.Water.getCells(2))
+ .fluidInputs(Materials.Glycerol.getFluid(1000))
+ .fluidOutputs(Materials.Epichlorohydrin.getFluid(1000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Glycerol.getCells(1), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.Water.getCells(2))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Epichlorohydrin.getFluid(1000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Epichlorohydrin.getCells(1))
+ .fluidInputs(Materials.Glycerol.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(2000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Glycerol.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Epichlorohydrin.getCells(1))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(2000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Glycerol.getFluid(1000))
+ .fluidOutputs(Materials.Epichlorohydrin.getFluid(1000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Glycerol.getCells(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Epichlorohydrin.getFluid(1000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Epichlorohydrin.getCells(1))
+ .fluidInputs(Materials.Glycerol.getFluid(1000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Glycerol.getCells(1), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Epichlorohydrin.getCells(1))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // P4O10 + 6H2O = 4H3PO4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.PhosphorousPentoxide.getDust(14))
+ .fluidInputs(Materials.Water.getFluid(6000))
+ .fluidOutputs(Materials.PhosphoricAcid.getFluid(4000))
+ .duration(2 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // C9H12 + 2O = C6H6O + C3H6O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Cumene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Phenol.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(2000))
+ .fluidOutputs(Materials.Acetone.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Phenol.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Cumene.getFluid(1000))
+ .fluidOutputs(Materials.Acetone.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Cumene.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Acetone.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(2000))
+ .fluidOutputs(Materials.Phenol.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(2), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Acetone.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Cumene.getFluid(1000))
+ .fluidOutputs(Materials.Phenol.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // C15H16O2 + 2C3H5ClO + 2NaOH = C15H14O2(C3H5O)2 + 2NaCl·H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(6), Materials.Epichlorohydrin.getCells(2))
+ .itemOutputs(Materials.SaltWater.getCells(2))
+ .fluidInputs(Materials.BisphenolA.getFluid(1000))
+ .fluidOutputs(Materials.Epoxid.getMolten(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // CH4O + HCl = CH3Cl + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Water.getCells(1))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Chloromethane.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Water.getCells(1))
+ .fluidInputs(Materials.Methanol.getFluid(1000))
+ .fluidOutputs(Materials.Chloromethane.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Chloromethane.getCells(1))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Chloromethane.getCells(1))
+ .fluidInputs(Materials.Methanol.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Chloromethane.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Methanol.getFluid(1000))
+ .fluidOutputs(Materials.Chloromethane.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(1), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Chloromethane.getCells(1))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Chloromethane.getCells(1))
+ .fluidInputs(Materials.Methanol.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Methane.getGas(1000))
+ .fluidOutputs(Materials.Chloromethane.getGas(1000))
+ .duration(4 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methane.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(2000))
+ .fluidOutputs(Materials.Chloromethane.getGas(1000))
+ .duration(4 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Chloromethane.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Methane.getGas(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(4 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methane.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Chloromethane.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(2000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(4 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // Cl6 + CH4 = CHCl3 + 3HCl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(6), GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(3), Materials.Empty.getCells(3))
+ .fluidInputs(Materials.Methane.getGas(1000))
+ .fluidOutputs(Materials.Chloroform.getFluid(1000))
+ .duration(4 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(6), GT_Utility.getIntegratedCircuit(13))
+ .itemOutputs(Materials.Chloroform.getCells(1), Materials.Empty.getCells(5))
+ .fluidInputs(Materials.Methane.getGas(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(3000))
+ .duration(4 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methane.getCells(1), GT_Utility.getIntegratedCircuit(13))
+ .itemOutputs(Materials.Chloroform.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(6000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(3000))
+ .duration(4 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // H + F = HF
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Fluorine.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(1000))
+ .fluidOutputs(Materials.HydrofluoricAcid.getFluid(1000))
+ .duration(3 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Hydrogen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Fluorine.getGas(1000))
+ .fluidOutputs(Materials.HydrofluoricAcid.getFluid(1000))
+ .duration(3 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Fluorine.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.HydrofluoricAcid.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(1000))
+ .duration(3 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Hydrogen.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.HydrofluoricAcid.getCells(1))
+ .fluidInputs(Materials.Fluorine.getGas(1000))
+ .duration(3 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ // 4HF + 2CHCl3 = C2F4 + 6HCl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chloroform.getCells(2), Materials.HydrofluoricAcid.getCells(4))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(6))
+ .fluidOutputs(Materials.Tetrafluoroethylene.getGas(1000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chloroform.getCells(2), Materials.Empty.getCells(4))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(6))
+ .fluidInputs(Materials.HydrofluoricAcid.getFluid(4000))
+ .fluidOutputs(Materials.Tetrafluoroethylene.getGas(1000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrofluoricAcid.getCells(4), Materials.Empty.getCells(2))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(6))
+ .fluidInputs(Materials.Chloroform.getFluid(2000))
+ .fluidOutputs(Materials.Tetrafluoroethylene.getGas(1000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrofluoricAcid.getCells(4), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Tetrafluoroethylene.getCells(1), Materials.Empty.getCells(3))
+ .fluidInputs(Materials.Chloroform.getFluid(2000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(6000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chloroform.getCells(2), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Tetrafluoroethylene.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.HydrofluoricAcid.getFluid(4000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(6000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // Si + 2CH3Cl = C2H6Cl2Si
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Silicon.getDust(1), GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Chloromethane.getGas(2000))
+ .fluidOutputs(Materials.Dimethyldichlorosilane.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Dimethyldichlorosilane.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Polydimethylsiloxane.getDust(3), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Polydimethylsiloxane.getDust(3), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Dimethyldichlorosilane.getFluid(1000))
+ .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Dimethyldichlorosilane.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Polydimethylsiloxane.getDust(3), Materials.DilutedHydrochloricAcid.getCells(1))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Polydimethylsiloxane.getDust(3), Materials.DilutedHydrochloricAcid.getCells(1))
+ .fluidInputs(Materials.Dimethyldichlorosilane.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(96)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Polydimethylsiloxane.getDust(9), Materials.Sulfur.getDust(1))
+ .fluidOutputs(Materials.Silicone.getMolten(1296))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // Potassium Nitride
+ // K + HNO3 = KNO3 + H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Potassium.getDust(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.PotassiumNitrade.getDust(5))
+ .fluidInputs(Materials.NitricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(1000))
+ .duration(5 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // Chromium Trioxide
+ // CrO2 + O = CrO3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.ChromiumDioxide.getDust(3), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.ChromiumTrioxide.getDust(4))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // Nitrochlorobenzene
+ // C6H5Cl + HNO3 = C6H4ClNO2 + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorobenzene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Nitrochlorobenzene.getCells(1))
+ .fluidInputs(Materials.NitrationMixture.getFluid(2000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorobenzene.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.DilutedSulfuricAcid.getCells(1))
+ .fluidInputs(Materials.NitrationMixture.getFluid(2000))
+ .fluidOutputs(Materials.Nitrochlorobenzene.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitrationMixture.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Nitrochlorobenzene.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Chlorobenzene.getFluid(1000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitrationMixture.getCells(2), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.DilutedSulfuricAcid.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Chlorobenzene.getFluid(1000))
+ .fluidOutputs(Materials.Nitrochlorobenzene.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ // C6H6 + 2CH4 = C8H10 + 4H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methane.getCells(2), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Dimethylbenzene.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Benzene.getFluid(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(4000))
+ .duration(3 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Benzene.getCells(1), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Dimethylbenzene.getCells(1))
+ .fluidInputs(Materials.Methane.getGas(2000))
+ .fluidOutputs(Materials.Hydrogen.getGas(4000))
+ .duration(3 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // Phthalic Acid
+ // C8H10 + 6O =K2Cr2O7= C8H6O4 + 2H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Dimethylbenzene.getCells(1), Materials.Potassiumdichromate.getDustTiny(1))
+ .itemOutputs(Materials.PhthalicAcid.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(6000))
+ .fluidOutputs(Materials.Water.getFluid(2000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(6), Materials.Potassiumdichromate.getDustTiny(1))
+ .itemOutputs(Materials.PhthalicAcid.getCells(1), ItemList.Cell_Empty.get(5))
+ .fluidInputs(Materials.Dimethylbenzene.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(2000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Dimethylbenzene.getCells(9), Materials.Potassiumdichromate.getDust(1))
+ .itemOutputs(Materials.PhthalicAcid.getCells(9))
+ .fluidInputs(Materials.Oxygen.getGas(54000))
+ .fluidOutputs(Materials.Water.getFluid(18000))
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(54), Materials.Potassiumdichromate.getDust(1))
+ .itemOutputs(Materials.PhthalicAcid.getCells(9), ItemList.Cell_Empty.get(45))
+ .fluidInputs(Materials.Dimethylbenzene.getFluid(9000))
+ .fluidOutputs(Materials.Water.getFluid(18000))
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(UniversalChemical);
+
+ // These following recipes are broken in element term.
+ // But they are kept in gamewise, too much existed setup will be broken.
+ // Dichlorobenzidine
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Copper.getDustTiny(1), GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Nitrochlorobenzene.getFluid(2000))
+ .fluidOutputs(Materials.Dichlorobenzidine.getFluid(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Copper.getDust(1), GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(Materials.Nitrochlorobenzene.getFluid(18000))
+ .fluidOutputs(Materials.Dichlorobenzidine.getFluid(9000))
+ .duration(1 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(UniversalChemical);
+
+ // Diphenyl Isophthalate
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.PhthalicAcid.getCells(1), Materials.SulfuricAcid.getCells(1))
+ .itemOutputs(Materials.Diphenylisophthalate.getCells(1), ItemList.Cell_Empty.get(1))
+ .fluidInputs(Materials.Phenol.getFluid(2000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.PhthalicAcid.getCells(1), Materials.Phenol.getCells(2))
+ .itemOutputs(Materials.Diphenylisophthalate.getCells(1), ItemList.Cell_Empty.get(2))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SulfuricAcid.getCells(1), Materials.Phenol.getCells(2))
+ .itemOutputs(Materials.Diphenylisophthalate.getCells(1), ItemList.Cell_Empty.get(2))
+ .fluidInputs(Materials.PhthalicAcid.getFluid(1000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(UniversalChemical);
+
+ // Diaminobenzidin
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ammonia.getCells(2), Materials.Zinc.getDust(1))
+ .itemOutputs(Materials.Diaminobenzidin.getCells(1), ItemList.Cell_Empty.get(1))
+ .fluidInputs(Materials.Dichlorobenzidine.getFluid(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(2000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(UniversalChemical);
+
+ // Polybenzimidazole
+ // C12H14N4 + C20H14O4 = C20H12N4 + 2C6H6O + 2H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Diphenylisophthalate.getCells(1), Materials.Diaminobenzidin.getCells(1))
+ .itemOutputs(Materials.Phenol.getCells(2))
+ .fluidOutputs(Materials.Polybenzimidazole.getMolten(1000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 1))
+ .itemOutputs(getModItem(Railcraft.ID, "glass", 6))
+ .fluidInputs(Materials.Glass.getMolten(864))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // NH3 + 2CH4O = C2H7N + 2H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Water.getCells(2))
+ .fluidInputs(Materials.Ammonia.getGas(1000))
+ .fluidOutputs(Materials.Dimethylamine.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(2), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Dimethylamine.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Ammonia.getGas(1000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ammonia.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Dimethylamine.getCells(1))
+ .fluidInputs(Materials.Methanol.getFluid(2000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(2), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(2))
+ .fluidInputs(Materials.Ammonia.getGas(1000))
+ .fluidOutputs(Materials.Dimethylamine.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(2), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Dimethylamine.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Ammonia.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ammonia.getCells(1), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Dimethylamine.getCells(1))
+ .fluidInputs(Materials.Methanol.getFluid(2000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // NH3 + HClO = NH2Cl + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ammonia.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Water.getCells(1))
+ .fluidInputs(Materials.HypochlorousAcid.getFluid(1000))
+ .fluidOutputs(Materials.Chloramine.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HypochlorousAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Water.getCells(1))
+ .fluidInputs(Materials.Ammonia.getGas(1000))
+ .fluidOutputs(Materials.Chloramine.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ammonia.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Chloramine.getCells(1))
+ .fluidInputs(Materials.HypochlorousAcid.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HypochlorousAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Chloramine.getCells(1))
+ .fluidInputs(Materials.Ammonia.getGas(1000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ammonia.getCells(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.HypochlorousAcid.getFluid(1000))
+ .fluidOutputs(Materials.Chloramine.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HypochlorousAcid.getCells(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Ammonia.getGas(1000))
+ .fluidOutputs(Materials.Chloramine.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ammonia.getCells(1), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Chloramine.getCells(1))
+ .fluidInputs(Materials.HypochlorousAcid.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HypochlorousAcid.getCells(1), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Chloramine.getCells(1))
+ .fluidInputs(Materials.Ammonia.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // 2NO2 = N2O4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.NitrogenDioxide.getGas(2000))
+ .fluidOutputs(Materials.DinitrogenTetroxide.getGas(1000))
+ .duration(32 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitrogenDioxide.getCells(2), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(2))
+ .fluidOutputs(Materials.DinitrogenTetroxide.getGas(1000))
+ .duration(32 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitrogenDioxide.getCells(2), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.DinitrogenTetroxide.getCells(1), Materials.Empty.getCells(1))
+ .duration(32 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // 2NH3 + 5O = 2NO + 3H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ammonia.getCells(4), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.NitricOxide.getCells(4))
+ .fluidInputs(Materials.Oxygen.getGas(10000))
+ .fluidOutputs(Materials.Water.getFluid(6000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(10), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.NitricOxide.getCells(4), Materials.Empty.getCells(6))
+ .fluidInputs(Materials.Ammonia.getGas(4000))
+ .fluidOutputs(Materials.Water.getFluid(6000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(10), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Water.getCells(6), Materials.Empty.getCells(4))
+ .fluidInputs(Materials.Ammonia.getGas(4000))
+ .fluidOutputs(Materials.NitricOxide.getGas(4000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ammonia.getCells(4), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.NitricOxide.getCells(4))
+ .fluidInputs(Materials.Oxygen.getGas(10000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(10), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.NitricOxide.getCells(4), Materials.Empty.getCells(6))
+ .fluidInputs(Materials.Ammonia.getGas(4000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(10), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Empty.getCells(10))
+ .fluidInputs(Materials.Ammonia.getGas(4000))
+ .fluidOutputs(Materials.NitricOxide.getGas(4000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // NO + O = NO2
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitricOxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.NitrogenDioxide.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.NitricOxide.getGas(1000))
+ .fluidOutputs(Materials.NitrogenDioxide.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitricOxide.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.NitrogenDioxide.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.NitrogenDioxide.getCells(1))
+ .fluidInputs(Materials.NitricOxide.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // H2O + 3NO2 = 2HNO3 + NO
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.NitricOxide.getCells(1))
+ .fluidInputs(Materials.NitrogenDioxide.getGas(3000))
+ .fluidOutputs(Materials.NitricAcid.getFluid(2000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitrogenDioxide.getCells(3), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.NitricOxide.getCells(1), Materials.Empty.getCells(2))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.NitricAcid.getFluid(2000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitrogenDioxide.getCells(3), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.NitricAcid.getCells(2), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.NitricOxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // S + 2H = H2S
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Sulfur.getDust(1), GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Hydrogen.getGas(2000))
+ .fluidOutputs(Materials.HydricSulfide.getGas(1000))
+ .duration(3 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ // S + 2O = SO2
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Sulfur.getDust(1), GT_Utility.getIntegratedCircuit(3))
+ .fluidInputs(Materials.Oxygen.getGas(2000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
+ .duration(3 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ // H2S + 3O = SO2 + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydricSulfide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Water.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(3), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(2))
+ .fluidInputs(Materials.HydricSulfide.getGas(1000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydricSulfide.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.SulfurDioxide.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(3), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.SulfurDioxide.getCells(1), Materials.Empty.getCells(2))
+ .fluidInputs(Materials.HydricSulfide.getGas(1000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydricSulfide.getCells(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(3), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Empty.getCells(3))
+ .fluidInputs(Materials.HydricSulfide.getGas(1000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydricSulfide.getCells(1), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.SulfurDioxide.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(3), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.SulfurDioxide.getCells(1), Materials.Empty.getCells(2))
+ .fluidInputs(Materials.HydricSulfide.getGas(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // 2H2S + SO2 = 3S + 2H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SulfurDioxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Sulfur.getDust(3), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.HydricSulfide.getGas(2000))
+ .fluidOutputs(Materials.Water.getFluid(2000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydricSulfide.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Sulfur.getDust(3), Materials.Empty.getCells(2))
+ .fluidInputs(Materials.SulfurDioxide.getGas(1000))
+ .fluidOutputs(Materials.Water.getFluid(2000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SulfurDioxide.getCells(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Sulfur.getDust(3), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.HydricSulfide.getGas(2000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydricSulfide.getCells(2), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Sulfur.getDust(3), Materials.Empty.getCells(2))
+ .fluidInputs(Materials.SulfurDioxide.getGas(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // SO2 + O = SO3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.SulfurDioxide.getGas(1000))
+ .fluidOutputs(Materials.SulfurTrioxide.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SulfurDioxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.SulfurTrioxide.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.SulfurTrioxide.getCells(1))
+ .fluidInputs(Materials.SulfurDioxide.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SulfurDioxide.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.SulfurTrioxide.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // SO3 + H2O = H2SO4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.SulfurTrioxide.getGas(1000))
+ .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
+ .duration(16 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SulfurTrioxide.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
+ .duration(16 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.SulfuricAcid.getCells(1))
+ .fluidInputs(Materials.SulfurTrioxide.getGas(1000))
+ .duration(16 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SulfurTrioxide.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.SulfuricAcid.getCells(1))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .duration(16 * SECONDS)
+ .eut(8)
+ .addTo(UniversalChemical);
+
+ // C2H4 + 2Cl = C2H3Cl + HCl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Ethylene.getGas(1000))
+ .fluidOutputs(Materials.VinylChloride.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethylene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(2000))
+ .fluidOutputs(Materials.VinylChloride.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.VinylChloride.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Ethylene.getGas(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethylene.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.VinylChloride.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(2000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // C2H4O2 =H2SO4= C2H2O + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.AceticAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Ethenone.getCells(1))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SulfuricAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Ethenone.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(1000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.AceticAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.DilutedSulfuricAcid.getCells(1))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Ethenone.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SulfuricAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.DilutedSulfuricAcid.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(1000))
+ .fluidOutputs(Materials.Ethenone.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // C2H2O + 8HNO3 = 2CN4O8 + 9H2O
+ // Chemically this recipe is wrong, but kept for minimizing breaking change.
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethenone.getCells(1), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.Tetranitromethane.getCells(2))
+ .fluidInputs(Materials.NitricAcid.getFluid(8000))
+ .fluidOutputs(Materials.Water.getFluid(9000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethenone.getCells(1), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.NitricAcid.getFluid(8000))
+ .fluidOutputs(Materials.Tetranitromethane.getFluid(2000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitricAcid.getCells(8), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Tetranitromethane.getCells(2), Materials.Empty.getCells(6))
+ .fluidInputs(Materials.Ethenone.getGas(1000))
+ .fluidOutputs(Materials.Water.getFluid(9000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitricAcid.getCells(8), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Tetranitromethane.getCells(2), Materials.Empty.getCells(6))
+ .fluidInputs(Materials.Ethenone.getGas(1000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitricAcid.getCells(8), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.Empty.getCells(8))
+ .fluidInputs(Materials.Ethenone.getGas(1000))
+ .fluidOutputs(Materials.Tetranitromethane.getFluid(2000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitricAcid.getCells(8), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.Water.getCells(9))
+ .fluidInputs(Materials.Ethenone.getGas(1000))
+ .fluidOutputs(Materials.Tetranitromethane.getFluid(2000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethenone.getCells(1), Materials.NitricAcid.getCells(8))
+ .itemOutputs(Materials.Water.getCells(9))
+ .fluidOutputs(Materials.Tetranitromethane.getFluid(2000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+
+ // C3H6 + C2H4 = C5H8 + 2H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Propene.getCells(1), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.Hydrogen.getCells(2))
+ .fluidInputs(Materials.Ethylene.getGas(1000))
+ .fluidOutputs(Materials.Isoprene.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethylene.getCells(1), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.Hydrogen.getCells(2))
+ .fluidInputs(Materials.Propene.getGas(1000))
+ .fluidOutputs(Materials.Isoprene.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Propene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Isoprene.getCells(1))
+ .fluidInputs(Materials.Ethylene.getGas(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(2000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethylene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Isoprene.getCells(1))
+ .fluidInputs(Materials.Propene.getGas(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(2000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(Materials.Methane.getCells(1))
+ .fluidInputs(Materials.Propene.getGas(2000))
+ .fluidOutputs(Materials.Isoprene.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Propene.getCells(2), GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(Materials.Methane.getCells(1), Materials.Empty.getCells(1))
+ .fluidOutputs(Materials.Isoprene.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(15))
+ .itemOutputs(Materials.Isoprene.getCells(1))
+ .fluidInputs(Materials.Propene.getGas(2000))
+ .fluidOutputs(Materials.Methane.getGas(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Propene.getCells(2), GT_Utility.getIntegratedCircuit(15))
+ .itemOutputs(Materials.Isoprene.getCells(1), Materials.Empty.getCells(1))
+ .fluidOutputs(Materials.Methane.getGas(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Cell_Air.get(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.RawRubber.getDust(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Isoprene.getFluid(144))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.RawRubber.getDust(3), Materials.Empty.getCells(2))
+ .fluidInputs(Materials.Isoprene.getFluid(288))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Isoprene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.RawRubber.getDust(7), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Air.getGas(14000))
+ .duration(56 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Isoprene.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.RawRubber.getDust(21), Materials.Empty.getCells(2))
+ .fluidInputs(Materials.Oxygen.getGas(14000))
+ .duration(1 * MINUTES + 52 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Benzene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Styrene.getCells(1))
+ .fluidInputs(Materials.Ethylene.getGas(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(2000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethylene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Styrene.getCells(1))
+ .fluidInputs(Materials.Benzene.getFluid(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(2000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.RawStyreneButadieneRubber.getDust(9), Materials.Sulfur.getDust(1))
+ .fluidOutputs(Materials.StyreneButadieneRubber.getMolten(1296))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // C6H6 + 4Cl = C6H4Cl2 + 2HCl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Benzene.getCells(1), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Dichlorobenzene.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(4000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(2000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(4), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Dichlorobenzene.getCells(1), Materials.Empty.getCells(3))
+ .fluidInputs(Materials.Benzene.getFluid(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(2000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(4), GT_Utility.getIntegratedCircuit(12))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(2), Materials.Empty.getCells(2))
+ .fluidInputs(Materials.Benzene.getFluid(1000))
+ .fluidOutputs(Materials.Dichlorobenzene.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumSulfide.getDust(3), ItemList.Cell_Air.get(8))
+ .itemOutputs(Materials.Salt.getDust(4), Materials.Empty.getCells(8))
+ .fluidInputs(Materials.Dichlorobenzene.getFluid(1000))
+ .fluidOutputs(Materials.PolyphenyleneSulfide.getMolten(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumSulfide.getDust(3), Materials.Oxygen.getCells(8))
+ .itemOutputs(Materials.Salt.getDust(4), Materials.Empty.getCells(8))
+ .fluidInputs(Materials.Dichlorobenzene.getFluid(1000))
+ .fluidOutputs(Materials.PolyphenyleneSulfide.getMolten(1500))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ // NaCl + H2SO4 = NaHSO4 + HCl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Salt.getDust(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.SodiumBisulfate.getDust(7))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(3 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // NaOH + H2SO4 = NaHSO4 + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(3), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.SodiumBisulfate.getDust(7))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(3 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // Biodiesel recipes
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.Methanol.getCells(1))
+ .itemOutputs(Materials.Glycerol.getCells(1))
+ .fluidInputs(Materials.SeedOil.getFluid(6000))
+ .fluidOutputs(Materials.BioDiesel.getFluid(6000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.SeedOil.getCells(6))
+ .itemOutputs(Materials.BioDiesel.getCells(6))
+ .fluidInputs(Materials.Methanol.getFluid(1000))
+ .fluidOutputs(Materials.Glycerol.getFluid(1000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.Methanol.getCells(1))
+ .itemOutputs(Materials.Glycerol.getCells(1))
+ .fluidInputs(Materials.FishOil.getFluid(6000))
+ .fluidOutputs(Materials.BioDiesel.getFluid(6000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.FishOil.getCells(6))
+ .itemOutputs(Materials.BioDiesel.getCells(6))
+ .fluidInputs(Materials.Methanol.getFluid(1000))
+ .fluidOutputs(Materials.Glycerol.getFluid(1000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.Ethanol.getCells(1))
+ .itemOutputs(Materials.Glycerol.getCells(1))
+ .fluidInputs(Materials.SeedOil.getFluid(6000))
+ .fluidOutputs(Materials.BioDiesel.getFluid(6000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.SeedOil.getCells(6))
+ .itemOutputs(Materials.BioDiesel.getCells(6))
+ .fluidInputs(Materials.Ethanol.getFluid(1000))
+ .fluidOutputs(Materials.Glycerol.getFluid(1000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.Ethanol.getCells(1))
+ .itemOutputs(Materials.Glycerol.getCells(1))
+ .fluidInputs(Materials.FishOil.getFluid(6000))
+ .fluidOutputs(Materials.BioDiesel.getFluid(6000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDustTiny(1), Materials.FishOil.getCells(6))
+ .itemOutputs(Materials.BioDiesel.getCells(6))
+ .fluidInputs(Materials.Ethanol.getFluid(1000))
+ .fluidOutputs(Materials.Glycerol.getFluid(1000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.Methanol.getCells(9))
+ .itemOutputs(Materials.Glycerol.getCells(9))
+ .fluidInputs(Materials.SeedOil.getFluid(54000))
+ .fluidOutputs(Materials.BioDiesel.getFluid(54000))
+ .duration(4 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.SeedOil.getCells(54))
+ .itemOutputs(Materials.BioDiesel.getCells(54))
+ .fluidInputs(Materials.Methanol.getFluid(9000))
+ .fluidOutputs(Materials.Glycerol.getFluid(9000))
+ .duration(4 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.Methanol.getCells(9))
+ .itemOutputs(Materials.Glycerol.getCells(9))
+ .fluidInputs(Materials.FishOil.getFluid(54000))
+ .fluidOutputs(Materials.BioDiesel.getFluid(54000))
+ .duration(4 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.FishOil.getCells(54))
+ .itemOutputs(Materials.BioDiesel.getCells(54))
+ .fluidInputs(Materials.Methanol.getFluid(9000))
+ .fluidOutputs(Materials.Glycerol.getFluid(9000))
+ .duration(4 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.Ethanol.getCells(9))
+ .itemOutputs(Materials.Glycerol.getCells(9))
+ .fluidInputs(Materials.SeedOil.getFluid(54000))
+ .fluidOutputs(Materials.BioDiesel.getFluid(54000))
+ .duration(4 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.SeedOil.getCells(54))
+ .itemOutputs(Materials.BioDiesel.getCells(54))
+ .fluidInputs(Materials.Ethanol.getFluid(9000))
+ .fluidOutputs(Materials.Glycerol.getFluid(9000))
+ .duration(4 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.Ethanol.getCells(9))
+ .itemOutputs(Materials.Glycerol.getCells(9))
+ .fluidInputs(Materials.FishOil.getFluid(54000))
+ .fluidOutputs(Materials.BioDiesel.getFluid(54000))
+ .duration(4 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(1), Materials.FishOil.getCells(54))
+ .itemOutputs(Materials.BioDiesel.getCells(54))
+ .fluidInputs(Materials.Ethanol.getFluid(9000))
+ .fluidOutputs(Materials.Glycerol.getFluid(9000))
+ .duration(4 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // C3H8O3 + 3HNO3 =H2SO4= C3H5N3O9 + 3H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Glycerol.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Glyceryl.getCells(1))
+ .fluidInputs(Materials.NitrationMixture.getFluid(6000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(3000))
+ .duration(9 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitrationMixture.getCells(6), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Glyceryl.getCells(1), Materials.Empty.getCells(5))
+ .fluidInputs(Materials.Glycerol.getFluid(1000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(3000))
+ .duration(9 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitrationMixture.getCells(6), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.DilutedSulfuricAcid.getCells(3), Materials.Empty.getCells(3))
+ .fluidInputs(Materials.Glycerol.getFluid(1000))
+ .fluidOutputs(Materials.Glyceryl.getFluid(1000))
+ .duration(9 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // CaO + CO2 = CaCO3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Quicklime.getDust(2))
+ .itemOutputs(Materials.Calcite.getDust(5))
+ .fluidInputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(4 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Calcite.getDust(5), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Quicklime.getDust(2))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // MgO + CO2 = MgCO3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Magnesia.getDust(2))
+ .itemOutputs(Materials.Magnesite.getDust(5))
+ .fluidInputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(4 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Magnesite.getDust(5), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Magnesia.getDust(2))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // C6H6 + 2Cl = C6H5Cl + HCl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Benzene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Chlorobenzene.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(2000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Chlorobenzene.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Benzene.getFluid(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(2), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Benzene.getFluid(1000))
+ .fluidOutputs(Materials.Chlorobenzene.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // C6H5Cl + H2O = C6H6O + HCl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.DilutedHydrochloricAcid.getCells(1))
+ .fluidInputs(Materials.Chlorobenzene.getFluid(1000))
+ .fluidOutputs(Materials.Phenol.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorobenzene.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.DilutedHydrochloricAcid.getCells(1))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.Phenol.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Water.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Phenol.getCells(1))
+ .fluidInputs(Materials.Chlorobenzene.getFluid(1000))
+ .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorobenzene.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Phenol.getCells(1))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // C6H5Cl + NaOH = C6H6O + NaCl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(12), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Salt.getDust(8))
+ .fluidInputs(Materials.Chlorobenzene.getFluid(4000))
+ .fluidOutputs(Materials.Phenol.getFluid(4000))
+ .duration(48 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ // Oxide Recipe
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2), Materials.Antimony.getDust(2))
+ .itemOutputs(Materials.AntimonyTrioxide.getDust(5))
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .duration(20 * TICKS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2), Materials.Lead.getDust(1))
+ .itemOutputs(Materials.Massicot.getDust(2))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .duration(20 * TICKS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2), Materials.Arsenic.getDust(2))
+ .itemOutputs(Materials.ArsenicTrioxide.getDust(5))
+ .fluidInputs(Materials.Oxygen.getGas(3000))
+ .duration(20 * TICKS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2), Materials.Cobalt.getDust(1))
+ .itemOutputs(Materials.CobaltOxide.getDust(2))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .duration(20 * TICKS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2), Materials.Zinc.getDust(1))
+ .itemOutputs(Materials.Zincite.getDust(2))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .duration(20 * TICKS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ if (BartWorks.isModLoaded()) {
+ // CaSi2 + 2HCl = 2Si + CaCl2 + 2H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CalciumDisilicide, 3),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 2),
+ getModItem(BartWorks.ID, "gt.bwMetaGenerateddust", 3L, 63))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(2000))
+ .fluidOutputs(Materials.Hydrogen.getGas(2000))
+ .duration(45 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // SiCl4 + 2Zn = 2ZnCl2 + Si
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1),
+ getModItem(BartWorks.ID, "gt.bwMetaGenerateddust", 6L, 10052))
+ .fluidInputs(Materials.SiliconTetrachloride.getFluid(1000))
+ .duration(20 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+ }
+
+ if (GTNHLanthanides.isModLoaded() && GTPlusPlus.isModLoaded()) {
+
+ // C4H8O + 2H =Pd= C4H10O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.Butyraldehyde, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Palladium, 1))
+ .itemOutputs(ItemList.Cell_Empty.get(1))
+ .fluidInputs(Materials.Hydrogen.getGas(2000))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("butanol"), 1000))
+ .duration(10 * SECONDS)
+ .eut(30)
+ .addTo(UniversalChemical);
+
+ // 4CH2O + C2H4O =NaOH= C5H12O4 + CO
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(GTPlusPlus.ID, "Formaldehyde", 4),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.Pentaerythritol, 21),
+ Materials.Empty.getCells(4))
+ .fluidInputs(MaterialsKevlar.Acetaldehyde.getGas(1000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ // 4CH2O + C2H4O =NaOH= C5H12O4 + CO
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.Acetaldehyde, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.Pentaerythritol, 21),
+ Materials.Empty.getCells(1))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("fluid.formaldehyde"), 4000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(1000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ // CaC2 + 2H2O = Ca(OH)2 + C2H2
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CalciumCarbide, 3),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(GTPlusPlus.ID, "itemDustCalciumHydroxide", 5))
+ .fluidInputs(Materials.Water.getFluid(2000))
+ .fluidOutputs(MaterialsKevlar.Acetylene.getGas(1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(UniversalChemical);
+
+ // Co(NO3)2 + 2NaOH = Co(OH)2 + 2NaNO3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ MaterialsKevlar.CobaltIINitrate.getDust(9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SodiumHydroxide, 6))
+ .itemOutputs(
+ MaterialsKevlar.CobaltIIHydroxide.getDust(5),
+ getModItem(GTPlusPlus.ID, "itemDustSodiumNitrate", 10))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(UniversalChemical);
+ }
+ }
+
+ public void addDefaultPolymerizationRecipes(Fluid aBasicMaterial, ItemStack aBasicMaterialCell, Fluid aPolymer) {
+ // Oxygen/Titaniumtetrafluoride -> +50% Output each
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Cell_Air.get(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(new FluidStack(aBasicMaterial, 144))
+ .fluidOutputs(new FluidStack(aPolymer, 144))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(new FluidStack(aBasicMaterial, 144))
+ .fluidOutputs(new FluidStack(aPolymer, 216))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aBasicMaterialCell, GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Air.getGas(14000))
+ .fluidOutputs(new FluidStack(aPolymer, 1000))
+ .duration(56 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(aBasicMaterialCell, GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(7000))
+ .fluidOutputs(new FluidStack(aPolymer, 1500))
+ .duration(56 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(
+ new FluidStack(aBasicMaterial, 2160),
+ Materials.Air.getGas(7500),
+ Materials.Titaniumtetrachloride.getFluid(100))
+ .fluidOutputs(new FluidStack(aPolymer, 3240))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(
+ new FluidStack(aBasicMaterial, 2160),
+ Materials.Oxygen.getGas(7500),
+ Materials.Titaniumtetrachloride.getFluid(100))
+ .fluidOutputs(new FluidStack(aPolymer, 4320))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ }
+
+ public void polymerizationRecipes() {
+ addDefaultPolymerizationRecipes(
+ Materials.VinylAcetate.mFluid,
+ Materials.VinylAcetate.getCells(1),
+ Materials.PolyvinylAcetate.mFluid);
+
+ addDefaultPolymerizationRecipes(
+ Materials.Ethylene.mGas,
+ Materials.Ethylene.getCells(1),
+ Materials.Plastic.mStandardMoltenFluid);
+
+ addDefaultPolymerizationRecipes(
+ Materials.Tetrafluoroethylene.mGas,
+ Materials.Tetrafluoroethylene.getCells(1),
+ Materials.Polytetrafluoroethylene.mStandardMoltenFluid);
+
+ addDefaultPolymerizationRecipes(
+ Materials.VinylChloride.mGas,
+ Materials.VinylChloride.getCells(1),
+ Materials.PolyvinylChloride.mStandardMoltenFluid);
+
+ addDefaultPolymerizationRecipes(
+ Materials.Styrene.mFluid,
+ Materials.Styrene.getCells(1),
+ Materials.Polystyrene.mStandardMoltenFluid);
+ }
+
+ public void singleBlockOnly() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.GasolineRaw.getCells(10), Materials.Toluene.getCells(1))
+ .itemOutputs(Materials.GasolineRegular.getCells(11))
+ .duration(10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Benzene.getCells(1), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.Hydrogen.getCells(2))
+ .fluidInputs(Materials.Ethylene.getGas(1000))
+ .fluidOutputs(Materials.Styrene.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethylene.getCells(1), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.Hydrogen.getCells(2))
+ .fluidInputs(Materials.Benzene.getFluid(1000))
+ .fluidOutputs(Materials.Styrene.getFluid(1000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methane.getCells(1), Materials.Empty.getCells(2))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(3))
+ .fluidInputs(Materials.Chlorine.getGas(6000))
+ .fluidOutputs(Materials.Chloroform.getFluid(1000))
+ .duration(4 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Silicon.getDust(1), Materials.Chloromethane.getCells(2))
+ .itemOutputs(Materials.Empty.getCells(2))
+ .fluidOutputs(Materials.Dimethyldichlorosilane.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(96)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Dimethyldichlorosilane.getCells(1), Materials.Water.getCells(1))
+ .itemOutputs(Materials.Polydimethylsiloxane.getDust(3), Materials.Empty.getCells(2))
+ .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(96)
+ .addTo(chemicalReactorRecipes);
+
+ // Ca5(PO4)3Cl + 5H2SO4 + 10H2O = 5CaSO4(H2O)2 + HCl + 3H3PO4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Apatite.getDust(9), Materials.SulfuricAcid.getCells(5))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(1), Materials.Empty.getCells(4))
+ .fluidInputs(Materials.Water.getFluid(10000))
+ .fluidOutputs(Materials.PhosphoricAcid.getFluid(3000))
+ .duration(16 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ // 10O + 4P = P4O10
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Phosphorus.getDust(4))
+ .itemOutputs(Materials.PhosphorousPentoxide.getDust(14))
+ .fluidInputs(Materials.Oxygen.getGas(10000))
+ .duration(2 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ // HCl + C3H8O3 = C3H5ClO + 2H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrochloricAcid.getCells(1), Materials.Glycerol.getCells(1))
+ .itemOutputs(Materials.Water.getCells(2))
+ .fluidOutputs(Materials.Epichlorohydrin.getFluid(1000))
+ .duration(24 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ // H2O + Cl =Hg= HClO + H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(10), Materials.Mercury.getCells(1))
+ .itemOutputs(Materials.Hydrogen.getCells(10), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Water.getFluid(10000))
+ .fluidOutputs(Materials.HypochlorousAcid.getFluid(10000))
+ .duration(30 * SECONDS)
+ .eut(8)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Water.getCells(10), Materials.Mercury.getCells(1))
+ .itemOutputs(Materials.Hydrogen.getCells(10), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Chlorine.getGas(10000))
+ .fluidOutputs(Materials.HypochlorousAcid.getFluid(10000))
+ .duration(30 * SECONDS)
+ .eut(8)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Chlorine.getCells(1), Materials.Water.getCells(1))
+ .itemOutputs(Materials.Hydrogen.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Mercury.getFluid(100))
+ .fluidOutputs(Materials.HypochlorousAcid.getFluid(1000))
+ .duration(3 * SECONDS)
+ .eut(8)
+ .addTo(chemicalReactorRecipes);
+
+ // P + 3Cl = PCl3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Phosphorus.getDust(1), Materials.Chlorine.getCells(3))
+ .itemOutputs(ItemList.Cell_Empty.get(3))
+ .fluidOutputs(MaterialsKevlar.PhosphorusTrichloride.getFluid(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.EthyleneOxide, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 5))
+ .itemOutputs(ItemList.Cell_Empty.get(6))
+ .fluidInputs(Materials.Dimethyldichlorosilane.getFluid(4000))
+ .fluidOutputs(MaterialsKevlar.SiliconOil.getFluid(5000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.EthyleneOxide, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Dimethyldichlorosilane, 4))
+ .itemOutputs(ItemList.Cell_Empty.get(5))
+ .fluidInputs(Materials.Water.getFluid(5000))
+ .fluidOutputs(MaterialsKevlar.SiliconOil.getFluid(5000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.Cell_Empty.get(1))
+ .fluidInputs(MaterialsKevlar.EthyleneOxide.getGas(1000))
+ .fluidOutputs(MaterialsKevlar.Ethyleneglycol.getFluid(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(MaterialsKevlar.CobaltIIHydroxide.getDust(5), MaterialsKevlar.NaphthenicAcid.getCells(1))
+ .itemOutputs(MaterialsKevlar.CobaltIINaphthenate.getDust(41), ItemList.Cell_Empty.get(1))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(MaterialsKevlar.CobaltIIAcetate.getDust(15), MaterialsKevlar.NaphthenicAcid.getCells(1))
+ .itemOutputs(MaterialsKevlar.CobaltIINaphthenate.getDust(41), ItemList.Cell_Empty.get(1))
+ .fluidOutputs(Materials.AceticAcid.getFluid(1500))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Chlorine, 4))
+ .itemOutputs(ItemList.Cell_Empty.get(4))
+ .fluidOutputs(Materials.SiliconTetrachloride.getFluid(1000))
+ .duration(20 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Galena, 3),
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Sphalerite, 1))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(4000))
+ .fluidOutputs(new FluidStack(ItemList.sIndiumConcentrate, 8000))
+ .duration(3 * SECONDS)
+ .eut(150)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Carbon.getDust(1), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.Methane.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(4000))
+ .duration(10 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ // O + 2H = H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(ItemList.Cell_Empty.get(1))
+ .fluidInputs(Materials.Hydrogen.getGas(2000))
+ .fluidOutputs(GT_ModHandler.getDistilledWater(1000))
+ .duration(10 * TICKS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 1),
+ GT_Utility.getIntegratedCircuit(22))
+ .itemOutputs(ItemList.Cell_Empty.get(1))
+ .fluidInputs(Materials.Oxygen.getGas(500))
+ .fluidOutputs(GT_ModHandler.getDistilledWater(500))
+ .duration(5 * TICKS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ // Si + 4Cl = SiCl4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1), ItemList.Cell_Empty.get(2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(3000))
+ .fluidOutputs(Materials.Trichlorosilane.getFluid(1000))
+ .duration(15 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Silane, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1), ItemList.Cell_Empty.get(1))
+ .fluidOutputs(Materials.Hydrogen.getGas(4000))
+ .duration(15 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Silane, 1), ItemList.Cell_Empty.get(3))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 4))
+ .duration(15 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ // S + 2Cl = SCl2
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 8),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Chlorine, 16))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.SulfurDichloride, 8),
+ ItemList.Cell_Empty.get(8))
+ .duration(40 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 8), ItemList.Cell_Empty.get(8))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsKevlar.SulfurDichloride, 8))
+ .fluidInputs(Materials.Chlorine.getGas(16000))
+ .duration(40 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ // C6H6 + C3H6 = C9H12
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Propene.getCells(8), Materials.PhosphoricAcid.getCells(1))
+ .itemOutputs(Materials.Empty.getCells(9))
+ .fluidInputs(Materials.Benzene.getFluid(8000))
+ .fluidOutputs(Materials.Cumene.getFluid(8000))
+ .duration(1 * MINUTES + 36 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.PhosphoricAcid.getCells(1), Materials.Benzene.getCells(8))
+ .itemOutputs(Materials.Empty.getCells(9))
+ .fluidInputs(Materials.Propene.getGas(8000))
+ .fluidOutputs(Materials.Cumene.getFluid(8000))
+ .duration(1 * MINUTES + 36 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Benzene.getCells(1), Materials.Propene.getCells(1))
+ .itemOutputs(Materials.Empty.getCells(2))
+ .fluidInputs(Materials.PhosphoricAcid.getFluid(125))
+ .fluidOutputs(Materials.Cumene.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ // C3H6O + 2C6H6O =HCl= C15H16O2 + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Acetone.getCells(1), Materials.Phenol.getCells(2))
+ .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(2))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(Materials.BisphenolA.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrochloricAcid.getCells(1), Materials.Acetone.getCells(1))
+ .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Phenol.getFluid(2000))
+ .fluidOutputs(Materials.BisphenolA.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Phenol.getCells(2), Materials.HydrochloricAcid.getCells(1))
+ .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(2))
+ .fluidInputs(Materials.Acetone.getFluid(1000))
+ .fluidOutputs(Materials.BisphenolA.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ // N + 3H = NH3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Nitrogen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(3000))
+ .fluidOutputs(Materials.Ammonia.getGas(1000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.HV * 3 / 4)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Hydrogen.getCells(3), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(3))
+ .fluidInputs(Materials.Nitrogen.getGas(1000))
+ .fluidOutputs(Materials.Ammonia.getGas(1000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.HV * 3 / 4)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Nitrogen.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Ammonia.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(3000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.HV * 3 / 4)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Hydrogen.getCells(3), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Ammonia.getCells(1), Materials.Empty.getCells(2))
+ .fluidInputs(Materials.Nitrogen.getGas(1000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.HV * 3 / 4)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ammonia.getCells(1), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.Water.getCells(2))
+ .fluidInputs(Materials.Methanol.getFluid(2000))
+ .fluidOutputs(Materials.Dimethylamine.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ammonia.getCells(4), Materials.Empty.getCells(2))
+ .itemOutputs(Materials.Water.getCells(6))
+ .fluidInputs(Materials.Oxygen.getGas(10000))
+ .fluidOutputs(Materials.NitricOxide.getGas(4000))
+ .duration(16 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.NitricAcid.getCells(2))
+ .fluidInputs(Materials.NitrogenDioxide.getGas(3000))
+ .fluidOutputs(Materials.NitricOxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ // 2NO2 + O + H2O = 2HNO3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.NitrogenDioxide.getCells(2), Materials.Oxygen.getCells(1))
+ .itemOutputs(Materials.Empty.getCells(3))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.NitricAcid.getFluid(2000))
+ .duration(12 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(1), Materials.Water.getCells(1))
+ .itemOutputs(Materials.Empty.getCells(2))
+ .fluidInputs(Materials.NitrogenDioxide.getGas(2000))
+ .fluidOutputs(Materials.NitricAcid.getFluid(2000))
+ .duration(12 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Water.getCells(1), Materials.NitrogenDioxide.getCells(2))
+ .itemOutputs(Materials.Empty.getCells(3))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.NitricAcid.getFluid(2000))
+ .duration(12 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Sulfur.getDust(1), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.HydricSulfide.getCells(1))
+ .fluidInputs(Materials.Hydrogen.getGas(2000))
+ .duration(3 * SECONDS)
+ .eut(8)
+ .addTo(chemicalReactorRecipes);
+
+ // C2H4 + HCl + O = C2H3Cl + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethylene.getCells(1), Materials.HydrochloricAcid.getCells(1))
+ .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.VinylChloride.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrochloricAcid.getCells(1), Materials.Oxygen.getCells(1))
+ .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Ethylene.getGas(1000))
+ .fluidOutputs(Materials.VinylChloride.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(1), Materials.Ethylene.getCells(1))
+ .itemOutputs(Materials.Water.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(Materials.VinylChloride.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Butadiene.getCells(1), ItemList.Cell_Air.get(5))
+ .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(9), Materials.Empty.getCells(6))
+ .fluidInputs(Materials.Styrene.getFluid(350))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Butadiene.getCells(1), Materials.Oxygen.getCells(5))
+ .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(13), Materials.Empty.getCells(6))
+ .fluidInputs(Materials.Styrene.getFluid(350))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Styrene.getCells(1), ItemList.Cell_Air.get(15))
+ .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(27), Materials.Empty.getCells(16))
+ .fluidInputs(Materials.Butadiene.getGas(3000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Styrene.getCells(1), Materials.Oxygen.getCells(15))
+ .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(41), Materials.Empty.getCells(16))
+ .fluidInputs(Materials.Butadiene.getGas(3000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Styrene.getCells(1), Materials.Butadiene.getCells(3))
+ .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(27), Materials.Empty.getCells(4))
+ .fluidInputs(Materials.Air.getGas(15000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Styrene.getCells(1), Materials.Butadiene.getCells(3))
+ .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(41), Materials.Empty.getCells(4))
+ .fluidInputs(Materials.Oxygen.getGas(15000))
+ .duration(24 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Benzene.getCells(1), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.HydrochloricAcid.getCells(2))
+ .fluidInputs(Materials.Chlorine.getGas(4000))
+ .fluidOutputs(Materials.Dichlorobenzene.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Glycerol.getCells(1), Materials.Empty.getCells(2))
+ .itemOutputs(Materials.DilutedSulfuricAcid.getCells(3))
+ .fluidInputs(Materials.NitrationMixture.getFluid(6000))
+ .fluidOutputs(Materials.Glyceryl.getFluid(1000))
+ .duration(9 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(12), Materials.Empty.getCells(4))
+ .itemOutputs(Materials.Salt.getDust(8), Materials.Phenol.getCells(4))
+ .fluidInputs(Materials.Chlorobenzene.getFluid(4000))
+ .duration(48 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(12), Materials.Chlorobenzene.getCells(4))
+ .itemOutputs(Materials.Salt.getDust(8), Materials.Phenol.getCells(4))
+ .duration(48 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ // Recipes for gasoline
+ // 2N + O = N2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Nitrogen.getCells(2), Materials.Oxygen.getCells(1))
+ .itemOutputs(Materials.NitrousOxide.getCells(1), Materials.Empty.getCells(2))
+ .duration(10 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Nitrogen.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(2))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.NitrousOxide.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Nitrogen.getCells(2), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.NitrousOxide.getCells(1), Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Oxygen.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Nitrogen.getGas(2000))
+ .fluidOutputs(Materials.NitrousOxide.getGas(1000))
+ .duration(10 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Oxygen.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.NitrousOxide.getCells(1))
+ .fluidInputs(Materials.Nitrogen.getGas(2000))
+ .duration(10 * SECONDS)
+ .eut(30)
+ .addTo(chemicalReactorRecipes);
+
+ // C2H6O + C4H8 = C6H14O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Ethanol.getCells(1), Materials.Butene.getCells(1))
+ .itemOutputs(Materials.AntiKnock.getCells(1), Materials.Empty.getCells(1))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalReactorRecipes);
+
+ // Potassium Dichromate
+ // 2KNO3 + 2CrO3 = K2Cr2O7 + 2NO + 3O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Saltpeter.getDust(10), Materials.ChromiumTrioxide.getDust(8))
+ .itemOutputs(Materials.Potassiumdichromate.getDust(11))
+ .fluidOutputs(Materials.NitricOxide.getGas(2000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.PotassiumNitrade.getDust(10), Materials.ChromiumTrioxide.getDust(8))
+ .itemOutputs(Materials.Potassiumdichromate.getDust(11))
+ .fluidOutputs(Materials.NitricOxide.getGas(2000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(chemicalReactorRecipes);
+ }
+
+ public void multiblockOnly() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(22))
+ .fluidInputs(Materials.Hydrogen.getGas(16000), Materials.Oxygen.getGas(8000))
+ .fluidOutputs(GT_ModHandler.getDistilledWater(8000))
+ .duration(4 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.PotassiumNitrade.getDust(10), Materials.ChromiumTrioxide.getDust(8))
+ .itemOutputs(Materials.Potassiumdichromate.getDust(11))
+ .fluidOutputs(Materials.NitricOxide.getGas(2000), Materials.Oxygen.getGas(3000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Saltpeter.getDust(10), Materials.ChromiumTrioxide.getDust(8))
+ .itemOutputs(Materials.Potassiumdichromate.getDust(11))
+ .fluidOutputs(Materials.NitricOxide.getGas(2000), Materials.Oxygen.getGas(3000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // Potassium Dichromate shortcut
+ // 2 Cr + 6O + 10 Saltpeter/Potassium Dichromate = 10 K2Cr2O7 + 2NO + 3O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ Materials.PotassiumNitrade.getDust(64),
+ Materials.PotassiumNitrade.getDust(64),
+ Materials.PotassiumNitrade.getDust(32),
+ Materials.Chrome.getDust(2 * 16),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(
+ Materials.Potassiumdichromate.getDust(64),
+ Materials.Potassiumdichromate.getDust(64),
+ Materials.Potassiumdichromate.getDust(48))
+ .fluidInputs(Materials.Oxygen.getGas(6000 * 16))
+ .fluidOutputs(Materials.NitricOxide.getGas(2000 * 16), Materials.Oxygen.getGas(3000 * 16))
+ .duration(2 * MINUTES + 8 * SECONDS)
+ .eut((int) GT_Values.VP[7])
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ Materials.Saltpeter.getDust(64),
+ Materials.Saltpeter.getDust(64),
+ Materials.Saltpeter.getDust(32),
+ Materials.Chrome.getDust(2 * 16),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(
+ Materials.Potassiumdichromate.getDust(64),
+ Materials.Potassiumdichromate.getDust(64),
+ Materials.Potassiumdichromate.getDust(48))
+ .fluidInputs(Materials.Oxygen.getGas(6000 * 16))
+ .fluidOutputs(Materials.NitricOxide.getGas(2000 * 16), Materials.Oxygen.getGas(3000 * 16))
+ .duration(2 * MINUTES + 8 * SECONDS)
+ .eut((int) GT_Values.VP[7])
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Benzene.getFluid(1000), Materials.Methane.getGas(2000))
+ .fluidOutputs(Materials.Dimethylbenzene.getFluid(1000), Materials.Hydrogen.getGas(4000))
+ .duration(3 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Galena, 3),
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Sphalerite, 1))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(4000))
+ .fluidOutputs(new FluidStack(ItemList.sIndiumConcentrate, 8000))
+ .duration(3 * SECONDS)
+ .eut(150)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(8),
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Galena, 27),
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Sphalerite, 9))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(36000))
+ .fluidOutputs(new FluidStack(ItemList.sIndiumConcentrate, 72000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(9),
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Pentlandite, 9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.PlatinumGroupSludge, 1))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(9000))
+ .fluidOutputs(new FluidStack(ItemList.sNickelSulfate, 18000))
+ .duration(1 * SECONDS + 5 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(9),
+ GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Chalcopyrite, 9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.PlatinumGroupSludge, 1))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(9000))
+ .fluidOutputs(new FluidStack(ItemList.sBlueVitriol, 18000))
+ .duration(1 * SECONDS + 5 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Plutonium, 64),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1),
+ GT_Utility.getIntegratedCircuit(8))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 64))
+ .fluidInputs(Materials.Air.getGas(8000))
+ .fluidOutputs(Materials.Radon.getGas(800))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 3SiO2 + 4Al = 3Si + 2Al2O3
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 10))
+ .duration(10 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 10Si + 30HCl -> 0.3 SiH2Cl2 + 9 HSiCl3 + 0.3 SiCl4 + 0.2 Si2Cl6 + 20.4H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 10))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(30000))
+ .fluidOutputs(
+ Materials.Trichlorosilane.getFluid(9000),
+ Materials.SiliconTetrachloride.getFluid(300),
+ Materials.Hexachlorodisilane.getFluid(200),
+ Materials.Dichlorosilane.getGas(300),
+ Materials.Hydrogen.getGas(20400))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 2CO + 2C3H6 + 4H =RhHCO(P(C6H5)3)3= C4H8O + C4H8O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(4), MaterialsKevlar.OrganorhodiumCatalyst.getDustTiny(1))
+ .fluidInputs(
+ Materials.Hydrogen.getGas(4000),
+ Materials.Propene.getGas(2000),
+ Materials.CarbonMonoxide.getGas(2000))
+ .fluidOutputs(MaterialsKevlar.Butyraldehyde.getFluid(1000), MaterialsKevlar.Isobutyraldehyde.getFluid(1000))
+ .duration(15 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9), MaterialsKevlar.OrganorhodiumCatalyst.getDust(1))
+ .fluidInputs(
+ Materials.Hydrogen.getGas(36000),
+ Materials.Propene.getGas(18000),
+ Materials.CarbonMonoxide.getGas(18000))
+ .fluidOutputs(MaterialsKevlar.Butyraldehyde.getFluid(9000), MaterialsKevlar.Isobutyraldehyde.getFluid(9000))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // C2H4 + O =Al2O3,Ag= C2H4O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 1))
+ .fluidInputs(Materials.Ethylene.getGas(1000), Materials.Oxygen.getGas(1000))
+ .fluidOutputs(MaterialsKevlar.EthyleneOxide.getGas(1000))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 9))
+ .fluidInputs(Materials.Ethylene.getGas(9000), Materials.Oxygen.getGas(9000))
+ .fluidOutputs(MaterialsKevlar.EthyleneOxide.getGas(9000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(
+ MaterialsKevlar.EthyleneOxide.getGas(1000),
+ Materials.Dimethyldichlorosilane.getFluid(4000),
+ Materials.Water.getFluid(5000))
+ .fluidOutputs(MaterialsKevlar.SiliconOil.getFluid(5000))
+ .duration(15 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(8))
+ .fluidInputs(
+ MaterialsKevlar.EthyleneOxide.getGas(9000),
+ Materials.Dimethyldichlorosilane.getFluid(36000),
+ Materials.Water.getFluid(45000))
+ .fluidOutputs(MaterialsKevlar.SiliconOil.getFluid(45000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // NH3 + CH4O =SiO2,Al2O3= CH5N + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(10),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1))
+ .fluidInputs(Materials.Methanol.getFluid(1000), Materials.Ammonia.getGas(1000))
+ .fluidOutputs(MaterialsKevlar.Methylamine.getGas(1000), Materials.Water.getFluid(1000))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(500000)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.KevlarCatalyst, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.Pentaerythritol, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.DiphenylmethaneDiisocyanate, 5))
+ .fluidInputs(MaterialsKevlar.Ethyleneglycol.getFluid(4000), MaterialsKevlar.SiliconOil.getFluid(1000))
+ .fluidOutputs(MaterialsKevlar.PolyurethaneResin.getFluid(1000))
+ .duration(10 * SECONDS)
+ .eut(500000)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.KevlarCatalyst, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.Pentaerythritol, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.DiphenylmethaneDiisocyanate, 45))
+ .fluidInputs(MaterialsKevlar.Ethyleneglycol.getFluid(36000), MaterialsKevlar.SiliconOil.getFluid(9000))
+ .fluidOutputs(MaterialsKevlar.PolyurethaneResin.getFluid(9000))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(500000)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 3NH3 + 6CH4O =Al2O3,SiO2= CH5N + C2H7N + C3H9N + 6H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1))
+ .fluidInputs(Materials.Methanol.getFluid(6000), Materials.Ammonia.getGas(3000))
+ .fluidOutputs(
+ MaterialsKevlar.Methylamine.getGas(1000),
+ Materials.Dimethylamine.getGas(1000),
+ MaterialsKevlar.Trimethylamine.getGas(1000),
+ Materials.Water.getFluid(6000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(11),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminiumoxide, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 9))
+ .fluidInputs(Materials.Methanol.getFluid(54000), Materials.Ammonia.getGas(27000))
+ .fluidOutputs(
+ MaterialsKevlar.Methylamine.getGas(9000),
+ Materials.Dimethylamine.getGas(9000),
+ MaterialsKevlar.Trimethylamine.getGas(9000),
+ Materials.Water.getFluid(54000))
+ .duration(2 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 18SOCl2 + 5C10H10O4 + 6CO2 = 7C8H4Cl2O2 + 22HCl + 18SO2
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.TerephthaloylChloride, 64),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.TerephthaloylChloride, 48))
+ .fluidInputs(
+ MaterialsKevlar.ThionylChloride.getFluid(18000),
+ MaterialsKevlar.DimethylTerephthalate.getFluid(5000),
+ Materials.CarbonDioxide.getGas(6000))
+ .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(22000), Materials.SulfurDioxide.getGas(18000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 2CH4O + C8H6O4 =H2SO4= C10H10O4 + 2H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(
+ MaterialsKevlar.TerephthalicAcid.getFluid(1000),
+ Materials.Methanol.getFluid(2000),
+ Materials.SulfuricAcid.getFluid(2000))
+ .fluidOutputs(
+ MaterialsKevlar.DimethylTerephthalate.getFluid(1000),
+ Materials.DilutedSulfuricAcid.getFluid(2000))
+ .duration(12 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(
+ MaterialsKevlar.TerephthalicAcid.getFluid(9000),
+ Materials.Methanol.getFluid(18000),
+ Materials.SulfuricAcid.getFluid(18000))
+ .fluidOutputs(
+ MaterialsKevlar.DimethylTerephthalate.getFluid(9000),
+ Materials.DilutedSulfuricAcid.getFluid(18000))
+ .duration(1 * MINUTES + 27 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.Benzene.getFluid(1000), Materials.Methane.getGas(2000))
+ .fluidOutputs(MaterialsKevlar.IIIDimethylbenzene.getFluid(1000), Materials.Hydrogen.getGas(4000))
+ .duration(3 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(3))
+ .fluidInputs(Materials.Benzene.getFluid(1000), Materials.Methane.getGas(2000))
+ .fluidOutputs(MaterialsKevlar.IVDimethylbenzene.getFluid(1000), Materials.Hydrogen.getGas(4000))
+ .duration(3 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIIHydroxide, 45))
+ .itemOutputs(
+ MaterialsKevlar.CobaltIINaphthenate.getDust(64),
+ MaterialsKevlar.CobaltIINaphthenate.getDust(64),
+ MaterialsKevlar.CobaltIINaphthenate.getDust(64),
+ MaterialsKevlar.CobaltIINaphthenate.getDust(64),
+ MaterialsKevlar.CobaltIINaphthenate.getDust(64),
+ MaterialsKevlar.CobaltIINaphthenate.getDust(49))
+ .fluidInputs(MaterialsKevlar.NaphthenicAcid.getFluid(10000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIIAcetate, 64),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIIAcetate, 64),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.CobaltIIAcetate, 7))
+ .itemOutputs(
+ MaterialsKevlar.CobaltIINaphthenate.getDust(64),
+ MaterialsKevlar.CobaltIINaphthenate.getDust(64),
+ MaterialsKevlar.CobaltIINaphthenate.getDust(64),
+ MaterialsKevlar.CobaltIINaphthenate.getDust(64),
+ MaterialsKevlar.CobaltIINaphthenate.getDust(64),
+ MaterialsKevlar.CobaltIINaphthenate.getDust(49))
+ .fluidInputs(MaterialsKevlar.NaphthenicAcid.getFluid(10000))
+ .fluidOutputs(Materials.AceticAcid.getFluid(15000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // PCl3 + 3C6H5Cl + 6Na = 6NaCl + C18H15P
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 6))
+ .itemOutputs(MaterialsKevlar.Triphenylphosphene.getDust(34), Materials.Salt.getDust(12))
+ .fluidInputs(MaterialsKevlar.PhosphorusTrichloride.getFluid(1000), Materials.Chlorobenzene.getFluid(3000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 4NaH + C3H9BO3 = NaBH4 + 3CH3ONa
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1), MaterialsKevlar.SodiumHydride.getDust(8))
+ .itemOutputs(MaterialsKevlar.SodiumBorohydride.getDust(6), MaterialsKevlar.SodiumMethoxide.getDust(18))
+ .fluidInputs(MaterialsKevlar.TrimethylBorate.getFluid(1000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9), MaterialsKevlar.SodiumHydride.getDust(64))
+ .itemOutputs(
+ MaterialsKevlar.SodiumBorohydride.getDust(48),
+ MaterialsKevlar.SodiumMethoxide.getDust(64),
+ MaterialsKevlar.SodiumMethoxide.getDust(64),
+ MaterialsKevlar.SodiumMethoxide.getDust(16))
+ .fluidInputs(MaterialsKevlar.TrimethylBorate.getFluid(8000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 2CH3COOH = CH3COCH3 + CO2 + H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(0, Materials.Calcite.getDust(5)), GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.AceticAcid.getFluid(2000))
+ .fluidOutputs(
+ Materials.Acetone.getFluid(1000),
+ Materials.CarbonDioxide.getGas(1000),
+ Materials.Water.getFluid(1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(0, Materials.Calcium.getDust(1)), GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.AceticAcid.getFluid(2000))
+ .fluidOutputs(
+ Materials.Acetone.getFluid(1000),
+ Materials.CarbonDioxide.getGas(1000),
+ Materials.Water.getFluid(1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(0, Materials.Quicklime.getDust(2)), GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.AceticAcid.getFluid(2000))
+ .fluidOutputs(
+ Materials.Acetone.getFluid(1000),
+ Materials.CarbonDioxide.getGas(1000),
+ Materials.Water.getFluid(1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // C + 4H + O = CH3OH
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Carbon.getDust(1), GT_Utility.getIntegratedCircuit(23))
+ .fluidInputs(Materials.Hydrogen.getGas(4000), Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.Methanol.getFluid(1000))
+ .duration(16 * SECONDS)
+ .eut(96)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // This recipe collides with one for Vinyl Chloride
+ // 2C + 4H + 2O = CH3COOH
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Carbon.getDust(2), GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.Hydrogen.getGas(4000), Materials.Oxygen.getGas(2000))
+ .fluidOutputs(Materials.AceticAcid.getFluid(1000))
+ .duration(24 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 2CO + 4H = CH3COOH
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.CarbonMonoxide.getGas(2000), Materials.Hydrogen.getGas(4000))
+ .fluidOutputs(Materials.AceticAcid.getFluid(1000))
+ .duration(16 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(8))
+ .fluidInputs(Materials.Hydrogen.getGas(9000), Materials.Chlorine.getGas(9000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(9000))
+ .duration(7 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(
+ Materials.Chlorine.getGas(10000),
+ Materials.Water.getFluid(10000),
+ Materials.Mercury.getFluid(1000))
+ .fluidOutputs(Materials.HypochlorousAcid.getFluid(10000), Materials.Hydrogen.getGas(10000))
+ .duration(30 * SECONDS)
+ .eut(8)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // H2O + 4Cl + C3H6 + NaOH = C3H5ClO + NaCl·H2O + 2HCl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(3), GT_Utility.getIntegratedCircuit(23))
+ .fluidInputs(
+ Materials.Propene.getGas(1000),
+ Materials.Chlorine.getGas(4000),
+ Materials.Water.getFluid(1000))
+ .fluidOutputs(
+ Materials.Epichlorohydrin.getFluid(1000),
+ Materials.SaltWater.getFluid(1000),
+ Materials.HydrochloricAcid.getFluid(2000))
+ .duration(32 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // H2O + 2Cl + C3H6 + NaOH =Hg= C3H5ClO + NaCl·H2O + 2H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(3), GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ Materials.Propene.getGas(1000),
+ Materials.Chlorine.getGas(2000),
+ Materials.Water.getFluid(1000),
+ Materials.Mercury.getFluid(100))
+ .fluidOutputs(
+ Materials.Epichlorohydrin.getFluid(1000),
+ Materials.SaltWater.getFluid(1000),
+ Materials.Hydrogen.getGas(2000))
+ .duration(32 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // HClO + 2Cl + C3H6 + NaOH = C3H5ClO + NaCl·H2O + HCl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(3), GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ Materials.Propene.getGas(1000),
+ Materials.Chlorine.getGas(2000),
+ Materials.HypochlorousAcid.getFluid(1000))
+ .fluidOutputs(
+ Materials.Epichlorohydrin.getFluid(1000),
+ Materials.SaltWater.getFluid(1000),
+ Materials.HydrochloricAcid.getFluid(1000))
+ .duration(32 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Apatite.getDust(9))
+ .itemOutputs(Materials.Gypsum.getDust(40))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(5000), Materials.Water.getFluid(10000))
+ .fluidOutputs(Materials.PhosphoricAcid.getFluid(3000), Materials.HydrochloricAcid.getFluid(1000))
+ .duration(16 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Phosphorus.getDust(4), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.PhosphorousPentoxide.getDust(14))
+ .fluidInputs(Materials.Oxygen.getGas(10000))
+ .duration(2 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 2P + 5O + 3H2O = 2H3PO4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Phosphorus.getDust(1), GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.Oxygen.getGas(2500), Materials.Water.getFluid(1500))
+ .fluidOutputs(Materials.PhosphoricAcid.getFluid(1000))
+ .duration(16 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(
+ Materials.Propene.getGas(8000),
+ Materials.Benzene.getFluid(8000),
+ Materials.PhosphoricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Cumene.getFluid(8000))
+ .duration(1 * MINUTES + 36 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ Materials.Propene.getGas(1000),
+ Materials.Benzene.getFluid(1000),
+ Materials.PhosphoricAcid.getFluid(100),
+ Materials.Oxygen.getGas(2000))
+ .fluidOutputs(Materials.Phenol.getFluid(1000), Materials.Acetone.getFluid(1000))
+ .duration(24 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(
+ Materials.Acetone.getFluid(1000),
+ Materials.Phenol.getFluid(2000),
+ Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(Materials.BisphenolA.getFluid(1000), Materials.Water.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(6), GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ Materials.Acetone.getFluid(1000),
+ Materials.Phenol.getFluid(2000),
+ Materials.HydrochloricAcid.getFluid(1000),
+ Materials.Epichlorohydrin.getFluid(2000))
+ .fluidOutputs(Materials.Epoxid.getMolten(1000), Materials.SaltWater.getFluid(2000))
+ .duration(24 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(Materials.Hydrogen.getGas(9000), Materials.Fluorine.getGas(9000))
+ .fluidOutputs(Materials.HydrofluoricAcid.getFluid(9000))
+ .duration(7 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ Materials.HydrofluoricAcid.getFluid(4000),
+ Materials.Methane.getGas(2000),
+ Materials.Chlorine.getGas(12000))
+ .fluidOutputs(Materials.Tetrafluoroethylene.getGas(1000), Materials.HydrochloricAcid.getFluid(12000))
+ .duration(27 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Silicon.getDust(1), GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(Materials.Polydimethylsiloxane.getDust(3))
+ .fluidInputs(
+ Materials.Methane.getGas(2000),
+ Materials.Chlorine.getGas(4000),
+ Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(2000), Materials.DilutedHydrochloricAcid.getFluid(2000))
+ .duration(24 * SECONDS)
+ .eut(96)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Silicon.getDust(1), GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(Materials.Polydimethylsiloxane.getDust(3))
+ .fluidInputs(Materials.Methanol.getFluid(2000), Materials.HydrochloricAcid.getFluid(2000))
+ .fluidOutputs(Materials.DilutedHydrochloricAcid.getFluid(2000))
+ .duration(24 * SECONDS)
+ .eut(96)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Nitrogen.getGas(1000), Materials.Hydrogen.getGas(3000))
+ .fluidOutputs(Materials.Ammonia.getGas(1000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.HV * 3 / 4)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.Nitrogen.getGas(10000), Materials.Hydrogen.getGas(30000))
+ .fluidOutputs(Materials.Ammonia.getGas(10000))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.HV * 3 / 4)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 2NH3 + 7O = N2O4 + 3H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(23))
+ .fluidInputs(Materials.Ammonia.getGas(2000), Materials.Oxygen.getGas(7000))
+ .fluidOutputs(Materials.DinitrogenTetroxide.getGas(1000), Materials.Water.getFluid(3000))
+ .duration(24 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 7O + 6H + 2N = N2O4 + 3H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(23))
+ .fluidInputs(
+ Materials.Nitrogen.getGas(2000),
+ Materials.Hydrogen.getGas(6000),
+ Materials.Oxygen.getGas(7000))
+ .fluidOutputs(Materials.DinitrogenTetroxide.getGas(1000), Materials.Water.getFluid(3000))
+ .duration(55 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(Materials.Oxygen.getGas(100000), Materials.Ammonia.getGas(36000))
+ .fluidOutputs(Materials.NitricOxide.getGas(36000), Materials.Water.getFluid(54000))
+ .duration(8 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(8))
+ .fluidInputs(Materials.Oxygen.getGas(100000), Materials.Ammonia.getGas(36000))
+ .fluidOutputs(Materials.NitricOxide.getGas(36000))
+ .duration(8 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(Materials.NitricOxide.getGas(9000), Materials.Oxygen.getGas(9000))
+ .fluidOutputs(Materials.NitrogenDioxide.getGas(9000))
+ .duration(4 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(Materials.NitrogenDioxide.getGas(27000), Materials.Water.getFluid(9000))
+ .fluidOutputs(Materials.NitricAcid.getFluid(18000), Materials.NitricOxide.getGas(9000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ Materials.Hydrogen.getGas(3000),
+ Materials.Nitrogen.getGas(1000),
+ Materials.Oxygen.getGas(4000))
+ .fluidOutputs(Materials.NitricAcid.getFluid(1000), Materials.Water.getFluid(1000))
+ .duration(16 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.Ammonia.getGas(1000), Materials.Oxygen.getGas(4000))
+ .fluidOutputs(Materials.NitricAcid.getFluid(1000), Materials.Water.getFluid(1000))
+ .duration(16 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ Materials.NitrogenDioxide.getGas(2000),
+ Materials.Oxygen.getGas(1000),
+ Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.NitricAcid.getFluid(2000))
+ .duration(16 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9), Materials.Sulfur.getDust(9))
+ .fluidInputs(Materials.Hydrogen.getGas(18000))
+ .fluidOutputs(Materials.HydricSulfide.getGas(9000))
+ .duration(4 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9), Materials.Sulfur.getDust(9))
+ .fluidInputs(Materials.Oxygen.getGas(18000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(9000))
+ .duration(4 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(Materials.HydricSulfide.getGas(9000), Materials.Oxygen.getGas(27000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(9000), Materials.Water.getFluid(9000))
+ .duration(3 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(8))
+ .fluidInputs(Materials.HydricSulfide.getGas(9000), Materials.Oxygen.getGas(27000))
+ .fluidOutputs(Materials.SulfurDioxide.getGas(9000))
+ .duration(3 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(7))
+ .itemOutputs(Materials.Sulfur.getDust(27))
+ .fluidInputs(Materials.SulfurDioxide.getGas(9000), Materials.HydricSulfide.getGas(18000))
+ .duration(3 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(Materials.SulfurTrioxide.getGas(9000), Materials.Water.getFluid(9000))
+ .fluidOutputs(Materials.SulfuricAcid.getFluid(9000))
+ .duration(13 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // S + O3 + H2O = H2SO4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24), Materials.Sulfur.getDust(1))
+ .fluidInputs(Materials.Oxygen.getGas(3000), Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
+ .duration(24 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(7), Materials.Sulfur.getDust(9))
+ .fluidInputs(Materials.Oxygen.getGas(27000), Materials.Water.getFluid(9000))
+ .fluidOutputs(Materials.SulfuricAcid.getFluid(9000))
+ .duration(13 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // H2S + O4 = H2SO4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.HydricSulfide.getGas(1000), Materials.Oxygen.getGas(4000))
+ .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
+ .duration(24 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // SO2 + O + H2O = H2SO4
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ Materials.SulfurDioxide.getGas(1000),
+ Materials.Oxygen.getGas(1000),
+ Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
+ .duration(30 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(
+ Materials.SulfurDioxide.getGas(9000),
+ Materials.Oxygen.getGas(9000),
+ Materials.Water.getFluid(9000))
+ .fluidOutputs(Materials.SulfuricAcid.getFluid(9000))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(
+ Materials.HydrochloricAcid.getFluid(1000),
+ Materials.Ethylene.getGas(1000),
+ Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.VinylChloride.getGas(1000), Materials.Water.getFluid(1000))
+ .duration(8 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ Materials.Chlorine.getGas(2000),
+ Materials.Ethylene.getGas(2000),
+ Materials.Oxygen.getGas(1000))
+ .fluidOutputs(Materials.VinylChloride.getGas(2000), Materials.Water.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.RawRubber.getDust(18))
+ .fluidInputs(
+ Materials.Isoprene.getFluid(1728),
+ Materials.Air.getGas(6000),
+ Materials.Titaniumtetrachloride.getFluid(80))
+ .duration(32 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.RawRubber.getDust(24))
+ .fluidInputs(
+ Materials.Isoprene.getFluid(1728),
+ Materials.Oxygen.getGas(6000),
+ Materials.Titaniumtetrachloride.getFluid(80))
+ .duration(32 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(1))
+ .fluidInputs(Materials.Styrene.getFluid(36), Materials.Butadiene.getGas(108), Materials.Air.getGas(2000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(3))
+ .fluidInputs(Materials.Styrene.getFluid(72), Materials.Butadiene.getGas(216), Materials.Oxygen.getGas(2000))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(
+ Materials.RawStyreneButadieneRubber.getDust(22),
+ Materials.RawStyreneButadieneRubber.getDustSmall(2))
+ .fluidInputs(
+ Materials.Styrene.getFluid(540),
+ Materials.Butadiene.getGas(1620),
+ Materials.Titaniumtetrachloride.getFluid(100),
+ Materials.Air.getGas(15000))
+ .duration(32 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(Materials.RawStyreneButadieneRubber.getDust(30))
+ .fluidInputs(
+ Materials.Styrene.getFluid(540),
+ Materials.Butadiene.getGas(1620),
+ Materials.Titaniumtetrachloride.getFluid(100),
+ Materials.Oxygen.getGas(7500))
+ .duration(32 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9), Materials.Salt.getDust(18))
+ .itemOutputs(Materials.SodiumBisulfate.getDust(63))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(9000))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(9000))
+ .duration(6 * SECONDS + 15 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9), Materials.SodiumHydroxide.getDust(27))
+ .itemOutputs(Materials.SodiumBisulfate.getDust(63))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(9000))
+ .fluidOutputs(Materials.Water.getFluid(9000))
+ .duration(6 * SECONDS + 15 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ Materials.Benzene.getFluid(1000),
+ Materials.Chlorine.getGas(2000),
+ Materials.Water.getFluid(1000))
+ .fluidOutputs(
+ Materials.Phenol.getFluid(1000),
+ Materials.HydrochloricAcid.getFluid(1000),
+ Materials.DilutedHydrochloricAcid.getFluid(1000))
+ .duration(28 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // C6H6 + 2Cl + NaOH = C6H6O + NaCl + HCl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(6), GT_Utility.getIntegratedCircuit(24))
+ .itemOutputs(Materials.Salt.getDust(4))
+ .fluidInputs(Materials.Benzene.getFluid(2000), Materials.Chlorine.getGas(4000))
+ .fluidOutputs(Materials.Phenol.getFluid(2000), Materials.HydrochloricAcid.getFluid(2000))
+ .duration(56 * SECONDS)
+ .eut(30)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.LightFuel.getFluid(20000), Materials.HeavyFuel.getFluid(4000))
+ .fluidOutputs(Materials.Fuel.getFluid(24000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.Fuel.getFluid(10000), Materials.Tetranitromethane.getFluid(200))
+ .fluidOutputs(Materials.NitroFuel.getFluid(10000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.BioDiesel.getFluid(10000), Materials.Tetranitromethane.getFluid(400))
+ .fluidOutputs(Materials.NitroFuel.getFluid(9000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // CH4 + 2H2O = CO2 + 8H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(11))
+ .fluidInputs(Materials.Methane.getGas(5000), GT_ModHandler.getDistilledWater(10000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(5000), Materials.Hydrogen.getGas(40000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // CH4 + H2O = CO + 6H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(12))
+ .fluidInputs(Materials.Methane.getGas(5000), GT_ModHandler.getDistilledWater(5000))
+ .fluidOutputs(Materials.CarbonMonoxide.getGas(5000), Materials.Hydrogen.getGas(30000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.Nitrogen.getGas(20000), Materials.Oxygen.getGas(10000))
+ .fluidOutputs(Materials.NitrousOxide.getGas(10000))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ Materials.Naphtha.getFluid(16000),
+ Materials.Gas.getGas(2000),
+ Materials.Methanol.getFluid(1000),
+ Materials.Acetone.getFluid(1000))
+ .fluidOutputs(Materials.GasolineRaw.getFluid(20000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.GasolineRaw.getFluid(10000), Materials.Toluene.getFluid(1000))
+ .fluidOutputs(Materials.GasolineRegular.getFluid(11000))
+ .duration(10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ Materials.GasolineRegular.getFluid(20000),
+ Materials.Octane.getFluid(2000),
+ Materials.NitrousOxide.getGas(6000),
+ Materials.Toluene.getFluid(1000),
+ Materials.AntiKnock.getFluid(3000))
+ .fluidOutputs(Materials.GasolinePremium.getFluid(32000))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // C2H6O + C4H8 = C6H14O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.Ethanol.getFluid(1000), Materials.Butene.getGas(1000))
+ .fluidOutputs(Materials.AntiKnock.getFluid(1000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // CH4O + C4H8 = C5H12O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.Methanol.getFluid(1000), Materials.Butene.getGas(1000))
+ .fluidOutputs(Materials.MTBEMixture.getGas(1000))
+ .duration(20 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ Materials.Naquadria.getMolten(4608),
+ Materials.ElectrumFlux.getMolten(4608),
+ Materials.Radon.getGas(16000))
+ .fluidOutputs(Materials.EnrichedNaquadria.getFluid(9216))
+ .duration(30 * SECONDS)
+ .eut(500000)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ if (GTNHLanthanides.isModLoaded() && GTPlusPlus.isModLoaded()) {
+ // CH2O + 2C6H7N + HCl = C13H14N2(HCl) + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(
+ new FluidStack(FluidRegistry.getFluid("fluid.formaldehyde"), 1000),
+ new FluidStack(FluidRegistry.getFluid("aniline"), 2000),
+ Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(MaterialsKevlar.DiaminodiphenylmethanMixture.getFluid(1000))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // C6H5NO2 + 6H =Pd= C6H7N + 2H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 1))
+ .fluidInputs(
+ new FluidStack(FluidRegistry.getFluid("nitrobenzene"), 9000),
+ Materials.Hydrogen.getGas(54000))
+ .fluidOutputs(Materials.Water.getFluid(18000), new FluidStack(FluidRegistry.getFluid("aniline"), 9000))
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // C6H6 + HNO3 =H2SO4= C6H5NO2 + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(
+ Materials.Benzene.getFluid(5000),
+ Materials.SulfuricAcid.getFluid(3000),
+ Materials.NitricAcid.getFluid(5000),
+ GT_ModHandler.getDistilledWater(10000))
+ .fluidOutputs(
+ new FluidStack(FluidRegistry.getFluid("nitrobenzene"), 5000),
+ Materials.DilutedSulfuricAcid.getFluid(3000))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // C13H14N2(HCl) + 2COCl2 = C15H10N2O2(5HCl)
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(
+ MaterialsKevlar.DiaminodiphenylmethanMixture.getFluid(1000),
+ new FluidStack(FluidRegistry.getFluid("phosgene"), 2000))
+ .fluidOutputs(MaterialsKevlar.DiphenylmethaneDiisocyanateMixture.getFluid(1000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 1))
+ .fluidInputs(MaterialsKevlar.Butyraldehyde.getFluid(9000), Materials.Hydrogen.getGas(18000))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("butanol"), 9000))
+ .duration(4 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.KevlarCatalyst, 1))
+ .fluidInputs(
+ new FluidStack(FluidRegistry.getFluid("butanol"), 2000),
+ new FluidStack(FluidRegistry.getFluid("propionicacid"), 1000),
+ Materials.IronIIIChloride.getFluid(100))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.KevlarCatalyst, 9))
+ .fluidInputs(
+ new FluidStack(FluidRegistry.getFluid("butanol"), 18000),
+ new FluidStack(FluidRegistry.getFluid("propionicacid"), 9000),
+ Materials.IronIIIChloride.getFluid(900))
+ .duration(3 * MINUTES + 45 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // C2H4 + CO + H2O =C4NiO= C3H6O2
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(
+ Materials.Ethylene.getGas(1000),
+ Materials.CarbonMonoxide.getGas(1000),
+ MaterialsKevlar.NickelTetracarbonyl.getFluid(100),
+ Materials.Water.getFluid(1000))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("propionicacid"), 1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(
+ Materials.Ethylene.getGas(9000),
+ Materials.CarbonMonoxide.getGas(9000),
+ MaterialsKevlar.NickelTetracarbonyl.getFluid(900),
+ Materials.Water.getFluid(9000))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("propionicacid"), 9000))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // C6H7N + HNO3 =H2SO4,C4H6O3= C6H6N2O2 + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(
+ new FluidStack(FluidRegistry.getFluid("aniline"), 1000),
+ new FluidStack(FluidRegistry.getFluid("molten.aceticanhydride"), 100),
+ Materials.NitrationMixture.getFluid(2000))
+ .fluidOutputs(
+ MaterialsKevlar.IVNitroaniline.getFluid(1000),
+ Materials.DilutedSulfuricAcid.getFluid(1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(
+ new FluidStack(FluidRegistry.getFluid("aniline"), 9000),
+ new FluidStack(FluidRegistry.getFluid("molten.aceticanhydride"), 900),
+ Materials.NitrationMixture.getFluid(18000))
+ .fluidOutputs(
+ MaterialsKevlar.IVNitroaniline.getFluid(9000),
+ Materials.DilutedSulfuricAcid.getFluid(9000))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // C6H6N2O2 + 6H =Pd,NO2= C6H8N2 + 2H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.ParaPhenylenediamine, 16))
+ .fluidInputs(
+ Materials.NitrogenDioxide.getGas(100),
+ Materials.Hydrogen.getGas(6000),
+ MaterialsKevlar.IVNitroaniline.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(2000))
+ .duration(20 * SECONDS)
+ .eut(500000)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // C4H10O2 =Cu= C4H6O2 + 4H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("1,4-butanediol"), 1000))
+ .fluidOutputs(MaterialsKevlar.GammaButyrolactone.getFluid(1000), Materials.Hydrogen.getGas(4000))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 9))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("1,4-butanediol"), 9000))
+ .fluidOutputs(MaterialsKevlar.GammaButyrolactone.getFluid(9000), Materials.Hydrogen.getGas(36000))
+ .duration(35 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 2CH2O + C2H2 =SiO2,CuO,Bi2O3= C4H6O2
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CupricOxide, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.BismuthIIIOxide, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.IIButinIIVdiol, 12))
+ .fluidInputs(
+ MaterialsKevlar.Acetylene.getGas(1000),
+ new FluidStack(FluidRegistry.getFluid("fluid.formaldehyde"), 2000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.CupricOxide, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.BismuthIIIOxide, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 9))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.IIButinIIVdiol, 64),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.IIButinIIVdiol, 44))
+ .fluidInputs(
+ MaterialsKevlar.Acetylene.getGas(9000),
+ new FluidStack(FluidRegistry.getFluid("fluid.formaldehyde"), 18000))
+ .duration(2 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // C4H6O2 + 4H =NiAl= C4H10O2
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.IIButinIIVdiol, 12),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.RaneyNickelActivated, 1))
+ .fluidInputs(Materials.Hydrogen.getGas(4000))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("1,4-butanediol"), 1000))
+ .duration(15 * SECONDS)
+ .eut(500000)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ getModItem(GTPlusPlus.ID, "itemDustCalciumChloride", 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.ParaPhenylenediamine, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.TerephthaloylChloride, 9))
+ .fluidInputs(MaterialsKevlar.NMethylIIPyrrolidone.getFluid(1000))
+ .fluidOutputs(
+ MaterialsKevlar.LiquidCrystalKevlar.getFluid(9000),
+ Materials.DilutedHydrochloricAcid.getFluid(2000))
+ .duration(30 * SECONDS)
+ .eut(500000)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(9),
+ getModItem(GTPlusPlus.ID, "itemDustCalciumChloride", 7),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.ParaPhenylenediamine, 63),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.TerephthaloylChloride, 63))
+ .fluidInputs(MaterialsKevlar.NMethylIIPyrrolidone.getFluid(7000))
+ .fluidOutputs(
+ MaterialsKevlar.LiquidCrystalKevlar.getFluid(63000),
+ Materials.DilutedHydrochloricAcid.getFluid(14000))
+ .duration(2 * MINUTES + 55 * SECONDS)
+ .eut(500000)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // Na2B4O7(H2O)10 + 2HCl = 2NaCl + 4H3BO3 + 5H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Borax, 23))
+ .itemOutputs(Materials.Salt.getDust(4))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(2000))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("boricacid"), 4000), Materials.Water.getFluid(5000))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // H3BO3 + 3CH4O =H2SO4= C3H9BO3 + 3H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(
+ Materials.Methanol.getFluid(3000),
+ new FluidStack(FluidRegistry.getFluid("boricacid"), 1000),
+ Materials.SulfuricAcid.getFluid(6000))
+ .fluidOutputs(
+ Materials.DilutedSulfuricAcid.getFluid(6000),
+ MaterialsKevlar.TrimethylBorate.getFluid(1000))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(
+ Materials.Methanol.getFluid(27000),
+ new FluidStack(FluidRegistry.getFluid("boricacid"), 9000),
+ Materials.SulfuricAcid.getFluid(54000))
+ .fluidOutputs(
+ Materials.DilutedSulfuricAcid.getFluid(54000),
+ MaterialsKevlar.TrimethylBorate.getFluid(9000))
+ .duration(3 * MINUTES + 45 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // RhCl3 + 3C18H15P + 3NaBH4 + CO = RhC55H46P3O + 3NaCl + 3B + 11H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.RhodiumChloride, 4),
+ MaterialsKevlar.Triphenylphosphene.getDust(64),
+ MaterialsKevlar.Triphenylphosphene.getDust(38),
+ MaterialsKevlar.SodiumBorohydride.getDust(18))
+ .itemOutputs(
+ MaterialsKevlar.OrganorhodiumCatalyst.getDust(64),
+ MaterialsKevlar.OrganorhodiumCatalyst.getDust(42),
+ Materials.Salt.getDust(6),
+ Materials.Boron.getDust(3))
+ .fluidInputs(Materials.CarbonMonoxide.getGas(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(11000))
+ .duration(40 * SECONDS)
+ .eut(500000)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ // 2NaOH + N2H4 =Mn= 2N + 2H2O + 2NaH
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(9),
+ Materials.SodiumHydroxide.getDust(6),
+ Materials.Manganese.getDustTiny(1))
+ .itemOutputs(MaterialsKevlar.SodiumHydride.getDust(4))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("fluid.hydrazine"), 1000))
+ .fluidOutputs(Materials.Nitrogen.getGas(2000), Materials.Water.getFluid(2000))
+ .duration(10 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_Utility.getIntegratedCircuit(18),
+ Materials.SodiumHydroxide.getDust(54),
+ Materials.Manganese.getDust(1))
+ .itemOutputs(MaterialsKevlar.SodiumHydride.getDust(36))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("fluid.hydrazine"), 9000))
+ .fluidOutputs(Materials.Nitrogen.getGas(18000), Materials.Water.getFluid(18000))
+ .duration(3 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(multiblockChemicalReactorRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/CircuitAssemblerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/CircuitAssemblerRecipes.java
new file mode 100644
index 0000000000..10aaff6b4d
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/CircuitAssemblerRecipes.java
@@ -0,0 +1,326 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.recipe.RecipeMaps.circuitAssemblerRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.loaders.postload.GT_MachineRecipeLoader.solderingMats;
+
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class CircuitAssemblerRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ registerRailcraftRecipes();
+ registerForestryRecipes();
+
+ }
+
+ public void registerRailcraftRecipes() {
+ if (!Railcraft.isModLoaded()) {
+ return;
+ }
+
+ for (Materials tMat : solderingMats) {
+ int tMultiplier = tMat.contains(SubTag.SOLDERING_MATERIAL_GOOD) ? 1
+ : tMat.contains(SubTag.SOLDERING_MATERIAL_BAD) ? 4 : 2;
+
+ // Railcraft Circuits
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Coated_Basic.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Basic, 1),
+ ItemList.Cover_Controller.get(1))
+ .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 4L, 0))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(15 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Coated_Basic.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Basic, 1),
+ ItemList.Sensor_LV.get(1))
+ .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 4L, 1))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(15 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Coated_Basic.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Basic, 1),
+ getModItem(Railcraft.ID, "part.signal.lamp", 1L, 0))
+ .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 4L, 2))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(15 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Phenolic_Good.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Good, 1),
+ ItemList.Cover_Controller.get(1))
+ .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 8L, 0))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(20 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Phenolic_Good.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Good, 1),
+ ItemList.Sensor_LV.get(1))
+ .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 8L, 1))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(20 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Phenolic_Good.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Good, 1),
+ getModItem(Railcraft.ID, "part.signal.lamp", 1L, 0))
+ .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 8L, 2))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(20 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Epoxy_Advanced.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 1),
+ ItemList.Cover_Controller.get(1))
+ .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 16L, 0))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(25 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Epoxy_Advanced.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 1),
+ ItemList.Sensor_LV.get(1))
+ .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 16L, 1))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(25 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Epoxy_Advanced.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 1),
+ getModItem(Railcraft.ID, "part.signal.lamp", 1L, 0))
+ .itemOutputs(getModItem(Railcraft.ID, "part.circuit", 16L, 2))
+ .fluidInputs(tMat.getMolten(144L * tMultiplier / 2))
+ .duration(25 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Coated_Basic.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Primitive, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Iron, 2),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Iron, 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Iron, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 0))
+ .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Coated_Basic.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Basic, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Bronze, 2),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Bronze, 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Bronze, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 1))
+ .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Phenolic_Good.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Good, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Steel, 2),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 2))
+ .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Phenolic_Good.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, 2),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Electrum, 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Electrum, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 3))
+ .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ }
+ }
+
+ public void registerForestryRecipes() {
+ if (!Forestry.isModLoaded()) {
+ return;
+ }
+
+ // alternative version of the copper electron tube
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+ GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Gold, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 2),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.AnnealedCopper, 2))
+ .itemOutputs(getModItem(Forestry.ID, "thermionicTubes", 4L, 0))
+ .fluidInputs(Materials.Glass.getMolten(576))
+ .duration(10 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ // alternative version of the iron electron tube
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+ GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Gold, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 2),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.WroughtIron, 2))
+ .itemOutputs(getModItem(Forestry.ID, "thermionicTubes", 4L, 3))
+ .fluidInputs(Materials.Glass.getMolten(576))
+ .duration(10 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ ItemStack[] rodMaterials = new ItemStack[] {
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Copper, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Tin, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Bronze, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Iron, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Gold, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Diamond, 2L),
+ getModItem(NewHorizonsCoreMod.ID, "item.LongObsidianRod", 2L, 0),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Blaze, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Rubber, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Emerald, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Apatite, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Lapis, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.EnderEye, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Uranium, 2L), };
+
+ for (int metaid = 0; metaid < rodMaterials.length; metaid++) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.RedAlloy, 1),
+ GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Gold, 2),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 2),
+ rodMaterials[metaid])
+ .itemOutputs(getModItem(Forestry.ID, "thermionicTubes", 4L, metaid))
+ .fluidInputs(Materials.Glass.getMolten(576))
+ .duration(10 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+ }
+
+ for (Materials tMat : solderingMats) {
+
+ int tMultiplier = tMat.contains(SubTag.SOLDERING_MATERIAL_GOOD) ? 1
+ : tMat.contains(SubTag.SOLDERING_MATERIAL_BAD) ? 4 : 2;
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Coated_Basic.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Primitive, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Iron, 2),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Iron, 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Iron, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 0))
+ .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Coated_Basic.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Basic, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Bronze, 2),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Bronze, 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Bronze, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 1))
+ .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Phenolic_Good.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Good, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Steel, 2),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Steel, 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Steel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 2))
+ .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Circuit_Board_Phenolic_Good.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 2),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Electrum, 2),
+ GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Electrum, 4),
+ GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Electrum, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Forestry.ID, "chipsets", 1L, 3))
+ .fluidInputs(tMat.getMolten(1152L * tMultiplier / 2))
+ .duration(10 * SECONDS)
+ .eut((int) TierEU.RECIPE_LV)
+ .addTo(circuitAssemblerRecipes);
+
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/CompressorRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/CompressorRecipes.java
new file mode 100644
index 0000000000..ef7441c13b
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/CompressorRecipes.java
@@ -0,0 +1,154 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.recipe.RecipeMaps.compressorRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import mods.railcraft.common.blocks.aesthetics.cube.EnumCube;
+import mods.railcraft.common.items.RailcraftToolItems;
+
+public class CompressorRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GTPlusPlus.ID, "blockRainforestOakSapling", 8, 0))
+ .itemOutputs(ItemList.IC2_Plantball.get(1))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Compressed_Coal_Chunk.get(1))
+ .itemOutputs(ItemList.IC2_Industrial_Diamond.get(1))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium, 1))
+ .itemOutputs(GT_ModHandler.getIC2Item("Uran238", 1))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Uranium235, 1))
+ .itemOutputs(GT_ModHandler.getIC2Item("Uran235", 1))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plutonium, 1))
+ .itemOutputs(GT_ModHandler.getIC2Item("Plutonium", 1))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Uranium235, 1))
+ .itemOutputs(GT_ModHandler.getIC2Item("smallUran235", 1))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Plutonium, 1))
+ .itemOutputs(GT_ModHandler.getIC2Item("smallPlutonium", 1))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.ice, 2, 32767))
+ .itemOutputs(new ItemStack(Blocks.packed_ice, 1, 0))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 1))
+ .itemOutputs(new ItemStack(Blocks.ice, 1, 0))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.CertusQuartz, 4))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "tile.BlockQuartz", 1))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 8L, 10))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "tile.BlockQuartz", 1))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 8L, 11))
+ .itemOutputs(new ItemStack(Blocks.quartz_block, 1, 0))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 8L, 12))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "tile.BlockFluix", 1))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.quartz, 4, 0))
+ .itemOutputs(new ItemStack(Blocks.quartz_block, 1, 0))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ /*
+ * GT_Values.RA.stdBuilder() .itemInputs( new ItemStack(Items.wheat, 9, 0) ) .itemOutputs( new
+ * ItemStack(Blocks.hay_block, 1, 0) ) .duration(15 * SECONDS) .eut(2)
+ * .addTo(sCompressorRecipes);
+ */
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 4))
+ .itemOutputs(new ItemStack(Blocks.glowstone, 1))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Fireclay.getDust(1))
+ .itemOutputs(ItemList.CompressedFireclay.get(1))
+ .duration(4 * SECONDS)
+ .eut(4)
+ .addTo(compressorRecipes);
+
+ if (Railcraft.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(RailcraftToolItems.getCoalCoke(9))
+ .itemOutputs(EnumCube.COKE_BLOCK.getItem())
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(compressorRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/CropProcessingRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/CropProcessingRecipes.java
new file mode 100644
index 0000000000..e69af249ee
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/CropProcessingRecipes.java
@@ -0,0 +1,176 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.autoclaveRecipes;
+import static gregtech.api.recipe.RecipeMaps.extractorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.UniversalChemical;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_Utility;
+
+public class CropProcessingRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ ItemStack tCrop;
+ // Metals Line
+ tCrop = ItemList.Crop_Drop_Coppon.get(1);
+ this.addProcess(tCrop, Materials.Copper, 100, true);
+ this.addProcess(tCrop, Materials.Tetrahedrite, 100, false);
+ this.addProcess(tCrop, Materials.Chalcopyrite, 100, false);
+ this.addProcess(tCrop, Materials.Malachite, 100, false);
+ this.addProcess(tCrop, Materials.Pyrite, 100, false);
+ this.addProcess(tCrop, Materials.Stibnite, 100, false);
+ tCrop = ItemList.Crop_Drop_Tine.get(1);
+ this.addProcess(tCrop, Materials.Tin, 100, true);
+ this.addProcess(tCrop, Materials.Cassiterite, 100, false);
+ this.addProcess(tCrop, Materials.CassiteriteSand, 100, true);
+ tCrop = ItemList.Crop_Drop_Plumbilia.get(1);
+ this.addProcess(tCrop, Materials.Lead, 100, true);
+ this.addProcess(tCrop, Materials.Galena, 100, false); //
+ tCrop = ItemList.Crop_Drop_Ferru.get(1);
+ this.addProcess(tCrop, Materials.Iron, 100, true);
+ this.addProcess(tCrop, Materials.Magnetite, 100, false);
+ this.addProcess(tCrop, Materials.BrownLimonite, 100, false);
+ this.addProcess(tCrop, Materials.YellowLimonite, 100, false);
+ this.addProcess(tCrop, Materials.VanadiumMagnetite, 100, false);
+ this.addProcess(tCrop, Materials.BandedIron, 100, false);
+ this.addProcess(tCrop, Materials.Pyrite, 100, false);
+ this.addProcess(tCrop, Materials.MeteoricIron, 100, false);
+ tCrop = ItemList.Crop_Drop_Nickel.get(1);
+ this.addProcess(tCrop, Materials.Nickel, 100, true);
+ this.addProcess(tCrop, Materials.Garnierite, 100, false);
+ this.addProcess(tCrop, Materials.Pentlandite, 100, false);
+ this.addProcess(tCrop, Materials.Cobaltite, 100, false);
+ this.addProcess(tCrop, Materials.Wulfenite, 100, false);
+ this.addProcess(tCrop, Materials.Powellite, 100, false);
+ tCrop = ItemList.Crop_Drop_Zinc.get(1);
+ this.addProcess(tCrop, Materials.Zinc, 100, true);
+ this.addProcess(tCrop, Materials.Sphalerite, 100, false);
+ this.addProcess(tCrop, Materials.Sulfur, 100, false);
+ tCrop = ItemList.Crop_Drop_Argentia.get(1);
+ this.addProcess(tCrop, Materials.Silver, 100, true);
+ this.addProcess(tCrop, Materials.Galena, 100, false);
+ tCrop = ItemList.Crop_Drop_Aurelia.get(1);
+ this.addProcess(tCrop, Materials.Gold, 100, true);
+ this.addProcess(tCrop, Materials.Magnetite, Materials.Gold, 100, false);
+ tCrop = ItemList.Crop_Drop_Mica.get(1);
+ this.addProcess(tCrop, Materials.Mica, 75, true);
+
+ // Rare Metals Line
+ tCrop = ItemList.Crop_Drop_Bauxite.get(1);
+ this.addProcess(tCrop, Materials.Aluminium, 60, true);
+ this.addProcess(tCrop, Materials.Bauxite, 100, false);
+ tCrop = ItemList.Crop_Drop_Manganese.get(1);
+ this.addProcess(tCrop, Materials.Manganese, 30, true);
+ this.addProcess(tCrop, Materials.Grossular, 100, false);
+ this.addProcess(tCrop, Materials.Spessartine, 100, false);
+ this.addProcess(tCrop, Materials.Pyrolusite, 100, false);
+ this.addProcess(tCrop, Materials.Tantalite, 100, false);
+ tCrop = ItemList.Crop_Drop_Ilmenite.get(1);
+ this.addProcess(tCrop, Materials.Titanium, 100, true);
+ this.addProcess(tCrop, Materials.Ilmenite, 100, false);
+ this.addProcess(tCrop, Materials.Bauxite, 100, false);
+ this.addProcess(tCrop, Materials.Rutile, 100, false);
+ tCrop = ItemList.Crop_Drop_Scheelite.get(1);
+ this.addProcess(tCrop, Materials.Scheelite, 100, true);
+ this.addProcess(tCrop, Materials.Tungstate, 100, false);
+ this.addProcess(tCrop, Materials.Lithium, 100, false);
+ this.addProcess(tCrop, Materials.Tungsten, 75, false);
+ tCrop = ItemList.Crop_Drop_Platinum.get(1);
+ this.addProcess(tCrop, Materials.Platinum, 40, true);
+ this.addProcess(tCrop, Materials.Cooperite, 40, false);
+ this.addProcess(tCrop, Materials.Palladium, 40, false);
+ this.addProcess(tCrop, Materials.Neodymium, 100, false);
+ this.addProcess(tCrop, Materials.Bastnasite, 100, false);
+ tCrop = ItemList.Crop_Drop_Iridium.get(1);
+ this.addProcess(tCrop, Materials.Iridium, 20, true);
+ tCrop = ItemList.Crop_Drop_Osmium.get(1);
+ this.addProcess(tCrop, Materials.Osmium, 20, true);
+
+ // Radioactive Line
+ tCrop = ItemList.Crop_Drop_Pitchblende.get(1);
+ this.addProcess(tCrop, Materials.Pitchblende, 50, true);
+ tCrop = ItemList.Crop_Drop_Uraninite.get(1);
+ this.addProcess(tCrop, Materials.Uraninite, 50, false);
+ this.addProcess(tCrop, Materials.Uranium, 50, true);
+ this.addProcess(tCrop, Materials.Pitchblende, 50, false);
+ this.addProcess(tCrop, Materials.Uranium235, 50, false);
+ tCrop = ItemList.Crop_Drop_Thorium.get(1);
+ this.addProcess(tCrop, Materials.Thorium, 50, true);
+ tCrop = ItemList.Crop_Drop_Naquadah.get(1);
+ this.addProcess(tCrop, Materials.Naquadah, 10, true);
+ this.addProcess(tCrop, Materials.NaquadahEnriched, 10, false);
+ this.addProcess(tCrop, Materials.Naquadria, 10, false);
+
+ // Gem Line
+ tCrop = ItemList.Crop_Drop_BobsYerUncleRanks.get(1);
+ this.addProcess(tCrop, Materials.Emerald, 100, true);
+ this.addProcess(tCrop, Materials.Beryllium, 100, false);
+ }
+
+ public void addProcess(ItemStack tCrop, Materials aMaterial, int chance, boolean aMainOutput) {
+ addProcess(tCrop, aMaterial, aMaterial, chance, aMainOutput);
+ }
+
+ public void addProcess(ItemStack tCrop, Materials aMaterial, Materials aMaterialOut, int chance,
+ boolean aMainOutput) {
+ if (tCrop == null || aMaterial == null || GT_OreDictUnificator.get(OrePrefixes.crushed, aMaterial, 1) == null)
+ return;
+ if (GT_Mod.gregtechproxy.mNerfedCrops) {
+ FluidStack fluidOutputChemReactor = aMaterialOut.mOreByProducts.isEmpty() ? null
+ : aMaterialOut.mOreByProducts.get(0)
+ .getMolten(144);
+
+ GT_RecipeBuilder recipeBuilder = GT_Values.RA.stdBuilder();
+ recipeBuilder
+ .itemInputs(
+ GT_Utility.copyAmount(9, tCrop),
+ GT_OreDictUnificator.get(OrePrefixes.crushed, aMaterial, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.crushedPurified, aMaterial, 4))
+ .fluidInputs(Materials.Water.getFluid(1000));
+ if (fluidOutputChemReactor != null) {
+ recipeBuilder.fluidOutputs(fluidOutputChemReactor);
+ }
+ recipeBuilder.duration(4 * SECONDS + 16 * TICKS)
+ .eut(24)
+ .addTo(UniversalChemical);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(16, tCrop))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.crushedPurified, aMaterial, 1))
+ .fluidInputs(Materials.UUMatter.getFluid(Math.max(1, ((aMaterial.getMass() + 9) / 10))))
+ .duration((int) (aMaterial.getMass() * 128))
+ .eut(384)
+ .addTo(autoclaveRecipes);
+
+ } else {
+ if (aMainOutput) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.copyAmount(9, tCrop))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, aMaterial, 1))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(extractorRecipes);
+ }
+ }
+ }
+
+ public void addProcess(ItemStack tCrop, Materials aMaterial, int chance) {
+ addProcess(tCrop, aMaterial, chance, true);
+ }
+
+ public void addProcess(ItemStack tCrop, Materials aMaterial, Materials aMaterialOut, int chance) {
+ addProcess(tCrop, aMaterial, aMaterialOut, chance, true);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/CuttingRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/CuttingRecipes.java
new file mode 100644
index 0000000000..dd81fd2d66
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/CuttingRecipes.java
@@ -0,0 +1,283 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.BuildCraftTransport;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.TinkerConstruct;
+import static gregtech.api.recipe.RecipeMaps.cutterRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class CuttingRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ // silicon wafer recipes
+ {
+ recipeWithClassicFluids(
+ new ItemStack[] { ItemList.Circuit_Silicon_Ingot.get(1) },
+ new ItemStack[] { ItemList.Circuit_Silicon_Wafer.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 4) },
+ 20 * SECONDS,
+ TierEU.RECIPE_LV,
+ false);
+
+ recipeWithClassicFluids(
+ new ItemStack[] { ItemList.Circuit_Silicon_Ingot2.get(1) },
+ new ItemStack[] { ItemList.Circuit_Silicon_Wafer2.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 8) },
+ 40 * SECONDS,
+ TierEU.RECIPE_MV,
+ true);
+
+ recipeWithClassicFluids(
+ new ItemStack[] { ItemList.Circuit_Silicon_Ingot3.get(1) },
+ new ItemStack[] { ItemList.Circuit_Silicon_Wafer3.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 16) },
+ 1 * MINUTES + 20 * SECONDS,
+ TierEU.RECIPE_HV,
+ true);
+
+ recipeWithClassicFluids(
+ new ItemStack[] { ItemList.Circuit_Silicon_Ingot4.get(1) },
+ new ItemStack[] { ItemList.Circuit_Silicon_Wafer4.get(64), ItemList.Circuit_Silicon_Wafer4.get(32),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 32) },
+ 2 * MINUTES,
+ TierEU.RECIPE_EV,
+ true);
+
+ recipeWithClassicFluids(
+ new ItemStack[] { ItemList.Circuit_Silicon_Ingot5.get(1) },
+ new ItemStack[] { ItemList.Circuit_Silicon_Wafer5.get(64), ItemList.Circuit_Silicon_Wafer5.get(64),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconSG, 64) },
+ 2 * MINUTES + 40 * SECONDS,
+ TierEU.RECIPE_IV,
+ true);
+
+ }
+
+ // glass pane recipes
+ {
+ // stained-glass -> glass pane recipes
+ for (int i = 0; i < 16; i++) {
+ recipeWithClassicFluids(
+ new ItemStack[] { new ItemStack(Blocks.stained_glass, 3, i) },
+ new ItemStack[] { new ItemStack(Blocks.stained_glass_pane, 8, i) },
+ 2 * SECONDS + 10 * TICKS,
+ 8,
+ false);
+
+ }
+
+ recipeWithClassicFluids(
+ new ItemStack[] { new ItemStack(Blocks.glass, 3, 0) },
+ new ItemStack[] { new ItemStack(Blocks.glass_pane, 8, 0) },
+ 2 * SECONDS + 10 * TICKS,
+ 8,
+ false);
+
+ if (TinkerConstruct.isModLoaded()) {
+ recipeWithClassicFluids(
+ new ItemStack[] { getModItem(TinkerConstruct.ID, "GlassBlock", 3L, 0) },
+ new ItemStack[] { getModItem(TinkerConstruct.ID, "GlassPane", 8L, 0) },
+ 2 * SECONDS + 10 * TICKS,
+ 8,
+ false);
+ }
+ }
+
+ // stone slab recipes
+ {
+ recipeWithClassicFluids(
+ new ItemStack[] { new ItemStack(Blocks.stone, 1, 0) },
+ new ItemStack[] { new ItemStack(Blocks.stone_slab, 2, 0) },
+ 1 * SECONDS + 5 * TICKS,
+ 8,
+ false);
+
+ recipeWithClassicFluids(
+ new ItemStack[] { new ItemStack(Blocks.sandstone, 1, 0) },
+ new ItemStack[] { new ItemStack(Blocks.stone_slab, 2, 1) },
+ 1 * SECONDS + 5 * TICKS,
+ 8,
+ false);
+
+ recipeWithClassicFluids(
+ new ItemStack[] { new ItemStack(Blocks.cobblestone, 1, 0) },
+ new ItemStack[] { new ItemStack(Blocks.stone_slab, 2, 3) },
+ 1 * SECONDS + 5 * TICKS,
+ 8,
+ false);
+
+ recipeWithClassicFluids(
+ new ItemStack[] { new ItemStack(Blocks.brick_block, 1, 0) },
+ new ItemStack[] { new ItemStack(Blocks.stone_slab, 2, 4) },
+ 1 * SECONDS + 5 * TICKS,
+ 8,
+ false);
+
+ recipeWithClassicFluids(
+ new ItemStack[] { new ItemStack(Blocks.stonebrick, 1, 0) },
+ new ItemStack[] { new ItemStack(Blocks.stone_slab, 2, 5) },
+ 1 * SECONDS + 5 * TICKS,
+ 8,
+ false);
+
+ recipeWithClassicFluids(
+ new ItemStack[] { new ItemStack(Blocks.nether_brick, 1, 0) },
+ new ItemStack[] { new ItemStack(Blocks.stone_slab, 2, 6) },
+ 1 * SECONDS + 5 * TICKS,
+ 8,
+ false);
+
+ recipeWithClassicFluids(
+ new ItemStack[] { new ItemStack(Blocks.quartz_block, 1, 32767) },
+ new ItemStack[] { new ItemStack(Blocks.stone_slab, 2, 7) },
+ 1 * SECONDS + 5 * TICKS,
+ 8,
+ false);
+ }
+
+ recipeWithClassicFluids(
+ new ItemStack[] { new ItemStack(Blocks.glowstone, 1, 0) },
+ new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Glowstone, 4) },
+ 5 * SECONDS,
+ 16,
+ false);
+
+ for (byte i = 0; i < 16; i++) {
+ recipeWithClassicFluids(
+ new ItemStack[] { new ItemStack(Blocks.wool, 1, i) },
+ new ItemStack[] { new ItemStack(Blocks.carpet, 2, i) },
+ 2 * SECONDS + 10 * TICKS,
+ 8,
+ false);
+ }
+
+ // vanilla planks recipes
+ {
+ ItemStack[] plankArray = new ItemStack[] { ItemList.Plank_Oak.get(2L), ItemList.Plank_Spruce.get(2L),
+ ItemList.Plank_Birch.get(2L), ItemList.Plank_Jungle.get(2L), ItemList.Plank_Acacia.get(2L),
+ ItemList.Plank_DarkOak.get(2L) };
+ for (int i = 0; i < 6; i++) {
+ recipeWithClassicFluids(
+ new ItemStack[] { new ItemStack(Blocks.wooden_slab, 1, i) },
+ new ItemStack[] { plankArray[i] },
+ 2 * SECONDS + 10 * TICKS,
+ 8,
+ false);
+ }
+ }
+
+ if (Forestry.isModLoaded()) {
+ ItemStack[] coverIDs = { ItemList.Plank_Larch.get(2L), ItemList.Plank_Teak.get(2L),
+ ItemList.Plank_Acacia_Green.get(2L), ItemList.Plank_Lime.get(2L), ItemList.Plank_Chestnut.get(2L),
+ ItemList.Plank_Wenge.get(2L), ItemList.Plank_Baobab.get(2L), ItemList.Plank_Sequoia.get(2L),
+ ItemList.Plank_Kapok.get(2L), ItemList.Plank_Ebony.get(2L), ItemList.Plank_Mahagony.get(2L),
+ ItemList.Plank_Balsa.get(2L), ItemList.Plank_Willow.get(2L), ItemList.Plank_Walnut.get(2L),
+ ItemList.Plank_Greenheart.get(2L), ItemList.Plank_Cherry.get(2L), ItemList.Plank_Mahoe.get(2L),
+ ItemList.Plank_Poplar.get(2L), ItemList.Plank_Palm.get(2L), ItemList.Plank_Papaya.get(2L),
+ ItemList.Plank_Pine.get(2L), ItemList.Plank_Plum.get(2L), ItemList.Plank_Maple.get(2L),
+ ItemList.Plank_Citrus.get(2L) };
+ for (int i = 0; i < coverIDs.length; i++) {
+ ItemStack slabWood = getModItem(Forestry.ID, "slabs", 1, i);
+ ItemStack slabWoodFireproof = getModItem(Forestry.ID, "slabsFireproof", 1, i);
+
+ recipeWithClassicFluids(
+ new ItemStack[] { slabWood },
+ new ItemStack[] { coverIDs[i] },
+ 2 * SECONDS,
+ 8,
+ false);
+
+ recipeWithClassicFluids(
+ new ItemStack[] { slabWoodFireproof },
+ new ItemStack[] { coverIDs[i] },
+ 2 * SECONDS,
+ 8,
+ false);
+
+ }
+ }
+
+ if (BuildCraftTransport.isModLoaded()) {
+ recipeWithClassicFluids(
+ new ItemStack[] {
+ getModItem(BuildCraftTransport.ID, "item.buildcraftPipe.pipestructurecobblestone", 1L, 0) },
+ new ItemStack[] { getModItem(BuildCraftTransport.ID, "pipePlug", 8L, 0) },
+ 1 * SECONDS + 12 * TICKS,
+ 16,
+ false);
+
+ }
+
+ }
+
+ public void recipeWithClassicFluids(ItemStack[] inputs, ItemStack[] outputs, int duration, long eut,
+ boolean cleanroomRequired) {
+ if (cleanroomRequired) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(inputs)
+ .itemOutputs(outputs)
+ .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, duration * eut / 320))))
+ .duration(2 * duration)
+ .eut(eut)
+ .requiresCleanRoom()
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(inputs)
+ .itemOutputs(outputs)
+ .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, duration * eut / 426))))
+ .duration(2 * duration)
+ .eut(eut)
+ .requiresCleanRoom()
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(inputs)
+ .itemOutputs(outputs)
+ .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, duration * eut / 1280))))
+ .duration(duration)
+ .eut(eut)
+ .requiresCleanRoom()
+ .addTo(cutterRecipes);
+ } else {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(inputs)
+ .itemOutputs(outputs)
+ .fluidInputs(Materials.Water.getFluid(Math.max(4, Math.min(1000, duration * eut / 320))))
+ .duration(2 * duration)
+ .eut(eut)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(inputs)
+ .itemOutputs(outputs)
+ .fluidInputs(GT_ModHandler.getDistilledWater(Math.max(3, Math.min(750, duration * eut / 426))))
+ .duration(2 * duration)
+ .eut(eut)
+ .addTo(cutterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(inputs)
+ .itemOutputs(outputs)
+ .fluidInputs(Materials.Lubricant.getFluid(Math.max(1, Math.min(250, duration * eut / 1280))))
+ .duration(duration)
+ .eut(eut)
+ .addTo(cutterRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/DistilleryRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/DistilleryRecipes.java
new file mode 100644
index 0000000000..6008eea927
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/DistilleryRecipes.java
@@ -0,0 +1,1280 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.TinkerConstruct;
+import static gregtech.api.recipe.RecipeMaps.distillationTowerRecipes;
+import static gregtech.api.recipe.RecipeMaps.distilleryRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.enums.MaterialsOreAlum;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_Utility;
+
+public class DistilleryRecipes implements Runnable {
+
+ @Override
+ public void run() {
+
+ distillationTowerRecipes();
+ universalDistillationTowerRecipes();
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.Creosote.getFluid(100L))
+ .fluidOutputs(Materials.Lubricant.getFluid(32L))
+ .duration(12 * SECONDS)
+ .eut(30)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.SeedOil.getFluid(32L))
+ .fluidOutputs(Materials.Lubricant.getFluid(8L))
+ .duration(4 * SECONDS)
+ .eut(30)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.FishOil.getFluid(32L))
+ .fluidOutputs(Materials.Lubricant.getFluid(8L))
+ .duration(4 * SECONDS)
+ .eut(30)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.Oil.getFluid(120L))
+ .fluidOutputs(Materials.Lubricant.getFluid(60L))
+ .duration(8 * SECONDS)
+ .eut(30)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.OilLight.getFluid(120L))
+ .fluidOutputs(Materials.Lubricant.getFluid(30L))
+ .duration(8 * SECONDS)
+ .eut(30)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.OilMedium.getFluid(120L))
+ .fluidOutputs(Materials.Lubricant.getFluid(60L))
+ .duration(8 * SECONDS)
+ .eut(30)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(Materials.OilHeavy.getFluid(120L))
+ .fluidOutputs(Materials.Lubricant.getFluid(90L))
+ .duration(8 * SECONDS)
+ .eut(30)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Biomass.getFluid(40L))
+ .fluidOutputs(Materials.Ethanol.getFluid(12L))
+ .duration(16 * TICKS)
+ .eut(24)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(5))
+ .fluidInputs(Materials.Biomass.getFluid(40L))
+ .fluidOutputs(Materials.Water.getFluid(12L))
+ .duration(16 * TICKS)
+ .eut(24)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(5))
+ .fluidInputs(Materials.Water.getFluid(5L))
+ .fluidOutputs(GT_ModHandler.getDistilledWater(5L))
+ .duration(16 * TICKS)
+ .eut(10)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(getFluidStack("potion.potatojuice", 2))
+ .fluidOutputs(getFluidStack("potion.vodka", 1))
+ .duration(16 * TICKS)
+ .eut(16)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(getFluidStack("potion.lemonade", 2))
+ .fluidOutputs(getFluidStack("potion.alcopops", 1))
+ .duration(16 * TICKS)
+ .eut(16)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(4))
+ .fluidInputs(Materials.OilLight.getFluid(300L))
+ .fluidOutputs(Materials.Oil.getFluid(100L))
+ .duration(16 * TICKS)
+ .eut(24)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(4))
+ .fluidInputs(Materials.OilMedium.getFluid(200L))
+ .fluidOutputs(Materials.Oil.getFluid(100L))
+ .duration(16 * TICKS)
+ .eut(24)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(4))
+ .fluidInputs(Materials.OilHeavy.getFluid(100L))
+ .fluidOutputs(Materials.Oil.getFluid(100L))
+ .duration(16 * TICKS)
+ .eut(24)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(MaterialsOreAlum.SluiceSand.getDust(1))
+ .fluidInputs(MaterialsOreAlum.SluiceJuice.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(500))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(6))
+ .fluidInputs(Materials.WoodTar.getFluid(200))
+ .fluidOutputs(MaterialsKevlar.IIIDimethylbenzene.getFluid(30))
+ .duration(16 * TICKS)
+ .eut(64)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(6))
+ .fluidInputs(Materials.CharcoalByproducts.getGas(200))
+ .fluidOutputs(MaterialsKevlar.IIIDimethylbenzene.getFluid(20))
+ .duration(5 * SECONDS)
+ .eut(64)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(7))
+ .fluidInputs(Materials.WoodTar.getFluid(200))
+ .fluidOutputs(MaterialsKevlar.IVDimethylbenzene.getFluid(30))
+ .duration(16 * TICKS)
+ .eut(64)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(7))
+ .fluidInputs(Materials.CharcoalByproducts.getGas(200))
+ .fluidOutputs(MaterialsKevlar.IVDimethylbenzene.getFluid(20))
+ .duration(5 * SECONDS)
+ .eut(64)
+ .addTo(distilleryRecipes);
+ // (NaCl·H2O) = NaCl + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Salt.getDust(2))
+ .fluidInputs(Materials.SaltWater.getFluid(1000))
+ .fluidOutputs(GT_ModHandler.getDistilledWater(1000))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(30)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(1))
+ .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
+ .fluidOutputs(Materials.AceticAcid.getFluid(25))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(8)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(1))
+ .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
+ .fluidOutputs(Materials.Water.getFluid(375))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(8)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(1))
+ .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
+ .fluidOutputs(Materials.Ethanol.getFluid(150))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(8)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(1))
+ .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
+ .fluidOutputs(Materials.Methanol.getFluid(150))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(8)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(1))
+ .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
+ .fluidOutputs(Materials.Ammonia.getGas(100))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(8)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(6))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(1))
+ .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(400))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(8)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(7))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(1))
+ .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
+ .fluidOutputs(Materials.Methane.getGas(600))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(8)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(17))
+ .itemOutputs(ItemList.IC2_Fertilizer.get(1))
+ .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("ic2biogas"), 1800))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(8)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Methane.getGas(1000))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("ic2biogas"), 3000))
+ .duration(8 * SECONDS)
+ .eut(8)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.HeavyFuel.getFluid(100))
+ .fluidOutputs(Materials.Benzene.getFluid(40))
+ .duration(8 * SECONDS)
+ .eut(24)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(3))
+ .fluidInputs(Materials.HeavyFuel.getFluid(100))
+ .fluidOutputs(Materials.Phenol.getFluid(25))
+ .duration(8 * SECONDS)
+ .eut(24)
+ .addTo(distilleryRecipes);
+ // Dimethylbenzene
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(5))
+ .fluidInputs(Materials.WoodTar.getFluid(200))
+ .fluidOutputs(Materials.Dimethylbenzene.getFluid(30))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(5))
+ .fluidInputs(Materials.CharcoalByproducts.getGas(200))
+ .fluidOutputs(Materials.Dimethylbenzene.getFluid(20))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(new FluidStack(ItemList.sOilExtraHeavy, 10))
+ .fluidOutputs(Materials.OilHeavy.getFluid(15))
+ .duration(16 * TICKS)
+ .eut(24)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.HeavyFuel.getFluid(10L))
+ .fluidOutputs(new FluidStack(ItemList.sToluene, 4))
+ .duration(16 * TICKS)
+ .eut(24)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(new FluidStack(ItemList.sToluene, 30))
+ .fluidOutputs(Materials.LightFuel.getFluid(30L))
+ .duration(16 * TICKS)
+ .eut(24)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("ic2biomass"), 20))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("ic2biogas"), 32))
+ .duration(2 * SECONDS)
+ .eut(16)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("ic2biomass"), 4))
+ .fluidOutputs(Materials.Water.getFluid(2))
+ .duration(4 * SECONDS)
+ .eut(30)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(getFluidStack("potion.wheatyjuice", 75))
+ .fluidOutputs(getFluidStack("potion.scotch", 1))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distilleryRecipes);
+
+ if (TinkerConstruct.isModLoaded()) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Glue.getFluid(8L))
+ .fluidOutputs(getFluidStack("glue", 8))
+ .duration(1 * TICKS)
+ .eut(24)
+ .addTo(distilleryRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(getFluidStack("glue", 8))
+ .fluidOutputs(Materials.Glue.getFluid(4L))
+ .duration(1 * TICKS)
+ .eut(24)
+ .addTo(distilleryRecipes);
+
+ }
+ }
+
+ public void distillationTowerRecipes() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.Creosote.getFluid(1000L))
+ .fluidOutputs(Materials.Lubricant.getFluid(500L))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.SeedOil.getFluid(1400L))
+ .fluidOutputs(Materials.Lubricant.getFluid(500L))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.FishOil.getFluid(1200L))
+ .fluidOutputs(Materials.Lubricant.getFluid(500L))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 2L))
+ .fluidInputs(Materials.Biomass.getFluid(1000L))
+ .fluidOutputs(Materials.Ethanol.getFluid(600L), Materials.Water.getFluid(300L))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(400)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Water.getFluid(1000L))
+ .fluidOutputs(GT_ModHandler.getDistilledWater(1000L))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.OilLight.getFluid(1000L))
+ .fluidOutputs(Materials.Lubricant.getFluid(250L))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.OilMedium.getFluid(1000L))
+ .fluidOutputs(Materials.Lubricant.getFluid(500L))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.OilHeavy.getFluid(1000L))
+ .fluidOutputs(Materials.Lubricant.getFluid(750L))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distillationTowerRecipes);
+ // C15H10N2O2(5HCl) = C15H10N2O2 + 5HCl
+
+ GT_Values.RA.stdBuilder()
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, MaterialsKevlar.DiphenylmethaneDiisocyanate, 29L))
+ .fluidInputs(MaterialsKevlar.DiphenylmethaneDiisocyanateMixture.getFluid(1000L))
+ .fluidOutputs(Materials.HydrochloricAcid.getFluid(5000L))
+ .duration(2 * MINUTES + 5 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Charcoal.getDustSmall(1))
+ .fluidInputs(Materials.CharcoalByproducts.getGas(1000))
+ .fluidOutputs(
+ Materials.WoodTar.getFluid(250),
+ Materials.WoodVinegar.getFluid(400),
+ Materials.WoodGas.getGas(250),
+ MaterialsKevlar.IIIDimethylbenzene.getFluid(100))
+ .duration(2 * SECONDS)
+ .eut(256)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.WoodTar.getFluid(1000))
+ .fluidOutputs(
+ Materials.Creosote.getFluid(250),
+ Materials.Phenol.getFluid(100),
+ Materials.Benzene.getFluid(400),
+ Materials.Toluene.getFluid(100),
+ MaterialsKevlar.IIIDimethylbenzene.getFluid(150))
+ .duration(2 * SECONDS)
+ .eut(256)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(Materials.Charcoal.getDustSmall(1))
+ .fluidInputs(Materials.CharcoalByproducts.getGas(1000))
+ .fluidOutputs(
+ Materials.WoodTar.getFluid(250),
+ Materials.WoodVinegar.getFluid(400),
+ Materials.WoodGas.getGas(250),
+ MaterialsKevlar.IVDimethylbenzene.getFluid(100))
+ .duration(2 * SECONDS)
+ .eut(256)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(Materials.Charcoal.getDustSmall(1))
+ .fluidInputs(Materials.CharcoalByproducts.getGas(1000))
+ .fluidOutputs(
+ Materials.WoodTar.getFluid(250),
+ Materials.WoodVinegar.getFluid(400),
+ Materials.WoodGas.getGas(250),
+ Materials.Dimethylbenzene.getFluid(20),
+ MaterialsKevlar.IIIDimethylbenzene.getFluid(60),
+ MaterialsKevlar.IVDimethylbenzene.getFluid(20))
+ .duration(2 * SECONDS)
+ .eut(256)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(4))
+ .fluidInputs(Materials.WoodTar.getFluid(1000))
+ .fluidOutputs(
+ Materials.Creosote.getFluid(250),
+ Materials.Phenol.getFluid(100),
+ Materials.Benzene.getFluid(400),
+ Materials.Toluene.getFluid(100),
+ Materials.Dimethylbenzene.getFluid(30),
+ MaterialsKevlar.IIIDimethylbenzene.getFluid(90),
+ MaterialsKevlar.IVDimethylbenzene.getFluid(30))
+ .duration(2 * SECONDS)
+ .eut(256)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(Materials.OilLight.getFluid(1500))
+ .fluidOutputs(
+ Materials.SulfuricHeavyFuel.getFluid(100),
+ Materials.SulfuricLightFuel.getFluid(200),
+ Materials.SulfuricNaphtha.getFluid(300),
+ MaterialsKevlar.NaphthenicAcid.getFluid(25),
+ Materials.SulfuricGas.getGas(2400))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(Materials.OilMedium.getFluid(1000))
+ .fluidOutputs(
+ Materials.SulfuricHeavyFuel.getFluid(100),
+ Materials.SulfuricLightFuel.getFluid(500),
+ Materials.SulfuricNaphtha.getFluid(1500),
+ MaterialsKevlar.NaphthenicAcid.getFluid(25),
+ Materials.SulfuricGas.getGas(600))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(Materials.Oil.getFluid(500L))
+ .fluidOutputs(
+ Materials.SulfuricHeavyFuel.getFluid(150),
+ Materials.SulfuricLightFuel.getFluid(500),
+ Materials.SulfuricNaphtha.getFluid(200),
+ MaterialsKevlar.NaphthenicAcid.getFluid(25),
+ Materials.SulfuricGas.getGas(600))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(Materials.OilHeavy.getFluid(1000))
+ .fluidOutputs(
+ Materials.SulfuricHeavyFuel.getFluid(2500),
+ Materials.SulfuricLightFuel.getFluid(450),
+ Materials.SulfuricNaphtha.getFluid(150),
+ MaterialsKevlar.NaphthenicAcid.getFluid(50),
+ Materials.SulfuricGas.getGas(600))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(distillationTowerRecipes);
+ // 9C5H12O = 4C6H14O + 5CH4O + 4C4H8
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.MTBEMixture.getGas(900L))
+ .fluidOutputs(
+ Materials.AntiKnock.getFluid(400L),
+ Materials.Methanol.getFluid(500L),
+ Materials.Butene.getGas(400L))
+ .duration(2 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemOutputs(ItemList.IC2_Fertilizer.get(1))
+ .fluidInputs(Materials.FermentedBiomass.getFluid(1000))
+ .fluidOutputs(
+ Materials.AceticAcid.getFluid(25),
+ Materials.Water.getFluid(375),
+ Materials.Ethanol.getFluid(150),
+ Materials.Methanol.getFluid(150),
+ Materials.Ammonia.getGas(100),
+ Materials.CarbonDioxide.getGas(400),
+ Materials.Methane.getGas(600))
+ .duration(3 * SECONDS + 15 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(distillationTowerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemOutputs(ItemList.IC2_Fertilizer.get(1))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("ic2biomass"), 3000))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("ic2biogas"), 8000), Materials.Water.getFluid(125L))
+ .duration(12 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(distillationTowerRecipes);
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(new FluidStack(ItemList.sOilExtraHeavy, 1000))
+ .fluidOutputs(Materials.OilHeavy.getFluid(1500))
+ .duration(16 * TICKS)
+ .eut(2400)
+ .addTo(distillationTowerRecipes);
+ }
+
+ public void universalDistillationTowerRecipes() {
+ addUniversalDistillationRecipewithCircuit(
+ Materials.WoodTar.getFluid(1000),
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(3) },
+ new FluidStack[] { Materials.Creosote.getFluid(250), Materials.Phenol.getFluid(100),
+ Materials.Benzene.getFluid(400), Materials.Toluene.getFluid(100),
+ MaterialsKevlar.IVDimethylbenzene.getFluid(150) },
+ GT_Values.NI,
+ 40,
+ 256);
+
+ addUniversalDistillationRecipewithCircuit(
+ Materials.CharcoalByproducts.getGas(1000),
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+ new FluidStack[] { Materials.WoodTar.getFluid(250), Materials.WoodVinegar.getFluid(400),
+ Materials.WoodGas.getGas(250), Materials.Dimethylbenzene.getFluid(100) },
+ Materials.Charcoal.getDustSmall(1),
+ 40,
+ 256);
+
+ addUniversalDistillationRecipewithCircuit(
+ Materials.WoodGas.getGas(1000),
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+ new FluidStack[] { Materials.CarbonDioxide.getGas(390), Materials.Ethylene.getGas(120),
+ Materials.Methane.getGas(130), Materials.CarbonMonoxide.getGas(240), Materials.Hydrogen.getGas(120) },
+ GT_Values.NI,
+ 40,
+ 256);
+ addUniversalDistillationRecipewithCircuit(
+ Materials.WoodVinegar.getFluid(1000),
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+ new FluidStack[] { Materials.AceticAcid.getFluid(100), Materials.Water.getFluid(500),
+ Materials.Ethanol.getFluid(10), Materials.Methanol.getFluid(300), Materials.Acetone.getFluid(50),
+ Materials.MethylAcetate.getFluid(10) },
+ GT_Values.NI,
+ 40,
+ 256);
+ addUniversalDistillationRecipewithCircuit(
+ Materials.WoodTar.getFluid(1000),
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+ new FluidStack[] { Materials.Creosote.getFluid(250), Materials.Phenol.getFluid(100),
+ Materials.Benzene.getFluid(400), Materials.Toluene.getFluid(100),
+ Materials.Dimethylbenzene.getFluid(150) },
+ GT_Values.NI,
+ 40,
+ 256);
+
+ addUniversalDistillationRecipewithCircuit(
+ Materials.OilLight.getFluid(150),
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+ new FluidStack[] { Materials.SulfuricHeavyFuel.getFluid(10), Materials.SulfuricLightFuel.getFluid(20),
+ Materials.SulfuricNaphtha.getFluid(30), Materials.SulfuricGas.getGas(240) },
+ null,
+ 20,
+ 96);
+ addUniversalDistillationRecipewithCircuit(
+ Materials.OilMedium.getFluid(100),
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+ new FluidStack[] { Materials.SulfuricHeavyFuel.getFluid(10), Materials.SulfuricLightFuel.getFluid(50),
+ Materials.SulfuricNaphtha.getFluid(150), Materials.SulfuricGas.getGas(60) },
+ null,
+ 20,
+ 96);
+ addUniversalDistillationRecipewithCircuit(
+ Materials.Oil.getFluid(50L),
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+ new FluidStack[] { Materials.SulfuricHeavyFuel.getFluid(15), Materials.SulfuricLightFuel.getFluid(50),
+ Materials.SulfuricNaphtha.getFluid(20), Materials.SulfuricGas.getGas(60) },
+ null,
+ 20,
+ 96);
+ addUniversalDistillationRecipewithCircuit(
+ Materials.OilHeavy.getFluid(100),
+ new ItemStack[] { GT_Utility.getIntegratedCircuit(1) },
+ new FluidStack[] { Materials.SulfuricHeavyFuel.getFluid(250), Materials.SulfuricLightFuel.getFluid(45),
+ Materials.SulfuricNaphtha.getFluid(15), Materials.SulfuricGas.getGas(60) },
+ null,
+ 20,
+ 288);
+
+ // 2 0.5HCl(Diluted) = HCl + H2O
+ addUniversalDistillationRecipe(
+ Materials.DilutedHydrochloricAcid.getFluid(2000),
+ new FluidStack[] { Materials.Water.getFluid(1000), Materials.HydrochloricAcid.getFluid(1000) },
+ GT_Values.NI,
+ 600,
+ 64);
+
+ addUniversalDistillationRecipe(
+ getFluidStack("potion.vinegar", 40),
+ new FluidStack[] { Materials.AceticAcid.getFluid(5), Materials.Water.getFluid(35) },
+ GT_Values.NI,
+ 20,
+ 64);
+
+ addUniversalDistillationRecipe(
+ Materials.CalciumAcetateSolution.getFluid(1000),
+ new FluidStack[] { Materials.Acetone.getFluid(1000), Materials.CarbonDioxide.getGas(1000) },
+ Materials.Quicklime.getDust(2),
+ 80,
+ 480);
+
+ addUniversalDistillationRecipe(
+ Materials.DilutedSulfuricAcid.getFluid(3000),
+ new FluidStack[] { Materials.SulfuricAcid.getFluid(2000), Materials.Water.getFluid(1000) },
+ GT_Values.NI,
+ 600,
+ 120);
+
+ // C3H6O = C2H2O + CH4
+ addUniversalDistillationRecipe(
+ Materials.Acetone.getFluid(1000),
+ new FluidStack[] { Materials.Ethenone.getGas(1000), Materials.Methane.getGas(1000) },
+ GT_Values.NI,
+ 80,
+ 640);
+
+ addUniversalDistillationRecipe(
+ Materials.Gas.getGas(1000),
+ new FluidStack[] { Materials.Butane.getGas(60), Materials.Propane.getGas(70), Materials.Ethane.getGas(100),
+ Materials.Methane.getGas(750), Materials.Helium.getGas(20) },
+ GT_Values.NI,
+ 240,
+ 120);
+
+ addUniversalDistillationRecipe(
+ Materials.Ethylene.getLightlyHydroCracked(1000),
+ new FluidStack[] { Materials.Ethane.getGas(1000) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Ethylene.getModeratelyHydroCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(2000) },
+ null,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Ethylene.getSeverelyHydroCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(2000), Materials.Hydrogen.getGas(2000) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Ethylene.getLightlySteamCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(1000) },
+ Materials.Carbon.getDust(1),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Ethylene.getModeratelySteamCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(1000) },
+ Materials.Carbon.getDust(1),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Ethylene.getSeverelySteamCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(1000) },
+ Materials.Carbon.getDust(1),
+ 120,
+ 120);
+
+ addUniversalDistillationRecipe(
+ Materials.Ethane.getLightlyHydroCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(2000) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Ethane.getModeratelyHydroCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(2000), Materials.Hydrogen.getGas(2000) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Ethane.getSeverelyHydroCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(2000), Materials.Hydrogen.getGas(4000) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Ethane.getLightlySteamCracked(1000),
+ new FluidStack[] { Materials.Ethylene.getGas(250), Materials.Methane.getGas(1250) },
+ Materials.Carbon.getDustSmall(1),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Ethane.getModeratelySteamCracked(1000),
+ new FluidStack[] { Materials.Ethylene.getGas(125), Materials.Methane.getGas(1375) },
+ Materials.Carbon.getDustTiny(6),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Ethane.getSeverelySteamCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(1500) },
+ Materials.Carbon.getDustSmall(2),
+ 120,
+ 120);
+
+ addUniversalDistillationRecipe(
+ Materials.Propene.getLightlyHydroCracked(1000),
+ new FluidStack[] { Materials.Propane.getGas(500), Materials.Ethylene.getGas(500),
+ Materials.Methane.getGas(500) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Propene.getModeratelyHydroCracked(1000),
+ new FluidStack[] { Materials.Ethane.getGas(1000), Materials.Methane.getGas(1000) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Propene.getSeverelyHydroCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(3000) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Propene.getLightlySteamCracked(1000),
+ new FluidStack[] { Materials.Ethylene.getGas(1000), Materials.Methane.getGas(500) },
+ Materials.Carbon.getDustSmall(2),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Propene.getModeratelySteamCracked(1000),
+ new FluidStack[] { Materials.Ethylene.getGas(750), Materials.Methane.getGas(750) },
+ Materials.Carbon.getDustSmall(3),
+ 180,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Propene.getSeverelySteamCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(1500) },
+ Materials.Carbon.getDustSmall(6),
+ 180,
+ 120);
+
+ addUniversalDistillationRecipe(
+ Materials.Propane.getLightlyHydroCracked(1000),
+ new FluidStack[] { Materials.Ethane.getGas(1000), Materials.Methane.getGas(1000) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Propane.getModeratelyHydroCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(3000) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Propane.getSeverelyHydroCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(3000), Materials.Hydrogen.getGas(2000) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Propane.getLightlySteamCracked(1000),
+ new FluidStack[] { Materials.Ethylene.getGas(750), Materials.Methane.getGas(1250) },
+ Materials.Carbon.getDustTiny(2),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Propane.getModeratelySteamCracked(1000),
+ new FluidStack[] { Materials.Ethylene.getGas(500), Materials.Methane.getGas(1500) },
+ Materials.Carbon.getDustSmall(1),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Propane.getSeverelySteamCracked(1000),
+ new FluidStack[] { Materials.Ethylene.getGas(250), Materials.Methane.getGas(1750) },
+ Materials.Carbon.getDustTiny(4),
+ 120,
+ 120);
+
+ addUniversalDistillationRecipe(
+ Materials.Butadiene.getLightlyHydroCracked(1000),
+ new FluidStack[] { Materials.Butene.getGas(667), Materials.Ethylene.getGas(667) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butadiene.getModeratelyHydroCracked(1000),
+ new FluidStack[] { Materials.Butane.getGas(223), Materials.Propene.getGas(223),
+ Materials.Ethane.getGas(400), Materials.Ethylene.getGas(445), Materials.Methane.getGas(223) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butadiene.getSeverelyHydroCracked(1000),
+ new FluidStack[] { Materials.Propane.getGas(260), Materials.Ethane.getGas(926),
+ Materials.Ethylene.getGas(389), Materials.Methane.getGas(2667) },
+ GT_Values.NI,
+ 112,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butadiene.getLightlySteamCracked(1000),
+ new FluidStack[] { Materials.Propene.getGas(750), Materials.Ethylene.getGas(188),
+ Materials.Methane.getGas(188) },
+ Materials.Carbon.getDustSmall(3),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butadiene.getModeratelySteamCracked(1000),
+ new FluidStack[] { Materials.Propene.getGas(125), Materials.Ethylene.getGas(1125),
+ Materials.Methane.getGas(188) },
+ Materials.Carbon.getDustSmall(3),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butadiene.getSeverelySteamCracked(1000),
+ new FluidStack[] { Materials.Propene.getGas(125), Materials.Ethylene.getGas(188),
+ Materials.Methane.getGas(1125) },
+ Materials.Carbon.getDust(1),
+ 120,
+ 120);
+
+ addUniversalDistillationRecipe(
+ Materials.Butene.getLightlyHydroCracked(1000),
+ new FluidStack[] { Materials.Butane.getGas(334), Materials.Propene.getGas(334),
+ Materials.Ethane.getGas(334), Materials.Ethylene.getGas(334), Materials.Methane.getGas(334) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butene.getModeratelyHydroCracked(1000),
+ new FluidStack[] { Materials.Propane.getGas(389), Materials.Ethane.getGas(556),
+ Materials.Ethylene.getGas(334), Materials.Methane.getGas(1056) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butene.getSeverelyHydroCracked(1000),
+ new FluidStack[] { Materials.Ethane.getGas(1000), Materials.Methane.getGas(2000) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butene.getLightlySteamCracked(1000),
+ new FluidStack[] { Materials.Propene.getGas(750), Materials.Ethylene.getGas(500),
+ Materials.Methane.getGas(250) },
+ Materials.Carbon.getDustSmall(1),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butene.getModeratelySteamCracked(1000),
+ new FluidStack[] { Materials.Propene.getGas(200), Materials.Ethylene.getGas(1300),
+ Materials.Methane.getGas(400) },
+ Materials.Carbon.getDustSmall(1),
+ 192,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butene.getSeverelySteamCracked(1000),
+ new FluidStack[] { Materials.Propene.getGas(125), Materials.Ethylene.getGas(313),
+ Materials.Methane.getGas(1500) },
+ Materials.Carbon.getDustSmall(6),
+ 120,
+ 120);
+
+ addUniversalDistillationRecipe(
+ Materials.Butane.getLightlyHydroCracked(1000),
+ new FluidStack[] { Materials.Propane.getGas(667), Materials.Ethane.getGas(667),
+ Materials.Methane.getGas(667) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butane.getModeratelyHydroCracked(1000),
+ new FluidStack[] { Materials.Ethane.getGas(1000), Materials.Methane.getGas(2000) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butane.getSeverelyHydroCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(1000) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butane.getLightlySteamCracked(1000),
+ new FluidStack[] { Materials.Propane.getGas(750), Materials.Ethane.getGas(125),
+ Materials.Ethylene.getGas(125), Materials.Methane.getGas(1063) },
+ Materials.Carbon.getDustTiny(2),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butane.getModeratelySteamCracked(1000),
+ new FluidStack[] { Materials.Propane.getGas(125), Materials.Ethane.getGas(750),
+ Materials.Ethylene.getGas(750), Materials.Methane.getGas(438) },
+ Materials.Carbon.getDustTiny(2),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Butane.getSeverelySteamCracked(1000),
+ new FluidStack[] { Materials.Propane.getGas(125), Materials.Ethane.getGas(125),
+ Materials.Ethylene.getGas(125), Materials.Methane.getGas(2000) },
+ Materials.Carbon.getDustTiny(11),
+ 120,
+ 120);
+
+ addUniversalDistillationRecipe(
+ Materials.Gas.getLightlyHydroCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(1300), Materials.Hydrogen.getGas(1500),
+ Materials.Helium.getGas(100) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Gas.getModeratelyHydroCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(1400), Materials.Hydrogen.getGas(3000),
+ Materials.Helium.getGas(150) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Gas.getSeverelyHydroCracked(1000),
+ new FluidStack[] { Materials.Methane.getGas(1500), Materials.Hydrogen.getGas(4000),
+ Materials.Helium.getGas(200) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Gas.getLightlySteamCracked(1000),
+ new FluidStack[] { Materials.Propene.getGas(50), Materials.Ethane.getGas(10),
+ Materials.Ethylene.getGas(100), Materials.Methane.getGas(500), Materials.Helium.getGas(50) },
+ Materials.Carbon.getDustTiny(1),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Gas.getModeratelySteamCracked(1000),
+ new FluidStack[] { Materials.Propene.getGas(10), Materials.Ethane.getGas(50),
+ Materials.Ethylene.getGas(200), Materials.Methane.getGas(600), Materials.Helium.getGas(70) },
+ Materials.Carbon.getDustTiny(1),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Gas.getSeverelySteamCracked(1000),
+ new FluidStack[] { Materials.Propene.getGas(10), Materials.Ethane.getGas(10),
+ Materials.Ethylene.getGas(300), Materials.Methane.getGas(700), Materials.Helium.getGas(100) },
+ Materials.Carbon.getDustTiny(1),
+ 120,
+ 120);
+
+ addUniversalDistillationRecipe(
+ Materials.Naphtha.getLightlyHydroCracked(1000),
+ new FluidStack[] { Materials.Butane.getGas(800), Materials.Propane.getGas(300),
+ Materials.Ethane.getGas(250), Materials.Methane.getGas(250) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Naphtha.getModeratelyHydroCracked(1000),
+ new FluidStack[] { Materials.Butane.getGas(200), Materials.Propane.getGas(1100),
+ Materials.Ethane.getGas(400), Materials.Methane.getGas(400) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Naphtha.getSeverelyHydroCracked(1000),
+ new FluidStack[] { Materials.Butane.getGas(125), Materials.Propane.getGas(125),
+ Materials.Ethane.getGas(1500), Materials.Methane.getGas(1500) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Naphtha.getLightlySteamCracked(1000),
+ new FluidStack[] { Materials.HeavyFuel.getFluid(75), Materials.LightFuel.getFluid(150),
+ Materials.Toluene.getFluid(40), Materials.Benzene.getFluid(150), Materials.Butene.getGas(80),
+ Materials.Butadiene.getGas(150), Materials.Propane.getGas(15), Materials.Propene.getGas(200),
+ Materials.Ethane.getGas(35), Materials.Ethylene.getGas(200), Materials.Methane.getGas(200) },
+ Materials.Carbon.getDustTiny(1),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Naphtha.getModeratelySteamCracked(1000),
+ new FluidStack[] { Materials.HeavyFuel.getFluid(50), Materials.LightFuel.getFluid(100),
+ Materials.Toluene.getFluid(30), Materials.Benzene.getFluid(125), Materials.Butene.getGas(65),
+ Materials.Butadiene.getGas(100), Materials.Propane.getGas(30), Materials.Propene.getGas(400),
+ Materials.Ethane.getGas(50), Materials.Ethylene.getGas(350), Materials.Methane.getGas(350) },
+ Materials.Carbon.getDustTiny(2),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.Naphtha.getSeverelySteamCracked(1000),
+ new FluidStack[] { Materials.HeavyFuel.getFluid(25), Materials.LightFuel.getFluid(50),
+ Materials.Toluene.getFluid(20), Materials.Benzene.getFluid(100), Materials.Butene.getGas(50),
+ Materials.Butadiene.getGas(50), Materials.Propane.getGas(15), Materials.Propene.getGas(300),
+ Materials.Ethane.getGas(65), Materials.Ethylene.getGas(500), Materials.Methane.getGas(500) },
+ Materials.Carbon.getDustTiny(3),
+ 120,
+ 120);
+
+ addUniversalDistillationRecipe(
+ Materials.LightFuel.getLightlyHydroCracked(1000),
+ new FluidStack[] { Materials.Naphtha.getFluid(800), Materials.Octane.getFluid(100),
+ Materials.Butane.getGas(150), Materials.Propane.getGas(200), Materials.Ethane.getGas(125),
+ Materials.Methane.getGas(125) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.LightFuel.getModeratelyHydroCracked(1000),
+ new FluidStack[] { Materials.Naphtha.getFluid(500), Materials.Octane.getFluid(50),
+ Materials.Butane.getGas(200), Materials.Propane.getGas(1100), Materials.Ethane.getGas(400),
+ Materials.Methane.getGas(400) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.LightFuel.getSeverelyHydroCracked(1000),
+ new FluidStack[] { Materials.Naphtha.getFluid(200), Materials.Octane.getFluid(20),
+ Materials.Butane.getGas(125), Materials.Propane.getGas(125), Materials.Ethane.getGas(1500),
+ Materials.Methane.getGas(1500) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.LightFuel.getLightlySteamCracked(1000),
+ new FluidStack[] { Materials.HeavyFuel.getFluid(150), Materials.Naphtha.getFluid(400),
+ Materials.Toluene.getFluid(40), Materials.Benzene.getFluid(200), Materials.Butene.getGas(75),
+ Materials.Butadiene.getGas(60), Materials.Propane.getGas(20), Materials.Propene.getGas(150),
+ Materials.Ethane.getGas(10), Materials.Ethylene.getGas(50), Materials.Methane.getGas(50) },
+ Materials.Carbon.getDustTiny(1),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.LightFuel.getModeratelySteamCracked(1000),
+ new FluidStack[] { Materials.HeavyFuel.getFluid(100), Materials.Naphtha.getFluid(250),
+ Materials.Toluene.getFluid(50), Materials.Benzene.getFluid(300), Materials.Butene.getGas(90),
+ Materials.Butadiene.getGas(75), Materials.Propane.getGas(35), Materials.Propene.getGas(200),
+ Materials.Ethane.getGas(30), Materials.Ethylene.getGas(150), Materials.Methane.getGas(150) },
+ Materials.Carbon.getDustTiny(2),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.LightFuel.getSeverelySteamCracked(1000),
+ new FluidStack[] { Materials.HeavyFuel.getFluid(50), Materials.Naphtha.getFluid(100),
+ Materials.Toluene.getFluid(30), Materials.Benzene.getFluid(150), Materials.Butene.getGas(65),
+ Materials.Butadiene.getGas(50), Materials.Propane.getGas(50), Materials.Propene.getGas(250),
+ Materials.Ethane.getGas(50), Materials.Ethylene.getGas(250), Materials.Methane.getGas(250) },
+ Materials.Carbon.getDustTiny(3),
+ 120,
+ 120);
+
+ addUniversalDistillationRecipe(
+ Materials.HeavyFuel.getLightlyHydroCracked(1000),
+ new FluidStack[] { Materials.LightFuel.getFluid(600), Materials.Naphtha.getFluid(100),
+ Materials.Butane.getGas(100), Materials.Propane.getGas(100), Materials.Ethane.getGas(75),
+ Materials.Methane.getGas(75) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.HeavyFuel.getModeratelyHydroCracked(1000),
+ new FluidStack[] { Materials.LightFuel.getFluid(400), Materials.Naphtha.getFluid(400),
+ Materials.Butane.getGas(150), Materials.Propane.getGas(150), Materials.Ethane.getGas(100),
+ Materials.Methane.getGas(100) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.HeavyFuel.getSeverelyHydroCracked(1000),
+ new FluidStack[] { Materials.LightFuel.getFluid(200), Materials.Naphtha.getFluid(250),
+ Materials.Butane.getGas(300), Materials.Propane.getGas(300), Materials.Ethane.getGas(175),
+ Materials.Methane.getGas(175) },
+ GT_Values.NI,
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.HeavyFuel.getLightlySteamCracked(1000),
+ new FluidStack[] { Materials.LightFuel.getFluid(300), Materials.Naphtha.getFluid(50),
+ Materials.Toluene.getFluid(25), Materials.Benzene.getFluid(125), Materials.Butene.getGas(25),
+ Materials.Butadiene.getGas(15), Materials.Propane.getGas(3), Materials.Propene.getGas(30),
+ Materials.Ethane.getGas(5), Materials.Ethylene.getGas(50), Materials.Methane.getGas(50) },
+ Materials.Carbon.getDustTiny(1),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.HeavyFuel.getModeratelySteamCracked(1000),
+ new FluidStack[] { Materials.LightFuel.getFluid(200), Materials.Naphtha.getFluid(200),
+ Materials.Toluene.getFluid(40), Materials.Benzene.getFluid(200), Materials.Butene.getGas(40),
+ Materials.Butadiene.getGas(25), Materials.Propane.getGas(5), Materials.Propene.getGas(50),
+ Materials.Ethane.getGas(7), Materials.Ethylene.getGas(75), Materials.Methane.getGas(75) },
+ Materials.Carbon.getDustTiny(2),
+ 120,
+ 120);
+ addUniversalDistillationRecipe(
+ Materials.HeavyFuel.getSeverelySteamCracked(1000),
+ new FluidStack[] { Materials.LightFuel.getFluid(100), Materials.Naphtha.getFluid(125),
+ Materials.Toluene.getFluid(80), Materials.Benzene.getFluid(400), Materials.Butene.getGas(80),
+ Materials.Butadiene.getGas(50), Materials.Propane.getGas(10), Materials.Propene.getGas(100),
+ Materials.Ethane.getGas(15), Materials.Ethylene.getGas(150), Materials.Methane.getGas(150) },
+ Materials.Carbon.getDustTiny(3),
+ 120,
+ 120);
+
+ if (GregTech_API.sSpecialFile.get("general", "EnableLagencyOilGalactiCraft", false)
+ && FluidRegistry.getFluid("oilgc") != null)
+ addUniversalDistillationRecipe(
+ new FluidStack(FluidRegistry.getFluid("oilgc"), 50),
+ new FluidStack[] { Materials.SulfuricHeavyFuel.getFluid(15), Materials.SulfuricLightFuel.getFluid(50),
+ Materials.SulfuricNaphtha.getFluid(20), Materials.SulfuricGas.getGas(60) },
+ null,
+ 20,
+ 96);
+ }
+
+ public void addUniversalDistillationRecipewithCircuit(FluidStack aInput, ItemStack[] aCircuit,
+ FluidStack[] aOutputs, ItemStack aOutput2, int aDuration, int aEUt) {
+ for (int i = 0; i < Math.min(aOutputs.length, 11); i++) {
+ GT_RecipeBuilder buildDistillation = GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(i + 1));
+ if (aOutput2 != GT_Values.NI) {
+ buildDistillation.itemOutputs(aOutput2);
+ }
+ buildDistillation.fluidInputs(aInput)
+ .fluidOutputs(aOutputs[i])
+ .duration(2 * aDuration)
+ .eut(aEUt / 4)
+ .addTo(distilleryRecipes);
+ }
+ GT_RecipeBuilder buildDT = GT_Values.RA.stdBuilder()
+ .itemInputs(aCircuit);
+ if (aOutput2 != GT_Values.NI) {
+ buildDT.itemOutputs(aOutput2);
+ }
+ buildDT.fluidInputs(aInput)
+ .fluidOutputs(aOutputs)
+ .duration(aDuration)
+ .eut(aEUt)
+ .addTo(distillationTowerRecipes);
+ }
+
+ public void addUniversalDistillationRecipe(FluidStack aInput, FluidStack[] aOutputs, ItemStack aOutput2,
+ int aDuration, int aEUt) {
+ for (int i = 0; i < Math.min(aOutputs.length, 11); i++) {
+ GT_RecipeBuilder buildDistillation = GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(i + 1));
+ if (aOutput2 != GT_Values.NI) {
+ buildDistillation.itemOutputs(aOutput2);
+ }
+ buildDistillation.fluidInputs(aInput)
+ .fluidOutputs(aOutputs[i])
+ .duration(2 * aDuration)
+ .eut(aEUt / 4)
+ .addTo(distilleryRecipes);
+ }
+ GT_RecipeBuilder buildDT = GT_Values.RA.stdBuilder();
+ if (aOutput2 != GT_Values.NI) {
+ buildDT.itemOutputs(aOutput2);
+ }
+ buildDT.fluidInputs(aInput)
+ .fluidOutputs(aOutputs)
+ .duration(aDuration)
+ .eut(aEUt)
+ .addTo(distillationTowerRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ElectrolyzerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ElectrolyzerRecipes.java
new file mode 100644
index 0000000000..efcfa7e3dc
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/ElectrolyzerRecipes.java
@@ -0,0 +1,301 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.electrolyzerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class ElectrolyzerRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ // H2O = 2H + O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1), ItemList.Cell_Empty.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
+ .fluidInputs(Materials.Water.getFluid(1000L))
+ .fluidOutputs(Materials.Hydrogen.getGas(2000L))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2), ItemList.Cell_Empty.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
+ .fluidInputs(GT_ModHandler.getDistilledWater(1000L))
+ .fluidOutputs(Materials.Hydrogen.getGas(2000L))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(3), ItemList.Cell_Empty.get(2L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2L))
+ .fluidInputs(Materials.Water.getFluid(1000L))
+ .fluidOutputs(Materials.Oxygen.getGas(1000L))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(4), ItemList.Cell_Empty.get(2L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2L))
+ .fluidInputs(GT_ModHandler.getDistilledWater(1000L))
+ .fluidOutputs(Materials.Oxygen.getGas(1000L))
+ .duration(1 * MINUTES + 40 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("electrolyzedWaterCell", 1L), ItemList.Cell_Empty.get(2L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("electrolyzedWaterCell", 1L), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
+ .fluidOutputs(Materials.Hydrogen.getGas(2000L))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1L))
+ .itemOutputs(GT_ModHandler.getIC2Item("electrolyzedWaterCell", 1L))
+ .duration(1 * MINUTES + 13 * SECONDS + 10 * TICKS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Dye_Bonemeal.get(3L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcium, 1L))
+ .duration(4 * SECONDS + 18 * TICKS)
+ .eut(26)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.sand, 8, 0))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3L))
+ .duration(25 * SECONDS)
+ .eut(25)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.sand, 8, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SiliconDioxide, 3L))
+ .duration(25 * SECONDS)
+ .eut(25)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 4))
+ .duration(5 * SECONDS)
+ .eut(64)
+ .addTo(electrolyzerRecipes);
+ // ZnS = Zn + S + 1 Ga(9.17%)
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sphalerite, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gallium, 1))
+ .outputChances(10000, 10000, 917)
+ .duration(10 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+ // IC2 Fertilizer = H2O + CaCO3 + C
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Fertilizer.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Calcite, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1L))
+ .fluidOutputs(Materials.Water.getFluid(1000L))
+ .duration(5 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+ // NaOH = Na + O + H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumHydroxide.getDust(3), Materials.Empty.getCells(1))
+ .itemOutputs(Materials.Sodium.getDust(1), Materials.Hydrogen.getCells(1))
+ .outputChances(10000, 10000)
+ .fluidOutputs(Materials.Oxygen.getGas(1000))
+ .duration(50 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Carbon.getDust(1))
+ .fluidInputs(Materials.CarbonDioxide.getGas(1000))
+ .fluidOutputs(Materials.Oxygen.getGas(2000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(11), Materials.Empty.getCells(2))
+ .itemOutputs(Materials.Carbon.getDust(1), Materials.Oxygen.getCells(2))
+ .fluidInputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(electrolyzerRecipes);
+ // SO2 = S + 2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Sulfur.getDust(1))
+ .fluidInputs(Materials.SulfurDioxide.getGas(1000))
+ .fluidOutputs(Materials.Oxygen.getGas(2000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(11), Materials.Empty.getCells(2))
+ .itemOutputs(Materials.Sulfur.getDust(1), Materials.Oxygen.getCells(2))
+ .fluidInputs(Materials.SulfurDioxide.getGas(1000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(electrolyzerRecipes);
+ // NaCl = Na +Cl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Salt.getDust(2))
+ .itemOutputs(Materials.Sodium.getDust(1))
+ .fluidOutputs(Materials.Chlorine.getGas(1000))
+ .duration(16 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+ // (NaCl·H2O)= NaOH + H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.SodiumHydroxide.getDust(3), Materials.Hydrogen.getCells(1))
+ .fluidInputs(Materials.SaltWater.getFluid(1000))
+ .fluidOutputs(Materials.Chlorine.getGas(1000))
+ .duration(36 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.SodiumHydroxide.getDust(3), Materials.Chlorine.getCells(1))
+ .fluidInputs(Materials.SaltWater.getFluid(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(1000))
+ .duration(36 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+ // HCl = H + Cl
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Hydrogen.getCells(1))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Chlorine.getGas(1000))
+ .duration(36 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Chlorine.getCells(1))
+ .fluidInputs(Materials.HydrochloricAcid.getFluid(1000))
+ .fluidOutputs(Materials.Hydrogen.getGas(1000))
+ .duration(36 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Hydrogen.getCells(1))
+ .fluidOutputs(Materials.Chlorine.getGas(1000))
+ .duration(36 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.HydrochloricAcid.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.Chlorine.getCells(1))
+ .fluidOutputs(Materials.Hydrogen.getGas(1000))
+ .duration(36 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+ // 2NaHSO4 = 2H + Na2S2O8
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.SodiumBisulfate.getDust(14), Materials.Empty.getCells(2))
+ .itemOutputs(Materials.Hydrogen.getCells(2))
+ .fluidOutputs(Materials.SodiumPersulfate.getFluid(1000))
+ .duration(30 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lead, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 4))
+ .fluidInputs(new FluidStack(ItemList.sLeadZincSolution, 8000))
+ .fluidOutputs(Materials.Water.getFluid(2000))
+ .duration(15 * SECONDS)
+ .eut(192)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Cell_Empty.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
+ .fluidInputs(new FluidStack(ItemList.sBlueVitriol, 2000))
+ .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
+ .duration(45 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Cell_Empty.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
+ .fluidInputs(new FluidStack(ItemList.sNickelSulfate, 2000))
+ .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
+ .duration(45 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Cell_Empty.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1))
+ .fluidInputs(new FluidStack(ItemList.sGreenVitriol, 2000))
+ .fluidOutputs(Materials.SulfuricAcid.getFluid(1000))
+ .duration(45 * SECONDS)
+ .eut(30)
+ .addTo(electrolyzerRecipes);
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ElectromagneticSeparatorRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ElectromagneticSeparatorRecipes.java
new file mode 100644
index 0000000000..d9031ac64f
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/ElectromagneticSeparatorRecipes.java
@@ -0,0 +1,34 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.electroMagneticSeparatorRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsOreAlum;
+import gregtech.api.enums.TierEU;
+
+public class ElectromagneticSeparatorRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(MaterialsOreAlum.SluiceSand.getDust(1))
+ .itemOutputs(Materials.Iron.getDust(1), Materials.Neodymium.getDust(1), Materials.Chrome.getDust(1))
+ .outputChances(4000, 2000, 2000)
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV / 2)
+ .addTo(electroMagneticSeparatorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.TengamRaw.getDust(1))
+ .itemOutputs(
+ Materials.TengamPurified.getDust(1),
+ Materials.NeodymiumMagnetic.getDust(1),
+ Materials.SamariumMagnetic.getDust(1))
+ .outputChances(10000, 1000, 1000)
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(electroMagneticSeparatorRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ExtractorRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ExtractorRecipes.java
new file mode 100644
index 0000000000..e26c4fef97
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/ExtractorRecipes.java
@@ -0,0 +1,48 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.extractorRecipes;
+import static gregtech.api.util.GT_ModHandler.getIC2Item;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.WILDCARD;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class ExtractorRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ addExtractionRecipe(new ItemStack(Blocks.bookshelf, 1, WILDCARD), new ItemStack(Items.book, 3, 0));
+ addExtractionRecipe(
+ new ItemStack(Items.slime_ball, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 2L));
+ addExtractionRecipe(
+ ItemList.IC2_Resin.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 3L));
+ addExtractionRecipe(
+ getIC2Item("rubberSapling", 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 1L));
+ addExtractionRecipe(
+ getIC2Item("rubberLeaves", 16L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RawRubber, 1L));
+
+ addExtractionRecipe(ItemList.Cell_Air.get(1L), ItemList.Cell_Empty.get(1L));
+ }
+
+ public void addExtractionRecipe(ItemStack input, ItemStack output) {
+ output = GT_OreDictUnificator.get(true, output);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(input)
+ .itemOutputs(output)
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(extractorRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ExtruderRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ExtruderRecipes.java
new file mode 100644
index 0000000000..e52ad3d4fb
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/ExtruderRecipes.java
@@ -0,0 +1,29 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.extruderRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+
+public class ExtruderRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ // wax capsule
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.FR_Wax.get(1L), ItemList.Shape_Extruder_Cell.get(0L))
+ .itemOutputs(ItemList.FR_WaxCapsule.get(1L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(extruderRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.FR_RefractoryWax.get(1L), ItemList.Shape_Extruder_Cell.get(0L))
+ .itemOutputs(ItemList.FR_RefractoryCapsule.get(1L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(16)
+ .addTo(extruderRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FermenterRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FermenterRecipes.java
new file mode 100644
index 0000000000..c0954fda18
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/FermenterRecipes.java
@@ -0,0 +1,294 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.fermentingRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
+
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+
+public class FermenterRecipes implements Runnable {
+
+ @Override
+ public void run() {
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Biomass.getFluid(100))
+ .fluidOutputs(Materials.FermentedBiomass.getFluid(100))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("ic2biomass"), 100))
+ .fluidOutputs(Materials.FermentedBiomass.getFluid(100))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("milk", 50))
+ .fluidOutputs(getFluidStack("potion.mundane", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.lemonjuice", 50))
+ .fluidOutputs(getFluidStack("potion.limoncello", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.applejuice", 50))
+ .fluidOutputs(getFluidStack("potion.cider", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.goldenapplejuice", 50))
+ .fluidOutputs(getFluidStack("potion.goldencider", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.idunsapplejuice", 50))
+ .fluidOutputs(getFluidStack("potion.notchesbrew", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.reedwater", 50))
+ .fluidOutputs(getFluidStack("potion.rum", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.rum", 50))
+ .fluidOutputs(getFluidStack("potion.piratebrew", 10))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.grapejuice", 50))
+ .fluidOutputs(getFluidStack("potion.wine", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.wine", 50))
+ .fluidOutputs(getFluidStack("potion.vinegar", 10))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.scotch", 50))
+ .fluidOutputs(getFluidStack("potion.glenmckenner", 10))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.wheatyhopsjuice", 50))
+ .fluidOutputs(getFluidStack("potion.beer", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.hopsjuice", 50))
+ .fluidOutputs(getFluidStack("potion.darkbeer", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.darkbeer", 50))
+ .fluidOutputs(getFluidStack("potion.dragonblood", 10))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.beer", 75))
+ .fluidOutputs(getFluidStack("potion.vinegar", 50))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.cider", 75))
+ .fluidOutputs(getFluidStack("potion.vinegar", 50))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.goldencider", 75))
+ .fluidOutputs(getFluidStack("potion.vinegar", 50))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.rum", 75))
+ .fluidOutputs(getFluidStack("potion.vinegar", 50))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.wine", 75))
+ .fluidOutputs(getFluidStack("potion.vinegar", 50))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.awkward", 50))
+ .fluidOutputs(getFluidStack("potion.weakness", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.mundane", 50))
+ .fluidOutputs(getFluidStack("potion.weakness", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.thick", 50))
+ .fluidOutputs(getFluidStack("potion.weakness", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.poison", 50))
+ .fluidOutputs(getFluidStack("potion.damage", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.health", 50))
+ .fluidOutputs(getFluidStack("potion.damage", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.waterbreathing", 50))
+ .fluidOutputs(getFluidStack("potion.damage", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.nightvision", 50))
+ .fluidOutputs(getFluidStack("potion.invisibility", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.fireresistance", 50))
+ .fluidOutputs(getFluidStack("potion.slowness", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.speed", 50))
+ .fluidOutputs(getFluidStack("potion.slowness", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.strength", 50))
+ .fluidOutputs(getFluidStack("potion.weakness", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.regen", 50))
+ .fluidOutputs(getFluidStack("potion.poison", 25))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.poison.strong", 50))
+ .fluidOutputs(getFluidStack("potion.damage.strong", 10))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.health.strong", 50))
+ .fluidOutputs(getFluidStack("potion.damage.strong", 10))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.nightvision.long", 50))
+ .fluidOutputs(getFluidStack("potion.invisibility.long", 10))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.regen.strong", 50))
+ .fluidOutputs(getFluidStack("potion.poison.strong", 10))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.fireresistance.long", 50))
+ .fluidOutputs(getFluidStack("potion.slowness.long", 10))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.speed.long", 50))
+ .fluidOutputs(getFluidStack("potion.slowness.long", 10))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.strength.long", 50))
+ .fluidOutputs(getFluidStack("potion.weakness.long", 10))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(getFluidStack("potion.regen.long", 50))
+ .fluidOutputs(getFluidStack("potion.poison.long", 10))
+ .duration(1 * MINUTES + 42 * SECONDS + 8 * TICKS)
+ .eut(2)
+ .addTo(fermentingRecipes);
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FluidCannerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FluidCannerRecipes.java
new file mode 100644
index 0000000000..ea2b87996f
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/FluidCannerRecipes.java
@@ -0,0 +1,93 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+
+public class FluidCannerRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Battery_Hull_LV.get(1))
+ .itemOutputs(ItemList.IC2_ReBattery.get(1))
+ .fluidInputs(Materials.Redstone.getMolten(288))
+ .duration(4)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Battery_Hull_LV.get(1))
+ .itemOutputs(ItemList.Battery_SU_LV_Mercury.getWithCharge(1, Integer.MAX_VALUE))
+ .fluidInputs(Materials.Mercury.getFluid(1000))
+ .duration(16)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Battery_Hull_MV.get(1))
+ .itemOutputs(ItemList.Battery_SU_MV_Mercury.getWithCharge(1, Integer.MAX_VALUE))
+ .fluidInputs(Materials.Mercury.getFluid(4000))
+ .duration(64)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Battery_Hull_HV.get(1))
+ .itemOutputs(ItemList.Battery_SU_HV_Mercury.getWithCharge(1, Integer.MAX_VALUE))
+ .fluidInputs(Materials.Mercury.getFluid(16000))
+ .duration(258)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Battery_Hull_LV.get(1))
+ .itemOutputs(ItemList.Battery_SU_LV_SulfuricAcid.getWithCharge(1, Integer.MAX_VALUE))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .duration(16)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Battery_Hull_MV.get(1))
+ .itemOutputs(ItemList.Battery_SU_MV_SulfuricAcid.getWithCharge(1, Integer.MAX_VALUE))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(4000))
+ .duration(64)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Battery_Hull_HV.get(1))
+ .itemOutputs(ItemList.Battery_SU_HV_SulfuricAcid.getWithCharge(1, Integer.MAX_VALUE))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(16000))
+ .duration(258)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.TF_Vial_FieryTears.get(1))
+ .itemOutputs(ItemList.Bottle_Empty.get(1))
+ .fluidOutputs(Materials.FierySteel.getFluid(250))
+ .duration(4)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Spray_Color_Remover_Empty.get(1))
+ .fluidInputs(Materials.Acetone.getFluid(4000))
+ .itemOutputs(ItemList.Spray_Color_Remover.get(1))
+ .duration(74)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Spray_Color_Remover.get(1))
+ .itemOutputs(ItemList.Spray_Color_Remover_Empty.get(1))
+ .fluidOutputs(Materials.Acetone.getFluid(4000))
+ .duration(74)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FluidExtractorRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FluidExtractorRecipes.java
new file mode 100644
index 0000000000..11861a9618
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/FluidExtractorRecipes.java
@@ -0,0 +1,569 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.BartWorks;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.recipe.RecipeMaps.fluidExtractionRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.recipe.RecipeCategories;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class FluidExtractorRecipes implements Runnable {
+
+ @Override
+ public void run() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Dye_SquidInk.get(1L))
+ .fluidOutputs(getFluidStack("squidink", 144))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Dye_Indigo.get(1L))
+ .fluidOutputs(getFluidStack("indigo", 144))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_Indigo.get(1L))
+ .fluidOutputs(getFluidStack("indigo", 144))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_MilkWart.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Milk, 1L))
+ .outputChances(1000)
+ .fluidOutputs(GT_ModHandler.getMilk(150L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_OilBerry.get(1L))
+ .fluidOutputs(Materials.Oil.getFluid(100L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_UUMBerry.get(1L))
+ .fluidOutputs(Materials.UUMatter.getFluid(4L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_UUABerry.get(1L))
+ .fluidOutputs(Materials.UUAmplifier.getFluid(4L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.fish, 1, 0))
+ .fluidOutputs(Materials.FishOil.getFluid(40L))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.fish, 1, 1))
+ .fluidOutputs(Materials.FishOil.getFluid(60L))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.fish, 1, 2))
+ .fluidOutputs(Materials.FishOil.getFluid(70L))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.fish, 1, 3))
+ .fluidOutputs(Materials.FishOil.getFluid(30L))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.coal, 1, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 1L))
+ .outputChances(1000)
+ .fluidOutputs(Materials.WoodTar.getFluid(100L))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 1L))
+ .itemOutputs(ItemList.IC2_Plantball.get(1L))
+ .outputChances(100)
+ .fluidOutputs(Materials.Creosote.getFluid(5L))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HydratedCoal, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L))
+ .outputChances(10000)
+ .fluidOutputs(Materials.Water.getFluid(100L))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Thaumcraft.ID, "ItemResource", 1, 3))
+ .fluidOutputs(Materials.Mercury.getFluid(1000L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Mercury, 1L))
+ .fluidOutputs(Materials.Mercury.getFluid(1000L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Monazite, 1L))
+ .fluidOutputs(Materials.Helium.getGas(200L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(64)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(IndustrialCraft2.ID, "blockAlloyGlass", 1L, 0))
+ .fluidOutputs(Materials.ReinforceGlass.getMolten(144))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(NewHorizonsCoreMod.ID, "item.ReinforcedGlassPlate", 1L, 0))
+ .fluidOutputs(Materials.ReinforceGlass.getMolten(72))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(NewHorizonsCoreMod.ID, "item.ReinforcedGlassLense", 1L, 0))
+ .fluidOutputs(Materials.ReinforceGlass.getMolten(54))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Long_Distance_Pipeline_Fluid.get(1L))
+ .fluidOutputs(Materials.Steel.getMolten(19 * 144))
+ .duration(20 * SECONDS)
+ .eut(90)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Long_Distance_Pipeline_Item.get(1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Steel, 7L))
+ .outputChances(10000)
+ .fluidOutputs(Materials.Tin.getMolten(12 * 144))
+ .duration(20 * SECONDS)
+ .eut(90)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Long_Distance_Pipeline_Fluid_Pipe.get(4L))
+ .fluidOutputs(Materials.Steel.getMolten(189))
+ .duration(2 * SECONDS)
+ .eut(90)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Long_Distance_Pipeline_Item_Pipe.get(16L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 3L))
+ .outputChances(10000)
+ .fluidOutputs(Materials.Steel.getMolten(324))
+ .duration(20 * SECONDS)
+ .eut(90)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("TritiumCell", 1))
+ .itemOutputs(GT_ModHandler.getIC2Item("fuelRod", 1))
+ .outputChances(10000)
+ .fluidOutputs(Materials.Tritium.getGas(32))
+ .duration(16 * TICKS)
+ .eut(64)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Quartzite, 1L))
+ .fluidOutputs(Materials.Glass.getMolten(72))
+ .duration(30 * SECONDS)
+ .eut(28)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 0))
+ .fluidOutputs(Materials.Iron.getMolten(288))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 1))
+ .fluidOutputs(Materials.Iron.getMolten(144))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 6))
+ .outputChances(10000)
+ .fluidOutputs(Materials.Bronze.getMolten(1728))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 13))
+ .fluidOutputs(Materials.Steel.getMolten(288))
+ .duration(20 * SECONDS)
+ .eut(90)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 14))
+ .fluidOutputs(Materials.Steel.getMolten(144))
+ .duration(20 * SECONDS)
+ .eut(90)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 15))
+ .fluidOutputs(Materials.Steel.getMolten(1836))
+ .duration(20 * SECONDS)
+ .eut(90)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 0))
+ .fluidOutputs(Materials.Aluminium.getMolten(288))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 1))
+ .fluidOutputs(Materials.Aluminium.getMolten(144))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 12L))
+ .outputChances(10000)
+ .fluidOutputs(Materials.Aluminium.getMolten(108L))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 3))
+ .fluidOutputs(Materials.StainlessSteel.getMolten(288))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 4))
+ .fluidOutputs(Materials.StainlessSteel.getMolten(144))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 5))
+ .fluidOutputs(Materials.StainlessSteel.getMolten(1836))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 6))
+ .fluidOutputs(Materials.Titanium.getMolten(288))
+ .duration(35 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 7))
+ .fluidOutputs(Materials.Titanium.getMolten(144))
+ .duration(35 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 8))
+ .fluidOutputs(Materials.Titanium.getMolten(1836))
+ .duration(35 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 9))
+ .fluidOutputs(Materials.TungstenSteel.getMolten(288))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 10))
+ .fluidOutputs(Materials.TungstenSteel.getMolten(144))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 11))
+ .fluidOutputs(Materials.TungstenSteel.getMolten(1836))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 12))
+ .fluidOutputs(Materials.Palladium.getMolten(288))
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 13))
+ .fluidOutputs(Materials.Palladium.getMolten(144))
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 14))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Chrome, 6L))
+ .outputChances(10000)
+ .fluidOutputs(Materials.NiobiumTitanium.getMolten(1728))
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 0))
+ .fluidOutputs(Materials.Iridium.getMolten(288))
+ .duration(50 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 1))
+ .fluidOutputs(Materials.Iridium.getMolten(144))
+ .duration(50 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 2))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iridium, 6L))
+ .outputChances(10000)
+ .fluidOutputs(Materials.Enderium.getMolten(1728))
+ .duration(50 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 3))
+ .fluidOutputs(Materials.Osmium.getMolten(288))
+ .duration(55 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 4))
+ .fluidOutputs(Materials.Osmium.getMolten(144))
+ .duration(55 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 5))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Osmium, 6L))
+ .outputChances(10000)
+ .fluidOutputs(Materials.Naquadah.getMolten(1728))
+ .duration(55 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 6))
+ .fluidOutputs(Materials.Neutronium.getMolten(288))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 7))
+ .fluidOutputs(Materials.Neutronium.getMolten(144))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 8))
+ .fluidOutputs(Materials.Neutronium.getMolten(1836))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .recipeCategory(RecipeCategories.fluidExtractorRecycling)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.wheat_seeds, 1, 32767))
+ .fluidOutputs(Materials.SeedOil.getFluid(10))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(2)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.melon_seeds, 1, 32767))
+ .fluidOutputs(Materials.SeedOil.getFluid(10))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(2)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.pumpkin_seeds, 1, 32767))
+ .fluidOutputs(Materials.SeedOil.getFluid(10))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(2)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Crop_Drop_Rape.get(1))
+ .fluidOutputs(Materials.SeedOil.getFluid(125))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(2)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.snowball, 1, 0))
+ .fluidOutputs(Materials.Water.getFluid(250L))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.snow, 1, 0))
+ .fluidOutputs(Materials.Water.getFluid(1000L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 1L))
+ .fluidOutputs(Materials.Ice.getSolid(1000L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidExtractionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Forestry.ID, "phosphor", 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1L))
+ .outputChances(1000)
+ .fluidOutputs(Materials.Lava.getFluid(800L))
+ .duration(12 * SECONDS + 16 * TICKS)
+ .eut(128)
+ .addTo(fluidExtractionRecipes);
+
+ // Beecombs fluid extractor recipes
+ if (BartWorks.isModLoaded()) {
+ // xenon
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 134))
+ .fluidOutputs(getFluidStack("xenon", 250))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(fluidExtractionRecipes);
+
+ // neon
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 135))
+ .fluidOutputs(getFluidStack("neon", 250))
+ .duration(15 * TICKS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(fluidExtractionRecipes);
+
+ // krpton
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(GregTech.ID, "gt.comb", 1L, 136))
+ .fluidOutputs(getFluidStack("krypton", 250))
+ .duration(1 * SECONDS + 5 * TICKS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(fluidExtractionRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FluidHeaterRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FluidHeaterRecipes.java
new file mode 100644
index 0000000000..b9cdfc4aa3
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/FluidHeaterRecipes.java
@@ -0,0 +1,95 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.fluidHeaterRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+
+public class FluidHeaterRecipes implements Runnable {
+
+ @Override
+ public void run() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.GrowthMediumRaw.getFluid(1000))
+ .fluidOutputs(Materials.GrowthMediumSterilized.getFluid(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(fluidHeaterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.BioMediumRaw.getFluid(1000))
+ .fluidOutputs(Materials.BioMediumSterilized.getFluid(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(fluidHeaterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Water.getFluid(6))
+ .fluidOutputs(Materials.Water.getGas(960))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(30)
+ .addTo(fluidHeaterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(GT_ModHandler.getDistilledWater(6))
+ .fluidOutputs(Materials.Water.getGas(960))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(30)
+ .addTo(fluidHeaterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.SeedOil.getFluid(16))
+ .fluidOutputs(Materials.FryingOilHot.getFluid(16))
+ .duration(16 * TICKS)
+ .eut(30)
+ .addTo(fluidHeaterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.FishOil.getFluid(16))
+ .fluidOutputs(Materials.FryingOilHot.getFluid(16))
+ .duration(16 * TICKS)
+ .eut(30)
+ .addTo(fluidHeaterRecipes);
+ // Ca(CH3COO)2 = CH3COCH3 + CaO + CO2
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.CalciumAcetateSolution.getFluid(1000))
+ .fluidOutputs(Materials.Acetone.getFluid(1000))
+ .duration(4 * SECONDS)
+ .eut(30)
+ .addTo(fluidHeaterRecipes);
+ // Fluid Sodium
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Sodium.getDust(1))
+ .fluidInputs(
+
+ )
+ .fluidOutputs(Materials.Sodium.getFluid(1000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(fluidHeaterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Acetone.getFluid(1000))
+ .fluidOutputs(Materials.Ethenone.getGas(1000))
+ .duration(8 * SECONDS)
+ .eut(160)
+ .addTo(fluidHeaterRecipes);
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FluidSolidifierRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FluidSolidifierRecipes.java
new file mode 100644
index 0000000000..2d52f9eb69
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/FluidSolidifierRecipes.java
@@ -0,0 +1,577 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.recipe.RecipeMaps.fluidSolidifierRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.INGOTS;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class FluidSolidifierRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ Materials[] materialArray = new Materials[] { Materials.Iron, Materials.WroughtIron, Materials.Gold,
+ Materials.Bronze, Materials.Copper, Materials.AnnealedCopper, Materials.Tin, Materials.Lead,
+ Materials.Steel };
+
+ ItemStack[] materialCasing = new ItemStack[] { ItemList.IC2_Item_Casing_Iron.get(1L),
+ ItemList.IC2_Item_Casing_Iron.get(1L), ItemList.IC2_Item_Casing_Gold.get(1L),
+ ItemList.IC2_Item_Casing_Bronze.get(1L), ItemList.IC2_Item_Casing_Copper.get(1L),
+ ItemList.IC2_Item_Casing_Copper.get(1L), ItemList.IC2_Item_Casing_Tin.get(1L),
+ ItemList.IC2_Item_Casing_Lead.get(1L), ItemList.IC2_Item_Casing_Steel.get(1L) };
+
+ for (int i = 0; i < materialArray.length; i++) {
+ if (materialArray[i].mStandardMoltenFluid == null) {
+ continue;
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Casing.get(0L))
+ .itemOutputs(materialCasing[i])
+ .fluidInputs(materialArray[i].getMolten(72L))
+ .duration(16 * TICKS)
+ .eut(8)
+ .addTo(fluidSolidifierRecipes);
+ }
+
+ {
+ ItemStack flask = ItemList.VOLUMETRIC_FLASK.get(1);
+ NBTTagCompound nbtFlask = new NBTTagCompound();
+ nbtFlask.setInteger("Capacity", 1000);
+ flask.setTagCompound(nbtFlask);
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Ball.get(0))
+ .itemOutputs(flask)
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("molten.borosilicateglass"), 144))
+ .duration(2 * SECONDS + 4 * TICKS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(fluidSolidifierRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
+ .itemOutputs(getModItem(Thaumcraft.ID, "ItemResource", 1, 3))
+ .fluidInputs(Materials.Mercury.getFluid(1000L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Mercury, 1L))
+ .fluidInputs(Materials.Mercury.getFluid(1000L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
+ .itemOutputs(new ItemStack(Items.snowball, 1, 0))
+ .fluidInputs(Materials.Water.getFluid(250L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
+ .itemOutputs(new ItemStack(Items.snowball, 1, 0))
+ .fluidInputs(GT_ModHandler.getDistilledWater(250L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Block.get(0L))
+ .itemOutputs(new ItemStack(Blocks.snow, 1, 0))
+ .fluidInputs(Materials.Water.getFluid(1000L))
+ .duration(25 * SECONDS + 12 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Block.get(0L))
+ .itemOutputs(new ItemStack(Blocks.snow, 1, 0))
+ .fluidInputs(GT_ModHandler.getDistilledWater(1000L))
+ .duration(25 * SECONDS + 12 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Block.get(0L))
+ .itemOutputs(new ItemStack(Blocks.obsidian, 1, 0))
+ .fluidInputs(Materials.Lava.getFluid(1000L))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Block.get(0L))
+ .itemOutputs(new ItemStack(GregTech_API.sBlockConcretes, 1, 8))
+ .fluidInputs(Materials.Concrete.getMolten(144L))
+ .duration(12 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Block.get(0L))
+ .itemOutputs(new ItemStack(Blocks.glowstone, 1, 0))
+ .fluidInputs(Materials.Glowstone.getMolten(576L))
+ .duration(12 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Block.get(0L))
+ .itemOutputs(new ItemStack(Blocks.glass, 1, 0))
+ .fluidInputs(Materials.Glass.getMolten(144L))
+ .duration(12 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Plate.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Glass, 1L))
+ .fluidInputs(Materials.Glass.getMolten(144L))
+ .duration(12 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Bottle.get(0L))
+ .itemOutputs(ItemList.Bottle_Empty.get(1L))
+ .fluidInputs(Materials.Glass.getMolten(144L))
+ .duration(12 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Cylinder.get(0L))
+ .itemOutputs(ItemList.Food_Cheese.get(1L))
+ .fluidInputs(Materials.Milk.getFluid(250L))
+ .duration(51 * SECONDS + 4 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Cylinder.get(0L))
+ .itemOutputs(ItemList.Food_Cheese.get(1L))
+ .fluidInputs(Materials.Cheese.getMolten(144L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(8)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Anvil.get(0L))
+ .itemOutputs(new ItemStack(Blocks.anvil, 1, 0))
+ .fluidInputs(Materials.Iron.getMolten(4464L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(16)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Anvil.get(0L))
+ .itemOutputs(new ItemStack(Blocks.anvil, 1, 0))
+ .fluidInputs(Materials.WroughtIron.getMolten(4464L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(16)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Boron.getDust(1))
+ .fluidInputs(Materials.Boron.getMolten(144L))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(30)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Cylinder.get(0))
+ .itemOutputs(ItemList.Circuit_Parts_PetriDish.get(1))
+ .fluidInputs(Materials.Polytetrafluoroethylene.getMolten(36))
+ .duration(8 * SECONDS)
+ .eut(16)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Cylinder.get(0))
+ .itemOutputs(ItemList.Circuit_Parts_PetriDish.get(1))
+ .fluidInputs(Materials.Polystyrene.getMolten(36))
+ .duration(8 * SECONDS)
+ .eut(16)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Cylinder.get(0))
+ .itemOutputs(ItemList.Circuit_Parts_PetriDish.get(1))
+ .fluidInputs(Materials.BorosilicateGlass.getMolten(72))
+ .duration(8 * SECONDS)
+ .eut(16)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Plate.get(0L))
+ .itemOutputs(getModItem(NewHorizonsCoreMod.ID, "item.ReinforcedGlassPlate", 1L, 0))
+ .fluidInputs(Materials.ReinforceGlass.getMolten(72))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Block.get(0L))
+ .itemOutputs(getModItem(IndustrialCraft2.ID, "blockAlloyGlass", 1L))
+ .fluidInputs(Materials.ReinforceGlass.getMolten(144))
+ .duration(8 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
+ .itemOutputs(ItemList.Circuit_Parts_Glass_Tube.get(1))
+ .fluidInputs(Materials.Glass.getMolten(144))
+ .duration(10 * SECONDS)
+ .eut(24)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
+ .itemOutputs(ItemList.Circuit_Parts_Reinforced_Glass_Tube.get(1))
+ .fluidInputs(Materials.ReinforceGlass.getMolten(288))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
+ .itemOutputs(ItemList.Circuit_Parts_Glass_Tube.get(1))
+ .fluidInputs(getFluidStack("glass.molten", 1000))
+ .duration(10 * SECONDS)
+ .eut(24)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Ball.get(0L))
+ .itemOutputs(ItemList.GelledToluene.get(1))
+ .fluidInputs(new FluidStack(ItemList.sToluene, 100))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Nugget.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Copper, 1L))
+ .fluidInputs(Materials.AnnealedCopper.getMolten(16))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Ingot.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Copper, 1L))
+ .fluidInputs(Materials.AnnealedCopper.getMolten(144))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Block.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, Materials.Copper, 1L))
+ .fluidInputs(Materials.AnnealedCopper.getMolten(1296))
+ .duration(14 * SECONDS + 8 * TICKS)
+ .eut(8)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Nugget.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 1L))
+ .fluidInputs(Materials.WroughtIron.getMolten(16))
+ .duration(16 * TICKS)
+ .eut(4)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Ingot.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L))
+ .fluidInputs(Materials.WroughtIron.getMolten(144))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Block.get(0L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.block, Materials.Iron, 1L))
+ .fluidInputs(Materials.WroughtIron.getMolten(1296))
+ .duration(14 * SECONDS + 8 * TICKS)
+ .eut(8)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Spinneret.get(0L))
+ .itemOutputs(ItemList.KevlarFiber.get(8L))
+ .fluidInputs(MaterialsKevlar.LiquidCrystalKevlar.getFluid(144L))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Mold_Anvil.get(0L))
+ .itemOutputs(getModItem(Railcraft.ID, "anvil", 1L, 0))
+ .fluidInputs(Materials.Steel.getMolten(4464L))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(16)
+ .addTo(fluidSolidifierRecipes);
+
+ final int whiteDwarfShapeSolidifierTime = 10 * SECONDS;
+ final int fluidPerShapeSolidifierRecipe = 4 * INGOTS;
+ {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Bottle.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Bottle.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Plate.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Plate.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Cell.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Cell.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Ring.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Ring.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Rod.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Rod.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Bolt.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Bolt.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Ingot.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Ingot.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Wire.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Wire.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Casing.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Casing.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Pipe_Tiny.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Pipe_Tiny.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Pipe_Small.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Pipe_Small.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Pipe_Medium.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Pipe_Medium.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Pipe_Large.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Pipe_Large.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Pipe_Huge.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Pipe_Huge.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Block.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Block.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Sword.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Sword.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Pickaxe.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Pickaxe.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Shovel.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Shovel.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Axe.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Axe.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Hoe.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Hoe.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Hammer.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Hammer.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_File.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_File.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Saw.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Saw.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Gear.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Gear.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Rotor.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Rotor.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Turbine_Blade.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Turbine_Blade.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_Small_Gear.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_Small_Gear.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Shape_Extruder_ToolHeadDrill.get(1))
+ .itemOutputs(ItemList.White_Dwarf_Shape_Extruder_ToolHeadDrill.get(1))
+ .fluidInputs(MaterialsUEVplus.WhiteDwarfMatter.getMolten(fluidPerShapeSolidifierRecipe))
+ .duration(whiteDwarfShapeSolidifierTime)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(fluidSolidifierRecipes);
+
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ForgeHammerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ForgeHammerRecipes.java
new file mode 100644
index 0000000000..49ad1154c7
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/ForgeHammerRecipes.java
@@ -0,0 +1,158 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.HardcoreEnderExpansion;
+import static gregtech.api.recipe.RecipeMaps.hammerRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class ForgeHammerRecipes implements Runnable {
+
+ @Override
+ public void run() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.stonebrick, 1, 0))
+ .itemOutputs(new ItemStack(Blocks.stonebrick, 1, 2))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.stone, 1, 0))
+ .itemOutputs(new ItemStack(Blocks.cobblestone, 1, 0))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.cobblestone, 1, 0))
+ .itemOutputs(new ItemStack(Blocks.gravel, 1, 0))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.gravel, 1, 0))
+ .itemOutputs(new ItemStack(Blocks.sand, 1, 0))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.sandstone, 1, 32767))
+ .itemOutputs(new ItemStack(Blocks.sand, 1, 0))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.ice, 1, 0))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 1))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.packed_ice, 1, 0))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ice, 2))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.brick_block, 1, 0))
+ .itemOutputs(new ItemStack(Items.brick, 3, 0))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.nether_brick, 1, 0))
+ .itemOutputs(new ItemStack(Items.netherbrick, 3, 0))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.stained_glass, 1, 32767))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 1))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.glass, 1, 32767))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 1))
+ .duration(10 * TICKS)
+ .eut(10)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.stained_glass_pane, 1, 32767))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.glass_pane, 1, 32767))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Brick.getIngots(1))
+ .itemOutputs(Materials.Brick.getDustSmall(1))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Firebrick.get(1))
+ .itemOutputs(Materials.Brick.getDust(1))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Firebricks.get(1))
+ .itemOutputs(ItemList.Firebrick.get(3))
+ .duration(10 * TICKS)
+ .eut(16)
+ .addTo(hammerRecipes);
+
+ if (GTPlusPlus.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Tesseract.get(1L), getModItem(GTPlusPlus.ID, "MU-metaitem.01", 1, 32105))
+ .fluidInputs(MaterialsUEVplus.SpaceTime.getMolten(2880L))
+ .fluidOutputs(MaterialsUEVplus.Space.getMolten(1440L), MaterialsUEVplus.Time.getMolten(1440L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_UXV)
+ .addTo(hammerRecipes);
+ }
+
+ if (HardcoreEnderExpansion.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(HardcoreEnderExpansion.ID, "endium_ore", 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.HeeEndium, 1))
+ .duration(16)
+ .eut(10)
+ .addTo(hammerRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FormingPressRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FormingPressRecipes.java
new file mode 100644
index 0000000000..80a34561e6
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/FormingPressRecipes.java
@@ -0,0 +1,196 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.BuildCraftSilicon;
+import static gregtech.api.recipe.RecipeMaps.formingPressRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class FormingPressRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ if (BuildCraftSilicon.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+ getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
+ .itemOutputs(getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 1))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+ getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
+ .itemOutputs(getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 1))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Gold, 1L),
+ getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
+ .itemOutputs(getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 2))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Diamond, 1L),
+ getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
+ .itemOutputs(getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 3))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.EnderPearl, 1L),
+ getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
+ .itemOutputs(getModItem(BuildCraftSilicon.ID, "redstoneChipset", 2L, 4))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NetherQuartz, 1L),
+ getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
+ .itemOutputs(getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 5))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Items.comparator, 1, 32767),
+ getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 0))
+ .itemOutputs(getModItem(BuildCraftSilicon.ID, "redstoneChipset", 1L, 6))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(formingPressRecipes);
+ }
+
+ if (AppliedEnergistics2.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10),
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 0L, 13))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 16))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CertusQuartz, 1L),
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 0L, 13))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 16))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Diamond, 1L),
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 0L, 14))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 17))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Gold, 1L),
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 0L, 15))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 18))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.SiliconSG, 1L),
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 0L, 19))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 20))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(formingPressRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Dough_Sugar.get(4L), ItemList.Shape_Mold_Cylinder.get(0L))
+ .itemOutputs(ItemList.Food_Raw_Cake.get(1L))
+ .duration(19 * SECONDS + 4 * TICKS)
+ .eut(4)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.glass, 1, 32767), ItemList.Shape_Mold_Arrow.get(0L))
+ .itemOutputs(ItemList.Arrow_Head_Glass_Emtpy.get(1L))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(4)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Cupronickel, 1L),
+ ItemList.Shape_Mold_Credit.get(0L))
+ .itemOutputs(ItemList.Credit_Greg_Cupronickel.get(4L))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Brass, 1L),
+ ItemList.Shape_Mold_Credit.get(0L))
+ .itemOutputs(ItemList.Coin_Doge.get(4L))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L),
+ ItemList.Shape_Mold_Credit.get(0L))
+ .itemOutputs(ItemList.Credit_Iron.get(4L))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L),
+ ItemList.Shape_Mold_Credit.get(0L))
+ .itemOutputs(ItemList.Credit_Iron.get(4L))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(formingPressRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brick, 1L),
+ ItemList.Shape_Mold_Ingot.get(0L))
+ .itemOutputs(new ItemStack(Items.brick, 1, 0))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(formingPressRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FuelRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FuelRecipes.java
new file mode 100644
index 0000000000..2c3c979b11
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/FuelRecipes.java
@@ -0,0 +1,127 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.ForbiddenMagic;
+import static gregtech.api.enums.Mods.TaintedMagic;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.enums.Mods.ThaumicTinkerer;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_TYPE;
+import static gregtech.api.util.GT_RecipeConstants.FUEL_VALUE;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_RecipeConstants;
+
+public class FuelRecipes implements Runnable {
+
+ // todo: add an enum for the fuel type, int values are mysterious
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("biogasCell", 1L))
+ .metadata(FUEL_VALUE, 40)
+ .metadata(FUEL_TYPE, 1)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.golden_apple, 1, 1))
+ .itemOutputs(new ItemStack(Items.apple, 1))
+ .metadata(FUEL_VALUE, 6400)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Thaumcraft.ID, "ItemShard", 1L, 6))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(ForbiddenMagic.ID, "GluttonyShard", 1L))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(ForbiddenMagic.ID, "FMResource", 1L, 3))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L, 1))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L, 2))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L, 3))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L, 4))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L, 5))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(ForbiddenMagic.ID, "NetherShard", 1L, 6))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(TaintedMagic.ID, "ItemMaterial", 1L, 3))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(TaintedMagic.ID, "ItemMaterial", 1L, 4))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(TaintedMagic.ID, "ItemMaterial", 1L, 5))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(ThaumicTinkerer.ID, "kamiResource", 1L, 6))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(ThaumicTinkerer.ID, "kamiResource", 1L, 7))
+ .metadata(FUEL_VALUE, 720)
+ .metadata(FUEL_TYPE, 5)
+ .addTo(GT_RecipeConstants.Fuel);
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/FusionReactorRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/FusionReactorRecipes.java
new file mode 100644
index 0000000000..bbe10d89f6
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/FusionReactorRecipes.java
@@ -0,0 +1,296 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.fusionRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeConstants.FUSION_THRESHOLD;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TierEU;
+
+public class FusionReactorRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ // Fusion tiering -T1 32768EU/t -T2 65536EU/t - T3 131073EU/t
+ // Fusion with margin 32700 65450 131000
+ // Startup max 160M EU 320M EU 640M EU
+ // Fluid input,Fluid input,Fluid output,ticks,EU/t,Startup
+ // F FT2, FT3 - fusion tier required, + - requires different startup recipe (startup cost bigger than
+ // available on the tier)
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Lithium.getMolten(16), Materials.Tungsten.getMolten(16))
+ .fluidOutputs(Materials.Iridium.getMolten(16))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(TierEU.RECIPE_LuV)
+ .metadata(FUSION_THRESHOLD, 300000000)
+ .addTo(fusionRecipes); // FT1+ - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Deuterium.getGas(125), Materials.Tritium.getGas(125))
+ .fluidOutputs(Materials.Helium.getPlasma(125))
+ .duration(16 * TICKS)
+ .eut(4096)
+ .metadata(FUSION_THRESHOLD, 40000000)
+ .addTo(fusionRecipes); // FT1 Cheap - farmable
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Deuterium.getGas(125), Materials.Helium_3.getGas(125))
+ .fluidOutputs(Materials.Helium.getPlasma(125))
+ .duration(16 * TICKS)
+ .eut(2048)
+ .metadata(FUSION_THRESHOLD, 60000000)
+ .addTo(fusionRecipes); // FT1 Expensive //
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Aluminium.getMolten(16), Materials.Lithium.getMolten(16))
+ .fluidOutputs(Materials.Sulfur.getPlasma(144))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(10240)
+ .metadata(FUSION_THRESHOLD, 240000000)
+ .addTo(fusionRecipes); // FT1+ Cheap
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Beryllium.getMolten(16), Materials.Deuterium.getGas(375))
+ .fluidOutputs(Materials.Nitrogen.getPlasma(125))
+ .duration(16 * TICKS)
+ .eut(16384)
+ .metadata(FUSION_THRESHOLD, 180000000)
+ .addTo(fusionRecipes); // FT1+ Expensive //
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Silicon.getMolten(16), Materials.Magnesium.getMolten(16))
+ .fluidOutputs(Materials.Iron.getPlasma(144))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8192)
+ .metadata(FUSION_THRESHOLD, 360000000)
+ .addTo(fusionRecipes); // FT1++ Cheap //
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Potassium.getMolten(16), Materials.Fluorine.getGas(144))
+ .fluidOutputs(Materials.Nickel.getPlasma(144))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_LuV)
+ .metadata(FUSION_THRESHOLD, 480000000)
+ .addTo(fusionRecipes); // FT1++ Expensive //
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Beryllium.getMolten(16), Materials.Tungsten.getMolten(16))
+ .fluidOutputs(Materials.Platinum.getMolten(16))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(TierEU.RECIPE_LuV)
+ .metadata(FUSION_THRESHOLD, 150000000)
+ .addTo(fusionRecipes); // FT1 - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Neodymium.getMolten(16), Materials.Hydrogen.getGas(48))
+ .fluidOutputs(Materials.Europium.getMolten(16))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(24576)
+ .metadata(FUSION_THRESHOLD, 150000000)
+ .addTo(fusionRecipes); // FT1 - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Lutetium.getMolten(16), Materials.Chrome.getMolten(16))
+ .fluidOutputs(Materials.Americium.getMolten(16))
+ .duration(4 * SECONDS + 16 * TICKS)
+ .eut(49152)
+ .metadata(FUSION_THRESHOLD, 200000000)
+ .addTo(fusionRecipes); // FT2 - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Plutonium.getMolten(16), Materials.Thorium.getMolten(16))
+ .fluidOutputs(Materials.Naquadah.getMolten(16))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(TierEU.RECIPE_LuV)
+ .metadata(FUSION_THRESHOLD, 300000000)
+ .addTo(fusionRecipes); // FT1+ - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Americium.getMolten(144), Materials.Naquadria.getMolten(144))
+ .fluidOutputs(Materials.Neutronium.getMolten(144))
+ .duration(12 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .metadata(FUSION_THRESHOLD, 640000000)
+ .addTo(fusionRecipes); // FT3 - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Glowstone.getMolten(16), Materials.Helium.getPlasma(4))
+ .fluidOutputs(Materials.Sunnarium.getMolten(16))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(TierEU.RECIPE_IV)
+ .metadata(FUSION_THRESHOLD, 40000000)
+ .addTo(fusionRecipes); // Mark 1 Expensive
+ // //
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Tungsten.getMolten(16), Materials.Helium.getGas(16))
+ .fluidOutputs(Materials.Osmium.getMolten(16))
+ .duration(12 * SECONDS + 16 * TICKS)
+ .eut(24578)
+ .metadata(FUSION_THRESHOLD, 150000000)
+ .addTo(fusionRecipes); // FT1 - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Manganese.getMolten(16), Materials.Hydrogen.getGas(16))
+ .fluidOutputs(Materials.Iron.getMolten(16))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(8192)
+ .metadata(FUSION_THRESHOLD, 120000000)
+ .addTo(fusionRecipes); // FT1 - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Magnesium.getMolten(128), Materials.Oxygen.getGas(128))
+ .fluidOutputs(Materials.Calcium.getPlasma(16))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(8192)
+ .metadata(FUSION_THRESHOLD, 120000000)
+ .addTo(fusionRecipes); //
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Mercury.getFluid(16), Materials.Magnesium.getMolten(16))
+ .fluidOutputs(Materials.Uranium.getMolten(16))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(49152)
+ .metadata(FUSION_THRESHOLD, 240000000)
+ .addTo(fusionRecipes); // FT2 - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Gold.getMolten(16), Materials.Aluminium.getMolten(16))
+ .fluidOutputs(Materials.Uranium.getMolten(16))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(49152)
+ .metadata(FUSION_THRESHOLD, 240000000)
+ .addTo(fusionRecipes); // FT2 - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Uranium.getMolten(16), Materials.Helium.getGas(16))
+ .fluidOutputs(Materials.Plutonium.getMolten(16))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(49152)
+ .metadata(FUSION_THRESHOLD, 480000000)
+ .addTo(fusionRecipes); // FT2+ - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Vanadium.getMolten(16), Materials.Hydrogen.getGas(125))
+ .fluidOutputs(Materials.Chrome.getMolten(16))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(24576)
+ .metadata(FUSION_THRESHOLD, 140000000)
+ .addTo(fusionRecipes); // FT1 - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Gallium.getMolten(16), Materials.Radon.getGas(125))
+ .fluidOutputs(Materials.Duranium.getMolten(16))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16384)
+ .metadata(FUSION_THRESHOLD, 140000000)
+ .addTo(fusionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Titanium.getMolten(48), Materials.Duranium.getMolten(32))
+ .fluidOutputs(Materials.Tritanium.getMolten(16))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(TierEU.RECIPE_LuV)
+ .metadata(FUSION_THRESHOLD, 200000000)
+ .addTo(fusionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Tantalum.getMolten(16), Materials.Tritium.getGas(16))
+ .fluidOutputs(Materials.Tungsten.getMolten(16))
+ .duration(16 * TICKS)
+ .eut(24576)
+ .metadata(FUSION_THRESHOLD, 200000000)
+ .addTo(fusionRecipes); //
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Silver.getMolten(16), Materials.Lithium.getMolten(16))
+ .fluidOutputs(Materials.Indium.getMolten(16))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(24576)
+ .metadata(FUSION_THRESHOLD, 380000000)
+ .addTo(fusionRecipes); //
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Copper.getMolten(72), Materials.Tritium.getGas(250))
+ .fluidOutputs(Materials.Zinc.getPlasma(72))
+ .duration(16 * TICKS)
+ .eut(49152)
+ .metadata(FUSION_THRESHOLD, 180000000)
+ .addTo(fusionRecipes); // FT2 - farmable
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Cobalt.getMolten(144), Materials.Silicon.getMolten(144))
+ .fluidOutputs(Materials.Niobium.getPlasma(144))
+ .duration(16 * TICKS)
+ .eut(49152)
+ .metadata(FUSION_THRESHOLD, 200000000)
+ .addTo(fusionRecipes); // FT2 - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Gold.getMolten(144), Materials.Arsenic.getMolten(144))
+ .fluidOutputs(Materials.Silver.getPlasma(144))
+ .duration(16 * TICKS)
+ .eut(49152)
+ .metadata(FUSION_THRESHOLD, 350000000)
+ .addTo(fusionRecipes); // FT2+
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Silver.getMolten(144), Materials.Helium_3.getGas(375))
+ .fluidOutputs(Materials.Tin.getPlasma(288))
+ .duration(16 * TICKS)
+ .eut(49152)
+ .metadata(FUSION_THRESHOLD, 280000000)
+ .addTo(fusionRecipes); // FT2
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Tantalum.getMolten(144), Materials.Zinc.getPlasma(72))
+ .fluidOutputs(Materials.Bismuth.getPlasma(144))
+ .duration(16 * TICKS)
+ .eut(98304)
+ .metadata(FUSION_THRESHOLD, 350000000)
+ .addTo(fusionRecipes); // FT3 - farmable
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Iridium.getMolten(144), Materials.Fluorine.getGas(500))
+ .fluidOutputs(Materials.Radon.getPlasma(144))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(98304)
+ .metadata(FUSION_THRESHOLD, 450000000)
+ .addTo(fusionRecipes); // FT3 - utility
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Plutonium241.getMolten(144), Materials.Hydrogen.getGas(2000))
+ .fluidOutputs(Materials.Americium.getPlasma(144))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(98304)
+ .metadata(FUSION_THRESHOLD, 500000000)
+ .addTo(fusionRecipes); // FT3
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Lutetium.getMolten(288), Materials.Vanadium.getMolten(288))
+ .fluidOutputs(Materials.Plutonium241.getPlasma(288))
+ .duration(4 * TICKS)
+ .eut(TierEU.RECIPE_UEV / 2)
+ .metadata(FUSION_THRESHOLD, 1_000_000_000)
+ .addTo(fusionRecipes); // FT5 because of UEV voltage
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Tellurium.getMolten(288), Materials.Zinc.getMolten(288))
+ .fluidOutputs(Materials.Lead.getPlasma(288))
+ .duration(4 * TICKS)
+ .eut(TierEU.RECIPE_UEV / 2)
+ .metadata(FUSION_THRESHOLD, 1_000_000_000)
+ .addTo(fusionRecipes); // FT5 because of UEV voltage
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Osmium.getMolten(288), Materials.Silicon.getMolten(288))
+ .fluidOutputs(Materials.Thorium.getPlasma(288))
+ .duration(4 * TICKS)
+ .eut(TierEU.RECIPE_UEV / 2)
+ .metadata(FUSION_THRESHOLD, 1_000_000_000)
+ .addTo(fusionRecipes); // FT5 because of UEV voltage
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ImplosionCompressorRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ImplosionCompressorRecipes.java
new file mode 100644
index 0000000000..a671fd6977
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/ImplosionCompressorRecipes.java
@@ -0,0 +1,74 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.GalacticraftCore;
+import static gregtech.api.enums.Mods.GalacticraftMars;
+import static gregtech.api.recipe.RecipeMaps.implosionRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_RecipeConstants;
+
+public class ImplosionCompressorRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Compressed_Coal_Chunk.get(1L))
+ .itemOutputs(
+ ItemList.IC2_Industrial_Diamond.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 4L))
+ .metadata(GT_RecipeConstants.ADDITIVE_AMOUNT, 8)
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Ingot_IridiumAlloy.get(1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.plateAlloy, Materials.Iridium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.DarkAsh, 4L))
+ .metadata(GT_RecipeConstants.ADDITIVE_AMOUNT, 8)
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+
+ if (GalacticraftMars.isModLoaded()) {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Ingot_Heavy1.get(1L))
+ .itemOutputs(
+ getModItem(GalacticraftCore.ID, "item.heavyPlating", 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.StainlessSteel, 1L))
+ .metadata(GT_RecipeConstants.ADDITIVE_AMOUNT, 8)
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Ingot_Heavy2.get(1L))
+ .itemOutputs(
+ getModItem(GalacticraftMars.ID, "item.null", 1L, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.TungstenSteel, 2L))
+ .metadata(GT_RecipeConstants.ADDITIVE_AMOUNT, 16)
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Ingot_Heavy3.get(1L))
+ .itemOutputs(
+ getModItem(GalacticraftMars.ID, "item.itemBasicAsteroids", 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Platinum, 3L))
+ .metadata(GT_RecipeConstants.ADDITIVE_AMOUNT, 24)
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(implosionRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/LaserEngraverRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/LaserEngraverRecipes.java
new file mode 100644
index 0000000000..be21c84d66
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/LaserEngraverRecipes.java
@@ -0,0 +1,62 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.laserEngraverRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.TierEU;
+
+public class LaserEngraverRecipes implements Runnable {
+
+ @Override
+ public void run() {
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(MaterialsUEVplus.DimensionallyTranscendentCrudeCatalyst.getFluid(1000))
+ .fluidOutputs(MaterialsUEVplus.ExcitedDTCC.getFluid(1000))
+ .requiresCleanRoom()
+ .duration(41 * MINUTES + 40 * SECONDS)
+ .eut((int) TierEU.RECIPE_ZPM)
+ .noOptimize()
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(MaterialsUEVplus.DimensionallyTranscendentProsaicCatalyst.getFluid(1000))
+ .fluidOutputs(MaterialsUEVplus.ExcitedDTPC.getFluid(1000))
+ .requiresCleanRoom()
+ .duration(41 * MINUTES + 40 * SECONDS)
+ .eut((int) TierEU.RECIPE_UV)
+ .noOptimize()
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(MaterialsUEVplus.DimensionallyTranscendentResplendentCatalyst.getFluid(1000))
+ .fluidOutputs(MaterialsUEVplus.ExcitedDTRC.getFluid(1000))
+ .requiresCleanRoom()
+ .duration(41 * MINUTES + 40 * SECONDS)
+ .eut((int) TierEU.RECIPE_UHV)
+ .noOptimize()
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(MaterialsUEVplus.DimensionallyTranscendentExoticCatalyst.getFluid(1000))
+ .fluidOutputs(MaterialsUEVplus.ExcitedDTEC.getFluid(1000))
+ .requiresCleanRoom()
+ .duration(41 * MINUTES + 40 * SECONDS)
+ .eut((int) TierEU.RECIPE_UEV)
+ .noOptimize()
+ .addTo(laserEngraverRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(MaterialsUEVplus.DimensionallyTranscendentStellarCatalyst.getFluid(1000))
+ .fluidOutputs(MaterialsUEVplus.ExcitedDTSC.getFluid(1000))
+ .requiresCleanRoom()
+ .duration(41 * MINUTES + 40 * SECONDS)
+ .eut((int) TierEU.RECIPE_UIV)
+ .noOptimize()
+ .addTo(laserEngraverRecipes);
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/LatheRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/LatheRecipes.java
new file mode 100644
index 0000000000..4413f61200
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/LatheRecipes.java
@@ -0,0 +1,40 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.recipe.RecipeMaps.latheRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class LatheRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.wooden_slab, 1, GT_Values.W))
+ .itemOutputs(
+ new ItemStack(Items.bowl, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(8)
+ .addTo(latheRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Forestry.ID, "slabs", 1L, GT_Values.W))
+ .itemOutputs(
+ new ItemStack(Items.bowl, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Wood, 1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(8)
+ .addTo(latheRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/MatterAmplifierRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/MatterAmplifierRecipes.java
new file mode 100644
index 0000000000..863f0ae440
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/MatterAmplifierRecipes.java
@@ -0,0 +1,29 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.amplifierRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TierEU;
+
+public class MatterAmplifierRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Scrap.get(9L))
+ .fluidOutputs(Materials.UUAmplifier.getFluid(1))
+ .duration(9 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(amplifierRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Scrapbox.get(1L))
+ .fluidOutputs(Materials.UUAmplifier.getFluid(1))
+ .duration(9 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(amplifierRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/MixerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/MixerRecipes.java
new file mode 100644
index 0000000000..fd315542e5
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/MixerRecipes.java
@@ -0,0 +1,1689 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.BiomesOPlenty;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.Natura;
+import static gregtech.api.enums.Mods.PamsHarvestCraft;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.recipe.RecipeMaps.mixerRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.enums.MaterialsOreAlum;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import mods.railcraft.common.blocks.aesthetics.cube.EnumCube;
+
+public class MixerRecipes implements Runnable {
+
+ @Override
+ public void run() {
+
+ registerSingleBlockAndMulti();
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.EnderPearl, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.EnderEye, OrePrefixes.dust.mMaterialAmount))
+ .duration(5 * SECONDS)
+ .eut(48)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.Electrum, 2L * OrePrefixes.dust.mMaterialAmount))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.Invar, 3L * OrePrefixes.dust.mMaterialAmount))
+ .duration(15 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 4),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Invar, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Manganese, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.StainlessSteel, 9L * OrePrefixes.dust.mMaterialAmount))
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.Kanthal, 3L * OrePrefixes.dust.mMaterialAmount))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.Brass, 4L * OrePrefixes.dust.mMaterialAmount))
+ .duration(2 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.Bronze, 4L * OrePrefixes.dust.mMaterialAmount))
+ .duration(2 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.Cupronickel, 2L * OrePrefixes.dust.mMaterialAmount))
+ .duration(10 * SECONDS)
+ .eut(24)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 4),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.SterlingSilver, 5L * OrePrefixes.dust.mMaterialAmount))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Electrum, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.BlackBronze, 5L * OrePrefixes.dust.mMaterialAmount))
+ .duration(25 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bismuth, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.BismuthBronze, 5L * OrePrefixes.dust.mMaterialAmount))
+ .duration(25 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackBronze, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 3),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.BlackSteel, 5L * OrePrefixes.dust.mMaterialAmount))
+ .duration(25 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.SterlingSilver, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BismuthBronze, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 4),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.RedSteel, 8L * OrePrefixes.dust.mMaterialAmount))
+ .duration(40 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.RoseGold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 4),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.BlueSteel, 8L * OrePrefixes.dust.mMaterialAmount))
+ .duration(40 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 15),
+ GT_Utility.getIntegratedCircuit(14))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.BlackSteel, 25L * OrePrefixes.dust.mMaterialAmount))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 4),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silver, 4),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bismuth, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 20),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 10),
+ GT_Utility.getIntegratedCircuit(15))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.RedSteel, 40L * OrePrefixes.dust.mMaterialAmount))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Copper, 19),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 16),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 64),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BlackSteel, 16),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 40),
+ GT_Utility.getIntegratedCircuit(16))
+ .itemOutputs(
+ GT_OreDictUnificator.getDust(Materials.BlueSteel, 64L * OrePrefixes.dust.mMaterialAmount),
+ GT_OreDictUnificator.getDust(Materials.BlueSteel, 64L * OrePrefixes.dust.mMaterialAmount),
+ GT_OreDictUnificator.getDust(Materials.BlueSteel, 32L * OrePrefixes.dust.mMaterialAmount))
+ .duration(3 * MINUTES)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cobalt, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Molybdenum, 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.Ultimet, 9L * OrePrefixes.dust.mMaterialAmount))
+ .duration(45 * SECONDS)
+ .eut(500)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brass, 7),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cobalt, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.CobaltBrass, 9L * OrePrefixes.dust.mMaterialAmount))
+ .duration(45 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 3),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.Gunpowder, 6L * OrePrefixes.dust.mMaterialAmount))
+ .duration(30 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Charcoal, 3),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.Gunpowder, 6L * OrePrefixes.dust.mMaterialAmount))
+ .duration(30 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Saltpeter, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 3),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.Gunpowder, 6L * OrePrefixes.dust.mMaterialAmount))
+ .duration(30 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Indium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gallium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Phosphorus, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(
+ GT_OreDictUnificator.getDust(Materials.IndiumGalliumPhosphide, 3L * OrePrefixes.dust.mMaterialAmount))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Brick, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Clay, 1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.Fireclay, 2L * OrePrefixes.dust.mMaterialAmount))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 4),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.Nichrome, 5L * OrePrefixes.dust.mMaterialAmount))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 3),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.Osmiridium, 4L * OrePrefixes.dust.mMaterialAmount))
+ .duration(2 * SECONDS)
+ .eut(2000)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Niobium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.NiobiumTitanium, 2L * OrePrefixes.dust.mMaterialAmount))
+ .duration(10 * SECONDS)
+ .eut(2000)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gallium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.VanadiumGallium, 4L * OrePrefixes.dust.mMaterialAmount))
+ .duration(2 * SECONDS)
+ .eut(2000)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungsten, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Carbon, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.TungstenCarbide, 2L * OrePrefixes.dust.mMaterialAmount))
+ .duration(10 * SECONDS)
+ .eut(500)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tungsten, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.TungstenSteel, 2L * OrePrefixes.dust.mMaterialAmount))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 3),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.TPV, 7L * OrePrefixes.dust.mMaterialAmount))
+ .duration(8 * SECONDS + 15 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chrome, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Molybdenum, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Vanadium, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.HSSG, 9L * OrePrefixes.dust.mMaterialAmount))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HSSG, 6),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cobalt, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Manganese, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Silicon, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.HSSE, 9L * OrePrefixes.dust.mMaterialAmount))
+ .duration(35 * SECONDS)
+ .eut(4096)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HSSG, 6),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 1),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.HSSS, 9L * OrePrefixes.dust.mMaterialAmount))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nickel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Zinc, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 4),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(GT_OreDictUnificator.getDust(Materials.FerriteMixture, 6L * OrePrefixes.dust.mMaterialAmount))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Boron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glass, 7))
+ .itemOutputs(
+ GT_OreDictUnificator.getDust(Materials.BorosilicateGlass, 8L * OrePrefixes.dust.mMaterialAmount))
+ .duration(10 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Items.rotten_flesh, 1, 0),
+ new ItemStack(Items.fermented_spider_eye, 1, 0),
+ ItemList.IC2_Scrap.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.MeatRaw, 1))
+ .itemOutputs(ItemList.Food_Chum.get(4))
+ .fluidInputs(getFluidStack("potion.purpledrink", 750))
+ .fluidOutputs(getFluidStack("sludge", 1000))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(24)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wheat, 1))
+ .itemOutputs(ItemList.Food_Dough.get(2))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Chili, 1),
+ ItemList.Food_PotatoChips.get(1))
+ .itemOutputs(ItemList.Food_ChiliChips.get(1))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Redstone, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Ruby, 4))
+ .itemOutputs(ItemList.IC2_Energium_Dust.get(1))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ruby, 4))
+ .itemOutputs(ItemList.IC2_Energium_Dust.get(9))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1),
+ new ItemStack(Blocks.brown_mushroom, 1),
+ new ItemStack(Items.spider_eye, 1))
+ .itemOutputs(new ItemStack(Items.fermented_spider_eye, 1))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Gold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.LiveRoot, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.IronWood, 2))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gold, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 9),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.LiveRoot, 9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.IronWood, 18))
+ .duration(45 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Fluix, 2))
+ .fluidInputs(Materials.Water.getFluid(500))
+ .duration(20 * TICKS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.NetherQuartz, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Fluix, 2))
+ .fluidInputs(GT_ModHandler.getDistilledWater(500))
+ .duration(20 * TICKS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.IC2_Fertilizer.get(1),
+ new ItemStack(Blocks.dirt, 8, 32767),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Forestry.ID, "soil", 8L, 0))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.FR_Fertilizer.get(1),
+ new ItemStack(Blocks.dirt, 8, 32767),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Forestry.ID, "soil", 8L, 0))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.FR_Compost.get(1),
+ new ItemStack(Blocks.dirt, 8, 32767),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Forestry.ID, "soil", 8L, 0))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.FR_Mulch.get(8),
+ new ItemStack(Blocks.dirt, 8, 32767),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Forestry.ID, "soil", 8L, 0))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.sand, 1, 32767),
+ new ItemStack(Blocks.dirt, 1, 32767),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(getModItem(Forestry.ID, "soil", 2L, 1))
+ .fluidInputs(Materials.Water.getFluid(250))
+ .duration(16 * TICKS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 5),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Fuel, 6))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 5),
+ Materials.Empty.getCells(1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Fuel, 6))
+ .fluidInputs(Materials.HeavyFuel.getFluid(1000))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1),
+ Materials.Empty.getCells(5),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Fuel, 6))
+ .fluidInputs(Materials.LightFuel.getFluid(5000))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 5),
+ GT_Utility.getIntegratedCircuit(5))
+ .itemOutputs(Materials.Empty.getCells(5))
+ .fluidInputs(Materials.HeavyFuel.getFluid(1000))
+ .fluidOutputs(Materials.Fuel.getFluid(6000))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1),
+ GT_Utility.getIntegratedCircuit(6))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.LightFuel.getFluid(5000))
+ .fluidOutputs(Materials.Fuel.getFluid(6000))
+ .duration(16 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 5),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1))
+ .itemOutputs(Materials.Empty.getCells(5))
+ .fluidInputs(Materials.Lubricant.getFluid(20))
+ .fluidOutputs(new FluidStack(ItemList.sDrillingFluid, 5000))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lapis, 1),
+ GT_Utility.getIntegratedCircuit(4))
+ .fluidInputs(Materials.Water.getFluid(125))
+ .fluidOutputs(getFluidStack("ic2coolant", 125))
+ .duration(12 * SECONDS + 16 * TICKS)
+ .eut(48)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lapis, 1),
+ GT_Utility.getIntegratedCircuit(4))
+ .fluidInputs(GT_ModHandler.getDistilledWater(1000))
+ .fluidOutputs(getFluidStack("ic2coolant", 1000))
+ .duration(12 * SECONDS + 16 * TICKS)
+ .eut(48)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.SFMixture.get(4))
+ .fluidInputs(Materials.AdvancedGlue.getFluid(200))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.SFMixture.get(8))
+ .fluidInputs(Materials.AdvancedGlue.getFluid(200))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Caesium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.SFMixture.get(12))
+ .fluidInputs(Materials.AdvancedGlue.getFluid(200))
+ .duration(40 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sodium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.SFMixture.get(64))
+ .fluidInputs(Materials.McGuffium239.getFluid(12))
+ .duration(20 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lithium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.SFMixture.get(64))
+ .fluidInputs(Materials.McGuffium239.getFluid(8))
+ .duration(20 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sulfur, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Caesium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Wood, 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.SFMixture.get(64))
+ .fluidInputs(Materials.McGuffium239.getFluid(4))
+ .duration(20 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.SFMixture.get(2), GT_OreDictUnificator.get(OrePrefixes.dust, Materials.EnderEye, 1))
+ .itemOutputs(ItemList.MSFMixture.get(4))
+ .fluidInputs(Materials.Mercury.getFluid(1000))
+ .duration(15 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.SFMixture.get(1), GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Blaze, 1))
+ .itemOutputs(ItemList.MSFMixture.get(1))
+ .fluidInputs(Materials.Mercury.getFluid(500))
+ .duration(15 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 4),
+ ItemList.MSFMixture.get(24),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(4))
+ .fluidInputs(Materials.NitroFuel.getFluid(4000))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 4),
+ ItemList.MSFMixture.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(4))
+ .fluidInputs(Materials.NitroFuel.getFluid(3000))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 4),
+ ItemList.MSFMixture.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(4))
+ .fluidInputs(Materials.NitroFuel.getFluid(2000))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 4),
+ ItemList.MSFMixture.get(24),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(4))
+ .fluidInputs(Materials.GasolinePremium.getFluid(1600))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 4),
+ ItemList.MSFMixture.get(16),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(4))
+ .fluidInputs(Materials.GasolinePremium.getFluid(1200))
+ .duration(15 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 4),
+ ItemList.MSFMixture.get(8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Diamond, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(4))
+ .fluidInputs(Materials.GasolinePremium.getFluid(800))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ if (Thaumcraft.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.SFMixture.get(20),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedAir, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.MSFMixture.get(20))
+ .fluidInputs(Materials.FierySteel.getFluid(50))
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.SFMixture.get(20),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedEarth, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.MSFMixture.get(20))
+ .fluidInputs(Materials.FierySteel.getFluid(50))
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.SFMixture.get(20),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedEntropy, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.MSFMixture.get(20))
+ .fluidInputs(Materials.FierySteel.getFluid(50))
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.SFMixture.get(20),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedFire, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.MSFMixture.get(20))
+ .fluidInputs(Materials.FierySteel.getFluid(50))
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.SFMixture.get(20),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedOrder, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.MSFMixture.get(20))
+ .fluidInputs(Materials.FierySteel.getFluid(50))
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.SFMixture.get(20),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedWater, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.MSFMixture.get(20))
+ .fluidInputs(Materials.FierySteel.getFluid(50))
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ FluidStack tFD = getFluidStack("fluiddeath", 30);
+ if (tFD != null && tFD.getFluid() != null && tFD.amount > 0) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.SFMixture.get(30),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedAir, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.MSFMixture.get(30))
+ .fluidInputs(tFD)
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.SFMixture.get(30),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedEarth, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.MSFMixture.get(30))
+ .fluidInputs(tFD)
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.SFMixture.get(30),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedEntropy, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.MSFMixture.get(30))
+ .fluidInputs(tFD)
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.SFMixture.get(30),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedFire, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.MSFMixture.get(30))
+ .fluidInputs(tFD)
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.SFMixture.get(30),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedOrder, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.MSFMixture.get(30))
+ .fluidInputs(tFD)
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.SFMixture.get(30),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.InfusedWater, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.MSFMixture.get(30))
+ .fluidInputs(tFD)
+ .duration(10 * SECONDS)
+ .eut(64)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
+ ItemList.MSFMixture.get(6),
+ getModItem(Thaumcraft.ID, "ItemResource", 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(1))
+ .fluidInputs(Materials.NitroFuel.getFluid(1000))
+ .duration(7 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
+ ItemList.MSFMixture.get(4),
+ getModItem(Thaumcraft.ID, "ItemResource", 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(1))
+ .fluidInputs(Materials.NitroFuel.getFluid(750))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
+ ItemList.MSFMixture.get(2),
+ getModItem(Thaumcraft.ID, "ItemResource", 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(1))
+ .fluidInputs(Materials.NitroFuel.getFluid(500))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
+ ItemList.MSFMixture.get(6),
+ getModItem(Thaumcraft.ID, "ItemResource", 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(1))
+ .fluidInputs(Materials.GasolinePremium.getFluid(400))
+ .duration(7 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
+ ItemList.MSFMixture.get(4),
+ getModItem(Thaumcraft.ID, "ItemResource", 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(1))
+ .fluidInputs(Materials.GasolinePremium.getFluid(300))
+ .duration(6 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
+ ItemList.MSFMixture.get(2),
+ getModItem(Thaumcraft.ID, "ItemResource", 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(1))
+ .fluidInputs(Materials.GasolinePremium.getFluid(200))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+ }
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
+ ItemList.SFMixture.get(6),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_SSFUEL.get(1))
+ .fluidInputs(Materials.NitroFuel.getFluid(1000))
+ .duration(7 * SECONDS)
+ .eut(250)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
+ ItemList.SFMixture.get(4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_SSFUEL.get(1))
+ .fluidInputs(Materials.NitroFuel.getFluid(750))
+ .duration(6 * SECONDS)
+ .eut(250)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
+ ItemList.SFMixture.get(2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_SSFUEL.get(1))
+ .fluidInputs(Materials.NitroFuel.getFluid(500))
+ .duration(5 * SECONDS)
+ .eut(250)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Lignite, 1),
+ ItemList.SFMixture.get(6),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_SSFUEL.get(1))
+ .fluidInputs(Materials.GasolinePremium.getFluid(400))
+ .duration(7 * SECONDS)
+ .eut(250)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Charcoal, 1),
+ ItemList.SFMixture.get(4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_SSFUEL.get(1))
+ .fluidInputs(Materials.GasolinePremium.getFluid(300))
+ .duration(6 * SECONDS)
+ .eut(250)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 1),
+ ItemList.SFMixture.get(2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_SSFUEL.get(1))
+ .fluidInputs(Materials.GasolinePremium.getFluid(200))
+ .duration(5 * SECONDS)
+ .eut(250)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricAcid, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Cell_Empty.get(1))
+ .fluidInputs(Materials.NitricAcid.getFluid(1000))
+ .fluidOutputs(new FluidStack(ItemList.sNitrationMixture, 2000))
+ .duration(24 * SECONDS)
+ .eut(2)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricAcid, 1),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.NitricAcid, 1),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.NitrationMixture, 2))
+ .duration(24 * SECONDS)
+ .eut(2)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 32767),
+ new ItemStack(Items.wheat, 4, 32767),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 2),
+ new ItemStack(Items.wheat, 4, 32767),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 32767),
+ getModItem(BiomesOPlenty.ID, "plants", 4, 6),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 2),
+ getModItem(BiomesOPlenty.ID, "plants", 4, 6),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 32767),
+ getModItem(PamsHarvestCraft.ID, "oatsItem", 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 2),
+ getModItem(PamsHarvestCraft.ID, "oatsItem", 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 32767),
+ getModItem(PamsHarvestCraft.ID, "ryeItem", 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 2),
+ getModItem(PamsHarvestCraft.ID, "ryeItem", 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 32767),
+ getModItem(PamsHarvestCraft.ID, "barleyItem", 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 2),
+ getModItem(PamsHarvestCraft.ID, "barleyItem", 4, 6),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 32767),
+ getModItem(Natura.ID, "barleyFood", 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 2),
+ getModItem(Natura.ID, "barleyFood", 4),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 32767),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 4),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ new ItemStack(Blocks.dirt, 1, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Ash, 4),
+ GT_Utility.getIntegratedCircuit(3))
+ .itemOutputs(getModItem(Forestry.ID, "fertilizerBio", 1L, 0))
+ .fluidInputs(Materials.Water.getFluid(100))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ // radiation manufacturing
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("fuelRod", 1), new ItemStack(Items.glowstone_dust, 9))
+ .itemOutputs(ItemList.GlowstoneCell.get(1))
+ .fluidInputs(Materials.Helium.getGas(250))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(MaterialsOreAlum.SluiceSand.getDust(1))
+ .fluidInputs(Materials.Water.getFluid(500))
+ .fluidOutputs(MaterialsOreAlum.SluiceJuice.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ // NaCl + H2O = (NaCl·H2O)
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Salt.getDust(2), GT_Utility.getIntegratedCircuit(3))
+ .fluidInputs(Materials.Water.getFluid(1000))
+ .fluidOutputs(Materials.SaltWater.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ // CaCO3 + 2 CH3COOH = Ca(CH3COO)2 + H2O + CO2
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Water.getCells(1), Materials.CarbonDioxide.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(2000))
+ .fluidOutputs(Materials.CalciumAcetateSolution.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(2), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.CalciumAcetateSolution.getCells(1), Materials.CarbonDioxide.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(2000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(2), GT_Utility.getIntegratedCircuit(21))
+ .itemOutputs(Materials.Water.getCells(1), Materials.CalciumAcetateSolution.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(2000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(Materials.CarbonDioxide.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(2000))
+ .fluidOutputs(Materials.CalciumAcetateSolution.getFluid(1000))
+ .duration(12 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Calcite.getDust(5), Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(14))
+ .itemOutputs(Materials.CalciumAcetateSolution.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(2000))
+ .fluidOutputs(Materials.CarbonDioxide.getGas(1000))
+ .duration(12 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ // Ca + 2 CH3COOH = Ca(CH3COO)2 + 2H
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Calcium.getDust(1), Materials.Empty.getCells(2), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Hydrogen.getCells(2))
+ .fluidInputs(Materials.AceticAcid.getFluid(2000))
+ .fluidOutputs(Materials.CalciumAcetateSolution.getFluid(1000))
+ .duration(4 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Calcium.getDust(1), Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.CalciumAcetateSolution.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(2000))
+ .fluidOutputs(Materials.Hydrogen.getGas(2000))
+ .duration(4 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ // CaO + 2 CH3COOH = Ca(CH3COO)2 + H2O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Quicklime.getDust(2), Materials.Empty.getCells(1), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Water.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(2000))
+ .fluidOutputs(Materials.CalciumAcetateSolution.getFluid(1000))
+ .duration(4 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ Materials.Quicklime.getDust(2),
+ Materials.Empty.getCells(1),
+ GT_Utility.getIntegratedCircuit(11))
+ .itemOutputs(Materials.CalciumAcetateSolution.getCells(1))
+ .fluidInputs(Materials.AceticAcid.getFluid(2000))
+ .fluidOutputs(Materials.Water.getFluid(1000))
+ .duration(4 * SECONDS)
+ .eut(16)
+ .addTo(mixerRecipes);
+
+ // 2CH3COOCH3 + 3CH3COCH3/(C4H6O2)n = 5Glue
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Acetone.getCells(3))
+ .itemOutputs(Materials.Empty.getCells(3))
+ .fluidInputs(Materials.PolyvinylAcetate.getFluid(2000))
+ .fluidOutputs(Materials.AdvancedGlue.getFluid(5000))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.PolyvinylAcetate.getCells(2))
+ .itemOutputs(Materials.Empty.getCells(2))
+ .fluidInputs(Materials.Acetone.getFluid(3000))
+ .fluidOutputs(Materials.AdvancedGlue.getFluid(5000))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.MethylAcetate.getCells(3))
+ .itemOutputs(Materials.Empty.getCells(3))
+ .fluidInputs(Materials.PolyvinylAcetate.getFluid(2000))
+ .fluidOutputs(Materials.AdvancedGlue.getFluid(5000))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.PolyvinylAcetate.getCells(2))
+ .itemOutputs(Materials.Empty.getCells(2))
+ .fluidInputs(Materials.MethylAcetate.getFluid(3000))
+ .fluidOutputs(Materials.AdvancedGlue.getFluid(5000))
+ .duration(5 * SECONDS)
+ .eut(8)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Sugar.getDust(4))
+ .itemOutputs(Materials.Charcoal.getGems(1))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
+ .duration(60 * SECONDS)
+ .eut(2)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Wood.getDust(4))
+ .itemOutputs(Materials.Charcoal.getGems(1))
+ .fluidInputs(Materials.SulfuricAcid.getFluid(1000))
+ .fluidOutputs(Materials.DilutedSulfuricAcid.getFluid(1000))
+ .duration(60 * SECONDS)
+ .eut(2)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Fuel.getCells(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Tetranitromethane.getFluid(20))
+ .fluidOutputs(Materials.NitroFuel.getFluid(1000))
+ .duration(20 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.BioDiesel.getCells(1))
+ .itemOutputs(Materials.Empty.getCells(1))
+ .fluidInputs(Materials.Tetranitromethane.getFluid(40))
+ .fluidOutputs(Materials.NitroFuel.getFluid(900))
+ .duration(20 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ // CH4O + C4H8 = C5H12O
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Methanol.getCells(1), Materials.Butene.getCells(1))
+ .itemOutputs(Materials.MTBEMixture.getCells(1), Materials.Empty.getCells(1))
+ .duration(20 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ Materials.Naphtha.getCells(16),
+ Materials.Gas.getCells(2),
+ Materials.Methanol.getCells(1),
+ Materials.Acetone.getCells(1))
+ .itemOutputs(Materials.GasolineRaw.getCells(20))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ Materials.GasolineRegular.getCells(20),
+ Materials.Octane.getCells(2),
+ Materials.NitrousOxide.getCells(6),
+ Materials.Toluene.getCells(1))
+ .itemOutputs(Materials.Empty.getCells(29))
+ .fluidInputs(Materials.AntiKnock.getFluid(3000))
+ .fluidOutputs(Materials.GasolinePremium.getFluid(32000))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(mixerRecipes);
+
+ if (Railcraft.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ EnumCube.COKE_BLOCK.getItem(),
+ ItemList.SFMixture.get(2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_SSFUEL.get(1))
+ .fluidInputs(Materials.NitroFuel.getFluid(300))
+ .duration(5 * SECONDS)
+ .eut(250)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ EnumCube.COKE_BLOCK.getItem(),
+ ItemList.SFMixture.get(2),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_SSFUEL.get(1))
+ .fluidInputs(Materials.GasolinePremium.getFluid(120))
+ .duration(5 * SECONDS)
+ .eut(250)
+ .addTo(mixerRecipes);
+ }
+
+ if (Thaumcraft.isModLoaded() && Railcraft.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ EnumCube.COKE_BLOCK.getItem(),
+ ItemList.MSFMixture.get(2),
+ getModItem(Thaumcraft.ID, "ItemResource", 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(1))
+ .fluidInputs(Materials.NitroFuel.getFluid(300))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ EnumCube.COKE_BLOCK.getItem(),
+ ItemList.MSFMixture.get(2),
+ getModItem(Thaumcraft.ID, "ItemResource", 4),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(ItemList.Block_MSSFUEL.get(1))
+ .fluidInputs(Materials.GasolinePremium.getFluid(120))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(mixerRecipes);
+ }
+ }
+
+ public static void addMixerPotionRecipes(String aName) {
+
+ boolean splash = !(FluidRegistry.getFluid("potion." + aName) == null
+ || FluidRegistry.getFluid("potion." + aName + ".splash") == null);
+ boolean splashStrong = !(FluidRegistry.getFluid("potion." + aName + ".strong") == null
+ || FluidRegistry.getFluid("potion." + aName + ".strong.splash") == null);
+ boolean splashLong = !(FluidRegistry.getFluid("potion." + aName + ".long") == null
+ || FluidRegistry.getFluid("potion." + aName + ".long.splash") == null);
+
+ if (splash) GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("potion." + aName), 750))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion." + aName + ".splash"), 750))
+ .duration(10 * SECONDS)
+ .eut(24)
+ .addTo(mixerRecipes);
+
+ if (splashStrong) GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("potion." + aName + ".strong"), 750))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion." + aName + ".strong.splash"), 750))
+ .duration(10 * SECONDS)
+ .eut(24)
+ .addTo(mixerRecipes);
+
+ if (splashLong) GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Gunpowder, 1))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("potion." + aName + ".long"), 750))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("potion." + aName + ".long.splash"), 750))
+ .duration(10 * SECONDS)
+ .eut(24)
+ .addTo(mixerRecipes);
+ }
+
+ public void registerSingleBlockAndMulti() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ Materials.NaquadahEnriched.getDust(8),
+ Materials.Holmium.getDust(2),
+ GT_Utility.getIntegratedCircuit(4))
+ .itemOutputs(Materials.EnrichedHolmium.getDust(10))
+ .duration(30 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(mixerRecipes);
+
+ // Catalysts for Plasma Forge.
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(9))
+ .fluidInputs(
+ Materials.Helium.getPlasma(1000L),
+ Materials.Iron.getPlasma(1000L),
+ Materials.Calcium.getPlasma(1000L),
+ Materials.Niobium.getPlasma(1000L))
+ .fluidOutputs(MaterialsUEVplus.DimensionallyTranscendentCrudeCatalyst.getFluid(1000L))
+ .duration(41 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .noOptimize()
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(10))
+ .fluidInputs(
+ MaterialsUEVplus.DimensionallyTranscendentCrudeCatalyst.getFluid(1000L),
+ Materials.Radon.getPlasma(1000L),
+ Materials.Nickel.getPlasma(1000L),
+ Materials.Boron.getPlasma(1000L),
+ Materials.Sulfur.getPlasma(1000L))
+ .fluidOutputs(MaterialsUEVplus.DimensionallyTranscendentProsaicCatalyst.getFluid(1000L))
+ .duration(41 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .noOptimize()
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(11))
+ .fluidInputs(
+ MaterialsUEVplus.DimensionallyTranscendentProsaicCatalyst.getFluid(1000L),
+ Materials.Nitrogen.getPlasma(1000L),
+ Materials.Zinc.getPlasma(1000L),
+ Materials.Silver.getPlasma(1000L),
+ Materials.Titanium.getPlasma(1000L))
+ .fluidOutputs(MaterialsUEVplus.DimensionallyTranscendentResplendentCatalyst.getFluid(1000L))
+ .duration(41 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .noOptimize()
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(12))
+ .fluidInputs(
+ MaterialsUEVplus.DimensionallyTranscendentResplendentCatalyst.getFluid(1000L),
+ Materials.Americium.getPlasma(1000L),
+ Materials.Bismuth.getPlasma(1000L),
+ Materials.Oxygen.getPlasma(1000L),
+ Materials.Tin.getPlasma(1000L))
+ .fluidOutputs(MaterialsUEVplus.DimensionallyTranscendentExoticCatalyst.getFluid(1000L))
+ .duration(41 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_UEV)
+ .noOptimize()
+ .addTo(mixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(13))
+ .fluidInputs(
+ MaterialsUEVplus.DimensionallyTranscendentExoticCatalyst.getFluid(1000L),
+ Materials.Lead.getPlasma(1000),
+ Materials.Thorium.getPlasma(1000),
+ Materials.Plutonium241.getPlasma(1000L),
+ MaterialsUEVplus.RawStarMatter.getFluid(25L))
+ .fluidOutputs(MaterialsUEVplus.DimensionallyTranscendentStellarCatalyst.getFluid(1000L))
+ .duration(41 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_UIV)
+ .noOptimize()
+ .addTo(mixerRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Spray_WeedEx.get(1))
+ .fluidInputs(MaterialsKevlar.NaphthenicAcid.getFluid(10))
+ .fluidOutputs(Materials.WeedEX9000.getFluid(750))
+ .duration(5 * SECONDS)
+ .eut(100)
+ .addTo(mixerRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/NEIHiding.java b/src/main/java/gregtech/loaders/postload/recipes/NEIHiding.java
new file mode 100644
index 0000000000..dad2388ae6
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/NEIHiding.java
@@ -0,0 +1,40 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.NotEnoughItems;
+
+import net.minecraft.item.ItemStack;
+
+import codechicken.nei.api.API;
+import gregtech.api.enums.ItemList;
+import gregtech.common.items.GT_MetaGenerated_Item_03;
+
+public class NEIHiding implements Runnable {
+
+ @Override
+ public void run() {
+ if (!NotEnoughItems.isModLoaded()) {
+ return;
+ }
+
+ for (int i = 0; i < 16; i++) {
+ API.hideItem(new ItemStack(GT_MetaGenerated_Item_03.INSTANCE, 1, i));
+ }
+
+ if (Forestry.isModLoaded()) {
+ ItemStack[] coverIDs = { ItemList.Plank_Larch.get(2L), ItemList.Plank_Teak.get(2L),
+ ItemList.Plank_Acacia_Green.get(2L), ItemList.Plank_Lime.get(2L), ItemList.Plank_Chestnut.get(2L),
+ ItemList.Plank_Wenge.get(2L), ItemList.Plank_Baobab.get(2L), ItemList.Plank_Sequoia.get(2L),
+ ItemList.Plank_Kapok.get(2L), ItemList.Plank_Ebony.get(2L), ItemList.Plank_Mahagony.get(2L),
+ ItemList.Plank_Balsa.get(2L), ItemList.Plank_Willow.get(2L), ItemList.Plank_Walnut.get(2L),
+ ItemList.Plank_Greenheart.get(2L), ItemList.Plank_Cherry.get(2L), ItemList.Plank_Mahoe.get(2L),
+ ItemList.Plank_Poplar.get(2L), ItemList.Plank_Palm.get(2L), ItemList.Plank_Papaya.get(2L),
+ ItemList.Plank_Pine.get(2L), ItemList.Plank_Plum.get(2L), ItemList.Plank_Maple.get(2L),
+ ItemList.Plank_Citrus.get(2L) };
+
+ for (ItemStack cover : coverIDs) {
+ API.hideItem(cover);
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/OreDictUnification.java b/src/main/java/gregtech/loaders/postload/recipes/OreDictUnification.java
new file mode 100644
index 0000000000..f8c816dc5c
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/OreDictUnification.java
@@ -0,0 +1,23 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.HardcoreEnderExpansion;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class OreDictUnification implements Runnable {
+
+ @Override
+ public void run() {
+ if (HardcoreEnderExpansion.isModLoaded()) {
+ GT_OreDictUnificator.set(
+ OrePrefixes.ingot,
+ Materials.HeeEndium,
+ getModItem(HardcoreEnderExpansion.ID, "endium_ingot", 1),
+ true,
+ true);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/PackagerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/PackagerRecipes.java
new file mode 100644
index 0000000000..bb434cbf7d
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/PackagerRecipes.java
@@ -0,0 +1,51 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.packagerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class PackagerRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.IC2_Scrap.get(9), ItemList.Schematic_3by3.get(0))
+ .itemOutputs(ItemList.IC2_Scrapbox.get(1))
+ .duration(16 * TICKS)
+ .eut(1)
+ .addTo(packagerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Food_Fries.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Paper, 1))
+ .itemOutputs(ItemList.Food_Packaged_Fries.get(1))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(packagerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Food_PotatoChips.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 1))
+ .itemOutputs(ItemList.Food_Packaged_PotatoChips.get(1))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(packagerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Food_ChiliChips.get(1),
+ GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 1))
+ .itemOutputs(ItemList.Food_Packaged_ChiliChips.get(1))
+ .duration(3 * SECONDS + 4 * TICKS)
+ .eut(16)
+ .addTo(packagerRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/PlasmaForgeRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/PlasmaForgeRecipes.java
new file mode 100644
index 0000000000..fe0f7c7ed5
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/PlasmaForgeRecipes.java
@@ -0,0 +1,50 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GoodGenerator;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.recipe.RecipeMaps.plasmaForgeRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeConstants.COIL_HEAT;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.TierEU;
+
+public class PlasmaForgeRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ // Giga chad trophy.
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ ItemList.Field_Generator_UEV.get(64),
+ ItemList.Field_Generator_UIV.get(64),
+ ItemList.Field_Generator_UMV.get(64))
+ .fluidInputs(
+ MaterialsUEVplus.ExcitedDTEC.getFluid(100_000_000),
+ MaterialsUEVplus.SpaceTime.getMolten(64 * 2 * 9 * 144))
+ .itemOutputs(ItemList.GigaChad.get(1))
+ .duration(86400 * 20 * 2)
+ .eut(2_000_000_000)
+ .metadata(COIL_HEAT, 13500)
+ .addTo(plasmaForgeRecipes);
+
+ // Quantum anomaly recipe bypass for UEV+. Avoids RNG.
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ getModItem(GTPlusPlus.ID, "particleBase", 1, 24),
+ getModItem(NewHorizonsCoreMod.ID, "item.ChromaticLens", 0),
+ getModItem(GoodGenerator.ID, "huiCircuit", 0, 4))
+ .fluidInputs(MaterialsUEVplus.ExcitedDTRC.getFluid(92), Materials.Duranium.getMolten(144))
+ .itemOutputs(getModItem(GTPlusPlus.ID, "MU-metaitem.01", 1, 32105))
+ .fluidOutputs(MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(46))
+ .duration(60 * SECONDS)
+ .eut((int) TierEU.RECIPE_UEV)
+ .metadata(COIL_HEAT, 10800)
+ .addTo(plasmaForgeRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/PrinterRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/PrinterRecipes.java
new file mode 100644
index 0000000000..e8a52dd1f8
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/PrinterRecipes.java
@@ -0,0 +1,64 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.printerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static net.minecraftforge.fluids.FluidRegistry.getFluidStack;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class PrinterRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Paper, 1L))
+ .itemOutputs(ItemList.Paper_Punch_Card_Empty.get(1L))
+ .fluidInputs(getFluidStack("squidink", 36))
+ .duration(5 * SECONDS)
+ .eut(2)
+ .addTo(printerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Paper_Punch_Card_Empty.get(1L))
+ .specialItem(ItemList.Tool_DataStick.getWithName(0L, "With Punch Card Data"))
+ .itemOutputs(ItemList.Paper_Punch_Card_Encoded.get(1L))
+ .fluidInputs(getFluidStack("squidink", 36))
+ .duration(5 * SECONDS)
+ .eut(2)
+ .addTo(printerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Paper, 3L))
+ .specialItem(ItemList.Tool_DataStick.getWithName(0L, "With Scanned Book Data"))
+ .itemOutputs(ItemList.Paper_Printed_Pages.get(1L))
+ .fluidInputs(getFluidStack("squidink", 144))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(printerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.map, 1, 32767))
+ .specialItem(ItemList.Tool_DataStick.getWithName(0L, "With Scanned Map Data"))
+ .itemOutputs(new ItemStack(Items.filled_map, 1, 0))
+ .fluidInputs(getFluidStack("squidink", 144))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(printerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.book, 1, 32767))
+ .itemOutputs(GT_Utility.getWrittenBook("Manual_Printer", ItemList.Book_Written_01.get(1L)))
+ .fluidInputs(getFluidStack("squidink", 144))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(printerRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/Pulverizer.java b/src/main/java/gregtech/loaders/postload/recipes/Pulverizer.java
new file mode 100644
index 0000000000..c24dd2dbae
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/Pulverizer.java
@@ -0,0 +1,581 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.HardcoreEnderExpansion;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class Pulverizer implements Runnable {
+
+ @Override
+ public void run() {
+ // recycling Long Distance Pipes
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Long_Distance_Pipeline_Fluid.get(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 19))
+ .duration(15 * SECONDS)
+ .eut(4)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Long_Distance_Pipeline_Item.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 12),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 7))
+ .duration(15 * SECONDS)
+ .eut(4)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Long_Distance_Pipeline_Fluid_Pipe.get(1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Steel, 2))
+ .duration(10 * TICKS)
+ .eut(4)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Long_Distance_Pipeline_Item_Pipe.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Tin, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Steel, 1))
+ .duration(10 * TICKS)
+ .eut(4)
+ .addTo(maceratorRecipes);
+ }
+
+ // marbe dust( stone dust
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.block, Materials.Marble, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Marble, 1))
+ .duration(8 * SECONDS)
+ .eut(4)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Thaumcraft.ID, "ItemResource", 1, 18))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Gold, 1))
+ .duration(1 * SECONDS + 1 * TICKS)
+ .eut(4)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.reeds, 1))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sugar, 1))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_Cupronickel.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cupronickel, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Tin, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 2))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(80)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_Kanthal.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Kanthal, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cupronickel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 3))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(80)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_Nichrome.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nichrome, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Kanthal, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 4))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(80)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_TungstenSteel.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TPV, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Nichrome, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 5))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(80)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_HSSG.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HSSG, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TPV, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 6))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(80)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_HSSS.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HSSS, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HSSG, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 7))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(80)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_Naquadah.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.HSSS, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 8))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(80)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_NaquadahAlloy.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahAlloy, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 9))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(80)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_Trinium.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Trinium, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahAlloy, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 10))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(80)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_ElectrumFlux.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.ElectrumFlux, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Trinium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 11))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(80)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Coil_AwakenedDraconium.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.DraconiumAwakened, 8),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.ElectrumFlux, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.QuartzSand, 12))
+ .duration(1 * MINUTES + 15 * SECONDS)
+ .eut(80)
+ .addTo(maceratorRecipes);
+
+ if (Railcraft.isModLoaded()) {
+ // recycling RC Tanks
+ // Iron
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 0))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 2))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Bronze, 12),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Iron, 3))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ // Steel
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 13))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 2))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 14))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.beta", 1L, 15))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Steel, 12),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Steel, 3))
+ .duration(15 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ // Aluminium
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 0))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 2))
+ .duration(22 * SECONDS + 10 * TICKS)
+ .eut(8)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Aluminium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(22 * SECONDS + 10 * TICKS)
+ .eut(8)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Plastic, 12),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Aluminium, 3))
+ .duration(22 * SECONDS + 10 * TICKS)
+ .eut(8)
+ .addTo(maceratorRecipes);
+
+ // Stainless Steel
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.StainlessSteel, 2))
+ .duration(30 * SECONDS)
+ .eut(16)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.StainlessSteel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(30 * SECONDS)
+ .eut(16)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 5))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.StainlessSteel, 12),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.StainlessSteel, 3))
+ .duration(30 * SECONDS)
+ .eut(16)
+ .addTo(maceratorRecipes);
+
+ // Titanium
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 6))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 2))
+ .duration(30 * SECONDS)
+ .eut(30)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 7))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(30 * SECONDS)
+ .eut(30)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 8))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Titanium, 12),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Titanium, 3))
+ .duration(30 * SECONDS)
+ .eut(30)
+ .addTo(maceratorRecipes);
+
+ // Tungesten Steel
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 9))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 2))
+ .duration(30 * SECONDS)
+ .eut(30)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 10))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(30 * SECONDS)
+ .eut(30)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 11))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 12),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.TungstenSteel, 3))
+ .duration(30 * SECONDS)
+ .eut(30)
+ .addTo(maceratorRecipes);
+
+ // Palladium
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 12))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 2))
+ .duration(37 * SECONDS + 10 * TICKS)
+ .eut(64)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 13))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Palladium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(37 * SECONDS + 10 * TICKS)
+ .eut(64)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.zeta", 1L, 14))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NiobiumTitanium, 12),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Chrome, 3))
+ .duration(37 * SECONDS + 10 * TICKS)
+ .eut(64)
+ .addTo(maceratorRecipes);
+
+ // Iridium
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 0))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 2))
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iridium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 2))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Enderium, 12),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Iridium, 3))
+ .duration(45 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(maceratorRecipes);
+
+ // Osmium
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 3))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 2))
+ .duration(52 * SECONDS + 10 * TICKS)
+ .eut(256)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 4))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Osmium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(52 * SECONDS + 10 * TICKS)
+ .eut(256)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 5))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 12),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Osmium, 3))
+ .duration(52 * SECONDS + 10 * TICKS)
+ .eut(256)
+ .addTo(maceratorRecipes);
+
+ // Neutronium
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 6))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 2))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 7))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Glass, 3))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Railcraft.ID, "machine.eta", 1L, 8))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Neutronium, 12),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Neutronium, 3))
+ .duration(60 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(maceratorRecipes);
+ }
+
+ if (AppliedEnergistics2.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "tile.BlockSkyStone", 1L, 32767))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 45))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(AppliedEnergistics2.ID, "tile.BlockSkyChest", 1L, 32767))
+ .itemOutputs(getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 8L, 45))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.blaze_rod, 1))
+ .itemOutputs(new ItemStack(Items.blaze_powder, 3), new ItemStack(Items.blaze_powder, 1))
+ .outputChances(10000, 5000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.web, 1, 0))
+ .itemOutputs(new ItemStack(Items.string, 1), new ItemStack(Items.string, 1))
+ .outputChances(10000, 5000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.red_mushroom, 1, 32767))
+ .itemOutputs(ItemList.IC2_Grin_Powder.get(1L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.item_frame, 1, 32767))
+ .itemOutputs(
+ new ItemStack(Items.leather, 1),
+ GT_OreDictUnificator.getDust(Materials.Wood, OrePrefixes.stick.mMaterialAmount * 4L))
+ .outputChances(10000, 9500)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Items.bow, 1, 0))
+ .itemOutputs(
+ new ItemStack(Items.string, 3),
+ GT_OreDictUnificator.getDust(Materials.Wood, OrePrefixes.stick.mMaterialAmount * 3))
+ .outputChances(10000, 9500)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Brick.getIngots(1))
+ .itemOutputs(Materials.Brick.getDustSmall(1))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.brick_stairs, 1, 0))
+ .itemOutputs(Materials.Brick.getDustSmall(6))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.CompressedFireclay.get(1))
+ .itemOutputs(Materials.Fireclay.getDustSmall(1))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Firebrick.get(1))
+ .itemOutputs(Materials.Brick.getDust(1))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Casing_Firebricks.get(1))
+ .itemOutputs(Materials.Brick.getDust(4))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Machine_Bricked_BlastFurnace.get(1))
+ .itemOutputs(Materials.Brick.getDust(8), Materials.Iron.getDust(1))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ if (HardcoreEnderExpansion.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(HardcoreEnderExpansion.ID, "endium_ore", 1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.crushed, Materials.HeeEndium, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 1))
+ .outputChances(10000, 5000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/PyrolyseRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/PyrolyseRecipes.java
new file mode 100644
index 0000000000..51017358b4
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/PyrolyseRecipes.java
@@ -0,0 +1,137 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.recipe.RecipeMaps.pyrolyseRecipes;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import mods.railcraft.common.blocks.aesthetics.cube.EnumCube;
+import mods.railcraft.common.items.RailcraftToolItems;
+
+public class PyrolyseRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ if (Railcraft.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 16),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(RailcraftToolItems.getCoalCoke(16))
+ .fluidOutputs(Materials.Creosote.getFluid(8000))
+ .duration(32 * SECONDS)
+ .eut(64)
+ .addTo(pyrolyseRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Coal, 16),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(RailcraftToolItems.getCoalCoke(16))
+ .fluidInputs(Materials.Nitrogen.getGas(1000))
+ .fluidOutputs(Materials.Creosote.getFluid(8000))
+ .duration(16 * SECONDS)
+ .eut(96)
+ .addTo(pyrolyseRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 8),
+ GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(EnumCube.COKE_BLOCK.getItem(8))
+ .fluidOutputs(Materials.Creosote.getFluid(32000))
+ .duration(2 * MINUTES + 8 * SECONDS)
+ .eut(64)
+ .addTo(pyrolyseRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.block, Materials.Coal, 8),
+ GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(EnumCube.COKE_BLOCK.getItem(8))
+ .fluidInputs(Materials.Nitrogen.getGas(1000))
+ .fluidOutputs(Materials.Creosote.getFluid(32000))
+ .duration(1 * MINUTES + 4 * SECONDS)
+ .eut(96)
+ .addTo(pyrolyseRecipes);
+ }
+
+ if (Forestry.isModLoaded()) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Forestry.ID, "fertilizerBio", 4), GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Water.getFluid(4000))
+ .fluidOutputs(Materials.Biomass.getFluid(5000))
+ .duration(45 * SECONDS)
+ .eut(10)
+ .addTo(pyrolyseRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(getModItem(Forestry.ID, "mulch", 32), GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Water.getFluid(4000))
+ .fluidOutputs(Materials.Biomass.getFluid(5000))
+ .duration(45 * SECONDS)
+ .eut(10)
+ .addTo(pyrolyseRecipes);
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("biochaff", 4), GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(Materials.Water.getFluid(4000))
+ .fluidOutputs(new FluidStack(FluidRegistry.getFluid("ic2biomass"), 5000))
+ .duration(45 * SECONDS)
+ .eut(10)
+ .addTo(pyrolyseRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("biochaff", 1), GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.Water.getFluid(1500))
+ .fluidOutputs(Materials.FermentedBiomass.getFluid(1500))
+ .duration(10 * SECONDS)
+ .eut(10)
+ .addTo(pyrolyseRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(new FluidStack(FluidRegistry.getFluid("ic2biomass"), 1000))
+ .fluidOutputs(Materials.FermentedBiomass.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(10)
+ .addTo(pyrolyseRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(Materials.Biomass.getFluid(1000))
+ .fluidOutputs(Materials.FermentedBiomass.getFluid(1000))
+ .duration(5 * SECONDS)
+ .eut(10)
+ .addTo(pyrolyseRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Sugar.getDust(23), GT_Utility.getIntegratedCircuit(1))
+ .itemOutputs(Materials.Charcoal.getDust(12))
+ .fluidOutputs(Materials.Water.getFluid(1500))
+ .duration(16 * SECONDS)
+ .eut(64)
+ .addTo(pyrolyseRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Sugar.getDust(23), GT_Utility.getIntegratedCircuit(2))
+ .itemOutputs(Materials.Charcoal.getDust(12))
+ .fluidInputs(Materials.Nitrogen.getGas(500))
+ .fluidOutputs(Materials.Water.getFluid(1500))
+ .duration(8 * SECONDS)
+ .eut(96)
+ .addTo(pyrolyseRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/RecipeRemover.java b/src/main/java/gregtech/loaders/postload/recipes/RecipeRemover.java
new file mode 100644
index 0000000000..10132ece09
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/RecipeRemover.java
@@ -0,0 +1,166 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.ExtraTrees;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import ic2.api.recipe.ILiquidHeatExchangerManager;
+import ic2.api.recipe.Recipes;
+
+public class RecipeRemover implements Runnable {
+
+ @Override
+ public void run() {
+ GT_ModHandler.removeRecipeByOutput(ItemList.IC2_Fertilizer.get(1L));
+ removeCrafting();
+ removeSmelting();
+ removeIC2Recipes();
+ }
+
+ public void removeCrafting() {
+ GT_ModHandler.removeRecipe(new ItemStack(Items.lava_bucket), ItemList.Cell_Empty.get(1L));
+ GT_ModHandler.removeRecipe(new ItemStack(Items.water_bucket), ItemList.Cell_Empty.get(1L));
+ }
+
+ public void removeIC2Recipes() {
+
+ try {
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ GT_Values.NI,
+ Recipes.metalformerExtruding.getRecipes(),
+ ItemList.Cell_Empty.get(3L));
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ ItemList.IC2_Energium_Dust.get(1L),
+ Recipes.compressor.getRecipes(),
+ GT_Values.NI);
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ new ItemStack(Items.gunpowder),
+ Recipes.extractor.getRecipes(),
+ GT_Values.NI);
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ new ItemStack(Blocks.wool, 1, 32767),
+ Recipes.extractor.getRecipes(),
+ GT_Values.NI);
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ new ItemStack(Blocks.gravel),
+ Recipes.oreWashing.getRecipes(),
+ GT_Values.NI);
+ } catch (Throwable ignored) {}
+ GT_Utility.removeIC2BottleRecipe(
+ GT_ModHandler.getIC2Item("fuelRod", 1),
+ GT_ModHandler.getIC2Item("UranFuel", 1),
+ Recipes.cannerBottle.getRecipes(),
+ GT_ModHandler.getIC2Item("reactorUraniumSimple", 1, 1));
+ GT_Utility.removeIC2BottleRecipe(
+ GT_ModHandler.getIC2Item("fuelRod", 1),
+ GT_ModHandler.getIC2Item("MOXFuel", 1),
+ Recipes.cannerBottle.getRecipes(),
+ GT_ModHandler.getIC2Item("reactorMOXSimple", 1, 1));
+
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ new ItemStack(Blocks.cobblestone),
+ GT_ModHandler.getMaceratorRecipeList(),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L));
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Lapis, 1L),
+ GT_ModHandler.getMaceratorRecipeList(),
+ ItemList.IC2_Plantball.get(1L));
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Redstone, 1L),
+ GT_ModHandler.getMaceratorRecipeList(),
+ ItemList.IC2_Plantball.get(1L));
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Glowstone, 1L),
+ GT_ModHandler.getMaceratorRecipeList(),
+ ItemList.IC2_Plantball.get(1L));
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ GT_Values.NI,
+ GT_ModHandler.getMaceratorRecipeList(),
+ getModItem(IndustrialCraft2.ID, "itemBiochaff", 1L));
+
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ new ItemStack(Blocks.cactus, 8, 0),
+ GT_ModHandler.getCompressorRecipeList(),
+ getModItem(IndustrialCraft2.ID, "itemFuelPlantBall", 1L));
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ getModItem(ExtraTrees.ID, "food", 8L, 24),
+ GT_ModHandler.getCompressorRecipeList(),
+ getModItem(IndustrialCraft2.ID, "itemFuelPlantBall", 1L));
+
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ ItemList.Crop_Drop_BobsYerUncleRanks.get(1L),
+ GT_ModHandler.getExtractorRecipeList(),
+ null);
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ ItemList.Crop_Drop_Ferru.get(1L),
+ GT_ModHandler.getExtractorRecipeList(),
+ null);
+ GT_Utility.removeSimpleIC2MachineRecipe(
+ ItemList.Crop_Drop_Aurelia.get(1L),
+ GT_ModHandler.getExtractorRecipeList(),
+ null);
+
+ try {
+ Map<String, ILiquidHeatExchangerManager.HeatExchangeProperty> tLiqExchange = Recipes.liquidCooldownManager
+ .getHeatExchangeProperties();
+ Iterator<Map.Entry<String, ILiquidHeatExchangerManager.HeatExchangeProperty>> tIterator = tLiqExchange
+ .entrySet()
+ .iterator();
+ while (tIterator.hasNext()) {
+ Map.Entry<String, ILiquidHeatExchangerManager.HeatExchangeProperty> tEntry = tIterator.next();
+ if (tEntry.getKey()
+ .equals("ic2hotcoolant")) {
+ tIterator.remove();
+ Recipes.liquidCooldownManager.addFluid("ic2hotcoolant", "ic2coolant", 100);
+ }
+ }
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+
+ try {
+ Map<String, ILiquidHeatExchangerManager.HeatExchangeProperty> tLiqExchange = Recipes.liquidHeatupManager
+ .getHeatExchangeProperties();
+ Iterator<Map.Entry<String, ILiquidHeatExchangerManager.HeatExchangeProperty>> tIterator = tLiqExchange
+ .entrySet()
+ .iterator();
+ while (tIterator.hasNext()) {
+ Map.Entry<String, ILiquidHeatExchangerManager.HeatExchangeProperty> tEntry = tIterator.next();
+ if (tEntry.getKey()
+ .equals("ic2coolant")) {
+ tIterator.remove();
+ Recipes.liquidHeatupManager.addFluid("ic2coolant", "ic2hotcoolant", 100);
+ }
+ }
+ } catch (Throwable e) {
+ /* Do nothing */
+ }
+
+ }
+
+ public void removeSmelting() {
+ GT_ModHandler.removeFurnaceSmelting(GT_OreDictUnificator.get(OrePrefixes.ore, Materials.Graphite, 1L));
+ GT_ModHandler
+ .removeFurnaceSmelting(GT_OreDictUnificator.get(OrePrefixes.oreBlackgranite, Materials.Graphite, 1L));
+ GT_ModHandler.removeFurnaceSmelting(GT_OreDictUnificator.get(OrePrefixes.oreEndstone, Materials.Graphite, 1L));
+ GT_ModHandler
+ .removeFurnaceSmelting(GT_OreDictUnificator.get(OrePrefixes.oreNetherrack, Materials.Graphite, 1L));
+ GT_ModHandler
+ .removeFurnaceSmelting(GT_OreDictUnificator.get(OrePrefixes.oreRedgranite, Materials.Graphite, 1L));
+ GT_ModHandler.removeFurnaceSmelting(ItemList.IC2_Resin.get(1L));
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/SifterRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/SifterRecipes.java
new file mode 100644
index 0000000000..8d3614d76a
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/SifterRecipes.java
@@ -0,0 +1,47 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.sifterRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class SifterRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.gravel, 1, 0))
+ .itemOutputs(
+ new ItemStack(Items.flint, 1, 0),
+ new ItemStack(Items.flint, 1, 0),
+ new ItemStack(Items.flint, 1, 0),
+ new ItemStack(Items.flint, 1, 0),
+ new ItemStack(Items.flint, 1, 0),
+ new ItemStack(Items.flint, 1, 0))
+ .outputChances(10000, 9000, 8000, 6000, 3300, 2500)
+ .duration(30 * SECONDS)
+ .eut(16)
+ .addTo(sifterRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.crushedPurified, Materials.Coal, 1L))
+ .itemOutputs(
+ new ItemStack(Items.coal, 1, 0),
+ new ItemStack(Items.coal, 1, 0),
+ new ItemStack(Items.coal, 1, 0),
+ new ItemStack(Items.coal, 1, 0),
+ new ItemStack(Items.coal, 1, 0),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Coal, 1L))
+ .outputChances(10000, 9000, 8000, 7000, 6000, 5000)
+ .duration(30 * SECONDS)
+ .eut(16)
+ .addTo(sifterRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/SlicerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/SlicerRecipes.java
new file mode 100644
index 0000000000..73d251014e
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/SlicerRecipes.java
@@ -0,0 +1,42 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.slicerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+
+public class SlicerRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Dough_Chocolate.get(1), ItemList.Shape_Slicer_Flat.get(0))
+ .itemOutputs(ItemList.Food_Raw_Cookie.get(4))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(slicerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Baked_Bun.get(1), ItemList.Shape_Slicer_Flat.get(0))
+ .itemOutputs(ItemList.Food_Sliced_Bun.get(2))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(slicerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Baked_Bread.get(1), ItemList.Shape_Slicer_Flat.get(0))
+ .itemOutputs(ItemList.Food_Sliced_Bread.get(2))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(slicerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Food_Baked_Baguette.get(1), ItemList.Shape_Slicer_Flat.get(0))
+ .itemOutputs(ItemList.Food_Sliced_Baguette.get(2))
+ .duration(6 * SECONDS + 8 * TICKS)
+ .eut(4)
+ .addTo(slicerRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/SmelterRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/SmelterRecipes.java
new file mode 100644
index 0000000000..e56cc613e7
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/SmelterRecipes.java
@@ -0,0 +1,70 @@
+package gregtech.loaders.postload.recipes;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class SmelterRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_PotatoChips.get(1L), ItemList.Food_PotatoChips.get(1L));
+
+ GT_ModHandler
+ .addSmeltingRecipe(ItemList.Food_Potato_On_Stick.get(1L), ItemList.Food_Potato_On_Stick_Roasted.get(1L));
+
+ GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Bun.get(1L), ItemList.Food_Baked_Bun.get(1L));
+
+ GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Bread.get(1L), ItemList.Food_Baked_Bread.get(1L));
+
+ GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Baguette.get(1L), ItemList.Food_Baked_Baguette.get(1L));
+
+ GT_ModHandler
+ .addSmeltingRecipe(ItemList.Food_Raw_Pizza_Veggie.get(1L), ItemList.Food_Baked_Pizza_Veggie.get(1L));
+
+ GT_ModHandler
+ .addSmeltingRecipe(ItemList.Food_Raw_Pizza_Cheese.get(1L), ItemList.Food_Baked_Pizza_Cheese.get(1L));
+
+ GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Pizza_Meat.get(1L), ItemList.Food_Baked_Pizza_Meat.get(1L));
+
+ GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Baguette.get(1L), ItemList.Food_Baked_Baguette.get(1L));
+
+ GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Cake.get(1L), ItemList.Food_Baked_Cake.get(1L));
+
+ GT_ModHandler.addSmeltingRecipe(ItemList.Food_Raw_Cookie.get(1L), new ItemStack(Items.cookie, 1));
+
+ GT_ModHandler.addSmeltingRecipe(new ItemStack(Items.slime_ball, 1), ItemList.IC2_Resin.get(1L));
+
+ GT_ModHandler.addSmeltingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.ore, Materials.Graphite, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
+
+ GT_ModHandler.addSmeltingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.oreBlackgranite, Materials.Graphite, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
+
+ GT_ModHandler.addSmeltingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.oreEndstone, Materials.Graphite, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
+
+ GT_ModHandler.addSmeltingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.oreNetherrack, Materials.Graphite, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
+
+ GT_ModHandler.addSmeltingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Iron, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.WroughtIron, 1L));
+
+ GT_ModHandler.addSmeltingRecipe(
+ GT_OreDictUnificator.get(OrePrefixes.oreRedgranite, Materials.Graphite, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Graphite, 1L));
+
+ GameRegistry.addSmelting(ItemList.CompressedFireclay.get(1), ItemList.Firebrick.get(1), 0);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ThaumcraftRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ThaumcraftRecipes.java
new file mode 100644
index 0000000000..17bc8b3002
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/ThaumcraftRecipes.java
@@ -0,0 +1,961 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.util.GT_ModHandler.getModItem;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enchants.Enchantment_Hazmat;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.loaders.postload.GT_MachineRecipeLoader;
+
+public class ThaumcraftRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ if ((!Thaumcraft.isModLoaded()) || GregTech_API.sThaumcraftCompat == null) {
+ return;
+ }
+
+ // Add Recipe for TC Crucible: Salis Mundus to Balanced Shards
+ String tKey = "GT_BALANCE_SHARD_RECIPE";
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ "TB.SM",
+ getModItem(Thaumcraft.ID, "ItemResource", 1L, 14),
+ getModItem(Thaumcraft.ID, "ItemShard", 1L, 6),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L)));
+
+ tKey = "GT_WOOD_TO_CHARCOAL";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "You have discovered a way of making charcoal magically instead of using regular ovens for this purpose.<BR><BR>To create charcoal from wood you first need an air-free environment, some vacuus essentia is needed for that, then you need to incinerate the wood using ignis essentia and wait until all the water inside the wood is burned away.<BR><BR>This method however doesn't create creosote oil as byproduct.");
+
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Charcoal Transmutation",
+ "Turning wood into charcoal",
+ new String[] { "ALUMENTUM" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Charcoal, 1L),
+ 2,
+ 0,
+ 13,
+ 5,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ARBOR, 10L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 8L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.log.get(Materials.Wood),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Charcoal, 1L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))) });
+
+ tKey = "GT_FILL_WATER_BUCKET";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "You have discovered a way of filling a bucket with aqua essentia in order to simply get water.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Water Transmutation",
+ "Filling buckets with water",
+ null,
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Water, 1L),
+ 2,
+ 0,
+ 16,
+ 5,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 4L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Empty, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Water, 1L),
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L))),
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ GT_OreDictUnificator.get(OrePrefixes.bucketClay, Materials.Empty, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.bucketClay, Materials.Water, 1L),
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L))),
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ GT_OreDictUnificator.get(OrePrefixes.capsule, Materials.Empty, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.capsule, Materials.Water, 1L),
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L))),
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Empty, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1L),
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 4L))) });
+
+ tKey = "GT_TRANSZINC";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "You have discovered a way to multiply zinc by steeping zinc nuggets in metallum harvested from other metals.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Zinc Transmutation",
+ "Transformation of metals into zinc",
+ new String[] { "TRANSTIN" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Zinc, 1L),
+ 2,
+ 1,
+ 9,
+ 13,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.Zinc),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Zinc, 3L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.SANO, 1L))) });
+
+ tKey = "GT_TRANSANTIMONY";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "You have discovered a way to multiply antimony by steeping antimony nuggets in metallum harvested from other metals.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Antimony Transmutation",
+ "Transformation of metals into antimony",
+ new String[] { "GT_TRANSZINC", "TRANSLEAD" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Antimony, 1L),
+ 2,
+ 1,
+ 9,
+ 14,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.Antimony),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Antimony, 3L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L))) });
+
+ tKey = "GT_TRANSNICKEL";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "You have discovered a way to multiply nickel by steeping nickel nuggets in metallum harvested from other metals.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Nickel Transmutation",
+ "Transformation of metals into nickel",
+ new String[] { "TRANSLEAD" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Nickel, 1L),
+ 2,
+ 1,
+ 9,
+ 15,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.Nickel),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Nickel, 3L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))) });
+
+ tKey = "GT_TRANSCOBALT";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "You have discovered a way to multiply cobalt by steeping cobalt nuggets in metallum harvested from other metals.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Cobalt Transmutation",
+ "Transformation of metals into cobalt",
+ new String[] { "GT_TRANSNICKEL" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Cobalt, 1L),
+ 2,
+ 1,
+ 9,
+ 16,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.Cobalt),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Cobalt, 3L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1L))) });
+
+ tKey = "GT_TRANSBISMUTH";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "You have discovered a way to multiply bismuth by steeping bismuth nuggets in metallum harvested from other metals.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Bismuth Transmutation",
+ "Transformation of metals into bismuth",
+ new String[] { "GT_TRANSCOBALT" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Bismuth, 1L),
+ 2,
+ 1,
+ 11,
+ 17,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.Bismuth),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Bismuth, 3L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1L))) });
+
+ tKey = "GT_IRON_TO_STEEL";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "You have discovered a way of making Iron harder by just re-ordering its components.<BR><BR>This Method can be used to create a Material called Steel, which is used in many non-Thaumaturgic applications.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Steel Transmutation",
+ "Transforming iron to steel",
+ new String[] { "TRANSIRON", "GT_WOOD_TO_CHARCOAL" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 1L),
+ 3,
+ 0,
+ 13,
+ 8,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.Iron),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Steel, 1L),
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L))) });
+
+ tKey = "GT_TRANSBRONZE";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "You have discovered a way of creating Alloys using the already known transmutations of Copper and Tin.<BR><BR>This Method can be used to create a Bronze directly without having to go through an alloying process.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Bronze Transmutation",
+ "Transformation of metals into bronze",
+ new String[] { "TRANSTIN", "TRANSCOPPER" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Bronze, 1L),
+ 2,
+ 0,
+ 13,
+ 11,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.Bronze),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Bronze, 3L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1L))) });
+
+ tKey = "GT_TRANSELECTRUM";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "Your discovery of Bronze Transmutation has lead you to the conclusion it works with other Alloys such as Electrum as well.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Electrum Transmutation",
+ "Transformation of metals into electrum",
+ new String[] { "GT_TRANSBRONZE", "TRANSGOLD", "TRANSSILVER" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Electrum, 1L),
+ 2,
+ 1,
+ 11,
+ 11,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.Electrum),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Electrum, 3L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.LUCRUM, 1L))) });
+
+ tKey = "GT_TRANSBRASS";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "Your discovery of Bronze Transmutation has lead you to the conclusion it works with other Alloys such as Brass as well.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Brass Transmutation",
+ "Transformation of metals into brass",
+ new String[] { "GT_TRANSBRONZE", "GT_TRANSZINC" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Brass, 1L),
+ 2,
+ 1,
+ 11,
+ 12,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.Brass),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Brass, 3L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 1L))) });
+
+ tKey = "GT_TRANSINVAR";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "Your discovery of Bronze Transmutation has lead you to the conclusion it works with other Alloys such as Invar as well.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Invar Transmutation",
+ "Transformation of metals into invar",
+ new String[] { "GT_TRANSBRONZE", "GT_TRANSNICKEL" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Invar, 1L),
+ 2,
+ 1,
+ 11,
+ 15,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.Invar),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Invar, 3L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L))) });
+
+ tKey = "GT_TRANSCUPRONICKEL";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "Your discovery of Bronze Transmutation has lead you to the conclusion it works with other Alloys such as Cupronickel as well.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Cupronickel Transmutation",
+ "Transformation of metals into cupronickel",
+ new String[] { "GT_TRANSBRONZE", "GT_TRANSNICKEL" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Cupronickel, 1L),
+ 2,
+ 1,
+ 11,
+ 16,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.Cupronickel),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Cupronickel, 3L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))) });
+
+ tKey = "GT_TRANSBATTERYALLOY";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "Your discovery of Bronze Transmutation has lead you to the conclusion it works with other Alloys such as Battery Alloy as well.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Battery Alloy Transmutation",
+ "Transformation of metals into battery alloy",
+ new String[] { "GT_TRANSBRONZE", "GT_TRANSANTIMONY" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.BatteryAlloy, 1L),
+ 2,
+ 1,
+ 11,
+ 13,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.BatteryAlloy),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.BatteryAlloy, 3L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L))) });
+
+ tKey = "GT_TRANSSOLDERINGALLOY";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "Your discovery of Bronze Transmutation has lead you to the conclusion it works with other Alloys such as Soldering Alloy as well.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Soldering Alloy Transmutation",
+ "Transformation of metals into soldering alloy",
+ new String[] { "GT_TRANSBRONZE", "GT_TRANSANTIMONY" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.SolderingAlloy, 1L),
+ 2,
+ 1,
+ 11,
+ 14,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.SolderingAlloy),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.SolderingAlloy, 3L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.AQUA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 1L))) });
+
+ tKey = "GT_ADVANCEDMETALLURGY";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "Now that you have discovered all the basic metals, you can finally move on to the next Level of magic metallurgy and create more advanced metals");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Advanced Metallurgic Transmutation",
+ "Mastering the basic metals",
+ new String[] { "GT_TRANSBISMUTH", "GT_IRON_TO_STEEL", "GT_TRANSSOLDERINGALLOY", "GT_TRANSBATTERYALLOY",
+ "GT_TRANSBRASS", "GT_TRANSELECTRUM", "GT_TRANSCUPRONICKEL", "GT_TRANSINVAR" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Iron, 1L),
+ 3,
+ 0,
+ 16,
+ 14,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 50L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 20L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 20L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PRAECANTATIO, 20L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.NEBRISUM, 20L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 20L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey });
+
+ tKey = "GT_TRANSALUMINIUM";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "You have discovered a way to multiply aluminium by steeping aluminium nuggets in metallum harvested from other metals.<BR><BR>This transmutation is slightly harder to achieve, because aluminium has special properties, which require more order to achieve the desired result.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Aluminium Transmutation",
+ "Transformation of metals into aluminium",
+ new String[] { "GT_ADVANCEDMETALLURGY" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Aluminium, 1L),
+ 4,
+ 0,
+ 19,
+ 14,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VOLATUS, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.nugget.get(Materials.Aluminium),
+ GT_OreDictUnificator.get(OrePrefixes.nugget, Materials.Aluminium, 3L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VOLATUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.IGNIS, 1L))) });
+
+ tKey = "GT_TRANSSKYSTONE";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "You have discovered a way to convert obsidian to skystone.<BR><BR>Not sure why you'd want to do this, unless skystone is somehow unavailable in your world.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Skystone Transmutation",
+ "Transformation of obsidian into skystone",
+ new String[] { "GT_ADVANCEDMETALLURGY" },
+ "ALCHEMY",
+ getModItem(AppliedEnergistics2.ID, "tile.BlockSkyStone", 1),
+ 4,
+ 0,
+ 19,
+ 15,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VOLATUS, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ new ItemStack(Blocks.obsidian),
+ getModItem(AppliedEnergistics2.ID, "tile.BlockSkyStone", 1),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VOLATUS, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ALIENIS, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TENEBRAE, 1L))) });
+
+ tKey = "GT_TRANSMINERAL";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "You have discovered a way to convert basaltic mineral sand to granitic mineral sand and vice versa.<BR><BR>Handy for people living in the sky who can't access it normally, or if you really want one or the other.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Basaltic Mineral Transmutation",
+ "Transformation of mineral sands",
+ new String[] { "GT_ADVANCEDMETALLURGY" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GraniticMineralSand, 1L),
+ 4,
+ 0,
+ 19,
+ 16,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VOLATUS, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TERRA, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BasalticMineralSand, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GraniticMineralSand, 1L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1L))),
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.GraniticMineralSand, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.BasalticMineralSand, 1L),
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.METALLUM, 2L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MAGNETO, 1L))) });
+
+ tKey = "GT_CRYSTALLISATION";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "Sometimes when processing your Crystal Shards they become a pile of Dust instead of the mostly required Shard.<BR><BR>You have finally found a way to reverse this Process by using Vitreus Essentia for recrystallising the Shards.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Shard Recrystallisation",
+ "Fixing your precious crystals",
+ new String[] { "ALCHEMICALMANUFACTURE" },
+ "ALCHEMY",
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedOrder, 1L),
+ 3,
+ 0,
+ -11,
+ -3,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 5L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.PERMUTATIO, 3L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ORDO, 3L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.dust.get(Materials.Amber),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.Amber, 1L),
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))),
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.dust.get(Materials.InfusedOrder),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedOrder, 1L),
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))),
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.dust.get(Materials.InfusedEntropy),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedEntropy, 1L),
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))),
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.dust.get(Materials.InfusedAir),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedAir, 1L),
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))),
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.dust.get(Materials.InfusedEarth),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedEarth, 1L),
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))),
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.dust.get(Materials.InfusedFire),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedFire, 1L),
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))),
+ GregTech_API.sThaumcraftCompat.addCrucibleRecipe(
+ tKey,
+ OrePrefixes.dust.get(Materials.InfusedWater),
+ GT_OreDictUnificator.get(OrePrefixes.gem, Materials.InfusedWater, 1L),
+ Collections.singletonList(new TC_Aspects.TC_AspectStack(TC_Aspects.VITREUS, 4L))) });
+
+ tKey = "GT_MAGICENERGY";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "While trying to find new ways to integrate magic into your industrial factories, you have discovered a way to convert magical energy into electrical power.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Magic Energy Conversion",
+ "Magic to Power",
+ new String[] { "ARCANEBORE" },
+ "ARTIFICE",
+ ItemList.MagicEnergyConverter_LV.get(1L),
+ 3,
+ 0,
+ -3,
+ 10,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 10L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 10L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 20L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 10L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addInfusionRecipe(
+ tKey,
+ ItemList.Hull_LV.get(1L),
+ new ItemStack[] { new ItemStack(Blocks.beacon),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Good, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Aluminium, 1L),
+ ItemList.Sensor_MV.get(2L), GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Good, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1L),
+ ItemList.Sensor_MV.get(2L) },
+ ItemList.MagicEnergyConverter_LV.get(1L),
+ 5,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L))) });
+
+ tKey = "GT_MAGICENERGY2";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "Attempts to increase the output of your Magic Energy generators have resulted in significant improvements.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Adept Magic Energy Conversion",
+ "Magic to Power",
+ new String[] { "GT_MAGICENERGY" },
+ "ARTIFICE",
+ ItemList.MagicEnergyConverter_MV.get(1L),
+ 1,
+ 1,
+ -4,
+ 12,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 10L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 10L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 20L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 10L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addInfusionRecipe(
+ tKey,
+ ItemList.Hull_MV.get(1L),
+ new ItemStack[] { new ItemStack(Blocks.beacon),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Thaumium, 1L),
+ ItemList.Sensor_HV.get(2L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.StainlessSteel, 1L),
+ ItemList.Sensor_HV.get(2L) },
+ ItemList.MagicEnergyConverter_MV.get(1L),
+ 6,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L))) });
+
+ tKey = "GT_MAGICENERGY3";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "Attempts to further increase the output of your Magic Energy generators have resulted in great improvements.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Master Magic Energy Conversion",
+ "Magic to Power",
+ new String[] { "GT_MAGICENERGY2" },
+ "ARTIFICE",
+ ItemList.MagicEnergyConverter_HV.get(1L),
+ 1,
+ 1,
+ -4,
+ 14,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 20L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 20L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 40L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 20L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addInfusionRecipe(
+ tKey,
+ ItemList.Hull_HV.get(1L),
+ new ItemStack[] { new ItemStack(Blocks.beacon),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Data, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Thaumium, 1L),
+ ItemList.Field_Generator_MV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Data, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Titanium, 1L),
+ ItemList.Field_Generator_MV.get(1L) },
+ ItemList.MagicEnergyConverter_HV.get(1L),
+ 8,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L))) });
+
+ tKey = "GT_MAGICABSORB";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "Research into magical energy conversion methods has identified a way to convert surrounding energies into electrical power.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Magic Energy Absorption",
+ "Harvesting Magic",
+ new String[] { "GT_MAGICENERGY" },
+ "ARTIFICE",
+ ItemList.MagicEnergyAbsorber_LV.get(1L),
+ 3,
+ 0,
+ -2,
+ 12,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 10L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 10L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 20L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 10L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addInfusionRecipe(
+ tKey,
+ ItemList.Hull_LV.get(1L),
+ new ItemStack[] { ItemList.MagicEnergyConverter_LV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Good, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1L),
+ ItemList.Sensor_MV.get(2L) },
+ ItemList.MagicEnergyAbsorber_LV.get(1L),
+ 6,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 4L))) });
+
+ tKey = "GT_MAGICABSORB2";
+ GT_LanguageManager
+ .addStringLocalization(GT_MachineRecipeLoader.aTextTCGTPage + tKey, "Moar output! Drain all the Magic!");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Improved Magic Energy Absorption",
+ "Harvesting Magic",
+ new String[] { "GT_MAGICABSORB" },
+ "ARTIFICE",
+ ItemList.MagicEnergyAbsorber_EV.get(1L),
+ 3,
+ 1,
+ -2,
+ 14,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 10L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.COGNITIO, 10L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 20L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 10L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addInfusionRecipe(
+ tKey,
+ ItemList.Hull_MV.get(1L),
+ new ItemStack[] { ItemList.MagicEnergyConverter_MV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1L), ItemList.Sensor_HV.get(2L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1L) },
+ ItemList.MagicEnergyAbsorber_MV.get(1L),
+ 6,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 8L))),
+ GregTech_API.sThaumcraftCompat.addInfusionRecipe(
+ tKey,
+ ItemList.Hull_HV.get(1L),
+ new ItemStack[] { ItemList.MagicEnergyConverter_MV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Data, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Void, 1),
+ ItemList.Field_Generator_MV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Data, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Void, 1), },
+ ItemList.MagicEnergyAbsorber_HV.get(1L),
+ 8,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 64L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 16L))),
+ GregTech_API.sThaumcraftCompat.addInfusionRecipe(
+ tKey,
+ ItemList.Hull_EV.get(1L),
+ new ItemStack[] { ItemList.MagicEnergyConverter_HV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Elite, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Void, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 1),
+ ItemList.Field_Generator_HV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Elite, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Void, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 1), },
+ ItemList.MagicEnergyAbsorber_EV.get(1L),
+ 10,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.POTENTIA, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.ELECTRUM, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.MACHINA, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VACUOS, 128L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.INSTRUMENTUM, 256L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.STRONTIO, 64L))) });
+
+ tKey = "GT_HAZMATENCH";
+ GT_LanguageManager.addStringLocalization(
+ GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ "You have discovered a way to magically enchant a mundane piece of armor with the protective properties of a Hazmat suite.");
+ GregTech_API.sThaumcraftCompat.addResearch(
+ tKey,
+ "Hazmat Protection",
+ "Magical protection from physical hazards",
+ new String[] { "INFUSIONENCHANTMENT" },
+ "ARTIFICE",
+ GT_ModHandler.getIC2Item("hazmatChestplate", 1),
+ 4,
+ 0,
+ -7,
+ 13,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITIUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 1L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 1L)),
+ null,
+ new Object[] { GT_MachineRecipeLoader.aTextTCGTPage + tKey,
+ GregTech_API.sThaumcraftCompat.addInfusionEnchantmentRecipe(
+ tKey,
+ Enchantment_Hazmat.INSTANCE,
+ 5,
+ Arrays.asList(
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VITIUM, 8L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.GELUM, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.RADIO, 16L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.TUTAMEN, 32L),
+ new TC_Aspects.TC_AspectStack(TC_Aspects.VENENUM, 16L)),
+ new ItemStack[] { getModItem(Thaumcraft.ID, "ItemResource", 1L, 14),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Rubber, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Lead, 1),
+ getModItem(Thaumcraft.ID, "ItemResource", 1L, 14),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Rubber, 1),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Lead, 1) }) });
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/ThermalCentrifugeRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/ThermalCentrifugeRecipes.java
new file mode 100644
index 0000000000..7e10d2a1fc
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/ThermalCentrifugeRecipes.java
@@ -0,0 +1,30 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.thermalCentrifugeRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class ThermalCentrifugeRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.SunnariumCell.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Sunnarium, 1),
+ new ItemStack(Items.glowstone_dust, 2),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1))
+ .duration(25 * SECONDS)
+ .eut(TierEU.RECIPE_LV)
+ .addTo(thermalCentrifugeRecipes);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/TranscendentPlasmaMixerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/TranscendentPlasmaMixerRecipes.java
new file mode 100644
index 0000000000..123f9903ea
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/TranscendentPlasmaMixerRecipes.java
@@ -0,0 +1,142 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.transcendentPlasmaMixerRecipes;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.util.GT_Utility;
+
+public class TranscendentPlasmaMixerRecipes implements Runnable {
+
+ private static final int CRUDE_EU_PER_L = 14_514_983;
+ private static final int PROSAIC_EU_PER_L = 66_768_460;
+ private static final int RESPLENDENT_EU_PER_L = 269_326_451;
+ private static final int EXOTIC_EU_PER_L = 1_073_007_393;
+ private static final int STELLAR_EU_PER_HALF_L = 2_138_383_760;
+
+ private static final int PRIMORDIAL_MATTER = 2_000_000_000;
+
+ @Override
+ public void run() {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(1))
+ .fluidInputs(
+ Materials.Helium.getPlasma(1000),
+ Materials.Iron.getPlasma(1000),
+ Materials.Calcium.getPlasma(1000),
+ Materials.Niobium.getPlasma(1000))
+ .fluidOutputs(MaterialsUEVplus.ExcitedDTCC.getFluid(1000L))
+ .duration(100)
+ .eut(CRUDE_EU_PER_L)
+ .noOptimize()
+ .addTo(transcendentPlasmaMixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(2))
+ .fluidInputs(
+ Materials.Helium.getPlasma(1000),
+ Materials.Iron.getPlasma(1000),
+ Materials.Calcium.getPlasma(1000),
+ Materials.Niobium.getPlasma(1000),
+ Materials.Radon.getPlasma(1000),
+ Materials.Nickel.getPlasma(1000),
+ Materials.Boron.getPlasma(1000),
+ Materials.Sulfur.getPlasma(1000))
+ .fluidOutputs(MaterialsUEVplus.ExcitedDTPC.getFluid(1000L))
+ .duration(100)
+ .eut(PROSAIC_EU_PER_L)
+ .noOptimize()
+ .addTo(transcendentPlasmaMixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(3))
+ .fluidInputs(
+ Materials.Helium.getPlasma(1000),
+ Materials.Iron.getPlasma(1000),
+ Materials.Calcium.getPlasma(1000),
+ Materials.Niobium.getPlasma(1000),
+ Materials.Radon.getPlasma(1000),
+ Materials.Nickel.getPlasma(1000),
+ Materials.Boron.getPlasma(1000),
+ Materials.Sulfur.getPlasma(1000),
+ Materials.Nitrogen.getPlasma(1000),
+ Materials.Zinc.getPlasma(1000),
+ Materials.Silver.getPlasma(1000),
+ Materials.Titanium.getPlasma(1000))
+ .fluidOutputs(MaterialsUEVplus.ExcitedDTRC.getFluid(1000L))
+ .duration(100)
+ .eut(RESPLENDENT_EU_PER_L)
+ .noOptimize()
+ .addTo(transcendentPlasmaMixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(4))
+ .fluidInputs(
+ Materials.Helium.getPlasma(1000),
+ Materials.Iron.getPlasma(1000),
+ Materials.Calcium.getPlasma(1000),
+ Materials.Niobium.getPlasma(1000),
+ Materials.Radon.getPlasma(1000),
+ Materials.Nickel.getPlasma(1000),
+ Materials.Boron.getPlasma(1000),
+ Materials.Sulfur.getPlasma(1000),
+ Materials.Nitrogen.getPlasma(1000),
+ Materials.Zinc.getPlasma(1000),
+ Materials.Silver.getPlasma(1000),
+ Materials.Titanium.getPlasma(1000),
+ Materials.Americium.getPlasma(1000),
+ Materials.Bismuth.getPlasma(1000),
+ Materials.Oxygen.getPlasma(1000),
+ Materials.Tin.getPlasma(1000))
+ .fluidOutputs(MaterialsUEVplus.ExcitedDTEC.getFluid(1000L))
+ .duration(100)
+ .eut(EXOTIC_EU_PER_L)
+ .noOptimize()
+ .addTo(transcendentPlasmaMixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(5))
+ .fluidInputs(
+ Materials.Helium.getPlasma(1000),
+ Materials.Iron.getPlasma(1000),
+ Materials.Calcium.getPlasma(1000),
+ Materials.Niobium.getPlasma(1000),
+ Materials.Radon.getPlasma(1000),
+ Materials.Nickel.getPlasma(1000),
+ Materials.Boron.getPlasma(1000),
+ Materials.Sulfur.getPlasma(1000),
+ Materials.Nitrogen.getPlasma(1000),
+ Materials.Zinc.getPlasma(1000),
+ Materials.Silver.getPlasma(1000),
+ Materials.Titanium.getPlasma(1000),
+ Materials.Americium.getPlasma(1000),
+ Materials.Bismuth.getPlasma(1000),
+ Materials.Oxygen.getPlasma(1000),
+ Materials.Tin.getPlasma(1000),
+ Materials.Lead.getPlasma(1000),
+ Materials.Thorium.getPlasma(1000),
+ Materials.Plutonium241.getPlasma(1000L),
+ MaterialsUEVplus.RawStarMatter.getFluid(25L))
+ .fluidOutputs(MaterialsUEVplus.ExcitedDTSC.getFluid(1000L))
+ .duration(200)
+ .eut(STELLAR_EU_PER_HALF_L)
+ .noOptimize()
+ .addTo(transcendentPlasmaMixerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_Utility.getIntegratedCircuit(24))
+ .fluidInputs(
+ MaterialsUEVplus.RawStarMatter.getFluid(1000L),
+ MaterialsUEVplus.SpaceTime.getMolten(1000L),
+ MaterialsUEVplus.Space.getMolten(1000L),
+ MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1000L))
+ .fluidOutputs(MaterialsUEVplus.PrimordialMatter.getFluid(1000L))
+ .duration(100)
+ .eut(PRIMORDIAL_MATTER)
+ .noOptimize()
+ .addTo(transcendentPlasmaMixerRecipes);
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/VacuumFreezerRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/VacuumFreezerRecipes.java
new file mode 100644
index 0000000000..444db30889
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/VacuumFreezerRecipes.java
@@ -0,0 +1,416 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.recipe.RecipeMaps.vacuumFreezerRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.HOURS;
+import static gregtech.api.util.GT_RecipeBuilder.MINUTES;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class VacuumFreezerRecipes implements Runnable {
+
+ @Override
+ public void run() {
+ // reactor parts vacuum
+ {
+ // reactor heat switch
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("reactorHeatSwitch", 1L, 32767))
+ .itemOutputs(GT_ModHandler.getIC2Item("reactorHeatSwitch", 1L, 1))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("reactorHeatSwitchCore", 1L, 32767))
+ .itemOutputs(GT_ModHandler.getIC2Item("reactorHeatSwitchCore", 1L, 1))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("reactorHeatSwitchSpread", 1L, 32767))
+ .itemOutputs(GT_ModHandler.getIC2Item("reactorHeatSwitchSpread", 1L, 1))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("reactorHeatSwitchDiamond", 1L, 32767))
+ .itemOutputs(GT_ModHandler.getIC2Item("reactorHeatSwitchDiamond", 1L, 1))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+ }
+
+ // reactor vent
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("reactorVent", 1L, 32767))
+ .itemOutputs(GT_ModHandler.getIC2Item("reactorVent", 1L, 1))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("reactorVentCore", 1L, 32767))
+ .itemOutputs(GT_ModHandler.getIC2Item("reactorVentCore", 1L, 1))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("reactorVentGold", 1L, 32767))
+ .itemOutputs(GT_ModHandler.getIC2Item("reactorVentGold", 1L, 1))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("reactorVentDiamond", 1L, 32767))
+ .itemOutputs(GT_ModHandler.getIC2Item("reactorVentDiamond", 1L, 1))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+ }
+
+ // reactor vent spread
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("reactorVentSpread", 1L, 32767))
+ .itemOutputs(GT_ModHandler.getIC2Item("reactorVentSpread", 1L, 0))
+ .duration(5 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ // reactor coolant
+ {
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("reactorCoolantSimple", 1L, 32767))
+ .itemOutputs(GT_ModHandler.getIC2Item("reactorCoolantSimple", 1L, 1))
+ .duration(10 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("reactorCoolantTriple", 1L, 32767))
+ .itemOutputs(GT_ModHandler.getIC2Item("reactorCoolantTriple", 1L, 1))
+ .duration(1 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("reactorCoolantSix", 1L, 32767))
+ .itemOutputs(GT_ModHandler.getIC2Item("reactorCoolantSix", 1L, 1))
+ .duration(3 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_He_1.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_He_1.get(1L))
+ .duration(3 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_He_3.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_He_3.get(1L))
+ .duration(9 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_He_6.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_He_6.get(1L))
+ .duration(18 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_NaK_1.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_NaK_1.get(1L))
+ .duration(3 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_NaK_3.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_NaK_3.get(1L))
+ .duration(9 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_NaK_6.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_NaK_6.get(1L))
+ .duration(18 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.neutroniumHeatCapacitor.getWildcard(1L))
+ .itemOutputs(ItemList.neutroniumHeatCapacitor.get(1L))
+ .duration(13 * HOURS + 53 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_Sp_1.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_Sp_1.get(1L))
+ .duration(9 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_Sp_2.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_Sp_2.get(1L))
+ .duration(18 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_Sp_3.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_Sp_3.get(1L))
+ .duration(27 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_Sp_6.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_Sp_6.get(1L))
+ .duration(54 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ }
+ }
+
+ // fluid vacuum
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Water, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Ice, 1L))
+ .duration(2 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LiquidOxygen, 1L))
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Nitrogen, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LiquidNitrogen, 1L))
+ .duration(1 * MINUTES)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_ModHandler.getIC2Item("airCell", 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LiquidAir, 1L))
+ .duration(1 * SECONDS + 8 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_Sp_1.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_Sp_1.get(1L))
+ .duration(1 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_Sp_2.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_Sp_2.get(1L))
+ .duration(3 * MINUTES)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_Sp_3.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_Sp_3.get(1L))
+ .duration(4 * MINUTES + 30 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Reactor_Coolant_Sp_6.getWildcard(1L))
+ .itemOutputs(ItemList.Reactor_Coolant_Sp_6.get(1L))
+ .duration(9 * MINUTES)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+ }
+
+ // Freeze superconductors.
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.Pentacadmiummagnesiumhexaoxid, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Pentacadmiummagnesiumhexaoxid, 1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.Titaniumonabariumdecacoppereikosaoxid, 1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Titaniumonabariumdecacoppereikosaoxid, 1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.Uraniumtriplatinid, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Uraniumtriplatinid, 1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_EV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.Vanadiumtriindinid, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Vanadiumtriindinid, 1L))
+ .duration(10 * SECONDS)
+ .eut(TierEU.RECIPE_IV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(
+ OrePrefixes.ingotHot,
+ Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid,
+ 1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(
+ OrePrefixes.ingot,
+ Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid,
+ 1L))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator
+ .get(OrePrefixes.ingotHot, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tetranaquadahdiindiumhexaplatiumosminid, 1L))
+ .duration(20 * SECONDS)
+ .eut(TierEU.RECIPE_ZPM)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.Longasssuperconductornameforuvwire, 1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Longasssuperconductornameforuvwire, 1L))
+ .duration(40 * SECONDS)
+ .eut(TierEU.RECIPE_UV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.Longasssuperconductornameforuhvwire, 1L))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Longasssuperconductornameforuhvwire, 1L))
+ .duration(1 * MINUTES + 20 * SECONDS)
+ .eut(TierEU.RECIPE_UHV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUEVBase, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.SuperconductorUEVBase, 1L))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_UEV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUIVBase, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.SuperconductorUIVBase, 1L))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_UIV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, Materials.SuperconductorUMVBase, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.SuperconductorUMVBase, 1L))
+ .duration(2 * MINUTES + 40 * SECONDS)
+ .eut(TierEU.RECIPE_UMV)
+ .addTo(vacuumFreezerRecipes);
+ }
+
+ // Plasma Freezing
+ {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Americium, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cellMolten, Materials.Americium, 1L))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_LuV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Helium, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Helium, 1L))
+ .duration(5 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Nitrogen, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Nitrogen, 1L))
+ .duration(1 * SECONDS + 8 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Oxygen, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L))
+ .duration(1 * SECONDS + 12 * TICKS)
+ .eut(TierEU.RECIPE_MV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.cellPlasma, Materials.Radon, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Radon, 1L))
+ .duration(5 * SECONDS + 10 * TICKS)
+ .eut(TierEU.RECIPE_HV)
+ .addTo(vacuumFreezerRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(Materials.Boron.getPlasma(144L))
+ .fluidOutputs(Materials.Boron.getMolten(144L))
+ .duration(1 * SECONDS)
+ .eut(12)
+ .addTo(vacuumFreezerRecipes);
+ }
+
+ if (GTPlusPlus.isModLoaded()) {
+ // hot transcendent metal ingot cooling
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingotHot, MaterialsUEVplus.TranscendentMetal, 1L))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.ingot, MaterialsUEVplus.TranscendentMetal, 1L))
+ .fluidInputs(
+ new FluidStack(FluidRegistry.getFluid("molten.titansteel"), 144),
+ Materials.SuperCoolant.getFluid(1000))
+ .duration(1 * SECONDS)
+ .eut(TierEU.RECIPE_UIV)
+ .addTo(vacuumFreezerRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/postload/recipes/WiremillRecipes.java b/src/main/java/gregtech/loaders/postload/recipes/WiremillRecipes.java
new file mode 100644
index 0000000000..017a8e6582
--- /dev/null
+++ b/src/main/java/gregtech/loaders/postload/recipes/WiremillRecipes.java
@@ -0,0 +1,87 @@
+package gregtech.loaders.postload.recipes;
+
+import static gregtech.api.recipe.RecipeMaps.wiremillRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeRegistrator.registerWiremillRecipes;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.GT_Mod;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class WiremillRecipes implements Runnable {
+
+ @Override
+ public void run() {
+
+ registerWiremillRecipes(Materials.Graphene, 20 * SECONDS, 2, OrePrefixes.dust, OrePrefixes.stick, 1);
+
+ registerWiremillRecipes(MaterialsUEVplus.SpaceTime, 20 * SECONDS, (int) TierEU.RECIPE_LuV);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Polycaprolactam, 1L))
+ .itemOutputs(new ItemStack(Items.string, 32))
+ .duration(4 * SECONDS)
+ .eut(48)
+ .addTo(wiremillRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.Steel, 1))
+ .itemOutputs(GT_ModHandler.getIC2Item("miningPipe", 1))
+ .duration(10 * SECONDS)
+ .eut(16)
+ .addTo(wiremillRecipes);
+
+ if (!GT_Mod.gregtechproxy.mDisableIC2Cables) {
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Copper, 1L))
+ .itemOutputs(GT_ModHandler.getIC2Item("copperCableItem", 3L))
+ .duration(5 * SECONDS)
+ .eut(2)
+ .addTo(wiremillRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.AnnealedCopper, 1L))
+ .itemOutputs(GT_ModHandler.getIC2Item("copperCableItem", 3L))
+ .duration(5 * SECONDS)
+ .eut(2)
+ .addTo(wiremillRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Tin, 1L))
+ .itemOutputs(GT_ModHandler.getIC2Item("tinCableItem", 4L))
+ .duration(7 * SECONDS + 10 * TICKS)
+ .eut(1)
+ .addTo(wiremillRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iron, 1L))
+ .itemOutputs(GT_ModHandler.getIC2Item("ironCableItem", 6L))
+ .duration(10 * SECONDS)
+ .eut(2)
+ .addTo(wiremillRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.WroughtIron, 1L))
+ .itemOutputs(GT_ModHandler.getIC2Item("ironCableItem", 6L))
+ .duration(10 * SECONDS)
+ .eut(2)
+ .addTo(wiremillRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Gold, 1L))
+ .itemOutputs(GT_ModHandler.getIC2Item("goldCableItem", 6L))
+ .duration(10 * SECONDS)
+ .eut(1)
+ .addTo(wiremillRecipes);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_CircuitBehaviors.java b/src/main/java/gregtech/loaders/preload/GT_Loader_CircuitBehaviors.java
new file mode 100644
index 0000000000..fd66127e36
--- /dev/null
+++ b/src/main/java/gregtech/loaders/preload/GT_Loader_CircuitBehaviors.java
@@ -0,0 +1,31 @@
+package gregtech.loaders.preload;
+
+import gregtech.api.util.GT_Log;
+import gregtech.common.redstonecircuits.GT_Circuit_BasicLogic;
+import gregtech.common.redstonecircuits.GT_Circuit_BitAnd;
+import gregtech.common.redstonecircuits.GT_Circuit_CombinationLock;
+import gregtech.common.redstonecircuits.GT_Circuit_Equals;
+import gregtech.common.redstonecircuits.GT_Circuit_Pulser;
+import gregtech.common.redstonecircuits.GT_Circuit_Randomizer;
+import gregtech.common.redstonecircuits.GT_Circuit_RedstoneMeter;
+import gregtech.common.redstonecircuits.GT_Circuit_Repeater;
+import gregtech.common.redstonecircuits.GT_Circuit_Timer;
+
+public class GT_Loader_CircuitBehaviors implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Register Redstone Circuit behaviours.");
+ new GT_Circuit_Timer(0);
+ new GT_Circuit_BasicLogic(1);
+ new GT_Circuit_Repeater(2);
+ new GT_Circuit_Pulser(3);
+ new GT_Circuit_RedstoneMeter(4);
+
+ new GT_Circuit_Randomizer(8);
+
+ new GT_Circuit_CombinationLock(16);
+ new GT_Circuit_BitAnd(17);
+ new GT_Circuit_Equals(18);
+ }
+}
diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_ItemData.java b/src/main/java/gregtech/loaders/preload/GT_Loader_ItemData.java
new file mode 100644
index 0000000000..321ecca70f
--- /dev/null
+++ b/src/main/java/gregtech/loaders/preload/GT_Loader_ItemData.java
@@ -0,0 +1,383 @@
+package gregtech.loaders.preload;
+
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.enums.Mods.TwilightForest;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.objects.ItemData;
+import gregtech.api.objects.MaterialStack;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public class GT_Loader_ItemData implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Loading Item Data Tags");
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(TwilightForest.ID, "item.giantPick", 1L, 0),
+ new ItemData(Materials.Stone, 696729600L, new MaterialStack(Materials.Wood, 464486400L)));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(TwilightForest.ID, "item.giantSword", 1L, 0),
+ new ItemData(Materials.Stone, 464486400L, new MaterialStack(Materials.Wood, 232243200L)));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(TwilightForest.ID, "tile.GiantLog", 1L, 32767),
+ new ItemData(Materials.Wood, 232243200L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(TwilightForest.ID, "tile.GiantCobble", 1L, 32767),
+ new ItemData(Materials.Stone, 232243200L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(TwilightForest.ID, "tile.GiantObsidian", 1L, 32767),
+ new ItemData(Materials.Obsidian, 232243200L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(TwilightForest.ID, "item.minotaurAxe", 1L, 0),
+ new ItemData(
+ Materials.Diamond,
+ 14515200L,
+ new MaterialStack(Materials.Wood, OrePrefixes.stick.mMaterialAmount * 2L)));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(TwilightForest.ID, "item.armorShards", 1L, 0),
+ new ItemData(Materials.Knightmetal, 403200L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(TwilightForest.ID, "item.shardCluster", 1L, 0),
+ new ItemData(Materials.Knightmetal, 3628800L));
+ GT_OreDictUnificator.addItemData(ItemList.TF_LiveRoot.get(1L), new ItemData(Materials.LiveRoot, 3628800L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10),
+ new ItemData(Materials.CertusQuartz, 1814400L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11),
+ new ItemData(Materials.NetherQuartz, 1814400L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 12),
+ new ItemData(Materials.Fluix, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.quartz_block, 1, 32767), new ItemData(Materials.NetherQuartz, 14515200L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartz", 1L, 32767),
+ new ItemData(Materials.CertusQuartz, 14515200L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartzPillar", 1L, 32767),
+ new ItemData(Materials.CertusQuartz, 14515200L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(AppliedEnergistics2.ID, "tile.BlockQuartzChiseled", 1L, 32767),
+ new ItemData(Materials.CertusQuartz, 14515200L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Items.wheat, 1, 32767), new ItemData(Materials.Wheat, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.hay_block, 1, 32767), new ItemData(Materials.Wheat, 32659200L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Items.snowball, 1, 32767), new ItemData(Materials.Snow, 907200L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Blocks.snow, 1, 32767), new ItemData(Materials.Snow, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.glowstone, 1, 32767), new ItemData(Materials.Glowstone, 14515200L));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.redstone_lamp, 1, 32767),
+ new ItemData(
+ Materials.Glowstone,
+ 14515200L,
+ new MaterialStack(Materials.Redstone, OrePrefixes.dust.mMaterialAmount * 4L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.lit_redstone_lamp, 1, 32767),
+ new ItemData(
+ Materials.Glowstone,
+ 14515200L,
+ new MaterialStack(Materials.Redstone, OrePrefixes.dust.mMaterialAmount * 4L)));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(Forestry.ID, "craftingMaterial", 1L, 5),
+ new ItemData(Materials.Ice, 3628800L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Blocks.ice, 1, 32767), new ItemData(Materials.Ice, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.packed_ice, 1, 32767), new ItemData(Materials.Ice, 7257600L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Items.clay_ball, 1, 32767), new ItemData(Materials.Clay, 1814400L));
+ GT_OreDictUnificator.removeItemData(new ItemStack(Blocks.clay, 1, 0));
+ GT_OreDictUnificator.addItemData(new ItemStack(Blocks.clay, 1, 32767), new ItemData(Materials.Clay, 7257600L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.hardened_clay, 1, 32767), new ItemData(Materials.Clay, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stained_hardened_clay, 1, 32767), new ItemData(Materials.Clay, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.brick_block, 1, 32767), new ItemData(Materials.Brick, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(GT_ModHandler.getIC2Item("Uran238", 1L), new ItemData(Materials.Uranium, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(GT_ModHandler.getIC2Item("Uran235", 1L), new ItemData(Materials.Uranium235, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(GT_ModHandler.getIC2Item("Plutonium", 1L), new ItemData(Materials.Plutonium, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(GT_ModHandler.getIC2Item("smallUran235", 1L), new ItemData(Materials.Uranium235, 403200L));
+ GT_OreDictUnificator
+ .addItemData(GT_ModHandler.getIC2Item("smallPlutonium", 1L), new ItemData(Materials.Plutonium, 403200L));
+ GT_OreDictUnificator.addItemData(ItemList.IC2_Item_Casing_Iron.get(1L), new ItemData(Materials.Iron, 1814400L));
+ GT_OreDictUnificator.addItemData(ItemList.IC2_Item_Casing_Gold.get(1L), new ItemData(Materials.Gold, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(ItemList.IC2_Item_Casing_Bronze.get(1L), new ItemData(Materials.Bronze, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(ItemList.IC2_Item_Casing_Copper.get(1L), new ItemData(Materials.Copper, 1814400L));
+ GT_OreDictUnificator.addItemData(ItemList.IC2_Item_Casing_Tin.get(1L), new ItemData(Materials.Tin, 1814400L));
+ GT_OreDictUnificator.addItemData(ItemList.IC2_Item_Casing_Lead.get(1L), new ItemData(Materials.Lead, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(ItemList.IC2_Item_Casing_Steel.get(1L), new ItemData(Materials.Steel, 1814400L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Items.book, 1, 32767), new ItemData(Materials.Paper, 10886400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Items.written_book, 1, 32767), new ItemData(Materials.Paper, 10886400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Items.writable_book, 1, 32767), new ItemData(Materials.Paper, 10886400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Items.enchanted_book, 1, 32767), new ItemData(Materials.Paper, 10886400L));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Items.golden_apple, 1, 1),
+ new ItemData(Materials.Gold, OrePrefixes.block.mMaterialAmount * 8L));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Items.golden_apple, 1, 0),
+ new ItemData(Materials.Gold, OrePrefixes.ingot.mMaterialAmount * 8L));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Items.golden_carrot, 1, 0),
+ new ItemData(Materials.Gold, OrePrefixes.nugget.mMaterialAmount * 8L));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Items.speckled_melon, 1, 0),
+ new ItemData(Materials.Gold, OrePrefixes.nugget.mMaterialAmount * 8L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Items.minecart, 1), new ItemData(Materials.Iron, 18144000L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Items.iron_door, 1), new ItemData(Materials.Iron, 21772800L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Items.cauldron, 1), new ItemData(Materials.Iron, 25401600L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.iron_bars, 8, 32767), new ItemData(Materials.Iron, 10886400L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.SteelBars", 8L, 0),
+ new ItemData(Materials.Steel, 10886400L));
+ GT_OreDictUnificator
+ .addItemData(GT_ModHandler.getIC2Item("ironFurnace", 1L), new ItemData(Materials.Iron, 18144000L));
+ GT_OreDictUnificator.addItemData(ItemList.IC2_Food_Can_Empty.get(1L), new ItemData(Materials.Tin, 1814400L));
+ GT_OreDictUnificator.addItemData(ItemList.IC2_Fuel_Rod_Empty.get(1L), new ItemData(Materials.Iron, 3628800L));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.light_weighted_pressure_plate, 1, 32767),
+ new ItemData(Materials.Gold, 7257600L));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.heavy_weighted_pressure_plate, 1, 32767),
+ new ItemData(Materials.Iron, 7257600L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(Railcraft.ID, "anvil", 1L, 0),
+ new ItemData(Materials.Steel, 108864000L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(Railcraft.ID, "anvil", 1L, 1),
+ new ItemData(Materials.Steel, 72576000L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(Railcraft.ID, "anvil", 1L, 2),
+ new ItemData(Materials.Steel, 36288000L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Blocks.anvil, 1, 0), new ItemData(Materials.Iron, 108864000L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Blocks.anvil, 1, 1), new ItemData(Materials.Iron, 72576000L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Blocks.anvil, 1, 2), new ItemData(Materials.Iron, 36288000L));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.hopper, 1, 32767),
+ new ItemData(Materials.Iron, 18144000L, new MaterialStack(Materials.Wood, 29030400L)));
+ GT_OreDictUnificator.addItemData(ItemList.Cell_Universal_Fluid.get(1L), new ItemData(Materials.Tin, 7257600L));
+ GT_OreDictUnificator.addItemData(ItemList.Cell_Empty.get(1L), new ItemData(Materials.Tin, 7257600L));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.tripwire_hook, 1, 32767),
+ new ItemData(
+ Materials.Iron,
+ OrePrefixes.ring.mMaterialAmount * 2L,
+ new MaterialStack(Materials.Wood, 3628800L)));
+ GT_OreDictUnificator.addItemData(ItemList.Bottle_Empty.get(1L), new ItemData(Materials.Glass, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Items.potionitem, 1, 32767), new ItemData(Materials.Glass, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stained_glass, 1, 32767), new ItemData(Materials.Glass, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.glass, 1, 32767), new ItemData(Materials.Glass, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stained_glass_pane, 1, 32767), new ItemData(Materials.Glass, 1360800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.glass_pane, 1, 32767), new ItemData(Materials.Glass, 1360800L));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Items.clock, 1, 32767),
+ new ItemData(Materials.Gold, 14515200L, new MaterialStack(Materials.Redstone, 3628800L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Items.compass, 1, 32767),
+ new ItemData(Materials.Iron, 14515200L, new MaterialStack(Materials.Redstone, 3628800L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Items.iron_horse_armor, 1, 32767),
+ new ItemData(Materials.Iron, 29030400L, new MaterialStack(Materials.Leather, 21772800L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Items.golden_horse_armor, 1, 32767),
+ new ItemData(Materials.Gold, 29030400L, new MaterialStack(Materials.Leather, 21772800L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Items.diamond_horse_armor, 1, 32767),
+ new ItemData(Materials.Diamond, 29030400L, new MaterialStack(Materials.Leather, 21772800L)));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Items.leather, 1, 32767), new ItemData(Materials.Leather, 3628800L));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.beacon, 1, 32767),
+ new ItemData(
+ Materials.NetherStar,
+ 3628800L,
+ new MaterialStack(Materials.Obsidian, 10886400L),
+ new MaterialStack(Materials.Glass, 18144000L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.enchanting_table, 1, 32767),
+ new ItemData(
+ Materials.Diamond,
+ 7257600L,
+ new MaterialStack(Materials.Obsidian, 14515200L),
+ new MaterialStack(Materials.Paper, 10886400L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.ender_chest, 1, 32767),
+ new ItemData(Materials.EnderEye, 3628800L, new MaterialStack(Materials.Obsidian, 29030400L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.bookshelf, 1, 32767),
+ new ItemData(Materials.Paper, 32659200L, new MaterialStack(Materials.Wood, 21772800L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.lever, 1, 32767),
+ new ItemData(Materials.Stone, 3628800L, new MaterialStack(Materials.Wood, 1814400L)));
+ GT_OreDictUnificator.addItemData(new ItemStack(Blocks.ice, 1, 32767), new ItemData(Materials.Ice, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.packed_ice, 1, 32767), new ItemData(Materials.Ice, 7257600L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Blocks.snow, 1, 32767), new ItemData(Materials.Snow, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Items.snowball, 1, 32767), new ItemData(Materials.Snow, 907200L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Blocks.snow_layer, 1, 32767), new ItemData(Materials.Snow, -1L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Blocks.sand, 1, 32767), new ItemData(Materials.Sand, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.sandstone, 1, 32767), new ItemData(Materials.Sand, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stone_slab, 1, 0), new ItemData(Materials.Stone, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stone_slab, 1, 8), new ItemData(Materials.Stone, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 0), new ItemData(Materials.Stone, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 8), new ItemData(Materials.Stone, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stone_slab, 1, 1), new ItemData(Materials.Sand, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stone_slab, 1, 9), new ItemData(Materials.Sand, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 1), new ItemData(Materials.Sand, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 9), new ItemData(Materials.Sand, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stone_slab, 1, 2), new ItemData(Materials.Wood, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stone_slab, 1, 10), new ItemData(Materials.Wood, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 2), new ItemData(Materials.Wood, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 10), new ItemData(Materials.Wood, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stone_slab, 1, 3), new ItemData(Materials.Stone, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stone_slab, 1, 11), new ItemData(Materials.Stone, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 3), new ItemData(Materials.Stone, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 11), new ItemData(Materials.Stone, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stone_slab, 1, 5), new ItemData(Materials.Stone, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stone_slab, 1, 13), new ItemData(Materials.Stone, 1814400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 5), new ItemData(Materials.Stone, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.double_stone_slab, 1, 13), new ItemData(Materials.Stone, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stone, 1, 32767), new ItemData(Materials.Stone, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.furnace, 1, 32767), new ItemData(Materials.Stone, 29030400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.lit_furnace, 1, 32767), new ItemData(Materials.Stone, 29030400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stonebrick, 1, 32767), new ItemData(Materials.Stone, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.cobblestone, 1, 32767), new ItemData(Materials.Stone, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.mossy_cobblestone, 1, 32767), new ItemData(Materials.Stone, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stone_button, 1, 32767), new ItemData(Materials.Stone, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.stone_pressure_plate, 1, 32767), new ItemData(Materials.Stone, 7257600L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.ladder, 1, 32767), new ItemData(Materials.Wood, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.wooden_button, 1, 32767), new ItemData(Materials.Wood, 3628800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.wooden_pressure_plate, 1, 32767), new ItemData(Materials.Wood, 7257600L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Blocks.fence, 1, 32767), new ItemData(Materials.Wood, 5443200L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Items.bowl, 1, 32767), new ItemData(Materials.Wood, 3628800L));
+ GT_OreDictUnificator.addItemData(new ItemStack(Items.sign, 1, 32767), new ItemData(Materials.Wood, 7257600L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Items.wooden_door, 1, 32767), new ItemData(Materials.Wood, 21772800L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.chest, 1, 32767), new ItemData(Materials.Wood, 29030400L));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.trapped_chest, 1, 32767), new ItemData(Materials.Wood, 29030400L));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.unlit_redstone_torch, 1, 32767),
+ new ItemData(Materials.Wood, 1814400L, new MaterialStack(Materials.Redstone, 3628800L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.redstone_torch, 1, 32767),
+ new ItemData(Materials.Wood, 1814400L, new MaterialStack(Materials.Redstone, 3628800L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.noteblock, 1, 32767),
+ new ItemData(Materials.Wood, 29030400L, new MaterialStack(Materials.Redstone, 3628800L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.jukebox, 1, 32767),
+ new ItemData(Materials.Wood, 29030400L, new MaterialStack(Materials.Diamond, 3628800L)));
+ GT_OreDictUnificator
+ .addItemData(new ItemStack(Blocks.crafting_table, 1, 32767), new ItemData(Materials.Wood, 14515200L));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.piston, 1, 32767),
+ new ItemData(Materials.Stone, 14515200L, new MaterialStack(Materials.Wood, 10886400L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.sticky_piston, 1, 32767),
+ new ItemData(Materials.Stone, 14515200L, new MaterialStack(Materials.Wood, 10886400L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.dispenser, 1, 32767),
+ new ItemData(Materials.Stone, 25401600L, new MaterialStack(Materials.Redstone, 3628800L)));
+ GT_OreDictUnificator.addItemData(
+ new ItemStack(Blocks.dropper, 1, 32767),
+ new ItemData(Materials.Stone, 25401600L, new MaterialStack(Materials.Redstone, 3628800L)));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNuggetChicken", 1L, 32767),
+ new ItemData(Materials.MeatCooked, 403200L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNuggetBeef", 1L, 32767),
+ new ItemData(Materials.MeatCooked, 403200L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNuggetPork", 1L, 32767),
+ new ItemData(Materials.MeatCooked, 403200L));
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNuggetFish", 1L, 32767),
+ new ItemData(Materials.MeatCooked, 403200L));
+ for (ItemStack tItem : new ItemStack[] { GT_ModHandler.getModItem(TwilightForest.ID, "item.meefRaw", 1L, 0),
+ GT_ModHandler.getModItem(TwilightForest.ID, "item.venisonRaw", 1L, 0), new ItemStack(Items.porkchop),
+ new ItemStack(Items.beef), new ItemStack(Items.chicken), new ItemStack(Items.fish) }) {
+ if (tItem != null) {
+ GT_OreDictUnificator.addItemData(
+ GT_Utility.copyMetaData(32767, tItem),
+ new ItemData(Materials.MeatRaw, 3628800L, new MaterialStack(Materials.Bone, 403200L)));
+ }
+ }
+ for (ItemStack tItem : new ItemStack[] { GT_ModHandler.getModItem(TwilightForest.ID, "item.meefSteak", 1L, 0),
+ GT_ModHandler.getModItem(TwilightForest.ID, "item.venisonCooked", 1L, 0),
+ new ItemStack(Items.cooked_porkchop), new ItemStack(Items.cooked_beef), new ItemStack(Items.cooked_chicken),
+ new ItemStack(Items.cooked_fished) }) {
+ if (tItem != null) {
+ GT_OreDictUnificator.addItemData(
+ GT_Utility.copyMetaData(32767, tItem),
+ new ItemData(Materials.MeatCooked, 3628800L, new MaterialStack(Materials.Bone, 403200L)));
+ }
+ }
+ }
+}
diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java b/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java
new file mode 100644
index 0000000000..a0abf686f8
--- /dev/null
+++ b/src/main/java/gregtech/loaders/preload/GT_Loader_Item_Block_And_Fluid.java
@@ -0,0 +1,2232 @@
+package gregtech.loaders.preload;
+
+import static gregtech.api.enums.FluidState.GAS;
+import static gregtech.api.enums.FluidState.LIQUID;
+import static gregtech.api.enums.FluidState.MOLTEN;
+import static gregtech.api.enums.FluidState.SLURRY;
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.PamsHarvestCraft;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.enums.Mods.TwilightForest;
+import static gregtech.api.recipe.RecipeMaps.centrifugeRecipes;
+import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes;
+import static gregtech.api.recipe.RecipeMaps.maceratorRecipes;
+import static gregtech.api.recipe.RecipeMaps.thermalCentrifugeRecipes;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_RecipeBuilder.TICKS;
+import static gregtech.api.util.GT_RecipeBuilder.WILDCARD;
+
+import java.util.Locale;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidContainerRegistry;
+import net.minecraftforge.fluids.FluidRegistry;
+
+import codechicken.nei.api.API;
+import cpw.mods.fml.common.event.FMLInterModComms;
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsKevlar;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SubTag;
+import gregtech.api.fluid.GT_FluidFactory;
+import gregtech.api.items.GT_Block_LongDistancePipe;
+import gregtech.api.items.GT_BreederCell_Item;
+import gregtech.api.items.GT_Generic_Item;
+import gregtech.api.items.GT_RadioactiveCellIC_Item;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.metatileentity.BaseMetaTileEntity;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Block_Casings1;
+import gregtech.common.blocks.GT_Block_Casings2;
+import gregtech.common.blocks.GT_Block_Casings3;
+import gregtech.common.blocks.GT_Block_Casings4;
+import gregtech.common.blocks.GT_Block_Casings5;
+import gregtech.common.blocks.GT_Block_Casings6;
+import gregtech.common.blocks.GT_Block_Casings8;
+import gregtech.common.blocks.GT_Block_Casings9;
+import gregtech.common.blocks.GT_Block_Concretes;
+import gregtech.common.blocks.GT_Block_Drone;
+import gregtech.common.blocks.GT_Block_Granites;
+import gregtech.common.blocks.GT_Block_Machines;
+import gregtech.common.blocks.GT_Block_Metal;
+import gregtech.common.blocks.GT_Block_Ores;
+import gregtech.common.blocks.GT_Block_Reinforced;
+import gregtech.common.blocks.GT_Block_Stones;
+import gregtech.common.blocks.GT_Cyclotron_Coils;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+import gregtech.common.items.GT_DepletetCell_Item;
+import gregtech.common.items.GT_FluidDisplayItem;
+import gregtech.common.items.GT_IntegratedCircuit_Item;
+import gregtech.common.items.GT_MetaGenerated_Item_01;
+import gregtech.common.items.GT_MetaGenerated_Item_02;
+import gregtech.common.items.GT_MetaGenerated_Item_03;
+import gregtech.common.items.GT_MetaGenerated_Item_98;
+import gregtech.common.items.GT_MetaGenerated_Item_99;
+import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gregtech.common.items.GT_NeutronReflector_Item;
+import gregtech.common.items.GT_TierDrone;
+import gregtech.common.items.GT_VolumetricFlask;
+import gregtech.common.tileentities.render.TileDrone;
+
+public class GT_Loader_Item_Block_And_Fluid implements Runnable {
+
+ @Override
+ public void run() {
+ Materials.Water.mFluid = (Materials.Ice.mFluid = GT_ModHandler.getWater(1000L)
+ .getFluid());
+ Materials.Lava.mFluid = GT_ModHandler.getLava(1000L)
+ .getFluid();
+
+ GT_Log.out.println("GT_Mod: Register Books.");
+
+ GT_Utility.getWrittenBook(
+ "Manual_Printer",
+ "Printer Manual V2.0",
+ "Gregorius Techneticies",
+ "This Manual explains the different Functionalities the GregTech Printing Factory has built in, which are not in NEI. Most got NEI Support now, but there is still some left without it.",
+ "1. Coloring Items and Blocks: You know those Crafting Recipes, which have a dye surrounded by 8 Item to dye them? Or the ones which have just one Item and one Dye in the Grid? Those two Recipe Types can be cheaply automated using the Printer.",
+ "The Colorization Functionality even optimizes the Recipes, which normally require 8 Items + 1 Dye to 1 Item and an 8th of the normally used Dye in Fluid Form, isn't that awesome?",
+ "2. Copying Books: This Task got slightly harder. The first Step is putting the written and signed Book inside the Scanner with a Data Stick ready to receive the Data.",
+ "Now insert the Stick into the Data Slot of the Printer and add 3 pieces of Paper together with 144 Liters of actual Ink Fluid. Water mixed and chemical Dyes won't work on Paper without messing things up!",
+ "You got a stack of Pages for your new Book, just put them into the Assembler with some Glue and a piece of Leather for the Binding, and you receive an identical copy of the Book, which would stack together with the original.",
+ "3. Renaming Items: This Functionality is no longer Part of the Printer. There is now a Name Mold for the Forming Press to imprint a Name into an Item, just rename the Mold in an Anvil and use it in the Forming Press on any Item.",
+ "4. Crafting of Books, Maps, Nametags etc etc etc: Those Recipes moved to other Machines, just look them up in NEI.");
+
+ GT_Utility.getWrittenBook(
+ "Manual_Punch_Cards",
+ "Punch Card Manual V0.0",
+ "Gregorius Techneticies",
+ "This Manual will explain the Functionality of the Punch Cards, once they are fully implemented. And no, they won't be like the IRL Punch Cards. This is just a current Idea Collection.",
+ "(i1&&i2)?o1=15:o1=0;=10",
+ "ignore all Whitespace Characters, use Long for saving the Numbers",
+ "&& || ^^ & | ^ ! ++ -- + - % / // * ** << >> >>> < > <= >= == != ~ ( ) ?: , ; ;= ;=X; = i0 i1 i2 i3 i4 i5 o0 o1 o2 o3 o4 o5 v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 m0 m1 m2 m3 m4 m5 m6 m7 m8 m9 A B C D E F",
+ "'0' = false, 'everything but 0' = true, '!' turns '0' into '1' and everything else into '0'",
+ "',' is just a separator for multiple executed Codes in a row.",
+ "';' means that the Program waits until the next tick before continuing. ';=10' and ';=10;' both mean that it will wait 10 Ticks instead of 1. And ';=0' or anything < 0 will default to 0.",
+ "If the '=' Operator is used within Brackets, it returns the value the variable has been set to.",
+ "The Program saves the Char Index of the current Task, the 10 Variables (which reset to 0 as soon as the Program Loop stops), the 10 Member Variables and the remaining waiting Time in its NBT.",
+ "A = 10, B = 11, C = 12, D = 13, E = 14, F = 15, just for Hexadecimal Space saving, since Redstone has only 4 Bits.",
+ "For implementing Loops you just need 1 Punch Card per Loop, these Cards can restart once they are finished, depending on how many other Cards there are in the Program Loop you inserted your Card into, since it will process them procedurally.",
+ "A Punch Card Processor can run up to four Loops, each with the length of seven Punch Cards, parallel.",
+ "Why does the Punch Card need Ink to be made, you ask? Because the empty one needs to have some lines on, and the for the punched one it prints the Code to execute in a human readable format on the Card.");
+
+ GT_Utility.getWrittenBook(
+ "Manual_Microwave",
+ "Microwave Oven Manual",
+ "Kitchen Industries",
+ "Congratulations, you inserted a random seemingly empty Book into the Microwave and these Letters appeared out of nowhere.",
+ "You just got a Microwave Oven and asked yourself 'why do I even need it?'. It's simple, the Microwave can cook for just 128 EU and at an insane speed. Not even a normal E-furnace can do it that fast and cheap!",
+ "This is the cheapest and fastest way to cook for you. That is why the Microwave Oven can be found in almost every Kitchen (see www.youwannabuyakitchen.ly).",
+ "Long time exposure to Microwaves can cause Cancer, but we doubt Steve lives long enough to die because of that.",
+ "Do not insert any Metals. It might result in an Explosion.",
+ "Do not dry Animals with it. It will result in a Hot Dog, no matter which Animal you put into it.",
+ "Do not insert inflammable Objects. The Oven will catch on Fire.",
+ "Do not insert Explosives such as Eggs. Just don't.");
+
+ GT_Log.out.println("GT_Mod: Register Items.");
+
+ new GT_IntegratedCircuit_Item();
+ new GT_MetaGenerated_Item_01();
+ new GT_MetaGenerated_Item_02();
+ new GT_MetaGenerated_Item_03();
+ // GT_MetaGenerated_Item_98 is initialized in GT_Proxy.onPostLoad() because we need to wait for fluids to be
+ // registered.
+ // Pre-initialization needs to happen before then, though, because the cell icons get deleted at some point
+ // between load and post-load.
+ GT_MetaGenerated_Item_98.preInit();
+ new GT_MetaGenerated_Item_99();
+ new GT_MetaGenerated_Tool_01();
+ new GT_FluidDisplayItem();
+
+ // Tiered recipe materials actually appear to be set in GT_MetaTileEntity_BasicMachine_GT_Recipe, making these
+ // unused
+ ItemList.Rotor_LV.set(GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Tin, 1L));
+ ItemList.Rotor_MV.set(GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Bronze, 1L));
+ ItemList.Rotor_HV.set(GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Steel, 1L));
+ ItemList.Rotor_EV.set(GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.StainlessSteel, 1L));
+ ItemList.Rotor_IV.set(GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.TungstenSteel, 1L));
+
+ ItemList.VOLUMETRIC_FLASK.set(new GT_VolumetricFlask("Volumetric_Flask", "Volumetric flask", 1000));
+
+ Item tItem = (Item) GT_Utility.callConstructor(
+ "gregtech.common.items.GT_SensorCard_Item",
+ 0,
+ null,
+ false,
+ new Object[] { "sensorcard", "GregTech Sensor Card" });
+ ItemList.NC_SensorCard.set(
+ tItem == null ? new GT_Generic_Item("sensorcard", "GregTech Sensor Card", "Nuclear Control not installed")
+ : tItem);
+
+ Item advSensorCard = (Item) GT_Utility
+ .callConstructor("gregtech.common.items.GT_AdvancedSensorCard_Item", 0, null, false);
+ ItemList.NC_AdvancedSensorCard.set(
+ advSensorCard == null
+ ? new GT_Generic_Item(
+ "advancedsensorcard",
+ "GregTech Advanced Sensor Card",
+ "Nuclear Control not installed")
+ : advSensorCard);
+
+ ItemList.Neutron_Reflector
+ .set(new GT_NeutronReflector_Item("neutronreflector", "Iridium Neutron Reflector", 0));
+ ItemList.Reactor_Coolant_He_1
+ .set(GregTech_API.constructCoolantCellItem("60k_Helium_Coolantcell", "60k He Coolant Cell", 60000));
+ ItemList.Reactor_Coolant_He_3
+ .set(GregTech_API.constructCoolantCellItem("180k_Helium_Coolantcell", "180k He Coolant Cell", 180000));
+ ItemList.Reactor_Coolant_He_6
+ .set(GregTech_API.constructCoolantCellItem("360k_Helium_Coolantcell", "360k He Coolant Cell", 360000));
+ ItemList.Reactor_Coolant_NaK_1
+ .set(GregTech_API.constructCoolantCellItem("60k_NaK_Coolantcell", "60k NaK Coolantcell", 60000));
+ ItemList.Reactor_Coolant_NaK_3
+ .set(GregTech_API.constructCoolantCellItem("180k_NaK_Coolantcell", "180k NaK Coolantcell", 180000));
+ ItemList.Reactor_Coolant_NaK_6
+ .set(GregTech_API.constructCoolantCellItem("360k_NaK_Coolantcell", "360k NaK Coolantcell", 360000));
+
+ ItemList.Reactor_Coolant_Sp_1
+ .set(GregTech_API.constructCoolantCellItem("180k_Space_Coolantcell", "180k Sp Coolant Cell", 180000));
+
+ ItemList.Reactor_Coolant_Sp_2
+ .set(GregTech_API.constructCoolantCellItem("360k_Space_Coolantcell", "360k Sp Coolant Cell", 360000));
+
+ ItemList.Reactor_Coolant_Sp_3
+ .set(GregTech_API.constructCoolantCellItem("540k_Space_Coolantcell", "540k Sp Coolant Cell", 540000));
+
+ ItemList.Reactor_Coolant_Sp_6
+ .set(GregTech_API.constructCoolantCellItem("1080k_Space_Coolantcell", "1080k Sp Coolant Cell", 1080000));
+
+ ItemList.GlowstoneCell.set(
+ new GT_BreederCell_Item(
+ "glowstoneCell",
+ "Glowstone Fuel Rod",
+ "Source of sunnarium",
+ 3000,
+ 1,
+ 10000,
+ () -> ItemList.SunnariumCell.get(1)));
+ ItemList.SunnariumCell.set(new GT_DepletetCell_Item("sunnariumCell", "Sunnarium Fuel Rod", 1));
+
+ ItemList.neutroniumHeatCapacitor.set(
+ GregTech_API
+ .constructCoolantCellItem("neutroniumHeatCapacitor", "1G Neutronium Heat Capacitor", 1000000000));
+
+ ItemList.Depleted_Thorium_1.set(new GT_DepletetCell_Item("ThoriumcellDep", "Fuel Rod (Depleted Thorium)", 1));
+ ItemList.Depleted_Thorium_2
+ .set(new GT_DepletetCell_Item("Double_ThoriumcellDep", "Dual Fuel Rod (Depleted Thorium)", 1)); // TODO
+ // CHECK
+ // num
+ ItemList.Depleted_Thorium_4
+ .set(new GT_DepletetCell_Item("Quad_ThoriumcellDep", "Quad Fuel Rod (Depleted Thorium)", 1)); // TODO
+ // CHECK
+ // num
+ ItemList.ThoriumCell_1.set(
+ new GT_RadioactiveCellIC_Item(
+ "Thoriumcell",
+ "Fuel Rod (Thorium)",
+ 1,
+ 50000,
+ 0.4F,
+ 0,
+ 0.25F,
+ ItemList.Depleted_Thorium_1.get(1),
+ false));
+ ItemList.ThoriumCell_2.set(
+ new GT_RadioactiveCellIC_Item(
+ "Double_Thoriumcell",
+ "Dual Fuel Rod (Thorium)",
+ 2,
+ 50000,
+ 0.4F,
+ 0,
+ 0.25F,
+ ItemList.Depleted_Thorium_2.get(1),
+ false));
+ ItemList.ThoriumCell_4.set(
+ new GT_RadioactiveCellIC_Item(
+ "Quad_Thoriumcell",
+ "Quad Fuel Rod (Thorium)",
+ 4,
+ 50000,
+ 0.4F,
+ 0,
+ 0.25F,
+ ItemList.Depleted_Thorium_4.get(1),
+ false));
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Depleted_Thorium_1.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Lutetium, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 1L))
+ .duration(25 * SECONDS)
+ .eut(48)
+ .addTo(thermalCentrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Depleted_Thorium_2.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lutetium, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 3L))
+ .duration(25 * SECONDS)
+ .eut(48)
+ .addTo(thermalCentrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Depleted_Thorium_4.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Lutetium, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Thorium, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Iron, 6L))
+ .duration(25 * SECONDS)
+ .eut(48)
+ .addTo(thermalCentrifugeRecipes);
+
+ ItemList.Depleted_Naquadah_1
+ .set(new GT_DepletetCell_Item("NaquadahcellDep", "Fuel Rod (Depleted Naquadah)", 1));
+ ItemList.Depleted_Naquadah_2
+ .set(new GT_DepletetCell_Item("Double_NaquadahcellDep", "Dual Fuel Rod (Depleted Naquadah)", 1));
+ ItemList.Depleted_Naquadah_4
+ .set(new GT_DepletetCell_Item("Quad_NaquadahcellDep", "Quad Fuel Rod (Depleted Naquadah)", 1));
+ ItemList.NaquadahCell_1.set(
+ new GT_RadioactiveCellIC_Item(
+ "Naquadahcell",
+ "Fuel Rod (Naquadah)",
+ 1,
+ 100000,
+ 4F,
+ 1,
+ 1F,
+ ItemList.Depleted_Naquadah_1.get(1),
+ false));
+ ItemList.NaquadahCell_2.set(
+ new GT_RadioactiveCellIC_Item(
+ "Double_Naquadahcell",
+ "Dual Fuel Rod (Naquadah)",
+ 2,
+ 100000,
+ 4F,
+ 1,
+ 1F,
+ ItemList.Depleted_Naquadah_2.get(1),
+ false));
+ ItemList.NaquadahCell_4.set(
+ new GT_RadioactiveCellIC_Item(
+ "Quad_Naquadahcell",
+ "Quad Fuel Rod (Naquadah)",
+ 4,
+ 100000,
+ 4F,
+ 1,
+ 1F,
+ ItemList.Depleted_Naquadah_4.get(1),
+ false));
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Depleted_Naquadah_1.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.Naquadria, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.NaquadahEnriched, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 1L))
+ .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000)
+ .duration(25 * SECONDS)
+ .eut(2000)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Depleted_Naquadah_2.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.NaquadahEnriched, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 18L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 2L))
+ .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000)
+ .duration(50 * SECONDS)
+ .eut(2000)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Depleted_Naquadah_4.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadria, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.NaquadahEnriched, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 38L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 4L))
+ .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000)
+ .duration(100 * SECONDS)
+ .eut(2000)
+ .addTo(centrifugeRecipes);
+
+ ItemList.Depleted_MNq_1.set(new GT_DepletetCell_Item("MNqCellDep", "Fuel Rod (Depleted Nq*)", 1));
+ ItemList.Depleted_MNq_2.set(new GT_DepletetCell_Item("Double_MNqCellDep", "Dual Fuel Rod (Depleted Nq*)", 1));
+ ItemList.Depleted_MNq_4.set(new GT_DepletetCell_Item("Quad_MNqCellDep", "Quad Fuel Rod (Depleted Nq*)", 1));
+ ItemList.MNqCell_1.set(
+ new GT_RadioactiveCellIC_Item(
+ "MNqCell",
+ "Fuel Rod (Nq* - MOX like behaviour)",
+ 1,
+ 100000,
+ 4F,
+ 1,
+ 1F,
+ ItemList.Depleted_MNq_1.get(1),
+ true));
+ ItemList.MNqCell_2.set(
+ new GT_RadioactiveCellIC_Item(
+ "Double_MNqCell",
+ "Dual Fuel Rod (Nq* - MOX like behaviour)",
+ 2,
+ 100000,
+ 4F,
+ 1,
+ 1F,
+ ItemList.Depleted_MNq_2.get(1),
+ true));
+ ItemList.MNqCell_4.set(
+ new GT_RadioactiveCellIC_Item(
+ "Quad_MNqCell",
+ "Quad Fuel Rod (Nq* - MOX like behaviour)",
+ 4,
+ 100000,
+ 4F,
+ 1,
+ 1F,
+ ItemList.Depleted_MNq_4.get(1),
+ true));
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Depleted_MNq_1.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustSmall, Materials.NaquadahEnriched, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Naquadria, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 1L))
+ .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000)
+ .duration(25 * SECONDS)
+ .eut(2000)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Depleted_MNq_2.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Naquadria, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 18L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 2L))
+ .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000)
+ .duration(50 * SECONDS)
+ .eut(2000)
+ .addTo(centrifugeRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(ItemList.Depleted_MNq_4.get(1))
+ .itemOutputs(
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Naquadah, 4L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.NaquadahEnriched, 2L),
+ GT_OreDictUnificator.get(OrePrefixes.dustTiny, Materials.Naquadria, 8L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.TungstenSteel, 38L),
+ GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Platinum, 4L))
+ .outputChances(10_000, 5_000, 5_000, 2_500, 10_000, 10_000)
+ .duration(100 * SECONDS)
+ .eut(2000)
+ .addTo(centrifugeRecipes);
+
+ ItemList.Uraniumcell_1.set(
+ new GT_RadioactiveCellIC_Item(
+ "reactorUraniumSimple",
+ "Fuel Rod (Uranium)",
+ 1,
+ 20000,
+ 2F,
+ 1,
+ 1F,
+ GT_ModHandler.getIC2Item("reactorDepletedUraniumSimple", 1),
+ false));
+ ItemList.Uraniumcell_2.set(
+ new GT_RadioactiveCellIC_Item(
+ "reactorUraniumDual",
+ "Dual Fuel Rod (Uranium)",
+ 2,
+ 20000,
+ 2F,
+ 1,
+ 1F,
+ GT_ModHandler.getIC2Item("reactorDepletedUraniumDual", 1),
+ false));
+ ItemList.Uraniumcell_4.set(
+ new GT_RadioactiveCellIC_Item(
+ "reactorUraniumQuad",
+ "Quad Fuel Rod (Uranium)",
+ 4,
+ 20000,
+ 2F,
+ 1,
+ 1F,
+ GT_ModHandler.getIC2Item("reactorDepletedUraniumQuad", 1),
+ false));
+ ItemList.Moxcell_1.set(
+ new GT_RadioactiveCellIC_Item(
+ "reactorMOXSimple",
+ "Fuel Rod (Mox)",
+ 1,
+ 10000,
+ 2F,
+ 1,
+ 1F,
+ GT_ModHandler.getIC2Item("reactorDepletedMOXSimple", 1),
+ true));
+ ItemList.Moxcell_2.set(
+ new GT_RadioactiveCellIC_Item(
+ "reactorMOXDual",
+ "Dual Fuel Rod (Mox)",
+ 2,
+ 10000,
+ 2F,
+ 1,
+ 1F,
+ GT_ModHandler.getIC2Item("reactorDepletedMOXDual", 1),
+ true));
+ ItemList.Moxcell_4.set(
+ new GT_RadioactiveCellIC_Item(
+ "reactorMOXQuad",
+ "Quad Fuel Rod (Mox)",
+ 4,
+ 10000,
+ 2F,
+ 1,
+ 1F,
+ GT_ModHandler.getIC2Item("reactorDepletedMOXQuad", 1),
+ true));
+
+ GT_Log.out.println("GT_Mod: Adding Blocks.");
+ GregTech_API.sBlockMachines = new GT_Block_Machines();
+ GregTech_API.sBlockCasings1 = new GT_Block_Casings1();
+ GregTech_API.sBlockCasings2 = new GT_Block_Casings2();
+ GregTech_API.sBlockCasings3 = new GT_Block_Casings3();
+ GregTech_API.sBlockCasings4 = new GT_Block_Casings4();
+ GregTech_API.sBlockCasings5 = new GT_Block_Casings5();
+ GregTech_API.sBlockCasings6 = new GT_Block_Casings6();
+ GregTech_API.sBlockCasings8 = new GT_Block_Casings8();
+ GregTech_API.sBlockCasings9 = new GT_Block_Casings9();
+ GregTech_API.sBlockGranites = new GT_Block_Granites();
+ GregTech_API.sBlockLongDistancePipes = new GT_Block_LongDistancePipe();
+ GregTech_API.sBlockConcretes = new GT_Block_Concretes();
+ GregTech_API.sBlockStones = new GT_Block_Stones();
+ GregTech_API.sBlockOres1 = new GT_Block_Ores();
+ GregTech_API.sDroneRender = new GT_Block_Drone();
+ // meta ID order, DO NOT CHANGE ORDER
+
+ GregTech_API.sBlockMetal1 = new GT_Block_Metal(
+ "gt.blockmetal1",
+ new Materials[] { Materials.Adamantium, Materials.Aluminium, Materials.Americium, Materials.AnnealedCopper,
+ Materials.Antimony, Materials.Arsenic, Materials.AstralSilver, Materials.BatteryAlloy,
+ Materials.Beryllium, Materials.Bismuth, Materials.BismuthBronze, Materials.BlackBronze,
+ Materials.BlackSteel, Materials.BlueAlloy, Materials.BlueSteel, Materials.Brass },
+ OrePrefixes.block,
+ gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS1);
+
+ GregTech_API.sBlockMetal2 = new GT_Block_Metal(
+ "gt.blockmetal2",
+ new Materials[] { Materials.Bronze, Materials.Caesium, Materials.Cerium, Materials.Chrome,
+ Materials.ChromiumDioxide, Materials.Cobalt, Materials.CobaltBrass, Materials.Copper,
+ Materials.Cupronickel, Materials.DamascusSteel, Materials.DarkIron, Materials.DeepIron, Materials.Desh,
+ Materials.Duranium, Materials.Dysprosium, Materials.Electrum },
+ OrePrefixes.block,
+ gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS2);
+
+ GregTech_API.sBlockMetal3 = new GT_Block_Metal(
+ "gt.blockmetal3",
+ new Materials[] { Materials.ElectrumFlux, Materials.Enderium, Materials.Erbium, Materials.Europium,
+ Materials.FierySteel, Materials.Gadolinium, Materials.Gallium, Materials.Holmium, Materials.HSLA,
+ Materials.Indium, Materials.InfusedGold, Materials.Invar, Materials.Iridium, Materials.IronMagnetic,
+ Materials.IronWood, Materials.Kanthal },
+ OrePrefixes.block,
+ gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS3);
+
+ GregTech_API.sBlockMetal4 = new GT_Block_Metal(
+ "gt.blockmetal4",
+ new Materials[] { Materials.Knightmetal, Materials.Lanthanum, Materials.Lead, Materials.Lutetium,
+ Materials.Magnalium, Materials.Magnesium, Materials.Manganese, Materials.MeteoricIron,
+ Materials.MeteoricSteel, Materials.Trinium, Materials.Mithril, Materials.Molybdenum, Materials.Naquadah,
+ Materials.NaquadahAlloy, Materials.NaquadahEnriched, Materials.Naquadria },
+ OrePrefixes.block,
+ gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS4);
+
+ GregTech_API.sBlockMetal5 = new GT_Block_Metal(
+ "gt.blockmetal5",
+ new Materials[] { Materials.Neodymium, Materials.NeodymiumMagnetic, Materials.Neutronium,
+ Materials.Nichrome, Materials.Nickel, Materials.Niobium, Materials.NiobiumNitride,
+ Materials.NiobiumTitanium, Materials.Osmiridium, Materials.Osmium, Materials.Palladium,
+ Materials.PigIron, Materials.Platinum, Materials.Plutonium, Materials.Plutonium241,
+ Materials.Praseodymium },
+ OrePrefixes.block,
+ gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS5);
+
+ GregTech_API.sBlockMetal6 = new GT_Block_Metal(
+ "gt.blockmetal6",
+ new Materials[] { Materials.Promethium, Materials.RedAlloy, Materials.RedSteel, Materials.RoseGold,
+ Materials.Rubidium, Materials.Samarium, Materials.Scandium, Materials.ShadowIron, Materials.ShadowSteel,
+ Materials.Silicon, Materials.Silver, Materials.SolderingAlloy, Materials.StainlessSteel,
+ Materials.Steel, Materials.SteelMagnetic, Materials.SterlingSilver },
+ OrePrefixes.block,
+ gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS6);
+
+ GregTech_API.sBlockMetal7 = new GT_Block_Metal(
+ "gt.blockmetal7",
+ new Materials[] { Materials.Sunnarium, Materials.Tantalum, Materials.Tellurium, Materials.Terbium,
+ Materials.Thaumium, Materials.Thorium, Materials.Thulium, Materials.Tin, Materials.TinAlloy,
+ Materials.Titanium, Materials.Tritanium, Materials.Tungsten, Materials.TungstenSteel, Materials.Ultimet,
+ Materials.Uranium, Materials.Uranium235 },
+ OrePrefixes.block,
+ gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS7);
+
+ GregTech_API.sBlockMetal8 = new GT_Block_Metal(
+ "gt.blockmetal8",
+ new Materials[] { Materials.Vanadium, Materials.VanadiumGallium, Materials.WroughtIron, Materials.Ytterbium,
+ Materials.Yttrium, Materials.YttriumBariumCuprate, Materials.Zinc, Materials.TungstenCarbide,
+ Materials.VanadiumSteel, Materials.HSSG, Materials.HSSE, Materials.HSSS, Materials.Steeleaf,
+ Materials.Ichorium, Materials.Firestone, Materials.Shadow },
+ OrePrefixes.block,
+ gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS8);
+
+ GregTech_API.sBlockGem1 = new GT_Block_Metal(
+ "gt.blockgem1",
+ new Materials[] { Materials.InfusedAir, Materials.Amber, Materials.Amethyst, Materials.InfusedWater,
+ Materials.BlueTopaz, Materials.CertusQuartz, Materials.Dilithium, Materials.EnderEye,
+ Materials.EnderPearl, Materials.FoolsRuby, Materials.Force, Materials.Forcicium, Materials.Forcillium,
+ Materials.GreenSapphire, Materials.InfusedFire, Materials.Jasper },
+ OrePrefixes.block,
+ gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS9);
+
+ GregTech_API.sBlockGem2 = new GT_Block_Metal(
+ "gt.blockgem2",
+ new Materials[] { Materials.Lazurite, Materials.Lignite, Materials.Monazite, Materials.Niter,
+ Materials.Olivine, Materials.Opal, Materials.InfusedOrder, Materials.InfusedEntropy,
+ Materials.TricalciumPhosphate, Materials.Quartzite, Materials.GarnetRed, Materials.Ruby,
+ Materials.Sapphire, Materials.Sodalite, Materials.Tanzanite, Materials.InfusedEarth },
+ OrePrefixes.block,
+ gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS10);
+
+ GregTech_API.sBlockGem3 = new GT_Block_Metal(
+ "gt.blockgem3",
+ new Materials[] { Materials.Topaz, Materials.Vinteum, Materials.GarnetYellow, Materials.NetherStar,
+ Materials.Charcoal, Materials.Blaze },
+ OrePrefixes.block,
+ gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS11);
+
+ GregTech_API.sBlockMetal9 = new GT_Block_Metal(
+ "gt.blockmetal9",
+ new Materials[] { Materials.Cryolite, Materials.SiliconSG, MaterialsKevlar.NickelAluminide,
+ MaterialsUEVplus.SpaceTime, MaterialsUEVplus.TranscendentMetal, Materials.Oriharukon,
+ MaterialsUEVplus.WhiteDwarfMatter, MaterialsUEVplus.BlackDwarfMatter, MaterialsUEVplus.Universium,
+ MaterialsUEVplus.Eternity, MaterialsUEVplus.MagMatter },
+ OrePrefixes.block,
+ gregtech.api.enums.Textures.BlockIcons.STORAGE_BLOCKS12);
+
+ GregTech_API.sBlockReinforced = new GT_Block_Reinforced("gt.blockreinforced");
+
+ GT_Log.out.println("GT_Mod: Register TileEntities.");
+
+ BaseMetaTileEntity tBaseMetaTileEntity = GregTech_API.constructBaseMetaTileEntity();
+
+ GT_Log.out.println("GT_Mod: Registering the BaseMetaTileEntity.");
+ GameRegistry.registerTileEntity(tBaseMetaTileEntity.getClass(), "BaseMetaTileEntity");
+ FMLInterModComms.sendMessage(
+ AppliedEnergistics2.ID,
+ "whitelist-spatial",
+ tBaseMetaTileEntity.getClass()
+ .getName());
+
+ GT_Log.out.println("GT_Mod: Registering the DroneRender.");
+ GameRegistry.registerTileEntity(TileDrone.class, "DroneRender");
+
+ GT_Log.out.println("GT_Mod: Registering the BaseMetaPipeEntity.");
+ GameRegistry.registerTileEntity(BaseMetaPipeEntity.class, "BaseMetaPipeEntity");
+ FMLInterModComms.sendMessage(AppliedEnergistics2.ID, "whitelist-spatial", BaseMetaPipeEntity.class.getName());
+
+ GT_Log.out.println("GT_Mod: Registering the Ore TileEntity.");
+ GameRegistry.registerTileEntity(GT_TileEntity_Ores.class, "GT_TileEntity_Ores");
+ FMLInterModComms.sendMessage(AppliedEnergistics2.ID, "whitelist-spatial", GT_TileEntity_Ores.class.getName());
+
+ GT_Log.out.println("GT_Mod: Registering Fluids.");
+ Materials.ConstructionFoam.mFluid = GT_Utility
+ .getFluidForFilledItem(GT_ModHandler.getIC2Item("CFCell", 1L), true)
+ .getFluid();
+ Materials.UUMatter.mFluid = GT_Utility.getFluidForFilledItem(GT_ModHandler.getIC2Item("uuMatterCell", 1L), true)
+ .getFluid();
+
+ GT_FluidFactory.builder("Air")
+ .withLocalizedName("Air")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Air)
+ .registerContainers(ItemList.Cell_Air.get(1L), ItemList.Cell_Empty.get(1L), 2000);
+ GT_FluidFactory.builder("LiquidOxygen")
+ .withLocalizedName("Liquid Oxygen")
+ .withStateAndTemperature(GAS, 60)
+ .buildAndRegister()
+ .configureMaterials(Materials.LiquidOxygen)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LiquidOxygen, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("LiquidNitrogen")
+ .withLocalizedName("Liquid Nitrogen")
+ .withStateAndTemperature(GAS, 77)
+ .buildAndRegister()
+ .configureMaterials(Materials.LiquidNitrogen)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LiquidNitrogen, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("LiquidAir")
+ .withLocalizedName("Liquid Air")
+ .withStateAndTemperature(LIQUID, 77)
+ .buildAndRegister()
+ .configureMaterials(Materials.LiquidAir)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LiquidAir, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Oxygen")
+ .withLocalizedName("Oxygen")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Oxygen)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oxygen, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Hydrogen")
+ .withLocalizedName("Hydrogen")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Hydrogen)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Hydrogen, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Deuterium")
+ .withLocalizedName("Deuterium")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Deuterium)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Deuterium, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Tritium")
+ .withLocalizedName("Tritium")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Tritium)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Tritium, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Helium")
+ .withLocalizedName("Helium")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Helium)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Helium, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Argon")
+ .withLocalizedName("Argon")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Argon)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Argon, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Radon")
+ .withLocalizedName("Radon")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Radon)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Radon, 1L),
+ ItemList.Cell_Empty.get(1L));
+
+ GT_FluidFactory.builder("Fluorine")
+ .withLocalizedName("Fluorine")
+ .withStateAndTemperature(GAS, 53)
+ .buildAndRegister()
+ .configureMaterials(Materials.Fluorine)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Fluorine, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Titaniumtetrachloride")
+ .withLocalizedName("Titaniumtetrachloride")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Titaniumtetrachloride)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Titaniumtetrachloride, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Helium-3")
+ .withLocalizedName("Helium-3")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Helium_3)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Helium_3, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Methane")
+ .withLocalizedName("Methane")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Methane)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Methane, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Nitrogen")
+ .withLocalizedName("Nitrogen")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Nitrogen)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Nitrogen, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("NitrogenDioxide")
+ .withLocalizedName("Nitrogen Dioxide")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.NitrogenDioxide)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.NitrogenDioxide, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Steam")
+ .withLocalizedName("Steam")
+ .withStateAndTemperature(GAS, 375)
+ .buildAndRegister()
+ .configureMaterials(Materials.Water)
+ .registerBContainers(GT_ModHandler.getIC2Item("steamCell", 1), Materials.Empty.getCells(1));
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(Materials.Empty.getCells(1))
+ .itemOutputs(GT_ModHandler.getIC2Item("steamCell", 1))
+ .fluidInputs(GT_ModHandler.getSteam(1000))
+ .duration(16 * TICKS)
+ .eut(1)
+ .addTo(fluidCannerRecipes);
+
+ Materials.Ice.mGas = Materials.Water.mGas;
+ Materials.Water.mGas.setTemperature(375)
+ .setGaseous(true);
+
+ ItemList.sOilExtraHeavy = GT_FluidFactory.of("liquid_extra_heavy_oil", "Very Heavy Oil", LIQUID, 295);
+ ItemList.sEpichlorhydrin = GT_FluidFactory.builder("liquid_epichlorhydrin")
+ .withLocalizedName("Epichlorohydrin")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Epichlorohydrin)
+ .registerBContainers(Materials.Epichlorohydrin.getCells(1), Materials.Empty.getCells(1))
+ .asFluid();
+ ItemList.sDrillingFluid = GT_FluidFactory.of("liquid_drillingfluid", "Drilling Fluid", LIQUID, 295);
+ ItemList.sToluene = GT_FluidFactory.builder("liquid_toluene")
+ .withLocalizedName("Toluene")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Toluene)
+ .registerBContainers(Materials.Toluene.getCells(1), Materials.Empty.getCells(1))
+ .asFluid();
+ ItemList.sNitrationMixture = GT_FluidFactory.builder("liquid_nitrationmixture")
+ .withLocalizedName("Nitration Mixture")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.NitrationMixture)
+ .registerBContainers(Materials.NitrationMixture.getCells(1), Materials.Empty.getCells(1))
+ .asFluid();
+
+ GT_FluidFactory.builder("liquid_heavy_oil")
+ .withLocalizedName("Heavy Oil")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.OilHeavy)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.OilHeavy, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("liquid_medium_oil")
+ .withLocalizedName("Raw Oil")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.OilMedium)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.OilMedium, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("liquid_light_oil")
+ .withLocalizedName("Light Oil")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.OilLight)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.OilLight, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("gas_natural_gas")
+ .withLocalizedName("Natural Gas")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.NatruralGas)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.NatruralGas, 1L),
+ ItemList.Cell_Empty.get(1L));
+ ItemList.sHydricSulfur = GT_FluidFactory.builder("liquid_hydricsulfur")
+ .withLocalizedName("Hydrogen Sulfide")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.HydricSulfide)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HydricSulfide, 1L),
+ ItemList.Cell_Empty.get(1L))
+ .asFluid();
+ GT_FluidFactory.builder("gas_sulfuricgas")
+ .withLocalizedName("Sulfuric Gas")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.SulfuricGas)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricGas, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("gas_gas")
+ .withLocalizedName("Refinery Gas")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Gas)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Gas, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("liquid_sulfuricnaphtha")
+ .withLocalizedName("Sulfuric Naphtha")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.SulfuricNaphtha)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricNaphtha, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("liquid_sufluriclight_fuel")
+ .withLocalizedName("Sulfuric Light Fuel")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.SulfuricLightFuel)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricLightFuel, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("liquid_sulfuricheavy_fuel")
+ .withLocalizedName("Sulfuric Heavy Fuel")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.SulfuricHeavyFuel)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricHeavyFuel, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("liquid_naphtha")
+ .withLocalizedName("Naphtha")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Naphtha)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Naphtha, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("liquid_light_fuel")
+ .withLocalizedName("Light Fuel")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.LightFuel)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LightFuel, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("liquid_heavy_fuel")
+ .withLocalizedName("Heavy Fuel")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.HeavyFuel)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HeavyFuel, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("liquid_lpg")
+ .withLocalizedName("LPG")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.LPG)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.LPG, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("charcoal_byproducts")
+ .withTextureName("molten.autogenerated")
+ .withLocalizedName("Charcoal Byproducts")
+ .withColorRGBA(Materials.CharcoalByproducts.mRGBa)
+ .withStateAndTemperature(GAS, 775)
+ .buildAndRegister()
+ .configureMaterials(Materials.CharcoalByproducts)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.CharcoalByproducts, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("molten.bisphenol_a")
+ .withTextureName("molten.autogenerated")
+ .withLocalizedName("Molten Bisphenol A")
+ .withColorRGBA(Materials.BisphenolA.mRGBa)
+ .withStateAndTemperature(LIQUID, 432)
+ .buildAndRegister()
+ .configureMaterials(Materials.BisphenolA)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.BisphenolA, 1L),
+ ItemList.Cell_Empty.get(1L));
+
+ GT_FluidFactory.builder("UUAmplifier")
+ .withLocalizedName("UU Amplifier")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.UUAmplifier)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.UUAmplifier, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Chlorine")
+ .withLocalizedName("Chlorine")
+ .withStateAndTemperature(GAS, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Chlorine)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Chlorine, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Mercury")
+ .withLocalizedName("Mercury")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Mercury)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Mercury, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("NitroFuel")
+ .withLocalizedName("Cetane-Boosted Diesel")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.NitroFuel)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.NitroFuel, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("SodiumPersulfate")
+ .withLocalizedName("Sodium Persulfate")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.SodiumPersulfate)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SodiumPersulfate, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("Glyceryl")
+ .withLocalizedName("Glyceryl Trinitrate")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Glyceryl)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Glyceryl, 1L),
+ ItemList.Cell_Empty.get(1L));
+
+ GT_FluidFactory.builder("lubricant")
+ .withLocalizedName("Lubricant")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Lubricant)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Lubricant, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("creosote")
+ .withLocalizedName("Creosote Oil")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Creosote)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Creosote, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("seedoil")
+ .withLocalizedName("Seed Oil")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.SeedOil)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SeedOil, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("fishoil")
+ .withLocalizedName("Fish Oil")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.FishOil)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.FishOil, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("oil")
+ .withLocalizedName("Oil")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Oil)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Oil, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("fuel")
+ .withLocalizedName("Diesel")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Fuel)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Fuel, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("for.honey")
+ .withLocalizedName("Honey")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Honey)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Honey, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("biomass")
+ .withLocalizedName("Biomass")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Biomass)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Biomass, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("bioethanol")
+ .withLocalizedName("Bio Ethanol")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Ethanol)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Ethanol, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("sulfuricacid")
+ .withLocalizedName("Sulfuric Acid")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.SulfuricAcid)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.SulfuricAcid, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("milk")
+ .withLocalizedName("Milk")
+ .withStateAndTemperature(LIQUID, 290)
+ .buildAndRegister()
+ .configureMaterials(Materials.Milk)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Milk, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("mcguffium")
+ .withLocalizedName("Mc Guffium 239")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.McGuffium239)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.McGuffium239, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("refinedGlue")
+ .withLocalizedName("Refined Glue")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Glue)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Glue, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("hotfryingoil")
+ .withLocalizedName("Hot Frying Oil")
+ .withStateAndTemperature(LIQUID, 400)
+ .buildAndRegister()
+ .configureMaterials(Materials.FryingOilHot)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.FryingOilHot, 1L),
+ ItemList.Cell_Empty.get(1L));
+
+ GT_FluidFactory.builder("DimensionallyTranscendentResidue")
+ .withLocalizedName("Dimensionally Transcendent Residue")
+ .withStateAndTemperature(LIQUID, 2000000000)
+ .buildAndRegister()
+ .configureMaterials(MaterialsUEVplus.DimensionallyTranscendentResidue)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.DimensionallyTranscendentResidue, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("ExcitedDTCC")
+ .withLocalizedName("Excited Dimensionally Transcendent Crude Catalyst")
+ .withStateAndTemperature(LIQUID, 500000000)
+ .buildAndRegister()
+ .configureMaterials(MaterialsUEVplus.ExcitedDTCC)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTCC, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("ExcitedDTPC")
+ .withLocalizedName("Excited Dimensionally Transcendent Prosaic Catalyst")
+ .withStateAndTemperature(LIQUID, 500000000)
+ .buildAndRegister()
+ .configureMaterials(MaterialsUEVplus.ExcitedDTPC)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTPC, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("ExcitedDTRC")
+ .withLocalizedName("Excited Dimensionally Transcendent Resplendent Catalyst")
+ .withStateAndTemperature(LIQUID, 500000000)
+ .buildAndRegister()
+ .configureMaterials(MaterialsUEVplus.ExcitedDTRC)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTRC, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("ExcitedDTEC")
+ .withLocalizedName("Excited Dimensionally Transcendent Exotic Catalyst")
+ .withStateAndTemperature(LIQUID, 500000000)
+ .buildAndRegister()
+ .configureMaterials(MaterialsUEVplus.ExcitedDTEC)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTEC, 1L),
+ ItemList.Cell_Empty.get(1L));
+ GT_FluidFactory.builder("ExcitedDTSC")
+ .withLocalizedName("Excited Dimensionally Transcendent Stellar Catalyst")
+ .withStateAndTemperature(LIQUID, 500000000)
+ .buildAndRegister()
+ .configureMaterials(MaterialsUEVplus.ExcitedDTSC)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.ExcitedDTSC, 1L),
+ ItemList.Cell_Empty.get(1L));
+
+ GT_FluidFactory.builder(MaterialsUEVplus.RawStarMatter.mName)
+ .withLocalizedName(MaterialsUEVplus.RawStarMatter.mLocalizedName)
+ .withStateAndTemperature(LIQUID, 10_000_000)
+ .buildAndRegister()
+ .configureMaterials(MaterialsUEVplus.RawStarMatter)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.RawStarMatter, 1L),
+ ItemList.Cell_Empty.get(1L));
+
+ GT_FluidFactory.builder(MaterialsUEVplus.Space.mName)
+ .withLocalizedName(MaterialsUEVplus.Space.mLocalizedName)
+ .withStateAndTemperature(MOLTEN, 0)
+ .buildAndRegister()
+ .configureMaterials(MaterialsUEVplus.Space)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.Space, 1L),
+ ItemList.Cell_Empty.get(1L));
+
+ GT_FluidFactory.builder(MaterialsUEVplus.Time.mName)
+ .withLocalizedName(MaterialsUEVplus.Time.mLocalizedName)
+ .withStateAndTemperature(MOLTEN, 0)
+ .buildAndRegister()
+ .configureMaterials(MaterialsUEVplus.Time)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.Time, 1L),
+ ItemList.Cell_Empty.get(1L));
+
+ GT_FluidFactory.builder("PrimordialMatter")
+ .withLocalizedName(MaterialsUEVplus.PrimordialMatter.mLocalizedName)
+ .withStateAndTemperature(LIQUID, 2_000_000_000)
+ .buildAndRegister()
+ .configureMaterials(MaterialsUEVplus.PrimordialMatter)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.PrimordialMatter, 1L),
+ ItemList.Cell_Empty.get(1L));
+
+ GT_FluidFactory.builder("QuarkGluonPlasma")
+ .withLocalizedName(MaterialsUEVplus.QuarkGluonPlasma.mLocalizedName)
+ .withStateAndTemperature(LIQUID, 2_000_000_000)
+ .buildAndRegister()
+ .configureMaterials(MaterialsUEVplus.QuarkGluonPlasma)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.QuarkGluonPlasma, 1L),
+ ItemList.Cell_Empty.get(1L));
+
+ GT_FluidFactory.builder("fieryblood")
+ .withLocalizedName("Fiery Blood")
+ .withStateAndTemperature(LIQUID, 6400)
+ .buildAndRegister()
+ .configureMaterials(Materials.FierySteel)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.FierySteel, 1L),
+ ItemList.Cell_Empty.get(1L));
+
+ GT_FluidFactory.builder("holywater")
+ .withLocalizedName("Holy Water")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.HolyWater)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.HolyWater, 1L),
+ ItemList.Cell_Empty.get(1L));
+ if (ItemList.TF_Vial_FieryBlood.get(1L) != null) {
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ Materials.FierySteel.getFluid(250L),
+ ItemList.TF_Vial_FieryBlood.get(1L),
+ ItemList.Bottle_Empty.get(1L)));
+ }
+
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ Materials.Milk.getFluid(1000L),
+ GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Milk, 1L),
+ GT_OreDictUnificator.get(OrePrefixes.bucket, Materials.Empty, 1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ Materials.Milk.getFluid(250L),
+ ItemList.Bottle_Milk.get(1L),
+ ItemList.Bottle_Empty.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ Materials.HolyWater.getFluid(250L),
+ ItemList.Bottle_Holy_Water.get(1L),
+ ItemList.Bottle_Empty.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ Materials.McGuffium239.getFluid(250L),
+ ItemList.McGuffium_239.get(1L),
+ ItemList.Bottle_Empty.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ Materials.Fuel.getFluid(100L),
+ ItemList.Tool_Lighter_Invar_Full.get(1L),
+ ItemList.Tool_Lighter_Invar_Empty.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ Materials.Fuel.getFluid(1000L),
+ ItemList.Tool_Lighter_Platinum_Full.get(1L),
+ ItemList.Tool_Lighter_Platinum_Empty.get(1L)));
+
+ Dyes.dyeBlack.addFluidDye(GT_FluidFactory.of("squidink", "Squid Ink", LIQUID, 295));
+ Dyes.dyeBlue.addFluidDye(GT_FluidFactory.of("indigo", "Indigo Dye", LIQUID, 295));
+ for (byte i = 0; i < Dyes.VALUES.length; i = (byte) (i + 1)) {
+ Dyes tDye = Dyes.VALUES[i];
+ tDye.addFluidDye(
+ GT_FluidFactory.builder(
+ "dye.watermixed." + tDye.name()
+ .toLowerCase(Locale.ENGLISH))
+ .withTextureName("dyes")
+ .withLocalizedName("Water Mixed " + tDye.mName + " Dye")
+ .withColorRGBA(tDye.getRGBA())
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .asFluid());
+ tDye.addFluidDye(
+ GT_FluidFactory.builder(
+ "dye.chemical." + tDye.name()
+ .toLowerCase(Locale.ENGLISH))
+ .withTextureName("dyes")
+ .withLocalizedName("Chemical " + tDye.mName + " Dye")
+ .withColorRGBA(tDye.getRGBA())
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerContainers(ItemList.SPRAY_CAN_DYES[i].get(1L), ItemList.Spray_Empty.get(1L), 2304)
+ .asFluid());
+ }
+ GT_FluidFactory.builder("ice")
+ .withLocalizedName("Crushed Ice")
+ .withStateAndTemperature(SLURRY, 270)
+ .buildAndRegister()
+ .configureMaterials(Materials.Ice)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Ice, 1L),
+ ItemList.Cell_Empty.get(1L));
+ Materials.Water.mSolid = Materials.Ice.mSolid;
+
+ GT_FluidFactory.builder("molten.glass")
+ .withLocalizedName("Molten Glass")
+ .withStateAndTemperature(MOLTEN, 1500)
+ .buildAndRegister()
+ .configureMaterials(Materials.Glass)
+ .registerContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cellMolten, Materials.Glass, 1L),
+ ItemList.Cell_Empty.get(1L),
+ 144);
+ GT_FluidFactory.builder("molten.redstone")
+ .withLocalizedName("Molten Redstone")
+ .withStateAndTemperature(MOLTEN, 500)
+ .buildAndRegister()
+ .configureMaterials(Materials.Redstone)
+ .registerContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cellMolten, Materials.Redstone, 1L),
+ ItemList.Cell_Empty.get(1L),
+ 144);
+ GT_FluidFactory.builder("molten.blaze")
+ .withLocalizedName("Molten Blaze")
+ .withStateAndTemperature(MOLTEN, 6400)
+ .buildAndRegister()
+ .configureMaterials(Materials.Blaze)
+ .registerContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cellMolten, Materials.Blaze, 1L),
+ ItemList.Cell_Empty.get(1L),
+ 144);
+ GT_FluidFactory.builder("wet.concrete")
+ .withLocalizedName("Wet Concrete")
+ .withStateAndTemperature(MOLTEN, 300)
+ .buildAndRegister()
+ .configureMaterials(Materials.Concrete)
+ .registerContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cellMolten, Materials.Concrete, 1L),
+ ItemList.Cell_Empty.get(1L),
+ 144);
+
+ for (Materials tMaterial : Materials.values()) {
+ if ((tMaterial.mStandardMoltenFluid == null) && (tMaterial.contains(SubTag.SMELTING_TO_FLUID))
+ && (!tMaterial.contains(SubTag.NO_SMELTING))) {
+ GT_Mod.gregtechproxy.addAutogeneratedMoltenFluid(tMaterial);
+ if ((tMaterial.mSmeltInto != tMaterial) && (tMaterial.mSmeltInto.mStandardMoltenFluid == null)) {
+ GT_Mod.gregtechproxy.addAutogeneratedMoltenFluid(tMaterial.mSmeltInto);
+ }
+ }
+ if (tMaterial.mElement != null) {
+ GT_Mod.gregtechproxy.addAutogeneratedPlasmaFluid(tMaterial);
+ }
+ if (tMaterial.hasCorrespondingFluid()) {
+ GT_Mod.gregtechproxy.addAutoGeneratedCorrespondingFluid(tMaterial);
+ }
+ if (tMaterial.hasCorrespondingGas()) {
+ GT_Mod.gregtechproxy.addAutoGeneratedCorrespondingGas(tMaterial);
+ }
+ if (tMaterial.canBeCracked()) {
+ GT_Mod.gregtechproxy.addAutoGeneratedHydroCrackedFluids(tMaterial);
+ GT_Mod.gregtechproxy.addAutoGeneratedSteamCrackedFluids(tMaterial);
+ }
+ }
+
+ GT_FluidFactory.builder("potion.awkward")
+ .withLocalizedName("Awkward Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.thick")
+ .withLocalizedName("Thick Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 32), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.mundane")
+ .withLocalizedName("Mundane Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 64), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.damage")
+ .withLocalizedName("Harming Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8204), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.damage.strong")
+ .withLocalizedName("Strong Harming Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8236), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.damage.splash")
+ .withLocalizedName("Splash Harming Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16396), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.damage.strong.splash")
+ .withLocalizedName("Strong Splash Harming Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16428), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.health")
+ .withLocalizedName("Healing Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8197), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.health.strong")
+ .withLocalizedName("Strong Healing Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8229), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.health.splash")
+ .withLocalizedName("Splash Healing Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16389), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.health.strong.splash")
+ .withLocalizedName("Strong Splash Healing Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16421), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.speed")
+ .withLocalizedName("Swiftness Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8194), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.speed.strong")
+ .withLocalizedName("Strong Swiftness Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8226), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.speed.long")
+ .withLocalizedName("Stretched Swiftness Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8258), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.speed.splash")
+ .withLocalizedName("Splash Swiftness Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16386), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.speed.strong.splash")
+ .withLocalizedName("Strong Splash Swiftness Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16418), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.speed.long.splash")
+ .withLocalizedName("Stretched Splash Swiftness Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16450), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.strength")
+ .withLocalizedName("Strength Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8201), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.strength.strong")
+ .withLocalizedName("Strong Strength Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8233), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.strength.long")
+ .withLocalizedName("Stretched Strength Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8265), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.strength.splash")
+ .withLocalizedName("Splash Strength Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16393), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.strength.strong.splash")
+ .withLocalizedName("Strong Splash Strength Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16425), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.strength.long.splash")
+ .withLocalizedName("Stretched Splash Strength Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16457), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.regen")
+ .withLocalizedName("Regenerating Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8193), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.regen.strong")
+ .withLocalizedName("Strong Regenerating Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8225), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.regen.long")
+ .withLocalizedName("Stretched Regenerating Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8257), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.regen.splash")
+ .withLocalizedName("Splash Regenerating Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16385), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.regen.strong.splash")
+ .withLocalizedName("Strong Splash Regenerating Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16417), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.regen.long.splash")
+ .withLocalizedName("Stretched Splash Regenerating Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16449), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.poison")
+ .withLocalizedName("Poisonous Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8196), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.poison.strong")
+ .withLocalizedName("Strong Poisonous Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8228), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.poison.long")
+ .withLocalizedName("Stretched Poisonous Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8260), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.poison.splash")
+ .withLocalizedName("Splash Poisonous Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16388), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.poison.strong.splash")
+ .withLocalizedName("Strong Splash Poisonous Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16420), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.poison.long.splash")
+ .withLocalizedName("Stretched Splash Poisonous Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16452), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.fireresistance")
+ .withLocalizedName("Fire Resistant Brew")
+ .withStateAndTemperature(LIQUID, 375)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8195), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.fireresistance.long")
+ .withLocalizedName("Stretched Fire Resistant Brew")
+ .withStateAndTemperature(LIQUID, 375)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8259), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.fireresistance.splash")
+ .withLocalizedName("Splash Fire Resistant Brew")
+ .withStateAndTemperature(LIQUID, 375)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16387), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.fireresistance.long.splash")
+ .withLocalizedName("Stretched Splash Fire Resistant Brew")
+ .withStateAndTemperature(LIQUID, 375)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16451), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.nightvision")
+ .withLocalizedName("Night Vision Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8198), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.nightvision.long")
+ .withLocalizedName("Stretched Night Vision Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8262), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.nightvision.splash")
+ .withLocalizedName("Splash Night Vision Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16390), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.nightvision.long.splash")
+ .withLocalizedName("Stretched Splash Night Vision Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16454), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.weakness")
+ .withLocalizedName("Weakening Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8200), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.weakness.long")
+ .withLocalizedName("Stretched Weakening Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8264), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.weakness.splash")
+ .withLocalizedName("Splash Weakening Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16392), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.weakness.long.splash")
+ .withLocalizedName("Stretched Splash Weakening Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16456), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.slowness")
+ .withLocalizedName("Lame Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8202), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.slowness.long")
+ .withLocalizedName("Stretched Lame Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8266), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.slowness.splash")
+ .withLocalizedName("Splash Lame Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16394), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.slowness.long.splash")
+ .withLocalizedName("Stretched Splash Lame Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16458), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.waterbreathing")
+ .withLocalizedName("Fishy Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8205), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.waterbreathing.long")
+ .withLocalizedName("Stretched Fishy Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8269), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.waterbreathing.splash")
+ .withLocalizedName("Splash Fishy Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16397), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.waterbreathing.long.splash")
+ .withLocalizedName("Stretched Splash Fishy Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16461), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.invisibility")
+ .withLocalizedName("Invisible Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8206), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.invisibility.long")
+ .withLocalizedName("Stretched Invisible Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 8270), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.invisibility.splash")
+ .withLocalizedName("Splash Invisible Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16398), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.invisibility.long.splash")
+ .withLocalizedName("Stretched Splash Invisible Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(new ItemStack(Items.potionitem, 1, 16462), ItemList.Bottle_Empty.get(1L));
+
+ GT_FluidFactory.builder("potion.purpledrink")
+ .withLocalizedName("Purple Drink")
+ .withStateAndTemperature(LIQUID, 275)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Purple_Drink.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.grapejuice")
+ .withLocalizedName("Grape Juice")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Grape_Juice.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.wine")
+ .withLocalizedName("Wine")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Wine.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.vinegar")
+ .withLocalizedName("Vinegar")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .configureMaterials(Materials.Vinegar)
+ .registerPContainers(ItemList.Bottle_Vinegar.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.potatojuice")
+ .withLocalizedName("Potato Juice")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Potato_Juice.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.vodka")
+ .withLocalizedName("Vodka")
+ .withStateAndTemperature(LIQUID, 275)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Vodka.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.leninade")
+ .withLocalizedName("Leninade")
+ .withStateAndTemperature(LIQUID, 275)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Leninade.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.mineralwater")
+ .withLocalizedName("Mineral Water")
+ .withStateAndTemperature(LIQUID, 275)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Mineral_Water.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.saltywater")
+ .withLocalizedName("Salty Water")
+ .withStateAndTemperature(LIQUID, 275)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Salty_Water.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.reedwater")
+ .withLocalizedName("Reed Water")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Reed_Water.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.rum")
+ .withLocalizedName("Rum")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Rum.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.piratebrew")
+ .withLocalizedName("Pirate Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Pirate_Brew.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.hopsjuice")
+ .withLocalizedName("Hops Juice")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Hops_Juice.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.darkbeer")
+ .withLocalizedName("Dark Beer")
+ .withStateAndTemperature(LIQUID, 275)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Dark_Beer.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.dragonblood")
+ .withLocalizedName("Dragon Blood")
+ .withStateAndTemperature(LIQUID, 375)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Dragon_Blood.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.wheatyjuice")
+ .withLocalizedName("Wheaty Juice")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Wheaty_Juice.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.scotch")
+ .withLocalizedName("Scotch")
+ .withStateAndTemperature(LIQUID, 275)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Scotch.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.glenmckenner")
+ .withLocalizedName("Glen McKenner")
+ .withStateAndTemperature(LIQUID, 275)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Glen_McKenner.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.wheatyhopsjuice")
+ .withLocalizedName("Wheaty Hops Juice")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Wheaty_Hops_Juice.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.beer")
+ .withLocalizedName("Beer")
+ .withStateAndTemperature(LIQUID, 275)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Beer.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.chillysauce")
+ .withLocalizedName("Chilly Sauce")
+ .withStateAndTemperature(LIQUID, 375)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Chilly_Sauce.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.hotsauce")
+ .withLocalizedName("Hot Sauce")
+ .withStateAndTemperature(LIQUID, 380)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Hot_Sauce.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.diabolosauce")
+ .withLocalizedName("Diabolo Sauce")
+ .withStateAndTemperature(LIQUID, 385)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Diabolo_Sauce.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.diablosauce")
+ .withLocalizedName("Diablo Sauce")
+ .withStateAndTemperature(LIQUID, 390)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Diablo_Sauce.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.diablosauce.strong")
+ .withLocalizedName("Old Man Snitches glitched Diablo Sauce")
+ .withStateAndTemperature(LIQUID, 999)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Snitches_Glitch_Sauce.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.applejuice")
+ .withLocalizedName("Apple Juice")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Apple_Juice.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.cider")
+ .withLocalizedName("Cider")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Cider.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.goldenapplejuice")
+ .withLocalizedName("Golden Apple Juice")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Golden_Apple_Juice.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.goldencider")
+ .withLocalizedName("Golden Cider")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Golden_Cider.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.idunsapplejuice")
+ .withLocalizedName("Idun's Apple Juice")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Iduns_Apple_Juice.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.notchesbrew")
+ .withLocalizedName("Notches Brew")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Notches_Brew.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.lemonjuice")
+ .withLocalizedName("Lemon Juice")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Lemon_Juice.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.limoncello")
+ .withLocalizedName("Limoncello")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Limoncello.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.lemonade")
+ .withLocalizedName("Lemonade")
+ .withStateAndTemperature(LIQUID, 275)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Lemonade.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.alcopops")
+ .withLocalizedName("Alcopops")
+ .withStateAndTemperature(LIQUID, 275)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Alcopops.get(1L), ItemList.Bottle_Empty.get(1L));
+ GT_FluidFactory.builder("potion.cavejohnsonsgrenadejuice")
+ .withLocalizedName("Cave Johnsons Grenade Juice")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.Bottle_Cave_Johnsons_Grenade_Juice.get(1L), ItemList.Bottle_Empty.get(1L));
+
+ GT_FluidFactory.builder("potion.darkcoffee")
+ .withLocalizedName("Dark Coffee")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.ThermosCan_Dark_Coffee.get(1L), ItemList.ThermosCan_Empty.get(1L));
+ GT_FluidFactory.builder("potion.darkcafeaulait")
+ .withLocalizedName("Dark Cafe au lait")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.ThermosCan_Dark_Cafe_au_lait.get(1L), ItemList.ThermosCan_Empty.get(1L));
+ GT_FluidFactory.builder("potion.coffee")
+ .withLocalizedName("Coffee")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.ThermosCan_Coffee.get(1L), ItemList.ThermosCan_Empty.get(1L));
+ GT_FluidFactory.builder("potion.cafeaulait")
+ .withLocalizedName("Cafe au lait")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.ThermosCan_Cafe_au_lait.get(1L), ItemList.ThermosCan_Empty.get(1L));
+ GT_FluidFactory.builder("potion.laitaucafe")
+ .withLocalizedName("Lait au cafe")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.ThermosCan_Lait_au_cafe.get(1L), ItemList.ThermosCan_Empty.get(1L));
+ GT_FluidFactory.builder("potion.darkchocolatemilk")
+ .withLocalizedName("Bitter Chocolate Milk")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.ThermosCan_Dark_Chocolate_Milk.get(1L), ItemList.ThermosCan_Empty.get(1L));
+ GT_FluidFactory.builder("potion.chocolatemilk")
+ .withLocalizedName("Chocolate Milk")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.ThermosCan_Chocolate_Milk.get(1L), ItemList.ThermosCan_Empty.get(1L));
+ GT_FluidFactory.builder("potion.tea")
+ .withLocalizedName("Tea")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.ThermosCan_Tea.get(1L), ItemList.ThermosCan_Empty.get(1L));
+ GT_FluidFactory.builder("potion.sweettea")
+ .withLocalizedName("Sweet Tea")
+ .withStateAndTemperature(LIQUID, 295)
+ .buildAndRegister()
+ .registerPContainers(ItemList.ThermosCan_Sweet_Tea.get(1L), ItemList.ThermosCan_Empty.get(1L));
+ GT_FluidFactory.builder("potion.icetea")
+ .withLocalizedName("Ice Tea")
+ .withStateAndTemperature(LIQUID, 255)
+ .buildAndRegister()
+ .registerPContainers(ItemList.ThermosCan_Ice_Tea.get(1L), ItemList.ThermosCan_Empty.get(1L));
+ GT_FluidFactory.builder("liquid_sodium")
+ .withLocalizedName("Liquid Sodium")
+ .withStateAndTemperature(LIQUID, 495)
+ .buildAndRegister()
+ .configureMaterials(Materials.Sodium)
+ .registerBContainers(
+ GT_OreDictUnificator.get(OrePrefixes.cell, Materials.Sodium, 1L),
+ ItemList.Cell_Empty.get(1L));
+
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.poison.strong", 750),
+ ItemList.IC2_Spray_WeedEx.get(1L),
+ ItemList.Spray_Empty.get(1L)));
+
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.poison", 125),
+ ItemList.Arrow_Head_Glass_Poison.get(1L),
+ ItemList.Arrow_Head_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.poison.long", 125),
+ ItemList.Arrow_Head_Glass_Poison_Long.get(1L),
+ ItemList.Arrow_Head_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.poison.strong", 125),
+ ItemList.Arrow_Head_Glass_Poison_Strong.get(1L),
+ ItemList.Arrow_Head_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.slowness", 125),
+ ItemList.Arrow_Head_Glass_Slowness.get(1L),
+ ItemList.Arrow_Head_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.slowness.long", 125),
+ ItemList.Arrow_Head_Glass_Slowness_Long.get(1L),
+ ItemList.Arrow_Head_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.weakness", 125),
+ ItemList.Arrow_Head_Glass_Weakness.get(1L),
+ ItemList.Arrow_Head_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.weakness.long", 125),
+ ItemList.Arrow_Head_Glass_Weakness_Long.get(1L),
+ ItemList.Arrow_Head_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("holywater", 125),
+ ItemList.Arrow_Head_Glass_Holy_Water.get(1L),
+ ItemList.Arrow_Head_Glass_Emtpy.get(1L)));
+
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.poison", 125),
+ ItemList.Arrow_Wooden_Glass_Poison.get(1L),
+ ItemList.Arrow_Wooden_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.poison.long", 125),
+ ItemList.Arrow_Wooden_Glass_Poison_Long.get(1L),
+ ItemList.Arrow_Wooden_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.poison.strong", 125),
+ ItemList.Arrow_Wooden_Glass_Poison_Strong.get(1L),
+ ItemList.Arrow_Wooden_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.slowness", 125),
+ ItemList.Arrow_Wooden_Glass_Slowness.get(1L),
+ ItemList.Arrow_Wooden_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.slowness.long", 125),
+ ItemList.Arrow_Wooden_Glass_Slowness_Long.get(1L),
+ ItemList.Arrow_Wooden_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.weakness", 125),
+ ItemList.Arrow_Wooden_Glass_Weakness.get(1L),
+ ItemList.Arrow_Wooden_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.weakness.long", 125),
+ ItemList.Arrow_Wooden_Glass_Weakness_Long.get(1L),
+ ItemList.Arrow_Wooden_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("holywater", 125),
+ ItemList.Arrow_Wooden_Glass_Holy_Water.get(1L),
+ ItemList.Arrow_Wooden_Glass_Emtpy.get(1L)));
+
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.poison", 125),
+ ItemList.Arrow_Plastic_Glass_Poison.get(1L),
+ ItemList.Arrow_Plastic_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.poison.long", 125),
+ ItemList.Arrow_Plastic_Glass_Poison_Long.get(1L),
+ ItemList.Arrow_Plastic_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.poison.strong", 125),
+ ItemList.Arrow_Plastic_Glass_Poison_Strong.get(1L),
+ ItemList.Arrow_Plastic_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.slowness", 125),
+ ItemList.Arrow_Plastic_Glass_Slowness.get(1L),
+ ItemList.Arrow_Plastic_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.slowness.long", 125),
+ ItemList.Arrow_Plastic_Glass_Slowness_Long.get(1L),
+ ItemList.Arrow_Plastic_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.weakness", 125),
+ ItemList.Arrow_Plastic_Glass_Weakness.get(1L),
+ ItemList.Arrow_Plastic_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("potion.weakness.long", 125),
+ ItemList.Arrow_Plastic_Glass_Weakness_Long.get(1L),
+ ItemList.Arrow_Plastic_Glass_Emtpy.get(1L)));
+ FluidContainerRegistry.registerFluidContainer(
+ new FluidContainerRegistry.FluidContainerData(
+ FluidRegistry.getFluidStack("holywater", 125),
+ ItemList.Arrow_Plastic_Glass_Holy_Water.get(1L),
+ ItemList.Arrow_Plastic_Glass_Emtpy.get(1L)));
+ if (!GT_Values.D1) {
+ try {
+ Class.forName("codechicken.nei.api.API");
+ GT_Log.out.println("GT_Mod: Hiding certain Items from NEI.");
+ API.hideItem(ItemList.Display_Fluid.getWildcard(1L));
+ } catch (Throwable e) {
+ if (GT_Values.D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.cobblestone, 1, WILDCARD))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.gravel, 1, WILDCARD))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1L), new ItemStack(Items.flint, 1))
+ .outputChances(10000, 1000)
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.furnace, 1, WILDCARD))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 8L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_Values.RA.stdBuilder()
+ .itemInputs(new ItemStack(Blocks.lit_furnace, 1, WILDCARD))
+ .itemOutputs(GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 8L))
+ .duration(20 * SECONDS)
+ .eut(2)
+ .addTo(maceratorRecipes);
+
+ GT_OreDictUnificator.set(
+ OrePrefixes.ingot,
+ Materials.FierySteel,
+ GT_ModHandler.getModItem(TwilightForest.ID, "item.fieryIngot", 1L, 0));
+ GT_OreDictUnificator.set(
+ OrePrefixes.ingot,
+ Materials.Knightmetal,
+ GT_ModHandler.getModItem(TwilightForest.ID, "item.knightMetal", 1L, 0));
+ GT_OreDictUnificator.set(
+ OrePrefixes.ingot,
+ Materials.Steeleaf,
+ GT_ModHandler.getModItem(TwilightForest.ID, "item.steeleafIngot", 1L, 0));
+ GT_OreDictUnificator.set(
+ OrePrefixes.ingot,
+ Materials.IronWood,
+ GT_ModHandler.getModItem(TwilightForest.ID, "item.ironwoodIngot", 1L, 0));
+ GT_OreDictUnificator
+ .set(OrePrefixes.gem, Materials.InfusedAir, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 0));
+ GT_OreDictUnificator
+ .set(OrePrefixes.gem, Materials.InfusedFire, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 1));
+ GT_OreDictUnificator
+ .set(OrePrefixes.gem, Materials.InfusedWater, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 2));
+ GT_OreDictUnificator
+ .set(OrePrefixes.gem, Materials.InfusedEarth, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 3));
+ GT_OreDictUnificator
+ .set(OrePrefixes.gem, Materials.InfusedOrder, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 4));
+ GT_OreDictUnificator.set(
+ OrePrefixes.gem,
+ Materials.InfusedEntropy,
+ GT_ModHandler.getModItem(Thaumcraft.ID, "ItemShard", 1L, 5));
+ GT_OreDictUnificator
+ .set(OrePrefixes.nugget, Materials.Mercury, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNugget", 1L, 5));
+ GT_OreDictUnificator
+ .set(OrePrefixes.nugget, Materials.Thaumium, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNugget", 1L, 6));
+ GT_OreDictUnificator
+ .set(OrePrefixes.ingot, Materials.Thaumium, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 2));
+ GT_OreDictUnificator
+ .set(OrePrefixes.gem, Materials.Mercury, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 3));
+ GT_OreDictUnificator
+ .set(OrePrefixes.gem, Materials.Amber, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 6));
+ GT_OreDictUnificator
+ .set(OrePrefixes.gem, Materials.Firestone, GT_ModHandler.getModItem(Railcraft.ID, "firestone.raw", 1L));
+
+ GT_OreDictUnificator
+ .set(OrePrefixes.nugget, Materials.Void, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemNugget", 1L, 7));
+ GT_OreDictUnificator
+ .set(OrePrefixes.ingot, Materials.Void, GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 16));
+
+ if (GregTech_API.sUnification
+ .get(ConfigCategories.specialunificationtargets + "." + "railcraft", "plateIron", true)) {
+ GT_OreDictUnificator
+ .set(OrePrefixes.plate, Materials.Iron, GT_ModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 0));
+ } else {
+ GT_OreDictUnificator.set(
+ OrePrefixes.plate,
+ Materials.Iron,
+ GT_ModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 0),
+ false,
+ false);
+ }
+
+ if (GregTech_API.sUnification
+ .get(ConfigCategories.specialunificationtargets + "." + "railcraft", "plateSteel", true)) {
+ GT_OreDictUnificator
+ .set(OrePrefixes.plate, Materials.Steel, GT_ModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 1));
+ } else {
+ GT_OreDictUnificator.set(
+ OrePrefixes.plate,
+ Materials.Steel,
+ GT_ModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 1),
+ false,
+ false);
+ }
+
+ if (GregTech_API.sUnification
+ .get(ConfigCategories.specialunificationtargets + "." + "railcraft", "plateTinAlloy", true)) {
+ GT_OreDictUnificator.set(
+ OrePrefixes.plate,
+ Materials.TinAlloy,
+ GT_ModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 2));
+ } else {
+ GT_OreDictUnificator.set(
+ OrePrefixes.plate,
+ Materials.TinAlloy,
+ GT_ModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 2),
+ false,
+ false);
+ }
+
+ if (GregTech_API.sUnification
+ .get(ConfigCategories.specialunificationtargets + "." + "railcraft", "plateCopper", true)) {
+ GT_OreDictUnificator
+ .set(OrePrefixes.plate, Materials.Copper, GT_ModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 3));
+ } else {
+ GT_OreDictUnificator.set(
+ OrePrefixes.plate,
+ Materials.Copper,
+ GT_ModHandler.getModItem(Railcraft.ID, "part.plate", 1L, 3),
+ false,
+ false);
+ }
+
+ GT_OreDictUnificator.set(
+ OrePrefixes.dust,
+ Materials.Cocoa,
+ GT_ModHandler.getModItem(PamsHarvestCraft.ID, "cocoapowderItem", 1L, 0));
+ GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Coffee, ItemList.IC2_CoffeePowder.get(1L));
+
+ GregTech_API
+ .registerMachineBlock(GT_Utility.getBlockFromStack(GT_ModHandler.getIC2Item("reinforcedGlass", 0)), 0);
+
+ GregTech_API.sSolenoidCoilCasings = new GT_Cyclotron_Coils();
+ ItemList.TierdDrone0
+ .set(new GT_TierDrone("tierdDrone0", "Drone (Level 1)", "Quadcopter Stable Small Aircraft", 1));
+ ItemList.TierdDrone1
+ .set(new GT_TierDrone("tierdDrone1", "Drone (Level 2)", "Dual Turbo High-Ejection Medium Aircraft", 2));
+ ItemList.TierdDrone2
+ .set(new GT_TierDrone("tierdDrone2", "Drone (Level 3)", "Single Engine Anti-Gravity Large Aircraft", 3));
+
+ }
+}
diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java b/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java
new file mode 100644
index 0000000000..d1196552c6
--- /dev/null
+++ b/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java
@@ -0,0 +1,4307 @@
+package gregtech.loaders.preload;
+
+import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_DATA_ACCESS_HATCH;
+import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_DEBUG_STRUCTURE_WRITTER;
+import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_SEISMIC_PROSPECTOR_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_SEISMIC_PROSPECTOR_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_SEISMIC_PROSPECTOR_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.ADVANCED_SEISMIC_PROSPECTOR_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.ASSEMBLING_LINE_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.AUTOMATABLE_DATA_ACCESS_HATCH;
+import static gregtech.api.enums.MetaTileEntityIDs.AUTO_MAINTENANCE_HATCH;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_1_BY_1_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_2_BY_2_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_3_BY_3_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_BUFFER_4_BY_4_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.BATTERY_CHARGER_4_BY_4_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.BREWERY_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.BRICKED_BLAST_FURNACE_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.CHARCOAL_PILE_IGNITER_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.CHEST_BUFFER_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.CLEANROOM_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.COMBUSTION_ENGINE_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.COMBUSTION_GENERATOR_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.COMBUSTION_GENERATOR_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.COMBUSTION_GENERATOR_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.CONCRETE_BACKFILLER_II_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.CONCRETE_BACKFILLER_I_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.CRAFTING_INPUT_ME;
+import static gregtech.api.enums.MetaTileEntityIDs.CRAFTING_INPUT_ME_BUS;
+import static gregtech.api.enums.MetaTileEntityIDs.CRAFTING_INPUT_SLAVE;
+import static gregtech.api.enums.MetaTileEntityIDs.DATA_ACCESS_HATCH;
+import static gregtech.api.enums.MetaTileEntityIDs.DISTILLATION_TOWER_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.DTPF_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.DYNAMO_HATCH_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.DroneDownLink;
+import static gregtech.api.enums.MetaTileEntityIDs.Drone_Centre;
+import static gregtech.api.enums.MetaTileEntityIDs.EBF_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.ENERGY_HATCH_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.EXTREME_COMBUSTION_ENGINE_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.FUSION_CONTROLLER_MKI;
+import static gregtech.api.enums.MetaTileEntityIDs.FUSION_CONTROLLER_MKII;
+import static gregtech.api.enums.MetaTileEntityIDs.FUSION_CONTROLLER_MKIII;
+import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.GAS_TURBINE_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.HIGH_PRESSURE_COAL_BOILER;
+import static gregtech.api.enums.MetaTileEntityIDs.HIGH_PRESSURE_LAVA_BOILER;
+import static gregtech.api.enums.MetaTileEntityIDs.HIGH_PRESSURE_SOLAR_BOILER;
+import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_ALLOY_SMELTER;
+import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_COMPRESSOR;
+import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_EXTRACTOR;
+import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_FORGE_HAMMER;
+import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_FURNACE;
+import static gregtech.api.enums.MetaTileEntityIDs.HP_STEAM_MACERATOR;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_BRICKED_BRONZE;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_BRONZE;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_STEEL;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_WROUGHT_IRON;
+import static gregtech.api.enums.MetaTileEntityIDs.HULL_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.IMPLOSION_COMPRESSOR_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.INDUSTRIAL_APIARY;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ME;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ME_ADVANCED;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ME;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ME_ADVANCED;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.INTEGRATED_ORE_FACTORY_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_DISTRIBUTOR_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.ITEM_FILTER_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.LARGE_ADVANCED_GAS_TURBINE_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.LARGE_BRONZE_BOILER_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.LARGE_GAS_TURBINE_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.LARGE_HEAT_EXCHANGER_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.LARGE_HP_STEAM_TURBINE_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.LARGE_PLASMA_TURBINE_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.LARGE_STEAM_TURBINE_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.LARGE_STEEL_BOILER_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.LARGE_TITANIUM_BOILER_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.LARGE_TUNGSTENSTEEL_BOILER_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.LCR_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.LIGHTNING_ROD_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.LIGHTNING_ROD_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.LIGHTNING_ROD_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.LOCKER_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.LONG_DISTANCE_PIPELINE_FLUID;
+import static gregtech.api.enums.MetaTileEntityIDs.LONG_DISTANCE_PIPELINE_ITEM;
+import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_ABSORBER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_ABSORBER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_ABSORBER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_ABSORBER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_CONVERTER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_CONVERTER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.MAGIC_ENERGY_CONVERTER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.MAINTENANCE_HATCH;
+import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.MASS_FABRICATOR_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.MICROWAVE_ENERGY_TRANSMITTER_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.MINER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.MINER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.MINER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.MONSTER_REPELLATOR_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.MUFFLER_HATCH_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.MULTIBLOCK_PUMP_INFINITE_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.MULTIBLOCK_PUMP_MKI_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.MULTILOCK_PUMP_MKIII_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.MULTILOCK_PUMP_MKII_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.MULTILOCK_PUMP_MKIV_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.MULTI_SMELTER_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.NANO_FORGE_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.NAQUADAH_REACTOR_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.OIL_CRACKER_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.ORE_DRILL_MKIII_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.ORE_DRILL_MKII_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.ORE_DRILL_MKIV_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.ORE_DRILL_MKI_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_ME;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_BUS_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_ME;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.OUTPUT_HATCH_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.PACKAGER_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.PCB_FACTORY_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_GENERATOR_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_GENERATOR_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.PLASMA_GENERATOR_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.PROCESSING_ARRAY_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.PUMP_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.PUMP_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.PUMP_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.PUMP_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.PUMP_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.PYROLYSE_OVEN_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_MAX;
+import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UEV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UIV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UMV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_UXV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUADRUPLE_INPUT_HATCHES_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_CHEST_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.QUANTUM_TANK_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.RECIPE_FILTER_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.REPLICATOR_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.ROCK_BREAKER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.SCANNER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.SIMPLE_SOLAR_BOILER;
+import static gregtech.api.enums.MetaTileEntityIDs.SMALL_COAL_BOILER;
+import static gregtech.api.enums.MetaTileEntityIDs.STEAM_ALLOY_SMELTER;
+import static gregtech.api.enums.MetaTileEntityIDs.STEAM_COMPRESSOR;
+import static gregtech.api.enums.MetaTileEntityIDs.STEAM_EXTRACTOR;
+import static gregtech.api.enums.MetaTileEntityIDs.STEAM_FORGE_HAMMER;
+import static gregtech.api.enums.MetaTileEntityIDs.STEAM_FURNACE;
+import static gregtech.api.enums.MetaTileEntityIDs.STEAM_MACERATOR;
+import static gregtech.api.enums.MetaTileEntityIDs.STEAM_TURBINE_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.STEAM_TURBINE_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.STEAM_TURBINE_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_BUFFER_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_CHEST_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.SUPER_TANK_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.TELEPORTER;
+import static gregtech.api.enums.MetaTileEntityIDs.TRANSCENDENT_PLASMA_MIXER_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.TYPE_FILTER_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.VACUUM_FREEZER_CONTROLLER;
+import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.VOLTAGE_REGULATOR_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_MAX;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UEV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UIV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UMV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_UXV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_DYNAMO_ENERGY_HATCH_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_LuV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_MAX;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UEV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UHV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UIV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UMV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_UXV;
+import static gregtech.api.enums.MetaTileEntityIDs.WIRELESS_HATCH_ENERGY_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.transformer_EV_HV;
+import static gregtech.api.enums.MetaTileEntityIDs.transformer_HV_MV;
+import static gregtech.api.enums.MetaTileEntityIDs.transformer_IV_EV;
+import static gregtech.api.enums.MetaTileEntityIDs.transformer_LV_ULV;
+import static gregtech.api.enums.MetaTileEntityIDs.transformer_LuV_IV;
+import static gregtech.api.enums.MetaTileEntityIDs.transformer_MV_LV;
+import static gregtech.api.enums.MetaTileEntityIDs.transformer_UHV_UV;
+import static gregtech.api.enums.MetaTileEntityIDs.transformer_UV_ZPM;
+import static gregtech.api.enums.MetaTileEntityIDs.transformer_ZPM_LuV;
+import static gregtech.api.enums.Mods.Forestry;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Frame;
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Item;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicBatteryBuffer;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicHull;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_QuadrupleHumongous;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Transformer;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Wireless_Dynamo;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Wireless_Hatch;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.common.tileentities.automation.GT_MetaTileEntity_ChestBuffer;
+import gregtech.common.tileentities.automation.GT_MetaTileEntity_Filter;
+import gregtech.common.tileentities.automation.GT_MetaTileEntity_ItemDistributor;
+import gregtech.common.tileentities.automation.GT_MetaTileEntity_RecipeFilter;
+import gregtech.common.tileentities.automation.GT_MetaTileEntity_Regulator;
+import gregtech.common.tileentities.automation.GT_MetaTileEntity_SuperBuffer;
+import gregtech.common.tileentities.automation.GT_MetaTileEntity_TypeFilter;
+import gregtech.common.tileentities.boilers.GT_MetaTileEntity_Boiler_Bronze;
+import gregtech.common.tileentities.boilers.GT_MetaTileEntity_Boiler_Lava;
+import gregtech.common.tileentities.boilers.GT_MetaTileEntity_Boiler_Solar;
+import gregtech.common.tileentities.boilers.GT_MetaTileEntity_Boiler_Solar_Steel;
+import gregtech.common.tileentities.boilers.GT_MetaTileEntity_Boiler_Steel;
+import gregtech.common.tileentities.debug.GT_MetaTileEntity_AdvDebugStructureWriter;
+import gregtech.common.tileentities.generators.GT_MetaTileEntity_DieselGenerator;
+import gregtech.common.tileentities.generators.GT_MetaTileEntity_GasTurbine;
+import gregtech.common.tileentities.generators.GT_MetaTileEntity_LightningRod;
+import gregtech.common.tileentities.generators.GT_MetaTileEntity_MagicEnergyConverter;
+import gregtech.common.tileentities.generators.GT_MetaTileEntity_MagicalEnergyAbsorber;
+import gregtech.common.tileentities.generators.GT_MetaTileEntity_NaquadahReactor;
+import gregtech.common.tileentities.generators.GT_MetaTileEntity_PlasmaGenerator;
+import gregtech.common.tileentities.generators.GT_MetaTileEntity_SteamTurbine;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_BasicHull_Bronze;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_BasicHull_BronzeBricks;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_BasicHull_Steel;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_BasicHull_SteelBricks;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_CraftingInput_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_CraftingInput_Slave;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_InputBus_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Input_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_OutputBus_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Output_ME;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_AdvSeismicProspector;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Boxinator;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Charger;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_IndustrialApiary;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Massfabricator;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_MicrowaveEnergyTransmitter;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Miner;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_MonsterRepellent;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_PotionBrewer;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Pump;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Replicator;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_RockBreaker;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Scanner;
+import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_Teleporter;
+import gregtech.common.tileentities.machines.long_distance.GT_MetaTileEntity_LongDistancePipelineFluid;
+import gregtech.common.tileentities.machines.long_distance.GT_MetaTileEntity_LongDistancePipelineItem;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_AssemblyLine;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_BrickedBlastFurnace;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_Charcoal_Pit;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_Cleanroom;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_ConcreteBackfiller1;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_ConcreteBackfiller2;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_DieselEngine;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_DistillationTower;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_ElectricBlastFurnace;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_ExtremeDieselEngine;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_FusionComputer1;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_FusionComputer2;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_FusionComputer3;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_HeatExchanger;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_ImplosionCompressor;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_IntegratedOreFactory;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeBoiler_Bronze;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeBoiler_Steel;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeBoiler_Titanium;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeBoiler_TungstenSteel;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeChemicalReactor;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_Gas;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_GasAdvanced;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_HPSteam;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_Plasma;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine_Steam;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_MultiFurnace;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_NanoForge;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OilCracker;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OilDrill1;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OilDrill2;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OilDrill3;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OilDrill4;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OilDrillInfinite;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OreDrillingPlant1;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OreDrillingPlant2;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OreDrillingPlant3;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_OreDrillingPlant4;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PCBFactory;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PlasmaForge;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_ProcessingArray;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_PyrolyseOven;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_TranscendentPlasmaMixer;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_VacuumFreezer;
+import gregtech.common.tileentities.machines.multi.drone.GT_MetaTileEntity_DroneCentre;
+import gregtech.common.tileentities.machines.multi.drone.GT_MetaTileEntity_Hatch_DroneDownLink;
+import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_AlloySmelter_Bronze;
+import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_AlloySmelter_Steel;
+import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Compressor_Bronze;
+import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Compressor_Steel;
+import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Extractor_Bronze;
+import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Extractor_Steel;
+import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_ForgeHammer_Bronze;
+import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_ForgeHammer_Steel;
+import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Furnace_Bronze;
+import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Furnace_Steel;
+import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Macerator_Bronze;
+import gregtech.common.tileentities.machines.steam.GT_MetaTileEntity_Macerator_Steel;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_Locker;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_QuantumChest;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_QuantumTank;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_SuperChest;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_SuperTank;
+
+// Free IDs left for machines in GT as of 29th of July 2022 - Colen. Please try use them up in order.
+// 358
+// 359
+// 366
+// 367
+// 368
+// 369
+// 370
+// 376
+// 377
+// 378
+// 379
+// 386
+// 387
+// 388
+// 389
+// 390
+// 396
+// 397
+// 398
+// 399
+// 410
+// 419
+// 426
+// 427
+// 428
+// 429
+// 430
+// 436
+// 437
+// 438
+// 439
+// 446
+// 447
+// 448
+// 449
+// 450
+// 456
+// 457
+// 458
+// 459
+// 466
+// 467
+// 468
+// 469
+// 470
+// 476
+// 477
+// 478
+// 479
+// 486
+// 487
+// 488
+// 489
+// 496
+// 497
+// 498
+// 499
+// 506
+// 507
+// 508
+// 509
+// 518
+// 519
+// 526
+// 530
+// 537
+// 538
+// 539
+// 546
+// 547
+// 548
+// 549
+// 550
+// 556
+// 557
+// 558
+// 559
+// 566
+// 567
+// 576
+// 577
+// 578
+// 579
+// 586
+// 587
+// 588
+// 589
+// 590
+// 596
+// 597
+// 598
+// 599
+// 607
+// 608
+// 609
+// 610
+// 616
+// 617
+// 618
+// 619
+// 626
+// 627
+// 628
+// 629
+// 630
+// 636
+// 637
+// 639
+// 646
+// 647
+// 648
+// 649
+// 650
+// 656
+// 657
+// 658
+// 659
+// 666
+// 667
+// 668
+// 669
+// 670
+// 676
+// 677
+// 678
+// 682
+// 683
+// 684
+// 686
+// 687
+// 688
+// 689
+// 702
+// 703
+// 704
+// 705
+// 706
+// 707
+// 708
+// 709
+// 714
+// 715
+// 716
+// 717
+// 718
+// 719
+// 721
+// 722
+// 723
+// 724
+// 725
+// 726
+// 727
+// 728
+// 729
+// 730
+// 731
+// 732
+// 733
+// 734
+// 735
+// 736
+// 737
+// 738
+// 739
+// 741
+// 742
+// 743
+// 744
+// 745
+// 746
+// 747
+// 748
+// 749
+
+// TODO Some GT MetaTileEntity registrations are done in load/GT_Loader_MetaTileEntities_Recipes.java due to joint
+// registration+recipe methods, they should be split and brought here to register all in preload.
+
+public class GT_Loader_MetaTileEntities implements Runnable { // TODO CHECK CIRCUIT RECIPES AND USAGES
+
+ private static final String aTextWire1 = "wire.";
+ private static final String aTextCable1 = "cable.";
+ private static final String aTextWire2 = " Wire";
+ private static final String aTextCable2 = " Cable";
+ public static final String imagination = EnumChatFormatting.RESET + "You just need "
+ + EnumChatFormatting.DARK_PURPLE
+ + "I"
+ + EnumChatFormatting.LIGHT_PURPLE
+ + "m"
+ + EnumChatFormatting.DARK_RED
+ + "a"
+ + EnumChatFormatting.RED
+ + "g"
+ + EnumChatFormatting.YELLOW
+ + "i"
+ + EnumChatFormatting.GREEN
+ + "n"
+ + EnumChatFormatting.AQUA
+ + "a"
+ + EnumChatFormatting.DARK_AQUA
+ + "t"
+ + EnumChatFormatting.BLUE
+ + "i"
+ + EnumChatFormatting.DARK_BLUE
+ + "o"
+ + EnumChatFormatting.DARK_PURPLE
+ + "n"
+ + EnumChatFormatting.RESET
+ + " to use this.";
+
+ private static void registerMultiblockControllers() {
+ ItemList.Machine_Bricked_BlastFurnace.set(
+ new GT_MetaTileEntity_BrickedBlastFurnace(
+ BRICKED_BLAST_FURNACE_CONTROLLER.ID,
+ "multimachine.brickedblastfurnace",
+ "Bricked Blast Furnace").getStackForm(1L));
+
+ ItemList.Machine_Multi_BlastFurnace.set(
+ new GT_MetaTileEntity_ElectricBlastFurnace(
+ EBF_CONTROLLER.ID,
+ "multimachine.blastfurnace",
+ "Electric Blast Furnace").getStackForm(1L));
+ ItemList.Machine_Multi_ImplosionCompressor.set(
+ new GT_MetaTileEntity_ImplosionCompressor(
+ IMPLOSION_COMPRESSOR_CONTROLLER.ID,
+ "multimachine.implosioncompressor",
+ "Implosion Compressor").getStackForm(1L));
+ ItemList.Machine_Multi_VacuumFreezer.set(
+ new GT_MetaTileEntity_VacuumFreezer(
+ VACUUM_FREEZER_CONTROLLER.ID,
+ "multimachine.vacuumfreezer",
+ "Vacuum Freezer").getStackForm(1L));
+ ItemList.Machine_Multi_Furnace.set(
+ new GT_MetaTileEntity_MultiFurnace(
+ MULTI_SMELTER_CONTROLLER.ID,
+ "multimachine.multifurnace",
+ "Multi Smelter").getStackForm(1L));
+ ItemList.Machine_Multi_PlasmaForge.set(
+ new GT_MetaTileEntity_PlasmaForge(
+ DTPF_CONTROLLER.ID,
+ "multimachine.plasmaforge",
+ "Dimensionally Transcendent Plasma Forge").getStackForm(1L));
+
+ ItemList.Machine_Multi_LargeBoiler_Bronze.set(
+ new GT_MetaTileEntity_LargeBoiler_Bronze(
+ LARGE_BRONZE_BOILER_CONTROLLER.ID,
+ "multimachine.boiler.bronze",
+ "Large Bronze Boiler").getStackForm(1L));
+ ItemList.Machine_Multi_LargeBoiler_Steel.set(
+ new GT_MetaTileEntity_LargeBoiler_Steel(
+ LARGE_STEEL_BOILER_CONTROLLER.ID,
+ "multimachine.boiler.steel",
+ "Large Steel Boiler").getStackForm(1L));
+ ItemList.Machine_Multi_LargeBoiler_Titanium.set(
+ new GT_MetaTileEntity_LargeBoiler_Titanium(
+ LARGE_TITANIUM_BOILER_CONTROLLER.ID,
+ "multimachine.boiler.titanium",
+ "Large Titanium Boiler").getStackForm(1L));
+ ItemList.Machine_Multi_LargeBoiler_TungstenSteel.set(
+ new GT_MetaTileEntity_LargeBoiler_TungstenSteel(
+ LARGE_TUNGSTENSTEEL_BOILER_CONTROLLER.ID,
+ "multimachine.boiler.tungstensteel",
+ "Large Tungstensteel Boiler").getStackForm(1L));
+ ItemList.FusionComputer_LuV.set(
+ new GT_MetaTileEntity_FusionComputer1(
+ FUSION_CONTROLLER_MKI.ID,
+ "fusioncomputer.tier.06",
+ "Fusion Control Computer Mark I").getStackForm(1L));
+ ItemList.FusionComputer_ZPMV.set(
+ new GT_MetaTileEntity_FusionComputer2(
+ FUSION_CONTROLLER_MKII.ID,
+ "fusioncomputer.tier.07",
+ "Fusion Control Computer Mark II").getStackForm(1L));
+ ItemList.FusionComputer_UV.set(
+ new GT_MetaTileEntity_FusionComputer3(
+ FUSION_CONTROLLER_MKIII.ID,
+ "fusioncomputer.tier.08",
+ "Fusion Control Computer Mark III").getStackForm(1L));
+
+ ItemList.Processing_Array.set(
+ new GT_MetaTileEntity_ProcessingArray(
+ PROCESSING_ARRAY_CONTROLLER.ID,
+ "multimachine.processingarray",
+ "Processing Array").getStackForm(1L));
+ ItemList.Distillation_Tower.set(
+ new GT_MetaTileEntity_DistillationTower(
+ DISTILLATION_TOWER_CONTROLLER.ID,
+ "multimachine.distillationtower",
+ "Distillation Tower").getStackForm(1L));
+ ItemList.Ore_Processor.set(
+ new GT_MetaTileEntity_IntegratedOreFactory(
+ INTEGRATED_ORE_FACTORY_CONTROLLER.ID,
+ "multimachine.oreprocessor",
+ "Integrated Ore Factory").getStackForm(1L));
+
+ ItemList.LargeSteamTurbine.set(
+ new GT_MetaTileEntity_LargeTurbine_Steam(
+ LARGE_STEAM_TURBINE_CONTROLLER.ID,
+ "multimachine.largeturbine",
+ "Large Steam Turbine").getStackForm(1L));
+ ItemList.LargeGasTurbine.set(
+ new GT_MetaTileEntity_LargeTurbine_Gas(
+ LARGE_GAS_TURBINE_CONTROLLER.ID,
+ "multimachine.largegasturbine",
+ "Large Gas Turbine").getStackForm(1L));
+ ItemList.LargeHPSteamTurbine.set(
+ new GT_MetaTileEntity_LargeTurbine_HPSteam(
+ LARGE_HP_STEAM_TURBINE_CONTROLLER.ID,
+ "multimachine.largehpturbine",
+ "Large HP Steam Turbine").getStackForm(1L));
+ ItemList.LargeAdvancedGasTurbine.set(
+ new GT_MetaTileEntity_LargeTurbine_GasAdvanced(
+ LARGE_ADVANCED_GAS_TURBINE_CONTROLLER.ID,
+ "multimachine.largeadvancedgasturbine",
+ "Large Advanced Gas Turbine").getStackForm(1L));
+ ItemList.Machine_Multi_TranscendentPlasmaMixer.set(
+ new GT_MetaTileEntity_TranscendentPlasmaMixer(
+ TRANSCENDENT_PLASMA_MIXER_CONTROLLER.ID,
+ "multimachine.transcendentplasmamixer",
+ "Transcendent Plasma Mixer").getStackForm(1));
+
+ ItemList.LargePlasmaTurbine.set(
+ new GT_MetaTileEntity_LargeTurbine_Plasma(
+ LARGE_PLASMA_TURBINE_CONTROLLER.ID,
+ "multimachine.largeplasmaturbine",
+ "Large Plasma Generator").getStackForm(1L));
+ ItemList.Machine_Multi_HeatExchanger.set(
+ new GT_MetaTileEntity_HeatExchanger(
+ LARGE_HEAT_EXCHANGER_CONTROLLER.ID,
+ "multimachine.heatexchanger",
+ "Large Heat Exchanger").getStackForm(1L));
+ ItemList.Charcoal_Pile.set(
+ new GT_MetaTileEntity_Charcoal_Pit(
+ CHARCOAL_PILE_IGNITER_CONTROLLER.ID,
+ "multimachine.charcoalpile",
+ "Charcoal Pile Igniter").getStackForm(1));
+
+ // Converter recipes in case you had old one lying around
+ ItemList.OilDrill1.set(
+ new GT_MetaTileEntity_OilDrill1(
+ MULTIBLOCK_PUMP_MKI_CONTROLLER.ID,
+ "multimachine.oildrill1",
+ "Oil/Gas/Fluid Drilling Rig").getStackForm(1));
+ ItemList.OilDrill2.set(
+ new GT_MetaTileEntity_OilDrill2(
+ MULTILOCK_PUMP_MKII_CONTROLLER.ID,
+ "multimachine.oildrill2",
+ "Oil/Gas/Fluid Drilling Rig II").getStackForm(1));
+ ItemList.OilDrill3.set(
+ new GT_MetaTileEntity_OilDrill3(
+ MULTILOCK_PUMP_MKIII_CONTROLLER.ID,
+ "multimachine.oildrill3",
+ "Oil/Gas/Fluid Drilling Rig III").getStackForm(1));
+ ItemList.OilDrill4.set(
+ new GT_MetaTileEntity_OilDrill4(
+ MULTILOCK_PUMP_MKIV_CONTROLLER.ID,
+ "multimachine.oildrill4",
+ "Oil/Gas/Fluid Drilling Rig IV").getStackForm(1));
+ ItemList.OilDrillInfinite.set(
+ new GT_MetaTileEntity_OilDrillInfinite(
+ MULTIBLOCK_PUMP_INFINITE_CONTROLLER.ID,
+ "multimachine.oildrillinfinite",
+ "Infinite Oil/Gas/Fluid Drilling Rig").getStackForm(1));
+
+ ItemList.ConcreteBackfiller1.set(
+ new GT_MetaTileEntity_ConcreteBackfiller1(
+ CONCRETE_BACKFILLER_I_CONTROLLER.ID,
+ "multimachine.concretebackfiller1",
+ "Concrete Backfiller").getStackForm(1));
+ ItemList.ConcreteBackfiller2.set(
+ new GT_MetaTileEntity_ConcreteBackfiller2(
+ CONCRETE_BACKFILLER_II_CONTROLLER.ID,
+ "multimachine.concretebackfiller3",
+ "Advanced Concrete Backfiller").getStackForm(1));
+ ItemList.OreDrill1.set(
+ new GT_MetaTileEntity_OreDrillingPlant1(
+ ORE_DRILL_MKI_CONTROLLER.ID,
+ "multimachine.oredrill1",
+ "Ore Drilling Plant").getStackForm(1));
+ ItemList.OreDrill2.set(
+ new GT_MetaTileEntity_OreDrillingPlant2(
+ ORE_DRILL_MKII_CONTROLLER.ID,
+ "multimachine.oredrill2",
+ "Ore Drilling Plant II").getStackForm(1));
+ ItemList.OreDrill3.set(
+ new GT_MetaTileEntity_OreDrillingPlant3(
+ ORE_DRILL_MKIII_CONTROLLER.ID,
+ "multimachine.oredrill3",
+ "Ore Drilling Plant III").getStackForm(1));
+ ItemList.OreDrill4.set(
+ new GT_MetaTileEntity_OreDrillingPlant4(
+ ORE_DRILL_MKIV_CONTROLLER.ID,
+ "multimachine.oredrill4",
+ "Ore Drilling Plant IV").getStackForm(1));
+
+ ItemList.PyrolyseOven.set(
+ new GT_MetaTileEntity_PyrolyseOven(PYROLYSE_OVEN_CONTROLLER.ID, "multimachine.pyro", "Pyrolyse Oven")
+ .getStackForm(1));
+ ItemList.OilCracker.set(
+ new GT_MetaTileEntity_OilCracker(OIL_CRACKER_CONTROLLER.ID, "multimachine.cracker", "Oil Cracking Unit")
+ .getStackForm(1));
+
+ ItemList.Machine_Multi_Assemblyline.set(
+ new GT_MetaTileEntity_AssemblyLine(
+ ASSEMBLING_LINE_CONTROLLER.ID,
+ "multimachine.assemblyline",
+ "Assembling Line").getStackForm(1L));
+ ItemList.Machine_Multi_DieselEngine.set(
+ new GT_MetaTileEntity_DieselEngine(
+ COMBUSTION_ENGINE_CONTROLLER.ID,
+ "multimachine.dieselengine",
+ "Combustion Engine").getStackForm(1L));
+ ItemList.Machine_Multi_ExtremeDieselEngine.set(
+ new GT_MetaTileEntity_ExtremeDieselEngine(
+ EXTREME_COMBUSTION_ENGINE_CONTROLLER.ID,
+ "multimachine.extremedieselengine",
+ "Extreme Combustion Engine").getStackForm(1L));
+ ItemList.Machine_Multi_Cleanroom.set(
+ new GT_MetaTileEntity_Cleanroom(CLEANROOM_CONTROLLER.ID, "multimachine.cleanroom", "Cleanroom Controller")
+ .getStackForm(1));
+
+ ItemList.Machine_Multi_LargeChemicalReactor.set(
+ new GT_MetaTileEntity_LargeChemicalReactor(
+ LCR_CONTROLLER.ID,
+ "multimachine.chemicalreactor",
+ "Large Chemical Reactor").getStackForm(1));
+ ItemList.PCBFactory.set(
+ new GT_MetaTileEntity_PCBFactory(PCB_FACTORY_CONTROLLER.ID, "multimachine.pcbfactory", "PCB Factory")
+ .getStackForm(1));
+ ItemList.NanoForge.set(
+ new GT_MetaTileEntity_NanoForge(NANO_FORGE_CONTROLLER.ID, "multimachine.nanoforge", "Nano Forge")
+ .getStackForm(1));
+ ItemList.Machine_Multi_DroneCentre.set(
+ new GT_MetaTileEntity_DroneCentre(Drone_Centre.ID, "multimachine_DroneCentre", "Drone Centre")
+ .getStackForm(1));
+ }
+
+ private static void registerSteamMachines() {
+ ItemList.Machine_Bronze_Furnace.set(
+ new GT_MetaTileEntity_Furnace_Bronze(STEAM_FURNACE.ID, "bronzemachine.furnace", "Steam Furnace")
+ .getStackForm(1L));
+ ItemList.Machine_Bronze_Macerator.set(
+ new GT_MetaTileEntity_Macerator_Bronze(STEAM_MACERATOR.ID, "bronzemachine.macerator", "Steam Macerator")
+ .getStackForm(1L));
+ ItemList.Machine_Bronze_Extractor.set(
+ new GT_MetaTileEntity_Extractor_Bronze(STEAM_EXTRACTOR.ID, "bronzemachine.extractor", "Steam Extractor")
+ .getStackForm(1L));
+ ItemList.Machine_Bronze_Hammer.set(
+ new GT_MetaTileEntity_ForgeHammer_Bronze(
+ STEAM_FORGE_HAMMER.ID,
+ "bronzemachine.hammer",
+ "Steam Forge Hammer").getStackForm(1L));
+ ItemList.Machine_Bronze_Compressor.set(
+ new GT_MetaTileEntity_Compressor_Bronze(STEAM_COMPRESSOR.ID, "bronzemachine.compressor", "Steam Compressor")
+ .getStackForm(1L));
+ ItemList.Machine_Bronze_AlloySmelter.set(
+ new GT_MetaTileEntity_AlloySmelter_Bronze(
+ STEAM_ALLOY_SMELTER.ID,
+ "bronzemachine.alloysmelter",
+ "Steam Alloy Smelter").getStackForm(1L));
+
+ }
+
+ private static void registerHPSteamMachines() {
+ ItemList.Machine_HP_Extractor.set(
+ new GT_MetaTileEntity_Extractor_Steel(
+ HP_STEAM_EXTRACTOR.ID,
+ "hpmachine.extractor",
+ "High Pressure Extractor").getStackForm(1L));
+ ItemList.Machine_HP_Furnace.set(
+ new GT_MetaTileEntity_Furnace_Steel(HP_STEAM_FURNACE.ID, "hpmachine.furnace", "High Pressure Furnace")
+ .getStackForm(1L));
+ ItemList.Machine_HP_Macerator.set(
+ new GT_MetaTileEntity_Macerator_Steel(
+ HP_STEAM_MACERATOR.ID,
+ "hpmachine.macerator",
+ "High Pressure Macerator").getStackForm(1L));
+ ItemList.Machine_HP_Hammer.set(
+ new GT_MetaTileEntity_ForgeHammer_Steel(
+ HP_STEAM_FORGE_HAMMER.ID,
+ "hpmachine.hammer",
+ "High Pressure Forge Hammer").getStackForm(1L));
+ ItemList.Machine_HP_Compressor.set(
+ new GT_MetaTileEntity_Compressor_Steel(
+ HP_STEAM_COMPRESSOR.ID,
+ "hpmachine.compressor",
+ "High Pressure Compressor").getStackForm(1L));
+ ItemList.Machine_HP_AlloySmelter.set(
+ new GT_MetaTileEntity_AlloySmelter_Steel(
+ HP_STEAM_ALLOY_SMELTER.ID,
+ "hpmachine.alloysmelter",
+ "High Pressure Alloy Smelter").getStackForm(1L));
+ }
+
+ private static void registerLocker() {
+ ItemList.Locker_ULV.set(
+ new GT_MetaTileEntity_Locker(LOCKER_ULV.ID, "locker.tier.00", "Ultra Low Voltage Locker", 0)
+ .getStackForm(1L));
+ ItemList.Locker_LV.set(
+ new GT_MetaTileEntity_Locker(LOCKER_LV.ID, "locker.tier.01", "Low Voltage Locker", 1).getStackForm(1L));
+ ItemList.Locker_MV.set(
+ new GT_MetaTileEntity_Locker(LOCKER_MV.ID, "locker.tier.02", "Medium Voltage Locker", 2).getStackForm(1L));
+ ItemList.Locker_HV.set(
+ new GT_MetaTileEntity_Locker(LOCKER_HV.ID, "locker.tier.03", "High Voltage Locker", 3).getStackForm(1L));
+ ItemList.Locker_EV.set(
+ new GT_MetaTileEntity_Locker(LOCKER_EV.ID, "locker.tier.04", "Extreme Voltage Locker", 4).getStackForm(1L));
+ ItemList.Locker_IV.set(
+ new GT_MetaTileEntity_Locker(LOCKER_IV.ID, "locker.tier.05", "Insane Voltage Locker", 5).getStackForm(1L));
+ ItemList.Locker_LuV.set(
+ new GT_MetaTileEntity_Locker(LOCKER_LuV.ID, "locker.tier.06", "Ludicrous Voltage Locker", 6)
+ .getStackForm(1L));
+ ItemList.Locker_ZPM.set(
+ new GT_MetaTileEntity_Locker(LOCKER_ZPM.ID, "locker.tier.07", "ZPM Voltage Locker", 7).getStackForm(1L));
+ ItemList.Locker_UV.set(
+ new GT_MetaTileEntity_Locker(LOCKER_UV.ID, "locker.tier.08", "Ultimate Voltage Locker", 8)
+ .getStackForm(1L));
+ ItemList.Locker_MAX.set(
+ new GT_MetaTileEntity_Locker(LOCKER_UHV.ID, "locker.tier.09", "Highly Ultimate Voltage Locker", 9)
+ .getStackForm(1L));
+ }
+
+ private static void registerScanner() {
+ ItemList.Machine_LV_Scanner.set(
+ new GT_MetaTileEntity_Scanner(SCANNER_LV.ID, "basicmachine.scanner.tier.01", "Basic Scanner", 1)
+ .getStackForm(1L));
+ ItemList.Machine_MV_Scanner.set(
+ new GT_MetaTileEntity_Scanner(SCANNER_MV.ID, "basicmachine.scanner.tier.02", "Advanced Scanner", 2)
+ .getStackForm(1L));
+ ItemList.Machine_HV_Scanner.set(
+ new GT_MetaTileEntity_Scanner(SCANNER_HV.ID, "basicmachine.scanner.tier.03", "Advanced Scanner II", 3)
+ .getStackForm(1L));
+ ItemList.Machine_EV_Scanner.set(
+ new GT_MetaTileEntity_Scanner(SCANNER_EV.ID, "basicmachine.scanner.tier.04", "Advanced Scanner III", 4)
+ .getStackForm(1L));
+ ItemList.Machine_IV_Scanner.set(
+ new GT_MetaTileEntity_Scanner(SCANNER_IV.ID, "basicmachine.scanner.tier.05", "Advanced Scanner IV", 5)
+ .getStackForm(1L));
+ }
+
+ private static void registerPackager() {
+ ItemList.Machine_LV_Boxinator.set(
+ new GT_MetaTileEntity_Boxinator(PACKAGER_LV.ID, "basicmachine.boxinator.tier.01", "Basic Packager", 1)
+ .getStackForm(1L));
+ ItemList.Machine_MV_Boxinator.set(
+ new GT_MetaTileEntity_Boxinator(PACKAGER_MV.ID, "basicmachine.boxinator.tier.02", "Advanced Packager", 2)
+ .getStackForm(1L));
+ ItemList.Machine_HV_Boxinator.set(
+ new GT_MetaTileEntity_Boxinator(PACKAGER_HV.ID, "basicmachine.boxinator.tier.03", "Advanced Packager II", 3)
+ .getStackForm(1L));
+ ItemList.Machine_EV_Boxinator.set(
+ new GT_MetaTileEntity_Boxinator(
+ PACKAGER_EV.ID,
+ "basicmachine.boxinator.tier.04",
+ "Advanced Packager III",
+ 4).getStackForm(1L));
+ ItemList.Machine_IV_Boxinator.set(
+ new GT_MetaTileEntity_Boxinator(PACKAGER_IV.ID, "basicmachine.boxinator.tier.05", "Boxinator", 5)
+ .getStackForm(1L));
+ ItemList.Machine_LuV_Boxinator.set(
+ new GT_MetaTileEntity_Boxinator(PACKAGER_LuV.ID, "basicmachine.boxinator.tier.06", "Boxinator", 6)
+ .getStackForm(1L));
+ ItemList.Machine_ZPM_Boxinator.set(
+ new GT_MetaTileEntity_Boxinator(PACKAGER_ZPM.ID, "basicmachine.boxinator.tier.07", "Boxinator", 7)
+ .getStackForm(1L));
+ ItemList.Machine_UV_Boxinator.set(
+ new GT_MetaTileEntity_Boxinator(PACKAGER_UV.ID, "basicmachine.boxinator.tier.08", "Boxinator", 8)
+ .getStackForm(1L));
+ }
+
+ private static void registerRockBreaker() {
+ ItemList.Machine_LV_RockBreaker.set(
+ new GT_MetaTileEntity_RockBreaker(
+ ROCK_BREAKER_LV.ID,
+ "basicmachine.rockbreaker.tier.01",
+ "Basic Rock Breaker",
+ 1).getStackForm(1L));
+ ItemList.Machine_MV_RockBreaker.set(
+ new GT_MetaTileEntity_RockBreaker(
+ ROCK_BREAKER_MV.ID,
+ "basicmachine.rockbreaker.tier.02",
+ "Advanced Rock Breaker",
+ 2).getStackForm(1L));
+ ItemList.Machine_HV_RockBreaker.set(
+ new GT_MetaTileEntity_RockBreaker(
+ ROCK_BREAKER_HV.ID,
+ "basicmachine.rockbreaker.tier.03",
+ "Advanced Rock Breaker II",
+ 3).getStackForm(1L));
+ ItemList.Machine_EV_RockBreaker.set(
+ new GT_MetaTileEntity_RockBreaker(
+ ROCK_BREAKER_EV.ID,
+ "basicmachine.rockbreaker.tier.04",
+ "Advanced Rock Breaker III",
+ 4).getStackForm(1L));
+ ItemList.Machine_IV_RockBreaker.set(
+ new GT_MetaTileEntity_RockBreaker(
+ ROCK_BREAKER_IV.ID,
+ "basicmachine.rockbreaker.tier.05",
+ "Cryogenic Magma Solidifier R-8200",
+ 5).getStackForm(1L));
+ }
+
+ private static void registerIndustrialApiary() {
+ if (Forestry.isModLoaded()) {
+ ItemList.Machine_IndustrialApiary.set(
+ new GT_MetaTileEntity_IndustrialApiary(
+ INDUSTRIAL_APIARY.ID,
+ "basicmachine.industrialapiary",
+ "Industrial Apiary",
+ 8).getStackForm(1L));
+ }
+ }
+
+ private static void registerMassFab() {
+ ItemList.Machine_LV_Massfab.set(
+ new GT_MetaTileEntity_Massfabricator(
+ MASS_FABRICATOR_LV.ID,
+ "basicmachine.massfab.tier.01",
+ "Basic Mass Fabricator",
+ 1).getStackForm(1L));
+ ItemList.Machine_MV_Massfab.set(
+ new GT_MetaTileEntity_Massfabricator(
+ MASS_FABRICATOR_MV.ID,
+ "basicmachine.massfab.tier.02",
+ "Advanced Mass Fabricator",
+ 2).getStackForm(1L));
+ ItemList.Machine_HV_Massfab.set(
+ new GT_MetaTileEntity_Massfabricator(
+ MASS_FABRICATOR_HV.ID,
+ "basicmachine.massfab.tier.03",
+ "Advanced Mass Fabricator II",
+ 3).getStackForm(1L));
+ ItemList.Machine_EV_Massfab.set(
+ new GT_MetaTileEntity_Massfabricator(
+ MASS_FABRICATOR_EV.ID,
+ "basicmachine.massfab.tier.04",
+ "Advanced Mass Fabricator III",
+ 4).getStackForm(1L));
+ ItemList.Machine_IV_Massfab.set(
+ new GT_MetaTileEntity_Massfabricator(
+ MASS_FABRICATOR_IV.ID,
+ "basicmachine.massfab.tier.05",
+ "Advanced Mass Fabricator IV",
+ 5).getStackForm(1L));
+ }
+
+ private static void registerReplicator() {
+ ItemList.Machine_LV_Replicator.set(
+ new GT_MetaTileEntity_Replicator(REPLICATOR_LV.ID, "basicmachine.replicator.tier.01", "Basic Replicator", 1)
+ .getStackForm(1L));
+ ItemList.Machine_MV_Replicator.set(
+ new GT_MetaTileEntity_Replicator(
+ REPLICATOR_MV.ID,
+ "basicmachine.replicator.tier.02",
+ "Advanced Replicator",
+ 2).getStackForm(1L));
+ ItemList.Machine_HV_Replicator.set(
+ new GT_MetaTileEntity_Replicator(
+ REPLICATOR_HV.ID,
+ "basicmachine.replicator.tier.03",
+ "Advanced Replicator II",
+ 3).getStackForm(1L));
+ ItemList.Machine_EV_Replicator.set(
+ new GT_MetaTileEntity_Replicator(
+ REPLICATOR_EV.ID,
+ "basicmachine.replicator.tier.04",
+ "Advanced Replicator III",
+ 4).getStackForm(1L));
+ ItemList.Machine_IV_Replicator.set(
+ new GT_MetaTileEntity_Replicator(
+ REPLICATOR_IV.ID,
+ "basicmachine.replicator.tier.05",
+ "Advanced Replicator IV",
+ 5).getStackForm(1L));
+ }
+
+ private static void registerBrewery() {
+ ItemList.Machine_LV_Brewery.set(
+ new GT_MetaTileEntity_PotionBrewer(BREWERY_LV.ID, "basicmachine.brewery.tier.01", "Basic Brewery", 1)
+ .getStackForm(1L));
+ ItemList.Machine_MV_Brewery.set(
+ new GT_MetaTileEntity_PotionBrewer(BREWERY_MV.ID, "basicmachine.brewery.tier.02", "Advanced Brewery", 2)
+ .getStackForm(1L));
+ ItemList.Machine_HV_Brewery.set(
+ new GT_MetaTileEntity_PotionBrewer(BREWERY_HV.ID, "basicmachine.brewery.tier.03", "Advanced Brewery II", 3)
+ .getStackForm(1L));
+ ItemList.Machine_EV_Brewery.set(
+ new GT_MetaTileEntity_PotionBrewer(BREWERY_EV.ID, "basicmachine.brewery.tier.04", "Advanced Brewery III", 4)
+ .getStackForm(1L));
+ ItemList.Machine_IV_Brewery.set(
+ new GT_MetaTileEntity_PotionBrewer(BREWERY_IV.ID, "basicmachine.brewery.tier.05", "Advanced Brewery IV", 5)
+ .getStackForm(1L));
+ }
+
+ private static void registerMiner() {
+ ItemList.Machine_LV_Miner.set(
+ new GT_MetaTileEntity_Miner(MINER_LV.ID, "basicmachine.miner.tier.01", "Basic Miner", 1).getStackForm(1L));
+ ItemList.Machine_MV_Miner.set(
+ new GT_MetaTileEntity_Miner(MINER_MV.ID, "basicmachine.miner.tier.02", "Good Miner", 2).getStackForm(1L));
+ ItemList.Machine_HV_Miner.set(
+ new GT_MetaTileEntity_Miner(MINER_HV.ID, "basicmachine.miner.tier.03", "Advanced Miner", 3)
+ .getStackForm(1L));
+ }
+
+ private static void registerPump() {
+ ItemList.Pump_LV
+ .set(new GT_MetaTileEntity_Pump(PUMP_LV.ID, "basicmachine.pump.tier.01", "Basic Pump", 1).getStackForm(1L));
+ ItemList.Pump_MV.set(
+ new GT_MetaTileEntity_Pump(PUMP_MV.ID, "basicmachine.pump.tier.02", "Advanced Pump", 2).getStackForm(1L));
+ ItemList.Pump_HV.set(
+ new GT_MetaTileEntity_Pump(PUMP_HV.ID, "basicmachine.pump.tier.03", "Advanced Pump II", 3)
+ .getStackForm(1L));
+ ItemList.Pump_EV.set(
+ new GT_MetaTileEntity_Pump(PUMP_EV.ID, "basicmachine.pump.tier.04", "Advanced Pump III", 4)
+ .getStackForm(1L));
+ ItemList.Pump_IV.set(
+ new GT_MetaTileEntity_Pump(PUMP_IV.ID, "basicmachine.pump.tier.05", "Advanced Pump IV", 5)
+ .getStackForm(1L));
+ }
+
+ private static void registerTeleporter() {
+ ItemList.Teleporter.set(
+ new GT_MetaTileEntity_Teleporter(TELEPORTER.ID, "basicmachine.teleporter", "Teleporter", 9)
+ .getStackForm(1L));
+ }
+
+ private static void registerMonsterRepellator() {
+ ItemList.MobRep_LV.set(
+ new GT_MetaTileEntity_MonsterRepellent(
+ MONSTER_REPELLATOR_LV.ID,
+ "basicmachine.mobrep.tier.01",
+ "Basic Monster Repellator",
+ 1).getStackForm(1L));
+ ItemList.MobRep_MV.set(
+ new GT_MetaTileEntity_MonsterRepellent(
+ MONSTER_REPELLATOR_MV.ID,
+ "basicmachine.mobrep.tier.02",
+ "Advanced Monster Repellator",
+ 2).getStackForm(1L));
+ ItemList.MobRep_HV.set(
+ new GT_MetaTileEntity_MonsterRepellent(
+ MONSTER_REPELLATOR_HV.ID,
+ "basicmachine.mobrep.tier.03",
+ "Advanced Monster Repellator II",
+ 3).getStackForm(1L));
+ ItemList.MobRep_EV.set(
+ new GT_MetaTileEntity_MonsterRepellent(
+ MONSTER_REPELLATOR_EV.ID,
+ "basicmachine.mobrep.tier.04",
+ "Advanced Monster Repellator III",
+ 4).getStackForm(1L));
+ ItemList.MobRep_IV.set(
+ new GT_MetaTileEntity_MonsterRepellent(
+ MONSTER_REPELLATOR_IV.ID,
+ "basicmachine.mobrep.tier.05",
+ "Advanced Monster Repellator IV",
+ 5).getStackForm(1L));
+ ItemList.MobRep_LuV.set(
+ new GT_MetaTileEntity_MonsterRepellent(
+ MONSTER_REPELLATOR_LuV.ID,
+ "basicmachine.mobrep.tier.06",
+ "Advanced Monster Repellator V",
+ 6).getStackForm(1L));
+ ItemList.MobRep_ZPM.set(
+ new GT_MetaTileEntity_MonsterRepellent(
+ MONSTER_REPELLATOR_ZPM.ID,
+ "basicmachine.mobrep.tier.07",
+ "Advanced Monster Repellator VI",
+ 7).getStackForm(1L));
+ ItemList.MobRep_UV.set(
+ new GT_MetaTileEntity_MonsterRepellent(
+ MONSTER_REPELLATOR_UV.ID,
+ "basicmachine.mobrep.tier.08",
+ "Advanced Monster Repellator VII",
+ 8).getStackForm(1L));
+ }
+
+ private static void registerAdvancedSeismicProspector() {
+ ItemList.Seismic_Prospector_Adv_LV.set(
+ new GT_MetaTileEntity_AdvSeismicProspector(
+ ADVANCED_SEISMIC_PROSPECTOR_LV.ID,
+ "basicmachine.seismicprospector.07",
+ "Advanced Seismic Prospector LV",
+ 1,
+ 5 * 16 / 2,
+ 2).getStackForm(1));
+ ItemList.Seismic_Prospector_Adv_MV.set(
+ new GT_MetaTileEntity_AdvSeismicProspector(
+ ADVANCED_SEISMIC_PROSPECTOR_MV.ID,
+ "basicmachine.seismicprospector.06",
+ "Advanced Seismic Prospector MV",
+ 2,
+ 7 * 16 / 2,
+ 2).getStackForm(1));
+ ItemList.Seismic_Prospector_Adv_HV.set(
+ new GT_MetaTileEntity_AdvSeismicProspector(
+ ADVANCED_SEISMIC_PROSPECTOR_HV.ID,
+ "basicmachine.seismicprospector.05",
+ "Advanced Seismic Prospector HV",
+ 3,
+ 9 * 16 / 2,
+ 2).getStackForm(1));
+ ItemList.Seismic_Prospector_Adv_EV.set(
+ new GT_MetaTileEntity_AdvSeismicProspector(
+ ADVANCED_SEISMIC_PROSPECTOR_EV.ID,
+ "basicmachine.seismicprospector.04",
+ "Advanced Seismic Prospector EV",
+ 4,
+ 11 * 16 / 2,
+ 2).getStackForm(1));
+ }
+
+ private static void registerMicrowaveEnergyTransmitter() {
+ ItemList.MicroTransmitter_HV.set(
+ new GT_MetaTileEntity_MicrowaveEnergyTransmitter(
+ MICROWAVE_ENERGY_TRANSMITTER_HV.ID,
+ "basicmachine.microtransmitter.03",
+ "HV Microwave Energy Transmitter",
+ 3).getStackForm(1L));
+ ItemList.MicroTransmitter_EV.set(
+ new GT_MetaTileEntity_MicrowaveEnergyTransmitter(
+ MICROWAVE_ENERGY_TRANSMITTER_EV.ID,
+ "basicmachine.microtransmitter.04",
+ "EV Microwave Energy Transmitter",
+ 4).getStackForm(1L));
+ ItemList.MicroTransmitter_IV.set(
+ new GT_MetaTileEntity_MicrowaveEnergyTransmitter(
+ MICROWAVE_ENERGY_TRANSMITTER_IV.ID,
+ "basicmachine.microtransmitter.05",
+ "IV Microwave Energy Transmitter",
+ 5).getStackForm(1L));
+ ItemList.MicroTransmitter_LUV.set(
+ new GT_MetaTileEntity_MicrowaveEnergyTransmitter(
+ MICROWAVE_ENERGY_TRANSMITTER_LuV.ID,
+ "basicmachine.microtransmitter.06",
+ "LuV Microwave Energy Transmitter",
+ 6).getStackForm(1L));
+ ItemList.MicroTransmitter_ZPM.set(
+ new GT_MetaTileEntity_MicrowaveEnergyTransmitter(
+ MICROWAVE_ENERGY_TRANSMITTER_ZPM.ID,
+ "basicmachine.microtransmitter.07",
+ "ZPM Microwave Energy Transmitter",
+ 7).getStackForm(1L));
+ ItemList.MicroTransmitter_UV.set(
+ new GT_MetaTileEntity_MicrowaveEnergyTransmitter(
+ MICROWAVE_ENERGY_TRANSMITTER_UV.ID,
+ "basicmachine.microtransmitter.08",
+ "UV Microwave Energy Transmitter",
+ 8).getStackForm(1L));
+ }
+
+ private static void registerChestBuffer() {
+ ItemList.Automation_ChestBuffer_ULV.set(
+ new GT_MetaTileEntity_ChestBuffer(
+ CHEST_BUFFER_ULV.ID,
+ "automation.chestbuffer.tier.00",
+ "Ultra Low Voltage Chest Buffer",
+ 0).getStackForm(1L));
+ ItemList.Automation_ChestBuffer_LV.set(
+ new GT_MetaTileEntity_ChestBuffer(
+ CHEST_BUFFER_LV.ID,
+ "automation.chestbuffer.tier.01",
+ "Low Voltage Chest Buffer",
+ 1).getStackForm(1L));
+ ItemList.Automation_ChestBuffer_MV.set(
+ new GT_MetaTileEntity_ChestBuffer(
+ CHEST_BUFFER_MV.ID,
+ "automation.chestbuffer.tier.02",
+ "Medium Voltage Chest Buffer",
+ 2).getStackForm(1L));
+ ItemList.Automation_ChestBuffer_HV.set(
+ new GT_MetaTileEntity_ChestBuffer(
+ CHEST_BUFFER_HV.ID,
+ "automation.chestbuffer.tier.03",
+ "High Voltage Chest Buffer",
+ 3).getStackForm(1L));
+ ItemList.Automation_ChestBuffer_EV.set(
+ new GT_MetaTileEntity_ChestBuffer(
+ CHEST_BUFFER_EV.ID,
+ "automation.chestbuffer.tier.04",
+ "Extreme Voltage Chest Buffer",
+ 4).getStackForm(1L));
+ ItemList.Automation_ChestBuffer_IV.set(
+ new GT_MetaTileEntity_ChestBuffer(
+ CHEST_BUFFER_IV.ID,
+ "automation.chestbuffer.tier.05",
+ "Insane Voltage Chest Buffer",
+ 5).getStackForm(1L));
+ ItemList.Automation_ChestBuffer_LuV.set(
+ new GT_MetaTileEntity_ChestBuffer(
+ CHEST_BUFFER_LuV.ID,
+ "automation.chestbuffer.tier.06",
+ "Ludicrous Voltage Chest Buffer",
+ 6).getStackForm(1L));
+ ItemList.Automation_ChestBuffer_ZPM.set(
+ new GT_MetaTileEntity_ChestBuffer(
+ CHEST_BUFFER_ZPM.ID,
+ "automation.chestbuffer.tier.07",
+ "ZPM Voltage Chest Buffer",
+ 7).getStackForm(1L));
+ ItemList.Automation_ChestBuffer_UV.set(
+ new GT_MetaTileEntity_ChestBuffer(
+ CHEST_BUFFER_UV.ID,
+ "automation.chestbuffer.tier.08",
+ "Ultimate Voltage Chest Buffer",
+ 8).getStackForm(1L));
+ ItemList.Automation_ChestBuffer_MAX.set(
+ new GT_MetaTileEntity_ChestBuffer(
+ CHEST_BUFFER_UHV.ID,
+ "automation.chestbuffer.tier.09",
+ "Highly Ultimate Voltage Chest Buffer",
+ 9).getStackForm(1L));
+ }
+
+ private static void registerItemFilter() {
+ ItemList.Automation_Filter_ULV.set(
+ new GT_MetaTileEntity_Filter(
+ ITEM_FILTER_ULV.ID,
+ "automation.filter.tier.00",
+ "Ultra Low Voltage Item Filter",
+ 0).getStackForm(1L));
+ ItemList.Automation_Filter_LV.set(
+ new GT_MetaTileEntity_Filter(ITEM_FILTER_LV.ID, "automation.filter.tier.01", "Low Voltage Item Filter", 1)
+ .getStackForm(1L));
+ ItemList.Automation_Filter_MV.set(
+ new GT_MetaTileEntity_Filter(
+ ITEM_FILTER_MV.ID,
+ "automation.filter.tier.02",
+ "Medium Voltage Item Filter",
+ 2).getStackForm(1L));
+ ItemList.Automation_Filter_HV.set(
+ new GT_MetaTileEntity_Filter(ITEM_FILTER_HV.ID, "automation.filter.tier.03", "High Voltage Item Filter", 3)
+ .getStackForm(1L));
+ ItemList.Automation_Filter_EV.set(
+ new GT_MetaTileEntity_Filter(
+ ITEM_FILTER_EV.ID,
+ "automation.filter.tier.04",
+ "Extreme Voltage Item Filter",
+ 4).getStackForm(1L));
+ ItemList.Automation_Filter_IV.set(
+ new GT_MetaTileEntity_Filter(
+ ITEM_FILTER_IV.ID,
+ "automation.filter.tier.05",
+ "Insane Voltage Item Filter",
+ 5).getStackForm(1L));
+ ItemList.Automation_Filter_LuV.set(
+ new GT_MetaTileEntity_Filter(
+ ITEM_FILTER_LuV.ID,
+ "automation.filter.tier.06",
+ "Ludicrous Voltage Item Filter",
+ 6).getStackForm(1L));
+ ItemList.Automation_Filter_ZPM.set(
+ new GT_MetaTileEntity_Filter(ITEM_FILTER_ZPM.ID, "automation.filter.tier.07", "ZPM Voltage Item Filter", 7)
+ .getStackForm(1L));
+ ItemList.Automation_Filter_UV.set(
+ new GT_MetaTileEntity_Filter(
+ ITEM_FILTER_UV.ID,
+ "automation.filter.tier.08",
+ "Ultimate Voltage Item Filter",
+ 8).getStackForm(1L));
+ ItemList.Automation_Filter_MAX.set(
+ new GT_MetaTileEntity_Filter(
+ ITEM_FILTER_UHV.ID,
+ "automation.filter.tier.09",
+ "Highly Ultimate Voltage Item Filter",
+ 9).getStackForm(1L));
+ }
+
+ private static void registerTypeFilter() {
+ ItemList.Automation_TypeFilter_ULV.set(
+ new GT_MetaTileEntity_TypeFilter(
+ TYPE_FILTER_ULV.ID,
+ "automation.typefilter.tier.00",
+ "Ultra Low Voltage Type Filter",
+ 0).getStackForm(1L));
+ ItemList.Automation_TypeFilter_LV.set(
+ new GT_MetaTileEntity_TypeFilter(
+ TYPE_FILTER_LV.ID,
+ "automation.typefilter.tier.01",
+ "Low Voltage Type Filter",
+ 1).getStackForm(1L));
+ ItemList.Automation_TypeFilter_MV.set(
+ new GT_MetaTileEntity_TypeFilter(
+ TYPE_FILTER_MV.ID,
+ "automation.typefilter.tier.02",
+ "Medium Voltage Type Filter",
+ 2).getStackForm(1L));
+ ItemList.Automation_TypeFilter_HV.set(
+ new GT_MetaTileEntity_TypeFilter(
+ TYPE_FILTER_HV.ID,
+ "automation.typefilter.tier.03",
+ "High Voltage Type Filter",
+ 3).getStackForm(1L));
+ ItemList.Automation_TypeFilter_EV.set(
+ new GT_MetaTileEntity_TypeFilter(
+ TYPE_FILTER_EV.ID,
+ "automation.typefilter.tier.04",
+ "Extreme Voltage Type Filter",
+ 4).getStackForm(1L));
+ ItemList.Automation_TypeFilter_IV.set(
+ new GT_MetaTileEntity_TypeFilter(
+ TYPE_FILTER_IV.ID,
+ "automation.typefilter.tier.05",
+ "Insane Voltage Type Filter",
+ 5).getStackForm(1L));
+ ItemList.Automation_TypeFilter_LuV.set(
+ new GT_MetaTileEntity_TypeFilter(
+ TYPE_FILTER_LuV.ID,
+ "automation.typefilter.tier.06",
+ "Ludicrous Voltage Type Filter",
+ 6).getStackForm(1L));
+ ItemList.Automation_TypeFilter_ZPM.set(
+ new GT_MetaTileEntity_TypeFilter(
+ TYPE_FILTER_ZPM.ID,
+ "automation.typefilter.tier.07",
+ "ZPM Voltage Type Filter",
+ 7).getStackForm(1L));
+ ItemList.Automation_TypeFilter_UV.set(
+ new GT_MetaTileEntity_TypeFilter(
+ TYPE_FILTER_UV.ID,
+ "automation.typefilter.tier.08",
+ "Ultimate Voltage Type Filter",
+ 8).getStackForm(1L));
+ ItemList.Automation_TypeFilter_MAX.set(
+ new GT_MetaTileEntity_TypeFilter(
+ TYPE_FILTER_UHV.ID,
+ "automation.typefilter.tier.09",
+ "Highly Ultimate Voltage Type Filter",
+ 9).getStackForm(1L));
+ }
+
+ private static void registerRegulator() {
+ ItemList.Automation_Regulator_ULV.set(
+ new GT_MetaTileEntity_Regulator(
+ VOLTAGE_REGULATOR_ULV.ID,
+ "automation.regulator.tier.00",
+ "Ultra Low Voltage Regulator",
+ 0).getStackForm(1L));
+ ItemList.Automation_Regulator_LV.set(
+ new GT_MetaTileEntity_Regulator(
+ VOLTAGE_REGULATOR_LV.ID,
+ "automation.regulator.tier.01",
+ "Low Voltage Regulator",
+ 1).getStackForm(1L));
+ ItemList.Automation_Regulator_MV.set(
+ new GT_MetaTileEntity_Regulator(
+ VOLTAGE_REGULATOR_MV.ID,
+ "automation.regulator.tier.02",
+ "Medium Voltage Regulator",
+ 2).getStackForm(1L));
+ ItemList.Automation_Regulator_HV.set(
+ new GT_MetaTileEntity_Regulator(
+ VOLTAGE_REGULATOR_HV.ID,
+ "automation.regulator.tier.03",
+ "High Voltage Regulator",
+ 3).getStackForm(1L));
+ ItemList.Automation_Regulator_EV.set(
+ new GT_MetaTileEntity_Regulator(
+ VOLTAGE_REGULATOR_EV.ID,
+ "automation.regulator.tier.04",
+ "Extreme Voltage Regulator",
+ 4).getStackForm(1L));
+ ItemList.Automation_Regulator_IV.set(
+ new GT_MetaTileEntity_Regulator(
+ VOLTAGE_REGULATOR_IV.ID,
+ "automation.regulator.tier.05",
+ "Insane Voltage Regulator",
+ 5).getStackForm(1L));
+ ItemList.Automation_Regulator_LuV.set(
+ new GT_MetaTileEntity_Regulator(
+ VOLTAGE_REGULATOR_LuV.ID,
+ "automation.regulator.tier.06",
+ "Ludicrous Voltage Regulator",
+ 6).getStackForm(1L));
+ ItemList.Automation_Regulator_ZPM.set(
+ new GT_MetaTileEntity_Regulator(
+ VOLTAGE_REGULATOR_ZPM.ID,
+ "automation.regulator.tier.07",
+ "ZPM Voltage Regulator",
+ 7).getStackForm(1L));
+ ItemList.Automation_Regulator_UV.set(
+ new GT_MetaTileEntity_Regulator(
+ VOLTAGE_REGULATOR_UV.ID,
+ "automation.regulator.tier.08",
+ "Ultimate Voltage Regulator",
+ 8).getStackForm(1L));
+ ItemList.Automation_Regulator_MAX.set(
+ new GT_MetaTileEntity_Regulator(
+ VOLTAGE_REGULATOR_UHV.ID,
+ "automation.regulator.tier.09",
+ "Highly Ultimate Voltage Regulator",
+ 9).getStackForm(1L));
+ }
+
+ private static void registerSuperBuffer() {
+ ItemList.Automation_SuperBuffer_ULV.set(
+ new GT_MetaTileEntity_SuperBuffer(
+ SUPER_BUFFER_ULV.ID,
+ "automation.superbuffer.tier.00",
+ "Ultra Low Voltage Super Buffer",
+ 0).getStackForm(1L));
+ ItemList.Automation_SuperBuffer_LV.set(
+ new GT_MetaTileEntity_SuperBuffer(
+ SUPER_BUFFER_LV.ID,
+ "automation.superbuffer.tier.01",
+ "Low Voltage Super Buffer",
+ 1).getStackForm(1L));
+ ItemList.Automation_SuperBuffer_MV.set(
+ new GT_MetaTileEntity_SuperBuffer(
+ SUPER_BUFFER_MV.ID,
+ "automation.superbuffer.tier.02",
+ "Medium Voltage Super Buffer",
+ 2).getStackForm(1L));
+ ItemList.Automation_SuperBuffer_HV.set(
+ new GT_MetaTileEntity_SuperBuffer(
+ SUPER_BUFFER_HV.ID,
+ "automation.superbuffer.tier.03",
+ "High Voltage Super Buffer",
+ 3).getStackForm(1L));
+ ItemList.Automation_SuperBuffer_EV.set(
+ new GT_MetaTileEntity_SuperBuffer(
+ SUPER_BUFFER_EV.ID,
+ "automation.superbuffer.tier.04",
+ "Extreme Voltage Super Buffer",
+ 4).getStackForm(1L));
+ ItemList.Automation_SuperBuffer_IV.set(
+ new GT_MetaTileEntity_SuperBuffer(
+ SUPER_BUFFER_IV.ID,
+ "automation.superbuffer.tier.05",
+ "Insane Voltage Super Buffer",
+ 5).getStackForm(1L));
+ ItemList.Automation_SuperBuffer_LuV.set(
+ new GT_MetaTileEntity_SuperBuffer(
+ SUPER_BUFFER_LuV.ID,
+ "automation.superbuffer.tier.06",
+ "Ludicrous Voltage Super Buffer",
+ 6).getStackForm(1L));
+ ItemList.Automation_SuperBuffer_ZPM.set(
+ new GT_MetaTileEntity_SuperBuffer(
+ SUPER_BUFFER_ZPM.ID,
+ "automation.superbuffer.tier.07",
+ "ZPM Voltage Super Buffer",
+ 7).getStackForm(1L));
+ ItemList.Automation_SuperBuffer_UV.set(
+ new GT_MetaTileEntity_SuperBuffer(
+ SUPER_BUFFER_UV.ID,
+ "automation.superbuffer.tier.08",
+ "Ultimate Voltage Super Buffer",
+ 8).getStackForm(1L));
+ ItemList.Automation_SuperBuffer_MAX.set(
+ new GT_MetaTileEntity_SuperBuffer(
+ SUPER_BUFFER_UHV.ID,
+ "automation.superbuffer.tier.09",
+ "Highly Ultimate Voltage Super Buffer",
+ 9).getStackForm(1L));
+ }
+
+ private static void registerItemDistributor() {
+ ItemList.Automation_ItemDistributor_ULV.set(
+ new GT_MetaTileEntity_ItemDistributor(
+ ITEM_DISTRIBUTOR_ULV.ID,
+ "automation.itemdistributor.tier.00",
+ "Ultra Low Voltage Item Distributor",
+ 0).getStackForm(1L));
+ ItemList.Automation_ItemDistributor_LV.set(
+ new GT_MetaTileEntity_ItemDistributor(
+ ITEM_DISTRIBUTOR_LV.ID,
+ "automation.itemdistributor.tier.01",
+ "Low Voltage Item Distributor",
+ 1).getStackForm(1L));
+ ItemList.Automation_ItemDistributor_MV.set(
+ new GT_MetaTileEntity_ItemDistributor(
+ ITEM_DISTRIBUTOR_MV.ID,
+ "automation.itemdistributor.tier.02",
+ "Medium Voltage Item Distributor",
+ 2).getStackForm(1L));
+ ItemList.Automation_ItemDistributor_HV.set(
+ new GT_MetaTileEntity_ItemDistributor(
+ ITEM_DISTRIBUTOR_HV.ID,
+ "automation.itemdistributor.tier.03",
+ "High Voltage Item Distributor",
+ 3).getStackForm(1L));
+ ItemList.Automation_ItemDistributor_EV.set(
+ new GT_MetaTileEntity_ItemDistributor(
+ ITEM_DISTRIBUTOR_EV.ID,
+ "automation.itemdistributor.tier.04",
+ "Extreme Voltage Item Distributor",
+ 4).getStackForm(1L));
+ ItemList.Automation_ItemDistributor_IV.set(
+ new GT_MetaTileEntity_ItemDistributor(
+ ITEM_DISTRIBUTOR_IV.ID,
+ "automation.itemdistributor.tier.05",
+ "Insane Voltage Item Distributor",
+ 5).getStackForm(1L));
+ ItemList.Automation_ItemDistributor_LuV.set(
+ new GT_MetaTileEntity_ItemDistributor(
+ ITEM_DISTRIBUTOR_LuV.ID,
+ "automation.itemdistributor.tier.06",
+ "Ludicrous Voltage Item Distributor",
+ 6).getStackForm(1L));
+ ItemList.Automation_ItemDistributor_ZPM.set(
+ new GT_MetaTileEntity_ItemDistributor(
+ ITEM_DISTRIBUTOR_ZPM.ID,
+ "automation.itemdistributor.tier.07",
+ "ZPM Voltage Item Distributor",
+ 7).getStackForm(1L));
+ ItemList.Automation_ItemDistributor_UV.set(
+ new GT_MetaTileEntity_ItemDistributor(
+ ITEM_DISTRIBUTOR_UV.ID,
+ "automation.itemdistributor.tier.08",
+ "Ultimate Voltage Item Distributor",
+ 8).getStackForm(1L));
+ ItemList.Automation_ItemDistributor_MAX.set(
+ new GT_MetaTileEntity_ItemDistributor(
+ ITEM_DISTRIBUTOR_UHV.ID,
+ "automation.itemdistributor.tier.09",
+ "MAX Voltage Item Distributor",
+ 9).getStackForm(1L));
+ }
+
+ private static void registerRecipeFilter() {
+ ItemList.Automation_RecipeFilter_ULV.set(
+ new GT_MetaTileEntity_RecipeFilter(
+ RECIPE_FILTER_ULV.ID,
+ "automation.recipefilter.tier.00",
+ "Ultra Low Voltage Recipe Filter",
+ 0).getStackForm(1L));
+ ItemList.Automation_RecipeFilter_LV.set(
+ new GT_MetaTileEntity_RecipeFilter(
+ RECIPE_FILTER_LV.ID,
+ "automation.recipefilter.tier.01",
+ "Low Voltage Recipe Filter",
+ 1).getStackForm(1L));
+ ItemList.Automation_RecipeFilter_MV.set(
+ new GT_MetaTileEntity_RecipeFilter(
+ RECIPE_FILTER_MV.ID,
+ "automation.recipefilter.tier.02",
+ "Medium Voltage Recipe Filter",
+ 2).getStackForm(1L));
+ ItemList.Automation_RecipeFilter_HV.set(
+ new GT_MetaTileEntity_RecipeFilter(
+ RECIPE_FILTER_HV.ID,
+ "automation.recipefilter.tier.03",
+ "High Voltage Recipe Filter",
+ 3).getStackForm(1L));
+ ItemList.Automation_RecipeFilter_EV.set(
+ new GT_MetaTileEntity_RecipeFilter(
+ RECIPE_FILTER_EV.ID,
+ "automation.recipefilter.tier.04",
+ "Extreme Voltage Recipe Filter",
+ 4).getStackForm(1L));
+ ItemList.Automation_RecipeFilter_IV.set(
+ new GT_MetaTileEntity_RecipeFilter(
+ RECIPE_FILTER_IV.ID,
+ "automation.recipefilter.tier.05",
+ "Insane Voltage Recipe Filter",
+ 5).getStackForm(1L));
+ ItemList.Automation_RecipeFilter_LuV.set(
+ new GT_MetaTileEntity_RecipeFilter(
+ RECIPE_FILTER_LuV.ID,
+ "automation.recipefilter.tier.06",
+ "Ludicrous Voltage Recipe Filter",
+ 6).getStackForm(1L));
+ ItemList.Automation_RecipeFilter_ZPM.set(
+ new GT_MetaTileEntity_RecipeFilter(
+ RECIPE_FILTER_ZPM.ID,
+ "automation.recipefilter.tier.07",
+ "ZPM Voltage Recipe Filter",
+ 7).getStackForm(1L));
+ ItemList.Automation_RecipeFilter_UV.set(
+ new GT_MetaTileEntity_RecipeFilter(
+ RECIPE_FILTER_UV.ID,
+ "automation.recipefilter.tier.08",
+ "Ultimate Voltage Recipe Filter",
+ 8).getStackForm(1L));
+ ItemList.Automation_RecipeFilter_MAX.set(
+ new GT_MetaTileEntity_RecipeFilter(
+ RECIPE_FILTER_UHV.ID,
+ "automation.recipefilter.tier.09",
+ "Highly Ultimate Voltage Recipe Filter",
+ 9).getStackForm(1L));
+ }
+
+ private static void registerMachineHull() {
+ ItemList.Hull_Bronze.set(
+ new GT_MetaTileEntity_BasicHull_Bronze(
+ HULL_BRONZE.ID,
+ "hull.bronze",
+ "Bronze Hull",
+ 0,
+ "For your first Steam Machines").getStackForm(1L));
+ ItemList.Hull_Bronze_Bricks.set(
+ new GT_MetaTileEntity_BasicHull_BronzeBricks(
+ HULL_BRICKED_BRONZE.ID,
+ "hull.bronze_bricked",
+ "Bricked Bronze Hull",
+ 0,
+ "For your first Steam Machines").getStackForm(1L));
+ ItemList.Hull_HP.set(
+ new GT_MetaTileEntity_BasicHull_Steel(
+ HULL_STEEL.ID,
+ "hull.steel",
+ "Steel Hull",
+ 0,
+ "For improved Steam Machines").getStackForm(1L));
+ ItemList.Hull_HP_Bricks.set(
+ new GT_MetaTileEntity_BasicHull_SteelBricks(
+ HULL_WROUGHT_IRON.ID,
+ "hull.steel_bricked",
+ "Bricked Wrought Iron Hull",
+ 0,
+ "For improved Steam Machines").getStackForm(1L));
+
+ ItemList.Hull_ULV.set(
+ new GT_MetaTileEntity_BasicHull(HULL_ULV.ID, "hull.tier.00", "ULV Machine Hull", 0, imagination)
+ .getStackForm(1L));
+ ItemList.Hull_LV.set(
+ new GT_MetaTileEntity_BasicHull(HULL_LV.ID, "hull.tier.01", "LV Machine Hull", 1, imagination)
+ .getStackForm(1L));
+ ItemList.Hull_MV.set(
+ new GT_MetaTileEntity_BasicHull(HULL_MV.ID, "hull.tier.02", "MV Machine Hull", 2, imagination)
+ .getStackForm(1L));
+ ItemList.Hull_HV.set(
+ new GT_MetaTileEntity_BasicHull(HULL_HV.ID, "hull.tier.03", "HV Machine Hull", 3, imagination)
+ .getStackForm(1L));
+ ItemList.Hull_EV.set(
+ new GT_MetaTileEntity_BasicHull(HULL_EV.ID, "hull.tier.04", "EV Machine Hull", 4, imagination)
+ .getStackForm(1L));
+ ItemList.Hull_IV.set(
+ new GT_MetaTileEntity_BasicHull(HULL_IV.ID, "hull.tier.05", "IV Machine Hull", 5, imagination)
+ .getStackForm(1L));
+ ItemList.Hull_LuV.set(
+ new GT_MetaTileEntity_BasicHull(HULL_LuV.ID, "hull.tier.06", "LuV Machine Hull", 6, imagination)
+ .getStackForm(1L));
+ ItemList.Hull_ZPM.set(
+ new GT_MetaTileEntity_BasicHull(HULL_ZPM.ID, "hull.tier.07", "ZPM Machine Hull", 7, imagination)
+ .getStackForm(1L));
+ ItemList.Hull_UV.set(
+ new GT_MetaTileEntity_BasicHull(HULL_UV.ID, "hull.tier.08", "UV Machine Hull", 8, imagination)
+ .getStackForm(1L));
+ ItemList.Hull_MAX.set(
+ new GT_MetaTileEntity_BasicHull(HULL_UHV.ID, "hull.tier.09", "UHV Machine Hull", 9, imagination)
+ .getStackForm(1L));
+ }
+
+ private static void registerTransformer() {
+ ItemList.Transformer_LV_ULV.set(
+ new GT_MetaTileEntity_Transformer(
+ transformer_LV_ULV.ID,
+ "transformer.tier.00",
+ "Ultra Low Voltage Transformer",
+ 0,
+ "LV -> ULV (Use Soft Mallet to invert)").getStackForm(1L));
+ ItemList.Transformer_MV_LV.set(
+ new GT_MetaTileEntity_Transformer(
+ transformer_MV_LV.ID,
+ "transformer.tier.01",
+ "Low Voltage Transformer",
+ 1,
+ "MV -> LV (Use Soft Mallet to invert)").getStackForm(1L));
+ ItemList.Transformer_HV_MV.set(
+ new GT_MetaTileEntity_Transformer(
+ transformer_HV_MV.ID,
+ "transformer.tier.02",
+ "Medium Voltage Transformer",
+ 2,
+ "HV -> MV (Use Soft Mallet to invert)").getStackForm(1L));
+ ItemList.Transformer_EV_HV.set(
+ new GT_MetaTileEntity_Transformer(
+ transformer_EV_HV.ID,
+ "transformer.tier.03",
+ "High Voltage Transformer",
+ 3,
+ "EV -> HV (Use Soft Mallet to invert)").getStackForm(1L));
+ ItemList.Transformer_IV_EV.set(
+ new GT_MetaTileEntity_Transformer(
+ transformer_IV_EV.ID,
+ "transformer.tier.04",
+ "Extreme Transformer",
+ 4,
+ "IV -> EV (Use Soft Mallet to invert)").getStackForm(1L));
+ ItemList.Transformer_LuV_IV.set(
+ new GT_MetaTileEntity_Transformer(
+ transformer_LuV_IV.ID,
+ "transformer.tier.05",
+ "Insane Transformer",
+ 5,
+ "LuV -> IV (Use Soft Mallet to invert)").getStackForm(1L));
+ ItemList.Transformer_ZPM_LuV.set(
+ new GT_MetaTileEntity_Transformer(
+ transformer_ZPM_LuV.ID,
+ "transformer.tier.06",
+ "Ludicrous Transformer",
+ 6,
+ "ZPM -> LuV (Use Soft Mallet to invert)").getStackForm(1L));
+ ItemList.Transformer_UV_ZPM.set(
+ new GT_MetaTileEntity_Transformer(
+ transformer_UV_ZPM.ID,
+ "transformer.tier.07",
+ "ZPM Voltage Transformer",
+ 7,
+ "UV -> ZPM (Use Soft Mallet to invert)").getStackForm(1L));
+ ItemList.Transformer_MAX_UV.set(
+ new GT_MetaTileEntity_Transformer(
+ transformer_UHV_UV.ID,
+ "transformer.tier.08",
+ "Ultimate Transformer",
+ 8,
+ "UHV -> UV (Use Soft Mallet to invert)").getStackForm(1L));
+ }
+
+ private static void registerDynamoHatch() {
+ ItemList.Hatch_Dynamo_ULV.set(
+ new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_ULV.ID, "hatch.dynamo.tier.00", "ULV Dynamo Hatch", 0)
+ .getStackForm(1L));
+ ItemList.Hatch_Dynamo_LV.set(
+ new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_LV.ID, "hatch.dynamo.tier.01", "LV Dynamo Hatch", 1)
+ .getStackForm(1L));
+ ItemList.Hatch_Dynamo_MV.set(
+ new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_MV.ID, "hatch.dynamo.tier.02", "MV Dynamo Hatch", 2)
+ .getStackForm(1L));
+ ItemList.Hatch_Dynamo_HV.set(
+ new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_HV.ID, "hatch.dynamo.tier.03", "HV Dynamo Hatch", 3)
+ .getStackForm(1L));
+ ItemList.Hatch_Dynamo_EV.set(
+ new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_EV.ID, "hatch.dynamo.tier.04", "EV Dynamo Hatch", 4)
+ .getStackForm(1L));
+ ItemList.Hatch_Dynamo_IV.set(
+ new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_IV.ID, "hatch.dynamo.tier.05", "IV Dynamo Hatch", 5)
+ .getStackForm(1L));
+ ItemList.Hatch_Dynamo_LuV.set(
+ new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_LuV.ID, "hatch.dynamo.tier.06", "LuV Dynamo Hatch", 6)
+ .getStackForm(1L));
+ ItemList.Hatch_Dynamo_ZPM.set(
+ new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_ZPM.ID, "hatch.dynamo.tier.07", "ZPM Dynamo Hatch", 7)
+ .getStackForm(1L));
+ ItemList.Hatch_Dynamo_UV.set(
+ new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_UV.ID, "hatch.dynamo.tier.08", "UV Dynamo Hatch", 8)
+ .getStackForm(1L));
+ ItemList.Hatch_Dynamo_MAX.set(
+ new GT_MetaTileEntity_Hatch_Dynamo(DYNAMO_HATCH_UHV.ID, "hatch.dynamo.tier.09", "UHV Dynamo Hatch", 9)
+ .getStackForm(1L));
+ }
+
+ private static void registerEnergyHatch() {
+ ItemList.Hatch_Energy_ULV.set(
+ new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_ULV.ID, "hatch.energy.tier.00", "ULV Energy Hatch", 0)
+ .getStackForm(1L));
+ ItemList.Hatch_Energy_LV.set(
+ new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_LV.ID, "hatch.energy.tier.01", "LV Energy Hatch", 1)
+ .getStackForm(1L));
+ ItemList.Hatch_Energy_MV.set(
+ new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_MV.ID, "hatch.energy.tier.02", "MV Energy Hatch", 2)
+ .getStackForm(1L));
+ ItemList.Hatch_Energy_HV.set(
+ new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_HV.ID, "hatch.energy.tier.03", "HV Energy Hatch", 3)
+ .getStackForm(1L));
+ ItemList.Hatch_Energy_EV.set(
+ new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_EV.ID, "hatch.energy.tier.04", "EV Energy Hatch", 4)
+ .getStackForm(1L));
+ ItemList.Hatch_Energy_IV.set(
+ new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_IV.ID, "hatch.energy.tier.05", "IV Energy Hatch", 5)
+ .getStackForm(1L));
+ ItemList.Hatch_Energy_LuV.set(
+ new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_LuV.ID, "hatch.energy.tier.06", "LuV Energy Hatch", 6)
+ .getStackForm(1L));
+ ItemList.Hatch_Energy_ZPM.set(
+ new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_ZPM.ID, "hatch.energy.tier.07", "ZPM Energy Hatch", 7)
+ .getStackForm(1L));
+ ItemList.Hatch_Energy_UV.set(
+ new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_UV.ID, "hatch.energy.tier.08", "UV Energy Hatch", 8)
+ .getStackForm(1L));
+ ItemList.Hatch_Energy_MAX.set(
+ new GT_MetaTileEntity_Hatch_Energy(ENERGY_HATCH_UHV.ID, "hatch.energy.tier.09", "UHV Energy Hatch", 9)
+ .getStackForm(1L));
+ }
+
+ private static void registerInputHatch() {
+ ItemList.Hatch_Input_ULV.set(
+ new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_ULV.ID, "hatch.input.tier.00", "Input Hatch (ULV)", 0)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_LV.set(
+ new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_LV.ID, "hatch.input.tier.01", "Input Hatch (LV)", 1)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_MV.set(
+ new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_MV.ID, "hatch.input.tier.02", "Input Hatch (MV)", 2)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_HV.set(
+ new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_HV.ID, "hatch.input.tier.03", "Input Hatch (HV)", 3)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_EV.set(
+ new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_EV.ID, "hatch.input.tier.04", "Input Hatch (EV)", 4)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_IV.set(
+ new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_IV.ID, "hatch.input.tier.05", "Input Hatch (IV)", 5)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_LuV.set(
+ new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_LuV.ID, "hatch.input.tier.06", "Input Hatch (LuV)", 6)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_ZPM.set(
+ new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_ZPM.ID, "hatch.input.tier.07", "Input Hatch (ZPM)", 7)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_UV.set(
+ new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_UV.ID, "hatch.input.tier.08", "Input Hatch (UV)", 8)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_MAX.set(
+ new GT_MetaTileEntity_Hatch_Input(INPUT_HATCH_UHV.ID, "hatch.input.tier.09", "Input Hatch (UHV)", 9)
+ .getStackForm(1L));
+ }
+
+ private static void registerQuadrupleInputHatch() {
+ ItemList.Hatch_Input_Multi_2x2_EV.set(
+ new GT_MetaTileEntity_Hatch_MultiInput(
+ QUADRUPLE_INPUT_HATCHES_EV.ID,
+ 4,
+ "hatch.multi.input.tier.01",
+ "Quadruple Input Hatch (EV)",
+ 4).getStackForm(1L));
+ ItemList.Hatch_Input_Multi_2x2_IV.set(
+ new GT_MetaTileEntity_Hatch_MultiInput(
+ QUADRUPLE_INPUT_HATCHES_IV.ID,
+ 4,
+ "hatch.multi.input.tier.02",
+ "Quadruple Input Hatch (IV)",
+ 5).getStackForm(1L));
+ ItemList.Hatch_Input_Multi_2x2_LuV.set(
+ new GT_MetaTileEntity_Hatch_MultiInput(
+ QUADRUPLE_INPUT_HATCHES_LuV.ID,
+ 4,
+ "hatch.multi.input.tier.03",
+ "Quadruple Input Hatch (LuV)",
+ 6).getStackForm(1L));
+ ItemList.Hatch_Input_Multi_2x2_ZPM.set(
+ new GT_MetaTileEntity_Hatch_MultiInput(
+ QUADRUPLE_INPUT_HATCHES_ZPM.ID,
+ 4,
+ "hatch.multi.input.tier.04",
+ "Quadruple Input Hatch (ZPM)",
+ 7).getStackForm(1L));
+ ItemList.Hatch_Input_Multi_2x2_UV.set(
+ new GT_MetaTileEntity_Hatch_MultiInput(
+ QUADRUPLE_INPUT_HATCHES_UV.ID,
+ 4,
+ "hatch.multi.input.tier.05",
+ "Quadruple Input Hatch (UV)",
+ 8).getStackForm(1L));
+ ItemList.Hatch_Input_Multi_2x2_UHV.set(
+ new GT_MetaTileEntity_Hatch_MultiInput(
+ QUADRUPLE_INPUT_HATCHES_UHV.ID,
+ 4,
+ "hatch.multi.input.tier.06",
+ "Quadruple Input Hatch (UHV)",
+ 9).getStackForm(1L));
+ ItemList.Hatch_Input_Multi_2x2_UEV.set(
+ new GT_MetaTileEntity_Hatch_MultiInput(
+ QUADRUPLE_INPUT_HATCHES_UEV.ID,
+ 4,
+ "hatch.multi.input.tier.07",
+ "Quadruple Input Hatch (UEV)",
+ 10).getStackForm(1L));
+ ItemList.Hatch_Input_Multi_2x2_UIV.set(
+ new GT_MetaTileEntity_Hatch_MultiInput(
+ QUADRUPLE_INPUT_HATCHES_UIV.ID,
+ 4,
+ "hatch.multi.input.tier.08",
+ "Quadruple Input Hatch (UIV)",
+ 11).getStackForm(1L));
+ ItemList.Hatch_Input_Multi_2x2_UMV.set(
+ new GT_MetaTileEntity_Hatch_MultiInput(
+ QUADRUPLE_INPUT_HATCHES_UMV.ID,
+ 4,
+ "hatch.multi.input.tier.09",
+ "Quadruple Input Hatch (UMV)",
+ 12).getStackForm(1L));
+ ItemList.Hatch_Input_Multi_2x2_UXV.set(
+ new GT_MetaTileEntity_Hatch_MultiInput(
+ QUADRUPLE_INPUT_HATCHES_UXV.ID,
+ 4,
+ "hatch.multi.input.tier.10",
+ "Quadruple Input Hatch (UXV)",
+ 13).getStackForm(1L));
+
+ ItemList.Hatch_Input_Multi_2x2_Humongous.set(
+ new GT_MetaTileEntity_Hatch_QuadrupleHumongous(
+ QUADRUPLE_INPUT_HATCHES_MAX.ID,
+ 4,
+ "hatch.multi.input.tier.11",
+ "Humongous Quadruple Input Hatch").getStackForm(1L));
+ }
+
+ private static void registerOutputHatch() {
+ ItemList.Hatch_Output_ULV.set(
+ new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_ULV.ID, "hatch.output.tier.00", "Output Hatch (ULV)", 0)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_LV.set(
+ new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_LV.ID, "hatch.output.tier.01", "Output Hatch (LV)", 1)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_MV.set(
+ new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_MV.ID, "hatch.output.tier.02", "Output Hatch (MV)", 2)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_HV.set(
+ new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_HV.ID, "hatch.output.tier.03", "Output Hatch (HV)", 3)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_EV.set(
+ new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_EV.ID, "hatch.output.tier.04", "Output Hatch (EV)", 4)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_IV.set(
+ new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_IV.ID, "hatch.output.tier.05", "Output Hatch (IV)", 5)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_LuV.set(
+ new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_LuV.ID, "hatch.output.tier.06", "Output Hatch (LuV)", 6)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_ZPM.set(
+ new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_ZPM.ID, "hatch.output.tier.07", "Output Hatch (ZPM)", 7)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_UV.set(
+ new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_UV.ID, "hatch.output.tier.08", "Output Hatch (UV)", 8)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_MAX.set(
+ new GT_MetaTileEntity_Hatch_Output(OUTPUT_HATCH_UHV.ID, "hatch.output.tier.09", "Output Hatch (UHV)", 9)
+ .getStackForm(1L));
+ }
+
+ private static void registerQuantumTank() {
+ ItemList.Quantum_Tank_LV.set(
+ new GT_MetaTileEntity_QuantumTank(QUANTUM_TANK_LV.ID, "quantum.tank.tier.06", "Quantum Tank I", 6)
+ .getStackForm(1L));
+ ItemList.Quantum_Tank_MV.set(
+ new GT_MetaTileEntity_QuantumTank(QUANTUM_TANK_MV.ID, "quantum.tank.tier.07", "Quantum Tank II", 7)
+ .getStackForm(1L));
+ ItemList.Quantum_Tank_HV.set(
+ new GT_MetaTileEntity_QuantumTank(QUANTUM_TANK_HV.ID, "quantum.tank.tier.08", "Quantum Tank III", 8)
+ .getStackForm(1L));
+ ItemList.Quantum_Tank_EV.set(
+ new GT_MetaTileEntity_QuantumTank(QUANTUM_TANK_EV.ID, "quantum.tank.tier.09", "Quantum Tank IV", 9)
+ .getStackForm(1L));
+ ItemList.Quantum_Tank_IV.set(
+ new GT_MetaTileEntity_QuantumTank(QUANTUM_TANK_IV.ID, "quantum.tank.tier.10", "Quantum Tank V", 10)
+ .getStackForm(1L));
+ }
+
+ private static void registerQuantumChest() {
+ ItemList.Quantum_Chest_LV.set(
+ new GT_MetaTileEntity_QuantumChest(QUANTUM_CHEST_LV.ID, "quantum.chest.tier.06", "Quantum Chest I", 6)
+ .getStackForm(1L));
+ ItemList.Quantum_Chest_MV.set(
+ new GT_MetaTileEntity_QuantumChest(QUANTUM_CHEST_MV.ID, "quantum.chest.tier.07", "Quantum Chest II", 7)
+ .getStackForm(1L));
+ ItemList.Quantum_Chest_HV.set(
+ new GT_MetaTileEntity_QuantumChest(QUANTUM_CHEST_HV.ID, "quantum.chest.tier.08", "Quantum Chest III", 8)
+ .getStackForm(1L));
+ ItemList.Quantum_Chest_EV.set(
+ new GT_MetaTileEntity_QuantumChest(QUANTUM_CHEST_EV.ID, "quantum.chest.tier.09", "Quantum Chest IV", 9)
+ .getStackForm(1L));
+ ItemList.Quantum_Chest_IV.set(
+ new GT_MetaTileEntity_QuantumChest(QUANTUM_CHEST_IV.ID, "quantum.chest.tier.10", "Quantum Chest V", 10)
+ .getStackForm(1L));
+ }
+
+ private static void registerSuperTank() {
+ ItemList.Super_Tank_LV.set(
+ new GT_MetaTileEntity_SuperTank(SUPER_TANK_LV.ID, "super.tank.tier.01", "Super Tank I", 1)
+ .getStackForm(1L));
+ ItemList.Super_Tank_MV.set(
+ new GT_MetaTileEntity_SuperTank(SUPER_TANK_MV.ID, "super.tank.tier.02", "Super Tank II", 2)
+ .getStackForm(1L));
+ ItemList.Super_Tank_HV.set(
+ new GT_MetaTileEntity_SuperTank(SUPER_TANK_HV.ID, "super.tank.tier.03", "Super Tank III", 3)
+ .getStackForm(1L));
+ ItemList.Super_Tank_EV.set(
+ new GT_MetaTileEntity_SuperTank(SUPER_TANK_EV.ID, "super.tank.tier.04", "Super Tank IV", 4)
+ .getStackForm(1L));
+ ItemList.Super_Tank_IV.set(
+ new GT_MetaTileEntity_SuperTank(SUPER_TANK_IV.ID, "super.tank.tier.05", "Super Tank V", 5)
+ .getStackForm(1L));
+ }
+
+ private static void registerSuperChest() {
+ ItemList.Super_Chest_LV.set(
+ new GT_MetaTileEntity_SuperChest(SUPER_CHEST_LV.ID, "super.chest.tier.01", "Super Chest I", 1)
+ .getStackForm(1L));
+ ItemList.Super_Chest_MV.set(
+ new GT_MetaTileEntity_SuperChest(SUPER_CHEST_MV.ID, "super.chest.tier.02", "Super Chest II", 2)
+ .getStackForm(1L));
+ ItemList.Super_Chest_HV.set(
+ new GT_MetaTileEntity_SuperChest(SUPER_CHEST_HV.ID, "super.chest.tier.03", "Super Chest III", 3)
+ .getStackForm(1L));
+ ItemList.Super_Chest_EV.set(
+ new GT_MetaTileEntity_SuperChest(SUPER_CHEST_EV.ID, "super.chest.tier.04", "Super Chest IV", 4)
+ .getStackForm(1L));
+ ItemList.Super_Chest_IV.set(
+ new GT_MetaTileEntity_SuperChest(SUPER_CHEST_IV.ID, "super.chest.tier.05", "Super Chest V", 5)
+ .getStackForm(1L));
+ }
+
+ private static void registerLongDistancePipe() {
+ ItemList.Long_Distance_Pipeline_Fluid.set(
+ new GT_MetaTileEntity_LongDistancePipelineFluid(
+ LONG_DISTANCE_PIPELINE_FLUID.ID,
+ "long.distance.pipeline.fluid",
+ "Long Distance Fluid Pipeline",
+ 1).getStackForm(1L));
+ ItemList.Long_Distance_Pipeline_Item.set(
+ new GT_MetaTileEntity_LongDistancePipelineItem(
+ LONG_DISTANCE_PIPELINE_ITEM.ID,
+ "long.distance.pipeline.item",
+ "Long Distance Item Pipeline",
+ 1).getStackForm(1L));
+ }
+
+ private static void registerAE2Hatches() {
+ ItemList.Hatch_Output_Bus_ME.set(
+ new GT_MetaTileEntity_Hatch_OutputBus_ME(OUTPUT_BUS_ME.ID, "hatch.output_bus.me", "Output Bus (ME)")
+ .getStackForm(1L));
+ ItemList.Hatch_Input_Bus_ME.set(
+ new GT_MetaTileEntity_Hatch_InputBus_ME(
+ INPUT_BUS_ME.ID,
+ false,
+ "hatch.input_bus.me.basic",
+ "Stocking Input Bus (ME)").getStackForm(1L));
+ ItemList.Hatch_Input_Bus_ME_Advanced.set(
+ new GT_MetaTileEntity_Hatch_InputBus_ME(
+ INPUT_BUS_ME_ADVANCED.ID,
+ true,
+ "hatch.input_bus.me",
+ "Advanced Stocking Input Bus (ME)").getStackForm(1L));
+ ItemList.Hatch_Input_ME.set(
+ new GT_MetaTileEntity_Hatch_Input_ME(
+ INPUT_HATCH_ME.ID,
+ false,
+ "hatch.input.me.basic",
+ "Stocking Input Hatch (ME)").getStackForm(1L));
+ ItemList.Hatch_Input_ME_Advanced.set(
+ new GT_MetaTileEntity_Hatch_Input_ME(
+ INPUT_HATCH_ME_ADVANCED.ID,
+ true,
+ "hatch.input.me",
+ "Advanced Stocking Input Hatch (ME)").getStackForm(1L));
+ ItemList.Hatch_Output_ME.set(
+ new GT_MetaTileEntity_Hatch_Output_ME(OUTPUT_HATCH_ME.ID, "hatch.output.me", "Output Hatch (ME)")
+ .getStackForm(1L));
+ ItemList.Hatch_CraftingInput_Bus_ME.set(
+ new GT_MetaTileEntity_Hatch_CraftingInput_ME(
+ CRAFTING_INPUT_ME.ID,
+ "hatch.crafting_input.me",
+ "Crafting Input Buffer (ME)",
+ true).getStackForm(1L));
+ ItemList.Hatch_CraftingInput_Bus_ME_ItemOnly.set(
+ new GT_MetaTileEntity_Hatch_CraftingInput_ME(
+ CRAFTING_INPUT_ME_BUS.ID,
+ "hatch.crafting_input.me.item_only",
+ "Crafting Input Bus (ME)",
+ false).getStackForm(1L));
+ ItemList.Hatch_CraftingInput_Bus_Slave.set(
+ new GT_MetaTileEntity_Hatch_CraftingInput_Slave(
+ CRAFTING_INPUT_SLAVE.ID,
+ "hatch.crafting_input.slave",
+ "Crafting Input Slave").getStackForm(1L));
+ }
+
+ private static void registerInputBus() {
+ ItemList.Hatch_Input_Bus_ULV.set(
+ new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_ULV.ID, "hatch.input_bus.tier.00", "Input Bus (ULV)", 0)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_Bus_LV.set(
+ new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_LV.ID, "hatch.input_bus.tier.01", "Input Bus (LV)", 1)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_Bus_MV.set(
+ new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_MV.ID, "hatch.input_bus.tier.02", "Input Bus (MV)", 2)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_Bus_HV.set(
+ new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_HV.ID, "hatch.input_bus.tier.03", "Input Bus (HV)", 3)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_Bus_EV.set(
+ new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_EV.ID, "hatch.input_bus.tier.04", "Input Bus (EV)", 4)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_Bus_IV.set(
+ new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_IV.ID, "hatch.input_bus.tier.05", "Input Bus (IV)", 5)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_Bus_LuV.set(
+ new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_LuV.ID, "hatch.input_bus.tier.06", "Input Bus (LuV)", 6)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_Bus_ZPM.set(
+ new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_ZPM.ID, "hatch.input_bus.tier.07", "Input Bus (ZPM)", 7)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_Bus_UV.set(
+ new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_UV.ID, "hatch.input_bus.tier.08", "Input Bus (UV)", 8)
+ .getStackForm(1L));
+ ItemList.Hatch_Input_Bus_MAX.set(
+ new GT_MetaTileEntity_Hatch_InputBus(INPUT_BUS_UHV.ID, "hatch.input_bus.tier.09", "Input Bus (UHV)", 9)
+ .getStackForm(1L));
+ }
+
+ private static void registerOutputBus() {
+ ItemList.Hatch_Output_Bus_ULV.set(
+ new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_ULV.ID, "hatch.output_bus.tier.00", "Output Bus (ULV)", 0)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_Bus_LV.set(
+ new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_LV.ID, "hatch.output_bus.tier.01", "Output Bus (LV)", 1)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_Bus_MV.set(
+ new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_MV.ID, "hatch.output_bus.tier.02", "Output Bus (MV)", 2)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_Bus_HV.set(
+ new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_HV.ID, "hatch.output_bus.tier.03", "Output Bus (HV)", 3)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_Bus_EV.set(
+ new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_EV.ID, "hatch.output_bus.tier.04", "Output Bus (EV)", 4)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_Bus_IV.set(
+ new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_IV.ID, "hatch.output_bus.tier.05", "Output Bus (IV)", 5)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_Bus_LuV.set(
+ new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_LuV.ID, "hatch.output_bus.tier.06", "Output Bus (LuV)", 6)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_Bus_ZPM.set(
+ new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_ZPM.ID, "hatch.output_bus.tier.07", "Output Bus (ZPM)", 7)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_Bus_UV.set(
+ new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_UV.ID, "hatch.output_bus.tier.08", "Output Bus (UV)", 8)
+ .getStackForm(1L));
+ ItemList.Hatch_Output_Bus_MAX.set(
+ new GT_MetaTileEntity_Hatch_OutputBus(OUTPUT_BUS_UHV.ID, "hatch.output_bus.tier.09", "Output Bus (UHV)", 9)
+ .getStackForm(1L));
+ }
+
+ private static void registerMufflerHatch() {
+ ItemList.Hatch_Muffler_LV.set(
+ new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_LV.ID, "hatch.muffler.tier.01", "Muffler Hatch (LV)", 1)
+ .getStackForm(1L));
+ ItemList.Hatch_Muffler_MV.set(
+ new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_MV.ID, "hatch.muffler.tier.02", "Muffler Hatch (MV)", 2)
+ .getStackForm(1L));
+ ItemList.Hatch_Muffler_HV.set(
+ new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_HV.ID, "hatch.muffler.tier.03", "Muffler Hatch (HV)", 3)
+ .getStackForm(1L));
+ ItemList.Hatch_Muffler_EV.set(
+ new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_EV.ID, "hatch.muffler.tier.04", "Muffler Hatch (EV)", 4)
+ .getStackForm(1L));
+ ItemList.Hatch_Muffler_IV.set(
+ new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_IV.ID, "hatch.muffler.tier.05", "Muffler Hatch (IV)", 5)
+ .getStackForm(1L));
+ ItemList.Hatch_Muffler_LuV.set(
+ new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_LuV.ID, "hatch.muffler.tier.06", "Muffler Hatch (LuV)", 6)
+ .getStackForm(1L));
+ ItemList.Hatch_Muffler_ZPM.set(
+ new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_ZPM.ID, "hatch.muffler.tier.07", "Muffler Hatch (ZPM)", 7)
+ .getStackForm(1L));
+ ItemList.Hatch_Muffler_UV.set(
+ new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_UV.ID, "hatch.muffler.tier.08", "Muffler Hatch (UV)", 8)
+ .getStackForm(1L));
+ ItemList.Hatch_Muffler_MAX.set(
+ new GT_MetaTileEntity_Hatch_Muffler(MUFFLER_HATCH_UHV.ID, "hatch.muffler.tier.09", "Muffler Hatch (UHV)", 9)
+ .getStackForm(1L));
+ }
+
+ private static void registerBoiler() {
+ ItemList.Machine_Bronze_Boiler.set(
+ new GT_MetaTileEntity_Boiler_Bronze(SMALL_COAL_BOILER.ID, "boiler.bronze", "Small Coal Boiler")
+ .getStackForm(1L));
+ ItemList.Machine_Steel_Boiler.set(
+ new GT_MetaTileEntity_Boiler_Steel(
+ HIGH_PRESSURE_COAL_BOILER.ID,
+ "boiler.steel",
+ "High Pressure Coal Boiler").getStackForm(1L));
+ ItemList.Machine_Steel_Boiler_Lava.set(
+ new GT_MetaTileEntity_Boiler_Lava(HIGH_PRESSURE_LAVA_BOILER.ID, "boiler.lava", "High Pressure Lava Boiler")
+ .getStackForm(1L));
+ ItemList.Machine_Bronze_Boiler_Solar.set(
+ new GT_MetaTileEntity_Boiler_Solar(SIMPLE_SOLAR_BOILER.ID, "boiler.solar", "Simple Solar Boiler")
+ .getStackForm(1L));
+ ItemList.Machine_HP_Solar.set(
+ new GT_MetaTileEntity_Boiler_Solar_Steel(
+ HIGH_PRESSURE_SOLAR_BOILER.ID,
+ "boiler.steel.solar",
+ "High Pressure Solar Boiler").getStackForm(1L));
+ }
+
+ private static void registerBatteryBuffer1x1() {
+ ItemList.Battery_Buffer_1by1_ULV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_1_BY_1_ULV.ID,
+ "batterybuffer.01.tier.00",
+ "Ultra Low Voltage Battery Buffer",
+ 0,
+ "",
+ 1).getStackForm(1L));
+ ItemList.Battery_Buffer_1by1_LV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_1_BY_1_LV.ID,
+ "batterybuffer.01.tier.01",
+ "Low Voltage Battery Buffer",
+ 1,
+ "",
+ 1).getStackForm(1L));
+ ItemList.Battery_Buffer_1by1_MV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_1_BY_1_MV.ID,
+ "batterybuffer.01.tier.02",
+ "Medium Voltage Battery Buffer",
+ 2,
+ "",
+ 1).getStackForm(1L));
+ ItemList.Battery_Buffer_1by1_HV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_1_BY_1_HV.ID,
+ "batterybuffer.01.tier.03",
+ "High Voltage Battery Buffer",
+ 3,
+ "",
+ 1).getStackForm(1L));
+ ItemList.Battery_Buffer_1by1_EV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_1_BY_1_EV.ID,
+ "batterybuffer.01.tier.04",
+ "Extreme Voltage Battery Buffer",
+ 4,
+ "",
+ 1).getStackForm(1L));
+ ItemList.Battery_Buffer_1by1_IV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_1_BY_1_IV.ID,
+ "batterybuffer.01.tier.05",
+ "Insane Voltage Battery Buffer",
+ 5,
+ "",
+ 1).getStackForm(1L));
+ ItemList.Battery_Buffer_1by1_LuV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_1_BY_1_LuV.ID,
+ "batterybuffer.01.tier.06",
+ "Ludicrous Voltage Battery Buffer",
+ 6,
+ "",
+ 1).getStackForm(1L));
+ ItemList.Battery_Buffer_1by1_ZPM.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_1_BY_1_ZPM.ID,
+ "batterybuffer.01.tier.07",
+ "ZPM Voltage Battery Buffer",
+ 7,
+ "",
+ 1).getStackForm(1L));
+ ItemList.Battery_Buffer_1by1_UV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_1_BY_1_UV.ID,
+ "batterybuffer.01.tier.08",
+ "Ultimate Voltage Battery Buffer",
+ 8,
+ "",
+ 1).getStackForm(1L));
+ ItemList.Battery_Buffer_1by1_MAX.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_1_BY_1_UHV.ID,
+ "batterybuffer.01.tier.09",
+ "Highly Ultimate Voltage Battery Buffer",
+ 9,
+ "",
+ 1).getStackForm(1L));
+ }
+
+ private static void registerBatteryBuffer2x2() {
+ ItemList.Battery_Buffer_2by2_ULV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_2_BY_2_ULV.ID,
+ "batterybuffer.04.tier.00",
+ "Ultra Low Voltage Battery Buffer",
+ 0,
+ "",
+ 4).getStackForm(1L));
+ ItemList.Battery_Buffer_2by2_LV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_2_BY_2_LV.ID,
+ "batterybuffer.04.tier.01",
+ "Low Voltage Battery Buffer",
+ 1,
+ "",
+ 4).getStackForm(1L));
+ ItemList.Battery_Buffer_2by2_MV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_2_BY_2_MV.ID,
+ "batterybuffer.04.tier.02",
+ "Medium Voltage Battery Buffer",
+ 2,
+ "",
+ 4).getStackForm(1L));
+ ItemList.Battery_Buffer_2by2_HV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_2_BY_2_HV.ID,
+ "batterybuffer.04.tier.03",
+ "High Voltage Battery Buffer",
+ 3,
+ "",
+ 4).getStackForm(1L));
+ ItemList.Battery_Buffer_2by2_EV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_2_BY_2_EV.ID,
+ "batterybuffer.04.tier.04",
+ "Extreme Voltage Battery Buffer",
+ 4,
+ "",
+ 4).getStackForm(1L));
+ ItemList.Battery_Buffer_2by2_IV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_2_BY_2_IV.ID,
+ "batterybuffer.04.tier.05",
+ "Insane Voltage Battery Buffer",
+ 5,
+ "",
+ 4).getStackForm(1L));
+ ItemList.Battery_Buffer_2by2_LuV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_2_BY_2_LuV.ID,
+ "batterybuffer.04.tier.06",
+ "Ludicrous Voltage Battery Buffer",
+ 6,
+ "",
+ 4).getStackForm(1L));
+ ItemList.Battery_Buffer_2by2_ZPM.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_2_BY_2_ZPM.ID,
+ "batterybuffer.04.tier.07",
+ "ZPM Voltage Battery Buffer",
+ 7,
+ "",
+ 4).getStackForm(1L));
+ ItemList.Battery_Buffer_2by2_UV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_2_BY_2_UV.ID,
+ "batterybuffer.04.tier.08",
+ "Ultimate Voltage Battery Buffer",
+ 8,
+ "",
+ 4).getStackForm(1L));
+ ItemList.Battery_Buffer_2by2_MAX.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_2_BY_2_UHV.ID,
+ "batterybuffer.04.tier.09",
+ "Highly Ultimate Voltage Battery Buffer",
+ 9,
+ "",
+ 4).getStackForm(1L));
+ }
+
+ private static void registerBatteryBuffer3x3() {
+ ItemList.Battery_Buffer_3by3_ULV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_3_BY_3_ULV.ID,
+ "batterybuffer.09.tier.00",
+ "Ultra Low Voltage Battery Buffer",
+ 0,
+ "",
+ 9).getStackForm(1L));
+ ItemList.Battery_Buffer_3by3_LV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_3_BY_3_LV.ID,
+ "batterybuffer.09.tier.01",
+ "Low Voltage Battery Buffer",
+ 1,
+ "",
+ 9).getStackForm(1L));
+ ItemList.Battery_Buffer_3by3_MV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_3_BY_3_MV.ID,
+ "batterybuffer.09.tier.02",
+ "Medium Voltage Battery Buffer",
+ 2,
+ "",
+ 9).getStackForm(1L));
+ ItemList.Battery_Buffer_3by3_HV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_3_BY_3_HV.ID,
+ "batterybuffer.09.tier.03",
+ "High Voltage Battery Buffer",
+ 3,
+ "",
+ 9).getStackForm(1L));
+ ItemList.Battery_Buffer_3by3_EV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_3_BY_3_EV.ID,
+ "batterybuffer.09.tier.04",
+ "Extreme Voltage Battery Buffer",
+ 4,
+ "",
+ 9).getStackForm(1L));
+ ItemList.Battery_Buffer_3by3_IV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_3_BY_3_IV.ID,
+ "batterybuffer.09.tier.05",
+ "Insane Voltage Battery Buffer",
+ 5,
+ "",
+ 9).getStackForm(1L));
+ ItemList.Battery_Buffer_3by3_LuV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_3_BY_3_LuV.ID,
+ "batterybuffer.09.tier.06",
+ "Ludicrous Voltage Battery Buffer",
+ 6,
+ "",
+ 9).getStackForm(1L));
+ ItemList.Battery_Buffer_3by3_ZPM.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_3_BY_3_ZPM.ID,
+ "batterybuffer.09.tier.07",
+ "ZPM Voltage Battery Buffer",
+ 7,
+ "",
+ 9).getStackForm(1L));
+ ItemList.Battery_Buffer_3by3_UV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_3_BY_3_UV.ID,
+ "batterybuffer.09.tier.08",
+ "Ultimate Voltage Battery Buffer",
+ 8,
+ "",
+ 9).getStackForm(1L));
+ ItemList.Battery_Buffer_3by3_MAX.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_3_BY_3_UHV.ID,
+ "batterybuffer.09.tier.09",
+ "Highly Ultimate Voltage Battery Buffer",
+ 9,
+ "",
+ 9).getStackForm(1L));
+ }
+
+ private static void registerBatteryBuffer4x4() {
+ ItemList.Battery_Buffer_4by4_ULV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_4_BY_4_ULV.ID,
+ "batterybuffer.16.tier.00",
+ "Ultra Low Voltage Battery Buffer",
+ 0,
+ "",
+ 16).getStackForm(1L));
+ ItemList.Battery_Buffer_4by4_LV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_4_BY_4_LV.ID,
+ "batterybuffer.16.tier.01",
+ "Low Voltage Battery Buffer",
+ 1,
+ "",
+ 16).getStackForm(1L));
+ ItemList.Battery_Buffer_4by4_MV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_4_BY_4_MV.ID,
+ "batterybuffer.16.tier.02",
+ "Medium Voltage Battery Buffer",
+ 2,
+ "",
+ 16).getStackForm(1L));
+ ItemList.Battery_Buffer_4by4_HV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_4_BY_4_HV.ID,
+ "batterybuffer.16.tier.03",
+ "High Voltage Battery Buffer",
+ 3,
+ "",
+ 16).getStackForm(1L));
+ ItemList.Battery_Buffer_4by4_EV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_4_BY_4_EV.ID,
+ "batterybuffer.16.tier.04",
+ "Extreme Voltage Battery Buffer",
+ 4,
+ "",
+ 16).getStackForm(1L));
+ ItemList.Battery_Buffer_4by4_IV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_4_BY_4_IV.ID,
+ "batterybuffer.16.tier.05",
+ "Insane Voltage Battery Buffer",
+ 5,
+ "",
+ 16).getStackForm(1L));
+ ItemList.Battery_Buffer_4by4_LuV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_4_BY_4_LuV.ID,
+ "batterybuffer.16.tier.06",
+ "Ludicrous Voltage Battery Buffer",
+ 6,
+ "",
+ 16).getStackForm(1L));
+ ItemList.Battery_Buffer_4by4_ZPM.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_4_BY_4_ZPM.ID,
+ "batterybuffer.16.tier.07",
+ "ZPM Voltage Battery Buffer",
+ 7,
+ "",
+ 16).getStackForm(1L));
+ ItemList.Battery_Buffer_4by4_UV.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_4_BY_4_UV.ID,
+ "batterybuffer.16.tier.08",
+ "Ultimate Voltage Battery Buffer",
+ 8,
+ "",
+ 16).getStackForm(1L));
+ ItemList.Battery_Buffer_4by4_MAX.set(
+ new GT_MetaTileEntity_BasicBatteryBuffer(
+ BATTERY_BUFFER_4_BY_4_UHV.ID,
+ "batterybuffer.16.tier.09",
+ "Highly Ultimate Voltage Battery Buffer",
+ 9,
+ "",
+ 16).getStackForm(1L));
+ }
+
+ private static void registerCharger4x4() {
+ ItemList.Battery_Charger_4by4_ULV.set(
+ new GT_MetaTileEntity_Charger(
+ BATTERY_CHARGER_4_BY_4_ULV.ID,
+ "batterycharger.16.tier.00",
+ "Ultra Low Voltage Battery Charger",
+ 0,
+ "Each battery gives 8A in/4A out (min 4A/2A)",
+ 4).getStackForm(1L));
+ ItemList.Battery_Charger_4by4_LV.set(
+ new GT_MetaTileEntity_Charger(
+ BATTERY_CHARGER_4_BY_4_LV.ID,
+ "batterycharger.16.tier.01",
+ "Low Voltage Battery Charger",
+ 1,
+ "Each battery gives 8A in/4A out (min 4A/2A)",
+ 4).getStackForm(1L));
+ ItemList.Battery_Charger_4by4_MV.set(
+ new GT_MetaTileEntity_Charger(
+ BATTERY_CHARGER_4_BY_4_MV.ID,
+ "batterycharger.16.tier.02",
+ "Medium Voltage Battery Charger",
+ 2,
+ "Each battery gives 8A in/4A out (min 4A/2A)",
+ 4).getStackForm(1L));
+ ItemList.Battery_Charger_4by4_HV.set(
+ new GT_MetaTileEntity_Charger(
+ BATTERY_CHARGER_4_BY_4_HV.ID,
+ "batterycharger.16.tier.03",
+ "High Voltage Battery Charger",
+ 3,
+ "Each battery gives 8A in/4A out (min 4A/2A)",
+ 4).getStackForm(1L));
+ ItemList.Battery_Charger_4by4_EV.set(
+ new GT_MetaTileEntity_Charger(
+ BATTERY_CHARGER_4_BY_4_EV.ID,
+ "batterycharger.16.tier.04",
+ "Extreme Voltage Battery Charger",
+ 4,
+ "Each battery gives 8A in/4A out (min 4A/2A)",
+ 4).getStackForm(1L));
+ ItemList.Battery_Charger_4by4_IV.set(
+ new GT_MetaTileEntity_Charger(
+ BATTERY_CHARGER_4_BY_4_IV.ID,
+ "batterycharger.16.tier.05",
+ "Insane Voltage Battery Charger",
+ 5,
+ "Each battery gives 8A in/4A out (min 4A/2A)",
+ 4).getStackForm(1L));
+ ItemList.Battery_Charger_4by4_LuV.set(
+ new GT_MetaTileEntity_Charger(
+ BATTERY_CHARGER_4_BY_4_LuV.ID,
+ "batterycharger.16.tier.06",
+ "Ludicrous Voltage Battery Charger",
+ 6,
+ "Each battery gives 8A in/4A out (min 4A/2A)",
+ 4).getStackForm(1L));
+ ItemList.Battery_Charger_4by4_ZPM.set(
+ new GT_MetaTileEntity_Charger(
+ BATTERY_CHARGER_4_BY_4_ZPM.ID,
+ "batterycharger.16.tier.07",
+ "ZPM Voltage Battery Charger",
+ 7,
+ "Each battery gives 8A in/4A out (min 4A/2A)",
+ 4).getStackForm(1L));
+ ItemList.Battery_Charger_4by4_UV.set(
+ new GT_MetaTileEntity_Charger(
+ BATTERY_CHARGER_4_BY_4_UV.ID,
+ "batterycharger.16.tier.08",
+ "Ultimate Voltage Battery Charger",
+ 8,
+ "Each battery gives 8A in/4A out (min 4A/2A)",
+ 4).getStackForm(1L));
+ ItemList.Battery_Charger_4by4_MAX.set(
+ new GT_MetaTileEntity_Charger(
+ BATTERY_CHARGER_4_BY_4_UHV.ID,
+ "batterycharger.16.tier.09",
+ "Highly Ultimate Voltage Battery Charger",
+ 9,
+ "Each battery gives 8A in/4A out (min 4A/2A)",
+ 4).getStackForm(1L));
+ }
+
+ private static void registerWirelessEnergyHatch() {
+ ItemList.Wireless_Hatch_Energy_ULV.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_ULV.ID,
+ "hatch.wireless.receiver.tier.00",
+ "ULV Wireless Energy Hatch",
+ 0).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_LV.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_LV.ID,
+ "hatch.wireless.receiver.tier.01",
+ "LV Wireless Energy Hatch",
+ 1).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_MV.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_MV.ID,
+ "hatch.wireless.receiver.tier.02",
+ "MV Wireless Energy Hatch",
+ 2).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_HV.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_HV.ID,
+ "hatch.wireless.receiver.tier.03",
+ "HV Wireless Energy Hatch",
+ 3).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_EV.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_EV.ID,
+ "hatch.wireless.receiver.tier.04",
+ "EV Wireless Energy Hatch",
+ 4).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_IV.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_IV.ID,
+ "hatch.wireless.receiver.tier.05",
+ "IV Wireless Energy Hatch",
+ 5).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_LuV.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_LuV.ID,
+ "hatch.wireless.receiver.tier.06",
+ "LuV Wireless Energy Hatch",
+ 6).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_ZPM.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_ZPM.ID,
+ "hatch.wireless.receiver.tier.07",
+ "ZPM Wireless Energy Hatch",
+ 7).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_UV.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_UV.ID,
+ "hatch.wireless.receiver.tier.08",
+ "UV Wireless Energy Hatch",
+ 8).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_UHV.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_UHV.ID,
+ "hatch.wireless.receiver.tier.09",
+ "UHV Wireless Energy Hatch",
+ 9).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_UEV.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_UEV.ID,
+ "hatch.wireless.receiver.tier.10",
+ "UEV Wireless Energy Hatch",
+ 10).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_UIV.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_UIV.ID,
+ "hatch.wireless.receiver.tier.11",
+ "UIV Wireless Energy Hatch",
+ 11).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_UMV.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_UMV.ID,
+ "hatch.wireless.receiver.tier.12",
+ "UMV Wireless Energy Hatch",
+ 12).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_UXV.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_UXV.ID,
+ "hatch.wireless.receiver.tier.13",
+ "UXV Wireless Energy Hatch",
+ 13).getStackForm(1L));
+ ItemList.Wireless_Hatch_Energy_MAX.set(
+ new GT_MetaTileEntity_Wireless_Hatch(
+ WIRELESS_HATCH_ENERGY_MAX.ID,
+ "hatch.wireless.receiver.tier.14",
+ "MAX Wireless Energy Hatch",
+ 14).getStackForm(1L));
+ }
+
+ private static void registerWirelessDynamoHatch() {
+ ItemList.Wireless_Dynamo_Energy_ULV.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_ULV.ID,
+ "hatch.wireless.transmitter.tier.00",
+ "ULV Wireless Energy Dynamo",
+ 0).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_LV.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_LV.ID,
+ "hatch.wireless.transmitter.tier.01",
+ "LV Wireless Energy Dynamo",
+ 1).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_MV.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_MV.ID,
+ "hatch.wireless.transmitter.tier.02",
+ "MV Wireless Energy Dynamo",
+ 2).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_HV.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_HV.ID,
+ "hatch.wireless.transmitter.tier.03",
+ "HV Wireless Energy Dynamo",
+ 3).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_EV.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_EV.ID,
+ "hatch.wireless.transmitter.tier.04",
+ "EV Wireless Energy Dynamo",
+ 4).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_IV.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_IV.ID,
+ "hatch.wireless.transmitter.tier.05",
+ "IV Wireless Energy Dynamo",
+ 5).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_LuV.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_LuV.ID,
+ "hatch.wireless.transmitter.tier.06",
+ "LuV Wireless Energy Dynamo",
+ 6).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_ZPM.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_ZPM.ID,
+ "hatch.wireless.transmitter.tier.07",
+ "ZPM Wireless Energy Dynamo",
+ 7).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_UV.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_UV.ID,
+ "hatch.wireless.transmitter.tier.08",
+ "UV Wireless Energy Dynamo",
+ 8).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_UHV.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_UHV.ID,
+ "hatch.wireless.transmitter.tier.09",
+ "UHV Wireless Energy Dynamo",
+ 9).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_UEV.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_UEV.ID,
+ "hatch.wireless.transmitter.tier.10",
+ "UEV Wireless Energy Dynamo",
+ 10).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_UIV.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_UIV.ID,
+ "hatch.wireless.transmitter.tier.11",
+ "UIV Wireless Energy Dynamo",
+ 11).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_UMV.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_UMV.ID,
+ "hatch.wireless.transmitter.tier.12",
+ "UMV Wireless Energy Dynamo",
+ 12).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_UXV.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_UXV.ID,
+ "hatch.wireless.transmitter.tier.13",
+ "UXV Wireless Energy Dynamo",
+ 13).getStackForm(1L));
+ ItemList.Wireless_Dynamo_Energy_MAX.set(
+ new GT_MetaTileEntity_Wireless_Dynamo(
+ WIRELESS_DYNAMO_ENERGY_HATCH_MAX.ID,
+ "hatch.wireless.transmitter.tier.14",
+ "MAX Wireless Energy Dynamo",
+ 14).getStackForm(1L));
+ }
+
+ private static void registerLightningRods() {
+ ItemList.Machine_HV_LightningRod.set(
+ new GT_MetaTileEntity_LightningRod(
+ LIGHTNING_ROD_HV.ID,
+ "basicgenerator.lightningrod.03",
+ "Lightning Rod",
+ 3).getStackForm(1));
+ ItemList.Machine_EV_LightningRod.set(
+ new GT_MetaTileEntity_LightningRod(
+ LIGHTNING_ROD_EV.ID,
+ "basicgenerator.lightningrod.04",
+ "Lightning Rod II",
+ 4).getStackForm(1));
+ ItemList.Machine_IV_LightningRod.set(
+ new GT_MetaTileEntity_LightningRod(
+ LIGHTNING_ROD_IV.ID,
+ "basicgenerator.lightningrod.05",
+ "Lightning Rod III",
+ 5).getStackForm(1));
+ }
+
+ private static void registerCombustionGenerators() {
+ ItemList.Generator_Diesel_LV.set(
+ new GT_MetaTileEntity_DieselGenerator(
+ COMBUSTION_GENERATOR_LV.ID,
+ "basicgenerator.diesel.tier.01",
+ "Basic Combustion Generator",
+ 1).getStackForm(1L));
+ ItemList.Generator_Diesel_MV.set(
+ new GT_MetaTileEntity_DieselGenerator(
+ COMBUSTION_GENERATOR_MV.ID,
+ "basicgenerator.diesel.tier.02",
+ "Advanced Combustion Generator",
+ 2).getStackForm(1L));
+ ItemList.Generator_Diesel_HV.set(
+ new GT_MetaTileEntity_DieselGenerator(
+ COMBUSTION_GENERATOR_HV.ID,
+ "basicgenerator.diesel.tier.03",
+ "Turbo Combustion Generator",
+ 3).getStackForm(1L));
+ }
+
+ private static void registerGasTurbines() {
+ ItemList.Generator_Gas_Turbine_LV.set(
+ new GT_MetaTileEntity_GasTurbine(
+ GAS_TURBINE_LV.ID,
+ "basicgenerator.gasturbine.tier.01",
+ "Basic Gas Turbine",
+ 1,
+ 95).getStackForm(1L));
+ ItemList.Generator_Gas_Turbine_MV.set(
+ new GT_MetaTileEntity_GasTurbine(
+ GAS_TURBINE_MV.ID,
+ "basicgenerator.gasturbine.tier.02",
+ "Advanced Gas Turbine",
+ 2,
+ 90).getStackForm(1L));
+ ItemList.Generator_Gas_Turbine_HV.set(
+ new GT_MetaTileEntity_GasTurbine(
+ GAS_TURBINE_HV.ID,
+ "basicgenerator.gasturbine.tier.03",
+ "Turbo Gas Turbine",
+ 3,
+ 85).getStackForm(1L));
+ ItemList.Generator_Gas_Turbine_EV.set(
+ new GT_MetaTileEntity_GasTurbine(
+ GAS_TURBINE_EV.ID,
+ "basicgenerator.gasturbine.tier.04",
+ "Turbo Gas Turbine II",
+ 4,
+ 60).getStackForm(1L));
+ ItemList.Generator_Gas_Turbine_IV.set(
+ new GT_MetaTileEntity_GasTurbine(
+ GAS_TURBINE_IV.ID,
+ "basicgenerator.gasturbine.tier.05",
+ "Turbo Gas Turbine III",
+ 5,
+ 50).getStackForm(1L));
+ }
+
+ private static void registerSteamTurbines() {
+ ItemList.Generator_Steam_Turbine_LV.set(
+ new GT_MetaTileEntity_SteamTurbine(
+ STEAM_TURBINE_LV.ID,
+ "basicgenerator.steamturbine.tier.01",
+ "Basic Steam Turbine",
+ 1).getStackForm(1L));
+ ItemList.Generator_Steam_Turbine_MV.set(
+ new GT_MetaTileEntity_SteamTurbine(
+ STEAM_TURBINE_MV.ID,
+ "basicgenerator.steamturbine.tier.02",
+ "Advanced Steam Turbine",
+ 2).getStackForm(1L));
+ ItemList.Generator_Steam_Turbine_HV.set(
+ new GT_MetaTileEntity_SteamTurbine(
+ STEAM_TURBINE_HV.ID,
+ "basicgenerator.steamturbine.tier.03",
+ "Turbo Steam Turbine",
+ 3).getStackForm(1L));
+ }
+
+ private static void registerNaquadahReactors() {
+ ItemList.Generator_Naquadah_Mark_I.set(
+ new GT_MetaTileEntity_NaquadahReactor(
+ NAQUADAH_REACTOR_EV.ID,
+ "basicgenerator.naquadah.tier.04",
+ new String[] { "Requires Enriched Naquadah Bolts" },
+ "Naquadah Reactor Mark I",
+ 4).getStackForm(1L));
+ ItemList.Generator_Naquadah_Mark_II.set(
+ new GT_MetaTileEntity_NaquadahReactor(
+ NAQUADAH_REACTOR_IV.ID,
+ "basicgenerator.naquadah.tier.05",
+ new String[] { "Requires Enriched Naquadah Rods" },
+ "Naquadah Reactor Mark II",
+ 5).getStackForm(1L));
+ ItemList.Generator_Naquadah_Mark_III.set(
+ new GT_MetaTileEntity_NaquadahReactor(
+ NAQUADAH_REACTOR_LuV.ID,
+ "basicgenerator.naquadah.tier.06",
+ new String[] { "Requires Enriched Naquadah Long Rods" },
+ "Naquadah Reactor Mark III",
+ 6).getStackForm(1L));
+ ItemList.Generator_Naquadah_Mark_IV.set(
+ new GT_MetaTileEntity_NaquadahReactor(
+ NAQUADAH_REACTOR_ZPM.ID,
+ "basicgenerator.naquadah.tier.07",
+ new String[] { "Requires Naquadria Bolts" },
+ "Naquadah Reactor Mark IV",
+ 7).getStackForm(1L));
+ ItemList.Generator_Naquadah_Mark_V.set(
+ new GT_MetaTileEntity_NaquadahReactor(
+ NAQUADAH_REACTOR_UV.ID,
+ "basicgenerator.naquadah.tier.08",
+ new String[] { "Requires Naquadria Rods" },
+ "Naquadah Reactor Mark V",
+ 8).getStackForm(1L));
+ }
+
+ private static void registerMagicEnergyConverters() {
+ ItemList.MagicEnergyConverter_LV.set(
+ new GT_MetaTileEntity_MagicEnergyConverter(
+ MAGIC_ENERGY_CONVERTER_LV.ID,
+ "basicgenerator.magicenergyconverter.tier.01",
+ "Novice Magic Energy Converter",
+ 1).getStackForm(1L));
+ ItemList.MagicEnergyConverter_MV.set(
+ new GT_MetaTileEntity_MagicEnergyConverter(
+ MAGIC_ENERGY_CONVERTER_MV.ID,
+ "basicgenerator.magicenergyconverter.tier.02",
+ "Adept Magic Energy Converter",
+ 2).getStackForm(1L));
+ ItemList.MagicEnergyConverter_HV.set(
+ new GT_MetaTileEntity_MagicEnergyConverter(
+ MAGIC_ENERGY_CONVERTER_HV.ID,
+ "basicgenerator.magicenergyconverter.tier.03",
+ "Master Magic Energy Converter",
+ 3).getStackForm(1L));
+ }
+
+ private static void registerMagicEnergyAbsorbers() {
+ ItemList.MagicEnergyAbsorber_LV.set(
+ new GT_MetaTileEntity_MagicalEnergyAbsorber(
+ MAGIC_ENERGY_ABSORBER_LV.ID,
+ "basicgenerator.magicenergyabsorber.tier.01",
+ "Novice Magic Energy Absorber",
+ 1).getStackForm(1L));
+ ItemList.MagicEnergyAbsorber_MV.set(
+ new GT_MetaTileEntity_MagicalEnergyAbsorber(
+ MAGIC_ENERGY_ABSORBER_MV.ID,
+ "basicgenerator.magicenergyabsorber.tier.02",
+ "Adept Magic Energy Absorber",
+ 2).getStackForm(1L));
+ ItemList.MagicEnergyAbsorber_HV.set(
+ new GT_MetaTileEntity_MagicalEnergyAbsorber(
+ MAGIC_ENERGY_ABSORBER_HV.ID,
+ "basicgenerator.magicenergyabsorber.tier.03",
+ "Master Magic Energy Absorber",
+ 3).getStackForm(1L));
+ ItemList.MagicEnergyAbsorber_EV.set(
+ new GT_MetaTileEntity_MagicalEnergyAbsorber(
+ MAGIC_ENERGY_ABSORBER_EV.ID,
+ "basicgenerator.magicenergyabsorber.tier.04",
+ "Grandmaster Magic Energy Absorber",
+ 4).getStackForm(1L));
+ }
+
+ private static void registerPlasmaGenerators() {
+ ItemList.Generator_Plasma_IV.set(
+ new GT_MetaTileEntity_PlasmaGenerator(
+ PLASMA_GENERATOR_IV.ID,
+ "basicgenerator.plasmagenerator.tier.05",
+ "Plasma Generator Mark I",
+ 4).getStackForm(1L));
+ ItemList.Generator_Plasma_LuV.set(
+ new GT_MetaTileEntity_PlasmaGenerator(
+ PLASMA_GENERATOR_LuV.ID,
+ "basicgenerator.plasmagenerator.tier.06",
+ "Plasma Generator Mark II",
+ 5).getStackForm(1L));
+ ItemList.Generator_Plasma_ZPMV.set(
+ new GT_MetaTileEntity_PlasmaGenerator(
+ PLASMA_GENERATOR_ZPM.ID,
+ "basicgenerator.plasmagenerator.tier.07",
+ "Plasma Generator Mark III",
+ 6).getStackForm(1L));
+ }
+
+ private static void generateWiresAndPipes() {
+ for (int i = 0; i < GregTech_API.sGeneratedMaterials.length; i++) {
+ if (((GregTech_API.sGeneratedMaterials[i] != null)
+ && ((GregTech_API.sGeneratedMaterials[i].mTypes & 0x2) != 0))
+ || (GregTech_API.sGeneratedMaterials[i] == Materials.Wood)) {
+ new GT_MetaPipeEntity_Frame(
+ 4096 + i,
+ "GT_Frame_" + GregTech_API.sGeneratedMaterials[i],
+ (GT_LanguageManager.i18nPlaceholder ? "%material"
+ : GregTech_API.sGeneratedMaterials[i] != null
+ ? GregTech_API.sGeneratedMaterials[i].mDefaultLocalName
+ : "")
+ + " Frame Box",
+ GregTech_API.sGeneratedMaterials[i]);
+ }
+ }
+ boolean bEC = !GT_Mod.gregtechproxy.mHardcoreCables;
+
+ makeWires(Materials.RedAlloy, 2000, 0L, 1L, 1L, gregtech.api.enums.GT_Values.V[0], true, false);
+
+ makeWires(Materials.Cobalt, 1200, 2L, 4L, 2L, gregtech.api.enums.GT_Values.V[1], true, false);
+ makeWires(Materials.Lead, 1220, 2L, 4L, 2L, gregtech.api.enums.GT_Values.V[1], true, false);
+ makeWires(Materials.Tin, 1240, 1L, 2L, 1L, gregtech.api.enums.GT_Values.V[1], true, false);
+
+ makeWires(Materials.Zinc, 1260, 1L, 2L, 1L, gregtech.api.enums.GT_Values.V[1], true, false);
+ makeWires(Materials.SolderingAlloy, 1280, 1L, 2L, 1L, gregtech.api.enums.GT_Values.V[1], true, false);
+
+ makeWires(
+ Materials.Iron,
+ 1300,
+ bEC ? 3L : 4L,
+ bEC ? 6L : 8L,
+ 2L,
+ gregtech.api.enums.GT_Values.V[2],
+ true,
+ false);
+ makeWires(
+ Materials.Nickel,
+ 1320,
+ bEC ? 3L : 5L,
+ bEC ? 6L : 10L,
+ 3L,
+ gregtech.api.enums.GT_Values.V[2],
+ true,
+ false);
+ makeWires(
+ Materials.Cupronickel,
+ 1340,
+ bEC ? 3L : 4L,
+ bEC ? 6L : 8L,
+ 2L,
+ gregtech.api.enums.GT_Values.V[2],
+ true,
+ false);
+ makeWires(
+ Materials.Copper,
+ 1360,
+ bEC ? 2L : 3L,
+ bEC ? 4L : 6L,
+ 1L,
+ gregtech.api.enums.GT_Values.V[2],
+ true,
+ false);
+ makeWires(
+ Materials.AnnealedCopper,
+ 1380,
+ bEC ? 1L : 2L,
+ bEC ? 2L : 4L,
+ 1L,
+ gregtech.api.enums.GT_Values.V[2],
+ true,
+ false);
+
+ makeWires(
+ Materials.Kanthal,
+ 1400,
+ bEC ? 3L : 8L,
+ bEC ? 6L : 16L,
+ 4L,
+ gregtech.api.enums.GT_Values.V[3],
+ true,
+ false);
+ makeWires(
+ Materials.Gold,
+ 1420,
+ bEC ? 2L : 6L,
+ bEC ? 4L : 12L,
+ 3L,
+ gregtech.api.enums.GT_Values.V[3],
+ true,
+ false);
+ makeWires(
+ Materials.Electrum,
+ 1440,
+ bEC ? 2L : 5L,
+ bEC ? 4L : 10L,
+ 2L,
+ gregtech.api.enums.GT_Values.V[3],
+ true,
+ false);
+ makeWires(
+ Materials.Silver,
+ 1460,
+ bEC ? 1L : 4L,
+ bEC ? 2L : 8L,
+ 1L,
+ gregtech.api.enums.GT_Values.V[3],
+ true,
+ false);
+ makeWires(
+ Materials.BlueAlloy,
+ 1480,
+ bEC ? 1L : 4L,
+ bEC ? 2L : 8L,
+ 2L,
+ gregtech.api.enums.GT_Values.V[3],
+ true,
+ false);
+
+ makeWires(
+ Materials.Nichrome,
+ 1500,
+ bEC ? 4L : 32L,
+ bEC ? 8L : 64L,
+ 3L,
+ gregtech.api.enums.GT_Values.V[4],
+ true,
+ false);
+ makeWires(
+ Materials.Steel,
+ 1520,
+ bEC ? 2L : 16L,
+ bEC ? 4L : 32L,
+ 2L,
+ gregtech.api.enums.GT_Values.V[4],
+ true,
+ false);
+ makeWires(
+ Materials.BlackSteel,
+ 1540,
+ bEC ? 2L : 14L,
+ bEC ? 4L : 28L,
+ 3L,
+ gregtech.api.enums.GT_Values.V[4],
+ true,
+ false);
+ makeWires(
+ Materials.Titanium,
+ 1560,
+ bEC ? 2L : 12L,
+ bEC ? 4L : 24L,
+ 4L,
+ gregtech.api.enums.GT_Values.V[4],
+ true,
+ false);
+ makeWires(
+ Materials.Aluminium,
+ 1580,
+ bEC ? 1L : 8L,
+ bEC ? 2L : 16L,
+ 1L,
+ gregtech.api.enums.GT_Values.V[4],
+ true,
+ false);
+
+ makeWires(
+ Materials.Graphene,
+ 1600,
+ bEC ? 1L : 16L,
+ bEC ? 2L : 32L,
+ 1L,
+ gregtech.api.enums.GT_Values.V[5],
+ false,
+ true);
+ makeWires(
+ Materials.Osmium,
+ 1620,
+ bEC ? 2L : 32L,
+ bEC ? 4L : 64L,
+ 4L,
+ gregtech.api.enums.GT_Values.V[5],
+ true,
+ false);
+ makeWires(
+ Materials.Platinum,
+ 1640,
+ bEC ? 1L : 16L,
+ bEC ? 2L : 32L,
+ 2L,
+ gregtech.api.enums.GT_Values.V[5],
+ true,
+ false);
+ makeWires(
+ Materials.TungstenSteel,
+ 1660,
+ bEC ? 2L : 14L,
+ bEC ? 4L : 28L,
+ 3L,
+ gregtech.api.enums.GT_Values.V[5],
+ true,
+ false);
+ makeWires(
+ Materials.Tungsten,
+ 1680,
+ bEC ? 2L : 12L,
+ bEC ? 4L : 24L,
+ 2L,
+ gregtech.api.enums.GT_Values.V[5],
+ true,
+ false);
+
+ makeWires(
+ Materials.HSSG,
+ 1700,
+ bEC ? 2L : 128L,
+ bEC ? 4L : 256L,
+ 4L,
+ gregtech.api.enums.GT_Values.V[6],
+ true,
+ false);
+ makeWires(
+ Materials.NiobiumTitanium,
+ 1720,
+ bEC ? 2L : 128L,
+ bEC ? 4L : 256L,
+ 4L,
+ gregtech.api.enums.GT_Values.V[6],
+ true,
+ false);
+ makeWires(
+ Materials.VanadiumGallium,
+ 1740,
+ bEC ? 2L : 128L,
+ bEC ? 4L : 256L,
+ 4L,
+ gregtech.api.enums.GT_Values.V[6],
+ true,
+ false);
+ makeWires(
+ Materials.YttriumBariumCuprate,
+ 1760,
+ bEC ? 4L : 256L,
+ bEC ? 8L : 512L,
+ 4L,
+ gregtech.api.enums.GT_Values.V[6],
+ true,
+ false);
+
+ makeWires(
+ Materials.Naquadah,
+ 1780,
+ bEC ? 2L : 64L,
+ bEC ? 4L : 128L,
+ 2L,
+ gregtech.api.enums.GT_Values.V[7],
+ true,
+ false);
+
+ makeWires(
+ Materials.NaquadahAlloy,
+ 1800,
+ bEC ? 4L : 64L,
+ bEC ? 8L : 128L,
+ 2L,
+ gregtech.api.enums.GT_Values.V[8],
+ true,
+ false);
+ makeWires(
+ Materials.Duranium,
+ 1820,
+ bEC ? 8L : 64L,
+ bEC ? 16L : 128L,
+ 1L,
+ gregtech.api.enums.GT_Values.V[8],
+ true,
+ false);
+ makeWires(
+ Materials.TPV,
+ 1840,
+ bEC ? 1L : 14L,
+ bEC ? 2L : 28L,
+ 6L,
+ gregtech.api.enums.GT_Values.V[4],
+ true,
+ false);
+
+ // Superconductor base.
+ makeWires(
+ Materials.Pentacadmiummagnesiumhexaoxid,
+ 2200,
+ 1L,
+ 2L,
+ 1L,
+ gregtech.api.enums.GT_Values.V[2],
+ false,
+ false);
+ makeWires(
+ Materials.Titaniumonabariumdecacoppereikosaoxid,
+ 2220,
+ 1L,
+ 8L,
+ 2L,
+ gregtech.api.enums.GT_Values.V[3],
+ false,
+ false);
+ makeWires(Materials.Uraniumtriplatinid, 2240, 1L, 16L, 3L, gregtech.api.enums.GT_Values.V[4], false, false);
+ makeWires(Materials.Vanadiumtriindinid, 2260, 1L, 64L, 4L, gregtech.api.enums.GT_Values.V[5], false, false);
+ makeWires(
+ Materials.Tetraindiumditindibariumtitaniumheptacoppertetrakaidekaoxid,
+ 2280,
+ 2L,
+ 256L,
+ 6L,
+ gregtech.api.enums.GT_Values.V[6],
+ false,
+ false);
+ makeWires(
+ Materials.Tetranaquadahdiindiumhexaplatiumosminid,
+ 2300,
+ 2L,
+ 1024L,
+ 8L,
+ gregtech.api.enums.GT_Values.V[7],
+ false,
+ false);
+ makeWires(
+ Materials.Longasssuperconductornameforuvwire,
+ 2500,
+ 2L,
+ 4096L,
+ 12L,
+ gregtech.api.enums.GT_Values.V[8],
+ false,
+ false);
+ makeWires(
+ Materials.Longasssuperconductornameforuhvwire,
+ 2520,
+ 2L,
+ 16384L,
+ 16L,
+ gregtech.api.enums.GT_Values.V[9],
+ false,
+ false);
+ makeWires(
+ Materials.SuperconductorUEVBase,
+ 2032,
+ 2L,
+ 65536L,
+ 24L,
+ gregtech.api.enums.GT_Values.V[10],
+ false,
+ false);
+ makeWires(
+ Materials.SuperconductorUIVBase,
+ 2052,
+ 2L,
+ 262144L,
+ 32L,
+ gregtech.api.enums.GT_Values.V[11],
+ false,
+ false);
+ makeWires(Materials.SuperconductorUMVBase, 2072, 2L, 1048576L, 32L, GT_Values.V[12], false, false);
+
+ // Actual superconductors.
+ makeWires(Materials.SuperconductorMV, 2320, 0L, 0L, 4L, gregtech.api.enums.GT_Values.V[2], false, true);
+ makeWires(Materials.SuperconductorHV, 2340, 0L, 0L, 6L, gregtech.api.enums.GT_Values.V[3], false, true);
+ makeWires(Materials.SuperconductorEV, 2360, 0L, 0L, 8L, gregtech.api.enums.GT_Values.V[4], false, true);
+ makeWires(Materials.SuperconductorIV, 2380, 0L, 0L, 12L, gregtech.api.enums.GT_Values.V[5], false, true);
+ makeWires(Materials.SuperconductorLuV, 2400, 0L, 0L, 16L, gregtech.api.enums.GT_Values.V[6], false, true);
+ makeWires(Materials.SuperconductorZPM, 2420, 0L, 0L, 24L, gregtech.api.enums.GT_Values.V[7], false, true);
+ makeWires(Materials.SuperconductorUV, 2440, 0L, 0L, 32L, gregtech.api.enums.GT_Values.V[8], false, true);
+ makeWires(Materials.SuperconductorUHV, 2020, 0L, 0L, 48L, gregtech.api.enums.GT_Values.V[9], false, true);
+ makeWires(Materials.SuperconductorUEV, 2026, 0L, 0L, 64L, gregtech.api.enums.GT_Values.V[10], false, true);
+ makeWires(Materials.SuperconductorUIV, 2081, 0L, 0L, 64L, gregtech.api.enums.GT_Values.V[11], false, true);
+ makeWires(Materials.SuperconductorUMV, 2089, 0L, 0L, 64L, gregtech.api.enums.GT_Values.V[12], false, true);
+
+ makeWires(Materials.Ichorium, 2600, 2L, 2L, 12L, GT_Values.V[9], false, true);
+ makeWires(MaterialsUEVplus.SpaceTime, 2606, 0L, 0L, 1_000_000L, GT_Values.V[14], false, true);
+
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeSmall.get(Materials.Wood),
+ new GT_MetaPipeEntity_Fluid(
+ 5101,
+ "GT_Pipe_Wood_Small",
+ "Small Wooden Fluid Pipe",
+ 0.375F,
+ Materials.Wood,
+ 10,
+ 350,
+ false).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeMedium.get(Materials.Wood),
+ new GT_MetaPipeEntity_Fluid(5102, "GT_Pipe_Wood", "Wooden Fluid Pipe", 0.5F, Materials.Wood, 30, 350, false)
+ .getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeLarge.get(Materials.Wood),
+ new GT_MetaPipeEntity_Fluid(
+ 5103,
+ "GT_Pipe_Wood_Large",
+ "Large Wooden Fluid Pipe",
+ 0.75F,
+ Materials.Wood,
+ 60,
+ 350,
+ false).getStackForm(1L));
+
+ generateFluidPipes(Materials.Copper, Materials.Copper.mName, 5110, 20, 1000, true);
+ generateFluidMultiPipes(Materials.Copper, Materials.Copper.mName, 5115, 20, 1000, true);
+ generateFluidPipes(Materials.Bronze, Materials.Bronze.mName, 5120, 120, 2000, true);
+ generateFluidMultiPipes(Materials.Bronze, Materials.Bronze.mName, 5125, 120, 2000, true);
+ generateFluidPipes(Materials.Steel, Materials.Steel.mName, 5130, 240, 2500, true);
+ generateFluidMultiPipes(Materials.Steel, Materials.Steel.mName, 5135, 240, 2500, true);
+ generateFluidPipes(Materials.StainlessSteel, Materials.StainlessSteel.mName, 5140, 360, 3000, true);
+ generateFluidMultiPipes(Materials.StainlessSteel, Materials.StainlessSteel.mName, 5145, 360, 3000, true);
+ generateFluidPipes(Materials.Titanium, Materials.Titanium.mName, 5150, 480, 5000, true);
+ generateFluidMultiPipes(Materials.Titanium, Materials.Titanium.mName, 5155, 480, 5000, true);
+ generateFluidPipes(Materials.TungstenSteel, Materials.TungstenSteel.mName, 5160, 600, 7500, true);
+ generateFluidMultiPipes(Materials.TungstenSteel, Materials.TungstenSteel.mName, 5270, 600, 7500, true);
+ generateFluidPipes(
+ Materials.Polybenzimidazole,
+ Materials.Polybenzimidazole.mName,
+ "PBI",
+ 5280,
+ 600,
+ 1000,
+ true);
+ generateFluidMultiPipes(
+ Materials.Polybenzimidazole,
+ Materials.Polybenzimidazole.mName,
+ "PBI",
+ 5290,
+ 600,
+ 1000,
+ true);
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeSmall.get(Materials.Ultimate),
+ new GT_MetaPipeEntity_Fluid(
+ 5165,
+ "GT_Pipe_HighPressure_Small",
+ "Small High Pressure Fluid Pipe",
+ 0.375F,
+ Materials.Redstone,
+ 4800,
+ 1500,
+ true).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeMedium.get(Materials.Ultimate),
+ new GT_MetaPipeEntity_Fluid(
+ 5166,
+ "GT_Pipe_HighPressure",
+ "High Pressure Fluid Pipe",
+ 0.5F,
+ Materials.Redstone,
+ 7200,
+ 1500,
+ true).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeLarge.get(Materials.Ultimate),
+ new GT_MetaPipeEntity_Fluid(
+ 5167,
+ "GT_Pipe_HighPressure_Large",
+ "Large High Pressure Fluid Pipe",
+ 0.75F,
+ Materials.Redstone,
+ 9600,
+ 1500,
+ true).getStackForm(1L));
+ generateFluidPipes(Materials.Plastic, Materials.Plastic.mName, "Plastic", 5170, 360, 350, true);
+ generateFluidMultiPipes(Materials.Plastic, Materials.Plastic.mName, "Plastic", 5175, 360, 350, true);
+ generateFluidPipes(Materials.NiobiumTitanium, Materials.NiobiumTitanium.mName, 5180, 900, 2900, true);
+ generateFluidMultiPipes(Materials.NiobiumTitanium, Materials.NiobiumTitanium.mName, 5185, 900, 2900, true);
+ generateFluidPipes(Materials.Enderium, Materials.Enderium.mName, 5190, 1800, 15000, true);
+ generateFluidMultiPipes(Materials.Enderium, Materials.Enderium.mName, 5195, 1800, 15000, true);
+ generateFluidPipes(Materials.Naquadah, Materials.Naquadah.mName, 5200, 9000, 19000, true);
+ generateFluidMultiPipes(Materials.Naquadah, Materials.Naquadah.mName, 5205, 9000, 19000, true);
+ generateFluidPipes(Materials.Neutronium, Materials.Neutronium.mName, 5210, 16800, 1000000, true);
+ generateFluidMultiPipes(Materials.Neutronium, Materials.Neutronium.mName, 5215, 16800, 1000000, true);
+ generateFluidPipes(Materials.NetherStar, Materials.NetherStar.mName, 5220, 19200, 1000000, true);
+ generateFluidMultiPipes(Materials.NetherStar, Materials.NetherStar.mName, 5225, 19200, 1000000, true);
+ generateFluidPipes(Materials.MysteriousCrystal, Materials.MysteriousCrystal.mName, 5230, 24000, 1000000, true);
+ generateFluidMultiPipes(
+ Materials.MysteriousCrystal,
+ Materials.MysteriousCrystal.mName,
+ 5235,
+ 24000,
+ 1000000,
+ true);
+ generateFluidPipes(Materials.DraconiumAwakened, Materials.DraconiumAwakened.mName, 5240, 45000, 10000000, true);
+ generateFluidMultiPipes(
+ Materials.DraconiumAwakened,
+ Materials.DraconiumAwakened.mName,
+ 5245,
+ 45000,
+ 10000000,
+ true);
+ generateFluidPipes(Materials.Infinity, Materials.Infinity.mName, 5250, 60000, 10000000, true);
+ generateFluidMultiPipes(Materials.Infinity, Materials.Infinity.mName, 5255, 60000, 10000000, true);
+ generateFluidPipes(Materials.WroughtIron, Materials.WroughtIron.mName, 5260, 180, 2250, true);
+ generateFluidMultiPipes(Materials.WroughtIron, Materials.WroughtIron.mName, 5265, 180, 2250, true);
+ generateFluidPipes(
+ Materials.Polytetrafluoroethylene,
+ Materials.Polytetrafluoroethylene.mName,
+ "PTFE",
+ 5680,
+ 480,
+ 600,
+ true);
+ generateFluidMultiPipes(
+ Materials.Polytetrafluoroethylene,
+ Materials.Polytetrafluoroethylene.mName,
+ "PTFE",
+ 5685,
+ 480,
+ 600,
+ true);
+ generateFluidPipes(
+ MaterialsUEVplus.SpaceTime,
+ MaterialsUEVplus.SpaceTime.mName,
+ 5300,
+ 250000,
+ 2147483647,
+ true);
+ generateFluidMultiPipes(
+ MaterialsUEVplus.SpaceTime,
+ MaterialsUEVplus.SpaceTime.mName,
+ 5305,
+ 250000,
+ 2147483647,
+ true);
+ generateFluidPipes(
+ MaterialsUEVplus.TranscendentMetal,
+ MaterialsUEVplus.TranscendentMetal.mName,
+ 5310,
+ 220000,
+ 2147483647,
+ true);
+ generateFluidMultiPipes(
+ MaterialsUEVplus.TranscendentMetal,
+ MaterialsUEVplus.TranscendentMetal.mName,
+ 5315,
+ 220000,
+ 2147483647,
+ true);
+
+ generateItemPipes(Materials.Brass, Materials.Brass.mName, 5602, 1);
+ generateItemPipes(Materials.Electrum, Materials.Electrum.mName, 5612, 2);
+ generateItemPipes(Materials.Platinum, Materials.Platinum.mName, 5622, 4);
+ generateItemPipes(Materials.Osmium, Materials.Osmium.mName, 5632, 8);
+ generateItemPipes(Materials.PolyvinylChloride, Materials.PolyvinylChloride.mName, "PVC", 5690, 4);
+ generateItemPipes(Materials.Nickel, Materials.Nickel.mName, 5700, 1);
+ generateItemPipes(Materials.Cobalt, Materials.Cobalt.mName, 5710, 2);
+ generateItemPipes(Materials.Aluminium, Materials.Aluminium.mName, 5720, 2);
+ if (NewHorizonsCoreMod.isModLoaded()) {
+ generateFluidPipes(Materials.get("RadoxPoly"), "RadoxPoly", 5760, 5000, 1500, true);
+ }
+ }
+
+ @SuppressWarnings("PointlessArithmeticExpression")
+ private static void makeWires(Materials aMaterial, int aStartID, long aLossInsulated, long aLoss, long aAmperage,
+ long aVoltage, boolean aInsulatable, boolean aAutoInsulated) {
+ String name = GT_LanguageManager.i18nPlaceholder ? "%material" : aMaterial.mDefaultLocalName;
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt01,
+ aMaterial,
+ new GT_MetaPipeEntity_Cable(
+ aStartID + 0,
+ aTextWire1 + aMaterial.mName.toLowerCase() + ".01",
+ "1x " + name + aTextWire2,
+ 0.125F,
+ aMaterial,
+ aLoss,
+ 1L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt02,
+ aMaterial,
+ new GT_MetaPipeEntity_Cable(
+ aStartID + 1,
+ aTextWire1 + aMaterial.mName.toLowerCase() + ".02",
+ "2x " + name + aTextWire2,
+ 0.25F,
+ aMaterial,
+ aLoss,
+ 2L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt04,
+ aMaterial,
+ new GT_MetaPipeEntity_Cable(
+ aStartID + 2,
+ aTextWire1 + aMaterial.mName.toLowerCase() + ".04",
+ "4x " + name + aTextWire2,
+ 0.375F,
+ aMaterial,
+ aLoss,
+ 4L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt08,
+ aMaterial,
+ new GT_MetaPipeEntity_Cable(
+ aStartID + 3,
+ aTextWire1 + aMaterial.mName.toLowerCase() + ".08",
+ "8x " + name + aTextWire2,
+ 0.5F,
+ aMaterial,
+ aLoss,
+ 8L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt12,
+ aMaterial,
+ new GT_MetaPipeEntity_Cable(
+ aStartID + 4,
+ aTextWire1 + aMaterial.mName.toLowerCase() + ".12",
+ "12x " + name + aTextWire2,
+ 0.625F,
+ aMaterial,
+ aLoss,
+ 12L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.wireGt16,
+ aMaterial,
+ new GT_MetaPipeEntity_Cable(
+ aStartID + 5,
+ aTextWire1 + aMaterial.mName.toLowerCase() + ".16",
+ "16x " + name + aTextWire2,
+ 0.75F,
+ aMaterial,
+ aLoss,
+ 16L * aAmperage,
+ aVoltage,
+ false,
+ !aAutoInsulated).getStackForm(1L));
+ if (aInsulatable) {
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt01,
+ aMaterial,
+ new GT_MetaPipeEntity_Cable(
+ aStartID + 6,
+ aTextCable1 + aMaterial.mName.toLowerCase() + ".01",
+ "1x " + name + aTextCable2,
+ 0.25F,
+ aMaterial,
+ aLossInsulated,
+ 1L * aAmperage,
+ aVoltage,
+ true,
+ false).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt02,
+ aMaterial,
+ new GT_MetaPipeEntity_Cable(
+ aStartID + 7,
+ aTextCable1 + aMaterial.mName.toLowerCase() + ".02",
+ "2x " + name + aTextCable2,
+ 0.375F,
+ aMaterial,
+ aLossInsulated,
+ 2L * aAmperage,
+ aVoltage,
+ true,
+ false).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt04,
+ aMaterial,
+ new GT_MetaPipeEntity_Cable(
+ aStartID + 8,
+ aTextCable1 + aMaterial.mName.toLowerCase() + ".04",
+ "4x " + name + aTextCable2,
+ 0.5F,
+ aMaterial,
+ aLossInsulated,
+ 4L * aAmperage,
+ aVoltage,
+ true,
+ false).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt08,
+ aMaterial,
+ new GT_MetaPipeEntity_Cable(
+ aStartID + 9,
+ aTextCable1 + aMaterial.mName.toLowerCase() + ".08",
+ "8x " + name + aTextCable2,
+ 0.625F,
+ aMaterial,
+ aLossInsulated,
+ 8L * aAmperage,
+ aVoltage,
+ true,
+ false).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt12,
+ aMaterial,
+ new GT_MetaPipeEntity_Cable(
+ aStartID + 10,
+ aTextCable1 + aMaterial.mName.toLowerCase() + ".12",
+ "12x " + name + aTextCable2,
+ 0.75F,
+ aMaterial,
+ aLossInsulated,
+ 12L * aAmperage,
+ aVoltage,
+ true,
+ false).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.cableGt16,
+ aMaterial,
+ new GT_MetaPipeEntity_Cable(
+ aStartID + 11,
+ aTextCable1 + aMaterial.mName.toLowerCase() + ".16",
+ "16x " + name + aTextCable2,
+ 0.875F,
+ aMaterial,
+ aLossInsulated,
+ 16L * aAmperage,
+ aVoltage,
+ true,
+ false).getStackForm(1L));
+ }
+ }
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Registering MetaTileEntities.");
+ registerMachineHull();
+ registerTransformer();
+ registerDynamoHatch();
+ registerEnergyHatch();
+ registerInputHatch();
+ registerQuadrupleInputHatch();
+ registerOutputHatch();
+ registerQuantumTank();
+ registerQuantumChest();
+ registerSuperTank();
+ registerSuperChest();
+ registerLongDistancePipe();
+ registerAE2Hatches();
+ registerInputBus();
+ registerOutputBus();
+ registerMufflerHatch();
+ registerBoiler();
+ registerBatteryBuffer1x1();
+ registerBatteryBuffer2x2();
+ registerBatteryBuffer3x3();
+ registerBatteryBuffer4x4();
+ registerCharger4x4();
+ registerWirelessEnergyHatch();
+ registerWirelessDynamoHatch();
+ registerSteamMachines();
+ registerHPSteamMachines();
+ registerLocker();
+ registerScanner();
+ registerPackager();
+ registerRockBreaker();
+ registerIndustrialApiary();
+ registerMassFab();
+ registerReplicator();
+ registerBrewery();
+ registerMiner();
+ registerPump();
+ registerTeleporter();
+ registerMonsterRepellator();
+ registerAdvancedSeismicProspector();
+ registerMicrowaveEnergyTransmitter();
+ registerChestBuffer();
+ registerItemFilter();
+ registerTypeFilter();
+ registerRegulator();
+ registerSuperBuffer();
+ registerItemDistributor();
+ registerRecipeFilter();
+ registerLightningRods();
+ registerCombustionGenerators();
+ registerGasTurbines();
+ registerSteamTurbines();
+ registerNaquadahReactors();
+ registerMagicEnergyAbsorbers();
+ registerMagicEnergyConverters();
+ registerPlasmaGenerators();
+ registerMultiblockControllers();
+
+ ItemList.AdvDebugStructureWriter.set(
+ new GT_MetaTileEntity_AdvDebugStructureWriter(
+ ADVANCED_DEBUG_STRUCTURE_WRITTER.ID,
+ "advdebugstructurewriter",
+ "Advanced Debug Structure Writer",
+ 5).getStackForm(1L));
+ ItemList.Hatch_Maintenance.set(
+ new GT_MetaTileEntity_Hatch_Maintenance(MAINTENANCE_HATCH.ID, "hatch.maintenance", "Maintenance Hatch", 1)
+ .getStackForm(1L));
+ ItemList.Hatch_AutoMaintenance.set(
+ new GT_MetaTileEntity_Hatch_Maintenance(
+ AUTO_MAINTENANCE_HATCH.ID,
+ "hatch.maintenance.auto",
+ "Auto Maintenance Hatch",
+ 6,
+ true).getStackForm(1L));
+ ItemList.Hatch_DroneDownLink.set(
+ new GT_MetaTileEntity_Hatch_DroneDownLink(
+ DroneDownLink.ID,
+ "hatch.dronedownlink",
+ "Drone DownLink Module",
+ 5).getStackForm(1));
+ ItemList.Hatch_DataAccess_EV.set(
+ new GT_MetaTileEntity_Hatch_DataAccess(DATA_ACCESS_HATCH.ID, "hatch.dataaccess", "Data Access Hatch", 4)
+ .getStackForm(1L));
+ ItemList.Hatch_DataAccess_LuV.set(
+ new GT_MetaTileEntity_Hatch_DataAccess(
+ ADVANCED_DATA_ACCESS_HATCH.ID,
+ "hatch.dataaccess.adv",
+ "Advanced Data Access Hatch",
+ 6).getStackForm(1L));
+ ItemList.Hatch_DataAccess_UV.set(
+ new GT_MetaTileEntity_Hatch_DataAccess(
+ AUTOMATABLE_DATA_ACCESS_HATCH.ID,
+ "hatch.dataaccess.auto",
+ "Automatable Data Access Hatch",
+ 8).getStackForm(1L));
+ generateWiresAndPipes();
+ }
+
+ private static void generateItemPipes(Materials aMaterial, String name, int startID, int baseInvSlots) {
+ generateItemPipes(
+ aMaterial,
+ name,
+ GT_LanguageManager.i18nPlaceholder ? "%material" : aMaterial.mDefaultLocalName,
+ startID,
+ baseInvSlots);
+ }
+
+ private static void generateItemPipes(Materials aMaterial, String name, String displayName, int startID,
+ int baseInvSlots) {
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeMedium.get(aMaterial),
+ new GT_MetaPipeEntity_Item(
+ startID,
+ "GT_Pipe_" + name,
+ displayName + " Item Pipe",
+ 0.50F,
+ aMaterial,
+ baseInvSlots,
+ 32768 / baseInvSlots,
+ false).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeLarge.get(aMaterial),
+ new GT_MetaPipeEntity_Item(
+ startID + 1,
+ "GT_Pipe_" + name + "_Large",
+ "Large " + displayName + " Item Pipe",
+ 0.75F,
+ aMaterial,
+ baseInvSlots * 2,
+ 16384 / baseInvSlots,
+ false).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeHuge.get(aMaterial),
+ new GT_MetaPipeEntity_Item(
+ startID + 2,
+ "GT_Pipe_" + name + "_Huge",
+ "Huge " + displayName + " Item Pipe",
+ 1.00F,
+ aMaterial,
+ baseInvSlots * 4,
+ 8192 / baseInvSlots,
+ false).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeRestrictiveMedium.get(aMaterial),
+ new GT_MetaPipeEntity_Item(
+ startID + 3,
+ "GT_Pipe_Restrictive_" + name,
+ "Restrictive " + displayName + " Item Pipe",
+ 0.50F,
+ aMaterial,
+ baseInvSlots,
+ 3276800 / baseInvSlots,
+ true).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeRestrictiveLarge.get(aMaterial),
+ new GT_MetaPipeEntity_Item(
+ startID + 4,
+ "GT_Pipe_Restrictive_" + name + "_Large",
+ "Large Restrictive " + displayName + " Item Pipe",
+ 0.75F,
+ aMaterial,
+ baseInvSlots * 2,
+ 1638400 / baseInvSlots,
+ true).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeRestrictiveHuge.get(aMaterial),
+ new GT_MetaPipeEntity_Item(
+ startID + 5,
+ "GT_Pipe_Restrictive_" + name + "_Huge",
+ "Huge Restrictive " + displayName + " Item Pipe",
+ 0.875F,
+ aMaterial,
+ baseInvSlots * 4,
+ 819200 / baseInvSlots,
+ true).getStackForm(1L));
+ }
+
+ @SuppressWarnings("SameParameterValue")
+ private static void generateFluidPipes(Materials aMaterial, String name, int startID, int baseCapacity,
+ int heatCapacity, boolean gasProof) {
+ generateFluidPipes(
+ aMaterial,
+ name,
+ GT_LanguageManager.i18nPlaceholder ? "%material" : aMaterial.mDefaultLocalName,
+ startID,
+ baseCapacity,
+ heatCapacity,
+ gasProof);
+ }
+
+ private static void generateFluidPipes(Materials aMaterial, String name, String displayName, int startID,
+ int baseCapacity, int heatCapacity, boolean gasProof) {
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeTiny.get(aMaterial),
+ new GT_MetaPipeEntity_Fluid(
+ startID,
+ "GT_Pipe_" + name + "_Tiny",
+ "Tiny " + displayName + " Fluid Pipe",
+ 0.25F,
+ aMaterial,
+ baseCapacity / 6,
+ heatCapacity,
+ gasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeSmall.get(aMaterial),
+ new GT_MetaPipeEntity_Fluid(
+ startID + 1,
+ "GT_Pipe_" + name + "_Small",
+ "Small " + displayName + " Fluid Pipe",
+ 0.375F,
+ aMaterial,
+ baseCapacity / 3,
+ heatCapacity,
+ gasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeMedium.get(aMaterial),
+ new GT_MetaPipeEntity_Fluid(
+ startID + 2,
+ "GT_Pipe_" + name,
+ displayName + " Fluid Pipe",
+ 0.5F,
+ aMaterial,
+ baseCapacity,
+ heatCapacity,
+ gasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeLarge.get(aMaterial),
+ new GT_MetaPipeEntity_Fluid(
+ startID + 3,
+ "GT_Pipe_" + name + "_Large",
+ "Large " + displayName + " Fluid Pipe",
+ 0.75F,
+ aMaterial,
+ baseCapacity * 2,
+ heatCapacity,
+ gasProof).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeHuge.get(aMaterial),
+ new GT_MetaPipeEntity_Fluid(
+ startID + 4,
+ "GT_Pipe_" + name + "_Huge",
+ "Huge " + displayName + " Fluid Pipe",
+ 0.875F,
+ aMaterial,
+ baseCapacity * 4,
+ heatCapacity,
+ gasProof).getStackForm(1L));
+ }
+
+ @SuppressWarnings("SameParameterValue")
+ private static void generateFluidMultiPipes(Materials aMaterial, String name, int startID, int baseCapacity,
+ int heatCapacity, boolean gasProof) {
+ generateFluidMultiPipes(aMaterial, name, "%material", startID, baseCapacity, heatCapacity, gasProof);
+ }
+
+ private static void generateFluidMultiPipes(Materials aMaterial, String name, String displayName, int startID,
+ int baseCapacity, int heatCapacity, boolean gasProof) {
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeQuadruple.get(aMaterial),
+ new GT_MetaPipeEntity_Fluid(
+ startID,
+ "GT_Pipe_" + name + "_Quadruple",
+ "Quadruple " + displayName + " Fluid Pipe",
+ 1.0F,
+ aMaterial,
+ baseCapacity,
+ heatCapacity,
+ gasProof,
+ 4).getStackForm(1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.pipeNonuple.get(aMaterial),
+ new GT_MetaPipeEntity_Fluid(
+ startID + 1,
+ "GT_Pipe_" + name + "_Nonuple",
+ "Nonuple " + displayName + " Fluid Pipe",
+ 1.0F,
+ aMaterial,
+ baseCapacity / 3,
+ heatCapacity,
+ gasProof,
+ 9).getStackForm(1L));
+ }
+}
diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java b/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java
new file mode 100644
index 0000000000..fd290935df
--- /dev/null
+++ b/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java
@@ -0,0 +1,1447 @@
+package gregtech.loaders.preload;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.multitileentity.enums.GT_MultiTileCasing.*;
+import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.*;
+import static gregtech.api.multitileentity.enums.GT_MultiTileUpgradeCasing.*;
+import static gregtech.api.multitileentity.enums.GT_MultiTileUpgradeCasing.Insulator_OmegaType;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.multitileentity.MultiTileEntityBlock;
+import gregtech.api.multitileentity.MultiTileEntityRegistry;
+import gregtech.api.multitileentity.multiblock.base.WallShareablePart;
+import gregtech.api.multitileentity.multiblock.casing.BasicCasing;
+import gregtech.common.tileentities.casings.functional.Conveyor;
+import gregtech.common.tileentities.casings.functional.Emitter;
+import gregtech.common.tileentities.casings.functional.FieldGenerator;
+import gregtech.common.tileentities.casings.functional.Motor;
+import gregtech.common.tileentities.casings.functional.Piston;
+import gregtech.common.tileentities.casings.functional.Pump;
+import gregtech.common.tileentities.casings.functional.RobotArm;
+import gregtech.common.tileentities.casings.functional.Sensor;
+import gregtech.common.tileentities.casings.upgrade.Ampere;
+import gregtech.common.tileentities.casings.upgrade.Cleanroom;
+import gregtech.common.tileentities.casings.upgrade.Heater;
+import gregtech.common.tileentities.casings.upgrade.Insulator;
+import gregtech.common.tileentities.casings.upgrade.Inventory;
+import gregtech.common.tileentities.casings.upgrade.Laser;
+import gregtech.common.tileentities.casings.upgrade.Tank;
+import gregtech.common.tileentities.casings.upgrade.Wireless;
+import gregtech.common.tileentities.machines.multiblock.AdvChemicalProcessor;
+import gregtech.common.tileentities.machines.multiblock.CokeOven;
+import gregtech.common.tileentities.machines.multiblock.DistillationTower;
+import gregtech.common.tileentities.machines.multiblock.LaserEngraver;
+import gregtech.common.tileentities.machines.multiblock.LayeredCokeBattery;
+import gregtech.common.tileentities.machines.multiblock.Macerator;
+
+public class GT_Loader_MultiTileEntities implements Runnable {
+
+ public static final String COMPONENT_CASING_REGISTRY_NAME = "gt.multitileentity.component.casings";
+ public static final String UPGRADE_CASING_REGISTRY_NAME = "gt.multitileentity.upgrade.casings";
+ public static final String CASING_REGISTRY_NAME = "gt.multitileentity.casings";
+ public static final String MACHINE_REGISTRY_NAME = "gt.multitileentity.controllers";
+ public static final MultiTileEntityRegistry MACHINE_REGISTRY = new MultiTileEntityRegistry(MACHINE_REGISTRY_NAME);
+ public static final MultiTileEntityBlock MACHINE_BLOCK = MultiTileEntityBlock
+ .getOrCreate("GregTech", "machine", Material.iron, Block.soundTypeMetal, "wrench", 0, 0, 15, true, true);
+ public static final MultiTileEntityRegistry CASING_REGISTRY = new MultiTileEntityRegistry(CASING_REGISTRY_NAME);
+ public static final MultiTileEntityBlock CASING_BLOCK = MultiTileEntityBlock
+ .getOrCreate("GregTech", "casing", Material.iron, Block.soundTypeMetal, "wrench", 0, 0, 15, true, true);
+ public static final MultiTileEntityRegistry COMPONENT_CASING_REGISTRY = new MultiTileEntityRegistry(
+ COMPONENT_CASING_REGISTRY_NAME);
+
+ public static final MultiTileEntityRegistry UPGRADE_CASING_REGISTRY = new MultiTileEntityRegistry(
+ UPGRADE_CASING_REGISTRY_NAME);
+
+ public static final MultiTileEntityBlock COMPONENT_CASING_BLOCK = MultiTileEntityBlock.getOrCreate(
+ "GregTech",
+ "componentCasing",
+ Material.iron,
+ Block.soundTypeMetal,
+ "wrench",
+ 0,
+ 0,
+ 15,
+ true,
+ true);
+
+ @Override
+ public void run() {
+ GT_FML_LOGGER.info("GT_Mod: Registering MultiTileEntities");
+ registerMachines();
+ registerCasings();
+ registerComponentCasings();
+ }
+
+ private static void registerMachines() {
+ // Disable for now
+ MACHINE_REGISTRY.create(1000, Macerator.class)
+ .name("Large Macerator")
+ .category("Multiblock Controller")
+ .setBlock(MACHINE_BLOCK)
+ .material(Materials.Iron)
+ .textureFolder("macerator")
+ .tankCapacity(128000L)
+ .inputInventorySize(16)
+ .outputInventorySize(16)
+ .register();
+ MACHINE_REGISTRY.create(0, CokeOven.class)
+ .name("Coke Oven")
+ .category("MultiblockController")
+ .setBlock(MACHINE_BLOCK)
+ .textureFolder("cokeOven")
+ .inputInventorySize(1)
+ .outputInventorySize(1)
+ .register();
+ MACHINE_REGISTRY.create(1, AdvChemicalProcessor.class)
+ .name("Advanced Chemical Processor")
+ .category("MultiblockController")
+ .setBlock(MACHINE_BLOCK)
+ // TODO: Texture
+ .textureFolder("advChemicalProcessor")
+ .inputInventorySize(16)
+ .outputInventorySize(16)
+ .tankCapacity(128000L)
+ .register();
+ MACHINE_REGISTRY.create(2, DistillationTower.class)
+ .name("Distillation Tower")
+ .category("MultiblockController")
+ .setBlock(MACHINE_BLOCK)
+ .textureFolder("distillationTower")
+ .inputInventorySize(16)
+ .outputInventorySize(16)
+ .tankCapacity(128000L)
+ .register();
+ MACHINE_REGISTRY.create(3, LayeredCokeBattery.class)
+ .name("Layered Coke Battery")
+ .category("Multiblock Controller")
+ .setBlock(MACHINE_BLOCK)
+ .material(Materials.Iron)
+ .textureFolder("macerator")
+ .tankCapacity(128000L)
+ .inputInventorySize(16)
+ .outputInventorySize(16)
+ .register();
+ MACHINE_REGISTRY.create(4, LaserEngraver.class)
+ .name("Big Laser Engraver")
+ .category("Multiblock Controller")
+ .setBlock(MACHINE_BLOCK)
+ .textureFolder("BigLaserEngraver")
+ .inputInventorySize(16)
+ .outputInventorySize(16)
+ .tankCapacity(128000L)
+ .register();
+ }
+
+ private static void registerCasings() {
+
+ CASING_REGISTRY.create(CokeOven.getId(), WallShareablePart.class)
+ .name("Coke Oven Bricks")
+ .category("MultiBlock Casing")
+ .setBlock(CASING_BLOCK)
+ .textureFolder("cokeOven")
+ .register();
+ CASING_REGISTRY.create(Chemical.getId(), BasicCasing.class)
+ .name("Chemical Casing")
+ .category("MultiBlock Casing")
+ .setBlock(CASING_BLOCK)
+ .textureFolder("advChemicalProcessor")
+ .register();
+ CASING_REGISTRY.create(Distillation.getId(), BasicCasing.class)
+ .name("Distillation Casing")
+ .category("MultiBlock Casing")
+ .setBlock(CASING_BLOCK)
+ .textureFolder("distillationTower")
+ .register();
+ CASING_REGISTRY.create(18000, BasicCasing.class)
+ .name("Test Casing")
+ .category("Multiblock Casing")
+ .setBlock(CASING_BLOCK)
+ .material(Materials.Cobalt)
+ .textureFolder("macerator")
+ .register();
+ CASING_REGISTRY.create(LaserEngraver.getId(), BasicCasing.class)
+ .name("Laser Engraver Casing")
+ .category("MultiBlock Casing")
+ .setBlock(CASING_BLOCK)
+ .textureFolder("BigLaserEngraver")
+ .register();
+ CASING_REGISTRY.create(Mirror.getId(), BasicCasing.class)
+ .name("Mirror")
+ .category("MultiBlock Casing")
+ .setBlock(CASING_BLOCK)
+ .textureFolder("Laserblock")
+ .register();
+ CASING_REGISTRY.create(BlackLaserEngraverCasing.getId(), BasicCasing.class)
+ .name("Black Laser Engraver Casing")
+ .category("MultiBlock Casing")
+ .setBlock(CASING_BLOCK)
+ .textureFolder("BlackLaserEngraver")
+ .register();
+ CASING_REGISTRY.create(LaserEngraverUpgrade1.getId(), BasicCasing.class)
+ .name("Crude Laser Engraving Casing")
+ .category("MultiBlock Casing")
+ .setBlock(CASING_BLOCK)
+ .textureFolder("laserengraverupgrade1")
+ .register();
+ CASING_REGISTRY.create(LaserEngraverUpgrade2.getId(), BasicCasing.class)
+ .name("Advanced Laser Engraving Casing")
+ .category("MultiBlock Casing")
+ .setBlock(CASING_BLOCK)
+ .textureFolder("laserengraverupgrade2")
+ .register();
+ CASING_REGISTRY.create(LaserEngraverUpgrade3.getId(), BasicCasing.class)
+ .name("Ultimate Laser Engraving Casing")
+ .category("MultiBlock Casing")
+ .setBlock(CASING_BLOCK)
+ .textureFolder("laserengraverupgrade3")
+ .register();
+ CASING_REGISTRY.create(LaserEngraverUpgrade4.getId(), BasicCasing.class)
+ .name("Superb Laser Engraving Casing")
+ .category("MultiBlock Casing")
+ .setBlock(CASING_BLOCK)
+ .textureFolder("laserengraverupgrade4")
+ .register();
+
+ }
+
+ private static void registerComponentCasings() {
+
+ registerMotorCasings();
+ registerPumpCasings();
+ registerPistonCasings();
+ registerRobotArmCasings();
+ registerConveyorCasings();
+ registerEmitterCasings();
+ registerSensorCasings();
+ registerFieldGeneratorCasings();
+
+ UPGRADE_CASING_REGISTRY.create(ULV_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade ULV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(1)
+ .tier(0)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(LV_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade LV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(4)
+ .tier(1)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(MV_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade MV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(8)
+ .tier(2)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(HV_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade HV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(16)
+ .tier(3)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(EV_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade EV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(32)
+ .tier(4)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(IV_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade IV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(64)
+ .tier(5)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(LuV_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade LuV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(128)
+ .tier(6)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(ZPM_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade ZPM")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(256)
+ .tier(7)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(UV_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade UV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(256)
+ .tier(8)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(UHV_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade UHV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(256)
+ .tier(9)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(UEV_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade UEV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(256)
+ .tier(10)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(UIV_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade UIV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(256)
+ .tier(11)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(UMV_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade UMV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(256)
+ .tier(12)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(UXV_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade UXV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(256)
+ .tier(13)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(MAX_Inventory.getId(), Inventory.class)
+ .name("Inventory Upgrade MAX")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("inventory")
+ .upgradeInventorySize(256)
+ .tier(14)
+ .register();
+
+ UPGRADE_CASING_REGISTRY.create(ULV_Tank.getId(), Tank.class)
+ .name("Tank Upgrade ULV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(8_000L)
+ .upgradeTankCount(1)
+ .tier(0)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(LV_Tank.getId(), Tank.class)
+ .name("Tank Upgrade LV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(16_000L)
+ .upgradeTankCount(2)
+ .tier(1)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(MV_Tank.getId(), Tank.class)
+ .name("Tank Upgrade MV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(32_000L)
+ .upgradeTankCount(4)
+ .tier(2)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(HV_Tank.getId(), Tank.class)
+ .name("Tank Upgrade HV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(64_000L)
+ .upgradeTankCount(6)
+ .tier(3)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(EV_Tank.getId(), Tank.class)
+ .name("Tank Upgrade EV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(128_000L)
+ .upgradeTankCount(8)
+ .tier(4)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(IV_Tank.getId(), Tank.class)
+ .name("Tank Upgrade IV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(256_000L)
+ .upgradeTankCount(10)
+ .tier(5)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(LuV_Tank.getId(), Tank.class)
+ .name("Tank Upgrade LuV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(512_000L)
+ .upgradeTankCount(12)
+ .tier(6)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(ZPM_Tank.getId(), Tank.class)
+ .name("Tank Upgrade ZPM")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(1_024_000L)
+ .upgradeTankCount(14)
+ .tier(7)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(UV_Tank.getId(), Tank.class)
+ .name("Tank Upgrade UV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(2_048_000L)
+ .upgradeTankCount(16)
+ .tier(8)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(UHV_Tank.getId(), Tank.class)
+ .name("Tank Upgrade UHV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(4_096_000L)
+ .upgradeTankCount(16)
+ .tier(9)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(UEV_Tank.getId(), Tank.class)
+ .name("Tank Upgrade UEV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(8_192_000L)
+ .upgradeTankCount(16)
+ .tier(10)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(UIV_Tank.getId(), Tank.class)
+ .name("Tank Upgrade UIV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(16_384_000L)
+ .upgradeTankCount(16)
+ .tier(11)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(UMV_Tank.getId(), Tank.class)
+ .name("Tank Upgrade UMV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(32_768_000L)
+ .upgradeTankCount(16)
+ .tier(12)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(UXV_Tank.getId(), Tank.class)
+ .name("Tank Upgrade UXV")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(65_536_000L)
+ .upgradeTankCount(16)
+ .tier(13)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(MAX_Tank.getId(), Tank.class)
+ .name("Tank Upgrade MAX")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("tank")
+ .upgradeTankCapacity(131_072_000L)
+ .upgradeTankCount(16)
+ .tier(14)
+ .register();
+
+ UPGRADE_CASING_REGISTRY.create(Amp_4.getId(), Ampere.class)
+ .name("Amperage Upgrade (4 A)")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("amperage")
+ .upgradeAmperage(4)
+ .tier(1)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Amp_16.getId(), Ampere.class)
+ .name("Amperage Upgrade (16 A)")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("amperage")
+ .upgradeAmperage(16)
+ .tier(2)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Amp_64.getId(), Ampere.class)
+ .name("Amperage Upgrade (64 A)")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("amperage")
+ .upgradeAmperage(64)
+ .tier(3)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Amp_256.getId(), Ampere.class)
+ .name("Amperage Upgrade (256 A)")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("amperage")
+ .upgradeAmperage(256)
+ .tier(4)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Amp_1_024.getId(), Ampere.class)
+ .name("Amperage Upgrade (1,024 A)")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("amperage")
+ .upgradeAmperage(1_024)
+ .tier(5)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Amp_4_096.getId(), Ampere.class)
+ .name("Amperage Upgrade (4,096 A)")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("amperage")
+ .upgradeAmperage(4_096)
+ .tier(6)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Amp_16_384.getId(), Ampere.class)
+ .name("Amperage Upgrade (16,384 A)")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("amperage")
+ .upgradeAmperage(16_384)
+ .tier(7)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Amp_65_536.getId(), Ampere.class)
+ .name("Amperage Upgrade (65,536 A)")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("amperage")
+ .upgradeAmperage(65_536)
+ .tier(8)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Amp_262_144.getId(), Ampere.class)
+ .name("Amperage Upgrade (262,144 A)")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("amperage")
+ .upgradeAmperage(262_144)
+ .tier(9)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Amp_1_048_576.getId(), Ampere.class)
+ .name("Amperage Upgrade (1,048,576 A)")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("amperage")
+ .upgradeAmperage(1_048_576)
+ .tier(10)
+ .register();
+
+ UPGRADE_CASING_REGISTRY.create(Cleanroom.getId(), Cleanroom.class)
+ .name("Cleanroom Upgrade")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("cleanroom")
+ .tier(1)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Laser.getId(), Laser.class)
+ .name("Laser Upgrade")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("laser")
+ .tier(8)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Wireless.getId(), Wireless.class)
+ .name("Wireless Upgrade")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("wireless")
+ .tier(11)
+ .register();
+
+ UPGRADE_CASING_REGISTRY.create(Heater_Prototype.getId(), Heater.class)
+ .name("Prototype Heater Upgrade")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("heater")
+ .tier(1)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Heater_IndustrialGrade.getId(), Heater.class)
+ .name("Industrial-Grade Heater Upgrade")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("heater")
+ .tier(4)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Heater_NextGen.getId(), Heater.class)
+ .name("Next-Gen Heater Upgrade")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("heater")
+ .tier(7)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Heater_Omnipotent.getId(), Heater.class)
+ .name("Omnipotent Heater Upgrade")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("heater")
+ .tier(10)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Heater_OmegaType.getId(), Heater.class)
+ .name("OMEGA-Type Heater Upgrade")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("heater")
+ .tier(12)
+ .register();
+
+ UPGRADE_CASING_REGISTRY.create(Insulator_Prototype.getId(), Insulator.class)
+ .name("Prototype Insulator Upgrade")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("insulator")
+ .tier(1)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Insulator_IndustrialGrade.getId(), Insulator.class)
+ .name("Industrial-Grade Insulator Upgrade")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("insulator")
+ .tier(4)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Insulator_NextGen.getId(), Insulator.class)
+ .name("Next-Gen Insulator Upgrade")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("insulator")
+ .tier(7)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Insulator_Omnipotent.getId(), Insulator.class)
+ .name("Omnipotent Insulator Upgrade")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("insulator")
+ .tier(10)
+ .register();
+ UPGRADE_CASING_REGISTRY.create(Insulator_OmegaType.getId(), Insulator.class)
+ .name("OMEGA-Type Insulator Upgrade")
+ .category("MultiBlock Upgrade Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("insulator")
+ .tier(12)
+ .register();
+ }
+
+ private static void registerMotorCasings() {
+ COMPONENT_CASING_REGISTRY.create(LV_Motor.getId(), Motor.class)
+ .name("Motor Casing LV")
+ .tier(1)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MV_Motor.getId(), Motor.class)
+ .name("Motor Casing MV")
+ .tier(2)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(HV_Motor.getId(), Motor.class)
+ .name("Motor Casing HV")
+ .tier(3)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(EV_Motor.getId(), Motor.class)
+ .name("Motor Casing EV")
+ .tier(4)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(IV_Motor.getId(), Motor.class)
+ .name("Motor Casing IV")
+ .tier(5)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(LuV_Motor.getId(), Motor.class)
+ .name("Motor Casing LuV")
+ .tier(6)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(ZPM_Motor.getId(), Motor.class)
+ .name("Motor Casing ZPM")
+ .tier(7)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UV_Motor.getId(), Motor.class)
+ .name("Motor Casing UV")
+ .tier(8)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UHV_Motor.getId(), Motor.class)
+ .name("Motor Casing UHV")
+ .tier(9)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UEV_Motor.getId(), Motor.class)
+ .name("Motor Casing UEV")
+ .tier(10)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UIV_Motor.getId(), Motor.class)
+ .name("Motor Casing UIV")
+ .tier(11)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UMV_Motor.getId(), Motor.class)
+ .name("Motor Casing UMV")
+ .tier(12)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UXV_Motor.getId(), Motor.class)
+ .name("Motor Casing UXV")
+ .tier(13)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MAX_Motor.getId(), Motor.class)
+ .name("Motor Casing MAX")
+ .tier(14)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("motor")
+ .register();
+ }
+
+ private static void registerPumpCasings() {
+ COMPONENT_CASING_REGISTRY.create(LV_Pump.getId(), Pump.class)
+ .name("Pump Casing LV")
+ .tier(1)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MV_Pump.getId(), Pump.class)
+ .name("Pump Casing MV")
+ .tier(2)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(HV_Pump.getId(), Pump.class)
+ .name("Pump Casing HV")
+ .tier(3)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(EV_Pump.getId(), Pump.class)
+ .name("Pump Casing EV")
+ .tier(4)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(IV_Pump.getId(), Pump.class)
+ .name("Pump Casing IV")
+ .tier(5)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(LuV_Pump.getId(), Pump.class)
+ .name("Pump Casing LuV")
+ .tier(6)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(LuV_Pump.getId(), Pump.class)
+ .name("Pump Casing LuV")
+ .tier(6)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(ZPM_Pump.getId(), Pump.class)
+ .name("Pump Casing ZPM")
+ .tier(7)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UV_Pump.getId(), Pump.class)
+ .name("Pump Casing UV")
+ .tier(8)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UHV_Pump.getId(), Pump.class)
+ .name("Pump Casing UHV")
+ .tier(9)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UEV_Pump.getId(), Pump.class)
+ .name("Pump Casing UEV")
+ .tier(10)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UIV_Pump.getId(), Pump.class)
+ .name("Pump Casing UIV")
+ .tier(11)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UMV_Pump.getId(), Pump.class)
+ .name("Pump Casing UMV")
+ .tier(12)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UXV_Pump.getId(), Pump.class)
+ .name("Pump Casing UXV")
+ .tier(13)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MAX_Pump.getId(), Pump.class)
+ .name("Pump Casing MAX")
+ .tier(14)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("pump")
+ .register();
+ }
+
+ private static void registerPistonCasings() {
+ COMPONENT_CASING_REGISTRY.create(LV_Piston.getId(), Piston.class)
+ .name("Piston Casing LV")
+ .tier(1)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MV_Piston.getId(), Piston.class)
+ .name("Piston Casing MV")
+ .tier(2)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(HV_Piston.getId(), Piston.class)
+ .name("Piston Casing HV")
+ .tier(3)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(EV_Piston.getId(), Piston.class)
+ .name("Piston Casing EV")
+ .tier(4)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(IV_Piston.getId(), Piston.class)
+ .name("Piston Casing IV")
+ .tier(5)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(LuV_Piston.getId(), Piston.class)
+ .name("Piston Casing LuV")
+ .tier(6)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(ZPM_Piston.getId(), Piston.class)
+ .name("Piston Casing ZPM")
+ .tier(7)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UV_Piston.getId(), Piston.class)
+ .name("Piston Casing UV")
+ .tier(8)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UHV_Piston.getId(), Piston.class)
+ .name("Piston Casing UHV")
+ .tier(9)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UEV_Piston.getId(), Piston.class)
+ .name("Piston Casing UEV")
+ .tier(10)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UIV_Piston.getId(), Piston.class)
+ .name("Piston Casing UIV")
+ .tier(11)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UMV_Piston.getId(), Piston.class)
+ .name("Piston Casing UMV")
+ .tier(12)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UXV_Piston.getId(), Piston.class)
+ .name("Piston Casing UXV")
+ .tier(13)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MAX_Piston.getId(), Piston.class)
+ .name("Piston Casing MAX")
+ .tier(14)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("piston")
+ .register();
+ }
+
+ private static void registerConveyorCasings() {
+ COMPONENT_CASING_REGISTRY.create(LV_Conveyor.getId(), Conveyor.class)
+ .name("Conveyor Casing LV")
+ .tier(1)
+ .category("MultiBlock Structural Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("conveyor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MV_Conveyor.getId(), Conveyor.class)
+ .name("Conveyor Casing MV")
+ .tier(2)
+ .category("MultiBlock Structural Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("conveyor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(HV_Conveyor.getId(), Conveyor.class)
+ .name("Conveyor Casing HV")
+ .tier(3)
+ .category("MultiBlock Structural Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("conveyor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(EV_Conveyor.getId(), Conveyor.class)
+ .name("Conveyor Casing EV")
+ .tier(4)
+ .category("MultiBlock Structural Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("conveyor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(IV_Conveyor.getId(), Conveyor.class)
+ .name("Conveyor Casing IV")
+ .tier(5)
+ .category("MultiBlock Structural Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("conveyor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(LuV_Conveyor.getId(), Conveyor.class)
+ .name("Conveyor Casing LuV")
+ .tier(6)
+ .category("MultiBlock Structural Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("conveyor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(ZPM_Conveyor.getId(), Conveyor.class)
+ .name("Conveyor Casing ZPM")
+ .tier(7)
+ .category("MultiBlock Structural Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("conveyor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UV_Conveyor.getId(), Conveyor.class)
+ .name("Conveyor Casing UV")
+ .tier(8)
+ .category("MultiBlock Structural Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("conveyor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UHV_Conveyor.getId(), Conveyor.class)
+ .name("Conveyor Casing UHV")
+ .tier(9)
+ .category("MultiBlock Structural Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("conveyor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UEV_Conveyor.getId(), Conveyor.class)
+ .name("Conveyor Casing UEV")
+ .tier(10)
+ .category("MultiBlock Structural Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("conveyor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UIV_Conveyor.getId(), Conveyor.class)
+ .name("Conveyor Casing UIV")
+ .tier(11)
+ .category("MultiBlock Structural Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("conveyor")
+ .register();
+ }
+
+ private static void registerRobotArmCasings() {
+ COMPONENT_CASING_REGISTRY.create(LV_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing LV")
+ .tier(1)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MV_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing MV")
+ .tier(2)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(HV_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing HV")
+ .tier(3)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(EV_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing EV")
+ .tier(4)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(IV_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing IV")
+ .tier(5)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(LuV_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing LuV")
+ .tier(6)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(ZPM_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing ZPM")
+ .tier(7)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UV_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing UV")
+ .tier(8)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UHV_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing UHV")
+ .tier(9)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UEV_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing UEV")
+ .tier(10)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UIV_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing UIV")
+ .tier(11)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UMV_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing UMV")
+ .tier(12)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UXV_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing UXV")
+ .tier(13)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MAX_RobotArm.getId(), RobotArm.class)
+ .name("Robot Arm Casing MAX")
+ .tier(14)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("robotArm")
+ .register();
+ }
+
+ private static void registerSensorCasings() {
+ COMPONENT_CASING_REGISTRY.create(LV_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing LV")
+ .tier(1)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MV_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing MV")
+ .tier(2)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(HV_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing HV")
+ .tier(3)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(EV_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing EV")
+ .tier(4)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(IV_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing IV")
+ .tier(5)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(LuV_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing LuV")
+ .tier(6)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(ZPM_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing ZPM")
+ .tier(7)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UV_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing UV")
+ .tier(8)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UHV_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing UHV")
+ .tier(9)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UEV_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing UEV")
+ .tier(10)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UIV_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing UIV")
+ .tier(11)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UMV_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing UMV")
+ .tier(12)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UXV_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing UXV")
+ .tier(13)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MAX_Sensor.getId(), Sensor.class)
+ .name("Sensor Casing MAX")
+ .tier(14)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("sensor")
+ .register();
+ }
+
+ private static void registerEmitterCasings() {
+ COMPONENT_CASING_REGISTRY.create(LV_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing LV")
+ .tier(1)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MV_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing MV")
+ .tier(2)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(HV_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing HV")
+ .tier(3)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(EV_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing EV")
+ .tier(4)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(IV_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing IV")
+ .tier(5)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(LuV_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing LuV")
+ .tier(6)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(ZPM_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing ZPM")
+ .tier(7)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UV_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing UV")
+ .tier(8)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UHV_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing UHV")
+ .tier(9)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UEV_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing UEV")
+ .tier(10)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UIV_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing UIV")
+ .tier(11)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UMV_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing UMV")
+ .tier(12)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UXV_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing UXV")
+ .tier(13)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MAX_Emitter.getId(), Emitter.class)
+ .name("Emitter Casing MAX")
+ .tier(14)
+ .category("MultiBlock Functional Casing")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("emitter")
+ .register();
+ }
+
+ private static void registerFieldGeneratorCasings() {
+ COMPONENT_CASING_REGISTRY.create(LV_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator LV")
+ .tier(1)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MV_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator MV")
+ .tier(2)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(HV_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator HV")
+ .tier(3)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(EV_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator EV")
+ .tier(4)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(IV_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator IV")
+ .tier(5)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(LuV_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator LuV")
+ .tier(6)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(ZPM_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator ZPM")
+ .tier(7)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UV_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator UV")
+ .tier(8)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UHV_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator UHV")
+ .tier(9)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UEV_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator UEV")
+ .tier(10)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UIV_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator UIV")
+ .tier(11)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UMV_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator UMV")
+ .tier(12)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(UXV_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator UXV")
+ .tier(13)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ COMPONENT_CASING_REGISTRY.create(MAX_FieldGenerator.getId(), FieldGenerator.class)
+ .name("Field Generator MAX")
+ .tier(14)
+ .category("Multiblock Energy Field")
+ .setBlock(COMPONENT_CASING_BLOCK)
+ .textureFolder("fieldGenerator")
+ .register();
+ }
+}
diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_OreDictionary.java b/src/main/java/gregtech/loaders/preload/GT_Loader_OreDictionary.java
new file mode 100644
index 0000000000..4d51c90cb5
--- /dev/null
+++ b/src/main/java/gregtech/loaders/preload/GT_Loader_OreDictionary.java
@@ -0,0 +1,449 @@
+package gregtech.loaders.preload;
+
+import static gregtech.api.enums.Mods.AppliedEnergistics2;
+import static gregtech.api.enums.Mods.Botania;
+import static gregtech.api.enums.Mods.IndustrialCraft2;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+import static gregtech.api.enums.Mods.Railcraft;
+import static gregtech.api.enums.Mods.Thaumcraft;
+import static gregtech.api.enums.Mods.TwilightForest;
+
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.MaterialsBotania;
+import gregtech.api.enums.OreDictNames;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+
+public class GT_Loader_OreDictionary implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Register OreDict Entries of Non-GT-Items.");
+ GT_OreDictUnificator.set(OrePrefixes.cell, Materials.Empty, ItemList.Cell_Empty.get(1L));
+ GT_OreDictUnificator.set(OrePrefixes.cell, Materials.Lava, ItemList.Cell_Lava.get(1L));
+ GT_OreDictUnificator.set(OrePrefixes.cell, Materials.Lava, GT_ModHandler.getIC2Item("lavaCell", 1L));
+ GT_OreDictUnificator.set(OrePrefixes.cell, Materials.Water, ItemList.Cell_Water.get(1L));
+ GT_OreDictUnificator.set(OrePrefixes.cell, Materials.Water, GT_ModHandler.getIC2Item("waterCell", 1L));
+ GT_OreDictUnificator.set(
+ OrePrefixes.cell,
+ Materials.Creosote,
+ GT_ModHandler.getModItem(Railcraft.ID, "fluid.creosote.cell", 1L));
+
+ GT_OreDictUnificator.set(OrePrefixes.cell, Materials.UUMatter, GT_ModHandler.getIC2Item("uuMatterCell", 1L));
+ GT_OreDictUnificator.set(OrePrefixes.cell, Materials.ConstructionFoam, GT_ModHandler.getIC2Item("CFCell", 1L));
+
+ GT_OreDictUnificator.set(OrePrefixes.bucket, Materials.Empty, new ItemStack(Items.bucket, 1, 0));
+ GT_OreDictUnificator.set(OrePrefixes.bucket, Materials.Water, new ItemStack(Items.water_bucket, 1, 0));
+ GT_OreDictUnificator.set(OrePrefixes.bucket, Materials.Lava, new ItemStack(Items.lava_bucket, 1, 0));
+ GT_OreDictUnificator.set(OrePrefixes.bucket, Materials.Milk, new ItemStack(Items.milk_bucket, 1, 0));
+ // Clay buckets handled in gregtech.common.GT_Proxy.onLoad() as they aren't registered until Iguana Tweaks
+ // pre-init.
+
+ GT_OreDictUnificator.set(OrePrefixes.bottle, Materials.Empty, new ItemStack(Items.glass_bottle, 1, 0));
+ GT_OreDictUnificator.set(OrePrefixes.bottle, Materials.Water, new ItemStack(Items.potionitem, 1, 0));
+
+ GT_OreDictUnificator
+ .set(OrePrefixes.plateAlloy, Materials.Iridium, GT_ModHandler.getIC2Item("iridiumPlate", 1L));
+ GT_OreDictUnificator
+ .set(OrePrefixes.plateAlloy, Materials.Advanced, GT_ModHandler.getIC2Item("advancedAlloy", 1L));
+ GT_OreDictUnificator.set(OrePrefixes.plateAlloy, Materials.Carbon, GT_ModHandler.getIC2Item("carbonPlate", 1L));
+
+ GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Coal, new ItemStack(Blocks.coal_ore, 1));
+ GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Iron, new ItemStack(Blocks.iron_ore, 1));
+ GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Lapis, new ItemStack(Blocks.lapis_ore, 1));
+ GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Redstone, new ItemStack(Blocks.redstone_ore, 1));
+ GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Redstone, new ItemStack(Blocks.lit_redstone_ore, 1));
+ GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Gold, new ItemStack(Blocks.gold_ore, 1));
+ GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Diamond, new ItemStack(Blocks.diamond_ore, 1));
+ GT_OreDictUnificator.set(OrePrefixes.ore, Materials.Emerald, new ItemStack(Blocks.emerald_ore, 1));
+ GT_OreDictUnificator.set(OrePrefixes.ore, Materials.NetherQuartz, new ItemStack(Blocks.quartz_ore, 1));
+ GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Copper, GT_ModHandler.getIC2Item("copperIngot", 1L));
+ GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Tin, GT_ModHandler.getIC2Item("tinIngot", 1L));
+ GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Lead, GT_ModHandler.getIC2Item("leadIngot", 1L));
+ GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Bronze, GT_ModHandler.getIC2Item("bronzeIngot", 1L));
+ GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Silver, GT_ModHandler.getIC2Item("silverIngot", 1L));
+ GT_OreDictUnificator.set(OrePrefixes.gem, Materials.Iridium, GT_ModHandler.getIC2Item("iridiumOre", 1L));
+ GT_OreDictUnificator.set(OrePrefixes.gem, Materials.Lapis, new ItemStack(Items.dye, 1, 4));
+ GT_OreDictUnificator.set(OrePrefixes.gem, Materials.EnderEye, new ItemStack(Items.ender_eye, 1));
+ GT_OreDictUnificator.set(OrePrefixes.gem, Materials.EnderPearl, new ItemStack(Items.ender_pearl, 1));
+ GT_OreDictUnificator.set(OrePrefixes.gem, Materials.Diamond, new ItemStack(Items.diamond, 1));
+ GT_OreDictUnificator.set(OrePrefixes.gem, Materials.Emerald, new ItemStack(Items.emerald, 1));
+ GT_OreDictUnificator.set(OrePrefixes.gem, Materials.Coal, new ItemStack(Items.coal, 1, 0));
+ GT_OreDictUnificator.set(OrePrefixes.gem, Materials.Charcoal, new ItemStack(Items.coal, 1, 1));
+ GT_OreDictUnificator.set(OrePrefixes.gem, Materials.NetherQuartz, new ItemStack(Items.quartz, 1));
+ GT_OreDictUnificator.set(OrePrefixes.gem, Materials.NetherStar, new ItemStack(Items.nether_star, 1));
+ GT_OreDictUnificator.set(OrePrefixes.nugget, Materials.Gold, new ItemStack(Items.gold_nugget, 1));
+ GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Gold, new ItemStack(Items.gold_ingot, 1));
+ GT_OreDictUnificator.set(OrePrefixes.ingot, Materials.Iron, new ItemStack(Items.iron_ingot, 1));
+ GT_OreDictUnificator.set(OrePrefixes.plate, Materials.Paper, new ItemStack(Items.paper, 1));
+ GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Sugar, new ItemStack(Items.sugar, 1));
+ GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Bone, ItemList.Dye_Bonemeal.get(1L));
+ GT_OreDictUnificator.set(OrePrefixes.stick, Materials.Wood, new ItemStack(Items.stick, 1));
+ GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Redstone, new ItemStack(Items.redstone, 1));
+ GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Gunpowder, new ItemStack(Items.gunpowder, 1));
+ GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Glowstone, new ItemStack(Items.glowstone_dust, 1));
+ GT_OreDictUnificator.set(OrePrefixes.dust, Materials.Blaze, new ItemStack(Items.blaze_powder, 1));
+ GT_OreDictUnificator.set(OrePrefixes.stick, Materials.Blaze, new ItemStack(Items.blaze_rod, 1));
+ GT_OreDictUnificator.set(OrePrefixes.block, Materials.Iron, new ItemStack(Blocks.iron_block, 1, 0));
+ GT_OreDictUnificator.set(OrePrefixes.block, Materials.Gold, new ItemStack(Blocks.gold_block, 1, 0));
+ GT_OreDictUnificator.set(OrePrefixes.block, Materials.Diamond, new ItemStack(Blocks.diamond_block, 1, 0));
+ GT_OreDictUnificator.set(OrePrefixes.block, Materials.Emerald, new ItemStack(Blocks.emerald_block, 1, 0));
+ GT_OreDictUnificator.set(OrePrefixes.block, Materials.Lapis, new ItemStack(Blocks.lapis_block, 1, 0));
+ GT_OreDictUnificator.set(OrePrefixes.block, Materials.Coal, new ItemStack(Blocks.coal_block, 1, 0));
+ GT_OreDictUnificator.set(OrePrefixes.block, Materials.Redstone, new ItemStack(Blocks.redstone_block, 1, 0));
+ GT_OreDictUnificator.set(OrePrefixes.block, Materials.NetherQuartz, new ItemStack(Blocks.quartz_block, 1, 0));
+ GT_OreDictUnificator.set(OrePrefixes.block, Materials.Clay, new ItemStack(Blocks.clay, 1, 0));
+ if (Blocks.ender_chest != null) {
+ GT_OreDictUnificator.registerOre(OreDictNames.enderChest, new ItemStack(Blocks.ender_chest, 1));
+ }
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingAnvil, new ItemStack(Blocks.anvil, 1));
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingAnvil, GT_ModHandler.getModItem(Railcraft.ID, "anvil", 1L, 0));
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingIndustrialDiamond, ItemList.IC2_Industrial_Diamond.get(1L));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.glass, Materials.Reinforced, GT_ModHandler.getIC2Item("reinforcedGlass", 1L));
+
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.stone, Materials.Basalt, GT_ModHandler.getModItem(Railcraft.ID, "cube", 1L, 6));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.stone, Materials.Marble, GT_ModHandler.getModItem(Railcraft.ID, "cube", 1L, 7));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.stone,
+ Materials.Basalt,
+ GT_ModHandler.getModItem(Railcraft.ID, "brick.abyssal", 1L, 32767));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.stone,
+ Materials.Marble,
+ GT_ModHandler.getModItem(Railcraft.ID, "brick.quarried", 1L, 32767));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.stone, Materials.Obsidian, new ItemStack(Blocks.obsidian, 1, 32767));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Stone, new ItemStack(Blocks.stone, 1, 32767));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stoneMossy, new ItemStack(Blocks.mossy_cobblestone, 1, 32767));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stoneCobble, new ItemStack(Blocks.mossy_cobblestone, 1, 32767));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stoneCobble, new ItemStack(Blocks.cobblestone, 1, 32767));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stoneSmooth, new ItemStack(Blocks.stone, 1, 32767));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stoneBricks, new ItemStack(Blocks.stonebrick, 1, 32767));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stoneMossy, new ItemStack(Blocks.stonebrick, 1, 1));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stoneCracked, new ItemStack(Blocks.stonebrick, 1, 2));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stoneChiseled, new ItemStack(Blocks.stonebrick, 1, 3));
+ GT_OreDictUnificator.registerOre(OrePrefixes.stone, Materials.Sand, new ItemStack(Blocks.sandstone, 1, 32767));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.stone, Materials.Netherrack, new ItemStack(Blocks.netherrack, 1, 32767));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.stone, Materials.NetherBrick, new ItemStack(Blocks.nether_brick, 1, 32767));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.stone, Materials.Endstone, new ItemStack(Blocks.end_stone, 1, 32767));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.stone, Materials.Glowstone, new ItemStack(Blocks.glowstone, 1, 32767));
+
+ GT_OreDictUnificator
+ .registerOre("paperResearchFragment", GT_ModHandler.getModItem(Thaumcraft.ID, "ItemResource", 1L, 9));
+ GT_OreDictUnificator.registerOre(
+ "itemCertusQuartz",
+ GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 1));
+ GT_OreDictUnificator.registerOre(
+ "itemCertusQuartz",
+ GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10));
+ GT_OreDictUnificator.registerOre(
+ "itemNetherQuartz",
+ GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11));
+ GT_OreDictUnificator.registerOre(
+ OreDictNames.craftingQuartz,
+ GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 1));
+ GT_OreDictUnificator.registerOre(
+ OreDictNames.craftingQuartz,
+ GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 10));
+ GT_OreDictUnificator.registerOre(
+ OreDictNames.craftingQuartz,
+ GT_ModHandler.getModItem(AppliedEnergistics2.ID, "item.ItemMultiMaterial", 1L, 11));
+ GT_OreDictUnificator.registerOre("cropLemon", ItemList.FR_Lemon.get(1L));
+ GT_OreDictUnificator.registerOre("cropCoffee", ItemList.IC2_CoffeeBeans.get(1L));
+ GT_OreDictUnificator.registerOre("cropPotato", ItemList.Food_Raw_Potato.get(1L));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.battery, Materials.Basic, GT_ModHandler.getIC2Item("reBattery", 1L));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.battery, Materials.Basic, GT_ModHandler.getIC2Item("chargedReBattery", 1L, 32767));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.battery, Materials.Advanced, GT_ModHandler.getIC2Item("advBattery", 1L, 32767));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.battery, Materials.Elite, GT_ModHandler.getIC2Item("energyCrystal", 1L, 32767));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.battery, Materials.Master, GT_ModHandler.getIC2Item("lapotronCrystal", 1L, 32767));
+
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingWireCopper, GT_ModHandler.getIC2Item("insulatedCopperCableItem", 1L));
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingWireGold, GT_ModHandler.getIC2Item("insulatedGoldCableItem", 1L));
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingWireIron, GT_ModHandler.getIC2Item("insulatedIronCableItem", 1L));
+ GT_OreDictUnificator.registerOre(
+ OreDictNames.craftingWireTin,
+ GT_ModHandler
+ .getIC2Item("insulatedTinCableItem", 1L, GT_ModHandler.getIC2Item("insulatedCopperCableItem", 1L)));
+
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingRedstoneTorch, new ItemStack(Blocks.redstone_torch, 1, 32767));
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingRedstoneTorch, new ItemStack(Blocks.unlit_redstone_torch, 1, 32767));
+
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingWorkBench, new ItemStack(Blocks.crafting_table, 1));
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingWorkBench, new ItemStack(GregTech_API.sBlockMachines, 1, 16));
+
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingPiston, new ItemStack(Blocks.piston, 1, 32767));
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingPiston, new ItemStack(Blocks.sticky_piston, 1, 32767));
+
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingSafe, new ItemStack(GregTech_API.sBlockMachines, 1, 45));
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingSafe, GT_ModHandler.getIC2Item("personalSafe", 1L));
+
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingChest, new ItemStack(Blocks.chest, 1, 32767));
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingChest, new ItemStack(Blocks.trapped_chest, 1, 32767));
+
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingFurnace, new ItemStack(Blocks.furnace, 1, 32767));
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingFurnace, new ItemStack(Blocks.lit_furnace, 1, 32767));
+
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingPump, GT_ModHandler.getIC2Item("pump", 1L));
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingElectromagnet, GT_ModHandler.getIC2Item("magnetizer", 1L));
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingTeleporter, GT_ModHandler.getIC2Item("teleporter", 1L));
+
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingMacerator, GT_ModHandler.getIC2Item("macerator", 1L));
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingMacerator, new ItemStack(GregTech_API.sBlockMachines, 1, 50));
+
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingExtractor, GT_ModHandler.getIC2Item("extractor", 1L));
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingExtractor, new ItemStack(GregTech_API.sBlockMachines, 1, 51));
+
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingCompressor, GT_ModHandler.getIC2Item("compressor", 1L));
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingCompressor, new ItemStack(GregTech_API.sBlockMachines, 1, 52));
+
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingRecycler, GT_ModHandler.getIC2Item("recycler", 1L));
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingRecycler, new ItemStack(GregTech_API.sBlockMachines, 1, 53));
+
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingIronFurnace, GT_ModHandler.getIC2Item("ironFurnace", 1L));
+
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingCentrifuge, new ItemStack(GregTech_API.sBlockMachines, 1, 62));
+
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingInductionFurnace, GT_ModHandler.getIC2Item("inductionFurnace", 1L));
+
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingElectricFurnace, GT_ModHandler.getIC2Item("electroFurnace", 1L));
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingElectricFurnace, new ItemStack(GregTech_API.sBlockMachines, 1, 54));
+
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingGenerator, GT_ModHandler.getIC2Item("generator", 1L));
+
+ GT_OreDictUnificator
+ .registerOre(OreDictNames.craftingGeothermalGenerator, GT_ModHandler.getIC2Item("geothermalGenerator", 1L));
+
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingFeather, new ItemStack(Items.feather, 1, 32767));
+ GT_OreDictUnificator.registerOre(
+ OreDictNames.craftingFeather,
+ GT_ModHandler.getModItem(TwilightForest.ID, "item.tfFeather", 1L, 32767));
+
+ GT_OreDictUnificator.registerOre("itemWheat", new ItemStack(Items.wheat, 1, 32767));
+ GT_OreDictUnificator.registerOre("paperEmpty", new ItemStack(Items.paper, 1, 32767));
+ GT_OreDictUnificator.registerOre("paperMap", new ItemStack(Items.map, 1, 32767));
+ GT_OreDictUnificator.registerOre("paperMap", new ItemStack(Items.filled_map, 1, 32767));
+ GT_OreDictUnificator.registerOre("bookEmpty", new ItemStack(Items.book, 1, 32767));
+ GT_OreDictUnificator.registerOre("bookWritable", new ItemStack(Items.writable_book, 1, 32767));
+ GT_OreDictUnificator.registerOre("bookWritten", new ItemStack(Items.written_book, 1, 32767));
+ GT_OreDictUnificator.registerOre("bookEnchanted", new ItemStack(Items.enchanted_book, 1, 32767));
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingBook, new ItemStack(Items.book, 1, 32767));
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingBook, new ItemStack(Items.writable_book, 1, 32767));
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingBook, new ItemStack(Items.written_book, 1, 32767));
+ GT_OreDictUnificator.registerOre(OreDictNames.craftingBook, new ItemStack(Items.enchanted_book, 1, 32767));
+
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.circuit, Materials.Basic, GT_ModHandler.getIC2Item("electronicCircuit", 1L));
+ GT_OreDictUnificator
+ .registerOre(OrePrefixes.circuit, Materials.Advanced, GT_ModHandler.getIC2Item("advancedCircuit", 1L));
+
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Copper,
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 0));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Tin,
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 1));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Bronze,
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 2));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Gold,
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 3));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Iron,
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 4));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Steel,
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 5));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Lead,
+ GT_ModHandler.getModItem(IndustrialCraft2.ID, "itemCasing", 1L, 6));
+
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Osmium,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.OsmiumItemCasing", 1L, 0));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Aluminium,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.AluminiumItemCasing", 1L, 0));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.StainlessSteel,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.StainlessSteelItemCasing", 1L, 0));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Tungsten,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TungstenItemCasing", 1L, 0));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Neutronium,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.NeutroniumItemCasing", 1L, 0));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.TungstenSteel,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TungstenSteelItemCasing", 1L, 0));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Iridium,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.IridiumItemCasing", 1L, 0));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Titanium,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.TitaniumItemCasing", 1L, 0));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.itemCasing,
+ Materials.Chrome,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.ChromeItemCasing", 1L, 0));
+
+ // Fake Circuits
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.circuit,
+ Materials.Primitive,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitULV", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.circuit,
+ Materials.Good,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitMV", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.circuit,
+ Materials.Data,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitEV", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.circuit,
+ Materials.Elite,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitIV", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.circuit,
+ Materials.Master,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitLuV", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.circuit,
+ Materials.Ultimate,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitZPM", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.circuit,
+ Materials.SuperconductorUHV,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUV", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.circuit,
+ Materials.Infinite,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUHV", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.circuit,
+ Materials.Bio,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUEV", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.circuit,
+ Materials.Optical,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUIV", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.circuit,
+ Materials.Exotic,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUMV", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.circuit,
+ Materials.Cosmic,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitUXV", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.circuit,
+ Materials.Transcendent,
+ GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.CircuitMAX", 1L));
+
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.block,
+ MaterialsBotania.Manasteel,
+ GT_ModHandler.getModItem(Botania.ID, "storage", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.block,
+ MaterialsBotania.Terrasteel,
+ GT_ModHandler.getModItem(Botania.ID, "storage", 1L, 1));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.ingot,
+ MaterialsBotania.ElvenElementium,
+ GT_ModHandler.getModItem(Botania.ID, "manaResource", 1L, 7));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.nugget,
+ MaterialsBotania.ElvenElementium,
+ GT_ModHandler.getModItem(Botania.ID, "manaResource", 1L, 19));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.block,
+ MaterialsBotania.ElvenElementium,
+ GT_ModHandler.getModItem(Botania.ID, "storage", 1L, 2));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.block,
+ MaterialsBotania.Livingrock,
+ GT_ModHandler.getModItem(Botania.ID, "livingrock", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.ingot,
+ MaterialsBotania.GaiaSpirit,
+ GT_ModHandler.getModItem(Botania.ID, "manaResource", 1L, 14));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.block,
+ MaterialsBotania.Livingwood,
+ GT_ModHandler.getModItem(Botania.ID, "livingwood", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.block,
+ MaterialsBotania.Dreamwood,
+ GT_ModHandler.getModItem(Botania.ID, "dreamwood", 1L));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.gem,
+ MaterialsBotania.ManaDiamond,
+ GT_ModHandler.getModItem(Botania.ID, "manaResource", 1L, 2));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.block,
+ MaterialsBotania.ManaDiamond,
+ GT_ModHandler.getModItem(Botania.ID, "storage", 1L, 3));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.gem,
+ MaterialsBotania.BotaniaDragonstone,
+ GT_ModHandler.getModItem(Botania.ID, "manaResource", 1L, 9));
+ GT_OreDictUnificator.registerOre(
+ OrePrefixes.block,
+ MaterialsBotania.BotaniaDragonstone,
+ GT_ModHandler.getModItem(Botania.ID, "storage", 1L, 4));
+ }
+}
diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_OreProcessing.java b/src/main/java/gregtech/loaders/preload/GT_Loader_OreProcessing.java
new file mode 100644
index 0000000000..116b6928e4
--- /dev/null
+++ b/src/main/java/gregtech/loaders/preload/GT_Loader_OreProcessing.java
@@ -0,0 +1,115 @@
+package gregtech.loaders.preload;
+
+import gregtech.api.util.GT_Log;
+import gregtech.loaders.oreprocessing.ProcessingAll;
+import gregtech.loaders.oreprocessing.ProcessingArrows;
+import gregtech.loaders.oreprocessing.ProcessingBeans;
+import gregtech.loaders.oreprocessing.ProcessingBlock;
+import gregtech.loaders.oreprocessing.ProcessingBolt;
+import gregtech.loaders.oreprocessing.ProcessingCell;
+import gregtech.loaders.oreprocessing.ProcessingCircuit;
+import gregtech.loaders.oreprocessing.ProcessingCompressed;
+import gregtech.loaders.oreprocessing.ProcessingCrafting;
+import gregtech.loaders.oreprocessing.ProcessingCrate;
+import gregtech.loaders.oreprocessing.ProcessingCrop;
+import gregtech.loaders.oreprocessing.ProcessingCrushedOre;
+import gregtech.loaders.oreprocessing.ProcessingCrystallized;
+import gregtech.loaders.oreprocessing.ProcessingDirty;
+import gregtech.loaders.oreprocessing.ProcessingDust;
+import gregtech.loaders.oreprocessing.ProcessingDye;
+import gregtech.loaders.oreprocessing.ProcessingFineWire;
+import gregtech.loaders.oreprocessing.ProcessingFoil;
+import gregtech.loaders.oreprocessing.ProcessingFood;
+import gregtech.loaders.oreprocessing.ProcessingGear;
+import gregtech.loaders.oreprocessing.ProcessingGem;
+import gregtech.loaders.oreprocessing.ProcessingIngot;
+import gregtech.loaders.oreprocessing.ProcessingItem;
+import gregtech.loaders.oreprocessing.ProcessingLens;
+import gregtech.loaders.oreprocessing.ProcessingLog;
+import gregtech.loaders.oreprocessing.ProcessingNugget;
+import gregtech.loaders.oreprocessing.ProcessingOre;
+import gregtech.loaders.oreprocessing.ProcessingOrePoor;
+import gregtech.loaders.oreprocessing.ProcessingOreSmelting;
+import gregtech.loaders.oreprocessing.ProcessingPipe;
+import gregtech.loaders.oreprocessing.ProcessingPlank;
+import gregtech.loaders.oreprocessing.ProcessingPlate;
+import gregtech.loaders.oreprocessing.ProcessingPure;
+import gregtech.loaders.oreprocessing.ProcessingRawOre;
+import gregtech.loaders.oreprocessing.ProcessingRecycling;
+import gregtech.loaders.oreprocessing.ProcessingRotor;
+import gregtech.loaders.oreprocessing.ProcessingRound;
+import gregtech.loaders.oreprocessing.ProcessingSand;
+import gregtech.loaders.oreprocessing.ProcessingSaplings;
+import gregtech.loaders.oreprocessing.ProcessingScrew;
+import gregtech.loaders.oreprocessing.ProcessingShaping;
+import gregtech.loaders.oreprocessing.ProcessingSlab;
+import gregtech.loaders.oreprocessing.ProcessingStick;
+import gregtech.loaders.oreprocessing.ProcessingStickLong;
+import gregtech.loaders.oreprocessing.ProcessingStone;
+import gregtech.loaders.oreprocessing.ProcessingStoneCobble;
+import gregtech.loaders.oreprocessing.ProcessingStoneVarious;
+import gregtech.loaders.oreprocessing.ProcessingToolHead;
+import gregtech.loaders.oreprocessing.ProcessingToolOther;
+import gregtech.loaders.oreprocessing.ProcessingTransforming;
+import gregtech.loaders.oreprocessing.ProcessingWax;
+import gregtech.loaders.oreprocessing.ProcessingWire;
+
+public class GT_Loader_OreProcessing implements Runnable {
+
+ @Override
+ public void run() {
+ GT_Log.out.println("GT_Mod: Register Ore processing.");
+ new ProcessingAll();
+ new ProcessingArrows();
+ new ProcessingBeans();
+ new ProcessingBlock();
+ new ProcessingBolt();
+ new ProcessingCell();
+ new ProcessingCrate();
+ new ProcessingCircuit();
+ new ProcessingCompressed();
+ new ProcessingCrafting();
+ new ProcessingCrop();
+ new ProcessingCrushedOre();
+ new ProcessingCrystallized();
+ new ProcessingDirty();
+ new ProcessingDust();
+ new ProcessingDye();
+ new ProcessingFoil();
+ new ProcessingFineWire();
+ new ProcessingFood();
+ new ProcessingLens();
+ new ProcessingShaping();
+ new ProcessingGem();
+ new ProcessingGear();
+ new ProcessingIngot();
+ new ProcessingItem();
+ new ProcessingLog();
+ new ProcessingTransforming();
+ new ProcessingNugget();
+ new ProcessingOre();
+ new ProcessingOrePoor();
+ new ProcessingOreSmelting();
+ new ProcessingRawOre();
+ new ProcessingPipe();
+ new ProcessingPlank();
+ new ProcessingPlate();
+ new ProcessingPure();
+ new ProcessingRecycling();
+ new ProcessingRound();
+ new ProcessingRotor();
+ new ProcessingSand();
+ new ProcessingSaplings();
+ new ProcessingScrew();
+ new ProcessingSlab();
+ new ProcessingStick();
+ new ProcessingStickLong();
+ new ProcessingStone();
+ new ProcessingStoneCobble();
+ new ProcessingStoneVarious();
+ new ProcessingToolHead();
+ new ProcessingToolOther();
+ new ProcessingWax();
+ new ProcessingWire();
+ }
+}
diff --git a/src/main/java/gregtech/loaders/preload/GT_PreLoad.java b/src/main/java/gregtech/loaders/preload/GT_PreLoad.java
new file mode 100644
index 0000000000..bbbb9af59d
--- /dev/null
+++ b/src/main/java/gregtech/loaders/preload/GT_PreLoad.java
@@ -0,0 +1,967 @@
+package gregtech.loaders.preload;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.enums.Mods.Avaritia;
+import static gregtech.api.enums.Mods.CraftTweaker;
+import static gregtech.api.enums.Mods.EnderIO;
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.enums.Mods.GalacticraftCore;
+import static gregtech.api.enums.Mods.GregTech;
+import static gregtech.api.enums.Mods.HodgePodge;
+import static gregtech.api.enums.Mods.IndustrialCraft2Classic;
+import static gregtech.api.enums.Mods.TinkerConstruct;
+import static gregtech.api.enums.Mods.Translocator;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.PrintStream;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.init.Blocks;
+import net.minecraft.launchwrapper.Launch;
+import net.minecraftforge.common.config.Configuration;
+
+import org.apache.commons.lang3.StringUtils;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.common.LoadController;
+import cpw.mods.fml.common.Loader;
+import cpw.mods.fml.common.ModContainer;
+import cpw.mods.fml.common.discovery.ASMDataTable;
+import cpw.mods.fml.common.discovery.ModDiscoverer;
+import gregtech.GT_Mod;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ConfigCategories;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.recipe.RecipeCategory;
+import gregtech.api.recipe.RecipeCategoryHolder;
+import gregtech.api.recipe.RecipeCategorySetting;
+import gregtech.api.util.GT_Config;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_RecipeBuilder;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.GT_Proxy;
+import gregtech.common.tileentities.machines.long_distance.GT_MetaTileEntity_LongDistancePipelineBase;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_Cleanroom;
+
+public class GT_PreLoad {
+
+ public static void sortToTheEnd() {
+ if (GT_Mod.gregtechproxy.mSortToTheEnd) {
+ try {
+ GT_FML_LOGGER.info("GT_Mod: Sorting GregTech to the end of the Mod List for further processing.");
+ LoadController tLoadController = (LoadController) GT_Utility
+ .getFieldContent(Loader.instance(), "modController", true, true);
+ assert tLoadController != null;
+ List<ModContainer> tModList = tLoadController.getActiveModList();
+ List<ModContainer> tNewModsList = new ArrayList<>();
+ ModContainer tGregTech = null;
+ short tModList_sS = (short) tModList.size();
+ for (short i = 0; i < tModList_sS; i = (short) (i + 1)) {
+ ModContainer tMod = tModList.get(i);
+ if (tMod.getModId()
+ .equalsIgnoreCase(GregTech.ID)) {
+ tGregTech = tMod;
+ } else {
+ tNewModsList.add(tMod);
+ }
+ }
+ if (tGregTech != null) {
+ tNewModsList.add(tGregTech);
+ }
+ Objects.requireNonNull(GT_Utility.getField(tLoadController, "activeModList", true, true))
+ .set(tLoadController, tNewModsList);
+ } catch (Throwable e) {
+ GT_Mod.logStackTrace(e);
+ }
+ }
+ }
+
+ public static void initLocalization(File languageDir) {
+ GT_FML_LOGGER.info("GT_Mod: Generating Lang-File");
+
+ if (FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isClient()) {
+ String userLang = Minecraft.getMinecraft()
+ .getLanguageManager()
+ .getCurrentLanguage()
+ .getLanguageCode();
+ GT_FML_LOGGER.info("User lang is " + userLang);
+ if (userLang.equals("en_US")) {
+ GT_FML_LOGGER.info("Loading GregTech.lang");
+ GT_LanguageManager.isEN_US = true;
+ GT_LanguageManager.sEnglishFile = new Configuration(new File(languageDir, "GregTech.lang"));
+ } else {
+ String l10nFileName = "GregTech_" + userLang + ".lang";
+ File l10nFile = new File(languageDir, l10nFileName);
+ if (l10nFile.isFile()) {
+ GT_FML_LOGGER.info("Loading l10n file: " + l10nFileName);
+ GT_LanguageManager.sEnglishFile = new Configuration(l10nFile);
+ } else {
+ GT_FML_LOGGER.info("Cannot find l10n file " + l10nFileName + ", fallback to GregTech.lang");
+ GT_LanguageManager.isEN_US = true;
+ GT_LanguageManager.sEnglishFile = new Configuration(new File(languageDir, "GregTech.lang"));
+ }
+ }
+ } else {
+ GT_LanguageManager.isEN_US = true;
+ GT_LanguageManager.sEnglishFile = new Configuration(new File(languageDir, "GregTech.lang"));
+ }
+ GT_LanguageManager.sEnglishFile.load();
+
+ Materials.getMaterialsMap()
+ .values()
+ .parallelStream()
+ .filter(Objects::nonNull)
+ .forEach(
+ aMaterial -> aMaterial.mLocalizedName = GT_LanguageManager
+ .addStringLocalization("Material." + aMaterial.mName.toLowerCase(), aMaterial.mDefaultLocalName));
+ }
+
+ public static Configuration getConfiguration(File configDir) {
+ File tFile = new File(new File(configDir, "GregTech"), "GregTech.cfg");
+ Configuration tMainConfig = new Configuration(tFile);
+ tMainConfig.load();
+ tFile = new File(new File(configDir, "GregTech"), "IDs.cfg");
+ GT_Config.sConfigFileIDs = new Configuration(tFile);
+ GT_Config.sConfigFileIDs.load();
+ GT_Config.sConfigFileIDs.save();
+ GregTech_API.sMachineFile = new GT_Config(
+ new Configuration(new File(new File(configDir, "GregTech"), "MachineStats.cfg")));
+ GregTech_API.sWorldgenFile = new GT_Config(
+ new Configuration(new File(new File(configDir, "GregTech"), "WorldGeneration.cfg")));
+ GregTech_API.sMaterialProperties = new GT_Config(
+ new Configuration(new File(new File(configDir, "GregTech"), "MaterialProperties.cfg")));
+ GregTech_API.sUnification = new GT_Config(
+ new Configuration(new File(new File(configDir, "GregTech"), "Unification.cfg")));
+ GregTech_API.sSpecialFile = new GT_Config(
+ new Configuration(new File(new File(configDir, "GregTech"), "Other.cfg")));
+ GregTech_API.sOPStuff = new GT_Config(
+ new Configuration(new File(new File(configDir, "GregTech"), "OverpoweredStuff.cfg")));
+
+ GregTech_API.sClientDataFile = new GT_Config(
+ new Configuration(new File(new File(configDir, "GregTech"), "Client.cfg")));
+ return tMainConfig;
+ }
+
+ public static void initCompat() {
+ GregTech_API.mIC2Classic = IndustrialCraft2Classic.isModLoaded();
+ GregTech_API.mGTPlusPlus = GTPlusPlus.isModLoaded();
+ GregTech_API.mTranslocator = Translocator.isModLoaded();
+ GregTech_API.mTConstruct = TinkerConstruct.isModLoaded();
+ GregTech_API.mGalacticraft = GalacticraftCore.isModLoaded();
+ GregTech_API.mHodgepodge = HodgePodge.isModLoaded();
+ GregTech_API.mAvaritia = Avaritia.isModLoaded();
+ }
+
+ public static void createLogFiles(File parentFile, Configuration tMainConfig) {
+ GT_Log.mLogFile = new File(parentFile, "logs/GregTech.log");
+ if (!GT_Log.mLogFile.exists()) {
+ try {
+ GT_Log.mLogFile.createNewFile();
+ } catch (Throwable ignored) {}
+ }
+ try {
+ GT_Log.out = GT_Log.err = new PrintStream(GT_Log.mLogFile);
+ } catch (FileNotFoundException ignored) {}
+
+ if (tMainConfig.get(GT_Mod.aTextGeneral, "LoggingOreDict", false)
+ .getBoolean(false)) {
+ GT_Log.mOreDictLogFile = new File(parentFile, "logs/OreDict.log");
+ if (!GT_Log.mOreDictLogFile.exists()) {
+ try {
+ GT_Log.mOreDictLogFile.createNewFile();
+ } catch (Throwable ignored) {}
+ }
+ List<String> tList = ((GT_Log.LogBuffer) GT_Log.ore).mBufferedOreDictLog;
+ try {
+ GT_Log.ore = new PrintStream(GT_Log.mOreDictLogFile);
+ } catch (Throwable ignored) {}
+ GT_Log.ore.println("******************************************************************************");
+ GT_Log.ore.println("* This is the complete log of the GT5-Unofficial OreDictionary Handler. It *");
+ GT_Log.ore.println("* processes all OreDictionary entries and can sometimes cause errors. All *");
+ GT_Log.ore.println("* entries and errors are being logged. If you see an error please raise an *");
+ GT_Log.ore.println("* issue at https://github.com/GTNewHorizons/GT-New-Horizons-Modpack/issues. *");
+ GT_Log.ore.println("******************************************************************************");
+ tList.forEach(GT_Log.ore::println);
+ }
+ if (tMainConfig.get(GT_Mod.aTextGeneral, "LoggingExplosions", true)
+ .getBoolean(true)) {
+ GT_Log.mExplosionLog = new File(parentFile, "logs/Explosion.log");
+ if (!GT_Log.mExplosionLog.exists()) {
+ try {
+ GT_Log.mExplosionLog.createNewFile();
+ } catch (Throwable ignored) {}
+ }
+ try {
+ GT_Log.exp = new PrintStream(GT_Log.mExplosionLog);
+ } catch (Throwable ignored) {}
+ }
+
+ if (tMainConfig.get(GT_Mod.aTextGeneral, "LoggingPlayerActivity", true)
+ .getBoolean(true)) {
+ GT_Log.mPlayerActivityLogFile = new File(parentFile, "logs/PlayerActivity.log");
+ if (!GT_Log.mPlayerActivityLogFile.exists()) {
+ try {
+ GT_Log.mPlayerActivityLogFile.createNewFile();
+ } catch (Throwable ignored) {}
+ }
+ try {
+ GT_Log.pal = new PrintStream(GT_Log.mPlayerActivityLogFile);
+ } catch (Throwable ignored) {}
+ }
+ }
+
+ public static void runMineTweakerCompat() {
+ if (!CraftTweaker.isModLoaded()) return;
+
+ GT_FML_LOGGER.info("preReader");
+ final List<String> oreTags = new ArrayList<>();
+ final File globalDir = new File("scripts");
+ if (globalDir.exists()) {
+ final List<String> scripts = new ArrayList<>();
+ for (File file : Objects.requireNonNull(globalDir.listFiles())) {
+ if (file.getName()
+ .endsWith(".zs")) {
+ try (BufferedReader br = new BufferedReader(new FileReader(file))) {
+ String line;
+ while ((line = br.readLine()) != null) {
+ scripts.add(line);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ String pattern1 = "<";
+ String pattern2 = ">";
+
+ Pattern p = Pattern.compile(Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2));
+ for (String text : scripts) {
+ Matcher m = p.matcher(text);
+ while (m.find()) {
+ String hit = m.group(1);
+ if (hit.startsWith("ore:")) {
+ hit = hit.substring(4);
+ if (!oreTags.contains(hit)) oreTags.add(hit);
+ } else if (hit.startsWith("gregtech:gt.metaitem.0")) {
+ hit = hit.substring(22);
+ int mIt = Integer.parseInt(hit.substring(0, 1));
+ if (mIt > 0) {
+ int meta = 0;
+ try {
+ hit = hit.substring(2);
+ meta = Integer.parseInt(hit);
+ } catch (Exception e) {
+ GT_FML_LOGGER.info("parseError: " + hit);
+ }
+ if (meta > 0 && meta < 32000) {
+ int prefix = meta / 1000;
+ int material = meta % 1000;
+ String tag = "";
+ String[] tags = new String[] {};
+ if (mIt == 1) tags = new String[] { "dustTiny", "dustSmall", "dust", "dustImpure",
+ "dustPure", "crushed", "crushedPurified", "crushedCentrifuged", "gem", "nugget",
+ null, "ingot", "ingotHot", "ingotDouble", "ingotTriple", "ingotQuadruple",
+ "ingotQuintuple", "plate", "plateDouble", "plateTriple", "plateQuadruple",
+ "plateQuintuple", "plateDense", "stick", "lens", "round", "bolt", "screw", "ring",
+ "foil", "cell", "cellPlasma", "cellMolten", "rawOre" };
+ if (mIt == 2) tags = new String[] { "toolHeadSword", "toolHeadPickaxe",
+ "toolHeadShovel", "toolHeadAxe", "toolHeadHoe", "toolHeadHammer", "toolHeadFile",
+ "toolHeadSaw", "toolHeadDrill", "toolHeadChainsaw", "toolHeadWrench",
+ "toolHeadUniversalSpade", "toolHeadSense", "toolHeadPlow", "toolHeadArrow",
+ "toolHeadBuzzSaw", "turbineBlade", null, null, "wireFine", "gearGtSmall", "rotor",
+ "stickLong", "springSmall", "spring", "arrowGtWood", "arrowGtPlastic", "gemChipped",
+ "gemFlawed", "gemFlawless", "gemExquisite", "gearGt" };
+ if (mIt == 3) tags = new String[] { "crateGtDust", "crateGtIngot", "crateGtGem",
+ "crateGtPlate", "itemCasing", "nanite" };
+ if (tags.length > prefix) tag = tags[prefix];
+ if (GregTech_API.sGeneratedMaterials[material] != null) {
+ tag += GregTech_API.sGeneratedMaterials[material].mName;
+ if (!oreTags.contains(tag)) oreTags.add(tag);
+ } else if (material > 0) {
+ GT_FML_LOGGER.info("MaterialDisabled: " + material + " " + m.group(1));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ final String[] preS = new String[] { "dustTiny", "dustSmall", "dust", "dustImpure", "dustPure", "crushed",
+ "crushedPurified", "crushedCentrifuged", "gem", "nugget", "ingot", "ingotHot", "ingotDouble", "ingotTriple",
+ "ingotQuadruple", "ingotQuintuple", "plate", "plateDouble", "plateTriple", "plateQuadruple",
+ "plateQuintuple", "plateDense", "stick", "lens", "round", "bolt", "screw", "ring", "foil", "cell",
+ "cellPlasma", "toolHeadSword", "toolHeadPickaxe", "toolHeadShovel", "toolHeadAxe", "toolHeadHoe",
+ "toolHeadHammer", "toolHeadFile", "toolHeadSaw", "toolHeadDrill", "toolHeadChainsaw", "toolHeadWrench",
+ "toolHeadUniversalSpade", "toolHeadSense", "toolHeadPlow", "toolHeadArrow", "toolHeadBuzzSaw",
+ "turbineBlade", "wireFine", "gearGtSmall", "rotor", "stickLong", "springSmall", "spring", "arrowGtWood",
+ "arrowGtPlastic", "gemChipped", "gemFlawed", "gemFlawless", "gemExquisite", "gearGt", "crateGtDust",
+ "crateGtIngot", "crateGtGem", "crateGtPlate", "nanite", "cellMolten", "rawOre" };
+
+ List<String> mMTTags = new ArrayList<>();
+ oreTags.stream()
+ .filter(test -> StringUtils.startsWithAny(test, preS))
+ .forEach(test -> {
+ mMTTags.add(test);
+ if (GT_Values.D1) GT_FML_LOGGER.info("oretag: " + test);
+ });
+
+ GT_FML_LOGGER.info("reenableMetaItems");
+
+ for (String reEnable : mMTTags) {
+ OrePrefixes tPrefix = OrePrefixes.getOrePrefix(reEnable);
+ if (tPrefix != null) {
+ Materials tName = Materials.get(reEnable.replaceFirst(tPrefix.toString(), ""));
+ if (tName != null) {
+ tPrefix.mDisabledItems.remove(tName);
+ tPrefix.mGeneratedItems.add(tName);
+ if (tPrefix == OrePrefixes.screw) {
+ OrePrefixes.bolt.mDisabledItems.remove(tName);
+ OrePrefixes.bolt.mGeneratedItems.add(tName);
+ OrePrefixes.stick.mDisabledItems.remove(tName);
+ OrePrefixes.stick.mGeneratedItems.add(tName);
+ }
+ if (tPrefix == OrePrefixes.round) {
+ OrePrefixes.nugget.mDisabledItems.remove(tName);
+ OrePrefixes.nugget.mGeneratedItems.add(tName);
+ }
+ if (tPrefix == OrePrefixes.spring) {
+ OrePrefixes.stickLong.mDisabledItems.remove(tName);
+ OrePrefixes.stickLong.mGeneratedItems.add(tName);
+ OrePrefixes.stick.mDisabledItems.remove(tName);
+ OrePrefixes.stick.mGeneratedItems.add(tName);
+ }
+ if (tPrefix == OrePrefixes.springSmall) {
+ OrePrefixes.stick.mDisabledItems.remove(tName);
+ OrePrefixes.stick.mGeneratedItems.add(tName);
+ }
+ if (tPrefix == OrePrefixes.stickLong) {
+ OrePrefixes.stick.mDisabledItems.remove(tName);
+ OrePrefixes.stick.mGeneratedItems.add(tName);
+ }
+ if (tPrefix == OrePrefixes.rotor) {
+ OrePrefixes.ring.mDisabledItems.remove(tName);
+ OrePrefixes.ring.mGeneratedItems.add(tName);
+ }
+ } else {
+ GT_FML_LOGGER.info("noMaterial " + reEnable);
+ }
+ } else {
+ GT_FML_LOGGER.info("noPrefix " + reEnable);
+ }
+ }
+ }
+
+ public static void adjustScrap() {
+ GT_FML_LOGGER.info("GT_Mod: Removing all original Scrapbox Drops.");
+ try {
+ Objects.requireNonNull(GT_Utility.getField("ic2.core.item.ItemScrapbox$Drop", "topChance", true, true))
+ .set(null, 0);
+ ((List<?>) Objects.requireNonNull(
+ GT_Utility.getFieldContent(
+ GT_Utility.getFieldContent("ic2.api.recipe.Recipes", "scrapboxDrops", true, true),
+ "drops",
+ true,
+ true))).clear();
+ } catch (Throwable e) {
+ if (GT_Values.D1) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ GT_Log.out.println("GT_Mod: Adding Scrap with a Weight of 200.0F to the Scrapbox Drops.");
+ GT_ModHandler.addScrapboxDrop(200.0F, GT_ModHandler.getIC2Item("scrap", 1L));
+ }
+
+ public static void loadConfig(Configuration tMainConfig) {
+ GT_Values.D1 = tMainConfig.get(GT_Mod.aTextGeneral, "Debug", false)
+ .getBoolean(false);
+ GT_Values.D2 = tMainConfig.get(GT_Mod.aTextGeneral, "Debug2", false)
+ .getBoolean(false);
+ GT_Values.allow_broken_recipemap = tMainConfig.get(GT_Mod.aTextGeneral, "debug allow broken recipemap", false)
+ .getBoolean(false);
+ GT_Values.debugCleanroom = tMainConfig.get(GT_Mod.aTextGeneral, "debugCleanroom", false)
+ .getBoolean(false);
+ GT_Values.debugDriller = tMainConfig.get(GT_Mod.aTextGeneral, "debugDriller", false)
+ .getBoolean(false);
+ GT_Values.debugWorldGen = tMainConfig.get(GT_Mod.aTextGeneral, "debugWorldGen", false)
+ .getBoolean(false);
+ GT_Values.debugOrevein = tMainConfig.get(GT_Mod.aTextGeneral, "debugOrevein", false)
+ .getBoolean(false);
+ GT_Values.debugSmallOres = tMainConfig.get(GT_Mod.aTextGeneral, "debugSmallOres", false)
+ .getBoolean(false);
+ GT_Values.debugStones = tMainConfig.get(GT_Mod.aTextGeneral, "debugStones", false)
+ .getBoolean(false);
+ GT_Values.debugBlockMiner = tMainConfig.get(GT_Mod.aTextGeneral, "debugBlockMiner", false)
+ .getBoolean(false);
+ GT_Values.debugBlockPump = tMainConfig.get(GT_Mod.aTextGeneral, "debugBlockPump", false)
+ .getBoolean(false);
+ GT_Values.debugEntityCramming = tMainConfig.get(GT_Mod.aTextGeneral, "debugEntityCramming", false)
+ .getBoolean(false);
+ GT_Values.debugWorldData = tMainConfig.get(GT_Mod.aTextGeneral, "debugWorldData", false)
+ .getBoolean(false);
+ GT_Values.oreveinPercentage = tMainConfig.get(GT_Mod.aTextGeneral, "oreveinPercentage_100", 100)
+ .getInt(100);
+ GT_Values.oreveinAttempts = tMainConfig.get(GT_Mod.aTextGeneral, "oreveinAttempts_64", 64)
+ .getInt(64);
+ GT_Values.oreveinMaxPlacementAttempts = tMainConfig.get(GT_Mod.aTextGeneral, "oreveinMaxPlacementAttempts_8", 8)
+ .getInt(8);
+ GT_Values.oreveinPlacerOres = tMainConfig.get(GT_Mod.aTextGeneral, "oreveinPlacerOres", true)
+ .getBoolean(true);
+ GT_Values.oreveinPlacerOresMultiplier = tMainConfig.get(GT_Mod.aTextGeneral, "oreveinPlacerOresMultiplier", 2)
+ .getInt(2);
+ // GT_Values.oreveinMaxSize = tMainConfig.get(aTextGeneral, "oreveinMaxSize_64",64).getInt(64);
+ GT_Values.ticksBetweenSounds = tMainConfig.get("machines", "TicksBetweenSounds", 30)
+ .getInt(30);
+ GT_Values.cleanroomGlass = (float) tMainConfig.get("machines", "ReinforcedGlassPercentageForCleanroom", 5D)
+ .getDouble(5D);
+ GT_Values.enableChunkloaders = tMainConfig.get("machines", "enableChunkloaders", true)
+ .getBoolean(true);
+ GT_Values.alwaysReloadChunkloaders = tMainConfig.get("machines", "alwaysReloadChunkloaders", false)
+ .getBoolean(false);
+ GT_Values.debugChunkloaders = tMainConfig.get("machines", "debugChunkloaders", false)
+ .getBoolean(false);
+ GT_Values.disableDigitalChestsExternalAccess = tMainConfig
+ .get("machines", "disableDigitalChestsExternalAccess", false)
+ .getBoolean(false);
+ GT_Values.enableMultiTileEntities = tMainConfig.get(
+ "machines",
+ "enableMultiTileEntities",
+ false,
+ "This enabled MuTEs(multitile entities) to be added to the game. MuTEs are in the start of development and its not recommended to enable them unless you know what you are doing.")
+ .getBoolean(false)
+ // Make sure MuTEs are enabled in development
+ || (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment");
+ GregTech_API.TICKS_FOR_LAG_AVERAGING = tMainConfig
+ .get(GT_Mod.aTextGeneral, "TicksForLagAveragingWithScanner", 25)
+ .getInt(25);
+ GregTech_API.MILLISECOND_THRESHOLD_UNTIL_LAG_WARNING = tMainConfig
+ .get(GT_Mod.aTextGeneral, "MillisecondsPassedInGTTileEntityUntilLagWarning", 100)
+ .getInt(100);
+ if (tMainConfig.get(GT_Mod.aTextGeneral, "disable_STDOUT", false)
+ .getBoolean(false)) {
+ GT_FML_LOGGER.info("Disableing Console Messages.");
+ GT_FML_LOGGER.exit();
+ System.out.close();
+ System.err.close();
+ }
+ GregTech_API.sMachineExplosions = tMainConfig.get("machines", "machines_explosion_damage", true)
+ .getBoolean(false);
+ GregTech_API.sMachineFlammable = tMainConfig.get("machines", "machines_flammable", true)
+ .getBoolean(false);
+ GregTech_API.sMachineNonWrenchExplosions = tMainConfig.get("machines", "explosions_on_nonwrenching", true)
+ .getBoolean(false);
+ GregTech_API.sMachineWireFire = tMainConfig.get("machines", "wirefire_on_explosion", true)
+ .getBoolean(false);
+ GregTech_API.sMachineFireExplosions = tMainConfig.get("machines", "fire_causes_explosions", true)
+ .getBoolean(false);
+ GregTech_API.sMachineRainExplosions = tMainConfig.get("machines", "rain_causes_explosions", true)
+ .getBoolean(false);
+ GregTech_API.sMachineThunderExplosions = tMainConfig.get("machines", "lightning_causes_explosions", true)
+ .getBoolean(false);
+ GregTech_API.sConstantEnergy = tMainConfig.get("machines", "constant_need_of_energy", true)
+ .getBoolean(false);
+ GregTech_API.sColoredGUI = tMainConfig.get("machines", "colored_guis_when_painted", true)
+ .getBoolean(false);
+ GregTech_API.sMachineMetalGUI = tMainConfig.get("machines", "guis_in_consistent_machine_metal_color", false)
+ .getBoolean(false);
+
+ // Implementation for this is actually handled in NewHorizonsCoreMod in MainRegistry.java!
+ GregTech_API.sUseMachineMetal = tMainConfig.get("machines", "use_machine_metal_tint", true)
+ .getBoolean(true);
+
+ GregTech_API.sTimber = tMainConfig.get(GT_Mod.aTextGeneral, "timber_axe", true)
+ .getBoolean(true);
+ GregTech_API.sDrinksAlwaysDrinkable = tMainConfig.get(GT_Mod.aTextGeneral, "drinks_always_drinkable", false)
+ .getBoolean(false);
+ GregTech_API.sDoShowAllItemsInCreative = tMainConfig
+ .get(GT_Mod.aTextGeneral, "show_all_metaitems_in_creative_and_NEI", false)
+ .getBoolean(false);
+ GregTech_API.sMultiThreadedSounds = tMainConfig.get(GT_Mod.aTextGeneral, "sound_multi_threading", false)
+ .getBoolean(false);
+
+ loadClientConfig();
+
+ GT_Mod.gregtechproxy.mMaxEqualEntitiesAtOneSpot = tMainConfig
+ .get(GT_Mod.aTextGeneral, "MaxEqualEntitiesAtOneSpot", 3)
+ .getInt(3);
+ GT_Mod.gregtechproxy.mSkeletonsShootGTArrows = tMainConfig
+ .get(GT_Mod.aTextGeneral, "SkeletonsShootGTArrows", 16)
+ .getInt(16);
+ GT_Mod.gregtechproxy.mFlintChance = tMainConfig.get(GT_Mod.aTextGeneral, "FlintAndSteelChance", 30)
+ .getInt(30);
+ GT_Mod.gregtechproxy.mItemDespawnTime = tMainConfig.get(GT_Mod.aTextGeneral, "ItemDespawnTime", 6000)
+ .getInt(6000);
+ GT_Mod.gregtechproxy.mAllowSmallBoilerAutomation = tMainConfig
+ .get(GT_Mod.aTextGeneral, "AllowSmallBoilerAutomation", false)
+ .getBoolean(false);
+ GT_Mod.gregtechproxy.mHardMachineCasings = tMainConfig.get(GT_Mod.aTextGeneral, "HardMachineCasings", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mDisableVanillaOres = tMainConfig.get(GT_Mod.aTextGeneral, "DisableVanillaOres", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mNerfDustCrafting = tMainConfig.get(GT_Mod.aTextGeneral, "NerfDustCrafting", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mIncreaseDungeonLoot = tMainConfig.get(GT_Mod.aTextGeneral, "IncreaseDungeonLoot", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mAxeWhenAdventure = tMainConfig.get(GT_Mod.aTextGeneral, "AdventureModeStartingAxe", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mHardcoreCables = tMainConfig.get(GT_Mod.aTextGeneral, "HardCoreCableLoss", false)
+ .getBoolean(false);
+ GT_Mod.gregtechproxy.mSurvivalIntoAdventure = tMainConfig.get(GT_Mod.aTextGeneral, "forceAdventureMode", false)
+ .getBoolean(false);
+ GT_Mod.gregtechproxy.mHungerEffect = tMainConfig.get(GT_Mod.aTextGeneral, "AFK_Hunger", false)
+ .getBoolean(false);
+ GT_Mod.gregtechproxy.mHardRock = tMainConfig.get(GT_Mod.aTextGeneral, "harderstone", false)
+ .getBoolean(false);
+ GT_Mod.gregtechproxy.mInventoryUnification = tMainConfig.get(GT_Mod.aTextGeneral, "InventoryUnification", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mGTBees = tMainConfig.get(GT_Mod.aTextGeneral, "GTBees", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mCraftingUnification = tMainConfig.get(GT_Mod.aTextGeneral, "CraftingUnification", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mNerfedWoodPlank = tMainConfig.get(GT_Mod.aTextGeneral, "WoodNeedsSawForCrafting", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mNerfedVanillaTools = tMainConfig
+ .get(GT_Mod.aTextGeneral, "smallerVanillaToolDurability", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mSortToTheEnd = tMainConfig.get(GT_Mod.aTextGeneral, "EnsureToBeLoadedLast", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mDisableIC2Cables = tMainConfig.get(GT_Mod.aTextGeneral, "DisableIC2Cables", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mAchievements = tMainConfig.get(GT_Mod.aTextGeneral, "EnableAchievements", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mNerfedCombs = tMainConfig.get(GT_Mod.aTextGeneral, "NerfCombs", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mNerfedCrops = tMainConfig.get(GT_Mod.aTextGeneral, "NerfCrops", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mHideUnusedOres = tMainConfig.get(GT_Mod.aTextGeneral, "HideUnusedOres", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mArcSmeltIntoAnnealed = tMainConfig
+ .get(GT_Mod.aTextGeneral, "ArcSmeltIntoAnnealedWrought", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mEnableAllMaterials = tMainConfig.get("general", "EnableAllMaterials", false)
+ .getBoolean(false);
+
+ // Pollution: edit GT_Proxy.java to change default values
+ GT_Mod.gregtechproxy.mPollution = tMainConfig
+ .get("Pollution", "EnablePollution", GT_Mod.gregtechproxy.mPollution)
+ .getBoolean(GT_Mod.gregtechproxy.mPollution);
+ GT_Mod.gregtechproxy.mPollutionSmogLimit = tMainConfig
+ .get("Pollution", "SmogLimit", GT_Mod.gregtechproxy.mPollutionSmogLimit)
+ .getInt(GT_Mod.gregtechproxy.mPollutionSmogLimit);
+ GT_Mod.gregtechproxy.mPollutionPoisonLimit = tMainConfig
+ .get("Pollution", "PoisonLimit", GT_Mod.gregtechproxy.mPollutionPoisonLimit)
+ .getInt(GT_Mod.gregtechproxy.mPollutionPoisonLimit);
+ GT_Mod.gregtechproxy.mPollutionVegetationLimit = tMainConfig
+ .get("Pollution", "VegetationLimit", GT_Mod.gregtechproxy.mPollutionVegetationLimit)
+ .getInt(GT_Mod.gregtechproxy.mPollutionVegetationLimit);
+ GT_Mod.gregtechproxy.mPollutionSourRainLimit = tMainConfig
+ .get("Pollution", "SourRainLimit", GT_Mod.gregtechproxy.mPollutionSourRainLimit)
+ .getInt(GT_Mod.gregtechproxy.mPollutionSourRainLimit);
+ GT_Mod.gregtechproxy.mPollutionOnExplosion = tMainConfig
+ .get("Pollution", "SourRainLimit", GT_Mod.gregtechproxy.mPollutionOnExplosion)
+ .getInt(GT_Mod.gregtechproxy.mPollutionOnExplosion);
+ GT_Mod.gregtechproxy.mExplosionItemDrop = tMainConfig
+ .get("general", "ExplosionItemDrops", GT_Mod.gregtechproxy.mExplosionItemDrop)
+ .getBoolean(GT_Mod.gregtechproxy.mExplosionItemDrop);
+ GT_Mod.gregtechproxy.mPollutionPrimitveBlastFurnacePerSecond = tMainConfig
+ .get(
+ "Pollution",
+ "PollutionPrimitiveBlastFurnace",
+ GT_Mod.gregtechproxy.mPollutionPrimitveBlastFurnacePerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionPrimitveBlastFurnacePerSecond);
+ GT_Mod.gregtechproxy.mPollutionCharcoalPitPerSecond = tMainConfig
+ .get("Pollution", "PollutionCharcoalPit", GT_Mod.gregtechproxy.mPollutionCharcoalPitPerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionCharcoalPitPerSecond);
+ GT_Mod.gregtechproxy.mPollutionEBFPerSecond = tMainConfig
+ .get("Pollution", "PollutionEBF", GT_Mod.gregtechproxy.mPollutionEBFPerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionEBFPerSecond);
+ GT_Mod.gregtechproxy.mPollutionLargeCombustionEnginePerSecond = tMainConfig
+ .get(
+ "Pollution",
+ "PollutionLargeCombustionEngine",
+ GT_Mod.gregtechproxy.mPollutionLargeCombustionEnginePerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionLargeCombustionEnginePerSecond);
+ GT_Mod.gregtechproxy.mPollutionExtremeCombustionEnginePerSecond = tMainConfig
+ .get(
+ "Pollution",
+ "PollutionExtremeCombustionEngine",
+ GT_Mod.gregtechproxy.mPollutionExtremeCombustionEnginePerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionExtremeCombustionEnginePerSecond);
+ GT_Mod.gregtechproxy.mPollutionImplosionCompressorPerSecond = tMainConfig
+ .get(
+ "Pollution",
+ "PollutionImplosionCompressor",
+ GT_Mod.gregtechproxy.mPollutionImplosionCompressorPerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionImplosionCompressorPerSecond);
+ GT_Mod.gregtechproxy.mPollutionLargeBronzeBoilerPerSecond = tMainConfig
+ .get("Pollution", "PollutionLargeBronzeBoiler", GT_Mod.gregtechproxy.mPollutionLargeBronzeBoilerPerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionLargeBronzeBoilerPerSecond);
+ GT_Mod.gregtechproxy.mPollutionLargeSteelBoilerPerSecond = tMainConfig
+ .get("Pollution", "PollutionLargeSteelBoiler", GT_Mod.gregtechproxy.mPollutionLargeSteelBoilerPerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionLargeSteelBoilerPerSecond);
+ GT_Mod.gregtechproxy.mPollutionLargeTitaniumBoilerPerSecond = tMainConfig
+ .get(
+ "Pollution",
+ "PollutionLargeTitaniumBoiler",
+ GT_Mod.gregtechproxy.mPollutionLargeTitaniumBoilerPerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionLargeTitaniumBoilerPerSecond);
+ GT_Mod.gregtechproxy.mPollutionLargeTungstenSteelBoilerPerSecond = tMainConfig
+ .get(
+ "Pollution",
+ "PollutionLargeTungstenSteelBoiler",
+ GT_Mod.gregtechproxy.mPollutionLargeTungstenSteelBoilerPerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionLargeTungstenSteelBoilerPerSecond);
+ GT_Mod.gregtechproxy.mPollutionReleasedByThrottle = tMainConfig
+ .get("Pollution", "PollutionReleasedByThrottle", GT_Mod.gregtechproxy.mPollutionReleasedByThrottle)
+ .getDouble(GT_Mod.gregtechproxy.mPollutionReleasedByThrottle);
+ GT_Mod.gregtechproxy.mPollutionLargeGasTurbinePerSecond = tMainConfig
+ .get("Pollution", "PollutionLargeGasTurbine", GT_Mod.gregtechproxy.mPollutionLargeGasTurbinePerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionLargeGasTurbinePerSecond);
+ GT_Mod.gregtechproxy.mPollutionMultiSmelterPerSecond = tMainConfig
+ .get("Pollution", "PollutionMultiSmelter", GT_Mod.gregtechproxy.mPollutionMultiSmelterPerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionMultiSmelterPerSecond);
+ GT_Mod.gregtechproxy.mPollutionPyrolyseOvenPerSecond = tMainConfig
+ .get("Pollution", "PollutionPyrolyseOven", GT_Mod.gregtechproxy.mPollutionPyrolyseOvenPerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionPyrolyseOvenPerSecond);
+ GT_Mod.gregtechproxy.mPollutionSmallCoalBoilerPerSecond = tMainConfig
+ .get("Pollution", "PollutionSmallCoalBoiler", GT_Mod.gregtechproxy.mPollutionSmallCoalBoilerPerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionSmallCoalBoilerPerSecond);
+ GT_Mod.gregtechproxy.mPollutionHighPressureLavaBoilerPerSecond = tMainConfig
+ .get(
+ "Pollution",
+ "PollutionHighPressureLavaBoiler",
+ GT_Mod.gregtechproxy.mPollutionHighPressureLavaBoilerPerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionHighPressureLavaBoilerPerSecond);
+ GT_Mod.gregtechproxy.mPollutionHighPressureCoalBoilerPerSecond = tMainConfig
+ .get(
+ "Pollution",
+ "PollutionHighPressureCoalBoiler",
+ GT_Mod.gregtechproxy.mPollutionHighPressureCoalBoilerPerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionHighPressureCoalBoilerPerSecond);
+ GT_Mod.gregtechproxy.mPollutionBaseDieselGeneratorPerSecond = tMainConfig
+ .get(
+ "Pollution",
+ "PollutionBaseDieselGenerator",
+ GT_Mod.gregtechproxy.mPollutionBaseDieselGeneratorPerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionBaseDieselGeneratorPerSecond);
+ double[] mPollutionDieselGeneratorReleasedByTier = tMainConfig
+ .get(
+ "Pollution",
+ "PollutionReleasedByTierDieselGenerator",
+ GT_Mod.gregtechproxy.mPollutionDieselGeneratorReleasedByTier)
+ .getDoubleList();
+ if (mPollutionDieselGeneratorReleasedByTier.length
+ == GT_Mod.gregtechproxy.mPollutionDieselGeneratorReleasedByTier.length) {
+ GT_Mod.gregtechproxy.mPollutionDieselGeneratorReleasedByTier = mPollutionDieselGeneratorReleasedByTier;
+ } else {
+ GT_FML_LOGGER
+ .error("The Length of the Diesel Turbine Pollution Array Config must be the same as the Default");
+ }
+ GT_Mod.gregtechproxy.mPollutionBaseGasTurbinePerSecond = tMainConfig
+ .get(
+ "Pollution",
+ "PollutionBaseGasTurbineGenerator",
+ GT_Mod.gregtechproxy.mPollutionBaseGasTurbinePerSecond)
+ .getInt(GT_Mod.gregtechproxy.mPollutionBaseGasTurbinePerSecond);
+ double[] mPollutionGasTurbineReleasedByTier = tMainConfig
+ .get(
+ "Pollution",
+ "PollutionReleasedByTierGasTurbineGenerator",
+ GT_Mod.gregtechproxy.mPollutionGasTurbineReleasedByTier)
+ .getDoubleList();
+ if (mPollutionGasTurbineReleasedByTier.length
+ == GT_Mod.gregtechproxy.mPollutionGasTurbineReleasedByTier.length) {
+ GT_Mod.gregtechproxy.mPollutionGasTurbineReleasedByTier = mPollutionGasTurbineReleasedByTier;
+ } else {
+ GT_FML_LOGGER.error("The Length of the Gas Turbine Pollution Array Config must be the same as the Default");
+ }
+
+ GT_Mod.gregtechproxy.mUndergroundOil.getConfig(tMainConfig, "undergroundfluid");
+ GT_Mod.gregtechproxy.enableUndergroundGravelGen = GregTech_API.sWorldgenFile
+ .get("general", "enableUndergroundGravelGen", GT_Mod.gregtechproxy.enableUndergroundGravelGen);
+ GT_Mod.gregtechproxy.enableUndergroundDirtGen = GregTech_API.sWorldgenFile
+ .get("general", "enableUndergroundDirtGen", GT_Mod.gregtechproxy.enableUndergroundDirtGen);
+ GT_Mod.gregtechproxy.mEnableCleanroom = tMainConfig.get("general", "EnableCleanroom", true)
+ .getBoolean(true);
+ if (GT_Mod.gregtechproxy.mEnableCleanroom) GT_MetaTileEntity_Cleanroom.loadConfig(tMainConfig);
+ GT_Mod.gregtechproxy.mLowGravProcessing = GalacticraftCore.isModLoaded()
+ && tMainConfig.get("general", "LowGravProcessing", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mUseGreatlyShrukenReplacementList = tMainConfig
+ .get("general", "GTNH Optimised Material Loading", true)
+ .getBoolean(true);
+ Calendar now = Calendar.getInstance();
+ GT_Mod.gregtechproxy.mAprilFool = GregTech_API.sSpecialFile.get(
+ ConfigCategories.general,
+ "AprilFool",
+ now.get(Calendar.MONTH) == Calendar.APRIL && now.get(Calendar.DAY_OF_MONTH) == 1);
+ GT_Mod.gregtechproxy.mCropNeedBlock = tMainConfig.get("general", "CropNeedBlockBelow", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.mAMHInteraction = tMainConfig.get("general", "AllowAutoMaintenanceHatchInteraction", false)
+ .getBoolean(false);
+ GregTech_API.mOutputRF = GregTech_API.sOPStuff.get(ConfigCategories.general, "OutputRF", true);
+ GregTech_API.mInputRF = GregTech_API.sOPStuff.get(ConfigCategories.general, "InputRF", false);
+ GregTech_API.mEUtoRF = GregTech_API.sOPStuff.get(ConfigCategories.general, "100EUtoRF", 360);
+ GregTech_API.mRFtoEU = GregTech_API.sOPStuff.get(ConfigCategories.general, "100RFtoEU", 20);
+ GregTech_API.mRFExplosions = GregTech_API.sOPStuff.get(ConfigCategories.general, "RFExplosions", false);
+ GregTech_API.meIOLoaded = EnderIO.isModLoaded();
+ GT_Mod.gregtechproxy.mForceFreeFace = GregTech_API.sMachineFile
+ .get(ConfigCategories.machineconfig, "forceFreeFace", true);
+ GT_Mod.gregtechproxy.mBrickedBlastFurnace = tMainConfig.get("general", "BrickedBlastFurnace", true)
+ .getBoolean(true);
+
+ GT_Mod.gregtechproxy.mMixedOreOnlyYieldsTwoThirdsOfPureOre = tMainConfig
+ .get("general", "MixedOreOnlyYieldsTwoThirdsOfPureOre", false)
+ .getBoolean(false);
+ GT_Mod.gregtechproxy.mRichOreYieldMultiplier = tMainConfig.get("general", "RichOreYieldMultiplier", true)
+ .getBoolean(false);
+ GT_Mod.gregtechproxy.mNetherOreYieldMultiplier = tMainConfig.get("general", "NetherOreYieldMultiplier", true)
+ .getBoolean(false);
+ GT_Mod.gregtechproxy.mEndOreYieldMultiplier = tMainConfig.get("general", "EndOreYieldMultiplier", true)
+ .getBoolean(false);
+ GT_Mod.gregtechproxy.enableBlackGraniteOres = GregTech_API.sWorldgenFile
+ .get("general", "enableBlackGraniteOres", GT_Mod.gregtechproxy.enableBlackGraniteOres);
+ GT_Mod.gregtechproxy.enableRedGraniteOres = GregTech_API.sWorldgenFile
+ .get("general", "enableRedGraniteOres", GT_Mod.gregtechproxy.enableRedGraniteOres);
+ GT_Mod.gregtechproxy.enableMarbleOres = GregTech_API.sWorldgenFile
+ .get("general", "enableMarbleOres", GT_Mod.gregtechproxy.enableMarbleOres);
+ GT_Mod.gregtechproxy.enableBasaltOres = GregTech_API.sWorldgenFile
+ .get("general", "enableBasaltOres", GT_Mod.gregtechproxy.enableBasaltOres);
+ GT_Mod.gregtechproxy.gt6Pipe = tMainConfig.get("general", "GT6StyledPipesConnection", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.gt6Cable = tMainConfig.get("general", "GT6StyledWiresConnection", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.ic2EnergySourceCompat = tMainConfig.get("general", "Ic2EnergySourceCompat", true)
+ .getBoolean(true);
+ GT_Mod.gregtechproxy.costlyCableConnection = tMainConfig
+ .get("general", "CableConnectionRequiresSolderingMaterial", false)
+ .getBoolean(false);
+ GT_Mod.gregtechproxy.crashOnNullRecipeInput = tMainConfig.get("general", "crashOnNullRecipeInput", false)
+ .getBoolean(false);
+ GT_LanguageManager.i18nPlaceholder = tMainConfig
+ .get("general", "EnablePlaceholderForMaterialNamesInLangFile", true)
+ .getBoolean(true);
+ GT_MetaTileEntity_LongDistancePipelineBase.minimalDistancePoints = tMainConfig
+ .get("general", "LongDistancePipelineMinimalDistancePoints", 64)
+ .getInt(64);
+ try {
+ String setting_string = tMainConfig.get(
+ "OreDropBehaviour",
+ "general",
+ "FortuneItem",
+ "Settings: \n'PerDimBlock': Sets the drop to the block variant of the ore block based on dimension, defaults to stone type, \n'UnifiedBlock': Sets the drop to the stone variant of the ore block, \n'Block': Sets the drop to the ore mined, \n'FortuneItem': Sets the drop to the new ore item and makes it affected by fortune, \n'Item': Sets the drop to the new ore item, \nDefaults to: 'FortuneItem'")
+ .getString();
+ GT_Log.out.println("Trying to set it to: " + setting_string);
+ GT_Proxy.OreDropSystem setting = GT_Proxy.OreDropSystem.valueOf(setting_string);
+ GT_Mod.gregtechproxy.oreDropSystem = setting;
+
+ } catch (IllegalArgumentException e) {
+ GT_Log.err.println(e);
+ GT_Mod.gregtechproxy.oreDropSystem = GT_Proxy.OreDropSystem.FortuneItem;
+ }
+
+ GT_Mod.gregtechproxy.mChangeHarvestLevels = GregTech_API.sMaterialProperties
+ .get("havestLevel", "activateHarvestLevelChange", false); // TODO CHECK
+ if (GT_Mod.gregtechproxy.mChangeHarvestLevels) {
+ GT_Mod.gregtechproxy.mGraniteHavestLevel = GregTech_API.sMaterialProperties
+ .get("havestLevel", "graniteHarvestLevel", 3);
+ GT_Mod.gregtechproxy.mMaxHarvestLevel = Math
+ .min(15, GregTech_API.sMaterialProperties.get("havestLevel", "maxLevel", 7));
+ Materials.getMaterialsMap()
+ .values()
+ .parallelStream()
+ .filter(
+ tMaterial -> tMaterial != null && tMaterial.mToolQuality > 0
+ && tMaterial.mMetaItemSubID < GT_Mod.gregtechproxy.mHarvestLevel.length
+ && tMaterial.mMetaItemSubID >= 0)
+ .forEach(
+ tMaterial -> GT_Mod.gregtechproxy.mHarvestLevel[tMaterial.mMetaItemSubID] = GregTech_API.sMaterialProperties
+ .get("materialHavestLevel", tMaterial.mDefaultLocalName, tMaterial.mToolQuality));
+ }
+
+ if (tMainConfig.get("general", "hardermobspawners", true)
+ .getBoolean(true)) {
+ Blocks.mob_spawner.setHardness(500.0F)
+ .setResistance(6000000.0F);
+ }
+ GT_Mod.gregtechproxy.mOnline = tMainConfig.get(GT_Mod.aTextGeneral, "online", true)
+ .getBoolean(false);
+
+ GT_Mod.gregtechproxy.mUpgradeCount = Math.min(
+ 64,
+ Math.max(
+ 1,
+ tMainConfig.get("features", "UpgradeStacksize", 4)
+ .getInt()));
+ for (OrePrefixes tPrefix : OrePrefixes.values()) {
+ if (tPrefix.mIsUsedForOreProcessing) {
+ tPrefix.mDefaultStackSize = ((byte) Math.min(
+ 64,
+ Math.max(
+ 1,
+ tMainConfig.get("features", "MaxOreStackSize", 64)
+ .getInt())));
+ } else if (tPrefix == OrePrefixes.plank) {
+ tPrefix.mDefaultStackSize = ((byte) Math.min(
+ 64,
+ Math.max(
+ 16,
+ tMainConfig.get("features", "MaxPlankStackSize", 64)
+ .getInt())));
+ } else if ((tPrefix == OrePrefixes.wood) || (tPrefix == OrePrefixes.treeLeaves)
+ || (tPrefix == OrePrefixes.treeSapling)
+ || (tPrefix == OrePrefixes.log)) {
+ tPrefix.mDefaultStackSize = ((byte) Math.min(
+ 64,
+ Math.max(
+ 16,
+ tMainConfig.get("features", "MaxLogStackSize", 64)
+ .getInt())));
+ } else if (tPrefix.mIsUsedForBlocks) {
+ tPrefix.mDefaultStackSize = ((byte) Math.min(
+ 64,
+ Math.max(
+ 16,
+ tMainConfig.get("features", "MaxOtherBlockStackSize", 64)
+ .getInt())));
+ }
+ }
+
+ GT_Values.mCTMEnabledBlock
+ .addAll(
+ Arrays
+ .asList(
+ tMainConfig
+ .get(
+ "general",
+ "ctm_block_whitelist",
+ new String[] { "team.chisel.block.BlockCarvable",
+ "team.chisel.block.BlockCarvableGlass" })
+ .getStringList()));
+ GT_Values.mCTMDisabledBlock.addAll(
+ Arrays.asList(
+ tMainConfig.get("general", "ctm_block_blacklist", new String[] { "team.chisel.block.BlockRoadLine" })
+ .getStringList()));
+
+ GT_RecipeBuilder.onConfigLoad();
+ }
+
+ public static void loadClientConfig() {
+ final String sBDye0 = "ColorModulation.";
+ Arrays.stream(Dyes.values())
+ .filter(tDye -> (tDye != Dyes._NULL) && (tDye.mIndex < 0))
+ .forEach(tDye -> {
+ String sBDye1 = sBDye0 + tDye;
+ tDye.mRGBa[0] = ((short) Math
+ .min(255, Math.max(0, GregTech_API.sClientDataFile.get(sBDye1, "R", tDye.mOriginalRGBa[0]))));
+ tDye.mRGBa[1] = ((short) Math
+ .min(255, Math.max(0, GregTech_API.sClientDataFile.get(sBDye1, "G", tDye.mOriginalRGBa[1]))));
+ tDye.mRGBa[2] = ((short) Math
+ .min(255, Math.max(0, GregTech_API.sClientDataFile.get(sBDye1, "B", tDye.mOriginalRGBa[2]))));
+ });
+ GT_Mod.gregtechproxy.mRenderTileAmbientOcclusion = GregTech_API.sClientDataFile
+ .get("render", "TileAmbientOcclusion", true);
+ GT_Mod.gregtechproxy.mRenderGlowTextures = GregTech_API.sClientDataFile.get("render", "GlowTextures", true);
+ GT_Mod.gregtechproxy.mRenderFlippedMachinesFlipped = GregTech_API.sClientDataFile
+ .get("render", "RenderFlippedMachinesFlipped", true);
+ GT_Mod.gregtechproxy.mRenderIndicatorsOnHatch = GregTech_API.sClientDataFile
+ .get("render", "RenderIndicatorsOnHatch", true);
+ GT_Mod.gregtechproxy.mRenderDirtParticles = GregTech_API.sClientDataFile
+ .get("render", "RenderDirtParticles", true);
+ GT_Mod.gregtechproxy.mRenderPollutionFog = GregTech_API.sClientDataFile
+ .get("render", "RenderPollutionFog", true);
+ GT_Mod.gregtechproxy.mRenderItemDurabilityBar = GregTech_API.sClientDataFile
+ .get("render", "RenderItemDurabilityBar", true);
+ GT_Mod.gregtechproxy.mRenderItemChargeBar = GregTech_API.sClientDataFile
+ .get("render", "RenderItemChargeBar", true);
+ GT_Mod.gregtechproxy.mUseBlockUpdateHandler = GregTech_API.sClientDataFile
+ .get("render", "UseBlockUpdateHandler", false);
+
+ GT_Mod.gregtechproxy.mCoverTabsVisible = GregTech_API.sClientDataFile
+ .get("interface", "DisplayCoverTabs", true);
+ GT_Mod.gregtechproxy.mCoverTabsFlipped = GregTech_API.sClientDataFile.get("interface", "FlipCoverTabs", false);
+ GT_Mod.gregtechproxy.mTooltipVerbosity = GregTech_API.sClientDataFile.get("interface", "TooltipVerbosity", 2);
+ GT_Mod.gregtechproxy.mTooltipShiftVerbosity = GregTech_API.sClientDataFile
+ .get("interface", "TooltipShiftVerbosity", 3);
+ GT_Mod.gregtechproxy.mTitleTabStyle = GregTech_API.sClientDataFile.get("interface", "TitleTabStyle", 0);
+
+ GT_Mod.gregtechproxy.mNEIRecipeSecondMode = GregTech_API.sClientDataFile.get("nei", "RecipeSecondMode", true);
+ GT_Mod.gregtechproxy.mNEIRecipeOwner = GregTech_API.sClientDataFile.get("nei", "RecipeOwner", false);
+ GT_Mod.gregtechproxy.mNEIRecipeOwnerStackTrace = GregTech_API.sClientDataFile
+ .get("nei", "RecipeOwnerStackTrace", false);
+ GT_Mod.gregtechproxy.mNEIOriginalVoltage = GregTech_API.sClientDataFile.get("nei", "OriginalVoltage", false);
+
+ GT_Mod.gregtechproxy.recipeCategorySettings.clear();
+ for (RecipeCategory recipeCategory : findRecipeCategories()) {
+ RecipeCategorySetting setting = RecipeCategorySetting.find(
+ GregTech_API.sClientDataFile.getWithValidValues(
+ "nei.recipe_categories",
+ recipeCategory.unlocalizedName,
+ RecipeCategorySetting.NAMES,
+ RecipeCategorySetting.getDefault()
+ .toName()));
+ GT_Mod.gregtechproxy.recipeCategorySettings.put(recipeCategory, setting);
+ }
+
+ GT_Mod.gregtechproxy.mWailaTransformerVoltageTier = GregTech_API.sClientDataFile
+ .get("waila", "WailaTransformerVoltageTier", true);
+ GT_Mod.gregtechproxy.wailaAverageNS = GregTech_API.sClientDataFile.get("waila", "WailaAverageNS", false);
+
+ final String[] Circuits = GregTech_API.sClientDataFile.get("interface", "CircuitsOrder");
+ GT_Mod.gregtechproxy.mCircuitsOrder.clear();
+ for (int i = 0; i < Circuits.length; i++) {
+ GT_Mod.gregtechproxy.mCircuitsOrder.putIfAbsent(Circuits[i], i);
+ }
+
+ GT_Mod.gregtechproxy.reloadNEICache();
+ }
+
+ private static List<RecipeCategory> findRecipeCategories() {
+ List<RecipeCategory> ret = new ArrayList<>();
+ try {
+ Field discovererField = Loader.class.getDeclaredField("discoverer");
+ discovererField.setAccessible(true);
+ ModDiscoverer discoverer = (ModDiscoverer) discovererField.get(Loader.instance());
+ for (ASMDataTable.ASMData asmData : discoverer.getASMTable()
+ .getAll(RecipeCategoryHolder.class.getName())) {
+ try {
+ Object obj = Class.forName(asmData.getClassName())
+ .getDeclaredField(asmData.getObjectName())
+ .get(null);
+ if (obj instanceof RecipeCategory recipeCategory) {
+ ret.add(recipeCategory);
+ } else {
+ GT_FML_LOGGER.error(
+ "{}#{} is not an instance of RecipeCategory",
+ asmData.getClassName(),
+ asmData.getObjectName());
+ }
+ } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
+ GT_FML_LOGGER.error("Failed to find RecipeCategory");
+ GT_FML_LOGGER.catching(e);
+ }
+ }
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ return ret;
+ }
+}
diff --git a/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java b/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
new file mode 100644
index 0000000000..dd99b6bb0e
--- /dev/null
+++ b/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
@@ -0,0 +1,789 @@
+package gregtech.nei;
+
+import static gregtech.api.enums.GT_Values.V;
+
+import java.awt.Rectangle;
+import java.lang.ref.SoftReference;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.Range;
+import org.lwjgl.opengl.GL11;
+
+import com.gtnewhorizons.modularui.api.GlStateManager;
+import com.gtnewhorizons.modularui.api.UIInfos;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import codechicken.nei.NEIClientUtils;
+import codechicken.nei.PositionedStack;
+import codechicken.nei.recipe.GuiRecipe;
+import codechicken.nei.recipe.ICraftingHandler;
+import codechicken.nei.recipe.IUsageHandler;
+import codechicken.nei.recipe.RecipeCatalysts;
+import codechicken.nei.recipe.TemplateRecipeHandler;
+import gregtech.GT_Mod;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.gui.GT_GUIColorOverride;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IOverclockDescriptionProvider;
+import gregtech.api.objects.ItemData;
+import gregtech.api.objects.overclockdescriber.EUNoOverclockDescriber;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.recipe.BasicUIProperties;
+import gregtech.api.recipe.NEIRecipeProperties;
+import gregtech.api.recipe.RecipeCategory;
+import gregtech.api.recipe.RecipeCategorySetting;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Item_Machines;
+import gregtech.common.gui.modularui.UIHelper;
+
+public class GT_NEI_DefaultHandler extends TemplateRecipeHandler {
+
+ private static final int offsetX = 5;
+ private static final int offsetY = 11;
+ protected static final Pos2d WINDOW_OFFSET = new Pos2d(-offsetX, -offsetY);
+
+ private static final ConcurrentMap<RecipeCategory, SortedRecipeListCache> CACHE = new ConcurrentHashMap<>();
+
+ private static final int RECIPE_NAME_WIDTH = 140;
+
+ /**
+ * Static version of {@link TemplateRecipeHandler#cycleticks}. Can be referenced from cached recipes.
+ */
+ private static int cycleTicksStatic = Math.abs((int) System.currentTimeMillis());
+ /**
+ * Basically {@link #cycleTicksStatic} but always updated even while holding shift
+ */
+ private static int drawTicks;
+ private static final int PROGRESSBAR_CYCLE_TICKS = 200;
+
+ protected final RecipeCategory recipeCategory;
+ protected final RecipeMap<?> recipeMap;
+ protected final RecipeMapFrontend frontend;
+ protected final BasicUIProperties uiProperties;
+ protected final NEIRecipeProperties neiProperties;
+
+ protected final ModularWindow modularWindow;
+ protected final ItemStackHandler itemInputsInventory;
+ protected final ItemStackHandler itemOutputsInventory;
+ protected final ItemStackHandler specialSlotInventory;
+ protected final ItemStackHandler fluidInputsInventory;
+ protected final ItemStackHandler fluidOutputsInventory;
+
+ protected OverclockDescriber overclockDescriber;
+ /**
+ * Localized name of this handler displayed on the top.
+ */
+ private String recipeNameDisplay;
+ /**
+ * Tooltip shown while hovering over header of this handler. Can be null if the full name fits in the screen.
+ */
+ private NEIHandlerAbsoluteTooltip recipeNameTooltip;
+
+ protected final GT_GUIColorOverride colorOverride = GT_GUIColorOverride
+ .get(GT_UITextures.BACKGROUND_NEI_SINGLE_RECIPE.location);
+ private int neiTextColorOverride = -1;
+
+ public GT_NEI_DefaultHandler(RecipeCategory recipeCategory) {
+ this.recipeCategory = recipeCategory;
+ this.recipeMap = recipeCategory.recipeMap;
+ this.frontend = recipeMap.getFrontend();
+ this.uiProperties = frontend.getUIProperties();
+ this.neiProperties = frontend.getNEIProperties();
+ uiProperties.neiTransferRect.forEach(transferRect -> {
+ transferRect = new Rectangle(transferRect);
+ transferRect.translate(WINDOW_OFFSET.x, WINDOW_OFFSET.y);
+ this.transferRects.add(new RecipeTransferRect(transferRect, recipeMap.unlocalizedName));
+ });
+
+ ModularWindow.Builder builder = frontend.createNEITemplate(
+ itemInputsInventory = new ItemStackHandler(uiProperties.maxItemInputs),
+ itemOutputsInventory = new ItemStackHandler(uiProperties.maxItemOutputs),
+ specialSlotInventory = new ItemStackHandler(1),
+ fluidInputsInventory = new ItemStackHandler(uiProperties.maxFluidInputs),
+ fluidOutputsInventory = new ItemStackHandler(uiProperties.maxFluidOutputs),
+ () -> ((float) getDrawTicks() % PROGRESSBAR_CYCLE_TICKS) / PROGRESSBAR_CYCLE_TICKS,
+ WINDOW_OFFSET);
+ modularWindow = builder.build();
+ UIInfos.initializeWindow(Minecraft.getMinecraft().thePlayer, modularWindow);
+ }
+
+ public RecipeMap<?> getRecipeMap() {
+ return recipeMap;
+ }
+
+ private SortedRecipeListCache getCacheHolder() {
+ return CACHE.computeIfAbsent(recipeCategory, m -> new SortedRecipeListCache());
+ }
+
+ public List<CachedDefaultRecipe> getCache() {
+ SortedRecipeListCache cacheHolder = getCacheHolder();
+ List<CachedDefaultRecipe> cache;
+ if (cacheHolder.getCachedRecipesVersion() != GT_Mod.gregtechproxy.getNEIReloadCount()
+ || (cache = cacheHolder.getCachedRecipes()) == null) {
+ RecipeCategory defaultCategory = recipeMap.getDefaultRecipeCategory();
+ Collection<GT_Recipe> recipes;
+ if (this.recipeCategory == defaultCategory) {
+ // This is main category, so merge categories that are configured as such
+ Stream<GT_Recipe> recipesToMerge = recipeMap.getBackend()
+ .getRecipeCategoryMap()
+ .entrySet()
+ .stream()
+ .flatMap(entry -> {
+ boolean merge = entry.getKey() != defaultCategory && GT_Mod.gregtechproxy.recipeCategorySettings
+ .getOrDefault(entry.getKey(), RecipeCategorySetting.getDefault())
+ == RecipeCategorySetting.MERGE;
+ return merge ? entry.getValue()
+ .stream() : Stream.empty();
+ });
+ recipes = Stream.concat(
+ recipesToMerge,
+ recipeMap.getBackend()
+ .getRecipesByCategory(defaultCategory)
+ .stream())
+ .collect(Collectors.toList());
+ } else {
+ // This is "sub" category
+ if (GT_Mod.gregtechproxy.recipeCategorySettings
+ .getOrDefault(recipeCategory, RecipeCategorySetting.getDefault()) == RecipeCategorySetting.ENABLE) {
+ recipes = recipeMap.getBackend()
+ .getRecipesByCategory(recipeCategory);
+ } else {
+ recipes = Collections.emptyList();
+ }
+ }
+ cache = recipes.stream() // do not use parallel stream. This is already parallelized by NEI
+ .filter(r -> !r.mHidden)
+ .sorted(neiProperties.comparator)
+ .map(CachedDefaultRecipe::new)
+ .collect(Collectors.toList());
+ // while the NEI parallelize handlers, for each individual handler it still uses sequential execution model,
+ // so we do not need any synchronization here
+ // even if it does break, at worst case it's just recreating the cache multiple times, which should be fine
+ cacheHolder.setCachedRecipes(cache);
+ cacheHolder.setCachedRecipesVersion(GT_Mod.gregtechproxy.getNEIReloadCount());
+ }
+ return cache;
+ }
+
+ @Override
+ public TemplateRecipeHandler newInstance() {
+ return new GT_NEI_DefaultHandler(recipeCategory);
+ }
+
+ @Override
+ public void loadCraftingRecipes(String outputId, Object... results) {
+ if (outputId.equals(recipeMap.unlocalizedName)) {
+ if (results.length > 0 && results[0] instanceof OverclockDescriber) {
+ overclockDescriber = (OverclockDescriber) results[0];
+ if (neiProperties.useCustomFilter) {
+ loadTieredRecipesWithCustomFilter(overclockDescriber);
+ } else {
+ loadTieredRecipesUpTo(overclockDescriber.getTier());
+ }
+ } else {
+ arecipes.addAll(getCache());
+ }
+ } else {
+ super.loadCraftingRecipes(outputId, results);
+ }
+ }
+
+ @Override
+ public void loadCraftingRecipes(ItemStack aResult) {
+ ItemData tPrefixMaterial = GT_OreDictUnificator.getAssociation(aResult);
+
+ ArrayList<ItemStack> tResults = new ArrayList<>();
+ tResults.add(aResult);
+ tResults.add(GT_OreDictUnificator.get(true, aResult));
+ if ((tPrefixMaterial != null) && (!tPrefixMaterial.mBlackListed)
+ && (!tPrefixMaterial.mPrefix.mFamiliarPrefixes.isEmpty())) {
+ for (OrePrefixes tPrefix : tPrefixMaterial.mPrefix.mFamiliarPrefixes) {
+ tResults.add(GT_OreDictUnificator.get(tPrefix, tPrefixMaterial.mMaterial.mMaterial, 1L));
+ }
+ }
+ if (aResult.getUnlocalizedName()
+ .startsWith("gt.blockores")) {
+ for (int i = 0; i < 8; i++) {
+ tResults.add(new ItemStack(aResult.getItem(), 1, aResult.getItemDamage() % 1000 + i * 1000));
+ }
+ }
+ addFluidStacks(aResult, tResults);
+ for (CachedDefaultRecipe recipe : getCache()) {
+ if (tResults.stream()
+ .anyMatch(stack -> recipe.contains(recipe.mOutputs, stack))) arecipes.add(recipe);
+ }
+ }
+
+ private void addFluidStacks(ItemStack aStack, ArrayList<ItemStack> tResults) {
+ FluidStack tFluid = GT_Utility.getFluidForFilledItem(aStack, true);
+ FluidStack tFluidStack;
+ if (tFluid != null) {
+ tFluidStack = tFluid;
+ tResults.add(GT_Utility.getFluidDisplayStack(tFluid, false));
+ } else tFluidStack = GT_Utility.getFluidFromDisplayStack(aStack);
+ if (tFluidStack != null) {
+ tResults.addAll(GT_Utility.getContainersFromFluid(tFluidStack));
+ }
+ }
+
+ private void loadTieredRecipesWithCustomFilter(OverclockDescriber overclockDescriber) {
+ arecipes.addAll(getTieredRecipesWithCustomFilter(overclockDescriber));
+ }
+
+ private List<CachedDefaultRecipe> getTieredRecipesWithCustomFilter(OverclockDescriber overclockDescriber) {
+ List<CachedDefaultRecipe> recipes = getCache();
+ if (!recipes.isEmpty()) {
+ recipes = recipes.stream()
+ .filter(recipe -> overclockDescriber.canHandle(recipe.mRecipe))
+ .collect(Collectors.toList());
+ }
+ return recipes;
+ }
+
+ private void loadTieredRecipesUpTo(byte upperTier) {
+ arecipes.addAll(getTieredRecipes(upperTier));
+ }
+
+ private List<CachedDefaultRecipe> getTieredRecipes(byte upperTier) {
+ List<CachedDefaultRecipe> recipes = getCache();
+ if (!recipes.isEmpty()) {
+ Range<Integer> indexRange = getCacheHolder().getIndexRangeForTiers((byte) 0, upperTier);
+ recipes = recipes.subList(indexRange.getMinimum(), indexRange.getMaximum() + 1);
+ }
+ return recipes;
+ }
+
+ @Override
+ public void loadUsageRecipes(ItemStack aInput) {
+ ItemData tPrefixMaterial = GT_OreDictUnificator.getAssociation(aInput);
+ ArrayList<ItemStack> tInputs = new ArrayList<>();
+ tInputs.add(aInput);
+ tInputs.add(GT_OreDictUnificator.get(false, aInput));
+ if ((tPrefixMaterial != null) && (!tPrefixMaterial.mPrefix.mFamiliarPrefixes.isEmpty())) {
+ for (OrePrefixes tPrefix : tPrefixMaterial.mPrefix.mFamiliarPrefixes) {
+ tInputs.add(GT_OreDictUnificator.get(tPrefix, tPrefixMaterial.mMaterial.mMaterial, 1L));
+ }
+ }
+ addFluidStacks(aInput, tInputs);
+ for (CachedDefaultRecipe recipe : getCache()) {
+ if (tInputs.stream()
+ .anyMatch(stack -> recipe.contains(recipe.mInputs, stack))) arecipes.add(recipe);
+ }
+ }
+
+ @Override
+ public IUsageHandler getUsageAndCatalystHandler(String inputId, Object... ingredients) {
+ if (inputId.equals("item")) {
+ ItemStack candidate = (ItemStack) ingredients[0];
+ GT_NEI_DefaultHandler handler = (GT_NEI_DefaultHandler) newInstance();
+ if (RecipeCatalysts.containsCatalyst(handler, candidate)) {
+ IMetaTileEntity metaTile = GT_Item_Machines.getMetaTileEntity(candidate);
+ OverclockDescriber overclockDescriber;
+ if (metaTile instanceof IOverclockDescriptionProvider provider) {
+ overclockDescriber = provider.getOverclockDescriber();
+ } else {
+ overclockDescriber = null;
+ }
+ handler.loadCraftingRecipes(recipeMap.unlocalizedName, overclockDescriber);
+ return handler;
+ }
+ }
+ return this.getUsageHandler(inputId, ingredients);
+ }
+
+ @Override
+ public ICraftingHandler getRecipeHandler(String outputId, Object... results) {
+ GT_NEI_DefaultHandler handler = (GT_NEI_DefaultHandler) super.getRecipeHandler(outputId, results);
+ if (results.length > 0 && results[0] instanceof OverclockDescriber) {
+ handler.overclockDescriber = (OverclockDescriber) results[0];
+ }
+ return handler;
+ }
+
+ @Override
+ public String getOverlayIdentifier() {
+ return recipeCategory.unlocalizedName;
+ }
+
+ @Override
+ public void drawBackground(int recipe) {
+ drawUI(modularWindow);
+ }
+
+ @Override
+ public void drawForeground(int recipe) {
+ GL11.glColor4f(1, 1, 1, 1);
+ GL11.glDisable(GL11.GL_LIGHTING);
+ drawExtras(recipe);
+ }
+
+ @Override
+ public void onUpdate() {
+ super.onUpdate();
+ if (!NEIClientUtils.shiftKey()) cycleTicksStatic++;
+ drawTicks++;
+ }
+
+ @Override
+ public int recipiesPerPage() {
+ return 1;
+ }
+
+ @Override
+ public String getRecipeName() {
+ if (recipeNameDisplay == null) {
+ recipeNameDisplay = computeRecipeName();
+ neiTextColorOverride = colorOverride.getTextColorOrDefault("nei", -1);
+ }
+ return recipeNameDisplay;
+ }
+
+ private String computeRecipeName() {
+ String recipeName = StatCollector.translateToLocal(recipeCategory.unlocalizedName);
+ if (overclockDescriber != null) {
+ String suffix = "(" + overclockDescriber.getTierString() + ")";
+ // Space will be cropped if title exceeds
+ return shrinkRecipeName(recipeName + " ", suffix);
+ } else {
+ return shrinkRecipeName(recipeName, "");
+ }
+ }
+
+ private String shrinkRecipeName(final String originalRecipeName, final String suffix) {
+ FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
+ int suffixWidth = fontRenderer.getStringWidth(suffix);
+ if (fontRenderer.getStringWidth(originalRecipeName) + suffixWidth <= RECIPE_NAME_WIDTH) {
+ return originalRecipeName + suffix;
+ }
+
+ final String ellipsis = "...";
+ final int ellipsisWidth = fontRenderer.getStringWidth(ellipsis);
+ String recipeName = originalRecipeName;
+ do {
+ recipeName = recipeName.substring(0, recipeName.length() - 1);
+ } while (fontRenderer.getStringWidth(recipeName) + ellipsisWidth + suffixWidth > RECIPE_NAME_WIDTH);
+ setupRecipeNameTooltip(originalRecipeName + suffix);
+ return recipeName + ellipsis + suffix;
+ }
+
+ private void setupRecipeNameTooltip(String tooltip) {
+ recipeNameTooltip = new NEIHandlerAbsoluteTooltip(tooltip, new Rectangle(13, -34, RECIPE_NAME_WIDTH - 1, 11));
+ }
+
+ @Override
+ public String getRecipeTabName() {
+ return StatCollector.translateToLocal(recipeCategory.unlocalizedName);
+ }
+
+ @Override
+ public String getGuiTexture() {
+ // not called
+ return "";
+ }
+
+ @Override
+ public List<String> handleItemTooltip(GuiRecipe<?> gui, ItemStack aStack, List<String> currentTip,
+ int aRecipeIndex) {
+ if (recipeNameTooltip != null) {
+ recipeNameTooltip.handleTooltip(currentTip, aRecipeIndex);
+ }
+ if (aStack == null) {
+ return currentTip;
+ }
+
+ CachedRecipe tObject = this.arecipes.get(aRecipeIndex);
+ if (tObject instanceof CachedDefaultRecipe) {
+ currentTip = frontend.handleNEIItemTooltip(aStack, currentTip, (CachedDefaultRecipe) tObject);
+ }
+ return currentTip;
+ }
+
+ @Override
+ public void drawExtras(int aRecipeIndex) {
+ CachedDefaultRecipe cachedRecipe = ((CachedDefaultRecipe) this.arecipes.get(aRecipeIndex));
+
+ drawDescription(cachedRecipe);
+ frontend.drawNEIOverlays(cachedRecipe);
+ }
+
+ private void drawDescription(CachedDefaultRecipe cachedRecipe) {
+ GT_Recipe recipe = cachedRecipe.mRecipe;
+ if (overclockDescriber == null) {
+ // By default, assume generic LV EU with no overclocks
+ overclockDescriber = new EUNoOverclockDescriber((byte) 1, uiProperties.amperage);
+ }
+
+ GT_OverclockCalculator calculator = overclockDescriber.createCalculator(
+ new GT_OverclockCalculator().setRecipeEUt(recipe.mEUt)
+ .setDuration(recipe.mDuration),
+ recipe);
+ calculator.calculate();
+
+ frontend.drawDescription(
+ new RecipeDisplayInfo(
+ recipe,
+ recipeMap,
+ overclockDescriber,
+ calculator,
+ getDescriptionYOffset(),
+ neiTextColorOverride));
+ }
+
+ protected int getDescriptionYOffset() {
+ return neiProperties.recipeBackgroundSize.height + neiProperties.recipeBackgroundOffset.y + WINDOW_OFFSET.y + 3;
+ }
+
+ protected void drawUI(ModularWindow window) {
+ for (IDrawable background : window.getBackground()) {
+ GlStateManager.pushMatrix();
+ GlStateManager.translate(
+ WINDOW_OFFSET.x + neiProperties.recipeBackgroundOffset.x,
+ WINDOW_OFFSET.y + neiProperties.recipeBackgroundOffset.y,
+ 0);
+ GlStateManager.color(1f, 1f, 1f, 1f);
+ background.draw(Pos2d.ZERO, window.getSize(), 0);
+ GlStateManager.popMatrix();
+ }
+
+ for (Widget widget : window.getChildren()) {
+ // NEI already did translation, so we can't use Widget#drawInternal here
+ GlStateManager.pushMatrix();
+ GlStateManager.translate(widget.getPos().x, widget.getPos().y, 0);
+ GlStateManager.color(1, 1, 1, window.getAlpha());
+ GlStateManager.enableBlend();
+
+ // maybe we can use Minecraft#timer but none of the IDrawables use partialTicks
+ widget.drawBackground(0);
+
+ // noinspection OverrideOnly // It's either suppressing this warning or changing ModularUI
+ widget.draw(0);
+ GlStateManager.popMatrix();
+ }
+ }
+
+ public static int getDrawTicks() {
+ return drawTicks;
+ }
+
+ public static class FixedPositionedStack extends PositionedStack {
+
+ public static final DecimalFormat chanceFormat = new DecimalFormat("##0.##%");
+ public final int mChance;
+ public final int realStackSize;
+ public final boolean renderRealStackSize;
+
+ public FixedPositionedStack(Object object, boolean renderRealStackSizes, int x, int y) {
+ this(object, renderRealStackSizes, x, y, 0, true);
+ }
+
+ public FixedPositionedStack(Object object, boolean renderRealStackSizes, int x, int y, boolean aUnificate) {
+ this(object, renderRealStackSizes, x, y, 0, aUnificate);
+ }
+
+ public FixedPositionedStack(Object object, boolean renderRealStackSize, int x, int y, int aChance,
+ boolean aUnificate) {
+ super(aUnificate ? GT_OreDictUnificator.getNonUnifiedStacks(object) : object, x, y, true);
+ this.mChance = aChance;
+ realStackSize = item != null ? item.stackSize : 0;
+ this.renderRealStackSize = renderRealStackSize;
+ if (!renderRealStackSize) {
+ for (ItemStack stack : items) {
+ stack.stackSize = 1;
+ }
+ }
+ }
+
+ public boolean isChanceBased() {
+ return mChance > 0 && mChance < 10000;
+ }
+
+ public String getChanceText() {
+ return chanceFormat.format((float) mChance / 10000);
+ }
+
+ public boolean isNotConsumed() {
+ return !isFluid() && item.stackSize == 0;
+ }
+
+ public boolean isFluid() {
+ return ItemList.Display_Fluid.isStackEqual(item, true, true);
+ }
+ }
+
+ public class CachedDefaultRecipe extends TemplateRecipeHandler.CachedRecipe {
+
+ public final GT_Recipe mRecipe;
+ public final List<PositionedStack> mOutputs;
+ public final List<PositionedStack> mInputs;
+
+ public CachedDefaultRecipe(GT_Recipe aRecipe) {
+ super();
+ this.mRecipe = aRecipe;
+ mOutputs = new ArrayList<>();
+ mInputs = new ArrayList<>();
+
+ for (Widget child : modularWindow.getChildren()) {
+ if (child instanceof SlotWidget widget) {
+ if (widget.getMcSlot()
+ .getItemHandler() == itemInputsInventory) {
+ int i = widget.getMcSlot()
+ .getSlotIndex();
+ Object input = aRecipe instanceof GT_Recipe.GT_Recipe_WithAlt
+ ? ((GT_Recipe.GT_Recipe_WithAlt) aRecipe).getAltRepresentativeInput(i)
+ : aRecipe.getRepresentativeInput(i);
+ if (input != null) {
+ mInputs.add(
+ new FixedPositionedStack(
+ input,
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ widget.getPos().x + 1,
+ widget.getPos().y + 1,
+ true));
+ }
+ } else if (widget.getMcSlot()
+ .getItemHandler() == itemOutputsInventory) {
+ int i = widget.getMcSlot()
+ .getSlotIndex();
+ ItemStack output = aRecipe.getRepresentativeOutput(i);
+ if (output != null) {
+ mOutputs.add(
+ new FixedPositionedStack(
+ output,
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ widget.getPos().x + 1,
+ widget.getPos().y + 1,
+ aRecipe.getOutputChance(i),
+ GT_NEI_DefaultHandler.this.neiProperties.unificateOutput));
+ }
+ } else if (widget.getMcSlot()
+ .getItemHandler() == specialSlotInventory) {
+ if (aRecipe.mSpecialItems != null) {
+ mInputs.add(
+ new FixedPositionedStack(
+ aRecipe.mSpecialItems,
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ widget.getPos().x + 1,
+ widget.getPos().y + 1));
+ }
+
+ } else if (widget.getMcSlot()
+ .getItemHandler() == fluidInputsInventory) {
+ int i = widget.getMcSlot()
+ .getSlotIndex();
+ if (aRecipe.mFluidInputs.length > i && aRecipe.mFluidInputs[i] != null
+ && aRecipe.mFluidInputs[i].getFluid() != null) {
+ mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(aRecipe.mFluidInputs[i], true),
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ widget.getPos().x + 1,
+ widget.getPos().y + 1));
+ }
+ } else if (widget.getMcSlot()
+ .getItemHandler() == fluidOutputsInventory) {
+ int i = widget.getMcSlot()
+ .getSlotIndex();
+ if (aRecipe.mFluidOutputs.length > i && aRecipe.mFluidOutputs[i] != null
+ && aRecipe.mFluidOutputs[i].getFluid() != null) {
+ mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[i], true),
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ widget.getPos().x + 1,
+ widget.getPos().y + 1));
+ }
+ }
+ }
+ }
+
+ // items and fluids that exceed usual count
+ UIHelper.forEachSlots((i, backgrounds, pos) -> {
+ if (i >= GT_NEI_DefaultHandler.this.uiProperties.maxItemInputs && aRecipe.mInputs[i] != null) {
+ mInputs.add(
+ new FixedPositionedStack(
+ aRecipe.mInputs[i],
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ pos.x + 1,
+ pos.y + 1,
+ true));
+ }
+ }, (i, backgrounds, pos) -> {
+ if (i >= GT_NEI_DefaultHandler.this.uiProperties.maxItemOutputs && aRecipe.mOutputs[i] != null) {
+ mOutputs.add(
+ new FixedPositionedStack(
+ aRecipe.mOutputs[i],
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ pos.x + 1,
+ pos.y + 1,
+ aRecipe.getOutputChance(i),
+ GT_NEI_DefaultHandler.this.neiProperties.unificateOutput));
+ }
+ }, (i, backgrounds, pos) -> {}, (i, backgrounds, pos) -> {
+ if (i >= GT_NEI_DefaultHandler.this.uiProperties.maxFluidInputs && aRecipe.mFluidInputs[i] != null
+ && aRecipe.mFluidInputs[i].getFluid() != null) {
+ mInputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(aRecipe.mFluidInputs[i], true),
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ pos.x + 1,
+ pos.y + 1));
+ }
+ }, (i, backgrounds, pos) -> {
+ if (i >= GT_NEI_DefaultHandler.this.uiProperties.maxFluidOutputs && aRecipe.mFluidOutputs[i] != null
+ && aRecipe.mFluidOutputs[i].getFluid() != null) {
+ mOutputs.add(
+ new FixedPositionedStack(
+ GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[i], true),
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ pos.x + 1,
+ pos.y + 1));
+ }
+ },
+ IDrawable.EMPTY,
+ IDrawable.EMPTY,
+ GT_NEI_DefaultHandler.this.frontend.getUIProperties(),
+ aRecipe.mInputs.length,
+ aRecipe.mOutputs.length,
+ aRecipe.mFluidInputs.length,
+ aRecipe.mFluidOutputs.length,
+ SteamVariant.NONE,
+ WINDOW_OFFSET);
+ }
+
+ @Override
+ public List<PositionedStack> getIngredients() {
+ return getCycledIngredients(cycleTicksStatic / 10, this.mInputs);
+ }
+
+ @Override
+ public PositionedStack getResult() {
+ return null;
+ }
+
+ @Override
+ public List<PositionedStack> getOtherStacks() {
+ return this.mOutputs;
+ }
+ }
+
+ private class SortedRecipeListCache {
+
+ private int mCachedRecipesVersion = -1;
+
+ @Nullable
+ private SoftReference<List<CachedDefaultRecipe>> mCachedRecipes;
+
+ private Map<Byte, Range<Integer>> mTierIndexes;
+ private Range<Byte> mTierRange;
+
+ public int getCachedRecipesVersion() {
+ return mCachedRecipesVersion;
+ }
+
+ public void setCachedRecipesVersion(int aCachedRecipesVersion) {
+ this.mCachedRecipesVersion = aCachedRecipesVersion;
+ }
+
+ @Nullable
+ public List<CachedDefaultRecipe> getCachedRecipes() {
+ return mCachedRecipes == null ? null : mCachedRecipes.get();
+ }
+
+ public void setCachedRecipes(@Nonnull List<CachedDefaultRecipe> aCachedRecipes) {
+ this.mCachedRecipes = new SoftReference<>(aCachedRecipes);
+ }
+
+ public Range<Integer> getIndexRangeForTiers(byte lowerTier, byte upperTier) {
+ if (mTierIndexes == null) {
+ computeTierIndexes();
+ }
+ return Range.between(getLowIndexForTier(lowerTier), getHighIndexForTier(upperTier));
+ }
+
+ private void computeTierIndexes() {
+ // Holds 16 elements without rehashing
+ mTierIndexes = new HashMap<>(V.length + 1, 1f);
+ assert mCachedRecipes != null;
+ Iterator<CachedDefaultRecipe> iterator = Objects.requireNonNull(mCachedRecipes.get())
+ .iterator();
+
+ int index = 0;
+ int minIndex = 0;
+ int maxIndex = -1;
+ byte previousTier = -1;
+ byte lowestTier = 0;
+ while (iterator.hasNext()) {
+ CachedDefaultRecipe recipe = iterator.next();
+ byte recipeTier = GT_Utility
+ .getTier(recipe.mRecipe.mEUt / GT_NEI_DefaultHandler.this.recipeMap.getAmperage());
+ if (recipeTier != previousTier) {
+ if (maxIndex != -1) {
+ mTierIndexes.put(previousTier, Range.between(minIndex, maxIndex));
+ } else {
+ lowestTier = recipeTier;
+ }
+ minIndex = index;
+ previousTier = recipeTier;
+ }
+ maxIndex = index;
+ index++;
+ if (!iterator.hasNext()) {
+ mTierIndexes.put(recipeTier, Range.between(minIndex, maxIndex));
+ mTierRange = Range.between(lowestTier, recipeTier);
+ }
+ }
+ }
+
+ private int getLowIndexForTier(byte lowerTier) {
+ byte lowTier = (byte) Math.max(mTierRange.getMinimum(), lowerTier);
+ while (mTierIndexes.get(lowTier) == null) {
+ lowTier++;
+ }
+ return mTierIndexes.get(lowTier)
+ .getMinimum();
+ }
+
+ private int getHighIndexForTier(byte upperTier) {
+ byte highTier = (byte) Math.min(mTierRange.getMaximum(), upperTier);
+ while (mTierIndexes.get(highTier) == null) {
+ highTier--;
+ }
+ return mTierIndexes.get(highTier)
+ .getMaximum();
+ }
+ }
+}
diff --git a/src/main/java/gregtech/nei/NEIHandlerAbsoluteTooltip.java b/src/main/java/gregtech/nei/NEIHandlerAbsoluteTooltip.java
new file mode 100644
index 0000000000..bc1c6b5630
--- /dev/null
+++ b/src/main/java/gregtech/nei/NEIHandlerAbsoluteTooltip.java
@@ -0,0 +1,54 @@
+package gregtech.nei;
+
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.List;
+
+import codechicken.lib.gui.GuiDraw;
+
+public class NEIHandlerAbsoluteTooltip {
+
+ private final Rectangle area;
+ private final String tooltip;
+ private Dimension displaySize;
+
+ public NEIHandlerAbsoluteTooltip(String tooltip, Rectangle area) {
+ this.tooltip = tooltip;
+ this.area = area;
+ }
+
+ public void handleTooltip(List<String> currenttip, int recipeIndex) {
+ displaySize = GuiDraw.displaySize();
+ if (shouldAddTooltip(recipeIndex)) {
+ currenttip.add(tooltip);
+ }
+ }
+
+ private boolean shouldAddTooltip(int recipeIndex) {
+ return isPageFirstRecipe(recipeIndex) && mouseInArea();
+ }
+
+ private boolean mouseInArea() {
+ Point mousePos = getRelMouse();
+ return area.contains(mousePos);
+ }
+
+ private Point getRelMouse() {
+ int ySize = Math.min(Math.max(displaySize.height - 68, 166), 370);
+ int guiLeft = (displaySize.width - 176) / 2;
+ int guiTop = (displaySize.height - ySize) / 2 + 10;
+ Point mousePos = GuiDraw.getMousePosition();
+ return new Point(mousePos.x - guiLeft - 5, mousePos.y - guiTop - 38);
+ }
+
+ private boolean isPageFirstRecipe(int recipe) {
+ int actualRecipesPerPage = getActualRecipesPerPage();
+ return actualRecipesPerPage < 2 || recipe % 2 == 0;
+ }
+
+ private int getActualRecipesPerPage() {
+ int ySize = Math.min(Math.max(displaySize.height - 68, 166), 370);
+ return (ySize - (12 * 3)) / 135;
+ }
+}
diff --git a/src/main/java/gregtech/nei/NEI_GT_Config.java b/src/main/java/gregtech/nei/NEI_GT_Config.java
new file mode 100644
index 0000000000..cb51380539
--- /dev/null
+++ b/src/main/java/gregtech/nei/NEI_GT_Config.java
@@ -0,0 +1,187 @@
+package gregtech.nei;
+
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Map;
+
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ListMultimap;
+
+import codechicken.nei.api.API;
+import codechicken.nei.api.IConfigureNEI;
+import codechicken.nei.event.NEIRegisterHandlerInfosEvent;
+import codechicken.nei.recipe.GuiCraftingRecipe;
+import codechicken.nei.recipe.GuiUsageRecipe;
+import codechicken.nei.recipe.HandlerInfo;
+import codechicken.nei.recipe.TemplateRecipeHandler;
+import cpw.mods.fml.common.event.FMLInterModComms;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.RecipeMapWorkable;
+import gregtech.api.recipe.RecipeCategory;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.common.items.GT_MetaGenerated_Item_01;
+import gregtech.common.items.GT_MetaGenerated_Item_02;
+import gregtech.common.items.GT_MetaGenerated_Item_03;
+import gregtech.nei.dumper.BatchModeSupportDumper;
+import gregtech.nei.dumper.InputSeparationSupportDumper;
+import gregtech.nei.dumper.MaterialDumper;
+import gregtech.nei.dumper.MetaItemDumper;
+import gregtech.nei.dumper.MetaTileEntityDumper;
+import gregtech.nei.dumper.RecipeLockingSupportDumper;
+import gregtech.nei.dumper.VoidProtectionSupportDumper;
+
+public class NEI_GT_Config implements IConfigureNEI {
+
+ /**
+ * This map determines the order in which NEI handlers will be registered and displayed in tabs.
+ *
+ * <p>
+ * Handlers will be displayed in ascending order of integer value. Any recipe map that is not present in this map
+ * will be assigned a value of 0. Negative values are fine.
+ */
+ private static final ImmutableMap<RecipeMap<?>, Integer> RECIPE_MAP_ORDERING = ImmutableMap
+ .<RecipeMap<?>, Integer>builder()
+ .put(RecipeMaps.assemblylineVisualRecipes, 1)
+ .put(RecipeMaps.scannerFakeRecipes, 2)
+ .build();
+
+ private static final Comparator<GT_NEI_DefaultHandler> RECIPE_MAP_HANDLER_COMPARATOR = Comparator
+ .comparingInt(handler -> RECIPE_MAP_ORDERING.getOrDefault(handler.getRecipeMap(), 0));
+
+ private static ListMultimap<RecipeCategory, RecipeMapWorkable> RECIPE_CATALYST_INDEX;
+
+ public static boolean sIsAdded = true;
+
+ private static void addHandler(TemplateRecipeHandler handler) {
+ FMLInterModComms.sendRuntimeMessage(
+ GT_Values.GT,
+ "NEIPlugins",
+ "register-crafting-handler",
+ "gregtech@" + handler.getRecipeName() + "@" + handler.getOverlayIdentifier());
+ GuiCraftingRecipe.craftinghandlers.add(handler);
+ GuiUsageRecipe.usagehandlers.add(handler);
+ }
+
+ @Override
+ public void loadConfig() {
+ sIsAdded = false;
+ registerHandlers();
+ registerCatalysts();
+ registerItemEntries();
+ registerDumpers();
+ sIsAdded = true;
+ }
+
+ private void registerHandlers() {
+ RecipeCategory.ALL_RECIPE_CATEGORIES.values()
+ .stream()
+ .filter(
+ recipeCategory -> recipeCategory.recipeMap.getFrontend()
+ .getNEIProperties().registerNEI)
+ .map(GT_NEI_DefaultHandler::new)
+ .sorted(RECIPE_MAP_HANDLER_COMPARATOR)
+ .forEach(NEI_GT_Config::addHandler);
+ }
+
+ private void registerCatalysts() {
+ for (Map.Entry<RecipeCategory, Collection<RecipeMapWorkable>> entry : RECIPE_CATALYST_INDEX.asMap()
+ .entrySet()) {
+ entry.getValue()
+ .forEach(
+ recipeMapWorkable -> API.addRecipeCatalyst(
+ recipeMapWorkable.getStackForm(1),
+ entry.getKey().unlocalizedName,
+ recipeMapWorkable.getRecipeCatalystPriority()));
+ }
+ API.addRecipeCatalyst(
+ GT_ModHandler.getIC2Item("nuclearReactor", 1, null),
+ RecipeMaps.ic2NuclearFakeRecipes.unlocalizedName);
+ // Bronze Blast Furnace
+ API.removeRecipeCatalyst(
+ GT_ModHandler.getModItem("gregtech", "gt.blockmachines", 1, 108),
+ RecipeMaps.primitiveBlastRecipes.unlocalizedName);
+ }
+
+ private void registerItemEntries() {
+ API.addItemListEntry(ItemList.VOLUMETRIC_FLASK.get(1));
+ }
+
+ private void registerDumpers() {
+ API.addOption(new MetaTileEntityDumper());
+ API.addOption(new MaterialDumper());
+ API.addOption(new MetaItemDumper(GT_MetaGenerated_Item_01.INSTANCE, "metaitem01"));
+ API.addOption(new MetaItemDumper(GT_MetaGenerated_Item_02.INSTANCE, "metaitem02"));
+ API.addOption(new MetaItemDumper(GT_MetaGenerated_Item_03.INSTANCE, "metaitem03"));
+ API.addOption(new VoidProtectionSupportDumper());
+ API.addOption(new InputSeparationSupportDumper());
+ API.addOption(new BatchModeSupportDumper());
+ API.addOption(new RecipeLockingSupportDumper());
+ }
+
+ @SubscribeEvent
+ public void registerHandlerInfo(NEIRegisterHandlerInfosEvent event) {
+ if (RECIPE_CATALYST_INDEX == null) {
+ // This method will be called earlier than #loadConfig
+ generateRecipeCatalystIndex();
+ }
+ RecipeCategory.ALL_RECIPE_CATEGORIES.values()
+ .forEach(recipeCategory -> {
+ HandlerInfo.Builder builder = createHandlerInfoBuilderTemplate(recipeCategory);
+ HandlerInfo handlerInfo;
+ if (recipeCategory.handlerInfoCreator != null) {
+ handlerInfo = recipeCategory.handlerInfoCreator.apply(builder)
+ .build();
+ } else {
+ // Infer icon from recipe catalysts
+ RECIPE_CATALYST_INDEX.get(recipeCategory)
+ .stream()
+ .findFirst()
+ .ifPresent(catalyst -> builder.setDisplayStack(catalyst.getStackForm(1)));
+ handlerInfo = builder.build();
+ }
+ event.registerHandlerInfo(handlerInfo);
+ });
+ }
+
+ private HandlerInfo.Builder createHandlerInfoBuilderTemplate(RecipeCategory recipeCategory) {
+ return new HandlerInfo.Builder(
+ recipeCategory.unlocalizedName,
+ recipeCategory.ownerMod.getName(),
+ recipeCategory.ownerMod.getModId()).setShiftY(6)
+ .setHeight(135)
+ .setMaxRecipesPerPage(2);
+ }
+
+ private static void generateRecipeCatalystIndex() {
+ ImmutableListMultimap.Builder<RecipeCategory, RecipeMapWorkable> builder = new ImmutableListMultimap.Builder<>();
+ builder
+ .orderValuesBy(Comparator.comparing(recipeMapWorkable -> -recipeMapWorkable.getRecipeCatalystPriority()));
+ for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) {
+ IMetaTileEntity mte = GregTech_API.METATILEENTITIES[i];
+ if (!(mte instanceof RecipeMapWorkable recipeMapWorkable)) continue;
+ for (RecipeMap<?> recipeMap : recipeMapWorkable.getAvailableRecipeMaps()) {
+ for (RecipeCategory recipeCategory : recipeMap.getAssociatedCategories()) {
+ builder.put(recipeCategory, recipeMapWorkable);
+ }
+ }
+ }
+ RECIPE_CATALYST_INDEX = builder.build();
+ }
+
+ @Override
+ public String getName() {
+ return "GregTech NEI Plugin";
+ }
+
+ @Override
+ public String getVersion() {
+ return "(5.03a)";
+ }
+}
diff --git a/src/main/java/gregtech/nei/RecipeDisplayInfo.java b/src/main/java/gregtech/nei/RecipeDisplayInfo.java
new file mode 100644
index 0000000000..f9cc1a9a8c
--- /dev/null
+++ b/src/main/java/gregtech/nei/RecipeDisplayInfo.java
@@ -0,0 +1,99 @@
+package gregtech.nei;
+
+import static gregtech.api.util.GT_Utility.isStringInvalid;
+
+import java.util.List;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.client.Minecraft;
+
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.FieldsAreNonnullByDefault;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Holds info used for drawing descriptions on NEI.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+@FieldsAreNonnullByDefault
+public class RecipeDisplayInfo {
+
+ /**
+ * Recipe to show description.
+ */
+ public final GT_Recipe recipe;
+
+ /**
+ * RecipeMap the recipe belongs to.
+ */
+ public final RecipeMap<?> recipeMap;
+
+ /**
+ * When user looks up usage for machine, NEI will show all the recipes that the machine can process, taking tier of
+ * the machine into consideration. This object can be used to show info around overclocked EU/t and duration.
+ */
+ public final OverclockDescriber overclockDescriber;
+
+ /**
+ * Pre-built overclock calculator, used for drawing OC information. Do not calculate it again.
+ */
+ public final GT_OverclockCalculator calculator;
+
+ /**
+ * Current Y position for drawing description.
+ */
+ private int yPos;
+
+ private final int neiTextColorOverride;
+
+ RecipeDisplayInfo(GT_Recipe recipe, RecipeMap<?> recipeMap, OverclockDescriber overclockDescriber,
+ GT_OverclockCalculator calculator, int descriptionYOffset, int neiTextColorOverride) {
+ this.recipe = recipe;
+ this.recipeMap = recipeMap;
+ this.overclockDescriber = overclockDescriber;
+ this.calculator = calculator;
+ this.yPos = descriptionYOffset;
+ this.neiTextColorOverride = neiTextColorOverride;
+ }
+
+ /**
+ * Draws text.
+ */
+ public void drawText(@Nullable String text) {
+ drawText(text, 10);
+ }
+
+ /**
+ * Draws text.
+ *
+ * @param yShift y position to shift after this text
+ */
+ public void drawText(@Nullable String text, int yShift) {
+ drawText(text, 5, yShift);
+ }
+
+ /**
+ * Draws text.
+ *
+ * @param xStart x position to start drawing
+ * @param yShift y position to shift after this text
+ */
+ public void drawText(@Nullable String text, int xStart, int yShift) {
+ if (isStringInvalid(text)) return;
+ Minecraft.getMinecraft().fontRenderer
+ .drawString(text, xStart, yPos, neiTextColorOverride != -1 ? neiTextColorOverride : 0x000000);
+ yPos += yShift;
+ }
+
+ public void drawTextMultipleLines(List<String> texts) {
+ for (String text : texts) {
+ drawText(text, 10);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/nei/dumper/BatchModeSupportDumper.java b/src/main/java/gregtech/nei/dumper/BatchModeSupportDumper.java
new file mode 100644
index 0000000000..ea0168073a
--- /dev/null
+++ b/src/main/java/gregtech/nei/dumper/BatchModeSupportDumper.java
@@ -0,0 +1,10 @@
+package gregtech.nei.dumper;
+
+import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures;
+
+public class BatchModeSupportDumper extends MultiBlockFeatureSupportDumper {
+
+ public BatchModeSupportDumper() {
+ super("batch_mode", ControllerWithOptionalFeatures::supportsBatchMode);
+ }
+}
diff --git a/src/main/java/gregtech/nei/dumper/GregTechIDDumper.java b/src/main/java/gregtech/nei/dumper/GregTechIDDumper.java
new file mode 100644
index 0000000000..0c2f20ac22
--- /dev/null
+++ b/src/main/java/gregtech/nei/dumper/GregTechIDDumper.java
@@ -0,0 +1,61 @@
+package gregtech.nei.dumper;
+
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
+
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.ChatStyle;
+import net.minecraft.util.EnumChatFormatting;
+
+import codechicken.nei.NEIClientUtils;
+import codechicken.nei.config.DataDumper;
+
+public abstract class GregTechIDDumper extends DataDumper {
+
+ public GregTechIDDumper(String name) {
+ super("tools.dump.gt5u." + name);
+ }
+
+ @Override
+ public Iterable<String[]> dump(int modeInt) {
+ return dump(getMode(modeInt));
+ }
+
+ protected abstract Iterable<String[]> dump(Mode mode);
+
+ @Override
+ public String modeButtonText() {
+ return NEIClientUtils.lang.translate("options.tools.dump.gt5u.mode." + getMode());
+ }
+
+ @Override
+ public void dumpFile() {
+ super.dumpFile();
+ logWarn();
+ }
+
+ protected void super$dumpFile() {
+ super.dumpFile();
+ }
+
+ protected void logWarn() {
+ if (!NewHorizonsCoreMod.isModLoaded()) {
+ NEIClientUtils.printChatMessage(
+ new ChatComponentTranslation("nei.options.tools.dump.gt5u.warn_env")
+ .setChatStyle(new ChatStyle().setColor(EnumChatFormatting.DARK_RED)));
+ }
+ }
+
+ @Override
+ public int modeCount() {
+ return Mode.values().length;
+ }
+
+ protected Mode getMode(int modeInt) {
+ return Mode.values()[modeInt];
+ }
+
+ protected enum Mode {
+ FREE,
+ USED
+ }
+}
diff --git a/src/main/java/gregtech/nei/dumper/InputSeparationSupportDumper.java b/src/main/java/gregtech/nei/dumper/InputSeparationSupportDumper.java
new file mode 100644
index 0000000000..5b0d293827
--- /dev/null
+++ b/src/main/java/gregtech/nei/dumper/InputSeparationSupportDumper.java
@@ -0,0 +1,10 @@
+package gregtech.nei.dumper;
+
+import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures;
+
+public class InputSeparationSupportDumper extends MultiBlockFeatureSupportDumper {
+
+ public InputSeparationSupportDumper() {
+ super("input_separation", ControllerWithOptionalFeatures::supportsInputSeparation);
+ }
+}
diff --git a/src/main/java/gregtech/nei/dumper/MaterialDumper.java b/src/main/java/gregtech/nei/dumper/MaterialDumper.java
new file mode 100644
index 0000000000..3234779de8
--- /dev/null
+++ b/src/main/java/gregtech/nei/dumper/MaterialDumper.java
@@ -0,0 +1,39 @@
+package gregtech.nei.dumper;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+
+public class MaterialDumper extends GregTechIDDumper {
+
+ public MaterialDumper() {
+ super("material");
+ }
+
+ @Override
+ public String[] header() {
+ return new String[] { "id", "name", };
+ }
+
+ @Override
+ protected Iterable<String[]> dump(Mode mode) {
+ List<String[]> dump = new ArrayList<>();
+ Map<Integer, Materials> idMap = Arrays.stream(GregTech_API.sGeneratedMaterials)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toMap(m -> m.mMetaItemSubID, m -> m));
+ for (int i = 0; i < 1000; i++) {
+ if (mode == Mode.FREE && !idMap.containsKey(i)) {
+ dump.add(new String[] { String.valueOf(i), "", });
+ } else if (mode == Mode.USED && idMap.containsKey(i)) {
+ dump.add(new String[] { String.valueOf(i), idMap.get(i).mName, });
+ }
+ }
+ return dump;
+ }
+}
diff --git a/src/main/java/gregtech/nei/dumper/MetaItemDumper.java b/src/main/java/gregtech/nei/dumper/MetaItemDumper.java
new file mode 100644
index 0000000000..519af48e93
--- /dev/null
+++ b/src/main/java/gregtech/nei/dumper/MetaItemDumper.java
@@ -0,0 +1,60 @@
+package gregtech.nei.dumper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+
+import codechicken.nei.NEIClientUtils;
+import gregtech.api.items.GT_MetaGenerated_Item;
+
+public class MetaItemDumper extends GregTechIDDumper {
+
+ private final GT_MetaGenerated_Item item;
+ private final String nameSuffix;
+
+ public MetaItemDumper(GT_MetaGenerated_Item item, String name) {
+ super(name);
+ this.nameSuffix = name;
+ this.item = item;
+ }
+
+ @Override
+ public String[] header() {
+ return new String[] { "id", "stackName", "metaID" };
+ }
+
+ @Override
+ protected Iterable<String[]> dump(Mode mode) {
+ List<String[]> list = new ArrayList<>();
+ for (int i = 0; i < item.mItemAmount; i++) {
+ int metaID = item.mOffset + i;
+ boolean generated = item.mEnabledItems.get(i);
+ if (mode == Mode.FREE && !generated) {
+ list.add(new String[] { String.valueOf(i), "", String.valueOf(metaID), });
+ } else if (mode == Mode.USED && generated) {
+ list.add(
+ new String[] { String.valueOf(i), new ItemStack(item, 1, metaID).getDisplayName(),
+ String.valueOf(metaID), });
+ }
+ }
+ return list;
+ }
+
+ @Override
+ public void dumpFile() {
+ super.super$dumpFile();
+ NEIClientUtils.printChatMessage(
+ new ChatComponentText(String.format("mOffset: %s, mItemAmount: %s", item.mOffset, item.mItemAmount)));
+ logWarn();
+ }
+
+ @Override
+ public String translateN(String s, Object... args) {
+ if (name.equals(s) || (name + "s").equals(s)) {
+ return nameSuffix;
+ }
+ return super.translateN(s, args);
+ }
+}
diff --git a/src/main/java/gregtech/nei/dumper/MetaTileEntityDumper.java b/src/main/java/gregtech/nei/dumper/MetaTileEntityDumper.java
new file mode 100644
index 0000000000..ee30cdfb8a
--- /dev/null
+++ b/src/main/java/gregtech/nei/dumper/MetaTileEntityDumper.java
@@ -0,0 +1,37 @@
+package gregtech.nei.dumper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+
+public class MetaTileEntityDumper extends GregTechIDDumper {
+
+ public MetaTileEntityDumper() {
+ super("metatileentity");
+ }
+
+ @Override
+ public String[] header() {
+ return new String[] { "id", "stackName", "className", };
+ }
+
+ @Override
+ protected Iterable<String[]> dump(Mode mode) {
+ List<String[]> list = new ArrayList<>();
+ for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) {
+ IMetaTileEntity mte = GregTech_API.METATILEENTITIES[i];
+ if (mode == Mode.FREE && mte == null) {
+ list.add(new String[] { String.valueOf(i), "", "", });
+ } else if (mode == Mode.USED && mte != null) {
+ list.add(
+ new String[] { String.valueOf(i), mte.getStackForm(1)
+ .getDisplayName(),
+ mte.getClass()
+ .getSimpleName() });
+ }
+ }
+ return list;
+ }
+}
diff --git a/src/main/java/gregtech/nei/dumper/MultiBlockFeatureSupportDumper.java b/src/main/java/gregtech/nei/dumper/MultiBlockFeatureSupportDumper.java
new file mode 100644
index 0000000000..dc378ff9ad
--- /dev/null
+++ b/src/main/java/gregtech/nei/dumper/MultiBlockFeatureSupportDumper.java
@@ -0,0 +1,46 @@
+package gregtech.nei.dumper;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+import codechicken.nei.config.DataDumper;
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures;
+
+public abstract class MultiBlockFeatureSupportDumper extends DataDumper {
+
+ private final Function<ControllerWithOptionalFeatures, Boolean> isFeatureSupported;
+
+ public MultiBlockFeatureSupportDumper(String name,
+ Function<ControllerWithOptionalFeatures, Boolean> isFeatureSupported) {
+ super("tools.dump.gt5u." + name);
+ this.isFeatureSupported = isFeatureSupported;
+ }
+
+ @Override
+ public String[] header() {
+ return new String[] { "className" };
+ }
+
+ @Override
+ public Iterable<String[]> dump(int mode) {
+ List<String[]> list = new ArrayList<>();
+ for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) {
+ IMetaTileEntity mte = GregTech_API.METATILEENTITIES[i];
+ if (!(mte instanceof ControllerWithOptionalFeatures controller)) continue;
+ if (!isFeatureSupported.apply(controller)) {
+ list.add(
+ new String[] { controller.getClass()
+ .getName() });
+ }
+ }
+ return list;
+ }
+
+ @Override
+ public int modeCount() {
+ return 1;
+ }
+}
diff --git a/src/main/java/gregtech/nei/dumper/RecipeLockingSupportDumper.java b/src/main/java/gregtech/nei/dumper/RecipeLockingSupportDumper.java
new file mode 100644
index 0000000000..05deba6c39
--- /dev/null
+++ b/src/main/java/gregtech/nei/dumper/RecipeLockingSupportDumper.java
@@ -0,0 +1,10 @@
+package gregtech.nei.dumper;
+
+import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures;
+
+public class RecipeLockingSupportDumper extends MultiBlockFeatureSupportDumper {
+
+ public RecipeLockingSupportDumper() {
+ super("recipe_locking", ControllerWithOptionalFeatures::supportsSingleRecipeLocking);
+ }
+}
diff --git a/src/main/java/gregtech/nei/dumper/VoidProtectionSupportDumper.java b/src/main/java/gregtech/nei/dumper/VoidProtectionSupportDumper.java
new file mode 100644
index 0000000000..b48efb2cdc
--- /dev/null
+++ b/src/main/java/gregtech/nei/dumper/VoidProtectionSupportDumper.java
@@ -0,0 +1,10 @@
+package gregtech.nei.dumper;
+
+import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures;
+
+public class VoidProtectionSupportDumper extends MultiBlockFeatureSupportDumper {
+
+ public VoidProtectionSupportDumper() {
+ super("void_protection", ControllerWithOptionalFeatures::supportsVoidProtection);
+ }
+}
diff --git a/src/main/java/gregtech/nei/formatter/DefaultSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/DefaultSpecialValueFormatter.java
new file mode 100644
index 0000000000..1c4d486319
--- /dev/null
+++ b/src/main/java/gregtech/nei/formatter/DefaultSpecialValueFormatter.java
@@ -0,0 +1,36 @@
+package gregtech.nei.formatter;
+
+import static gregtech.api.util.GT_Utility.trans;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.GT_Mod;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class DefaultSpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ public static DefaultSpecialValueFormatter INSTANCE = new DefaultSpecialValueFormatter();
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ int specialValue = recipeInfo.recipe.mSpecialValue;
+ if (specialValue == -100 && GT_Mod.gregtechproxy.mLowGravProcessing) {
+ return Collections.singletonList(trans("159", "Needs Low Gravity"));
+ } else if (specialValue == -200 && GT_Mod.gregtechproxy.mEnableCleanroom) {
+ return Collections.singletonList(trans("160", "Needs Cleanroom"));
+ } else if (specialValue == -201) {
+ return Collections.singletonList(trans("206", "Scan for Assembly Line"));
+ } else if (specialValue == -300 && GT_Mod.gregtechproxy.mEnableCleanroom) {
+ return Collections.singletonList(trans("160.1", "Needs Cleanroom & LowGrav"));
+ } else if (specialValue == -400) {
+ return Collections.singletonList(trans("216", "Deprecated Recipe"));
+ }
+ return Collections.emptyList();
+ }
+}
diff --git a/src/main/java/gregtech/nei/formatter/FuelSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/FuelSpecialValueFormatter.java
new file mode 100644
index 0000000000..dcfe2617dd
--- /dev/null
+++ b/src/main/java/gregtech/nei/formatter/FuelSpecialValueFormatter.java
@@ -0,0 +1,27 @@
+package gregtech.nei.formatter;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class FuelSpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ public static FuelSpecialValueFormatter INSTANCE = new FuelSpecialValueFormatter();
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ return Collections.singletonList(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.nei.fuel",
+ GT_Utility.formatNumbers(recipeInfo.recipe.mSpecialValue * 1000L)));
+ }
+}
diff --git a/src/main/java/gregtech/nei/formatter/FusionSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/FusionSpecialValueFormatter.java
new file mode 100644
index 0000000000..77cd41b343
--- /dev/null
+++ b/src/main/java/gregtech/nei/formatter/FusionSpecialValueFormatter.java
@@ -0,0 +1,59 @@
+package gregtech.nei.formatter;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class FusionSpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ public static final FusionSpecialValueFormatter INSTANCE = new FusionSpecialValueFormatter();
+ private static final long M = 1000000;
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ int euToStart = recipeInfo.recipe.mSpecialValue;
+ int voltage = recipeInfo.recipe.mEUt;
+ int tier = getFusionTier(euToStart, voltage);
+
+ return Collections.singletonList(
+ StatCollector.translateToLocalFormatted("GT5U.nei.start_eu", GT_Utility.formatNumbers(euToStart), tier));
+ }
+
+ public static int getFusionTier(long startupPower, long voltage) {
+ int tier;
+ if (startupPower <= 10 * M * 16) {
+ tier = 1;
+ } else if (startupPower <= 20 * M * 16) {
+ tier = 2;
+ } else if (startupPower <= 40 * M * 16) {
+ tier = 3;
+ } else if (startupPower <= 320 * M * 16) {
+ tier = 4;
+ } else {
+ tier = 5;
+ }
+
+ if (voltage <= GT_Values.V[6]) {
+ // no-op
+ } else if (voltage <= GT_Values.V[7]) {
+ tier = Math.max(tier, 2);
+ } else if (voltage <= GT_Values.V[8]) {
+ tier = Math.max(tier, 3);
+ } else if (voltage <= GT_Values.V[9]) {
+ tier = Math.max(tier, 4);
+ } else {
+ tier = 5;
+ }
+ return tier;
+ }
+}
diff --git a/src/main/java/gregtech/nei/formatter/HeatingCoilSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/HeatingCoilSpecialValueFormatter.java
new file mode 100644
index 0000000000..f5c17a1163
--- /dev/null
+++ b/src/main/java/gregtech/nei/formatter/HeatingCoilSpecialValueFormatter.java
@@ -0,0 +1,30 @@
+package gregtech.nei.formatter;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class HeatingCoilSpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ public static final HeatingCoilSpecialValueFormatter INSTANCE = new HeatingCoilSpecialValueFormatter();
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ int heat = recipeInfo.recipe.mSpecialValue;
+ return Collections.singletonList(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.nei.heat_capacity",
+ GT_Utility.formatNumbers(heat),
+ HeatingCoilLevel.getDisplayNameFromHeat(heat, false)));
+ }
+}
diff --git a/src/main/java/gregtech/nei/formatter/INEISpecialInfoFormatter.java b/src/main/java/gregtech/nei/formatter/INEISpecialInfoFormatter.java
new file mode 100644
index 0000000000..21228240d4
--- /dev/null
+++ b/src/main/java/gregtech/nei/formatter/INEISpecialInfoFormatter.java
@@ -0,0 +1,24 @@
+package gregtech.nei.formatter;
+
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+/**
+ * Getter for description for {@link gregtech.api.util.GT_Recipe#mSpecialValue} etc. that will be drawn on NEI.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+@FunctionalInterface
+public interface INEISpecialInfoFormatter {
+
+ /**
+ * @param recipeInfo Recipe info to draw description. You can retrieve special value with
+ * {@code recipeInfo.recipe.mSpecialValue}.
+ * @return List of strings containing info for special value etc.
+ */
+ List<String> format(RecipeDisplayInfo recipeInfo);
+}
diff --git a/src/main/java/gregtech/nei/formatter/SimpleSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/SimpleSpecialValueFormatter.java
new file mode 100644
index 0000000000..8f2098c0a9
--- /dev/null
+++ b/src/main/java/gregtech/nei/formatter/SimpleSpecialValueFormatter.java
@@ -0,0 +1,49 @@
+package gregtech.nei.formatter;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+/**
+ * Simple formatter for recipe's special value.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class SimpleSpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ @Nullable
+ private final String translationKey;
+ private final int multiplier;
+
+ /**
+ * @param translationKey Localization key to format
+ * @param multiplier Number to multiply to special value for display
+ */
+ public SimpleSpecialValueFormatter(@Nullable String translationKey, int multiplier) {
+ this.translationKey = translationKey;
+ this.multiplier = multiplier;
+ }
+
+ /**
+ * @param translationKey Localization key to format
+ */
+ public SimpleSpecialValueFormatter(@Nullable String translationKey) {
+ this(translationKey, 1);
+ }
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ return Collections.singletonList(
+ StatCollector.translateToLocalFormatted(
+ translationKey,
+ GT_Utility.formatNumbers((long) recipeInfo.recipe.mSpecialValue * multiplier)));
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/BlockIcons.java b/src/main/java/net/glease/ggfab/BlockIcons.java
new file mode 100644
index 0000000000..638b206f44
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/BlockIcons.java
@@ -0,0 +1,45 @@
+package net.glease.ggfab;
+
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IIconContainer;
+
+public enum BlockIcons implements IIconContainer, Runnable {
+
+ OVERLAY_FRONT_ADV_ASSLINE_ACTIVE,
+ OVERLAY_FRONT_ADV_ASSLINE_ACTIVE_GLOW,
+ OVERLAY_FRONT_ADV_ASSLINE_STUCK,
+ OVERLAY_FRONT_ADV_ASSLINE_STUCK_GLOW,
+ OVERLAY_FRONT_ADV_ASSLINE,
+ OVERLAY_FRONT_ADV_ASSLINE_GLOW,;
+
+ public static final String RES_PATH = GGConstants.MODID + ":";
+ private IIcon mIcon;
+
+ BlockIcons() {
+ GregTech_API.sGTBlockIconload.add(this);
+ }
+
+ @Override
+ public IIcon getIcon() {
+ return mIcon;
+ }
+
+ @Override
+ public IIcon getOverlayIcon() {
+ return null;
+ }
+
+ @Override
+ public ResourceLocation getTextureFile() {
+ return TextureMap.locationBlocksTexture;
+ }
+
+ @Override
+ public void run() {
+ mIcon = GregTech_API.sBlockIcons.registerIcon(RES_PATH + "iconsets/" + this);
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/ComponentRecipeLoader.java b/src/main/java/net/glease/ggfab/ComponentRecipeLoader.java
new file mode 100644
index 0000000000..916fa92a50
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/ComponentRecipeLoader.java
@@ -0,0 +1,45 @@
+package net.glease.ggfab;
+
+import static gregtech.api.enums.GT_Values.RA;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+class ComponentRecipeLoader implements Runnable {
+
+ @Override
+ public void run() {
+ Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null
+ ? FluidRegistry.getFluid("molten.indalloy140")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+ RA.addAssemblylineRecipe(
+ ItemList.Machine_Multi_Assemblyline.get(1L),
+ 96000,
+ new Object[] { ItemList.Machine_Multi_Assemblyline.get(1L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 2 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Elite), 4 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Data), 8 },
+ ItemList.Automation_ChestBuffer_LuV.get(1L), },
+ new FluidStack[] { new FluidStack(solderIndalloy, 1296), Materials.Lubricant.getFluid(2000) },
+ GGItemList.AdvAssLine.get(1L),
+ 1200,
+ 6000);
+ RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Input_Bus_IV.get(1L), ItemList.Emitter_IV.get(1L),
+ ItemList.Sensor_IV.get(1L), GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Enderium, 1L),
+ GT_Utility.getIntegratedCircuit(12), },
+ Materials.Polybenzimidazole.getMolten(144L),
+ GGItemList.LinkedInputBus.get(1L),
+ 600,
+ (int) GT_Values.VP[5]);
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/ConfigurationHandler.java b/src/main/java/net/glease/ggfab/ConfigurationHandler.java
new file mode 100644
index 0000000000..5364b00941
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/ConfigurationHandler.java
@@ -0,0 +1,52 @@
+package net.glease.ggfab;
+
+import java.io.File;
+import java.util.Map;
+
+import net.minecraftforge.common.config.ConfigCategory;
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.common.config.Property;
+
+public enum ConfigurationHandler {
+
+ INSTANCE;
+
+ private Configuration config;
+ private float laserOCPenaltyFactor;
+
+ void init(File f) {
+ config = new Configuration(f);
+ loadConfig();
+ setLanguageKeys();
+ }
+
+ private void setLanguageKeys() {
+ for (String categoryName : config.getCategoryNames()) {
+ ConfigCategory category = config.getCategory(categoryName);
+ category.setLanguageKey("ggfab.config." + categoryName);
+ for (Map.Entry<String, Property> entry : category.entrySet()) {
+ entry.getValue()
+ .setLanguageKey(String.format("%s.%s", category.getLanguagekey(), entry.getKey()));
+ }
+ }
+ }
+
+ private void loadConfig() {
+ laserOCPenaltyFactor = config.getFloat(
+ "advasslinePenaltyFactor",
+ "common.balancing",
+ 0.3f,
+ 0f,
+ 10f,
+ "Laser overclock penalty factor. This will incredibly change the game balance. Even a small step from 0.2 to 0.3 can have very significant impact. Tweak with caution!");
+ config.save();
+ }
+
+ public Configuration getConfig() {
+ return config;
+ }
+
+ public float getLaserOCPenaltyFactor() {
+ return laserOCPenaltyFactor;
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/GGConstants.java b/src/main/java/net/glease/ggfab/GGConstants.java
new file mode 100644
index 0000000000..8547dfc857
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/GGConstants.java
@@ -0,0 +1,16 @@
+package net.glease.ggfab;
+
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.GT_Version;
+
+public class GGConstants {
+
+ public static final String MODID = "ggfab";
+ public static final String RES_PATH_ITEM = MODID + ":";
+ public static final String MODNAME = "GigaGramFab";
+ public static final String VERSION = GT_Version.VERSION;
+
+ public static final String GGMARK = EnumChatFormatting.GOLD + "GigaGram" + EnumChatFormatting.RESET + "Fab";
+ public static final String GGMARK_TOOLTIP = "Added by " + GGMARK;
+}
diff --git a/src/main/java/net/glease/ggfab/GGItemList.java b/src/main/java/net/glease/ggfab/GGItemList.java
new file mode 100644
index 0000000000..d77d3854e1
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/GGItemList.java
@@ -0,0 +1,197 @@
+package net.glease.ggfab;
+
+import static gregtech.api.enums.GT_Values.W;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.interfaces.IItemContainer;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public enum GGItemList implements IItemContainer {
+
+ LinkedInputBus,
+ AdvAssLine,
+ // region single use tool
+ ToolCast_MV,
+ ToolCast_HV,
+ ToolCast_EV,
+ // order matters, do not insert randomly like a n00b
+ One_Use_craftingToolFile,
+ One_Use_craftingToolWrench,
+ One_Use_craftingToolCrowbar,
+ One_Use_craftingToolWireCutter,
+ One_Use_craftingToolHardHammer,
+ One_Use_craftingToolSoftHammer,
+ One_Use_craftingToolScrewdriver,
+ Shape_One_Use_craftingToolFile,
+ Shape_One_Use_craftingToolWrench,
+ Shape_One_Use_craftingToolCrowbar,
+ Shape_One_Use_craftingToolWireCutter,
+ Shape_One_Use_craftingToolHardHammer,
+ Shape_One_Use_craftingToolSoftHammer,
+ Shape_One_Use_craftingToolScrewdriver,
+ // ordered section ends
+ // endregion
+ //
+ ;
+
+ private ItemStack mStack;
+ private boolean mHasNotBeenSet = true;
+
+ @Override
+ public IItemContainer set(Item aItem) {
+ mHasNotBeenSet = false;
+ if (aItem == null) {
+ return this;
+ }
+ ItemStack aStack = new ItemStack(aItem, 1, 0);
+ mStack = GT_Utility.copyAmount(1, aStack);
+ return this;
+ }
+
+ @Override
+ public IItemContainer set(ItemStack aStack) {
+ mHasNotBeenSet = false;
+ mStack = GT_Utility.copyAmount(1, aStack);
+ return this;
+ }
+
+ @Override
+ public Item getItem() {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return null;
+ }
+ return mStack.getItem();
+ }
+
+ @Override
+ public Block getBlock() {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ return GT_Utility.getBlockFromStack(new ItemStack(getItem()));
+ }
+
+ @Override
+ public final boolean hasBeenSet() {
+ return !mHasNotBeenSet;
+ }
+
+ @Override
+ public boolean isStackEqual(Object aStack) {
+ return isStackEqual(aStack, false, false);
+ }
+
+ @Override
+ public boolean isStackEqual(Object aStack, boolean aWildcard, boolean aIgnoreNBT) {
+ if (GT_Utility.isStackInvalid(aStack)) {
+ return false;
+ }
+ return GT_Utility.areUnificationsEqual((ItemStack) aStack, aWildcard ? getWildcard(1) : get(1), aIgnoreNBT);
+ }
+
+ @Override
+ public ItemStack get(long aAmount, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmount(aAmount, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getWildcard(long aAmount, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, W, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getUndamaged(long aAmount, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, 0, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getAlmostBroken(long aAmount, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, mStack.getMaxDamage() - 1, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getWithName(long aAmount, String aDisplayName, Object... aReplacements) {
+ ItemStack rStack = get(1, aReplacements);
+ if (GT_Utility.isStackInvalid(rStack)) {
+ return null;
+ }
+ rStack.setStackDisplayName(aDisplayName);
+ return GT_Utility.copyAmount(aAmount, rStack);
+ }
+
+ @Override
+ public ItemStack getWithCharge(long aAmount, int aEnergy, Object... aReplacements) {
+ ItemStack rStack = get(1, aReplacements);
+ if (GT_Utility.isStackInvalid(rStack)) {
+ return null;
+ }
+ GT_ModHandler.chargeElectricItem(rStack, aEnergy, Integer.MAX_VALUE, true, false);
+ return GT_Utility.copyAmount(aAmount, rStack);
+ }
+
+ @Override
+ public ItemStack getWithDamage(long aAmount, long aMetaValue, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, aMetaValue, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public IItemContainer registerOre(Object... aOreNames) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ for (Object tOreName : aOreNames) {
+ GT_OreDictUnificator.registerOre(tOreName, get(1));
+ }
+ return this;
+ }
+
+ @Override
+ public IItemContainer registerWildcardAsOre(Object... aOreNames) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ for (Object tOreName : aOreNames) {
+ GT_OreDictUnificator.registerOre(tOreName, getWildcard(1));
+ }
+ return this;
+ }
+
+}
diff --git a/src/main/java/net/glease/ggfab/GigaGramFab.java b/src/main/java/net/glease/ggfab/GigaGramFab.java
new file mode 100644
index 0000000000..e03c1eacc5
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/GigaGramFab.java
@@ -0,0 +1,178 @@
+package net.glease.ggfab;
+
+import static gregtech.api.enums.ToolDictNames.*;
+import static gregtech.common.items.GT_MetaGenerated_Tool_01.*;
+import static net.glease.ggfab.api.GGFabRecipeMaps.toolCastRecipes;
+
+import net.glease.ggfab.api.GigaGramFabAPI;
+import net.glease.ggfab.items.GGMetaItem_DumbItems;
+import net.glease.ggfab.mte.MTE_AdvAssLine;
+import net.glease.ggfab.mte.MTE_LinkedInputBus;
+import net.glease.ggfab.util.GGUtils;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe;
+import gregtech.api.util.GT_ProcessingArray_Manager;
+
+@Mod(
+ modid = GGConstants.MODID,
+ version = GGConstants.VERSION,
+ name = GGConstants.MODNAME,
+ acceptedMinecraftVersions = "[1.7.10]",
+ dependencies = "required-after:IC2;required-before:gregtech")
+public class GigaGramFab {
+
+ public GigaGramFab() {
+ // initialize the textures
+ // noinspection ResultOfMethodCallIgnored
+ BlockIcons.OVERLAY_FRONT_ADV_ASSLINE.name();
+ }
+
+ @Mod.EventHandler
+ public void preInit(FMLPreInitializationEvent event) {
+ GregTech_API.sAfterGTPreload.add(() -> {
+ GGItemList.AdvAssLine
+ .set(new MTE_AdvAssLine(13532, "ggfab.machine.adv_assline", "Advanced Assembly Line").getStackForm(1));
+ GGItemList.LinkedInputBus.set(
+ new MTE_LinkedInputBus(13533, "ggfab.machine.linked_input_bus", "Linked Input Bus", 5).getStackForm(1));
+ GGItemList.ToolCast_MV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 13534,
+ "ggfab.toolcast.tier.mv",
+ "Basic Tool Casting Machine",
+ 2,
+ "Cheap Crafting Tool for you!",
+ toolCastRecipes,
+ 1,
+ 4,
+ 32000,
+ SoundResource.NONE,
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.MAIN_RANDOM_SPARKS,
+ "TOOL_CAST",
+ new Object[] { "PGP", "WMW", "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B', ItemList.Shape_Empty.get(1L) })
+ .getStackForm(1L));
+ GGItemList.ToolCast_HV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 13535,
+ "ggfab.toolcast.tier.hv",
+ "Advanced Tool Casting Machine",
+ 3,
+ "Cheap Crafting Tool for you!",
+ toolCastRecipes,
+ 1,
+ 4,
+ 64000,
+ SoundResource.NONE,
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.MAIN_RANDOM_SPARKS,
+ "TOOL_CAST",
+ new Object[] { "PGP", "WMW", "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B', ItemList.Shape_Empty.get(1L) })
+ .getStackForm(1L));
+ GGItemList.ToolCast_EV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 13536,
+ "ggfab.toolcast.tier.ev",
+ "Master Tool Casting Machine",
+ 4,
+ "Cheap Crafting Tool for you!",
+ toolCastRecipes,
+ 1,
+ 4,
+ 128000,
+ SoundResource.NONE,
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.MAIN_RANDOM_SPARKS,
+ "TOOL_CAST",
+ new Object[] { "PGP", "WMW", "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL, 'P',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B', ItemList.Shape_Empty.get(1L) })
+ .getStackForm(1L));
+ long plate = OrePrefixes.plate.mMaterialAmount, ingot = OrePrefixes.ingot.mMaterialAmount,
+ screw = OrePrefixes.screw.mMaterialAmount, rod = OrePrefixes.stick.mMaterialAmount;
+ GigaGramFabAPI.addSingleUseToolType(craftingToolFile, INSTANCE.mToolStats.get(FILE), 2 * plate);
+ GigaGramFabAPI.addSingleUseToolType(craftingToolWrench, INSTANCE.mToolStats.get(WRENCH), 6 * ingot);
+ GigaGramFabAPI.addSingleUseToolType(craftingToolCrowbar, INSTANCE.mToolStats.get(CROWBAR), 3 * rod);
+ GigaGramFabAPI.addSingleUseToolType(
+ craftingToolWireCutter,
+ INSTANCE.mToolStats.get(WIRECUTTER),
+ 3 * plate + 2 * rod + screw);
+ GigaGramFabAPI.addSingleUseToolType(craftingToolHardHammer, INSTANCE.mToolStats.get(HARDHAMMER), 6 * ingot);
+ GigaGramFabAPI.addSingleUseToolType(craftingToolSoftHammer, INSTANCE.mToolStats.get(SOFTMALLET), 6 * ingot);
+ GigaGramFabAPI.addSingleUseToolType(craftingToolScrewdriver, INSTANCE.mToolStats.get(SCREWDRIVER), 2 * rod);
+ GT_ProcessingArray_Manager.addRecipeMapToPA("ggfab.toolcast", toolCastRecipes);
+ });
+ GregTech_API.sBeforeGTPostload.add(new ComponentRecipeLoader());
+ GregTech_API.sBeforeGTPostload.add(new SingleUseToolRecipeLoader());
+ ConfigurationHandler.INSTANCE.init(event.getSuggestedConfigurationFile());
+
+ initDumbItem1();
+ }
+
+ @Mod.EventHandler
+ public void init(FMLInitializationEvent event) {}
+
+ @Mod.EventHandler
+ public void postInit(FMLPostInitializationEvent event) {}
+
+ private void initDumbItem1() {
+ GGMetaItem_DumbItems i1 = new GGMetaItem_DumbItems("ggfab.d1");
+ int id = 0;
+ {
+ int idShape = 30;
+ final int budget = idShape;
+ String prefix = "One_Use_craftingTool";
+ String prefix2 = "Shape_One_Use_craftingTool";
+ for (GGItemList i : GGItemList.values()) {
+ ItemStack stack = null;
+ if (i.name()
+ .startsWith(prefix)) {
+ stack = i1.addItem(
+ id++,
+ "Single Use " + GGUtils.processSentence(
+ i.name()
+ .substring(prefix.length()),
+ ' ',
+ true,
+ true),
+ null,
+ i,
+ i.name()
+ .substring("One_Use_".length()));
+ } else if (i.name()
+ .startsWith(prefix2)) {
+ stack = i1.addItem(
+ idShape++,
+ "Tool Casting Mold (" + GGUtils.processSentence(
+ i.name()
+ .substring(prefix2.length()),
+ ' ',
+ true,
+ true) + ")",
+ null,
+ i);
+ }
+ if (stack != null) {
+ i.set(stack);
+ }
+ }
+ if (id >= budget || idShape >= 2 * budget || idShape - id != budget) throw new AssertionError();
+ id = budget * 2;
+ }
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/SingleUseToolRecipeLoader.java b/src/main/java/net/glease/ggfab/SingleUseToolRecipeLoader.java
new file mode 100644
index 0000000000..bc01c8f633
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/SingleUseToolRecipeLoader.java
@@ -0,0 +1,103 @@
+package net.glease.ggfab;
+
+import static gregtech.api.enums.ToolDictNames.*;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.glease.ggfab.api.GGFabRecipeMaps;
+import net.glease.ggfab.api.GigaGramFabAPI;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TierEU;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.interfaces.IToolStats;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+
+class SingleUseToolRecipeLoader implements Runnable {
+
+ @Override
+ public void run() {
+ ToolDictNames[] hardTools = new ToolDictNames[] { craftingToolHardHammer, craftingToolScrewdriver,
+ craftingToolWrench, craftingToolCrowbar, craftingToolWireCutter, craftingToolFile };
+ ToolDictNames[] softTools = new ToolDictNames[] { craftingToolSoftHammer };
+ addSingleUseToolRecipe(Materials.Steel, hardTools);
+ addSingleUseToolRecipe(Materials.Silver, 5000, hardTools);
+ addSingleUseToolRecipe(Materials.VanadiumSteel, hardTools);
+ addSingleUseToolRecipe(Materials.TungstenSteel, hardTools);
+ addSingleUseToolRecipe(Materials.HSSG, hardTools);
+ addSingleUseToolRecipe(Materials.Rubber, softTools);
+ addSingleUseToolRecipe(Materials.StyreneButadieneRubber, softTools);
+ addSingleUseToolRecipe(Materials.Polybenzimidazole, softTools);
+
+ String prefix = "Shape_One_Use_";
+ for (GGItemList value : GGItemList.values()) {
+ if (!value.name()
+ .startsWith(prefix)) {
+ continue;
+ }
+ ToolDictNames type = ToolDictNames.valueOf(
+ value.name()
+ .substring(prefix.length()));
+ GT_ModHandler
+ .addCraftingRecipe(value.get(1L), new Object[] { "h", "P", "I", 'P', ItemList.Shape_Empty, 'I', type });
+ }
+ }
+
+ private void addSingleUseToolRecipe(Materials material, ToolDictNames... types) {
+ addSingleUseToolRecipe(material, 10000, types);
+ }
+
+ private static long findNiceFactor(long fluids, long count) {
+ long end = Math.min(fluids, count);
+ for (long i = count / 256; i < end; i++) {
+ if (fluids % i == 0 && count % i == 0 && count / i < 256) return i;
+ }
+ return -1;
+ }
+
+ private void addSingleUseToolRecipe(Materials material, int outputModifier, ToolDictNames... types) {
+ if (material.mStandardMoltenFluid == null) {
+ throw new IllegalArgumentException("material does not have molten fluid form");
+ }
+ for (ToolDictNames type : types) {
+ IToolStats stats = GigaGramFabAPI.SINGLE_USE_TOOLS.get(type);
+ Long cost = GigaGramFabAPI.COST_SINGLE_USE_TOOLS.get(type);
+ if (stats == null || cost == null) {
+ throw new IllegalArgumentException(type + " not registered");
+ }
+ long fluids = cost * GT_Values.L / GT_Values.M, duration = 6 * SECONDS;
+ long count = (long) (material.mDurability * stats.getMaxDurabilityMultiplier()
+ * outputModifier
+ * 100
+ / stats.getToolDamagePerContainerCraft()
+ / 10000);
+ if (count > 64 * 4) {
+ long niceFactor = findNiceFactor(fluids, count);
+ if (niceFactor < 0) {
+ double mod = (double) count / (64 * 4L);
+ fluids = Math.max((long) (fluids / mod), 1L);
+ duration = Math.max((long) (duration / mod), 1L);
+ count = 64 * 4;
+ } else {
+ fluids /= niceFactor;
+ duration = Math.max(duration / niceFactor, 1);
+ count /= niceFactor;
+ }
+ } else if (count < 128) {
+ long mod = GT_Utility.ceilDiv(128, count);
+ fluids *= mod;
+ duration *= mod;
+ count *= mod;
+ }
+ GT_Values.RA.stdBuilder()
+ .fluidInputs(material.getMolten(fluids)) //
+ .metadata(GGFabRecipeMaps.OUTPUT_TYPE, type) //
+ .metadata(GGFabRecipeMaps.OUTPUT_COUNT, (int) count) //
+ .eut(TierEU.RECIPE_MV)
+ .duration(duration) //
+ .addTo(GGFabRecipeMaps.toolCastRecipes);
+ }
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/api/GGFabRecipeMaps.java b/src/main/java/net/glease/ggfab/api/GGFabRecipeMaps.java
new file mode 100644
index 0000000000..039b9d2b58
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/api/GGFabRecipeMaps.java
@@ -0,0 +1,64 @@
+package net.glease.ggfab.api;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import net.glease.ggfab.GGItemList;
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBuilder;
+import gregtech.api.recipe.RecipeMetadataKey;
+import gregtech.api.recipe.metadata.SimpleRecipeMetadataKey;
+import gregtech.api.util.GT_Recipe;
+
+public class GGFabRecipeMaps {
+
+ public static final RecipeMetadataKey<ToolDictNames> OUTPUT_TYPE = SimpleRecipeMetadataKey
+ .create(ToolDictNames.class, "output_type");
+ public static final RecipeMetadataKey<Integer> OUTPUT_COUNT = SimpleRecipeMetadataKey
+ .create(Integer.class, "output_count");
+ public static final RecipeMap<RecipeMapBackend> toolCastRecipes = RecipeMapBuilder.of("ggfab.recipe.toolcast")
+ .maxIO(1, 4, 1, 0)
+ .minInputs(1, 1)
+ .progressBar(GT_UITextures.PROGRESSBAR_ARROW, ProgressBar.Direction.RIGHT)
+ .recipeEmitter(b -> {
+ Optional<GT_Recipe> rr = b.noOptimize()
+ .validateNoInput()
+ .validateInputFluidCount(0, 1)
+ .validateNoOutput()
+ .validateNoOutputFluid()
+ .build();
+ if (!rr.isPresent()) return Collections.emptyList();
+ ToolDictNames outputType = b.getMetadata(OUTPUT_TYPE);
+ GT_Recipe r = rr.get();
+ int outputSize = b.getMetadataOrDefault(OUTPUT_COUNT, 0);
+ if (outputSize > 64 * 4 || outputSize <= 0) return Collections.emptyList();
+ ItemStack shape, output;
+ try {
+ shape = GGItemList.valueOf("Shape_One_Use_" + outputType)
+ .get(0L);
+ output = GGItemList.valueOf("One_Use_" + outputType)
+ .get(outputSize);
+ } catch (IllegalArgumentException ex) {
+ // this looks like python not java, but I don't have better way around this
+ return Collections.emptyList();
+ }
+ output.stackSize = outputSize;
+ List<ItemStack> outputs = new ArrayList<>();
+ int maxStackSize = output.getMaxStackSize();
+ while (output.stackSize > maxStackSize) outputs.add(output.splitStack(maxStackSize));
+ outputs.add(output);
+ r.mInputs = new ItemStack[] { shape };
+ r.mOutputs = outputs.toArray(new ItemStack[0]);
+ return Collections.singletonList(r);
+ })
+ .build();
+}
diff --git a/src/main/java/net/glease/ggfab/api/GigaGramFabAPI.java b/src/main/java/net/glease/ggfab/api/GigaGramFabAPI.java
new file mode 100644
index 0000000000..6b35b26486
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/api/GigaGramFabAPI.java
@@ -0,0 +1,30 @@
+package net.glease.ggfab.api;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.interfaces.IToolStats;
+
+public class GigaGramFabAPI {
+
+ private static final Logger apiLogger = LogManager.getLogger("GigaGramFabAPI");
+
+ private static final Map<ToolDictNames, IToolStats> SINGLE_USE_TOOLS_STORE = new HashMap<>();
+ public static final Map<ToolDictNames, IToolStats> SINGLE_USE_TOOLS = Collections
+ .unmodifiableMap(SINGLE_USE_TOOLS_STORE);
+
+ private static final Map<ToolDictNames, Long> COST_SINGLE_USE_TOOLS_STORE = new HashMap<>();
+ public static final Map<ToolDictNames, Long> COST_SINGLE_USE_TOOLS = Collections
+ .unmodifiableMap(COST_SINGLE_USE_TOOLS_STORE);
+
+ public static void addSingleUseToolType(ToolDictNames type, IToolStats stat, long materialCost) {
+ if (SINGLE_USE_TOOLS_STORE.put(type, stat) != null)
+ apiLogger.warn("Replacing stat of single use tool {}", type);
+ COST_SINGLE_USE_TOOLS_STORE.put(type, materialCost);
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/items/GGMetaItem_DumbItems.java b/src/main/java/net/glease/ggfab/items/GGMetaItem_DumbItems.java
new file mode 100644
index 0000000000..20a81a5abb
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/items/GGMetaItem_DumbItems.java
@@ -0,0 +1,153 @@
+package net.glease.ggfab.items;
+
+import static gregtech.api.enums.GT_Values.D1;
+
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.List;
+
+import net.glease.ggfab.GGConstants;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gnu.trove.map.TIntObjectMap;
+import gnu.trove.map.hash.TIntObjectHashMap;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.interfaces.IItemBehaviour;
+import gregtech.api.interfaces.IItemContainer;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+// mostly stolen from gt5 itself.
+public class GGMetaItem_DumbItems extends GT_MetaBase_Item {
+
+ public static final int MAX_ID = 32766;
+ private final BitSet mEnabledItems = new BitSet();
+ private final BitSet mVisibleItems = new BitSet();
+ private final ArrayList<IIcon> mIconList = new ArrayList<>();
+ private final TIntObjectMap<IItemContainer> mIconOverride = new TIntObjectHashMap<>();
+
+ public GGMetaItem_DumbItems(String aUnlocalized) {
+ super(aUnlocalized);
+ }
+
+ /**
+ * This adds a Custom Item to the ending Range.
+ *
+ * @param aID The Id of the assigned Item [0 - mItemAmount] (The MetaData gets auto-shifted by +mOffset)
+ * @param aEnglish The Default Localized Name of the created Item
+ * @param aToolTip The Default ToolTip of the created Item, you can also insert null for having no ToolTip
+ * @param aRandomData The OreDict Names you want to give the Item. Also used for TC Aspects and some other things.
+ * @return An ItemStack containing the newly created Item.
+ */
+ public final ItemStack addItem(int aID, String aEnglish, String aToolTip, Object... aRandomData) {
+ if (aID < 0 || aID > MAX_ID) return null;
+
+ if (aToolTip == null) aToolTip = "";
+ ItemStack rStack = new ItemStack(this, 1, aID);
+ mEnabledItems.set(aID);
+ mVisibleItems.set(aID);
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName(rStack) + ".name", aEnglish);
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName(rStack) + ".tooltip", aToolTip);
+ List<TC_Aspects.TC_AspectStack> tAspects = new ArrayList<>();
+ // Important Stuff to do first
+ for (Object tRandomData : aRandomData) if (tRandomData instanceof SubTag) {
+ if (tRandomData == SubTag.INVISIBLE) {
+ mVisibleItems.set(aID, false);
+ continue;
+ }
+ if (tRandomData == SubTag.NO_UNIFICATION) {
+ GT_OreDictUnificator.addToBlacklist(rStack);
+ }
+ }
+ // now check for the rest
+ for (Object tRandomData : aRandomData) if (tRandomData != null) {
+ boolean tUseOreDict = true;
+ if (tRandomData instanceof IItemBehaviour) {
+ @SuppressWarnings("unchecked")
+ IItemBehaviour<GT_MetaBase_Item> behavior = (IItemBehaviour<GT_MetaBase_Item>) tRandomData;
+ addItemBehavior(aID, behavior);
+ tUseOreDict = false;
+ }
+ if (tRandomData instanceof IItemContainer) {
+ ((IItemContainer) tRandomData).set(rStack);
+ tUseOreDict = false;
+ }
+ if (tRandomData instanceof SubTag) {
+ continue;
+ }
+ if (tRandomData instanceof IItemContainer) {
+ mIconOverride.put(aID, (IItemContainer) tRandomData);
+ } else if (tRandomData instanceof TC_Aspects.TC_AspectStack) {
+ ((TC_Aspects.TC_AspectStack) tRandomData).addToAspectList(tAspects);
+ } else if (tRandomData instanceof ItemData) {
+ if (GT_Utility.isStringValid(tRandomData)) {
+ GT_OreDictUnificator.registerOre(tRandomData, rStack);
+ } else {
+ GT_OreDictUnificator.addItemData(rStack, (ItemData) tRandomData);
+ }
+ } else if (tUseOreDict) {
+ GT_OreDictUnificator.registerOre(tRandomData, rStack);
+ }
+ }
+ if (GregTech_API.sThaumcraftCompat != null)
+ GregTech_API.sThaumcraftCompat.registerThaumcraftAspectsToItem(rStack, tAspects, false);
+ return rStack;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public final void registerIcons(IIconRegister aIconRegister) {
+ short j = (short) mEnabledItems.length();
+ mIconList.clear();
+ mIconList.ensureCapacity(j);
+ for (short i = 0; i < j; i++) {
+ if (mEnabledItems.get(i)) {
+ mIconList.add(aIconRegister.registerIcon(GGConstants.RES_PATH_ITEM + getUnlocalizedName() + "/" + i));
+ } else {
+ mIconList.add(null);
+ }
+ }
+ }
+
+ @Override
+ public IIcon getIconFromDamage(int aMetaData) {
+ if (aMetaData < 0 || aMetaData >= mIconList.size() || mIconList.get(aMetaData) == null)
+ return super.getIconFromDamage(aMetaData);
+ return mIconList.get(aMetaData);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubItems(Item aItem, CreativeTabs aCreativeTab, List aList) {
+ int j = mEnabledItems.length();
+ for (int i = 0; i < j; i++) {
+ if (mVisibleItems.get(i) || (D1 && mEnabledItems.get(i))) {
+ ItemStack tStack = new ItemStack(this, 1, i);
+ isItemStackUsable(tStack);
+ aList.add(tStack);
+ }
+ }
+ }
+
+ @Override
+ public Long[] getElectricStats(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public Long[] getFluidContainerStats(ItemStack aStack) {
+ return null;
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java b/src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java
new file mode 100644
index 0000000000..be0446c8ad
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java
@@ -0,0 +1,1144 @@
+package net.glease.ggfab.mte;
+
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockUnlocalizedName;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static gregtech.api.enums.GT_HatchElement.Energy;
+import static gregtech.api.enums.GT_HatchElement.ExoticEnergy;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.Maintenance;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.Textures.BlockIcons.casingTexturePages;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_StructureUtility.ofHatchAdder;
+import static gregtech.api.util.GT_Utility.filterValidMTEs;
+import static net.glease.ggfab.BlockIcons.OVERLAY_FRONT_ADV_ASSLINE;
+import static net.glease.ggfab.BlockIcons.OVERLAY_FRONT_ADV_ASSLINE_ACTIVE;
+import static net.glease.ggfab.BlockIcons.OVERLAY_FRONT_ADV_ASSLINE_ACTIVE_GLOW;
+import static net.glease.ggfab.BlockIcons.OVERLAY_FRONT_ADV_ASSLINE_GLOW;
+import static net.glease.ggfab.BlockIcons.OVERLAY_FRONT_ADV_ASSLINE_STUCK;
+import static net.glease.ggfab.BlockIcons.OVERLAY_FRONT_ADV_ASSLINE_STUCK_GLOW;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.stream.IntStream;
+
+import net.glease.ggfab.ConfigurationHandler;
+import net.glease.ggfab.GGConstants;
+import net.glease.ggfab.mui.ClickableTextWidget;
+import net.glease.ggfab.util.OverclockHelper;
+import net.minecraft.client.resources.I18n;
+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.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagInt;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.StringUtils;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizons.modularui.api.drawable.Text;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.widget.ISyncedWidget;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_MultiInput;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.render.TextureFactory;
+import gregtech.api.util.GT_AssemblyLineUtils;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.GT_Waila;
+import gregtech.api.util.IGT_HatchAdder;
+import gregtech.api.util.shutdown.ShutDownReason;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_InputBus_ME;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Input_ME;
+import mcp.mobius.waila.api.IWailaConfigHandler;
+import mcp.mobius.waila.api.IWailaDataAccessor;
+
+/*
+ * Dev note: 1. This multi will be an assline but with greater throughput. it will take one input every 2.
+ */
+public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<MTE_AdvAssLine>
+ implements ISurvivalConstructable {
+
+ private static final ItemStack NOT_CHECKED = new ItemStack(Blocks.dirt);
+ private static final String STRUCTURE_PIECE_FIRST = "first";
+ private static final String STRUCTURE_PIECE_LATER = "later";
+ private static final String STRUCTURE_PIECE_LAST = "last";
+ public static final String TAG_KEY_CURRENT_STICK = "mCurrentStick";
+ public static final String TAG_KEY_PROGRESS_TIMES = "mProgressTimeArray";
+ private static final IStructureDefinition<MTE_AdvAssLine> STRUCTURE_DEFINITION = StructureDefinition
+ .<MTE_AdvAssLine>builder()
+ // @formatter:off
+ .addShape(
+ STRUCTURE_PIECE_FIRST,
+ transpose(new String[][] {
+ { " ", "e", " " },
+ { "~", "l", "G" },
+ { "g", "m", "g" },
+ { "b", "i", "b" },
+ }))
+ .addShape(
+ STRUCTURE_PIECE_LATER,
+ transpose(new String[][] {
+ { " ", "e", " " },
+ { "d", "l", "d" },
+ { "g", "m", "g" },
+ { "b", "I", "b" },
+ }))
+ .addShape(
+ STRUCTURE_PIECE_LAST,
+ transpose(new String[][] {
+ { " ", "e", " " },
+ { "d", "l", "d" },
+ { "g", "m", "g" },
+ { "o", "i", "b" },
+ }))
+ // @formatter:on
+ .addElement('G', ofBlock(GregTech_API.sBlockCasings3, 10)) // grate machine casing
+ .addElement('l', ofBlock(GregTech_API.sBlockCasings2, 9)) // assembler machine casing
+ .addElement('m', ofBlock(GregTech_API.sBlockCasings2, 5)) // assembling line casing
+ .addElement(
+ 'g',
+ ofChain(
+ ofBlockUnlocalizedName("IC2", "blockAlloyGlass", 0, true),
+ ofBlockUnlocalizedName("bartworks", "BW_GlasBlocks", 0, true),
+ // warded glass
+ ofBlockUnlocalizedName("Thaumcraft", "blockCosmeticOpaque", 2, false)))
+ .addElement(
+ 'e',
+ ofChain(
+ Energy.or(ExoticEnergy)
+ .newAny(16, 1, ForgeDirection.UP, ForgeDirection.NORTH, ForgeDirection.SOUTH),
+ ofBlock(GregTech_API.sBlockCasings2, 0)))
+ .addElement(
+ 'd',
+ buildHatchAdder(MTE_AdvAssLine.class).atLeast(DataHatchElement.DataAccess)
+ .dot(2)
+ .casingIndex(42)
+ .allowOnly(ForgeDirection.NORTH)
+ .buildAndChain(GregTech_API.sBlockCasings3, 10))
+ .addElement(
+ 'b',
+ buildHatchAdder(MTE_AdvAssLine.class).atLeast(InputHatch, InputHatch, InputHatch, InputHatch, Maintenance)
+ .casingIndex(16)
+ .dot(3)
+ .allowOnly(ForgeDirection.DOWN)
+ .buildAndChain(
+ ofBlock(GregTech_API.sBlockCasings2, 0),
+ ofHatchAdder(MTE_AdvAssLine::addOutputToMachineList, 16, 4)))
+ .addElement(
+ 'I',
+ ofChain(
+ // all blocks nearby use solid steel casing, so let's use the texture of that
+ InputBus.newAny(16, 5, ForgeDirection.DOWN),
+ ofHatchAdder(MTE_AdvAssLine::addOutputToMachineList, 16, 4)))
+ .addElement('i', InputBus.newAny(16, 5, ForgeDirection.DOWN))
+ .addElement('o', OutputBus.newAny(16, 4, ForgeDirection.DOWN))
+ .build();
+ private ItemStack currentStick;
+ private GT_Recipe.GT_Recipe_AssemblyLine currentRecipe;
+ private final Slice[] slices = IntStream.range(0, 16)
+ .mapToObj(Slice::new)
+ .toArray(Slice[]::new);
+ private boolean processing;
+ private long inputVoltage;
+ // surely no one is using more EUt than this, no?
+ private long inputEUt;
+ private long baseEUt;
+ private boolean stuck;
+
+ private final List<GT_MetaTileEntity_Hatch_DataAccess> mDataAccessHatches = new ArrayList<>();
+ private Map<GT_Utility.ItemId, ItemStack> curBatchItemsFromME;
+ private Map<Fluid, FluidStack> curBatchFluidsFromME;
+ private int currentInputLength;
+ private String lastStopReason = "";
+ private int currentRecipeParallel = 1;
+ // Batch mode will increase parallel per slice to try to get as close as possible to this amount of ticks
+ // per slice, but will never go over this amount.
+ private static final int BATCH_MODE_DESIRED_TICKS_PER_SLICE = 128;
+
+ public MTE_AdvAssLine(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public MTE_AdvAssLine(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new MTE_AdvAssLine(mName);
+ }
+
+ public boolean addDataAccessToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
+ if (aTileEntity == null) return false;
+ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
+ if (aMetaTileEntity == null) return false;
+ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DataAccess) {
+ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex);
+ return mDataAccessHatches.add((GT_MetaTileEntity_Hatch_DataAccess) aMetaTileEntity);
+ }
+ return false;
+ }
+
+ private boolean checkMachine() {
+ return checkMachine(true) || checkMachine(false);
+ }
+
+ private boolean checkMachine(boolean leftToRight) {
+ clearHatches();
+ if (!checkPiece(STRUCTURE_PIECE_FIRST, 0, 1, 0)) return false;
+ for (int i = 1; i < 16; i++) {
+ if (!checkPiece(STRUCTURE_PIECE_LATER, leftToRight ? -i : i, 1, 0)) return false;
+ if (!mOutputBusses.isEmpty())
+ return (!mEnergyHatches.isEmpty() || !mExoticEnergyHatches.isEmpty()) && mMaintenanceHatches.size() == 1
+ && mDataAccessHatches.size() <= 1;
+ }
+ return false;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ buildPiece(STRUCTURE_PIECE_FIRST, stackSize, hintsOnly, 0, 1, 0);
+ int tLength = Math.min(stackSize.stackSize + 3, 16); // render 4 slices at minimal
+ for (int i = 1; i < tLength; i++) {
+ buildPiece(STRUCTURE_PIECE_LATER, stackSize, hintsOnly, -i, 1, 0);
+ }
+ }
+
+ @Override
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) {
+ if (mMachine) return -1;
+ int build = survivialBuildPiece(STRUCTURE_PIECE_FIRST, stackSize, 0, 1, 0, elementBudget, env, false, true);
+ if (build >= 0) return build;
+ int tLength = Math.min(stackSize.stackSize + 3, 16); // render 4 slices at minimal
+ for (int i = 1; i < tLength - 1; i++) {
+ build = survivialBuildPiece(STRUCTURE_PIECE_LATER, stackSize, -i, 1, 0, elementBudget, env, false, true);
+ if (build >= 0) return build;
+ }
+ return survivialBuildPiece(STRUCTURE_PIECE_LAST, stackSize, 1 - tLength, 1, 0, elementBudget, env, false, true);
+ }
+
+ @Override
+ public void initDefaultModes(NBTTagCompound aNBT) {
+ super.initDefaultModes(aNBT);
+ // blockrenderer6343 seems to place the block in a weird way, let's catch that
+ if (getBaseMetaTileEntity() != null && getBaseMetaTileEntity().isServerSide()) {
+ UUID ownerUuid = getBaseMetaTileEntity().getOwnerUuid();
+ if (ownerUuid == null) return;
+ float factor = ConfigurationHandler.INSTANCE.getLaserOCPenaltyFactor();
+ MinecraftServer server = MinecraftServer.getServer();
+ // more blockrenderer6343 weirdness
+ if (server == null) return;
+ @SuppressWarnings("unchecked")
+ List<EntityPlayerMP> l = server.getConfigurationManager().playerEntityList;
+ for (EntityPlayerMP p : l) {
+ if (p.getUniqueID()
+ .equals(ownerUuid)) {
+ for (int i = 0; i < 9; i++) {
+ // switch is stupid, but I have no better idea
+ Object[] args;
+ switch (i) {
+ case 7:
+ args = new Object[] { factor };
+ break;
+ case 8:
+ args = new Object[] { (int) (factor * 100) + 400,
+ (int) ((4 + factor) * (4 + factor + factor) * 100), 4 + factor,
+ 4 + factor + factor };
+ break;
+ default:
+ args = new Object[0];
+ }
+ p.addChatMessage(new ChatComponentTranslation("ggfab.info.advassline." + i, args));
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ if (stuck) {
+ return new ITexture[] { casingTexturePages[0][16], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ADV_ASSLINE_STUCK)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ADV_ASSLINE_STUCK_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ if (aActive) return new ITexture[] { casingTexturePages[0][16], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ADV_ASSLINE_ACTIVE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ADV_ASSLINE_ACTIVE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ return new ITexture[] { casingTexturePages[0][16], TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ADV_ASSLINE)
+ .extFacing()
+ .build(),
+ TextureFactory.builder()
+ .addIcon(OVERLAY_FRONT_ADV_ASSLINE_GLOW)
+ .extFacing()
+ .glow()
+ .build() };
+ }
+ return new ITexture[] { casingTexturePages[0][16] };
+ }
+
+ @Override
+ protected GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Assembling Line")
+ .addInfo("Controller block for the Advanced Assembling Line")
+ .addInfo("Built exactly the same as standard Assembling Line")
+ .addInfo("Place in world to get more info. It will be a lengthy read.")
+ .addInfo("Assembling Line with item pipelining")
+ .addInfo("All fluids are however consumed at start")
+ .addInfo("Use voltage of worst energy hatch for overclocking")
+ .addInfo("EU/t is (number of slices working) * (overclocked EU/t)")
+ .addSeparator()
+ .beginVariableStructureBlock(5, 16, 4, 4, 3, 3, false)
+ .addStructureInfo("From Bottom to Top, Left to Right")
+ .addStructureInfo(
+ "Layer 1 - Solid Steel Machine Casing, Input Bus (last can be Output Bus), Solid Steel Machine Casing")
+ .addStructureInfo(
+ "Layer 2 - Borosilicate Glass(any)/Warded Glass/Reinforced Glass, Assembling Line Casing, Reinforced Glass")
+ .addStructureInfo("Layer 3 - Grate Machine Casing, Assembler Machine Casing, Grate Machine Casing")
+ .addStructureInfo("Layer 4 - Empty, Solid Steel Machine Casing, Empty")
+ .addStructureInfo("Up to 16 repeating slices, each one allows for 1 more item in recipes")
+ .addController("Either Grate on layer 3 of the first slice")
+ .addEnergyHatch("Any layer 4 casing", 1)
+ .addMaintenanceHatch("Any layer 1 casing", 3)
+ .addInputBus("As specified on layer 1", 4, 5)
+ .addInputHatch("Any layer 1 casing", 3)
+ .addOutputBus("Replaces Input Bus on final slice or on any solid steel casing on layer 1", 4)
+ .addOtherStructurePart("Data Access Hatch", "Optional, next to controller", 2)
+ .toolTipFinisher(GGConstants.GGMARK);
+ return tt;
+ }
+
+ private void setCurrentRecipe(ItemStack stick, GT_Recipe.GT_Recipe_AssemblyLine recipe) {
+ currentRecipe = recipe;
+ currentStick = stick;
+ currentInputLength = recipe.mInputs.length;
+ // Reset parallel, we need to re-check on next recipe check to see if there are enough items in the first slice
+ currentRecipeParallel = 1;
+ }
+
+ private void clearCurrentRecipe() {
+ currentRecipe = null;
+ currentStick = null;
+ currentInputLength = -1;
+ stuck = false;
+ baseEUt = 0;
+ for (Slice slice : slices) {
+ slice.reset();
+ }
+ mMaxProgresstime = 0;
+ getBaseMetaTileEntity().issueClientUpdate();
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ aNBT.setString("lastStop", lastStopReason);
+ // we need to check for active here.
+ // if machine was turned off via soft mallet it will not call checkRecipe() on recipe end
+ // in that case we don't have a current recipe, so this should be ignored
+ if (getBaseMetaTileEntity().isActive() && GT_Utility.isStackValid(currentStick)) {
+ aNBT.setTag(TAG_KEY_CURRENT_STICK, currentStick.writeToNBT(new NBTTagCompound()));
+ aNBT.setInteger("mRecipeHash", currentRecipe.getPersistentHash());
+ aNBT.setIntArray(
+ TAG_KEY_PROGRESS_TIMES,
+ Arrays.stream(slices)
+ .limit(currentInputLength)
+ .mapToInt(s -> s.progress)
+ .toArray());
+ aNBT.setBoolean("stuck", stuck);
+ aNBT.setLong("inputV", inputVoltage);
+ aNBT.setLong("inputEU", inputEUt);
+ aNBT.setLong("baseEU", baseEUt);
+ aNBT.setInteger("currentParallel", currentRecipeParallel);
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ lastStopReason = aNBT.getString("lastStop");
+ ItemStack loadedStack = null;
+ GT_Recipe.GT_Recipe_AssemblyLine recipe = null;
+ if (aNBT.hasKey(TAG_KEY_PROGRESS_TIMES, Constants.NBT.TAG_INT_ARRAY)) {
+ int[] arr = aNBT.getIntArray(TAG_KEY_PROGRESS_TIMES);
+ for (int i = 0; i < slices.length; i++) {
+ if (i < arr.length) {
+ slices[i].progress = arr[i];
+ if (arr[i] == 0)
+ // this will be synced to client by first MTE packet to client
+ stuck = true;
+ } else slices[i].reset();
+ }
+ }
+ if (aNBT.hasKey(TAG_KEY_CURRENT_STICK, Constants.NBT.TAG_COMPOUND)) {
+ loadedStack = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag(TAG_KEY_CURRENT_STICK));
+ GT_AssemblyLineUtils.LookupResult lookupResult = GT_AssemblyLineUtils
+ .findAssemblyLineRecipeFromDataStick(loadedStack, false);
+ switch (lookupResult.getType()) {
+ case VALID_STACK_AND_VALID_HASH:
+ recipe = lookupResult.getRecipe();
+ stuck = aNBT.getBoolean("stuck");
+ inputVoltage = aNBT.getLong("inputV");
+ inputEUt = aNBT.getLong("inputEU");
+ baseEUt = aNBT.getLong("baseEU");
+ currentRecipeParallel = aNBT.getInteger("currentParallel");
+ if (inputVoltage <= 0 || inputEUt <= 0 || baseEUt >= 0) {
+ criticalStopMachine("ggfab.gui.advassline.shutdown.load.energy");
+ loadedStack = null;
+ recipe = null;
+ }
+ break;
+ case VALID_STACK_AND_VALID_RECIPE:
+ // recipe is there, but it has been changed. to prevent issues, abort the current recipe
+ // TODO finish the last recipe instead of aborting
+ default:
+ // recipe is gone. to prevent issues, abort the current recipe
+ criticalStopMachine("ggfab.gui.advassline.shutdown.load.recipe");
+ loadedStack = null;
+ break;
+ }
+ }
+ if (loadedStack == null || recipe == null) clearCurrentRecipe();
+ else setCurrentRecipe(loadedStack, recipe);
+ }
+
+ /**
+ * roughly the same as {@link #criticalStopMachine()}, but does not attempt to send a halting sound if world is not
+ * loaded. also supports setting a stop reason
+ */
+ private void criticalStopMachine(String reason) {
+ int oMaxProgresstime = mMaxProgresstime;
+ stopMachine();
+ // don't do these at all if the machine wasn't working before anyway
+ if (oMaxProgresstime > 0) {
+ if (getBaseMetaTileEntity().getWorld() != null) sendSound(INTERRUPT_SOUND_INDEX);
+ getBaseMetaTileEntity().setShutdownStatus(true);
+ lastStopReason = reason;
+ }
+ }
+
+ @Override
+ public IStructureDefinition<MTE_AdvAssLine> getStructureDefinition() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void clearHatches() {
+ super.clearHatches();
+ mExoticEnergyHatches.clear();
+ mDataAccessHatches.clear();
+ }
+
+ @Override
+ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ if (checkMachine() && (mEnergyHatches.size() > 0 || mExoticEnergyHatches.size() > 0)) {
+ long oV = inputVoltage, oEut = inputEUt;
+ inputVoltage = Integer.MAX_VALUE;
+ inputEUt = 0;
+ mEnergyHatches.forEach(this::recordEnergySupplier);
+ mExoticEnergyHatches.forEach(this::recordEnergySupplier);
+ if (mMaxProgresstime > 0 && (oV != inputVoltage || oEut != inputEUt)) {
+ criticalStopMachine("ggfab.gui.advassline.shutdown.structure");
+ }
+ return true;
+ } else {
+ inputVoltage = V[0];
+ return false;
+ }
+ }
+
+ private void recordEnergySupplier(GT_MetaTileEntity_Hatch hatch) {
+ if (!hatch.isValid()) return;
+ inputEUt += hatch.maxEUInput() * hatch.maxWorkingAmperesIn();
+ inputVoltage = Math.min(inputVoltage, hatch.maxEUInput());
+ if (inputEUt < 0) inputEUt = Long.MAX_VALUE;
+ }
+
+ @Override
+ protected void startRecipeProcessing() {
+ if (!processing) {
+ super.startRecipeProcessing();
+ curBatchItemsFromME = getStoredInputsFromME();
+ curBatchFluidsFromME = getStoredFluidsFromME();
+ processing = true;
+ }
+ }
+
+ @Override
+ protected void endRecipeProcessing() {
+ if (!processing) return;
+ super.endRecipeProcessing();
+ processing = false;
+ }
+
+ @Override
+ public void onValueUpdate(byte aValue) {
+ boolean oStuck = stuck;
+ stuck = (aValue & 1) == 1;
+ if (oStuck != stuck) getBaseMetaTileEntity().issueTextureUpdate();
+ }
+
+ @Override
+ public byte getUpdateData() {
+ return (byte) (stuck ? 1 : 0);
+ }
+
+ @Override
+ protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) {
+ super.drawTexts(screenElements, inventorySlot);
+ /*
+ * SliceStatusWidget[] arr =
+ * Arrays.stream(slices).map(SliceStatusWidget::new).toArray(SliceStatusWidget[]::new);
+ * screenElements.widgets(arr); screenElements.widget(new FakeSyncWidget.IntegerSyncer(() -> currentInputLength,
+ * l -> { currentInputLength = l; for (SliceStatusWidget w : arr) { w.updateText(); } }));
+ */
+ screenElements.widget(
+ new TextWidget(Text.localised("ggfab.gui.advassline.shutdown")).setEnabled(this::hasAbnormalStopReason));
+ screenElements.widget(
+ new TextWidget().setTextSupplier(() -> Text.localised(lastStopReason))
+ .attachSyncer(
+ new FakeSyncWidget.StringSyncer(() -> lastStopReason, r -> this.lastStopReason = r),
+ screenElements)
+ .setEnabled(this::hasAbnormalStopReason));
+ screenElements.widget(
+ new ClickableTextWidget(
+ Text.localised("ggfab.gui.advassline.shutdown_clear")
+ .alignment(Alignment.CenterLeft)).setMarginInLines(0)
+ .setOnClick((d, w) -> lastStopReason = "")
+ .setSize(36, 20)
+ .setEnabled(this::hasAbnormalStopReason));
+ }
+
+ private Boolean hasAbnormalStopReason(Widget w) {
+ return !StringUtils.isNullOrEmpty(lastStopReason);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.assemblylineVisualRecipes;
+ }
+
+ @Override
+ public boolean onRunningTick(ItemStack aStack) {
+ if (currentRecipe == null) {
+ criticalStopMachine("ggfab.gui.advassline.shutdown.recipe_null");
+ return false;
+ }
+ for (GT_MetaTileEntity_Hatch_DataAccess hatch_dataAccess : mDataAccessHatches) {
+ hatch_dataAccess.setActive(true);
+ }
+
+ if (mInputBusses.size() < currentInputLength) {
+ criticalStopMachine("ggfab.gui.advassline.shutdown.input_busses");
+ return false;
+ }
+ boolean oStuck = stuck;
+ stuck = false;
+
+ for (int i = slices.length - 1; i >= 0; i--) {
+ slices[i].tick();
+ }
+
+ if (oStuck != stuck)
+ // send the status as it has changed
+ getBaseMetaTileEntity().issueClientUpdate();
+
+ if (getBaseMetaTileEntity().isAllowedToWork() && slices[0].progress < 0) {
+ startRecipeProcessing();
+ if (hasAllItems(currentRecipe, this.currentRecipeParallel)
+ && hasAllFluids(currentRecipe, this.currentRecipeParallel)
+ && slices[0].start()) {
+ drainAllFluids(currentRecipe, this.currentRecipeParallel);
+ mProgresstime = 0;
+ }
+ }
+
+ boolean foundWorking = false;
+ int working = 0;
+ for (Slice slice : slices) {
+ if (slice.progress >= 0) {
+ if (!foundWorking) {
+ foundWorking = true;
+ mProgresstime = (slice.id + 1) * (mMaxProgresstime / currentInputLength) - slice.progress;
+ }
+ }
+ if (slice.progress > 0) working++;
+ }
+ lEUt = working * baseEUt;
+
+ if (lEUt > 0) {
+ // overflow again :(
+ lEUt = Long.MIN_VALUE;
+ for (int i = 0; i < working; i++) {
+ if (!drainEnergyInput(-baseEUt)) {
+ criticalStopMachine("ggfab.gui.advassline.shutdown.energy");
+ return false;
+ }
+ }
+ } else {
+ if (!super.onRunningTick(aStack)) return false;
+ }
+
+ endRecipeProcessing();
+ return true;
+ }
+
+ private ItemStack getInputBusContent(int index) {
+ if (index < 0 || index >= mInputBusses.size()) return null;
+ GT_MetaTileEntity_Hatch_InputBus inputBus = mInputBusses.get(index);
+ if (!inputBus.isValid()) return null;
+ if (inputBus instanceof GT_MetaTileEntity_Hatch_InputBus_ME meBus) {
+ ItemStack item = meBus.getShadowItemStack(0);
+ if (item == null) return null;
+ GT_Utility.ItemId id = GT_Utility.ItemId.createNoCopy(item);
+ if (!curBatchItemsFromME.containsKey(id)) return null;
+ return curBatchItemsFromME.get(id);
+ }
+ return inputBus.getStackInSlot(0);
+
+ }
+
+ private FluidStack getInputHatchContent(int index) {
+ if (index < 0 || index >= mInputHatches.size()) return null;
+ GT_MetaTileEntity_Hatch_Input inputHatch = mInputHatches.get(index);
+ if (!inputHatch.isValid()) return null;
+ if (inputHatch instanceof GT_MetaTileEntity_Hatch_Input_ME meHatch) {
+ FluidStack fluid = meHatch.getShadowFluidStack(0);
+ if (fluid == null) return null;
+ if (!curBatchFluidsFromME.containsKey(fluid.getFluid())) return null;
+ return curBatchFluidsFromME.get(fluid.getFluid());
+ }
+ if (inputHatch instanceof GT_MetaTileEntity_Hatch_MultiInput multiHatch) {
+ return multiHatch.getFluid(0);
+ }
+ return inputHatch.getFillableStack();
+ }
+
+ private GT_Recipe.GT_Recipe_AssemblyLine findRecipe(ItemStack tDataStick) {
+ GT_AssemblyLineUtils.LookupResult tLookupResult = GT_AssemblyLineUtils
+ .findAssemblyLineRecipeFromDataStick(tDataStick, false);
+
+ if (tLookupResult.getType() == GT_AssemblyLineUtils.LookupResultType.INVALID_STICK) return null;
+
+ GT_Recipe.GT_Recipe_AssemblyLine tRecipe = tLookupResult.getRecipe();
+ // Check if the recipe on the data stick is the current recipe for it's given output, if not we update it
+ // and continue to next.
+ if (tLookupResult.getType() != GT_AssemblyLineUtils.LookupResultType.VALID_STACK_AND_VALID_HASH) {
+ tRecipe = GT_AssemblyLineUtils.processDataStick(tDataStick);
+ if (tRecipe == null) {
+ return null;
+ }
+ }
+
+ // So here we check against the recipe found on the data stick.
+ // If we run into missing buses/hatches or bad inputs, we go to the next data stick.
+ // This check only happens if we have a valid up-to-date data stick.
+
+ // Check item Inputs align. For this we do not need to consider batch mode parallels yet, this will be done
+ // later on during recipe start.
+ if (!hasAllItems(tRecipe, 1)) return null;
+
+ // Check Fluid Inputs align. Again, do not consider parallels
+ if (!hasAllFluids(tRecipe, 1)) return null;
+
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Check overclock");
+ }
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Find available recipe");
+ }
+ return tRecipe;
+ }
+
+ private boolean hasAllItems(GT_Recipe.GT_Recipe_AssemblyLine tRecipe, int parallel) {
+ int aItemCount = tRecipe.mInputs.length;
+ if (mInputBusses.size() < aItemCount) return false;
+ int[] itemConsumptions = GT_Recipe.GT_Recipe_AssemblyLine.getItemConsumptionAmountArray(mInputBusses, tRecipe);
+ if (itemConsumptions == null || itemConsumptions.length == 0) {
+ return false;
+ }
+ int maxParallel = (int) GT_Recipe.GT_Recipe_AssemblyLine
+ .maxParallelCalculatedByInputItems(mInputBusses, parallel, itemConsumptions, curBatchItemsFromME);
+ return maxParallel >= parallel;
+ }
+
+ private boolean hasAllFluids(GT_Recipe.GT_Recipe_AssemblyLine tRecipe, int parallel) {
+ int aFluidCount = tRecipe.mFluidInputs.length;
+ if (mInputHatches.size() < aFluidCount) return false;
+ int maxParallel = (int) GT_Recipe.GT_Recipe_AssemblyLine
+ .maxParallelCalculatedByInputFluids(mInputHatches, parallel, tRecipe.mFluidInputs, curBatchFluidsFromME);
+ return maxParallel >= parallel;
+ }
+
+ /**
+ * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb
+ */
+ private boolean isCorrectDataItem(ItemStack aStack, int state) {
+ if ((state & 1) != 0 && ItemList.Circuit_Integrated.isStackEqual(aStack, true, true)) return true;
+ if ((state & 2) != 0 && ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) return true;
+ return (state & 4) != 0 && ItemList.Tool_DataOrb.isStackEqual(aStack, false, true);
+ }
+
+ /**
+ * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb
+ */
+ public ArrayList<ItemStack> getDataItems(int state) {
+ ArrayList<ItemStack> rList = new ArrayList<>();
+ if (GT_Utility.isStackValid(mInventory[1]) && isCorrectDataItem(mInventory[1], state)) {
+ rList.add(mInventory[1]);
+ }
+ for (GT_MetaTileEntity_Hatch_DataAccess tHatch : mDataAccessHatches) {
+ if (tHatch.isValid()) {
+ for (int i = 0; i < tHatch.getBaseMetaTileEntity()
+ .getSizeInventory(); i++) {
+ if (tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i) != null && isCorrectDataItem(
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i),
+ state))
+ rList.add(
+ tHatch.getBaseMetaTileEntity()
+ .getStackInSlot(i));
+ }
+ }
+ }
+ return rList;
+ }
+
+ // this is only called when all slices have finished their work
+ // and the first slice cannot find a input/fluid cannot be found
+ // so we are safe to assume the old recipe no longer works
+ @Override
+ @NotNull
+ public CheckRecipeResult checkProcessing() {
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Start Adv ALine recipe check");
+ }
+ clearCurrentRecipe();
+ CheckRecipeResult result = CheckRecipeResultRegistry.NO_DATA_STICKS;
+ ArrayList<ItemStack> tDataStickList = getDataItems(2);
+ if (tDataStickList.isEmpty()) {
+ return result;
+ }
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Stick accepted, " + tDataStickList.size() + " Data Sticks found");
+ }
+
+ GT_Recipe.GT_Recipe_AssemblyLine recipe = null;
+
+ for (ItemStack stack : tDataStickList) {
+ recipe = findRecipe(stack);
+ if (recipe == null) {
+ result = CheckRecipeResultRegistry.NO_RECIPE;
+ continue;
+ }
+ if (recipe.mEUt > inputVoltage) {
+ result = CheckRecipeResultRegistry.insufficientPower(recipe.mEUt);
+ continue;
+ }
+
+ setCurrentRecipe(stack, recipe);
+ // first overclock normally
+ // we use the new oc calculator instead
+ // calculateOverclockedNessMulti from super class has a mysterious 5% cable loss thing at the moment
+ // of writing
+ GT_OverclockCalculator ocCalc = new GT_OverclockCalculator().setRecipeEUt(currentRecipe.mEUt)
+ .setDuration(Math.max(recipe.mDuration / recipe.mInputs.length, 1))
+ .setEUt(inputVoltage)
+ .calculate();
+ // since we already checked mEUt <= inputVoltage, no need to check if recipe is too OP
+ lEUt = ocCalc.getConsumption();
+ mMaxProgresstime = ocCalc.getDuration();
+ // then laser overclock if needed
+ if (!mExoticEnergyHatches.isEmpty()) {
+ OverclockHelper.OverclockOutput laserOverclock = OverclockHelper.laserOverclock(
+ lEUt,
+ mMaxProgresstime,
+ inputEUt / recipe.mInputs.length,
+ ConfigurationHandler.INSTANCE.getLaserOCPenaltyFactor());
+ if (laserOverclock != null) {
+ lEUt = laserOverclock.getEUt();
+ mMaxProgresstime = laserOverclock.getDuration();
+ }
+ }
+ // Save this for batch mode parallel calculations
+ int timePerSlice = mMaxProgresstime;
+ // correct the recipe duration
+ mMaxProgresstime *= recipe.mInputs.length;
+
+ // Finally apply batch mode parallels if possible.
+ // For this we need to verify the first item slot and all fluids slots have enough resources
+ // to execute parallels.
+ // Note that we skip this entirely if the time for each slice is more than
+ // BATCH_MODE_DESIRED_TICKS_PER_SLICE ticks, since in this case the amount of batches will always be 1
+ if (super.isBatchModeEnabled() && timePerSlice < BATCH_MODE_DESIRED_TICKS_PER_SLICE) {
+ // Calculate parallel based on time per slice, and the amount of fluid in the first fluid slot.
+ // We use fluid, since this way players can limit parallel by controlling how much fluid
+ // ends up in each AAL. This way, batch mode will not slow down setups where multiple AAL
+ // are connected to the same set of input items. Note that this will still suffer from the same
+ // issue if using stocking hatch, but in this case increasing pattern size can help.
+
+ // Note that every assline recipe has a fluid ingredient.
+ FluidStack firstFluidSlot = getInputHatchContent(0);
+ if (firstFluidSlot == null) {
+ result = CheckRecipeResultRegistry.INTERNAL_ERROR;
+ break;
+ }
+ int recipesAvailable = Math.floorDiv(firstFluidSlot.amount, recipe.mFluidInputs[0].amount);
+ // Divide recipes available by the amount of slices in the recipe. This will prevent the AAL from
+ // batching instead of parallelizing, which would make it effectively slower.
+ recipesAvailable = Math.floorDiv(recipesAvailable, recipe.mInputs.length);
+ // Sanity check to avoid this being zero when there is only one recipe available.
+ recipesAvailable = Math.max(recipesAvailable, 1);
+ int desiredBatches = Math.floorDiv(BATCH_MODE_DESIRED_TICKS_PER_SLICE, timePerSlice);
+ // Limit the amount of parallel to both the amount of recipes available and the maximum number
+ // of batches we want to run. The latter is done to prevent batch mode from ever going above
+ // BATCH_MODE_DESIRED_TICKS_PER_SLICE ticks per slice (see also where it is defined above).
+ int parallel = Math.min(recipesAvailable, desiredBatches);
+ if (hasAllFluids(recipe, parallel) && hasAllItems(recipe, parallel)) {
+ this.currentRecipeParallel = parallel;
+ // Update recipe duration with final batch mode multiplier
+ mMaxProgresstime *= this.currentRecipeParallel;
+ }
+ }
+ result = CheckRecipeResultRegistry.SUCCESSFUL;
+ break;
+ }
+ if (!result.wasSuccessful()) {
+ clearCurrentRecipe();
+ return result;
+ }
+ if (recipe == null || !slices[0].start() || currentRecipeParallel <= 0) {
+ clearCurrentRecipe();
+ // something very very wrong...
+ return CheckRecipeResultRegistry.INTERNAL_ERROR;
+ }
+
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("All checked start consuming inputs");
+ }
+ drainAllFluids(recipe, this.currentRecipeParallel);
+
+ // Apply parallel
+ mOutputItems = new ItemStack[] { recipe.mOutput.copy() };
+ mOutputItems[0].stackSize *= this.currentRecipeParallel;
+
+ if (this.lEUt > 0) {
+ this.lEUt = -this.lEUt;
+ }
+ baseEUt = lEUt;
+ this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
+ this.mEfficiencyIncrease = 10000;
+
+ if (GT_Values.D1) {
+ GT_FML_LOGGER.info("Recipe successful");
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public Set<VoidingMode> getAllowedVoidingModes() {
+ return VoidingMode.ITEM_ONLY_MODES;
+ }
+
+ @Override
+ public boolean isCorrectMachinePart(ItemStack aStack) {
+ return true;
+ }
+
+ @Override
+ public int getMaxEfficiency(ItemStack aStack) {
+ return 10000;
+ }
+
+ @Override
+ public int getDamageToComponent(ItemStack aStack) {
+ return 0;
+ }
+
+ @Override
+ public boolean explodesOnComponentBreak(ItemStack aStack) {
+ return false;
+ }
+
+ @Override
+ public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
+ IWailaConfigHandler config) {
+ super.getWailaBody(itemStack, currentTip, accessor, config);
+ NBTTagCompound tag = accessor.getNBTData();
+ String machineProgressString = GT_Waila.getMachineProgressString(
+ tag.getBoolean("isActive"),
+ tag.getInteger("maxProgress"),
+ tag.getInteger("progress"));
+ currentTip.remove(machineProgressString);
+
+ int duration = tag.getInteger("mDuration");
+ if (tag.hasKey(TAG_KEY_PROGRESS_TIMES, Constants.NBT.TAG_LIST)) {
+ NBTTagList tl = tag.getTagList(TAG_KEY_PROGRESS_TIMES, Constants.NBT.TAG_INT);
+ @SuppressWarnings("unchecked")
+ List<NBTTagInt> list = tl.tagList;
+ for (int i = 0, listSize = list.size(); i < listSize; i++) {
+ NBTTagInt t = list.get(i);
+ int progress = t.func_150287_d();
+ if (progress == 0) {
+ currentTip.add(I18n.format("ggfab.waila.advassline.slice.stuck", i + 1));
+ } else if (progress < 0) {
+ currentTip.add(I18n.format("ggfab.waila.advassline.slice.idle", i + 1));
+ } else if (duration > 40) {
+ currentTip.add(
+ I18n.format("ggfab.waila.advassline.slice", i + 1, (duration - progress) / 20, duration / 20));
+ } else {
+ currentTip
+ .add(I18n.format("ggfab.waila.advassline.slice.small", i + 1, duration - progress, duration));
+ }
+ }
+ }
+ }
+
+ @Override
+ public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
+ int z) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ if (currentRecipe == null || !getBaseMetaTileEntity().isActive()) return;
+ NBTTagList l = new NBTTagList();
+ for (int i = 0; i < currentInputLength; i++) {
+ l.appendTag(new NBTTagInt(slices[i].progress));
+ }
+ tag.setTag(TAG_KEY_PROGRESS_TIMES, l);
+ tag.setInteger("mDuration", mMaxProgresstime / currentInputLength);
+ }
+
+ /**
+ * Caller is responsible to check and ensure the hatches are there and has all the fluid needed. You will usually
+ * want to ensure hasAllFluid was called right before calling this, otherwise very bad things can happen.
+ */
+ private void drainAllFluids(GT_Recipe.GT_Recipe_AssemblyLine recipe, int parallel) {
+ GT_Recipe.GT_Recipe_AssemblyLine
+ .consumeInputFluids(mInputHatches, parallel, recipe.mFluidInputs, curBatchFluidsFromME);
+ for (GT_MetaTileEntity_Hatch_Input tHatch : filterValidMTEs(mInputHatches)) tHatch.updateSlots();
+ }
+
+ @Override
+ public void stopMachine(@NotNull ShutDownReason reason) {
+ clearCurrentRecipe();
+ super.stopMachine(reason);
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+
+ @Override
+ public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer,
+ float aX, float aY, float aZ) {
+ if (aPlayer.isSneaking()) {
+ batchMode = !batchMode;
+ if (batchMode) {
+ GT_Utility.sendChatToPlayer(aPlayer, "Batch mode enabled");
+ } else {
+ GT_Utility.sendChatToPlayer(aPlayer, "Batch mode disabled");
+ }
+ }
+ return true;
+ }
+
+ private class SliceStatusWidget extends TextWidget implements ISyncedWidget {
+
+ private final Slice slice;
+ private int lastProgress = -2;
+ private Text text;
+
+ private SliceStatusWidget(Slice slice) {
+ this.slice = slice;
+ updateText();
+ setEnabled(w -> slice.progress == 0 && currentInputLength > slice.id);
+ }
+
+ @Override
+ public Text getText() {
+ return text;
+ }
+
+ @Override
+ public void readOnClient(int id, PacketBuffer buf) {
+ if (id == 0) {
+ slice.progress = buf.readVarIntFromBuffer();
+ updateText();
+ checkNeedsRebuild();
+ }
+ }
+
+ public void updateText() {
+ String type = "unknown";
+ if (slice.progress == 0) type = "stuck";
+ else if (slice.progress < 0) type = "idle";
+ text = Text.localised("ggfab.gui.advassline.slice." + type, slice.id);
+ }
+
+ @Override
+ public void readOnServer(int id, PacketBuffer buf) {}
+
+ @Override
+ public void detectAndSendChanges(boolean init) {
+ if (slice.progress != lastProgress) {
+ // suppress small normal progress update
+ if (slice.progress > 0 && lastProgress > 0 && lastProgress - slice.progress < 10) return;
+ lastProgress = slice.progress;
+ syncToClient(0, b -> b.writeVarIntToBuffer(slice.progress));
+ }
+ }
+
+ @Override
+ public void markForUpdate() {}
+
+ @Override
+ public void unMarkForUpdate() {}
+
+ @Override
+ public boolean isMarkedForUpdate() {
+ return false;
+ }
+ }
+
+ private class Slice {
+
+ private final int id;
+ private int progress = -1;
+
+ public Slice(int id) {
+ this.id = id;
+ }
+
+ public void reset() {
+ progress = -1;
+ }
+
+ public void tick() {
+ if (progress < 0) return;
+ if (progress == 0 || --progress == 0) {
+ // id==0 will be end of chain if 1 input, so we need a +1 here
+ if (id + 1 >= currentInputLength) {
+ // use previously calculated parallel output
+ ItemStack output = mOutputItems[0];
+ if (addOutput(output) || !voidingMode.protectItem) reset();
+ else stuck = true;
+ } else {
+ if (slices[id + 1].start()) reset();
+ else stuck = true;
+ }
+ }
+ }
+
+ public boolean start() {
+ if (progress >= 0) return false;
+ startRecipeProcessing();
+ ItemStack stack = getInputBusContent(id);
+ if (stack == null) return false;
+ int size = GT_Recipe.GT_Recipe_AssemblyLine
+ .getMatchedIngredientAmount(stack, currentRecipe.mInputs[id], currentRecipe.mOreDictAlt[id]);
+ if (size < 0 || stack.stackSize < size * currentRecipeParallel) return false;
+ progress = mMaxProgresstime / currentInputLength;
+ stack.stackSize -= size * currentRecipeParallel;
+ mInputBusses.get(id)
+ .updateSlots();
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "Slice{" + "id=" + id + ", progress=" + progress + '}';
+ }
+ }
+
+ private enum DataHatchElement implements IHatchElement<MTE_AdvAssLine> {
+
+ DataAccess;
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return Collections.singletonList(GT_MetaTileEntity_Hatch_DataAccess.class);
+ }
+
+ @Override
+ public IGT_HatchAdder<MTE_AdvAssLine> adder() {
+ return MTE_AdvAssLine::addDataAccessToMachineList;
+ }
+
+ @Override
+ public long count(MTE_AdvAssLine t) {
+ return t.mDataAccessHatches.size();
+ }
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/mte/MTE_LinkedInputBus.java b/src/main/java/net/glease/ggfab/mte/MTE_LinkedInputBus.java
new file mode 100644
index 0000000000..ea39716c1a
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/mte/MTE_LinkedInputBus.java
@@ -0,0 +1,642 @@
+package net.glease.ggfab.mte;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.UUID;
+
+import net.glease.ggfab.GGConstants;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.WorldSavedData;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.gtnewhorizons.modularui.api.drawable.Text;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
+
+import gregtech.api.enums.ItemList;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.tileentities.machines.IRecipeProcessingAwareHatch;
+
+public class MTE_LinkedInputBus extends GT_MetaTileEntity_Hatch_InputBus implements IRecipeProcessingAwareHatch {
+
+ public static final int SIZE_INVENTORY = 18;
+ private SharedInventory mRealInventory;
+ private final ItemStackHandlerProxy handler = new ItemStackHandlerProxy();
+ private String mChannel;
+ private boolean mPrivate;
+ private State mState;
+ private WorldSave save;
+
+ public MTE_LinkedInputBus(int id, String name, String nameRegional, int tier) {
+ super(
+ id,
+ name,
+ nameRegional,
+ tier,
+ 1,
+ new String[] { SIZE_INVENTORY + " slot input bus linked together wirelessly",
+ "Link does not cross world boundary", "Left/right click with data stick to copy/paste configuration",
+ GGConstants.GGMARK_TOOLTIP, });
+ }
+
+ public MTE_LinkedInputBus(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, 1, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new MTE_LinkedInputBus(mName, mTier, mDescriptionArray, mTextures);
+ }
+
+ @Override
+ public int getCircuitSlot() {
+ return 0;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new TextFieldWidget().setSynced(true, true)
+ .setGetter(() -> mChannel == null ? "" : mChannel)
+ .setSetter(this::setChannel)
+ .setTextColor(Color.WHITE.dark(1))
+ .setTextAlignment(Alignment.CenterLeft)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)
+ .setGTTooltip(() -> mTooltipCache.getData("ggfab.tooltip.linked_input_bus.change_freq_warn"))
+ .setSize(60, 18)
+ .setPos(48, 3))
+ .widget(
+ new CycleButtonWidget().setToggle(this::isPrivate, this::setPrivate)
+ .setTextureGetter(
+ i -> i == 1 ? GT_UITextures.OVERLAY_BUTTON_CHECKMARK : GT_UITextures.OVERLAY_BUTTON_CROSS)
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setSynced(true, true)
+ .setGTTooltip(() -> mTooltipCache.getData("ggfab.tooltip.linked_input_bus.private"))
+ .setSize(18, 18)
+ .setPos(150, 3))
+ .widget(
+ SlotGroup.ofItemHandler(handler, 9)
+ .startFromSlot(0)
+ .endAtSlot(SIZE_INVENTORY - 1)
+ .background(getGUITextureSet().getItemSlot())
+ .slotCreator(i -> new BaseSlot(handler, i, false) {
+
+ @Override
+ public ItemStack getStack() {
+ return isEnabled() ? super.getStack() : null;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return mChannel != null;
+ }
+ })
+ .build()
+ .setPos(7, 24))
+ .widget(
+ new TextWidget(new Text("Private")).setPos(110, 3)
+ .setSize(43, 20))
+ .widget(
+ new TextWidget(new Text("Channel")).setPos(5, 3)
+ .setSize(43, 20));
+ }
+
+ @Override
+ public int getCircuitSlotX() {
+ return 152;
+ }
+
+ @Override
+ public ItemStack getStackInSlot(int aIndex) {
+ if (aIndex == getCircuitSlot()) return super.getStackInSlot(aIndex);
+ if (mState != State.Blocked && mChannel != null && mRealInventory != null) {
+ if (aIndex > 0 && aIndex <= SIZE_INVENTORY) return mRealInventory.stacks[aIndex - 1];
+ }
+ return null;
+ }
+
+ @Override
+ public void setInventorySlotContents(int aIndex, ItemStack aStack) {
+ if (aIndex == getCircuitSlot()) {
+ mInventory[0] = GT_Utility.copyAmount(0, aStack);
+ markDirty();
+ } else if (mState != State.Blocked && mChannel != null && mRealInventory != null) {
+ if (aIndex > 0 && aIndex <= SIZE_INVENTORY) {
+ mRealInventory.stacks[aIndex - 1] = aStack;
+ getWorldSave().markDirty();
+ }
+ }
+ }
+
+ @Override
+ public ITexture[] getTexturesActive(ITexture aBaseTexture) {
+ return super.getTexturesActive(aBaseTexture);
+ }
+
+ @Override
+ public ITexture[] getTexturesInactive(ITexture aBaseTexture) {
+ return super.getTexturesInactive(aBaseTexture);
+ }
+
+ @Override
+ public boolean canInsertItem(int aIndex, ItemStack aStack, int ordinalSide) {
+ return isValidSlot(aIndex) && aStack != null
+ && mChannel != null
+ && mRealInventory != null
+ && aIndex > getCircuitSlot()
+ && aIndex < SIZE_INVENTORY + 1
+ && (mRealInventory.stacks[aIndex - 1] == null
+ || GT_Utility.areStacksEqual(aStack, mRealInventory.stacks[aIndex - 1]))
+ && allowPutStack(getBaseMetaTileEntity(), aIndex, ForgeDirection.getOrientation(ordinalSide), aStack);
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side,
+ ItemStack aStack) {
+ return side == getBaseMetaTileEntity().getFrontFacing() && aIndex != getCircuitSlot()
+ && (mRecipeMap == null || disableFilter || mRecipeMap.containsInput(aStack))
+ && (mRealInventory.disableLimited || limitedAllowPutStack(aIndex, aStack));
+ }
+
+ @Override
+ protected boolean limitedAllowPutStack(int aIndex, ItemStack aStack) {
+ for (int i = 0; i < SIZE_INVENTORY; i++)
+ if (GT_Utility.areStacksEqual(GT_OreDictUnificator.get_nocopy(aStack), mRealInventory.stacks[i]))
+ return i == aIndex - 1;
+ return mRealInventory.stacks[aIndex - 1] == null;
+ }
+
+ @Override
+ public boolean canExtractItem(int aIndex, ItemStack aStack, int aSide) {
+ return false;
+ }
+
+ @Override
+ public int getSizeInventory() {
+ if (mState != State.Blocked && mChannel != null && mRealInventory != null) return SIZE_INVENTORY + 1;
+ return 1;
+ }
+
+ @Override
+ public void startRecipeProcessing() {
+ if (mRealInventory == null) return;
+ if (mRealInventory.used) {
+ mState = State.Blocked;
+ } else {
+ mRealInventory.used = true;
+ mState = State.Activated;
+ }
+ }
+
+ @Override
+ public CheckRecipeResult endRecipeProcessing(GT_MetaTileEntity_MultiBlockBase controller) {
+ if (mState == State.Activated) {
+ assert mRealInventory != null;
+ mRealInventory.used = false;
+ }
+ mState = State.Default;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Override
+ public void updateSlots() {
+ if (mChannel == null || mRealInventory == null) return;
+ for (int i = 0; i < mRealInventory.stacks.length; i++) {
+ if (mRealInventory.stacks[i] != null
+ && (mRealInventory.stacks[i].getItem() == null || mRealInventory.stacks[i].stackSize <= 0))
+ mRealInventory.stacks[i] = null;
+ }
+ if (!mRealInventory.disableSort) fillStacksIntoFirstSlots();
+ markDirty();
+ getWorldSave().markDirty();
+ }
+
+ @Override
+ protected void fillStacksIntoFirstSlots() {
+ // sanity check
+ if (mRealInventory == null) return;
+ final int L = SIZE_INVENTORY;
+ HashMap<GT_Utility.ItemId, Integer> slots = new HashMap<>(L);
+ HashMap<GT_Utility.ItemId, ItemStack> stacks = new HashMap<>(L);
+ List<GT_Utility.ItemId> order = new ArrayList<>(L);
+ List<Integer> validSlots = new ArrayList<>(L);
+ for (int i = 0; i < L; i++) {
+ validSlots.add(i);
+ ItemStack s = mRealInventory.stacks[i];
+ if (s == null) continue;
+ GT_Utility.ItemId sID = GT_Utility.ItemId.createNoCopy(s);
+ slots.merge(sID, s.stackSize, Integer::sum);
+ if (!stacks.containsKey(sID)) stacks.put(sID, s);
+ order.add(sID);
+ mRealInventory.stacks[i] = null;
+ }
+ int slotindex = 0;
+ for (GT_Utility.ItemId sID : order) {
+ int toSet = slots.get(sID);
+ if (toSet == 0) continue;
+ int slot = validSlots.get(slotindex);
+ slotindex++;
+ mRealInventory.stacks[slot] = stacks.get(sID)
+ .copy();
+ toSet = Math.min(toSet, mRealInventory.stacks[slot].getMaxStackSize());
+ mRealInventory.stacks[slot].stackSize = toSet;
+ slots.merge(sID, toSet, (a, b) -> a - b);
+ }
+ }
+
+ private void dropItems(ItemStack[] aStacks) {
+ for (ItemStack stack : aStacks) {
+ if (!GT_Utility.isStackValid(stack)) continue;
+ EntityItem ei = new EntityItem(
+ getBaseMetaTileEntity().getWorld(),
+ getBaseMetaTileEntity().getOffsetX(getBaseMetaTileEntity().getFrontFacing(), 1) + 0.5,
+ getBaseMetaTileEntity().getOffsetY(getBaseMetaTileEntity().getFrontFacing(), 1) + 0.5,
+ getBaseMetaTileEntity().getOffsetZ(getBaseMetaTileEntity().getFrontFacing(), 1) + 0.5,
+ stack);
+ ei.motionX = ei.motionY = ei.motionZ = 0;
+ getBaseMetaTileEntity().getWorld()
+ .spawnEntityInWorld(ei);
+ }
+ }
+
+ @Override
+ public boolean shouldDropItemAt(int index) {
+ // NOTE by this time onBlockDestroyed has already been called, i.e. so ref has already been decremented.
+ // so we really should check for ref <= 0 instead of ref <= 1
+ return mRealInventory != null && mRealInventory.ref <= 0;
+ }
+
+ @Override
+ public void onBlockDestroyed() {
+ super.onBlockDestroyed();
+ if (mRealInventory != null) {
+ if (--mRealInventory.ref <= 0) getWorldSave().remove(mChannel);
+ }
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ if (mChannel != null) aNBT.setString("channel", mChannel);
+ aNBT.setBoolean("private", mPrivate);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ String channel = aNBT.getString("channel");
+ if ("".equals(channel)) channel = null;
+ this.mChannel = channel;
+ mPrivate = aNBT.getBoolean("private");
+ }
+
+ public String getChannel() {
+ return mChannel;
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ if (mChannel != null) {
+ mRealInventory = getWorldSave().get(getRealChannel());
+ handler.set(mRealInventory.stacks);
+ }
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (!getBaseMetaTileEntity().getCoverBehaviorAtSideNew(side)
+ .isGUIClickable(
+ side,
+ getBaseMetaTileEntity().getCoverIDAtSide(side),
+ getBaseMetaTileEntity().getComplexCoverDataAtSide(side),
+ getBaseMetaTileEntity()))
+ return;
+ if (aPlayer.isSneaking()) {
+ if (this.mRealInventory == null) {
+ aPlayer.addChatMessage(new ChatComponentTranslation("ggfab.info.linked_input_bus.no_channel"));
+ return;
+ }
+ if (mRealInventory.disableSort) {
+ mRealInventory.disableSort = false;
+ } else {
+ if (mRealInventory.disableLimited) {
+ mRealInventory.disableLimited = false;
+ } else {
+ mRealInventory.disableSort = true;
+ mRealInventory.disableLimited = true;
+ }
+ }
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.hatch.disableSort." + mRealInventory.disableSort) + " "
+ + StatCollector.translateToLocal("GT5U.hatch.disableLimited." + mRealInventory.disableLimited));
+ } else {
+ this.disableFilter = !this.disableFilter;
+ GT_Utility.sendChatToPlayer(
+ aPlayer,
+ StatCollector.translateToLocal("GT5U.hatch.disableFilter." + this.disableFilter));
+ }
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side,
+ float aX, float aY, float aZ) {
+ if (!(aPlayer instanceof EntityPlayerMP))
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ ItemStack stick = aPlayer.inventory.getCurrentItem();
+ if (!ItemList.Tool_DataStick.isStackEqual(stick, false, true))
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer, side, aX, aY, aZ);
+ if (!stick.hasTagCompound() || !"linkedinputbus".equals(stick.stackTagCompound.getString("ggfab.type"))) {
+ aPlayer.addChatMessage(new ChatComponentTranslation("ggfab.info.linked_input_bus.no_data"));
+ return true;
+ }
+ ItemStack circuit = GT_Utility.loadItem(stick.stackTagCompound, "circuit");
+ String channel = stick.stackTagCompound.getString("channel");
+ if (GT_Utility.isStackInvalid(circuit)) circuit = null;
+ if ("".equals(channel)) {
+ aPlayer.addChatMessage(new ChatComponentTranslation("ggfab.info.linked_input_bus.no_data"));
+ return true;
+ } else if (circuit != null && getConfigurationCircuits().stream()
+ .noneMatch(circuit::isItemEqual)) {
+ aPlayer.addChatMessage(new ChatComponentTranslation("ggfab.info.linked_input_bus.invalid_circuit"));
+ return true;
+ }
+ UUID owner = stick.stackTagCompound.hasKey("owner1")
+ ? new UUID(stick.stackTagCompound.getLong("owner1"), stick.stackTagCompound.getLong("owner2"))
+ : null;
+ if (owner != null && !owner.equals(getBaseMetaTileEntity().getOwnerUuid())) {
+ aPlayer.addChatMessage(new ChatComponentTranslation("ggfab.info.linked_input_bus.not_owned"));
+ return true;
+ }
+ setPrivate(owner != null);
+ setChannel(channel);
+ setInventorySlotContents(getCircuitSlot(), circuit);
+ aPlayer.addChatMessage(new ChatComponentTranslation("ggfab.info.linked_input_bus.data_pasted", channel));
+ return true;
+ }
+
+ @Override
+ public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (!(aPlayer instanceof EntityPlayerMP)) return;
+ ItemStack stick = aPlayer.inventory.getCurrentItem();
+ if (!ItemList.Tool_DataStick.isStackEqual(stick, false, true)) return;
+ if (getChannel() == null) {
+ aPlayer.addChatMessage(new ChatComponentTranslation("ggfab.info.linked_input_bus.no_channel"));
+ return;
+ }
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setString("ggfab.type", "linkedinputbus");
+ tag.setString("channel", getChannel());
+ tag.setTag("circuit", GT_Utility.saveItem(getStackInSlot(getCircuitSlot())));
+ if (isPrivate()) {
+ tag.setLong(
+ "owner1",
+ getBaseMetaTileEntity().getOwnerUuid()
+ .getMostSignificantBits());
+ tag.setLong(
+ "owner2",
+ getBaseMetaTileEntity().getOwnerUuid()
+ .getLeastSignificantBits());
+ }
+ aPlayer.addChatMessage(new ChatComponentTranslation("ggfab.info.linked_input_bus.data_copied", getChannel()));
+ stick.stackTagCompound = tag;
+ stick.setStackDisplayName("Linked Input Bus configuration");
+ // abuse the title mechanism here. I assure you it will be fine (tm).
+ GT_Utility.ItemNBT.setBookTitle(stick, "Channel: " + getChannel());
+ if (getBaseMetaTileEntity().getOwnerName() != null)
+ GT_Utility.ItemNBT.setBookAuthor(stick, getBaseMetaTileEntity().getOwnerName());
+ }
+
+ private String getRealChannel() {
+ if (mChannel == null) return null;
+ if (mPrivate) return getBaseMetaTileEntity().getOwnerUuid() + mChannel;
+ return new UUID(0, 0) + mChannel;
+ }
+
+ public boolean isPrivate() {
+ return mPrivate;
+ }
+
+ public void setPrivate(boolean aPrivate) {
+ if (aPrivate == mPrivate) return;
+ if (getBaseMetaTileEntity().isClientSide()) {
+ mPrivate = aPrivate;
+ return;
+ }
+ if (this.mChannel == null) {
+ mPrivate = aPrivate;
+ return;
+ }
+ getWorldSave().markDirty();
+ if (--this.mRealInventory.ref <= 0) {
+ // last referrer, drop inventory
+ dropItems(mRealInventory.stacks);
+ getWorldSave().remove(getRealChannel());
+ }
+ mPrivate = aPrivate;
+ mRealInventory = getWorldSave().get(getRealChannel());
+ this.handler.set(mRealInventory.stacks);
+ mRealInventory.ref++;
+ getWorldSave().markDirty();
+ }
+
+ public void setChannel(String aChannel) {
+ if ("".equals(aChannel)) aChannel = null;
+ if (getBaseMetaTileEntity().isClientSide()) {
+ mChannel = aChannel;
+ return;
+ }
+ if (Objects.equals(this.mChannel, aChannel)) return; // noop
+ if (this.mChannel != null) {
+ if (--this.mRealInventory.ref <= 0) {
+ // last referrer, drop inventory
+ dropItems(mRealInventory.stacks);
+ getWorldSave().remove(getRealChannel());
+ }
+ }
+ if (aChannel == null) {
+ this.mChannel = null;
+ this.mRealInventory = null;
+ this.handler.setFake();
+ } else {
+ this.mChannel = aChannel;
+ this.mRealInventory = getWorldSave().get(getRealChannel());
+ this.handler.set(mRealInventory.stacks);
+ mRealInventory.ref++;
+ }
+ getWorldSave().markDirty();
+ }
+
+ private WorldSave getWorldSave() {
+ if (save == null) {
+ WorldSave save = (WorldSave) getBaseMetaTileEntity().getWorld()
+ .loadItemData(WorldSave.class, "LinkedInputBusses");
+ if (save == null) {
+ save = new WorldSave("LinkedInputBusses");
+ getBaseMetaTileEntity().getWorld()
+ .setItemData(save.mapName, save);
+ }
+ this.save = save;
+ }
+ return save;
+ }
+
+ private enum State {
+ Activated,
+ Blocked,
+ Default,
+ }
+
+ private static class SharedInventory {
+
+ private final ItemStack[] stacks;
+ /**
+ * Inventory wrapper for ModularUI
+ */
+ private final ItemStackHandler inventoryHandler;
+ public boolean disableLimited = true;
+ public boolean disableSort;
+ private boolean used;
+ private int ref;
+
+ public SharedInventory() {
+ this.stacks = new ItemStack[SIZE_INVENTORY];
+ inventoryHandler = new ItemStackHandler(stacks);
+ }
+
+ public SharedInventory(NBTTagCompound tag) {
+ this.stacks = new ItemStack[SIZE_INVENTORY];
+ inventoryHandler = new ItemStackHandler(stacks);
+
+ for (int i = 0; i < SIZE_INVENTORY; i++) {
+ String key = "" + i;
+ if (!tag.hasKey(key, Constants.NBT.TAG_COMPOUND)) continue;
+ stacks[i] = ItemStack.loadItemStackFromNBT(tag.getCompoundTag(key));
+ }
+
+ ref = tag.getInteger("ref");
+ disableLimited = tag.getBoolean("dl");
+ disableSort = tag.getBoolean("ds");
+ }
+
+ public NBTTagCompound save() {
+ NBTTagCompound tag = new NBTTagCompound();
+ for (int i = 0; i < SIZE_INVENTORY; i++) {
+ ItemStack stack = stacks[i];
+ if (stack == null) continue;
+ tag.setTag("" + i, stack.writeToNBT(new NBTTagCompound()));
+ }
+ tag.setInteger("ref", ref);
+ tag.setBoolean("ds", disableSort);
+ tag.setBoolean("dl", disableLimited);
+ return tag;
+ }
+ }
+
+ public static class WorldSave extends WorldSavedData {
+
+ private final Map<String, SharedInventory> data = new HashMap<>();
+
+ public WorldSave(String p_i2141_1_) {
+ super(p_i2141_1_);
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound tag) {
+ data.clear();
+ @SuppressWarnings("unchecked")
+ Set<Map.Entry<String, NBTBase>> set = tag.tagMap.entrySet();
+ for (Map.Entry<String, NBTBase> e : set) {
+ data.put(e.getKey(), new SharedInventory((NBTTagCompound) e.getValue()));
+ }
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound tag) {
+ for (Map.Entry<String, SharedInventory> e : data.entrySet()) {
+ if (e.getValue().ref > 0) tag.setTag(
+ e.getKey(),
+ e.getValue()
+ .save());
+ }
+ }
+
+ public SharedInventory get(Object channel) {
+ return data.computeIfAbsent(channel.toString(), k -> new SharedInventory());
+ }
+
+ public void remove(Object channel) {
+ data.remove(channel.toString());
+ markDirty();
+ }
+ }
+
+ private static class ItemStackHandlerProxy extends ItemStackHandler {
+
+ private static final ItemStack[] EMPTY = new ItemStack[SIZE_INVENTORY];
+ private boolean fake;
+
+ public ItemStackHandlerProxy() {
+ super(EMPTY);
+ fake = true;
+ }
+
+ public void setFake() {
+ set(EMPTY);
+ fake = true;
+ }
+
+ public boolean isFake() {
+ return fake;
+ }
+
+ public void set(ItemStack[] stacks) {
+ this.stacks = Arrays.asList(stacks);
+ fake = false;
+ }
+
+ @Override
+ public NBTTagCompound serializeNBT() {
+ NBTTagCompound tag = super.serializeNBT();
+ tag.setBoolean("fake", fake);
+ return tag;
+ }
+
+ @Override
+ public void deserializeNBT(NBTTagCompound nbt) {
+ super.deserializeNBT(nbt);
+ fake = nbt.getBoolean("fake");
+ }
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/mui/ClickableTextWidget.java b/src/main/java/net/glease/ggfab/mui/ClickableTextWidget.java
new file mode 100644
index 0000000000..679f32da37
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/mui/ClickableTextWidget.java
@@ -0,0 +1,58 @@
+package net.glease.ggfab.mui;
+
+import java.util.Arrays;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.Text;
+import com.gtnewhorizons.modularui.api.drawable.TextRenderer;
+import com.gtnewhorizons.modularui.api.math.Size;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+
+public class ClickableTextWidget extends ButtonWidget {
+
+ private Text caption;
+ private int maxLines = 1;
+ private int marginInLines = 1;
+
+ public ClickableTextWidget(Text caption) {
+ super();
+ this.caption = caption;
+ super.setBackground(caption);
+ }
+
+ public ClickableTextWidget setText(Text caption) {
+ this.caption = caption;
+ return this;
+ }
+
+ public ClickableTextWidget setMaxLines(int maxLines) {
+ this.maxLines = maxLines;
+ return this;
+ }
+
+ public ClickableTextWidget setMarginInLines(int margin) {
+ this.marginInLines = margin;
+ return this;
+ }
+
+ @Override
+ public Widget setBackground(IDrawable... drawables) {
+ IDrawable[] all = Arrays.copyOf(drawables, drawables.length + 1);
+ all[drawables.length] = caption;
+ return super.setBackground(all);
+ }
+
+ @Override
+ protected @NotNull Size determineSize(int maxWidth, int maxHeight) {
+ if (caption == null) return super.determineSize(maxWidth, maxHeight);
+ return new Size(
+ Math.min(
+ maxWidth,
+ TextRenderer.getFontRenderer()
+ .getStringWidth(caption.getFormatted())),
+ (maxLines + marginInLines) * TextRenderer.getFontRenderer().FONT_HEIGHT);
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/util/GGUtils.java b/src/main/java/net/glease/ggfab/util/GGUtils.java
new file mode 100644
index 0000000000..20181f9ba8
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/util/GGUtils.java
@@ -0,0 +1,78 @@
+package net.glease.ggfab.util;
+
+import java.util.StringJoiner;
+
+import net.minecraft.util.ChunkCoordinates;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+
+public class GGUtils {
+
+ public static boolean isValidTile(IGregTechTileEntity tile) {
+ return tile != null && !tile.isDead()
+ && tile.getMetaTileEntity() != null
+ && tile.getMetaTileEntity()
+ .getBaseMetaTileEntity() == tile;
+ }
+
+ public static boolean isValidTile(IMetaTileEntity mte) {
+ return mte != null && mte.getBaseMetaTileEntity() != null
+ && mte.getBaseMetaTileEntity()
+ .getMetaTileEntity() == mte
+ && !mte.getBaseMetaTileEntity()
+ .isDead();
+ }
+
+ public static ChunkCoordinates translate(ChunkCoordinates origin, ForgeDirection direction) {
+ return new ChunkCoordinates(
+ origin.posX + direction.offsetX,
+ origin.posY + direction.offsetY,
+ origin.posZ + direction.offsetZ);
+ }
+
+ public static String formatTileInfo(String prefix, IMetaTileEntity mte, String delimiter, String suffix) {
+ if (!isValidTile(mte)) return prefix + "N/A" + suffix;
+ StringJoiner sj = new StringJoiner(delimiter, prefix, suffix);
+ IGregTechTileEntity til = mte.getBaseMetaTileEntity();
+ sj.add(String.valueOf(til.getXCoord()));
+ sj.add(String.valueOf(til.getYCoord()));
+ sj.add(String.valueOf(til.getZCoord()));
+ return sj.toString();
+ }
+
+ public static String formatTileInfo(String prefix, IGregTechTileEntity tile, String delimiter, String suffix) {
+ if (!isValidTile(tile)) return prefix + "N/A" + suffix;
+ StringJoiner sj = new StringJoiner(delimiter, prefix, suffix);
+ sj.add(String.valueOf(tile.getXCoord()));
+ sj.add(String.valueOf(tile.getYCoord()));
+ sj.add(String.valueOf(tile.getZCoord()));
+ return sj.toString();
+ }
+
+ /**
+ * convert lowerCamelCase to any of snake case or normal sentence
+ */
+ public static String processSentence(String src, Character separator, boolean capitalize, boolean firstCapitalize) {
+ if (src == null) throw new IllegalArgumentException();
+ if (src.isEmpty()) return "";
+ StringBuilder out = new StringBuilder(src.length());
+ if (firstCapitalize) out.append(Character.toUpperCase(src.charAt(0)));
+ else out.append(src.charAt(0));
+ for (int i = 1; i < src.length(); i++) {
+ char ch = src.charAt(i);
+ if (Character.isUpperCase(ch)) {
+ if (separator != null) out.append(separator.charValue());
+ if (capitalize) {
+ out.append(ch);
+ } else {
+ out.append(Character.toLowerCase(ch));
+ }
+ } else {
+ out.append(ch);
+ }
+ }
+ return out.toString();
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/util/OverclockHelper.java b/src/main/java/net/glease/ggfab/util/OverclockHelper.java
new file mode 100644
index 0000000000..c47103f253
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/util/OverclockHelper.java
@@ -0,0 +1,75 @@
+package net.glease.ggfab.util;
+
+import gregtech.api.util.GT_Utility;
+
+public class OverclockHelper {
+
+ public static OverclockOutput normalOverclock(long recipeEUt, int duration, long inputVoltage, boolean perfectOC) {
+ if (recipeEUt > inputVoltage) return null;
+ int recipeTier = Math.max(1, GT_Utility.getTier(recipeEUt)); // ULV no overclock
+ int machineTier = GT_Utility.getTier(inputVoltage);
+ int shift = perfectOC ? 2 : 1;
+ while (recipeTier < machineTier && duration > 1) {
+ duration >>= shift;
+ recipeEUt <<= 2;
+ recipeTier++;
+ }
+ return new OverclockOutput(recipeEUt, duration);
+ }
+
+ public static OverclockOutput laserOverclock(long recipeEUt, int duration, long inputEUt,
+ float penaltyIncreaseFactor) {
+ if (recipeEUt > inputEUt) return null;
+ float currentPenalty = 4 + penaltyIncreaseFactor;
+ // 2/(n+k) overclock until energy hatch is crying
+ // must ensure it doesn't go to negative after overclock
+ while (recipeEUt * currentPenalty > 0 && recipeEUt * currentPenalty < inputEUt && duration > 1) {
+ duration >>= 1;
+ recipeEUt *= currentPenalty;
+ currentPenalty += penaltyIncreaseFactor;
+ }
+ return new OverclockOutput(recipeEUt, duration);
+ }
+
+ public static final class OverclockOutput {
+
+ private final long mEUt;
+ private final int mDuration;
+
+ public OverclockOutput(long aEUt, int aDuration) {
+ this.mEUt = aEUt;
+ this.mDuration = aDuration;
+ }
+
+ public long getEUt() {
+ return mEUt;
+ }
+
+ public int getDuration() {
+ return mDuration;
+ }
+
+ @Override
+ public String toString() {
+ return mEUt + "@" + mDuration + "ticks";
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof OverclockOutput)) return false;
+
+ OverclockOutput that = (OverclockOutput) o;
+
+ if (mEUt != that.mEUt) return false;
+ return mDuration == that.mDuration;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = (int) (mEUt ^ (mEUt >>> 32));
+ result = 31 * result + mDuration;
+ return result;
+ }
+ }
+}
diff --git a/src/main/java/speiger/src/crops/api/ICropCardInfo.java b/src/main/java/speiger/src/crops/api/ICropCardInfo.java
new file mode 100644
index 0000000000..96d12f7b59
--- /dev/null
+++ b/src/main/java/speiger/src/crops/api/ICropCardInfo.java
@@ -0,0 +1,19 @@
+package speiger.src.crops.api;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+
+import ic2.api.crops.CropCard;
+
+/**
+ * Adds information from CropCards. This class has priority over ICropInfo.
+ *
+ * @requirement: the class that implements this interface needs to extend {@link CropCard}
+ */
+public interface ICropCardInfo {
+
+ List<String> getCropInformation();
+
+ ItemStack getDisplayItem();
+}
diff --git a/src/main/pack.mcmeta b/src/main/pack.mcmeta
new file mode 100644
index 0000000000..33f118cbd7
--- /dev/null
+++ b/src/main/pack.mcmeta
@@ -0,0 +1,6 @@
+{
+ "pack": {
+ "pack_format": 1,
+ "description": "GregTech Resource Pack"
+ }
+}
diff --git a/src/main/resources/META-INF/ggfab_at.cfg b/src/main/resources/META-INF/ggfab_at.cfg
new file mode 100644
index 0000000000..a6dc456eb5
--- /dev/null
+++ b/src/main/resources/META-INF/ggfab_at.cfg
@@ -0,0 +1,2 @@
+public net.minecraft.nbt.NBTTagList field_74747_a # tagList
+public net.minecraft.nbt.NBTTagCompound field_74784_a # tagMap \ No newline at end of file
diff --git a/src/main/resources/assets/ggfab/lang/en_US.lang b/src/main/resources/assets/ggfab/lang/en_US.lang
new file mode 100644
index 0000000000..14b4343dfe
--- /dev/null
+++ b/src/main/resources/assets/ggfab/lang/en_US.lang
@@ -0,0 +1,41 @@
+ggfab.recipe.toolcast=Tool Casting Machine
+
+ggfab.info.advassline.0=Advanced Assembly Line Help
+ggfab.info.advassline.1=This is advanced assembly line from §6GigaGram§rFab.
+ggfab.info.advassline.2=It supports item pipelining. That is, it will mimic a real assembly line by consuming ingredients one by one instead of all at start. In effect, it offers a parallelism up to however many item input this recipe requires.
+ggfab.info.advassline.3=You can think of an advanced assembly line as a collection of assembly slices. Each assembly slice is capably of processing each step independent of other slices.
+ggfab.info.advassline.4=It will start processing once the input bus contents align with any stored data stick. The first slice will consume the input in Bus #1. After (recipe time/number of inputs) time, the first slice's work is concluded and will start the second slice. At the same time, first slice will look for input in input bus #1. If there are still enough input there slice #1 will start working again.
+ggfab.info.advassline.5=The terminal slice (the n-th slice, where n is number of item input in recipe) will put the recipe output in output bus when it has concluded his work. Whenever a non-terminal slice finished its work, it will try to pass the work onto next slice. If the next slice cannot find the materials in its input bus, the just-finished slice will remain in §4STUCK§r state and hang the assembly line. To help locate these §4STUCK§r assembly lines, the controller's front face will have its status light turned orange.
+ggfab.info.advassline.6=The EU/t cost of this machine is number of slices active multiplied by the original recipe EU/t. §4STUCK§r slices do not consume power. It will use the worst energy supplying hatch's input voltage for recipe tier calculation and normal imperfect overclock.
+ggfab.info.advassline.7=With exotic energy hatches, it can overclock beyond usual voltage tier, but will consume even more power than usual imperfect overclock. Every §2laser overclock§r will add %s to power exponent.
+ggfab.info.advassline.8=1 §2laser overclock§r will have 50%% recipe time and use %s%% power. 2 §2laser overclock§r will have 25%% recipe time and use %s%% (%s * %s) power. Will not overclock beyond 1 tick. Machine first tries to parallelize, then normal imperfect overclock, then §2laser overclock§r.
+ggfab.waila.advassline.slice=Slice #%s: %s s / %s s
+ggfab.waila.advassline.slice.small=Slice #%s: %s ticks / %s ticks
+ggfab.waila.advassline.slice.idle=Slice #%s: Idle
+ggfab.waila.advassline.slice.stuck=Slice #%s: §4STUCK
+ggfab.gui.advassline.slice.idle=Slice #%s: Idle
+ggfab.gui.advassline.slice.stuck=Slice #%s: §4STUCK
+ggfab.gui.advassline.slice.unknown=Slice #%s: ?
+ggfab.gui.advassline.shutdown=§4Last abnormal shutdown reason:
+ggfab.gui.advassline.shutdown_clear=§6Clear
+ggfab.gui.advassline.shutdown.input_busses=§4Too few input busses to support current recipe
+ggfab.gui.advassline.shutdown.recipe_null=§4Recipe is null (report to author)
+ggfab.gui.advassline.shutdown.fluid_null=§4Fluid drained failed (check your ME fluid storage)
+ggfab.gui.advassline.shutdown.structure=§4Incompatible structural change
+ggfab.gui.advassline.shutdown.energy=§4Insufficient power
+ggfab.gui.advassline.shutdown.load.energy=§4Loaded invalid electric stat
+ggfab.gui.advassline.shutdown.load.recipe=§4Incompatible recipe change
+
+ggfab.info.linked_input_bus.not_owned=§6The settings were copied from a different owner!
+ggfab.info.linked_input_bus.no_data=§6Configuration data not found!
+ggfab.info.linked_input_bus.invalid_data=§6Configuration data was found but it is invalid!
+ggfab.info.linked_input_bus.invalid_circuit=§6Configuration data was found but it contains a circuit not valid on this bus!
+ggfab.info.linked_input_bus.data_pasted=§2Pasted channel ("%s§2") and configuration circuit setting!
+ggfab.info.linked_input_bus.data_copied=§2Copied channel ("%s§2") and configuration circuit setting!
+ggfab.info.linked_input_bus.no_channel=§6No channel specified yet!
+
+ggfab.info.biome=Biome:
+
+ggfab.tooltip.linked_input_bus.change_freq_warn=Changing channel while this is the last one on this channel will spill all items left!
+ggfab.tooltip.linked_input_bus.private=Private channel are not shared with others.
+ggfab.tooltip.linked_input_bus.private.1=Changing channel while this is the last one on this channel will spill all items left!
diff --git a/src/main/resources/assets/ggfab/lang/zh_CN.lang b/src/main/resources/assets/ggfab/lang/zh_CN.lang
new file mode 100644
index 0000000000..c5a2da901d
--- /dev/null
+++ b/src/main/resources/assets/ggfab/lang/zh_CN.lang
@@ -0,0 +1,28 @@
+ggfab.info.advassline.0=高级装配线教程
+ggfab.info.advassline.1=爱来自 §6GigaGram§rFab 与 w
+ggfab.info.advassline.2=这种新式装配线支持流水线式装配,也就是说,这种装配线会逐一从输入总线中获取原材料,而不是像其他GT机器一样在启动时获取所有原材料。这种工作模式使得他获得了等同与当前配方物品输入数量的并行数。
+ggfab.info.advassline.3=你可以将高级装配线想象成一组装配刀片机,每个装配刀片可以互相独立的工作。
+ggfab.info.advassline.4=高级装配线会在输入总线第一格的内容与任意一个闪存记录的配方相符合时开始工作。第一装配刀片会从第一个输入总线获取输入。在(配方时间/物品输入个数)的时间后,第一装配刀片的工作结束了,之后便会将半成品转交给第二装配刀片,然后第二装配刀片再从自己的输入总线中获取输入。于此同时,在第二装配刀片工作时,第一装配刀片会继续尝试从第一输入总线中获取输入,如果这里仍然有足够的输入,则第一装配刀片会直接开始工作。
+ggfab.info.advassline.5=如果一个配方有n个输入,那么第N个装配刀片就是最终装配刀片,在他完成工作时就会将成品放到末尾的输出总线中。除最终装配刀片外,其他装配刀片在自己的工作结束时都会试图将半成品交给下一个刀片。如果下一个刀片无法从自己的输入总线中找到输入,则上一片刀片会停留在§4停滞§r状态,并最终使整个装配线阻塞。为了帮助你发现阻塞的装配线,任何含有§4停滞§r状态的装配刀片的装配线将会亮起橙红色指示灯。
+ggfab.info.advassline.6=高级装配线的瞬时能耗是正在工作的装配刀片的数量乘以当前配方的EU/t。§4停滞§r状态的装配刀片不会消耗能量。额外需要注意的是,本机器会使用所有能量供应舱室中最低的电压等级来计算配方等级与普通的非完美超频。
+ggfab.info.advassline.7=在使用一些特殊的能量供应舱室时,高级装配线可以进行额外的超频(称为§2激光超频§r),但是会使用比非完美超频更多的能量。每个§2激光超频§r会使得能量指数增加%s。
+ggfab.info.advassline.8=一层激光超频会使配方时间变为50%%,但会使用%s%%能量。二层激光超频会使配方时间变为25%%,但会使用%s%% (%s * %s)能量。激光超频仍然不会越过1tick极限。高级装配线在计算超频时会优先考虑并行,然后考虑非完美超频,最后进行§2激光超频§r。
+ggfab.waila.advassline.slice=装配刀片 #%s: %s秒 / %s秒
+ggfab.waila.advassline.slice.small=装配刀片 #%s: %s刻 / %s刻
+ggfab.waila.advassline.slice.idle=装配刀片 #%s: 空闲
+ggfab.waila.advassline.slice.stuck=装配刀片 #%s: §4停滞
+ggfab.gui.advassline.slice.idle=装配刀片 #%s: 空闲
+ggfab.gui.advassline.slice.stuck=装配刀片 #%s: §4停滞
+ggfab.gui.advassline.slice.unknown=装配刀片 #%s: ?
+
+ggfab.info.linked_input_bus.not_owned=§6记录的设置来自于不同的拥有者!
+ggfab.info.linked_input_bus.invalid_data=§6找到了配置,但是它已不再有效!
+ggfab.info.linked_input_bus.data_pasted=§2已粘贴频道("%s§2")和编程芯片配置!
+ggfab.info.linked_input_bus.data_copied=§2已记录频道("%s§2")和编程芯片配置!
+ggfab.info.linked_input_bus.no_channel=§6还没有设置频道!
+
+ggfab.info.biome=群系:
+
+ggfab.tooltip.linked_input_bus.change_freq_warn=如果这是最后一个本频道的输入总线,改变频道会使剩余的内容物洒在地上!
+ggfab.tooltip.linked_input_bus.private=私有频道不会与其余玩家共享
+ggfab.tooltip.linked_input_bus.private.1=如果这是最后一个本频道的输入总线,改变频道会使剩余的内容物洒在地上! \ No newline at end of file
diff --git a/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE.png b/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE.png
new file mode 100644
index 0000000000..da0ce84a35
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_ACTIVE.png b/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_ACTIVE.png
new file mode 100644
index 0000000000..89277c79d6
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_ACTIVE_GLOW.png b/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..4a8ad42dd8
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_GLOW.png b/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_GLOW.png
new file mode 100644
index 0000000000..1227d5a7fd
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_STUCK.png b/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_STUCK.png
new file mode 100644
index 0000000000..1c6e16c428
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_STUCK.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_STUCK_GLOW.png b/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_STUCK_GLOW.png
new file mode 100644
index 0000000000..f5e67e7668
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/blocks/iconsets/OVERLAY_FRONT_ADV_ASSLINE_STUCK_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/0.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/0.png
new file mode 100644
index 0000000000..5a0b113068
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/0.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/1.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/1.png
new file mode 100644
index 0000000000..7be53426b1
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/1.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/2.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/2.png
new file mode 100644
index 0000000000..c80ecd6158
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/2.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/3.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/3.png
new file mode 100644
index 0000000000..7aaa51f26f
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/3.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/30.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/30.png
new file mode 100644
index 0000000000..d636a1ca28
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/30.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/31.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/31.png
new file mode 100644
index 0000000000..174f2cbad8
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/31.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/32.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/32.png
new file mode 100644
index 0000000000..310ea4ee20
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/32.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/33.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/33.png
new file mode 100644
index 0000000000..ff6b25d82d
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/33.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/34.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/34.png
new file mode 100644
index 0000000000..8bde5e4213
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/34.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/35.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/35.png
new file mode 100644
index 0000000000..20fc1a2870
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/35.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/36.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/36.png
new file mode 100644
index 0000000000..951edab117
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/36.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/4.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/4.png
new file mode 100644
index 0000000000..f3ecd55264
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/4.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/5.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/5.png
new file mode 100644
index 0000000000..c9e4664ed0
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/5.png
Binary files differ
diff --git a/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/6.png b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/6.png
new file mode 100644
index 0000000000..ca649b92ea
--- /dev/null
+++ b/src/main/resources/assets/ggfab/textures/items/gt.ggfab.d1/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/lang/en_US.lang b/src/main/resources/assets/gregtech/lang/en_US.lang
new file mode 100644
index 0000000000..a718108566
--- /dev/null
+++ b/src/main/resources/assets/gregtech/lang/en_US.lang
@@ -0,0 +1,1503 @@
+# Creative ItemGroup Tab
+itemGroup.GregTech.GTPP_BLOCKS=GT++ Blocks
+itemGroup.GregTech.GTPP_MACHINES=GT++ Machines
+itemGroup.GregTech.GTPP_MISC=GT++ Misc
+itemGroup.GregTech.GTPP_OTHER=GT++ Other
+itemGroup.GregTech.GTPP_OTHER_2=GT++ Other II
+itemGroup.GregTech.GTPP_TOOLS=GT++ Tools
+itemGroup.GregTech.Main=Main
+itemGroup.GregTech.Materials=Materials
+itemGroup.GregTech.Ores=Ores
+
+item.gt.advancedsensorcard.name=GregTech Advanced Sensor Card
+
+GT5U.autoplace.error.no_hatch=§cSuggested to place hatch §4%s§c but none was found
+GT5U.autoplace.error.no_mte.id=§cSuggested to place machine with meta ID §4%s§c but none was found
+GT5U.autoplace.error.no_mte.class_name=§cSuggested to place machine with class name §4%d§c but none was found
+
+# Multiblock Tooltip Builder Keywords
+# Context can be found in the class gregtech.api.util.GT_Multiblock_Tooltip_Builder
+GT5U.MBTT.MachineType=Machine Type
+GT5U.MBTT.Dimensions=Dimensions
+GT5U.MBTT.Hollow=(Hollow)
+GT5U.MBTT.Structure=Structure
+GT5U.MBTT.Controller=Controller
+GT5U.MBTT.Minimum=(minimum)
+GT5U.MBTT.Tiered=(tiered)
+GT5U.MBTT.MaintenanceHatch=Maintenance Hatch
+GT5U.MBTT.MufflerHatch=Muffler Hatch
+GT5U.MBTT.EnergyHatch=Energy Hatch
+GT5U.MBTT.DynamoHatch=Dynamo Hatch
+GT5U.MBTT.InputBus=Input Bus
+GT5U.MBTT.InputHatch=Input Hatch
+GT5U.MBTT.OutputBus=Output Bus
+GT5U.MBTT.OutputHatch=Output Hatch
+GT5U.MBTT.Causes=Causes
+GT5U.MBTT.PPS=pollution per second
+GT5U.MBTT.Hold=Hold
+GT5U.MBTT.Display=to display structure guidelines
+GT5U.MBTT.StructureHint=Some blocks have multiple candidates or can use any tier
+GT5U.MBTT.Mod=Added by
+GT5U.MBTT.Air=Mandatory Air
+
+GT5U.MBTT.subchannel=Uses sub channel §6%s§r§7 for §6%s
+
+GT5U.cracker.io_side=Input/Output Hatches must be on opposite sides!
+
+GT5U.turbine.running.true=Turbine running
+GT5U.turbine.running.false=Turbine stopped
+GT5U.turbine.maintenance.false=No Maintenance issues
+GT5U.turbine.maintenance.true=Needs Maintenance
+GT5U.turbine.efficiency=Current Speed
+GT5U.turbine.flow=Optimal Flow
+GT5U.turbine.fuel=Fuel Remaining
+GT5U.turbine.dmg=Turbine Damage
+GT5U.turbine.loose=Loose
+GT5U.turbine.tight=Tight
+
+GT5U.engine.output=Current Output
+GT5U.engine.consumption=Fuel Consumption
+GT5U.engine.value=Fuel Value
+GT5U.engine.efficiency=Current Efficiency
+
+GT5U.PA.machinetier=Machine tier installed
+GT5U.PA.discount=Discount
+GT5U.PA.parallel=Parallel processing
+
+GT5U.LHE.steam=(in steam)
+GT5U.LHE.superheated=Superheated
+GT5U.LHE.threshold=threshold
+
+GT5U.fusion.req=EU Required
+GT5U.fusion.plasma=Plasma Output
+
+GT5U.EBF.heat=Heat capacity
+GT5U.coil.None=None
+GT5U.coil.ULV=None
+GT5U.coil.LV=Cupronickel
+GT5U.coil.MV=Kanthal
+GT5U.coil.HV=Nichrome
+GT5U.coil.EV=TPV
+GT5U.coil.IV=HSS-G
+GT5U.coil.LuV=HSS-S
+GT5U.coil.ZPM=Naquadah
+GT5U.coil.UV=Naquadah Alloy
+GT5U.coil.UHV=Trinium
+GT5U.coil.UEV=Electrum Flux
+GT5U.coil.UIV=Awakened Draconium
+GT5U.coil.UMV=Infinity
+GT5U.coil.UXV=Hypogen
+GT5U.coil.MAX=Eternal
+
+GT5U.MS.multismelting=Multi smelting
+
+# Machine types
+gt.recipe.alloysmelter=Alloy Smelter
+gt.recipe.alloysmelter.description=HighTech combination Smelter
+gt.recipe.arcfurnace=Arc Furnace
+gt.recipe.arcfurnace.description=
+gt.recipe.assembler=Assembler
+gt.recipe.assembler.description=Avengers, Assemble!
+gt.recipe.autoclave=Autoclave
+gt.recipe.autoclave.description=Crystallizing your Dusts
+gt.recipe.brewer=Brewery
+gt.recipe.brewer.description=Brewing your Drinks
+gt.recipe.metalbender=Bending Machine
+gt.recipe.metalbender.description=Boo, he's bad! We want BENDER!!!
+gt.recipe.canner=Canner
+gt.recipe.canner.description=Unmobile Food Canning Machine GTA4
+gt.recipe.centrifuge=Centrifuge
+gt.recipe.centrifuge.description=Separating Molecules
+gt.recipe.chemicalbath=Chemical Bath
+gt.recipe.chemicalbath.description=Bathing Ores in Chemicals to separate them
+gt.recipe.chemicalreactor=Chemical Reactor
+gt.recipe.chemicalreactor.description=Letting Chemicals react with each other
+gt.recipe.circuitassembler=Circuit Assembler
+gt.recipe.circuitassembler.description=Pick-n-Place all over the place
+gt.recipe.compressor=Compressor
+gt.recipe.compressor.description=Compress-O-Matic C77
+gt.recipe.cuttingsaw=Cutting Machine
+gt.recipe.cuttingsaw.description=Slice'N Dice
+gt.recipe.distillery=Distillery
+gt.recipe.distillery.description=Extracting the most relevant Parts of Fluids
+gt.recipe.furnace=Furnace
+gt.recipe.furnace.description=Not like using a Commodore 64
+gt.recipe.electrolyzer=Electrolyzer
+gt.recipe.electrolyzer.description=Electrolyzing Molecules
+gt.recipe.electromagneticseparator=Electromagnetic Separator
+gt.recipe.electromagneticseparator.description=Separating the magnetic Ores from the rest
+gt.recipe.extractor=Extractor
+gt.recipe.extractor.description=Dejuicer-Device of Doom - D123
+gt.recipe.extruder=Extruder
+gt.recipe.extruder.description=Universal Machine for Metal Working
+gt.recipe.fermenter=Fermenter
+gt.recipe.fermenter.description=Fermenting Fluids
+gt.recipe.fluidcanner=Fluid Canner
+gt.recipe.fluidcanner.description=Puts Fluids into and out of Containers
+gt.recipe.fluidextractor=Fluid Extractor
+gt.recipe.fluidextractor.description=Extracting Fluids from Items
+gt.recipe.fluidsolidifier=Fluid Solidifier
+gt.recipe.fluidsolidifier.description=Cools Fluids down to form Solids
+gt.recipe.hammer=Forge Hammer
+gt.recipe.hammer.description=Stop, Hammertime!
+gt.recipe.press=Forming Press
+gt.recipe.press.description=Imprinting Images into things
+gt.recipe.fluidheater=Fluid Heater
+gt.recipe.fluidheater.description=Heating up your Fluids
+gt.recipe.laserengraver=Laser Engraver
+gt.recipe.laserengraver.description=Don't look directly at the Laser
+gt.recipe.lathe=Lathe
+gt.recipe.lathe.description=Produces Rods more efficiently
+gt.recipe.macerator=Macerator
+gt.recipe.macerator.description=Schreddering your Ores
+gt.recipe.macerator_pulverizer=Macerator/Pulverizer
+gt.recipe.macerator_pulverizer.description=Schreddering your Ores
+gt.recipe.uuamplifier=Matter Amplifier
+gt.recipe.uuamplifier.description=Extracting UU Amplifier
+gt.recipe.massfab=Mass Fabrication
+gt.recipe.massfab.description=UUM = Matter * Fabrication Squared
+gt.recipe.microwave=Furnace
+gt.recipe.microwave.description=Did you really read the instruction Manual?
+gt.recipe.mixer=Mixer
+gt.recipe.mixer.description=Will it Blend?
+gt.recipe.orewasher=Ore Washer
+gt.recipe.orewasher.description=Getting more Byproducts from your Ores
+gt.recipe.oven=Furnace
+gt.recipe.oven.description=Just a Furnace with a different Design
+gt.recipe.packager=Packager
+gt.recipe.packager.description="Puts things into Boxes"
+gt.recipe.plasmaarcfurnace=Plasma Arc Furnace
+gt.recipe.plasmaarcfurnace.description=
+gt.recipe.polarizer=Electromagnetic Polarizer
+gt.recipe.polarizer.description=Bipolarising your Magnets
+gt.recipe.printer=Printer
+gt.recipe.printer.description=It can copy Books and paint Stuff
+ic.recipe.recycler=Recycler
+ic.recipe.recycler.description=Compress, burn, obliterate and filter EVERYTHING
+gt.recipe.replicator=Replicator
+gt.recipe.replicator.description=Producing Elemental Matter
+gt.recipe.rockbreaker=Rock Breaker
+gt.recipe.rockbreaker.description=Put Lava and Water adjacent
+gt.recipe.scanner=Scanner
+gt.recipe.scanner.description=Scans Crops and other things.
+gt.recipe.sifter=Sifter
+gt.recipe.sifter.description=Stay calm and keep sifting
+gt.recipe.slicer=Slicer
+gt.recipe.slicer.description=Slice of Life
+gt.recipe.thermalcentrifuge=Thermal Centrifuge
+gt.recipe.thermalcentrifuge.description=Separating Ores more precisely
+gt.recipe.unpackager=Unpackager
+gt.recipe.unpackager.description=Grabs things out of Boxes
+gt.recipe.wiremill=Wiremill
+gt.recipe.wiremill.description=Produces Wires more efficiently
+
+# RecipeMaps that are not listed on MachineType enum
+gt.recipe.fakeAssemblylineProcess=Assemblyline Process
+gt.recipe.fusionreactor=Fusion Reactor
+gt.recipe.blastfurnace=Blast Furnace
+gt.recipe.plasmaforge=DTPF
+gt.recipe.transcendentplasmamixerrecipes=Transcendent Plasma Mixer
+gt.recipe.fakespaceprojects=Space Projects
+gt.recipe.primitiveblastfurnace=Primitive Blast Furnace
+gt.recipe.implosioncompressor=Implosion Compressor
+gt.recipe.vacuumfreezer=Vacuum Freezer
+gt.recipe.largechemicalreactor=Large Chemical Reactor
+gt.recipe.distillationtower=Distillation Tower
+gt.recipe.craker=Oil Cracker
+gt.recipe.pyro=Pyrolyse Oven
+gt.recipe.dieselgeneratorfuel=Combustion Generator Fuels
+gt.recipe.extremedieselgeneratorfuel=Extreme Diesel Engine Fuel
+gt.recipe.gasturbinefuel=Gas Turbine Fuel
+gt.recipe.thermalgeneratorfuel=Thermal Generator Fuels
+gt.recipe.semifluidboilerfuels=Semifluid Boiler Fuels
+gt.recipe.plasmageneratorfuels=Plasma Generator Fuels
+gt.recipe.magicfuels=Magic Energy Absorber Fuels
+gt.recipe.smallnaquadahreactor=Naquadah Reactor MkI
+gt.recipe.largenaquadahreactor=Naquadah Reactor MkII
+gt.recipe.fluidnaquadahreactor=Naquadah Reactor MkIII
+gt.recipe.hugenaquadahreactor=Naquadah Reactor MkIV
+gt.recipe.extrahugenaquadahreactor=Naquadah Reactor MkV
+gt.recipe.fluidfuelnaquadahreactor=Fluid Naquadah Reactor
+gt.recipe.largeboilerfakefuels=Large Boiler
+gt.recipe.nanoforge=Nano Forge
+gt.recipe.pcbfactory=PCB Factory
+gt.recipe.ic2nuke=Nuclear Fission
+
+# Recipe categories
+gt.recipe.category.arc_furnace_recycling=Arc Furnace Recycling
+gt.recipe.category.plasma_arc_furnace_recycling=Plasma Arc Furnace Recycling
+gt.recipe.category.macerator_recycling=Macerator Recycling
+gt.recipe.category.fluid_extractor_recycling=Fluid Extractor Recycling
+gt.recipe.category.alloy_smelter_recycling=Alloy Smelter Recycling
+gt.recipe.category.alloy_smelter_molding=Alloy Smelter Molding
+gt.recipe.category.forge_hammer_recycling=Forge Hammer Recycling
+gt.recipe.category.tic_part_extruding=TiC Part Extruding
+gt.recipe.category.tic_bolt_molding=TiC Bolt Molding
+
+GT5U.machines.tier=Tier
+GT5U.machines.workarea=Work Area
+GT5U.machines.workareaset=Work Area set to
+GT5U.machines.workarea_fail=Can't adjust work area while running
+GT5U.machines.autoretract.enabled=Auto retract enabled
+GT5U.machines.autoretract.disabled=Auto retract disabled
+GT5U.machines.radius=radius
+GT5U.machines.blocks=Blocks
+GT5U.machines.chunks=Chunks
+GT5U.machines.miner=Miner
+GT5U.machines.powersource.power=power
+GT5U.machines.powersource.steam=steam
+GT5U.machines.pump=Pump
+GT5U.machines.separatebus=Input buses are separated
+GT5U.machines.pumpareaset=Pumping area set to
+GT5U.machines.oilfluidpump=Oil/Fluid Pump
+GT5U.machines.minermulti=Multiblock Miner
+GT5U.machines.digitalchest.voidoverflow.enabled=Overflow Voiding Mode §aOn§r
+GT5U.machines.digitalchest.voidoverflow.disabled=Overflow Voiding Mode §cOff§r
+GT5U.machines.digitalchest.inputfilter.enabled=Input Filter §aOn§r
+GT5U.machines.digitalchest.inputfilter.disabled=Input Filter §cOff§r
+GT5U.machines.digitaltank.tooltip=Stores %sL of fluid
+GT5U.machines.digitaltank.tooltip1=Will keep its contents when harvested
+GT5U.machines.digitaltank.autooutput.tooltip=Fluid Auto-Output
+GT5U.machines.digitaltank.fluid.amount=Fluid Amount
+GT5U.machines.digitaltank.lockfluid.label=Locked Fluid
+GT5U.machines.digitaltank.lockfluid.empty=None
+GT5U.machines.digitaltank.lockfluid.tooltip=Lock Fluid Mode
+GT5U.machines.digitaltank.lockfluid.tooltip.1=§7This tank will be locked to only accept one type of fluid
+GT5U.machines.digitaltank.lockfluid.tooltip.2=§7It will be locked to the first fluid type that enters the tank
+GT5U.machines.digitaltank.voidoverflow.tooltip=Overflow Voiding Mode
+GT5U.machines.digitaltank.voidoverflow.tooltip.1=§7Voids all fluid excess if the tank is full
+GT5U.machines.digitaltank.voidfull.tooltip=Void Full Mode
+GT5U.machines.digitaltank.voidfull.tooltip.1=§7Voids all fluids that enter the tank
+GT5U.machines.digitaltank.inputfromoutput.tooltip=Input Fluid from Output Side
+GT5U.machines.select_circuit=Select Machine Mode
+GT5U.machines.select_circuit.tooltip=Ghost Circuit Slot
+GT5U.machines.select_circuit.tooltip.1=§7LMB/RMB/scroll to cycle through the list
+GT5U.machines.select_circuit.tooltip.2=§7Shift left click to open GUI
+GT5U.machines.select_circuit.tooltip.3=§7Shift right click to clear
+GT5U.machines.extra_tooltips_toggle.tooltip=Additional information
+GT5U.machines.fluid_transfer.tooltip=Fluid Auto-Output
+GT5U.machines.fluid_transfer.tooltip.extended=§6Screwdriver:§7 Right click machine to
+GT5U.machines.fluid_transfer.tooltip.extended.1=§7toggle output-side item input; with
+GT5U.machines.fluid_transfer.tooltip.extended.2=§7shift to toggle the input filter.
+GT5U.machines.fluid_transfer.tooltip.extended.3=§6Soldering iron:§7 Right click to toggle
+GT5U.machines.fluid_transfer.tooltip.extended.4=§7redstone strength; also hold
+GT5U.machines.fluid_transfer.tooltip.extended.5=§7shift to toggle multi-stack input.
+GT5U.machines.item_transfer.tooltip=Item Auto-Output
+GT5U.machines.item_transfer.tooltip.extended=§6Screwdriver:§7 Right click machine to
+GT5U.machines.item_transfer.tooltip.extended.1=§7toggle output-side item input; with
+GT5U.machines.item_transfer.tooltip.extended.2=§7shift to toggle the input filter.
+GT5U.machines.item_transfer.tooltip.extended.3=§6Soldering iron:§7 Right click to toggle
+GT5U.machines.item_transfer.tooltip.extended.4=§7redstone strength; also hold
+GT5U.machines.item_transfer.tooltip.extended.5=§7shift to toggle multi-stack input.
+GT5U.machines.battery_slot.tooltip=Power Slot
+GT5U.machines.battery_slot.tooltip.1=§7Draws from %1$s§7 batteries
+GT5U.machines.battery_slot.tooltip.2=§7Charges %1$s§7 tools & batteries
+GT5U.machines.battery_slot.tooltip.extended=§4Caution:§7 Will violently explode if
+GT5U.machines.battery_slot.tooltip.extended.1=§7fed %2$s§7+ power through cables.
+GT5U.machines.battery_slot.tooltip.alternative=Power Slot
+GT5U.machines.battery_slot.tooltip.alternative.1=%1$s§7 voltage? You don't need tooltips.
+GT5U.machines.special_slot.tooltip=Data Slot
+GT5U.machines.special_slot.tooltip.1=§7See recipes for usage
+GT5U.machines.unused_slot.tooltip=Storage Slot
+GT5U.machines.unused_slot.tooltip.1=§7Unused in this machine
+GT5U.machines.stalled_stuttering.tooltip=§4Stalled: Insufficient %1$s§4!
+GT5U.machines.stalled_stuttering.tooltip.1=§7Provide %1$s§7 consistently
+GT5U.machines.stalled_stuttering.tooltip.2=§7for the entire duration of
+GT5U.machines.stalled_stuttering.tooltip.3=§7the recipe to complete it.
+GT5U.machines.stalled_stuttering.tooltip.extended=§7Progress was lost, but not
+GT5U.machines.stalled_stuttering.tooltip.extended.1=§7the recipe's output.
+GT5U.machines.stalled_vent.tooltip=§4Stalled: Cannot vent steam!
+GT5U.machines.stalled_vent.tooltip.1=§7Right-click with a wrench to
+GT5U.machines.stalled_vent.tooltip.2=§7point this machine's steam
+GT5U.machines.stalled_vent.tooltip.3=§7vent towards an empty space.
+GT5U.machines.oreprocessor1=§eRunning Mode:
+GT5U.machines.oreprocessor2=§cTime: %s s
+GT5U.machines.oreprocessor.void=§eVoid Stone Dust: %s
+GT5U.machines.oreprocessor.Macerate=Macerate
+GT5U.machines.oreprocessor.Centrifuge=Centrifuge
+GT5U.machines.oreprocessor.Sifter=Sifter
+GT5U.machines.oreprocessor.Chemical_Bathing=Chemical Bathing
+GT5U.machines.oreprocessor.Ore_Washer=Ore Washer
+GT5U.machines.oreprocessor.Thermal_Centrifuge=Thermal Centrifuge
+GT5U.machines.oreprocessor.WRONG_MODE=Something went wrong
+GT5U.machines.industrialapiary.cancel.tooltip=§cCancel process
+GT5U.machines.industrialapiary.cancel.tooltip.1=§7Will also disable machine (soft mallet)
+GT5U.machines.industrialapiary.cancel.tooltip.2=§7§oCan't stop princess breeding
+GT5U.machines.industrialapiary.speedlocked.tooltip=§rAcceleration: %1$dx §7§o(locked to maximum)
+GT5U.machines.industrialapiary.speedlocked.tooltip.1=§7Energy usage: +%2$s EU/t
+GT5U.machines.industrialapiary.speedlocked.tooltip.2=§7§oRight-click to unlock
+GT5U.machines.industrialapiary.speed.tooltip=Acceleration: %1$dx
+GT5U.machines.industrialapiary.speed.tooltip.1=§7Energy usage: +%2$s EU/t
+GT5U.machines.industrialapiary.speed.tooltip.2=§7§oRight-click to lock at maximum
+GT5U.machines.industrialapiary.info.tooltip=Energy required: %1$s EU/t
+GT5U.machines.industrialapiary.info.tooltip.1=Temperature: %2$s
+GT5U.machines.industrialapiary.info.tooltip.2=Humidity: %3$s
+GT5U.machines.industrialapiary.info.tooltip.3=§7§oInsert analyzed bee to see more info
+GT5U.machines.industrialapiary.infoextended.tooltip=Energy required: %1$s EU/t
+GT5U.machines.industrialapiary.infoextended.tooltip.1=Temperature: %2$s
+GT5U.machines.industrialapiary.infoextended.tooltip.2=Humidity: %3$s
+GT5U.machines.industrialapiary.infoextended.tooltip.3=Bee genome speed: %4$.1f
+GT5U.machines.industrialapiary.infoextended.tooltip.4=Production Modifier: %5$.2f
+GT5U.machines.industrialapiary.infoextended.tooltip.5=Flowering Chance: %6$d %%
+GT5U.machines.industrialapiary.infoextended.tooltip.6=Lifespan Modifier: %7$d %%
+GT5U.machines.industrialapiary.infoextended.tooltip.7=Territory: %8$d x %9$d x %10$d
+GT5U.machines.industrialapiary.upgradeslot.tooltip=Upgrade slot
+GT5U.machines.industrialapiary.autoqueen.tooltip=Automatically put the queen after breeding in the input slot
+GT5U.machines.industrialapiary.autoqueen.tooltip.1=§7Doesn't require automation upgrade
+GT5U.machines.industrialapiary.autoqueen.tooltip.2=§7§oThis option is ignored if automation upgrade is installed
+GT5U.machines.advdebugstructurewriter.tooltip=Scans Blocks Around
+GT5U.machines.advdebugstructurewriter.tooltip.1=Prints Multiblock NonTE structure check code
+GT5U.machines.advdebugstructurewriter.tooltip.2=ABC axes aligned to machine front
+GT5U.machines.advdebugstructurewriter.printed=Printed structure to console
+GT5U.machines.advdebugstructurewriter.gui.origin=Origin
+GT5U.machines.advdebugstructurewriter.gui.size=Structure Size
+GT5U.machines.advdebugstructurewriter.gui.print.tooltip=Print Structure
+GT5U.machines.advdebugstructurewriter.gui.highlight.tooltip=Show Bounding Box
+GT5U.machines.advdebugstructurewriter.gui.transpose.tooltip=Transpose
+GT5U.machines.nei_transfer.steam.tooltip=%s steam recipes
+GT5U.machines.nei_transfer.voltage.tooltip=Recipes available in %s
+GT5U.machines.emit_energy.tooltip=Emit energy to output side
+GT5U.machines.emit_energy.tooltip.1=§7Voltage: %1$s
+GT5U.machines.emit_energy.tooltip.2=§7Amperage: §e%2$d
+GT5U.machines.emit_redstone_if_full.tooltip=Emit redstone if no slot is free
+GT5U.machines.emit_redstone_if_full.tooltip.1=§7Free slots: §9%1$s
+GT5U.machines.emit_redstone_if_full.tooltip.2=§7Emitting: §c%2$d
+GT5U.machines.emit_redstone_gradually.tooltip=Emit redstone for each slot in use
+GT5U.machines.emit_redstone_gradually.tooltip.1=§7Free slots: §9%1$d
+GT5U.machines.emit_redstone_gradually.tooltip.2=§7Emitting: §c%2$d
+GT5U.machines.invert_redstone.tooltip=Invert redstone
+GT5U.machines.buffer_stocking_mode.tooltip=Enable stocking mode
+GT5U.machines.buffer_stocking_mode.tooltip.extended=§7Keeps this many items in destination rather than transfer items in batches of this amount.
+GT5U.machines.buffer_stocking_mode.tooltip.extended.1=§7This mode can be server unfriendly.
+GT5U.machines.sorting_mode.tooltip=Sort stacks
+GT5U.machines.one_stack_limit.tooltip=Limit insertion
+GT5U.machines.one_stack_limit.tooltip.extended=§7Up to 1 stack of each item can be inserted
+GT5U.machines.invert_filter.tooltip=Invert Filter
+GT5U.machines.allow_nbt.tooltip=Allow items with NBT
+GT5U.machines.allow_nbt.tooltip.extended=§7By default, all items with NBT are blocked.
+GT5U.machines.ignore_nbt.tooltip=Ignore item NBT
+GT5U.machines.ignore_nbt.tooltip.extended=§7By default, item NBT must match.
+GT5U.machines.stocking_bus.cannot_set_slot=§8Cannot set slot while auto-pull mode is enabled
+GT5U.machines.stocking_bus.auto_pull.tooltip.1=Click to toggle automatic item pulling from ME.
+GT5U.machines.stocking_bus.auto_pull.tooltip.2=Right-Click to edit additional parameters.
+GT5U.machines.stocking_bus.min_stack_size=Min Stack Size
+GT5U.machines.stocking_bus.refresh_time=Slot Refresh Time (Ticks)
+GT5U.machines.stocking_bus.auto_pull_toggle.enabled=Automatic Item Pull Enabled
+GT5U.machines.stocking_bus.auto_pull_toggle.disabled=Automatic Item Pull Disabled
+GT5U.machines.stocking_hatch.auto_pull.tooltip.1=Click to toggle automatic fluid pulling from ME.
+GT5U.machines.stocking_hatch.auto_pull.tooltip.2=Right-Click to edit additional parameters.
+GT5U.machines.stocking_hatch.min_amount=Min Amount
+GT5U.machines.stocking_hatch.auto_pull_toggle.enabled=Automatic Fluid Pull Enabled
+GT5U.machines.stocking_hatch.auto_pull_toggle.disabled=Automatic Fluid Pull Disabled
+GT5U.machines.stocking_bus.saved=Saved Config to Data Stick
+GT5U.machines.stocking_bus.loaded=Loaded Config From Data Stick
+GT5U.machines.dronecentre.shutdown=You cannot control machine when drone centre shut down!
+GT5U.machines.dronecentre.turnon=Successfully turn on all machines!
+GT5U.machines.dronecentre.turnoff=Successfully turn off all machines!
+GT5U.machines.dronecentre.noconnection=No valid connection
+GT5U.machines.dronecentre.enableRender=Enable Drone Render
+GT5U.machines.dronecentre.disableRender=Disable Drone Render
+
+GT5U.recipe_filter.empty_representation_slot.tooltip=§7Click with a machine to set filter
+GT5U.recipe_filter.representation_slot.tooltip=§7Click to clear
+GT5U.type_filter.representation_slot.tooltip=§7Left click to cycle forward
+GT5U.type_filter.representation_slot.tooltip.1=§7Right click to cycle back
+GT5U.type_filter.representation_slot.tooltip.2=§7Click with an item to set filter
+
+GT5U.gui.select.current=Current:
+GT5U.gui.button.power_switch=Power Switch
+GT5U.gui.button.voiding_mode=Voiding Mode:
+GT5U.gui.button.voiding_mode_none=§7Void Nothing
+GT5U.gui.button.voiding_mode_item=§7Void Excess §6Items
+GT5U.gui.button.voiding_mode_fluid=§7Void Excess §9Fluids
+GT5U.gui.button.voiding_mode_all=§7Void Excess §6Items §7and §9Fluids
+GT5U.gui.button.input_separation=Input Separation
+GT5U.gui.button.batch_mode=Batch Mode
+GT5U.gui.button.lock_recipe=Lock Recipe
+GT5U.gui.button.down_tier=Down Tier
+GT5U.gui.button.tier=Tier:
+GT5U.gui.button.forbidden=§4Cannot change mode for this machine
+GT5U.gui.button.forbidden_while_running=§4Cannot change mode while running
+GT5U.gui.button.chunk_loading_on=§7Chunk Loading: §aON
+GT5U.gui.button.chunk_loading_off=§7Chunk Loading: §4OFF
+GT5U.gui.button.ore_drill_radius_1=§7Current Radius: §a%s
+GT5U.gui.button.ore_drill_radius_2=§7Left-click to increment, right-click to decrement
+GT5U.gui.button.ore_drill_cobblestone_on=§7Replace with cobblestone: §aON
+GT5U.gui.button.ore_drill_cobblestone_off=§7Replace with cobblestone: §4OFF
+GT5U.gui.button.drill_retract_pipes=§7Abort and retract mining pipes
+GT5U.gui.button.drill_retract_pipes_active=§4Cannot interrupt abort procedure
+GT5U.gui.button.drone_setname=Set custom name for machine
+GT5U.gui.button.drone_highlight=Highlight machine in the world
+GT5U.gui.button.drone_outofrange=§4Machine is too far, drone control system not available!
+GT5U.gui.button.drone_open_list=Open Machine List
+GT5U.gui.button.drone_poweron_all=Turn ON ALL machines, no matter how remote
+GT5U.gui.button.drone_poweroff_all=Turn OFF ALL machines, no matter how remote
+GT5U.gui.button.drone_name=Sort by §3name
+GT5U.gui.button.drone_distance=Sort by §3distance
+GT5U.gui.button.drone_error=Sort by §3shutdown status
+GT5U.gui.button.drone_showLocalName=Show localized name
+GT5U.gui.text.success=§aProcessing recipe
+GT5U.gui.text.generating=§aGenerating power
+GT5U.gui.text.no_recipe=§7No valid recipe found
+GT5U.gui.text.item_output_full=§7Not enough item output space
+GT5U.gui.text.fluid_output_full=§7Not enough fluid output space
+GT5U.gui.text.none=
+GT5U.gui.text.crash=§4Machine turned off due to crash. Refer to the log for more info.
+GT5U.gui.text.no_fuel=§7No valid fuel found
+GT5U.gui.text.no_turbine=§7No valid turbine found
+GT5U.gui.text.no_lubricant=§7No lubricant found
+GT5U.gui.text.fuel_quality_too_high=§7Fuel quality too high to run without boost
+GT5U.gui.text.no_data_sticks=§7No Data Sticks found
+GT5U.gui.text.bio_upgrade_missing=§7Recipe needs Bio Upgrade to start
+GT5U.gui.text.cleanroom_running=§aCleanroom running
+GT5U.gui.text.no_machine=§7No valid processing machine
+GT5U.gui.text.machine_mismatch=§7Machine doesn't match to locked recipe
+GT5U.gui.text.high_gravity=§7Recipe needs low gravity
+GT5U.gui.text.no_mining_pipe=§7Missing Mining Pipe
+GT5U.gui.text.drilling=§aDrilling
+GT5U.gui.text.deploying_pipe=§aDeploying mining pipe
+GT5U.gui.text.extracting_pipe=§aExtracting pipe
+GT5U.gui.text.retracting_pipe=§aRetracting pipe
+GT5U.gui.text.no_drilling_fluid=§7No drilling fluid
+GT5U.gui.text.drill_exhausted=§dDrill has exhausted all resources
+GT5U.gui.text.drill_generic_finished=§7Mining pipes have been retracted
+GT5U.gui.text.drill_retract_pipes_finished=§7Operation aborted
+GT5U.gui.text.backfiller_no_concrete=§7No liquid concrete
+GT5U.gui.text.backfiller_finished=§aWork complete
+GT5U.gui.text.backfiller_working=§aPouring concrete
+GT5U.gui.text.backfiller_current_area=§7Filling at y-level: §a%s
+GT5U.gui.text.pump_fluid_type=Fluid: §a%s
+GT5U.gui.text.pump_rate.1=Pumping rate: %s§r
+GT5U.gui.text.pump_rate.2= L/t
+GT5U.gui.text.pump_recovery.1=Recovering §b%s§r
+GT5U.gui.text.pump_recovery.2= L per operation
+GT5U.gui.text.not_enough_energy=§7Not enough energy
+GT5U.gui.text.power_overflow=§7Power overflowed
+GT5U.gui.text.duration_overflow=§7Processing time overflowed
+GT5U.gui.text.insufficient_power=§7Recipe needs more power to start. Required: %s EU/t (%s§7)
+GT5U.gui.text.insufficient_heat=§7Recipe needs more heat to start. Required: %s K (%s§7)
+GT5U.gui.text.insufficient_machine_tier=§7Recipe needs higher structure tier. Required: %s
+GT5U.gui.text.insufficient_startup_power=§7Recipe needs higher startup power. Required: %s
+GT5U.gui.text.internal_error=§4Recipe was found, but had internal error
+GT5U.gui.text.drill_ores_left_chunk=Ores left in current chunk: §a%s
+GT5U.gui.text.drill_ores_left_layer=Ores left at y-level %s: §a%s
+GT5U.gui.text.drill_chunks_left=Drilling chunk: §a%s / %s
+GT5U.gui.text.drill_offline_reason=Drill Offline: %s
+GT5U.gui.text.drill_offline_generic=Drill Offline
+GT5U.gui.text.stocking_bus_fail_extraction=§4Failed to extract expected amount of items from stocking bus. This can be caused by attaching multiple storage buses to the same inventory.
+GT5U.gui.text.stocking_hatch_fail_extraction=§4Failed to extract expected amount of fluids from stocking hatch. This can be caused by attaching multiple storage fluid buses to the same tank.
+GT5U.gui.text.drone_noDrone=§4Can't find any drone in inputBuses!
+GT5U.gui.text.drone_operating=§aDrone operating normally!
+GT5U.gui.text.drone_title=Drone Control Centre
+GT5U.gui.text.drone_custom_name=Custom Machine Name
+GT5U.gui.text.drone_search=Search machine name
+GT5U.gui.text.out_of_fluid=§cNo following fluids supplied: §b%s§f x §6%s L
+GT5U.gui.text.out_of_item=§cNo following items supplied: §b%s§f x §6%s
+GT5U.gui.text.out_of_stuff=§cNo following stuffs supplied: §b%s§f x §6%s
+GT5U.gui.text.power_loss=§cShut down due to power loss.
+GT5U.gui.text.pollution_fail=§cFailed to output the pollution.
+GT5U.gui.text.structure_incomplete=§7Shut down due to incomplete structure.
+GT5U.gui.text.no_repair=§7Shut down due to machine damage.
+GT5U.gui.text.no_machine_part=§7No correct machine part in controller slot.
+
+GT5U.item.programmed_circuit.select.header=Reprogram Circuit
+
+# Note to translators: this translation entry is supposed to be a number indicating how many taunts you define here
+# Game will randomly display one of them
+GT5U.item.programmed_circuit.no_screwdriver.count=3
+GT5U.item.programmed_circuit.no_screwdriver.0=Trying to mangle a CIRCUIT with your bare hand again huh?
+GT5U.item.programmed_circuit.no_screwdriver.1=Your thumb is not a screwdriver. Try a real one.
+GT5U.item.programmed_circuit.no_screwdriver.2=Chuck Norris stares at the circuit until it reprograms itself. You do not.
+
+GT5U.item.cable.max_voltage=Max Voltage
+GT5U.item.cable.max_amperage=Max Amperage
+GT5U.item.cable.loss=Loss/Meter/Ampere
+GT5U.item.cable.eu_volt=EU-Volt
+GT5U.item.tank.locked_to=Content locked to %s
+
+GT5U.hatch.disableFilter.true=Input Filter §cOff§r
+GT5U.hatch.disableFilter.false=Input Filter §aOn§r
+GT5U.hatch.disableMultiStack.true=Multi Stack Input §cOff§r
+GT5U.hatch.disableMultiStack.false=Multi Stack Input §aOn§r
+GT5U.hatch.disableSort.true=Sorting mode §cOff§r
+GT5U.hatch.disableSort.false=Sorting mode §aOn§r
+GT5U.hatch.disableLimited.true=Limiting mode §cOff§r
+GT5U.hatch.disableLimited.false=Limiting mode §aOn§r
+GT5U.hatch.infiniteCache.true=ME Output bus will infinitely cache item, until you connect it to ME
+GT5U.hatch.infiniteCache.false=ME Output bus will stop accepting items when offline for more than 2 seconds
+GT5U.hatch.infiniteCacheFluid.true=ME Output hatch will infinitely cache fluid, until you connect it to ME
+GT5U.hatch.infiniteCacheFluid.false=ME Output hatch will stop accepting fluid when offline for more than 2 seconds
+GT5U.hatch.additionalConnection.true=ME channels connect to any side
+GT5U.hatch.additionalConnection.false=ME channels connect to front side only
+
+GT5U.multiblock.pollution=Pollution reduced to
+GT5U.multiblock.energy=Stored Energy
+GT5U.multiblock.Progress=Progress
+GT5U.multiblock.efficiency=Efficiency
+GT5U.multiblock.problems=Problems
+GT5U.multiblock.mei=Max Energy Income
+GT5U.multiblock.usage=Probably uses
+GT5U.multiblock.parallelism=Max parallelism
+GT5U.multiblock.curparallelism=Current parallelism
+
+# NEI recipe handlers
+GT5U.nei.heat_capacity=Heat Capacity: %s K (%s)
+GT5U.nei.tier=Tier: %s
+GT5U.nei.start_eu=Start: %s EU (MK %s)
+GT5U.nei.stages=Stages: %s
+GT5U.nei.fuel=Fuel Value: %s EU
+
+GT5U.config.colormodulation=Color Modulator
+GT5U.config.colormodulation.cable_insulation=Cable Insulation
+GT5U.config.colormodulation.cable_insulation.B=Blue
+GT5U.config.colormodulation.cable_insulation.G=Green
+GT5U.config.colormodulation.cable_insulation.R=Red
+GT5U.config.colormodulation.construction_foam=Construction Foam
+GT5U.config.colormodulation.construction_foam.B=Blue
+GT5U.config.colormodulation.construction_foam.G=Green
+GT5U.config.colormodulation.construction_foam.R=Red
+GT5U.config.colormodulation.machine_metal=Machine Metal (Default GUI color)
+GT5U.config.colormodulation.machine_metal.B=Blue
+GT5U.config.colormodulation.machine_metal.G=Green
+GT5U.config.colormodulation.machine_metal.R=Red
+GT5U.config.interface=Interface
+GT5U.config.interface.DisplayCoverTabs=Display Cover Tabs
+GT5U.config.interface.DisplayCoverTabs.tooltip=Displays Cover Tabs on all Gregtech machines
+GT5U.config.interface.FlipCoverTabs=Flip Cover Tabs
+GT5U.config.interface.FlipCoverTabs.tooltip=Displays Cover Tabs on the right side instead of left
+GT5U.config.interface.TooltipVerbosity=Tooltip verbosity (See details)
+GT5U.config.interface.TooltipVerbosity.tooltip=How verbose should GregTech interface tooltips be?\n0: No tooltips\n1: One line tooltips only\n2: Normal tooltips [DEFAULT]\n3+: Extended tooltips
+GT5U.config.interface.TooltipShiftVerbosity=Tooltip verbosity (LSHIFT Down)
+GT5U.config.interface.TooltipShiftVerbosity.tooltip=How verbose should GregTech interface tooltips be when LSHIFT is held down?\n0: No tooltips\n1: One line tooltips only\n2: Normal tooltips\n3+: Extended tooltips [DEFAULT]
+GT5U.config.interface.CircuitsOrder=Circuits Order (See details)
+GT5U.config.interface.CircuitsOrder.tooltip=What is the order of the circuits when they are selected?\nFill in the Unique Identifier of the circuits.\nFor example: gregtech:gt.integrated_circuit
+GT5U.config.interface.TitleTabStyle=Title Tab Style (See details)
+GT5U.config.interface.TitleTabStyle.tooltip=Which style to use for title tab on machine GUI?\n0: text tab split-dark [DEFAULT]\n1: text tab unified\n2: item icon tab
+GT5U.config.preference=Client Preference
+GT5U.config.preference.mInputBusInitialFilter=Input Bus Initial Input Filter Status
+GT5U.config.preference.mInputBusInitialFilter.tooltip=Whether Input busses enable the input filter upon placed\nDoes not affect busses placed by others\nDoes not affect existing busses
+GT5U.config.preference.mSingleBlockInitialAllowMultiStack=Single Block Initial MultiStack Input Status
+GT5U.config.preference.mSingleBlockInitialAllowMultiStack.tooltip=Whether single block machines enable multistack input upon placed\nDoes not affect busses placed by others\nDoes not affect existing busses
+GT5U.config.preference.mSingleBlockInitialFilter=Single Block Initial Input Filter Status
+GT5U.config.preference.mSingleBlockInitialFilter.tooltip=Whether single block machines enable the input filter upon placed\nDoes not affect busses placed by others\nDoes not affect existing busses
+GT5U.config.render=Rendering
+GT5U.config.render.GlowTextures=Use Glowing Textures
+GT5U.config.render.RenderDirtParticles=Render Dirt Particles
+GT5U.config.render.RenderFlippedMachinesFlipped=Render flipped machines with flipped textures
+GT5U.config.render.RenderIndicatorsOnHatch=Render indicator on hatch
+GT5U.config.render.RenderItemChargeBar=Render item charge bar
+GT5U.config.render.RenderItemDurabilityBar=Render item durability bar
+GT5U.config.render.RenderPollutionFog=Render pollution fog
+GT5U.config.render.TileAmbientOcclusion=Enable Ambient Occlusion
+GT5U.config.nei=NEI
+GT5U.config.nei.RecipeSecondMode=Show recipes using seconds (as opposed to ticks)
+GT5U.config.nei.RecipeOwner=Show which mod added the recipe
+GT5U.config.nei.RecipeOwnerStackTrace=[debug] Show stack traces of recipe addition
+GT5U.config.nei.RecipeOwnerStackTrace.tooltip=[requires reboot]
+GT5U.config.nei.OriginalVoltage=Show original voltage when overclocked
+GT5U.config.nei.recipe_categories=Recipe Categories
+GT5U.config.waila=Waila
+GT5U.config.waila.WailaTransformerVoltageTier=Show voltage tier of transformer
+GT5U.config.waila.WailaAverageNS=Show average ns of multiblocks on waila
+
+# Cover tabs
+GT5U.interface.coverTabs.down=Bottom
+GT5U.interface.coverTabs.up=Top
+GT5U.interface.coverTabs.north=North
+GT5U.interface.coverTabs.south=South
+GT5U.interface.coverTabs.west=West
+GT5U.interface.coverTabs.east=East
+
+GT5U.steam_variant.bronze=Bronze
+GT5U.steam_variant.steel=Steel
+
+# NEI options
+nei.options.tools.dump.gt5u=GT5u
+nei.options.tools.dump.gt5u.metatileentity=MetaTileEntity
+nei.options.tools.dump.gt5u.metatileentitys=MetaTileEntities
+nei.options.tools.dump.gt5u.material=Material
+nei.options.tools.dump.gt5u.materials=Materials
+nei.options.tools.dump.gt5u.void_protection=Void protection missing support
+nei.options.tools.dump.gt5u.void_protections=Void protection missing supports
+nei.options.tools.dump.gt5u.input_separation=Input separation missing support
+nei.options.tools.dump.gt5u.input_separations=Input separation missing supports
+nei.options.tools.dump.gt5u.batch_mode=Batch mode missing support
+nei.options.tools.dump.gt5u.batch_modes=Batch mode missing supports
+nei.options.tools.dump.gt5u.recipe_locking=Recipe locking missing support
+nei.options.tools.dump.gt5u.recipe_lockings=Recipe locking missing supports
+nei.options.tools.dump.gt5u.warn_env=You're outside of the pack. Some IDs present in the full pack might be missing in this dump.
+nei.options.tools.dump.gt5u.mode.0=Free
+nei.options.tools.dump.gt5u.mode.1=Used
+
+# Waila
+GT5U.waila.cover=Cover (%s): %s
+GT5U.waila.cover.current_facing=Current Facing
+GT5U.waila.energy.stored=Stored: §a%s§r EU / §e%s§r EU
+GT5U.waila.energy.avg_in_with_amperage=Average Input: §a%s§r EU/t (%sA %s)
+GT5U.waila.energy.avg_out_with_amperage=Average Output: §c%s§r EU/t (%sA %s)
+GT5U.waila.energy.use=Probably uses: §e%s§r EU/t (%s)
+GT5U.waila.energy.use_with_amperage=Probably uses: §e%s§r EU/t (%sA %s)
+GT5U.waila.energy.produce=Probably generates: §a%s§r EU/t (%s)
+GT5U.waila.energy.produce_with_amperage=Probably generates: §a%s§r EU/t (%sA %s)
+GT5U.waila.stocking_bus.auto_pull.enabled=Auto-Pull from ME: Enabled
+GT5U.waila.stocking_bus.auto_pull.disabled=Auto-Pull from ME: Disabled
+GT5U.waila.stocking_bus.min_stack_size=Minimum Stack Size: %s
+GT5U.waila.stocking_hatch.min_amount=Minimum Amount: %s
+GT5U.waila.drone_downlink.noConnection=Not connected
+GT5U.waila.drone_downlink.connection=Connect to centre:
+GT5U.waila.drone_downlink.connectionCount=Connection Count:
+GT5U.waila.drone_downlink.droneLevel=Drone Level:
+
+achievement.flintpick=First Tools
+achievement.flintpick.desc=Craft a flint pick
+achievement.crops=Farming
+achievement.crops.desc=Craft Crops
+achievement.havestlead=Harvest Lead
+achievement.havestlead.desc=Get Plumbilia Leaves
+achievement.havestcopper=Harvest Copper
+achievement.havestcopper.desc=Get Coppon Fiber
+achievement.havesttin=Harvest Tin
+achievement.havesttin.desc=Get Tine Twig
+achievement.havestoil=Harvest Oil
+achievement.havestoil.desc=Get Oilberries
+achievement.havestiron=Harvest Iron
+achievement.havestiron.desc=Get Ferru Leaves
+achievement.havestgold=Harvest Gold
+achievement.havestgold.desc=Get Aurelia Leaves
+achievement.havestsilver=Harvest Silver
+achievement.havestsilver.desc=Get Argentia Leaves
+achievement.havestemeralds=Harvest Emeralds
+achievement.havestemeralds.desc=Get Bobs yer uncle Berries
+achievement.tools=More Tools
+achievement.tools.desc=Craft a Hammer
+achievement.driltime=Drilltime!
+achievement.driltime.desc=Craft a Drill(LV)
+achievement.brrrr=Brrrr...
+achievement.brrrr.desc=Craft a Chainsaw(LV)
+achievement.highpowerdrill=High Power Drill
+achievement.highpowerdrill.desc=Craft a Drill(HV)
+achievement.hammertime=Hammertime
+achievement.hammertime.desc=Craft a Jackhammer
+achievement.repair=Repairs
+achievement.repair.desc=Craft a Disassembler
+achievement.unitool=Universal Tool
+achievement.unitool.desc=Craft a Universal Spade
+achievement.recycling=Recycling
+achievement.recycling.desc=Craft an Arc Furnace
+achievement.crushed=Crushed
+achievement.crushed.desc=Crush Ores with a Hammer
+achievement.cleandust=Clean
+achievement.cleandust.desc=Clean some dust in a cauldron
+achievement.washing=Washing
+achievement.washing.desc=Get purified crushed ores
+achievement.spinit=Spin it
+achievement.spinit.desc=Get centrifuged ore
+achievement.newfuel=New Fuel
+achievement.newfuel.desc=Craft a Thorium Fuel Cell
+achievement.newmetal=New Metal
+achievement.newmetal.desc=Make Lutetium from Thorium Fuel Cells
+achievement.reflect=Reflect
+achievement.reflect.desc=Craft an Iridium Neutron Reflector
+achievement.bronze=Bronze
+achievement.bronze.desc=Craft bronze dust
+achievement.simplyeco=Simply Eco
+achievement.simplyeco.desc=Craft a Solar Boiler
+achievement.firststeam=First Steam
+achievement.firststeam.desc=Craft a Bronze Boiler
+achievement.alloysmelter=Alloy Smelter
+achievement.alloysmelter.desc=Craft a Steam Alloy Smelter
+achievement.macerator=Macerator
+achievement.macerator.desc=Craft a Steam Macerator
+achievement.extract=Extract
+achievement.extract.desc=Craft a Steam Extractor
+achievement.smallparts=Tubes
+achievement.smallparts.desc=Craft a Vacuum Tube
+achievement.gtbasiccircuit=Basic Circuit
+achievement.gtbasiccircuit.desc=Craft an Electronic Circuit
+achievement.bettercircuits=Better Circuits
+achievement.bettercircuits.desc=Get Good Circuits
+achievement.stepforward=Step forward
+achievement.stepforward.desc=Obtain Advanced Circuits
+achievement.gtmonosilicon=Monocrystaline Silicon Boule
+achievement.gtmonosilicon.desc=Produce a Monocrystaline Silicon Boule
+achievement.gtlogicwafer=Logic Circuit Wafer
+achievement.gtlogicwafer.desc=Produce a Logic Circuit Wafer
+achievement.gtlogiccircuit=Integrated Logic Circuit
+achievement.gtlogiccircuit.desc=Produce a Integrated Logic Circuit
+achievement.gtcleanroom=Cleanroom
+achievement.gtcleanroom.desc=Craft a Cleanroom Controller
+achievement.gtquantumprocessor=Quantum Processor
+achievement.gtquantumprocessor.desc=Get Quantum Processors
+achievement.energyflow=Nanoprocessor
+achievement.energyflow.desc=Get Nanoprocessors
+achievement.gtcrystalprocessor=Crystalprocessor
+achievement.gtcrystalprocessor.desc=Get Crystalprocessors
+achievement.gtwetware=Wetware Processor
+achievement.gtwetware.desc=Get Wetware Processors
+achievement.gtwetmain=Wetware Mainframe
+achievement.gtwetmain.desc=Get a Wetware Mainframe
+achievement.orbs=Orbs
+achievement.orbs.desc=Get a Lapotronic Energy Orb
+achievement.thatspower=That is Power
+achievement.thatspower.desc=Get a Lapotronic Energy Orb Cluster
+achievement.datasaving=Datasaving
+achievement.datasaving.desc=Get a Data Orb
+achievement.superbuffer=Super Buffer
+achievement.superbuffer.desc=Craft an LV Super Buffer
+achievement.newstorage=New Storage
+achievement.newstorage.desc=Craft a Quantum Chest
+achievement.whereistheocean=Where is the Ocean?
+achievement.whereistheocean.desc=Build a Quantum Tank
+achievement.luck=Real Luck
+achievement.luck.desc=Find a Zero Point Module in a Jungle Temple
+achievement.steel=Steel
+achievement.steel.desc=Produce Steel in a Bricked Blast Furnace
+achievement.highpressure=High Pressure
+achievement.highpressure.desc=Craft a High Pressure Boiler
+achievement.extremepressure=Extreme Pressure
+achievement.extremepressure.desc=Start up a Large Boiler
+achievement.cheapermac=Cheaper than a Macerator
+achievement.cheapermac.desc=Craft a LV Forge Hammer
+achievement.complexalloys=Complex Alloys
+achievement.complexalloys.desc=Produce a Blue Steel Ingot
+achievement.magneticiron=Magnetic Iron
+achievement.magneticiron.desc=Craft a Magnetic Iron Rod with 4 Redstone
+achievement.lvmotor=LV Motor
+achievement.lvmotor.desc=Craft an LV Motor
+achievement.pumpcover=Pump
+achievement.pumpcover.desc=Craft an LV Pump
+achievement.closeit=Close it!
+achievement.closeit.desc=Get a Shutter Cover
+achievement.slurp=Slurp
+achievement.slurp.desc=Craft an Advanced Pump II
+achievement.transport=Transport
+achievement.transport.desc=Craft a LV Conveyor
+achievement.manipulation=Manipulation
+achievement.manipulation.desc=Get a Machine Controller
+achievement.buffer=Buffer
+achievement.buffer.desc=Craft a LV Chest Buffer
+achievement.complexmachines=Complex Machines
+achievement.complexmachines.desc=Craft a LV Robot Arm
+achievement.avengers=Avengers Assemble
+achievement.avengers.desc=Craft a LV Assembling Machine
+achievement.filterregulate=Filter and Regulate
+achievement.filterregulate.desc=Get an Item Filter
+achievement.steampower=Steam Power!
+achievement.steampower.desc=Craft a Basic Steam Turbine
+achievement.batterys=Batteries
+achievement.batterys.desc=Craft a Battery Buffer
+achievement.badweather=Bad Weather
+achievement.badweather.desc=Forgot to build a Roof above your Machines?
+achievement.electricproblems=Electric Problems
+achievement.electricproblems.desc=Lose a Machine due to Overvoltage
+achievement.ebf=Electric Blast Furnace
+achievement.ebf.desc=Craft an Electric Blast Furnace
+achievement.energyhatch=You need 2 of them (3 if the EBF has maintenance issues)
+achievement.energyhatch.desc=Craft a LV Energy Hatch
+achievement.gtaluminium=Aluminium
+achievement.gtaluminium.desc=Produce an Aluminium Ingot
+achievement.highpowersmelt=High Power Smelter
+achievement.highpowersmelt.desc=Craft a Multi Furnace
+achievement.oilplant=Oil Plant
+achievement.oilplant.desc=Start up a Distillation Tower
+achievement.factory=Factory
+achievement.factory.desc=Craft a Processing Array
+achievement.upgradeebf=Upgrade your EBF
+achievement.upgradeebf.desc=Craft a MV Energy Hatch
+achievement.maintainance=Maintenance
+achievement.maintainance.desc=Fix all Maintenance Problems in a Machine
+achievement.upgrade=Upgrade your Coils (level I)
+achievement.upgrade.desc=Craft a Kanthal Heating Coil
+achievement.titan=Titanium
+achievement.titan.desc=Produce a Titanium Ingot
+achievement.magic=Magic?
+achievement.magic.desc=Craft a LV Magic Energy Converter
+achievement.highmage=High Mage
+achievement.highmage.desc=Craft a HV Magic Energy Absorber
+achievement.artificaldia=Artificial Diamond
+achievement.artificaldia.desc=Produce an Industrial Diamond in an Implosion Compressor
+achievement.muchsteam=So much Steam
+achievement.muchsteam.desc=Start up a Large Turbine
+achievement.efficientsteam=Efficient Steam
+achievement.efficientsteam.desc=Use Superheated Steam in a Large Turbine
+achievement.upgrade2=Upgrade your Coils (level II)
+achievement.upgrade2.desc=Craft a Nichrome Heating Coil
+achievement.tungsten=Tungsten
+achievement.tungsten.desc=Cool down a Hot Tungsten Ingot
+achievement.osmium=Osmium
+achievement.osmium.desc=Cool down a Hot Osmium Ingot
+achievement.hightech=Hightech
+achievement.hightech.desc=Craft a Tier 1 Field Generator
+achievement.amplifier=Amplifier
+achievement.amplifier.desc=Craft an Amp Fab
+achievement.scanning=Scanning
+achievement.scanning.desc=Complete an Element Scan
+achievement.alienpower=Alien Power
+achievement.alienpower.desc=Craft a Mark I Naquadah Generator
+achievement.universal=Universal
+achievement.universal.desc=Craft a Mass Fabricator
+achievement.replication=Replication
+achievement.replication.desc=Craft a Replicator
+achievement.tungstensteel=Tungstensteel
+achievement.tungstensteel.desc=Cool down a Hot Tungstensteel Ingot
+achievement.upgrade3=Upgrade your Coils (level III)
+achievement.upgrade3.desc=Craft a TPV-Alloy Heating Coil
+achievement.hssg=HSS-G
+achievement.hssg.desc=Cool down a Hot HSS-G Ingot
+achievement.upgrade4=Upgrade your Coils (level IV)
+achievement.upgrade4.desc=Craft a HSS-G Heating Coil
+achievement.stargatematerial=Stargate material
+achievement.stargatematerial.desc=Cool down a Hot Naquadah Ingot
+achievement.conducting=Conducting
+achievement.conducting.desc=Craft a Superconducting Coil
+achievement.fusion=Fusion
+achievement.fusion.desc=Produce Helium Plasma
+achievement.higherefficency=Higher efficiency
+achievement.higherefficency.desc=Produce Nitrogen Plasma
+achievement.advancing=Advancing
+achievement.advancing.desc=Produce Europium
+achievement.stargateliquid=Liquid Stargate material
+achievement.stargateliquid.desc=Produce Naquadah
+achievement.tothelimit=Going for the Limit
+achievement.tothelimit.desc=Produce Americium
+achievement.fullefficiency=Full Efficiency
+achievement.fullefficiency.desc=Craft a Plasma Generator III
+achievement.upgrade5=Upgrade your Coils (level V)
+achievement.upgrade5.desc=Craft a Naquadah Heating Coil
+achievement.alienmetallurgy=Alien Metallurgy
+achievement.alienmetallurgy.desc=Cool down a Hot Naquadah Alloy Ingot
+achievement.over9000=Over 9000!
+achievement.over9000.desc=Craft a Naquadah Alloy Heating Coil
+achievement.finalpreparations=Final Preparations
+achievement.finalpreparations.desc=Cool down a Hot Naquadria Ingot
+achievement.denseaspossible=As Dense As Possible
+achievement.denseaspossible.desc=Produce Neutronium
+achievement.zpmage=Energy Module
+achievement.zpmage.desc=Craft an Energy Module
+achievement.uvage=Energy Cluster
+achievement.uvage.desc=Craft an Energy Cluster
+achievement.whatnow=What now?
+achievement.whatnow.desc=Craft an Ultimate Battery
+
+achievement.gt.metaitem.01.32606=Electric Motor LuV tier
+achievement.gt.metaitem.01.32606.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32607=Electric Motor ZPM tier
+achievement.gt.metaitem.01.32607.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32608=Electric Motor UV tier
+achievement.gt.metaitem.01.32608.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32596=Electric Motor UHV tier
+achievement.gt.metaitem.01.32596.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32595=Electric Motor UEV tier
+achievement.gt.metaitem.01.32595.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.metaitem.01.32615=Electric Pump LuV tier
+achievement.gt.metaitem.01.32615.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32616=Electric Pump ZPM tier
+achievement.gt.metaitem.01.32616.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32617=Electric Pump UV tier
+achievement.gt.metaitem.01.32617.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32618=Electric Pump UHV tier
+achievement.gt.metaitem.01.32618.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32619=Electric Pump UEV tier
+achievement.gt.metaitem.01.32619.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.metaitem.01.32635=Conveyor Module LuV tier
+achievement.gt.metaitem.01.32635.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32636=Conveyor Module ZPM tier
+achievement.gt.metaitem.01.32636.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32637=Conveyor Module UV tier
+achievement.gt.metaitem.01.32637.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32638=Conveyor Module UHV tier
+achievement.gt.metaitem.01.32638.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32639=Conveyor Module UEV tier
+achievement.gt.metaitem.01.32639.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.metaitem.01.32645=Electric Piston LuV tier
+achievement.gt.metaitem.01.32645.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32646=Electric Piston ZPM tier
+achievement.gt.metaitem.01.32646.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32647=Electric Piston UV tier
+achievement.gt.metaitem.01.32647.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32648=Electric Piston UHV tier
+achievement.gt.metaitem.01.32648.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32649=Electric Piston UEV tier
+achievement.gt.metaitem.01.32649.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.metaitem.01.32655=Robot Arm LuV tier
+achievement.gt.metaitem.01.32655.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32656=Robot Arm ZPM tier
+achievement.gt.metaitem.01.32656.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32657=Robot Arm UV tier
+achievement.gt.metaitem.01.32657.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32658=Robot Arm UHV tier
+achievement.gt.metaitem.01.32658.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32659=Robot Arm UEV tier
+achievement.gt.metaitem.01.32659.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.metaitem.01.32675=Field Generator tier VI
+achievement.gt.metaitem.01.32675.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32676=Field Generator tier VII
+achievement.gt.metaitem.01.32676.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32677=Field Generator tier VIII
+achievement.gt.metaitem.01.32677.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32678=Field Generator tier IX
+achievement.gt.metaitem.01.32678.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32679=Field Generator tier X
+achievement.gt.metaitem.01.32679.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.metaitem.01.32685=Emitter LuV tier
+achievement.gt.metaitem.01.32685.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32686=Emitter ZPM tier
+achievement.gt.metaitem.01.32686.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32687=Emitter UV tier
+achievement.gt.metaitem.01.32687.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32688=Emitter UHV tier
+achievement.gt.metaitem.01.32688.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32689=Emitter UEV tier
+achievement.gt.metaitem.01.32689.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.metaitem.01.32695=Sensor LuV tier
+achievement.gt.metaitem.01.32695.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32696=Sensor ZPM tier
+achievement.gt.metaitem.01.32696.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32697=Sensor UV tier
+achievement.gt.metaitem.01.32697.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32698=Sensor UHV tier
+achievement.gt.metaitem.01.32698.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32699=Sensor UEV tier
+achievement.gt.metaitem.01.32699.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.blockmachines.hatch.energy.tier.06=LuV Energy Hatch
+achievement.gt.blockmachines.hatch.energy.tier.06.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.hatch.energy.tier.07=ZPM Energy Hatch
+achievement.gt.blockmachines.hatch.energy.tier.07.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.hatch.energy.tier.08=UV Energy Hatch
+achievement.gt.blockmachines.hatch.energy.tier.08.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.hatch.energy.tier.09=UHV Energy Hatch
+achievement.gt.blockmachines.hatch.energy.tier.09.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.hatch.energy.tier.10=UEV Energy Hatch
+achievement.gt.blockmachines.hatch.energy.tier.10.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.hatch.energy.tier.11=UIV Energy Hatch
+achievement.gt.blockmachines.hatch.energy.tier.11.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.hatch.energy.tier.12=UMV Energy Hatch
+achievement.gt.blockmachines.hatch.energy.tier.12.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.blockmachines.hatch.dynamo.tier.06=LuV Dynamo Hatch
+achievement.gt.blockmachines.hatch.dynamo.tier.06.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.hatch.dynamo.tier.07=ZPM Dynamo Hatch
+achievement.gt.blockmachines.hatch.dynamo.tier.07.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.hatch.dynamo.tier.08=UV Dynamo Hatch
+achievement.gt.blockmachines.hatch.dynamo.tier.08.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.hatch.dynamo.tier.09=UHV Dynamo Hatch
+achievement.gt.blockmachines.hatch.dynamo.tier.09.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.hatch.dynamo.tier.10=UEV Dynamo Hatch
+achievement.gt.blockmachines.hatch.dynamo.tier.10.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.hatch.dynamo.tier.11=UIV Dynamo Hatch
+achievement.gt.blockmachines.hatch.dynamo.tier.11.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.hatch.dynamo.tier.12=UMV Dynamo Hatch
+achievement.gt.blockmachines.hatch.dynamo.tier.12.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.blockmachines.fusioncomputer.tier.06=Fusion Computer Mark I
+achievement.gt.blockmachines.fusioncomputer.tier.06.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.fusioncomputer.tier.07=Fusion Computer Mark II
+achievement.gt.blockmachines.fusioncomputer.tier.07.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.fusioncomputer.tier.08=Fusion Computer Mark III
+achievement.gt.blockmachines.fusioncomputer.tier.08.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.metaitem.03.32072=Neuro Processing Unit
+achievement.gt.metaitem.03.32077.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.03.32077=Bio Processing Unit
+achievement.gt.metaitem.03.32072.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.03.32095=Wetware Mainframe
+achievement.gt.metaitem.03.32095.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.03.32099=Bioware Supercomputer
+achievement.gt.metaitem.03.32099.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.03.32120=Bio Mainframe
+achievement.gt.metaitem.03.32120.desc=Pickup this item to see the recipe in NEI
+
+achievement.item.NanoCircuit=Nano Circuit
+achievement.item.NanoCircuit.desc=Pickup this item to see the recipe in NEI
+achievement.item.PikoCircuit=Pico Circuit
+achievement.item.PikoCircuit.desc=Pickup this item to see the recipe in NEI
+achievement.item.QuantumCircuit=Quantum Circuit
+achievement.item.QuantumCircuit.desc=Pickup this item to see the recipe in NEI
+achievement.item.relocator=Relocator
+achievement.item.relocator.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.blockmachines.multimachine.em.computer=Quantum Computer
+achievement.gt.blockmachines.multimachine.em.computer.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.multimachine.em.research=Research station
+achievement.gt.blockmachines.multimachine.em.research.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.multimachine.em.junction=Matter Junction
+achievement.gt.blockmachines.multimachine.em.junction.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.multimachine.em.mattertoem=Matter Quantizer
+achievement.gt.blockmachines.multimachine.em.mattertoem.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.multimachine.em.emtomatter=Matter Dequantizer
+achievement.gt.blockmachines.multimachine.em.emtomatter.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.multimachine.em.essentiatoem=Essentia Quantizer
+achievement.gt.blockmachines.multimachine.em.essentiatoem.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.multimachine.em.emtoessentia=Essentia Dequantizer
+achievement.gt.blockmachines.multimachine.em.emtoessentia.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.multimachine.em.scanner=Elemental Scanner
+achievement.gt.blockmachines.multimachine.em.scanner.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.multimachine.em.databank=Data Bank
+achievement.gt.blockmachines.multimachine.em.databank.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockcasingsTT.8=Hollow Casing
+achievement.gt.blockcasingsTT.8.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockcasingsTT.7=Molecular Coil
+achievement.gt.blockcasingsTT.7.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockcasings.12=Dimensionally Transcendent Casing
+achievement.gt.blockcasings.12.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockcasings.13=Dimensional Injection Casing
+achievement.gt.blockcasings.13.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockcasings.14=Dimensional Bridge
+achievement.gt.blockcasings.14.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.multimachine.plasmaforge=Dimensionally Transcendent Plasma Forge
+achievement.gt.blockmachines.multimachine.plasmaforge.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockcasings5.11=Infinity Coil
+achievement.gt.blockcasings5.11.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockcasings5.12=Hypogen Coil
+achievement.gt.blockcasings5.12.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockcasings5.13=Eternal Coil
+achievement.gt.blockcasings5.13.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.blockmachines.wireless.receiver.tier.00=ULV Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.00.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.01=LV Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.01.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.02=MV Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.02.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.03=HV Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.03.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.04=EV Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.04.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.05=IV Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.05.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.06=LuV Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.06.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.07=ZPM Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.07.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.08=UV Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.08.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.09=UHV Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.09.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.10=UEV Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.10.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.11=UIV Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.11.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.12=UMV Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.12.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.13=UXV Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.13.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.receiver.tier.14=MAX Wireless Energy Hatch
+achievement.gt.blockmachines.wireless.receiver.tier.14.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.blockmachines.wireless.transmitter.tier.00=ULV Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.00.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.01=LV Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.01.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.02=MV Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.02.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.03=HV Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.03.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.04=EV Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.04.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.05=IV Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.05.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.06=LuV Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.06.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.07=ZPM Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.07.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.08=UV Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.08.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.09=UHV Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.09.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.10=UEV Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.10.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.11=UIV Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.11.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.12=UMV Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.12.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.13=UXV Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.13.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.wireless.transmitter.tier.14=MAX Wireless Dynamo
+achievement.gt.blockmachines.wireless.transmitter.tier.14.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.blockmachines.multimachine.oildrillinfinite=Infinite Oil/Gas/Fluid Drilling Rig
+achievement.gt.blockmachines.multimachine.oildrillinfinite.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.multimachine.oreprocessor=Integrated Ore Factory
+achievement.gt.blockmachines.multimachine.oreprocessor.desc=Processing all those ores.
+
+achievement.gt.blockmachines.multimachine.em.infuser=Energy Infuser
+achievement.gt.blockmachines.multimachine.em.infuser.desc=Pickup this item to see the recipe in NEI
+achievement.gt.blockmachines.hatch.holder.tier.09=Object Holder
+achievement.gt.blockmachines.hatch.holder.tier.09.desc=Pickup this item to see the recipe in NEI
+
+achievement.item.StargateShieldingFoil=Stargate-Radiation-Containment-Plate
+achievement.item.StargateShieldingFoil.desc=Pickup this item to see the recipe in NEI
+achievement.item.StargateChevron=Stargate Chevron
+achievement.item.StargateChevron.desc=Pickup this item to see the recipe in NEI
+achievement.item.StargateFramePart=Stargate Frame Part
+achievement.item.StargateFramePart.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.metaitem.01.32605=Ultimate Battery
+achievement.gt.metaitem.01.32605.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32609=Really Ultimate Battery
+achievement.gt.metaitem.01.32609.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32594=Extremely Ultimate Battery
+achievement.gt.metaitem.01.32594.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32145=Insanely Ultimate Battery
+achievement.gt.metaitem.01.32145.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32146=Mega Ultimate Battery
+achievement.gt.metaitem.01.32146.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32736=Energy Module
+achievement.gt.metaitem.01.32736.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32737=Energy Cluster
+achievement.gt.metaitem.01.32737.desc=Pickup this item to see the recipe in NEI
+achievement.gt.metaitem.01.32599=Lapotronic Energy Orb Cluster
+achievement.gt.metaitem.01.32599.desc=Pickup this item to see the recipe in NEI
+
+achievement.ic2.itemArmorQuantumHelmet=Quantum Helmet
+achievement.ic2.itemArmorQuantumHelmet.desc=Pickup this item to see the recipe in NEI
+achievement.ic2.itemArmorQuantumChestplate=Quantum Chestplate
+achievement.ic2.itemArmorQuantumChestplate.desc=Pickup this item to see the recipe in NEI
+achievement.ic2.itemArmorQuantumLegs=Quantum Leggings
+achievement.ic2.itemArmorQuantumLegs.desc=Pickup this item to see the recipe in NEI
+achievement.ic2.itemArmorQuantumBoots=Quantum Boots
+achievement.ic2.itemArmorQuantumBoots.desc=Pickup this item to see the recipe in NEI
+
+achievement.item.graviChestPlate=Gravi Chestplate
+achievement.item.graviChestPlate.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.blockreinforced.12=Raw Deep Dark Portal Block
+achievement.gt.blockreinforced.12.desc=Pickup this item to see the recipe in NEI
+
+achievement.gt.blockmachines.debug.tt.maintenance=Auto-Taping Maintenance Hatch
+achievement.gt.blockmachines.debug.tt.maintenance.desc=Pickup this item to see the recipe in NEI
+
+for.bees.species.clay=Clay
+for.bees.species.slimeball=Slimeball
+for.bees.species.peat=Peat
+for.bees.species.stickyresin=Stickyresin
+for.bees.species.coal=Coal
+for.bees.species.oil=Oil
+for.bees.species.apatite=Apatite
+for.bees.species.ash=Ash
+for.bees.species.fertilizer=Fertilizer
+for.bees.species.sandwich=Sandwich
+for.bees.species.coolant=Coolant
+for.bees.species.energy=Energy
+for.bees.species.pyrotheum=Pyrotheum
+for.bees.species.cryotheum=Cryotheum
+for.bees.species.lapotron=Lapotron
+for.bees.species.redalloy=Red Alloy
+for.bees.species.redstonealloy=Redstone Alloy
+for.bees.species.conductiveiron=Conductive Iron
+for.bees.species.vibrantalloy=Vibrant Alloy
+for.bees.species.energeticalloy=Energetic Alloy
+for.bees.species.electricalsteel=Electrical Steel
+for.bees.species.darksteel=Dark Steel
+for.bees.species.pulsatingiron=Pulsating Iron
+for.bees.species.stainlesssteel=Stainless Steel
+for.bees.species.enderium=Enderium
+for.bees.species.thaumiumdust=Thaumium Dust
+for.bees.species.thaumiumshard=Thaumic Shards
+for.bees.species.amber=Amber
+for.bees.species.quicksilver=Quicksilver
+for.bees.species.salismundus=Salis Mundus
+for.bees.species.tainted=Tainted
+for.bees.species.mithril=Mithril
+for.bees.species.astralsilver=Astral Silver
+for.bees.species.thauminite=Thauminite
+for.bees.species.shadowmetal=Shadow Metal
+for.bees.species.divided=Unstable
+for.bees.species.sparkeling=Wither
+for.bees.species.redstone=Redstone
+for.bees.species.certus=Certus
+for.bees.species.fluix=Fluix
+for.bees.species.ruby=Ruby
+for.bees.species.lapis=Lapis
+for.bees.species.sapphire=Sapphire
+for.bees.species.diamond=Diamond
+for.bees.species.olivine=Olivine
+for.bees.species.emerald=Emerald
+for.bees.species.redgarnet=Red Garnet
+for.bees.species.yellowgarnet=Yellow Garnet
+for.bees.species.firestone=Firestone
+for.bees.species.copper=Copper
+for.bees.species.tin=Tin
+for.bees.species.lead=Lead
+for.bees.species.iron=Iron
+for.bees.species.steel=Steel
+for.bees.species.nickel=Nickel
+for.bees.species.zinc=Zinc
+for.bees.species.silver=Silver
+for.bees.species.cryolite=Cryolite
+for.bees.species.gold=Gold
+for.bees.species.sulfur=Sulfur
+for.bees.species.gallium=Gallium
+for.bees.species.arsenic=Arsenic
+for.bees.species.bauxite=Bauxite
+for.bees.species.aluminium=Aluminium
+for.bees.species.titanium=Titanium
+for.bees.species.chrome=Chrome
+for.bees.species.manganese=Manganese
+for.bees.species.tungsten=Tungsten
+for.bees.species.platinum=Platinum
+for.bees.species.iridium=Iridium
+for.bees.species.osmium=Osmium
+for.bees.species.lithium=Lithium
+for.bees.species.salty=Salt
+for.bees.species.electrotine=Electrotine
+for.bees.species.uranium=Uranium
+for.bees.species.plutonium=Plutonium
+for.bees.species.naquadah=Naquadah
+for.bees.species.naquadria=Naquadria
+for.bees.species.dob=D-O-B
+for.bees.species.thorium=Thorium
+for.bees.species.lutetium=Lutetium
+for.bees.species.americium=Americium
+for.bees.species.neutronium=Neutronium
+for.bees.species.naga=Naga
+for.bees.species.lich=Lich
+for.bees.species.hydra=Hydra
+for.bees.species.urghast=Ur Ghast
+for.bees.species.snowqueen=Snowqueen
+for.bees.species.space=Space
+for.bees.species.meteoriciron=Meteoric Iron
+for.bees.species.desh=Desh
+for.bees.species.ledox=Ledox
+for.bees.species.callistoice=Callisto Ice
+for.bees.species.mytryl=Mytryl
+for.bees.species.quantium=Quantium
+for.bees.species.oriharukon=Oriharukon
+for.bees.species.infusedgold=Infused Gold
+for.bees.species.mysteriouscrystal=Mysterious Crystal
+for.bees.species.blackplutonium=Black Plutonium
+for.bees.species.trinium=Trinium
+for.bees.species.mercury=Mercury
+for.bees.species.venus=Venus
+for.bees.species.moon=Moon
+for.bees.species.mars=Mars
+for.bees.species.phobos=Phobos
+for.bees.species.deimos=Deimos
+for.bees.species.ceres=Ceres
+for.bees.species.jupiter=Jupiter
+for.bees.species.io=Io
+for.bees.species.europa=Europa
+for.bees.species.ganymede=Ganymed
+for.bees.species.callisto=Callisto
+for.bees.species.saturn=Saturn
+for.bees.species.enceladus=Enceladus
+for.bees.species.titan=Titan
+for.bees.species.uranus=Uranus
+for.bees.species.miranda=Miranda
+for.bees.species.oberon=Oberon
+for.bees.species.neptune=Neptune
+for.bees.species.proteus=Proteus
+for.bees.species.triton=Triton
+for.bees.species.pluto=Pluto
+for.bees.species.haumea=Haume
+for.bees.species.makemake=MakeMake
+for.bees.species.centauri=Centauri
+for.bees.species.acentauri=aCentauri
+for.bees.species.tceti=TCeti
+for.bees.species.tcetie=TCetiE
+for.bees.species.barnarda=Barnarda
+for.bees.species.barnardac=BarnardaC
+for.bees.species.barnardae=BarnardaE
+for.bees.species.barnardaf=BarnardaF
+for.bees.species.vega=Vega
+for.bees.species.vegab=VegaB
+for.bees.species.cosmicneutronium=Cosmic Neutronium
+for.bees.species.infinitycatalyst=Infinity Catalyst
+for.bees.species.infinity=Infinity
+for.bees.species.enddust=End Dust
+for.bees.species.stardust=Stardust
+for.bees.species.ectoplasma=Ectoplasma
+for.bees.species.arcaneshard=Arcaneshard
+for.bees.species.dragonessence=Dragon Essence
+for.bees.species.enderman=Enderman
+for.bees.species.silverfish=Silverfish
+
+for.mutation.condition.biomeid=Required Biome
+for.mutation.condition.dim=Required Dimension
+
+itemGroup.GTtools=Prebuild Tools
+
+gregtech.fertilitySterile=Sterile
+gregtech.fertilityMultiply=Multiply
+gregtech.floweringNonpollinating=Non pollinating
+gregtech.floweringNaturalistic=Naturalistic
+gregtech.areaLethargic=Lethargic
+gregtech.areaExploratory=Exploratory
+gregtech.speedUnproductive=Unproductive
+gregtech.speedAccelerated=Accelerated
+gregtech.lifeBlink=Blink
+gregtech.lifeEon=Eon
+gregtech.effectTreetwister=Treetwister
+
+entity.gregtech.GT_Entity_Arrow.name= a GregTech arrow
+
+fluid.Xenon=Xenon
+fluid.FermentedBacterialSludge=Fermented Bacterial Sludge
+fluid.NitricAcid=Nitric Acid
+fluid.EnrichedBacterialSludge=Enriched Bacterial Sludge
+fluid.Ammonia=Ammonia
+fluid.Neon=Neon
+fluid.Oganesson=Oganesson
+fluid.Aqua Regia=Aqua Regia
+fluid.Ammonium Chloride=Ammonium Chloride
+fluid.Platinum Concentrate=Platinum Concentrate
+fluid.Sodium Formate=Sodium Formate
+fluid.Formic Acid=Formic Acid
+fluid.Palladium Enriched Ammonia=Palladium Enriched Ammonia
+fluid.Ruthenium Tetroxide=Ruthenium Tetroxide
+fluid.Hot Ruthenium Tetroxide Solution=Hot Ruthenium Tetroxide Solution
+fluid.Ruthenium Tetroxide Solution=Ruthenium Tetroxide Solution
+fluid.Rhodium Sulfate=Rhodium Sulfate
+fluid.Rhodium Sulfate Solution=Rhodium Sulfate Solution
+fluid.Calcium Chloride=Calcium Chloride
+fluid.Acidic Osmium Solution=Acidic Osmium Solution
+fluid.Osmium Solution=Osmium Solution
+fluid.Acidic Iridium Solution=Acidic Iridium Solution
+fluid.Rhodium Salt Solution=Rhodium Salt Solution
+fluid.Rhodium Filter Cake Solution=Rhodium Filter Cake Solution
+fluid.Pollution=Pollution
+fluid.SodiumPotassium=Sodium Potassium
+fluid.Concrete=Concrete
+fluid.mushroomStew=Mushroom Stew
+
+fluid.Sodium Tungstate=Sodium Tungstate
+fluid.Phosgene=Phosgene
+fluid.Ethyl Chloroformate=Ethyl Chloroformate
+fluid.Ethyl Carbamate=Ethyl Carbamate
+fluid.Ethyl N-nitrocarbamate=Ethyl N-nitrocarbamate
+fluid.Ammonium N-nitrourethane=Ammonium N-nitrourethane
+fluid.Trinitramid=Trinitramid
+fluid.Ammonia Boronfluoride Solution=Ammonia Boronfluoride Solution
+fluid.Sodium Tetrafluoroborate=Sodium Tetrafluoroborate
+fluid.Tetrafluoroborate=Tetrafluoroborate
+fluid.Ethyl Acetate=Ethyl Acetate
+fluid.Acetylhydrazine=Acetylhydrazine
+fluid.Unsymmetrical Dimethylhydrazine=Unsymmetrical Dimethylhydrazine
+fluid.Monomethylhydrazine Fuel Mix=Monomethylhydrazine Fuel Mix
+fluid.Unsymmetrical Dimethylhydrazine Fuel Mix=Unsymmetrical Dimethylhydrazine Fuel Mix
+fluid.Boron Trifluoride=Boron Trifluoride
+fluid.Tert-Butylbenzene=Tert-Butylbenzene
+fluid.2-tert-butyl-anthraquinone=2-tert-butyl-anthraquinone
+fluid.2-tert-butyl-anthrahydroquinone=2-tert-butyl-anthrahydroquinone
+fluid.Hydrogen Peroxide=Hydrogen Peroxide
+fluid.hydrazine=Hydrazine
+fluid.Dimethyl Sulfate=Dimethyl Sulfate
+fluid.Ethyl Dinitrocarbamate=Ethyl Dinitrocarbamate
+fluid.Ammonium Dinitramide=Ammonium Dinitramide
+fluid.LMP-103S=LMP-103S
+fluid.Nitromethane=Nitromethane
+fluid.O-Xylene=O-Xylene
+# GT_MetaGenerated_Item_98 cells
+fluid.UnknownNutrientAgar=Unknown Nutrient Agar
+fluid.SeaweedBroth=Seaweed Broth
+fluid.EnzymesSollution=Enzyme Solution
+fluid.escherichiakolifluid=eColi Bacteria Fluid
+fluid.Penicillin=Penicillin
+fluid.FluorecentdDNA=Fluorescent DNA
+fluid.Polymerase=Polymerase
+# No cell, most from bart bio
+fluid.Monomethylhydrazine=Monomethylhydrazine
+fluid.binnibacteriafluid=binnibacteriafluid
+fluid.barnadafisarboriatorisfluid=barnadafisarboriatorisfluid
+fluid.GelatinMixture=GelatinMixture
+fluid.sludge=sludge
+fluid.Formaldehyde=Formaldehyde
+fluid.tcetieisfucusserratusfluid=tcetieisfucusserratusfluid
+fluid.MeatExtract=MeatExtract
+# No recipe
+fluid.CompressedOxygen=CompressedOxygen
+fluid.CompressedNitrogen=CompressedNitrogen
+fluid.redplasma=redplasma
+fluid.tile.fluidBlockSludge=fluidBlockSludge
+# No Texture
+fluid.guano=guano
+fluid.poo=poo
+fluid.sewerage=sewerage
+fluid.fuelgc=fuelgc
+fluid.dirtywater=dirtywater
+fluid.oilgc=oilgc
+
+# Space projects
+gt.solar.system.overworld=Overworld
+gt.solar.system.sol=Sol
+gt.solar.system.moon=Moon
+gt.solar.system.mars=Mars
+gt.solar.system.deimos=Deimos
+gt.solar.system.phoebe=Phoebe
+gt.solar.system.miranda=Miranda
+gt.solar.system.ceres=Ceres
+gt.solar.system.tethys=Tethys
+gt.solar.system.iapetus=Iapetus
+gt.solar.system.saturn=Saturn
+gt.solar.system.umbriel=Umbriel
+gt.solar.system.io=Io
+gt.solar.system.uranus=Uranus
+gt.solar.system.titania=Titania
+gt.solar.system.mimas=Mimas
+gt.solar.system.pluto=Pluto
+gt.solar.system.neptune=Neptune
+gt.solar.system.proteus=Proteus
+gt.solar.system.rhea=Rhea
+gt.solar.system.ariel=Ariel
+gt.solar.system.kuiperbelt=Kuiper Belt
+gt.solar.system.enceladus=Enceladus
+gt.solar.system.europa=Europa
+gt.solar.system.oberon=Oberon
+gt.solar.system.none=NONE
+gt.solar.system.makemake=MakeMake
+gt.solar.system.ganymede=Ganymede
+gt.solar.system.triton=Triton
+gt.solar.system.arrokoth=Arrokoth
+gt.solar.system.jupiter=Jupiter
+gt.solar.system.venus=Venus
+gt.solar.system.hyperion=Hyperion
+gt.solar.system.callisto=Callisto
+gt.solar.system.nereid=Nereid
+gt.solar.system.mercury=Mercury
+gt.solar.system.titan=Titan
+gt.solar.system.phobos=Phobos
+
+gt.multiBlock.controller.cokeOven=Coke Oven
+
+gt.locker.waila_armor_slot_none=Slot %s: §7None
+gt.locker.waila_armor_slot_generic=Slot %s: §e%s
+gt.locker.waila_armor_slot_charged=Slot %s: §e%s§r (%s%s%%§r)
+
+gt.db.metrics_cover.coords=§a%s§r, §a%s§r, §a%s§r
+
+gt.item.adv_sensor_card.dimension=Dimension: §a%s
+gt.item.adv_sensor_card.coords=Coordinates: %s
+gt.item.adv_sensor_card.tooltip.recipe_hint=Created by attaching a Metrics Transmitter cover, no standard recipe
+gt.item.adv_sensor_card.tooltip.fried.1=§o§dThis thing looks completely fried...
+gt.item.adv_sensor_card.tooltip.fried.2=§cDestroyed due to metrics transmitter being removed
+gt.item.adv_sensor_card.tooltip.fried.3=§cor the machine being destroyed
+gt.item.adv_sensor_card.tooltip.machine=Machine: §b%s
+gt.item.adv_sensor_card.tooltip.frequency=Frequency: §b%s
+gt.item.adv_sensor_card.error.deconstructed.1=-ERROR- Machine Deconstructed
+gt.item.adv_sensor_card.error.deconstructed.2=Place machine again to re-enable
+gt.item.adv_sensor_card.error.no_data=No data found
+
+gt.cover.info.format.tick_rate=§b%s§r %s
+gt.cover.info.chat.tick_rate=Cover tick rate set to %s
+gt.cover.info.chat.tick_rate_not_allowed=Cannot adjust tick rate of this cover type with a jackhammer
+gt.cover.info.button.tick_rate.1=Current tick rate: Every %s%s
+gt.cover.info.button.tick_rate.2=Left click to increase, right click to decrease
+gt.cover.info.button.tick_rate.3=Hold Ctrl to adjust by more steps per click
+gt.cover.info.button.bounds_notification.minimum=§7 (minimum)§r
+gt.cover.info.button.bounds_notification.maximum=§7 (maximum)§r
+gt.time.tick.singular=tick
+gt.time.tick.plural=ticks
+gt.time.second.singular=second
+gt.time.second.plural=seconds
+
+#Tool modes
+gt.wrench.mode.1=Line Mode
+
diff --git a/src/main/resources/assets/gregtech/lang/zh_CN.lang b/src/main/resources/assets/gregtech/lang/zh_CN.lang
new file mode 100644
index 0000000000..f86709e96a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/lang/zh_CN.lang
@@ -0,0 +1,1048 @@
+# Creative ItemGroup Tab
+itemGroup.GregTech.GTPP_BLOCKS=GT++方块
+itemGroup.GregTech.GTPP_MACHINES=GT++机器
+itemGroup.GregTech.GTPP_MISC=GT++杂项
+itemGroup.GregTech.GTPP_OTHER=GT++其他
+itemGroup.GregTech.GTPP_OTHER_2=GT++其他II
+itemGroup.GregTech.GTPP_TOOLS=GT++工具
+itemGroup.GregTech.Main=主体
+itemGroup.GregTech.Materials=材料
+itemGroup.GregTech.Ores=矿石
+
+GT5U.autoplace.error.no_hatch=§c建议放置仓室 §4%s§c ,但未在库存中找到
+GT5U.autoplace.error.no_mte.id=§c建议放置meta-ID为 §4%s§c 的方块,但未在库存中找到
+GT5U.autoplace.error.no_mte.class_name=§c建议放置class名为 §4%d§c 的方块,但未在库存中找到
+
+# Multiblock Tooltip Builder Keywords
+# Context can be found in the class gregtech.api.util.GT_Multiblock_Tooltip_Builder
+GT5U.MBTT.MachineType=机器类型
+GT5U.MBTT.Dimensions=大小
+GT5U.MBTT.Hollow=(中空)
+GT5U.MBTT.Structure=结构
+GT5U.MBTT.Controller=控制器
+GT5U.MBTT.Minimum=(至少)
+GT5U.MBTT.MaintenanceHatch=维护仓
+GT5U.MBTT.MufflerHatch=消声仓
+GT5U.MBTT.EnergyHatch=能源仓
+GT5U.MBTT.DynamoHatch=动力仓
+GT5U.MBTT.InputBus=输入总线
+GT5U.MBTT.InputHatch=输入仓
+GT5U.MBTT.OutputBus=输出总线
+GT5U.MBTT.OutputHatch=输出仓
+GT5U.MBTT.Causes=产生
+GT5U.MBTT.PPS=点/秒污染
+GT5U.MBTT.Hold=按住
+GT5U.MBTT.Display=以显示结构指导
+GT5U.MBTT.StructureHint=多种可选方块或任意等级方块
+GT5U.MBTT.Mod=添加模组:
+GT5U.MBTT.Air=必须留空
+
+GT5U.MBTT.subchannel=子信道 §6%s§r 将被用于 %s
+
+GT5U.cracker.io_side=输入/输出仓必须处在对侧!
+
+GT5U.turbine.running.true=涡轮运行
+GT5U.turbine.running.false=涡轮停止
+GT5U.turbine.maintenance.false=没有维护问题
+GT5U.turbine.maintenance.true=需要维护
+GT5U.turbine.efficiency=当前速度
+GT5U.turbine.flow=最优流量
+GT5U.turbine.fuel=剩余燃料
+GT5U.turbine.dmg=涡轮损坏
+GT5U.turbine.loose=涡轮模式:松
+GT5U.turbine.tight=涡轮模式:紧
+
+GT5U.engine.output=当前输出
+GT5U.engine.consumption=燃料消耗量
+GT5U.engine.value=燃料热值
+GT5U.engine.efficiency=当前效率
+
+GT5U.PA.machinetier=已安装机器等级
+GT5U.PA.discount=能耗减免
+GT5U.PA.parallel=并行处理
+
+GT5U.LHE.steam=(蒸汽)后面数字就是用涡轮发的电
+GT5U.LHE.superheated=过热模式
+GT5U.LHE.threshold=阈值
+
+GT5U.fusion.req=需要EU
+GT5U.fusion.plasma=等离子体输出
+
+GT5U.EBF.heat=热容
+GT5U.coil.None=无
+GT5U.coil.ULV=无
+GT5U.coil.LV=白铜
+GT5U.coil.MV=坎塔尔合金
+GT5U.coil.HV=镍铬合金
+GT5U.coil.EV=钨钢
+GT5U.coil.IV=高速钢-G
+GT5U.coil.LuV=高速钢-S
+GT5U.coil.ZPM=硅岩
+GT5U.coil.UV=硅岩合金
+GT5U.coil.UHV=三元金属
+GT5U.coil.UEV=通流琥珀金
+GT5U.coil.UIV=觉醒龙锭
+GT5U.coil.UMV=无尽
+GT5U.coil.UXV=海珀珍
+GT5U.coil.MAX=永恒
+
+GT5U.MS.multismelting=同时熔炼
+
+GT5U.machines.tier=等级
+GT5U.machines.workarea=工作区域
+GT5U.machines.workareaset=工作区域设置为
+GT5U.machines.radius=半径
+GT5U.machines.blocks=方块
+GT5U.machines.chunks=区块
+GT5U.machines.miner=采矿机
+GT5U.machines.powersource.power=功率
+GT5U.machines.powersource.steam=蒸汽
+GT5U.machines.pump=泵
+GT5U.machines.separatebus=输入总线已独立
+GT5U.machines.pumpareaset=工作区域设置为
+GT5U.machines.oilfluidpump=石油/流体钻机
+GT5U.machines.minermulti=采矿场
+GT5U.machines.digitalchest.voidoverflow.enabled=溢出销毁:§a启用§r
+GT5U.machines.digitalchest.voidoverflow.disabled=溢出销毁:§a禁用§r
+GT5U.machines.digitaltank.tooltip=存储 %sL 流体
+GT5U.machines.digitaltank.tooltip1=拆卸后可保留其中流体
+GT5U.machines.digitaltank.tooltip2=潜行拆卸可销毁内部流体
+GT5U.machines.digitaltank.autooutput.tooltip=流体自动输出
+GT5U.machines.digitaltank.lockfluid.tooltip=流体锁定模式
+GT5U.machines.digitaltank.lockfluid.tooltip.1=§7锁定本容器,只接受一种流体
+GT5U.machines.digitaltank.lockfluid.tooltip.2=§7将锁定为进入容器的第一种流体
+GT5U.machines.digitaltank.voidoverflow.tooltip=溢出销毁模式
+GT5U.machines.digitaltank.voidoverflow.tooltip.1=§7当容器满溢时,销毁收到的所有流体
+GT5U.machines.digitaltank.voidfull.tooltip=完全销毁模式
+GT5U.machines.digitaltank.voidfull.tooltip.1=§7销毁所有进入容器的流体
+GT5U.machines.digitaltank.inputfromoutput.tooltip=从输出面输入流体
+GT5U.machines.select_circuit=选择机器模式
+GT5U.machines.select_circuit.tooltip=虚拟电路板槽
+GT5U.machines.select_circuit.tooltip.1=§7左键/右键/滚轮以切换编程电路
+GT5U.machines.select_circuit.tooltip.2=§7Shift+左键打开GUI
+GT5U.machines.select_circuit.tooltip.3=§7Shift+右键清空
+GT5U.machines.extra_tooltips_toggle.tooltip=补充信息
+GT5U.machines.fluid_transfer.tooltip=流体自动输出
+GT5U.machines.fluid_transfer.tooltip.extended=§6螺丝刀:§7右键机器以
+GT5U.machines.fluid_transfer.tooltip.extended.1=§7切换输出面输入;按住
+GT5U.machines.fluid_transfer.tooltip.extended.2=§7Shift以切换输入过滤.
+GT5U.machines.fluid_transfer.tooltip.extended.3=§6电烙铁:§7右键机器以
+GT5U.machines.fluid_transfer.tooltip.extended.4=§7切换红石信号强度;按住
+GT5U.machines.fluid_transfer.tooltip.extended.5=§7Shift以切换多组输入.
+GT5U.machines.item_transfer.tooltip=物品自动输出
+GT5U.machines.item_transfer.tooltip.extended=§6螺丝刀:§7右键机器以
+GT5U.machines.item_transfer.tooltip.extended.1=§7切换输出面输入;按住
+GT5U.machines.item_transfer.tooltip.extended.2=§7Shift以切换输入过滤.
+GT5U.machines.item_transfer.tooltip.extended.3=§6电烙铁:§7右键机器以
+GT5U.machines.item_transfer.tooltip.extended.4=§7切换红石信号强度;按住
+GT5U.machines.item_transfer.tooltip.extended.5=§7Shift以切换多组输入.
+GT5U.machines.battery_slot.tooltip=电力槽
+GT5U.machines.battery_slot.tooltip.1=§7使用 %1$s§7 电池供能
+GT5U.machines.battery_slot.tooltip.2=§7可以为 %1$s§7 工具&电池充电
+GT5U.machines.battery_slot.tooltip.extended=§4警告:§7 如果通过线缆输入
+GT5U.machines.battery_slot.tooltip.extended.1=§7%2$s§7+ 电压将导致爆炸.
+GT5U.machines.battery_slot.tooltip.alternative=电力槽
+GT5U.machines.battery_slot.tooltip.alternative.1=%1$s§7 电压? 你已经不再需要tooltip了.
+GT5U.machines.special_slot.tooltip=数据槽
+GT5U.machines.special_slot.tooltip.1=§7用途参见合成表
+GT5U.machines.unused_slot.tooltip=存储槽
+GT5U.machines.unused_slot.tooltip.1=§7在本机器中空置
+GT5U.machines.stalled_stuttering.tooltip=§4故障:%1$s 不足§4!
+GT5U.machines.stalled_stuttering.tooltip.1=§7请在处理过程中
+GT5U.machines.stalled_stuttering.tooltip.2=§7持续提供 %1$s
+GT5U.machines.stalled_stuttering.tooltip.3=§7直到处理完成.
+GT5U.machines.stalled_stuttering.tooltip.extended=§7处理进度丢失了,
+GT5U.machines.stalled_stuttering.tooltip.extended.1=§7但处理产物还在.
+GT5U.machines.stalled_vent.tooltip=§4故障:无法排出蒸汽!
+GT5U.machines.stalled_vent.tooltip.1=§7请手持扳手右键机器
+GT5U.machines.stalled_vent.tooltip.2=§7以旋转其蒸汽输出口
+GT5U.machines.stalled_vent.tooltip.3=§7指向没有遮挡的方向.
+GT5U.machines.stalled_vent.tooltip.extended=§7处理进度丢失了,
+GT5U.machines.stalled_vent.tooltip.extended.1=§7但处理产物还在.
+GT5U.machines.oreprocessor1=§e运行模式:
+GT5U.machines.oreprocessor2=§c时间:%s s
+GT5U.machines.oreprocessor.void=§e销毁石粉:%s
+GT5U.machines.industrialapiary.cancel.tooltip=§c取消处理
+GT5U.machines.industrialapiary.cancel.tooltip.1=§7会同时关闭机器(软锤)
+GT5U.machines.industrialapiary.cancel.tooltip.2=§7§o无法停止公主蜂繁殖
+GT5U.machines.industrialapiary.speedlocked.tooltip=§r加速:%1$dx §7§o(锁定到最大值)
+GT5U.machines.industrialapiary.speedlocked.tooltip.1=§7能量消耗:+%2$s EU/t
+GT5U.machines.industrialapiary.speedlocked.tooltip.2=§7§o右键以解锁
+GT5U.machines.industrialapiary.speed.tooltip=加速:%1$dx
+GT5U.machines.industrialapiary.speed.tooltip.1=§7能量消耗:+%2$s EU/t
+GT5U.machines.industrialapiary.speed.tooltip.2=§7§o右键以锁定到最大值
+GT5U.machines.industrialapiary.info.tooltip=能量需求:%1$s EU/t
+GT5U.machines.industrialapiary.info.tooltip.1=温度:%2$s
+GT5U.machines.industrialapiary.info.tooltip.2=湿度:%3$s
+GT5U.machines.industrialapiary.info.tooltip.3=§7§o插入已分析蜜蜂以查看详细信息
+GT5U.machines.industrialapiary.infoextended.tooltip=能量需求:%1$s EU/t
+GT5U.machines.industrialapiary.infoextended.tooltip.1=温度:%2$s
+GT5U.machines.industrialapiary.infoextended.tooltip.2=湿度:%3$s
+GT5U.machines.industrialapiary.infoextended.tooltip.3=生产速度:%4$d %%
+GT5U.machines.industrialapiary.infoextended.tooltip.4=授粉几率:%5$d %%
+GT5U.machines.industrialapiary.infoextended.tooltip.5=寿命:%6$d %%
+GT5U.machines.industrialapiary.infoextended.tooltip.6=范围:%7$d x %8$d x %9$d
+GT5U.machines.industrialapiary.upgradeslot.tooltip=升级槽
+GT5U.machines.industrialapiary.upgradeslot.tooltip.1=§7同时兼容基因工业(gendustry)升级
+GT5U.machines.advdebugstructurewriter.tooltip=扫描周围的方块
+GT5U.machines.advdebugstructurewriter.tooltip.1=打印多方块非-方块实体结构验证码
+GT5U.machines.advdebugstructurewriter.tooltip.2=ABC轴与机器正面对齐
+GT5U.machines.advdebugstructurewriter.printed=已打印到控制台的结构
+GT5U.machines.advdebugstructurewriter.gui.origin=原点
+GT5U.machines.advdebugstructurewriter.gui.size=结构尺寸
+GT5U.machines.advdebugstructurewriter.gui.print.tooltip=打印结构
+GT5U.machines.advdebugstructurewriter.gui.highlight.tooltip=显示边框
+GT5U.machines.advdebugstructurewriter.gui.transpose.tooltip=转置
+
+GT5U.recipe_filter.representation_slot.tooltip=手持机器右键以设置过滤
+
+GT5U.gui.select.current=当前:
+
+GT5U.item.programmed_circuit.select.header=再编程电路
+
+# Note to translators: this translation entry is supposed to be a number indicating how many taunts you define here
+# Game will randomly display one of them
+GT5U.item.programmed_circuit.no_screwdriver.count=3
+GT5U.item.programmed_circuit.no_screwdriver.0=想要再空手编程电路板,嗯哼?
+GT5U.item.programmed_circuit.no_screwdriver.1=你的拇指不是螺丝刀.拿个真的过来.
+GT5U.item.programmed_circuit.no_screwdriver.2=Chuck Norris可以盯着电路板,然后电路板就自己再编程了. 但你不行.
+
+GT5U.hatch.disableFilter.true=输入过滤:§c关闭§r
+GT5U.hatch.disableFilter.false=输入过滤:§a开启§r
+GT5U.hatch.disableMultiStack.true=多组输入:§c关闭§r
+GT5U.hatch.disableMultiStack.false=多组输入:§c开启§r
+GT5U.hatch.disableSort.true=整理模式:§c关闭§r
+GT5U.hatch.disableSort.false=整理模式:§c开启§r
+GT5U.hatch.disableLimited.true=限制模式:§c关闭§r
+GT5U.hatch.disableLimited.false=限制模式:§c开启§r
+GT5U.hatch.infiniteCache.true=ME输出总线将无限缓存物品,直到连接上ME网络
+GT5U.hatch.infiniteCache.false=ME输出总线离线超过2秒后将停止接收物品
+GT5U.hatch.additionalConnection.true=可从任意方向连入ME网络
+GT5U.hatch.additionalConnection.false=仅可从正面连入ME网络
+
+GT5U.multiblock.pollution=污染减少到
+GT5U.multiblock.energy=存储能量
+GT5U.multiblock.Progress=工作时间
+GT5U.multiblock.efficiency=效率
+GT5U.multiblock.problems=问题
+GT5U.multiblock.mei=最大输入
+GT5U.multiblock.usage=大概功率
+
+GT5U.config.colormodulation=颜色调制器
+GT5U.config.colormodulation.cable_insulation=线缆绝缘材料
+GT5U.config.colormodulation.cable_insulation.B=蓝色
+GT5U.config.colormodulation.cable_insulation.G=绿色
+GT5U.config.colormodulation.cable_insulation.R=红色
+GT5U.config.colormodulation.construction_foam=建筑泡沫
+GT5U.config.colormodulation.construction_foam.B=蓝色
+GT5U.config.colormodulation.construction_foam.G=绿色
+GT5U.config.colormodulation.construction_foam.R=红色
+GT5U.config.colormodulation.machine_metal=机器金属(默认GUI颜色)
+GT5U.config.colormodulation.machine_metal.B=蓝色
+GT5U.config.colormodulation.machine_metal.G=绿色
+GT5U.config.colormodulation.machine_metal.R=红色
+GT5U.config.interface=GUI
+GT5U.config.interface.DisplayCoverTabs=显示覆盖板标签
+GT5U.config.interface.DisplayCoverTabs.tooltip=在所有GT机器上显示覆盖板标签
+GT5U.config.interface.FlipCoverTabs=翻转覆盖板标签
+GT5U.config.interface.FlipCoverTabs.tooltip=将显示的覆盖板标签从左侧翻转到右侧
+GT5U.config.interface.TooltipVerbosity=Tooltip冗余(悬停显示)
+GT5U.config.interface.TooltipVerbosity.tooltip=GT机器GUI的tooltip的详细程度?\n0: 无tooltips\n1: 只有一行tooltip\n2: 普通tooltip[默认]\n3+: 扩展tooltip
+GT5U.config.interface.TooltipShiftVerbosity=Tooltip冗余(按下Shift)
+GT5U.config.interface.TooltipShiftVerbosity.tooltip=按下Shift时,GT机器GUI的tooltip的详细程度?\n0: 无tooltips\n1: 只有一行tooltip\n2: 普通tooltip\n3+: 扩展tooltip[默认]
+GT5U.config.interface.CircuitsOrder=虚拟电路板顺序(见详情)
+GT5U.config.interface.CircuitsOrder.tooltip=虚拟电路板槽中选取电路板的顺序.\n请填写电路板的唯一标识符(Unique Identifier).\n例如: gregtech:gt.integrated_circuit
+GT5U.config.preference=客户端偏好
+GT5U.config.preference.mInputBusInitialFilter=输入总线的初始输入过滤状态
+GT5U.config.preference.mInputBusInitialFilter.tooltip=放置输入总线时,是否启用输入过滤\n不影响其他人放置的输入总线\n不影响已存在的输入总线
+GT5U.config.preference.mSingleBlockInitialAllowMultiStack=单方块机器的初始多组输入状态
+GT5U.config.preference.mSingleBlockInitialAllowMultiStack.tooltip=放置单方块机器时,是否启用多组输入\n不影响其他人放置的单方块机器\n不影响已存在的单方块机器
+GT5U.config.preference.mSingleBlockInitialFilter=单方块机器的初始输入过滤状态
+GT5U.config.preference.mSingleBlockInitialFilter.tooltip=放置单方块机器时,是否启用输入过滤\n不影响其他人放置的单方块机器\n不影响已存在的单方块机器
+GT5U.config.render=渲染
+GT5U.config.render.GlowTextures=使用发光材质
+GT5U.config.render.RenderDirtParticles=渲染泥土粒子效果
+GT5U.config.render.RenderFlippedMachinesFlipped=对翻转机器使用翻转材质
+GT5U.config.render.RenderIndicatorsOnHatch=渲染仓室输入/输出标志
+GT5U.config.render.RenderPollutionFog=渲染污染雾霾
+GT5U.config.render.TileAmbientOcclusion=启用环境光遮蔽
+GT5U.config.nei=NEI
+GT5U.config.nei.RecipeSecondMode=以秒为单位显示合成表时间(与t相对)
+GT5U.config.nei.RecipeOwner=显示合成表所属模组
+GT5U.config.nei.RecipeOwnerStackTrace=[debug]显示合成表添加的堆栈追踪(stack traces)
+GT5U.config.nei.RecipeOwnerStackTrace.tooltip=[需要重启]
+GT5U.config.nei.OriginalVoltage=超频时显示原始电压
+GT5U.config.waila=Waila
+GT5U.config.waila.WailaTransformerVoltageTier=显示变压器的电压等级
+
+// Cover tabs
+GT5U.interface.coverTabs.down=底
+GT5U.interface.coverTabs.up=顶
+GT5U.interface.coverTabs.north=北
+GT5U.interface.coverTabs.south=南
+GT5U.interface.coverTabs.west=西
+GT5U.interface.coverTabs.east=东
+
+achievement.flintpick=第一把工具
+achievement.flintpick.desc=制造一把燧石镐
+achievement.crops=农业
+achievement.crops.desc=制造农作物
+achievement.havestlead=收获铅
+achievement.havestlead.desc=得到铅叶子
+achievement.havestcopper=收获铜
+achievement.havestcopper.desc=得到铜纤维
+achievement.havesttin=收获锡
+achievement.havesttin.desc=得到锡叶子
+achievement.havestoil=收获石油
+achievement.havestoil.desc=得到石油浆果
+achievement.havestiron=收获铁
+achievement.havestiron.desc=得到铁叶子
+achievement.havestgold=收获金
+achievement.havestgold.desc=得到金叶子
+achievement.havestsilver=收获银
+achievement.havestsilver.desc=得到银叶子
+achievement.havestemeralds=收获绿宝石
+achievement.havestemeralds.desc=得到易如反掌浆果
+achievement.tools=更多的工具
+achievement.tools.desc=制造一把锤子
+achievement.driltime=电钻时间!
+achievement.driltime.desc=制造一把电钻(LV)
+achievement.brrrr=嗡嗡嗡...
+achievement.brrrr.desc=制造一把链锯(LV)
+achievement.highpowerdrill=大功率电钻
+achievement.highpowerdrill.desc=制造一把电钻(HV)
+achievement.hammertime=锤击时间
+achievement.hammertime.desc=制造一把气锤
+achievement.repair=修理
+achievement.repair.desc=制造一台拆解机
+achievement.unitool=万用工具
+achievement.unitool.desc=制造一把万用铲
+achievement.recycling=回收利用
+achievement.recycling.desc=制造一台电弧炉
+achievement.crushed=粉碎
+achievement.crushed.desc=用锤子粉碎矿石
+achievement.cleandust=清洗
+achievement.cleandust.desc=在坩埚里清洗粉末
+achievement.washing=洗涤
+achievement.washing.desc=得到纯净的粉碎矿石
+achievement.spinit=让它转起来
+achievement.spinit.desc=得到离心矿石
+achievement.newfuel=新燃料
+achievement.newfuel.desc=制造一个钍燃料单元
+achievement.newmetal=新的金属
+achievement.newmetal.desc=用钍燃料单元制造镥
+achievement.reflect=反射
+achievement.reflect.desc=制造一块铱中子反射板
+achievement.bronze=青铜
+achievement.bronze.desc=制造青铜粉
+achievement.simplyeco=简单环保
+achievement.simplyeco.desc=制造一台太阳能锅炉
+achievement.firststeam=初始蒸汽
+achievement.firststeam.desc=制造一台青铜锅炉
+achievement.alloysmelter=合金熔炼
+achievement.alloysmelter.desc=制造一台蒸汽合金炉
+achievement.macerator=研磨
+achievement.macerator.desc=制造一台蒸汽研磨机
+achievement.extract=提取
+achievement.extract.desc=制造一台蒸汽提取机
+achievement.smallparts=小部件
+achievement.smallparts.desc=制造真空管
+achievement.gtbasiccircuit=基础电路
+achievement.gtbasiccircuit.desc=制造一个电路板
+achievement.bettercircuits=更好的电路
+achievement.bettercircuits.desc=得到优质
+achievement.stepforward=更进一步
+achievement.stepforward.desc=制造高级电路板
+achievement.gtmonosilicon=单晶硅
+achievement.gtmonosilicon.desc=制造单晶硅
+achievement.gtlogicwafer=逻辑电路晶圆
+achievement.gtlogicwafer.desc=制造一个逻辑电路晶圆
+achievement.gtlogiccircuit=逻辑集成电路
+achievement.gtlogiccircuit.desc=制造一个逻辑集成电路
+achievement.gtcleanroom=超净间
+achievement.gtcleanroom.desc=制造一个超净间控制器
+achievement.gtquantumprocessor=量子处理器
+achievement.gtquantumprocessor.desc=得到量子处理器
+achievement.energyflow=能量流
+achievement.energyflow.desc=得到纳米处理器
+achievement.gtcrystalprocessor=晶体处理器
+achievement.gtcrystalprocessor.desc=得到晶体处理器
+achievement.gtwetware=湿件处理器
+achievement.gtwetware.desc=得到湿件处理器
+achievement.gtwetmain=湿件主机
+achievement.gtwetmain.desc=得到一台湿件主机
+achievement.orbs=宝珠
+achievement.orbs.desc=得到一个兰波顿能量球
+achievement.thatspower=这就是能量
+achievement.thatspower.desc=得到一个兰波顿能量球簇
+achievement.datasaving=数据存储
+achievement.datasaving.desc=得到一个数据球
+achievement.superbuffer=超级缓冲
+achievement.superbuffer.desc=制造一个LV超级缓冲器
+achievement.newstorage=新型存储
+achievement.newstorage.desc=制造一个量子箱
+achievement.whereistheocean=大海在哪里?
+achievement.whereistheocean.desc=制造一个量子缸
+achievement.luck=真幸运
+achievement.luck.desc=在一个丛林神庙找到一个零点模块
+achievement.steel=钢铁
+achievement.steel.desc=在青铜高炉里制作钢铁
+achievement.highpressure=高压
+achievement.highpressure.desc=制造一台高压锅炉
+achievement.extremepressure=超高压
+achievement.extremepressure.desc=启动一台大型锅炉
+achievement.cheapermac=比磨粉机便宜
+achievement.cheapermac.desc=制造一台基础锻造锤
+achievement.complexalloys=复合合金
+achievement.complexalloys.desc=制作一块蓝钢锭
+achievement.magneticiron=磁铁
+achievement.magneticiron.desc=用4个红石制作一根磁铁杆
+achievement.lvmotor=低压马达
+achievement.lvmotor.desc=制造一个电动马达(LV)
+achievement.pumpcover=泵
+achievement.pumpcover.desc=制造一个电动泵(LV)
+achievement.closeit=把它关了!
+achievement.closeit.desc=得到一块扇板
+achievement.slurp=嘶溜嘶溜
+achievement.slurp.desc=制造一台进阶泵 II
+achievement.transport=运输
+achievement.transport.desc=制造一个输送机模块(LV)
+achievement.manipulation=操纵
+achievement.manipulation.desc=制造一个机器控制器
+achievement.buffer=缓存
+achievement.buffer.desc=制造一台LV级缓存器
+achievement.complexmachines=复杂机械
+achievement.complexmachines.desc=制造一个机械臂(LV)
+achievement.avengers=复仇者联盟
+achievement.avengers.desc=制造一台基础组装机
+achievement.filterregulate=过滤和调节
+achievement.filterregulate.desc=得到一个物品过滤器
+achievement.steampower=蒸汽能量
+achievement.steampower.desc=制造一台基础蒸汽轮机
+achievement.batterys=蓄电池
+achievement.batterys.desc=制造一个电池箱
+achievement.badweather=坏天气
+achievement.badweather.desc=忘记在机器上方建屋顶
+achievement.electricproblems=电力问题
+achievement.electricproblems.desc=因为超过电压损失一台机器
+achievement.ebf=电力高炉
+achievement.ebf.desc=制造一台电力高炉
+achievement.energyhatch=你需要三个(要是你没能完全修复它的话)
+achievement.energyhatch.desc=制造一个LV级能源输入舱
+achievement.gtaluminium=铝
+achievement.gtaluminium.desc=制作一块铝锭
+achievement.highpowersmelt=高功率冶炼厂
+achievement.highpowersmelt.desc=制造一台工业熔炉
+achievement.oilplant=石油工厂
+achievement.oilplant.desc=启动一台蒸馏塔
+achievement.factory=工厂
+achievement.factory.desc=制造一台处理阵列
+achievement.upgradeebf=升级你的能量网
+achievement.upgradeebf.desc=制造一个MV级能源输入舱
+achievement.maintainance=维护
+achievement.maintainance.desc=修理一台机器的所有维护问题
+achievement.upgrade=升级你的线圈
+achievement.upgrade.desc=制造一个铁铬铝合金线圈方块
+achievement.titan=钛
+achievement.titan.desc=制造一块钛锭
+achievement.magic=魔法?
+achievement.magic.desc=制造一台新人魔法能源转换器
+achievement.highmage=高阶魔法
+achievement.highmage.desc=制造一台导师魔法能源吸收器
+achievement.artificaldia=人造钻石
+achievement.artificaldia.desc=在聚爆压缩机里制作一颗工业钻石
+achievement.muchsteam=如此多的蒸汽
+achievement.muchsteam.desc=启动一台大型涡轮机
+achievement.efficientsteam=高效蒸汽
+achievement.efficientsteam.desc=在大型涡轮机里使用过热蒸汽
+achievement.upgrade2=升级你的线圈(Lv.2)
+achievement.upgrade2.desc=制造一个镍铬合金线圈方块
+achievement.tungsten=钨
+achievement.tungsten.desc=冷却一块热钨锭
+achievement.osmium=锇
+achievement.osmium.desc=冷却一块热锇锭
+achievement.hightech=高科技
+achievement.hightech.desc=制造一个力场发生器(LV)
+achievement.amplifier=增幅器
+achievement.amplifier.desc=制造一台UU增幅液产生器
+achievement.scanning=扫描
+achievement.scanning.desc=完成一次成分扫描
+achievement.alienpower=外星能量
+achievement.alienpower.desc=制造一台硅岩反应堆Mk.I
+achievement.universal=通用的
+achievement.universal.desc=制造一台质量发生器
+achievement.replication=复制
+achievement.replication.desc=制造一台复制机
+achievement.tungstensteel=钨钢
+achievement.tungstensteel.desc=冷却一块热钨钢锭
+achievement.upgrade3=升级你的线圈(Lv.3)
+achievement.upgrade3.desc=制造一个钨钢线圈方块
+achievement.hssg=HSS-G
+achievement.hssg.desc=冷却一块热高速钢-G锭
+achievement.upgrade4=升级你的线圈(Lv.4)
+achievement.upgrade4.desc=制造一个高速钢-G线圈方块
+achievement.stargatematerial=星际物质
+achievement.stargatematerial.desc=冷却一块热硅岩锭
+achievement.conducting=超导
+achievement.conducting.desc=制造一个超导线圈
+achievement.fusion=聚合
+achievement.fusion.desc=制作氦离子
+achievement.higherefficency=更高的效率
+achievement.higherefficency.desc=制作氮离子
+achievement.advancing=超前
+achievement.advancing.desc=制作铕
+achievement.stargateliquid=液态星际物质
+achievement.stargateliquid.desc=生产硅岩
+achievement.tothelimit=寻求极限
+achievement.tothelimit.desc=制作镅
+achievement.fullefficiency=满负荷效率
+achievement.fullefficiency.desc=制造一台离子发电机Mk.III
+achievement.upgrade5=升级你的线圈(Lv.5)
+achievement.upgrade5.desc=制造一个硅岩线圈方块
+achievement.alienmetallurgy=异星冶金学
+achievement.alienmetallurgy.desc=冷却一块热硅岩合金锭
+achievement.over9000=超过9000!
+achievement.over9000.desc=制造一个硅岩合金线圈方块
+achievement.finalpreparations=最后的准备
+achievement.finalpreparations.desc=冷却一块热超能硅岩锭
+achievement.denseaspossible=尽可能致密
+achievement.denseaspossible.desc=制作中子锭
+achievement.zpmage=能量模块
+achievement.zpmage.desc=制造一个能量模块
+achievement.uvage=能量簇
+achievement.uvage.desc=制造一个能量簇
+achievement.whatnow=接下来呢?
+achievement.whatnow.desc=制作一个终极电池
+
+achievement.gt.metaitem.01.32606=电动马达(LuV)
+achievement.gt.metaitem.01.32606.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32607=电动马达(ZPM)
+achievement.gt.metaitem.01.32607.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32608=电动马达(UV)
+achievement.gt.metaitem.01.32608.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32596=电动马达(UHV)
+achievement.gt.metaitem.01.32596.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32595=电动马达(UEV)
+achievement.gt.metaitem.01.32595.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.metaitem.01.32615=电动泵(LuV)
+achievement.gt.metaitem.01.32615.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32616=电动泵(ZPM)
+achievement.gt.metaitem.01.32616.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32617=电动泵(UV)
+achievement.gt.metaitem.01.32617.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32618=电动泵(UHV)
+achievement.gt.metaitem.01.32618.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32619=电动泵(UEV)
+achievement.gt.metaitem.01.32619.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.metaitem.01.32635=传送带(LuV)
+achievement.gt.metaitem.01.32635.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32636=传送带(ZPM)
+achievement.gt.metaitem.01.32636.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32637=传送带(UV)
+achievement.gt.metaitem.01.32637.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32638=传送带(UHV)
+achievement.gt.metaitem.01.32638.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32639=传送带(UEV)
+achievement.gt.metaitem.01.32639.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.metaitem.01.32645=电动活塞(LuV)
+achievement.gt.metaitem.01.32645.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32646=电动活塞(ZPM)
+achievement.gt.metaitem.01.32646.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32647=电动活塞(UV)
+achievement.gt.metaitem.01.32647.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32648=电动活塞(UHV)
+achievement.gt.metaitem.01.32648.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32649=电动活塞(UEV)
+achievement.gt.metaitem.01.32649.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.metaitem.01.32655=机械臂(LuV)
+achievement.gt.metaitem.01.32655.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32656=机械臂(ZPM)
+achievement.gt.metaitem.01.32656.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32657=机械臂(UV)
+achievement.gt.metaitem.01.32657.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32658=机械臂(UHV)
+achievement.gt.metaitem.01.32658.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32659=机械臂(UEV)
+achievement.gt.metaitem.01.32659.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.metaitem.01.32675=力场发生器tier VI
+achievement.gt.metaitem.01.32675.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32676=力场发生器tier VII
+achievement.gt.metaitem.01.32676.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32677=力场发生器tier VIII
+achievement.gt.metaitem.01.32677.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32678=力场发生器tier IX
+achievement.gt.metaitem.01.32678.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32679=力场发生器tier X
+achievement.gt.metaitem.01.32679.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.metaitem.01.32685=发射器(LuV)
+achievement.gt.metaitem.01.32685.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32686=发射器(ZPM)
+achievement.gt.metaitem.01.32686.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32687=发射器(UV)
+achievement.gt.metaitem.01.32687.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32688=发射器(UHV)
+achievement.gt.metaitem.01.32688.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32689=发射器(UEV)
+achievement.gt.metaitem.01.32689.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.metaitem.01.32695=传感器(LuV)
+achievement.gt.metaitem.01.32695.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32696=传感器(ZPM)
+achievement.gt.metaitem.01.32696.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32697=传感器(UV)
+achievement.gt.metaitem.01.32697.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32698=传感器(UHV)
+achievement.gt.metaitem.01.32698.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32699=传感器(UEV)
+achievement.gt.metaitem.01.32699.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.blockmachines.hatch.energy.tier.06=能源仓(LuV)
+achievement.gt.blockmachines.hatch.energy.tier.06.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.hatch.energy.tier.07=能源仓(ZPM)
+achievement.gt.blockmachines.hatch.energy.tier.07.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.hatch.energy.tier.08=能源仓(UV)
+achievement.gt.blockmachines.hatch.energy.tier.08.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.hatch.energy.tier.09=能源仓(UHV)
+achievement.gt.blockmachines.hatch.energy.tier.09.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.hatch.energy.tier.10=能源仓(UEV)
+achievement.gt.blockmachines.hatch.energy.tier.10.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.hatch.energy.tier.11=能源仓(UIV)
+achievement.gt.blockmachines.hatch.energy.tier.11.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.hatch.energy.tier.12=能源仓(UMV)
+achievement.gt.blockmachines.hatch.energy.tier.12.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.blockmachines.hatch.dynamo.tier.06=动力仓(LuV)
+achievement.gt.blockmachines.hatch.dynamo.tier.06.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.hatch.dynamo.tier.07=动力仓(ZPM)
+achievement.gt.blockmachines.hatch.dynamo.tier.07.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.hatch.dynamo.tier.08=动力仓(UV)
+achievement.gt.blockmachines.hatch.dynamo.tier.08.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.hatch.dynamo.tier.09=动力仓(UHV)
+achievement.gt.blockmachines.hatch.dynamo.tier.09.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.hatch.dynamo.tier.10=动力仓(UEV)
+achievement.gt.blockmachines.hatch.dynamo.tier.10.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.hatch.dynamo.tier.11=动力仓(UIV)
+achievement.gt.blockmachines.hatch.dynamo.tier.11.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.hatch.dynamo.tier.12=动力仓(UMV)
+achievement.gt.blockmachines.hatch.dynamo.tier.12.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.blockmachines.fusioncomputer.tier.06=核聚变反应堆控制电脑Mk I
+achievement.gt.blockmachines.fusioncomputer.tier.06.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.fusioncomputer.tier.07=核聚变反应堆控制电脑Mk II
+achievement.gt.blockmachines.fusioncomputer.tier.07.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.fusioncomputer.tier.08=核聚变反应堆控制电脑Mk III
+achievement.gt.blockmachines.fusioncomputer.tier.08.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.metaitem.03.32072=神经元处理器
+achievement.gt.metaitem.03.32077.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.03.32077=生物处理器
+achievement.gt.metaitem.03.32072.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.03.32095=湿件主机
+achievement.gt.metaitem.03.32095.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.03.32099=生物处理器超级电脑
+achievement.gt.metaitem.03.32099.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.03.32120=生物主机
+achievement.gt.metaitem.03.32120.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.item.NanoCircuit=纳米电路
+achievement.item.NanoCircuit.desc=捡起此物品以在NEI内解锁该合成表
+achievement.item.PikoCircuit=Piko电路
+achievement.item.PikoCircuit.desc=捡起此物品以在NEI内解锁该合成表
+achievement.item.QuantumCircuit=量子电路
+achievement.item.QuantumCircuit.desc=捡起此物品以在NEI内解锁该合成表
+achievement.item.relocator=定位器
+achievement.item.relocator.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.blockmachines.multimachine.em.computer=量子计算机
+achievement.gt.blockmachines.multimachine.em.computer.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.multimachine.em.research=研究站
+achievement.gt.blockmachines.multimachine.em.research.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.multimachine.em.junction=粒子流枢纽
+achievement.gt.blockmachines.multimachine.em.junction.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.multimachine.em.mattertoem=物质量子化仪
+achievement.gt.blockmachines.multimachine.em.mattertoem.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.multimachine.em.emtomatter=物质反量子化仪
+achievement.gt.blockmachines.multimachine.em.emtomatter.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.multimachine.em.essentiatoem=源质量子化仪
+achievement.gt.blockmachines.multimachine.em.essentiatoem.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.multimachine.em.emtoessentia=源质反量子化仪
+achievement.gt.blockmachines.multimachine.em.emtoessentia.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.multimachine.em.scanner=元物质扫描仪
+achievement.gt.blockmachines.multimachine.em.scanner.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.multimachine.em.databank=数据库
+achievement.gt.blockmachines.multimachine.em.databank.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockcasingsTT.8=中空机械方块
+achievement.gt.blockcasingsTT.8.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockcasingsTT.7=分子线圈
+achievement.gt.blockcasingsTT.7.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockcasings.12=超维度机械方块
+achievement.gt.blockcasings.12.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockcasings.13=维度注入机械方块
+achievement.gt.blockcasings.13.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockcasings.14=维度桥接方块
+achievement.gt.blockcasings.14.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.multimachine.plasmaforge=超维度等离子锻炉
+achievement.gt.blockmachines.multimachine.plasmaforge.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockcasings5.11=无尽线圈
+achievement.gt.blockcasings5.11.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockcasings5.12=海珀珍线圈
+achievement.gt.blockcasings5.12.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockcasings5.13=永恒线圈
+achievement.gt.blockcasings5.13.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.blockmachines.wireless.receiver.tier.00=ULV无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.00.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.01=LV无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.01.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.02=MV无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.02.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.03=HV无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.03.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.04=EV无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.04.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.05=IV无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.05.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.06=LuV无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.06.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.07=ZPM无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.07.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.08=UV无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.08.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.09=UHV无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.09.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.10=UEV无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.10.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.11=UIV无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.11.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.12=UMV无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.12.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.13=UXV无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.13.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.receiver.tier.14=MAX无线能源仓
+achievement.gt.blockmachines.wireless.receiver.tier.14.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.blockmachines.wireless.transmitter.tier.00=ULV无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.00.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.01=LV无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.01.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.02=MV无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.02.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.03=HV无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.03.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.04=EV无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.04.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.05=IV无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.05.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.06=LuV无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.06.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.07=ZPM无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.07.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.08=UV无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.08.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.09=UHV无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.09.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.10=UEV无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.10.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.11=UIV无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.11.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.12=UMV无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.12.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.13=UXV无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.13.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.wireless.transmitter.tier.14=MAX无线动力仓
+achievement.gt.blockmachines.wireless.transmitter.tier.14.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.blockmachines.multimachine.em.infuser=能量注入仪
+achievement.gt.blockmachines.multimachine.em.infuser.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.blockmachines.hatch.holder.tier.09=物品固定容器
+achievement.gt.blockmachines.hatch.holder.tier.09.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.item.StargateShieldingFoil=星门辐射防护板
+achievement.item.StargateShieldingFoil.desc=捡起此物品以在NEI内解锁该合成表
+achievement.item.StargateChevron=星门三角部件
+achievement.item.StargateChevron.desc=捡起此物品以在NEI内解锁该合成表
+achievement.item.StargateFramePart=星门框架部件
+achievement.item.StargateFramePart.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.metaitem.01.32605=终极电池
+achievement.gt.metaitem.01.32605.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32609=真·终极电池
+achievement.gt.metaitem.01.32609.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32736=能量模块
+achievement.gt.metaitem.01.32736.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32737=能量簇
+achievement.gt.metaitem.01.32737.desc=捡起此物品以在NEI内解锁该合成表
+achievement.gt.metaitem.01.32599=兰波顿能量球簇
+achievement.gt.metaitem.01.32599.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.ic2.itemArmorQuantumHelmet=量子头盔
+achievement.ic2.itemArmorQuantumHelmet.desc=捡起此物品以在NEI内解锁该合成表
+achievement.ic2.itemArmorQuantumChestplate=量子胸甲
+achievement.ic2.itemArmorQuantumChestplate.desc=捡起此物品以在NEI内解锁该合成表
+achievement.ic2.itemArmorQuantumLegs=量子护腿
+achievement.ic2.itemArmorQuantumLegs.desc=捡起此物品以在NEI内解锁该合成表
+achievement.ic2.itemArmorQuantumBoots=量子靴
+achievement.ic2.itemArmorQuantumBoots.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.item.graviChestPlate=重力胸甲
+achievement.item.graviChestPlate.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.blockreinforced.12=漆黑之门粗胚
+achievement.gt.blockreinforced.12.desc=捡起此物品以在NEI内解锁该合成表
+
+achievement.gt.blockmachines.debug.tt.maintenance=Debug维护仓
+achievement.gt.blockmachines.debug.tt.maintenance.desc=捡起此物品以在NEI内解锁该合成表
+
+for.bees.species.clay=粘土
+for.bees.species.slimeball=粘液球
+for.bees.species.peat=泥炭
+for.bees.species.stickyresin=粘性树脂
+for.bees.species.coal=煤
+for.bees.species.oil=石油
+for.bees.species.apatite=磷灰石
+for.bees.species.ash=灰烬
+for.bees.species.fertilizer=肥料
+for.bees.species.sandwich=三明治
+for.bees.species.coolant=冷却液
+for.bees.species.energy=能量
+for.bees.species.pyrotheum=烈焰之炽焱
+for.bees.species.cryotheum=极寒之凛冰
+for.bees.species.lapotron=兰波顿
+for.bees.species.redalloy=红色合金
+for.bees.species.redstonealloy=红石合金
+for.bees.species.conductiveiron=导电铁
+for.bees.species.vibrantalloy=脉冲合金
+for.bees.species.energeticalloy=充能合金
+for.bees.species.electricalsteel=磁钢
+for.bees.species.darksteel=玄钢
+for.bees.species.pulsatingiron=脉冲铁
+for.bees.species.stainlesssteel=不锈钢
+for.bees.species.enderium=末影(te)
+for.bees.species.thaumiumdust=神秘尘
+for.bees.species.thaumiumshard=神秘碎片
+for.bees.species.amber=琥珀
+for.bees.species.quicksilver=水银
+for.bees.species.salismundus=世界盐
+for.bees.species.tainted=腐化
+for.bees.species.mithril=秘银
+for.bees.species.astralsilver=星辰银
+for.bees.species.thauminite=秘晶
+for.bees.species.shadowmetal=暗影金属
+for.bees.species.divided=不稳定金属
+for.bees.species.sparkeling=凋灵
+for.bees.species.redstone=红石
+for.bees.species.certus=赛特斯
+for.bees.species.fluix=福鲁伊克斯
+for.bees.species.ruby=红宝石
+for.bees.species.lapis=青金石
+for.bees.species.sapphire=蓝宝石
+for.bees.species.diamond=钻石
+for.bees.species.olivine=橄榄石
+for.bees.species.emerald=绿宝石
+for.bees.species.redgarnet=红石榴石
+for.bees.species.yellowgarnet=黄石榴石
+for.bees.species.firestone=火石
+for.bees.species.copper=铜
+for.bees.species.tin=锡
+for.bees.species.lead=铅
+for.bees.species.iron=铁
+for.bees.species.steel=钢铁
+for.bees.species.nickel=镍
+for.bees.species.zinc=锌
+for.bees.species.silver=银
+for.bees.species.cryolite=冰晶石
+for.bees.species.gold=金
+for.bees.species.sulfur=硫
+for.bees.species.gallium=镓
+for.bees.species.arsenic=砷
+for.bees.species.bauxite=铝土
+for.bees.species.aluminium=铝
+for.bees.species.titanium=钛
+for.bees.species.chrome=铬
+for.bees.species.manganese=锰
+for.bees.species.tungsten=钨
+for.bees.species.platinum=铂
+for.bees.species.iridium=铱
+for.bees.species.osmium=锇
+for.bees.species.lithium=锂
+for.bees.species.salty=盐
+for.bees.species.electrotine=蓝石
+for.bees.species.uranium=铀
+for.bees.species.plutonium=钚
+for.bees.species.naquadah=硅岩
+for.bees.species.naquadria=超能硅岩
+for.bees.species.dob=魔晶
+for.bees.species.thorium=钍
+for.bees.species.lutetium=镥
+for.bees.species.americium=镅
+for.bees.species.neutronium=中子素
+for.bees.species.naga=娜迦
+for.bees.species.lich=巫妖
+for.bees.species.hydra=九头蛇
+for.bees.species.urghast=暮色恶魂
+for.bees.species.snowqueen=冰雪女王
+for.bees.species.space=宇宙
+for.bees.species.meteoriciron=陨铁
+for.bees.species.desh=戴斯
+for.bees.species.ledox=深铅
+for.bees.species.callistoice=木卫四冰
+for.bees.species.mytryl=深空秘银
+for.bees.species.quantium=量子
+for.bees.species.oriharukon=山铜
+for.bees.species.mysteriouscrystal=神秘水晶
+for.bees.species.blackplutonium=黑钚
+for.bees.species.trinium=三元金属
+for.bees.species.mercury=水星
+for.bees.species.venus=金星
+for.bees.species.moon=月球
+for.bees.species.mars=火星
+for.bees.species.phobos=火卫一
+for.bees.species.deimos=火卫二
+for.bees.species.ceres=谷神星
+for.bees.species.jupiter=木星
+for.bees.species.io=木卫一
+for.bees.species.europa=木卫二
+for.bees.species.ganymede=木卫三
+for.bees.species.callisto=木卫四
+for.bees.species.saturn=土星
+for.bees.species.enceladus=土卫二
+for.bees.species.titan=土卫六
+for.bees.species.uranus=天王星
+for.bees.species.miranda=天卫五
+for.bees.species.oberon=天卫四
+for.bees.species.neptune=海王星
+for.bees.species.proteus=海卫八
+for.bees.species.triton=海卫一
+for.bees.species.pluto=冥王星
+for.bees.species.haumea=妊神星
+for.bees.species.makemake=鸟神星
+for.bees.species.centauri=半人马
+for.bees.species.acentauri=半人马a
+for.bees.species.tceti=鲸鱼座T星
+for.bees.species.tcetie=鲸鱼座T星E
+for.bees.species.barnarda=巴纳德
+for.bees.species.barnardac=巴纳德C
+for.bees.species.barnardae=巴纳德E
+for.bees.species.barnardaf=巴纳德F
+for.bees.species.vega=织女座
+for.bees.species.vegab=织女B
+for.bees.species.cosmicneutronium=宇宙中子态素
+for.bees.species.infinitycatalyst=无尽催化剂
+for.bees.species.infinity=无尽
+for.bees.species.enddust=末影粉末
+for.bees.species.stardust=星尘
+for.bees.species.ectoplasma=外质
+for.bees.species.arcaneshard=奥术碎片
+for.bees.species.dragonessence=龙之精华
+for.bees.species.enderman=末影人
+for.bees.species.silverfish=蠹虫
+
+for.mutation.condition.biomeid=需要生物群系
+for.mutation.condition.dim=需要维度(世界)
+
+itemGroup.GTtools=GT预构工具
+
+gregtech.fertilitySterile=不育
+gregtech.fertilityMultiply=繁殖
+gregtech.floweringNonpollinating=不授粉
+gregtech.floweringNaturalistic=顺其自然
+gregtech.areaLethargic=摸鱼
+gregtech.areaExploratory=探索
+gregtech.speedUnproductive=不生产
+gregtech.speedAccelerated=加速
+gregtech.lifeBlink=瞬灭
+gregtech.lifeEon=永生
+
+entity.gregtech.GT_Entity_Arrow.name=GT箭头
+
+fluid.Xenon=氙气
+fluid.FermentedBacterialSludge=发酵的细菌污泥
+fluid.NitricAcid=硝酸
+fluid.EnrichedBacterialSludge=放射性细菌污泥
+fluid.Ammonia=氨气
+fluid.Neon=氖气
+fluid.Oganesson=鿫
+fluid.Aqua Regia=王水
+fluid.Ammonium Chloride=氯化铵
+fluid.Platinum Concentrate=浓缩铂
+fluid.Sodium Formate=甲酸钠
+fluid.Formic Acid=甲酸
+fluid.Palladium Enriched Ammonia=富钯氨
+fluid.Ruthenium Tetroxide=四氧化钌
+fluid.Hot Ruthenium Tetroxide Solution=热四氧化钌溶液
+fluid.Ruthenium Tetroxide Solution=四氧化钌溶液
+fluid.Rhodium Sulfate=硫酸铑
+fluid.Rhodium Sulfate Solution=硫酸铑溶液
+fluid.Calcium Chloride=氯化钙
+fluid.Acidic Osmium Solution=酸性锇溶液
+fluid.Osmium Solution=锇溶液
+fluid.Acidic Iridium Solution=酸性铱溶液
+fluid.Rhodium Salt Solution=铑盐溶液
+fluid.Rhodium Filter Cake Solution=铑滤饼溶液
+fluid.Pollution=污染物
+fluid.SodiumPotassium=钠钾共晶合金(NaK)
+fluid.Concrete=混凝土
+fluid.mushroomStew=蘑菇煲
+
+fluid.Sodium Tungstate=钨酸钠
+fluid.Phosgene=碳酰氯
+fluid.Ethyl Chloroformate=氯基甲酸乙酯
+fluid.Ethyl Carbamate=氨基甲酸乙酯
+fluid.Ethyl N-nitrocarbamate=N-硝氨基甲酸乙酯
+fluid.Ammonium N-nitrourethane=N-硝氨基甲酸乙酯-铵
+fluid.Trinitramid=三硝基胺
+fluid.Ammonia Boronfluoride Solution=氟化硼氨溶液
+fluid.Sodium Tetrafluoroborate=氟硼酸钠
+fluid.Tetrafluoroborate=氟硼酸
+fluid.Ethyl Acetate=乙酸乙酯
+fluid.Acetylhydrazine=乙酰肼
+fluid.Unsymmetrical Dimethylhydrazine=偏二甲肼
+fluid.Monomethylhydrazine Fuel Mix=一甲基肼混合燃料
+fluid.Unsymmetrical Dimethylhydrazine Fuel Mix=偏二甲肼混合燃料
+fluid.Boron Trifluoride=三氟化硼
+fluid.Tert-Butylbenzene=叔丁基苯
+fluid.2-tert-butyl-anthraquinone=2-叔丁基蒽醌
+fluid.2-tert-butyl-anthrahydroquinone=2-叔丁基蒽氢醌
+fluid.Hydrogen Peroxide=过氧化氢
+fluid.hydrazine=肼
+fluid.Dimethyl Sulfate=硫酸二甲酯
+fluid.Ethyl Dinitrocarbamate=二硝氨基甲酸乙酯
+fluid.Ammonium Dinitramide=二硝酰胺铵
+fluid.LMP-103S=LMP-103S
+fluid.Nitromethane=硝基甲烷
+fluid.O-Xylene=1,2-二甲苯
+//GT_MetaGenerated_Item_98 cells
+fluid.UnknownNutrientAgar=未知营养琼脂
+fluid.SeaweedBroth=海藻基质
+fluid.EnzymesSollution=酶溶液
+fluid.escherichiakolifluid=大肠杆菌液体
+fluid.Penicillin=青霉素
+fluid.FluorecentdDNA=荧光DNA
+fluid.Polymerase=聚合酶
+//No cell, most from bart bio
+fluid.Monomethylhydrazine=一甲基肼
+fluid.binnibacteriafluid=双杆菌液体
+fluid.barnadafisarboriatorisfluid=巴纳德乔木培养液
+fluid.GelatinMixture=明胶混合物
+fluid.sludge=菌泥
+fluid.Formaldehyde=甲醛
+fluid.tcetieisfucusserratusfluid=鲸鱼座T星藻类培养液
+fluid.MeatExtract=肉汁
+//No recipe
+fluid.CompressedOxygen=压缩氧气
+fluid.CompressedNitrogen=压缩氮气
+fluid.redplasma=红等离子体
+fluid.tile.fluidBlockSludge=污泥
+//No Textrue
+fluid.guano=鸟粪
+fluid.poo=便便
+fluid.sewerage=下水
+fluid.fuelgc=GC燃油
+fluid.dirtywater=污水
+fluid.oilgc=GC石油
diff --git a/src/main/resources/assets/gregtech/sounds.json b/src/main/resources/assets/gregtech/sounds.json
new file mode 100644
index 0000000000..95d534b7cd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/sounds.json
@@ -0,0 +1,47 @@
+{
+ "gui.buttonDown": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "buttonDown",
+ "stream": false
+ }
+ ]
+ },
+ "gui.buttonUp": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "buttonUp",
+ "stream": false
+ }
+ ]
+ },
+ "machines.FusionLoop": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "FusionLoop",
+ "stream": false
+ }
+ ]
+ },
+ "machines.DistilleryLoop": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "DistilleryLoop",
+ "stream": false
+ }
+ ]
+ },
+ "machines.PlasmaForgeLoop": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "PlasmaForgeLoop",
+ "stream": false
+ }
+ ]
+ }
+}
diff --git a/src/main/resources/assets/gregtech/sounds/DistilleryLoop.ogg b/src/main/resources/assets/gregtech/sounds/DistilleryLoop.ogg
new file mode 100644
index 0000000000..20ffd49c82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/sounds/DistilleryLoop.ogg
Binary files differ
diff --git a/src/main/resources/assets/gregtech/sounds/FusionLoop.ogg b/src/main/resources/assets/gregtech/sounds/FusionLoop.ogg
new file mode 100644
index 0000000000..d532f1a083
--- /dev/null
+++ b/src/main/resources/assets/gregtech/sounds/FusionLoop.ogg
Binary files differ
diff --git a/src/main/resources/assets/gregtech/sounds/PlasmaForgeLoop.ogg b/src/main/resources/assets/gregtech/sounds/PlasmaForgeLoop.ogg
new file mode 100644
index 0000000000..e9b7a2bdba
--- /dev/null
+++ b/src/main/resources/assets/gregtech/sounds/PlasmaForgeLoop.ogg
Binary files differ
diff --git a/src/main/resources/assets/gregtech/sounds/buttonDown.ogg b/src/main/resources/assets/gregtech/sounds/buttonDown.ogg
new file mode 100644
index 0000000000..d7dec32263
--- /dev/null
+++ b/src/main/resources/assets/gregtech/sounds/buttonDown.ogg
Binary files differ
diff --git a/src/main/resources/assets/gregtech/sounds/buttonUp.ogg b/src/main/resources/assets/gregtech/sounds/buttonUp.ogg
new file mode 100644
index 0000000000..9d498d6b74
--- /dev/null
+++ b/src/main/resources/assets/gregtech/sounds/buttonUp.ogg
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/BrainTechCape.png b/src/main/resources/assets/gregtech/textures/BrainTechCape.png
new file mode 100644
index 0000000000..5fa5744f11
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/BrainTechCape.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/DevCape.png b/src/main/resources/assets/gregtech/textures/DevCape.png
new file mode 100644
index 0000000000..3f3386f7e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/DevCape.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/DonorCape.png b/src/main/resources/assets/gregtech/textures/DonorCape.png
new file mode 100644
index 0000000000..0f4a9ee0c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/DonorCape.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/GregTechCape.png b/src/main/resources/assets/gregtech/textures/GregTechCape.png
new file mode 100644
index 0000000000..a8318e3627
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/GregTechCape.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/GregoriusCape.png b/src/main/resources/assets/gregtech/textures/GregoriusCape.png
new file mode 100644
index 0000000000..d1fa72b105
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/GregoriusCape.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/LogoGTI_Long.png b/src/main/resources/assets/gregtech/textures/LogoGTI_Long.png
new file mode 100644
index 0000000000..bb0b3d7b0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/LogoGTI_Long.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/MrBrainCape.png b/src/main/resources/assets/gregtech/textures/MrBrainCape.png
new file mode 100644
index 0000000000..8385944815
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/MrBrainCape.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/Neutronium.png b/src/main/resources/assets/gregtech/textures/Neutronium.png
new file mode 100644
index 0000000000..f45372d08f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/Neutronium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/Stargate.png b/src/main/resources/assets/gregtech/textures/Stargate.png
new file mode 100644
index 0000000000..ce8a008a60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/Stargate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/Steam.png b/src/main/resources/assets/gregtech/textures/Steam.png
new file mode 100644
index 0000000000..82bb9c6ebb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/Steam.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/Titanium.png b/src/main/resources/assets/gregtech/textures/Titanium.png
new file mode 100644
index 0000000000..ce457d56b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/Titanium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/aspects/ELECTRUM.png b/src/main/resources/assets/gregtech/textures/aspects/ELECTRUM.png
new file mode 100644
index 0000000000..1e5d096f42
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/aspects/ELECTRUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/aspects/MAGNETO.png b/src/main/resources/assets/gregtech/textures/aspects/MAGNETO.png
new file mode 100644
index 0000000000..d08a94d211
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/aspects/MAGNETO.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/aspects/NEBRISUM.png b/src/main/resources/assets/gregtech/textures/aspects/NEBRISUM.png
new file mode 100644
index 0000000000..280b7b071a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/aspects/NEBRISUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/aspects/RADIO.png b/src/main/resources/assets/gregtech/textures/aspects/RADIO.png
new file mode 100644
index 0000000000..559a540dcd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/aspects/RADIO.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/aspects/STRONTIO.png b/src/main/resources/assets/gregtech/textures/aspects/STRONTIO.png
new file mode 100644
index 0000000000..771d34a0b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/aspects/STRONTIO.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..52bdd1bb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..71d4cd5a84
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..6d723bc760
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/alloy_smelter/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..fc58e56a99
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..7511c4c755
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/amplifab/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..305bbb6041
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..6f36f18c92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..ccf6ed02e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..a706f979d5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..454383830e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..9339ebee07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..964aae37ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..454383830e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/arc_furnace/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP.png
new file mode 100644
index 0000000000..3d2b82fb97
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..d955d16e4a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..f974169ac5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/assembler/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..2241d15b2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..ff55ae5320
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..c574310ee0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..3b4f8e9581
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP.png
new file mode 100644
index 0000000000..f27c4dd272
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..7ba6b78ab5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..1334d21dc1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..afcd453b23
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/autoclave/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..e8808026f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..ed7d4c2069
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/bender/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..55aba3110e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..7922c093aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/canner/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..bc131aea0b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..038ee29744
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..24919097b8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..c1a8b05cba
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP.png
new file mode 100644
index 0000000000..5e80eca332
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..6b3584c7fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/centrifuge/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..f9b78615ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..a87d309908
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..11d8fffb7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..59b8800aa1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..818660f723
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..7b099a6361
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_bath/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..1cdb408d1c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..1b4343c385
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..ac4c5c66db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/chemical_reactor/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP.png
new file mode 100644
index 0000000000..3d2b82fb97
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..d955d16e4a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..f974169ac5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/circuitassembler/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..fcf3b8414a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..9004d79a03
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..8188d77473
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..ad645efc82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP.png
new file mode 100644
index 0000000000..37d7ba54fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..e12725c60d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/compressor/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..39a309f0ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..89f5c43a2d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/cutter/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..27d5da027d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..4f149b7ffb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a7b2675234
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..b519b00da7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..c30db14ada
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..6c073d762d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/distillery/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..d699b66f7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..1b2b1e3456
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..d9aecdfa65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_furnace/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..fe04654080
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..7cc9eb313d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..4a72253c34
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP.png
new file mode 100644
index 0000000000..9af77e4adf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..45ee3dc04d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..99f99b59cd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electric_oven/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..6d782ba43b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..bbe1770f96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..157aee444f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..9ae0e2186e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..42e36ad151
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..157aee444f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electrolyzer/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..3a110a697c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..9de4439023
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..26bb55e207
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..9486291833
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..26bb55e207
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP.png
new file mode 100644
index 0000000000..5643372c28
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..9a31bc6eb8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..25c650c0e7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/electromagnetic_separator/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..ddebe0341d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..6c015ee919
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..3b8966a098
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..9f998f6456
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP.png
new file mode 100644
index 0000000000..3ecda894d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..17e74ca801
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extractor/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..591c61b777
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..9bdaa94d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..886d345f68
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/extruder/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..27d5da027d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..d31ef5e9a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a7b2675234
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..b519b00da7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..c30db14ada
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..545bf7f140
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fermenter/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..14bd02c0df
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..b67f6c04f3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..c591bd30c8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..8d500590bc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_canner/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..256b3c24e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..b5034ee7b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..9afeaf4395
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..aec3b21267
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP.png
new file mode 100644
index 0000000000..3ecda894d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..17e74ca801
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_extractor/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..256b3c24e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..6580014b58
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..9afeaf4395
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..d997a986df
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP.png
new file mode 100644
index 0000000000..3ecda894d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..71c2eb1668
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_heater/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..599aea1dc4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..97b9fcfa75
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..99d60b554e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/fluid_solidifier/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..7bd2218231
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..13c81e1892
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/hammer/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..dd2ed7633d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..d68eccd406
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..26bb55e207
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..f45058ec9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..26bb55e207
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/laser_engraver/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..37e5fbaa59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..0fc034b292
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/lathe/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..1de430e459
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..8ee256fa56
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP.png
new file mode 100644
index 0000000000..d9855c3e75
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..7e43f436a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..1ec644560f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..7e43f436a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..1ec644560f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/macerator/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..f090fc04ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..b18cca86b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..590a0e1606
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/microwave/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP.png
new file mode 100644
index 0000000000..d9855c3e75
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..7e43f436a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..1ec644560f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..7e43f436a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..1ec644560f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/miner/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..4cd0353edb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..2daad32e24
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..6ae5665b4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..af738c194d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP.png
new file mode 100644
index 0000000000..4d6dec42f1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..40d0ee17e3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/mixer/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..0b48c034e4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..52d8d3de43
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..59b8800aa1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..f9d504c4b8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/ore_washer/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..305bbb6041
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..6f36f18c92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..ccf6ed02e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..567923e9cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..d24aaadbfc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..9339ebee07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..57a3b8d294
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..d24aaadbfc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/plasma_arc_furnace/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP.png
new file mode 100644
index 0000000000..91dcf48c03
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..6052b777ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a5e5951568
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/polarizer/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..93a8886d4e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..458e1a9873
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..8188d77473
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..ad645efc82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP.png
new file mode 100644
index 0000000000..37d7ba54fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..e12725c60d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/press/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..2eb6b4ab72
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..1d492b36f1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/printer/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..b4e7fab714
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..5d57a7cd3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP.png
new file mode 100644
index 0000000000..d9855c3e75
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..7e43f436a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..1ec644560f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..7e43f436a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..1ec644560f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pulverizer/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..962a52c203
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..962a52c203
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP.png
new file mode 100644
index 0000000000..3ecda894d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..71c2eb1668
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/pump/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..6591226c2c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..36b7f7ba7f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..f028d486ec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..6fb07a2f8f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP.png
new file mode 100644
index 0000000000..271f5220c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..2e03cd2f81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/recycler/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..9f22a83a00
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..efad3d3800
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP.png
new file mode 100644
index 0000000000..b9616188f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..4d37b65739
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..bf9d3ea5f7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/sifter/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..a4ffbadc3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..df48a560a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/slicer/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..f86667a891
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..48817e2f40
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..fdb5b1cb26
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..b74b4d05c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/thermal_centrifuge/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..06eb7d6066
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..90ee9766bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..99d60b554e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/tool_cast/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..6a418f73fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..f8ce8ce51e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/unboxinator/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP.png
new file mode 100644
index 0000000000..1205a2a0d4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP_ACTIVE.png
new file mode 100644
index 0000000000..6684bbd7b8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/basicmachines/wiremill/OVERLAY_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.air.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.air.png
new file mode 100644
index 0000000000..4347ad8904
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.air.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.air.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.air.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.air.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.png
new file mode 100644
index 0000000000..25580dd223
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.argon.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.autogenerated.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.autogenerated.png
new file mode 100644
index 0000000000..8c41efd32a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.autogenerated.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.autogenerated.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.autogenerated.png.mcmeta
new file mode 100644
index 0000000000..7e77c64858
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.autogenerated.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.berylium.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.berylium.png
new file mode 100644
index 0000000000..a015e25f9c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.berylium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.berylium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.berylium.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.berylium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.bioethanol.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.bioethanol.png
new file mode 100644
index 0000000000..660cf8e8d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.bioethanol.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.bioethanol.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.bioethanol.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.bioethanol.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.biomass.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.biomass.png
new file mode 100644
index 0000000000..25580dd223
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.biomass.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.biomass.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.biomass.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.biomass.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calcium.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calcium.png
new file mode 100644
index 0000000000..edb398b1f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calcium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calcium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calcium.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calcium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calciumcarbonate.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calciumcarbonate.png
new file mode 100644
index 0000000000..93d5f639ba
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calciumcarbonate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calciumcarbonate.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calciumcarbonate.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.calciumcarbonate.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.chlorine.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.chlorine.png
new file mode 100644
index 0000000000..1d5515cba4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.chlorine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.chlorine.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.chlorine.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.chlorine.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.creosote.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.creosote.png
new file mode 100644
index 0000000000..f8043c95dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.creosote.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.creosote.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.creosote.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.creosote.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.deuterium.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.deuterium.png
new file mode 100644
index 0000000000..1c138afd68
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.deuterium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.deuterium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.deuterium.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.deuterium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dimensionallytranscendentresidue.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dimensionallytranscendentresidue.png
new file mode 100644
index 0000000000..ef55f718c4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dimensionallytranscendentresidue.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dimensionallytranscendentresidue.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dimensionallytranscendentresidue.png.mcmeta
new file mode 100644
index 0000000000..b84e69f2c5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dimensionallytranscendentresidue.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dyes.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dyes.png
new file mode 100644
index 0000000000..d3cacf0304
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dyes.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dyes.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dyes.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.dyes.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtcc.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtcc.png
new file mode 100644
index 0000000000..3b77e1410c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtcc.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtcc.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtcc.png.mcmeta
new file mode 100644
index 0000000000..b84e69f2c5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtcc.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtec.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtec.png
new file mode 100644
index 0000000000..3b77e1410c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtec.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtec.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtec.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtec.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtpc.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtpc.png
new file mode 100644
index 0000000000..3b77e1410c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtpc.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtpc.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtpc.png.mcmeta
new file mode 100644
index 0000000000..8e55e43baf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtpc.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 3
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtrc.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtrc.png
new file mode 100644
index 0000000000..3b77e1410c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtrc.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtrc.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtrc.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtrc.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtsc.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtsc.png
new file mode 100644
index 0000000000..5b14154959
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtsc.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtsc.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtsc.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.exciteddtsc.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fieryblood.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fieryblood.png
new file mode 100644
index 0000000000..6f53246bbc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fieryblood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fieryblood.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fieryblood.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fieryblood.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fishoil.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fishoil.png
new file mode 100644
index 0000000000..073824fcfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fishoil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fishoil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fishoil.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fishoil.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fluorine.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fluorine.png
new file mode 100644
index 0000000000..4ad6bd2730
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fluorine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fluorine.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fluorine.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fluorine.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.for.honey.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.for.honey.png
new file mode 100644
index 0000000000..84c8cf438c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.for.honey.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.for.honey.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.for.honey.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.for.honey.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fuel.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fuel.png
new file mode 100644
index 0000000000..cb8046d902
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fuel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fuel.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fuel.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.fuel.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_gas.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_gas.png
new file mode 100644
index 0000000000..233748fd6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_gas.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_gas.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_gas.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_gas.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_natural_gas.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_natural_gas.png
new file mode 100644
index 0000000000..233748fd6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_natural_gas.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_natural_gas.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_natural_gas.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_natural_gas.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_sulfuricgas.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_sulfuricgas.png
new file mode 100644
index 0000000000..233748fd6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_sulfuricgas.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_sulfuricgas.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_sulfuricgas.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.gas_sulfuricgas.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.glyceryl.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.glyceryl.png
new file mode 100644
index 0000000000..f61d626a6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.glyceryl.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.glyceryl.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.glyceryl.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.glyceryl.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium-3.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium-3.png
new file mode 100644
index 0000000000..a00095bbf4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium-3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium-3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium-3.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium-3.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium.png
new file mode 100644
index 0000000000..a00095bbf4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.helium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.heliumplasma.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.heliumplasma.png
new file mode 100644
index 0000000000..1997c00728
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.heliumplasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.heliumplasma.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.heliumplasma.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.heliumplasma.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.holywater.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.holywater.png
new file mode 100644
index 0000000000..d8eacc2e1b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.holywater.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.holywater.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.holywater.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.holywater.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hotfryingoil.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hotfryingoil.png
new file mode 100644
index 0000000000..a488350c61
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hotfryingoil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hotfryingoil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hotfryingoil.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hotfryingoil.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrochloricacid.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrochloricacid.png
new file mode 100644
index 0000000000..8af735fa5c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrochloricacid.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrochloricacid.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrochloricacid.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrochloricacid.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrogen.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrogen.png
new file mode 100644
index 0000000000..18bf896337
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrogen.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrogen.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrogen.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.hydrogen.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.ice.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.ice.png
new file mode 100644
index 0000000000..c1b5a71e3a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.ice.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.ice.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.ice.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.ice.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indigo.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indigo.png
new file mode 100644
index 0000000000..9959b6074b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indigo.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indigo.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indigo.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indigo.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indiumconcentrate.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indiumconcentrate.png
new file mode 100644
index 0000000000..35326eb1b1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indiumconcentrate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indiumconcentrate.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indiumconcentrate.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.indiumconcentrate.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.iron3chloride.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.iron3chloride.png
new file mode 100644
index 0000000000..f19ec779be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.iron3chloride.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.iron3chloride.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.iron3chloride.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.iron3chloride.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.leadzincsolution.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.leadzincsolution.png
new file mode 100644
index 0000000000..a0dc4ad12a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.leadzincsolution.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.leadzincsolution.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.leadzincsolution.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.leadzincsolution.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lifeessence.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lifeessence.png
new file mode 100644
index 0000000000..369fa165e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lifeessence.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lifeessence.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lifeessence.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lifeessence.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_heavy_fuel.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_heavy_fuel.png
new file mode 100644
index 0000000000..5bbb503aa2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_heavy_fuel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_heavy_fuel.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_heavy_fuel.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_heavy_fuel.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_light_fuel.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_light_fuel.png
new file mode 100644
index 0000000000..cb8046d902
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_light_fuel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_light_fuel.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_light_fuel.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_cracked_light_fuel.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_drillingfluid.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_drillingfluid.png
new file mode 100644
index 0000000000..5bbb503aa2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_drillingfluid.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_drillingfluid.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_drillingfluid.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_drillingfluid.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_epichlorhydrin.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_epichlorhydrin.png
new file mode 100644
index 0000000000..93d5f639ba
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_epichlorhydrin.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_epichlorhydrin.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_epichlorhydrin.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_epichlorhydrin.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_extra_heavy_oil.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_extra_heavy_oil.png
new file mode 100644
index 0000000000..88e6117ef4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_extra_heavy_oil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_extra_heavy_oil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_extra_heavy_oil.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_extra_heavy_oil.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_fuel.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_fuel.png
new file mode 100644
index 0000000000..5bbb503aa2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_fuel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_fuel.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_fuel.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_fuel.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_oil.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_oil.png
new file mode 100644
index 0000000000..88e6117ef4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_oil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_oil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_oil.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_heavy_oil.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_hydricsulfur.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_hydricsulfur.png
new file mode 100644
index 0000000000..703a181d7b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_hydricsulfur.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_hydricsulfur.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_hydricsulfur.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_hydricsulfur.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_fuel.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_fuel.png
new file mode 100644
index 0000000000..cb8046d902
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_fuel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_fuel.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_fuel.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_fuel.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_oil.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_oil.png
new file mode 100644
index 0000000000..88e6117ef4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_oil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_oil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_oil.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_light_oil.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_lpg.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_lpg.png
new file mode 100644
index 0000000000..1997c00728
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_lpg.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_lpg.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_lpg.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_lpg.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_medium_oil.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_medium_oil.png
new file mode 100644
index 0000000000..88e6117ef4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_medium_oil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_medium_oil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_medium_oil.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_medium_oil.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_naphtha.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_naphtha.png
new file mode 100644
index 0000000000..cb8046d902
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_naphtha.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_naphtha.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_naphtha.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_naphtha.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_nitrationmixture.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_nitrationmixture.png
new file mode 100644
index 0000000000..11c8d78df4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_nitrationmixture.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_nitrationmixture.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_nitrationmixture.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_nitrationmixture.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sodium.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sodium.png
new file mode 100644
index 0000000000..ae64cee5ee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sodium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sodium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sodium.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sodium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sufluriclight_fuel.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sufluriclight_fuel.png
new file mode 100644
index 0000000000..cb8046d902
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sufluriclight_fuel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sufluriclight_fuel.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sufluriclight_fuel.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sufluriclight_fuel.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricheavy_fuel.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricheavy_fuel.png
new file mode 100644
index 0000000000..5bbb503aa2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricheavy_fuel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricheavy_fuel.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricheavy_fuel.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricheavy_fuel.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricnaphtha.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricnaphtha.png
new file mode 100644
index 0000000000..cb8046d902
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricnaphtha.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricnaphtha.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricnaphtha.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_sulfuricnaphtha.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_toluene.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_toluene.png
new file mode 100644
index 0000000000..93d5f639ba
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_toluene.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_toluene.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_toluene.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquid_toluene.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidair.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidair.png
new file mode 100644
index 0000000000..68b3ff2803
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidair.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidair.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidair.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidair.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidnitrogen.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidnitrogen.png
new file mode 100644
index 0000000000..c0583a3b47
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidnitrogen.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidnitrogen.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidnitrogen.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidnitrogen.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidoxygen.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidoxygen.png
new file mode 100644
index 0000000000..ed1f0845a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidoxygen.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidoxygen.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidoxygen.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.liquidoxygen.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lithium.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lithium.png
new file mode 100644
index 0000000000..4ad6bd2730
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lithium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lithium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lithium.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lithium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lubricant.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lubricant.png
new file mode 100644
index 0000000000..5bbb503aa2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lubricant.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lubricant.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lubricant.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.lubricant.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mcguffium.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mcguffium.png
new file mode 100644
index 0000000000..0eb0a5b0a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mcguffium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mcguffium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mcguffium.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mcguffium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mercury.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mercury.png
new file mode 100644
index 0000000000..13eaf02dc4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mercury.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mercury.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mercury.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.mercury.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.methane.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.methane.png
new file mode 100644
index 0000000000..def98fdf1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.methane.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.methane.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.methane.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.methane.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.milk.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.milk.png
new file mode 100644
index 0000000000..a4178f98d3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.milk.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.milk.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.milk.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.milk.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.autogenerated.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.autogenerated.png
new file mode 100644
index 0000000000..bb36abf162
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.autogenerated.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.autogenerated.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.autogenerated.png.mcmeta
new file mode 100644
index 0000000000..7ceb363941
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.autogenerated.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 2,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.blaze.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.blaze.png
new file mode 100644
index 0000000000..41c3a1cb2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.blaze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.blaze.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.blaze.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.blaze.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.concrete.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.concrete.png
new file mode 100644
index 0000000000..e9f7931efa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.concrete.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.concrete.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.concrete.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.concrete.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.eternity.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.eternity.png
new file mode 100644
index 0000000000..168e3aba8e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.eternity.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.eternity.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.eternity.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.eternity.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.gaiaspirit.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.gaiaspirit.png
new file mode 100644
index 0000000000..d31a82f5eb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.gaiaspirit.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.gaiaspirit.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.gaiaspirit.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.gaiaspirit.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.glass.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.glass.png
new file mode 100644
index 0000000000..bc0610dd0b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.glass.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.glass.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.glass.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.glass.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.infinity.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.infinity.png
new file mode 100644
index 0000000000..27571f5f9c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.infinity.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.infinity.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.infinity.png.mcmeta
new file mode 100644
index 0000000000..eebd2d1c9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.infinity.png.mcmeta
@@ -0,0 +1,37 @@
+{
+ "animation": {
+ "frametime": 1,
+ "frames": [
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 3,
+ 3,
+ 4,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 4,
+ 3,
+ 3,
+ 2,
+ 2,
+ 2,
+ 1,
+ 1,
+ 1
+ ]
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magmatter.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magmatter.png
new file mode 100644
index 0000000000..5f582ff4bf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magmatter.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magmatter.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magmatter.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magmatter.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magnetohydrodynamicallyconstrainedstarmatter.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magnetohydrodynamicallyconstrainedstarmatter.png
new file mode 100644
index 0000000000..60ec8b69ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magnetohydrodynamicallyconstrainedstarmatter.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magnetohydrodynamicallyconstrainedstarmatter.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magnetohydrodynamicallyconstrainedstarmatter.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.magnetohydrodynamicallyconstrainedstarmatter.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.redstone.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.redstone.png
new file mode 100644
index 0000000000..7c3df249cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.redstone.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.redstone.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.redstone.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.redstone.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.spacetime.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.spacetime.png
new file mode 100644
index 0000000000..00020c8034
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.spacetime.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.spacetime.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.spacetime.png.mcmeta
new file mode 100644
index 0000000000..8e55e43baf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.spacetime.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 3
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.transcendentmetal.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.transcendentmetal.png
new file mode 100644
index 0000000000..88e6117ef4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.transcendentmetal.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.transcendentmetal.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.transcendentmetal.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.transcendentmetal.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.universium.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.universium.png
new file mode 100644
index 0000000000..c0345ac54b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.universium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.universium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.universium.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.universium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.whitedwarfmatter.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.whitedwarfmatter.png
new file mode 100644
index 0000000000..9ee47dbf38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.whitedwarfmatter.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.whitedwarfmatter.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.whitedwarfmatter.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.molten.whitedwarfmatter.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitricacid.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitricacid.png
new file mode 100644
index 0000000000..11c8d78df4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitricacid.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitricacid.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitricacid.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitricacid.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrocoalfuel.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrocoalfuel.png
new file mode 100644
index 0000000000..49bfb679cf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrocoalfuel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrocoalfuel.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrocoalfuel.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrocoalfuel.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel.png
new file mode 100644
index 0000000000..37c215be52
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrofuel.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogen.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogen.png
new file mode 100644
index 0000000000..7573d53852
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogen.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogen.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogen.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogen.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogendioxide.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogendioxide.png
new file mode 100644
index 0000000000..dc2a5a19bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogendioxide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogendioxide.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogendioxide.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogendioxide.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogenplasma.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogenplasma.png
new file mode 100644
index 0000000000..9ee47dbf38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogenplasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogenplasma.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogenplasma.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.nitrogenplasma.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oil.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oil.png
new file mode 100644
index 0000000000..88e6117ef4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oil.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oil.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oxygen.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oxygen.png
new file mode 100644
index 0000000000..81bea6bd55
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oxygen.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oxygen.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oxygen.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.oxygen.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.plasma.autogenerated.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.plasma.autogenerated.png
new file mode 100644
index 0000000000..9ee47dbf38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.plasma.autogenerated.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.plasma.autogenerated.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.plasma.autogenerated.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.plasma.autogenerated.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potassium.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potassium.png
new file mode 100644
index 0000000000..a3caafa86e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potassium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potassium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potassium.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potassium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.alcopops.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.alcopops.png
new file mode 100644
index 0000000000..00d945bc53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.alcopops.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.alcopops.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.alcopops.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.alcopops.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.applejuice.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.applejuice.png
new file mode 100644
index 0000000000..9b359b3365
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.applejuice.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.applejuice.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.applejuice.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.applejuice.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.awkward.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.awkward.png
new file mode 100644
index 0000000000..d2d3973f4b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.awkward.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.awkward.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.awkward.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.awkward.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.beer.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.beer.png
new file mode 100644
index 0000000000..00d945bc53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.beer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.beer.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.beer.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.beer.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cafeaulait.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cafeaulait.png
new file mode 100644
index 0000000000..3131019d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cafeaulait.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cafeaulait.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cafeaulait.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cafeaulait.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cavejohnsonsgrenadejuice.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cavejohnsonsgrenadejuice.png
new file mode 100644
index 0000000000..00d945bc53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cavejohnsonsgrenadejuice.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cavejohnsonsgrenadejuice.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cavejohnsonsgrenadejuice.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cavejohnsonsgrenadejuice.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chillysauce.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chillysauce.png
new file mode 100644
index 0000000000..cb7a5b4b01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chillysauce.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chillysauce.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chillysauce.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chillysauce.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chocolatemilk.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chocolatemilk.png
new file mode 100644
index 0000000000..6ce9e359d1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chocolatemilk.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chocolatemilk.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chocolatemilk.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.chocolatemilk.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cider.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cider.png
new file mode 100644
index 0000000000..fcf26a8b4d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cider.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cider.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cider.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.cider.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.coffee.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.coffee.png
new file mode 100644
index 0000000000..3131019d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.coffee.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.coffee.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.coffee.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.coffee.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.png
new file mode 100644
index 0000000000..f9f544cf14
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.splash.png
new file mode 100644
index 0000000000..0cca31ac8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.png
new file mode 100644
index 0000000000..3a7cfca2ba
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.splash.png
new file mode 100644
index 0000000000..91d442e040
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.damage.strong.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkbeer.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkbeer.png
new file mode 100644
index 0000000000..c7ccb8948b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkbeer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkbeer.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkbeer.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkbeer.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcafeaulait.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcafeaulait.png
new file mode 100644
index 0000000000..6ce9e359d1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcafeaulait.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcafeaulait.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcafeaulait.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcafeaulait.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkchocolatemilk.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkchocolatemilk.png
new file mode 100644
index 0000000000..6ce9e359d1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkchocolatemilk.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkchocolatemilk.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkchocolatemilk.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkchocolatemilk.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcoffee.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcoffee.png
new file mode 100644
index 0000000000..6ce9e359d1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcoffee.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcoffee.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcoffee.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.darkcoffee.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.png
new file mode 100644
index 0000000000..cb7a5b4b01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.strong.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.strong.png
new file mode 100644
index 0000000000..cb7a5b4b01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.strong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.strong.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.strong.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diablosauce.strong.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diabolosauce.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diabolosauce.png
new file mode 100644
index 0000000000..cb7a5b4b01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diabolosauce.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diabolosauce.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diabolosauce.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.diabolosauce.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.dragonblood.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.dragonblood.png
new file mode 100644
index 0000000000..f9249c386f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.dragonblood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.dragonblood.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.dragonblood.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.dragonblood.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.png
new file mode 100644
index 0000000000..7084abd49a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.splash.png
new file mode 100644
index 0000000000..c55df8b980
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.long.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.png
new file mode 100644
index 0000000000..4429b20b77
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.splash.png
new file mode 100644
index 0000000000..d4bbc98f12
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.fireresistance.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.glenmckenner.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.glenmckenner.png
new file mode 100644
index 0000000000..e21f194c12
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.glenmckenner.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.glenmckenner.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.glenmckenner.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.glenmckenner.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldenapplejuice.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldenapplejuice.png
new file mode 100644
index 0000000000..b466a17c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldenapplejuice.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldenapplejuice.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldenapplejuice.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldenapplejuice.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldencider.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldencider.png
new file mode 100644
index 0000000000..b466a17c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldencider.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldencider.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldencider.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.goldencider.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.grapejuice.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.grapejuice.png
new file mode 100644
index 0000000000..df772750d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.grapejuice.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.grapejuice.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.grapejuice.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.grapejuice.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.png
new file mode 100644
index 0000000000..52b477cd7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.splash.png
new file mode 100644
index 0000000000..6c42283a19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.png
new file mode 100644
index 0000000000..f04d6098a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.splash.png
new file mode 100644
index 0000000000..4538b06bd8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.health.strong.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hopsjuice.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hopsjuice.png
new file mode 100644
index 0000000000..df772750d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hopsjuice.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hopsjuice.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hopsjuice.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hopsjuice.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hotsauce.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hotsauce.png
new file mode 100644
index 0000000000..cb7a5b4b01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hotsauce.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hotsauce.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hotsauce.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.hotsauce.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.icetea.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.icetea.png
new file mode 100644
index 0000000000..488668ff28
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.icetea.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.icetea.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.icetea.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.icetea.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.idunsapplejuice.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.idunsapplejuice.png
new file mode 100644
index 0000000000..b466a17c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.idunsapplejuice.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.idunsapplejuice.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.idunsapplejuice.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.idunsapplejuice.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.png
new file mode 100644
index 0000000000..9f1db3b650
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.splash.png
new file mode 100644
index 0000000000..4f1e65b5e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.long.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.png
new file mode 100644
index 0000000000..b0f754d104
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.splash.png
new file mode 100644
index 0000000000..f312530d9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.invisibility.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.laitaucafe.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.laitaucafe.png
new file mode 100644
index 0000000000..3131019d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.laitaucafe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.laitaucafe.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.laitaucafe.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.laitaucafe.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonade.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonade.png
new file mode 100644
index 0000000000..00d945bc53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonade.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonade.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonade.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonjuice.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonjuice.png
new file mode 100644
index 0000000000..00d945bc53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonjuice.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonjuice.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonjuice.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.lemonjuice.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.leninade.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.leninade.png
new file mode 100644
index 0000000000..00d945bc53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.leninade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.leninade.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.leninade.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.leninade.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.limoncello.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.limoncello.png
new file mode 100644
index 0000000000..00d945bc53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.limoncello.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.limoncello.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.limoncello.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.limoncello.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mineralwater.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mineralwater.png
new file mode 100644
index 0000000000..24db5edce3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mineralwater.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mineralwater.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mineralwater.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mineralwater.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mundane.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mundane.png
new file mode 100644
index 0000000000..d2d3973f4b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mundane.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mundane.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mundane.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.mundane.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.png
new file mode 100644
index 0000000000..238f0c9309
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.splash.png
new file mode 100644
index 0000000000..4ed6c38785
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.long.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.png
new file mode 100644
index 0000000000..d426f6d1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.splash.png
new file mode 100644
index 0000000000..fdbf22580d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.nightvision.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.notchesbrew.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.notchesbrew.png
new file mode 100644
index 0000000000..b466a17c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.notchesbrew.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.notchesbrew.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.notchesbrew.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.notchesbrew.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.piratebrew.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.piratebrew.png
new file mode 100644
index 0000000000..bb026e52ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.piratebrew.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.piratebrew.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.piratebrew.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.piratebrew.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.png
new file mode 100644
index 0000000000..07c045af8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.splash.png
new file mode 100644
index 0000000000..b145fe1ea2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.long.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.png
new file mode 100644
index 0000000000..d892fba9d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.splash.png
new file mode 100644
index 0000000000..84cd2d70fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.png
new file mode 100644
index 0000000000..8ddad0b9b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.splash.png
new file mode 100644
index 0000000000..b6d1b5438d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.poison.strong.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.potatojuice.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.potatojuice.png
new file mode 100644
index 0000000000..00d945bc53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.potatojuice.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.potatojuice.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.potatojuice.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.potatojuice.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.purpledrink.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.purpledrink.png
new file mode 100644
index 0000000000..f0c89a47db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.purpledrink.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.purpledrink.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.purpledrink.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.purpledrink.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.reedwater.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.reedwater.png
new file mode 100644
index 0000000000..d2d3973f4b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.reedwater.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.reedwater.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.reedwater.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.reedwater.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.png
new file mode 100644
index 0000000000..9fc71454cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.splash.png
new file mode 100644
index 0000000000..9fc71454cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.long.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.png
new file mode 100644
index 0000000000..9fc71454cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.splash.png
new file mode 100644
index 0000000000..9fc71454cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.png
new file mode 100644
index 0000000000..9fc71454cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.splash.png
new file mode 100644
index 0000000000..9fc71454cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.regen.strong.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.rum.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.rum.png
new file mode 100644
index 0000000000..a233a442e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.rum.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.rum.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.rum.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.rum.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.saltywater.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.saltywater.png
new file mode 100644
index 0000000000..d2d3973f4b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.saltywater.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.saltywater.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.saltywater.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.saltywater.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.scotch.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.scotch.png
new file mode 100644
index 0000000000..9b359b3365
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.scotch.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.scotch.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.scotch.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.scotch.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.png
new file mode 100644
index 0000000000..9f1db3b650
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.splash.png
new file mode 100644
index 0000000000..4f1e65b5e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.long.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.png
new file mode 100644
index 0000000000..b0f754d104
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.splash.png
new file mode 100644
index 0000000000..f312530d9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.slowness.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.png
new file mode 100644
index 0000000000..98c6c8592f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.splash.png
new file mode 100644
index 0000000000..a2700150ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.long.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.png
new file mode 100644
index 0000000000..d9589ef415
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.splash.png
new file mode 100644
index 0000000000..68516bf6e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.png
new file mode 100644
index 0000000000..06b046fdbb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.splash.png
new file mode 100644
index 0000000000..adebdc7fc9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.speed.strong.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.png
new file mode 100644
index 0000000000..692e4e9624
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.splash.png
new file mode 100644
index 0000000000..a9911cf3be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.long.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.png
new file mode 100644
index 0000000000..d50b892733
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.splash.png
new file mode 100644
index 0000000000..38dfd401ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.png
new file mode 100644
index 0000000000..2d5210313c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.splash.png
new file mode 100644
index 0000000000..4a38565ee3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.strength.strong.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.sweettea.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.sweettea.png
new file mode 100644
index 0000000000..f5916d7875
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.sweettea.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.sweettea.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.sweettea.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.sweettea.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.tea.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.tea.png
new file mode 100644
index 0000000000..f5916d7875
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.tea.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.tea.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.tea.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.tea.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.thick.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.thick.png
new file mode 100644
index 0000000000..d2d3973f4b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.thick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.thick.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.thick.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.thick.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vinegar.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vinegar.png
new file mode 100644
index 0000000000..d8f8701fca
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vinegar.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vinegar.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vinegar.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vinegar.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vodka.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vodka.png
new file mode 100644
index 0000000000..93684d3145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vodka.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vodka.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vodka.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.vodka.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.png
new file mode 100644
index 0000000000..52e378c465
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.splash.png
new file mode 100644
index 0000000000..7947a8975d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.long.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.png
new file mode 100644
index 0000000000..19d6ee839c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.splash.png
new file mode 100644
index 0000000000..ef69f1c345
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.waterbreathing.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.png
new file mode 100644
index 0000000000..9f1db3b650
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.splash.png
new file mode 100644
index 0000000000..4f1e65b5e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.long.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.png
new file mode 100644
index 0000000000..b0f754d104
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.splash.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.splash.png
new file mode 100644
index 0000000000..f312530d9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.splash.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.splash.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.splash.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.weakness.splash.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyhopsjuice.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyhopsjuice.png
new file mode 100644
index 0000000000..fcf26a8b4d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyhopsjuice.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyhopsjuice.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyhopsjuice.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyhopsjuice.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyjuice.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyjuice.png
new file mode 100644
index 0000000000..00d945bc53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyjuice.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyjuice.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyjuice.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wheatyjuice.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wine.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wine.png
new file mode 100644
index 0000000000..cb7a5b4b01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wine.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wine.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.potion.wine.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.primordialmatter.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.primordialmatter.png
new file mode 100644
index 0000000000..137280d74c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.primordialmatter.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.primordialmatter.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.primordialmatter.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.primordialmatter.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.quarkgluonplasma.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.quarkgluonplasma.png
new file mode 100644
index 0000000000..15eebcf7a0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.quarkgluonplasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.quarkgluonplasma.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.quarkgluonplasma.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.quarkgluonplasma.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.radon.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.radon.png
new file mode 100644
index 0000000000..d8e3fae0b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.radon.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.radon.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.radon.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.radon.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rawstarmatter.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rawstarmatter.png
new file mode 100644
index 0000000000..61775ac928
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rawstarmatter.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rawstarmatter.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rawstarmatter.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rawstarmatter.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.refinedglue.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.refinedglue.png
new file mode 100644
index 0000000000..91f4f1d1b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.refinedglue.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.refinedglue.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.refinedglue.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.refinedglue.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rocket_fuel.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rocket_fuel.png
new file mode 100644
index 0000000000..11c8d78df4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rocket_fuel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rocket_fuel.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rocket_fuel.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.rocket_fuel.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.seedoil.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.seedoil.png
new file mode 100644
index 0000000000..20737dda6e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.seedoil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.seedoil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.seedoil.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.seedoil.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.silicon.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.silicon.png
new file mode 100644
index 0000000000..8b2b2f144a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.silicon.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.silicon.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.silicon.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.silicon.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodium.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodium.png
new file mode 100644
index 0000000000..d2d3973f4b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodium.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodiumpersulfate.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodiumpersulfate.png
new file mode 100644
index 0000000000..0b9f37f4c8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodiumpersulfate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodiumpersulfate.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodiumpersulfate.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sodiumpersulfate.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.bluevitriol.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.bluevitriol.png
new file mode 100644
index 0000000000..6bbed87296
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.bluevitriol.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.bluevitriol.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.bluevitriol.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.bluevitriol.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.greenvitriol.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.greenvitriol.png
new file mode 100644
index 0000000000..9eff666cb2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.greenvitriol.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.greenvitriol.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.greenvitriol.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.greenvitriol.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.nickelsulfate.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.nickelsulfate.png
new file mode 100644
index 0000000000..27705be95a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.nickelsulfate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.nickelsulfate.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.nickelsulfate.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.solution.nickelsulfate.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.spatialfluid.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.spatialfluid.png
new file mode 100644
index 0000000000..70d2960f3d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.spatialfluid.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.spatialfluid.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.spatialfluid.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.spatialfluid.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.squidink.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.squidink.png
new file mode 100644
index 0000000000..88e6117ef4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.squidink.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.squidink.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.squidink.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.squidink.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.steam.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.steam.png
new file mode 100644
index 0000000000..068f4e22ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.steam.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.steam.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.steam.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.steam.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sulfuricacid.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sulfuricacid.png
new file mode 100644
index 0000000000..703a181d7b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sulfuricacid.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sulfuricacid.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sulfuricacid.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.sulfuricacid.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.temporalfluid.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.temporalfluid.png
new file mode 100644
index 0000000000..bd46a8408c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.temporalfluid.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.temporalfluid.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.temporalfluid.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.temporalfluid.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.titaniumtetrachloride.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.titaniumtetrachloride.png
new file mode 100644
index 0000000000..a3caafa86e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.titaniumtetrachloride.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.titaniumtetrachloride.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.titaniumtetrachloride.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.titaniumtetrachloride.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.tritium.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.tritium.png
new file mode 100644
index 0000000000..5d4c3e8dec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.tritium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.tritium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.tritium.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.tritium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.uuamplifier.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.uuamplifier.png
new file mode 100644
index 0000000000..9fc71454cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.uuamplifier.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.uuamplifier.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.uuamplifier.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.uuamplifier.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.autogenerated b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.autogenerated
new file mode 100644
index 0000000000..2de4def363
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.autogenerated
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.autogenerated.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.autogenerated.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.autogenerated.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.concrete.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.concrete.png
new file mode 100644
index 0000000000..fa8c0123ee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.concrete.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.concrete.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.concrete.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wet.concrete.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wolframium.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wolframium.png
new file mode 100644
index 0000000000..dd68325886
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wolframium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wolframium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wolframium.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.wolframium.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_DOWN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_DOWN.png
new file mode 100644
index 0000000000..2343774edb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_DOWN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_DOWN_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_DOWN_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_DOWN_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_LEFT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_LEFT.png
new file mode 100644
index 0000000000..890eb13abd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_LEFT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_LEFT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_LEFT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_LEFT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_RIGHT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_RIGHT.png
new file mode 100644
index 0000000000..7bc21aa9e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_RIGHT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_RIGHT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_RIGHT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_RIGHT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_UP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_UP.png
new file mode 100644
index 0000000000..dfc3e62ea8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_UP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_UP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_UP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ARROW_UP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_CHESTBUFFER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_CHESTBUFFER.png
new file mode 100644
index 0000000000..161a98a318
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_CHESTBUFFER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_CHESTBUFFER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_CHESTBUFFER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_CHESTBUFFER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_FILTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_FILTER.png
new file mode 100644
index 0000000000..47e7397fbb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_FILTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_FILTER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_FILTER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_FILTER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_ITEMDISTRIBUTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_ITEMDISTRIBUTOR.png
new file mode 100644
index 0000000000..a65c31c9d6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_ITEMDISTRIBUTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_ITEMDISTRIBUTOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_ITEMDISTRIBUTOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_ITEMDISTRIBUTOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_RECIPEFILTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_RECIPEFILTER.png
new file mode 100644
index 0000000000..4a156f0cf1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_RECIPEFILTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_RECIPEFILTER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_RECIPEFILTER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_RECIPEFILTER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_REGULATOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_REGULATOR.png
new file mode 100644
index 0000000000..e244df843b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_REGULATOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_REGULATOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_REGULATOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_REGULATOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_SUPERBUFFER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_SUPERBUFFER.png
new file mode 100644
index 0000000000..66a6c97838
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_SUPERBUFFER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_SUPERBUFFER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_SUPERBUFFER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_SUPERBUFFER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_TYPEFILTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_TYPEFILTER.png
new file mode 100644
index 0000000000..47e7397fbb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_TYPEFILTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_TYPEFILTER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_TYPEFILTER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/AUTOMATION_TYPEFILTER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS.png
new file mode 100644
index 0000000000..cb6b6cb219
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS_CHISELED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS_CHISELED.png
new file mode 100644
index 0000000000..6659b0c47e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS_CHISELED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS_CRACKED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS_CRACKED.png
new file mode 100644
index 0000000000..8f887bd505
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS_CRACKED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS_MOSSY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS_MOSSY.png
new file mode 100644
index 0000000000..27ece1623d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_BRICKS_MOSSY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_COBBLE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_COBBLE.png
new file mode 100644
index 0000000000..46afc48f61
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_COBBLE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_COBBLE_MOSSY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_COBBLE_MOSSY.png
new file mode 100644
index 0000000000..132c109400
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_COBBLE_MOSSY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_SMOOTH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_SMOOTH.png
new file mode 100644
index 0000000000..32d052715e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_SMOOTH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_STONE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_STONE.png
new file mode 100644
index 0000000000..f74934cb3a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BASALT_STONE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ADAMANTIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ADAMANTIUM.png
new file mode 100644
index 0000000000..dc0929cf37
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ADAMANTIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AERCRYSTAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AERCRYSTAL.png
new file mode 100644
index 0000000000..2e442f9f2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AERCRYSTAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ALUMINIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ALUMINIUM.png
new file mode 100644
index 0000000000..1603567f3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ALUMINIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AMBER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AMBER.png
new file mode 100644
index 0000000000..fa38fb9fe6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AMBER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AMERICIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AMERICIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AMERICIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AMETHYST.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AMETHYST.png
new file mode 100644
index 0000000000..940d863e33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AMETHYST.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ANNEALEDCOPPER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ANNEALEDCOPPER.png
new file mode 100644
index 0000000000..3c376b6f65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ANNEALEDCOPPER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ANTIMONY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ANTIMONY.png
new file mode 100644
index 0000000000..69cd1fd782
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ANTIMONY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AQUACRYSTAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AQUACRYSTAL.png
new file mode 100644
index 0000000000..6f8c48a71d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_AQUACRYSTAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ARSENIC.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ARSENIC.png
new file mode 100644
index 0000000000..ff091387a7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ARSENIC.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ASTRALSILVER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ASTRALSILVER.png
new file mode 100644
index 0000000000..62480275d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ASTRALSILVER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BATTERYALLOY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BATTERYALLOY.png
new file mode 100644
index 0000000000..b5e8b7a793
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BATTERYALLOY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BERYLLIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BERYLLIUM.png
new file mode 100644
index 0000000000..17d871587b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BERYLLIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BISMUTH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BISMUTH.png
new file mode 100644
index 0000000000..794fd188be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BISMUTH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BISMUTHBRONZE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BISMUTHBRONZE.png
new file mode 100644
index 0000000000..fee9f42b9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BISMUTHBRONZE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLACKBRONZE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLACKBRONZE.png
new file mode 100644
index 0000000000..f05b24a08e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLACKBRONZE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLACKDWARFMATTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLACKDWARFMATTER.png
new file mode 100644
index 0000000000..fa280745e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLACKDWARFMATTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLACKSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLACKSTEEL.png
new file mode 100644
index 0000000000..5239b330b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLACKSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLAZE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLAZE.png
new file mode 100644
index 0000000000..beab4ea72f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLAZE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLUEALLOY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLUEALLOY.png
new file mode 100644
index 0000000000..3ec76fa667
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLUEALLOY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLUESTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLUESTEEL.png
new file mode 100644
index 0000000000..e3ddb4b02a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLUESTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLUETOPAZ.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLUETOPAZ.png
new file mode 100644
index 0000000000..020de887c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BLUETOPAZ.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BRASS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BRASS.png
new file mode 100644
index 0000000000..b8be0c4473
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BRASS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BRONZE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BRONZE.png
new file mode 100644
index 0000000000..a275ff1e92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BRONZE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BRONZEPREIN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BRONZEPREIN.png
new file mode 100644
index 0000000000..d551ab7588
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_BRONZEPREIN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CAESIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CAESIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CAESIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CERIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CERIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CERIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CERTUSQUARTZ.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CERTUSQUARTZ.png
new file mode 100644
index 0000000000..25bf2f4971
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CERTUSQUARTZ.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CHARCOAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CHARCOAL.png
new file mode 100644
index 0000000000..b48f18ba7b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CHARCOAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CHROME.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CHROME.png
new file mode 100644
index 0000000000..6cf020906a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CHROME.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CHROMIUMDIOXIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CHROMIUMDIOXIDE.png
new file mode 100644
index 0000000000..9277fed420
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CHROMIUMDIOXIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_COBALT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_COBALT.png
new file mode 100644
index 0000000000..9095a8b7e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_COBALT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_COBALTBRASS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_COBALTBRASS.png
new file mode 100644
index 0000000000..097f81d0f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_COBALTBRASS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_COPPER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_COPPER.png
new file mode 100644
index 0000000000..09c920e068
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_COPPER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CRYOLITE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CRYOLITE.png
new file mode 100644
index 0000000000..a7ce330be8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CRYOLITE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CUPRONICKEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CUPRONICKEL.png
new file mode 100644
index 0000000000..743349b7c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_CUPRONICKEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DAMASCUSSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DAMASCUSSTEEL.png
new file mode 100644
index 0000000000..d3129d16ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DAMASCUSSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DARKIRON.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DARKIRON.png
new file mode 100644
index 0000000000..82b52c4a9e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DARKIRON.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DEEPIRON.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DEEPIRON.png
new file mode 100644
index 0000000000..e7fccdefe4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DEEPIRON.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DEEP_DARK_RAW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DEEP_DARK_RAW.png
new file mode 100644
index 0000000000..baa8c91218
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DEEP_DARK_RAW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DESH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DESH.png
new file mode 100644
index 0000000000..5ae74e1568
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DESH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DILITHIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DILITHIUM.png
new file mode 100644
index 0000000000..53b1f3a88e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DILITHIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DURANIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DURANIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DURANIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DYSPROSIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DYSPROSIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_DYSPROSIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ELECTRUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ELECTRUM.png
new file mode 100644
index 0000000000..3db75c0e75
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ELECTRUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ELECTRUMFLUX.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ELECTRUMFLUX.png
new file mode 100644
index 0000000000..3db75c0e75
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ELECTRUMFLUX.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ENDEREYE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ENDEREYE.png
new file mode 100644
index 0000000000..13a0fb2b03
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ENDEREYE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ENDERIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ENDERIUM.png
new file mode 100644
index 0000000000..a6b31d7676
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ENDERIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ENDERPEARL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ENDERPEARL.png
new file mode 100644
index 0000000000..f6aadd831c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ENDERPEARL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ERBIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ERBIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ERBIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ETERNITY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ETERNITY.png
new file mode 100644
index 0000000000..47fe9272e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ETERNITY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ETERNITY.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ETERNITY.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ETERNITY.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_EUROPIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_EUROPIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_EUROPIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FIERYSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FIERYSTEEL.png
new file mode 100644
index 0000000000..38b9a342c5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FIERYSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FIRESTONE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FIRESTONE.png
new file mode 100644
index 0000000000..8d2e5590b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FIRESTONE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FOOLSRUBY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FOOLSRUBY.png
new file mode 100644
index 0000000000..2752d48a0d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FOOLSRUBY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FORCE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FORCE.png
new file mode 100644
index 0000000000..1014d9d6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FORCE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FORCICIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FORCICIUM.png
new file mode 100644
index 0000000000..1adf9d3587
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FORCICIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FORCILLIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FORCILLIUM.png
new file mode 100644
index 0000000000..1adf9d3587
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_FORCILLIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_GADOLINIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_GADOLINIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_GADOLINIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_GALLIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_GALLIUM.png
new file mode 100644
index 0000000000..0542050fcd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_GALLIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_GREENSAPPHIRE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_GREENSAPPHIRE.png
new file mode 100644
index 0000000000..f8bb8dd746
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_GREENSAPPHIRE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HOLMIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HOLMIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HOLMIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSLA.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSLA.png
new file mode 100644
index 0000000000..e8c58a6e18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSLA.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSSE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSSE.png
new file mode 100644
index 0000000000..17d871587b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSSE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSSG.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSSG.png
new file mode 100644
index 0000000000..302fdcd60c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSSG.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSSS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSSS.png
new file mode 100644
index 0000000000..478f6aa2d3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_HSSS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ICHORIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ICHORIUM.png
new file mode 100644
index 0000000000..02ba2af635
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ICHORIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IGNISCRYSTAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IGNISCRYSTAL.png
new file mode 100644
index 0000000000..7d443ae072
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IGNISCRYSTAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_INDIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_INDIUM.png
new file mode 100644
index 0000000000..d62c4baeb7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_INDIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_INFUSEDGOLD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_INFUSEDGOLD.png
new file mode 100644
index 0000000000..1cf7dd8528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_INFUSEDGOLD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_INVAR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_INVAR.png
new file mode 100644
index 0000000000..81cbecca50
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_INVAR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRIDIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRIDIUM.png
new file mode 100644
index 0000000000..287678c013
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRIDIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRONMAGNETIC.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRONMAGNETIC.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRONMAGNETIC.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRONWOOD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRONWOOD.png
new file mode 100644
index 0000000000..c013e719a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRONWOOD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRREIN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRREIN.png
new file mode 100644
index 0000000000..a519781868
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_IRREIN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_JASPER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_JASPER.png
new file mode 100644
index 0000000000..d96fcbc461
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_JASPER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_KANTHAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_KANTHAL.png
new file mode 100644
index 0000000000..a65e9f1051
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_KANTHAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_KNIGHTMETAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_KNIGHTMETAL.png
new file mode 100644
index 0000000000..0210319fce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_KNIGHTMETAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LANTHANUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LANTHANUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LANTHANUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LAZURITE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LAZURITE.png
new file mode 100644
index 0000000000..003cf7ab52
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LAZURITE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LEAD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LEAD.png
new file mode 100644
index 0000000000..3cc44b7de6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LEAD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LIGNITE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LIGNITE.png
new file mode 100644
index 0000000000..b48f18ba7b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LIGNITE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LUTETIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LUTETIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_LUTETIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGMATTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGMATTER.png
new file mode 100644
index 0000000000..638e9f8e0b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGMATTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGMATTER.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGMATTER.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGMATTER.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGNALIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGNALIUM.png
new file mode 100644
index 0000000000..02037a2152
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGNALIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGNESIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGNESIUM.png
new file mode 100644
index 0000000000..8d56a45aef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MAGNESIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MANGANESE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MANGANESE.png
new file mode 100644
index 0000000000..5930a014db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MANGANESE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_METEORICIRON.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_METEORICIRON.png
new file mode 100644
index 0000000000..8bc5a82329
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_METEORICIRON.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_METEORICSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_METEORICSTEEL.png
new file mode 100644
index 0000000000..a8bcad573c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_METEORICSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MIDASIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MIDASIUM.png
new file mode 100644
index 0000000000..377bbaf76c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MIDASIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MITHRIL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MITHRIL.png
new file mode 100644
index 0000000000..5100316af0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MITHRIL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MOLYBDENUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MOLYBDENUM.png
new file mode 100644
index 0000000000..8e710e1699
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MOLYBDENUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MONAZITE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MONAZITE.png
new file mode 100644
index 0000000000..7b77206ce9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_MONAZITE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAH.png
new file mode 100644
index 0000000000..cb133112b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAHALLOY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAHALLOY.png
new file mode 100644
index 0000000000..cb133112b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAHALLOY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAHENRICHED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAHENRICHED.png
new file mode 100644
index 0000000000..bde1c4341f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAHENRICHED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAHPREIN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAHPREIN.png
new file mode 100644
index 0000000000..2a6cfab696
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADAHPREIN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADRIA.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADRIA.png
new file mode 100644
index 0000000000..d6b31d0227
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NAQUADRIA.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEODYMIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEODYMIUM.png
new file mode 100644
index 0000000000..58e9e8fb87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEODYMIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEODYMIUMMAGNETIC.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEODYMIUMMAGNETIC.png
new file mode 100644
index 0000000000..58e9e8fb87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEODYMIUMMAGNETIC.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NETHERSTAR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NETHERSTAR.png
new file mode 100644
index 0000000000..53b1f3a88e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NETHERSTAR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEUTRONIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEUTRONIUM.png
new file mode 100644
index 0000000000..287678c013
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEUTRONIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEUTRONIUMPREIN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEUTRONIUMPREIN.png
new file mode 100644
index 0000000000..7646d9371f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NEUTRONIUMPREIN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NICHROME.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NICHROME.png
new file mode 100644
index 0000000000..5d2ce96a6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NICHROME.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NICKEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NICKEL.png
new file mode 100644
index 0000000000..5d2ce96a6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NICKEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NICKELALUMINIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NICKELALUMINIUM.png
new file mode 100644
index 0000000000..7e375c7bea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NICKELALUMINIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NIOBIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NIOBIUM.png
new file mode 100644
index 0000000000..412f598991
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NIOBIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NIOBIUMNITRIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NIOBIUMNITRIDE.png
new file mode 100644
index 0000000000..99bde92e3d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NIOBIUMNITRIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NIOBIUMTITANIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NIOBIUMTITANIUM.png
new file mode 100644
index 0000000000..91f7b15b28
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NIOBIUMTITANIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NITER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NITER.png
new file mode 100644
index 0000000000..08a7c084c4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_NITER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OLIVINE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OLIVINE.png
new file mode 100644
index 0000000000..db57c8adc0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OLIVINE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OPAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OPAL.png
new file mode 100644
index 0000000000..020de887c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OPAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ORDOCRYSTAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ORDOCRYSTAL.png
new file mode 100644
index 0000000000..53b1f3a88e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ORDOCRYSTAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ORIHARUKON.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ORIHARUKON.png
new file mode 100644
index 0000000000..224df9f433
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ORIHARUKON.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OSMIRIDIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OSMIRIDIUM.png
new file mode 100644
index 0000000000..daf8bbd9d3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OSMIRIDIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OSMIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OSMIUM.png
new file mode 100644
index 0000000000..e3a0f99153
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_OSMIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PALLADIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PALLADIUM.png
new file mode 100644
index 0000000000..39d49a38b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PALLADIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PERDITIOCRYSTAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PERDITIOCRYSTAL.png
new file mode 100644
index 0000000000..eb3574892b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PERDITIOCRYSTAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PHOSPHORUS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PHOSPHORUS.png
new file mode 100644
index 0000000000..b27457f4c4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PHOSPHORUS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PIGIRON.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PIGIRON.png
new file mode 100644
index 0000000000..e690908078
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PIGIRON.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLASCRETE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLASCRETE.png
new file mode 100644
index 0000000000..1579e9749c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLASCRETE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLATINUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLATINUM.png
new file mode 100644
index 0000000000..2d179450c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLATINUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLUTONIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLUTONIUM.png
new file mode 100644
index 0000000000..9712efcd64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLUTONIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLUTONIUM241.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLUTONIUM241.png
new file mode 100644
index 0000000000..1eeedad4fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PLUTONIUM241.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PRASEODYMIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PRASEODYMIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PRASEODYMIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PROMETHIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PROMETHIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_PROMETHIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_QUARTZITE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_QUARTZITE.png
new file mode 100644
index 0000000000..69f4ee3890
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_QUARTZITE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_REDALLOY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_REDALLOY.png
new file mode 100644
index 0000000000..478f6aa2d3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_REDALLOY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_REDGARNET.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_REDGARNET.png
new file mode 100644
index 0000000000..d96fcbc461
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_REDGARNET.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_REDSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_REDSTEEL.png
new file mode 100644
index 0000000000..e3c3d9f1c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_REDSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ROSEGOLD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ROSEGOLD.png
new file mode 100644
index 0000000000..302fdcd60c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ROSEGOLD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_RUBIDIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_RUBIDIUM.png
new file mode 100644
index 0000000000..2a5d239bfd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_RUBIDIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_RUBY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_RUBY.png
new file mode 100644
index 0000000000..2752d48a0d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_RUBY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SAMARIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SAMARIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SAMARIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SAPPHIRE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SAPPHIRE.png
new file mode 100644
index 0000000000..6015f5cadc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SAPPHIRE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SCANDIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SCANDIUM.png
new file mode 100644
index 0000000000..47e0ad5df6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SCANDIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SHADOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SHADOW.png
new file mode 100644
index 0000000000..bde1c4341f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SHADOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SHADOWIRON.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SHADOWIRON.png
new file mode 100644
index 0000000000..96f9b3cf3a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SHADOWIRON.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SHADOWSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SHADOWSTEEL.png
new file mode 100644
index 0000000000..bf662d1f8e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SHADOWSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SILICON.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SILICON.png
new file mode 100644
index 0000000000..4f12825ed6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SILICON.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SILICONSG.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SILICONSG.png
new file mode 100644
index 0000000000..ce65280e88
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SILICONSG.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SILVER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SILVER.png
new file mode 100644
index 0000000000..0d29f8c49a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SILVER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SODALITE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SODALITE.png
new file mode 100644
index 0000000000..035195ace6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SODALITE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SOLDERINGALLOY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SOLDERINGALLOY.png
new file mode 100644
index 0000000000..a2978b2233
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SOLDERINGALLOY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SPACETIME.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SPACETIME.png
new file mode 100644
index 0000000000..e04dcd4e22
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SPACETIME.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SPACETIME.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SPACETIME.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SPACETIME.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STAINLESSSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STAINLESSSTEEL.png
new file mode 100644
index 0000000000..ff438f7b1e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STAINLESSSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEEL.png
new file mode 100644
index 0000000000..e8c58a6e18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEELEAF.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEELEAF.png
new file mode 100644
index 0000000000..c394071646
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEELEAF.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEELMAGNETIC.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEELMAGNETIC.png
new file mode 100644
index 0000000000..e8c58a6e18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEELMAGNETIC.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEELPREIN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEELPREIN.png
new file mode 100644
index 0000000000..d7e2ec5e5e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STEELPREIN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STERLINGSILVER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STERLINGSILVER.png
new file mode 100644
index 0000000000..d42ff86c3d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_STERLINGSILVER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SUNNARIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SUNNARIUM.png
new file mode 100644
index 0000000000..c6439dde20
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_SUNNARIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TANTALUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TANTALUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TANTALUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TANZANITE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TANZANITE.png
new file mode 100644
index 0000000000..26b9efcf7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TANZANITE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TELLURIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TELLURIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TELLURIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TERBIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TERBIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TERBIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TERRACRYSTAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TERRACRYSTAL.png
new file mode 100644
index 0000000000..94f605c925
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TERRACRYSTAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_THAUMIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_THAUMIUM.png
new file mode 100644
index 0000000000..97e4b7e9e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_THAUMIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_THORIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_THORIUM.png
new file mode 100644
index 0000000000..6f66c73ae6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_THORIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_THULIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_THULIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_THULIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TIN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TIN.png
new file mode 100644
index 0000000000..f670f8718c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TIN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TINALLOY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TINALLOY.png
new file mode 100644
index 0000000000..ca3f0aadaa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TINALLOY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TITANIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TITANIUM.png
new file mode 100644
index 0000000000..dde503f461
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TITANIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TITANIUMPREIN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TITANIUMPREIN.png
new file mode 100644
index 0000000000..b571247142
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TITANIUMPREIN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TOPAZ.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TOPAZ.png
new file mode 100644
index 0000000000..369cb896fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TOPAZ.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRANSCENDENTMETAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRANSCENDENTMETAL.png
new file mode 100644
index 0000000000..d6b31d0227
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRANSCENDENTMETAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRINIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRINIUM.png
new file mode 100644
index 0000000000..8326b93d5e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRINIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRITANIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRITANIUM.png
new file mode 100644
index 0000000000..90b09985fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TRITANIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TSREIN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TSREIN.png
new file mode 100644
index 0000000000..2d9afd52a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TSREIN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TUNGSTEN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TUNGSTEN.png
new file mode 100644
index 0000000000..cb133112b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TUNGSTEN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TUNGSTENCARBIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TUNGSTENCARBIDE.png
new file mode 100644
index 0000000000..d62c4baeb7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TUNGSTENCARBIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TUNGSTENSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TUNGSTENSTEEL.png
new file mode 100644
index 0000000000..e2c8de02f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_TUNGSTENSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ULTIMET.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ULTIMET.png
new file mode 100644
index 0000000000..8e710e1699
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ULTIMET.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_UNIVERSIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_UNIVERSIUM.png
new file mode 100644
index 0000000000..abf2afa6de
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_UNIVERSIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_URANIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_URANIUM.png
new file mode 100644
index 0000000000..685a8c2a7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_URANIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_URANIUM235.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_URANIUM235.png
new file mode 100644
index 0000000000..7da643f6c1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_URANIUM235.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VANADIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VANADIUM.png
new file mode 100644
index 0000000000..5e90e9ee3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VANADIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VANADIUMGALLIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VANADIUMGALLIUM.png
new file mode 100644
index 0000000000..c6384d8585
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VANADIUMGALLIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VANADIUMSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VANADIUMSTEEL.png
new file mode 100644
index 0000000000..39d49a38b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VANADIUMSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VINTEUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VINTEUM.png
new file mode 100644
index 0000000000..c132e89f32
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_VINTEUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_WHITEDWARFMATTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_WHITEDWARFMATTER.png
new file mode 100644
index 0000000000..ecd270c675
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_WHITEDWARFMATTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_WROUGHTIRON.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_WROUGHTIRON.png
new file mode 100644
index 0000000000..e690908078
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_WROUGHTIRON.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YELLOWGARNET.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YELLOWGARNET.png
new file mode 100644
index 0000000000..42f89b44e7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YELLOWGARNET.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YTTRBIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YTTRBIUM.png
new file mode 100644
index 0000000000..7816799ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YTTRBIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YTTRIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YTTRIUM.png
new file mode 100644
index 0000000000..8e22c51cd7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YTTRIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YTTRIUMBARIUMCUPRATE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YTTRIUMBARIUMCUPRATE.png
new file mode 100644
index 0000000000..83ce3d280f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_YTTRIUMBARIUMCUPRATE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ZINC.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ZINC.png
new file mode 100644
index 0000000000..6de5ecfcad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BLOCK_ZINC.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT.png
new file mode 100644
index 0000000000..02a2ecffb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..37a136325d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..8a6ba61947
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..26bb55e207
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT.png
new file mode 100644
index 0000000000..417cd598e3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..df0cdaa661
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..8e55e43baf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 3
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..0c4c0b6a2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..07dc1943ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 3
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_LAVA_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_SOLAR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_SOLAR.png
new file mode 100644
index 0000000000..90c030ee82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/BOILER_SOLAR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CFOAM_FRESH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CFOAM_FRESH.png
new file mode 100644
index 0000000000..da4d36b8a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CFOAM_FRESH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CFOAM_HARDENED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CFOAM_HARDENED.png
new file mode 100644
index 0000000000..1579e9749c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CFOAM_HARDENED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS.png
new file mode 100644
index 0000000000..e98c9dc871
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS_CHISELED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS_CHISELED.png
new file mode 100644
index 0000000000..ade2bd8167
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS_CHISELED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS_CRACKED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS_CRACKED.png
new file mode 100644
index 0000000000..afaa643023
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS_CRACKED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS_MOSSY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS_MOSSY.png
new file mode 100644
index 0000000000..d630b1ae6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_BRICKS_MOSSY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_COBBLE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_COBBLE.png
new file mode 100644
index 0000000000..fa4cff1f30
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_COBBLE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_COBBLE_MOSSY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_COBBLE_MOSSY.png
new file mode 100644
index 0000000000..bd28bc57dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_COBBLE_MOSSY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_SMOOTH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_SMOOTH.png
new file mode 100644
index 0000000000..13e3b029d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_SMOOTH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_STONE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_STONE.png
new file mode 100644
index 0000000000..99a3a1bc26
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_DARK_STONE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS.png
new file mode 100644
index 0000000000..2aa23ca920
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS_CHISELED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS_CHISELED.png
new file mode 100644
index 0000000000..ee5070c250
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS_CHISELED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS_CRACKED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS_CRACKED.png
new file mode 100644
index 0000000000..c419d49b14
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS_CRACKED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS_MOSSY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS_MOSSY.png
new file mode 100644
index 0000000000..28f899dcf5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_BRICKS_MOSSY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_COBBLE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_COBBLE.png
new file mode 100644
index 0000000000..0f9c40f2e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_COBBLE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_COBBLE_MOSSY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_COBBLE_MOSSY.png
new file mode 100644
index 0000000000..7a7897022d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_COBBLE_MOSSY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_SMOOTH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_SMOOTH.png
new file mode 100644
index 0000000000..6c7947cc92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_SMOOTH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_STONE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_STONE.png
new file mode 100644
index 0000000000..627d5e9f42
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/CONCRETE_LIGHT_STONE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/COVER_WOOD_PLATE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/COVER_WOOD_PLATE.png
new file mode 100644
index 0000000000..f09e8064a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/COVER_WOOD_PLATE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BACK_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP.png
new file mode 100644
index 0000000000..cf19cb677f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_ACTIVE.png
new file mode 100644
index 0000000000..1b027742ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DIESEL_GENERATOR_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DRONE_CENTRE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DRONE_CENTRE_ACTIVE.png
new file mode 100644
index 0000000000..3590515cb8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DRONE_CENTRE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DRONE_CENTRE_FACE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DRONE_CENTRE_FACE.png
new file mode 100644
index 0000000000..53488e032a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DRONE_CENTRE_FACE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/DRONE_CENTRE_INACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DRONE_CENTRE_INACTIVE.png
new file mode 100644
index 0000000000..04f37eb57d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/DRONE_CENTRE_INACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EV_SIDE_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EV_SIDE_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..b9ea408c50
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EV_SIDE_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/EV_TOP_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EV_TOP_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..dbe5fc3851
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/EV_TOP_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FLUID_IN_SIGN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FLUID_IN_SIGN.png
new file mode 100644
index 0000000000..a78a13db69
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FLUID_IN_SIGN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FLUID_OUT_SIGN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FLUID_OUT_SIGN.png
new file mode 100644
index 0000000000..60aa2fe90a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FLUID_OUT_SIGN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_1.png
new file mode 100644
index 0000000000..b9e6f38a1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_10.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_10.png
new file mode 100644
index 0000000000..002a2770ec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_10.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_11.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_11.png
new file mode 100644
index 0000000000..4e283b2b7f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_11.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_12.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_12.png
new file mode 100644
index 0000000000..ebcf5e02f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_12.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_2.png
new file mode 100644
index 0000000000..749a660b8e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_3.png
new file mode 100644
index 0000000000..08fa18e189
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_4.png
new file mode 100644
index 0000000000..e35b9df65e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_5.png
new file mode 100644
index 0000000000..4632a3a697
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_6.png
new file mode 100644
index 0000000000..1051cd2e98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_7.png
new file mode 100644
index 0000000000..2a946645a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_8.png
new file mode 100644
index 0000000000..3d94230f3d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_9.png
new file mode 100644
index 0000000000..175e62feb5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONII_9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_1.png
new file mode 100644
index 0000000000..ec5dac4fab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_10.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_10.png
new file mode 100644
index 0000000000..c339903c90
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_10.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_11.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_11.png
new file mode 100644
index 0000000000..ddab27fbd6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_11.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_12.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_12.png
new file mode 100644
index 0000000000..41f4993180
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_12.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_2.png
new file mode 100644
index 0000000000..49d9fea7ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_3.png
new file mode 100644
index 0000000000..0d703c4fc9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_4.png
new file mode 100644
index 0000000000..b3cfa736d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_5.png
new file mode 100644
index 0000000000..c6919c8a70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_6.png
new file mode 100644
index 0000000000..bc94d815c4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_7.png
new file mode 100644
index 0000000000..b9a0bff39a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_8.png
new file mode 100644
index 0000000000..6f00899cfc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_9.png
new file mode 100644
index 0000000000..699b0feb41
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/FUSIONI_9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BACK_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE.png
new file mode 100644
index 0000000000..fdfdeb0be7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..677f8bccf7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GAS_TURBINE_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS.png
new file mode 100644
index 0000000000..292629cd87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS_CHISELED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS_CHISELED.png
new file mode 100644
index 0000000000..171b6c28e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS_CHISELED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS_CRACKED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS_CRACKED.png
new file mode 100644
index 0000000000..9e91d536c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS_CRACKED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS_MOSSY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS_MOSSY.png
new file mode 100644
index 0000000000..217bd12d9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_BRICKS_MOSSY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_COBBLE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_COBBLE.png
new file mode 100644
index 0000000000..06a2e3f599
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_COBBLE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_COBBLE_MOSSY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_COBBLE_MOSSY.png
new file mode 100644
index 0000000000..c3d6d7a6f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_COBBLE_MOSSY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_SMOOTH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_SMOOTH.png
new file mode 100644
index 0000000000..3fad69e578
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_SMOOTH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_STONE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_STONE.png
new file mode 100644
index 0000000000..40a09d23a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_BLACK_STONE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS.png
new file mode 100644
index 0000000000..ed1caa5ded
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS_CHISELED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS_CHISELED.png
new file mode 100644
index 0000000000..81f07bcfed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS_CHISELED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS_CRACKED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS_CRACKED.png
new file mode 100644
index 0000000000..a07381f680
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS_CRACKED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS_MOSSY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS_MOSSY.png
new file mode 100644
index 0000000000..8de88f6906
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_BRICKS_MOSSY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_COBBLE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_COBBLE.png
new file mode 100644
index 0000000000..3a23ac1df6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_COBBLE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_COBBLE_MOSSY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_COBBLE_MOSSY.png
new file mode 100644
index 0000000000..b632390457
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_COBBLE_MOSSY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_SMOOTH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_SMOOTH.png
new file mode 100644
index 0000000000..c9d3d7f2bf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_SMOOTH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_STONE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_STONE.png
new file mode 100644
index 0000000000..05388e92f3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRANITE_RED_STONE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/HIDDEN_FACE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/HIDDEN_FACE.png
new file mode 100644
index 0000000000..a9c630ccf5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/HIDDEN_FACE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/HV_SIDE_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/HV_SIDE_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..39721ddc88
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/HV_SIDE_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/HV_TOP_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/HV_TOP_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..f3057ab530
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/HV_TOP_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/INFINITY_COOLED_CASING.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INFINITY_COOLED_CASING.png
new file mode 100644
index 0000000000..8e150d349b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INFINITY_COOLED_CASING.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_FULL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_FULL.png
new file mode 100644
index 0000000000..e9cffc1ec1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_FULL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_HUGE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_HUGE.png
new file mode 100644
index 0000000000..2b29947867
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_HUGE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_LARGE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_LARGE.png
new file mode 100644
index 0000000000..2052ca249e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_LARGE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_MEDIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_MEDIUM.png
new file mode 100644
index 0000000000..823363d223
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_MEDIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_MEDIUM_PLUS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_MEDIUM_PLUS.png
new file mode 100644
index 0000000000..d3fc1aff94
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_MEDIUM_PLUS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_SMALL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_SMALL.png
new file mode 100644
index 0000000000..57e94bf13b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_SMALL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_TINY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_TINY.png
new file mode 100644
index 0000000000..b237e8e873
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/INSULATION_TINY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ITEM_IN_SIGN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ITEM_IN_SIGN.png
new file mode 100644
index 0000000000..10dd12f753
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ITEM_IN_SIGN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ITEM_OUT_SIGN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ITEM_OUT_SIGN.png
new file mode 100644
index 0000000000..831650cb28
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ITEM_OUT_SIGN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/IV_SIDE_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/IV_SIDE_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..374a135d4a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/IV_SIDE_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/IV_TOP_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/IV_TOP_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..c20fe549dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/IV_TOP_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS1.png
new file mode 100644
index 0000000000..09d8066e4b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS2.png
new file mode 100644
index 0000000000..4ce7098fd8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS3.png
new file mode 100644
index 0000000000..46cb0903bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS4.png
new file mode 100644
index 0000000000..de59252d9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS5.png
new file mode 100644
index 0000000000..dcde344b87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS6.png
new file mode 100644
index 0000000000..b61bbebecc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS7.png
new file mode 100644
index 0000000000..f3e15ad122
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS8.png
new file mode 100644
index 0000000000..493568008a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS9.png
new file mode 100644
index 0000000000..2d448dbd0a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE1.png
new file mode 100644
index 0000000000..1f9f2998c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE1.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE2.png
new file mode 100644
index 0000000000..2c5476c9f4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE2.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE2.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE3.png
new file mode 100644
index 0000000000..2f5b6044bc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE3.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE3.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE4.png
new file mode 100644
index 0000000000..54cccc761e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE4.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE4.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE5.png
new file mode 100644
index 0000000000..2cce4a9708
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE5.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE5.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE6.png
new file mode 100644
index 0000000000..ea82c1bad3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE6.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE6.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE7.png
new file mode 100644
index 0000000000..ae1201ba48
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE7.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE7.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE7.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE8.png
new file mode 100644
index 0000000000..ece5461b1d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE8.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE8.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE8.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE9.png
new file mode 100644
index 0000000000..cd29da70ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE9.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE9.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_ACTIVE9.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY1.png
new file mode 100644
index 0000000000..d188b831b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY2.png
new file mode 100644
index 0000000000..73126dc860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY3.png
new file mode 100644
index 0000000000..7ecb28e141
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY4.png
new file mode 100644
index 0000000000..4e229db569
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY5.png
new file mode 100644
index 0000000000..aa3d3dbcfb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY6.png
new file mode 100644
index 0000000000..119a4492a0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY7.png
new file mode 100644
index 0000000000..3423620f9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY8.png
new file mode 100644
index 0000000000..1d6e5dc961
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY9.png
new file mode 100644
index 0000000000..be4a9c95c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ADVGAS_EMPTY9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW1.png
new file mode 100644
index 0000000000..b53c1f2681
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW2.png
new file mode 100644
index 0000000000..24d9d1aadf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW3.png
new file mode 100644
index 0000000000..017b8e5f96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW4.png
new file mode 100644
index 0000000000..139aa6153e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW5.png
new file mode 100644
index 0000000000..1d766141ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW6.png
new file mode 100644
index 0000000000..33521a76b8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW7.png
new file mode 100644
index 0000000000..042928f18d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW8.png
new file mode 100644
index 0000000000..2cebaade18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW9.png
new file mode 100644
index 0000000000..6b8796b19d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE1.png
new file mode 100644
index 0000000000..6fc07bd834
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE1.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE2.png
new file mode 100644
index 0000000000..16f5a5e162
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE2.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE2.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE3.png
new file mode 100644
index 0000000000..2f7ec74446
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE3.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE3.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE4.png
new file mode 100644
index 0000000000..9d94f3a385
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE4.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE4.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE5.png
new file mode 100644
index 0000000000..86bb3cf410
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE5.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE5.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE6.png
new file mode 100644
index 0000000000..9097d5a1fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE6.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE6.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE7.png
new file mode 100644
index 0000000000..dfd80aac3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE7.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE7.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE7.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE8.png
new file mode 100644
index 0000000000..af406aa82b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE8.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE8.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE8.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE9.png
new file mode 100644
index 0000000000..8fdd707883
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE9.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE9.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_ACTIVE9.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY1.png
new file mode 100644
index 0000000000..42ded0e37e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY2.png
new file mode 100644
index 0000000000..c1763167e3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY3.png
new file mode 100644
index 0000000000..7d7bea9fe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY4.png
new file mode 100644
index 0000000000..2fc7cc6ffd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY5.png
new file mode 100644
index 0000000000..90cdb68e5e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY6.png
new file mode 100644
index 0000000000..14c25645fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY7.png
new file mode 100644
index 0000000000..86ed8e0408
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY8.png
new file mode 100644
index 0000000000..2fd57caecd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY9.png
new file mode 100644
index 0000000000..1425082480
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_NEW_EMPTY9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS1.png
new file mode 100644
index 0000000000..004ec0f254
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS2.png
new file mode 100644
index 0000000000..79ad951be1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS3.png
new file mode 100644
index 0000000000..a5184b7898
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS4.png
new file mode 100644
index 0000000000..b2311e94ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS5.png
new file mode 100644
index 0000000000..dcde344b87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS6.png
new file mode 100644
index 0000000000..4958cce459
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS7.png
new file mode 100644
index 0000000000..0753811059
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS8.png
new file mode 100644
index 0000000000..4ccaa97329
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS9.png
new file mode 100644
index 0000000000..dfd9479338
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE1.png
new file mode 100644
index 0000000000..4b802176ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE1.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE2.png
new file mode 100644
index 0000000000..ee1551e047
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE2.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE2.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE3.png
new file mode 100644
index 0000000000..dfe64e4776
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE3.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE3.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE4.png
new file mode 100644
index 0000000000..8b9f753ba8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE4.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE4.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE5.png
new file mode 100644
index 0000000000..2cce4a9708
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE5.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE5.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE6.png
new file mode 100644
index 0000000000..6c886ecda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE6.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE6.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE7.png
new file mode 100644
index 0000000000..c40f063cce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE7.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE7.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE7.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE8.png
new file mode 100644
index 0000000000..91127c625f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE8.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE8.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE8.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE9.png
new file mode 100644
index 0000000000..d975945058
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE9.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE9.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_ACTIVE9.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY1.png
new file mode 100644
index 0000000000..6a41c86dd5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY2.png
new file mode 100644
index 0000000000..3d32b11983
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY3.png
new file mode 100644
index 0000000000..6fb4127607
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY4.png
new file mode 100644
index 0000000000..b25085387d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY5.png
new file mode 100644
index 0000000000..aa3d3dbcfb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY6.png
new file mode 100644
index 0000000000..19ff392b46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY7.png
new file mode 100644
index 0000000000..3ca3be3dc8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY8.png
new file mode 100644
index 0000000000..cdf3d97d78
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY9.png
new file mode 100644
index 0000000000..0f2fc4e00e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_SS_EMPTY9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST1.png
new file mode 100644
index 0000000000..30fc8fe03b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST2.png
new file mode 100644
index 0000000000..fadc29b6dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST3.png
new file mode 100644
index 0000000000..ff182b70bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST4.png
new file mode 100644
index 0000000000..42b0c2c160
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST5.png
new file mode 100644
index 0000000000..fde6f39975
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST6.png
new file mode 100644
index 0000000000..16aa3769e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST7.png
new file mode 100644
index 0000000000..51eadce638
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST8.png
new file mode 100644
index 0000000000..24809b98fd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST9.png
new file mode 100644
index 0000000000..750953c6f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE1.png
new file mode 100644
index 0000000000..08395c8052
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE1.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE2.png
new file mode 100644
index 0000000000..a3c15fa2dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE2.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE2.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE3.png
new file mode 100644
index 0000000000..bd0f5ec600
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE3.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE3.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE4.png
new file mode 100644
index 0000000000..2a50138fec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE4.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE4.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE5.png
new file mode 100644
index 0000000000..767d417a1b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE5.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE5.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE6.png
new file mode 100644
index 0000000000..8c8c870bad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE6.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE6.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE7.png
new file mode 100644
index 0000000000..98df1893ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE7.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE7.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE7.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE8.png
new file mode 100644
index 0000000000..118fefa040
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE8.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE8.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE8.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE9.png
new file mode 100644
index 0000000000..2a6293ceae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE9.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE9.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_ACTIVE9.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY1.png
new file mode 100644
index 0000000000..624af669b0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY2.png
new file mode 100644
index 0000000000..c963e97300
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY3.png
new file mode 100644
index 0000000000..1312e0318d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY4.png
new file mode 100644
index 0000000000..2b0593ecba
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY5.png
new file mode 100644
index 0000000000..aa3d3dbcfb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY6.png
new file mode 100644
index 0000000000..aca8ecaa1d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY7.png
new file mode 100644
index 0000000000..116054a6b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY8.png
new file mode 100644
index 0000000000..7478169715
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY9.png
new file mode 100644
index 0000000000..320f544761
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_ST_EMPTY9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI1.png
new file mode 100644
index 0000000000..4e5249c378
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI2.png
new file mode 100644
index 0000000000..48e308765f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI3.png
new file mode 100644
index 0000000000..a3822e4b42
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI4.png
new file mode 100644
index 0000000000..d0c1ee62d5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI5.png
new file mode 100644
index 0000000000..dcde344b87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI6.png
new file mode 100644
index 0000000000..dd8429cba1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI7.png
new file mode 100644
index 0000000000..e1746aa139
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI8.png
new file mode 100644
index 0000000000..98b57d4020
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI9.png
new file mode 100644
index 0000000000..f80aa74a9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE1.png
new file mode 100644
index 0000000000..e1e3d3302a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE1.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE2.png
new file mode 100644
index 0000000000..6e95e55c64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE2.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE2.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE3.png
new file mode 100644
index 0000000000..55239f143b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE3.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE3.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE4.png
new file mode 100644
index 0000000000..69798cbebd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE4.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE4.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE5.png
new file mode 100644
index 0000000000..2cce4a9708
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE5.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE5.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE6.png
new file mode 100644
index 0000000000..18642b9460
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE6.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE6.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE7.png
new file mode 100644
index 0000000000..4337bbad4d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE7.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE7.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE7.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE8.png
new file mode 100644
index 0000000000..229dc5d4fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE8.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE8.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE8.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE9.png
new file mode 100644
index 0000000000..bb51f4c649
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE9.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE9.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_ACTIVE9.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY1.png
new file mode 100644
index 0000000000..0d5933914a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY2.png
new file mode 100644
index 0000000000..4af9bf6a89
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY3.png
new file mode 100644
index 0000000000..4db9579f97
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY4.png
new file mode 100644
index 0000000000..a46f1ea5a0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY5.png
new file mode 100644
index 0000000000..aa3d3dbcfb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY6.png
new file mode 100644
index 0000000000..88a5fa24b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY7.png
new file mode 100644
index 0000000000..45c8412509
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY8.png
new file mode 100644
index 0000000000..adddc4fe9e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY9.png
new file mode 100644
index 0000000000..c67487b604
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TI_EMPTY9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU1.png
new file mode 100644
index 0000000000..90683a70b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU2.png
new file mode 100644
index 0000000000..608cf429a1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU3.png
new file mode 100644
index 0000000000..2a40881a3a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU4.png
new file mode 100644
index 0000000000..224ddd76da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU5.png
new file mode 100644
index 0000000000..dcde344b87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU6.png
new file mode 100644
index 0000000000..54c1c74848
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU7.png
new file mode 100644
index 0000000000..ec2429af5b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU8.png
new file mode 100644
index 0000000000..bbebbee3cd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU9.png
new file mode 100644
index 0000000000..e18baae9ee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE1.png
new file mode 100644
index 0000000000..2b66dc1c2b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE1.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE2.png
new file mode 100644
index 0000000000..a729c157e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE2.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE2.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE3.png
new file mode 100644
index 0000000000..f7f4b76db0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE3.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE3.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE4.png
new file mode 100644
index 0000000000..37276a9be7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE4.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE4.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE5.png
new file mode 100644
index 0000000000..2cce4a9708
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE5.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE5.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE6.png
new file mode 100644
index 0000000000..0d13cb3e39
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE6.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE6.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE7.png
new file mode 100644
index 0000000000..d6b4c8595d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE7.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE7.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE7.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE8.png
new file mode 100644
index 0000000000..82c38f15ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE8.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE8.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE8.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE9.png
new file mode 100644
index 0000000000..2a6d637921
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE9.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE9.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_ACTIVE9.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY1.png
new file mode 100644
index 0000000000..8cd8a7dc3f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY2.png
new file mode 100644
index 0000000000..af5b6fd03d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY3.png
new file mode 100644
index 0000000000..26dd30c812
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY4.png
new file mode 100644
index 0000000000..ef76bb4bbb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY5.png
new file mode 100644
index 0000000000..aa3d3dbcfb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY6.png
new file mode 100644
index 0000000000..66a49cc191
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY7.png
new file mode 100644
index 0000000000..fe683aa60f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY8.png
new file mode 100644
index 0000000000..631ab53d0a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY9.png
new file mode 100644
index 0000000000..53acaa9d33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LARGETURBINE_TU_EMPTY9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LONG_DISTANCE_PIPE_FLUID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LONG_DISTANCE_PIPE_FLUID.png
new file mode 100644
index 0000000000..46d0265b32
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LONG_DISTANCE_PIPE_FLUID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LONG_DISTANCE_PIPE_ITEM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LONG_DISTANCE_PIPE_ITEM.png
new file mode 100644
index 0000000000..1765f6d855
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LONG_DISTANCE_PIPE_ITEM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LuV_SIDE_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LuV_SIDE_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..a14b97b6b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LuV_SIDE_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/LuV_TOP_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LuV_TOP_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..02a39ee7af
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/LuV_TOP_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_8V_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_8V_BOTTOM.png
new file mode 100644
index 0000000000..90d39ea426
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_8V_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_8V_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_8V_SIDE.png
new file mode 100644
index 0000000000..ceddc62efc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_8V_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_8V_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_8V_TOP.png
new file mode 100644
index 0000000000..3e13c45d47
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_8V_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBLASTFURNACE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBLASTFURNACE.png
new file mode 100644
index 0000000000..307c4c2524
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBLASTFURNACE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBLASTFURNACE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBLASTFURNACE_ACTIVE.png
new file mode 100644
index 0000000000..f5caa8efcd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBLASTFURNACE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBLASTFURNACE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBLASTFURNACE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a421d06281
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBLASTFURNACE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBRICKS_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBRICKS_BOTTOM.png
new file mode 100644
index 0000000000..152f8123a7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBRICKS_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBRICKS_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBRICKS_SIDE.png
new file mode 100644
index 0000000000..aa86bdbdc1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBRICKS_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBRICKS_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBRICKS_TOP.png
new file mode 100644
index 0000000000..e03a570c32
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEBRICKS_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEPLATEDBRICKS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEPLATEDBRICKS.png
new file mode 100644
index 0000000000..03ebb8314a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZEPLATEDBRICKS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZE_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZE_BOTTOM.png
new file mode 100644
index 0000000000..7a9f6ed0c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZE_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZE_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZE_SIDE.png
new file mode 100644
index 0000000000..9306aa1334
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZE_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZE_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZE_TOP.png
new file mode 100644
index 0000000000..e03a570c32
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_BRONZE_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ACIDHAZARD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ACIDHAZARD.png
new file mode 100644
index 0000000000..3c0e297f26
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ACIDHAZARD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ADVANCEDGAS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ADVANCEDGAS.png
new file mode 100644
index 0000000000..9ef0882f15
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ADVANCEDGAS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ADVANCEDRADIATIONPROOF.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ADVANCEDRADIATIONPROOF.png
new file mode 100644
index 0000000000..b38326d1f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ADVANCEDRADIATIONPROOF.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ASSEMBLER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ASSEMBLER.png
new file mode 100644
index 0000000000..340bfeddc4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ASSEMBLER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BIOHAZARD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BIOHAZARD.png
new file mode 100644
index 0000000000..a096022dfa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BIOHAZARD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE.png
new file mode 100644
index 0000000000..93d30f6ea6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..e602aac20b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BRICKEDBLASTFURNACE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BRICKEDBLASTFURNACE_INACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BRICKEDBLASTFURNACE_INACTIVE.png
new file mode 100644
index 0000000000..935fe84311
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_BRICKEDBLASTFURNACE_INACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_CHEMICALLY_INERT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_CHEMICALLY_INERT.png
new file mode 100644
index 0000000000..84cd5fa9f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_CHEMICALLY_INERT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_CLEAN_STAINLESSSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_CLEAN_STAINLESSSTEEL.png
new file mode 100644
index 0000000000..99f62d97a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_CLEAN_STAINLESSSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_CONTAINMENT_FIELD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_CONTAINMENT_FIELD.png
new file mode 100644
index 0000000000..340bfeddc4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_CONTAINMENT_FIELD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DATA_DRIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DATA_DRIVE.png
new file mode 100644
index 0000000000..340bfeddc4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DATA_DRIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DENSEBRICKS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DENSEBRICKS.png
new file mode 100644
index 0000000000..3d27aa2f32
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DENSEBRICKS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DRAGONEGG.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DRAGONEGG.png
new file mode 100644
index 0000000000..1324f3ebc4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DRAGONEGG.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DRAGONEGG_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DRAGONEGG_GLOW.png
new file mode 100644
index 0000000000..42b09642ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_DRAGONEGG_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ENGINE_INTAKE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ENGINE_INTAKE.png
new file mode 100644
index 0000000000..399d804d08
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ENGINE_INTAKE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_EXPLOSIONHAZARD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_EXPLOSIONHAZARD.png
new file mode 100644
index 0000000000..bb884669df
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_EXPLOSIONHAZARD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_EXTREME_ENGINE_INTAKE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_EXTREME_ENGINE_INTAKE.png
new file mode 100644
index 0000000000..4cd32d13b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_EXTREME_ENGINE_INTAKE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_BRONZE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_BRONZE.png
new file mode 100644
index 0000000000..b4629bda8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_BRONZE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_STEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_STEEL.png
new file mode 100644
index 0000000000..c91be1375d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_STEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_TITANIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_TITANIUM.png
new file mode 100644
index 0000000000..6e15675d50
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_TITANIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_TUNGSTENSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_TUNGSTENSTEEL.png
new file mode 100644
index 0000000000..e12bc914fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREBOX_TUNGSTENSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREHAZARD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREHAZARD.png
new file mode 100644
index 0000000000..41176cfb6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FIREHAZARD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FROSTHAZARD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FROSTHAZARD.png
new file mode 100644
index 0000000000..d7db363020
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FROSTHAZARD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FROST_PROOF.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FROST_PROOF.png
new file mode 100644
index 0000000000..0b5014b152
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FROST_PROOF.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION.png
new file mode 100644
index 0000000000..6f00899cfc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_2.png
new file mode 100644
index 0000000000..3d94230f3d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL.png
new file mode 100644
index 0000000000..dfaee6cebd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_COIL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS.png
new file mode 100644
index 0000000000..cff8e298b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_YELLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_YELLOW.png
new file mode 100644
index 0000000000..bd7bd6fcd0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_YELLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW.png
new file mode 100644
index 0000000000..9713f3a517
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_FUSION_GLASS_YELLOW_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_BRONZE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_BRONZE.png
new file mode 100644
index 0000000000..caadc430ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_BRONZE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_STEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_STEEL.png
new file mode 100644
index 0000000000..8b3142daf4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_STEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_TITANIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_TITANIUM.png
new file mode 100644
index 0000000000..d7dd4c713a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_TITANIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_TUNGSTENSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_TUNGSTENSTEEL.png
new file mode 100644
index 0000000000..ad85b88dcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GEARBOX_TUNGSTENSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GRATE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GRATE.png
new file mode 100644
index 0000000000..b7ccb3fe63
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_GRATE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_IRIDIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_IRIDIUM.png
new file mode 100644
index 0000000000..f73e46bb17
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_IRIDIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC.png
new file mode 100644
index 0000000000..89d7f8c3ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGICAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGICAL.png
new file mode 100644
index 0000000000..1237b73c2e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGICAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGICHAZARD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGICHAZARD.png
new file mode 100644
index 0000000000..71e7f3a956
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGICHAZARD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_ACTIVE.png
new file mode 100644
index 0000000000..a8c6158858
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..c30e3d06bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT.png
new file mode 100644
index 0000000000..b62b9dd2e4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..277fb0795b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..ebf193b48c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT_GLOW.png
new file mode 100644
index 0000000000..1e217dba1f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_GLOW.png
new file mode 100644
index 0000000000..ec066d8750
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MAGIC_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MINING_BLACKPLUTONIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MINING_BLACKPLUTONIUM.png
new file mode 100644
index 0000000000..a0d7ab77e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MINING_BLACKPLUTONIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MINING_NEUTRONIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MINING_NEUTRONIUM.png
new file mode 100644
index 0000000000..2e78b8a4ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MINING_NEUTRONIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MINING_OSMIRIDIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MINING_OSMIRIDIUM.png
new file mode 100644
index 0000000000..8d238f65fd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MINING_OSMIRIDIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MOTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MOTOR.png
new file mode 100644
index 0000000000..340bfeddc4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_MOTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_NOISEHAZARD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_NOISEHAZARD.png
new file mode 100644
index 0000000000..7189ed4bd7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_NOISEHAZARD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_1.png
new file mode 100644
index 0000000000..4dc9132502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_2.png
new file mode 100644
index 0000000000..fb2526aefe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_3.png
new file mode 100644
index 0000000000..ceebd1d088
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PCB_TIER_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_BRONZE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_BRONZE.png
new file mode 100644
index 0000000000..7a0c2be4bd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_BRONZE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_POLYBENZIMIDAZOLE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_POLYBENZIMIDAZOLE.png
new file mode 100644
index 0000000000..c4e8fac647
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_POLYBENZIMIDAZOLE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_POLYTETRAFLUOROETHYLENE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_POLYTETRAFLUOROETHYLENE.png
new file mode 100644
index 0000000000..5fb5d7386e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_POLYTETRAFLUOROETHYLENE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_STEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_STEEL.png
new file mode 100644
index 0000000000..6d8c956606
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_STEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_TITANIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_TITANIUM.png
new file mode 100644
index 0000000000..2cc6fe70fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_TITANIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_TUNGSTENSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_TUNGSTENSTEEL.png
new file mode 100644
index 0000000000..94cfb8d6c4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PIPE_TUNGSTENSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PROCESSOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PROCESSOR.png
new file mode 100644
index 0000000000..340bfeddc4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PROCESSOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PUMP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PUMP.png
new file mode 100644
index 0000000000..340bfeddc4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_PUMP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIANT_NAQUADAH_ALLOY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIANT_NAQUADAH_ALLOY.png
new file mode 100644
index 0000000000..d16156a617
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIANT_NAQUADAH_ALLOY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIATIONPROOF.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIATIONPROOF.png
new file mode 100644
index 0000000000..44a25d56aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIATIONPROOF.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIOACTIVEHAZARD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIOACTIVEHAZARD.png
new file mode 100644
index 0000000000..e19d365d19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RADIOACTIVEHAZARD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RHODIUM_PALLADIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RHODIUM_PALLADIUM.png
new file mode 100644
index 0000000000..2e1fcd127a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_RHODIUM_PALLADIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ROBUST_TUNGSTENSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ROBUST_TUNGSTENSTEEL.png
new file mode 100644
index 0000000000..54c501220d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_ROBUST_TUNGSTENSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_SOLID_STEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_SOLID_STEEL.png
new file mode 100644
index 0000000000..340bfeddc4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_SOLID_STEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_STABLE_TITANIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_STABLE_TITANIUM.png
new file mode 100644
index 0000000000..12c0e62035
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_STABLE_TITANIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_STRIPES_A.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_STRIPES_A.png
new file mode 100644
index 0000000000..7008e22cb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_STRIPES_A.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_STRIPES_B.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_STRIPES_B.png
new file mode 100644
index 0000000000..3d887d3f1c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_STRIPES_B.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK.png
new file mode 100644
index 0000000000..45c31dc5e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_0.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_0.png
new file mode 100644
index 0000000000..97c01b41dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_1.png
new file mode 100644
index 0000000000..3f3248455d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_10.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_10.png
new file mode 100644
index 0000000000..43d6d537fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_10.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_11.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_11.png
new file mode 100644
index 0000000000..95c337e63b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_11.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_12.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_12.png
new file mode 100644
index 0000000000..0cc3a19272
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_12.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_13.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_13.png
new file mode 100644
index 0000000000..5255825f04
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_13.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_14.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_14.png
new file mode 100644
index 0000000000..6bb0376221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_14.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_15.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_15.png
new file mode 100644
index 0000000000..79f099e200
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_15.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_2.png
new file mode 100644
index 0000000000..bbe7252571
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_3.png
new file mode 100644
index 0000000000..c796efe19b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_4.png
new file mode 100644
index 0000000000..c796efe19b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_5.png
new file mode 100644
index 0000000000..4b166a76ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_6.png
new file mode 100644
index 0000000000..df0719a968
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_7.png
new file mode 100644
index 0000000000..abb72e9575
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_8.png
new file mode 100644
index 0000000000..abb72e9575
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_9.png
new file mode 100644
index 0000000000..926c42fb53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TANK_9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TURBINE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TURBINE.png
new file mode 100644
index 0000000000..340bfeddc4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_TURBINE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_VENT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_VENT.png
new file mode 100644
index 0000000000..6cf486e536
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_VENT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_VENT_T2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_VENT_T2.png
new file mode 100644
index 0000000000..9f614ff182
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_CASING_VENT_T2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_AWAKENEDDRACONIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_AWAKENEDDRACONIUM.png
new file mode 100644
index 0000000000..59b530b2c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_AWAKENEDDRACONIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_CUPRONICKEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_CUPRONICKEL.png
new file mode 100644
index 0000000000..afecc4d0a9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_CUPRONICKEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_ELECTRUMFLUX.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_ELECTRUMFLUX.png
new file mode 100644
index 0000000000..53f5d7dc03
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_ELECTRUMFLUX.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_ETERNAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_ETERNAL.png
new file mode 100644
index 0000000000..e0835cc6e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_ETERNAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_ETERNAL.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_ETERNAL.png.mcmeta
new file mode 100644
index 0000000000..6575dfcc65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_ETERNAL.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HSSG.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HSSG.png
new file mode 100644
index 0000000000..7d45e602c5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HSSG.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HSSS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HSSS.png
new file mode 100644
index 0000000000..a39d9a2d19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HSSS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HYPOGEN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HYPOGEN.png
new file mode 100644
index 0000000000..78d53d98fd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HYPOGEN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HYPOGEN.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HYPOGEN.png.mcmeta
new file mode 100644
index 0000000000..a668e18a77
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_HYPOGEN.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 2}}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_INFINITY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_INFINITY.png
new file mode 100644
index 0000000000..940f7bbdd0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_INFINITY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_INFINITY.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_INFINITY.png.mcmeta
new file mode 100644
index 0000000000..eebd2d1c9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_INFINITY.png.mcmeta
@@ -0,0 +1,37 @@
+{
+ "animation": {
+ "frametime": 1,
+ "frames": [
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 3,
+ 3,
+ 4,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 4,
+ 3,
+ 3,
+ 2,
+ 2,
+ 2,
+ 1,
+ 1,
+ 1
+ ]
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_KANTHAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_KANTHAL.png
new file mode 100644
index 0000000000..a904785794
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_KANTHAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_NAQUADAH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_NAQUADAH.png
new file mode 100644
index 0000000000..6ff3d854b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_NAQUADAH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_NAQUADAHALLOY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_NAQUADAHALLOY.png
new file mode 100644
index 0000000000..30a2735447
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_NAQUADAHALLOY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_NICHROME.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_NICHROME.png
new file mode 100644
index 0000000000..cda6c05ed8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_NICHROME.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_SUPERCONDUCTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_SUPERCONDUCTOR.png
new file mode 100644
index 0000000000..a0047463f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_SUPERCONDUCTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_TRINIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_TRINIUM.png
new file mode 100644
index 0000000000..a1bcd64ca0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_TRINIUM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_TUNGSTENSTEEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_TUNGSTENSTEEL.png
new file mode 100644
index 0000000000..d0c36a2be6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_COIL_TUNGSTENSTEEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_BRIDGE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_BRIDGE.png
new file mode 100644
index 0000000000..a6971e35d6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_BRIDGE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_BRIDGE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_BRIDGE.png.mcmeta
new file mode 100644
index 0000000000..60af678259
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_BRIDGE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":4
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_INJECTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_INJECTOR.png
new file mode 100644
index 0000000000..14be7bde16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_INJECTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_TRANS_CASING.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_TRANS_CASING.png
new file mode 100644
index 0000000000..4abdbdd036
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_DIM_TRANS_CASING.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_EV_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_EV_BOTTOM.png
new file mode 100644
index 0000000000..d34771fcf7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_EV_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_EV_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_EV_SIDE.png
new file mode 100644
index 0000000000..ba12ea4293
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_EV_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_EV_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_EV_TOP.png
new file mode 100644
index 0000000000..c1d75e3021
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_EV_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HEATPROOFCASING.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HEATPROOFCASING.png
new file mode 100644
index 0000000000..c7198d75e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HEATPROOFCASING.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HV_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HV_BOTTOM.png
new file mode 100644
index 0000000000..352cb0fcab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HV_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HV_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HV_SIDE.png
new file mode 100644
index 0000000000..a72b8ea0d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HV_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HV_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HV_TOP.png
new file mode 100644
index 0000000000..745aee8977
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_HV_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_IV_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_IV_BOTTOM.png
new file mode 100644
index 0000000000..9a48e3b860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_IV_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_IV_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_IV_SIDE.png
new file mode 100644
index 0000000000..9ce603fbef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_IV_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_IV_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_IV_TOP.png
new file mode 100644
index 0000000000..47c1f4c0c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_IV_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LV_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LV_BOTTOM.png
new file mode 100644
index 0000000000..e2246f1f33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LV_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LV_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LV_SIDE.png
new file mode 100644
index 0000000000..d2df0287c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LV_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LV_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LV_TOP.png
new file mode 100644
index 0000000000..3cb524643a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LV_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LuV_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LuV_BOTTOM.png
new file mode 100644
index 0000000000..f114f683a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LuV_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LuV_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LuV_SIDE.png
new file mode 100644
index 0000000000..0a54885e07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LuV_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LuV_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LuV_TOP.png
new file mode 100644
index 0000000000..0ad45f183e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_LuV_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_BOTTOM.png
new file mode 100644
index 0000000000..3efc74c93d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_SIDE.png
new file mode 100644
index 0000000000..3efc74c93d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_TOP.png
new file mode 100644
index 0000000000..3efc74c93d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAX_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAX_BOTTOM.png
new file mode 100644
index 0000000000..e12a32f3e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAX_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAX_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAX_SIDE.png
new file mode 100644
index 0000000000..272c7cd25c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAX_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAX_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAX_TOP.png
new file mode 100644
index 0000000000..7d208fcce4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAX_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MV_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MV_BOTTOM.png
new file mode 100644
index 0000000000..b5ec98c0c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MV_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MV_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MV_SIDE.png
new file mode 100644
index 0000000000..d02110d297
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MV_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MV_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MV_TOP.png
new file mode 100644
index 0000000000..9262df146a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MV_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEELBRICKS_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEELBRICKS_BOTTOM.png
new file mode 100644
index 0000000000..152f8123a7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEELBRICKS_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEELBRICKS_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEELBRICKS_SIDE.png
new file mode 100644
index 0000000000..98badacbf7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEELBRICKS_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEELBRICKS_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEELBRICKS_TOP.png
new file mode 100644
index 0000000000..247de337b1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEELBRICKS_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEEL_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEEL_BOTTOM.png
new file mode 100644
index 0000000000..6db30a76a9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEEL_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEEL_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEEL_SIDE.png
new file mode 100644
index 0000000000..a97386313b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEEL_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEEL_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEEL_TOP.png
new file mode 100644
index 0000000000..247de337b1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_STEEL_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_BOTTOM.png
new file mode 100644
index 0000000000..ddd577f426
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_SIDE.png
new file mode 100644
index 0000000000..ddd577f426
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_TOP.png
new file mode 100644
index 0000000000..ddd577f426
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_BOTTOM.png
new file mode 100644
index 0000000000..3c394b37ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_SIDE.png
new file mode 100644
index 0000000000..3c394b37ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_TOP.png
new file mode 100644
index 0000000000..3c394b37ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_BOTTOM.png
new file mode 100644
index 0000000000..e326b7b514
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_SIDE.png
new file mode 100644
index 0000000000..e326b7b514
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_TOP.png
new file mode 100644
index 0000000000..e326b7b514
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UV_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UV_BOTTOM.png
new file mode 100644
index 0000000000..113553200f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UV_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UV_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UV_SIDE.png
new file mode 100644
index 0000000000..d5f821c294
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UV_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UV_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UV_TOP.png
new file mode 100644
index 0000000000..44dd81aaf6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UV_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_BOTTOM.png
new file mode 100644
index 0000000000..f80a997fdb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_SIDE.png
new file mode 100644
index 0000000000..f80a997fdb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_TOP.png
new file mode 100644
index 0000000000..f80a997fdb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_ZPM_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_ZPM_BOTTOM.png
new file mode 100644
index 0000000000..575b112d48
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_ZPM_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_ZPM_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_ZPM_SIDE.png
new file mode 100644
index 0000000000..bb064c5c2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_ZPM_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_ZPM_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_ZPM_TOP.png
new file mode 100644
index 0000000000..7adb3c4187
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_ZPM_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS.png
new file mode 100644
index 0000000000..0a7a02f938
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS_CHISELED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS_CHISELED.png
new file mode 100644
index 0000000000..5a7461a53b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS_CHISELED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS_CRACKED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS_CRACKED.png
new file mode 100644
index 0000000000..d9fdaa6675
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS_CRACKED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS_MOSSY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS_MOSSY.png
new file mode 100644
index 0000000000..363a292d0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_BRICKS_MOSSY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_COBBLE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_COBBLE.png
new file mode 100644
index 0000000000..f4e00c76cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_COBBLE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_COBBLE_MOSSY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_COBBLE_MOSSY.png
new file mode 100644
index 0000000000..b7f8382227
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_COBBLE_MOSSY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_SMOOTH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_SMOOTH.png
new file mode 100644
index 0000000000..6b77cb9a6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_SMOOTH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_STONE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_STONE.png
new file mode 100644
index 0000000000..dd18a441d1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARBLE_STONE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MV_SIDE_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MV_SIDE_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..7774db3968
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MV_SIDE_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/MV_TOP_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MV_TOP_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..ff153a270b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/MV_TOP_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK.png
new file mode 100644
index 0000000000..fb01ee5110
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK_ACTIVE.png
new file mode 100644
index 0000000000..b1eb74c6dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..657967b64c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BACK_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT.png
new file mode 100644
index 0000000000..1d29b79990
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..d38dab0f2d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..657967b64c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE.png
new file mode 100644
index 0000000000..9681f8c3ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..9681f8c3ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP.png
new file mode 100644
index 0000000000..f2337775ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP_ACTIVE.png
new file mode 100644
index 0000000000..2a90c27c2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..6035b12841
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_FLUID_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK.png
new file mode 100644
index 0000000000..d7a53bd98e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK_ACTIVE.png
new file mode 100644
index 0000000000..b1eb74c6dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..657967b64c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BACK_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT.png
new file mode 100644
index 0000000000..933bcdb6fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..d38dab0f2d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..657967b64c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE.png
new file mode 100644
index 0000000000..9681f8c3ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..9681f8c3ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP.png
new file mode 100644
index 0000000000..91a470e3ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP_ACTIVE.png
new file mode 100644
index 0000000000..2a90c27c2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..6035b12841
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/NAQUADAH_REACTOR_SOLID_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ACTIVITYDETECTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ACTIVITYDETECTOR.png
new file mode 100644
index 0000000000..bc1af024b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ACTIVITYDETECTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ACTIVITYDETECTOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ACTIVITYDETECTOR_GLOW.png
new file mode 100644
index 0000000000..0a679a48a5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ACTIVITYDETECTOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ADVANCED_REDSTONE_RECEIVER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ADVANCED_REDSTONE_RECEIVER.png
new file mode 100644
index 0000000000..23fa0bb867
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ADVANCED_REDSTONE_RECEIVER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ADVANCED_REDSTONE_TRANSMITTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ADVANCED_REDSTONE_TRANSMITTER.png
new file mode 100644
index 0000000000..41812dd6bc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ADVANCED_REDSTONE_TRANSMITTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ADV_PUMP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ADV_PUMP.png
new file mode 100644
index 0000000000..962a52c203
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ADV_PUMP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ARM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ARM.png
new file mode 100644
index 0000000000..8dc963a676
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ARM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ARM.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ARM.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ARM.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE.png
new file mode 100644
index 0000000000..d47a19fce8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE.png.mcmeta
new file mode 100644
index 0000000000..1ec644560f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_GLOW.png
new file mode 100644
index 0000000000..2bebeecf90
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..1ec644560f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE.png
new file mode 100644
index 0000000000..592b4492e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE.png.mcmeta
new file mode 100644
index 0000000000..6dc440a949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 10
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE_GLOW.png
new file mode 100644
index 0000000000..1f48a83e4a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..6dc440a949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_AUTOMAINTENANCE_IDLE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 10
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_BOXINATOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_DISASSEMBLER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_INDUSTRIAL_APIARY_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_MASSFAB_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_POTIONBREWER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_REPLICATOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_ROCK_BREAKER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_SCANNER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_ALLOY_SMELTER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_COMPRESSOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_EXTRACTOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_FURNACE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_HAMMER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_BOTTOM_STEAM_MACERATOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CLOSET.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CLOSET.png
new file mode 100644
index 0000000000..a21d5086f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CLOSET.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CONTROLLER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CONTROLLER.png
new file mode 100644
index 0000000000..37c0e34da6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CONTROLLER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CONVEYOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CONVEYOR.png
new file mode 100644
index 0000000000..8dc963a676
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CONVEYOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CONVEYOR.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CONVEYOR.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CONVEYOR.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CRAFTING.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CRAFTING.png
new file mode 100644
index 0000000000..61622399b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_CRAFTING.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DATA_ACCESS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DATA_ACCESS.png
new file mode 100644
index 0000000000..6f866881c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DATA_ACCESS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DRAIN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DRAIN.png
new file mode 100644
index 0000000000..ba706d8b87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DRAIN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DRONE_MODULE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DRONE_MODULE_ACTIVE.png
new file mode 100644
index 0000000000..470e589b59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DRONE_MODULE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DTPF_OFF.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DTPF_OFF.png
new file mode 100644
index 0000000000..799aa1c111
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DTPF_OFF.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DTPF_ON.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DTPF_ON.png
new file mode 100644
index 0000000000..d50581425d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DTPF_ON.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DTPF_ON.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DTPF_ON.png.mcmeta
new file mode 100644
index 0000000000..f16b74ddb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DTPF_ON.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DUCTTAPE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DUCTTAPE.png
new file mode 100644
index 0000000000..6a20c381e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_DUCTTAPE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGYDETECTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGYDETECTOR.png
new file mode 100644
index 0000000000..2e6a2163b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGYDETECTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN.png
new file mode 100644
index 0000000000..6fa5ebcca4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_MULTI.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_MULTI.png
new file mode 100644
index 0000000000..003f1a8421
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_MULTI.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_POWER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_POWER.png
new file mode 100644
index 0000000000..e3371487d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_POWER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OFF_WIRELESS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OFF_WIRELESS.png
new file mode 100644
index 0000000000..af85482d1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OFF_WIRELESS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS.png
new file mode 100644
index 0000000000..d17f3f62bf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT.png
new file mode 100644
index 0000000000..0e0f2b40a1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_MULTI.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_MULTI.png
new file mode 100644
index 0000000000..ac3c05510a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_MULTI.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_POWER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_POWER.png
new file mode 100644
index 0000000000..459b7159b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_POWER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUIDDETECTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUIDDETECTOR.png
new file mode 100644
index 0000000000..9809bc86e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUIDDETECTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR0.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR0.png
new file mode 100644
index 0000000000..d9d5f1f816
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR1.png
new file mode 100644
index 0000000000..98a0aa32f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR10.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR10.png
new file mode 100644
index 0000000000..25800ca0a5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR10.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR11.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR11.png
new file mode 100644
index 0000000000..84230f719e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR11.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR12.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR12.png
new file mode 100644
index 0000000000..3108809659
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR12.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR13.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR13.png
new file mode 100644
index 0000000000..835dbe7d91
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR13.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR14.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR14.png
new file mode 100644
index 0000000000..ae65087ff8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR14.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR2.png
new file mode 100644
index 0000000000..4a1ae7635a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR3.png
new file mode 100644
index 0000000000..ebc0e64757
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR4.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR4.png
new file mode 100644
index 0000000000..917fcb960d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR5.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR5.png
new file mode 100644
index 0000000000..fa41c960e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR6.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR6.png
new file mode 100644
index 0000000000..85a2cef09a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR7.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR7.png
new file mode 100644
index 0000000000..12e17f4d3b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR8.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR8.png
new file mode 100644
index 0000000000..62d9bfc010
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR9.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR9.png
new file mode 100644
index 0000000000..b49dcad379
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FLUID_STORAGE_MONITOR9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ASSEMBLY_LINE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR.png
new file mode 100644
index 0000000000..b11b347248
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR_ACTIVE.png
new file mode 100644
index 0000000000..8f2098287c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_BOXINATOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DIESEL_ENGINE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISASSEMBLER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_DISTILLATION_TOWER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_EXTREME_DIESEL_ENGINE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_HEAT_EXCHANGER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_IMPLOSION_COMPRESSOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY.png
new file mode 100644
index 0000000000..be26694a46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE.png
new file mode 100644
index 0000000000..ec77fd0c2c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..07dc1943ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 3
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..281d3b4f0e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..07dc1943ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 3
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_INDUSTRIAL_APIARY_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_BOILER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_LARGE_CHEMICAL_REACTOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB.png
new file mode 100644
index 0000000000..fc58e56a99
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB_ACTIVE.png
new file mode 100644
index 0000000000..c97d81e592
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..ba1b81333b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MASSFAB_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_MULTI_SMELTER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_CRACKER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_OIL_DRILL_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ORE_DRILL_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER.png
new file mode 100644
index 0000000000..72f22b8b00
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER_ACTIVE.png
new file mode 100644
index 0000000000..99039b2493
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_POTIONBREWER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PROCESSING_ARRAY_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_PYROLYSE_OVEN_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR.png
new file mode 100644
index 0000000000..403fb43f74
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_ACTIVE.png
new file mode 100644
index 0000000000..3c33104003
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..5bcaf0f325
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..26bb55e207
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_REPLICATOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_RESEARCH_COMPLETER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER.png
new file mode 100644
index 0000000000..d9855c3e75
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE.png
new file mode 100644
index 0000000000..cb3a3a0354
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..07dc1943ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 3
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..cb3a3a0354
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..07dc1943ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 3
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_ROCK_BREAKER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_SCANNER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER.png
new file mode 100644
index 0000000000..1169d61fd2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE.png
new file mode 100644
index 0000000000..39668c4449
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..8c55b6bede
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW.png
new file mode 100644
index 0000000000..1089c4fccb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_ALLOY_SMELTER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR.png
new file mode 100644
index 0000000000..fcf3b8414a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE.png
new file mode 100644
index 0000000000..9004d79a03
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..1089c4fccb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW.png
new file mode 100644
index 0000000000..1089c4fccb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_COMPRESSOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR.png
new file mode 100644
index 0000000000..ddebe0341d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE.png
new file mode 100644
index 0000000000..6c015ee919
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..1089c4fccb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW.png
new file mode 100644
index 0000000000..1089c4fccb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_EXTRACTOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE.png
new file mode 100644
index 0000000000..4501b673f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE_ACTIVE.png
new file mode 100644
index 0000000000..048a041e1d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..bd3c3f542c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE_GLOW.png
new file mode 100644
index 0000000000..1089c4fccb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_FURNACE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER.png
new file mode 100644
index 0000000000..417481295f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER_ACTIVE.png
new file mode 100644
index 0000000000..2d1af03889
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..1089c4fccb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER_GLOW.png
new file mode 100644
index 0000000000..1089c4fccb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_HAMMER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR.png
new file mode 100644
index 0000000000..1de430e459
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE.png
new file mode 100644
index 0000000000..8ee256fa56
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..1089c4fccb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR_GLOW.png
new file mode 100644
index 0000000000..1089c4fccb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_STEAM_MACERATOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER_GLOW.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FRONT_VACUUM_FREEZER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1.png
new file mode 100644
index 0000000000..66f2ba6b82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1.png.mcmeta
new file mode 100644
index 0000000000..3de4a0bdd8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1_GLOW.png
new file mode 100644
index 0000000000..674a395344
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1_GLOW.png.mcmeta
new file mode 100644
index 0000000000..f16b74ddb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION1_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2.png
new file mode 100644
index 0000000000..66f2ba6b82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2.png.mcmeta
new file mode 100644
index 0000000000..3de4a0bdd8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2_GLOW.png
new file mode 100644
index 0000000000..674a395344
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2_GLOW.png.mcmeta
new file mode 100644
index 0000000000..f16b74ddb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION2_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3.png
new file mode 100644
index 0000000000..66f2ba6b82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3.png.mcmeta
new file mode 100644
index 0000000000..3de4a0bdd8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3_GLOW.png
new file mode 100644
index 0000000000..674a395344
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3_GLOW.png.mcmeta
new file mode 100644
index 0000000000..f16b74ddb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FUSION3_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_INPUT_HATCH_2x2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_INPUT_HATCH_2x2.png
new file mode 100644
index 0000000000..188c836a7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_INPUT_HATCH_2x2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ITEMDETECTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ITEMDETECTOR.png
new file mode 100644
index 0000000000..ad11ad157a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ITEMDETECTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LENS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LENS.png
new file mode 100644
index 0000000000..42a2aa7cff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LENS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER.png
new file mode 100644
index 0000000000..618b3fdd54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_000.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_000.png
new file mode 100644
index 0000000000..1089c4fccb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_000.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_001.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_001.png
new file mode 100644
index 0000000000..616c7ac842
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_001.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_002.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_002.png
new file mode 100644
index 0000000000..a09d29f5dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_002.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_003.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_003.png
new file mode 100644
index 0000000000..f5882002fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_003.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_004.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_004.png
new file mode 100644
index 0000000000..4fd0bae59b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_004.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_005.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_005.png
new file mode 100644
index 0000000000..732a5e0716
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_005.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_006.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_006.png
new file mode 100644
index 0000000000..6eaac3b738
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_006.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_007.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_007.png
new file mode 100644
index 0000000000..0e6b4f2606
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_007.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_008.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_008.png
new file mode 100644
index 0000000000..0ae07faad8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_008.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_009.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_009.png
new file mode 100644
index 0000000000..0d977dfa91
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_009.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_010.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_010.png
new file mode 100644
index 0000000000..f1c7351476
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_010.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_011.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_011.png
new file mode 100644
index 0000000000..ebbb765978
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_011.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_012.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_012.png
new file mode 100644
index 0000000000..0a1b59a49a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_012.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_013.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_013.png
new file mode 100644
index 0000000000..4cda1f57e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_LOCKER_013.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MAINTENANCE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MAINTENANCE.png
new file mode 100644
index 0000000000..5adefe60ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MAINTENANCE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MAINTENANCE_DETECTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MAINTENANCE_DETECTOR.png
new file mode 100644
index 0000000000..aef20e4424
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MAINTENANCE_DETECTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_METRICS_TRANSMITTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_METRICS_TRANSMITTER.png
new file mode 100644
index 0000000000..5be635f133
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_METRICS_TRANSMITTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_HATCH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_HATCH.png
new file mode 100644
index 0000000000..5c8ca75a22
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_HATCH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_HATCH_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_HATCH_ACTIVE.png
new file mode 100644
index 0000000000..5c8ca75a22
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_HATCH_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_INPUT_BUFFER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_INPUT_BUFFER.png
new file mode 100644
index 0000000000..ad6e2159ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_INPUT_BUFFER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_INPUT_BUS.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_INPUT_BUS.png
new file mode 100644
index 0000000000..92325f2142
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_INPUT_BUS.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_INPUT_SLAVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_INPUT_SLAVE.png
new file mode 100644
index 0000000000..b1188aafb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_CRAFTING_INPUT_SLAVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_FLUID_HATCH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_FLUID_HATCH.png
new file mode 100644
index 0000000000..e13a7f0fb7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_FLUID_HATCH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_FLUID_HATCH_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_FLUID_HATCH_ACTIVE.png
new file mode 100644
index 0000000000..de4b210051
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_FLUID_HATCH_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_HATCH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_HATCH.png
new file mode 100644
index 0000000000..8914379ca0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_HATCH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_HATCH_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_HATCH_ACTIVE.png
new file mode 100644
index 0000000000..39de0bb51b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_HATCH_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_FLUID_HATCH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_FLUID_HATCH.png
new file mode 100644
index 0000000000..a2644c44b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_FLUID_HATCH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE.png
new file mode 100644
index 0000000000..fd4570e0f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_HATCH.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_HATCH.png
new file mode 100644
index 0000000000..dd3d1f1203
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_HATCH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_HATCH_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_HATCH_ACTIVE.png
new file mode 100644
index 0000000000..c9bb59b3b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ME_INPUT_HATCH_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MUFFLER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MUFFLER.png
new file mode 100644
index 0000000000..0dae10c6d3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MUFFLER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPE.png
new file mode 100644
index 0000000000..e8b5f40b47
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_BACK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_BACK.png
new file mode 100644
index 0000000000..f46df169b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_BACK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_FRONT.png
new file mode 100644
index 0000000000..ed63f7e829
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT.png
new file mode 100644
index 0000000000..47136fe5c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT_GLOW.png
new file mode 100644
index 0000000000..8c4c193cfa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_LEFT_RIGHT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN.png
new file mode 100644
index 0000000000..d5e65ae188
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN_GLOW.png
new file mode 100644
index 0000000000..7fd77b4cd0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_FLUID_SIDE_UP_DOWN_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_BACK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_BACK.png
new file mode 100644
index 0000000000..4aebdb04d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_BACK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_FRONT.png
new file mode 100644
index 0000000000..cdbf73aa1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT.png
new file mode 100644
index 0000000000..b2b573de0a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT_GLOW.png
new file mode 100644
index 0000000000..74e7c48179
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_LEFT_RIGHT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN.png
new file mode 100644
index 0000000000..65af045f5e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN_GLOW.png
new file mode 100644
index 0000000000..420b01eecf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPELINE_ITEM_SIDE_UP_DOWN_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPE_IN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPE_IN.png
new file mode 100644
index 0000000000..e8b5f40b47
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPE_IN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPE_OUT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPE_OUT.png
new file mode 100644
index 0000000000..e8b5f40b47
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PIPE_OUT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PUMP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PUMP.png
new file mode 100644
index 0000000000..e5dd5c9ed4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PUMP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PUMP.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PUMP.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_PUMP.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST.png
new file mode 100644
index 0000000000..2546378385
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST.png.mcmeta
new file mode 100644
index 0000000000..3de4a0bdd8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST_GLOW.png
new file mode 100644
index 0000000000..dede52a4fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST_GLOW.png.mcmeta
new file mode 100644
index 0000000000..f16b74ddb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QCHEST_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK.png
new file mode 100644
index 0000000000..66f2ba6b82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK.png.mcmeta
new file mode 100644
index 0000000000..3de4a0bdd8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK_GLOW.png
new file mode 100644
index 0000000000..674a395344
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK_GLOW.png.mcmeta
new file mode 100644
index 0000000000..f16b74ddb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_QTANK_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_REDSTONE_RECEIVER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_REDSTONE_RECEIVER.png
new file mode 100644
index 0000000000..530017b392
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_REDSTONE_RECEIVER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_REDSTONE_TRANSMITTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_REDSTONE_TRANSMITTER.png
new file mode 100644
index 0000000000..26dbc0e553
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_REDSTONE_TRANSMITTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST.png
new file mode 100644
index 0000000000..2546378385
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST.png.mcmeta
new file mode 100644
index 0000000000..3de4a0bdd8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST_GLOW.png
new file mode 100644
index 0000000000..dede52a4fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST_GLOW.png.mcmeta
new file mode 100644
index 0000000000..f16b74ddb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCHEST_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN.png
new file mode 100644
index 0000000000..0e43a25c4d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN.png.mcmeta
new file mode 100644
index 0000000000..3de4a0bdd8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN_GLOW.png
new file mode 100644
index 0000000000..c284fff398
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN_GLOW.png.mcmeta
new file mode 100644
index 0000000000..f16b74ddb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SCREEN_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SHUTTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SHUTTER.png
new file mode 100644
index 0000000000..eeb266edfa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SHUTTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_BOXINATOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_DISASSEMBLER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY.png
new file mode 100644
index 0000000000..7ddb6d504b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE.png
new file mode 100644
index 0000000000..99b519837d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..07dc1943ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 3
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..135a140ad3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..07dc1943ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 3
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_INDUSTRIAL_APIARY_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_MASSFAB_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER.png
new file mode 100644
index 0000000000..e45e54c71d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER_ACTIVE.png
new file mode 100644
index 0000000000..28bbbfceb4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_POTIONBREWER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_REPLICATOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_ROCK_BREAKER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_SCANNER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_ALLOY_SMELTER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR.png
new file mode 100644
index 0000000000..8188d77473
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE.png
new file mode 100644
index 0000000000..ad645efc82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_COMPRESSOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR.png
new file mode 100644
index 0000000000..3b8966a098
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE.png
new file mode 100644
index 0000000000..9f998f6456
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_EXTRACTOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_FURNACE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_HAMMER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_SIDE_STEAM_MACERATOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK.png
new file mode 100644
index 0000000000..babce7bff7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK.png.mcmeta
new file mode 100644
index 0000000000..3de4a0bdd8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK_GLOW.png
new file mode 100644
index 0000000000..7486ee98b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK_GLOW.png.mcmeta
new file mode 100644
index 0000000000..f16b74ddb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_STANK_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 8
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER.png
new file mode 100644
index 0000000000..c1a1f92f25
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE.png
new file mode 100644
index 0000000000..e01ea873ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..b84e69f2c5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..e01ea873ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..1ec644560f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_GLOW.png
new file mode 100644
index 0000000000..c1a1f92f25
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES.png
new file mode 100644
index 0000000000..c11edf72d6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES.png.mcmeta
new file mode 100644
index 0000000000..f4f563840a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES_GLOW.png
new file mode 100644
index 0000000000..c11edf72d6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES_GLOW.png.mcmeta
new file mode 100644
index 0000000000..f4f563840a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TELEPORTER_SIDES_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_BOXINATOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM.png
new file mode 100644
index 0000000000..5e80eca332
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_ACTIVE.png
new file mode 100644
index 0000000000..6b3584c7fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_CLEANROOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER.png
new file mode 100644
index 0000000000..e09a292cca
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER_ACTIVE.png
new file mode 100644
index 0000000000..d955d16e4a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..f974169ac5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_DISASSEMBLER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY.png
new file mode 100644
index 0000000000..ad768c8909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE.png
new file mode 100644
index 0000000000..e27a2f7d92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..05a9e98565
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE.png.mcmeta
@@ -0,0 +1,11 @@
+{
+ "animation": {
+ "frametime": 1,
+ "frames": [
+ { "index": 0, "time": 90 },
+ { "index": 1, "time": 2 },
+ { "index": 0, "time": 1 },
+ { "index": 1, "time": 2 }
+ ]
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..c601e3d7dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..05a9e98565
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,11 @@
+{
+ "animation": {
+ "frametime": 1,
+ "frames": [
+ { "index": 0, "time": 90 },
+ { "index": 1, "time": 2 },
+ { "index": 0, "time": 1 },
+ { "index": 1, "time": 2 }
+ ]
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_GLOW.png
new file mode 100644
index 0000000000..c737d59725
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_INDUSTRIAL_APIARY_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_MASSFAB_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_POTIONBREWER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_REPLICATOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_ROCK_BREAKER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_SCANNER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_ALLOY_SMELTER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR.png
new file mode 100644
index 0000000000..37d7ba54fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE.png
new file mode 100644
index 0000000000..e12725c60d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_COMPRESSOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR.png
new file mode 100644
index 0000000000..3ecda894d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE.png
new file mode 100644
index 0000000000..17e74ca801
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_EXTRACTOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_FURNACE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_HAMMER_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR.png
new file mode 100644
index 0000000000..d9855c3e75
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE.png
new file mode 100644
index 0000000000..7e43f436a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..b84e69f2c5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..7e43f436a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW.png.mcmeta
new file mode 100644
index 0000000000..1ec644560f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_ACTIVE_GLOW.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "frametime": 4
+ }
+}
+
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_TOP_STEAM_MACERATOR_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_VALVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_VALVE.png
new file mode 100644
index 0000000000..fd927405d1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_VALVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_VALVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_VALVE.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_VALVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_ACTIVITYDETECTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_ACTIVITYDETECTOR.png
new file mode 100644
index 0000000000..94bf634ec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_ACTIVITYDETECTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_FLUID_DETECTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_FLUID_DETECTOR.png
new file mode 100644
index 0000000000..05e830f07f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_FLUID_DETECTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_ITEM_DETECTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_ITEM_DETECTOR.png
new file mode 100644
index 0000000000..6e6bb02a52
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_ITEM_DETECTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_MAINTENANCE_DETECTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_MAINTENANCE_DETECTOR.png
new file mode 100644
index 0000000000..137867a219
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_WIRELESS_MAINTENANCE_DETECTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR.png
new file mode 100644
index 0000000000..80822c4b05
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_DL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_DL.png
new file mode 100644
index 0000000000..e07a3ff04d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_DL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_DOWN.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_DOWN.png
new file mode 100644
index 0000000000..5b77df828c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_DOWN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_DR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_DR.png
new file mode 100644
index 0000000000..0bbdcfd783
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_DR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_LEFT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_LEFT.png
new file mode 100644
index 0000000000..5221719ca2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_LEFT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_LR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_LR.png
new file mode 100644
index 0000000000..2b304caed0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_LR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_ND.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_ND.png
new file mode 100644
index 0000000000..4a9c81ee52
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_ND.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_NL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_NL.png
new file mode 100644
index 0000000000..15d16004a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_NL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_NR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_NR.png
new file mode 100644
index 0000000000..49ba54b4e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_NR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_NU.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_NU.png
new file mode 100644
index 0000000000..ff0957cd86
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_NU.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_RD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_RD.png
new file mode 100644
index 0000000000..c7dcd5547a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_RD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_RIGHT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_RIGHT.png
new file mode 100644
index 0000000000..09307337ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_RIGHT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UD.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UD.png
new file mode 100644
index 0000000000..d261c7db23
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UL.png
new file mode 100644
index 0000000000..4fb081b677
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UP.png
new file mode 100644
index 0000000000..9c222e9660
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UR.png
new file mode 100644
index 0000000000..a72b0c98dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/PIPE_RESTRICTOR_UR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/RENDERING_ERROR.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/RENDERING_ERROR.png
new file mode 100644
index 0000000000..a5fd40679c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/RENDERING_ERROR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL.png
new file mode 100644
index 0000000000..0021de7698
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_8V.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_8V.png
new file mode 100644
index 0000000000..023a64611f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_8V.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_EV.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_EV.png
new file mode 100644
index 0000000000..ef2621c4fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_EV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_HV.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_HV.png
new file mode 100644
index 0000000000..6cccf5da17
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_HV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_IV.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_IV.png
new file mode 100644
index 0000000000..f4bff9983a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_IV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_LV.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_LV.png
new file mode 100644
index 0000000000..dad5d02339
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_LV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_LuV.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_LuV.png
new file mode 100644
index 0000000000..dad5d02339
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_LuV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_MV.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_MV.png
new file mode 100644
index 0000000000..2cf33c1a71
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_MV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UEV.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UEV.png
new file mode 100644
index 0000000000..6cccf5da17
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UEV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UHV.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UHV.png
new file mode 100644
index 0000000000..6cccf5da17
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UHV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UIV.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UIV.png
new file mode 100644
index 0000000000..6cccf5da17
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UIV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UV.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UV.png
new file mode 100644
index 0000000000..dad5d02339
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_UV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_ZPM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_ZPM.png
new file mode 100644
index 0000000000..dad5d02339
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/SOLARPANEL_ZPM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BACK_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_BOTTOM_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_FRONT_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE.png
new file mode 100644
index 0000000000..fdfdeb0be7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_ACTIVE.png
new file mode 100644
index 0000000000..677f8bccf7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_ACTIVE.png.mcmeta
new file mode 100644
index 0000000000..dfae8cae16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_ACTIVE.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation":{
+ "frametime":1
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_SIDE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP_ACTIVE.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP_ACTIVE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP_ACTIVE_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP_ACTIVE_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP_GLOW.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STEAM_TURBINE_TOP_GLOW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STONES_MARBLE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STONES_MARBLE.png
new file mode 100644
index 0000000000..1287802f2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STONES_MARBLE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/STRUCTURE_MARK.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STRUCTURE_MARK.png
new file mode 100644
index 0000000000..bc6d197848
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/STRUCTURE_MARK.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/TRANSPARENT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TRANSPARENT.png
new file mode 100644
index 0000000000..6175e8622a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/TRANSPARENT.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UEV_SIDE_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UEV_SIDE_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..caddc1a499
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UEV_SIDE_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UEV_TOP_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UEV_TOP_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..20e68cc0d7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UEV_TOP_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UHV_SIDE_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UHV_SIDE_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..5fed8e5306
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UHV_SIDE_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UHV_TOP_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UHV_TOP_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..5ae76c73be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UHV_TOP_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UIV_SIDE_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UIV_SIDE_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..e84a018d89
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UIV_SIDE_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UIV_TOP_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UIV_TOP_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..78e7e8a750
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UIV_TOP_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UMV_SIDE_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UMV_SIDE_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..a5c2d6969c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UMV_SIDE_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UMV_TOP_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UMV_TOP_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..c2aa6e51bf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UMV_TOP_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UV_SIDE_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UV_SIDE_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..563d5f7163
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UV_SIDE_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/UV_TOP_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UV_TOP_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..f34a3b46df
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/UV_TOP_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_ADVANCED.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_ADVANCED.png
new file mode 100644
index 0000000000..eafb28239b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_ADVANCED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_ADVANCED.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_ADVANCED.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_ADVANCED.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_NORMAL.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_NORMAL.png
new file mode 100644
index 0000000000..5e83578f82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_NORMAL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_NORMAL.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_NORMAL.png.mcmeta
new file mode 100644
index 0000000000..0645f48c62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/VENT_NORMAL.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/VOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/VOID.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/VOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ZPM_SIDE_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ZPM_SIDE_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..fcdc3f29ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ZPM_SIDE_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/ZPM_TOP_CYCLOTRON_SOLENOID.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ZPM_TOP_CYCLOTRON_SOLENOID.png
new file mode 100644
index 0000000000..1cfde096dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/ZPM_TOP_CYCLOTRON_SOLENOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block1.png
new file mode 100644
index 0000000000..b768ec8f92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block1.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block1.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block2.png
new file mode 100644
index 0000000000..a7abedc8fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block2.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block2.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block3.png
new file mode 100644
index 0000000000..3dfa2d6550
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block3.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block3.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block4.png
new file mode 100644
index 0000000000..60d0a48e0d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block4.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block4.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block5.png
new file mode 100644
index 0000000000..f2fb9d7fde
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block5.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block5.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block6.png
new file mode 100644
index 0000000000..b768ec8f92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block6.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/block6.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/foil.png
new file mode 100644
index 0000000000..c3c9bfd3fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/foil.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/frameGt.png
new file mode 100644
index 0000000000..1c9eb6ac60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/frameGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/frameGt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/frameGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/ore.png
new file mode 100644
index 0000000000..24b2b3b4a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/ore.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/ore.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/ore.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/oreSmall.png
new file mode 100644
index 0000000000..64d7b85551
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/oreSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/oreSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/oreSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeHuge.png
new file mode 100644
index 0000000000..4addea66c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeHuge.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeHuge.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeHuge.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeLarge.png
new file mode 100644
index 0000000000..73d3667645
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeLarge.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeLarge.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeLarge.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeMedium.png
new file mode 100644
index 0000000000..89a9fdd535
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeMedium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeMedium.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeMedium.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeNonuple.png
new file mode 100644
index 0000000000..695980704c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeNonuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeNonuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeNonuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeQuadruple.png
new file mode 100644
index 0000000000..c990d2a70d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSide.png
new file mode 100644
index 0000000000..733f0baf76
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSide.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSide.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSide.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSmall.png
new file mode 100644
index 0000000000..ad95d97212
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeTiny.png
new file mode 100644
index 0000000000..a715f8b1fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeTiny.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeTiny.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/pipeTiny.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/void.png
new file mode 100644
index 0000000000..d2fec55159
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/void.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/wire.png
new file mode 100644
index 0000000000..697205aa23
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/wire.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/wire.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Dreamwood/wire.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block1.png
new file mode 100644
index 0000000000..e6f4bee8f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block1.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block1.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block2.png
new file mode 100644
index 0000000000..8c7d7086a9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block2.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block2.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block3.png
new file mode 100644
index 0000000000..3d850c9c56
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block3.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block3.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block4.png
new file mode 100644
index 0000000000..3163d1fe8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block4.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block4.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block5.png
new file mode 100644
index 0000000000..0a4ac7bd15
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block5.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block5.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block6.png
new file mode 100644
index 0000000000..e6f4bee8f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block6.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/block6.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/foil.png
new file mode 100644
index 0000000000..902d3b5f94
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/foil.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/frameGt.png
new file mode 100644
index 0000000000..7a328d5ff9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/frameGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/frameGt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/frameGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/ore.png
new file mode 100644
index 0000000000..22110225bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/ore.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/ore.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/ore.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/oreSmall.png
new file mode 100644
index 0000000000..6bec465891
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/oreSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/oreSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/oreSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeHuge.png
new file mode 100644
index 0000000000..6af42324d1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeHuge.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeHuge.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeHuge.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeLarge.png
new file mode 100644
index 0000000000..a5205d3dfa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeLarge.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeLarge.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeLarge.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeMedium.png
new file mode 100644
index 0000000000..be603ee7f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeMedium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeMedium.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeMedium.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeNonuple.png
new file mode 100644
index 0000000000..03ff8d0dea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeNonuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeNonuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeNonuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeQuadruple.png
new file mode 100644
index 0000000000..0cb3852d8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSide.png
new file mode 100644
index 0000000000..6c88a6c66d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSide.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSide.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSide.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSmall.png
new file mode 100644
index 0000000000..89cee5adec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeTiny.png
new file mode 100644
index 0000000000..aafb31882c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeTiny.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeTiny.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/pipeTiny.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/void.png
new file mode 100644
index 0000000000..b9f10a6886
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/void.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/wire.png
new file mode 100644
index 0000000000..f0b5d99043
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/wire.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/wire.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/GaiaSpirit/wire.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block1.png
new file mode 100644
index 0000000000..7321720613
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block1.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block1.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block2.png
new file mode 100644
index 0000000000..444b713dcb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block2.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block2.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block3.png
new file mode 100644
index 0000000000..7cac6b85eb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block3.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block3.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block4.png
new file mode 100644
index 0000000000..f05ec5ed08
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block4.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block4.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block5.png
new file mode 100644
index 0000000000..478306dcb8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block5.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block5.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block6.png
new file mode 100644
index 0000000000..7321720613
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block6.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/block6.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/foil.png
new file mode 100644
index 0000000000..b73c894669
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/foil.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/frameGt.png
new file mode 100644
index 0000000000..ce70352830
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/frameGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/frameGt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/frameGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/ore.png
new file mode 100644
index 0000000000..dd014df0eb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/ore.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/ore.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/ore.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/oreSmall.png
new file mode 100644
index 0000000000..142c01d4a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/oreSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/oreSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/oreSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeHuge.png
new file mode 100644
index 0000000000..05e5442329
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeHuge.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeHuge.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeHuge.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeLarge.png
new file mode 100644
index 0000000000..999cef26ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeLarge.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeLarge.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeLarge.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeMedium.png
new file mode 100644
index 0000000000..608613b1a1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeMedium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeMedium.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeMedium.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeNonuple.png
new file mode 100644
index 0000000000..34c8534f37
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeNonuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeNonuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeNonuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeQuadruple.png
new file mode 100644
index 0000000000..06b873d8e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSide.png
new file mode 100644
index 0000000000..f7fcd0d420
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSide.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSide.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSide.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSmall.png
new file mode 100644
index 0000000000..e235a67c00
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeTiny.png
new file mode 100644
index 0000000000..fb0cc7793b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeTiny.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeTiny.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/pipeTiny.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/void.png
new file mode 100644
index 0000000000..1397ecc4e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/void.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/wire.png
new file mode 100644
index 0000000000..b09c229c69
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/wire.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/wire.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingrock/wire.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block1.png
new file mode 100644
index 0000000000..2a3493088a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block1.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block1.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block2.png
new file mode 100644
index 0000000000..e9e968c7a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block2.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block2.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block3.png
new file mode 100644
index 0000000000..e09de01a50
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block3.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block3.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block4.png
new file mode 100644
index 0000000000..83b8aea96d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block4.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block4.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block5.png
new file mode 100644
index 0000000000..f0027b26d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block5.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block5.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block6.png
new file mode 100644
index 0000000000..2a3493088a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block6.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/block6.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/foil.png
new file mode 100644
index 0000000000..b3f2f222eb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/foil.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/frameGt.png
new file mode 100644
index 0000000000..f034687802
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/frameGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/frameGt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/frameGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/ore.png
new file mode 100644
index 0000000000..1feedde9aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/ore.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/ore.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/ore.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/oreSmall.png
new file mode 100644
index 0000000000..ba6ae995d6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/oreSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/oreSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/oreSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeHuge.png
new file mode 100644
index 0000000000..800f0fbb54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeHuge.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeHuge.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeHuge.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeLarge.png
new file mode 100644
index 0000000000..37012a0b1d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeLarge.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeLarge.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeLarge.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeMedium.png
new file mode 100644
index 0000000000..a96ea8432a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeMedium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeMedium.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeMedium.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeNonuple.png
new file mode 100644
index 0000000000..49ca7905d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeNonuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeNonuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeNonuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeQuadruple.png
new file mode 100644
index 0000000000..281d866a0e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSide.png
new file mode 100644
index 0000000000..1318ed926c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSide.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSide.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSide.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSmall.png
new file mode 100644
index 0000000000..d249b82c5a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeTiny.png
new file mode 100644
index 0000000000..92a421e3ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeTiny.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeTiny.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/pipeTiny.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/void.png
new file mode 100644
index 0000000000..d2fec55159
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/void.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/wire.png
new file mode 100644
index 0000000000..062137bc8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/wire.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/wire.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/Livingwood/wire.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/frameGt.png
new file mode 100644
index 0000000000..c42f63864a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/frameGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/frameGt.png.mcmeta
new file mode 100644
index 0000000000..dd8674956c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/frameGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 2}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block1.png
new file mode 100644
index 0000000000..5348f23a85
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block2.png
new file mode 100644
index 0000000000..728f717477
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block3.png
new file mode 100644
index 0000000000..c69d9f088f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block4.png
new file mode 100644
index 0000000000..9c96e08ed6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block5.png
new file mode 100644
index 0000000000..57941a2596
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block6.png
new file mode 100644
index 0000000000..7cdbb73e30
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/foil.png
new file mode 100644
index 0000000000..5c1b97ec9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/frameGt.png
new file mode 100644
index 0000000000..030a32619e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/ore.png
new file mode 100644
index 0000000000..3afebba2f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/oreSmall.png
new file mode 100644
index 0000000000..ee38cae9e4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeHuge.png
new file mode 100644
index 0000000000..6a205f9701
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeLarge.png
new file mode 100644
index 0000000000..db890d23b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeMedium.png
new file mode 100644
index 0000000000..42d7ac0c36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeNonuple.png
new file mode 100644
index 0000000000..4624c91277
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeQuadruple.png
new file mode 100644
index 0000000000..e9f58646eb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeSide.png
new file mode 100644
index 0000000000..3b3e1393d8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeSmall.png
new file mode 100644
index 0000000000..1a8cd93575
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeTiny.png
new file mode 100644
index 0000000000..792d5f653a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/void.png
new file mode 100644
index 0000000000..c9a3ca7a5c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/wire.png
new file mode 100644
index 0000000000..9a66c714ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/WhiteDwarfMatter/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/foil.png
new file mode 100644
index 0000000000..47fe9272e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/foil.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/frameGt.png
new file mode 100644
index 0000000000..856ee33d4a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/frameGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/frameGt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/frameGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/void.png
new file mode 100644
index 0000000000..955e210484
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/void.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/eternity/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block1.png
new file mode 100644
index 0000000000..15d48f4748
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block1.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block1.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block2.png
new file mode 100644
index 0000000000..cdd5189818
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block2.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block2.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block3.png
new file mode 100644
index 0000000000..46c678ef64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block3.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block3.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block4.png
new file mode 100644
index 0000000000..5fc61c21b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block4.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block4.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block5.png
new file mode 100644
index 0000000000..a6024fc752
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block5.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block5.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block6.png
new file mode 100644
index 0000000000..15d48f4748
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block6.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/block6.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/foil.png
new file mode 100644
index 0000000000..8f4feae1a0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/foil.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/frameGt.png
new file mode 100644
index 0000000000..85e26fbd96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/frameGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/frameGt.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/frameGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/ore.png
new file mode 100644
index 0000000000..bfc850802f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/ore.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/ore.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/ore.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/oreSmall.png
new file mode 100644
index 0000000000..bb9f89a35b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/oreSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/oreSmall.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/oreSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeHuge.png
new file mode 100644
index 0000000000..675afb172e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeHuge.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeHuge.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeHuge.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeLarge.png
new file mode 100644
index 0000000000..9407336683
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeLarge.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeLarge.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeLarge.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeMedium.png
new file mode 100644
index 0000000000..e9a49d03e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeMedium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeMedium.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeMedium.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeNonuple.png
new file mode 100644
index 0000000000..4d82719c6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeNonuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeNonuple.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeNonuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeQuadruple.png
new file mode 100644
index 0000000000..63fb5fdb7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeQuadruple.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSide.png
new file mode 100644
index 0000000000..5236504d76
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSide.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSide.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSide.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSmall.png
new file mode 100644
index 0000000000..87d4c3c6ec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSmall.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeTiny.png
new file mode 100644
index 0000000000..c5e62b8cb8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeTiny.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeTiny.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/pipeTiny.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/void.png
new file mode 100644
index 0000000000..1ce7a61c86
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/void.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/wire.png
new file mode 100644
index 0000000000..8ba3c958fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/wire.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/wire.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/infinity/wire.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/foil.png
new file mode 100644
index 0000000000..c4e3bebd77
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/foil.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/frameGt.png
new file mode 100644
index 0000000000..cd8b7fe52d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/frameGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/frameGt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/frameGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/frameGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/frameGt_OVERLAY.png
new file mode 100644
index 0000000000..6d1520d6be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/frameGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/void.png
new file mode 100644
index 0000000000..6e88a1e284
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/void.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/magmatter/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/BLOCK_SPACETIME.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/BLOCK_SPACETIME.png
new file mode 100644
index 0000000000..e04dcd4e22
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/BLOCK_SPACETIME.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block1.png
new file mode 100644
index 0000000000..0b7f498b70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block1.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block1.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block2.png
new file mode 100644
index 0000000000..b397341501
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block2.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block2.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block3.png
new file mode 100644
index 0000000000..25c83d99c3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block3.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block3.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block3.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block4.png
new file mode 100644
index 0000000000..10bb08f390
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block4.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block4.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block4.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block5.png
new file mode 100644
index 0000000000..515d239e0b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block5.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block5.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block5.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block6.png
new file mode 100644
index 0000000000..0b7f498b70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block6.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block6.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/block6.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/foil.png
new file mode 100644
index 0000000000..0753e2d6a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/foil.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/frameGt.png
new file mode 100644
index 0000000000..a9f779f26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/frameGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/frameGt.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/frameGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/ore.png
new file mode 100644
index 0000000000..f8dacc8a95
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/ore.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/ore.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/ore.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/oreSmall.png
new file mode 100644
index 0000000000..03137cde78
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/oreSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/oreSmall.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/oreSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeHuge.png
new file mode 100644
index 0000000000..fc7b5511f8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeHuge.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeHuge.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeHuge.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeLarge.png
new file mode 100644
index 0000000000..04875026cd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeLarge.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeLarge.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeLarge.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeMedium.png
new file mode 100644
index 0000000000..09fc476ad2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeMedium.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeMedium.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeMedium.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeNonuple.png
new file mode 100644
index 0000000000..fa8d1f385d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeNonuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeNonuple.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeNonuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeQuadruple.png
new file mode 100644
index 0000000000..d17d6d8e56
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeQuadruple.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSide.png
new file mode 100644
index 0000000000..3f4c104ef1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSide.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSide.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSide.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSmall.png
new file mode 100644
index 0000000000..b99878cbd2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSmall.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeTiny.png
new file mode 100644
index 0000000000..d5ff4b48e3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeTiny.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeTiny.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/pipeTiny.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/void.png
new file mode 100644
index 0000000000..9ea5483e31
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/void.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/wire.png
new file mode 100644
index 0000000000..8006a40dbc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/wire.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/wire.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/spacetime/wire.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block1.png
new file mode 100644
index 0000000000..b58ded215f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block2.png
new file mode 100644
index 0000000000..a56a62ad1b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block3.png
new file mode 100644
index 0000000000..6de77b309b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block4.png
new file mode 100644
index 0000000000..e5f7b5e76f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block5.png
new file mode 100644
index 0000000000..4bb49067ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block6.png
new file mode 100644
index 0000000000..b58ded215f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/foil.png
new file mode 100644
index 0000000000..2edad5a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/frameGt.png
new file mode 100644
index 0000000000..d93c52c24c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/ore.png
new file mode 100644
index 0000000000..935f66ff43
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/oreSmall.png
new file mode 100644
index 0000000000..0a7e9d6e9e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeHuge.png
new file mode 100644
index 0000000000..7985626666
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeLarge.png
new file mode 100644
index 0000000000..65529e2772
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeMedium.png
new file mode 100644
index 0000000000..06b3e0d189
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeNonuple.png
new file mode 100644
index 0000000000..b33a1bac91
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeQuadruple.png
new file mode 100644
index 0000000000..343e8ff5b8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeSide.png
new file mode 100644
index 0000000000..aec8883d6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeSmall.png
new file mode 100644
index 0000000000..b5e620f045
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeTiny.png
new file mode 100644
index 0000000000..c1ef295198
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/void.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/wire.png
new file mode 100644
index 0000000000..455335e5c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/CUSTOM/universium/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block1.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/ore.png
new file mode 100644
index 0000000000..751739e83c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DIAMOND/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block1.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/ore.png
new file mode 100644
index 0000000000..3039ef19a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/DULL/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block1.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/ore.png
new file mode 100644
index 0000000000..751739e83c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/EMERALD/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block1.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/ore.png
new file mode 100644
index 0000000000..4a07c0c5d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FIERY/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block1.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/ore.png
new file mode 100644
index 0000000000..9409465d1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FINE/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block1.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/ore.png
new file mode 100644
index 0000000000..801327b8e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLINT/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block1.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/ore.png
new file mode 100644
index 0000000000..3039ef19a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/FLUID/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block1.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/ore.png
new file mode 100644
index 0000000000..751739e83c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_HORIZONTAL/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block1.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/ore.png
new file mode 100644
index 0000000000..751739e83c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GEM_VERTICAL/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block1.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/ore.png
new file mode 100644
index 0000000000..751739e83c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/GLASS/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block1.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/ore.png
new file mode 100644
index 0000000000..801327b8e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LAPIS/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block1.png
new file mode 100644
index 0000000000..fbe2231dcd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/ore.png
new file mode 100644
index 0000000000..9409465d1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeHuge.png
new file mode 100644
index 0000000000..2016b52334
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeLarge.png
new file mode 100644
index 0000000000..6cdf361914
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeMedium.png
new file mode 100644
index 0000000000..c6b724c5cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeNonuple.png
new file mode 100644
index 0000000000..dd918b7f6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeQuadruple.png
new file mode 100644
index 0000000000..cb89847a79
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeSide.png
new file mode 100644
index 0000000000..f45640b300
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeSmall.png
new file mode 100644
index 0000000000..d203245440
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeTiny.png
new file mode 100644
index 0000000000..8ced09dc78
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LEAF/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block1.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/ore.png
new file mode 100644
index 0000000000..9409465d1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/LIGNITE/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block1.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/ore.png
new file mode 100644
index 0000000000..3039ef19a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/MAGNETIC/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block1.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/ore.png
new file mode 100644
index 0000000000..3039ef19a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/METALLIC/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block1.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/ore.png
new file mode 100644
index 0000000000..751739e83c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NETHERSTAR/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block1.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/ore.png
new file mode 100644
index 0000000000..8218220903
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/NONE/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block1.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/ore.png
new file mode 100644
index 0000000000..751739e83c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/OPAL/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block1.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/ore.png
new file mode 100644
index 0000000000..3039ef19a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/PAPER/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block1.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/ore.png
new file mode 100644
index 0000000000..801327b8e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/POWDER/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block1.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/ore.png
new file mode 100644
index 0000000000..9409465d1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/QUARTZ/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block1.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/ore.png
new file mode 100644
index 0000000000..3039ef19a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/ROUGH/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block1.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/ore.png
new file mode 100644
index 0000000000..751739e83c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/RUBY/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block1.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/ore.png
new file mode 100644
index 0000000000..9409465d1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SAND/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block1.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/ore.png
new file mode 100644
index 0000000000..a9988ae40c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHARDS/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block1.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/ore.png
new file mode 100644
index 0000000000..4a07c0c5d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeHuge.png
new file mode 100644
index 0000000000..980f2865ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeLarge.png
new file mode 100644
index 0000000000..d6069c8502
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeMedium.png
new file mode 100644
index 0000000000..748838930e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeNonuple.png
new file mode 100644
index 0000000000..ba7a57b909
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeQuadruple.png
new file mode 100644
index 0000000000..da608adbda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeSide.png
new file mode 100644
index 0000000000..2856e20cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeSmall.png
new file mode 100644
index 0000000000..2789bd0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeTiny.png
new file mode 100644
index 0000000000..971ebf1470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/SHINY/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block1.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block1.png
new file mode 100644
index 0000000000..fbe2231dcd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block2.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block2.png
new file mode 100644
index 0000000000..d73dfe51e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block3.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block3.png
new file mode 100644
index 0000000000..9aacf66987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block4.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block4.png
new file mode 100644
index 0000000000..4dab32536a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block5.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block5.png
new file mode 100644
index 0000000000..af1288dc57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block6.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block6.png
new file mode 100644
index 0000000000..df2a9041db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/block6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/foil.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/foil.png
new file mode 100644
index 0000000000..edaf34db8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/frameGt.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/frameGt.png
new file mode 100644
index 0000000000..1c89bf81f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/frameGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/ore.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/ore.png
new file mode 100644
index 0000000000..9409465d1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/oreSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/oreSmall.png
new file mode 100644
index 0000000000..98974a22e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/oreSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeHuge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeHuge.png
new file mode 100644
index 0000000000..2016b52334
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeHuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeLarge.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeLarge.png
new file mode 100644
index 0000000000..6cdf361914
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeLarge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeMedium.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeMedium.png
new file mode 100644
index 0000000000..c6b724c5cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeMedium.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeNonuple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeNonuple.png
new file mode 100644
index 0000000000..dd918b7f6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeNonuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeQuadruple.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeQuadruple.png
new file mode 100644
index 0000000000..cb89847a79
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeSide.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeSide.png
new file mode 100644
index 0000000000..f45640b300
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeSide.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeSmall.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeSmall.png
new file mode 100644
index 0000000000..d203245440
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeTiny.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeTiny.png
new file mode 100644
index 0000000000..8ced09dc78
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/pipeTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/void.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/wire.png b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/wire.png
new file mode 100644
index 0000000000..a4f18e3ade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/materialicons/WOOD/wire.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/active.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/active.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/active.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/active_glow.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/active_glow.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/active_glow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/base.png
new file mode 100644
index 0000000000..b119dc1ba0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/inactive.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/inactive.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/inactive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/inactive_glow.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/inactive_glow.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BigLaserEngraver/inactive_glow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BlackLaserEngraver/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BlackLaserEngraver/base.png
new file mode 100644
index 0000000000..de4345cf43
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/BlackLaserEngraver/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/Laserblock/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/Laserblock/base.png
new file mode 100644
index 0000000000..2ec2c2e004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/Laserblock/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/active.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/active.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/active.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/active_glow.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/active_glow.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/active_glow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/base.png
new file mode 100644
index 0000000000..84cd5fa9f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/inactive.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/inactive.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/inactive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/inactive_glow.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/inactive_glow.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/advChemicalProcessor/inactive_glow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/amperage/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/amperage/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/amperage/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cleanroom/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cleanroom/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cleanroom/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/active.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/active.png
new file mode 100644
index 0000000000..708971d8cf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/active.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/active_glow.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/active_glow.png
new file mode 100644
index 0000000000..c2866f4570
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/active_glow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/base.png
new file mode 100644
index 0000000000..f125fa6bbc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/inactive.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/inactive.png
new file mode 100644
index 0000000000..c684fbb353
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/cokeOven/inactive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/conveyor/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/conveyor/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/conveyor/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/active.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/active.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/active.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/active_glow.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/active_glow.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/active_glow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/base.png
new file mode 100644
index 0000000000..99f62d97a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/inactive.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/inactive.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/inactive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/inactive_glow.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/inactive_glow.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/distillationTower/inactive_glow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/emitter/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/emitter/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/emitter/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/fieldGenerator/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/fieldGenerator/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/fieldGenerator/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/heater/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/heater/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/heater/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/insulator/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/insulator/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/insulator/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/inventory/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/inventory/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/inventory/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laser/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laser/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laser/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade1/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade1/base.png
new file mode 100644
index 0000000000..7e644d11cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade1/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade2/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade2/base.png
new file mode 100644
index 0000000000..d4ee6ed402
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade2/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade3/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade3/base.png
new file mode 100644
index 0000000000..dbc1a20f76
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade3/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade4/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade4/base.png
new file mode 100644
index 0000000000..1587cdeca6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/laserengraverupgrade4/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/active.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/active.png
new file mode 100644
index 0000000000..ffd43d8dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/active.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/active_glow.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/active_glow.png
new file mode 100644
index 0000000000..3bb29bbda6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/active_glow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/inactive.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/inactive.png
new file mode 100644
index 0000000000..6092ec4c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/inactive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/inactive_glow.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/inactive_glow.png
new file mode 100644
index 0000000000..b7955d63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/macerator/inactive_glow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/motor/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/motor/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/motor/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/piston/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/piston/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/piston/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/pump/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/pump/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/pump/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/robotArm/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/robotArm/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/robotArm/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/sensor/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/sensor/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/sensor/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/tank/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/tank/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/tank/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/blocks/multitileentity/wireless/base.png b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/wireless/base.png
new file mode 100644
index 0000000000..e05f5d89c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/multitileentity/wireless/base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/entity/arrow.png b/src/main/resources/assets/gregtech/textures/entity/arrow.png
new file mode 100644
index 0000000000..0d58b2cc48
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/entity/arrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/entity/arrow_potions.png b/src/main/resources/assets/gregtech/textures/entity/arrow_potions.png
new file mode 100644
index 0000000000..b39e19828d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/entity/arrow_potions.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/1by1.png b/src/main/resources/assets/gregtech/textures/gui/1by1.png
new file mode 100644
index 0000000000..48dae4757f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/1by1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/2by2.png b/src/main/resources/assets/gregtech/textures/gui/2by2.png
new file mode 100644
index 0000000000..db24e01cfc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/2by2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/3by3.png b/src/main/resources/assets/gregtech/textures/gui/3by3.png
new file mode 100644
index 0000000000..6716e6403a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/3by3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/4by4.png b/src/main/resources/assets/gregtech/textures/gui/4by4.png
new file mode 100644
index 0000000000..87f7ca9b86
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/4by4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/AdvancedCraftingTable.png b/src/main/resources/assets/gregtech/textures/gui/AdvancedCraftingTable.png
new file mode 100644
index 0000000000..de6a0f566c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/AdvancedCraftingTable.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/BasicTank.png b/src/main/resources/assets/gregtech/textures/gui/BasicTank.png
new file mode 100644
index 0000000000..4cb189aa92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/BasicTank.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/BronzeCraftingTable.png b/src/main/resources/assets/gregtech/textures/gui/BronzeCraftingTable.png
new file mode 100644
index 0000000000..c44a6d9eec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/BronzeCraftingTable.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/ComputerCubeRedstone.png b/src/main/resources/assets/gregtech/textures/gui/ComputerCubeRedstone.png
new file mode 100644
index 0000000000..734fd0fcaa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/ComputerCubeRedstone.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/CropHarvestor.png b/src/main/resources/assets/gregtech/textures/gui/CropHarvestor.png
new file mode 100644
index 0000000000..920224a113
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/CropHarvestor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/ElectricAutoWorkbench.png b/src/main/resources/assets/gregtech/textures/gui/ElectricAutoWorkbench.png
new file mode 100644
index 0000000000..2984d5bf0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/ElectricAutoWorkbench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/ElectricBufferSmall.png b/src/main/resources/assets/gregtech/textures/gui/ElectricBufferSmall.png
new file mode 100644
index 0000000000..81f999d766
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/ElectricBufferSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/ElectricItemCleaner.png b/src/main/resources/assets/gregtech/textures/gui/ElectricItemCleaner.png
new file mode 100644
index 0000000000..75732e6127
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/ElectricItemCleaner.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/GuiButtons.png b/src/main/resources/assets/gregtech/textures/gui/GuiButtons.png
new file mode 100644
index 0000000000..b001b0833a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/GuiButtons.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/GuiCover.png b/src/main/resources/assets/gregtech/textures/gui/GuiCover.png
new file mode 100644
index 0000000000..95353c79ca
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/GuiCover.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/GuiTabs.png b/src/main/resources/assets/gregtech/textures/gui/GuiTabs.png
new file mode 100644
index 0000000000..25b08872a0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/GuiTabs.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/Implosion.png b/src/main/resources/assets/gregtech/textures/gui/Implosion.png
new file mode 100644
index 0000000000..e5841c7873
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/Implosion.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/InventoryManager.png b/src/main/resources/assets/gregtech/textures/gui/InventoryManager.png
new file mode 100644
index 0000000000..f208834f07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/InventoryManager.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/MagicAbsorber.png b/src/main/resources/assets/gregtech/textures/gui/MagicAbsorber.png
new file mode 100644
index 0000000000..522d953733
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/MagicAbsorber.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/RedstoneCircuitBlock.png b/src/main/resources/assets/gregtech/textures/gui/RedstoneCircuitBlock.png
new file mode 100644
index 0000000000..a91d0b6855
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/RedstoneCircuitBlock.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/Retriever.png b/src/main/resources/assets/gregtech/textures/gui/Retriever.png
new file mode 100644
index 0000000000..842030f446
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/Retriever.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/Safe.png b/src/main/resources/assets/gregtech/textures/gui/Safe.png
new file mode 100644
index 0000000000..99f3dc72e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/Safe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/Sonictron.png b/src/main/resources/assets/gregtech/textures/gui/Sonictron.png
new file mode 100644
index 0000000000..872d20da90
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/Sonictron.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/Tradeomat_Inventory.png b/src/main/resources/assets/gregtech/textures/gui/Tradeomat_Inventory.png
new file mode 100644
index 0000000000..b9922c67a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/Tradeomat_Inventory.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/Tradeomat_Main.png b/src/main/resources/assets/gregtech/textures/gui/Tradeomat_Main.png
new file mode 100644
index 0000000000..5af79e7b22
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/Tradeomat_Main.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/Tradeomat_Settings.png b/src/main/resources/assets/gregtech/textures/gui/Tradeomat_Settings.png
new file mode 100644
index 0000000000..77d6912113
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/Tradeomat_Settings.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/armorgui3x3.png b/src/main/resources/assets/gregtech/textures/gui/armorgui3x3.png
new file mode 100644
index 0000000000..80467e9a84
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/armorgui3x3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/armorgui3x4.png b/src/main/resources/assets/gregtech/textures/gui/armorgui3x4.png
new file mode 100644
index 0000000000..736a26b316
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/armorgui3x4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/background/bronze.png b/src/main/resources/assets/gregtech/textures/gui/background/bronze.png
new file mode 100644
index 0000000000..146bbf391d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/background/bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/background/fusion_computer.png b/src/main/resources/assets/gregtech/textures/gui/background/fusion_computer.png
new file mode 100644
index 0000000000..23c6f2ddb4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/background/fusion_computer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/background/nei_single_recipe.png b/src/main/resources/assets/gregtech/textures/gui/background/nei_single_recipe.png
new file mode 100644
index 0000000000..e385d976b1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/background/nei_single_recipe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/background/primitive.png b/src/main/resources/assets/gregtech/textures/gui/background/primitive.png
new file mode 100644
index 0000000000..705e5c2b7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/background/primitive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/background/singleblock_default.png b/src/main/resources/assets/gregtech/textures/gui/background/singleblock_default.png
new file mode 100644
index 0000000000..f2ab23bf69
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/background/singleblock_default.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/background/steel.png b/src/main/resources/assets/gregtech/textures/gui/background/steel.png
new file mode 100644
index 0000000000..64aa67d6f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/background/steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/background/text_field.png b/src/main/resources/assets/gregtech/textures/gui/background/text_field.png
new file mode 100644
index 0000000000..cc96028db0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/background/text_field.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/background/text_field_light_gray.png b/src/main/resources/assets/gregtech/textures/gui/background/text_field_light_gray.png
new file mode 100644
index 0000000000..e66eaa4589
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/background/text_field_light_gray.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/basicmachines/Default.png b/src/main/resources/assets/gregtech/textures/gui/basicmachines/Default.png
new file mode 100644
index 0000000000..309edae171
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/basicmachines/Default.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/basicmachines/LCRNEI.png b/src/main/resources/assets/gregtech/textures/gui/basicmachines/LCRNEI.png
new file mode 100644
index 0000000000..f0920e87b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/basicmachines/LCRNEI.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/button/cover_normal.png b/src/main/resources/assets/gregtech/textures/gui/button/cover_normal.png
new file mode 100644
index 0000000000..a05e4962da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/button/cover_normal.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/button/cover_normal_disabled.png b/src/main/resources/assets/gregtech/textures/gui/button/cover_normal_disabled.png
new file mode 100644
index 0000000000..9004d0fbfa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/button/cover_normal_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/button/cover_normal_hovered.png b/src/main/resources/assets/gregtech/textures/gui/button/cover_normal_hovered.png
new file mode 100644
index 0000000000..0fe9ec5d32
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/button/cover_normal_hovered.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/button/standard.png b/src/main/resources/assets/gregtech/textures/gui/button/standard.png
new file mode 100644
index 0000000000..71d16b6a36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/button/standard.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/button/standard_disabled.png b/src/main/resources/assets/gregtech/textures/gui/button/standard_disabled.png
new file mode 100644
index 0000000000..99430cb831
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/button/standard_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/button/standard_pressed.png b/src/main/resources/assets/gregtech/textures/gui/button/standard_pressed.png
new file mode 100644
index 0000000000..9adb33eeb5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/button/standard_pressed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/button/standard_toggle.png b/src/main/resources/assets/gregtech/textures/gui/button/standard_toggle.png
new file mode 100644
index 0000000000..e522cb19b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/button/standard_toggle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/button/standard_toggle_disabled.png b/src/main/resources/assets/gregtech/textures/gui/button/standard_toggle_disabled.png
new file mode 100644
index 0000000000..f685017268
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/button/standard_toggle_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/button/void_all.png b/src/main/resources/assets/gregtech/textures/gui/button/void_all.png
new file mode 100644
index 0000000000..f57ded15f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/button/void_all.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/multimachines/MultiblockDisplay.png b/src/main/resources/assets/gregtech/textures/gui/multimachines/MultiblockDisplay.png
new file mode 100644
index 0000000000..d28e21bbfd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/multimachines/MultiblockDisplay.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/allow_input.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/allow_input.png
new file mode 100644
index 0000000000..62f245877d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/allow_input.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/allow_output.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/allow_output.png
new file mode 100644
index 0000000000..781512788a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/allow_output.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/analog.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/analog.png
new file mode 100644
index 0000000000..3b3f600252
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/analog.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/arrow_green_down.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/arrow_green_down.png
new file mode 100644
index 0000000000..3344bbbc70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/arrow_green_down.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/arrow_green_up.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/arrow_green_up.png
new file mode 100644
index 0000000000..014acceb07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/arrow_green_up.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/auto_pull_me.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/auto_pull_me.png
new file mode 100644
index 0000000000..0fa3f15e9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/auto_pull_me.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/auto_pull_me_disabled.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/auto_pull_me_disabled.png
new file mode 100644
index 0000000000..2d8f2006e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/auto_pull_me_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/autooutput_fluid.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/autooutput_fluid.png
new file mode 100644
index 0000000000..bc5a3948ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/autooutput_fluid.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/autooutput_item.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/autooutput_item.png
new file mode 100644
index 0000000000..33b1f7c22f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/autooutput_item.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_off.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_off.png
new file mode 100644
index 0000000000..4c175f7434
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_off.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_off_disabled.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_off_disabled.png
new file mode 100644
index 0000000000..7c634b8f2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_off_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_on.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_on.png
new file mode 100644
index 0000000000..e107990aa2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_on.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_on_disabled.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_on_disabled.png
new file mode 100644
index 0000000000..7766ab7b7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/batch_mode_on_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/blacklist.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/blacklist.png
new file mode 100644
index 0000000000..8c5ef9b23f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/blacklist.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/block_input.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/block_input.png
new file mode 100644
index 0000000000..5d20d59107
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/block_input.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/block_output.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/block_output.png
new file mode 100644
index 0000000000..168059b7f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/block_output.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/bounding_box.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/bounding_box.png
new file mode 100644
index 0000000000..d7247b5d3a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/bounding_box.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/checkmark.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/checkmark.png
new file mode 100644
index 0000000000..faf3c69e4a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/checkmark.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/chunkloading.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/chunkloading.png
new file mode 100644
index 0000000000..bfd288be45
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/chunkloading.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/chunkloading_off.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/chunkloading_off.png
new file mode 100644
index 0000000000..db75847e0c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/chunkloading_off.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/cross.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/cross.png
new file mode 100644
index 0000000000..863553adbd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/cross.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/cyclic.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/cyclic.png
new file mode 100644
index 0000000000..aca845afd5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/cyclic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/disable.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/disable.png
new file mode 100644
index 0000000000..f0a4b08560
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/disable.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/down_tiering_off.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/down_tiering_off.png
new file mode 100644
index 0000000000..8c28f915d3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/down_tiering_off.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/down_tiering_on.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/down_tiering_on.png
new file mode 100644
index 0000000000..a8160419d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/down_tiering_on.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/emit_energy.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/emit_energy.png
new file mode 100644
index 0000000000..4a8544ffe9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/emit_energy.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/emit_redstone.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/emit_redstone.png
new file mode 100644
index 0000000000..92f63141c5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/emit_redstone.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/export.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/export.png
new file mode 100644
index 0000000000..953c115a33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/export.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/forbidden.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/forbidden.png
new file mode 100644
index 0000000000..1cbb440882
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/forbidden.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_and.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_and.png
new file mode 100644
index 0000000000..d0e1b9fbf1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_and.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_nand.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_nand.png
new file mode 100644
index 0000000000..1e797eb8c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_nand.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_nor.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_nor.png
new file mode 100644
index 0000000000..b9c0800167
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_nor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_or.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_or.png
new file mode 100644
index 0000000000..8b8d910818
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/gate_or.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/hourglass.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/hourglass.png
new file mode 100644
index 0000000000..ed9b8de56e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/hourglass.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/import.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/import.png
new file mode 100644
index 0000000000..44527129d6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/import.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_from_output_side.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_from_output_side.png
new file mode 100644
index 0000000000..e3dbb412a1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_from_output_side.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_off.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_off.png
new file mode 100644
index 0000000000..4d92d6ed5c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_off.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_off_disabled.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_off_disabled.png
new file mode 100644
index 0000000000..4bfc990697
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_off_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_on.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_on.png
new file mode 100644
index 0000000000..5decc4d69a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_on.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_on_disabled.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_on_disabled.png
new file mode 100644
index 0000000000..88541bcdc7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/input_separation_on_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/invert_filter.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/invert_filter.png
new file mode 100644
index 0000000000..91529dca7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/invert_filter.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/invert_redstone.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/invert_redstone.png
new file mode 100644
index 0000000000..fbc4dccc83
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/invert_redstone.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/lock.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/lock.png
new file mode 100644
index 0000000000..276f81758f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/lock.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/lock_small.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/lock_small.png
new file mode 100644
index 0000000000..3b8c8ab0f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/lock_small.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/minus_large.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/minus_large.png
new file mode 100644
index 0000000000..dd1e6e6907
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/minus_large.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/minus_small.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/minus_small.png
new file mode 100644
index 0000000000..bf387cdae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/minus_small.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/nbt.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/nbt.png
new file mode 100644
index 0000000000..4703ab2dce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/nbt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/nei.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/nei.png
new file mode 100644
index 0000000000..e5c7c4229e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/nei.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/one_stack_limit.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/one_stack_limit.png
new file mode 100644
index 0000000000..8ebbb994eb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/one_stack_limit.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/plus_large.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/plus_large.png
new file mode 100644
index 0000000000..e96883078c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/plus_large.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/plus_small.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/plus_small.png
new file mode 100644
index 0000000000..37897f68a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/plus_small.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/power_switch_off.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/power_switch_off.png
new file mode 100644
index 0000000000..c07b296a15
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/power_switch_off.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/power_switch_on.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/power_switch_on.png
new file mode 100644
index 0000000000..6ad3c59696
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/power_switch_on.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/print.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/print.png
new file mode 100644
index 0000000000..c6cd08cebd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/print.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/progress.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/progress.png
new file mode 100644
index 0000000000..226131c374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/progress.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_locked.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_locked.png
new file mode 100644
index 0000000000..51e50abade
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_locked.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_locked_disabled.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_locked_disabled.png
new file mode 100644
index 0000000000..bfbb40b76b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_locked_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_unlocked.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_unlocked.png
new file mode 100644
index 0000000000..aee99775ba
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_unlocked.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_unlocked_disabled.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_unlocked_disabled.png
new file mode 100644
index 0000000000..2ae8134b51
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/recipe_unlocked_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/redstone_off.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/redstone_off.png
new file mode 100644
index 0000000000..e51d453475
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/redstone_off.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/redstone_on.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/redstone_on.png
new file mode 100644
index 0000000000..44d6e446b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/redstone_on.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/replace_cobble_off.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/replace_cobble_off.png
new file mode 100644
index 0000000000..8b968a3413
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/replace_cobble_off.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/replace_cobble_on.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/replace_cobble_on.png
new file mode 100644
index 0000000000..45793d5470
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/replace_cobble_on.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/retract_pipes.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/retract_pipes.png
new file mode 100644
index 0000000000..f67fe157c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/retract_pipes.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/sorting_mode.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/sorting_mode.png
new file mode 100644
index 0000000000..5f505ebfe7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/sorting_mode.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/stocking_mode.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/stocking_mode.png
new file mode 100644
index 0000000000..0464399700
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/stocking_mode.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/tank_void_all.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/tank_void_all.png
new file mode 100644
index 0000000000..7f0be5ec81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/tank_void_all.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/tank_void_excess.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/tank_void_excess.png
new file mode 100644
index 0000000000..47b8698e53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/tank_void_excess.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/transpose.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/transpose.png
new file mode 100644
index 0000000000..c7e3542ac5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/transpose.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/use_inverted_processing_state.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/use_inverted_processing_state.png
new file mode 100644
index 0000000000..28a767ecee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/use_inverted_processing_state.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/use_processing_state.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/use_processing_state.png
new file mode 100644
index 0000000000..47f991c50a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/use_processing_state.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_all.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_all.png
new file mode 100644
index 0000000000..2363260986
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_all.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_fluid.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_fluid.png
new file mode 100644
index 0000000000..f496e3f2e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_fluid.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_item.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_item.png
new file mode 100644
index 0000000000..2c5a9da6aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_item.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_none.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_none.png
new file mode 100644
index 0000000000..ed7c3c92e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/void_excess_none.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/whitelist.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/whitelist.png
new file mode 100644
index 0000000000..9a60120024
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/whitelist.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_button/work_area.png b/src/main/resources/assets/gregtech/textures/gui/overlay_button/work_area.png
new file mode 100644
index 0000000000..10d6478721
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_button/work_area.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/arrow_me.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/arrow_me.png
new file mode 100644
index 0000000000..9163d4c9fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/arrow_me.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/beaker_1.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/beaker_1.png
new file mode 100644
index 0000000000..685c0693f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/beaker_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/beaker_2.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/beaker_2.png
new file mode 100644
index 0000000000..642ce080d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/beaker_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/bee_drone.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/bee_drone.png
new file mode 100644
index 0000000000..d64937b6e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/bee_drone.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/bee_queen.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/bee_queen.png
new file mode 100644
index 0000000000..4d07c69600
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/bee_queen.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/bender.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/bender.png
new file mode 100644
index 0000000000..94d7066777
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/bender.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/block.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/block.png
new file mode 100644
index 0000000000..66bc3742c4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/block.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/block_bronze.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/block_bronze.png
new file mode 100644
index 0000000000..4b8f68f319
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/block_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/block_primitive.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/block_primitive.png
new file mode 100644
index 0000000000..23599f3eca
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/block_primitive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/block_steel.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/block_steel.png
new file mode 100644
index 0000000000..382b68b180
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/block_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/box.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/box.png
new file mode 100644
index 0000000000..e7f488c977
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/box.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/boxed.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/boxed.png
new file mode 100644
index 0000000000..9808934ff6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/boxed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/canister.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/canister.png
new file mode 100644
index 0000000000..494aeeda41
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/canister.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/canister_bronze.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/canister_bronze.png
new file mode 100644
index 0000000000..27873fa630
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/canister_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/canister_steel.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/canister_steel.png
new file mode 100644
index 0000000000..4501c8acaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/canister_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/canner.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/canner.png
new file mode 100644
index 0000000000..19a03bbab1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/canner.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/cauldron.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/cauldron.png
new file mode 100644
index 0000000000..89936336fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/cauldron.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge.png
new file mode 100644
index 0000000000..6114a7446d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge_bronze.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge_bronze.png
new file mode 100644
index 0000000000..bcbc0d7efe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge_fluid.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge_fluid.png
new file mode 100644
index 0000000000..102d4a3056
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge_fluid.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge_steel.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge_steel.png
new file mode 100644
index 0000000000..930df111ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/centrifuge_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/charger.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/charger.png
new file mode 100644
index 0000000000..d2ef90b6e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/charger.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/charger_fluid.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/charger_fluid.png
new file mode 100644
index 0000000000..06ff6608bf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/charger_fluid.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/circuit.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/circuit.png
new file mode 100644
index 0000000000..23ad1cba68
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/circuit.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/coal_bronze.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/coal_bronze.png
new file mode 100644
index 0000000000..3380777508
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/coal_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/coal_steel.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/coal_steel.png
new file mode 100644
index 0000000000..3b83fb10a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/coal_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/compressor.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/compressor.png
new file mode 100644
index 0000000000..75b3e5b5c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/compressor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/compressor_bronze.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/compressor_bronze.png
new file mode 100644
index 0000000000..931a1b6542
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/compressor_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/compressor_steel.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/compressor_steel.png
new file mode 100644
index 0000000000..39c5e8888f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/compressor_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/crushed_ore.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/crushed_ore.png
new file mode 100644
index 0000000000..cf43c97689
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/crushed_ore.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/crushed_ore_bronze.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/crushed_ore_bronze.png
new file mode 100644
index 0000000000..d3daf9bb52
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/crushed_ore_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/crushed_ore_steel.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/crushed_ore_steel.png
new file mode 100644
index 0000000000..0ec3e50c05
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/crushed_ore_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/cutter_sliced.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/cutter_sliced.png
new file mode 100644
index 0000000000..ecdd1728db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/cutter_sliced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/data_orb.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/data_orb.png
new file mode 100644
index 0000000000..c2b871cd0d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/data_orb.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/data_stick.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/data_stick.png
new file mode 100644
index 0000000000..f055d55347
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/data_stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust.png
new file mode 100644
index 0000000000..58af5d0cf1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust_bronze.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust_bronze.png
new file mode 100644
index 0000000000..cd9aa05745
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust_primitive.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust_primitive.png
new file mode 100644
index 0000000000..88225d03c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust_primitive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust_steel.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust_steel.png
new file mode 100644
index 0000000000..8f8d6c1ed2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/dust_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/explosive.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/explosive.png
new file mode 100644
index 0000000000..5ace01a5d8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/explosive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/extruder_shape.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/extruder_shape.png
new file mode 100644
index 0000000000..903191b314
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/extruder_shape.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace.png
new file mode 100644
index 0000000000..177791c7c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace_bronze.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace_bronze.png
new file mode 100644
index 0000000000..e4ff24b5b8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace_primitive.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace_primitive.png
new file mode 100644
index 0000000000..891d825b61
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace_primitive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace_steel.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace_steel.png
new file mode 100644
index 0000000000..fe998a96fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/furnace_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/gem.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/gem.png
new file mode 100644
index 0000000000..fee2844418
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/hammer.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/hammer.png
new file mode 100644
index 0000000000..b1fef875b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/hammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/hammer_bronze.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/hammer_bronze.png
new file mode 100644
index 0000000000..24169fd4c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/hammer_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/hammer_steel.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/hammer_steel.png
new file mode 100644
index 0000000000..fefbffd5c1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/hammer_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/heater_1.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/heater_1.png
new file mode 100644
index 0000000000..02357bbefa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/heater_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/heater_2.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/heater_2.png
new file mode 100644
index 0000000000..1badf33043
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/heater_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/implosion.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/implosion.png
new file mode 100644
index 0000000000..a03c2cb124
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/implosion.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/in.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/in.png
new file mode 100644
index 0000000000..95c802cf2e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/in.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/in_bronze.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/in_bronze.png
new file mode 100644
index 0000000000..9370501b6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/in_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/in_steel.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/in_steel.png
new file mode 100644
index 0000000000..9408d633a5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/in_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/ingot_bronze.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/ingot_bronze.png
new file mode 100644
index 0000000000..af593dcd19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/ingot_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/ingot_primitive.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/ingot_primitive.png
new file mode 100644
index 0000000000..1d40100585
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/ingot_primitive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/int_circuit.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/int_circuit.png
new file mode 100644
index 0000000000..0722a3f79f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/int_circuit.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/lens.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/lens.png
new file mode 100644
index 0000000000..11a128fd20
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/microscope.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/microscope.png
new file mode 100644
index 0000000000..7a1025da06
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/microscope.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/mining_pipe.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/mining_pipe.png
new file mode 100644
index 0000000000..3a1580bd98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/mining_pipe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/mold.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/mold.png
new file mode 100644
index 0000000000..8a98a239e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/mold.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/molecular_1.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/molecular_1.png
new file mode 100644
index 0000000000..1c77add216
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/molecular_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/molecular_2.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/molecular_2.png
new file mode 100644
index 0000000000..7716eec479
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/molecular_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/molecular_3.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/molecular_3.png
new file mode 100644
index 0000000000..6bc54bc6b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/molecular_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_0.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_0.png
new file mode 100644
index 0000000000..9790b63924
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_1.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_1.png
new file mode 100644
index 0000000000..59b928cabe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_10.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_10.png
new file mode 100644
index 0000000000..6bedbae2b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_10.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_11.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_11.png
new file mode 100644
index 0000000000..09b2937ac8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_11.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_2.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_2.png
new file mode 100644
index 0000000000..f6d8d720d1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_3.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_3.png
new file mode 100644
index 0000000000..932a606bb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_4.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_4.png
new file mode 100644
index 0000000000..24be3e3781
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_5.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_5.png
new file mode 100644
index 0000000000..b04f46e404
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_6.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_6.png
new file mode 100644
index 0000000000..fa316ac91a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_7.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_7.png
new file mode 100644
index 0000000000..c2e5a643d1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_8.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_8.png
new file mode 100644
index 0000000000..29125e7e59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_9.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_9.png
new file mode 100644
index 0000000000..bdd4decbe9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/number_9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/out.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/out.png
new file mode 100644
index 0000000000..aa3742a7b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/out.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/out_bronze.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/out_bronze.png
new file mode 100644
index 0000000000..b50091ace7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/out_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/out_steel.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/out_steel.png
new file mode 100644
index 0000000000..4db6dad0f3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/out_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/page_blank.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/page_blank.png
new file mode 100644
index 0000000000..5e46c1a437
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/page_blank.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/page_printed.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/page_printed.png
new file mode 100644
index 0000000000..eb4776fe0a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/page_printed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/pattern_me.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/pattern_me.png
new file mode 100644
index 0000000000..86f9f49132
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/pattern_me.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/press_1.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/press_1.png
new file mode 100644
index 0000000000..1778527522
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/press_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/press_2.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/press_2.png
new file mode 100644
index 0000000000..b4b4a8e462
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/press_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/press_3.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/press_3.png
new file mode 100644
index 0000000000..16af4284d3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/press_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/recycle.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/recycle.png
new file mode 100644
index 0000000000..59cb12cd1f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/recycle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/rod_1.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/rod_1.png
new file mode 100644
index 0000000000..95d08d1ba2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/rod_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/rod_2.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/rod_2.png
new file mode 100644
index 0000000000..a26df20030
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/rod_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/slice_shape.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/slice_shape.png
new file mode 100644
index 0000000000..d620d8968d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/slice_shape.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/slicer_sliced.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/slicer_sliced.png
new file mode 100644
index 0000000000..8952f35009
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/slicer_sliced.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/square.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/square.png
new file mode 100644
index 0000000000..481f4527dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/square.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/uua.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/uua.png
new file mode 100644
index 0000000000..86edb380b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/uua.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/uum.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/uum.png
new file mode 100644
index 0000000000..966bb1d441
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/uum.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/vial_1.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/vial_1.png
new file mode 100644
index 0000000000..fddfaf93d8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/vial_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/vial_2.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/vial_2.png
new file mode 100644
index 0000000000..8dd1eaefe9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/vial_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/wiremill.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/wiremill.png
new file mode 100644
index 0000000000..5a0abba43b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/wiremill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay_slot/wrench.png b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/wrench.png
new file mode 100644
index 0000000000..df42209695
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/overlay_slot/wrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/alloy_smelter_molding.png b/src/main/resources/assets/gregtech/textures/gui/picture/alloy_smelter_molding.png
new file mode 100644
index 0000000000..333b94759d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/alloy_smelter_molding.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/alloy_smelter_recycling.png b/src/main/resources/assets/gregtech/textures/gui/picture/alloy_smelter_recycling.png
new file mode 100644
index 0000000000..7210d1bd95
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/alloy_smelter_recycling.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/arc_furnace_recycling.png b/src/main/resources/assets/gregtech/textures/gui/picture/arc_furnace_recycling.png
new file mode 100644
index 0000000000..c5c1bd598d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/arc_furnace_recycling.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/arrow_22_blue.png b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_22_blue.png
new file mode 100644
index 0000000000..88227111e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_22_blue.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/arrow_22_red.png b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_22_red.png
new file mode 100644
index 0000000000..c02813b1bd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_22_red.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/arrow_22_white.png b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_22_white.png
new file mode 100644
index 0000000000..d796c3062b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_22_white.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/arrow_24_blue.png b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_24_blue.png
new file mode 100644
index 0000000000..42d71dee80
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_24_blue.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/arrow_24_red.png b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_24_red.png
new file mode 100644
index 0000000000..a5aef1fb23
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_24_red.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/arrow_24_white.png b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_24_white.png
new file mode 100644
index 0000000000..a3b89aa029
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_24_white.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/arrow_double.png b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_double.png
new file mode 100644
index 0000000000..bdb9bbf8bf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_double.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/fluid_extractor_recycling.png b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_extractor_recycling.png
new file mode 100644
index 0000000000..31a3ed19ee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_extractor_recycling.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/fluid_in.png b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_in.png
new file mode 100644
index 0000000000..a78a13db69
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_in.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/fluid_out.png b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_out.png
new file mode 100644
index 0000000000..60aa2fe90a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_out.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/fluid_tank.png b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_tank.png
new file mode 100644
index 0000000000..7a08556148
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_tank.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/fluid_window.png b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_window.png
new file mode 100644
index 0000000000..86167c6365
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/fluid_window.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/forge_hammer_recycling.png b/src/main/resources/assets/gregtech/textures/gui/picture/forge_hammer_recycling.png
new file mode 100644
index 0000000000..2bba77de12
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/forge_hammer_recycling.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/gauge.png b/src/main/resources/assets/gregtech/textures/gui/picture/gauge.png
new file mode 100644
index 0000000000..6d4869b0e4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/gauge.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent.png b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent.png
new file mode 100644
index 0000000000..e211364a77
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_bronze.png b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_bronze.png
new file mode 100644
index 0000000000..bbbfd45eb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_gray.png b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_gray.png
new file mode 100644
index 0000000000..af3a1b311b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_gray.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_primitive.png b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_primitive.png
new file mode 100644
index 0000000000..1ac5f97ee3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_primitive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_steel.png b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_steel.png
new file mode 100644
index 0000000000..ac9e663c5c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_17x17_transparent_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_18x18.png b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_18x18.png
new file mode 100644
index 0000000000..24b96c5ce3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_18x18.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_19x19.png b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_19x19.png
new file mode 100644
index 0000000000..6dcd13abf2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/gt_logo_19x19.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/information.png b/src/main/resources/assets/gregtech/textures/gui/picture/information.png
new file mode 100644
index 0000000000..ffe96dfbb6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/information.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/item_in.png b/src/main/resources/assets/gregtech/textures/gui/picture/item_in.png
new file mode 100644
index 0000000000..10dd12f753
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/item_in.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/item_out.png b/src/main/resources/assets/gregtech/textures/gui/picture/item_out.png
new file mode 100644
index 0000000000..831650cb28
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/item_out.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/macerator_recycling.png b/src/main/resources/assets/gregtech/textures/gui/picture/macerator_recycling.png
new file mode 100644
index 0000000000..69a79e1a8a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/macerator_recycling.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/plasma_arc_furnace_recycling.png b/src/main/resources/assets/gregtech/textures/gui/picture/plasma_arc_furnace_recycling.png
new file mode 100644
index 0000000000..2dbf7ce070
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/plasma_arc_furnace_recycling.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/radiation_warning.png b/src/main/resources/assets/gregtech/textures/gui/picture/radiation_warning.png
new file mode 100644
index 0000000000..8e09a59871
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/radiation_warning.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/screen_black.png b/src/main/resources/assets/gregtech/textures/gui/picture/screen_black.png
new file mode 100644
index 0000000000..3872ef9a20
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/screen_black.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/slots_holo_3by3.png b/src/main/resources/assets/gregtech/textures/gui/picture/slots_holo_3by3.png
new file mode 100644
index 0000000000..44277375f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/slots_holo_3by3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/square_light_gray.png b/src/main/resources/assets/gregtech/textures/gui/picture/square_light_gray.png
new file mode 100644
index 0000000000..62199d07b0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/square_light_gray.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/stalled_electricity.png b/src/main/resources/assets/gregtech/textures/gui/picture/stalled_electricity.png
new file mode 100644
index 0000000000..1ac4c9809f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/stalled_electricity.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/stalled_steam.png b/src/main/resources/assets/gregtech/textures/gui/picture/stalled_steam.png
new file mode 100644
index 0000000000..febbe78fd7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/stalled_steam.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/super_buffer.png b/src/main/resources/assets/gregtech/textures/gui/picture/super_buffer.png
new file mode 100644
index 0000000000..92f348db76
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/super_buffer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/tic_bolt_molding.png b/src/main/resources/assets/gregtech/textures/gui/picture/tic_bolt_molding.png
new file mode 100644
index 0000000000..f2ec0bc144
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/tic_bolt_molding.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/tic_part_extruding.png b/src/main/resources/assets/gregtech/textures/gui/picture/tic_part_extruding.png
new file mode 100644
index 0000000000..502ee21028
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/tic_part_extruding.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/transparent.png b/src/main/resources/assets/gregtech/textures/gui/picture/transparent.png
new file mode 100644
index 0000000000..6a3a6eef1e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/transparent.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow.png
new file mode 100644
index 0000000000..b35710e788
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_2_bronze.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_2_bronze.png
new file mode 100644
index 0000000000..d904db6b89
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_2_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_2_primitive.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_2_primitive.png
new file mode 100644
index 0000000000..a5afd955a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_2_primitive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_bronze.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_bronze.png
new file mode 100644
index 0000000000..bf3bc4ae29
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_multiple.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_multiple.png
new file mode 100644
index 0000000000..94bd012427
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_multiple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_steel.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_steel.png
new file mode 100644
index 0000000000..44b32073ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/arrow_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/assemble.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/assemble.png
new file mode 100644
index 0000000000..5cef5150c5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/assemble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/assemblyline_1.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/assemblyline_1.png
new file mode 100644
index 0000000000..54843adda8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/assemblyline_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/assemblyline_2.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/assemblyline_2.png
new file mode 100644
index 0000000000..4cd4e03dea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/assemblyline_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/assemblyline_3.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/assemblyline_3.png
new file mode 100644
index 0000000000..b9db53edbf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/assemblyline_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/bath.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/bath.png
new file mode 100644
index 0000000000..31c20f3f62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/bath.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/bending.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/bending.png
new file mode 100644
index 0000000000..2d8a43be01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/bending.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_empty_bronze.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_empty_bronze.png
new file mode 100644
index 0000000000..39102045b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_empty_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_empty_steel.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_empty_steel.png
new file mode 100644
index 0000000000..f656ed8b88
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_empty_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_heat.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_heat.png
new file mode 100644
index 0000000000..dbd2f0d769
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_heat.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_steam.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_steam.png
new file mode 100644
index 0000000000..d6c4998ed8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_steam.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_water.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_water.png
new file mode 100644
index 0000000000..72247dd59f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/boiler_water.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/canner.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/canner.png
new file mode 100644
index 0000000000..e72573b1e7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/canner.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/circuit_assembler.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/circuit_assembler.png
new file mode 100644
index 0000000000..a867327d18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/circuit_assembler.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/compress.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/compress.png
new file mode 100644
index 0000000000..897bb48a11
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/compress.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/compress_bronze.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/compress_bronze.png
new file mode 100644
index 0000000000..507b925da9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/compress_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/compress_steel.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/compress_steel.png
new file mode 100644
index 0000000000..955c73cbca
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/compress_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/cut.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/cut.png
new file mode 100644
index 0000000000..a426586e66
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/cut.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/extract.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/extract.png
new file mode 100644
index 0000000000..6bd1bc92f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/extract.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/extract_bronze.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/extract_bronze.png
new file mode 100644
index 0000000000..0e03e68c54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/extract_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/extract_steel.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/extract_steel.png
new file mode 100644
index 0000000000..c5f825a8b1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/extract_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/extrude.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/extrude.png
new file mode 100644
index 0000000000..f64c2708cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/extrude.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/fuel_bronze.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/fuel_bronze.png
new file mode 100644
index 0000000000..b7e3b36ce8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/fuel_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/fuel_steel.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/fuel_steel.png
new file mode 100644
index 0000000000..26957d6770
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/fuel_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer.png
new file mode 100644
index 0000000000..a2ea8cb28f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_base.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_base.png
new file mode 100644
index 0000000000..7f50b3a5cd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_base_bronze.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_base_bronze.png
new file mode 100644
index 0000000000..e0aa52fbdb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_base_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_base_steel.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_base_steel.png
new file mode 100644
index 0000000000..f482e1d451
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_base_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_bronze.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_bronze.png
new file mode 100644
index 0000000000..4d99f45feb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_steel.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_steel.png
new file mode 100644
index 0000000000..4145aad35b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/hammer_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/lathe.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/lathe.png
new file mode 100644
index 0000000000..a078d463f3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/lathe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/lathe_base.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/lathe_base.png
new file mode 100644
index 0000000000..4d64b6d2a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/lathe_base.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/macerate.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/macerate.png
new file mode 100644
index 0000000000..5b7bee969e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/macerate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/macerate_bronze.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/macerate_bronze.png
new file mode 100644
index 0000000000..833d82e146
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/macerate_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/macerate_steel.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/macerate_steel.png
new file mode 100644
index 0000000000..3a1ed26b12
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/macerate_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/magnet.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/magnet.png
new file mode 100644
index 0000000000..81955786e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/magnet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/mixer.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/mixer.png
new file mode 100644
index 0000000000..6cb08b318a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/mixer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/recycle.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/recycle.png
new file mode 100644
index 0000000000..1855e44fe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/recycle.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/sift.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/sift.png
new file mode 100644
index 0000000000..b262244ba9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/sift.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/slice.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/slice.png
new file mode 100644
index 0000000000..80c41ef40c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/slice.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/stored_eu.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/stored_eu.png
new file mode 100644
index 0000000000..3d50b89c4e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/stored_eu.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/progressbar/wiremill.png b/src/main/resources/assets/gregtech/textures/gui/progressbar/wiremill.png
new file mode 100644
index 0000000000..8938e55e8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/progressbar/wiremill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/slot/dark_gray.png b/src/main/resources/assets/gregtech/textures/gui/slot/dark_gray.png
new file mode 100644
index 0000000000..38b7f6526e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/slot/dark_gray.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/slot/fluid_bronze.png b/src/main/resources/assets/gregtech/textures/gui/slot/fluid_bronze.png
new file mode 100644
index 0000000000..87a20f2e94
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/slot/fluid_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/slot/fluid_primitive.png b/src/main/resources/assets/gregtech/textures/gui/slot/fluid_primitive.png
new file mode 100644
index 0000000000..7d7d3e2c35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/slot/fluid_primitive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/slot/fluid_steel.png b/src/main/resources/assets/gregtech/textures/gui/slot/fluid_steel.png
new file mode 100644
index 0000000000..c9c04ea90c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/slot/fluid_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/slot/item_bronze.png b/src/main/resources/assets/gregtech/textures/gui/slot/item_bronze.png
new file mode 100644
index 0000000000..6bc82373bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/slot/item_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/slot/item_primitive.png b/src/main/resources/assets/gregtech/textures/gui/slot/item_primitive.png
new file mode 100644
index 0000000000..3d8e4aa6b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/slot/item_primitive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/slot/item_steel.png b/src/main/resources/assets/gregtech/textures/gui/slot/item_steel.png
new file mode 100644
index 0000000000..6a0b3f6ce5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/slot/item_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/slot/item_uplifted.png b/src/main/resources/assets/gregtech/textures/gui/slot/item_uplifted.png
new file mode 100644
index 0000000000..c6200f0f7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/slot/item_uplifted.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/slot/maintenance.png b/src/main/resources/assets/gregtech/textures/gui/slot/maintenance.png
new file mode 100644
index 0000000000..69c2c132bc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/slot/maintenance.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/cover_bronze_disabled.png b/src/main/resources/assets/gregtech/textures/gui/tab/cover_bronze_disabled.png
new file mode 100644
index 0000000000..28e0ad9d6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/cover_bronze_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/cover_bronze_highlight.png b/src/main/resources/assets/gregtech/textures/gui/tab/cover_bronze_highlight.png
new file mode 100644
index 0000000000..87d19fedf5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/cover_bronze_highlight.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/cover_bronze_normal.png b/src/main/resources/assets/gregtech/textures/gui/tab/cover_bronze_normal.png
new file mode 100644
index 0000000000..b03dccfee1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/cover_bronze_normal.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/cover_disabled.png b/src/main/resources/assets/gregtech/textures/gui/tab/cover_disabled.png
new file mode 100644
index 0000000000..cb001d6073
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/cover_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/cover_highlight.png b/src/main/resources/assets/gregtech/textures/gui/tab/cover_highlight.png
new file mode 100644
index 0000000000..6ae680474e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/cover_highlight.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/cover_normal.png b/src/main/resources/assets/gregtech/textures/gui/tab/cover_normal.png
new file mode 100644
index 0000000000..184d06e85a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/cover_normal.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/cover_primitive_disabled.png b/src/main/resources/assets/gregtech/textures/gui/tab/cover_primitive_disabled.png
new file mode 100644
index 0000000000..361c509456
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/cover_primitive_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/cover_primitive_highlight.png b/src/main/resources/assets/gregtech/textures/gui/tab/cover_primitive_highlight.png
new file mode 100644
index 0000000000..e56b8c6264
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/cover_primitive_highlight.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/cover_primitive_normal.png b/src/main/resources/assets/gregtech/textures/gui/tab/cover_primitive_normal.png
new file mode 100644
index 0000000000..4ce4f9dd81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/cover_primitive_normal.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/cover_steel_disabled.png b/src/main/resources/assets/gregtech/textures/gui/tab/cover_steel_disabled.png
new file mode 100644
index 0000000000..109ebb87c3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/cover_steel_disabled.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/cover_steel_highlight.png b/src/main/resources/assets/gregtech/textures/gui/tab/cover_steel_highlight.png
new file mode 100644
index 0000000000..c5ab3bffbf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/cover_steel_highlight.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/cover_steel_normal.png b/src/main/resources/assets/gregtech/textures/gui/tab/cover_steel_normal.png
new file mode 100644
index 0000000000..fadd848930
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/cover_steel_normal.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/title.png b/src/main/resources/assets/gregtech/textures/gui/tab/title.png
new file mode 100644
index 0000000000..45e8f11e02
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/title.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/title_angular.png b/src/main/resources/assets/gregtech/textures/gui/tab/title_angular.png
new file mode 100644
index 0000000000..b2641335c8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/title_angular.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/title_angular_bronze.png b/src/main/resources/assets/gregtech/textures/gui/tab/title_angular_bronze.png
new file mode 100644
index 0000000000..8084421071
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/title_angular_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/title_angular_primitive.png b/src/main/resources/assets/gregtech/textures/gui/tab/title_angular_primitive.png
new file mode 100644
index 0000000000..2f52921249
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/title_angular_primitive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/title_angular_steel.png b/src/main/resources/assets/gregtech/textures/gui/tab/title_angular_steel.png
new file mode 100644
index 0000000000..236f81ce89
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/title_angular_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/title_bronze.png b/src/main/resources/assets/gregtech/textures/gui/tab/title_bronze.png
new file mode 100644
index 0000000000..580ca2b177
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/title_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/title_dark.png b/src/main/resources/assets/gregtech/textures/gui/tab/title_dark.png
new file mode 100644
index 0000000000..c8332c9d5a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/title_dark.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/title_dark_bronze.png b/src/main/resources/assets/gregtech/textures/gui/tab/title_dark_bronze.png
new file mode 100644
index 0000000000..a42bc05de9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/title_dark_bronze.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/title_dark_primitive.png b/src/main/resources/assets/gregtech/textures/gui/tab/title_dark_primitive.png
new file mode 100644
index 0000000000..0d5a701406
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/title_dark_primitive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/title_dark_steel.png b/src/main/resources/assets/gregtech/textures/gui/tab/title_dark_steel.png
new file mode 100644
index 0000000000..d28a376082
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/title_dark_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/title_primitive.png b/src/main/resources/assets/gregtech/textures/gui/tab/title_primitive.png
new file mode 100644
index 0000000000..8ea3f49c1c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/title_primitive.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/tab/title_steel.png b/src/main/resources/assets/gregtech/textures/gui/tab/title_steel.png
new file mode 100644
index 0000000000..2be4caf385
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/tab/title_steel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/gui/void.png b/src/main/resources/assets/gregtech/textures/gui/void.png
new file mode 100644
index 0000000000..cf532b7153
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/guiColors.json b/src/main/resources/assets/gregtech/textures/guiColors.json
new file mode 100644
index 0000000000..7f11786e4f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/guiColors.json
@@ -0,0 +1,69 @@
+{
+ "GT5U.gui.color.oneByOne": "404040",
+ "GT5U.gui.color.twoByTwo": "404040",
+ "GT5U.gui.color.twoByTwoFluid": "404040",
+ "GT5U.gui.color.twoByTwoFluidInventory": "404040",
+ "GT5U.gui.color.threeByThree": "404040",
+ "GT5U.gui.color.fourByFour": "404040",
+
+ "GT5U.gui.color.basicMachine": "404040",
+ "GT5U.gui.color.basicTankTitle": "404040",
+ "GT5U.gui.color.basicTankInventory": "404040",
+ "GT5U.gui.color.basicTankLiquidAmount": "FAFAFF",
+ "GT5U.gui.color.basicTankLiquidValue": "FAFAFF",
+
+ "GT5U.gui.color.maintenanceHatch": "404040",
+ "GT5U.gui.color.maintenanceHatchRepair": "404040",
+
+ "GT5U.gui.color.multiMachineTitle": "FAFAFF",
+ "GT5U.gui.color.multiMachineDrillBaseText": "FAFAFF",
+ "GT5U.gui.color.multiMachineIncompleteStructure": "FAFAFF",
+ "GT5U.gui.color.multiMachineLargeTurbineText": "FAFAFF",
+ "GT5U.gui.color.multiMachineMaintenanceText": "FAFAFF",
+ "GT5U.gui.color.multiMachineMalletRestart": "FAFAFF",
+ "GT5U.gui.color.multiMachineRunningPerfectly": "FAFAFF",
+
+ "GT5U.gui.color.outputHatchTitle": "404040",
+ "GT5U.gui.color.outputHatchInventory": "404040",
+ "GT5U.gui.color.outputHatchAmount": "FAFAFF",
+ "GT5U.gui.color.outputHatchValue": "FAFAFF",
+ "GT5U.gui.color.outputHatchFluidName": "FAFAFF",
+ "GT5U.gui.color.outputHatchLockedFluid": "FAFAFF",
+
+ "GT5U.gui.color.boiler": "404040",
+ "GT5U.gui.color.bronzeBlastFurnace": "404040",
+ "GT5U.gui.color.fusionReactor": "FF0000",
+ "GT5U.gui.color.industrialApiary": "404040",
+ "GT5U.gui.color.microwaveEnergyTransmitter": "FAFAFF",
+ "GT5U.gui.color.primitiveBlastFurnace": "404040",
+ "GT5U.gui.color.quantumChestTitle": "404040",
+ "GT5U.gui.color.quantumChestAmount": "FAFAFF",
+ "GT5U.gui.color.regulator": "FAFAFF",
+ "GT5U.gui.color.teleporter": "FAFAFF",
+
+ "GT5U.gui.color.fluidDisplayStackRenderer": "FFFFFF",
+
+ "GT5U.gui.color.dialogSelectItem": "FF555555",
+ "GT5U.gui.color.pollutionRenderer": "FFFFFFFF",
+ "GT5U.gui.color.screenText": "FF222222",
+
+ "GT5U.gui.color.NEIText": "FF000000",
+
+ "GT5U.gui.color.coverArm": "FF555555",
+ "GT5U.gui.color.coverControlsWork": "FF555555",
+ "GT5U.gui.color.coverConveyor": "FF555555",
+ "GT5U.gui.color.coverDoesWork": "FF555555",
+ "GT5U.gui.color.coverEUMeter": "FF555555",
+ "GT5U.gui.color.coverFluidFilterName": "FF222222",
+ "GT5U.gui.color.coverFluidFilter": "FF555555",
+ "GT5U.gui.color.coverFluidRegulator": "FF555555",
+ "GT5U.gui.color.coverFluidRegulatorWarn": "FFFF0000",
+ "GT5U.gui.color.coverItemFilter": "FF555555",
+ "GT5U.gui.color.coverItemMeter": "FF555555",
+ "GT5U.gui.color.coverLiquidMeter": "FF555555",
+ "GT5U.gui.color.coverMaintenance": "FF555555",
+ "GT5U.gui.color.coverPlayerDetector": "FF555555",
+ "GT5U.gui.color.coverPump": "FF555555",
+ "GT5U.gui.color.coverRedstoneWirelessBase": "FF555555",
+ "GT5U.gui.color.coverShutter": "FF555555"
+}
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.1080k_Space_Coolantcell.png b/src/main/resources/assets/gregtech/textures/items/gt.1080k_Space_Coolantcell.png
new file mode 100644
index 0000000000..a3bfa02830
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.1080k_Space_Coolantcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.180k_Helium_Coolantcell.png b/src/main/resources/assets/gregtech/textures/items/gt.180k_Helium_Coolantcell.png
new file mode 100644
index 0000000000..8a95453623
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.180k_Helium_Coolantcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.180k_NaK_Coolantcell.png b/src/main/resources/assets/gregtech/textures/items/gt.180k_NaK_Coolantcell.png
new file mode 100644
index 0000000000..0e81b7e548
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.180k_NaK_Coolantcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.180k_Space_Coolantcell.png b/src/main/resources/assets/gregtech/textures/items/gt.180k_Space_Coolantcell.png
new file mode 100644
index 0000000000..5877654603
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.180k_Space_Coolantcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.360k_Helium_Coolantcell.png b/src/main/resources/assets/gregtech/textures/items/gt.360k_Helium_Coolantcell.png
new file mode 100644
index 0000000000..494df0a9c4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.360k_Helium_Coolantcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.360k_NaK_Coolantcell.png b/src/main/resources/assets/gregtech/textures/items/gt.360k_NaK_Coolantcell.png
new file mode 100644
index 0000000000..2cf9ef39d8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.360k_NaK_Coolantcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.360k_Space_Coolantcell.png b/src/main/resources/assets/gregtech/textures/items/gt.360k_Space_Coolantcell.png
new file mode 100644
index 0000000000..17a76234fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.360k_Space_Coolantcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.540k_Space_Coolantcell.png b/src/main/resources/assets/gregtech/textures/items/gt.540k_Space_Coolantcell.png
new file mode 100644
index 0000000000..b34c1602d6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.540k_Space_Coolantcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.60k_Helium_Coolantcell.png b/src/main/resources/assets/gregtech/textures/items/gt.60k_Helium_Coolantcell.png
new file mode 100644
index 0000000000..0bcec85661
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.60k_Helium_Coolantcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.60k_NaK_Coolantcell.png b/src/main/resources/assets/gregtech/textures/items/gt.60k_NaK_Coolantcell.png
new file mode 100644
index 0000000000..c61d10c9a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.60k_NaK_Coolantcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Double_MNqCell.png b/src/main/resources/assets/gregtech/textures/items/gt.Double_MNqCell.png
new file mode 100644
index 0000000000..a2691c6f54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Double_MNqCell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Double_MNqCellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.Double_MNqCellDep.png
new file mode 100644
index 0000000000..a2f08d33c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Double_MNqCellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Double_Naquadahcell.png b/src/main/resources/assets/gregtech/textures/items/gt.Double_Naquadahcell.png
new file mode 100644
index 0000000000..afa85a5404
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Double_Naquadahcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Double_NaquadahcellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.Double_NaquadahcellDep.png
new file mode 100644
index 0000000000..a7b9d472d8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Double_NaquadahcellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Double_Thoriumcell.png b/src/main/resources/assets/gregtech/textures/items/gt.Double_Thoriumcell.png
new file mode 100644
index 0000000000..a8bd63f70f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Double_Thoriumcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Double_ThoriumcellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.Double_ThoriumcellDep.png
new file mode 100644
index 0000000000..a8bd63f70f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Double_ThoriumcellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.MNqCell.png b/src/main/resources/assets/gregtech/textures/items/gt.MNqCell.png
new file mode 100644
index 0000000000..44d8cf5026
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.MNqCell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.MNqCellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.MNqCellDep.png
new file mode 100644
index 0000000000..50d7f173c4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.MNqCellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Naquadahcell.png b/src/main/resources/assets/gregtech/textures/items/gt.Naquadahcell.png
new file mode 100644
index 0000000000..54f7ebc905
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Naquadahcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.NaquadahcellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.NaquadahcellDep.png
new file mode 100644
index 0000000000..6fdcb39121
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.NaquadahcellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Quad_MNqCell.png b/src/main/resources/assets/gregtech/textures/items/gt.Quad_MNqCell.png
new file mode 100644
index 0000000000..4560dce2eb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Quad_MNqCell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Quad_MNqCellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.Quad_MNqCellDep.png
new file mode 100644
index 0000000000..a9d299caac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Quad_MNqCellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Quad_Naquadahcell.png b/src/main/resources/assets/gregtech/textures/items/gt.Quad_Naquadahcell.png
new file mode 100644
index 0000000000..415a0270a0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Quad_Naquadahcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Quad_NaquadahcellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.Quad_NaquadahcellDep.png
new file mode 100644
index 0000000000..203b49a563
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Quad_NaquadahcellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Quad_Thoriumcell.png b/src/main/resources/assets/gregtech/textures/items/gt.Quad_Thoriumcell.png
new file mode 100644
index 0000000000..4ad08ff344
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Quad_Thoriumcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Quad_ThoriumcellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.Quad_ThoriumcellDep.png
new file mode 100644
index 0000000000..4ad08ff344
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Quad_ThoriumcellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Thoriumcell.png b/src/main/resources/assets/gregtech/textures/items/gt.Thoriumcell.png
new file mode 100644
index 0000000000..7b2dc260f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Thoriumcell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.ThoriumcellDep.png b/src/main/resources/assets/gregtech/textures/items/gt.ThoriumcellDep.png
new file mode 100644
index 0000000000..7b2dc260f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.ThoriumcellDep.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.png b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.png
new file mode 100644
index 0000000000..f24a6a173b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.window.png b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.window.png
new file mode 100644
index 0000000000..ed91d3d591
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.Volumetric_Flask.window.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.advancedsensorcard.png b/src/main/resources/assets/gregtech/textures/items/gt.advancedsensorcard.png
new file mode 100644
index 0000000000..f9b6d81f02
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.advancedsensorcard.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.advancedsensorcardburned.png b/src/main/resources/assets/gregtech/textures/items/gt.advancedsensorcardburned.png
new file mode 100644
index 0000000000..7ed3a05488
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.advancedsensorcardburned.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.glowstoneCell.png b/src/main/resources/assets/gregtech/textures/items/gt.glowstoneCell.png
new file mode 100644
index 0000000000..d4fa2e24fd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.glowstoneCell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit.png
new file mode 100644
index 0000000000..3fa897cf88
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/0.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/0.png
new file mode 100644
index 0000000000..6e97911f11
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/1.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/1.png
new file mode 100644
index 0000000000..79bf5af5b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/10.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/10.png
new file mode 100644
index 0000000000..b732889d5b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/10.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/11.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/11.png
new file mode 100644
index 0000000000..37d5b4fa81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/11.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/12.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/12.png
new file mode 100644
index 0000000000..4783c5eb63
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/12.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/13.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/13.png
new file mode 100644
index 0000000000..b7ee81de20
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/13.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/14.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/14.png
new file mode 100644
index 0000000000..7118d4d086
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/14.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/15.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/15.png
new file mode 100644
index 0000000000..ef12ca0a53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/15.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/16.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/16.png
new file mode 100644
index 0000000000..c8c57bcfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/16.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/17.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/17.png
new file mode 100644
index 0000000000..398be00bb5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/17.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/18.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/18.png
new file mode 100644
index 0000000000..68e73fb326
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/18.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/19.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/19.png
new file mode 100644
index 0000000000..b7b3aa6ee5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/19.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/2.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/2.png
new file mode 100644
index 0000000000..259e8a3f68
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/20.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/20.png
new file mode 100644
index 0000000000..6d4ddbf81c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/20.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/21.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/21.png
new file mode 100644
index 0000000000..49c0b0b3f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/21.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/22.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/22.png
new file mode 100644
index 0000000000..c82b0d989b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/22.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/23.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/23.png
new file mode 100644
index 0000000000..c3e0e0088d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/23.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/24.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/24.png
new file mode 100644
index 0000000000..ee6f9ff83d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/24.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/3.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/3.png
new file mode 100644
index 0000000000..795b6b7d90
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/4.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/4.png
new file mode 100644
index 0000000000..f7d3b18de8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/5.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/5.png
new file mode 100644
index 0000000000..c0e79a1816
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/6.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/6.png
new file mode 100644
index 0000000000..daa93cd1a9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/7.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/7.png
new file mode 100644
index 0000000000..59170780a1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/8.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/8.png
new file mode 100644
index 0000000000..ca08c0e131
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/9.png b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/9.png
new file mode 100644
index 0000000000..4bed5d4a22
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.integrated_circuit/9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/0.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/0.png
new file mode 100644
index 0000000000..9590e8148c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/1.png
new file mode 100644
index 0000000000..1ec3315b0c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/10.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/10.png
new file mode 100644
index 0000000000..f056c60f77
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/10.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/100.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/100.png
new file mode 100644
index 0000000000..ec62f0d084
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/100.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/101.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/101.png
new file mode 100644
index 0000000000..a2d9d08a81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/101.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/11.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/11.png
new file mode 100644
index 0000000000..9754a8f061
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/11.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/110.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/110.png
new file mode 100644
index 0000000000..a349c0f2f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/110.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/111.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/111.png
new file mode 100644
index 0000000000..50c9edcd9c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/111.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/13.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/13.png
new file mode 100644
index 0000000000..47ce31af9c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/13.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/14.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/14.png
new file mode 100644
index 0000000000..8dffb97134
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/14.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/1.png
new file mode 100644
index 0000000000..e028da0487
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/2.png
new file mode 100644
index 0000000000..4711daed83
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/3.png
new file mode 100644
index 0000000000..6f9dbf32aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/4.png
new file mode 100644
index 0000000000..22164fef97
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/5.png
new file mode 100644
index 0000000000..ea9b00b565
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/6.png
new file mode 100644
index 0000000000..039166c9fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/7.png
new file mode 100644
index 0000000000..dc637d9ba9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/8.png
new file mode 100644
index 0000000000..ba5f51443a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/145/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/1.png
new file mode 100644
index 0000000000..c367eb7a45
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/2.png
new file mode 100644
index 0000000000..54a2a8a9fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/3.png
new file mode 100644
index 0000000000..b3a31d3e5a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/4.png
new file mode 100644
index 0000000000..59f0ddb726
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/5.png
new file mode 100644
index 0000000000..2fb324ac89
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/6.png
new file mode 100644
index 0000000000..22993a0660
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/7.png
new file mode 100644
index 0000000000..dc637d9ba9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/8.png
new file mode 100644
index 0000000000..ba5f51443a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/146/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/15.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/15.png
new file mode 100644
index 0000000000..36f19a1d77
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/15.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/16.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/16.png
new file mode 100644
index 0000000000..d92f69bce3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/16.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/17.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/17.png
new file mode 100644
index 0000000000..bcdc400fd6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/17.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/18.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/18.png
new file mode 100644
index 0000000000..24b8cc269e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/18.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/18.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/18.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/18.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/19.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/19.png
new file mode 100644
index 0000000000..304efc9aec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/19.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/19.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/19.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/19.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/2.png
new file mode 100644
index 0000000000..0bafc0de43
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/20.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/20.png
new file mode 100644
index 0000000000..0c5ff08742
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/20.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/20.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/20.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/20.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/200.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/200.png
new file mode 100644
index 0000000000..d88f86e359
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/200.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/201.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/201.png
new file mode 100644
index 0000000000..0db7f11221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/201.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/202.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/202.png
new file mode 100644
index 0000000000..0db7f11221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/202.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/203.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/203.png
new file mode 100644
index 0000000000..0db7f11221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/203.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/204.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/204.png
new file mode 100644
index 0000000000..f537460556
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/204.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/205.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/205.png
new file mode 100644
index 0000000000..f537460556
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/205.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/206.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/206.png
new file mode 100644
index 0000000000..280e968bbc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/206.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/207.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/207.png
new file mode 100644
index 0000000000..280e968bbc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/207.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/208.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/208.png
new file mode 100644
index 0000000000..4b394b4a60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/208.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/21.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/21.png
new file mode 100644
index 0000000000..27c00dd4e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/21.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/22.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/22.png
new file mode 100644
index 0000000000..cf44fca9a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/22.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/22.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/22.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/22.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/225.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/225.png
new file mode 100644
index 0000000000..1075d2f253
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/225.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/226.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/226.png
new file mode 100644
index 0000000000..c96df2c4f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/226.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/227.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/227.png
new file mode 100644
index 0000000000..c96df2c4f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/227.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/228.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/228.png
new file mode 100644
index 0000000000..c96df2c4f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/228.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/229.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/229.png
new file mode 100644
index 0000000000..98a4d91b03
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/229.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/23.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/23.png
new file mode 100644
index 0000000000..f60504a639
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/23.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/23.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/23.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/23.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/230.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/230.png
new file mode 100644
index 0000000000..98a4d91b03
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/230.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/231.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/231.png
new file mode 100644
index 0000000000..1bffd6ca23
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/231.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/232.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/232.png
new file mode 100644
index 0000000000..1bffd6ca23
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/232.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/233.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/233.png
new file mode 100644
index 0000000000..6aa985132c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/233.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/24.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/24.png
new file mode 100644
index 0000000000..99d0d099a5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/24.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/24.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/24.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/24.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/25.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/25.png
new file mode 100644
index 0000000000..4e541e45d7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/25.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/250.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/250.png
new file mode 100644
index 0000000000..a3582f1934
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/250.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/251.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/251.png
new file mode 100644
index 0000000000..ce678610f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/251.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/252.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/252.png
new file mode 100644
index 0000000000..ce678610f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/252.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/253.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/253.png
new file mode 100644
index 0000000000..ce678610f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/253.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/254.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/254.png
new file mode 100644
index 0000000000..0d6256acdd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/254.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/255.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/255.png
new file mode 100644
index 0000000000..0d6256acdd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/255.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/256.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/256.png
new file mode 100644
index 0000000000..4c951dace4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/256.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/257.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/257.png
new file mode 100644
index 0000000000..4c951dace4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/257.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/258.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/258.png
new file mode 100644
index 0000000000..60ef0729a0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/258.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/26.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/26.png
new file mode 100644
index 0000000000..ac37f70c47
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/26.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/26.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/26.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/26.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/27.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/27.png
new file mode 100644
index 0000000000..a49b2d8dc0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/27.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/27.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/27.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/27.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/270.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/270.png
new file mode 100644
index 0000000000..ff42b6f6e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/270.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/271.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/271.png
new file mode 100644
index 0000000000..ff42b6f6e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/271.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/272.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/272.png
new file mode 100644
index 0000000000..62c70b30c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/272.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/28.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/28.png
new file mode 100644
index 0000000000..d1ae36f382
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/28.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/28.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/28.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/28.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/29.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/29.png
new file mode 100644
index 0000000000..020138645b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/29.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/3.png
new file mode 100644
index 0000000000..3a2b90e5b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/30.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/30.png
new file mode 100644
index 0000000000..287c6d8297
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/30.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/30.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/30.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/30.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/300.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/300.png
new file mode 100644
index 0000000000..4fd610b9ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/300.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/301.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/301.png
new file mode 100644
index 0000000000..18a7f5ffda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/301.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/302.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/302.png
new file mode 100644
index 0000000000..64bf46c7ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/302.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/303.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/303.png
new file mode 100644
index 0000000000..a7cbfa1d88
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/303.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/304.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/304.png
new file mode 100644
index 0000000000..22d8210232
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/304.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/305.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/305.png
new file mode 100644
index 0000000000..2e514d817f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/305.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/306.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/306.png
new file mode 100644
index 0000000000..676ac19377
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/306.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/307.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/307.png
new file mode 100644
index 0000000000..74972f9a6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/307.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/308.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/308.png
new file mode 100644
index 0000000000..bb282a800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/308.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/309.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/309.png
new file mode 100644
index 0000000000..db29297267
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/309.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/31.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/31.png
new file mode 100644
index 0000000000..297f36601b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/31.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/31.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/31.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/31.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/310.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/310.png
new file mode 100644
index 0000000000..51c1b2de8a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/310.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/311.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/311.png
new file mode 100644
index 0000000000..8b45f4232d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/311.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/312.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/312.png
new file mode 100644
index 0000000000..490a4993c1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/312.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/313.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/313.png
new file mode 100644
index 0000000000..a287d752ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/313.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/314.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/314.png
new file mode 100644
index 0000000000..1461adbd89
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/314.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/315.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/315.png
new file mode 100644
index 0000000000..d603412d29
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/315.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/316.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/316.png
new file mode 100644
index 0000000000..efa01db30d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/316.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/317.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/317.png
new file mode 100644
index 0000000000..05fd40fa4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/317.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/318.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/318.png
new file mode 100644
index 0000000000..612401b049
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/318.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/319.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/319.png
new file mode 100644
index 0000000000..0a11800208
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/319.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/32.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/32.png
new file mode 100644
index 0000000000..bad8169f82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/32.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/32.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/32.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/32.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/320.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/320.png
new file mode 100644
index 0000000000..9cce46e543
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/320.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/321.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/321.png
new file mode 100644
index 0000000000..6d8cf2fa5a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/321.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/322.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/322.png
new file mode 100644
index 0000000000..9d8a94e24a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/322.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/323.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/323.png
new file mode 100644
index 0000000000..08250500bc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/323.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/324.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/324.png
new file mode 100644
index 0000000000..21d1d149f3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/324.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/325.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/325.png
new file mode 100644
index 0000000000..655fab63c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/325.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/326.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/326.png
new file mode 100644
index 0000000000..8b5d77351b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/326.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/327.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/327.png
new file mode 100644
index 0000000000..c309afb611
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/327.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/328.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/328.png
new file mode 100644
index 0000000000..9141b7c1c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/328.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/329.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/329.png
new file mode 100644
index 0000000000..c006f3397e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/329.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/33.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/33.png
new file mode 100644
index 0000000000..b9693cc152
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/33.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/330.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/330.png
new file mode 100644
index 0000000000..10fdb6f916
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/330.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/331.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/331.png
new file mode 100644
index 0000000000..7ee60d68ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/331.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/332.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/332.png
new file mode 100644
index 0000000000..90fb04a9d8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/332.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/333.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/333.png
new file mode 100644
index 0000000000..a6a544d312
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/333.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/334.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/334.png
new file mode 100644
index 0000000000..0e9aa98400
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/334.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/335.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/335.png
new file mode 100644
index 0000000000..870ce524c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/335.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/336.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/336.png
new file mode 100644
index 0000000000..d431010ed5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/336.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/34.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/34.png
new file mode 100644
index 0000000000..9a91048d20
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/34.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/34.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/34.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/34.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/35.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/35.png
new file mode 100644
index 0000000000..b1dcc7f421
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/35.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/35.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/35.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/35.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/350.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/350.png
new file mode 100644
index 0000000000..de04328fca
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/350.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/351.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/351.png
new file mode 100644
index 0000000000..77204ef360
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/351.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/352.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/352.png
new file mode 100644
index 0000000000..d26541dd50
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/352.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/353.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/353.png
new file mode 100644
index 0000000000..2bf69f0534
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/353.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/354.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/354.png
new file mode 100644
index 0000000000..bf77a5578f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/354.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/355.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/355.png
new file mode 100644
index 0000000000..6c8057a8c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/355.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/356.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/356.png
new file mode 100644
index 0000000000..55ab3ad290
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/356.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/357.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/357.png
new file mode 100644
index 0000000000..a60c573c4e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/357.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/358.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/358.png
new file mode 100644
index 0000000000..a948430f7f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/358.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/359.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/359.png
new file mode 100644
index 0000000000..25b2e4a4c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/359.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/36.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/36.png
new file mode 100644
index 0000000000..49aae186f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/36.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/36.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/36.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/36.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/360.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/360.png
new file mode 100644
index 0000000000..5349a0b60c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/360.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/361.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/361.png
new file mode 100644
index 0000000000..9e8593e591
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/361.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/362.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/362.png
new file mode 100644
index 0000000000..d6ebf73e43
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/362.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/363.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/363.png
new file mode 100644
index 0000000000..dd34e05f54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/363.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/364.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/364.png
new file mode 100644
index 0000000000..eab8e946b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/364.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/365.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/365.png
new file mode 100644
index 0000000000..a91481bd67
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/365.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/366.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/366.png
new file mode 100644
index 0000000000..b2728e2c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/366.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/367.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/367.png
new file mode 100644
index 0000000000..32d3cae965
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/367.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/368.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/368.png
new file mode 100644
index 0000000000..d149688c32
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/368.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/369.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/369.png
new file mode 100644
index 0000000000..cdb57f8322
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/369.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/37.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/37.png
new file mode 100644
index 0000000000..f24571df12
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/37.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/370.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/370.png
new file mode 100644
index 0000000000..a8334967bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/370.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/371.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/371.png
new file mode 100644
index 0000000000..f7203c0d3f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/371.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/372.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/372.png
new file mode 100644
index 0000000000..25771001f7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/372.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/373.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/373.png
new file mode 100644
index 0000000000..ba47d93266
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/373.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/374.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/374.png
new file mode 100644
index 0000000000..f25b67d19b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/374.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/375.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/375.png
new file mode 100644
index 0000000000..3d2bd1904b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/375.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/376.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/376.png
new file mode 100644
index 0000000000..2c27d3fa09
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/376.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/377.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/377.png
new file mode 100644
index 0000000000..a11a8d3299
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/377.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/38.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/38.png
new file mode 100644
index 0000000000..0f72748921
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/38.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/38.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/38.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/38.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/39.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/39.png
new file mode 100644
index 0000000000..c51b4440e7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/39.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/39.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/39.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/39.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/398.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/398.png
new file mode 100644
index 0000000000..4987e2ec19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/398.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/399.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/399.png
new file mode 100644
index 0000000000..ffe901a5e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/399.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/4.png
new file mode 100644
index 0000000000..8200f85651
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/40.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/40.png
new file mode 100644
index 0000000000..5442027c48
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/40.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/40.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/40.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/40.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/400.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/400.png
new file mode 100644
index 0000000000..54206d3b41
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/400.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/401.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/401.png
new file mode 100644
index 0000000000..6447df7494
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/401.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/402.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/402.png
new file mode 100644
index 0000000000..6b26ec1a33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/402.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/403.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/403.png
new file mode 100644
index 0000000000..cfdc934481
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/403.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/404.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/404.png
new file mode 100644
index 0000000000..351475ec84
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/404.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/405.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/405.png
new file mode 100644
index 0000000000..7dbbb78336
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/405.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/406.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/406.png
new file mode 100644
index 0000000000..ef34f5224a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/406.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/407.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/407.png
new file mode 100644
index 0000000000..a2616a35f8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/407.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/408.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/408.png
new file mode 100644
index 0000000000..66c69b3b9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/408.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/409.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/409.png
new file mode 100644
index 0000000000..2f6217e3a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/409.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/41.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/41.png
new file mode 100644
index 0000000000..9f72d2b27f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/41.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/410.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/410.png
new file mode 100644
index 0000000000..6ef7c4b2a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/410.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/411.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/411.png
new file mode 100644
index 0000000000..2033cb8bff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/411.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/412.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/412.png
new file mode 100644
index 0000000000..400bfa1e27
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/412.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/413.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/413.png
new file mode 100644
index 0000000000..73325407f4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/413.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/415.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/415.png
new file mode 100644
index 0000000000..ff1faec2f1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/415.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/415.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/415.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/415.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/416.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/416.png
new file mode 100644
index 0000000000..d0d046a14e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/416.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/416.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/416.png.mcmeta
new file mode 100644
index 0000000000..b3b9810f7b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/416.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation":{
+ "frametime":2
+
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/417.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/417.png
new file mode 100644
index 0000000000..af6e3c55e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/417.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/417.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/417.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/417.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/42.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/42.png
new file mode 100644
index 0000000000..13a67f2845
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/42.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/42.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/42.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/42.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/427.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/427.png
new file mode 100644
index 0000000000..c1c2ac04db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/427.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/427.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/427.png.mcmeta
new file mode 100644
index 0000000000..14578b550b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/427.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 4}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/428.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/428.png
new file mode 100644
index 0000000000..84589745f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/428.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/428.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/428.png.mcmeta
new file mode 100644
index 0000000000..14578b550b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/428.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 4}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/429.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/429.png
new file mode 100644
index 0000000000..34bb895853
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/429.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/429.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/429.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/429.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/43.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/43.png
new file mode 100644
index 0000000000..6ae4b4f3b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/43.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/43.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/43.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/43.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/430.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/430.png
new file mode 100644
index 0000000000..1efc0bcb04
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/430.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/431.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/431.png
new file mode 100644
index 0000000000..1efc0bcb04
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/431.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/432.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/432.png
new file mode 100644
index 0000000000..a486731964
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/432.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/433.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/433.png
new file mode 100644
index 0000000000..a486731964
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/433.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/434.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/434.png
new file mode 100644
index 0000000000..042592b75a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/434.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/435.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/435.png
new file mode 100644
index 0000000000..042592b75a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/435.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/436.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/436.png
new file mode 100644
index 0000000000..42d9fa74fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/436.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/437.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/437.png
new file mode 100644
index 0000000000..42d9fa74fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/437.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/438.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/438.png
new file mode 100644
index 0000000000..b3351ff991
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/438.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/439.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/439.png
new file mode 100644
index 0000000000..b3351ff991
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/439.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/44.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/44.png
new file mode 100644
index 0000000000..88052715bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/44.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/44.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/44.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/44.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/440.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/440.png
new file mode 100644
index 0000000000..0bf6463d72
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/440.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/441.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/441.png
new file mode 100644
index 0000000000..0bf6463d72
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/441.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/442.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/442.png
new file mode 100644
index 0000000000..8d126f2703
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/442.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/443.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/443.png
new file mode 100644
index 0000000000..8d126f2703
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/443.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/444.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/444.png
new file mode 100644
index 0000000000..3bd37d6488
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/444.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/445.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/445.png
new file mode 100644
index 0000000000..3bd37d6488
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/445.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/446.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/446.png
new file mode 100644
index 0000000000..ebbe3f13f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/446.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/447.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/447.png
new file mode 100644
index 0000000000..ebbe3f13f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/447.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/448.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/448.png
new file mode 100644
index 0000000000..6304b2e524
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/448.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/449.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/449.png
new file mode 100644
index 0000000000..6304b2e524
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/449.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/45.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/45.png
new file mode 100644
index 0000000000..1f2ac6dcd3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/45.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/450.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/450.png
new file mode 100644
index 0000000000..c26f96077d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/450.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/451.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/451.png
new file mode 100644
index 0000000000..c26f96077d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/451.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/452.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/452.png
new file mode 100644
index 0000000000..e6ea97f015
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/452.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/453.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/453.png
new file mode 100644
index 0000000000..e6ea97f015
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/453.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/454.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/454.png
new file mode 100644
index 0000000000..3980755d7e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/454.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/455.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/455.png
new file mode 100644
index 0000000000..3980755d7e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/455.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/456.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/456.png
new file mode 100644
index 0000000000..5baba597cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/456.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/457.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/457.png
new file mode 100644
index 0000000000..5baba597cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/457.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/458.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/458.png
new file mode 100644
index 0000000000..11cb584f4e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/458.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/459.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/459.png
new file mode 100644
index 0000000000..11cb584f4e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/459.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/46.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/46.png
new file mode 100644
index 0000000000..9bf0aeb0ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/46.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/46.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/46.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/46.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/460.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/460.png
new file mode 100644
index 0000000000..3c2e36e7b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/460.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/461.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/461.png
new file mode 100644
index 0000000000..3c2e36e7b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/461.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/462.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/462.png
new file mode 100644
index 0000000000..3e2147fd9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/462.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/463.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/463.png
new file mode 100644
index 0000000000..beb9e1fbf6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/463.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/464.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/464.png
new file mode 100644
index 0000000000..51f6ad2a00
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/464.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/465.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/465.png
new file mode 100644
index 0000000000..36ed2bbb07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/465.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/466.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/466.png
new file mode 100644
index 0000000000..36ed2bbb07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/466.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/467.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/467.png
new file mode 100644
index 0000000000..5f7e634adf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/467.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/47.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/47.png
new file mode 100644
index 0000000000..f94232d021
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/47.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/47.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/47.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/47.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/471.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/471.png
new file mode 100644
index 0000000000..86bc166a42
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/471.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/472.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/472.png
new file mode 100644
index 0000000000..146dff4a9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/472.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/473.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/473.png
new file mode 100644
index 0000000000..cd1ce874d1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/473.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/474.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/474.png
new file mode 100644
index 0000000000..6da320f861
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/474.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/475.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/475.png
new file mode 100644
index 0000000000..352acc4e6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/475.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/476.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/476.png
new file mode 100644
index 0000000000..6da320f861
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/476.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/477.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/477.png
new file mode 100644
index 0000000000..eda9383443
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/477.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/478.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/478.png
new file mode 100644
index 0000000000..3a96d9a0b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/478.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/479.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/479.png
new file mode 100644
index 0000000000..aae0f21fc4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/479.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/48.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/48.png
new file mode 100644
index 0000000000..e33469f874
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/48.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/48.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/48.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/48.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/480.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/480.png
new file mode 100644
index 0000000000..d76e98674e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/480.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/481.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/481.png
new file mode 100644
index 0000000000..9879d22233
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/481.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/482.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/482.png
new file mode 100644
index 0000000000..8a0c60bbc5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/482.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/483.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/483.png
new file mode 100644
index 0000000000..6d52aa3106
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/483.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/484.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/484.png
new file mode 100644
index 0000000000..3984c36428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/484.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/485.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/485.png
new file mode 100644
index 0000000000..74f51f1265
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/485.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/486.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/486.png
new file mode 100644
index 0000000000..60d6503de3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/486.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/487.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/487.png
new file mode 100644
index 0000000000..cbd849c402
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/487.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/488.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/488.png
new file mode 100644
index 0000000000..57a0d32b02
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/488.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/489.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/489.png
new file mode 100644
index 0000000000..0899b13f6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/489.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/490.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/490.png
new file mode 100644
index 0000000000..22ec8e867c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/490.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/491.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/491.png
new file mode 100644
index 0000000000..aa8a4a9f3b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/491.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/495.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/495.png
new file mode 100644
index 0000000000..b34e81263b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/495.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/496.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/496.png
new file mode 100644
index 0000000000..56116f2570
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/496.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/497.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/497.png
new file mode 100644
index 0000000000..50a84554b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/497.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/498.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/498.png
new file mode 100644
index 0000000000..75650abe17
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/498.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/499.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/499.png
new file mode 100644
index 0000000000..bbea2dd337
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/499.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/5.png
new file mode 100644
index 0000000000..c00dc805b8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/500.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/500.png
new file mode 100644
index 0000000000..0631296345
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/500.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/501.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/501.png
new file mode 100644
index 0000000000..4427dd5975
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/501.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/502.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/502.png
new file mode 100644
index 0000000000..1215be6a0a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/502.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510.png
new file mode 100644
index 0000000000..13609f5ea6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/1.png
new file mode 100644
index 0000000000..b337a8a188
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/2.png
new file mode 100644
index 0000000000..f25a474218
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/3.png
new file mode 100644
index 0000000000..243792d0ec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/4.png
new file mode 100644
index 0000000000..69b67115d1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/5.png
new file mode 100644
index 0000000000..68784d6916
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/6.png
new file mode 100644
index 0000000000..fad903f1c1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/7.png
new file mode 100644
index 0000000000..27b8a269e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/8.png
new file mode 100644
index 0000000000..13609f5ea6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/510/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511.png
new file mode 100644
index 0000000000..ffa4a8af9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/1.png
new file mode 100644
index 0000000000..4126627b95
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/2.png
new file mode 100644
index 0000000000..665a5c885e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/3.png
new file mode 100644
index 0000000000..46e88053f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/4.png
new file mode 100644
index 0000000000..4505b5a4ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/5.png
new file mode 100644
index 0000000000..d7658618f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/6.png
new file mode 100644
index 0000000000..486b5ab7f4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/7.png
new file mode 100644
index 0000000000..14fc723dd7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/8.png
new file mode 100644
index 0000000000..ffa4a8af9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/511/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517.png
new file mode 100644
index 0000000000..822fb78d33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/1.png
new file mode 100644
index 0000000000..0a5e80c428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/2.png
new file mode 100644
index 0000000000..28dc2925cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/3.png
new file mode 100644
index 0000000000..09ca3bde9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/4.png
new file mode 100644
index 0000000000..bee40198fd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/5.png
new file mode 100644
index 0000000000..d781149fa7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/6.png
new file mode 100644
index 0000000000..c1bc477452
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/7.png
new file mode 100644
index 0000000000..e048d15282
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/8.png
new file mode 100644
index 0000000000..59cd8f5acd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/517/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518.png
new file mode 100644
index 0000000000..d6317806c3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/1.png
new file mode 100644
index 0000000000..fc15b001dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/2.png
new file mode 100644
index 0000000000..23ad492ad8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/3.png
new file mode 100644
index 0000000000..126f7100b0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/4.png
new file mode 100644
index 0000000000..f6757b5fdd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/5.png
new file mode 100644
index 0000000000..c3ba167067
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/6.png
new file mode 100644
index 0000000000..6c9102bfd9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/7.png
new file mode 100644
index 0000000000..cf9e960cd1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/8.png
new file mode 100644
index 0000000000..d6317806c3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/518/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519.png
new file mode 100644
index 0000000000..581d5aac6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/1.png
new file mode 100644
index 0000000000..389d0f494a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/2.png
new file mode 100644
index 0000000000..1d853e474e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/3.png
new file mode 100644
index 0000000000..038763cb4b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/4.png
new file mode 100644
index 0000000000..09518e241b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/5.png
new file mode 100644
index 0000000000..ec94e1dd2c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/6.png
new file mode 100644
index 0000000000..056e05378b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/7.png
new file mode 100644
index 0000000000..951ee601f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/8.png
new file mode 100644
index 0000000000..581d5aac6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/519/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520.png
new file mode 100644
index 0000000000..18cdc67b57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/1.png
new file mode 100644
index 0000000000..e27fbcb725
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/2.png
new file mode 100644
index 0000000000..68468270ca
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/3.png
new file mode 100644
index 0000000000..49e5e4acd0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/4.png
new file mode 100644
index 0000000000..3cde9623b0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/5.png
new file mode 100644
index 0000000000..1edc4bf118
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/6.png
new file mode 100644
index 0000000000..cdaced6cfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/7.png
new file mode 100644
index 0000000000..5f781c2d47
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/8.png
new file mode 100644
index 0000000000..18cdc67b57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/520/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521.png
new file mode 100644
index 0000000000..e74637803d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/1.png
new file mode 100644
index 0000000000..b97649be62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/2.png
new file mode 100644
index 0000000000..4e6c755c35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/3.png
new file mode 100644
index 0000000000..669764ea0c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/4.png
new file mode 100644
index 0000000000..5eb2045936
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/5.png
new file mode 100644
index 0000000000..ac6660659e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/6.png
new file mode 100644
index 0000000000..103e78af6b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/7.png
new file mode 100644
index 0000000000..9462e79f8a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/8.png
new file mode 100644
index 0000000000..e74637803d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/521/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527.png
new file mode 100644
index 0000000000..cf2ccc775d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/1.png
new file mode 100644
index 0000000000..97d71b19d6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/2.png
new file mode 100644
index 0000000000..0828038f49
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/3.png
new file mode 100644
index 0000000000..1c6c53865a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/4.png
new file mode 100644
index 0000000000..932b81fb19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/5.png
new file mode 100644
index 0000000000..73b72e7f4a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/6.png
new file mode 100644
index 0000000000..5d3f0993ba
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/7.png
new file mode 100644
index 0000000000..0250b8c974
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/8.png
new file mode 100644
index 0000000000..71bd96405b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/527/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528.png
new file mode 100644
index 0000000000..2d6568d447
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/1.png
new file mode 100644
index 0000000000..1249b6c44c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/2.png
new file mode 100644
index 0000000000..d18b209327
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/3.png
new file mode 100644
index 0000000000..9d248185d4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/4.png
new file mode 100644
index 0000000000..71006d77a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/5.png
new file mode 100644
index 0000000000..bf78fbef47
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/6.png
new file mode 100644
index 0000000000..a2416e6178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/7.png
new file mode 100644
index 0000000000..2cade70c82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/8.png
new file mode 100644
index 0000000000..2d6568d447
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/528/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529.png
new file mode 100644
index 0000000000..376366c243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/1.png
new file mode 100644
index 0000000000..096fc79b8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/2.png
new file mode 100644
index 0000000000..b435399b42
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/3.png
new file mode 100644
index 0000000000..c047eb7a01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/4.png
new file mode 100644
index 0000000000..05c4c33c1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/5.png
new file mode 100644
index 0000000000..3a1edaa239
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/6.png
new file mode 100644
index 0000000000..2a326a498e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/7.png
new file mode 100644
index 0000000000..e03f7b8236
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/8.png
new file mode 100644
index 0000000000..376366c243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/529/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530.png
new file mode 100644
index 0000000000..3a00254476
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/1.png
new file mode 100644
index 0000000000..30ba99bfb8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/2.png
new file mode 100644
index 0000000000..dc3506a644
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/3.png
new file mode 100644
index 0000000000..c3ae13ce4f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/4.png
new file mode 100644
index 0000000000..4d5eb0cf59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/5.png
new file mode 100644
index 0000000000..b0b79afb08
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/6.png
new file mode 100644
index 0000000000..a50cc59b5a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/7.png
new file mode 100644
index 0000000000..9a37dd3f50
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/8.png
new file mode 100644
index 0000000000..323c7c4269
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/530/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531.png
new file mode 100644
index 0000000000..2ac51fd238
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/1.png
new file mode 100644
index 0000000000..e672d5a68f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/2.png
new file mode 100644
index 0000000000..bad84c38e3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/3.png
new file mode 100644
index 0000000000..a61207e30a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/4.png
new file mode 100644
index 0000000000..b73f226460
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/5.png
new file mode 100644
index 0000000000..4349580906
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/6.png
new file mode 100644
index 0000000000..ab1e5b9912
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/7.png
new file mode 100644
index 0000000000..fe5184d2a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/8.png
new file mode 100644
index 0000000000..5e7399e3da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/531/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537.png
new file mode 100644
index 0000000000..9df212aa56
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/1.png
new file mode 100644
index 0000000000..15e3c9022c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/2.png
new file mode 100644
index 0000000000..482a96b279
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/3.png
new file mode 100644
index 0000000000..db64a1e45e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/4.png
new file mode 100644
index 0000000000..b91e1a46d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/5.png
new file mode 100644
index 0000000000..7fb06298b1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/6.png
new file mode 100644
index 0000000000..7f0cc5b800
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/7.png
new file mode 100644
index 0000000000..b75bd6593f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/8.png
new file mode 100644
index 0000000000..403027a5be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/537/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538.png
new file mode 100644
index 0000000000..44257d32c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/1.png
new file mode 100644
index 0000000000..cbd319dfbc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/2.png
new file mode 100644
index 0000000000..ebdace6b04
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/3.png
new file mode 100644
index 0000000000..12a120e3fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/4.png
new file mode 100644
index 0000000000..93a08b2d66
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/5.png
new file mode 100644
index 0000000000..46fc118abc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/6.png
new file mode 100644
index 0000000000..310dc5a660
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/7.png
new file mode 100644
index 0000000000..66dc67b12f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/8.png
new file mode 100644
index 0000000000..d24eb33c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/538/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539.png
new file mode 100644
index 0000000000..bc26996c28
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/1.png
new file mode 100644
index 0000000000..d0c727f027
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/2.png
new file mode 100644
index 0000000000..050e094f19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/3.png
new file mode 100644
index 0000000000..4919b9995e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/4.png
new file mode 100644
index 0000000000..4ce1cca200
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/5.png
new file mode 100644
index 0000000000..b7bfb81c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/6.png
new file mode 100644
index 0000000000..5d74314acf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/7.png
new file mode 100644
index 0000000000..7b16f2516d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/8.png
new file mode 100644
index 0000000000..50788eaee9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/539/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/577.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/577.png
new file mode 100644
index 0000000000..9876085b93
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/577.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/1.png
new file mode 100644
index 0000000000..30cc87ef5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/2.png
new file mode 100644
index 0000000000..87d312684a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/3.png
new file mode 100644
index 0000000000..92f442a345
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/4.png
new file mode 100644
index 0000000000..22164fef97
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/5.png
new file mode 100644
index 0000000000..ea9b00b565
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/6.png
new file mode 100644
index 0000000000..039166c9fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/7.png
new file mode 100644
index 0000000000..dc637d9ba9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/8.png
new file mode 100644
index 0000000000..ba5f51443a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/594/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/595.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/595.png
new file mode 100644
index 0000000000..88e6bdcb93
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/595.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/596.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/596.png
new file mode 100644
index 0000000000..6953ebbe95
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/596.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597.png
new file mode 100644
index 0000000000..5bfe682389
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/1.png
new file mode 100644
index 0000000000..6a4c98ec41
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/2.png
new file mode 100644
index 0000000000..ee0d5df3e4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/3.png
new file mode 100644
index 0000000000..6d276c6e53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/4.png
new file mode 100644
index 0000000000..85bcdb5282
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/5.png
new file mode 100644
index 0000000000..f3d7424887
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/6.png
new file mode 100644
index 0000000000..c18aa8e132
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/7.png
new file mode 100644
index 0000000000..b0dd72c328
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/8.png
new file mode 100644
index 0000000000..bad9fc2f45
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/597/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598.png
new file mode 100644
index 0000000000..3d5a9d485f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/1.png
new file mode 100644
index 0000000000..ec55f559d6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/2.png
new file mode 100644
index 0000000000..dd34888f50
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/3.png
new file mode 100644
index 0000000000..36670a14d4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/4.png
new file mode 100644
index 0000000000..bceded960e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/5.png
new file mode 100644
index 0000000000..89f1c076ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/6.png
new file mode 100644
index 0000000000..cf1d9717e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/7.png
new file mode 100644
index 0000000000..f0b6dff8fd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/8.png
new file mode 100644
index 0000000000..3d5a9d485f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/598/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599.png
new file mode 100644
index 0000000000..5bfe682389
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/1.png
new file mode 100644
index 0000000000..21aecf759f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/2.png
new file mode 100644
index 0000000000..8d886962a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/3.png
new file mode 100644
index 0000000000..0c1b4c1f24
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/4.png
new file mode 100644
index 0000000000..75caa752a1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/5.png
new file mode 100644
index 0000000000..5bfe682389
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/6.png
new file mode 100644
index 0000000000..59f160b26f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/7.png
new file mode 100644
index 0000000000..2a70e1a9eb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/8.png
new file mode 100644
index 0000000000..45eb2cd664
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/599/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/6.png
new file mode 100644
index 0000000000..413fd45568
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/600.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/600.png
new file mode 100644
index 0000000000..f97af3b02f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/600.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/601.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/601.png
new file mode 100644
index 0000000000..9718df3905
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/601.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/602.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/602.png
new file mode 100644
index 0000000000..6ebd854c61
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/602.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/603.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/603.png
new file mode 100644
index 0000000000..5d24c9d59b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/603.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/604.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/604.png
new file mode 100644
index 0000000000..db7b6f173a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/604.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605.png
new file mode 100644
index 0000000000..051a49274f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/1.png
new file mode 100644
index 0000000000..7740134719
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/2.png
new file mode 100644
index 0000000000..2058538195
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/3.png
new file mode 100644
index 0000000000..f718c0c5f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/4.png
new file mode 100644
index 0000000000..de4c0821e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/5.png
new file mode 100644
index 0000000000..fe4e288648
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/6.png
new file mode 100644
index 0000000000..82414a20c8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/7.png
new file mode 100644
index 0000000000..27d947b0d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/8.png
new file mode 100644
index 0000000000..051a49274f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/605/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/606.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/606.png
new file mode 100644
index 0000000000..1c84864d35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/606.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/607.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/607.png
new file mode 100644
index 0000000000..f9406262a7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/607.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/608.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/608.png
new file mode 100644
index 0000000000..bc447c4860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/608.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609.png
new file mode 100644
index 0000000000..ec665e3b45
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/1.png
new file mode 100644
index 0000000000..598395d3ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/2.png
new file mode 100644
index 0000000000..a2682f5055
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/3.png
new file mode 100644
index 0000000000..7250f864d7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/4.png
new file mode 100644
index 0000000000..6d32008467
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/5.png
new file mode 100644
index 0000000000..0ff9d8073d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/6.png
new file mode 100644
index 0000000000..6cd0ce78e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/7.png
new file mode 100644
index 0000000000..27ffe962dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/8.png
new file mode 100644
index 0000000000..ec665e3b45
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/609/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/610.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/610.png
new file mode 100644
index 0000000000..7dfeb1c63d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/610.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/611.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/611.png
new file mode 100644
index 0000000000..f326555e24
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/611.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/612.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/612.png
new file mode 100644
index 0000000000..f1e1d05101
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/612.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/613.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/613.png
new file mode 100644
index 0000000000..7091c3ef5a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/613.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/614.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/614.png
new file mode 100644
index 0000000000..28ef15f065
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/614.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/615.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/615.png
new file mode 100644
index 0000000000..fdea6e9e61
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/615.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/616.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/616.png
new file mode 100644
index 0000000000..2996e24ffe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/616.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/617.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/617.png
new file mode 100644
index 0000000000..b1b47f4027
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/617.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/618.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/618.png
new file mode 100644
index 0000000000..b2f18c962f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/618.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/619.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/619.png
new file mode 100644
index 0000000000..3c7b1b1c21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/619.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/620.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/620.png
new file mode 100644
index 0000000000..2d4bdd77da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/620.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/621.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/621.png
new file mode 100644
index 0000000000..5b8d63a8a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/621.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/622.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/622.png
new file mode 100644
index 0000000000..88b90310bf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/622.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/623.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/623.png
new file mode 100644
index 0000000000..6d26f6ce65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/623.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/624.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/624.png
new file mode 100644
index 0000000000..f22b38c59e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/624.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/630.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/630.png
new file mode 100644
index 0000000000..1b7fac937a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/630.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/631.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/631.png
new file mode 100644
index 0000000000..baede6e188
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/631.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/632.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/632.png
new file mode 100644
index 0000000000..ea43e6d829
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/632.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/633.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/633.png
new file mode 100644
index 0000000000..c2d1c198c5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/633.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/634.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/634.png
new file mode 100644
index 0000000000..0963b4b757
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/634.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/635.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/635.png
new file mode 100644
index 0000000000..17dc5b252e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/635.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/636.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/636.png
new file mode 100644
index 0000000000..6c232b8c52
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/636.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/637.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/637.png
new file mode 100644
index 0000000000..57cb7fda6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/637.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/638.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/638.png
new file mode 100644
index 0000000000..c951ffdc3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/638.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/639.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/639.png
new file mode 100644
index 0000000000..0cbc1dadd4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/639.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/640.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/640.png
new file mode 100644
index 0000000000..76fb6fee28
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/640.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/641.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/641.png
new file mode 100644
index 0000000000..d93ce9e504
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/641.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/642.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/642.png
new file mode 100644
index 0000000000..633e3ff74e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/642.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/643.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/643.png
new file mode 100644
index 0000000000..c817bc6678
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/643.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/644.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/644.png
new file mode 100644
index 0000000000..d80d390760
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/644.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/645.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/645.png
new file mode 100644
index 0000000000..2618cead64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/645.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/646.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/646.png
new file mode 100644
index 0000000000..395b559ea2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/646.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/647.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/647.png
new file mode 100644
index 0000000000..111371fb9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/647.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/648.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/648.png
new file mode 100644
index 0000000000..e104f706be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/648.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/649.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/649.png
new file mode 100644
index 0000000000..17e1df3527
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/649.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/650.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/650.png
new file mode 100644
index 0000000000..0edf7eadd6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/650.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/651.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/651.png
new file mode 100644
index 0000000000..7a9e875f92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/651.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/652.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/652.png
new file mode 100644
index 0000000000..630718dff0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/652.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/653.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/653.png
new file mode 100644
index 0000000000..1d5eabe707
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/653.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/654.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/654.png
new file mode 100644
index 0000000000..0c012f2062
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/654.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/655.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/655.png
new file mode 100644
index 0000000000..b58da85e38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/655.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/656.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/656.png
new file mode 100644
index 0000000000..24e4d3c88f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/656.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/657.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/657.png
new file mode 100644
index 0000000000..2291ff85d8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/657.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/658.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/658.png
new file mode 100644
index 0000000000..808856e512
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/658.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/659.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/659.png
new file mode 100644
index 0000000000..5f91c67438
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/659.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/660.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/660.png
new file mode 100644
index 0000000000..873ba554f1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/660.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/661.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/661.png
new file mode 100644
index 0000000000..58016701aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/661.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/662.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/662.png
new file mode 100644
index 0000000000..bc1d8cf06e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/662.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/663.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/663.png
new file mode 100644
index 0000000000..854c65a9b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/663.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/664.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/664.png
new file mode 100644
index 0000000000..9561f03547
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/664.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/665.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/665.png
new file mode 100644
index 0000000000..e08ee4057d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/665.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/666.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/666.png
new file mode 100644
index 0000000000..6a40083c03
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/666.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/667.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/667.png
new file mode 100644
index 0000000000..0aa921274d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/667.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/668.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/668.png
new file mode 100644
index 0000000000..c6ec444d9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/668.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/668.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/668.png.mcmeta
new file mode 100644
index 0000000000..287c39f0bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/668.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 8}}
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/669.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/669.png
new file mode 100644
index 0000000000..2c00be17a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/669.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/670.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/670.png
new file mode 100644
index 0000000000..90c75aa890
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/670.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/671.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/671.png
new file mode 100644
index 0000000000..8a0d02ccc8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/671.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/672.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/672.png
new file mode 100644
index 0000000000..2d086a259b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/672.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/673.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/673.png
new file mode 100644
index 0000000000..54dea0f409
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/673.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/674.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/674.png
new file mode 100644
index 0000000000..8281255409
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/674.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/675.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/675.png
new file mode 100644
index 0000000000..b3502800c3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/675.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/676.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/676.png
new file mode 100644
index 0000000000..e7fc6d4817
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/676.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/677.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/677.png
new file mode 100644
index 0000000000..95b4117738
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/677.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/678.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/678.png
new file mode 100644
index 0000000000..e4a362bff0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/678.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/679.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/679.png
new file mode 100644
index 0000000000..633205fddd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/679.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/680.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/680.png
new file mode 100644
index 0000000000..b65aade870
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/680.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/681.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/681.png
new file mode 100644
index 0000000000..b7da73490e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/681.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/682.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/682.png
new file mode 100644
index 0000000000..1bb64043e3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/682.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/683.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/683.png
new file mode 100644
index 0000000000..66e4248eb5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/683.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/684.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/684.png
new file mode 100644
index 0000000000..e8fa968d1e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/684.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/685.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/685.png
new file mode 100644
index 0000000000..aee64b454a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/685.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/686.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/686.png
new file mode 100644
index 0000000000..e2cee41187
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/686.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/687.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/687.png
new file mode 100644
index 0000000000..5fc6797d2d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/687.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/688.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/688.png
new file mode 100644
index 0000000000..930d4a012d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/688.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/689.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/689.png
new file mode 100644
index 0000000000..c49d92b384
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/689.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/690.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/690.png
new file mode 100644
index 0000000000..9727064690
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/690.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/691.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/691.png
new file mode 100644
index 0000000000..9668bcc1e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/691.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/692.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/692.png
new file mode 100644
index 0000000000..0a7106d71e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/692.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/693.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/693.png
new file mode 100644
index 0000000000..5c8167ba49
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/693.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/694.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/694.png
new file mode 100644
index 0000000000..2b45f12773
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/694.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/695.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/695.png
new file mode 100644
index 0000000000..8ace4c289c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/695.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/696.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/696.png
new file mode 100644
index 0000000000..52bc9d06ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/696.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/697.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/697.png
new file mode 100644
index 0000000000..731554974f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/697.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/698.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/698.png
new file mode 100644
index 0000000000..4b9d5ecd02
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/698.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/699.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/699.png
new file mode 100644
index 0000000000..600bcf1151
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/699.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/7.png
new file mode 100644
index 0000000000..baac759d6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/700.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/700.png
new file mode 100644
index 0000000000..5af04ce86a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/700.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/701.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/701.png
new file mode 100644
index 0000000000..39b8023a51
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/701.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/702.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/702.png
new file mode 100644
index 0000000000..629b57014b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/702.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/703.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/703.png
new file mode 100644
index 0000000000..c68eb102c3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/703.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/704.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/704.png
new file mode 100644
index 0000000000..dae45d70a9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/704.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/705.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/705.png
new file mode 100644
index 0000000000..1dc7632d55
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/705.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/706.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/706.png
new file mode 100644
index 0000000000..4f9dba904d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/706.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/707.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/707.png
new file mode 100644
index 0000000000..58ce6a619f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/707.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/708.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/708.png
new file mode 100644
index 0000000000..824781b29b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/708.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/709.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/709.png
new file mode 100644
index 0000000000..0ead00983d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/709.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/710.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/710.png
new file mode 100644
index 0000000000..ea41fa5bfd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/710.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/711.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/711.png
new file mode 100644
index 0000000000..6c6d9c620d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/711.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/712.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/712.png
new file mode 100644
index 0000000000..84e2a20638
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/712.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/713.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/713.png
new file mode 100644
index 0000000000..3c18440e5e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/713.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/714.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/714.png
new file mode 100644
index 0000000000..da2d65e445
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/714.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/715.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/715.png
new file mode 100644
index 0000000000..4e2edfeca7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/715.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/716.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/716.png
new file mode 100644
index 0000000000..c62b237004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/716.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/717.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/717.png
new file mode 100644
index 0000000000..0190547a58
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/717.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/718.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/718.png
new file mode 100644
index 0000000000..1bcfb2d95e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/718.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/719.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/719.png
new file mode 100644
index 0000000000..7d45cae3c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/719.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/720.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/720.png
new file mode 100644
index 0000000000..1f933fbbca
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/720.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/721.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/721.png
new file mode 100644
index 0000000000..91f85534ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/721.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/722.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/722.png
new file mode 100644
index 0000000000..68298bba22
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/722.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/723.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/723.png
new file mode 100644
index 0000000000..e34b9571c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/723.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/724.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/724.png
new file mode 100644
index 0000000000..6b722f6f0d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/724.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/725.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/725.png
new file mode 100644
index 0000000000..37080d7551
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/725.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/726.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/726.png
new file mode 100644
index 0000000000..d448f828d6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/726.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/727.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/727.png
new file mode 100644
index 0000000000..e14b220f0c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/727.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/728.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/728.png
new file mode 100644
index 0000000000..844ab5e83a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/728.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/729.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/729.png
new file mode 100644
index 0000000000..086a08f090
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/729.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/730.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/730.png
new file mode 100644
index 0000000000..7799752585
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/730.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/731.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/731.png
new file mode 100644
index 0000000000..fa1e71927d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/731.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/732.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/732.png
new file mode 100644
index 0000000000..fa92f8a7cd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/732.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/733.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/733.png
new file mode 100644
index 0000000000..9924edd163
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/733.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/734.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/734.png
new file mode 100644
index 0000000000..964687161a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/734.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/735.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/735.png
new file mode 100644
index 0000000000..fa1e71927d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/735.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736.png
new file mode 100644
index 0000000000..b80855b4b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/1.png
new file mode 100644
index 0000000000..a330187721
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/2.png
new file mode 100644
index 0000000000..319974f4da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/3.png
new file mode 100644
index 0000000000..c24718fa90
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/4.png
new file mode 100644
index 0000000000..dbfdf7eb04
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/5.png
new file mode 100644
index 0000000000..522d6d10d8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/6.png
new file mode 100644
index 0000000000..a81fc213c8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/7.png
new file mode 100644
index 0000000000..36657251f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/8.png
new file mode 100644
index 0000000000..b80855b4b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/736/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737.png
new file mode 100644
index 0000000000..822452bb2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/1.png
new file mode 100644
index 0000000000..c41af3c2fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/2.png
new file mode 100644
index 0000000000..4f1551233e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/3.png
new file mode 100644
index 0000000000..55d8bece6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/4.png
new file mode 100644
index 0000000000..77dfe3f6c3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/5.png
new file mode 100644
index 0000000000..70e609519a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/6.png
new file mode 100644
index 0000000000..fc4926e964
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/7.png
new file mode 100644
index 0000000000..0453bcb0b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/8.png
new file mode 100644
index 0000000000..822452bb2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/737/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/740.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/740.png
new file mode 100644
index 0000000000..402721700b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/740.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/741.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/741.png
new file mode 100644
index 0000000000..bda6946ae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/741.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/742.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/742.png
new file mode 100644
index 0000000000..bda6946ae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/742.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/744.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/744.png
new file mode 100644
index 0000000000..03a878a476
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/744.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/745.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/745.png
new file mode 100644
index 0000000000..a81f8ab6e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/745.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/746.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/746.png
new file mode 100644
index 0000000000..baef53efbb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/746.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/747.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/747.png
new file mode 100644
index 0000000000..baef53efbb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/747.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/748.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/748.png
new file mode 100644
index 0000000000..356c1dd324
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/748.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/749.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/749.png
new file mode 100644
index 0000000000..62c70b30c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/749.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/750.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/750.png
new file mode 100644
index 0000000000..25a72e0fca
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/750.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/751.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/751.png
new file mode 100644
index 0000000000..2a8a61ccb5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/751.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/752.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/752.png
new file mode 100644
index 0000000000..cf002d6fad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/752.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/753.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/753.png
new file mode 100644
index 0000000000..bb264e1f49
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/753.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/754.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/754.png
new file mode 100644
index 0000000000..fe8aaa3c34
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/754.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/755.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/755.png
new file mode 100644
index 0000000000..d9fddd29d4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/755.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/756.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/756.png
new file mode 100644
index 0000000000..c017b2b479
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/756.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/757.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/757.png
new file mode 100644
index 0000000000..f3dcaebe10
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/757.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/758.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/758.png
new file mode 100644
index 0000000000..199160c250
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/758.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/759.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/759.png
new file mode 100644
index 0000000000..8f8375c6c5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/759.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/760.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/760.png
new file mode 100644
index 0000000000..ff21cb7cc5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/760.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/761.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/761.png
new file mode 100644
index 0000000000..739f08184d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/761.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/762.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/762.png
new file mode 100644
index 0000000000..eabb674b01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/762.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/763.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/763.png
new file mode 100644
index 0000000000..58d2cce4ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/763.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/764.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/764.png
new file mode 100644
index 0000000000..993092ff04
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/764.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/765.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/765.png
new file mode 100644
index 0000000000..c2404df26b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/765.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/8.png
new file mode 100644
index 0000000000..98a192f52e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/9.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/9.png
new file mode 100644
index 0000000000..70120a77b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/0.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/0.png
new file mode 100644
index 0000000000..f7f0ea23fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/1.png
new file mode 100644
index 0000000000..f7f0ea23fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/10.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/10.png
new file mode 100644
index 0000000000..9e06a6695c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/10.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/100.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/100.png
new file mode 100644
index 0000000000..3710cf90d7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/100.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/101.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/101.png
new file mode 100644
index 0000000000..77e62a7bc7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/101.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/102.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/102.png
new file mode 100644
index 0000000000..2ff206bf00
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/102.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/103.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/103.png
new file mode 100644
index 0000000000..5ad2405c57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/103.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/104.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/104.png
new file mode 100644
index 0000000000..0ab2ff7386
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/104.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/105.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/105.png
new file mode 100644
index 0000000000..429926538a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/105.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/106.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/106.png
new file mode 100644
index 0000000000..a4463976ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/106.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/107.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/107.png
new file mode 100644
index 0000000000..8c0c105267
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/107.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/108.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/108.png
new file mode 100644
index 0000000000..e1083cdafe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/108.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/109.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/109.png
new file mode 100644
index 0000000000..7999022d44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/109.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/110.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/110.png
new file mode 100644
index 0000000000..26df64d468
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/110.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/111.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/111.png
new file mode 100644
index 0000000000..a2671295cd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/111.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/112.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/112.png
new file mode 100644
index 0000000000..19f2f09312
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/112.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/113.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/113.png
new file mode 100644
index 0000000000..64889904e7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/113.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/114.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/114.png
new file mode 100644
index 0000000000..864ed82111
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/114.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/115.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/115.png
new file mode 100644
index 0000000000..dc1b4cf67c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/115.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/116.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/116.png
new file mode 100644
index 0000000000..5cf45cde05
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/116.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/117.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/117.png
new file mode 100644
index 0000000000..a3c59175d4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/117.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/118.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/118.png
new file mode 100644
index 0000000000..674c33a575
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/118.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/119.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/119.png
new file mode 100644
index 0000000000..8ce0b55e7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/119.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/120.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/120.png
new file mode 100644
index 0000000000..6913d72ffc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/120.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/121.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/121.png
new file mode 100644
index 0000000000..f8af159e96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/121.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/122.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/122.png
new file mode 100644
index 0000000000..4722e1bd60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/122.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/123.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/123.png
new file mode 100644
index 0000000000..ff0d708373
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/123.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/124.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/124.png
new file mode 100644
index 0000000000..4fd428597d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/124.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/125.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/125.png
new file mode 100644
index 0000000000..775de15f3d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/125.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/126.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/126.png
new file mode 100644
index 0000000000..056cbe54d1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/126.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/127.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/127.png
new file mode 100644
index 0000000000..d4e484b6a5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/127.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/128.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/128.png
new file mode 100644
index 0000000000..21d3682c72
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/128.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/129.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/129.png
new file mode 100644
index 0000000000..1aed0440ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/129.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/130.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/130.png
new file mode 100644
index 0000000000..70e79fd600
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/130.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/131.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/131.png
new file mode 100644
index 0000000000..b88cae88a1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/131.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/132.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/132.png
new file mode 100644
index 0000000000..30d27250cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/132.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/133.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/133.png
new file mode 100644
index 0000000000..d99c8af5db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/133.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/134.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/134.png
new file mode 100644
index 0000000000..54ecaebe58
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/134.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/135.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/135.png
new file mode 100644
index 0000000000..1d889812e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/135.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/136.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/136.png
new file mode 100644
index 0000000000..6c1c4db1ba
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/136.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/137.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/137.png
new file mode 100644
index 0000000000..c05d316f5d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/137.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/2.png
new file mode 100644
index 0000000000..f7f0ea23fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/200.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/200.png
new file mode 100644
index 0000000000..13d83e87d4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/200.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/201.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/201.png
new file mode 100644
index 0000000000..43c0d891e7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/201.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/202.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/202.png
new file mode 100644
index 0000000000..333c37a457
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/202.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/203.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/203.png
new file mode 100644
index 0000000000..842f9dcd6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/203.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/204.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/204.png
new file mode 100644
index 0000000000..4bf2c2fb03
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/204.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/205.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/205.png
new file mode 100644
index 0000000000..a2fc3a2dec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/205.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/206.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/206.png
new file mode 100644
index 0000000000..4e0b107e56
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/206.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/207.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/207.png
new file mode 100644
index 0000000000..70b42b9c40
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/207.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/208.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/208.png
new file mode 100644
index 0000000000..2404f3953b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/208.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/209.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/209.png
new file mode 100644
index 0000000000..926a6b53f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/209.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/210.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/210.png
new file mode 100644
index 0000000000..64d3b32937
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/210.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/211.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/211.png
new file mode 100644
index 0000000000..ee3b414452
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/211.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/212.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/212.png
new file mode 100644
index 0000000000..7937bf00d5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/212.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/213.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/213.png
new file mode 100644
index 0000000000..744c1ffe93
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/213.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/214.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/214.png
new file mode 100644
index 0000000000..940fbe63ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/214.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/220.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/220.png
new file mode 100644
index 0000000000..aa4abeb14b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/220.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/221.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/221.png
new file mode 100644
index 0000000000..583fbbb23e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/221.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/222.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/222.png
new file mode 100644
index 0000000000..5ed082b76e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/222.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/223.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/223.png
new file mode 100644
index 0000000000..a07607b86f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/223.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/224.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/224.png
new file mode 100644
index 0000000000..581c47b462
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/224.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/230.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/230.png
new file mode 100644
index 0000000000..9065b4e7e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/230.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/231.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/231.png
new file mode 100644
index 0000000000..1ce7e8d1b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/231.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/232.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/232.png
new file mode 100644
index 0000000000..a60a93a56f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/232.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/233.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/233.png
new file mode 100644
index 0000000000..c2d07a9bcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/233.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/234.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/234.png
new file mode 100644
index 0000000000..5cc0aa1696
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/234.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/240.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/240.png
new file mode 100644
index 0000000000..cf63579d9e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/240.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/241.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/241.png
new file mode 100644
index 0000000000..2ce2cef618
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/241.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/242.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/242.png
new file mode 100644
index 0000000000..720bb9f966
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/242.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/243.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/243.png
new file mode 100644
index 0000000000..3710d8cf2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/243.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/244.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/244.png
new file mode 100644
index 0000000000..5bf7b918d5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/244.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/250.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/250.png
new file mode 100644
index 0000000000..8e0b5b04e4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/250.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/251.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/251.png
new file mode 100644
index 0000000000..ab7de61ebb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/251.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/252.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/252.png
new file mode 100644
index 0000000000..6069b4dbeb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/252.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/260.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/260.png
new file mode 100644
index 0000000000..1984839891
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/260.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/261.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/261.png
new file mode 100644
index 0000000000..90587526c3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/261.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/262.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/262.png
new file mode 100644
index 0000000000..73681e7c2e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/262.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/270.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/270.png
new file mode 100644
index 0000000000..8f9360894c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/270.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/271.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/271.png
new file mode 100644
index 0000000000..8f9360894c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/271.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/3.png
new file mode 100644
index 0000000000..f7f0ea23fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/4.png
new file mode 100644
index 0000000000..f7f0ea23fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/410.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/410.png
new file mode 100644
index 0000000000..38e8db7c2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/410.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/414.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/414.png
new file mode 100644
index 0000000000..73b26a79b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/414.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/415.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/415.png
new file mode 100644
index 0000000000..7c72cd816e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/415.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/416.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/416.png
new file mode 100644
index 0000000000..5990397dc3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/416.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/417.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/417.png
new file mode 100644
index 0000000000..7a0db4b15b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/417.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/418.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/418.png
new file mode 100644
index 0000000000..715a648e68
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/418.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/419.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/419.png
new file mode 100644
index 0000000000..4af0dbbacb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/419.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/420.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/420.png
new file mode 100644
index 0000000000..b30ac0ba39
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/420.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/421.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/421.png
new file mode 100644
index 0000000000..d79610ce54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/421.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/422.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/422.png
new file mode 100644
index 0000000000..c2f125a380
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/422.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/423.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/423.png
new file mode 100644
index 0000000000..620e08d2ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/423.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/424.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/424.png
new file mode 100644
index 0000000000..5ce2176652
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/424.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/425.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/425.png
new file mode 100644
index 0000000000..d9a0bae72e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/425.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/426.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/426.png
new file mode 100644
index 0000000000..68aa3ab2da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/426.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/427.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/427.png
new file mode 100644
index 0000000000..26b8f40d85
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/427.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/428.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/428.png
new file mode 100644
index 0000000000..4e00003f76
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/428.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/429.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/429.png
new file mode 100644
index 0000000000..9e06a6695c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/429.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/470.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/470.png
new file mode 100644
index 0000000000..0a13257b40
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/470.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/471.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/471.png
new file mode 100644
index 0000000000..9904108c63
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/471.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/472.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/472.png
new file mode 100644
index 0000000000..a114d1491b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/472.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/473.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/473.png
new file mode 100644
index 0000000000..3e57c9a9b0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/473.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/474.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/474.png
new file mode 100644
index 0000000000..29b876ecb7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/474.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/475.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/475.png
new file mode 100644
index 0000000000..4fa68b8884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/475.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/476.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/476.png
new file mode 100644
index 0000000000..0eeee00d42
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/476.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/477.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/477.png
new file mode 100644
index 0000000000..d92fae61d3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/477.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/478.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/478.png
new file mode 100644
index 0000000000..3b8e64ecdd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/478.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/479.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/479.png
new file mode 100644
index 0000000000..f927b60f83
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/479.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/480.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/480.png
new file mode 100644
index 0000000000..0083acc912
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/480.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/481.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/481.png
new file mode 100644
index 0000000000..d67576d321
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/481.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/482.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/482.png
new file mode 100644
index 0000000000..bf0f3013d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/482.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/483.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/483.png
new file mode 100644
index 0000000000..f12e08235f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/483.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/484.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/484.png
new file mode 100644
index 0000000000..b64fa69cf3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/484.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/485.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/485.png
new file mode 100644
index 0000000000..d2b08a7e73
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/485.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/486.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/486.png
new file mode 100644
index 0000000000..edcbb27bef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/486.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/487.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/487.png
new file mode 100644
index 0000000000..121d946ca5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/487.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/488.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/488.png
new file mode 100644
index 0000000000..3170ea5f80
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/488.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/489.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/489.png
new file mode 100644
index 0000000000..fd68e0f7a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/489.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/490.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/490.png
new file mode 100644
index 0000000000..2806728806
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/490.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/491.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/491.png
new file mode 100644
index 0000000000..43440fca93
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/491.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/492.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/492.png
new file mode 100644
index 0000000000..2ec6748ac7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/492.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/493.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/493.png
new file mode 100644
index 0000000000..07a1e617a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/493.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/494.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/494.png
new file mode 100644
index 0000000000..ae28d351ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/494.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/495.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/495.png
new file mode 100644
index 0000000000..ced41595e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/495.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/496.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/496.png
new file mode 100644
index 0000000000..9be6f6233a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/496.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/497.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/497.png
new file mode 100644
index 0000000000..6bd1b49cf6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/497.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/498.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/498.png
new file mode 100644
index 0000000000..826fcea941
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/498.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/499.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/499.png
new file mode 100644
index 0000000000..de656316fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/499.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/5.png
new file mode 100644
index 0000000000..f7f0ea23fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/500.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/500.png
new file mode 100644
index 0000000000..d3442c10fd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/500.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/501.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/501.png
new file mode 100644
index 0000000000..87a6cdaf72
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/501.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/502.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/502.png
new file mode 100644
index 0000000000..420ac20b87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/502.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/503.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/503.png
new file mode 100644
index 0000000000..686f01dded
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/503.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/504.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/504.png
new file mode 100644
index 0000000000..a8ffc925e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/504.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/505.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/505.png
new file mode 100644
index 0000000000..5039ec6a33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/505.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/510.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/510.png
new file mode 100644
index 0000000000..3ed2572636
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/510.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/511.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/511.png
new file mode 100644
index 0000000000..5aa2212205
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/511.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/512.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/512.png
new file mode 100644
index 0000000000..2cc737bcab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/512.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/513.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/513.png
new file mode 100644
index 0000000000..2cc737bcab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/513.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/520.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/520.png
new file mode 100644
index 0000000000..0671e7e84e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/520.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/521.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/521.png
new file mode 100644
index 0000000000..5039ec6a33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/521.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/522.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/522.png
new file mode 100644
index 0000000000..5039ec6a33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/522.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/523.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/523.png
new file mode 100644
index 0000000000..62479cdd6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/523.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/524.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/524.png
new file mode 100644
index 0000000000..5a8b14cd9e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/524.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/526.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/526.png
new file mode 100644
index 0000000000..617edb38f7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/526.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/527.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/527.png
new file mode 100644
index 0000000000..5039ec6a33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/527.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/528.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/528.png
new file mode 100644
index 0000000000..5039ec6a33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/528.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/529.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/529.png
new file mode 100644
index 0000000000..5039ec6a33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/529.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/530.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/530.png
new file mode 100644
index 0000000000..eadc46f81d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/530.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/531.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/531.png
new file mode 100644
index 0000000000..5039ec6a33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/531.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/532.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/532.png
new file mode 100644
index 0000000000..5039ec6a33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/532.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/533.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/533.png
new file mode 100644
index 0000000000..84a2703d2d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/533.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/534.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/534.png
new file mode 100644
index 0000000000..1313286ad3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/534.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/535.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/535.png
new file mode 100644
index 0000000000..a96e85f7e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/535.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/536.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/536.png
new file mode 100644
index 0000000000..d7f8b9cc2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/536.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/537.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/537.png
new file mode 100644
index 0000000000..9bc952df35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/537.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/538.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/538.png
new file mode 100644
index 0000000000..b218973761
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/538.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/540.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/540.png
new file mode 100644
index 0000000000..f099453ef5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/540.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/550.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/550.png
new file mode 100644
index 0000000000..f20df3aa3e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/550.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/551.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/551.png
new file mode 100644
index 0000000000..198d9053a1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/551.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/552.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/552.png
new file mode 100644
index 0000000000..2250115907
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/552.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/553.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/553.png
new file mode 100644
index 0000000000..191dd6454c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/553.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/554.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/554.png
new file mode 100644
index 0000000000..18c2ab18f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/554.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/555.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/555.png
new file mode 100644
index 0000000000..e6aad259a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/555.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/556.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/556.png
new file mode 100644
index 0000000000..ae62ca5e17
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/556.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/557.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/557.png
new file mode 100644
index 0000000000..4c79d28e9c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/557.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/558.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/558.png
new file mode 100644
index 0000000000..a7ad0cf6f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/558.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/559.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/559.png
new file mode 100644
index 0000000000..93df037a6e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/559.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/560.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/560.png
new file mode 100644
index 0000000000..88ce9d1a52
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/560.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/561.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/561.png
new file mode 100644
index 0000000000..af63a116eb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/561.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/562.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/562.png
new file mode 100644
index 0000000000..a9652e5ee6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/562.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/563.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/563.png
new file mode 100644
index 0000000000..19e62ab838
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/563.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/564.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/564.png
new file mode 100644
index 0000000000..a7a368fe8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/564.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/565.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/565.png
new file mode 100644
index 0000000000..960a94be8a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/565.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/566.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/566.png
new file mode 100644
index 0000000000..28beb73387
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/566.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/567.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/567.png
new file mode 100644
index 0000000000..f3166a5145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/567.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/568.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/568.png
new file mode 100644
index 0000000000..631d01361b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/568.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/569.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/569.png
new file mode 100644
index 0000000000..0c17049471
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/569.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/570.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/570.png
new file mode 100644
index 0000000000..3f3294994b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/570.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/571.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/571.png
new file mode 100644
index 0000000000..e041229a2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/571.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/572.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/572.png
new file mode 100644
index 0000000000..e76643f5c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/572.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/573.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/573.png
new file mode 100644
index 0000000000..f343c8ce69
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/573.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/574.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/574.png
new file mode 100644
index 0000000000..dfa35b8984
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/574.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/576.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/576.png
new file mode 100644
index 0000000000..27923e9f92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/576.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/577.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/577.png
new file mode 100644
index 0000000000..09ef259b76
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/577.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/578.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/578.png
new file mode 100644
index 0000000000..09ef259b76
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/578.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/579.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/579.png
new file mode 100644
index 0000000000..1d653782f8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/579.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/580.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/580.png
new file mode 100644
index 0000000000..1d653782f8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/580.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/581.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/581.png
new file mode 100644
index 0000000000..356d3560e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/581.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/582.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/582.png
new file mode 100644
index 0000000000..3e67b8dc7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/582.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/583.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/583.png
new file mode 100644
index 0000000000..f4d75e17eb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/583.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/584.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/584.png
new file mode 100644
index 0000000000..b445b2fbbf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/584.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/6.png
new file mode 100644
index 0000000000..f7f0ea23fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/7.png
new file mode 100644
index 0000000000..f7f0ea23fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/765.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/765.png
new file mode 100644
index 0000000000..2926dee5f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/765.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/8.png
new file mode 100644
index 0000000000..f7f0ea23fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/9.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/9.png
new file mode 100644
index 0000000000..f7f0ea23fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.02/9.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/1.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/1.png
new file mode 100644
index 0000000000..ea41fa5bfd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/10.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/10.png
new file mode 100644
index 0000000000..c62b237004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/10.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/100.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/100.png
new file mode 100644
index 0000000000..5bb4e1c949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/100.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/101.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/101.png
new file mode 100644
index 0000000000..bdb2e470ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/101.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/102.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/102.png
new file mode 100644
index 0000000000..d39bba86b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/102.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/103.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/103.png
new file mode 100644
index 0000000000..6105b43a60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/103.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/104.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/104.png
new file mode 100644
index 0000000000..4690b2c612
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/104.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/105.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/105.png
new file mode 100644
index 0000000000..84f3a9fbbc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/105.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/106.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/106.png
new file mode 100644
index 0000000000..3ce8896607
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/106.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/107.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/107.png
new file mode 100644
index 0000000000..09b8dd99b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/107.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/11.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/11.png
new file mode 100644
index 0000000000..4b02911cfc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/11.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/110.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/110.png
new file mode 100644
index 0000000000..d5505f782e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/110.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/111.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/111.png
new file mode 100644
index 0000000000..fb7a1c39bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/111.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/112.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/112.png
new file mode 100644
index 0000000000..0167120c63
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/112.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/113.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/113.png
new file mode 100644
index 0000000000..cbfdd3eeb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/113.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/12.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/12.png
new file mode 100644
index 0000000000..45ccdcbac6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/12.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/120.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/120.png
new file mode 100644
index 0000000000..ac9558f3cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/120.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/13.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/13.png
new file mode 100644
index 0000000000..aac7d830d3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/13.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/130.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/130.png
new file mode 100644
index 0000000000..3b38d75e4a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/130.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/131.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/131.png
new file mode 100644
index 0000000000..d8db7b0087
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/131.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/132.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/132.png
new file mode 100644
index 0000000000..522c35dcfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/132.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/14.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/14.png
new file mode 100644
index 0000000000..71cfbbfac7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/14.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/140.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/140.png
new file mode 100644
index 0000000000..3b75129866
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/140.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/141.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/141.png
new file mode 100644
index 0000000000..cd27019828
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/141.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/142.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/142.png
new file mode 100644
index 0000000000..6a2771f69a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/142.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/143.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/143.png
new file mode 100644
index 0000000000..8849632a90
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/143.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/144.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/144.png
new file mode 100644
index 0000000000..004e7542fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/144.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/145.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/145.png
new file mode 100644
index 0000000000..51434c4204
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/145.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/146.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/146.png
new file mode 100644
index 0000000000..29f002ad7b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/146.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/147.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/147.png
new file mode 100644
index 0000000000..d0e483fcb8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/147.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/148.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/148.png
new file mode 100644
index 0000000000..a922fb564b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/148.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/149.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/149.png
new file mode 100644
index 0000000000..c7f3c0636a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/149.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/15.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/15.png
new file mode 100644
index 0000000000..4e2edfeca7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/15.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/150.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/150.png
new file mode 100644
index 0000000000..b6dffa2c69
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/150.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/151.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/151.png
new file mode 100644
index 0000000000..40c5577045
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/151.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/152.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/152.png
new file mode 100644
index 0000000000..70d95c229f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/152.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/153.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/153.png
new file mode 100644
index 0000000000..568d779760
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/153.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/154.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/154.png
new file mode 100644
index 0000000000..c4373754da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/154.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/155.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/155.png
new file mode 100644
index 0000000000..166b70636a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/155.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/156.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/156.png
new file mode 100644
index 0000000000..27e17024f8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/156.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/157.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/157.png
new file mode 100644
index 0000000000..910f30a022
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/157.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/16.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/16.png
new file mode 100644
index 0000000000..2f900ccc47
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/16.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/160.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/160.png
new file mode 100644
index 0000000000..b83181d4d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/160.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/161.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/161.png
new file mode 100644
index 0000000000..de2f85b169
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/161.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/162.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/162.png
new file mode 100644
index 0000000000..42d620ef85
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/162.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/163.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/163.png
new file mode 100644
index 0000000000..3ebfcd7624
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/163.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/164.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/164.png
new file mode 100644
index 0000000000..c2df296911
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/164.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/165.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/165.png
new file mode 100644
index 0000000000..0d1d65a9b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/165.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/166.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/166.png
new file mode 100644
index 0000000000..48996d79ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/166.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/167.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/167.png
new file mode 100644
index 0000000000..1cb07e3917
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/167.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/168.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/168.png
new file mode 100644
index 0000000000..fca0df8cbb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/168.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/169.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/169.png
new file mode 100644
index 0000000000..7565d64aa5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/169.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/17.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/17.png
new file mode 100644
index 0000000000..0190547a58
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/17.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/170.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/170.png
new file mode 100644
index 0000000000..1acf7b8cac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/170.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/171.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/171.png
new file mode 100644
index 0000000000..42ab199c2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/171.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/172.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/172.png
new file mode 100644
index 0000000000..169588ebd3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/172.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/173.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/173.png
new file mode 100644
index 0000000000..d1e3e585f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/173.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/174.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/174.png
new file mode 100644
index 0000000000..2ff2586f8e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/174.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/174.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/174.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/174.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/175.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/175.png
new file mode 100644
index 0000000000..6bc7d38833
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/175.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/175.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/175.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/175.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/176.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/176.png
new file mode 100644
index 0000000000..aa0dead2ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/176.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/176.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/176.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/176.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/177.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/177.png
new file mode 100644
index 0000000000..928079a8e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/177.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/177.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/177.png.mcmeta
new file mode 100644
index 0000000000..dd1bedb120
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/177.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/178.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/178.png
new file mode 100644
index 0000000000..e47d62c33c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/178.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/179.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/179.png
new file mode 100644
index 0000000000..43654a2959
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/179.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/18.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/18.png
new file mode 100644
index 0000000000..d8cc8c5a56
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/18.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/180.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/180.png
new file mode 100644
index 0000000000..28b8da999e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/180.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/181.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/181.png
new file mode 100644
index 0000000000..0383cfe92e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/181.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/182.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/182.png
new file mode 100644
index 0000000000..2ed03d7137
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/182.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/183.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/183.png
new file mode 100644
index 0000000000..cd24a52519
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/183.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/184.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/184.png
new file mode 100644
index 0000000000..ebb7c1060d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/184.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/188.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/188.png
new file mode 100644
index 0000000000..8acb8f0528
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/188.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/188.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/188.png.mcmeta
new file mode 100644
index 0000000000..a668e18a77
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/188.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 2}}
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/189.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/189.png
new file mode 100644
index 0000000000..083b921c6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/189.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/189.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/189.png.mcmeta
new file mode 100644
index 0000000000..40a6320019
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/189.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 4}}
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/19.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/19.png
new file mode 100644
index 0000000000..1bcfb2d95e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/19.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/190.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/190.png
new file mode 100644
index 0000000000..5a8e0b4652
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/190.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/191.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/191.png
new file mode 100644
index 0000000000..e46e7859e3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/191.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/192.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/192.png
new file mode 100644
index 0000000000..e8c2bf1214
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/192.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/193.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/193.png
new file mode 100644
index 0000000000..62e720127c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/193.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/194.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/194.png
new file mode 100644
index 0000000000..3712774f83
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/194.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/199.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/199.png
new file mode 100644
index 0000000000..110faa33c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/199.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/2.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/2.png
new file mode 100644
index 0000000000..6c6d9c620d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/20.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/20.png
new file mode 100644
index 0000000000..9d9f338e5a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/20.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/200.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/200.png
new file mode 100644
index 0000000000..90f1879cbc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/200.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/201.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/201.png
new file mode 100644
index 0000000000..527dc7e1e3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/201.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/202.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/202.png
new file mode 100644
index 0000000000..5deda970c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/202.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/203.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/203.png
new file mode 100644
index 0000000000..cdd5e48fb4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/203.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/204.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/204.png
new file mode 100644
index 0000000000..79d7fa317a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/204.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/205.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/205.png
new file mode 100644
index 0000000000..aeed77f0e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/205.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/206.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/206.png
new file mode 100644
index 0000000000..8fcb481955
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/206.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/207.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/207.png
new file mode 100644
index 0000000000..5f5d273f06
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/207.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/208.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/208.png
new file mode 100644
index 0000000000..632ca2ddaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/208.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/209.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/209.png
new file mode 100644
index 0000000000..ceabc1591c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/209.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/21.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/21.png
new file mode 100644
index 0000000000..4f7225e491
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/21.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/210.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/210.png
new file mode 100644
index 0000000000..4e3ecf593a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/210.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/211.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/211.png
new file mode 100644
index 0000000000..dc78713db4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/211.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/212.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/212.png
new file mode 100644
index 0000000000..32ceb36121
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/212.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/213.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/213.png
new file mode 100644
index 0000000000..c965c312a1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/213.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/214.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/214.png
new file mode 100644
index 0000000000..ebdf57fc77
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/214.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/215.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/215.png
new file mode 100644
index 0000000000..62b605e368
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/215.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/216.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/216.png
new file mode 100644
index 0000000000..f3dc018b30
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/216.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/217.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/217.png
new file mode 100644
index 0000000000..3f06db5183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/217.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/218.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/218.png
new file mode 100644
index 0000000000..fe2a0fb496
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/218.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/219.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/219.png
new file mode 100644
index 0000000000..14c3974b86
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/219.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/22.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/22.png
new file mode 100644
index 0000000000..0f267b5583
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/22.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/220.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/220.png
new file mode 100644
index 0000000000..07c404b6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/220.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/221.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/221.png
new file mode 100644
index 0000000000..888fb75a5d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/221.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/222.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/222.png
new file mode 100644
index 0000000000..ade0a1c287
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/222.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/223.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/223.png
new file mode 100644
index 0000000000..eafc9b3b75
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/223.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/224.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/224.png
new file mode 100644
index 0000000000..c1126aefaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/224.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/225.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/225.png
new file mode 100644
index 0000000000..a247c058f8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/225.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/226.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/226.png
new file mode 100644
index 0000000000..c107382064
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/226.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/227.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/227.png
new file mode 100644
index 0000000000..737371e45c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/227.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/228.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/228.png
new file mode 100644
index 0000000000..1e7963fdc5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/228.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/229.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/229.png
new file mode 100644
index 0000000000..04121bbaeb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/229.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/23.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/23.png
new file mode 100644
index 0000000000..6fe51d5228
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/23.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/230.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/230.png
new file mode 100644
index 0000000000..80ae4244ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/230.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/230.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/230.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/230.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/231.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/231.png
new file mode 100644
index 0000000000..bb4b031de4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/231.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/232.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/232.png
new file mode 100644
index 0000000000..fac1800649
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/232.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/24.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/24.png
new file mode 100644
index 0000000000..cf6e98f0e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/24.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/25.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/25.png
new file mode 100644
index 0000000000..fadaf89d62
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/25.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/26.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/26.png
new file mode 100644
index 0000000000..6c1b5bcb8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/26.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/27.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/27.png
new file mode 100644
index 0000000000..c5dedac4b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/27.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/3.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/3.png
new file mode 100644
index 0000000000..84e2a20638
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/30.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/30.png
new file mode 100644
index 0000000000..a838512cc1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/30.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/31.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/31.png
new file mode 100644
index 0000000000..92bb9117d1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/31.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/32.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/32.png
new file mode 100644
index 0000000000..973e67f51d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/32.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/33.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/33.png
new file mode 100644
index 0000000000..5e3fbb8a92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/33.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/34.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/34.png
new file mode 100644
index 0000000000..4ce59d721c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/34.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/35.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/35.png
new file mode 100644
index 0000000000..5dcb72d92d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/35.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/36.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/36.png
new file mode 100644
index 0000000000..1ab1ba0451
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/36.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/37.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/37.png
new file mode 100644
index 0000000000..cecf6225c8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/37.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/38.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/38.png
new file mode 100644
index 0000000000..3a4c636619
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/38.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/39.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/39.png
new file mode 100644
index 0000000000..3af9fa708e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/39.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/4.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/4.png
new file mode 100644
index 0000000000..7d45cae3c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/40.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/40.png
new file mode 100644
index 0000000000..2846052213
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/40.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/41.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/41.png
new file mode 100644
index 0000000000..c8ec655935
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/41.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/42.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/42.png
new file mode 100644
index 0000000000..1d0e42c7b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/42.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/43.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/43.png
new file mode 100644
index 0000000000..97c0521532
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/43.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/44.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/44.png
new file mode 100644
index 0000000000..c8d4403b57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/44.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/45.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/45.png
new file mode 100644
index 0000000000..390104ba98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/45.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/46.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/46.png
new file mode 100644
index 0000000000..40779ac245
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/46.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/47.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/47.png
new file mode 100644
index 0000000000..acfc453cc8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/47.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/48.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/48.png
new file mode 100644
index 0000000000..4f03a8b840
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/48.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/49.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/49.png
new file mode 100644
index 0000000000..9b31c42749
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/49.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/5.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/5.png
new file mode 100644
index 0000000000..1f933fbbca
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/50.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/50.png
new file mode 100644
index 0000000000..6645e53b22
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/50.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/51.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/51.png
new file mode 100644
index 0000000000..bc58d606f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/51.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/52.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/52.png
new file mode 100644
index 0000000000..d5f60b5700
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/52.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/53.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/53.png
new file mode 100644
index 0000000000..dab8a6edf0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/53.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/54.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/54.png
new file mode 100644
index 0000000000..f69ebac3ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/54.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/55.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/55.png
new file mode 100644
index 0000000000..d5c4b37f76
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/55.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/56.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/56.png
new file mode 100644
index 0000000000..5b21a21982
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/56.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/57.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/57.png
new file mode 100644
index 0000000000..096cb321d4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/57.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/58.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/58.png
new file mode 100644
index 0000000000..f5592679b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/58.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/59.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/59.png
new file mode 100644
index 0000000000..6bd908f295
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/59.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/6.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/6.png
new file mode 100644
index 0000000000..498da22fca
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/60.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/60.png
new file mode 100644
index 0000000000..7be4ab35bd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/60.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/61.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/61.png
new file mode 100644
index 0000000000..a5c04ecdc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/61.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/62.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/62.png
new file mode 100644
index 0000000000..9ac8bc4340
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/62.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/63.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/63.png
new file mode 100644
index 0000000000..6aa6f339b8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/63.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/64.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/64.png
new file mode 100644
index 0000000000..45e0bbcac5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/64.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/65.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/65.png
new file mode 100644
index 0000000000..ed402def5b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/65.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/68.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/68.png
new file mode 100644
index 0000000000..7df30e6109
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/68.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/69.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/69.png
new file mode 100644
index 0000000000..4ec0520859
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/69.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/7.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/7.png
new file mode 100644
index 0000000000..a14a647b15
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/70.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/70.png
new file mode 100644
index 0000000000..ef3d6991a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/70.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/700.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/700.png
new file mode 100644
index 0000000000..d78e11a962
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/700.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/701.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/701.png
new file mode 100644
index 0000000000..39b8023a51
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/701.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/703.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/703.png
new file mode 100644
index 0000000000..7786f8e290
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/703.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/704.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/704.png
new file mode 100644
index 0000000000..dae45d70a9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/704.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/705.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/705.png
new file mode 100644
index 0000000000..fea6dec4fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/705.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/707.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/707.png
new file mode 100644
index 0000000000..58ce6a619f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/707.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/708.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/708.png
new file mode 100644
index 0000000000..824781b29b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/708.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/71.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/71.png
new file mode 100644
index 0000000000..f1a7811725
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/71.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/710.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/710.png
new file mode 100644
index 0000000000..9530d714aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/710.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/711.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/711.png
new file mode 100644
index 0000000000..1f8547cda9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/711.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/712.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/712.png
new file mode 100644
index 0000000000..d043b13b76
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/712.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/713.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/713.png
new file mode 100644
index 0000000000..3c18440e5e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/713.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/714.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/714.png
new file mode 100644
index 0000000000..da2d65e445
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/714.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/715.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/715.png
new file mode 100644
index 0000000000..63e49eaeea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/715.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/719.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/719.png
new file mode 100644
index 0000000000..7b519ccba5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/719.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/72.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/72.png
new file mode 100644
index 0000000000..d043b13b76
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/72.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/720.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/720.png
new file mode 100644
index 0000000000..c04d87dfa4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/720.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/721.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/721.png
new file mode 100644
index 0000000000..35ae949a9e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/721.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/721.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/721.png.mcmeta
new file mode 100644
index 0000000000..6575dfcc65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/721.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}}
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/722.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/722.png
new file mode 100644
index 0000000000..df86286b35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/722.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/722.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/722.png.mcmeta
new file mode 100644
index 0000000000..6575dfcc65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/722.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}}
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/723.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/723.png
new file mode 100644
index 0000000000..1ec77a6ffb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/723.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/723.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/723.png.mcmeta
new file mode 100644
index 0000000000..6575dfcc65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/723.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}}
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/724.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/724.png
new file mode 100644
index 0000000000..df1cdffbf9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/724.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/724.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/724.png.mcmeta
new file mode 100644
index 0000000000..6575dfcc65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/724.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}}
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/725.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/725.png
new file mode 100644
index 0000000000..f47575797f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/725.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/726.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/726.png
new file mode 100644
index 0000000000..a0f19c2aca
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/726.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/726.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/726.png.mcmeta
new file mode 100644
index 0000000000..6575dfcc65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/726.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}}
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/727.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/727.png
new file mode 100644
index 0000000000..6c32df0303
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/727.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/728.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/728.png
new file mode 100644
index 0000000000..8757d4c314
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/728.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/729.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/729.png
new file mode 100644
index 0000000000..9ba6be3835
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/729.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/73.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/73.png
new file mode 100644
index 0000000000..1c163a179e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/73.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/730.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/730.png
new file mode 100644
index 0000000000..5aaf3be64c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/730.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/731.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/731.png
new file mode 100644
index 0000000000..543c83a5e7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/731.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/732.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/732.png
new file mode 100644
index 0000000000..b247393b9e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/732.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/733.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/733.png
new file mode 100644
index 0000000000..5ca1196453
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/733.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/734.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/734.png
new file mode 100644
index 0000000000..9a66d984e7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/734.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/735.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/735.png
new file mode 100644
index 0000000000..9f20c5486f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/735.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/736.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/736.png
new file mode 100644
index 0000000000..2f7b20f9bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/736.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/737.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/737.png
new file mode 100644
index 0000000000..4dcd9316ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/737.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/738.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/738.png
new file mode 100644
index 0000000000..ae16f60261
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/738.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/739.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/739.png
new file mode 100644
index 0000000000..6af4bc8390
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/739.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/74.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/74.png
new file mode 100644
index 0000000000..b7e2200e5b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/74.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/740.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/740.png
new file mode 100644
index 0000000000..d9833ee028
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/740.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/741.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/741.png
new file mode 100644
index 0000000000..c017b3f02a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/741.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/742.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/742.png
new file mode 100644
index 0000000000..4b62ccbe2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/742.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/743.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/743.png
new file mode 100644
index 0000000000..c38f575d4a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/743.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/744.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/744.png
new file mode 100644
index 0000000000..c529ecab37
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/744.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/745.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/745.png
new file mode 100644
index 0000000000..e1f61c4823
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/745.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/746.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/746.png
new file mode 100644
index 0000000000..807a36d1ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/746.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/747.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/747.png
new file mode 100644
index 0000000000..dc2b247971
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/747.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/748.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/748.png
new file mode 100644
index 0000000000..b096117197
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/748.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/749.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/749.png
new file mode 100644
index 0000000000..ee559d57a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/749.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/75.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/75.png
new file mode 100644
index 0000000000..d78e11a962
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/75.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/750.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/750.png
new file mode 100644
index 0000000000..96949104e4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/750.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/751.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/751.png
new file mode 100644
index 0000000000..ff49208d84
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/751.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/752.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/752.png
new file mode 100644
index 0000000000..663d8c746e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/752.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/753.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/753.png
new file mode 100644
index 0000000000..619f69a52d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/753.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/754.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/754.png
new file mode 100644
index 0000000000..4fb0449f99
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/754.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/755.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/755.png
new file mode 100644
index 0000000000..1128dc6171
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/755.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/756.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/756.png
new file mode 100644
index 0000000000..8ab8ec5d00
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/756.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/757.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/757.png
new file mode 100644
index 0000000000..bc1046149a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/757.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/757.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/757.png.mcmeta
new file mode 100644
index 0000000000..52b06dfed5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/757.png.mcmeta
@@ -0,0 +1 @@
+{ "animation": { "frametime": 20, "frames": [ 0, 1, 2, 3, { "index": 4, "time": 80 } ] } } \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/76.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/76.png
new file mode 100644
index 0000000000..8669222881
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/76.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/77.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/77.png
new file mode 100644
index 0000000000..f3f945d2d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/77.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/78.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/78.png
new file mode 100644
index 0000000000..0e9cb5bedb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/78.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/79.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/79.png
new file mode 100644
index 0000000000..133d1ceddf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/79.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/8.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/8.png
new file mode 100644
index 0000000000..7c9dadcded
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/80.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/80.png
new file mode 100644
index 0000000000..7786f8e290
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/80.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/82.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/82.png
new file mode 100644
index 0000000000..1f771a134c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/82.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/83.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/83.png
new file mode 100644
index 0000000000..8519da04cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/83.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/84.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/84.png
new file mode 100644
index 0000000000..b0b493dc3f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/84.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/85.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/85.png
new file mode 100644
index 0000000000..12e21afa70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/85.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/86.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/86.png
new file mode 100644
index 0000000000..fea6dec4fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/86.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/87.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/87.png
new file mode 100644
index 0000000000..cdedff69de
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/87.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/88.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/88.png
new file mode 100644
index 0000000000..caf3d63ffc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/88.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/89.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/89.png
new file mode 100644
index 0000000000..3da360f157
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/89.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/90.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/90.png
new file mode 100644
index 0000000000..2afdb4f4bd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/90.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/91.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/91.png
new file mode 100644
index 0000000000..6bb1c4f13c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/91.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/92.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/92.png
new file mode 100644
index 0000000000..e80a8ebc5e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/92.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/93.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/93.png
new file mode 100644
index 0000000000..cc3d6759c4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/93.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/94.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/94.png
new file mode 100644
index 0000000000..ca82f0445f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/94.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/95.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/95.png
new file mode 100644
index 0000000000..f997e9431a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/95.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/96.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/96.png
new file mode 100644
index 0000000000..cb346fc255
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/96.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/97.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/97.png
new file mode 100644
index 0000000000..f1b9c129a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/97.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/98.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/98.png
new file mode 100644
index 0000000000..dd2a858e35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/98.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/99.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/99.png
new file mode 100644
index 0000000000..4ce007930c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.03/99.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.neutroniumHeatCapacitor.png b/src/main/resources/assets/gregtech/textures/items/gt.neutroniumHeatCapacitor.png
new file mode 100644
index 0000000000..6e06fd9b9e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.neutroniumHeatCapacitor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.neutronreflector.png b/src/main/resources/assets/gregtech/textures/items/gt.neutronreflector.png
new file mode 100644
index 0000000000..65bf6df55d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.neutronreflector.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.reactorMOXDual.png b/src/main/resources/assets/gregtech/textures/items/gt.reactorMOXDual.png
new file mode 100644
index 0000000000..86159588e7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.reactorMOXDual.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.reactorMOXQuad.png b/src/main/resources/assets/gregtech/textures/items/gt.reactorMOXQuad.png
new file mode 100644
index 0000000000..de73aa7585
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.reactorMOXQuad.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.reactorMOXSimple.png b/src/main/resources/assets/gregtech/textures/items/gt.reactorMOXSimple.png
new file mode 100644
index 0000000000..0915be97fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.reactorMOXSimple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.reactorUraniumDual.png b/src/main/resources/assets/gregtech/textures/items/gt.reactorUraniumDual.png
new file mode 100644
index 0000000000..7051626634
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.reactorUraniumDual.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.reactorUraniumQuad.png b/src/main/resources/assets/gregtech/textures/items/gt.reactorUraniumQuad.png
new file mode 100644
index 0000000000..04362e5fc0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.reactorUraniumQuad.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.reactorUraniumSimple.png b/src/main/resources/assets/gregtech/textures/items/gt.reactorUraniumSimple.png
new file mode 100644
index 0000000000..3198940c2d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.reactorUraniumSimple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.sensorcard.png b/src/main/resources/assets/gregtech/textures/items/gt.sensorcard.png
new file mode 100644
index 0000000000..fe6e632233
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.sensorcard.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.sunnariumCell.png b/src/main/resources/assets/gregtech/textures/items/gt.sunnariumCell.png
new file mode 100644
index 0000000000..04865e8706
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.sunnariumCell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.tierdDrone0.png b/src/main/resources/assets/gregtech/textures/items/gt.tierdDrone0.png
new file mode 100644
index 0000000000..003f6fd55c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.tierdDrone0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.tierdDrone1.png b/src/main/resources/assets/gregtech/textures/items/gt.tierdDrone1.png
new file mode 100644
index 0000000000..3a43f3b6d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.tierdDrone1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/gt.tierdDrone2.png b/src/main/resources/assets/gregtech/textures/items/gt.tierdDrone2.png
new file mode 100644
index 0000000000..d365d08765
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/gt.tierdDrone2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/BUTCHERYKNIFE.png b/src/main/resources/assets/gregtech/textures/items/iconsets/BUTCHERYKNIFE.png
new file mode 100644
index 0000000000..1e537f1d02
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/BUTCHERYKNIFE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/BUTCHERYKNIFE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/BUTCHERYKNIFE_OVERLAY.png
new file mode 100644
index 0000000000..555f445df1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/BUTCHERYKNIFE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/CROWBAR.png b/src/main/resources/assets/gregtech/textures/items/iconsets/CROWBAR.png
new file mode 100644
index 0000000000..5016162c9c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/CROWBAR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/CROWBAR_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/CROWBAR_OVERLAY.png
new file mode 100644
index 0000000000..3ed452dcc8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/CROWBAR_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_0.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_0.png
new file mode 100644
index 0000000000..e17e4fd51d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_0_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_0_OVERLAY.png
new file mode 100644
index 0000000000..2b0d9055a7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_0_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_1.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_1.png
new file mode 100644
index 0000000000..7a90f40778
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_1_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_1_OVERLAY.png
new file mode 100644
index 0000000000..16cb0e49a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_1_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_2.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_2.png
new file mode 100644
index 0000000000..4cc2d21cd9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_2_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_2_OVERLAY.png
new file mode 100644
index 0000000000..12bb259f66
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_2_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_3.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_3.png
new file mode 100644
index 0000000000..ea801aed1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_3_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_3_OVERLAY.png
new file mode 100644
index 0000000000..723390bb59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_3_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_4.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_4.png
new file mode 100644
index 0000000000..9f222b91e3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_4_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_4_OVERLAY.png
new file mode 100644
index 0000000000..99d4333ba4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_4_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_5.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_5.png
new file mode 100644
index 0000000000..cd046cae24
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_5_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_5_OVERLAY.png
new file mode 100644
index 0000000000..354d78c29a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_5_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_6.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_6.png
new file mode 100644
index 0000000000..570b2092f7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_6_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_6_OVERLAY.png
new file mode 100644
index 0000000000..46751c3211
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_6_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_7.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_7.png
new file mode 100644
index 0000000000..2743fe0894
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_7_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_7_OVERLAY.png
new file mode 100644
index 0000000000..d1e8ca7634
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_7_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_8.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_8.png
new file mode 100644
index 0000000000..9e296e8e7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_8_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_8_OVERLAY.png
new file mode 100644
index 0000000000..311ab1681b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/DURABILITY_BAR_8_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_0.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_0.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_0.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_0_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_0_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_0_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_1.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_1.png
new file mode 100644
index 0000000000..b666480476
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_1.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_1_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_1_OVERLAY.png
new file mode 100644
index 0000000000..b666480476
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_1_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_2.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_2.png
new file mode 100644
index 0000000000..7cda39aa6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_2.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_2_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_2_OVERLAY.png
new file mode 100644
index 0000000000..7cda39aa6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_2_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_3.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_3.png
new file mode 100644
index 0000000000..61a3554744
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_3.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_3_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_3_OVERLAY.png
new file mode 100644
index 0000000000..61a3554744
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_3_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_4.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_4.png
new file mode 100644
index 0000000000..92e014b113
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_4.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_4_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_4_OVERLAY.png
new file mode 100644
index 0000000000..92e014b113
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_4_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_5.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_5.png
new file mode 100644
index 0000000000..7c343b6eed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_5.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_5_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_5_OVERLAY.png
new file mode 100644
index 0000000000..7c343b6eed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_5_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_6.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_6.png
new file mode 100644
index 0000000000..3ca823290d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_6.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_6_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_6_OVERLAY.png
new file mode 100644
index 0000000000..3ca823290d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_6_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_7.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_7.png
new file mode 100644
index 0000000000..0ab403626d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_7.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_7_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_7_OVERLAY.png
new file mode 100644
index 0000000000..0ab403626d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_7_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_8.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_8.png
new file mode 100644
index 0000000000..8ec5af3a92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_8.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_8_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_8_OVERLAY.png
new file mode 100644
index 0000000000..8ec5af3a92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ENERGY_BAR_8_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/GRAFTER.png b/src/main/resources/assets/gregtech/textures/items/iconsets/GRAFTER.png
new file mode 100644
index 0000000000..a815e89926
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/GRAFTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/GRAFTER_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/GRAFTER_OVERLAY.png
new file mode 100644
index 0000000000..e1263f6ae2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/GRAFTER_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HALO.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HALO.png
new file mode 100644
index 0000000000..5c6f1c505a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HALO.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HALO_FUZZY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HALO_FUZZY.png
new file mode 100644
index 0000000000..ab4418124b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HALO_FUZZY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HALO_FUZZY.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/iconsets/HALO_FUZZY.png.mcmeta
new file mode 100644
index 0000000000..24f9c2fae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HALO_FUZZY.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 1
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HALO_FUZZY_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HALO_FUZZY_OVERLAY.png
new file mode 100644
index 0000000000..44a0b44446
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HALO_FUZZY_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HALO_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HALO_OVERLAY.png
new file mode 100644
index 0000000000..e40c3c58cf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HALO_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_BUZZSAW.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_BUZZSAW.png
new file mode 100644
index 0000000000..3bd249bf95
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_BUZZSAW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_BUZZSAW_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_BUZZSAW_OVERLAY.png
new file mode 100644
index 0000000000..099a407b4d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_BUZZSAW_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_ELECTRIC_SCREWDRIVER.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_ELECTRIC_SCREWDRIVER.png
new file mode 100644
index 0000000000..2c31a02b59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_ELECTRIC_SCREWDRIVER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_ELECTRIC_SCREWDRIVER_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_ELECTRIC_SCREWDRIVER_OVERLAY.png
new file mode 100644
index 0000000000..e3033547c3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_ELECTRIC_SCREWDRIVER_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_FILE.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_FILE.png
new file mode 100644
index 0000000000..eed4a90317
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_FILE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_FILE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_FILE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_FILE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SAW.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SAW.png
new file mode 100644
index 0000000000..7c8d12750a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SAW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SAW_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SAW_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SAW_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SCREWDRIVER.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SCREWDRIVER.png
new file mode 100644
index 0000000000..eed4a90317
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SCREWDRIVER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SCREWDRIVER_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SCREWDRIVER_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SCREWDRIVER_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SOLDERING.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SOLDERING.png
new file mode 100644
index 0000000000..3b66136453
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SOLDERING.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SOLDERING_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SOLDERING_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SOLDERING_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SWORD.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SWORD.png
new file mode 100644
index 0000000000..769c1371f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SWORD.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SWORD_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SWORD_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/HANDLE_SWORD_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/JACKHAMMER.png b/src/main/resources/assets/gregtech/textures/items/iconsets/JACKHAMMER.png
new file mode 100644
index 0000000000..2f9db24c0b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/JACKHAMMER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/JACKHAMMER_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/JACKHAMMER_OVERLAY.png
new file mode 100644
index 0000000000..4623b1b847
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/JACKHAMMER_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/KNIFE.png b/src/main/resources/assets/gregtech/textures/items/iconsets/KNIFE.png
new file mode 100644
index 0000000000..f7b7d7f702
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/KNIFE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/KNIFE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/KNIFE_OVERLAY.png
new file mode 100644
index 0000000000..8c309a6da1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/KNIFE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/MORTAR.png b/src/main/resources/assets/gregtech/textures/items/iconsets/MORTAR.png
new file mode 100644
index 0000000000..8ae72bb8fd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/MORTAR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/MORTAR_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/MORTAR_OVERLAY.png
new file mode 100644
index 0000000000..e4cafca130
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/MORTAR_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/PLUNGER.png b/src/main/resources/assets/gregtech/textures/items/iconsets/PLUNGER.png
new file mode 100644
index 0000000000..bc42d09ebf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/PLUNGER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/PLUNGER_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/PLUNGER_OVERLAY.png
new file mode 100644
index 0000000000..80d7851dc6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/PLUNGER_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_BRANCHCUTTER.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_BRANCHCUTTER.png
new file mode 100644
index 0000000000..fac1799bfb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_BRANCHCUTTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_BRANCHCUTTER_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_BRANCHCUTTER_OVERLAY.png
new file mode 100644
index 0000000000..841753f628
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_BRANCHCUTTER_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_CLOSED.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_CLOSED.png
new file mode 100644
index 0000000000..27d1e594a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_CLOSED.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_CLOSED_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_CLOSED_OVERLAY.png
new file mode 100644
index 0000000000..841753f628
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_CLOSED_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_FILE.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_FILE.png
new file mode 100644
index 0000000000..157f967b2e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_FILE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_FILE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_FILE_OVERLAY.png
new file mode 100644
index 0000000000..841753f628
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_FILE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_KNIFE.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_KNIFE.png
new file mode 100644
index 0000000000..5f146f3179
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_KNIFE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_KNIFE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_KNIFE_OVERLAY.png
new file mode 100644
index 0000000000..841753f628
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_KNIFE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SAW.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SAW.png
new file mode 100644
index 0000000000..14677a6525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SAW.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SAW_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SAW_OVERLAY.png
new file mode 100644
index 0000000000..841753f628
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SAW_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SCREWDRIVER.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SCREWDRIVER.png
new file mode 100644
index 0000000000..916222f548
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SCREWDRIVER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SCREWDRIVER_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SCREWDRIVER_OVERLAY.png
new file mode 100644
index 0000000000..841753f628
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_SCREWDRIVER_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_WIRECUTTER.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_WIRECUTTER.png
new file mode 100644
index 0000000000..e229ca4686
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_WIRECUTTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_WIRECUTTER_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_WIRECUTTER_OVERLAY.png
new file mode 100644
index 0000000000..841753f628
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POCKET_MULTITOOL_WIRECUTTER_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_HV.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_HV.png
new file mode 100644
index 0000000000..ae40cf567e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_HV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_HV_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_HV_OVERLAY.png
new file mode 100644
index 0000000000..f60fe80211
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_HV_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_LV.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_LV.png
new file mode 100644
index 0000000000..ae40cf567e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_LV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_LV_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_LV_OVERLAY.png
new file mode 100644
index 0000000000..89d89c55f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_LV_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_MV.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_MV.png
new file mode 100644
index 0000000000..ae40cf567e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_MV.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_MV_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_MV_OVERLAY.png
new file mode 100644
index 0000000000..e93e0d8229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/POWER_UNIT_MV_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/RENDERING_ERROR.png b/src/main/resources/assets/gregtech/textures/items/iconsets/RENDERING_ERROR.png
new file mode 100644
index 0000000000..a5fd40679c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/RENDERING_ERROR.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/RENDERING_ERROR_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/RENDERING_ERROR_OVERLAY.png
new file mode 100644
index 0000000000..a5fd40679c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/RENDERING_ERROR_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ROLLING_PIN.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ROLLING_PIN.png
new file mode 100644
index 0000000000..6035df5d46
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ROLLING_PIN.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/ROLLING_PIN_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/ROLLING_PIN_OVERLAY.png
new file mode 100644
index 0000000000..d35d816cc5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/ROLLING_PIN_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/SCOOP.png b/src/main/resources/assets/gregtech/textures/items/iconsets/SCOOP.png
new file mode 100644
index 0000000000..d8c6d98902
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/SCOOP.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/SCOOP_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/SCOOP_OVERLAY.png
new file mode 100644
index 0000000000..b32a272c47
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/SCOOP_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/SICKLE.png b/src/main/resources/assets/gregtech/textures/items/iconsets/SICKLE.png
new file mode 100644
index 0000000000..7368029bdc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/SICKLE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/SICKLE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/SICKLE_OVERLAY.png
new file mode 100644
index 0000000000..489cf5a6ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/SICKLE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE.png b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE.png
new file mode 100644
index 0000000000..38aac7c03f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_HUGE.png b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_HUGE.png
new file mode 100644
index 0000000000..38aac7c03f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_HUGE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_HUGE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_HUGE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_HUGE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_LARGE.png b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_LARGE.png
new file mode 100644
index 0000000000..38aac7c03f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_LARGE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_LARGE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_LARGE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_LARGE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_SMALL.png b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_SMALL.png
new file mode 100644
index 0000000000..38aac7c03f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_SMALL.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_SMALL_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_SMALL_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/TURBINE_SMALL_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/VOID.png b/src/main/resources/assets/gregtech/textures/items/iconsets/VOID.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/VOID.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/VOID_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/VOID_OVERLAY.png
new file mode 100644
index 0000000000..a2fcfb9a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/VOID_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/WIRE_CUTTER.png b/src/main/resources/assets/gregtech/textures/items/iconsets/WIRE_CUTTER.png
new file mode 100644
index 0000000000..20ce5cb7b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/WIRE_CUTTER.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/WIRE_CUTTER_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/WIRE_CUTTER_OVERLAY.png
new file mode 100644
index 0000000000..9ef80a48cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/WIRE_CUTTER_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/WRENCH.png b/src/main/resources/assets/gregtech/textures/items/iconsets/WRENCH.png
new file mode 100644
index 0000000000..4c74bb1ab7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/WRENCH.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/iconsets/WRENCH_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/iconsets/WRENCH_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/iconsets/WRENCH_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/aluminium_inner.png b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/aluminium_inner.png
new file mode 100644
index 0000000000..d9b983e2e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/aluminium_inner.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/chromium_inner.png b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/chromium_inner.png
new file mode 100644
index 0000000000..873c9020e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/chromium_inner.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/iridium_inner.png b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/iridium_inner.png
new file mode 100644
index 0000000000..e1bfbc666e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/iridium_inner.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/neutronium_inner.png b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/neutronium_inner.png
new file mode 100644
index 0000000000..8f25c15564
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/neutronium_inner.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/osmium_inner.png b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/osmium_inner.png
new file mode 100644
index 0000000000..1f31873f55
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/osmium_inner.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/stainlesssteel_inner.png b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/stainlesssteel_inner.png
new file mode 100644
index 0000000000..f27d565dbd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/stainlesssteel_inner.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/steel_inner.png b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/steel_inner.png
new file mode 100644
index 0000000000..f8e57e645e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/steel_inner.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/titanium_inner.png b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/titanium_inner.png
new file mode 100644
index 0000000000..e8c99dcf24
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/titanium_inner.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/tungstensteel_inner.png b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/tungstensteel_inner.png
new file mode 100644
index 0000000000..772bc59dce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/large_fluid_cell_custom/tungstensteel_inner.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/TURBINE_BLADE.png
new file mode 100644
index 0000000000..dd94e7567b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtPlastic.png
new file mode 100644
index 0000000000..fd5b6ebc88
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtWood.png
new file mode 100644
index 0000000000..fd5b6ebc88
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/bolt.png
new file mode 100644
index 0000000000..622a45dc42
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/casingSmall.png
new file mode 100644
index 0000000000..5d4d83ce90
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cell.png
new file mode 100644
index 0000000000..162b2b4d21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cellPlasma.png
new file mode 100644
index 0000000000..162b2b4d21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtDust.png
new file mode 100644
index 0000000000..1ae0341936
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtGem.png
new file mode 100644
index 0000000000..2dc9cd986a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtIngot.png
new file mode 100644
index 0000000000..ebb1929806
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtPlate.png
new file mode 100644
index 0000000000..e025d49cd6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushed.png
new file mode 100644
index 0000000000..ba2a057b3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedCentrifuged.png
new file mode 100644
index 0000000000..2d0b730045
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedPurified.png
new file mode 100644
index 0000000000..91f856bb10
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dust.png
new file mode 100644
index 0000000000..9eae26d83b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustImpure.png
new file mode 100644
index 0000000000..9eae26d83b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..9b4cc83142
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustPure.png
new file mode 100644
index 0000000000..9eae26d83b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..0a13a54032
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustSmall.png
new file mode 100644
index 0000000000..074c3cfc08
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustTiny.png
new file mode 100644
index 0000000000..5e9248ff56
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/foil.png
new file mode 100644
index 0000000000..16cb81911e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGt.png
new file mode 100644
index 0000000000..32b4db205d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGtSmall.png
new file mode 100644
index 0000000000..d01b493a79
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gem.png
new file mode 100644
index 0000000000..68b3a6d98d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemChipped.png
new file mode 100644
index 0000000000..f9bc298fd2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemExquisite.png
new file mode 100644
index 0000000000..ffa92c1f60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawed.png
new file mode 100644
index 0000000000..e909f3202a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawless.png
new file mode 100644
index 0000000000..2a98def1c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/handleMallet.png
new file mode 100644
index 0000000000..564400a35b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingot.png
new file mode 100644
index 0000000000..9b0f0e5566
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotDouble.png
new file mode 100644
index 0000000000..54eed335d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotHot.png
new file mode 100644
index 0000000000..092a969974
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuadruple.png
new file mode 100644
index 0000000000..d75ec6f805
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuintuple.png
new file mode 100644
index 0000000000..332ba4ebeb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotTriple.png
new file mode 100644
index 0000000000..2a2c963808
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/lens.png
new file mode 100644
index 0000000000..8af9488471
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/nugget.png
new file mode 100644
index 0000000000..813a3fdc45
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plate.png
new file mode 100644
index 0000000000..888c60ab68
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDense.png
new file mode 100644
index 0000000000..da070ab0bc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDouble.png
new file mode 100644
index 0000000000..67190d6ee1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuadruple.png
new file mode 100644
index 0000000000..ded09c9209
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuintuple.png
new file mode 100644
index 0000000000..b3c1ed4722
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateTriple.png
new file mode 100644
index 0000000000..dd264b1b92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ring.png
new file mode 100644
index 0000000000..306e150b58
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/rotor.png
new file mode 100644
index 0000000000..2d8b87f467
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/round.png
new file mode 100644
index 0000000000..73fafc80f7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/screw.png
new file mode 100644
index 0000000000..921ffe7a1e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/spring.png
new file mode 100644
index 0000000000..3d449ad10c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/springSmall.png
new file mode 100644
index 0000000000..305fba8ddf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stick.png
new file mode 100644
index 0000000000..3c87ba01ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stickLong.png
new file mode 100644
index 0000000000..fe24949421
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadArrow.png
new file mode 100644
index 0000000000..0d9102e026
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadAxe.png
new file mode 100644
index 0000000000..e7bf48552f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..1992749015
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadChainsaw.png
new file mode 100644
index 0000000000..76ebc5c8f7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadDrill.png
new file mode 100644
index 0000000000..d67ad36e49
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadFile.png
new file mode 100644
index 0000000000..aa67d70807
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHammer.png
new file mode 100644
index 0000000000..8413d17401
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHoe.png
new file mode 100644
index 0000000000..b3a82f60e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadMallet.png
new file mode 100644
index 0000000000..2712766882
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPickaxe.png
new file mode 100644
index 0000000000..2a3e7d44af
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPlow.png
new file mode 100644
index 0000000000..fd0c6e5c24
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSaw.png
new file mode 100644
index 0000000000..bfc1c29137
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a7aadc6ff4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSense.png
new file mode 100644
index 0000000000..4f3e736d4e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadShovel.png
new file mode 100644
index 0000000000..5373a7272f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSoldering.png
new file mode 100644
index 0000000000..7111f4251d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSword.png
new file mode 100644
index 0000000000..29bdd7aa89
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..32237e6011
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadWrench.png
new file mode 100644
index 0000000000..e6dc254bde
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/turbineBlade.png
new file mode 100644
index 0000000000..dd94e7567b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/void.png
new file mode 100644
index 0000000000..fb52fef49f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/wireFine.png
new file mode 100644
index 0000000000..b2a0dc4790
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Botania-Dragonstone/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/TURBINE_BLADE.png
new file mode 100644
index 0000000000..bafb2f4464
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtPlastic.png
new file mode 100644
index 0000000000..a0727f25c8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtWood.png
new file mode 100644
index 0000000000..a0727f25c8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/bolt.png
new file mode 100644
index 0000000000..3a8108a64d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/casingSmall.png
new file mode 100644
index 0000000000..441732ff39
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cell.png
new file mode 100644
index 0000000000..063607d16d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cellPlasma.png
new file mode 100644
index 0000000000..063607d16d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtDust.png
new file mode 100644
index 0000000000..6c6df47351
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtGem.png
new file mode 100644
index 0000000000..4b98ead98f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtIngot.png
new file mode 100644
index 0000000000..f0e35b32eb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtPlate.png
new file mode 100644
index 0000000000..81c5264ada
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushed.png
new file mode 100644
index 0000000000..a6e61954a1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedCentrifuged.png
new file mode 100644
index 0000000000..4584894760
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedPurified.png
new file mode 100644
index 0000000000..43ec3d972d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dust.png
new file mode 100644
index 0000000000..bc14217080
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustImpure.png
new file mode 100644
index 0000000000..bc14217080
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..9b4cc83142
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustPure.png
new file mode 100644
index 0000000000..bc14217080
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..0a13a54032
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustSmall.png
new file mode 100644
index 0000000000..e0cb2d9f4a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustTiny.png
new file mode 100644
index 0000000000..a37ca7e7c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/foil.png
new file mode 100644
index 0000000000..7f709b2795
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGt.png
new file mode 100644
index 0000000000..145b31ce38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGtSmall.png
new file mode 100644
index 0000000000..7b128d9ac8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gem.png
new file mode 100644
index 0000000000..7281347e7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemChipped.png
new file mode 100644
index 0000000000..2ad48e471d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemExquisite.png
new file mode 100644
index 0000000000..b965ffaf56
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawed.png
new file mode 100644
index 0000000000..d13b179e1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawless.png
new file mode 100644
index 0000000000..0e333a3e7a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/handleMallet.png
new file mode 100644
index 0000000000..0c89b3bb63
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingot.png
new file mode 100644
index 0000000000..6455e7efa8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotDouble.png
new file mode 100644
index 0000000000..1c87f080c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotHot.png
new file mode 100644
index 0000000000..61e4581adf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuadruple.png
new file mode 100644
index 0000000000..565311b7cf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuintuple.png
new file mode 100644
index 0000000000..64b22d586e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotTriple.png
new file mode 100644
index 0000000000..2b79de5fcb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/lens.png
new file mode 100644
index 0000000000..a466522523
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/nugget.png
new file mode 100644
index 0000000000..4bcbcc7b92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plate.png
new file mode 100644
index 0000000000..b891363804
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDense.png
new file mode 100644
index 0000000000..5ac880c38a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDouble.png
new file mode 100644
index 0000000000..da64aa1895
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuadruple.png
new file mode 100644
index 0000000000..f8e67f5972
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuintuple.png
new file mode 100644
index 0000000000..071302c1dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateTriple.png
new file mode 100644
index 0000000000..7340e3df13
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ring.png
new file mode 100644
index 0000000000..608aa2bd90
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/rotor.png
new file mode 100644
index 0000000000..9655e24cd7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/round.png
new file mode 100644
index 0000000000..7786ec3b03
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/screw.png
new file mode 100644
index 0000000000..e5fbcc6fa0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/spring.png
new file mode 100644
index 0000000000..0a78904357
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/springSmall.png
new file mode 100644
index 0000000000..611b24fdf7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stick.png
new file mode 100644
index 0000000000..fd7ae09c21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stickLong.png
new file mode 100644
index 0000000000..943deda25d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadArrow.png
new file mode 100644
index 0000000000..2efd1fca26
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadAxe.png
new file mode 100644
index 0000000000..2dfa84e661
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..0c8086bf2f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadChainsaw.png
new file mode 100644
index 0000000000..7b8f7f2cf3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadDrill.png
new file mode 100644
index 0000000000..6aee04e3fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadFile.png
new file mode 100644
index 0000000000..855bab7bfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHammer.png
new file mode 100644
index 0000000000..0b7de15499
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHoe.png
new file mode 100644
index 0000000000..19611b4173
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadMallet.png
new file mode 100644
index 0000000000..c3df9c4a06
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPickaxe.png
new file mode 100644
index 0000000000..4f62a73894
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPlow.png
new file mode 100644
index 0000000000..71003c3813
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSaw.png
new file mode 100644
index 0000000000..e40e704e8f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..6d6a4c0221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSense.png
new file mode 100644
index 0000000000..251a44e6a1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadShovel.png
new file mode 100644
index 0000000000..e97b4f7c6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSoldering.png
new file mode 100644
index 0000000000..16c59a7cab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSword.png
new file mode 100644
index 0000000000..5a44fbe97a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..60c58acdbd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadWrench.png
new file mode 100644
index 0000000000..301f7c71b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/turbineBlade.png
new file mode 100644
index 0000000000..bafb2f4464
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/void.png
new file mode 100644
index 0000000000..d2fec55159
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/wireFine.png
new file mode 100644
index 0000000000..8448ab4711
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Dreamwood/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/TURBINE_BLADE.png
new file mode 100644
index 0000000000..e5a6d6d578
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtPlastic.png
new file mode 100644
index 0000000000..2102ceec6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtWood.png
new file mode 100644
index 0000000000..2102ceec6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/bolt.png
new file mode 100644
index 0000000000..bbfdedeba9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/casingSmall.png
new file mode 100644
index 0000000000..9127c2ee1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cell.png
new file mode 100644
index 0000000000..d3c8065a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cellPlasma.png
new file mode 100644
index 0000000000..d3c8065a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtDust.png
new file mode 100644
index 0000000000..8215e6af09
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtGem.png
new file mode 100644
index 0000000000..4d7cfbc1ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtIngot.png
new file mode 100644
index 0000000000..7a3a90e551
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtPlate.png
new file mode 100644
index 0000000000..4be5498d92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushed.png
new file mode 100644
index 0000000000..6a5f9e0cca
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedCentrifuged.png
new file mode 100644
index 0000000000..956fc0035d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedPurified.png
new file mode 100644
index 0000000000..ecc4203987
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dust.png
new file mode 100644
index 0000000000..1f9b12edcf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustImpure.png
new file mode 100644
index 0000000000..1f9b12edcf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..9b4cc83142
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustPure.png
new file mode 100644
index 0000000000..1f9b12edcf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..0a13a54032
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustSmall.png
new file mode 100644
index 0000000000..3ed48f5255
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustTiny.png
new file mode 100644
index 0000000000..587cb9e13c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/foil.png
new file mode 100644
index 0000000000..cd0b135f79
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGt.png
new file mode 100644
index 0000000000..17311a8a6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGtSmall.png
new file mode 100644
index 0000000000..eafe2e3484
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gem.png
new file mode 100644
index 0000000000..457bdd61f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemChipped.png
new file mode 100644
index 0000000000..eae4faec76
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemExquisite.png
new file mode 100644
index 0000000000..ea5b76b7ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawed.png
new file mode 100644
index 0000000000..d6ce7ef99a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawless.png
new file mode 100644
index 0000000000..3d352e1be0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/handleMallet.png
new file mode 100644
index 0000000000..2e70fa339d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingot.png
new file mode 100644
index 0000000000..317381c3bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotDouble.png
new file mode 100644
index 0000000000..038facfc4d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotHot.png
new file mode 100644
index 0000000000..4665e93905
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuadruple.png
new file mode 100644
index 0000000000..7aeaf258c3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuintuple.png
new file mode 100644
index 0000000000..c09f4df763
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotTriple.png
new file mode 100644
index 0000000000..0e768c27ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/lens.png
new file mode 100644
index 0000000000..7ba408da9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/nugget.png
new file mode 100644
index 0000000000..e17e8e14c5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plate.png
new file mode 100644
index 0000000000..215e983dcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDense.png
new file mode 100644
index 0000000000..65b8c301b8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDouble.png
new file mode 100644
index 0000000000..f8b2aedbb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuadruple.png
new file mode 100644
index 0000000000..b3ba31acda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuintuple.png
new file mode 100644
index 0000000000..a3fb16e2ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateTriple.png
new file mode 100644
index 0000000000..a6a0dddfe7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ring.png
new file mode 100644
index 0000000000..dfd12505cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/rotor.png
new file mode 100644
index 0000000000..c8ea6a6cd7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/round.png
new file mode 100644
index 0000000000..e2053263d5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/screw.png
new file mode 100644
index 0000000000..8e29be91b0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/spring.png
new file mode 100644
index 0000000000..3f868d27c4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/springSmall.png
new file mode 100644
index 0000000000..08ccf38267
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stick.png
new file mode 100644
index 0000000000..e8aa5e2122
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stickLong.png
new file mode 100644
index 0000000000..73ecaa91e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadArrow.png
new file mode 100644
index 0000000000..5a73cd8c2c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadAxe.png
new file mode 100644
index 0000000000..944f6b600e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..744ed52416
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadChainsaw.png
new file mode 100644
index 0000000000..42ff2aea65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadDrill.png
new file mode 100644
index 0000000000..03a625ba51
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadFile.png
new file mode 100644
index 0000000000..37f2478a21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHammer.png
new file mode 100644
index 0000000000..973d5c1e82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHoe.png
new file mode 100644
index 0000000000..1bcf82e632
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadMallet.png
new file mode 100644
index 0000000000..9ae08c6a0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPickaxe.png
new file mode 100644
index 0000000000..027c8f085a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPlow.png
new file mode 100644
index 0000000000..639e92ceb6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSaw.png
new file mode 100644
index 0000000000..19d5b199de
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..377e34f188
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSense.png
new file mode 100644
index 0000000000..4852949b2d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadShovel.png
new file mode 100644
index 0000000000..a129d79e5e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSoldering.png
new file mode 100644
index 0000000000..93d7471abe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSword.png
new file mode 100644
index 0000000000..419df82f32
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..869ce72088
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadWrench.png
new file mode 100644
index 0000000000..895bff48f7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/turbineBlade.png
new file mode 100644
index 0000000000..e5a6d6d578
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/void.png
new file mode 100644
index 0000000000..1397ecc4e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/wireFine.png
new file mode 100644
index 0000000000..9379e18e0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingrock/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/TURBINE_BLADE.png
new file mode 100644
index 0000000000..4368a7cd4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtPlastic.png
new file mode 100644
index 0000000000..29781f337a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtWood.png
new file mode 100644
index 0000000000..29781f337a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/bolt.png
new file mode 100644
index 0000000000..8bc1fd8276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/casingSmall.png
new file mode 100644
index 0000000000..116905a1ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cell.png
new file mode 100644
index 0000000000..756a2400bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cellPlasma.png
new file mode 100644
index 0000000000..756a2400bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtDust.png
new file mode 100644
index 0000000000..7f90b32638
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtGem.png
new file mode 100644
index 0000000000..102c0b23b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtIngot.png
new file mode 100644
index 0000000000..0afc6a0e6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtPlate.png
new file mode 100644
index 0000000000..3d4f0a7254
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushed.png
new file mode 100644
index 0000000000..9fe171bd3a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedCentrifuged.png
new file mode 100644
index 0000000000..72cc240a92
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedPurified.png
new file mode 100644
index 0000000000..79ead0cee7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dust.png
new file mode 100644
index 0000000000..44b352a3c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustImpure.png
new file mode 100644
index 0000000000..44b352a3c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..9b4cc83142
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustPure.png
new file mode 100644
index 0000000000..44b352a3c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..0a13a54032
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustSmall.png
new file mode 100644
index 0000000000..15404f70f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustTiny.png
new file mode 100644
index 0000000000..dc83b7f368
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/foil.png
new file mode 100644
index 0000000000..a2795eca7e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGt.png
new file mode 100644
index 0000000000..20fadcf94f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGtSmall.png
new file mode 100644
index 0000000000..e9b6c777bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gem.png
new file mode 100644
index 0000000000..479a7f6682
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemChipped.png
new file mode 100644
index 0000000000..d19512f730
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemExquisite.png
new file mode 100644
index 0000000000..5fa00b6bb6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawed.png
new file mode 100644
index 0000000000..1880b7328f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawless.png
new file mode 100644
index 0000000000..77e31f0dc3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/handleMallet.png
new file mode 100644
index 0000000000..fa390c1272
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingot.png
new file mode 100644
index 0000000000..9b3eb8a997
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotDouble.png
new file mode 100644
index 0000000000..c021697de4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotHot.png
new file mode 100644
index 0000000000..cf3f22c201
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuadruple.png
new file mode 100644
index 0000000000..8865513d4a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuintuple.png
new file mode 100644
index 0000000000..da6028ed86
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotTriple.png
new file mode 100644
index 0000000000..fa16011087
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/lens.png
new file mode 100644
index 0000000000..da6d8c00ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/nugget.png
new file mode 100644
index 0000000000..d0b6b23a10
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plate.png
new file mode 100644
index 0000000000..1ad7569236
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDense.png
new file mode 100644
index 0000000000..e30b914e82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDouble.png
new file mode 100644
index 0000000000..eebcddd254
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuadruple.png
new file mode 100644
index 0000000000..50e0f8b394
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuintuple.png
new file mode 100644
index 0000000000..0e00245b88
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateTriple.png
new file mode 100644
index 0000000000..508c8bb781
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ring.png
new file mode 100644
index 0000000000..3a41b6381c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/rotor.png
new file mode 100644
index 0000000000..33e1daf3cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/round.png
new file mode 100644
index 0000000000..0737189a23
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/screw.png
new file mode 100644
index 0000000000..18f9042174
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/spring.png
new file mode 100644
index 0000000000..73a669eb36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/springSmall.png
new file mode 100644
index 0000000000..881d222174
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stick.png
new file mode 100644
index 0000000000..dd2957265b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stickLong.png
new file mode 100644
index 0000000000..91d743bce6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadArrow.png
new file mode 100644
index 0000000000..3b07628377
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadAxe.png
new file mode 100644
index 0000000000..bd59f79b01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..0d6294fcd1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadChainsaw.png
new file mode 100644
index 0000000000..5ac5d1795d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadDrill.png
new file mode 100644
index 0000000000..2dad837f12
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadFile.png
new file mode 100644
index 0000000000..68bd0c8f17
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHammer.png
new file mode 100644
index 0000000000..d48ab01dd9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHoe.png
new file mode 100644
index 0000000000..4f9da3db15
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadMallet.png
new file mode 100644
index 0000000000..0815145122
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPickaxe.png
new file mode 100644
index 0000000000..00cbcaec9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPlow.png
new file mode 100644
index 0000000000..85ae6fc3aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSaw.png
new file mode 100644
index 0000000000..7fda82429f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..44714a5336
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSense.png
new file mode 100644
index 0000000000..0a7c0c057a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadShovel.png
new file mode 100644
index 0000000000..54c11b1c6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSoldering.png
new file mode 100644
index 0000000000..f485a5f9c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSword.png
new file mode 100644
index 0000000000..b7ddd83da6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..092963017b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadWrench.png
new file mode 100644
index 0000000000..bb7c4526e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/turbineBlade.png
new file mode 100644
index 0000000000..4368a7cd4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/void.png
new file mode 100644
index 0000000000..d2fec55159
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/wireFine.png
new file mode 100644
index 0000000000..2ea8731726
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/Livingwood/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/TURBINE_BLADE.png
new file mode 100644
index 0000000000..d4eace9cc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/TURBINE_BLADE.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/TURBINE_BLADE.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/TURBINE_BLADE.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..334e9e9c3b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtPlastic.png
new file mode 100644
index 0000000000..d64a533c32
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtPlastic.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtPlastic.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtPlastic.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..8ee67996ba
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtWood.png
new file mode 100644
index 0000000000..d64a533c32
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtWood.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtWood.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtWood.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..8493e935b1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/bolt.png
new file mode 100644
index 0000000000..9298fa6ef6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/bolt.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/bolt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/bolt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/bolt_OVERLAY.png
new file mode 100644
index 0000000000..33336d7ff8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/casingSmall.png
new file mode 100644
index 0000000000..b2bea4d456
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/casingSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/casingSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/casingSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..201a76fae2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cell.png
new file mode 100644
index 0000000000..b06c4ccf9c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cell.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cell.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cell.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cellPlasma.png
new file mode 100644
index 0000000000..b06c4ccf9c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cellPlasma.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cellPlasma.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cellPlasma.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtDust.png
new file mode 100644
index 0000000000..864025df0b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtDust.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtDust.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtDust.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtGem.png
new file mode 100644
index 0000000000..db1f80510d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtGem.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtGem.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtGem.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtIngot.png
new file mode 100644
index 0000000000..ffa6a8e2cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtIngot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtIngot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtIngot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtPlate.png
new file mode 100644
index 0000000000..fef961241b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtPlate.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtPlate.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtPlate.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushed.png
new file mode 100644
index 0000000000..812693e7a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushed.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushed.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushed.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedCentrifuged.png
new file mode 100644
index 0000000000..14bfdd0ccf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedCentrifuged.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedCentrifuged.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedCentrifuged.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..f24712d4ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedPurified.png
new file mode 100644
index 0000000000..2225abd549
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedPurified.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedPurified.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedPurified.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..dacde9b1d3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushed_OVERLAY.png
new file mode 100644
index 0000000000..72a772a1df
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dust.png
new file mode 100644
index 0000000000..441701ae3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dust.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dust.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dust.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustImpure.png
new file mode 100644
index 0000000000..441701ae3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustImpure.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustImpure.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustImpure.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..685f631b24
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustPure.png
new file mode 100644
index 0000000000..441701ae3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustPure.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustPure.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustPure.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..17fc558398
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustSmall.png
new file mode 100644
index 0000000000..87621bd3c8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..e10314f689
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustTiny.png
new file mode 100644
index 0000000000..ecd6c9baf1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustTiny.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustTiny.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustTiny.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..afd6c33b9c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dust_OVERLAY.png
new file mode 100644
index 0000000000..d65d957de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/foil.png
new file mode 100644
index 0000000000..877c61c080
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/foil.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/foil_OVERLAY.png
new file mode 100644
index 0000000000..1055c9a0cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGt.png
new file mode 100644
index 0000000000..d67bb0fa53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGtSmall.png
new file mode 100644
index 0000000000..00a520b5f8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGtSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGtSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGtSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..c06e5c678f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..0e7b852629
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gem.png
new file mode 100644
index 0000000000..a897f06620
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gem.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gem.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gem.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemChipped.png
new file mode 100644
index 0000000000..6ede4d04c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemChipped.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemChipped.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemChipped.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..441b851dd6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemExquisite.png
new file mode 100644
index 0000000000..421ba48449
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemExquisite.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemExquisite.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemExquisite.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..0487f7c85f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawed.png
new file mode 100644
index 0000000000..3e17b64954
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawed.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawed.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawed.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..9797b87361
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawless.png
new file mode 100644
index 0000000000..44b33ec3ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawless.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawless.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawless.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..b7cba533c2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gem_OVERLAY.png
new file mode 100644
index 0000000000..f1c7ca8796
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/handleMallet.png
new file mode 100644
index 0000000000..2be3d5d8bc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/handleMallet.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/handleMallet.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/handleMallet.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingot.png
new file mode 100644
index 0000000000..05c61cbe1d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotDouble.png
new file mode 100644
index 0000000000..c71bd2ef98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotDouble.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotDouble.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotDouble.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..b261be40b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotHot.png
new file mode 100644
index 0000000000..f680ae0cc5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotHot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotHot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotHot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuadruple.png
new file mode 100644
index 0000000000..eea5cd6053
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..437a40a837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuintuple.png
new file mode 100644
index 0000000000..a600041d75
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuintuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuintuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuintuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..c33f419421
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotTriple.png
new file mode 100644
index 0000000000..e24cee506d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotTriple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotTriple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotTriple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..1696ab186c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingot_OVERLAY.png
new file mode 100644
index 0000000000..e039852365
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/lens.png
new file mode 100644
index 0000000000..34908e0db1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/lens.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/lens.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/lens.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/lens_OVERLAY.png
new file mode 100644
index 0000000000..e568dc4846
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/nugget.png
new file mode 100644
index 0000000000..59c5af6961
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/nugget.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/nugget.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/nugget.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/nugget_OVERLAY.png
new file mode 100644
index 0000000000..eb19d41c8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plate.png
new file mode 100644
index 0000000000..8d5c8bb173
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plate.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plate.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plate.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDense.png
new file mode 100644
index 0000000000..1677436da9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDense.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDense.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDense.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..af610c117f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDouble.png
new file mode 100644
index 0000000000..8d842e078d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDouble.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDouble.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDouble.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..436dfbb2c8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuadruple.png
new file mode 100644
index 0000000000..1203b56c4d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..e5d3dea46a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuintuple.png
new file mode 100644
index 0000000000..eb66dd8c11
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuintuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuintuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuintuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..097b497019
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateTriple.png
new file mode 100644
index 0000000000..256962f8fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateTriple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateTriple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateTriple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..c06cd9c67a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plate_OVERLAY.png
new file mode 100644
index 0000000000..53b51b4923
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ring.png
new file mode 100644
index 0000000000..7cd514f200
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ring.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ring.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ring.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ring_OVERLAY.png
new file mode 100644
index 0000000000..23ac798e28
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/rotor.png
new file mode 100644
index 0000000000..d1e2323a48
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/rotor.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/rotor.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/rotor.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/rotor_OVERLAY.png
new file mode 100644
index 0000000000..d1df73fcf6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/round.png
new file mode 100644
index 0000000000..ee0a63824f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/round.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/round.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/round.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/round_OVERLAY.png
new file mode 100644
index 0000000000..6c59511779
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/screw.png
new file mode 100644
index 0000000000..1c4ae455ec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/screw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/screw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/screw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/screw_OVERLAY.png
new file mode 100644
index 0000000000..2ccc4a5516
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/spring.png
new file mode 100644
index 0000000000..214c1dcb9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/spring.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/spring.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/spring.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/springSmall.png
new file mode 100644
index 0000000000..5084a011c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/springSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/springSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/springSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..c22fa266a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/spring_OVERLAY.png
new file mode 100644
index 0000000000..dfa7ffe2ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stick.png
new file mode 100644
index 0000000000..c38005500d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stick.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stick.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stick.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stickLong.png
new file mode 100644
index 0000000000..fe8a5ff0c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stickLong.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stickLong.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stickLong.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..70b11cbae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stick_OVERLAY.png
new file mode 100644
index 0000000000..6b395c5cb5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadArrow.png
new file mode 100644
index 0000000000..ed33f6cfd4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadArrow.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadArrow.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadArrow.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..4922562925
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadAxe.png
new file mode 100644
index 0000000000..eaa10689b1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadAxe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadAxe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadAxe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..f4ee73d1a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..764fd644ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadBuzzSaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadBuzzSaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadBuzzSaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..a85abbbe8a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadChainsaw.png
new file mode 100644
index 0000000000..b095604597
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadChainsaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadChainsaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadChainsaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..68d4011bbe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadDrill.png
new file mode 100644
index 0000000000..e36381ada1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadDrill.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadDrill.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadDrill.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..e54d6a511c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadFile.png
new file mode 100644
index 0000000000..6a5cdd2487
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadFile.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadFile.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadFile.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..851011904e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHammer.png
new file mode 100644
index 0000000000..8dd9b1c992
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHammer.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHammer.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHammer.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..0d556fcacf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHoe.png
new file mode 100644
index 0000000000..d6c4b4ef09
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHoe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHoe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHoe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..a36852539f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadMallet.png
new file mode 100644
index 0000000000..a6c3385822
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadMallet.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadMallet.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadMallet.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..a91eb1e9b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPickaxe.png
new file mode 100644
index 0000000000..8b18f1d93e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPickaxe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPickaxe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPickaxe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..a601d3ba05
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPlow.png
new file mode 100644
index 0000000000..e4d5f4adb8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPlow.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPlow.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPlow.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..18498d103c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSaw.png
new file mode 100644
index 0000000000..7998b41128
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..20bb4a11e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..2a28cabc34
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadScrewdriver.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadScrewdriver.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadScrewdriver.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..4a65b59401
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSense.png
new file mode 100644
index 0000000000..7cebcc3e37
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSense.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSense.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSense.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..7034f6e3a7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadShovel.png
new file mode 100644
index 0000000000..00320bb449
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadShovel.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadShovel.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadShovel.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..dbc1b408db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSoldering.png
new file mode 100644
index 0000000000..0015b24a93
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSoldering.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSoldering.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSoldering.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..e6e89b1f86
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSword.png
new file mode 100644
index 0000000000..61d44d61f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSword.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSword.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSword.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..b453fd25f7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..d7552ff809
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadUniversalSpade.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadUniversalSpade.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadUniversalSpade.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..5bbc1ab9c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadWrench.png
new file mode 100644
index 0000000000..cb3b1f879b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadWrench.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadWrench.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadWrench.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..0b6171999e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/turbineBlade.png
new file mode 100644
index 0000000000..d4eace9cc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/turbineBlade.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/turbineBlade.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/turbineBlade.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..997e2dfc53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/void.png
new file mode 100644
index 0000000000..0360f7046b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/void.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/wireFine.png
new file mode 100644
index 0000000000..0f09533695
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/wireFine.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/wireFine.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/wireFine.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..c7cd12641e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/MagnetohydrodynamicallyConstrainedStarMatter/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/TURBINE_BLADE.png
new file mode 100644
index 0000000000..ea71724c14
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtPlastic.png
new file mode 100644
index 0000000000..622290126c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtWood.png
new file mode 100644
index 0000000000..16c230bf99
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/bolt.png
new file mode 100644
index 0000000000..068a3909b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/casingSmall.png
new file mode 100644
index 0000000000..e15e68fb35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cell.png
new file mode 100644
index 0000000000..4161e0bc48
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cellPlasma.png
new file mode 100644
index 0000000000..a91b618039
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtDust.png
new file mode 100644
index 0000000000..2e011d7fa4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtGem.png
new file mode 100644
index 0000000000..e41c504784
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtIngot.png
new file mode 100644
index 0000000000..7a009b5a12
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtPlate.png
new file mode 100644
index 0000000000..99aeefecd1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushed.png
new file mode 100644
index 0000000000..938c43c4d6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedCentrifuged.png
new file mode 100644
index 0000000000..0b86e967a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedPurified.png
new file mode 100644
index 0000000000..68db0e2300
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dust.png
new file mode 100644
index 0000000000..37f137a517
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustImpure.png
new file mode 100644
index 0000000000..c01495ce0b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..e1ef9cb02d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustPure.png
new file mode 100644
index 0000000000..88375c5f20
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..49bf00f3fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustSmall.png
new file mode 100644
index 0000000000..c20abf89f3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustTiny.png
new file mode 100644
index 0000000000..75bdc65724
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/foil.png
new file mode 100644
index 0000000000..6444d0763e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGt.png
new file mode 100644
index 0000000000..389427c06d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGtSmall.png
new file mode 100644
index 0000000000..2eb7a210e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gem.png
new file mode 100644
index 0000000000..3bc8f35f4d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemChipped.png
new file mode 100644
index 0000000000..8a35354489
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemExquisite.png
new file mode 100644
index 0000000000..cabb8b5526
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawed.png
new file mode 100644
index 0000000000..1b97240a77
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawless.png
new file mode 100644
index 0000000000..49536d73b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/handleMallet.png
new file mode 100644
index 0000000000..7672930c19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingot.png
new file mode 100644
index 0000000000..74cc39ab0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotDouble.png
new file mode 100644
index 0000000000..eca9d7dc97
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotHot.png
new file mode 100644
index 0000000000..3c43b2f37d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuadruple.png
new file mode 100644
index 0000000000..bd0699f72f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuintuple.png
new file mode 100644
index 0000000000..b1fcfa3550
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotTriple.png
new file mode 100644
index 0000000000..ccb1a58588
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/lens.png
new file mode 100644
index 0000000000..da1dee5d11
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nanites.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nanites.png
new file mode 100644
index 0000000000..fc01fe5257
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nanites.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nanites.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nanites.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nanites.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nanites_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nanites_OVERLAY.png
new file mode 100644
index 0000000000..85ab4aed9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nanites_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nugget.png
new file mode 100644
index 0000000000..89f01216a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plate.png
new file mode 100644
index 0000000000..c398994ed4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDense.png
new file mode 100644
index 0000000000..9d5bfca56f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDouble.png
new file mode 100644
index 0000000000..89dc70e089
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuadruple.png
new file mode 100644
index 0000000000..0a21d15736
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuintuple.png
new file mode 100644
index 0000000000..c254c90bcb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateTriple.png
new file mode 100644
index 0000000000..da7d43eb09
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ring.png
new file mode 100644
index 0000000000..866148fdb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/rotor.png
new file mode 100644
index 0000000000..8cfeced24b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/round.png
new file mode 100644
index 0000000000..a5fd42a296
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/screw.png
new file mode 100644
index 0000000000..d601971352
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/spring.png
new file mode 100644
index 0000000000..5829eddf86
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/springSmall.png
new file mode 100644
index 0000000000..a10c80f263
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stick.png
new file mode 100644
index 0000000000..e0ac4e62f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stickLong.png
new file mode 100644
index 0000000000..3ad65bb7cb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadArrow.png
new file mode 100644
index 0000000000..452db40ecb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadAxe.png
new file mode 100644
index 0000000000..f7a0feeb1e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..7891f9b340
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadChainsaw.png
new file mode 100644
index 0000000000..8fc7c264ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadDrill.png
new file mode 100644
index 0000000000..14f319daa6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadFile.png
new file mode 100644
index 0000000000..286b050843
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHammer.png
new file mode 100644
index 0000000000..c7c4b49166
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHoe.png
new file mode 100644
index 0000000000..1e515bf816
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadMallet.png
new file mode 100644
index 0000000000..4b039a8fe5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPickaxe.png
new file mode 100644
index 0000000000..3eee378230
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPlow.png
new file mode 100644
index 0000000000..eeb04f2024
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSaw.png
new file mode 100644
index 0000000000..a551fde00c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..119e8a7718
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSense.png
new file mode 100644
index 0000000000..f0491b1383
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadShovel.png
new file mode 100644
index 0000000000..744cdf6f04
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSoldering.png
new file mode 100644
index 0000000000..b9ef9ce7b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSword.png
new file mode 100644
index 0000000000..53beee526a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..a5728561b9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadWrench.png
new file mode 100644
index 0000000000..2a5482d8a9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/turbineBlade.png
new file mode 100644
index 0000000000..ed739def6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/void.png
new file mode 100644
index 0000000000..c010c4f7b0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/wireFine.png
new file mode 100644
index 0000000000..453251c7aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/WhiteDwarfMatter/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/TURBINE_BLADE.png
new file mode 100644
index 0000000000..f1ad9c4950
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/TURBINE_BLADE.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/TURBINE_BLADE.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/TURBINE_BLADE.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..b8bd82f701
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtPlastic.png
new file mode 100644
index 0000000000..caf5198a15
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtPlastic.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtPlastic.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtPlastic.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtWood.png
new file mode 100644
index 0000000000..caf5198a15
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtWood.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtWood.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtWood.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/bolt.png
new file mode 100644
index 0000000000..704a8a60ee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/bolt.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/bolt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/bolt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/casingSmall.png
new file mode 100644
index 0000000000..117acac1ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/casingSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/casingSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/casingSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cell.png
new file mode 100644
index 0000000000..ca0c1a3521
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cell.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cell.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cell.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cellPlasma.png
new file mode 100644
index 0000000000..ca0c1a3521
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cellPlasma.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cellPlasma.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cellPlasma.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtDust.png
new file mode 100644
index 0000000000..bf50d3c197
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtDust.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtDust.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtDust.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtGem.png
new file mode 100644
index 0000000000..b0c438c8bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtGem.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtGem.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtGem.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtIngot.png
new file mode 100644
index 0000000000..56294697c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtIngot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtIngot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtIngot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtPlate.png
new file mode 100644
index 0000000000..3af4aae174
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtPlate.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtPlate.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtPlate.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushed.png
new file mode 100644
index 0000000000..eb3cbd7d74
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushed.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushed.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushed.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedCentrifuged.png
new file mode 100644
index 0000000000..417a105234
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedCentrifuged.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedCentrifuged.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedCentrifuged.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedPurified.png
new file mode 100644
index 0000000000..3a86f80e0b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedPurified.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedPurified.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedPurified.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dust.png
new file mode 100644
index 0000000000..6c82323b8a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dust.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dust.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dust.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustImpure.png
new file mode 100644
index 0000000000..6c82323b8a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustImpure.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustImpure.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustImpure.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..e1ef9cb02d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustPure.png
new file mode 100644
index 0000000000..6c82323b8a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustPure.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustPure.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustPure.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..49bf00f3fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustSmall.png
new file mode 100644
index 0000000000..a8de61588e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..013355cb43
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustTiny.png
new file mode 100644
index 0000000000..d5bec541cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustTiny.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustTiny.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustTiny.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3d2331e877
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dust_OVERLAY.png
new file mode 100644
index 0000000000..19ceac5630
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/foil.png
new file mode 100644
index 0000000000..f95b8134c4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/foil.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/foil_OVERLAY.png
new file mode 100644
index 0000000000..dc66f6ecd5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGt.png
new file mode 100644
index 0000000000..c97255207b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGtSmall.png
new file mode 100644
index 0000000000..c520de2cec
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGtSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGtSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGtSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..7fe7b6cb65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..a6a8f3f11a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gem.png
new file mode 100644
index 0000000000..771b00e026
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gem.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gem.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gem.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemChipped.png
new file mode 100644
index 0000000000..6832e8ae1a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemChipped.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemChipped.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemChipped.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3aab345eed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemExquisite.png
new file mode 100644
index 0000000000..3c18f39b59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemExquisite.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemExquisite.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemExquisite.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..88eb74ba6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawed.png
new file mode 100644
index 0000000000..7a98347857
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawed.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawed.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawed.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..6a250e6878
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawless.png
new file mode 100644
index 0000000000..f9dd3a29aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawless.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawless.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawless.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..ff57413839
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gem_OVERLAY.png
new file mode 100644
index 0000000000..0191093584
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/handleMallet.png
new file mode 100644
index 0000000000..5b8bab1c5a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/handleMallet.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/handleMallet.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/handleMallet.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..66d13658ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingot.png
new file mode 100644
index 0000000000..6fdc1f6621
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotDouble.png
new file mode 100644
index 0000000000..2e33486381
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotDouble.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotDouble.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotDouble.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..750c50da6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotHot.png
new file mode 100644
index 0000000000..6fdc1f6621
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotHot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotHot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotHot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuadruple.png
new file mode 100644
index 0000000000..1da80b2b26
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..52a6d53b7f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuintuple.png
new file mode 100644
index 0000000000..84b0431553
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuintuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuintuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuintuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..0243d6b999
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotTriple.png
new file mode 100644
index 0000000000..ab87a6f868
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotTriple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotTriple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotTriple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..e069b3c3da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingot_OVERLAY.png
new file mode 100644
index 0000000000..7e8c36aa6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/lens.png
new file mode 100644
index 0000000000..f9dd3a29aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/lens.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/lens.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/lens.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nanites.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nanites.png
new file mode 100644
index 0000000000..3fed6ae80b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nanites.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nanites.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nanites.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nanites.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nanites_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nanites_OVERLAY.png
new file mode 100644
index 0000000000..85ab4aed9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nanites_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nugget.png
new file mode 100644
index 0000000000..acd1363076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nugget.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nugget.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nugget.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nugget_OVERLAY.png
new file mode 100644
index 0000000000..b50fff5724
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plate.png
new file mode 100644
index 0000000000..0887cb864a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plate.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plate.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plate.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDense.png
new file mode 100644
index 0000000000..40a3f5921c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDense.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDense.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDense.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..d728803821
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDouble.png
new file mode 100644
index 0000000000..ed728f67e1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDouble.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDouble.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDouble.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..f632e3425d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuadruple.png
new file mode 100644
index 0000000000..e2417f0c24
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d0a9dc1be3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuintuple.png
new file mode 100644
index 0000000000..22a27d8aee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuintuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuintuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuintuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..acdf67c833
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateTriple.png
new file mode 100644
index 0000000000..a49dcd1d41
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateTriple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateTriple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateTriple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..13f2d98130
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plate_OVERLAY.png
new file mode 100644
index 0000000000..19b7074452
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ring.png
new file mode 100644
index 0000000000..291ba7378a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ring.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ring.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ring.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/rotor.png
new file mode 100644
index 0000000000..97d6a2fc05
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/rotor.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/rotor.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/rotor.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3c0ab7d83d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/round.png
new file mode 100644
index 0000000000..2ef2d8ac8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/round.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/round.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/round.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/round_OVERLAY.png
new file mode 100644
index 0000000000..341ba2e07f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/screw.png
new file mode 100644
index 0000000000..763846b7ee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/screw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/screw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/screw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/screw_OVERLAY.png
new file mode 100644
index 0000000000..69f2c40a75
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/spring.png
new file mode 100644
index 0000000000..b12f123575
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/spring.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/spring.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/spring.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/springSmall.png
new file mode 100644
index 0000000000..919f4dc2eb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/springSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/springSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/springSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..6530f75f27
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/spring_OVERLAY.png
new file mode 100644
index 0000000000..4760a3fc9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stick.png
new file mode 100644
index 0000000000..89113018c7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stick.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stick.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stick.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stickLong.png
new file mode 100644
index 0000000000..a01c696682
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stickLong.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stickLong.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stickLong.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..8831cfdff3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stick_OVERLAY.png
new file mode 100644
index 0000000000..14b1716ec3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadArrow.png
new file mode 100644
index 0000000000..9c2f633e73
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadArrow.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadArrow.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadArrow.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..517473e933
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadAxe.png
new file mode 100644
index 0000000000..a34842b880
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadAxe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadAxe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadAxe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..d6fffdcd5c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..44dd6d1f90
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadBuzzSaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadBuzzSaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadBuzzSaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..b82dd318a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadChainsaw.png
new file mode 100644
index 0000000000..17c04d4001
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadChainsaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadChainsaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadChainsaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..6c18971b69
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadDrill.png
new file mode 100644
index 0000000000..3f3dfe17fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadDrill.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadDrill.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadDrill.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..bf8468bfaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadFile.png
new file mode 100644
index 0000000000..0ac9ffcc34
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadFile.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadFile.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadFile.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..a850227ee8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHammer.png
new file mode 100644
index 0000000000..9241469482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHammer.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHammer.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHammer.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..31d33c5d2d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHoe.png
new file mode 100644
index 0000000000..dade74aaf2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHoe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHoe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHoe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..be8a019733
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadMallet.png
new file mode 100644
index 0000000000..2be8ce155a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadMallet.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadMallet.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadMallet.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..5e3e87c37b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPickaxe.png
new file mode 100644
index 0000000000..47a92ead2d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPickaxe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPickaxe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPickaxe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..34847d4520
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPlow.png
new file mode 100644
index 0000000000..735c32cf06
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPlow.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPlow.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPlow.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..533836a3e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSaw.png
new file mode 100644
index 0000000000..ef81dd6f8f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..317998c920
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadScrewdriver.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadScrewdriver.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadScrewdriver.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSense.png
new file mode 100644
index 0000000000..5e2e392f05
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSense.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSense.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSense.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..7c34c917ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadShovel.png
new file mode 100644
index 0000000000..011f730128
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadShovel.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadShovel.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadShovel.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..ef3ef9dc36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSoldering.png
new file mode 100644
index 0000000000..bbcd766289
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSoldering.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSoldering.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSoldering.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..0a494f34dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSword.png
new file mode 100644
index 0000000000..e1389d05e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSword.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSword.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSword.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..eb09d18294
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..d76ea6368f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadUniversalSpade.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadUniversalSpade.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadUniversalSpade.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3283bc7745
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadWrench.png
new file mode 100644
index 0000000000..185fd09099
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadWrench.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadWrench.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadWrench.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/turbineBlade.png
new file mode 100644
index 0000000000..f1ad9c4950
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/turbineBlade.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/turbineBlade.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/turbineBlade.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..b8bd82f701
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/void.png
new file mode 100644
index 0000000000..955e210484
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/void.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/wireFine.png
new file mode 100644
index 0000000000..dee900492e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/wireFine.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/wireFine.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/wireFine.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/eternity/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/TURBINE_BLADE.png
new file mode 100644
index 0000000000..c688c39c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/TURBINE_BLADE.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/TURBINE_BLADE.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/TURBINE_BLADE.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtPlastic.png
new file mode 100644
index 0000000000..4c6ca89183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtPlastic.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtPlastic.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtPlastic.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtWood.png
new file mode 100644
index 0000000000..4c6ca89183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtWood.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtWood.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtWood.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/bolt.png
new file mode 100644
index 0000000000..c3056f7ad0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/bolt.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/bolt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/bolt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/casingSmall.png
new file mode 100644
index 0000000000..ade78dec84
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/casingSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/casingSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/casingSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cell.png
new file mode 100644
index 0000000000..1ca2c2f5c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cell.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cell.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cell.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cellPlasma.png
new file mode 100644
index 0000000000..1ca2c2f5c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cellPlasma.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cellPlasma.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cellPlasma.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtDust.png
new file mode 100644
index 0000000000..e87e063d76
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtDust.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtDust.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtDust.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtGem.png
new file mode 100644
index 0000000000..fad10680e9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtGem.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtGem.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtGem.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtIngot.png
new file mode 100644
index 0000000000..1c127a2734
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtIngot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtIngot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtIngot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtPlate.png
new file mode 100644
index 0000000000..1ee0dea1b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtPlate.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtPlate.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtPlate.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushed.png
new file mode 100644
index 0000000000..080c62c87d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushed.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushed.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushed.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedCentrifuged.png
new file mode 100644
index 0000000000..1449f15a84
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedCentrifuged.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedCentrifuged.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedCentrifuged.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedPurified.png
new file mode 100644
index 0000000000..e7ca11a991
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedPurified.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedPurified.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedPurified.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dust.png
new file mode 100644
index 0000000000..86fd0d3c39
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dust.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dust.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dust.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustImpure.png
new file mode 100644
index 0000000000..86fd0d3c39
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustImpure.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustImpure.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustImpure.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..9b4cc83142
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustPure.png
new file mode 100644
index 0000000000..86fd0d3c39
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustPure.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustPure.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustPure.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..0a13a54032
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustSmall.png
new file mode 100644
index 0000000000..144b7c8bc5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustTiny.png
new file mode 100644
index 0000000000..d092b0fcab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustTiny.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustTiny.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustTiny.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/foil.png
new file mode 100644
index 0000000000..8ab4a526ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/foil.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGt.png
new file mode 100644
index 0000000000..e8b34f838f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGtSmall.png
new file mode 100644
index 0000000000..cd9bcf269d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGtSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGtSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGtSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gem.png
new file mode 100644
index 0000000000..4374f11dfe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gem.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gem.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gem.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemChipped.png
new file mode 100644
index 0000000000..9a3f82cb3a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemChipped.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemChipped.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemChipped.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemExquisite.png
new file mode 100644
index 0000000000..875d3c9e42
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemExquisite.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemExquisite.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemExquisite.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawed.png
new file mode 100644
index 0000000000..304bbbec91
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawed.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawed.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawed.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawless.png
new file mode 100644
index 0000000000..bf6a190bc1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawless.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawless.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawless.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/handleMallet.png
new file mode 100644
index 0000000000..23d2b0628a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/handleMallet.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/handleMallet.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/handleMallet.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingot.png
new file mode 100644
index 0000000000..b5ce7727a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotDouble.png
new file mode 100644
index 0000000000..89fef3a26f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotDouble.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotDouble.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotDouble.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotHot.png
new file mode 100644
index 0000000000..df1e0bf4be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotHot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotHot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotHot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuadruple.png
new file mode 100644
index 0000000000..168598eec7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuintuple.png
new file mode 100644
index 0000000000..b55e436a27
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuintuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuintuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuintuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotTriple.png
new file mode 100644
index 0000000000..d61448f5e8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotTriple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotTriple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotTriple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/lens.png
new file mode 100644
index 0000000000..1ec7529b67
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/lens.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/lens.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/lens.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites_OVERLAY.png
new file mode 100644
index 0000000000..85ab4aed9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nanites_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nugget.png
new file mode 100644
index 0000000000..8ebd891bcf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nugget.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nugget.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nugget.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plate.png
new file mode 100644
index 0000000000..a30f108e19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plate.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plate.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plate.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDense.png
new file mode 100644
index 0000000000..92246b84ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDense.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDense.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDense.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDouble.png
new file mode 100644
index 0000000000..28ff1a2f5b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDouble.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDouble.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDouble.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuadruple.png
new file mode 100644
index 0000000000..38f9d45442
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuintuple.png
new file mode 100644
index 0000000000..5e7d58131e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuintuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuintuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuintuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateTriple.png
new file mode 100644
index 0000000000..c6e7099d5d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateTriple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateTriple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateTriple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ring.png
new file mode 100644
index 0000000000..32570a9dd9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ring.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ring.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ring.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/rotor.png
new file mode 100644
index 0000000000..357ca849fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/rotor.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/rotor.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/rotor.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/round.png
new file mode 100644
index 0000000000..77299e4bd3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/round.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/round.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/round.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/screw.png
new file mode 100644
index 0000000000..0e62cf1ca0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/screw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/screw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/screw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/spring.png
new file mode 100644
index 0000000000..4d3e3af0ae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/spring.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/spring.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/spring.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/springSmall.png
new file mode 100644
index 0000000000..a4c2c27adb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/springSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/springSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/springSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stick.png
new file mode 100644
index 0000000000..690a8cc276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stick.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stick.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stick.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stickLong.png
new file mode 100644
index 0000000000..bdd0c9d941
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stickLong.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stickLong.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stickLong.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadArrow.png
new file mode 100644
index 0000000000..1024c86cf9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadArrow.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadArrow.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadArrow.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadAxe.png
new file mode 100644
index 0000000000..f85de48ea9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadAxe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadAxe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadAxe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..125f0b2742
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadBuzzSaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadBuzzSaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadBuzzSaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadChainsaw.png
new file mode 100644
index 0000000000..88a8198a87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadChainsaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadChainsaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadChainsaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadDrill.png
new file mode 100644
index 0000000000..11ff2979ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadDrill.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadDrill.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadDrill.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadFile.png
new file mode 100644
index 0000000000..4517b0a924
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadFile.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadFile.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadFile.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHammer.png
new file mode 100644
index 0000000000..3a3533ef5b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHammer.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHammer.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHammer.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHoe.png
new file mode 100644
index 0000000000..a1006d3bc1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHoe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHoe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHoe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadMallet.png
new file mode 100644
index 0000000000..b6abf72bdb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadMallet.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadMallet.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadMallet.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPickaxe.png
new file mode 100644
index 0000000000..44cccc5a87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPickaxe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPickaxe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPickaxe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPlow.png
new file mode 100644
index 0000000000..aaf9a048af
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPlow.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPlow.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPlow.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSaw.png
new file mode 100644
index 0000000000..05db94e9f3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..1187377567
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadScrewdriver.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadScrewdriver.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadScrewdriver.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSense.png
new file mode 100644
index 0000000000..3ce3b22500
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSense.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSense.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSense.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadShovel.png
new file mode 100644
index 0000000000..9a696a6ecf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadShovel.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadShovel.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadShovel.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSoldering.png
new file mode 100644
index 0000000000..05db1e38c4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSoldering.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSoldering.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSoldering.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSword.png
new file mode 100644
index 0000000000..916205e679
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSword.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSword.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSword.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..33a59e4955
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadUniversalSpade.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadUniversalSpade.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadUniversalSpade.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadWrench.png
new file mode 100644
index 0000000000..d8b8f7cd31
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadWrench.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadWrench.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadWrench.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/turbineBlade.png
new file mode 100644
index 0000000000..c688c39c18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/turbineBlade.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/turbineBlade.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/turbineBlade.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/void.png
new file mode 100644
index 0000000000..65f9cf69d3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/void.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/wireFine.png
new file mode 100644
index 0000000000..2dfca4b44a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/wireFine.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/wireFine.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/wireFine.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/infinity/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/TURBINE_BLADE.png
new file mode 100644
index 0000000000..cd06f8fdd6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/TURBINE_BLADE.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/TURBINE_BLADE.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/TURBINE_BLADE.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..b8bd82f701
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtPlastic.png
new file mode 100644
index 0000000000..2cd17a7929
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtPlastic.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtPlastic.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtPlastic.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtWood.png
new file mode 100644
index 0000000000..2cd17a7929
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtWood.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtWood.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtWood.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/bolt.png
new file mode 100644
index 0000000000..ce80500a61
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/bolt.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/bolt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/bolt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/casingSmall.png
new file mode 100644
index 0000000000..d8d548fd96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/casingSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/casingSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/casingSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cell.png
new file mode 100644
index 0000000000..4371ac6223
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cell.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cell.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cell.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cellPlasma.png
new file mode 100644
index 0000000000..4371ac6223
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cellPlasma.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cellPlasma.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cellPlasma.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtDust.png
new file mode 100644
index 0000000000..bf9451c1c3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtDust.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtDust.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtDust.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtGem.png
new file mode 100644
index 0000000000..c96c4ba2e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtGem.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtGem.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtGem.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtIngot.png
new file mode 100644
index 0000000000..082c51a9ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtIngot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtIngot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtIngot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtPlate.png
new file mode 100644
index 0000000000..4bf4f3b178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtPlate.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtPlate.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtPlate.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushed.png
new file mode 100644
index 0000000000..9b1e70dc8e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushed.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushed.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushed.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedCentrifuged.png
new file mode 100644
index 0000000000..4a007899d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedCentrifuged.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedCentrifuged.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedCentrifuged.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedPurified.png
new file mode 100644
index 0000000000..0859ef0118
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedPurified.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedPurified.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedPurified.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dust.png
new file mode 100644
index 0000000000..dfa5f8f1b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dust.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dust.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dust.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustImpure.png
new file mode 100644
index 0000000000..dfa5f8f1b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustImpure.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustImpure.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustImpure.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..e1ef9cb02d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustPure.png
new file mode 100644
index 0000000000..dfa5f8f1b2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustPure.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustPure.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustPure.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..49bf00f3fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustSmall.png
new file mode 100644
index 0000000000..e98bf1d846
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..013355cb43
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustTiny.png
new file mode 100644
index 0000000000..8f63b4ee39
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustTiny.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustTiny.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustTiny.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3d2331e877
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dust_OVERLAY.png
new file mode 100644
index 0000000000..19ceac5630
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/foil.png
new file mode 100644
index 0000000000..d0f523d1a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/foil.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/foil_OVERLAY.png
new file mode 100644
index 0000000000..dc66f6ecd5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGt.png
new file mode 100644
index 0000000000..91711f1da6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGtSmall.png
new file mode 100644
index 0000000000..8e5ee86364
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGtSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGtSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGtSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..7fe7b6cb65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..a6a8f3f11a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gem.png
new file mode 100644
index 0000000000..2f14813829
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gem.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gem.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gem.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemChipped.png
new file mode 100644
index 0000000000..0e2429173d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemChipped.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemChipped.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemChipped.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3aab345eed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemExquisite.png
new file mode 100644
index 0000000000..1be8b0efda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemExquisite.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemExquisite.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemExquisite.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..88eb74ba6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawed.png
new file mode 100644
index 0000000000..ae3e228a40
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawed.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawed.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawed.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..6a250e6878
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawless.png
new file mode 100644
index 0000000000..1939415974
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawless.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawless.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawless.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..ff57413839
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gem_OVERLAY.png
new file mode 100644
index 0000000000..0191093584
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/handleMallet.png
new file mode 100644
index 0000000000..028930724a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/handleMallet.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/handleMallet.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/handleMallet.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..66d13658ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingot.png
new file mode 100644
index 0000000000..4645e41677
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotDouble.png
new file mode 100644
index 0000000000..c1afdb278b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotDouble.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotDouble.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotDouble.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..750c50da6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotHot.png
new file mode 100644
index 0000000000..4645e41677
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotHot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotHot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotHot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuadruple.png
new file mode 100644
index 0000000000..f15de104a9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..52a6d53b7f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuintuple.png
new file mode 100644
index 0000000000..60a8a430f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuintuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuintuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuintuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..0243d6b999
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotTriple.png
new file mode 100644
index 0000000000..eccec33ed5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotTriple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotTriple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotTriple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..e069b3c3da
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingot_OVERLAY.png
new file mode 100644
index 0000000000..7e8c36aa6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/lens.png
new file mode 100644
index 0000000000..1939415974
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/lens.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/lens.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/lens.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/nugget.png
new file mode 100644
index 0000000000..b0b7a3905d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/nugget.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/nugget.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/nugget.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/nugget_OVERLAY.png
new file mode 100644
index 0000000000..b50fff5724
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plate.png
new file mode 100644
index 0000000000..8e3d5e29f1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plate.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plate.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plate.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDense.png
new file mode 100644
index 0000000000..a4f7e5a43a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDense.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDense.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDense.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..d728803821
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDouble.png
new file mode 100644
index 0000000000..cce1c17488
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDouble.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDouble.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDouble.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..f632e3425d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuadruple.png
new file mode 100644
index 0000000000..4076c9fc53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d0a9dc1be3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuintuple.png
new file mode 100644
index 0000000000..0a5c3cafcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuintuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuintuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuintuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..acdf67c833
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateTriple.png
new file mode 100644
index 0000000000..1aa44887e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateTriple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateTriple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateTriple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..13f2d98130
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plate_OVERLAY.png
new file mode 100644
index 0000000000..19b7074452
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ring.png
new file mode 100644
index 0000000000..d01371e6a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ring.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ring.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ring.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/rotor.png
new file mode 100644
index 0000000000..07807968cf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/rotor.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/rotor.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/rotor.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3c0ab7d83d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/round.png
new file mode 100644
index 0000000000..6c6aac966d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/round.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/round.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/round.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/round_OVERLAY.png
new file mode 100644
index 0000000000..341ba2e07f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/screw.png
new file mode 100644
index 0000000000..a943fc3119
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/screw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/screw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/screw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/screw_OVERLAY.png
new file mode 100644
index 0000000000..69f2c40a75
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/spring.png
new file mode 100644
index 0000000000..c77a11585f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/spring.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/spring.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/spring.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/springSmall.png
new file mode 100644
index 0000000000..30b157beb5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/springSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/springSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/springSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..6530f75f27
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/spring_OVERLAY.png
new file mode 100644
index 0000000000..4760a3fc9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stick.png
new file mode 100644
index 0000000000..fa5675db12
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stick.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stick.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stick.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stickLong.png
new file mode 100644
index 0000000000..de87533468
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stickLong.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stickLong.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stickLong.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..8831cfdff3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stick_OVERLAY.png
new file mode 100644
index 0000000000..14b1716ec3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadArrow.png
new file mode 100644
index 0000000000..22f0c48209
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadArrow.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadArrow.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadArrow.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..517473e933
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadAxe.png
new file mode 100644
index 0000000000..324de83dcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadAxe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadAxe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadAxe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..d6fffdcd5c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..8f118f0ab2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadBuzzSaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadBuzzSaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadBuzzSaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..b82dd318a2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadChainsaw.png
new file mode 100644
index 0000000000..5b18d8f820
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadChainsaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadChainsaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadChainsaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..6c18971b69
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadDrill.png
new file mode 100644
index 0000000000..925d7460b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadDrill.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadDrill.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadDrill.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..bf8468bfaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadFile.png
new file mode 100644
index 0000000000..eca43586c4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadFile.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadFile.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadFile.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..a850227ee8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHammer.png
new file mode 100644
index 0000000000..2ffd28c3c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHammer.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHammer.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHammer.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..31d33c5d2d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHoe.png
new file mode 100644
index 0000000000..4d530c0a59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHoe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHoe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHoe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..be8a019733
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadMallet.png
new file mode 100644
index 0000000000..05c3b5a22c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadMallet.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadMallet.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadMallet.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..5e3e87c37b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPickaxe.png
new file mode 100644
index 0000000000..952f448637
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPickaxe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPickaxe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPickaxe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..34847d4520
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPlow.png
new file mode 100644
index 0000000000..d90e0a9728
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPlow.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPlow.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPlow.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..533836a3e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSaw.png
new file mode 100644
index 0000000000..6a14e4c8f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..72edcafef3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadScrewdriver.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadScrewdriver.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadScrewdriver.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSense.png
new file mode 100644
index 0000000000..c2f2c3ac11
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSense.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSense.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSense.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..7c34c917ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadShovel.png
new file mode 100644
index 0000000000..fe682b07f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadShovel.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadShovel.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadShovel.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..ef3ef9dc36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSoldering.png
new file mode 100644
index 0000000000..6da01ba966
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSoldering.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSoldering.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSoldering.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..0a494f34dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSword.png
new file mode 100644
index 0000000000..fe9b38bc38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSword.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSword.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSword.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..eb09d18294
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..1cdeb0c35a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadUniversalSpade.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadUniversalSpade.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadUniversalSpade.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3283bc7745
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadWrench.png
new file mode 100644
index 0000000000..da023c69a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadWrench.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadWrench.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadWrench.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/turbineBlade.png
new file mode 100644
index 0000000000..cd06f8fdd6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/turbineBlade.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/turbineBlade.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/turbineBlade.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..b8bd82f701
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/void.png
new file mode 100644
index 0000000000..70054bfb57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/void.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/wireFine.png
new file mode 100644
index 0000000000..4fb660cb31
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/wireFine.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/wireFine.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/wireFine.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/magmatter/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/TURBINE_BLADE.png
new file mode 100644
index 0000000000..e9d14c0ac2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/TURBINE_BLADE.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/TURBINE_BLADE.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/TURBINE_BLADE.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtPlastic.png
new file mode 100644
index 0000000000..edf39dbf7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtPlastic.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtPlastic.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtPlastic.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtWood.png
new file mode 100644
index 0000000000..edf39dbf7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtWood.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtWood.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtWood.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/bolt.png
new file mode 100644
index 0000000000..72f93dd04f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/bolt.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/bolt.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/bolt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/casingSmall.png
new file mode 100644
index 0000000000..8e3d6b7a1e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/casingSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/casingSmall.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/casingSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cell.png
new file mode 100644
index 0000000000..e70ebcf5d8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cell.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cell.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cell.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cellPlasma.png
new file mode 100644
index 0000000000..e70ebcf5d8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cellPlasma.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cellPlasma.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cellPlasma.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtDust.png
new file mode 100644
index 0000000000..a3730a0980
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtDust.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtDust.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtDust.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtGem.png
new file mode 100644
index 0000000000..bd758f992d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtGem.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtGem.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtGem.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtIngot.png
new file mode 100644
index 0000000000..add4859175
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtIngot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtIngot.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtIngot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtPlate.png
new file mode 100644
index 0000000000..caf0f210c6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtPlate.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtPlate.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtPlate.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushed.png
new file mode 100644
index 0000000000..81cfd7cb58
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushed.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushed.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushed.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedCentrifuged.png
new file mode 100644
index 0000000000..a42fd8d379
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedCentrifuged.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedCentrifuged.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedCentrifuged.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedPurified.png
new file mode 100644
index 0000000000..c7d8f27a90
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedPurified.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedPurified.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedPurified.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dust.png
new file mode 100644
index 0000000000..4ed6185519
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dust.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dust.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dust.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustImpure.png
new file mode 100644
index 0000000000..4ed6185519
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustImpure.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustImpure.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustImpure.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..9b4cc83142
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustPure.png
new file mode 100644
index 0000000000..4ed6185519
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustPure.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustPure.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustPure.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..0a13a54032
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustSmall.png
new file mode 100644
index 0000000000..f01a480f05
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustSmall.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustTiny.png
new file mode 100644
index 0000000000..68f02bd168
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustTiny.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustTiny.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustTiny.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/foil.png
new file mode 100644
index 0000000000..58a41a263a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/foil.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGt.png
new file mode 100644
index 0000000000..e283c63a8e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGt.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGtSmall.png
new file mode 100644
index 0000000000..46dc3f23bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGtSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGtSmall.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGtSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gem.png
new file mode 100644
index 0000000000..ed9e12efaa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gem.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gem.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gem.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemChipped.png
new file mode 100644
index 0000000000..9e6052cca5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemChipped.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemChipped.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemChipped.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemExquisite.png
new file mode 100644
index 0000000000..8539adbb13
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemExquisite.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemExquisite.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemExquisite.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawed.png
new file mode 100644
index 0000000000..8c10d179d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawed.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawed.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawed.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawless.png
new file mode 100644
index 0000000000..53a9ac63ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawless.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawless.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawless.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/handleMallet.png
new file mode 100644
index 0000000000..702ed9223b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/handleMallet.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/handleMallet.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/handleMallet.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingot.png
new file mode 100644
index 0000000000..afdbeeeb89
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingot.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotDouble.png
new file mode 100644
index 0000000000..eecea95dd1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotDouble.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotDouble.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotDouble.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotHot.png
new file mode 100644
index 0000000000..ba79c6702e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotHot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotHot.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotHot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuadruple.png
new file mode 100644
index 0000000000..e658ad9ed9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuadruple.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuintuple.png
new file mode 100644
index 0000000000..d1e8a93c70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuintuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuintuple.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuintuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotTriple.png
new file mode 100644
index 0000000000..f670468056
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotTriple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotTriple.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotTriple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/lens.png
new file mode 100644
index 0000000000..3d36c90ba6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/lens.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/lens.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/lens.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/nugget.png
new file mode 100644
index 0000000000..f525e6ea28
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/nugget.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/nugget.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/nugget.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plate.png
new file mode 100644
index 0000000000..d9147f12bc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plate.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plate.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plate.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDense.png
new file mode 100644
index 0000000000..03d19a220a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDense.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDense.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDense.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDouble.png
new file mode 100644
index 0000000000..381d1f4292
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDouble.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDouble.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDouble.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuadruple.png
new file mode 100644
index 0000000000..5a515c0493
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuadruple.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuintuple.png
new file mode 100644
index 0000000000..57d5613b44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuintuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuintuple.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuintuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateTriple.png
new file mode 100644
index 0000000000..b721256098
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateTriple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateTriple.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateTriple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ring.png
new file mode 100644
index 0000000000..5933bfa0ee
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ring.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ring.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ring.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/rotor.png
new file mode 100644
index 0000000000..6a9a1cc9f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/rotor.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/rotor.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/rotor.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/round.png
new file mode 100644
index 0000000000..c787af3b8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/round.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/round.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/round.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/screw.png
new file mode 100644
index 0000000000..5a862c74a8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/screw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/screw.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/screw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/spring.png
new file mode 100644
index 0000000000..950fb3636c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/spring.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/spring.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/spring.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/springSmall.png
new file mode 100644
index 0000000000..b9883ddbf0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/springSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/springSmall.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/springSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stick.png
new file mode 100644
index 0000000000..e3dd4baa65
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stick.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stick.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stick.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stickLong.png
new file mode 100644
index 0000000000..cfcf89ae91
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stickLong.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stickLong.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stickLong.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadArrow.png
new file mode 100644
index 0000000000..32a4441e49
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadArrow.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadArrow.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadArrow.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadAxe.png
new file mode 100644
index 0000000000..145664c8f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadAxe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadAxe.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadAxe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..73c4f36258
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadBuzzSaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadBuzzSaw.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadBuzzSaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadChainsaw.png
new file mode 100644
index 0000000000..b5c7b75487
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadChainsaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadChainsaw.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadChainsaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadDrill.png
new file mode 100644
index 0000000000..83aca31075
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadDrill.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadDrill.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadDrill.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadFile.png
new file mode 100644
index 0000000000..0ee9698237
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadFile.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadFile.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadFile.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHammer.png
new file mode 100644
index 0000000000..e394fcd8b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHammer.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHammer.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHammer.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHoe.png
new file mode 100644
index 0000000000..8fa615dc30
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHoe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHoe.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHoe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadMallet.png
new file mode 100644
index 0000000000..42692f8bc1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadMallet.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadMallet.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadMallet.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPickaxe.png
new file mode 100644
index 0000000000..aaddf97822
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPickaxe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPickaxe.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPickaxe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPlow.png
new file mode 100644
index 0000000000..76c44affbe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPlow.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPlow.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPlow.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSaw.png
new file mode 100644
index 0000000000..c245527d6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSaw.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..b610cf572e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadScrewdriver.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadScrewdriver.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadScrewdriver.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSense.png
new file mode 100644
index 0000000000..3544d9fbd2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSense.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSense.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSense.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadShovel.png
new file mode 100644
index 0000000000..28e72b2441
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadShovel.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadShovel.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadShovel.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSoldering.png
new file mode 100644
index 0000000000..98390b7bb1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSoldering.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSoldering.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSoldering.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSword.png
new file mode 100644
index 0000000000..48f990d976
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSword.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSword.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSword.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..139a4913d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadUniversalSpade.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadUniversalSpade.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadUniversalSpade.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadWrench.png
new file mode 100644
index 0000000000..7c2c3ba048
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadWrench.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadWrench.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadWrench.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/turbineBlade.png
new file mode 100644
index 0000000000..e9d14c0ac2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/turbineBlade.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/turbineBlade.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/turbineBlade.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/void.png
new file mode 100644
index 0000000000..9ea5483e31
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/void.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/wireFine.png
new file mode 100644
index 0000000000..535521c2be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/wireFine.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/wireFine.png.mcmeta
new file mode 100644
index 0000000000..0dab81071f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/wireFine.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 3}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/spacetime/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/TURBINE_BLADE.png
new file mode 100644
index 0000000000..c2af379154
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/TURBINE_BLADE.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/TURBINE_BLADE.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/TURBINE_BLADE.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtPlastic.png
new file mode 100644
index 0000000000..4567ecc903
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtPlastic.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtPlastic.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtPlastic.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..3ffb9e31e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtWood.png
new file mode 100644
index 0000000000..4567ecc903
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtWood.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtWood.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtWood.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..948953f827
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/bolt.png
new file mode 100644
index 0000000000..2353a5ff66
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/bolt.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/bolt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/bolt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/bolt_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/casingSmall.png
new file mode 100644
index 0000000000..465cb94b5e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/casingSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/casingSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/casingSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cell.png
new file mode 100644
index 0000000000..9c31c8db0a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cell.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cell.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cell.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cellPlasma.png
new file mode 100644
index 0000000000..9c31c8db0a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cellPlasma.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cellPlasma.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cellPlasma.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..1c93293744
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cell_OVERLAY.png
new file mode 100644
index 0000000000..f02365b9ff
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtDust.png
new file mode 100644
index 0000000000..760461e798
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtDust.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtDust.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtDust.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..64d56b48ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtGem.png
new file mode 100644
index 0000000000..5ca9089734
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtGem.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtGem.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtGem.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtIngot.png
new file mode 100644
index 0000000000..8fac0c3cdb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtIngot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtIngot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtIngot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2f0577d65f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtPlate.png
new file mode 100644
index 0000000000..011d800143
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtPlate.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtPlate.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtPlate.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..ae6d73b7a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushed.png
new file mode 100644
index 0000000000..9944278961
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushed.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushed.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushed.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedCentrifuged.png
new file mode 100644
index 0000000000..ccc5b9bb93
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedCentrifuged.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedCentrifuged.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedCentrifuged.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedPurified.png
new file mode 100644
index 0000000000..33d1e71945
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedPurified.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedPurified.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedPurified.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushed_OVERLAY.png
new file mode 100644
index 0000000000..a1600cad7c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dust.png
new file mode 100644
index 0000000000..e4c2e6e8fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dust.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dust.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dust.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustImpure.png
new file mode 100644
index 0000000000..e4c2e6e8fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustImpure.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustImpure.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustImpure.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..bd9fbe8192
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustPure.png
new file mode 100644
index 0000000000..e4c2e6e8fc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustPure.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustPure.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustPure.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..0eeb49eb26
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustSmall.png
new file mode 100644
index 0000000000..3e86c4efdd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustTiny.png
new file mode 100644
index 0000000000..35b58d5d28
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustTiny.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustTiny.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustTiny.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dust_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/foil.png
new file mode 100644
index 0000000000..dd1d1d6b47
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/foil.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/foil.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/foil.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/foil_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGt.png
new file mode 100644
index 0000000000..5be6b57b1f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGt.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGt.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGt.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGtSmall.png
new file mode 100644
index 0000000000..3b76c82579
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGtSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGtSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGtSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gem.png
new file mode 100644
index 0000000000..322d06cbc5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gem.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gem.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gem.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemChipped.png
new file mode 100644
index 0000000000..f3ecffb06c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemChipped.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemChipped.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemChipped.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemExquisite.png
new file mode 100644
index 0000000000..ec2593d00f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemExquisite.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemExquisite.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemExquisite.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawed.png
new file mode 100644
index 0000000000..dbf2be3bb5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawed.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawed.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawed.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawless.png
new file mode 100644
index 0000000000..f12f99150e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawless.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawless.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawless.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gem_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/handleMallet.png
new file mode 100644
index 0000000000..c440753d82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/handleMallet.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/handleMallet.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/handleMallet.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingot.png
new file mode 100644
index 0000000000..2f1a4d4a1c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotDouble.png
new file mode 100644
index 0000000000..9c813fbf4a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotDouble.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotDouble.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotDouble.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotHot.png
new file mode 100644
index 0000000000..f2dc32d8dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotHot.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotHot.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotHot.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..ebf9b80323
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuadruple.png
new file mode 100644
index 0000000000..0b70635f44
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuintuple.png
new file mode 100644
index 0000000000..b77047ead7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuintuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuintuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuintuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotTriple.png
new file mode 100644
index 0000000000..8b8af64f49
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotTriple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotTriple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotTriple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingot_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/lens.png
new file mode 100644
index 0000000000..ef1934b370
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/lens.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/lens.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/lens.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/lens_OVERLAY.png
new file mode 100644
index 0000000000..51cb4b73a0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nanites.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nanites.png
new file mode 100644
index 0000000000..ff65c637e4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nanites.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nanites.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nanites.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nanites.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nanites_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nanites_OVERLAY.png
new file mode 100644
index 0000000000..b0ef0371e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nanites_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nugget.png
new file mode 100644
index 0000000000..c9b7567325
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nugget.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nugget.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nugget.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nugget_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plate.png
new file mode 100644
index 0000000000..b1c43ba8dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plate.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plate.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plate.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDense.png
new file mode 100644
index 0000000000..0e6ccc7429
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDense.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDense.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDense.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDouble.png
new file mode 100644
index 0000000000..d98797e5dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDouble.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDouble.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDouble.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuadruple.png
new file mode 100644
index 0000000000..b024dab6cd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuadruple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuadruple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuadruple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuintuple.png
new file mode 100644
index 0000000000..0f304c5245
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuintuple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuintuple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuintuple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateTriple.png
new file mode 100644
index 0000000000..bc5d1123a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateTriple.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateTriple.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateTriple.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plate_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ring.png
new file mode 100644
index 0000000000..7a28e166bc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ring.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ring.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ring.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ring_OVERLAY.png
new file mode 100644
index 0000000000..d5a0c95c2e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/rotor.png
new file mode 100644
index 0000000000..5623ae48a5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/rotor.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/rotor.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/rotor.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/rotor_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/round.png
new file mode 100644
index 0000000000..ff815f7459
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/round.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/round.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/round.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/round_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/screw.png
new file mode 100644
index 0000000000..b26e7624e4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/screw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/screw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/screw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/screw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/spring.png
new file mode 100644
index 0000000000..2bc6ae7d9e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/spring.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/spring.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/spring.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/springSmall.png
new file mode 100644
index 0000000000..602782288c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/springSmall.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/springSmall.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/springSmall.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/spring_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stick.png
new file mode 100644
index 0000000000..e2b85a44df
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stick.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stick.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stick.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stickLong.png
new file mode 100644
index 0000000000..57111cb5ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stickLong.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stickLong.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stickLong.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stick_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadArrow.png
new file mode 100644
index 0000000000..3451f37c33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadArrow.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadArrow.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadArrow.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadAxe.png
new file mode 100644
index 0000000000..730900a053
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadAxe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadAxe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadAxe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..0e8d8f33e5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadBuzzSaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadBuzzSaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadBuzzSaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadChainsaw.png
new file mode 100644
index 0000000000..296a4eacbc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadChainsaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadChainsaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadChainsaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadDrill.png
new file mode 100644
index 0000000000..5a6d448400
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadDrill.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadDrill.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadDrill.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadFile.png
new file mode 100644
index 0000000000..c91e0717e7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadFile.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadFile.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadFile.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHammer.png
new file mode 100644
index 0000000000..014760c295
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHammer.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHammer.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHammer.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHoe.png
new file mode 100644
index 0000000000..85536f28bd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHoe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHoe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHoe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadMallet.png
new file mode 100644
index 0000000000..f7c5aa597e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadMallet.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadMallet.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadMallet.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPickaxe.png
new file mode 100644
index 0000000000..ba6a10f37c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPickaxe.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPickaxe.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPickaxe.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPlow.png
new file mode 100644
index 0000000000..5b39dad8a0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPlow.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPlow.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPlow.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSaw.png
new file mode 100644
index 0000000000..657453a2d2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSaw.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSaw.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSaw.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..2343ef9d24
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadScrewdriver.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadScrewdriver.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadScrewdriver.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSense.png
new file mode 100644
index 0000000000..b3cbe69a71
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSense.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSense.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSense.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadShovel.png
new file mode 100644
index 0000000000..244126d795
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadShovel.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadShovel.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadShovel.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSoldering.png
new file mode 100644
index 0000000000..11b63507f3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSoldering.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSoldering.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSoldering.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSword.png
new file mode 100644
index 0000000000..e671a132dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSword.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSword.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSword.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..fffc4f1d8e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadUniversalSpade.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadUniversalSpade.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadUniversalSpade.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadWrench.png
new file mode 100644
index 0000000000..f0392203ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadWrench.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadWrench.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadWrench.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/turbineBlade.png
new file mode 100644
index 0000000000..c2af379154
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/turbineBlade.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/turbineBlade.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/turbineBlade.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/void.png
new file mode 100644
index 0000000000..358f2fa936
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/void.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/void.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/void.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/void_OVERLAY.png
new file mode 100644
index 0000000000..d83a131004
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/wireFine.png
new file mode 100644
index 0000000000..2b866575ba
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/wireFine.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/wireFine.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/wireFine.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..5e9e05d5b0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/CUSTOM/universium/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dust.png
new file mode 100644
index 0000000000..71c0c8bcdc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustImpure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..739e33218b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustPure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..a98e8ca00b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustSmall.png
new file mode 100644
index 0000000000..4b6529c9d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..34fa7faa4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustTiny.png
new file mode 100644
index 0000000000..087fa0455e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..337a6351e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dust_OVERLAY.png
new file mode 100644
index 0000000000..a6b6349d07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGt.png
new file mode 100644
index 0000000000..038f5a5b2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGtSmall.png
new file mode 100644
index 0000000000..33fe8afb01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..711c0c670c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..e942f0f305
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gem.png
new file mode 100644
index 0000000000..0368e77198
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingot.png
new file mode 100644
index 0000000000..52da7cf46e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingot_OVERLAY.png
new file mode 100644
index 0000000000..80f9938b6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/nugget.png
new file mode 100644
index 0000000000..98cb1079fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/nugget_OVERLAY.png
new file mode 100644
index 0000000000..ca8866c85c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/oreRaw.png
new file mode 100644
index 0000000000..9934452754
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..a8a3153147
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plate.png
new file mode 100644
index 0000000000..5ddd64f82e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plate_OVERLAY.png
new file mode 100644
index 0000000000..d7f9bd982d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stick.png
new file mode 100644
index 0000000000..a65c9dbdcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stick_OVERLAY.png
new file mode 100644
index 0000000000..6f38dc4134
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadArrow.png
new file mode 100644
index 0000000000..ceb14c79db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..56ef19ad70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSword.png
new file mode 100644
index 0000000000..bad0e9522f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DIAMOND/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dust.png
new file mode 100644
index 0000000000..e000fe374f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustImpure.png
new file mode 100644
index 0000000000..5dbeff0c9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..9b4cc83142
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustPure.png
new file mode 100644
index 0000000000..5dbeff0c9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..0a13a54032
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustSmall.png
new file mode 100644
index 0000000000..7e9d37dfbd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustTiny.png
new file mode 100644
index 0000000000..6f56978018
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGt.png
new file mode 100644
index 0000000000..478e8009d7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingot.png
new file mode 100644
index 0000000000..21bcd00637
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotDouble.png
new file mode 100644
index 0000000000..e793c0445e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuadruple.png
new file mode 100644
index 0000000000..28f93b16f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuintuple.png
new file mode 100644
index 0000000000..3c4d2a7b88
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotTriple.png
new file mode 100644
index 0000000000..31d5a44bcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/nugget.png
new file mode 100644
index 0000000000..a5300a80f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/oreRaw.png
new file mode 100644
index 0000000000..2ffdb3feae
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plate.png
new file mode 100644
index 0000000000..edee549ddc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stick.png
new file mode 100644
index 0000000000..70de8f3e35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/DULL/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dust.png
new file mode 100644
index 0000000000..71c0c8bcdc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustImpure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..739e33218b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustPure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..a98e8ca00b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustSmall.png
new file mode 100644
index 0000000000..4b6529c9d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..34fa7faa4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustTiny.png
new file mode 100644
index 0000000000..087fa0455e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..337a6351e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dust_OVERLAY.png
new file mode 100644
index 0000000000..a6b6349d07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGt.png
new file mode 100644
index 0000000000..038f5a5b2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGtSmall.png
new file mode 100644
index 0000000000..33fe8afb01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..711c0c670c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..e942f0f305
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gem.png
new file mode 100644
index 0000000000..738b57ce6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingot.png
new file mode 100644
index 0000000000..52da7cf46e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingot_OVERLAY.png
new file mode 100644
index 0000000000..80f9938b6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/nugget.png
new file mode 100644
index 0000000000..98cb1079fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/nugget_OVERLAY.png
new file mode 100644
index 0000000000..ca8866c85c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/oreRaw.png
new file mode 100644
index 0000000000..9934452754
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..a8a3153147
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plate.png
new file mode 100644
index 0000000000..5ddd64f82e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plate_OVERLAY.png
new file mode 100644
index 0000000000..d7f9bd982d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stick.png
new file mode 100644
index 0000000000..a65c9dbdcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stick_OVERLAY.png
new file mode 100644
index 0000000000..6f38dc4134
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadArrow.png
new file mode 100644
index 0000000000..ceb14c79db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..56ef19ad70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSword.png
new file mode 100644
index 0000000000..bad0e9522f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/EMERALD/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtPlastic.png
new file mode 100644
index 0000000000..213fbdb453
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..637b7d8543
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtWood.png
new file mode 100644
index 0000000000..e9ea65841d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ebeae0e13f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bolt_OVERLAY.png
new file mode 100644
index 0000000000..d2c1f987c0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..5b71c92674
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..224805aca6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushed_OVERLAY.png
new file mode 100644
index 0000000000..8ba46dd7bf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dust.png
new file mode 100644
index 0000000000..71c0c8bcdc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustImpure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..d464157ae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustPure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..b773c9c509
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustSmall.png
new file mode 100644
index 0000000000..4b6529c9d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..a3e78bdd41
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustTiny.png
new file mode 100644
index 0000000000..087fa0455e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..449c421349
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dust_OVERLAY.png
new file mode 100644
index 0000000000..39268e6ae3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/foil_OVERLAY.png
new file mode 100644
index 0000000000..b7550457b3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGt.png
new file mode 100644
index 0000000000..038f5a5b2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGtSmall.png
new file mode 100644
index 0000000000..33fe8afb01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..26883582f1
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..c13f5c15d3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..b42d7bb61b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..420e342419
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..969e2133e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..dc493f61ce
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gem_OVERLAY.png
new file mode 100644
index 0000000000..a6d992d7b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingot.png
new file mode 100644
index 0000000000..52da7cf46e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..c844854d37
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..c1370ee6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..510ac71b23
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..c49f6d58ef
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingot_OVERLAY.png
new file mode 100644
index 0000000000..c59ef7b1bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/lens_OVERLAY.png
new file mode 100644
index 0000000000..967941250b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/nugget.png
new file mode 100644
index 0000000000..98cb1079fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/nugget_OVERLAY.png
new file mode 100644
index 0000000000..7e03820ee5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plate.png
new file mode 100644
index 0000000000..5ddd64f82e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..ac19c33035
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..236e514d1d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..7cb29b12fb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..66922c51a7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..dd573aadf8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plate_OVERLAY.png
new file mode 100644
index 0000000000..8baf77e0cf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ring_OVERLAY.png
new file mode 100644
index 0000000000..f45e432b19
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/rotor_OVERLAY.png
new file mode 100644
index 0000000000..03619141ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/round_OVERLAY.png
new file mode 100644
index 0000000000..60b837cf57
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/screw_OVERLAY.png
new file mode 100644
index 0000000000..f96b81d99d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..460dd6801f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/spring_OVERLAY.png
new file mode 100644
index 0000000000..dce709dbc9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stick.png
new file mode 100644
index 0000000000..a65c9dbdcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..6d6591f34e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stick_OVERLAY.png
new file mode 100644
index 0000000000..3880933cd6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3bd5c7bf68
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..b2f7615fbd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..7dcf426eb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..072404413f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..423b2aad18
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3640509449
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..534d422715
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..eb1c956b70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..0241e795b4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..748e6c078b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..bf4f1933ea
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..8235e1df69
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..5962285c6c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..52e1f289b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSword.png
new file mode 100644
index 0000000000..bad0e9522f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..e00753b990
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..026950cd24
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..e2c61b1556
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..702e702247
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FIERY/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dust.png
new file mode 100644
index 0000000000..10ba5066af
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustImpure.png
new file mode 100644
index 0000000000..beca06fafa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..0cb1c5950a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustPure.png
new file mode 100644
index 0000000000..beca06fafa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..df26af65b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustSmall.png
new file mode 100644
index 0000000000..9e6e2f06ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustTiny.png
new file mode 100644
index 0000000000..ea8ca1a639
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGt.png
new file mode 100644
index 0000000000..ffd9d95da6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingot.png
new file mode 100644
index 0000000000..21bcd00637
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/nugget.png
new file mode 100644
index 0000000000..a5300a80f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plate.png
new file mode 100644
index 0000000000..73f4196c7f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stick.png
new file mode 100644
index 0000000000..70de8f3e35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FINE/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dust.png
new file mode 100644
index 0000000000..3f18950b9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustImpure.png
new file mode 100644
index 0000000000..b1b50bc4cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..8c24842eeb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustPure.png
new file mode 100644
index 0000000000..b1b50bc4cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..32ce3c66b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustSmall.png
new file mode 100644
index 0000000000..446826791b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustTiny.png
new file mode 100644
index 0000000000..ed5ab856f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGt.png
new file mode 100644
index 0000000000..ffd9d95da6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gem.png
new file mode 100644
index 0000000000..2088d9f1d7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingot.png
new file mode 100644
index 0000000000..21bcd00637
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/nugget.png
new file mode 100644
index 0000000000..a5300a80f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plate.png
new file mode 100644
index 0000000000..edee549ddc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stick.png
new file mode 100644
index 0000000000..3affaebc8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLINT/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dust.png
new file mode 100644
index 0000000000..e000fe374f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustImpure.png
new file mode 100644
index 0000000000..5dbeff0c9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..9b4cc83142
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustPure.png
new file mode 100644
index 0000000000..5dbeff0c9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..0a13a54032
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustSmall.png
new file mode 100644
index 0000000000..7e9d37dfbd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustTiny.png
new file mode 100644
index 0000000000..6f56978018
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGt.png
new file mode 100644
index 0000000000..478e8009d7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingot.png
new file mode 100644
index 0000000000..21bcd00637
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/nugget.png
new file mode 100644
index 0000000000..a5300a80f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plate.png
new file mode 100644
index 0000000000..edee549ddc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stick.png
new file mode 100644
index 0000000000..3affaebc8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/FLUID/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dust.png
new file mode 100644
index 0000000000..71c0c8bcdc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustImpure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..739e33218b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustPure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..a98e8ca00b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustSmall.png
new file mode 100644
index 0000000000..4b6529c9d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..34fa7faa4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustTiny.png
new file mode 100644
index 0000000000..087fa0455e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..337a6351e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dust_OVERLAY.png
new file mode 100644
index 0000000000..a6b6349d07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGt.png
new file mode 100644
index 0000000000..038f5a5b2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGtSmall.png
new file mode 100644
index 0000000000..33fe8afb01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..711c0c670c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..e942f0f305
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gem.png
new file mode 100644
index 0000000000..842abbe942
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingot.png
new file mode 100644
index 0000000000..52da7cf46e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingot_OVERLAY.png
new file mode 100644
index 0000000000..80f9938b6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/nugget.png
new file mode 100644
index 0000000000..98cb1079fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/nugget_OVERLAY.png
new file mode 100644
index 0000000000..ca8866c85c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/oreRaw.png
new file mode 100644
index 0000000000..9934452754
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..a8a3153147
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plate.png
new file mode 100644
index 0000000000..5ddd64f82e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plate_OVERLAY.png
new file mode 100644
index 0000000000..d7f9bd982d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stick.png
new file mode 100644
index 0000000000..a65c9dbdcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stick_OVERLAY.png
new file mode 100644
index 0000000000..6f38dc4134
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadArrow.png
new file mode 100644
index 0000000000..ceb14c79db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..56ef19ad70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSword.png
new file mode 100644
index 0000000000..bad0e9522f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_HORIZONTAL/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dust.png
new file mode 100644
index 0000000000..71c0c8bcdc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustImpure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..739e33218b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustPure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..a98e8ca00b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustSmall.png
new file mode 100644
index 0000000000..4b6529c9d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..34fa7faa4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustTiny.png
new file mode 100644
index 0000000000..087fa0455e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..337a6351e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dust_OVERLAY.png
new file mode 100644
index 0000000000..a6b6349d07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGt.png
new file mode 100644
index 0000000000..038f5a5b2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGtSmall.png
new file mode 100644
index 0000000000..33fe8afb01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..711c0c670c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..e942f0f305
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gem.png
new file mode 100644
index 0000000000..703bc60d17
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingot.png
new file mode 100644
index 0000000000..52da7cf46e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingot_OVERLAY.png
new file mode 100644
index 0000000000..80f9938b6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/nugget.png
new file mode 100644
index 0000000000..98cb1079fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/nugget_OVERLAY.png
new file mode 100644
index 0000000000..ca8866c85c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/oreRaw.png
new file mode 100644
index 0000000000..9934452754
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..a8a3153147
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plate.png
new file mode 100644
index 0000000000..5ddd64f82e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plate_OVERLAY.png
new file mode 100644
index 0000000000..d7f9bd982d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stick.png
new file mode 100644
index 0000000000..a65c9dbdcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stick_OVERLAY.png
new file mode 100644
index 0000000000..6f38dc4134
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadArrow.png
new file mode 100644
index 0000000000..ceb14c79db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..56ef19ad70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSword.png
new file mode 100644
index 0000000000..bad0e9522f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GEM_VERTICAL/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dust.png
new file mode 100644
index 0000000000..71c0c8bcdc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustImpure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..739e33218b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustPure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..a98e8ca00b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustSmall.png
new file mode 100644
index 0000000000..4b6529c9d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..34fa7faa4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustTiny.png
new file mode 100644
index 0000000000..087fa0455e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..337a6351e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dust_OVERLAY.png
new file mode 100644
index 0000000000..a6b6349d07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGt.png
new file mode 100644
index 0000000000..038f5a5b2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGtSmall.png
new file mode 100644
index 0000000000..33fe8afb01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..711c0c670c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..e942f0f305
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingot.png
new file mode 100644
index 0000000000..52da7cf46e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingot_OVERLAY.png
new file mode 100644
index 0000000000..80f9938b6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/nugget.png
new file mode 100644
index 0000000000..98cb1079fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/nugget_OVERLAY.png
new file mode 100644
index 0000000000..ca8866c85c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/oreRaw.png
new file mode 100644
index 0000000000..b275591db9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plate.png
new file mode 100644
index 0000000000..5ddd64f82e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plate_OVERLAY.png
new file mode 100644
index 0000000000..d7f9bd982d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stick.png
new file mode 100644
index 0000000000..a65c9dbdcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stick_OVERLAY.png
new file mode 100644
index 0000000000..6f38dc4134
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadArrow.png
new file mode 100644
index 0000000000..ceb14c79db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..56ef19ad70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSword.png
new file mode 100644
index 0000000000..bad0e9522f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/GLASS/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dust.png
new file mode 100644
index 0000000000..10ba5066af
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustImpure.png
new file mode 100644
index 0000000000..beca06fafa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..0cb1c5950a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustPure.png
new file mode 100644
index 0000000000..beca06fafa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..df26af65b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustSmall.png
new file mode 100644
index 0000000000..9e6e2f06ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustTiny.png
new file mode 100644
index 0000000000..ea8ca1a639
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGt.png
new file mode 100644
index 0000000000..ffd9d95da6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gem.png
new file mode 100644
index 0000000000..3b621405e4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingot.png
new file mode 100644
index 0000000000..21bcd00637
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/nugget.png
new file mode 100644
index 0000000000..a5300a80f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/oreRaw.png
new file mode 100644
index 0000000000..9934452754
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..a8a3153147
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plate.png
new file mode 100644
index 0000000000..73f4196c7f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stick.png
new file mode 100644
index 0000000000..3affaebc8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LAPIS/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dust.png
new file mode 100644
index 0000000000..10ba5066af
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustImpure.png
new file mode 100644
index 0000000000..beca06fafa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..0cb1c5950a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustPure.png
new file mode 100644
index 0000000000..beca06fafa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..df26af65b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustSmall.png
new file mode 100644
index 0000000000..9e6e2f06ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustTiny.png
new file mode 100644
index 0000000000..ea8ca1a639
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGt.png
new file mode 100644
index 0000000000..785bc319ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingot.png
new file mode 100644
index 0000000000..f30243941b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/nugget.png
new file mode 100644
index 0000000000..009eeb9283
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plate.png
new file mode 100644
index 0000000000..7f4ec7a7b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stick.png
new file mode 100644
index 0000000000..3affaebc8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadArrow.png
new file mode 100644
index 0000000000..178049c530
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadAxe.png
new file mode 100644
index 0000000000..b6fd173bb7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHoe.png
new file mode 100644
index 0000000000..fac702d62d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..827a05fb95
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LEAF/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dust.png
new file mode 100644
index 0000000000..3f18950b9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustImpure.png
new file mode 100644
index 0000000000..b1b50bc4cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..8c24842eeb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustPure.png
new file mode 100644
index 0000000000..b1b50bc4cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..32ce3c66b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustSmall.png
new file mode 100644
index 0000000000..446826791b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustTiny.png
new file mode 100644
index 0000000000..ed5ab856f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGt.png
new file mode 100644
index 0000000000..ffd9d95da6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gem.png
new file mode 100644
index 0000000000..a16c02d115
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingot.png
new file mode 100644
index 0000000000..21bcd00637
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/nugget.png
new file mode 100644
index 0000000000..a5300a80f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plate.png
new file mode 100644
index 0000000000..73f4196c7f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stick.png
new file mode 100644
index 0000000000..3affaebc8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/LIGNITE/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..78580a1011
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..c9fa7ba864
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bolt_OVERLAY.png
new file mode 100644
index 0000000000..036f53807f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..399cab0e03
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cell_OVERLAY.png
new file mode 100644
index 0000000000..4c1c4c231d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..efa7147208
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..36859c14e6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..815d8393ed
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..dc21d70dbc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..8bf207a657
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..bc4e6a3696
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushed_OVERLAY.png
new file mode 100644
index 0000000000..8eeaaac6a6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dust.png
new file mode 100644
index 0000000000..03c822eac3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustImpure.png
new file mode 100644
index 0000000000..fe93e760f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..d1e58a4092
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustPure.png
new file mode 100644
index 0000000000..fe93e760f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..e15554e51f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustSmall.png
new file mode 100644
index 0000000000..d5bb41ef6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..29f9fc57d7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustTiny.png
new file mode 100644
index 0000000000..ad59c69f3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..ba94e93c1f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dust_OVERLAY.png
new file mode 100644
index 0000000000..fc495e935e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/foil_OVERLAY.png
new file mode 100644
index 0000000000..b2fb3b8588
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGt.png
new file mode 100644
index 0000000000..478e8009d7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..6b8e69e42b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..a5173895f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gem.png
new file mode 100644
index 0000000000..ceb0b83971
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..77ceec23d0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..d913ed02b0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..0d28647e52
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..4296947ad5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gem_OVERLAY.png
new file mode 100644
index 0000000000..0133a53bb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingot.png
new file mode 100644
index 0000000000..d5587b3750
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..7256ea1809
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..6c2170c8bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..b6f059c7a5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..68dab2ddc0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..c457ff86b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingot_OVERLAY.png
new file mode 100644
index 0000000000..61ecca3d1b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/lens_OVERLAY.png
new file mode 100644
index 0000000000..76e4970132
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/nugget.png
new file mode 100644
index 0000000000..e8b2eca11c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/nugget_OVERLAY.png
new file mode 100644
index 0000000000..fe0535b450
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plate.png
new file mode 100644
index 0000000000..a02670352a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..60f2dc60fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..8ea7b7fadc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..d0e81bfede
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..b77baa2565
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..22a6027267
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plate_OVERLAY.png
new file mode 100644
index 0000000000..461ab65cad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ring_OVERLAY.png
new file mode 100644
index 0000000000..7ab042ca1b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/rotor_OVERLAY.png
new file mode 100644
index 0000000000..113a658dd8
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/round_OVERLAY.png
new file mode 100644
index 0000000000..4390447472
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/screw_OVERLAY.png
new file mode 100644
index 0000000000..0952849559
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..90bc0db942
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/spring_OVERLAY.png
new file mode 100644
index 0000000000..89f0fce96a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stick.png
new file mode 100644
index 0000000000..3affaebc8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..14f58e47f0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stick_OVERLAY.png
new file mode 100644
index 0000000000..b533d59144
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..50a9347e53
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..25e139d063
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..4e32d6fb51
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..4277cfad13
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3dce52d8fd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..c2a07c0c6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..0da355ff52
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..32ea9620c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..770534aa55
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..4e32d6fb51
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..8cba198f17
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..2c279e4205
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..493e38d096
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..a4587b0d88
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..0108555625
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..49fa23c085
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..32f65302aa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..4ed1592949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/MAGNETIC/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/TURBINE_BLADE.png
new file mode 100644
index 0000000000..66a531fb80
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bolt.png
new file mode 100644
index 0000000000..c6f1bc9d38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..49d7c6a728
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dust.png
new file mode 100644
index 0000000000..03c822eac3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustImpure.png
new file mode 100644
index 0000000000..fe93e760f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..e1ef9cb02d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustPure.png
new file mode 100644
index 0000000000..fe93e760f2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..49bf00f3fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustSmall.png
new file mode 100644
index 0000000000..d5bb41ef6f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustTiny.png
new file mode 100644
index 0000000000..ad59c69f3c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGt.png
new file mode 100644
index 0000000000..478e8009d7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gem.png
new file mode 100644
index 0000000000..ceb0b83971
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingot.png
new file mode 100644
index 0000000000..de9147c2f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuadruple.png
new file mode 100644
index 0000000000..92a66d07dd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuintuple.png
new file mode 100644
index 0000000000..470f88667c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotTriple.png
new file mode 100644
index 0000000000..bed8d3a070
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/nugget.png
new file mode 100644
index 0000000000..e8b2eca11c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/oreRaw.png
new file mode 100644
index 0000000000..24e8f98813
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plate.png
new file mode 100644
index 0000000000..a02670352a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ring.png
new file mode 100644
index 0000000000..05c0edbf2e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stick.png
new file mode 100644
index 0000000000..3affaebc8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSense.png
new file mode 100644
index 0000000000..3b4c778249
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/turbineBlade.png
new file mode 100644
index 0000000000..66a531fb80
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/METALLIC/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png
new file mode 100644
index 0000000000..695607a5cd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png.mcmeta
new file mode 100644
index 0000000000..cc8a1f3c96
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites.png.mcmeta
@@ -0,0 +1 @@
+{"animation": {"frametime": 1}} \ No newline at end of file
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites_OVERLAY.png
new file mode 100644
index 0000000000..85ab4aed9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NANITES/nanites_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dust.png
new file mode 100644
index 0000000000..71c0c8bcdc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustImpure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..739e33218b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustPure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..a98e8ca00b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustSmall.png
new file mode 100644
index 0000000000..4b6529c9d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..34fa7faa4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustTiny.png
new file mode 100644
index 0000000000..087fa0455e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..337a6351e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dust_OVERLAY.png
new file mode 100644
index 0000000000..a6b6349d07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGt.png
new file mode 100644
index 0000000000..038f5a5b2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGtSmall.png
new file mode 100644
index 0000000000..33fe8afb01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..711c0c670c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..e942f0f305
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gem.png
new file mode 100644
index 0000000000..ebf2561c20
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingot.png
new file mode 100644
index 0000000000..52da7cf46e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingot_OVERLAY.png
new file mode 100644
index 0000000000..80f9938b6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/nugget.png
new file mode 100644
index 0000000000..98cb1079fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/nugget_OVERLAY.png
new file mode 100644
index 0000000000..ca8866c85c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plate.png
new file mode 100644
index 0000000000..5ddd64f82e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plate_OVERLAY.png
new file mode 100644
index 0000000000..d7f9bd982d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stick.png
new file mode 100644
index 0000000000..a65c9dbdcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stick_OVERLAY.png
new file mode 100644
index 0000000000..6f38dc4134
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadArrow.png
new file mode 100644
index 0000000000..ceb14c79db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..56ef19ad70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSword.png
new file mode 100644
index 0000000000..bad0e9522f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NETHERSTAR/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cell.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cell_OVERLAY.png
new file mode 100644
index 0000000000..6641e4677b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dust.png
new file mode 100644
index 0000000000..e000fe374f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustImpure.png
new file mode 100644
index 0000000000..5dbeff0c9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..9b4cc83142
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustPure.png
new file mode 100644
index 0000000000..5dbeff0c9d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..0a13a54032
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustSmall.png
new file mode 100644
index 0000000000..7e9d37dfbd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustTiny.png
new file mode 100644
index 0000000000..6f56978018
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGt.png
new file mode 100644
index 0000000000..478e8009d7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingot.png
new file mode 100644
index 0000000000..21bcd00637
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/nugget.png
new file mode 100644
index 0000000000..a5300a80f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plate.png
new file mode 100644
index 0000000000..edee549ddc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stick.png
new file mode 100644
index 0000000000..3affaebc8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/NONE/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dust.png
new file mode 100644
index 0000000000..71c0c8bcdc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustImpure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..739e33218b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustPure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..a98e8ca00b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustSmall.png
new file mode 100644
index 0000000000..4b6529c9d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..34fa7faa4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustTiny.png
new file mode 100644
index 0000000000..087fa0455e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..337a6351e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dust_OVERLAY.png
new file mode 100644
index 0000000000..a6b6349d07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGt.png
new file mode 100644
index 0000000000..038f5a5b2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGtSmall.png
new file mode 100644
index 0000000000..33fe8afb01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..711c0c670c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..e942f0f305
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gem_OVERLAY.png
new file mode 100644
index 0000000000..0665971d8b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingot.png
new file mode 100644
index 0000000000..52da7cf46e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingot_OVERLAY.png
new file mode 100644
index 0000000000..80f9938b6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/nugget.png
new file mode 100644
index 0000000000..98cb1079fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/nugget_OVERLAY.png
new file mode 100644
index 0000000000..ca8866c85c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/oreRaw.png
new file mode 100644
index 0000000000..9934452754
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..a8a3153147
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plate.png
new file mode 100644
index 0000000000..5ddd64f82e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plate_OVERLAY.png
new file mode 100644
index 0000000000..d7f9bd982d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stick.png
new file mode 100644
index 0000000000..a65c9dbdcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stick_OVERLAY.png
new file mode 100644
index 0000000000..6f38dc4134
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadArrow.png
new file mode 100644
index 0000000000..ceb14c79db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..56ef19ad70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSword.png
new file mode 100644
index 0000000000..bad0e9522f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/OPAL/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dust.png
new file mode 100644
index 0000000000..10ba5066af
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustImpure.png
new file mode 100644
index 0000000000..beca06fafa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..0cb1c5950a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustPure.png
new file mode 100644
index 0000000000..beca06fafa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..df26af65b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustSmall.png
new file mode 100644
index 0000000000..9e6e2f06ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustTiny.png
new file mode 100644
index 0000000000..ea8ca1a639
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGt.png
new file mode 100644
index 0000000000..ffd9d95da6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingot.png
new file mode 100644
index 0000000000..21bcd00637
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/nugget.png
new file mode 100644
index 0000000000..a5300a80f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plate.png
new file mode 100644
index 0000000000..c0e97abc9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDouble.png
new file mode 100644
index 0000000000..d3236ca8e3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuadruple.png
new file mode 100644
index 0000000000..251172a81d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..17897a1438
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuintuple.png
new file mode 100644
index 0000000000..439c1c250a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..0161ca606b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateTriple.png
new file mode 100644
index 0000000000..4089840418
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..63589e9339
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plate_OVERLAY.png
new file mode 100644
index 0000000000..21a072819c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stick.png
new file mode 100644
index 0000000000..70de8f3e35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/PAPER/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dust.png
new file mode 100644
index 0000000000..733db105e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustImpure.png
new file mode 100644
index 0000000000..172b358b98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustPure.png
new file mode 100644
index 0000000000..a03cb3ab31
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustSmall.png
new file mode 100644
index 0000000000..3386f1b69e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustTiny.png
new file mode 100644
index 0000000000..0928ef0c13
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGt.png
new file mode 100644
index 0000000000..478e8009d7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingot.png
new file mode 100644
index 0000000000..21bcd00637
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/nugget.png
new file mode 100644
index 0000000000..a5300a80f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plate.png
new file mode 100644
index 0000000000..73f4196c7f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stick.png
new file mode 100644
index 0000000000..70de8f3e35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/POWDER/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dust.png
new file mode 100644
index 0000000000..10ba5066af
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustImpure.png
new file mode 100644
index 0000000000..beca06fafa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..0cb1c5950a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustPure.png
new file mode 100644
index 0000000000..beca06fafa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..df26af65b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustSmall.png
new file mode 100644
index 0000000000..9e6e2f06ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustTiny.png
new file mode 100644
index 0000000000..ea8ca1a639
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGt.png
new file mode 100644
index 0000000000..ffd9d95da6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gem.png
new file mode 100644
index 0000000000..4d5e6bef11
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingot.png
new file mode 100644
index 0000000000..21bcd00637
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/nugget.png
new file mode 100644
index 0000000000..a5300a80f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/oreRaw.png
new file mode 100644
index 0000000000..b275591db9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plate.png
new file mode 100644
index 0000000000..73f4196c7f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stick.png
new file mode 100644
index 0000000000..70de8f3e35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/QUARTZ/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dust.png
new file mode 100644
index 0000000000..3f18950b9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustImpure.png
new file mode 100644
index 0000000000..b1b50bc4cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..8c24842eeb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustPure.png
new file mode 100644
index 0000000000..b1b50bc4cc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..32ce3c66b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustSmall.png
new file mode 100644
index 0000000000..446826791b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustTiny.png
new file mode 100644
index 0000000000..ed5ab856f9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGt.png
new file mode 100644
index 0000000000..ffd9d95da6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingot.png
new file mode 100644
index 0000000000..21bcd00637
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/nugget.png
new file mode 100644
index 0000000000..a5300a80f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plate.png
new file mode 100644
index 0000000000..73f4196c7f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stick.png
new file mode 100644
index 0000000000..70de8f3e35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/ROUGH/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dust.png
new file mode 100644
index 0000000000..71c0c8bcdc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustImpure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..739e33218b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustPure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..a98e8ca00b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustSmall.png
new file mode 100644
index 0000000000..4b6529c9d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..34fa7faa4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustTiny.png
new file mode 100644
index 0000000000..087fa0455e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..337a6351e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dust_OVERLAY.png
new file mode 100644
index 0000000000..a6b6349d07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGt.png
new file mode 100644
index 0000000000..038f5a5b2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGtSmall.png
new file mode 100644
index 0000000000..33fe8afb01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..711c0c670c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..e942f0f305
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingot.png
new file mode 100644
index 0000000000..52da7cf46e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingot_OVERLAY.png
new file mode 100644
index 0000000000..80f9938b6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/nugget.png
new file mode 100644
index 0000000000..98cb1079fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/nugget_OVERLAY.png
new file mode 100644
index 0000000000..ca8866c85c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/oreRaw.png
new file mode 100644
index 0000000000..9934452754
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..a8a3153147
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plate.png
new file mode 100644
index 0000000000..5ddd64f82e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plate_OVERLAY.png
new file mode 100644
index 0000000000..d7f9bd982d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stick.png
new file mode 100644
index 0000000000..a65c9dbdcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stick_OVERLAY.png
new file mode 100644
index 0000000000..6f38dc4134
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadArrow.png
new file mode 100644
index 0000000000..ceb14c79db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..56ef19ad70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSword.png
new file mode 100644
index 0000000000..bad0e9522f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/RUBY/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushed.png
new file mode 100644
index 0000000000..51ea3ab226
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushed_OVERLAY.png
new file mode 100644
index 0000000000..565cf31157
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dust.png
new file mode 100644
index 0000000000..10ba5066af
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustImpure.png
new file mode 100644
index 0000000000..a942cd04a7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..8b849d591e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustPure.png
new file mode 100644
index 0000000000..beca06fafa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..df26af65b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustSmall.png
new file mode 100644
index 0000000000..9e6e2f06ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustTiny.png
new file mode 100644
index 0000000000..ea8ca1a639
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGt.png
new file mode 100644
index 0000000000..ffd9d95da6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingot.png
new file mode 100644
index 0000000000..21bcd00637
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/nugget.png
new file mode 100644
index 0000000000..a5300a80f6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plate.png
new file mode 100644
index 0000000000..73f4196c7f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stick.png
new file mode 100644
index 0000000000..70de8f3e35
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadArrow.png
new file mode 100644
index 0000000000..e4e8337837
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SAND/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dust.png
new file mode 100644
index 0000000000..71c0c8bcdc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustImpure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..739e33218b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustPure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..a98e8ca00b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustSmall.png
new file mode 100644
index 0000000000..4b6529c9d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..34fa7faa4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustTiny.png
new file mode 100644
index 0000000000..087fa0455e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..337a6351e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dust_OVERLAY.png
new file mode 100644
index 0000000000..a6b6349d07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGt.png
new file mode 100644
index 0000000000..038f5a5b2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGtSmall.png
new file mode 100644
index 0000000000..33fe8afb01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..711c0c670c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..e942f0f305
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gem.png
new file mode 100644
index 0000000000..3c4fe72b7b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingot.png
new file mode 100644
index 0000000000..52da7cf46e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingot_OVERLAY.png
new file mode 100644
index 0000000000..80f9938b6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/nugget.png
new file mode 100644
index 0000000000..98cb1079fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/nugget_OVERLAY.png
new file mode 100644
index 0000000000..ca8866c85c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/oreRaw.png
new file mode 100644
index 0000000000..9934452754
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..a8a3153147
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plate.png
new file mode 100644
index 0000000000..5ddd64f82e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plate_OVERLAY.png
new file mode 100644
index 0000000000..d7f9bd982d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stick.png
new file mode 100644
index 0000000000..a65c9dbdcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stick_OVERLAY.png
new file mode 100644
index 0000000000..6f38dc4134
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadArrow.png
new file mode 100644
index 0000000000..ceb14c79db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..56ef19ad70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSword.png
new file mode 100644
index 0000000000..bad0e9522f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHARDS/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dust.png
new file mode 100644
index 0000000000..71c0c8bcdc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustImpure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..739e33218b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustPure.png
new file mode 100644
index 0000000000..5e2982ab8c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..a98e8ca00b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustSmall.png
new file mode 100644
index 0000000000..4b6529c9d9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..34fa7faa4c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustTiny.png
new file mode 100644
index 0000000000..087fa0455e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..337a6351e2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dust_OVERLAY.png
new file mode 100644
index 0000000000..a6b6349d07
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGt.png
new file mode 100644
index 0000000000..038f5a5b2a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGtSmall.png
new file mode 100644
index 0000000000..33fe8afb01
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..711c0c670c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..e942f0f305
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingot.png
new file mode 100644
index 0000000000..52da7cf46e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingot_OVERLAY.png
new file mode 100644
index 0000000000..80f9938b6a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/nugget.png
new file mode 100644
index 0000000000..98cb1079fe
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/nugget_OVERLAY.png
new file mode 100644
index 0000000000..ca8866c85c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/oreRaw.png
new file mode 100644
index 0000000000..b275591db9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plate.png
new file mode 100644
index 0000000000..5ddd64f82e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plate_OVERLAY.png
new file mode 100644
index 0000000000..d7f9bd982d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stick.png
new file mode 100644
index 0000000000..a65c9dbdcc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stick_OVERLAY.png
new file mode 100644
index 0000000000..6f38dc4134
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadArrow.png
new file mode 100644
index 0000000000..ceb14c79db
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..56ef19ad70
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSword.png
new file mode 100644
index 0000000000..bad0e9522f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/SHINY/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/TURBINE_BLADE.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/TURBINE_BLADE.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/TURBINE_BLADE.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/TURBINE_BLADE_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/TURBINE_BLADE_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/TURBINE_BLADE_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtPlastic.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtPlastic.png
new file mode 100644
index 0000000000..8e48ac3221
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtPlastic.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtPlastic_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtPlastic_OVERLAY.png
new file mode 100644
index 0000000000..a73713bc81
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtPlastic_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtWood.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtWood.png
new file mode 100644
index 0000000000..91e79c0c16
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtWood.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtWood_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtWood_OVERLAY.png
new file mode 100644
index 0000000000..ade96a1afd
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/arrowGtWood_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bolt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bolt.png
new file mode 100644
index 0000000000..8675564a9b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bolt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bolt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bolt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/bolt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/casingSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/casingSmall.png
new file mode 100644
index 0000000000..0ae8c53df3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/casingSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/casingSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/casingSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/casingSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cell.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cell.png
new file mode 100644
index 0000000000..2c648439be
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cell.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cellPlasma.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cellPlasma.png
new file mode 100644
index 0000000000..f3f842a448
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cellPlasma.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cellPlasma_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cellPlasma_OVERLAY.png
new file mode 100644
index 0000000000..c005544fb3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cellPlasma_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cell_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cell_OVERLAY.png
new file mode 100644
index 0000000000..b1b7026758
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/cell_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtDust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtDust.png
new file mode 100644
index 0000000000..172796fb6d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtDust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtDust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtDust_OVERLAY.png
new file mode 100644
index 0000000000..5e0cb2b1f5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtDust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtGem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtGem.png
new file mode 100644
index 0000000000..b4cbdaa27b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtGem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtGem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtGem_OVERLAY.png
new file mode 100644
index 0000000000..9798a597e0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtGem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtIngot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtIngot.png
new file mode 100644
index 0000000000..ddffd15f9f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtIngot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtIngot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtIngot_OVERLAY.png
new file mode 100644
index 0000000000..2d4bfa3301
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtIngot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtPlate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtPlate.png
new file mode 100644
index 0000000000..e9ff728884
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtPlate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtPlate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtPlate_OVERLAY.png
new file mode 100644
index 0000000000..e548ad1eb0
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crateGtPlate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushed.png
new file mode 100644
index 0000000000..c8b0566229
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedCentrifuged.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedCentrifuged.png
new file mode 100644
index 0000000000..77cb22c298
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedCentrifuged.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedCentrifuged_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedCentrifuged_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedCentrifuged_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedPurified.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedPurified.png
new file mode 100644
index 0000000000..13fde84042
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedPurified.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedPurified_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedPurified_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushedPurified_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushed_OVERLAY.png
new file mode 100644
index 0000000000..6122912d36
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/crushed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dust.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dust.png
new file mode 100644
index 0000000000..10ba5066af
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dust.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustImpure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustImpure.png
new file mode 100644
index 0000000000..beca06fafa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustImpure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustImpure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustImpure_OVERLAY.png
new file mode 100644
index 0000000000..0cb1c5950a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustImpure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustPure.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustPure.png
new file mode 100644
index 0000000000..beca06fafa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustPure.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustPure_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustPure_OVERLAY.png
new file mode 100644
index 0000000000..df26af65b6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustPure_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustSmall.png
new file mode 100644
index 0000000000..9e6e2f06ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustTiny.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustTiny.png
new file mode 100644
index 0000000000..ea8ca1a639
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustTiny.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustTiny_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustTiny_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dustTiny_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dust_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dust_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/dust_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/foil.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/foil.png
new file mode 100644
index 0000000000..326e3fee64
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/foil.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/foil_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/foil_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/foil_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGt.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGt.png
new file mode 100644
index 0000000000..785bc319ab
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGtSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGtSmall.png
new file mode 100644
index 0000000000..2a3485a8b7
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGtSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGtSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGtSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGtSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGt_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGt_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gearGt_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gem.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gem.png
new file mode 100644
index 0000000000..8b6205df59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gem.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemChipped.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemChipped.png
new file mode 100644
index 0000000000..c422cad6c9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemChipped.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemChipped_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemChipped_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemChipped_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemExquisite.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemExquisite.png
new file mode 100644
index 0000000000..d034b89b9a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemExquisite.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemExquisite_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemExquisite_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemExquisite_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawed.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawed.png
new file mode 100644
index 0000000000..f8989e40a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawed.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawed_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawed_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawed_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawless.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawless.png
new file mode 100644
index 0000000000..442b427525
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawless.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawless_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawless_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gemFlawless_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gem_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gem_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/gem_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/handleMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/handleMallet.png
new file mode 100644
index 0000000000..b3bc43008f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/handleMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/handleMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/handleMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/handleMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingot.png
new file mode 100644
index 0000000000..f53641ee09
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotDouble.png
new file mode 100644
index 0000000000..48ef0d0918
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotHot.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotHot.png
new file mode 100644
index 0000000000..32ca073276
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotHot.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotHot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotHot_OVERLAY.png
new file mode 100644
index 0000000000..68fcc1943b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotHot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuadruple.png
new file mode 100644
index 0000000000..4a26839a7d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuintuple.png
new file mode 100644
index 0000000000..59219ca243
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotTriple.png
new file mode 100644
index 0000000000..a2cd141bb9
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingotTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingot_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingot_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ingot_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/lens.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/lens.png
new file mode 100644
index 0000000000..7ab6c60949
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/lens.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/lens_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/lens_OVERLAY.png
new file mode 100644
index 0000000000..09e76dbfe2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/lens_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/nugget.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/nugget.png
new file mode 100644
index 0000000000..009eeb9283
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/nugget.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/nugget_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/nugget_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/nugget_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/oreRaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/oreRaw.png
new file mode 100644
index 0000000000..d62139a374
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/oreRaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/oreRaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/oreRaw_OVERLAY.png
new file mode 100644
index 0000000000..fbc3a6800e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/oreRaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plate.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plate.png
new file mode 100644
index 0000000000..1e97134d33
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plate.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDense.png
new file mode 100644
index 0000000000..3a17e83f0f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDouble.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDouble.png
new file mode 100644
index 0000000000..d46023dcda
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDouble.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDouble_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDouble_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateDouble_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuadruple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuadruple.png
new file mode 100644
index 0000000000..872401dc98
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuadruple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuadruple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuadruple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuadruple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuintuple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuintuple.png
new file mode 100644
index 0000000000..eb963e8428
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuintuple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuintuple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuintuple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateQuintuple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateTriple.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateTriple.png
new file mode 100644
index 0000000000..78413ccec6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateTriple.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateTriple_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateTriple_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plateTriple_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plate_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plate_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/plate_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ring.png
new file mode 100644
index 0000000000..eb9dfd5e21
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ring_OVERLAY.png
new file mode 100644
index 0000000000..42e51ff9a4
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/ring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/rotor.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/rotor.png
new file mode 100644
index 0000000000..cf9edb95a3
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/rotor.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/rotor_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/rotor_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/rotor_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/round.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/round.png
new file mode 100644
index 0000000000..9cfe5ed454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/round.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/round_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/round_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/round_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/screw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/screw.png
new file mode 100644
index 0000000000..27fdd9897d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/screw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/screw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/screw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/screw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/spring.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/spring.png
new file mode 100644
index 0000000000..043a081e54
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/spring.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/springSmall.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/springSmall.png
new file mode 100644
index 0000000000..4ac8b82482
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/springSmall.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/springSmall_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/springSmall_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/springSmall_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/spring_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/spring_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/spring_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stick.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stick.png
new file mode 100644
index 0000000000..3affaebc8d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stick.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stickLong.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stickLong.png
new file mode 100644
index 0000000000..397f5c7860
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stickLong.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stickLong_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stickLong_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stickLong_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stick_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stick_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/stick_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadArrow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadArrow.png
new file mode 100644
index 0000000000..8b4dee664d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadArrow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadArrow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadArrow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadArrow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadAxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadAxe.png
new file mode 100644
index 0000000000..4248c5c2b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadAxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadAxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadAxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadAxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadBuzzSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadBuzzSaw.png
new file mode 100644
index 0000000000..c895aedb82
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadBuzzSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadBuzzSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadBuzzSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadBuzzSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadChainsaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadChainsaw.png
new file mode 100644
index 0000000000..d37cb15de5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadChainsaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadChainsaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadChainsaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadChainsaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadDrill.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadDrill.png
new file mode 100644
index 0000000000..3d60e1d492
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadDrill.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadDrill_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadDrill_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadDrill_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadFile.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadFile.png
new file mode 100644
index 0000000000..228540305b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadFile.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadFile_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadFile_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadFile_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHammer.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHammer.png
new file mode 100644
index 0000000000..93b3c490ad
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHammer.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHammer_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHammer_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHammer_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHoe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHoe.png
new file mode 100644
index 0000000000..0d4de3d3dc
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHoe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHoe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHoe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadHoe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadMallet.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadMallet.png
new file mode 100644
index 0000000000..fffb356076
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadMallet.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadMallet_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadMallet_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadMallet_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPickaxe.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPickaxe.png
new file mode 100644
index 0000000000..0414f9ca59
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPickaxe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPickaxe_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPickaxe_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPickaxe_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPlow.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPlow.png
new file mode 100644
index 0000000000..950f85bbaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPlow.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPlow_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPlow_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadPlow_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSaw.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSaw.png
new file mode 100644
index 0000000000..acfee88d87
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSaw.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSaw_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSaw_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSaw_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadScrewdriver.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadScrewdriver.png
new file mode 100644
index 0000000000..a4f9a32178
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadScrewdriver.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadScrewdriver_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadScrewdriver_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadScrewdriver_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSense.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSense.png
new file mode 100644
index 0000000000..06a7479e5f
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSense.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSense_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSense_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSense_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadShovel.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadShovel.png
new file mode 100644
index 0000000000..809d6a4c60
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadShovel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadShovel_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadShovel_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadShovel_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSoldering.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSoldering.png
new file mode 100644
index 0000000000..a2a8c1247e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSoldering.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSoldering_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSoldering_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSoldering_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSword.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSword.png
new file mode 100644
index 0000000000..3beaf35145
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSword.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSword_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSword_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadSword_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadUniversalSpade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadUniversalSpade.png
new file mode 100644
index 0000000000..44f757c26c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadUniversalSpade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadUniversalSpade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadUniversalSpade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadUniversalSpade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadWrench.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadWrench.png
new file mode 100644
index 0000000000..2b57021b38
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadWrench.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadWrench_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadWrench_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/toolHeadWrench_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/turbineBlade.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/turbineBlade.png
new file mode 100644
index 0000000000..a4a6bd742d
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/turbineBlade.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/turbineBlade_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/turbineBlade_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/turbineBlade_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/void.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/void.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/void.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/void_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/void_OVERLAY.png
new file mode 100644
index 0000000000..3f0d6efcac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/void_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/wireFine.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/wireFine.png
new file mode 100644
index 0000000000..02a11461ac
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/wireFine.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/wireFine_OVERLAY.png b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/wireFine_OVERLAY.png
new file mode 100644
index 0000000000..094b5d076a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/items/materialicons/WOOD/wireFine_OVERLAY.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/model/drone.obj b/src/main/resources/assets/gregtech/textures/model/drone.obj
new file mode 100644
index 0000000000..bcdaf44454
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/model/drone.obj
@@ -0,0 +1,3836 @@
+# Blender 3.6.5
+# www.blender.org
+mtllib d1.mtl
+o blade1
+v 0.321540 1.128201 -1.028646
+v 0.319121 1.137597 -1.026228
+v 1.026228 1.162403 -0.319121
+v 1.028646 1.171799 -0.321539
+v 0.387986 1.162403 -1.095093
+v 0.385567 1.171799 -1.092674
+v 1.092674 1.128201 -0.385567
+v 1.095093 1.137597 -0.387986
+v 0.885290 1.155562 -0.461026
+v 0.744352 1.148722 -0.602931
+v 0.603415 1.141881 -0.744836
+v 0.462477 1.135041 -0.886741
+v 0.461026 1.144438 -0.885290
+v 0.602931 1.151278 -0.744352
+v 0.744836 1.158119 -0.603415
+v 0.886741 1.164959 -0.462477
+v 0.528924 1.155562 -0.953187
+v 0.669861 1.148722 -0.811282
+v 0.810799 1.141881 -0.669377
+v 0.951736 1.135041 -0.527472
+v 0.953188 1.144438 -0.528923
+v 0.811283 1.151278 -0.669861
+v 0.669378 1.158119 -0.810799
+v 0.527472 1.164959 -0.951736
+vn -0.6936 0.2133 0.6880
+vn 0.7071 -0.0000 0.7071
+vn 0.6936 0.2134 -0.6880
+vn -0.7071 -0.0000 -0.7071
+vn 0.1277 -0.9765 -0.1739
+vn -0.1739 0.9765 0.1277
+vn 0.2182 0.9392 -0.2652
+vn 0.1266 0.9764 -0.1749
+vn 0.0270 0.9968 -0.0756
+vn -0.0752 0.9968 0.0274
+vn -0.2652 -0.9392 0.2182
+vn -0.1749 -0.9764 0.1266
+vn -0.0756 -0.9968 0.0270
+vn 0.0274 -0.9968 -0.0752
+vn 0.6538 -0.3421 -0.6749
+vn 0.6833 -0.2134 -0.6983
+vn 0.7011 -0.0726 -0.7094
+vn 0.7046 0.0725 -0.7059
+vn -0.6538 -0.3420 0.6749
+vn -0.6833 -0.2133 0.6983
+vn -0.7011 -0.0726 0.7094
+vn -0.7046 0.0726 0.7059
+vn -0.2182 0.9392 0.2652
+vn -0.1266 0.9764 0.1749
+vn -0.0270 0.9968 0.0756
+vn 0.0752 0.9968 -0.0274
+vn 0.1739 0.9765 -0.1277
+vn 0.2652 -0.9392 -0.2182
+vn 0.1749 -0.9764 -0.1266
+vn 0.0756 -0.9968 -0.0270
+vn -0.0274 -0.9968 0.0752
+vn -0.1277 -0.9765 0.1739
+vn -0.6749 0.3420 0.6539
+vn -0.6983 0.2133 0.6833
+vn -0.7094 0.0726 0.7011
+vn -0.7059 -0.0726 0.7046
+vn -0.6880 -0.2133 0.6936
+vn 0.6749 0.3421 -0.6538
+vn 0.6983 0.2134 -0.6833
+vn 0.7094 0.0725 -0.7011
+vn 0.7059 -0.0726 -0.7046
+vn 0.6880 -0.2134 -0.6936
+vn -0.7071 -0.0001 -0.7071
+vt 0.171027 0.845592
+vt 0.180875 0.796350
+vt 0.171027 0.796350
+vt 0.180875 0.845592
+vt 0.230117 0.845592
+vt 0.269511 0.845592
+vt 0.279359 0.796350
+vt 0.269511 0.796350
+vt 0.279359 0.845592
+vt 0.328601 0.845592
+vt 0.269511 0.894834
+vt 0.279359 0.747108
+vt 0.269511 0.747108
+vt 0.230117 0.796350
+vt 0.239965 0.747108
+vt 0.230117 0.747108
+vt 0.239965 0.796350
+vt 0.249814 0.747108
+vt 0.249814 0.796350
+vt 0.259662 0.747108
+vt 0.259662 0.796350
+vt 0.230117 0.894834
+vt 0.239965 0.845592
+vt 0.239965 0.894834
+vt 0.249814 0.845592
+vt 0.249814 0.894834
+vt 0.259662 0.845592
+vt 0.259662 0.894834
+vt 0.131634 0.845592
+vt 0.141482 0.796350
+vt 0.131634 0.796350
+vt 0.141482 0.845592
+vt 0.151330 0.796350
+vt 0.151330 0.845592
+vt 0.161179 0.796350
+vt 0.161179 0.845592
+vt 0.279359 0.894834
+vt 0.328601 0.796350
+s 0
+usemtl Material.002
+f 9/1/1 4/2/1 16/3/1
+f 4/2/2 3/4/2 7/5/2
+f 17/6/3 6/7/3 24/8/3
+f 6/7/4 5/9/4 1/10/4
+f 12/11/5 5/9/5 17/6/5
+f 24/8/6 2/12/6 13/13/6
+f 8/14/7 16/15/7 4/16/7
+f 21/17/8 15/18/8 16/15/8
+f 22/19/9 14/20/9 15/18/9
+f 23/21/10 13/13/10 14/20/10
+f 3/22/11 20/23/11 7/5/11
+f 9/24/12 19/25/12 20/23/12
+f 10/26/13 18/27/13 19/25/13
+f 11/28/14 17/6/14 18/27/14
+f 7/5/15 21/17/15 8/14/15
+f 20/23/16 22/19/16 21/17/16
+f 19/25/17 23/21/17 22/19/17
+f 18/27/18 24/8/18 23/21/18
+f 1/29/19 13/30/19 2/31/19
+f 12/32/20 14/33/20 13/30/20
+f 11/34/21 15/35/21 14/33/21
+f 10/36/22 16/3/22 15/35/22
+f 6/7/23 2/12/23 24/8/23
+f 24/8/24 13/13/24 23/21/24
+f 23/21/25 14/20/25 22/19/25
+f 22/19/26 15/18/26 21/17/26
+f 21/17/27 16/15/27 8/14/27
+f 1/37/28 5/9/28 12/11/28
+f 12/11/29 17/6/29 11/28/29
+f 11/28/30 18/27/30 10/26/30
+f 10/26/31 19/25/31 9/24/31
+f 9/24/32 20/23/32 3/22/32
+f 3/4/33 4/2/33 9/1/33
+f 9/1/34 16/3/34 10/36/34
+f 10/36/35 15/35/35 11/34/35
+f 11/34/36 14/33/36 12/32/36
+f 12/32/37 13/30/37 1/29/37
+f 5/9/38 6/7/38 17/6/38
+f 17/6/39 24/8/39 18/27/39
+f 18/27/40 23/21/40 19/25/40
+f 19/25/41 22/19/41 20/23/41
+f 20/23/42 21/17/42 7/5/42
+f 4/2/2 7/5/2 8/14/2
+f 6/7/43 1/10/43 2/38/43
+o blade2
+v -0.321540 1.128201 -1.028646
+v -0.319121 1.137597 -1.026228
+v -1.026228 1.162403 -0.319121
+v -1.028646 1.171799 -0.321539
+v -0.387986 1.162403 -1.095093
+v -0.385567 1.171799 -1.092674
+v -1.092674 1.128201 -0.385567
+v -1.095093 1.137597 -0.387986
+v -0.885290 1.155562 -0.461026
+v -0.744352 1.148722 -0.602931
+v -0.603415 1.141881 -0.744836
+v -0.462477 1.135041 -0.886741
+v -0.461026 1.144438 -0.885290
+v -0.602931 1.151278 -0.744352
+v -0.744836 1.158119 -0.603415
+v -0.886741 1.164959 -0.462477
+v -0.528924 1.155562 -0.953187
+v -0.669861 1.148722 -0.811282
+v -0.810799 1.141881 -0.669377
+v -0.951736 1.135041 -0.527472
+v -0.953188 1.144438 -0.528923
+v -0.811283 1.151278 -0.669861
+v -0.669378 1.158119 -0.810799
+v -0.527472 1.164959 -0.951736
+vn 0.6936 0.2133 0.6880
+vn -0.7071 -0.0000 0.7071
+vn -0.6936 0.2134 -0.6880
+vn 0.7071 -0.0000 -0.7071
+vn -0.1277 -0.9765 -0.1739
+vn 0.1739 0.9765 0.1277
+vn -0.2182 0.9392 -0.2652
+vn -0.1266 0.9764 -0.1749
+vn -0.0270 0.9968 -0.0756
+vn 0.0752 0.9968 0.0274
+vn 0.2652 -0.9392 0.2182
+vn 0.1749 -0.9764 0.1266
+vn 0.0756 -0.9968 0.0270
+vn -0.0274 -0.9968 -0.0752
+vn -0.6538 -0.3421 -0.6749
+vn -0.6833 -0.2134 -0.6983
+vn -0.7011 -0.0726 -0.7094
+vn -0.7046 0.0725 -0.7059
+vn 0.6538 -0.3420 0.6749
+vn 0.6833 -0.2133 0.6983
+vn 0.7011 -0.0726 0.7094
+vn 0.7046 0.0726 0.7059
+vn 0.2182 0.9392 0.2652
+vn 0.1266 0.9764 0.1749
+vn 0.0270 0.9968 0.0756
+vn -0.0752 0.9968 -0.0274
+vn -0.1739 0.9765 -0.1277
+vn -0.2652 -0.9392 -0.2182
+vn -0.1749 -0.9764 -0.1266
+vn -0.0756 -0.9968 -0.0270
+vn 0.0274 -0.9968 0.0752
+vn 0.1277 -0.9765 0.1739
+vn 0.6749 0.3420 0.6539
+vn 0.6983 0.2133 0.6833
+vn 0.7094 0.0726 0.7011
+vn 0.7059 -0.0726 0.7046
+vn 0.6880 -0.2133 0.6936
+vn -0.6749 0.3421 -0.6538
+vn -0.6983 0.2134 -0.6833
+vn -0.7094 0.0725 -0.7011
+vn -0.7059 -0.0726 -0.7046
+vn -0.6880 -0.2134 -0.6936
+vn 0.7071 -0.0001 -0.7071
+vt 0.863184 0.471780
+vt 0.912426 0.471780
+vt 0.912426 0.481629
+vt 0.863184 0.530870
+vt 0.863184 0.481629
+vt 0.863184 0.570264
+vt 0.912426 0.570264
+vt 0.912426 0.580112
+vt 0.863184 0.629354
+vt 0.863184 0.580112
+vt 0.813942 0.570264
+vt 0.961668 0.570264
+vt 0.961668 0.580112
+vt 0.912426 0.530870
+vt 0.961668 0.530870
+vt 0.961668 0.540719
+vt 0.912426 0.540719
+vt 0.961668 0.550567
+vt 0.912426 0.550567
+vt 0.961668 0.560415
+vt 0.912426 0.560415
+vt 0.813942 0.530870
+vt 0.863184 0.540719
+vt 0.813942 0.540719
+vt 0.863184 0.550567
+vt 0.813942 0.550567
+vt 0.863184 0.560416
+vt 0.813942 0.560415
+vt 0.863184 0.432387
+vt 0.912426 0.432387
+vt 0.912426 0.442235
+vt 0.863184 0.442235
+vt 0.912426 0.452084
+vt 0.863184 0.452084
+vt 0.912426 0.461932
+vt 0.863184 0.461932
+vt 0.813942 0.580112
+vt 0.912426 0.629354
+s 0
+usemtl Material.003
+f 33/39/44 40/40/44 28/41/44
+f 28/41/45 31/42/45 27/43/45
+f 41/44/46 48/45/46 30/46/46
+f 30/46/47 25/47/47 29/48/47
+f 36/49/48 41/44/48 29/48/48
+f 48/45/49 37/50/49 26/51/49
+f 32/52/50 28/53/50 40/54/50
+f 45/55/51 40/54/51 39/56/51
+f 46/57/52 39/56/52 38/58/52
+f 47/59/53 38/58/53 37/50/53
+f 27/60/54 31/42/54 44/61/54
+f 33/62/55 44/61/55 43/63/55
+f 34/64/56 43/63/56 42/65/56
+f 35/66/57 42/65/57 41/44/57
+f 31/42/58 32/52/58 45/55/58
+f 44/61/59 45/55/59 46/57/59
+f 43/63/60 46/57/60 47/59/60
+f 42/65/61 47/59/61 48/45/61
+f 25/67/62 26/68/62 37/69/62
+f 36/70/63 37/69/63 38/71/63
+f 35/72/64 38/71/64 39/73/64
+f 34/74/65 39/73/65 40/40/65
+f 30/46/66 48/45/66 26/51/66
+f 48/45/67 47/59/67 37/50/67
+f 47/59/68 46/57/68 38/58/68
+f 46/57/69 45/55/69 39/56/69
+f 45/55/70 32/52/70 40/54/70
+f 25/75/71 36/49/71 29/48/71
+f 36/49/72 35/66/72 41/44/72
+f 35/66/73 34/64/73 42/65/73
+f 34/64/74 33/62/74 43/63/74
+f 33/62/75 27/60/75 44/61/75
+f 27/43/76 33/39/76 28/41/76
+f 33/39/77 34/74/77 40/40/77
+f 34/74/78 35/72/78 39/73/78
+f 35/72/79 36/70/79 38/71/79
+f 36/70/80 25/67/80 37/69/80
+f 29/48/81 41/44/81 30/46/81
+f 41/44/82 42/65/82 48/45/82
+f 42/65/83 43/63/83 47/59/83
+f 43/63/84 44/61/84 46/57/84
+f 44/61/85 31/42/85 45/55/85
+f 28/41/45 32/52/45 31/42/45
+f 30/46/86 26/76/86 25/47/86
+o blade3
+v -0.321540 1.128201 1.028646
+v -0.319121 1.137597 1.026228
+v -1.026228 1.162403 0.319121
+v -1.028646 1.171799 0.321539
+v -0.387986 1.162403 1.095093
+v -0.385567 1.171799 1.092674
+v -1.092674 1.128201 0.385567
+v -1.095093 1.137597 0.387986
+v -0.885290 1.155562 0.461026
+v -0.744352 1.148722 0.602931
+v -0.603415 1.141881 0.744836
+v -0.462477 1.135041 0.886741
+v -0.461026 1.144438 0.885290
+v -0.602931 1.151278 0.744352
+v -0.744836 1.158119 0.603415
+v -0.886741 1.164959 0.462477
+v -0.528924 1.155562 0.953187
+v -0.669861 1.148722 0.811282
+v -0.810799 1.141881 0.669377
+v -0.951736 1.135041 0.527472
+v -0.953188 1.144438 0.528923
+v -0.811283 1.151278 0.669861
+v -0.669378 1.158119 0.810799
+v -0.527472 1.164959 0.951736
+vn 0.6936 0.2133 -0.6880
+vn -0.7071 -0.0000 -0.7071
+vn -0.6936 0.2134 0.6880
+vn 0.7071 -0.0000 0.7071
+vn -0.1277 -0.9765 0.1739
+vn 0.1739 0.9765 -0.1277
+vn -0.2182 0.9392 0.2652
+vn -0.1266 0.9764 0.1749
+vn -0.0270 0.9968 0.0756
+vn 0.0752 0.9968 -0.0274
+vn 0.2652 -0.9392 -0.2182
+vn 0.1749 -0.9764 -0.1266
+vn 0.0756 -0.9968 -0.0270
+vn -0.0274 -0.9968 0.0752
+vn -0.6538 -0.3421 0.6749
+vn -0.6833 -0.2134 0.6983
+vn -0.7011 -0.0726 0.7094
+vn -0.7046 0.0725 0.7059
+vn 0.6538 -0.3420 -0.6749
+vn 0.6833 -0.2133 -0.6983
+vn 0.7011 -0.0726 -0.7094
+vn 0.7046 0.0726 -0.7059
+vn 0.2182 0.9392 -0.2652
+vn 0.1266 0.9764 -0.1749
+vn 0.0270 0.9968 -0.0756
+vn -0.0752 0.9968 0.0274
+vn -0.1739 0.9765 0.1277
+vn -0.2652 -0.9392 0.2182
+vn -0.1749 -0.9764 0.1266
+vn -0.0756 -0.9968 0.0270
+vn 0.0274 -0.9968 -0.0752
+vn 0.1277 -0.9765 -0.1739
+vn 0.6749 0.3420 -0.6539
+vn 0.6983 0.2133 -0.6833
+vn 0.7094 0.0726 -0.7011
+vn 0.7059 -0.0726 -0.7046
+vn 0.6880 -0.2133 -0.6936
+vn -0.6749 0.3421 0.6538
+vn -0.6983 0.2134 0.6833
+vn -0.7094 0.0725 0.7011
+vn -0.7059 -0.0726 0.7046
+vn -0.6880 -0.2134 0.6936
+vn 0.7071 -0.0001 0.7071
+vt 0.807171 0.833480
+vt 0.797323 0.882722
+vt 0.807171 0.882722
+vt 0.797323 0.833480
+vt 0.748081 0.833480
+vt 0.708688 0.833480
+vt 0.698839 0.882722
+vt 0.708688 0.882722
+vt 0.698839 0.833480
+vt 0.649598 0.833480
+vt 0.708688 0.784238
+vt 0.698839 0.931964
+vt 0.708688 0.931964
+vt 0.748081 0.882722
+vt 0.738233 0.931964
+vt 0.748081 0.931964
+vt 0.738233 0.882722
+vt 0.728384 0.931964
+vt 0.728384 0.882722
+vt 0.718536 0.931964
+vt 0.718536 0.882722
+vt 0.748081 0.784238
+vt 0.738233 0.833480
+vt 0.738233 0.784238
+vt 0.728384 0.833480
+vt 0.728384 0.784238
+vt 0.718536 0.833480
+vt 0.718536 0.784238
+vt 0.846565 0.833480
+vt 0.836716 0.882722
+vt 0.846565 0.882722
+vt 0.836716 0.833480
+vt 0.826868 0.882722
+vt 0.826868 0.833480
+vt 0.817020 0.882722
+vt 0.817020 0.833480
+vt 0.698839 0.784238
+vt 0.649598 0.882722
+s 0
+usemtl Material.004
+f 57/77/87 52/78/87 64/79/87
+f 52/78/88 51/80/88 55/81/88
+f 65/82/89 54/83/89 72/84/89
+f 54/83/90 53/85/90 49/86/90
+f 60/87/91 53/85/91 65/82/91
+f 72/84/92 50/88/92 61/89/92
+f 56/90/93 64/91/93 52/92/93
+f 69/93/94 63/94/94 64/91/94
+f 70/95/95 62/96/95 63/94/95
+f 71/97/96 61/89/96 62/96/96
+f 51/98/97 68/99/97 55/81/97
+f 57/100/98 67/101/98 68/99/98
+f 58/102/99 66/103/99 67/101/99
+f 59/104/100 65/82/100 66/103/100
+f 55/81/101 69/93/101 56/90/101
+f 68/99/102 70/95/102 69/93/102
+f 67/101/103 71/97/103 70/95/103
+f 66/103/104 72/84/104 71/97/104
+f 49/105/105 61/106/105 50/107/105
+f 60/108/106 62/109/106 61/106/106
+f 59/110/107 63/111/107 62/109/107
+f 58/112/108 64/79/108 63/111/108
+f 54/83/109 50/88/109 72/84/109
+f 72/84/110 61/89/110 71/97/110
+f 71/97/111 62/96/111 70/95/111
+f 70/95/112 63/94/112 69/93/112
+f 69/93/113 64/91/113 56/90/113
+f 49/113/114 53/85/114 60/87/114
+f 60/87/115 65/82/115 59/104/115
+f 59/104/116 66/103/116 58/102/116
+f 58/102/117 67/101/117 57/100/117
+f 57/100/118 68/99/118 51/98/118
+f 51/80/119 52/78/119 57/77/119
+f 57/77/120 64/79/120 58/112/120
+f 58/112/121 63/111/121 59/110/121
+f 59/110/122 62/109/122 60/108/122
+f 60/108/123 61/106/123 49/105/123
+f 53/85/124 54/83/124 65/82/124
+f 65/82/125 72/84/125 66/103/125
+f 66/103/126 71/97/126 67/101/126
+f 67/101/127 70/95/127 68/99/127
+f 68/99/128 69/93/128 55/81/128
+f 52/78/88 55/81/88 56/90/88
+f 54/83/129 49/86/129 50/114/129
+o blade4
+v 0.321540 1.128201 1.028646
+v 0.319121 1.137597 1.026228
+v 1.026228 1.162403 0.319121
+v 1.028646 1.171799 0.321539
+v 0.387986 1.162403 1.095093
+v 0.385567 1.171799 1.092674
+v 1.092674 1.128201 0.385567
+v 1.095093 1.137597 0.387986
+v 0.885290 1.155562 0.461026
+v 0.744352 1.148722 0.602931
+v 0.603415 1.141881 0.744836
+v 0.462477 1.135041 0.886741
+v 0.461026 1.144438 0.885290
+v 0.602931 1.151278 0.744352
+v 0.744836 1.158119 0.603415
+v 0.886741 1.164959 0.462477
+v 0.528924 1.155562 0.953187
+v 0.669861 1.148722 0.811282
+v 0.810799 1.141881 0.669377
+v 0.951736 1.135041 0.527472
+v 0.953188 1.144438 0.528923
+v 0.811283 1.151278 0.669861
+v 0.669378 1.158119 0.810799
+v 0.527472 1.164959 0.951736
+vn -0.6936 0.2133 -0.6880
+vn 0.7071 -0.0000 -0.7071
+vn 0.6936 0.2134 0.6880
+vn -0.7071 -0.0000 0.7071
+vn 0.1277 -0.9765 0.1739
+vn -0.1739 0.9765 -0.1277
+vn 0.2182 0.9392 0.2652
+vn 0.1266 0.9764 0.1749
+vn 0.0270 0.9968 0.0756
+vn -0.0752 0.9968 -0.0274
+vn -0.2652 -0.9392 -0.2182
+vn -0.1749 -0.9764 -0.1266
+vn -0.0756 -0.9968 -0.0270
+vn 0.0274 -0.9968 0.0752
+vn 0.6538 -0.3421 0.6749
+vn 0.6833 -0.2134 0.6983
+vn 0.7011 -0.0726 0.7094
+vn 0.7046 0.0725 0.7059
+vn -0.6538 -0.3420 -0.6749
+vn -0.6833 -0.2133 -0.6983
+vn -0.7011 -0.0726 -0.7094
+vn -0.7046 0.0726 -0.7059
+vn -0.2182 0.9392 -0.2652
+vn -0.1266 0.9764 -0.1749
+vn -0.0270 0.9968 -0.0756
+vn 0.0752 0.9968 0.0274
+vn 0.1739 0.9765 0.1277
+vn 0.2652 -0.9392 0.2182
+vn 0.1749 -0.9764 0.1266
+vn 0.0756 -0.9968 0.0270
+vn -0.0274 -0.9968 -0.0752
+vn -0.1277 -0.9765 -0.1739
+vn -0.6749 0.3420 -0.6539
+vn -0.6983 0.2133 -0.6833
+vn -0.7094 0.0726 -0.7011
+vn -0.7059 -0.0726 -0.7046
+vn -0.6880 -0.2133 -0.6936
+vn 0.6749 0.3421 0.6538
+vn 0.6983 0.2134 0.6833
+vn 0.7094 0.0725 0.7011
+vn 0.7059 -0.0726 0.7046
+vn 0.6880 -0.2134 0.6936
+vn -0.7071 -0.0001 0.7071
+vt 0.500848 0.829767
+vt 0.500848 0.879009
+vt 0.491000 0.879009
+vt 0.441758 0.829767
+vt 0.491000 0.829767
+vt 0.402365 0.829767
+vt 0.402365 0.879009
+vt 0.392517 0.879009
+vt 0.343275 0.829767
+vt 0.392517 0.829767
+vt 0.402365 0.780525
+vt 0.402365 0.928251
+vt 0.392517 0.928251
+vt 0.441758 0.879009
+vt 0.441758 0.928251
+vt 0.431910 0.928251
+vt 0.431910 0.879009
+vt 0.422062 0.928251
+vt 0.422062 0.879009
+vt 0.412213 0.928251
+vt 0.412213 0.879009
+vt 0.441758 0.780525
+vt 0.431910 0.829767
+vt 0.431910 0.780525
+vt 0.422062 0.829767
+vt 0.422062 0.780525
+vt 0.412213 0.829767
+vt 0.412213 0.780525
+vt 0.540242 0.829767
+vt 0.540242 0.879009
+vt 0.530394 0.879009
+vt 0.530394 0.829767
+vt 0.520545 0.879009
+vt 0.520545 0.829767
+vt 0.510697 0.879009
+vt 0.510697 0.829767
+vt 0.392517 0.780525
+vt 0.343275 0.879009
+s 0
+usemtl Material.005
+f 81/115/130 88/116/130 76/117/130
+f 76/117/131 79/118/131 75/119/131
+f 89/120/132 96/121/132 78/122/132
+f 78/122/133 73/123/133 77/124/133
+f 84/125/134 89/120/134 77/124/134
+f 96/121/135 85/126/135 74/127/135
+f 80/128/136 76/129/136 88/130/136
+f 93/131/137 88/130/137 87/132/137
+f 94/133/138 87/132/138 86/134/138
+f 95/135/139 86/134/139 85/126/139
+f 75/136/140 79/118/140 92/137/140
+f 81/138/141 92/137/141 91/139/141
+f 82/140/142 91/139/142 90/141/142
+f 83/142/143 90/141/143 89/120/143
+f 79/118/144 80/128/144 93/131/144
+f 92/137/145 93/131/145 94/133/145
+f 91/139/146 94/133/146 95/135/146
+f 90/141/147 95/135/147 96/121/147
+f 73/143/148 74/144/148 85/145/148
+f 84/146/149 85/145/149 86/147/149
+f 83/148/150 86/147/150 87/149/150
+f 82/150/151 87/149/151 88/116/151
+f 78/122/152 96/121/152 74/127/152
+f 96/121/153 95/135/153 85/126/153
+f 95/135/154 94/133/154 86/134/154
+f 94/133/155 93/131/155 87/132/155
+f 93/131/156 80/128/156 88/130/156
+f 73/151/157 84/125/157 77/124/157
+f 84/125/158 83/142/158 89/120/158
+f 83/142/159 82/140/159 90/141/159
+f 82/140/160 81/138/160 91/139/160
+f 81/138/161 75/136/161 92/137/161
+f 75/119/162 81/115/162 76/117/162
+f 81/115/163 82/150/163 88/116/163
+f 82/150/164 83/148/164 87/149/164
+f 83/148/165 84/146/165 86/147/165
+f 84/146/166 73/143/166 85/145/166
+f 77/124/167 89/120/167 78/122/167
+f 89/120/168 90/141/168 96/121/168
+f 90/141/169 91/139/169 95/135/169
+f 91/139/170 92/137/170 94/133/170
+f 92/137/171 79/118/171 93/131/171
+f 76/117/131 80/128/131 79/118/131
+f 78/122/172 74/152/172 73/123/172
+o box
+v -0.350000 -0.400000 0.400000
+v -0.400000 -0.400000 0.350000
+v -0.400000 0.400000 0.350000
+v -0.350000 0.400000 0.400000
+v -0.400000 -0.400000 -0.350000
+v -0.350000 -0.400000 -0.400000
+v -0.350000 0.400000 -0.400000
+v -0.400000 0.400000 -0.350000
+v 0.400000 -0.400000 0.350000
+v 0.350000 -0.400000 0.400000
+v 0.350000 0.400000 0.400000
+v 0.400000 0.400000 0.350000
+v 0.350000 -0.400000 -0.400000
+v 0.400000 -0.400000 -0.350000
+v 0.400000 0.400000 -0.350000
+v 0.350000 0.400000 -0.400000
+v -0.400000 0.340000 -0.350000
+v -0.350000 0.340000 -0.400000
+v -0.400000 0.340000 0.350000
+v -0.350000 0.340000 0.400000
+v 0.400000 0.340000 -0.350000
+v 0.350000 0.340000 -0.400000
+v 0.350000 0.340000 0.400000
+v 0.400000 0.340000 0.350000
+v -0.400000 0.266000 0.350000
+v -0.350000 0.266000 -0.400000
+v 0.400000 0.266000 -0.350000
+v 0.350000 0.266000 0.400000
+v 0.400000 0.266000 0.350000
+v 0.350000 0.266000 -0.400000
+v -0.400000 0.266000 -0.350000
+v -0.350000 0.266000 0.400000
+v 0.380536 0.340000 -0.355863
+v 0.355863 0.340000 -0.380536
+v 0.355863 0.340000 0.380536
+v 0.380536 0.340000 0.355863
+v 0.380536 0.266000 0.355863
+v 0.355863 0.266000 -0.380536
+v -0.380536 0.266000 -0.355863
+v -0.380536 0.340000 -0.355863
+v -0.355863 0.266000 0.380536
+v -0.355863 0.340000 0.380536
+v -0.355863 0.340000 -0.380536
+v -0.380536 0.340000 0.355863
+v -0.380536 0.266000 0.355863
+v -0.355863 0.266000 -0.380536
+v 0.380536 0.266000 -0.355863
+v 0.355863 0.266000 0.380536
+v 0.000000 -0.395000 0.396000
+v -0.396000 -0.057000 0.000000
+v -0.396000 -0.067000 0.009900
+v -0.396000 -0.077000 0.000000
+v -0.396000 -0.067000 -0.009900
+v 0.000000 -0.057000 -0.396000
+v -0.009900 -0.067000 -0.396000
+v 0.000000 -0.077000 -0.396000
+v 0.009900 -0.067000 -0.396000
+v 0.396000 -0.057000 0.000000
+v 0.396000 -0.067000 -0.009900
+v 0.396000 -0.077000 0.000000
+v 0.396000 -0.067000 0.009900
+v 0.000000 -0.057000 0.396000
+v 0.009900 -0.067000 0.396000
+v 0.000000 -0.077000 0.396000
+v -0.009900 -0.067000 0.396000
+v 0.010000 -0.400000 0.400000
+v -0.010000 -0.400000 0.400000
+v -0.010000 0.266000 0.400000
+v 0.010000 0.266000 0.400000
+v 0.400000 -0.400000 -0.010000
+v 0.400000 -0.400000 0.010000
+v 0.400000 0.266000 0.010000
+v 0.400000 0.266000 -0.010000
+v -0.010000 -0.400000 -0.400000
+v 0.010000 -0.400000 -0.400000
+v 0.010000 0.266000 -0.400000
+v -0.010000 0.266000 -0.400000
+v -0.400000 -0.400000 0.010000
+v -0.400000 -0.400000 -0.010000
+v -0.400000 0.266000 -0.010000
+v -0.400000 0.266000 0.010000
+v -0.400000 -0.077000 0.350000
+v -0.400000 -0.057000 0.350000
+v -0.350000 -0.077000 -0.400000
+v -0.350000 -0.057000 -0.400000
+v 0.400000 -0.077000 -0.350000
+v 0.400000 -0.057000 -0.350000
+v 0.350000 -0.077000 0.400000
+v 0.350000 -0.057000 0.400000
+v 0.400000 -0.057000 0.350000
+v 0.400000 -0.077000 0.350000
+v 0.350000 -0.057000 -0.400000
+v 0.350000 -0.077000 -0.400000
+v -0.400000 -0.057000 -0.350000
+v -0.400000 -0.077000 -0.350000
+v -0.350000 -0.077000 0.400000
+v -0.350000 -0.057000 0.400000
+v -0.010000 -0.077000 0.400000
+v 0.010000 -0.077000 0.400000
+v 0.010000 -0.057000 0.400000
+v -0.010000 -0.057000 0.400000
+v 0.400000 -0.077000 0.010000
+v 0.400000 -0.077000 -0.010000
+v 0.400000 -0.057000 -0.010000
+v 0.400000 -0.057000 0.010000
+v 0.010000 -0.077000 -0.400000
+v -0.010000 -0.077000 -0.400000
+v -0.010000 -0.057000 -0.400000
+v 0.010000 -0.057000 -0.400000
+v -0.400000 -0.077000 -0.010000
+v -0.400000 -0.077000 0.010000
+v -0.400000 -0.057000 0.010000
+v -0.400000 -0.057000 -0.010000
+v 0.396000 -0.395000 0.000000
+v 0.000000 -0.395000 -0.396000
+v -0.396000 -0.395000 0.000000
+v 0.000000 0.266000 0.396000
+v 0.396000 0.266000 -0.000000
+v 0.000000 0.266000 -0.396000
+v -0.396000 0.266000 -0.000000
+v -0.396000 -0.067000 0.346500
+v -0.346500 -0.067000 -0.396000
+v 0.396000 -0.067000 -0.346500
+v 0.346500 -0.067000 0.396000
+v -0.346500 -0.067000 0.396000
+v 0.346500 -0.067000 -0.396000
+v -0.396000 -0.067000 -0.346500
+v 0.396000 -0.067000 0.346500
+v -0.396000 -0.067000 0.000000
+v 0.000000 -0.067000 -0.396000
+v 0.396000 -0.067000 0.000000
+v 0.000000 -0.067000 0.396000
+v 0.000000 -0.395000 0.000000
+v 0.010000 -0.395000 0.000000
+v -0.010000 -0.395000 0.000000
+v -0.010000 -0.400000 0.010000
+v 0.000000 -0.395000 0.010000
+v 0.010000 -0.400000 0.010000
+v -0.010000 -0.400000 -0.010000
+v 0.000000 -0.395000 -0.010000
+v 0.010000 -0.400000 -0.010000
+vn -0.0000 -1.0000 -0.0000
+vn -0.0000 -0.0000 1.0000
+vn 1.0000 -0.0000 -0.0000
+vn -0.0000 1.0000 -0.0000
+vn -1.0000 -0.0000 -0.0000
+vn -0.0000 -0.0000 -1.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.6247 -0.4685 -0.6247
+vn -0.0000 0.3714 0.9285
+vn -0.6247 0.4685 -0.6247
+vn 0.6247 -0.4685 -0.6247
+vn 0.6247 0.4685 -0.6247
+vn 0.6247 -0.4685 0.6247
+vn 0.6247 0.4685 0.6247
+vn -0.6247 0.4685 0.6247
+vn -0.0000 -0.3714 0.9285
+vn 0.9285 0.3714 -0.0000
+vn 0.9285 -0.3714 -0.0000
+vn -0.9285 0.3714 -0.0000
+vn -0.9285 -0.3714 -0.0000
+vn -0.0000 0.3714 -0.9285
+vn -0.0000 -0.3714 -0.9285
+vn -0.6247 -0.4685 0.6247
+vn -0.9285 -0.0000 -0.3714
+vn -0.9285 -0.0000 0.3714
+vn 0.3714 -0.0000 -0.9285
+vn -0.3714 -0.0000 -0.9285
+vn 0.9285 -0.0000 0.3714
+vn 0.9285 -0.0000 -0.3714
+vn -0.3714 -0.0000 0.9285
+vn 0.3714 -0.0000 0.9285
+vn -0.8714 -0.3451 0.3486
+vn -0.8714 0.3451 0.3486
+vn -0.3486 -0.3451 -0.8714
+vn -0.3486 0.3451 -0.8714
+vn 0.8714 -0.3451 -0.3486
+vn 0.8714 0.3451 -0.3486
+vn 0.3486 -0.3451 0.8714
+vn 0.3486 0.3451 0.8714
+vn -0.0000 -0.8944 -0.4472
+vn -0.4472 -0.8944 -0.0000
+vn 0.4082 -0.8165 -0.4082
+vn -0.4082 -0.8165 -0.4082
+vn 0.4472 -0.8944 -0.0000
+vn -0.4082 -0.8165 0.4082
+vn -0.0000 -0.8944 0.4472
+vn -0.3486 -0.3451 0.8714
+vn 0.8714 -0.3451 0.3486
+vn 0.3486 -0.3451 -0.8714
+vn -0.8714 -0.3451 -0.3486
+vn -0.8714 0.3451 -0.3486
+vn 0.3486 0.3451 -0.8714
+vn 0.8714 0.3451 0.3486
+vn -0.3486 0.3451 0.8714
+vn 0.4082 -0.8165 0.4082
+vt 0.913523 0.219406
+vt 0.899101 0.219390
+vt 0.004935 0.218361
+vt 0.206824 0.235900
+vt 0.004935 0.218361
+vt 0.206844 0.218593
+vt 0.437576 0.236165
+vt 0.235688 0.218627
+vt 0.437596 0.218859
+vt 0.221229 0.250338
+vt 0.235668 0.235933
+vt 0.437311 0.466918
+vt 0.899081 0.236696
+vt 0.697192 0.219158
+vt 0.668328 0.236431
+vt 0.466440 0.218892
+vt 0.668348 0.219124
+vt 0.913503 0.236713
+vt 0.668480 0.104614
+vt 0.697217 0.197813
+vt 0.668373 0.197780
+vt 0.437728 0.104349
+vt 0.466465 0.197548
+vt 0.437620 0.197514
+vt 0.206975 0.104083
+vt 0.235712 0.197282
+vt 0.206868 0.197249
+vt 0.697327 0.101762
+vt 0.668483 0.101729
+vt 0.697173 0.236464
+vt 0.466420 0.236199
+vt 0.206982 0.098314
+vt 0.109019 0.005035
+vt 0.207089 0.005148
+vt 0.570410 0.104500
+vt 0.333896 0.098459
+vt 0.235933 0.005181
+vt 0.334003 0.005294
+vt 0.339658 0.104235
+vt 0.466465 0.197547
+vt 0.668594 0.005678
+vt 0.697331 0.098877
+vt 0.668487 0.098845
+vt 0.899125 0.198045
+vt 0.801163 0.104766
+vt 0.899232 0.104879
+vt 0.899125 0.198045
+vt 0.913547 0.198062
+vt 0.668348 0.219124
+vt 0.668373 0.197780
+vt 0.697217 0.197813
+vt 0.437596 0.218859
+vt 0.235712 0.197282
+vt 0.437620 0.197514
+vt 0.206844 0.218593
+vt 0.004960 0.197017
+vt 0.206868 0.197249
+vt 0.235688 0.218627
+vt 0.697192 0.219158
+vt 0.108906 0.103969
+vt 0.103030 0.197129
+vt 0.005067 0.103850
+vt 0.103137 0.103963
+vt 0.564648 0.098725
+vt 0.466686 0.005446
+vt 0.564755 0.005559
+vt 0.913661 0.099127
+vt 0.899346 0.005944
+vt 0.913768 0.005961
+vt 0.795401 0.098990
+vt 0.697438 0.005712
+vt 0.795508 0.005824
+vt 0.795287 0.197926
+vt 0.697324 0.104646
+vt 0.795394 0.104759
+vt 0.564534 0.197660
+vt 0.466572 0.104381
+vt 0.564642 0.104494
+vt 0.573393 0.005569
+vt 0.913655 0.104896
+vt 0.333782 0.197395
+vt 0.235819 0.104115
+vt 0.333889 0.104228
+vt 0.570524 0.005566
+vt 0.899239 0.099111
+vt 0.801277 0.005831
+vt 0.235826 0.098347
+vt 0.437842 0.005413
+vt 0.466578 0.098612
+vt 0.437734 0.098580
+vt 0.108909 0.101085
+vt 0.106021 0.103966
+vt 0.106024 0.101082
+vt 0.339661 0.101350
+vt 0.336774 0.104231
+vt 0.336777 0.101347
+vt 0.570414 0.101616
+vt 0.567526 0.104497
+vt 0.567529 0.101613
+vt 0.801166 0.101881
+vt 0.798278 0.104762
+vt 0.798282 0.101878
+vt 0.801056 0.197932
+vt 0.005070 0.100965
+vt 0.103144 0.098194
+vt 0.103140 0.101078
+vt 0.466575 0.101496
+vt 0.437731 0.101463
+vt 0.235823 0.101231
+vt 0.206979 0.101198
+vt 0.899236 0.101994
+vt 0.913658 0.102011
+vt 0.108798 0.197136
+vt 0.333892 0.101344
+vt 0.795397 0.101875
+vt 0.564645 0.101609
+vt 0.108912 0.098201
+vt 0.339551 0.197402
+vt 0.570303 0.197667
+vt 0.339665 0.098466
+vt 0.570417 0.098731
+vt 0.801169 0.098997
+vt 0.798171 0.197929
+vt 0.567419 0.197664
+vt 0.336666 0.197398
+vt 0.105914 0.197133
+vt 0.798392 0.005828
+vt 0.798285 0.098994
+vt 0.567640 0.005562
+vt 0.567533 0.098728
+vt 0.336887 0.005297
+vt 0.336780 0.098463
+vt 0.106135 0.005031
+vt 0.106028 0.098197
+vt 0.103251 0.005028
+vt 0.339772 0.005300
+vt 0.005181 0.004915
+vt 0.550493 0.005543
+vt 0.561887 0.005556
+vt 0.573467 0.005569
+vt 0.555986 0.005549
+vt 0.561711 0.005556
+vt 0.561813 0.005556
+vt 0.567640 0.005562
+vt 0.004915 0.235668
+vt 0.451982 0.250604
+vt 0.451749 0.452512
+vt 0.235402 0.466685
+vt 0.220997 0.452247
+vt 0.005074 0.098081
+s 0
+usemtl Material.001
+f 116/153/173 140/154/173 138/155/173
+f 107/156/174 116/157/174 119/158/174
+f 111/159/175 120/160/175 117/161/175
+f 107/162/176 108/163/176 104/164/176
+f 99/165/177 113/166/177 115/154/177
+f 103/167/178 118/168/178 114/169/178
+f 100/170/179 115/154/179 116/153/179
+f 181/171/180 127/172/180 122/173/180
+f 183/174/181 126/175/181 123/176/181
+f 185/177/182 125/178/182 124/179/182
+f 223/180/183 181/171/183 218/181/183
+f 114/169/180 104/182/180 103/167/180
+f 117/161/181 112/183/181 111/159/181
+f 119/158/182 108/163/182 107/156/182
+f 184/184/174 162/185/174 106/186/174
+f 122/173/178 204/187/178 181/171/178
+f 198/188/175 105/189/175 167/190/175
+f 123/176/175 200/191/175 183/174/175
+f 134/192/176 123/176/176 126/175/176
+f 102/193/180 191/194/180 180/195/180
+f 121/196/177 208/197/177 179/198/177
+f 138/153/179 141/199/179 137/200/179
+f 139/201/178 134/192/178 142/202/178
+f 140/154/177 135/203/177 141/199/177
+f 129/204/175 133/205/175 143/206/175
+f 131/207/174 137/208/174 144/209/174
+f 144/209/182 132/210/182 131/207/182
+f 143/206/181 130/168/181 129/204/181
+f 142/202/180 136/211/180 139/201/180
+f 124/179/174 196/212/174 185/177/174
+f 164/213/174 193/214/174 197/215/174
+f 202/216/178 109/217/178 171/218/178
+f 192/219/179 98/220/179 97/221/179
+f 206/222/177 101/223/177 175/224/177
+f 176/225/177 190/226/177 209/227/177
+f 172/228/178 188/229/178 205/230/178
+f 102/193/173 235/231/173 101/223/173
+f 128/200/179 179/198/179 193/232/179
+f 168/233/175 186/234/175 201/235/175
+f 180/195/178 170/236/178 102/193/178
+f 178/237/177 174/238/177 98/220/177
+f 133/205/176 124/179/176 125/178/176
+f 106/186/182 187/239/182 184/184/182
+f 110/240/181 189/241/181 182/242/181
+f 159/243/174 158/244/174 228/245/174
+f 155/246/175 154/247/175 227/248/175
+f 151/249/178 150/250/178 226/251/178
+f 147/252/177 146/253/177 225/254/177
+f 177/255/176 121/196/176 141/199/176
+f 221/256/184 194/257/184 161/258/184
+f 223/180/185 180/195/185 191/194/185
+f 222/259/186 183/174/186 219/260/186
+f 222/259/187 182/242/187 189/241/187
+f 224/261/188 185/177/188 220/262/188
+f 224/261/189 184/184/189 187/239/189
+f 217/263/190 192/219/190 221/264/190
+f 165/265/176 124/179/176 144/209/176
+f 221/256/191 197/215/191 193/214/191
+f 224/261/192 198/188/192 157/266/192
+f 224/261/193 201/235/193 186/234/193
+f 223/180/194 206/222/194 149/267/194
+f 223/180/195 209/227/195 190/226/195
+f 222/259/196 202/216/196 153/268/196
+f 222/259/197 205/230/197 188/229/197
+f 220/262/184 195/269/184 184/184/184
+f 217/263/198 193/232/198 179/198/198
+f 169/270/176 123/176/176 143/206/176
+f 173/271/176 122/173/176 142/202/176
+f 196/212/191 220/262/191 185/177/191
+f 219/260/192 199/272/192 182/242/192
+f 200/191/193 219/260/193 183/174/193
+f 218/181/196 203/273/196 180/195/196
+f 204/187/197 218/181/197 181/171/197
+f 217/263/194 207/274/194 178/237/194
+f 208/197/195 217/263/195 179/198/195
+f 146/253/199 177/255/199 216/275/199
+f 146/253/200 176/225/200 209/227/200
+f 150/250/201 173/271/201 215/276/201
+f 150/250/202 172/228/202 205/230/202
+f 154/247/203 169/270/203 214/277/203
+f 154/247/204 168/233/204 201/235/204
+f 158/244/205 165/265/205 213/278/205
+f 158/244/206 164/213/206 197/215/206
+f 212/279/199 207/274/199 148/280/199
+f 212/279/200 206/222/200 175/224/200
+f 211/281/201 203/273/201 152/282/201
+f 211/281/202 202/216/202 171/218/202
+f 210/283/203 199/272/203 156/284/203
+f 210/283/204 198/188/204 167/190/204
+f 145/285/205 195/269/205 160/286/205
+f 145/285/206 194/257/206 163/287/206
+f 182/242/175 166/288/175 110/240/175
+f 149/267/207 146/253/207 209/227/207
+f 148/280/208 149/267/208 206/222/208
+f 148/280/177 147/252/177 225/254/177
+f 153/268/209 150/250/209 205/230/209
+f 152/282/210 153/268/210 202/216/210
+f 152/282/178 151/249/178 226/251/178
+f 157/266/211 154/247/211 201/235/211
+f 156/284/212 157/266/212 198/188/212
+f 156/284/175 155/246/175 227/248/175
+f 161/258/213 158/244/213 197/215/213
+f 160/286/214 161/258/214 194/257/214
+f 160/286/174 159/243/174 228/245/174
+f 135/203/176 122/173/176 127/172/176
+f 128/200/176 141/199/176 121/196/176
+f 194/257/174 97/289/174 163/287/174
+f 234/290/215 210/283/215 167/190/215
+f 237/291/216 211/281/216 171/218/216
+f 231/292/217 233/293/217 232/294/217
+f 237/291/173 109/217/173 110/240/173
+f 233/293/218 230/295/218 234/290/218
+f 235/231/219 211/281/219 236/281/219
+f 212/279/215 232/294/215 174/238/215
+f 145/285/216 234/290/216 162/185/216
+f 232/294/219 145/285/219 163/287/219
+f 232/294/173 163/287/173 97/289/173
+f 234/290/173 105/189/173 106/186/173
+f 230/295/220 236/281/220 237/291/220
+f 231/292/173 236/281/173 229/296/173
+f 212/279/221 235/231/221 231/292/221
+f 210/283/221 237/291/221 166/288/221
+f 115/154/173 136/211/173 140/154/173
+f 114/169/173 136/211/173 113/166/173
+f 118/168/173 117/161/173 129/204/173
+f 131/207/173 119/158/173 116/153/173
+f 116/153/173 115/154/173 140/154/173
+f 138/155/173 131/207/173 116/153/173
+f 107/156/174 100/297/174 116/157/174
+f 111/159/175 108/163/175 120/160/175
+f 108/163/176 111/159/176 112/298/176
+f 112/298/176 103/299/176 108/163/176
+f 103/299/176 104/164/176 108/163/176
+f 104/164/176 99/300/176 100/301/176
+f 100/301/176 107/162/176 104/164/176
+f 99/165/177 104/182/177 113/166/177
+f 103/167/178 112/183/178 118/168/178
+f 100/170/179 99/165/179 115/154/179
+f 181/171/180 190/226/180 127/172/180
+f 183/174/181 188/229/181 126/175/181
+f 185/177/182 186/234/182 125/178/182
+f 223/180/183 190/226/183 181/171/183
+f 114/169/180 113/166/180 104/182/180
+f 117/161/181 118/168/181 112/183/181
+f 119/158/182 120/160/182 108/163/182
+f 184/184/174 195/269/174 162/185/174
+f 122/173/178 173/271/178 204/187/178
+f 198/188/175 187/239/175 105/189/175
+f 123/176/175 169/270/175 200/191/175
+f 134/192/176 143/206/176 123/176/176
+f 102/193/180 101/223/180 191/194/180
+f 121/196/177 177/255/177 208/197/177
+f 138/153/179 140/154/179 141/199/179
+f 139/201/178 130/168/178 134/192/178
+f 140/154/177 136/211/177 135/203/177
+f 129/204/175 132/210/175 133/205/175
+f 131/207/174 138/155/174 137/208/174
+f 144/209/182 133/205/182 132/210/182
+f 143/206/181 134/192/181 130/168/181
+f 142/202/180 135/203/180 136/211/180
+f 124/179/174 165/265/174 196/212/174
+f 164/213/174 128/208/174 193/214/174
+f 202/216/178 189/241/178 109/217/178
+f 192/219/179 178/237/179 98/220/179
+f 206/222/177 191/194/177 101/223/177
+f 176/225/177 127/172/177 190/226/177
+f 172/228/178 126/175/178 188/229/178
+f 170/236/173 235/231/173 102/193/173
+f 235/231/173 175/224/173 101/223/173
+f 128/200/179 121/196/179 179/198/179
+f 168/233/175 125/178/175 186/234/175
+f 180/195/178 203/273/178 170/236/178
+f 178/237/177 207/274/177 174/238/177
+f 133/205/176 144/209/176 124/179/176
+f 106/186/182 105/189/182 187/239/182
+f 110/240/181 109/217/181 189/241/181
+f 159/243/222 196/212/222 158/244/222
+f 155/246/223 200/191/223 154/247/223
+f 151/249/224 204/187/224 150/250/224
+f 147/252/225 208/197/225 146/253/225
+f 141/199/176 135/203/176 216/275/176
+f 135/203/176 127/172/176 176/225/176
+f 216/275/176 135/203/176 176/225/176
+f 216/275/176 177/255/176 141/199/176
+f 221/256/184 192/302/184 194/257/184
+f 223/180/185 218/181/185 180/195/185
+f 222/259/186 188/229/186 183/174/186
+f 222/259/187 219/260/187 182/242/187
+f 224/261/188 186/234/188 185/177/188
+f 224/261/189 220/262/189 184/184/189
+f 217/263/190 178/237/190 192/219/190
+f 144/209/176 137/200/176 213/278/176
+f 137/200/176 128/200/176 164/213/176
+f 213/278/176 137/200/176 164/213/176
+f 213/278/176 165/265/176 144/209/176
+f 221/256/191 161/258/191 197/215/191
+f 224/261/192 187/239/192 198/188/192
+f 224/261/193 157/266/193 201/235/193
+f 223/180/194 191/194/194 206/222/194
+f 223/180/195 149/267/195 209/227/195
+f 222/259/196 189/241/196 202/216/196
+f 222/259/197 153/268/197 205/230/197
+f 220/262/184 159/243/184 195/269/184
+f 217/263/198 221/264/198 193/232/198
+f 143/206/176 133/205/176 214/277/176
+f 133/205/176 125/178/176 168/233/176
+f 214/277/176 133/205/176 168/233/176
+f 214/277/176 169/270/176 143/206/176
+f 142/202/176 134/192/176 215/276/176
+f 134/192/176 126/175/176 172/228/176
+f 215/276/176 134/192/176 172/228/176
+f 215/276/176 173/271/176 142/202/176
+f 196/212/191 159/243/191 220/262/191
+f 219/260/192 155/246/192 199/272/192
+f 200/191/193 155/246/193 219/260/193
+f 218/181/196 151/249/196 203/273/196
+f 204/187/197 151/249/197 218/181/197
+f 217/263/194 147/252/194 207/274/194
+f 208/197/195 147/252/195 217/263/195
+f 146/253/199 208/197/199 177/255/199
+f 146/253/200 216/275/200 176/225/200
+f 150/250/201 204/187/201 173/271/201
+f 150/250/202 215/276/202 172/228/202
+f 154/247/203 200/191/203 169/270/203
+f 154/247/204 214/277/204 168/233/204
+f 158/244/205 196/212/205 165/265/205
+f 158/244/206 213/278/206 164/213/206
+f 212/279/199 174/238/199 207/274/199
+f 212/279/200 148/280/200 206/222/200
+f 211/281/201 170/236/201 203/273/201
+f 211/281/202 152/282/202 202/216/202
+f 210/283/203 166/288/203 199/272/203
+f 210/283/204 156/284/204 198/188/204
+f 145/285/205 162/185/205 195/269/205
+f 145/285/206 160/286/206 194/257/206
+f 182/242/175 199/272/175 166/288/175
+f 149/267/177 225/254/177 146/253/177
+f 148/280/177 225/254/177 149/267/177
+f 148/280/226 207/274/226 147/252/226
+f 153/268/178 226/251/178 150/250/178
+f 152/282/178 226/251/178 153/268/178
+f 152/282/227 203/273/227 151/249/227
+f 157/266/175 227/248/175 154/247/175
+f 156/284/175 227/248/175 157/266/175
+f 156/284/228 199/272/228 155/246/228
+f 161/258/174 228/245/174 158/244/174
+f 160/286/174 228/245/174 161/258/174
+f 160/286/229 195/269/229 159/243/229
+f 135/203/176 142/202/176 122/173/176
+f 128/200/176 137/200/176 141/199/176
+f 194/257/174 192/302/174 97/289/174
+f 234/290/215 230/295/215 210/283/215
+f 237/291/216 236/281/216 211/281/216
+f 231/292/173 229/296/173 233/293/173
+f 110/240/173 166/288/173 237/291/173
+f 237/291/173 171/218/173 109/217/173
+f 233/293/173 229/296/173 230/295/173
+f 235/231/219 170/236/219 211/281/219
+f 212/279/215 231/292/215 232/294/215
+f 145/285/216 233/293/216 234/290/216
+f 232/294/219 233/293/219 145/285/219
+f 97/289/173 98/220/173 232/294/173
+f 98/220/173 174/238/173 232/294/173
+f 106/186/173 162/185/173 234/290/173
+f 234/290/173 167/190/173 105/189/173
+f 230/295/173 229/296/173 236/281/173
+f 231/292/230 235/231/230 236/281/230
+f 212/279/221 175/224/221 235/231/221
+f 210/283/221 230/295/221 237/291/221
+f 115/154/173 113/166/173 136/211/173
+f 114/169/173 139/201/173 136/211/173
+f 130/168/173 139/201/173 114/169/173
+f 120/160/173 119/158/173 131/207/173
+f 120/160/173 131/207/173 132/210/173
+f 130/168/173 114/169/173 118/168/173
+f 120/160/173 132/210/173 129/204/173
+f 129/204/173 130/168/173 118/168/173
+f 117/161/173 120/160/173 129/204/173
+o drone
+v -0.447245 0.500000 -0.500278
+v -0.411890 0.500000 -0.464923
+v -0.464923 0.500000 -0.411890
+v -0.500278 0.500000 -0.447245
+v -0.556898 0.530000 -0.698320
+v -0.586898 0.500000 -0.685894
+v -0.698320 0.530000 -0.556898
+v -0.685894 0.500000 -0.586898
+v -0.685894 0.712426 -0.827315
+v -0.728320 0.700000 -0.827315
+v -0.827315 0.712426 -0.685894
+v -0.827315 0.700000 -0.728320
+v -0.503762 0.670000 -0.645183
+v -0.516188 0.700000 -0.615183
+v -0.645183 0.670000 -0.503761
+v -0.615183 0.700000 -0.516188
+v -0.728320 0.787574 -0.586898
+v -0.685894 0.800000 -0.586898
+v -0.586898 0.787574 -0.728320
+v -0.586898 0.800000 -0.685894
+v -0.141421 0.530000 -0.000000
+v -0.098995 0.500000 -0.000000
+v 0.000000 0.530000 -0.141421
+v 0.000000 0.500000 -0.098995
+v 0.000000 0.700000 -0.098995
+v 0.000000 0.670000 -0.141421
+v -0.141421 0.670000 -0.000000
+v -0.098995 0.700000 -0.000000
+v 0.000000 0.500000 -0.000000
+v 0.000000 0.700000 -0.000000
+v -0.385858 0.340000 -0.100000
+v -0.100000 0.340000 -0.385858
+v -0.100000 0.306000 -0.385858
+v -0.385858 0.306000 -0.100000
+v -0.420000 0.340000 -0.100000
+v -0.420000 0.306000 -0.100000
+v -0.100000 0.340000 -0.420000
+v -0.100000 0.306000 -0.420000
+v -0.385858 0.306000 -0.357272
+v -0.385858 0.340000 -0.357272
+v -0.357272 0.306000 -0.385858
+v -0.357272 0.340000 -0.385858
+v -0.415074 0.340000 -0.364151
+v -0.364151 0.340000 -0.415074
+v -0.364151 0.306000 -0.415074
+v -0.415074 0.306000 -0.364151
+v -0.685894 1.073136 -0.586898
+v -0.728320 1.073136 -0.586898
+v -0.586898 1.073136 -0.728320
+v -0.586898 1.073136 -0.685894
+v -0.728320 1.073136 -0.827315
+v -0.685894 1.073136 -0.827315
+v -0.827315 1.073136 -0.728320
+v -0.827315 1.073136 -0.685894
+v -0.701803 1.073136 -0.677055
+v -0.677055 1.073136 -0.712410
+v -0.712410 1.073136 -0.737159
+v -0.737159 1.073136 -0.701803
+v -0.712410 1.073136 -0.677055
+v -0.677055 1.073136 -0.701803
+v -0.701803 1.073136 -0.737159
+v -0.737159 1.073136 -0.712410
+v -0.737159 1.143136 -0.712410
+v -0.737159 1.143136 -0.701803
+v -0.712410 1.143136 -0.737159
+v -0.701803 1.143136 -0.737159
+v -0.677055 1.143136 -0.712410
+v -0.677055 1.143136 -0.701803
+v -0.701803 1.143136 -0.677055
+v -0.712410 1.143136 -0.677055
+v -0.728320 1.044580 -0.586898
+v -0.586898 1.044580 -0.685894
+v -0.685894 1.044580 -0.827315
+v -0.827315 1.044580 -0.728320
+v -0.685894 1.044580 -0.586898
+v -0.586898 1.044580 -0.728320
+v -0.728320 1.044580 -0.827315
+v -0.827315 1.044580 -0.685894
+v -0.686530 1.094580 -0.154005
+v -0.686530 1.123136 -0.154005
+v -0.154005 1.094580 -0.727683
+v -0.154005 1.123136 -0.727683
+v -0.727684 1.094580 -1.260209
+v -0.727684 1.123136 -1.260209
+v -1.260209 1.094580 -0.686530
+v -1.260209 1.123136 -0.686530
+v -1.260209 1.123136 -0.727684
+v -0.686530 1.123136 -1.260209
+v -0.154005 1.123136 -0.686530
+v -0.727683 1.123136 -0.154005
+v -0.727683 1.094580 -0.154005
+v -0.154005 1.094580 -0.686530
+v -0.686530 1.094580 -1.260209
+v -1.260209 1.094580 -0.727684
+v -1.248855 1.120000 -0.590826
+v -1.248855 1.180000 -0.590826
+v -1.248855 1.120000 -0.809174
+v -1.248855 1.180000 -0.809174
+v -1.165297 1.120000 -1.010902
+v -1.165297 1.180000 -1.010902
+v -1.010902 1.120000 -1.165297
+v -1.010902 1.180000 -1.165297
+v -0.809174 1.120000 -1.248855
+v -0.809174 1.180000 -1.248855
+v -0.590826 1.120000 -1.248855
+v -0.590826 1.180000 -1.248855
+v -0.389098 1.120000 -1.165297
+v -0.389098 1.180000 -1.165297
+v -0.234703 1.120000 -1.010902
+v -0.234703 1.180000 -1.010902
+v -0.151145 1.120000 -0.809174
+v -0.151145 1.180000 -0.809174
+v -0.151145 1.120000 -0.590826
+v -0.151145 1.180000 -0.590826
+v -0.234703 1.120000 -0.389098
+v -0.234703 1.180000 -0.389098
+v -0.389098 1.120000 -0.234703
+v -0.389098 1.180000 -0.234703
+v -0.590826 1.120000 -0.151145
+v -0.590826 1.180000 -0.151145
+v -0.809174 1.120000 -0.151145
+v -0.809174 1.180000 -0.151145
+v -1.010902 1.120000 -0.234703
+v -1.010902 1.180000 -0.234703
+v -1.165297 1.120000 -0.389098
+v -1.165297 1.180000 -0.389098
+v -1.268855 1.120000 -0.586848
+v -1.268855 1.120000 -0.813152
+v -1.268855 1.180000 -0.813152
+v -1.268855 1.180000 -0.586848
+v -1.182252 1.120000 -1.022231
+v -1.182252 1.180000 -1.022231
+v -1.022231 1.120000 -1.182252
+v -1.022231 1.180000 -1.182252
+v -0.813153 1.120000 -1.268855
+v -0.813153 1.180000 -1.268855
+v -0.586848 1.120000 -1.268855
+v -0.586848 1.180000 -1.268855
+v -0.377769 1.120000 -1.182252
+v -0.377769 1.180000 -1.182252
+v -0.217748 1.120000 -1.022231
+v -0.217748 1.180000 -1.022231
+v -0.131145 1.120000 -0.813152
+v -0.131145 1.180000 -0.813152
+v -0.131145 1.120000 -0.586848
+v -0.131145 1.180000 -0.586848
+v -0.217748 1.120000 -0.377769
+v -0.217748 1.180000 -0.377769
+v -0.377769 1.120000 -0.217748
+v -0.377769 1.180000 -0.217748
+v -0.586848 1.120000 -0.131145
+v -0.586848 1.180000 -0.131145
+v -0.813152 1.120000 -0.131145
+v -0.813152 1.180000 -0.131145
+v -1.022231 1.120000 -0.217748
+v -1.022231 1.180000 -0.217748
+v -1.182252 1.120000 -0.377769
+v -1.182252 1.180000 -0.377769
+v -0.500278 0.440000 -0.447245
+v -0.411890 0.440000 -0.464923
+v -0.464923 0.440000 -0.411890
+v -0.447245 0.440000 -0.500278
+v -0.349720 0.340000 -0.402753
+v -0.402753 0.340000 -0.349720
+v 0.447245 0.500000 -0.500278
+v 0.411890 0.500000 -0.464923
+v 0.464923 0.500000 -0.411890
+v 0.500278 0.500000 -0.447245
+v 0.556898 0.530000 -0.698320
+v 0.586898 0.500000 -0.685894
+v 0.698320 0.530000 -0.556898
+v 0.685894 0.500000 -0.586898
+v 0.685894 0.712426 -0.827315
+v 0.728320 0.700000 -0.827315
+v 0.827315 0.712426 -0.685894
+v 0.827315 0.700000 -0.728320
+v 0.503762 0.670000 -0.645183
+v 0.516188 0.700000 -0.615183
+v 0.645183 0.670000 -0.503761
+v 0.615183 0.700000 -0.516188
+v 0.728320 0.787574 -0.586898
+v 0.685894 0.800000 -0.586898
+v 0.586898 0.787574 -0.728320
+v 0.586898 0.800000 -0.685894
+v 0.141421 0.530000 -0.000000
+v 0.098995 0.500000 -0.000000
+v 0.141421 0.670000 -0.000000
+v 0.098995 0.700000 -0.000000
+v 0.385858 0.340000 -0.100000
+v 0.100000 0.340000 -0.385858
+v 0.100000 0.306000 -0.385858
+v 0.385858 0.306000 -0.100000
+v 0.420000 0.340000 -0.100000
+v 0.420000 0.306000 -0.100000
+v 0.100000 0.340000 -0.420000
+v 0.100000 0.306000 -0.420000
+v 0.385858 0.306000 -0.357272
+v 0.385858 0.340000 -0.357272
+v 0.357272 0.306000 -0.385858
+v 0.357272 0.340000 -0.385858
+v 0.415074 0.340000 -0.364151
+v 0.364151 0.340000 -0.415074
+v 0.364151 0.306000 -0.415074
+v 0.415074 0.306000 -0.364151
+v 0.685894 1.073136 -0.586898
+v 0.728320 1.073136 -0.586898
+v 0.586898 1.073136 -0.728320
+v 0.586898 1.073136 -0.685894
+v 0.728320 1.073136 -0.827315
+v 0.685894 1.073136 -0.827315
+v 0.827315 1.073136 -0.728320
+v 0.827315 1.073136 -0.685894
+v 0.701803 1.073136 -0.677055
+v 0.677055 1.073136 -0.712410
+v 0.712410 1.073136 -0.737159
+v 0.737159 1.073136 -0.701803
+v 0.712410 1.073136 -0.677055
+v 0.677055 1.073136 -0.701803
+v 0.701803 1.073136 -0.737159
+v 0.737159 1.073136 -0.712410
+v 0.737159 1.143136 -0.712410
+v 0.737159 1.143136 -0.701803
+v 0.712410 1.143136 -0.737159
+v 0.701803 1.143136 -0.737159
+v 0.677055 1.143136 -0.712410
+v 0.677055 1.143136 -0.701803
+v 0.701803 1.143136 -0.677055
+v 0.712410 1.143136 -0.677055
+v 0.728320 1.044580 -0.586898
+v 0.586898 1.044580 -0.685894
+v 0.685894 1.044580 -0.827315
+v 0.827315 1.044580 -0.728320
+v 0.685894 1.044580 -0.586898
+v 0.586898 1.044580 -0.728320
+v 0.728320 1.044580 -0.827315
+v 0.827315 1.044580 -0.685894
+v 0.686530 1.094580 -0.154005
+v 0.686530 1.123136 -0.154005
+v 0.154005 1.094580 -0.727683
+v 0.154005 1.123136 -0.727683
+v 0.727684 1.094580 -1.260209
+v 0.727684 1.123136 -1.260209
+v 1.260209 1.094580 -0.686530
+v 1.260209 1.123136 -0.686530
+v 1.260209 1.123136 -0.727684
+v 0.686530 1.123136 -1.260209
+v 0.154005 1.123136 -0.686530
+v 0.727683 1.123136 -0.154005
+v 0.727683 1.094580 -0.154005
+v 0.154005 1.094580 -0.686530
+v 0.686530 1.094580 -1.260209
+v 1.260209 1.094580 -0.727684
+v 1.248855 1.120000 -0.590826
+v 1.248855 1.180000 -0.590826
+v 1.248855 1.120000 -0.809174
+v 1.248855 1.180000 -0.809174
+v 1.165297 1.120000 -1.010902
+v 1.165297 1.180000 -1.010902
+v 1.010902 1.120000 -1.165297
+v 1.010902 1.180000 -1.165297
+v 0.809174 1.120000 -1.248855
+v 0.809174 1.180000 -1.248855
+v 0.590826 1.120000 -1.248855
+v 0.590826 1.180000 -1.248855
+v 0.389098 1.120000 -1.165297
+v 0.389098 1.180000 -1.165297
+v 0.234703 1.120000 -1.010902
+v 0.234703 1.180000 -1.010902
+v 0.151145 1.120000 -0.809174
+v 0.151145 1.180000 -0.809174
+v 0.151145 1.120000 -0.590826
+v 0.151145 1.180000 -0.590826
+v 0.234703 1.120000 -0.389098
+v 0.234703 1.180000 -0.389098
+v 0.389098 1.120000 -0.234703
+v 0.389098 1.180000 -0.234703
+v 0.590826 1.120000 -0.151145
+v 0.590826 1.180000 -0.151145
+v 0.809174 1.120000 -0.151145
+v 0.809174 1.180000 -0.151145
+v 1.010902 1.120000 -0.234703
+v 1.010902 1.180000 -0.234703
+v 1.165297 1.120000 -0.389098
+v 1.165297 1.180000 -0.389098
+v 1.268855 1.120000 -0.586848
+v 1.268855 1.120000 -0.813152
+v 1.268855 1.180000 -0.813152
+v 1.268855 1.180000 -0.586848
+v 1.182252 1.120000 -1.022231
+v 1.182252 1.180000 -1.022231
+v 1.022231 1.120000 -1.182252
+v 1.022231 1.180000 -1.182252
+v 0.813153 1.120000 -1.268855
+v 0.813153 1.180000 -1.268855
+v 0.586848 1.120000 -1.268855
+v 0.586848 1.180000 -1.268855
+v 0.377769 1.120000 -1.182252
+v 0.377769 1.180000 -1.182252
+v 0.217748 1.120000 -1.022231
+v 0.217748 1.180000 -1.022231
+v 0.131145 1.120000 -0.813152
+v 0.131145 1.180000 -0.813152
+v 0.131145 1.120000 -0.586848
+v 0.131145 1.180000 -0.586848
+v 0.217748 1.120000 -0.377769
+v 0.217748 1.180000 -0.377769
+v 0.377769 1.120000 -0.217748
+v 0.377769 1.180000 -0.217748
+v 0.586848 1.120000 -0.131145
+v 0.586848 1.180000 -0.131145
+v 0.813152 1.120000 -0.131145
+v 0.813152 1.180000 -0.131145
+v 1.022231 1.120000 -0.217748
+v 1.022231 1.180000 -0.217748
+v 1.182252 1.120000 -0.377769
+v 1.182252 1.180000 -0.377769
+v 0.500278 0.440000 -0.447245
+v 0.411890 0.440000 -0.464923
+v 0.464923 0.440000 -0.411890
+v 0.447245 0.440000 -0.500278
+v 0.349720 0.340000 -0.402753
+v 0.402753 0.340000 -0.349720
+v -0.447245 0.500000 0.500278
+v -0.411890 0.500000 0.464923
+v -0.464923 0.500000 0.411890
+v -0.500278 0.500000 0.447245
+v -0.556898 0.530000 0.698320
+v -0.586898 0.500000 0.685894
+v -0.698320 0.530000 0.556898
+v -0.685894 0.500000 0.586898
+v -0.685894 0.712426 0.827315
+v -0.728320 0.700000 0.827315
+v -0.827315 0.712426 0.685894
+v -0.827315 0.700000 0.728320
+v -0.503762 0.670000 0.645183
+v -0.516188 0.700000 0.615183
+v -0.645183 0.670000 0.503761
+v -0.615183 0.700000 0.516188
+v -0.728320 0.787574 0.586898
+v -0.685894 0.800000 0.586898
+v -0.586898 0.787574 0.728320
+v -0.586898 0.800000 0.685894
+v 0.000000 0.530000 0.141421
+v 0.000000 0.500000 0.098995
+v 0.000000 0.700000 0.098995
+v 0.000000 0.670000 0.141421
+v -0.385858 0.340000 0.100000
+v -0.100000 0.340000 0.385858
+v -0.100000 0.306000 0.385858
+v -0.385858 0.306000 0.100000
+v -0.420000 0.340000 0.100000
+v -0.420000 0.306000 0.100000
+v -0.100000 0.340000 0.420000
+v -0.100000 0.306000 0.420000
+v -0.385858 0.306000 0.357272
+v -0.385858 0.340000 0.357272
+v -0.357272 0.306000 0.385858
+v -0.357272 0.340000 0.385858
+v -0.415074 0.340000 0.364151
+v -0.364151 0.340000 0.415074
+v -0.364151 0.306000 0.415074
+v -0.415074 0.306000 0.364151
+v -0.685894 1.073136 0.586898
+v -0.728320 1.073136 0.586898
+v -0.586898 1.073136 0.728320
+v -0.586898 1.073136 0.685894
+v -0.728320 1.073136 0.827315
+v -0.685894 1.073136 0.827315
+v -0.827315 1.073136 0.728320
+v -0.827315 1.073136 0.685894
+v -0.701803 1.073136 0.677055
+v -0.677055 1.073136 0.712410
+v -0.712410 1.073136 0.737159
+v -0.737159 1.073136 0.701803
+v -0.712410 1.073136 0.677055
+v -0.677055 1.073136 0.701803
+v -0.701803 1.073136 0.737159
+v -0.737159 1.073136 0.712410
+v -0.737159 1.143136 0.712410
+v -0.737159 1.143136 0.701803
+v -0.712410 1.143136 0.737159
+v -0.701803 1.143136 0.737159
+v -0.677055 1.143136 0.712410
+v -0.677055 1.143136 0.701803
+v -0.701803 1.143136 0.677055
+v -0.712410 1.143136 0.677055
+v -0.728320 1.044580 0.586898
+v -0.586898 1.044580 0.685894
+v -0.685894 1.044580 0.827315
+v -0.827315 1.044580 0.728320
+v -0.685894 1.044580 0.586898
+v -0.586898 1.044580 0.728320
+v -0.728320 1.044580 0.827315
+v -0.827315 1.044580 0.685894
+v -0.686530 1.094580 0.154005
+v -0.686530 1.123136 0.154005
+v -0.154005 1.094580 0.727683
+v -0.154005 1.123136 0.727683
+v -0.727684 1.094580 1.260209
+v -0.727684 1.123136 1.260209
+v -1.260209 1.094580 0.686530
+v -1.260209 1.123136 0.686530
+v -1.260209 1.123136 0.727684
+v -0.686530 1.123136 1.260209
+v -0.154005 1.123136 0.686530
+v -0.727683 1.123136 0.154005
+v -0.727683 1.094580 0.154005
+v -0.154005 1.094580 0.686530
+v -0.686530 1.094580 1.260209
+v -1.260209 1.094580 0.727684
+v -1.248855 1.120000 0.590826
+v -1.248855 1.180000 0.590826
+v -1.248855 1.120000 0.809174
+v -1.248855 1.180000 0.809174
+v -1.165297 1.120000 1.010902
+v -1.165297 1.180000 1.010902
+v -1.010902 1.120000 1.165297
+v -1.010902 1.180000 1.165297
+v -0.809174 1.120000 1.248855
+v -0.809174 1.180000 1.248855
+v -0.590826 1.120000 1.248855
+v -0.590826 1.180000 1.248855
+v -0.389098 1.120000 1.165297
+v -0.389098 1.180000 1.165297
+v -0.234703 1.120000 1.010902
+v -0.234703 1.180000 1.010902
+v -0.151145 1.120000 0.809174
+v -0.151145 1.180000 0.809174
+v -0.151145 1.120000 0.590826
+v -0.151145 1.180000 0.590826
+v -0.234703 1.120000 0.389098
+v -0.234703 1.180000 0.389098
+v -0.389098 1.120000 0.234703
+v -0.389098 1.180000 0.234703
+v -0.590826 1.120000 0.151145
+v -0.590826 1.180000 0.151145
+v -0.809174 1.120000 0.151145
+v -0.809174 1.180000 0.151145
+v -1.010902 1.120000 0.234703
+v -1.010902 1.180000 0.234703
+v -1.165297 1.120000 0.389098
+v -1.165297 1.180000 0.389098
+v -1.268855 1.120000 0.586848
+v -1.268855 1.120000 0.813152
+v -1.268855 1.180000 0.813152
+v -1.268855 1.180000 0.586848
+v -1.182252 1.120000 1.022231
+v -1.182252 1.180000 1.022231
+v -1.022231 1.120000 1.182252
+v -1.022231 1.180000 1.182252
+v -0.813153 1.120000 1.268855
+v -0.813153 1.180000 1.268855
+v -0.586848 1.120000 1.268855
+v -0.586848 1.180000 1.268855
+v -0.377769 1.120000 1.182252
+v -0.377769 1.180000 1.182252
+v -0.217748 1.120000 1.022231
+v -0.217748 1.180000 1.022231
+v -0.131145 1.120000 0.813152
+v -0.131145 1.180000 0.813152
+v -0.131145 1.120000 0.586848
+v -0.131145 1.180000 0.586848
+v -0.217748 1.120000 0.377769
+v -0.217748 1.180000 0.377769
+v -0.377769 1.120000 0.217748
+v -0.377769 1.180000 0.217748
+v -0.586848 1.120000 0.131145
+v -0.586848 1.180000 0.131145
+v -0.813152 1.120000 0.131145
+v -0.813152 1.180000 0.131145
+v -1.022231 1.120000 0.217748
+v -1.022231 1.180000 0.217748
+v -1.182252 1.120000 0.377769
+v -1.182252 1.180000 0.377769
+v -0.500278 0.440000 0.447245
+v -0.411890 0.440000 0.464923
+v -0.464923 0.440000 0.411890
+v -0.447245 0.440000 0.500278
+v -0.349720 0.340000 0.402753
+v -0.402753 0.340000 0.349720
+v 0.447245 0.500000 0.500278
+v 0.411890 0.500000 0.464923
+v 0.464923 0.500000 0.411890
+v 0.500278 0.500000 0.447245
+v 0.556898 0.530000 0.698320
+v 0.586898 0.500000 0.685894
+v 0.698320 0.530000 0.556898
+v 0.685894 0.500000 0.586898
+v 0.685894 0.712426 0.827315
+v 0.728320 0.700000 0.827315
+v 0.827315 0.712426 0.685894
+v 0.827315 0.700000 0.728320
+v 0.503762 0.670000 0.645183
+v 0.516188 0.700000 0.615183
+v 0.645183 0.670000 0.503761
+v 0.615183 0.700000 0.516188
+v 0.728320 0.787574 0.586898
+v 0.685894 0.800000 0.586898
+v 0.586898 0.787574 0.728320
+v 0.586898 0.800000 0.685894
+v 0.385858 0.340000 0.100000
+v 0.100000 0.340000 0.385858
+v 0.100000 0.306000 0.385858
+v 0.385858 0.306000 0.100000
+v 0.420000 0.340000 0.100000
+v 0.420000 0.306000 0.100000
+v 0.100000 0.340000 0.420000
+v 0.100000 0.306000 0.420000
+v 0.385858 0.306000 0.357272
+v 0.385858 0.340000 0.357272
+v 0.357272 0.306000 0.385858
+v 0.357272 0.340000 0.385858
+v 0.415074 0.340000 0.364151
+v 0.364151 0.340000 0.415074
+v 0.364151 0.306000 0.415074
+v 0.415074 0.306000 0.364151
+v 0.685894 1.073136 0.586898
+v 0.728320 1.073136 0.586898
+v 0.586898 1.073136 0.728320
+v 0.586898 1.073136 0.685894
+v 0.728320 1.073136 0.827315
+v 0.685894 1.073136 0.827315
+v 0.827315 1.073136 0.728320
+v 0.827315 1.073136 0.685894
+v 0.701803 1.073136 0.677055
+v 0.677055 1.073136 0.712410
+v 0.712410 1.073136 0.737159
+v 0.737159 1.073136 0.701803
+v 0.712410 1.073136 0.677055
+v 0.677055 1.073136 0.701803
+v 0.701803 1.073136 0.737159
+v 0.737159 1.073136 0.712410
+v 0.737159 1.143136 0.712410
+v 0.737159 1.143136 0.701803
+v 0.712410 1.143136 0.737159
+v 0.701803 1.143136 0.737159
+v 0.677055 1.143136 0.712410
+v 0.677055 1.143136 0.701803
+v 0.701803 1.143136 0.677055
+v 0.712410 1.143136 0.677055
+v 0.728320 1.044580 0.586898
+v 0.586898 1.044580 0.685894
+v 0.685894 1.044580 0.827315
+v 0.827315 1.044580 0.728320
+v 0.685894 1.044580 0.586898
+v 0.586898 1.044580 0.728320
+v 0.728320 1.044580 0.827315
+v 0.827315 1.044580 0.685894
+v 0.686530 1.094580 0.154005
+v 0.686530 1.123136 0.154005
+v 0.154005 1.094580 0.727683
+v 0.154005 1.123136 0.727683
+v 0.727684 1.094580 1.260209
+v 0.727684 1.123136 1.260209
+v 1.260209 1.094580 0.686530
+v 1.260209 1.123136 0.686530
+v 1.260209 1.123136 0.727684
+v 0.686530 1.123136 1.260209
+v 0.154005 1.123136 0.686530
+v 0.727683 1.123136 0.154005
+v 0.727683 1.094580 0.154005
+v 0.154005 1.094580 0.686530
+v 0.686530 1.094580 1.260209
+v 1.260209 1.094580 0.727684
+v 1.248855 1.120000 0.590826
+v 1.248855 1.180000 0.590826
+v 1.248855 1.120000 0.809174
+v 1.248855 1.180000 0.809174
+v 1.165297 1.120000 1.010902
+v 1.165297 1.180000 1.010902
+v 1.010902 1.120000 1.165297
+v 1.010902 1.180000 1.165297
+v 0.809174 1.120000 1.248855
+v 0.809174 1.180000 1.248855
+v 0.590826 1.120000 1.248855
+v 0.590826 1.180000 1.248855
+v 0.389098 1.120000 1.165297
+v 0.389098 1.180000 1.165297
+v 0.234703 1.120000 1.010902
+v 0.234703 1.180000 1.010902
+v 0.151145 1.120000 0.809174
+v 0.151145 1.180000 0.809174
+v 0.151145 1.120000 0.590826
+v 0.151145 1.180000 0.590826
+v 0.234703 1.120000 0.389098
+v 0.234703 1.180000 0.389098
+v 0.389098 1.120000 0.234703
+v 0.389098 1.180000 0.234703
+v 0.590826 1.120000 0.151145
+v 0.590826 1.180000 0.151145
+v 0.809174 1.120000 0.151145
+v 0.809174 1.180000 0.151145
+v 1.010902 1.120000 0.234703
+v 1.010902 1.180000 0.234703
+v 1.165297 1.120000 0.389098
+v 1.165297 1.180000 0.389098
+v 1.268855 1.120000 0.586848
+v 1.268855 1.120000 0.813152
+v 1.268855 1.180000 0.813152
+v 1.268855 1.180000 0.586848
+v 1.182252 1.120000 1.022231
+v 1.182252 1.180000 1.022231
+v 1.022231 1.120000 1.182252
+v 1.022231 1.180000 1.182252
+v 0.813153 1.120000 1.268855
+v 0.813153 1.180000 1.268855
+v 0.586848 1.120000 1.268855
+v 0.586848 1.180000 1.268855
+v 0.377769 1.120000 1.182252
+v 0.377769 1.180000 1.182252
+v 0.217748 1.120000 1.022231
+v 0.217748 1.180000 1.022231
+v 0.131145 1.120000 0.813152
+v 0.131145 1.180000 0.813152
+v 0.131145 1.120000 0.586848
+v 0.131145 1.180000 0.586848
+v 0.217748 1.120000 0.377769
+v 0.217748 1.180000 0.377769
+v 0.377769 1.120000 0.217748
+v 0.377769 1.180000 0.217748
+v 0.586848 1.120000 0.131145
+v 0.586848 1.180000 0.131145
+v 0.813152 1.120000 0.131145
+v 0.813152 1.180000 0.131145
+v 1.022231 1.120000 0.217748
+v 1.022231 1.180000 0.217748
+v 1.182252 1.120000 0.377769
+v 1.182252 1.180000 0.377769
+v 0.500278 0.440000 0.447245
+v 0.411890 0.440000 0.464923
+v 0.464923 0.440000 0.411890
+v 0.447245 0.440000 0.500278
+v 0.349720 0.340000 0.402753
+v 0.402753 0.340000 0.349720
+vn -0.0000 1.0000 -0.0000
+vn 0.5000 0.7071 0.5000
+vn -0.5000 -0.7071 -0.5000
+vn -0.8536 -0.5000 0.1465
+vn 0.1465 -0.5000 -0.8536
+vn -0.5000 0.7071 0.5000
+vn 0.8536 0.5000 -0.1464
+vn 0.5000 0.7071 -0.5000
+vn -0.1464 0.5000 0.8536
+vn 0.5000 -0.7071 -0.5000
+vn -1.0000 -0.0000 -0.0000
+vn -0.0000 -1.0000 -0.0000
+vn -0.5000 -0.7071 0.5000
+vn -0.9998 -0.0000 -0.0186
+vn -0.0000 -0.0000 1.0000
+vn 1.0000 -0.0000 -0.0000
+vn 0.7071 -0.0000 0.7071
+vn -0.0186 -0.0000 -0.9998
+vn 0.7071 -0.0000 -0.7071
+vn -0.7071 -0.0000 0.7071
+vn -0.0000 0.9934 -0.1147
+vn 0.0015 -0.0000 -1.0000
+vn -0.0015 -0.0000 -1.0000
+vn -0.7071 -0.0000 -0.7071
+vn -0.0000 -0.0000 -1.0000
+vn -0.1147 0.9934 -0.0000
+vn -1.0000 -0.0000 -0.0015
+vn -0.0000 -0.9934 0.1147
+vn 0.1147 -0.9934 -0.0000
+vn -0.0000 -0.9934 -0.1147
+vn -0.0015 -0.0000 1.0000
+vn -1.0000 -0.0000 0.0015
+vn -0.1147 -0.9934 -0.0000
+vn 0.1147 0.9934 -0.0000
+vn 0.0015 -0.0000 1.0000
+vn -0.0000 0.9934 0.1147
+vn 1.0000 -0.0000 -0.0015
+vn 1.0000 -0.0000 0.0015
+vn -0.9239 -0.0000 -0.3827
+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.3827 -0.0000 0.9239
+vn -0.3827 -0.0000 0.9239
+vn -0.9239 -0.0000 0.3827
+vn -0.6982 -0.0000 0.7159
+vn -0.5287 -0.6640 -0.5287
+vn 0.5310 0.6603 0.5310
+vn 0.7159 -0.0000 -0.6982
+vn -0.8536 -0.5000 0.1464
+vn 0.1464 -0.5000 -0.8536
+vn -0.7587 -0.0690 0.6478
+vn -0.7070 -0.0149 0.7070
+vn 0.7070 -0.0149 -0.7070
+vn 0.6478 -0.0690 -0.7587
+vn 0.8536 -0.5000 0.1465
+vn -0.1465 -0.5000 -0.8536
+vn -0.8536 0.5000 -0.1464
+vn -0.5000 0.7071 -0.5000
+vn 0.1464 0.5000 0.8536
+vn 0.5000 -0.7071 0.5000
+vn 0.9998 -0.0000 -0.0186
+vn 0.0186 -0.0000 -0.9998
+vn 0.6982 -0.0000 0.7159
+vn 0.5287 -0.6640 -0.5287
+vn -0.5310 0.6603 0.5310
+vn -0.7159 -0.0000 -0.6982
+vn 0.8536 -0.5000 0.1464
+vn -0.1464 -0.5000 -0.8536
+vn 0.7587 -0.0690 0.6478
+vn 0.7070 -0.0149 0.7070
+vn -0.7070 -0.0149 -0.7070
+vn -0.6478 -0.0690 -0.7587
+vn -0.8536 -0.5000 -0.1465
+vn 0.1465 -0.5000 0.8536
+vn 0.8536 0.5000 0.1464
+vn -0.1464 0.5000 -0.8536
+vn -0.9998 -0.0000 0.0186
+vn -0.0186 -0.0000 0.9998
+vn -0.6982 -0.0000 -0.7159
+vn -0.5287 -0.6640 0.5287
+vn 0.5310 0.6603 -0.5310
+vn 0.7159 -0.0000 0.6982
+vn -0.8536 -0.5000 -0.1464
+vn 0.1464 -0.5000 0.8536
+vn -0.7587 -0.0690 -0.6478
+vn 0.6478 -0.0690 0.7587
+vn 0.8536 -0.5000 -0.1465
+vn -0.1465 -0.5000 0.8536
+vn -0.8536 0.5000 0.1464
+vn 0.1464 0.5000 -0.8536
+vn 0.9998 -0.0000 0.0186
+vn 0.0186 -0.0000 0.9998
+vn 0.6982 -0.0000 -0.7159
+vn 0.5287 -0.6640 0.5287
+vn -0.5310 0.6603 -0.5310
+vn -0.7159 -0.0000 0.6982
+vn 0.8536 -0.5000 -0.1464
+vn -0.1464 -0.5000 0.8536
+vn 0.7587 -0.0690 -0.6478
+vn -0.6478 -0.0690 0.7587
+vt 0.390412 0.639334
+vt 0.458120 0.642245
+vt 0.458120 0.642245
+vt 0.429752 0.662878
+vt 0.224726 0.662642
+vt 0.429752 0.662878
+vt 0.293209 0.540681
+vt 0.224642 0.735866
+vt 0.361438 0.638392
+vt 0.429668 0.736102
+vt 0.372205 0.559837
+vt 0.282511 0.559733
+vt 0.282511 0.559733
+vt 0.266402 0.645800
+vt 0.187226 0.724810
+vt 0.388116 0.645940
+vt 0.467110 0.725132
+vt 0.274897 0.545237
+vt 0.452737 0.663446
+vt 0.464614 0.675933
+vt 0.379851 0.545358
+vt 0.361551 0.540760
+vt 0.264121 0.639189
+vt 0.196406 0.641944
+vt 0.264121 0.639189
+vt 0.224726 0.662642
+vt 0.189835 0.675616
+vt 0.473602 0.736152
+vt 0.473279 0.721758
+vt 0.293096 0.638313
+vt 0.264301 0.639712
+vt 0.178040 0.348052
+vt 0.173100 0.246910
+vt 0.200502 0.284742
+vt 0.180708 0.735815
+vt 0.181065 0.721422
+vt 0.161056 0.449273
+vt 0.149596 0.422930
+vt 0.166055 0.445652
+vt 0.126909 0.391607
+vt 0.139525 0.419548
+vt 0.144524 0.415927
+vt 0.121909 0.395228
+vt 0.161056 0.449273
+vt 0.166055 0.445652
+vt 0.148439 0.421332
+vt 0.143440 0.424953
+vt 0.138368 0.417950
+vt 0.143367 0.414329
+vt 0.169488 0.346685
+vt 0.173100 0.246910
+vt 0.121909 0.267397
+vt 0.201741 0.663157
+vt 0.473324 0.653715
+vt 0.361438 0.638392
+vt 0.196406 0.641944
+vt 0.180816 0.641997
+vt 0.457582 0.644365
+vt 0.457582 0.644365
+vt 0.293096 0.638313
+vt 0.378222 0.570610
+vt 0.276469 0.570493
+vt 0.473710 0.642333
+vt 0.372205 0.559837
+vt 0.361438 0.638392
+vt 0.473710 0.642334
+vt 0.196406 0.641944
+vt 0.180792 0.662592
+vt 0.196940 0.644065
+vt 0.473687 0.662929
+vt 0.390230 0.639857
+vt 0.473708 0.644487
+vt 0.180813 0.644150
+vt 0.473708 0.644487
+vt 0.276469 0.570493
+vt 0.006219 0.860813
+vt 0.016969 0.946816
+vt 0.006219 0.946816
+vt 0.016969 0.860813
+vt 0.027720 0.946816
+vt 0.027720 0.860813
+vt 0.038470 0.946816
+vt 0.038470 0.860813
+vt 0.049220 0.946816
+vt 0.049220 0.860813
+vt 0.059971 0.946816
+vt 0.059970 0.860813
+vt 0.070721 0.946816
+vt 0.070721 0.860813
+vt 0.081471 0.946816
+vt 0.081471 0.860813
+vt 0.092221 0.946816
+vt 0.092221 0.860813
+vt 0.102972 0.946816
+vt 0.102972 0.860813
+vt 0.113722 0.946816
+vt 0.113722 0.860813
+vt 0.124472 0.946816
+vt 0.124472 0.860813
+vt 0.135223 0.946816
+vt 0.135223 0.860813
+vt 0.145973 0.946816
+vt 0.145973 0.860813
+vt 0.156723 0.946816
+vt 0.021879 0.263763
+vt 0.010751 0.391270
+vt 0.010751 0.280418
+vt 0.156723 0.860813
+vt 0.167474 0.946816
+vt 0.167474 0.860813
+vt 0.178224 0.946816
+vt 0.006843 0.410916
+vt 0.006843 0.300064
+vt 0.009022 0.431279
+vt 0.010751 0.430563
+vt 0.010751 0.319711
+vt 0.004972 0.300064
+vt 0.020557 0.448541
+vt 0.021879 0.447218
+vt 0.021879 0.336366
+vt 0.009022 0.320427
+vt 0.038535 0.458347
+vt 0.037819 0.460075
+vt 0.037819 0.349223
+vt 0.020557 0.337689
+vt 0.058181 0.464125
+vt 0.058181 0.462255
+vt 0.038535 0.347495
+vt 0.058181 0.353273
+vt 0.078543 0.460075
+vt 0.077827 0.458347
+vt 0.077827 0.347495
+vt 0.058181 0.351403
+vt 0.094483 0.447218
+vt 0.095806 0.448541
+vt 0.094483 0.336366
+vt 0.078543 0.349223
+vt 0.105611 0.430563
+vt 0.107340 0.431279
+vt 0.105611 0.319711
+vt 0.095806 0.337689
+vt 0.109519 0.410916
+vt 0.111390 0.410916
+vt 0.109519 0.300064
+vt 0.107340 0.320427
+vt 0.105611 0.391270
+vt 0.107340 0.390554
+vt 0.107340 0.279702
+vt 0.111390 0.300064
+vt 0.095806 0.373292
+vt 0.094483 0.374615
+vt 0.094483 0.263763
+vt 0.105611 0.280418
+vt 0.078543 0.361758
+vt 0.077827 0.363486
+vt 0.077827 0.252634
+vt 0.095806 0.262440
+vt 0.058181 0.359578
+vt 0.058181 0.357707
+vt 0.058181 0.246855
+vt 0.078543 0.250906
+vt 0.037819 0.361758
+vt 0.038535 0.363486
+vt 0.058181 0.248726
+vt 0.037819 0.250906
+vt 0.020557 0.373292
+vt 0.021879 0.374615
+vt 0.038535 0.252634
+vt 0.009022 0.390554
+vt 0.020557 0.262440
+vt 0.004972 0.410916
+vt 0.009022 0.279702
+vt 0.144597 0.426551
+vt 0.143739 0.425366
+vt 0.154776 0.272652
+vt 0.121909 0.267397
+vt 0.178040 0.348052
+vt 0.139337 0.419289
+vt 0.139676 0.419757
+vt 0.327380 0.540721
+vt 0.186801 0.265826
+vt 0.200502 0.284742
+vt 0.181175 0.653379
+vt 0.180816 0.641997
+vt 0.178224 0.860813
+vt 0.144597 0.426551
+vt 0.190013 0.909082
+vt 0.190013 0.995085
+vt 0.200763 0.995085
+vt 0.200763 0.909082
+vt 0.211513 0.995085
+vt 0.211513 0.909082
+vt 0.222263 0.995085
+vt 0.222263 0.909082
+vt 0.233014 0.995085
+vt 0.233014 0.909082
+vt 0.243764 0.995085
+vt 0.243764 0.909082
+vt 0.254514 0.995085
+vt 0.254514 0.909082
+vt 0.265265 0.995085
+vt 0.265265 0.909082
+vt 0.276015 0.995085
+vt 0.276015 0.909082
+vt 0.286765 0.995085
+vt 0.286765 0.909082
+vt 0.297516 0.995085
+vt 0.297516 0.909082
+vt 0.308266 0.995085
+vt 0.308266 0.909082
+vt 0.319016 0.995085
+vt 0.319016 0.909082
+vt 0.329767 0.995085
+vt 0.329767 0.909082
+vt 0.340517 0.995085
+vt 0.599451 0.447218
+vt 0.610580 0.430563
+vt 0.610580 0.319711
+vt 0.340517 0.909082
+vt 0.351267 0.995085
+vt 0.351267 0.909082
+vt 0.362018 0.995085
+vt 0.614488 0.410916
+vt 0.614488 0.300064
+vt 0.610580 0.280418
+vt 0.612308 0.279702
+vt 0.610580 0.391270
+vt 0.616358 0.410916
+vt 0.599451 0.263763
+vt 0.600774 0.262440
+vt 0.599451 0.374615
+vt 0.612308 0.390554
+vt 0.582796 0.252634
+vt 0.583512 0.250906
+vt 0.600774 0.373292
+vt 0.583512 0.361758
+vt 0.563149 0.248726
+vt 0.563149 0.246856
+vt 0.582796 0.363486
+vt 0.563149 0.357707
+vt 0.543503 0.252634
+vt 0.542787 0.250906
+vt 0.543503 0.363486
+vt 0.563149 0.359578
+vt 0.526848 0.263763
+vt 0.525525 0.262440
+vt 0.526848 0.374615
+vt 0.542787 0.361758
+vt 0.515719 0.280418
+vt 0.513991 0.279702
+vt 0.515719 0.391270
+vt 0.525525 0.373292
+vt 0.511811 0.300064
+vt 0.509941 0.300064
+vt 0.511811 0.410916
+vt 0.513991 0.390554
+vt 0.515719 0.319711
+vt 0.513991 0.320427
+vt 0.509941 0.410916
+vt 0.513991 0.431278
+vt 0.526848 0.336366
+vt 0.525525 0.337689
+vt 0.526848 0.447218
+vt 0.515719 0.430563
+vt 0.543503 0.347495
+vt 0.542787 0.349223
+vt 0.543503 0.458347
+vt 0.525525 0.448541
+vt 0.563149 0.351403
+vt 0.563149 0.353273
+vt 0.542787 0.460075
+vt 0.563149 0.464125
+vt 0.582796 0.347495
+vt 0.583512 0.349223
+vt 0.563149 0.462255
+vt 0.583512 0.460075
+vt 0.599451 0.336366
+vt 0.600774 0.337689
+vt 0.582796 0.458347
+vt 0.612308 0.320427
+vt 0.600774 0.448541
+vt 0.616358 0.300064
+vt 0.612308 0.431278
+vt 0.362018 0.909082
+vt 0.875665 0.965381
+vt 0.961668 0.965381
+vt 0.961668 0.954630
+vt 0.875665 0.954630
+vt 0.961668 0.943880
+vt 0.875665 0.943880
+vt 0.961668 0.933130
+vt 0.875665 0.933130
+vt 0.961668 0.922379
+vt 0.875665 0.922379
+vt 0.961668 0.911629
+vt 0.875665 0.911629
+vt 0.961668 0.900879
+vt 0.875665 0.900879
+vt 0.961668 0.890128
+vt 0.875665 0.890128
+vt 0.961668 0.879378
+vt 0.875665 0.879378
+vt 0.961668 0.868628
+vt 0.875665 0.868628
+vt 0.961668 0.857877
+vt 0.875665 0.857877
+vt 0.961668 0.847127
+vt 0.875665 0.847127
+vt 0.961668 0.836377
+vt 0.875665 0.836377
+vt 0.961668 0.825626
+vt 0.875665 0.825626
+vt 0.961668 0.814876
+vt 0.055835 0.562321
+vt 0.072490 0.573450
+vt 0.183342 0.573450
+vt 0.875665 0.814876
+vt 0.961668 0.804126
+vt 0.875665 0.804126
+vt 0.961668 0.793375
+vt 0.092136 0.577358
+vt 0.202988 0.577358
+vt 0.222634 0.573450
+vt 0.223350 0.575178
+vt 0.111782 0.573450
+vt 0.092136 0.579228
+vt 0.239290 0.562321
+vt 0.240613 0.563644
+vt 0.128438 0.562321
+vt 0.112498 0.575178
+vt 0.250418 0.545666
+vt 0.252147 0.546382
+vt 0.129761 0.563644
+vt 0.141295 0.546382
+vt 0.254326 0.526019
+vt 0.256197 0.526019
+vt 0.139566 0.545666
+vt 0.145345 0.526019
+vt 0.250418 0.506373
+vt 0.252147 0.505657
+vt 0.139566 0.506373
+vt 0.143474 0.526019
+vt 0.239290 0.489718
+vt 0.240613 0.488395
+vt 0.128438 0.489718
+vt 0.141295 0.505657
+vt 0.222634 0.478589
+vt 0.223350 0.476861
+vt 0.111782 0.478589
+vt 0.129761 0.488395
+vt 0.202988 0.474681
+vt 0.202988 0.472810
+vt 0.092136 0.474681
+vt 0.112498 0.476861
+vt 0.183342 0.478589
+vt 0.182626 0.476861
+vt 0.092136 0.472810
+vt 0.071774 0.476861
+vt 0.166687 0.489718
+vt 0.165364 0.488395
+vt 0.055835 0.489718
+vt 0.072490 0.478589
+vt 0.155558 0.506373
+vt 0.153830 0.505657
+vt 0.044706 0.506373
+vt 0.054512 0.488395
+vt 0.151650 0.526019
+vt 0.149779 0.526019
+vt 0.042978 0.505657
+vt 0.038927 0.526019
+vt 0.155558 0.545666
+vt 0.153830 0.546382
+vt 0.040798 0.526019
+vt 0.042978 0.546382
+vt 0.166687 0.562321
+vt 0.165364 0.563644
+vt 0.044706 0.545666
+vt 0.182626 0.575178
+vt 0.054512 0.563644
+vt 0.202988 0.579228
+vt 0.071774 0.575178
+vt 0.875665 0.793375
+vt 0.451779 0.894230
+vt 0.462530 0.980233
+vt 0.451779 0.980233
+vt 0.462530 0.894230
+vt 0.473280 0.980233
+vt 0.473280 0.894230
+vt 0.484030 0.980233
+vt 0.484030 0.894230
+vt 0.494781 0.980233
+vt 0.494781 0.894230
+vt 0.505531 0.980233
+vt 0.505531 0.894230
+vt 0.516281 0.980233
+vt 0.516281 0.894230
+vt 0.527032 0.980233
+vt 0.527032 0.894230
+vt 0.537782 0.980233
+vt 0.537782 0.894230
+vt 0.548532 0.980233
+vt 0.548532 0.894230
+vt 0.559283 0.980233
+vt 0.559283 0.894230
+vt 0.570033 0.980233
+vt 0.570033 0.894230
+vt 0.580783 0.980233
+vt 0.580783 0.894230
+vt 0.591534 0.980233
+vt 0.591533 0.894230
+vt 0.602284 0.980233
+vt 0.094483 0.786958
+vt 0.105611 0.659451
+vt 0.105611 0.770302
+vt 0.602284 0.894230
+vt 0.613034 0.980233
+vt 0.613034 0.894230
+vt 0.623784 0.980233
+vt 0.109519 0.639804
+vt 0.109519 0.750656
+vt 0.107340 0.619442
+vt 0.105611 0.620158
+vt 0.105611 0.731010
+vt 0.111390 0.750656
+vt 0.095806 0.602180
+vt 0.094483 0.603503
+vt 0.094483 0.714355
+vt 0.107340 0.730294
+vt 0.077827 0.592374
+vt 0.078543 0.590646
+vt 0.078543 0.701498
+vt 0.095806 0.713032
+vt 0.058181 0.586595
+vt 0.058181 0.588466
+vt 0.077827 0.703226
+vt 0.058181 0.697447
+vt 0.037819 0.590646
+vt 0.038535 0.592374
+vt 0.038535 0.703226
+vt 0.058181 0.699318
+vt 0.021879 0.603503
+vt 0.020557 0.602180
+vt 0.021879 0.714355
+vt 0.037819 0.701498
+vt 0.010751 0.620158
+vt 0.009023 0.619442
+vt 0.010751 0.731010
+vt 0.020557 0.713032
+vt 0.006843 0.639804
+vt 0.004972 0.639804
+vt 0.006843 0.750656
+vt 0.009023 0.730294
+vt 0.010751 0.659451
+vt 0.009023 0.660166
+vt 0.009023 0.771018
+vt 0.004972 0.750656
+vt 0.020557 0.677429
+vt 0.021879 0.676106
+vt 0.021879 0.786958
+vt 0.010751 0.770302
+vt 0.037819 0.688963
+vt 0.038535 0.687234
+vt 0.038535 0.798086
+vt 0.020557 0.788281
+vt 0.058181 0.691142
+vt 0.058181 0.693013
+vt 0.058181 0.803865
+vt 0.037819 0.799815
+vt 0.078543 0.688963
+vt 0.077827 0.687234
+vt 0.058181 0.801994
+vt 0.078543 0.799815
+vt 0.095806 0.677429
+vt 0.094483 0.676106
+vt 0.077827 0.798086
+vt 0.107340 0.660166
+vt 0.095806 0.788281
+vt 0.111390 0.639804
+vt 0.107340 0.771018
+vt 0.623784 0.894230
+s 0
+usemtl Material
+f 289/303/231 293/304/231 286/305/231
+f 257/306/232 253/307/232 251/308/232
+f 251/308/231 253/307/231 265/309/231
+f 245/310/233 247/311/233 243/312/233
+f 287/313/231 292/314/231 284/315/231
+f 248/316/234 245/310/234 244/317/234
+f 243/312/235 246/318/235 242/319/235
+f 253/307/236 264/320/236 265/309/236
+f 256/321/237 251/308/237 250/322/237
+f 263/323/238 251/308/238 262/324/238
+f 291/325/231 296/326/231 295/327/231
+f 255/328/239 252/329/239 253/307/239
+f 243/330/240 260/331/240 261/330/240
+f 311/332/241 248/316/241 315/333/241
+f 240/334/242 261/335/242 259/336/242
+f 245/337/243 258/338/243 244/317/243
+f 272/339/244 283/340/244 273/341/244
+f 270/342/245 279/343/245 278/344/245
+f 270/342/246 274/345/246 269/345/246
+f 268/346/245 273/341/245 271/347/245
+f 276/348/246 268/346/246 271/347/246
+f 276/348/247 279/343/247 277/349/247
+f 281/350/248 275/342/248 282/351/248
+f 276/348/242 283/340/242 282/351/242
+f 241/352/242 243/353/242 238/354/242
+f 246/318/249 250/322/249 242/319/249
+f 258/338/250 252/329/250 244/317/250
+f 248/316/250 252/329/250 254/355/250
+f 260/331/249 250/322/249 263/356/249
+f 290/332/231 294/311/231 288/357/231
+f 285/358/251 317/359/251 284/359/251
+f 286/305/252 318/360/252 313/361/252
+f 290/332/253 331/362/253 324/362/253
+f 314/357/254 247/311/254 311/332/254
+f 285/358/250 291/325/250 315/333/250
+f 309/363/247 284/315/247 312/364/247
+f 291/325/231 299/332/231 290/332/231
+f 288/357/231 298/303/231 289/303/231
+f 286/305/231 297/365/231 287/365/231
+f 285/358/231 292/359/231 296/326/231
+f 297/366/247 306/314/247 292/314/247
+f 305/366/231 303/303/231 300/332/231
+f 299/332/254 302/367/254 294/311/254
+f 293/304/246 305/368/246 297/365/246
+f 295/327/241 300/332/241 299/332/241
+f 298/303/249 304/304/249 293/304/249
+f 296/326/250 301/327/250 295/327/250
+f 292/359/245 307/369/245 296/326/245
+f 294/311/255 303/303/255 298/303/255
+f 255/370/245 308/371/245 254/355/245
+f 313/361/246 257/372/246 256/321/246
+f 314/357/255 246/318/255 247/311/255
+f 287/365/256 319/304/256 286/305/256
+f 321/367/255 330/373/255 320/367/255
+f 318/360/246 326/365/246 329/374/246
+f 317/359/245 328/371/245 316/375/245
+f 324/362/241 322/333/241 323/327/241
+f 288/357/257 320/367/257 314/357/257
+f 312/375/258 328/371/258 308/371/258
+f 313/361/259 329/374/259 309/376/259
+f 314/357/260 330/373/260 310/373/260
+f 291/325/261 322/333/261 315/333/261
+f 285/358/262 328/371/262 327/326/262
+f 315/333/263 331/362/263 311/332/263
+f 290/332/264 323/327/264 291/325/264
+f 287/313/265 329/363/265 326/366/265
+f 289/303/266 321/367/266 288/357/266
+f 289/303/267 330/373/267 325/303/267
+f 284/315/268 316/377/268 312/364/268
+f 367/378/241 365/379/241 364/380/241
+f 366/381/269 368/382/269 365/379/269
+f 369/383/254 370/384/254 368/382/254
+f 371/385/270 372/386/270 370/384/270
+f 373/387/255 374/388/255 372/386/255
+f 375/389/271 376/390/271 374/388/271
+f 377/391/249 378/392/249 376/390/249
+f 379/393/272 380/394/272 378/392/272
+f 381/395/246 382/396/246 380/394/246
+f 383/397/273 384/398/273 382/396/273
+f 385/399/247 386/400/247 384/398/247
+f 387/401/274 388/402/274 386/400/274
+f 389/403/245 390/404/245 388/402/245
+f 391/405/275 392/406/275 390/404/275
+f 361/407/249 362/408/249 363/409/249
+f 393/410/250 394/411/250 392/406/250
+f 395/412/276 364/413/276 394/411/276
+f 363/409/272 332/414/272 333/415/272
+f 332/414/242 365/416/242 334/417/242
+f 335/418/231 367/419/231 333/415/231
+f 334/417/242 368/420/242 336/421/242
+f 337/422/231 366/423/231 335/418/231
+f 338/424/242 368/420/242 370/425/242
+f 337/422/231 371/426/231 369/427/231
+f 338/424/242 372/428/242 340/429/242
+f 339/430/231 373/431/231 371/426/231
+f 340/429/242 374/432/242 342/433/242
+f 343/434/231 373/431/231 341/435/231
+f 344/436/242 374/432/242 376/437/242
+f 345/438/231 375/439/231 343/434/231
+f 346/440/242 376/437/242 378/441/242
+f 347/442/231 377/443/231 345/438/231
+f 348/444/242 378/441/242 380/445/242
+f 349/446/231 379/447/231 347/442/231
+f 350/448/242 380/445/242 382/449/242
+f 349/446/231 383/450/231 381/451/231
+f 350/448/242 384/452/242 352/453/242
+f 353/454/231 383/450/231 351/455/231
+f 352/453/242 386/456/242 354/457/242
+f 355/458/231 385/459/231 353/454/231
+f 356/460/242 386/456/242 388/461/242
+f 355/458/231 389/462/231 387/463/231
+f 356/460/242 390/464/242 358/465/242
+f 357/466/231 391/467/231 389/462/231
+f 358/465/242 392/468/242 360/469/242
+f 361/407/231 391/467/231 359/470/231
+f 360/469/242 394/471/242 362/408/242
+f 363/409/231 393/472/231 361/407/231
+f 362/408/242 364/473/242 332/414/242
+f 363/409/231 367/419/231 395/474/231
+f 359/470/271 360/469/271 361/407/271
+f 357/466/255 358/465/255 359/470/255
+f 355/458/270 356/460/270 357/466/270
+f 353/454/254 354/457/254 355/458/254
+f 351/455/269 352/453/269 353/454/269
+f 349/446/241 350/448/241 351/455/241
+f 347/442/276 348/444/276 349/446/276
+f 345/438/250 346/440/250 347/442/250
+f 343/434/275 344/436/275 345/438/275
+f 341/435/245 342/433/245 343/434/245
+f 339/430/274 340/429/274 341/435/274
+f 337/422/247 338/424/247 339/430/247
+f 335/418/273 336/421/273 337/422/273
+f 333/415/246 334/417/246 335/418/246
+f 310/373/249 286/305/249 313/361/249
+f 396/352/277 283/340/277 280/475/277
+f 401/476/231 272/339/231 268/346/231
+f 240/334/247 397/477/247 239/477/247
+f 239/477/249 399/478/249 238/354/249
+f 238/354/254 396/352/254 241/352/254
+f 241/352/250 398/479/250 240/334/250
+f 396/352/278 282/351/278 283/340/278
+f 274/345/231 281/350/231 400/480/231
+f 400/480/231 277/349/231 279/481/231
+f 400/480/279 398/479/279 401/476/279
+f 281/350/280 282/351/280 399/478/280
+f 289/303/231 298/303/231 293/304/231
+f 257/306/232 255/328/232 253/307/232
+f 267/482/231 262/324/231 265/309/231
+f 262/324/231 251/308/231 265/309/231
+f 245/310/233 249/362/233 247/311/233
+f 287/313/231 297/366/231 292/314/231
+f 248/316/281 249/362/281 245/310/281
+f 243/312/282 247/311/282 246/318/282
+f 253/307/236 252/370/236 264/320/236
+f 256/321/237 257/306/237 251/308/237
+f 263/323/238 250/372/238 251/308/238
+f 291/325/231 285/358/231 296/326/231
+f 255/328/239 254/355/239 252/329/239
+f 243/330/240 242/319/240 260/331/240
+f 311/332/241 249/362/241 248/316/241
+f 239/477/242 238/354/242 243/353/242
+f 243/353/242 261/335/242 239/477/242
+f 261/335/242 266/483/242 259/336/242
+f 239/477/242 261/335/242 240/334/242
+f 259/336/242 245/484/242 240/334/242
+f 245/484/242 241/352/242 240/334/242
+f 245/337/243 259/337/243 258/338/243
+f 272/339/244 280/475/244 283/340/244
+f 270/342/245 269/345/245 279/343/245
+f 270/342/246 275/342/246 274/345/246
+f 268/346/245 272/339/245 273/341/245
+f 276/348/246 277/349/246 268/346/246
+f 276/348/247 278/344/247 279/343/247
+f 281/350/248 274/345/248 275/342/248
+f 276/348/242 271/347/242 273/341/242
+f 282/351/242 275/342/242 278/344/242
+f 275/342/242 270/342/242 278/344/242
+f 276/348/242 273/341/242 283/340/242
+f 282/351/242 278/344/242 276/348/242
+f 241/352/242 245/484/242 243/353/242
+f 246/318/249 256/321/249 250/322/249
+f 258/338/250 264/485/250 252/329/250
+f 248/316/250 244/317/250 252/329/250
+f 260/331/249 242/319/249 250/322/249
+f 290/332/231 299/332/231 294/311/231
+f 285/358/251 327/326/251 317/359/251
+f 286/305/252 319/304/252 318/360/252
+f 290/332/253 311/332/253 331/362/253
+f 247/311/254 249/362/254 311/332/254
+f 311/332/254 290/332/254 314/357/254
+f 290/332/254 288/357/254 314/357/254
+f 315/333/250 248/316/250 254/355/250
+f 254/355/250 308/371/250 315/333/250
+f 308/371/250 285/358/250 315/333/250
+f 255/328/247 257/306/247 309/363/247
+f 309/363/247 287/313/247 284/315/247
+f 312/364/247 255/328/247 309/363/247
+f 291/325/231 295/327/231 299/332/231
+f 288/357/231 294/311/231 298/303/231
+f 286/305/231 293/304/231 297/365/231
+f 285/358/231 284/359/231 292/359/231
+f 297/366/247 305/366/247 306/314/247
+f 300/332/231 301/327/231 307/369/231
+f 307/369/231 306/486/231 300/332/231
+f 306/486/231 305/366/231 300/332/231
+f 305/366/231 304/304/231 303/303/231
+f 303/303/231 302/367/231 300/332/231
+f 299/332/254 300/332/254 302/367/254
+f 293/304/246 304/304/246 305/368/246
+f 295/327/241 301/327/241 300/332/241
+f 298/303/249 303/303/249 304/304/249
+f 296/326/250 307/369/250 301/327/250
+f 292/359/245 306/486/245 307/369/245
+f 294/311/255 302/367/255 303/303/255
+f 255/370/245 312/375/245 308/371/245
+f 313/361/246 309/376/246 257/372/246
+f 314/357/255 310/373/255 246/318/255
+f 287/365/256 326/365/256 319/304/256
+f 321/367/255 325/303/255 330/373/255
+f 318/360/246 319/304/246 326/365/246
+f 317/359/245 327/326/245 328/371/245
+f 324/362/241 331/362/241 322/333/241
+f 288/357/257 321/367/257 320/367/257
+f 312/375/258 316/375/258 328/371/258
+f 313/361/259 318/360/259 329/374/259
+f 314/357/260 320/367/260 330/373/260
+f 291/325/261 323/327/261 322/333/261
+f 285/358/262 308/371/262 328/371/262
+f 315/333/263 322/333/263 331/362/263
+f 290/332/264 324/362/264 323/327/264
+f 287/313/265 309/363/265 329/363/265
+f 289/303/266 325/303/266 321/367/266
+f 289/303/267 310/373/267 330/373/267
+f 284/315/268 317/314/268 316/377/268
+f 367/378/241 366/381/241 365/379/241
+f 366/381/269 369/383/269 368/382/269
+f 369/383/254 371/385/254 370/384/254
+f 371/385/270 373/387/270 372/386/270
+f 373/387/255 375/389/255 374/388/255
+f 375/389/271 377/391/271 376/390/271
+f 377/391/249 379/393/249 378/392/249
+f 379/393/272 381/395/272 380/394/272
+f 381/395/246 383/397/246 382/396/246
+f 383/397/273 385/399/273 384/398/273
+f 385/399/247 387/401/247 386/400/247
+f 387/401/274 389/403/274 388/402/274
+f 389/403/245 391/405/245 390/404/245
+f 391/405/275 393/410/275 392/406/275
+f 361/407/249 360/469/249 362/408/249
+f 393/410/250 395/412/250 394/411/250
+f 395/412/276 367/487/276 364/413/276
+f 363/409/272 362/408/272 332/414/272
+f 332/414/242 364/473/242 365/416/242
+f 335/418/231 366/423/231 367/419/231
+f 334/417/242 365/416/242 368/420/242
+f 337/422/231 369/427/231 366/423/231
+f 338/424/242 336/421/242 368/420/242
+f 337/422/231 339/430/231 371/426/231
+f 338/424/242 370/425/242 372/428/242
+f 339/430/231 341/435/231 373/431/231
+f 340/429/242 372/428/242 374/432/242
+f 343/434/231 375/439/231 373/431/231
+f 344/436/242 342/433/242 374/432/242
+f 345/438/231 377/443/231 375/439/231
+f 346/440/242 344/436/242 376/437/242
+f 347/442/231 379/447/231 377/443/231
+f 348/444/242 346/440/242 378/441/242
+f 349/446/231 381/451/231 379/447/231
+f 350/448/242 348/444/242 380/445/242
+f 349/446/231 351/455/231 383/450/231
+f 350/448/242 382/449/242 384/452/242
+f 353/454/231 385/459/231 383/450/231
+f 352/453/242 384/452/242 386/456/242
+f 355/458/231 387/463/231 385/459/231
+f 356/460/242 354/457/242 386/456/242
+f 355/458/231 357/466/231 389/462/231
+f 356/460/242 388/461/242 390/464/242
+f 357/466/231 359/470/231 391/467/231
+f 358/465/242 390/464/242 392/468/242
+f 361/407/231 393/472/231 391/467/231
+f 360/469/242 392/468/242 394/471/242
+f 363/409/231 395/474/231 393/472/231
+f 362/408/242 394/471/242 364/473/242
+f 363/409/231 333/415/231 367/419/231
+f 359/470/271 358/465/271 360/469/271
+f 357/466/255 356/460/255 358/465/255
+f 355/458/270 354/457/270 356/460/270
+f 353/454/254 352/453/254 354/457/254
+f 351/455/269 350/448/269 352/453/269
+f 349/446/241 348/444/241 350/448/241
+f 347/442/276 346/440/276 348/444/276
+f 345/438/250 344/436/250 346/440/250
+f 343/434/275 342/433/275 344/436/275
+f 341/435/245 340/429/245 342/433/245
+f 339/430/274 338/424/274 340/429/274
+f 337/422/247 336/421/247 338/424/247
+f 335/418/273 334/417/273 336/421/273
+f 333/415/246 332/414/246 334/417/246
+f 313/361/249 256/321/249 310/373/249
+f 256/321/249 246/318/249 310/373/249
+f 310/373/249 289/303/249 286/305/249
+f 280/475/283 401/476/283 398/488/283
+f 398/488/284 396/352/284 280/475/284
+f 268/346/231 277/349/231 401/476/231
+f 401/476/231 280/475/231 272/339/231
+f 240/334/247 398/479/247 397/477/247
+f 239/477/249 397/477/249 399/478/249
+f 238/354/254 399/478/254 396/352/254
+f 241/352/250 396/352/250 398/479/250
+f 396/352/278 399/478/278 282/351/278
+f 279/481/231 269/345/231 400/480/231
+f 269/345/231 274/345/231 400/480/231
+f 400/480/231 401/476/231 277/349/231
+f 400/480/279 397/477/279 398/479/279
+f 399/478/285 397/477/285 281/350/285
+f 397/477/286 400/480/286 281/350/286
+f 447/303/231 444/305/231 451/304/231
+f 421/306/236 415/308/236 417/307/236
+f 415/308/231 425/309/231 417/307/231
+f 409/310/240 407/312/240 411/311/240
+f 445/313/231 442/315/231 450/314/231
+f 412/316/287 408/317/287 409/310/287
+f 407/312/288 406/319/288 410/318/288
+f 417/307/232 425/309/232 424/320/232
+f 420/321/289 414/322/289 415/308/289
+f 263/323/290 262/324/290 415/308/290
+f 449/325/231 453/327/231 454/326/231
+f 419/328/291 417/307/291 416/329/291
+f 407/330/233 261/330/233 260/331/233
+f 469/332/246 473/333/246 412/316/246
+f 404/334/242 423/336/242 261/335/242
+f 409/337/292 408/317/292 422/338/292
+f 430/339/293 431/341/293 441/340/293
+f 428/342/245 436/344/245 437/343/245
+f 428/342/241 427/345/241 432/345/241
+f 426/346/245 429/347/245 431/341/245
+f 434/348/241 429/347/241 426/346/241
+f 434/348/250 435/349/250 437/343/250
+f 439/350/294 440/351/294 433/342/294
+f 434/348/242 440/351/242 441/340/242
+f 405/352/242 402/354/242 407/353/242
+f 410/318/254 406/319/254 414/322/254
+f 422/338/247 408/317/247 416/329/247
+f 412/316/247 418/355/247 416/329/247
+f 260/331/254 263/356/254 414/322/254
+f 448/332/231 446/357/231 452/311/231
+f 443/358/251 442/359/251 475/359/251
+f 444/305/253 471/361/253 476/360/253
+f 448/332/252 482/362/252 489/362/252
+f 472/357/249 469/332/249 411/311/249
+f 443/358/247 473/333/247 449/325/247
+f 467/363/250 470/364/250 442/315/250
+f 449/325/231 448/332/231 457/332/231
+f 446/357/231 447/303/231 456/303/231
+f 444/305/231 445/365/231 455/365/231
+f 443/358/231 454/326/231 450/359/231
+f 455/366/250 450/314/250 464/314/250
+f 463/366/231 458/332/231 461/303/231
+f 457/332/249 452/311/249 460/367/249
+f 451/304/241 455/365/241 463/368/241
+f 453/327/246 457/332/246 458/332/246
+f 456/303/254 451/304/254 462/304/254
+f 454/326/247 453/327/247 459/327/247
+f 450/359/245 454/326/245 465/369/245
+f 452/311/255 456/303/255 461/303/255
+f 419/370/245 418/355/245 466/371/245
+f 471/361/241 420/321/241 421/372/241
+f 472/357/255 411/311/255 410/318/255
+f 445/365/264 444/305/264 477/304/264
+f 479/367/255 478/367/255 488/373/255
+f 476/360/241 487/374/241 484/365/241
+f 475/359/245 474/375/245 486/371/245
+f 482/362/246 481/327/246 480/333/246
+f 446/357/267 472/357/267 478/367/267
+f 470/375/258 466/371/258 486/371/258
+f 471/361/263 467/376/263 487/374/263
+f 472/357/260 468/373/260 488/373/260
+f 449/325/265 473/333/265 480/333/265
+f 443/358/268 485/326/268 486/371/268
+f 473/333/259 469/332/259 489/362/259
+f 448/332/256 449/325/256 481/327/256
+f 445/313/261 484/366/261 487/363/261
+f 447/303/266 446/357/266 479/367/266
+f 447/303/257 483/303/257 488/373/257
+f 442/315/262 470/364/262 474/377/262
+f 525/489/246 522/490/246 523/491/246
+f 524/492/272 523/491/272 526/493/272
+f 527/494/249 526/493/249 528/495/249
+f 529/496/271 528/495/271 530/497/271
+f 531/498/255 530/497/255 532/499/255
+f 533/500/270 532/499/270 534/501/270
+f 535/502/254 534/501/254 536/503/254
+f 537/504/269 536/503/269 538/505/269
+f 539/506/241 538/505/241 540/507/241
+f 541/508/276 540/507/276 542/509/276
+f 543/510/250 542/509/250 544/511/250
+f 545/512/275 544/511/275 546/513/275
+f 547/514/245 546/513/245 548/515/245
+f 549/516/274 548/515/274 550/517/274
+f 519/518/254 521/519/254 520/520/254
+f 551/521/247 550/517/247 552/522/247
+f 553/523/273 552/522/273 522/524/273
+f 521/519/269 491/525/269 490/526/269
+f 490/526/242 492/527/242 523/528/242
+f 493/529/231 491/525/231 525/530/231
+f 492/527/242 494/531/242 526/532/242
+f 495/533/231 493/529/231 524/534/231
+f 496/535/242 528/536/242 526/532/242
+f 495/533/231 527/537/231 529/538/231
+f 496/535/242 498/539/242 530/540/242
+f 497/541/231 529/538/231 531/542/231
+f 498/539/242 500/543/242 532/544/242
+f 501/545/231 499/546/231 531/542/231
+f 502/547/242 534/548/242 532/544/242
+f 503/549/231 501/545/231 533/550/231
+f 504/551/242 536/552/242 534/548/242
+f 505/553/231 503/549/231 535/554/231
+f 506/555/242 538/556/242 536/552/242
+f 507/557/231 505/553/231 537/558/231
+f 508/559/242 540/560/242 538/556/242
+f 507/557/231 539/561/231 541/562/231
+f 508/559/242 510/563/242 542/564/242
+f 511/565/231 509/566/231 541/562/231
+f 510/563/242 512/567/242 544/568/242
+f 513/569/231 511/565/231 543/570/231
+f 514/571/242 546/572/242 544/568/242
+f 513/569/231 545/573/231 547/574/231
+f 514/571/242 516/575/242 548/576/242
+f 515/577/231 547/574/231 549/578/231
+f 516/575/242 518/579/242 550/580/242
+f 519/518/231 517/581/231 549/578/231
+f 518/579/242 520/520/242 552/582/242
+f 521/519/231 519/518/231 551/583/231
+f 520/520/242 490/526/242 522/584/242
+f 521/519/231 553/585/231 525/530/231
+f 517/581/270 519/518/270 518/579/270
+f 515/577/255 517/581/255 516/575/255
+f 513/569/271 515/577/271 514/571/271
+f 511/565/249 513/569/249 512/567/249
+f 509/566/272 511/565/272 510/563/272
+f 507/557/246 509/566/246 508/559/246
+f 505/553/273 507/557/273 506/555/273
+f 503/549/247 505/553/247 504/551/247
+f 501/545/274 503/549/274 502/547/274
+f 499/546/245 501/545/245 500/543/245
+f 497/541/275 499/546/275 498/539/275
+f 495/533/250 497/541/250 496/535/250
+f 493/529/276 495/533/276 494/531/276
+f 491/525/241 493/529/241 492/527/241
+f 468/373/254 471/361/254 444/305/254
+f 554/352/295 438/475/295 441/340/295
+f 559/476/231 426/346/231 430/339/231
+f 404/334/250 403/477/250 555/477/250
+f 403/477/254 402/354/254 557/478/254
+f 402/354/249 405/352/249 554/352/249
+f 405/352/247 404/334/247 556/479/247
+f 554/352/296 441/340/296 440/351/296
+f 432/345/231 558/480/231 439/350/231
+f 558/480/231 437/481/231 435/349/231
+f 558/480/297 559/476/297 556/479/297
+f 439/350/298 557/478/298 440/351/298
+f 447/303/231 451/304/231 456/303/231
+f 421/306/236 417/307/236 419/328/236
+f 267/482/231 425/309/231 262/324/231
+f 262/324/231 425/309/231 415/308/231
+f 409/310/240 411/311/240 413/362/240
+f 445/313/231 450/314/231 455/366/231
+f 412/316/299 409/310/299 413/362/299
+f 407/312/300 410/318/300 411/311/300
+f 417/307/232 424/320/232 416/370/232
+f 420/321/289 415/308/289 421/306/289
+f 263/323/290 415/308/290 414/372/290
+f 449/325/231 454/326/231 443/358/231
+f 419/328/291 416/329/291 418/355/291
+f 407/330/233 260/331/233 406/319/233
+f 469/332/246 412/316/246 413/362/246
+f 403/477/242 407/353/242 402/354/242
+f 407/353/242 403/477/242 261/335/242
+f 261/335/242 423/336/242 266/483/242
+f 403/477/242 404/334/242 261/335/242
+f 423/336/242 404/334/242 409/484/242
+f 409/484/242 404/334/242 405/352/242
+f 409/337/292 422/338/292 423/337/292
+f 430/339/293 441/340/293 438/475/293
+f 428/342/245 437/343/245 427/345/245
+f 428/342/241 432/345/241 433/342/241
+f 426/346/245 431/341/245 430/339/245
+f 434/348/241 426/346/241 435/349/241
+f 434/348/250 437/343/250 436/344/250
+f 439/350/294 433/342/294 432/345/294
+f 434/348/242 431/341/242 429/347/242
+f 440/351/242 436/344/242 433/342/242
+f 433/342/242 436/344/242 428/342/242
+f 434/348/242 441/340/242 431/341/242
+f 440/351/242 434/348/242 436/344/242
+f 405/352/242 407/353/242 409/484/242
+f 410/318/254 414/322/254 420/321/254
+f 422/338/247 416/329/247 424/485/247
+f 412/316/247 416/329/247 408/317/247
+f 260/331/254 414/322/254 406/319/254
+f 448/332/231 452/311/231 457/332/231
+f 443/358/251 475/359/251 485/326/251
+f 444/305/253 476/360/253 477/304/253
+f 448/332/252 489/362/252 469/332/252
+f 411/311/249 469/332/249 413/362/249
+f 469/332/249 472/357/249 448/332/249
+f 448/332/249 472/357/249 446/357/249
+f 473/333/247 418/355/247 412/316/247
+f 418/355/247 473/333/247 466/371/247
+f 466/371/247 473/333/247 443/358/247
+f 419/328/250 467/363/250 421/306/250
+f 467/363/250 442/315/250 445/313/250
+f 470/364/250 467/363/250 419/328/250
+f 449/325/231 457/332/231 453/327/231
+f 446/357/231 456/303/231 452/311/231
+f 444/305/231 455/365/231 451/304/231
+f 443/358/231 450/359/231 442/359/231
+f 455/366/250 464/314/250 463/366/250
+f 458/332/231 465/369/231 459/327/231
+f 465/369/231 458/332/231 464/486/231
+f 464/486/231 458/332/231 463/366/231
+f 463/366/231 461/303/231 462/304/231
+f 461/303/231 458/332/231 460/367/231
+f 457/332/249 460/367/249 458/332/249
+f 451/304/241 463/368/241 462/304/241
+f 453/327/246 458/332/246 459/327/246
+f 456/303/254 462/304/254 461/303/254
+f 454/326/247 459/327/247 465/369/247
+f 450/359/245 465/369/245 464/486/245
+f 452/311/255 461/303/255 460/367/255
+f 419/370/245 466/371/245 470/375/245
+f 471/361/241 421/372/241 467/376/241
+f 472/357/255 410/318/255 468/373/255
+f 445/365/264 477/304/264 484/365/264
+f 479/367/255 488/373/255 483/303/255
+f 476/360/241 484/365/241 477/304/241
+f 475/359/245 486/371/245 485/326/245
+f 482/362/246 480/333/246 489/362/246
+f 446/357/267 478/367/267 479/367/267
+f 470/375/258 486/371/258 474/375/258
+f 471/361/263 487/374/263 476/360/263
+f 472/357/260 488/373/260 478/367/260
+f 449/325/265 480/333/265 481/327/265
+f 443/358/268 486/371/268 466/371/268
+f 473/333/259 489/362/259 480/333/259
+f 448/332/256 481/327/256 482/362/256
+f 445/313/261 487/363/261 467/363/261
+f 447/303/266 479/367/266 483/303/266
+f 447/303/257 488/373/257 468/373/257
+f 442/315/262 474/377/262 475/314/262
+f 525/489/246 523/491/246 524/492/246
+f 524/492/272 526/493/272 527/494/272
+f 527/494/249 528/495/249 529/496/249
+f 529/496/271 530/497/271 531/498/271
+f 531/498/255 532/499/255 533/500/255
+f 533/500/270 534/501/270 535/502/270
+f 535/502/254 536/503/254 537/504/254
+f 537/504/269 538/505/269 539/506/269
+f 539/506/241 540/507/241 541/508/241
+f 541/508/276 542/509/276 543/510/276
+f 543/510/250 544/511/250 545/512/250
+f 545/512/275 546/513/275 547/514/275
+f 547/514/245 548/515/245 549/516/245
+f 549/516/274 550/517/274 551/521/274
+f 519/518/254 520/520/254 518/579/254
+f 551/521/247 552/522/247 553/523/247
+f 553/523/273 522/524/273 525/586/273
+f 521/519/269 490/526/269 520/520/269
+f 490/526/242 523/528/242 522/584/242
+f 493/529/231 525/530/231 524/534/231
+f 492/527/242 526/532/242 523/528/242
+f 495/533/231 524/534/231 527/537/231
+f 496/535/242 526/532/242 494/531/242
+f 495/533/231 529/538/231 497/541/231
+f 496/535/242 530/540/242 528/536/242
+f 497/541/231 531/542/231 499/546/231
+f 498/539/242 532/544/242 530/540/242
+f 501/545/231 531/542/231 533/550/231
+f 502/547/242 532/544/242 500/543/242
+f 503/549/231 533/550/231 535/554/231
+f 504/551/242 534/548/242 502/547/242
+f 505/553/231 535/554/231 537/558/231
+f 506/555/242 536/552/242 504/551/242
+f 507/557/231 537/558/231 539/561/231
+f 508/559/242 538/556/242 506/555/242
+f 507/557/231 541/562/231 509/566/231
+f 508/559/242 542/564/242 540/560/242
+f 511/565/231 541/562/231 543/570/231
+f 510/563/242 544/568/242 542/564/242
+f 513/569/231 543/570/231 545/573/231
+f 514/571/242 544/568/242 512/567/242
+f 513/569/231 547/574/231 515/577/231
+f 514/571/242 548/576/242 546/572/242
+f 515/577/231 549/578/231 517/581/231
+f 516/575/242 550/580/242 548/576/242
+f 519/518/231 549/578/231 551/583/231
+f 518/579/242 552/582/242 550/580/242
+f 521/519/231 551/583/231 553/585/231
+f 520/520/242 522/584/242 552/582/242
+f 521/519/231 525/530/231 491/525/231
+f 517/581/270 518/579/270 516/575/270
+f 515/577/255 516/575/255 514/571/255
+f 513/569/271 514/571/271 512/567/271
+f 511/565/249 512/567/249 510/563/249
+f 509/566/272 510/563/272 508/559/272
+f 507/557/246 508/559/246 506/555/246
+f 505/553/273 506/555/273 504/551/273
+f 503/549/247 504/551/247 502/547/247
+f 501/545/274 502/547/274 500/543/274
+f 499/546/245 500/543/245 498/539/245
+f 497/541/275 498/539/275 496/535/275
+f 495/533/250 496/535/250 494/531/250
+f 493/529/276 494/531/276 492/527/276
+f 491/525/241 492/527/241 490/526/241
+f 471/361/254 468/373/254 420/321/254
+f 420/321/254 468/373/254 410/318/254
+f 468/373/254 444/305/254 447/303/254
+f 438/475/301 556/488/301 559/476/301
+f 556/488/302 438/475/302 554/352/302
+f 426/346/231 559/476/231 435/349/231
+f 559/476/231 430/339/231 438/475/231
+f 404/334/250 555/477/250 556/479/250
+f 403/477/254 557/478/254 555/477/254
+f 402/354/249 554/352/249 557/478/249
+f 405/352/247 556/479/247 554/352/247
+f 554/352/296 440/351/296 557/478/296
+f 437/481/231 558/480/231 427/345/231
+f 427/345/231 558/480/231 432/345/231
+f 558/480/231 435/349/231 559/476/231
+f 558/480/297 556/479/297 555/477/297
+f 557/478/303 439/350/303 555/477/303
+f 555/477/304 439/350/304 558/480/304
+f 605/303/231 602/305/231 609/304/231
+f 579/306/238 573/308/238 575/307/238
+f 573/308/231 265/309/231 575/307/231
+f 567/310/243 565/312/243 569/311/243
+f 603/313/231 600/315/231 608/314/231
+f 570/316/305 566/317/305 567/310/305
+f 565/312/306 564/319/306 568/318/306
+f 575/307/290 265/309/290 264/320/290
+f 578/321/307 572/322/307 573/308/307
+f 583/323/232 582/324/232 573/308/232
+f 607/325/231 611/327/231 612/326/231
+f 577/328/308 575/307/308 574/329/308
+f 565/330/292 581/330/292 580/331/292
+f 627/332/241 631/333/241 570/316/241
+f 562/334/242 259/336/242 581/335/242
+f 567/337/233 566/317/233 258/338/233
+f 588/339/309 589/341/309 599/340/309
+f 586/342/255 594/344/255 595/343/255
+f 586/342/246 585/345/246 590/345/246
+f 584/346/255 587/347/255 589/341/255
+f 592/348/246 587/347/246 584/346/246
+f 592/348/249 593/349/249 595/343/249
+f 597/350/310 598/351/310 591/342/310
+f 592/348/242 598/351/242 599/340/242
+f 563/352/242 560/354/242 565/353/242
+f 568/318/247 564/319/247 572/322/247
+f 258/338/254 566/317/254 574/329/254
+f 570/316/254 576/355/254 574/329/254
+f 580/331/247 583/356/247 572/322/247
+f 606/332/231 604/357/231 610/311/231
+f 601/358/266 600/359/266 633/359/266
+f 602/305/265 629/361/265 634/360/265
+f 606/332/261 640/362/261 647/362/261
+f 630/357/250 627/332/250 569/311/250
+f 601/358/254 631/333/254 607/325/254
+f 625/363/249 628/364/249 600/315/249
+f 607/325/231 606/332/231 615/332/231
+f 604/357/231 605/303/231 614/303/231
+f 602/305/231 603/365/231 613/365/231
+f 601/358/231 612/326/231 608/359/231
+f 613/366/249 608/314/249 622/314/249
+f 621/366/231 616/332/231 619/303/231
+f 615/332/250 610/311/250 618/367/250
+f 609/304/246 613/365/246 621/368/246
+f 611/327/241 615/332/241 616/332/241
+f 614/303/247 609/304/247 620/304/247
+f 612/326/254 611/327/254 617/327/254
+f 608/359/255 612/326/255 623/369/255
+f 610/311/245 614/303/245 619/303/245
+f 577/370/255 576/355/255 624/371/255
+f 629/361/246 578/321/246 579/372/246
+f 630/357/245 569/311/245 568/318/245
+f 603/365/256 602/305/256 635/304/256
+f 637/367/245 636/367/245 646/373/245
+f 634/360/246 645/374/246 642/365/246
+f 633/359/255 632/375/255 644/371/255
+f 640/362/241 639/327/241 638/333/241
+f 604/357/262 630/357/262 636/367/262
+f 628/375/260 624/371/260 644/371/260
+f 629/361/259 625/376/259 645/374/259
+f 630/357/258 626/373/258 646/373/258
+f 607/325/253 631/333/253 638/333/253
+f 601/358/257 643/326/257 644/371/257
+f 631/333/263 627/332/263 647/362/263
+f 606/332/264 607/325/264 639/327/264
+f 603/313/252 642/366/252 645/363/252
+f 605/303/251 604/357/251 637/367/251
+f 605/303/268 641/303/268 646/373/268
+f 600/315/267 628/364/267 632/377/267
+f 683/587/241 680/588/241 681/589/241
+f 682/590/276 681/589/276 684/591/276
+f 685/592/250 684/591/250 686/593/250
+f 687/594/275 686/593/275 688/595/275
+f 689/596/245 688/595/245 690/597/245
+f 691/598/274 690/597/274 692/599/274
+f 693/600/247 692/599/247 694/601/247
+f 695/602/273 694/601/273 696/603/273
+f 697/604/246 696/603/246 698/605/246
+f 699/606/272 698/605/272 700/607/272
+f 701/608/249 700/607/249 702/609/249
+f 703/610/271 702/609/271 704/611/271
+f 705/612/255 704/611/255 706/613/255
+f 707/614/270 706/613/270 708/615/270
+f 677/616/247 679/617/247 678/618/247
+f 709/619/254 708/615/254 710/620/254
+f 711/621/269 710/620/269 680/622/269
+f 679/617/273 649/623/273 648/624/273
+f 648/624/242 650/625/242 681/626/242
+f 651/627/231 649/623/231 683/628/231
+f 650/625/242 652/629/242 684/630/242
+f 653/631/231 651/627/231 682/632/231
+f 654/633/242 686/634/242 684/630/242
+f 653/631/231 685/635/231 687/636/231
+f 654/633/242 656/637/242 688/638/242
+f 655/639/231 687/636/231 689/640/231
+f 656/637/242 658/641/242 690/642/242
+f 659/643/231 657/644/231 689/640/231
+f 660/645/242 692/646/242 690/642/242
+f 661/647/231 659/643/231 691/648/231
+f 662/649/242 694/650/242 692/646/242
+f 663/651/231 661/647/231 693/652/231
+f 664/653/242 696/654/242 694/650/242
+f 665/655/231 663/651/231 695/656/231
+f 666/657/242 698/658/242 696/654/242
+f 665/655/231 697/659/231 699/660/231
+f 666/657/242 668/661/242 700/662/242
+f 669/663/231 667/664/231 699/660/231
+f 668/661/242 670/665/242 702/666/242
+f 671/667/231 669/663/231 701/668/231
+f 672/669/242 704/670/242 702/666/242
+f 671/667/231 703/671/231 705/672/231
+f 672/669/242 674/673/242 706/674/242
+f 673/675/231 705/672/231 707/676/231
+f 674/673/242 676/677/242 708/678/242
+f 677/616/231 675/679/231 707/676/231
+f 676/677/242 678/618/242 710/680/242
+f 679/617/231 677/616/231 709/681/231
+f 678/618/242 648/624/242 680/682/242
+f 679/617/231 711/683/231 683/628/231
+f 675/679/274 677/616/274 676/677/274
+f 673/675/245 675/679/245 674/673/245
+f 671/667/275 673/675/275 672/669/275
+f 669/663/250 671/667/250 670/665/250
+f 667/664/276 669/663/276 668/661/276
+f 665/655/241 667/664/241 666/657/241
+f 663/651/269 665/655/269 664/653/269
+f 661/647/254 663/651/254 662/649/254
+f 659/643/270 661/647/270 660/645/270
+f 657/644/255 659/643/255 658/641/255
+f 655/639/271 657/644/271 656/637/271
+f 653/631/249 655/639/249 654/633/249
+f 651/627/272 653/631/272 652/629/272
+f 649/623/246 651/627/246 650/625/246
+f 626/373/247 629/361/247 602/305/247
+f 712/352/311 596/475/311 599/340/311
+f 717/476/231 584/346/231 588/339/231
+f 562/334/249 561/477/249 713/477/249
+f 561/477/247 560/354/247 715/478/247
+f 560/354/250 563/352/250 712/352/250
+f 563/352/254 562/334/254 714/479/254
+f 712/352/312 599/340/312 598/351/312
+f 590/345/231 716/480/231 597/350/231
+f 716/480/231 595/481/231 593/349/231
+f 716/480/313 717/476/313 714/479/313
+f 597/350/314 715/478/314 598/351/314
+f 605/303/231 609/304/231 614/303/231
+f 579/306/238 575/307/238 577/328/238
+f 267/482/231 265/309/231 582/324/231
+f 582/324/231 265/309/231 573/308/231
+f 567/310/243 569/311/243 571/362/243
+f 603/313/231 608/314/231 613/366/231
+f 570/316/315 567/310/315 571/362/315
+f 565/312/316 568/318/316 569/311/316
+f 575/307/290 264/320/290 574/370/290
+f 578/321/307 573/308/307 579/306/307
+f 583/323/232 573/308/232 572/372/232
+f 607/325/231 612/326/231 601/358/231
+f 577/328/308 574/329/308 576/355/308
+f 565/330/292 580/331/292 564/319/292
+f 627/332/241 570/316/241 571/362/241
+f 561/477/242 565/353/242 560/354/242
+f 565/353/242 561/477/242 581/335/242
+f 581/335/242 259/336/242 266/483/242
+f 561/477/242 562/334/242 581/335/242
+f 259/336/242 562/334/242 567/484/242
+f 567/484/242 562/334/242 563/352/242
+f 567/337/233 258/338/233 259/337/233
+f 588/339/309 599/340/309 596/475/309
+f 586/342/255 595/343/255 585/345/255
+f 586/342/246 590/345/246 591/342/246
+f 584/346/255 589/341/255 588/339/255
+f 592/348/246 584/346/246 593/349/246
+f 592/348/249 595/343/249 594/344/249
+f 597/350/310 591/342/310 590/345/310
+f 592/348/242 589/341/242 587/347/242
+f 598/351/242 594/344/242 591/342/242
+f 591/342/242 594/344/242 586/342/242
+f 592/348/242 599/340/242 589/341/242
+f 598/351/242 592/348/242 594/344/242
+f 563/352/242 565/353/242 567/484/242
+f 568/318/247 572/322/247 578/321/247
+f 258/338/254 574/329/254 264/485/254
+f 570/316/254 574/329/254 566/317/254
+f 580/331/247 572/322/247 564/319/247
+f 606/332/231 610/311/231 615/332/231
+f 601/358/266 633/359/266 643/326/266
+f 602/305/265 634/360/265 635/304/265
+f 606/332/261 647/362/261 627/332/261
+f 569/311/250 627/332/250 571/362/250
+f 627/332/250 630/357/250 606/332/250
+f 606/332/250 630/357/250 604/357/250
+f 631/333/254 576/355/254 570/316/254
+f 576/355/254 631/333/254 624/371/254
+f 624/371/254 631/333/254 601/358/254
+f 577/328/249 625/363/249 579/306/249
+f 625/363/249 600/315/249 603/313/249
+f 628/364/249 625/363/249 577/328/249
+f 607/325/231 615/332/231 611/327/231
+f 604/357/231 614/303/231 610/311/231
+f 602/305/231 613/365/231 609/304/231
+f 601/358/231 608/359/231 600/359/231
+f 613/366/249 622/314/249 621/366/249
+f 616/332/231 623/369/231 617/327/231
+f 623/369/231 616/332/231 622/486/231
+f 622/486/231 616/332/231 621/366/231
+f 621/366/231 619/303/231 620/304/231
+f 619/303/231 616/332/231 618/367/231
+f 615/332/250 618/367/250 616/332/250
+f 609/304/246 621/368/246 620/304/246
+f 611/327/241 616/332/241 617/327/241
+f 614/303/247 620/304/247 619/303/247
+f 612/326/254 617/327/254 623/369/254
+f 608/359/255 623/369/255 622/486/255
+f 610/311/245 619/303/245 618/367/245
+f 577/370/255 624/371/255 628/375/255
+f 629/361/246 579/372/246 625/376/246
+f 630/357/245 568/318/245 626/373/245
+f 603/365/256 635/304/256 642/365/256
+f 637/367/245 646/373/245 641/303/245
+f 634/360/246 642/365/246 635/304/246
+f 633/359/255 644/371/255 643/326/255
+f 640/362/241 638/333/241 647/362/241
+f 604/357/262 636/367/262 637/367/262
+f 628/375/260 644/371/260 632/375/260
+f 629/361/259 645/374/259 634/360/259
+f 630/357/258 646/373/258 636/367/258
+f 607/325/253 638/333/253 639/327/253
+f 601/358/257 644/371/257 624/371/257
+f 631/333/263 647/362/263 638/333/263
+f 606/332/264 639/327/264 640/362/264
+f 603/313/252 645/363/252 625/363/252
+f 605/303/251 637/367/251 641/303/251
+f 605/303/268 646/373/268 626/373/268
+f 600/315/267 632/377/267 633/314/267
+f 683/587/241 681/589/241 682/590/241
+f 682/590/276 684/591/276 685/592/276
+f 685/592/250 686/593/250 687/594/250
+f 687/594/275 688/595/275 689/596/275
+f 689/596/245 690/597/245 691/598/245
+f 691/598/274 692/599/274 693/600/274
+f 693/600/247 694/601/247 695/602/247
+f 695/602/273 696/603/273 697/604/273
+f 697/604/246 698/605/246 699/606/246
+f 699/606/272 700/607/272 701/608/272
+f 701/608/249 702/609/249 703/610/249
+f 703/610/271 704/611/271 705/612/271
+f 705/612/255 706/613/255 707/614/255
+f 707/614/270 708/615/270 709/619/270
+f 677/616/247 678/618/247 676/677/247
+f 709/619/254 710/620/254 711/621/254
+f 711/621/269 680/622/269 683/684/269
+f 679/617/273 648/624/273 678/618/273
+f 648/624/242 681/626/242 680/682/242
+f 651/627/231 683/628/231 682/632/231
+f 650/625/242 684/630/242 681/626/242
+f 653/631/231 682/632/231 685/635/231
+f 654/633/242 684/630/242 652/629/242
+f 653/631/231 687/636/231 655/639/231
+f 654/633/242 688/638/242 686/634/242
+f 655/639/231 689/640/231 657/644/231
+f 656/637/242 690/642/242 688/638/242
+f 659/643/231 689/640/231 691/648/231
+f 660/645/242 690/642/242 658/641/242
+f 661/647/231 691/648/231 693/652/231
+f 662/649/242 692/646/242 660/645/242
+f 663/651/231 693/652/231 695/656/231
+f 664/653/242 694/650/242 662/649/242
+f 665/655/231 695/656/231 697/659/231
+f 666/657/242 696/654/242 664/653/242
+f 665/655/231 699/660/231 667/664/231
+f 666/657/242 700/662/242 698/658/242
+f 669/663/231 699/660/231 701/668/231
+f 668/661/242 702/666/242 700/662/242
+f 671/667/231 701/668/231 703/671/231
+f 672/669/242 702/666/242 670/665/242
+f 671/667/231 705/672/231 673/675/231
+f 672/669/242 706/674/242 704/670/242
+f 673/675/231 707/676/231 675/679/231
+f 674/673/242 708/678/242 706/674/242
+f 677/616/231 707/676/231 709/681/231
+f 676/677/242 710/680/242 708/678/242
+f 679/617/231 709/681/231 711/683/231
+f 678/618/242 680/682/242 710/680/242
+f 679/617/231 683/628/231 649/623/231
+f 675/679/274 676/677/274 674/673/274
+f 673/675/245 674/673/245 672/669/245
+f 671/667/275 672/669/275 670/665/275
+f 669/663/250 670/665/250 668/661/250
+f 667/664/276 668/661/276 666/657/276
+f 665/655/241 666/657/241 664/653/241
+f 663/651/269 664/653/269 662/649/269
+f 661/647/254 662/649/254 660/645/254
+f 659/643/270 660/645/270 658/641/270
+f 657/644/255 658/641/255 656/637/255
+f 655/639/271 656/637/271 654/633/271
+f 653/631/249 654/633/249 652/629/249
+f 651/627/272 652/629/272 650/625/272
+f 649/623/246 650/625/246 648/624/246
+f 629/361/247 626/373/247 578/321/247
+f 578/321/247 626/373/247 568/318/247
+f 626/373/247 602/305/247 605/303/247
+f 596/475/317 714/488/317 717/476/317
+f 714/488/303 596/475/303 712/352/303
+f 584/346/231 717/476/231 593/349/231
+f 717/476/231 588/339/231 596/475/231
+f 562/334/249 713/477/249 714/479/249
+f 561/477/247 715/478/247 713/477/247
+f 560/354/250 712/352/250 715/478/250
+f 563/352/254 714/479/254 712/352/254
+f 712/352/312 598/351/312 715/478/312
+f 595/481/231 716/480/231 585/345/231
+f 585/345/231 716/480/231 590/345/231
+f 716/480/231 593/349/231 717/476/231
+f 716/480/313 714/479/313 713/477/313
+f 715/478/302 597/350/302 713/477/302
+f 713/477/318 597/350/318 716/480/318
+f 759/303/231 763/304/231 756/305/231
+f 737/306/290 733/307/290 731/308/290
+f 731/308/231 733/307/231 425/309/231
+f 725/310/292 727/311/292 723/312/292
+f 757/313/231 762/314/231 754/315/231
+f 728/316/319 725/310/319 724/317/319
+f 723/312/320 726/318/320 722/319/320
+f 733/307/238 424/320/238 425/309/238
+f 736/321/321 731/308/321 730/322/321
+f 583/323/236 731/308/236 582/324/236
+f 761/325/231 766/326/231 765/327/231
+f 735/328/322 732/329/322 733/307/322
+f 723/330/243 580/331/243 581/330/243
+f 781/332/246 728/316/246 785/333/246
+f 720/334/242 581/335/242 423/336/242
+f 725/337/240 422/338/240 724/317/240
+f 742/339/323 753/340/323 743/341/323
+f 740/342/255 749/343/255 748/344/255
+f 740/342/241 744/345/241 739/345/241
+f 738/346/255 743/341/255 741/347/255
+f 746/348/241 738/346/241 741/347/241
+f 746/348/254 749/343/254 747/349/254
+f 751/350/324 745/342/324 752/351/324
+f 746/348/242 753/340/242 752/351/242
+f 721/352/242 723/353/242 718/354/242
+f 726/318/250 730/322/250 722/319/250
+f 422/338/249 732/329/249 724/317/249
+f 728/316/249 732/329/249 734/355/249
+f 580/331/250 730/322/250 583/356/250
+f 760/332/231 764/311/231 758/357/231
+f 755/358/266 787/359/266 754/359/266
+f 756/305/261 788/360/261 783/361/261
+f 760/332/265 801/362/265 794/362/265
+f 784/357/247 727/311/247 781/332/247
+f 755/358/249 761/325/249 785/333/249
+f 779/363/254 754/315/254 782/364/254
+f 761/325/231 769/332/231 760/332/231
+f 758/357/231 768/303/231 759/303/231
+f 756/305/231 767/365/231 757/365/231
+f 755/358/231 762/359/231 766/326/231
+f 767/366/254 776/314/254 762/314/254
+f 775/366/231 773/303/231 770/332/231
+f 769/332/247 772/367/247 764/311/247
+f 763/304/241 775/368/241 767/365/241
+f 765/327/246 770/332/246 769/332/246
+f 768/303/250 774/304/250 763/304/250
+f 766/326/249 771/327/249 765/327/249
+f 762/359/255 777/369/255 766/326/255
+f 764/311/245 773/303/245 768/303/245
+f 735/370/255 778/371/255 734/355/255
+f 783/361/241 737/372/241 736/321/241
+f 784/357/245 726/318/245 727/311/245
+f 757/365/264 789/304/264 756/305/264
+f 791/367/245 800/373/245 790/367/245
+f 788/360/241 796/365/241 799/374/241
+f 787/359/255 798/371/255 786/375/255
+f 794/362/246 792/333/246 793/327/246
+f 758/357/268 790/367/268 784/357/268
+f 782/375/260 798/371/260 778/371/260
+f 783/361/263 799/374/263 779/376/263
+f 784/357/258 800/373/258 780/373/258
+f 761/325/252 792/333/252 785/333/252
+f 755/358/267 798/371/267 797/326/267
+f 785/333/259 801/362/259 781/332/259
+f 760/332/256 793/327/256 761/325/256
+f 757/313/253 799/363/253 796/366/253
+f 759/303/251 791/367/251 758/357/251
+f 759/303/262 800/373/262 795/303/262
+f 754/315/257 786/377/257 782/364/257
+f 837/685/246 835/686/246 834/687/246
+f 836/688/273 838/689/273 835/686/273
+f 839/690/247 840/691/247 838/689/247
+f 841/692/274 842/693/274 840/691/274
+f 843/694/245 844/695/245 842/693/245
+f 845/696/275 846/697/275 844/695/275
+f 847/698/250 848/699/250 846/697/250
+f 849/700/276 850/701/276 848/699/276
+f 851/702/241 852/703/241 850/701/241
+f 853/704/269 854/705/269 852/703/269
+f 855/706/254 856/707/254 854/705/254
+f 857/708/270 858/709/270 856/707/270
+f 859/710/255 860/711/255 858/709/255
+f 861/712/271 862/713/271 860/711/271
+f 831/714/250 832/715/250 833/716/250
+f 863/717/249 864/718/249 862/713/249
+f 865/719/272 834/720/272 864/718/272
+f 833/716/276 802/721/276 803/722/276
+f 802/721/242 835/723/242 804/724/242
+f 805/725/231 837/726/231 803/722/231
+f 804/724/242 838/727/242 806/728/242
+f 807/729/231 836/730/231 805/725/231
+f 808/731/242 838/727/242 840/732/242
+f 807/729/231 841/733/231 839/734/231
+f 808/731/242 842/735/242 810/736/242
+f 809/737/231 843/738/231 841/733/231
+f 810/736/242 844/739/242 812/740/242
+f 813/741/231 843/738/231 811/742/231
+f 814/743/242 844/739/242 846/744/242
+f 815/745/231 845/746/231 813/741/231
+f 816/747/242 846/744/242 848/748/242
+f 817/749/231 847/750/231 815/745/231
+f 818/751/242 848/748/242 850/752/242
+f 819/753/231 849/754/231 817/749/231
+f 820/755/242 850/752/242 852/756/242
+f 819/753/231 853/757/231 851/758/231
+f 820/755/242 854/759/242 822/760/242
+f 823/761/231 853/757/231 821/762/231
+f 822/760/242 856/763/242 824/764/242
+f 825/765/231 855/766/231 823/761/231
+f 826/767/242 856/763/242 858/768/242
+f 825/765/231 859/769/231 857/770/231
+f 826/767/242 860/771/242 828/772/242
+f 827/773/231 861/774/231 859/769/231
+f 828/772/242 862/775/242 830/776/242
+f 831/714/231 861/774/231 829/777/231
+f 830/776/242 864/778/242 832/715/242
+f 833/716/231 863/779/231 831/714/231
+f 832/715/242 834/780/242 802/721/242
+f 833/716/231 837/726/231 865/781/231
+f 829/777/275 830/776/275 831/714/275
+f 827/773/245 828/772/245 829/777/245
+f 825/765/274 826/767/274 827/773/274
+f 823/761/247 824/764/247 825/765/247
+f 821/762/273 822/760/273 823/761/273
+f 819/753/246 820/755/246 821/762/246
+f 817/749/272 818/751/272 819/753/272
+f 815/745/249 816/747/249 817/749/249
+f 813/741/271 814/743/271 815/745/271
+f 811/742/255 812/740/255 813/741/255
+f 809/737/270 810/736/270 811/742/270
+f 807/729/254 808/731/254 809/737/254
+f 805/725/269 806/728/269 807/729/269
+f 803/722/241 804/724/241 805/725/241
+f 780/373/250 756/305/250 783/361/250
+f 866/352/325 753/340/325 750/475/325
+f 871/476/231 742/339/231 738/346/231
+f 720/334/254 867/477/254 719/477/254
+f 719/477/250 869/478/250 718/354/250
+f 718/354/247 866/352/247 721/352/247
+f 721/352/249 868/479/249 720/334/249
+f 866/352/326 752/351/326 753/340/326
+f 744/345/231 751/350/231 870/480/231
+f 870/480/231 747/349/231 749/481/231
+f 870/480/327 868/479/327 871/476/327
+f 751/350/328 752/351/328 869/478/328
+f 759/303/231 768/303/231 763/304/231
+f 737/306/290 735/328/290 733/307/290
+f 267/482/231 582/324/231 425/309/231
+f 582/324/231 731/308/231 425/309/231
+f 725/310/292 729/362/292 727/311/292
+f 757/313/231 767/366/231 762/314/231
+f 728/316/329 729/362/329 725/310/329
+f 723/312/330 727/311/330 726/318/330
+f 733/307/238 732/370/238 424/320/238
+f 736/321/321 737/306/321 731/308/321
+f 583/323/236 730/372/236 731/308/236
+f 761/325/231 755/358/231 766/326/231
+f 735/328/322 734/355/322 732/329/322
+f 723/330/243 722/319/243 580/331/243
+f 781/332/246 729/362/246 728/316/246
+f 719/477/242 718/354/242 723/353/242
+f 723/353/242 581/335/242 719/477/242
+f 581/335/242 266/483/242 423/336/242
+f 719/477/242 581/335/242 720/334/242
+f 423/336/242 725/484/242 720/334/242
+f 725/484/242 721/352/242 720/334/242
+f 725/337/240 423/337/240 422/338/240
+f 742/339/323 750/475/323 753/340/323
+f 740/342/255 739/345/255 749/343/255
+f 740/342/241 745/342/241 744/345/241
+f 738/346/255 742/339/255 743/341/255
+f 746/348/241 747/349/241 738/346/241
+f 746/348/254 748/344/254 749/343/254
+f 751/350/324 744/345/324 745/342/324
+f 746/348/242 741/347/242 743/341/242
+f 752/351/242 745/342/242 748/344/242
+f 745/342/242 740/342/242 748/344/242
+f 746/348/242 743/341/242 753/340/242
+f 752/351/242 748/344/242 746/348/242
+f 721/352/242 725/484/242 723/353/242
+f 726/318/250 736/321/250 730/322/250
+f 422/338/249 424/485/249 732/329/249
+f 728/316/249 724/317/249 732/329/249
+f 580/331/250 722/319/250 730/322/250
+f 760/332/231 769/332/231 764/311/231
+f 755/358/266 797/326/266 787/359/266
+f 756/305/261 789/304/261 788/360/261
+f 760/332/265 781/332/265 801/362/265
+f 727/311/247 729/362/247 781/332/247
+f 781/332/247 760/332/247 784/357/247
+f 760/332/247 758/357/247 784/357/247
+f 785/333/249 728/316/249 734/355/249
+f 734/355/249 778/371/249 785/333/249
+f 778/371/249 755/358/249 785/333/249
+f 735/328/254 737/306/254 779/363/254
+f 779/363/254 757/313/254 754/315/254
+f 782/364/254 735/328/254 779/363/254
+f 761/325/231 765/327/231 769/332/231
+f 758/357/231 764/311/231 768/303/231
+f 756/305/231 763/304/231 767/365/231
+f 755/358/231 754/359/231 762/359/231
+f 767/366/254 775/366/254 776/314/254
+f 770/332/231 771/327/231 777/369/231
+f 777/369/231 776/486/231 770/332/231
+f 776/486/231 775/366/231 770/332/231
+f 775/366/231 774/304/231 773/303/231
+f 773/303/231 772/367/231 770/332/231
+f 769/332/247 770/332/247 772/367/247
+f 763/304/241 774/304/241 775/368/241
+f 765/327/246 771/327/246 770/332/246
+f 768/303/250 773/303/250 774/304/250
+f 766/326/249 777/369/249 771/327/249
+f 762/359/255 776/486/255 777/369/255
+f 764/311/245 772/367/245 773/303/245
+f 735/370/255 782/375/255 778/371/255
+f 783/361/241 779/376/241 737/372/241
+f 784/357/245 780/373/245 726/318/245
+f 757/365/264 796/365/264 789/304/264
+f 791/367/245 795/303/245 800/373/245
+f 788/360/241 789/304/241 796/365/241
+f 787/359/255 797/326/255 798/371/255
+f 794/362/246 801/362/246 792/333/246
+f 758/357/268 791/367/268 790/367/268
+f 782/375/260 786/375/260 798/371/260
+f 783/361/263 788/360/263 799/374/263
+f 784/357/258 790/367/258 800/373/258
+f 761/325/252 793/327/252 792/333/252
+f 755/358/267 778/371/267 798/371/267
+f 785/333/259 792/333/259 801/362/259
+f 760/332/256 794/362/256 793/327/256
+f 757/313/253 779/363/253 799/363/253
+f 759/303/251 795/303/251 791/367/251
+f 759/303/262 780/373/262 800/373/262
+f 754/315/257 787/314/257 786/377/257
+f 837/685/246 836/688/246 835/686/246
+f 836/688/273 839/690/273 838/689/273
+f 839/690/247 841/692/247 840/691/247
+f 841/692/274 843/694/274 842/693/274
+f 843/694/245 845/696/245 844/695/245
+f 845/696/275 847/698/275 846/697/275
+f 847/698/250 849/700/250 848/699/250
+f 849/700/276 851/702/276 850/701/276
+f 851/702/241 853/704/241 852/703/241
+f 853/704/269 855/706/269 854/705/269
+f 855/706/254 857/708/254 856/707/254
+f 857/708/270 859/710/270 858/709/270
+f 859/710/255 861/712/255 860/711/255
+f 861/712/271 863/717/271 862/713/271
+f 831/714/250 830/776/250 832/715/250
+f 863/717/249 865/719/249 864/718/249
+f 865/719/272 837/782/272 834/720/272
+f 833/716/276 832/715/276 802/721/276
+f 802/721/242 834/780/242 835/723/242
+f 805/725/231 836/730/231 837/726/231
+f 804/724/242 835/723/242 838/727/242
+f 807/729/231 839/734/231 836/730/231
+f 808/731/242 806/728/242 838/727/242
+f 807/729/231 809/737/231 841/733/231
+f 808/731/242 840/732/242 842/735/242
+f 809/737/231 811/742/231 843/738/231
+f 810/736/242 842/735/242 844/739/242
+f 813/741/231 845/746/231 843/738/231
+f 814/743/242 812/740/242 844/739/242
+f 815/745/231 847/750/231 845/746/231
+f 816/747/242 814/743/242 846/744/242
+f 817/749/231 849/754/231 847/750/231
+f 818/751/242 816/747/242 848/748/242
+f 819/753/231 851/758/231 849/754/231
+f 820/755/242 818/751/242 850/752/242
+f 819/753/231 821/762/231 853/757/231
+f 820/755/242 852/756/242 854/759/242
+f 823/761/231 855/766/231 853/757/231
+f 822/760/242 854/759/242 856/763/242
+f 825/765/231 857/770/231 855/766/231
+f 826/767/242 824/764/242 856/763/242
+f 825/765/231 827/773/231 859/769/231
+f 826/767/242 858/768/242 860/771/242
+f 827/773/231 829/777/231 861/774/231
+f 828/772/242 860/771/242 862/775/242
+f 831/714/231 863/779/231 861/774/231
+f 830/776/242 862/775/242 864/778/242
+f 833/716/231 865/781/231 863/779/231
+f 832/715/242 864/778/242 834/780/242
+f 833/716/231 803/722/231 837/726/231
+f 829/777/275 828/772/275 830/776/275
+f 827/773/245 826/767/245 828/772/245
+f 825/765/274 824/764/274 826/767/274
+f 823/761/247 822/760/247 824/764/247
+f 821/762/273 820/755/273 822/760/273
+f 819/753/246 818/751/246 820/755/246
+f 817/749/272 816/747/272 818/751/272
+f 815/745/249 814/743/249 816/747/249
+f 813/741/271 812/740/271 814/743/271
+f 811/742/255 810/736/255 812/740/255
+f 809/737/270 808/731/270 810/736/270
+f 807/729/254 806/728/254 808/731/254
+f 805/725/269 804/724/269 806/728/269
+f 803/722/241 802/721/241 804/724/241
+f 783/361/250 736/321/250 780/373/250
+f 736/321/250 726/318/250 780/373/250
+f 780/373/250 759/303/250 756/305/250
+f 750/475/331 871/476/331 868/488/331
+f 868/488/285 866/352/285 750/475/285
+f 738/346/231 747/349/231 871/476/231
+f 871/476/231 750/475/231 742/339/231
+f 720/334/254 868/479/254 867/477/254
+f 719/477/250 867/477/250 869/478/250
+f 718/354/247 869/478/247 866/352/247
+f 721/352/249 866/352/249 868/479/249
+f 866/352/326 869/478/326 752/351/326
+f 749/481/231 739/345/231 870/480/231
+f 739/345/231 744/345/231 870/480/231
+f 870/480/231 871/476/231 747/349/231
+f 870/480/327 867/477/327 868/479/327
+f 869/478/284 867/477/284 751/350/284
+f 867/477/332 870/480/332 751/350/332
+o main
+v -0.300000 0.670000 0.400000
+v -0.400000 0.670000 0.300000
+v -0.300000 0.900000 0.400000
+v -0.300000 1.000000 0.300000
+v -0.400000 0.900000 0.300000
+v -0.400000 0.670000 -0.300000
+v -0.300000 0.670000 -0.400000
+v -0.300000 1.000000 -0.300000
+v -0.300000 0.900000 -0.400000
+v -0.400000 0.900000 -0.300000
+v 0.400000 0.670000 0.300000
+v 0.300000 0.670000 0.400000
+v 0.300000 1.000000 0.300000
+v 0.300000 0.900000 0.400000
+v 0.400000 0.900000 0.300000
+v 0.300000 0.670000 -0.400000
+v 0.400000 0.670000 -0.300000
+v 0.300000 1.000000 -0.300000
+v 0.400000 0.900000 -0.300000
+v 0.300000 0.900000 -0.400000
+vn -0.0000 -0.0000 1.0000
+vn 1.0000 -0.0000 -0.0000
+vn -0.0000 1.0000 -0.0000
+vn -1.0000 -0.0000 -0.0000
+vn -0.0000 -0.0000 -1.0000
+vn -0.5774 0.5774 0.5774
+vn -0.5774 0.5774 -0.5774
+vn 0.5774 0.5774 0.5774
+vn 0.5774 0.5774 -0.5774
+vn -0.7071 -0.0000 0.7071
+vn -0.7071 0.7071 -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.7071 0.7071 -0.0000
+vn 0.7071 -0.0000 0.7071
+vn -0.0000 0.7071 0.7071
+vn -0.0000 -1.0000 -0.0000
+vt 0.679453 0.754780
+vt 0.499631 0.795101
+vt 0.555867 0.689170
+vt 0.754435 0.613540
+vt 0.574613 0.653860
+vt 0.630850 0.547930
+vt 0.895676 0.688522
+vt 0.733508 0.738215
+vt 0.789745 0.632285
+vt 0.904400 0.331059
+vt 0.724578 0.371379
+vt 0.780815 0.265449
+vt 0.829418 0.472299
+vt 0.649595 0.512620
+vt 0.705832 0.406689
+vt 0.830066 0.812107
+vt 0.839439 0.794452
+vt 0.857094 0.803825
+vt 0.905048 0.670867
+vt 0.913331 0.697895
+vt 0.724136 0.755870
+vt 0.715853 0.728843
+vt 0.772090 0.622912
+vt 0.799118 0.614630
+vt 0.913773 0.313404
+vt 0.790187 0.247794
+vt 0.848163 0.436989
+vt 0.773181 0.578229
+vt 0.698198 0.719470
+vt 0.547585 0.662142
+vt 0.433373 0.578878
+vt 0.623216 0.860710
+vt 0.489609 0.472947
+vt 0.516637 0.464665
+vt 0.622568 0.520902
+vt 0.441655 0.605906
+s 0
+f 885/783/333 872/784/333 883/785/333
+f 890/786/334 882/787/334 888/788/334
+f 879/789/335 884/790/335 889/791/335
+f 876/792/336 877/793/336 873/794/336
+f 880/795/337 887/796/337 878/797/337
+f 874/798/338 875/799/338 876/800/338
+f 879/789/339 880/801/339 881/802/339
+f 884/790/340 885/803/340 886/804/340
+f 889/791/341 890/805/341 891/806/341
+f 874/807/342 873/794/342 872/808/342
+f 879/789/343 876/800/343 875/799/343
+f 878/797/344 881/809/344 880/795/344
+f 889/791/345 880/801/345 879/789/345
+f 888/788/346 891/810/346 890/786/346
+f 884/790/347 890/786/347 889/791/347
+f 883/785/348 886/811/348 885/783/348
+f 875/799/349 885/803/349 884/790/349
+f 888/788/350 883/812/350 873/813/350
+f 885/783/333 874/814/333 872/784/333
+f 890/786/334 886/811/334 882/787/334
+f 879/789/335 875/799/335 884/790/335
+f 876/792/336 881/809/336 877/793/336
+f 880/795/337 891/810/337 887/796/337
+f 874/807/342 876/792/342 873/794/342
+f 879/789/343 881/802/343 876/800/343
+f 878/797/344 877/793/344 881/809/344
+f 889/791/345 891/806/345 880/801/345
+f 888/788/346 887/796/346 891/810/346
+f 884/790/347 886/811/347 890/786/347
+f 883/785/348 882/787/348 886/811/348
+f 875/799/349 874/798/349 885/803/349
+f 873/813/350 877/815/350 878/816/350
+f 878/816/350 887/817/350 888/788/350
+f 888/788/350 882/787/350 883/812/350
+f 883/812/350 872/818/350 873/813/350
+f 873/813/350 878/816/350 888/788/350
diff --git a/src/main/resources/assets/gregtech/textures/model/drone.png b/src/main/resources/assets/gregtech/textures/model/drone.png
new file mode 100644
index 0000000000..7cef90199b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/model/drone.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Ariel.png b/src/main/resources/assets/gregtech/textures/solarsystem/Ariel.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Ariel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Arrokoth.png b/src/main/resources/assets/gregtech/textures/solarsystem/Arrokoth.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Arrokoth.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Callisto.png b/src/main/resources/assets/gregtech/textures/solarsystem/Callisto.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Callisto.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Ceres.png b/src/main/resources/assets/gregtech/textures/solarsystem/Ceres.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Ceres.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Deimos.png b/src/main/resources/assets/gregtech/textures/solarsystem/Deimos.png
new file mode 100644
index 0000000000..65bd8e318b
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Deimos.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Enceladus.png b/src/main/resources/assets/gregtech/textures/solarsystem/Enceladus.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Enceladus.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Europa.png b/src/main/resources/assets/gregtech/textures/solarsystem/Europa.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Europa.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Ganymede.png b/src/main/resources/assets/gregtech/textures/solarsystem/Ganymede.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Ganymede.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Hyperion.png b/src/main/resources/assets/gregtech/textures/solarsystem/Hyperion.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Hyperion.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Iapetus.png b/src/main/resources/assets/gregtech/textures/solarsystem/Iapetus.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Iapetus.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Io.png b/src/main/resources/assets/gregtech/textures/solarsystem/Io.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Io.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Jupiter.png b/src/main/resources/assets/gregtech/textures/solarsystem/Jupiter.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Jupiter.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/KuiperBelt.png b/src/main/resources/assets/gregtech/textures/solarsystem/KuiperBelt.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/KuiperBelt.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/MakeMake.png b/src/main/resources/assets/gregtech/textures/solarsystem/MakeMake.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/MakeMake.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Mars.png b/src/main/resources/assets/gregtech/textures/solarsystem/Mars.png
new file mode 100644
index 0000000000..8a329cfc0c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Mars.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Mercury.png b/src/main/resources/assets/gregtech/textures/solarsystem/Mercury.png
new file mode 100644
index 0000000000..c9dbcfe54c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Mercury.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Mimas.png b/src/main/resources/assets/gregtech/textures/solarsystem/Mimas.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Mimas.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Miranda.png b/src/main/resources/assets/gregtech/textures/solarsystem/Miranda.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Miranda.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Moon.png b/src/main/resources/assets/gregtech/textures/solarsystem/Moon.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Moon.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Neptune.png b/src/main/resources/assets/gregtech/textures/solarsystem/Neptune.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Neptune.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Nereid.png b/src/main/resources/assets/gregtech/textures/solarsystem/Nereid.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Nereid.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Oberon.png b/src/main/resources/assets/gregtech/textures/solarsystem/Oberon.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Oberon.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Overworld.png b/src/main/resources/assets/gregtech/textures/solarsystem/Overworld.png
new file mode 100644
index 0000000000..5f02e84a39
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Overworld.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Phobos.png b/src/main/resources/assets/gregtech/textures/solarsystem/Phobos.png
new file mode 100644
index 0000000000..27425a829c
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Phobos.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Phoebe.png b/src/main/resources/assets/gregtech/textures/solarsystem/Phoebe.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Phoebe.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Pluto.png b/src/main/resources/assets/gregtech/textures/solarsystem/Pluto.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Pluto.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Proteus.png b/src/main/resources/assets/gregtech/textures/solarsystem/Proteus.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Proteus.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Rhea.png b/src/main/resources/assets/gregtech/textures/solarsystem/Rhea.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Rhea.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Saturn.png b/src/main/resources/assets/gregtech/textures/solarsystem/Saturn.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Saturn.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Sol.png b/src/main/resources/assets/gregtech/textures/solarsystem/Sol.png
new file mode 100644
index 0000000000..791713e47a
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Sol.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Tethys.png b/src/main/resources/assets/gregtech/textures/solarsystem/Tethys.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Tethys.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Titan.png b/src/main/resources/assets/gregtech/textures/solarsystem/Titan.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Titan.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Titania.png b/src/main/resources/assets/gregtech/textures/solarsystem/Titania.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Titania.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Triton.png b/src/main/resources/assets/gregtech/textures/solarsystem/Triton.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Triton.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Umbriel.png b/src/main/resources/assets/gregtech/textures/solarsystem/Umbriel.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Umbriel.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Uranus.png b/src/main/resources/assets/gregtech/textures/solarsystem/Uranus.png
new file mode 100644
index 0000000000..08a5655183
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Uranus.png
Binary files differ
diff --git a/src/main/resources/assets/gregtech/textures/solarsystem/Venus.png b/src/main/resources/assets/gregtech/textures/solarsystem/Venus.png
new file mode 100644
index 0000000000..d96fce6dc2
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/solarsystem/Venus.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds.json b/src/main/resources/assets/ic2/sounds.json
new file mode 100644
index 0000000000..7f89c0458b
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds.json
@@ -0,0 +1,389 @@
+{
+ "machines.ExtractorOp": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "ExtractorOp",
+ "stream": false
+ }
+ ]
+ },
+ "machines.CompressorOp": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "CompressorOp",
+ "stream": false
+ }
+ ]
+ },
+ "machines.ElectroFurnaceLoop": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "ElectroFurnaceLoop",
+ "stream": false
+ }
+ ]
+ },
+ "machines.InductionLoop": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "InductionLoop",
+ "stream": false
+ }
+ ]
+ },
+ "machines.InterruptOne": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "InterruptOne",
+ "stream": false
+ }
+ ]
+ },
+ "machines.IronFurnaceOp": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "IronFurnaceOp",
+ "stream": false
+ }
+ ]
+ },
+ "machines.KaChing": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "KaChing",
+ "stream": false
+ }
+ ]
+ },
+ "machines.MaceratorOp": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "MaceratorOp",
+ "stream": false
+ }
+ ]
+ },
+ "machines.MachineOverload": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "MachineOverload",
+ "stream": false
+ }
+ ]
+ },
+ "machines.MagnetizerLoop": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "MagnetizerLoop",
+ "stream": false
+ }
+ ]
+ },
+ "machines.MinerOp": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "MinerOp",
+ "stream": false
+ }
+ ]
+ },
+ "machines.PumpOp": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "PumpOp",
+ "stream": false
+ }
+ ]
+ },
+ "machines.RecyclerOp": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "RecyclerOp",
+ "stream": false
+ }
+ ]
+ },
+ "tools.BatteryUse": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "BatteryUse",
+ "stream": false
+ }
+ ]
+ },
+ "tools.Dynamiteomote": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "Dynamiteomote",
+ "stream": false
+ }
+ ]
+ },
+ "tools.InsulationCutters": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "InsulationCutters",
+ "stream": false
+ }
+ ]
+ },
+ "tools.NukeExplosion": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "NukeExplosion",
+ "stream": false
+ }
+ ]
+ },
+ "tools.ODScanner": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "ODScanner",
+ "stream": false
+ }
+ ]
+ },
+ "tools.Painter": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "Painter",
+ "stream": false
+ }
+ ]
+ },
+ "tools.RubberTrampoline": {
+ "category": "block",
+ "sounds": [
+ {
+ "name": "RubberTrampoline",
+ "stream": false
+ }
+ ]
+ },
+ "tools.Treetap": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "Treetap",
+ "stream": false
+ }
+ ]
+ },
+ "tools.Wrench": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "Wrench",
+ "stream": false
+ }
+ ]
+ },
+ "tools.chainsaw.ChainsawIdle": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "ChainsawIdle",
+ "stream": false
+ }
+ ]
+ },
+ "tools.chainsaw.ChainsawStop": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "ChainsawStop",
+ "stream": false
+ }
+ ]
+ },
+ "tools.chainsaw.ChainsawUseOne": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "ChainsawUseOne",
+ "stream": false
+ }
+ ]
+ },
+ "tools.chainsaw.ChainsawUseTwo": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "ChainsawUseTwo",
+ "stream": false
+ }
+ ]
+ },
+ "tools.drill.DrillHard": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "DrillHard",
+ "stream": false
+ }
+ ]
+ },
+ "tools.drill.DrillSoft": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "DrillSoft",
+ "stream": false
+ }
+ ]
+ },
+ "tools.drill.DrillUseLoop": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "DrillUseLoop",
+ "stream": false
+ }
+ ]
+ },
+ "tools.jetpack.JetpackFire": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "JetpackFire",
+ "stream": false
+ }
+ ]
+ },
+ "tools.jetpack.JetpackLoop": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "JetpackLoop",
+ "stream": false
+ }
+ ]
+ },
+ "tools.mininglaser.MiningLaser": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "MiningLaser",
+ "stream": false
+ }
+ ]
+ },
+ "tools.mininglaser.MiningLaserExplosive": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "MiningLaserExplosive",
+ "stream": false
+ }
+ ]
+ },
+ "tools.mininglaser.MiningLaserLongRange": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "MiningLaserLongRange",
+ "stream": false
+ }
+ ]
+ },
+ "tools.mininglaser.MiningLaserLowFocus": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "MiningLaserLowFocus",
+ "stream": false
+ }
+ ]
+ },
+ "tools.mininglaser.MiningLaserScatter": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "MiningLaserScatter",
+ "stream": false
+ }
+ ]
+ },
+ "tools.nanosabre.NanosabreIdle": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "NanosabreIdle",
+ "stream": false
+ }
+ ]
+ },
+ "tools.nanosabre.NanosabrePowerup": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "NanosabrePowerup",
+ "stream": false
+ }
+ ]
+ },
+ "tools.nanosabre.NanosabreSwing1": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "NanosabreSwing1",
+ "stream": false
+ }
+ ]
+ },
+ "tools.nanosabre.NanosabreSwing2": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "NanosabreSwing2",
+ "stream": false
+ }
+ ]
+ },
+ "tools.nanosabre.NanosabreSwing3": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "NanosabreSwing3",
+ "stream": false
+ }
+ ]
+ },
+ "tools.quantumsuit.HelmetLoop": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "HelmetLoop",
+ "stream": false
+ }
+ ]
+ },
+ "tools.quantumsuit.QuantumsuitBoots": {
+ "category": "player",
+ "sounds": [
+ {
+ "name": "QuantumsuitBoots",
+ "stream": false
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/ic2/sounds/BatteryUse.ogg b/src/main/resources/assets/ic2/sounds/BatteryUse.ogg
new file mode 100644
index 0000000000..a1157b88cf
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/BatteryUse.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/ChainsawIdle.ogg b/src/main/resources/assets/ic2/sounds/ChainsawIdle.ogg
new file mode 100644
index 0000000000..7bcf606ca0
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/ChainsawIdle.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/ChainsawStop.ogg b/src/main/resources/assets/ic2/sounds/ChainsawStop.ogg
new file mode 100644
index 0000000000..84898a26ff
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/ChainsawStop.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/ChainsawUseOne.ogg b/src/main/resources/assets/ic2/sounds/ChainsawUseOne.ogg
new file mode 100644
index 0000000000..974e62264c
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/ChainsawUseOne.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/ChainsawUseTwo.ogg b/src/main/resources/assets/ic2/sounds/ChainsawUseTwo.ogg
new file mode 100644
index 0000000000..a043296b30
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/ChainsawUseTwo.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/CompressorOp.ogg b/src/main/resources/assets/ic2/sounds/CompressorOp.ogg
new file mode 100644
index 0000000000..f704e732d8
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/CompressorOp.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/DrillHard.ogg b/src/main/resources/assets/ic2/sounds/DrillHard.ogg
new file mode 100644
index 0000000000..f52f1f0836
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/DrillHard.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/DrillSoft.ogg b/src/main/resources/assets/ic2/sounds/DrillSoft.ogg
new file mode 100644
index 0000000000..6342bd0d55
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/DrillSoft.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/DrillUseLoop.ogg b/src/main/resources/assets/ic2/sounds/DrillUseLoop.ogg
new file mode 100644
index 0000000000..8f737bca64
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/DrillUseLoop.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/Dynamiteomote.ogg b/src/main/resources/assets/ic2/sounds/Dynamiteomote.ogg
new file mode 100644
index 0000000000..9b06ff384a
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/Dynamiteomote.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/ElectroFurnaceLoop.ogg b/src/main/resources/assets/ic2/sounds/ElectroFurnaceLoop.ogg
new file mode 100644
index 0000000000..41c7a7db35
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/ElectroFurnaceLoop.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/ExtractorOp.ogg b/src/main/resources/assets/ic2/sounds/ExtractorOp.ogg
new file mode 100644
index 0000000000..2449021900
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/ExtractorOp.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/HelmetLoop.ogg b/src/main/resources/assets/ic2/sounds/HelmetLoop.ogg
new file mode 100644
index 0000000000..886f3ed3ef
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/HelmetLoop.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/InductionLoop.ogg b/src/main/resources/assets/ic2/sounds/InductionLoop.ogg
new file mode 100644
index 0000000000..55fa716f00
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/InductionLoop.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/InsulationCutters.ogg b/src/main/resources/assets/ic2/sounds/InsulationCutters.ogg
new file mode 100644
index 0000000000..1af94f4fa8
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/InsulationCutters.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/InterruptOne.ogg b/src/main/resources/assets/ic2/sounds/InterruptOne.ogg
new file mode 100644
index 0000000000..1ef5a1d179
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/InterruptOne.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/IronFurnaceOp.ogg b/src/main/resources/assets/ic2/sounds/IronFurnaceOp.ogg
new file mode 100644
index 0000000000..f9f01ad7fb
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/IronFurnaceOp.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/JetpackFire.ogg b/src/main/resources/assets/ic2/sounds/JetpackFire.ogg
new file mode 100644
index 0000000000..a00e94edde
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/JetpackFire.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/JetpackLoop.ogg b/src/main/resources/assets/ic2/sounds/JetpackLoop.ogg
new file mode 100644
index 0000000000..a32f3f182f
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/JetpackLoop.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/KaChing.ogg b/src/main/resources/assets/ic2/sounds/KaChing.ogg
new file mode 100644
index 0000000000..bc7a621c27
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/KaChing.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/MaceratorOp.ogg b/src/main/resources/assets/ic2/sounds/MaceratorOp.ogg
new file mode 100644
index 0000000000..cd5ac34d8c
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/MaceratorOp.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/MachineOverload.ogg b/src/main/resources/assets/ic2/sounds/MachineOverload.ogg
new file mode 100644
index 0000000000..5442440f15
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/MachineOverload.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/MagnetizerLoop.ogg b/src/main/resources/assets/ic2/sounds/MagnetizerLoop.ogg
new file mode 100644
index 0000000000..8e98e69183
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/MagnetizerLoop.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/MinerOp.ogg b/src/main/resources/assets/ic2/sounds/MinerOp.ogg
new file mode 100644
index 0000000000..18f268dbba
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/MinerOp.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/MiningLaser.ogg b/src/main/resources/assets/ic2/sounds/MiningLaser.ogg
new file mode 100644
index 0000000000..823cf77077
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/MiningLaser.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/MiningLaserExplosive.ogg b/src/main/resources/assets/ic2/sounds/MiningLaserExplosive.ogg
new file mode 100644
index 0000000000..edc93fc4a7
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/MiningLaserExplosive.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/MiningLaserLongRange.ogg b/src/main/resources/assets/ic2/sounds/MiningLaserLongRange.ogg
new file mode 100644
index 0000000000..b1252d3f23
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/MiningLaserLongRange.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/MiningLaserLowFocus.ogg b/src/main/resources/assets/ic2/sounds/MiningLaserLowFocus.ogg
new file mode 100644
index 0000000000..4997c3ccbe
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/MiningLaserLowFocus.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/MiningLaserScatter.ogg b/src/main/resources/assets/ic2/sounds/MiningLaserScatter.ogg
new file mode 100644
index 0000000000..f98fbbf8e7
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/MiningLaserScatter.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/NanosabreIdle.ogg b/src/main/resources/assets/ic2/sounds/NanosabreIdle.ogg
new file mode 100644
index 0000000000..eea64ad5cf
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/NanosabreIdle.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/NanosabrePowerup.ogg b/src/main/resources/assets/ic2/sounds/NanosabrePowerup.ogg
new file mode 100644
index 0000000000..b7a5459f6d
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/NanosabrePowerup.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/NanosabreSwing1.ogg b/src/main/resources/assets/ic2/sounds/NanosabreSwing1.ogg
new file mode 100644
index 0000000000..2dadba72f1
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/NanosabreSwing1.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/NanosabreSwing2.ogg b/src/main/resources/assets/ic2/sounds/NanosabreSwing2.ogg
new file mode 100644
index 0000000000..f1ca68e346
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/NanosabreSwing2.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/NanosabreSwing3.ogg b/src/main/resources/assets/ic2/sounds/NanosabreSwing3.ogg
new file mode 100644
index 0000000000..ed40a279c3
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/NanosabreSwing3.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/NukeExplosion.ogg b/src/main/resources/assets/ic2/sounds/NukeExplosion.ogg
new file mode 100644
index 0000000000..8a898ec2da
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/NukeExplosion.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/ODScanner.ogg b/src/main/resources/assets/ic2/sounds/ODScanner.ogg
new file mode 100644
index 0000000000..2a15ea5086
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/ODScanner.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/Painter.ogg b/src/main/resources/assets/ic2/sounds/Painter.ogg
new file mode 100644
index 0000000000..2f8339eee2
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/Painter.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/PumpOp.ogg b/src/main/resources/assets/ic2/sounds/PumpOp.ogg
new file mode 100644
index 0000000000..ebc8769588
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/PumpOp.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/QuantumsuitBoots.ogg b/src/main/resources/assets/ic2/sounds/QuantumsuitBoots.ogg
new file mode 100644
index 0000000000..4b78c50221
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/QuantumsuitBoots.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/RecyclerOp.ogg b/src/main/resources/assets/ic2/sounds/RecyclerOp.ogg
new file mode 100644
index 0000000000..a1a7576603
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/RecyclerOp.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/RubberTrampoline.ogg b/src/main/resources/assets/ic2/sounds/RubberTrampoline.ogg
new file mode 100644
index 0000000000..388fdd97b9
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/RubberTrampoline.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/Treetap.ogg b/src/main/resources/assets/ic2/sounds/Treetap.ogg
new file mode 100644
index 0000000000..22cef9b62c
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/Treetap.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/sounds/Wrench.ogg b/src/main/resources/assets/ic2/sounds/Wrench.ogg
new file mode 100644
index 0000000000..947afeaf97
--- /dev/null
+++ b/src/main/resources/assets/ic2/sounds/Wrench.ogg
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.1.png
new file mode 100644
index 0000000000..90ad8e46df
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.2.png
new file mode 100644
index 0000000000..ee3bb79084
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.3.png
new file mode 100644
index 0000000000..b40d492613
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.4.png
new file mode 100644
index 0000000000..63eaa935b3
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Argentia.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bauxia.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bauxia.1.png
new file mode 100644
index 0000000000..8e7ebe5e6e
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bauxia.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bauxia.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bauxia.2.png
new file mode 100644
index 0000000000..da0eb480e1
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bauxia.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bauxia.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bauxia.3.png
new file mode 100644
index 0000000000..48853f821f
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bauxia.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.1.png
new file mode 100644
index 0000000000..cabc716b35
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.2.png
new file mode 100644
index 0000000000..5987977cac
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.3.png
new file mode 100644
index 0000000000..8e4facac8b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.4.png
new file mode 100644
index 0000000000..ba0f6fcbdd
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Blazereed.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.1.png
new file mode 100644
index 0000000000..127d257992
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.2.png
new file mode 100644
index 0000000000..b88dc69adf
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.3.png
new file mode 100644
index 0000000000..65317e1245
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.4.png
new file mode 100644
index 0000000000..9efd62dfd8
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Bobsyeruncleranks.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Brown Mushrooms.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Brown Mushrooms.1.png
new file mode 100644
index 0000000000..750a8bcd0b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Brown Mushrooms.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Brown Mushrooms.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Brown Mushrooms.2.png
new file mode 100644
index 0000000000..81852cdf2e
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Brown Mushrooms.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Brown Mushrooms.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Brown Mushrooms.3.png
new file mode 100644
index 0000000000..d99e7dbf7e
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Brown Mushrooms.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.1.png
new file mode 100644
index 0000000000..d63739e61a
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.2.png
new file mode 100644
index 0000000000..e29e558d1a
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.3.png
new file mode 100644
index 0000000000..eae36abb96
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.4.png
new file mode 100644
index 0000000000..68bad7a4a2
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Chilly.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Coppon.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Coppon.1.png
new file mode 100644
index 0000000000..f9e220c439
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Coppon.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Coppon.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Coppon.2.png
new file mode 100644
index 0000000000..14c2a7ff2c
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Coppon.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Coppon.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Coppon.3.png
new file mode 100644
index 0000000000..b70d0c5a4b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Coppon.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.1.png
new file mode 100644
index 0000000000..d63739e61a
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.2.png
new file mode 100644
index 0000000000..7e765de308
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.3.png
new file mode 100644
index 0000000000..bb223ff079
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.4.png
new file mode 100644
index 0000000000..fb7bfd4ada
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corium.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.1.png
new file mode 100644
index 0000000000..25c855f4c4
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.2.png
new file mode 100644
index 0000000000..6aabb1a1ee
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.3.png
new file mode 100644
index 0000000000..cea7b5b9f3
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.4.png
new file mode 100644
index 0000000000..f992637933
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Corpseplant.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.1.png
new file mode 100644
index 0000000000..46c0b5893b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.2.png
new file mode 100644
index 0000000000..699888a801
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.3.png
new file mode 100644
index 0000000000..f0ef9d5f52
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.4.png
new file mode 100644
index 0000000000..ca3372eb07
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Creeperweed.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.1.png
new file mode 100644
index 0000000000..bc8dc8e6b1
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.2.png
new file mode 100644
index 0000000000..a5239f5607
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.3.png
new file mode 100644
index 0000000000..abfe04066c
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.4.png
new file mode 100644
index 0000000000..a73a9b9ac1
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Cucumber.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.1.png
new file mode 100644
index 0000000000..cabc716b35
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.2.png
new file mode 100644
index 0000000000..5987977cac
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.3.png
new file mode 100644
index 0000000000..8e4facac8b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.4.png
new file mode 100644
index 0000000000..5faf10faf1
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Diareed.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Eggplant.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Eggplant.1.png
new file mode 100644
index 0000000000..e6e58f3750
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Eggplant.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Eggplant.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Eggplant.2.png
new file mode 100644
index 0000000000..b304558063
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Eggplant.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Eggplant.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Eggplant.3.png
new file mode 100644
index 0000000000..1c9f6ee3e3
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Eggplant.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.1.png
new file mode 100644
index 0000000000..6ba7cdd890
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.2.png
new file mode 100644
index 0000000000..43caddeafa
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.3.png
new file mode 100644
index 0000000000..620fb6b061
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.4.png
new file mode 100644
index 0000000000..6f56903c5b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Enderbloom.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.1.png
new file mode 100644
index 0000000000..6fb3dccf7b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.2.png
new file mode 100644
index 0000000000..fa1c1a9831
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.3.png
new file mode 100644
index 0000000000..f086a7b065
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.4.png
new file mode 100644
index 0000000000..02e48dc108
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Evil Ore.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.1.png
new file mode 100644
index 0000000000..f88373951b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.2.png
new file mode 100644
index 0000000000..62cca13689
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.3.png
new file mode 100644
index 0000000000..97120def73
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.4.png
new file mode 100644
index 0000000000..94d48acd2e
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Fertilia.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.1.png
new file mode 100644
index 0000000000..42d42935fd
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.2.png
new file mode 100644
index 0000000000..e6315f5055
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.3.png
new file mode 100644
index 0000000000..aed5d46ae3
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.4.png
new file mode 100644
index 0000000000..324738cf8f
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Flax.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Galvania.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Galvania.1.png
new file mode 100644
index 0000000000..90ad8e46df
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Galvania.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Galvania.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Galvania.2.png
new file mode 100644
index 0000000000..b40d492613
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Galvania.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Galvania.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Galvania.3.png
new file mode 100644
index 0000000000..63eaa935b3
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Galvania.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.1.png
new file mode 100644
index 0000000000..2490a32e28
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.2.png
new file mode 100644
index 0000000000..1ab25deb19
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.3.png
new file mode 100644
index 0000000000..c1e230218b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.4.png
new file mode 100644
index 0000000000..2f29a013af
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.5.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.5.png
new file mode 100644
index 0000000000..82e64d9038
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.5.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.6.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.6.png
new file mode 100644
index 0000000000..1079a4efe6
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.6.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.7.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.7.png
new file mode 100644
index 0000000000..5dbb456cc8
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Glowheat.7.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.1.png
new file mode 100644
index 0000000000..f88373951b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.2.png
new file mode 100644
index 0000000000..62cca13689
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.3.png
new file mode 100644
index 0000000000..97120def73
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.4.png
new file mode 100644
index 0000000000..3322cd2199
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.God of Thunder.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.1.png
new file mode 100644
index 0000000000..d63739e61a
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.2.png
new file mode 100644
index 0000000000..7e765de308
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.3.png
new file mode 100644
index 0000000000..52759cc225
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.4.png
new file mode 100644
index 0000000000..b795386234
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Grape.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.1.png
new file mode 100644
index 0000000000..90ad8e46df
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.2.png
new file mode 100644
index 0000000000..ee3bb79084
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.3.png
new file mode 100644
index 0000000000..4fc94fe6fe
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.4.png
new file mode 100644
index 0000000000..9f3ef39431
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Indigo.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.1.png
new file mode 100644
index 0000000000..42d42935fd
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.2.png
new file mode 100644
index 0000000000..e6315f5055
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.3.png
new file mode 100644
index 0000000000..aed5d46ae3
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.4.png
new file mode 100644
index 0000000000..d0758dd325
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lazulia.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.1.png
new file mode 100644
index 0000000000..4e314b464e
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.2.png
new file mode 100644
index 0000000000..5019340276
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.3.png
new file mode 100644
index 0000000000..dc797b6df2
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.4.png
new file mode 100644
index 0000000000..7db446305f
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Lemon.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.1.png
new file mode 100644
index 0000000000..127d257992
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.2.png
new file mode 100644
index 0000000000..b88dc69adf
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.3.png
new file mode 100644
index 0000000000..65317e1245
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.4.png
new file mode 100644
index 0000000000..2454f06a0e
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Liveroots.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.1.png
new file mode 100644
index 0000000000..ad620b9e35
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.2.png
new file mode 100644
index 0000000000..662271d732
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.3.png
new file mode 100644
index 0000000000..3f0509a4ac
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.4.png
new file mode 100644
index 0000000000..8c4442c3a8
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Meatrose.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Micadia.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Micadia.1.png
new file mode 100644
index 0000000000..b95eb1e276
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Micadia.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Micadia.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Micadia.2.png
new file mode 100644
index 0000000000..f5427ea234
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Micadia.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Micadia.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Micadia.3.png
new file mode 100644
index 0000000000..bf4b268690
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Micadia.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Milkwart.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Milkwart.1.png
new file mode 100644
index 0000000000..efd80cf042
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Milkwart.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Milkwart.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Milkwart.2.png
new file mode 100644
index 0000000000..9abb1ce437
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Milkwart.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Milkwart.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Milkwart.3.png
new file mode 100644
index 0000000000..003b9c5587
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Milkwart.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Nickelback.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Nickelback.1.png
new file mode 100644
index 0000000000..90ad8e46df
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Nickelback.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Nickelback.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Nickelback.2.png
new file mode 100644
index 0000000000..b40d492613
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Nickelback.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Nickelback.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Nickelback.3.png
new file mode 100644
index 0000000000..63eaa935b3
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Nickelback.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.1.png
new file mode 100644
index 0000000000..370d0c7eb5
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.2.png
new file mode 100644
index 0000000000..a4ec995872
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.3.png
new file mode 100644
index 0000000000..8a3d4c913f
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.4.png
new file mode 100644
index 0000000000..667f4b0351
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Oilberries.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.1.png
new file mode 100644
index 0000000000..127d257992
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.2.png
new file mode 100644
index 0000000000..b88dc69adf
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.3.png
new file mode 100644
index 0000000000..65317e1245
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.4.png
new file mode 100644
index 0000000000..9efd62dfd8
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Olivia.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.1.png
new file mode 100644
index 0000000000..d63739e61a
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.2.png
new file mode 100644
index 0000000000..67fba896d5
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.3.png
new file mode 100644
index 0000000000..9dfa7586eb
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.4.png
new file mode 100644
index 0000000000..0f6f42c712
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Onion.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.1.png
new file mode 100644
index 0000000000..90ad8e46df
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.2.png
new file mode 100644
index 0000000000..ee3bb79084
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.3.png
new file mode 100644
index 0000000000..b40d492613
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.4.png
new file mode 100644
index 0000000000..63eaa935b3
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Platina.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.1.png
new file mode 100644
index 0000000000..8e7ebe5e6e
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.2.png
new file mode 100644
index 0000000000..2ea05b018c
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.3.png
new file mode 100644
index 0000000000..da0eb480e1
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.4.png
new file mode 100644
index 0000000000..b0ab2738ec
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Plumbilia.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Pyrolusium.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Pyrolusium.1.png
new file mode 100644
index 0000000000..90ad8e46df
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Pyrolusium.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Pyrolusium.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Pyrolusium.2.png
new file mode 100644
index 0000000000..b40d492613
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Pyrolusium.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Pyrolusium.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Pyrolusium.3.png
new file mode 100644
index 0000000000..63eaa935b3
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Pyrolusium.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.1.png
new file mode 100644
index 0000000000..47c25a6847
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.2.png
new file mode 100644
index 0000000000..ae6a735d3c
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.3.png
new file mode 100644
index 0000000000..9c9b2dac58
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.4.png
new file mode 100644
index 0000000000..c10f06f175
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Quantaria.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.1.png
new file mode 100644
index 0000000000..42d42935fd
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.2.png
new file mode 100644
index 0000000000..e6315f5055
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.3.png
new file mode 100644
index 0000000000..aed5d46ae3
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.4.png
new file mode 100644
index 0000000000..f470e73038
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Rape.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.1.png
new file mode 100644
index 0000000000..98a9ebba44
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.2.png
new file mode 100644
index 0000000000..ea69e647cd
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.3.png
new file mode 100644
index 0000000000..3c35906376
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.4.png
new file mode 100644
index 0000000000..eae7aff5fc
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Reactoria.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Red Mushrooms.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Red Mushrooms.1.png
new file mode 100644
index 0000000000..11a25acb49
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Red Mushrooms.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Red Mushrooms.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Red Mushrooms.2.png
new file mode 100644
index 0000000000..2e843682d8
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Red Mushrooms.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Red Mushrooms.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Red Mushrooms.3.png
new file mode 100644
index 0000000000..787b118c89
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Red Mushrooms.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.1.png
new file mode 100644
index 0000000000..127d257992
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.2.png
new file mode 100644
index 0000000000..b88dc69adf
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.3.png
new file mode 100644
index 0000000000..65317e1245
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.4.png
new file mode 100644
index 0000000000..65fa2252c9
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Sapphirum.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Scheelinium.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Scheelinium.1.png
new file mode 100644
index 0000000000..90ad8e46df
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Scheelinium.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Scheelinium.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Scheelinium.2.png
new file mode 100644
index 0000000000..b40d492613
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Scheelinium.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Scheelinium.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Scheelinium.3.png
new file mode 100644
index 0000000000..63eaa935b3
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Scheelinium.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.1.png
new file mode 100644
index 0000000000..c527e6a432
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.2.png
new file mode 100644
index 0000000000..48cd7bfd10
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.3.png
new file mode 100644
index 0000000000..ca9b40cd31
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.4.png
new file mode 100644
index 0000000000..97f87ed26f
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Slimeplant.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.1.png
new file mode 100644
index 0000000000..d3bda2a3a0
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.2.png
new file mode 100644
index 0000000000..da219a8be5
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.3.png
new file mode 100644
index 0000000000..ba2367a865
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.4.png
new file mode 100644
index 0000000000..10b9aa0519
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Spidernip.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.1.png
new file mode 100644
index 0000000000..41a0d40688
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.2.png
new file mode 100644
index 0000000000..78d79ca73e
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.3.png
new file mode 100644
index 0000000000..94ea1c1a89
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.4.png
new file mode 100644
index 0000000000..870cf1c286
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Stargatium.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.1.png
new file mode 100644
index 0000000000..efd80cf042
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.2.png
new file mode 100644
index 0000000000..9abb1ce437
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.3.png
new file mode 100644
index 0000000000..003b9c5587
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.4.png
new file mode 100644
index 0000000000..85c48b3d1c
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Starwart.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.1.png
new file mode 100644
index 0000000000..127d257992
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.2.png
new file mode 100644
index 0000000000..b88dc69adf
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.3.png
new file mode 100644
index 0000000000..65317e1245
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.4.png
new file mode 100644
index 0000000000..fb2d338833
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Steeleafranks.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.1.png
new file mode 100644
index 0000000000..d63739e61a
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.2.png
new file mode 100644
index 0000000000..64d88d145f
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.3.png
new file mode 100644
index 0000000000..fa1b8af849
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.4.png
new file mode 100644
index 0000000000..9ca0cbf690
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tea.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.1.png
new file mode 100644
index 0000000000..4a631b0228
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.2.png
new file mode 100644
index 0000000000..92fee7174b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.3.png
new file mode 100644
index 0000000000..712e19de8b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.4.png
new file mode 100644
index 0000000000..05f0c44d43
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tearstalks.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tine.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tine.1.png
new file mode 100644
index 0000000000..6fb3dccf7b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tine.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tine.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tine.2.png
new file mode 100644
index 0000000000..fa1c1a9831
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tine.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tine.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tine.3.png
new file mode 100644
index 0000000000..f086a7b065
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tine.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Titania.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Titania.1.png
new file mode 100644
index 0000000000..8e7ebe5e6e
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Titania.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Titania.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Titania.2.png
new file mode 100644
index 0000000000..da0eb480e1
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Titania.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Titania.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Titania.3.png
new file mode 100644
index 0000000000..6d0085ae51
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Titania.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.1.png
new file mode 100644
index 0000000000..d63739e61a
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.2.png
new file mode 100644
index 0000000000..7e765de308
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.3.png
new file mode 100644
index 0000000000..6096ded861
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.4.png
new file mode 100644
index 0000000000..a5ecc68bc5
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Tomato.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.1.png
new file mode 100644
index 0000000000..370d0c7eb5
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.2.png
new file mode 100644
index 0000000000..a4ec995872
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.3.png
new file mode 100644
index 0000000000..8a3d4c913f
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.4.png
new file mode 100644
index 0000000000..92df3f282e
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Transformium.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.1.png
new file mode 100644
index 0000000000..484bc93a95
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.2.png
new file mode 100644
index 0000000000..5faf10faf1
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.3.png
new file mode 100644
index 0000000000..05f0c44d43
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.4.png
new file mode 100644
index 0000000000..6f56903c5b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.5.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.5.png
new file mode 100644
index 0000000000..4e501e2326
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Trollplant.5.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.1.png
new file mode 100644
index 0000000000..cabc716b35
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.2.png
new file mode 100644
index 0000000000..5987977cac
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.3.png
new file mode 100644
index 0000000000..8e4facac8b
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.4.png
new file mode 100644
index 0000000000..7cef946c24
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Withereed.4.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.1.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.1.png
new file mode 100644
index 0000000000..25c855f4c4
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.1.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.2.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.2.png
new file mode 100644
index 0000000000..6aabb1a1ee
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.2.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.3.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.3.png
new file mode 100644
index 0000000000..cea7b5b9f3
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.3.png
Binary files differ
diff --git a/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.4.png b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.4.png
new file mode 100644
index 0000000000..f992637933
--- /dev/null
+++ b/src/main/resources/assets/ic2/textures/blocks/crop/blockCrop.Zomplant.4.png
Binary files differ
diff --git a/src/main/resources/assets/minecraft/textures/models/armor/cloakingdevice_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/cloakingdevice_layer_1.png
new file mode 100644
index 0000000000..71586ca5ab
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/models/armor/cloakingdevice_layer_1.png
Binary files differ
diff --git a/src/main/resources/assets/minecraft/textures/models/armor/lapotronpack_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/lapotronpack_layer_1.png
new file mode 100644
index 0000000000..a789907620
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/models/armor/lapotronpack_layer_1.png
Binary files differ
diff --git a/src/main/resources/assets/minecraft/textures/models/armor/lithiumbatpack_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/lithiumbatpack_layer_1.png
new file mode 100644
index 0000000000..48128c86d2
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/models/armor/lithiumbatpack_layer_1.png
Binary files differ
diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info
index a7205e0523..97d0fb729b 100644
--- a/src/main/resources/mcmod.info
+++ b/src/main/resources/mcmod.info
@@ -1,55 +1,39 @@
-{
- "modListVersion": 2,
- "modList": [{
- "modid": "${modId}",
- "name": "${modName}",
- "description": "A Gregtech Addon.",
- "version": "${modVersion}",
- "mcversion": "${minecraftVersion}",
- "url": "https://github.com/bartimaeusnek/bartworks",
- "updateUrl": "",
- "authorList": ["bartimaeusnek"],
- "credits": "Gregorius Techneticies for making gregtech and allowing me to port his old stuff.\n Austin Appleby and Yonik Seeley for creating and putting the MurmurHash3 into the public domain.\n Spluff and EmeraldsEmerald for the Awesome Textures aswell.",
- "logoFile": "",
- "screenshots": [],
- "parent": "",
- "requiredMods": [],
- "dependencies": [],
- "dependants": [],
- "useDependencyInformation": false
- },{
- "modid": "bartworkscrossmod",
- "name": "BartWorks Mod Additions",
- "description": "",
- "version": "${modVersion}",
- "mcversion": "${minecraftVersion}",
- "url": "https://github.com/bartimaeusnek/bartworks",
- "updateUrl": "",
- "authorList": ["bartimaeusnek"],
- "credits": "",
- "logoFile": "",
- "screenshots": [],
- "parent": "bartworks",
- "requiredMods": [],
- "dependencies": [],
- "dependants": [],
- "useDependencyInformation": false
- },{
- "modid": "bartworkscrossmodtgregworkscontainer",
- "name": "BartWorks Mod Additions - TGregworks Container",
- "description": "",
- "version": "${modVersion}",
- "mcversion": "${minecraftVersion}",
- "url": "https://github.com/bartimaeusnek/bartworks",
- "updateUrl": "",
- "authorList": ["bartimaeusnek"],
- "credits": "",
- "logoFile": "",
- "screenshots": [],
- "parent": "bartworks",
- "requiredMods": [],
- "dependencies": [],
- "dependants": [],
- "useDependencyInformation": false
- }]
-}
+[
+ {
+ "modid": "${modId}",
+ "name": "${modName}",
+ "description": "This Mod adds the awesome Technology of GregTech-Intergalactical to your World!",
+ "mcversion": "${minecraftVersion}",
+ "version": "${modVersion}",
+ "logoFile": "/assets/gregtech_addon/textures/LogoGTI_Long.png",
+ "url": "http://forum.industrial-craft.net/index.php?page=Thread&threadID=11488",
+ "updateUrl": "",
+ "authors": [
+ "Gregorius Techneticies",
+ "Blood Asp"
+ ],
+ "credits": "Notch and Mojang for Minecraft, Alblaka and his Team for IndustrialCraft, Mr. Brain for many of the Crop Textures, OvermindDL for helping me with Code, TheSirusKing and matix for a few Textures",
+ "parent": "",
+ "screenshots": [],
+ "dependencies": [
+ "Industrialcraft",
+ "structurelib"
+ ]
+ },
+ {
+ "modid": "ggfab",
+ "name": "GigaGramFab",
+ "description": "Production at scale",
+ "version": "${modVersion}",
+ "mcversion": "${minecraftVersion}",
+ "url": "https://glease.github.io/GigaGramFab",
+ "updateUrl": "",
+ "authorList": ["glee8e"],
+ "credits": "",
+ "logoFile": "",
+ "screenshots": [],
+ "dependencies": [
+ "gregtech"
+ ]
+ }
+]
diff --git a/src/test/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBaseTest.java b/src/test/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBaseTest.java
new file mode 100644
index 0000000000..a6f874b956
--- /dev/null
+++ b/src/test/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBaseTest.java
@@ -0,0 +1,46 @@
+package gregtech.api.metatileentity.implementations;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.ArrayList;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+import org.mockito.Answers;
+import org.mockito.Mockito;
+
+/**
+ * Tests some functions of {@link GT_MetaTileEntity_MultiBlockBase}.
+ * <p>
+ * The classes and tests are non-public because JUnit5
+ * <a href="https://junit.org/junit5/docs/snapshot/user-guide/#writing-tests-classes-and-methods">recommends</a>
+ * to omit the {@code public} modifier.
+ */
+@SuppressWarnings("NewClassNamingConvention") /*
+ * The name of the original class does not fit the convention,
+ * but refactoring that is a story for another time.
+ */
+class GT_MetaTileEntity_MultiBlockBaseTest {
+
+ @ParameterizedTest
+ @CsvSource({ "0,0,false", "2,0,false", "1,0,true", "1,1,false", "0,1,true", "0,2,true", "0,3,false" })
+ void checkExoticAndNormalEnergyHatches_parametrizedTest(int exoticEnergyHatchesCount, int normalEnergyHatchesCount,
+ boolean expectedResult) {
+ GT_MetaTileEntity_MultiBlockBase testedClassInstance = Mockito
+ .mock(GT_MetaTileEntity_MultiBlockBase.class, Answers.CALLS_REAL_METHODS);
+
+ testedClassInstance.setEnergyHatches(fillList(GT_MetaTileEntity_Hatch_Energy.class, normalEnergyHatchesCount));
+ testedClassInstance.setExoticEnergyHatches(fillList(GT_MetaTileEntity_Hatch.class, exoticEnergyHatchesCount));
+
+ assertEquals(expectedResult, testedClassInstance.checkExoticAndNormalEnergyHatches());
+ }
+
+ private <T> ArrayList<T> fillList(Class<T> classData, int returnedListSize) {
+ T objectToInsert = Mockito.mock(classData);
+ ArrayList<T> listToReturn = new ArrayList<>();
+ for (int i = 0; i < returnedListSize; i++) {
+ listToReturn.add(objectToInsert);
+ }
+ return listToReturn;
+ }
+}
diff --git a/src/test/java/gregtech/common/items/CombTypeTest.java b/src/test/java/gregtech/common/items/CombTypeTest.java
new file mode 100644
index 0000000000..d9ae1a46ca
--- /dev/null
+++ b/src/test/java/gregtech/common/items/CombTypeTest.java
@@ -0,0 +1,42 @@
+package gregtech.common.items;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.jupiter.api.Test;
+
+class CombTypeTest {
+
+ @Test
+ void noDuplicateID() {
+ Set<Integer> seen = new HashSet<>();
+ for (CombType value : CombType.values()) {
+ assertTrue(seen.add(value.getId()), "Comb type must not have duplicate ID");
+ }
+ }
+
+ @Test
+ void noNegativeID() {
+ for (CombType value : CombType.values()) {
+ if (value == CombType._NULL) assertTrue(value.getId() <= 0, "Comb type ID must be negative for _NULL");
+ else assertTrue(value.getId() >= 0, "Comb type ID must not be negative");
+ }
+ }
+
+ @Test
+ void invalidIDNotNull() {
+ assertEquals(CombType.valueOf(-2), CombType._NULL, "Invalid ID Lookup should result in _NULL");
+ assertEquals(CombType.valueOf(Integer.MAX_VALUE), CombType._NULL, "Invalid ID Lookup should result in _NULL");
+ }
+
+ @Test
+ void validIDCorrectComb() {
+ for (CombType value : CombType.values()) {
+ if (value != CombType._NULL)
+ assertEquals(CombType.valueOf(value.getId()), value, "Valid ID Lookup should result in correct output");
+ }
+ }
+}
diff --git a/src/test/java/gregtech/globalenergymap/IGlobalWirelessEnergy_UnitTest.java b/src/test/java/gregtech/globalenergymap/IGlobalWirelessEnergy_UnitTest.java
new file mode 100644
index 0000000000..012055133b
--- /dev/null
+++ b/src/test/java/gregtech/globalenergymap/IGlobalWirelessEnergy_UnitTest.java
@@ -0,0 +1,127 @@
+package gregtech.globalenergymap;
+
+import static gregtech.common.misc.GlobalVariableStorage.GlobalEnergy;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.clearGlobalEnergyInformationMaps;
+import static gregtech.common.misc.WirelessNetworkManager.getUserEU;
+import static gregtech.common.misc.WirelessNetworkManager.strongCheckOrAddUser;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.math.BigInteger;
+import java.util.UUID;
+
+import org.junit.jupiter.api.Test;
+
+import gregtech.common.misc.spaceprojects.SpaceProjectManager;
+
+class IGlobalWirelessEnergy_UnitTest {
+
+ static final String message = "Comparison failed";
+
+ @Test
+ void IGlobalWirelessEnergy_AddingEU() {
+
+ UUID test_id = UUID.randomUUID();
+
+ addEUToGlobalEnergyMap(test_id, new BigInteger("1"));
+ assertEquals(GlobalEnergy.get(test_id), new BigInteger("1"), message);
+
+ addEUToGlobalEnergyMap(test_id, 1);
+ assertEquals(GlobalEnergy.get(test_id), new BigInteger("2"), message);
+
+ addEUToGlobalEnergyMap(test_id, 1L);
+ assertEquals(GlobalEnergy.get(test_id), new BigInteger("3"), message);
+
+ clearGlobalEnergyInformationMaps();
+ }
+
+ @Test
+ void IGlobalWirelessEnergy_NoNegativeEU() {
+
+ UUID user_uuid = UUID.randomUUID();
+
+ strongCheckOrAddUser(user_uuid);
+
+ assertFalse(addEUToGlobalEnergyMap(user_uuid, new BigInteger("-1")));
+ assertEquals(getUserEU(user_uuid), BigInteger.ZERO, message);
+
+ assertTrue(addEUToGlobalEnergyMap(user_uuid, new BigInteger("1")));
+ assertEquals(getUserEU(user_uuid), BigInteger.ONE, message);
+
+ assertFalse(addEUToGlobalEnergyMap(user_uuid, new BigInteger("-2")));
+ assertEquals(getUserEU(user_uuid), BigInteger.ONE, message);
+
+ assertTrue(addEUToGlobalEnergyMap(user_uuid, new BigInteger("1")));
+ assertEquals(getUserEU(user_uuid), BigInteger.valueOf(2L), message);
+
+ assertTrue(addEUToGlobalEnergyMap(user_uuid, new BigInteger("-2")));
+ assertEquals(getUserEU(user_uuid), BigInteger.ZERO, message);
+
+ clearGlobalEnergyInformationMaps();
+ }
+
+ @Test
+ void IGlobalWirelessEnergy_StrongCheckOrAddUser() {
+ UUID user_uuid = UUID.randomUUID();
+
+ strongCheckOrAddUser(user_uuid);
+ assertEquals(GlobalEnergy.get(user_uuid), BigInteger.ZERO, message);
+
+ clearGlobalEnergyInformationMaps();
+ }
+
+ @Test
+ void IGlobalWirelessEnergy_TeamChange() {
+
+ UUID user_uuid_0 = UUID.randomUUID();
+
+ UUID user_uuid_1 = UUID.randomUUID();
+
+ UUID user_uuid_2 = UUID.randomUUID();
+
+ strongCheckOrAddUser(user_uuid_0);
+ strongCheckOrAddUser(user_uuid_1);
+ strongCheckOrAddUser(user_uuid_2);
+
+ assertEquals(getUserEU(user_uuid_0), BigInteger.ZERO, message);
+ assertEquals(getUserEU(user_uuid_1), BigInteger.ZERO, message);
+ assertEquals(getUserEU(user_uuid_2), BigInteger.ZERO, message);
+
+ SpaceProjectManager.putInTeam(user_uuid_0, user_uuid_1);
+ SpaceProjectManager.putInTeam(user_uuid_2, user_uuid_1);
+
+ assertEquals(SpaceProjectManager.getLeader(user_uuid_0), user_uuid_1, message);
+ assertEquals(SpaceProjectManager.getLeader(user_uuid_2), user_uuid_1, message);
+
+ assertTrue(addEUToGlobalEnergyMap(user_uuid_0, BigInteger.ONE));
+ assertTrue(addEUToGlobalEnergyMap(user_uuid_2, BigInteger.ONE));
+
+ assertEquals(getUserEU(user_uuid_0), BigInteger.valueOf(2L), message);
+ assertEquals(getUserEU(user_uuid_1), BigInteger.valueOf(2L), message);
+ assertEquals(getUserEU(user_uuid_2), BigInteger.valueOf(2L), message);
+
+ assertTrue(addEUToGlobalEnergyMap(user_uuid_0, BigInteger.valueOf(-1L)));
+
+ assertEquals(getUserEU(user_uuid_0), BigInteger.ONE, message);
+ assertEquals(getUserEU(user_uuid_1), BigInteger.ONE, message);
+ assertEquals(getUserEU(user_uuid_2), BigInteger.ONE, message);
+
+ assertFalse(addEUToGlobalEnergyMap(user_uuid_0, BigInteger.valueOf(-2L)));
+
+ assertEquals(getUserEU(user_uuid_0), BigInteger.ONE, message);
+ assertEquals(getUserEU(user_uuid_1), BigInteger.ONE, message);
+ assertEquals(getUserEU(user_uuid_2), BigInteger.ONE, message);
+
+ SpaceProjectManager.putInTeam(user_uuid_0, user_uuid_0);
+ SpaceProjectManager.putInTeam(user_uuid_1, user_uuid_1);
+ SpaceProjectManager.putInTeam(user_uuid_2, user_uuid_2);
+
+ assertEquals(getUserEU(user_uuid_0), BigInteger.ZERO, message);
+ assertEquals(getUserEU(user_uuid_1), BigInteger.ONE, message);
+ assertEquals(getUserEU(user_uuid_2), BigInteger.ZERO, message);
+
+ clearGlobalEnergyInformationMaps();
+ }
+}
diff --git a/src/test/java/gregtech/overclock/GT_OverclockCalculator_UnitTest.java b/src/test/java/gregtech/overclock/GT_OverclockCalculator_UnitTest.java
new file mode 100644
index 0000000000..e1560b27cb
--- /dev/null
+++ b/src/test/java/gregtech/overclock/GT_OverclockCalculator_UnitTest.java
@@ -0,0 +1,598 @@
+package gregtech.overclock;
+
+import static gregtech.api.enums.GT_Values.V;
+import static gregtech.api.enums.GT_Values.VP;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+import gregtech.api.enums.TierEU;
+import gregtech.api.util.GT_OverclockCalculator;
+
+class GT_OverclockCalculator_UnitTest {
+
+ private static final String messageDuration = "Duration Calculated Wrong";
+ private static final String messageEUt = "EUt Calculated Wrong";
+
+ @Test
+ void fullPerfectOverclockEBF_Test() {
+ int heatDiscounts = (1800 * 4) / 900;
+ long correctConsumption = (long) Math.ceil(VP[5] * Math.pow(0.95, heatDiscounts));
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[5])
+ .setDuration(1024)
+ .setHeatOC(true)
+ .setHeatDiscount(true)
+ .setRecipeHeat(1800)
+ .setMachineHeat(1800 * 5)
+ .calculate();
+ assertEquals(1024 >> 8, calculator.getDuration(), messageDuration);
+ assertEquals(correctConsumption, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void imperfectOverclockEBFWithOneHeatDiscount_Test() {
+ int heatDiscounts = 1;
+ long correctConsumption = (long) Math.ceil(VP[5] * Math.pow(0.95, heatDiscounts));
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[5])
+ .setDuration(1024)
+ .setHeatOC(true)
+ .setHeatDiscount(true)
+ .setRecipeHeat(1800)
+ .setMachineHeat(2700)
+ .calculate();
+ assertEquals(1024 >> 4, calculator.getDuration(), messageDuration);
+ assertEquals(correctConsumption, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void imperfectOverclockEBFWithoutHeatDiscounts_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[5])
+ .setDuration(1024)
+ .setHeatOC(true)
+ .setHeatDiscount(true)
+ .setRecipeHeat(1800)
+ .setMachineHeat(1800)
+ .calculate();
+ assertEquals(1024 >> 4, calculator.getDuration(), messageDuration);
+ assertEquals(VP[5], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void perfectAndImperfectOverclockEBFWithTwoHeatDiscounts_Test() {
+ int heatDiscounts = 2;
+ long correctConsumption = (long) Math.ceil(VP[5] * Math.pow(0.95, heatDiscounts));
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[5])
+ .setDuration(1024)
+ .setHeatOC(true)
+ .setHeatDiscount(true)
+ .setRecipeHeat(1800)
+ .setMachineHeat(3600)
+ .calculate();
+ assertEquals(1024 >> 5, calculator.getDuration(), messageDuration);
+ assertEquals(correctConsumption, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void generalImperfectOverclock_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setDuration(1024)
+ .calculate();
+ assertEquals(1024 >> 5, calculator.getDuration(), messageDuration);
+ assertEquals(VP[6], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void generalPerfectOverclock_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setDuration(2048)
+ .enablePerfectOC()
+ .calculate();
+ assertEquals(2048 >> 10, calculator.getDuration(), messageDuration);
+ assertEquals(VP[6], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void weirdHeatEBF_Test() {
+ int heatDiscounts = 3;
+ long correctConsumption = (long) Math.ceil(VP[6] * Math.pow(0.95, heatDiscounts));
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setDuration(2048)
+ .setHeatOC(true)
+ .setHeatDiscount(true)
+ .setRecipeHeat(486)
+ .setMachineHeat(3900)
+ .calculate();
+ assertEquals(2048 >> 6, calculator.getDuration(), messageDuration);
+ assertEquals(correctConsumption, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void doubleEnergyHatchOC_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setAmperage(4)
+ .setDuration(1024)
+ .setAmperageOC(true)
+ .calculate();
+ assertEquals(1024 >> 6, calculator.getDuration(), messageDuration);
+ assertEquals(VP[7], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void doubleEnergyHatchOCForULV_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[0])
+ .setEUt(V[6])
+ .setAmperage(4)
+ .setDuration(1024)
+ .setAmperageOC(true)
+ .calculate();
+ assertEquals(1024 >> 6, calculator.getDuration(), messageDuration);
+ assertEquals(VP[0] << 12, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void multiAmpHatchOC_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setAmperage(256)
+ .setDuration(1024)
+ .setAmperageOC(true)
+ .calculate();
+ assertEquals(1024 >> 9, calculator.getDuration(), messageDuration);
+ assertEquals(VP[10], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void weirdAmpHatchOC_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setAmperage(320)
+ .setDuration(1024)
+ .setAmperageOC(true)
+ .calculate();
+ assertEquals(1024 >> 9, calculator.getDuration(), messageDuration);
+ assertEquals(VP[10], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void parallelImperfectOC_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[8])
+ .setAmperage(4)
+ .setDuration(1024)
+ .setParallel(16)
+ .setAmperageOC(true)
+ .calculate();
+ assertEquals(1024 >> 6, calculator.getDuration(), messageDuration);
+ assertEquals(VP[9], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void parallelPerfectOC_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[8])
+ .setAmperage(4)
+ .setDuration(4096)
+ .setParallel(16)
+ .setAmperageOC(true)
+ .enablePerfectOC()
+ .calculate();
+ assertEquals(4096 >> 12, calculator.getDuration(), messageDuration);
+ assertEquals(VP[9], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void parallelMultiAmpOC_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setAmperage(320)
+ .setDuration(1024)
+ .setParallel(16)
+ .setAmperageOC(true)
+ .calculate();
+ assertEquals(1024 >> 7, calculator.getDuration(), messageDuration);
+ assertEquals(VP[10], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void weirdParallelOC_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[8])
+ .setDuration(1024)
+ .setParallel(8)
+ .calculate();
+ assertEquals(1024 >> 5, calculator.getDuration(), messageDuration);
+ assertEquals(VP[6] * 8, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void weirdParallelAndAmpsOC_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[8])
+ .setAmperage(320)
+ .setDuration(1024)
+ .setParallel(8)
+ .setAmperageOC(true)
+ .calculate();
+ assertEquals(1024 >> 9, calculator.getDuration(), messageDuration);
+ assertEquals(VP[6] * 8 * 256, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void weirdTimeOC_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setDuration(77)
+ .calculate();
+ assertEquals(77 >> 5, calculator.getDuration(), messageDuration);
+ assertEquals(VP[6], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void stopsCorrectlyWhenOneTicking_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setDuration(1)
+ .calculate();
+ assertEquals(1, calculator.getDuration(), messageDuration);
+ assertEquals(VP[1], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void imperfectOCWithEUtDiscount_Test() {
+ long correctConsumption = (long) Math.ceil(VP[1] * 0.9f) << 10;
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setEUtDiscount(0.9f)
+ .setDuration(1024)
+ .calculate();
+ assertEquals(1024 >> 5, calculator.getDuration(), messageDuration);
+ assertEquals(correctConsumption, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void perfectOCWithEUtDiscount_Test() {
+ long correctConsumption = (long) Math.ceil(VP[1] * 0.9f) << 10;
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setEUtDiscount(0.9f)
+ .setDuration(1024)
+ .enablePerfectOC()
+ .calculate();
+ assertEquals(1024 >> 10, calculator.getDuration(), messageDuration);
+ assertEquals(correctConsumption, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void imperfectOCWithSpeedBoost_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setSpeedBoost(0.9f)
+ .setDuration(1024)
+ .calculate();
+ assertEquals((int) (1024 * 0.9f) >> 5, calculator.getDuration(), messageDuration);
+ assertEquals(VP[6], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void perfectOCWithSpeedBoost_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setSpeedBoost(0.9f)
+ .setDuration(2048)
+ .enablePerfectOC()
+ .calculate();
+ assertEquals((int) (2048 * 0.9f) >> 10, calculator.getDuration(), messageDuration);
+ assertEquals(VP[6], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void perfectOC3TicksTo1Tick_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[4])
+ .setEUt(V[5])
+ .setDuration(3)
+ .enablePerfectOC()
+ .calculate();
+ assertEquals(1, calculator.getDuration(), messageDuration);
+ assertEquals(VP[5], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void oneTickDiscountTurnsToOne_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setDuration(1)
+ .setOneTickDiscount(true)
+ .calculate();
+ assertEquals(1, calculator.getDuration(), messageDuration);
+ assertEquals(1, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void oneTickDiscountImperfectOC_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setSpeedBoost(1.1f)
+ .setDuration(4)
+ .setOneTickDiscount(true)
+ .calculate();
+ assertEquals(1, calculator.getDuration(), messageDuration);
+
+ /*
+ * duration with speedboost = 5
+ * log_2(5) ~ 2.3;
+ * round up to 3 to reach one tick duration
+ */
+ int overclocksTillOneTick = 3;
+ int overclocksBeyondOneTick = 2;
+
+ // 3 overclocks, each gives 4x consumption growth per tick (1920)
+ long targetEUt = VP[1] << 2 * overclocksTillOneTick;
+ // 2 remaining overclocks are beyond 1 tick, each provides 2x comsumption discount (480)
+ targetEUt >>= overclocksBeyondOneTick;
+
+ assertEquals(targetEUt, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void oneTickDiscountPerfectOC_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setSpeedBoost(1.1f)
+ .setDuration(16)
+ .enablePerfectOC()
+ .setOneTickDiscount(true)
+ .calculate();
+
+ /*
+ * duration with speedboost = 18
+ * log_4(18) ~ 2.08;
+ * round up to 3 to reach one tick duration
+ */
+ int overclocksTillOneTick = 3;
+ int overclocksBeyondOneTick = 2;
+
+ // 3 overclocks, each gives 4x consumption growth per tick (1920)
+ long targetEUt = VP[1] << 2 * overclocksTillOneTick;
+ // 2 remaining overclocks are beyond 1 tick, each provides 4x comsumption discount (120)
+ targetEUt >>= 2 * overclocksBeyondOneTick;
+
+ assertEquals(targetEUt, calculator.getConsumption(), messageEUt);
+ assertEquals(1, calculator.getDuration(), messageDuration);
+ }
+
+ @Test
+ void ulvRecipeWithDiscount_Test() {
+ long correctConsumption = (long) Math.ceil((VP[0] << 10) * 0.9f);
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[0])
+ .setEUt(V[6])
+ .setEUtDiscount(0.9f)
+ .setDuration(1024)
+ .calculate();
+ assertEquals(1024 >> 5, calculator.getDuration(), messageDuration);
+ assertEquals(correctConsumption, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void ulvRecipeWithDiscountWithParallel_Test() {
+ long correctConsumption = (long) Math.ceil((VP[0] << 6) * 14 * 0.9f);
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[0])
+ .setEUt(V[5])
+ .setEUtDiscount(0.9f)
+ .setParallel(14)
+ .setDuration(1024)
+ .calculate();
+ assertEquals(1024 >> 3, calculator.getDuration(), messageDuration);
+ assertEquals(correctConsumption, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void ulvRecipeStopsWhenOneTicked_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[0])
+ .setEUt(V[6])
+ .setDuration(1)
+ .calculate();
+ assertEquals(1, calculator.getDuration(), messageDuration);
+ assertEquals(VP[0], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void testNotPowerOverflowing_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(16)
+ .setParallel(64)
+ .setAmperage(64)
+ .setAmperageOC(true)
+ .setEUt(V[5])
+ .setDuration(30)
+ .calculate();
+ assertEquals(1, calculator.getDuration(), messageDuration);
+ assertEquals(16 << 14, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void testCorrectEUtWhenOverclockingUnderOneTick_Test() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(24)
+ .setParallel(56)
+ .setAmperage(1)
+ .setAmperageOC(true)
+ .setSpeedBoost(1f / 6f)
+ .setEUt(V[14])
+ .setDuration(56);
+ assertEquals((24 * 56) << 20, calculator.calculateEUtConsumptionUnderOneTick(56, 6144));
+ }
+
+ @Test
+ void testCorrectEUtWhenOverclockingUnderOneTickWithHeat_Test() {
+ double heatDiscount = Math.pow(0.95, (15500 - 2000) / 900);
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(1920)
+ .setParallel(256)
+ .setAmperage(1)
+ .setAmperageOC(true)
+ .setHeatDiscount(true)
+ .setHeatOC(true)
+ .setRecipeHeat(2000)
+ .setMachineHeat(15500)
+ .setEUt(V[12] * 1_048_576)
+ .setDuration(250);
+ assertEquals(
+ Math.ceil((((long) 1920 * 256) << 28) * heatDiscount),
+ calculator
+ .calculateEUtConsumptionUnderOneTick(256, (int) (256 / calculator.calculateDurationUnderOneTick())));
+ }
+
+ @Test
+ void testNoOverclockCorrectWithUnderOneTickLogic_Test() {
+ GT_OverclockCalculator calculator = GT_OverclockCalculator.ofNoOverclock(2_693_264_510L, 100)
+ .setParallel(24 * 64);
+ assertEquals(100, calculator.calculateDurationUnderOneTick());
+ }
+
+ @Test
+ void ulvRecipeDoesntOverclockExtraWithAmperageWithoutAmperageOC() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(2)
+ .setEUt(V[3])
+ .setParallel(16)
+ .setDuration(20)
+ .setAmperageOC(false)
+ .setAmperage(16)
+ .calculate();
+ assertEquals(32 * 16, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void ulvRecipeDoesntOverclockExtraWithAmperageWithoutAmperageOCVersion2() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(2)
+ .setEUt(V[3])
+ .setParallel(64)
+ .setDuration(20)
+ .setAmperageOC(false)
+ .setAmperage(16)
+ .calculate();
+ assertEquals((32 * 64), calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void ulvRecipeDoesntOverclockExtraWithAmperageWithoutAmperageOCVersion3() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(2)
+ .setEUt(V[3])
+ .setParallel(16)
+ .setDuration(20)
+ .setAmperageOC(false)
+ .setAmperage(64)
+ .calculate();
+ assertEquals(32 * 16, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void ulvRecipeDoesntOverclockExtraWithAmperageWithoutAmperageOCVersion4() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(8)
+ .setEUt(V[3])
+ .setParallel(16)
+ .setDuration(20)
+ .setAmperageOC(false)
+ .setAmperage(16)
+ .calculate();
+ assertEquals((8 << 4) * 16, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void ulvRecipeDoesntOverclockExtraWithAmperageWithoutAmperageOCVersion5() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(8)
+ .setEUt(V[3])
+ .setParallel(16)
+ .setDuration(20)
+ .setAmperageOC(false)
+ .calculate();
+ assertEquals((8 << 2) * 16, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void ulvRecipeDoesntOverclockExtraWithAmperageWithoutAmperageOCVersion6() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(7)
+ .setEUt(V[3])
+ .setParallel(64)
+ .setDuration(160)
+ .setAmperage(64)
+ .setAmperageOC(false)
+ .calculate();
+ assertEquals((7 << 4) * 64, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void ulvRecipeDoesntOverclockExtraWithAmperageWithoutAmperageOCVersion7() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(7)
+ .setEUt(V[3])
+ .setParallel(19)
+ .setDuration(160)
+ .setAmperage(19)
+ .setAmperageOC(false)
+ .calculate();
+ assertEquals((7 << 4) * 19, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void ulvRecipeDoesntOverclockExtraWithAmperageWithoutAmperageOCVersion8() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(7)
+ .setEUt(V[3])
+ .setParallel(29)
+ .setDuration(160)
+ .setAmperage(25)
+ .setAmperageOC(false)
+ .calculate();
+ assertEquals((7 << 4) * 29, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void ulvRecipeWorkCorrectlyWithCalculatingEutUnderOneTick() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(2)
+ .setEUt(TierEU.UV)
+ .setParallel(64)
+ .setDuration(300)
+ .setAmperage(64)
+ .setAmperageOC(false);
+ assertEquals(TierEU.LuV * 64, calculator.calculateEUtConsumptionUnderOneTick(64, 64), messageEUt);
+ }
+
+ @Test
+ void overclockWithAbnormalEnergyIncrease_Test() {
+ long expectedEUt = (long) Math.floor(VP[1] * Math.pow(4.1, 5));
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setDuration(1024)
+ .setEUtIncreasePerOC(4.1)
+ .calculate();
+ assertEquals(1024 >> 5, calculator.getDuration(), messageDuration);
+ assertEquals(expectedEUt, calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void overclockWithAbnormalDurationDecrease_Test() {
+ int expectedDuration = (int) Math.floor(1024 / Math.pow(2.1, 5));
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1])
+ .setEUt(V[6])
+ .setDuration(1024)
+ .setDurationDecreasePerOC(2.1)
+ .calculate();
+ assertEquals(expectedDuration, calculator.getDuration(), messageDuration);
+ assertEquals(VP[6], calculator.getConsumption(), messageEUt);
+ }
+
+ @Test
+ void slightlyOverOneAmpRecipeWorksWithSingleEnergyHatch() {
+ GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(614400)
+ .setEUt(TierEU.UV)
+ .setDuration(600)
+ .setAmperage(2)
+ .setAmperageOC(false)
+ .calculate();
+ assertEquals(600, calculator.getDuration(), messageDuration);
+ assertEquals(614400, calculator.getConsumption(), messageEUt);
+ }
+}
diff --git a/src/test/java/net/glease/ggfab/util/OverclockHelperTest.java b/src/test/java/net/glease/ggfab/util/OverclockHelperTest.java
new file mode 100644
index 0000000000..7badd41fbe
--- /dev/null
+++ b/src/test/java/net/glease/ggfab/util/OverclockHelperTest.java
@@ -0,0 +1,47 @@
+package net.glease.ggfab.util;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import org.junit.jupiter.api.Test;
+
+class OverclockHelperTest {
+
+ @Test
+ void normalOverclockImperfect() {
+ // fails recipe
+ assertNull(OverclockHelper.normalOverclock(10000, 10000, 1, false));
+ // no overclock
+ assertEquals(new OverclockHelper.OverclockOutput(30, 64), OverclockHelper.normalOverclock(30, 64, 32, false));
+ // imperfect overclock
+ assertEquals(new OverclockHelper.OverclockOutput(120, 32), OverclockHelper.normalOverclock(30, 64, 128, false));
+ // lots of overclock
+ assertEquals(
+ new OverclockHelper.OverclockOutput(30720, 2),
+ OverclockHelper.normalOverclock(30, 64, 32768, false));
+ // do not overclock beyond useful
+ assertEquals(
+ new OverclockHelper.OverclockOutput(122880, 1),
+ OverclockHelper.normalOverclock(30, 64, 524288, false));
+ }
+
+ @Test
+ void laserOverclock() {
+ // fails recipe
+ assertNull(OverclockHelper.laserOverclock(10000, 10000, 1, 5));
+ // no overclock
+ assertEquals(new OverclockHelper.OverclockOutput(30, 64), OverclockHelper.laserOverclock(30, 64, 32, 0.5f));
+ // 0.3 amp overclock. 0.25 amp would be not in current tier so no point in testing that
+ assertEquals(new OverclockHelper.OverclockOutput(10, 64), OverclockHelper.laserOverclock(10, 64, 32, 0.5f));
+ // laser overclock
+ assertEquals(
+ new OverclockHelper.OverclockOutput(135, 32),
+ OverclockHelper.laserOverclock(30, 64, 32 * 16, 0.5f));
+ // lots of overclock
+ assertEquals(
+ new OverclockHelper.OverclockOutput(22272, 4),
+ OverclockHelper.laserOverclock(30, 64, 32 * 1024, 0.5f));
+ // do not overclock beyond useful
+ assertEquals(new OverclockHelper.OverclockOutput(135, 1), OverclockHelper.laserOverclock(30, 2, 32 * 16, 0.5f));
+ }
+}